ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjZjMzIKLS0tIC9kZXYvbnVsbAorKysgYi8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMzAgQEAKKyotYWxsCisqLWNvCisqLWRpcnMKKyotZG9uZQorKi1pbnN0YWxsLWluZm8KKyotc3JjCisqLXN0YW1wLSoKKyotdGFnZ2VkCitibG9ja2l0CitjZmctcGFwZXIuaW5mbworY29uZmlnLnN0YXR1cworY29uZmlndXJlLmF1eAorY29uZmlndXJlLmNwCitjb25maWd1cmUuY3BzCitjb25maWd1cmUuZHZpCitjb25maWd1cmUuZm4KK2NvbmZpZ3VyZS5mbnMKK2NvbmZpZ3VyZS5reQorY29uZmlndXJlLmt5cworY29uZmlndXJlLmxvZworY29uZmlndXJlLnBnCitjb25maWd1cmUucGdzCitjb25maWd1cmUudG9jCitjb25maWd1cmUudHAKK2NvbmZpZ3VyZS50cHMKK2NvbmZpZ3VyZS52cgorY29uZmlndXJlLnZycworZGlyLmluZm8KK01ha2VmaWxlCitsb3N0K2ZvdW5kCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU0OWJlCi0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9DT1BZSU5HLkxJQiBiL0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWEzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkxJQgpAQCAtMCwwICsxLDQ4MiBAQAorCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcworIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKK290aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKK3lvdXIgbGlicmFyaWVzLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKK3lvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAordGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitsaWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCit2ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCit0aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCisMCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCitzb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAordHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCit3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKK2ZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCitsaWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCitkZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKK29uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwordGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCisKKyAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKK3RoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCitwcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAorY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKK2FuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgorYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQorZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCit0cmVhdHMgaXQgYXMgc3VjaC4KKworICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCitzaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKK2NvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCisKKyAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKK3VzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQorbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bworcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQorcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCitsaWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQordGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCitjaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcword2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKK3dvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KKwwKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKK2NvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCitwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKK2FkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQorZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICAgIE1BIDAyMTExLTEzMDcsIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjA0YjIxCi0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNjUzNyBAQAorMTk5OS0wNC0zMCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBsdG1haW4uc2g6IFttb2RlIGxpbmtdIEFsd2F5cyB1c2UgQ0MgZ2l2ZW4gYnkgbHRjb25maWcuCisKKzE5OTktMDQtMjMgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yZi4KKworMTk5OS0wNC0yMCAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJzdHViIGZvciBhcm0tZWxmIHRhcmdldHMuCisJKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGFueSBic3Agc3R1ZmYgZm9yIGZvciBhcm0tb2FiaSB0YXJnZXRzLgorCUJhZCBtZXJnZSByZW1vdmVkIHRoZXNlIHR3byBjaGFuZ2VzLgorCisxOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGk/ODYtKi1iZW9zKik6IERvIGNvbmZpZyBncGVyZjsgZG9uJ3QgY29uZmlnCisJZ2RiLCBuZXdsaWIsIG9yIGxpYmdsb3NzLgorCisxOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KKworMTk5OS0wNC0wNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogVXNlIGNvbmZpZy9tdC1kMzB2IGFzIG1ha2VmaWxlIGZyYWdtZW50LAorCW5vdCBtdC1vc3BhY2UsIGluIG9yZGVyIHRvIHNodXQgdXAgYXNzZW1ibGVyIHdhcm5pbmcgYWJvdXQgdXNpbmcKKwlzeW1ib2xzIHRoYXQgYXJlIG5hbWVkIHRoZSBzYW1lIGFzIHJlZ2lzdGVycy4KKworMTk5OS0wNC0wNyAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtY3lnbW9uKTogQWRkZWQgYWxsLXRhcmdldC1ic3AgdG8gdGhlCisJZGVwZW5kZW5jeSBsaXN0IGZvciBhbGwtdGFyZ2V0LWN5Z21vbi4KKworMTk5OS0wNC0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjb25maWctbWwuaW46IENoZWNrICRob3N0LCBub3QgJHRhcmdldCwgZm9yIHNlbGVjdGl2ZSBtdWx0aWxpYnMuCisJKGFybS0qLSopOiBBbGxvdyBkaXNhYmxpbmcgb2YgYmllbmRpYW4sIGgvdyBmcCwgMjYgYml0IGFwY3MsCisJdGh1bWIgaW50ZXJ3b3JraW5nLCBhbmQgdW5kZXJzY29yZSBwcmVmaXggbXVsdGlsaWJzLgorCisxOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KKworCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBjdXJyZW50IGF1dG9tYWtlLgorCitGcmkgQXByICAyIDE1OjExOjMyIDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKKworCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBSZW1vdmVkLgorCisJKiBjb25maWd1cmUuaW4gKGd4eF9pbmNsdWRlX2Rpcik6IEhhbmRsZSBpdC4KKwkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KKworMTk5OS0wMy0yOSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWIgKG1pcHM2NHZyNDExMSxtaXBzNjR2cjQxMTFlbCkgQWRkLgorCisxOTk5LTAzLTIxICBCZW4gRWxsaXN0b24gIDxiamVAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZy5ndWVzczogQ29ycmVjdCB0eXBvIGZvciBkZXRlY3RpbmcgRUxGIG9uIEZyZWVCU0QuCisKK1RodSBNYXIgMTggMDA6MTc6NTAgMTk5OSAgTWFyayBFbGJyZWNodCA8c25vd2JhbGwzQHVzYS5uZXQ+CisKKwkqIGNvbmZpZy9taC1nbzMyOiBEZWxldGUuCisJKiBjb25maWcvbWgtZGpncHA6IE5ldy4gUmVuYW1lZCBmcm9tIG1oLWdvMzIuCisJKiBjb25maWd1cmUuaW4gKHBjLW1zZG9zZGpncHApOiBTZXQgaG9zdF9tYWtlZmlsZV9mcmFnIHRvCisJY29uZmlnL21oLWRqZ3BwLgorCitUaHUgTWFyIDExIDE4OjM3OjIzIDE5OTkgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWJzcCk6IEFkZGVkIGFsbC1nY2MgYWxsLWJpbnV0aWxzIGFuZAorCWFsbC10YXJnZXQtbmV3bGliIHRvIGRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1ic3AuCisKK1RodSBNYXIgMTEgMDE6MTk6MzEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKwkqIGNvbmZpZy5zdWI6IEFkZCBpMzg2LXV3aW4gc3VwcG9ydC4KKwkqIGNvbmZpZy5ndWVzczogTGlrZXdpc2UuCisKK1RodSBNYXIgMTEgMDE6MDc6NTUgMTk5OSAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogY2xlYW51cCwgYWRkIG1oLSpwaWMgaGFuZGxpbmcgZm9yIGFybSwgc3BlY2lhbAorCWNhc2UgcG93ZXJwYyotKi1haXgqCisKK1dlZCBNYXIgMTAgMTg6MzU6MDcgMTk5OSAgSmVmZiBKb2huc3RvbiAgPGpqb2huc3RuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlZCB0YXJnZXQtbGliZ2xvc3Mgc28gbGlibm9zeXMuYQorCWNhbiBiZSBidWlsdC4KKworV2VkIE1hciAxMCAxNzozOTowOSAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIGJzcCBzdXBwb3J0IHRvIGFybS0qLWNvZmYgYW5kIGFybS0qLWVsZgorIAl0YXJnZXRzLgorCisxOTk5LTAzLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBSZW5hbWUgQ1lHTlVTIExPQ0FMIHRvIEVHQ1MgTE9DQUwKKworU3VuIEZlYiAyOCAwMjoyMDowMCAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBDaGVjayBmb3IgImN5Z3dpbioiIHJhdGhlciB0aGFuICJjeWd3aW4zMioiCisKKzE5OTktMDItMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGFybSByZWNvZ25pdGlvbi4KKworV2VkIEZlYiAyNCAxMzo1MTo0MCAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IENoYW5nZWQgdGFyZ2V0X2NvbmZpZ2RpcnMgdG8KKwlpbmNsdWRlIHRhcmdldC1ic3Agb25seSBmb3IgbTY4ay0qLWVsZiogYW5kIG02OGstKi1jb2ZmKgorCXJhdGhlciB0aGFuIG02OGstKi0qIHNpbmNlIGl0IGlzIG5vdCBrbm93biB0byB3b3JrIG9uCisJbTY4ay1hb3V0LiBEaXR0byBmb3IgYXJtLSotKm9hYmkuCisKK1dlZCBGZWIgMjQgMTI6NTI6MTcgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCisJKiBjb25maWcvbWgtd2luZG93czogRGl0dG8uCisKKzE5OTktMDItMTkgIEJlbiBFbGxpc3RvbiA8YmplQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzczogQXV0b21hdGljYWxseSByZWNvZ25pc2UgRUxGIG9uIEZyZWVCU0QuIEZyb20gTmlhbGwKKwlTbWFydCBhbmQgaW1wcm92ZWQgYnkgQW5kcmV3IENhZ25leS4KKworVGh1IEZlYiAxOCAxOTo1NTowOSAxOTk5ICBNYXJjIEVzcGllIDxlc3BpZUBjdnMub3BlbmJzZC5vcmc+CisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG9wZW5ic2QtKi1ocHBhLgorCitXZWQgRmViIDE3IDAxOjM4OjU5IDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKKworCSogTWFrZWZpbGUuaW4gKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBBcHBlbmQgJCQkKFJQQVRIX0VOVlZBUikKKwlvbmx5IGlmIGl0IGlzIG5vdCBlbXB0eS4KKworMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgorCQorCSogY29uZmlnLmd1ZXNzOiBNb2RpZmllZCB0byByZWNvZ25pemUgdW5hbWUncyBhcm12KiBzeW50YXguIAorCisJKiBjb25maWcuc3ViOiBNb2RpZmllZCB0byByZWNvZ25pemUgdW5hbWUncyBhcm12KiBzeW50YXguCisKKzE5OTktMDItMTcgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIHRhcmdldC1ic3AgZm9yIHNwYXJjbGl0ZS4KKworTW9uIEZlYiAgOCAxNDoxNzoyNCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBSZWNvZ25pemUgYWxwaGFwY2E1WzY3XSBhbmQgdXAgdG8gYWxwaGFldjguCisKKzE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSBwb3J0LgorCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCisKK1N1biBGZWIgIDcgMTg6MDE6NTQgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisJCisJKiBjb25maWd1cmUuaW4gKCotKi1jeWd3aW4zMiopOiBVc2UgY29uZmlnL21oLWN5Z3dpbiBpbnN0ZWFkIG9mCisJdGhlIG9sZCBuYW1lIGNvbmZpZy9taC1jeWd3aW4zMi4KKwlFbmFibGUgdGV4aW5mby4KKworVGh1IEZlYiAgNCAyMDo0MzoyNSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgbGQgZm9yIGl4ODYgU29sYXJpcy4KKworVHVlIEZlYiAgMiAxOTo0Njo0MCAxOTk5ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiAgU2V0IEFSIHRvICRBUiBpbnN0ZWFkIG9mCisJJEFSX0ZPUl9UQVJHRVQuICBMaWtld2lzZSBmb3IgUkFOTElCLgorCitUdWUgRmViICAyIDIwOjA1OjA1IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorIAorICAgICAgICAqIGNvbmZpZy5zdWIgKG9hYmkpOiAgUmVjb2duaXplLgorICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoYXJtLSotb2FiaSk6ICBIYW5kbGUuCisKK1NhdCBKYW4gMzAgMDY6MDk6MDAgMTk5OSAgUm9iZXJ0IExpcGUgIChyb2JlcnRsaXBlQHVzYS5uZXQpCisKKwkqIGNvbmZpZy5ndWVzczogSW1wcm92ZSBkZXRlY3Rpb24gb2YgaTY4NiBvbiBVbml4V2FyZSA3LgorCitTYXQgSmFuIDMwIDA4OjA0OjAwIDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgorCisJKiBjb25maWcuZ3Vlc3M6IEFkZCBzdXBwb3J0IGZvciBpMzg2LXBjLWludGVyaXguCisJKiBjb25maWcuc3ViOiBMaWtld2lzZS4KKwkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCisJKiBjb25maWcvbWgtaW50ZXJpeDogTmV3IGZpbGUuCisKK01vbiBKYW4gMTggMTM6NTk6MjAgMTk5OSAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlbW92ZSB1bm5lZWRlZCBhbGwtdGFyZ2V0LWxpYmlvIGZyb20KKwlmcm9tIGFsbC10YXJnZXQtd2luc3VwIHRhcmdldCBzaW5jZSBpdCBpcyBub3cgdW5uZWVkZWQuCisJQWRkIGFsbC10YXJnZXQtbGlidGVybWNhcCBpbiBpdHMgcGxhY2Ugc2luY2UgaXQgaXMgbm93CisJbmVlZGVkLgorCitXZWQgRGVjIDMwIDIwOjM0OjUyIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogbWFrZWZpbGUgc3R1YiBmb3IgY3lnd2luIHRhcmdldCBpcyBwcm9iYWJseQorCXVubmVjZXNzYXJ5LiAgUmVtb3ZlIGl0IGZvciBub3cuCisJKiBjb25maWcvbXQtY3lnd2luOiBSZW1vdmUuCisKK1dlZCBEZWMgMzAgMDE6MTM6MDMgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBsaWJ0ZXJtY2FwLmEgc2hvdWxkIGJlIGJ1aWx0IHdoZW4gY3lnd2luIGlzIHRoZQorCXRhcmdldCBhcyB3ZWxsIGFzIHRoZSBob3N0LgorCSogY29uZmlnLmd1ZXNzOiBBbGxvdyBtaXhlZCBjYXNlIGluIGN5Z3dpbiB1bmFtZSBvdXRwdXQuCisJKiBNYWtlZmlsZS5pbjogQWRkIGxpYnRlcm1jYXAgdGFyZ2V0LgorCSogY29uZmlnL210LWN5Z3dpbjogTmV3IGZpbGUuICBsaWJ0ZXJtY2FwIHRhcmdldCBpbmZvLgorCitUdWUgRGVjIDE1IDE3OjAyOjU4IDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBjeWdtb24gZm9yIHg4Ni1jb2ZmIGFuZCB4ODYtZWxmLiBDb25maWd1cmUKKyAJY3lnbW9uIGZvciBhbGwgc3BhcmNsaXRlIHRhcmdldHMsIHJlZ2FyZGxlc3Mgb2Ygb2JqZWN0IGZvcm1hdC4KKworMTk5OC0xMi0xNSAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgdGFyZ2V0LWJzcCBmb3Igc2V2ZXJhbCB0YXJnZXQgYXJjaGl0ZWN0dXJlcy4KKworCSogTWFrZWZpbGUuaW46IEFkZGVkIHJ1bGVzIGZvciBic3AuCisKK1dlZCBEZWMgMjMgMDA6MjA6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBDbGVhbiB1cCBoYW5kbGluZyBvZiBocHBhMi4wLgorCitUdWUgRGVjIDIyIDIzOjU2OjMxIDE5OTggIFJvZG5leSBCcm93biAgKHJvZG5leWJyb3duQHBtc2MuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IFVzZSBDIGNvZGUgdG8gaWRlbnRpZnkgbW9yZSBIUCBtYWNoaW5lcy4KKworVGh1IERlYyAxNyAwMToyMjozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IEhhbmRsZSBocHBhMi4wLgorCitGcmkgRGVjICA0IDAxOjM0OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBJbXByb3ZlIGRldGVjdGlvbiBvZiBocHBhMi4wIHByb2Nlc3NvcnMuCisKK0ZyaSBEZWMgIDQgMDE6MzM6MDUgMTk5OCAgTmlhbGwgU21hcnQgPG5pYWxsc0BldXJpc3RpeC5pZT4KKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgRnJlZUJTRCB1c2luZyBFTEYgYXV0b21hdGljYWxseS4KKworMTk5OC0xMS0yNiAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBjb25maWd1cmUgKHNraXAtdGhpcy1kaXIpOiBBZGQgaGFuZGxpbmcgZm9yIG5ldyBzaGVsbCBzY3JpcHQsIHdoaWNoCisJbWlnaHQgYmUgY3JlYXRlZCBieSBhIHN1Yi1kaXJlY3RvcnkncyBjb25maWd1cmUgdG8gaW5kaWNhdGUsIHRoaXMgcGFydGljdWxhcgorCWRpcmVjdG9yeSBpcyAidW53YW50ZWQiLgorCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgorCisKK1dlZCBOb3YgMTggMTg6Mjg6NDUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogbHRjb25maWc6IGltcG9ydCBmcm9tIGxpYnRvb2wsIGFmdGVyIGNoYW5naW5nIGxpYnRvb2wgdG8KKwlhY2NvdW50IGZvciB0aGUgY3lnd2luIG5hbWUgY2hhbmdlLgorCitXZWQgTm92IDE4IDE4OjA5OjE0IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBDQ19GT1JfVEFSR0VUIGFuZCBDWFhfRk9SX1RBUkdFVCBzaG91bGQgYWxzbworCWluY2x1ZGUgbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiBhbmQgbmV3bGliL2xpYmMvc3lzL2N5Z3dpbjMyLgorCitXZWQgTm92IDE4IDIwOjEzOjI5IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYnRlcm1jYXAgdG8gbGlzdCBvZiBjeWd3aW4gZGVwZW5kZW5jaWVzLgorCitUdWUgTm92IDE3IDE2OjU3OjUxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBNYWtlZmlsZS5pbjogbW9kaWZ5IENDX0ZPUl9UQVJHRVQgYW5kIENYWF9GT1JfVEFSR0VUIHNvIHRoYXQKKyAgICAgICAgdGhleSBpbmNsdWRlIHdpbnN1cC9pbmNsdWRlIHdoZW4gaXQncyBhIGN5Z3dpbiB0YXJnZXQuCisKKzE5OTgtMTEtMTIgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgemlwLgorCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtbGliamF2YSk6IERlcGVuZCBvbiBhbGwtemlwLgorCShhbGwtemlwKTogTmV3IHRhcmdldC4KKwkoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtemlwLgorCShOQVRJVkVfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLXppcC4KKwkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC16aXAuCisJKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi16aXAuCisKK1RodSBOb3YgMTIgMTc6Mjc6MjEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IGxvc2UgIjMyIiBmcm9tIGNvbW1lbnQgYWJvdXQgY3lnd2luLgorCitUaHUgTm92ICA1IDE1OjAwOjMxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIC1PcyB0byBidWlsZCB0YXJnZXQgbGlicmFyaWVzIGZvciB0aGUgZnIzMC4KKworV2VkIE5vdiAgNCAxODo0OTo0MyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IEFkZCBmcjMwLgorCitNb24gTm92ICAyIDE1OjE5OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmUuaW46IGRyb3AgIjMyIiBmcm9tIGNvbmZpZy9taC1jeWd3aW4zMi4gIENoZWNrCisJY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KKwkqIGNvbmZpZy5zdWI6IENoZWNrIGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCisKKzE5OTgtMTAtMjAgIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gY29uZmlndXJlLmluOiBBZGQgdGhlIGFiaWxpdHkgdG8gdXNlIHRjbDguMSBhbmQgdGs4LjEKKwlpZiBkZXNpcmVkLgorCitTdW4gT2N0IDE4IDE4OjM0OjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmlmIChjeHhfaW50ZXJmYWNlLCBsaWJzdGRjeHhfaW50ZXJmYWNlKTogRG8gbm90IHRyeSB0byBzZXQKKwl0aGVzZSBpZiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIHRvIG5vdCBleGlzdC4KKworV2VkIE9jdCAxNCAxMDoyOTowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgY29uZmlnLmlmLgorCitUdWUgT2N0IDEzIDA5OjE3OjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogQnJpbmcgYmFjayBsb3N0IHNwYXJjdjkuCisKK1dlZCBTZXAgMzAgMjI6MjA6NTAgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgorCisJKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3IgaVszNDU2N104Ni1wYy11ZGsuCisJKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgorCitXZWQgU2VwIDMwIDE5OjIzOjQ4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBhZGQgYnppcDIgcGFja2FnZSBidWlsZGluZyBiaXRzIGZvciB1c2VyCisJdG9vbHMgbW9kdWxlCisJKiBjb25maWd1cmUuaW46IGRpdHRvCisKKzE5OTgtMDktMzAgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSAqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFJlbW92ZSBkdXBsaWNhdGUgbGluZS4KKworVHVlIFNlcCAyOSAyMjo0NTo0MSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhbGwtYXV0b21ha2UpOiBmaXggZGVwZW5kZW5jaWVzLgorCitNb24gU2VwIDI4IDA0OjA0OjI3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBNaW5vciBjbGVhbnVwcyBmb3IgYnVpbGRpbmcgaW4gdGhlICQodGFyZ2V0X2FsaWFzKQorCXN1YmRpci4KKworMTk5OC0wOS0yMiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwKTogU2V0IHIgYW5kIHMgYmVmb3JlIG1ha2UgYWxsLiAgVXNlCisJQkFTRV9GTEFHU19UT19QQVNTIGluIG1ha2UgYWxsLgorCShjcm9zcyk6IExpa2V3aXNlLgorCisxOTk4LTA5LTIwICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwKTogUGFzcyBUQVJHRVRfRkxBR1NfVE9fUEFTUyB0byBgbWFrZSBhbGwnLgorCisKK1N1biBTZXAgMjAgMDA6MTM6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCisKKzE5OTgtMDktMTkgIE1pY2hhZWwgSGF5ZXMgIDxtLmhheWVzQGVsZWMuY2FudGVyYnVyeS5hYy5uej4KKworCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIEM0eCB0YXJnZXQuCisJKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgorCisxOTk4LTA5LTEzICBEYXZpZCBTLiBNaWxsZXIgIDxkYXZlbUBwaWVyZG9sLmNvYmFsdG1pY3JvLmNvbT4KKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIHNwYXJjdjkganVzdCBsaWtlIHNwYXJjNjQuCisKK1dlZCBTZXAgIDkgMTU6NDQ6NTIgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6IE1hdGNoICJQZW50IElJIiBvciAiUGVudElJIiBmb3IgT3BlblNlcnZlci4KKworVHVlIFNlcCAgOCAwMToxODozOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogQ29ycmVjdGx5IGlkZW50aWZ5IFBlbnRpdW0gSUkgc2NvIGJveGVzLgorCisJKiBjb25maWcuZ3Vlc3M6IEZpeCAidHIiIGNvZGUuICBGcm9tIFdlaXdlbiBMaXUuCisKK1NhdCBTZXAgIDUgMTM6NTY6NTIgMTk5OCAgSm9obiBIdWdoZXMgIDxqb2huQENhbHZhLkNPTT4KKworCSogY29uZmlndXJlLmluOiBEbyBub3QgYXNzdW1lIHg4Ni1zdnI0IG9yIHg4Ni11bml4d2FyZSBjYW4gaGFuZGxlCisJc3RhYnMuCisKK1NhdCBTZXAgIDUgMDI6MTI6MDIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVEFSR0VUX0NPTkZJR0RJUlMpOiBBZGQgbGliY2hpbGwuCisJKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBhbGwtdGFyZ2V0LWxpYmNoaWxsLgorCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMsIENIRUNLX1RBUkdFVF9NT0RVTEVTKTogU2ltaWxhcmx5LgorCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTLCBDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IFNpbWlsYXJseS4KKwkoYWxsLXRhcmdldC1saWJjaGlsbCk6IEFkZCBkZXBlbmRlbmNpZXMuCisJKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogQWRkIGxpYmNoaWxsLgorCitTdW4gQXVnIDMwIDIyOjI3OjAyIDE5OTggIEx1dHogV29obHJhYiA8bHV0ei53b2hscmFiQGluZm9ybWF0aWsudHUtY2hlbW5pdHouZGU+CisKKwkqIGNvbmZpZy5ndWVzczogQXZvaWQgYXNzdW1wdGlvbnMgYWJvdXQgInRyIiBiZWhhdmVzIHdoZW4KKwlMQU5HIGlzIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBFbmdsaXNoLgorCitTdW4gQXVnIDMwIDIyOjE0OjQ0IDE5OTggIEguSi4gTHUgIChoamxAZ251Lm9yZykKKworCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBDaGFuZ2VkIHRvCisJJyR7cHJlZml4fS9pbmNsdWRlL2crKyctJHtsaWJzdGRjeHhfaW50ZXJmYWNlfS4KKworCSogY29uZmlnLmlmOiBOZXcgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlcmZhY2VzLgorCitTdW4gQXVnIDMwIDIxOjE1OjE5IDE5OTggIE1hcmsgS2xlaW4gKG1rbGVpbkBkaXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IERldGVjdCBhbmQgaGFuZGxlIE1QRS9JWC4KKwkqIGNvbmZpZy5zdWI6IERlYWwgd2l0aCBNUEUvSVguCisKK1NhdCBBdWcgMjkgMTQ6MzI6NTUgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLWFpeDQzLgorCisxOTk4LTA3LTI5ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvbmZpZ3VyZTogRml4IC0td2l0aG91dC8tLWRpc2FibGUgY2FzZXMgZm9yIGd4eC1pbmNsdWRlLWRpci4KKworRnJpIEF1ZyAyOCAxMjoyODoyNiAxOTk4ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KKworCSogbWRhdGEtc2g6ICBJbXBvcnRlZC4gIE5lZWRlZCBmb3IgYXV0b21ha2Ugc3VwcG9ydC4KKworVGh1IEF1ZyAxMyAxMjo0OToyOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+CisKKwkqIE1ha2VmaWxlLmluICh0YXopOiBUcnkgImNobW9kIC1SIG9nPXUgLiIgYmVmb3JlIAorCSJjaG1vZCBvZz11IGBmaW5kIC4gLXByaW50YCIuCisKK0ZyaSBKdWwgMzEgMDk6Mzg6MzMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmUuaW46IEFkZCBhcm0tZWxmIGFuZCB0aHVtYi1lbGYgc3VwcG9ydC4KKworTW9uIEp1bCAyNyAxNjoyMzo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogVW5kbyBwcmV2aW91cyBwYXRjaC4KKworRnJpIEp1bCAyNCAxOTo1NToyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBNb3ZlIEVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUworCXRvIGhlcmUgLi4uCisJKGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcyk6IGFuZCBoZXJlCisJKElOU1RBTExfTU9EVUxFUyk6IC4uLiBmcm9tIGhlcmUuCisKK0ZyaSBKdWwgMjQgMTc6MDE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KKworCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIEZTRi4KKworRnJpIEp1bCAyNCAwODo0MzozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUgKGV4dHJhY29uZmlnZGlycyk6IE5ldyB2YXJpYWJsZS4KKwkoU1VCRElSUyk6IEFkZCBleHRyYWNvbmZpZ2RpcnMgYW5kIHJlY3Vyc2Ugb24gdGhlbSB0b28uCisJKiBNYWtlZmlsZS5pbiAoYWxsKTogTW92ZSBoaWdoZXIgaW4gZmlsZS4KKwkoRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMpOiBOZXcgdmFyaWFibGUuCisJKEVYVFJBX1RBUkdFVF9IT1NUX3tJTlNUQUxMLENIRUNLfV9NT0RVTEVTKTogTmV3IHZhcmlhYmxlcy4KKwkoQUxMX01PRFVMRVMpOiBBZGQgRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMuCisJKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGQgRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUy4KKwkoSU5TVEFMTF9NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUy4KKworMTk5OC0wNy0yMyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtbGliamF2YSk6IERlcGVuZCBvbiBhbGwtZ2NjIGFuZAorCWFsbC10YXJnZXQtbmV3bGliLgorCShjb25maWd1cmUtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gJChBTExfR0NDKS4KKworU2F0IEp1bCAxOCAxNDozMjo0MyBDRFQgMTk5OCAgUm9iZXJ0IExpcGUgIDxyb2JlcnRsQGRnaWkuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6ICgqLXBjLXNjbzMuMnY1KSBBZGQgZGV0ZWN0aW9uIGZvciBQZW50aXVtIElJLgorCSgqLXBjLXVuaXh3YXJlNykgQWRkIGRldGVjdGlvbiBmb3IgUGVudGl1bSBJSSwgUGVudGl1bSBQcm8uCisKK0ZyaSBKdWwgMTcgMTM6MzA6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB5bHdyYXA6IENoYW5nZSBhYnNvbHV0ZSBwYXRoIGNoZWNrcyB0byBjaGVjayBmb3IgRE9TIHN0eWxlIHBhdGgKKwluYW1lcy4KKworCSogeWx3cmFwOiBEb24ndCB1c2UgYSBmdWxsIHBhdGggbmFtZSBpZiB0aGUgc291cmNlIGZpbGUgaXMgaW4gdGhlCisJc2FtZSBkaXJlY3RvcnkuICBGcm9tIGhqbEBsdWNvbi5vcmcgKEguSi4gTHUpLgorCisJKiBjb25maWctbWwuaW46IERlZmF1bHQgdG8gYmVpbmcgdmVyYm9zZSwgdG8gbWF0Y2ggRmViIDE4IGNoYW5nZSB0bworCWNvbmZpZ3VyZS4KKworVGh1IEp1bCAxNiAxMjoyOTo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCcm91Z2h0IG92ZXIgZnJvbSBlZ2NzOgorCisJU2F0IEp1biAyNyAyMjo0NjozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byAke3RhcmdldF9hbGlhc30gaW5zdGVhZAorCW9mICJsaWJyYXJpZXMiLgorCisJTW9uIFNlcCAgMSAxNjo0NTo0NCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byBsaWJyYXJpZXMgaWYgZW5hYmxlX211bHRpbGliLgorCitXZWQgSnVsIDE1IDAxOjAwOjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IElmIHRoZXJlIGFyZSBhbnkKKwltdWx0aWxpYnMsIGZvcmNlIHJlY29uZmlndXJhdGlvbiB0aGUgZmlyc3QgdGltZSB3ZSBjcmVhdGUKKwltdWx0aWxpYi5vdXQgaW4gYSBzdWJkaXJlY3RvcnksIGluIGNhc2UgVEFSR0VUX1NVQkRJUiBpcyBgLicuCisKK1R1ZSBKdWwgMTQgMjM6NDE6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFN0cmlwIGFueSAtLW5vIG9wdGlvbiBmcm9tIENPTkZJR19BUkdVTUVOVFMsIHRvCisJYXZvaWQgY29uZnVzaW9uIHdpdGggLS1uby1yZWN1cnNpb24uCisKK1R1ZSBKdWwgMTQgMTU6Mzc6NDEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBXaW4zMiBob3N0cyBzaG91bGRuJ3QgdXNlIGluc3RhbGwgLXgKKwkqIGluc3RhbGwtc2g6IHJlbW92ZSAteCBvcHRpb24sIGFuZCBzcGVjaWFsIC5leGUtaGFuZGxpbmcKKwloYWNrLgorCitUdWUgSnVsIDE0IDE1OjI4OjQxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGk1ODYtcGMtYmVvcy4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgc29tZSBiaXRzIGZvciBiZW9zLgorCitUdWUgSnVsIDE0IDEzOjIyOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBJZiBDQyBpcyBzZXQgYnV0IENGTEFHUyBpcyBub3QsIGFuZCBDQyBpcyBnY2MsIG1ha2UKKwlDRkxBR1MgZGVmYXVsdCB0byAtTzIuCisKKwkqIGx0bWFpbi5zaDogQWRkIHNvbWUgaGFja3MgdG8gbWFrZSBTdW5PUyAtLWVuYWJsZS1zaGFyZWQgd29yaworCXdoZW4gdXNpbmcgR05VIGxkLgorCitGcmkgSnVsIDEwIDEzOjE4OjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbHRtYWluLnNoOiBDb3JyZWN0IGluc3RhbGwgd2hlbiB1c2luZyBhIGRpZmZlcmVudCBzaGVsbC4KKworVHVlIEp1bCAgNyAxNToyNDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmIuCisKK1RodSBKdWwgIDIgMTM6NTc6MzYgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+CisKKwkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIGJ1aWxkIGJpbnV0aWxzL21ha2VmaWxlLnZtcy4gIEFkZCBpbnN0YWxsCisJdGFyZ2V0LgorCitXZWQgSnVsICAxIDE2OjQ1OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbHRjb25maWc6IFVwZGF0ZSB0byBjb3JyZWN0IEFJWCBoYW5kbGluZy4KKworU2F0IEp1biAyNyAyMjo0NjozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgVEFSR0VUX1NVQkRJUi4KKworCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvICR7dGFyZ2V0X2FsaWFzfSBpbnN0ZWFkCisJb2YgImxpYnJhcmllcyIuCisKKzE5OTgtMDYtMjYgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBnY2NfdmVyc2lvbl90cmlnZ2VyLgorCShNYWtlZmlsZSk6IERlcGVuZCBvbiAkKGdjY192ZXJzaW9uX3RyaWdnZXIpLgorCisJKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogQ2hhbmdlIGRlZmF1bHQgaW5pdGlhbGl6ZXIgdG8gZW1wdHkKKwlzdHJpbmcuCisJKGdjY192ZXJzaW9uX3RyaWdnZXIpOiBOZXcgdmFyaWFibGU7IHBhc3MgdGhpcyB2YXJpYWJsZSBkb3duCisJdG8gc3ViZGlyIGNvbmZpZ3VyZXMgdG8gZW5hYmxlIHRoZW0gY2hlY2tpbmcgZ2NjJ3MgdmVyc2lvbgorCXRoZW1zZWx2ZXMuIEVtaXQgbWFrZSBtYWNyb3MgZm9yIGJvdGggZ2NjX3ZlcnNpb24gdmFycy4KKwkodG9wc3JjZGlyKTogSW5pdGlhbGl6ZSByZWxpYWJseS4KKwkocmVjdXJzaW9uIGxpbmUpOiBSZW1vdmUgLS13aXRoLWdjYy12ZXJzaW9uPSR7Z2NjX3ZlcnNpb259LgorCisxOTk4LTA2LTI0ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvbmZpZ3VyZSAoZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzKTogSW1wbGVtZW50IG5ldyBmbGFnCisJLS1lbmFibGUtdmVyc2lvbi1zcGVjaWZpYy1ydW50aW1lLWxpYnMgd2hpY2ggaW5zdGFsbHMgQysrIHJ1bnRpbWUgc3R1ZmYKKwlpbiAkKGxpYnN1YmRpcik7IGVtaXQgZGVmaW5pdGlvbiBpbiBlYWNoIGdlbmVyYXRlZCBNYWtlZmlsZS4KKwkoZ3h4X2luY2x1ZGVfZGlyKTogSW5pdGlhbGl6ZSBkZXBlbmRpbmcgb24KKwkkZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzLgorCisxOTk4LTA2LTI0ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBJbml0aWFsaXplIHByb3Blcmx5IGRlcGVuZGluZyBvbgorCWhvdyBhbmQgd2hlcmUgY29uZmlndXJlIGlzIHN0YXJ0ZWQuCisJKHJlY3Vyc2lvbiBsaW5lKTogUGFzcyBhIC0td2l0aC1nY2MtdmVyc2lvbj0ke2djY192ZXJzaW9ufQorCXRvIGNvbmZpZ3VyZXMgaW4gc3ViZGlycy4KKworV2VkIEp1biAyNCAxNjowMTo1OSAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBjb25maWd1cmUgcGF0dGVybiBmb3IgbWlwcyB0eDM5CisgCWN5Z21vbgorCitUdWUgSnVuIDIzIDIyOjQyOjMyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGFuZCBsaWJzdHViIHN1cHBvcnQgZm9yIG1uMTAyMDAuCisKKzE5OTgtMDYtMTkgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IEFkZCBuZXcgdmFyaWFibGUgZGVzY3JpYmluZyB0aGUKKwlwYXJ0aWN1bGFyIGdjYyB2ZXJzaW9uIHdlJ3JlIGJ1aWxkaW5nLgorCSogTWFrZWZpbGUuaW4gKGxpYnN1YmRpcik6IEFkZCBuZXcgbWFjcm8gZm9yIHRoZSBkaXJlY3RvcnkKKwlpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgZXRjLgorCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gZ2NjX3ZlcnNpb24sIHRhcmdldF9hbGlhcworCWFuZCBsaWJzdWJkaXIuCisKK0ZyaSBKdW4gMTkgMDI6MzY6NTkgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KKworCSogTWFrZWZpbGUuaW4gKGxvY2FsLWNsZWFuKTogcmVtb3ZlICoubG9nCisJKHdhcm5pbmcubG9nKTogYnVpbHQgd2l0aCB3YXJuX3N1bW1hcnkgZnJvbSBidWlsZC5sb2cKKwkobWFpbC1yZXBvcnQubG9nKTogcnVuIHRlc3Rfc3VtbWFyeQorCShtYWlsLXJlcG9ydC13aXRoLXdhcm5pbmdzLmxvZyk6IHJ1biB0ZXN0X3N1bW1hcnkgaW5jbHVkaW5nCisJd2FybmluZy5sb2cgaW4gdGhlIHJlcG9ydAorCitUaHUgSnVuIDE4IDExOjI2OjAzIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KKworCSogY29uZmlnLmd1ZXNzOiBEZXRlY3Rpb24gb2YgUGVudGl1bSBJSSBmb3IgKi1zY28tMy4ydjUqLgorCitNb24gSnVuIDE1IDE0OjUzOjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGdyZXApOiBHcmVwIG5vIGxvbmdlciBkZXBlbmRzIG9uIGxpYmliZXJ0eS4KKworRnJpIEp1biAxMiAxNDowMzozNCAxOTk4ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBhbGwtc25hdmlnYXRvciBuZWVkcyBhbGwtbGliZ3VpLgorCitUaHUgSnVuIDExIDE5OjQzOjQ3IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGFuZCBsaWJzdHViIHN1cHBvcnQgZm9yIG1uMTAzMDAuCisKK1dlZCBKdW4gMTAgMTE6MTk6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXNzaW5nOiBVcGRhdGUgdG8gdmVyc2lvbiBmcm9tIGF1dG9tYWtlIDEuMy4KKworCSogbHRtYWluLnNoOiBPbiBpbnN0YWxsYXRpb24sIGRvbid0IGdldCBjb25mdXNlZCBpZiB0aGUgc2FtZSBuYW1lCisJYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzLgorCitXZWQgSnVuICAzIDE0OjUxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogQWNjZXB0IG02ODA2MCBhbmQgbTUyMDAgYXMgQ1BVIG5hbWVzLgorCitNb24gSnVuICAxIDE3OjI1OjE2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBVc2UgJiYgcmF0aGVyIHRoYW4gdXNpbmcgLWEgaW4gdGVzdCwgYmVjYXVzZSBvZGQKKwlzdHJpbmdzIGNhbiBjb25mdXNlIHRlc3QuCisJKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgorCitUaHUgTWF5IDI4IDE5OjMxOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbHRjb25maWcsIGx0bWFpbi5zaDogQnJpbmcgaW4gVmlzdWFsIEMrKyBzdXBwb3J0LgorCitTYXQgTWF5IDIzIDIzOjQ0OjEzIDE5OTggIEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+CisKKwkqIE1ha2VmaWxlLmluIChib29zdHJhcDItbGVhbiwgYm9vdHN0cmFwMy1sZWFuLAorCWJvb3RzdHJhcDQtbGVhbik6IG5ldyB0YXJnZXRzCisKK01vbiBNYXkgMTEgMjM6MTE6MzQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBDT1BZSU5HLkxJQjogVXBkYXRlIEZTRiBhZGRyZXNzLgorCitGcmkgTWF5ICA4IDAxOjMwOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yYS4KKworCSogTWFrZWZpbGUuaW4gKEdBU0JfU1VQUE9SVF9ESVJTKTogUmVtb3ZlIGludGw7IGFscmVhZHkgaW5jbHVkZWQgdmlhCisJR0FTX1NVUFBPUlRfRElSUy4KKworVGh1IE1heSAgNyAxNzoyNzozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEF2b2lkIHByb2R1Y2luZyBhIHZlcnNpb24gbnVtYmVyIGlmCisJLXZlcnNpb24taW5mbyB3YXMgbm90IHVzZWQuCisKK1R1ZSBNYXkgIDUgMTg6MDI6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCAtLXdpdGgtbmV3bGliIHRvIENPTkZJR19BUkdVTUVOVFMgaWYgd2UgYXJlCisJYnVpbGRpbmcgd2l0aCBuZXdsaWIuCisKKzE5OTgtMDQtMzAgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgorCisgICAgICAgICogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IFJlbW92ZSBiYWNrc2xhc2ggYXQgZW5kOworICAgICAgICBTb2xhcmlzIGBtYWtlJyBjYXVzZXMgaXQgdG8gY29udGludWUgdG8gbmV4dCBkZWZpbml0aW9uLiAKKworVHVlIEFwciAyOCAxODoxMToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFscGhhIHRvIGFscGhhKiBpbiBzZXZlcmFsIHBsYWNlcy4KKworVHVlIEFwciAyOCAwNzo0MjowMCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyYzg2eC4KKworVHVlIEFwciAyOCAwNzozNTowMiAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKyAKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlKTogUmVtb3ZlIGRlYnVnIGVjaG8uCisKK1RodSBBcHIgMjMgMjE6MzE6MTYgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFNldCBDWFhGTEFHUyBmcm9tIENYWEZMQUdTLCBub3QgQ0ZMQUdTLgorCitUaHUgQXByIDIzIDEyOjI2OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbHRjb25maWc6IFVwZGF0ZSBjeWd3aW4zMiBzdXBwb3J0LgorCisJKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBpbnRsLgorCShCSU5VVElMU19TVVBQT1JUX0RJUlMsIEdBU0JfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCisJKEdEQl9TVVBQT1JUX0RJUlMpOiBMaWtld2lzZS4KKworV2VkIEFwciAyMiAxMjozMDoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0YXJnZXRfbWFrZWZpbGVfZnJhZyk6IElmIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSwKKwl1c2UgLU9zIHRvIGNvbXBpbGUgdGFyZ2V0IGxpYnJhcmllcyByYXRoZXIgdGhhbiAtTzIuICBEZWZhdWx0IHRvCisJdXNpbmcgLU9zIGZvciBkMTB2IGFuZCBtMzJyIGlmIC0te2VuYWJsZSxkaXNhYmxlfS10YXJnZXQtb3B0c3BhY2UgaXMKKwlub3QgdXNlZC4KKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NmbGFncyk6IERpdHRvIGZvciBkMzB2LgorCitUdWUgQXByIDIxIDIzOjA2OjU0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgb24gYWxsLWludGwuCisJKGFsbC1iaW51dGlscyk6IExpa2V3aXNlLgorCShhbGwtZ2FzKTogTGlrZXdpc2UuCisJKGFsbC1ncHJvZik6IExpa2V3aXNlLgorCShhbGwtbGQpOiBMaWtld2lzZS4KKworCisxOTk4LTA0LTE5ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBGaXggdHlwbywgbGJ0b29sIC0+IGxpYnRvb2wuCisKK0ZyaSBBcHIgMTcgMTY6MjA6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWJmZCk6IERlcGVuZCB1cG9uIGFsbC1saWJpYmVydHkuCisKKwkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIG5ld2VyIGN5Z3dpbjMyIHN1cHBvcnQuCisKK0ZyaSBBcHIgMTcgMTI6MjI6MjIgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBBZGQgbGlic3R1Yi4KKworCSogY29uZmlndXJlLmluOiBEaXR0by4gQnVpbGQgbGlic3R1YiBmb3IgdGFyZ2V0cyB0aGF0IGhhdmUgY3lnbW9uCisJc3VwcG9ydC4KKworVHVlIEFwciAxNCAxODowMTo1NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFBJQ0ZMQUcgb24gaXg4Ni1jeWd3aW4zMi4KKworVHVlIEFwciAxNCAxMjoyNDo0NSAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXNlIGlbMzQ1Nl05Ni0qLXN5c3Y1KiBhcyBhIHZhbGlkIGhvc3QsIGFuZAorCXVzZSBtaC1zeXN2NSBpZiBzcGVjaWZpZWQuICBTdXBwb3J0IGdwcm9mIG9uIFNDTyBPcGVuIFNlcnZlci4KKworVHVlIEFwciAxNCAxMTozMzo1MSAxOTk4ICBLcmlzdGVyIFdhbGZyaWRzc29uIDxjYXRvQGRmLmx0aC5zZT4KKworCSogY29uZmlndXJlOiBEZWZpbmUgREVGQVVMVF9NNCBieSBzZWFyY2hpbmcgUEFUSC4KKwkqIE1ha2ZpbGUuaW46IFVzZSBERUZBVUxUX000LgorCitNb24gQXByIDEzIDE1OjM3OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbHRjb25maWc6IEFkZCBjeWd3aW4zMiBzdXBwb3J0LgorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgbGlidG9vbCBhcyBhIG5hdGl2ZSBvbmx5IGRpcmVjdG9yeQorIAl0byBjb25maWd1cmUgYW5kIGJ1aWxkLgorCitXZWQgQXByICA4IDEzOjE4OjU2IDE5OTggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgorCisJKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogWEZPTyBsaW5lcyBzaG9ydGVuZWQuCisKK1RodSBBcHIgIDIgMTQ6NDg6NDQgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IGFkZCBhc2ggbWFrZSBydWxlcworCSogY29uZmlndXJlLmluOiBhZGQgYXNoIHRvIG5hdGl2ZV9vbmx5IGFuZCBob3N0X3Rvb2xzIGxpc3RzCisKK1RodSBNYXIgMjYgMTI6NTM6MjAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWdldHRleHQsIGFsbC1pbnRsKTogTmV3IHRhcmdldHMuCisJKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdldHRleHQsIGFsbC1pbnRsLgorCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2stZ2V0dGV4dCwgY2hlY2staW50bC4KKwkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1nZXR0ZXh0LCBpbnN0YWxsLWludGwuCisJKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nZXR0ZXh0LCBjbGVhbi1pbnRsLgorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCBnZXR0ZXh0LgorCShuYXRpdmVfb25seSk6IExpa2V3aXNlLgorCShub2NvbmZpZ2RpcnMpIFt2YXJpb3VzIGNhc2VzXTogTGlrZXdpc2UuCisJKGhvc3RfbGlicyk6IEFkZGVkIGludGwuCisKK1dlZCBNYXIgMjUgMTE6NDk6MTIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgorCShhbGwtdGFyZ2V0LXdpbnN1cCk6ICBhbGwtdGFyZ2V0LWxpYnJ4IHN0YXlzIG91dCBvZiBoZXJlLgorCitUdWUgTWFyIDI0IDE2OjU4OjI5IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVEFSR0VUX0NPTkZJR0RJUlMsIEFMTF9UQVJHRVRfTU9EVUxFUywgCisJQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTLCBDSEVDS19UQVJHRVRfTU9EVUxFUywgCisJSU5TVEFMTF9UQVJHRVRfTU9EVUxFUywgQ0xFQU5fVEFSR0VUX01PRFVMRVMsIGFsbC10YXJnZXQtd2luc3VwKTogCisJUmVtb3ZlIHJlZmVyZW5jZXMgdG8gbGlicnggYW5kIGxpYmcrKy4KKworVHVlIE1hciAyNCAxODoyODoxMiAxOTk4ICBFcmljIE11bXBvd2VyICA8bm9jdHVybmVAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgJChsaXNwZGlyKSBkb3duIHRvCisJcmVjdXJzaXZlIG1ha2VzCisKK1R1ZSBNYXIgMjQgMTE6Mzc6NDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFVzZSAkKFRBUkdFVF9TVUJESVIpIHdoZW4gcGFzc2luZyAtQgorCWZvciBuZXdsaWIgZGlyZWN0b3J5LgorCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgorCitNb24gTWFyIDIzIDExOjMwOjIxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbHRjb25maWc6IFVwZGF0ZSBhZnRlciBsaWJ0b29sL2x0Y29uZmlnLmluIGNoYW5nZSBmb3IKKwlocHV4MTEuCisKK0ZyaSBNYXIgMjAgMTg6NTE6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjIuCisKK0ZyaSBNYXIgMjAgMDk6MzI6MTQgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1nY2MpOiBEb24ndCBzcGVjaWZ5IExBTkdVQUdFUyBoZXJlLgorCShpbnN0YWxsLWdjYy1jcm9zcyk6IEluc3RlYWQsIG92ZXJyaWRlIExBTkdVQUdFUyBoZXJlLgorCisxOTk4LTAzLTE4ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+CisKKwkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBTZXQgQ09ORklHX1NJVEUgdG8gYQorCW5vbi1leGlzdGVudCBmaWxlIHNpbmNlIC9kZXYvbnVsbCBsb3NlcyB3aXRoIGJhc2ggMi4wL2F1dG9jb25mIDIuMTIuCisKK1dlZCBNYXIgMTggMDk6MjQ6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgVGh1bWItcGUgdGFyZ2V0LgorCitUdWUgTWFyIDE3IDE2OjU5OjAwIDE5OTggIFN5ZCBQb2xrIDxzcG9sa0BjeWdudXMuY29tPgorCSogTWFrZWZpbGUuaW4gLSBjaGFuZ2VkIHNuIHRhcmdldHMgdG8gc25hdmlnYXRvcgorCSogY29uZmlndXJlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKKworVHVlIE1hciAxNyAxMDozMzoyOCAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvbmZpZy1tbC5pbjogQWZ0ZXIgYnVpbGRpbmcgc3ltbGluayB0cmVlIGNhbGwgbWFrZSBkaXN0Y2xlYW4KKwlpZiBhIE1ha2VmaWxlIGdvdCBsaW5rZWQgaW50byAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyB0aGlzIGhhcHBlbnMKKwl0byBiZSB0aGUgY2FzZSBmb3IgbGliaWJlcnR5LgorCitUdWUgTWFyIDE3IDEwOjIyOjM3IDE5OTggIEguSi4gTHUgIChoamxAZ251LmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZ3VyZTogV2hlbiBtYWtpbmcgbGluaywgYWxzbyBjaGVjayB0aGUgY3VycmVudAorCWRpcmVjdG9yeS4gVGhlIGNvbmZpZ3VyZSBzY3JpcHRzIG1heSBjcmVhdGUgb25lLgorCitGcmkgTWFyICA2IDAxOjAyOjAzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IEFjY2VwdCBhbHBoYXBjYTU2IGFuZCBhbHBoYWV2NiBwcm9wZXJseS4KKworRnJpIE1hciAgNiAwMDoxNDo1NSAxOTk4ICBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBwb3dlcnBjLWxpbnV4LWdudWxpYmMxLgorCisKK01vbiBGZWIgMjMgMTU6MDk6MTggMTk5OCAgQnJ1bm8gSGFpYmxlIDxicnVub0BsaW51aXgubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlCisKKyAgICAgICAgKiBjb25maWcuc3ViIChzY281KTogRml4IHR5cG8uCisKK01vbiBGZWIgMjMgMTQ6NDY6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9NT0RVTEVTKTogTW92ZSBpbnN0YWxsLXRjbCBiZWZvcmUKKwlpbnN0YWxsLWl0Y2wuCisJKGluc3RhbGwtaXRjbCk6IFJlbW92ZSBkZXBlbmRlbmN5IG9uIGluc3RhbGwtdGNsLgorCitNb24gRmViIDIzIDA5OjUzOjI4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZW1vdmUgbGliZ2xvc3MgZnJvbSBub2NvbmZpZ2RpcnMgZm9yIE1OMTAzMDAuCisKK0ZyaSBGZWIgMjAgMTY6NDc6MjQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IERvbid0IGxldCBidWlsZHMgYmUgZG9uZSBpbiBzb3VyY2UgdHJlZS4KKworVGh1IEZlYiAxOSAxMzo0MDo0MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGliZ3VpIGZvciBhIGN5Z3dpbjMyIHRhcmdldCB3aGVuIG5vdCBvbgorCWEgY3lnd2luMzIgaG9zdC4KKworV2VkIEZlYiAxOCAxMjoyOTowMCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIChyZWRpcmVjdCk6IFNldCB0byBudWxsLCBzbyBkZWZhdWx0IGJlaGF2aW9yIG9mCisJY29uZmlndXJlIGlzIG5vdyAtLXZlcmJvc2UuCisKKzE5OTgtMDItMTYgIERhdmUgTG92ZSAgPGQubG92ZUBkbC5hYy51az4KKworCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IFJ1biBjb25maWd1cmUgd2l0aAorCUNPTkZJR19TSVRFPS9kZXYvbnVsbCB0byBmb3Jlc3RhbGwgbG9zc2FnZSB3aXRoIHNpdGUgY29uZmlndXJhdGlvbi4KKworTW9uIEZlYiAxNiAxMjoyMzo1MyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPE1hbmZyZWQuSG9sbHN0ZWluQGtzLnNlbC5hbGNhdGVsLmRlPgorCisJKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTLCBFWFRSQV9UQVJHRVRfRkxBR1MpOiBSZWFsbHkgYWRkCisJdGhpcyBjaGFuZ2UgdG8gc3luYyBNYWtlZmlsZS5pbiB3aXRoIGl0cyBDaGFuZ2VMb2cgZW50cmllcy4KKworVGh1IEZlYiAxMiAxNTowMzowOCAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+CisKKwkqIGx0bWFpbi5zaCAobWtkaXIpOiBDaGVjayB0aGF0IHRoZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdAorCWJlZm9yZSB3ZSBleGl0IHdpdGggZXJyb3IsIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHJhY2VzIGR1cmluZworCXBhcmFsbGVsIGJ1aWxkcy4KKworU2F0IEZlYiAgNyAxNToxOToxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSBmcm9tIGxpYnRvb2wgMS4waS4KKworRnJpIEZlYiAgNiAwMTozMzo1MiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBEb24ndCBwYXNzIFBJQ0ZMQUcgYW5kCisJUElDRkxBR19GT1JfVEFSR0VULgorCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEb24ndCBwYXNzIFBJQ0ZMQUdfRk9SX1RBUkdFVC4KKworCSogY29uZmlndXJlOiBFbWl0IGEgZGVmaW5pdGlvbiBmb3IgdGhlIG5ldyBtYWNybyBlbmFibGVfc2hhcmVkCisJaW50byBlYWNoIE1ha2VmaWxlLgorCisJKiBjb25maWcvbWgtc3BhcmNwaWMgKFBJQ0ZMQUcpOiBEZWZpbmUgdG8gcHJvcGVybHkgYWNjb3JkaW5nCisJdG8gY3VycmVudCBtdWx0aWxpYiBjb25maWd1cmF0aW9uLgorCSogY29uZmlnL210LXNwYXJjcGljIChQSUNGTEFHX0ZPUl9UQVJHRVQpOiBEZWZpbmUgdG8gcHJvcGVybHkKKwlhY2NvcmRpbmcgdG8gY3VycmVudCBtdWx0aWxpYiBjb25maWd1cmF0aW9uLgorCitUaHUgRmViICA1IDE3OjAxOjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMsIG5hdGl2ZV9vbmx5KTogQWRkIGxpYnRvb2wuCisKK1dlZCBGZWIgIDQgMTY6NTM6NTggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBhZGQgdGFyZ2V0LWdwZXJmIHRvIG5vY29uZmlnZGlycyBmb3IgQ3lnd2luMzIuCisJRml4IHR5cG8gaW4gbWluZyBjb25maWcgY29tbWVudC4KKworV2VkIEZlYiAgNCAxODo1NjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSBmcm9tIGxpYnRvb2wgMS4waC4KKworTW9uIEZlYiAgMiAxOTozODoxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IEFkZCB0aWMzMCBjYXNlcywgYW5kIG1hcCBjMzAgdG8gdGljMzAuCisKK0ZyaSBKYW4gMzAgMTc6MTg6MzIgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGV4cGVjdCBmcm9tIG5vY29uZmlnZGlycyB3aGVuIHRhcmdldAorICAgICAgICBpcyBjeWd3aW4zMi4gIE9LIHRvIGJ1aWxkIGV4cGVjdCBhbmQgZGVqYWdudSB3aXRoIENhbmFkaWFuCisgICAgICAgIENyb3NzLgorCitXZWQgSmFuIDI4IDEyOjU4OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBleHBlY3QsIGRlamFnbnUsIGFuZCBjdnNzcmMgZm9yIGEgY3lnd2luMzIKKwlob3N0LgorCisJKiBjb25maWcuZ3Vlc3M6IFVzZSAke1VOQU1FX01BQ0hJTkV9IHJhdGhlciB0aGFuIGkzODYgZm9yIGN5Z3dpbjMyCisJYW5kIG1pbmd3MzIuCisKK1dlZCBKYW4gMjggMTA6MjY6MzcgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogUmVtb3ZlIHBhc3NpbmcgJChsb2NhbF9wcmVmaXgpCisJaGVyZSBhcyBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgdG9wbGV2ZWwgTWFrZWZpbGUuCisKK1R1ZSBKYW4gMjcgMjM6MjU6MDYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBjb25maWd1cmUgKHBhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZyk6IE5ldyB2YXJpYWJsZSwgd2hpY2ggbmFtZXMKKwlhIGZpbGUgd2l0aCBnZW5lcmljIHJ1bGVzLCAuLi4KKwlDaGFuZ2UgY29tbWVudCB0byBtZW50aW9uIHdlIG5vdyBoYXZlIEZJVkUgcGFydHMuCisJKiBjb25maWd1cmU6IFVuZG8gbGFzdCBjaGFuZ2UuCisKK1R1ZSBKYW4gMjcgMjM6MTU6NTUgMTk5OCAgTGFzc2kgQS4gVHV1cmEgIDxsYXRAaWtpLmZpPgorCisJKiBjb25maWcuZ3Vlc3M6IE1vcmUgYWNjdXJhdGUgZGV0ZXJtaW5hdGlvbiBvZiBIUCBwcm9jZXNzb3IgdHlwZXMuCisJKiBjb25maWcuc3ViOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgorCitTYXQgSmFuIDI0IDAxOjU5OjQ1IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX2ZyYWcpOiBNb3ZlIGluc2VydGluZyB0aGUKKwkke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gdG8gd2hlcmUgaXQgc2hvdWxkIGJlIGFjY29yZGluZworCXRvIHRoZSBjb21tZW50LgorCitGcmkgSmFuIDIzIDAwOjMwOjIxIDE5OTggIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgorCisJKiBjb25maWcuZ3Vlc3M6IEFkZCBzdXBwb3J0IGZvciBMaW51eC9BUk0uCisKK1RodSBKYW4gMjIgMTU6MTQ6MDEgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIC5jdnNpZ25vcmU6IFJlbW92ZSAqLWluZm8gYW5kICotaW5zdGFsbCBzaW5jZSB0aGV5IG1hdGNoCisJcmVsZWFzZS1pbmZvIGFuZCBtcHctaW5zdGFsbCwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBqdXN0IGlnbm9yZS4KKworVGh1IEphbiAyMiAwMTozODozMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJldmVydCAzIEphbiBjaGFuZ2UgZm9yIGFscGhhLWxpbnV4LWdudWxpYmMxLgorCitTYXQgSmFuIDE3IDIxOjI4OjA4IDE5OTggIFBpZXRlciBOYWdlbCA8cG5hZ2VsQGVwaXVzZS5jby56YT4KKworCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gZ2NjX2luY2x1ZGVfZGlyIGFuZAorCWxvY2FsX3ByZWZpeCB0byBzdWItbWFrZSBpbnZvY2F0aW9ucy4KKworU2F0IEphbiAxNyAyMTowNDo1OSAxOTk4IEguSi4gTHUgIChoamxAZ251Lm9yZykKKworCSogY29uZmlndXJlLmluOiBDaGVjayBtYWtlZmlsZSBmcmFnbWVudHMgaW4gdGhlIHNvdXJjZQorCWRpcmVjdG9yeS4KKworRnJpIEphbiAxNiAwMDo0MTozNyAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgorCisJKiBjb25maWd1cmUuaW46IGNoZWNrIHdoZXRoZXIgaG9zdCBhbmQgdGFyZ2V0IG1ha2VmaWxlCisJZnJhZ21lbnRzIGV4aXN0IGJlZm9yZSBhZGRpbmcgdGhlbSB0byAqX21ha2VmaWxlX2ZyYWcKKworV2VkIEphbiAxNCAyMzozOToxMCAxOTk4ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0YXJnZXRfY29uZmlnZGlycyk6IEFkZCBjeWdtb24gZm9yIHNwYXJjNjQtZWxmLgorCQorV2VkIEphbiAxNCAxMjo0ODowNyAxOTk4ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB3ZSBvbmx5IHJlcGxhY2UgUlBBVEhfRU5WVkFSIG9uCisJbGluZXMgd2hpY2ggYmVnaW4gd2l0aCBSUEFUSF9FTlZWQVIsIGkuZS4gYWRkICJeIiB0byB0aGUKKwlyZWdleHAgdG8gc2VkLgorCisJKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBSUlBBVEhfRU5WVkFSIGRvd24KKwl0byBzdWItbWFrZXMuCisKKzE5OTgtMDEtMTMgIExlZSBJdmVyc29uICAgKGxlZWlAYWkuc3JpLmNvbSkKKworCSogY29uZmlnLW1sLmluIChtdWx0aS1kbyk6IExERkxBR1MgbXVzdCBpbmNsdWRlIG11bHRpbGliCisJZGVzaWduYXRvci4KKworVHVlIEphbiAxMyAwMToxMzoyNCAxOTk4ICAgUm9iZXJ0IExpcGUgKHJvYmVydGxAZGdpaS5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGlbMzQ1Nl0taTU4Ni1Vbml4V2FyZTctc3lzdjUuCisKK1N1biBKYW4gIDQgMDE6MDY6NTUgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKwkqIGNvbmZpZy5zdWI6IEFkZCBtaW5ndzMyIHN1cHBvcnQuCisJKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgorCSogbWgtbWluZ3czMjogTmV3IGZpbGUuCisKK1NhdCBKYW4gIDMgMTI6MTE6MDUgMTk5OCBGcmFueiBTaXJsIDxmcmFuei5zaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaW5hbGl6ZSBzdXBwb3J0IGZvciB7YWxwaGF8cG93ZXJwY30qLSotbGludXgtZ251bGliYzEKKworU3VuIERlYyAyOCAxMToyODo1OCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgorCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycworCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCisKK1dlZCBEZWMgMjQgMjI6NDY6NTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IFN5bmMgd2l0aCBlZ2NzLiAgUGlja3MgdXAgbmV3IGFscGhhIHN1cHBvcnQsCisJQmVPUyAmIHNvbWUgYWRkaXRpb25hbCBsaW51eCBzdXBwb3J0LgorCitUdWUgRGVjIDIzIDEyOjQ1OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBIUCA5MDAwLzgwMyBpcyBhIFBBMS4xIG1hY2hpbmUuCisKKworU3VuIERlYyAyMSAxNjo1MzoxMiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQorCisgICAgICAgICogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcsIHRhcmdldF9tYWtlZmlsZV9mcmFnKToKKyAgICAgICAgSGFuZGxlIG11bHRpcGxlIGNvbmZpZyBmaWxlcy4KKyAgICAgICAgKGFscGhhLSotbGludXgqKTogVHJlYXQgYWxwaGEtKi1saW51eCogYXMgYWxwaGEtKi1saW51eCogYW5kCisgICAgICAgIGFscGhhLSotKi4KKworVGh1IERlYyAxOCAxMzoxMzowMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBta2RlcDogTmV3IGZpbGUuCisKK1dlZCBEZWMgMTcgMDk6NTM6MDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBBbGxvdyBjb25maWd1cmluZyBvZiBsaWJpZGUsIHZtYWtlLCBldGMuCisKK1R1ZSBEZWMgMTYgMTc6MzY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCisJKEdEQl9USyk6IEFkZCBhbGwtbGliZ3VpLgorCSogY29uZmlndXJlLmluOiBBZGQgbGliZ3VpIGRpcmVjdG9yeS4KKwkqIGNvbmZpZ3VyZTogQWRkIGFsbC1saWJndWkgdG8gR0RCX1RLLgorCitNb24gRGVjIDE1IDE2OjEyOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy1tbC5pbiAobXVsdGlkaXJzKTogQWRkIG0zMnIgdG8gbXVsdGlsaWIgbGlzdC4KKworRnJpIERlYyAxMiAxMDo0MzozMSAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtZ3BlcmYpOiBDaGFuZ2UgZGVwZW5kZW5jeSB0bworCWFsbC10YXJnZXQtbGlic3RkYysrLgorCitUaHUgRGVjIDExIDIzOjMwOjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6IEFkZCBCZU9TIHN1cHBvcnQuCisKK1dlZCBEZWMgMTAgMTU6MTA6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJU291cmNlIGRpcmVjdG9yeSBjdnMgcmVuYW1lZCB0byBjdnNzcmM6CisJKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBDaGFuZ2UgY3ZzIHRvIGN2c3NyYy4KKwkobmF0aXZlX29ubHkpOiBMaWtld2lzZS4KKwkobm9jb25maWdkaXJzKSBbdmFyaW91cyBjYXNlc106IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQ2hhbmdlIGFsbC1jdnMgdG8gYWxsLWN2c3NyYy4KKwkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IENoYW5nZSBjaGVjay1jdnMgdG8gY2hlY2stY3Zzc3JjLgorCShJTlNUQUxMX01PRFVMRVMpOiBDaGFuZ2UgaW5zdGFsbC1jdnMgdG8gaW5zdGFsbC1jdnNzcmMuCisJKENMRUFOX01PRFVMRVMpOiBDaGFuZ2UgY2xlYW4tY3ZzIHRvIGNsZWFuLWN2c3NyYy4KKwkoYWxsLWN2c3NyYyk6IFJlbmFtZSB0YXJnZXQgZnJvbSBhbGwtY3ZzLgorCitXZWQgRGVjICAzIDA3OjU1OjU5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBGaXggdGhpbmtvLgorCitUdWUgRGVjICAyIDEwOjU1OjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUX0NST1NTKTogRGVmaW5lLgorCShpbnN0YWxsLWNyb3NzLCBpbnN0YWxsLWdjYy1jcm9zcyk6IE5ldyB0YXJnZXRzLgorCitUdWUgRGVjICAyIDEwOjA4OjMxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KKworCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgorCitTdW4gTm92IDMwIDE2OjEyOjI3IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGVzIGZvciBjeWdtb24uCisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgY3lnbW9uIGZvciBzcGFyYy1lbGYgYW5kIHNwYXJjbGl0ZS1hb3V0LgorCitUaHUgTm92IDI3IDAxOjMxOjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUKTogRG8gaW5zdGFsbC1nY2MgZmlyc3QuCisJKiBjb25maWd1cmUgKGd4eF9pbmNsdWRlX2Rpcik6IFByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzdWJkaXJzCisJd2hpY2ggZG8gbm90IHVzZSBhdXRvY29uZi4KKworV2VkIE5vdiAyNiAxMTo1MzozMyAxOTk3ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BvbmlvbnMuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCBDaGFuZ2VMb2c6IG1lcmdlIHdpdGggZm91bmRyeSdzCisJMTEvMTgvOTcgYnVpbGQgCisKK1dlZCBOb3YgMjYgMTY6MDg6NTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBGcm9tIEZyYW56IFNpcmwuCisJKiBjb25maWcuZ3Vlc3MgKHBvd2VycGMqLSotbGludXgpOiBIYW5kbGUgZ2xpYmMyIGJldGEgcmVsZWFzZQorCWZvdW5kIG9uIFJlZEhhdCBMaW51eCBzeXN0ZW1zLgorCitGcmkgTm92IDIxIDA5OjUxOjAxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzIChhbHBoYSBzdHVmZik6IE1lcmdlIHdpdGggRlNGIHRvIGF2b2lkIGluY29ycmVjdAorCWd1ZXNzZXMuCisKK1RodSBOb3YgMTMgMTE6Mzg6MzcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni1uY3Itc3lzdjQuMyopOiBUd2Vhay4KKworTW9uIE5vdiAxMCAxNToyMzoyMSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBsdG1haW4uc2g6IElmIG1rZGlyIGZhaWxzLCBjaGVjayB3aGV0aGVyIHRoZSBkaXJlY3Rvcnkgd2FzIGNyZWF0ZWQKKwlhbnlob3cgYnkgc29tZSBvdGhlciBwcm9jZXNzLgorCitNb24gTm92IDEwIDE0OjM4OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQ29uZmlndXJlIGFsbCBkaXJlY3Rvcmllcy4KKworU3VuIE5vdiAgOSAxNzozNjoyMCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBuZXdsaWIsIGxpYmliZXJ0eSBkaXJlY3RvcmllcworCWZvciB0aGUgRDMwVi4KKworU2F0IE5vdiAgOCAxNDo0Mjo1OSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSB0YXJnZXQtbGliZ2xvc3Mgb24gdGhlIEQzMFYuCisKK0ZyaSBOb3YgIDcgMTA6MzQ6MDkgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisgICAgICAgICogaW5jbHVkZS9saWJpYmVydHkuaDogQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKworICAgICAgICBwcm9ncm1zLgorICAgICAgICAqIGluY2x1ZGUvcmVtb3RlLXNpbS5oOiAgQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKworICAgICAgICBwcm9ncmFtcy4KKworVGh1IE9jdCAzMCAxMTowOToyOSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBHQ0Mgbm93LgorCitNb24gT2N0IDI3IDEzOjE3OjI0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZW1vdmUgYSAic2Vjb25kIHBhc3MiIG9mIHR3ZWFraW5nIG5vY29uZmlnZGlycywKKwlpcyBubyBsb25nZXIgbmVlZGVkLgorCitNb24gT2N0IDI3IDEyOjAzOjUzIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IGNoZWNrLXRhcmdldC1saWJpbyBkZXBlbmRzIG9uIGFsbC10YXJnZXQtbGlic3RkYysrLgorCitTdW4gT2N0IDI2IDExOjQ4OjI3IDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICAobWFuZnJlZEBzLWRpcmVrdG5ldC5kZSkKKworCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcC1sZWFuKTogQ29tYmluZWQgd2l0aCBgbm9ybWFsJyBib290c3RyYXAKKwl0YXJnZXRzIHVzaW5nICIkQCIgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsCisJdGFyZ2V0cyB3aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgY29kZS4KKworTW9uIE9jdCAyMCAxNToyODo0OSAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogbWFrZWZpbGUudm1zOiBGaXggdG8gd29yayB3aXRoIERFQyBDLgorCitUdWUgT2N0ICA3IDIzOjU4OjU3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBBZGQgbWlwcy10eDM5LWVsZiB0byBtYXJrZXRpbmcgbmFtZXMuCisKK1R1ZSBPY3QgIDcgMTQ6MjQ6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsdG1haW4uc2g6IEhhbmRsZSBzeW1saW5rcyBpbiBnZW5lcmF0ZWQgc2NyaXB0LgorCitXZWQgT2N0ICAxIDEzOjExOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBIYW5kbGUgYXV0b2NvbmYgc3R5bGUgZGlyZWN0b3J5IG9wdGlvbnM6IC0tYmluZGlyLAorCS0tZGF0YWRpciwgLS1pbmNsdWRlZGlyLCAtLWluZm9kaXIsIC0tbGliZGlyLCAtLWxpYmV4ZWNkaXIsCisJLS1tYW5kaXIsIC0tb2xkaW5jbHVkZWRpciwgLS1zYmluZGlyLCAtLXNoYXJlZHN0YXRlZGlyLAorCS0tc3lzY29uZmRpci4KKwkqIE1ha2VmaWxlLmluIChzYmluZGlyLCBsaWJleGVjZGlyLCBzeXNjb25mZGlyKTogTmV3IHZhcmlhYmxlcy4KKwkoc2hhcmVkc3RhdGVkaXIsIGxvY2Fsc3RhdGVkaXIsIG9sZGluY2x1ZGVkaXIpOiBOZXcgdmFyaWFibGVzLgorCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gYmluZGlyLCBkYXRhZGlyLCBpbmNsdWRlZGlyLAorCWluZm9kaXIsIGxpYmRpciwgbGliZXhlY2RpciwgbG9jYWxzdGF0ZWRpciwgbWFuZGlyLCBvbGRpbmNsdWRlZGlyLAorCXNiaW5kaXIsIHNoYXJlZHN0YXRlZGlyLCBhbmQgc3lzY29uZmRpci4KKworTW9uIFNlcCAyOSAwMDozODowOCAxOTk3IEFhcm9uIEphY2tzb24gPGphY2tzb25AbmVncmlsLm1zcmNlLmhvd2FyZC5lZHU+CisKKwkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IE5ldyB0YXJnZXQuCisKK1dlZCBTZXAgMjQgMTg6MDY6MjcgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDMwdik6ICBSZW1vdmUgdGNsLCB0aywgZXhwZWN0LCBnZGIsIGl0Y2wsIHRpeCwgZGIsCisgCXNuLCBhbmQgZ251c2VydiBmcm9tIG5vY29uZmlnZGlycy4KKworV2VkIFNlcCAyNCAxNToxODozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGx0bWFpbi5zaDogVHdlYWsgc2hlbGwgcGF0dGVybiB0byBhdm9pZCBidWcgaW4gTmV0QlNEIC9iaW4vc2guCisKK1RodSBTZXAgMTggMjM6NTg6MjcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisqIE1ha2VmaWxlLmluIChjcm9zcyk6IE5ldyB0YXJnZXQuCisKK1RodSBTZXAgMTggMjE6NDM6MjMgMTk5NyAgQWxleGFuZHJlIE9saXZhICA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+CisJCQkgIEplZmYgTGF3ICAgICAgICAgPGxhd0BjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IE5ldyB0YXJnZXRzLgorCShhbGwtYm9vdHN0cmFwKTogUmVtb3ZlIG91dGRhdGVkIGFuZCBjb25mdXNpbmcgdGFyZ2V0LgorCShib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBEb24ndCBwYXNzIEJPT1RfQ0ZMQUdTIGRvd24uCisKKworMTk5Ny0wOS0xNSAwMjozNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tdC1saW51eDogRGVmaW5lIENYWEZMQUdTIHRvIG1ha2Ugc3VyZSAtZnZ0YWJsZS10aHVua3MgaXMKKwl1c2VkLgorCSogY29uZmlndXJlLmluOiBOYW1lIExpbnV4IHRhcmdldCBmcmFnbWVudC4KKworCSogY29uZmlndXJlOiBSZXdyaXRlIHNvIHRoYXQgcHJvamVjdCBNYWtlZmlsZSBmcmFnbWVudCBpcyBpbnNlcnRlZAorCWZpcnN0IGFuZCBhcHBlYXJzIGxhc3QgaW4gdGhlIHJlc3VsdGluZyBNYWtlZmlsZS4KKworVHVlIFNlcCAxNiAwOTo1NTowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWl0Y2wpOiBJbnN0YWxsIHRjbCBmaXJzdC4KKworU3VuIFNlcCAxNCAyMDo1Mzo0MiAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvbWgtY3lnd2luMzI6IG9rIHRvIGJ1aWxkIHNwbGl0IHRleGluZm8gZmlsZXMKKworRnJpIFNlcCAxMiAxNjoxOToyMCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCQorCSogY29uZmlndXJlLmluOiByZW1vdmUgYmlzb24gZnJvbSBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyIGhvc3QKKworVGh1IFNlcCAxMSAxNjo0MDo0NiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogQWxzbyByZW1vdmUgbWgtZnJhZyBtdC1mcmFnLgorCisJKiBjb25maWd1cmUuaW4gKHNraXBkaXJzKTogQWRkIHRhcmdldC1saWJyeCBmb3IgTGludXguCisJKGFscGhhLSotbGludXgqKTogVXNlIGNvbmZpZy9taC1lbGZhbHBoYXBpYyBhbmQgY29uZmlnL210LWVsZmFscGhhcGljLgorCitXZWQgU2VwIDEwIDIxOjI5OjU0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IE5ldyB0YXJnZXQuCisKK1dlZCBTZXAgMTAgMTU6MTk6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBBY2NlcHQgJ2FtaWdhZG9zJyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eS4KKworTW9uIFNlcCAgOCAyMDo0NjoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzczogTWVyZ2Ugd2l0aCBGU0YuCisKK1N1biBTZXAgIDcgMTU6NTU6MjggMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IEFkZCAibWFya2V0aW5nLW5hbWVzIiBwYXRjaC4KKworRnJpIFNlcCAgNSAxNjoxMToyOCAxOTk3ICBKb2VsIFNoZXJyaWxsICAoam9lbEBPQVJjb3JwLmNvbSkKKworICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoKi0qLXJ0ZW1zKik6IERvIG5vdCBidWlsZCBsaWJnbG9zcyBmb3IgcnRlbXMuCisKK0ZyaSBTZXAgIDUgMTI6Mjc6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBIYW5kbGUgdjg1MC1lbGYuCisKK1dlZCBTZXAgIDMgMTI6MTU6MjQgMTk5NyAgQ2hyaXMgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgorCisJKiBsdGNvbmZpZzogU2V0IENPTkZJR19TSEVMTCBpbiBsaWJ0b29sLgorCSogbHRtYWluLnNoOiBVc2UgQ09ORklHX1NIRUxMIGluc3RlYWQgb2YgL2Jpbi9zaAorCitNb24gU2VwICAxIDE2OjQ1OjQ0IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0YXJnZXRfc3ViZGlyKTogU2V0IHRvIGxpYnJhcmllcyBpZiBlbmFibGVfbXVsdGlsaWIuCisKK1dlZCBBdWcgMjcgMTY6MTU6MTEgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6IFVwZGF0ZSBmcm9tIGdjYyBkaXJlY3RvcnkuCisKK1R1ZSBBdWcgMjYgMTY6NDY6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLXNpbSk6IERlcGVuZHMgb24gYWxsLXJlYWRsaW5lLgorCitXZWQgQXVnIDIwIDE5OjU3OjM3IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJJU09OLCBZQUNDKTogVXNlICQkcy4KKwkoYWxsLWJpc29uKTogRGVwZW5kIG9uIGFsbC10ZXhpbmZvLgorCitUdWUgQXVnIDE5IDAxOjQxOjMyIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJJU09OKTogQWRkIC1MIGZsYWcuCisJKFlBQ0MpOiBMaWtld2lzZS4KKworTW9uIEF1ZyAxOCAxMTozMDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuIAorCQorCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgorCitNb24gQXVnIDE4IDExOjMwOjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuIAorCQorCSogY29uZmlnLnN1YiAobWF5YmVfb3MpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KKworTW9uIEF1ZyAxOCAwOToyNDowNiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogQWRkIG1pcHN0eDM5LiAgRGVsZXRlIHIzOTAwLgorCitNb24gQXVnIDE4IDE3OjIwOjEwIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChhbGwtYXV0b2NvbmYpOiBEZXBlbmRzIG9uIGFsbC10ZXhpbmZvLgorCitGcmkgQXVnIDE1IDIzOjA5OjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWctbWwuaW4gKHtwb3dlcnBjLHJzNjAwMH0qLSotKik6IFVwZGF0ZSB0byBjdXJyZW50IEFJWCBhbmQKKwllYWJpIHRhcmdldHMuCisKK1RodSBBdWcgMTQgMTQ6NDI6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IEdldCBDRkxBR1MgYW5kIENYWEZMQUdTIGZyb20gTWFrZWZpbGUsIGlmIHBvc3NpYmxlLgorCisJKiBjb25maWd1cmU6IFdoZW4gaGFuZGxpbmcgYSBDYW5hZGlhbiBDcm9zcywgaGFuZGxlIFlBQ0MgYXMgd2VsbCBhcworCUJJU09OLiAgSnVzdCBzZXQgQklTT04gdG8gYmlzb24uICBXaGVuIHNldHRpbmcgWUFDQywgcHJlZmVyIGJpc29uLgorICAgICAgICAqIE1ha2VmaWxlLmluIChhbGwtYmlzb24pOiBEZXBlbmQgdXBvbiBhbGwtdGV4aW5mby4KKworVHVlIEF1ZyAxMiAyMDowOTo0OCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChCSVNPTik6IGJpc29uLCBub3QgYnlhY2Mgb3IgYmlzb24gLXkuCisJKFlBQ0MpOiBiaXNvbiAteSBvciBieWFjYyBvciB5YWNjLgorCSh2YXJpb3VzKTogQWRkICotYmlzb24gYXMgYXBwcm9wcmlhdGUuCisJKHRheik6IE5vIG5lZWQgdG8gbWVzcyB3aXRoIEJJU09OIGFueW1vcmUuCisKK1R1ZSBBdWcgMTIgMjI6MzM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IElmIE9TVFlQRSBtYXRjaGVzICp3aW4zMiosIHRyeSB0byBmaW5kIGEgZ29vZCB2YWx1ZSBmb3IKKwlDT05GSUdfU0hFTEwuCisKK1N1biBBdWcgMTAgMTQ6NDE6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodGF6KTogR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIEFNX0lOSVRfQVVUT01BS0UgaW4KKwljb25maWd1cmUuaW4gaWYgaXQgaXMgcHJlc2VudC4KKworU2F0IEF1ZyAgOSAwMDo1ODowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogQ2hhbmdlIGxkLm5ldyB0byBsZC1uZXcuCisKK0ZyaSBBdWcgIDggMTY6MzA6MTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIGBhcmMnIGNwdS4KKwkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCisJKiBjb25maWctbWwuaW46IExpa2V3aXNlLgorCitUaHUgQXVnICA3IDExOjAyOjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKCQoSU5TVEFMTF9YMTFfTU9EVUxFUykpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4KKworV2VkIEF1ZyAgNiAxNjoyNzoyOSAxOTk3ICBDaHJpcyBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogQ2hhbmdlZCBzZWQgZGVsaW1pdGVyIGZyb20gJzonIHRvICd8JyB3aGVuCisJYXR0ZW1wdGluZyB0byBzdWJzdGl0dXRlICR7Y29uZmlnX3NoZWxsfSBmb3IgU0hFTEwuIE9uCisJTlQgJHtjb25maWdfc2hlbGx9IG1heSBjb250YWluIGEgJzonIGluIGl0LgorCitXZWQgQXVnICA2IDEyOjI5OjA1IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IEZpeCBmb3Igbm9uLWJhc2ggc2hlbGxzLgorCitXZWQgQXVnICA2IDAwOjQyOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFTX0ZPUl9UQVJHRVQpOiBDaGFuZ2UgYXMubmV3IHRvIGFzLW5ldy4KKworVHVlIEF1ZyAgNSAxNDowODo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogQ2hhbmdlIG5tLm5ldyB0byBubS1uZXcuCisKKwkqIHlsd3JhcDogSWYgdGhlIHByb2dyYW0gaXMgYSByZWxhdGl2ZSBwYXRoLCBmb3JjZSBpdCB0byBiZQorCWFic29sdXRlLgorCitUdWUgQXVnICA1IDEyOjEyOjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlICh0b29sZGlyKTogU2V0IEJJU09OIHRvIGBiaXNvbiAteScgYW5kIG5vdCBqdXN0IGJpc29uLgorCitNb24gQXVnICA0IDIyOjU5OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBXaGVuIHdpbnN1cC9NYWtlZmlsZSBwcmVzZW50LAorIAljb3JyZWN0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGJ1aWxkIGRpcmVjdG9yeSAkKFRBUkdFVF9TVUJESVIpL3dpbnN1cAorIAlmb3IgbGlicmFyaWVzLgorCitNb24gQXVnICA0IDEyOjQwOjI0IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IEZpeCBoYW5kbGluZyBvZiBtYWNyb3Mgd2l0aCB2YWx1ZXMKKyAJc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKworVGh1IEp1bCAzMSAxOTo0OTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHlsd3JhcDogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHlsd3JhcC4KKworCSogbHRtYWluLnNoOiBIYW5kbGUgL2Jpbi9zaCBhdCBzdGFydCBvZiBpbnN0YWxsIHByb2dyYW0uCisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgbHRjb25maWcsIGx0bWFpbi5zaCwgYW5kIG1pc3NpbmcuCisKKwkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IE5ldyBmaWxlcywgZnJvbSBsaWJ0b29sIDEuMC4KKwkqIG1pc3Npbmc6IE5ldyBmaWxlLCBmcm9tIGF1dG9tYWtlIDEuMi4KKworVGh1IEp1bCAyNCAxMjo1Nzo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBUcmVhdCB0aXggbGlrZSB0aywgcHV0dGluZyBpdCBpbiBYMTFfTU9EVUxFUy4gIEFkZAorCWNoZWNrLXRrIHRvIENIRUNLX1gxMV9NT0RVTEVTLgorCitXZWQgSnVsIDIzIDE3OjAzOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCisKK1R1ZSBKdWwgMjIgMTk6MDg6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgorCitUdWUgSnVsIDIyIDE0OjUwOjQyIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KKworCSogY29uZmlndXJlOiBUcmVhdCBtc2Rvc2RqZ3BwIGxpa2UgZ28zMi4KKwkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuICBEb24ndCByZW1vdmUgZ3Byb2YgZm9yIGdvMzIuCisKKwkqIGNvbmZpZ3VyZTogQ2hhbmdlIE1ha2VmaWxlLnRlbTIgdG8gTWFrZWZpbGUudG0yLgorCitNb24gSnVsIDIxIDEwOjMxOjI2IDE5OTcgIFN0ZXBoZW4gUGV0ZXJzICA8c3BldGVyc0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEZvciBhbHBoYS1kZWMtb3NmKiwgZG9uJ3QgaWdub3JlIGdyZXAuCisKK1R1ZSBKdWwgMTUgMTQ6MzM6MDMgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBpbnN0YWxsLXNoIChjaG1vZGNtZCk6IFNldCB0byBudWxsIGlmIHRoZSBEU1QgZGlyZWN0b3J5IGFscmVhZHkKKwlleGlzdHMuICBTYW1lIGFzIE5vdiAxMXRoIGNoYW5nZS4KKworTW9uIEp1bCAxNCAxMTowMToxNSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlIChHREJfVEspOiBOZWVkcyBpdGNsIGFuZCB0aXguIAorCitNb24gSnVsIDE0IDAwOjMyOjEwIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmd1ZXNzOiBVcGRhdGUgZnJvbSBGU0YuCisKK0ZyaSBKdWwgMTEgMTE6NTc6MTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChHREJfVEspOiBEZXBlbmQgb24gaXRjbCBhbmQgdGl4LgorCitGcmkgSnVsICA0IDEzOjI1OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTExfUFJPR1JBTV9BUkdTKTogTmV3IHZhcmlhYmxlLgorCShJTlNUQUxMX1BST0dSQU0pOiBVc2UgJChJTlNUQUxMX1BST0dSQU1fQVJHUykuCisJKElOU1RBTExfU0NSSVBUKTogTmV3IHZhcmlhYmxlLgorCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gSU5TVEFMTF9TQ1JJUFQuCisJKiBjb25maWd1cmUuaW46IElmIGhvc3QgaXMgKi0qLWN5Z3dpbjMyKiwgc2V0IElOU1RBTExfUFJPR1JBTV9BUkdTCisJdG8gLXguCisJKiBpbnN0YWxsLXNoOiBBZGQgc3VwcG9ydCBmb3IgLXggb3B0aW9uLgorCitNb24gSnVuIDMwIDE1OjUxOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogVHJlYXQgdGl4IGxpa2UgaXRjbC4KKworVGh1IEp1biAyNiAxMzo1OToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChXSU5EUkVTKTogTmV3IHZhcmlhYmxlLgorCShXSU5EUkVTX0ZPUl9UQVJHRVQpOiBOZXcgdmFyaWFibGUuCisJKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEFkZCBXSU5EUkVTX0ZPUl9UQVJHRVQuCisJKEVYVFJBX0hPU1RfRkxBR1MpOiBBZGQgV0lORFJFUy4KKwkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogQWRkIFdJTkRSRVMuCisJKEVYVFJBX0dDQ19GTEFHUyk6IEFkZCBXSU5EUkVTLgorCSgkKERPX1gpKTogUGFzcyBkb3duIFdJTkRSRVMuCisJKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IFNldCBXSU5EUkVTIHdoZW4gY29uZmlndXJpbmcuCisJKiBjb25maWd1cmU6IFRyZWF0IFdJTkRSRVMgbGlrZSBETExUT09MLCBhbmQgV0lORFJFU19GT1JfVEFSR0VUIGxpa2UKKwlETExUT09MX0ZPUl9UQVJHRVQuCisKK1dlZCBKdW4gMjUgMTU6MDE6MjYgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSBzaW0gYmVmb3JlIGdkYiBmb3Igd2luMzIteC1wcGMKKworV2VkIEp1biAyNSAxMjoxODo1NCAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwlNb3ZlIGdwZXJmIGludG8gdGhlIHRvcGxldmVsLCBmcm9tIGxpYmcrKy4KKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3Rvb2xzKTogQWRkIHRhcmdldC1ncGVyZi4KKwkobmF0aXZlX29ubHkpOiBBZGQgdGFyZ2V0LWdwZXJmLgorCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtZ3BlcmYpOiBOZXcgdGFyZ2V0LCBkZXBlbmQgb24KKwlhbGwtdGFyZ2V0LWxpYmcrKy4KKwkoY29uZmlndXJlLXRhcmdldC1ncGVyZik6IEVtcHR5IHJ1bGUuCisJKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBhbGwtdGFyZ2V0LWdwZXJmLgorCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBBZGQgY29uZmlndXJlLXRhcmdldC1ncGVyZi4KKwkoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBBZGQgY2hlY2stdGFyZ2V0LWdwZXJmLgorCShJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGluc3RhbGwtdGFyZ2V0LWdwZXJmLgorCShDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IEFkZCBjbGVhbi10YXJnZXQtZ3BlcmYuCisKK01vbiBKdW4gMjMgMTA6NTE6NTMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorIAorCSogY29uZmlnLnN1YiAobW4xMDIwMCk6IFJlY29nbml6ZSBuZXcgYmFzaWMgbWFjaGluZS4KKworVGh1IEp1biAxOSAxNDoxNjo0MiAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IEVOQUJMRV9NVUxUSUxJQiwgc28gd2UnbGwgYmUgcGFzc2luZworCS0tZW5hYmxlLW11bHRpbGliIGRvd24gdG8gc3ViZGlyczsgc2V0dGluZyBUQVJHRVRfU1VCRElSIHdhcyBlbm91Z2guCisKK1R1ZSBKdW4gMTcgMTU6MzE6MjAgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IElmIHdlJ3JlIGJ1aWxkaW5nIG1pcHMtc2dpLWlyaXg2KiBuYXRpdmUsIHR1cm4gb24KKwlFTkFCTEVfTVVMVElMSUIgYW5kIHNldCBUQVJHRVRfU1VCRElSLgorCitUdWUgSnVuIDE3IDEyOjIwOjU5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC1zbik6IERlcGVuZCBvbiBhbGwtZ3JlcC4KKworTW9uIEp1biAxNiAxMToxMToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIG1oLXBwY3BpYyBhbmQgbXQtcHBjcGljIGZvciBwb3dlcnBjKi0qIHRhcmdldHMuCisKKwkqIGNvbmZpZ3VyZTogU2V0IENGTEFHUyBhbmQgQ1hYRkxBR1MsIGFuZCBzdWJzdGl0dXRlIHRoZW0gaW50bworCU1ha2VmaWxlLiAgRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgorCSogTWFrZWZpbGUuaW46IEFkZCBjb21tZW50IGZvciBDRkxBR1MgYW5kIENYWEZMQUdTLgorCisJKiBNYWtlZmlsZS5pbiAoRElTVEJJU09ORklMRVMpOiBSZW1vdmUuCisJKHRheik6IERvbid0IGZ1dHogd2l0aCBESVNUQklTT05GSUxFUy4gIENoYW5nZSBCSVNPTiB0byB1c2UKKwkkKERFRkFVTFRfWUFDQykuCisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgaXRsLCBkYiwgc24sIGV0Yy4sIHdoZW4gYnVpbGRpbmcgZm9yIG5hdGl2ZQorIAljeWd3aW4zMi4KKworCSogTWFrZWZpbGUuaW4gKExEKTogTmV3IHZhcmlhYmxlLgorCShFWFRSQV9IT1NUX0ZMQUdTKTogUGFzcyBkb3duIExELgorCSgkKERPX1gpKTogTGlrZXdpc2UuCisKK01vbiBKdW4gMTYgMTE6MTA6MzUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8UGhpbGlwLkJsdW5kZWxsQHBvYm94LmNvbT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgJChTSEVMTCkgd2hlbiBleGVjdXRpbmcgaW5zdGFsbC1zaC4KKworRnJpIEp1biAxMyAxMDoyMjo1NiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IFN0cmlwIG91dCBhbnkgc3VwcGxpZWQgLS1idWlsZCBhcmd1bWVudAorIAliZWZvcmUgYWRkaW5nIG91ciBvd24uIEFsd2F5cyBhZGQgLS1idWlsZC4KKworVGh1IEp1biAxMiAyMToxMjoyOCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IFBhc3MgLS1idWlsZCBpZiB3ZSdyZSBkb2luZworCWEgY3Jvc3MtY29tcGlsZS4KKworRnJpIEp1biAgNiAyMTozODo0MCAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFVzZSAnfCcgaW5zdGVhZCBvZiAiOiIgYXMgdGhlIHNlcGVyYXRvciBpbgorCXNlZC4gT3RoZXJ3aXNlIHNlZCBjaG9rZXMgb24gTlQgcGF0aCBuYW1lcyB3aXRoIGRyaXZlCisJZGVzaWduYXRvcnMuIEFsc28gbG9vayBmb3IgIj86KiIgYXMgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBpbiBhbgorCWFic29sdXRlIHBhdGhuYW1lLgorCitNb24gSnVuICAyIDEzOjA1OjIwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBTdXBwb3J0IGZvciByMzkwMC4KKworV2VkIE1heSAyMSAxNzozMzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIGluc3RhbGwtc2gsIG5vdCBpbnN0YWxsLnNoLgorCitXZWQgTWF5IDE0IDE2OjA2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHRheik6IEltcHJvdmUgY2hlY2sgZm9yIEJJU09OIHNvIGl0IGRvZXNuJ3QgdHJ5IHRvCisJYXBwbHkgaXQgdHdpY2UuCisKK0ZyaSBNYXkgIDkgMTc6MjI6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9NT0RVTEVTKTogUHV0IGluc3RhbGwtb3Bjb2RlcyBiZWZvcmUKKwlpbnN0YWxsLWJpbnV0aWxzLgorCitUaHUgTWF5ICA4IDE3OjI5OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEFkZCBhdXRvbWFrZSB0YXJnZXRzLgorCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkIGF1dG9tYWtlLgorCitUdWUgTWF5ICA2IDE1OjQ5OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBEZWZhdWx0IENYWCB0byBjKyssIG5vdCBnY2MuCisJKiBNYWtlZmlsZS5pbiAoQ1hYKTogU2V0IHRvIGMrKywgbm90IGdjYy4KKwkoQ1hYX0ZPUl9UQVJHRVQpOiBXaGVuIGNyb3NzLCB0cmFuc2Zvcm0gYysrLCBub3QgZ2NjLgorCitUaHUgTWF5ICAxIDEwOjExOjQzIDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGluc3RhbGwtc2g6IHRyeSBhcHBlbmRpbmcgYSAuZXhlIGlmIHNvdXJjZSBmaWxlIGRvZXNuJ3QKKwlleGlzdAorCitXZWQgQXByIDMwIDEyOjA1OjM2IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBUdXJuIG9uIG11bHRpbGliIGJ5IGRlZmF1bHQuCisJKGNyb3NzX29ubHkpOiBSZW1vdmUgdGFyZ2V0LWxpYmliZXJ0eS4KKworCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBEb24ndCBkZXBlbmQgb24gbGliaWJlcnR5LgorCitNb24gQXByIDI4IDE4OjM5OjQ1IDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzczogaW1wcm92ZSBhbGdvcml0aG0gZm9yIHJlY29nbml6aW5nIEdudSBIdXJkIHg4Ni4KKworVGh1IEFwciAyNCAxOTozMDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgbXB3LWluc3RhbGwuCisJKERJU1RCSVNPTkZJTEVTKTogQWRkIGxkL01ha2VmaWxlLmluCisKK1R1ZSBBcHIgMjIgMTc6MTc6MjggMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBpZiB0YXJnZXQgaXMgY3lnd2luMzIgYnV0IGhvc3QgaXNuJ3QgY3lnd2luMzIsCisJZG9uJ3QgY29uZmlndXJlIGdkYiB0Y2wgdGsgZXhwZWN0LCBub3QganVzdCBnZGIuCisKK01vbiBBcHIgMjEgMTM6MzM6MzkgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIGdudXNlcnYgZXZlcnl3aGVyZSBzbiBhcHBlYXJzLgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtZ251c2Vydi4KKwkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWdudXNlcnYuCisJKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtZ251c2Vydi4KKwkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWdudXNlcnYuCisJKGFsbC1nbnVzZXJ2KTogTmV3IHRhcmdldC4KKworVGh1IEFwciAxNyAxMzo1NzowNiAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+CisKKwkqIGNvbmZpZy5ndWVzczogRml4ZXMgZm9yIE1JUFMgT3BlbkJTRCBzeXN0ZW1zLgorCitUdWUgQXByIDE1IDEyOjIxOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0pOiBSZW1vdmUuCisJKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBJTlNUQUxMX1hGT1JNLgorCisJKiBta2luc3RhbGxkaXJzOiBOZXcgZmlsZSwgY29waWVkIGZyb20gYXV0b21ha2UuCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbGRpcnMpOiBSZW5hbWUgZnJvbSBpbnN0YWxsLWRpcnMuICBVc2UKKwlta2luc3RhbGxkaXJzLiAgQ2hhbmdlIGFsbCB1c2Vycy4KKwkoREVWT19TVVBQT1JUKTogQWRkIG1raW5zdGFsbGRpcnMuCisKK01vbiBBcHIgMTQgMTE6MjE6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpbnN0YWxsLXNoOiBSZW5hbWUgZnJvbSBpbnN0YWxsLnNoLgorCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgorCShERVZPX1NVUFBPUlQpOiBMaWtld2lzZS4KKworCSogY29uZmlndXJlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdpdGggJHttb3ZlaWZjaGFuZ2V9LiAgRnJvbSBUaG9tYXMKKwlHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT4uCisKK0ZyaSBBcHIgMTEgMTY6Mzc6MTAgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgT3BlbkJTRCBzeXN0ZW1zIGNvcnJlY3RseS4KKworRnJpIEFwciAxMSAxNzowNzowNCAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBSRUFETUUsIE1ha2VmaWxlLmluIChFVENfU1VQUE9SVCk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCisJY2ZnLXBhcGVyKiwgY29uZmlndXJlLnt0ZXhpLG1hbixpbmZvKn0uXworCitTdW4gQXByICA2IDE4OjQ3OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLm5vcm1hbCk6IEVuc3VyZSB0aGF0IGdjYyBpcyBidWlsdCBhZnRlciBhbGwKKwl0aGUgeDExIC0gaWUgZ2RiIC0gdGFyZ2V0cy4KKworVHVlIEFwciAgMSAxNjoyODo1MCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogbWFrZWZpbGUudm1zOiBEb24ndCBydW4gY29uZi1hLWdhcy4KKworTW9uIE1hciAzMSAxNjoyNjo1NSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaHBwYTEuMS0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgorCitTdW4gTWFyIDMwIDEyOjM4OjI3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBub2NvbmZpZ2RpcnMgY2FzZSBzaW5jZSBnZGIgYWxzbworCWNvbmZpZ3VyZXMgYW5kIGJ1aWxkcyBmb3IgdGljODAtY29mZi4KKworRnJpIE1hciAyOCAxODoyODo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogU2V0IGNhY2hlX2ZpbGUgdG8gY29uZmlnLmNhY2hlLgorCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCisKK1dlZCBNYXIgMjYgMTg6NDk6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCisKK1dlZCBNYXIgMjYgMTA6Mzg6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogUmVtb3ZlIEcrKyBsaWJyYXJpZXMgYW5kIGxpYmdsb3NzIGZyb20KKwlub2NvbmZpZ2RpcnMuCisKK01vbiBNYXIgMjQgMTU6MDI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kaXJzKTogRG9uJ3QgY3Jhc2ggaWYgcHJlZml4LCBhbmQgaGVuY2UKKwlNQUtFRElSUywgaXMgZW1wdHkuCisKK01vbiBNYXIgMjQgMTI6NDA6NTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogVHdlYWsgbW4xMDMwMCBlbnRyeS4KKworRnJpIE1hciAyMSAxNTozNToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogUHV0IHNpbSBiZWZvcmUgZ2RiLCBzbyBnZGIncworCWNvbmZpZ3VyZS50Z3QgY2FuIGRldGVybWluZSBpZiB0aGUgc2ltdWxhdG9yIHdhcyBjb25maWd1cmVkLgorCitTdW4gTWFyIDE2IDE2OjA3OjA4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBNb3ZlIEJlT1MgJG9zIGNhc2UgdG8gYmUgd2l0aCBvdGhlciBDeWdudXMKKwlsb2NhbCBjYXNlcy4KKworU3VuIE1hciAxNiAwMTozNDo1NSAxOTk3ICBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBSZW1vdmUgbWlzcGxhY2VkIGNvbW1lbnQgdGhhdCBicm9rZSBMaW51eC4KKworU2F0IE1hciAxNSAyMjo1MDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogQWRkIEJlT1Mgc3VwcG9ydC4KKworTW9uIE1hciAxMCAxMzozMDoxMSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDSEVDS19YMTFfTU9EVUxFUyk6IERvbid0IHJ1biBjaGVjay10ay4KKworV2VkIE1hciAgNSAxMjowOToyOSAxOTk3ICBNYXJ0aW4gIDxodW50QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUmVtb3ZlIHRjbCBhbmQgdGsgZnJvbQorCW5vY29uZmlnZGlycyBmb3IgY3lnd2luMzIgYnVpbGRzLgorCitGcmkgRmViIDI4IDE4OjIwOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFJlbW92ZSBsZCBmcm9tIG5vY29uZmlnZGlycy4KKworVGh1IEZlYiAyNyAxNDo1NzoyNiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMsIEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IFJlbW92ZQorCW1ha2UtYWxsLmNvbSwgdXNlIG1ha2VmaWxlLnZtcyBpbnN0ZWFkLgorCitUdWUgRmViIDI1IDE4OjQ2OjE0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogQWNjZXB0IC1sbmV3cyouCisKK1R1ZSBGZWIgMjUgMTM6MTk6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgdGFyZ2V0LW5ld2xpYiwKKyAJdGFyZ2V0LWV4YW1wbGVzIGFuZCB0YXJnZXQtbGliaWJlcnR5IGZvciBkMzB2LgorCitGcmkgRmViIDIxIDE3OjU2OjI1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEVuYWJsZSBsZCBmb3IgZDMwdi4KKworRnJpIEZlYiAyMSAyMDo1ODo1MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBCdWlsZCBjb21waWxlci4KKworU3VuIEZlYiAxNiAxNTo0MTowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNyaXR0ZXJzLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qKTogUmVtb3ZlIHNpbSBkaXJlY3RvcnkgZnJvbSBsaXN0IG9mCisgCXVuc3VwcG9ydGVkIGQzMHYgZGlyZWN0b3JpZXMKKworVHVlIEZlYiAxOCAxNzozMjo0MiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgZDMwdiB0YXJnZXQgY3B1LiAKKwkKK1RodSBGZWIgMTMgMjI6MDQ6NDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCisJKiBtYWtlLWFsbC5jb206IFJlbW92ZS4KKworV2VkIEZlYiAxMiAxMjo1NDoxOCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBBZGQgTElCR0NDMl9ERUJVR19DRkxBR1MuCisKK1NhdCBGZWIgIDggMjA6MzY6NDkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhbGwtaXRjbCk6IFRoZSBydWxlIGlzIGFsbC1pdGNsLCBub3QgYWxsLXRjbC4KKworVHVlIEZlYiAgNCAxMTozOToyOSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1kYi4KKwkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVjIGNoZWNrLWRiLgorCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWRiLgorCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4tZGIuCisKK01vbiBGZWIgIDMgMTM6Mjk6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgorCitUdWUgSmFuIDI4IDA5OjIwOjM3IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWl0Y2wuCisJKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1pdGNsLgorCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWl0Y2wuCisJKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1pdGNsLgorCitUaHUgSmFuIDIzIDAxOjQ0OjI3IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYnVpbGQgZ2RiIGZvciBtbjEwMjAwCisKK0ZyaSBKYW4gMTcgMTU6MzI6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtd2luc3VwKTogRGVwZW5kIG9uIGFsbC10YXJnZXQtbGliaW8uCisKK01vbiBKYW4gMTMgMjI6NDY6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFR1cm4gb2ZmIG1vc3QgdGFyZ2V0cyByaWdodCBub3cuCisKK0ZyaSBKYW4gIDMgMTY6MDQ6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoTUFLRUlORk8pOiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgTWFrZWZpbGUsCisJcmF0aGVyIHRoYW4gdGhlIG1ha2VpbmZvIHByb2dyYW0uCisJKGRvLWluZm8pOiBEZXBlbmQgdXBvbiBhbGwtdGV4aW5mby4KKworVHVlIERlYyAzMSAxNjowMDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHVzZXMgb2YgY29uZmlnL21oLWxpbnV4LgorCisJKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgorCitGcmkgRGVjIDI3IDIzOjA0OjMzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViIChjYXNlICRiYXNpY19tYWNoaW5lKTogQWRkIHRpYzgwIGVudHJpZXMuCisKK0ZyaSBEZWMgMjcgMTI6MDc6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggbGF0ZXN0IEZTRiBzb3VyY2VzLgorCitXZWQgRGVjIDE4IDIyOjQ2OjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWJ1aWxkLmluOiBCdWlsZCBsZCBiZWZvcmUgZ2NjLCB1c2UgTmV3Rm9sZGVyUmVjdXJzaXZlLgorCSogbXB3LWNvbmZpZy5pbjogVGVzdCBmb3IgTmV3Rm9sZGVyUmVjdXJzaXZlLgorCSogbXB3LWluc3RhbGw6IFVzZSBzeW1ib2xpYyBuYW1lIGZvciBzdGFydHVwIGZpbGVuYW1lLgorCSogbXB3LVJFQURNRTogQWRkIHZhcmlvdXMgYWRkaXRpb25hbCBkZXRhaWxzLgorCitXZWQgRGVjIDE4IDEzOjExOjQ2IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogUmVtb3ZlIGJpbnV0aWxzIGZyb20gbm9jb25maWdkaXJzLgorCitXZWQgRGVjIDE4IDEwOjI5OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBEbyBidWlsZCBnY2MgYW5kIHRoZSB0YXJnZXQgbGlicmFyaWVzIGZvcgorCXRoZSBtbjEwMjAwLgorCitXZWQgRGVjICA0IDE2OjUzOjA1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYXZvaWQgYnVpbGRpbmcgZ2RiIGZvciBtbjEwMzAwIGFueSBtb3JlCisJKiBNYWtlZmlsZS5pbjogZG91YmxlLXF1b3RlIEdDQ19GT1JfVEFSR0VUIGxpbmUgaW4gRVhUUkFfR0NDX0ZMQUdTCisJaW5zdGVhZCBvZiBzaW5nbGUtcXVvdGluZyBpdC4KKworVHVlIERlYyAgMyAyMzoyNjo1MCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIC0td2l0aC1zdGFicyBvbiBJUklYIDYuCisKK1R1ZSBEZWMgIDMgMDk6MDU6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtMzJyKTogQnVpbGQgZ2RiLCBsaWJnKysgbm93LgorCitTdW4gRGVjICAxIDAwOjE4OjU5IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogIFJlbW92ZSBnZGIgYW5kIHJlbGF0ZWQKKwlkaXJlY3RvcmllcyBmcm9tIG5vY29uZmlnZGlycy4KKworVHVlIE5vdiAyNiAxMTo0NTozMyAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IGFkZGVkIG1pcHMxNiBjb25maWd1cmF0aW9uCisKK1NhdCBOb3YgMjMgMTk6MjY6MjIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBIYW5kbGUgZDEwdi11bmtub3duLgorCitTYXQgTm92IDIzIDEwOjIzOjAxIDE5OTYgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBIYW5kbGUgdjg1MC11bmtub3duLgorCitUaHUgTm92IDIxIDE2OjE5OjQ0IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBhZGQgZmluZHV0aWxzCisJKiBjb25maWd1cmUuaW46IGFkZCBmaW5kdXRpbHMgdG8gbGlzdCBvZiBob3N0X3Rvb2xzCisKK1dlZCBOb3YgMjAgMTA6MDk6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBIYW5kbGUgbW4xMDIwMCBhbmQgbW4xMDMwMC4KKworVHVlIE5vdiAxOSAxNjozNToxNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qKTogRG8gbm90IGJ1aWxkIGxpYnJ4LgorCitNb24gTm92IDE4IDEzOjI4OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChtbjEwMzAwKTogQnVpbGQgZXZlcnl0aGluZyBleGNlcHQgZ2RiICYgbGliZ2xvc3MuCisKK1dlZCBOb3YgMTMgMTQ6NTk6NDYgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzczogIFBhdGNoIGZvciBEYW5zayBEYXRhIEVsZWt0cm9uaWsgc2VydmVycywKKwlmcm9tIE5pZWxzIFNrb3UgT2xzZW4gPG5zb0BkZGUuZGs+LgorCisJRm9yIG5jciwgdXNlIC9iaW4vdW5hbWUgcmF0aGVyIHRoYW4gdW5hbWUsIHNpbmNlIEdOVSB1bmFtZSBkb2VzIG5vdAorCXN1cHBvcnQgLXAuICBTdWdnZXN0ZWQgYnkgTWFyayBNaXRjaGVsbCA8bW1pdGNoZWxsQHVzYS5uZXQ+LgorCisJUGF0Y2ggZm9yIE1JUFMgUjQwMDAgcnVubmluZyBTeXN0ZW0gViwKKwlmcm9tIEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPi4KKworCUZpeCB0aGlua28gZm9yIG5leHRzdGVwLgorCisJUGF0Y2ggZm9yIE9TRjEgaW4gaT84NiwgZnJvbSBEYW4gTXVycGh5IDxkbG1Ab3NmLm9yZz4gdmlhIEhhcmxhbiBTdGVubi4KKworCVNhdCBKdW4gMjQgMTg6NTg6MTcgMTk5NSAgTW9ydGVuIFdlbGluZGVyICA8dGVycmErQGNzLmNtdS5lZHU+CisJKiBjb25maWcuZ3Vlc3M6IEd1ZXNzIG1pcHMtZGVjLW1hY2hfYnNkNC4zLgorCisJVGh1IE9jdCAxMCAwNDowNzowNCAxOTk2ICBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4KKwkqIGNvbmZpZy5ndWVzcyAoaT84Ni1uY3Itc3lzdiopOiAgRW1pdCBqdXN0IGVub3VnaCBvZiB0aGUgbWlub3IKKwlyZWxlYXNlIG51bWJlcnMuCisJKiBjb25maWcuZ3Vlc3MgKG1pcHMtbWlwcy1yaXNjb3MqKTogIEVtaXQganVzdCBlbm91Z2ggb2YgdGhlCisJcmVsZWFzZSBudW1iZXIuCisKKwlUdWUgT2N0ICA4IDEwOjM3OjIyIDE5OTYgIEZyYW5rIFZhbmNlIDxmdmFuY2VAd2FpaS5jb20+CisJKiBjb25maWcuZ3Vlc3MgKHNwYXJjLWF1c3BleC1zdW5vcyopOiAgQWRkZWQuCisJKGYzMDAtZnVqaXRzdS0qKTogQWRkZWQuCisKKwlXZWQgU2VwIDI1IDIyOjAwOjM1IDE5OTYgIEplZmYgV29vbHNleSA8d29vbHNleUBqbHcuY29tPgorCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIGEgVGFkcG9sZSBhcyBhIHNwYXJjLgorCitXZWQgTm92IDEzIDAwOjUzOjA5IDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBjaHVyY2h5LmdudS5haS5taXQuZWR1PgorCisJKiBjb25maWcuZ3Vlc3M6IERvbid0IGFzc3VtZSB0aGF0IE5leHRTdGVwIHZlcnNpb24gaXMgZWl0aGVyIDIgb3IKKwkzLiAgTmV4dFN0ZXAgNCAoYWthIE9wZW5TdGVwIDQpIGhhcyBjb21lIG91dCBub3cuCisKK01vbiBOb3YgMTEgMjM6NTI6MDMgMTk5NiAgRGF2aWQgSi4gTWFjS2VuemllICA8ZGptQGNodXJjaHkuZ251LmFpLm1pdC5lZHU+CisKKwkqIGNvbmZpZy5ndWVzczogU3VwcG9ydCBDcmF5IFQ5MCB0aGF0IHJlcG9ydHMgaXRzZWxmIGFzICJDUkFZIFRTIi4KKwlGcm9tIFJpayBGYWl0aCA8ZmFpdGhAY3MudW5jLmVkdT4uCisKK0ZyaSBOb3YgIDggMTE6MzQ6NTggMTk5NiAgRGF2aWQgSi4gTWFjS2VuemllICA8ZGptQGdlZWNoLmdudS5haS5taXQuZWR1PgorCisJKiBjb25maWcuc3ViOiBDb250cmlidXRpb25zIGZyb20gYnVnLWdudS11dGlscyB0bzoKKwlTdXBwb3J0IHBsYWluICJocHBhIiAobm8gdmVyc2lvbiBnaXZlbikgYXJjaGl0ZWN0dXJlLCByZXBvcnRlZCBieQorCU9wZW5TdGVwLgorCU9wZW5CU0QgbGlrZSBOZXRCU0QuCisJTHlueE9zIGlzIG5vdCBhIGhhcmR3YXJlIHN1cHBsaWVyLgorCisJKiBjb25maWcuZ3Vlc3M6IENvbnRyaWJ1dGlvbnMgZnJvbSBidWctZ251LXV0aWxzIHRvIGFkZCBzdXBwb3J0IGZvcjoKKyAJT3BlbkJTRCBsaWtlIE5ldEJTRC4KKwlTdHJhdHVzIHN5c3RlbXMuCisJTW9yZSBQeXJhbWlkIHN5c3RlbXMuCisJaVtuPjRdODYgSW50ZWwgY2hpcHMuCisJTTY4MFtuPjRdMCBNb3Rvcm9sYSBjaGlwcy4KKwlVc2UgdW5rbm93biBpbnN0ZWFkIG9mIGx5bnggZm9yIGhhcmR3YXJlIG1hbnVmYWN0dXJlci4KKworTW9uIE5vdiAxMSAxMDowOTowOCAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIGluc3RhbGwuc2ggKGNobW9kY21kKTogU2V0IHRvIG51bGwgaWYgdGhlIERTVCBkaXJlY3RvcnkgYWxyZWFkeQorCWV4aXN0cy4KKworTW9uIE5vdiAxMSAxMDo0Mzo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyote2VhYmksZWxmLGxpbnV4LHJ0ZW0sc3lzdixzb2xhcmlzfSopOiBEbworCW5vdCB1c2UgbXQtcHBjIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudCBhbnkgbW9yZS4KKworU3VuIE5vdiAgMyAxOToxNzowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKCotKi13aW5kb3dzKTogIEV4Y2x1ZGUgZXZlcnl0aGluZyBidXQgdGhvc2UgZGlycworCW5lZWRlZCB0byBidWlsZCB3aW5kb3dzLgorCitUdWUgT2N0IDI5IDE2OjQxOjMxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IERlcGVuZCBvbiBhbGwtdGFyZ2V0LWxpYnJ4LgorCitNb24gT2N0IDI4IDE3OjMyOjQ2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEV4Y2x1ZGUgbW1hbGxvYyBmcm9tIGkzODYtd2luZG93cy4KKwkqIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHJ1bGVzIGZvciBidWlsZGluZyBNU1ZDIG1ha2VmaWxlcy4KKworVGh1IE9jdCAyNCAwOToyMjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBVbmRvIG15IHByZXZpb3VzIGNoYW5nZS4KKworVGh1IE9jdCAyNCAxMjoxMjowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBQYXNzIGRvd24gR0NDX0ZPUl9UQVJHRVQKKwl1bmNvbmRpdGlvbmFsbHkuCisJKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgKHJldmVydCB0aGlzIHBhcnQgb2YgT2N0b2JlciAxOCBjaGFuZ2UpLgorCitUaHUgT2N0IDI0IDA5OjAyOjA3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogIEFkZCAkKEhPU1RfRkxBR1MpIHRvIGFsbG93IHRoZQorCWhvc3QgdG8gYWRkIGl0J3Mgb3duIGZsYWdzLgorCSogY29uZmlnL21oLXdpbmRvd3MgKEhPU1RfRkxBR1MpOiAgU2V0IHNyY3Jvb3QsIHdoaWNoIGlzIG5lZWRlZAorCWZvciBNU1ZDIGJ1aWxkIHByb2NlZHVyZS4KKworVHVlIE9jdCAyMiAxNToyMDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogSGFuZGxlIEdDQ19GT1JfVEFSR0VUIGxpa2UgQ0NfRk9SX1RBUkdFVC4KKworRnJpIE9jdCAxOCAxMzozNzoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogQ2hlY2sgZm9yIHhnY2MsIG5vdCBNYWtlZmlsZS4KKwkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KKwkoR0NDX0ZPUl9UQVJHRVQpOiBEZWZpbmUuCisJKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBHQ0NfRk9SX1RBUkdFVC4KKwkoRVhUUkFfR0NDX0ZMQUdTKTogRGVmaW5lIEdDQ19GT1JfVEFSR0VUIGJhc2VkIG9uIHdoZXRoZXIKKwlDQ19GT1JfVEFSR0VUIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKwkoTUFLRU9WRVJSSURFUyk6IERvbid0IGRlZmluZS4KKworVGh1IE9jdCAxNyAxMDoyNzo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG0zMnIpOiBGaXggc3BlbGxpbmcgb2YgbGliZysrIGxpYnMuCisKK1RodSBPY3QgMTAgMTA6Mzc6MTcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViICgtYXBwbGUqKTogUmVtb3ZlLCBub3cgcmVkdW5kYW50LgorCitUaHUgT2N0IDEwIDEyOjMwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgQ1BVLVZFTkRPUi1saW51eC1nbnUuCisKKwkqIGNvbmZpZ3VyZTogUmV3b3JrIHllc3RlcmRheSdzIHNlZCBzY3JpcHQgcGF0Y2guCisKKwkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgorCitXZWQgT2N0ICA5IDE3OjI0OjU5IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRi4KKworCTE5OTYtMDktMTIgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAZXRoYW5vbC5nbnUuYWkubWl0LmVkdT4KKyAgICAgICAgKiBjb25maWcuZ3Vlc3M6IFVzZSBwYyBpbnN0ZWFkIG9mIHVua25vd24sIGZvciBwYyBjbG9uZSBzeXN0ZW1zLgorICAgICAgICBDaGFuZ2UgbGludXggdG8gbGludXgtZ251LgorCisJTW9uIEp1bCAxNSAyMzo1MToxMSAxOTk2ICBLYXJsIEhldWVyICA8a3d6aEBnbnUuYWkubWl0LmVkdT4KKyAgICAgICAgKiBjb25maWcuZ3Vlc3M6IEF2b2lkIG5vbi1wb3J0YWJsZSB0ciBzeW50YXguCisKK1dlZCBPY3QgIDkgMDY6MDY6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB0ZXN0LWJ1aWxkLm1rIChIT0xFUyk6IEFkZCAieGFyZ3MiIGZvciBnZGIuCisKKwkqIGNvbmZpZ3VyZTogQXZvaWQgaHB1eDEwLjIwIHNlZCBidWcuCisKK1R1ZSBPY3QgIDggMDg6MzI6NDggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHN1cHBvcnQgZm9yIHdpbmRvd3MgaG9zdAorCSh0aGF0IGlzIGEgYnVpbGQgZG9uZSB1bmRlciB0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KKworVHVlIE9jdCAgOCAxMDozOTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGFsbCB1c2VzIG9mIHNyY3Jvb3Qgd2l0aCBzLCB0byBzaHJpbmsKKwljb21tYW5kIGxpbmUgbGVuZ3Rocy4KKworCVBhdGNoZXMgZnJvbSBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+OgorCSogY29uZmlndXJlLmluOiBJZiBjb25maWd1cmluZyBmb3IgbmV3bGliLCBwYXNzIC0td2l0aC1uZXdsaWIgdG8KKwlzdWJkaXJlY3Rvcmllcy4KKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogSWYgd2luc3VwL01ha2VmaWxlIGV4aXN0cywgcGFzcyBhCisJLUJuZXdsaWIvIGFuZCAtTHdpbnN1cCB0byBnY2MuCisJKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCisKK01vbiBPY3QgIDcgMTA6NTk6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRVRDX1NVUFBPUlQpOiBBZGQgY29uZmlndXJlLgorCitGcmkgT2N0ICA0IDEyOjIyOjU4IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtZGd1eDM4NiBmb3IgaVszNDVdODYtZGctZGd1eCAKKwlob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKworVGh1IE9jdCAgMyAwOToyODoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gc2VwYXJhdGUKKwltbjEwMjAwIGFuZCBtbjEwMzAwIGNvbmZpZ3VyYXRpb25zLgorCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCisKK1dlZCBPY3QgIDIgMjI6Mjc6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCBsb3RzIG9mIHN0dWZmIHRvIG5vY29uZmlnZGlycyBmb3IKKwl0aGUgbW4xMHgwMCB0YXJnZXRzLgorCisJKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IEFkZCBtbjEweDAwIHN1cHBvcnQuCisKK1dlZCBPY3QgIDIgMTU6NTI6MzYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2UtYWxsLmNvbTogQ2FsbCBjb25mLWEtZ2FzLCBub3QgY29uZmlnLWEtZ2FzLgorCitUdWUgT2N0ICAxIDAxOjI4OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBsaWJnbG9zcyBmb3IgYXJtLWNvZmYKKyAJdGFyZ2V0cy4KKworTW9uIFNlcCAzMCAxNDoyNDowMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1SRUFETUU6IEFkZCBtdWNoIG1vcmUgZGV0YWlsIGZvciBuYXRpdmUgUG93ZXJNYWMuCisJKiBtcHctaW5zdGFsbDogTmV3IGZpbGUuCisJKiBtcHctY29uZmlndXJlOiBBZGQgLS1ub3JlY3Vyc2lvbiBhbmQgLS1oZWxwIG9wdGlvbnMuCisJKiBtcHctY29uZmlnLmluOiBUcmFuc2xhdGUgcmVhZG1lIGFuZCBpbnN0YWxsIGZpbGVzIHdoZW4KKwljb3B5aW5nIHRvIG9iamRpci4KKwkqIG1wdy1idWlsZC5pbjogRG9uJ3QgYWx3YXlzIGRlcGVuZCBvbiBieWFjYyBhbmQgZmxleC4KKwkoaW5zdGFsbC1vbmx5LXRvcCk6IE5ldyBhY3Rpb24uCisKK0ZyaSBTZXAgMjcgMTc6Mzk6NDQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgWW91IGNhbiBub3cgY29uZmlndXJlIEdEQiBmb3IgdGhlIHY4NTAuCisKK1R1ZSBTZXAgMjQgMTk6MDU6MTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSBhbnkgQysrIGRpcnMKKwlpZiB0YXJnZXRpbmcgRDEwVi4KKworVHVlIFNlcCAxNyAxMjoxNTozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtaXBzNjR2cjUwMDAuCisKK01vbiBTZXAgMTYgMTc6MDA6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBhIHNpbmdsZSBsaW5lIGZvciBob3N0X3Rvb2xzIGFuZCBuYXRpdmVfb25seS4KKworTW9uIFNlcCAgOSAxMjoyMTozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IEFkZCBlbnRyaWVzIGZvciBtMzJyLgorCitUaHUgU2VwICA1IDEzOjUyOjQ3IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBEb24ndCBydW4gaW5zdGFsbC1nemlwLgorCitXZWQgU2VwICA0IDE3OjI2OjEzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIERvbid0IGNvbmZpZyBsb3RzIG9mIHRoaW5ncyBmb3IgKi0qLXdpbmRvd3MqLgorCitTYXQgQXVnIDMxIDExOjQ1OjU3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZy5pbjogVGVzdCBmb3IgbXB3LXRydWUsIHRydWUsIGFuZCBudWxsLWNvbW1hbmQgc2NyaXB0cy4KKwkoaG9zdF9saWJzLCBob3N0X3Rvb2xzKTogQ29weSBmcm9tIGNvbmZpZ3VyZS5pbi4KKwkqIG1wdy1jb25maWd1cmU6IERvbid0IGNvbXBsYWluIGFib3V0IGRpcmVjdG9yaWVzIG5vdCBmb3VuZC4KKworVGh1IEF1ZyAyOSAxNjo0NDo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYpOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCisJKGlbMzQ1Nl04Ni0qLWRndXgqKTogVXNlIGNvbmZpZy9taC1zeXN2IGZvciB0aGUgaG9zdCBjb25maWd1cmF0aW9uCisJZmlsZS4KKworCSogY29uZmlnLmd1ZXNzIChpWzM0NV04Nik6IERpdHRvLgorCitNb24gQXVnIDI2IDE4OjM0OjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZWQgZ2RiIGZvciBEMTBWLgorCitUaHUgQXVnIDIyIDE3OjEzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZW1vdmUgbGQsIHRhcmdldC1saWJpbywgdGFyZ2V0LWxpYmcrKywgYW5kCisJdGFyZ2V0LWxpYnN0ZGMrKyBmcm9tIG5vY29uZmlnZGlycy4KKworV2VkIEF1ZyAyMSAxODo1NjozOCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBGaXggdGhyZWUgbG9jYXRpb25zIHdoZXJlIHNoZWxsIHNjcmlwdHMgd2VyZQorCWJlaW5nIHJ1biBkaXJlY3RseSByYXRoZXIgdGhhbiB3aXRoIGNvbmZpZ19zaGVsbC4KKworVHVlIEF1ZyAyMCAxMzowODo0NyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh2ODUwLSotKik6IFNldCB1cCBpbml0aWFsICRub2NvbmZpZ2RpcnMuCisJKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogUmVjb2duaXplIHY4NTAuCisKK1RodSBBdWcgMTUgMTI6MTk6MzMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlndXJlOiBIYW5kbGUgbXVsdGlwbGUgZW5hYmxlL2Rpc2FibGUgb3B0aW9ucyBhbmQKKwlwYXNzIHRoZW0gZG93biByZWN1cnNpdmVseSwgaGFuZGxlIC1jIGFuZCAtcyBmbGFncyBhcHByb3ByaWF0ZWx5CisJZGVwZW5kaW5nIG9uIGNob2ljZSBvZiBjb21waWxlciwgYWRkIGVzY2FwZSBtZWNoYW5pc20gZm9yCisJcXVvdGVkIGFyZ3VtZW50cyB0byBnQy4KKworTW9uIEF1ZyAxMiAxMzoxNToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYyotKi0qKTogRm9yIGVhYmksIHN5c3RlbSBWLjQsIExpbnV4LCBhbmQKKwlzb2xhcmlzIHRhcmdldHMsIHVzZSBjb25maWcvbXQtcHBjIHRvIHNldCBDeyxYWH1GTEFHU19GT1JfVEFSR0VUUworCXNvIHRoYXQgLW1yZWxvY2F0YWJsZS1saWIgYW5kIC1tbm8tZWFiaSBhcmUgdXNlZC4KKworCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IElmIHRhcmdldCBjb21waWxlciBkb2VzCisJbm90IHN1cHBvcnQgLS1wcmludC1tdWx0aS1saWIsIGRvbid0IGFib3J0LgorCitTdW4gQXVnIDExIDIwOjUxOjUwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1jeWd3aW4zMiAoQ0ZMQUdTKTogIERlZmluZSBfV0lOMzIgdG8gYmUgY29tcGF0aWJsZQorCXdpdGggbm9ybWFsIFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCisKK1RodSBBdWcgIDggMTI6MTg6NTkgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2UtYWxsLmNvbTogUnVuIGNvbmZpZy1hLWdhcy4KKwkqIHNldHVwLmNvbTogRG9uJ3QgY29weSBzdWJkaXJlY3RvcnkgZmlsZXMgYXJvdW5kLgorCitUdWUgSnVsIDMwIDE3OjQ5OjMxIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLW9zZSk6IFJlbW92ZSBleGNsdXNpb24gb2YgbGliZ2xvc3MgZm9yIHRoaXMKKwl0YXJnZXQsIGl0IG5vdyBjb21waWxlcyBjb3JyZWN0bHkuCisKK1NhdCBKdWwgMjcgMTU6MTA6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluOiBHZW5lcmF0ZSBNYWMgaW5jbHVkZSBmb3IgZWxmL2R3YXJmMi5oLgorCitUdWUgSnVsIDIzIDEwOjQ3OjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogUmVtb3ZlIGxkIGZyb20gJG5vY29uZmlnZGlycy4gCisKK01vbiBKdWwgMjIgMTM6Mjg6NTEgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5hdGl2ZV9vbmx5KTogQWRkIHBybXMuCisKK01vbiBKdWwgMjIgMTI6Mjc6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoR0FTX1NVUFBPUlRfRElSUyk6IEFkZCBtYWtlLWFsbC5jb20gYW5kIHNldHVwLmNvbS4KKwkoQklOVVRJTFNfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCisKK1RodSBKdWwgMTggMTI6NTU6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogRG9uJ3QgY29uZmlndXJlIGxkIG9yIGdkYiB1bnRpbCB0aGUKKwlkMTB2IHN1cHBvcnQgaXMgYWRkZWQuCisKK1dlZCBKdWwgMTcgMTQ6MzM6MDkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLSopOiBOZXcgdGFyZ2V0LgorCitNb24gSnVsIDE1IDExOjUzOjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzIChIUCA5MDAwLzgxMSk6IFJlY29nbml6ZSB0aGlzIGFzIGEgUEExLjEKKwltYWNoaW5lLgorCitGcmkgSnVsIDEyIDIzOjIxOjE3IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZG8tdGFyLWd6KTogTmV3IHRhcmdldCwgc3BsaXQgb3V0IGZyb20gdGFpbCBlbmQgb2YKKwl0YXogdGFyZ2V0LiAgUnVuIGVhY2ggY29tbWFuZCBzZXBhcmF0ZWx5LCBkb24ndCB1c2UgcGlwZXMuCisJKHRheik6IFVzZSBpdC4KKworRnJpIEp1bCAxMiAxMjowODowNCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWd1cmU6IExvb2sgZm9yIGctbXB3LW1ha2Uuc2VkIGluIGNvbmZpZy9tcHcuCisJKiBtcHctYnVpbGQuaW46IE5vIGJ1aWxkcyBzaG91bGQgZGVwZW5kIG9uIGJ1aWxkaW5nIGJ5YWNjIG9yIGZsZXgsCisJdGhleSBhcmUgYXNzdW1lZCB0byBiZSBpbnN0YWxsZWQgYWxyZWFkeS4KKworRnJpIEp1bCAxMiAwOTo1Mjo1MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBTZXQgciBlbnZpcm9ubWVudAorCXZhcmlhYmxlIHRoYXQgQ0NfRk9SX1RBUkdFVCBuZWVkcy4KKworVGh1IEp1bCAxMSAxMDowOTo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBEZXRlcm1pbmUgaWYgdGhlIG11bHRsaWIKKwlvcHRpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBzdWJkaXJlY3Rvcnkgd2FzCisJY29uZmlndXJlZCwgYW5kIGlmIGl0IGhhcywgcmVjb25maWd1cmUuCisJKENMRUFOX1RBUkdFVF9NT0RVTEVTKTogRGVsZXRlIG11bHRpbGliLm91dCBhbmQgdG1wbXVsdGkub3V0LCB3aGljaAorCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyB1c2VzIHRvIHJlbWVtYmVyIHRoZSBvbGQgbXVsdGlsaWIgb3B0aW9ucy4KKworV2VkIEp1bCAxMCAxODo1Njo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMsQ1JPU1NfQ0hFQ0tfTU9EVUxFUyxJTlNUQUxMX01PRFVMRVMsCisJQ0xFQU5fTU9EVUxFUyk6IEFkZCBiYXNoLgorCShhbGwtYmFzaCk6IE5ldyB0YXJnZXQuCisKK01vbiBKdWwgIDggMTc6MzM6MTQgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXg2Kik6IFVzZSBtaC1pcml4NiBpbnN0ZWFkIG9mIG1oLWlyaXg1LgorCitNb24gSnVsICAxIDEzOjMxOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IFJlY29nbml6ZSBkMTB2IGFzIGEgdmFsaWQgcHJvY2Vzc29yLgorCitGcmkgSnVuIDI4IDEyOjE0OjM1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIC0tYmluZGlyLgorCSogbXB3LWJ1aWxkLmluOiBVc2UgYSBHQ0Mtc3BlY2lmaWMgYnVpbGQgc2NyaXB0IGZvciBHQ0MgYWN0aW9ucy4KKworV2VkIEp1biAyNiAxNzoyMDoxMiAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCBiYXNoLCB0aW1lLCBnYXdrIHRvIGxpc3Qgb2YgaG9zdHRvb2xzIGFuZCB0aGluZ3MKKwl0byBvbmx5IGJ1aWxkIGZvciBuYXRpdmUgdG9vbGNoYWlucworCitUdWUgSnVuIDI1IDIzOjA5OjAzIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmUuCisKK1R1ZSBKdW4gMjUgMTk6MDA6MDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgorCitNb24gSnVuIDI0IDIzOjI2OjA3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYnVpbGQgZGlmZiBhbmQgcGF0Y2ggZm9yIGN5Z3dpbjMyLWhvc3RlZAorCXRvb2xjaGFpbnMuCisKK01vbiBKdW4gMjQgMTU6MDE6MTIgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KKworCSogY29uZmlnLnN1YjogQWNjZXB0IC1ydGVtcyouCisKK1N1biBKdW4gMjMgMjI6NDE6NTQgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZW5hYmxlIGRvc3JlbCBmb3IgY3lnd2luMzItaG9zdGVkIGJ1aWxkcywKKyAgICAgICAgICAgICAgICByZW1vdmUgZGlmZiBmcm9tIHRoZSBsaXN0IG9mIHRoaW5ncyBub3QgYnVpbGRhYmxlCisgICAgICAgICAgICAgICAgdmlhIENhbmFkaWFuIENyb3NzCisKK1NhdCBKdW4gMjIgMTE6Mzk6MDEgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVEFSR0VUX1NVQkRJUik6IE1vdmUgY29tbWVudCB0byBwcmV2aW91cyBsaW5lIHNvIHdlCisgCWRvbid0IGdldCAiLiAiLgorCitGcmkgSnVuIDIxIDE3OjI0OjQ4IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDYqKTogU2V0IG5vY29uZmlnZGlycyBhcHByb3ByaWF0ZWx5LgorCitUaHUgSnVuIDIwIDE2OjU3OjQwIDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodGF6KTogSGFuZGxlIGNhc2Ugd2hlcmUgdGV4M3BhdGNoIGRpZG4ndCBldmVuIGdldAorCWNoZWNrZWQgb3V0LiAgQWxzbywgaWYgaXQgd2FzIGZvdW5kLCBwdXQgdGhlIHN5bWxpbmsgaW4gYSBuZXcgdXRpbAorCXN1YmRpcmVjdG9yeS4KKworVGh1IEp1biAyMCAxMjoyMDozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyBMaW51eC4KKworVHVlIEp1biAxOCAxNDoyNDoxMiAxOTk2ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1vcGVudm1zLgorCSogY29uZmlndXJlLmluIChhbHBoYSotKi0qdm1zKik6IFNldCBub2NvbmZpZ2RpcnMuCisJKiBtYWtlLWFsbC5jb20sIHNldHVwLmNvbTogTmV3IGZpbGVzLgorCitNb24gSnVuIDE3IDE2OjM0OjQ2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHRheik6IHRleDNwYXRjaCBtb3ZlZCB0byB0ZXhpbmZvL3V0aWwuCisKK1NhdCBKdW4gMTUgMTc6MTM6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IHJlbW92ZSBtYWtlIGZyb20gZGlzYWJsZS1pZi1DYW4tQ3Jvc3MgbGlzdAorCQllbmFibGUgZ2RiIGlmICR7aG9zdH0gYW5kICR7dGFyZ2V0fSBhcmUgY3lnd2luMzIKKworRnJpIEp1biAgNyAxODoxNjo1MiAxOTk2ICBIYXJsYW4gU3Rlbm4gPGhhcmxhbkBwZmNzLmNvbT4KKworCSogY29uZmlnLmd1ZXNzIChpPzg2LW5jci1zeXN2Kik6ICBFbWl0IG1pbm9yIHJlbGVhc2UgbnVtYmVycy4KKwlSZWNvZ25pemUgdGhlIE5DUiA0ODUwIG1hY2hpbmUgYW5kIE5DUiBQZW50aXVtLWJhc2VkIHBsYXRmb3Jtcy4KKworV2VkIEp1biAgNSAwMDowOToxNyAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAd29tYmF0LmdudS5haS5taXQuZWR1PgorCisJKiBjb25maWcuZ3Vlc3M6ICBDb21iaW5lIG1pcHMtbWlwcy1yaXNjb3MgY2FzZXMsIGFuZCB1c2UgY3BwIHRvCisJZGlzdGluZ3Vpc2ggc3lzdi9zdnI0L2JzZCB2YXJpYW50cy4KKwlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+LgorCitGcmkgSnVuICA3IDE0OjI0OjQ5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY29weXJpZ2h0IG5vdGljZS4KKwkqIG1vdmUtaWYtY2hhbmdlOiBBZGRlZCBjb3B5cmlnaHQgbm90aWNlLgorCitUaHUgSnVuICA2IDE2OjI3OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFVudGlsIHdlIGdldCBzaGFyZWQKKwlsaWJyYXJpZXMgd29ya2luZywgZG9uJ3QgYnVpbGQgZ2RiLCBzaW0sIG1ha2UsIHRjbCwgdGssIG9yCisJZXhwZWN0LgorCitUdWUgSnVuICA0IDIwOjQxOjQ1IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSB3aXRoIEZTRjoKKworCU1vbiBKdW4gIDMgMDg6NDk6MTQgMTk5NiAgS2FybCBIZXVlciAgPGt3emhAZ251LmFpLm1pdC5lZHU+CisJKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogQWRkIGd1ZXNzIGZvciBzcGFyYy11bmtub3duLWxpbnV4LgorCisJRnJpIE1heSAyNCAxODozNDo1MyAxOTk2ICBSb2xhbmQgTWNHcmF0aCAgPHJvbGFuZEBkZWxhc3lkLmdudS5haS5taXQuZWR1PgorCSogY29uZmlnLmd1ZXNzIChBVmlpT046ZGd1eDoqOiopOiBGaXggdHlwbyBpbiByZWNvZ25pemluZyBtYzg4MTEwLgorCisJRnJpIEFwciAxMiAyMDowMzo1OSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAc3BpZmYuZ251LmFpLm1pdC5lZHU+CisJKiBjb25maWcuZ3Vlc3M6ICBDb21iaW5lIHR3byBPU0YxIHJ1bGVzLgorCUFsc28gcmVjb2duaXplIGZpZWxkIHRlc3QgdmVyc2lvbnMuICBGcm9tIG1qckB6azMuZGVjLmNvbS4KKwkqIGNvbmZpZy5ndWVzcyAoZGd1eCk6ICBVc2UgL3Vzci9iaW4vdW5hbWUgcmF0aGVyIHRoYW4gdW5hbWUsCisJYmVjYXVzZSBHTlUgdW5hbWUgZG9lcyBub3Qgc3VwcG9ydCAtcC4gIEZyb20gcG1yQHBhamF0by5jb20uCisKK1R1ZSBKdW4gIDQgMTE6MDc6MjUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChNQUtFRElSUyk6IFJlbW92ZWQgJCh0b29sZGlyKS4KKworVHVlIE1heSAyOCAxMjozMDo1MCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1SRUFETUU6IERvY3VtZW50IEdDQ0luY2x1ZGVzLgorCitTdW4gTWF5IDI2IDE1OjE2OjI3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGFscGhhLSotbGludXgqKTogU2V0IGVuYWJsZV9zaGFyZWQgdG8geWVzLgorCitUdWUgTWF5IDIxIDE1OjQxOjM5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZ3VyZTogSGFuZGxlIC0tZW5hYmxlLUZPTyBhbmQgLS1kaXNhYmxlLUZPTy4KKworTW9uIE1heSAyMCAxMDoxMjoyOSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKCotKi1jeWd3aW4zMik6IENvbmZpZ3VyZSBtYWtlLgorCitUdWUgTWF5ICA3IDE0OjE5OjQyIDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAc251ZmZsZS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogUXVvdGUgdmFsdWUgb2YgSU5TVEFMTF9NT0RVTEVTLgorCitGcmkgTWF5ICAzIDA4OjU3OjE3IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAbGlzYS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWluZXQpOiBEZXBlbmQgb24gYWxsLXBlcmwuCisKKwkqIE1ha2VmaWxlLmluIChpbmV0LWluc3RhbGwpOiBOZXcgdGFyZ2V0LgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWluZXQpOiBEZXBlbmQgb24gYWxsLXRjbC4KKwkoYWxsLWluZXQpOiBEZXBlbmQgb24gYWxsLXNlbmQtcHIuCisKK1R1ZSBBcHIgMzAgMTM6NTU6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZS0qLXNvbGFyaXMqKTogVHVybiBvZmYgdGsgYW5kIHRjbAorCXRlbXBvcmFyaWx5LgorCitUaHUgQXByIDI1IDExOjQ4OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgLS13aXRoLWdudS1sZCBvbiBBSVguCisKK1RodSBBcHIgMjUgMDY6MzM6MzYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KKworCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFR1cm4gb2ZmIGdkYiB0ZW1wb3JhcmlseS4KKworVHVlIEFwciAyMyAwOTowNzozOSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtaW5ldC4KKwkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWluZXQuCisJKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtaW5ldC4KKwkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWluZXQuCisJKGFsbC1pbmRlbnQpOiBOZXcgdGFyZ2V0LgorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGRlZCBpbmV0LgorCShuYXRpdmVfb25seSk6IEFkZGVkIGluZXQuCisJKG5vY29uZmlnZGlycyk6IEFkZGVkIGluZXQuCisKK0ZyaSBBcHIgMTkgMTU6MzU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsaWJnbG9zcyBpZiB3ZSBhcmUgbm90IGNvbmZpZ3VyaW5nCisJbmV3bGliLgorCitXZWQgQXByIDE3IDE5OjMwOjAxIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGxpYmdsb3NzIGZvciB1bnN1cHBvcnRlZAorCWFyY2hpdGVjdHVyZXMuCisKK1R1ZSBBcHIgMTYgMTE6MTc6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0xFQU5fTU9EVUxFUyk6IEFkZCBjbGVhbi1hcGFjaGUuCisKK01vbiBBcHIgMTUgMTU6MDk6MDUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogSW5jbHVkZSBhbGwtYXBhY2hlLgorCShDUk9TU19DSEVDS19NT0RVTEVTKTogSW5jbHVkZSBjaGVjay1hcGFjaGUuCisJKElOU1RBTExfTU9EVUxFUyk6IEluY2x1ZGUgaW5zdGFsbC1hcGFjaGUuCisJKGFsbC1hcGFjaGUpOiBOZXcgdGFyZ2V0LgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIGFwYWNoZSBldmVyeXdoZXJlIHBlcmwgaXMgc2Vlbi4KKworTW9uIEFwciAxNSAxNDo1OToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBBZGQgc3VwcG9ydCBmb3IgY2xlYW4te21vZHVsZX0gYW5kCisJY2xlYW4tdGFyZ2V0LXttb2R1bGV9IHJ1bGVzLgorCitXZWQgQXByIDEwIDIxOjM3OjQxIFBEVCAxOTk2ICBNYXJpbHluIEUuIFNhbmRlciA8bXNhbmRlckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKCotKi1vc2UpIGRvIG5vdCBidWlsZCBsaWJnbG9zcy4KKworTW9uIEFwciAgOCAxNjoxNjoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzcyAocHJlcCo6U3VuT1M6NS4qOiopOiBUdXJuIGludG8KKwlwb3dlcnBlbGUtdW5rbm93bi1zb2xhcmlzMi4KKworTW9uIEFwciAgOCAxNDo0NTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgorCWRpcmVjdG9yaWVzLgorCitGcmkgQXByICA1IDA4OjE3OjU3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGhvc3Q9PXNvbGFyaXMpOiBQYXNzIG9ubHkgdGhlIGZpcnN0IHdvcmQgb2YgJENDCisJdG8gL3Vzci9iaW4vd2hpY2ggd2hlbiBjaGVja2luZyBpZiB3ZSdyZSB1c2luZyAvdXNyL2Njcy9iaW4vY2MuCisKK0ZyaSBBcHIgIDUgMDM6MTY6MTMgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIGRvd24gJChNQUtFKS4KKworVGh1IE1hciAyOCAxNDoxMToxMSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBJbmNsdWRlIGFsbC1wZXJsLgorCShDUk9TU19DSEVDS19NT0RVTEVTKTogSW5jbHVkZSBjaGVjay1wZXJsLgorCShJTlNUQUxMX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtcGVybC4KKwkoQUxMX1gxMV9NT0RVTEVTKTogSW5jbHVkZSBhbGwtZ3VpbGUuCisJKENIRUNLX1gxMV9NT0RVTEVTKTogSW5jbHVkZSBjaGVjay1ndWlsZS4KKwkoSU5TVEFMTF9YMTFfTU9EVUxFUyk6IEluY2x1ZGUgaW5zdGFsbC1ndWlsZS4KKwkoYWxsLXBlcmwpOiBOZXcgdGFyZ2V0LgorCShhbGwtZ3VpbGUpOiBOZXcgdGFyZ2V0LgorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBJbmNsdWRlIHBlcmwgYW5kIGd1aWxlLgorCShuYXRpdmVfb25seSk6IEluY2x1ZGUgcGVybCBhbmQgZ3VpbGUuCisJKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGd1aWxlIGFuZCBwZXJsOyBubyBwb3J0cyBoYXZlIGJlZW4KKwlkb25lLgorCitUdWUgTWFyIDI2IDIxOjE4OjUwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKyAgICAgICAgKiBjb25maWd1cmUgKC0tZW5hYmxlLSopOiBIYW5kbGUgcXVvdGVkIG9wdGlvbiBsaXN0cyBzdWNoIGFzCisgICAgICAgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9Jy1nMCAtTycgYmV0dGVyLgorCitUaHUgTWFyIDIxIDExOjUzOjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHssaW5zdH1hbGwtdGFyZ2V0KTogTmV3IHJ1bGUgc28gd2UgY2FuIG1ha2UgYW5kCisJaW5zdGFsbCBhbGwgb2YgdGhlIHRhcmdldCBkaXJlY3RvcmllcyBlYXNpbHkuCisKK1dlZCBNYXIgMjAgMTg6MTA6NTcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pc3NpbmcgZ2xvYmFsIGZsYWcgaW4gc2VkIHN1YnN0aXR1dGlvbiB3aGVuCisJZGVsZXRpbmcgYHRhcmdldC0nIGZyb20gJHtjb25maWdkaXJzfS4KKworVGh1IE1hciAxNCAxOToxNTowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChET19YKTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGlmIENDIGNvbnRhaW5zIGA9JyBpbiBhbgorCW9wdGlvbi4KKworCSogY29uZmlndXJlLmluIChtaXBzKi1uZWMtc3lzdnI0Kik6IFVzZSBhIGhvc3RfbWFrZWZpbGVfZnJhZyBvZgorCWNvbmZpZy9taC1uZWN2NC4KKworCSogaW5zdGFsbC5zaDogQ29ycmVjdCBtaXNzcGVsbGluZyBvZiB0cmFuc2Zvcm1iYXNlbmFtZS4KKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgbWlwcy0qLXN5c3YqLgorCitNb24gTWFyIDExIDE1OjM2OjQyIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIG1vbjk2MC4KKworU3VuIE1hciAxMCAxMzoxODozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVzdG9yZSBDYW5hZGlhbiBDcm9zcyBoYW5kbGluZyBvZiBCSVNPTiBhbmQgTEVYLAorCXJlbW92ZWQgaW4gRmViIDIwIGNoYW5nZS4KKworRnJpIE1hciAgOCAyMDowNzowOSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogUkVBRE1FOiAgU3VnZ2VzdGlvbnMgZnJvbSBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+OgorCU1lbnRpb24gbWFrZSBpbnN0YWxsLiAgUmVtb3ZlIHRoZSBvbGQgY29weXJpZ2h0IGRhdGUgYXMgd2VsbCB0aGUKKwljbHVtc3kgYW5kIHJhdGhlciBwb2ludGxlc3MgY29weXJpZ2h0IG9uIHRoZSBSRUFETUUgZmlsZS4KKworRnJpIE1hciAgOCAxNzo1MTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBJZiB0aGVyZSBpcyBhCisJTWFrZWZpbGUgYWZ0ZXIgcnVubmluZyBzeW1saW5rLXRyZWUsIHRoZW4gcnVuIGBtYWtlIGRpc3RjbGVhbicgdG8KKwlhdm9pZCBjbG9iYmVyaW5nIGFueSBnZW5lcmF0ZWQgZmlsZXMgaW4gc3JjZGlyLgorCitUdWUgTWFyICA1IDA4OjIxOjQ0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtNjhrLSotbmV0YnNkKik6IEJ1aWxkIGV2ZXJ5dGhpbmcgbm93LgorCitXZWQgRmViIDI4IDEyOjI1OjQ2IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHRheik6IEZpeCBxdW90aW5nLgorCitUdWUgRmViIDI3IDExOjMzOjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjbGV0LSotKik6IEJ1aWxkIGV2ZXJ5dGhpbmcgbm93LgorCitUdWUgRmViIDI3IDE0OjMxOjUxIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWd1cmUuaW4gKG02OGstKi1saW51eCopOiBOZXcgaG9zdC4KKworTW9uIEZlYiAyNiAxNDozMjo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogQ2hlY2sgZm9yIGJpc29uIGJlZm9yZSBieWFjYy4KKworVHVlIEZlYiAyMCAyMzoxMjozNSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiBjb25maWd1cmU6ICBDaGFuZ2UgdGhlIHdheSBMRVggYW5kIEJJU09OL1lBQ0MgYXJlCisJc2V0LiAgY29uZmlndXJlIG5vdyBkZWZpbmVzIERFRkFVTFRfTEVYIGFuZCBERUZBVUxUX1lBQ0MgYnkKKwlzZWFyY2hpbmcgUEFUSC4gIFRoZXNlIGFyZSB1c2VkIGFzIGZhbGxiYWNrcyBieSBNYWtlZmlsZS5pbiBpZgorCWZsZXgvYmlzb24vYnlhY2MgYXJlbid0IGluIG9iamRpci4KKworTW9uIEZlYiAxOSAxMTo0NTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBNYWtlIGV2ZXJ5dGhpbmcgd2hpY2ggZGVwZW5kcyB1cG9uIGFsbC1iZmQgYWxzbworCWRlcGVuZCB1cG9uIGFsbC1vcGNvZGVzLCBpbiBjYXNlIC0td2l0aC1jb21tb25iZmRsaWIgaXMgdXNlZC4KKworVGh1IEZlYiAxNSAxOTo1MDo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdCAqLSotY3lnd2luMzIpOiBEb24ndCBidWlsZCBnZGIgaWYgd2UgYXJlCisJYnVpbGRpbmcgTlQgbmF0aXZlIGNvbXBpbGVycyBvbiBVbml4LgorCitUaHUgRmViIDE1IDE3OjQyOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBnZXQgQ0MgZnJvbSB0aGUgaG9zdCBNYWtlZmlsZSBmcmFnbWVudCBpZiB3ZQorCWNhbiBmaW5kIGdjYyBpbiBQQVRILCBvciBpZiB0aGlzIGlzIGEgQ2FuYWRpYW4gQ3Jvc3MuICBNb3ZlIHRoZQorCVNvbGFyaXMgdGVzdCBmb3IgL3Vzci91Y2IvY2MgdG8gdGhlIHBvc3QgdGFyZ2V0IHNjcmlwdCwganVzdCBhZnRlcgorCXRoZSBjb21waWxlciBzYW5pdHkgdGVzdC4KKworV2VkIEZlYiAxNCAxNjo1Nzo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgorCitUdWUgRmViIDEzIDE0OjI3OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KKwkoUkVBTExZX1NFVF9MSUJfUEFUSCk6IFVzZSBpdC4KKwkqIGNvbmZpZ3VyZS5pbjogT24gSFAvVVgsIHNldCBSUEFUSF9FTlZWQVIgdG8gU0hMSUJfUEFUSC4KKworTW9uIEZlYiAxMiAxNToyODo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBSZWNvZ25pemUgc3BhcmNsZXQgY3B1LgorCitNb24gRmViIDEyIDE1OjMzOjU5IDE5OTYgIENocmlzdGlhbiBCYXVlcm5mZWluZCA8Y2hyaXNiZmRAdGhlb3JpZTMucGh5c2lrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogY29uZmlnLmd1ZXNzOiAgU3VwcG9ydCBtNjhrLWNibS1zeXN2NC4KKworU2F0IEZlYiAxMCAxMjowNjo0MiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IEd1ZXNzIG02OGstdW5rbm93bi1saW51eCBhbmQKKwltNjhrLXVua25vd24tbGludXhhb3V0IGZyb20gbGlua2VyIGhlbHAgc3RyaW5nLiAgUHV0IHF1b3RlcyBhcm91bmQKKwkkbGRfaGVscF9zdHJpbmcuCisKK1RodSBEZWMgIDcgMDk6MDM6MjQgMTk5NSAgVG9tIEhvcnNsZXkgIDxUb20uSG9yc2xleUBtYWlsLmhjc2MuY29tPgorCisJKiBjb25maWcuZ3Vlc3MgKHBvd2VycGMtaGFycmlzLXBvd2VydW5peCk6IEFkZCBndWVzcyBmb3IgcG9ydAorCXRvIG5ldyB0YXJnZXQuCisKK1RodSBGZWIgIDggMTU6Mzc6NTIgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3MgKFVOQU1FX1ZFUlNJT04pOiBSZWNvZ25pemUgWDQueCBhcyBhbiBPU0YgdmVyc2lvbi4KKworTW9uIEZlYiAgNSAxNjozNjo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogSWYgLS1lbmFibGUtc2hhcmVkIHdhcyB1c2VkLCBzZXQgU0VUX0xJQl9QQVRIIHRvCisJJChSRUFMTFlfU0VUX0xJQl9QQVRIKSBpbiBNYWtlZmlsZS4KKwkqIE1ha2VmaWxlLmluIChTRVRfTElCX1BBVEgpOiBOZXcgdmFyaWFibGUuCisJKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBOZXcgdmFyaWFibGUuCisJKCQoRE9fWCkpOiBVc2UgJChTRVRfTElCX1BBVEgpLgorCShpbnN0YWxsLmFsbCwgZ2NjLW5vLWZpeGVkaW5jbHVkZXMsICQoQUxMX01PRFVMRVMpKTogTGlrZXdpc2UuCisJKCQoTkFUSVZFX0NIRUNLX01PRFVMRVMpLCAkKENST1NTX0NIRUNLX01PRFVMRVMpKTogTGlrZXdpc2UuCisJKCQoSU5TVEFMTF9NT0RVTEVTKSwgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCisJKCQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KKwkoJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChBTExfWDExX01PRFVMRVMpKTogTGlrZXdpc2UuCisJKCQoQ0hFQ0tfWDExX01PRFVMRVMpLCAkKElOU1RBTExfWDExX01PRFVMRVMpKTogTGlrZXdpc2UuCisJKGFsbC1nY2MsIGFsbC1ib290c3RyYXAsIGNoZWNrLWdjYywgaW5zdGFsbC1nY2MpOiBMaWtld2lzZS4KKwkoaW5zdGFsbC1kb3NyZWwpOiBMaWtld2lzZS4KKwkoYWxsLW9wY29kZXMpOiBEZXBlbmQgdXBvbiBhbGwtbGliaWJlcnR5LgorCitTdW4gRmViICA0IDE2OjUxOjExIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzcyAoKjpDWUdXSU4qKTogTmV3CisKK1NhdCBGZWIgIDMgMTA6NDI6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC13aW5zdXApOiBBbGwgYWxsLXRhcmdldC1saWJpYmVydHkuCisKK0ZyaSBGZWIgIDIgMTc6NTg6NTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBtaXNzaW5nICMgaW4gZnJvbnQgb2YgY29tbWVudC4KKworVGh1IEZlYiAgMSAxNDozODoxMyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IGFkZCBzZWNvbmQgcGFzcyB0byB0aGluZ3MgYWRkZWQgdG8gbm9jb25maWdkaXJzCisJc28gKi1nbS1tYWdpYyBjYW4gZXhjbHVkZSBsaWJnbG9zcyBwcm9wZXJseS4KKworVGh1IEZlYiAgMSAxMToxMDoxNiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWd1cmUgKGV4dHJhbGlic19uYW1lLCByZXpfbmFtZSk6IFNldCBjb3JyZWN0bHkKKwlmb3IgTVdDNjhLIGNvbXBpbGVyLgorCisJKiBtcHctUkVBRE1FOiBBZGQgbW9yZSBpbmZvIG9uIHRoZSBuZWNlc3NhcnkgYnVpbGQgdG9vbHMuCisKK1RodSBGZWIgIDEgMTA6MjI6MzggMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluLCBjb25maWcuc3ViOiBSZWNvZ25pemUgY3lnd2luMzIuCisKK1dlZCBKYW4gMzEgMTQ6MTc6MTAgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YjogUmVjb2duaXplIEEvVVguCisKK1dlZCBKYW4gMzEgMTM6NTI6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIGdjYy9jb25maWcuc3ViLgorCitUaHUgSmFuIDI1IDExOjAxOjEwIDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIG1wdy1idWlsZC5pbiAoZG8tYmludXRpbHMpOiBBZGQgYnVpbGQgb2Ygc3RhbXBzLgorCitUaHUgSmFuIDI1IDE3OjA1OjI2IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogY29uZmlnLnN1YjogQWRkIHJlY29nbml0aW9uIGZvciBtaXBzNjR2cjQxMDAqLSogdGFyZ2V0cy4KKworV2VkIEphbiAyNCAxMjo0Nzo1NSAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIHRlc3QtYnVpbGQubWs6IEFkZCBjaGVja2luZyBvZiBgaHB1eDknIHJhdGhlciB0aGFuIGp1c3QgYGhwdXgnLgorCUFkZCBjcmVhdGlvbiBvZiBnY29uZmlnYXJncyB3aXRoIGAtLWVuYWJsZS1zaGFyZWQnIHR1cm5lZCBvbi4KKwkoJChob3N0KS1zdGFtcC1zdGFnZTItY29uZmlndXJlZCk6IFBhc3MgJChnY29uZmlnYXJncykuCisJKCQoaG9zdCktc3RhbXAtc3RhZ2UzLWNvbmZpZ3VyZWQpOiBMaWtld2lzZS4KKwkoSE9MRVMpOiBBZGQgY2hhdHIgYW5kIGxkZC4KKwkoaTM4Ni1uY3Itc3lzdjQuMyopOiBBZGQgdXNlIG9mIC91c3IvY2NzL2JpbiBpbiB0aGUgUEFUSCBhbmQgSE9MRV9ESVJTLgorCitXZWQgSmFuIDI0IDIwOjMyOjMwIDE5OTYgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBub2lzeS5tYXRlbWF0aWsuc3Uuc2U+CisKKwkqIGNvbmZpZ3VyZTogUGFzcyAtLW5mcCB0byByZWN1cnNpdmUgY29uZmlndXJlcy4KKworTW9uIEphbiAyMiAxMDo0MTo1NiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRExMVE9PTCk6IE5ldy4KKwkoRExMVE9PTF9GT1JfVEFSR0VUKTogTmV3LgorCShFWFRSQV9IT1NUX0ZMQUdTKTogUGFzcyBkb3duIERMTFRPT0wuCisJKEVYVFJBX1RBUkdFVF9GTEFHUyk6IERpdHRvLgorCShFWFRSQV9HQ0NfRkxBR1MpOiBEaXR0by4KKwkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCisJKERPX1gpOiBEaXR0by4KKwkqIGNvbmZpZ3VyZTogQWRkIERMTFRPT0wuCisKK0ZyaSBKYW4gMTkgMTM6MzA6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJU0NPIE9wZW5TZXJ2ZXIgNSBjaGFuZ2VzIGZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+OgorCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLXNjbzMuMnY1Kik6IFVzZSBtaC1zeXN2IGluc3RlYWQgb2YKKwltaC1zY28sIHNpbmNlIG9sZCB3b3JrYXJvdW5kcyBubyBsb25nZXIgbmVlZGVkLCBhbmQgZG9uJ3QKKwlidWlsZCBsZCwgc2luY2UgbGlicmFyaWVzIGhhdmUgd2VhayBzeW1ib2xzIGluIENPRkYuCisKK1N1biBKYW4gMTQgMjM6MDE6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBBZGQgbWlzc2luZyAnOycuCisKK0ZyaSBKYW4gMTIgMTU6MjU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB0aGF0ICR7Q0N9IGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUgYW4KKwlleGVjdXRhYmxlLgorCitXZWQgSmFuICAzIDE3OjU0OjQxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChuZXdsaWIudGFyLmd6KTogRGVsZXRlIGJ1aWxkaW5nIG9mIG5ld2xpYidzIGluZm8gZmlsZXMuCisKK01vbiBKYW4gIDEgMTk6MDk6MTQgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogUHV0IGxkIG9yIGdhcyBpbiB0aGlzIGVhcmx5LCBpZiB0aGUKKwl1c2VyIHNwZWNpZmljYWxseSB1c2VkIC0td2l0aC1nbnUtbGQ9bm8gb3IgLS13aXRoLWdudS1hcz1uby4KKworU2F0IERlYyAzMCAxNjowODo1NyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWctbWwuaW46IEFkZCBzdXBwb3J0IGZvcgorCS0tZGlzYWJsZS17c29mdGZsb2F0LG02ODg4MSxtNjgwMDAsbTY4MDIwfSBvbiBtNjgqLSotKi4KKwlTaW1wbGlmeSBzZXR0aW5nIG9mIG11bHRpZGlycyBmcm9tIC0tZGlzYWJsZS1mb28uCisKK0ZyaSBEZWMgMjkgMDc6NTY6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogSWYgYW55IG9mIHRoZSBtYWtlIHZhcmlhYmxlcworCUxBTkdVQUdFUywgQk9PVF9DRkxBR1MsIFNUTVBfRklYUFJPVE8sIExJTUlUU19IX1RFU1QsCisJTElCR0NDMV9URVNULCBMSUJHQ0MyX0NGTEFHUywgTElCR0NDMl9JTkNMVURFUywgYW5kIEVOUVVJUkUgYXJlCisJbm9uLWVtcHR5LCBwYXNzIHRoZW0gb24gdG8gdGhlIAlHQ0MgbWFrZS4KKwkoYWxsLWJvb3RzdHJhcCk6IE5ldyBydWxlIHRoYXQgaXMgbGlrZSBhbGwtZ2NjLCBleGNlcHQgaXQgZXhlY3V0ZXMKKwl0aGUgR0NDIGJvb3RzdHJhcCBydWxlIGluc3RlYWQgb2YgdGhlIEdDQyBhbGwgcnVsZS4KKworV2VkIERlYyAyNyAxNTo1MTo0OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWctbWwuaW4gKG1sX3JlYWxzcmNkaXIpOiBOZXcsIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KKworVHVlIERlYyAyNiAxMTo0NTozMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogVXBkYXRlIGZyb20gRlNGIHRvIGFkZCBwZW50aXVtCisJREcvVVggc3VwcG9ydC4KKworRnJpIERlYyAxNSAxMDowMToyNyAxOTk1ICBTdGFuIENveCAgPGNveHNAZGctcnRwLmRnLmNvbT4KKworCSogY29uZmlnLnN1YiAoaSo4NiopIENoYW5nZSBbMzQ1XSB0byBbMzQ1Nl0KKworV2VkIERlYyAyMCAxNzo0MTo0MCAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogQWRkIGdhcyBvciBsZCBpZiAtLXdpdGgtZ251LWFzPW5vIG9yCisJLS13aXRoLWdudS1sZD1uby4KKworV2VkIERlYyAyMCAxNToxNTozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy1tbC5pbiAocnM2MDAwKiwgcG93ZXJwYyopOiBBZGQgc3dpdGNoZXMgdG8gY29udHJvbCB3aGljaAorCUFJWCBtdWx0aWxpYnMgZ2V0IGJ1aWx0LgorCitNb24gRGVjIDE4IDE3OjU1OjQ2IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGkzODYtd2luMzIpOiBEb24ndCBidWlsZCBleHBlY3QgaWYgd2UncmUgbm90CisJYnVpbGRpbmcgdGhlIHRjbCBzdWJkaXIuCisKK01vbiBEZWMgMTggMTE6NDc6MTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogKGNvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXMsIGFsbC10YXJnZXQtZXhhbXBsZXMpOgorCU5ldyB0YXJnZXRzLCBjb25maWd1cmUgYW5kIGJ1aWxkIGV4YW1wbGUgcHJvZ3JhbXMuCisKK0ZyaSBEZWMgMTUgMTY6MTM6MDMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlndXJlOiBJZiBhbiBtcHctY29uZmlnLmluIGdlbmVyYXRlZCBhIGZpbGUgbWsuc2VkLAorCXVzZSBpdCBhcyBpbnB1dCB0byBzZWRpdCB0aGUgZ2VuZXJhdGVkIE1QVyBtYWtlZmlsZS4KKwkqIG1wdy1SRUFETUU6IEFkZCBhIHN1Z2dlc3Rpb24gYWJvdXQgR2VzdGFsdC5oLgorCitXZWQgRGVjIDEzIDE2OjQzOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogQWNjZXB0ICotKi1pZWVlKi4KKworVHVlIERlYyAxMiAxMTo1Mjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiBSZW1vdmUgJChUQVJHRVRfU1VCRElSKS4gIEZyb20KKwlSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgorCitNb24gRGVjIDExIDE1OjMxOjU4IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGhvc3Q9PXBvd2VycGMtcGUpOiBBZGQgbWFueSBkaXJlY3RvcmllcyB0byBub2NvbmZpZ2RpcnMKKwlmb3IgcG93ZXJwYy1wZSBuYXRpdmUuCisJKHRhcmdldD09aTM4Ni13aW4zMik6IGFkZCB0Y2wsIG1ha2UgdG8gbm9jb25maWdkaXJzIGlmIGNhbmFkaWFuIGNyb3NzLgorCSh0YXJnZXQ9PXBvd2VycGMtcGUpOiBkdXBsaWNhdGUgaTM4Ni13aW4zMiBlbnRyeS4KKworU2F0IERlYyAgOSAxNDo1ODoyOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRXhjbHVkZSB0YXJnZXQtbmV3bGliIGZvciBhbGwgdmVyc2lvbnMKKwlvZiB2eHdvcmtzLCBub3QganVzdCB2eHdvcmtzNS4xLgorCitNb24gRGVjICA0IDEyOjA1OjQwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIGV4ZWMtcHJlZml4LgorCitNb24gRGVjICA0IDEwOjIyOjUwIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBIUCBtb2RlbCA4MTYgbWFjaGluZXMgYXMgaGF2aW5nCisJYSBQQTEuMSBwcm9jZXNzb3IuCisKK01vbiBEZWMgIDQgMTI6Mzg6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IElnbm9yZSBuZXcgYXV0b2NvbmYgY29uZmlndXJlIG9wdGlvbnMuCisKK1RodSBOb3YgMzAgMTQ6NDU6MjUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCk6IEFkZCAtYW5zaSBmbGFnLiAgTkVDIGNvbXBpbGVyCisgCWRlZmF1bHRzIHRvIEsmUiBtb2RlLCBidXQgZG9lc24ndCBoYXZlIHZhcmFyZ3MuaCwgc28gd2UgaGF2ZSB0byAKKwljb21waWxlIGluIEFOU0kgbW9kZS4KKworVGh1IE5vdiAzMCAxNjo1NzozMyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAd29tYmF0LmdudS5haS5taXQuZWR1PgorCisJKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgUGVudGl1bSB1bmRlciBTQ08uCisJRnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgorCitXZWQgTm92IDI5IDEzOjQ5OjA4IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIHRhcmdldC1saWJpbyBvbiB2ODEwLSotKi4KKwkqIGNvbmZpZy9tdC12ODEwIChDQ19GT1JfVEFSR0VULCBBU19GT1JfVEFSR0VULCBBUl9GT1JfVEFSR0VULAorCVJBTkxJQl9GT1JfVEFSR0VUKTogU2V0IGFzIGFwcHJvcHJpYXRlIGZvciBORUMgdjgxMCB0b29sY2hhaW4uCisKK1dlZCBOb3YgMjkgMTI6MTI6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBnYXMgZm9yIGFscGhhLWRlYy1vc2YqLgorCitUdWUgTm92IDI4IDE3OjE2OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEZWZhdWx0IHRvIC0td2l0aC1zdGFicyBmb3Igc29tZSB0YXJnZXRzIGZvciB3aGljaAorCWl0IG1ha2VzIHNlbnNlOiBtaXBzKi0qLSosIGFscGhhKi0qLW9zZiosIGlbMzQ1XTg2Ki0qLXN5c3Y0KiBhbmQKKwlpWzM0NV04NiotKi11bml4d2FyZSouCisKK01vbiBOb3YgMjcgMTM6NDQ6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWctbWwuaW46IEdldCBsaXN0IG9mIG11bHRpZGlycyB1c2luZyBnY2MgLS1wcmludC1tdWx0aS1saWIKKwlyYXRoZXIgdGhhbiBiYXNpbmcgaXQgb24gdGhlIHRhcmdldC4gIFNpbXBsaWZ5IGhhbmRsaW5nIG9mIG9wdGlvbnMKKwljb250cm9sbGluZyB3aGljaCBkaXJlY3RvcmllcyB0byBjb25maWd1cmUuICBSZW1vdmUgZXh0cmFuZW91cworCXNsYXNoIGluIG11bHRpLWNsZWFuIHRhcmdldC4KKworRnJpIE5vdiAyNCAxNzoyOToyOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy1tbC5pbjogUHJlZml4IG1vcmUgdmFyaWFibGVzIHdpdGggbWxfIHNvIHRoZXkgZG9uJ3QgY29sbGlkZQorCXdpdGggY29uZmlndXJlJ3MuCisKK1dlZCBOb3YgMjIgMTE6Mjc6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IERvbid0IHR1cm4gLXYgaW50byAtLXYuCisKK1R1ZSBOb3YgMjEgMTY6NDg6MDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRhcmdhcmdzKTogRml4IHR5cG8uCisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgc3ltbGluay10cmVlLgorCitUdWUgTm92IDIxIDE0OjA4OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTdHJpcCAtLWhvc3QgYW5kIC0tdGFyZ2V0IG9wdGlvbnMgZnJvbQorCUNPTkZJR19BUkdVTUVOVFMsIGFuZCBhbHdheXMgY29uZmlndXJlIGZvciAtLWhvc3Qgb25seS4gIEFkZAorCS0td2l0aC1jcm9zcy1ob3N0IG9wdGlvbiB3aGVuIGJ1aWxkaW5nIHdpdGggYSBjcm9zcy1jb21waWxlci4KKwkqIGNvbmZpZ3VyZTogQ2Fub25pY2FsaXplIHRoZSBhcmd1bWVudHMgcHV0IGludG8gY29uZmlnLnN0YXR1cyBieQorCWFsd2F5cyB1c2luZyBgPScgZm9yIGFuIG9wdGlvbiB3aXRoIGFuIGFyZ3VtZW50LiAgUGFzcyBhIHByZXN1bWVkCisJLS1ob3N0IG9yIC0tdGFyZ2V0IGV4cGxpY2l0bHkuCisKK0ZyaSBOb3YgMTcgMTc6NTA6MzAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBNZXJnZSAtbWFjb3MqLCAtbWFnaWMqLCAtcGUqLCBhbmQgLXdpbjMyIGNhc2VzCisJaW50byBnZW5lcmFsIE9TIHJlY29nbml0aW9uIGNhc2UuCisKK0ZyaSBOb3YgMTcgMTc6NDI6MjUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBhZGQgdGFyZ2V0LXdpbnN1cCBvbmx5CisJZm9yIHdpbjMyIHRhcmdldCBzeXN0ZW1zLgorCitUaHUgTm92IDE2IDE0OjA0OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtbGliZ2xvc3MpOiBEZXBlbmQgdXBvbgorCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliLCBzaW5jZSB3aGVuIGxpYmdsb3NzIGlzIGJ1aWx0IGl0IGxvb2tzIHRvCisJc2VlIGlmIHRoZSBuZXdsaWIgZGlyZWN0b3J5IGV4aXN0cy4KKworV2VkIE5vdiAxNSAxNDo0Nzo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IFVzZSBjb25maWctbWwuaW4gaW5zdGVhZCBvZgorCWNmZy1tbC0qLmluLgorCitXZWQgTm92IDE1IDExOjQ1OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBIYW5kbGUgTEQgYW5kIExEX0ZPUl9UQVJHRVQgd2hlbiBjb25maWd1cmluZyBhCisJQ2FuYWRpYW4gQ3Jvc3MuCisKK1R1ZSBOb3YgMTQgMTU6MDM6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1pMzg2d2luMzI6IGFkZCBMRF9GT1JfVEFSR0VULgorCitUdWUgTm92IDE0IDE0OjU2OjExIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogYWRkIHRhcmdldC13aW5zdXAuCisJKHRhcmdldD09aTM4Ni13aW4zMik6IGFkZCBwYXRjaCBkaWZmIGZsZXggbWFrZSB0byAkbm9jb25maWdkaXJzLgorCSh0YXJnZXQ9PXBwY2xlLXBlKTogcmVtb3ZlIGxkIGZyb20gJG5vY29uZmlnZGlycy4KKworVHVlIE5vdiAxNCAwMToyNTo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogUGFzcyAtLXdpdGgtdGFyZ2V0LXN1YmRpci4KKwlQcmVzZXJ2ZSByZWxhdGl2ZSBwYXRoIG5hbWVzIGluICRzcmNkaXIuICBCdWlsZCBzeW1saW5rIHRyZWUgaWYKKwljb25maWd1cmluZyBjcm9zcyB0YXJnZXQgZGlyIGFuZCBzcmNkaXI9LiAoPSBubyBWUEFUSCBzdXBwb3J0KS4KKwkoY29uZmlndXJlLXRhcmdldC1saWJnKyspOiBEZXBlbmQgb24gY29uZmlndXJlLXRhcmdldC1saWJyeC4KKwkqIGNmZy1tbC1jb20uaW4sIGNmZy1tbC1wb3MuaW46IERlbGV0ZWQuCisJKiBjb25maWctbWwuaW46IE5ldyBmaWxlLgorCSogc3ltbGluay10cmVlOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZTogRW5zdXJlIHNyY2Rpcj0iLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCisKK01vbiBOb3YgMTMgMTI6MzQ6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctUkVBRE1FOiBDbGFyaWZ5IHNvbWUgcGhyYXNpbmcsIGFkZCBub3RlcyBhYm91dCBDb2RlV2FycmlvcgorCWluY2x1ZGVzIGFuZCBGTEVYX1NLRUxFVE9OIHNldHRpbmcuCisJKiBtcHctY29uZmlndXJlICgtLXdpdGgtZ251LWxkKTogTmV3IG9wdGlvbiwgY29udHJvbHMgd2hldGhlcgorCXRvIHVzZSBQUENMaW5rIG9yIGxkIHdpdGggUG93ZXJNYWMgR0NDLgorCSogbXB3LWJ1aWxkLmluIChhbGwtZ3JleiwgZG8tZ3JleiwgaW5zdGFsbC1ncmV6KTogTmV3IHRhcmdldHMuCisJKiBtcHctY29uZmlnLmluOiBDb25maWd1cmUgZ3JleiBpZiB0YXJnZXRpbmcgTWFjLgorCisJKiBjb25maWcuc3ViOiBBY2NlcHQgcG1hYyBhbmQgcG1hYy1tcHcgYXMgbmFtZXMgZm9yIFBvd2VyTWFjcywKKyAJYWNjZXB0IG1wdyBhbmQgbWFjLW1wdyBhcyBuYW1lcyBmb3IgbTY4ayBNYWNzLCBjaGFuZ2UgbWFjb3M3IHRvCisgCWp1c3QgbWFjb3MuCisJKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSBncmV6IHJlc291cmNlIGNvbXBpbGVyIGlmIHRhcmdldGluZyBNYWMuCisJKiBNYWtlZmlsZS5pbiAoYWxsLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgorCitXZWQgTm92ICA4IDE3OjMzOjUxIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBDWFggZGVmYXVsdHMgdG8gZ2NjLCBub3QgZysrLiAgSWYgd2UgZmluZAorIAlnY2MgaW4gdGhlIHBhdGgsIHNldCBDQyB0byBnY2MgLU8yLgorCitUdWUgTm92ICA3IDE1OjQ1OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBEZWZhdWx0ICR7YnVpbGR9IGNvcnJlY3RseS4gIEF2b2lkIHBpY2tpbmcgdXAgZXh0cmEKKwlzcGFjZXMgd2hlbiByZWFkaW5nIENDIGFuZCBDWFggZnJvbSBNYWtlZmlsZS4gIFdoZW4gZG9pbmcgYQorCUNhbmFkaWFuIENyb3NzLCB1c2UgcGxhdXNpYmxlIGRlZmF1bHQgdmFsdWVzIGZvciBudW1lcm91cworCXZhcmlhYmxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogV2hlbiBkb2luZyBhIENhbmFkaWFuIENyb3NzLCBkb24ndCB0cnkgdG8KKwljb25maWd1cmUgdG9vbHMgd2hvc2UgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBoYW5kbGUgaXQuCisKK01vbiBOb3YgIDYgMTk6MzI6MTcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjZmctbWwtY29tLmluIChzaC0qLSopOiBBZGQgbTIgYW5kIG1sL20yIHRvIG11bHRpZGlycy4KKworU3VuIE5vdiAgNSAwMDoxNTo0MSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiAgUmVtb3ZlIGR1YmlvdXMgYnVnIHJlcG9ydGluZyBhZGRyZXNzLgorCitGcmkgTm92ICAzIDA4OjE3OjU0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogIElmIHN1YmRpciBoYXMKKwljb25maWd1cmUgc2NyaXB0LCBydW4gdGhhdCBpbnN0ZWFkIG9mIHRoaXMgZGlyZWN0b3J5J3MgY29uZmlndXJlLgorCUluIGVpdGhlciBjYXNlLCBwcmludCBhIG1lc3NhZ2UgdGhhdCB3ZSdyZSBjb25maWd1cmluZyB0aGUgc3ViLWRpci4KKworVGh1IE5vdiAgMiAyMzoyMzozNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBCZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdmFyaW91cyBmaWxlcywKKwl1c2Ugc2VkIHRvIGZpbHRlciBvdXQgInRhcmdldC0iLgorCitUaHUgTm92ICAyIDEzOjI0OjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERPX1gpOiBTcGxpdCBydWxlIHRvIGRlY3JlYXNlIGNvbW1hbmQgbGluZSBsZW5ndGgKKwlmb3Igc3lzdGVtcyB3aXRoIHNtYWxsIEFSR19NQVggdmFsdWVzLiAgRnJvbSBwaGRtQGluZm8udWNsLmFjLmJlCisJKFBoaWxpcHBlIERlIE11eXRlcikuCisKK1dlZCBOb3YgIDEgMTU6MTg6MzUgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhbGwtcGF0Y2gpOiBkZXBlbmQgb24gYWxsLWxpYmliZXJ0eS4KKworV2VkIE5vdiAgMSAxMjoyMzoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogSWYgdGhlIG9ubHkgZGlyZWN0b3J5IGluIHRhcmdldF9jb25maWdkaXJzIHdoaWNoCisJYWN0dWFsbHkgZXhpc3RzIGlzIGxpYmliZXJ0eSwgdGhlbiBzZXQgdGFyZ2V0X2NvbmZpZ2RpcnMgdG8gZW1wdHksCisJdG8gYXZvaWQgdHJ5aW5nIHRvIGJ1aWxkIGEgdGFyZ2V0IGxpYmliZXJ0eSBpbiBhIGdhcyBvciBnZGIKKwlkaXN0cmlidXRpb24uCisKK1R1ZSBPY3QgMzEgMTc6NTI6MzkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHNsYXZlLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogVXNlIG02OGstc3VuLXN1bm9zKiBpbnN0ZWFkCisgCW9mIG02OGstc3VuLSogd2hlbiBzZWxlY3RpbmcgbWgtc3VuMyB0byBhdm9pZCBtYXRjaGluZyBOZXRCU0Qvc3VuMworIAlzeXN0ZW1zLgorCitUdWUgT2N0IDMxIDE2OjU3OjMyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChjb3B5X2RpcnMpOiBVc2Ugc3lzLWluY2x1ZGUgaW5zdGVhZCBvZiBpbmNsdWRlCisJZm9yIC0td2l0aC1oZWFkZXJzIG9wdGlvbi4KKworVHVlIE9jdCAzMSAxMDoyOTozNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBNYWtlIHdpbnN1cCBidWlsZHMgd29yayB3aXRoCisJbmV3IHNjaGVtZS4KKworTW9uIE9jdCAzMCAxODo1NzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgdGhlIGxpbmtlciBvbiBBSVguCisKK01vbiBPY3QgMzAgMTI6Mjc6MTYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBDWFhfRk9SX1RBUkdFVCk6ICBBZGQgJChUQVJHRVRfU1VCRElSKQorCXdoZXJlIG5lZWRlZC4KKworTW9uIE9jdCAzMCAxMjo0NToyNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogRml4IHR5cG8uCisKK1NhdCBPY3QgMjggMTA6Mjc6NTkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICgkKENIRUNLX1RBUkdFVF9NT0RVTEVTKSk6ICBGaXggdHlwby4KKworRnJpIE9jdCAyNyAyMzoxNDoxMiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiAgUmVuYW1lIGxpYkZPTyB0byB0YXJnZXQtbGliRk9PLCBhbmQgeGliZXJ0eQorCXRvIHRhcmdldC14aWJlcnR5LCB0byBwcm92aWRlIG1vcmUgZmxleGliaWxpdHkuCisJKHRhcmdldF9zdWJkaXIpOiAgRGVmaW5lLiAgQ3JlYXRlIGlmIGNyb3NzLgorCVNldCBUQVJHRVRfU1VCRElSIGluIE1ha2VmaWxlIHRvICR7dGFyZ2V0X3N1YmRpcn0uCisJKiBNYWtlZmlsZS5pbjogIFJlbmFtZSBhbGwtbGliRk9PIC0+IGFsbC10YXJnZXQtbGliRk9PLCBhbGwteGliZXJ0eQorCS0+IGFsbC10YXJnZXQtbGliaWJlcnR5LCBjb25maWd1cmUtbGliRk9PIC0+IGNvbmZpZ3VyZS10YXJnZXQtbGliRk9PLAorCWNoZWNrLWxpYkZPTyAtPiBjaGVjay10YXJnZXQtbGliRk9PLCBldGMuCisJKCQoRE9fWCkpOiAgSXRlcmF0ZSBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFmdGVyIFNVQkRJUlMuCisJKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSwgJChDSEVDS19UQVJHRVRfTU9EVUxFUyksCisJJChBTExfVEFSR0VUX01PRFVMRVMpLCAkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpKTogVXBkYXRlIGFjY29yZGluZ2x5LgorCShjb25maWd1cmUtdGFyZ2V0LVhYWCk6ICBEZXBlbmQgb24gJChBTExfR0NDKSwgbm90IGFsbC1nY2MsIHRvCisJYWxsb3cgQUxMX0dDQz0iIiB0byBvbmx5IGNvbmZpZ3VyZS4KKwkoREVWT19TVVBQT1JUKTogIEFkZCBjZmctbWwtY29tLmluIGFuZCBjZmctbWwtcG9zLmluLgorCShFVENfU1VQUE9SVCwgRVRDX1NVUFBPUlRfUEZYKTogIE1lcmdlOyAgdXBkYXRlICd0YXonIGFjY29yZGluZ2x5LgorCShMSUJHWFhfU1VQUE9SVF9ESVJTKTogIFJlbW92ZSB4aWJlcnR5LgorCitTYXQgT2N0IDI4IDAxOjUzOjQ5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodGF6KTogQnVpbGQgImluZm8iIGluIGV0YyBleHBsaWNpdGx5LgorCitGcmkgT2N0IDI3IDA5OjMyOjMwIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIE1ha2Ugc3VyZSB0aGF0IENDIGlzIHVuZGVmaW5lZCAoYXMgb3Bwb3NlZCB0bworCW51bGwpIGlmIHRvcGxldmVsL2NvbmZpZy9taC17aG9zdH0gZG9lc24ndCBkZWZpbmUgaXQuICBGaXhlcyBhCisJcHJvYmxlbSB3aXRoIGF1dG9jb25mIHRyeWluZyB0byBjb25maWd1cmUgb24gYSBob3N0IHdpdGhvdXQgR0NDLgorCitUaHUgT2N0IDI2IDIyOjM1OjAxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZ3VyZTogU2V0IGhvc3QgYWxpYXMgZnJvbSBjaG9pY2Ugb2YgaG9zdCBjb21waWxlciwKKwlvbmx5IHVzZSBnZW5lcmljIE1QVyBNYWtlZmlsZSBzZWQgaWYgcHJlc2VudCwgZWRpdCBhIGZpbGUKKwluYW1lZCAiaGFja2VkX01ha2VmaWxlLmluIiBpbnN0ZWFkIG9mICJNYWtlZmlsZS5pbiIgaWYgcHJlc2VudC4KKwkqIG1wdy1SRUFETUU6IEFkZCBwcm9ibGVtIG5vdGVzIGFib3V0IENXNiBhbmQgQ1c3LgorCitUaHUgT2N0IDI2IDA1OjQ1OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodGF6KTogVXNlICI7IiBpbnN0ZWFkIG9mICI7OyIuCisKK1dlZCBPY3QgMjUgMTU6MTg6MjQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICh0YXopOiAgR3JlcCBmb3IgJ15kaXN0c3R1ZmY6JyBvciAnXmluZm86JyBpbgorCXN1Yi1kaXJlY3RvcnkgTWFrZWZpbGVzLCBpbnN0ZWFkIG9mIHVzaW5nIERJU1RTVFVGRkRJUlMgYW5kCisJRElTVERPQ0RJUlMuCisJKERJU1RTVFVGRkRJUlMsIERJU1RET0NESVJTKTogIFJlbW92ZWQgLSBubyBsb25nZXIgdXNlZC4KKwkobmV3bGliLnRhci5neik6ICBEb24ndCBwYXNzIERJU1RET0NESVJTIHRvIHJlY3Vyc2l2ZSBtYWtlLgorCitXZWQgT2N0IDI1IDE0OjQzOjU1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgUmVtb3ZlIGxkIGdwcm9mIGJudXRpbHMgZ2FzIGxpYmcrKyBnZGIKKwlhbmQgZ25hdHMsIGJlY2F1c2UgdGhleSBhcmUgbm93IHN1YnN1bWVkIGJ5IERJU1RTVFVGRkRJUlMuCisJTW92ZSBiZmQgdG8gRElTVFNUVUZGRElSUy4KKworVHVlIE9jdCAyNCAxODoxOTowOSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFgxMV9MSUIpOiBSZW1vdmVkLgorCShYMTFfRkxBR1NfVE9fUEFTUyk6IHBhc3Mgb25seSBYMTFfRVhUUkFfQ0ZMQUdTIGFuZCBYMTFfRVhUUkFfTElCUy4KKworCSogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcpOiBtaC1haXggJiBtaC1zdW4gcmVtb3ZlZC4KKworU3VuIE9jdCAyMiAxMzowNDo0MiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMqKTogU2hvcnRlbiBzb21lIG9mIHRoZSBtdWx0aWxpYiBkaXJlY3RvcnkKKwluYW1lcy4KKworRnJpIE9jdCAyMCAxODowMjoxMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMqLWVhYmkqKTogQWRkIG1jYWxsLWFpeGRlc2MgdmFyaWVudHMuCisKK1RodSBPY3QgMTkgMTA6NDA6NTcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLXdpbjMyKTogQWx3YXlzIGJ1aWxkIG5ld2xpYi4KKwlEb24ndCBjb25maWd1cmUgY3ZzLCBhdXRvY29uZiBvciB0ZXhpbmZvLgorCSogTWFrZWZpbGUuaW4gKExEX0ZPUl9UQVJHRVQpOiBOZXcuCisJKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTLCBDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgorCVBhc3MgZG93biBMRF9GT1JfVEFSR0VULgorCitXZWQgT2N0IDE4IDE1OjUzOjU2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHdpbnN1cDogTmV3IGRpcmVjdG9yeS4KKwkqIE1ha2VmaWxlLmluOiBCdWlsZCB3aW5zdXAuCisJKiBjb25maWd1cmUuaW46IFdpbnN1cCBpcyBjb25maWd1cmVkIHdoZW4gdGFyZ2V0IGlzIHdpbjMyLgorCUNhbiBvbmx5IGJ1aWxkIHdpbjMyIHRhcmdldCBHREIgd2hlbiBuYXRpdmUuCisJCitNb24gT2N0IDE2IDA5OjQyOjMxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE5IG1hY2hpbmVzIGFzIGhhdmluZworCWEgUEEgMS4xIHByb2Nlc3Nvci4KKworTW9uIE9jdCAxNiAxMDo0OTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogRml4IHNlZCBsb29wIHdoaWNoIHN1YnN0aXR1dGVzIGZvciBDQyBhbmQgQ1hYIHRvCisJYXZvaWQgYnVnIGZvdW5kIGluIHZhcmlvdXMgc2VkIGltcGxlbWVudGF0aW9ucy4KKworV2VkIE9jdCAxMSAxNjoxNjoyMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMtKi1lYWJpc2ltKTogRGVsZXRlIHNlcGFyYXRlIHJ1bGUgZm9yCisJc2ltdWxhdG9yLiAgVXNlIHN0YW5kYXJkIHBvd2VycGMtKi1lYWJpKi4KKworTW9uIE9jdCAgOSAxNzoyMTo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU3RvcCBwdXR0aW5nIGdhcyBhbmQgYmludXRpbHMgaW4gbm9jb25maWdkaXJzIGZvcgorCXBvd2VycGMtKi1haXgqIGFuZCByczYwMDAtKi0qLgorCitNb24gT2N0ICA5IDEyOjM4OjQwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0qKTogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nCisJLW1jYWxsLWFpeGRlc2MgbGlicmFyaWVzLgorCitGcmkgT2N0ICA2IDE2OjE3OjU3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlnLnN1YiAoYXJtIHwgYXJtZWwgfCBhcm1lYik6IEZpeCBzaGVsbCBzeW50YXguCisKK0ZyaSBPY3QgIDYgMTQ6NDA6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjZmctbWwtY29tLmluICh7cG93ZXJwYyxyczYwMDB9LWlibS1haXgqKTogQWRkIG11bHRpbGlicyBmb3IKKwktbXNvZnQtZmxvYXQgYW5kIC1tY3B1PWNvbW1vbiBzdXBwb3J0LgorCShwb3dlcnBjKi0qLWVhYmlzaW0qKTogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIC1tY2FsbC1haXgKKwlsaWJyYXJpZXMuCisKK1RodSBPY3QgIDUgMTM6MjY6MzcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFsbG93IGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkIG9mIGVtYWNzMTkgZm9yIHRoZSBhbHBoYS4KKworV2VkIE9jdCAgNCAyMjowNTozNiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChDQyk6IEdldCBeQ0MsIG5vdCBqdXN0IGFueSBvbGQgQ0MsIGZyb20KKwkke2hvc3RfbWFrZWZpbGVfZnJhZ30uCisKK1dlZCBPY3QgIDQgMjE6NTU6MDAgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBUcnkgdG8gZ2V0IENDIGZyb20gCisJJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfSwgbm90ICR7aG9zdF9tYWtlZmlsZV9mcmFnfS4KKworV2VkIE9jdCAgNCAyMTo0NDoxMiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogY29uZmlndXJlIHRhcmdldGRpcnMKKwlvbmx5IGlmIGl0IGV4aXN0cyBpbiAkKHNyY2RpcikuCisKK1dlZCBPY3QgIDQgMTE6NTI6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IElmIENDIGFuZCBDWFggYXJlIG5vdCBzZXQgaW4gdGhlIGVudmlyb25tZW50LCBzZXQKKwl0aGVtLCBiYXNlZCBvbiBlaXRoZXIgYW4gZXhpc3RpbmcgTWFrZWZpbGUgb3Igb24gc2VhcmNoaW5nIGZvciBnY2MKKwlpbiBQQVRILiAgU3Vic3RpdHV0ZSBmb3IgQ0MgYW5kIENYWCBpbiBNYWtlZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYm0gZnJvbSB0YXJnZXRfbGlicy4gIFNlcGFyYXRlCisJdGFyZ2V0X2NvbmZpZ2RpcnMgZnJvbSBjb25maWdkaXJzLiAgSWYgQ0MgaXMgbm90IHNldCBpbgorCWVudmlyb25tZW50LCB0cnkgdG8gZ2V0IGl0IGZyb20gYSBob3N0IE1ha2VmaWxlIGZyYWdtZW50LiAgUmV3cml0ZQorCWNoYW5nZXMgb2YgY29uZmlnZGlycyB0byB1c2Ugc2tpcGRpcnMgaW5zdGVhZC4gIEEgZmV3IG1pbm9yCisJdHdlYWtzLiAgVGFrZSBkaXJlY3RvcmllcyBvdXQgb2YgdGFyZ2V0X2NvbmZpZ2RpcnMgYXMgdGhleSBhcmUKKwl0YWtlbiBvdXQgb2YgY29uZmlnZGlycy4gIFJlbW92ZSBleGlzdGluZyBNYWtlZmlsZSBmaWxlcyBmcm9tCisJc3ViZGlyZWN0b3JpZXMuICBTdWJzdGl0dXRlIGZvciBUQVJHRVRfQ09ORklHRElSUyBhbmQKKwlDT05GSUdfQVJHVU1FTlRTIGluIE1ha2VmaWxlLgorCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogTmV3IHZhcmlhYmxlLCBhdXRvbWF0aWNhbGx5IHNldAorCWJ5IGNvbmZpZ3VyZS5pbi4KKwkoQ09ORklHX0FSR1VNRU5UUyk6IExpa2V3aXNlLgorCShDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBOZXcgdmFyaWFibGUuCisJKCQoRE9fWCkpOiBMb29wIG92ZXIgVEFSR0VUX0NPTkZJR0RJUlMgYXMgd2VsbCBhcyBTVUJESVJTLgorCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBOZXcgdGFyZ2V0LgorCShjb25maWd1cmUtbGliZysrLCBjb25maWd1cmUtbGliaW8pOiBOZXcgdGFyZ2V0cy4KKwkoYWxsLWxpYmcrKyk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS1saWJnKysuCisJKGFsbC1saWJpbyk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS1saWJpby4KKwkoY29uZmlndXJlLWxpYmdsb3NzLCBhbGwtbGliZ2xvc3MpOiBOZXcgdGFyZ2V0cy4KKwkoY29uZmlndXJlLWxpYnN0ZGMrKyk6IE5ldyB0YXJnZXQuCisJKGFsbC1saWJzdGRjKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGlic3RkYysrLgorCShjb25maWd1cmUtbGlicngsIGFsbC1saWJyeCk6IE5ldyB0YXJnZXRzLgorCShjb25maWd1cmUtbmV3bGliKTogTmV3IHRhcmdldC4KKwkoYWxsLW5ld2xpYik6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS1uZXdsaWIKKwkoY29uZmlndXJlLXhpYmVydHkpOiBOZXcgdGFyZ2V0LgorCShhbGwteGliZXJ0eSk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS14aWJlcnR5LgorCitTYXQgU2VwIDMwIDA0OjMyOjU5IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdCBpWzM0NV04Ni0qLXdpbjMyKTogIEV4cGFuZCB0aGUKKwlub2NvbmZpZ2RpcnMgYWdhaW4uCisKK1RodSBTZXAgMjggMjE6MTg6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlndXJlOiBGaXggc2VkIGNvbW1hbmQgZmlsZSBuYW1lLgorCitUaHUgU2VwIDI4IDE3OjM5OjU2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdCBpWzM0NV04Ni0qLXdpbjMyKTogUmVkdWNlIHRoZSAKKwlub2NvbmZpZ2RpcnMgYWdhaW4uCisKK1dlZCBTZXAgMjcgMTI6MjQ6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsZCBhbmQgZ2RiIGZvciBwb3dlcnBjKi0qLXdpbm50KgorCW9yIHBvd2VycGMqLSotcGUqLCBzaW5jZSB0aGV5IGFyZSBub3QgeWV0IHN1cHBvcnRlZC4KKworVHVlIFNlcCAyNiAxNDozMDowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlBZGQgUG93ZXJNYWMgc3VwcG9ydCBhbmQgbWFueSBvdGhlciBlbmhhbmNlbWVudHMuCisJKiBtcHctY29uZmlndXJlOiBOZXcgb3B0aW9uIC0tY2MgdG8gc2VsZWN0IGNvbXBpbGVyIHRvIHVzZSwKKwlwYXN0ZSBvcHRpb25zIHNldCBhY2NvcmRpbmcgdG8gLS1jYyBpbnRvIHRoZSBnZW5lcmF0ZWQKKwlNYWtlZmlsZSwgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlIGJ5IHNlZCdpbmcgdGhlIFVuaXggTWFrZWZpbGUuaW4KKwlpZiBtcHctbWFrZS5zZWQgaXMgcHJlc2VudC4KKwkqIG1wdy1jb25maWcuaW46IERvbid0IHRlc3QgZm9yIGdDMSwgdGVzdCBmb3IgbXB3LXRvdWNoLAorCWFkZCBmb3J3YXJkIGluY2x1ZGVzIGZvciBQb3dlclBDIGluY2x1ZGUgZmlsZXMuCisJKiBtcHctYnVpbGQuaW46IEJ1aWxkIHVzaW5nIE1ha2VmaWxlLlBQQyBpZiBwcmVzZW50LgorCShkby1ieWFjYywgZXRjKTogUmVtb3ZlIHNlcGFyYXRlIHZlcnNpb24gcmVzb3VyY2UgYnVpbGRzLgorCShkby1nYXMpOiBCdWlsZCAic3RhbXBzIiBiZWZvcmUgImFsbCIuCisJKGRvLWdjYyk6IEJ1aWxkICJzdGFtcHMtaCIgYW5kICJzdGFtcHMtYyIgYmVmb3JlICJhbGwiLgorCSogbXB3LVJFQURNRTogVXBkYXRlIHRvIHJlZmxlY3QgLS1jYyBvcHRpb24sIFBvd2VyTWFjIHN1cHBvcnQsCisJYW5kIHJlY2VudGx5LXJlcG9ydGVkIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCisKK0ZyaSBTZXAgMjIgMTI6MTU6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgorCisJKiBjZmctbWwtY29tLmluIChtNjgqLSotKik6IE9ubHkgYnVpbGQgbXVsdGlsaWJzIGZvcgorCWVtYmVkZGVkIG02OGsgc3lzdGVtcyAoLWFvdXQsIC1jb2ZmLCAtZWxmLCAtdnh3b3JrcykuCisJKC0td2l0aC1tdWx0aWxpYi10b3ApOiBQYXNzIHRvIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucy4KKworVHVlIFNlcCAxOSAxMzo1MTowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAYmx1ZXMuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGxpYmcrKyBhbmQgbGlic3RkYysrIG9uCisJdjgxMC0qLSouCisKK01vbiBTZXAgMTggMjM6MDg6MjYgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgYmZkLCBiaW51dGlscywgZ2FzLCBnY2MsCisJZ2RiLCBsZCBhbmQgb3Bjb2RlcyBvbiB2ODEwLSotKi4KKworU2F0IFNlcCAxNiAxODozMTowOCBQRFQgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyA8YW5nZWxhQGN5Z251cy5jb20+CisJCisJKiBjb25maWcvbWgtbmNyc3ZyNDM6IFJlbW92ZWQgQVJfRkxBR1MKKworVHVlIFNlcCAxMiAxODowMzozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChET19YKTogQ2hhbmdlIGRvLXJlYWxjbGVhbiB0byBkby1tYWludGFpbmVyLWNsZWFuLgorCShsb2NhbC1tYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KKwkobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCisJKHJlYWxjbGVhbik6IEp1c3QgZGVwZW5kIHVwb24gbWFpbnRhaW5lci1jbGVhbi4KKworRnJpIFNlcCAgOCAxNzoxMToxNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBnZGIgb24gbTY4ay0qLW5ldGJzZCouCisKK0ZyaSBTZXAgIDggMTY6NDY6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEJ1aWxkIGxkIGluIG1pcHMqLSotYnNkKiBjYXNlLgorCitUaHUgU2VwICA3IDIwOjAzOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBBY2NlcHQgLWxpdGVzKiBPUy4gIEZyb20gSWFuIERhbGwuCisKK0ZyaSBTZXAgIDEgMDg6MDY6NTggMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IHJlY29nbmlzZSBtaXBzNjR2cjQzMDAgYW5kIG1pcHM2NHZyNDMwMGVsIGFzIHZhbGlkCisgCXRhcmdldHMuCisKK1dlZCBBdWcgMzAgMjE6MDY6NTAgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogdHJlYXQgaTM4Ni13aW4zMiBjYW5hZGlhbiBjcm9zcyB0aGUgc2FtZSBhcworCWkzODYtZ28zMiBjYW5hZGlhbiBjcm9zcy4KKworVGh1IEF1ZyAyNCAxNDo1MzoyMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1jb20uaW4gKHBvd2VycGMqLSotZWFiaXNpbSk6IEFkZCBzdXBwb3J0IGZvciBQb3dlclBDCisJcnVubmluZyB1bmRlciB0aGUgc2ltdWxhdG9yIHRvIGJ1aWxkIGEgcmVkdWNlZCBzZXQgb2YgbGlicmFyaWVzLgorCShwb3dlcnBjLSotZWFiaWFpeCk6IEFkZCBmaW5lIGdyYWluZWQgbXVsdGlsaWIgc3VwcG9ydCBhZGRlZCB0bworCW90aGVyIHBvd2VycGMgdGFyZ2V0cyB5ZXN0ZXJkYXkuCisKK1dlZCBBdWcgMjMgMDk6NDE6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IEFkZCBzdXBwb3J0IGZvciAtZGlzYWJsZS1iaWVuZGlhbiwKKwktZGlzYWJsZS1zb2Z0ZmxvYXQsIC1kaXNhYmxlLXJlbG9jYXRhYmxlLCAtZGlzYWJsZS1haXgsIGFuZAorCS1kaXNhYmxlLXN5c3YgdG8gY29udHJvbCB3aGljaCBtdWx0aWxpYiBsaWJyYXJpZXMgZ2V0IGJ1aWx0LgorCitUaHUgQXVnIDE3IDE2OjAzOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBBZGQgTWFrZWZpbGUudGVtIHRvIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlIGluIHRyYXAKKwloYW5kbGVyLgorCitNb24gQXVnIDE0IDE5OjI3OjU2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3MgKCpMaW51eCopOiAgQWRkIG1pc3NpbmcgImV4aXQicy4KKwlBbHNvLCBuZWVkIHNwZWNpZmljIGNoZWNrIGZvciBhbHBoYS11bmtub3duLWxpbnV4ICh1c2VzIENPRkYpLgorCitGcmkgQXVnIDExIDE1OjM4OjIwIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSB3aXRoIEZTRjoKKworCVdlZCBKdW4gMjggMTc6NTc6MjcgMTk5NSAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+CisJKiBjb25maWcuZ3Vlc3MgKEFJWDQpOiBNb3JlIHJvYnVzdCByZWxlYXNlIG51bWJlcmluZyBkaXNjb3ZlcnkuCisKKwlUaHUgSnVuIDIyIDE5OjAxOjI0IDE5OTUgIEtlbm5ldGggU3RhaWxleSAgKGtzdGFpbGV5QGVhZ2xlLmRvbC1lc2EuZ292KQorCSogY29uZmlnLmd1ZXNzIChpMzg2LXNlcXVlbnQtcHR4KTogUHJvcGVybHkgZ2V0IHZlcnNpb24gbnVtYmVyLgorCisJVGh1IEp1biAyMiAxODozNjo0MiAxOTk1ICBVd2UgU2VpbWV0ICAoc2VpbWV0QGlyaXMxLmNoZW1pZS51bmkta2wuZGUpCisJKiBjb25maWcuZ3Vlc3MgKG1pcHM6Kjo0KjpVTUlQUyk6IE5ldyBjYXNlLgorCitNb24gQXVnICA3IDA5OjIxOjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni1nbzMyIGhvc3QpOiBGaXggdHlwbyAoZGVqYS1nbnUgLT4gZGVqYWdudSkuCisJKGkzODYtd2luMzIgaG9zdCk6IExpa2V3aXNlLiAgRG9uJ3QgYnVpbGQgcmVhZGxpbmUuCisKK0ZyaSBBdWcgIDQgMTM6MDQ6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChHREJfU1VQUE9SVF9ESVJTKTogQWRkIHV0aWxzLgorCShERVZPX1NVUFBPUlQpOiBBZGQgbXB3LVJFQURNRSwgbXB3LWJ1aWxkLmluLCBtcHctY29uZmlnLmggYW5kCisJbXB3LWNvbmZpZ3VyZS4KKworV2VkIEF1ZyAgMiAxNjozMjo0MCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChhcHBkaXJzKTogVXNlID0sIG5vdCA9PSwgaW4gdGVzdCBleHByZXNzaW9uIHdoZW4KKwl0cnlpbmcgdG8gYnVpbGQgdGhlIHRleHQgdG8gcHJpbnQgaW4gdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IKKwlTb2xhcmlzIHVzZXJzLgorCitNb24gSnVsIDMxIDA5OjU2OjE4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1jb20uaW4gKHo4ay0qLWNvZmYpOiBBZGQgJ3N0ZCcgbXVsdGlsaWIgYnVpbGQuCisKK0ZyaSBKdWwgMjggMDA6MTY6MzEgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGx5bngtMi4zLgorCitUaHUgSnVsIDI3IDE1OjQ3OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWIgKHo4a3NpbSk6IERlbGV0ZWQKKwkoejhrLSotY29mZik6IE5ldywgdGhpcyBpcyB0aGUgb25lIHRydWUgbmFtZSBvZiB0aGUgdGFyZ2V0LgorCitUaHUgSnVsIDI3IDE0OjMzOjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1wb3MuaW4gKGRvdGRvdCk6IFdvcmsgYXJvdW5kIFN1bk9TIHNlZCBidWcuCisKK1RodSBKdWwgMjcgMTM6MzE6MDUgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBGaXJzdCB0cnkgYXNraW5nIHRoZSBsaW5rZXIgd2hhdCB0aGUKKwlkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcyAoZWxmLCBhb3V0LCBvciBjb2ZmKS4gIFRoZW4gaWYgdGhpcworCWZhaWxzLCB0cnkgcHJldmlvdXMgbWV0aG9kcy4KKworVGh1IEp1bCAyNyAxMToyODoxNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciAqLSotdnh3b3JrczUuMS4KKworVGh1IEp1bCAyNyAxMToxODo0NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBhMjlrLSotdnh3b3JrczUuMS4KKwkqIHRlc3QtYnVpbGQubWs6IEFkZCBzZXR0aW5nIG9mIC0td2l0aC1oZWFkZXJzIGZvciBhMjlrLXZ4d29ya3M1LjEuCisKK1R1ZSBKdWwgMjUgMjE6MjU6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2ZnLW1sLXBvcy5pbiAoTVVMVElUT1ApOiBUcmltIGV4Y2VzcyB0cmFpbGluZyAiLy4iLgorCitGcmkgSnVsIDIxIDEwOjQxOjEyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNmZy1tbC1jb20uaW46IE5ldyBmaWxlLgorCSogY2ZnLW1sLXBvcy5pbjogTmV3IGZpbGUuCisKK1dlZCBKdWwgMTkgMDA6Mzc6MjcgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIENPUFlJTkcuTkVXTElCOiBBZGQgSFAgZnJlZSBjb3B5cmlnaHQgdG8gbGlzdC4KKworVHVlIEp1bCAxOCAxMDo1ODo1MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtZWFiaSogZm9yIHRoZSBzeXN0ZW0sIG5vdCBqdXN0IC1lYWJpLgorCitNb24gSnVsICAzIDEzOjQ0OjUxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIE1ha2ZpbGUuaW4gKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldyBuYW1lLCBwYXNzIGl0IGRvd24uCisJKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW4gKHdpbjMyKTogTmV3IHRhcmdldCBhbmQgaG9zdC4KKworV2VkIEp1biAyOCAyMzo1NzowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LXBlIGNvbmZpZ3VyYXRpb24uCisKK0ZyaSBKdW4gMjMgMTQ6Mjg6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQiBhZnRlciBMRC4KKworVGh1IEp1biAyMiAxNzoxMDo1MyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW4gKGVsZi9taXBzLmgpOiBBbHdheXMgZm9yd2FyZC1pbmNsdWRlLCBuZWVkZWQKKwlmb3IgR0RCIHRvIGJ1aWxkLgorCitXZWQgSnVuIDIxIDE1OjE3OjMwIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KKworCSogdGVzdHN1aXRlOiBOZXcgZGlyZWN0b3J5IGZvciBjdXN0b21lciBhY2NlcHRhbmNlIGFuZCB3aG9sZSB0b29sCisJY2hhaW4gdGVzdHMuCisKK1dlZCBKdW4gMjEgMTY6NTA6MjkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBJZiBwZXItaG9zdCBsaW5lIGlzbid0IGZvdW5kLCBidXQgQUNfT1VUUFVUIGlzIGZvdW5kCisJYW5kIGEgY29uZmlndXJlIHNjcmlwdCBleGlzdHMsIHJ1biBpdCBpbnN0ZWFkLgorCitUaHUgSnVuIDE1IDIxOjA5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YsIGZvciBhbHBoYS1kZWMtd2lubnQzLjUgYW5kICBDcmF5cy4KKworVHVlIEp1biAxMyAyMTo0MzoyNyAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogU2V0IGJ1aWxkX3tjcHUsdmVuZG9yLG9zLGFsaWFzfSB0byBob3N0IHZhbHVlcyB3aGVuCisJLS1idWlsZCBpc24ndCBzcGVjaWZpZWQuCisKK01vbiBKdW4gIDUgMTg6MjY6MzYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChQSUNGTEFHLCBQSUNGTEFHX0ZPUl9UQVJHRVQpOiBOZXcgbWFjcm9zLgorCShGTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgorCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KKworCSogY29uZmlnL20/LSpwaWM6IERlZmluZSBQSUNGTEFHKiBpbnN0ZWFkIG9mIExJQipGTEFHUyouCisKK1dlZCBNYXkgMzEgMjI6Mjc6NDIgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWxpYmcrKyk6IERlcGVuZCBvbiBhbGwtbGlic3RkYysrLgorCitUaHUgTWF5IDI1IDIyOjQwOjU5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgYWxsIHBhY2thZ2VzIGZvcgorCSAgaTM4Ni11bmtub3duLW5ldGJzZC4KKworU2F0IE1heSAyMCAxMzoyMjozMSAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGNvbmZpZ3VyZSB0ayBmb3IgaTM4Ni1nbzMyCisJaG9zdGVkIGJ1aWxkcyAoRE9TIGJ1aWxkcykKKworVGh1IE1heSAxOCAxODowODo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+CisKKwlDaGFuZ2VzIGZvciBBUk0gYmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJpY2hhcmQgRWFybnNoYXc6CisJKiBjb25maWcuc3ViOiBIYW5kbGUgYXJtZWIgYW5kIGFybWVsLgorCSogY29uZmlndXJlLmluOiBPbWl0IGFybSBsaW5rZXIgb25seSBmb3IgcmlzY2l4LgorCitUaHUgTWF5IDExIDE3OjIzOjI2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YuCisKK1R1ZSBNYXkgIDkgMTU6NTI6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgdGhlIGxpdHRsZSBlbmRpYW4gdmFyaWVudCBvZgorCXRoZSBQb3dlclBDLiAgUmVjZ29uaXplIHBwYyBhcyBhIFBvd2VyUEMgdmFyaWFudCwgYW5kIHBwY2xlIGFzIGEKKwlwb3dlcnBjbGUgdmFyaWFudC4gIENvbnZlcnQgcGVudGl1bSBpbnRvIGk1ODYsIG5vdCBpNDg2LiAgQWRkIHA1CisJYWxpYXMgZm9yIGk1ODYuICBNYXAgbmV3IHg4NiB2YXJpYW50cyBwNiwgazUsIG5leGdlbiBpbnRvIGk1ODYKKwl0ZW1wb3JhcmlseS4KKworVHVlIE1heSAgMiAxNjoyOTo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGxpa2UgaHBwYSotKi0qZWxmKi4KKworU3VuIEFwciAzMCAyMTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KKworVGh1IEFwciAyNyAxMTozMzoyOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IENoZWNrIGZvciB3aGV0aGVyIHRoZSBwcmUtQkZEIGxpbmtlciBpcworCWluc3RhbGxlZCwgYW5kIGlmIHNvIHJldHVybiBsaW51eG9sZGxkIGFzIHRoZSBzeXN0ZW0gbmFtZS4KKworV2VkIEFwciAyNiAxMDo1OTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnLmd1ZXNzOiBBZGQgaHBwYTEuMS1ocC1saXRlcyBzdXBwb3J0LgorCitUdWUgQXByIDI1IDExOjA4OjExIDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBuZXdsaWIgZm9yIG02OGstdnh3b3JrczUuMS4KKworV2VkIEFwciAxOSAxNzowMjo0MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeDYpOiBVc2UgbWgtaXJpeDUuCisKK0ZyaSBBcHIgMTQgMTU6MjE6MTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IERlcGVuZCBvbiBhbGwtbGQgKGZvciBsaWJnY2MxLXRlc3QpLgorCitXZWQgQXByIDEyIDE2OjA2OjAxIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiB0ZXN0LWJ1aWxkLm1rOiBFbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBJUklYIDUgYW5kCisgICAgICAgIE9TRi8xLiAgRml4IGNvbXBpbGVyIGZsYWdzLgorCSogYnVpbGQtYWxsLm1rOiBTdXBwb3J0IExpbnV4IGFuZCBPU0YvMSAzLjAuICBGaXggY29tcGlsZXIgZmxhZ3MuCisKK1R1ZSBBcHIgMTEgMTg6NTU6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi4KKwkoc3BhcmMtKi1zdW5vczQqKTogQnVpbGQgc2ltLCBkZWphZ251LCBleHBlY3QsIHRjbCBpZiBjcm9zcyB0YXJnZXQuCisKK01vbiBBcHIgMTAgMTE6NDI6MjIgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCisJKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKKworCSogbXB3LWNvbmZpZy5pbjogQWRkIGdlbmVyaWMgaW5jbHVkZSBmb3J3YXJkcyBmb3IgY3B1LXNwZWNpZmljCisJaW5jbHVkZSBmaWxlcyBpbiBhb3V0IGFuZCBlbGYgZGlyZWN0b3JpZXMuCisKKwkqIG1wdy1jb25maWd1cmU6IEFkZGVkIGNvcHlyaWdodC4KKwkqIG1wdy1jb25maWcuaW46IENoZWNrIGZvciBwcmVzZW5jZSBvZiByZXF1aXJlZCBidWlsZCB0b29scy4KKwkodGFyZ2V0X2xpYnMpOiBBZGQgbmV3bGliLgorCSh0YXJnZXRfdG9vbHMpOiBBZGQgZXhhbXBsZXMuCisJKFJlYWQgTWUpOiBHZW5lcmF0ZSBhcyAiUmVhZCBNZSBmb3IgTVBXIiBpbnN0ZWFkLgorCSogbXB3LWJ1aWxkLmluOiBCYXNlIHN1Yi1idWlsZHMgb24gYWxsLWZvbyBpbnN0ZWFkIG9mIGRvLWZvby4KKwkoYWxsLWJ5YWNjLCBkby1ieWFjYywgYWxsLWZsZXgsIGRvLWZsZXgsIGRvLW5ld2xpYik6IE5ldyBhY3Rpb25zLgorCShkby1nYXMsIGRvLWdjYywgZG8tZ2RiLCBkby1sZCk6IEJ1aWxkIFZlcnNpb24uciBmaXJzdC4KKworCSogbXB3LWNvbmZpZ3VyZTogUmVtb3ZlIHN1YmRpci1zcGVjaWZpYyBtYWtlZmlsZSBoYWNrZXJ5LAorCWRlbGV0ZSBtay50bXAgYWZ0ZXIgdXNpbmcgaXQuCisKKwkqIG1wdy1idWlsZC5pbiAoYWxsKTogRGlzcGxheSBzdGFydCBhbmQgZW5kIHRpbWVzLgorCisJKiBtcHctY29uZmlndXJlIChob3N0X2Nhbm9uaWNhbCk6IFNldC4KKwkodGFyZ2V0X2NwdSk6IEFsd2F5cyBhZGQgdG8gbWFrZWZpbGVzLgorCShBUkNIREVGUywgRU1VTCk6IEFkZCB0byBtYWtlZmlsZSBvbmx5IGlmIG5vbmVtcHR5LgorCShUTV9GSUxFLCBYTV9GSUxFLCBOTV9GSUxFKTogTm8gbG9uZ2VyIGFkZCB0byBtYWtlZmlsZS4KKwkobXB3LW1oLW1wdyk6IExvb2sgZm9yIGluIHNyY2RpciBhbmQgc3Jjcm9vdC4KKwlVc2Ugc2VkIGluc3RlYWQgb2YgbXB3LWVkaXQtcHJlZml4IHRvIGVkaXQgcHJlZml4IGRlZmluaXRpb25zLgorCisJKiBtcHctYnVpbGQuaW46IChpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgorCisJKiBtcHctY29uZmlndXJlIChob3N0X2FsaWFzLCB0YXJnZXRfYWxpYXMpOiBSZW5hbWUgZnJvbSBob3N0YWxpYXMKKwlhbmQgdGFyZ2V0YWxpYXMsIGFkZCBpbnRvIGdlbmVyYXRlZCBNYWtlZmlsZS4KKwkobWsudG1wKTogSWYgcHJlc2VudCwgYWRkIGludG8gZ2VuZXJhdGVkIE1ha2VmaWxlLgorCSogbXB3LWJ1aWxkLmluIChhbGwtZ2FzKTogQnVpbGQgY29uZmlnLmggZmlyc3QgYmVmb3JlIGdhcyBwcm9wZXIuCisKKwkqIG1wdy1jb25maWd1cmUgKGNvbmZpZy5zdGF0dXMpOiBXcml0ZSBvbmx5IGlmIGNoYW5nZWQuCisJKiBtcHctY29uZmlnLmluIChyZWFkbGluZSk6IENvbmZpZ3VyZSBpdCAobm90IGJ1aWx0LCBqdXN0IHVzZWQgZm9yCisJZGVmaW5pdGlvbnMpLgorCisJKiBtcHctY29uZmlnLmluIChlbGYvbWlwcy5oKTogQWRkIGEgZm9yd2FyZCBpbmNsdWRlLgorCisJKiBtcHctY29uZmlnLmluOiBGb3J3YXJkLWluY2x1ZGUgbW9zdCAuaCBmaWxlcyBpbiBpbmNsdWRlIGludG8KKwlleHRyYS1pbmNsdWRlLgorCShyZWFkbGluZSk6IERvbid0IGJ1aWxkLgorCW1wdy1idWlsZC5pbiAoaW5zdGFsbCk6IEluc3RhbGwgR0RCLgorCisJKiBtcHctY29uZmlndXJlIChwcmVmaXgsIG1wd19wcmVmaXgpOiBIYW5kbGUgaXQuCisJKiBtcHctY29uZmlnLmluIChtbWFsbG9jLCByZWFkbGluZSk6IERvbid0IGNvbmZpZ3VyZS4KKwkqIG1wdy1idWlsZC5pbiAodGhpc3NjcmlwdCk6IFJlbmFtZSB0byBUaGlzU2NyaXB0LgorCVVzZSBtcHctYnVpbGQgaW5zdGVhZCBvZiBCdWlsZFByb2dyYW0gZXZlcnl3aGVyZS4KKwkobW1hbGxvYywgcmVhZGxpbmUpOiBEb24ndCBidWlsZC4KKwkqIG1wdy1SRUFETUU6IE5ldyBmaWxlLCBiYXNpYyBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBNUFcgcG9ydC4KKworCSogbXB3LWNvbmZpZy5pbjogVXNlIGZvcndhcmQtaW5jbHVkZSB0byBjcmVhdGUgaW5jbHVkZSBmaWxlcy4KKworCSogbXB3LWNvbmZpZ3VyZTogQWRkIG1vcmUgdGhpbmdzIHRvIHRoZSB0b3Agb2YgZWFjaCBjb25maWd1cmVkCisJTWFrZWZpbGUsIGluY2x1ZGluZyBjb250ZW50cyBvZiBjb25maWcvbXB3LW1oLW1wdy4KKwkqIG1wdy1jb25maWcuaW4gKGV4dHJhLWluY2x1ZGUpOiBDcmVhdGUgdGhpcyBkaXJlY3RvcnkgYW5kIGZpbGwgaXQKKwl3aXRoIFBvc2l4LWxpa2UgaW5jbHVkZSBmaWxlcyB3aGVuIGNvbmZpZ3VyaW5nLgorCisJKiBjb25maWcuc3ViIChhcHBsZSwgbWFjLCBtcHcpOiBBZGQgdmFyaW91cyBhbGlhc2VzLgorCisJKiBtcHctYnVpbGQuaW46IE5ldyBmaWxlLCB0b3AtbGV2ZWwgYnVpbGQgc2NyaXB0IGZyYWdtZW50IGZvciBNUFcuCisJKiBtcHctY29uZmlndXJlOiBOZXcgZmlsZSwgY29uZmlndXJlIHNjcmlwdCBmb3IgTVBXLgorCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIGNvbmZpZyBmcmFnbWVudCBmb3IgTVBXLgorCitGcmkgQXByICA3IDE5OjMzOjE2IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfbGlicyk6IFJlbW92ZSBnbG9iLCBzaW5jZSBpdCBpcyBnb25lIGZyb20gdGhlCisJc291cmNlcy4KKworRnJpIE1hciAzMSAxMTozNjoxNyAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGRlZmluZSBlbXB0eSBHREJfTkxNX0RFUFMgdmFyLgorCisJKiBjb25maWd1cmUuaW4odGFyZ2V0X21ha2VmaWxlX2ZyYWcpOiB1c2UgY29uZmlnL210LW5ldHdhcmUKKwlmb3IgbmV0d2FyZSB0YXJnZXRzLgorCitUaHUgTWFyIDMwIDEzOjUxOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogTWVyZ2UgaW4gcmVjZW50IEZTRiBjaGFuZ2VzLiAgUmVtb3ZlIGxpbnV4IHNwZWNpYWwKKwljYXNlcy4KKworVHVlIE1hciAyOCAxNDo0NzozNCAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJYnVpbGQtYWxsLm1rLGNvbmZpZy9taC1zb2xhcmlzOiAgcmV2ZXJ0IHRoZXNlIHR3byBjaGFuZ2VzOgorCisJVHVlIE1hciAzMCAxMDowMzowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkJKiBidWlsZC1hbGwubWs6IFVzZSBDQz1jYyAtWHMgb24gU29sYXJpcy4KKworCU1vbiBNYXIgMjkgMTk6NTk6MjYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJCSogY29uZmlnL21oLXNvbGFyaXM6IFN1blBSTyBDIG5lZWRzIC1YcyB0byBiZSBhYmxlIHRvIGdldCBhCisJCXdvcmtpbmcgeG1ha2VmaWxlIGZvciBFbWFjcy4KKworVHVlIE1hciAyMSAxMDo0MzozMiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2xvYi8qOiBSZW1vdmVkLiAgU2NoYXVlcidzIDI0IEZlYiAxOTk0IHJlYWRsaW5lIGNoYW5nZSBtYWRlIHVzCisJc3RvcCB1c2luZyBpdC4KKwkqIE1ha2VmaWxlLmluOiBOdWtlIGFsbCByZWZlcmVuY2VzIHRvIGdsb2Igc3ViZGlyZWN0b3J5LgorCitUaHUgTWFyIDE2IDEzOjM1OjMwIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEZpeCAtLWVuYWJsZS1zaGFyZWQgbG9naWMgaW4gcGVyLWhvc3QuCisKK01vbiBNYXIgMTMgMTI6MzM6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKCotaHAtaHB1eFs3OF0qKTogVXNlIG1oLWhwdXg4LgorCitNb24gTWFyICA2IDEwOjIxOjU4IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERvbid0IGJ1aWxkIGdhcyBvbiBBSVgsIGZvcgorCXBvd2VycGMqLSotYWl4KiBhcyB3ZWxsIGFzIGZvciByczYwMDAqLSotYWl4Ki4KKworV2VkIE1hciAgMSAxMjo1MTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogRml4IC0tY2FjaGUtZmlsZSB0byB3b3JrIGlmIHRoZSBmaWxlIGFyZ3VtZW50IGlzIGEKKwlyZWxhdGl2ZSBwYXRoLgorCitUdWUgRmViIDI4IDE3OjM2OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBJZiB0aGUgLS1jYWNoZS1maWxlIGlzIHVzZWQsIHBhc3MgaXQgZG93biB0bworCWNvbmZpZ3VyZSBpbiBzdWJkaXJlY3Rvcmllcy4KKworTW9uIEZlYiAyNyAxMjo1Mjo0NiAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBhZGQgdnh3b3JrczI5ayBjb25maWd1cmF0aW9uLgorCitGcmkgRmViIDEwIDE2OjEyOjI2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICh0YXopOiBEbyAiZGlzdHN0dWZmIiBwYXJ0IHF1aWV0bHkuCisKK1N1biBGZWIgIDUgMTQ6MTY6MzUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnN1YjogTWluaS1tZXJnZSB3aXRoIGdjYy9jb25maWcuc3ViLgorCitTYXQgRmViICA0IDEyOjExOjM1IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmd1ZXNzIChJUklYKTogU2VkIC0gdG8gXy4KKworRnJpIEZlYiAgMyAxMTo1NDo0MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChzb3VyY2UtdmF1bHQsIGJpbmFyeS12YXVsdCk6IE5ldyB0YXJnZXRzLgorCitUaHUgSmFuIDI2IDEzOjAwOjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBSZWNvZ25pemUgLWVhYmkgYXMgYSBiYXNpYyBzeXN0ZW0gdHlwZS4KKworVGh1IEphbiAxMiAxMzoxMzoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChlbmFibGVfc2hhcmVkIHN0dWZmKTogRml4IHR5cG8uCisKK1RodSBKYW4gMTIgMDE6MzY6NTEgMTk5NSAgZGVhbm1AbWVkdWxsYS5MQUJTLlRFSy5DT00gKERlYW4gTWVzc2luZykKKworCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IEZpeCB0eXBvIGluIHBhc3NpbmcgTElCQ1hYRkxBR1MqLgorCitXZWQgSmFuIDExIDE2OjI5OjUzIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IEFkZCAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcy4KKworTW9uIEphbiAgOSAxMjo0ODowMSAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChyczYwMDAtKi0qKTogRG9uJ3QgYnVpbGQgZ2FzLgorCitXZWQgSmFuICA0IDIzOjUzOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFVzZSAveC94LyBpbnN0ZWFkIG9mIC9icm9rZW5zZWQvYnJva2Vuc2VkLywgdG8KKwlyZWR1Y2UgY29tbWFuZCBsaW5lIGxlbmd0aC4KKwkoQVNfRk9SX1RBUkdFVCk6IENoZWNrIGZvciBhcy5uZXcsIG5vdCBNYWtlZmlsZS4KKwkoTk1fRk9SX1RBUkdFVCk6IENoZWNrIGZvciBubS5uZXcsIG5vdCBNYWtlZmlsZS4KKworV2VkIEphbiAgNCAxMzowMjozOSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0YuCisKK1RodSBEZWMgMTUgMTc6MTE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IERvbid0IHVzZSAkIHdoZW4gaGFuZGxpbmcgcHJvZ3JhbV9zdWZmaXguCisKK01vbiBEZWMgMTIgMTI6MDk6MzcgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQ29uZmlndXJlIHRrIGZvciBocHBhL2hwdXguCisKK0ZyaSBEZWMgIDIgMTU6NTU6MzggMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChMSUJHWFhfU1VQUE9SVF9ESVJTKTogIEFkZCBsaWJzdGRjKysuCisKK1R1ZSBOb3YgMjkgMTk6Mzc6NTYgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiAgTW92ZSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlIGZyb20gQ1hYRkxBR1MKKwl0byBMSUJDWFhGTEFHUy4gIFRlc3RzIGFyZSBiZXR0ZXIgcnVuIHdpdGhvdXQgaXQuCisKK1dlZCBOb3YgMjMgMTA6Mjk6MjUgMTk5NCAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWlzcGVsbCk6IERlcGVuZCBvbiBhbGwtZW1hY3MxOSBpbnN0ZWFkIG9mIGFsbC1lbWFjcy4KKworTW9uIE5vdiAyMSAxMToxNDowMSAxOTk0ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUqKTogRG9uJ3QgY29uZmlndXJlIHhpYmVydHkuCisKK01vbiBOb3YgMTQgMDg6NDk6MTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgUmVtb3ZlIHRrIGZyb20gbmF0aXZlX29ubHkgbGlzdC4KKworRnJpIE5vdiAxMSAxNTozMToyNiAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCisKKwkqIGJ1aWxkLWFsbC5tazogQWRkIG1pcHMtbmNkLWVsZiB0YXJnZXQgdG8gc3VuNCB0YXJnZXRzCisJICBmb3Igc3BlY2lhbCBOQ0QgYnVpbGQuCisKK01vbiBOb3YgIDcgMjA6NTg6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IFJlbW92ZSBjb25maWd1cmUuYmF0IGFuZAorCW1ha2VhbGwuYmF0LCB0aGV5J3JlIG9ubHkgdXNlZnVsIGZvciBiaW51dGlscyBzbmFwc2hvdHMuCisJKGJpbnV0aWxzLnRhci5neiwgZ2FzK2JpbnV0aWxzLnRhci5neik6IEFkZCBjb25maWd1cmUuYmF0IGFuZAorCW1ha2VhbGwuYmF0IHRvIHNwZWNpZmllZCBTVVBQT1JUX0ZJTEVTLgorCitNb24gTm92ICA3IDE3OjI1OjE4IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogYnVpbGQtYWxsLm1rOiBBZGQgRXJpY3Nzb24gdGFyZ2V0cyB0byBzdW40IGFuZCBzb2xhcmlzCisJICBob3N0cy4gIEFkZCAgQk5SJ3Mgc3VuNCB0YXJnZXQgdG8gc29sYXJpcyBob3N0LCBzbyB0aGVpcgorCSAgYnVpbGQtZnJvbS1zb3VyY2Ugd2lsbCBiZSB0ZXN0ZWQgaW4taG91c2UgZmlyc3QuCisKK1NhdCBOb3YgIDUgMTg6NDM6MzAgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChMSUJDRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKENGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCisJKExJQkNGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCisJKExJQkNYWEZMQUdTKTogRGl0dG8uCisJKENYWEZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KKwkoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgorCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIHRoZW0uCisJKEVYVFJBX1RBUkdFVF9GTEFHUyk6IERpdHRvLgorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy9tW3RoXS0qcGljOiBTdXBwb3J0IC0tZW5hYmxlLXNoYXJlZC4KKworU2F0IE5vdiAgNSAxNTo0NDowMCAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6ICBJbmNsdWRlIGxpYnN0ZGMrKyBhZ2Fpbi4KKwkqIGNvbmZpZy5ndWVzczogIFVwZGF0ZSBmcm9tIEZTRiAoZm9yIEZyZWVCU0QpLgorCitUaHUgTm92ICAzIDE2OjMyOjMwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBJbmNsdWRlIGNvbmZpZ3VyZS5iYXQgYW5kCisJbWFrZWFsbC5iYXQuCisJKERJU1RET0NESVJTKTogQWRkIGBldGMnLgorCShFVENfU1VQUE9SVF9QRlgpOiBOZXcgdmFyaWFibGUuCisJKHRheik6IEluY2x1ZGUgYW55dGhpbmcgZnJvbSBldGMgc3RhcnRpbmcgd2l0aCBhIHdvcmQgaW4KKwlFVENfU1VQUE9SVF9QRlguCisKK1dlZCBPY3QgMjYgMTY6MTk6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBVcGRhdGUgZm9yIHJlY2VudCBGU0YgY2hhbmdlcy4gIFJlbW92ZSBvYnNvbGV0ZQorCWg4MzAwaGRzIGVudHJ5LiAgQWRkIC13aW5kb3dzKiBhbmQgLW9zeCBhcyBiYXNpYyBvcy4gIE1pbm9yCisJc3BhY2luZyBjaGFuZ2VzLgorCitUaHUgT2N0IDIwIDE4OjQxOjU2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogIFJlbW92ZSBsaWJzdGRjKysgZm9yIGxpYmcrKy0yLjYuMS4KKworCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0YuCisJKiBjb25maWd1cmUuaW46ICBNYXRjaCBvbiBpPzg2LW5jci1zeXN2NC4zLCBub3QgaT84Ni1uY3Itc3lzdjQzLgorCitUaHUgT2N0IDIwIDE5OjI2OjU2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogU2luY2UgdGhlICJ0cmFwIDAiIGhhbmRsZXIgd2lsbCBvdmVycmlkZSB0aGUgZXhpdAorCXN0YXR1cyBvbiBtYW55IHN5c3RlbXMsIG9ubHkgdXNlIGl0IGZvciAiZXhpdCAxIiwgYW5kIG1ha2UgaXQgc2V0CisJYSBub24temVybyBleGl0IHN0YXR1czsgcmVzZXQgaXQgYmVmb3JlICJleGl0IDAiLiAgQWxzbywgY2hlY2sKKwlleGl0IHN0YXR1cyBvZiBjb25maWcuc3ViLCBhbmQgZXJyb3Igb3V0IGlmIGl0IGZhaWxlZC4KKworV2VkIE9jdCAxOSAxODo0OTo1NSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAoQUxMX1RBUkdFVF9NT0RVTEVTLElOU1RBTExfVEFSR0VUX01PRFVMRVMpIEJ1aWxkCisJYW5kIGluc3RhbGwgbGliZ2xvc3MuCisKK1R1ZSBPY3QgMTggMTU6MjU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWJpbnV0aWxzKTogRGVwZW5kIHVwb24gYWxsLWJ5YWNjLgorCisJKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGVtYWNzIG9uIElyaXggNS4KKworTW9uIE9jdCAxNyAxNjoyMjoxMiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUqKTogQWRkIGxpYmlvLgorCitUaHUgT2N0IDEzIDE1OjUxOjIwIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMX1RBUkdFVF9NT0RVTEVTKTogQWRkIGxpYnN0ZGMrKy4KKwkoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KKwkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgorCShUQVJHRVRfTElCUyk6IERpdHRvLgorCShhbGwtbGlic3RkYysrKTogTm90ZSBkZXBlbmRlbmNpZXMuCisKK1RodSBPY3QgMTMgMDE6NDM6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IEFkZCBnYXMuCisKK1R1ZSBPY3QgMTEgMTI6MTI6MjkgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IFVzZSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcyBpbnN0ZWFkIG9mCisJLWZleHRlcm5hbC10ZW1wbGF0ZXMuCisKKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiBBZGQgbGlic3RkYysrLgorCShub2NvbmZpZ2RpcnMpOiBBZGQgbGlic3RkYysrIGFzIGFwcHJvcHJpYXRlLgorCitUaHUgT2N0ICA2IDE4OjAwOjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YuCisKK1R1ZSBPY3QgIDQgMTI6MDU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nICR7Y29uZmlnc3VifS4KKworTW9uIE9jdCAgMyAxNDoyODozNCAxOTk0ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcuc3ViOiBObyBsb25nZXIgcmVjb2duaXplIGg4MzAwaC4KKworTW9uIE9jdCAgMyAxMjo0MDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5zdWI6IFJlbW92ZSBleHRyYW5lb3VzIGRpZmZlcmVuY2VzIGJldHdlZW4gY29uZmlnLnN1YiBhbmQKKwlnY2MvY29uZmlnLnN1Yi4KKworU2F0IE9jdCAgMSAwMDoyMzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGRElSUyk6IEFkZCBnYXMuCisKK1RodSBTZXAgMjIgMTk6MDQ6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogQ09QWUlORy5ORVdMSUI6IE5ldyBmaWxlLgorCitNb24gU2VwIDE5IDE4OjI1OjQwIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3MgKEhQLVVYKTogIFBhdGNoIGZyb20gSGFybGFuIFN0ZW5uCisJPGhhcmxhbkBsYW5kbWFyay5jb20+IHRvIGFsc28gZW1pdCByZWxlYXNlIGxldmVsLgorCitXZWQgU2VwICA3IDEzOjE1OjI1IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzIChzdW40KjpTdW5PUzoqOiopOiBDaGFuZ2UgJy1KTCcgdG8gJ19KTCcuCisKK1R1ZSBTZXAgIDYgMjM6MjM6MTggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6ICBNZXJnZSBuZXh0c3RlcCBjbGVhbnVwIGZyb20gRlNGLgorCitNb24gU2VwICA1IDA1OjAxOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGFybS0qLSopOiBEb24ndCBjb25maWd1cmUgbGQgZm9yIHRoaXMgdGFyZ2V0LgorCitUaHUgU2VwICAxIDA5OjM1OjAwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluICgqLSotbmV0d2FyZSk6IGRvbid0IGNvbmZpZ3VyZSBsaWJnKyssIGxpYmlvLAorCSAgbGlicngsIG9yIG5ld2xpYi4KKworV2VkIEF1ZyAzMSAxMzo1MjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtZGVjLW9zZiopOiBVc2Ugb3NmKiwgbm90IG9zZjEqLiAgRG9uJ3QKKwljb25maWd1cmUgbGQtLWl0IHdvcmtzLCBidXQgaXQgZG9lc24ndCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCisKK1N1biBBdWcgMjggMTg6MTM6NDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzcyAoKi11bmtub3duLWZyZWVic2QqKTogIEdldCByaWQgb2YgcG9zc2libGUKKwl0cmFpbGluZyAiKFJlbGVhc2UpIiBpbiB2ZXJzaW9uIHN0cmluZy4KKwlQYXRjaCBmcm9tIFBhdWwgUmljaGFyZHMgPHBhdWxAaXNsLmNmLmFjLnVrPi4KKworU2F0IEF1ZyAyNyAxNTowMDo0OSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiAgRml4IGk0ODYtbmNyLXN5c3Y0MyAtPiBpNDg2LW5jci1zeXN2NC4zLgorCUZpeCB0eXBlOiAqLW5leHQtbmVzdHN0ZXAgLT4gKi1uZXh0LW5leHRzdGVwLgorCisJKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRjoKKworCUZyaSBBdWcgMjYgMTg6NDU6MjUgMTk5NCAgUGhpbGlwcGUgRGUgTXV5dGVyIChwaGRtQGluZm8udWNsLmFjLmJlKQorCisJKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBwb3dlcnBjLWlibS1haXgzLjIuNS4KKworCVdlZCBBcHIgMjAgMDY6MzY6MzIgMTk5NCAgUGhpbGlwcGUgRGUgTXV5dGVyICAocGhkbUBpbmZvLnVjbC5hYy5iZSkKKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgVW5peFdhcmUgMS4xIChVTkFNRV9TWVNURU0gaXMgU1lTVEVNX1YKKwlpbnN0ZWFkIG9mIFVOSVhfU1YgZm9yIFVuaXhXYXJlIDEuMCkuCisKK1NhdCBBdWcgMjcgMDE6NTY6MzAgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbC1nZGIpOiAgQWRkIGRlcGVuZGVuY2llcyBvbiBhbGwtZ2NjIGFuZCBhbGwtbGQKKwl0byBtYWtlIGdkYi9ubG0vKiBidWlsZCBhZnRlciB0aGUgY29tcGlsZXIgYW5kIGxpbmtlci4KKworRnJpIEF1ZyAyNiAxNDozMDowNSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzIChuZXRic2QsIGZyZWVic2QsIGxpbnV4KTogIEFjY2VwdCBhbnkgbWFjaGluZSwKKwlub3QganVzdCBpWzM0XTg2LgorCShtNjhrLWF0YXJpLXN5c3Y0KTogIFJlbG9jYXRlIHRvIG1hdGNoIEZTRiB2ZXJzaW9uLgorCisJKiBjb25maWcuZ3Vlc3M6ICBNb3JlIG1lcmdlcyBmcm9tIHRoZSBGU0Y6CisKKwlBZGQgYSBzcGFjZSBiZWZvcmUgZnVuY3Rpb24gY2FsbCBvciBtYWNybyBpbnZvY2F0aW9uLgorCisJVHVlIE1heSAxMCAxNjo1Mzo1NSAxOTk0ICBSb2xhbmQgTWNHcmF0aCAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5ndWVzczogQWRkIHRyYXAgY21kIHRvIHJlbW92ZSBkdW1teS5jIGFuZCBkdW1teSB3aGVuCisJaW50ZXJydXB0ZWQuCisKKwlXZWQgQXByIDIwIDE4OjA3OjEzIDE5OTQgIFJvbGFuZCBNY0dyYXRoIChyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdSkKKworCSogY29uZmlnLmd1ZXNzIChkdW1teS5jKTogUmVkaXJlY3Qgc3RkZXJyIGZvciBgaG9zdGluZm8nIGNvbW1hbmQuCisJKGR1bW15KTogUmVkaXJlY3Qgc3RkZXJyIGZyb20gY29tcGlsYXRpb24gb2YgZHVtbXkuYy4KKworCVNhdCBBcHIgIDkgMTQ6NTk6MjggMTk5NCAgQ2hyaXN0aWFuIEtyYW56ICAoa3JhbnpAc2VudDUudW5pLWR1aXNidXJnLmRlKQorCisJKiBjb25maWcuZ3Vlc3M6IERpc3Rpbmd1aXNoIGJldHdlZW4gTmVYVFN0ZXAgMi4xIGFuZCAzLnguCisKK0ZyaSBBdWcgMjYgMTM6NDI6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IEFjY2VwdCBhbmQgaWdub3JlIC0tY2FjaGUqLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisJbmV3IGF1dG9jb25mLgorCitGcmkgQXVnIDI2IDEzOjA1OjI3IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6ICBNZXJnZSBmcm9tIEZTRjoKKworCVRodSBBdWcgMjUgMjA6Mjg6NTEgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgPHJtc0Btb2xlLmdudS5haS5taXQuZWR1PgorCisJKiBjb25maWcuZ3Vlc3MgKFB5cmFtaWQqOk9TeCo6KjoqKTogTmV3IGNhc2UuCisgICAgICAgIChQQVRIKTogQWRkIC8uYXR0YmluIGF0IGVuZCBmb3IgZmluZGluZyB1bmFtZS4KKyAgICAgICAgKGR1bW15LmMpOiBIYW5kbGUgaTg2MC1hbGxpYW50LWJzZC4gIEZvbGxvdyB3aGl0ZXNwYWNlIGNvbnZlbnRpb25zLgorCisJV2VkIEF1ZyAxNyAxODoyMTowMiAxOTk0ICBUb3IgRWdnZSAgKHRlZ2dlQHB2di51bml0Lm5vKQorCisgICAgICAgICogY29uZmlnLmd1ZXNzIChNODgqOkRvbHBoaW5PUzoqOiopOiBOZXcgY2FzZS4KKworCVRodSBBdWcgMTEgMTc6MDA6MTMgMTk5NCAgU3RhbiBDb3ggIChjb3hzQGRnLXJ0cC5kZy5jb20pCisKKyAgICAgICAgKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVzZSBUQVJHRVRfQklOQVJZX0lOVEVSRkFDRQorICAgICAgICB0byBzZWxlY3Qgd2hldGhlciB0byB1c2UgRUxGIG9yIENPRkYuCisKKwlTdW4gSnVsIDI0IDE2OjIwOjUzIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAbW9sZS5nbnUuYWkubWl0LmVkdT4KKworICAgICAgICAqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGk4NjAtc3RhcmRlbnQtc3lzdiBhbmQgaTg2MC11bmtub3duLXN5c3YuCisKKwlTdW4gTWF5ICAxIDEwOjIzOjEwIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIChybXNAbW9sZS5nbnUuYWkubWl0LmVkdSkKKworCSogY29uZmlnLmd1ZXNzOiBHdWVzcyB0aGUgT1MgdmVyc2lvbiBmb3IgSFBVWC4KKworCVR1ZSBNYXIgIDEgMjE6NTM6MDMgMTk5NCAgS2FybCBIZXVlciAgKGt3emhAaGFsLmdudS5haS5taXQuZWR1KQorCisJKiBjb25maWcuZ3Vlc3MgKFVOQU1FX1ZFUlNJT04pOiBSZWNvZ25pemUgYWl4My4yLjQgYW5kIGFpeDMuMi41LgorCitGcmkgQXVnIDI2IDExOjE5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgLS13aXRoLWhlYWRlcnMsIC0td2l0aC1saWJzLCBhbmQKKwktLXdpdGhvdXQtbmV3bGliLgorCSogTWFrZWZpbGUuaW4gKGFsbC14aWJlcnR5KTogRGVwZW5kIHVwb24gYWxsLWxkLgorCitXZWQgQXVnIDI0IDEyOjM2OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KKworTW9uIEF1ZyAyMiAxMDo1ODozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSAodmVyc2lvbik6IEEgZmV3IG1vcmUgdHdlYWtzIHRvIGhlbHAgbWVzc2FnZS4KKworRnJpIEF1ZyAxOSAxMjo0MDoyNSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgKGZvciBub3cpIGxpYnJ4IGFzIGEgaG9zdCBsaWJyYXJ5LAorCW5vdyB0aGF0IHdlJ3JlIGJ1aWxkaW5nIGl0IGZvciB0YXJnZXQuCisKK0ZyaSBBdWcgMTkgMTA6NDk6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IEZpeCB1cCBoZWxwIG1lc3NhZ2U7IGZyb20ga2FybEBvd2wuaHEuaWxlYWYuY29tCisJKEthcmwgQmVycnkpLgorCitUdWUgQXVnIDE2IDE2OjExOjA4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBBbHNvIGNvbmZpZ3VyZSBsaWJyeC4KKworTW9uIEF1ZyAxNSAxNjo1MTo0NSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgdmFyaW91cyBydWxlcyB0byByZWZsZWN0IHRoYXQgbGlicngKKwlpcyBub3cgbmVlZGVkIGZvciBsaWJnKysuCisKK0ZyaSBBdWcgMTIgMTg6MDc6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBBY2NlcHQgbWlwczY0b3Jpb24gYW5kIG1pcHM2NG9yaW9uZWwgYXMgYSBDUFUgbmFtZS4KKworTW9uIEF1ZyAgOCAxMTozNjoxNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIHRoZSBleGFtcGxlcyBkaXJlY3RvcnkuCisKK1RodSBBdWcgIDQgMTY6MTI6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IFNpbXBsaWZ5IEp1biAyIDE5OTQgY2hhbmdlLgorCitXZWQgQXVnICAzIDA0OjU4OjE2IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY2hhbmdlIENDIHRvIC91c3IvbGF0ZXN0L2Jpbi9nY2MgZm9yIGx5bnggaG9zdCBidWlsZHMsIHNpbmNlCisJL2Jpbi9nY2MgaXNuJ3QgZ29vZCBlbm91Z2ggdG8gYnVpbGQgZ2NjLgorCitXZWQgSnVsIDI3IDA5OjA3OjE0IDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRklMRVMpOiBSZW1vdmUKKwkoc2V0dXAtZGlycy1nZGIsIGdkYi50YXIuZ3osIG1ha2UtZ2RiLnRhci5neik6ICBSZW1vdmUgb2xkIHJ1bGVzLgorCShnZGIudGFyLmd6KTogQWRkIG5ldyBydWxlIHRvIHVzZSBzdGFuZGFyZCBkaXN0cmlidXRpb24gYnVpbGRpbmcKKwltZWNoYW5pc20uCisKK01vbiBKdWwgMjUgMTE6MTA6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFdhcm4gYWJvdXQgdXNlIG9mIC91c3IvdWNiL2NjIG9uIFNvbGFyaXMuICBGcm9tCisJQmlsbCBDb3ggPGJpbGxAY3lnbnVzLmNvbT4uCisKK1NhdCBKdWwgMjMgMTI6MTk6NDYgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBJU0MuICBQYXRjaCBmcm9tIGt3emhAZ251LmFpLm1pdC5lZHUuCisKK0ZyaSBKdWwgMjIgMTc6NTM6NTkgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiAgU2VhcmNoIGN1cnJlbnQgZGlyIGZpcnN0IGluIC5nZGJpbml0LgorCitGcmkgSnVsIDIyIDExOjI4OjMwIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiAgUmVjb2duaXplIGZyZWVic2QgKG1lcmdlZCBmcm9tIGdjYyBjb25maWcuc3ViKS4KKworVGh1IEp1bCAyMSAxNDoxMDo1MiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIFJlZmVyIHRvIE5lWFQncyBvcGVyYXRpbmcgc3lzdGVtIGFzIG5leHRzdGVwLgorCisJKiBjb25maWcuc3ViIChjYXNlICRiYXNpY19tYWNoaW5lKTogIFJlLW9yZGVyIHRoZSBjYXNlcywgdG8gbWF0Y2gKKwl0aGUgb3JkZXIgaW4gdGhlIEZTRiB2ZXJzaW9uICh3aGljaCBpcyBtb3N0bHkgYWxwaGFiZXRoaWNhbCkuCisJTWVyZ2UgaW4gc29tZSBhZGRpdGlvbnMgYW5kIGNoYW5nZXMgZnJvbSB0aGUgRlNGLgorCitTYXQgSnVsIDE2IDEyOjAzOjA4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgbTY4ay1hdGFyaS1zeXN2NCBhbmQgbTg4ay1oYXJyaXMtY3N1eDcuCisJKiBjb25maWcuc3ViOiBSZWNvZ25pemUgY3h1eDcuCisJKiBjb25maWd1cmUuaW46IFVzZSBtaC1jeHV4IGZvciBtODhrLWhhcnJpcy1jeHV4Ki4KKworTW9uIEp1bCAxMSAxNDozNzozOSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIEZpeCB0eXBvIHBvd2VycGMgLT4gcG93ZXJwYy0qLgorCitTYXQgSnVsICA5IDEzOjAzOjQzIDE5OTQgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AYmx1ZXMuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGBhbGwtZW1hY3MxOScgZGVwZW5kcyBvbiBgYWxsLWJ5YWNjJy4KKworCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtZW1hY3MxOSBhbmQgaW5zdGFsbC1lbWFjczE5IHJ1bGVzIChpbgorCXBhcmFsbGVsIHdpdGggYWxsLWVtYWNzIGFuZCBpbnN0YWxsLWVtYWNzKS4gIFRvcC1sZXZlbCBjb21tYW5kCisJYG1ha2UgYWxsLWVtYWNzMTkgQ0M9Z2NjJyBub3cgYmVoYXZlcyBhcyBgbWFrZSBhbGwtZW1hY3MgQ0M9Z2NjJy4KKworVGh1IEp1biAzMCAxNjo1Mzo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIHRlc3QtYnVpbGQubWsgKCQoaG9zdCktc3RhbXAtc3RhZ2UyLWluc3RhbGxlZCk6IFJlbW92ZQorCSQocmVsYmluZGlyKS9tYWtlIGJlZm9yZSBkb2luZyBgYG1ha2UgaW5zdGFsbCcnLCBhbmQgdXNlCisJJChHTlVfTUFLRSkgd2hpbGUgZG9pbmcgaXQuICBBdm9pZHMgcHJvYmxlbSBvbiBTdW5PUyB3aXRoCisJaW5zdGFsbGluZyBvdmVyIHJ1bm5pbmcgbWFrZSBiaW5hcnkuCisJKCQoaG9zdCktc3RhbXAtc3RhZ2UzLWluc3RhbGxlZCk6IExpa2V3aXNlLgorCitUdWUgSnVuIDI4IDEzOjQzOjI1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBNYWNoLgorCitNb24gSnVuIDI3IDE2OjQxOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBDaGVjayAke2V4ZWNfcHJlZml4b3B0aW9ufSwgbm90ICR7ZXhlY19wcmVmaXh9LCB0bworCXNlZSB3aGV0aGVyIC0tZXhlYy1wcmVmaXggd2FzIHVzZWQuCisKK1N1biBKdW4gMjYgMjE6MTU6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIEV4cGxpY2l0bHkgbWVudGlvbiBsaWJnKysvUkVBRE1FLiAgKFpvbydzIGlkZWEuKQorCitUdWUgSnVuIDIxIDEyOjQ1OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1saWJyeCB0YXJnZXQgc2ltaWxhciB0byBhbGwtbGlicHJvYy4KKworV2VkIEp1biAgOCAyMzoxMTo1NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6ICBSZWFycmFuZ2UgdGVzdHMgZm9yIEFscGhhLU9TRjEgdG8gcHJvcGVybHkgZGVhbAorCXdpdGggcG9zdCAxLjIgdW5hbWUgYm9nb3NpdHkuCisKK1RodSBKdW4gIDkgMDA6Mjc6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IFJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgb24gcmVjZWlwdCBvZiBhIHNpZ25hbC4KKworVHVlIEp1biAgNyAxMjowNjoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogSWYgdGhlcmUgaXMgYSBwYWNrYWdlX21ha2VmaWxlX2ZyYWcsIHJlbW92ZQorCSR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gYWZ0ZXIgY29weWluZyBpdCBpbi4KKworTW9uIEp1biAgNiAyMTozNTowMiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCisKKwkqIGJ1aWxkX2FsbC5tazogc3VwcG9ydCByczYwMDAgbHlueCBpZGVudGlmaWVzIGl0c2VsZiBhcworCXJzNjAwMC1seW54LWx5bnhvczIuMi4yLiAgQWxzbywgdXNlIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL2Jpbi9nY2MKKwlzaW5jZSAvYmluL2djYyBpcyB0b28gZmVlYmxlIHRvIGNvbXBpbGUgYSBtb2Rlcm4gZ2NjLgorCitNb24gSnVuICA2IDE2OjA2OjM0IDE5OTQgIEthcmVuIENocmlzdGlhbnNlbiAoa2FyZW5AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGJyb3VnaHQgZGV2by90ZXN0LWJ1aWxkLm1rIHVwZGF0ZS10by1kYXRlIHdpdGggcHJvZ3Jlc3NpdmUvCisJICB0ZXN0LWJ1aWxkLm1rLiBBZGQgbHlueCB0YXJnZXRzIGFuZCBocHBhIGZsYWcgaW5mby4KKworU2F0IEp1biAgNCAxNzoyMzo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgVXNlIG1oLW5jcnN2cjQzLiAgUGF0Y2ggZnJvbQorCVRvbSBNY0Nvbm5lbGwgPHRtY2Nvbm5lQHNlZG9uYS5pbnRlbC5jb20+LgorCitGcmkgSnVuICAzIDE3OjQ3OjI0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3MgKGkzODYtdW5rbm93bi1ic2RpKTogIE5vIGxvbmdlciBuZWVkIHRvCisJY2hlY2sgI2lmIGRlZmluZWQoX19ic2RpX18pICYmIGRlZmluZWQoX19pMzg2X18pLgorCitUaHUgSnVuICAyIDE4OjU2OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBTZXQgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbiBjb3JyZWN0bHkuCisKK1RodSBKdW4gIDIgMTA6NTc6MDYgMTk5NCAgS2FyZW4gQ2hyaXN0aWFuc2VuIChrYXJlbkBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogYnJvdWdodCBidWlsZC1hbGwubWsgdXBkYXRlLXRvLWRhdGUgd2l0aCBwcm9ncmVzc2l2ZSBidWlsZC1hbGwubWssCisJICBhZGRlZCBuZXcgdGFyZ2V0cyBhbmQgaHBwYSBpbmZvLgorCQorVGh1IEp1biAgMiAwMDoxMjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogSWYgY29uZmlnLmd1ZXNzIHJlc3VsdCBpcyBhIHByZWZpeCBvZiB0aGUgdXNlcgorCXNwZWNpZmllZCB0YXJnZXQsIGFzc3VtZSBhIG5hdGl2ZSBidWlsZCBhbmQgdXNlIHRoZSB1c2VyIHNwZWNpZmllZAorCXRhcmdldCBhcyB0aGUgaG9zdCBhbGlhcy4gIFJlbW92ZSBTdW5PUyBwYXRjaCBzdWZmaXggcmVtb3ZhbCBoYWNrLgorCSogY29uZmlndXJlLmluOiBSZW1vdmUgU3VuT1MgcGF0Y2ggc3VmZml4IHJlbW92YWwgaGFjay4KKworCSogTWFrZWZpbGUuaW4gKENST1NTX0NIRUNLX01PRFVMRVMpOiBSZW1vdmUgY2hlY2stZmxleCwgc2luY2UgaXQncworCWluIE5BVElWRV9DSEVDS19NT0RVTEVTLgorCitXZWQgSnVuICAxIDEwOjQ5OjQxIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFJlbmFtZSBIT1NUX09OTFkgdG8gTkFUSVZFLgorCSogY29uZmlndXJlOiBEZWxldGUgU3VuT3MgcGF0Y2ggc3VmZml4IGZyb20gaG9zdF9jYW5vbmljYWwKKwkgIGFuZCBidWlsZF9jYW5vbmljYWwgdmFyaWFibGVzIHRoYXQgYXJlIHByZXBlbmRlZCB0byBNYWtlZmlsZXMuCisJKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50cyBmb3IgZWFzaWVyIG1haW50ZW5hbmNlLgorCitUdWUgTWF5IDMxIDE5OjM5OjQ3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIGFsbC1saWJwcm9jIHRhcmdldCBzaW1pbGFyIHRvIGFsbC1ndWkuCisKK1R1ZSBNYXkgMzEgMTc6MTY6MzMgMTk5NCAgVG9tIExvcmQgIChsb3JkQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDSEVDS19NT0RVTEVTKTogc3BsaXQgaW50bworCUhPU1RfT05MWV9DSEVDS19NT0RVTEVTIGFuZCBDUk9TU19DSEVDS19NT0RVTEVTLgorCitUdWUgTWF5IDMxIDE2OjM2OjM2IDE5OTQgIFBhdWwgRWdnZXJ0ICAoZWdnZXJ0QHR3aW5zdW4uY29tKQorCisJKiBjb25maWcuZ3Vlc3MgKGkzODYtdW5rbm93bi1ic2RpKTogTmV3IHN5c3RlbSB0byBndWVzcy4KKworV2VkIE1heSAyNSAxNjo0NzoxMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtZ3VpIHRhcmdldCAoYnV0IG5vdCB5ZXQgYnVpbGQgYnkgImFsbCIpLgorCitUaHUgTWF5IDI2IDA4OjUzOjE5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogTW92ZSBkZWxldGlvbiBvZiBwYXRjaCBzdWZmaXggZnJvbSBoZXJlLi4uCisJKiBjb25maWd1cmUuaW46IFRvIGhlcmUsIGF0IElhbidzIHN1Z2dlc3Rpb24uICBUaGUgdG9wLQorCSAgbGV2ZWwgc2NyaXB0cyBtaWdodCBuZWVkIHRvIGtub3cgb2YgYSBwYXRjaCBsZXZlbC4KKworV2VkIE1heSAyNSAwOToxNTo1NCAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IFN0cmlwIG9mZiBwYXRjaCBzdWZmaXggc28gcnRsIGlzIHJlY29nbml6ZWQKKwkgIGFzIGEgc3Vub3M0LjEuMyBtYWNoaW5lLCBldmVuIHRob3VnaCBpdCdzIGJlZW4gcGF0Y2hlZC4KKworRnJpIE1heSAyMCAwODoyNTo0OSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BkZW5lYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9MQVNUKTogRGVsZXRlLgorCShJTlNUQUxMX0RPU1JFTCk6IE5ldy4KKworVGh1IE1heSAxOSAxNzoxMjoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIGxkIGZvciBpWzM0XTg2LSotc3lzdjQqIGFuZCBzcGFyYy0qLXNvbGFyaXMyKi4KKwlEb24ndCBzZXQgdXNlX2dudV9sZCB0byBubyBmb3IgKi0qLXN5c3Y0OyB0aGF0IG9ubHkgY29udHJvbHMKKwl3aGV0aGVyIHdlIHBhc3MgZG93biAtLXdpdGgtZ251LWxkIGFueWhvdy4KKworVGh1IE1heSAxOSAwOToyOToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9MQVNUKTogQ2hhbmdlIG9wZXJhdGlvbiBzbyBpdCB3b3JrcworCW9uIG1vcmUgZmxhdm9ycyBvZiBtYWtlLgorCSogY29uZmlndXJlLmluIChnbzMyKTogRG9uJ3QgYnVpbGQgbGliZysrIG9yIGxpYmlvLgorCitGcmkgTWF5IDEzIDEzOjI4OjM0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChNb3ZlIEhPU1RfUFJFRklYXzEgYW5kIGZyaWVuZHMgdXAgc28KKwl0aGV5IGNhbiBiZSBvdmVycmlkZW4gYnkgdGVtcGxhdGVzLgorCitTYXQgTWF5ICA3IDE2OjQ2OjQ0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0PT1nbzMyKTogRG9uJ3QgYnVpbGQgZ2RiLgorCSogZG9zcmVsOiBOZXcgZGlyZWN0b3J5LgorCitGcmkgTWF5ICA2IDE0OjE5OjI1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IENvbmZpZ3VyZSBkb3NyZWwgdG9vLgorCSogTWFrZWZpbGUuaW4gKElOVEFMTF9UQVJHRVQpOiBDYWxsIElOU1RBTExfTEFTVCBsYXN0LgorCShIT1NUX0NDLCBIT1NUX1BSRUZJWCwgSE9TVF9QUkVGSVhfMSk6IFVuZGVmaW5lLCB0aGV5IHNob3VsZAorCWJlIHNldCBieSBpbmNvbWluZyBuYW1lcyBvciB0ZW1wbGF0ZXMuCisJKElOU1RBTExfTEFTVCk6IE5ldyBydWxlLgorCSogY29uZmlnL21oLWdvMzI6IE5ldyBmcmFnbWVudC4KKworVGh1IE1heSAgNSAxNzozNTowNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWIgKHNwYXJjbGl0ZWZydywgc3BhcmNsaXRlZnJ3Y29tcGF0KTogRG9uJ3Qgc2V0IHRoZSBvcy4KKworVGh1IE1heSAgNSAyMDowNjo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtbHlueHJzNms6IFJlbmFtZWQgZnJvbSBtaC1seW54b3NyczZrLCB0byBtYWtlIGl0CisJdW5pcXVlIGluIDguMyBuYW1pbmcgc2NoZW1lcy4KKwkqIGNvbmZpZ3VyZS5pbiAoYXBwZGlycyk6IE5ldyB2YXJpYWJsZS4gIEN1cnJlbnRseSBlbXB0eSwgYnV0IHdpbGwKKwliZSB1c2VkIGluIGdhcyBkaXN0cmlidXRpb24uICBJZiBub25lbXB0eSwgbGlzdHMgYSBzZXQgb2YKKwlkaXJlY3RvcmllcyBhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggbXVzdCBnZXQgY29uZmlndXJlZCwgb3IgdG9wCisJbGV2ZWwgY29uZmlndXJhdGlvbiBpcyBjb25zaWRlcmVkIHRvIGhhdmUgZmFpbGVkLgorCShyczYwMDAtKi1seW54b3MqKTogVXNlIG5ldyBmaWxlIG5hbWUuCisKK1RodSBNYXkgIDUgMTM6Mzg6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJRWxpbWluYXRlIFhUUkFGTEFHUy4KKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogSWYgbmV3bGliIGV4aXN0cywgcmVmZXIgdG8gdGhlCisJbmV3bGliIGluY2x1ZGUgZmlsZXMgdXNpbmcgLWlkaXJhZnRlciwgYW5kIGFsc28gdXNlIC1ub3N0ZGluYy4KKwkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KKwkoWFRSQUZMQUdTKTogUmVtb3ZlZC4KKwkoQkFTRV9GTEFHU19UT19QQVNTKTogUmVtb3ZlIFhUUkFGTEFHU19GT1JfVEFSR0VULgorCShFWFRSQV9IT1NUX0ZMQUdTKTogUmVtb3ZlIFhUUkFGTEFHUy4KKwkoRVhUUkFfVEFSR0VUX0ZMQUdTLCBFWFRSQV9HQ0NfRkxBR1MpOiBMaWtld2lzZS4KKwkoJChET19YKSk6IERvbid0IHBhc3MgZG93biBYVFJBRkxBR1MuCisKK1RodSBNYXkgIDUgMDA6MTY6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcyotZGVjLWJzZCopOiBOZXcgdGFyZ2V0OyBkbyBidWlsZCBsaW5rZXIuCisJKG1pcHMqLSotYnNkKik6IE5ldyB0YXJnZXQ7IGRvbid0IGJ1aWxkIGxpbmtlci4KKworV2VkIE1heSAgNCAyMDoxMDoxMCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogc3VwcG9ydCByczYwMDAtKi1seW54b3MqIGNvbmZpZ3VyYXRpb24uCisJc3VwcG9ydCBzdW5vczQgYXMgYSBjcm9zcyB0YXJnZXQuCisKKwkqIGNvbmZpZy5zdWI6IGxvb2sgZm9yIGx5bngqLCBub3QgbHlueCBzaW5jZSB0aGUgT1MgdmVyc2lvbiBtYXkKKwlsZWdpdGltYXRlbHkgYmUgcGFydCBvZiB0aGUgbmFtZS4KKworVHVlIE1heSAgMyAyMTo0ODoxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28qKTogTW92ZSB0byBiZSB3aXRoIG90aGVyIGkzODYKKwl0YXJnZXRzLgorCShyb21wLSotKik6IE5ldyB0YXJnZXQuICBTa2lwIHZhcmlvdXMgYmluYXJ5IHV0aWxpdGllcy4KKwkodmF4LSotKik6IE5ldyB0YXJnZXQuICBEb24ndCBidWlsZCBuZXdsaWIuCisJKHZheC0qLXZtcyk6IFJlbmFtZWQgZnJvbSAqLSotdm1zLiAgRG9uJ3QgYnVpbGQgb3Bjb2RlcyBvciBuZXdsaWIuCisKK1RodSBBcHIgMjggMTU6MDM6MDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IE9ubHkgc2V0IGhvc3RfbWFrZWZpbGVfZnJhZyBpZiBjb25maWcKKwlkaXJlY3RvcnkgZXhpc3RzLgorCitXZWQgQXByIDI3IDEyOjE0OjMwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC5zaDogSWYgJGRzdGRpciBleGlzdHMsIGRvbid0IGNoZWNrIHdoZXRoZXIgZWFjaAorCWNvbXBvbmVudCBkb2VzLgorCitUdWUgQXByIDI2IDE4OjExOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGQgc2xlZXA7IHVzZWQgYnkgcmNzL3NyYy9jb25mLnNoLgorCitNb24gQXByIDI1IDE1OjA2OjM0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworIAkqIGNvbmZpZ3VyZS5pbiAoKi0qLWx5bnhvcyopOiBEb24ndCBjb25maWd1cmUgbmV3bGliIGZvciBlaXRoZXIKKyAJbmF0aXZlIG9yIGNyb3NzIEx5bnguCisKK1NhdCBBcHIgMTYgMTE6NTg6MTYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YiAoc3BhcmM2NC1lbGYpOiBGaXggb3MuCisJKHo4ayk6IFJlbW92ZSBkdXBsaWNhdGUuCisKK1RodSBBcHIgMTQgMjM6MzM6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiBUb3VjaCBnY2MvaW5jbHVkZS9maXhlZCwgbm90CisJZ2NjL3N0bXAtZml4cHJvdG8sIHRvIHRyeSB0byBwcmV2ZW50IGZpeHByb3RvIGZyb20gYmVpbmcgcnVuLgorCitXZWQgQXByIDEzIDE1OjE0OjUyIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IE1ha2UgZmlsZSBsaW5rcyBjbGVhbmx5IGV2ZW4gaWYgTHlueCBmYWlscyBvbgorICAgICAgICAgIGFuIE5GUyBzeW1saW5rIChhdCBsZWFzdCBmYWlsIGNsZWFubHkpLgorCitNb24gQXByIDExIDEwOjU4OjU2IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogdGVzdC1idWlsZC5tayAoQ0MpOiBGb3IgbWlwcy1zZ2ktaXJpeDQsIGNoYW5nZSAtWE5oMTUwMCB0bworCS1YTmgyMDAwLgorCitTYXQgQXByICA5IDE1OjEwOjQ1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBVbmtub3duIG9wdGlvbnMgYXJlIGZhdGFsIGFnYWluLgorCitGcmkgQXByICA4IDEyOjAxOjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IElnbm9yZSAtLXgtaW5jbHVkZXMgYW5kIC0teC1saWJyYXJpZXMsIGZvciBBdXRvY29uZgorCWNvbXBhdGliaWxpdHkuIAorCitUaHUgQXByICA3IDE3OjMxOjQzIDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGJ1aWxkLWFsbC5tazogQWRkIGBjbGVhbicgdGFyZ2V0LgorCitXZWQgQXByICA2IDIwOjQ0OjU2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlnLmd1ZXNzOiAgQWRkIFNJTklYIHN1cHBvcnQuCisJKiBjb25maWd1cmUuaW46ICBBZGQgbWlwcy0qLXN5c3Y0KiBzdXBwb3J0LgorCitNb24gQXByICA0IDE3OjQxOjQ0IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGJ1aWxkLWFsbC5tazogRG9jdW1lbnQgYWxsIHVzZWZ1bCB0YXJnZXRzLgorCUlmIGNhbm9uaG9zdCBpcyBzcGFyYy1zdW4tc29sYXJpczIuMywgY2hhbmdlIGl0IHRvIHNwYXJjLXN1bi1zb2xhcmlzMi4KKwlJZiBjYW5vbmhvc3QgaXMgbWlwcy1zZ2ktaXJpeDQuMC41SCwgY2hhbmdlIGl0IHRvIG1pcHMtc2dpLWlyaXg0LgorCitUaHUgTWFyIDMxIDA0OjU1OjU3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBTdXBwb3J0IC0tc2lsZW50LCAtLXF1aWV0LgorCitXZWQgTWFyIDMwIDIxOjM3OjM4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBTdXBwb3J0IC0tZGlzYWJsZS1GRUFUVVJFLgorCitUdWUgTWFyIDI5IDE5OjE1OjA1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBOQ1IgcnVubmluZyBTVlI0LjMuCisKK01vbiBNYXIgMjggMTQ6NTU6MTUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogIE1ha2UgQlNESSBnZW5lcmF0ZSBpMzg2LXVua25vd24tYnNkMzg2LgorCVBhdGNoIGZyb20gUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT4uCisKK01vbiBNYXIgMjggMTI6NTQ6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1haXgqKTogVHJlYXQgbGlrZSByczYwMDAtKi0qLgorCitTYXQgTWFyIDI2IDExOjI1OjQ4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBNYWtlIHVucmVjb2duaXplZCBvcHRpb25zIGdpdmUgbm9uZmF0YWwgd2FybmluZ3MKKwlpbnN0ZWFkIG9mIGZhdGFsIGVycm9ycywgYW5kIHBhc3MgdGhlbSB0byBhbnkgc3ViZGlyZWN0b3J5CisJY29uZmlndXJlcyBpbiBjYXNlIHRoZXkgcmVjb2duaXplIHRoZW0uCisJTWFrZSAtLXggZXF1aXZhbGVudCB0byAtLXdpdGgteC4KKworRnJpIE1hciAyNSAyMTo1MjoxMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogQWRkIC0tZW5hYmxlLSogb3B0aW9ucy4gIENsZWFuIHVwIHVzYWdlIG1lc3NhZ2UgYW5kCisJc29tZSBjb21tZW50cy4KKworVGh1IE1hciAyNCAwOToxMjo1MyAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTk1fRk9SX1RBUkdFVCk6IEJ1aWxkIHRyZWUgdmVyc2lvbiBpcyBub3cgbm0ubmV3LgorCitTdW4gTWFyIDIwIDExOjI4OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKik6IEVuYWJsZSBiaW51dGlscy4KKworU2F0IE1hciAxOSAxMTo1MDoxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIGNpc2NvLgorCitGcmkgTWFyIDE4IDE2OjQyOjMyIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBBZGQgLWZleHRlcm5hbC10ZW1wbGF0ZXMuCisKK1R1ZSBNYXIgMTUgMTE6MjU6NTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogYWJvdXQgdGFyZ2V0ICotaGl0YWNoaS1oaXV4d2UyLCBkb24ndCBwcmludCBtb3JlCisJdGhhbiBvbmUgY29uZmlndXJhdGlvbiBuYW1lLiAgQWRkIGNvbW1lbnQuCisKK1N1biBNYXIgIDYgMjM6MTM6MzggMTk5NCAgSGlzYXNoaSBNSU5BTUlOTyAgKG1pbmFtaW5vQHNyYS5jby5qcCkKKworCSogY29uZmlnLmd1ZXNzOiBhYm91dCB0YXJnZXQgKi1oaXRhY2hpLWhpdXh3ZTIsIGZpeGVkCisJbWFjaGluZSBndWVzc2luZyBvcmRlci4gIFtIaXRhY2hpJ3MgQ1BVX0lTX0hQX01DNjhLCisJbWFjcm8gaXMgaW5jb3JyZWN0Ll0KKworU3VuIE1hciAxMyAwOToxMDowOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBKdXN0IGJ1aWxkIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnksIHJhdGhlcgorCXRoYW4gdGhlICJtYWtlIGxzIiBzdHVmZiB3aGljaCB1c2VkIHRvIGJlIGhlcmUuCisKK0ZyaSBNYXIgMTEgMTI6NTI6MzkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBpWzM0XTg2LXVua25vd24tZnJlZWJzZC4KKwlGcm9tIFNoYXduIE0gQ2FyZXkgPHNtY2FyZXlAcm9kYW4uc3lyLmVkdT4uCisKK1RodSBNYXIgIDMgMTQ6MjQ6MjEgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzIGZvciBhbHBoYSk6IFJlbW92ZSBsaWJnKysgYW5kIGxpYmlvLgorCitXZWQgTWFyICAyIDEzOjI4OjQ4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IENoZWNrIGZvciBwdHguCisKK01vbiBGZWIgMjggMTY6NDY6NTAgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogQWRkIG9zOWsgY2hlY2tpbmcuCisKK1RodSBGZWIgMjQgMDc6MDk6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy5ndWVzczogSGFuZGxlIE9TRjEgcnVubmluZyBvbiBIUFBBIHByb2Nlc3NvcnMKKworRnJpIEZlYiAxOCAxNDoxNDowMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogSWYgc3ViZGlyIGNvbmZpZ3VyZSBmYWlscywgcHJpbnQgb3V0IGEgbWVzc2FnZSB3aXRoCisJc3ViZGlyZWN0b3J5IG5hbWUsIGluIGNhc2Ugc3ViZGlyJ3MgY29uZmlndXJlIGNvZGUgZGlkbid0IGlkZW50aWZ5CisJaXRzZWxmLgorCitGcmkgRmViIDE4IDEyOjUwOjE1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZW1vdmUgZW1iZWRkZWQgbmV3bGluZXMgZnJvbSBjb25maWdkaXJzLgorCUF2b2lkIG1pc21hdGNoZXMgb2Ygc3Vic3RyaW5ncy4gIEZpeCBtYXRjaGluZyBzdHJpbmdzIGF0IGVuZAorCW9mIGNvbmZpZ2RpcnMuCisKK0ZyaSBGZWIgMTEgMTU6MzM6MzMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiAgQWRkIEx5bngvcnM2MDAwIGNvbmZpZyBzdXBwb3J0LgorCitUdWUgRmViICA4IDEzOjQxOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChhbHBoYS1kZWMtb3NmMSosIGFscGhhKi0qLSopOiBCdWlsZCBnYXMuCisKK01vbiBGZWIgIDcgMTU6NDI6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLW9zZiopOiBUcmVhdCB0aGlzIGp1c3QgbGlrZSBtb3N0IG90aGVyCisJUEEgY29uZmlndXJhdGlvbnMgKGVnIG5vIGJpbnV0aWxzIG9yIGxkKS4KKwkoaHBwYSotKi0qZWxmKik6IFRoZXNlIGNvbmZpZ3VyYXRpb25zIGhhdmUgYmludXRpbHMgYW5kIGxkLgorCitTdW4gRmViICA2IDE2OjM1OjA3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcuc3ViIChoaXV4KTogRml4IHR5cG8uICBGcm9tIG0ta2FzYWhyQHNyYW1oYy5zcmEuY28uSlAuCisKK1NhdCBGZWIgIDUgMDE6MDA6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHJzNjAwMC0qLSopOiBCdWlsZCBnYXMuCisKK1dlZCBGZWIgIDIgMTM6NTc6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKyAgICAgICAgKiBNYWtlZmlsZS5pbjogIEF2b2lkIGJ1ZyBpbiBsb3NpbmcgaHB1eCBzZWQuCisKK1dlZCBGZWIgIDIgMTQ6NTM6MDUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCB0ZXN0LWJ1aWxkLm1rOiBSZW1vdmUgTVVOQ0hfTk07IGl0IHdhcyBvbmx5IG5lZWRlZAorCWZvciBHREIgYW5kIEdEQiBoYXMgYmVlbiBmaXhlZCB0byBub3QgbmVlZCBpdC4KKworTW9uIEphbiAzMSAxODo0MDo1NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtbHlueG9zcnM2azogIEFjY291bnQgZm9yIGxhY2sgb2YgcmFubGliIQorCitTdW4gSmFuIDMwIDE3OjU4OjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHZheCBob3N0cy4KKworRnJpIEphbiAyOCAxNToyOTozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUgKHdoaWxlIGxvb3ApOiBEb24ndCB1c2UgImJyZWFrIDIiIGluc2lkZSBjYXNlCisJc3RhdGVtZW50IC0tIHRoZSBjYXNlIHN0YXRlbWVudCBpc24ndCBhbiBlbmNsb3NpbmcgbG9vcC4KKworTW9uIEphbiAyNCAxODo0MDowNiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiAgQ2xlYW4gdXAgTmVYVCBzdXBwb3J0LCB0byBhbGxvdyBuZXh0c3RlcAorCW9uIEludGVsIG1hY2hpbmVzLiAgTWFrZSBPUyBiZSBuZXh0c3RlcC4KKworU3VuIEphbiAyMyAxODo0NzoyMiAxOTk0ICBSaWNoYXJkIEtlbm5lciAgKGtlbm5lckB2bHNpMS51bHRyYS5ueXUuZWR1KQorCisJKiBjb25maWcuZ3Vlc3M6IEFkZCBhbHRlcm5hdGUgZm9ybXMgZm9yIENvbnZleC4KKworVGh1IEphbiAyMCAxNjoxMzo0MSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6ICBDb21wbGV0ZWx5IHJld3JpdGUgb3B0aW9uIHByb2Nlc3NpbmcuICBUYWtlCisJYWR2YW50YWdlIG9mIHBhdHRlcm4tbWF0Y2hpbmcgdG8gYXZvaWQgaW52b2tpbmcgdGVzdCBmcmVxdWVudGx5LgorCUFsc28gY2xlYW4gdXAgaG9zdCBhbmQgdGFyZ2V0IGRlZmF1bHRpbmcgbG9naWMuCisKK01vbiBKYW4gMTcgMTU6MDY6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFJlcGxhY2UgYWxsIG9jY3VycmFuY2VzIG9mICJyb290bWUiIHdpdGggInIiIGFuZAorCSIkJHtyb290bWV9IiB3aXRoICIkJHIiLCB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSBkby0qCisJY29tbWFuZHMgKHBsdXMgdXNlciBlbnZpcm9ubWVudCkgd2lsbCBmaXQgU0NPIGxpbWl0cy4KKworVGh1IEphbiAgNiAxMToyMDo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgaXNzdWUgd2FybmluZ3MgYWJvdXQgZGlyZWN0b3JpZXMgd2hpY2ggYXJlCisJbm90IGJlaW5nIGNvbmZpZ3VyZWQgaWYgLW5vcmVjdXJzaW9uIGlzIHNldC4gIENvcnJlY3QgdGVzdCBmb3IKKwktLXdpdGgtZ251LWFzIGFuZCAtLXdpdGgtZ251LWxkIHRvIG5vdCBnZXQgY29uZnVzZWQgYnkgc3Vic3RyaW5nCisJbWF0Y2hlcy4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBnYXMgZm9yIGFscGhhLWRlYy1vc2YxKi4KKworVHVlIEphbiAgNCAxNzoxMDoxOSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6ICBCYWNrIG91dCBQZXIncyBjaGFuZ2Ugb2YgMTIvMTkvMTk5My4gIEl0IGNoYW5nZXMgdGhlCisJYmVoYXZpb3Igb2YgY29uZmlndXJlIGluIHVuZXhwZWN0ZWQgYW5kIGNvbmZ1c2luZyB3YXlzLgorCisJQWxzbywgdXNlIGRpZmZlcmVudCBkZWxpbSBjaGFyIHdoZW4gY2FsY3VsYXRpbmcKKwlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHNvIHRoYXQgdGhlIG5hbWUgY2FuIGNvbnRhaW4gc2xhc2hlcy4KKworU2F0IEphbiAgMSAxMzo0NTozMSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLgorCitTYXQgRGVjIDI1IDIwOjAwOjQ3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWd1cmUuaW46IE51a2UgaGFja3Mgd2hpY2ggd2VyZSB1c2VkIHRvIGdldCBhIHNwZWNpYWwKKwl2ZXJzaW9uIG9mIEdBUyBmb3IgSFBQQSBjb25maWd1cmF0aW9ucy4KKworU3VuIERlYyAxOSAyMDo0MDo0NCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiAgSWYgb25seSAke3RhcmdldF9hbGlhc30gaXMgZ2l2ZW4sIHVzZSB0aGF0CisJYXMgdGhlIGRlZmF1bHQgZm9yICR7aG9zdF9hbGlhc30uCisJKiBjb25maWd1cmU6ICBBZGQgbWlzc2luZyBiYWNrLXNsYXNoZXMgYmVmb3JlIG5lc3RlZCBxdW90ZXMuCisKK1dlZCBEZWMgMTUgMTg6MDc6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogYWRkIFlBQ0M9JChCSVNPTikKKworVHVlIERlYyAxNCAyMToyNTozMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIHNvbWUgVGVrdHJvbml4IGNvbmZpZ3VyYXRpb25zLgorCUZyb20gS2F2ZWggUi4gR2hhemkgPGdoYXppQG5vYy5ydXRnZXJzLmVkdT4uCisKK1NhdCBEZWMgMTEgMTE6MTg6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IE1hdGNoIGFueSBmbGF2b3Igb2YgU0guCisKK1RodSBEZWMgIDIgMTc6MTY6NTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBEb24ndCB0cnkgdG8gY29uZmlndXJlIG5ld2xpYiBmb3IgQWxwaGEuCisKK1RodSBEZWMgIDIgMTQ6MzU6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxkIGZvciBJcml4IDUuICBEb24ndCBidWlsZCBnYXMsCisJbGliZysrIG9yIGxpYmlvIGZvciBhbnkgQWxwaGEgdGFyZ2V0LgorCisJKiBjb25maWd1cmUuaW4gKG1pcHMqLXNnaS1pcml4NSopOiBOZXcgdGFyZ2V0OyB1c2UgbWgtaXJpeDUuCisJKiBjb25maWcvbWgtaXJpeDUuIE5ldyBmaWxlIGZvciBJcml4IDUuCisKK1dlZCBEZWMgIDEgMTc6MDA6MzMgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChHWklQUFJPRyk6IFJlbmFtZWQgZnJvbSBHWklQLCB3aGljaCBnemlwIHVzZXMgZm9yCisJZGVmYXVsdCBhcmd1bWVudHMgLS0gc28gaXQgdHJpZWQgdG8gY29tcHJlc3MgaXRzZWxmLgorCitUdWUgTm92IDMwIDEzOjQ1OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChub3RzdXBwKTogZW5zdXJlIHRoYXQgYSBzcGFjZSBpcyBhbHdheXMgYXQgdGhlIGVuZAorCSAgb2YgdGhlIGNvbmZpZ2RpcnMgbGlzdCwgc2luY2UgdGhlIGdyZXAgY2hlY2tzIGZvciBhbiBleHBsaWNpdCBzcGFjZQorCitUdWUgTm92IDE2IDE1OjA0OjI3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluICh0YXJnZXQgaTM4Ni1zeXN2NC4yKTogZG9uJ3QgYnVpbGQgbGQsIHNpbmNlIHN0YXRpYworCSAgdmVyc2lvbnMgb2YgbWFueSBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUuCisKK1R1ZSBOb3YgMTYgMTQ6Mjg6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEFwb2xsb3MgKHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcykuCisJKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsZCwgYmludXRpbHMsIG9yIGdwcm9mIGZvciBBcG9sbG8uCisKK1RodSBOb3YgMTEgMTI6MDM6NTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFNvbnkgbmV3cyBtaXBzIHJ1bm5pbmcgbmV3c29zLgorCitXZWQgTm92IDEwIDE2OjU3OjAwIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhbGwtY3lnbnVzLCBidWlsZC1jeWdudXMpOiAiZmkgZWxzZSIgbmVlZHMgdG8gYmUKKwkiZmkgOyBlbHNlIiBmb3IgYmFzaC4KKworVHVlIE5vdiAgOSAxNTo1NDowMSAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcGFzcyBTSEVMTC4KKworRnJpIE5vdiAgNSAwODowNzoyNyAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGJsdWVzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IGFjY2VwdCB1bml4d2FyZSBhcyBhbiBhbGlhcyBmb3Igc3ZyNC4yLgorCUZpeCBzb21lIGluY29uc2lzdGFuY2llcyB3aXRoIHRoZSBnY2MgdmVyc2lvbi4KKworRnJpIE5vdiAgNSAxNToxNDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIEFkZCBnZGIuCisKK0ZyaSBOb3YgIDUgMTE6NTk6NDIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6ICBBZGQgbGliZysrIGFuZCBsaWJpby4KKworRnJpIE5vdiAgNSAxMDozNTowNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHRheik6IE9ubHkgYnVpbGQgImluZm8iIGluIERJU1RET0NESVJTLgorCShESVNURE9DRElSUyk6IERvbid0IGFzc3VtZSBsaWJnKysgYW5kIGdkYiBmb2xrcyBuZWNlc3NhcmlseSB3YW50CisJdGhpcyBub3cuCisKK1RodSBOb3YgIDQgMTg6NTg6MjMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IEFjY2VwdCBoaXV4KiBhcyBhbiBPUyBuYW1lLgorCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RfRkxBR1MgYmFjayB0byBSVU5URVNURkxBR1MgcGVyCisJZXRjL21ha2Utc3Rkcy50ZXhpLiAgVGhlIHVuZGVyc2NvcmUgY2FtZSBmcm9tIGdjYywgYW5kIGRqZSBub3cKKwlhZ3JlZXMgdGhhdCBSVU5URVNURkxBR1MgaXMgdGhlIGNvcnJlY3QgbmFtZS4KKworVGh1IE5vdiAgNCAxMDo0OTowMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC5zaDogIFJlbW92ZSAnc2V0IC1lJy4gIEl0IG1ha2VzIGFueSBjb25kaXRpb25hbHMKKwlpbiB0aGUgc2NyaXB0IHVzZWxlc3MuCisKKwkqIGNvbmZpZy5ndWVzczogQXV0b21hdGljYWxseSByZWNvZ25pemUgYXJtLWFjb3JuLXJpc2NpeAorCVBhdGNoIGZyb20gUmljaGFyZCBFYXJuc2hhdyAocndlMTFAY2wuY2FtLmFjLnVrKS4KKworVGh1IE5vdiAwNCAwODowODowNCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCisKK1dlZCBOb3YgIDMgMjI6MDk6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiBOZXcgdmFyaWFibGUuCisJKHRheik6IEVkaXQgbG9jYWwgTWFrZWZpbGUuaW4gc29vbmVyLCBpbnN0ZWFkIG9mIHByb3RvLXRvcGxldgorCU1ha2VmaWxlLmluIGxhdGVyLiAgQnVpbGQgImluZm8iIGFuZCAiZHZpIiBpbiBESVNURE9DRElSUy4gIAorCitXZWQgTm92ICAzIDIxOjMxOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChocHBhIHRhcmdldCk6IGNoZWNrIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZvciB0aGUKKwkgIHBhZ2FzIHN1Yi1kaXJlY3RvcnkKKworV2VkIE5vdiAgMyAxMToxMjoyMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBBbGxvdyAtYW91dCogYW5kIC1lbGYqLgorCitXZWQgTm92ICAzIDExOjA4OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBsZCBvbiBpMzg2LXNvbGFyaXMyLCBzYW1lIGFzIGZvcgorCXNwYXJjLXNvbGFyaXMyLgorCitUdWUgTm92ICAyIDE0OjIxOjI1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAodGF6KTogQWRkIHRleGluZm8vbGdwbC50ZXhpbmZvIChmb3IgbGliZysrKS4KKworVHVlIE5vdiAgMiAxMzozODozMCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZ3VyZS5pbjogIENvbmZpZ3VyZSBnZGIgZm9yIGFscGhhLgorCitNb24gTm92ICAxIDEwOjQyOjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBBZGQgLU8uCisKK1dlZCBPY3QgMjcgMTA6NDU6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IGFkZGVkIHN1cHBvcnQgZm9yIERHIEF2aWlvbgorCitUdWUgT2N0IDI2IDE0OjM3OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFByb2R1Y2Ugd2FybmluZyBtZXNzYWdlIGZvciBzdWJkaXJlY3RvcmllcyBub3QKKwljb25maWd1cmFibGUgZm9yIHRoaXMgaG9zdC90YXJnZXQgY29tYmluYXRpb24uICBEb24ndCB0cnkgdG8KKwljb25maWd1cmUgZ2RiIGZvciB2bXMuCisKK01vbiBPY3QgMjUgMTE6MjI6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh0YXopOiBSZXBsYWNlICJieWFjYyIgd2l0aCAiYmlzb24gLXkiIGluIHRoZQorCWFwcHJvcHJpYXRlIGZpbGVzIGJlZm9yZSBtYWtpbmcgImRpc3RzdHVmZiIuCisJKERJU1RCSVNPTkZJTEVTKTogTmV3IHZhcjogbGlzdCBvZiBmaWxlcyB0byBiZSBlZGl0ZWQuCisJKERJU1RTVFVGRkRJUlMpOiBBZGQgYmludXRpbHMuCisKK0ZyaSBPY3QgMjIgMjA6MzI6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBhbHNvIGhhbmRsZSBtaXBzZWwgYW5kIG1pcHM2NGVsIChmb3IgbGl0dGxlIGVuZGlhbiBtaXBzKQorCitGcmkgT2N0IDIyIDA3OjU5OjIwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCisKK1RodSBPY3QgMjEgMTE6Mzg6MjggMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEJ1aWxkIG5ld2xpYiBmb3IgTHlueE9TIG5hdGl2ZS4KKworV2VkIE9jdCAyMCAwOTo1NjoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgZGVsdGEgODhrIHJ1bm5pbmcgU1ZSMy4KKworCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudCBhYm91dCBIUCBjb21waWxlciB2cy4gZW1hY3MuCisKK1R1ZSBPY3QgMTkgMTY6MDI6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGxkIG9uIHNvbGFyaXMyIChub3QgYSB2aWFibGUgb3B0aW9uCisJICBkdWUgdG8gYnVncyBpbiBnZXRwd25hbSAmIGdldHB3dWlkKQorCitUdWUgT2N0IDE5IDE1OjEzOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBY2NlcHQgYWxwaGEtZGVjLW9zZjEqLCBub3QganVzdCAtb3NmMSwgc2luY2UKKwljb25maWcuZ3Vlc3Mgd2lsbCBwcm9kdWNlIGEgZnVsbCB2ZXJzaW9uIG51bWJlci4KKworVHVlIE9jdCAxOSAxNTo1ODowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbGlua2VyIGFuZCBiaW51dGlscyBmb3IgYWxwaGEtZGVjLW9zZjEuCisKK1R1ZSBPY3QgMTkgMTE6NDE6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgLU8gZnJvbSBDWFhGTEFHUyBmb3IgY29uc2lzdGVuY3kgd2l0aCBDRkxBR1MsCisJYW5kIGdkYi90ZXN0c3VpdGUvTWFrZWZpbGUuaW4uCisKK1NhdCBPY3QgIDkgMTg6Mzk6MDcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtaXBzKi0gaW5zdGVhZCBvZiBtaXBzLQorCitGcmkgT2N0ICA4IDE0OjE1OjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBBY2NlcHQgbGludXgqY29mZiBhbmQgbGludXgqZWxmIGFzIG9wZXJhdGluZworCXN5c3RlbXMuCisKK1RodSBPY3QgIDcgMTI6NTc6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbWlwczY0LCBhbmQgbWlwczMgYXMgYW4gYWxpYXMgZm9yIGl0LgorCitXZWQgT2N0ICA2IDEzOjU0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlndXJlLmluOiBSZW1vdmUgYWxwaGEtZGVjLW9zZiosIG5vIGxvbmdlciBuZWNlc3Nhcnkgbm93IHRoYXQKKwlnZGIga25vd3MgaG93IHRvIGhhbmRsZSBPU0YvMSBzaGFyZWQgbGlicmFyaWVzLgorCitUdWUgT2N0ICA1IDExOjU1OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCisJKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBIaXRhY2hpJ3MgSElVWC4KKwkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBoMzA1MHIqIGFuZCBocHBhaGl0YWNoaS4KKwlSZW1vdmUgcmVkdW5kYW50IGNhc2VzIGZvciBocDlrWzIzXSouCisKK01vbiBPY3QgIDQgMTY6MTU6MDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGRlZmF1bHQgdG8gJy0td2l0aC1nbnUtYXMnIGFuZCAnLS13aXRoLWdudS1sZCcKKwlpZiBnYXMgYW5kIGxkIGFyZSBpbiB0aGUgc291cmNlIHRyZWUgYW5kIGFyZSBpbiAke2NvbmZpZ2RpcnN9LgorCUlmICR7dXNlX2dudV9hc30gb3IgJHt1c2VfZ251X2xkfSBhcmUgJ25vJywgdGhlbiBkb24ndCBzZXQgdGhlCisJdGhlIC0td2l0aCBvcHRpb25zIChidXQgc3RpbGwgcGFzcyB0aGVtIGRvd24gb24gdGhlIGNvbW1hbmQgbGluZSwKKwlpZiB0aGV5IHdlcmUgZXhwbGljaXRseSBzcGVjaWZpZWQpLgorCitGcmkgU2VwIDI0IDE5OjExOjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBzdWJzdGl0dXRlIFNIRUxMIHZhbHVlIGluIE1ha2VmaWxlLmluIHdpdGgKKwkke0NPTkZJR19TSEVMTH0KKworVGh1IFNlcCAyMyAxODowNToxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ2FzLCBsZCwgYW5kIGJpbnV0aWxzIGZvciAqLSotc3lzdjQqIGFuZAorCSotKi1zb2xhcmlzMiogdGFyZ2V0cy4KKworU3VuIFNlcCAxOSAxNzowMTo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBkZWZpbmUgTTQsIGFuZCBwYXNzIGl0IGRvd24gdG8gc3ViLW1ha2VzOworCWFsbC1hdXRvY29uZiBub3cgZGVwZW5kcyBvbiBhbGwtbTQKKworU2F0IFNlcCAxOCAwMDozODoyMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh7QVIsUkFOTElCfV9GT1JfVEFSR0VUKTogbWFrZSBjb250aW5nZW50IG9uCisJcHJlc2VuY2Ugb2Yge2FyLHJhbmxpYn0gaW5zdGVhZCBvZiBhIGNvbmZpZ3VyZWQgZGlyZWN0b3J5CisKK1dlZCBTZXAgMTUgMDg6NDE6NDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IEFjY2VwdCAzND8/IGFzIHdlbGwgYXMgMzM/PyBmb3IgTkNSLgorCitNb24gU2VwIDEzIDEyOjI4OjQzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBncmFiIG10LWhwcGEgZm9yIEhQUEEgdGFyZ2V0czsgdXNlICdnYXMgJyBpbnN0ZWFkCisJb2YgJ2dhcycgaW4gc2VkIGNvbW1hbmRzLCBzaW5jZSAnZ2FzaCcgaXMgbm93IGluIHRoZSB0cmVlIGFzIHdlbGwuCisKK0ZyaSBTZXAgMTAgMTE6MjM6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGdyYWIgdmFsdWVzIGZvciAkKENDKSBhbmQgJChDWFgpIGZyb20gdGhlCisJZW52aXJvbm1lbnQsIHNvIHRoYXQgc29tZW9uZSBjYW4gZG8gIkNDPWdjYyBjb25maWd1cmU7IG1ha2UiIGFuZAorCWhhdmUgaXQgd29yayByaWdodCAobWF0Y2hpbmcgdGhlIHdheSB0aGF0IGF1dG9jb25mIHdvcmtzIG5vdykKKworCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogYWRkIHN1cHBvcnQgZm9yIGdhc2gsIHRoZSB0Y2wKKwlpbnRlcmZhY2UgdG8gR2FsYXh5CisKKwkqIGNvbmZpZy5ndWVzczogYWRkIE5ldEJTRCB2YXJpYW50cyAoaHAzMDAsIHg4NikKKworVGh1IFNlcCAgOSAxNjo0ODo1MiAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC5zaDogU3VwcG9ydCAtZCBvcHRpb24gKGluIHRoZSBtYW5uZXIgb2YgU3VuT1MgNCBpbnN0YWxsLAorCWFzIGl0IGlzIG1vcmUgZGV0ZXJtaW5pc3RpYyB0aGFuIHRoYXQgb2YgR05VIGluc3RhbGwpCisJKGNobW9kY21kKTogU2V0IGZpbGUgdG8gbW9kZSA3NTUgYnkgZGVmYXVsdCAoc2hvdWxkIGFsc28gZG8gZGVmYXVsdAorCWNoZ3JwIGFuZCBjaG93biwgYnV0IEkgZG9uJ3QgZmVlbCBsaWtlIGRlYWxpbmcgd2l0aCB0aGF0IG5vdykKKworVHVlIFNlcCAgNyAxMTo1OTozOSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBSZW1vdmUgaDgzMDBoaG1zIGFsaWFzLgorCitUdWUgQXVnIDMxIDExOjAwOjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IE1hdGNoICotKi1zb2xhcmlzMiogbm90ICotc3VuLXNvbGFyaXMyKi4KKworTW9uIEF1ZyAzMCAxODoyOToxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IHRvdWNoIHN0bXAtZml4cHJvdG8gYXMgd2VsbAorCWFzIHN0bXAtZml4aW5jCisKK1dlZCBBdWcgMjUgMTY6MzU6NTkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiByZWNvZ25pemUgbTg4MTEwLWJ1Zy1jb2ZmLgorCitUdWUgQXVnIDI0IDEwOjIzOjI0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbC1saWJpbyk6IGFsbCBkZXBlbmRlbmNpZXMgb24gdGhlIHRvb2xjaGFpbiB1c2VkCisJdG8gYnVpbGQgdGhpcyAoZ2NjLCBnYXMsIGxkLCBldGMpCisKK0ZyaSBBdWcgMjAgMTc6MjQ6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogRGVhbCB3aXRoIE9TRi8xIDEuMyBvbiBhbHBoYS4KKworVGh1IEF1ZyAxOSAxMTo0MzowNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGluc3RhbGwuc2g6IGFkZCBzb21lICdlbHNlIHRydWUnIGNsYXVzZXMgZm9yIHBvcnRhYmlsaXR5CisKKwkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYnVpbGQgbGliaW8gZm9yIGg4WzM1XTAwLSotKiB0YXJnZXRzCisKK1R1ZSBBdWcgMTcgMTk6MDI6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIHN1cHBvcnQgZm9yIG5ldyBsaWJpby4KKworU3VuIEF1ZyAxNSAyMDo0ODo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC5zaDogSWYgb25lIGNvbW1hbmQgZmFpbHMsIGRvbid0IHRyeSB0aGUgcmVzdC4gIERvbid0IHRyeQorCXRvIHJlbW92ZSAkZHN0dG1wICh2aWEgdHJhcCkgdW5sZXNzIHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkIGl0LgorCUlmICRzcmMgZG9lc24ndCBleGlzdCwgZGV0ZWN0IGl0IGFuZCBleGl0IHdpdGggYW4gZXJyb3IuCisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEJTRCBvbiBocDMwMC4KKworV2VkIEF1ZyAxMSAxODozNToxMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiAgTWFwICg5MDAwL1szNF0/PzpIUC1VWDoqOiopIHRvIG02OGstaHAtaHB1eC4KKwlCdWcgcmVwb3J0IGZyb20gIkhhbWlzaCAoSC5JLikgTWFjZG9uYWxkIiA8aGFtaXNoQGJuci5jYT4uCisKK1dlZCBBdWcgMTEgMTU6Mzc6NTEgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhbGwtc2VuZC1wcik6IGRlcGVuZHMgb24gYWxsLXBybXMKKworV2VkIEF1ZyAxMSAxNjo1NjowMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBGaXggdHlwbyAoOTAwMC84Pz86NC4zYnNkIC0+IDkwMDAvNz8/OjQuM2JzZCkuCisKK0ZyaSBBdWcgIDYgMTQ6NDU6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IEZyb20gbWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYSAoTWljaGFlbCBSZW5kZWxsKToKKwlBZGRlZCB0ZXN0IGZvciBtaXBzLW1pcHMtcmlzY29zNS4KKworVGh1IEF1ZyAgNSAxNTo0NTowOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLWhwMzAwIGZvciA2OGsgSFAgaG9zdHMKKworTW9uIEF1ZyAgMiAxMTo1Njo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogYWRkIHN1cHBvcnQgZm9yIENPTkZJR19TSEVMTCwgc28gdGhhdCB5b3UgY2FuIHVzZQorCXNvbWUgYWx0ZXJuYXRlIHNoZWxsIGZvciBldmFsdWF0aW5nIGNvbmZpZ3VyZSBzY3JpcHRzCisKK1N1biBBdWcgIDEgMTE6MzY6MjcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgU2VkIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcworCWluIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUgd2hlbiBidWlsZGluZworCWRpc3RyaWJ1dGlvbiBhcmNoaXZlLgorCSogTWFrZWZpbGUuaW4gKENPTVBSRVNTKTogIFJlbW92ZSBkZWYuCisJKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5neiwgbWFrZS1nZGIudGFyLmd6KTogIFJlbmFtZWQgZnJvbQorCWdkYi50YXIuWiBhbmQgbWFrZS1nZGIudGFyLlogcmVzcGVjdGl2ZWx5LgorCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5neik6ICBOb3cgb25seSBidWlsZCBnemlwJ2QgYXJjaGl2ZS4KKwkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgTWlub3IgY2hhbmdlcyB0byBtb3ZlIGNsb3NlcgorCXRvIGNvbnZlcmdlbmNlIHdpdGggJ3RheicgdGFyZ2V0IGluIE1ha2VmaWxlLmluLgorCitGcmkgSnVsIDMwIDEyOjM0OjU3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC5zaCAoZHN0dG1wKTogdXNlIHRyYXAgdG8gZW5zdXJlIHRoYXQgdG1wIGZpbGVzIGdvCisJYXdheSBvbiBlcnJvciBjb25kaXRpb25zCisKK1dlZCBKdWwgMjggMTE6NTc6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcmVtb3ZlIExPQURMSUJFUworCitUdWUgSnVsIDI3IDEyOjQzOjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kaXJzKTogRGVhbCB3aXRoIGEgcHJlZml4IGxpa2UgL2dudTsKKwlpdHMgcGFyZW50IGlzICcvJyBub3QgJycuCisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBBZGQgY29tbWVudHMgYWJvdXQgQ2hhbmdlTG9nLgorCitGcmkgSnVsIDIzIDA5OjUzOjM3IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkB3YWhpbmkuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBpZiAke25ld3NyY2Rpcn0vY29uZmlndXJlIGRvZXNuJ3QgZXhpc3QsIGRvbid0IGFzc3VtZQorCXRoYXQgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBkb2VzLgorCitUdWUgSnVsIDIwIDExOjI4OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogdGVzdC1idWlsZC5tazogc3VwcG9ydCBmb3IgQ09ORklHX1NIRUxMCisKK01vbiBKdWwgMTkgMjE6NTQ6NDYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWIgKG5ldHdhcmUpOiAgQWRkIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCisKK1dlZCBKdWwgMTQgMTI6MDM6MTEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBkZXBlbmQgb24gY29uZmlndXJlLmluLiAgQWxzbyBkcm9wIHRoZQorCSAgJChzcmNkaXIpLyBmcm9tIHRoZSBkZXBlbmRlbmN5IG9uIE1ha2VmaWxlLmluLgorCitUdWUgSnVsIDEzIDIwOjEwOjU4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBoODMwMGhobXMgYXMgaDgzMDBoLWhpdGFjaGktaG1zLgorCShoODMwMGhobXMgaXMgdGVtcG9yYXJ5IHVudGlsIG11bHRpLWxpYnJhcmllcyBhcmUgaW1wbGVtZW50ZWQpLgorCSogY29uZmlndXJlLmluOiBIYW5kbGUgaDgzMDBoIHRvby4KKworU3VuIEp1bCAxMSAxNzozNToyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgZHB4LzIgYXMgbTY4ay1idWxsLXN5c3YzLgorCitUaHUgSnVsICA4IDE4OjI2OjEyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6ICBSZW1vdmUgZXh0cmFuZW91cyBvdXRwdXQgd2hlbiBndWVzc2luZyBob3N0IHR5cGUuCisJKiBjb25maWcuZ3Vlc3M6ICBSZW1vdmUgZXh0cmFuZW91cyBvdXRwdXQgd2hlbiBndWVzc2luZyB1c2luZyBDCisJY29tcGlsZXIgcmF0aGVyIHRoYW4gdW5hbWUsIG9yIHdoZW4gZ3Vlc3NpbmcgZmFpbHMuCisKK1dlZCBKdWwgIDcgMTc6NTg6MTQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGFsbC5jcm9zcyBhbmQgaW5zdGFsbC5jcm9zcyB0YXJnZXRzCisKKwkqIGNvbmZpZ3VyZTogcmVtb3ZlIENST1NTPS1EQ1JPU1NfQ09NUElMRSBhbmQgQUxMPWFsbC5jcm9zcworCSAgZGVmaW5pdGlvbnMKKworVHVlIEp1bCAgNiAxMDozOTo0NCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHRhcmdldCBzaCk6IEJ1aWxkIGdwcm9mLgorCitUaHUgSnVsICAxIDE2OjUyOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogY2hhbmdlIC1zb2xhcmlzIHRvIC1zb2xhcmlzMgorCitUaHUgSnVsICAxIDE1OjQ2OjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFVzZSBjb25maWcvbWgtcmlzY29zIGZvciBtaXBzLSotc3lzdiouCisKK1dlZCBKdW4gMzAgMDk6MzE6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IENvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgbWlzc2luZyBNYWtlZmlsZS5pbiB0bworCXByaW50IGNvcnJlY3QgZGlyZWN0b3J5LgorCitUdWUgSnVuIDI5IDEzOjUyOjE2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC5zaDoga2x1ZGdlIGFyb3VuZCAzODZCU0Qgc2hlbGwgYnVnCisKK1R1ZSBKdW4gMjkgMTM6MDY6NDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgTmVYVC4KKwkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBpNDg2LW5jci1zeXN2NC4KKwkqIE1ha2VmaWxlLmluICh0YXopOiAgcm0gJChUT09MKS0kJFZFUiBiZWZvcmUgbGlua2luZy4KKworVHVlIEp1biAyOSAxMjo1MDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChNQUtFSU5GT0ZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShGTEFHU19UT19QQVNTKTogUGFzcyBNQUtFSU5GTyBhcyBNQUtFSU5GTyBNQUtFSU5GT0ZMQUdTLgorCSogYnVpbGQtYWxsLm1rLCB0ZXN0LWJ1aWxkLm1rOiBQYXNzIGRvd24gLS1uby1zcGxpdCBhcworCU1BS0VJTkZPRkxBR1Mgd2hlbiBob3N0ZWQgb24gRE9TLiAgQ29tcGlsZSBET1MgaG9zdGVkIHdpdGhvdXQgLWcuCisKK1RodSBKdW4gMjQgMTM6Mzk6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogIEFkZCBDT1BZSU5HIENPUFlJTkcuTElCIGluc3RhbGwuc2guCisKK1dlZCBKdW4gMjMgMTI6NTk6MjEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobGliZysrLnRhci56KTogIE5ldyBydWxlLgorCSogTWFrZWZpbGUuaW4gKHRheik6ICBSZXBsYWNlICdjb25maWd1cmUgLXJtJyBieSAnbWFrZSBkaXN0Y2xlYW4nLgorCSogTWFrZWZpbGUuaW4gKHRheik6ICBPbmx5IGRvIGEgc2luZ2xlIGNobW9kLgorCitGcmkgSnVuIDE4IDEyOjAzOjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBtYWppcG9vci5jeWdudXMuY29tKQorCisJKiBpbnN0YWxsLnNoOiBkb24ndCB1c2UgZGlybmFtZSBhbnltb3JlIChyZXBsYWNlZCB3aXRoIHNlZCB1c2FnZSkKKworVGh1IEp1biAxNyAxODo0Mzo0MiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZXh0ZW5zaW9uIGZvciBnemlwJ2QgZmlsZXMgZnJvbSAnLnonIHRvCisJJy5neicgcGVyIG5ldyBGU0Ygc3RhbmRhcmQgdXNhZ2UuCisKK1RodSBKdW4gMTcgMTY6NTg6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IG1hamlwb29yLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogcHV0IHF1b3RlcyBhcm91bmQgdGhlIGZpbmFsIHZhbHVlIG9mIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKKworVHVlIEp1biAxNSAxNjo0ODo1MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBuZXcgaW5zdGFsbC5zaCBzdXBwb3J0OyB1cGRhdGUgaW5zdGFsbC1pbmZvIHJ1bGVzCisKK1dlZCBKdW4gIDkgMTI6MzE6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEJ1aWxkIGRpZmYgZm9yIGNyb3NzZXMsIGJ1dCBub3QgZm9yIGdvMzIgaG9zdC4KKworCSogY29uZmlndXJlLmluOiBCdWlsZCBncHJvZiBvbmx5IGZvciBuYXRpdmUsIGFuZCBkb24ndCBidWlsZCBpdAorCWZvciBtaXBzLSotKiwgcnM2MDAwLSotKiwgb3IgaVszNF04Ni0qLXNjbyouCisKK01vbiBKdW4gIDcgMTM6MTI6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgYnVpbGQgZ2FzLGxkLGJpbnV0aWxzIG9uIGZvciAqLSotc3lzdjQKKworTW9uIEp1biAgNyAxMTo0MDoxMSAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZCBwcm1zLgorCitGcmkgSnVuICA0IDEzOjMwOjQyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluc3RhbGwgZ2NjLCBkbyBpbnN0YWxsYXRpb24gb2YgJChJTlNUQUxMX01PRFVMRVMpCisJd2l0aCAkKEZMQUdTX1RPX1BBU1MpIG9uIHRoZSBjb21tYW5kIGxpbmUKKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIGx5bnggYW5kIGx5bnhvcworCitGcmkgSnVuICA0IDEwOjU5OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogQWNjZXB0IC1lY29mZiosIG5vdCBqdXN0IC1lY29mZi4KKworVGh1IEp1biAgMyAxNzozODo1NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh0YXopOiBVc2UgLmd6IHN1ZmZpeCBpbnN0ZWFkIG9mIC56LgorCShiaW51dGlscy50YXIuZ3osIGdhcytiaW51dGlscy50YXIuZ3osIGdhcy50YXIuZ3opOiBGaXhlZCB0YXJnZXQKKwluYW1lcy4KKworVGh1IEp1biAgMyAwMDoyNzowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh2YXVsdC1pbnN0YWxsKTogYWRkIGFuICdlbHNlIHRydWUnIChmb3IgVWx0cml4KQorCitXZWQgSnVuICAyIDE4OjE5OjE2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcyk6ICBpbnN0YWxsIGdjYyBsYXN0LCBzbworCXRoYXQgcmVidWlsZHMgdGhhdCBtaWdodCBoYXBwZW4gZHVyaW5nICdtYWtlIGluc3RhbGwnIGRvbid0IGdldAorCWJvZ3VzIGdjYyBpbmNsdWRlIGZpbGVzCisKK1dlZCBKdW4gIDIgMTY6MTQ6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJQ2hhbmdlIGZyb20gVXRhaCBmb3IgSFBQQSBzdXBwb3J0OgorCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaHBwYTEueC1ocC1ic2QuCisKK1dlZCBKdW4gIDIgMTE6NTM6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6ICBBZGQgc3VwcG9ydCBmb3IgTW90b3JvbGEgRGVsdGEgNjhrLCB1cCB0byByM3Y3LgorCVBhdGNoIGZyb20gcG90QGZseS5jbnVjZS5jbnIuaXQgKEZyYW5jZXNjbyBQb3RvcnRpYCkuCisKK1R1ZSBKdW4gIDEgMTc6NDg6NDIgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYiBhdCBkYXJrc3Rhci5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBBZGQgc3VwcG9ydCBmb3Igcm9tNjhrIGFuZCBidWcgYm9vdCBtb25pdG9ycy4KKworTW9uIE1heSAzMSAwOTozNjozNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IE1ha2UgYWxsLW9wY29kZXMgZGVwZW5kIG9uIGFsbC1iZmQuCisKK1RodSBNYXkgMjcgMDg6MDU6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IEFkZGVkIHNwZWNpYWwgY2hlY2sgZm9yIGlbMzRdODYtdW5pdmVsLXN5c3Y0Ki4KKworV2VkIE1heSAyNiAxNjozMzo0MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogRm9yIGlbMzRdODYtdW5rbm93bi1zeXN2NCB1c2UgVU5BTUVfTUFDSElORSBmb3IKKwl0aGUgcHJvY2Vzc29yIHJhdGhlciB0aGFuIGFzc3VtaW5nIGk0ODYuCisKK1dlZCBNYXkgMjYgMDk6NDA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFN1bk9TNiBhcyBTb2xhcmlzMy4KKworVHVlIE1heSAyNSAyMzowMzoxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiAgRml4IHR5cG8uICBBdm9pZCAjZWxpZiAobm90IGluIEsmUiAxKS4KKwlSZWNvZ25pemUgU3VuT1MgNS4qIG9ubHkgKGFuZCBub3QgWzYtOV0uKikgYXMgYmVpbmcgU29sYXJpczIuCisKK1R1ZSBNYXkgMjUgMTI6NDQ6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBidWlsZC1hbGwubWsgKGFsbC1jcm9zcyk6IE5ldyB0YXJnZXQgZm9yIENhbmFkaWFuIENyb3NzLgorCUFkZGVkIFEyIGdvMzIgdGFyZ2V0cy4KKwkqIHRlc3QtYnVpbGQubWs6IENvbmZpZ3VyZSBnbzMyIGNyb3NzIHNwYXJjbGl0ZS1hb3V0IGFuZAorCW1pcHMtaWR0LWVjb2ZmIC13aXRoLWdudS1sZC4gIE1vdmVkIGJ1aWxkIGJpbmFyeSBkaXJlY3RvcnkgZnJvbQorCVBBUlRJQUxfSE9MRV9ESVJTIHRvIEJVSUxEX0hPTEVTX0RJUlMuCisKK01vbiBNYXkgMjQgMTU6MzA6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGZpeCBBbHBoYSBHREIgdHlwbzsgYWxzbywgZG9uJ3QgYnVpbGQgRGVqYUdudSBmb3IKKwlHTzMyIGhvc3RlZCB0b29sY2hhaW5zCisKK01vbiBNYXkgMjQgMTQ6MTg6NDEgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYiBhdCBkYXJrc3Rhci5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGNoYW5nZSAgc28gIi1leGVjLXByZWZpeCIgZ2V0cyBwYXNzZWQgZG93biByYXRoZXIKKwl0aGFuICItZXhlY19wcmVmaXgiIHNvIGF1dG9jb25mIGdlbmVyYXRlZCBNYWtlZmlsZXMgZ2V0IHRoZQorCWV4ZWNfcHJlZml4IHNldCByaWdodC4KKworRnJpIE1heSAyMSAxMDo0MjoyNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogZ2V0IHRoZSBTb2xhcmlzMiBtaW5vciB2ZXJzaW9uIG51bWJlcgorCisJKiBNYWtlZmlsZS5pbjogYWRkIHN0YW5kYXJkcy50ZXhpIGFuZCBtYWtlLXN0ZHMudGV4aSB0byBFVENfU1VQUE9SVAorCitGcmkgTWF5IDIxIDA2OjIwOjUyIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgc29tZSBTZXF1ZW50IHBsYXRmb3Jtcy4KKworVGh1IE1heSAyMCAxNDozMzo0OCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCB0aGUgdmF1bHQtaW5zdGFsbCB0YXJnZXQKKworCSogY29uZmlndXJlLmluOiBhY3R1YWxseSB1c2UgdGhlIFN1bjMgbWFrZWZpbGUgZnJhZ21lbnQgdGhhdCdzIGluCisJY29uZmlnLCBhbHNvIGFkZGVkIHRoZSByZWxlYXNlIGRpciB0byBjb25maWdkaXJzCisKK1RodSBNYXkgMjAgMTQ6MTk6MTggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAodGF6KTogRml4IG1vZGVzIG9uIHN0dWZmIGluICQoVE9PTCkgZGlyIGFsc28uCisKK1R1ZSBNYXkgMTggMjA6MjY6NDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlbW92ZSBzb21lIHByb2dyYW0gZnJvbSBBbHBoYSB0YXJnZXR0ZWQgdG9vbGNoYWlucworCitUdWUgTWF5IDE4IDE1OjIzOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGRElSUyk6IFJlbmFtZWQgZnJvbSBQUk9UT0RJUlMuICBBZGQgbGQgYW5kCisJZ3Byb2YuCisJKHRheik6IFJ1biAibWFrZSBkaXN0c3R1ZmYiIGluIHRob3NlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgIm1ha2UKKwlwcm90by1kaXIiLiAgTG9vayBmb3IgIlZFUlNJT049IiBvbmx5IGF0IHN0YXJ0IG9mIGxpbmUgaW4gc3ViZGlyCisJTWFrZWZpbGUuICBVc2UgImd6aXAgLTkiIGZvciBjb21wcmVzc2lvbi4KKwkoVEVYSU5GT19TVVBQT1JULCBESVNUX1NVUFBPUlQsIEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IE5ldyB2YXJzLgorCShiaW51dGlscy50YXIueik6IE5ldyB0YXJnZXQuCisKK01vbiBNYXkgMTcgMTc6MDE6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh0YXopOiBJbmNsdWRlIGdwbC50ZXhpbmZvLgorCitGcmkgTWF5IDE0IDA2OjQ4OjM4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycyk6IE1lcmdlZCBpbnRvICJ0YXoiIHRhcmdldC4KKwkodGF6KTogT25seSBkbyBgcHJvdG8tZGlyJyBzdHVmZiBpZiBhIGRpcmVjdG9yeSBpcyBhY3R1YWxseSBuZWVkZWQKKwlmb3IgdGhpcyB0YXJnZXQuCisKK1dlZCBNYXkgMTIgMTM6MDk6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTVVOQ0hfTk0pOiBOZXcgdmFyaWFibGUsIGRlZmluZWQgdG8gYmUgJChOTSkuCisJKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gTVVOQ0hfTk0uCisJKEhPU1RfQ0MsIEhPU1RfUFJFRklYLCBIT1NUX1BSRUZJWF8xKTogTmV3IHZhcmlhYmxlcy4KKwkoRVhUUkFfR0NDX0ZMQUdTKTogUGFzcyBkb3duIEhPU1RfKiB2YXJpYWJsZXMuCisJKGdjYy1uby1maXhlZGluY2x1ZGVzKTogQ29ycmVjdCBmb3IgY3VycmVudCBnY2MgTWFrZWZpbGUuCisKK1R1ZSBNYXkgMTEgMTA6MTQ6MjUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBBZGQgY29uZmlndXJlLCBjb25maWcuZ3Vlc3MsCisJY29uZmlnLnN1YiwgYW5kIG1vdmUtaWYtY2hhbmdlIHRvIGdkYiB0ZXN0c3VpdGUgZGlzdHJpYnV0aW9uCisJYXJjaGl2ZSwgc28gdGhlIHRlc3RzdWl0ZSBjYW4gYmUgZXh0cmFjdGVkLCBjb25maWd1cmVkLCBhbmQKKwlydW4gc2VwYXJhdGVseSBmcm9tIHRoZSBnZGIgZGlzdHJpYnV0aW9uLiAgQmxvdyBhd2F5IHRoZSBDaGlsbAorCXRlc3RzIHRoYXQgcmVxdWlyZSBhIENoaWxsIGNvbXBpbGVkIGV4ZWN1dGFibGUsIHNpbmNlIEdOVSBDaGlsbAorCWlzIG5vdCB5ZXQgcHVibGljYWxseSBhdmFpbGFibGUuCisKK01vbiBNYXkgMTAgMTc6MjI6MjYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiB0ZXN0LWJ1aWxkLm1rOiBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIGEgc2luZ2xlIGNvbW1hbmQsCisJaW5zdGVhZCBvZiBhIGxpc3Qgb2YgYXNzaWdubWVudHMgYW5kIGV4cG9ydHMKKworCSogY29uZmlnLmd1ZXNzOiByZWNvZ25pemUgQWxwaGEvT1NGMSBzeXN0ZW1zCisKK01vbiBNYXkgMTAgMTQ6NTU6NTEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IENoYW5nZSBoZWxwIG1lc3NhZ2UgdG8gcHJlZmVyIC0tb3B0aW9ucyByYXRoZXIgdGhhbgorCSAgLW9wdGlvbnMuCisKK01vbiBNYXkgMTAgMDU6NTg6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IENvbnZlcmdlbnQgVGVjaC4gIm1pbmlmcmFtZSIgdXNlcyBtNjgwMTAsIHNlegorCXppcHB5QGVjc3QuY3N1Y2hpY28uZWR1LgorCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgbWluaWZyYW1lLgorCitTdW4gTWF5ICA5IDE3OjQ3OjU3IDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKKworICAgICAgICogTWFrZWZpbGUuaW46IFVzZSBzcmNyb290IHRvIGZpbmQgcnVudGVzdCByYXRoZXIgdGhhbiByb290bWUuCisgICAgICAgUGFzcyBSVU5URVNURkxBR1MgYW5kIEVYUEVDVCBkb3duIGluIEJBU0VfRkxBR1NfVE9fUEFTUy4KKworRnJpIE1heSAgNyAxNDo1NTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHRlc3QtYnVpbGQubWs6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gc3VwcG9ydCBidWlsZGluZyBvbiBhCisJbWFjaGluZSBvdGhlciB0aGFuIHRoZSBob3N0LgorCitXZWQgTWF5ICA1IDA4OjM1OjA0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUgKHRvb2xkaXIpOiBGaXggZm9yIGkzODYtYWl4IGFnYWluLgorCitNb24gTWF5ICAzIDE5OjAwOjI3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGRlZmluaXRpb24gb2YgJCh0b29sZGlyKQorCXRvIG1hdGNoIHRoZSBGU0YuCisKK0ZyaSBBcHIgMzAgMTU6NTU6MjEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBpWzM0XTg2L1NWUjQuCisKK0ZyaSBBcHIgMzAgMTU6NTI6NDYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhbGwtZ2RiKTogZ2RiIGRlcGVuZHMgb24gc2ltLgorCitUaHUgQXByIDI5IDIzOjMwOjQ4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIE1ha2UgcHJvdG90eXBlIGdkYiB0ZXN0c3VpdGUgZGlyZWN0b3J5CisJYXQgdGhlIHNhbWUgdGltZSB3ZSBtYWtlIHRoZSBwcm90b3R5cGUgZ2RiIGRpcmVjdG9yeS4KKwkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBNYWtlIHRoZSB0ZXN0c3VpdGUgZGlzdHJpYnV0aW9uCisJZmlsZXMgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgZ2RiIGJhc2UgcmVsZWFzZSBkaXN0cmlidXRpb24uCisKK1RodSBBcHIgMjkgMTI6NTA6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBVc2UgaW5kaXZpZHVhbCBjaGVjayB0YXJnZXRzIHJhdGhlciB0aGFuCisJRE9fWCBydWxlLgorCShjaGVjay1nY2MpOiBBZGRlZC4KKworVGh1IEFwciAyOSAwOTo1MDowNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogVXNlIHN5c3YzLjIgbm90IHN5c3YzMiBmb3IgY2Fub25pY2FsIE9TCisJZm9yIFN5c3RlbSBWIHJlbGVhc2UgMy4yLgorCitUaHUgQXByIDI5IDEwOjMzOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogUmVjb2duaXplIGhwcGFvc2YuCisJKiBjb25maWd1cmUuaW46IERvIGNvbmZpZ3VyZSBsZC9iaW51dGlscy9nYXMgZm9yIGl0LgorCitUdWUgQXByIDI3IDA2OjI1OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUgKHRvb2xkaXIpOiBBbHRlciBzeW50YXggdXNlZCB0byBzZXQgdGhpcywgZm9yIHN5c3RlbXMKKwl3aGVyZSAiXCQiIGlzbid0IGhhbmRsZWQgcmlnaHQsIGxpa2UgaTM4Ni1haXguCisKK1RodSBBcHIgMjIgMDg6MTc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IFBhc3MgcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSwgbm90CisJcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSwgdG8gcmVjdXJzaXZlIGNvbmZpZ3VyZXMuCisKK1RodSBBcHIgMjIgMDI6NTg6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChnYXMrYmludXRpbHMudGFyLnopOiBOZXcgcnVsZSBmb3IgYnVpbGRpbmcgc25hcHNob3RzCisJb2YgZ2FzK2xkK2JpbnV0aWxzLgorCitNb24gQXByIDE5IDE3OjQxOjMwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgQUlYMy4yIGFzIGRpc3RpbmN0IGZyb20gMy4xLgorCitTYXQgQXByIDE3IDE3OjE5OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZW5hbWUgbTg4ay1tb3Rvcm9sYS1tODhrYmNzIHRvIG04OGstbW90b3JvbGEtc3lzdgorCisJKiBjb25maWcvbWgtZGVsdGE4ODogcmVtb3ZlIGV4dHJhbmVvdXMgR0NDIHJlZmVyZW5jZXMKKworVHVlIEFwciAxMyAxNjo1MjoxNiAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChQUk1TKTogU2V0IGJhY2sgdG8gYWxsLXBybXMuCisKK1NhdCBBcHIgMTAgMTI6MDQ6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB0ZXN0LWJ1aWxkLm1rOiBQYXNzIC13aXRoLWdudS1hcyBmb3Iga25vd24gTUlQUyBuYXRpdmUgYW5kIE1JUFMKKwl0YXJnZXRzLCByYXRoZXIgdGhhbiBmb3IgTUlQUyBob3N0cy4KKworRnJpIEFwciAgOSAxMzo1MTowNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGNvbW1lbnQgZm9yIC0td2l0aC14IGRlZmF1bHQgdmFsdWVzCisKKwkqIGNvbmZpZy5ndWVzczogaGFuZGxlIE1vdG9yb2xhIERlbHRhODggYm94IGZvciBTVlIzIGFuZCBTVlI0LgorCisJKiBNYWtlZmlsZS5pbjogYWRkIGNoZWNrLSogdGFyZ2V0cyBmb3IgZWFjaCBvZiB0aGUgZGlyZWN0b3JpZXMgaW4KKwl0aGUgdHJlZS4gIEFkZCBhIGRlZmluaXRpb24gb2YgUlVOVEVTVCB0aGF0IHdpbGwgdXNlIHRoZSBvbmUgd2UKKwlqdXN0IGJ1aWx0LCBpZiBpdCBleGlzdHMuICBQYXNzIHRoaXMgZG93biB2aWEgRkxBR1NfVE9fUEFTUy4KKworVGh1IEFwciAgOCAwOToyMTozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlZCBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIGJmZF90YXJnZXQgYW5kCisJdGFyZ2V0X21ha2VmaWxlX2ZyYWcuCisKKwkqIGJ1aWxkLWFsbC5tazogU2V0IGFzc29ydGVkIHRhcmdldHMgZm9yIFEyLgorCSogY29uZmlnLnN1YjogUmVjb2duaXplIHo4ay1zaW0gYW5kIGg4MzAwLWhtcy4KKwkqIHRlc3QtYnVpbGQubWs6IFJlYWxseSBkb24ndCBwYXNzIGhvc3QgdG8gY29uZmlndXJlLgorCShIT0xFUyk6IEFkZGVkIHVuYW1lLgorCitXZWQgQXByICA3IDE1OjQ4OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBIYW5kbGUgYW4gZW1wdHkgcHJvZ3JhbS1wcmVmaXgsIHByb2dyYW0tc3VmZml4IG9yCisJcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBjb3JyZWN0bHkuCisKK1R1ZSBBcHIgIDYgMTM6NDg6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBidWlsZC1hbGwubWs6IC1HIDggbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBNSVBTIHRhcmdldHMuCisJKiB0ZXN0LWJ1aWxkLm1rOiBEb24ndCBwYXNzIGhvc3QgYXJndW1lbnQgdG8gY29uZmlndXJlOyBtYWtlIGl0CisJZ3Vlc3MuCisKK1R1ZSBBcHIgIDYgMTA6MzY6NTMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgRml4IGZvciBidWlsZGluZyBnemlwJ2QgZGlzdHJpYnV0aW9uLgorCSogTWFrZWZpbGUuaW4gKENPTVBSRVNTKTogIE5ldyBtYWNybywgbGlrZSBHWklQLgorCitGcmkgQXByICAyIDA5OjAyOjMxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogdGVzdC1idWlsZC5tazogVXNlIC13aXRoLWdudS1hcyBmb3IgbWlwcy1zZ2ktaXJpeDQgYXMgd2VsbC4KKworCSogYnVpbGQtYWxsLm1rOiBTZXQgR0NDIHRvIGdjYyAtTyAtRyA4IGZvciBNSVBTIHRhcmdldHMsIHNpbmNlIGdjYworCXdpdGggZ2FzIGN1cnJlbnRseSBkZWZhdWx0cyB0byAtRyAwLgorCitUaHUgQXByICAxIDA4OjI1OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbC1mbGV4KTogZmxleCBkZXBlbmRzIG9uIGJ5YWNjLgorCisJKiBidWlsZC1hbGwubWs6IElmIGhvc3Qgbm90IHNwZWNpZmllZCwgdXNlIGNvbmZpZy5ndWVzcy4gIFBhc3MgVEFHCisJdG8gdGVzdC1idWlsZC5tayBhcyBSRUxFQVNFX1RBRy4KKwkqIHRlc3QtYnVpbGQubWsgKGNvbmZpZ2FyZ3MpOiBOZXcgdmFyaWFibGUgY29udGFpbmluZyBhcmd1bWVudHMgdG8KKwlwYXNzIHRvIGNvbmZpZ3VyZS4gIFNldCB0byAtd2l0aC1nbnUtYXMgb24gbWlwcy1kZWMtdWx0cml4LgorCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIFJFTEVBU0VfVEFHLgorCisJKiBjb25maWcuZ3Vlc3M6IFVzZSAvYmluL3VuYW1lIHdoZW4gY2hlY2tpbmcgLVggYXJndW1lbnQgb24gU0NPLAorCXRvIGF2b2lkIGludm9raW5nIEdOVSB1bmFtZSB3aGljaCBkb2Vzbid0IHVuZGVyc3RhbmQgLVguCisKKwkqIHRlc3QtYnVpbGQubWs6IERvbid0IHVzZSAvdXNyL3Vuc3VwcG9ydGVkL2Jpbi9hcyBvbiBBSVguCisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ2FzIGZvciBtaXBzLSotKi4KKworV2VkIE1hciAzMSAyMToyMDo1OCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhbGwubm9ybWFsKTogaW5zZXJ0IG1pc3NpbmcgYmFja3NsYXNoLgorCitXZWQgTWFyIDMxIDEyOjMxOjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYnVpbGQtYWxsLm1rLCBjb25maWcvbWgtaXJpeDQ6IEJ1bXAgLVhOaCB2YWx1ZSB0byAxNTAwIHRvIG1hdGNoCisJZ2NjIHJlcXVpcmVtZW50cy4KKworCSogTWFrZWZpbGUuaW46IENvbXBsZXRlIG92ZXJoYXVsIHRvIG1lcmdlIG1hbnkgYWxtb3N0IGlkZW50aWNhbAorCXRhcmdldHMuCisKK1R1ZSBNYXIgMzAgMjA6MTc6MDEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycy1nZGIpOiBSZW5hbWVkIGZyb20gc2V0dXAtZGlycy4KKwkoZ2RiLnRhci5aKTogQWRqdXN0ZWQuCisKKwkqIE1ha2VmaWxlLmluIChzZXR1cC1kaXJzLCB0YXopOiBOZXcgdGFyZ2V0czsgc2hvdWxkIGJlIGdlbmVyYWwKKwllbm91Z2ggdG8gYWRhcHQgZm9yIGdkYiBzb21ldGltZS4gIEJ1aWxkIG9ubHkgLnogZmlsZS4KKwkoZ2FzLnRhci56KTogTmV3IHRhcmdldC4KKworVHVlIE1hciAzMCAxMDowMzowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGJ1aWxkLWFsbC5tazogVXNlIENDPWNjIC1YcyBvbiBTb2xhcmlzLgorCitNb24gTWFyIDI5IDE5OjU5OjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXN1bjM6IGNjIG5lZWRzIC1KIHRvIGNvbXBpbGUgY3AtcGFyc2UuYyBjb3JyZWN0bHkKKworCSogY29uZmlnL21oLXNvbGFyaXM6IFN1blBSTyBDIG5lZWRzIC1YcyB0byBiZSBhYmxlIHRvIGdldCBhCisJd29ya2luZyB4bWFrZWZpbGUgZm9yIEVtYWNzLgorCitUaHUgTWFyIDI1IDE1OjE0OjMwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEluY29ycG9yYXRlIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IHdpbHNvbkBjeWdudXMuY29tCisJZm9yIGhhbmRsaW5nIEJJU09OIGZvciBGU0YgcmVsZWFzZXMuCisKK1RodSBNYXIgMjUgMDY6MTk6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogQWN0dWFsbHkgaW1wbGVtZW50IHRoZSBjaGFuZ2Ugem9vIGp1c3QgZG9jdW1lbnRlZC4KKworV2VkIE1hciAyNCAxMzowMjo0NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiB3aGVuIHVzaW5nIGNvbmZpZy5ndWVzcywgb25seSBzZXQgdGFyZ2V0X2FsaWFzIHdoZW4KKwlpdCdzIG5vdCBhbHJlYWR5IGJlZW4gc2V0IChpZSwgb24gdGhlIGNvbW1hbmQgbGluZSkKKworTW9uIE1hciAyMiAyMzowNzozOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldCwgc2V0IFBSTVMgdG8gaW5zdGFsbC1wcm1zCisKK1N1biBNYXIgMjEgMTY6NDY6MTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGFkZCBzdXBwb3J0IGZvciBwYWNrYWdlX21ha2VmaWxlX2ZyYWdtZW50LCBoYW5kbGUgdGhlCisJY2FzZSB3aGVyZSBhIGRpcmVjdG9yeSBoYXMgYSBjb25maWd1cmUuaW4gZmlsZSBidXQgbm8gTWFrZWZpbGUuaW4KKwltb3JlIGdyYWNlZnVsbHkgKHdpdGggYW4gYWN0dWFsIHVuZGVyc3RhbmRhYmxlIGVycm9yIG1lc3NhZ2UsIGV2ZW4pOworCWFkZCBzdXBwb3J0IGZvciAtLXdpdGhvdXQgKGFuZCBhZGQgdGhpcyB0byB0aGUgdXNhZ2UgbWVzc2FnZSk7IGFsc28KKwlleHBsaWNpdGx5IGFkZCBhIC0taG9zdD0ke2hvc3RfYWxpYXN9IHRvIHRoZSBjb21tYW5kIGxpbmUgd2hlbgorCWNvbmZpZy5ndWVzcyBpcyB1c2VkCisKK1N1biBNYXIgMjEgMTI6MTE6NTggMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IE11c3QgdXNlIGJvdGggLS1ob3N0IGFuZCAtLXRhcmdldCBpbiByZWN1cnNpdmUgY2FsbHMuCisKK1RodSBNYXIgMTggMTI6MzE6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGRlamEtZ251IHRvIGRlamFnbnUuCisKK01vbiBNYXIgMTUgMTU6NDQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGg4MzAwLSotKiwgaDg1MDAtKi0qKTogRG9uJ3QgYnVpbGQgbGliZysrLgorCitGcmkgTWFyIDEyIDE4OjMwOjE0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBjYW5vbmljYWxpemUgYWxsIGluc3RhbmNlcyB0byAqLSotc29sYXJpczIqLAorCWFsc28gc3RyaXAgb3V0IGEgbnVtYmVyIG9mIHRvb2xzIHRvIG5vdCBidWlsZCBmb3IgZ28zMiBob3N0CisKK1dlZCBNYXIgMTAgMTI6MDg6MjcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcuZ3Vlc3M6IGFkZCBHUEwuCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZTogYnVtcAorCSAgY29weXJpZ2h0cyB0byA5My4KKworV2VkIE1hciAxMCAwNzoxMjo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChkby1pbmZvKTogUmVtb3ZlZCBvYnNvbGV0ZSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mCisJbG9jYWxlbnYgZmlsZS4KKworCSogTWFrZWZpbGUuaW4gKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCisKK1dlZCBNYXIgMTAgMDM6MTE6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYSBjb3VwbGUgb2YgJ2Vsc2UgdHJ1ZScgZm9yIGRlY3N0YXRpb24sCisJc3VwcG9ydCBmb3IgVGNsWAorCisJKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSB0Y2xYIHRvbzsgZG9uJ3QgcmVtb3ZlIFRrIG9uIFJTLzYwMDAgYW55bW9yZQorCitUdWUgTWFyICA5IDE2OjA2OjEyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycyk6IGNoYW5nZSBpbnZvY2F0aW9uIG9mIG1ha2UgdG8gJChNQUtFKS4KKworTW9uIE1hciAgOCAxNDo1MjoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlKQorCisJKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpMzg2LWlibS1haXggKFBTLzIpLgorCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLWFpeDM4NiBmaWxlIGZvciBpdC4KKworTW9uIE1hciAgOCAxMToxMjo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChHQ0NfRk9SX1RBUkdFVCk6IEVsaW1pbmF0ZWQgZGVmaW5pdGlvbjsgdXNlCisJQ0NfRk9SX1RBUkdFVCBpbnN0ZWFkLgorCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzIEdDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkuCisKK1dlZCBNYXIgIDMgMTY6MDA6MjggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAb2suY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCBzaW0gdG8gbGlzdCBvZiBkaXJlY3RvcmllcyBzZW50IHdpdGggZ2RiCisKK1dlZCBNYXIgIDMgMTE6NDI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUHV0IGJhY2sgbWlwcy1kZWMtYnNkKiBjYXNlLgorCitUdWUgTWFyICAyIDIxOjE1OjU4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKFVsdHJpeCAyLjIgc3VwcG9ydCBmcm9tIE1pY2hhZWwgUmVuZGVsbCA8bWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYT4pCisJKiBjb25maWd1cmUuaW4gKHZheC0qLXVsdHJpeDIqKTogIEFkZCBVbHRyaXggMi4yIHRyaXBsZXQuCisJKiBjb25maWcuZ3Vlc3M6ICBDaGFuZ2UgJ1ZBWCo6VUxUUklYOio6KicgdG8gJ1ZBWCo6VUxUUklYKjoqOionLgorCSogY29uZmlnL21oLXZheHVsdDI6ICBOZXcgZmlsZS4KKworVHVlIE1hciAgMiAxODoxMTowMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIG5vLW9wIG1pcHMtZGVjLWJzZCogaW4gImNhc2UgJHRhcmdldCIKKworCSogTWFrZWZpbGUuaW4gKGRpci5pbmZvKTogb25seSBydW4gZ2VuLWluZm8tZGlyIGlmIGl0IGV4aXN0cywKKwkoaW5zdGFsbC1pbmZvKTogaW5zdGFsbCBkaXIuaW5mbyBvbmx5IGlmIGl0IGV4aXN0cywKKwkoYWxsLWV4cGVjdCwgaW5zdGFsbC1leHBlY3QpOiBwYXNzIGFsb25nIFgxMV9GTEFHU19UT19QQVNTCisKK1R1ZSBNYXIgIDIgMDk6MDE6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogRm9yIHZtcyB0YXJnZXQsIHNraXAgYmZkLCBsZCwgYmludXRpbHMuICBEbyBidWlsZAorCWdhcyBmb3IgbWlwcy1kZWMtYnNkLgorCitUdWUgTWFyICAyIDA4OjM1OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIChtYWtlc3JjZGlyKTogSWYgJHtzcmNkaXJ9IGlzIHJlbGF0aXZlIGFuZCBub3QgIi4iLAorCWFuZCAke3N1YmRpcn0gaXMgbm90ICIuIiwgc2V0IG1ha2VzcmNkaXIgYmFzZWQgb24gJHtpbnZzdWJkaXJ9LgorCitUdWUgRmViIDIzIDE0OjE4OjI4IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgImRlamFnbnUiIHRvIGhvc3R0b29scyBsaXN0LgorCitNb24gRmViIDIyIDIzOjI4OjM4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluLCBjb25maWcuZ3Vlc3M6ICBBZGQgc3VwcG9ydAorCWZvciBCb3N4LCBhbiBBSVggdmFyaWFudCBmcm9tIEJ1bGwuCisJUGF0Y2hlcyBmcm9tIEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mci4KKworU3VuIEZlYiAyMSAxMToxNToyMiAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBkZXZvL2RlamFnbnU6IEluaXRpYWwgY3JlYXRpb24gb2YgZGV2by9kZWphZ251LgorCU1pZ3JhdGVkIGRlamFnbnUgdGVzdGNhc2VzIGFuZCBzdXBwb3J0IGZpbGVzIGZvciB0ZXN0aW5nIHNvZnR3YXJlCisJdG9vbHMgdG8gcmVzaWRlIGFzIHN1YmRpcmVjdG9yaWVzLCBjdXJyZW50bHkgY2FsbGVkICJ0ZXN0c3VpdGUiLAorCXdpdGhpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBzb2Z0d2FyZSB0b29sLiAgTWlncmF0ZWQgYWxsIHByb2dyYW1zLAorCXN1cHBvcnQgbGlicmFyaWVzLCBldGMuIGJlbG9naW5nIHRvIGRlamFnbnUgcHJvcGVyIGZyb20KKwlkZXZvL2RlamEtZ251IHRvIGRldm8vZGVqYWdudS4JVGhlc2UgZmlsZXMgd2VyZSBtb3ZlZCAiYXMgaXMiCisJd2l0aCBubyBtb2RpZmljYXRpb25zLglUaGUgY2hhbmdlcyB0byB0aGVzZSBmaWxlcyB3aGljaCB3aWxsCisJYWxsb3cgdGhlbSB0byBjb25maWd1cmUsIGJ1aWxkLCBhbmQgZXhlY3V0ZSBwcm9wZXJseSB3aWxsIGJlIG1hZGUKKwlpbiBhIGZ1dHVyZSB1cGRhdGUuCisKK0ZyaSBGZWIgMTkgMjA6MTk6MzkgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIHNlbmRfcHIgdG8gc2VuZC1wci4KKwkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCisJKiBzZW5kX3ByOiBSZW5hbWVkIGRpcmVjdG9yeSB0byBzZW5kLXByLgorCitGcmkgRmViIDE5IDE5OjAwOjEzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBzb21lIGV4dHJhIHNlbWktY29sb25zIChuZWVkZWQgaWYgU0hFTEw9YmFzaCkuCisKK0ZyaSBGZWIgMTkgMDA6NTk6MzMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIFVwZGF0ZSBmb3IgZ2RiLTQuOCByZWxlYXNlLgorCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBBZGQgdGV4aW5mby90ZXgzcGF0Y2guICBCdWlsZAorCWdkYi14eHgudGFyLnogKGd6aXAnZCkgZmlsZSBhbHNvLgorCitUaHUgRmViIDE4IDA5OjE2OjE3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG1ha2UgYWxsLWRpZmYgZGVwZW5kIG9uIGFsbC1saWJpYmVydHkKKworVHVlIEZlYiAxNiAxNjowNjozMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmd1ZXNzOiBhZGQgdmF4LXVsdHJpeCBpbiB0aGUgc3Bpcml0IG9mIG1pcHMtdWx0cml4LgorCitUdWUgRmViIDE2IDA1OjU3OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogYWRkIGhlbGxvLCB0YXIsIGd6aXAsIHJlY29kZSwgaW5kZW50CisKK1R1ZSBGZWIgMTYgMDA6NTg6MjAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiAgUmVtb3ZlIGV0YyBkaXJlY3RvcnkKKwkoRVRDX1NVUFBPUlQpOiAgT25seSBhZGQgdGhlIGZpbGVzIEdEQiB3YW50cyBmcm9tIGV0Yy8uCisJKGdkYi50YXIuWik6ICBVc2UgRVRDX1NVUFBPUlQuICBVc2UgYnlhY2Mgd2hlbiBidWlsZGluZyB0aGUgZmlsZS4KKworVGh1IEZlYiAxMSAyMDoxNDoyOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgbWFrZWluZm8gYmluYXJ5IGlzIGluIGEgbmV3IGxvY2F0aW9uCisKK1R1ZSBGZWIgIDkgMTI6NDI6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBBY2NlcHQgLWVjb2ZmIGFzIGFuIE9TLgorCisJKiBNYWtlZmlsZS5pbjogVmFyaW91cyBjaGFuZ2VzIHRvIGVsaW1pbmF0ZSBhIGxldmVsIG9mIG1ha2UKKwlyZWN1cnNpb24gYW5kIHJlZHVjZSB0aGUgcmVxdWlyZWQgY29tbWFuZCBsaW5lIGxlbmd0aC4KKwkoQkFTRV9GTEFHU19UT19QQVNTKTogTmV3IHZhcmlhYmxlIGhvbGRpbmcgZmxhZ3MgcGFzc2VkIHRvIGFsbAorCXN1Yi1tYWtlcy4KKwkoRVhUUkFfSE9TVF9GTEFHUywgRVhUUkFfVEFSR0VUX0ZMQUdTLCBFWFRSQV9HQ0NfRkxBR1MpOiBOZXcKKwl2YXJpYWJsZXMgaG9sZGluZyBzZXR0aW5ncyBmb3Igc3BlY2lmaWMgc3ViLW1ha2VzLgorCShGTEFHU19UT19QQVNTLCBUQVJHRVRfRkxBR1NfVE9fUEFTUywgR0NDX0ZMQUdTX1RPX1BBU1MpOiBSZXdyb3RlCisJaW4gdGVybXMgb2YgQkFTRV9GTEFHU19UT19QQVNTLgorCShUQVJHRVRfTElCUyk6IE5ldyB2YXJpYWJsZSBsaXN0aW5nIGRpcmVjdG9yaWVzIHdoaWNoIHVzZQorCVRBUkdFVF9GTEFHU19UT19QQVNTLgorCShzdWJkaXJfZG8pOiBFbGltaW5hdGVkLgorCShkby0qKTogTmV3IHNldCBvZiB0YXJnZXRzIHRvIHJlcGxhY2Ugc3ViZGlyX2RvLgorCSh2YXJpb3VzKTogQWxsIHRhcmdldHMgd2hpY2ggdXNlZCBzdWJkaXJfZG8gbm93IGRlcGVuZCBvbiBkby0qLgorCShsb2NhbC1jbGVhbik6IFJlbmFtZWQgZnJvbSBkb19jbGVhbi4KKwkobG9jYWwtZGlzdGNsZWFuKTogTmV3IHRhcmdldCwgZGVwZW5kZW5jeSBvZiBkaXN0Y2xlYW4gYW5kCisJcmVhbGNsZWFuLgorCShpbnN0YWxsLWluZm8pOiBEb24ndCBjcmVhdGUgZGlyZWN0b3JpZXMuICBEZXBlbmQgb24gZGlyLmluZm8KKwlyYXRoZXIgdGhhbiBjYWxsaW5nIG1ha2UgcmVjdXJzaXZlbHkuCisJKGluc3RhbGwtZGlyLmluZm8pOiBFbGltaW5hdGVkLgorCShpbnN0YWxsLWluZm8tZGlycyk6IENyZWF0ZSBhbGwgaW5mbyBkaXJlY3RvcmllcyBoZXJlLgorCShkaXIuaW5mbyk6IERlcGVuZCB1cG9uIGRvLWluc3RhbGwtaW5mby4KKworCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGRlZCBmYWxzZS4KKworU2F0IEZlYiAgNiAxNDowNTowOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBCU0RJIGFuZCBCU0RKIChKb2xpdHogMzg2YnNkKS4KKworVGh1IEZlYiAgNCAyMDo0OToxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbmZvKTogcmVtb3ZlIGRlcGVuZGVuY3kgb24gYWxsLXRleGluZm8uICBUaGUKKwlwcm9ibGVtIHdhcyByZWFsbHkgaW4gdGV4aW5mby9DLCBub3QgYXQgdGhpcyBsZXZlbC4KKworVGh1IEZlYiAgNCAxMzozODo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbmZvKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBhbGwtdGV4aW5mbyAoUFIgMjExMikuCisKK1RodSBGZWIgIDQgMDE6NTA6NTMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBDaGFuZ2UgQklTT04gdG8gJ2Jpc29uIC15JyBmb3IKKwlHREIgcmVsZWFzZXMuCisKK1dlZCBGZWIgIDMgMTc6MjI6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IEluY2x1ZGUgc3JjZGlyIGluIG1lc3NhZ2UgYWJvdXQgdGFyZ2V0IG9mIGxpbmsgbm90CisJYmVpbmcgZm91bmQuICBEb24ndCBjb252ZXJ0IGAtJyB0byBgXycgaW4gYHdpdGgnIG9wdGlvbnMgYmVpbmcKKwlwYXNzZWQgdG8gc3ViZGlycy4KKworVHVlIEZlYiAgMiAxODo1Nzo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIHV1ZGVjb2RlIHRvIGhvc3RfdG9vbHMKKworCSogTWFrZWZpbGUuaW46IGFkZGVkIHthbGwsaW5zdGFsbH0tdXVkZWNvZGUgdGFyZ2V0cywgYWRkZWQgdGhlbSB0bworCXRoZSBhcHByb3ByaWF0ZSBsaXN0cworCitUdWUgRmViICAyIDExOjQ1OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGFsbC1nYXMuCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLSopOiBCdWlsZCBsZCBhbmQgYmludXRpbHMuCisKK01vbiBGZWIgIDEgMTI6MzU6NDEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGNoZWNrIHJldHVybiBjb2RlIGZyb20gbWtkaXIsIHByaW50IGVycm9yIG1lc3NhZ2UgYW5kCisJICBleGl0IG9uIGZhaWx1cmUuCisKK1NhdCBKYW4gMzAgMTY6NDA6MjggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuWik6ICBOZXcgbG9jYXRpb24gZm9yIHRleGluZm8udGV4LgorCitUaHUgSmFuIDI4IDE1OjA5OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGRlZCB0YXIsIGNwaW8gYW5kIHV1ZGVjb2RlLgorCitXZWQgSmFuIDI3IDE2OjUwOjMyIDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YiAoaDg1MDApOiAgUmVjb2duaXplIHRoaXMgYXMgYSBjcHUgdHlwZS4KKworU2F0IEphbiAyMyAyMDozMjowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogc291cmNlIGRpcmVjdG9yeSBtaXNzaW5nIGlzIG5vIGxvbmdlciBhIHdhcm5pbmcKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaXJpeFszNF0qIGluc3RlYWQgb2YgaXJpeFszNF0KKworCSogTWFrZWZpbGUuaW46IGRlZmluZSBhbmQgcGFzcyBkb3duIFgxMV9MSUIKKworCSogY29uZmlnL21oLXNjbzogZGVmaW5lIFgxMV9MSUIgdG8gdGhlIG1lc3MgdGhhdCBTQ08gT0RUIHJlcXVpcmVzCisKK1NhdCBKYW4gMjMgMTM6NDk6NDAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGd1ZXNzLXN5c3R5cGU6IFJlbmFtZWQgdG8gLi4uCisJKiBjb25maWcuZ3Vlc3M6ICAuLi4gYnkgcG9wdWxhciByZXF1ZXN0LgorCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseS4KKworVGh1IEphbiAyMSAxMjoyMDo1NSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogZ3Vlc3Mtc3lzdHlwZTogIFBhdGNoZXMgZnJvbSBKb2huIEVhdG9uIDxqd2VAY2hlLnV0ZXhhcy5lZHU+OgorCSsgQWRkIENvbnZleCwgQ3JheS9Vbmljb3MsIGFuZCBFbmNvcmUvTXVsdGltYXggc3VwcG9ydC4KKwkrIEV4ZWN1dGUgLi9kdW1teSBpbnN0ZWFkIG9mIGFzc3VtaW5nIC4gaXMgaW4gUEFUSC4KKworVHVlIEphbiAxOSAxNzoxODowNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogZ3Vlc3Mtc3lzdHlwZTogIE5ldyBzaGVsbCBzY3JpcHQuICBBdHRlbXB0cyB0byBndWVzcyB0aGUKKwljYW5vbmljYWwgaG9zdCBuYW1lIG9mIHRoZSBleGVjdXRpbmcgaG9zdC4KKwlPbmx5IGEgZmV3IGhvc3RzIGFyZSBzdXBwb3J0ZWQgc28gZmFyLgorCSogY29uZmlndXJlOiAgQ2FsbCBndWVzcy1zeXN0eXBlIGlmIG5vIGhvc3QgaXMgc3BlY2lmaWVkLgorCitUdWUgSmFuIDE5IDA4OjI2OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogTWFkZSB0byB3b3JrIHdpdGggY3VycmVudAorCWdjYyBNYWtlZmlsZS4KKworCitGcmkgSmFuIDE1IDEwOjI3OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEdDQ19GTEFHU19UT19QQVNTKTogTmV3IHZhcmlhYmxlLgorCShhbGwtZ2NjLCBpbnN0YWxsLWdjYywgc3ViZGlyX2RvKTogVXNlIGl0LgorCitXZWQgSmFuIDEzIDE3OjA2OjQ1IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFJlbmFtZSB1bmluc3RhbGxlZCBnY2MgZHJpdmVyIGZyb20gZ2NjIHRvIHhnY2MuCisKK1dlZCBKYW4gIDYgMjA6Mjk6MTYgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmVkIGV4cGxpY2l0IHNldHRpbmcgb2YgU1VCRElSUy4gU1VCRElSUyBpcyBub3cKKwkgIHNldCBleGNsdXNpdmVseSBieSBjb25maWd1cmUsIHVzaW5nIGNvbmZpZ3VyZS5pbiAuCisKK1dlZCBKYW4gIDYgMTM6NDQ6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiB0ZXN0LWJ1aWxkLm1rOiBzZXQgJFBBVEggZm9yIGFsbCBidWlsZHMKKworCSogTWFrZWZpbGUuaW46IHBhc3MgVEFSR0VUX0ZMQUdTX1RPX1BBU1MgZm9yIHhpYmVydHkgYW5kIGxpYm0KKworV2VkIEphbiAgNiAxMTowMjoxMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEdDQ19GT1JfVEFSR0VUKTogIFN1cHBseSBhIGRlZmF1bHQgdGhhdCBtYXRjaGVzCisJdGhlIG9uZSB1c2VkIGluIGdjYy9NYWtlZmlsZS5pbiwgc28gdGhhdCBhIG51bGwgZXhwYW5zaW9uIGRvZXNuJ3QKKwlvdmVycmlkZSB0aGUgb25lIG5lZWRlZCB0byBidWlsZCBnY2Mgd2l0aCBhIG5hdGl2ZSBjYy4KKworCitUdWUgSmFuICA1IDA3OjU1OjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBBY2NlcHQgLXdpdGggYXJndW1lbnRzLgorCitTdW4gSmFuICAzIDE1OjE1OjA5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgaDgzMDBzaW0KKworVHVlIERlYyAyOSAxNTowNjowMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1zY286IERvbid0IG92ZXJyaWRlIEJJU09OIGRlZmluaXRpb24uCisKKwkqIGJ1aWxkLWFsbC5tazogSWYgY2Fub25ob3N0IGlzIGkzODYtdW5rbm93bi1zY28zLjJ2NCwgY2hhbmdlIGl0CisJdG8gaTM4Ni1zY28zLjJ2NC4gIFNldCBUQVJHRVRTIGFuZCBDRkxBR1MgZm9yIGkzODYtc2NvMy4ydjQuCisJKGFsbC1jeWdudXMsIG5hdGl2ZSwgYnVpbGQtY3lnbnVzKTogTWFrZQorCSQoY2Fub25ob3N0KS1zdGFtcC0zc3RhZ2UtZG9uZSwgbm90ICQoaG9zdCkuLi4uCisJKiB0ZXN0LWJ1aWxkLm1rIChzdGFtcC0zc3RhZ2UtY29tcGFyZWQpOiBVc2UgdGFpbCArMTBjIGZvcgorCWkzODYtc2NvMy4ydjQuICBBZGRlZCBlbHNlIHRydWUgdG8gaWYgY29tbWFuZC4KKworTW9uIERlYyAyOCAxMjowODo1NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogKGZyb20gRlNGKSBTZXF1ZW50IHVzZXMgYSBCU0QtbGlrZSBPUy4KKworTW9uIERlYyAyOCAwODozMjowNiAxOTkyICBNaW5oIFRyYW4tTGUgIChtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbSkKKworCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotaXNjKik6IGFkZGVkOyB1c2VzIG1oLXN5c3YuCisKK1RodSBEZWMgMjQgMTc6MjY6MjQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGRvbid0IHJlbW92ZSBiaW51dGlscyBmcm9tIFNvbGFyaXMgYnVpbGRzCisKK1RodSBEZWMgMjQgMTQ6MDg6MzggMTk5MiBkYXZpZCBkYHpvbycgenVobiAgKHpvb0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZ2V0IHJpZCBvZiBlYXJsaWVyIGRlZmluaXRpb25zIGZvciAqY2xlYW4sCisJYWxzbyBoYW5kbGUgdGhlIHJlY3Vyc2l2ZSBpbmZvIHJ1bGUgYmV0dGVyCisKK1RodSBEZWMgMjQgMTI6NDA6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogIEZpeCB0bworCWRvIG1vcmUtb3ItbGVzcyB0aGUgcmlnaHQgdGhpbmcuCisKK1dlZCBEZWMgMTYgMTA6MjU6MzEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIGxpbmVzIGRlZmluaW5nIENDIGFuZCBDWFgsIGFuZCB1c2UgQ1hYIHJhdGhlcgorCXRoYW4gZ2NjIGluIGRlZmluaXRpb25zIG9mIENYWF9GT1JfQlVJTEQgYW5kIENYWF9GT1JfVEFSR0VULgorCitUdWUgRGVjIDE1IDAwOjM0OjMyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGNoYW5nZSBhbGwgJChob3N0X2NwdSktJChob3N0X3ZlbmRvciktJChob3N0X29zKSB0bworCSQoaG9zdF9jYW5vbmljYWwpLgorCisJKiBjb25maWd1cmUuaW46IHNwbGl0IHRoZSBjb25maWdkaXJzIGxpc3QgaW50byA0IGNhdGVnb3JpZXMgKG5hdGl2ZQorCXYuIGNyb3NzLCBsaWJyYXJ5IHYuIHRvb2wpIGFuZCBoYW5kbGUgdGhlIGNyb3NzLW9ubHkgYW5kIG5hdGl2ZS0KKwlvbmx5IGluIG1vcmUgcmVhc29uYWJsZSAoYW5kIGNvcnJlY3QhKSB3YXkuCisKK01vbiBEZWMgMTQgMTc6MDQ6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLSopOiAgRG9uJ3QgcmVtb3ZlIGJmZCBhbmQgZ2RiIGZyb20KKwljb25maWdkaXJzIGFueW1vcmUuCisKK1N1biBEZWMgMTMgMDA6Mzc6MjYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZXh0ZW5zaXZlIGNsZWFudXA6OiAgcmVtb3ZlZCBhbGwgb2YgdGhlIGV4cGxpY2l0CisJY2xlYW4tKiB0YXJnZXRzLCBjb2xsYXBzZWQgbWFueSB3cmFwcGVycyBhcm91bmQgc3ViZGlyX2RvIGludG8KKwlvbmUsIGFkZGVkIGFkZGl0aW9uYWwgdGFyZ2V0cyB0byBzYXRpc2Z5IHN0YW5kYXJkcy50ZXhpLCBkZWxldGVkCisJc29tZSBvbGQgdGFyZ2V0cywgc29tZSBjaGFuZ2VzIGZvciBjb25zaXN0ZW5jeQorCitGcmkgRGVjIDExIDIwOjE4OjAyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBoYW5kbGUgc29tZSBwcm9ncmFtcyBhcyBjcm9zcy1vbmx5LCBhbmQgb3RoZXJzIGFzCisJbmF0aXZlIG9ubHkKKworCSogdGVzdC1idWlsZC5tazogaGFuZGxlIHBhcnRpYWwgaG9sZXMgaW4gYSBtb3JlIGdlbmVyaWMgbWFubmVyCisKKwkqIE1ha2VmaWxlLmluOiBtNCBkZXBlbmRzIG9uIGxpYmliZXJ0eQorCitNb24gRGVjICA3IDA2OjQzOjI3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXNjbzogZG9uJ3QgZGVmYXVsdCAkKENDKSB0byBnY2MKKworVGh1IERlYyAgMyAyMTo1MjoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIG00LCB0ZXh0dXRpbHMsIGZpbGV1dGlscywgc2VkLCBzaGVsbHV0aWxzLAorCXRpbWUsIHdkaWZmLCBhbmQgZmluZCB0byBjb25maWdkaXJzCisKKwkqIE1ha2VmaWxlLmluOiBhbGwsIGNsZWFuLCBhbmQgaW5zdGFsbCBydWxlcyBmb3IgdGhlIG5ldyBwcm9ncmFtcworCWFkZGVkIHRvIGNvbmZpZ3VyZS5pbgorCitNb24gTm92IDMwIDE0OjU0OjM0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiB1c2UgbWgtc3VuIGZvciBhbGwgKi1zdW4tKiBob3N0cworCisJKiBjb25maWcvbWgtc29sYXJpczogcmV3b3JrIHN0YW5kYXJkIFggbG9jYXRpb24gdG8gdXNlCisJJE9QRU5XSU5IT01FLCBpZiBkZWZpbmVkLgorCisJKiBjb25maWcvbWgtc3VuOiBoYW5kbGUgWDExIGluY2x1ZGUgbG9jYXRpb25zCisKKwkqIGNvbmZpZy9taC1kZWNzdGF0aW9uOiBkZWZpbmUgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyB0byAwLCB0bworCXdvcmsgYXJvdW5kIGRhaW4tYnJhbWFnZWQgREVDd2luZG93cyBpbmNsdWRlIGZpbGVzCisKK0ZyaSBOb3YgMjcgMTg6MzU6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZGVmaW5lIGZsYWdzIGZvciBYMTEgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyeSBmaWxlCisJbG9jYXRpb25zLCBwYXNzIHRoZW0gZG93biB0byB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHRoaXMgaW5mbworCisJKiBidWlsZC1hbGwubWs6IGFkZGVkIGEgJ25hdGl2ZScgdGFyZ2V0LCB0byAzc3RhZ2UgdGhlIG5hdGl2ZSB0b29sY2hhaW4KKworCSogY29uZmlnL3ttaC1ocHV4LG1oLXNvbGFyaXN9OiBkZWZpbmUgdGhlICJzdGFuZGFyZCIgbG9jYXRpb25zIGZvcgorCXRoZSB2ZW5kb3Igc3VwcGxpZWQgWDExIGhlYWRlcnMgYW5kIGxpYnJhcmllcworCitTdW4gTm92IDIyIDE4OjU5OjEzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBzdGFydCBidWlsZGluZyBsaWJnKysgZm9yIEhQLVVYIHRhcmdldHMKKworV2VkIE5vdiAxOCAxOTozMzoxMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiAgVXBkYXRlIHJlZmVyZW5jZXMgdG8gZmlsZXMgbW92ZWQgaW50byBldGMvLgorCitTdW4gTm92IDE1IDA5OjM2OjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViIChpMzg2c29sMiwgaTQ4NnNvbDIpOiAgaVszNF04Ni11bmtub3duLXNvbGFyaXMyLgorCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc29sYXJpczIqKTogIFVzZSBjb25maWcvbWgtc3lzdjQuCisKK1RodSBOb3YgMTIgMDg6NTA6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGFjY2VwdCBkYXNoIGFzIHdlbGwgYXMgdW5kZXJzY29yZSBpbiBsb25nIG9wdGlvbgorCW5hbWVzIGZvciBGU0YgY29tcGF0aWJpbGl0eS4KKworV2VkIE5vdiAxMSAwODowNDozNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IGFkZGVkIC1zY28zLjJ2NCBzdXBwb3J0IGZyb20gRlNGLgorCitTdW4gTm92ICA4IDIxOjE0OjMwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBleHBhbmQgdGhlIHNlY3Rpb24gdGhhdCBhZGRzIG9yIHJlbW92ZXMKKwlkaXJlY3RvcmllcyBmcm9tIHRoZSBsaXN0IG9mIHByb2dyYW1zIHRvIGJ1aWxkLCB0byBoYW5kbGUgbmF0aXZlCisJdnMuIGNyb3NzIGluIGFkZGl0aW9uIHRvIGhvc3Qgdi4gbmF0aXZlCisKK1NhdCBOb3YgIDcgMTg6NTI6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlcGxhY2UgQysrIGluIG1hY3JvIG5hbWVzIHdpdGggQ1hYLgorCVRoaXMgaXMgbGVzcyBsaWtlbHkgdG8gYnJlYWsgLi4uCisKK1NhdCBOb3YgIDcgMTU6MTY6NTggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiB0ZXN0LWJ1aWxkLm1rOiBhZGQgLXcgdG8gR05VX01BS0UKKworRnJpIE5vdiAgNiAyMzoxMDozNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IHJlbW92ZSAnc3BhcmMnLS0+J3NwYXJjLXN1bicgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbiwKKwlhZGQgJ3NwYXJjJyB0byBsaXN0IG9mIHJlY29nbml6ZWQgY3B1cy4gIFRoaXMgbmVlZGVkIHRvIG1ha2UKKwknc3BhcmMtYW91dCcgZXhwYW5kIHRvICdzcGFyYy11bmtub3duLWFvdXQnIGluc3RlYWQgb2YgJ3NwYXJjLXN1bi1hb3V0Jy4KKwlEZWxldGUgc29tZSByZWR1bmRhbnQgb3NlNjggdmFyaWFudHMuICBSZWNvZ25pemUgLXdycyBhcyBhbiBvcywKKwl0aGVuIGNoYW5nZXMgdGhhdCBpbnRvICRDUFUtd3JzLXZ4d29ya3MuCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIG1vc3QgcmVmZXJlbmNlcyB0byBnZGJ0ZXN0LCByZWd1bGFyaXplCisJdGFyZ2V0IGJhc2VkIHByb2dyYW0gcmVtb3ZhbAorCisJKiB0ZXN0LWJ1aWxkLm1rOiBpbXBvcnQgZnJvbSBwMyB0cmVlIChtYW55IGZpeGVzIGFuZCBjaGFuZ2VzKQorCitGcmkgTm92ICA2IDIwOjU5OjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgcnVsZXMgdG8gaGFuZGxlIHRjbCwgdGssIGFuZCBleHBlY3QKKworCSogY29uZmlndXJlLmluOiBoYW5kbGUgdGhvc2UgZGlyZWN0b3JpZXMgaWYgdGhleSBleGlzdAorCitUaHUgTm92ICA1IDE0OjM1OjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogcmVtb3ZlZCBib2d1cyBocHBhYnNkIGFuZCBocHBhaHB1eCBuYW1lcywgc2luY2UKKwkiaHBwYSIgaXMgbm90IGEgdmFsaWQgY3B1IChocHBhMS4xIG9yIGhwcGExLjAgYXJlLCB0aG91Z2gpCisKK1RodSBPY3QgMjkgMDA6MTI6NDEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWxsLWdjYyBub3cgZGVwZW5kcyBvbiBhbGwtYmludXRpbHMuICBhbGwtbGliZysrCisJZGVwZW5kcyB1cG9uIGFsbC14aWJlcnR5CisKKwkqIE1ha2VmaWxlLmluOiBjaGFuZ2VzIGZyb20gcDMsIGluY2x1ZGluZzoKKworCVRodSBPY3QgIDggMTU6MDA6MTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogaW5jbHVkZSBuZXdsaWIgZGlyZWN0b3JpZXMgaWYKKwluZXdsaWIvTWFrZWZpbGUgZXhpc3RzLCByYXRoZXIgdGhhbiBpZiBob3N0ICE9IHRhcmdldC4KKworCUZyaSBTZXAgMjUgMTM6NDE6NTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgLW5vc3RkaW5jIHRvIFhUUkFGTEFHUyBpZiB3ZSBhcmUgdXNpbmcgZ2NjCisJZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZSBhbmQgbm90IGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXIuICBUaGlzCisJbWF0dGVycyBmb3IgdGhlIGxpYmcrKyBjb25maWd1cmF0aW9uIGlmIHJlY29uZmlndXJpbmcgYSB0cmVlIHRoYXQKKwloYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZC4KKworCVRodSBTZXAgMTAgMTA6MzU6NTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgLUkgZm9yIG5ld2xpYi90YXJnLWluY2x1ZGUgdG8gWFRSQUZMQUdTLCB0bworCXBpY2sgdXAgdGhlIG1hY2hpbmUgYW5kIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBBU19GT1JfVEFSR0VULCBwYXNzZWQgZG93biBpbgorCVRBUkdFVF9GTEFHU19UT19QQVNTLiAgQWRkZWQgQ0NfRk9SX0JVSUxELCB3aGljaCBpcyBpbnRlbmRlZCB0byBiZQorCXRoZSBDIGNvbXBpbGVyIHRvIHVzZSB0byBjcmVhdGUgcHJvZ3JhbXMgd2hpY2ggYXJlIHJ1biBpbiB0aGUKKwlidWlsZCBlbnZpcm9ubWVudCwgc2V0IGl0IHRvIGRlZmF1bHQgdG8gJChDQyksIGFuZCBwYXNzZWQgaXQgZG93bgorCWluIEZMQUdTX1RPX1BBU1MgYW5kIFRBUkdFVF9GTEFHU19UT19QQVNTLgorCisJTW9uIFNlcCAgNyAyMjozNDo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkICQoaG9zdCkgPSAkKHRhcmdldCkgdGVzdHMgYmFjayB0byAqX0ZPUl9UQVJHRVQuCisJV2UgbmVlZCB0aGVtIGZvciB1bnVzdWFsIG5hdGl2ZSBidWlsZHMsIGxpa2Ugc3lzdGVtcyB3aXRob3V0CisJcmFubGliLgorCisJKiBjb25maWd1cmU6IGFsc28gZGVmaW5lICQoaG9zdF9jYW5vbmljYWwpIGFuZAorICAgICAgICAkKHRhcmdldF9jYW5vbmljYWwpLCB3aGljaCBhcmUgdGhlIGZ1bGwsIGNhbm9uaWNhbCBuYW1lcyBmb3IgdGhlCisgICAgICAgIGdpdmVuIGhvc3QgYW5kIHRhcmdldAorCitTdW4gTm92ICAxIDE2OjM4OjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZGVkIHNlcGFyYXRlIGRlZmluaXRpb25zIGZvciBDKysuCisKK0ZyaSBPY3QgMzAgMTE6Mzc6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6ICBBZGQgZGVqYS1nbnUuCisKK0ZyaSBPY3QgMjMgMDA6Mzk6MTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIFVwZGF0ZSBmb3IgY29uZmlndXJlLnRleGkgYW5kIGdkYi00LjcgcmVsZWFzZS4KKworV2VkIE9jdCAyMSAyMTo1NDoyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBNb3ZlICJhbGwiIHRhcmdldCB0byB0b3Agb2YgZmlsZS4KKwlQcmV2aW91c2x5LCBmaXJzdCB0YXJnZXQgd2FzICIuUEhPTlkiIHdoaWNoIGNhdXNlZCBCU0Q0LjQgbWFrZQorCXRvIGJ1aWxkIC5QSE9OWSB3aGVuIG1ha2Ugd2FzIHJ1biB3aXRob3V0IGFyZ3VtZW50cy4KKworTW9uIE9jdCAxOSAwMToxNzo1NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBBZGQgQ09QWUlORy5MSUIgdG8gR0RCIHJlbGVhc2VzLCBub3cgdGhhdCB0aGVyZSdzCisJTGlicmFyeS1jb3B5bGVmdGVkIGNvZGUgaW4gbGliaWJlcnR5LgorCitUdWUgT2N0IDEzIDAxOjIyOjMyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiAgUmVwbGFjZSBtNjhrbW90ZSB3aXRoIHBsYWluIG9sZCBtNjhrLgorCitGcmkgT2N0ICA5IDAzOjE0OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBzcGFjZSBmcm9tIGJsYW5rIGxpbmUsIGF2b2lkIE1ha2UgY29tcGxhaW50cy4KKworVGh1IE9jdCAgOCAxODo0MTo0NSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogQ29tcGxhaW4gaWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4uICBBZGRlZCBzdXBwb3J0IGZvcgorCTM4NmJzZCBhcyBPUyBhbmQgdGFyZ2V0IGFsaWFzLgorCitUaHUgT2N0ICA4IDE1OjA3OjIyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IGluY2x1ZGUgbmV3bGliIGRpcmVjdG9yaWVzIGlmCisJbmV3bGliL01ha2VmaWxlIGV4aXN0cywgcmF0aGVyIHRoYW4gaWYgaG9zdCAhPSB0YXJnZXQuCisKK01vbiBPY3QgIDUgMDM6MDA6MDkgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiByZWNvZ25pemUgc3BhcmNsaXRlLXdycy12eHdvcmtzLgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC14aWJlcnR5KTogYWRkZWQgKi14aWJlcnR5IG1ha2UgcnVsZXMgKGZyb20KKwlwMy4pIEFkZGVkIGNsZWFuLXhpYmVydHkgdG8gY2xlYW4uCisKK1RodSBPY3QgIDEgMTc6NTk6MTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHVzZSAqLSotKiBpbnN0ZWFkIG9mIG5lc3RlZCBjYXNlcyBmb3IgaG9zdCBhbmQgdGFyZ2V0CisKK1R1ZSBTZXAgMjkgMTQ6MTE6MTggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgLW5vc3RkaW5jIHRvIFhUUkFGTEFHUyBpZiB3ZSBhcmUgdXNpbmcgZ2NjCisJZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZSBhbmQgbm90IGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXIuICBUaGlzCisJbWF0dGVycyBmb3IgdGhlIGxpYmcrKyBjb25maWd1cmF0aW9uIGlmIHJlY29uZmlndXJpbmcgYSB0cmVlIHRoYXQKKwloYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZC4KKworU2VwIDIwIDA4OjUzOjEwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViIChpNDg2di9pNDg2djQpOiAgTWVyZ2UgaW4gZnJvbSBGU0YgdmVyc2lvbi4KKworRnJpIFNlcCAxOCAwMDozMjowMCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IG9ubHkgc2V0IFBXRCBpZiBpdCBpcyBhbHJlYWR5IHNldC4KKworVGh1IFNlcCAxNyAyMzowNTo1MyAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGp1c3Qgc2V0IFBXRD1gcHdkYCBhdCB0aGUgdG9wLCBzaW5jZSBVbHRyaXggc2gKKwlkb2Vzbid0IGhhdmUgdW5zZXQgYW5kIGFsbCBzdWNjZXNzIHBhdGhzIChhbmQgbW9zdCBlcnJvciBwYXRocykKKwlvdXQgc2V0IGl0IGFueXdheS4gKE5vdGU6IHNob3VsZCBjaGFuZ2UgYWxsIHVzZXMgb2YgJHtQV0Q9YHB3ZGB9CisJdG8ganVzdCAke1BXRH0gdG8gYXZvaWQgY29uZnVzaW9uLikKKworVHVlIFNlcCAxNSAxNjowMDo1NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogYWx3YXlzIHNldCAkKHRvb2xkaXIpIHRvICQobGliZGlyKS8kKHRhcmdldF9hbGlhcyksCisJZXZlbiBmb3IgYSBuYXRpdmUgY29tcGlsYXRpb24uCisKK1R1ZSBTZXAgMTUgMDI6MjI6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlDaGFuZ2VzIHRvIG1ha2UgdGhlIGdkYi50YXIuWiBydWxlIHdvcmsgYmV0dGVyLgorCisJKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRElSUyk6ICBBZGQgb3Bjb2Rlcy4KKwkoREVWT19TVVBQT1JUKTogIEFkZCBjb25maWd1cmUudGV4aS4KKwkoYmZkLWlscnQudGFyLlopOiAgUmVtb3ZlIGFuY2llbnQgcnVsZS4KKworVGh1IFNlcCAxMCAxMDo0MzoxOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCAtSSBmb3IgbmV3bGliL3RhcmctaW5jbHVkZSB0byBYVFJBRkxBR1MsIHRvCisJcGljayB1cCB0aGUgbWFjaGluZSBhbmQgc3lzdGVtIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKworCSogY29uZmlndXJlLmluLCBjb25maWcuc3ViOiBhZGRlZCBuZXcgdGFyZ2V0IG02ODAxMC1hZG9iZS1zY291dCwKKwl3aXRoIGFsaWFzIG9mIGFkb2JlNjhrLiAgQ2hhbmdlZCBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yCisJLXNjb3V0IGJlZm9yZSAtc2NvKiB0byBhdm9pZCBhIGZhbHNlIG1hdGNoLgorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgQVNfRk9SX1RBUkdFVCwgcGFzc2VkIGRvd24gaW4KKwlUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIEFkZGVkIENDX0ZPUl9CVUlMRCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUKKwl0aGUgQyBjb21waWxlciB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gaW4gdGhlCisJYnVpbGQgZW52aXJvbm1lbnQsIHNldCBpdCB0byBkZWZhdWx0IHRvICQoQ0MpLCBhbmQgcGFzc2VkIGl0IGRvd24KKwlpbiBGTEFHU19UT19QQVNTIGFuZCBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KKworV2VkIFNlcCAgOSAxMjoyMTo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBUQVJHRVRfRkxBR1NfVE9fUEFTUywgQ0NfRk9SX1RBUkdFVCwKKwlBUl9GT1JfVEFSR0VULCBSQU5MSUJfRk9SX1RBUkdFVCwgTk1fRk9SX1RBUkdFVC4gIFBhc3MKKwlUQVJHRVRfRkxBR1NfVE9fUEFTUywgd2hpY2ggZGVmaW5lcyBDQywgQVIsIFJBTkxJQiBhbmQgTk0gYXMgdGhlCisJRk9SX1RBUkdFVCB2YXJpYW50cywgdG8gbmV3bGliIGFuZCBsaWJnKysuCisKK1R1ZSBTZXAgIDggMTc6Mjg6MzAgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYWxsLWdhcywgYWxsLWdkYik6IFJlcXVpcmUgYWxsLW9wY29kZXMgdG8gYmUgYnVpbHQKKwlmaXJzdC4KKworV2VkIFNlcCAgMiAwMjo1MDowNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIEFjY2VwdCBgZWxmJyBhcyBhbiBlbnZpcm9ubWVudC4KKworVHVlIFNlcCAgMSAxNTo0ODozMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbC1vcGNvZGVzKTogIGNkIGludG8gdGhlIHJpZ2h0IGRpcmVjdG9yeQorCitTdW4gQXVnIDMwIDIxOjEyOjExIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBhZGRlZCAtcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBvcHRpb24sIHVzZWQgYXMKKwlhcmd1bWVudCB0byBzZWQgd2hlbiBpbnN0YWxsaW5nIHByb2dyYW1zLgorCWNvbmZpZ3VyZS50ZXhpOiBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciAtcHJvZ3JhbV9wcmVmaXgsCisJLXByb2dyYW1fc3VmZml4IGFuZCAtcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KKworVGh1IEF1ZyAyNyAyMTo1OTo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIEFjY2VwdCBpNDg2IHdoZXJlIGkzODYgb2suCisKK1RodSBBdWcgMjcgMTM6MDQ6NDIgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6IGFjY2VwdCB3ZTMyaworCitNb24gQXVnIDI0IDE0OjA1OjE0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworIAkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogYWNjZXB0IE9TRTY4MDAwIGFuZCBPU0U2OGsuCisKKwkqIE1ha2VmaWxlLmluOiBkb24ndCBjcmVhdGUgYWxsIGRpcmVjdG9yaWVzIGZvciBgYG1ha2UgaW5zdGFsbCcnOworCWxldCB0aGUgc3ViZGlyZWN0b3JpZXMgY3JlYXRlIHRoZSBvbmVzIHRoZXkgbmVlZC4KKworVHVlIEF1ZyAxMSAyMzoxMzoxNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBDT1BZSU5HOiBuZXcgZmlsZSwgR1BMIHYyCisKK1R1ZSBBdWcgIDQgMDE6MTI6NDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogdXNlIHRoZSBuZXcgZ2VuLWluZm8tZGlyLCB3aGljaCBuZWVkcyBhIHRlbXBsYXRlCisJYXJndW1lbnQgKHdoaWNoIGFsc28gbGl2ZXMgaW4gdGV4aW5mbykKKworCSogY29uZmlndXJlLnRleGksIHN0YW5kYXJkcy50ZXhpOiBmaXggSU5GTy1ESVItRU5UUlkKKworTW9uIEF1ZyAgMyAxNTo0MToyOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1zb2xhcmlzOiByZW1vdmVkIHRoZSAteHMgZnJvbSBDRkxBR1MgKGxldCB0aGUgcGVvcGxlCisJd2l0aCBTdW4ncyBDIGNvbXBpbGVyIGRlYWwgd2l0aCBpdCB0aGVtc2VsdmVkKQorCitNb24gQXVnICAzIDAwOjM0OjE3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViIChuY3IzMDAwKTogIENoYW5nZSBpMzg2IHRvIGk0ODYuCisKK1RodSBKdWwgMjMgMDA6MTI6MTcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGwtcmNzLCBpbnN0YWxsLWdyZXAgdG8KKwlpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMsIHJlbW92ZWQgaW5zdGFsbC1iaXNvbiBhbmQgaW5zdGFsbC1saWJnY2MKKworVHVlIEp1bCAyMSAwMTowMTo1MCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGdyYWIgdGhlIEhQVVggbWFrZWZpbGUgZnJhZ21lbnQgaWYgb24gSFBVWAorCitNb24gSnVsIDIwIDExOjAyOjA5IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGVyYWRpY2F0ZSBiaXNvbiBzcG9vciAoZGl0dG8gbGliZ2NjKS4KKwkgY29uZmlndXJlLmluOiByZWNvZ25pc2UgbTY4e2ssMDAwfS1lcmljc3Nvbi1PU0UuCisJIGVzMTgwMCBpcyBhbGlhcyBmb3IgbTY4ay1lcmljc3Nvbi1PU0UKKworU3VuIEp1bCAxOSAxNzo0OTowMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVhcnJhbmdlIHRoZSBwYXJ0cyB0aGF0IHJlbW92ZSBwcm9ncmFtcyBmcm9tCisJY29uZmlnZGlycywgYmFzZWQgbm93IG9uIEhPU1Q9PVRBUkdFVCBvciBieSBjYW5vbmljYWwgdHJpcGxlLgorCitGcmkgSnVsIDE3IDIyOjUyOjQ5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogdGVzdC1idWlsZC5tazogcmVjdXJzZSBleHBsaWNpdGx5IHdpdGggLWYgdGVzdC1idWlsZC5tayB3aGVuCisJICBhcHByb3ByaWF0ZS4gIHByZWRpY2F0ZSBzdGFnZTMgYW5kIGNvbXBhcmlzb24gb24gdGhlIGV4aXN0ZW5jZQorCSAgb2YgZ2NjLiAgVGhhdCBpcywgaWYgZ2NjIGlzbid0IGFyb3VuZCwgd2UgYXJlbid0IHRocmVlLXN0YWdpbmcuCisJICBPbiB2ZXJ5IGNsZWFuLCBhbHNvIHJlbW92ZSAuLi5zdGFtcC1jby4gIEJ1aWxkIGluLXBsYWNlIGJlZm9yZQorCSAgZG9pbmcgb3RoZXIgYnVpbGRzLgorCitUaHUgSnVsIDE2IDE4OjMzOjA5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBhZGQgdGdhcworCitUaHUgSnVsIDE2IDE2OjA1OjI4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGEgbnVtYmVyIG9mIGNoYW5nZXMgbWVyZ2VkIGluIGZyb20gcHJvZ3Jlc3NpdmUuCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGxpYm0uCisKKwkqIC5jdnNpZ25vcmU6IGlnbm9yZSBzb21lIHN0dWZmIHRoYXQgY29tZXMgZnJvbSB0ZXN0LWJ1aWxkLm1rLgorCitXZWQgSnVsICA4IDAwOjAxOjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1zb2xhcmlzOiAgVXNlIC14cyB3aGVuIGNvbXBpbGluZyBzbyB0aGF0IFN1bi1DIHB1dHMKKwlhIHN5bWJvbC10YWJsZSBpbnRvIHRoZSBleGVjdXRhYmxlLgorCitUdWUgSnVsICA3IDAwOjI0OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiAgQWRkIGVzMTgwMCAobTY4ay1lcmljc3Nvbi1lczE4MDApLgorCitUdWUgSnVuIDMwIDIwOjI0OjQxIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBBZGQgcHJvZ3JhbV9zdWZmaXggKHBhcmFsbGVsIHRvIHByb2dyYW1fcHJlZml4KQorCSogTWFrZWZpbGUuaW46IGFkanVzdCBkaXJlY3RvcnktY3JlYXRpbmcgc2NyaXB0IGZvciBsb3NpbmcgZGVjc3RhdGlvbgorCitNb24gSnVuIDIyIDIzOjQzOjQ4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6ICBNaW5vciAkc3ViZGlyLXJlbGF0ZWQgZml4ZXMuCisKK01vbiBKdW4gMjIgMTg6MzA6MjYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogZml4IHZhcmlvdXMgcHJvYmxlbXMgd2l0aCBwcm9wb2dhdGluZworCW1ha2VmaWxlX3RhcmdldF9mcmFnIGluIHN1YmRpcnMuCisJKiBjb25maWd1cmUuaW46IGNvbmZpZyBsaWJnY2MgaWYgaXRzIHRoZXJlCisKK0ZyaSBKdW4gMTkgMTU6MTk6NDAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIEhQUEEgbWVyZ2UuCisKK01vbiBKdW4gMTUgMTI6MzE6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAorCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgorCitTdW4gSnVuIDE0IDEwOjI5OjE5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlcGxhY2UgYWxsLWJpc29uIHdpdGggYWxsLWJ5YWNjIGluIGFsbAorCWRlcGVuZGVuY3kgbGluZXMgZm9yIG90aGVyIHRvb2xzICh3aGljaCBub3cgdXNlIGJ5YWNjKS4KKworRnJpIEp1biAxMiAyMjoyMTo1NyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIEFkZCBzdW40c29sMiA9PiBzcGFyYy1zdW4tc29sYXJpczIuCisKK1R1ZSBKdW4gIDkgMTc6MTg6MTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQWRkIElOU1RBTEwuCisKK1RodSBKdW4gIDQgMTI6MDc6MzIgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG1ha2UgZ3Byb2YgcnVsZXMgc2ltaWxhciB0byBieWFjYyBydWxlcyAoaW5zdGVhZCBvZgorCXZlc3RpZ2FsICQodW5zdWJkaXIpIHRoYXQgZGlkbid0IHdvcmsuLi4pCisKK1RodSBKdW4gIDQgMDA6Mzc6MDUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiAgQWRkIHN1cHBvcnQgZm9yIExpbnV4LgorCSogTWFrZWZpbGUuaW46ICBVc2UgJChGTEFHU19UT19QQVNTKSBtb3JlIGNvbnNpc3RlbnRseQorCShhdCBsZWFzdCBmb3IgbGliZysrKS4KKworVHVlIEp1biAwMiAyMDowMzowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUudGV4aTogZml4IGRvYyBmb3IgdGhlIC1uZnAgb3B0aW9uIHRvIGNvbmZpZ3VyZQorCitUdWUgSnVuICAyIDE3OjIwOjUyIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbC1iaW51dGlscyk6IGFyIG5lZWRzIGZsZXgsIHNvIGRlcGVuZCBvbiBhbGwtZmxleC4KKworU3VuIE1heSAzMSAxNTowNDowOCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiBjaGFuZ2VkIFteLV0rIHRvIFteLV1bXi1dKiBzbyB0aGF0IGl0IHdvcmtzIHVuZGVyCisJU3VuIHNlZC4gKEJTRCA0LjMgc2VkIGRvZXNuJ3QgaGFuZGxlIFteLV0rIGVpdGhlci4pCisJKiBjb25maWd1cmUuaW46IGFkZGVkIHNvbGFyaXMqIGhvc3RfbWFrZWZpbGVfZnJhZyBob29rLgorCitTdW4gTWF5IDMxIDAxOjEwOjM0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogY2hhbmdlZCByZWNvZ25pdGlvbiBvZiBtNjgwMDAgc28gdGhhdCB2YXJpb3VzCisJbTY4ayB0eXBlcyBjYW4gYmUgc3BlY2lmaWVkIHZpYSBtNjgwWzAxMjM0XTAKKworU2F0IE1heSAzMCAyMTowMTowNiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBmaXggc2VkIHNvIHRoYXQgJy1mb28nIGlzbid0CisJY29tcGxldGVseSBzdWJzdGl0dXRlZCBvdXQgd2hpbGUgLisnLWZvbycgbG9zZXMgdGhlICctZm9vJworCitXZWQgTWF5IDI3IDIzOjE4OjUyIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWIgKCRvcyk6IEFkZCAtYW91dC4KKworRnJpIE1heSAyMiAxNDowMDowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiAgSWYgaG9zdF9tYWtlZmlsZV9mcmFnIGlzIGFic29sdXRlLCBkb24ndAorCXByZWZpeCAke2ludnN1YmRpcn0gKHJlbGV2YW50IHRvIGxpYmcrKyBhdXRvLWNvbmZpZ3VyZSkuCisKK1RodSBNYXkgMjEgMTg6MDA6MDkgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHRvb2xkaXIpOiBEZWZpbmUgaXQuCisJKGFsbC1sZCk6IERlcGVuZCBvbiBhbGwtZmxleC4KKworU3VuIE1heSAxMCAyMTo0NTo1OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjaGVjayk6ICBGaXggbGliZysrIHNwZWNpYWwgY2FzZS4KKworRnJpIE1heSAgOCAwODozMTo0MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBkbyBub3QgYnVyeSBgcHdkYCBpbnRvIGNvbmZpZy5zdGF0dXMsIHRodXMgZG8gZmV3ZXIKKwkgIHB3ZCdzLgorCisJKiBjb25maWd1cmU6IHByaW50IHRoZSAiQnVpbGRpbmcgaW4iIG1lc3NhZ2Ugb25seSB3aGVuIGJ1aWxkaW5nIGluCisJICBvdGhlciB0aGFuICIuIiBBTkQgdmVyYm9zZS4KKworCSogY29uZmlndXJlOiByZW1vdmUgLXMsIHJld29yayAtdiB0byBiZXR0ZXIgYWNjb21vZGF0ZSBndWVzdGVkCisJICBjb25maWd1cmVzLgorCisJKiBzdGFuZGFyZHMudGV4aTogdXBkYXRlZCB0byAzIG1heSwgZml4ZWQgbGlicmlkIDwtPiBsaWJkaXIgdHlwby4KKworRnJpIE1heSAgMSAxODowMDo1MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG1hY3JvaXplIGZsYWdzIHBhc3NlZCBvbiByZWN1cnNpb24uICByZW1vdmUKKwkgIGZpbGV1dGlscy4KKworVGh1IEFwciAzMCAwODo1NjoyMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBnZXQgbWFrZXNyY2RpciByaWdodCBmb3Igc3ViZGlycyBkZWVwZXIgdGhhbiAxLgorCisJKiBNYWtlZmlsZS5pbjogcGFzcyBJTlNUQUxMLCBJTlNUQUxMX0RBVEEsIElOU1RBTExfUFJPR1JBTSBvbgorCSAgaW5zdGFsbC4KKworRnJpIEFwciAyNCAxNTo1MTo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGRvbid0IHByaW50IHN1YmRpcl9kbyBvciByZWN1cnNpb24gbGluZXMuCisKK0ZyaSBBcHIgMjQgMTU6MjI6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIHN0YW5kYXJkcy50ZXhpOiBhZGRlZCBtZW51IGl0ZW0uCisKKwkqIE1ha2VmaWxlLmluOiBidWlsZCBhbmQgaW5zdGFsbCBzdGFuZGFyZHMuaW5mby4KKworCSogc3RhbmRhcmRzLnRleGk6IG5ldyBmaWxlLgorCitXZWQgQXByIDIyIDE4OjA2OjU1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiB0ZXN0IGZvciBhbmQgbW92ZSBjb25maWcuc3RhdHVzIHBpZWNlcyBmcm9tCisJICAke3N1YmRpcn0vLgorCitXZWQgQXByIDIyIDE0OjM4OjM0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtZGVsdGE4OCwgY29uZmlnL21oLW5jcjMwMDA6ICBSZXBsYWNlIE1JTlVTX0cgd2l0aAorCUNGTEFHUyBwZXIgbmV3IGNvbmZpZ3VyYXRpb24gc3RyYXRlZ3kuCisJKiBjb25maWd1cmU6ICBUZXN0IGZvciBleGlzdGFuY2Ugb2YgZmlsZXMgYmVmb3JlIHRyeWluZyB0byBtdgorCXRoZW0sIHRvIGF2b2lkIG51bWVyb3VzIG5vbi1leGlzdGFuY2UgbWVzc2FnZXMuCisKK1R1ZSBBcHIgMjEgMTI6MzE6MzMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogY29ycmVjdCBmaW5hbCBsaW5lIG9mIGNvbmZpZy5zdGF0dXMuCisKKwkqIGNvbmZpZ3VyZTogcGF0Y2ggZnJvbSBlZ2dlcnQuICBBdm9pZHMgYSBwcm90ZWN0aW9uIHByb2JsZW0gaWYKKwkgIHRoZSBvcmlnaW5hbCBNYWtlZmlsZS5pbiBpcyByZWFkIG9ubHkuCisKKwkqIGNvbmZpZ3VyZTogdXNlIG1vdmUtaWYtY2hhbmdlIGZyb20gZ2NjIHRvIGNyZWF0ZSBjb25maWcuc3RhdHVzLgorCSAgU29tZSBtYWtlZmlsZXMgZGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMgdG8gdGVsbCBpZiBhIGRpcmVjdG9yeQorCSAgaGFzIGJlZW4gcmVjb25maWd1cmVkIGZvciBhIGRpZmZlcmVudCBob3N0LiAgVGhpcyBjaGFuZ2UKKwkgIHByZXZlbnRzIHRob3NlIGRpcmVjdG9yaWVzIGZyb20gcmVtYWtpbmcgZXZlcnl0aGluZyBpbiB0aGUgY2FzZQorCSAgd2hlcmUgdGhlIHJlY29uZmlnIHdhcyBvbmx5IGludGVuZGVkIHRvIHJlYnVpbGQgYSBNYWtlZmlsZS4KKworCSogY29uZmlndXJlOiB0ZXN0IGZvciBjb25maWcuc3ViIHdpdGggImNvbmZpZy5zdWIgc3VuNCIgcmF0aGVyCisJICB0aGFuICJjb25maWcuc3ViICR7aG9zdF9hbGlhc30iLiAgT3RoZXJ3aXNlIHdlIGNhbid0IHRlbGwgYSBiYWQKKwkgIGhvc3QgYWxpYXMgZnJvbSBhIG1pc3NpbmcgY29uZmlnLnN1Yi4KKworTW9uIEFwciAyMCAxODoxNjozNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBleHBsaWNpdGx5IHBhc3MgQ0ZMQUdTIG9uIHJlY3Vyc2lvbi4gbm8gbG9uZ2VyIHBhc3MKKwkgIE1JTlVTX0cgKHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBDRkxBR1MpLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCisKK0ZyaSBBcHIgMTcgMTg6Mjc6NTEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogbWtkaXIgJHtzdWJkaXJ9IGFzIG5lZWRlZC4KKworV2VkIEFwciAxNSAxNzozNzoyMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sY29uZmlndXJlLmluOiBhZGRlZCBhdXRvY29uZi4KKworV2VkIEFwciAxNSAxNzoyNzozNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBubyBsb25nZXIgcGFzcyBhZ2FpbnN0IG9uIHJlY3Vyc2lvbi4KKworCSogTWFrZWZpbGUuaW46IGFkZGVkIC5OT0VYUE9SVDogc28gdGhhdCBzdHJheSBtYWtlZmlsZV9mcmFnCisJICBkZWZpbml0aW9ucyBhcmUgbm90IGluaGVyaXRlZC4KKworCSogY29uZmlndXJlOiBjb3JyZWN0IG1ha2VzcmNkaXIgd2hlbiBzdWJkaXIgaXMgLgorCitUdWUgQXByIDE0IDExOjU2OjA5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6ICBBZGQgc3VwcG9ydCBmb3IgJ3N1YmRpcnMnIHZhcmlhYmxlLCB3aGljaCBpcworCWxpa2UgJ2NvbmZpZ2RpcnMnLCBleGNlcHQgdGhhdCBjb25maWd1cmUgZG9lc24ndCByZS1pbnZva2UKKwlpdHNlbGYgZm9yIHN1YmRpcnMsIGl0IGp1c3QgY3JlYXRlcyBhIE1ha2VmaWxlIGZvciBlYWNoIHN1YmRpci4KKwkqIGNvbmZpZ3VyZS50ZXhpOiAgRG9jdW1lbnQgc3ViZGlycy4KKworTW9uIEFwciAxMyAxODo1MDoxNiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgZmxleCB0byBjb25maWdkaXJzCisKK01vbiBBcHIgMTMgMTg6NDM6NTUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW1vdmUgY2xlYW4tc3RhbXBzIGZyb20gY2xlYW4uCisKK1NhdCBBcHIgMTEgMDM6NTI6MDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBnZGJ0ZXN0IHRvIGNvbmZpZ2RpcnMuCisKK0ZyaSBBcHIgMTAgMjM6MTE6NDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChNSU5VU19HKTogIEFkZCBtYWNybywgZGVmYXVsdCB0byAtZywgcGFzcyBvbgorCXRvIHJlY3Vyc2l2ZSBtYWtlcy4KKwkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCisKK1dlZCBBcHIgIDggMjM6MDg6MTIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgcmVmZXJlbmNlcyB0byBnZGJtLgorCitUdWUgQXByICA3IDE2OjQ4OjIwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViOiAgRG9uJ3QgY2Fub25pY2FsaXplIG9zIHZhbHVlCisJbmV3c29zKiB0byBic2QgKHJlYWRsaW5lIG5lZWRzIHRvIGNoZWNrIGZvciBuZXdzb3MpLgorCShUaGlzIGZpeCB3YXMgZWFybGllciBtYWRlIEphbiAzMSwgYnV0IGdvdCByZS1icm9rZW4uKQorCitNb24gQXByICA2IDE0OjM0OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIHNjbyBpcyBhbiBvcywgbm90IGEgdmVuZG9yIQorCisJKiBjb25maWd1cmU6ICBRdW90ZSAkKCBiZXR0ZXIuICBLZWVwIHZhcmlvdXMgc2hlbGxzIGhhcHB5LgorCitUdWUgTWFyIDMxIDE2OjMyOjU3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZWxpbWluYXRlIHN0YW1wLWZpbGVzLgorCitNb24gTWFyIDMwIDIyOjIwOjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkIHNlbmRfcHIuICByZW1vdmUgImZvcmNlIiBmcm9tIC5zdG1wLWdwcm9mIHJ1bGUuCisJICBTdXByZXNzIGVjaG9pbmcgb2YgYWxsIHRoZSAiaWYgWyAtZCAuLi4gJChNQUtFKSIgbGluZXMuCisKK1dlZCBNYXIgMjUgMTU6MjA6MDQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIGZpeCBpcmlzL2lyaXMzLgorCitXZWQgTWFyIDI1IDEwOjM0OjE5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IHJlLWFkZCAtcm0uCisKK1R1ZSBNYXIgMjQgMjM6NTA6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1hc2tlZmlsZS5pbjogYWRkIC5zdG1wLXJjcyB0byBhbGwuCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGdhcyBmcm9tIHJzNjAwMCBidWlsZCwgdXNlIGFpeCBob3N0IGZyYWdtZW50LgorCitNb24gTWFyIDIzIDE5OjQzOjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IHBhc3MgZG93biBzaXRlX29wdGlvbiBkdXJpbmcgcmVjdXJzaW9uLgorCitUaHUgTWFyIDE5IDE2OjQ5OjM2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhbGwuY3Jvc3MpOiAgQWRkIC5zdG1wLWJmZCAuc3RtcC1yZWFkbGluZS4KKworV2VkIE1hciAxOCAxNToyOTozMyAxOTkyICBNaWtlIFN0dW1wICAobXJzQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogQ2hhbmdlIGV4ZWNfcHJlZml4IHNvIHRoYXQgaXQgcmVhbGx5IGRlZmF1bHRzIHRvIHByZWZpeC4KKworU2F0IE1hciAxNCAxNzoyMDozOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogIEFkZCBzdXBwb3J0IGZvciBtbWFsbG9jIGxpYnJhcnkuCisKK0ZyaSBNYXIgMTMgMTg6NDQ6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgc3RtcCBkZXBlbmRlbmNpZXMgZm9yIGEgZmV3IG1vcmUgdGhpbmdzLgorCitUaHUgTWFyIDEyIDA0OjU2OjI0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IGFkanVzdGVkIGVycm9yIG1lc3NhZ2Ugb24gb2JqZGlyL3NyY2RpciBjb25maWd1cmUKKwkgIGNvbGxpc2lvbiwgcGVyIGpvaG4ncyBzdWdnZXN0aW9uLgorCisJKiBNYWtlZmlsZS5pbjogYWRkIGxpYmliZXJ0eSBzdG1wIHRvIGFsbCBhbmQgYWxsLmNyb3NzLgorCitXZWQgTWFyIDExIDAyOjA3OjUyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGZvcmNlIGRlcGVuZGVuY2llcywgYWRkIGdyZXAgdG8gYWxsLgorCitUdWUgTWFyIDEwIDIxOjQ5OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBtYXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBkcm9wIGZsZXguICBtYWtlIHN0YW1wIGZpbGVzIHdvcmsuCisKKwkqIGNvbmZpZ3VyZTogYWRkZWQgdGVzdCBmb3IgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbiBpbiBzcmNkaXIsCisJICByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4gIE90aGVyd2lzZSBlbWFjcyBnZGIgbW9kZQorCSAgZ2V0cyBjcmFua3kuICB1c2UgcmVsYXRpdmUgcGF0aHMgZm9yIGNvbmZpZ3VyZSBhbmQgc3JjZGlyCisJICB3aGVuZXZlciBwb3NzaWJsZS4gIFNlbmQgc29tZSBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIgdGhhdCB3ZXJlCisJICBnb2luZyB0byBzdGRvdXQuCisKK1R1ZSBNYXIgMTAgMTg6MDE6NTUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgRml4IGxpYmcrKyBydWxlIHRvIGNoZWNrIGZvciBnY2MgZGlyZWN0b3J5CisJYmVmb3JlIHVzaW5nIGdjYy9nY2MuICBBbHNvIHBhc3MgWFRSQUZMQUdTLgorCitUaHUgTWFyICA1IDIxOjQ1OjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkpCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdG1wLWZpbGVzIHNvIHRoYXQgZGlyZWN0b3JpZXMgYXJlbid0IHBvbGxlZAorCSAgd2hlbiB0aGV5IGFyZSBhbHJlYWR5IGJ1aWx0LgorCisJKiBjb25maWd1cmUudGV4aTogZml4ZWQgYSBub2RlIHBvaW50ZXIgcHJvYmxlbS4KKworVGh1IE1hciAgNSAxMjowNTo1OCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcuc3ViIGNvbmZpZ3VyZS5pbiBjb25maWcvbWgtaXJpeDQgZ2RiL2NvbmZpZ3VyZS5pbgorCWdkYi9taXBzLXRkZXAuYyBnZGIvbWlwc3JlYWQuYyBnZGIvcHJvY2ZzLmMgZ2RiL3NpZ25hbWUuaAorCWdkYi90bS1pcml4My5oIGdkYi90bS1taXBzLmggZ2RiL3htLWlyaXg0LmggZ2RiL2NvbmZpZy9tdC1pcml4MworCWdkYi9jb25maWcvbWgtaXJpeDQgdGV4aW5mby9jb25maWd1cmUuaW46ICBQb3J0IHRvIFNHSSBJcml4LTQueC4KKworV2VkIE1hciAgNCAwMjo1Nzo0NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogLXJlY3VycmluZyBiZWNvbWVzIC1zaWxlbnQuICBjb3JyZWN0ZWQgaGVscCBtZXNzYWdlCisJICBmb3IgLXNpdGU9IG9wdGlvbi4KKworCSogTWFrZWZpbGUuaW46IG1rZGlyICQoZXhlY19wcmVmaXgpIGFuZCAkKHRvb2xkaXIpLgorCitUdWUgTWFyICAzIDE0OjUxOjIxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiB3aGVuIGJ1aWxkaW5nIE1ha2VmaWxlIGZvciBjcm9zc2VzLCByZXBsYWNlCisJICB0b29sZGlyIGFuZCBwcm9ncmFtX3ByZWZpeC4gIGRlZmF1bHQgc3JjZGlyIGZyb20gbG9jYXRpb24gb2YKKwkgIGNvbmZpZy5zdWIuICByZW1vdmUgImZvciBob3N0IGluIGhvc3RzIiBhbmQgImZvciB0YXJnZXQgaW4KKwkgIHRhcmdldHMiIGxvb3BzLgorCitXZWQgRmViIDI2IDE5OjQ4OjI1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IERvIG5vdCBwYXNzIGJpbmRpciBvciBtYW5kaXIgdG8gY3ZzLgorCitXZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAorCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCisJICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KKworCSogY29uZmlndXJlLnRleGk6IHJlbW92ZSBtb3N0IHJlZmVyZW5jZXMgdG8gbXVsdGlwbGUgaG9zdHMsCisJICBtdWx0aXBsZSB0YXJnZXRzLCBzdWJkaXJzLCBldGMuCisKKwkqIGNvbmZpZ3VyZS5tYW46IHJlbW92ZWQgcmNzaWQuIHJlZmVyZW5jZSBjb25maWcuc3ViIG5vdAorCSAgY29uZmlnLnN1YnIuCisKKwkqIE1ha2VmaWxlLmluOiBta2RpciAkKGluZm9kaXIpIG9uIGluc3RhbGwtaW5mby4KKworV2VkIEZlYiAxOSAxNTo0MToxMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLnRleGk6ICBFeHBsYWluIGJldHRlciBhYm91dCAuZ2RiaW5pdCBhbmQgYWJvdXQKKwl0aGUgZW52aXJvbm1lbnQgdGhhdCBjb25maWd1cmUuaW4gc2VjdGlvbnMgcnVuIGluLgorCitGcmkgRmViICA3IDA3OjU1OjAwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBVbHRyaXggaXMgb25seSBhIGRlY3N0YXRpb24gaWYgaXQncyBhIE1JUFMuCisKK0ZyaSBKYW4gMzEgMjE6NTQ6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIERPQy5jb25maWd1cmUgPT4gY2ZnLXBhcGVyLnRleGkuCisKK0ZyaSBKYW4gMzEgMjE6NDg6MTggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YiAobmVhciBjYXNlICRvcyk6ICBEb24ndCBjb252ZXJ0IG5ld3NvcyogdG8gYnNkIQorCitGcmkgSmFuIDMxIDAyOjI3OjMyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlaW5zdGFsbCBjaGFuZ2UgZnJvbSBnZGItNC4zIHRoYXQgcmVkdWNlcworCXRoZSBudW1iZXIgb2YgY29waWVzIG9mIENPUFlJTkcgdGhhdCBnbyBpbnRvIHRoZSBHREIgdGFyIGZpbGUuCisKK1RodSBKYW4gMzAgMTY6MTc6MzAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogYmZkL2NvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXNjbywgZ2RiL2NvbmZpZy9taC1pMzg2c2NvLAorCWdkYi9jb25maWcvbXQtaTM4NnYzMiwgZ2RiL2NvbmZpZ3VyZS5pbiwgcmVhZGxpbmUvY29uZmlndXJlLmluOgorCUZpeCBTQ08gY29uZmlndXJhdGlvbiBzdHVmZi4KKworVHVlIEphbiAyOCAyMzo1MTowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBGb3IgbGliZysrLCBtYWtlIHN1cmUgdGhlIC1JIHBvaW50aW5nCisJdG8gdGhlIGdjYyBkaXJlY3RvcnkgZ29lcyAqYWZ0ZXIqIGFsbCB0aGUgbGliZysrLWxvY2FsIC1JIGZsYWdzLgorCUFsc28sIG1vdmUganVzdC1nY2MgZGVwZW5kZW5jeSBmcm9tIGp1c3QtbGliZysrIHRvIGFsbC1saWJnKysuCisKK1R1ZSBKYW4gMjggMTI6NTY6MjQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiAgQ2hhbmdlIC14IHRvIC1mIHRvIGtlZXAgVWx0cml4IC9iaW4vdGVzdCBoYXBweS4KKworU2F0IEphbiAxOCAxNzo0NToxMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgUmVtb3ZlIHRleGluZm8gdGFyZ2V0cy4KKworU2F0IEphbiAxOCAxNzowMzoyMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YjogIEFkZCBzdHJhdHVzIGNvbmZpZ3VyYXRpb24gZnJhZ3MuICBBbHNvCisJc3VibWl0dGVkIHRvIEZTRi4KKworU2F0IEphbiAxOCAxNTozNToyOSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoREVWX1NVUFBPUlQpOiAgYWRkIGNvbmZpZ3VyZS5tYW4uCisKKwkqIGNvbmZpZy5zdWIoRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyk6ICBhZGQgLW5vbmUqLgorCitGcmkgSmFuIDE3IDE3OjU4OjA1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgcmVtb3ZlIGZvcm0gZmVlZHMgdG8gbWFrZSBTdW4ncyBtYWtlIGhhcHB5LgorCShERVZPX1NVUFBPUlQpOiAgRE9DLmNvbmZpZ3VyZSA9PiBjZmctcGFwZXIudGV4aS4KKworU2F0IEphbiAgNCAxNjoxMTo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogIE1ha2UgcXVpZXRlci4KKworVGh1IEphbiAgMiAyMjo1NzoxMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQWRkIGxpYmcrKy4KKwkqIGNvbmZpZ3VyZTogIFdoZW4gdmVyYm9zZSwgZG9uJ3Qgb3V0cHV0IHRoZSBjb21tYW5kIGxpbmUgYXQgZWFjaAorCWxldmVsOyBpdCB3aWxsIGJlIHVucmVtYXJrYWJseSB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiwKKwl3aGljaCB3aWxsIGJlIHRoZSBzYW1lIGFzIHdoYXQgdGhlIHVzZXIgdHlwZWQuCisKK0ZyaSBEZWMgMjcgMTY6MjY6NDcgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGZpeCBjbGVhbi1pbmZvLCBhZGQgZmxleC4gIGFkZAorCSAgZmlsZXV0aWxzLgorCisJKiBjb25maWd1cmU6IGJlIGxlc3Mgc2Vuc2l0aXZlIHRvIHNwYWNlcyBpbiBNYWtlZmlsZS5pbi4gIERvIG5vdAorCSAgbG9vayBmb3Igc291cmNlcyBpbiAiLi4iLiAgRG9pbmcgc28gYnJlYWtzIHN1YmRpcmVjdG9yaWVzIHRoYXQKKwkgIG1pZ2h0IGhhdmUgdGhlaXIgb3duIGNvbmZpZ3VyZS4gIElmIGEgc3ViZGlyIGhhcyBpdCdzIG93bgorCSAgY29uZmlndXJlIHNjcmlwdCwgdXNlIGl0LgorCitUaHUgRGVjIDI2IDE2OjMwOjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQorCisJKiBjZmctcGFwZXIudGV4aTogc29tZSBjaGFuZ2VzIHN1Z2dlc3RlZCBieSBybXMuCisKK1RodSBEZWMgMjYgMTA6MTM6MzYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5zdWI6ICBNZXJnZSBpbiBzb21lIHNtYWxsIGFkZGl0aW9ucyBmcm9tIHRoZSBGU0YgdmVyc2lvbiwKKwl0YWtlbiBmcm9tIHRoZSBnY2MgZGlzdHJpYnV0aW9uLCB0byBicmluZyB0aGUgQ3lnbnVzIGFuZCBGU0YKKwl2ZXJzaW9ucyBpbnRvIGNsb3NlciBzeW5jLgorCitGcmkgRGVjIDIwIDExOjM0OjE4IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBDaGFuZ2VkIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KKworVGh1IERlYyAxOSAxNTo1NDoyOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBhZGRlZCAtViBmb3IgdmVyc2lvbiBudW1iZXIgb3B0aW9uLgorCitXZWQgRGVjIDE4IDE1OjM5OjM0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQorCisJKiBET0MuY29uZmlndXJlLCBjZmctcGFwZXIudGV4aTogcmV2aXNlZCwgdXBkYXRlZCwgYW5kIHRleGluZm8nZC4KKwkgIHJlbmFtZWQgZnJvbSBET0MuY29uZmlndXJlIHRvIGNmZy1wYXBlci50ZXhpLgorCitNb24gRGVjIDE2IDIzOjA1OjE5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLCBjb25maWcuc3ViciwgY29uZmlnLnN1YjogY29uZmlnLnN1YnIgaXMgbm93CisJICBjb25maWcuc3ViIGFnYWluLgorCitGcmkgRGVjIDEzIDAxOjE3OjA2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUudGV4aTogbmV3IGZpbGUsIGluIHByb2dyZXNzLgorCisJKiBNYWtlZmlsZS5pbjogYnVpbGQgaW5mbyBmaWxlIGFuZCBpbnN0YWxsIHRoZSBtYW4gcGFnZSBmb3IKKwkgIGNvbmZpZ3VyZS4KKworCSogY29uZmlndXJlLm1hbjogbmV3IGZpbGUsIGZpcnN0IGN1dC4KKworCSogY29uZmlndXJlOiBmaW5kIGNvbmZpZy5zdWJyIGFnYWluIG5vdyB0aGF0IGNvbmZpZ3VyYXRpb24gIm5vbmUiCisJICBoYXMgZ29uZS4gIHJlbW92ZWQgYWxsIHRyYWNlcyBvZiB0aGUgLWFuc2kgb3B0aW9uLiAgcmVtb3ZlZCBhbGwKKwkgIHRyYWNlcyBvZiB0aGUgLWxhbmd1YWdlcyBvcHRpb24uCisKKwkqIGNvbmZpZy5zdWJyOiByZXN5bmMgZnJvbSBybXMuCisKK1dlZCBEZWMgMTEgMjI6MjU6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUsIGNvbmZpZy5zdWIsIGNvbmZpZy5zdWJyOiBtZXJnZSBjb25maWcuc3ViIGludG8KKwkgIGNvbmZpZy5zdWJyLCBjYWxsIHRoZSByZXN1bHQgY29uZmlnLnN1YnIsIHJlbW92ZSBjb25maWcuc3ViLCB1c2UKKwkgIGNvbmZpZy5zdWJyLgorCisJKiBNYWtlZmlsZS5pbjogcmV2aXNlZCBpbnN0YWxsIGZvciBkaXIuaW5mby4KKworVHVlIERlYyAxMCAwMDowNDozNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGRlY3N0YXRpb24gaG9zdCBtYWtlZmlsZSBmcmFnLgorCisJKiBNYWtlZmlsZS5pbjogQklTT04gbm93IGJpc29uIC15IGFnYWluLiAgYWxzbyBpbnN0YWxsLWdjYyBvbgorCSAgaW5zdGFsbC4gIGNsZWFuLWdkYm0gb24gY2xlYW4uICBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KKwkgIE1ha2UgZGlyZWN0b3JpZXMgZm9yIGluZm8gaW5zdGFsbC4gIEJ1aWxkIGRpci5pbmZvIGhlcmUgdGhlbgorCSAgaW5zdGFsbCBpdC4KKworTW9uIERlYyAgOSAxNjo0ODozMyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBmaXggZm9yIGJhZCBkaXJlY3RvcnkgdGVzdHMuCisKK1NhdCBEZWMgIDcgMDA6MTc6MDEgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmU6IFx7MSwyXH0gYXBwZWFycyB0byBiZSBhIHN5c3YnaXNtLiAgVXNlIGEgZGlmZmVyZW50CisJICByZWdleHAuICAtc3JjZGlyIHJlbGF0aXZlIHdhcyBiZWluZyBoYW5kbGVkIGluY29ycmVjdGx5LgorCisJKiBNYWtlZmlsZS5pbjogdW53cmFwcGVkIHNvbWUgZm9yIGxvb3BzIHNvIHRoYXQgcGFyYWxsZWwgbWFrZXMKKwkgIHdvcmsgYWdhaW4gYW5kIHNvIG9uZSBjYW4gZm9jdXMgb25lJ3MgYXR0ZW50aW9uIG9uIGEgcGFydGljdWxhcgorCSAgcGFja2FnZS4KKworRnJpIERlYyAgNiAwMDoyMjowOCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogYWRkZWQgUFdEIGFzIGEgc3RhbmQgaW4gZm9yIGBwd2RgIChmb3Igc3BlZWQpLiB1c2UKKwkgIGVsaWYgd2hlcmV2ZXIgcG9zc2libGUuICBtYWtlIC1zcmNkaXIgd29yayB3aXRob3V0IC1vYmpkaXIuCisJICAtb2JqZGlyPSBjb21tZW50ZWQgb3V0LgorCitUaHUgRGVjICA1IDIyOjQ2OjUyIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiArb3B0aW9ucyBiZWNvbWUgLS1vcHRpb25zLiAgLXN1YmRpcnMgY29tbWVudGVkIG91dC4KKwkgIGFkZGVkIC1ob3N0LCAtZGF0YWRpci4gIFJlbmFtZWQgLWRlc3RkaXIgdG8gLXByZWZpeC4gIENvbW1lbnQgaW4KKwkgIE1ha2VmaWxlIG5vdyBhdCB0b3Agb2YgZ2VuZXJhdGVkIE1ha2VmaWxlLiAgUmVtb3ZlZCBjdnMgbG9nCisJICBlbnRyaWVzLiAgYWRkZWQgLXNyY2Rpci4gIGNyZWF0ZSAuZ2RiaW5pdCBvbmx5IGlmIHRoZXJlIGlzIG9uZQorCSAgaW4gJHtzcmNkaXJ9LgorCisJKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCisJICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCisJICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgorCitGcmkgTm92IDIyIDA3OjM4OjExIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogRnJlc2hseSBjcmVhdGVkIENoYW5nZUxvZy4KKworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NgordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFiYjhjCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxODIxIEBACisjCisjIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBzdWJkaXJzIHRvIGJ1aWxkLgorIyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworCitzcmNkaXIgPSAuCisKK3ByZWZpeCA9IC91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisKK2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9iaW4KK3NiaW5kaXI9JHtleGVjX3ByZWZpeH0vc2JpbgorbGliZXhlY2Rpcj0ke2V4ZWNfcHJlZml4fS9saWJleGVjCitkYXRhZGlyPSR7cHJlZml4fS9zaGFyZQorc3lzY29uZmRpcj0ke3ByZWZpeH0vZXRjCitzaGFyZWRzdGF0ZWRpcj0ke3ByZWZpeH0vY29tCitsb2NhbHN0YXRlZGlyPSR7cHJlZml4fS92YXIKK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK29sZGluY2x1ZGVkaXI9L3Vzci9pbmNsdWRlCitpbmZvZGlyPSR7cHJlZml4fS9pbmZvCittYW5kaXI9JHtwcmVmaXh9L21hbgorZ3h4X2luY2x1ZGVfZGlyPSR7aW5jbHVkZWRpcn0vZysrCisKK3Rvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldCkKKworcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9CisKK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCittYW4zZGlyID0gJChtYW5kaXIpL21hbjMKK21hbjRkaXIgPSAkKG1hbmRpcikvbWFuNAorbWFuNWRpciA9ICQobWFuZGlyKS9tYW41CittYW42ZGlyID0gJChtYW5kaXIpL21hbjYKK21hbjdkaXIgPSAkKG1hbmRpcikvbWFuNworbWFuOGRpciA9ICQobWFuZGlyKS9tYW44CittYW45ZGlyID0gJChtYW5kaXIpL21hbjkKK2luZm9kaXIgPSAkKHByZWZpeCkvaW5mbworaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCisjIERpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgZXRjLgorbGlic3ViZGlyID0gJChsaWJkaXIpL2djYy1saWIvJCh0YXJnZXRfYWxpYXMpLyQoZ2NjX3ZlcnNpb24pCitHREJfTkxNX0RFUFMgPSAKKworU0hFTEwgPSAvYmluL3NoCisKKyMgSU5TVEFMTF9QUk9HUkFNX0FSR1MgaXMgY2hhbmdlZCBieSBjb25maWd1cmUuaW4gdG8gdXNlIC14IGZvciBhCisjIGN5Z3dpbiBob3N0LgorSU5TVEFMTF9QUk9HUkFNX0FSR1MgPQorCitJTlNUQUxMID0gJChTSEVMTCkgJCRzL2luc3RhbGwtc2ggLWMKK0lOU1RBTExfUFJPR1JBTSA9ICQoSU5TVEFMTCkgJChJTlNUQUxMX1BST0dSQU1fQVJHUykKK0lOU1RBTExfU0NSSVBUID0gJChJTlNUQUxMKQorSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMKSAtbSA2NDQKKworSU5TVEFMTF9ET1NSRUwgPSBpbnN0YWxsLWRvc3JlbC1mYWtlCisKK0FTID0gYXMKK0FSID0gYXIKK0FSX0ZMQUdTID0gcmMKK0NDID0gY2MKKworIyBTcGVjaWFsIHZhcmlhYmxlcyBwYXNzZWQgZG93biBpbiBFWFRSQV9HQ0NfRkxBR1MuICBUaGV5IGFyZSBkZWZpbmVkCisjIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IE1ha2VmaWxlIGZyYWdtZW50cy4KK0hPU1RfQ0MgPSAkKENDX0ZPUl9CVUlMRCkKK0hPU1RfUFJFRklYID0gCitIT1NUX1BSRUZJWF8xID0gbG9zZXItCisKKyMgVGhlc2UgZmxhZyB2YWx1ZXMgYXJlIG5vcm1hbGx5IG92ZXJyaWRkZW4gYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCitDRkxBR1MgPSAtZworQ1hYRkxBR1MgPSAtZyAtTzIKKworTElCQ0ZMQUdTID0gJChDRkxBR1MpCitDRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ0ZMQUdTKQorTERGTEFHU19GT1JfVEFSR0VUID0gCitMSUJDRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ0ZMQUdTX0ZPUl9UQVJHRVQpCitQSUNGTEFHID0gCitQSUNGTEFHX0ZPUl9UQVJHRVQgPSAKKworQ0hJTExGTEFHUyA9ICQoQ0ZMQUdTKQorQ0hJTExfTElCID0gLWxjaGlsbAorQ1hYID0gYysrCisKKyMgVXNlIC1PMiB0byBzdHJlc3MgdGVzdCB0aGUgY29tcGlsZXIuCitMSUJDWFhGTEFHUyA9ICQoQ1hYRkxBR1MpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucworQ1hYRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ1hYRkxBR1MpCitMSUJDWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHU19GT1JfVEFSR0VUKSAtZm5vLWltcGxpY2l0LXRlbXBsYXRlcyAtZmV4Y2VwdGlvbnMKKworUkFOTElCID0gcmFubGliCisKK0RMTFRPT0wgPSBkbGx0b29sCitXSU5EUkVTID0gd2luZHJlcworCitOTSA9IG5tCisKK0xEID0gbGQKKworIyBOb3QgcGxhaW4gR1pJUCwgc2luY2UgZ3ppcCBsb29rcyB0aGVyZSBmb3IgZXh0cmEgY29tbWFuZC1saW5lIG9wdGlvbnMuCitHWklQUFJPRyA9IGd6aXAKKworIyBUaGVzZSB2YWx1ZXMgYXJlIHN1YnN0aXR1dGVkIGJ5IGNvbmZpZ3VyZS4KK0RFRkFVTFRfWUFDQyA9IHlhY2MKK0RFRkFVTFRfTEVYID0gbGV4CitERUZBVUxUX000ID0gbTQKKworQklTT04gPSBgaWYgWyAtZiAkJHIvYmlzb24vYmlzb24gXSA7IHRoZW4gXAorCSAgICBlY2hvICQkci9iaXNvbi9iaXNvbiAtTCAkJHMvYmlzb24vIDsgXAorCSBlbHNlIFwKKwkgICAgZWNobyBiaXNvbiA7IFwKKwkgZmlgCisKK1lBQ0MgPSBgaWYgWyAtZiAkJHIvYmlzb24vYmlzb24gXSA7IHRoZW4gXAorCSAgICBlY2hvICQkci9iaXNvbi9iaXNvbiAteSAtTCAkJHMvYmlzb24vIDsgXAorCWVsaWYgWyAtZiAkJHIvYnlhY2MvYnlhY2MgXSA7IHRoZW4gXAorCSAgICBlY2hvICQkci9ieWFjYy9ieWFjYyA7IFwKKwllbHNlIFwKKwkgICAgZWNobyAke0RFRkFVTFRfWUFDQ30gOyBcCisJZmlgCisKK0xFWCA9IGBpZiBbIC1mICQkci9mbGV4L2ZsZXggXSA7IFwKKwl0aGVuIGVjaG8gJCRyL2ZsZXgvZmxleCA7IFwKKwllbHNlIGVjaG8gJHtERUZBVUxUX0xFWH0gOyBmaWAKKworTTQgPSBgaWYgWyAtZiAkJHIvbTQvbTQgXSA7IFwKKwl0aGVuIGVjaG8gJCRyL200L200IDsgXAorCWVsc2UgZWNobyAke0RFRkFVTFRfTTR9IDsgZmlgCisKK01BS0VJTkZPID0gYGlmIFsgLWYgJCRyL3RleGluZm8vbWFrZWluZm8vTWFrZWZpbGUgXSA7IFwKKwl0aGVuIGVjaG8gJCRyL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm8gOyBcCisJZWxzZSBlY2hvIG1ha2VpbmZvIDsgZmlgCisKKyMgVGhpcyBqdXN0IGJlY29tZXMgcGFydCBvZiB0aGUgTUFLRUlORk8gZGVmaW5pdGlvbiBwYXNzZWQgZG93biB0bworIyBzdWItbWFrZXMuICBJdCBsZXRzIGZsYWdzIGJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hpbGUgc3RpbGwKKyMgdXNpbmcgdGhlIG1ha2VpbmZvIGZyb20gdGhlIG9iamVjdCB0cmVlLgorTUFLRUlORk9GTEFHUyA9CisKK0VYUEVDVCA9IGBpZiBbIC1mICQkci9leHBlY3QvZXhwZWN0IF0gOyBcCisJdGhlbiBlY2hvICQkci9leHBlY3QvZXhwZWN0IDsgXAorCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworUlVOVEVTVCA9IGBpZiBbIC1mICQkcy9kZWphZ251L3J1bnRlc3QgXSA7IFwKKwl0aGVuIGVjaG8gJCRzL2RlamFnbnUvcnVudGVzdCA7IFwKKwllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAorCisKKyMgY29tcGlsZXJzIHRvIHVzZSB0byBjcmVhdGUgcHJvZ3JhbXMgd2hpY2ggbXVzdCBiZSBydW4gaW4gdGhlIGJ1aWxkCisjIGVudmlyb25tZW50LgorQ0NfRk9SX0JVSUxEID0gJChDQykKK0NYWF9GT1JfQlVJTEQgPSAkKENYWCkKKworU1VCRElSUyA9ICJ0aGlzIGlzIHNldCB2aWEgY29uZmlndXJlLCBkb24ndCBlZGl0IHRoaXMiCitPVEhFUlMgPSAKKworIyBUaGlzIGlzIHNldCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaAorIyBzaG91bGQgYmUgYnVpbHQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KKworCitUQVJHRVRfQ09ORklHRElSUyA9IGxpYmliZXJ0eSBsaWJnbG9zcyAkKFNQRUNJQUxfTElCUykgbmV3bGliIGxpYmlvIGxpYnJ4IGxpYnN0ZGMrKyBsaWJnKysgd2luc3VwIG9wY29kZXMgYnNwIGxpYnN0dWIgY3lnbW9uCisKKyMgVGFyZ2V0IGxpYnJhcmllcyBhcmUgcHV0IHVuZGVyIHRoaXMgZGlyZWN0b3J5OgorIyBDaGFuZ2VkIGJ5IGNvbmZpZ3VyZSB0byAkKHRhcmdldF9hbGlhcykgaWYgY3Jvc3MuCitUQVJHRVRfU1VCRElSID0gLgorCisjIFRoaXMgaXMgc2V0IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGNvbmZpZ3VyZS4KK0NPTkZJR19BUkdVTUVOVFMgPSAKKworIyBUaGlzIGlzIHNldCBieSBjb25maWd1cmUgdG8gUkVBTExZX1NFVF9MSUJfUEFUSCBpZiAtLWVuYWJsZS1zaGFyZWQKKyMgd2FzIHVzZWQuCitTRVRfTElCX1BBVEggPQorCisjIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHVzZWQgZm9yIHRoZSBwYXRoIHRvCisjIHRoZSBsaWJyYXJpZXMuICBUaGlzIG1heSBiZSBjaGFuZ2VkIGJ5IGNvbmZpZ3VyZS5pbi4KK1JQQVRIX0VOVlZBUiA9IExEX0xJQlJBUllfUEFUSAorCisjIGNvbmZpZ3VyZS5pbiBzZXRzIFNFVF9MSUJfUEFUSCB0byB0aGlzIGlmIC0tZW5hYmxlLXNoYXJlZCB3YXMgdXNlZC4KK1JFQUxMWV9TRVRfTElCX1BBVEggPSBcCisgIGlmIFsgeCIkJCQoUlBBVEhfRU5WVkFSKSIgIT0geCBdOyB0aGVuIFwKKyAgICAkKFJQQVRIX0VOVlZBUik9JCRyL2JmZDokJHIvb3Bjb2RlczokJCQoUlBBVEhfRU5WVkFSKTsgXAorICBlbHNlIFwKKyAgICAkKFJQQVRIX0VOVlZBUik9JCRyL2JmZDokJHIvb3Bjb2RlczsgXAorICBmaTsgXAorICBleHBvcnQgJChSUEFUSF9FTlZWQVIpOworCitBTEwgPSBhbGwubm9ybWFsCitJTlNUQUxMX1RBUkdFVCA9IGluc3RhbGxkaXJzIFwKKwlpbnN0YWxsLWdjYyBcCisJJChJTlNUQUxMX01PRFVMRVMpIFwKKwkkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpIFwKKwkkKElOU1RBTExfWDExX01PRFVMRVMpIFwKKwkkKElOU1RBTExfRE9TUkVMKQorCitJTlNUQUxMX1RBUkdFVF9DUk9TUyA9IGluc3RhbGxkaXJzIFwKKwlpbnN0YWxsLWdjYy1jcm9zcyBcCisJJChJTlNUQUxMX01PRFVMRVMpIFwKKwkkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpIFwKKwkkKElOU1RBTExfWDExX01PRFVMRVMpIFwKKwkkKElOU1RBTExfRE9TUkVMKQorCitDQ19GT1JfVEFSR0VUID0gYCBcCisgIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKKyAgICBpZiBbIC1mICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCisgICAgICBjYXNlICIkKHRhcmdldF9jYW5vbmljYWwpIiBpbiBcCisgICAgICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopIFwKKyAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliLyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKKyAgICAgICAgICA7OyBcCisgICAgICAgICopIFwKKyAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAorCSAgOzsgXAorICAgICAgZXNhYyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvOyBcCisgICAgZmk7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDQyk7IFwKKyAgICBlbHNlIFwKKyAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGdjYyB8IHNlZCAtZSAncy94L3gvJyAkJHQ7IFwKKyAgICBmaTsgXAorICBmaWAKKworIyBJZiBDQ19GT1JfVEFSR0VUIGlzIG5vdCBvdmVycmlkZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiB0aGlzCisjIHZhcmlhYmxlIGlzIHBhc3NlZCBkb3duIHRvIHRoZSBnY2MgTWFrZWZpbGUsIHdoZXJlIGl0IGlzIHVzZWQgdG8KKyMgYnVpbGQgbGliZ2NjMi5hLiAgV2UgZGVmaW5lIGl0IGhlcmUgc28gdGhhdCBpdCBjYW4gaXRzZWxmIGJlCisjIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KK0dDQ19GT1JfVEFSR0VUID0gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8KKworQ0hJTExfRk9SX1RBUkdFVCA9IGAgXAorICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCisgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtTCQkci9nY2MvY2gvcnVudGltZS87IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDQyk7IFwKKyAgICBlbHNlIFwKKyAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGdjYyB8IHNlZCAtZSAncy94L3gvJyAkJHQ7IFwKKyAgICBmaTsgXAorICBmaWAKKworQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAorICAgIGlmIFsgLWYgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKKyAgICAgIGNhc2UgIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIGluIFwKKyAgICAgICAgaVszNDU2XTg2LSotY3lnd2luKikgXAorICAgICAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUIkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvIC1MJCRyLyQoVEFSR0VUX1NVQkRJUikvd2luc3VwIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy93aW5zdXAvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4gLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbjMyIC1ub3N0ZGluYzsgXAorICAgICAgICAgIDs7IFwKKyAgICAgICAgKikgXAorICAgICAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCisJICA7OyBcCisgICAgICBlc2FjIFwKKyAgICBlbHNlIFwKKyAgICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy87IFwKKyAgICBmaTsgXAorICBlbHNlIFwKKyAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAorICAgICAgZWNobyAkKENYWCk7IFwKKyAgICBlbHNlIFwKKyAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGMrKyB8IHNlZCAtZSAncy94L3gvJyAkJHQ7IFwKKyAgICBmaTsgXAorICBmaWAKKworQVNfRk9SX1RBUkdFVCA9IGAgXAorICBpZiBbIC1mICQkci9nYXMvYXMtbmV3IF0gOyB0aGVuIFwKKyAgICBlY2hvICQkci9nYXMvYXMtbmV3IDsgXAorICBlbHNlIFwKKyAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAorICAgICAgZWNobyAkKEFTKTsgXAorICAgIGVsc2UgXAorICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGFzIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKKyAgICBmaTsgXAorICBmaWAKKworTERfRk9SX1RBUkdFVCA9IGAgXAorICBpZiBbIC1mICQkci9sZC9sZC1uZXcgXSA7IHRoZW4gXAorICAgIGVjaG8gJCRyL2xkL2xkLW5ldyA7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChMRCk7IFwKKyAgICBlbHNlIFwKKyAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBsZCB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCisgICAgZmk7IFwKKyAgZmlgCisKK0RMTFRPT0xfRk9SX1RBUkdFVCA9IGAgXAorICBpZiBbIC1mICQkci9iaW51dGlscy9kbGx0b29sIF0gOyB0aGVuIFwKKyAgICBlY2hvICQkci9iaW51dGlscy9kbGx0b29sIDsgXAorICBlbHNlIFwKKyAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAorICAgICAgZWNobyAkKERMTFRPT0wpOyBcCisgICAgZWxzZSBcCisgICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZGxsdG9vbCB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCisgICAgZmk7IFwKKyAgZmlgCisKK1dJTkRSRVNfRk9SX1RBUkdFVCA9IGAgXAorICBpZiBbIC1mICQkci9iaW51dGlscy93aW5kcmVzIF0gOyB0aGVuIFwKKyAgICBlY2hvICQkci9iaW51dGlscy93aW5kcmVzIDsgXAorICBlbHNlIFwKKyAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAorICAgICAgZWNobyAkKFdJTkRSRVMpOyBcCisgICAgZWxzZSBcCisgICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gd2luZHJlcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCisgICAgZmk7IFwKKyAgZmlgCisKK0FSX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvYmludXRpbHMvYXIgXSA7IHRoZW4gXAorICAgIGVjaG8gJCRyL2JpbnV0aWxzL2FyIDsgXAorICBlbHNlIFwKKyAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAorICAgICAgZWNobyAkKEFSKTsgXAorICAgIGVsc2UgXAorICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGFyIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKKyAgICBmaTsgXAorICBmaWAKKworUkFOTElCX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvYmludXRpbHMvcmFubGliIF0gOyB0aGVuIFwKKyAgICBlY2hvICQkci9iaW51dGlscy9yYW5saWIgOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCisgICAgICBlY2hvICQoUkFOTElCKTsgXAorICAgIGVsc2UgXAorICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHJhbmxpYiB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCisgICAgZmk7IFwKKyAgZmlgCisKK05NX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvYmludXRpbHMvbm0tbmV3IF0gOyB0aGVuIFwKKyAgICBlY2hvICQkci9iaW51dGlscy9ubS1uZXcgOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCisgICAgICBlY2hvICQoTk0pOyBcCisgICAgZWxzZSBcCisgICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbm0gfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAorICAgIGZpOyBcCisgIGZpYAorCisjIFRoZSBmaXJzdCBydWxlIGluIHRoZSBmaWxlIGhhZCBiZXR0ZXIgYmUgdGhpcyBvbmUuICBEb24ndCBwdXQgYW55IGFib3ZlIGl0LgorIyBUaGlzIGxpdmVzIGhlcmUgdG8gYWxsb3cgbWFrZWZpbGUgZnJhZ21lbnRzIHRvIGNvbnRhaW4gZGVwZW5kZW5jaWVzLgorYWxsOiBhbGwubm9ybWFsCisuUEhPTlk6IGFsbAorCisjIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbmZpZy9tdC0qLgorIyBUaGUgX1RBUkdFVF8gaXMgYmVjYXVzZSB0aGV5J3JlIHNwZWNpZmllZCBpbiBtdC1mb28uCisjIFRoZSBfSE9TVF8gaXMgYmVjYXVzZSB0aGV5J3JlIHByb2dyYW1zIHRoYXQgcnVuIG9uIHRoZSBob3N0LgorRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMgPQorRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTID0KK0VYVFJBX1RBUkdFVF9IT1NUX0NIRUNLX01PRFVMRVMgPQorCisjIyMjIGhvc3QgYW5kIHRhcmdldCBzcGVjaWZpYyBtYWtlZmlsZSBmcmFnbWVudHMgY29tZSBpbiBoZXJlLgorIyMjCisKKyMgRmxhZ3MgdG8gcGFzcyBkb3duIHRvIGFsbCBzdWItbWFrZXMuCisjIFBsZWFzZSBrZWVwIHRoZXNlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KK0JBU0VfRkxBR1NfVE9fUEFTUyA9IFwKKwkiQVJfRkxBR1M9JChBUl9GTEFHUykiIFwKKwkiQVJfRk9SX1RBUkdFVD0kKEFSX0ZPUl9UQVJHRVQpIiBcCisJIkFTX0ZPUl9UQVJHRVQ9JChBU19GT1JfVEFSR0VUKSIgXAorCSJCSVNPTj0kKEJJU09OKSIgXAorCSJDQ19GT1JfQlVJTEQ9JChDQ19GT1JfQlVJTEQpIiBcCisJIkNDX0ZPUl9UQVJHRVQ9JChDQ19GT1JfVEFSR0VUKSIgXAorCSJDRkxBR1M9JChDRkxBR1MpIiBcCisJIkNGTEFHU19GT1JfVEFSR0VUPSQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIiBcCisJIkNISUxMRkxBR1M9JChDSElMTEZMQUdTKSIgXAorCSJDSElMTF9GT1JfVEFSR0VUPSQoQ0hJTExfRk9SX1RBUkdFVCkiIFwKKwkiQ0hJTExfTElCPSQoQ0hJTExfTElCKSIgXAorCSJDWFhfRk9SX0JVSUxEPSQoQ1hYX0ZPUl9CVUlMRCkiIFwKKwkiQ1hYRkxBR1M9JChDWFhGTEFHUykiIFwKKwkiQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKENYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCisJIkNYWF9GT1JfVEFSR0VUPSQoQ1hYX0ZPUl9UQVJHRVQpIiBcCisJIkRMTFRPT0xfRk9SX1RBUkdFVD0kKERMTFRPT0xfRk9SX1RBUkdFVCkiIFwKKwkiSU5TVEFMTD0kKElOU1RBTEwpIiBcCisJIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKKwkiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAorCSJJTlNUQUxMX1NDUklQVD0kKElOU1RBTExfU0NSSVBUKSIgXAorCSJMREZMQUdTPSQoTERGTEFHUykiIFwKKwkiTEVYPSQoTEVYKSIgXAorCSJMRF9GT1JfVEFSR0VUPSQoTERfRk9SX1RBUkdFVCkiIFwKKwkiTElCQ0ZMQUdTPSQoTElCQ0ZMQUdTKSIgXAorCSJMSUJDRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNGTEFHU19GT1JfVEFSR0VUKSIgXAorCSJMSUJDWFhGTEFHUz0kKExJQkNYWEZMQUdTKSIgXAorCSJMSUJDWFhGTEFHU19GT1JfVEFSR0VUPSQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCkiIFwKKwkiTTQ9JChNNCkiIFwKKwkiTUFLRT0kKE1BS0UpIiBcCisJIk1BS0VJTkZPPSQoTUFLRUlORk8pICQoTUFLRUlORk9GTEFHUykiIFwKKwkiTk1fRk9SX1RBUkdFVD0kKE5NX0ZPUl9UQVJHRVQpIiBcCisJIlJBTkxJQl9GT1JfVEFSR0VUPSQoUkFOTElCX0ZPUl9UQVJHRVQpIiBcCisJIlJQQVRIX0VOVlZBUj0kKFJQQVRIX0VOVlZBUikiIFwKKwkiU0hFTEw9JChTSEVMTCkiIFwKKwkiRVhQRUNUPSQoRVhQRUNUKSIgXAorCSJSVU5URVNUPSQoUlVOVEVTVCkiIFwKKwkiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIgXAorCSJUQVJHRVRfU1VCRElSPSQoVEFSR0VUX1NVQkRJUikiIFwKKwkiV0lORFJFU19GT1JfVEFSR0VUPSQoV0lORFJFU19GT1JfVEFSR0VUKSIgXAorCSJZQUNDPSQoWUFDQykiIFwKKwkiYmluZGlyPSQoYmluZGlyKSIgXAorCSJkYXRhZGlyPSQoZGF0YWRpcikiIFwKKwkiZXhlY19wcmVmaXg9JChleGVjX3ByZWZpeCkiIFwKKwkiaW5jbHVkZWRpcj0kKGluY2x1ZGVkaXIpIiBcCisJImluZm9kaXI9JChpbmZvZGlyKSIgXAorCSJsaWJkaXI9JChsaWJkaXIpIiBcCisJImxpYmV4ZWNkaXI9JChsaWJleGVjZGlyKSIgXAorCSJsaXNwZGlyPSQobGlzcGRpcikiIFwKKwkibG9jYWxzdGF0ZWRpcj0kKGxvY2Fsc3RhdGVkaXIpIiBcCisJIm1hbmRpcj0kKG1hbmRpcikiIFwKKwkib2xkaW5jbHVkZWRpcj0kKG9sZGluY2x1ZGVkaXIpIiBcCisJInByZWZpeD0kKHByZWZpeCkiIFwKKwkic2JpbmRpcj0kKHNiaW5kaXIpIiBcCisJInNoYXJlZHN0YXRlZGlyPSQoc2hhcmVkc3RhdGVkaXIpIiBcCisJInN5c2NvbmZkaXI9JChzeXNjb25mZGlyKSIgXAorCSJ0b29sZGlyPSQodG9vbGRpcikiIFwKKwkiZ3h4X2luY2x1ZGVfZGlyPSQoZ3h4X2luY2x1ZGVfZGlyKSIgXAorCSJnY2NfdmVyc2lvbj0kKGdjY192ZXJzaW9uKSIgXAorCSJnY2NfdmVyc2lvbl90cmlnZ2VyPSQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikiIFwKKwkidGFyZ2V0X2FsaWFzPSQodGFyZ2V0X2FsaWFzKSIgXAorCSJsaWJzdWJkaXI9JChsaWJzdWJkaXIpIgorCisjIEZsYWdzIHRvIHBhc3MgZG93biB0byBtb3N0IHN1Yi1tYWtlcywgaW4gd2hpY2ggd2UncmUgYnVpbGRpbmcgd2l0aAorIyB0aGUgaG9zdCBlbnZpcm9ubWVudC4KKyMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgorRVhUUkFfSE9TVF9GTEFHUyA9IFwKKwknQVI9JChBUiknIFwKKwknQVM9JChBUyknIFwKKwknQ0M9JChDQyknIFwKKwknQ1hYPSQoQ1hYKScgXAorCSdETExUT09MPSQoRExMVE9PTCknIFwKKwknTEQ9JChMRCknIFwKKwknTk09JChOTSknIFwKKwknUkFOTElCPSQoUkFOTElCKScgXAorCSdXSU5EUkVTPSQoV0lORFJFUyknCisKK0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9IT1NUX0ZMQUdTKQorCisjIEZsYWdzIHRoYXQgYXJlIGNvbmNlcm5lZCB3aXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgWDExIGluY2x1ZGUgZmlsZXMKKyMgYW5kIGxpYnJhcnkgZmlsZXMKKyMKKyMgTk9URTogdW50aWwgdGhlIHRvcC1sZXZlbCBpcyBnZXR0aW5nIHRoZSB2YWx1ZXMgdmlhIGF1dG9jb25mLCBpdCBvbmx5CisjIGNhdXNlcyBwcm9ibGVtcyB0byBoYXZlIHRoaXMgdG9wLWxldmVsIE1ha2VmaWxlIG92ZXJyaWRpbmcgdGhlIGF1dG9jb25mLXNldAorIyB2YWx1ZXMgaW4gY2hpbGQgZGlyZWN0b3JpZXMuICBPbmx5IHZhcmlhYmxlcyB0aGF0IGRvbid0IGNvbmZsaWN0IHdpdGgKKyMgYXV0b2NvbmYnZWQgb25lcyBzaG91bGQgYmUgcGFzc2VkIGJ5IFgxMV9GTEFHU19UT19QQVNTIGZvciBub3cuCisjCitYMTFfRkxBR1NfVE9fUEFTUyA9IFwKKwknWDExX0VYVFJBX0NGTEFHUz0kKFgxMV9FWFRSQV9DRkxBR1MpJyBcCisJJ1gxMV9FWFRSQV9MSUJTPSQoWDExX0VYVFJBX0xJQlMpJworCisjIEZsYWdzIHRvIHBhc3MgZG93biB0byBtYWtlcyB3aGljaCBhcmUgYnVpbHQgd2l0aCB0aGUgdGFyZ2V0IGVudmlyb25tZW50LgorIyBUaGUgZG91YmxlICQgZGVjcmVhc2VzIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgbGluZTsgdGhlIHZhcmlhYmxlcworIyBhcmUgc2V0IGluIEJBU0VfRkxBR1NfVE9fUEFTUywgYW5kIHRoZSBzdWItbWFrZSB3aWxsIGV4cGFuZCB0aGVtLgorIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCitFWFRSQV9UQVJHRVRfRkxBR1MgPSBcCisJJ0FSPSQkKEFSX0ZPUl9UQVJHRVQpJyBcCisJJ0FTPSQkKEFTX0ZPUl9UQVJHRVQpJyBcCisJJ0NDPSQkKENDX0ZPUl9UQVJHRVQpJyBcCisJJ0NGTEFHUz0kJChDRkxBR1NfRk9SX1RBUkdFVCknIFwKKwknQ1hYPSQkKENYWF9GT1JfVEFSR0VUKScgXAorCSdDWFhGTEFHUz0kJChDWFhGTEFHU19GT1JfVEFSR0VUKScgXAorCSdETExUT09MPSQkKERMTFRPT0xfRk9SX1RBUkdFVCknIFwKKwknTEQ9JCQoTERfRk9SX1RBUkdFVCknIFwKKwknTElCQ0ZMQUdTPSQkKExJQkNGTEFHU19GT1JfVEFSR0VUKScgXAorCSdMSUJDWFhGTEFHUz0kJChMSUJDWFhGTEFHU19GT1JfVEFSR0VUKScgXAorCSdOTT0kJChOTV9GT1JfVEFSR0VUKScgXAorCSdSQU5MSUI9JCQoUkFOTElCX0ZPUl9UQVJHRVQpJyBcCisJJ1dJTkRSRVM9JCQoV0lORFJFU19GT1JfVEFSR0VUKScKKworVEFSR0VUX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9UQVJHRVRfRkxBR1MpCisKKyMgRmxhZ3MgdG8gcGFzcyBkb3duIHRvIGdjYy4gIGdjYyBidWlsZHMgYSBsaWJyYXJ5LCBsaWJnY2MuYSwgc28gaXQKKyMgdW5mb3J0dW5hdGVseSBuZWVkcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFuZCB0aGUgdGFyZ2V0IGFyIGFuZAorIyByYW5saWIuCisjIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KKyMgVGhlIEhPU1RfKiB2YXJpYWJsZXMgYXJlIGEgc3BlY2lhbCBjYXNlLCB3aGljaCBhcmUgdXNlZCBmb3IgdGhlIGdjYworIyBjcm9zcy1idWlsZGluZyBzY2hlbWUuCitFWFRSQV9HQ0NfRkxBR1MgPSBcCisJJ0FSPSQoQVIpJyBcCisJJ0FTPSQoQVMpJyBcCisJJ0NDPSQoQ0MpJyBcCisJJ0NYWD0kKENYWCknIFwKKwknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCisJJ0hPU1RfQ0M9JChDQ19GT1JfQlVJTEQpJyBcCisJJ0hPU1RfUFJFRklYPSQoSE9TVF9QUkVGSVgpJyBcCisJJ0hPU1RfUFJFRklYXzE9JChIT1NUX1BSRUZJWF8xKScgXAorCSdOTT0kKE5NKScgXAorCSdSQU5MSUI9JChSQU5MSUIpJyBcCisJJ1dJTkRSRVM9JCQoV0lORFJFU19GT1JfVEFSR0VUKScgXAorCSJHQ0NfRk9SX1RBUkdFVD0kKEdDQ19GT1JfVEFSR0VUKSIgXAorCSJgZWNobyAnTEFOR1VBR0VTPSQoTEFOR1VBR0VTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCisJImBlY2hvICdTVE1QX0ZJWFBST1RPPSQoU1RNUF9GSVhQUk9UTyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAorCSJgZWNobyAnTElNSVRTX0hfVEVTVD0kKExJTUlUU19IX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKKwkiYGVjaG8gJ0xJQkdDQzFfVEVTVD0kKExJQkdDQzFfVEVTVCknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAorCSJgZWNobyAnTElCR0NDMl9DRkxBR1M9JChMSUJHQ0MyX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAorCSJgZWNobyAnTElCR0NDMl9ERUJVR19DRkxBR1M9JChMSUJHQ0MyX0RFQlVHX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAorCSJgZWNobyAnTElCR0NDMl9JTkNMVURFUz0kKExJQkdDQzJfSU5DTFVERVMpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKKwkiYGVjaG8gJ0VOUVVJUkU9JChFTlFVSVJFKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCisJImBlY2hvICdCT09UX0NGTEFHUz0kKEJPT1RfQ0ZMQUdTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIgorCitHQ0NfRkxBR1NfVE9fUEFTUyA9ICQoQkFTRV9GTEFHU19UT19QQVNTKSAkKEVYVFJBX0dDQ19GTEFHUykKKworIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAorIyB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgorQUxMX01PRFVMRVMgPSBcCisJYWxsLWFwYWNoZSBcCisJYWxsLWFzaCBcCisJYWxsLWF1dG9jb25mIFwKKwlhbGwtYXV0b21ha2UgXAorCWFsbC1iYXNoIFwKKwlhbGwtYmZkIFwKKwlhbGwtYmludXRpbHMgXAorCWFsbC1iaXNvbiBcCisJYWxsLWJ5YWNjIFwKKwlhbGwtYnppcDIgXAorCWFsbC1jdnNzcmMgXAorCWFsbC1kYiBcCisJYWxsLWRlamFnbnUgXAorCWFsbC1kaWZmIFwKKwlhbGwtZG9zdXRpbHMgXAorCWFsbC1ldGMgXAorCWFsbC1maWxldXRpbHMgXAorCWFsbC1maW5kdXRpbHMgXAorCWFsbC1maW5kIFwKKwlhbGwtZmxleCBcCisJYWxsLWdhcyBcCisJYWxsLWdhd2sgXAorCWFsbC1nZXR0ZXh0IFwKKwlhbGwtZ251c2VydiBcCisJYWxsLWdwcm9mIFwKKwlhbGwtZ3JlcCBcCisJYWxsLWdyZXogXAorCWFsbC1nemlwIFwKKwlhbGwtaGVsbG8gXAorCWFsbC1pbmRlbnQgXAorCWFsbC1pbmV0IFwKKwlhbGwtaW50bCBcCisJYWxsLWlzcGVsbCBcCisJYWxsLWl0Y2wgXAorCWFsbC1sZCBcCisJYWxsLWxpYmd1aSBcCisJYWxsLWxpYmliZXJ0eSBcCisJYWxsLWxpYnRvb2wgXAorCWFsbC1tNCBcCisJYWxsLW1ha2UgXAorCWFsbC1tbWFsbG9jIFwKKwlhbGwtb3Bjb2RlcyBcCisJYWxsLXBhdGNoIFwKKwlhbGwtcGVybCBcCisJYWxsLXBybXMgXAorCWFsbC1yY3MgXAorCWFsbC1yZWFkbGluZSBcCisJYWxsLXJlbGVhc2UgXAorCWFsbC1yZWNvZGUgXAorCWFsbC1zZWQgXAorCWFsbC1zZW5kLXByIFwKKwlhbGwtc2hlbGx1dGlscyBcCisJYWxsLXNpbSBcCisJYWxsLXRhciBcCisJYWxsLXRjbCBcCisJYWxsLXRjbDguMSBcCisJYWxsLXRleGluZm8gXAorCWFsbC10ZXh0dXRpbHMgXAorCWFsbC10Z2FzIFwKKwlhbGwtdGltZSBcCisJYWxsLXV1ZGVjb2RlIFwKKwlhbGwtd2RpZmYgXAorCWFsbC16aXAgXAorCSQoRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVMpCisKKyMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGNoZWNrIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKKyMgY29tcGlsZWQgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KKyMKKyMgVGhlIGxpc3QgaXMgaW4gdHdvIHBhcnRzLiAgVGhlIGZpcnN0IGxpc3RzIHRob3NlIHRvb2xzIHdoaWNoCisjIGFyZSB0ZXN0ZWQgYXMgcGFydCBvZiB0aGUgaG9zdCdzIG5hdGl2ZSB0b29sLWNoYWluLCBhbmQgbm90CisjIHRlc3RlZCBpbiBhIGNyb3NzIGNvbmZpZ3VyYXRpb24uCitOQVRJVkVfQ0hFQ0tfTU9EVUxFUyA9IFwKKwljaGVjay1iaXNvbiBcCisJY2hlY2stYnlhY2MgXAorCWNoZWNrLWZsZXggXAorCWNoZWNrLXppcAorCitDUk9TU19DSEVDS19NT0RVTEVTID0gXAorCWNoZWNrLWFwYWNoZSBcCisJY2hlY2stYXNoIFwKKwljaGVjay1hdXRvY29uZiBcCisJY2hlY2stYXV0b21ha2UgXAorCWNoZWNrLWJhc2ggXAorCWNoZWNrLWJmZCBcCisJY2hlY2stYmludXRpbHMgXAorCWNoZWNrLWJ6aXAyIFwKKwljaGVjay1jdnNzcmMgXAorCWNoZWNrLWRiIFwKKwljaGVjay1kZWphZ251IFwKKwljaGVjay1kaWZmIFwKKwljaGVjay1ldGMgXAorCWNoZWNrLWZpbGV1dGlscyBcCisJY2hlY2stZmluZHV0aWxzIFwKKwljaGVjay1maW5kIFwKKwljaGVjay1nYXMgXAorCWNoZWNrLWdhd2sgXAorCWNoZWNrLWdldHRleHQgXAorCWNoZWNrLWdudXNlcnYgXAorCWNoZWNrLWdwcm9mIFwKKwljaGVjay1ncmVwIFwKKwljaGVjay1nemlwIFwKKwljaGVjay1oZWxsbyBcCisJY2hlY2staW5kZW50IFwKKwljaGVjay1pbmV0IFwKKwljaGVjay1pbnRsIFwKKwljaGVjay1pc3BlbGwgXAorCWNoZWNrLWl0Y2wgXAorCWNoZWNrLWxkIFwKKwljaGVjay1saWJndWkgXAorCWNoZWNrLWxpYmliZXJ0eSBcCisJY2hlY2stbGlidG9vbCBcCisJY2hlY2stbTQgXAorCWNoZWNrLW1ha2UgXAorCWNoZWNrLW1tY2hlY2tvYyBcCisJY2hlY2stb3Bjb2RlcyBcCisJY2hlY2stcGF0Y2ggXAorCWNoZWNrLXBlcmwgXAorCWNoZWNrLXBybXMgXAorCWNoZWNrLXJjcyBcCisJY2hlY2stcmVhZGxpbmUgXAorCWNoZWNrLXJlY29kZSBcCisJY2hlY2stc2VkIFwKKwljaGVjay1zZW5kLXByIFwKKwljaGVjay1zaGVsbHV0aWxzIFwKKwljaGVjay1zaW0gXAorCWNoZWNrLXRhciBcCisJY2hlY2stdGNsIFwKKwljaGVjay10ZXhpbmZvIFwKKwljaGVjay10ZXh0dXRpbHMgXAorCWNoZWNrLXRnYXMgXAorCWNoZWNrLXRpbWUgXAorCWNoZWNrLXV1ZGVjb2RlIFwKKwljaGVjay13ZGlmZiBcCisJJChFWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTKQorCitDSEVDS19NT0RVTEVTPSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKKworIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgaW5zdGFsbCB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCisjIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCisjIFdlIHB1dCBpbnN0YWxsLW9wY29kZXMgYmVmb3JlIGluc3RhbGwtYmludXRpbHMgYmVjYXVzZSB0aGUgaW5zdGFsbGVkCisjIGJpbnV0aWxzIG1pZ2h0IGJlIG9uIFBBVEgsIGFuZCB0aGV5IG1pZ2h0IG5lZWQgdGhlIHNoYXJlZCBvcGNvZGVzCisjIGxpYnJhcnkuCisjIFdlIHB1dCBpbnN0YWxsLXRjbCBiZWZvcmUgaW5zdGFsbC1pdGNsIGJlY2F1c2UgaXRjbCB3YW50cyB0byBydW4gYQorIyBwcm9ncmFtIG9uIGluc3RhbGxhdGlvbiB3aGljaCB1c2VzIHRoZSBUY2wgbGlicmFyaWVzLgorSU5TVEFMTF9NT0RVTEVTID0gXAorCWluc3RhbGwtYXBhY2hlIFwKKwlpbnN0YWxsLWFzaCBcCisJaW5zdGFsbC1hdXRvY29uZiBcCisJaW5zdGFsbC1hdXRvbWFrZSBcCisJaW5zdGFsbC1iYXNoIFwKKwlpbnN0YWxsLWJmZCBcCisJaW5zdGFsbC1iemlwMiBcCisJaW5zdGFsbC1vcGNvZGVzIFwKKwlpbnN0YWxsLWJpbnV0aWxzIFwKKwlpbnN0YWxsLWJpc29uIFwKKwlpbnN0YWxsLWJ5YWNjIFwKKwlpbnN0YWxsLWN2c3NyYyBcCisJaW5zdGFsbC1kYiBcCisJaW5zdGFsbC1kZWphZ251IFwKKwlpbnN0YWxsLWRpZmYgXAorCWluc3RhbGwtZG9zdXRpbHMgXAorCWluc3RhbGwtZXRjIFwKKwlpbnN0YWxsLWZpbGV1dGlscyBcCisJaW5zdGFsbC1maW5kdXRpbHMgXAorCWluc3RhbGwtZmluZCBcCisJaW5zdGFsbC1mbGV4IFwKKwlpbnN0YWxsLWdhcyBcCisJaW5zdGFsbC1nYXdrIFwKKwlpbnN0YWxsLWdldHRleHQgXAorCWluc3RhbGwtZ251c2VydiBcCisJaW5zdGFsbC1ncHJvZiBcCisJaW5zdGFsbC1ncmVwIFwKKwlpbnN0YWxsLWdyZXogXAorCWluc3RhbGwtZ3ppcCBcCisJaW5zdGFsbC1oZWxsbyBcCisJaW5zdGFsbC1pbmRlbnQgXAorCWluc3RhbGwtaW5ldCBcCisJaW5zdGFsbC1pbnRsIFwKKwlpbnN0YWxsLWlzcGVsbCBcCisJaW5zdGFsbC10Y2wgXAorCWluc3RhbGwtdGNsOC4xIFwKKwlpbnN0YWxsLWl0Y2wgXAorCWluc3RhbGwtbGQgXAorCWluc3RhbGwtbGliZ3VpIFwKKwlpbnN0YWxsLWxpYmliZXJ0eSBcCisJaW5zdGFsbC1saWJ0b29sIFwKKwlpbnN0YWxsLW00IFwKKwlpbnN0YWxsLW1ha2UgXAorCWluc3RhbGwtbW1hbGxvYyBcCisJaW5zdGFsbC1wYXRjaCBcCisJaW5zdGFsbC1wZXJsIFwKKwlpbnN0YWxsLXBybXMgXAorCWluc3RhbGwtcmNzIFwKKwlpbnN0YWxsLXJlYWRsaW5lIFwKKwlpbnN0YWxsLXJlY29kZSBcCisJaW5zdGFsbC1zZWQgXAorCWluc3RhbGwtc2VuZC1wciBcCisJaW5zdGFsbC1zaGVsbHV0aWxzIFwKKwlpbnN0YWxsLXNpbSBcCisJaW5zdGFsbC10YXIgXAorCWluc3RhbGwtdGV4aW5mbyBcCisJaW5zdGFsbC10ZXh0dXRpbHMgXAorCWluc3RhbGwtdGdhcyBcCisJaW5zdGFsbC10aW1lIFwKKwlpbnN0YWxsLXV1ZGVjb2RlIFwKKwlpbnN0YWxsLXdkaWZmIFwKKwlpbnN0YWxsLXppcCBcCisJJChFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMpCisKKyMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKKyMgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCitBTExfWDExX01PRFVMRVMgPSBcCisJYWxsLWVtYWNzIFwKKwlhbGwtZW1hY3MxOSBcCisJYWxsLWdkYiBcCisJYWxsLWV4cGVjdCBcCisJYWxsLWdhc2ggXAorCWFsbC1ndWlsZSBcCisJYWxsLXRjbFggXAorCWFsbC10ayBcCisJYWxsLXRrOC4xIFwKKwlhbGwtdGl4CisKKyMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGNoZWNrIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUKKyMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCitDSEVDS19YMTFfTU9EVUxFUyA9IFwKKwljaGVjay1lbWFjcyBcCisJY2hlY2stZ2RiIFwKKwljaGVjay1ndWlsZSBcCisJY2hlY2stZXhwZWN0IFwKKwljaGVjay1nYXNoIFwKKwljaGVjay10Y2xYIFwKKwljaGVjay10ayBcCisJY2hlY2stdGl4CisKKyMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQorIyBjb21waWxlZCB1c2luZyAkKFgxMV9GTEFHU19UT19QQVNTKS4KK0lOU1RBTExfWDExX01PRFVMRVMgPSBcCisJaW5zdGFsbC1lbWFjcyBcCisJaW5zdGFsbC1lbWFjczE5IFwKKwlpbnN0YWxsLWdkYiBcCisJaW5zdGFsbC1ndWlsZSBcCisJaW5zdGFsbC1leHBlY3QgXAorCWluc3RhbGwtZ2FzaCBcCisJaW5zdGFsbC10Y2xYIFwKKwlpbnN0YWxsLXRrIFwKKwlpbnN0YWxsLXRrOC4xIFwKKwlpbnN0YWxsLXRpeAorCisjIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCisjIHVzaW5nICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpLgorQUxMX1RBUkdFVF9NT0RVTEVTID0gXAorCWFsbC10YXJnZXQtbGliaW8gXAorCWFsbC10YXJnZXQtbGlic3RkYysrIFwKKwlhbGwtdGFyZ2V0LWxpYnJ4IFwKKwlhbGwtdGFyZ2V0LWxpYmcrKyBcCisJYWxsLXRhcmdldC1uZXdsaWIgXAorCWFsbC10YXJnZXQtbGlidGVybWNhcCBcCisJYWxsLXRhcmdldC13aW5zdXAgXAorCWFsbC10YXJnZXQtbGliZ2xvc3MgXAorCWFsbC10YXJnZXQtbGliaWJlcnR5IFwKKwlhbGwtdGFyZ2V0LWdwZXJmIFwKKwlhbGwtdGFyZ2V0LWV4YW1wbGVzIFwKKwlhbGwtdGFyZ2V0LWxpYnN0dWIgXAorCWFsbC10YXJnZXQtYnNwIFwKKwlhbGwtdGFyZ2V0LWN5Z21vbgorCisjIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjb25maWd1cmUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoCisjIGFyZSBjb21waWxlZCB1c2luZyB0aGUgdGFyZ2V0IHRvb2xzLgorQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTID0gXAorCWNvbmZpZ3VyZS10YXJnZXQtbGliaW8gXAorCWNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIFwKKwljb25maWd1cmUtdGFyZ2V0LWxpYnJ4IFwKKwljb25maWd1cmUtdGFyZ2V0LWxpYmcrKyBcCisJY29uZmlndXJlLXRhcmdldC1uZXdsaWIgXAorCWNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBcCisJY29uZmlndXJlLXRhcmdldC13aW5zdXAgXAorCWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgXAorCWNvbmZpZ3VyZS10YXJnZXQtbGliaWJlcnR5IFwKKwljb25maWd1cmUtdGFyZ2V0LWdwZXJmIFwKKwljb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzIFwKKwljb25maWd1cmUtdGFyZ2V0LWxpYnN0dWIgXAorCWNvbmZpZ3VyZS10YXJnZXQtYnNwIFwKKwljb25maWd1cmUtdGFyZ2V0LWN5Z21vbgorCisjIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCisjIGNvbXBpbGVkIHVzaW5nICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpLgorQ0hFQ0tfVEFSR0VUX01PRFVMRVMgPSBcCisJY2hlY2stdGFyZ2V0LWxpYmlvIFwKKwljaGVjay10YXJnZXQtbGlic3RkYysrIFwKKwljaGVjay10YXJnZXQtbGliZysrIFwKKwljaGVjay10YXJnZXQtbmV3bGliIFwKKwljaGVjay10YXJnZXQtd2luc3VwIFwKKwljaGVjay10YXJnZXQtbGliaWJlcnR5IFwKKwljaGVjay10YXJnZXQtZ3BlcmYKKworIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgaW5zdGFsbCB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCisjIGNvbXBpbGVkIHVzaW5nICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpLgorSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKKwlpbnN0YWxsLXRhcmdldC1saWJpbyBcCisJaW5zdGFsbC10YXJnZXQtbGlic3RkYysrIFwKKwlpbnN0YWxsLXRhcmdldC1saWJnKysgXAorCWluc3RhbGwtdGFyZ2V0LW5ld2xpYiBcCisJaW5zdGFsbC10YXJnZXQtbGlidGVybWNhcCBcCisJaW5zdGFsbC10YXJnZXQtd2luc3VwIFwKKwlpbnN0YWxsLXRhcmdldC1saWJnbG9zcyBcCisJaW5zdGFsbC10YXJnZXQtbGliaWJlcnR5IFwKKwlpbnN0YWxsLXRhcmdldC1ic3AgXAorCWluc3RhbGwtdGFyZ2V0LWdwZXJmCisKKyMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIHdoaWNoIHdlIGNhbiBkbyBhIGNsZWFuLXt0YXJnZXR9LgorQ0xFQU5fTU9EVUxFUyA9IFwKKwljbGVhbi1hcGFjaGUgXAorCWNsZWFuLWFzaCBcCisJY2xlYW4tYXV0b2NvbmYgXAorCWNsZWFuLWF1dG9tYWtlIFwKKwljbGVhbi1iYXNoIFwKKwljbGVhbi1iZmQgXAorCWNsZWFuLWJpbnV0aWxzIFwKKwljbGVhbi1iaXNvbiBcCisJY2xlYW4tYnlhY2MgXAorCWNsZWFuLWJ6aXAyIFwKKwljbGVhbi1jdnNzcmMgXAorCWNsZWFuLWRiIFwKKwljbGVhbi1kZWphZ251IFwKKwljbGVhbi1kaWZmIFwKKwljbGVhbi1kb3N1dGlscyBcCisJY2xlYW4tZXRjIFwKKwljbGVhbi1maWxldXRpbHMgXAorCWNsZWFuLWZpbmR1dGlscyBcCisJY2xlYW4tZmluZCBcCisJY2xlYW4tZmxleCBcCisJY2xlYW4tZ2FzIFwKKwljbGVhbi1nYXdrIFwKKwljbGVhbi1nZXR0ZXh0IFwKKwljbGVhbi1nbnVzZXJ2IFwKKwljbGVhbi1ncHJvZiBcCisJY2xlYW4tZ3JlcCBcCisJY2xlYW4tZ3JleiBcCisJY2xlYW4tZ3ppcCBcCisJY2xlYW4taGVsbG8gXAorCWNsZWFuLWluZGVudCBcCisJY2xlYW4taW5ldCBcCisJY2xlYW4taW50bCBcCisJY2xlYW4taXNwZWxsIFwKKwljbGVhbi1pdGNsIFwKKwljbGVhbi1sZCBcCisJY2xlYW4tbGliZ3VpIFwKKwljbGVhbi1saWJpYmVydHkgXAorCWNsZWFuLWxpYnRvb2wgXAorCWNsZWFuLW00IFwKKwljbGVhbi1tYWtlIFwKKwljbGVhbi1tbWFsbG9jIFwKKwljbGVhbi1vcGNvZGVzIFwKKwljbGVhbi1wYXRjaCBcCisJY2xlYW4tcGVybCBcCisJY2xlYW4tcHJtcyBcCisJY2xlYW4tcmNzIFwKKwljbGVhbi1yZWFkbGluZSBcCisJY2xlYW4tcmVsZWFzZSBcCisJY2xlYW4tcmVjb2RlIFwKKwljbGVhbi1zZWQgXAorCWNsZWFuLXNlbmQtcHIgXAorCWNsZWFuLXNoZWxsdXRpbHMgXAorCWNsZWFuLXNpbSBcCisJY2xlYW4tdGFyIFwKKwljbGVhbi10Y2wgXAorCWNsZWFuLXRleGluZm8gXAorCWNsZWFuLXRleHR1dGlscyBcCisJY2xlYW4tdGdhcyBcCisJY2xlYW4tdGltZSBcCisJY2xlYW4tdXVkZWNvZGUgXAorCWNsZWFuLXdkaWZmIFwKKwljbGVhbi16aXAKKworIyBBbGwgb2YgdGhlIHRhcmdldCBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKK0NMRUFOX1RBUkdFVF9NT0RVTEVTID0gXAorCWNsZWFuLXRhcmdldC1saWJpbyBcCisJY2xlYW4tdGFyZ2V0LWxpYnN0ZGMrKyBcCisJY2xlYW4tdGFyZ2V0LWxpYnJ4IFwKKwljbGVhbi10YXJnZXQtbGliZysrIFwKKwljbGVhbi10YXJnZXQtbmV3bGliIFwKKwljbGVhbi10YXJnZXQtd2luc3VwIFwKKwljbGVhbi10YXJnZXQtbGliZ2xvc3MgXAorCWNsZWFuLXRhcmdldC1saWJpYmVydHkgXAorCWNsZWFuLXRhcmdldC1ncGVyZiBcCisJY2xlYW4tdGFyZ2V0LWV4YW1wbGVzIFwKKwljbGVhbi10YXJnZXQtbGlic3R1YiBcCisJY2xlYW4tdGFyZ2V0LWJzcCBcCisJY2xlYW4tdGFyZ2V0LWN5Z21vbgorCisjIEFsbCBvZiB0aGUgeDExIG1vZHVsZXMgdGhhdCBjYW4gYmUgY2xlYW5lZAorQ0xFQU5fWDExX01PRFVMRVMgPSBcCisJY2xlYW4tZW1hY3MgXAorCWNsZWFuLWVtYWNzMTkgXAorCWNsZWFuLWdkYiBcCisJY2xlYW4tZXhwZWN0IFwKKwljbGVhbi1nYXNoIFwKKwljbGVhbi1ndWlsZSBcCisJY2xlYW4tdGNsWCBcCisJY2xlYW4tdGsgXAorCWNsZWFuLXRpeAorCisjIFRoZSB0YXJnZXQgYnVpbHQgZm9yIGEgbmF0aXZlIGJ1aWxkLgorLlBIT05ZOiBhbGwubm9ybWFsCithbGwubm9ybWFsOiBcCisJJChBTExfTU9EVUxFUykgXAorCSQoQUxMX1gxMV9NT0RVTEVTKSBcCisJJChBTExfVEFSR0VUX01PRFVMRVMpIFwKKwlhbGwtZ2NjCisKKyMgRG8gYSB0YXJnZXQgZm9yIGFsbCB0aGUgc3ViZGlyZWN0b3JpZXMuICBBIGBgbWFrZSBkby1YJycgd2lsbCBkbyBhCisjIGBgbWFrZSBYJycgaW4gYWxsIHN1YmRpcmVjdG9yaWVzIChiZWNhdXNlLCBpbiBnZW5lcmFsLCB0aGVyZSBpcyBhCisjIGRlcGVuZGVuY3kgKGJlbG93KSBvZiBYIHVwb24gZG8tWCwgYSBgYG1ha2UgWCcnIHdpbGwgYWxzbyBkbyB0aGlzLAorIyBidXQgaXQgbWF5IGRvIGFkZGl0aW9uYWwgd29yayBhcyB3ZWxsKS4KKyMgVGhpcyB0YXJnZXQgZW5zdXJlcyB0aGF0ICQoQkFTRV9GTEFHU19UT19QQVNTKSBhcHBlYXJzIG9ubHkgb25jZSwKKyMgYmVjYXVzZSBpdCBpcyBzbyBsYXJnZSB0aGF0IGl0IGNhbiBlYXNpbHkgb3ZlcmZsb3cgdGhlIGNvbW1hbmQgbGluZQorIyBsZW5ndGggbGltaXQgb24gc29tZSBzeXN0ZW1zLgorRE9fWCA9IFwKKwlkby1jbGVhbiBcCisJZG8tZGlzdGNsZWFuIFwKKwlkby1kdmkgXAorCWRvLWluZm8gXAorCWRvLWluc3RhbGwtaW5mbyBcCisJZG8taW5zdGFsbGNoZWNrIFwKKwlkby1tb3N0bHljbGVhbiBcCisJZG8tbWFpbnRhaW5lci1jbGVhbiBcCisJZG8tVEFHUworLlBIT05ZOiAkKERPX1gpCiskKERPX1gpOgorCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKKwlyPWBwd2RgOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkkKFNFVF9MSUJfUEFUSCkgXAorCWZvciBpIGluICQoU1VCRElSUykgLWR1bW15LTsgZG8gXAorCSAgaWYgWyAtZiAuLyQkaS9NYWtlZmlsZSBdOyB0aGVuIFwKKwkgICAgY2FzZSAkJGkgaW4gXAorCSAgICBnY2MpIFwKKwkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0dDQ19GTEFHUyk7IGRvIFwKKwkJZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInfCJgOyBcCisJICAgICAgZG9uZTsgXAorCSAgICAgIDs7IFwKKwkgICAgKikgXAorCSAgICAgIGZvciBmbGFnIGluICQoRVhUUkFfSE9TVF9GTEFHUyk7IGRvIFwKKwkJZXZhbCBgZWNobyAiJCRmbGFnIiB8IHNlZCAtZSAic3xeXChbXj1dKlwpPVwoLipcKXxcMT0nXDInfCJgOyBcCisJICAgICAgZG9uZTsgXAorCSAgICAgIDs7IFwKKwkgICAgZXNhYyA7IFwKKwkgICAgZXhwb3J0IEFSIEFTIENDIENYWCBMRCBOTSBSQU5MSUIgRExMVE9PTCBXSU5EUkVTOyBcCisJICAgIGlmIChjZCAuLyQkaTsgXAorCSAgICAgICAgJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgIkFSPSQke0FSfSIgIkFTPSQke0FTfSIgXAorCQkJIkNDPSQke0NDfSIgIkNYWD0kJHtDWFh9IiAiTEQ9JCR7TER9IiAiTk09JCR7Tk19IiBcCisJCQkiUkFOTElCPSQke1JBTkxJQn0iIFwKKwkJCSJETExUT09MPSQke0RMTFRPT0x9IiAiV0lORFJFUz0kJHtXSU5EUkVTfSIgXAorCQkJJCR7dGFyZ2V0fSk7IFwKKwkgICAgdGhlbiB0cnVlOyBlbHNlIGV4aXQgMTsgZmk7IFwKKwkgIGVsc2UgdHJ1ZTsgZmk7IFwKKwlkb25lCisJQHRhcmdldD1gZWNobyAkQCB8IHNlZCAtZSAncy9eZG8tLy8nYDsgXAorCXI9YHB3ZGA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAorCSQoU0VUX0xJQl9QQVRIKSBcCisJZm9yIGkgaW4gJChUQVJHRVRfQ09ORklHRElSUykgLWR1bW15LTsgZG8gXAorCSAgaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQkaS9NYWtlZmlsZSBdOyB0aGVuIFwKKwkgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9UQVJHRVRfRkxBR1MpOyBkbyBcCisJCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAorCSAgICBkb25lOyBcCisJICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAorCSAgICBpZiAoY2QgJChUQVJHRVRfU1VCRElSKS8kJGk7IFwKKwkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKKwkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAorCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCisJCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKKwkJCSQke3RhcmdldH0pOyBcCisJICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCisJICBlbHNlIHRydWU7IGZpOyBcCisJZG9uZQorCisjIEhlcmUgYXJlIHRoZSB0YXJnZXRzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGRvLVggdGFyZ2V0cy4KKworLlBIT05ZOiBpbmZvIGluc3RhbGxjaGVjayBkdmkgaW5zdGFsbC1pbmZvCisuUEhPTlk6IGNsZWFuIGRpc3RjbGVhbiBtb3N0bHljbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbgorLlBIT05ZOiBsb2NhbC1jbGVhbiBsb2NhbC1kaXN0Y2xlYW4gbG9jYWwtbWFpbnRhaW5lci1jbGVhbgoraW5mbzogZG8taW5mbworaW5zdGFsbGNoZWNrOiBkby1pbnN0YWxsY2hlY2sKK2R2aTogZG8tZHZpCisKKyMgTWFrZSBzdXJlIG1ha2VpbmZvIGlzIGJ1aWx0IGJlZm9yZSB3ZSBkbyBhIGBtYWtlIGluZm8nLgorZG8taW5mbzogYWxsLXRleGluZm8KKworaW5zdGFsbC1pbmZvOiBkby1pbnN0YWxsLWluZm8gZGlyLmluZm8KKwlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJaWYgWyAtZiBkaXIuaW5mbyBdIDsgdGhlbiBcCisJICAkKElOU1RBTExfREFUQSkgZGlyLmluZm8gJChpbmZvZGlyKS9kaXIuaW5mbyA7IFwKKwllbHNlIHRydWUgOyBmaQorCitsb2NhbC1jbGVhbjoKKwktcm0gLWYgKi5hIFRFTVAgZXJycyBjb3JlICoubyAqfiBcIyogVEFHUyAqLkUgKi5sb2cKKworbG9jYWwtZGlzdGNsZWFuOgorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBtaC1mcmFnIG10LWZyYWcKKwktaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF07IHRoZW4gXAorCSAgcm0gLXJmICQoVEFSR0VUX1NVQkRJUik7IFwKKwllbHNlIHRydWU7IGZpCisKK2xvY2FsLW1haW50YWluZXItY2xlYW46CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisKK2NsZWFuOiBkby1jbGVhbiBsb2NhbC1jbGVhbgorbW9zdGx5Y2xlYW46IGRvLW1vc3RseWNsZWFuIGxvY2FsLWNsZWFuCitkaXN0Y2xlYW46IGRvLWRpc3RjbGVhbiBsb2NhbC1jbGVhbiBsb2NhbC1kaXN0Y2xlYW4KK21haW50YWluZXItY2xlYW46IGxvY2FsLW1haW50YWluZXItY2xlYW4gZG8tbWFpbnRhaW5lci1jbGVhbiBsb2NhbC1jbGVhbiAKK21haW50YWluZXItY2xlYW46IGxvY2FsLWRpc3RjbGVhbgorcmVhbGNsZWFuOiBtYWludGFpbmVyLWNsZWFuCisKKyMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2xlYW4gc3BlY2lmaWMgbW9kdWxlcy4KKy5QSE9OWTogJChDTEVBTl9NT0RVTEVTKSAkKENMRUFOX1gxMV9NT0RVTEVTKSBjbGVhbi1nY2MKKyQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjOgorCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2xlYW4tLy8nYDsgXAorCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAkKFNFVF9MSUJfUEFUSCkgXAorCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBjbGVhbik7IFwKKwllbHNlIFwKKwkgIHRydWU7IFwKKwlmaQorCisuUEhPTlk6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCiskKENMRUFOX1RBUkdFVF9NT0RVTEVTKToKKwlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLXRhcmdldC0vLydgOyBcCisJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0OyBcCisJaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyAkKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNsZWFuKTsgXAorCWVsc2UgXAorCSAgdHJ1ZTsgXAorCWZpCisKK2NsZWFuLXRhcmdldDogJChDTEVBTl9UQVJHRVRfTU9EVUxFUykKKworIyBDaGVjayB0YXJnZXQuCisKKy5QSE9OWTogY2hlY2sKK2NoZWNrOiAkKENIRUNLX01PRFVMRVMpIFwKKwkkKENIRUNLX1RBUkdFVF9NT0RVTEVTKSBcCisJJChDSEVDS19YMTFfTU9EVUxFUykgXAorCWNoZWNrLWdjYworCisjIEF1dG9tYXRlZCByZXBvcnRpbmcgb2YgdGVzdCByZXN1bHRzLgorCit3YXJuaW5nLmxvZzogYnVpbGQubG9nCisJJChzcmNkaXIpL2NvbnRyaWIvd2Fybl9zdW1tYXJ5IGJ1aWxkLmxvZyA+ICRACisKK21haWwtcmVwb3J0LmxvZzoKKwlpZiB0ZXN0IHgnJChCT09UX0NGTEFHUyknICE9IHgnJzsgdGhlbiBcCisJICAgIEJPT1RfQ0ZMQUdTPSckKEJPT1RfQ0ZMQUdTKSc7IGV4cG9ydCBCT09UX0NGTEFHUzsgXAorCWZpOyBcCisJJChzcmNkaXIpL2NvbnRyaWIvdGVzdF9zdW1tYXJ5IC10ID4kQAorCWNobW9kICt4ICRACisJZWNobyBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gc2VuZCBlLW1haWwsIHJ1biAuLyRAIG5vdworCittYWlsLXJlcG9ydC13aXRoLXdhcm5pbmdzLmxvZzogd2FybmluZy5sb2cKKwlpZiB0ZXN0IHgnJChCT09UX0NGTEFHUyknICE9IHgnJzsgdGhlbiBcCisJICAgIEJPT1RfQ0ZMQUdTPSckKEJPT1RfQ0ZMQUdTKSc7IGV4cG9ydCBCT09UX0NGTEFHUzsgXAorCWZpOyBcCisJJChzcmNkaXIpL2NvbnRyaWIvdGVzdF9zdW1tYXJ5IC10IC1pIHdhcm5pbmcubG9nID4kQAorCWNobW9kICt4ICRACisJZWNobyBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gc2VuZCBlLW1haWwsIHJ1biAuLyRAIG5vdworCisjIEluc3RhbGxhdGlvbiB0YXJnZXRzLgorCisuUEhPTlk6IGluc3RhbGwgaW5zdGFsbC1jcm9zcyB1bmluc3RhbGwgc291cmNlLXZhdWx0IGJpbmFyeS12YXVsdCB2YXVsdC1pbnN0YWxsCitpbnN0YWxsOiAkKElOU1RBTExfVEFSR0VUKSAKK2luc3RhbGwtY3Jvc3M6ICQoSU5TVEFMTF9UQVJHRVRfQ1JPU1MpIAorCit1bmluc3RhbGw6CisJQGVjaG8gInRoZSB1bmluc3RhbGwgdGFyZ2V0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB0cmVlIgorCitzb3VyY2UtdmF1bHQ6CisJJChNQUtFKSAtZiAuL3JlbGVhc2UvQnVpbGQtQS1SZWxlYXNlIFwKKwkJaG9zdD0kKGhvc3RfYWxpYXMpIHNvdXJjZS12YXVsdAorCitiaW5hcnktdmF1bHQ6CisJJChNQUtFKSAtZiAuL3JlbGVhc2UvQnVpbGQtQS1SZWxlYXNlIFwKKwkJaG9zdD0kKGhvc3RfYWxpYXMpIHRhcmdldD0kKHRhcmdldF9hbGlhcykKKwordmF1bHQtaW5zdGFsbDoKKwlAaWYgWyAtZiAuL3JlbGVhc2UvdmF1bHQtaW5zdGFsbCBdIDsgdGhlbiBcCisJICAuL3JlbGVhc2UvdmF1bHQtaW5zdGFsbCAkKGhvc3RfYWxpYXMpICQodGFyZ2V0X2FsaWFzKSA7IFwKKwllbHNlIFwKKwkgIHRydWUgOyBcCisJZmkKKworLlBIT05ZOiBpbnN0YWxsLmFsbAoraW5zdGFsbC5hbGw6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcworCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKKwkJcj1gcHdkYCA7IGV4cG9ydCByIDsgXAorCQkkKFNFVF9MSUJfUEFUSCkgXAorCQkoY2QgLi9nY2M7IFwKKwkJJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGluc3RhbGwtaGVhZGVycykgOyBcCisJZWxzZSBcCisJCXRydWUgOyBcCisJZmkKKworIyBpbmV0LWluc3RhbGwgaXMgdXNlZCBiZWNhdXNlIHRoZSBJKk5ldCB3YW50cyBEZWphR05VIGluc3RhbGxlZCBidXQKKyMgbm90IGJ1aWx0LiAgU2ltaWxhcmx5LCBnemlwIGlzIGJ1aWx0IGJ1dCBub3QgaW5zdGFsbGVkLgoraW5ldC1pbnN0YWxsOgorCSQoTUFLRSkgSU5TVEFMTF9NT0RVTEVTPSJgZWNobyAkKElOU1RBTExfTU9EVUxFUykgfCBzZWQgLWUgJ3MvaW5zdGFsbC1kZWphZ251Ly8nIC1lICdzL2luc3RhbGwtZ3ppcC8vJ2AiIGluc3RhbGwKKworIyBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMgaXMgdXNlZCBiZWNhdXNlIEN5Z251cyBjYW4gbm90IGRpc3RyaWJ1dGUKKyMgdGhlIGZpeGVkIGhlYWRlciBmaWxlcy4KKy5QSE9OWTogaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzCitpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXM6IFwKKwlpbnN0YWxsZGlycyBcCisJJChJTlNUQUxMX01PRFVMRVMpIFwKKwkkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpIFwKKwkkKElOU1RBTExfWDExX01PRFVMRVMpIFwKKwlnY2Mtbm8tZml4ZWRpbmNsdWRlcyAKKworIyBJbnN0YWxsIHRoZSBnY2MgaGVhZGVycyBmaWxlcywgYnV0IG5vdCB0aGUgZml4ZWQgaW5jbHVkZSBmaWxlcywKKyMgd2hpY2ggQ3lnbnVzIGlzIG5vdCBhbGxvd2VkIHRvIGRpc3RyaWJ1dGUuICBUaGlzIHJ1bGUgaXMgdmVyeQorIyBkZXBlbmRlbnQgb24gdGhlIHdvcmtpbmdzIG9mIHRoZSBnY2MgTWFrZWZpbGUuaW4uCisuUEhPTlk6IGdjYy1uby1maXhlZGluY2x1ZGVzCitnY2Mtbm8tZml4ZWRpbmNsdWRlczoKKwlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdOyB0aGVuIFwKKwkgIHJtIC1yZiBnY2MvdG1wLWluY2x1ZGU7IFwKKwkgIG12IGdjYy9pbmNsdWRlIGdjYy90bXAtaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAorCSAgbWtkaXIgZ2NjL2luY2x1ZGU7IFwKKwkgIGNwICQoc3JjZGlyKS9nY2MvZ3N5c2xpbWl0cy5oIGdjYy9pbmNsdWRlL3N5c2xpbWl0cy5oOyBcCisJICB0b3VjaCBnY2Mvc3RtcC1maXhpbmMgZ2NjL2luY2x1ZGUvZml4ZWQ7IFwKKwkgIHJtIC1mIGdjYy9zdG1wLWhlYWRlcnMgZ2NjL3N0bXAtaW50LWhkcnM7IFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAorCSAgJChTRVRfTElCX1BBVEgpIFwKKwkgIChjZCAuL2djYzsgXAorCSAgICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKKwkgIHJtIC1yZiBnY2MvaW5jbHVkZTsgXAorCSAgbXYgZ2NjL3RtcC1pbmNsdWRlIGdjYy9pbmNsdWRlIDI+L2Rldi9udWxsOyBcCisJZWxzZSB0cnVlOyBmaQorCisKKyMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuICBUbworIyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KKyMKKyMgYWxsLWd1aSwgYW5kIGFsbC1saWJwcm9jIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlCisjIHRoZXkgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgYW5kIGlmIHRoZXkgZmFpbCB0byBidWlsZCwgdGhhdAorIyBzaG91bGRuJ3Qgc3RvcCAibWFrZSBhbGwiLgorLlBIT05ZOiAkKEFMTF9NT0RVTEVTKSBhbGwtZ3VpIGFsbC1saWJwcm9jCiskKEFMTF9NT0RVTEVTKSBhbGwtZ3VpIGFsbC1saWJwcm9jOgorCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKKwlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCisJICByPWBwd2RgOyBleHBvcnQgcjsgXAorCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAorCSAgJChTRVRfTElCX1BBVEgpIFwKKwkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYWxsKTsgXAorCWVsc2UgXAorCSAgdHJ1ZTsgXAorCWZpCisKKyMgVGhlc2UgcnVsZXMgYXJlIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuCisjIFRvIGJ1aWxkIGEgdGFyZ2V0IGNoZWNrLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBjaGVjay4gIFNvbWUKKyMgbW9kdWxlcyBhcmUgb25seSB0ZXN0ZWQgaW4gYSBuYXRpdmUgdG9vbGNoYWluLgorCisuUEhPTlk6ICQoQ0hFQ0tfTU9EVUxFUykgJChOQVRJVkVfQ0hFQ0tfTU9EVUxFUykgJChDUk9TU19DSEVDS19NT0RVTEVTKQorJChOQVRJVkVfQ0hFQ0tfTU9EVUxFUyk6CisJQGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCisJICBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAorCSAgaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgICByPWBwd2RgOyBleHBvcnQgcjsgXAorCSAgICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAgICQoU0VUX0xJQl9QQVRIKSBcCisJICAgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCisJICBlbHNlIFwKKwkgICAgdHJ1ZTsgXAorCSAgZmk7IFwKKwlmaQorCiskKENST1NTX0NIRUNLX01PRFVMRVMpOgorCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAorCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAkKFNFVF9MSUJfUEFUSCkgXAorCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBjaGVjayk7IFwKKwllbHNlIFwKKwkgIHRydWU7IFwKKwlmaQorCisjIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuCisjIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCisuUEhPTlk6ICQoSU5TVEFMTF9NT0RVTEVTKQorJChJTlNUQUxMX01PRFVMRVMpOiBpbnN0YWxsZGlycworCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC0vLydgOyBcCisJaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlCisjIHRhcmdldCB0b29scy4KKy5QSE9OWTogJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpCiskKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6CisJQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jb25maWd1cmUtdGFyZ2V0LS8vJ2A7IFwKKwlpZiBbIC1kICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfSBdOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICAkKENDX0ZPUl9UQVJHRVQpIC0tcHJpbnQtbXVsdGktbGliID4gJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAyPiAvZGV2L251bGw7IFwKKwkgIGlmIFsgLXMgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCBdOyB0aGVuIFwKKwkgICAgaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0IF07IHRoZW4gXAorCSAgICAgIGlmIGNtcCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgPiAvZGV2L251bGw7IHRoZW4gXAorCQlybSAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0OyBcCisJICAgICAgZWxzZSBcCisJCWVjaG8gIk11bHRpbGlicyBjaGFuZ2VkIGZvciAkJHtkaXJ9LCByZWNvbmZpZ3VyaW5nIjsgXAorCQlybSAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZTsgXAorCQltdiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQ7IFwKKwkgICAgICBmaTsgXAorCSAgICBlbHNlIFwKKwkgICAgICBtdiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQ7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZmk7IGV4aXQgMAkjIGJyZWFrIGNvbW1hbmQgaW50byB0d28gcGllY2VzCisJQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jb25maWd1cmUtdGFyZ2V0LS8vJ2A7IFwKKwlpZiBbICEgLWQgJChUQVJHRVRfU1VCRElSKSBdOyB0aGVuIFwKKwkgIHRydWU7IFwKKwllbGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHRydWU7IFwKKwllbGlmIGVjaG8gIiAkKFRBUkdFVF9DT05GSUdESVJTKSAiIHwgZ3JlcCAiICQke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaWYgWyAtZCAkKHNyY2RpcikvJCR7ZGlyfSBdOyB0aGVuIFwKKwkgICAgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXSB8fCBta2RpciAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07XAorCSAgICByPWBwd2RgOyBleHBvcnQgcjsgXAorCSAgICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAgICQoU0VUX0xJQl9QQVRIKSBcCisJICAgIEFSPSIkKEFSX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IEFSOyBcCisJICAgIEFTPSIkKEFTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IEFTOyBcCisJICAgIENDPSIkKENDX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENDOyBcCisJICAgIENGTEFHUz0iJChDRkxBR1NfRk9SX1RBUkdFVCkiOyBleHBvcnQgQ0ZMQUdTOyBcCisJICAgIENYWD0iJChDWFhfRk9SX1RBUkdFVCkiOyBleHBvcnQgQ1hYOyBcCisJICAgIENYWEZMQUdTPSIkKENYWEZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWEZMQUdTOyBcCisJICAgIERMTFRPT0w9IiQoRExMVE9PTF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBETExUT09MOyBcCisJICAgIExEPSIkKExEX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExEOyBcCisgICAgICAgICAgICBMREZMQUdTPSIkKExERkxBR1NfRk9SX1RBUkdFVCkiOyBleHBvcnQgTERGTEFHUzsgXAorCSAgICBOTT0iJChOTV9GT1JfVEFSR0VUKSI7IGV4cG9ydCBOTTsgXAorCSAgICBSQU5MSUI9IiQoUkFOTElCX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFJBTkxJQjsgXAorCSAgICBXSU5EUkVTPSIkKFdJTkRSRVNfRk9SX1RBUkdFVCkiOyBleHBvcnQgV0lORFJFUzsgXAorCSAgICBlY2hvIENvbmZpZ3VyaW5nIGluICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgXAorCSAgICBjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKKwkgICAgY2FzZSAkKHNyY2RpcikgaW4gXAorCSAgICAvKikgXAorCSAgICAgIHRvcGRpcj0kKHNyY2RpcikgOzsgXAorCSAgICAqKSBcCisJICAgICAgY2FzZSAiJChUQVJHRVRfU1VCRElSKSIgaW4gXAorCSAgICAgIC4pIHRvcGRpcj0iLi4vJChzcmNkaXIpIiA7OyBcCisJICAgICAgKikgdG9wZGlyPSIuLi8uLi8kKHNyY2RpcikiIDs7IFwKKwkgICAgICBlc2FjIDs7IFwKKwkgICAgZXNhYzsgXAorCSAgICBpZiBbICIkKHNyY2RpcikiID0gIi4iIF0gOyB0aGVuIFwKKwkgICAgICBpZiBbICIkKFRBUkdFVF9TVUJESVIpIiAhPSAiLiIgXSA7IHRoZW4gXAorCQlpZiAkKFNIRUxMKSAkJHMvc3ltbGluay10cmVlICQke3RvcGRpcn0vJCR7ZGlyfSAibm8tc3VjaC1maWxlIiA7IHRoZW4gXAorCQkgIGlmIFsgLWYgTWFrZWZpbGUgXTsgdGhlbiBcCisJCSAgICBpZiAkKE1BS0UpIGRpc3RjbGVhbjsgdGhlbiBcCisJCSAgICAgIHRydWU7IFwKKwkJICAgIGVsc2UgXAorCQkgICAgICBleGl0IDE7IFwKKwkJICAgIGZpOyBcCisJCSAgZWxzZSBcCisJCSAgICB0cnVlOyBcCisJCSAgZmk7IFwKKwkJZWxzZSBcCisJCSAgZXhpdCAxOyBcCisJCWZpOyBcCisJICAgICAgZWxzZSBcCisJCXRydWU7IFwKKwkgICAgICBmaTsgXAorCSAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9LiI7IFwKKwkgICAgICBsaWJzcmNkaXI9Ii4iOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JCR7dG9wZGlyfS8kJHtkaXJ9IjsgXAorCSAgICAgIGxpYnNyY2Rpcj0iJCRzLyQke2Rpcn0iOyBcCisJICAgIGZpOyBcCisJICAgIGlmIFsgLWYgJCR7bGlic3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4gXAorCSAgICAgIHJtIC1mIG5vLXN1Y2gtZmlsZSBza2lwLXRoaXMtZGlyOyBcCisJICAgICAgQ09ORklHX1NJVEU9bm8tc3VjaC1maWxlICQoU0hFTEwpICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIFwKKwkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKKwkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHJtIC1mIG5vLXN1Y2gtZmlsZSBza2lwLXRoaXMtZGlyOyBcCisJICAgICAgQ09ORklHX1NJVEU9bm8tc3VjaC1maWxlICQoU0hFTEwpICQkcy9jb25maWd1cmUgXAorCQkkKENPTkZJR19BUkdVTUVOVFMpICQke3NyY2Rpcm9wdGlvbn0gXAorCQktLXdpdGgtdGFyZ2V0LXN1YmRpcj0iJChUQVJHRVRfU1VCRElSKSI7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgWyAtZiBza2lwLXRoaXMtZGlyIF0gOyB0aGVuIFwKKwkgICAgICBzaCBza2lwLXRoaXMtZGlyOyBcCisJICAgICAgcm0gLWYgc2tpcC10aGlzLWRpcjsgXAorCSAgICAgIGNkIC4uOyBybWRpciAkJHtkaXJ9IHx8IHRydWU7IFwKKwkgICAgZWxzZSBcCisJICAgICAgdHJ1ZTsgXAorCSAgICBmaTsgXAorCSAgZWxzZSBcCisJICAgIHRydWU7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBidWlsZCB0aGUgbW9kdWxlcyB3aGljaCB1c2UgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCisjIFRvIGJ1aWxkIGEgdGFyZ2V0IGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgYWxsLgorLlBIT05ZOiAkKEFMTF9UQVJHRVRfTU9EVUxFUykKKyQoQUxMX1RBUkdFVF9NT0RVTEVTKToKKwlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC10YXJnZXQtLy8nYDsgXAorCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAkKFNFVF9MSUJfUEFUSCkgXAorCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBhbGwpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBjaGVjayB0aGUgbW9kdWxlcyB3aGljaCB1c2UgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCisjIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCisuUEhPTlk6ICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpCiskKENIRUNLX1RBUkdFVF9NT0RVTEVTKToKKwlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLXRhcmdldC0vLydgOyBcCisJaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgY2hlY2spO1wKKwllbHNlIFwKKwkgIHRydWU7IFwKKwlmaQorCisjIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlCisjIFRBUkdFVF9GTEFHU19UT19QQVNTLiAgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFgKKyMgYW5kIG1ha2UgaW5zdGFsbC4KKy5QSE9OWTogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQorJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKKwlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtdGFyZ2V0LS8vJ2A7IFwKKwlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCisJICByPWBwd2RgOyBleHBvcnQgcjsgXAorCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAorCSAgJChTRVRfTElCX1BBVEgpIFwKKwkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKKwkgICAgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAorCWVsc2UgXAorCSAgdHJ1ZTsgXAorCWZpCisKKyMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFgxMV9GTEFHU19UT19QQVNTLgorIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KKy5QSE9OWTogJChBTExfWDExX01PRFVMRVMpCiskKEFMTF9YMTFfTU9EVUxFUyk6CisJQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtLy8nYDsgXAorCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAkKFNFVF9MSUJfUEFUSCkgXAorCSAgKGNkICQke2Rpcn07IFwKKwkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAorCWVsc2UgXAorCSAgdHJ1ZTsgXAorCWZpCisKKyMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFgxMV9GTEFHU19UT19QQVNTLgorIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgYWxsLgorLlBIT05ZOiAkKENIRUNLX1gxMV9NT0RVTEVTKQorJChDSEVDS19YMTFfTU9EVUxFUyk6CisJQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay0vLydgOyBcCisJaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgJCR7ZGlyfTsgXAorCSAgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKFgxMV9GTEFHU19UT19QQVNTKSBjaGVjayk7IFwKKwllbHNlIFwKKwkgIHRydWU7IFwKKwlmaQorCisjIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFgxMV9GTEFHU19UT19QQVNTLgorIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgorLlBIT05ZOiAkKElOU1RBTExfWDExX01PRFVMRVMpCiskKElOU1RBTExfWDExX01PRFVMRVMpOiBpbnN0YWxsZGlycworCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC0vLydgOyBcCisJaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgJCR7ZGlyfTsgXAorCSAgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKFgxMV9GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAorCWVsc2UgXAorCSAgdHJ1ZTsgXAorCWZpCisKKyMgZ2NjIGlzIHRoZSBvbmx5IG1vZHVsZSB3aGljaCB1c2VzIEdDQ19GTEFHU19UT19QQVNTLgorLlBIT05ZOiBhbGwtZ2NjCithbGwtZ2NjOgorCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJICAkKFNFVF9MSUJfUEFUSCkgXAorCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBhbGwpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworIyBCdWlsZGluZyBHQ0MgdXNlcyBzb21lIHRvb2xzIGZvciByZWJ1aWxkaW5nICJzb3VyY2UiIGZpbGVzCisjIGxpa2UgdGV4aW5mbywgYmlzb24vYnlhY2MsIGV0Yy4gIFNvIHdlIG11c3QgZGVwZW5kIG9uIHRob3NlLgorIworIyBXaGlsZSBidWlsZGluZyBHQ0MsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcnVuIHZhcmlvdXMgdGFyZ2V0CisjIHByb2dyYW1zIGxpa2UgdGhlIGFzc2VtYmxlciwgbGlua2VyLCBldGMuICBTbyB3ZSBkZXBlbmQgb24KKyMgdGhvc2UgdG9vLgorIworIyBJbiB0aGVvcnksIG9uIGFuIFNNUCBhbGwgdGhvc2UgZGVwZW5kZW5jaWVzIGNhbiBiZSByZXNvbHZlZAorIyBpbiBwYXJhbGxlbC4KKyMKKy5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuCitib290c3RyYXAgYm9vdHN0cmFwLWxlYW4gYm9vdHN0cmFwMiBib290c3RyYXAyLWxlYW4gYm9vdHN0cmFwMyBib290c3RyYXAzLWxlYW4gYm9vdHN0cmFwNCBib290c3RyYXA0LWxlYW46IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCisJQHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAorCSQoU0VUX0xJQl9QQVRIKSBcCisJZWNobyAiQm9vdHN0cmFwcGluZyB0aGUgY29tcGlsZXIiOyBcCisJY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICRACisJQHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAorCWNhc2UgIiRAIiBpbiBcCisJICAqYm9vdHN0cmFwNC1sZWFuICkgXAorCQkJbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAorCSAgCQljb21wYXJlPWNvbXBhcmUzLWxlYW4gOzsgXAorCSAgKmJvb3RzdHJhcDQgKSBtc2c9IkNvbXBhcmluZyBzdGFnZTMgYW5kIHN0YWdlNCBvZiB0aGUgY29tcGlsZXIiOyBcCisJICAJCWNvbXBhcmU9Y29tcGFyZTMgOzsgXAorCSAgKi1sZWFuICkJbXNnPSJDb21wYXJpbmcgc3RhZ2UyIGFuZCBzdGFnZTMgb2YgdGhlIGNvbXBpbGVyIjsgXAorCSAgCQljb21wYXJlPWNvbXBhcmUtbGVhbiA7OyBcCisJICAqICkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKKwkgIAkJY29tcGFyZT1jb21wYXJlIDs7IFwKKwllc2FjOyBcCisJJChTRVRfTElCX1BBVEgpIFwKKwllY2hvICIkJG1zZyI7IFwKKwljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgJCRjb21wYXJlCisJQHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKKwkkKFNFVF9MSUJfUEFUSCkgXAorCWVjaG8gIkJ1aWxkaW5nIHJ1bnRpbWUgbGlicmFyaWVzIjsgXAorCSQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpIGFsbAorCisuUEhPTlk6IGNyb3NzCitjcm9zczogYWxsLXRleGluZm8gYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKKwlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCisJJChTRVRfTElCX1BBVEgpIFwKKwllY2hvICJCdWlsZGluZyB0aGUgQyBhbmQgQysrIGNvbXBpbGVyIjsgXAorCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIgorCUByPWBwd2RgOyBleHBvcnQgcjsgXAorCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCisJJChTRVRfTElCX1BBVEgpIFwKKwllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKKwkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwgTEFOR1VBR0VTPSJjIGMrKyIKKworLlBIT05ZOiBjaGVjay1nY2MKK2NoZWNrLWdjYzoKKwlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCisJICByPWBwd2RgOyBleHBvcnQgcjsgXAorCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAorCSAgJChTRVRfTElCX1BBVEgpIFwKKwkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworLlBIT05ZOiBpbnN0YWxsLWdjYworaW5zdGFsbC1nY2M6CisJQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworLlBIT05ZOiBpbnN0YWxsLWdjYy1jcm9zcworaW5zdGFsbC1nY2MtY3Jvc3M6CisJQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIExBTkdVQUdFUz0iYyBjKysiIGluc3RhbGwpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKyMgRVhQRVJJTUVOVEFMIFNUVUZGCisjIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGluc3RhbGwgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIEZMQUdTX1RPX1BBU1MuCisjIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGluc3RhbGwuCisuUEhPTlk6IGluc3RhbGwtZG9zcmVsCitpbnN0YWxsLWRvc3JlbDogaW5zdGFsbGRpcnMgaW5mbworCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvaW5zdGFsbC0vLydgOyBcCisJaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAorCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKKwkgICQoU0VUX0xJQl9QQVRIKSBcCisJICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCisJZWxzZSBcCisJICB0cnVlOyBcCisJZmkKKworaW5zdGFsbC1kb3NyZWwtZmFrZToKKworCisjIFRoaXMgaXMgYSBsaXN0IG9mIGludGVyLWRlcGVuZGVuY2llcyBhbW9uZyBtb2R1bGVzLgorYWxsLWFwYWNoZToKK2FsbC1hc2g6CithbGwtYXV0b2NvbmY6IGFsbC1tNCBhbGwtdGV4aW5mbworYWxsLWF1dG9tYWtlOiBhbGwtbTQgYWxsLXRleGluZm8KK2FsbC1iYXNoOgorYWxsLWJmZDogYWxsLWxpYmliZXJ0eSBhbGwtaW50bAorYWxsLWJpbnV0aWxzOiBhbGwtbGliaWJlcnR5IGFsbC1vcGNvZGVzIGFsbC1iZmQgYWxsLWZsZXggYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtaW50bAorYWxsLWJpc29uOiBhbGwtdGV4aW5mbworY29uZmlndXJlLXRhcmdldC1ic3A6ICQoQUxMX0dDQykKK2FsbC10YXJnZXQtYnNwOiBjb25maWd1cmUtdGFyZ2V0LWJzcCBhbGwtZ2NjIGFsbC1iaW51dGlscyBhbGwtdGFyZ2V0LW5ld2xpYgorYWxsLWJ5YWNjOgorYWxsLWJ6aXAyOgorYWxsLWN2c3NyYzoKK2NvbmZpZ3VyZS10YXJnZXQtY3lnbW9uOiAkKEFMTF9HQ0MpCithbGwtdGFyZ2V0LWN5Z21vbjogY29uZmlndXJlLXRhcmdldC1jeWdtb24gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlic3R1YiBhbGwtdGFyZ2V0LWJzcAorYWxsLWRiOgorYWxsLWRlamFnbnU6IGFsbC10Y2wgYWxsLWV4cGVjdCBhbGwtdGsKK2FsbC1kaWZmOiBhbGwtbGliaWJlcnR5CithbGwtZW1hY3M6CithbGwtZW1hY3MxOTogYWxsLWJpc29uIGFsbC1ieWFjYworYWxsLWV0YzoKK2NvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXM6ICQoQUxMX0dDQykKK2FsbC10YXJnZXQtZXhhbXBsZXM6IGNvbmZpZ3VyZS10YXJnZXQtZXhhbXBsZXMKK2FsbC1leHBlY3Q6IGFsbC10Y2wgYWxsLXRrCithbGwtZmlsZXV0aWxzOiBhbGwtbGliaWJlcnR5CithbGwtZmluZHV0aWxzOgorYWxsLWZpbmQ6CithbGwtZmxleDogYWxsLWxpYmliZXJ0eSBhbGwtYmlzb24gYWxsLWJ5YWNjCithbGwtZ2FzOiBhbGwtbGliaWJlcnR5IGFsbC1vcGNvZGVzIGFsbC1iZmQgYWxsLWludGwKK2FsbC1nYXNoOiBhbGwtdGNsCithbGwtZ2F3azoKK0FMTF9HQ0MgPSBhbGwtZ2NjCithbGwtZ2NjOiBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAorYWxsLWJvb3RzdHJhcDogYWxsLWxpYmliZXJ0eSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAorR0RCX1RLID0gYWxsLXRrIGFsbC10Y2wgYWxsLWl0Y2wgYWxsLXRpeCBhbGwtbGliZ3VpCithbGwtZ2RiOiBhbGwtbGliaWJlcnR5IGFsbC1vcGNvZGVzIGFsbC1iZmQgYWxsLW1tYWxsb2MgYWxsLXJlYWRsaW5lIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLXNpbSAkKGdkYm5sbXJlcXVpcmVtZW50cykgJChHREJfVEspCithbGwtZ2V0dGV4dDoKK2FsbC1nbnVzZXJ2OgorY29uZmlndXJlLXRhcmdldC1ncGVyZjogJChBTExfR0NDKQorYWxsLXRhcmdldC1ncGVyZjogY29uZmlndXJlLXRhcmdldC1ncGVyZiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnN0ZGMrKworYWxsLWdwcm9mOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMgYWxsLWludGwKK2FsbC1ncmV6OiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKK2FsbC1ndWk6IGFsbC1nZGIgYWxsLWxpYnByb2MgYWxsLXRhcmdldC1saWJyeAorYWxsLWd1aWxlOgorYWxsLWd6aXA6IGFsbC1saWJpYmVydHkKK2FsbC1oZWxsbzogYWxsLWxpYmliZXJ0eQorYWxsLWluZGVudDoKK2FsbC1pbmV0OiBhbGwtdGNsIGFsbC1zZW5kLXByIGFsbC1wZXJsCithbGwtaW50bDoKK2FsbC1pc3BlbGw6IGFsbC1lbWFjczE5CithbGwtaXRjbDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKK2FsbC1sZDogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWZsZXggYWxsLWludGwKK2NvbmZpZ3VyZS10YXJnZXQtbGliZysrOiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbGlicngKK2FsbC10YXJnZXQtbGliZysrOiBjb25maWd1cmUtdGFyZ2V0LWxpYmcrKyBhbGwtZ2FzIGFsbC1sZCBhbGwtZ2NjIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbmV3bGliIGFsbC10YXJnZXQtbGliaW8gYWxsLXRhcmdldC1saWJyeCBhbGwtdGFyZ2V0LWxpYnN0ZGMrKworY29uZmlndXJlLXRhcmdldC1saWJnbG9zczogJChBTExfR0NDKQorYWxsLXRhcmdldC1saWJnbG9zczogY29uZmlndXJlLXRhcmdldC1saWJnbG9zcyBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgorY29uZmlndXJlLXRhcmdldC1saWJpbzogJChBTExfR0NDKQorYWxsLXRhcmdldC1saWJpbzogY29uZmlndXJlLXRhcmdldC1saWJpbyBhbGwtZ2FzIGFsbC1sZCBhbGwtZ2NjIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbmV3bGliCitjaGVjay10YXJnZXQtbGliaW86IGFsbC10YXJnZXQtbGlic3RkYysrCithbGwtbGliZ3VpOiBhbGwtdGNsIGFsbC10ayBhbGwtdGNsOC4xIGFsbC10azguMSBhbGwtaXRjbAorYWxsLWxpYmliZXJ0eToKK2NvbmZpZ3VyZS10YXJnZXQtbGlicng6ICQoQUxMX0dDQykgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKK2FsbC10YXJnZXQtbGlicng6IGNvbmZpZ3VyZS10YXJnZXQtbGlicngKK2NvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrOiAkKEFMTF9HQ0MpCithbGwtdGFyZ2V0LWxpYnN0ZGMrKzogY29uZmlndXJlLXRhcmdldC1saWJzdGRjKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvCitjb25maWd1cmUtdGFyZ2V0LWxpYnN0dWI6ICQoQUxMX0dDQykKK2FsbC10YXJnZXQtbGlic3R1YjogY29uZmlndXJlLXRhcmdldC1saWJzdHViCithbGwtbGlidG9vbDoKK2FsbC1tNDogYWxsLWxpYmliZXJ0eQorYWxsLW1ha2U6IGFsbC1saWJpYmVydHkKK2FsbC1tbWFsbG9jOgorY29uZmlndXJlLXRhcmdldC1uZXdsaWI6ICQoQUxMX0dDQykKK2NvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcDogJChBTExfR0NDKQorYWxsLXRhcmdldC1uZXdsaWI6IGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1nY2MKK2FsbC10YXJnZXQtbGlidGVybWNhcDogY29uZmlndXJlLXRhcmdldC1saWJ0ZXJtY2FwIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1nY2MKK2FsbC1vcGNvZGVzOiBhbGwtYmZkIGFsbC1saWJpYmVydHkKK2FsbC1wYXRjaDogYWxsLWxpYmliZXJ0eQorYWxsLXBlcmw6CithbGwtcHJtczogYWxsLWxpYmliZXJ0eQorYWxsLXJjczoKK2FsbC1yZWFkbGluZToKK2FsbC1yZWNvZGU6IGFsbC1saWJpYmVydHkKK2FsbC1zZWQ6IGFsbC1saWJpYmVydHkKK2FsbC1zZW5kLXByOiBhbGwtcHJtcworYWxsLXNoZWxsdXRpbHM6CithbGwtc2ltOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMgYWxsLXJlYWRsaW5lCithbGwtdGFyOiBhbGwtbGliaWJlcnR5CithbGwtdGNsOgorYWxsLXRjbDguMToKK2FsbC10Y2xYOiBhbGwtdGNsIGFsbC10aworYWxsLXRrOiBhbGwtdGNsCithbGwtdGs4LjE6IGFsbC10Y2w4LjEKK2FsbC10ZXhpbmZvOiBhbGwtbGliaWJlcnR5CithbGwtdGV4dHV0aWxzOgorYWxsLXRnYXM6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcworYWxsLXRpbWU6CithbGwtdGl4OiBhbGwtdGNsIGFsbC10ayBhbGwtdGNsOC4xIGFsbC10azguMQorYWxsLXdkaWZmOgorYWxsLXRhcmdldC13aW5zdXA6IGFsbC10YXJnZXQtbmV3bGliIGFsbC10YXJnZXQtbGliaWJlcnR5IGFsbC10YXJnZXQtbGlidGVybWNhcCBjb25maWd1cmUtdGFyZ2V0LXdpbnN1cAorY29uZmlndXJlLXRhcmdldC13aW5zdXA6IGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCithbGwtdXVkZWNvZGU6IGFsbC1saWJpYmVydHkKK2FsbC16aXA6Citjb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eTogJChBTExfR0NDKQorYWxsLXRhcmdldC1saWJpYmVydHk6IGNvbmZpZ3VyZS10YXJnZXQtbGliaWJlcnR5IGFsbC1nY2MgYWxsLWxkIGFsbC10YXJnZXQtbmV3bGliCithbGwtdGFyZ2V0OiAkKEFMTF9UQVJHRVRfTU9EVUxFUykKK2luc3RhbGwtdGFyZ2V0OiAkKElOU1RBTExfVEFSR0VUX01PRFVMRVMpCisjIyMgb3RoZXIgc3VwcG9ydGluZyB0YXJnZXRzCisKK01BS0VESVJTPSBcCisJJChwcmVmaXgpIFwKKwkkKGV4ZWNfcHJlZml4KQorLlBIT05ZOiBpbnN0YWxsZGlycworaW5zdGFsbGRpcnM6IG1raW5zdGFsbGRpcnMKKwkkKFNIRUxMKSAkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKE1BS0VESVJTKQorCitkaXIuaW5mbzogZG8taW5zdGFsbC1pbmZvCisJaWYgWyAtZiAkKHNyY2RpcikvdGV4aW5mby9nZW4taW5mby1kaXIgXSA7IHRoZW4gXAorCSAgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyICQoaW5mb2RpcikgJChzcmNkaXIpL3RleGluZm8vZGlyLmluZm8tdGVtcGxhdGUgPiBkaXIuaW5mby5uZXcgOyBcCisJICBtdiAtZiBkaXIuaW5mby5uZXcgZGlyLmluZm8gOyBcCisJZWxzZSB0cnVlIDsgXAorCWZpCisKK2Rpc3Q6CisJQGVjaG8gIkJ1aWxkaW5nIGEgZnVsbCBkaXN0cmlidXRpb24gb2YgdGhpcyB0cmVlIGlzbid0IGRvbmUiCisJQGVjaG8gInZpYSAnbWFrZSBkaXN0Jy4gIENoZWNrIG91dCB0aGUgZXRjLyBzdWJkaXJlY3RvcnkiIAorCitldGFncyB0YWdzOiBUQUdTCisKKyMgUmlnaHQgbm93IHRoaXMganVzdCBidWlsZHMgVEFHUyBpbiBlYWNoIHN1YmRpcmVjdG9yeS4gIGVtYWNzMTkgaGFzIHRoZQorIyBhYmlsaXR5IHRvIHVzZSBzZXZlcmFsIHRhZ3MgZmlsZXMgYXQgb25jZSwgc28gdGhlcmUgaXMgcHJvYmFibHkgbm8gbmVlZAorIyB0byBjb21iaW5lIHRoZW0gaW50byBvbmUgYmlnIFRBR1MgZmlsZSAobGlrZSBDVlMgMS4zIGRvZXMpLiAgV2UgY291bGQKKyMgKGlmIHdlIGZlbHQgbGlrZSBpdCkgaGF2ZSB0aGlzIE1ha2VmaWxlIHdyaXRlIGEgcGllY2Ugb2YgZWxpc3Agd2hpY2gKKyMgdGhlIHVzZXIgY291bGQgbG9hZCB0byB0ZWxsIGVtYWNzMTkgd2hlcmUgYWxsIHRoZSBUQUdTIGZpbGVzIHdlIGp1c3QKKyMgYnVpbHQgYXJlLgorVEFHUzogZG8tVEFHUworCisjIHdpdGggdGhlIGdudSBtYWtlLCB0aGlzIGlzIGRvbmUgYXV0b21hdGljYWxseS4KKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZ3VyZS5pbiAkKGhvc3RfbWFrZWZpbGVfZnJhZykgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykgJChnY2NfdmVyc2lvbl90cmlnZ2VyKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjCisjIFN1cHBvcnQgZm9yIGJ1aWxkaW5nIG5ldCByZWxlYXNlcworCisjIEZpbGVzIGluIGRldm8gdXNlZCBpbiBhbnkgbmV0IHJlbGVhc2UuCisjIENoYW5nZUxvZyBvbWl0dGVkIGJlY2F1c2UgaXQgbWF5IHJlZmVyIHRvIGZpbGVzIHdoaWNoIGFyZSBub3QgaW4gdGhpcworIyBkaXN0cmlidXRpb24gKHBlcmhhcHMgaXQgd291bGQgYmUgYmV0dGVyIHRvIGluY2x1ZGUgaXQgYW55d2F5KS4KK0RFVk9fU1VQUE9SVD0gUkVBRE1FIE1ha2VmaWxlLmluIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gXAorCWNvbmZpZy5ndWVzcyBjb25maWcuaWYgY29uZmlnLnN1YiBjb25maWcgbW92ZS1pZi1jaGFuZ2UgXAorCW1wdy1SRUFETUUgbXB3LWJ1aWxkLmluIG1wdy1jb25maWcuaW4gbXB3LWNvbmZpZ3VyZSBtcHctaW5zdGFsbCBcCisJQ09QWUlORyBDT1BZSU5HLkxJQiBpbnN0YWxsLXNoIGNvbmZpZy1tbC5pbiBzeW1saW5rLXRyZWUgXAorCW1raW5zdGFsbGRpcnMgbHRjb25maWcgbHRtYWluLnNoIG1pc3NpbmcgeWx3cmFwCisKKyMgRmlsZXMgaW4gZGV2by9ldGMgdXNlZCBpbiBhbnkgbmV0IHJlbGVhc2UuCisjIENoYW5nZUxvZyBvbWl0dGVkIGJlY2F1c2UgaXQgbWF5IHJlZmVyIHRvIGZpbGVzIHdoaWNoIGFyZSBub3QgaW4gdGhpcworIyBkaXN0cmlidXRpb24gKHBlcmhhcHMgaXQgd291bGQgYmUgYmV0dGVyIHRvIGluY2x1ZGUgaXQgYW55d2F5KS4KK0VUQ19TVVBQT1JUPSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIHN0YW5kYXJkcy50ZXhpIFwKKwltYWtlLXN0ZHMudGV4aSBzdGFuZGFyZHMuaW5mbyoKKworIyBXaGVuIHlvdSB1c2UgYG1ha2Ugc2V0dXAtZGlycycgb3IgYG1ha2UgdGF6JyB5b3Ugc2hvdWxkIGFsd2F5cyByZWRlZmluZQorIyB0aGlzIG1hY3JvLgorU1VQUE9SVF9GSUxFUyA9IGxpc3Qtb2Ytc3VwcG9ydC1maWxlcy1mb3ItdG9vbC1pbi1xdWVzdGlvbgorCisuUEhPTlk6IHRhegorCit0YXo6ICQoREVWT19TVVBQT1JUKSAkKFNVUFBPUlRfRklMRVMpIFwKKyAgdGV4aW5mby90ZXhpbmZvLnRleCB0ZXhpbmZvL2dwbC50ZXhpbmZvIHRleGluZm8vbGdwbC50ZXhpbmZvCisJIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgorCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCisJICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKKwk8TWFrZWZpbGUuaW4gPnRtcAorCW12IC1mIHRtcCBNYWtlZmlsZS5pbgorCSMKKwkuL2NvbmZpZ3VyZSBzdW40CisJWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKKwkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAorCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKKwkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KKwlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2CisJc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCisJZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAorCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCisJICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKKwkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKKwkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAorCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKKwkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCisJICAgIGZpIDsgXAorCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAorCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAorCSAgICBmaSA7IFwKKwkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKKwlkb25lCisJY2QgZXRjIDsgJChNQUtFKSBpbmZvCisJJChNQUtFKSBkaXN0Y2xlYW4KKwkjCisJbWtkaXIgcHJvdG8tdG9wbGV2L2V0YworCShjZCBwcm90by10b3BsZXYvZXRjOyBcCisJIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCisJCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKKwkgZG9uZSkKKwkjCisJIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKKwlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCisJc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAorCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCisJIworCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCisJbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCisJbG4gLXMgLi4vLi4vdGV4aW5mby9ncGwudGV4aW5mbwkJcHJvdG8tdG9wbGV2L3RleGluZm8vCisJbG4gLXMgLi4vLi4vdGV4aW5mby9sZ3BsLnRleGluZm8JcHJvdG8tdG9wbGV2L3RleGluZm8vCisJaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCisJICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKKwkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKKwllbHNlIHRydWU7IGZpCisJY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCisJaWYgZ3JlcCBBTV9JTklUX0FVVE9NQUtFICQoVE9PTCkvY29uZmlndXJlLmluID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICB2ZXI9YHNlZCA8ICQoVE9PTCkvY29uZmlndXJlLmluIC1uICdzL0FNX0lOSVRfQVVUT01BS0VbXixdKiwgKlwoW14pXSpcKSkvXDEvcCdgOyBcCisJZWxzZSBcCisJICB2ZXI9YHNlZCA8JChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJ2A7IFwKKwlmaTsgXAorCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tdGFyLWd6IFRPT0w9JChUT09MKSBWRVI9JCR2ZXIKKworZG8tdGFyLWd6OgorCWVjaG8gIj09PiBNYWtpbmcgJChUT09MKS0kKFZFUikudGFyLmd6IgorCS1ybSAtZiAkKFRPT0wpLSQoVkVSKQorCWxuIC1zIHByb3RvLXRvcGxldiAkKFRPT0wpLSQoVkVSKQorCXRhciBjZmggJChUT09MKS0kKFZFUikudGFyICQoVE9PTCktJChWRVIpCisJJChHWklQUFJPRykgLXYgLTkgJChUT09MKS0kKFZFUikudGFyCisKK1RFWElORk9fU1VQUE9SVD0gdGV4aW5mby90ZXhpbmZvLnRleCB0ZXhpbmZvL2dwbC50ZXhpbmZvIHRleGluZm8vbGdwbC50ZXhpbmZvCitESVNUX1NVUFBPUlQ9ICQoREVWT19TVVBQT1JUKSAkKFRFWElORk9fU1VQUE9SVCkKKworLlBIT05ZOiBnYXMudGFyLmd6CitHQVNfU1VQUE9SVF9ESVJTPSBiZmQgaW5jbHVkZSBsaWJpYmVydHkgb3Bjb2RlcyBpbnRsIHNldHVwLmNvbSBtYWtlZmlsZS52bXMKK2dhcy50YXIuZ3o6ICQoRElTVF9TVVBQT1JUKSAkKEdBU19TVVBQT1JUX0RJUlMpIGdhcworCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKKwkJU1VQUE9SVF9GSUxFUz0iJChHQVNfU1VQUE9SVF9ESVJTKSIKKworIyBUaGUgRlNGICJiaW51dGlscyIgcmVsZWFzZSBpbmNsdWRlcyBncHJvZiBhbmQgbGQuCisuUEhPTlk6IGJpbnV0aWxzLnRhci5negorQklOVVRJTFNfU1VQUE9SVF9ESVJTPSBiZmQgZ2FzIGluY2x1ZGUgbGliaWJlcnR5IG9wY29kZXMgbGQgZ3Byb2YgaW50bCBzZXR1cC5jb20gbWFrZWZpbGUudm1zCitiaW51dGlscy50YXIuZ3o6ICQoRElTVF9TVVBQT1JUKSAkKEJJTlVUSUxTX1NVUFBPUlRfRElSUykgYmludXRpbHMKKwkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWJpbnV0aWxzIFwKKwkJU1VQUE9SVF9GSUxFUz0iJChCSU5VVElMU19TVVBQT1JUX0RJUlMpIG1ha2VhbGwuYmF0IGNvbmZpZ3VyZS5iYXQiCisKKy5QSE9OWTogZ2FzK2JpbnV0aWxzLnRhci5negorR0FTQl9TVVBQT1JUX0RJUlM9ICQoR0FTX1NVUFBPUlRfRElSUykgYmludXRpbHMgbGQgZ3Byb2YKK2dhcytiaW51dGlscy50YXIuZ3o6ICQoRElTVF9TVVBQT1JUKSAkKEdBU0JfU1VQUE9SVF9ESVJTKSBnYXMKKwkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdhcyBcCisJCVNVUFBPUlRfRklMRVM9IiQoR0FTQl9TVVBQT1JUX0RJUlMpIG1ha2VhbGwuYmF0IGNvbmZpZ3VyZS5iYXQiCisKKy5QSE9OWTogbGliZysrLnRhci5negorTElCR1hYX1NVUFBPUlRfRElSUz1pbmNsdWRlIGxpYnN0ZGMrKyBsaWJpbyBsaWJyeCBsaWJpYmVydHkKK2xpYmcrKy50YXIuZ3o6ICQoRElTVF9TVVBQT1JUKSBsaWJnKysKKwkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWxpYmcrKyBcCisJCVNVUFBPUlRfRklMRVM9IiQoTElCR1hYX1NVUFBPUlRfRElSUykiCisKK0dOQVRTX1NVUFBPUlRfRElSUz1pbmNsdWRlIGxpYmliZXJ0eSBzZW5kLXByCitnbmF0cy50YXIuZ3o6ICQoRElTVF9TVVBQT1JUKSAkKEdOQVRTX1NVUFBPUlRfRElSUykgZ25hdHMKKwkkKE1BS0UpIC1mICBNYWtlZmlsZS5pbiB0YXogVE9PTD1nbmF0cyBcCisJCVNVUFBPUlRfRklMRVM9IiQoR05BVFNfU1VQUE9SVF9ESVJTKSIKKworLlBIT05ZOiBnZGIudGFyLmd6CitHREJfU1VQUE9SVF9ESVJTPSBiZmQgaW5jbHVkZSBsaWJpYmVydHkgbW1hbGxvYyBvcGNvZGVzIHJlYWRsaW5lIHNpbSB1dGlscyBpbnRsCitnZGIudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgJChHREJfU1VQUE9SVF9ESVJTKSBnZGIKKwkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdkYiBcCisJCVNVUFBPUlRfRklMRVM9IiQoR0RCX1NVUFBPUlRfRElSUykiCisKKy5QSE9OWTogbmV3bGliLnRhci5negorTkVXTElCX1NVUFBPUlRfRElSUz1saWJnbG9zcworIyB0YXogY29uZmlndXJlcyBmb3IgdGhlIHN1bjQgdGFyZ2V0IHdoaWNoIHdvbid0IGNvbmZpZ3VyZSBuZXdsaWIuCisjIFdlIG5lZWQgbmV3bGliIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgLmluZm8gZmlsZXMgYXJlIG1hZGUuCisjIFVuZm9ydHVuYXRlbHksIGl0IGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb25maWd1cmUgbmV3bGliIHNlcGFyYXRlbHk6CisjIHRheiB3aWxsIGJ1aWxkIHRoZSAuaW5mbyBmaWxlcyBidXQgc2luY2UgU1VCRElSUyB3b24ndCBjb250YWluIG5ld2xpYiwKKyMgZGlzdGNsZWFuIHdvbid0IGJlIHJ1biAobGVhdmluZyBNYWtlZmlsZSwgY29uZmlnLnN0YXR1cywgYW5kIHRoZSB0bXAgZmlsZXMKKyMgdXNlZCBpbiBidWlsZGluZyB0aGUgLmluZm8gZmlsZXMsIGVnOiAqLmRlZiwgKi5yZWYpLgorIyBUaGUgcHJvYmxlbSBpc24ndCBzb2x2YWJsZSBob3dldmVyIHdpdGhvdXQgYSBsb3Qgb2YgZXh0cmEgd29yayBiZWNhdXNlCisjIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIHN1YmRpciAkKHRhcmdldF9hbGlhcykgd2hpY2ggZ2V0cyBudWtlZCBkdXJpbmcKKyMgdGhlIG1ha2UgZGlzdGNsZWFuLiAgRm9yIG5vdyBwdW50IG9uIHRoZSBpc3N1ZSBvZiBzaGlwcGluZyBuZXdsaWIgaW5mbyBmaWxlcworIyB3aXRoIG5ld2xpYiBuZXQgcmVsZWFzZXMgYW5kIHdhaXQgZm9yIGEgZGF5IHdoZW4gc29tZSBuYXRpdmUgdGFyZ2V0IChzdW40PykKKyMgc3VwcG9ydHMgbmV3bGliIChpZiBvbmx5IG1pbmltYWxseSkuCituZXdsaWIudGFyLmd6OiAkKERJU1RfU1VQUE9SVCkgJChORVdMSUJfU1VQUE9SVF9ESVJTKSBuZXdsaWIKKwkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPW5ld2xpYiBcCisJCVNVUFBPUlRfRklMRVM9IiQoTkVXTElCX1NVUFBPUlRfRElSUykiIFwKKwkJREVWT19TVVBQT1JUPSIkKERFVk9fU1VQUE9SVCkgQ09QWUlORy5ORVdMSUIiIG5ld2xpYgorCisuTk9FWFBPUlQ6CitNQUtFT1ZFUlJJREVTPQorCisjIGVuZCBvZiBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGU0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSw0NyBAQAorCQkgICBSRUFETUUgZm9yIEdOVSBkZXZlbG9wbWVudCB0b29scworCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB2YXJpb3VzIEdOVSBjb21waWxlcnMsIGFzc2VtYmxlcnMsIGxpbmtlcnMsIAorZGVidWdnZXJzLCBldGMuLCBwbHVzIHRoZWlyIHN1cHBvcnQgcm91dGluZXMsIGRlZmluaXRpb25zLCBhbmQgZG9jdW1lbnRhdGlvbi4KKworSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBhcyBwYXJ0IG9mIGEgR0RCIHJlbGVhc2UsIHNlZSB0aGUgZmlsZSBnZGIvUkVBRE1FLgorSWYgd2l0aCBhIGJpbnV0aWxzIHJlbGVhc2UsIHNlZSBiaW51dGlscy9SRUFETUU7ICBpZiB3aXRoIGEgbGliZysrIHJlbGVhc2UsCitzZWUgbGliZysrL1JFQURNRSwgZXRjLiAgVGhhdCdsbCBnaXZlIHlvdSBpbmZvIGFib3V0IHRoaXMKK3BhY2thZ2UgLS0gc3VwcG9ydGVkIHRhcmdldHMsIGhvdyB0byB1c2UgaXQsIGhvdyB0byByZXBvcnQgYnVncywgZXRjLgorCitJdCBpcyBub3cgcG9zc2libGUgdG8gYXV0b21hdGljYWxseSBjb25maWd1cmUgYW5kIGJ1aWxkIGEgdmFyaWV0eSBvZgordG9vbHMgd2l0aCBvbmUgY29tbWFuZC4gIFRvIGJ1aWxkIGFsbCBvZiB0aGUgdG9vbHMgY29udGFpbmVkIGhlcmVpbiwKK3J1biB0aGUgYGBjb25maWd1cmUnJyBzY3JpcHQgaGVyZSwgZS5nLjoKKworCS4vY29uZmlndXJlIAorCW1ha2UKKworVG8gaW5zdGFsbCB0aGVtIChieSBkZWZhdWx0IGluIC91c3IvbG9jYWwvYmluLCAvdXNyL2xvY2FsL2xpYiwgZXRjKSwKK3RoZW4gZG86CisJbWFrZSBpbnN0YWxsCisKKyhJZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBkZXRlcm1pbmUgeW91ciB0eXBlIG9mIGNvbXB1dGVyLCBnaXZlIGl0Cit0aGUgbmFtZSBhcyBhbiBhcmd1bWVudCwgZm9yIGluc3RhbmNlIGBgLi9jb25maWd1cmUgc3VuNCcnLiAgWW91IGNhbgordXNlIHRoZSBzY3JpcHQgYGBjb25maWcuc3ViJycgdG8gdGVzdCB3aGV0aGVyIGEgbmFtZSBpcyByZWNvZ25pemVkOyBpZgoraXQgaXMsIGNvbmZpZy5zdWIgdHJhbnNsYXRlcyBpdCB0byBhIHRyaXBsZXQgc3BlY2lmeWluZyBDUFUsIHZlbmRvciwKK2FuZCBPUy4pCisKK0lmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29tcGlsZXIgb24geW91ciBzeXN0ZW0sIGl0IGlzIG9mdGVuIGJlc3QgdG8KK2V4cGxpY2l0bHkgc2V0IENDIGluIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUgcnVubmluZyBjb25maWd1cmUsIGFuZCB0bworYWxzbyBzZXQgQ0Mgd2hlbiBydW5uaW5nIG1ha2UuICBGb3IgZXhhbXBsZSAoYXNzdW1pbmcgc2gvYmFzaC9rc2gpOgorCisJQ0M9Z2NjIC4vY29uZmlndXJlCisJbWFrZQorCitBIHNpbWlsYXIgZXhhbXBsZSB1c2luZyBjc2g6CisKKwlzZXRlbnYgQ0MgZ2NjCisJLi9jb25maWd1cmUKKwltYWtlCisKK011Y2ggb2YgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZW5jbG9zZWQgaXMgY29weXJpZ2h0IGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBvcgorQ09QWUlORy5MSUIgaW4gdGhlIHZhcmlvdXMgZGlyZWN0b3JpZXMsIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGVybXMgdW5kZXIgd2hpY2ggeW91IGNhbiBjb3B5IHRoZSBmaWxlcy4KKworUkVQT1JUSU5HIEJVR1M6IEFnYWluLCBzZWUgZ2RiL1JFQURNRSwgYmludXRpbHMvUkVBRE1FLCBldGMuLCBmb3IgaW5mbworb24gd2hlcmUgYW5kIGhvdyB0byByZXBvcnQgcHJvYmxlbXMuCmRpZmYgLS1naXQgYS9iZmQvQ09QWUlORyBiL2JmZC9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nIGIvYmZkL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE1YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL0NoYW5nZUxvZwpAQCAtMCwwICsxLDMwNjYgQEAKKzE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtbWNvcmUuYyAoY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG9zLgorCitGcmkgQXByIDI4IDE2OjM2OjE5IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluY2x1ZGUgcmVsb2NhdGlvbiBhZGRlbmQKKwlpbiByZWxvY2F0aW9uIGNhbGN1bGF0aW9uLgorCisxOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KKworMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1tY29yZS5jOiBBZGQgc3VwcG9ydCBmb3IgbWNvcmUgcmVsb2NzLgorCisxOTk5LTA0LTIwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBTY3JhcCB0aGUKKwlpbmNvcnJlY3QgdXNlIEVGX01JUFNfeHhCSVRQVFJTLgorCisxOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KKworCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwKKwl2YXJpYWJsZSBpbnNuLgorCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKworU2F0IEFwciAxNyAyMDo1NToxNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKyAKKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmVtb3ZlIEFSTTI2RCB0cmFuc2Zvcm0uCisJKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIEFSTTI2RCB0cmFuc2Zvcm0uICBPbmx5CisJY2hhbmdlIHRvIEFSTTI2RCBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgorCisxOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCisJKGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KKworMTk5OS0wNC0xNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgRm9yIFJfQVJNX1RITV9BQlM1LAorCXJlZmV0Y2ggYWRkZW5kIGlmIFVTRV9SRUwsIGFkZCBtYW55IGNvbW1lbnRzIHJlZ2FyZGluZyBjdXJyZW50IHN0YXRlLgorCUZvciBSX0FSTV9USE1fUEMyMiwgcmVmZXRjaCBhZGRlbmQgaWYgVVNFX1JFTCwgc2ltcGxpZnkuCisJKiBlbGZhcm0tbmFiaS5jIChlbGYzMl9hcm1faG93dG9fdGFibGUpOiBGb3IgUl9BUk1fVEhNX0FCUzUsIGZpeAorCXNpemUgYW5kIHJpZ2h0c2hpZnQuICBGb3IgUl9BUk1fVEhNX1BDMjIsIGZpeCBiaXRzaXplLgorCSogZWxmYXJtLW9hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogRGl0dG8uCisKK1dlZCBBcHIgMTQgMTQ6MzM6MDggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFplcm8gYGRlYnVnJy4KKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyk6IExpa2V3aXNlLgorCisxOTk5LTA0LTEzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KKworCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0CisJc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KKwkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KKwkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KKworVHVlIEFwciAxMyAyMToyNzoxOSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogTmV3IHJvdXRpbmUuCisJKEEyVDNfT0ZGU0VUKTogRGVmaW5lLgorCShUMkEzX09GRlNFVCk6IERlZmluZS4KKwkoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBFbWl0IGJhc2UgZmlsZSBlbnRyaWVzIGZvciBpbnRlcndvcmtpbmcKKwlzdHVicy4KKworMTk5OS0wNC0xMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KKworCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogQWRkIGR1bW15IGVudHJpZXMgZm9yCisJcmVsb2NzIDE3IHRocm91Z2ggMTkuCisKK1N1biBBcHIgMTEgMDE6MjU6MTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oOiBSZW1vdmUgZm5tYXRjaC5oLgorCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBDYWxsIGJhY2sgdG8gbGQKKwlpbnN0ZWFkIG9mIGNhbGxpbmcgZm5tYXRjaC4KKworCSogY29uZmlnLmJmZCAoaT84Ni0qLWJlb3NlbGYpOiBJbmNsdWRlIHBlIHZlY3MuCisKK1N1biBBcHIgMTEgMDE6MTQ6MDYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFsbG93IC5wbHQKKwl0byBnbyBtaXNzaW5nLgorCisxOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBNaW5kIG5vX3VuZGVmaW5lZAorCXdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgZHluYW1pYyBzeW1ib2wgcmVmZXJlbmNlcy4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KKworU2F0IEFwciAxMCAxNToxMjowOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IE5ldyBmdW5jdGlvbiBtb3ZlZCBmcm9tCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0KTogLi4uIGhlcmUuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBpdC4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogYmZkLWluMi5oOiBVcGRhdGUuCisKKzE5OTktMDQtMDkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBlbGY2NC1zcGFyYy5jOiBGaXggaW5jb3JyZWN0IGNhbGxzIHRvIGJmZF9jaGVja19vdmVyZmxvdy4KKworMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUtcGUgdGFyZ2V0cy4KKwkqIGNwdS1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUgdGFyZ2V0cy4KKwkqIGVsZjMyLW1jb3JlLmM6IE5ldyBGaWxlOiBTdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgorCSogcGUtbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZSB0YXJnZXQuCisJKiBwZWktbWNvcmUuYzogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBtY29yZS1wZWkgdGFyZ2V0LgorCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgYXJjaGl0ZWN0dXJlLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLiAKKwkqIGNvZmZjb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXRzLgorCSogZWxmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgorCSogcmVsb2MuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHJlbG9jcy4KKwkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCisKKzE5OTktMDQtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvcgorCVJfQVJNX1hQQzI1IGFuZCBSX0FSTV9USE1fWFBDMjIuCisJKGVsZjMyX2FybV9yZWxvY19tYXApOiBSZW1vdmUgcmVkdW5kYW50IGVudHJpZXMuCisKKzE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBzeXNkZXAuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCisKKzE5OTktMDQtMDYgIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+CisKKwkqIHJlbG9jLmMgKGJmZF9jaGVja19vdmVyZmxvdyk6IEFkZCBhZGRyc2l6ZSBwYXJhbWV0ZXIuICBDaGFuZ2UKKwlhbGwgY2FsbGVycy4gIFJld3JpdGUgY29tcGxldGVseS4KKwkoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IFJld3JpdGUgb3ZlcmZsb3cgY2hlY2tpbmcuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKKzE5OTktMDQtMDUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJRnJvbSBHYWJyaWVsIFBhdWJlcnQgPHBhdWJlcnRAaXJhbS5lcz46CisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBTZXQgUl9QUENfR09UMTZfTE8sCisJUl9QUENfUExUMTZfTE8gYW5kIFJfUFBDX1NFQ1RPRkZfTE8gdG8gYmUgY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KKwlTZXQgUl9QUENfUExUMTZfSEEsIFJfUFBDX1NFQ1RPRkZfSEEgYW5kIFJfUFBDX0VNQl9OQUREUjE2X0hBIHRvCisJaGF2ZSBhIHJpZ2h0c2hpZnQgb2YgMTYgYW5kIHVzZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYy4KKwkqIHBwY2Jvb3QuYyAocHBjYm9vdF92ZWMpOiBVc2UgbGl0dGxlIGVuZGlhbiByb3V0aW5lcyBmb3IKKwloZWFkZXJzLgorCisJKiBlbGYuYyAoZWxmY29yZV9zdHJuZHVwKTogT25seSBkZWZpbmUgaWYgaXQgd2lsbCBiZSB1c2VkLgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGlyZWwKKwlhbmQgaXJlbGVuZC4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCisJKHBwY19lbGZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCisKKwlGcm9tIEJlcm5kIE5pdHpsZXIgPG5pdHpsZXJAa2FnY3BkMDEuYWcwMS5rb2Rhay5DT00+OgorCSogc3JlYy5jIChzcmVjX3NjYW4pOiBBY2NlcHQgXHIgaW4gc3ltYm9sIGRlZmluaXRpb25zLgorCShzcmVjX29iamVjdF9wKTogU2V0IEhBU19TWU1TIGlmIHdlIHNhdyBhbnkgc3ltYm9scy4KKwkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLgorCisxOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KKworCSogY29uZmlnLmJmZDogQWRkIG1pcHMqZWwtKi12eHdvcmtzKiBhbmQgbWlwcyotKi12eHdvcmtzKi4KKworMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIGR3YXJmMS5jIChwYXJzZV9saW5lX3RhYmxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgbGFzdF9wYyBhbmQKKwlsYXN0X2xpbmUuCisJKiBlbGYtYmZkLmggKF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcik6IERlY2xhcmUuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KKwlzd2l0Y2guCisJKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUmVtb3ZlIHVudXNlZAorCWxvY2FsIGkuCisJKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogUmVtb3ZlIHVudXNlZAorCWxvY2FsIHZhbC4KKworMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KKwkqIGNvZmYtYXJtLmM6IEFsbG93IGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCisJVEFSR0VUX1VOREVSU0NPUkUgYW5kIFVTRVJfTEFCRUxfUFJFRklYLgorCSogcGUtYXJtLmg6IEFsbG93IHByZXZpb3VzIGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCisJVEFSR0VUX0xJVFRMRV9TWU0gYW5kIFRBUkdFVF9CSUdfU1lNLgorCSogcGVpLWFybS5oOiBBbGxvdyBwcmV2aW91cyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZiAKKwlUQVJHRVRfTElUVExFX1NZTSBhbmQgVEFSR0VUX0JJR19TWU0uCisJKiBlcG9jLXBlLWFybS5jOiBOZXcgZmlsZS4gIFN1cHBvcnQgYXJtLWVwb2MtcGUgdGFyZ2V0LgorCSogZXBvYy1wZWktYXJtLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBhcm0tZXBvYy1wZWkgdGFyZ2V0LgorCQorMTk5OS0wMy0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGVsZl9tYXBfc3ltYm9scyk6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzZWN0aW9uCisJc3ltYm9scyBhcmUgZ2VuZXJhdGVkIGZvciBjb250ZW50LWxlc3Mgc2VjdGlvbnMgd2hpY2ggYXJlCisJbm90IG1hcHBlZCB0byB0aGUgb3V0cHV0IGZpbGUuCisKKwkqIGxpbmtlci5jOiBSZXBsYWNlIGRpcmVjdCByZWZlcmVuY2VzIHRvIGZpZWxkcyBpbiBCRkQgc3RydWN0dXJlCisJd2l0aCBhY2Nlc3NvciBtYWNyb3MuCisKKwkqIGVsZmxpbmsuaDogUmVwbGFjZSBkaXJlY3QgcmVmZXJlbmNlcyB0byBmaWVsZHMgaW4gQkZEIHN0cnVjdHVyZQorCXdpdGggYWNjZXNzb3IgbWFjcm9zLgorCisxOTk5LTAzLTI1ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KKworCSogY29uZmlnLmJmZDogRWxpbWluYXRlIHJlZHVuZGFuY3kgaW4gY2hlY2tzIGZvciBMaW51eC9BUk0uCisJCisJKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBUYWtlIHRoZSByaWdodHNoaWZ0IGludG8gCisJYWNjb3VudCB3aGVuIGFkanVzdGluZyBzZWN0aW9uIHN5bWJvbHMgZHVyaW5nIGEgcGFydGlhbCBsaW5rLgorCisxOTk5LTAzLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLXNwYXJjLmMgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkCisJICAnYmZkX3JlbG9jX3ZhbCcgdG8gYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgorCSogZWxmLW0xMDIwMC5jIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOiBEaXR0by4KKwkqIGVsZi1tMTAzMDAuYyAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTogRGl0dG8uCisJKiBlbGYzMi1hcmMuYyAoc3RydWN0IGFyY19yZWxvY19tYXApOiBEaXR0by4KKwkqIGVsZjMyLWQxMHYuYyAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTogRGl0dG8uCisJKiBlbGYzMi1kMzB2LmMgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk6IERpdHRvLgorCSogZWxmMzItZnIzMC5jIChzdHJ1Y3QgZnIzMF9yZWxvY19tYXApOiBEaXR0by4KKwkqIGVsZjMyLW0zMnIuYyAoc3RydWN0IG0zMnJfcmVsb2NfbWFwKTogRGl0dG8uCisJKiBlbGYzMi1zaC5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgorCSogZWxmMzItc3BhcmMuYyAoc3RydWN0IGVsZl9yZWxvY19tYXApOiBEaXR0by4KKwkqIGVsZjMyLXY4NTAuYyAoc3RydWN0IHY4NTBfcmVsb2NfbWFwKTogRGl0dG8uCisJKiBlbGY2NC1zcGFyYy5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgorCSogZWxmYXJtLW5hYmkuYyAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOiBEaXR0by4KKwkqIGVsZmFybS1vYWJpLmMgKHN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwKTogRGl0dG8uCisKKzE5OTktMDMtMTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2hhbmdlZCB0aGlzCisJZnVuY3Rpb24gc28gc291cmNlLWxldmVsIGFzc2VtYmx5IHdvcmtzLiAgSWYgbXVsdGlwbGUgTl9TT3MKKwlhcmUgc2VlbiB3aXRob3V0IGFuZCBOX0ZVTnMsIGNyZWF0ZSBhbiBpbmRleHRhYmxlIGVudHJ5IHdpdGgKKwlhIE5VTEwgZnVuY3Rpb24gbmFtZS4KKworMTk5OS0wMy0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBBbGxvdyBtZXJnaW5nCisJb2YgY2VydGlhbiBzaW1pbGFyIGNwdXMuCisKKzE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6CisJQWRkIHRoZSA1MDAwLiAgQ2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoZSA1NDAwIHRvIG1pcHM0LgorCShlbGZfbWlwc19tYWNoKTogQWRkIHI1MDAwLgorCisxOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNwdS1pOTYwLmMgKHNjYW5faTk2MF9tYWNoKTogUmVjb2duaXplIGk5NjA6a2Ffc2EgYW5kIGk5NjA6a2Jfc2IuCisKKzE5OTktMDMtMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBHZW5lcmF0ZSB3YXJuaW5nIGFib3V0CisJaHVnZSBmaWxlIG9mZnNldHMgZm9yIGFueSBzZWN0aW9uIHRoYXQgd2lsbCBvY2N1cHkgZmlsZSBzcGFjZSwgbm90CisJanVzdCB0aG9zZSB0aGF0IGFyZSBsb2FkYWJsZS4KKworMTk5OS0wMi0yNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBsaWJiZmQuaDogUmVnZW5lcmF0ZSBhZnRlciBOaWNrIENsaWZ0b24ncyBGZWIgMTcgY2hhbmdlcy4KKworMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jOiBBZGQgcHBjX2VsZl9yZWxheF9zZWN0aW9uKCkgZm9yIHRoZSBsZCBvcHRpb24gbXBjODYwYzAuCisKK01vbiBGZWIgMjIgMTg6MjY6NTEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYtYmZkLmggKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk6IERlZmluZS4KKwkqIGVsZmxpbmsuaDogUmV2ZXJ0IGFsbCBjaGFuZ2VzIHNpbmNlIEZlYiAxNi4gIEluc3RlYWQ6CisJKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZsYWcgaWYKKwlhcHByb3ByaWF0ZS4gIENvcHkgaXQgdG8gdmVyc2lvbiBzeW1ib2xzLgorCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciBub24gRUxGCisJc3ltYm9scyBpZiBhcHByb3ByaWF0ZS4KKwkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNldCBSRUZfUkVHVUxBUl9OT05XRUFLIGZvciB3ZWFrZGVmCisJc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSWYgc3ltYm9sIGlzIG1hcmtlZCBhcyB1bmRlZmluZWQsIGFuZAorCWhhcyBubyBub253ZWFrIHJlZmVyZW5jZXMsIG1hcmsgaXQgYXMgd2VhayB1bmRlZmluZWQuCisKK0ZyaSBGZWIgMTkgMTY6MDE6MTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkeW5hbWljCisJZGVmaW5pdGlvbiB3aXRoIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLCBzZXQgTkVFRFNfUExUIGlmIGl0IGlzIGEKKwlmdW5jdGlvbi4KKwkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY29weSB0aGUgb3RoZXIgZmllbGQgaWYgd2UKKwlhcmUgb3ZlcnJpZGRpbmcuCisKK1RodSBGZWIgMTggMTg6MDc6NDMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBEbyBub3QgbWVyZ2UgYW55IHN5bWJvbCBmcm9tIGEKKwlzaGFyZWQgb2JqZWN0IHdpdGggYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuCisKKzE5OTktMDItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZmFybS1uYWJpLmM6IFNldCBwYXJ0aWFsX2lucGxhY2UgYmFjayB0byBmYWxzZS4KKworMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZS1lbmFibGUuCisJKFVTRVJfTEFCRUxfUFJFRklYKTogU2V0IHRvICJfIi4KKworCVRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbTogU2NvdHQgQmFtYnJvdWdoCisJPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KKwkKKwkqIGxpYmFvdXQuaCAoTV9BUk02X05FVEJTRCk6IFNldCB0byAxNDMuCisKKwkqIHJlbG9jLmM6IEFkZCBBUk0gUElDIHJlbG9jczogICBCRkRfUkVMT0NfQVJNX0dPVDEyLAorCUJGRF9SRUxPQ19BUk1fR09UMzIsIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULCBCRkRfUkVMT0NfQVJNX0NPUFksCisJQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwgQkZEX1JFTE9DX0FSTV9QTFQzMiwKKwlCRkRfUkVMT0NfQVJNX1JFTEFUSVZFLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiwgQkZEX1JFTE9DX0FSTV9HT1RQQy4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KKworCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogU2V0IHBhcnRpYWxfaW5wbGFjZSB0bworCSd0cnVlJyBhcyBSRUwgcmVsb2NzIGFyZSBub3cgYmVpbmcgdXNlZC4gIEFkZCBuZXcgUElDIHJlbG9jczoKKwlSX0FSTV9DT1BZLCBSX0FSTV9HTE9CX0RBVCwgUl9BUk1fSlVNUF9TTE9ULCBSX0FSTV9SRUxBVElWRSwKKwlSX0FSTV9HT1RPRkYsIFJfQVJNX0dPVFBDLCBSX0FSTV9HT1QzMiwgUl9BUk1fUExUMzIuCisKKwkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoZWNrIGJ5dGUgb3JkZXIKKwlvZiB0YXJnZXRzLgorCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IENoYW5nZSBwYXJhbWV0ZXJzIHNvIHRoYXQgZW50aXJlCisJcmVsb2MgaXMgcGFzc2VkLiAgQWRkIHN1cHBvcnQgZm9yIFBJQyByZWxvY3MuCisJKGVsZjMyX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogUGFzcyBlbnRpcmUgcmVsb2MgdG8KKwllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZS4gCisJKGVsZjMyX2FybV9jaGVja19yZWxvY3MpOiBIYW5kbGUgbmV3IFBJQyByZWxvY3MuCisJKGVsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcyk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgorCShFTEZfTUFYUEFHRV9TSVpFKTogRGVmaW5lLgorCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgorCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgorCShlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEZWZpbmUuCisJKGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgorCShlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEZWZpbmUuCisJKGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgorCShlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCisJKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IERlZmluZS4KKwkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0KTogRGVmaW5lLgorCShlbGZfYmFja2VuZF93YW50X3BsdF9zeW0pOiBEZWZpbmUuCisJCitXZWQgRmViIDE3IDEyOjAyOjI2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIHJlZ2luZm8KKwlzZWN0aW9ucyBTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRS4KKwkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCisKK1dlZCBGZWIgMTcgMTI6MDc6MjMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgorIAorICAgICAgICAqIGVsZmFybS1vYWJpLmMgKGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zLAorICAgICAgICBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZywKKyAgICAgICAgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVmaW5lIHRvIGF2b2lkIGNsYXNoCisgICAgICAgIHdpdGggZWxmYXJtLW5hYmkuYy4KKyAKKyAgICAgICAgKiBlbGYzMi1hcm0uaDogRG9uJ3QgZGVjbGFyZSBlbGYzMl9hcm1faW5mb190b19ob3d0by4KKyAgICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViLCBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiwKKyAgICAgICAgZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTWFrZSB0aGVtIHN0YXRpYy4KKworVHVlIEZlYiAxNiAyMjo0NDozNyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEFkZCBwZmxhZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAorCWNhbGxlcnMuICBEbyBub3QgbWVyZ2UgYSBkZWZpbml0aW9uIGZyb20gYSBzaGFyZWQgb2JqZWN0IHdpdGggYQorCXdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KKwkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IGNoYW5nZSB0aGUgc3ltYm9sIHR5cGUgb3IKKwlzaXplIGlmIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyB0aGUgbmV3IG9uZS4KKworMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCisKK01vbiBGZWIgIDggMTE6MTg6MTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgorCisJKiBlbGYzMi1tNjhrLmMgKHJlbG9jX21hcCk6IFVzZSB0aGUgY29ycmVjdCB0eXBlcyBmb3IgdGhlIHN0cnVjdAorCWZpZWxkcyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGNoYXIuCisKK0ZyaSBGZWIgIDUgMDA6MjI6MzYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVGh1IEZlYiAgNCAyMjozMDoxMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgorCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KKwlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCisJKiBhY2luY2x1ZGUubTQ6IEFkZCBjb21tZW50cyB0byB1c2VzIG9mIEFDX0RFRklORS4KKwkqIGFjY29uZmlnLmg6IFJlbW92ZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCisJKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KKwkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCisKKzE5OTktMDItMDQgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgorCisJKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogZG9uJ3QgY2FsbCBmcmVhZCBmb3IgemVybyBieXRlcy4gIFRoaXMKKwljb3ZlcnMgdXAgYSBidWcgKG9yIG1pc3VzZSBvZiBiZmQpIHRoYXQncyBleHBvc2VkIGJ5IFNvbGFyaXMuCisKK1RodSBGZWIgIDQgMTI6Mzg6MTAgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluc3VyZSB0aGF0IHRoZSB0YXJnZXQKKwlvZiBhIGp1bXAgaXMgaW4gdGhlIGN1cnJlbnQgMjU2IE1CIHJlZ2lvbi4KKworVGh1IEZlYiAgNCAxMjoxNTozOCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDaGFuZ2UgbGFzdCBwYXRjaCB0byBvbmx5CisJdGFrZSBlZmZlY3QgZm9yIHRoZSBiaW5hcnkgdGFyZ2V0LgorCitXZWQgRmViICAzIDE5OjQwOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KKworV2VkIEZlYiAgMyAxNTowMjo0NCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3IHJvdXRpbmUuCisKK1R1ZSBGZWIgIDIgMjE6Mzg6MjggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSWYgdGhlIHRhcmdldCB3YXMKKwlwcmV2aW91c2x5IHNwZWNpZmllZCwgZG9uJ3QgY2hlY2sgb3RoZXIgdGFyZ2V0cyB3aGVuIGNoZWNraW5nIGZvcgorCWFuIGFyY2hpdmUgZmlsZS4KKworVHVlIEZlYiAgMiAxODoxNjo0MyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIFJlbW92ZWQuCisgICAgICAgIChlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgUmVtb3ZlZAorICAgICAgICAqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgorICAgICAgICAoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIE5ldy4KKyAgICAgICAgKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIE5ldy4KKyAgICAgICAgKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBOZXcuCisKK01vbiBGZWIgIDEgMTk6NDk6MjEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGZhcm0tbmFiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1uZXdhYmkuYy4KKyAgICAgICAgKiBlbGZhcm0tb2FiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1vbGRhYmkuYworICAgICAgICAqIE1ha2VmaWxlLmFtOiAgVXNlIG5ldyBmaWxlcy4KKyAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCisgICAgICAgICogY29uZmlndXJlLmluOiAgVXNlIG5ldyBmaWxlcy4KKyAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLiAgICAgICAKKworMTk5OS0wMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcgZnVuY3Rpb24uCisJKGZyMzBfZWxmX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb24uCisJKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KKworTW9uIEZlYiAgMSAxMjoyMTo0NyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiAgQWRkIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKKyAgICAgICAgYW5kIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMuCisKK01vbiBGZWIgIDEgMTE6NDY6MzEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBNYWtlZmlsZS5hbSAoZWxmMzItYXJtLW9sZGFiaS5sbyk6ICBOZXcuCisgICAgICAgIChlbGYzMi1hcm0tbmV3YWJpLmxvKTogIE5ldy4KKyAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCisgICAgICAgICogY29uZmlnLmJmZCAodGh1bWItKi1lbGYpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGFyZ191bmRlcnNjb3JlLgorICAgICAgICAoYXJtLSotZWxmKTogIExpa2V3aXNlLgorICAgICAgICAoYXJtLSotb2FiaSk6ICBOZXcuCisgICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgorICAgICAgICAqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUuCisgICAgICAgICogY29uZmlndXJlLmluIChiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjKTogIE5ldy4KKyAgICAgICAgKGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpOiAgTmV3LgorICAgICAgICAqIGVsZjMyLWFybS1uZXdhYmkuYzogIE5ldy4KKyAgICAgICAgKiBlbGYzMi1hcm0tb2xkYWJpLmM6ICBOZXcuCisgICAgICAgICogZWxmMzItYXJtLmM6ICBSZW1vdmVkLgorICAgICAgICAqIGVsZjMyLWFybS5oOiAgTmV3LgorCitNb24gRmViICAxIDExOjUyOjEyIDE5OTkgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBPbWl0IHdhcm5pbmdzIGZvcgorCXVubG9hZGFibGUgc2VjdGlvbnMuCisKKzE5OTktMDEtMzEgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0tKi12eHdvcmtzKik6IEFkZCBhbGlhc2VzIHRvCisJcG93ZXJwY3ssbGV9LSotZWFiaS4KKworMTk5OS0wMS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZHdhcmYyLmMgKHJlYWRfdW5zaWduZWRfbGViMTI4KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCisJKiBkd2FyZjIuYyAocmVhZF9zaWduZWRfbGViMTI4KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCisKK0ZyaSBKYW4gMjkgMDA6NDc6MjEgMTk5OSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgorCisJKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IE9ubHkgYWRqdXN0CisJcF9hbGlnbiB3aGVuIG5lZWRlZC4KKworVGh1IEphbiAyOCAyMDowNToyMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCByZXR1cm4gZWFybHkgZm9yIGEKKyAJbm9uLWxvYWRhYmxlIHNlY3Rpb24sIGluIGNhc2UgdGhlIGZpcnN0IHNlY3Rpb24gaXMgbm9uLWxvYWRhYmxlLgorICAJRG9uJ3Qgc2V0IHRoZSBsb3cgbG1hIGZvciBhIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24uICBGcm9tIE1hY2llagorCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgorCisxOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfbWFwKTogQWRkIFJfRlIzMF9HTlVfVlRJTkhFUklUIGFuZAorCVJfRlIzMF9HTlVfVlRFTlRSWSByZWxvY3MuCisKK1RodSBKYW4gMjggMTE6MDg6MTYgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X3N5bSk6ICBaZXJvIHN5bXMgd2hpY2ggYXJlCisgICAgICAgcGFydCBvZiBzZWN0aW9ucyB3aGljaCBoYXZlIGJlZW4gZXhjbHVkZWQuCisKK1dlZCBKYW4gMjcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2VkIEZfUElDCisJdG8gRl9QSUNfSU5ULgorCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW1vdmVkIEZfQVJNXzJhIGFuZAorCUZfQVJNXzNNIGxhYmVscy4gIENoYW5nZWQgRl9QSUMgdG8gRl9QSUNfSU5ULgorCQorMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IEZpeCBuYW1lIG9mIFJfRlIzMF80OAorCXJlbG9jYXRpb24uIAorCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2UgY29tcHV0ZWQgdmFsdWUgYXMgcmVzdWx0IG9mCisJcmVsb2NhdGlvbi4gCisKKzE5OTktMDEtMjYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBFbWl0IHdhcm5pbmcgZm9yCisJaHVnZSBmaWxlIG9mZnNldHMgZHVlIHRvIHdpZGVseS1kaXNwZXJzZWQgc2VjdGlvbiBMTUFzLgorCitNb24gSmFuIDE4IDAzOjM1OjM1IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBub3QgRF9QQUdFRCwKKwlhbGlnbiBmaXJzdCBzZWN0aW9uIHRvIGxhcmdlc3Qgc2VjdGlvbiBhbGlnbm1lbnQsIG5vdCBmaXJzdAorCXNlY3Rpb24gYWxpZ25tZW50LgorCisxOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgorCitUdWUgRGVjIDIyIDE1OjIxOjQxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCk6ICBEZWZpbmUuCisgICAgICAgICogYmZkLWluMi5oOiAgTGlrZXdpc2UuCisgICAgICAgICogY3B1LWkzODYuYyAoYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgpOiAgTmV3LgorCisxOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogYXJjaHVyZXMuYyxiZmQtaW4yLmggKGJmZF9tYWNoX21pcHM0MTExKTogTmV3LgorCSogY3B1LW1pcHMuYzogQWRkIHN1cHBvcnQgZm9yIGFuZCBpbmRlcGVuZGVudCA0MTExLgorCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogRV9NSVBTX01BQ0hfNDExMSAtPiBiZmRfbWFjaF9taXBzNDExMS4KKwkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogCisJYmZkX21hY2hfbWlwczQxMTEgLT4gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTEuCisKKzE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2FiaV9uYW1lKTogTmV3LgorCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDb21wYXJlIEVGX01JUFNfQUJJIGZsYWdzLgorCisxOTk4LTEyLTEyICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiAKKwlIYW5kbGUgYmZkX21hY2hfbWlwczQzMDAuCisKKzE5OTgtMTItMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBlbGYzMi1pMzg2LmM6IFJlbW92ZSBsZWFrZWQgZGV2ZWxvcG1lbnQgY29kZSBmcm9tIHBhdGNoCisJMTk5OC0xMi0xMCBieSBSaWNoYXJkIEhlbmRlcnNvbi4KKworMTk5OC0xMi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZmFpbCByZWxvY2F0aW9ucworCWluIGRlYnVnIHNlY3Rpb25zIGZvciBzeW1ib2wgZGVmaW5lZCBleHRlcm5hbGx5LgorCitUaHUgRGVjIDEwIDEwOjU4OjM4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgZm9yCisJdGVraGV4X3ZlYy4KKworMTk5OC0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IFNldCBzcmNfbWFzayBmaWVsZHMgdG8gMAorCXNpbmNlIHdlIGFyZSB1c2luZyBSRUxBcy4KKworVHVlIERlYyAgOCAyMjoxNTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlTQ08gT3BlbiBTZXJ2ZXIgUmVsZWFzZSA1IGNvcmUgZmlsZSBzdXBwb3J0LCBmcm9tIEpvdWtlIE51bWFuCisJPGpudW1hbkBoaXNjb20ubmw+OgorCSogc2NvNS1jb3JlLmM6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1zY28zLjJ2NSopOiBVc2Ugc2NvNS1jb3JlLmxvLgorCShzY281LWNvcmUubG8pOiBEZWZpbmUgU0NPNV9DT1JFIGluIENPUkVGTEFHLgorCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShPUFRJT05BTF9CQUNLRU5EUyk6IEFkZCBzY281LWNvcmUubG8uCisJKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzY281LWNvcmUuYy4KKwkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBzY281X2NvcmVfZGF0YSBmaWVsZCB0byB0ZGF0YS4KKwkqIHRhcmdldHMuYyAoc2NvNV9jb3JlX3ZlYyk6IEFkZCB0byB0YXJnZXQgbGlzdCBpZiBTQ081X0NPUkUuCisJKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1R1ZSBEZWMgIDggMTk6Mzg6NDIgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgorCisJKiBjb25maWcuYmZkIChocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW46IEFkZCBBQ19IRUFERVJfRElSRU5ULgorCShocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaG9zdCAoaHBwYSotKi1tcGVpeCopOiBOZXcgaG9zdC4KKwkqIGhwdXgtY29yZS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4gIFVzZSBIQVZFX0RJUkVOVF9IIGFuZAorCWZyaWVuZHMgcmF0aGVyIHRoYW4ganVzdCBpbmNsdWRpbmcgPHN5cy9kaXIuaD4uCisJKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgaHBwYV9wcml2X2xldmVsIGFuZCBhcHRvCisJdGNfZGF0YS4gIENoYW5nZSBhbGwgdXNlcnMuCisJKHN0cnVjdCBzb21kYXRhKTogQWRkIGNvbXBfdW5pdCBmaWVsZC4KKwkob2JqX3NvbV9jb21waWxhdGlvbl91bml0KTogRGVmaW5lLgorCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml4KTogRGVjbGFyZS4KKwkqIHNvbS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4KKwkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogQWRkIG5ldyBmaWVsZCBwcml2X2xldmVsLgorCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGN1cnJlbnRfb2Zmc2V0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCShzZXR1cF9zZWN0aW9ucyk6IExpa2V3aXNlLgorCShzb21fb2JqZWN0X3ApOiBGb3IgRVhFQ0xJQk1BR0lDLCByZWFkIHRoZSBsc3QgaGVhZGVyLgorCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBBZGQgY29tcGlsYXRpb25fdW5pdCBwYXJhbWV0ZXIuCisJQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSBvdXQgY29tcGlsYXRpb25fdW5pdC4KKwkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFNldCBwcml2X2xldmVsLgorCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4KKwkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBzeW1ib2wgcHJpdl9sZXZlbC4KKwkoYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBTZXQgeGxlYXN0IGZpZWxkIHRvIDMuICBTZXQKKwlwcml2X2xldmVsIGludG8gc3ltYm9sX3ZhbHVlLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisKK1R1ZSBEZWMgIDggMTY6MjE6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hhbmdlIGNhbGwgdG8gbm9uZXhpc3RlbnQKKwl3YXJuaW5nIGZ1bmN0aW9uIHRvIGNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGluc3RlYWQuCisKKwkqIGxpYmJmZC5jIChDT0VSQ0UzMik6IENhc3QgdGhyb3VnaCB1bnNpZ25lZCBsb25nIGFuZCBsb25nIHRvCisJYXZvaWQgYnVnIGluIG9sZCB2ZXJzaW9uIG9mIGdjYy4KKworCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW1vdmUuCisJKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgorCisxOTk4LTEyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBQQyByZWxhdGl2ZQorCXJlbG9jYXRpb25zIHRvIGluY2x1ZGUgb2Zmc2V0IG9mIDIgaW5jbHVkZWQgaW4gdGhlIGluc25zLCBhbmQgdGhlCisJb2Zmc2V0IG9mIHRoZSByZWxvY3Mgd2l0aGluIHRoZSBzZWN0aW9uLgorCitXZWQgRGVjICAyIDE1OjAzOjU5IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBEYXZpZCBUYXlsb3IKKyAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiwgRWRpdGggRXBzdGVpbgorIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+LCBKaW0gQmxhbmR5CisgCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4sIGFuZCBFbGVuYSBaYW5ub25pCisgCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiB0aGUgcHJvamVjdCB0byBtZXJnZSBpbgorIAljaGFuZ2VzIG9yaWdpbmFsbHkgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nCisgCWVudHJpZXMuCisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbHQgdXNpbmcgbGF0ZXN0CisgCWF1dG9tYWtlIG1hY3JvIGxpYnJhcnkuCisKKwkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiB0aGlzIGZ1bmN0aW9uIG5vdworIAl1bmRlcnN0YW5kcyBIUFVYIDEwLjMwIHRocmVhZCBpbmZvLiBZZXMsIHRoZSB0aHJlYWQgc3RhY2tzIGNhbiBiZQorIAlmb3VuZCBpbiB0aGUgY29yZWZpbGUhIEFsc28sIGluIGhwdXhfY29yZV9jb3JlX2ZpbGVfcCwgaWYgd2UKKyAJZW5jb3VudGVyIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZSwgZG9uJ3QgcHVudC4gIEluc3RlYWQsCisgCWp1c3Qgc2tpcCBpdC4gIEFsc28sIGNvdW50IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgb2Yga25vd24gdHlwZQorIAl0aGF0IHdlIGVuY291bnRlci4gIElmIHdlIGVuY291bnRlciBhdCBsZWFzdCBvbmUgZ29vZCBvbmUsIHRoZW4KKyAJd2UnbGwgZGVjbGFyZSB0aGF0IHRoZSBmaWxlIGlzIGEgY29yZSBmaWxlLiAgSWYgd2UgZW5jb3VudGVyIGFueQorIAl1bmtub3duIG9uZXMgYnV0IHNvbWUga25vd24gb25lcywgdGhlbiB3ZSdsbCBpc3N1ZSBhIHdhcm5pbmcgKGJ1dAorIAlzdGlsbCBkZWNsYXJlIGl0IHRvIGJlIGEgY29yZSBmaWxlKS4gQWxzbywgY29ycmVjdGx5IGRlY2lkZSB3aGVuIGEKKyAJZmlsZSBpcyBub3QgYSBjb3JlLgorCShQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCk6IGRlZmluZSBpZiBDT1JFX0FOT05fU0hNRU0gZGVmaW5lZC4KKwkoQ09SRV9BTk9OX1NITUVNKTogZGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCShocHV4X2NvcmVfc3RydWN0KTogYWRkIG1lbWJlcnMgbHdwaWQgYW5kIHVzZXJfdGlkLgorCShjb3JlX2tlcm5lbF90aHJlYWRfaWQsIGNvcmVfdXNlcl90aHJlYWRfaWQpOiBuZXcgbWFjcm9zLgorCShtYWtlX2JmZF9hc2VjdGlvbik6IHVzZSBiZmRfYWxsb2MgdG8gYWxsb2NhdGUgcm9vbSBmb3IgYSBjb3B5IG9mCisgCXRoZSBuYW1lIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBiZmQuCisJKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IGhhbmRsZSB0aHJlYWRzLgorCisJKiBsaWJocHBhLmggKEdFVF9GSUVMRCk6IHByb3RlY3QgYWdhaW5zdCByZWRlZmluaXRpb24uCisJKEhQUEFfV0lERSk6IGRlZmluZS4KKwkoR0VUX0ZJRUxEKTogZGVmaW5lLgorCShHRVRfQklUKTogZGVmaW5lLgorCShNQVNLKTogZGVmaW5lLgorCShDQVRFTkFURSk6IGRlZmluZS4KKwkoRUxFVkVOKTogZGVmaW5lLgorCShzaWduX2V4dGVuZCk6IHJlZGVmaW5lLgorCShhc3NlbWJsZV82KTogZGVmaW5lLgorCShhc3NlbWJsZV8xMik6IHJld3JpdGUuCisJKGFzc2VtYmxlXzE2KTogZGVmaW5lLgorCShhc3NlbWJsZV8xNmEpOiBkZWZpbmUuCisJKGFzc2VtYmxlXzE3KTogcmV3cml0ZS4KKwkoYXNzZW1ibGVfMjIpOiBkZWZpbmUuCisKKzE5OTgtMTItMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWZyMzAuYyAoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogVXNpbmcgc2lnbmVkCisJcmVsb2NhdGlvbnMgZm9yIHNpZ25lZCB2YWx1ZXMuCisKK1N1biBEZWMgIDYgMTY6MzA6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzYnNkLmMgKE1ZKHNldF9hcmNoX21hY2gpKTogTWFrZSBzdGF0aWMuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEZvciBiZmRfYXJjaF9taXBzLCB1c2UKKwliZmRfbWFjaF9taXBzKiBtYWNyb3MgcmF0aGVyIHRoYW4gc2ltcGxlIG51bWJlcnMuCisKKwlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0CisJPHNub3diYWxsM0B1c2EubmV0PjoKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIENfV0VBS0VYVC4KKwkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KKwkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBMaWtld2lzZS4KKwkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCisJKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgorCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KKwkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KKworCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsd2F5cyBpbml0aWFsaXplIHRoZQorCWluY2x1ZGVzX3BoZHJzIGZpZWxkLgorCisJKiBlbGZsaW5rLmggKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogQ2hlY2sgZm9yIGNhc2Ugd2hlcmUgYSBub24tRUxGCisJZmlsZSBkZWZpbmVzIGEgc3ltYm9sIGZpcnN0IG1lbnRpb25lZCBpbiBhbiBFTEYgZmlsZS4KKworCSogYmZkLWluLmg6IEFsd2F5cyBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGFuZCBCRkRfSE9TVF9VXzY0X0JJVCBpZgorCXBvc3NpYmxlLCByYXRoZXIgdGhhbiBvbmx5IGlmIEJGRDY0LgorCSogZWxmbGluay5oIChjb21wdXRlX2J1Y2tldF9jb3VudCk6IEp1c3QgY2hlY2sgQkZEX0hPU1RfVV82NF9CSVQsCisJbm90IF9fR05VQ19fLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCisJKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3JyZWN0IHRlc3QgdG8gYXZvaWQKKwlzd2l0Y2hpbmcgdG8gNCBieXRlIGFkZHJlc3NlcyBhZnRlciBzZWVpbmcgYSBzZWNvbmQgc2VjdGlvbiB3aGljaAorCXJlcXVpcmVzIDMgYnl0ZSBhZGRyZXNzZXMuICBGcm9tIEpvZWwgU2NoYW50egorCTxqb2VsLnNjaGFudHpAYXJnb3N5cy5ib2VpbmcuY29tPi4KKworCSogY29uZmlnLmJmZCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKKwk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KKworMTk5OC0xMi0wNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRml4IGxvZ2ljIHRvCisJZGVjaWRlIHdoZXRoZXIgdGhlIG91dHB1dCBmaWxlIGlzIC1tcmVsb2NhdGFibGUtbGliLAorCS1tcmVsb2NhdGFibGUsIG9yIG5laXRoZXIuICAoZ2RiLmJhc2Uvbm9kZWJ1Zy5leHApCisKKzE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWZyMzAuYzogQWRkIHN1cHBvcnQgZm9yIFJfRlIzMF80OCByZWxvYy4KKwkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfRlIzMF80OCByZWxvY2F0aW9uLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgorCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUKKworV2VkIERlYyAgMiAwMDo1ODozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFdhcm4gb24gYW4gYXR0ZW1wdCB0bworCWxpbmsgYWdhaW5zdCBhIGR5bmFtaWMgc3ltYm9sIHdpdGggbm8gdHlwZSBvciBzaXplLgorCisxOTk4LTEyLTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogZWxmMzItaTM4Ni5jIChpMzg2X2NoZWNrX3JlbG9jcykgW1JfMzg2XzMyXTogRG9uJ3QgZW1pdAorCXJlbG9jYXRpb24gZm9yIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgZ2V0IGxvYWRlZC4KKwkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbikgW1JfMzg2XzMyXTogTGlrZXdpc2UuCisKK1R1ZSBEZWMgIDEgMTE6MzM6MzMgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTWFrZSByZWxvY19zaXplLAorCXJlbG9jX2NvdW50IGFuZCBpIGxvbmcgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgSGFuZGxlIGVycm9yCisJcmV0dXJuIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KKworMTk5OC0xMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGV0ZWN0IHRoZSBhYnNlbmNlIG9mCisJYSBoYXNoIHRhYmxlLgorCitNb24gTm92IDMwIDE1OjI4OjA5IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogZWxmMzItc2guYyAoZWxmL3NoLmgpOiBJbmNsdWRlLgorCXNoX3JlbG9jX3R5cGU6IERlbGV0ZS4gIENoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gZWxmX3NoX3JlbG9jX3R5cGUuCisJKHNoX2VsZl9ob3d0b190YWIpOiBBZGQgSE9XVE8gZm9yIFJfU0hfU1dJVENIOC4KKwkoc2hfcmVsb2NfbWFwKTogTWFwIEJGRF9SRUxPQ184X1BDUkVMIHRvIFJfU0hfU1dJVENIOC4KKwkoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEhhbmRsZSBSX1NIX1NXSVRDSDguCisJKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kgb2YgZWxmMzItc2gubG8gb24gJChJTkNESVIpL2VsZi9zaC5oLgorCitGcmkgTm92IDI3IDE3OjUxOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGVsZmxpbmsuaCAoY29tcHV0ZV9idWNrZXRfY291bnQpOiBEb24ndCBhbGxvdyBtaW5zaXplPT0wLCBpdAorCWNhdXNlcyBkaXZpc2lvbiBieSB6ZXJvIGxhdGVyIG9uLgorCitUaHUgTm92IDI2IDExOjE5OjM1IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9wYzlfcmVsb2MsZnIzMF9lbGZfcGMxMl9yZWxvYyk6IE5vdAorCW5lZWRlZC4KKworMTk5OC0xMS0yNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgaGFjay4gIFVzZSBuZXcgZW11bGF0aW9uCisJaG9vayBub3cuCisKK1R1ZSBOb3YgMjQgMTA6MjU6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbAorCWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZS4KKwkoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgSTIwIGFuZCBJMzIKKwlyZWxvY3MuCisJKGZyMzBfZWxmX2kzMl9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIEkzMiByZWxvY3MuCisJKGZyMzBfZWxmX3BjOV9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIDlfUENSRUwgcmVsb2NzLgorCShmcjMwX2VsZl9wYzEyX3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgMTJfUENSRUwgcmVsb2NzLgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXNldCBoaTE2cyByZWxvYworCWNoYWluIHRvIGVtcHR5LgorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBiYXNlZCBvbiBhIHBhdGNoIHN1Ym1pdHRlZCBieSBHaWFubHVjYQorCU1vcm8gPGdsY3RyQGFiYy5pdD46CisKKwkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogT25seSB1cGRhdGUgYSBoaTE2cyByZWxvYyBpZiBpdCBoYXMKKwlub3QgYWxyZWFkeSBiZWVuIHVwZGF0ZWQuCisJKGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyk6IE5ldyBwYXJhbWV0ZXIgJ2FscmVhZHlfZm91bmQnCisJcmV0dXJucyBzdGF0ZSBvZiByZW1lbWJlcmVkIGhpMTZzIHJlbG9jLgorCShyZW1lbWJlcl9oaTE2c19yZWxvYyk6IFNldCAnZm91bmQnIGZpZWxkIHRvIGZhbHNlLgorCShoaTE2c19sb2NhdGlvbik6IEFkZCAnZm91bmQnIGZpZWxkLgorCisxOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KKworCSogY29mZi1pMzg2LmMgKGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjayk6IHRoZSBsaW5rZXIgd2FudHMKKwl0byBzZWUgLkRMTCBmaWxlcyBhcyB1bnJlY29nbml6ZWQuCisJKGkzY29mZl9vYmplY3RfcCk6IFNvcnJ5LCBoYWQgdG8gaGFjayBpdCB0byBub3QgcmVjb2duaXplIHRoZXNlCisJZmlsZXMgKHBlaS1pMzg2KSBvbiByZXF1ZXN0LgorCisxOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KKworCSogb3BuY2xzLmMgKGJmZF9tYWtlX3JlYWRhYmxlKTogbmVlZCBtb3JlIGNsZWFudXAgZm9yIHN5bWJvbHMgYW5kCisJcmVsZW50cy4gIENhbGwgYmZkX2NoZWNrX2Zvcm1hdCB0byByZWluaXRpYWxpemUuCisKK0ZyaSBOb3YgMjAgMTQ6MjE6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHNwdXJpb3VzCisJd2FybmluZ3MuCisKK1RodSBOb3YgMTkgMTQ6NDI6MTUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogcmVnZW5lcmF0ZQorCSogY29uZmlndXJlOiByZWdlbmVyYXRlCisKK1R1ZSBOb3YgMTcgMjA6MjM6MzUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGVfZW50cmllc19zaXplLgorCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCisJKiBlbGZsaW5rLmggKGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCk6IENvcHkgaXQsIGFuZAorCXJlc3BlY3QgaXQgYXMgYW4gdXBwZXIgYm91bmQgb24gd2hhdCBtZW1vcnkgdG8gcmVmZXJlbmNlLgorCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTGlrZXdpc2UuCisJKGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IEhhbmRsZSBhcy15ZXQgdW5kZWZpbmVkIHZ0YWJsZXMuICBTZXQgYW5kCisJdXBkYXRlIHZ0YWJsZV9lbnRyaWVzX3NpemUgYXBwcm9wcmlhdGVseS4KKworVHVlIE5vdiAxNyAxNToyODozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfdHlwZV9sb29rdXApOiBVc2VkIGludGVnZXJzIHRvIGhvbGQKKwlyZWxvYyBudW1iZXIuCisKK01vbiBOb3YgMTYgMjI6MTk6MjEgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIGFyY2hpdmUuYyAoYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0pOiBzdXBwb3J0IEJGRF9JTl9NRU1PUlkKKyAJYmZkczsgdGhleSBoYXZlIG5vICJmaWxlIiBzbyB3ZSBmYWtlIGl0LgorCSogYmZkLWluMi5oOiBhZGQgYmZkX21ha2Vfd3JpdGFibGUgYW5kIGJmZF9tYWtlX3JlYWRhYmxlIChyZWdlbikKKwkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBBbGxvdyB3cml0aW5nIHRvIEJGRF9JTl9NRU1PUlkgYmZkcyBieQorIAlyZXNpemluZyB0aGUgbWVtb3J5IGJ1ZmZlci4KKwkqIG9wbmNscy5jIChiZmRfbWFrZV93cml0YWJsZSk6IE5ldyBmdW5jdGlvbjsgbGV0cyB5b3Ugd3JpdGUgYQorIAliZmRfY3JlYXRlJ2QgYmZkIHRvIGFuIGluLW1lbW9yeSBidWZmZXIuCisJKGJmZF9tYWtlX3JlYWRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSByZWFkIGJhY2sgdGhhdCBidWZmZXIKKyAJYXMgaWYgaXQgd2VyZSBmcm9tIGJmZF9vcGVuci4gIFVzZWQgdG8gYnVpbGQgZ2VuZXJhdGVkIGFyY2hpdmUKKyAJbWVtYmVycyAod2luc3VwJ3MgbGQncyBkbGx0b29sKQorCitNb24gTm92IDE2IDE5OjE1OjE5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCisKK01vbiBOb3YgMTYgMTA6NTc6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jIChoaTE2c19sb2NhdGlvbik6IFJlcGxhY2VkIGZpeGVkIHNpemUgYXJyYXkgd2l0aAorCWxpbmtlZCBsaXN0LgorCitTdW4gTm92IDE1IDIwOjI4OjI1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZWFyY2ggZm9yIHRoZSBwcm9wZXIKKwllbGVtZW50IG9mIHRoZSBnb3RlbnRyeSBsaXN0IGZvciBsb2NhbCBzeW1ib2xzIHRvby4KKwkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVuaWZ5IGxvY2FsIGFuZCBnbG9iYWwgaGFuZGxpbmcuCisJQXNzZXJ0IHRoYXQgZ290ZW50LT51c2VfY291bnQgPiAwLgorCitTYXQgTm92IDE0IDE1OjE2OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh2bXNfYWxwaGFfdmVjKTogUmVuYW1lIGZyb20gZXZheF9hbHBoYV92ZWMsIGFuZAorCXVwZGF0ZSBmb3IgZmlsZSBuYW1lIGNoYW5nZXMgb2YgSnVseSAyLCAxOTk4LgorCSh2bXNfdmF4X3ZlYyk6IE5ldy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IE5vdiAxMiAxOToxOTo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIHBvL2JmZC5wb3Q6IFJlZ2VuZXJhdGVkLgorCitUdWUgTm92IDEwIDE2OjE3OjA2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGFjaW5jbHVkZS5tNCwgY29uZmlnLmJmZDogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKworVHVlIE5vdiAxMCAxNToxMzo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIGJmZF9hcmNoX2ZyMzAuCisKK1R1ZSBOb3YgMTAgMTM6Mzc6MzYgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBhY2luY2x1ZGUubTQgKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKKyAJQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUik6IGRpZG4ndCBkZWZpbmUgbWFjcm8gd2hlbiB2YWx1ZQorIAl3YXMgY2FjaGVkLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiByZWdlbmVyYXRlZC4KKworVHVlIE5vdiAxMCAxNDozMTowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGVsZjMyLWQxMHYuYyAocmVsb2NfdHlwZSk6ICBBZGQgUl9EMTBWX0dOVV9WVElOSEVSSVQgYW5kCisgICAgICAgIFJfRDEwVl9HTlVfVlRFTlRSWSByZWxvY3MuCisgICAgICAgIChlbGZfZDEwdl9ob3d0b190YWJsZSk6ICBMaWtld2lzZS4KKyAgICAgICAgKGQxMHZfcmVsb2NfbWFwIGQxMHZfcmVsb2NfbWFwKTogIExpa2V3aXNlLgorICAgICAgICAoZWxmMzJfZDEwdl9nY19tYXJrX2hvb2spOiAgTmV3LgorICAgICAgICAoZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rKTogIE5ldy4KKyAgICAgICAgKGVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzKTogIE5ldy4KKyAgICAgICAgKGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbik6ICBOZXcuCisgICAgICAgIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogIERlZmluZS4KKyAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCisKK1NhdCBOb3YgIDcgMTg6MDc6NTEgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBldGVyLnNjaGF1ZXJAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KKworCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogTW92ZSB2bXMgZmlsZXMgaGVyZS4uLgorCShCRkQ2NF9CQUNLRU5EUyk6IC4uLmZyb20gaGVyZS4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogTW92ZSB2bXMgZmlsZXMgaGVyZS4uLgorCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiAuLi5mcm9tIGhlcmUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworV2VkIE5vdiAgNCAxNTo1ODo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIEZSMzAgdGFyZ2V0LgorCSogTWFrZWZpbGUuaW46IEFkZCBGUjMwIHRhcmdldC4KKwkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwLgorCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBGUjMwLgorCSogcmVsb2MuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAgcmVsb2NhdGlvbnMuCisJKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHJlbG9jYXRpb25zLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogbGliYmZkLmg6ICBSZWdlbmVyYXRlLgorCSogY3B1LWZyMzAuYzogTmV3IGZpbGUuCisJKiBlbGYzMi1mcjMwLmM6IE5ldyBmaWxlLgorCitNb24gTm92ICAyIDE0OjU5OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQorCitTdW4gTm92ICAxIDE5OjMyOjI4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogRG8gbm90IHVzZSBhbGxvY2EsCisJdXNlIGJmZF9tYWxsb2MgYW5kIGZyZWUgaW5zdGVhZCBhbmQgY2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gYmZkX21hbGxvYy4KKworU3VuIE5vdiAgMSAxNjoyMDozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzKTogQ29tbWVudCBvdXQuCisJKFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUyk6IExpa2V3aXNlLgorCShNSVBTX1RFWFRfRFlOU1lNX1NFQ04pOiBMaWtld2lzZS4KKwkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gZmllbGQgb2YgYSAuaGFzaAorCXNlY3Rpb24uCisJKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBSZW1vdmUgZHluc3ltX3NlY19zdHJpbmRleAorCWZpZWxkLgorCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRG9uJ3QgaW5pdGlhbGl6ZQorCWR5bnN5bV9zZWNfc3RyaW5kZXguCisJKG1pcHNfZWxmX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gYXZvaWQgd2FybmluZy4KKwkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogR2VuZXJhdGUgYSBzZWN0aW9uIHN5bWJvbCBmb3IKKwlldmVyeSBvdXRwdXQgc2VjdGlvbi4KKwkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3VudCBhbGwgc2VjdGlvbnMgZm9yCisJRFRfTUlQU19VTlJFRkVYVE5PLgorCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBkeW5hbWljIHN5bWJvbHMgZm9yIGFsbAorCW91dHB1dCBzZWN0aW9ucy4KKworU3VuIE5vdiAgMSAxMjo0Njo1MyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBbGxvY2F0ZSB0d28gc2xvdHMKKwlmb3IgbGF0ZXIgUExUIGVudHJpZXMgaW4gbGFyZ2UgUExUcy4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBbGxvdyBmb3IgdGhlIGV4dHJhIHNsb3RzLgorCitTYXQgT2N0IDMxIDIwOjEwOjA5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2FkX3NlY3Rpb24pOiBGaXggdHlwby4KKworMTk5OC0xMC0yNiAxNTo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkIGVsZl9oYXNoX3ZhbHVlLgorCSogZWxmbGluay5oIChlbGZfY29sbGVjdF9oYXNoX2NvZGVzKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcworCWNhbGxlZCBmb3IgZWFjaCBleHBvcnRlZCBzeW1ib2wgYW5kIHdlIGNvbXB1dGUgdGhlIEVMRiBoYXNoIHZhbHVlIGZvcgorCWl0LgorCShjb21wdXRlX2J1Y2tldF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4gIEl0IGlzIGNhbGxlZCBmcm9tCisJc2l6ZV9keW5hbWljX3NlY3Rpb25zIHRvIGRldGVybWluZSB0aGUgaGFzaCB0YWJsZSBzaXplLiAgV2hlbiB3ZSBhcmUKKwlvcHRpbWl6aW5nIGEgYmV0dGVyLCBidXQgc2xvd2VyLCBhbGdvcml0aG0gaXMgdXNlZC4KKwkoc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBjb21wdXRlX2J1Y2tldF92YWx1ZS4KKworCSogZWxmLmMgKGJmZF9lbGZfaGFzaCk6IE9wdGltaXplIHRoZSBoYXNoIGZ1bmN0aW9uIGEgYml0LgorCitNb24gT2N0IDE5IDIwOjAzOjIxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogZWxmMzItc2guYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NIX0dOVV9WVElOSEVSSVQgYW5kCisgICAgICAgIFJfU0hfR05VX1ZURU5UUlkuCisgICAgICAgIChzaF9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KKyAgICAgICAgKHNoX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KKyAgICAgICAgKHNoX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgorICAgICAgICAoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KKworTW9uIE9jdCAxOSAxNjo1NzowNSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGFjaW5jbHVkZS5tNDogdW5kbyBwcmV2aW91cyBnZXR0ZXh0IGNoYW5nZQorCSogYWNsb2NhbC5tNDogcmVidWlsZCB3aXRoIHJpZ2h0IHZlcnNpb24gb2YgYWNsb2NhbC4KKworTW9uIE9jdCAxOSAwMTo0NzoyMSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGFjaW5jbHVkZS5tNCwgYWNsb2NhbC5tNDogbW92ZSBnZXR0ZXh0LXJlbGF0ZWQgZnJhZ21lbnRzIGZyb20KKyAJYWNsb2NhbC5tNCB0byBhY2luY2x1ZGUubTQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QuCisKKwkqIGVsZmNvcmUuaDogcmV3cml0ZSBmb3IgYmV0dGVyIGNvcmVmaWxlIHN1cHBvcnQuCisJKiBlbGYuYyAoZWxmY29yZV8qKTogbmV3IGZ1bmN0aW9ucy4KKwkqIGVsZi1iZmQuaCAoZWxmX29ial90ZGF0YSk6IG5ldyBzdHJ1Y3R1cmUgbWVtYmVycy4KKwkqIGFjY29uZmlnLmgsIGFjaW5jbHVkZS5tNCwgY29uZmlndXJlLmluOiBhZGQgZmVhdHVyZS10ZXN0cyBmb3IKKyAJZmxhdm9yIG9mIHByb2Nmcy4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZy5pbiwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZWQuCisKK0ZyaSBPY3QgMTYgMTQ6MDc6NDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGYzMi1tMzJyLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9NMzJSX0dOVV9WVElOSEVSSVQKKyAgICAgICAgYW5kIFJfTTMyUl9HTlVfVlRFTlRSWS4KKyAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCisgICAgICAgIChtMzJyX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgorICAgICAgICAobTMycl9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KKyAgICAgICAgKG0zMnJfZWxmX2djX3N3ZWVwX2hvb2spOiAgTmV3LgorICAgICAgICAobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgorCitNb24gT2N0IDEyIDE0OjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGFybV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHJlZHVuZGFudCB0ZXN0LgorCisJKiBiZmQtaW4yLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBJbXByb3ZlIGNvbW1lbnQgdG8gbWFrZQorCWNsZWF0IHRoYXQgdGhlICdiaXRzaXplJyBmaWVsZCBpcyB0aGUgc2l6ZSBvZiB0aGUgYml0ZmllbGQgQUZURVIKKwlyZWxvY2F0aW9uIG5vdCBiZWZvcmUuCisKKwkqIGVsZjMyLW0zMnIuYyAoUl9NMzJSXzE4X1BDUkVMKTogRml4IHNpemUgb2YgYml0ZmllbGQuCisKKwkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX2hpKTogQ29wZSB3aXRoIG1pc3NpbmcgcmVmaGkgb3IgcmVmbG8KKwlyZWxvY3MuCisKK1R1ZSBPY3QgIDYgMDk6MjA6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGYzMi1zcGFyYy5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfU1BBUkNfR05VX1ZUSU5IRVJJVCBhbmQKKyAgICAgICAgUl9TUEFSQ19HTlVfVlRFTlRSWS4KKyAgICAgICAgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgdGhlbS4KKyAgICAgICAgKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogIExpa2V3aXNlLgorICAgICAgICAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6ICBMaWtld2lzZS4KKyAgICAgICAgKGVsZjMyX3NwYXJjX2djX21hcmtfaG9vayk6ICBOZXcuCisgICAgICAgIChlbGYzMl9zcGFyY19nY19zd2VlcF9ob29rKTogIE5ldy4KKworTW9uIE9jdCAgNSAxNDo1NTozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbS5jIChzb21fZmluaXNoX3dyaXRpbmcpOiBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyB3aGVuCisJd3JpdGluZyBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5LgorCitNb24gT2N0ICA1IDEyOjAyOjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBkd2FyZjEuYyA6IE5ldyBmaWxlLiAgQWRkcyBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KKwkqIGNvbmZpZ3VyZS5pbiAoZWxmKTogQWRkIGR3YXJmMS5sby4KKwkqIGVsZl9iZmQuaCAoZWxmX29iX3RkYXRhKTogQWRkIGR3YXJmMV9maW5kX2xpbmVfaW5mby4KKwkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYWxsIHRvCisJX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOgorCUFkZCBjYWxsIHRvIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCitNb24gT2N0ICA1IDEwOjA2OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogZWxmbGluay5oIChlbGZfZ2Nfc2VjdGlvbnMpOiAgRG8gbm90IGFsbG93IGdhcmJhZ2UKKyAgICAgICAgY29sbGVjdGlvbiBpZiBkeW5hbWljIHNlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLgorCitNb24gT2N0ICA1IDA5OjA3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogZWxmMzItdjg1MC5jOiBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9WODUwX0dOVV9WVElOSEVSSVQgYW5kCisgICAgICAgIFJfVjg1MF9HTlVfVlRFTlRSWS4KKyAgICAgICAgKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZIHJlbG9jcy4KKyAgICAgICAgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaWtld2lzZS4KKyAgICAgICAgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCisgICAgICAgICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIExpa2V3aXNlLgorICAgICAgICAodjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKHY4NTBfZWxmX2djX21hcmtfaG9vayk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCisKK01vbiBPY3QgIDUgMDk6MDQ6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiAgRG9uJ3QgYXNzdW1lCisgICAgICAgIHRoYXQgZHlub2JqIGV4aXN0cy4KKworU3VuIE9jdCAgNCAyMzoyOTozNCAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KKworCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgorCURlY2xhcmUgc2l6ZSBhcyBiZmRfc2l6ZV90eXBlLgorCShyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVjbGFyZSBjb3VudCBhcyBiZmRfc2l6ZV90eXBlLgorCitTdW4gT2N0ICA0IDIwOjM4OjI5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY3B1LWhwcGEuYyAoYmZkX2hwcGEyMF9hcmNoKTogRGVmaW5lLiAgTGluayBpdCBpbnRvIHRoZSBiZmRfaHBwYV9hcmNoCisJc3RydWN0dXJlLgorCSogc29tLmMgKENQVV9QQV9SSVNDMl8wKTogRGVmaW5lLgorCShfUEFfUklTQzJfMF9JRCk6IExpa2V3aXNlLgorCShzb21fZmluaXNoX3dyaXRpbmcpOiBVc2UgQ1BVX1BBX1JJU0MyXzAgZm9yIHRoZSBzeXN0ZW1faWQgYXMgbmVlZGVkLgorCitTdW4gT2N0ICA0IDIxOjE5OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbmVkIHN5bWJvbAorCWhhcyBhIGJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBkZWZpbmVkLCBvbmx5IGFkZCB0aGUgcmVmZXJlbmNlZAorCXN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkCisJYnkgYSByZWd1bGFyIGZpbGUuCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgdnRhYmxlIHJlbG9jcworCWNvcnJlY3RseS4KKworMTk5OC0wOS0yNyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKyAgICAgICAgKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVuZG8gbGFzdCBjaGFuZ2UuCisKK1dlZCBTZXAgMjMgMTY6MDk6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGEgZHluYW1pYworICAgICAgICBzeW1ib2wgZm9yIHRoZSBpbmRpcmVjdCBhbGlhcyB0byBhIHZlcnNpb25lZCBzeW1ib2wuCisKK01vbiBTZXAgMjEgMTI6MTU6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGYzMi1pMzg2LmMgKGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvKTogTmV3LgorICAgICAgICAoZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvKTogTmV3LgorICAgICAgICAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiAgUmV0dXJuIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bworICAgICAgICBvciBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byAgb24gbG9va3VwLgorCitTdW4gU2VwIDIwIDAwOjQ4OjA3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBlbGYzMi1tNjhrLmM6IEluY2x1ZGUgImVsZi9tNjhrLmgiLiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgZW51bQorCXJlbG9jX3R5cGUuICBSZW5hbWUgUl82OEtfX21heCB0byBSXzY4S19tYXguCisJKGhvd3RvX3RhYmxlKTogVXNlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gZm9yIGEgVlRFTlRSWQorCXJlbG9jLgorCitTdW4gU2VwIDIwIDAwOjA5OjI1IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+CisKKwkqIGxpYmJmZC5jIChiZmRfZ2V0YjMyKTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGdldCBiZXR0ZXIgY29kZS4KKwkoYmZkX2dldGwzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfZ2V0bF9zaWduZWRfMzIpOiBMaWtld2lzZS4KKworCSogbGliYmZkLmMgKGJmZF9sb2cyKTogQ2FzdCB0byBiZmRfdm1hIGJlZm9yZSBzaGlmdGluZywgbm90CisJYWZ0ZXIuCisKK1NhdCBTZXAgMTkgMjI6NDI6MjMgMTk5OCAgRG91ZyBSYWJzb24gIDxkZnJAbmxzeXN0ZW1zLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBFbnN1cmUgdGhhdCB0aGUgd2FybmluZworCW1lc3NhZ2UgaGFzIGEgbnVsbCBieXRlIHRlcm1pbmF0b3IuCisKK0ZyaSBTZXAgMTggMTQ6MzU6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBJZ25vcmUgY29udGVudHMgb2YKKwl3b3JkIHN1YmplY3QgdG8gUl9WODUwXzMyIHJlbG9jYXRpb24uCisKK1RodSBTZXAgMTcgMTc6MjA6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZHdhcmYyLmM6IEFkZCBjb21tZW50IGRlc2NyaWJpbmcgcHJvYmxlbSBjb21wdXRpbmcgbGluZSBudW1iZXJzCisJZm9yIHVuZGVmaW5lZCBzeW1ib2xzIGF0IGxpbmsgdGltZS4KKworVGh1IFNlcCAxNyAxNjowMzoyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisgICAgICAgICogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKKyAgICAgICAgdHJhbnNmb3JtIGEgZGVmd2VhayBpbnRvIGEgcGx0IGVudHJ5LgorICAgICAgICAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyByb29tIGZvciBzZWNvbmRhcnkKKyAgICAgICAgcGx0IGVudHJ5IHJlZmVyZW5jZXMgdG8gcmVjZWl2ZSBhIFJFTEFUSVZFIHJlbG9jLgorICAgICAgICAoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRmlsbCB0aGVtIGluLgorICAgICAgICAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFzc2VydCB3ZSBkb24ndCBvdmVycnVuCisgICAgICAgIHRoZSBhbGxvY2F0ZWQgcmVsb2NhdGlvbiBzcGFjZS4KKworV2VkIFNlcCAxNiAxODowMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IEFsd2F5cyB0cmVhdCBzZWN0aW9uIHN5bWJvbHMgYXMKKwlzcGVjaWFsLCBldmVuIGlmIHRoZXkgYXJlIGF0dGFjaGVkIHRvIGEgY29tbW9uIHNlY3Rpb24uCisKK1dlZCBTZXAgMTYgMTA6MzQ6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IE1vdmUgc3ltYm9scyBpbgorCXNlY3Rpb25zIHdpdGggdjg1MCBjb21tb24gc2VjdGlvbiBhdHRyaWJ1dGVzIGludG8gbmFtZWQgdjg1MAorCWNvbW1vbiBzZWN0aW9ucy4KKwkodjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rKTogTW92ZSBzeW1ib2xzIGluIHNlY3Rpb25zIHdpdGggdjg1MAorCWNvbW1vbiBzZWN0aW9uIGF0dHJpYnV0ZXMgaW50byBuYW1lZCB2ODUwIGNvbW1vbiBzZWN0aW9ucy4KKworV2VkIFNlcCAxNiAxMToyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2djX21hcmtfaG9vayk6ICBSZW1vdmUgcHJpbnQKKyAgICAgICAgc3RhdGVtZW50LgorCisxOTk4LTA5LTE1ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJzZSBvdXRwdXRfb2Zmc2V0CisJcGFydCBvZiBWbGFkaW1pcidzIGNoYW5nZSBvZiAxOTk4LTA4LTE5LiAgTWFrZSBhIFJfUFBDX1NEQVJFTDE2CisJcmVsb2MgdG8gdGhlIHdyb25nIHNlY3Rpb24gYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IuICAuZHluc2JzcworCWlzIG5vdCBhbiBvdXRwdXQgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgaXQuCisKK1R1ZSBTZXAgMTUgMTI6NDA6MDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAqIGVsZi1iZmQuaDogIEFkZCBhcmd1bWVudCB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCisKK1R1ZSBTZXAgMTUgMDg6MzQ6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIFBhc3MgdHlwZSB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCisgICAgICAgKiBlbGYzMi1hcm0uYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX0FSTV9HTlVfVlRJTkhFUklUIGFuZAorICAgICAgIFJfQVJNX0dOVV9WVEVOVFJZLgorICAgICAgIChlbGYzMl9hcm1fZ2NfbWFya19ob29rKTogTmV3LgorICAgICAgIChlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayk6IE5ldy4KKyAgICAgICAoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IE5ldy4KKyAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWQorICAgICAgIHJlbG9jYXRpb25zLgorICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKKyAgICAgICByZWxvY2F0aW9ucy4KKworMTk5OC0wOS0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KKworICAgICAgICAqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBkeW5vYmogaXMgTlVMTCwKKyAgICAgICAgYXNzdW1lIHRoZXJlIGlzIG5vIFBMVCBvciBHT1QuCisKK1dlZCBTZXAgIDkgMTQ6MjQ6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBmdW5jdGlvbjogIGp1c3QKKwlsaWtlIF9lbGZfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgZXhjZXB0IHRoYXQgU1RUX0FSTV9URlVOQyBpcworCWFsc28gYWNjZXB0ZWQgYXMgYSBmdW5jdGlvbiBzeW1ib2wgdHlwZS4KKworTW9uIFNlcCAgNyAxMzoyNDowMyAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKwkqIHJzNjAwMC1jb3JlLmMgKF9MT05HX0xPTkcpOiAgRGVmaW5lIGZvciBBSVggNC54IG9ubHkuCisKK1NhdCBTZXAgIDUgMjA6NDA6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zKTogQ29ycmVjdCBkZWZpbml0aW9uIHRvCisJbWF0Y2ggZGVmaW5pdGlvbiBvZiBfYmZkX2djX3NlY3Rpb25zIGZpZWxkLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisKK0ZyaSBTZXAgIDQgMTM6NTQ6MjMgMTk5OCAgRGF2aWQgTWlsbGVyICA8ZGF2ZW1AZG0uY29iYWx0bWljcm8uY29tPgorCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGVybHkgYWRqdXN0CisJdGhlIGFkZGVuZCBvZiBhIGR5bmFtaWMgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBhIHNlY3Rpb24uCisJKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpeCB0aGUgUExUIHJlbG9jYXRpb24gb2Zmc2V0LgorCitUaHUgU2VwICAzIDE3OjI4OjUwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoYmZkX2VsZk5OX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFZlcmlmeSB0aGF0IHRoZQorCWJlZCBoYXMgYSBzaXplX2R5bmFtaWNfc2VjdGlvbnMgcm91dGluZSBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdC4KKworTW9uIEF1ZyAzMSAxNDo0OToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvKTogVXNlCisJX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbi4KKworTW9uIEF1ZyAzMSAxMDoyMzo0MCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIE1ha2VmaWxlLmFtOiAgQWRkIGVsZjMyLWFybS5jLgorICAgICAgICAqIE1ha2VmaWxlLmluOiAgUmVidWlsZC4KKyAgICAgICAgKiBlbGYtYmZkLmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgorICAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIElmIGRlZmluZWQsIGNhbGwKKyAgICAgICAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgorICAgICAgICAqIGVsZjMyLWFybS5jOiBEZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgorICAgICAgICAoZWxmMzJfYXJtX2dldF9zeW1ib2wtdHlwZSk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6ICBDaGFuZ2UgdG8gdXNlIFNUVF9BUk1fVEZVTkMuCisgICAgICAgIChiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiAgQ2hhbmdlIHRvCisgICAgICAgIGNoZWNrIGZvciBTVFRfQVJNX1RGVU5DLgorICAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCisgICAgICAgICogZWxmeHgtdGFyZ2V0Lmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgorCitGcmkgQXVnIDI4IDE5OjQ0OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2FscGhhX2V2WzQ1Nl0pOiBOZXcuCisJKiBjcHUtYWxwaGEuYzogUmV3b3JrIHRvIG1hdGNoIHRoZXNlIHR5cGVzLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitGcmkgQXVnIDI4IDE5OjM4OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IERlY2xhcmUuCisJKiBlbGYuYyAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IE5ldy4KKworCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgdnRhYmxlIHJlbG9jcy4KKwkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgdGhlbS4KKwkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogUGFzcyB0aGVtIG9mZiB0byBnZW5lcmljIGNvZGUuCisJKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlbS4KKwkoZWxmX2kzODZfZ2NfbWFya19ob29rLCBlbGZfaTM4Nl9nY19zd2VlcF9ob29rKTogTmV3LgorCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBUcnVlLgorCitUaHUgQXVnIDIwIDE1OjAzOjQ1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWFybS5jIChlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6IENoZWNrIHN5bV9zZWMgaXMgbm90IE5VTEwKKwliZWZvcmUgbG9va2luZyBhdCBvd25lciBmaWVsZC4KKwkoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiBEaXR0by4KKwkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wdXRlIG5hbWUgYmVmb3JlIGNhbGxpbmcKKwllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSgpLgorCitUaHUgQXVnIDIwIDExOjMwOjE3IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGVsZi5jOiBjb21tZW50IGFuZCBmb3JtYXR0aW5nIGNsZWFudXBzLgorCSogZWxmY29yZS5oOiBkaXR0by4KKworV2VkIEF1ZyAxOSAxNTo0MzoyNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlamVjdCBmaWxlcyBvZiBoZWFkZXIgdHlwZSBFVF9DT1JFCisJKGNvcmUgZmlsZXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgdGhhbiBvYmplY3QgZmlsZXMpLgorCSogZWxmLWJmZC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKKwliZmRfZWxmX21rY29yZWZpbGUpOiBkZWNsYXJlLgorCSogZWxmeHgtdGFyZ2V0LmggKF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAorCWJmZF9lbGZfbWtjb3JlZmlsZSk6IGFkZCB0byBiZmRfdGFyZ2V0IHZlY3Rvci4KKwkqIGVsZmNvcmUuaCAoZWxmX2NvcmVfZmlsZV9wKTogc2F2ZSB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUsCisJYW5kIHNldCB0aGUgYmZkIGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBlbGYgZmlsZSBoZWFkZXIuCisJKiBlbGYuYyAoYmZkX2VsZl9ta2NvcmVmaWxlKTogbmV3IGZ1bmN0aW9uLgorCShfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyk6IG5ldyBmdW5jdGlvbi4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IGFkZCBjYXNlcyBmb3IgaGFuZGxpbmcKKwlQVF9OT1RFIHNlZ21lbnRzLiAgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKToKKwljb3JlIGZpbGVzIHNob3VsZCBiZSBoYW5kbGVkIHRoZSBzYW1lIGFzIGV4ZWMgZmlsZXMuCisJKHByZXBfaGVhZGVycyk6IGlkZW50aWZ5IGNvcmUgZmlsZXMgYXMgdHlwZSBFVF9DT1JFLgorCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBpZGVudGlmeSB0aGUgc2VjdGlvbnMgYmVsb25naW5nIHRvCisJdGhlIFBUX05PVEUgc2VnbWVudC4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6CisJYWRkIGJyZWFrIHN0YXRlbWVudCB0byBkZWZhdWx0IGNhc2UuCisKKzE5OTgtMDgtMTkgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgdGhhdCBvdXRwdXQKKwlzZWN0aW9uIChub3QgaW5wdXQpIHdpbGwgYmUgaW4gc2VjdGlvbnMgIi5zYnNzIiwgIi5zYnNzMiIsCisJIi5zZGF0YSIsIGFuZCAiLnNkYXRhIiBmb3IgUl9QUENfU0RBUkVMMTYsIFJfUFBDX0VNQl9TREEyUkVMLAorCVJfUFBDX0VNQl9TREEyMSwgUl9QUENfRU1CX1JFTFNEQS4gIEluIGFsbCB0aGVzZSBjYXNlcyBhbHNvIGlnbm9yZQorCW91dHB1dF9vZmZzZXQgZm9yIGNvcnJlY3QgZXZhbHVhdGlvbiBvZiBhZGRlbmQuCisKK1R1ZSBBdWcgMTggMTE6NDg6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbGYzMi1hcm0uYzogQWRkIHByZWZpeCBiZmRfIHRvIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCisgICAgICAgIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgYW5kCisgICAgICAgIGVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgorCitUdWUgQXVnIDE4IDExOjQ2OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBiZmQtaW4uaDogQW1tZW5kIHByb3RvdHlwZSBmb3IKKyAgICAgICAgZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gdG8gcmVtb3ZlIHN1cnBsdXMgdGhpcmQKKyAgICAgICAgYXJndW1lbnQuCisKKyAgICAgICAgKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCisKK1NhdCBBdWcgMTUgMjA6NTU6MDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBzeW1ib2xzLgorCitGcmkgQXVnIDE0IDA5OjEyOjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBVc2UgdGhlIHJlbG9jYXRpb24gYWxyZWFkeQorCWNhbGN1bGF0ZWQgZm9yIFJFTE9DX1NQQVJDX1JFVjMyIGNhc2UuCisKK1RodSBBdWcgMTMgMTQ6MDI6MDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAqIGJmZC1pbi5oOiAgQWRkIHByb3RvdHlwZXMgZm9yIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCisgICAgICAgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKKyAgICAgICBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KKyAgICAgICAqIGJmZC1pbjIuaDogIFJlZ2VuZXJhdGVkLgorICAgICAgICogZWxmMzItYXJtLmMgRGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUuCisgICAgICAgKGluc2VydF90aHVtYl9icmFuY2gpOiBOZXcgcm91dGluZS4KKyAgICAgICAoZmluZF90aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCisgICAgICAgKGZpbmRfYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KKyAgICAgICAocmVjb3JkX2FybV90b190aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCisgICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IE5ldyByb3V0aW5lLgorICAgICAgIChlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyByb3V0aW5lLgorICAgICAgIChlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKTogTmV3IHJvdXRpbmUuCisgICAgICAgKGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpIE5ldyByb3V0aW5lLgorICAgICAgIChlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbikgTmV3IHJvdXRpbmUuCisgICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogTmV3IHJvdXRpbmUuCisgICAgICAgKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogTmV3IHJvdXRpbmUuCisgICAgICAgKGVsZjMyX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KKyAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIGFyZ3VtZW50IHN5bV9zZWMuCisgICAgICAgQ2hlY2sgZm9yIGJyYW5jaGVzIHRvIHRodW1iIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9QQzI0LgorICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byBhcm0gc3ltYm9scyBpbiBjYXNlIFJfQVJNX1RITV9QQzIyLgorICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBQYXNzIHN5bWJvbCBzZWN0aW9uIHRvCisgICAgICAgZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCisKK1dlZCBBdWcgMTIgMTk6MDA6MzkgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgUExUCisJZW50cmllcyB1bmxlc3MgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlOyBpbgorCXBhcnRpY3VsYXIsIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbHMgZ2V0IGEgUExUIGVudHJ5LgorCitXZWQgQXVnIDEyIDE0OjQ4OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQgdG8gYXZvaWQgd2FybmluZy4KKworV2VkIEF1ZyAxMiAwODoxMDoxMSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCisgICAgICAgUl9BUk1fUEMyNCByZWxvY2F0aW9uLgorCitUdWUgQXVnIDExIDE0OjQyOjI2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmVtb3ZlIHVudXNlZAorICAgICAgIGFyZ3VtZW50IGlzX2xvY2FsLiAgQWRkIGFyZ3VtZW50IHN5bV9mbGFncy4gIENoZWNrIHN5bV9mbGFncworICAgICAgIGluIFJfQVJNX0FCUzMyIGNhc2UuICBJbmNsdWRlIGFkZGVuZCBmb3IgUl9BUk1fVEhNX1BDMjIgY2FzZS4KKyAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3QgcGFzcyBsb2NhbCBzeW0gYW5kIHBhc3MKKyAgICAgICBzeW1fZmxhZ3MgdG8gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCisKK01vbiBBdWcgMTAgMjA6Mzg6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBDb3JyZWN0IGxhc3QgY2hhbmdlCisJdG8gbm90IGNvdW50IHRvbyBmZXcgcmVsb2NzIGZvciBkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLgorCitNb24gQXVnIDEwIDE1OjM1OjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTmV2ZXIgY29uc2lkZXIKKwlzeW1ib2xzIHdpdGhvdXQgYSBkeW5hbWljIGluZGV4IGR5bmFtaWMuICBDb25zaWRlciBhbGwgd2VhaworCXN5bWJvbHMgZHluYW1pYy4KKwkoZWxmNjRfYWxwaGFfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IERvbid0IGFzc3VtZSAxLTEKKwljb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgc2VjdGlvbnMuCisKK01vbiBBdWcgMTAgMTU6MzE6MzkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEZvciBiYWNrZW5kcworCXRoYXQgdXNlIGEgLmdvdC5wbHQgc2VjdGlvbiBzdGFydCB0aGUgZ290IG9mZnNldCBhdCB6ZXJvLgorCitNb24gQXVnIDEwIDE3OjMxOjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IENvcnJlY3QgdGhlIHByb2Nlc3NvciBJRCB3cml0dGVuCisJb3V0IGZvciBiZmRfYXJjaF9tNjhrLCBhY2NvbW1vZGF0aW5nIGNoYW5nZSBvZiBNYXJjaCAyNS4KKworU3VuIEF1ZyAgOSAyMDo1NTo0NCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBSZXdvcmsKKyAgICAgICAgUl9BUk1fVEhNX1JQQzIyIHJlbG9jYXRpb25zLgorCitTYXQgQXVnICA4IDE1OjE1OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogVW5kZWYgd2VhayBzeW1ib2xzCisJYXJlIGFsd2F5cyBkeW5hbWljLgorCShlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGVub3VnaCByb29tIGZvciBSRUxBVElWRQorCS5nb3QgcmVsb2NzIGluIC1Cc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuCisKK1dlZCBBdWcgIDUgMTU6NDg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItYXJtLmM6IEFkZCBwcml2YXRlIGZsYWdzIHRvIEVMRiBoZWFkZXIuCisJKGVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgorCShlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCisJKGVsZjMyX2FybV9jb3B5X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCisJKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgorCitNb24gQXVnICAzIDE3OjEwOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogUGVybWl0IFdQTFQzMCBhZ2FpbnN0CisJYSBsb2NhbCBzeW1ib2wuCisJKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKworU3VuIEF1ZyAgMiAwMzoxOToyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0IHNnb3QgdG8gTlVMTC4gIENyZWF0ZSB0aGUKKwkuZ290IGlmIGFueSByZWxvY2F0aW9uIHJlZmVycnMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQdWxsIHNnb3QgYW5kIHNwbHQgc2VhcmNoIHRvIHRoZSBzdGFydAorCW9mIHRoZSBmdW5jdGlvbi4gIFJlY29nbml6ZSBubyAucGx0IGFzIHN0YXRpYyBsaW5raW5nLgorCisxOTk4LTA4LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgcGFzcworCSIubGlibGlzdCIgc3RyaW5nIHRocm91Z2ggZ2V0dGV4dC4KKworRnJpIEp1bCAzMSAxNjozODoxNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgZWxmMzItYXJtLmxvLgorICAgICAgICAqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorICAgICAgICAqIGNvbmZpZy5iZmQgKGFybS0qLWVsZik6ICBEZWZpbmUgdGFyZ19kZWZ2ZWMgYW5kIHRhcmdfc2VsdmVjcy4KKyAgICAgICAgKHRodW1iLSotZWxmKTogRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCisgICAgICAgICogY29uZmlndXJlLmluOiAgSGFuZGxlIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjIGFuZCBiZmRfZWxmMzJfYmlnYXJtX3ZlYy4KKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisgICAgICAgICogZWxmLmM6IChwcmVwX2hlYWRlcnMpOiAgU3VwcG9ydCBhcmNoX3R5cGUgb2YgRU1fQVJNLgorICAgICAgICAqIHRhcmdldHMuYzogIFN1cHBvcnQgbmV3IHRhcmdldHMgYmZkX2VsZjMyX2JpZ2FybV92ZWMgYW5kCisgICAgICAgIGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMuCisgICAgICAgICogZWxmMzItYXJtLmM6ICBOZXcgZmlsZS4KKworVHVlIEp1biAyOCAxOTowNToyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KKworCSogbGliYW91dC5oIChNX1NQQVJDTElURV9MRSk6IE5ldyBtYWNoaW5lLgorCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBBZGQgbWFjaGluZSBNX1NQQVJDTElURV9MRS4KKwkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCisJKHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQorCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQWRkIHJlbG9jYXRpb24gUl9TUEFSQ19SRVYzMi4KKwkoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpIEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBBZGQgUkVMT0NfU1BBUkNfUkVWMzIgc3VwcG9ydC4KKwkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCisJZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBSX1NQQVJDXzMyTEUgdG8gYmUgUl9TUEFSQ19SRVYzMgorCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8KKwliZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIuCisJKiByZWxvYy5jOiBEaXR0by4KKwkqIGNvbmZpZy5iZmQgKHNwYXJjODZ4LSotYW91dCk6IE5ldworCitGcmkgSnVsIDI0IDEzOjU0OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFsbG9jYXRlIE5VTEwgc3ltYm9sIGJlZm9yZQorCWFjdHVhbGx5IG1hcHBpbmcgdGhlIG91dHB1dCBzZWN0aW9ucy4KKworRnJpIEp1bCAyNCAxMToyNDoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKworCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9ob3d0byk6IEFkZCBSX01OMTAzMDBfMjQgZW50cnkuCisJKG1uMTAzMDBfZWxmX3JlbG9jX21hcCk6IFNpbWlsYXJseS4KKwkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBSX01OMTAzMDBfMjQuCisKK0ZyaSBKdWwgMjQgMTI6MzY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIHJlbG9jIHR5cGVzIHVzZWQgb24KKwlJcml4IDYuCisJKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgZGVmYXVsdCBjYXNlLgorCSogZWxmNjQtbWlwcy5jOiBSZXBsYWNlIGFsbCB1c2VzIG9mIG1pcHNfZWxmNjRfcmVsb2NfdHlwZSB3aXRoCisJZWxmX21pcHNfcmVsb2NfdHlwZSBkZWZpbmVkIGluIGVsZi9taXBzLmguCisKKzE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBlbGY2NC1taXBzLmM6IFJlbW92ZSByZWxvY190eXBlIGRlZmluaXRpb24gY29tcGxldGVseS4gIEl0J3Mgbm93CisJaW4gZWxmL21pcHMuaC4KKworVGh1IEp1bCAyMyAxMzozMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6ICNpZiAwIG91dCBtb3JlIHJlbG9jYXRpb25zCisJYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oIG5vdy4KKworVGh1IEp1bCAyMyAxMToyOTo0MyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKworCSogUmUtYWRkIGxvc3QgY2hhbmdlOgorICAgICAgICAqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkCisgICAgICAgICJtb3ZtX3N0YWNrX3NpemUiLgorICAgICAgICAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCisgICAgICAgIGluIHRoZSBpbW04IGZpZWxkIG9mIGEgImNhbGwiIGluc3RydWN0aW9uLgorICAgICAgICAoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQorICAgICAgICB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgorICAgICAgICAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbW92bV9zdGFja19zaXplLgorCitUaHUgSnVsIDIzIDExOjM4OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lIGFzIDQuCisJKiBlbGY2NC1zcGFyYy5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUgYXMgOC4KKworMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jOiBDaGFuZ2UgdXNlIG9mIHBwX3JlbG9jX3R5cGUgdG8gZWxmX3BwY19yZWxvY190eXBlLgorCitXZWQgSnVsIDIyIDE2OjI3OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWhwcGEuaDogTGV0IEVMRiBoZWFkZXIgZGVmaW5lIHRoZSBlbnVtIGNvbnRhaW5pbmcgdGhlCisJZXh0ZXJuYWwgcmVsb2MgbnVtYmVycy4KKwkqIGVsZjMyLWkzODYuaDogTGlrZXdpc2UuCisKKzE5OTgtMDctMjIgMTQ6NTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBlbGYtbTEwMzAwLmM6IExldCBFTEYgaGVhZGVyIG5vdyBkZWZpbmUgdGhlIG1hY3JvcyB0byBnZXQgdGhlIGVudW0uCisJKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgorCSogZWxmMzItcHBjLmM6IExpa2V3aXNlLgorCitXZWQgSnVsIDIyIDEzOjUzOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGJmZC1pbjIuaDogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJyBwYXJhbWV0ZXIgdG8gJ3Vuc2lnbmVkIGludCcgaW4KKwliZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKCksIGluIG9yZGVyIHRvIGF2b2lkIEsmUiBjb21wYXRhYmlsaXR5CisJcHJibGVtcy4KKwkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgorCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJworCXBhcmFtZXRlciB0byAndW5zaWduZWQgaW50JyB0byBhdm9pZCBLJlIgY29tcGF0YWJpbGl0eSBwcm9ibGVtcy4KKworV2VkIEp1bCAyMiAxNjo0MzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAoaWVlZV9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZSBmaWxlbmFtZV9wdHIgYW5kCisJZnVuY3Rpb25uYW1lX3B0ciB0byBiZSBjb25zdC4gIENoYW5nZSBsaW5lX3B0ciB0byBiZSB1bnNpZ25lZC4KKworCSogY29mZmNvZGUuaCAoY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBTaW1wbGlmeSBoYW5kbGluZyB3aGVuCisJbWFjcm8gaXMgbm90IGRlZmluZWQuICBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9saW5rX2luZm8KKwl0byBjb2ZmX2ZpbmFsX2xpbmtfaW5mby4gIEFkZCBwcm90b3R5cGUuCisJKGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogU2ltcGxpZnkgaGFuZGxpbmcgd2hlbiBtYWNybyBpcyBub3QKKwlkZWZpbmVkLiAgQWRkIHByb3RvdHlwZS4KKworMTk5OC0wNy0yMiAxMzowOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGVsZi1tbjEwMzAwLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQorCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLgorCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KKwkqIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KKworV2VkIEp1bCAyMiAxMzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9yZWxvY190eXBlKTogQ29weSBVbHJpY2gncyBlbGYzMi1taXBzLmMKKwl0ZW1wb3JhcnkgcGF0Y2ggb3ZlciB0byBlbGY2NC1taXBzLmMgYXMgd2VsbC4KKworMTk5OC0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IFRlbXBvcmFyaWx5IGRpc2FibGUgZGVmaW5pdGlvbiBvZgorCXN0YW5kYXJkIHJlbG9jYXRpb24gc2luY2UgdGhleSBhcmUgbm93IGRlZmluZWQgaW4gZWxmL21pcHMuaC4KKworVHVlIEp1bCAyMSAwOTo0NzowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6CisgICAgICAgIE1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDIwMF84LgorCisgICAgICAgICogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKKyAgICAgICAgTW9kaWZ5IHJhbmdlIHRlc3QgZm9yIGNhc2UgUl9NTjEwMzAwXzguCisKK01vbiBKdWwgMjAgMTg6NTA6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBnb3RfICYgcGx0X2hlYWRlcl9zaXplLgorCSogZWxmMzItaTM4Ni5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCisJKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KKwkqIGVsZjMyLW02OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jLCBlbGY2NC1zcGFyYy5jOiBMaWtld2lzZS4KKwkqIGVsZnh4LXRhcmdldC5oOiBQcm92aWRlIGEgZGVmYXVsdCBvZiB6ZXJvLgorCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBVc2UgZ290X2hlYWRlcl9zaXplLgorCSogZWxmbGluay5oIChlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IHJlbW92ZSBhIFBMVAorCWVudHJ5IGZyb20gYW4gZXhlY3V0YWJsZSwgZXZlbiBpZiB0aGUgcGx0IHJlZmNvdW50IGdvZXMgdG8gMC4KKworTW9uIEp1bCAyMCAxMjo0NzoyNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IEFsc28gcmVtZW1iZXIgdGhlCisJZGlyZWN0b3J5IG5hbWUgYXQgdGhlIGxpbmUgbnVtYmVyLgorCisJKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGNvbnNpZGVyIHN5bWJvbHMKKwl3aXRoIGFuIHVuc3BlY2lmaWVkIHR5cGUuCisKK1dlZCBKdWwgMTUgMTE6MjA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdW5vcy5jOiBBZGQgdW5kZWYgb2YgdmFsaWQgdG8gYXZvaWQgcHJvYmxlbSBvbiBTdW5PUy4KKworVHVlIEp1bCAxNCAxNTozMDo1OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkIChpPzg2LXBjLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgorCitUdWUgSnVsIDE0IDExOjIyOjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEFsc28gcmVmZXJlbmNlIGNvdW50CisJUl82OEtfUEN4eCBhbmQgUl82OEtfeHggcmVsb2NhdGlvbnMuICBNYWtlIHN1cmUgdGhhdAorCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGlzIGFsd2F5cyBzZXQgZm9yIGEgUExUIHJlbG9jIHJlZmVyZW5jZS4KKwkoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6IEFsc28gcmVmZXJlbmNlIGNvdW50IFJfNjhLX1BDeHggYW5kCisJUl82OEtfeHggcmVsb2NhdGlvbnMuCisJKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IG9mIGEgc3ltYm9sCisJdGhhdCBoYXMgbm8gcGx0IGVudHJ5LgorCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZSBwbHQgb2Zmc2V0IGluIGEgc3RhdGljCisJbGluay4KKwkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IGZvcgorCWFuIGlnbm9yZWQgc3ltYm9sLgorCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogU2V0IHRoZSBnb3Qgb2Zmc2V0cyBhbHNvIGluCisJYSBzdGF0aWMgbGluay4KKworCSogZWxmMzItbTY4ay5jIChSXzY4S19HTlVfVlRJTkhFUklULCBSXzY4S19HTlVfVlRFTlRSWSk6IE5ldyByZWxvYworCXR5cGVzLgorCShob3d0b190YWJsZSwgcmVsb2NfbWFwKTogQWRkIGVudHJpZXMgZm9yIHRoZW0uCisJKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSB0aGVtLiAgSW1wbGVtZW50IHJlZmVyZW5jZQorCWNvdW50aW5nIGZvciBnb3QgYW5kIHBsdCBlbnRyaWVzLgorCShlbGZfbTY4a19nY19tYXJrX2hvb2ssIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb25zLgorCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBIYW5kbGUgdW5yZWZlcmVuY2VkIHBsdAorCXN5bWJvbHMuCisJKHJ0eXBlX3RvX2hvd3RvX3JlbCwgZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVsZXRlLgorCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHRoZSBuZXcgcmVsb2MgdHlwZXMuCisJKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluaywgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAorCWVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2ssIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBjcmVhdGluZyBhbgorCWluZGlyZWN0IHJlZmVyZW5jZSBmb3Igc3ltYm9sIHZlcnNpb25pbmcgYWxzbyBjb3B5IHRoZSBwbHQKKwlvZmZzZXQuCisJKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogV2hlbiBjbGVhcmluZyB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQKKwlmbGFnIGFsc28gcmVzZXQgdGhlIHBsdCBvZmZzZXQuCisJKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLgorCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogSW5jcmVtZW50IHRoZSBnb3Qgb2Zmc2V0IGJ5CisJdGhlIHNpemUgb2YgdGhlIGVudHJ5IGluIGJ5dGVzLgorCShlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMpOiBMaWtld2lzZS4KKworVHVlIEp1bCAxNCAxMToxODoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYKKwl0aGUgYm90dG9tLgorCisJKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MpOiBDYWxsIGJmZF9hbGxvYywgbm90CisJeG1hbGxvYy4KKworTW9uIEp1bCAxMyAxMTowNjozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jOiBTdXByZXNzIGRlZmluaXRpb24gb2YgVEFSR0VUX1VOREVSU0NPUkUgYW5kIGFkZCBhCisJY29tbWVudCBkZXNjcmliaW5nIHdoZW4gaXQgc2hvdWxkIGJlIGVuYWJsZWQuCisJQ2hhbmdlZCBkZWZpbml0aW9uIG9mIFVTRVJfTEFCRUxfUFJFRklYIHRvICIiLCB0byBmYWxsIGludG8gbGluZQorCXdpdGggR0NDIHNvdXJjZXMuCisKK01vbiBKdWwgMTMgMTM6MDY6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEhhbmRsZSBjYWxsIG9wdGltaXphdGlvbgorCWluZm9ybWF0aW9uIEFUTiByZWNvcmRzLgorCitGcmkgSnVsIDEwIDE2OjMxOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUKKwlzZWN0aW9uIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gYSBmdWxseSBsaW5rZWQgZmlsZS4gIEJhc2VkIG9uCisJcGF0Y2ggZnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT4uCisKK1dlZCBKdWwgIDggMTE6Mjk6NTYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBjb2ZmLW04OGsuYyAobTg4a19zcGVjaWFsX3JlbG9jKTogRG9uJ3QgbG9zZSB0aGUgaW5mb3JtYXRpb24KKwl0aGF0IGEgc3ltYm9sIGlzIHVuZGVmaW5lZC4KKworVHVlIEp1bCAgNyAyMTo0NzowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbS5jIChzb21fYmZkX2djX3NlY3Rpb25zKTogRGVmaW5lLgorCitNb24gSnVsICA2IDExOjM1OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogRG8gbm90IGNvbXBsYWluIGFib3V0CisJb3ZlcmZsb3dzIGluIEFSTV8yNkQgcGF0Y2hlcywgc2luY2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbgorCWltcGxtZW50ZWQuICBQYXRjaCBzdWJtaXR0ZWQgYnkgRHIuIFIuSi4gQmxhY2sgPHJqYkBkY3MuZ2xhLmFjLnVrPgorCitTYXQgSnVsICA0IDEyOjI1OjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBoYXZlIGFueSBsb25nCisJc2VjdGlvbiBuYW1lcywgY2FsbCBjb2ZmX3dyaXRlX3N5bWJvbHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8KKwlzeW1ib2xzLgorCitGcmkgSnVsICAzIDEzOjExOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE9ubHkgc2V0IHBoZHJfaW5jbHVkZWQgb25jZSBmb3IgYQorCVBUX0xPQUQgc2VnbWVudCwgcmF0aGVyIHRoYW4gb25seSBzZXR0aW5nIGl0IG9uY2UgZm9yIHRoZSBlbnRpcmUKKwlmaWxlLgorCisJKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFdoZW4gc2V0dGluZyB0aGUgTE1BLAorCXJhdGhlciB0aGFuIGlnbm9yaW5nIGV2ZXJ5IHBoZHIgd2l0aCBhIHBfcGFkZHIgb2YgMCwgaWdub3JlIGFsbAorCXRoZSBwaGRycyBpZiB0aGV5IGFsbCBoYXZlIGEgcF9wYWRkciBvZiAwLgorCisJKiBzdGFicy5jIChfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyk6IENoZWNrIHdoZXRoZXIgdGhlIC5zdGFic3RyCisJc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuCisKK0ZyaSBKdWwgIDMgMTQ6Mzk6MDUgMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBjb2ZmLXNoLmMgKHNoX2luc25fdXNlc19mcmVnKTogSWdub3JlIGxvd2VzdCBiaXQgb2YgcmVnaXN0ZXIgbnVtYmVyLgorCitGcmkgSnVsICAzIDE0OjM1OjQ4IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IExvYWQgb2YgZnBzY3IgY29uZmxpY3RzIHdpdGgKKwlmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgorCitUaHUgSnVsICAyIDE4OjM3OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2tpcCB1bmRlZmluZWQgZ2xvYmFsCisJZnVuY3Rpb24gc3ltYm9scy4KKworVGh1IEp1bCAgMiAxNDo1OTo0MiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KKworCU1lcmdlIG9mIHZheC92bXMgKHJlYWQtb25seSkgc3VwcG9ydAorCSogY29uZmlndXJlLmNvbTogU3VwcG9ydCBWYXggdGFyZ2V0LgorCSogbWFrZWZpbGUudm1zOiBTdXBwb3J0IFZheCB0YXJnZXQuCisgICAgICAgICogdm1zLmg6IFJlbmFtZWQgZnJvbSBldmF4LmgsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQuCisJKiB2bXMuYzogUmVuYW1lZCBmcm9tIGV2YXgtYWxwaGEuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKKwlzdXBwb3J0LgorCSogdm1zLWhkci5jOiBSZW5hbWVkIGZyb20gZXZheC1lbWguYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKKwlzdXBwb3J0LgorCSogdm1zLWdzZC5jOiBSZW5hbWVkIGZyb20gZXZheC1lZ3NkLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCisJc3VwcG9ydC4KKwkqIHZtcy10aXIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZXRpci5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQorCXN1cHBvcnQuCisJKiB2bXMtbWlzYy5jOiBSZW5hbWVkIGZyb20gZXZheC1taXNjLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCisJc3VwcG9ydC4KKwkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBVc2UgdW5idWZmZXJlZCByZWFkIG9uIFZNUy9WYXguCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyKTogTmV3IGZsYXZvdXIuCisJKHZtc19hbHBoYV92ZWMpOiBSZW5hbWVkIGZyb20gZXZheF9hbHBoYV92ZWMuCisJKHZtc192YXhfdmVjKTogTmV3LgorCSh0YXJnZXRfdmVjdG9yKTogVXBkYXRlIGFjY29yZGluZ2x5LgorCSogY29uZmlnLmJmZCAoYWxwaGEqLSotKnZtcyopOiBVc2Ugdm1zX2FscGhhX3ZlYywgbm90CisJZXZheF9hbHBoYV92ZWMuCisJKHZheCotKi0qdm1zKik6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5hbTogVXBkYXRlIGZvciByZW5hbWVkIGZpbGVzLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgorCitUaHUgSnVsICAyIDEzOjMxOjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoIGZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46CisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBGb3JjZSBhIHRyYWlsaW5nIE5VTEwKKwlwb2ludGVyIG9uIGFiZmQtPm91dHN5bWJvbHMuCisJKGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wpOiBIYW5kbGUgTlVMTCBzeW0gcGFyYW1ldGVyLgorCitXZWQgSnVsICAxIDE3OjA1OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc3VwcG9ydCBmb3IgY2hhbmdpbmcgVk1BIG9yCisJTE1BIG9mIHNlY3Rpb25zLgorCitXZWQgSnVsICAxIDE2OjU4OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IGFkZHJlc3MgY29tcGFyaXNvbnMKKyAJd2hlbiBoYW5kbGluZyAzMiBiaXQgaW1tZWRpYXRlIHJlbG9jcy4KKwkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KKworVHVlIEp1biAzMCAwOTo1NTowMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBBY2NvdW50IGZvciByZWNlbnRseSBhZGRlZCBnY19tYXJrCisJZmllbGQgaW4gc3RydWN0IGFzZWN0aW9uLgorCisJKiBlbGYtbTEwMzAwLmMgKGJmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCisKK1RodSBKdW4gMjUgMTg6MzE6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCUVMRiBTZWN0aW9uLWxldmVsIEdhcmJhZ2UgQ29sbGVjdGlvbjoKKwkqIGJmZC5jIChiZmRfZ2Nfc2VjdGlvbnMpOiBOZXcuCisJKiBhb3V0LWFkb2JlLmM6IEhvb2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKwkqIGFvdXQtdGFyZ2V0LmgsIGFvdXQtdGljMzAuYywgYmluYXJ5LmMsIGJvdXQuYzogTGlrZXdpc2UuCisJKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmY29kZS5oOiBMaWtld2lzZS4KKwkqIGV2YXgtYWxwaGEuYywgaTM4Nm1zZG9zLmMsIGkzODZvczlrLmMsIGllZWUuYzogTGlrZXdpc2UuCisJKiBpaGV4LmMsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgcHBjYm9vdC5jLCBzcmVjLmM6IExpa2V3aXNlLgorCSogdGVraGV4LmMsIHZlcnNhZG9zLmM6IExpa2V3aXNlLgorCSogbGliYmZkLWluLmggKF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyk6IE5ldy4KKwkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfTElOSyk6IEFkZCBfYmZkX2djX3NlY3Rpb25zLgorCisJKiByZWxvYy5jIChCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOiBOZXcuCisJKGJmZF9nZW5lcmljX2djX3NlY3Rpb25zKTogTmV3LgorCSogc2VjdGlvbi5jIChTRUNfS0VFUCk6IE5ldy4KKwkoYXNlY3Rpb24pOiBBZGQgZ2NfbWFyayBtZW1iZXIuCisKKwkqIGVsZmNvZGUuaCAoZWxmX2djKik6IE5ldyBuYW1lIHJlbWFwcGluZ3MuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNldCBjb250ZW50cyBvbiBzdGFicworCXNlY3Rpb25zIHRvIGJlIGV4Y2x1ZGVkLgorCShlbGZfZ2NfbWFyaywgZWxmX2djX3N3ZWVwLCBlbGZfZ2Nfc3dlZXBfc3ltYm9sKTogTmV3LgorCShlbGZfZ2NfcHJvcG9nYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQpOiBOZXcuCisJKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBOZXcuCisJKGVsZl9nY19zZWN0aW9ucywgZWxmX2djX3JlY29yZF92dGluaGVyaXQsIGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IE5ldy4KKwkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IE5ldy4KKwkoZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzLCBlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmspOiBOZXcuCisJKiBlbGZ4eC10YXJnZXQuaDogQWRkIGFuZCBkZWZhdWx0IGdjIGhvb2tzLgorCisJKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogU3dhcCBnb3Rfb2Zmc2V0L3BsdF9vZmZzZXQKKwlmb3IgdW5pb25zLgorCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IExpa2V3aXNlIGZvciBsb2NhbF9nb3Rfb2Zmc2V0cy4KKwkqIGVsZi5jLCBlbGYtaTM4Ni5jLCBlbGYzMi1tNjhrLmMsIGVsZjMyLW1pcHMuYzogVXBkYXRlIGFsbCB1c2VzLgorCSogZWxmMzItcHBjLmMsIGVsZjMyLXNwYXJjLmMsIGVsZjY0LWFscGhhLmM6IExpa2V3aXNlLgorCSogZWxmNjQtc3BhcmMuYywgZWxmbGluay5oOiBMaWtld2lzZS4KKworCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGUgbWVtYmVycy4KKwkoRUxGX0xJTktfSEFTSF9NQVJLKTogRGVmaW5lLgorCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBHQyBob29rcy4KKwkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFplcm8gdnRhYmxlIG1lbWJlcnMuCisKKwkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfY2hlY2tfcmVsb2NzKTogTmV3LgorCShtbjEwMzAwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcuCisJKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCBSX01OMTAzMDBfR05VX1ZURU5UUlkpOiBOZXcuCisJKGVsZl9tbjEwMzAwX2hvd3RvLCBtbjEwMzAwX3JlbG9jX21hcCk6IEhhbmRsZSB0aGVtLgorCShtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTGlrZXdpc2UuCisJKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgorCSogZWxmMzItbWlwcy5jIChSX01JUFNfR05VX1ZUSU5IRVJJVCwgUl9NSVBTX0dOVV9WVEVOVFJZKTogTmV3LgorCShlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvLCBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byk6IE5ldy4KKwkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSB0aGVtLgorCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogTGlrZXdpc2UuCisJKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCisJKG1pcHNfZWxmX2djX21hcmtfaG9vaywgbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KKwkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgorCSogZWxmMzItcHBjLmMgKFJfUFBDX0dOVV9WVElOSEVSSVQsIFJfUFBDX0dOVV9WVEVOVFJZKTogTmV3LgorCShwcGNfZWxmX2hvd3RvX3Jhdyk6IEhhbmRsZSB0aGVtLgorCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlZmVyZW5jZSBjb3VudCAuZ290IGFuZCAucGx0IGVudGlyZXMuCisJSGFuZGxlIG5ldyB2dGFibGUgcmVsb2NzLgorCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlY29nbml6ZSB1bnVzZWQgLnBsdCBlbnRyaWVzLgorCShwcGNfZWxmX2djX21hcmtfaG9vaywgcHBjX2VsZl9nY19zd2VlcF9ob29rKTogTmV3LgorCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCisKK0ZyaSBKdW4gMjYgMTA6NDg6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF9tbjEwMzAwKTogRGVmaW5lLgorCSogZWxmLW0xMDMwMC5jOiBJbmNsdWRlIGVsZi9tbjEwMzAwLmgKKwkoZWxmX21uMTAzMDBfbWFjaCk6IE5ldyBmdW5jdGlvbi4KKwkoX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCisJKF9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3ApOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRmaW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgorCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IExpa2V3aXNlLgorCitUaHUgSnVuIDI1IDE4OjMxOjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IEhJMTZfUworCXJlbG9jYXRpb24uCisKK1dlZCBKdW4gMjQgMTc6MTc6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IExvb3Agb3ZlciBpbnB1dF9iZmRzIHVzaW5nIHRoZQorCWxpbmtfbmV4dCBmaWVsZCwgbm90IHRoZSBuZXh0IGZpZWxkLgorCitTdW4gSnVuIDIxIDE5OjM4OjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IENoZWNrIHRoZSBzZWN0aW9uIGFkZHJlc3MKKwlhZ2FpbnN0IHRoZSBwaGRyIHNpemUgYm90aCB3aXRoIGFuZCB3aXRob3V0IGEgbW9kdWxvIG9mCisJbWF4cGFnZXNpemUuCisKK0ZyaSBKdW4gMTkgMTc6MDg6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc3RyaXAgYQorCWxpbmtlciBjcmVhdGVkIGVtcHR5IGlucHV0IHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIGhhcyB0aGUKKwlzYW1lIG5hbWUuCisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYKKwlfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gZmFpbHMuCisKKwkqIGVsZi5jIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDYWxsIGJmZF9zZXRfZXJyb3Igb24KKwlmYWlsdXJlLgorCitUdWUgSnVuIDE2IDExOjU1OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEltcHJvdmUgaGFuZGxpbmcgb2YgU29sYXJpcworIAluYXRpdmUgbGlua2VyIG91dHB1dC4gIEF2b2lkIHB1dHRpbmcgYW4gZW1wdHkgc2VjdGlvbiBpbiBtb3JlIHRoYW4KKyAJb25lIHNlZ21lbnQuCisKK0ZyaSBKdW4gMTIgMTM6MzA6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgorCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCisKK0ZyaSBKdW4gMTIgMTM6MzQ6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBOZXcgYXJnIHJlbG9jYXRhYmxlX3AuCisJRG9uJ3QgYWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbHMgZm9yIHJlbG9jYXRhYmxlIG91dHB1dC4KKwkoX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXBkYXRlIGNhbGwgdG8KKwlzd2FwX291dF9zeW1zLgorCitNb24gSnVuICA4IDE1OjIwOjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTWFrZSBjb21wYXJpc29ucworCWFnYWluc3QgJ2FkZGVuZCcgYmUgc2lnbmVkIHJhdGhlciB0aGFuIHVuc2lnbmVkLgorCitTYXQgSnVuICA2IDAwOjMxOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW0zMnIuYzogQWRkIHByb3RvdHlwcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KKworCSogY29mZi1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCisKK0ZyaSBKdW4gIDUgMTc6MjE6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGVsZl9zb3J0X3NlY3Rpb25zKTogU29ydCBieSBMTUEgZmlyc3QgdGhlbiBWTUEsIHNpbmNlIHRoZQorCUxNQSBpcyB1c2VkIHRvIG9yZGVyIHNlY3Rpb25zIGluIGEgc2VnbWVudC4KKworCSogZWxmMzItdjg1MC5jOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KKwlDaGFuZ2UgdHlwZSBvZiBhZGRlbmQgcGFyYW1ldGVyIHRvIGJmZF92bWEgaW4gdmFyaW91cyBmdW5jdGlvbnMuCisKK0ZyaSBKdW4gIDUgMTg6MDk6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBDaGFuZ2UgUkVMT0NfQkFTRTEzIHRvIHVzZQorCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCBpbnN0ZWFkIG9mIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLgorCitGcmkgSnVuICA1IDE1OjExOjExIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBlbGYuYyAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3QgYWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbCB2YWx1ZQorCXdoZW4gY29tcGFyaW5nIGFnYWluc3QgMC4KKworV2VkIEp1biAgMyAxNzo1Mjo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitXZWQgSnVuICAzIDEyOjE4OjI0IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBHaXZlIGFuCisJZXJyb3IgaWYgcHJldmlvdXMgb2JqZWN0IGVuZGlhbm5lc3MgZG9lc24ndCBtYXRjaCBjdXJyZW50IG9iamVjdC4KKworVHVlIEp1biAgMiAxNzo1MDo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYWxsCisJX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZSliZmRfZGF0YSAoKS4KKworVHVlIEp1biAgMiAxNToyOTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvbid0IGFsd2F5cyBzZXQgdHlwZV9jaGFuZ2Vfb2sKKwlhbmQgc2l6ZV9jaGFuZ2Vfb2suCisgCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgdHlwZV9jaGFuZ2Vfb2sgYW5kCisJc2l6ZV9jaGFuZ2Vfb2sgYmVmb3JlIGNhbGxpbmcgZWxmX21lcmdlX3N5bWJvbC4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgd2UgaXNzdWUgYW4KKwl1bmRlZmluZWQgc3ltYm9sIGVycm9yLCBkb24ndCBhbHNvIGlzc3VlIGFuIG92ZXJmbG93IGVycm9yLgorCitUdWUgSnVuICAyIDEzOjUxOjAwIDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBUaGUgdGFyZ2V0IG9mIGFuCisJUl9QUENfTE9DQUwyNFBDIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2FsOyBpZiBub3QsIHByaW50IGFuIGVycm9yCisJbWVzc2FnZSBpbnN0ZWFkIG9mIGNyYXNoaW5nLgorCitNb24gSnVuICAxIDE4OjIzOjEyIDE5OTggIFl1bGkgQmFyY29oZW4gIDx5dWxpLmJhcmNvaGVuQHRlbHJhZC5jby5pbD4KKworCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfY3B1MzIpOiBEZWZpbmUuCisJKGJmZF9kZWZhdWx0X3NjYW4pOiBBZGQgY2FzZSBmb3IgNjgwNjAuICBGaXggNjgzMzIgY2FzZSB0byB1c2UKKwliZmRfbWFjaF9jcHUzMi4KKwkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbTY4azpjcHUzMi4KKwkqIGllZWUuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCisJKGllZWVfb2JqZWN0X3ApOiBQYXJzZSBvdXQgcHJvY2VzcyBJRCBzdHJpbmcgdG8gbWFrZSBpdCBtb3JlCisJbGlrZWx5IHRvIGJlIGFjY2VwdGFibGUgZm9yIGJmZF9zY2FuX2FyY2guCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKK01vbiBKdW4gIDEgMTE6MTI6MDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWxzbyBjYWxsCisJX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSgpIHNvIHRoYXQgdGhlIHByb2dyYW0gaGVhZGVyIHdpbGwKKwliZSBkaXNwbGF5ZWQuCisKK01vbiBKdW4gIDEgMTI6MTQ6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBDaGVjayBmb3IgQ19TRUNUSU9OIHJhdGhlciB0aGFuCisJMHg2OC4gIFJlaW5kZW50LiAgQWRkIHNvbWUgY29tbWVudHMuCisKK0ZyaSBNYXkgMjkgMDk6NTg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkanVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCisJc2VnbWVudCBpbiBvdXRwdXQgQkZEIHRvIGNvbnRhaW4gTE1BcyBvZiBpdHMgc2VjdGlvbnMuCisKK1R1ZSBNYXkgMjYgMTk6Mzc6NDcgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUsIHNwYXJjX3JlbG9jX21hcCwKKwllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgUl9TUEFSQ18zMkxFIGZvciBsaXR0bGUKKwllbmRpYW4gZGF0YSAzMiBiaXQgcmVsb2NhdGlvbnMuCisJKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGVjayBpZiBsaW5raW5nIGxpdHRsZQorCWVuZGlhbiBvYmplY3RzIHdpdGggYmlnIGVuZGlhbiBvYmplY3RzLgorCShlbGYzMl9zcGFyY19vYmplY3RfcCk6IFNldCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCisJKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgRUZfU1BBUkNfTEVEQVRBIGluIGVfZmxhZ3MuCisJKiBsaWJiZmQuaCAoYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lcyk6IEFkZGVkIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgorCSogcmVsb2MuYzogU2FtZS4KKwkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkZWQgc3BhcmM6c3BhcmNsaXRlX2xlCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOiBOZXcuCisJKiBiZmQtaW4yLmggKEJGRF9SRUxPQ19TUEFSQ18zMkxFLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOiBOZXcuCisKK1RodSBNYXkgMjEgMTY6NTk6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IEZpeCBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycyBpbiBpZiAoKQorCXN0YXRlbWVudC4KKworVHVlIE1heSAxOSAxODo0MToxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZC1pbi5oOiBNb3ZlIG92ZXIgcGF0Y2ggdG8gYmZkLWluMi5oLgorCisJKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBBZGQgY2FzdHMgYmVmb3JlIHNoaWZ0cyB3aGljaCBtYXkKKyAJbm90IGZpdCBpbiAzMiBiaXRzLgorCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTGlrZXdpc2UuCisKK01vbiBNYXkgMTggMTQ6NDQ6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IElmIHRoZSBzZWN0aW9uIGhhcyBubyBwcml2YXRlIGRhdGEKKwl0aGVuIGRvIG5vdCBjcmVhdGUgYSBEYXRhIERpY3Rpb25hcnkgZW50cnkgZm9yIGl0LgorCitNb24gTWF5IDE4IDAwOjA5OjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZXQgYWdhaW4gb24gY2hhbmdlcy4KKwkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMsIGVsZjY0X2FscGhhX21lcmdlX2dvdHMsCisJZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMpOiBSZXdyaXRlLCBoYW5kbGluZyBtdWx0aXBsZSBnb3QKKwlzdWJzZWN0aW9ucyBkdXJpbmcgcmVsYXhhdGlvbiBtb3JlIGNvcnJlY3RseS4KKworVGh1IE1heSAxNCAxNDoyMjo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBiZmQtaW4yLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzICgpLgorCUFkZCBleHRyYSBhcmd1bWVudCB0byBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKCkuCisJKiBiZmQtaW4uaDogUmVmbGVjdCBjaGFuZ2VzIG1hZGUgaW4gYmZkLWluMi5oLgorCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZQorCWNvZmYgY2xhc3Mgb2YgYSBCRkQgc3ltYm9sLgorCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIFRodW1iIGNvZGUgYW5kCisJbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4KKworU3VuIE1heSAxMCAyMjozMzo1OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCisKK1RodSBNYXkgIDcgMTc6NDA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBmaWxlbW9kZS5jOiBSZW1vdmU7IG5vdCB1c2VkLgorCisJSWYgc3lzZGVwLmggaW5jbHVkZXMgYSBoZWFkZXIgZmlsZSwgZG9uJ3QgaW5jbHVkZSBpdCBhZ2FpbjoKKwkqIGFpeDM4Ni1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+LCA8c3RkZGVmLmg+LCBvcgorCTxlcnJuby5oPi4KKwkqIGFvdXR4Lmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4gIFVzZSAic3lzZGVwLmgiIHJhdGhlciB0aGFuCisJPHN5c2RlcC5oPi4KKwkqIGFyY2hpdmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RyaW5nLmg+IG9yIDxlcnJuby5oPi4KKwkqIGV2YXgtYWxwaGEuYzsgRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4uCisJKiBldmF4LWVnc2QuYzogTGlrZXdpc2UuCisJKiBldmF4LWV0aXIuYzogTGlrZXdpc2UuCisJKiBldmF4LW1pc2MuYzogTGlrZXdpc2UuCisJKiBldmF4LWVtaC5jOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPi4KKwkqIGhwcGFic2QtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwgb3IKKwk8ZXJybm8uaD4uCisJKiBocHV4LWNvcmUuYzogTGlrZXdpc2UuCisJKiBuZXRic2QtY29yZS5jOiBMaWtld2lzZS4KKwkqIHNvbS5jOiBMaWtld2lzZS4KKwkqIGxpYmJmZC5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4uCisJKiBubG1jb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KKwkqIG9zZi1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPiBvciA8c3RkaW8uaD4uCisJKiBwdHJhY2UtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwKKwk8ZXJybm8uaD4sIG9yIDx1bmlzdGQuaD4uCisJKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4gb3IgPHN5cy90eXBlcy5oPi4KKworVGh1IE1heSAgNyAxMzoxMjo1MCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogY29uZmlndXJlLmNvbTogSWYgdGhlIHZlcnNpb24gbnVtYmVyIGNhbiBub3QgYmUgZm91bmQgaW4KKwljb25maWd1cmUuaW4sIHNldCBpdCB0byAidW5rbm93biIgcmF0aGVyIHRoYW4gIjIuOC4xIi4KKworV2VkIE1heSAgNiAwOTo0NjowNSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogTmV3LgorCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogVXNlIGVsZl9taXBzX21hY2guCisJKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZSB0aGUgbmFtZXMKKwlvZiBtYWNoaW5lcywgcmF0aGVyIHRoYW4gdGhlIG51bWJlcnMuICBTZXQgYm90aCB0aGUgQVJDSAorCWFuZCBNQUNIIGluIGVfZmxhZ3MuICBIYW5kbGUgYSBmZXcgbW9yZSBzcGVjaWZpYyBtYWNoaW5lcy4KKwkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTWVyZ2UgYm90aAorCUVGX01JUFNfQVJDSCBhbmQgRUZfTUlQU19NQUNILgorCitUdWUgTWF5ICA1IDIxOjAxOjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgorCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBEaXNjYXJkIGRlYnVnZ2luZyBzeW1ib2xzLgorCitUdWUgTWF5ICA1IDIzOjM2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc29tLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgorCSogc29tLmg6IERvbid0IGluY2x1ZGUgc3lzZGVwLmguCisKK1R1ZSBNYXkgIDUgMTg6Mjk6MjQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIGdldHRleHQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCisJKiBzeXNkZXAuaDogTW92ZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzIGhlcmUuCisKK1R1ZSBNYXkgIDUgMTY6NDc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHJhdGhlciB0aGFuCisJYW4gYWQtaG9jIHRlc3QuICBLaWxsIGJvZ3VzICNpZiAwIGNvZGUuCisJKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IENvbnNpZGVyIEJTRl9ERUJVR0dJTkcgc3ltYm9scyBsb2NhbC4KKworTW9uIE1heSAgNCAxNjoxMDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBEb24ndCB1c2UgdGhlIFBMVCBhZGRyZXNzCisJd2hlbiBnZW5lcmF0aW5nIGEgbm9ybWFsIGV4ZWN1dGFibGUgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQorCXJlZ3VsYXIgZmlsZS4gIFdoZW4gY29weWluZyBhIHJlbG9jIGludG8gdGhlIG91dHB1dCBmaWxlLCBhZGp1c3QKKwl0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLgorCitNb24gTWF5ICA0IDEwOjA4OjE4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogbGliYmZkLmg6IFJlYnVpbHQuCisJKiBsaWJiZmQtaW4uaCAoXyk6IERlZmluZSBhcyBkZ2V0dGV4dC4KKworTW9uIE1heSAgNCAxMTowMjoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IHRvIGJmZF9zaWduZWRfdm1hLAorCW5vdCBzaWduZWQuCisJKiBwZWljb2RlLmggKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBVc2UgUEFSQU1TCisJd2hlbiBkZWNsYXJpbmcgcGFyYW1ldGVyIHR5cGVzLgorCShwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KKworV2VkIEFwciAyOSAxNTozNTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IElmIHdlIGluY2x1ZGUgYW55IEVMRiB0YXJnZXRzIGluIHRhcmdfZGVmdmVjIGFuZC9vcgorCXRhcmdfc2VsdmVjcywgdGhlbiBhZGQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldHMgdG8gdGFyZ19zZWx2ZWNzLgorCSogZWxmMzItZ2VuLmMgKGR1bW15KTogTmV3IHN0YXRpYyBjb25zdCB2YXJpYWJsZS4KKwkoZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgYXMgZWxmX2dlbmVyaWNfaW5mb190b19ob3d0by4KKwkoZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVmaW5lIGFzIGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsLgorCSogZWxmNjQtZ2VuLmM6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMi1nZW4uYy4KKwkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogRm9yIHRoZSBnZW5lcmljIHRhcmdldCwgaWdub3JlIGEKKwlmYWlsdXJlIG9mIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBGaXggaW5kZW50YXRpb24gYSBiaXQuCisKK1R1ZSBBcHIgMjggMjA6MDU6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKFdJTjMyTElCQUREKTogQWRkIC1saW50bCBvbiBjeWd3aW4zMi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIEFwciAyOCAxMjoxNjo1NyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZDogIFVwZGF0ZSBPU1I1L1VuaXh3YXJlIHBhdHRlcm5zLgorCitNb24gQXByIDI3IDE4OjAyOjI0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWxsb3cgZm9yIGhvbGVzCisJYmV0d2VlbiBzZWN0aW9ucyBhZGRlZCBieSBhIGxpbmsgc2NyaXB0LgorCitNb24gQXByIDI3IDExOjQ5OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgorCSogZWxmLmMgKGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KKwkqIGJmZC1pbi5oIChiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitTYXQgQXByIDI1IDIwOjA3OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogUmVwbGFjZSBlbGZzeW0gd2l0aCBvdGhlci4KKwlDaGFuZ2UgYWxsIHVzZXJzLgorCitTYXQgQXByIDI1IDE4OjI5OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogQWRkIHRzZWMgJiBlbGZzeW0gbWVtYmVycy4KKwkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEZpbGwgdGhlbSBpbi4KKwkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBJbXBsZW1lbnQgbW9yZSB0aGFuIGEgc3R1Yi4KKwkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19MT0FEIG9yIGRlZmF1bHQKKwlhbGlnbm1lbnQgb24gLnNjb21tb24uCisJKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSB1c2UgY291bnRzIGFzIHdlbGwuCisKK1NhdCBBcHIgMjUgMTQ6MDc6MjkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFVzZSB0aGUgcHJvcGVyIHNlY3Rpb24KKwlmb3IgY2FsY3VsYXRpbmcgYSBsb2NhbCBzeW1ib2wncyBhZGRyZXNzLgorCShlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzKTogU2tpcCBlbnRyaWVzIHdpdGggMCB1c2UgY291bnQuCisJU2V0IHRoZSAuZ290J3MgY29va2VkIHNpemUgYXMgd2VsbCBhcyB0aGUgcmF3IHNpemUuCisKK0ZyaSBBcHIgMjQgMDk6MTY6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkCisJaW50ZXJuYXRpb25hbGlzYXRpb24gb2YgcHJpbnRlZCBpbmZvcm1hdGlvbi4KKworCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZAorCWludGVybmF0aW9uYWxpc2F0aW9uIG9mIHByaW50ZWQgaW5mb3JtYXRpb24uCisKK0ZyaSBBcHIgMjQgMTI6MDk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1zLmMgKHN0cnVjdCBpbmRleGVudHJ5KTogQ2hhbmdlIGRpcmVjdG9yeV9uYW1lLCBmaWxlX25hbWUsCisJYW5kIGZ1bmN0aW9uX25hbWUgZmllbGRzIHRvIGNoYXIgKi4KKwkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogQ2hhbmdlIGNhY2hlZF9maWxlX25hbWUgZmllbGQgdG8gY2hhciAqLgorCitUaHUgQXByIDIzIDA4OjEzOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkIG1pc3NpbmcgTl8oKSBtYWNyb3MgdG8gZGlyX25hbWVzIGFycmF5LgorCitXZWQgQXByIDIyIDEzOjA2OjE1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KKworV2VkIEFwciAyMiAxNzo0ODo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlICQoaW5jbHVkZWRpcikuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworV2VkIEFwciAyMiAxMzowNjoxNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGxpYmJmZC1pbi5oOiBVc2UgYGdldHRleHQnIGFuZCBub3QgYGRnZXR0ZXh0JyBmb3Igbm93LgorCitXZWQgQXByIDIyIDEyOjUzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGJmZC1pbjIuaDogUmVidWlsZCBmb3IgTmljaydzIGNoYW5nZXMuCisKK1R1ZSBBcHIgMjEgMjM6MTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRml4IGxvc3NhZ2UgaW4gbGFzdAorCWNoYW5nZSB3cnQgbGVuZ3RoID09IG1heF9uYW1lbGVuLgorCitUdWUgQXByIDIxIDIxOjE5OjM2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+CisKKwkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQorCXN0cmluZ3MuCisJKiBsaWJiZmQtaW4uaDogQWRkZWQgZ2V0dGV4dCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KKwkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKKwlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgorCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAorCXBvL01ha2VmaWxlLgorCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KKwkoUE9URklMRVMpOiBOZXcgbWFjcm8uCisJKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KKwkoU09VUkNFX0hGSUxFUyk6IE5ldyBtYWNyby4KKwkoSEZJTEVTKTogVXNlIGl0LgorCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JmZC5wb3Q6IE5ldyBmaWxlcy4KKworVHVlIEFwciAyMSAxMzozODoxOCAxOTk4IFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiAgQ29weSBjb3JlX3Byc3RhdHVzIGZyb20gdGhlIGZpcnN0CisJTlRfUFJTVEFUVVMgbm90ZSBzZWN0aW9uIGVuY291bnRlcmVkLCBpdCBjb250YWlucyB0aGUgc3RhdHVzIG9mCisJdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkIHdoZW4gdGhlIGNvcmUgZmlsZSB3YXMgd3JpdHRlbi4KKworVHVlIEFwciAyMSAxMDowMDoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLmg6IEFkZCBleHRyYSBwYXJhbWV0ZXIgdG8KKwliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gb3ZlcnJpZGVhYmxlIGZ1bmN0aW9uLgorCSogY29mZmxpbmsuYzogUGFzcyBleHRyYSBwYXJhbWV0ZXIgdG8KKwliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gZnVuY3Rpb24uCisJKiBiZmQtaW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIEFSTSBpbnRlcndvcmtpbmcKKwlmdW5jdGlvbnMuCisJKiBwZWljb2RlLmg6IEFSTSBzcGVjaWZpYyBjb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gQkZECisJY29kaW5nIGNvbnZlbnRpb25zLgorCSogY29mZmNvZGUuaDogQVJNIHNwZWNpZmljIGNvZGUgcmVvcmdhbmlzZWQgdG8gY29uZm9ybSB0byBCRkQKKwljb2RpbmcgY29udmVudGlvbnMuCisJKiBjb2ZmLWFybS5jOiBDb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gdGhlIEJGRCBjb2RpbmcKKwljb252ZW50aW9ucy4gIEdsb2JhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYW4gQVJNCisJc3BlY2lmaWMgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgYW5kIGEgbmV3IGZ1bmN0aW9uOgorCWJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKCkgaGFzIGJlZW4gY3JlYXRlZCB3aGljaCBpcworCWNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cy4KKworVHVlIEFwciAyMSAwMDoxMTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBTaW1wbGlmeSBlbmQtb2YtbmFtZSB0ZXN0LgorCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyk6IFJlbmFtZWQgZnJvbQorCWVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KKwkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogUHV0IHNtYWxsIGNvbW1vbnMgaW4gLnNjb21tb24gbm90IC5zYnNzLgorCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IERvbid0IG1lcmdlIC5nb3Qgc2VjdGlvbnMgdHdpY2UuCisKK1NhdCBBcHIgMTggMDE6MjE6MDQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCisKK0ZyaSBBcHIgMTcgMjI6Mjk6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgY29tcGxhaW4gYWJvdXQKKwlhbiBvdXQgb2YgcmFuZ2UgcGMtcmVsYXRpdmUganVtcC9jYWxsIHRvIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KKworVGh1IEFwciAxNiAxMzo0OTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3ApOiBEbyBhbGwgZ3BkaXNwCisJY29tcGFyaXNvbnMgc2lnbmVkLgorCitUaHUgQXByIDE2IDExOjQzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiBhIHNsdXJwIHN1YnJvdXRpbmUgcmV0dXJucworIAlhbiBlcnJvciBvdGhlciB0aGFuIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwgc2V0IHRoZSBlcnJvciB0bworIAliZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LgorCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKSBbU0VMRUNUX1ZFQ1Mgbm90IGRlZmluZWRdOiBBZGQKKwliZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYy4KKworCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgaW4gdGhlCisJcHJvZ3JhbSBzZWdtZW50cyBhcmUgemVybywgZG9uJ3Qgc2V0IHBfcGFkZHJfdmFsaWQuCisKK1dlZCBBcHIgMTUgMjI6MTU6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmNjQtYWxwaGEuYzogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiByZWxheGF0aW9uIC0tCisJKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHVzZV9jb3VudCBtZW1iZXIuCisJKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IEluaXRpYWxpemUgYW5kIGluY3JlbWVudCBpdC4KKwkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMpOiBDaGVjayBpdCB3aGVuIGNvbnNpZGVyaW5nIG1lcmdpbmcuCisJKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBEcm9wIGVudHJpZXMgd2l0aCB6ZXJvIHVzZS4KKwkoZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sKTogTGlrZXdpc2UuCisJKGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogU3BsaXQgb3V0IGdvdCBzaXppbmcgLi4uCisJKGVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zKTogLi4uIGhlcmUuICBOZXcgZnVuY3Rpb24uCisJKGVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzKTogTmV3IGZ1bmN0aW9uLgorCShlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSk6IExpa2V3aXNlLgorCShlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSk6IExpa2V3aXNlLgorCShlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCk6IExpa2V3aXNlLgorCShlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgorCShlbGY2NF9hbHBoYV9ob3d0b190YWJsZSk6IEltcGxlbWVudCBHUFJFTEhJR0gvTE9XICYgSU1NRURfR1BfMTYuCisJKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgorCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KKworV2VkIEFwciAxNSAxNjowODo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogVXNlIG5ldyBFTV9TUEFSQ1Y5IHN5bWJvbC4KKwkqIGVsZjY0LXNwYXJjLmMgKEVMRl9NQUNISU5FX0NPREUpOiBMaWtld2lzZS4KKwkoRUxGX01BQ0hJTkVfQUxUMSk6IE5ldy4gIFNldCB0byBFTV9PTERfU1BBUkM2NC4KKworV2VkIEFwciAxNSAxMTozNDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIC1sa2VybmVsMzIgdG8gV0lOMzJMSUJBREQgb24gY3lnd2luMzIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK01vbiBBcHIgMTMgMTY6NDY6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAobGliYmZkX2xhX0xJQkFERCk6IEFkZCBAV0lOMzJMSUJBRERALgorCShsaWJiZmRfbGFfTERGTEFHUyk6IEFkZCBAV0lOMzJMREZMQUdTQC4KKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFdJTjMyTERGTEFHUyBhbmQKKwlXSU4zMkxJQkFERC4KKwkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBBcHIgMTAgMTM6NDQ6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1vdmUgYSBQRSBDT01EQVQgc3ltYm9sCisJYmVmb3JlIGFueSBvdGhlciBzeW1ib2xzIGluIHRoZSBzYW1lIHNlY3Rpb24uCisKK1dlZCBBcHIgIDggMTQ6NTA6MjMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQgKHBvd2VycGMqLSotKik6IFJlbW92ZSBQb3dlclBDIE5UIHN1cHBvcnQgZnJvbSBFTEYKKwlzeXN0ZW1zLgorCitUdWUgQXByICA3IDE2OjI1OjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBkd2FyZjIuYyAoY29tcF91bml0KTogTW92ZSBpdCBlYXJsaWVyIGluIHRoZSBzb3VyY2UuIEFkZAorCWFkZHJfc2l6ZS4KKwkocmVhZF9hZGRyZXNzKTogUmVwbGFjZSAnYmRmKicgYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCisgICAgICAgIFVzZSBhZGRyX3NpemUgZm9yIGFkZHJlc3Mgc2l6ZSwgcmF0aGVyIHRoYW4gc2l6ZW9mKGJmZF92bWEpLgorCShyZWFkX2F0dHJpYnV0ZSk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KKwlGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCisJKGRlY29kZV9saW5lX2luZm8pOiBSZXBsYWNlIGJkZiogYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCisJU2NyYXAgb3RoZXIgdW5uZWVkZWQgYXJndW1lbnRzLiAgRml4IGNhbGwgdG8gcmVhZF9hZGRyZXNzLgorCShzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyk6IEZpeCBjYWxsIHRvIHJlYWRfYXR0cmlidXRlLgorCShwYXJzZV9jb21wX3VuaXQpOiBXZSBub3cgaGFuZGxlIG1vcmUgdmFsdWVzIGZvciBhZGRyX3NpemUuCisJU2V0IGFkZHJfc2l6ZSBpbiB1bml0LiAgRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUgYW5kCisJZGVjb2RlX2xpbmVfaW5mby4KKworVHVlIEFwciAgNyAxNTo0NDo0NyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBkd2FyZjIuYyAocGFyc2VfY29tcF91bml0KTogRHJvcCB1c2Ugb2YgdW5pdC0+bmFtZSB3aGVuIGl0IGlzIG51bGwuCisKK1R1ZSBBcHIgIDcgMTI6MzU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIG02OGsgY2FzZXMgYmFjayB0byBkZWZhdWx0CisJc3dpdGNoLCByZXZlcnRpbmcgcGF0Y2ggb2YgTWFyY2ggMjUsIHNpbmNlIElFRUUgc3VwcG9ydCBkZXBlbmRzCisJdXBvbiB0aGVtLgorCitNb24gQXByICA2IDE0OjA2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworU3VuIEFwciAgNSAxNjoyMTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEZpeCBjb21wdXRhdGlvbiBvZgorCXNvbV9vZmZzZXQgd2hlbiB3ZSBoYXZlIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCisKK1N1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJiZmQuYSBleGlzdHMgYmVmb3JlCisJdHJ5aW5nIHRvIGNvcHkgaXQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworRnJpIEFwciAgMyAxMTowOTo0MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBzZWN0aW9uCisJc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLCB1c2VkIGJ5IGFib3ZlIGNvZGUuCisJKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbgorCXN5bWJvbHMuCisJKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgYWJvcnQgdG8gQkZEX0FTU0VSVC4KKworV2VkIEFwciAgMSAxNjowNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogVXNlIEFSTV9SVkEzMiBpbiBwbGFjZSBvZiBjb25zdGFudAorCXZhbHVlIDExLgorCitXZWQgQXByICAxIDEzOjM2OjU4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24sIGNhc2UgUl82OEtfUExUKk8pOiBGaXgKKwlhc3NlcnRpb24uCisKK1R1ZSBNYXIgMzEgMDA6MTI6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgaGFuZGxlCisJYWJzb2x1dGUgc3ltYm9scy4KKworTW9uIE1hciAzMCAxMjo0NjoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KKworTW9uIE1hciAzMCAxMjoyMDo1MCAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+CisKKwkqIHN5bXMuYyAoRU5BQkxFX0NBQ0hJTkcpOiBEZWZpbmUuCisJKHN0cnVjdCBpbmRleGVudHJ5KTogRGVmaW5lLgorCShzdHJ1Y3Qgc3RhYl9jYWNoZSk6IFJlbW92ZS4KKwkoY21waW5kZXhlbnRyeSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IEFkZCBuZXcgZmllbGRzOiBpbmRleHRhYmxlLAorCWluZGV4dGFibGVzaXplLCBjYWNoZWRfaW5kZXhlbnRyeSwgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsIGFuZAorCWNhY2hlZF9maWxlX25hbWUuICBSZW1vdmUgZmllbGRzOiBmaWxlX2NhY2hlLCBmdW5jdGlvbl9jYWNoZSwgYW5kCisJbGluZV9jYWNoZS4KKwkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZXdyaXRlIHRvIGJ1aWxkIGEgc29ydGVkCisJaW5kZXggdGFibGUgYW5kIHNlYXJjaCBpdC4KKworTW9uIE1hciAzMCAxMDozOTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbAorCWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBvbmNlIHdlJ3ZlIHNlZW4gdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24uCisKKwkqIGNwdS1taXBzLmM6IFJlbW92ZSB0cmFpbGluZyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRpb24gbGlzdC4KKworU2F0IE1hciAyOCAxNjozMzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmM6IERlZmluZSBhbGwgZ2xvYmFsbHkgdmlzaWJsZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucworCW9ubHkgd2hlbiBDT0ZGX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCisJKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMpOiBBZGQKKwljb2ZmLWFybS5sby4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworRnJpIE1hciAyNyAxNjowNjowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6CisJKiBhb3V0LWFybS5jIChNWShmaXhfcGNyZWxfMjYpKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTGlrZXdpc2UuCisJKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogTGlrZXdpc2UuCisJKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTGlrZXdpc2UuCisJKiBiaW5hcnkuYyAobWFuZ2xlX25hbWUpOiBMaWtld2lzZQorCSogY29mZi1hcm0uYyAoYW91dGFybV9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KKwkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogY29mZi1zdGdvMzIuYyAoY3JlYXRlX2dvMzJfc3R1Yik6IExpa2V3aXNlLgorCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogTGlrZXdpc2UuCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCisJKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgorCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IExpa2V3aXNlLgorCShtYW5nbGVfbmFtZSk6IExpa2V3aXNlLgorCSogcmlzY2l4LmMgKHJpc2NpeF9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KKwkqIHNyZWMuYyAoc3JlY19zY2FuKTogTGlrZXdpc2UuCisJKiBzdGFicy5jIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KKwkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkqIGFvdXQtbnMzMmsuYyAoX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KKwlzd2l0Y2guICBEZWNsYXJlIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgorCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IEFkZCBicmFjZXMgdG8gYXZvaWQgYW1iaWd1b3VzIGlmCisJd2FybmluZy4KKwkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogY29mZi1hcm0uYyAoY29mZl90aHVtYl9wY3JlbF9jb21tb24pOiBJbml0aWFsaXplIHJlbG9jYXRpb24uCisJQWRkIGRlZmF1bHQgY2FzZXMgdG8gc3dpdGNoZXMuCisJKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KKwlBbHdheXMgc2V0IHJzdGF0LgorCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2UgZmxhZyB2YXJpYWJsZSB0byB0eXBlCisJZmxhZ3dvcmQuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSB1c2VfbG8uCisJKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KKwkoZHVtcF90b2MpOiBDaGFuZ2UgY2F0IHRvIGNvbnN0LCBhbmQgaW5pdGlhbGl6ZSBpdC4KKwkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5pdGlhbGl6ZSBzdGFydCBhbmQgdm9mZi4KKwkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KKwkoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHJfc3ltbmR4LgorCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGRlY2xhcmUKKwlvbGRfc29mYXIgaWYgQUxJR05fU0VDVElPTlNfSU5fRklMRS4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplIGNzeW0uCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBNYWtlIHR5cGUgYW5kIGNsYXNzIHVuc2lnbmVkLgorCSogY3B1LW5zMzJrLmMgKF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KKwlzd2l0Y2guCisJKiBkd2FyZjIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkocmVhZF8yX3NpZ25lZF9ieXRlcywgcmVhZF80X3NpZ25lZF9ieXRlcyk6IENvbW1lbnQgb3V0LgorCShkZWNvZGVfbGluZV9pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCisJKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3NkYTE2X3JlbG9jKTogTGlrZXdpc2UuCisJKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBMaWtld2lzZS4KKwkodjg1MF9lbGZfcmVsb2MpOiBMaWtld2lzZS4KKwkqIGVsZi1iZmQuaCAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpOiBNYWtlIGFsaWdubWVudCB1bnNpZ25lZC4KKwkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBNYWtlIGN2ZXJkZWZzIGFuZCBjdmVycmVmcyB1bnNpZ25lZC4KKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWx3YXlzIHNldCBhZGp1c3QuCisJKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEluaXRpYWxpemUgdG1wX2FkZHIuICBGdWxseQorCXBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgorCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWx3YXlzIGluaXRpYWxpemUgaC4KKwkobTMycl9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KKwkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3QuCisJKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBsYXN0IGFuZCBkaW5keC4KKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KKwkodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisJKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2Ugc3ltY291bnQgYW5kIGkgdG8KKwl1bnNpZ25lZCBsb25nLgorCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGFuZ2UgdmVybnVtIHRvCisJdW5zaWduZWQgaW50LCBhbmQgaW5pdGlhbGl6ZSBpdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisJKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FzdCAtMSB0byBiZmRfc2l6ZV90eXBlCisJd2hlbiBzZXR0aW5nIG9yIGNvbXBhcmluZyB0byBzb25hbWVfaW5keC4KKwkoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ2hhbmdlIG51bV9zeW1ib2xzIHRvCisJdW5zaWduZWQgaW50LgorCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IENoYW5nZSBmbGFncyB0byBmbGFnd29yZC4KKwkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJbml0aWFsaXplIGlkeC4gIENoYW5nZSBqIHRvCisJYmZkX3NpemVfdHlwZS4gIEluaXRpYWxpemUgaGludF9tZW1iZXIuICBSZW1vdmUgdXNlbGVzcyB0ZXN0IHRvCisJdGltZV9zdGFtcC4KKwkocGVfcHJpbnRfZWRhdGEpOiBDaGFuZ2UgbnVtX2Z1bmN0aW9ucyBhbmQgbnVtX25hbWVzIGluIHN0cnVjdAorCUVEVF90eXBlIHRvIHVuc2lnbmVkIGxvbmcuICBSZW1vdmUgY2FzdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdAorCXN0cmluZy4KKwkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoYW5nZSBpIHRvIHNpemVfdC4KKwkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB1bnNpZ25lZAorCWludC4KKwkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHNocmlua3MgdG8KKwlpbnQgKi4gIFVwZGF0ZSB1c2VzLiAgQ2hhbmdlIGogdG8gbG9uZy4KKwkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgorCitGcmkgTWFyIDI3IDEwOjEwOjQ2IDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyBSZW1vdmUgZGVmaW5pdGlvbiBvZiBVU0VfUkVMLgorCSh2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24uCisJKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBSZW5hbWVkIGZyb20KKwl2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbi4gIFJlbW92ZWQgcmVwbGFjZSBhcmd1bWVudC4KKwkodjg1MF9lbGZfcmVsb2MpOiBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbiB0aGUgYWRkZW5kIGZpZWxkIGluc3RlYWQKKwlvZiB0aGUgaW5zbi4KKwkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBOb3cgY2FsbHMKKwl2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uCisJKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgUmVtb3ZlIGNvZGUgdG8gZ2VuZXJhdGUgUkVMCisJcmVsb2NhdGlvbnMuCisKK1RodSBNYXIgMjYgMTM6MzI6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UKKwljbGFzcyBpbiB0aGUgbmF0aXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgZm9yIGEgbmV3IHNlY3Rpb24KKwlzeW1ib2wuCisKK1RodSBNYXIgMjYgMTA6MTM6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oOiBDaGFpbiB0b2dldGhlciBjYWxscyB0bworCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKKwljb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLgorCisJKiBjb2ZmLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IKKwljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKKwljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgorCitXZWQgTWFyIDI1IDE1OjQ1OjU1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBwcml2YXRlIGZhbGdzIGV2ZW4gZm9yIGEgUEUKKwlidWlsZC4KKworCSogcGVpY29kZS5oOiBDYWxsIGFybS1jb2ZmIHByaXZhdGUgZGF0YSBmdW5jdGlvbnMgYWZ0ZXIgaGFuZGxpbmcKKwlwZSBwcml2YXRlIGRhdGEuCisKKwkqIGNvZmYtYXJtLmM6IFR1cm4gc3RhdGljcyBpbnRvIGdsb2JhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQKKwlib3RoIHBlIGFuZCBwZWkgYmFja2VuZHMuCisKK1dlZCBNYXIgMjUgMTU6MTk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IFVzZSBiZmRfbWFjaF9tNjgqIHJhdGhlciB0aGFuCisJcGxhaW4gbnVtYmVycy4KKwkoc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IExpa2V3aXNlLgorCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KKworV2VkIE1hciAyNSAxMzo1OToyNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTY4Kik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBtNjhrCisJdmFyaWFudHMuCisJKGJmZF9kZWZhdWx0X3NjYW4pOiBSZW1vdmUgbTY4ayBzcGVjaWFsIGNhc2VzLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogbWlwc2JzZC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyCisJdGhhbiBwbGFpbiBudW1iZXJzLgorCSogc3BhcmNseW54LmMgKE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSk6IExpa2V3aXNlLgorCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLiAgQWRkIGVudHJ5IGZvcgorCW02OGs6NjgwMDAuCisJKGJmZF9tNjhrX2FyY2gpOiBTZXQgbWFjaCBmaWVsZCB0byB6ZXJvIHRvIHNpZ25hbCBubyBleHBsaWNpdAorCXNlbGVjdGlvbiwgY2hhbmdlIHByaW50YWJsZV9uYW1lIHRvIGp1c3QgIm02OGsiIGFuZCBtYWtlIHRoYXQgdGhlCisJZGVmYXVsdCBpbnN0ZWFkIG9mIG02OGs6NjgwMjAuCisKKwkqIGFvdXQtdGljMzAuYyAoTkFNRSk6IERlZmluZSB0aGlzIHRvIGF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zCisJZnJvbSBhb3V0eC5oLgorCShNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSBhcyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCisJcmF0aGVyIHRoYW4gTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKS4KKworCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBGaXggY2FzdC4KKworCSogZXZheC1hbHBoYS5jIChldmF4X3NldF9hcmNoX21hY2gpOiBPbmx5IGFjY2VwdCBiZmRfYXJjaF9hbHBoYQorCWFuZCBjYWxsIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8gZG8gdGhlIHJlYWwgd29yay4KKworV2VkIE1hciAyNSAxMDo0MTozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBib3V0LmMgKEJBTFgpOiBJbmNsdWRlIHJldHVybiByZWdpc3RlciBnMTQgYXMgcGFydCBvZiB0aGUgaW5zbi4KKwkoQkFMWF9NQVNLKTogTmV3LgorCShjYWxsanhfY2FsbGJhY2spOiBVc2UgaXQuCisKK1dlZCBNYXIgMjUgMTE6MTk6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogQ2FzdCB0aGlzIHBhcmFtZXRlciB0byBiZmRfdm1hLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisKKwkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IENoYW5nZQorCWJ5dGVfY291bnQgdG8gdW5zaWduZWQgaW50LgorCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBpbnRlcm5hbF9yZWxvY3MuICBSZW1vdmUKKwl1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgorCisJKiBldmF4LWFscGhhLmMgKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBSZW1vdmUgdW51c2VkIGxvY2FsCisJdmFyaWFibGVzIGVyIGFuZCBlcjEuCisKKwkqIGNwdS12ODUwLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgorCShzY2FuKTogQ2FzZSBpc2RpZ2l0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIuCisKKwlGcm9tIFlhbiBNZXJvdGggPFlBTi5NRVJPVEhAc3QuY29tPjoKKwkqIGloZXguYyAoaWhleF9zY2FuKTogQWRkIGV4dGJhc2UgdmFyaWFibGUgc28gdGhhdCBnZXR0aW5nIGFuCisgCWV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZCBkb2VzIG5vdCBpZ25vcmUgYW55IHByZXZpb3VzCisgCWV4dGVuZGVkIGFkZHJlc3MuCisJKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV2hlbiB3cml0aW5nIG91dCBhbiBleHRlbmRlZCBsaW5lYXIKKyAJYWRkcmVzcyByZWNvcmQsIHplcm8gb3V0IGFueSBwcmV2aW91cyBleHRlbmRlZCBhZGRyZXNzLgorCitUdWUgTWFyIDI0IDE2OjA5OjQzIDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSogaWVlZS5jIChkb19vbmUpOiBDaGVjayBzZWN0aW9uIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0LgorCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlIHdpdGggc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIuCisJKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTGlrZXdpc2Ugd2l0aCBhYmZkLT5teV9hcmNoaXZlLgorCitNb24gTWFyIDIzIDE4OjUxOjQ3IDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgorCisJKiBjb25maWcuYmZkOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KKworTW9uIE1hciAyMyAxNDoyMzozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jOiBBZGQgaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBwZSBiYWNrZW5kcy4KKworRnJpIE1hciAyMCAxODo0NzoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCisKK0ZyaSBNYXIgMjAgMTE6MjU6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEJldHRlciBlcnJvciBtZXNzYWdlcworCXdoZW4gaW50ZXJvd3JraW5nIGNvbmZsdWN0cyBvY2N1ci4gIENvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbgorCWFuZCBUb255IFRob21wc29uLgorCShhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IEZpeGVkIGJpdHNpemUgZmllbGRzIG9mIHJpZ2h0c2hpZnRlZAorCXJlbG9jYXRpb25zLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255CisJVGhvbXBzb24uCisKK0ZyaSBNYXIgMjAgMDI6MjY6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV2ZXJ0CisJcGFydCBvZiBGZWIgMjIgY2hhbmdlIGNvbnRyb2xpbmcgd2hlbiB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcKKwlzeW1ib2wgd2l0aCB0aGUgLnBsdCBlbnRyeS4KKworV2VkIE1hciAxOCAwOToyNjoyNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCisKKwkqIGNvZmZjb2RlLmggKE9USEVSX0dMT0JBTF9DTEFTUyk6IFN1cHBvcnQgdGh1bWIgZXh0ZXJuYWwKKwlmdW5jdGlvbnMgaW4gUEUgYnVpbGQuCisKK1N1biBNYXIgIDggMjM6Mzc6MjYgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZCAoc3BhcmNsaXRlLSotZWxmKik6IEFkZGVkLgorCitNb24gRmViIDIzIDE5OjMxOjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgZWxmLmxvIHRvIGVsZiBzaGVsbCB2YXJpYWJsZS4KKwkqIE1ha2VmaWxlLmFtIChCRkRfTElCUyk6IFJlbW92ZSBlbGYubG8uCisJKEJGRF9MSUJTX0NGSUxFUyk6IFJlbW92ZSBlbGYuYy4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmLmxvLgorCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmLmMuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisxOTk4LTAyLTIzIDE1OjUzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBIHBjLXJlbGF0aXZlCisJcmVsb2NhdGlvbiBhZ2FpbnN0IGEgbm93LWxvY2FsIHN5bWJvbCBzaG91bGQgbm90IGhhdmUgYSBkeW5hbWljCisJcmVsb2NhdGlvbi4KKworTW9uIEZlYiAyMyAxNjoxNzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBzZXQgQkZEIGZsYWcgSEFTX1NZTVMgaW4KKwlDT0ZGIGZpbGVoZHIgZmxhZ3MuCisJKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBQRSBmbGFncy4gIEZyb20gTWlrZXkKKwk8amVmZmRiQG5ldHpvbmUuY29tPi4KKworU3VuIEZlYiAyMiAyMDozOTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKKyAJYSBwbHQgZW50cnkgd2hlbiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgd2UgYXV0aG9yaXRhdGl2ZWx5IGRlZmluZQorIAl0aGUgc3ltYm9sLgorCitTdW4gRmViIDIyIDIwOjMzOjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoQ09SRUZJTEUgc2VsZWN0aW9uKTogUmVtb3ZlIHNwYXJjLSotbGludXgqLiAgVGhleQorCWRvbid0IGFjdHVhbGx5IHVzZSB0cmFkLWNvcmUsIGJ1dCBhIFN1bk9TLXN0eWxlIGNvcmUgZmlsZSBoYW5kbGVkCisJYnkgZ2RiIGRpcmVjdGx5LgorCSogaG9zdHMvc3BhcmNsaW51eC5oOiBSZW1vdmUuCisKK1dlZCBGZWIgMTggMTU6MzE6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogSWYgdGhlcmUgaXMgbm8gLmlkYXRhIHNlY3Rpb24sIGxvb2sKKwlmb3IgdGhlIGltcG9ydCB0YWJsZXMgaW4gc29tZSBvdGhlciBzZWN0aW9uLiAgTWFrZSB0aGUgaW5pdGlhbAorCWxhYmVsIGxpbmUgdXAgYmV0dGVyIHdpdGggdGhlIGRhdGEuICBQcmludCB0aGUgaW1wb3J0IGFkZHJlc3MKKwl0YWJsZSBldmVuIGlmIHRoZXJlIGlzIG5vIGltcG9ydCBuYW1lIHRhYmxlLiAgSWYgdGhlIGltcG9ydAorCWFkZHJlc3MgdGFibGUgaG9sZHMgYWN0dWFsIGFkZHJlc3NlcywgcHJpbnQgdGhlbS4KKworVHVlIEZlYiAxNyAxMjo1ODozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IElmIGZzZWVrIGZhaWxzLCBzYXZlIGVycm5vIGFyb3VuZCBjYWxsIHRvCisJYmZkX3RlbGwuICBJZiBlcnJubyBpcyBFSU5WQUwsIHNldCBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsIG5vdAorCWJmZF9lcnJvcl9zeXN0ZW1fY2FsbC4KKworRnJpIEZlYiAxMyAxMzoxMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCisKKwlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKKwkqIE1ha2VmaWxlLmFtIChsaWJiZmRfbGFfTERGTEFHUyk6IERlZmluZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitUaHUgRmViIDEyIDE3OjMxOjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgorCSogbmV0YnNkLmggKE1BQ0hUWVBFX09LKTogRGVmaW5lLgorCShNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIERFRkFVTFRfQVJDSCBhbmQgREVGQVVMVF9NSUQgd2hlbgorCWNhbGxpbmcgTl9TRVRfTUFDSFRZUEUsIHJhdGhlciB0aGFuIGhhdmluZyBhIHN3aXRjaC4KKwkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9QTUFYX05FVEJTRCwgTV9WQVhfTkVUQlNELAorCWFuZCBNX0FMUEhBX05FVEJTRC4KKwkqIGkzODZuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCisJKERFRkFVTFRfTUlEKTogRGVmaW5lLgorCSogbTY4azRrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KKwkoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCisJKERFRkFVTFRfTUlEKTogRGVmaW5lLgorCSogbTY4a25ldGJzZC5jOiAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCisJKERFRkFVTFRfTUlEKTogRGVmaW5lLgorCSogbnMzMmtuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCisJKERFRkFVTFRfTUlEKTogRGVmaW5lLgorCSogc3BhcmNuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCisJKERFRkFVTFRfTUlEKTogRGVmaW5lLgorCisJTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46CisJKiB2YXhuZXRic2QuYzogTmV3IGZpbGUuCisJKiBuZXRic2QtY29yZS5jOiBDbGVhbiB1cC4gIFJlbW92ZSB1bnVzZWQgbWFjcm9zLiAgVXNlIG5ldGJzZAorCXJhdGhlciB0aGFuIG5ldGJzZF9jb3JlLgorCSogdGFyZ2V0cy5jICh2YXhuZXRic2RfdmVjKTogRGVjbGFyZS4KKwkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdmF4bmV0YnNkX3ZlYy4gIElmIE5FVEJTRF9DT1JFIGlzCisJZGVmaW5lZCwgYWRkIG5ldGJzZF9jb3JlX3ZlYy4KKwkqIGNvbmZpZ3VyZS5pbjogU2V0IENPUkVGSUxFIGZvciBhbHBoYSotKi1uZXRic2QqIGFuZAorCXBvd2VycGMtKi1uZXRic2QqIHRvIG5ldGJzZC1jb3JlLmxvLiAgSWYgQ09SRUZJTEUgaXMKKwluZXRic2QtY29yZS5sbywgc2V0IENPUkVGTEFHIHRvIC1ETkVUQlNEX0NPUkUuCisJKiBjb25maWcuYmZkIChhbHBoYSotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KKwkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZheG5ldGJzZC5sby4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHZheG5ldGJzZC5jLgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSB0aGUgb2xkIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIHN0dWZmLiAgV2UKKwlub3cgdXNlIGxpYnRvb2wgaW5zdGVhZC4KKworV2VkIEZlYiAxMSAxNzoxMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgdGVraGV4X2luaXQuCisKK1R1ZSBGZWIgMTAgMTk6MjM6MjggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW46IFRha2Ugc3RhYi1zeW1zLmxvIG91dCBvZiBzcGFyY2xpbnV4X3ZlYyBsaXN0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgRmViIDEwIDE1OjE2OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisJKiBlbGYzMi12ODUwLmMgKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgorCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCisJKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogVXNlIHRoZSBhYm92ZSBuZXcgZnVuY3Rpb25zIHRvCisJbWF0Y2ggdXAgSEk2UyByZWxvY3Mgd2l0aCBMTzE2IHJlbG9jcy4KKworVHVlIEZlYiAxMCAxNTowMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCisJKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK01vbiBGZWIgIDkgMTk6NDA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEZpeCBhbm90aGVyCisJTE8xNi9ISTE2UyBidWcgYW5kIGltcHJvdmUgY29tbWVudHMgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KKworU2F0IEZlYiAgNyAxNToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgorCitGcmkgRmViICA2IDE0OjQ4OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdCBjb21wbGFpbgorCXdoZW4gbWVyZ2luZyB2ODUwIGNvZGUgaW50byB2ODUwZS92ODUwZWEgY29kZS4gIERvIG5vdCBpbml0aWFsaXNlCisJb3V0cHV0IGZsYWdzIGlmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUuCisJCitGcmkgRmViICA2IDExOjUwOjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbWlwcy5jIChiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRm9yIEJGRF9SRUxPQ19DVE9SCisJZ2V0IHRoZSBzaXplIGZyb20gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyBpbnN0ZWFkIG9mIGRpcmVjdGx5CisJZnJvbSB0aGUgaXNhLgorCitUaHUgRmViICA1IDE0OjIxOjM0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogSWYgcm91bmRpbmcgdXAgd291bGQgY2F1c2UgdGhlIGFkZHJlc3MKKwl0byB3cmFwLCBqdXN0IHJldHVybiBhbGwgMSdzIGJpdHMgaW5zdGVhZC4KKwkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgorCitUaHUgRmViICA1IDExOjUxOjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZi1pMzg2LmMgKGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbgorCWlmIENPRkZfV0lUSF9QRS4KKwkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgQ09GRl9XSVRIX1BFLCBkZWZpbmUgYXMKKwljb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbi4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLAorCXNraXAgZW1wdHkgc2VjdGlvbnMsIHRvIG1hdGNoIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLgorCisJKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogU3dhcCBvdXQgcl9hZGRlbmQsCisgCXJhdGhlciB0aGFuIHN3YXBwaW5nIG91dCByX29mZnNldCB0d2ljZS4gIEZyb20gTHVrZSBEZWxsZXIKKyAJPGx1a2VkQGNzZS51bnN3LmVkdS5hdT4uCisKK1dlZCBGZWIgIDQgMTk6MTE6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNldCBsaWJ0b29sX2VuYWJsZV9zaGFyZWQgcmF0aGVyIHRoYW4KKwlsaWJ0b29sX3NoYXJlZC4gIFJlbW92ZSBkaXZlcnNpb24gaGFjay4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZAorCXdpdGggbmV3IGxpYnRvb2wuCisKK1dlZCBGZWIgIDQgMTY6MTA6MjEgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgorCisJKiBzeW1zLmMgKHN0cnVjdCBzdGFiX2NhY2hlKTogRGVmaW5lLgorCShzdHJ1Y3Qgc3RhYl9maW5kX2luZm8pOiBSZW1vdmUgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsCisJY2FjaGVkX3N0ciwgYW5kIGNhY2hlZF9zdHJvZmYgZmllbGRzLiAgQWRkIGZpbGVfY2FjaGUsCisJZnVuY3Rpb25fY2FjaGUsIGFuZCBsaW5lX2NhY2hlIGZpZWxkcy4KKwkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBVc2UgZXh0ZW5zaXZlIGNhY2hpbmcgdG8KKwlzcGVlZCB1cCBzZWFyY2hlcy4KKworV2VkIEZlYiAgNCAxMzozNDoyMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBDaGVjayBmb3IgaW1wb3J0IG9mIG9yZGluYWwgcmF0aGVyCisJdGhhbiBuYW1lLgorCShwZV9wcmludF9lZGF0YSk6IElmIHRoZXJlIGlzIG5vIC5lZGF0YSBzZWN0aW9uLCBsb29rIGZvciB0aGUKKwlleHBvcnQgZGF0YSBpbiBzb21lIG90aGVyIHNlY3Rpb24uCisKK01vbiBGZWIgIDIgMjA6MDU6NDIgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gdG8gMi44LjQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitNb24gRmViICAyIDE3OjM5OjM5IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+CisKKwlBZGQgdG1zMzIwYzMwIHN1cHBvcnQ6CisJKiBjcHUtdGljMzAuYzogTmV3IGZpbGUuCisJKiBhb3V0LXRpYzMwLmM6IE5ldyBmaWxlLgorCSogY29mZi10aWMzMC5jOiBOZXcgZmlsZS4KKwkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX3RpYzMwKTogRGVmaW5lLgorCShiZmRfdGljMzBfYXJjaCk6IERlY2xhcmUuCisJKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF90aWMzMF9hcmNoLgorCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aWMzMF9hb3V0X3ZlYyBhbmQKKwl0aWMzMF9jb2ZmX3ZlYy4KKwkqIHJlbG9jLmMgKEJGRF9SRUxPQ19USUMzMF9MRFApOiBEZWZpbmUuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCB0aWMzMCBjYXNlLgorCShjb2ZmX3NldF9mbGFncyk6IExpa2V3aXNlLgorCSogY29uZmlnLmJmZCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaW4gKHRpYzMwX2FvdXRfdmVjLCB0aWMzMF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3JzLgorCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXRpYzMwLmxvLgorCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS10aWMzMC5jLgorCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LXRpYzMwLmxvIGFuZCBjb2ZmLXRpYzMwLmxvLgorCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC10aWMzMC5jIGFuZCBjb2ZmLXRpYzMwLmMuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitNb24gRmViICAyIDEyOjI1OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBBbGxvdyBISTE2X1MgcmVsb2MKKwl0byBsYWcgYmVoaW5kIExPMTYgcmVsb2MgYnkgYSBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLgorCitNb24gRmViICAyIDE0OjA5OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBBZGQgZHVtbXkgY29tbWFuZCB0byBmb3JjZQorCW1ha2UgdG8gcmVleGFtaW5lIHRoZSBmaWxlIHRpbWVzdGFtcC4KKwkoJChzcmNkaXIpL2xpYmJmZC5oLCAkKHNyY2RkaXIpL2xpYmNvZmYuaCk6IExpa2V3aXNlLgorCisJKiBlbGY2NC1hbHBoYS5jIChFTEZfTUFYUEFHRVNJWkUpOiBDaGFuZ2UgdG8gMHgxMDAwMCBmcm9tCisJMHgxMDAwMDAuCisKK0ZyaSBKYW4gMzAgMTk6MDc6MDcgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgcHJvY2VkdXJlCisJdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIHNlY3Rpb25zLgorCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFB1dCBzcGFjZSBmb3Igc21hbGwgZGF0YSB0byBiZQorCWNvcGllZCBmcm9tIGR5bmFtaWMgb2JqZWN0cyBpbnRvIC5zYnNzLgorCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFN0cmlwIC5yZWxhLnNic3MgaWYgd2UgZG9uJ3QKKwl1c2UgaXQuICBDb3JyZWN0IHR5cG8gb2YgLnJlbGEuc2RhdGEyLgorCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIHJlbG9jIHRvIHdoZXJlIHdlCisJcHV0IHRoZSBkYXRhLCB3aGljaCBtYXkgbm93IGJlIGluIC5zYnNzLgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBIFNEQVJFTDE2IHJlbG9jIGNhbiBiZSBpbiBkeW5zYnNzLgorCShlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlZmluZSBhcworCXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IERvbid0IGVtaXQgUl9QUENfUkVMKiByZWxvY3MKKwlhZ2FpbnN0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KKyAJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQgUl9QUENfUkVMMzIgcmVsb2NzIGluCisJc2hhcmVkIGxpYnJhcmllcyB3aGljaCByZWZlciB0byBsb2NhbCBzeW1ib2xzLiAgTWFrZSBzdXJlIHRoYXQgdGhlCisJdGVzdCBmb3IgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSByZWxvYyBpbiBhIHNoYXJlZCBvYmplY3QgaXMgdGhlCisJc2FtZSBhcyB0aGUgdGVzdCBmb3IgZW1pdHRpbmcgYSByZWxvYy4KKworVGh1IEphbiAyOSAxNTo1NTozNSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KKworCSogY29uZmlnLmJmZCAoaVszNDU2XS0qLW1pbmd3MzIqKTogTmV3IHRhcmdldC4KKwkqIGFjaW5jbHVkZS5tNCAoQkZEX0JJTkFSWV9PUEVOKTogQ2hlY2sgZm9yIG1pbmd3MzIuCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBKYW4gMjggMTM6NDE6MjYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBPbmx5IGNoZWNrIHRoZSBzdHJ0YWIgaWYgd2UKKwloYXZlIGEgYmZkX29iamVjdC4KKworVHVlIEphbiAyNyAyMTo0Mzo1NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJU3BhcmMgdjkgQUJJIGNvbXBsaWFudCBQTFQ6CisJKiBlbGY2NC1zcGFyYy5jIChQTFRfSEVBREVSX1NJWkUpOiBWOSBBQkkgdXNlcyA0IGVudHJpZXMuCisJKHBsdF90ZW1wbGF0ZXMsIHNwYXJjNjRfZWxmX2J1aWxkX3BsdF9lbnRyeSk6IERlbGV0ZS4KKwkoTEFSR0VfUExUX1RIUkVTSE9MRCk6IE5ldyBkZWZpbmUuCisJKEdPVF9SRVNFUlZFRF9FTlRSSUVTKTogVjkgQUJJIG9ubHkgdXNlcyAxLgorCShzcGFyYzY0X2VsZl9idWlsZF9wbHQpOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQpOiBMaWtld2lzZS4KKwkoc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQpOiBMaWtld2lzZS4KKwkoc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGgtPnBsdF9vZmZzZXQgdG8KKwljb250YWluIHRoZSBpbmRleCBmb3IgY29udmVuaWVuY2UuICBTa2lwIHRoZSBpbml0aWFsIGVudHJpZXMKKwlpbiAucmVsYS5wbHQuCisJKHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFplcm8gdGhlIGFsbG9jYXRlZCBjb250ZW50cworCW1lbW9yeSBmb3IgdGhlIGJlbmVmaXQgb2YgLnJlbGEucGx0LgorCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbCBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0LgorCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBLaWxsIHRlbXBsYXRlIHN0dWZmLiAgVXNlCisJc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAmIHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IGZvciByZWxvYy4KKwkoc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBEVF9QTFRHT1QgcG9pbnRzIHRvIC5wbHQuCisJQ2FsbCBzcGFyYzY0X2VsZl9idWlsZF9wbHQuCisJKGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCk6IE5vLgorCShlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBOby4KKwkoZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCk6IDguCisKKwkqIGVsZi5jIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IE5ldyBmdW5jdGlvbjsgZnJlZSB0aGUgc2hzdHJ0YWIuCisJKiBlbGYtYmZkLmggKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVjbGFyZSBpdC4KKwkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fY2xvc2VfYW5kX2NsZWFudXApOiBBcnJhbmdlIGZvciBpdAorCXRvIGJlIGNhbGxlZC4KKworVHVlIEphbiAyNyAyMTo0NToxNSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX21pcHMqKTogQWRkIGRlZmluaXRpb25zIGZvciB2YXJpb3VzIE1JUFMKKwlwcm9jZXNzb3JzLgorCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBtaXBzIHZhcmlhbnRzLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCitUdWUgSmFuIDI3IDE1OjA2OjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBQcmVzZXJ2ZSB0aGUgY29udGVudHMgb2YKKwl0MmEzX2JfaW5zbi4KKworVHVlIEphbiAyNyAxMjo0NzoyNyAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+CisKKwkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni1zY28zLjJ2NSopOiBFTEYgbm93IHRoZSBkZWZhdWx0LgorCShpWzM0NTZdODZzY28zLjJ2NSpjb2ZmKTogTmV3IHRhcmdldC4KKworTW9uIEphbiAyNiAxNTo0MTozMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZC1pbjIuaDogUmVidWlsZCB3aXRoIGNoYW5nZXMgdG8gY2hldy0tdGFiIGV4cGFuc2lvbi4KKworVGh1IEphbiAyMiAyMToyNjo0OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBiZmQuYyAoYmZkX2dldF9lcnJvcl9oYW5kbGVyKTogQWRkIG9ydGhvZ29uYWwgZnVuY3Rpb24uCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCisKK1RodSBKYW4gMjIgMjE6MTM6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogdGVraGV4LmMgKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3Igbm8gc3ltYm9scy4KKworV2VkIEphbiAyMSAyMToxOTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBJZiBDT0ZGX1dJVEhfUEUsIGRvbid0CisgCWFkanVzdCBhZGRlbmQgZm9yIGFuIG91dHB1dCBjb21tb24gc3ltYm9sIChmcm9tIEppbW15IEJsYWlyCisgCTxqaW1teWJAd3JzLmNvbT4pLiAgSWYgQ09GRl9XSVRIX1BFLCBhZGp1c3QgYWRkZW5kIGZvciBQQyByZWxhdGl2ZQorIAlkZWZpbmVkIHN5bWJvbCB0byBjb3VudGVyYWN0IGFkanVzdG1lbnQgbWFkZSBpbiBnZW5lcmljIHJlbG9jYXRpb24KKyAJY29kZS4KKworCSogZHdhcmYyLmM6IEluY2x1ZGUgc3lzZGVwLmgsIG5vdCBzdGRpby5oIGFuZCBzdGRsaWIuaC4KKworV2VkIEphbiAyMSAyMToxNjowNiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvZmYtbTg4ay5jIChHRVRfU0NOREhSX05SRUxPQyk6IEZpeCB0eXBvIGluIG1hY3JvIG5hbWUuCisJKEdFVF9TQ05ESFJfTkxOTk8pOiBMaWtld2lzZS4KKworTW9uIEphbiAxOSAxMjo0OTo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNwdS1zaC5jIChhcmNoX2luZm9fc3RydWN0KTogQ29ycmVjdCBuZXh0IGZpZWxkIG9mIHNoM2UuCisKK1dlZCBKYW4gMTQgMTc6MjM6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItbTMyci5jOiBBZGQgbWFjcm9zIHRvIGhhbmRsZSBOT1AgaW5zZXJ0aW9uLgorCitXZWQgSmFuIDE0IDE2OjE1OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrX3N5bWJvbCk6IERvbid0IG1hcmsgdGhlIGFic29sdXRlIHNlY3Rpb24uCisJKHhjb2ZmX21hcmspOiBMaWtld2lzZS4KKwkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTWFyayBhYnNvbHV0ZSBzeW1ib2xzLgorCitXZWQgSmFuIDE0IDE2OjAzOjExIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGJvdXQuYyAoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU29ydCBzeW1ib2xzIGJlZm9yZSBvdXRwdXQKKwl0byBrZWVwIHtDQUxMLEJBTH1OQU1FIHN5bWJvbHMgYWRqYWNlbnQuCisJKGJfb3V0X3N5bWJvbF9jbXApOiBOZXcgZnVuY3Rpb24uCisKK0ZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05MTkzIGIvYmZkL0NoYW5nZUxvZy05MTkzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YWY5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvQ2hhbmdlTG9nLTkxOTMKQEAgLTAsMCArMSw3ODUxIEBACitGcmkgRGVjIDMxIDE2OjIzOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCU1pbm9yIGNsZWFudXBzIHN1Z2dlc3RlZCBieSBDb2RlQ2VudGVyLgorCSogYW91dHguaCwgY29mZmdlbi5jLCBlY29mZi5jLCBlY29mZmxpbmsuYywgZWxmLmMsIGxpYmJmZC5jLAorCWxpbmtlci5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHNyZWMuYzogQWRkZWQgLypBUkdTVVNFRCovIGFzCisJYXBwcm9wcmlhdGUuCisJKiBhb3V0eC5oIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb24uCisJKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogU2V0IHNvbWUgdGRhdGEgcG9pbnRlcnMgdG8gTlVMTC4KKwkoYWRqdXN0X3pfbWFnaWMpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUgZGF0YV92bWEuCisJKHN0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSBoYXNoX3plcm8uCisJKGFkZF90b19zdHJpbmd0YWIpOiBSZW1vdmVkIHVudXNlZCBmb3VydGggYXJndW1lbnQuCisJKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlCisJcl9hZGRlbmQuCisJKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogQWRkZWQgc29tZSBjYXN0cy4KKwkqIGFyY2hpdmUuYyAoZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lLCBkb19zbHVycF9jb2ZmX2FybWFwLAorCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBic2Rfd3JpdGVfYXJtYXAsIGNvZmZfd3JpdGVfYXJtYXApOgorCU1pbm9yIGNvZGUgcmV3cml0aW5nIHRvIG1ha2UgaXQgbW9yZSBDIGxpa2UuCisJKGRvX3NsdXJwX2JzZF9hcm1hcCk6IEFkZGVkIHNvbWUgY2FzdHMuCisJKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUKKwlzY25fYmFzZS4KKwkoZWNvZmZfd3JpdGVfYXJtYXApOiBBZGRlZCBzb21lIGNhc3RzLiAgVXNlICIiIHJhdGhlciB0aGFuICJcMCIuCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnKTogQWRkZWQgYSBjYXN0LgorCSogbGliYW91dC5oIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk6IFJlbW92ZWQgdW5uZWNlc3NhcnkKKwlkZWNsYXJhdGlvbi4KKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlcik6IEFkZGVkIGEgY2FzdC4KKwkqIG9wbmNscy5jIChuZXdfYmZkKTogUmVtb3ZlZCBhIGNhc3QuCisJKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAorCXNvbWUgY2FzdHMuCisJKiBzcmVjLmMgKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCB1c2VsZXNzCisJdmFyaWFibGUgYnl0ZXNfd3JpdHRlbi4KKworRnJpIERlYyAzMSAxMTo0NjoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGkzODZtYWNoMy5jIChOX1RYVEFERFIpOiBEb24ndCBkZWZpbmUgYWZ0ZXIgYWxsLgorCShURVhUX1NUQVJUX0FERFIpOiBEb24ndCBpbmNsdWRlIGV4ZWMgaGVhZGVyIHNpemUgaW4gdmFsdWUuCisKK1RodSBEZWMgMzAgMTU6NDc6NTQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBpMzg2bWFjaDMuYyAoTl9UWFRBRERSKTogRGVmaW5lLgorCitUaHUgRGVjIDMwIDEzOjM3OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUV4dGVuc2l2ZSBjaGFuZ2VzIHRvIG1vdmUgdGhlIGJ1bGsgb2YgdGhlIGxpbmtlciBpbnRvIEJGRCBzbyB0aGF0CisJbW9yZSBlZmZpY2llbnQgYmFja2VuZCBjb2RlIGNhbiBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyBvYmplY3QKKwlmaWxlcy4gIE9ubHkgZXhpc3RpbmcgZWZmaWNpZW50IGJhY2tlbmQgaXMgYS5vdXQuCisJKiBzZWNsZXQuYywgc2VjbGV0Lmg6IFJlbW92ZWQuCisJKiBoYXNoLmMsIGxpbmtlci5jLCBnZW5saW5rLmg6IE5ldyBmaWxlcy4KKwkqIGJmZC1pbi5oOiBSZW1vdmVkIGJmZF9lcnJvcl92ZWN0b3IuICBEZWNsYXJlZCBoYXNoIHRhYmxlCisJc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zLgorCShKVU1QX1RBQkxFKTogUmVtb3ZlZCBiZmRfc2VjbGV0X2xpbmssIGFkZGVkCisJYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGFuZAorCWJmZF9maW5hbF9saW5rLgorCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkZWQgbGlua19uZXh0IGFuZCBhcmNoaXZlX3Bhc3MgZmllbGRzLgorCVJlbW92ZWQgbGRfc3ltYm9scyBmaWVsZC4KKwkoYmZkX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwgYmZkX3VuZGVmaW5lZF9zeW1ib2wsCisJYmZkX3JlbG9jX3ZhbHVlX3RydW5jYXRlZCwgYmZkX3JlbG9jX2lzX2Rhbmdlcm91cywKKwliZmRfZXJyb3JfdmVjdG9yKTogUmVtb3ZlZC4KKwkoYmZkX2RlZmF1bHRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3RyYXAsCisJYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibHRyYXApOiBSZW1vdmVkLgorCShiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUGFzcyBsaW5rX2luZm8uICBQYXNzCisJbGlua19vcmRlciBpbnN0ZWFkIG9mIHNlY2xldC4gIFBhc3Mgc3ltYm9scy4KKwkoYmZkX3JlbGF4X3NlY3Rpb24pOiBQYXNzIGxpbmtfaW5mby4KKwkoYmZkX3NlY2xldF9saW5rKTogUmVtb3ZlZC4KKwkoYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzLAorCWJmZF9maW5hbF9saW5rKTogTmV3IG1hY3Jvcy4KKwkqIGxpYmJmZC1pbi5oOiBJZiBfX0dOVUNfXyBpcyBkZWZpbmVkIGFuZCBhbGxvY2EgaXMgbm90LCBkZWZpbmUKKwlhbGxvY2EgYXMgX19idWlsdGluX2FsbG9jYS4gIERlY2xhcmUgaW50ZXJuYWwgbGlua2luZyBmdW5jdGlvbnMuCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IENvbW1lbnQgb3V0IGZzZWVrIGFzc2VydGlvbi4gIEl0J3Mgd29ya2VkCisJZm9yIG1vbnRocy4KKwkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBBZGRlZCBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50IHRvCisJc3BlY2lhbF9mdW5jdGlvbiBmaWVsZC4gIENoYW5nZWQgYWxsIGNhbGxlcnMgYW5kIGFsbCBkZWZpbml0aW9ucy4KKwkoYmZkX2dldF9yZWxvY19zaXplKTogTWFrZSBhcmd1bWVudCBhIGNvbnN0IHBvaW50ZXIuCisJKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgZXJyb3JfbWVzc2FnZSBhcmd1bWVudCB0byBob2xkCisJc3RyaW5nIHNldCBpZiByZXR1cm4gdmFsdWUgaWYgYmZkX3JlbG9jX2Rhbmdlcm91cy4gIENoYW5nZWQgYWxsCisJY2FsbGVycy4KKwkoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlLCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNlY3Rpb24uYyAoYXNlY3Rpb24pOiBSZW5hbWVkIHNlY2xldHNfaGVhZCBhbmQgc2VjbGV0c190YWlsIHRvCisJbGlua19vcmRlcl9oZWFkIGFuZCBsaW5rX29yZGVyX3RhaWwuCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZXBsYWNlZCBzZWNsZXQgYXJndW1lbnQgd2l0aCBsaW5rX2luZm8KKwlhbmQgbGlua19vcmRlciBhbmQgc3ltYm9scyBhcmd1bWVudHMgaW4KKwliZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLiAgQWRkZWQgc3ltYm9scyBhcmd1bWVudCB0bworCWJmZF9yZWxheF9zZWN0aW9uLiAgUmVtb3ZlZCBiZmRfc2VjbGV0X2xpbmsuICBBZGRlZAorCWJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scyBhbmQKKwliZmRfZmluYWxfbGluay4KKwkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkZWQgZXh0ZXJuYWxfc3ltcywKKwlleHRlcm5hbF9zeW1fY291bnQsIGV4dGVybmFsX3N0cmluZ3MsIHN5bV9oYXNoZXMgZmllbGRzLgorCShvYmpfYW91dF9leHRlcm5hbF9zeW1zLCBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQsCisJb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncywgb2JqX2FvdXRfc3ltX2hhc2hlcyk6IE5ldyBhY2Nlc3NvcgorCW1hY3Jvcy4KKwkoV1JJVEVfSEVBREVSUyk6IE9ubHkgb3V0cHV0IHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBub3QgTlVMTC4KKwkqIGFvdXR4Lmg6IFdyb3RlIG5ldyBiYWNrIGVuZCBsaW5rZXIgcm91dGluZXMuCisJKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBEb24ndCB1c2UKKwliZmRfZXJyb3JfdmVjdG9yLgorCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIENoZWNrIHJldHVybiB2YWx1ZQorCW9mIHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIGFuZCBiZmRfd3JpdGUuCisJKiBhb3V0LXRhcmdldC5oIChmaW5hbF9saW5rX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9uLgorCShNWV9iZmRfZmluYWxfbGluayk6IE5ldyBmdW5jdGlvbi4KKwkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4KKwl2YWx1ZSBvZiBhb3V0XzMyX3dyaXRlX3N5bXMuCisJKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IExpa2V3aXNlLgorCSogaTM4Nmx5bnguYyAoV1JJVEVfSEVBREVSUyk6IExpa2V3aXNlLgorCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogTGlrZXdpc2UuCisJKiBib3V0LmM6IENoYW5nZWQgZnVuY3Rpb25zIHRvIHVzZSBsaW5rX2luZm8tPmNhbGxiYWNrcyByYXRoZXIKKwl0aGFuIGJmZF9lcnJvcl92ZWN0b3IsIGFuZCBsaW5rX29yZGVycyByYXRoZXIgdGhhbiBzZWNsZXRzLgorCSogY29mZi1hbHBoYS5jOiBMaWtld2lzZS4KKwkqIGNvZmYtaDgzMDAuYzogTGlrZXdpc2UuCisJKiBjb2ZmLWg4NTAwLmM6IExpa2V3aXNlLgorCSogY29mZi1zaC5jOiBMaWtld2lzZS4KKwkqIGNvZmYtejhrLmM6IExpa2V3aXNlLgorCSogZWxmMzItaHBwYS5jOiBMaWtld2lzZS4KKwkqIHJlbG9jMTYuYzogTGlrZXdpc2UuCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExvb2sKKwl1cCBfZ3AgaW4gdGhlIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gaW4gb3V0c3ltYm9scy4KKwkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogUGFzcyBlcnJvcnMgYmFjayBpbiBuZXcgZXJyb3JfbWVzc2FnZQorCWFyZ3VtZW50IHJhdGhlciB0aGFuIHByaW50aW5nIHRoZW0uCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogVGFrZSBsaW5rX2luZm8gYW5kCisJbGlua19vcmRlciBhcmd1bWVudHMgcmF0aGVyIHRoYW4gc2VjbGV0LiAgQ2hhbmdlZCBhbGwgdXNlcyBhbmQKKwlkZWZpbml0aW9ucy4KKwkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IFBhc3MgbGlua19pbmZvIGFyZ3VtZW50cy4gIENoYW5nZWQKKwlhbGwgdXNlcyBhbmQgZGVmaW5pdGlvbnMuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCisJKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGxpbmtlciwgYnV0CisJbm90IGJ5IEVDT0ZGLCBtYWtlIGl0IHNjQWJzLgorCShlY29mZl9iZmRfZmluYWxfbGluayk6IFJlbmFtZWQgZnJvbSBlY29mZl9iZmRfc2VjbGV0X2xpbmsgYW5kCisJcmV3cml0dGVuLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogUmVuYW1lZCBmcm9tCisJbWlwc19lbGZfc2VjbGV0X2xpbmsgYW5kIHJld3JpdHRlbi4KKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgbGlua19pbmZvCisJZmllbGQuCisJKG5ld19zdHViLCBhZGRfc3R1Yl9ieV9uYW1lLCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKKwlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViLCBocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOgorCUFkZGVkIGxpbmtfaW5mbyBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgorCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcXVpdCBpZiBvdXRzeW1ib2xzIGlzCisJbm90IE5VTEwuCisJKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJldHVybiBib29sZWFuIHZhbHVlIHJhdGhlciB0aGFuCisJdXNpbmcgYmZkX2Vycm9yX3ZlY3Rvci4KKwkob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJb2FzeXNfd3JpdGVfc2VjdGlvbnMuCisJKiBob3N0cy9zdGQtaG9zdC5oOiBEb24ndCBkZWNsYXJlIHFzb3J0IG9yIHN0cnRvbC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQkZEX0xJQlMpOiBSZW1vdmVkIHNlY2xldC5vLiAgQWRkZWQgaGFzaC5vIGFuZCBsaW5rZXIuby4KKwkoQ0ZJTEVTKTogUmVtb3ZlZCBzZWNsZXQuYy4gIEFkZGVkIGhhc2guYyBhbmQgbGlua2VyLmMuCisJKEhGSUxFUyk6IFJlbW92ZWQgc2VjbGV0LmguICBBZGRlZCBnZW5saW5rLmguCisKK1RodSBEZWMgMzAgMDc6NDE6MzYgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZXR1cm4gemVybyBmaWxsZWQgYnVmZmVyCisJaWYgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCisKK1R1ZSBEZWMgMjggMTI6NDM6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGYuYyAoYmZkX2VsZl9nZW5lcmljX3JlbG9jKTogSWYgdGhpcyBpcyBub3QgYW4gaW5wbGFjZSByZWxvYywKKwl0aGVuIHNraXAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBldmVuIGlmIHRoZSBhZGRlbmQgaXMgbm9uLXplcm8uCisKK1R1ZSBEZWMgMjEgMDk6MjI6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcykgW1NXQVBfT1VUX1JFTE9DX09GRlNFVF06IENvcHkKKwlhZGRlbmQgdG8gcl9vZmZzZXQgZmllbGQuCisKKwkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGRlZCBjb2ZmLXNwYXJjLmMuICBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKworCSogY29mZi1zcGFyYy5jIChTV0FQX0lOX1JFTE9DX09GRlNFVCwgU1dBUF9PVVRfUkVMT0NfT0ZGU0VULAorCUNBTENfQURERU5EKTogRGVmaW5lLgorCisJKiBhaXgzODYtY29yZS5jIChhaXgzODZfY29yZV9maWxlX3ApOiBVc2UgY2RfcmVnc1swXSBmb3IgY29tcHV0aW5nCisJdGhlIG9mZnNldG9mIGJlY2F1c2UgQUlYIC9iaW4vY2MgZG9lcyBub3QgbGlrZSB0byB0YWtlIHRoZSBhZGRyZXNzCisJb2YgYW4gYXJyYXkuICAoRnJvbSBNaW5oIFRyYW4tTGUuKQorCitUaHUgRGVjIDE2IDEzOjA2OjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBUaHUgRGVjIDE2IDE1OjQxOjA2IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBNYWtlIHN1cmUgdG8gY29weQorCXRoZSByZXR1cm4gcG9pbnRlciBpbnRvICVyMiBpZiBubyBqdW1wLWluLWNhbGwtZGVsYXktc2xvdAorCW9wdGltaXphdGlvbiB3YXMgZG9uZS4KKworCSogaG9zdHMvaHAzMDBic2QuaDogQ29ycmVjdGx5IGlkZW50aWZ5IDQuM0JTRCB2cyA0LjRCU0QuCisKK1dlZCBEZWMgMTUgMDg6MDQ6MTYgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBob3N0cy9zdGQtaG9zdC5oOiAodGltZSk6IERvbid0IGRlY2xhcmU7IGNvbmZsaWN0cyBvbiBNYWNoMy4KKworCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfUEFHRV9TSVpFKTogU2V0IHRvIDEgdG8gYXZvaWQgcGFkZGluZy4KKwkoSE9TVF9TRUdNRU5UX1NJWkUpOiBTZXQgdG8gMCBmb3Igc2FtZSByZWFzb24uCisKKwkqIGkzODZtYWNoMy5jIChQQUdFX1NJWkUsIFNFR01FTlRfU0laRSk6IFNhbWUgY2hhbmdlcyBhcyBhYm92ZS4KKwkoVEVYVF9TVEFSVF9BRERSKTogQ29ycmVjdC4KKwkoTVlfYmFja2VuZF9kYXRhKTogRGVmaW5lLgorCisJKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYywgYWRqdXN0X3pfbWFnaWMsIGFkanVzdF9uX21hZ2ljKToKKwlOZXcgZnVuY3Rpb25zOyBjb2RlIG1vdmVkIGZyb20gYW91dF88c2l6ZT5fYWRqdXN0X3NpemVzX2FuZF92bWFzLgorCitUdWUgRGVjIDE0IDIxOjQ4OjMzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgICAgICogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IHRoaW5rb3MgaW4gYXV4aWxpYXJ5IGhlYWRlcgorCXN1cHBvcnQuCisJKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBMaWtld2lzZS4KKworTW9uIERlYyAxMyAyMzozNDo0OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAnVCcgZmllbGQKKwlzZWxlY3RvcnMgZm9yIFBJQyBjb2RlLgorCisJKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgJ1QnIGZpZWxkIHNlbGVjdG9ycy4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RMVF9SRUwsIFJfRlNFTCwgUl9SU0VMLCBSX0xTRUwKKwlyZWxvY2F0aW9ucyBuZWVkZWQgYnkgUElDLgorCitUdWUgRGVjICA3IDE1OjQ3OjUxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG5sbWNvZGUuaDogIEZpeGVzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLi4uCisKK1R1ZSBEZWMgIDcgMTU6MTA6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgbWFjcm8gZGVmaW5pdGlvbi4KKwkobmxtX2FscGhhX2JhY2tlbmRfZGF0YSk6IEFkanVzdGVkIGFjY29yZGluZ2x5LgorCitTdW4gRGVjICA1IDE5OjMyOjA4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGbGVzaCBvdXQgY29kZSBmb3IgaGFuZGxpbmcgc2ltcGxlCisJYXV4aWxpYXJ5IGhlYWRlcnMuCisJKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBmaWVsZHMgZm9yIGF0dGFjaGluZyB2ZXJzaW9uIGFuZAorCWNvcHlyaWdodCBoZWFkZXJzLiAgQWRkIGFjY2Vzc29yIG1hY3Jvcy4KKworCSogc29tLmMgKFJfRExUX1JFTCwgUl9BVVhfVU5XSU5ELCBSX1NFQ19TVE1UKTogQWRkIHByb3RlY3RlZAorCWRlZmluaXRpb25zIGZvciBvbGQgdmVyc2lvbnMgb2YgSFBVWCB3aGljaCBmYWlsIHRvIGRlZmluZSB0aGVtLgorCShzb21faHBwYV9ob3d0b190YWxiZSk6IEFkZCBSX0RMVF9SRUwsIFJfQVVYX1VOV0lORCwgYW5kIFJfU0VDX1NUTVQKKwlub3cgdGhhdCB0aGV5J3JlIHNhZmUuICBEZWxldGUgYm9ndXMgUl9TVEFURU1FTlQgcmVsb2NhdGlvbnMuCisKKwkqIHNvbS5jIChzb21faHBwYV9ob3d0b190YWJsZSk6IEFkZCBtaXNzaW5nIFJfRU5EX1RSWS4gIERlbGV0ZSAKKwlleHRyYSBSX0RBVEFfT1ZFUlJJREUuCisJKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogR2VuZXJhdGUgYSByZWxvY2F0aW9uIGZvciB0aGUgcm91bmRpbmcKKwltb2RlIHNlbGVjdG9yIGlmIG5lZWRlZC4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSByZXF1ZXN0cyBmb3IgYSBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQKKwlyb3VuZGluZyBtb2RlLiAgUm91bmRpbmcgbW9kZXMgZG8gbm90IGNvbnN1bWUgaW5wdXQgYnl0ZXMsIGJ1dAorCWFyZSBqdXN0IG1hcmtlcnMgbXVjaCBsaWtlIFJfRU5UUlkgYW5kIFJfRVhJVC4KKworU2F0IERlYyAgNCAxOTo0MDozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCUZyaSBEZWMgIDMgMDk6NTU6MTcgMTk5MyAgUGV0ZSBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQorCisJKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvYyk6ICBEbyBub3QgZG8gY29kZSByZW9yZGVyaW5nIHdoZW4KKwl0aGUgYnJhbmNoIGluc3RydWN0aW9uIGFzIG9yaWdpbmFsbHkgYmVlbiBudWxsaWZpZWQuCisJaHBwYV9lbGZfcmVsb2MpOiAgQXZvaWQgdXNlbGVzcyBjYWxsIHRvIGJmZF9wdXRfMzIgKCkgaW4gdGhlCisJY2FzZSBvZiBubyBjb2RlIHJlb3JkZXJpbmcgZHVlIHRvIGFuIExETyBpbnN0cnVjdGlvbiBpbiB0aGUKKwlkZWxheSBzbG90IG9mIHRoZSBicmFuY2guICBNYWtlIHN1cmUgdG8gcmVsb2NhdGUgdGhlIGNvcnJlY3QKKwlpbnN0cnVjdGlvbi4gIERvIG5vdCBwZXJmb3JtIGluc3RydWN0aW9uIHJlb3JkZXJpbmcgZm9yIG1pbGxpY29kZQorCWNhbGxzLgorCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6ICBDaGFuZ2UgdGhlIHJlbG9jYXRpb24gdHlwZQorCXRvIFJfSFBQQV9TVFVCX0NBTExfMTcgd2hlbiBzcGVjaWFsIHByb2Nlc3NpbmcgbWlnaHQgYmUgbmVlZGVkLgorCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogUHJldmVudCBjb2RlIHJlb3JkZXJpbmcgb24KKwlhIGNhbGwgZnJvbSBhIGxpbmtlciBzdHViIHRvIGFub3RoZXIgbGlua2VyIHN0dWIgYW5kIGZvciBtaWxsaWNvZGUKKwljYWxscy4gIERvIG5vdCB0cmFzaCB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciBjYWxscyBmcm9tIG9uZSBsaW5rZXIKKwlzdHViIHRvIGEgc2Vjb25kIGxpbmtlciBzdHViLgorCisJKiBlbGYzMi1ocHBhLmM6IChlbGZfaHBwYV9ob3d0b190YWJsZSk6ICBQTEFCRUwgYW5kIERMVAorCXJlbG9jYXRpb25zIGFyZSBub3QgcGMtcmVsYXRpdmUuCisKKwkqIGhwcGFfc3R1YnMuaDogKEJMRV9OX1hYWF8wXzMxKTogIE5ldyBpbnN0cnVjdGlvbiB1c2VkIGluCisJbGlua2VyIHN0dWIgY29kZS4gCisJKENPUFlfMl8zMSk6ICBMaWtld2lzZS4KKworRnJpIERlYyAgMyAxODo0MDo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSERFRklORVMpOiBSZW1vdmUgLURjb25zdD0KKwkqIGhvc3RzL3NvbGFyaXMuaDogSWYgbm90IF9fR05VQ19fLCBkZWZpbmUgY29uc3QgYXMgZW1wdHkuCisKK1RodSBEZWMgIDIgMTU6NDM6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5jOiBBZGRlZCB2YXJpb3VzIGNhc3RzIGZvciAzMi82NCBiaXQgY3Jvc3MgdGFyZ2V0aW5nLgorCShlY29mZl9ta29iamVjdF9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgdGhlIC5yZWdpbmZvCisJc2VjdGlvbiBzbyB0aGF0IHRoZSBsaW5rZXIgaWdub3JlcyBpdC4KKwkqIGVjb2ZmbGluay5jOiBBZGRlZCB2YXJpb3VzIGNhc3RzIGZvciAzMi82NCBiaXQgY3Jvc3MgdGFyZ2V0aW5nLgorCShlY29mZl9hZGRfYnl0ZXMpOiBDaGFuZ2VkIG5lZWQgYXJndW1lbnQgdG8gc2l6ZV90LgorCShiZmRfZWNvZmZfZGVidWdfbGlua19vdGhlcik6IENoZWNrIHJldHVybiB2YWx1ZSBvZgorCWVjb2ZmX2FkZF9zdHJpbmcuCisKKwkqIGxpYmJmZC1pbi5oIChuZXdfYmZkKTogVXNlIHZvaWQgcmF0aGVyIHRoYW4gYW4gZW1wdHkgcGFyYW1ldGVyCisJbGlzdC4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCisJKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBOZXcgZmllbGQgYmFja2VuZF9kYXRhLgorCShubG1fYmFja2VuZF9kYXRhLCBubG1fYWxwaGFfYmFja2VuZF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KKwkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQgbm9fdW5pbml0aWFsaXplZF9kYXRhLgorCShubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3JvLgorCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlCisJbm9fdW5pbml0aWFsaXplZF9kYXRhLgorCShubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSk6IFNvcnQgcmVsb2NzIGJ5IGFkZHJlc3MgZm9yIGEKKwlwYXJ0aWN1bGFyIHN5bWJvbCwgdG8gbWFrZSB0aGUgc29ydCBtb3JlIHN0YWJsZS4KKwkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhc3QgdGhlIGFyZ3VtZW50cyB0byBxc29ydC4gIEdldCB0aGUKKwl2YWx1ZSBvZiBhIGRlYnVnZ2luZyBzeW1ib2wgdGhlIHNhbWUgd2F5IHdlIGdldCB0aGUgdmFsdWUgb2YgYQorCW5vcm1hbCBzeW1ib2wuCisJKiBubG0zMi1hbHBoYS5jOiBWYXJpb3VzIGNoYW5nZXMuICBXcml0ZSBvdXQgR1AgYW5kIC5saXRhIHJlbG9jcy4KKwlTZXQgbm9fdW5pbml0aWFsaXplZF9kYXRhIHRvIHRydWUuCisJKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCksIG5sbTMyLXNwYXJjLmMKKwkobmxtMzJfc3BhcmNfYmFja2VuZCk6IFNldCBub191bmluaXRpYWxpemVkX2RhdGEgZmllbGQgZmFsc2UuCisJKiBubG1zd2FwLmggKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQpOiBaZXJvIG91dCBkZXN0aW5hdGlvbgorCWJlZm9yZSBmaWxsaW5nIGl0IGluLgorCitXZWQgRGVjICAxIDIxOjQ3OjU4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX3NlY3Rpb25fdHlwZSwgc29tX2RlY29kZV9zeW1jYWxzcyk6IE5ldyBmdW5jdGlvbnMuCisJKHNvbV9nZXRfc3ltYm9sX2luZm8pOiBVc2UgdGhlbS4KKwkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB0aGUgc2VjdGlvbiBvZiBjb21tb24gYW5kIHVuZGVmaW5lZAorCXN5bWJvbHMgY29ycmVjdGx5LgorCitXZWQgRGVjICAxIDE0OjE1OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEluaXRpYWxpemUgbG9jYWwgdmFyIExBU1RfU1lNX0lEWCwgdG8KKwltYWtlIGdjYyBoYXBweS4KKworCSogbWlwc2JzZC5jOiBDaGFuZ2VzIGZyb20gUmFscGggQ2FtcGJlbGw6CisJKG1pcHNfaG93dG9fdGFibGVfZXh0KTogTUlQU19SRUxPQ19MTzE2IHNob3VsZCB1c2UKKwljb21wbGFpbl9vdmVyZmxvd19kb250LgorCShhb3V0X21pcHNfKl92ZWMpOiBNYWtlIG5hbWUgdXNlICJhLm91dCIgaW5zdGVhZCBvZiAiYW91dCIsIHRvCisJbWFrZSBnZGIgaGFwcHkuCisKKwkqIGJmZC5jIChiZmRfZXJybXNncyk6IFJld29yZCBpbnZhbGlkLXRhcmdldCBtZXNzYWdlLgorCisJKiBjb25maWcuYmZkOiBGb3Igc3BhcmMqLSotY29mZiwgdXNlIHNwYXJjLWNvZmYuCisJKiBjb25maWd1cmUuaW46IEhhbmRsZSBzcGFyY2NvZmZfdmVjLgorCSogdGFyZ2V0cy5jIChzcGFyY2NvZmZfdmVjKTogRGVjbGFyZS4KKworCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogTmV3IGZ1bmN0aW9uLgorCShzdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZSk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIG9mIHNpemUgZmllbGQuCisKK1dlZCBEZWMgIDEgMTQ6Mzk6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG0zMi1hbHBoYS5jOiBOZXcgZmlsZTsgcHJlbGltaW5hcnkgQWxwaGEgTmV0V2FyZSBzdXBwb3J0LgorCSogY29uZmlnLmJmZCAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS1ubG0uCisJKiBjb25maWcvYWxwaGEtbmxtLm10OiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYWxwaGFfdmVjKTogTmV3IHZlY3RvcjsgdXNlIG5sbTMyLWFscGhhLm8sCisJbmxtMzIubywgYW5kIG5sbS5vLgorCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkZWQgbmxtMzItYWxwaGEuby4KKwkoQ0ZJTEVTKTogQWRkZWQgbmxtMzItYWxwaGEuYy4KKwlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKwkqIHRhcmdldHMuYyAobmxtMzJfYWxwaGFfdmVjKTogRGVjbGFyZS4KKworCSogbGlibmxtLmggKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkcworCW9wdGlvbmFsX3ByZWZpeF9zaXplLCBubG1fYmFja2VuZF9vYmplY3RfcCwgbmxtX3dyaXRlX3ByZWZpeCwKKwlubG1fc2V0X3B1YmxpY19zZWN0aW9uLCBubG1fZ2V0X3B1YmxpY19vZmZzZXQuICBSZW1vdmVkIHVudXNlZAorCW5sbV93cml0ZV9yZWxvYyBmaWVsZC4gIENoYW5nZWQgbmxtX3dyaXRlX2ltcG9ydCB0byByZW1vdmUKKwl1bm5lY2Vzc2FyeSBzeW1ib2wgYXJndW1lbnQuICBSZW5hbWVkIG5sbV93cml0ZV9leHRlcm5hbHMgdG8KKwlubG1fd3JpdGVfZXh0ZXJuYWwsIGFuZCBjaGFuZ2VkIGNvdW5kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYSB0bworCWJmZF9zaXplX3R5cGUuCisJKG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSwgbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYywKKwlubG1fd3JpdGVfcHJlZml4X2Z1bmMsIG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYywKKwlubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCisJKG5sbV93cml0ZV9yZWxvY19mdW5jKTogUmVtb3ZlZC4KKwkobmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMpOiBBZGp1c3RlZCBmb3IgZmllbGQgcmVuYW1pbmcuCisJKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX2ltcG9ydCk6IFJlbmFtZWQgZnJvbQorCW5sbV9pMzg2X3dyaXRlX3JlbG9jLiAgUmVtb3ZlZCBvbGQgbmxtX2kzODZfd3JpdGVfaW1wb3J0IHdoaWNoCisJanVzdCBjYWxsZWQgb2xkIG5sbV9pMzg2X3dyaXRlX3JlbG9jLgorCShubG1faTM4Nl93cml0ZV9leHRlcm5hbCk6IFJlbmFtZWQgZnJvbSBubG1faTM4Nl93cml0ZV9leHRlcm5hbHMuCisJRGVjbGFyZWQuICBDaGFuZ2VkIHNlY29uZCBhcmd1bWVudCBmcm9tIGJmZF92bWEgdG8gYmZkX3NpemVfdHlwZS4KKwkobmxtMzJfaTM4Nl9iYWNrZW5kKTogQWRqdXN0ZWQgZm9yIGNoYW5nZXMgdG8gZmllbGRzIGFuZCBuYW1lcy4KKwkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzKTogUmVtb3ZlZCB1bnVzZWQsCisJaWZkZWZmZWQgb3V0IGNvZGUuCisJKG5sbV9zcGFyY193cml0ZV9pbXBvcnQpOiBSZW1vdmVkIHNlY29uZCBhcmd1bWVudC4KKwkobmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsKTogUmVuYW1lZCBmcm9tCisJbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFscy4gIENoYW5nZWQgc2Vjb25kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYQorCXRvIGJmZF9zaXplX3R5cGUuCisJKG5sbTMyX3NwYXJjX2JhY2tlbmQpOiBBZGp1c3RlZCBmb3IgY2hhbmdlcyB0byBmaWVsZHMgYW5kIG5hbWVzLgorCSogbmxtY29kZS5oOiBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCisJKG5sbV9vYmplY3RfcCk6IERvbid0IGRlc3Ryb3kgdGRhdGEgcG9pbnRlci4gIENhbGwKKwliYWNrZW5kX29iamVjdF9wIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cy4KKwkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIHJjb3VudC4gIENhbGwKKwlzZXRfcHVibGljX3NlY3Rpb25fZnVuYyBpZiBpdCBleGlzdHMgaW5zdGVhZCBvZiBjaGVja2luZworCU5MTV9ISUJJVC4KKwkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFjY291bnQgZm9yCisJb3B0aW9uYWxfcHJlZml4X3NpemUuCisJKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBBY2NvdW50IGZvciBvcHRpb25hbF9wcmVmaXhfc2l6ZS4KKwlSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUgd3JpdGVfcmVsb2NfZnVuYy4gIENoYW5nZWQgZGVjbGFyYXRpb24KKwlhbmQgY2FsbCBvZiB3cml0ZV9pbXBvcnRfZnVuYy4gIENhbGwgd3JpdGVfcHJlZml4X2Z1bmMgaWYgaXQKKwlleGlzdHMuICBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMgbGVuIGFuZCB0ZW1wLiAgQ2FsbAorCWdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMgaWYgaXQgZXhpc3RzIHJhdGhlciB0aGFuIHNldHRpbmcgTkxNX0hJQklULgorCSogbmxtc3dhcC5oOiBEZWNsYXJlIGZ1bmN0aW9ucy4KKworCSogYmZkLWluLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gpOiBGdWxseSBwYXJlbnRoZXNpemUKKwlmb3IgY2xhcml0eS4KKwkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogVXNlICVseCwgbm90ICV4LgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogaG9zdHMvYWxwaGFvc2YuaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCk6IENhc3QgcmVzdWx0cworCXRvIHVuc2lnbmVkIGxvbmcuCisKKwkqIGNvbmZpZy5iZmQ6IERvbid0IHNldCB0YXJnZXQ2NCBoZXJlLCBhcyB0aGUgc2V0dGluZyBpcyBpZ25vcmVkLgorCSogY29uZmlndXJlLmluIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBTZXQgdGFyZ2V0NjQuCisKKwkqIGNvbmZpZy9hbHBoYW9zZi5tdCAoVERFRklORVMpOiBSZW1vdmVkOyBzZXR0aW5nIGhvc3QgcGFyYW1ldGVycworCWluIFRERUZJTkVTIGlzIHdyb25nLgorCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6CisJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBvdXRwdXRfc2VjdGlvbi4KKworVHVlIE5vdiAzMCAxNjo0NToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGlyaXgtY29yZS5jOiBOZXcgZmlsZSBmb3IgSXJpeCA0IGFuZCBJcml4IDUgY29yZSBzdXBwb3J0LgorCUZ1bmN0aW9ucyB0YWtlbiBvdXQgb2YgY29mZi1taXBzLmMuICBIYW5kbGUgdm1hcCB0eXBlIFZNQVBGSUxFLgorCSogY29mZi1taXBzLmM6IElyaXggNCBjb3JlIGZpbGUgc3VwcG9ydCBtb3ZlZCB0byBpcml4LWNvcmUuYy4KKwkqIHRhcmdldHMuYzogSWYgSVJJWF9DT1JFIGRlZmluZWQsIGluY2x1ZGUgaXJpeF9jb3JlX3ZlYyBpbgorCXRhcmdldF92ZWN0b3IuCisJKiBjb25maWcvaXJpeDQubWggKEhERUZJTkVTKTogQWRkIC1ESVJJWF9DT1JFLgorCShIREVQRklMRVMpOiBEZWZpbmUgdG8gYmUgaXJpeC1jb3JlLm8uCisJKiBjb25maWcvaXJpeDUubWggKEhERUZJTkVTKTogRGVmaW5lIHRvIGJlIC1ESVJJWF9DT1JFLgorCShIREVQRklMRVMpOiBEZWZpbmUgdG8gYmUgaXJpeC1jb3JlLm8uCisJKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiBBZGRlZCBpcml4LWNvcmUuby4gIFJlbW92ZWQKKwlzY28tY29yZS5vLCB3aGljaCBubyBsb25nZXIgZXhpc3RzLgorCShDRklMRVMpOiBBZGRlZCBhbGwgKi1jb3JlLmMgZmlsZXMuCisJUmVidWlsdCBkZXBlbmRlbmNpZXMuCisKK1dlZCBOb3YgMjQgMDI6MDI6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogUmVzdG9yZSBjaGVjayBvZiBmaWxlX3NpemUgIT0KKwltZW1fc2l6ZSwgYnV0IG9ubHkgaWYgU0hUX1BST0dCSVRTLgorCisJKiBlY29mZmxpbmsuYzogTmV3IGZpbGUgdG8gaG9sZCBFQ09GRiBkZWJ1ZyBpbmZvcm1hdGlvbiBsaW5raW5nCisJcm91dGluZXMuCisJKiBlY29mZi5jIChlY29mZl9jbGVhcl9vdXRwdXRfZmxhZ3MsIGVjb2ZmX3JlbCwgZWNvZmZfZHVtcF9zZWNsZXQsCisJZWNvZmZfYWRkX3N0cmluZywgZWNvZmZfZ2V0X2RlYnVnKTogUmVtb3ZlZC4gIEZ1bmN0aW9uYWxpdHkgbm93IGluCisJZWNvZmZsaW5rLmMuCisJKGVjb2ZmX2dldF9leHRyLCBlY29mZl9zZXRfaW5kZXgpOiBOZXcgZnVuY3Rpb25zLgorCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogRG9uJ3Qgc2F2ZSByYXdfc2l6ZS4KKwkoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogUmV3cm90ZSB0byB1c2UgZWNvZmZsaW5rLmMgZnVuY3Rpb25zLgorCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBzZXQgRVhFQ19QIGp1c3QKKwliZWNhdXNlIHRoZXJlIGlzIGEgc3RhcnQgYWRkcmVzcy4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGV4dGVybmFsIHN5bWJvbHMgaGVyZS4gIFVzZQorCWVjb2ZmbGluay5jIGZ1bmN0aW9ucyB0byB3cml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8sIG1pcHNfZWxmX2dldF9leHRyLAorCW1pcHNfZWxmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMuCisJKG1pcHNfZWxmX3NlY2xldF9saW5rKTogRGlzY2FyZCBlbXB0eSBzZWN0aW9ucywgdGhlIC5vcHRpb25zCisJc2VjdGlvbiBhbmQgLmdwdGFiIHNlY3Rpb25zLiAgSGFuZGxlIGxpbmtpbmcgLm1kZWJ1ZyBzZWN0aW9uLgorCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogUmVtb3ZlZCByYXdfc2l6ZSBhbmQgaWZkYmFzZS4KKwkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBBZGRlZCBtaXBzX2V4dHIgdG8gdGNfZGF0YSB1bmlvbi4KKwkqIGJmZC1pbi5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciByb3V0aW5lcyBpbiBlY29mZmxpbmsuYyAoc29tZSBhcmUKKwljYWxsZWQgYnkgZ2FzLCBzbyB0aGV5IGFyZSBwdWJsaWMpLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkZWQgZWNvZmZsaW5rLm8uCisJKENGSUxFUyk6IEFkZGVkIGVjb2ZmbGluay5jLgorCShlY29mZmxpbmsubyk6IE5ldyB0YXJnZXQuICBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKworTW9uIE5vdiAyMiAyMjoyNjo0MiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKGhwcGFfb2JqZWN0X3ApOiBBbHNvIHJlY29nbml6ZSBTSEFSRURfTUFHSUNfQ05YIGFzCisJYSB2YWxpZCBtYWdpYyBudW1iZXIgaWYgaXQncyBiZWVuIGRlZmluZWQuCisKK01vbiBOb3YgMjIgMTQ6MTc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IERvbid0IGNyZWF0ZSAuc2NvbW1vbiBzZWN0aW9uOyBsaW5rZXIKKwlubyBsb25nZXIgcmVxdWlyZXMgaXQuCisJKGVjb2ZmX2JmZF9zZWNsZXRfbGluaywgZWNvZmZfc2l6ZW9mX2hlYWRlcnMsCisJZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgdHJlYXQgLnNjb21tb24gc2VjdGlvbgorCXNwZWNpYWxseS4KKworTW9uIE5vdiAyMiAxMDo1NDoyNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCU1lcmdlZCBjaGFuZ2VzIGZyb20ga2V2QHNwdWRzLmdlZy5tb3QuY29tIChLZXZpbiBBLiBCdWV0dG5lcik6CisJKiBiZmQvY29uZmlnL2RlbHRhODgubWggKEhERUZJTkVTKTogRGVmaW5lIHRoaXMgdG8gYmUgLURQVFJBQ0VfQ09SRS4KKwkqIGJmZC9jb25maWcvZGVsdGE4OC5taCAoSERFUEZJTEVTKTogRGVmaW5lZCB0byBiZSBwdHJhY2UtY29yZS5vLgorCSogYmZkL3B0cmFjZS1jb3JlLmM6ICBOZXcgZmlsZSBmb3IgZGVhbGluZyB3aXRoIGNvcmUgZmlsZXMgd2l0aAorCXN0YXJ0IHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBmb3VuZCBvbiBCQ1MgY29tcGxpYW50IHN5c3RlbXMuCisJKiBiZmQvdGFyZ2V0cy5jIChwdHJhY2VfY29yZV92ZWMpOiAgTmV3IHZlY3Rvci4KKworTW9uIE5vdiAyMiAwMjozMzoxMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWluaW1hbCBzdXBwb3J0IGZvciByZWFkaW5nIFNPTSBmaXh1cCBzdHJlYW1zLiAgQWxsb3dzCisJb2JqZHVtcCAtciB0byBkbyBzb21ldGhpbmcgcmVhc29uYWJsZS4KKwkqIHNvbS5jIChzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogSW1wbGVtZW50LgorCShzb21fY2Fub25pY2FsaXplX3JlbG9jKTogSW1wbGVtZW50LgorCShzb21fc2V0X3JlbG9jX2luZm8sIHNvbV9zbHVycF9yZWxvY190YWJsZSk6IE5ldyBmdW5jdGlvbnMuCisKK1N1biBOb3YgMjEgMTM6NDY6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBob3N0cy9seW54LmggKEZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCk6IERlZmluZS4KKwkqIGhvc3RzL3NwYXJjbHlueC5oOiBJbmNsdWRlIGx5bnguaCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0LgorCitGcmkgTm92IDE5IDE0OjM0OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBGb3IgUl9JUkVMLCBkb24ndCBsZWZ0IHNoaWZ0CisJc2lnbmVkX3ZhbHVlIGJlZm9yZSBzaWduIGV4dGVuZGluZyBpdC4gIERvbid0IHN1YnRyYWN0IG91dAorCXJlbG9jX2VudHJ5LT5hZGRyZXNzLiAgVGhpcyBtYWtlcyBpdCBjb21wYXRpYmxlIHdpdGggd2hhdCBnYXMgaXMKKwlnZW5lcmF0aW5nLgorCisJKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWNjZXB0IC5zYnNzIGFzIHRoZSBuYW1lIGZvciBhCisJU0hUX05PQklUUyBzZWN0aW9ucy4KKwkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBEb24ndCBsZWF2ZSB0aGUgbG9vcCBhZnRlciB0aGUgZmlyc3QKKwlTSFRfTk9CSVRTIHNlY3Rpb24uCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogT25seSBmb3JjZSBzaF9vZmZzZXQgYW5kCisJc2hfYWRkciB0byBtYXRjaCBtb2R1bG8gbWF4cGFnZXNpemUgZm9yIGEgc2VjdGlvbiB3aGljaCBpcyBub3QKKwlTSFRfTk9CSVRTLiAgQ2hhbmdlZCB0aGUgbWV0aG9kIHVzZWQgdG8gZm9yY2UgcGFnZSBhbGlnbm1lbnQgYWZ0ZXIKKwlhIFNIVF9OT0JJVFMgc2VjdGlvbiB0byBvbmx5IGRvIGl0IGZvciB0aGUgbGFzdCBzdWNoIGNvbnNlY3V0aXZlCisJc2VjdGlvbiwgYW5kIHRvIHJlYWxseSBmb3JjZSBwYWdlIGFsaWdubWVudC4KKworRnJpIE5vdiAxOSAwNDowMjowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUHJpbnQgbW9yZSB2ZXJib3NlIG1lc3NhZ2UKKwlpbiB0aGUgY2FzZSBvZiBhbiB1bmtub3duIChvciB1bmhhbmRsZWQpIHN0b3JhZ2UgY2xhc3MuCisKKwkqIGNvbmZpZy9pMzg2LWx5bngubXQgKFRERUZJTkVTKTogRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEIHNob3VsZAorCW5vdCBiZSBkZWZpbmVkIGhlcmUsIHNpbmNlIGl0IGlzIGEgaG9zdCBhdHRyaWJ1dGUsIG5vdCBhIHRhcmdldAorCW9uZS4KKwkqIGNvbmZpZy9tNjhrLWx5bngubXQsIGNvbmZpZy9zcGFyYy1seW54Lm10OiBEaXR0by4KKworCSogY29mZmNvZGUuaCAoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeQorCWRlZmluZWQuCisKKwkqIGNvZmYtc3BhcmMuYzogRGVmaW5lIHNvbWUgcmVsb2NhdGlvbnMsIGJhc2VkIG9uIEVMRiByZWxvY2F0aW9ucy4KKwkoZW51bSByZWxvY190eXBlLCBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlLAorCXN0cnVjdCBjb2ZmX3JlbG9jX21hcCwgc3BhcmNfcmVsb2NfbWFwLAorCWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiBCb3Jyb3dlZCBmcm9tIGVsZjMyLXNwYXJjLmMgYW5kCisJZWxmLmMsIHJlbmFtZWQuCisJKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lIHRvIGJlIGNvZmZfc3BhcmNfcmVsb2NfLi4uLgorCShydHlwZTJob3d0byk6IEluZGV4IGludG8gY29mZl9zcGFyY19ob3d0b190YWJsZSB1c2luZworCWRzdC0+cl90eXBlLgorCitUaHUgTm92IDE4IDExOjQ1OjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZCAobWlwcyotKi1pcml4NSopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwc2JlbGYuCisJKiBjb25maWd1cmUuaG9zdCAobWlwcy1zZ2ktaXJpeDUqKSBOZXcgaG9zdDsgdXNlIGlyaXg1IChubworCWhvc3RzL2lyaXg1LmggY3JlYXRlZDsganVzdCB1c2Ugc3RkLWhvc3QuaCkuCisJKiBjb25maWcvaXJpeDUubWg6IE5ldyBmaWxlOyBsaWtlIGlyaXg0Lm1oLCBidXQgZG9uJ3QgdXNlIC1HIG9yCisJLWxtYWxsb2MuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCisKKwkqIGVjb2Zmc3dhcC5oOiBDaGFuZ2VkIHR5cGUgb2YgaW50ZXJuYWwgcG9pbnRlcnMgZm9yIHN3YXAgb3V0CisJZnVuY3Rpb25zIHRvIGNvbnN0ICouCisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ290MTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uICBIYW5kbGUgR09UMTYKKwljb3JyZWN0bHkgZm9yIGFzc2VtYmxlciwgYnV0IGxpbmtlciBzdXBwb3J0IG5vdCBpbXBsZW1lbnRlZC4KKwkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBVc2UgbWlwc19lbGZfZ290MTZfcmVsb2MgZm9yIEdPVDE2LgorCShtaXBzX2VsZl9zeW1faXNfZ2xvYmFsKTogTmV3IGZ1bmN0aW9uOyBhdCBsZWFzdCBvbiBJcml4IDUsIGFsbAorCW5vbiBzZWN0aW9uIHN5bWJvbHMgYXJlIGNvbnNpZGVyZWQgZ2xvYmFsLgorCShlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgorCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZSBNSVBTCisJYXJjaGl0ZWN0dXJlIGxldmVsIGNvcnJlY3RseS4KKwkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KKwkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfT1BUSU9OUy4KKwkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBlbnRzaXplIG9mIC5tZGVidWcgb3IgLnJlZ2luZm8KKwlzZWN0aW9uIHRvIDEuICBIYW5kbGUgLm9wdGlvbnMgc2VjdGlvbi4KKwkobWlwc19lbGZfYWNvbV9zZWN0aW9uLCBtaXBzX2VsZl9hY29tX3N5bWJvbCwKKwltaXBzX2VsZl9hY29tX3N5bWJvbF9wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlcywgdXNlZCB0byBidWlsZCBhCisJZ2VuZXJpYyAuYWNvbW1vbiBzZWN0aW9uIHRvIGhvbGQgU0hOX01JUFNfQUNPTU1PTiBzeW1ib2xzLgorCShtaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IEhhbmRsZSBTSE5fTUlQU19BQ09NTU9OIHN5bWJvbHMgYnkKKwlwdXR0aW5nIHRoZW0gYWxsIGluIGEgZ2xvYmFsIC5hY29tbW9uIHNlY3Rpb24uCisKKwkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgZHVtcCBjb3JlIGlmIHRhcmdldAorCXNlY3Rpb24gaGFzIG5vIEVMRiBzZWN0aW9uIGRhdGEuCisJKGVsZl9tYWtlX3NlY3Rpb25zKTogU2V0IGFkZHJhbGlnbiBvZiByZWxvYyBzZWN0aW9uIHRvIDQuCisJKGVsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKG1hcF9wcm9ncmFtX3NlZ21lbnRzKToJRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KKwlJbiB0aGUgbWFpbiBsb29wLCBza2lwIHRoZSBzeW10YWIgYW5kIHN0cnRhYiBzZWN0aW9ucywgc2luY2UgdGhlaXIKKwlwb3NpdGlvbnMgYXJlIHNldCBlbHNld2hlcmUuCisJKHN3YXBfb3V0X3N5bXMpOiBTZXQgYWRkcmFsaWduIG9mIHN5bXRhYiBzZWN0aW9uIHRvIDQuICBTZXQKKwlhZGRyYWxpZ24gb2Ygc3RydGFiIHNlY3Rpb25zIHRvIDEuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgorCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB3cml0ZSBvdXQgc2VjdGlvbiAwLgorCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBmaWVsZHMKKwllbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsIGFuZCBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgorCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEFkZGVkIGNvcnJlc3BvbmRpbmcgaW5pdGlhbGl6ZXJzLgorCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCk6IExpa2V3aXNlLgorCSogZWxmY29kZS5oIChzeW1faXNfZ2xvYmFsKTogVGFrZSBhYmZkIGFyZ3VtZW50LiAgQ2FsbAorCWVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwgaWYgaXQgaXMgbm90IE5VTEwuCisJKGVsZl9tYXBfc3ltYm9scyk6IFBhc3MgYWJmZCB0byBzeW1faXNfZ2xvYmFsLgorCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKKwlpZiBpdCBpcyBkZWZpbmVkLgorCitXZWQgTm92IDE3IDE4OjQzOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGliZWNvZmYuaDogSW5jbHVkZSBjb2ZmL2Vjb2ZmLmguCisJKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBNb3ZlIGV4dGVybmFsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorCWZpZWxkcyBpbnRvIGEgc2luZ2xlIGZpZWxkIHBvaW50aW5nIHRvIGFuIGVjb2ZmX2RlYnVnX3N3YXAKKwlzdHJ1Y3R1cmUuCisJKGVjb2ZmX2RhdGFfdHlwZSk6IE1vdmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZpZWxkcyBpbnRvIGEgc2luZ2xlCisJZmllbGQgcG9pbnRpbmcgdG8gYW4gZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuCisJKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCBlY29mZi5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1dlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCisKKwkqIG5sbXN3YXAuaDogTmV3IGZpbGUgdG8gc3dhcCBmaXhlZCBoZWFkZXIuICBJbmNsdWRlZCBieSBOTE0KKwliYWNrZW5kcy4KKwkqIGxpYm5sbS5oIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYyk6IERlZmluZS4KKwkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGZpeGVkX2hlYWRlcl9zaXplLAorCW5sbV9yZWFkX2ltcG9ydCwgbmxtX3dyaXRlX2ltcG9ydCwgbmxtX3N3YXBfZmhkcl9pbiwKKwlubG1fc3dhcF9maGRyX291dC4KKwkobmxtX2ZpeGVkX2hlYWRlcl9zaXplLCBubG1fcmVhZF9pbXBvcnRfZnVuYywKKwlubG1fd3JpdGVfaW1wb3J0X2Z1bmMsIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jLAorCW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYywgbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMpOiBOZXcKKwlhY2Nlc3NvciBtYWNyb3MuCisJKiBubG1jb2RlLmg6IFVzZSBuZXcgZnVuY3Rpb25zLgorCSogbmxtMzItaTM4Ni5jOiBQcm92aWRlIG5ldyBmdW5jdGlvbnMuCisJKiBubG0zMi1zcGFyYy5jOiBOZXcgZmlsZTsgU1BBUkMgTkxNIGJhY2tlbmQuCisKK1dlZCBOb3YgMTcgMTM6NTY6MTAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBpMzg2bHlueC5jIChzd2FwX3N0ZF9yZWxvY19pbiwgc3dhcF9leHRfcmVsb2NfaW4pOiBJZ25vcmUKKwlnYXJiYWdlIGJpdHMgYXBwZWFyaW5nIGluIHRoZSB1cHBlciBlbmQgb2Ygc3ltYm9sbnVtcy4KKworCSogY29uZmlnL3NwYXJjLWx5bngubXQgKFRERUZJTkVTKTogQWRkIC1ERlBSSU5URl9BTFJFQURZX0RFQ0xBUkVELgorCitUdWUgTm92IDE2IDE3OjAzOjQxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogIENoYW5nZSBiZmRfemFsbG9jIHRvIGJmZF9hbGxvYy4KKwkqIG02OGtseW54LmM6ICBEZWZpbmUgY29yZSBmaWxlIG1hY3Jvcy4KKwkqIGhvc3RzL2kzODZseW54LmgsIGhvc3RzL202OGtseW54LmgsIGhvc3RzL2x5bnguaDogIE1vdmUgYWxsCisJbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzdHVmZiBpbnRvIGx5bnguaC4KKworVHVlIE5vdiAxNiAxNTo0NTo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaTM4NmxpbnV4LmM6IERlZmluZSBuZXcgbWFjcm8gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSB0byAxMDI0LCBhbmQKKwljaGFuZ2UgUEFHRV9TSVpFIHRvIDQwOTYuCisKK01vbiBOb3YgMTUgMTE6NDg6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KKworCSogVkVSU0lPTjogVXBkYXRlZC4KKworU3VuIE5vdiAxNCAyMzozMzowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBEbyBub3QgY3JlYXRlIGR1bW15ICIudGV4dCIsICIuZGF0YSIsCisJYW5kICIuYnNzIiBzZWN0aW9ucy4KKwkoc2V0dXBfc2VjdGlvbnMpOiBEbyBub3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgaWYgYSBzZWN0aW9uJ3Mgc2l6ZQorCWlzIHplcm8uICBSZWNvZ25pemUgQlNTIHR5cGUgc2VjdGlvbnMgYW5kIHR1cm4gb2ZmIFNFQ19MT0FEIGFuZAorCVNFQ19EQVRBIChzbyBiaW51dGlscy9zaXplIHdvcmtzKS4gIFNldCB0aGUgY29ycmVjdCB2YWx1ZSBmb3IKKwlhIHNlY3Rpb24ncyBfcmF3X3NpemUuCisJKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBQcm9ncmFtIGVudHJ5IHBvaW50cywgYW5kIG1pbGxpY29kZSBhcmUKKwlhbHNvIGZ1bmN0aW9ucy4gIE1hcmsgdGhlbSBhcyBzdWNoLiAgQWxzbyBtYXJrIEwkKiBzeW1ib2xzIGFzCisJZGVidWdnaW5nIHN5bWJvbHMuCisKKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworU2F0IE5vdiAxMyAxNToyNzoxNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbWlzc2luZyBwcm90b3R5cGUuICBSZXR1cm5zCisJYSBwb2ludGVyIHRvIGNvbnN0YW50IGRhdGEuICBEZWxldGUgYm9ndXMgI2RlZmluZSB3aGljaCBtYWRlIHRoZSAKKwlmdW5jdGlvbiB1c2VsZXNzLgorCisJKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MpOiBOZXcgZnVuY3Rpb24uCisJKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2JlZ2luX3dyaXRpbmcpOiBOZXcgZnVuY3Rpb24uCisKK0ZyaSBOb3YgMTIgMTU6Mjk6MzYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG8gbm90IGFib3J0LiAgRmxlc2ggb3V0LgorCShzb21fc2V0X3NlY3Rpb25fY29udGVudHMpOiBEbyBub3QgYWJvcnQuICBGbGVzaCBvdXQuCisKKwkqIHNvbS5jIChzb21fd3JpdGVfaGVhZGVycyk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX3ByZXBfaGVhZGVycyk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24uCisKKwkqIHNvbS5jIChzb21fc2l6ZW9mX2hlYWRlcnMpOiBBZGQgbWlzc2luZyBwcm90b3R5cGUuCisJKHNvbV9zZXRfYXJjaF9tYWNoKTogRG8gbm90IGFib3J0LgorCisJKiBzb20uYyAoc29tX2NvdW50X3NwYWNlcyk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2NvdW50X3N1YnNwYWNlcyk6IE5ldyBmdW5jdGlvbi4KKwkoY29tcGFyZV9zeW1zKTogTmV3IGZ1bmN0aW9uLgorCShzb21fY29tcHV0ZV9jaGVja3N1bSk6IE5ldyBmdW5jdGlvbi4KKworCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogTmV3IGZ1bmN0aW9uLgorCShzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgorCisJKiBzb20uYyAodHJ5X3ByZXZfZml4dXApOiBOZXcgZnVuY3Rpb24uCisJKHNvbV9yZWxvY19za2lwKTogTmV3IGZ1bmN0aW9uLgorCShzb21fcmVsb2NfYWRkZW5kKTogTmV3IGZ1bmN0aW9uLgorCShzb21fcmVsb2NfY2FsbCk6IE5ldyBmdW5jdGlvbi4KKworCSogc29tLmMgKHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlKTogTmV3IGZ1bmN0aW9uLgorCShzb21fcmVsb2NfcXVldWVfaW5zZXJ0KTogTGlrZXdpc2UuCisJKHNvbV9yZWxvY19xdWV1ZV9maXgpOiBMaWtld2lzZS4KKwkoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBMaWtld2lzZS4KKworCSogc29tLmMgKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogU09NIGhvd3RvIHJlbG9jYXRpb24gdGFibGUuCisJKGhwcGFfc29tX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgorCisJKiBzb20uYyAoc3RydWN0IHJlbG9jX3F1ZXVlKTogTmV3IHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mCisJdGhlIGxhc3QgZm91ciBtdWx0aWJ5dGUgcmVsb2NhdGlvbnMgZW1pdHRlZC4KKwkoZW51bSBwYV9zeW1ib2xfdHlwZSk6IFR5cGUgdG8gZnVsbHkgZGVzY3JpYmUgdGhlIHN5bWJvbCB0eXBlcworCWFzc29jaWF0ZWQgd2l0aCAuaW1wb3J0Ly5leHBvcnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCisKKwkqIHNvbS5jOiBJbmNsdWRlIGxpYmhwcGEuaAorCisJKiBzb20uYyAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KKwkoYmZkX3NvbV9zZXRfc3ltYm9MX3R5cGUpOiBMaWtld2lzZS4KKwkoYmZkX3NvbV9hdHRhY2hfdW53aW5kX2luZm8pOiBMaWtld2lzZS4KKwkqIHNvbS5oOiBEZWNsYXJlIG5ldyBleHBvcnRlZCBmdW5jdGlvbnMuCisKKwkqIHNvbS5oIChzdHJ1Y3Qgc29tX3N5bWJvbCk6IEFkZCBuZXcgZmllbGRzIHRvIGhvbGQgYWRkaXRpb25hbAorCWluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZC93cml0ZSBzeW1ib2wgdGFibGVzIGFuZCBmaXh1cCBzdHJlYW1zLgorCShzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkcyB0byBob2xkIGFkZGl0aW9uYWwKKwlpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQvd3JpdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCisJKHNvbV9zeW1ib2xfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNybyBmb3IgU09NIHN5bWJvbCBpbmZvcm1hdGlvbi4KKwkoUl9IUFBBXyopOiBCYXNpYyByZWxvY2F0aW9uIHR5cGVzIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KKworRnJpIE5vdiAxMiAxMTowMDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IElmIG5ldyBob29rCisJVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFIGRlZmluZWQsIHRoZW4gc2tpcCB0aGUgY2hlY2sgZm9yIHRoZQorCWNvcmVmaWxlIGJlaW5nIHRvbyBiaWcuCisJKiBob3N0cy9pMzg2c2NvLmg6IERlZmluZSBpdC4KKworVGh1IE5vdiAxMSAxNToxNjoyOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGhwcGFic2RfY29yZV9kYXRhLgorCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkIGhwcGFic2RfY29yZV92ZWMuCisJKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogRmFpbCBpZiBhbiB1bmtub3duIGNvcmUKKwlzZWN0aW9uIGlzIGVuY291bnRlcmVkIGR1cmluZyBjb3JlIHNlY3Rpb24gc2Nhbm5pbmcuCisJKiBocHBhYnNkLWNvcmUuYzogTmV3IGZpbGUuCisJKiBjb25maWcvaHBwYWJzZC5taDogRW5hYmxlIEhQUEEgQlNEIGNvcmUgZmlsZXMuCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBSZW1vdmUgREVGVU4gY3J1ZC4gIFJlbW92ZSBjb2RlCisJd2hpY2ggaXMgZWl0aGVyIGNvbW1lbnRlZCBvdXQgb3IgaWZkZWYnZCBvdXQuICBBZGQsIHVwZGF0ZSBhbmQKKwljbGVhbiBjb21tZW50cy4gIEZpeCB2YXJpb3VzIGluZGVudGlvbiBhbmQgc3BhY2luZyBwcm9ibGVtcy4gIEhhbmRsZQorCXByb2JsZW1zIHJlbGF0ZWQgdG8gdXNpbmcgImJsZSIgdG8ganVtcCB0byBhIHN0dWIgcmF0aGVyIHRoYW4gImJsIgorCSglcjMxIGlzIHRyYXNoZWQgYnkgImJsZSIsIGJ1dCBub3QgYnkgImJsIikuCisJKE5FV19JTlNUUlVDVElPTik6IFB1dCBpbnNpZGUgY3VybHkgYnJhY2VzLgorCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRml4IGluZGVudGlvbiBwcm9ibGVtcy4KKwkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBGaXggaW5kZW50aW9uIGFuZCBzcGFjaW5nIHByb2JsZW1zLgorCUFkZCwgdXBkYXRlIGFuZCBjbGVhbiBjb21tZW50cy4gIEhhbmRsZSAiYmxlIiAlcjMxIGxvc3NhZ2UgcHJvYmxlbXMuCisJKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBMaWtld2lzZS4KKwkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGhwcGFfZWxmX3N0dWJfY2hlY2spOiBSZW1vdmUgb2Jzb2xldGUgZnVuY3Rpb24uCisKKwkqIGhwcGFfc3R1YnMuaDogQWRkIG5ldyBpbnN0cnVjdGlvbnMgdG8gZGVhbCB3aXRoICVyMzEgbG9zc2FnZQorCXByb2JsZW1zLiAgRGVsZXRlIHVudXNlZCBpbnN0cnVjdGlvbnMuCisJCitUdWUgTm92ICA5IDExOjQwOjI3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogbTY4a2x5bnguYyAoVEFSR0VUX0lTX0JJR19FTkRJQU5fUCk6IERlZmluZS4KKworVHVlIE5vdiAgOSAxMToyNjowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoIGFuIGFycmF5CisJb2YgYXJjaGl0ZWN0dXJlcywgZ2V0IHRoZSBFTEYgRU1feHh4IGNvZGUgZnJvbSB0aGUgYmFja2VuZAorCWluZm9ybWF0aW9uLiAgTGV0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgbWF0Y2ggYW55IEVNX3h4eCBjb2RlIG5vdAorCW1hdGNoZWQgYnkgYW5vdGhlciBFTEYgdGFyZ2V0LiAgQ2FsbCBlbGZfYmFja2VuZF9vYmplY3RfcCB0byBsZXQKKwl0aGUgYmFja2VuZCBkbyBtb3JlIGNoZWNrcyBhbmQgc2V0IGdsb2JhbCBpbmZvcm1hdGlvbi4KKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGVsZl9tYWNoaW5lX2NvZGUgYW5kCisJZWxmX2JhY2tlbmRfb2JqZWN0X3AgZmllbGRzLgorCShzdHJ1Y3QgYmZkX2VsZl9hcmNoX21hcCk6IFJlbW92ZWQuCisJKGJmZF9lbGZfYXJjaF9tYXAsIGJmZF9lbGZfYXJjaF9tYXBfc2l6ZSk6IERvbid0IGRlY2xhcmUuCisJKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IEluaXRpYWxpemUgZWxmX21hY2hpbmVfY29kZQorCWZpZWxkIHdpdGggRUxGX01BQ0hJTkVfQ09ERS4gIEluaXRpYWxpemUgZWxmX2JhY2tlbmRfb2JqZWN0X3AKKwlmaWVsZCB3aXRoIGVsZl9iYWNrZW5kX29iamVjdF9wIChpZiBpdCBpcyBkZWZpbmVkKS4KKwkqIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLAorCWVsZjMyLW02OGsuYywgZWxmMzItbTg4ay5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXNwYXJjLmMsCisJZWxmNjQtZ2VuLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZpbmVkLgorCSogZWxmMzItbWlwcy5jOiBJbmNsdWRlIGVjb2Zmc3dhcC5oIHRvIGdldCBFQ09GRiBzd2FwcGluZworCXJvdXRpbmVzLgorCShtaXBzX2VsZl9vYmplY3RfcCk6IFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuCisJKG1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmVkLgorCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IERlZmluZWQgdG8gYmUgbWlwc19lbGZfb2JqZWN0X3AuCisJKGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmVkIHRvIGJlCisJbWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcC4KKwkqIGVsZi5jIChiZmRfZWxmX2FyY2hfbWFwLCBiZmRfZWxmX2FyY2hfbWFwX3NpemUpOiBSZW1vdmVkLgorCisJKiBsaWJiZmQtaW4uaCAodGFyZ2V0X3ZlY3RvciwgZGVmYXVsdF92ZWN0b3IpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbHQuCisJKiBmb3JtYXQuYyAodGFyZ2V0X3ZlY3RvciwgZGVmYXVsdF92ZWN0b3IpOiBEb24ndCBkZWNsYXJlLgorCisJKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogRG9uJ3QgY29tcGxhaW4gb24gb3ZlcmZsb3cKKwlmb3IgUl9NSVBTXzI2LiAgQ29ycmVjdCBvdmVyZmxvdyBkZXRlY3Rpb24gcmVxdWlyZXMgbWF0Y2hpbmcgdGhlCisJdXBwZXIgZm91ciBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZ2FpbnN0IHRoZSBQQy4gIEZyb20gVGVkIExlbW9uCisJPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4uCisKKwkqIGJvdXQuYyAoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBSZXR1cm4gdHlwZSBzaG91bGQgcG9pbnQgdG8KKwljb25zdCBkYXRhLgorCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgorCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgorCSogbWlwc2JzZC5jIChNWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkpOiBMaWtld2lzZS4KKwkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBNYWRlIGhvd3RvIGNvbnN0LgorCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfZGF0YSk6IE1hZGUgaG93IGNvbnN0LgorCisJKiBsaWJlbGYuaDogQWRkZWQgc29tZSBjb21tZW50cy4KKwkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCisJZmllbGQuICBSZW1vdmVkIHVudXNlZCB3cml0ZV9yZWxvY3MgZmllbGQuCisJKiBlbGYzMi10YXJnZXQuaDogQWRqdXN0ZWQgZWxmX2JhY2tlbmRfZGF0YSBpbml0aWFsaXphdGlvbgorCWFjY29yZGluZ2x5LgorCSogZWxmNjQtdGFyZ2V0Lmg6IENvcnJlY3RlZCBlbGZfYmFja2VuZF9kYXRhIGluaXRpYWxpemF0aW9uIHRvCisJZmlsbCBpbiBhbGwgZmllbGRzIGFuZCB0byBzZXQgZWxmXzY0X3AgdG8gMS4KKworTW9uIE5vdiAgOCAxODoxMzoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlIGR1cGxpY2F0ZSBhc3NpZ25tZW50CisJdG8gZmlsZXBvcyBpbiBTSFRfU1RSVEFCIGNhc2UuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogU2V0IEJGRCBzZWN0aW9uIGZpbGVwb3MgYXMKKwl3ZWxsIGFzIEVMRiBzZWN0aW9uIHNoX29mZnNldC4KKworCSogcmVsb2MuYzogVXNlIGNvbnN0IGluc3RlYWQgb2YgQ09OU1QuCisJKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBNYWtlIHZhcmlhYmxlIGhvd3RvIGEgY29uc3QgcG9pbnRlci4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCisKK01vbiBOb3YgIDggMTI6MTk6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChyZWFsY2xlYW4pOiBEb24ndCByZW1vdmUgZ2VuZXJhdGVkIGhlYWRlcnMuICBSZXZlcnRzCisJY2hhbmdlIG9mIDIgSnVsIDE5OTMuCisKK01vbiBOb3YgIDggMDY6MDg6MzEgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmJmZDogbWFrZSB1bml4d2FyZSBlcXVpdmFsZW50IHRvIHN5c3Y0LgorCisJKiBjb25maWcvaTM4Ni1ubG0ubXQ6IGJyaW5nIGluIGVsZiBjb25maWc7IG1ha2UgaXQgdGhlIGRlZmF1bHQuCisKK1N1biBOb3YgIDcgMjA6MjE6MzggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGxpYmJmZC5jIChiZmRfcHV0XzgpOiBBZGQgcGFyZW5zIGFyb3VuZCByZWZlcmVuY2UgdG8gInZhbCIKKwlhcmd1bWVudC4KKworRnJpIE5vdiAgNSAyMTo0NTowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSksCisJaTM4Nm1hY2gzLmMgKFNFR01FTlRfU0laRSwgVEVYVF9TVEFSVF9BRERSKTogQ29ycmVjdCB2YWx1ZXMgKD8pLgorCitGcmkgTm92ICA1IDE1OjE3OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBaZXJvIG91dCBpbnRlcm5hbF9hLgorCitGcmkgTm92ICA1IDEwOjQxOjA3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgY2FjaGUuYywgY29mZmNvZGUuaCwKKwljb3JlLmMsIGN0b3IuYywgZm9ybWF0LmMsIGluaXQuYywgbGliYmZkLmMsIG9wbmNscy5jLCByZWxvYy5jLAorCXNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6CisJRG9jIGNsZWFudXAgKHNwZWxsaW5nLCBwdW5jdHVhdGlvbiwgZ3JhbW1hciwgZm9ybWF0dGluZykuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitUaHUgTm92ICA0IDE0OjQ2OjE0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBydGwuY3lnbnVzLmNvbSkKKworCSogYmZkLWluLmggKGJmZF9nZXRfY2FjaGVhYmxlLCBiZmRfc2V0X2NhY2hlYWJsZSk6ICBOZXcgYWNjZXNzb3JzLgorCSogYmZkLmMsIG9wbmNscy5jOiAgSW1wcm92ZSBjb21tZW50cyBvbiBmaWxlIGRlc2NyaXB0b3IgY2FjaGVpbmcuCisKK1RodSBOb3YgIDQgMDg6NTQ6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIEZyb20gUGV0ZSBIb29nZW5ib29tIChob29nZW5AY3MudXRhaC5lZHUpCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IGxvZ2ljIGVycm9yCisJaW4gbGFzdCBjaGFuZ2UuICBBbHdheXMgcmVidWlsZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gdGhlIGZpcnN0CisJdGltZSB0aG91Z2ggaWYgb3V0cHV0IHNlY3Rpb25zIGV4aXN0IChmaXhlcyBsZCAtciBwcm9ibGVtcykuCisKK1RodSBOb3YgMDQgMDg6MDg6NDYgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCAuUEhPTlkgZm9yIGNoZWNrIGFuZCBpbnN0YWxsY2hlY2sgcnVsZXMuCisKK1R1ZSBOb3YgIDIgMTQ6NDI6MjcgMTk5MyAgQmlsbCBDb3ggKGJpbGxAdGFya2FzLmN5Z251cy5jb20pCisKKwkqIGxpYmJmZC1pbi5oIChhcnRkYXRhKTogVXNlIGxvbmcsIG5vdCB0aW1lX3QgZm9yIHBvcnRhYmlsaXR5LCBhdAorCSAgbGVhc3QgdG8gSFBVWC4gIEZpbGUgYmVsb3cgaXMgYSBkZXJpdmVkIGZpbGUuCisKK1R1ZSBOb3YgIDIgMTQ6NDI6MjcgMTk5MyAgQmlsbCBDb3ggKGJpbGxAdGFya2FzLmN5Z251cy5jb20pCisKKwkqIGxpYmJmZC5oIChhcnRkYXRhKTogVXNlIGxvbmcsIG5vdCB0aW1lX3QgZm9yIHBvcnRhYmlsaXR5LCBhdAorCSAgbGVhc3QgdG8gSFBVWC4KKworVHVlIE5vdiAgMiAwOTozMjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZDogVXNlIGJpZ21pcHMgZm9yIG1pcHMqLSotYnNkKi4KKworTW9uIE5vdiAgMSAxNDozMDowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSwgZWxmX3NsdXJwX3JlbG9jX3RhYmxlKToKKwlIYW5kbGUgc3ltYm9sIG51bWJlciBvZiB6ZXJvLgorCisJKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZAorCUJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAorCUJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgQkZEX1JFTE9DX01JUFNfR1BSRUwzMi4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQorCUJGRF9SRUxPQ19NSVBTX0xJVEVSQUwuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogSGFuZGxlIG5ldyByZWxvY3MuCisJKG1pcHNfZWxmX2hpMTZfcmVsb2MsIG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBSZWFycmFuZ2UgX2dwX2Rpc3AKKwljaGVja3Mgc2xpZ2h0bHkuCisKKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCBNWV9iZmRfZGVidWdfaW5mb19lbmQsCisJTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0IFtzaWNdKTogUmVtb3ZlIHVudXNlZCBkZWZpbml0aW9ucy4KKwkoTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgTVlfYmZkX3JlbGF4X3NlY3Rpb24sCisJTVlfYmZkX3NlY2xldF9saW5rKTogRGVmaW5lLgorCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQorCU1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwLgorCShNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBSZW5hbWUgZnJvbSBNWV9tYWtlX2RlYnVnX3N5bWJvbC4KKwkoTVkodmVjKSk6IFVzZSBKVU1QX1RBQkxFIHJhdGhlciB0aGFuIGxpc3RpbmcgZnVuY3Rpb25zLgorCSogaHAzMDBocHV4LmMgKE1ZX2dldF9zeW10YWIsIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQsCisJTVlfY2Fub25pY2FsaXplX3JlbG9jLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBkZWZpbmUgaW4KKwl0ZXJtcyBvZiBNWSwgYmVjYXVzZSB0aGF0IGNhdXNlcyBhIHJlY3VzaXZlIGludm9jYXRpb24gb2YgQ0FUIHdoZW4KKwlleHBhbmRlZCB3aXRoaW4gSlVNUF9UQUJMRSwgYW5kIEFOU0kgY29tcGlsZXJzIGRvbid0IGV4cGFuZAorCXJlY3Vyc2l2ZSBtYWNyb3MuCisJKiBtaXBzYnNkLmMgKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCisJTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAsIGFuZCBkb24ndCBkZWZpbmUgaW4gdGVybXMgb2YgTVkuCisJKE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERvbid0IGRlZmluZSBpbiB0ZXJtcyBvZiBNWS4KKwkoYW91dF9taXBzX2xpdHRsZV92ZWMsIGFvdXRfbWlwc19iaWdfdmVjKTogVXNlIEpVTVBfVEFCTEUgcmF0aGVyCisJdGhhbiBsaXN0aW5nIGZ1bmN0aW9ucy4KKworTW9uIE5vdiAgMSAwOToxMjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZDogVXNlIG02OGstZWxmIGZvciBtNjgqLSotc3lzdjQqLgorCitTdW4gT2N0IDMxIDA5OjM1OjQ5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0YXJnZXRzLmM6IE1vdmUgZW51bSB0YXJnZXRfZmxhdm91ciBvdXRzaWRlIG9mIHN0cnVjdCBhbmQgY2hhbmdlCisJdGhlIG5hbWUgdG8gZW51bSBiZmRfZmxhdm91ci4gIFRoaXMgbWVhbnMgYmZkIGNsaWVudHMgY2FuIHVzZSBpdC4KKwkqIGJmZC1pbi5oOiBBZGQgbWFjcm8gYmZkX2dldF9mbGF2b3VyLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCisJKiBzb20uYzogQWRkIGNvbW1lbnQgYWJvdXQgaG93IGFib3J0KCkgb24gY29ycnVwdCBleGVjdXRhYmxlIGlzIGV2aWwuCisKK1NhdCBPY3QgMzAgMTI6Mjc6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKTogQXZvaWQgYSBnb3RvLgorCitGcmkgT2N0IDI5IDE2OjA0OjMzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZ2VuLWFvdXQuYywgbGliYmZkLmM6IGV4aXQoMSkgaW5zdGVhZCBvZiBleGl0KC0xKS4KKworRnJpIE9jdCAyOSAxMzoxNzoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGJmZC1pbi5oOiBBZGRlZCBjb21tYW5kcyBmb3Igb2JqZWN0IGZpbGUgZmxhZyB2YWx1ZXMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIHR5cGUgaXMgRVRfRFlOLCBzZXQgRFlOQU1JQyBmbGFnLAorCW5vdCBFWEVDX1AuCisJKiBib3V0LmMsIGNvZmYtaDgzMDAuYywgY29mZi1zaC5jOiBBZGQgQkZEX0lTX1JFTEFYQUJMRSB0bworCW9iamVjdF9mbGFncyBmaWVsZCBmb3IgdGFyZ2V0IHZlY3Rvci4KKwkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYm91dC5jLCBjb2ZmLWEyOWsuYywKKwljb2ZmLWFscGhhLmMsIGNvZmYtYXBvbGxvLmMsIGNvZmYtaDgzMDAuYywgY29mZi1oODUwMC5jLAorCWNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLCBjb2ZmLW1pcHMuYywKKwljb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYywgaHB1eC1jb3JlLmMsCisJaWVlZS5jLCBtaXBzYnNkLmMsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgb3NmLWNvcmUuYywgc29tLmMsCisJc3JlYy5jLCB0ZWtoZXguYywgdHJhZC1jb3JlLmM6CVJlbW92ZSBEWU5BTUlDIGZyb20gb2JqZWN0X2ZsYWdzCisJZmllbGQgZm9yIHRhcmdldCB2ZWN0b3IuCisKK1RodSBPY3QgMjggMjA6MDI6MzEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBob3N0cy9zdGQtaG9zdC5oOiBEb24ndCBkZWNsYXJlIHRpbWU7IGNhdXNlcyBlcnJvciBvbiBtYWNoMy4KKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Nm1hY2gzX3ZlYyk6IFJlcXVpcmUgYW91dDMyLm8gc3RhYi1zeW1zLm8uCisKK1RodSBPY3QgMjggMTY6MzM6MjYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJTHlueE9TIGFuZCBTcGFyYyBMeW54T1MgY2hhbmdlczoKKwkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBzcGFyYy0qLWx5bnhvcyouCisJKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIHNwYXJjLSotbHlueG9zKi4KKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIFNwYXJjIEx5bnggdmVjdG9ycy4KKwkqIHRhcmdldHMuYyAoc3BhcmNseW54X2FvdXRfdmVjKTogRGVjbGFyZS4KKwkoc3BhcmNseW54X2NvZmZfdmVjKTogRGVjbGFyZS4KKwkodGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aGVtLgorCSogY2YtaTM4Nmx5bnguYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBpMzg2bHlueC1jZi5jLgorCSogY2YtbTY4a2x5bnguYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBtNjhrbHlueC1jZi5jLgorCSogY2Ytc3BhcmNseW54LmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBjb2ZmIGluIFNwYXJjIEx5bnhPUy4KKwkqIGNvZmYtc3BhcmMuYzogTmV3IGZpbGUsIGJhc2ljIFNwYXJjIGNvZmYgc3VwcG9ydC4KKwkqIHNwYXJjbHlueC5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgYS5vdXQgaW4gU3BhcmMgTHlueE9TLgorCSogTWFrZWZpbGUuaW46IENoYW5nZSBmaWxlbmFtZXMgYXBwcm9wcmlhdGVseSwgYWRkIFNwYXJjIHJ1bGVzLgorCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZWNvZ25pemUgU3BhcmMgbWFnaWMKKwludW1iZXIuCisJKGNvZmZfc2V0X2ZsYWdzKTogVXNlIEx5bnhPUyBtYWdpYyBudW1iZXIgZm9yIGkzODYsIG02OGssIGFuZAorCVNwYXJjIEx5bnhPUywgc2V0IFNwYXJjIG1hZ2ljIG51bWJlciBmb3IgU3BhcmNzLgorCSogY29uZmlnL202OGstbHlueC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUgcmVkdW5kYW50IHZlY3Rvci4KKwkqIGNvbmZpZy9zcGFyYy1seW54Lm10OiBOZXcgZmlsZS4KKwkqIGhvc3RzL2kzODZseW54Lmg6IENvc21ldGljIGltcHJvdmVtZW50cy4KKwkqIGhvc3RzL202OGtseW54Lmg6IEFkZCBpZmRlZnMsICNkZWZpbmUgb2YgY2ZyZWUuCisJKiBob3N0cy9zcGFyY2x5bnguaDogTmV3IGZpbGUuCisKK1RodSBPY3QgMjggMTY6MjM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJZ2NjIC1XYWxsIGxpbnQ6CisJKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBEZWNsYXJlIHJldHVybiB0eXBlLgorCVJlbW92ZSB1c2VsZXNzIHN0YXRlbWVudCBwcm9iYWJseSBsZWZ0IGJ5IGNvZGUgY29weS4KKwkqIGNwdS1pOTYwLmMgKGNvbXBhdGlibGUpOiBGdWxseSBicmFja2V0IG1hdHJpeCBpbml0aWFsaXplci4KKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBVc2UgYmZkX3htYWxsb2MKKwlyYXRoZXIgdGhhbiB4bWFsbG9jLiAgVXNlIHJlYWxsb2MgYW5kIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKKwlyYXRoZXIgdGhhbiB4cmVhbGxvYy4KKwkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBBZGQgc29tZSBjYXN0cy4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW1vdmUgdW51c2VkCisJdmFyaWFibGUuICBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KKwkqIGhwMzAwaHB1eC5jOiBEZWNsYXJlIGFvdXRfMzJfd3JpdGVfc3ltcy4KKwkqIGkzODZic2QuYywgaTM4NmxpbnV4LmMsIG5ldGJzZDM4Ni5jIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUgYXMgMAorCShkZWZpbml0aW9uIGZyb20gYW91dC9hb3V0NjQuaCBpcyBhbHdheXMgMCBhbnlob3cpLgorCSogaTM4Nmx5bnguYyAoc3dhcF9zdGRfcmVsb2NfaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCSogaWVlZS5jIChpZWVlX3dyaXRlX2lkKTogbGVuZ3RoIGNhbiBuZXZlciBiZSBuZWdhdGl2ZS4KKwkocmVhZF9pZCk6IExpa2V3aXNlLgorCShpZWVlX2FyY2hpdmVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCisJKiBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiBEZWNsYXJlLgorCSogbGliY29mZi5oOiBSZWJ1aWx0LgorCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW1vdmUgemVybyBpbml0aWFsaXphdGlvbiBvZgorCXN0YXRpYyBzdHJ1Y3R1cmUuCisJKiByZWxvYzE2LmM6IEluZGVudGF0aW9uIGNoYW5nZS4KKworV2VkIE9jdCAyNyAxNjo1MToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluLCBjb25maWcvaTM4Ni1tYWNoMy5tdDogVXBkYXRlIGZvciBuZXcgY29uZmlndXJhdGlvbgorCSgtLXdpdGgtdGFyZ2V0cwlhbmQgc28gb24pLgorCSogaG9zdHMvaTM4Nm1hY2gzLmg6IERlY2xhcmUgZXJybm8uCisJKiB0YXJnZXRzLmM6IERlY2xhcmUgaTM4Nm1hY2gzX3ZlYy4KKworV2VkIE9jdCAyNyAxMjoxODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4sCisJbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogSGFuZGxlIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0CisJYW5kIHNoYXJlZERlYnVnUmVjb3JkQ291bnQgZmllbGRzLgorCitUdWUgT2N0IDI2IDE2OjIxOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmUgU0NPX0NPUkUuICBPbiBTZXAgMTEgMTk5MywKKwl3ZSBzdGFydGVkIHVzaW5nIHRyYWQtY29yZS5jIGZvciBTQ08gaW5zdGVhZC4KKworCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmUtZW5hYmxlIGdlbmVyaWMgRUxGIGFuZCBOTE0gdGFyZ2V0cy4KKworVHVlIE9jdCAyNiAxNjo1MzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBBbGlnbiBzaF9vZmZzZXQgdG8KKwlzaF9hZGRyYWxpZ24gKHRoaXMgaXMgd2hhdCBVbml4V2FyZSBkb2VzLCBhbmQgaXQgc2hvdWxkbid0IGh1cnQpLgorCitUdWUgT2N0IDI2IDEwOjE2OjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJRnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tIGF0IFV0YWg6CisKKwkqIGVsZjMyLWhwcGEuaCAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBBZGQgcHJvdG90eXBlLgorCShFTEYzMl9IUFBBX1JfQVJHX1JFTE9DKTogUmVuYW1lZCB3aXRob3V0IHRoZSBFTEYzMiBwcmVmaXgKKwlhbmQgbW92ZWQgaW50byBsaWJocHBhLmguICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgorCShFTEYzMl9IUFBBX1JfQ09OU1RBTlQsIEVMRjMyX0hQUEFfUl9BRERFTkQpOiBMaWtld2lzZS4KKwkoZ2V0X29wY29kZSBhbmQgb3Bjb2RlIGRlZmluZXMpOiBNb3ZlIGludG8gbGliaHBwYS5oCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2luc24yZm10KTogUmVuYW1lIGFuZCBtb3ZlIGluZm8KKwlsaWJocHBhLmguCisJKiBsaWJocHBhLmggKEhQUEFfUl8qKTogTW92ZWQgaGVyZS4gIFJlZm9ybWF0dGVkIHNsaWdodGx5IHRvIG1ha2UKKwlmb3IgZWFzaWVyIHJlYWRpbmcuCisJKGdldF9vcGNvZGUpOiBNb3ZlZCBoZXJlLiAgRklYTUUhIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIEMgZnVuY3Rpb24KKwlpbnNpZGUgdGhlIG9wY29kZSBsaWJyYXJ5IQorCShiZmRfaHBwYV9pbnNuMmZtdCk6IExpa2V3aXNlLgorCisJKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBFbmFibGUgZWxmMzItaHBwYSB2ZWN0b3IuCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBBZGQgbmV3IGNvbW1lbnRzCisJYW5kIGNsYXJpZnkgZXhpc3RpbmcgY29tbWVudHMuICBEbyBub3QgdXNlIERFRlVOIHRvIGRlY2xhcmUgdGhpcworCWZ1bmN0aW9uLiAgRml4IG51bWVyb3VzIGluZGVudGlvbiBwcm9ibGVtcy4gIENvcnJlY3RseSBoYW5kbGUgY2FzZXMKKwl3aGVyZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gbWF5IG5lZWQgdG8gYmUgcmVhZCBmcm9tIGRpc2ssIAorCXJlYWQgZnJvbSBtZW1vcnksIG9yIGJ1aWx0IHRoZW4gcmVhZCBmcm9tIG1lbW9yeS4KKworCSogZWxmMzItaHBwYS5oOiBSZWZvcm1hdCB3aXRoIGdudS1pbmRlbnQgYW5kIGhhbmQgZml4IG51bWVyb3VzCisJZm9ybWF0dGluZyBhbmQgaW5kZW50aW9uIHByb2JsZW1zIGdudS1pbmRlbnQgY2FuIG5vdCBoYW5kbGUuCisJQ2xhcmlmeSBzb21lIGNvbW1lbnRzIGFib3V0IHJlbG9jYXRpb24gdHlwZXMuICBDb21tZW50IGJhc2ljCisJcmVsb2NhdGlvbiAiY2xhc3NlcyIuICBHcm91cCBQQVJBTSBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuCisJKEhQUEFfU1hUX3tOVUxMLCBTWU1ORFgsIFJHX1JFTE9DfSk6IE1ha2UgbWVtYmVycyBvZiBhIG5ldyAKKwllbnVtZXJhdGVkIHR5cGUgcmF0aGVyIHRoYW4gI2RlZmluZXMuCisKK1R1ZSBPY3QgMjYgMDI6NDA6NDYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogc29tLmMgKGhwcGFfb2JqZWN0X3NldHVwKTogIFNldCBTRUNfQ09ERSBmb3IgLnRleHQgc2VjdGlvbiBzbworCXRoYXQgR0RCIGNhbiBmaWd1cmUgb3V0IHRleHRfc3RhcnQgYW5kIHRleHRfZW5kLgorCitNb24gT2N0IDI1IDE2OjA1OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUZpeCB1cCB3YXJuaW5ncyBmcm9tIGdjYyAtV2FsbDoKKwkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBVc2UgJWx4IGFuZCBjYXN0IG5fdmFsdWUgdG8KKwl1bnNpZ25lZCBsb25nLiAgVXNlICVsZCBmb3IgdGFnbmR4LiAgVXNlICVseCBmb3Igb2Zmc2V0ICsgdm1hIGFuZAorCWNhc3QgaXQgdG8gdW5zaWduZWQgbG9uZy4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVXNlICVsZC4JCisJKGVjb2ZmX3ByaW50X3N5bWJvbCk6IFVzZSAlbGQsIGFuZCBjYXN0IGluZHggYW5kIHN5bV9iYXNlIHRvIGxvbmcuCisJKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogU3BlY2lmeSByZXR1cm4gdHlwZS4KKworCSogbGliYmZkLmMgKGJmZF93cml0ZSk6IElmIG5vdCBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gb3V0LCBzZXQKKwliZmRfZXJyb3IgdG8gc3lzdGVtX2NhbGxfZXJyb3IuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzCisJbm9uLW5lZ2F0aXZlLCBzZXQgZXJybm8gdG8gRU5PU1BDIChpZiBFTk9TUEMgaXMgZGVmaW5lZCkuCisJKGJmZF9zZWVrKTogSWYgdGhlIHNlZWsgZmFpbHMsIHNldCBiZmRfZXJyb3IgdG8gc3lzdGVtX2NhbGxfZXJyb3IuCisJKGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRm9yIGEgYmFkIG9mZnNldCArIGNvdW50LCBzZXQKKwliZmRfZXJyb3IgdG8gYmFkX3ZhbHVlLgorCSogc2VjbGV0LmMgKHJlbCk6IERvbid0IGFib3J0LiAgSW5zdGVhZCwgcmV0dXJuIGZhbHNlLgorCitNb24gT2N0IDI1IDA5OjU5OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMi4KKworRnJpIE9jdCAyMiAyMDozNTo1NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBtaXBzKi0qIGluc3RlYWQgb2YgbWlwcy0qLCB1c2UgbWlwcyplbAorCSAgaW5zdGVhZCBvZiBtaXBzLSotKmwKKworRnJpIE9jdCAyMiAxNDowMzozMyAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQorCisJKiBtNjhrLWx5bngubXQsIGkzODYtbHlueC5tdCAoVERFRklORVMpOiBzZXQKKwlGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQgYmVjYXVzZSB0aGUgb2JqZHVtcC5jIGRlY2xhcmF0aW9uIG9mCisJZnByaW50ZiBjb2xsaWRlcyB3aXRoIHRoZSBuYXRpdmUgb25lLgorCitGcmkgT2N0IDIyIDExOjUwOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogRW5hYmxlIE1JUFMgRUxGIHZlY3RvcnMuCisKK0ZyaSBPY3QgMjIgMDc6NTE6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IFVzZSBiaWdtaXBzIGZvciBtaXBzLXNvbnktYnNkKi4KKworCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCisKK1RodSBPY3QgMjEgMTI6MTY6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoRklMRV9BTElHTik6IFJlbmFtZWQgZnJvbSBFQUxJR04sIHRvIGF2b2lkIGNvbmZsaWN0CisJd2l0aCBVbHRyaXggaGVhZGVyIGZpbGVzLgorCisJKiBzb20uaCAoc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogUmVuYW1lZCBmcm9tCisJc29tX3NlY3Rpb25fZGF0YSB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1hY3JvIGJ5IHRoYXQgbmFtZS4KKworCUNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSBhdCBVdGFoOgorCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogIFRhcmdldCByZWdpc3RlciBmb3IgYSAnanVtcAorCWluIGRlbGF5IHNsb3QnIG9wdGltaXphdGlvbiBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbG9uZyBjYWxsCisJc3R1YiBzaG91bGQgYWx3YXlzIGJlIHIzMS4KKworCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IFRvIGJlIGNvbnNpc3RlbnQKKwlhY3Jvc3MgYWxsIHJlbG9jYXRpb24gdHlwZXMsIHJldHJpZXZlIGluc3RydWN0aW9uIGFkZGVuZHMgZnJvbQorCXRoZSByZWxvY2F0aW9uIGVudHJ5IHJhdGhlciB0aGFuIGZyb20gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KKworCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IEZpeCBhIHJlbG9jYXRpb24KKwllcnJvciB0aGF0IG9ubHkgb2NjdXJyZWQgd2hlbiB0aGUgYWRkZW5kIG9mIGFuICdhZGRpbCcgb3IKKwknbGRpbCcgd2FzIGxhcmdlciB0aGFuIDIxIGJpdHMgYW5kIHZlcnkgY2xvc2UgdG8gYSAySyBieXRlCisJYm91bmRhcnkuCisKKwkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jKTogIEhhbmRsZSB0aGUgb3B0aW1pemF0aW9uIGluCisJd2hpY2ggYSBqdW1wIGlzIHBsYWNlZCBpbiB0aGUgZGVsYXkgc2xvdCBvZiBhIGZ1bmN0aW9uIGNhbGwuCisJVGhlIGp1bXAgd2FzIGJlaW5nIGFjY29tcGxpc2hlZCB2aWEgYW4gYWRqdXN0bWVudCB0byB0aGUKKwlyZXR1cm4gcG9pbnRlci4gIFRoaXMgb3B0aW1pemF0aW9uIHdvdWxkIGJyZWFrIHRoZSBsb25nIGNhbGwKKwlzdHViIGNvZGUsIGlmIHRoZXJlIHdhcyBhbnkuCisKKwkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBDb3JyZWN0aW9ucworCXRvIGxvbmcgYnJhbmNoIHN0dWJzIHRvIGF2b2lkIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIDIuCisKKwkqIGhwcGFfc3R1YnMuaDogTmV3IHN0dWIgaW5zdHJ1Y3Rpb25zLgorCisJKiBlbGZjb2RlLmg6IERlY2xhcmUgYmZkX2VsZl9maW5kX3NlY3Rpb24uCisKKwkqIHNvbS5oIChzb21fc2VjdGlvbl9kYXRhKTogQWRkIG5ldyAic3Vic3BhY2VfaW5kZXgiIGZpZWxkLgorCisJKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBTYXZlIHRoZSBvcmlnaW5hbCBTT00gc3Vic3BhY2UgaW5kZXgKKwlpbiB0aGUgQkZEIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgc3Vic3BhY2UuICAKKwkoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBJbXBsZW1lbnQuCisJKHNvbV9nZXRfc3ltdGFiKTogSW1wbGVtZW50LgorCShzb21fcHJpbnRfc3ltYm9sKTogSW1wbGVtZW50LgorCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJpbmcgdGFibGUKKwlmcm9tIGEgU09NIG9iamVjdCBmaWxlLgorCShzb21fc2VjdGlvbl9mcm9tX3N1YnNwYWNlX2luZGV4KTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUKKwlzZWN0aW9uIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgU09NIHN1YnNwYWNlIGluZGV4LgorCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgdGhlIHN5bWJvbAorCXRhYmxlIGZyb20gYSBTT00gb2JqZWN0IGZpbGUuCisJKHNvbV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfemFsbG9jLgorCShzb21fbmV3X3NlY3Rpb25faG9vayk6IEluaXRpYWxpemUgc3Vic3BhY2VfaW5kZXggZmllbGQgdG8KKwktMSBpbnN0ZWFkIG9mIDAuCisKKwkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogRml4IHBvbGFyaXR5IG9mIHRlc3QgdG8gc2V0IEhBU19SRUxPQy4KKwlTZXQgRVhFQ19QIGZvciBleGVjdXRhYmxlcy4KKwkoc2V0dXBfc2VjdGlvbnMpOiBDb3JyZWN0bHkgaWRlbnRpZnkgd2hlbiBhIHNlY3Rpb24gaGFzCisJcmVsb2NhdGlvbnMuCisJKGxvZzIpOiBOZXcgZnVuY3Rpb24uCisJKHNldHVwX3NlY3Rpb25zKTogQ29ycmVjdGx5IGNvbnZlcnQgYmV0d2VlbiBTT00gYWxpZ25tZW50cyBhbmQgQkZECisJYWxpZ25tZW50cy4KKworCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG8gbm90IHNldCBTRUNfQUxMT0Mgb3IgU0VDX0xPQUQKKwlmb3Igc2VjdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byBTT00gc3BhY2VzLCBkb2luZyBzbyBjb25mdXNlcworCW1hbnkgdXRpbGl0aWVzLiAgU2V0IGFzc29ydGVkIFNFQ18qIGZsYWdzIGZvciBTT00gc3Vic3BhY2VzCisJd2hpY2ggY29ycmVzcG9uZCB0byBCRkQgc2VjdGlvbnMuCisKKwkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogVGhlIHN0YWIKKwlzdHJpbmcgdGFibGUgc2hvdWxkIGhhdmUgc2hfdHlwZSA9PSBTSFRfU1RSVEFCLiAgQWRkCisJcHJvY2Vzc2luZyB0byBtYWtlIGl0IHNvLgorCisJKiBlbGZjb2RlLmg6IChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdHJpbmcgdGFibGVzIChvdGhlcgorCXRoYW4gLnN0cnRhYikgd2VyZSBub3QgZ2V0dGluZyB0aGUgZmlsZSBvZmZzZXRzIHJlY29yZGVkLCBzbworCXRoZXkgY291bGQgbm90IGJlIHJlYWQgZnJvbSBkaXNrLgorCisJKiBlbGZjb2RlLmg6IChlbGZfbWFrZV9zZWN0aW9ucyk6ICBMZWF2ZSB0aGUgc2hfYWRkciBmaWVsZCBvZgorCXRoZSBzZWN0aW9uIGhlYWRlciBhbmQgdGhlIHZtYSBmaWVsZCBvZiBhIHNlY3Rpb24gYXQgMCBpZiB0aGUKKwlzZWN0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbiBpbWFnZS4gKGUuZy4sCisJLnN0YWIpCisKKwkqIHNvbS5baGNdOiBDaGFuZ2UgdGFyZ2V0IHZlY3RvciBwcmVmaXggZnJvbSAiaHBwYSIgdG8gInNvbSIuCisJQ29uc2lzdGVudGx5IHVzZSBvYmpfc29tIHByZWZpeCB0byBhY2Nlc3MgZmllbGRzIGluIGJhY2tlbmQgZGF0YQorCXN0cnVjdHVyZXMuICBGaXggYWxsIGNhbGxlcnMvcmVmZXJlbmNlcy4KKworCSogc29tLmg6IERvIG5vdCBpbmNsdWRlIGZpbGVzIG9ubHkgbmVlZGVkIGZvciBjb3JlIGZpbGUgcmVhZGluZyBoZXJlLgorCUluY2x1ZGUgYS5vdXQgZm9yIGJvdGggSE9TVF9IUFBBSFBVWCBhbmQgSE9TVF9IUFBBQlNELiAgRGVsZXRlCisJZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLCB0aGV5IGFyZSB1bm5lY2Vzc2FyeS4KKwkoc3RydWN0IHNvbWRhdGEpOiBEZWxldGUgYXV4X2hkciwgYW5kIGhwX3N5bWJvbF9lbnRyeV9zaXplIGZpZWxkcy4KKwlDaGFuZ2UgInN5bWJvbHMiIHRvICJzeW10YWIiLiAgQWRkICJzdHJpbmd0YWIiIGFuZCAicmVsb2NfZmlsZXBvcyIKKwlmaWVsZHMgZm9yIGZ1dHVyZSB1c2UuICBDaGFuZ2Ugb2JqX3NvbV8qIG1hY3JvcyBhcyBhcHByb3ByaWF0ZS4KKwkoc29tX3NlY3Rpb25fZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8ga2VlcCBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24KKwlhYm91dCBCRkQgc2VjdGlvbnMgKGZvciBmdXR1cmUgdXNlKS4KKworCSogc29tLmM6IFByb3ZpZGUgUEFSQU1TIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGZ1bmN0aW9ucyBjdXJyZW50bHkKKwlpbiB0aGlzIGZpbGUuCisJKHN0cnVjdCBjb250YWluZXIpOiBEZWxldGUgdW53YW50ZWQgc3RydWN0dXJlIGRlZmluaXRpb24uCisJKHNvbV9vYmplY3Rfc2V0dXApOiBBZGQgY29tbWVudHMuICBVc2Ugc29tX21rb2JqZWN0IHRvIGFsbG9jYXRlCisJU09NIHNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZSBCRkQ7IHVzZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQorCWZpbGUgYW5kIChwb3NzaWJseSBlbXB0eSkgYXV4aWxpYXJ5IGhlYWRlcnMgdG8gaW5pdGlhbGl6ZSB0aGlzCisJaW5mb3JtYXRpb24uICBEZWxldGUgcmVkdW5kYW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICJjYWxscyIuCisJKHNldHVwX3NlY3Rpb25zKTogUmV0dXJuIHR5cGUgaXMgbm93IGJvb2xlYW4sIGZpeCByZXR1cm4gc3RhdGVtZW50cy4KKwkiRml4IiBoYW5kbGluZyBvZiBCU1MgbGlrZSBzdWJzcGFjZXMgaW4gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZQorCWNvbnRhaW5pbmcgc3BhY2UncyBzaXplLiAgSWYgdGhlIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucywgc2V0IHRoZQorCWFwcHJvcHJpYXRlIEJGRCBzZWN0aW9uIGZsYWdzIGFuZCByZWNvcmQgdGhlIGluZGV4IGludG8gYW5kIHRoZQorCXNpemUgb2YgdGhlIGZpeHVwIHN0cmVhbS4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKwkoc29tX29iamVjdF9wKTogU2V0IGJmZF9lcnJvciBhcHByb3ByaWF0ZWx5IGlmIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKwlmcm9tIGJmZF97cmVhZCxzZWVrfSBmdW5jdGlvbnMuICBIYW5kbGUgRVhFQ0xJQk1BR0lDIHR5cGUgZmlsZXMuCisJRG8gbm90IHRyeSB0byByZWFkIGEgbm9uLWV4aXN0YW50IGF1eGlsaWFyeSBoZWFkZXIuCisJKHNvbV9ta29iamVjdCk6IEZsZXNoIG91dC4KKwkoc29tX3NlY3Rpb25faG9vayk6IEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uCisJYWJvdXQgc2VjdGlvbnMuCisKK1RodSBPY3QgMjEgMTI6NDE6MzQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlnY2MgLVdhbGwgbGludDoKKwkqIGNvZmYtaDgzMDAuYywgY29mZmNvZGUuaDogQ2hhbmdlIHNocmluayBwYXJhbWV0ZXIKKwlpbiAqX3JlbG9jMTZfZXN0aW1hdGUgdG8gdW5zaWduZWQgdG8gbWF0Y2ggcHJvdG90eXBlLgorCSogYXJjaGl2ZS5jOiBBdm9pZCAiLyoiIGluIGNvbW1lbnQuCisKK1RodSBPY3QgMjEgMTM6MDU6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBkZXAtaW4uc2VkOiBDcmVhdGUgb3VyIG93biBsaW5lIGJyZWFrcyBmb3IgYSBtb3JlIGFlc3RoZXRpYworCU1ha2VmaWxlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgorCisJKiBlbGYzMi1taXBzLmM6IEluY2x1ZGUgInNlY2xldC5oIi4KKwkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IEZvcmNlIHNpemUgb2YgLnJlZ2luZm8gc2VjdGlvbiB0byBzaXplb2YKKwlFbGYzMl9FeHRlcm5hbF9SZWdJbmZvLgorCShtaXBzX2VsZl9zZWNsZXRfbGluayk6IE5ldyBmdW5jdGlvbi4gIExpbmsgdGhlIC5yZWdpbmZvIHNlY3Rpb24KKwlzcGVjaWFsbHksIGFuZCBwYXNzIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUgZ2VuZXJpYyByb3V0aW5lLgorCShiZmRfZWxmMzJfYmZkX3NlY2xldF9saW5rKTogRGVmaW5lIG1hY3JvLgorCSogZWxmMzItdGFyZ2V0Lmg6IElmIGJmZF9lbGYzMl9iZmRfc2VjbGV0X2xpbmsgaXMgYWxyZWFkeSBkZWZpbmVkLAorCWRvbid0IG92ZXJyaWRlIGl0LgorCitXZWQgT2N0IDIwIDEyOjIyOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBzaWduYXR1cmUgZmllbGQuCisJKG5sbV9zaWduYXR1cmUpOiBOZXcgbWFjcm8uCisJKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCwgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSB0aGUgTkxNCisJc2lnbmF0dXJlIGZyb20gdGhlIGJhY2tlbmQgcmF0aGVyIHRoYW4gdGhlIGNvbnN0YW50IE5MTV9TSUdOQVRVUkUuCisJKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCk6IEluaXRpYWxpemUgc2lnbmF0dXJlIGZpZWxkLgorCisJKiBhb3V0ZjEuaCAoTUFDSFRZUEVfT0spOiBBY2NlcHQgTV9VTktOT1dOLgorCShOQU1FKHN1bm9zLHNldF9hcmNoX21hY2gpKTogVHJlYXQgTV9VTktOT1dOIGFzIDY4MDAwLCBub3QgNjgwMjAuCisKK1dlZCBPY3QgMjAgMTA6Mjg6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2kzODZic2QuaCBbX19ic2RpX19dOiBEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIuCisKK1dlZCBPY3QgMjAgMTA6MTA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBOZXcgdmFyaWFibGUsIGZvciB1c2UgaW4gIm1ha2UgZGVwIi4KKwkoLmRlcCk6IERlcGVuZCBvbiAkKENGSUxFUykgYW5kICQoSEZJTEVTKS4gIERlbGV0ZSAuZGVwMSBhbmQKKwlyZW1ha2UgaXQsIHNvIHRoYXQgIiQ/IiBpcyBjb21wbGV0ZS4KKwkoLmRlcDEpOiBEb24ndCBuZWVkIHRvIHJlbW92ZSAuZGVwMSBmaXJzdC4KKwkoZGVwLnNlZCk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLCBub3QgTWFrZWZpbGUuCisJKENGSUxFUyk6IEFkZCBubG0uYy4KKworVHVlIE9jdCAxOSAxNToyNjoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvZmYtYWxwaGEuYzogSW1wbGVtZW50ZWQgcmVsb2MgaGFuZGxpbmcgZm9yIHRoZSBsaW5rZXIsIG1hZGUKKwl2YXJpb3VzIG90aGVyIHJlbGF0ZWQgY2hhbmdlcy4KKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIHJkYXRhX2luX3RleHQgZmllbGQuCisJUmVuYW1lZCBmaW5pc2hfcmVsb2MgdG8gYWRqdXN0X3JlbG9jX2luLiAgQWRkZWQgYWRqdXN0X3JlbG9jX291dAorCWZpZWxkLgorCShlY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZGVmaW5lLgorCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MsIGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKToKKwlIYW5kbGUgLmxpdGEgc2VjdGlvbi4KKwkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9GSU5JLgorCWZpbmlzaF9yZWxvYyBiYWNrZW5kIGZpZWxkIHJlbmFtZWQgdG8gYWRqdXN0X3JlbG9jX2luLgorCShlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBBZGp1c3QgbnVtYmVyIG9mIGF1eCBlbnRyaWVzIHRvCisJZGVidWdfYWxpZ24gYm91bmRhcnkuCisJKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIHJkYXRhX2luX3RleHQgcHV0CisJLnJkYXRhIHNlY3Rpb24gaW4gdGV4dCBzZWdtZW50LCBub3QgZGF0YSBzZWdtZW50LiAgUHV0IC5wZGF0YQorCXNlY3Rpb24gaW4gdGV4dCBzZWdtZW50LgorCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIEFsc28sIGNhbGwKKwlhZGp1c3RfcmVsb2Nfb3V0LCBhbmQgaGFuZGxlIC5saXRhLCAueGRhdGEsIC5wZGF0YSwgLmZpbmkgYW5kCisJYWJzb2x1dGUgc2VjdGlvbnMgd2hlbiB3cml0aW5nIG91dCByZWxvY3MuCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgQUxQSEFFQ09GRiwgb3V0cHV0IDIgZm9yCisJYmxkcmV2IGZpZWxkLCBhcyBvbiBBbHBoYSBPU0YvMS4gIFBhZGRpbmcgZmllbGQgaXMgbm93IDIgYnl0ZXMuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IEFkZGVkIGFzc2VydGlvbi4KKwkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBSZW5hbWVkIGZyb20gbWlwc19maW5pc2hfcmVsb2MuCisJKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IE5ldyBmdW5jdGlvbiAoZG9lcyBub3RoaW5nKS4KKwkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCisJKGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGlvbl9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIHRvIGJlCisJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkZWQgY2FzdHMgdG8gYXZvaWQgQWxwaGEKKwlPU0YvMSBjYyBidWcuCisKK1RodSBPY3QgMTQgMDE6MTA6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGNvbW1lbnRzIGF0dGVtcHRpbmcgdG8KKwlleHBsYWluIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgorCisJKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IERvbid0IHNldCBTRUNfREVCVUdHSU5HIHVudGlsIGl0CisJaXMgbWFkZSB0byB3b3JrLgorCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJlbW92ZSBjaGVjayBmb3IKKwlVU0VfRElTQ0FSREVEX1NFQ1RJT05TX0NPVU5ULgorCSogY29mZi1pMzg2LmM6IERvbid0IGRlZmluZSBVU0VfRElTQ0FSREVEX1NFQ1RJT05TX0NPVU5ULiAgQmFzaW5nCisJaXQgb24gaG9zdCBkZWZpbmVzIGlzIHdyb25nLgorCisJKiBlY29mZi5jIChlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBEb24ndCBsaW5rIGEgLnJlZ2luZm8gc2VjdGlvbi4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgcmVxdWlyZSB0aGUgLnJlZ2luZm8gc2VjdGlvbgorCXRvIGJlIGEgcGFydGljdWxhciBzaXplLgorCitXZWQgT2N0IDEzIDE4OjM5OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRlcC1pbik6IE5ldyBydWxlLCBmb3IgZWRpdGluZyBkZXBlbmRlbmNpZXMgaW50bworCU1ha2VmaWxlLmluIGluICQoc3JjZGlyKS4gIFVzZSBtb3ZlLWlmLWNoYW5nZS4KKwkoLmRlcDEsIGRlcCk6IFVzZSBtb3ZlLWlmLWNoYW5nZS4KKwkoQ0ZJTEVTKTogQWRkIGNvZmYtYXBvbGxvLmMuCisKKwlTdW4gT2N0IDEwIDE4OjAyOjU2IDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LkVEVS5BVSkKKworCSogTWFrZWZpbGUuaW46IFJlY29nbmlzZSBuZXcgZmlsZSwgY29mZi1hcG9sbG8ubworCisJKiBjb2ZmLWFwb2xsby5jOiBOZXcgZmlsZQorCisJKiBjb2ZmY29kZS5oOiBSZWNvZ25pc2UgYXBvbGxvIG1hZ2ljIG51bWJlcnMgYW5kIHdyaXRhYmxlIHRleHQKKworCSogY29mZnN3YXAuaDogU3dhcCBBcG9sbG8gb3B0aW9uYWwgaGVhZGVyIGVudHJpZXMKKworCSogY29uZmlnLmJmZDogQWRkIGxpbmUgZm9yIEFwb2xsbworCisJKiBjb25maWd1cmUuaG9zdDogUmVwbGFjZSBhcG9sbG82OGIgYW5kIGFwb2xsbzY4diB3aXRoIEFwb2xsbworCisJKiBjb25maWd1cmUuaW46IFJlY29nbmlzZSBhcG9sbG9jb2ZmX3ZlYworCisJKiB0YXJnZXRzLmM6IExpa2V3aXNlCisKKwkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9hcG9sbG8ubXQ6IE5ldyBmaWxlcworCisJKiBob3N0cy9hcG9sbG82OC5oOiBSZW1vdmUgaW5jbHVzaW9uIG9mIHN0cmluZ3MuaAorCitXZWQgT2N0IDEzIDE0OjI4OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IE5vdyBzdGF0aWMuCisKKwkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KKwkoLmRlcCwgLmRlcDEsIGRlcC5zZWQpOiBOZXcgdGFyZ2V0cywgdG8gbWFrZSAibWFrZSBkZXAiIHdvcmsKKwliZXR0ZXIuCisJKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KKworCSogbTY4a2x5bngtY2YuYyAoT05MWV9ERUNMQVJFX1JFTE9DUyk6IERlZmluZSwgdG8gYXZvaWQgbmFtZQorCWNvbmZsaWN0cyB3aGVuICItLXdpdGgtdGFyZ2V0cz1hbGwiLgorCSogY29mZi1tNjhrLmMgKG02OGtjb2ZmX2hvd3RvX3RhYmxlLCBtNjhrX3J0eXBlMmhvd3RvLAorCW02OGtfaG93dG8ycnR5cGUpOiBSZW5hbWUgdmlhIG1hY3JvcyB0byBrZWVwIG5hbWVzcGFjZSBjbGVhbi4KKwkqIGNvbmZpZ3VyZS5pbjogRm9yIG02OGtseW54X2NvZmZfdmVjLCBpbmNsdWRlIGNvZmYtbTY4ay5vIGZvcgorCW5vdy4KKworVHVlIE9jdCAxMiAxNzowMzoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBkbyByZWxvY2F0aW9ucyBhbmQgdG8KKwloYW5kbGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucy4KKwkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogUGFzcyBmb3VydGggYXJndW1lbnQgdG8KKwllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gdG8gcGVybWl0IGl0IHRvIGNvbnRyb2wgdGhlCisJc2VjdGlvbiBpbmRleCB0byB1c2UuCisJKGVsZl9vYmpfdGRhdGEpOiBBZGQgZ3AgYW5kIGdwX3NpemUgZmllbGRzLgorCShlbGZfZ3AsIGVsZl9ncF9zaXplKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KKwkqIGVsZmNvZGUuaDogUmVtb3ZlZCBhIG51bWJlciBvZiB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgorCShlbGZfZmFrZV9zZWN0aW9ucyk6IENsZWFyIHNlY3Rpb24gaGVhZGVyIGJlZm9yZSBjYWxsaW5nCisJZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywgbm90IGFmdGVyLgorCShwcmVwX2hlYWRlcnMpOiBSZXR1cm4gdHJ1ZSBhdCBlbmQuCisJKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBQYXNzIHJldHZhbCBhcmd1bWVudCB0bworCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbi4KKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6CisJQWNjZXB0IGFuZCBpZ25vcmUgbmV3IHJldHZhbCBhcmd1bWVudC4KKwkqIGJmZC5jOiBJbmNsdWRlIGxpYmVsZi5oLgorCShiZmRfc2V0X2dwX3NpemUpOiBIYW5kbGUgRUxGIHRhcmdldHMuCisJKiBNYWtlZmlsZS5pbiAoYmZkLm8pOiBEZXBlbmRzIHVwb24gbGliZWxmLmguCisJKGVsZjMyLW1pcHMubyk6IERlcGVuZHMgdXBvbiAkKElOQ0RJUikvZWxmL21pcHMuaC4KKworTW9uIE9jdCAxMSAxNzoyNToxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogQ2hlY2sgYmZkX21ha2Vfc2VjdGlvbiByZXR1cm4gdmFsdWUuCisJKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBOZXcgZnVuY3Rpb24uCisJKGVjb2ZmX25ld19zZWN0aW9uX2hvb2ssIGVjb2ZmX3NpemVvZl9oZWFkZXJzLAorCWVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMsCisJZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGR1bW15IFJFR0lORk8gc2VjdGlvbi4KKwkoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIHJlYWRpbmcKKwlSRUdJTkZPIHNlY3Rpb24uCisJKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBmcm9tIG1hY3JvCisJZGVmaW5pdGlvbiB0byBmdW5jdGlvbiBwcm90b3R5cGUuCisJKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBOZXcgcHJvdG90eXBlLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogUmVtb3ZlZC4KKwkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIGVjb2ZmX21rb2JqZWN0X2hvb2suCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9ta29iamVjdF9ob29rKTogUmVtb3ZlZC4KKwkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgZWNvZmZfbWtvYmplY3RfaG9vay4KKworRnJpIE9jdCAgOCAxNToyNTozMyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGxpYmJmZC5jIChiZmRfZ2V0KjMyLCBiZmRfZ2V0KjY0KTogIFByZXZlbnQgQU5TSSBzaWduIGV4dGVuc2lvbgorCWJ5IGNhc3RpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSB0byBiZmRfdm1hLgorCitGcmkgT2N0ICA4IDAyOjM0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlndXJlLmluOiAgRG8gbm90IGRlZmluZSBTRUxFQ1RfVkVDUywgU0VMRUNUX0FSQ0hJVEVDVFVSRVMKKwlpZiBjb25maWd1cmluZyAtLXdpdGgtdGFyZ2V0cz1hbGwuCisKK1RodSBPY3QgIDcgMTc6MzQ6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiBDb3JyZWN0IHRoZSAic2l6ZSIgZmllbGQgaW4gc29tZQorCWVudHJpZXMuCisKKwkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBDaGFuZ2UgZG9jdW1lbnRhdGlvbiB0byBkaXNwZWwgYW55CisJbm90aW9uIHRoYXQgdGhlICJzaXplIiBmaWVsZCBpcyBhIHBvd2VyLW9mLXR3byBpbmRpY2F0b3IuCisKK1RodSBPY3QgIDcgMTA6NTA6MzggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworICAgICAgICogY29mZnN3YXAuaDogKGJmZF9zd2FwX3JlbG9jX2luKTogYSBzeW1uZHggaXMgc2lnbmVkLgorCisJTWFrZSBzdXBwb3J0IGZvciByZWxheGluZyBtb3JlIGdlbmVyaWMuCisJKiByZWxvYzE2LmM6IEFkZCBuZXcgdGFyZ2V0IGVudHJ5IC0gYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKKwlmaXggYml0IHJvdC4KKwkqIGxpYmNvZmYuaCwgbGliY29mZi1pbi5oOiBkZWNsYXJhdGlvbnMuIFByb3RvdHlwZXMKKwkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogQWRkIGNhbGxzIHRvCisJY29mZl9yZWxvY18xNl9leHRyYV9jYXNlcyBhbmQgY29mZl9yZWxvYzE2X2VzdGltYXRlLgorCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogTmV3IGZ1bmN0aW9uLgorCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogTmV3IGZ1bmN0aW9uCisKK1RodSBPY3QgIDcgMTQ6MjQ6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKEVBTElHTik6IERlZmluZSwgZGVwZW5kZW50IG9uIEFSQ0hfU0laRS4KKwkoYWxpZ25fZmlsZV9wb3NpdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoZWxmX2xvY2F0ZV9zaCk6IERpc2FibGVkIGZ1bmN0aW9uIGRlbGV0ZWQuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogQWxpZ24gcG9zaXRpb24sCisJdGhlbiBwbGFjZSBzeW10YWIsIHRoZW4gZG8gb3RoZXIgc2VjdGlvbnMuCisJKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQWxpZ24gcHJvZ3JhbSBoZWFkZXIuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gc2VjdGlvbiBoZWFkZXJzLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IEFsaWduIHJlbG9jYXRpb24gc2VjdGlvbnMuCisKK1R1ZSBPY3QgIDUgMTA6NDQ6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgorCUNoYW5nZSBvdGhlciBocHBhIGVudHJpZXMgdG8gdXNlIC0qLSBub3QgLWhwLS4KKwkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCisKKwkqIGNvZmYtcnM2MDAwLmMsIGNwdS1yczYwMDAuYywgcnM2MDAwLWNvcmUuYzogQ2hhbmdlIG5vbi1BU0NJSQorCWNoYXJhY3RlcnMgaW4gY29tbWVudCB0byBvY3RhbCBlc2NhcGVzLgorCitTdW4gT2N0ICAzIDEyOjM1OjE1IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogY29mZi1pMzg2bHlueC5jOiBSZW1vdmVkLCBuYW1lIHRvbyBsb25nLgorCSogaTM4Nmx5bngtY2YuYzogTmV3IGZpbGUsIHdhcyBjb2ZmLWkzODZseW54LmMuCisJKiBjb25maWd1cmUuaW46IFJlZmxlY3QgZmlsZSBuYW1lIGNoYW5nZXMuCisJKiBNYWtlZmlsZS5pbjogTWVudGlvbiBMeW54LXJlbGF0ZWQgZmlsZXMuCisKKwkqIGkzODZseW54LmMgKGx5bnhfMzJfc3dhcF9leHRfcmVsb2NfaW4pOiBnZXQgcmVsb2MgYml0cyBpbiBpMzg2CisJTHlueC1zcGVjaWZpYyB3YXkuCisKKwkqIG02OGtseW54LWNmLmM6IE5ldyBmaWxlLCBkZWZpbmVzIGNvZmYgZm9ybWF0IGZvciBNNjhLIEx5bnhPUy4KKwkqIG02OGtseW54LmM6IFJlbW92ZSBjb2ZmIHZlY3RvciBkZWZpbml0aW9uLCBub3cgaW4gbTY4a2x5bngtY2YuYy4KKworCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgc2VjdGlvbiBmbGFnIHRvIFNUWVBfSU5GTworCWZvciAuc3RhYiwgLnN0YWJzdHIgYW5kIC5kZWJ1ZyBzZWN0aW9ucywgYW5kIHNldCBTRUNfREVCVUdHSU5HIGZvcgorCXNlY3Rpb25zIG9mIHR5cGUgU1RZUF9JTkZPLiAgKGZyb20gTWluaCBUcmFuLUxlKQorCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBkaXNjYXJkZWRfc2VjdGlvbnNfY291bnQKKwl0byBhYmZkLT5zZWN0aW9uX2NvdW50LCB3aGljaCBoZWxwcyBgc3RyaXAnIGtlZXAgdGhlIHNpemUKKwlvZiB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgY29uc3RhbnQuCisJKiBjb2ZmLWkzODYuYyAoZGlzY2FyZGVkX3NlY3Rpb25zX2NvdW50KTogTmV3IHZhcmlhYmxlLCBpbml0aWFsaXplZAorCXRvIHplcm8uICBGb3IgdXNlIGJ5IGBzdHJpcCcuICBDdXJyZW50bHkgYmVpbmcgdXNlZCBvbmx5IGluIGFpeDM4NgorCWNvZmYsIGJ1dCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlciBjb2ZmIHN5c3RlbXMuICAoZnJvbSBNaW5oIFRyYW4tTGUpCisKKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IEFkZGVkIGEgbWlzc2luZyBjYXN0LgorCisJKiBhcmNoaXZlLmM6IENvc21ldGljIGltcHJvdmVtZW50cy4KKwkqIG9wbmNscy5jOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCisJKG5ld19iZmQpOiBSZW1vdmVkIHJlZHVuZGFudCBzdHJ1Y3R1cmUgc2xvdCBpbml0LgorCitTYXQgT2N0ICAyIDE4OjQ4OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbmV3cy1taXBzLm1oLCBob3N0cy9uZXdzLW1pcHMuaDogTmV3IGZpbGVzLgorCSogY29uZmlndXJlLmhvc3Q6IFVzZSBuZXdzLW1pcHMgZm9yIG1pcHMtc29ueS1ic2QqLgorCitGcmkgT2N0ICAxIDEzOjE0OjE3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBpMzg2bHlueF9jb2ZmX3ZlYyByZXF1aXJlcyBjb2ZmLWkzODZseW54Lm8uCisJKiBjb2ZmLWkzODZseW54LmM6IE5ldyBmaWxlLCBkZWZpbmVzIEx5bnggdGFyZ2V0IHZlY3RvciBhbmQgbmFtZSwKKwlpbmNsdWRlcyBjb2ZmLWkzODYuYy4KKwkqIGNvZmYtaTM4Ni5jIChpMzg2Y29mZl92ZWMpOiBBbGxvdyByZWRlZmluaXRpb24gb2YgdGFyZ2V0IHZlY3RvcgorCXN5bWJvbCBhbmQgbmFtZSwgaWYgVEFSR0VUX1NZTSBhbmQvb3IgVEFSR0VUX05BTUUgYXJlIGRlZmluZWQuCisJKiBpMzg2bHlueC5jOiBSZW1vdmUgY29mZiB2ZWN0b3IgZGVmaW5pdGlvbiBlbnRpcmVseS4KKwkobHlueF8zMl9zd2FwX2V4dF9yZWxvY19pbik6IERlZmluZS4KKwkobHlueF8zMl9zd2FwX3N0ZF9yZWxvY19pbik6IERlZmluZSwgZ2V0IHJlbG9jIGJpdHMgaW4gaTM4NgorCUx5bngtc3BlY2lmaWMgd2F5LgorCShseW54XzMyX3N3YXBfZXh0X3JlbG9jX291dCk6IERlZmluZS4KKwkobHlueF8zMl9zd2FwX3N0ZF9yZWxvY19vdXQpOiBEZWZpbmUuCisJKGx5bnhfMzJfc2x1cnBfcmVsb2NfdGFibGUpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCisJKGx5bnhfMzJfc3F1aXJ0X291dF9yZWxvY3MpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCisJKGx5bnhfMzJfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgorCShXUklURV9IRUFERVJTKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgorCisJKiBjb25maWcvaTM4Ni1seW54Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZSByZWR1bmRhbnQgdmVjdG9yLgorCitUaHUgU2VwIDMwIDE3OjUwOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCBsaW5rYWdlLXRhYmxlIHJlbGF0aXZlCisJcmVsb2NhdGlvbnMgb2Ygc2l6ZSA4LCAxNiwgMzIuICBTb3J0IGdlbmVyaWMgcmVsb2NzIGJ5IHR5cGUgcmF0aGVyCisJdGhhbiBzaXplLiAgQWRkZWQgYSBsaXR0bGUgZG9jdW1lbnRhdGlvbiB0b28uCisKKwkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6IEFkZCBCQVNFMTYgYW5kIEJBU0UzMiByZWxvY3MuCisJKFRBQkxFX1NJWkUpOiBOZXcgbWFjcm8uCisJKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ197MTYsMzJ9X0JBU0VSRUwgZm9yIHN0ZAorCXJlbG9jcy4KKwkoc3dhcF9zdGRfcmVsb2Nfb3V0KTogV3JpdGUgYmFzZXJlbCByZWxvY3MgY29ycmVjdGx5LgorCShzd2FwX3N0ZF9yZWxvY19pbik6IEhhbmRsZSByX2Jhc2VyZWwgZmllbGQuICBBc3NlcnQgdGhhdAorCXJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUgZmllbGRzIGFyZSBjbGVhciwgYW5kIHRoYXQgdGhlIGNvbXB1dGVkCisJaW5kZXggZG9lcyByZWZlciB0byBhIGRlZmluZWQgZW50cnkgb2YgdGhlIGhvd3RvIHRhYmxlLgorCitUdWUgU2VwIDI4IDE0OjQ3OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogTmV3IGZ1bmN0aW9uLgorCSogc2VjdGlvbi5jOiBDaGFuZ2UgY29tbWVudHMgdG8gc2F5IHNldmVyYWwgc2VjdGlvbnMgY2FuIGhhdmUKKwl0aGUgc2FtZSBuYW1lLgorCSogYmZkLWluMi5oOiBSZS1nZW5lcmF0ZSB0byByZWZsZWN0IGFib3ZlIGNoYW5nZS4KKwkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogQ2FsbCBiZmRfbWFrZV9zZWN0aW9uX2FueXdheQorCWlmIHN0aWxsIG5vIHNlY3Rpb24gYWZ0ZXIgdGhlIGJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgorCSogY29mZmNvZGUuaDogQWRkIGNvbW1lbnQgYWJvdXQgVFdPX0RBVEFfU0VDUy4KKworVHVlIFNlcCAyOCAwMzoyMjoyNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiAgQWx3YXlzIGRldGVybWluZSByYXdfc2l6ZQorCWV4cGxpY2l0bHkuCisJKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncywgZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlCisJLmZpbmkgc2VjdGlvbi4KKworTW9uIFNlcCAyNyAxODoyOToxOCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQgY29uZmlndXJlLmhvc3Q6IE1hdGNoIG9uICotbHlueG9zKiBmb3IgTHlueE9TLAorCWFkZCBtNjgqLSotbHlueG9zKi4KKwkqIGNvbmZpZ3VyZS5pbiA6IFJlcGxhY2VkIGkzODZseW54X3ZlYyB3aXRoIGkzODZseW54X2FvdXRfdmVjCisJYW5kIGkzODZseW54X2NvZmZfdmVjLgorCUFkZGVkIG02OGtseW54X2FvdXRfdmVjIGFuZCBtNjhrbHlueF9jb2ZmX3ZlYy4KKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgaTM4Nmx5bnhfdmVjLCBhZGRlZAorCXtpMzg2LG02OGt9bHlueF97YW91dCxjb2ZmfV92ZWMuCisJKiBpMzg2bHlueC5jOiBBZGRlZCBjb3B5IG9mIGkzODZjb2ZmLmMsIHJlbmFtZWQgYmZkIHRhcmdldCB0bworCWkzODZseW54X2NvZmZfdmVjLgorCSogbTY4a2x5bnguYzogTmV3IGZpbGUuCisJKiBjb25maWcvaTM4Ni1seW54Lm10OiBSZXBsYWNlZCBpMzg2bHlueF92ZWMgd2l0aCBpMzg2bHlueF9hb3V0X3ZlYworCWFuZCBpMzg2bHlueF9jb2ZmX3ZlYy4KKwkqIGNvbmZpZy9tNjhrLWx5bngubXQ6IE5ldyBmaWxlLgorCSogaG9zdHMvaTM4Nmx5bnguaDogQWRkZWQgZGVmaW5pdGlvbiBvZiBjZnJlZSBhcyBmcmVlIChmcm9tIEVpY2hpbikuCisJKiBob3N0cy9tNjhrbHlueC5oOiBOZXcgZmlsZS4KKworTW9uIFNlcCAyNyAxODowMDo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jOiBEZWZpbmUgb2Zmc2V0b2YgaGVyZS4KKwkqIGhvc3RzLyouaDogRG9uJ3QgZGVmaW5lIGl0IGhlcmUuCisKK01vbiBTZXAgMjcgMTk6MDk6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFNldCBmaWxlcG9zIGZvciBTSFRfU1RSVEFCCisJc2VjdGlvbi4KKworRnJpIFNlcCAyNCAxNTo0Nzo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaHB1eC1jb3JlLmM6IEFkZCBjb21tZW50IGFib3V0IGhwdXggdmVyc2lvbiA3LgorCitGcmkgU2VwIDI0IDE2OjUwOjI2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogIENoYW5nZSBwZXItdGhyZWFkIHJlZ2lzdGVyCisJc2VjdGlvbiBuYW1lcyBmcm9tIC5yZWdYWFggdG8gLnJlZy9YWFggdG8gYXZvaWQgcGFyc2luZyBhbWJpZ3VpdHkKKwlpbiBnZGIvY29yZWxvdy5jLiAgQ3JlYXRlIGFsaWFzIC5yZWcgc2VjdGlvbiBmb3IgdGhlIGN1cnJlbnRseQorCXJ1bm5pbmcgdGhyZWFkLgorCitGcmkgU2VwIDI0IDEzOjIyOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBiaWdfbWFnaWMgYW5kCisJbGl0dGxlX21hZ2ljIGZpZWxkcy4KKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBpbml0aWFsaXphdGlvbgorCW9mIGJpZ19tYWdpYyBhbmQgbGl0dGxlX21hZ2ljLgorCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rKTogTWFrZSBzdXJlIG1hZ2ljIG51bWJlcgorCW1hdGNoZXMgZW5kaWFuZXNzIG9mIGJmZC4KKwkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGluaXRpYWxpemF0aW9uIG9mIGJpZ19tYWdpYyBhbmQKKwlsaXR0bGVfbWFnaWMuCisJKiBlY29mZi5jIChlY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBTZXQgTUlQUyBtYWNoaW5lIG51bWJlcgorCWJhc2VkIG9uIG1hZ2ljIG51bWJlci4gIFN1cHBvcnQgcjQwMDAgbWFnaWMgbnVtYmVycy4KKwkoZWNvZmZfZ2V0X21hZ2ljKTogTmV3IGZ1bmN0aW9uLgorCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgZWNvZmZfZ2V0X21hZ2ljLCBub3QgZmllbGRzIGluCisJdGhlIGJhY2tlbmQgc3RydWN0dXJlLgorCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZGVkIGNhc2UgZm9yIHI2MDAwLgorCisJRm9yIE1JUFMgY29uZmlndXJhdGlvbnMgcHV0IGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHZlcnNpb25zIGluCisJdGhlIGxpc3Qgb2YgdGFyZ2V0czsgdGhlIGNvZGUgaXMgZ2V0dGluZyBjb21waWxlZCBpbiBhbnlob3cuCisJKiBiaWdtaXBzLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9saXR0bGVfdmVjLgorCSogZGVjc3RhdGlvbi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfYmlnX3ZlYy4KKwkqIG1pcHNiZWxmLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCisJKiBtaXBzbGVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgYmZkX2VsZjMyX2JpdG1pcHNfdmVjLgorCSogcmlzY29zLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9saXR0bGVfdmVjLgorCitGcmkgU2VwIDI0IDAwOjQyOjIzIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogb3NmLWNvcmUuYzogIE5ldyBmaWxlIGZvciBPU0YvMSBjb3JlIGZpbGUgc3VwcG9ydC4KKwkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiAgQWRkIC1ET1NGX0NPUkUuCisJKEhERVBGSUxFUyk6ICBTZXQgdG8gb3NmLWNvcmUuby4KKwkqIGJmZC1pbjIuaCAodW5pb24gdGRhdGEpOiAgQWRkIG9zZl9jb3JlX2RhdGEgbWVtYmVyLgorCSogdGFyZ2V0cy5jOiAgSWYgT1NGX0NPUkUgaXMgZGVmaW5lZCwgYWRkIG9zZl9jb3JlX3ZlYyB0byB0YXJnZXQgbGlzdC4KKwkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6ICBBZGQgb3NmLWNvcmUuby4KKwkob3NmLWNvcmUubyk6ICBOZXcgZGVwZW5kZW5jeS4KKworVGh1IFNlcCAyMyAyMTowNDo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogUmVtb3ZlIG5vdGUgYWJvdXQgbWFraW5nIC0td2l0aC1iZmQtdGFyZ2V0cyB1c2UgY2Fub25pY2FsCisJdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZSAoYWxyZWFkeSBkb25lKTsgcmV3b3JkIGl0ZW0gYWJvdXQKKwlzZXBhcmF0aW5nIHJlYWRpbmcgYW5kIHdyaXRpbmcgc3R1ZmYgdG8gbm90IHJlZmVyIHRvIGEKKwlub24tZXhpc3RlbnQgaXRlbS4KKworCSogZWNvZmYuaCAoZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWNjZXB0IE1JUFNfTUFHSUNfTElUVExFMgorCWFuZCBNSVBTX01BR0lDX0JJRzIuCisKK1RodSBTZXAgMjMgMTE6MDY6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBnZW4tYW91dC5jIChtYWluKTogT3V0cHV0IG5ld2xpbmUgYWZ0ZXIgZW5kIG9mIGNvbW1lbnQsIG5vdAorCWJlZm9yZS4gIChSZXBvcnRlZCBieSBKb25hdGhhbiBTdG9uZSwKKwlqb25hdGhhbkBvc2Nhci5zdGFuZm9yZC5lZHUpLgorCitUaHUgU2VwIDIzIDEwOjQ4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFB1dCB3ZWFrIHN5bWJvbHMgaW4gdGhlCisJYXJtYXAuCisKKwkqIGVsZmNvZGUuaCAoZml4X3VwX3N0cnRhYnMpOiBTZXQgc2hfZW50c2l6ZSBmb3IgdGhlIC5zdGFiCisJc2VjdGlvbiwgbm90IHRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgU2V0IHRoZSB0eXBlIG9mIHRoZSAuc3RhYnN0cgorCXNlY3Rpb24gdG8gU0hUX1NUUlRBQi4KKwkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZSBTSFRfU1RSVEFCIHNlY3Rpb25zLgorCisJKiBzZWN0aW9uLmMgKFNFQ19ERUJVR0dJTkcpOiBOZXcgc2VjdGlvbiBmbGFnLgorCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiBzZWN0aW9uIGlzIFNIVF9QUk9HQklUUywKKwlhbmQgdGhlIG5hbWUgc3RhcnRzIHdpdGggLmRlYnVnLCAubGluZSBvciAuc3RhYiwgc2V0CisJU0VDX0RFQlVHR0lORy4gIElmIFNIVF9TVFJUQUIsIGNoZWNrIGZvciAuZGVidWcgYW5kIC5zdGFiLgorCSogZWxmMzItdGFyZ2V0LmggKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkCisJU0VDX0RFQlVHR0lORyB0byBzZWN0aW9uX2ZsYWdzLgorCSogZWxmNjQtdGFyZ2V0LmggKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkCisJU0VDX0RFQlVHR0lORyBhbmQgU0VDX0NPREUgdG8gc2VjdGlvbl9mbGFncy4KKwkqIGJmZC1pbjIuaDogVXBkYXRlZC4KKworV2VkIFNlcCAyMiAxNjozNDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGJmZC5jICh0ZGF0YSk6IEFkZCBseW54X2NvcmVfZGF0YS4KKworCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IGZpbGVwb3MgZm9yCisJc2VjdGlvbnMgd2l0aCBTRUNfTE9BRCBzZXQsIGV2ZW4gaWYgU0VDX0hBU19DT05URU5UUyBpcyBjbGVhci4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHNjbnB0ciB0byB6ZXJvIGp1c3QKKwliZWNhdXNlIHNpemUgb2Ygc2VjdGlvbiBpcyB6ZXJvLiAgTmVlZGVkIGZvciBJcml4IDQuMC41Ri4KKworV2VkIFNlcCAyMiAwOTo0OTozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZDogVXNlIGk5NjAtYm91dCwgbm90IGk5NjAtY29mZiBmb3IgaTk2MC0qLW5pbmR5Ki4KKworV2VkIFNlcCAyMiAwNzozNDowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiAgQWRkIGx5bngtY29yZS5vLgorCSogYmZkLWluMi5oICh0ZGF0YSk6ICBBZGQgbHlueF9jb3JlX2RhdGE7CisJKiBjb25maWcuYmZkIGNvbmZpZ3VyZS5ob3N0OiAgR2V0IHJpZCBvZiBzdXBlcmZsdW91cyBuZXRic2QgYW5kCisJbHlueG9zIGVudHJpZXMuCisJKiBjb25maWd1cmUuaW46ICBBZGQgbHlueC1jb3JlLm8gdG8gTHlueCBjb25maWcuCisJKiBpMzg2bHlueC5jOiAgQWRkIGRlZnMgZm9yIGNvcmUgZmlsZSBzdXBwb3J0LgorCSogbHlueC1jb3JlLmM6ICBOZXcgZmlsZSB3aXRoIEx5bnggY29yZSBmaWxlIHN1cHBvcnQuCisJKiBob3N0cy9pMzg2bHlueC5oOiAgTW92ZSBsb3RzIG9mIGhvc3Qgc3BlY2lmaWMgaW5jbHVkZXMgdG8gaGVyZS4KKwlBZGQgZGVmIG9mIEhPU1RfTFlOWC4gIFJlbW92ZSB1bm5lY2Vzc2FyeSBkZWZzLgorCitNb24gU2VwIDIwIDE5OjE4OjEwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBPbmx5IHNldCBTRUNfREFUQSBmb3IgYQorCVNIRl9QUk9HQklUUyBvciBTSFRfU1RSVEFCIHNlY3Rpb24gaWYgU0VDX0FMTE9DIGlzIHNldC4gIE5ldmVyIHNldAorCVNFQ19EQVRBIGZvciBhIFNIRl9OT0JJVFMgc2VjdGlvbi4KKworCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9tYW5nbGVfcmVsb2NzKTogQ2hlY2sgU0VDX0xPQUQgcmF0aGVyCisJdGhhbiBTRUNfQ09ERSB8IFNFQ19EQVRBLiAgQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCisJKiBubG1jb2RlLmg6IEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWdub3JlIHJlbG9jcyBmb3Igc2VjdGlvbnMgdGhhdCBhcmUKKwluZWl0aGVyIGNvZGUgbm9yIGRhdGEuICBKdXN0IHVzZSB0aGUgc3ltYm9sIHZhbHVlIGZvciBkZWJ1Z2dpbmcKKwlzeW1ib2xzOyBkb24ndCBvZmZzZXQgYnkgdGhlIHNlY3Rpb24gdm1hLgorCitGcmkgU2VwIDE3IDE4OjA4OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHJldHVybiBhbiBlcnJvciB3aGVuCisJcGVyZm9ybWluZyBhIHJlbG9jIGFnYWluc3QgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgorCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyB2YWx1ZSBvZiBCU0ZfV0VBSyByYXRoZXIKKwl0aGFuIG9ic29sZXRlIEJTRl9FWFBPUlQuCisKK0ZyaSBTZXAgMTcgMDI6MDQ6MzEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGhvc3RzL3thbHBoYW9zZi5oLCBhbWl4LmgsIGFwb2xsbzY4LmgsIGFwb2xsb3Y2OC5oLAorCWRlY3N0YXRpb24uaCwgZGVsdGE4OC5oLCBkZ3V4LmgsIGRvc2UuaCwgZ28zMi5oLCBoYXJyaXMuaCwKKwlocDMwMC5oLCBocDMwMGJzZC5oLCBocHBhYnNkLmgsIGhwcGFocHV4LmgsIGkzODZhaXguaCwgaTM4NmJzZC5oLAorCWkzODZsaW51eC5oLCBpMzg2bHlueC5oLCBpMzg2di5oLCBpMzg2djQuaCwgaXJpeDMuaCwgaXJpeDQuaCwKKwltaXBzYnNkLmgsIG5jcjMwMDAuaCwgcnM2MDAwLmgsIHJ0YnNkLmgsIHNvbGFyaXMyLmgsIHNwYXJjLWxsLmgsCisJc3RkLWhvc3QuaCwgc3RyYXR1cy5oLCBzdW4zLmgsIHN5c3Y0LmgsIHRhaG9lLmgsIHVsdHJhMy5oLAorCXZheHVsdC5oLCB2YXh1bHQyLmgsIHdlMzJrLmh9OiAgTWFrZSBzdXJlIHRoYXQgIm9mZnNldG9mIiBpcworCWRlZmluZWQgb24gYWxsIGhvc3RzLCBub3cgdGhhdCBhcmNoaXZlLmMgdXNlcyBpdC4KKworVGh1IFNlcCAxNiAxODoyMDozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQ3JlYXRlIHNlY3Rpb24gc3ltYm9scyBmb3IgYWxsCisJc2VjdGlvbnMsIG5vdCBqdXN0IGFsbG9jYXRlZCBzZWN0aW9uczsgZGVidWdnaW5nIHNlY3Rpb25zIGNhbiBoYXZlCisJcmVsb2NzLgorCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IElmIHRoZXJlIGlzIGFuIG91dHB1dCBzZWN0aW9uLCB1c2UKKwl0aGUgc2VjdGlvbiBpbmRleCBmcm9tIHRoYXQgcmF0aGVyIHRoYW4gdGhlIGlucHV0IHNlY3Rpb24uCisKK1RodSBTZXAgMTYgMTI6MjA6NTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGxpYmJmZC1pbi5oIChiZmRfZmx1c2gsIGJmZF9zdGF0KTogUmVmbGVjdCBKb2huJ3MgY2hhbmdlcyB0bworCWxpYmJmZC5oLCB3aGljaCBpcyByZWdlbmVyYXRlZCBmcm9tIHRoaXMgZmlsZS4KKworCSogYmZkLWluLmggKHN5bXR5cGUpOiBEZWxldGVkIHR5cGVkZWYuCisKK1dlZCBTZXAgMTUgMTE6NDg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsaWJiZmQuYyAoQ09FUkNFeHgpOiBDYXN0IHggdG8gYmZkX3NpZ25lZF92bWEgYmVmb3JlIGRvaW5nIHRoZQorCXhvciBhbmQgc3VidHJhY3QuICBPdGhlcndpc2UgaXQgd2lsbCBub3Qgc2lnbiBleHRlbmQgaWYgdGhlIHR5cGUKKwlvZiBiZmRfdm1hIGlzIGxhcmdlciB0aGFuIGludC4KKworCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogR2V0IHJlZ29mZnNldCwgaW9wdCwgZnJlZ29mZnNldAorCWFuZCBmcmFtZW9mZnNldCBhcyBzaWduZWQgbnVtYmVycy4gIEZyb20gUGV0ZXIgU2NoYXVlci4KKworVHVlIFNlcCAxNCAxODoyMDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWRkIGJmZF9lbGZfZ2VuZXJpY19yZWxvYworCXNwZWNpYWwgZnVuY3Rpb24gZm9yIGFsbCByZWxvYyBlbnRyaWVzLgorCSogZWxmMzItdGFyZ2V0LmggKFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkIFNFQ19DT0RFIHRvCisJc2VjdGlvbl9mbGFncy4KKwkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBSZW1vdmUgZGVzYywgdHlwZSBhbmQgb3RoZXIgZmllbGRzLgorCSogTWFrZWZpbGUuaW4gKGVsZjMyLSoubyk6IFRoZXNlIGRlcGVuZCB1cG9uIGVsZjMyLXRhcmdldC5oLgorCitUdWUgU2VwIDE0IDE0OjM0OjQ1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYXJ0ZGF0YSk6ICBBZGQgYXJtYXBfdGltZXN0YW1wIGFuZAorCWFybWFwX2RhdGVwb3MgaGVyZSB0b28uCisKK01vbiBTZXAgMTMgMjE6MDM6MTggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQorCisJSW1wcm92ZSB0aW1lc3RhbXAgc3VwcG9ydCBpbiBCU0QgYXJjaGl2ZSBmaWxlcyB0byBhdm9pZCBsaW5rZXIKKwl3YXJuaW5ncy4KKworCSogbGliYmZkLmggKHN0cnVjdCBhcnRkYXRhKTogIEFkZCBhcm1hcF90aW1lc3RhbXAgYW5kIGFybWFwX2RhdGVwb3MuCisJKGJmZF9mbHVzaCwgYmZkX3N0YXQpOiAgQWRkIHByb3RvdHlwZXMuCisJKiBsaWJiZmQuYyAoYmZkX2ZsdXNoKTogIEFkZCwgZG9lcyBmZmx1c2ggb24gYSBCRkQuCisJKGJmZF9zdGF0KTogIEFkZCwgZG9lcyBmc3RhdCBvbiBhIEJGRC4KKworCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBBdCBlbmQgb2YgZmlsZSB3cml0aW5nLAorCXZlcmlmeSBhbmQgcG9zc2libHkgdXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGFybWFwLCBpZiBhIEJTRAorCWFyY2hpdmUuICBGSVhNRSEgIEtsdWRnZSByZWNvZ25pemVzIEJTRCBhcmNoaXZlLCByYXRoZXIgdGhhbgorCXZlY3RvcmluZyBwcm9wZXJseS4gIFNob3VsZCBhZGQgdG8geHZlYy4KKwkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiAgTW92ZSBwcm90b3R5cGUgdG8gdG9wLCBhdm9pZCBQUk9UTy4KKwkoYnNkX3dyaXRlX2FybWFwKTogU2F2ZSB0aW1lc3RhbXAgYW5kIGZpbGUgbG9jYXRpb24gdGhlcmVvZiwgd2hlbgorCXdyaXRpbmcgdGhlIGFybWFwIGluIGEgQlNEIGZpbGUuCisJKGJzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogIE5ldyBmdW5jdGlvbiB0byBjaGVjayBhbmQKKwlyZXdyaXRlIHRoZSB0aW1lc3RhbXAuCisKKwkqIGhvc3RzL3N0ZC1ob3N0LmggKG9mZnNldG9mKTogIERlZmluZSwgaWYgbm90IGFscmVhZHksIGZvciBhcmNoaXZlLmMuCisKK1NhdCBTZXAgMTEgMTg6MTM6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2kzODZzY28uaDogRGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYgZm9yIGNvcmUgZmlsZXMuCisJKiBzY28tY29yZS5jOiBSZW1vdmUsIHJlcGxhY2UgYnkgdHJhZC1jb3JlLmMuCisJKiB0cmFkLWNvcmUuYzogSWYgSE9TVF9TVEFDS19TVEFSVF9BRERSIGlzIGRlZmluZWQsIHVzZSBpdC4KKwkqIGNvbmZpZy9pMzg2c2NvLm1oOiBVc2UgdHJhZC1jb3JlIG5vdCBzY28tY29yZS4KKwkqIGhvc3RzL2kzODZpc2MuaCwgY29uZmlnL2kzODZpc2MubWg6IFJlbW92ZS4KKwkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgaTM4NnNjbyBmb3IgaXNjLgorCSogY29uZmlnL2kzODYtc2NvLm10OiBSZW1vdmUsIGlkZW50aWNhbCB0byBpMzg2LWNvZmYubXQuCisJKiBjb25maWcuYmZkOiBVc2UgaTM4Ni1jb2ZmIG5vdCBpMzg2LXNjby4KKworCSogY29uZmlnLmJmZDogUmVjb2duaXplIGlbMzRdODYtKi1zb2xhcmlzMiogc3BlY2lmaWNhbGx5IHJhdGhlcgorCXRoYW4gdXNpbmcgKi0qLXNvbGFyaXMyKiAoaTQ4Ni11bmtub3duLXNvbGFyaXMyIGlzIGkzODYtZWxmLCBub3QKKwlpNDg2LWVsZiB3aGljaCBkb2Vzbid0IGV4aXN0KS4KKworRnJpIFNlcCAxMCAxMjo1NjozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBBTFBIQUVDT0ZGLCBmb3JjZQorCXBhZGRpbmcgZmllbGQgdG8gemVyby4KKworCSogY29uZmlnLmJmZCAoaVszNF04Ni0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0OyB1c2UgaTM4Ni1uZXRic2QuCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBib2d1cyBuZXRic2QzODYgaGFuZGxpbmcuCisKKwkqIGNvZmYtbWlwcy5jOiBEb24ndCB3YXJuIGFib3V0IG92ZXJmbG93IGZvciBNSVBTX1JfSk1QQUREUiByZWxvYy4KKwlDb3JyZWN0IG92ZXJmbG93IGRldGVjdGlvbiByZXF1aXJlcyBtYXRjaGluZyB0aGUgdXBwZXIgZm91ciBiaXRzCisJb2YgdGhlIGRlc3RpbmF0aW9uIGFnYWluc3QgdGhlIFBDLgorCitUaHUgU2VwICA5IDE2OjU3OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBNYWtlIDY0LWJpdCBzdHVmZiB3b3JrIHdpdGggIi0td2l0aC10YXJnZXRzPWFsbCIuCisKK1R1ZSBTZXAgIDcgMTQ6MTc6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsaWJiZmQtaW4uaDogUmVtb3ZlZCBzd2FwcGluZyByb3V0aW5lcyBkZWNsYXJhdGlvbnMuCisJKiBiZmQtaW4uaDogQWRkZWQgc3dhcHBpbmcgcm91dGluZSBkZWNsYXJhdGlvbnMsIGFuZCByZW5hbWVkIHRoZW0KKwlmcm9tIF9kb18qIHRvIGJmZF8qLgorCSogbGliYmZkLmM6IFJlbmFtZWQgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBfZG9fKiB0byBfYmZkXyouCisJKiBDaGFuZ2VkIGFsbCBjYWxsZXJzLgorCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KKworTW9uIFNlcCAgNiAxNToyODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogU2V0IHBjcmVsX29mZnNldCB0byB0cnVlIGZvcgorCVJfMzg2X1BDMzIuCisKK0ZyaSBTZXAgIDMgMTM6MDY6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlb3JnYW5pemVkIHNldHRpbmcgb2YgbWFrZWZpbGUgdmFyaWFibGVzIHNvCisJNjQtYml0IHN0dWZmIHdvcmtzIGFnYWluLgorCisJKiBsaWJiZmQtaW4uaCAoX2RvX2dldCosIF9kb19wdXQqKTogUmVuYW1lZCB2aWEgbWFjcm9zIHRvIGNsZWFuIHVwCisJbmFtZXNwYWNlLgorCisJKiBsaWJlbGYuaCAoZWxmMzJfc3ltYm9sX3R5cGUsIGVsZjY0X3N5bWJvbF90eXBlKTogRGVsZXRlZAorCSJuYXRpdmVfZWxmX3N5bSIgZmllbGQsIG1lcmdlZCB0byBtYWtlIG5ldyB0eXBlICJlbGZfc3ltYm9sX3R5cGUiLgorCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEZpZWxkIHN5bWJvbHMgaXMgbm93IGVsZl9zeW1ib2xfdHlwZSouCisJRGVsZXRlZCBmaWVsZCByYXdfc3ltcy4KKwkob2JqX3N5bWJvbHMpOiBSZW1vdmUgY2FzdC4KKwkob2JqX3Jhd19zeW1zKTogRGVsZXRlZC4KKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHNldCByYXdfc3ltcyBvcgorCW5hdGl2ZV9lbGZfc3ltIGZpZWxkcy4KKwkqIGVsZjMyLWhwcGEuYzogQ2hhbmdlZCB1c2VzIG9mIGVsZjMyX3N5bWJvbF90eXBlIHRvCisJZWxmX3N5bWJvbF90eXBlLgorCisJRnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3OgorCisJKiBlbGYzMi1ocHBhLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KKworCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV90Y19zeW1ib2wpOiBJZiB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgorCWJpdHMgYXJlIHplcm8gKGUuZy4sIHRoZXkgc3BlY2lmeSBubyByZWxvY2F0aW9ucyksIHRoZW4gZG8gbm90CisJZXZlbiBib3RoZXIgYWRkaW5nIHRoZWlyIGVudHJpZXMgdG8gdGhlIHN5bWV4dG4gc2VjdGlvbi4KKworCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV90Y19zeW1ib2wpOiBBbnkgZnVuY3Rpb24sIHJlZ2FyZGxlc3MKKwlvZiBzY29wZSBjYW4gaGF2ZSBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWIuCisKKwkqIGVsZjMyLWhwcGEuYzogKEVsZjMyX2hwcGFfU3R1Yl9kZXNjcmlwdGlvbik6ICBSZW5hbWUgdGhpcworCXN0cnVjdHVyZSBhbmQgdHlwZSB0byBlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24uICBUaGlzIG1ha2VzCisJaXQgY29uc2lzdGVudCB3aXRoIHRoZSBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgorCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBhICduZXh0JyBmaWVsZCB0byBhbGxvdworCWxpbmtpbmcgb2Ygc3R1YiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzLgorCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBhICdzdHViX2xpc3RQJyBmaWVsZCB0bworCWtlZXAgdHJhY2sgb2YgaW5kaXZpZHVhbCBzdHVicy4KKwkoRWxmMzJfaHBwYV9TdHViX2xpc3QsIEVsZjMyX2hwcGFfU3R1Yl9saXN0X3N0cnVjdCk6ICBSZW1vdmVkLgorCUNvbWJpbmVkIHdpdGggdGhlIGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbiBzdHJ1Y3R1cmUuCisJKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3QpOiAgTmV3IHR5cGUgdG8ga2VlcCB0cmFjayBvZgorCWluZGl2aWR1YWwgc3R1YnMuCisJKGFkZF9zdHViKTogIFJlbW92ZWQuCisJKGFkZF9zdHViX2J5X25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGZpbmRfc3R1Yl9ieV9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IEFsbG93IHJldXNpbmcgc3R1YnMgdGhhdAorCWFscmVhZHkgZXhpc3QuCisJKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBBbGxvdyByZXVzaW5nIHN0dWJzIHRoYXQKKwlhbHJlYWR5IGV4aXN0LgorCisJKiBlbGYzMi1ocHBhLmM6IChyZXR2YWxfbWlzbWF0Y2hlcyk6ICBUaGUgZGlyZWN0aW9uIG9mIGFyZ3VtZW50CisJcmVsb2NhdGlvbiB3YXMgcmV2ZXJzZWQuCisJKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogUmV0dXJuIGFkZHJlc3Mgd2FzIG5vdCBiZWluZworCXJlc3RvcmVkLgorCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3ApOiBBZGQgYXJndW1lbnQgY29udGFpbmluZyBjYWxsZXIKKwlhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgc28gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiB0aGUgY2hlY2sKKwlmb3IgcGxhYmVsIHN0dWJzLgorCShocHBhX2VsZl9zdHViX2NoZWNrKTogUGFzcyBjYWxsZXIgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGludG8KKwlocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3AoKS4KKwkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogQWRkIGNoZWNrIGZvciBwbGFiZWwgc3R1YnMgYW5kCisJcGFzcyBjYWxsZXIgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGludG8KKwlocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3AoKS4KKworVGh1IFNlcCAgMiAwMDo1OTo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IFJlbW92ZSB1bnVzZWQgYGluaXRfdmFsdWUnIHZhcmlhYmxlLgorCisJKiBob3N0cy9kZWx0YTg4djQuaDogTmV3IGZvciBTVlI0LgorCSogY29uZmlndXJlLmhvc3RzOiBVc2UgaXQuCisKK1dlZCBTZXAgIDEgMTQ6MjM6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGxpYmFvdXQuaCwgbmV0YnNkMzg2LmM6IENoYW5nZSBNX0kzODYgdG8gTV8zODZfTkVUQlNELiAgTV9JMzg2CisJaXMgYW4gU0NPIHByZS1kZWZpbmUuCisKK1R1ZSBBdWcgMzEgMTI6NTA6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IFNldCBIQVNfU1lNUyBpZiB0aGVyZSBhcmUgZXh0ZXJuYWwKKwlyZWZlcmVuY2VzLgorCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc197aW4sb3V0fSk6IFRoZSBjb3B5cmlnaHQgbGVuZ3RoIGlzCisJb25seSBvbmUgYnl0ZS4KKwkobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBJbmNsdWRlIGRlYnVnZ2luZyBzeW1ib2xzIGluIHN5bWJvbAorCWNvdW50LgorCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogTWFrZSBzeW1sZW5ndGggdW5zaWduZWQuICBSZWFkIGRlYnVnZ2luZworCXN5bWJvbHMgYXMgQkZEIGxvY2FsIHN5bWJvbHMuCisJKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBib3RoZXIgd3JpdGluZyBvdXQgZXhwb3J0ZWQKKwlzeW1ib2xzIG1vcmUgdGhhbiBvbmNlOyB0aGV5IG5vdyBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSBtb3JlCisJdGhhbiBvbmNlICh3aXRoIGFuZCB3aXRob3V0IGEgcHJlZml4KSBpZiBuZWNlc3NhcnkuICBTZXQgb2Zmc2V0CisJdmFsdWVzIHRvIGJlIG5vbi16ZXJvIGFzIE5MTUxJTksgZG9lcy4KKworVHVlIEF1ZyAzMSAxMjowNzo0MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbGliaHBwYS5oOiBSZXN0b3JlICN1bmRlZnMgb2YgZV9mc2VsIGFuZCBvdGhlciBlXyogc3ltYm9scy4KKworRnJpIEF1ZyAyNyAxNjo0MzozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IE1vdmUgcG9zaXRpb24gb2YgdXNlcl9zZXRfdm1hLCBhbmQKKwlkb2N1bWVudCBpdC4KKwkoU0VDX0JBTElHTik6IERpc2FibGUgZm9yIG5vdy4gIEkgZG9uJ3QgdGhpbmsgaXQncyBjdXJyZW50bHkgdXNlZC4KKworCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9ob3d0b190YWJsZSk6IE5vdyBzdGF0aWMuCisJKHN5bWV4dF9yb290UCwgc3ltZXh0X2xhc3RQLCBnbG9iYWxfdmFsdWUsIEdPVF92YWx1ZSwKKwlnbG9iYWxfc3ltYm9sLCBnbG9iYWxfc3ltX2RlZmluZWQsIHN5bWV4dG5fY29udGVudHMsCisJc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUsIGVsZl9ocHBhX3N0dWJfcm9vdFAsCisJZWxmMzJfaHBwYV9zeW1leHRuX21hcCwgZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zaXplKTogUmVseSBvbgorCWRlZmF1bHQgaW5pdGlhbGl6YXRpb24uCisJKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogTWFjcm8gIlVOREVGSU5FRCIgZG9lc24ndCBuZWVkIGEKKwl0cmFpbGluZyBzZW1pY29sb24uCisJKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IEludHJvZHVjZSB0ZW1wb3JhcmllcyB0byBtYWtlCisJY29kZSBtb3JlIHJlYWRhYmxlIGluIDgwIGNvbHVtbnMuCisKKwkqIGxpYmhwcGEuaCAoYWxsIGZ1bmN0aW9ucyk6IE5vdyBpbmxpbmUgdW5kZXIgR05VIEMuCisKKwlNb3JlIHBhdGNoZXMgZnJvbSBKZWZmIExhdzoKKworCSogZWxmMzItaHBwYS5jIChBUl9XQVJOKTogR2l2ZSBhcmd1bWVudCB3aGljaCBjYXVzZWQgdGhlCisJaW52YWxpZCBhcmd1bWVudCByZWxvY2F0aW9uLgorCShBUl9VTklNUCk6IERlbGV0ZSB1bnVzZWQgbWFjcm8uCisJKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgorCShlbGYzMl9ocHBhX2JhY2tlbmRfdGFibGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgorCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nOiBMaWtld2lzZS4KKworCSogc29tLmM6IE5ldyBmaWxlIGNvbnRhaW5pbmcgU09NIHNwZWNpZmljIGNvZGUgZXh0cmFjdGVkCisJZnJvbSBocHBhLmMKKworCSogc29tLmg6IE5ldyBmaWxlIGNvbnRhaW5pbmcgU09NIHNwZWNpZmljIGNvZGUgZXh0cmFjdGVkCisJZnJvbSBsaWJocHBhLmgKKworCSogaHBwYS5jOiBEZWxldGVkLgorCisJKiBsaWJocHBhLmg6IERlbGV0ZSBTT00gc3BlY2lmaWMgY29kZS4gIEFkZCBnZW5lcmljIFBBCisJY29kZSB3aGljaCBjYW4gYmUgc2hhcmVkIGJ5IGJvdGggU09NIGFuZCBFTEYgYmFja2VuZHMuCisKKwkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGhwcGEuYyB3aXRoIHNvbS5jLiAgZWxmMzItaHBwYS5vCisJZGVwZW5kcyBvbiBsaWJocHBhLmggbm93LgorCisJKiBjb25maWd1cmUuaW4gKGhwcGFfdmVjKTogTmVlZHMgc29tLm8gbW9kdWxlIGluc3RlYWQgb2YKKwlocHBhLm8uCisKKwkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguICBEbyBub3QgZGVmaW5lCisJQllURVNfSU5fV09SRC4KKworCSogZWxmMzItaHBwYS5oIChocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBEZWxldGUKKwlub3cgbGl2ZXMgaW4gbGliaHBwYS5oLgorCShocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0KTogTGlrZXdpc2UuCisKKwkqIGhvc3RzL2hwcGFic2QuaDogSW5jbHVkZSA8c3RkbGliLmg+IGFuZCA8dW5pc3RkLmg+LiAgRG8gbm90CisJZGVmaW5lIG1hbGxvYyBvciBmcmVlLgorCisJKiBjb25maWcvaHBwYS1lbGYubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogRG9uJ3QgZGVmaW5lCisJU0VMRUNUX1ZFQ1MuCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogRGVsZXRlIHVudXNlZAorCXZhcmlhYmxlcy4KKwkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KKwkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgorCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3ApOiBMaWtld2lzZS4KKwkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IExpa2V3aXNlLgorCShlbGZfcmVsb2NfbWFwKTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KKwkoZWxmX2hwcGFfcmVsb2NfbWFwKTogTGlrZXdpc2UuCisJKGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfbWF4X3NpemUpOiBMaWtld2lzZS4KKwkoZWxmMzJfaHBwYV9nZXRfc3ltX2V4dG4pOiBBYm9ydCBpZiB0eXBlIGlzIGJvZ3VzLgorCisJKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogQWRkIHByb2Nlc3NpbmcKKwlvZiB0aGUgLmhwcGFfdW53aW5kIHNlY3Rpb24uCisKK1dlZCBBdWcgMjUgMTY6MTM6NDkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBjb25maWcuYmZkOiByZWNvZ25pemUgbTg4MTEwLgorCitUdWUgQXVnIDI0IDE2OjMyOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCU1lcmdlZCBjaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbSBhdCBVdGFoOgorCisJKiBlbGZjb2RlLmggKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBBZGQgZGV0ZWN0aW9uIG9mCisJU0hUX05PVEUgc2VjdGlvbnMuCisKKwkqIGVsZjMyLWhwcGEuYzoKKwkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1YixocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6CisJTmV3IGZ1bmN0aW9ucyBmb3Igc3VwcG9ydCBvZiBsb25nIGJyYW5jaCBzdHVicy4KKwkoaHBwYV9lbGZfc3R1Yl9jaGVjayxocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiAgQWRkCisJY2hlY2sgZm9yIGxvbmcgYnJhbmNoIHN0dWJzLgorCShocHBhX2xvb2tfZm9yX3N0dWJzKTogIFVudXNlZCBmdW5jdGlvbi4gIFJlbW92ZWQuCisJKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSW1wbGVtZW50IGEgUEEvRUxGLXNwZWNpZmljCisJdmVyc2lvbiBvZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMuCisJKGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKTogT25seSBvdXRwdXQgZGVidWdnaW5nIGRpYWdub3N0aWNzCisJd2hlbiBCRkQgaXMgY29uZmlndXJlZCBmb3IgZGVidWdnaW5nLgorCisJKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2dldF9zeW1leHRuX2NoYWluKTogIE5ldyBmdW5jdGlvbgorCXRvIHJldHVybiBhIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IGhhdmUgbm9uLXplcm8gYXJndW1lbnQKKwlyZWxvY2F0aW9uIGJpdHMuCisJKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTWFrZSBzdXJlIHN0dWIgZ2VuZXJhdGlvbiBpcyBkb25lIG9ubHkKKwlvbmNlLgorCisJKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9zdHViX3JlbG9jKTogIE5ldyBmdW5jdGlvbiBmb3IKKwlnZW5lcmF0aW9uIHJlbG9jYXRpb24gZW50cmllcyB3aXRoaW4gYSBzdHViLgorCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IENvcnJlY3Rpb25zIHRvIGFyZ3VtZW50CisJcmVsb2NhdGlvbiBzdHVicy4KKworCSogZWxmMzItaHBwYS5jOiBOZXcgI2RlZmluZSdzIGZvciBhcmd1bWVudCByZWxvY2F0aW9uIHR5cGVzLgorCShtaXNtYXRjaGVzLCByZXR2YWxfbWlzbWF0Y2hlcyk6IFVwZGF0ZWQgdG8gcmVmbGVjdCBuZXcKKwlhcmd1bWVudCByZWxvY2F0aW9uIHR5cGVzLgorCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogTmV3IG1hY3JvLgorCisJKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogU2V0IHRoZSBQRl9YIGJpdCBmb3IgZGF0YQorCXNlZ21lbnRzLgorCisJKiBlbGYzMi1ocHBhLmM6IChlbGZfaHBwYV9ob3d0b190YWJsZSk6IEFkZAorCVJfSFBQQV9TVFVCX0NBTExfMTcgZm9yIHN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KKwkoaHBwYV9lbGZfcmVsb2MpOiBBZGQgc3VwcG9ydCBvZiBSX0hQUEFfU1RVQl9DQUxMXzE3CisJcmVsb2NhdGlvbiB0eXBlLgorCisJKiBlbGYzMi1ocHBhLmg6IChlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBBZGQKKwlSX0hQUEFfU1RVQl9DQUxMXzE3IGZvciBzdXBwb3J0IG9mIGxpbmtlciBzdHViIGdlbmVyYXRpb24uCisKKwkqIGhwcGFfc3R1YnMuaDogQWRkIG5ldyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBsaW5rZXIKKwlzdHViIGdlbmVyYXRpb24uCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogVGhlIG9mZnNldHMgaW4gYW4KKwl1bndpbmQgZGVzY3JpcHRvciB3ZXJlIGluY29ycmVjdC4KKworCSogbGliZWxmLmggKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogRGVjbGFyZS4KKworCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKTogIE5ldworCWZ1bmN0aW9uIGluIHBsYWNlIG9mIGdsb2JhbF9zeW0gZmllbGQgaW4gZWxmX2JhY2tlbmRfZGF0YQorCXN0cnVjdHVyZS4KKwkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAorCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCisJZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsCisJZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAorCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiAgTmV3IGZ1bmN0aW9ucyB0bworCXByb3ZpZGUgc3VwcG9ydCBvZiBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zIGFuZCBhcmd1bWVudAorCXJlbG9jYXRpb24gc3R1YnMuCisJKGVsZl9pbmZvX3RvX2hvd3RvKTogIFJlbW92ZSBjYWxsIHRvIGFib3J0KCkuCisKKwkqIGVsZjMyLXRhcmdldC5oOiAgU3VwcG9ydCBmb3Igc3BlY2lhbCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZW5kLgorCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6ICBBZGRlZCBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZywKKwllbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKKwllbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAorCWVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsIGFuZAorCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBmaWVsZHMuCisJKiBlbGZjb2RlLmg6IChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGQgYSBjaGVjayBmb3IKKwlwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4KKwkoZWxmX2Zha2Vfc2VjdGlvbnMpOiAgQWRkIGEgY2hlY2sgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYworCXNlY3Rpb24gdHlwZXMuCisJKGJmZF9lbGYzMl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgQWRkIGEgY2hlY2sgdG8gc2VlIGlmCisJdGhlcmUgaXMgYW55IGZpbmFsIHNlY3Rpb24gcHJvY2Vzc2luZyB0byBiZSBkb25lIGJ5IHRoZQorCWJhY2tlbmQuCisJKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiAgQWRkIGEgY2hlY2sgZm9yCisJcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuCisJKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgUmVtb3ZlIHJlZmVyZW5jZSB0byBnbG9iYWxfc3ltIGluIHRoZQorCWVsZl9iYWNrZW5kX2RhdGEgc3RydWN0dXJlLiAgUmVwbGFjZSBpdCB3aXRoIGEgY2FsbCB0bworCWVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLgorCSogbGliZWxmLmg6IFJlbW92ZSBnbG9iYWxfc3ltIGZpZWxkIGluIHRoZSBlbGZfYmFja2VuZF9kYXRhCisJc3RydWN0dXJlLiAgUmVwbGFjZSBpdCB3aXRoIGEgc2VyaWVzIG9mIGJhY2tlbmQtc3BlY2lmaWMKKwlmdW5jdGlvbnMuCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpOiBUaGUgZm9ybWFsIGFyZ3VtZW50CisJc3R1Yl9zeW0gc2hvdWxkIGJlIGNhbGxlZCB0YXJnZXRfc3ltLgorCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFJlZmVyIHRvIHRoZSBzdHViIGJmZCAoYWJmZCkKKwlyYXRoZXIgdGhhbiB0aGUgb3V0cHV0IGJmZCAob3V0cHV0X2JmZCkuCisJKGhwcGFfZWxmX3JlbG9jKTogR2V0IHJpZCBvZiByZWZlcmVuY2VzIHRvIHRoZSBnbG9iYWxfc3ltIGZpZWxkIGluCisJdGhlIGVsZl9iYWNrZW5kX2RhdGEgc3RydWN0dXJlLgorCisJKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgdGhlIGNvcnJlY3QgY29uZGl0aW9uIGZvcgorCS5ic3MuICBBbHNvLCBkZXRlY3QgdGhlIGV4aXN0ZW5jZSBvZiBhIC5ub3RlIHNlY3Rpb24uCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IHJfZm9ybWF0IGFyZ3VtZW50IHNob3VsZAorCWhhdmUgYmVlbiByX2ZpZWxkLgorCisJKiBob3N0cy9ocHBhYnNkLmggKEhPU1RfTUFDSElORV9BUkNIKTogUmVmZXJlbmNlIHRvIGJmZF9hcmNoX202OGsKKwlzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYmZkX2FyY2hfaHBwYS4KKworCSogaHBwYS5jIChocHBhX3ZlYyk6IFJlcGxhY2UgYmZkX2ZhbHNlIHdpdGggX2JmZF9kdW1teV90YXJnZXQgaW4KKwl0aGUgYmZkX2NoZWNrX2Zvcm1hdCBzdHJ1Y3R1cmUgdG8gYXZvaWQgYSB0eXBlIG1pc21hdGNoLgorCitNb24gQXVnIDIzIDE5OTMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKKwkJIGFuZCBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCUFkZCBOZXRCU0Qgc3VwcG9ydDoKKwkqIG5ldGJzZDM4Ni5jOiBOZXcgZmlsZS4KKwkqIGFvdXR4Lmg6IE1ha2Ugc3ltX2lzX2RlYnVnZ2VyX2luZm8gdHJ1ZSBmb3IgTl9GTi4KKwkqIE1ha2VmaWxlLmluLCBhb3V0LXRhcmdldC5oLCBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLmluLAorCWxpYmFvdXQuaCwgdGFyZ2V0cy5jOiBPdGhlciBjaGFuZ2VzLgorCitGcmkgQXVnIDIwIDE3OjA0OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTg4ay1lbGYubXQ6IE5ldyBmaWxlLgorCSogY29uZmlnLmJmZDogVXNlIGl0IGZvciBtODgqLSotc3lzdjQqLgorCitGcmkgQXVnIDIwIDE1OjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChlbGZfYnVpbGRfcGhkcnMpOiBVbnVzZWQgZnVuY3Rpb24gZGVsZXRlZC4KKwkoYmZkX3NoZHJfZnJvbV9zZWN0aW9uKTogRGl0dG8uCisJKHdyaXRlX3JlbG9jcyk6IERvbid0IGNoYW5nZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBhZGRlbmQuCisJKGVsZl9sb2NhdGVfc2gpOiBSZXR1cm4gdHlwZSBpcyBub3cgYWx3YXlzIGVsZl9pbnRlcm5hbF9zaGRyLAorCXNpbmNlIHRoZSBvdGhlciB0eXBlcyB3ZXJlIHJlYWxseSBhbGlhc2VzIGZvciB0aGlzIHR5cGUgYW55d2F5cy4KKwlEb24ndCBjb21waWxlIHRoaXMgZnVuY3Rpb24sIHNpbmNlIGl0IGlzIHN0YXRpYyBhbmQgZG9lc24ndCBhcHBlYXIKKwl0byBiZSB1c2VkIGluIHRoaXMgZmlsZS4KKwkoc3ltX2lzX2dsb2JhbCk6IFJldHVybiBub24temVybyBmb3Igd2VhayBzeW1ib2xzLiAgQWJvcnQgaWYKKwlzZWN0aW9uIHBvaW50ZXIgaXMgbnVsbC4KKwkoc3dhcF9vdXRfc3ltcyk6IFJlb3JkZXIgdGVzdHMgc28gZnVuY3Rpb24gc3ltYm9scyBjYW4gYmUgd2Vhay4KKwkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHVzZSBCU0ZfRVhQT1JULgorCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogTWFrZSBSRUxPQ19QUk9DRVNTSU5HIHNlY3Rpb24gc21hbGxlciBieQorCWV4dHJhY3Rpbmcgb3V0IHNvbWUgY29tbW9uIGNvZGUuICBBYm9ydCBpZiBCRkQgc2VjdGlvbiBzeW1ib2wgaGFzCisJbnVsbCBuYW1lLgorCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBUcmFuc2xhdGUgRUxGIHNlY3Rpb24gc3ltYm9scyBpbnRvIEJGRAorCXNlY3Rpb24gc3ltYm9scy4gIERvbid0IHJlYWQgc2VjdGlvbiBjb250ZW50cyB0byBmaWxsIGluIGFkZGVuZAorCWZpZWxkLgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IEFsbCBwYXJ0aWFsX2lucGxhY2UgZmllbGRzCisJc2hvdWxkIGJlICJ0cnVlIi4KKworCSogTWVyZ2VkIGZyb20gT1NGOgorCisJVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKKworCSogbGliZWxmLmggKHN0cnVjdCBFbGZfU3ltX0V4dHJhKTogTmV3IHN0cnVjdHVyZSB0byBjb250YWluIEVMRgorCXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gIFB1dCBpbiBlbGZfc3ltX251bSwgd2hpY2gKKwlnaXZlcyB0aGUgZXh0ZXJuYWwgc3ltYm9sIG51bWJlciBpbiB0aGUgZWxmIG9iamVjdCBmaWxlLCBzaW5jZQorCWxvY2FsIHN5bWJvbHMgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWwgc3ltYm9scy4KKwkoZWxmX3N5bV9leHRyYSk6IE5ldyBtYWNyby4KKwkoZWxmX3N5bXRhYl9tYXApOiBEZWxldGUsIGluIGZhdm9yIG9mIHVzaW5nIEVsZl9TeW1fRXh0cmEuCisJKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IFVzZSBFbGZfU3ltX0V4dHJhIHRvIG1hcCBpbnRlcm5hbAorCXN5bWJvbCBudW1iZXIgdG8gZXh0ZXJuYWwgbnVtYmVyLiAgU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlCisJRWxmX1N5bV9FeHRyYSBmaWVsZCBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgdWRhdGEgZmllbGQuCisJKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgRWxmX1N5bV9FeHRyYSB0byBtYXAgb3V0IHN5bWJvbHMuCisKKwlTdW4gSnVuIDIwIDE2OjMwOjExIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQorCisJKiBlbGZjb2RlLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGQgdG8gY291bnQgdGhlIHNpemUgb2YgdGhlCisJYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2VjdGlvbiBzeW1ib2xzLgorCShlbGZfbWFwX3N5bWJvbHMpOiBCdW1wIHRoZSBtYXggaW5kZXggb2YgdGhlIHNlY3Rpb24gc3ltYm9scyBzbworCXRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIG1lbW9yeS4gIFN0b3JlIHRoZSBtYXggaW5kZXggaW50byB0aGUKKwllbGZfb2JqX3RkYXRhIGZpZWxkLgorCisJU2F0IEp1biAxOSAxMDoxMjoyNyAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKKworCSogZWxmY29kZS5oIChlbGZfb2JqX3RkYXRhKTogQWRkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMKKwl0byB0aGUgc2VjdGlvbiBzeW1ib2xzIHdlIGNyZWF0ZWQuICBSZW1vdmUgdW51c2VkIGZpZWxkCisJaW50ZXJuYWxfc3ltcy4KKwkoZWxmX21hcF9zeW1ib2xzKTogRmlsbCBpbiBhcnJheSBvZiBwb2ludGVycyB0byBzZWN0aW9uIHN5bWJvbHMuCisJT25seSBjcmVhdGUgc2VjdGlvbiBzeW1ib2xzIGZvciBzZWN0aW9ucyB0aGF0IGhhdmUgU0VDX0FMTE9DIHNldCwKKwlhbmQgaGF2ZSBub24temVybyBzaXplLgorCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IElmIHVkYXRhIGlzIE5VTEwsIGFuZCB0aGlzIGlzIGEKKwlzZWN0aW9uIHN5bWJvbCwgbG9vayB1cCB0aGUgc2VjdGlvbiBpbiB0aGUgbGlzdCBvZiBzZWN0aW9uCisJc3ltYm9scywgYW5kIHNldCB0aGUgdWRhdGEgcG9pbnRlciBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCBpZgorCXVkYXRhIGlzIHN0aWxsIE5VTEwsIGZhaWwgYW4gYXNzZXJ0aW9uLCBhbmQgdXNlIDAsIGluc3RlYWQgb2YKKwlkcm9wcGluZyBjb3JlLgorCitGcmkgQXVnIDIwIDEyOjE4OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZCAobWlwcy0qLWVsZmwqLCBtaXBzLSotZWxmKik6IE5ldyB0YXJnZXRzLCB1c2luZworCW1pcHNsZWxmIGFuZCBtaXBzYmVsZiByZXNwZWN0aXZlbHkuCisJKiBjb25maWcvbWlwc2xlbGYubXQsIGNvbmZpZy9taXBzYmVsZi5tdDogTmV3IGZpbGVzLgorCSogZWxmMzItbWlwcy5jOiBBZGRlZCBzb21lIHJlbG9jIGluZm9ybWF0aW9uLgorCSogY29uZmlndXJlLmluOiBGaXhlZCBlcnJvciBtZXNzYWdlLgorCisJKiBlY29mZi5jIChFQ09GRl9MT05HX1NJWkUpOiBSZW1vdmVkLiAgSnVzdCB1c2UgY29uc3RhbnRzLgorCitUaHUgQXVnIDE5IDA5OjQ1OjUxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTLCBBTExfTUFDSElORVMsIEJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUywKKwlPUFRJT05BTF9CQUNLRU5EUyk6IEFscGhhYmV0aXplIGVudHJpZXMgYW5kIGFkZCBhIGZldyBtaXNzaW5nIG9uZXMuCisJKiBhcmNodXJlcy5jOiBBbHBoYWJldGl6ZSBkZWNscy4KKworCSogY29uZmlndXJlLmluLCB0YXJnZXRzLmM6IEFkZCBtaXNzaW5nIHZlY3RvcnMgdG8gdGhlIHRhYmxlcy4KKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3RvcikgWyFTRUxFQ1RfVkVDU106IEFkZCBERUZBVUxUX1ZFQ1RPUi4KKwlSZW1vdmUgaHAzMDBic2RfdmVjIGR1ZSB0byBjbGFzaCB3aXRoIHN1bm9zX2JpZ192ZWMuCisKK1R1ZSBBdWcgMTcgMTg6MTI6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2kzODZ7bWFjaDMsb3NmMW1rfS5oOiBOZXcgZmlsZXMsIGZvciBNYWNoIGhvc3RpbmcuCisJKiBob3N0cy9pMzg2bWFjaC5oOiByZW1vdmVkLCByZXBsYWNlZCBieSBpMzg2b3NmMW1rLmguCisJKiBjb25maWcvaTM4Nm1hY2gzLm10LCBpMzg2bWFjaDMuYzogTmV3IGZpbGVzLCBmb3IgTWFjaCBhLm91dCBmb3JtYXQuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKwkqIGhvc3RzL2RlY3N0YXRpb24uaDogSW5jbHVkZSA8c3lzL3BhcmFtLmg+IG5vdCA8bWFjaGluZS9wYXJhbS5oPi4KKworVHVlIEF1ZyAxNyAxNToxOTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IElmIHNlY3Rpb24ncyBvdXRwdXRfc2VjdGlvbiBpcworCW5vdCB5ZXQgc2V0LCBwb2ludCB0byBpdHNlbGYuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMKKwljYWxsZWQgb24gdGhlIG91dHB1dCBmaWxlLCBub3QgdGhlIGlucHV0IGZpbGUuCisKKwkqIGNvZmYtcnM2MDAwLmMgKGR1bW15X3JlbG9jLCBSVFlQRTJIT1dUTyk6IFNldCBob3d0byBmaWVsZCB0byBhCisJZHVtbXkgdmFsdWUsIHJhdGhlciB0aGFuIGxlYXZpbmcgaXQgTlVMTC4KKworCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCk6IFNldCBiZmRfZXJyb3Igb24KKwlmYWlsdXJlLgorCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9hcmNoX21hY2gpKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4KKworVHVlIEF1ZyAxNyAwOTo0MjoxNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQgKGNwdSk6IEV4dHJhY3QgZnJvbSBjYW5vbmljYWwgbmFtZSB3aXRoIHNlZC4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBpdC4KKworU3VuIEF1ZyAxNSAyMDo0NTo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYmZkLWluLmg6IFJlbW92ZSB7QllURSxXT1JELExPTkd9X1NJWkU7IHRoZXkgYXJlIHBvaW50bGVzcyBhbmQKKwlCWVRFX1NJWkUgY29uZmxpY3RzIHdpdGggYSBNYWNoIGhlYWRlci4KKwkqIGVjb2ZmLmM6IENoYW5nZSBMT05HX1NJWkUgdG8gRUNPRkZfTE9OR19TSVpFIGFuZCBkZWZpbmUgaXQuCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBNYWtlIHN1cmUgYWxsIE9TIGZpZWxkcyBlbmQgaW4gKi4KKworRnJpIEF1ZyAxMyAxNjozMzozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogVXNlIGJmZF9hYnNfc2VjdGlvbiBmb3IKKwlSRUxPQ19TRUNUSU9OX05PTkUgYW5kIFJFTE9DX1NFQ1RJT05fQUJTLiAgSWYgYSByZWxvYyBzZWN0aW9uCisJZG9lc24ndCBleGlzdCwgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBpdC4KKworCSogbmxtY29kZS5oIChubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogcHJvY2VkdXJlIG9mZnNldHMgYXJlCisJZnJvbSBzdGFydCBvZiBjb2RlIHNlZ21lbnQsIG5vdCBzdGFydCBvZiBmaWxlLgorCSogY29uZmlnL2kzODYtbmxtLm10IChERUZBVUxUX1ZFQ1RPUik6IEl0J3MgbmxtMzJfaTM4Nl92ZWMsIG5vdAorCWJmZF9ubG0zMl9pMzg2X3ZlYy4KKwkqIGNvbmZpZ3VyZS5pbiAoU0VMRUNUX1ZFQ1Mgc3dpdGNoKTogTGlrZXdpc2UuCisKK1RodSBBdWcgMTIgMTA6MzI6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IElmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgZGVmYXVsdAorCXRhcmdldCwgc2V0IG1hdGNoX2NvdW50IHRvIDEsIHRvIGlnbm9yZSBhbnkgcHJldmlvdXMgbWF0Y2hlcy4KKworCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHNyZWMubywgYWRkIHJlbG9jMTYuby4KKworCSogY29uZmlndXJlLmluOiBBZGQgcmVsb2MxNi5vIHdoZW4gd2UgYWRkCisJY29mZi1oODMwMC5vLCBjb2ZmLWg4NTAwLm8sIGNvZmYtc2gubywgY29mZi16OGsuby4KKwlNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmUgcmVsb2MxNi5vLgorCisJKiBjb25maWcvdTY4ay1jb2ZmLm10OiBGaXggdHlwbywgREVGQVVMVF9UQVJHRVQgZm9yCisJREVGQVVMVF9WRUNUT1IuCisKKwkqIGNvbmZpZy9oODMwMC1jb2ZmLm10LCBoODUwMC1jb2ZmLm10LCBzaC1jb2ZmLm10LCBzdDIwMDAubXQsCisJejhrLWNvZmYubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmaW5lLiAgRG9uJ3QgZXhwbGljaXRseSBhZGQKKwlTLXJlY29yZHMgdmlhIFNFTEVDVF9WRUNTLgorCisJKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpLCBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBbHdheXMKKwlzdXBwb3J0IFMtcmVjb3JkcywgZm9yIGNvbnZlbmllbmNlLgorCitUaHUgQXVnIDEyIDA4OjMwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSwgYWxwaGFfZmluaXNoX3JlbG9jLAorCWFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfe2luLG91dH0sIGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6CisJUmVhZCBhbmQgd3JpdGUgQWxwaGEgcmVsb2NzLiAgQ2FuJ3QgcHJvY2VzcyB0aGVtIHlldC4KKwkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmVjb2duaXplIG5ldyByZWxvYyBzZWN0aW9ucy4KKwlJZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBjcmVhdGUgaXQuCisKKwkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl97aW4sb3V0fSk6IEhhbmRsZSBuZXcgZmllbGRzIGRlZmluZWQKKwlvbiB0aGUgQWxwaGEuCisKKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGNvbnN0cnVjdG9yX3JlbG9jIGFuZAorCWZpbmlzaF9yZWxvYyBmaWVsZHMuCisJKiBlY29mZi5jOiBNb3ZlIE1JUFMgcmVsb2Mgc3VwcG9ydCBmcm9tIGhlcmUuLi4KKwkqIGNvZmYtbWlwcy5jOiB0byBoZXJlLgorCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogR2V0IGNvbnN0cnVjdG9yIHJlbG9jIGhvd3RvCisJZnJvbSBiYWNrZW5kLgorCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBzdHVmZi4gIENhbGwKKwlmaW5pc2hfcmVsb2MgYmFja2VuZCBmdW5jdGlvbi4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIGFzc2VydGlvbnMuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19maW5pc2hfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogRmlsbCBpbiBuZXcgZmllbGRzLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgTlVMTCBmb3IgbmV3CisJZmllbGRzLgorCSogdGFyZ2V0cy5jOiBBZGRlZCBleHRlcm4gZm9yIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYy4KKworCSogYmZkLmMgKF9iZmRfaG9zdF9iaWdfZW5kaWFuKTogUmVtb3ZlZC4KKwkqIGJmZC1pbi5oIChIT1NUX0JZVEVfT1JERVJfQklHX1AsIGJmZF9oZWFkZXJfdHdpZGRsZV9yZXF1aXJlZCk6CisJUmVtb3ZlZC4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisKK1dlZCBBdWcgMTEgMTI6MTE6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWcuYmZkOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBjb25maWd1cmUuaW4uCisJKiBjb25maWd1cmUuaW46IFVzZSBpdCwgYW5kIHVzZSBzdGFuZGFyZCB0YXJnZXQgbmFtZXMgZm9yCisJLS13aXRoLXRhcmdldHMsIHJlcGxhY2luZyAtLXdpdGgtYmZkLXRhcmdldHMuCisKKwkqIGFyY2h1cmVzLmMgKGFyY2h1cmVzX2luaXRfdGFibGUpOiBBZGQgYmZkX3NoX2FyY2guCisKKwkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBjb2ZmLW02OGsubyBmb3IgbTY4a2NvZmZ1bl92ZWMuCisJSW5jbHVkZSBubG0zMi5vIGFuZCBubG0ubyBmb3IgYmZkX25sbTMyX2kzODZfdmVjLgorCUZpeCBlcnJvciBpbiBlcnJvciBtZXNzYWdlLgorCisJKiBvYXN5cy5jOiBNYWtlIGJmZF9lcnJvcl92ZWN0b3IgZXh0ZXJuLgorCisJKiBjb25maWd1cmUuaW46IEluY2x1ZGUgc3RhYi1zeW1zLm8gZm9yIGEub3V0L2Iub3V0IHRhcmdldHMKKwlhbmQgaHAzMDB7YnNkLGhwdXh9LgorCitXZWQgQXVnIDExIDA2OjQwOjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIHRoZSAuYnNzCisJc2VjdGlvbiBiZWZvcmUgc2V0dGluZyBvdXRwdXRfaGFzX2JlZ3VuLgorCShubG1fc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgYXJndW1lbnQgbmFtZXMgZnJvbQorCW1hbmdsZV9yZWxvY3NfZnVuYyBwcm90b3R5cGUuCisJKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgc2hhZG93aW5nIGxvY2FsIHZhcmlhYmxlLgorCURvbid0IHdyaXRlIG91dCBkZWJ1Z2dpbmcgc3ltYm9scyBpZiBkZWJ1Z0luZm9PZmZzZXQgaXMgLTEuICBBZGQKKwl0aGUgY29kZUltYWdlT2Zmc2V0IHRvIHRoZSBzdGFydCwgZXhpdCwgYW5kIGNoZWNrIHByb2NlZHVyZQorCW9mZnNldHMuCisJKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX3JlbG9jLCBubG1faTM4Nl9tYW5nbGVfcmVsb2NzKToKKwlEb24ndCBjaGVjayBwYXJ0aWFsX2lucGxhY2UgZmllbGQ7IGl0cyB2YWx1ZSBpcyBpcnJlbGV2YW50LgorCisJKiBCYXNlIHVzZSBvZiBzY28tY29yZSBvbiBob3N0LCBub3QgdGFyZ2V0LgorCSogY29uZmlndXJlLmhvc3QgKGlbMzRdODYtKi1zY28qKTogVXNlIGkzODZzY28gcmF0aGVyIHRoYW4gaTM4NnYuCisJKiBjb25maWcvaTM4Ni1zY28ubXQgKFRERUZJTkVTKTogUmVtb3ZlZC4KKwkqIGNvbmZpZy9pMzg2c2NvLm1oOiBOZXcgZmlsZSB0byB1c2Ugc2NvLWNvcmUuCisJKiBob3N0cy9pMzg2c2NvLmg6IE5ldyBmaWxlOyBqdXN0IGluY2x1ZGVzIGhvc3RzL2kzODZ2LmguCisKKwkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3toZHIsZXh0fV97aW4sb3V0fSk6IFVzZSBzaWduZWQKKwljb252ZXJzaW9ucyBmb3Igc29tZSBmaWVsZHMuCisKK1R1ZSBBdWcgMTAgMTM6MzI6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9ncHJlbF9yZWxvYyk6IElmIF9ncCBpcyBub3QgZGVmaW5lZCwgZ2l2ZSBhbgorCWVycm9yIHJhdGhlciB0aGFuIGFib3J0aW5nLgorCisJKiBsaWJubG0uaCAoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBtYWNoIGZpZWxkLgorCShubG1fbWFjaGluZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KKwkqIG5sbS5jIChubG1fbWtvYmplY3QpOiBTZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGZyb20gYmFja2VuZAorCWluZm9ybWF0aW9uLgorCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpOiBJbml0aWFsaXplIG5ldyBtYWNoIGZpZWxkLgorCitUdWUgQXVnIDEwIDA5OjMxOjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZXBsYWNlIGNhbGxzIHRvIHNvcnQgd2l0aCBzaGVsbCBjb2RlCisJdG8gdW5pcSB0aGUgbGlzdHMuCisKK1R1ZSBBdWcgMTAgMDY6MjM6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEluY2x1ZGUgYW91dDMyLm8gZm9yIGFueSBhLm91dC9iLm91dCBmb3JtYXRzLgorCitNb24gQXVnICA5IDA5OjM3OjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYtbGludXgubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBiZmRfZWxmMzJfaTM4Nl92ZWMuCisJKiBjb25maWcvbTY4ay1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBtNjhrY29mZl92ZWMuCisJKiBjb25maWcvaTM4Ni1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBpMzg2Y29mZl92ZWMuCisJKiBjb25maWcvaHBwYS1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBocHBhX3ZlYy4KKwkqIGNvbmZpZy9zcGFyYy1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBzdW5vc19iaWdfdmVjLgorCSogY29uZmlnL2kzODYtc2NvLm10IChTRUxFQ1RfVkVDUyk6IERvbid0IGRlZmluZTsgSWFuIHNheXMgaXQgd2FzCisJanVzdCBhIGhhY2suCisKK01vbiBBdWcgIDkgMTM6MTU6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTg4ay1jb2ZmLm10IChERUZBVUxUX1ZFQyAtPiBERUZBVUxUX1ZFQ1RPUik6IHJlbmFtZWQuCisKK01vbiBBdWcgIDkgMTQ6MjY6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBzeW1zLmMgKEJTRl9FWFBPUlQpOiBOb3cgc2FtZSBhcyBCU0ZfR0xPQkFMLgorCisJKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTmV3IGZ1bmN0aW9uLgorCitNb24gQXVnICA5IDExOjI5OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYmZkLWluLmggKGJmZF9nZXRfYXJjaGl0ZWN0dXJlLCBiZmRfZ2V0X21hY2hpbmUpOiBSZW1vdmVkCisJb2Jzb2xldGUgbWFjcm9zLgorCSogYmZkLWluMi5oOiBVcGRhdGVkLgorCisJKiBlY29mZi5jIChlY29mZl9zbHVycF9hcm1hcCk6IENvcnJlY3QgYnVnIGluIGluaXRpYWxpemF0aW9uIG9mCisJc3RyaW5nYmFzZS4KKworU3VuIEF1ZyAgOCAxMjoyMToxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHVubmVlZGVkIHRlc3QuCisKK1N1biBBdWcgIDggMTI6NDE6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh7ZGlzdCxyZWFsfWNsZWFuKTogVXNlICQoTUFLRSksIG5vdCBtYWtlLgorCitTYXQgQXVnICA3IDA5OjE0OjIxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3N0MjAwMC5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgTVJJOyBub3QgdXNlZC4KKworCSogUE9SVElORywgVE9ETywgY29uZmlnL1JFQURNRTogVXBkYXRlIHRvIHJlZmxlY3QgYmVsb3cgY2hhbmdlcy4KKworCSogY29uZmlndXJlLmluOiBSZXBsYWNlIE1JTklNSVpFIGFuZCAtLXdpdGgtbWluaW1hbC1iZmQgd2l0aAorCS0td2l0aC1iZmQtdGFyZ2V0cz0idGFyZ2V0MSx0YXJnZXQyLC4uLiIgYW5kIHRoZSBzcGVjaWFsIHRhcmdldAorCSJhbGwiIHRvIGdldCB0aGUgcHJldmlvdXMgZGVmYXVsdCBiZWhhdmlvci4KKwlGaWd1cmUgb3V0IHdoaWNoIGFyY2hpdGVjdHVyZSBhbmQgYmFja2VuZCAubyBmaWxlcyBhcmUgbmVlZGVkIGZyb20KKwlERUZBVUxUX1ZFQ1RPUiwgU0VMRUNUX1ZFQ1MsIGFuZCBTRUxFQ1RfQVJDSElURUNUVVJFUyBhcyBzZXQgaW4KKwl0aGUgLm10IGZpbGVzLiAgRGVmaW5lIFRERUZBVUxUUyBiYXNlZCBvbiB0aGVtLCBhbHNvLgorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gTUlOSU1JWkUuCisJKiBhcmNodXJlcy5jLCB0YXJnZXRzLmM6IERpdHRvLgorCisJKiBjb25maWcvKi5tdDogRGVmaW5lIERFRkFVTFRfVkVDVE9SLCBTRUxFQ1RfVkVDUywgYW5kCisJU0VMRUNUX0FSQ0hJVEVDVFVSRVMgYXMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGFzIC1EIGFyZ3VtZW50cyB0bworCVRERUZBVUxUUy4KKworCSogY29uZmlnL2EyOWstY29mZi5tdCxhbHBoYW9zZi5tdCwgaTM4Ni1zY28ubXQsIGk5NjAtYm91dC5tdCwKKwlpOTYwLWNvZmYubXQgKFRERUZBVUxUUyk6IERvbid0IHB1dCB0aGUgZGVmYXVsdCB2ZWN0b3IgaW4KKwlTRUxFQ1RfVkVDUyBtYW51YWxseTsgaXQncyBhdXRvbWF0aWMgbm93LgorCisJKiBjb25maWcvaTM4Ni1zY28ubXQgKFRERUZBVUxUUyk6IERvbid0IHB1dCAmc2NvX2NvcmVfdmVjIGluCisJU0VMRUNUX1ZFQ1MgbWFudWFsbHk7IC1EU0NPX0NPUkUgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IG5vdy4KKworCSogY29uZmlnL2g4MzAwLWNvZmYubXQsaDg1MDAtY29mZi5tdCxzaC1jb2ZmLm10LHN0MjAwMC5tdCx6OGstY29mZi5tdAorCShUREVGQVVMVFMpOiBEb24ndCBkZWZpbmUgQkZEOyBub3QgdXNlZC4KKworCSogY29uZmlnL2hwcGFvc2YubWggKEhERUZJTkVTKTogRG9uJ3QgZGVmaW5lIFNFTEVDVF9BUkNISVRFQ1RVUkVTOworCXRoaXMgaXMgYSBob3N0LCBub3QgYSB0YXJnZXQuCisKK1NhdCBBdWcgIDcgMDU6Mjg6MDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogIEFkZCBjb21tZW50IGFib3V0IHdoYXQgdGhpcyBmdW5jdGlvbgorCWRvZXMgYW5kIHRvIHdhdGNoIG91dCBmb3Igc2lkZSBlZmZlY3RzLiAgQWRkIEZJWE1FIGZvciBtZW1vcnkgbGVha3MuCisJRml4IGNvbW1lbnQgYWJvdXQgY2hlY2tpbmcgZm9yIG1hdGNoaW5nIGJ5dGUgb3JkZXIuICBQcmVzZXJ2ZQorCXBvaW50ZXIgdG8gb2xkIHRkYXRhIChpZiBhbnkpLCBhbmQgcmVzdG9yZSBpdCBpZiB3ZSBkb24ndCBtYXRjaAorCWZpbGUgd2l0aCB0YXJnZXQgdmVjdG9yLiAgSWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBnb3RvJ3MsIHVzZSB0aGVtCisJY29uc2lzdGVudGx5IGFuZCBtYWludGFpbmFibHkuCisJKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6ICBFeHBhbmQgY29tbWVudHMgYWJvdXQgbGVha2VkIG1lbW9yeQorCXRvIG5vdGUgdGhhdCB0aGUgcHJvYmxlbSBpcyBldmVuIG1vcmUgc2VyaW91cyB0aGFuIGp1c3QgbGVha2VkCisJbWVtb3J5LiAgUmVwbGFjZSBnb3RvIHdpdGggbW9yZSB0cmFkaXRpb25hbCByZXR1cm4uCisKK0ZyaSBBdWcgIDYgMTI6MDA6MDMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJRml4IGluY29ycmVjdCBvciB1c2VsZXNzIG1ha2VmaWxlIHZhcmlhYmxlIGRlZmluaXRpb25zOgorCSogY29uZmlnL25ld3MubXQsIGNvbmZpZy91NjhrLWNvZmYubXQgKFRERUZBVUxUUyk6IFVzZSB0aGlzIHRvCisJZGVmaW5lIERFRkFVTFRfVkVDVE9SLCBpbnN0ZWFkIG9mIFRERUZJTkVTLgorCSogY29uZmlnL2kzODZhaXgubWggKE1JTklNSVpFKTogRG9uJ3QgZGVmaW5lLgorCSogY29uZmlnL2hwcGFvc2YubWggKE1JTklNSVpFKTogRG9uJ3QgY29uZGl0aW9uYWxpemUuCisJKiBjb25maWcvcnM2MDAwLm1oIChBTExPQ0EpLAorCSogY29uZmlnL2kzODZ2Lm1oIChBTExPQ0EpLAorCSogY29uZmlnL2kzODZsaW51eC5taCAoQUxMT0NBKSwKKwkqIGNvbmZpZy9pMzg2aXNjLm1oIChBTExPQ0EpLAorCSogY29uZmlnL2dvMzIubWggKEVYVFJBTElCUyk6IERvbid0IGRlZmluZTsgbm90IHVzZWQuCisJKiBjb25maWcvc29sYXJpczIubWggKEhERUZJTkVTKTogUmVuYW1lZCBmcm9tIEhfREVGSU5FUy4KKwkqIGNvbmZpZy9hbHBoYW9zZi5tdCAoVERFRklORVMpOiBTZXQgaXQsIG5vdCBIREVGSU5FUy4KKwkqIGNvbmZpZy96OGstY29mZi5tdCAoQ0MpOiBEb24ndCBkZWZpbmUuICBJdCdzIGEgdGFyZ2V0LCBub3QgYSBob3N0LgorCisJKiBjb25maWcvUkVBRE1FOiBOZXcgZmlsZSwgZXhwbGFpbmluZyB0aGUgdmFyaWFibGVzLgorCisJKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGQgaHAzMDBfYnNkX3ZlYy4KKwkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUywgQ0ZJTEVTKTogQWRkIGhwMzAwYnNkLgorCShocDMwMGJzZC5vKTogTmV3IHJ1bGUuCisKK0ZyaSBBdWcgIDYgMTU6MTM6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBsaWJlbGYuaCAoTkFNRSk6IFByb3ZpZGUgYSBkZWZhdWx0IGRlZmluaXRpb24sIHRoYXQncyBuZWl0aGVyCisJZm9yIDMyIGJpdHMgbm9yIGZvciA2NC4KKworCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCisKKwkqIGxpYmVsZi5oIChlbGZfaGFzaCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBiZmRfZWxmX2hhc2gsIHNpbmNlCisJdGhhdCBpcyB3aGF0IGlzIGluIGVsZi5jLgorCitGcmkgQXVnICA2IDEyOjI4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVtb3ZlZCBzcGVjaWFsIGhhbmRsaW5nIGZvcgorCXNjQnNzIGFuZCBzY1NCc3Mgc3ltYm9scywgc2luY2UgaXQgd2FzIHdyb25nLgorCisJKiBNYWtlZmlsZS5pbiAoY29mZi1taXBzLm8sIGNvZmYtYWxwaGEubyk6IERvbid0IGRlcGVuZCBvbgorCWNvZmZjb2RlLmguCisKKwkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSW5zcGlyZWQgYnkgbWJAdHRpLkNPTSAoTWljaGFlbAorCUJsb29tKTogT25seSBzZXQgU1RZUF9CU1MgZm9yIFNFQ19BTExPQyBzZWN0aW9ucy4KKworCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfYXJtYXApOiBGcm9tIEFybmUgSGVucmlrIEp1dWwKKwk8YXJuZWpAa2FyaS5mbS51bml0Lm5vPjogSGFuZGxlIGEgQ09GRiBzdHlsZSBhcm1hcC4KKworRnJpIEF1ZyAgNiAwOTo1OTo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaHB1eC1jb3JlLmM6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gYmZkX3phbGxvYy4KKworVGh1IEF1ZyAgNSAxMzoyMjo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGxvZzIpOiBEZWxldGUgaTM4Ny1zcGVjaWZpYyBjb2RlLgorCisJKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBbHdheXMgaW5jbHVkZSBlbGYuby4KKwkoQkZEMzJfQkFDS0VORFMpOiBEb24ndCBpbmNsdWRlIGVsZi5vIGhlcmUuCisJKG9maWxlcyk6IERlbGV0ZSByZWZlcmVuY2VzIHRvIG9maWxlczIgYW5kIG9maWxlczMuCisJKGRvX2NsZWFuKTogRGVsZXRlIG9maWxlcy4KKwkoQkZESU5fSCk6IENoYW5nZWQgcmVmZXJlbmNlcyB0byAkKHNyY2RpcikvYmZkLWluMi5oLgorCShzdG1wLWJmZC5oKTogVXNlIGJmZC5oLW5ldyBhcyB0ZW1wb3JhcnkgbmFtZSwgbm90IGJmZC5oMi4KKwkoaGVhZGVycyk6IFVzZSBiZmQtaW4yLmgtbmV3IGFzIHRlbXBvcmFyeSBuYW1lLCBub3QgYmZkLmgtbmV3LgorCisJKiBiZmQtaW4uaDogUmV3b3JkZWQgY29tbWVudCB0byBtYWtlIGl0IGNsZWFyIHRoYXQgYmZkLWluMi5oIGlzIGEKKwlnZW5lcmF0ZWQgZmlsZS4KKworCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgaTM4Ni1lbGYgcmVsb2MgdHlwZXMKKwkoZnJvbSBNZWlzc25lcidzIGFkZGl0aW9ucyB0byBiZmQtaW4yLmgpLgorCisJKiBlbGYzMi1pMzg2LmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KKworCU1lcmdlZDoKKworCVdlZCBKdW4gMjMgMDY6MDU6NTggMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCisKKwkqIGVsZmNvZGUuaCAoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGRyb3AgY29yZSBpZgorCWVsZl9zeW1ib2xfZnJvbSByZXR1cm5zIGEgTlVMTCBwb2ludGVyIHdoZW4gcHJvY2Vzc2luZyBhIG5vbi1lbGYKKwlzeW1ib2wsIHVzZSBhIDAgc2l6ZSBpbnN0ZWFkLgorCisJVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKKworCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IERlbGV0ZSBtYWNybyBtYXBwaW5nIGVsZl9oYXNoIHRvCisJYmZkX2VsZjMyX2hhc2gsIHNpbmNlIHRoZSBoYXNoIHRhYmxlIGlzIGluZGVwZW5kZW50IG9mIHRoZSAzMi82NAorCWJpdCBzeXN0ZW0uCisKKwkqIGxpYmVsZi5oIChlbGZfaGFzaCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBiZmRfZWxmX2hhc2gsIHNpbmNlCisJdGhhdCBpcyB3aGF0IGlzIGluIGVsZi5jLgorCisJU2F0IEp1biAxOSAxMDoxMjoyNyAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKKworCSogZWxmMzItaTM4Ni5oIChyZWxvY190eXBlKTogUmVmb3JtYXQgc3BhY2luZy4KKwkoZWxmX2hvd3RvX3RhYmxlKTogQWRkIHRoZSByZXN0IG9mIHRoZSAzODYvRUxGIHJlbG9jYXRpb25zLgorCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgorCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogRGl0dG8uCisJKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogRGl0dG8uCisKK1RodSBBdWcgIDUgMTA6MDc6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG5sbWNvZGUuaCAobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6ICBUZXN0IHJldHVybiB2YWx1ZQorCW9mIG5sbV9zbHVycF9zeW1ib2xfdGFibGUgYXMgYm9vbGVhbiwgbm90IHBvaW50ZXIuCisJKiBubG1jb2RlLmggKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiAgVGVzdCByZXR1cm4gdmFsdWUKKwlvZiBubG1fc2x1cnBfcmVsb2NfZml4dXBzIGFzIGJvb2xlYW4sIG5vdCBwb2ludGVyLgorCitXZWQgQXVnICA0IDE2OjIyOjU1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2dvMzIubWg6IHJlbW92ZSBIREVGSU5FUzsgc2luY2UgX19NU0RPU19fIGFuZCBfX0dPMzJfXworCWFyZSBub3cgcHJlZGVmaW5lZCBieSBHQ0MKKworV2VkIEF1ZyAgNCAxNjowNjoyOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBBZGQgdGhlIHNlY3Rpb24gb2Zmc2V0IHRvIHRoZQorCWxpbmUgbnVtYmVyIGFkZHJlc3MsIHNvIGl0J3MgcHJpbnRlZCB0aGUgc2FtZSB3YXkgYXMgdGhlIGZ1bmN0aW9uCisJYWRkcmVzcy4gIE9ubHkgc2hvd2VkIHVwIGZvciBsaW5lIG51bWJlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpcnN0CisJc2VjdGlvbiAoLnRleHQpLgorCitXZWQgQXVnICA0IDA4OjMzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBubG1fbWFuZ2xlX3JlbG9jcy4KKwkobmxtX21hbmdsZV9yZWxvY3NfZnVuYyk6IE5ldyBtYWNyby4KKwkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfcmVsb2MpOiBSZXdyb3RlIGNvcnJlY3RseS4KKwkobmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KKwkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE1vdmUgYWxsIGNvbW1vbgorCXN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLgorCShubG1fc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIHRoZSBtYW5nbGVfcmVsb2NzIGZ1bmN0aW9uLgorCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGFueSBkZWZpbmVkCisJc3ltYm9sIGFzIGFuIGludGVybmFsIHJlbG9jLiAgRml4IGJ1ZyBpbiBleHRlcm5hbCByZWxvYyBjb3VudGluZy4KKwlHZXQgdGhlIG9mZnNldCBhbmQgZGVidWdnaW5nIHR5cGUgcmlnaHQgZm9yIC5ic3Mgc3ltYm9scy4gIE9ubHkKKwlvdXRwdXQgZGVidWdnaW5nIHN5bWJvbHMgZm9yIGRlZmluZWQgc3ltYm9scy4KKworCSogY29mZi1oODUwMC5jIChydHlwZTJob3d0byk6IERvIGFuIGZwcmludGYgdG8gc3RkZXJyIHJhdGhlciB0aGFuCisJdXNpbmcgcHJpbnRmLgorCSogY29mZi16OGsuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KKwkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KKwkqIGVsZjMyLWkzODYuYyAoVFJBQ0UpOiBMaWtld2lzZS4KKwkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlLCBzd2FwX3N0ZF9yZWxvY19pbik6IExpa2V3aXNlLgorCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IERvIGFuIGZwcmludGYgdG8gdGhlIGZpbGUKKwlhcmd1bWVudCByYXRoZXIgdGhhbiB1c2luZyBwcmludGYuCisKK1R1ZSBBdWcgIDMgMTg6MTc6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2Zmc3dhcC5oOiBBZGRlZCBtYWNyb3MgdXNlZCB3aGVuIGFjY2Vzc2luZyBzZXZlcmFsIGZpZWxkczsKKwlkZWZhdWx0IGlzIHRoZSBzYW1lIGFzIGJlZm9yZS4KKwkoY29mZl9zd2FwX2FvdXRoZHJfe2luLG91dH0pOiBIYW5kbGUgdGhlIEFscGhhIEVDT0ZGIGZpZWxkcy4KKwkqIGNvZmYtYWxwaGEuYzogRGVmaW5lZCBtYWNyb3MgdG8gdXNlIHRoZSByaWdodCBzaXplcyBpbgorCWNvZmZzd2FwLmguCisJKiBsaWJlY29mZi5oOiBCYWNrZW5kIGluZm9ybWF0aW9uIGlzIG5vdyBpbiB0YXJnZXQgdmVjdG9yLCBub3QKKwlCRkQuICBTdGFydCBvZiBiYWNrZW5kIGluZm9ybWF0aW9uIGlzIENPRkYgYmFja2VuZCBpbmZvcm1hdGlvbi4KKwkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmM6IENoYW5nZWQgYWNjb3JkaW5nbHkuCisJKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IE5ldyBmdW5jdGlvbi4KKwkoQVJNQVBfU1RBUlQpOiBDaGFuZ2VkIGludG8gYmFja2VuZCBpbmZvcm1hdGlvbiwgc2luY2UgQWxwaGEgdXNlcworCWEgZGlmZmVyZW50IG5hbWUuCisJKGVjb2ZmX3NsdXJwX2FybWFwKTogRG9uJ3Qgb3ZlcmxheSBhcmNoaXZlIGhlYWRlci4KKwkqIGJmZC5jOiBJbmNsdWRlIGxpYmNvZmYuaC4KKworVHVlIEF1ZyAgMyAxNjozMzoxMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IHNoIHN5bnRheCBlcnJvci4KKworCSogYW91dGYxLmg6IE1ha2UgYmZkX2Vycm9yX3RyYXAgZXh0ZXJuOyBpdCdzIGRlZmluZWQgaW4gYmZkLmMuCisKK1R1ZSBBdWcgIDMgMTU6MTk6MDkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG5sbV9zbHVycF9zeW1ib2xfdGFibGU6IERvbid0IHVzZSAnJicgb24gYXJyYXlzLgorCitUdWUgQXVnICAzIDExOjA2OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYzogTmV3IGZpbGUgZm9yIGdlbmVyaWMgRUNPRkYgZnVuY3Rpb25zLgorCSogZWNvZmZzd2FwLmg6IE5ldyBmaWxlIGZvciBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMgd2hpY2ggZGlmZmVyCisJb25seSBzbGlnaHRseSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCisJKiBsaWJlY29mZi5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBlY29mZi5jIGZ1bmN0aW9ucy4KKwkoZWNvZmZfYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZS4KKwkoZWNvZmZfdGRhdGEpOiBBZGRlZCBiYWNrZW5kX2RhdGEgZmllbGQuICBDaGFuZ2VkIGV4dGVybmFsIGRhdGEKKwlwb2ludGVycyB0byBiZSBQVFIgcmF0aGVyIHRoYW4gdG8gYSBwYXJ0aWN1bGFyIHN0cnVjdC4KKwkoZWNvZmZfc3ltYm9sX3N0cnVjdCk6IE1vdmVkIGluIGZyb20gY29mZi1taXBzLmMuCisJKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jOiBNb3ZlZCBjb21tb24gZnVuY3Rpb25zIGludG8gZWNvZmYuYy4KKwlBZGRlZCBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZXMuICBJbmNsdWRlIGVjb2Zmc3dhcC5oLgorCSogY29mZi1tc3ltLmM6IFJlbW92ZWQ7IHN1cGVyc2VkZWQgYnkgZWNvZmZzd2FwLmguCisJKiBiZmQuYzogSW5jbHVkZSBjb2ZmL2ludGVybmFsLmguCisJKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmVkIGNvZmYtbWlwcy5vIGFuZCBjb2ZmLW1zeW0uby4KKwlBZGRlZCBlY29mZi5vLgorCShCRkQ2NF9CQUNLRU5EUyk6IEFkZGVkIGNvZmYtYWxwaGEuby4KKwkoQ0ZJTEVTKTogUmVtb3ZlZCBjb2ZmLW1zeW0uYy4gIEFkZGVkIGVjb2ZmLmMuCisJKGJmZC5vKTogQWRkZWQgZGVwZW5kZW5jeSBvbiAkKElOQ0RJUikvY29mZi9zeW0uaC4KKwkoY29mZi1taXBzLm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGVjb2Zmc3dhcC5oIGFuZCBjb2ZmL2Vjb2ZmLmguCisJKGVjb2ZmLm8sIGNvZmYtYWxwaGEubyk6IE5ldyB0YXJnZXRzLgorCShjb2ZmLW1zeW0ubyk6IFJlbW92ZWQgdGFyZ2V0LgorCitNb24gQXVnICAyIDIzOjMzOjM4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBlbGYzMi1ocHBhLmgsIGhvc3RzLyo6ICBSZW1vdmUgKG9uZSBtb3JlIHRpbWUpIGFsbCBvY2N1cnJhbmNlcworCW9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcy4gIEhlYXZlIGhvIQorCitNb24gQXVnICAyIDE2OjQ1OjU3IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogIEFkZCBjaGVjayBmb3IgSTM4NkxZTlhNQUdJQy4KKworTW9uIEF1ZyAgMiAxMjoxODowMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL3N1bjMuaDogcmVtb3ZlIHNvbWUgbW9yZSBjb25mbGljdGluZyBkZWNscworCitNb24gQXVnICAyIDExOjQ4OjIzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGkzODZseW54LmM6ICBSZW1vdmUgdW5uZWNlc3NhcnkgZGVmIG9mIE5fSEVBREVSX0lOX1RFWFQsCisJcmVkZWZpbmUgVEVYVF9TVEFSVF9BRERSIHRvIGJlIDAuCisKK1N1biBBdWcgIDEgMjI6NTQ6MDggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS5pbiwgaG9zdHMvaTM4Nmx5bnguaDogIEx5bngvMzg2CisJaG9zdCBhbmQgdGFyZ2V0IGluZm8uCisKK0ZyaSBKdWwgMzAgMTg6MDg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG0zMi1pMzg2LmM6IE5ldyBmaWxlLiAgRmlyc3QgY3V0IGF0IGkzODYgTkxNIGNvZGUuCisJKiBsaWJubG0uaDogQWRkZWQgc29tZSBtb3JlIHByb3RvdHlwZXMuCisJKHN0cnVjdCBubG1fcmVsZW50KTogTmV3IHN0cnVjdHVyZS4KKwkobmxtTkFNRShzeW1ib2xfdHlwZSkpOiBBZGRlZCByY250IGFuZCByZWxvY3MgZmllbGRzLgorCShzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IEFkZGVkIG5ldyBmaWVsZHM6IG5sbV9zeW1ib2xzLAorCW5sbV90ZXh0X2xvdywgbmxtX2RhdGFfbG93LCBubG1fcmVsb2NfZml4dXBzLAorCW5sbV9yZWxvY19maXh1cF9zZWNzLgorCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUsIHdpdGggYWNjZXNzb3IgbWFjcm9zLgorCSogbmxtY29kZS5oOiBVc2UgTkxNX0hJQklUIHJhdGhlciB0aGFuIE1TQi4KKwkobmxtX29iamVjdF9wKTogU2V0IFNFQ19SRUxPQyBmb3IgLnRleHQgYW5kIC5kYXRhLiAgRG9uJ3Qgc2V0CisJU0VDX0RBVEEgZm9yIC5ic3MuICBTZXQgSEFTX1JFTE9DIGFuZCBIQVNfU1lNUyBmb3IgYWJmZC4gIFNldCB0aGUKKwlhcmNoaXRlY3R1cmUuCisJKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQsCisJZmluZF9ub256ZXJvLCBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBOZXcgb3V0Ym91bmQKKwlzd2FwcGluZyBmdW5jdGlvbnMuCisJKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogSW5jbHVkZQorCWV4dGVybmFsIHJlZmVyZW5jZXMgaW4gc3ltYm9sIHRhYmxlIGFzIHVuZGVmaW5lZCBzeW1ib2xzLgorCShubG1fZ2V0X3N5bXRhYiwgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpbGwgaW4gYWxvY2F0aW9uCisJYXJndW1lbnQgaW4gZ2V0X3N5bXRhYiByYXRoZXIgdGhhbiBpbiBzbHVycF9zeW1ib2xfdGFibGUuCisJKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTYXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBpbiB0ZGF0YS4KKwkobmxtX3ByaW50X3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KKwkobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcywgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCwKKwlubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTmV3IGZ1bmN0aW9ucyB0byByZWFkIHJlbG9jcy4KKwkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzLAorCW5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlLCBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTmV3CisJZnVuY3Rpb25zIHRvIGNyZWF0ZSBOTE0gZmlsZXMuCisJKiBubG0tdGFyZ2V0Lmg6IERlZmluZSBhbGwgdGhlIG5sbSBmdW5jdGlvbnMgaGVyZSBlaXRoZXIgYXMKKwlkZWZhdWx0IHZhbHVlcyBvciBpbiB0ZXJtcyBvZiBubG1OQU1FLiAgVXNlIEpVTVBfVEFCTEUobmxtKS4gIFNldAorCXRoZSBiYWNrZW5kX2RhdGEgZmllbGQgdG8gVEFSR0VUX0JBQ0tFTkRfREFUQS4KKwkqIG5sbTMyLWdlbi5jLCBubG02NC1nZW4uYzogRG9uJ3QgZGVmaW5lIGZ1bmN0aW9uIG1hY3JvcyBoZXJlOworCXRoZXkgYXJlIG5vdyBpbiBubG0tdGFyZ2V0LmguCisJKFRBUkdFVF9CQUNLRU5EX0RBVEEpOiBEZWZpbmUgYXMgTlVMTC4KKwkqIG5sbS5jIChubG1fbWtvYmplY3QpOiBEbyBhbGxvY2F0ZSB0aGUgdGRhdGEgZmllbGQuCisJKG5sbV9zZXRfYXJjaF9tYWNoKTogTmV3IGZ1bmN0aW9uLgorCSogdGFyZ2V0cy5jOiBBZGRlZCBubG0zMl9pMzg2X3ZlYy4KKwkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZGVkIG5sbTMyLWkzODYuby4KKwkoQ0ZJTEVTKTogQWRkZWQgbmxtMzItaTM4Ni5jLgorCShubG0zMi1nZW4ubywgbmxtNjQtZ2VuLm8pOiBEZXBlbmQgb24gbmxtLXRhcmdldC5oLgorCShubG0zMi1pMzg2Lm8pOiBOZXcgdGFyZ2V0LgorCitUaHUgSnVsIDI5IDIwOjIwOjM5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogaG9zdHMvc3VuMy5oOiByZW1vdmUgc29tZSBmdW5jdGlvbiBkZWNscyB0aGF0IGNvbmZsaWN0IHcvIEFOU0kKKwlDLCBhbmQgYXJlbid0IG5lZWRlZCBhbnl3YXkgKHJldHVybiBpbnQpCisKK1dlZCBKdWwgMjggMTU6NDY6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmg6IFVzZSBjYXN0cyB3aXRoIGJmZF9hbGxvYyBhbmQgYWxsb2NhLgorCitUdWUgSnVsIDI3IDEyOjUxOjQzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBubG17MzIsNjR9LWdlbi5jIChKVU1QX1RBQkxFX1BSRUZJWCk6ICBEZWxldGUuCisJKiBubG17MzIsNjR9LWdlbi5jIChKVU1QX1RBQkxFX0lOSVQpOiAgTmV3IG1hY3JvIHRoYXQgd29ya3Mgd2l0aAorCW9sZGVyIGNwcCdzLCB0aGF0IGRvbid0IGRvIGFkZGl0aW9uYWwgcmVwbGFjZW1lbnQgb24gdGhlIEpVTVBfVEFCTEUKKwltYWNybydzIGFyZ3VtZW50LgorCSogbmxtLXRhcmdldC5oIChKVU1QX1RBQkxFX0lOSVQpOiAgVXNlIG5ldyBtYWNybyBpbiBwbGFjZSBvZgorCUpVTVBfVEFCTEUgbWFjcm8uCisKK01vbiBKdWwgMjYgMTc6Mzk6MDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlZZXQgYW5vdGhlciB0cmFkLWNvcmUgdmFyaWFudDoKKwkqIGNvbmZpZy9lc2l4Lm1oLCBob3N0cy9lc2l4Lmg6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5ob3N0czogVXNlIHRoZW0uCisKK01vbiBKdWwgMjYgMTM6MjI6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIHRoZSBjYXNlIG9mCisJY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHJpZ2h0c2hpZnQgPiBiaXRwb3MsIGFuZCBhIG5lZ2F0aXZlCisJbnVtYmVyLgorCitNb24gSnVsIDI2IDE0OjQwOjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oOiBSZWltcGxlbWVudCBzZWdtZW50IHdyaXRpbmcuCisJKGVsZl93cml0ZV9waGRycyk6IFVzZSBwcmVjb21wdXRlZCBlX3Bob2ZmIHJhdGhlciB0aGFuIG1ha2luZworCWFzc3VtcHRpb25zLgorCShlbGZfYnVpbGRfcGhkcnMpOiBEaXNhYmxlZCwgZm9yIG5vdy4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBEb24ndCBjaGFuZ2UgZmlsZSBvZmZzZXQgZm9yCisJU0hUX05PQklUUy4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBOZXcgZnVuY3Rpb24uCisJKHN0cnVjdCBzZWdfaW5mbyk6IE5ldyB0eXBlLgorCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IE5ldyBmdW5jdGlvbi4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBGb3IgZXhlY3V0YWJsZXMsIGxlYXZlCisJc2VjdGlvbiBoZWFkZXJzICZjIGZvciBsYXN0LCBhbmQgcHJvcGVybHkgYWxpZ24gYWxsIHNlY3Rpb25zIHdpdGgKKwlmbGFnIFNIRl9BTExPQyBzZXQuCisJKHByZXBfaGVhZGVycyk6IE5vIGxvbmdlciBhYm9ydCB3aGVuIEVYRUNfUCBpcyBzZXQuCisJKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVsZXRlZCBhbGwgY29kZSByZWxhdGluZyB0byBwcm9ncmFtCisJc2VnbWVudHMuCisKKwkqIGVsZmNvZGUuaCAodmFyaW91cyk6IERlbGV0ZWQgc29tZSB1bnVzZWQgY29kZSwgYW5kIGRlYnVnZ2luZworCSJtYWxsb2MoMCkiIGNhbGxzLgorCSh3cml0ZV9yZWxvY3MpOiBDYWNoZSB2YWx1ZSBvZiBsYXN0IHN5bWJvbCBsb29rZWQgdXAsIHRvIHNhdmUKKwl0aW1lIGlmIHRoZSBzeW1ib2wgaXMgcmVmZXJyZWQgdG8gcmVwZWF0ZWRseS4KKwkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayBvbmx5IFNFQ19SRUxPQyBmbGFnLCBub3QgbnVtYmVyIG9mCisJcmVsb2NzLgorCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogTGlrZXdpc2UuCisKKwkqIE1ha2VmaWxlLmluIChvZmlsZXMpOiBTdGFycyBpbiB3aWxkY2FyZHMgYmVsb25nIG91dHNpZGUgcXVvdGVzLgorCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQsIG1heHBhZ2VzaXplLgorCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCwgcGhkci4KKwkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBJbml0aWFsaXplIG1heHBhZ2VzaXplIGZyb20KKwlFTEZfTUFYUEFHRVNJWkUuCisJKEVMRl9NQVhQQUdFU0laRSk6IERlZmF1bHQgdG8gMS4KKwkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQsIEVMRl9NQVhQQUdFU0laRSk6IExpa2V3aXNlLgorCSogZWxmMzItc3BhcmMuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgorCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBBbGwgcmVsb2NzIHNob3VsZCBoYXZlIHBjcmVsX29mZnNldD10cnVlLgorCU1vc3Qgc2hvdWxkIGhhdmUgbGVuZ3RoIGZpZWxkIG9mIGAyJy4KKworCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSA2NC1iaXQgcmVsb2NzLgorCisJKiBjb25maWcvc3BhcmMtYW91dC5tdCAoVEFSR0VUX0JBQ0tFTkRTKTogRGVmaW5lLgorCitNb24gSnVsIDI2IDA4OjU2OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBEb24ndCBsb29rIGluICR7c3JjZGlyfSBmb3IgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ307CisJdGhlIHRvcCBsZXZlbCBzY3JpcHQgaGFzIGFscmVhZHkgYWRqdXN0ZWQgZm9yIGl0LgorCitNb24gSnVsIDI2IDA4OjA5OjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogIEdldCBDUiBMRiBpbiB0aGUgcmlnaHQgb3JkZXIuCisKK01vbiBKdWwgMjYgMDI6MDg6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL3ZheGJzZC5oOiBJbmNsdWRlIHN0ZC1ob3N0LmguICBEb24ndCBpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+LgorCitTYXQgSnVsIDI0IDE2OjEzOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSBjYXNlIG9mIHJpZ2h0c2hpZnQgIT0KKwliaXRwb3Mgd2hlbiBvdmVyZmxvdyBjaGVja2luZy4KKworRnJpIEp1bCAyMyAxMDoyMDoyNyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBiZmQuYyAoYmZkX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwgYmZkX3VuZGVmaW5lZF9zeW1ib2wsCisJYmZkX3JlbG9jX3ZhbHVlX3RydW5jYXRlZCwgYmZkX3JlbG9jX2lzX2Rhbmdlcm91cywgYmZkX2Fzc2VydCk6CisJU2VuZCBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIuCisKK1RodSBKdWwgMjIgMTU6NTc6MjkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG5sbXszMiw2NH0tdGFyZ2V0Lmg6ICBSZW1vdmUuCisJKiBubG0tdGFyZ2V0Lmg6ICBOZXcgZmlsZSwgbWVyZ2VkIGZyb20gbmxtezMyLDY0fS10YXJnZXQuaAorCSogbGlibmxtLmggKE5MTV9BUkNIX1NJWkUpOiAgRGVmaW5lIHRvIEFSQ0hfU0laRS4KKwkqIG5sbS5jIChBUkNIX1NJWkUpOiAgUmVtb3ZlIGRlZmluZSB0byB6ZXJvLgorCSogbmxtMzItZ2VuLmMgKEFSQ0hfU0laRSk6ICBEZWZpbmUgdG8gMzIuCisJKiBubG0zMi1nZW4uYyAoSlVNUF9UQUJMRV9QUkVGSVgpOiAgRGVmaW5lIHRvIG5sbTMyLgorCSogbmxtezMyLDY0fS1nZW4uYyAobmxtLXRhcmdldC5oKTogIEluY2x1ZGUuCisJKiB0YXJnZXRzLmMsIGxpYm5sbS5oLCBubG0uYywgbmxtezMyLDY0fS1nZW4uYywgbmxtezMyLDY0fS5jLAorCW5sbWNvZGUuaDogIENvbnZlcnQgcHJlZml4ZXMgZnJvbSBiZmRfbmxtPHNpemU+IHRvIGp1c3QKKwlubG08c2l6ZT4sIGFuZCB1c2UgbWFjcm9zIHNlbGVjdCBzaXplLgorCitUaHUgSnVsIDIyIDE1OjQwOjE0IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogYWRkIGNvbmZpZ3VyZS5pbiwgZHJvcCByZWR1bmRhbnQKKwkgICQoc3JjZGlyKSwgZHJvcCByZWR1bmRhbnQgLi8KKworVGh1IEp1bCAyMiAxMzozNDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGhwdXgtY29yZS5jOiBOZXcgZmlsZTsgYmFja2VuZCBmb3IgSFAvVVggc3R5bGUgY29yZSBmaWxlcy4KKwkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IFJlbmFtZWQgaHBwYV9jb3JlX2RhdGEgZmllbGQgdG8KKwlocHV4X2NvcmVfZGF0YS4KKwkqIGJmZC1pbjIuaDogVXBkYXRlZC4KKwkqIGhwcGEuYyAobWFrZV9iZmRfYXNlY3Rpb24sIGhwcGFfY29yZV9maWxlX3AsCisJaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLCBocHBhX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwKKwlocHBhX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IE1vdmVkIGludG8gaHB1eC1jb3JlLmMuCisJUmVtb3ZlZCBmcm9tIHRhcmdldCB2ZWN0b3IuCisJKiBsaWJocHBhLmggKHN0cnVjdCBocHBhX2NvcmVfc3RydWN0IGFuZCBhY2Nlc3NvciBtYWNyb3MpOiBNb3ZlZAorCWludG8gaHB1eC1jb3JlLmMuCisJKiB0YXJnZXRzLmM6IElmIEhQVVhfQ09SRSBpcyBkZWZpbmVkLCBhZGQgaHB1eF9jb3JlX3ZlYyB0bworCXRhcmdldCBsaXN0LgorCSogY29uZmlnL2hwMzAwLm1oIChIREVGSU5FUyk6IFNldCB0byAtREhQVVhfQ09SRS4KKwkoSERFUEZJTEVTKTogU2V0IHRvIGhwdXgtY29yZS5vLgorCSogY29uZmlnL2hwcGFic2QubWgsIGNvbmZpZy9ocHBhaHB1eC5taDogTGlrZXdpc2UuCisJKiBob3N0cy9ocDMwMC5oIChIT1NUX0hQMzAwSFBVWCk6IERlZmluZS4KKwkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6IEFkZGVkIHNjby1jb3JlLm8sCisJYWl4Mzg2LWNvcmUubywgaHB1eC1jb3JlLm8uCisJKHNjby1jb3JlLm8sIGFpeDM4Ni1jb3JlLm8sIGhwdXgtY29yZS5vKTogTmV3IGRlcGVuZGVuY2llcy4KKworCSogcmVsb2MuYyAoZW51bSBjb21wbGFpbl9vdmVyZmxvdyk6IE5ldyBlbnVtZXJhdGlvbiB3aXRoIHRoZQorCXZhcmlvdXMgZmxhdm91cnMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcuCisJKHNydHVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBDaGFuZ2VkIGNvbXBsYWluX29uX292ZXJmbG93IGZpZWxkCisJZnJvbSBib29sZWFuIHRvIGVtdW0gY29tcGxhaW5fb3ZlcmZsb3cuICBSZW1vdmVkIG9ic29sZXRlIGFic29sdXRlCisJZmllbGQuCisJKEhPV1RPKTogUmVtb3ZlZCBhYnNvbHV0ZSBhcmd1bWVudC4KKwkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvIG92ZXJmbG93IGNoZWNraW5nIG9uIGFsbCB0eXBlcyBvZgorCWZpZWxkcy4KKwkqIGJmZC1pbjIuaDogVXBkYXRlZCBhY2NvcmRpbmdseS4KKwkqIGFsbCB0YXJnZXRzOiBVcGRhdGVkIGluaXRpYWxpemF0aW9uIG9mIHJlbG9jIGhvd3RvIHRhYmxlcy4KKworV2VkIEp1bCAyMSAyMDozNDozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIG9wbmNscy5jIChiZmRfY3JlYXRlKTogRG9uJ3QgdXNlIEMrKyBrZXl3b3JkICJ0ZW1wbGF0ZSIgYXMgYSBDCisJdmFyaWFibGUgbmFtZS4KKworVHVlIEp1bCAyMCAxNTowMjoyMyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1tNjhrLmMgKG02OGtfaG93dG8ycnR5cGUpOiAgTWFrZSBhcmcgQ09OU1QgdG8gbWF0Y2ggY2FsbGVycy4KKworCSogZWxmY29kZS5oOiAgRml4IHNldmVyYWwgaWxsZWdhbCBwb2ludGVyIGNvbWJpbmF0aW9uIHdhcm5pbmdzIGZvcgorCXVzYWdlcyBvZiBiZmRfYWxsb2MgYW5kIGFsbG9jYS4KKworCSogbGlibmxtLmggKG5sbV9vYmpfdGRhdGEpOiAgUmVuYW1lIGhpZGRlbiBzdHJ1Y3QgbWVtYmVycyB0byBhdm9pZAorCWFwcGFyZW50IFN1biBDIHByZXByb2Nlc3NvciByZWN1cnNpb24uICBGaXggYWNjZXNzIG1hY3Jvcy4KKwkqIG5sbWNvZGUuaDogIFJlbW92ZSBzcHVyaW91cyAnJicgYmVmb3JlIHNldmVyYWwgYXJyYXkgcmVmZXJlbmNlcy4KKworVHVlIEp1bCAyMCAxNDozNjoyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogUmVuYW1lIGZvciBET1MgdW5pcXVlbmVzczogY29mZi1tNjhrLXVuLmMgLT4gY29mZi11NjhrLmMKKwljb25maWcvbTY4ay1jb2ZmdW4ubXQgLT4gdTY4ay1jb2ZmLm10LgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCitUdWUgSnVsIDIwIDE2OjIxOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRG9uJ3QgdXNlICImIiBiZWZvcmUKKwlmdW5jdGlvbiBuYW1lOyBpdCdzIHZhbGlkIHdpdGhvdXQsIGFuZCBzb21lIGNvbXBpbGVycyBnaXZlCisJd2FybmluZ3Mgd2l0aCBpdCB0aGVyZS4KKworVHVlIEp1bCAyMCAwODoyMToxNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYmZkLWluLmg6ICBBcHBseSBzb21lIG9mIHRoZSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIHRvIGJmZC1pbjIuaC4KKwkqIGJmZC5jICh1bmlvbiB0ZGF0YSk6ICBBZGQgbmxtX29ial9kYXRhOworCSogdGFyZ2V0cy5jIChlbnVtIHRhcmdldF9mbGF2b3VyKTogIEFkZCBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLgorCitNb24gSnVsIDE5IDIwOjQ2OjE4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlLCBpWzM0XTg2LSotbmV0d2FyZSk6ICBOZXcgY29uZmlncy4KKwkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6ICBBZGQgbmxtLm8sIG5sbTMyLm8sIG5sbTMyLWdlbi5vLgorCSogTWFrZWZpbGUuaW4gKEJGRDY0X0JBQ0tFTkRTKTogIEFkZCBubG02NC5vLCBubG02NC1nZW4uby4KKwkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIG5sbXszMiw2NH0uYywgbmxtezMyLDY0fS1nZW4uYy4KKwkqIE1ha2VmaWxlLmluIChubG0ubywgbmxtezMyLDY0fS5vLCBubG17MzIsNjR9LWdlbi5vOiAgTmV3IHRhcmdldHMuCisJKiBiZmQtaW4yLmggKElOTElORSk6ICBEZWZpbmVzIG1vdmVkIGhlcmUuCisJKiB7YW91dHguaCwgZWxmLmMsIGVsZmNvZGUuaH06ICBNb3ZlIElOTElORSBkZWZpbmVzIHRvIGJmZC1pbjIuaC4KKwkqIGxpYmVsZi5oIChDQVQ0KTogIE1vdmUgZGVmaW5lIHRvIGJmZC1pbjIuaC4KKwkqIGJmZC1pbjIuaCAoQ0FUNCk6ICBNZXJnZSBDQVQ0IG1hY3JvIHdpdGggb3RoZXIgQ0FUIG1hY3Jvcy4KKwkqIGJmZC1pbjIuaCAodW5pb24gdGRhdGEpOiAgQWRkIG5sbV9vYmpfZGF0YS4KKwkqIGJmZC1pbjIuaCAoZW51bSB0YXJnZXRfZmxhdm91cik6ICBBZGQgYmZkX3RhcmdldF9ubG1fZmxhdm91ci4KKwkqIHRhcmdldHMuYyAoYmZkX25sbXszMiw2NH1fe2JpZyxsaXR0bGV9X3ZlYyk6ICBBZGQgcHJvdG90eXBlcy4KKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBBZGQgYmZkX25sbXszMiw2NH1fe2JpZyxsaXR0bGV9X3ZlYy4KKwkqIChsaWJubG0uaCwgbmxtLmMsIG5sbWNvZGUuaCwgbmxtezMyLDY0fS1nZW4uYywKKwlubG17MzIsNjR9LXRhcmdldC5oLCBubG17MzIsNjR9LmMsIGNvbmZpZy9pMzg2LW5sbS5tdCk6ICBOZXcgZmlsZXMKKwlmb3IgTkxNIHN1cHBvcnQuCisKK01vbiBKdWwgMTkgMTU6MDk6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUue2hvc3RzLGlufTogYWRkIGlbMzRdODYtKi1seW54b3MqIHN1cHBvcnQKKworTW9uIEp1bCAxOSAxNDo1MzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIGVsZi5jLCBlbGZjb2RlLmgsIGxpYmVsZi5oOiBTZXJpb3VzIHJlb3JnYW5pemF0aW9uLgorCURlbGV0ZWQgYHRodW5rJyBzdHJ1Y3R1cmUsIG1lcmdlZCBpbnRvIHRkYXRhLCBkdXBsaWNhdGUgZGF0YQorCWVsaW1pbmF0ZWQuCisJUmVhcnJhbmdlZCBmdW5jdGlvbnMsIGdyb3VwaW5nIGJ5IGZ1bmN0aW9uYWxpdHkuCisJQnJva2UgdXAgbWFueSBmdW5jdGlvbnMgaW4gZWxmY29kZS5oLCByZS1vcmRlcmVkIG1hbnkgcGFydHMgb2YKKwlmaWxlIHdyaXRpbmcgdG8gaGFuZGxlIHVucHJlZGljdGFibGUgc3RhdGUgb2Ygc2VjdGlvbiByZWxvY2F0aW9uCisJdGFibGUgYXMgcHJvdmlkZWQgYnkgdmFyaW91cyBhcHBsaWNhdGlvbnMuCisJU3RpbGwgbmVlZHMgY2xlYW51cDogTWVyZ2UgZnVuY3Rpb25zIGJhY2sgdG9nZXRoZXIsIHNwbGl0IG91dAorCWRhdGEgc3RydWN0dXJlIHdpdGggb25seSBkYXRhIHRoYXQgaXMgdXNlZCBvbmx5IHdoZW4gd3JpdGluZyBvdXQKKwlvYmplY3QgZmlsZS4KKworCSogZWxmLmMgKGJmZF9lbGZfZ2VuZXJpY19yZWxvYyk6IE5ldyBmdW5jdGlvbiwgdGFrZW4gZnJvbQorCWNvZmYtbWlwcy5jLgorCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogVXNlIGl0LCB0byB3b3JrIGFyb3VuZAorCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gbG9zc2FnZS4KKworCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogSW5jbHVkZSBjb2ZmLW1pcHMubyBhbmQgY29mZi1tc3ltLm8sIHNvCisJdGhhdCBnZGIgd2lsbCBsaW5rLgorCShvZmlsZXMpOiBEb24ndCB1c2Ugc29ydCBvciB1bmlxOyBkbyBpdCB3aXRoIHNoIGNvbnN0cnVjdHMuCisKK1N1biBKdWwgMTggMTk6NDI6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oOiBSZWNvZ25pemUgSTM4NlBUWE1BR0lDLgorCSogYW91dGYxLmgsIGxpYmFvdXQuaDogQWRkIE1fMzg2X0RZTklYLgorCSogdHJhZC1jb3JlLmMgKFRSQURfQ09SRV9VU0VSX09GRlNFVCwgVFJBRF9DT1JFX1NUQUNLX0ZJTEVQT1MpOgorCU5ldyBtYWNyb3M7IHVzZSBpdCBpZiBkZWZpbmVkLgorCSogY29uZmlnL3N5bW1ldHJ5Lm1oLCBob3N0cy9zeW1tZXRyeS5oOiBOZXcgZmlsZXMuCisKK0ZyaSBKdWwgMTYgMTQ6NTY6MzEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBSZW5hbWUgZWxmezMyLDY0fS1nZW5lcmljLmMgdG8gKi1nZW4uYyBmb3IgMTQgY2hhciBmaWxlbmFtZXMuCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgorCShDRklMRVMpOiBBZGQgZWxmNjQtZ2VuLmMuCisKK0ZyaSBKdWwgMTYgMDk6NTM6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYzogVXNlIE1JUFNfQU9VVF97T1p9TUFHSUMgcmF0aGVyIHRoYW4ge09afU1BR0lDLgorCitUaHUgSnVsIDE1IDE2OjAyOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1tODhrLmMgKGhvd3RvX3RhYmxlKTogQ29ycmVjdGVkIGJpdHNpemUgZm9yIFJfUENSMjZMIGZyb20KKwkxNiB0byAyNi4KKworV2VkIEp1bCAxNCAxNToyOTo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaHBwYS5jIFtIT1NUX0hQUEFCU0RdOiBVc2UgaHB1eC1zdHlsZSBjb3JlIGZpbGVzLgorCSogbGliaHBwYS5oIFtIT1NUX0hQUEFCU0RdOiBJbmNsdWRlIGhwdXggdmVyc2lvbiBvZiBjb3JlLmgKKworV2VkIEp1bCAxNCAwOTozMDo0OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBoODMwMGgtKi0qLgorCitUdWUgSnVsIDEzIDEyOjAzOjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvZmYtaDg1MDAuYyAocmVsb2NfcHJvY2Vzc2luZywgcnR5cGUyaG93dG8pOiBOZXcgcmVsb2NhdGlvbgorCXR5cGUgUl9IODUwMF9ISUdIXzE2LgorCSogY29mZi1zaC5jIChyX2ltbTMyKTogR2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVsb2MgcmlnaHQuCisKK1R1ZSBKdWwgMTMgMTY6NDg6NTYgMTk5MyAgRnJlZGVyaWMgUGllcnJlc3RlZ3V5IChGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIpCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIG5ldyB0YXJnZXQgbTY4ay1jb2ZmdW4gdG8gdGhlIGRweC8yLgorCSogY29uZmlnL202OGstY29mZnVuLm10OiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGNvbmZpZy9kcHgyLm10LgorCitNb24gSnVsIDEyIDEwOjQyOjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBNb3ZlIFNQQVJDX0JBU0UxMyByZWxvYyBpbnRvCisJc3BhcmMtYW91dC1zcGVjaWZpYyBsaXN0LgorCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGQgYHRodW5rJy4KKworCSogY29uZmlnL3NwYXJjLWVsZi5tdCAoVEFSR0VUX0JBQ0tFTkRTKTogTmV3IG1ha2UgdmFyaWFibGUuCisKK1RodSBKdWwgIDEgMTQ6NTI6NDcgMTk5MyAgRnJlZGVyaWMgUGllcnJlc3RlZ3V5IChGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIpCisJCQkgIGFuZCBKaW0gS2luZ2RvbiAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmg6IFVzZSBtZW1zZXQgbm90IGJ6ZXJvLgorCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN5cy9maWxlLmg+LgorCSogaTM4NmxpbnV4Lmg6IEluY2x1ZGUgPHN5cy9maWxlLmg+LgorCSogY29mZi1tNjhrLXVuLmM6IG5ldyBmaWxlIHRvIGhhbmRsZSBuYW1lcyB3aXRoIHVuZGVyc2NvcmVzIG9uCisJc3ZyMyBtYWNoaW5lcy4KKwkqIGNvZmYtbTY4ay5jIChtNjhrX3J0eXBlMmhvd3RvKTogYWRkZWQgI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKKwl0byBub3QgZHVwbGljYXRlIHRoZSBmdW5jdGlvbiBpbiB0aGUgZXhlY3V0YWJsZS4KKwkoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSk6IG5ldyBtYWNyb3MgbmVlZGVkCisJYnkgY29mZi1tNjhrLXVuLmMuCisJKiBjb2ZmY29kZS5oIChNQzY4S0JDU01BR0lDKTogY2FzZSBhZGRlZC4KKwkqIHRhcmdldHMuYzogQWRkIG02OGtjb2ZmdW5fdmVjLgorCSogY29uZmlndXJlLmhvc3Q6IGFkZGVkIHN1cHBvcnQgZm9yIEJ1bGwgZHB4LzIuCisJKiBjb25maWcvZHB4Mi5taCwgaG9zdHMvZHB4Mi5oOiBuZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgdGFyZ2V0IGNvZmYtbTY4ay11bi4KKworRnJpIEp1bCAgOSAwMDo0MzowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmg6IEFkZCBkZWZpbml0aW9uIG9mIE1BQ0hUWVBFX09LLgorCitUaHUgSnVsICA4IDE0OjM3OjQ0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHN1YnRyYWN0IHRoZSBhZGRlbmQKKwlhZ2FpbiBmb3IgY29mZi4KKworCSogc3ltcy5jLCBiZmQtaW4yLmg6IERvYyBmaXguCisKKwkqIGNvZmZjb2RlLmggKENBTENfQURERU5EKTogQ2hlY2sgZm9yIGNvbW1vbiBzZWN0aW9uIHVzaW5nIHRoZQorCXNlY3Rpb24gZmxhZyBhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgZmxhZy4KKworVGh1IEp1bCAgOCAxMzo0Mzo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaG9zdHMvaTM4NmJzZC5oOiBDb25kaXRpb25hbGl6ZSBIT1NUX1NUQUNLX0VORF9BRERSIG9uIF9fYnNkaV9fLgorCWkzODZic2QuYzogUmVtb3ZlIGRlZmluZXMgb2YgTl9UWFQqOyB0aGUgdmVyc2lvbnMgaW4gYW91dDY0Lmggc2hvdWxkCisJYmUgc3VmZmljaWVudC4gIERlZmluZSBURVhUX1NUQVJUX0FERFIuCisKK1dlZCBKdWwgIDcgMTA6NTY6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogUmVtb3ZlZCBzdGF0ZXAKKwlhcmd1bWVudC4gIEp1c3QgbGV0IGFuIGluZGlyZWN0IHN5bWJvbCBwb2ludCB0byB0aGUgbmV4dCBzeW1ib2wKKwl3aXRob3V0IGZvcmNpbmcgdGhlIG5leHQgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZC4gIENoYW5nZWQgYWxsCisJY2FsbGVycy4KKwkqIGhwMzAwaHB1eC5jIChzbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2VkIGNhbGwgdG8KKwl0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLgorCSogdGFyZ2V0cy5jOiBBZGRlZCBocDMwMGhwdXhfdmVjLgorCSogTWFrZWZpbGUuaW4gKGhwMzAwaHB1eC5vKTogQWRkZWQgZGVwZW5kZW5jaWVzLgorCitUdWUgSnVsICA2IDEzOjI0OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogUHV0IHNpbXBsZSBwb3dlci1vZi10d28KKwlyZWxvY3MgdG9nZXRoZXIsIGFuZCBhZGQgNjQtYml0IHZlcnNpb25zLgorCShiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBcmd1bWVudCB0byBhbGxvY2EKKwlpcyBzaXplX3QuCisKKwkqIGxpYmJmZC5jIChiZmRfeG1hbGxvY19ieV9zaXplX3QpOiBOZXcgZnVuY3Rpb24uCisJKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBBZGQgcHJvdG90eXBlcyB0bworCWRlY2xhcmF0aW9ucy4KKwkob2JzdGFja19jaHVua19hbGxvYyk6IFVzZSBiZmRfeG1hbGxvY19ieV9zaXplX3QuCisJKG5ld19iZmQpOiBQcm90b3R5cGUtc3R5bGUgZGVmaW5pdGlvbiwgdXNpbmcgREVGVU4uCisJKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2MsIGJmZF96YWxsb2MsIGJmZF9yZWFsbG9jKTogU2l6ZQorCWFyZ3VtZW50IGlzIHR5cGUgc2l6ZV90LCBub3QgYmZkX3NpemVfdHlwZS4KKwkqIGllZWUuYyAob2JzdGFja19jaHVua19hbGxvYyk6IFVzZSBiZmRfeG1hbGxvY19ieV9zaXplX3QuCisJKiBiZmQuYyAoYmZkX2RlZmF1bHRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3RyYXAsCisJYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibHRyYXApOiBQcm90b3R5cGVzLgorCSogbGliYmZkLWluLmggKGJmZF9hbGxvYywgYmZkX3phbGxvYywgYmZkX3JlYWxsb2MsCisJYmZkX2FsbG9jX2dyb3cpOiBBZGp1c3RlZCBwcm90b3R5cGVzIGZvciBhcmcgdHlwZSBjaGFuZ2UuCisJKiBhcmNoaXZlLmMgKGdldF9lbHRfYXRfZmlsZXBvcywgZG9fc2x1cnBfYnNkX2FybWFwLCBub3JtYWxpemUsCisJZG9fc2x1cnBfY29mZl9hcm1hcCwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKToKKwlQcm90b3R5cGVzLgorCSogZWxmY29kZS5oIChlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYik6IFByb3RvdHlwZXMuCisJKiBsaWJlbGYuaCAoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uLCBlbGZfZ2V0X3N0cl9zZWN0aW9uKToKKwlQcm90b3R5cGVzLgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogUmVuYW1lZCBmcm9tIEJGRF9NQUNISU5FUy4KKwkob2ZpbGVzKTogTmV3IHRhcmdldC4gIEJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZmlsZSBuYW1lcywgaW4gY2FzZQorCWFueSBnb3QgZHVwbGljYXRlZC4KKwkoVEFSR0VUTElCKTogVXNlIGxpc3Qgb2YgZmlsZXMgZnJvbSBvZmlsZXMuCisJKiBjb25maWd1cmUuaW46IFNldCBCRkRfTUFDSElORVMgYW5kIEJGRF9CQUNLRU5EUyBkZXBlbmRpbmcgb24KKwltaW5pbWFsLWJmZCBmbGFnIGFuZCB0YXJnZXQgbWFrZWZpbGUgZnJhZyBjb250ZW50cy4KKworCSogZWxmY29kZS5oIChlbGZfcmVhZCk6IERlbGV0ZSBzdGF0aWMgZGVjbGFyYXRpb24sIHNpbmNlIGZ1bmN0aW9uCisJaGFzIG1vdmVkLgorCShlbGZfbWFwX3N5bWJvbHMpOiBXcml0ZSBvdXQgc2VjdGlvbiBzeW1ib2xzIGZvciBhbGwgc2VjdGlvbnMsIGZvcgorCW5vdy4KKwkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBBbGxvdyBtYXRjaCBpZiBib3RoIHN5bWJvbHMgYXJlCisJc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgc2FtZSBzZWN0aW9uLgorCShlbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCBwcmludCBtZXNzYWdlLCBqdXN0IHJldHVybiBmYWxzZS4KKworCSogbGliZWxmLmggKGJmZF9lbGZfbG9jYXRlX3NoKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KKworTW9uIEp1bCAgNSAxNjo0ODoxMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjcHUtaDgzMDAuYyAoaDgzMDBfc2Nhbik6IEZpeCBwYXJzaW5nIG9mIGFyY2hpdGVjdHVyZSBzdHJpbmcuCisKK0ZyaSBKdWwgIDIgMTg6Mjc6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBiZmQuaCBhbmQgc3RtcC1iZmQuaC4KKwkocmVhbGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBoZWFkZXJzLgorCitGcmkgSnVsICAyIDE0OjUxOjUxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudCk6ICBEZW55IGlmIGZpbGUgaXMgbm90IG9wZW5lZCB3aXRoCisJdGhlIHByb3BlciBtb2RlLCBzZXQgb3V0cHV0X2hhc19iZWd1biBpZiBmaWxlIGlzIG9wZW5lbmVkIGZvciB1cGRhdGUuCisJKiBhb3V0eC5oIChhb3V0Xypfc2V0X3NlY3Rpb25fY29udGVudCk6ICBSZW1vdmUgY2hlY2tzIHRoYXQgYXJlIG5vdworCWRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnQuCisKK0ZyaSBKdWwgIDIgMDk6MjU6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmVkIGRlY2xhcmF0aW9ucyBvZiBwcmludGYsIGZwcmludGYsCisJZmNudGwsIGZyZWFkIGFuZCBmd3JpdGUuICBUaGV5IGFyZSBhbGwgZXJyb3IgcHJvbmUgZm9yIG9uZSByZWFzb24KKwlvciBhbm90aGVyLiAgQ2hhbmdlZCBkZWNsYXJhdGlvbiBvZiBtZW1jaHIgZnJvbSBjaGFyICogdG8gUFRSLgorCisJKiBjb25maWd1cmUuaW4gKG1pcHMtKi1yaXNjb3MqKTogTmV3IHRhcmdldDsgdXNlIHJpc2Nvcy4KKwkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLSotcmlzY29zKik6IE5ldyBob3N0OyB1c2UgcmlzY29zLgorCSogY29uZmlnL3Jpc2Nvcy5taCAoSERFRklORVMpOiBBZGQgLUcgNC4KKworCSogbGliYW91dC5oIChHRVRfU1dPUkQpOiBVc2UgdGhlIGJmZF9oX2dldF9zaWduZWQgZW50cnkgcG9pbnRzCisJcmF0aGVyIHRoYW4gY2FzdGluZyB0aGUgcmVzdWx0IG9mIGJmZF9oX2dldC4KKworRnJpIEp1bCAgMiAxMDoxMzo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluLCBob3N0cy9kZWx0YTY4LmgsIGNvbmZpZy9kZWx0YTY4Lm1oOiBBZGQgc3R1ZmYgZm9yCisJTW90b3JvbGEgRGVsdGEgNjguCisKK1dlZCBKdW4gMzAgMDY6MDI6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF97YmlnLGxpdHRsZX1fZ2VuZXJpY192ZWMpOiBEZWNsYXJlLCBhbmQKKwlpbmNsdWRlIGluIHNlYXJjaCBsaXN0IGlmIEJGRDY0IGlzIGRlZmluZWQuCisKKwkqIGxpYmVsZi5oIChDQVQ0KTogQWRkZWQgYSB2ZXJzaW9uIGZvciBTYWJlci1DLCBBTlNJIG1vZGUuCisJKGJmZF9lbGY2NF8qKTogRGVjbGFyYXRpb25zIGZvciA2NC1iaXQgdmVyc2lvbnMgb2YgbWFueSByb3V0aW5lcy4KKworVHVlIEp1biAyOSAyMjo1MDo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGVsZjY0LXRhcmdldC5oLCBlbGY2NC1nZW5lcmljLmM6IE5ldyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluIChCRkQ2NF9CQUNLRU5EUyk6IEluY2x1ZGUgZWxmNjQtZ2VuZXJpYy5vLgorCShlbGY2NC1nZW5lcmljLm8pOiBMaXN0IGRlcGVuZGVuY2llcy4KKworCSogTWFrZWZpbGUuaW46IExpc3QgdGFyZ2V0IGBhbGwnIGV4cGxpY2l0bHkgYmVmb3JlIGhvc3QvdGFyZ2V0CisJbWFrZWZpbGUgZnJhZ21lbnRzIGFyZSBpbmNsdWRlZCwgaW4gY2FzZSB0aGV5IGRlZmluZSBhbnkgbmV3CisJdGFyZ2V0cy4KKworCSogZWxmY29kZS5oIChFTEZfUl9JTkZPLCBFTEZfUl9TWU0pOiBEZWZpbmUgYXMgMzItIG9yIDY0LWJpdAorCXZlcnNpb25zIGFzIGFwcHJvcHJpYXRlLiAgVXNlcyB1cGRhdGVkLgorCShlbGZfZGVidWdfc2VjdGlvbik6IERlY2xhcmUgYmVmb3JlIHVzZS4KKwkoZWxmX2RlYnVnX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCisJKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgYmZkX3NoZHJfZnJvbV9zZWN0aW9uLCBlbGZfZmFrZV9zZWN0aW9ucyk6CisJQWxpZ25tZW50IHZhbHVlIGluIHNlY3Rpb24gaGVhZGVyIGlzIG5fYnl0ZXMsIG5vdCBsb2cyLgorCShuZXdfc2VjdGlvbl9ob29rKTogRG8gbm90aGluZyBmb3Igbm93LgorCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgRWxmX0V4dGVybmFsX1JlbFthXSwgbm90IDMyLWJpdAorCXZlcnNpb24gZXhwbGljaXRseS4KKwkoZWxmX2NvcmVfZmlsZV9wKTogU2ltcGxpZnkgY2hlY2sgZm9yIGNvcnJlY3QgY2xhc3MgKHdvcmQgc2l6ZSkuCisJKGVsZl9tYWtlX3NlY3Rpb25zLCBlbGZfZmFrZV9zZWN0aW9ucywgZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6CisJSW5pdGlhbGl6ZSBhbGwgZmllbGRzIHdoZW4gY3JlYXRpbmcgZGF0YSBzdHJ1Y3R1cmVzLgorCShlbGZfbG9jYXRlX3NoKTogUmVuYW1lZCBmcm9tIGJmZF9lbGZYWF9sb2NhdGVfc2gsIG1hZGUgc3RhdGljLgorCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IGNvcnJlY3QgY2xhc3MgaW4gb3V0cHV0CisJZmlsZS4KKwkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNlY3Rpb24gc3ltYm9scyBoYXZlIGVtcHR5IG5hbWVzIGluCisJb3V0cHV0IGZpbGUuCisKKwkqIGxpYmJmZC5jIChiZmRfeG1hbGxvYywgemFsbG9jKTogQmUgc3VyZSB0byBjYXN0IG1hbGxvYywgbWVtc2V0CisJYXJncyB0byBzaXplX3QgYmVmb3JlIGNhbGwuCisJKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogQ2FzdCB6YWxsb2MgYXJnIHRvIGJmZF9zaXplX3R5cGUuCisKK1R1ZSBKdW4gMjkgMTA6NDk6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiBwcm9jZWR1cmUgaGFzIG5vIGxpbmUKKwludW1iZXIgaW5mb3JtYXRpb24sIHJldHVybiAwIGZvciBsaW5lIG51bWJlci4KKworTW9uIEp1biAyOCAxMDo0NTowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogSWYgKm9sZHJhd3B0ciBpcyBub24tTlVMTCwgY29weSBpdAorCWludG8gKnJhd3B0ci4KKworU3VuIEp1biAyNyAwOTowNToxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaG9zdHMvcmlzY29zLmg6IERlZmluZSBOQlBHIGFuZCBVUEFHRVMuCisKK1N1biBKdW4gMjcgMTY6Mjg6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHVzZSBvYmpfcmF3X3N5bXMgYXMKKwlsdmFsdWU7IGl0IGNvbnRhaW5zIGEgY2FzdC4KKworRnJpIEp1biAyNSAxNzowOTo1NSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGhhc2gsIGNvbXBhcmUsIHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIGFkZF90b19zdHJpbmd0YWIpOgorCVVzZSB1bnNpZ25lZCBoYXNoIHZhbHVlcyBmb3IgYmV0dGVyIGhhc2hpbmcuCisJKGhhc2gpOiBIYXNoIGluIHRoZSBzdHJpbmcgbGVuZ3RoIGZvciBsb25nIHN0cmluZ3MuCisKK1RodSBKdW4gMjQgMTU6NDc6NTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChjb21wYXJlKTogUmVwbGFjZSAzIGlmJ3Mgd2l0aCBhIHN1YnRyYWN0aW9uLgorCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncywgYWRkX3RvX3N0cmluZ3RhYik6IFJlb3JkZXIgdGVzdHMKKwlpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHN1Y2Nlc3MsIGFzIGFuIG9wdGltaXphdGlvbi4KKwkoaGFzaCk6IFRha2UgYSBsZW5ndGggYXJnOyBpZ25vcmUgY2hhcnMgYWZ0ZXIgIzI1LCBmb3Igc3BlZWQuCisJKGFkZF90b19zdHJpbmd0YWIpOiBQYXNzIGxlbmd0aCB0byBoYXNoLgorCitUaHUgSnVuIDI0IDE3OjI1OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBlbGYzMi1zcGFyYy5jIChzcGFyY19yZWxvY19tYXApOiBBZGQgU1BBUkNfV0RJU1AyMiByZWxvYy4KKworCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IERvIG5vdGhpbmcgZm9yIG5vdy4KKwkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE91dHB1dCBjb21tb24gc3ltYm9scyB0aGUgd2F5IEVMRgorCXdhbnRzIHRoZW0uCisKK1dlZCBKdW4gMjMgMTY6MjA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSBhbmQgYXNzb2NpYXRlZCBtYWNyb3MpOiBNb3ZlZAorCWhlcmUgZnJvbSBlbGZjb2RlLmguICBBIGNvdXBsZSBvZiBzaXplLXNwZWNpZmljIHN0cnVjdHVyZSBwb2ludGVycworCXdlcmUgY2hhbmdlZCB0byBQVFI7IHVzZXMgZml4ZWQgYXBwcm9wcmlhdGVseS4KKwkoZWxmMzJfc3ltYm9sX3R5cGUsIGVsZjY0X3N5bWJvbF90eXBlKTogU2VwYXJhdGVkIGRlZmluaXRpb25zLgorCShiZmRfZWxmX21rb2JqZWN0KTogUmVuYW1lZCBmcm9tIGJmZF9lbGYzMl9ta29iamVjdC4KKwkoYmZkX2VsZjMyX21rb2JqZWN0LCBiZmRfZWxmNjRfbWtvYmplY3QsIGVsZl9ta29iamVjdCk6IE5ldworCXRlbXBvcmFyeSBtYWNyb3MgdG8gZWFzZSBuYW1lIGNoYW5nZS4KKwkqIGVsZi5jIChlbGZfcmVhZCwgZWxmX21rb2JqZWN0LCBlbGZfZ2V0X3N0cl9zZWN0aW9uLAorCWVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiwgYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBNb3ZlZCBoZXJlCisJZnJvbSBlbGZjb2RlLmguCisJKiBkb2MvTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogUHJvY2VzcyBlbGYuYyB0b28uCisJKiBNYWtlZmlsZS5pbiAoZWxmLm8pOiBOb3RlIG5ldyBkZXBlbmRlbmNpZXMuCisKKwkqIGVsZmNvZGUuaDogTG90cyBvZiBzdHVmZiBtb3ZlZCBlbHNld2hlcmUuICBEZWxldGVkIHNvbWUgdW51c2VkCisJY29kZSwgdHdlYWtlZCBzb21lIGRlYnVnIGhvb2tzLgorCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogVHJhbnNsYXRlIEVMRiBzZWN0aW9uIHN5bWJvbHMgaW50byBCRkQKKwlzZWN0aW9uIHN5bWJvbHMuCisKK1dlZCBKdW4gMjMgMTE6MzQ6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGhvc3RzL3Jpc2Nvcy5oOiBOZXcgZmlsZS4KKworVHVlIEp1biAyMiAxNDozNToyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGNhc2UgU0hUX1BST0dCSVRTKTogRXZlbiBpZgorCXNlY3Rpb24gYWxyZWFkeSBleGlzdHMsIHVzZSBpdHMgcG9pbnRlciB0byBmaWxsIGluIHJhd2RhdGEgc2xvdC4KKworVHVlIEp1biAyMiAxNjozNjo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaG9zdHMvc3RkLWhvc3QuaDogUmV0dXJuIHZhbHVlIG9mIHB1dHMgYW5kIGZwdXRzIGlzIGludCBub3Qgdm9pZC4KKworVHVlIEp1biAyMiAxNDoyNTo1OCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IENvbW1lbnQgdGhlIGZpZWxkIG5hbWVzLgorCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBtYXggYW5kIG1pbiB2YWx1ZXMuCisKK01vbiBKdW4gMjEgMTg6MTk6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLXRhcmdldC5oLCBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaDogVXNlIG5ldworCXNpemUtaW5kZXBlbmRlbnQgZWxmIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKwkqIGVsZmNvZGUuaCAocHV0X3dvcmQsIGdldF93b3JkKTogRGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvcgorCWFyY2hpdGVjdHVyZSB3b3JkIHNpemUuICBTdHJ1Y3R1cmUgc3dhcHBpbmcgZnVuY3Rpb25zIGNoYW5nZWQgdG8KKwl1c2UgdGhlbSBhcyBhcHByb3ByaWF0ZS4KKworCSogY29uZmlndXJlLmluOiBJZiBjb21waWxpbmcgNjQtYml0IGJhY2sgZW5kcywgZG8gdGhlbSBiZWZvcmUKKwkzMi1iaXQgb25lcy4KKworCSogbGliZWxmLmg6IFVzZSBuZXcgc2l6ZS1pbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBlbGYgaW50ZXJuYWwgZGF0YQorCXN0cnVjdHVyZXMuCisJKHN5bWJvbF90eXBlKTogUmVvcmRlcmVkIHRvIHB1dCBhbnkgZmllbGRzIGRlcGVuZGVudCBvbiB0YXJnZXQKKwlzaXplIGF0IHRoZSBlbmQuCisJKGVsZl9iYWNrZW5kX2RhdGEpOiBSZW5hbWVkIGZyb20gZWxmIyNfYmFja2VuZF9kYXRhIGFuZCBtYWRlCisJc2l6ZS1pbmRlcGVuZGVudC4KKwkoZWxmX3NlY3RfdGh1bmspOiBOb3cgc2l6ZS1pbmRlcGVuZGVudC4KKworCSogbGliYmZkLmMgKGJmZF9sb2cyKTogTm93IHJldHVybnMgdW5zaWduZWQgaW50LgorCitNb24gSnVuIDIxIDEyOjMwOjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBSZW5hbWUgY29uZmlnL204OGstYW91dC5tdCB0byBjb25maWcvbm9vcC5tdC4KKwljb25maWd1cmUuaW46IFVzZSBpdCBmb3IgbWlwcy0qLWJzZCouCisKK1N1biBKdW4gMjAgMjA6MzI6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBFbGltaW5hdGUgInBhcnRpYWxseSBicmFja2V0ZWQKKwlpbml0aWFsaXplciIgd2FybmluZyBmcm9tIGdjYy4KKwkqIGNwdS1oODUwMC5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuCisJKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLgorCisJKiBjcHUtaDgzMDAuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBob3d0bypfY2FsbGJhY2ssCisJaG93dG9fKik6IFVudXNlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBjb21tZW50ZWQgb3V0LgorCSogY3B1LXo4ay5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGhvd3RvKl9jYWxsYmFjaywKKwlob3d0b18qKTogTGlrZXdpc2UuCisJKiBjcHUtaDg1MDAuYyAoY29tcGF0aWJsZSk6IExpa2V3aXNlLgorCSogY3B1LXNoLmMgKGNvbXBhdGlibGUpOiBMaWtld2lzZS4KKworCSogaHAzMDBocHV4LmMgKHN3YXBfc3RkX3JlbG9jX2luKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuCisJQWx3YXlzIHNldCBhIHZhbGlkIGxlbmd0aCB2YWx1ZSwgZXZlbiBmb3IgaW52YWxpZCBpbnB1dC4KKworCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2Ugc3ByaW50Zl92bWEuCisKKwkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdILCBpbnQ2NF90eXBlLAorCXVpbnQ2NF90eXBlKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zLgorCSogaG9zdHMvc3RkLWhvc3QuaCAoaW50NjQgc3R1ZmYpOiBSZW1vdmUgdGhlbSBmcm9tIGhlcmUuCisKKwkqIGJmZC1pbi5oIChzcHJpbnRmX3ZtYSk6IERlZmluZSBwYXJhbGxlbCB0byBmcHJpbnRmX3ZtYS4KKworCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZSB1bnVzZWQKKwl2YXJpYWJsZS4gIEFkZGVkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBCZWZvcmUgY2FzdGluZworCXBvaW50ZXJzIHRvIGludGVnZXJzLCBtYWtlIHN1cmUgdGhlIGludGVnZXIgdHlwZSBpcyB3aWRlIGVub3VnaC4KKwkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBEaXR0by4KKworCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW5jZSBgY291bnQnIGlzIHVuc2lnbmVkLAorCWRvbid0IGJvdGhlciBjb21wYXJpbmcgZm9yIGxlc3MtdGhhbi16ZXJvLgorCShiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KKworCSogZWxmY29kZS5oIChiZmRfYWRkX3RvX3N0cnRhYik6IE5vdyBzdGF0aWMuCisJKHN5bV9pc19nbG9iYWwpOiBOZXcgZnVuY3Rpb24uCisJKGVsZl9tYXBfc3ltYm9scyk6IENhbGwgaXQuICBOb3cgcmV0dXJucyB2b2lkLiAgUmVtb3ZlZCB1bnVzZWQKKwlsb2NhbCB2YXJpYWJsZS4KKwkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFyayBzdHJpbmcgdGFibGVzIG90aGVyIHRoYW4gZm9yIHNlY3Rpb24KKwlhbmQgc3ltYm9sIG5hbWVzIGFzIG5vcm1hbCBzZWN0aW9ucyBoYXZpbmcgY29udGVudHMuCisJKGZpeF91cF9zdHJ0YWJzKTogTmV3IGZ1bmN0aW9uOyBmaXhlcyB1cCBFTEYgaGVhZGVyIGZpZWxkcyBmb3IKKwlzdGFiIHNlY3Rpb25zIHdpdGggc3RyaW5nIHRhYmxlcyBhc3NvY2lhdGVkLgorCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFwIGZpeF91cF9zdHJ0YWJzIG92ZXIgYWxsIEJGRAorCXNlY3Rpb25zLiAgUmVvcmRlcmVkIGNvbmRpdGlvbiB0ZXN0cyBmb3Igc3ltYm9sIGZsYWdzOyBkZWZhdWx0IHRvCisJbG9jYWwtb2JqZWN0IHZhbHVlIGluc3RlYWQgb2YgZ2xvYmFsLW9iamVjdC4KKwkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBIaWQgY29uZGl0aW9uYWxseS11c2VkIHZhcmlhYmxlCisJaW5zaWRlIGNvbmRpdGlvbiB0ZXN0LgorCShlbGZfcHJpbnRfc3ltYm9sKTogVXNlIGZwcmludGZfdm1hLgorCShlbGZfaWR4X29mX3N5bSwgYmZkX3NoZHJfZnJvbV9zZWN0aW9uKTogVW51c2VkIGZ1bmN0aW9ucworCWNvbW1lbnRlZCBvdXQuCisKKwkqIGJmZC1pbi5oIChpbnQ2NF90eXBlLCB1aW50NjRfdHlwZSk6IERlZmluZSB0aGVzZSBpZiB3ZSBmYWxsCisJYmFjayB0byAibG9uZyBsb25nIiBmb3IgSE9TVF82NF9CSVQuCisKKwkqIGxpYmVsZi5oIChlbGZOQU1FLCBFbGZOQU1FKTogTmV3IHZlcnNpb25zIHRvIGdldCBkZXNpcmVkIHJlc3VsdHMKKwl3aXRob3V0IHVzaW5nIGludmFsaWQgQU5TSSBDIHByZXByb2Nlc3NpbmcgdG9rZW5zLgorCisJKiBlbGYzMi10YXJnZXQuaCAoYmZkX2VsZjMyX25ld19zZWN0aW9uX2hvb2spOiBEZWxldGUgbWFjcm8uCisJKiBsaWJlbGYuaCAoYmZkX2VsZjMyX25ld19zZWN0aW9uX2hvb2spOiBEZWNsYXJlLgorCSogZWxmY29kZS5oIChuZXdfc2VjdGlvbl9ob29rKTogRGVmaW5lIGhlcmUuCisKKwkqIGhvc3RzL3NwYXJjLmgsIGhvc3RzL3N0ZC1ob3N0LmgsIGhvc3RzL2kzODZic2QuaDogUHJvdGVjdAorCWFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KKworCSogaG9zdHMvbmV3cy5oOiBJbmNsdWRlIGhvc3RzL3N0ZC1ob3N0LmgsIG5vdCBwbGFpbiBzdGQtaG9zdC5oLgorCisJKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiBHZW5lcmF0ZSBpbnRvIGN1cnJlbnQgZGlyZWN0b3J5IGJ5IGdyYWJiaW5nCisJNjQtYml0IGRlZmluaXRpb24gKGlmIGFueSkgZnJvbSBzeXNkZXAuaC4KKwkqIGJmZC1pbi5oOiBQdXQgaW4gbWFya2VyIGZvciBzeXNkZXAuaCBpbmNsdXNpb24uCisKK0ZyaSBKdW4gMTggMTk6NTc6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQ2hlY2sgZm9yIG92ZXJmbG93IG9uCisJcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMgaWYgdGhlIGhvd3RvIGFza2VkIGZvciBpdC4KKworRnJpIEp1biAxOCAxNjowMDoyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBJZ25vcmUgbm9uemVybyBleGl0IHN0YXR1cyBmcm9tIGdyZXAuCisKK0ZyaSBKdW4gMTggMTY6NTQ6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9yaXNjb3MubXtoLHR9OiBOZXcgZmlsZXMuCisJKiBjb25maWd1cmUue2hvc3QsaW59OiBVc2UgdGhlbS4KKworRnJpIEp1biAxOCAxMjo1NToxMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbWlwcy5jOiBjb21tZW50IGNoYW5nZS4gIFRoaXMgaXMgYSBtaXBzIGZpbGUsIG5vdCA4OGsuCisKK01vbiBKdW4gMTQgMTQ6MDI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGNhY2hlLmMgKGJmZF9jYWNoZV9pbml0KTogSW5jcmVtZW50IG9wZW5fZmlsZXMgYW5kIGNhbGwgY2xvc2Vfb25lCisJaWYgbmVjZXNzYXJ5LgorCShiZmRfb3Blbl9maWxlKTogRG9uJ3QgaW5jcmVtZW50IG9wZW5fZmlsZXMgaGVyZS4KKworRnJpIEp1biAxOCAxMDowMDoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2RlbHRhODgubWg6IERvbid0IHNldCBDQy4KKworCSogTWFrZWZpbGUuaW46IEFkZCBlbGYzMi17bWlwcyxtODhrLGdlbmVyaWN9LgorCWVsZjMyLXttaXBzLG04OGssZ2VuZXJpY30uYzogTmV3IGZpbGVzLgorCXRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmZkX2VsZjMyX3ttaXBzLG04OGssZ2VuZXJpY31fdmVjLgorCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogTWF0Y2ggZWxmMzItZ2VuZXJpYyBmb3IgYWxsIG1hY2hpbmVzIHdoaWNoCisJZG9uJ3QgbWF0Y2ggYSBkaWZmZXJlbnQgdGFyZ2V0LgorCitGcmkgSnVuIDE4IDAzOjEyOjEyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJRWxpbWluYXRlICJpbnQ4X3R5cGUiLCAiaW50MTZfdHlwZSIsICJpbnQzMl90eXBlIiwgYW5kIHRoZWlyCisJdmFyaWFudHMgZnJvbSB0aGUgQkZEIHVuaXZlcnNlLiAgTGVhdmUgdGhlIDY0LWJpdCB0eXBlcyBmb3Igbm93LAorCXNpbmNlIHRoZXkgYXJlIGluIGZsdXguCisKKwkqIGFvdXR4LmgsIGhwMzAwaHB1eC5jOiAgRWxpbWluYXRlIG5lZWRsZXNzIChpbnQzMl90eXBlKSBjYXN0cy4KKwkqIGxpYmFvdXQuaCAoR0VUX1NXT1JEKTogIENvbnZlcnQgKGludDMyX3R5cGUpIHRvIChpbnQpLgorCSogaWVlZS5jOiAgQ29udmVydCB1aW50OGVfdHlwZSA9PiB1bnNpZ25lZCBjaGFyLgorCSogb2FzeXMuYzogIEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGVsaW1pbmF0ZSBvYnNvbGV0ZSB0eXBlcy4KKwlUaGVzZSBkZXBlbmQgb24gY2hhbmdlcyBpbiAuLi9pbmNsdWRlL29hc3lzLmggYXMgd2VsbC4KKwkqIGhvc3RzLyouaDogIFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgYWxsIHRoZXNlIHR5cGVzLgorCitNb24gSnVuIDE0IDE0OjAyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBob3N0cy9kZWx0YTg4Lmg6ICNpZiAwIG91dCBzb21lIGRlY2xhcmF0aW9ucyB3aGljaCBjb25mbGljdCB3aXRoCisJc3lzdGVtIGhlYWRlcnMuCisKK01vbiBKdW4gMTQgMTc6MDg6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHJlbW92ZSBwYXJlbnRkaXIgY3J1ZnQKKworTW9uIEp1biAxNCAxOTowNDowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogIFJlbW92ZSByZWR1bmRhbnQgY29weS4KKwkqIEV4cHVyZ2F0ZSByYW5kb20gREVGVU5zIHRoYXQgaGF2ZSBjcmVwdCBpbi4KKworTW9uIEp1biAxNCAxMDoyMzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDb25zdHJ1Y3RvciBzZWN0aW9ucyBzaG91bGQKKwlvbmx5IGJlIGFsaWduZWQgdG8gYSA0IGJ5dGUgYm91bmRhcnkuCisKK1NhdCBKdW4gMTIgMTY6MTM6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGhvc3RzL3N0ZC1ob3N0LmggKHN0cnVjdCBpbnQ2NGVfc3RydWN0KTogUmVtb3ZlIG5lZWRsZXNzIHR5cGVkZWYKKwlrZXl3b3JkLgorCitGcmkgSnVuIDExIDE0OjI1OjM0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGZsYWdzIHRvIDEsIGJyZWFraW5nCisJMTkyNyBidXQgZml4aW5nIHNvbWUgb3RoZXIgaW1wb3J0YW50IHRoaW5ncy4KKworVGh1IEp1biAxMCAyMDozNjoyMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBob3N0cy9zdGQtaG9zdC5oIChpbnQ2NGVfdHlwZSk6IEZpeCBkZWZpbml0aW9uLgorCitUaHUgSnVuIDEwIDExOjQ4OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZi1taXBzLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogVXNlIFNUWVBfTUlQU19JTklUIGZvcgorCXNlY3Rpb24gbmFtZWQgX0lOSVQuICBEb24ndCBzZXQgU1RZUF9URVhUIHVubGVzcyBTRUNfQ09ERSBpcyBzZXQuCisJKGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogVHJlYXQgYSBTVFlQX01JUFNfSU5JVCBzZWN0aW9uIGxpa2UKKwlhIFNUWVBfVEVYVCBzZWN0aW9uLgorCitXZWQgSnVuICA5IDE2OjQ4OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwsIGhlYWRlcnMpOiBkb24ndCBwdXQgY29tbWVudHMgYWZ0ZXIgYSB0YWIKKwlpbiB0aGUgYWN0aW9ucyBzZWN0aW9uIG9mIGEgcnVsZQorCitXZWQgSnVuICA5IDE1OjAwOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZi1taXBzLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBNYXJrIFpNQUdJQyBmaWxlcyBhcyBEX1BBR0VELgorCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBub3QgRF9QQUdFRCwgZG9uJ3QgYWRkIHRoZQorCXNlY3Rpb24gaGVhZGVycyB0byB0ZXh0X3NpemUuICBJZiBub3QgRF9QQUdFRCwgc2V0IHRoZSBtYWdpYworCW51bWJlciB0byBPTUFHSUMgcmF0aGVyIHRoYW4gWk1BR0lDLiAgSWYgY3JlYXRpbmcgYSBEX1BBR0VECisJZXhlY3V0YWJsZSwgdGhlIGV4ZWN1dGFibGUgbXVzdCBmdWxseSBvY2N1cHkgYW4gZXZlbiBudW1iZXIgb2YKKwlwYWdlcy4KKwkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvLCBtYWtlX2JmZF9hc2VjdGlvbiwgZWNvZmZfbGl0dGxlX3ZlYywKKwllY29mZl9iaWdfdmVjKTogQ29uc2lzdGVudGx5IHNldCBzZWN0aW9uIGFsaWdubWVudCBwb3dlciB0byA0LAorCXNpbmNlIEVDT0ZGIHNlY3Rpb25zIHNob3VsZCBiZSBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCisJKGVjb2ZmX2xpdHRsZV92ZWMsIGVjb2ZmX2JpZ192ZWMpOiBBZGRlZCBEX1BBR0VEIHRvIG9iamVjdF9mbGFncy4KKwlNYWRlIGFyX3BhZF9jaGFyIGFuZCBhcl9tYXhfbmFtZWxlbiBhZ3JlZSBmb3IgYm90aC4KKworVHVlIEp1biAgOCAyMDoyODowMiAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyKQorCisJKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBzdWJ0cmFjdCBzZWN0aW9uIHZtYSBmcm9tCisJc3ltYm9sIHZhbHVlLCBzaW5jZSBiZmQgc3ltYm9scyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwgYnV0IEVMRgorCXN5bWJvbHMgYXJlbid0LgorCitUdWUgSnVuICA4IDEyOjA4OjI3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNwdS1pOTYwLmMsIGNwdS1oODMwMC5jIChjb21wYXRpYmxlKTogTWFrZSBzdGF0aWMuCisKK1R1ZSBKdW4gIDggMTQ6Mjc6NTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBob3N0cy9uZXdzLmgsIGNvbmZpZy9uZXdzLm1oOiBOZXcgZmlsZXMuCisKK1R1ZSBKdW4gIDggMTI6MDg6MjcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogYmZkLWluMi5oLCBhcmNodXJlcy5jIChiZmRfbWFjaF9oODMwMFtoXSk6IG5ldyBkZWZpbmVzLgorCSogY29mZi1oODMwMC5jOiBNb3JlIGFkZHJlc3NpbmcgbW9kZXMuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IENvcGUgd2l0aCBIODMwMCBtYWdpYworCW51bWJlci4KKwkqIGNwdS1oODMwMC5jOiBSZW1vdmVkIGRpc2Fzc2VtYmxlIHN0dWZmLiAoaDgzMDBfc2Nhbik6IFJlY29nbmlzZQorCUg4LzMwMEggbmFtZS4gKGNvbXBhdGlibGUpOiBOZXcgZnVuY3Rpb24uCisJKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWMpOiBDb3BlIHdpdGggbW9yZQorCWFkZHJlc3NpbmcgbW9kZXMuCisKK1R1ZSBKdW4gIDggMTA6MzA6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAorCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9ubHkgcm91bmQgdG8gcGFnZSBib3VuZGFyaWVzIGlmCisJRF9QQUdFRCBmbGFnIGlzIHNldCBmb3IgdGhlIG91dHB1dCBCRkQuCisKK0ZyaSBKdW4gIDQgMTU6NDc6NTIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoZ2V0X2luZGV4LCBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpeCBwb2ludGVyCisJY2FzdHMgdG8gd29yayBvbiBtYWNoaW5lIHdoZXJlIHNpemVvZihsb25nKSAhPSBzaXplb2YoaW50KSAhPQorCXNpemVvZihjaGFyICopLgorICAgICAgICAqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBEaXR0by4KKwkqIGNwdS1oODMwMC5jIGNvZmYtaDgzMDAuYzogU3VwcG9ydCBmb3IgSDgvMzAwLUguCisKK0ZyaSBKdW4gIDQgMTU6MjQ6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9scyk6IEZvciBlbXB0eSBzdHJpbmcgdGFibGUsIHdyaXRlCisJb3V0IDQgaW4gY29ycmVjdCBieXRlIG9yZGVyLiAgKGZyb20gbWlueWFyZEBibnIuY2EpCisKKwkqIGVsZjMyLWhwcGEuYzogRG9uJ3QgaW5jbHVkZSBsaWJocHBhLmggZm9yIG5vdzsgZGVmaW5lCisJQllURVNfSU5fV09SRCBpbnN0ZWFkLCB1bnRpbCBVdGFoIHNlbmRzIGEgYmV0dGVyIGZpeC4KKwkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBVc2UgeG1hbGxvYyBhbmQgeHJlYWxsb2MgaW5zdGVhZAorCW9mIG1hbGxvYyBhbmQgcmVhbGxvYy4KKworRnJpIEp1biAgNCAwNzo0OTowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgZGVjc3RhdGlvbi4KKwkobWlwcy0qLWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KKworCSogY29mZi1taXBzLmMgKGVjb2ZmX2dldF9kZWJ1Zyk6IEdldCB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IFBEUgorCWZvciB0aGUgRkRSLCBub3QgZnJvbSB0aGUgZmlyc3QgUERSIGluIHRoZSBmaWxlLgorCitUaHUgSnVuICAzIDE2OjQxOjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiAgTmV3IGZ1bmMgbmVlZGVkIGZvciBKVU1QX1RBQkxFLgorCitUaHUgSnVuICAzIDE1OjMzOjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbi4KKworVGh1IEp1biAgMyAxMzowNzo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3QgY3Jhc2ggaWYgbm8gc3ltYm9scyBoYXZlIGJlZW4KKwlhbGxvY2F0ZWQgeWV0LgorCisJRnJvbSBQZXRlciBIb29nZW5ib29tIChob29nZW5Ac2NoYWZlci5jcy51dGFoLmVkdSk6CisJKiBsaWJocHBhLmggKE1BWENPTUxFTik6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCisJKF9QQV9SSVNDX0lEKTogT25seSBkZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KKwkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguCisKKwlGcm9tIFJhbHBoIENhbXBiZWxsOgorCSogaG9zdHMvbWlwc2JzZC5oIChIT1NUX0RBVEFfU1RBUlRfQUREUik6IERlbGV0ZSBkZWZpbml0aW9uLgorCisJKiBlbGYzMi1ocHBhLmggKHN5bWV4dF9yb290UCwgc3ltZXh0X2xhc3RQKTogRGVsZXRlIGRlY2xzLgorCitUaHUgSnVuICAzIDAwOjIzOjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2dvMzIubWg6IGRlZmluZSBFWFRSQUxJQkVTIHRvIC1sbSAoZm9yIGJpbnV0aWxzKSwgYWxzbworCXJlbW92ZSBkZWZpbmVzIG9mIF9fTVNET1NfXyBhbmQgX19HTzMyX18gKHRoZXNlIGFyZSBpbiB0aGUKKwljb21waWxlciBub3cpLgorCitXZWQgSnVuICAyIDE3OjU3OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCUZyb20gVXRhaDoKKwkqIGhvc3RzL2hwcGFic2QuaDogRWxpbWluYXRlIHVzZSBvZiBvYnNvbGV0ZSBFWEZVTi4KKwkqIGNvbmZpZy9ocHBhYnNkLm1oOiBEb24ndCB1c2UgcmFubGliLgorCitUdWUgSnVuICAxIDA0OjE1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBlbGYuYzogTmV3IGZpbGUsIGZvciB3b3JkLXNpemUgaW5kZXBlbmRlbnQgY29kZS4KKwkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBNb3ZlZCB0byB0aGVyZSwgcmVuYW1lZCBiZmRfZWxmX2hhc2guCisJKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBlbGYubyBpbiBzdGFuZGFyZCBvYmplY3RzLgorCisJKiBiZmQtaW4uaCAoQ0FUMyk6IERlZmluZSBoZXJlLgorCSogbGliYW91dC5oLCBsaWJlbGYuaDogTm90IGhlcmUuCisKKwkqIGxpYmVsZi5oIChzdHJ1Y3Qgc3RydGFiKTogRGVmaW5lIGhlcmUuCisJKGJmZF9lbGZfbG9jYXRlX3NoKTogRGVjbGFyZSBoZXJlLgorCSogZWxmY29kZS5oIChzdHJ1Y3Qgc3RydGFiKTogRGVmaW5pdGlvbiBkZWxldGVkLgorCisJKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCBIUFBBX1BDUkVMX0NBTExfMTIuCisKKwkqIE1ha2VmaWxlLmluOiBNYWtlICJhbGwiLCBub3QgImJmZC5oIiwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0LgorCShzdG1wLWJmZC5oKTogTmV3IHRhcmdldDsgcHJldmVudHMgcmVidWlsZGluZyB3b3JsZCBpZiBiZmQuaAorCWhhc24ndCByZWFsbHkgY2hhbmdlZC4KKworCVR1ZSBNYXkgMjUgMTI6MTU6MTUgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCisKKwkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBQcm92aWRlIGVsZiBzdGFuZGFyZCBoYXNoIGZ1bmN0aW9uLgorCSh2YXJpb3VzKTogS2V5IG9mZiBvZiB0aGUgbWFjaGluZXMgdXNlX3JlbGFfcCBmaWVsZCB0byBkZXRlcm1pbmUKKwl3aGV0aGVyIHRvIHVzZSBSRUwgb3IgUkVMQSByZWxvY2F0aW9ucy4KKwkoZWxmX3N3YXBfcmVsb2Nfb3V0LCBlbGZfc3dhcF9yZWxvY19pbik6IE5ldyBmdW5jdGlvbnMuCisJKGVsZl9tYWtlX3NlY3Rpb25zKTogQWxsb2NhdGUgYSBwb2ludGVyIHRvIGhvbGQgYWxsIGRhdGEgZm9yIGEKKwlnaXZlbiBzZWN0aW9uLCBhbmQgY29weSBlYWNoIGZyYWdtZW50IGludG8gdGhlIGRhdGEgcmVnaW9uLgorCVVwZGF0ZSB0aGUgc2VjdGlvbidzIHBvaW50ZXIgd2l0aCB0aGUgUkVMIGltcGxpY2l0IGFkZGVuZHMgaWYgdGhlCisJbWFjaGluZSB1c2VzIFJFTCByZWxvY2F0aW9uLgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgdG8KKwllbGZfaTM4Nl9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGFuZCB1c2UgY3BwIHRvIG1hcCB0aGUgbmFtZSBiYWNrCisJaW50byB3YXMgZWxmMzItdGFyZ2V0LmggZXhwZWN0cy4KKwkoZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgdG8gZWxmX2kzODZfaW5mb190b19ob3d0by4KKwkoZWxmX2kzODZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHJlbG9jYXRpb24gc3VwcG9ydC4KKwkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IEFkZCBtaW5pbWFsIHJlbG9jYXRpb24gc3VwcG9ydC4KKworCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgdXNlX3JlbGFfcCwgZWxmXzY0X3AsCisJZWxmX2luZm9fdG9faG93dG9fcmVsIGZpZWxkcy4KKworCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iZWQpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IGZpZWxkcyBpbgorCWVsZl9iYWNrZW5kX2RhdGEuCisKKwlTdW4gTWF5IDMwIDE2OjM4OjI0IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AZmFzdC5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jOiBBZGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHN1cHBvcnQsIGZpeAorCXJlbG9jYXRpb24gaG93dG8gdGFibGUsIGFkZCBzdHViIGdlbmVyYXRpb24gc3VwcG9ydC4KKworCSogZWxmMzItaHBwYS5oOiBBZGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHN1cHBvcnQsIGZpeAorCXJlbG9jYXRpb24gaG93dG8gdGFibGUsIGFkZCBzdHViIGdlbmVyYXRpb24gc3VwcG9ydC4KKworCSogZWxmY29kZS5oIChiZmRfZWxmX2xvY2F0ZV9zaCk6IE5ldyBmdW5jdGlvbiB0byBsb2NhdGUgRUxGCisJc2VjdGlvbiBoZWFkZXIuCisKKwkqIGVsZmNvZGUuaCAoYmZkX2FkZF90b19zdHJ0YWIpOiBNYWRlIG5vbi1zdGF0aWMgZHVlIHRvIGEgY2FsbAorCWZyb20gZWxmMzItaHBwYS5jLgorCisJKiBlbGZjb2RlLmggKGVsZl9pZHhfb2Zfc3ltKTogUmV0dXJuIFNUTl9VTkRFRiBpbnN0ZWFkIG9mIDAgd2hlbgorCXRoZSBzeW1ib2wgaXMgbm90IGZvdW5kLgorCisJKiBlbGZjb2RlLmggKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBOb3QgYWxsIHNlY3Rpb24KKwlmaWxlIHBvc2l0aW9ucyB3ZXJlIGNvbXB1dGVkLgorCisJKiBlbGZjb2RlLmggKGVsZl9nZXRfc2VjdF90aHVuayk6IE5ldyBmdW5jdGlvbi4KKworCSogaHBwYS5jIChzaWduX2V4dCk6IFJlaW1wbGVtZW50LgorCisJKiBocHBhLmMgKHJvdW5kX2Rvd24scm91bmQscm91bmRfdXAsTCxSLExTLFJTLExELFJELExSLFJSKTogTWFrZQorCXRoZXNlIGZ1bmN0aW9ucyBzdGF0aWMuCisKK1R1ZSBKdW4gIDEgMTQ6NDA6NDEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiAgTW92ZSBjbG9zZXIgdG8gaGVhZGVycyAtIGFuZCBhZnRlciAnYWxsJyEKKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6ICBEb24ndCBzZXQKKwlCU0ZfREVCVUdHSU5HIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzLCBvbmx5IEJTRl9DT05TVFJVQ1RPUi4KKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogIFRyYW5zbGF0ZQorCWNvbnN0cnVjdG9yIHN5bWJvbHMgcHJvcGVybHkuCisKK1RodSBNYXkgMjcgMTY6MDk6MDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpOiB1c2UgNCBieXRlIGFsaWdubWVudCBhcyBhCisJbWluaW11bS4KKwkqIGFvdXQtdGFyZ2V0LmggKG1pbmltdW1fYWxpZ25tZW50KTogOCBieXRlIGFsaWdubWVudCBpcyByaWdodC4KKwkoZml4IGxkLzI2ODApCisKK1RodSBNYXkgMjcgMTM6Mzg6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBCdWlsZCBiZmQtaW4yLmggaW4gc291cmNlIGRpcmVjdG9yeSwKKwlmcm9tIGJmZC1pbi5oIGFuZCAuYyBmaWxlcy4gIEJ1aWxkIGJmZC5oIGluIGJ1aWxkIGRpcmVjdG9yeSwKKwlzdWJzdGl0dXRpbmcgaW4gcmVxdWVzdGVkIHRhcmdldCB3b3JkIHNpemUuICBJbnNlcnQgd29yZCBzaXplIGludG8KKwltYWtlZmlsZSwgYW5kIG1heWJlIGVuYWJsZSA2NC1iaXQgdGFyZ2V0cy4KKworCSogYmZkLWluLmgsIGxpYmJmZC5jLCBkZW1vNjQuYywgdGFyZ2V0cy5jOiBEZWZpbmUgQkZENjQgaWYgNjQgYml0cworCWFyZSBhdmFpbGFibGUuICBDb25kaXRpb25hbGl6ZSBvbiB0aGlzLiAgQXNzdW1lIEhPU1RfNjRfQklUCisJd2lsbCBiZSBkZWZpbmVkIGlmIG5lZWRlZCwgc28gNjQtYml0IHRhcmdldHMgYXJlIGNvbmRpdGlvbmFsaXplZAorCW9ubHkgaW4gdGhlIE1ha2VmaWxlLgorCitUdWUgTWF5IDI1IDE0OjAzOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogbGliYmZkLmMgKENPRVJDRTY0KTogUmV3cml0ZSB0byBhdm9pZCBvdXQtb2YtcmFuZ2UgdmFsdWVzLgorCisJKiBjb2ZmLXNoLmMgKHJ0eXBlMmhvd3RvKTogUHV0IGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyLgorCShleHRyYV9jYXNlKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZS4KKworCSogY29mZi1taXBzLmMgKGVjb2ZmX3ByaW50X3N5bWJvbCk6IENhc3QgYmZkX3ZtYSB2YWx1ZXMgdG8gbG9uZworCWJlZm9yZSBjYWxsaW5nIHByaW50Zi4KKworCSogZWxmY29kZS5oOiBOZXcgZmlsZSwgYWxtb3N0IGNvbXBsZXRlbHkgZGVyaXZlZCBmcm9tIG9sZCBlbGYzMi5jLgorCSogZWxmMzIuYzogTm93IGp1c3QgZGVmaW5lIEFSQ0hfU0laRSBhbmQgaW5jbHVkZSBlbGZjb2RlLmguCisJKiBNYWtlZmlsZS5pbiAoZWxmNjQubyk6IExpc3QgZGVwZW5kZW5jaWVzLCBkb24ndCBidWlsZCBieQorCWRlZmF1bHQuCisJKGVsZjY0LmMpOiBBZGQgdG8gbGlzdCBvZiBzb3VyY2VzLgorCShlbGYzMi5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KKwkqIGVsZjMyLSouYzogVXBkYXRlZCB0eXBlL21hY3JvL3N0cnVjdHVyZSBuYW1lcy4gIENsZWFuZWQgdXAKKwluYW1lc3BhY2UgcG9sbHV0aW9uOyByZW5hbWUgdmVjdG9ycy4KKwkqIHRhcmdldHMuYywgY29uZmlnLyotZWxmLm10OiBVcGRhdGVkLgorCSogQWxsIHVzZXMgb2YgMzItYml0IHZlcnNpb25zIG9mIHN0cnVjdHVyZXMsIHJvdXRpbmVzLCBhbmQgbWFjcm9zCisJcmVuYW1lZC4KKworCSogTWFrZWZpbGUuaW4gKGFyY2h1cmVzLm8sIHRhcmdldHMubyk6IERlcGVuZCBvbiBNYWtlZmlsZS4KKworTW9uIE1heSAyNCAxNTo1MzoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogZWxmMzItaTM4Ni5jIChlbnVtIHJlbG9jX3R5cGUpOiBObyBjb21tYSBhZnRlciBsYXN0IGVudW1lcmF0b3IuCisKKwkqIGVsZjMyLmMgKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IEhhbmRsZSBpbmRleCBvZiB6ZXJvCisJc3BlY2lhbGx5LgorCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBuZWVkIHRvIGRvCisJc28gaGVyZS4KKwkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlbGV0ZWQgb25lIHVudXNlZCB2YXJpYWJsZSBhbmQKKwlpbml0aWFsaXplZCBhbm90aGVyIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KKwkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZS4KKworRnJpIE1heSAyMSAxOTowNDoyMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBpMzg2bHlueC5jOiAgTmV3IG1vZHVsZSBmb3IgTHlueCB2YXJpYW50IG9mIGEub3V0LgorCSogTWFrZWZpbGUuaW4gKEJGRF9CQUNLRU5EUyBDRklMRVMgZGVwZW5kcyk6ICBBZGQgaTM4Nmx5bnguYy4KKwkqIGdlbi1hb3V0LmM6ICBHZXQgcmlkIG9mIGRlZnVuY3QgZW5kaWFuIHN0dWZmLCBwcmludCBvdXQgdHJ1ZQorCXBhZ2VzaXplLgorCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIEFkZCBpMzg2bHlueF92ZWMuCisKK0ZyaSBNYXkgMjEgMTc6MDI6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIGkzODYtc2NvLm10IGZvciBpWzM2XTg2LSotaXNjKi4KKworRnJpIE1heSAyMSAxMzo0NDoxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtdGFyZ2V0LmgsIGFvdXR4LmgsIGNvZmYtYWxwaGEuYywKKwljb2ZmLW1pcHMuYywgY29mZmdlbi5jLCBlbGYzMi5jLCBpZWVlLmMsIGxpYmFvdXQuaCwgbGliY29mZi1pbi5oLAorCWxpYmVsZi5oLCBtaXBzYnNkLmMsIG9hc3lzLmMsIHNjby1jb3JlLmMsIHNyZWMuYywgdGVraGV4LmMsCisJdHJhZC1jb3JlLmM6IERlZmluZSBhIFRBUkdFVF9nZXRfc3ltYm9sX2luZm8gZnVuY3Rpb24gb3IgbWFjcm8uCisJUmVtb3ZlIHRoZSBiZmRfcHJpbnRfc3ltYm9sX25tIGNhc2UgZnJvbSBUQVJHRVRfcHJpbnRfc3ltYm9sLgorCisJKiBiZmQtaW4uaDogRG9uJ3QgZGVmaW5lIGJmZF9wcmludF9zeW1ib2xfbm0uCisJRGVmaW5lIHN5bWJvbF9pbmZvIHR5cGUuCisJKEpVTVBfVEFCTEUpOiBTZXQgX2dldF9zeW1ib2xfaW5mbyBlbGVtZW50LgorCisJKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlLCBiZmRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb25zLgorCShiZmRfZGVjb2RlX3N5bWNsYXNzKTogVXNlIGNvZmZfc2VjdGlvbl90eXBlLgorCisJKiB0YXJnZXRzLmM6IEFkZCBiZmRfZ2V0X3N5bWJvbF9pbmZvIGNhbGwuCisKK1dlZCBNYXkgMTkgMTU6MzA6NTIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6ICBVc2UgdW5zaWduZWQgY2hhciB0byBhdm9pZAorCWNvbXBsYWludHMgZnJvbSBhbmNpZW50IGdjYydzLgorCitXZWQgTWF5IDE5IDE1OjUxOjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0cmFkLWNvcmUuYzogIENoZWNrIG1hY3JvIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQuCisJaG9zdHMvaTM4NmxpbnV4Lmg6ICBEZWZpbmUgaXQuCisKK01vbiBNYXkgMTcgMTU6MDA6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIFZFUlNJT04sIGJmZC1pbi5oOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMi4KKworCSogaHBwYS5jIChhc3NlbWJsZV8zLCBkaXNfYXNzZW1ibGVfMywgYXNzZW1ibGVfMTIsCisJZGlzX2Fzc2VtYmxlXzEyLCBhc3NlbWJsZV8xNywgZGlzX2Fzc2VtYmxlXzE3LCBhc3NlbWJsZV8yMSwKKwlkaXNfYXNzZW1ibGVfMjEsIHNpZ25fZXh0LCBvbmVzLCBzaWduX3VuZXh0LCBsb3dfc2lnbl9leHQsCisJbG93X3NpZ25fdW5leHQsIHJvdW5kX2Rvd24sIHJvdW5kLCByb3VuZF91cCwgTCwgUiwgTFMsIFJTLCBMRCwgUkQsCisJTFIsIFJSLCBocHBhX2ZpZWxkX2FkanVzdCk6IE5ldyBmdW5jdGlvbnMuCisKK01vbiBNYXkgMTcgMTA6MDQ6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQWRkZWQgc3VwcG9ydCBmb3IgaW5kaXJlY3QKKwlzdGFicyBzeW1ib2xzLCBpbmNsdWRpbmcgbmV3IGluZGlyZWN0X3B0cl9wdHIgYXJndW1lbnQuCisJKGVjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFBhc3MgbmV3IGFyZ3VtZW50IGluIGNhbGxzIHRvCisJZWNvZmZfc2V0X3N5bWJvbF9pbmZvLgorCitGcmkgTWF5IDE0IDAwOjA1OjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBGb3IgbTY4ayBzeXN2IHN5c3RlbXMsIHVzZSBtNjhrLWNvZmYuCisKKwkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgREVGQVVMVF9WRUNUT1IgaGVyZS4KKwkoVERFRkFVTFRTKTogRGVmaW5lIGl0IGhlcmUuICBVc2UgdGhlIG5ldyBuYW1lLgorCisJKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2JhY2tlbmRfZGF0YSk6IERlbGV0ZTsgcmVseSBvbiBkZWZhdWx0CisJdmFsdWVzIGluc3RlYWQuCisKKwkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBzb21lIEhQUEEgcmVsb2MgdHlwZXMuCisKKwkqIGFpeDM4Ni1jb3JlLmMgKE5PX0dFVFMpOiBGaXggUFJPVE8gaW52b2NhdGlvbiB0byBoYXZlIGNvcnJlY3QKKwludW1iZXIgb2YgYXJndW1lbnRzLgorCShhaXgzODZfY29yZV9maWxlX3ApOiBJbml0aWFsaXplIGNvcmVfc2l6ZSB0byBjb3JyZWN0IHZhbHVlLgorCitXZWQgTWF5IDEyIDE0OjM5OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZSwgc2V0IHRvICQoQ0MpLgorCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDX0ZPUl9CVUlMRC4KKworCSogYm91dC5jIChhb3V0MzJfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZSB0byBiZQorCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSByYXRoZXIgdGhhbiBiZmRfdHJ1ZS4KKworCSogY29mZi1taXBzLmM6IEluY2x1ZGUgbGliYW91dC5oIGFuZCBhb3V0L2FvdXQ2NC5oIHRvIGdldAorCWRlZmluaXRpb25zIGZvciBOX1NFVFtBVERCXS4KKwkoZWNvZmZfaG93dG9fdGFibGUpOiBNb3ZlZCBuZWFyIHRvcCBvZiBmaWxlLgorCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBJZiBhIFNUQUJTIHN5bWJvbCBvZiB0eXBlIE5fU0VUW0FUREJdIGlzCisJc2VlbiwgY29vayB1cCBhIGNvbnN0cnVjdG9yIHNlY3Rpb24gb2YgdGhlIHNhbWUgbmFtZSBhbmQgcHV0IGluIGEKKwlyZWxvYyBwb2ludGluZyB0byB0aGUgc3ltYm9sLiAgVGhpcyBsZXRzIHRoZSBHTlUgbGlua2VyIGJ1aWxkCisJZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgd2l0aG91dCB1c2luZyBjb2xsZWN0LgorCitUdWUgTWF5IDExIDAwOjMzOjMxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb2ZmLW04OGsuYyAobTg4a2Jjc192ZWMpOiAgU3ltYm9scyBoYXZlIHVuZGVyYmFycy4KKworTW9uIE1heSAxMCAwNTo1NTo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogaG9zdHMvbWluaWZyYW1lLmg6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmhvc3Q6IFVzZSBpdC4KKworU3VuIE1heSAgOSAxNjozNjo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLWJzZCk6ICBDaGFuZ2UgdG8gaHBwYSotKi1ic2QqCisJKiBjb25maWd1cmUuaW4gKGhwcGEqLSotaHB1eCk6ICBDaGFuZ2UgdG8gaHBwYSotKi1ocHV4KgorCSogY29uZmlndXJlLmluIChtNjgqLWhwLWJzZCk6ICBDaGFuZ2UgdG8gbTY4Ki1ocC1ic2QqCisJKiBjb25maWd1cmUuaW4gKG02OCotKi1ocHV4KTogIENoYW5nZSB0byBtNjgqLSotaHB1eCoKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLWJzZCk6ICBDaGFuZ2UgdG8gKi0qLWJzZCoKKworV2VkIE1heSAgNSAxNjowODozMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6ICBDYXN0IGVudW1zIHRvCisJaW50LCBmb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBQb3J0YWJsZSBDIENvbXBpbGVyLgorCitNb24gTWF5ICAzIDE0OjM3OjAxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIGNwdS1zaC5jIGFuZCBjb2ZmLXNoLmMuCisKK01vbiBNYXkgIDMgMTQ6MDM6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogR2V0IHRhcmdldCBuYW1lIHJpZ2h0IGZvciBtNjgqLSotaHB1eC4KKworU3VuIE1heSAgMiAxMTozOTo0NCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdHJhZC1jb3JlLmMgKE5PX1NJR05FRF9HRVQpOiAgTmV3IG1hY3JvLgorCSogdHJhZC1jb3JlLmMgKHRyYWRfY29yZV92ZWMpOiAgVXNlIG5ldyBOT19TSUdORURfR0VUIGluc3RlYWQgb2YKKwlzaWduZWQgTk9fR0VULCB3aGVyZSBhcHByb3ByaWF0ZS4KKworCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotbGludXgqKTogIEFkZDsgYmZkX3RhcmdldCA9IGkzODYtbGludXguCisJKiBjb25maWd1cmUuaW4gKCotKi1saW51eCopOiAgUmVtb3ZlIHVudGlsIGxpbnV4IHBvcnQgZm9yIGEKKwlub24taTM4Ni9pNDg2IHN5c3RlbSBpcyBhY3R1YWxseSBhdmFpbGFibGUuCisKK0ZyaSBBcHIgMzAgMjA6MDQ6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogbGliaHBwYS5oOiAgI3VuZGVmIGVfKiBzeW1ib2xzIHdoaWNoIGNvbWUgZnJvbSA8bWFjaGluZS9zb20uaD4KKwl3aGVuIGNvbXBpbGluZyB1bmRlciBIUFVYLgorCitGcmkgQXByIDMwIDE3OjI1OjIzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIFRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KKwkqIGhwcGEuYyAoaHBwYV9jb3JlX2ZpbGVfcCk6IFByb3ZpZGUgYSB0ZW1wb3JhcnkgZHVtbXkgcm91dGluZQorCWZvciBIT1NUX0hQUEFCU0QuCisJKiBiZmQvaG9zdHMvaHBwYWJzZC5oOiBGaXggZGVjbGFyYXRpb25zIG9mIG1hbGxvYyBhbmQgZnJlZS4KKwkqIGJmZC9saWJocHBhLmg6IEluY2x1ZGUgc3lzZGVwIGhlcmUuICBDb25kaXRpb25hbGl6ZQorCWluY2x1ZGVzIGJhc2VkIG9uIEhPU1RfSFBQQUhQVVggb3IgSE9TVF9IUFBBQlNELgorCVByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yIE1BWENPTUxFTiBhbmQgX1BBX1JJU0NfSUQgc3VpdGFibGUKKwlmb3IgQlNELgorCitGcmkgQXByIDMwIDE3OjM0OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWxmMzItaHBwYS5jOiBEb24ndCBpbmNsdWRlIGEub3V0LmguICBBcHBhcmVudGx5IG5vdCBldmVuIHRoZQorCUdOVSB2ZXJzaW9uIGlzIG5lZWRlZC4KKworRnJpIEFwciAzMCAwOTozODo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaDogdXNlIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMgcmF0aGVyIHRoYW4gY2FzdGluZyBhYm9ydC4KKworVGh1IEFwciAyOSAxMTozMDozMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEJ1aWxkIGVsZjMyLWhwcGEuby4KKworCSogc3ltcy5jIChCU0ZfRlVOQ1RJT04pOiBOZXcgc3ltYm9sIGZsYWcuCisKKwkqIGVsZjMyLWhwcGEuYzogRml4ZWQgdG8gd29yayB3aXRoIGVsZjMyLXRhcmdldC5oLgorCisJKiBocDMwMGhwdXguYyAoTkFNRSwgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luKTogRml4IGZvcgorCXRyYWRpdGlvbmFsIEMuCisJKiBsaWJhb3V0LmggKE5BTUUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgorCisJKiBsaWJlbGYuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCisJKGVsZl9zeW1ib2xfdHlwZSk6IE1vdmVkIGhlcmUsIGFkZGVkIG5ldyBmaWVsZHMuCisJKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkIGBnbG9iYWxfc3ltJzsgSSBzdXNwZWN0IHRoaXMKKwltYXkgYmUgbWlzcGxhY2VkLgorCSogZWxmMzIuYyAoZWxmX3N5bWJvbF90eXBlKTogRGVsZXRlZCBmcm9tIGhlcmUuCisJKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkcyByYXdfc3ltcyBhbmQgaW50ZXJuYWxfc3ltcywgdG8KKwlwb2ludCB0byBiYWNrZW5kIHZlcnNpb25zIG9mIHN5bWJvbHMuCisJKG9ial9zeW1ib2xzLCBvYmpfcmF3X3N5bXMsIG9ial9pbnRlcm5hbF9zeW1zKTogTmV3IG1hY3Jvcy4KKwkoZWxmX3N3YXBfcGhkcl9vdXQsIGVsZl9idWlsZF9waGRycywgZWxmX3dyaXRlX3BoZHJzKTogTmV3CisJZnVuY3Rpb25zLgorCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGlmIGFwcHJvcHJpYXRlLgorCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVbm5hbWVkIHNlY3Rpb25zIGdldCBlbXB0eSBzdHJpbmcgZm9yCisJbmFtZSwgbm90ICJ1bm5hbWVkIi4gIEhhbmRsZSBTSFRfTk9CSVRTIHNlcGFyYXRlbHkgZnJvbQorCVNIVF9QUk9HQklUUywgYW5kIHNldCBzb21lIGRpZmZlcmVudCBmbGFncy4KKwkoZWxmX2ZpbGVfcCk6IE5ldyByb3V0aW5lLgorCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6IENhbGwgaXQuCisJKGVsZl9vYmplY3RfcCk6IEhhbmRsZSBFTV9IUFBBLgorCShlbGZfc3ltYm9sX2Zyb20sIGVsZl9pZHhfb2Zfc3ltKTogTmV3IGZ1bmN0aW9ucy4KKwkoZWxmX21ha2Vfc2VjdGlvbnMpOiBHZXQgc3ltYm9sIG51bWJlciByaWdodCBmb3IgcmVsb2NhdGlvbnMuICBTZXQKKwlTSEZfQUxMT0MsIFNIRl9XUklURSwgU0hGX0VYRUNJTlNUUiB3aGVuIGFwcHJvcHJpYXRlLgorCShlbGZfZmFrZV9zZWN0aW9ucyk6IEJTUyBzZWN0aW9uIHNob3VsZCBiZSBTSFRfTk9CSVRTLCBub3QKKwlTSFRfUFJPR0JJVFMuICBBbHdheXMgZ2VuZXJhdGUgc3ltdGFiIGFuZCBzdHJ0YWIsIG5vdCBvbmx5IGlmCisJcmVsb2NhdGlvbnMgYXJlIG5lZWRlZC4gIFNldCBTSEZfKiBmbGFncyBhcyBhcHByb3ByaWF0ZS4KKwkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZSBiZmRfYXJjaF9ocHBhLgorCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gc3ltYm9sIGNvdW50LgorCVN0b3JlIGEgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIHN5bWJvbDsgd3JpdGUgdGhlIHNpemUgZmllbGQKKwlwcm9wZXJseTsgbWFrZSBzb21lIGd1ZXNzZXMgYWJvdXQgdGhlIHR5cGUgZmllbGQuICBTZXQgc2VjdGlvbgorCXR5cGUgY29ycmVjdGx5IGZvciBzdHJpbmcgdGFibGVzLgorCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogQ2hlY2sgZm9yIGFic29sdXRlIGFuZCBjb21tb24gc2VjdGlvbnMKKwlmaXJzdC4KKwkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERpdHRvLgorCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGVsZl9zeW1ib2xfdHlwZSBpbnN0ZWFkIG9mIGFzeW1ib2wuCisJVXNlIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJ1bm5hbWVkIiBmb3IgbmFtZWxlc3Mgc3ltYm9scy4KKwlIYW5kbGUgU1RUWV9GVU5DIHR5cGUsIGFuZCB3ZWlyZG5lc3Mgd2l0aCAiJGdsb2JhbCQiIHN5bWJvbCBmb3IKKwlIUFBBIChvbmx5PykuICBEb24ndCBmcmVlIHJhdyBzeW1ib2xzOyBrZWVwIHRoZSBwb2ludGVyIGFyb3VuZCBmb3IKKwlsYXRlci4KKwkoZWxmX3NldF9hcmNoX21hY2gpOiBIYW5kbGUgYmZkX2FyY2hfaHBwYS4KKwkoZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UuCisJKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMsIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldAorCW91dHB1dF9oYXNfYmVndW4gZmllbGQgYWZ0ZXIgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLgorCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIGltbWVkaWF0ZWx5LAorCXJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIHdob2xlIGZpbGUgYW5kIHdyaXRpbmcgaXQgYXQgY2xvc2UgdGltZS4KKworCSogbGliaHBwYS5oIChlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSwgZW51bQorCWhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwX2FsdCwgZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZSwgZW51bQorCWhwcGFfcmVsb2NfZXhwcl90eXBlX2FsdCk6IE5ldyBlbnVtZXJhdG9yIHR5cGVzLgorCisJKiBjb25maWcvaHBwYS1lbGYubXQsLiBjb25maWcvaHBwYW9zZi5taDogSFAgUEEvT1NGIHN1cHBvcnQuCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZS5ob3N0OiBVc2UgdGhlbS4KKworV2VkIEFwciAyOCAyMzoyMTowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLXRhcmdldC5oOiBBbGxvdyBvdmVycmlkZXMgb2YgYXJtYXAgZGVmYXVsdHMuCisKKwkqIGVsZjMyLWhwcGEuYywgZWxmMzItaHBwYS5oOiBOZXcgZmlsZXMuCisKKwkqIGNvbmZpZy9ocDMwMGhwdXgubXQ6IE5ldyBmaWxlLgorCitUdWUgQXByIDI3IDA1OjM5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBhaXgzODYtY29yZS5jIChOT19HRVRTKTogTmV3IG1hY3JvOyBOT19HRVQgZm9yIHNpZ25lZCB2YWx1ZXMuCisJKGFpeDM4Nl9jb3JlX3ZlYyk6IFVwZGF0ZSBmb3IgbmV3IGZpZWxkcy4KKworCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDYWxsIHRhcmdldC1zcGVjaWZpYworCXNsdXJwX2FybWFwIGNvZGUsIGluc3RlYWQgb2YgYmZkX3NsdXJwX2FybWFwLgorCShiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogTmV3IGZ1bmN0aW9uLgorCSogbGliYmZkLWluLmggKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBEZWNsYXJlIGl0LgorCSogYW91dC10YXJnZXQuaCAoQVJfUEFEX0NIQVIpOiBEZWZpbmUgaXQgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KKwkodmVjKTogVXNlIGl0LgorCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBOZXcgZmllbGQgZm9yIHN1YmZvcm1hdCwgZm9yCisJZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gaGlnaGx5IHNpbWlsYXIgYS5vdXQgZm9ybWF0cy4KKwkqIGFvdXR4LmggKE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbik6IE5ldyBtYWNybywgZGVmYXVsdHMgdG8gbG9jYWwKKwl2ZXJzaW9uIG9mIGZ1bmN0aW9uLgorCShzd2FwX2V4ZWNfaGVhZGVyX2luKTogRG9uJ3QgZGVmaW5lIGlmIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBpcworCWFscmVhZHkgZGVmaW5lZC4KKwkqIGhwMzAwaHB1eC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGl0LgorCitNb24gQXByIDI2IDEzOjI0OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgdGFyZ2V0cy5jOiBTdXBwb3J0IGZvcgorCUhpdGFjaGkgU0guCisKK01vbiBBcHIgMjYgMTM6NTU6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDaGVjayB0aGUgZmlsZSBzaXplLgorCitNb24gQXByIDI2IDEzOjI0OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb2ZmLWFscGhhLmM6IFJlbW92ZSBkdXBsaWNhdGUgZnVuY3Rpb24gYW5kIGFkZCB3YXJuaW5ncy4KKworTW9uIEFwciAyNiAxMToyNTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHNjby1jb3JlLmMgKHNjb19jb3JlX3ZlYyk6IEFkZCBpbml0aWFsaXplcnMgZm9yIG5ldyB0YXJnZXQKKwlmaWVsZHMuCisKK1NhdCBBcHIgMjQgMjE6MzM6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggW19MSVRdOiBSZWNvZ25pemUgLmxpdCBzZWN0aW9uLgorCitGcmkgQXByIDIzIDE5OjAwOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb2ZmLWFscGhhLmMsIGNwdS1hbHBoYS5jLCBjb25maWcvYWxwaGFvc2YubXQsCisJY29uZmlnL2FscGhhb3NmLm10LCBob3N0cy9hbHBoYW9zZi5oOiAgTmV3IGZpbGVzLgorCitGcmkgQXByIDIzIDE2OjQ4OjQ2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1lcmdlIGluIEhQUEEvQlNEIGNoYW5nZXMgZnJvbSBVdGFoLgorCSogaHBwYS5jOiAgVXNlIHRoaXMgZm9yIGJvdGggSFBVWCAmIEJTRC4KKwkqIHRhcmdldHMuYzogIEVuYWJsZSBocHBhX3ZlYyBmb3IgYm90aCBIUFVYICYgQlNELgorCSogY29uZmlnL2hwcGFic2QubXQ6ICBUREVGSU5FUyA9PiBUREVGQVVMVFMuCisJKiBob3N0cy9ocHBhYnNkLmg6ICAjZGVmaW5lIEhPU1RfSFBQQUJTRC4KKworV2VkIEFwciAyMSAwMTo1MDoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogbGliYmZkLmM6ICBXaGl0ZXNwYWNlIGNoYW5nZXMgYXJvdW5kIGJ5dGVzd2FwIG1hY3Jvcy4KKwkqIGxpYmJmZC1pbi5oOiAgV2hpdGVzcGFjZSBjaGFuZ2VzIGFyb3VuZCBieXRlc3dhcCBkZWNsYXJhdGlvbnMuCisKK1R1ZSBBcHIgMjAgMTU6NTk6MDcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmggKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBEb24ndCBkZWZhdWx0IGJmZF9lcnJvciB0bworCXN5c3RlbV9lcnJvciBhbnltb3JlLiAgSXQgY29uZnVzZXMgYmZkX2NoZWNrX2Zvcm1hdCgpLgorCitNb24gQXByIDE5IDIzOjAzOjA4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGJmZC5jOiAgQWRkIHNnaV9jb3JlX2RhdGEgdG8gdGRhdGEgdW5pb24uCisJKiBjb2ZmLW1pcHMuYzogIEFkZCBJcml4IDQueCBjb3JlIGZpbGUgc3VwcG9ydC4KKwkqIGhvc3RzL2lyaXg0Lmg6ICAjZGVmaW5lIEhPU1RfSVJJWDQuCisKK01vbiBBcHIgMTkgMTg6NTI6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayB0aGF0IHRoZQorCXN5bWJvbCdzIHNlY3Rpb24gZG9lcyBnZXQgc2V0LgorCShzbHVycF9zeW1ib2xfdGFibGUpOiBaZXJvIGluZGV4IG1lYW5zIG51bGwtc3RyaW5nIG5hbWUuCisKKwkqIGFvdXR4LmggKHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIHN0cnVjdCBzdHJpbmd0YWJfZGF0YSk6IE5ldworCWRhdGEgc3RydWN0dXJlcy4KKwkoaGFzaCwgc3RyaW5ndGFiX2luaXQsIGFkZF90b19zdHJpbmd0YWIsIGVtaXRfc3RydGFiLCBjb21wYXJlKToKKwlOZXcgZnVuY3Rpb25zLgorCSh3cml0ZV9zeW1zKTogVXNlIHRoZW0sIHRvIHJlZHVjZSBzdHJpbmcgdGFibGUgc2l6ZS4KKworTW9uIEFwciAxOSAxNjo0NToxMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdHJhZC1jb3JlLmMgKHRyYWRfY29yZV92ZWMpOiAgQWRkIDYgbmV3IGluaXRpYWxpemVycyB0byBtYXRjaAorCSAgbmV3IHNpZ25lZCBnZXQvcHV0IGZpZWxkcy4gIE1pbm9yIHJlZm9ybWF0dGluZyB0byBsYWJlbAorCSAgc29tZSBmaWVsZHMuCisKK01vbiBBcHIgMTkgMDY6MDk6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGJmZC1pbi5oOiBJbnNlcnQgY29tbWVudCBhYm91dCBTVlIzIGNvbXBpbGVyIHdhcm5pbmdzLgorCisJKiBob3N0cy97aHAzMDAsaTM4NmlzYyxpMzg2dn0uaDogUmVtb3ZlIHVudXNlZCAjZGVmaW5lcyBvZiB7cix9aW5kZXgKKwkoYmZkIHVzZXMgc3RyY2hyIGFuZCB0aGUgYnJva2VuIFNWUjMuMiBjcHAgbG9zZXMgd2l0aCB0aGUgZGVmaW5lcykuCisKKwkqIGxpYmJmZC5jOiBiZmRfcHV0KjogUmVtb3ZlIGNhc3RzIHRvIGJmZF92bWEuCisKK0ZyaSBBcHIgMTYgMTc6NDk6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGFvdXRmMS5oIChpbnRlcm5hbF9zdW5vc19jb3JlKTogTWFrZSBjX3N0YWNrdG9wIGEgYmZkX3ZtYS4KKwkoc3dhcGNvcmVfc3BhcmMpOiBNYWtlIHNwIGEgYmZkX3ZtYS4KKworVGh1IEFwciAxNSAwOTowOToxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogbGliYmZkLmM6IEFkZCBzaWduZWQgdmVyc2lvbnMgb2YgYmZkX3toXyx9e2dldCxwdXR9X3NpZ25lZF88c2l6ZT4uCisJbGliYmZkLmMsIGxpYmJmZC1pbi5oOiBBZGQgX2RvKnNpZ25lZCouCisJdGFyZ2V0cy5jLCBhbGwgdGFyZ2V0czogQWRkIGJmZCpzaWduZWQqLgorCWJmZC1pbi5oOiBBZGQgYmZkX3NpZ25lZF92bWEuICBBZGQgY29tbWVudHMuCisKKwkqIGJmZC1pbi5oIChiZmRfZXJyb3IpLCBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBBZGQgZmlsZV90cnVuY2F0ZWQuCisKKwkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZXJyb3IpOiBDaGVjayBlcnJvciByZXR1cm4gZnJvbQorCV9iZmRfY2hlY2tfZm9ybWF0IHJvdXRpbmVzLgorCitXZWQgQXByIDE0IDIzOjQ4OjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6IEltcHJvdmUgZXJyb3IgY2hlY2tpbmcgYW5kCisJcmVjb2duaXplIC5kYXRhIHNlY3Rpb24gaWYgcHJlc2VudC4KKworVGh1IEFwciAxNSAwMTowMDoyOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoYW91dF8qX2FkanVzdF9zaXplc19hbmRfdm1hcyk6ICBBdm9pZCBgc2FuaXR5JworCWNoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciBzZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBCU1MKKwlzZWN0aW9uIChhbmQgdGhlIGZpbGUgaGVhZGVyIGNhbid0IHNwZWNpZnkgdGhpcykuICBMZXQgdGhlIHVzZXIKKwlzZXQgaXQgd2hlcmV2ZXIgdGhleSB3YW50LCByZWdhcmRsZXNzIG9mIHdoYXQgZ29lcyBpbiB0aGUgaGVhZGVyLgorCisJKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiAgUGFzcyBhbGwgaWVlZSBzZWN0aW9uIG5hbWVzCisJc3RyYWlnaHQgdGhyb3VnaCBpbnRvIEJGRCBzZWN0aW9ucy4gIEFkZCBjb21tZW50cy4KKworV2VkIEFwciAxNCAyMDozNDo1NCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCUNsZWFudXAgaW4gcHJlcGFyYXRpb24gZm9yIGJldHRlciA2NC1iaXQgaG9zdCBzdXBwb3J0LgorCisJKiBiZmQtaW4uaCAoYmZkXzY0X3R5cGUpOiAgUmVtb3ZlLgorCSogbGliYmZkLmMgKF9kb19nZXRiNjQsIF9kb19wdXRiNjQpOiAgVXNlIGJmZF92bWEsIG5vdCBiZmRfNjRfdHlwZS4KKworCSogYmZkLWluLmggKGJmZF9zaXplKTogIFJlbW92ZS4KKworCSogYmZkLWluLmggKGJmZF9vZmZzZXQpOiAgUmVtb3ZlLCBhZnRlciBmaXhpbmcgbGQvbGRsYW5nLltjaF0uCisKKwkqIGJmZC1pbi5oIChiZmRfd29yZCk6ICBSZW1vdmUuCisJKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogIFJlcGxhY2UgYmZkX3dvcmQgd2l0aCBiZmRfdm1hLgorCisJKiBiZmQtaW4uaCAocmF3ZGF0YV9vZmZzZXQpOiAgUmVtb3ZlLgorCSogcmVsb2MuYyAoYXJlbGVudCk6ICBSZXBsYWNlIHJhd2RhdGFfb2Zmc2V0IHdpdGggYmZkX3NpemVfdHlwZS4KKwkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaW50LgorCShlbnVtIGJmZF9yZWxvY19zdGF0dXMpOiAgQ29tbWVudCBjbGVhbnVwLgorCisJKiBhb3V0LWFkb2JlLmMsIGNwdS1oODMwMC5jLCBtaXBzYnNkLmMsIHNyZWMuYzogbGludCAtV2FsbC4KKworVHVlIEFwciAxMyAxMToxOTo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmggKHN3YXBjb3JlX3NwYXJjKTogR3Vlc3MgdGhlIHJpZ2h0IHZhbHVlIG9mIFVTUlNUQUNLLgorCitNb24gQXByIDEyIDE0OjE4OjAwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBlbGYzMi5jOiAgQ2xlYW4gdXAgb2xkIGNvbW1lbnRzLgorCitGcmkgQXByICA5IDEwOjQzOjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3N1bjMuaDogU3RyaW5nIGFyZ3VtZW50IHRvIGZwcmludGYgaXMgY29uc3QuCisKKwkqIGNvZmYtbWlwcy5jOiBSZW5hbWVkIFBBR0VfU0laRSB0byBST1VORF9TSVpFLCB0byBhdm9pZCBjb25mdXNpb24KKwlvbiBzeXN0ZW1zIHdoaWNoIGRlZmluZSBQQUdFX1NJWkUgaW4gPGxpbWl0cy5oPi4KKworVGh1IEFwciAgOCAxMDoyODowMCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogVXNlIG5ldyBtYWNybworCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwgdG8gYWxsb3cgaG9zdCBmaWxlcyB0byBzcGVjaWZ5CisJdGhlIGNvcmUgZmlsZSBmYWlsaW5nIHNpZ25hbC4KKwkqIGhvc3RzL2RlY3N0YXRpb24uaCAoVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTCk6IERlZmluZQorCXRvIHN1cHBseSB0aGUgY29yZSBmaWxlIGZhaWxpbmcgc2lnbmFsLgorCitUaHUgQXByICA4IDA5OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBPbmx5IHNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yCisJYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaWYgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQorCWlzIGRlZmluZWQuICBPbiBtYW55IENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBhbHdheXMgU1RZUF9OT0xPQUQuCisJKiBjb2ZmLWkzODYuaCAoQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWSk6IERlZmluZS4KKworV2VkIEFwciAgNyAxMTozMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmYtbWlwcy5jIChQQUdFU0laRSk6IENvcnJlY3QgdmFsdWUuCisKK1R1ZSBBcHIgIDYgMTI6MDU6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGRyZXNzIG9mIGZpcnN0IFBEUiBpcworCWFuIG9mZnNldCAocGF0Y2ggZnJvbSBKZWFuLURhbmllbCBGZWtldGUgPGpkZkBscmkubHJpLmZyPikuCisKK01vbiBBcHIgIDUgMTI6MDc6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGEKKwlTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24uICBEb24ndCBzZXQgU0VDX05FVkVSX0xPQUQgZm9yIGEKKwlTVFlQX0lORk8gc2VjdGlvbi4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZSB2bWEgYW5kIGxtYSBvZiBfTElCCisJc2VjdGlvbiB0byBiZSB6ZXJvLgorCShjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ291bnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV3IGxtYQorCWZpZWxkLCBub3QgaW4gdm1hLgorCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBGb3JjZSBsaW5lbm9fY291bnQgb2YKKwlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbiB0byBiZSB6ZXJvLCBzaW5jZSBpdCBpcyBub24temVybyBvbiB0aGUKKwlTQ08gMy4ydjQgc2hhcmVkIGxpYnJhcnkuCisJKiBzZWNsZXQuYyAocmVsKTogQ29weSBvdmVyIGFueSBzZWN0aW9uIHdpdGggY29udGVudHMsIG5vdCBqdXN0CisJbG9hZGFibGUgc2VjdGlvbnMuCisKKwkqIGNvZmYtbWlwcy5jIChlY29mZl9tYWtlX2VtcHR5X3N5bWJvbCk6IFplcm8gb3V0IG5ld2x5IGFsbG9jYXRlZAorCXN5bWJvbC4KKworCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IE5ldyBmdW5jdGlvbiwgdG8gZ2VuZXJhdGUKKwlyZWxvY2F0ZWFibGUgb3V0cHV0IGNvcnJlY3RseS4KKwkoaG93dG9fdGFibGUpOiBVc2UgY29mZl9pMzg2X3JlbG9jIGZvciBhbGwgcmVsb2MgdHlwZXMuCisJKENBTENfQURERU5EKTogVXNlIGEgbW9yZSBlZmZpY2llbnQgaGFjayB0byBnZXQgdGhlIGNvcnJlY3QgYWRkZW5kCisJZm9yIGEgY29tbW9uIHN5bWJvbC4KKwkoaTM4NmNvbW1fdmFsdWUpOiBSZW1vdmVkOyBubyBsb25nZXIgbmVlZGVkLgorCitTdW4gQXByICA0IDE1OjA4OjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgb3V0CisJc2VjdGlvbnMgd2l0aG91dCBhIGZpbGVwb3MuCisKK0ZyaSBBcHIgIDIgMTQ6MzU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBzZWNsZXQuYyAoc2VjbGV0X2R1bXBfc2VjbGV0KTogQ29ycmVjdCBTRUNfSEFTX0NPTlRFTlRTIHRlc3QuCisKK1dlZCBNYXIgMzEgMTc6NDE6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTC4KKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZGVkIGdwX3NpemUgZmllbGQuCisJKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgZ3Bfc2l6ZSB0byA4LgorCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDb21wYXJlIGFnYWluc3QgZ3Bfc2l6ZSwgbm90IGhhcmRjb2RlZCA4LgorCVNldCBmbGFncyB0byAwIGZvciBsYXJnZSBjb21tb24gc3ltYm9scy4KKwkoZWNvZmZfZ3ByZWxfcmVsb2MpOiBIYW5kbGUgbm9uLXplcm8gYWRkZW5kIGZvciBleHRlcm5hbCBzeW1ib2xzLAorCXdoaWNoIGNhbiBvY2N1ciBmb3IgZ2FzLWdlbmVyYXRlZCByZWxvY3MuCisJKGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGNhc2UuCisJKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplLCBiZmRfc2V0X2dwX3NpemUpOiBOZXcgZnVuY3Rpb25zLgorCSogTWFrZWZpbGUuaW4gKGJmZC5vKTogTm93IGRlcGVuZHMgb24gY29mZi9zeW0uaCBhbmQgbGliZWNvZmYuaC4KKworVHVlIE1hciAzMCAwOTozMzoxNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGxtYSBmaWVsZCBmb3IgbG9hZAorCWFkZHJlc3MuCisJKiBzZWN0aW9uLmM6IEFkZCBkZWNsYXJhdGlvbiBvZiBsbWEgZmllbGQgdG8gc2VjdGlvbiBzdHJ1Y3R1cmUuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBsbWEgZmllbGQgZm9yIGxvYWQKKwlhZGRyZXNzLgorCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBTZXQgbG1hIGFsb25nIHdpdGggdm1hLgorCisJKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogTm93IGhhbmRsZXMgaW5kaXJlY3QKKwlzeW1ib2xzIGluIGEgYmV0dGVyIHdheS4gKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWcpOiBTZXQgdGhlCisJTl9JTkRSIGJpdCB3aGVuIG5lY2Vzc2FyeS4gKGFvdXQ8PnNsdXJwX3N5bWJvbF90YWJsZSk6IE1haW50YWluCisJaW5kaXJlY3Qgc3RhdGUuCisJKiBzZWN0aW9uLmM6IEFkZGVkIEJGRF9JTkRfU0VDVElPTl9OQU1FIGFuZCBiZmRfaW5kX3NlY3Rpb24uCisJKGJmZF9tYWtlX3NlY3Rpb24pOiBDb3BlIHdpdGggbmV3IGJ1aWx0aW4gc2VjdGlvbi4KKwkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6IENhbiBub3cgcHJpbnQgaW5kaXJlY3Qgc2VjdGlvbgorCWluZm8uCisKK1dlZCBNYXIgMjQgMTM6MzY6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBhb3V0LXRhcmdldC5oIChNWShvYmplY3RfcCkpOiAgRmFpbCBpZiBNQUNIVFlQRV9PSyBpcworCWRlZmluZWQsIGFuZCB5aWVsZHMgZmFsc2UuCisJKiBhb3V0LW1pcHNic2QuYywgaTM4NmJzZC5jOiAgRGVmaW5lIE1BQ0hUWVBFX09LIGFwcHJvcHJpYXRlbHkuCisKKwkqIGFyY2hpdmUuYyAoc25hcmZfYXJfaGRyKTogIEFkZCBzdXBwb3J0IGZvciByZWFkaW5nIChvbmx5LAorCXNvIGZhcikgQlNELTQuNC1zdHlsZSBleHRlbmRlZCBoZWFkZXJzLgorCSogYXJjaGl2ZS5jOiAgU29tZSBtb3JlIGNvbW1lbnRzLgorCitXZWQgTWFyIDI0IDAyOjA1OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZml4IHJ1bGUgZm9yIGR2aSBhbmQgaW5mbywgc28gdGhhdCB0aGUgcmVjdXJzaXZlCisJbWFrZXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcsIGluc3RlYWQgb2YgYWx3YXlzIGluZm8KKworV2VkIE1hciAyNCAwMjo1Njo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IERpc2FibGUgb3B0aW1pemVkIGhhbmRsaW5nIGZvciBhcmNoaXZlcyBhbmQKKwlhcmNoaXZlIG1lbWJlcnM7IHRoZXkgbmVlZCBtb3JlIHNwZWNpYWwgcmVhdG1lbnQuICBGb3Igbm93LCB2ZXJpZnkKKwl0aGF0IGNvbXB1dGVkIGFuZCBhY3R1YWwgZmlsZSBwb3NpdGlvbnMgY29ycmVzcG9uZC4KKworVHVlIE1hciAyMyAwODo0NTozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIG1pcHNic2QuYzogUmVuYW1lZCBmcm9tIGFvdXQtbWlwc2JzZC5jLgorCShzZXRfYXJjaF9tYWNoKTogRGVsZXRlIG5vbi1NSVBTIGNvZGUuCisJKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRGl0dG8uCisJKiBNYWtlZmlsZS5pbjogQWRqdXN0ZWQuCisKKwkqIGxpYmJmZC5jIChiZmRfdGVsbCk6IFVwZGF0ZSBgd2hlcmUnIGZpZWxkLgorCShiZmRfc2Vlayk6IERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgZmlsZQorCXBvc2l0aW9uLiAgSWYgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWCBpcyBkZWZpbmVkLCBjaGVjayBgd2hlcmUnCisJZmllbGQgYWdhaW5zdCBhIFNFRUtfU0VUIHJlcXVlc3QuICBDYWxsIGJmZF90ZWxsIHRvIHJlLXVwZGF0ZQorCWB3aGVyZScgZmllbGQgd2hlbiBkb25lLgorCShiZmRfcmVhZCwgYmZkX3dyaXRlKSBbRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWF06IE1haW50YWluCisJYHdoZXJlJyBmaWVsZC4KKwkqIGhvc3RzL3NwYXJjLmg6IERlZmluZSBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYLgorCitNb24gTWFyIDIyIDIzOjE4OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZGVkIGluc3RhbGxjaGVjayB0YXJnZXQKKworTW9uIE1hciAyMiAxNDo1NzoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZWxvY2F0ZSBlbmNhcHN1bGF0ZWQgc3RhYnMKKwlpZiB0aGUgdHlwZSBpcyBub3Qgc3ROaWwuCisKK1R1ZSBNYXIgMTYgMTA6MzU6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGVsZjMyLmMgKGVsZl9saXR0bGVfdmVjLCBlbGZfYmlnX3ZlYyk6IERlbGV0ZSBub3ctaW52YWxpZAorCWZvcndhcmQgZGVjbGFyYXRpb25zLgorCisJKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEb24ndCB1c2UgQ09OU1QgaGVyZSwKKwlpdCdzIGltcGxpZWQgYnkgdGhlIHR5cGUuCisKK0ZyaSBNYXIgMTIgMTg6NTg6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaG9zdDogcmVjb2duaXplIHNwYXJjLXN1bi1zb2xhcmlzMiogaW5zdGVhZCBvZiBzcGFyYy1zdW4tc29sYXJpcyoKKworVHVlIE1hciAgOSAwOToyMzoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogcnM2MDAwLWNvcmUuYzogQWRkIC5sZGluZm8gc2VjdGlvbi4KKworRnJpIE1hciAxMiAxMTo1Nzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgorCitGcmkgTWFyIDEyIDA4OjMyOjExIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IHdoaXRlc3BhY2UKKwkqIHNlY2xldC5jIChzZWNsZXRfZHVtcF9zZWNsZXQpOiBEb24ndCB0cnkgYW5kIGZpbGwgc2VjdGlvbnMgd2l0aAorCW5vIGNvbnRlbnRzLgorCitUaHUgTWFyIDExIDE5OjI2OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogaG9zdHMvZ28zMi5oOiBkb24ndCBkZWZpbmUgUE9TSVhfVVRJTUUKKworVHVlIE1hciAgOSAxMDo1MjowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZWxmMzIuYyAoZWxmX29iamVjdF9wKTogIFVzZSBFTEZfQVJDSCBzdG9yZWQgaW4geHZlYyB0byBtYXRjaAorCWFnYWluc3QgbWFjaGluZSBhcmNoaXRlY3R1cmUgc3RvcmVkIGluIHRoZSBFTEYgaGVhZGVyLCB0byByZXNvbHZlCisJYW1iaWd1aXRpZXMuCisJKiBlbGYzMi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgQmZkX21ha2Vfc2VjdGlvbiBjYW4gcmV0dXJuCisJTlVMTCwgc28gb25seSB1c2UgcmVzdWx0cyB3aGVuIG5vbi1OVUxMLgorCSogdGFyZ2V0cy5jIChlbGYzMl9tNjhrX3ZlYywgZWxmMzJfaTg2MF92ZWMpOiAgQWRkIGV4dGVybiBkZWNscworCWFuZCBhZGQgdG8gdmVjdG9yIG9mIHRhcmdldHMuCisKK01vbiBNYXIgIDggMTU6MTM6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogRW5jYXBzdWxhdGVkIFNUQUJTIHN5bWJvbHMKKwlhcmUgYWx3YXlzIGp1c3QgZGVidWdnaW5nIHN5bWJvbHMuCisKKwkqIGNvZmYtbWlwcy5jIChlY29mZl9bZ3NdZXRfc3ltX2luZGV4KTogTW92ZWQgbWFjcm9zIGZyb20gaGVyZS4uLgorCWxpYmVjb2ZmLmggKGVjb2ZmX1tnc11ldF9zeW1faW5kZXgpOiAuLi50byBoZXJlLgorCitNb24gTWFyICA4IDE0OjU1OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogaHBwYS5jIChfUEFfUklTQ19JRCk6IERlZmluZWQgaWYgbm90IGFscmVhZHkgZGVmaW5lZCAoZS5nLiwgZm9yCisJaHB1eCA3KS4gIFBhdGNoIGZyb20gZnJpZWRtYW5AZ251LmFpLm1pdC5lZHUuCisJKGhwcGFfb2JqZWN0X3ApOiBPbmx5IGNoZWNrIGZvciBETF9NQUdJQyBhbmQgU0hMX01BR0lDIGlmIHRoZXkncmUKKwlkZWZpbmVkLCB3aGljaCB0aGV5IGFyZW4ndCBpbiBocHV4IDcuMC4KKworCSogYWl4Mzg2LWNvcmUuYzogSW5jbHVkZSB1aW5mby5oIGFuZCBjb3JlZHVtcC5oLiAgUGF0Y2ggZnJvbSBNaW5oCisJVHJhbi1MZSwgdHJhbmxlQGludGVsbGljb3JwLmNvbS4KKworRnJpIE1hciAgNSAxNDo1NDoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmYtbWlwcy5jIChlY29mZl9nZW5lcmljX3JlbG9jKTogSWYgdGhlIGFkZGVuZCBpcyBub24temVybywgZ28KKwlhaGVhZCBhbmQgZG8gdGhlIHJlbG9jYXRpb24uCisJKGVjb2ZmX3JlZmhpX3JlbG9jKTogRG9uJ3QgdG8gdGhlIHJlbG9jYXRpb24gaGVyZSwganVzdCByZW1lbWJlcgorCXdoYXQgbmVlZHMgdG8gYmUgZG9uZS4KKwkoZWNvZmZfcmVmbG9fcmVsb2MpOiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbiBoZXJlLgorCitUaHUgTWFyICA0IDE0OjQ0OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZi1taXBzLmMgKGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkZWQgQkZEX0FTU0VSVCBjYWxscyB0byBlbnN1cmUKKwlyZWxvY3MgYXJlIHJlYXNvbmFibGUuCisJKiBjb2ZmLW1zeW0uYzogRWxpbWluYXRlZCB1c2VzIG9mIERFRlVOLgorCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBOZXcgZnVuY3Rpb24uCisKK1R1ZSBNYXIgIDIgMTc6NTI6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkoVWx0cml4IDIuMiBzdXBwb3J0IGZyb20gTWljaGFlbCBSZW5kZWxsIDxtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhPikKKwkqIGNvbmZpZ3VyZS5ob3N0ICh2YXgtKi11bHRyaXgyKik6ICBBZGQgdHJpcGxldC4KKwkqIGhvc3RzL3ZheHVsdDIuaDogIE5ldyBmaWxlLgorCSogY29uZmlnL3ZheHVsdDIubWg6ICBOZXcgZmlsZS4KKworCSogYW91dHguaCAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3Igc3RyY2hyIGFuZCBmcmllbmRzLgorCSogYXJjaGl2ZS5jIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBtZW1jaHIgYW5kIGZyaWVuZHMuCisJKiBlbGYzMi5jIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBzdHJyY2hyIGFuZCBmcmllbmRzLgorCitTYXQgRmViIDI3IDAwOjQ0OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmMgKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IFVudXNlZDsgZGVsZXRlZC4KKwkoTVlfc2V0X3NpemVzKTogVXNlIHN1bm9zNF9zZXRfc2l6ZXMuCisKKwkqIGVsZjMyLmM6IFJlbmFtZWQgZnJvbSBlbGYuYy4gIFNldmVyYWwgQ1BVLXNwZWNpZmljIGZ1bmN0aW9ucworCWRlbGV0ZWQsIGFzIHdlbGwgYXMgZWxmLWJpZyBhbmQgZWxmLWxpdHRsZSB0YXJnZXRzLgorCSogbGliZWxmLmg6IE5ldyBmaWxlLgorCSogZWxmMzItc3BhcmMuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsIGVsZjMyLW02OGsuYzogTmV3CisJZmlsZXMsIG5ldyB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZy8qLWVsZi5tdCwgdGFyZ2V0cy5jOiBBZGp1c3RlZC4KKworCSogaTM4NmxpbnV4LmMgKFRBUkdFVE5BTUUpOiBVc2UgaHlwaGVucyBpbnN0ZWFkIG9mIHBhcmVudGhlc2VzLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IG5lZWQKKwl2YXJpYWJsZSAib2xkX3NvZmFyIiBpZiBjb21waWxpbmcgZm9yIGk5NjAuCisKKwkqIHJlbG9jLmMgKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogRmlyc3QgYXJndW1lbnQgaXMgbm93IGEKKwliZmQgcG9pbnRlci4KKwkqIGxpYmJmZC5oOiBVcGRhdGVkLgorCisJKiBpZWVlLmMgKGV4dGVuLCBlbnZpKTogInN0YXRpYyIgYmVsb25ncyBmaXJzdCBpbiBkZWNsYXJhdGlvbi4KKworRnJpIEZlYiAyNiAxNzozNzozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3JlYy5jOiBhZGQgc3VwcG9ydCBmb3Igc3ltYm9sc3JlYywgc3JlY29yZHMgd2l0aCBzeW1ib2xzIGluCisJdGhlbS4KKworVGh1IEZlYiAyNSAxMTo0MzozMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCisKKwkqIGllZWUuYzogIGNhc3QgYWxsIGFyZ3VtZW50cyBvZiBpZWVlX3dyaXRlX2J5dGUgdG8gYmZkX2J5dGUKKwl0byBhdm9pZCBsaW50IGNvbXBsYWludHMuCisKK1RodSBGZWIgMjUgMDI6MTU6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBlbGYuYyAoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNlY3Rpb24gIi5zaHN0cnRhYiIgc2hvdWxkIGJlCisJdHlwZSBTSFRfU1RSVEFCLiAgRG9uJ3QgYWx0ZXIgZmlsZSBvZmZzZXQgZm9yIHNlY3Rpb24gMC4KKwkocmVsb2NfdHlwZV9uYW1lcyk6IE5vdyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgbWFjcm8uICBTdGlsbCBpbnNpZGUKKwkiI2lmIDAiLCBzaW5jZSBpdCdzIHVzZWQgb25seSBpbiBkZWJ1Z2dpbmcgY29kZSBhbHNvIGluICIjaWYgMCIuCisJKHN0cnVjdCBlbGZfcmVsb2NfbWFwX2VsdCwgc3RydWN0IGVsZl9yZWxvY19tYXApOiBOZXcgdHlwZXMuCisJKHNvcnRfcmVsb2NfbWFwKTogTmV3IGZ1bmN0aW9uLgorCShzcGFyY19yZWxvY19tYXApOiBOZXcgdmFyaWFibGUuCisJKGVsZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCisKK1R1ZSBGZWIgMjMgMTI6MTc6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZGVkIGJmZF9yZWxvY190eXBlX2xvb2t1cCBhbmQKKwliZmRfbWFrZV9kZWJ1Z19zeW1ib2w7IHRoZXkgd2VyZSBhbHJlYWR5IGluIHRoZSB0YXJnZXQgc3RydWN0dXJlLgorCSogQWRqdXN0ZWQgYWxsIHVzZXMgb2YgSlVNUF9UQUJMRS4KKwkqIGNvZmZnZW4uYywgbGliY29mZi1pbi5oIChjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFJlbmFtZWQKKwlmcm9tIGNvZmZfbWFrZV9kZWJ1Z19zeW1ib2wuCisJKiBsaWJjb2ZmLmg6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCisKKwkqIE1pbm9yIGNsZWFudXBzIHByb3Zva2VkIGJ5IGdjYyB3YXJuaW5nczoKKwkqIGFvdXR4LmggKE5BTUUoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApKSwKKwljcHUtaDgzMDAuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKSwKKwljcHUtejhrLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZGVkIGRlZmF1bHQgY2FzZSB0bworCXN3aXRjaGVzLgorCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApLAorCWllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpLAorCWVsZi5jIChlbGZfbWFrZV9zZWN0aW9ucywgZWxmX2Zha2Vfc2VjdGlvbnMsCisJZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6CisJUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLgorCSogYXJjaHVyZXMuYzogUmVtb3ZlZCAvKiBmcm9tIHdpdGhpbiBjb21tZW50LgorCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IEluaXRpYWxpemUgcl9leHRlcm4uCisJKiBvYXN5cy5jIChvYXN5c193cml0ZV9kYXRhKTogSW5pdGlhbGl6ZSBpLgorCitNb24gRmViIDIyIDE4OjQwOjA2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbGliY29mZi5oIChvYmpfcmF3X3N5bWVudF9jb3VuKTogIE5ldyBtYWNyby4KKwkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiAgSW5pdGlhbGl6ZQorCXJhd19zeW1lbnRfY291bnQuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiAgTnVtZXJvdXMgbGl0dGxlIGZpeGVzLgorCitNb24gRmViIDIyIDE1OjAzOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IHN0QmxvY2sgc3ltYm9scyBhcmUgYWx3YXlzCisJZGVidWdnaW5nIHN5bWJvbHMuCisJKGVjb2ZmX2dldF9kZWJ1Zyk6IE9mZnNldCB0aGUgZmRyIGFkciBieSB0aGUgYWRyIG9mIHRoZSBmaXJzdCBwZHIsCisJZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0b29scyBmcm9tIE1JUFMuCisKKwkqIGNvbmZpZy9iaWdtaXBzLm10OiBOZXcgZmlsZTsgZGVmYXVsdCB2ZWN0b3IgaXMgZWNvZmZfYmlnX3ZlYy4KKwkqIGNvbmZpZy9pcml4My5tdCwgY29uZmlnL2lyaXg0Lm10OiBSZW1vdmVkLgorCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmYpOiBOZXcgdGFyZ2V0OyB1c2VzIGJpZ21pcHMubXQuCisJKG1pcHMtc2dpLSosIG1pcHMtYmlnLSopOiBVc2UgYmlnbWlwcyByYXRoZXIgdGhhbiBpcml4My4KKworV2VkIEZlYiAxNyAyMzo0MDo0MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogaG9zdHMvaHAzMDBic2QuaDogIEFkZCBncm9zcyBoYWNrIHRvIGRldGVybWluZSB3aGV0aGVyIHdlCisJYXJlIHJ1bm5pbmcgb24gQlNEIDQuMyBvciBCU0QgNC40LCBhbmQgdXNlIGFwcHJvcHJpYXRlIGluY2x1ZGUKKwlmaWxlcyAoYW5kIHNldCBvdGhlciBwYXJhbWV0ZXJzKSB0byBtYXRjaC4KKworV2VkIEZlYiAxNyAxMjoyODoxMyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9tYWtlX2VtcHR5X3N5bWJvbCk6IHdyYXAgUEFSQU1TIGFyb3VuZCBhbgorCSAgYW5zaSBkZWZpbml0aW9uIHdoaWNoIG90aGVyd2lzZSBjb25mdXNlcyBub24tYW5zaSBjb21waWxlcnMuCisKKwkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6IGVsaW1pbmF0ZSBhIHdhcm5pbmcgZnJvbSB2YXgKKwkgIHVsdHJpeCBjYyBieSBmb3J3YXJkIGRlY2xhcmluZyBnZXRlbnYgYXMgaXMgZG9uZSBpbgorCSAgYmZkX2ZpbmRfdGFyZ2V0LgorCitUdWUgRmViIDE2IDE3OjU2OjU4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBlbGYuYyAoZWxmX2luZm9fdG9faG93dG8pOiBjYXN0IGFuIGVudW0gaW50byB1bnNpZ25lZCBjaGFyCisJICBhdm9pZGluZyBhIGZhdGFsIGVycm9yIGluIHZheCB1bHRyaXggNC4yIGNjLgorCitUdWUgRmViIDE2IDAwOjQ0OjU0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBiZmQtaW4uaCwgVkVSU0lPTjogIFJvbGwgdG8gdmVyc2lvbiAyLjEuCisKK01vbiBGZWIgMTUgMjA6NDM6NTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBMaW50LgorCSogc3JlYy5jOiAgV2hpdGVzcGFjZSBjbGVhbnVwLgorCitGcmkgRmViIDEyIDE0OjIzOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IFByaW50IGNvcnJlY3QgdGFnbmR4IHZhbHVlOworCWNsZWFuZWQgdXAgb3V0cHV0IGZvcm1hdHRpbmcgYSBiaXQuCisKK0ZyaSBGZWIgMTIgMDg6Mjg6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogKkZJWE1FKiB0aGUgSDgvMzAwIGlzIGFsd2F5cworCXJlbGF4YWJsZS4gIFNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUgZWxzZS4KKworVGh1IEZlYiAxMSAxNDowOTo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGFvdXQtbWlwc2JzZC5jOiBFbGltaW5hdGVkIHVzZXMgb2YgREVGVU4uCisJKGFvdXRfbWlwc18qX3ZlYyk6IEFkZGVkIHNlY2xldF9saW5rIGVsZW1lbnQuCisKKwkqIE1ha2VmaWxlLmluIChCRkRfQkFDS0VORFMsIENGSUxFUywgYW91dC1taXBzYnNkLm8pOiBBZGRlZAorCXN1cHBvcnQgZm9yIGFvdXQtbWlwc2JzZCB0YXJnZXQuCisKKwkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogRG9uJ3QgdHJ1bmNhdGUgMzItYml0IGFkZGVuZCB0byAxNiBiaXRzLgorCitGcmkgRmViICA1IDA4OjA4OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjcHUtaDg1MDAuYyAoc2Nhbl9tYWNoKTogcmV0dXJuIGZhbHNlIGlmIGl0J3Mgbm90IGFuIEg4LzUwMAorCitUaHUgRmViICA0IDEyOjUyOjQwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJQWRkIHN1cHBvcnQgZm9yIHRoZSBIOC81MDAKKworCSogY29mZi1oODUwMC5jLCBjcHUtaDg1MDAuYywgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgdGFyZ2V0cy5jCisKK1RodSBGZWIgIDQgMTI6MzU6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsaWJlY29mZi5oOiBOZXcgZmlsZS4gIERlZmluZXMgRUNPRkYgYmFja2VuZCBkYXRhIGZvciBnZGIuCisJKiBjb2ZmLW1pcHMuYzogTm93IGluY2x1ZGVzIGxpYmVjb2ZmLmguCisJKGVjb2ZmX2RhdGFfdHlwZSk6IE1vdmVkIHRvIGxpYmVjb2ZmLmguCisJKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBNYWRlIGdsb2JhbGx5IHZpc2libGUgc28gdGhhdCBnZGIgY2FuCisJY2FsbCBpdC4gIElmIHRoZXJlIGlzIGV2ZXIgYW5vdGhlciBFQ09GRiB0YXJnZXQsIHRoaXMgYW5kIHRoZQorCXN3YXBwaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYWNjZXNzZWQgdmlhIGFuIEVDT0ZGIHNwZWNpZmljIHRhcmdldAorCXZlY3Rvci4KKwkqIE1ha2VmaWxlLmluIChjb2ZmLW1pcHMubyk6IERlcGVuZHMgb24gbGliZWNvZmYuaC4KKworV2VkIEZlYiAgMyAwOToxNDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmg6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgc2luY2UgY29mZi1taXBzLmMKKwlubyBsb25nZXIgaW5jbHVkZXMgdGhpcyBmaWxlLgorCisJKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9mZHJfaW4sIGVjb2ZmX3N3YXBfZXh0X2luKTogU2V0IHJlc2VydmVkCisJYml0cyB0byAwIHRvIG1ha2UgY29tcGFyaXNvbiB0ZXN0IHVzZWZ1bC4KKworCSogY29uZmlnL2lyaXgzLm1oLCBjb25maWcvaXJpeDQubWggKEhERUZJTkVTKTogU2V0IHRvIC1HIDQgdG8KKwlhdm9pZCBvdmVyZmxvd2luZyBHUCBhY2Nlc3NpYmxlIHNlY3Rpb25zIGluIGJpbnV0aWxzL29iamR1bXAuCisKK1R1ZSBGZWIgIDIgMTU6MzY6NTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogIE1hZGUgc3ltYm9sCisJcmVhZGluZyBtb3JlIHJvYnVzdDogIEZhaWwgaWYgc3RyaW5nIGluZGV4IGlzIG91dCBvZiBzdHJpbmcKKwl0YWJsZSByYW5nZS4KKworVHVlIEZlYiAgMiAxMTo0MzoyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlcyBQQ1JFTDI0IGFuZAorCVBDUkVMMTMpOiBEb24ndCB0YWtlIGRzdF9hZGRyZXNzIGludG8gYWNjb3VudDsgdGhlIGlucHV0IGZpbGUgaGFzCisJYWxyZWFkeSB0YWtlbiBjYXJlIG9mIHRoYXQuCisKK1R1ZSBGZWIgIDIgMTE6NDE6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYzogQ29tcGxldGVkIHN1cHBvcnQgZm9yIGxpbmtlciBhbmQgYmludXRpbHMuCisKK01vbiBGZWIgIDEgMTQ6NDU6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZSBBQlMzMik6IEtlZXAKKwlvcmlnaW5hbCBhZGRlbmQgZnJvbSBzZWN0aW9uIGNvbnRlbnRzLgorCitUaHUgSmFuIDI4IDIxOjAxOjM3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJRml4IG1pbm9yIGJ1Z3MgcmVwb3J0ZWQgYnkgQ2FybCBHcmVjbywgPGNncmVjb0BwYXJyb3QuY3JlaWdodG9uLmVkdT46CisJKiBob3N0cy9kZWx0YTg4LmggKHN0cnRvbCk6ICBGaXggcHJvdG90eXBlLgorCSogY29uZmlnL204OGstY29mZi5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiAgRml4IG5hbWUuCisKK1dlZCBKYW4gMjcgMTc6MTY6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBlbGYuYzogR2V0IHJpZCBvZiAiI2lmZGVmIHNwYXJjIi4KKwkoUkVMT0NfVFlQRV9OQU1FUyk6IE5ldmVyIHVzZWQgKGN1cnJlbnRseSksIHNvIGRvbid0IGluY2x1ZGUgaXQuCisJKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfaG93dG9fdGFibGUsIGFuZCBhbHdheXMKKwl1c2VkLgorCShlbGZfaW5mb190b19ob3d0byk6IFVzZSBydW50aW1lIGNvbmRpdGlvbmFscyBvbiBDUFUgdHlwZSwgbm90CisJY29tcGlsZSB0eXBlIGNvbmRpdGlvbmFscyBvbiBob3N0IENQVS4KKwkoZWxmX2xpdHRsZV92ZWMsIGVsZl9iaWdfdmVjKTogVXNlIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwLAorCW5vdCBudWxsIHBvaW50ZXIuCisJKHJlbG9jX3R5cGUsIFJFTE9DX1RZUEVfTkFNRVMpOiBJbmNsdWRlIGkzODYgdmFsdWVzLgorCitUdWUgSmFuIDI2IDExOjQzOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogc2VjdGlvbi5jIChTRUNfSVNfQ09NTU9OKTogTmV3IHNlY3Rpb24gZmxhZywgbmVlZGVkIGZvciBNSVBTCisJRUNPRkYgd2hpY2ggaGFzIHR3byBjb21tb24gc2VjdGlvbnMuCisJKGJmZF9jb21fc2VjdGlvbik6IFNldCBTRUNfSVNfQ09NTU9OIGZsYWcuCisJKiBiZmQtaW4uaCAoYmZkX2lzX2NvbV9zZWN0aW9uKTogTmV3IG1hY3JvIHRvIHRlc3QgU0VDX0lTX0NPTU1PTi4KKwkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1tODhrLmMsCisJY29mZi1taXBzLmMsIGNvZmZnZW4uYywgaWVlZS5jLCBvYXN5cy5jLCByZWxvYy5jLCBzeW1zLjogVXNlCisJYmZkX2lzX2NvbV9zZWN0aW9uIG1hY3JvIHJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBlcXVhbGl0eSB0bworCWJmZF9jb21fc2VjdGlvbi4KKworTW9uIEphbiAyNSAxNToyNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKF9iZmRfY29mZl9ta29iamVjdF9ob29rKTogUGFzcyBhb3V0aGRyIGFyZ3VtZW50LgorCShjb2ZmX21rb2JqZWN0X2hvb2spOiBBY2NlcHQgYW91dGhkciBhcmd1bWVudC4KKwkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogUGFzcyBhb3V0aGRyIHRvIG1rb2JqZWN0X2hvb2suCisJSGFuZGxlIE5VTEwgYW91dGhkciBhcmd1bWVudC4KKwkoY29mZl9vYmplY3RfcCk6IElmIHRoZXJlIGlzIG5vIGFvdXRoZHIsIHBhc3MgaXQgYXMgTlVMTCB0bworCWNvZmZfcmVhbF9vYmplY3RfcC4KKwkqIGxpYmNvZmYuaDogUmVidWlsdCBmb3IgbWtvYmplY3RfaG9vayBjaGFuZ2VzLgorCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbiwgY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBTd2FwCisJYWRkaXRpb25hbCBNSVBTIEVDT0ZGIGZpZWxkcy4KKworU2F0IEphbiAyMyAxODozNjoyMCBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBhZGRlZCBtaXBzLWRlYy1ic2QqCisJKiBjb25maWd1cmUuaW46IGFkZGVkIG1pcHMtZGVjLWJzZCoKKwkqIGFvdXQtbWlwc2JzZC5jOiBuZXcgZmlsZSBmb3IgbWlwcy1kZWMtYnNkKgorCSogYW91dC10YXJnZXQuaDogZG9uJ3QgZGVmaW5lICcnIGlmICdNWV9CRkRfVEFSR0VUJyBpcyBkZWZpbmVkLgorCSogYW91dHguaDogYWRkZWQgbWlwcyBzdXBwb3J0LgorCSogYXJjaHVyZXMuYzogYWRkZWQgbWlwcyBzdXBwb3J0IHRvIGJmZF9kZWZhdWx0X3NjYW4oKS4KKwkqIGNwdS1taXBzLmM6IGFkZGVkIHN1cHBvcnQgZm9yIFI0MDAwICh1bnRlc3RlZCkuCisJKiBsaWJhb3V0Lmg6IGFkZGVkIE1JUFMxICYgTUlQUzIgbWFnaWMgbnVtYmVycy4KKwkqIHJlbG9jLmM6IGZpeCB0eXBvJ3MgaW4gY29tbWVudHMuIEFkZGVkIEJGRF9SRUxPQyBlbnRyaWVzIHdoaWNoIEkKKwkJaG9wZSB3aWxsIG1ha2UgaXQgaW50byBpbmNsdWRlL2JmZC5oLgorCSogdGFyZ2V0cy5jOiBhZGRlZCBhb3V0X21pcHNfKl92ZWMuCisKK1dlZCBKYW4gMjAgMTc6MTU6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvZGVjc3RhdGlvbi5tdDogU2V0IERFRkFVTFRfVkVDVE9SIHRvIGVjb2ZmX2xpdHRsZV92ZWMuCisKK1R1ZSBKYW4gMTkgMDk6MDY6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBiZmQtaW4uaCAoYmZkX2FzeW1ib2xfdmFsdWUpOiBBZGQgbmVlZGVkIHBhcmVudGhlc2VzLgorCisJKiBsaWJjb2ZmLWluLmg6IFVwZGF0ZSBwcm90b3R5cGUgZm9yIGNvZmZfY291bnRfbGluZW51bWJlcnMuCisKK0ZyaSBKYW4gMTUgMTg6MTM6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9oZHJfb3V0LCBlY29mZl9zd2FwX2Zkcl9vdXQsCisJZWNvZmZfc3dhcF9wZHJfb3V0LCBlY29mZl9zd2FwX3N5bV9vdXQsIGVjb2ZmX3N3YXBfZXh0X291dCwKKwllY29mZl9zd2FwX3JuZHhfb3V0LCBlY29mZl9zd2FwX3JmZF9vdXQsIGVjb2ZmX3N3YXBfb3B0X2luLAorCWVjb2ZmX3N3YXBfb3B0X291dCwgZWNvZmZfc3dhcF9kbnJfaW4sIGVjb2ZmX3N3YXBfZG5yX291dCk6IE5ldworCWZ1bmN0aW9ucy4KKwkqIGNvZmZzd2FwLmg6IElmIE5PX0NPRkZfUkVMT0NTIGlzIGRlZmluZWQsIGRvbid0IGRlZmluZQorCWJmZF9zd2FwX3JlbG9jX2luIG9yIGNvZmZfc3dhcF9yZWxvY19vdXQuCisJKiBjb2ZmLW1pcHMuYzogQWRkZWQgY29kZSB0byBsaW5rIGFuZCB3cml0ZSBvdXQgc3ltYm9saWMgZGVidWdnaW5nCisJaW5mb3JtYXRpb24sIGFuZCB0byBzd2FwIHJlbG9jcyBpbiBhbmQgb3V0LgorCitUaHUgSmFuIDE0IDE1OjUxOjU4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsaWJjb2ZmLmgsIGNvZmZnZW4uYyAoY29mZl9jb3VudF9saW5lbnVtYmVycyksIGNvZmZjb2RlLmgKKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIHJldHVybnMgdGhlCisJbnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgaXQgZm91bmQuCisKKwkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IG9ubHkgd3JpdGUgb3V0IGxpbmUgbnVtYmVycworCWluIHRoZSBzZWN0aW9uIHRoZXkgYmVsb25nIHRvLgorCitNb24gSmFuIDExIDE4OjMyOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkZWQgcmVsb2NhdGVhYmxlIGFyZ3VtZW50IHRvCisJX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBBZGRlZCBfYmZkX3NlY2xldF9saW5rCisJdGFyZ2V0IHZlY3RvciBmb3IgbGlua2VyIHVzZS4KKwkqIGJmZC5jIChiZmRfc2VjbGV0X2xpbmspOiBOZXcgbWFjcm8uCisJKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZGVkIF9iZmRfc2VjbGV0X2xpbmsuCisJKiBzZWNsZXQuYyAocmVsLCBzZWNsZXRfZHVtcF9zZWNsZXQpOiBBZGRlZCByZWxvY2F0ZWFibGUgYXJndW1lbnQKKwlhbmQgYm9vbGVhbiByZXR1cm4gdmFsdWUuICBNYWRlIHN0YXRpYy4KKwkoYmZkX2dlbmVyaWNfc2VjbGV0X2xpbmspOiBSZW5hbWVkIGZyb20gc2VjbGV0X2R1bXAuICBBZGRlZAorCXJlbG9jYXRlYWJsZSBhcmd1bWVudC4KKwkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCisJcmVsb2NhdGVhYmxlIGFyZ3VtZW50IChpZiByZWxvY2F0ZWFibGUsIHNhdmVzIHJlbG9jcykuCisJKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksCisJcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCisJcmVsb2NhdGVhYmxlIGFyZ3VtZW50IChpZiByZWxvY2F0ZWFibGUsIGp1c3QgY2FsbHMKKwliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLgorCSogbGliY29mZi1pbi5oIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IEFkZGVkIHJlbG9jYXRlYWJsZQorCWFyZ3VtZW50IHRvIHByb3RvdHlwZS4KKwkqIEFsbCB0YXJnZXRzOiBTZXQgbmV3IF9iZmRfc2VjbGV0X2xpbmsgdmVjdG9yIHRvCisJYmZkX2dlbmVyaWNfc2VjbGV0X2xpbmsuCisKK1NhdCBKYW4gIDkgMjE6Mjk6MzIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29mZmdlbi5jOiAgI2luY2x1ZGUgc2VjbGV0LmguCisKK1NhdCBKYW4gIDkgMTk6NDg6MTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaHBwYS5jIChocHBhX29iamVjdF9zZXR1cCk6ICBHZXQgcmlkIG9mIGFsbCBrbm93bGVkZ2Ugb2Ygc3RhYnMKKwlkZWJ1ZyBpbmZvLiAgU2V0dXAgaW5mbyBhYm91dCBsaW5rZXIgc3ltYm9scyBvbmx5LCBhbmQgdXNlCisJc3RhbmRhcmQgYmZkIGZpZWxkcyB0byBob2xkIHRoZSBpbmZvLgorCSogKGhwcGFfb2JqZWN0X3ApOiAgUmVtb3ZlIHVubmVlZGVkIGRlY2xzLgorCSogKGhwcGFfbmV3X3NlY3Rpb25faG9vayk6ICBHZXQgcmlkIG9mIG1vc3Qgb2YgdGhpcy4KKwkqIGxpYmhwcGEuaCAoc3RydWN0IGhwcGFkYXRhKTogIFJlbW92ZSB0ZW4gcG91bmRzIG9mIHVzZWxlc3MgdWdseQorCWZhdC4gIFJlbW92ZSBhbGwga25vd2xlZGdlIG9mIHN0YWJzLCByZW1vdmUgcmVkdW5kYW50IGtub3dsZWRnZSBvZgorCWxpbmtlciBzeW1ib2xzLgorCSogUmVtb3ZlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyB3aGljaCBhcmUgbm93IGdvbmUuCisKK0ZyaSBKYW4gIDggMTU6MjA6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogYWxsb3cgU0VDX05FVkVSX0xPQUQgdG8gdHVybiBvbgorCVNUWVBfTk9MT0FEIGJpdC4KKwkqIGNvZmYtejhrLmM6IGRlbGV0ZSB1bnVzZWQgcmVsb2MgZnVuY3Rpb25zCisKK0ZyaSBKYW4gIDggMTU6NDc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGRlZCBlY29mZl90ZGF0YSB0byB0ZGF0YSB1bmlvbi4KKwkqIHRhcmdldHMuYyAoZW51bSB0YXJnZXRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ci4KKwkqIGNvZmYtbXN5bS5jOiBVc2UgREVGVU4gZm9yIGZ1bmN0aW9uIGRlZmluaXRvbnMuCisJKiBjb2ZmLW1pcHMuYzogQWRkZWQgY29kZSB0byByZWFkIGFuZCBwcmludCBzeW1ib2xzLCBhbmQgdG8gZmluZAorCWxpbmUgbnVtYmVycy4KKworCSogY29mZmNvZGUuaDogTW92ZWQgbWFueSBnZW5lcmljIGZ1bmN0aW9ucyBpbnRvIGNvZmZnZW4uYy4gIE1vdmVkCisJc3dhcHBpbmcgZnVuY3Rpb25zIGludG8gY29mZnN3YXAuaCBmb3IgRUNPRkYgdXNlLiAgTW92ZWQKKwlyZWxvY2F0aW9uIGZ1bmN0aW9ucywgb25seSB1c2VkIGJ5IGg4MzAwIGFuZCB6OGssIGludG8gcmVsb2MxNi5jLgorCUFkZGVkIGhvb2tzIGZvciBjb2ZmZ2VuLmMgZnVuY3Rpb25zIHRvIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUsIGFuZAorCWFkZGVkIGhvb2sgZnVuY3Rpb25zLiAgU3RpbGwgbW9yZSBjb3VsZCBiZSBkb25lLgorCSogY29mZnN3YXAuaDogTmV3IGZpbGUgdG8gaG9sZCBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLgorCSogY29mZmdlbi5jOiBOZXcgZmlsZSB0byBob2xkIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMuCisJKiByZWxvYzE2LmM6IE5ldyBmaWxlIHRvIGhvbGQgaDgzMDAgYW5kIHo4ayBzcGVjaWZpYyByZWxvY2F0aW9uCisJZnVuY3Rpb25zLgorCSogbGliY29mZi1pbi5oOiBBZGRlZCBkZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbHQgdG8gaW5jb3Jwb3JhdGUgY2hhbmdlcy4KKwkqIGNvZmYtaDgzMDAuYzogRnVuY3Rpb24gbmFtZSBjaGFuZ2VzLgorCSogY29mZi16OGsuYzogRnVuY3Rpb24gbmFtZSBjaGFuZ2VzLiAgVXNlIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcworCWhvb2sgcmF0aGVyIHRoYW4gZGVmaW5pbmcgRVhUUkFfQ0FTRVMuCisJKiBNYWtlZmlsZS5pbjogQnVpbGQgbmV3IGZpbGVzIGNvZmZnZW4gYW5kIHJlbG9jMTYuICBBZGRlZAorCWRlcGVuZGVuY2llcyBvZiBjb2ZmLSoubyBvbiBjb2Zmc3dhcC5oIGFuZCBzZWNsZXQuaC4KKworVGh1IEphbiAgNyAxNjoxNjoyNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogIEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcKKwlhYm91dCBkaXNjYXJkaW5nIGNvbnN0LgorCitXZWQgSmFuICA2IDAwOjE2OjQ5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jLCBzZWNsZXQuYywgZWxmLmMgdXNlIGJmZF94bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jCisKK1R1ZSBKYW4gIDUgMDk6MzU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHBvc3QtdGFyZ2V0KTogSWYgLS13aXRoLW1pbmltYWwtYmZkIGlzIHNwZWNpZmllZCwKKwlzZXQgTUlOSU1JWkU9MS4KKworTW9uIEphbiAgNCAwNzoyMDowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZHMpOiBvbmUgb2YgbXkgYm9hcmRzIHdhbnRzIGEgQ1IgYmV0d2VlbgorCXJlY29yZHMuCisKK1dlZCBEZWMgMzAgMTI6NDY6MzAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBzZXQgc3ltZGVmX2NvdW50IGNvcnJlY3RseQorCShpdCBicm9rZSBhIGNvdXBsZSBvZiB3ZWVrcyBhZ28pLgorCitUdWUgRGVjIDI5IDIxOjQxOjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogU3dpdGNoIGJhY2sgdG8gInN0cnVjdCAuLi4iIGZvcgorCXJldHVybiB0eXBlLCBzbyBsaWJiZmQuaCBkb2Vzbid0IHJlZmVyZW5jZSB1bmRlZmluZWQgdHlwZWRlZm5hbWVzLgorCitUdWUgRGVjIDI5IDEzOjU0OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogdXNlIG5hbWUgSTM4NkFJWE1BR0lDIHJhdGhlcgorCXRoYW4gSTM4NlNWTUFHSUMuCisJKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBkb24ndCBwb2ludGVyaXplIGEgbmVnYXRpdmUgdGFnbmR4CisJKHNvbWV0aW1lcyBnZW5lcmF0ZWQgYnkgU0NPIDMuMnY0IGNjKS4KKworCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrLAorCWJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IHdhcm4gaWYgcmVsb2NhdGluZyBhZ2FpbnN0CisJYW4gdW5kZWZpbmVkIHN5bWJvbC4KKworTW9uIERlYyAyOCAxNDozMDo1NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBocHBhLmM6ICBHZXQgcmlkIG9mIERFRlVOLCB1c2UgbW9yZSBjb252ZW50aW9uYWwgcHJvbG9nIHN0dWZmLgorCU1ha2UgYSBidW5jaCBtb3JlIHJvdXRpbmVzIGJlIHN0YXRpYy4KKwkqIGhwcGEuYyAoZmlsbF9zcGFjZXMpOiAgR2V0IHJpZCBvZiB0aGlzLCByZXBsYWNlIHdpdGggbXVjaCBiZXR0ZXIKKwl3cml0dGVuIHNldHVwX3NlY3Rpb25zKCkuCisJKiAoc2V0dXBfc2VjdGlvbnMpOiAgTmV3IHJvdXRpbmUgdG8gY3JlYXRlIEJGRCBzZWN0aW9ucyBmb3IgZWFjaAorCXNwYWNlIGFuZCBzdWJzcGFjZSBpbiBTT00gZmlsZXMuCisJKiAoaHBwYV9vYmplY3Rfc2V0dXApOiAgVXNlIEJGRCBzZWN0aW9ucyBjcmVhdGVkIGJ5CisJc2V0dXBfc2VjdGlvbnMoKSB0byBsb2NhdGUgR0RCIHN5bWJvbCB0YWJsZSBpbmZvLgorCSogKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8gY3JlYXRlIGEgQkZEIHNlY3Rpb24uICBJdAorCWVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gbmFtZSBpcyB1bmlxdWUsIGFuZCB3aWxsIGdlbmVyYXRlIGEgdW5pcXVlCisJb25lIGlmIG5lY2Vzc2FyeS4KKwkqIChocHBhX29iamVjdF9wKTogIEJlY29tZSBtdWNoIG1vcmUgcGFyYW5vaWQgYWJvdXQgZmlsZSBoZWFkZXIuCisJKiAobWFrZV9iZmRfYXNlY3Rpb24pOiAgQ2FsbCBiZmRfbWFrZV9zZWN0aW9uIHRvIGRvIHRoZSBkaXJ0eQorCXdvcmsuICBTaW1wbGlmeSBjb2RlIHNvbWV3aGF0LgorCSogKGhwcGFfY29yZV9maWxlX3ApOiAgVXNlIHByb3BlciBuYW1lIGZvciBzdGFjayBzZWN0aW9uLgorCSogbGliaHBwYS5oOiAgUmVtb3ZlIG1pbGxpY29kZV9zdGFydCwgbWlsbGljb2RlX2VuZCBkZWNscy4KKworTW9uIERlYyAyOCAxMTowMzoyMiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNvZmYtd2UzMmsubywgY29mZi16OGsubyk6IE5vdGUgZGVwZW5kZW5jaWVzLgorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRm9yIG5vcm1hbCAyLSBvciA0LWJ5dGUKKwlyZWxvY3MsIGRvbid0IGJvdGhlciBkb2luZyB0aGUgYWRqdXN0bWVudCBpZiB0aGUgdmFsdWUgdG8gYWRkIGlzCisJemVyby4KKworU3VuIERlYyAyNyAxNzo0NTowNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYmZkLmMgKGJmZF9nZXRfc2l6ZSk6ICBOZXcgZnVuY3Rpb24gdGhhdCBnZXRzIGFuIHVwcGVyIGJvdW5kCisJb24gdGhlIHBvc3NpYmxlIHNpemUgb2YgYW55IG9iamVjdCBpbiBhIGJmZC4KKwkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbiwgZWxmX2dldF9zdHJfc2VjdGlvbiwKKwllbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6ICBSZXdyaXRlIHRvIGF2b2lkIE5VTEwgcG9pbnRlcgorCWRlcmVmZXJlbmNlcy4KKwkqIGVsZi5jIChlbGZfYmlnX3ZlYywgZWxmX2xpdHRsZV92ZWMpOiAgRG9jdW1lbnQgbGFzdCB0aHJlZQorCW1lbWJlcnMgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KKworVGh1IERlYyAyNCAxNzo0OTowOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGhwcGEuYzogY2hhbmdlIGEgJ2NvbnN0JyB0byAnQ09OU1QnLCBvciBlbHNlIEhQIEMgY29tcGlsZXIgZGllcworCitNb24gRGVjIDIxIDE2OjMzOjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogaG9zdHMvc3RkLWhvc3QuaDogIE5ldyBmaWxlLiAgQXR0ZW1wdCBhdCBhIGdlbmVyaWMvZGVmYXVsdAorCXNldCBvZiBkZWZpbml0aW9ucywgdG8gZGlzY291cmFnZSBwb3J0aW5nIHRvIG5ldyBob3N0cyBieSBjb3B5aW5nLgorCSogaG9zdHMvbmV3cy5oOiAgUmVtb3ZlZC4KKwkqIGhvc3RzL3NwYXJjLmg6ICBVc2Ugc3RkLWhvc3QuaC4KKwkqIGJmZC1pbi5oOiAgTmV3IG1hY3JvcyBiZmRfYXN5bWJvbF9iZmQgYW5kIGJmZF9hc3ltYm9sX2ZsYXZvdXI7CisJcGVyaGFwcyB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIHRoZSB0aGVfYmZkIGZpZWxkIGZyb20gZWFjaCBzeW1ib2wuCisJKiBzeW1zLmMgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkpOiAgUmVtb3ZlIHVudXNlZCBmaWVsZAorCWFwcF9kYXRhLiAgQWRkIGNvbW1lbnQgbm90aW5nIHRoYXQgdGhlX2JmZCBpcyBhbG1vc3QgcmVkdW5kYW50LAorCWJ1dCBub3QgcXVpdGUuCisJKiBhb3V0eC5oLCBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmY29kZS5oOgorCVVzZSBuZXcgbWFjcm9zIGJmZF9hc3ltYm9sX2JmZCBhbmQgYmZkX2FzeW1ib2xfZmxhdm91ci4KKwkqIGhwcGEuYyAoZmlsbF9zcGFjZXMpOiAgTWFrZSBzbGlnaHRseSBtb3JlIHJlYnVzdC4KKwkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSAiZGVmYXVsdCIgaG9zdC4KKworTW9uIERlYyAyMSAxNzoyNDoxMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBiZmQuYzogIEFkZCBzdHJ1Y3QgaHBwYV9jb3JlX2RhdGEgdG8gdGRhdGEgdW5pb24uCisJKiBocHBhLmM6ICBDb25kaXRpb25hbGl6ZSBvbiBIT1NUX0hQUEFIUFVYIGluc3RlYWQgb2YgaHA5MDAwczgwMC4KKwlHZXQgcmlkIG9mIEhQUEEvQlNEIHNwZWNpZmljIGNvZGUuICBUaGF0IHdpbGwgZ28gc29tZXdoZXJlIGVsc2UKKwlzb21lZGF5LgorCSogKGZpbGxfc3BhY2VzKTogIERvbid0IHNwaW4gZm9yZXZlciBhbmQgZGllIGlmIHlvdSBkb24ndCBmaW5kCisJJE1JTExJQ09ERSQgc3Vic3BhY2UuCisJKiAoaHBwYV9vYmplY3RfcCk6ICBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcmVhbCBob25lc3QtdG8tY3RodWx1CisJZXhlYyBmaWxlIQorCSogKGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCBocHBhX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOgorCU1ha2UgdGhlc2Ugd29yayBmb3IgSFBVWC4KKwkqIChtYWtlX2JmZF9hc2VjdGlvbik6ICBOZXcgcm91dGluZSB0byBtYWtlIHNlY3Rpb24gY3JlYXRpb24gYQorCWxpdHRsZSBlYXNpZXIuCisJKiAoaHBwYV9jb3JlX2ZpbGVfcCk6ICBDb21wbGV0ZWx5IHJld3JpdGUsIGxlYXZlIG91dCBidWdzLgorCSogbGliaHBwYS5oOiAgI2luY2x1ZGUgdGhlIHJpZ2h0IHN5c3RlbSBmaWxlcy4gIFJlZGVmaW5lIGFsbCBvZgorCXRoZSBzdHJ1Y3RzL21hY3JvcyBmb3IgaGFja2luZyBjb3JlIGZpbGVzIHRvIHVzZSBtb3JlIHNlbnNpYmxlCisJSFBVWCBjb3JlIGZpbGUgc3RydWN0dXJlcy4KKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBDb25kaXRpb25hbGl6ZSBocHBhX3ZlYyBvbgorCUhPU1RfSFBQQUhQVVgsIG5vdCBocDkwMDBzODAwLgorCSogaG9zdHMvaHBwYWhwdXguaDogICNpbmNsdWRlIHN0ZGxpYi5oIHRvIGdldCBjb3JyZWN0IGRlY2xzIGZvcgorCW1hbGxvYyBhbmQgcmVhbGxvYy4gICNkZWZpbmUgSE9TVF9IUFBBSFBVWC4KKworTW9uIERlYyAyMSAxMjo0MDoxMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIFBhdGNoZXMgZnJvbSBNaW5oIFRyYW4tbGUgPG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tPi4KKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWlzYyosIGkzODYtKi1haXgqKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaG9zdCAoaTM4Ni0qLWlzYyosIGkzODYtKi1haXgqKTogTmV3IGhvc3RzLgorCSogaG9zdHMvaTM4NmlzYy5oLCBjb25maWcvaTM4NmlzYy5taDogTmV3IGZpbGVzIGZvciBJbnRlcmFjdGl2ZQorCVVuaXguCisJKiBob3N0cy9pMzg2YWl4LmgsIGNvbmZpZy9pMzg2YWl4Lm1oOiBOZXcgZmlsZXMgZm9yIEFJWCBvbiBQUy8yLgorCSogYWl4Mzg2LWNvcmUuYzogTmV3IGZpbGUgZm9yIGhhbmRsaW5nIGNvcmUgZmlsZXMgb24gQUlYIG9uIFBTLzIuCisJKiB0YXJnZXRzLmM6IGlmIEFJWDM4Nl9DT1JFLCB1c2UgYWl4Mzg2X2NvcmVfdmVjLgorCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogY2hlY2sgZm9yIEkzODZTVk1BR0lDIGFzIHdlbGwKKwlhcyBJMzg2TUFHSUMuCisKK0ZyaSBEZWMgMTggMTA6MjA6MjcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGZsYWdzIHRvIDAsIGZpeGluZworCTE5MjcuCisKK1RodSBEZWMgMTcgMTk6MzU6MzIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldAorCitUaHUgRGVjIDE3IDAwOjM2OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBiZmQuYzogIFVzZSByaWdodCBuYW1lIGZvciB0ZWtoZXggdGRhdGEgc3RydWN0LgorCSogdGVraGV4LmM6ICBJbnNlcnQgbGVhZGluZ19jaGFyICgwKSBpbnRvIGJmZF90YXJnZXQgc3RydWN0LiAgU3R5bGUuCisJKiBsaWJjb2ZmLmg6ICBVcGRhdGVkIHRvIGdldCBzcGFjaW5nIGNoYW5nZSBmcm9tIGNvZmZjb2RlLmguCisJKiB0cmFkLWNvcmUuYzogIGxlYWRpbmdfY2hhciBpcyAwIChubyBzeW1ib2xzISksIG5vdCAnXycuCisKK1R1ZSBEZWMgMTUgMTU6NDA6MzAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKTogIE5ldworCWZ1bmN0aW9ucywgd2l0aCB0aGUgImd1dHMiIG9mIHRoZSBvbGQgYmZkX3NsdXJwX2JzZF9hcm1hcAorCWFuZCBiZmRfc2x1cnBfY29mZl9hcm1hcCwgYnV0IGFzc3VtaW5nIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZAorCWlmIHRoZSBhcm1hcCBpcyBwcmVzZW50IG9yIG5vdC4KKwlBbHNvLCByZXdyaXRlIGEgYml0IHRvIGF2b2lkIGtlZXBpbmcgYXJvdW5kIG9ic3RhY2sgZGF0YQorCXRoYXQgd2UgZG9uJ3QgbmVlZC4KKwkqIGFyY2hpdmUuYyAoc25hcmZfYXJfaGVhZGVyLCBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOgorCVZhcmlvdXMgZml4ZXMgdG8gY29ycmVjdGx5IGhhbmRsZSBDT0ZGX3N0eWxlIGFyY2hpdmVzIG5hbWVzLgorCShOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgJy8nLCB0aGUgbmFtZXMgY2FuCisJaGF2ZSBlbWJlZGRlZCBzcGFjZXMuKQorCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiAgTmV3IGZ1bmN0aW9uLCByZXBsYWNlcyBvbGQKKwliZmRfc2x1cnBfYnNkX2FybWFwIGFuZCBiZmRfc2x1cnBfY29mZl9hcm1hcC4gIFJlY29nbml6ZXMKKwlfZWl0aGVyXyBmb3JtYXQsIGFuZCBjYWxscyBkb19zbHVycF9ic2RfYXJtYXAgb3IKKwlkb19zbHVycF9jb2ZmX2FybWFwIGlmIGVpdGhlciBmb3JtIG9mIG1hcCBpcyBzZWVuLgorCSogbGliYmZkLWluLmg6ICBDaGFuZ2VkIGJmZF9zbHVycF9ic2RfYXJtYXAgYW5kCisJYmZkX3NsdXJwX2NvZmZfYXJtYXAgaW50byBtYWNybyBzeW5vbnltcyBmb3IgYmZkX3NsdXJwX2FybWFwLgorCSogZWxmLmMgKGVsZl9zbHVycF9hcm1hcCwgZWxmX3dyaXRlX2FybWFwKTogIEZpeC4KKwkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBVc2UgcmMgaW5zdGVhZCBvZiBub24tc3RhbmRhcmQgcWMuCisKK01vbiBEZWMgMTQgMTc6MDg6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaHBwYS5jOiAgI2luY2x1ZGUgInN5c2RlcC5oIiwgbm90IDxzeXNkZXAuaD4uCisJKiBsaWJocHBhLmg6ICBNYWtlIG1pbGxpY29kZV9zdGFydCBhbmQgbWlsbGljb2RlX2VuZCBiZSB1bnNpZ25lZAorCWludCB0byBiZSBzYW1lIHR5cGUgYXMgQ09SRV9BRERSIGluIEdEQi4gIFdoeSBhcmUgdGhlc2UgaGVyZT8KKworU2F0IERlYyAxMiAxNTo1NDozNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmYtaTM4Ni5jIChDQUxDX0FEREVORCk6IGlmIHJlbG9jIGlzIFBDIHJlbGF0aXZlLCBhZGQgdGhlCisJdmFkZHIgb2YgdGhlIHNlY3Rpb24gdG8gdGhlIGFkZGVuZC4KKwkqIHRhcmdldHMuYzogaWYgTUlOSU1JWkUgaXMgMSwgYW5kIFNDT19DT1JFIGlzIGRlZmluZWQsIGFkZAorCVNDT19DT1JFIHRvIFNFTEVDVF9WRUNTLgorCSh0YXJnZXRfdmVjdG9yKTogYWRkIHNjb19jb3JlX3ZlYy4KKwkqIHNjby1jb3JlLmMgKHNjb19jb3JlX3ZlYyk6IGFkZCBsZWFkaW5nIHVuZGVyc2NvcmUgaW5pdGlhbGl6ZXIuCisJKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28qKTogdXNlIHRhcmdldCBpMzg2LXNjby4KKwkqIGNvbmZpZy9pMzg2LXNjby5tdDogbmV3IGZpbGU7IGRlZmluZSBTQ09fQ09SRS4KKworVGh1IERlYyAxMCAwMjoxMzoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogIEZpeCAhc3RyY21wIHRoaW5rby4KKworRnJpIERlYyAgNCAxNDowMjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogTm93IHN0YXRpYyBhbmQgY29uc3QuCisKK1RodSBEZWMgIDMgMTY6NTQ6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBob3N0cy9pMzg2bGludXguaDogSW5jbHVkZSB1bmlzdGQuaC4KKworCSogYW91dHguaCAocHJpbnRfc3ltYm9sKTogYW91dF9zdGFiX25hbWUgcmV0dXJucyBhIGNvbnN0YW50CisJc3RyaW5nLgorCSogbGliYW91dC5oIChhb3V0X3N0YWJfbmFtZSk6IEZpeCBwcm90b3R5cGUuCisJKiBzdGFiLXN5bXMuYyAoYW91dF9zdGFiX25hbWVzKTogQXJyYXkgaXMgbm93IGNvbnN0LgorCShhb3V0X3N0YWJfbmFtZSk6IFJldHVybiB2YWx1ZSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KKworCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCBjdG9yLmMsIHJlbG9jLmMsCisJc3ltcy5jOiBEb2MgZml4ZXMuCisKKwkqIHN5bXMuYyAoYXN5bWJvbCk6IEFkZGVkIG5ldyBmaWVsZCAiYXBwX2RhdGEiLCBmb3IgZGF0YQorCXBhcnRpY3VsYXIgdG8gdGhlIGFwcGxpY2F0aW9uLiAgU29tZSBvZiB0aGUgbGlua2VyIGZsYWdzIG91Z2h0IHRvCisJZ2V0IG1vdmVkIHRvIHRoaXMgZmllbGQgc29tZWRheS4KKworCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IFJlY29nbml6ZSBhIGZldyBtb3JlIG51bWJlcnM6CisJODA0ODYsIDgwOTYwLCBhbmQgOTYwLgorCisJKiBiZmQtaW4uaCAoQ09GRl9TV0FQX1RBQkxFKTogTmV3IGlzIGp1c3QgYWRkcmVzcyBvZgorCWJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlLCBjYXN0IHRvIFBUUi4KKwkqIGJmZC5jIChiZmRfY29mZl9zd2FwXyopOiBEZWxldGVkIG1hY3Jvcy4KKwkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBEZWxldGVkIENPRkYtc3BlY2lmaWMgc3dhcHBpbmcKKwlyb3V0aW5lIHBvaW50ZXJzLgorCSogY29mZmNvZGUuaCAodHlwZSBiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlIHR5cGUsCisJY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIENPRkYtc3BlY2lmaWMgc3dhcHBpbmcgcm91dGluZXMuCisJKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogTmV3IGRhdGEgc3RydWN0dXJlLCB0byBiZSB1c2VkIHdoZW4KKwlOT19DT0ZGX1NZTUJPTFMgYW5kIE5PX0NPRkZfTElORU5PUyBhcmUgbm90IGRlZmluZWQuCisJKGJmZF9jb2ZmX3N3YXBfKik6IE5ldyBtYWNyb3MuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19jb2ZmX3N3YXBfdGFibGUpOiBOZXcgZGF0YSBzdHJ1Y3R1cmUuCisJKGVjb2ZmX2JpZ192ZWMpOiBVc2UgaXQuCisJKiBBbGwgQ09GRiB0YXJnZXRzOiBNb3ZlZCBDT0ZGX1NXQVBfVEFCTEUgdG8gdGFyZ2V0LXNwZWNpZmljIGRhdGEuCisJKiBBbGwgb3RoZXIgdGFyZ2V0czogRGVsZXRlZCBjb2ZmLXNwZWNpZmljIHZlY3RvciBlbnRyaWVzLgorCisJKiB0cmFkLWNvcmUuYzogRml4ZWQgc29tZSBgUEFSQU1TJyB1c2VzIHRoYXQgd2VyZSBtaXNzaW5nCisJcGFyZW50aGVzZXMuCisKK1N1biBOb3YgMjkgMDg6Mzc6MTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBQcm90ZWN0IGFyZyBwcm90b3R5cGUgaW4KKwljYWxsYmFja190b19yZWFsX29iamVjdF9wIHdpdGggUEFSQU1TIG1hY3JvIGZvciBub24tQU5TSSBjb21waWxlcnMuCisKK1NhdCBOb3YgMjggMDQ6MDE6MjEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGFvdXQtdGFyZ2V0LmgsIGFvdXRmMS5oLCB0cmFkLWNvcmUuYywgY29mZmNvZGUuaCwgbGliYW91dC5oLAorCWxpYmJmZC1pbi5oLCBiZmQtaW4uaDogRWxpbWluYXRlIGFsbCBQUk9UTyBjYWxscywgcmVwbGFjZSB3aXRoCisJUEFSQU1TIGZvciByZWFkYWJpbGl0eS4KKworCSogYW91dHguaDogIEFkZCB0eXBlIHRvIGNhbGxiYWNrIHBhcmFtZXRlci4KKwkqIGNvZmYtbWlwcy5jOiAgRG9uJ3QgY2FsbCB0cmFkLWNvcmUuaCwgbm90IG5lZWRlZC4KKwkqIHRyYWQtY29yZS5jOiAgSW5jb3Jwb3JhdGUgdHJhZC1jb3JlLmggZGVjbGFyYXRpb25zLiAgRml4IGNvbW1lbnRzLgorCSogdHJhZC1jb3JlLmg6ICBFbGltaW5hdGUsIHVudXNlZC4KKworV2VkIE5vdiAxOCAxMzoxNjoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXQpOiBpZiBkZWZhdWx0IHRhcmdldCBpc24ndCBmb3VuZAorCXRoZW4gbG9vayB0aHJvdWdoIHRoZSBlbnRpcmUgbGlzdCByYXRoZXIgdGhhbiByZXR1cm4gZWFybHkuCisKK01vbiBOb3YgMTYgMTQ6MzM6MDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWcvaTk2MC1jb2ZmLm10OiByZW9yZGVyIHZlYyB0byBtYXRjaCBiZmRfY2hlY2tfZm9ybWF0IChmcm9tIFBlcikKKworVGh1IE5vdiAxMiAxNzowMTo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gcHJlZml4IGFuZCBleGVjX3ByZWZpeCBpbiBGTEFHU19UT19QQVNTCisKK1RodSBOb3YgMTIgMDk6NDY6NDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmYtejhrLmM6IGNoZWNrcG9pbnQsIG1vcmUgYWRkcmVzc2luZyBtb2RlcyBoYW5kbGVkCisJKiBjb2ZmY29kZS5oIChnZXRfdmFsdWUpOiBkb24ndCB0cnVuY2F0ZSByZWxvYy0+YWRkZW5kIGZpZWxkLCBpdCdzCisJYSBsb25nIG5vdy4KKworV2VkIE5vdiAxMSAyMzo1Nzo1NSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQorCisJKiB3ZTMyay5tdCAoVERFRkFVTFRTKTogVXNlIHdlMzJrY29mZl92ZWMsIG5vdCBpMzg2Y29mZl92ZWMuCisKK1R1ZSBOb3YgMTAgMTQ6MDQ6MzggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogbWlub3IgdHdlYWtzIHRvIG1ha2UgJChDQykgY29tbWFuZCBsaW5lcyBtb3JlIGNvbnNpc3RlbnQKKworTW9uIE5vdiAgOSAyMzo1ODoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yLCBiZmRfY2xvc2UpOiAgQWRkIGRvYyBhYm91dCBjYWNoZWluZworCWFuZCBhYm91dCB3aGVuIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGNsb3NlZC4KKworU2F0IE5vdiAgNyAwMDo0MjoyMCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBNYWtlIHN1cmUgYWxpZ25tZW50IHJlbG9jcyBnZXQKKwl3cml0dGVuIG91dCBjb3JyZWN0bHkuCisKK1RodSBOb3YgIDUgMTU6MzQ6MTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmM6IE5ldyBzZWN0aW9uIGJpdCBTRUNfU0hBUkVEX0xJQlJBUlkuCisJY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBpZiBTVFlQX05PTE9BRCAmJiAoU1RZUF9URVhUIHx8CisJU1RZUF9EQVRBKSwgc2V0IFNFQ19TSEFSRURfTElCUkFSWS4gIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IKKwlpMzg2LXN5c3YuCisKK1RodSBOb3YgIDUgMDQ6NDM6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHRhcmdldC5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6ICBFbGltaW5hdGUgdGhlIFNERUYgYW5kIFNERUZfRk1UCisJbWFjcm9zOyB1c2UgUEFSQU1TIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGludm9sdmVkLgorCisJKiBiZmQtaW4uaCwgYmZkLmMsIGxpYmJmZC5oLCByZWxvYy5jLCBzZWNsZXQuaCwgc2VjdGlvbi5jLAorCXRhcmdldHMuYzogUmVuYW1lIHN0cnVjdCBiZmRfc2VjbGV0X3N0cnVjdCB0byBzdHJ1Y3QgYmZkX3NlY2xldC4KKworVGh1IE5vdiAgNSAwMjo1OTowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCisKKwkqIGFyY2h1cmVzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgdGVraGV4LmM6ICBVc2UgUEFSQU1TIGluCisJZGVjbGFyaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KKwkqIGNhY2hlLmMsIGVsZi5jOiAgTW92ZSBzdGF0aWMgZnVuY3Rpb24gZGVjbHMgdG8gdG9wLCB1c2UgUEFSQU1TLgorCSogc2VjbGV0Lmg6ICBEZWNsYXJlIGV4dGVybmFsIGZ1bmN0aW9uIHdpdGggUEFSQU1TLgorCisJKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KKwkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCisJKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KKworCSogbGliYmZkLmg6ICBVcGRhdGUsIGJhc2VkIG9uIGNoYW5nZXMgaW4gc291cmNlIGNvZGUgYW5kIGNoZXcuCisKK1dlZCBOb3YgIDQgMjI6NDc6MjkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGxpYmllZWUuaDogIEFkZCBGSVhNRSBhYm91dCByZW1vdmluZyBsaW1pdCBvbiBudW1iZXIgb2Ygc2VjdGlvbnMuCisJKiBiZmQtaW4uaDogIEltcHJvdmUgY29tbWVudHMgdG8gbWFrZSBpdCBjbGVhciB0aGF0IGJmZC5oIGlzCisJdGhlIHdyb25nIHBsYWNlIHRvIGVkaXQgdGhpcyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiAgSW5zdGFsbCBhbnNpZGVjbC5oIGFuZCBvYnN0YWNrLmggaW4gdGhlCisJc2FtZSBwbGFjZXMgd2hlcmUgd2UgaW5zdGFsbCBiZmQuaC4KKworV2VkIE5vdiAgNCAxMzo0MDoyMyAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQsIGNvZmZfc3dhcF9hdXhfaW4pOiAgY2hlY2sgZm9yCisJc3ltYm9sIHR5cGUgYmVmb3JlIGJsaW5kbHkgbW9kaWZ5aW5nIHRoZSBhdXhlbnQuICBTcGVjaWZpY2FsbHksCisJb25seSBtb2RpZnkgdGhlIGVuZG5keCBmaWVsZHMgZm9yIHR5cGVzIHRoYXQgbmVlZCBpdCwgYW5kIGRvbid0CisJc2V0IHRoZSBhcnJheSBpbmZvcm1hdGlvbiBmb3Igbm9uLWFycmF5cy4KKworV2VkIE5vdiAgNCAwOTozMDo1MCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogU2VjdGlvbiBsaXN0IHNob3VsZCBiZSBzZXQgdXAKKwljb3JyZWN0bHkgYW55d2F5czsgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgIm5leHQiIHBvaW50ZXJzIG1hbnVhbGx5LgorCitNb24gTm92ICAyIDEyOjM2OjE0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2RlbHRhODgubWgsIGNvbmZpZy9ocDMwMC5taCwgY29uZmlnL2hwcGFocHV4Lm1oLAorCWNvbmZpZy9pMzg2di5taDogcmVtb3ZlZCAtRFVTRyBmcm9tIEhERUZJTkVTLgorCWhvc3RzL2RlbHRhODguaCwgaG9zdHMvaHAzMDAuaCwgaG9zdHMvaHBwYWhwdXguaCwgaG9zdHMvaTM4NnYuaDoKKwlkZWZpbmVkIFVTRV9VVElNRS4KKwlob3N0cy9pMzg2di5oOiBkb24ndCBkZWZpbmUgUE9TSVhfVVRJTUUuCisKK0ZyaSBPY3QgMzAgMTY6MTM6NTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6IG1ha2UgYSBwcml2YXRlIGNvcHkgb2YgdGhlCisJc2VjdGlvbidzIG5hbWUgYmVmb3JlIHRydW5jYXRpbmcgaXQuCisKK1RodSBPY3QgMjkgMDg6MzA6NTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGhwcGEuYzogYWRkIHN5bWJvbF9sZWFkaW5nX2NoYXIgZW50cnkgaW4gdHJhbnNmZXIgdmVjCisKKyxXZWQgT2N0IDI4IDE2OjExOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBpZWVlLmMgKGdldF9zeW1ib2wpOiBjYW4gbm93IGNvcGUgd2hlbiB0d28gc3ltYm9scyBvZiBhCisJZGlmZmVyZW50IGNsYXNzLCBidXQgdGhlIHNhbWUgaW5kZXggbnVtYmVyIG9jY3VyIGNvbnNlY3V0aXZlbHkuCisJKGdldF9zZWN0aW9uX2VudHJ5KTogbmljZXIgbmFtZSBmb3Igc2VjdGlvbnMgYmVpbmcgZm9yd2FyZAorCXJlZmVyZW5jZWQuIChpZWVlX2FyY2hpdmVfcCk6IGRvbid0IGZyZWUgdGhlIGZpbGVuYW1lIHN0cmluZywKKwlzaW5jZSBpdCB3YXMgbmV2ZXIgbWFsbG9jZWQuCisKK1dlZCBPY3QgMjggMTM6NDI6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFplcm8gdGltZXN0YW1wIGZpZWxkLgorCitUdWUgT2N0IDI3IDEyOjI0OjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQpOiBzZXQgdGhlIGZjbmFyeSBpbmZvIGJlZm9yZQorCW9wdGlvbmFsbHkgc2V0dGluZyB0aGUgZGltZW4gaW5mbywgc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUKKwltZW1vcnkgbG9jYXRpb25zLiAgQWxzbyB6ZXJvIG91dCBleHRlcm5hbCBhdXhlbnQuCisJKGNvZmZfd3JpdGVfc3ltYm9sKTogZG9uJ3QgemVybyBleHRlcm5hbCBhdXhlbnQ7IG5vdyBkb25lIGluCisJY29mZl9zd2FwX2F1eF9vdXQuCisKK0ZyaSBPY3QgMjMgMTM6NTU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBDaGVjayBmY2xvc2UgcmV0dXJuIHZhbHVlIGZvciBlcnJvcnMuCisJbGliYmZkLmg6IGJmZF9jYWNoZV9jbG9zZSBub3cgcmV0dXJucyBhIGJvb2xlYW4uCisJY2FjaGUuYyAoYmZkX2NhY2hlX2RlbGV0ZSk6IHJldHVybiBmY2xvc2Ugc3VjY2VzcyB2YWx1ZS4KKwkoYmZkX2NhY2hlX2Nsb3NlKTogcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgcmV0dXJuIHZhbHVlLgorCW9wbmNscy5jIChiZmRfY2xvc2UsIGJmZF9jbG9zZV9hbGxfZG9uZSk6IHJldHVybiByZXN1bHQgb2YKKwliZmRfY2FjaGVfY2xvc2UuCisKK0ZyaSBPY3QgMjMgMTA6MzI6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHNlY2xldC5jIChyZWwpOiBkb24ndCBsb2FkIHNlY3Rpb25zIHdpdGhvdXQgdGhlIFNFQ19MT0FEIGJpdC4KKworVGh1IE9jdCAxNSAxMDoxNjozNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1tNjhrLmMgKG02OGtfaG93dG8ydHlwZSwgU0VMRUNUX1JFTE9DKTogbmV3IGZ1bmN0aW9uIHRvCisJd29yayBvdXQgYSBjb2ZmIHJlbG9jYXRpb24gdHlwZSBmcm9tIGEgaG93dG8ncyBhdHRyaWJ1dGVzIHJhdGhlcgorCXRoYW4gdXNpbmcgdGhlIGlucHV0IHJfdHlwZSBmaWVsZC4gVGhpcyBmaXhlcyBQUjE2NzcgYW5kIGFsbG93cworCWNvbnZlcnNpb24gb2YgYS5vdXQgcmVsb2NzIHRvIGNvZmYgcmVsb2NzLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IGlmIHN1cHBsaWVkIGEgcmVsb2NhdGlvbgorCXJlbGF0aXZlIHRvIGFuIGFic29sdXRlIHN5bWJvbCwgdXNlIHRoZSByaWdodCBzeW1ib2wgaW5kZXguCisKKwkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBkbyBhIHBhcnRpYWwgbGluayBmb3IgY29mZgorCXJlbG9jcyByaWdodC4KKworRnJpIE9jdCAyMyAwODoxNTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNoYW5nZXMgdG8gc3VwcG9ydCBpMzg2LXN5c3Ygd2l0aCBzaGFyZWQgbGlicmFyaWVzOgorCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBpZiBUV09fREFUQV9TRUNTIGlzIGRlZmluZWQsCisJY2hlY2sgZm9yIC5kYXRhMjsgaWYgX0xJQiBpcyBkZWZpbmVkLCBjaGVjayBmb3IgaXQ7IG1hcAorCVNFQ19ORVZFUl9MT0FEIHRvIFNUWVBfTk9MT0FELgorCShzdHlwX3RvX3NlY19mbGFncyk6IG1hcCBTVFlQX05PTE9BRCB0byBTRUNfTkVWRVJfTE9BRC4KKwkobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogaWYgVFdPX0RBVEFfU0VDUywgYWNjZXB0IC5kYXRhMi4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBmb3JjZSB2YWRkciBvZiAubGliIHRvIDA7IHNldCBzY25wdHIKKwlpZiBzZWN0aW9uIGhhcyBjb250ZW50cywgbm90IGp1c3QgaWYgaXQgaXMgbG9hZGFibGU7IGlmCisJVFdPX0RBVEFfU0VDUywgY2hlY2sgZm9yIC5kYXRhMgorCShjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogc2V0IHZtYSBvZiAubGliIHNlY3Rpb24gdG8gbnVtYmVyIG9mCisJLmxpYiBzZWN0aW9ucy4KKwkqIGNvZmYtaTM4Ni5jOiBkZWZpbmUgVFdPX0RBVEFfU0VDUzsgdXNlIGEgc3BlY2lhbCBDQUxDX0FEREVORDsKKwlkb24ndCBkZWZpbmUgY29mZl93cml0ZV9hcm1hcCB0byBic2Rfd3JpdGVfYXJtYXAuCisJKiBob3N0cy9pMzg2di5oOiBkb24ndCBpbmNsdWRlIDx1dGltZS5oPiwgc2luY2UgaXQgaXMgbm90IHByb3ZpZGVkCisJYnkgU1ZSMy4yLgorCitUaHUgT2N0IDIyIDIyOjQwOjIwIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogc29sYXJpczIuaDogR2V0IHRoZSBkZWZpbml0aW9uIG9mIGFsbG9jYSBmcm9tIGFsbG9jYS5oIGlmIHdlCisJYXJlbid0IHVzaW5nIGdjYy4KKworVGh1IE9jdCAyMiAwMzowNzoyOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChpOTYwLSote2FvdXQsYm91dH0pOiAgU3VwcG9ydCB0aGVzZS4KKworV2VkIE9jdCAyMSAwMzo0NjozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2EyOWstYW91dC5tdCAoREVGQVVMVF9UQVJHRVQpOiAgU2V0IHRvIG9uZSB0aGF0IGV4aXN0cy4KKworVGh1IE9jdCAxNSAxNTowNTozOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogYXBvbGxvNjguaCwgYXBvbGxvdjY4LmgsIGhwMzAwLmgsIGkzODZ2LmgsIGlyaXgzLmg6IFJlbW92ZQorCW5vLWxvbmdlci11c2VkIGRlZmluaXRpb25zIG9mIExfU0VUIGFuZCBMX0lOQ1IuCisJKiBpMzg2bGludXguaDogIFR3ZWFrcyB0byBzbW9vdGggTGludXggYnVpbGQuCisKK1RodSBPY3QgMTUgMDE6MzI6MjIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHNlY2xldC5oOiAgQWRkIGVudW0gdGFnIHRvIGJmZF9zZWNsZXRfZW51bV90eXBlLgorCisJKiBiZmQtaW4uaCAoZmlsZV9wdHIpOiAgVXBkYXRlIGNvbW1lbnRzLCBtYWtlIEZJWE1FIHJlIG9mZl90LgorCisJKiBhb3V0LWFkb2JlLmMsIGFvdXRmMS5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1yczYwMDAuYywKKwljb2ZmY29kZS5oLCBlbGYuYywgaWVlZS5jLCBsaWJhb3V0LmgsIGxpYmJmZC5jLCBvYXN5cy5jLAorCXNjby1jb3JlLmM6ICBMaW50OiAgU2Vjb25kIGFyZ3VtZW50IG9mIGJmZF9zZWVrIGlzIGFsd2F5cyBmaWxlX3B0ci4KKwlUaGlyZCBhcmd1bWVudCBpcyBTRUVLX1NFVCBvciBTRUVLX0NVUi4gIFJlc3VsdCBpcyBhbHdheXMgMCBvciAtMS4KKworCSogYW91dC1hZG9iZS5jLCBhb3V0ZjEuaCwgYW91dHguaCwgYm91dC5jIGNvZmYtbTY4ay5jLCBjb2ZmLXo4ay5jLAorCWNvZmZjb2RlLmgsIGVsZi5jLCBsaWJhb3V0LmgsIGxpYmJmZC1pbi5oLCBzcmVjLmM6ICBMaW50LgorCitGcmkgT2N0ICA5IDAzOjQ2OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaG9zdDogIE5ldyBmaWxlLCBjb250YWlucyBtYXBwaW5nIG9mIGhvc3QgY29uZmlncworCXRvIGhvc3Qgc3VwcG9ydCBmaWxlIG5hbWVzIGZvciBiZmQsIGJpbnV0aWxzLCBvcGNvZGVzLgorCSogY29uZmlndXJlLmluOiAgVXNlIGl0LgorCSogaTM4NmFvdXQuYzogIENsZWFudXAsIGR1bXAgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUC4KKwkqIGkzODZic2QuYzogIENsZWFudXAsIHJlZm9ybWF0LgorCSogY29uZmlnL2kzODYtYnNkLm10OiAgQ29tbWVudCBjaGFuZ2VzLgorCSogY29uZmlnL2kzODZic2QubWg6ICBOZXcgZmlsZSBmb3IgY29yZSBmaWxlIHN1cHBvcnQuCisJKiBob3N0cy9pMzg2YnNkLmg6ICBNZXJnZSBjaGFuZ2VzIGZyb20gUGV0ZXIgU2NoYXVlci4KKwkqIGJvdXQuYyAoQUxJR04pOiAgUmVuYW1lIHRvIEFMSUdORVIsIHNpbmNlIHN5c3RlbSBoZWFkZXIgZmlsZXMKKwlvbiBCU0QgNC40IGRlZmluZSBBTElHTiAoc2lnaCEpLgorCitUaHUgT2N0ICA4IDIyOjE4OjEwIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKKworCSogbGliYW91dC5oIChhb3V0X2JhY2tlbmRfZGF0YSk6IGFkZGVkIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCisJZmllbGQuIEZvciBaTUFHSUMgZmlsZXMgb25seSwgd2hlbiB0ZXh0X2luY2x1ZGVzX2hlYWRlciBpcyBzZXQsIGJ5CisJZGVmYXVsdCB0aGUgbGVuZ3RoIG9mIHRoZSBleGVjIGhlYWRlciBpcyBjb3VudGVkIGluIHRoZSB0ZXh0CisJc2VjdGlvbiBzaXplLiBGb3IgZ28zMiwgZXhlYyBoZWFkZXIgaXMgbWFwcGVkIGluIGJ1dCBkb2VzICpub3QqCisJY29udHJpYnV0ZSB0byB0aGUgc2l6ZSBvZiBzZWN0aW9uLgorCSogYW91dHguaCAoYW91dF9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBpZiBleGVjX2hlYWRlcl9ub3RfY291bnRlZAorCWlzIG5vdCBzZXQsIGJ1dCB6dGloIGlzLCBhZGQgdGhlIHNpemUgb2YgdGhlIGV4ZWMgaGVhZGVyIHRvIHRoZQorCXJlY29yZGVkIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4KKwkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogY2xlYXIgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQuCisJKiBpMzg2YW91dC5jIChpMzg2YW91dF9iYWNrZW5kX2RhdGEpOiBzZXQgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQuCisJQWxzbyBzZXQgdGV4dF9pbmNsdWRlc19oZWFkZXIuCisJKiBhb3V0LXRhcmdldC5oICgqX2JhY2tlbmRfZGF0YSk6IGNsZWFyZSBleGVjX2hlYWRlcl9ub3RfY291bnRlZAorCWJ5IGRlZmF1bHQgaW4gTVkoYmFja2VuZF9kYXRhKS4KKworVGh1IE9jdCAgOCAxODoxMjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2spOiBEb24ndCBkZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiBpdCB3b24ndCBiZQorCXVzZWQuCisKKwkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IFJlc3RvcmUgb2xkIGFvdXRfZGF0YSB2YWx1ZSBpZiB0aGlzCisJdHlwZSBkb2Vzbid0IG1hdGNoLiAgRG9uJ3QgbG9zZSBpZiBmaWxlIHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCisJY3JlYXRlZC4KKwkoc2V0X2FyY2hfbWFjaCk6IFNldCByZWxvY19lbnRyeV9zaXplLgorCShzbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgYmZkX2hfZ2V0X3sxNiw4fSBmb3IgcmVhZWRpbmcgc3ltYm9sIGRhdGEuCisKKwkqIGhvc3RzL2kzODZic2QuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpWzM0XTg2LSotYnNkIGhvc3QuCisKKwkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrLCB3cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWxldGUgdW51c2VkCisJdmFyaWFibGVzLgorCisJKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogVXNlIGl0IGFzIGRlZmF1bHQuCisJKiBhb3V0ZjEuaCAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlZC4KKwkoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEb24ndCBkZWZpbmUgaXQuCisKKwkqIGFvdXR4LmggKGFkanVzdF9zaXplc19hbmRfdm1hcyk6IERvbid0IGJvdGhlciB3aXRoIHBhZGRpbmcgZm9yCisJT01BR0lDIGZpbGVzLgorCShzbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgaGVhZGVyIGJ5dGUgb3JkZXIsIG5vdCB0YXJnZXQgYnl0ZQorCW9yZGVyLCBmb3IgcmVhZGluZyBzeW1ib2wgZGF0YS4KKworVGh1IE9jdCAgOCAxNzozMzozOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgVW5kbyBzb21lIGJyYWluIGRhbWFnZSBpbiB0aGUgaG9zdCBzZWN0aW9uLgorCSogY29uZmlndXJlLmluOiAgUmVmb3JtYXQgdGhlIHRhcmdldCBzZWN0aW9uLCB0ZXN0IG1hbnkgY29uZmlncy4KKwkqIE1ha2VmaWxlLmluIChtYWtlKTogIFJlbW92ZSBvYnNvbGV0ZSBgbWFrZSBtYWtlJy4KKwkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBNYWtlIGRlZmluZXMgbGluZSB1cC4KKworVGh1IE9jdCAgOCAwODo1Mjo0OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCU5vdyBhIGJmZCBrbm93cyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSBub3JtYWxseSBwcmVwZW5kZWQKKwl0byBzeW1ib2xzIGluIGl0cyBmaWxlIGZvcm1hdC4KKworCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWg4MzAwLmMsCisJY29mZi16OGsuYzogdGFyZ2V0cyBzZXQgc28gdGhleSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZQorCSogY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1taXBzLmMsIGNvZmYtbTg4ay5jLAorCWNvZmYtcnM2MDAwLmMsIGNvZmYtd2UzMmsuYywgZWxmLmMsIGllZWUuYywgc3JlYy5jOiB0YXJnZXRzIHNldAorCXdpdGhvdXQgbGVhZGluZyB1bmRlcnNjb3JlIGZsYWcKKwkqIHRhcmdldHMuYzogYWRkIHN5bWJvbCBsZWFkaW5nIGNoYXIgdG8geHZlYyBkZXNjcmlwdGlvbgorCSogYmZkLWluLmggKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcik6IG5ldyBtYWNyby4KKworTW9uIE9jdCAgNSAxNDozMjo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jOiAgTWFrZSBlcnJubyBnbG9iYWwuCisJKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6ICBJZiByZWFkIGZhaWxzIChhbmQKKwllcnJubyE9MCkgc2V0IGJmZF9lcnJvciB0byBtYWxmb3JtZWRfYXJjaGl2ZSAoc2luY2UgdGhpcyBwcm9iYWJseQorCWluZGljYXRlcyBhIHRydW5jYXRlZCBhcmNoaXZlKSwgcmF0aGVyIHRoYW4gc3lzdGVtX2NhbGxfZXJyb3IuCisKK01vbiBPY3QgIDUgMDM6MzM6MzkgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgcnVsZXMgZm9yIGkzODZic2QuYworCSogaTM4NmJzZC5jOiBuZXcgZmlsZSwgc3VwcG9ydGluZyAzODZic2QuCisJKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBpMzg2LSotYnNkIHRhcmdldC4KKwkqIGNvbmZpZy9pMzg2LWJzZC5tdDogbmV3IGZpbGUgLSAzODZic2QgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uCisKK1RodSBPY3QgIDEgMTc6NTE6MDcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlLWFycmFuZ2UgaG9zdCBzZWN0aW9uIHRvIHVzZSAqLSotKiBub3RhdGlvbiwKKwljbGVhbiB1cCBzb21lIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBhcyB3ZWxsCisKKwkqIHNlY2xldC5jOiBjYXN0IHJlc3VsdCBvZiBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvCisJYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKKworVHVlIFNlcCAyOSAxMzoyNDowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENyZWF0ZSBzZWN0aW9uIGlmIGl0IGRvZXNuJ3QKKwlhbHJlYWR5IGV4aXN0LgorCisJKiBib3V0LmM6IFJlbW92ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLgorCitUdWUgU2VwIDI5IDA4OjMwOjIxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogUG9ydGFiaWxpdHkgZml4ZXMgZnJvbSBwMzoKKwljb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IHJlbW92ZWQgc2FuaXR5IGNoZWNrIHVudGlsIGl0CisJd29ya3Mgb24gYWxsIHRhcmdldHMgKHBlciBhZHZpY2UgZnJvbSBzYWMpLgorCWNvbmZpZy9ocDkwMDAubWg6IG5ldyBmaWxlIHRvIGRlZmluZSBVU0cuCisJaHBwYS5jOiAjdW5kZWYgaHBwYSBiZWZvcmUgdGhlIEpVTVBfVEFCTEUuCisJaG9zdHMvaHBwYWhwdXguaDogI2RlZmluZSBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIgaWYgbm90CisJX19TVERDX18uCisJdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpOiBpZiBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIsIG1ha2UKKwlsb2NhbCB2YXJpYWJsZSB0YXJnZXQgdm9sYXRpbGUgdG8gYXZvaWQgbXlzdGVyaW91cyBidWcgaW4KKwlIUDkwMDAvNzAwIGNjLgorCitTYXQgU2VwIDI2IDAzOjU4OjQ5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb25maWcvaHBwYWJzZC5taCwgY29uZmlnLmhwcGFocHV4Lm1oOiAgUmVtb3ZlIHZhcmlvdXMgYm9nb3NpdHkuCisJKiBob3N0cy9ocHBhaHB1eC5oOiAgUmVtb3ZlIGJjb3B5IGFuZCBpbmRleCBjaXJjdW12ZW50aW9ucy4KKworRnJpIFNlcCAyNSAyMjozNjo1MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29mZi16OGsuYyAoZnVuY19kYSwgZnVuY19qcik6ICBMaW50LgorCSogY29mZmNvZGUuaDogIFVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCisJKiBlbGYuYzogIFVzZSBtZW1jcHkgcmF0aGVyIHRoYW4gYmNvcHkuCisJKiB0ZWtoZXguYzogIFVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCisKK0ZyaSBTZXAgMjUgMTk6MTQ6NDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlBZGQgQWRvYmUgYS5vdXQgc3VwcG9ydC4KKworCSogYW91dC1hZG9iZS5jOiAgTmV3IGZpbGUuICBTbyBmYXIsIG9ubHkgcmVhZHMgYS5vdXQuYWRvYmUuICBGSVhNRS4KKwkqIGNvbmZpZy9hZG9iZS5tdDogIEFkZC4KKwkqIGNvbmZpZ3VyZS5pbiAoKi1hZG9iZS0qIHRhcmdldCk6ICBBZGQuCisJKiB0YXJnZXRzLmMgKGFfb3V0X2Fkb2JlX3ZlYyk6ICBBZGQuCisJKiBNYWtlZmlsZS5pbjogIGFkZCBhb3V0LWFkb2JlLmMuCisKKwkqIGNvbmZpZ3VyZS5pbjogIFB1dCB0d28gZGFzaGVzIGluIGFsbCBlbnRyaWVzIHRvIGJlIG1hdGNoZWQuCisJQWRkIGNvbW1lbnRzIHRvIHJlbWluZCBwZW9wbGUgdG8gZG8gdGhpcy4KKwlSZW9yZGVyIGFsbCBlbnRyaWVzIHRoYXQgbWF0Y2ggbWFudWZhY3R1cmVyIG5hbWVzLCB0byBvY2N1cgorCWxhc3QsIHNvIHRoZXkgd2lsbCBvbmx5IGJlIG1hdGNoZWQgaWYgbm8gbW9yZSBzcGVjaWZpYyBtYXRjaAorCW9jY3Vycy4gIFJlbW92ZSBtYW51ZmFjdHVyZXJzIGBhb3V0JywgYGJvdXQnLCBgY29mZicsIGFuZCBgZWxmJy4KKworRnJpIFNlcCAyNSAxNTowMzoyMiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKKworCSogZWxmLmMgKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBSZXR1cm4gYmZkX2Fic19zZWN0aW9uLCBub3QgMCwKKwlzaW5jZSB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBhIE5VTEwgc2VjdGlvbi4KKwkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIHN0X3NobmR4IGRvZXNuJ3QgbWF0Y2ggYW55IG9mIG91cgorCXRlc3RzLCBzZXQgdGhlIHNlY3Rpb24gdG8gYmZkX2Fic19zZWN0aW9uLgorCitGcmkgU2VwIDI1IDExOjExOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb2ZmLXo4ay5jOiBnZXR0aW5nIGNsb3NlcgorCSogY29mZmNvZGUuaCAoY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBhbGxvdworCUVYVFJBX0NBU0VTIGhvb2tzIGZvciBkaWZmZXJlbnQgYXJjaGVzIHRvIHByb3ZpZGUgZGlmZmVyZW50IHJlbG9jCisJdHlwZXMuCisJKiBzZWNsZXQuaDogI2lmbmRlZiBhcm91bmQgaXQgdG8gYWxsb3cgbXVsdGlwbGUgaW5jbHVzaW9uCisJKiBzcmVjLmM6IG1pbm9yIGRvYyBmaXgKKworTW9uIFNlcCAyMSAxNDozMzo1OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGhvc3RzL2hwOTAwMC5oLCBob3N0cy9pcml4My5oOiBjaGFuZ2VzIGZyb20gV1JTLgorCitTdW4gU2VwIDIwIDA4OjQ4OjI1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBVc2UgaTM4Ni1lbGYgZm9yIGFsbCBpMzg2L2k0ODYgc3lzdjQgaG9zdHMsIG5vdAorCWp1c3QgbmNyLgorCitUaHUgU2VwIDE3IDA2OjQwOjQ2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6IENsZWFyIGhvd3RvIGZpZWxkIGJlZm9yZQorCWZpbGxpbmcgaW4gcmVsb2MsIGluIGNhc2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNvZGUgZG9lc24ndCBzZXQKKwlpdC4KKworRnJpIFNlcCAxMSAxNTozNzowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IHNldCB0aGUgbGFzdCByZW51bWJlcmVkCisJc3ltYm9sIHBvaW50ZXIgdG8gTlVMTCwgYXMgZXhwZWN0ZWQgYnkgY29mZl93cml0ZV9saW5lbnVtYmVycy4KKwkoY29mZl93cml0ZV9yZWxvY3MpOiBhcHBhcmVudGx5IGEgbm9uLXplcm8gYWRkZW5kIGlzIE9LIGZvciByZWxvYworCXR5cGUgUl9JSENPTlNUIHVzZWQgb24gdGhlIDI5ay4KKworVGh1IFNlcCAxMCAxMzoyODoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIERldGVybWluZSB3aGV0aGVyIHRvIGZkb3BlbiBmb3IKKwl1cGRhdGUsIGJhc2VkIG9uIGhvdyB0aGUgdW5kZXJseWluZyBmaWxlIHdhcyBvcGVuZWQuICBPYnNvbGV0ZXMKKwlGQVNDSVNUX0ZET1BFTi4KKwkqIGhvc3RzL3JzNjAwMC5oLCBob3N0cy90YWhvZS5oLCBob3N0cy92YXhic2QuaDogIFJlbW92ZQorCWFsbCBGQVNDSVNUX0ZET1BFTiBjb25maWcgZGVmaW5lcy4KKworVHVlIFNlcCAgOCAyMTozNzo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHNwYXJjLW9wYy5jOiBNb3ZlZCB0byBvcGNvZGVzIGxpYnJhcnksIG5vdyB0aGF0IHdlIGhhdmUgb25lLgorCSogTWFrZWZpbGU6IERvbid0IGNvbXBpbGUgaXQuCisKK1R1ZSBTZXAgIDggMTA6MTA6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oOiBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgZGlkIG5vdCByZXR1cm4gYW55dGhpbmcuCisKK1RodSBTZXAgIDMgMTk6Mjk6MDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9mbGFncyk6ICBSZW1vdmUgYSBzYW5pdHkgY2hlY2suCisJSXQgaXMgdW5mb3J0dW5hdGVseSBicm9rZW4sIGFuZCBwcmV2ZW50cyBzdHJpcCBmcm9tIHdvcmtpbmcuCisKK1RodSBTZXAgIDMgMTY6MTQ6NDAgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBzcGFyYy1vcGMuYyAoY29uZHIpOiBSZW1vdmUgZXh0cmFuZW91cywgYnV0IGhhcm1sZXNzLCBiYWNrbGFzaAorCWNyZWF0ZWQgYnkgbGFzdCBjaGFuZ2UuCisKK1RodSBTZXAgIDMgMTM6NTI6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChyZWxvY19ob3d0b19zdHJ1Y3QpOiAgTWFrZSBzaXplIGZpZWxkIGJlIHVuc2lnbmVkLgorCSogYmZkLWluLmg6ICBCdW1wIHRvIHZlcnNpb24gMi4wLgorCitUaHUgU2VwICAzIDA5OjA1OjM3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGJvdXQuYywgY3B1LXo4ay5jOiAgVXNlIGVudW1zIHdoZW4gaW5pdGlhbGl6aW5nIHN0cnVjdHMgdG8ga2VlcAorCWJyYWluZGFtYWdlZCBIUC9BcG9sbG8gY29tcGlsZXIgaGFwcHkuCisKK1dlZCBTZXAgIDIgMDI6NTM6MjkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGZvcm1hdC5jOiAgRml4IGRlc2NyaXB0aW9uIG9mIHNlYXJjaCBmb3IgbWF0Y2hpbmcgdGFyZ2V0LgorCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFNldCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEuCisJKiB0YXJnZXRzLmM6ICBVcGRhdGUgZGVzY3JpcHRpb24gb2Ygc2VhcmNoIGZvciBtYXRjaGluZyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4sIGNsZWFuKTogIEZpeCBpbmZhbnQgbW9ydGFsaXR5IHR5cG8uCisJKGRvY2Rpcik6ICBTZXQgdG8gLi9kb2MsIG5vdCAke3NyY2Rpcn0vZG9jLCB3aGljaCBoYXMgbm8gbWFrZWZpbGUuCisJKHo4ayBhbmQgd2UzMmsgZmlsZXMpOiAgYCoubzogKi5jJzogYXZvaWQgU3VuIE1ha2UgYnVnLgorCitXZWQgU2VwICAyIDAwOjI2OjMyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbi9jbGVhbi9kaXN0Y2xlYW4gcnVsZXMuCisKK1R1ZSBTZXAgIDEgMTM6Mzg6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBUYWtlIG91dCBvYXN5cyAodW5sZXNzIHRoYXQgaXMKKwl0aGUgZGVmYXVsdCk6ICBCZWNhdXNlIHRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBpbiBhcmNoaXZlcywKKwl0aGVyZSBjYW4gYmUgYW5ub3lpbmcgdGFyZ2V0IG1pcy1tYXRjaGVzLgorCitNb24gQXVnIDMxIDEwOjExOjM3IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogc3BhcmMtb3BjLmM6IFJpZ29yb3VzbHkgdXBkYXRlZCB0byBtYXRjaCBhcmNoaXRlY3R1cmUgbWFudWFsLgorCitNb24gQXVnIDMxIDA4OjA3OjU4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChhb3V0PG4+c3dhcF9leHRfcmVsb2Nfb3V0KSwgYm91dC5jCisJKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogZml4IGJ1ZyAxNTA2IHdoZXJlIGFicyBzeW1ib2xzIGF0dGFjaGVkCisJdG8gdGhlIGJ1aWx0LWluIGFic19zZWN0aW9uIHdlcmUgbm90IHdyaXR0ZW4gb3V0IGNvcnJlY3RseS4KKworRnJpIEF1ZyAyOCAxNjoyOToxNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2JzZF9hcm1hcCk6IGlmIHRoZSBzeW1kZWZfY291bnQgaXMgdG9vCisJbGFyZ2UsIGFzc3VtZSB3ZSdyZSB1c2luZyBhIHN3YXBwZWQgYnl0ZSBvcmRlciBhbmQgZmFpbCB3aXRoCisJd3JvbmdfZm9ybWF0IHJhdGhlciB0aGFuIGR1bXBpbmcgY29yZS4KKworRnJpIEF1ZyAyOCAxNTozODowMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogUmVuYW1lZCBvcGMtc3BhcmMuYyB0byBzcGFyYy1vcGMuYyBmb3Igc3lzdGVtcyB3aXRoIHNob3J0CisJZmlsZW5hbWUgY29uc3RyYWludHMuCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlZCB0byByZWZsZWN0IGNoYW5nZS4KKworVGh1IEF1ZyAyNyAxMzowNToyOCAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQorCisJQWRkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHRoZSB3ZTMyazoKKworCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZvY29kZS5oLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYzoKKwlNaW5vciBlZGl0cy4KKwkqIGNvZmYtd2UzMmsuYywgY3B1LXdlMzJrLmMsIGNvbmZpZy93ZTMyay5tdCwgaG9zdHMvd2UzMmsuaDogTmV3IGZpbGVzLgorCitXZWQgQXVnIDI2IDE0OjIwOjE2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBib3V0LmM6IGFkZGVkIHN1cHBvcnQgZm9yIHJlbGF4YWJsZSBhbGlnbm1lbnQgcmVsb2NzLgorCisJKiBzZWNsZXQuYyAocmVsLCBzZWNsZXRfZHVtcF9zZWNsZXQsIHNlY2xldF9kdW1wKTogZ2V0IHRoZSBhcHAgdG8KKwlwYXNzIGRvd24gcG9pbnRlciB0byBwbGF5IGFyZWEgcmF0aGVyIHRoYW4gdXNlIGFsbG9jYQorCisJKiBjcHUtejhrLmMgKGNvbXBhdGlibGUpOiBtYWRlIHN0YXRpYyB0byByZWR1Y2UgbmFtZSBzcGFjZQorCXBvbHV0aW9uLgorCitUdWUgQXVnIDI1IDA4OjM5OjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisgICAgICAgIEFkZCBiYXNpYyBzdXBwb3J0IGZvciB0aGUgejhrOgorCisJKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgY29uZmlndXJlLmluLCByZWxvYy5jLAorCXNlY3Rpb24uYywgdGFyZ2V0cy5jLAorCisJKiBzeW1zLmM6IG1vdmUgbWlzLWluc2VydGVkIHBhdGNoLgorCitGcmkgQXVnIDE0IDE1OjM5OjI5IFBEVCAxOTkyICBIb3dhcmQgQ2h1ICAoaHljQGhhbmF1bWEuanBsLm5hc2EuZ292KQorCisJRG9jdW1lbnRhdGlvbiBmaXhlczoKKwkqIGN0b3JzLmMsIGZvcm1hdC5jLCBzZWN0aW9uLmMsIHJlbG9jLmM6IGFwcGVuZCAiIC0iIHRvIGl0ZW0gdGFncy4KKwkqIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6IGFkZCBET0NERCBiZWZvcmUgQG5vZGUKKwkJY29tbWVudHMuCisJKiByZWxvYy5jOiBicmVhayBvdXQgYWRkZW5kIGl0ZW0gZnJvbSBzdXJyb3VuZGluZyB0ZXh0LgorCisJKiBkb2Muc3RyIChET0NERCk6IERlZmluZWQuIEFkZHMgdGV4dCB0byBvdXRwdXQuCisJKGJvZHl0ZXh0KTogUHV0IGJ1bGxldGl6ZSBiZWZvcmUga2lsbF9ib2d1c19saW5lcy4KKwkqIGNoZXcuYyAoYnVsbGV0aXplKTogRW5kIGl0ZW1pemF0aW9uIGFmdGVyIGEgYmxhbmsgbGluZSwgdG8KKwlwcmV2ZW50IGZvbGxvd2luZyB0ZXh0IGZyb20gYmVpbmcgc3dhbGxvd2VkIHVwIGluIGFuIGl0ZW0uCisKK01vbiBBdWcgMjQgMjA6NTA6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQWRkIHNwYXJjbGl0ZSBhcyBhIHRhcmdldC4KKworTW9uIEF1ZyAyNCAxMjowNjozMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaWVlZS5jIChpZWVlX2dldF9zeW10YWIpOiBhbHdheXMgbnVsbCB0ZXJtaW5hdGUgdGhlIHN5bWJvbCBsaXN0LAorCWxpbnQuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IGlmIHN5bWJvbHMgZG9uJ3QgY29tZQorCWZyb20gYSBjb2ZmIGZpbGUgKGNzeW0gaXMgbnVsbCksIGRvbnQgZGVyZWYgdGhlbQorCisJKiBpZWVlLmMgKHBhcnNlX2V4cHJlc3Npb24pOiBnZXQgdGhlIGFuc3dlciByaWdodCB3aGVuIGFkZGluZyBhbgorCWFicysoc2VjK29mZiksIChpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IGNhbGwgaWVlZV9vYmplY3RfcAorCW9uIGVsdHMgc28gdGhhdCBmaWxlbmFtZSBpcyBmaWxsZWQgaW4uCisKK1RodSBBdWcgMjAgMTk6MDU6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGJvdXQuYyAoaG93dG9fYWxpZ25fdGFibGUpOiBOZXcgc2V0IG9mIHJlbG9jcywgd2l0aCBlbm91Z2gKKwlkYXRhIGZvciAib2JqZHVtcCAtciIgdG8gd29yay4KKwkoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgYWxpZ25tZW50IHJlbG9jcy4KKworVHVlIEF1ZyAxOCAxMjo1Nzo0NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKyAJKiBNYWtlZmlsZS5pbjogYWRkZWQgRkxBR1NfVE9fUEFTUywgYW5kIHVzZWQgaXQgZm9yIGFsbCByZWN1cnNpdmUKKwlpbnZvY2F0aW9ucyBvZiBtYWtlLiAgQWxzbywgYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24KKwlkaXJlY3Rvcmllcy4KKworCSogY29uZmlnL2Fwb2xsb3Y2OC5taDogcmVtb3ZlZCAtZyBmcm9tIENDIGRlZmluaXRpb24uCisKK01vbiBBdWcgMTcgMTM6NDA6MDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVGSU5FUyk6IFNwZWNpZnkgIi1HIDQiIHRvIGF2b2lkCisJb3ZlcmZsb3dpbmcgZ3Atb2Zmc2V0IHJhbmdlLgorCitNb24gQXVnIDE3IDExOjQ0OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBkb24ndCB3cml0ZSBvdXQgc2VjdGlvbnMKKwl3aXRob3V0IHRoZSBMT0FEIGFuZCBBTExPQyBhdHRyaWJ1dGVzCisKK01vbiBBdWcgMTcgMTE6NTU6MDcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBhcmNodXJlcy5jLCBjcHUtbTY4ay5jLCBjcHUtc3BhcmMuYzogVW5kbyAxNiBKdW5lIGNoYW5nZXMuCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyBjYWxsYmFjayAic2V0X3NpemVzIi4KKwkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrKTogRG9uJ3Qgc2V0IHBhZ2Uvc2VnIHNpemVzLgorCShta29iamVjdCk6IERpdHRvLgorCShzZXRfc2l6ZXMpOiBOZXcgcm91dGluZS4KKwkoYmFja2VuZF9kYXRhKTogUG9pbnQgdG8gaXQuCisJKiBhb3V0ZjEuaCAoc3Vub3M0X3NldF9zaXplcyk6IEhlZWQgYXJjaGl0ZWN0dXJlIHdoZW4gc2V0dGluZyBzaXplcy4KKwkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IFBvaW50IHRvIGl0LgorCSogYW91dHguaCAoc2V0X2FyY2hfbWFjaCk6IENhbGwgc2V0X3NpemVzIGNhbGxiYWNrLgorCitGcmkgQXVnIDE0IDE5OjIyOjE4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBhb3V0LXRhcmdldC5oOiAgTWFrZSBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmUKKwl0aGUgZGVmYXVsdC4gIEdpdmVuIHRoYXQgd2UgKndyaXRlKiB0aGUgc3Vja2VycyAoZm9yIGxvbmcKKwlhcmNoaXZlIG1lbWJlciBuYW1lcyksIHdlIHJlYWxseSBvdWdodCB0byBiZSBhYmxlIHRvIHJlYWQgdGhlbSEKKwkqIHRyYWQtY29yZS5jOiAgRG9uJ3QgaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4uICBJdCBkb2Vzbid0CisJc2VlbSB0byBiZSBuZWVkZWQsIGFuZCBtYW55IG1hY2hpbmVzIGRvbid0IGhhdmUgaXQuCisKK1RodSBBdWcgMTMgMDk6NTM6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmYtbTY4ay5jICh2ZWN0b3IpOiByZWFkIGFuZCB3cml0ZSBhcmNoaXZlcyBpbiBjb2ZmIGZvcm1hdC4KKworVHVlIEF1ZyAxMSAxMjoxOTo0MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogb3BjLXNwYXJjLmM6IE5ldyBmaWxlLgorCitTYXQgQXVnICA4IDIzOjE1OjM1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBib3V0LmMgKGJmZF9yZWxvY19zdGF0dXNfdHlwZSwgY2FsbGpfY2FsbGJhY2spOiAgQ2FzdCB2b2lkKgorCXBvaW50ZXJzIHRvIGJmZF9ieXRlKiBiZWZvcmUgcGVyZm9ybWluZyBhcml0aG1ldGljIG9uIHRoZW0uICBTdWNoCisJdXNlIHdpdGggYmFyZSB2b2lkKiBwb2ludGVycyBpcyBhIGdjYyBleHRlbnNpb24uCisJKiBjYWNoZS5jIChiZmRfY2FjaGVfZGVsZXRlKTogIEZvcndhcmQgZGVjbCB3aXRoIHByb3RvdHlwZSBmb3JtLgorCSogYXJjaGl2ZSAobm9ybWFsaXplKTogIEFkZCB0byBDT05TVCB0byBtYXRjaCBhY3R1YWwgdXNhZ2VzIHdpdGgKKwlDT05TVC4KKworTW9uIEF1ZyAgMyAwMDozNToyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIGk0ODYgaG9zdCBjcHUsIGFuZCB1c2UgaTM4Ni1lbGYKKwlmb3IgaTQ4Ni1uY3Itc3lzdjQuCisKK1NhdCBBdWcgIDEgMTM6NDk6NTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zdHJhdHVzLm10IChDQyk6ICBSZW1vdmUgZGVmaW5pdGlvbi4KKwkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgVGVzdCBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQKKwlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybnMgTlVMTCBhbmQgZG9uJ3QgZGVyZWZlcmVuY2UgaXQuCisKK01vbiBKdWwgMjAgMDI6NDY6MDkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQorCisJKiBhZGQgaHBwYV9kYXRhIHRvIGJmZCB0ZGF0YSAoaW5kaXJlY3RseSB2aWEgc2VmKS4KKworCSogY29uZmlnL2hwcGFocHV4Lm1oOiBocHV4IGlzIC1EVVNHIChwYXRjaCBieSBzZWYpCisKK1NhdCBKdWwgMTggMTU6NTA6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyciwgbm90IHN0ZG91dAorCitGcmkgSnVsIDE3IDE4OjMyOjQ2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogYmZkLmMsIGNhY2hlLmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsCisJICBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsIGRlbW82NC5jLCBsaWJhb3V0LmgsIGxpYmJmZC5jLAorCSAgb2FzeXMuYywgb3BuY2xzLmMsIHN1bm9zLmMsIHRhcmdldHMuYzogcmVtb3ZlZCByY3NpZCdzLgorCitGcmkgSnVsIDE3IDE3OjA2OjU2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaHBwYSogaW5zdGVhZCBvZiBocHBhCisKK1RodSBKdWwgMTYgMTY6Mzk6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmYtbTY4ay5jOiBhZGRlZCBSX1JFTExPTkdfTkVHIHJlbG9jIHR5cGUsIGFuZCBjaGFuZ2VkCisJUlRZUEUySE9XVE8gdG8gY29wZSB3aXRoIHNhbWUuCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogYWRkZWQgc3VwcG9ydCBmb3Igc2l6ZSBvZiAtMgorCShzdWJ0cmFjdCBhIHdvcmQgcmVsb2MgdHlwZSkuIFVwZGF0ZWQgZG9jLgorCitUaHUgSnVsIDE2IDE2OjI4OjA5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG1lcmdlZCBjaGFuZ2VzIGZyb20gcHJvZ3Jlc3NpdmUsIHJlbW92ZWQgcmNzaWQuCisKKwkqIGFyY2h1cmVzLmMsIGFyY2hpdmUuYywgTWFrZWZpbGUuZG9zOiByZW1vdmVkIHJjc2lkLgorCitUaHUgSnVsIDE2IDA4OjA4OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQtaW4uaCA6IGFkZCBCRkRfSVNfUkVMQVhBQkxFIGZsYWcKKwkqIGJvdXQuYyAoYm91dF9zd2FwX2V4ZWNfaGVhZGVyX1tpbl9vdXRdKTogbmV3IGZpZWxkIGluIGV4ZWMKKwloZWFkZXIgZV9yZWxheGFibGUsIG1ham9yIGhhY2tlcnkgaW4gY2FsbGJhY2tzCisJKiBsaWJhb3V0LmggOiBhZGQgc3BhY2UgZm9yIGFfcmVsYXhhYmxlLgorCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IHJlbGF4IGVtcHR5IHNlY3Rpb25zCisKKworV2VkIEp1bCAxNSAwNzo1Nzo0NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IGFkZCBzb21lIGNhc3RzIHRvIHRoZSBpbml0aWFsaXplcnMgZm9yCisJZHVtYiBjb21waWxlcnMKKworVHVlIEp1bCAxNCAxNDowNjoyOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBHcmVhdGx5IHNpbXBsaWZ5IGV4cHJlc3Npb24sCisJYW5kIGFkZCBhcHByb3ByaWF0ZSBjYXN0cyB0byBrZWVwIChwaWNheXVuZSkgYWl4LWNjIGhhcHB5LgorCitNb24gSnVsIDEzIDA1OjA2OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBlbGYuYyAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBOb3cgMm5kIGFyZyBpcyB3aGVyZSB0byB3cml0ZQorCXN5bWJvbCBwb2ludGVycy4gIFB1bnQgZXhwZW5zaXZlICYgdXNlbGVzcyBiZmRfcmVhbGxvYy4gIFVzZQorCW1hbGxvYyBmb3IgcmF3IHN5bWJvbHMsIGFuZCBmcmVlIGl0IGJlZm9yZSByZXR1cm5pbmcuCisJKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBEbyBub3Qgc2x1cnAgc3ltYm9sIHRhYmxlIHVudGlsIHBvbGl0ZWx5CisJYXNrZWQuIAlEbyBub3QgZXZlbiBzbHVycCBzdHJpbmcgdGFibGVzLgorCShlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6ICBDb3VudCAnZW0gd2l0aG91dCByZWFkaW5nIHRoZW0uCisJKGVsZl9nZXRfc3ltdGFiKTogIFRoaXMgaXMgaG93IHRvIHBvbGl0ZWx5IGFzay4gIFNjaGx1cnAhCisJVGhpcyBzaG91bGQgcHJvYmFibHkganVzdCAqYmVjb21lKiBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlLCBGSVhNRS4KKworV2VkIEp1bCAgOCAxNjoyNDozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiB3cml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZQorCWFyY2hpdmUgaGVhZGVyIHRvIGJlIGp1c3QgYSBsaXR0bGUgYml0IGxhdGVyIHRoYW4gdGhlIHRpbWVzdGFtcCBvZgorCXRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzCisJb3V0IG9mIGRhdGUuCisKK1R1ZSBKdWwgIDcgMDA6MjM6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGstZXJpY3Nzb24tKi4KKworU2F0IEp1bCAgNCAwMzoyOTo0MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogc3ltcy5oOiAgRGVmaW5lIEJTRl9GSUxFLCB1cGRhdGUgQlNGX1NFQ1RJT05fU1lNIGRlc2MuCisJKiBlbGYuYzogIFJlbW92ZSB1bmNvbmRpdGlvbmFsIGRlYnVnIHByaW50ZidzLgorCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmRsZQorCUJTRl9TRUNUSU9OX1NZTSA8PT4gU1RUX1NFQ1RJT04sIEJTRl9GSUxFIDw9PiBTVFRfRklMRS4KKwkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kIG91dCBzeW1ib2xzIGluIGZvcndhcmQsIG5vdAorCXJldmVyc2Ugb3JkZXIuICBTaW1wbGlmeSBkdXBsaWNhdGUgY29kZS4KKworRnJpIEp1bCAgMyAyMDoyMzozNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZWxmLmM6ICBSZW1vdmUgIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUKKwlyZXR1cm4gdmFsdWUgaXMgaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgorCitUdWUgSnVuIDMwIDE2OjQ5OjEyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBocHBhLmM6ICBBcHBseSBKb2huJ3Mgc3RhbmRhcmQgZml4IHRvIGF2b2lkICJlbXB0eSB0cmFuc2xhdGlvbgorCXVuaXQiIHdhcm5pbmdzIGZyb20gc29tZSBBTlNJLUMgY29tcGlsZXJzLgorCitUaHUgSnVuIDI1IDA0OjM5OjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBob3N0cy9zb2xhcmlzMi5oOiAgQ29uZmlndXJlIHNhbWUgYXMgc3lzdjQuCisKK1R1ZSBKdW4gMjMgMjE6NTQ6NDQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCAoYmZkX3NlZWspOiAgTWFrZSBwcm90b3R5cGUgbWF0Y2ggZGVmaW5pdGlvbi4KKwkqIHJlbG9jLmMgKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogIE1ha2UgY2FzdCBvbiByZXR1cm4KKwl0eXBlIG1hdGNoIGFjdHVhbCByZXR1cm4gdHlwZS4KKwkqIGVsZl9wcmludF9zeW1ib2wgKHNlY3Rpb25fbmFtZSk6ICBNYWtlIENPTlNULgorCitNb24gSnVuIDIyIDE3OjM1OjI0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBpMzg2bGludXguYywgaG9zdHMvaTM4NmxpbnV4LmgsIGNvbmZpZy9pMzg2LWxpbnV4Lm10OgorCU5ldyBmaWxlcywgZm9yIExpbnV4IChhIGZyZWUgVW5peCBjbG9uZSBmb3IgMzg2IG1hY2hpbmVzKS4KKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYzogIFVwZGF0ZSBhY2NvcmRpbmdseS4KKworRnJpIEp1biAxOSAyMDoyMzoyMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKwlMaW50cyBmb3IgYmZkX3JlbG9jX2NvZGVfdHlwZS0+YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLCBhbmQKKwljb3JyZWN0IGNhbGxpbmcgb2YgaG93dG8gc3BlY2lhbCBmdW5jdGlvbnMgYW5kIGZpeGVzIGZyb20gUmFlYnVybgorCWZvciBnYXM8PmJmZG5lc3MKKwkqIGFyY2h1cmVzLmM6IG51a2UgYmZkX3JlbG9jX2NvZGVfdHlwZQorCSogYm91dC5jLCBjcHUtaDgzMDAuYywgY29mZi1pOTYwLmMsIGNvZmYtbTg4ay5jOiBzcGVjaWFsIGZ1bmN0aW9uIGxpbnQKKwkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogU1RZUF9JTkZPIGlzIG1hcmtlZCBhcworCVNFQ19ORVZFUl9MT0FELCB2YXJpb3VzIG90aGVyIGJmZGdhcyBuZXduZXNzCisJKiByZWxvYy5jLT5saWJiZmQuaDogY2hhbmdlIHByb3R5cGUgb2YgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKKwkqIHRhcmdldHMuYzogY2hhbmdlIGp1bXAgdGFibGUgdmVjdG9yIHRvIGFib3ZlCisKKworRnJpIEp1biAxOSAxOTowMDo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogIE1hcmsgYXMgSU5URVJOQUxfRlVOQ1RJT04gc28KKwlpdHMgcHJvdG90eXBlIHdpbGwgYmUgaW5jbHVkZWQgaW4gbGliYmZkLmguICBDaGFuZ2UgcmVzdWx0IHR5cGUKKwl0byBzdHJ1Y3QgKiAocmF0aGVyIHRoYW4gZXF1aXZhbGVudCB0eXBlZGVmKSBzbyBpdCBjYW4gYmUgdXNlZCBpbgorCXRoZSBwcm90b3R5cGUsIHdoZXJlIHRoZXkgdHlwZWRlZiB3b24ndCBiZSBrbm93bi4KKwkqIGxpYmJmZC5oOiAgVXBkYXRlZCB2ZXJzaW9uLgorCitGcmkgSnVuIDE5IDE1OjIxOjU2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb25maWd1cmUuaW4sIGNwdS1ocHBhLmMsIGhwcGEuYywgbGliaHBwYS5oLAorCXRhcmdldHMuYzogIEhQUEEgbWVyZ2UuCisKK0ZyaSBKdW4gMTkgMTI6MjE6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIFNlcGFyYXRlIFNvbGFyaXMyIGZyb20gU1lTVjQgb24gU1BBUkMuCisJKiBjb25maWcvc29sYXJpczIubWg6ICBLbHVkZ2UgYXJvdW5kIFN1biBjb21waWxlciBidWcuCisKK1dlZCBKdW4gMTcgMTQ6MDI6NDYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbGliYW91dC5oIChhb3V0X2JhY2tlbmRfZGF0YSk6ICBDaGFuZ2UgZGVmcyBvZiB0d28gYml0ZmllbGRzIHRvCisJYmUgdW5zaWduZWQgY2hhcnMgaW5zdGVhZCB0byBnZXQgYXJvdW5kIHJzNjAwMCBjb21waWxlciBwcm9ibGVtLgorCitXZWQgSnVuIDE3IDEzOjU1OjMxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKToKKwlDb3JyZWN0IG1pc2NvbmNlcHRpb24gdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUgc3ltYm9sIHRhYmxlLgorCU9ubHkgY2FsbCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlIG9uIHRoZSBmdWxsIHN5bWJvbCB0YWJsZSwgbm90CisJdGhlIGR5bmFtaWMgb25lIHdoaWNoIGlzIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgb25lLgorCitXZWQgSnVuIDE3IDE1OjU0OjU3IDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQorCisJKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvciBJOTYwLAorCWRvbid0IGFsaWduIHNlY3Rpb25zIGluIGZpbGUuCisKK1R1ZSBKdW4gMTYgMDY6Mjg6MjEgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCisKKwkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGRlZCBmaWVsZCBmb3IgdGFyZ2V0LXNwZWNpZmljCisJKGJ1dCBub3QgZmlsZS1zcGVjaWZpYykgZGF0YSwgZm9yIGRpc3Rpbmd1aXNoaW5nIG1pbm9yCisJY2hhcmFjdGVyaXN0aWNzIGJldHdlZW4gKGUuZy4pIGEub3V0IGZvcm1hdHMuCisKKwkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IE5ldyBmaWVsZCB1c2VyX3NldF92bWEgaW5kaWNhdGVzIHZtYQorCWZpZWxkIHNob3VsZCBiZSBoZWVkZWQsIG5vdCBhc3N1bWVkIHRvIGJlIHVuc2V0LgorCShTVERfU0VDVElPTik6IEluaXRpYWxpemUgdGhhdCBmaWVsZCBvZiBzdGFuZGFyZCBzZWN0aW9ucyB0byB6ZXJvLgorCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBTZXQgdXNlcl9zZXRfdm1hIHRvIHRydWUuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogV3JpdGUgb3V0IHN3YXBwZWQgcmVsb2MsIG5vdAorCXByZS1zd2FwcGVkIHZlcnNpb24uCisKKwkqIGFyY2h1cmVzLmMgKHN0cnVjdCBiZmRfYXJjaF9pbmZvKTogRml4ZWQgb3JkZXIgb2YgY29tbWVudCBhbmQKKwlmaWVsZCBkZWNsLiAgTmV3IGZpZWxkcyBpbmRpY2F0ZSBzaXplIG9mIHBhZ2UgYW5kIHNlZ21lbnQgZm9yCisJYXJjaGl0ZWN0dXJlLgorCSogY3B1LW02OGsuYyAoTik6IEZpbGwgaW4gdmFsdWVzLgorCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBEaXR0by4KKworCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBWYXJpb3VzIGJpdHMgb2YgZGF0YSAobm90CisJYWxsIHVzZWQgY3VycmVudGx5KSB3aXRoIGNoYXJhY3RlcmlzdGljcyBvZiBhLm91dCBpbXBsZW1lbnRhdGlvbi4KKwlJbXBvcnRhbnQgZmllbGQgZm9yIG5vdyBpcyB0ZXh0X2luY2x1ZGVzX2hlYWRlciwgaW5kaWNhdGluZyB0aGF0CisJdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpbGUgaGVhZGVyLCB3aGljaAorCWdldHMgbWFwcGVkIGluIHdpdGggaXQuCisJKHN0cnVjdCBhb3V0X2RhdGEpOiBOZXcgZmllbGRzIGluZGljYXRlIHdoZXRoZXIgdm1hIGhhcyBiZWVuCisJYWRqdXN0ZWQgeWV0IChub3QgeWV0IHVzZWQpLCBhbmQgd2hhdCBtYWdpYyBudW1iZXIgd2lsbCBiZSB1c2VkIGluCisJdGhlIG91dHB1dCBmaWxlIChzaG91bGQgZ28gYXdheSBpbiBmYXZvciBvZiB2bWFfYWRqdXN0ZWQpLgorCShXUklURV9IRUFERVJTKTogQ29kZSBmb3IgZGVhbGluZyB3aXRoIHNlY3Rpb24gc2l6ZXMgYW5kIHJlbGF0ZWQKKwloZWFkZXIgZmllbGRzIHJlcGxhY2VkIHdpdGggY2FsbCB0byBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMuCisJKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBGaWxsIGluIG1hZ2ljIG51bWJlciBmaWVsZC4KKwlTZXQgV1BfVEVYVCBmbGFnIGZvciBaTUFHSUMgYXMgd2VsbCBhcyBOTUFHSUMgZmlsZXMuCisJKHNldF9hcmNoX21hY2gpOiBTZXQgcGFnZSBzaXplIGFuZCBzZWdtZW50IHNpemUgb25jZSBDUFUKKwl0eXBlIGlzIGtub3duLgorCShhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBOZXcgZnVuY3Rpb247IGhhcyBtdWNoIGNvZGUgbW92ZWQKKwlmcm9tIHNldF9zZWN0aW9uX2NvbnRlbnRzIGFuZCBXUklURV9IRUFERVJTLiAgU2V0cyBvciBhZGp1c3RzIHZtYQorCWFuZCBzaXplIHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgbWFueSBoZWFkZXIgZmllbGRzLCBhZnRlciBkZWNpZGluZworCW9uIG1hZ2ljIG51bWJlciBmb3Igb3V0cHV0IGZpbGUuICBDaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhpcworCWFkanVzdG1lbnQgaGFzIG9ubHkgYmVlbiBkb25lIG9uY2UuCisJKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgaW5zdGVhZCBvZgorCWRvaW5nIG11Y2ggb2YgdGhlIHdvcmsgaGVyZS4KKworCSogYW91dC10YXJnZXQuaCAoTVlfbWFrZV9kZWJ1Z19zeW1ib2wsIE1ZX2JhY2tlbmRfZGF0YSk6IFByb3ZpZGUKKwlkZWZhdWx0IChudWxsKSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzLgorCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBvdmVycmlkZSBhX3RleHQKKwl2YWx1ZSBpbiBleGVjIGhlYWRlci4KKwkoc3Vub3M0X2FvdXRfYmFja2VuZCwgTVlfYmFja2VuZF9kYXRhKTogRGVmaW5lIGJhY2tlbmQgZGF0YQorCWluZGljYXRpbmcgZmlsZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gdGV4dCBzZWN0aW9uLgorCisJKiBhb3V0ZjEuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBGaXggdHlwby4KKworCSogaG9zdHMvc3BhcmMuaCAoYWJvcnQsIGV4aXQpOiBIaWRlIHRoZXNlIG5hbWVzIGlmIGNvbXBpbGluZyB3aXRoCisJZ2NjIHZlcnNpb24gMiwgdG8gYXZvaWQgd2FybmluZ3MuCisKK01vbiBKdW4gMTUgMTI6MjY6NTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9uY3IzMDAwLm1oIChJTlNUQUxMLCBSQU5MSUIpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCisJaXQncyBicm9rZW4gb24gbmNyIDMwMDAncy4gIFVzZSBzaW1wbGUgInRydWUiIGZvciBSQU5MSUIuCisKK1NhdCBKdW4gMTMgMDk6MTY6NDMgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChtNjgwWzAxMjM0XTAtd3JzLSopOiBGaXggdHlwbyBpbiBtYXRjaCBwYXR0ZXJuLgorCitGcmkgSnVuIDEyIDE5OjQ4OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogIFJlbW92ZSBleHRyYSBzZW1pY29sb24gaW4gZGVjbGFyYXRpb25zLgorCSogY29uZmlndXJlLmluOiAgUmV3cml0ZSB0YXJnZXQgcGFyc2luZyB0byB1c2Ugc2ltcGxlIGZvcm1hdC4KKwlIYW5kbGUgc3BhcmMtc3VuLXNvbGFyaXMyIGNvbmZpZ3VyYXRpb24uCisJKiBhb3V0NjQuaDogIEF2b2lkIEFOU0kgQyBicmFpbiBkZWF0aCB3YXJuaW5nLgorCSogZWxmLmM6ICBBdm9pZCB0cmlncmFwaCAoPz8/KSBvciAvKiBpbiBjb21tZW50cy4KKworRnJpIEp1biAxMiAxNDo1MToxNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zeXN2NC5taDogbmV3IGZpbGUsIFJBTkxJQj1lY2hvCisKKwkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIFNvbGFyaXMyIGFzIC1zeXN2NCBvciAtc29sYXJpczIKKworVGh1IEp1biAxMSAwMDo1MjowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZWxmLmMgKGVsZl9vYmpfdGRhdGEpOiAgTWVyZ2UgZWxmX29ial90ZGF0YV9zdHJ1Y3QgYW5kCisJZWxmX2NvcmVfdGRhdGFfc3RydWN0IGludG8gYSBzaW5nbGUgY29tbW9uIHN0cnVjdC4gIENvcmUgZmlsZXMKKwl3b3VsZG4ndCBoYXZlIHdvcmtlZCBhdCBhbGwgd2l0aG91dCB0aGlzLgorCShiZmRfZWxmX2ZpbmRfc2VjdGlvbik6ICBOZXcgZnVuY3Rpb24gZm9yIEdEQidzIHVuZGVyY292ZXIgdXNlCisJdG8gZmluZCBzdHJpbmcgc2VjdGlvbnMgdGhhdCBCRkQgaGlkZXMgZnJvbSBpdC4KKwkoZWxmX2dldF9zdHJfc2VjdGlvbik6ICBBdm9pZCBtdWx0aXBsZSBhbGxvYyZyZWFkcyBmb3Igc2FtZSBkYXRhOworCWxpbnQuCisJKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEFsbG9jYXRlIGludGVybmFsIGZpbGUgaGVhZGVyCisJc3RvcmFnZSBkeW5hbWljYWxseS4KKwkqIGJmZC5jICh1bmlvbiB7Li4ufSB0ZGF0YSk6ICBSZW1vdmUgZWxmX2NvcmVfdGRhdGFfc3RydWN0LgorCSogZGVtbzY0LmM6ICBQcmV2ZW50ICJlbXB0eSB0cmFuc2xhdGlvbiB1bml0IiB3YXJuaW5ncyBmcm9tIGlkaW90cy4KKworVHVlIEp1biAgOSAxNzoxNToyNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3tpMzg2djQubWgsIG5jcjMwMDAubWh9OiAgVXBkYXRlIFJBTkxJQiwgYWRkIElOU1RBTEwuCisKK1NhdCBKdW4gIDYgMTc6MDI6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBTb2xhcmlzMiBhcyAqLXN1bi1zeXN2NCBvciBhcyAqLXN1bi1zdW5vczUuCisKK1N1biBNYXkgMzEgMDU6NDU6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBoYW5kbGUgbTY4MFswMTIzNF0wIGFzIGFsaWFzZXMgZm9yIG02OGsKKworVHVlIE1heSAyNiAxNjo1MDo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1hMjlrLmM6IGRvIGJ5dGUgcmVsb2NzIGNvcnJlY3RseQorCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBuZXZlciBsb2FkIElORk8gc2VjdGlvbnMKKwkqIHNlY2xldC5jIChyZWwpOiBkb24ndCByZWxvY2F0ZSBJTkZPIHNlY3Rpb25zCisKK1dlZCBNYXkgMjAgMDg6MTg6MTggMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCisKKwkqIHNlY3Rpb24uYyAoYmZkXypfc3ltYm9sLCBiZmRfKl9zZWN0aW9uKTogSW5pdGlhbGl6ZSBzdGF0aWNhbGx5LgorCU1ha2UgdGhlIHN5bWJvbHMgdW5tb2RpZmlhYmxlLgorCShiZmRfc2VjdGlvbl9pbml0KTogRGVsZXRlZC4KKwkqIGluaXQuYyAoYmZkX2luaXQpOiBEb24ndCBjYWxsIGJmZF9zZWN0aW9uX2luaXQuCisKKwkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRW5zdXJlIHRoYXQgcmFuZ2UgdG8gYmUKKwl3cml0dGVuIGlzIHdpdGhpbiBzZWN0aW9uIGJvdW5kYXJpZXMuCisJKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLiAgRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIGlmCisJc2l6ZSBpcyB6ZXJvLgorCisJKiBsaWJiZmQuYyAoYmZkX3htYWxsb2MpOiBUZXh0IG9mIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGNvbnN0LgorCisJKiBjb2ZmLWk5NjAuYyAoaG93dG9fdGFibGUpOiBEZWxldGVkLgorCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQsIGhvd3RvX29wdGNhbGwpOiBOZXcgdmFyczsKKwlpbnRlcmVzdGluZyBlbnRyaWVzIGZyb20gb2xkIGhvd3RvX3RhYmxlLgorCShSVFlQRTJIT1dUTyk6IEFkanVzdGVkIHRvIHVzZSBzd2l0Y2guCisJKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KKworCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYXV4CisJcmVjb3JkcyBmb3Igc2VjdGlvbiBzeW1ib2wuCisJKG1ha2VfYWJzX3NlY3Rpb24pOiBVbnVzZWQ7IGRlbGV0ZWQuCisJKHJlbnVtYmVyX3N5bWJvbHMpOiBSZS1vcmRlciBzeW1ib2xzIHNvIHVuZGVmaW5lZCBzeW1ib2xzIGNvbWUKKwlsYXN0LCBhcyBDT0ZGIGZvcm1hdCBkZXNpcmVzLgorCShjb2ZmX3dyaXRlX3N5bWJvbCk6IFB1dCBDX0ZJTEUgc3ltYm9scyBpbiBkZWJ1ZyBzZWN0aW9uIGFsd2F5cy4KKwkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IE5ldyBmdW5jdGlvbjsgY3JlYXRlcyBhIHN5bWJvbCB3aXRoIHRoZQorCXNhbWUgbmFtZSBhcyBhIHNlY3Rpb24sIGFuZCBzZXRzIHVwIGF1eCByZWNvcmRzIGZvciBpdC4KKwkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogTmV3IGZ1bmN0aW9uOyBhZGRzIHNlY3Rpb24gc3ltYm9scyB0bworCXN5bWJvbCB0YWJsZSBpZiB0aGV5IGFyZW4ndCB0aGVyZSBhbHJlYWR5LiAgU2hvdWxkIHNvbWVkYXkgYWxzbworCWFkZCBhIGR1bW15IENfRklMRSBzeW1ib2wgaWYgbm9uZSBpcyBwcmVzZW50LgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtaXNzaW5nIHN5bWJvbHMgYmVmb3JlIHByZXBhcmluZworCXN5bWJvbCB0YWJsZSB0byBiZSB3cml0dGVuLgorCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogVmVyaWZ5IHRoYXQgc3ltYm9sIGluZGljZXMgcmVhZCBpbiBhcmUKKwlpbiBhIHJlYXNvbmFibGUgcmFuZ2UuCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogTmV3IGZpZWxkIGNvbnZfdGFibGVfc2l6ZS4KKwkob2JqX2NvbnZfdGFibGVfc2l6ZSk6IEFjY2Vzc29yIG1hY3JvLgorCisJKiBib3V0LmMgKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlcyB0aHJlZQorCXJlbG9jIHR5cGVzIG9uIGk5NjAuCisKKwkqIGJmZC1pbi5oIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSk6IE5ldyBtYWNyby4gIExpa2UKKwliZmRfc2VjdGlvbl9uYW1lLCBidXQgcmV0dXJucyBydmFsdWUsIG5vdCBsdmFsdWUuCisJKGJmZF9nZXRfc2VjdGlvbl92bWEsIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQpOiBTaW1pbGFyLgorCShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MpOiBOb3cgcmV0dXJucyBydmFsdWUuCisKKwkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZCBzZXZlcmFsIG5ldyB2YWx1ZXMsIHNvbWUKKwlnZW5lcmFsLCBzb21lIHNwZWNpZmljIHRvIHNwYXJjIG9yIGk5NjAuCisKKwkqIGFvdXR4LmggKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IFZNQSBmb3IgZWFjaCBzZWN0aW9uIGJhc2VkCisJb24gcHJldmlvdXMgc2VjdGlvbi4gIElmIHRleHQgc2VjdGlvbiBWTUEgZG9lc24ndCBhcHBlYXIgdG8gaGF2ZQorCWJlZW4gc2V0LCBtYWtlIGEgYmVzdCBndWVzcyBmcm9tIHRoZSB0eXBlIG9mIGZpbGUuCisKKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRGVmaW5lIGFzIHplcm8gaWYKKwlub3QgZGVmaW5lZC4KKwkoTVkodmVjKSk6IEluaXRpYWxpemUgcmVsb2NfdHlwZV9sb29rdXAgZmllbGQuCisKKwkqIGFvdXR4LmggKGhvd3RvX3RhYmxlXyopOiBFeHBvcnQgYXMgYW91dF8jXypfaG93dG9fdGFibGUuCisJKGJmZF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdmVjdG9yKTogRXh0ZXJuLCBub3QgY29tbW9uLgorCisJKiBhb3V0ZjEuaCAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlcyBhCisJZmV3IHR5cGVzIG9mIHJlbG9jcyBmb3Igc3BhcmM7IHdpbGwgbmVlZCBlbmhhbmNlbWVudC4KKworCSogYm91dC5jIChjYWxsal9jYWxsYmFjayk6IFVzZSBERUZVTiBtYWNybyBpbiBkZWZpbml0aW9uLgorCSogY29mZi1pOTYwLmMgKG9wdGNhbGxfY2FsbGJhY2spOiBMaWtld2lzZS4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkZWQgZmllbGRzIHJlbG9jX3R5cGVfbG9va3VwIGFuZAorCV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wuICBBbHNvIG1pbm9yIGNvbW1lbnQgY2hhbmdlcy4KKwkqIHN5bXMuYyAoYmZkX21ha2VfZGVidWdfc3ltYm9sKTogTmV3IGRpc3BhdGNoaW5nIG1hY3JvLgorCSogcmVsb2MuYyAoYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVGFrZSBhIEJGRCBwdHIgYXMgYXJnIHJhdGhlcgorCXRoYW4gYXJjaCBpbmZvLCBhbmQgZGlzcGF0Y2ggd2l0aCBCRkRfU0VORC4gIENhbGxlcnMgY2hhbmdlZC4KKwkqIGFyY2h1cmVzLmMgKHN0cnVjdCBiZmRfYXJjaF9pbmZvKTogRGVsZXRlZCBmaWVsZAorCXJlbG9jX3R5cGVfbG9va3VwLgorCSogY3B1LSouYzogRG9uJ3QgaW5pdGlhbGl6ZSB0aGF0IGZpZWxkLgorCisJKiBiZmQtaW4uaCAoZW51bSBiZmRfZXJyb3IpOiBBZGQgbmV3IHZhbHVlICJiYWRfdmFsdWUiLgorCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogTm93IGNvbnN0OyBhZGRlZCBlbnRyeSBmb3IgYmFkX3ZhbHVlLgorCShiZmRfZXJybXNnKTogTm93IHJldHVybnMgcHRyIHRvIGNvbnN0LgorCSogYmZkLWluLmggKGJmZF9lcnJtc2cpOiBGaXggcHJvdG90eXBlLgorCisJKiBjYWNoZS5jIChCRkRfQ0FDSEVfTUFYX09QRU4pOiBGaXggdHlwbyBpbiBkb2MuCisJKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogRGl0dG8uCisKKwkqIHNlY3Rpb24uYyAoU2VjdGlvbiBPdXRwdXQgZG9jKTogSW1wcm92ZSBkZXNjcmlwdGlvbiBvZiB1c2Ugb2YKKwlvdXRwdXRfc2VjdGlvbiBhbmQgb3V0cHV0X29mZnNldC4KKworVHVlIE1heSAxOSAyMzo0MjoxMCAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCisKKwkqIHNjby1jb3JlLmM6IG5ldyBmaWxlIGZyb20gbmV0LgorCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBidWdmaXggZnJvbSBuZXQ6CisJICBOb3cgd2UgaGF2ZSB0aGUgaGFpcnkgbGlua2VyLCBpdCdzIHBvc3NpYmxlIHRvIG1vdmUgc3ltYm9scyBmcm9tCisJICBvbmUgc2VjdGlvbiBpbnRvIGFub3RoZXIuICBBY3R1YWxseSBtYWtlIHRoYXQgd29yayEKKworU2F0IE1heSAxNiAxNzo1Nzo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL3N1bjMuaDogZml4IGRlY2xhcmF0aW9uIG9mIGZyZWUuCisKK1R1ZSBNYXkgMTIgMTQ6MDg6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvZmYtYTI5ay5jIChwZXJmb3JtX3JlbG9jKTogZml4IGJ1ZyBpbiBqbXAvY2FsbCBldmFsdWF0aW9uCisJKiBjb2ZmLWg4MzAwLmMgKHJlbG9jX3Byb2Nlc3NpbmcpOiBhbGwgcmVsb2NzIGFyZSByZWxhdGl2ZSB0bworCXNlY3Rpb24gc3RhcnQuCisJKiBvcG5jbHMuYzogZG9uJ3QgdXNlIGZkb3BlbiBvbiBET1Mgc3lzdGVtcworCisJc2hvcnQgcGF0Y2hlcyBmcm9tIEdsZW5uIEthc3RlbiAoZ2xlbm5AcmVhZHkuY29tKQorCSogdGFyZ2V0LmM6IGVuYWJsZWQgb2FzeXMgc3VwcG9ydAorCSogb2FzeXMuYzogIEluc2VydCAuIHdoZW4gVU5ERVJTQ09SRV9IQUNLIGlzIGVuYWJsZWQsCisJZml4IHByb2JsZW0gd2hlcmUgYSByZWxvY2F0aW9uIHdoaWNoIGNyb3NzZWQgYSBtb2RpZmljYXRpb24gYnl0ZQorCWJvdW5kYXJ5IGRpZCBub3Qgd29yay4gRml4IHByb2JsZW0gd2hlcmUgYSByZWxvY2F0aW9uIG5lYXIgdGhlIGVuZAorCW9mIGEgZGF0YSByZWNvcmQgZGlkIG5vdCB3b3JrLgorCisKK1R1ZSBNYXkgIDUgMTg6MTE6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2NvZmZfYXJtYXApOiBvbGQgdmVyc2lvbnMgb2YgQkZEIHdyb3RlCisJYXJjaHZpZSBoZWFkZXIgc3RyaW5nIGNvdW50cyB0aGUgZW5kaWFuIHdheSwgdGhpcyBoZXVyaXN0aWMgc2VlcworCWhvdyBiaWcgYW4gYXJjaGl2ZSBzdHJpbmcgdG8gcmVhZCBieSB0cnlpbmcgaXQgb25lIHdheSBhbmQgaWYgdGhlCisJc3RyaW5nIHRhYmxlIGlzIHVucmVhc29uYWJseSBiaWcsIHRyeWluZyBpdCB0aGUgb3RoZXIuICpGSVhNRSouCisJKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBjYW4ndCBkbyBmZG9wZW5zIG9uIFZNUworCitUdWUgTWF5ICA1IDE0OjE4OjI0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogYmZkLWluLmg6ICBJbmNyZWFzZSB2ZXJzaW9uIG51bWJlciB0byAxLjk3LCBmb3IgY29uc2lzdGVuY3kKKwl3aXRoIC4uL2JpbnV0aWxzLgorCSogTWFrZWZpbGUuaW46ICBkb2NkaXIgaXMgLi9kb2MsIG5vdCAke3NyY2Rpcn0vZG9jLgorCitNb24gTWF5ICA0IDExOjQ5OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisgICAgICAgICogYmZkLWluLmg6IGJ1bXAgdmVyc2lvbiB0byAxLjk2CisgICAgICAgICBNYWpvciBjaGFuZ2U7IGNoYW5nZWQgY2FsbGluZyBjb252ZW50aW9uIGZvcgorCSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHNvIHRoYXQgY2FsbGVyIGFsbG9jYXRlcworCSBtZW1vcnkgZm9yIHNlY3Rpb24gZGF0YS4KKwkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksIHJlbG9jLmMsCisJc2VjbGV0LmMsIHRhcmdldHMuYywgYmZkLmM6IHJlZmxlY3QgbmV3IGNvbnZlbnRpb24uCisJKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IGlmIHN0eXBfZmxhZ3MgaXMgbm90IGEgc3BlY2lhbAorCWNhc2UsIHRoZW4gdXNlIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgZm9yIFNFQ18qIGZsYWdzLgorCitGcmkgTWF5ICAxIDEyOjU4OjM0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHVzZSBSRUxTWiB0byB3b3JrIG91dAorCXNpemUgb2Ygb3V0cHV0IHJlbG9jIHN0cnVjdC4KKwkqIHRhcmdldHMuYywgTWFrZWZpbGUuaW46IGNvbW1lbnQgb3V0IHRla2hleCBmb3IgdGhlIG1vbWVudC4KKwkqIGllZWUuYzogaWYgc29tZSBwbGFjZXMgd2hlcmUgbnVsbCBwb2ludGVycyB3ZXJlIHVzZWQgaW5zdGVhZCBvZiAmYmZkX2Fic19zZWN0aW9uLgorCSogY29uZmlndXJlLmluOiB0YW5kZW0gdGFyZ2V0IGlzIHN0MjAwMAorCSogY29mZi1tNjhrLmM6IHJlbmFtZSBzdGF0aWMgaG93dG9fdGFibGUgdG8gZ2xvYmFsCisJbTY4a2NvZmZfaG93dG9fdGFibGUuCisJKiBib3V0LmM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBhYm9ydAorCSogY29mZi1hMjlrLmM6IHZhcmlvdXMgY2hhbmdlcyB0byB0aGUgd2F5IHJlbG9jYXRpb25zIHdvcmsgdG8gY29wZQorCXdpdGggdGhlICJuZXcgb3JkZXIiIGFuZCBsYXRlbnQgYnVncy4KKwkqIGNvZmZjb2RlLmg6IGxpbnQKKworV2VkIEFwciAyOSAxMjozNzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoYW91dF9zd2FwX2V4dF9yZWxvY19vdXQsIGFvdXRfc3dhcF9zdGRfcmVsb2Nfb3V0KQorCWJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiB0cmVhdCBhYnMgc3VtYm9scyB0aGUgcmlnaHQgd2F5LgorCSogcmVsb2MuYyAoYmZkX3BlcmZvcm0tcmVsb2NhdGlvbik6IGRvbid0IHJlbG9jYXRlIHJlZnMgdG8KKwlhYnNvbHV0ZSBzeW1ib2xzIGlmIGRvaW5nIGEgcGFydGlhbCBsaW5rLgorCitGcmkgQXByIDI0IDA3OjM1OjI2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBhMjlrLWFtZC11ZGkuCisKK1RodSBBcHIgMjMgMTg6Mzc6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFvdXRfPGJpdHM+X3N3YXBfZXhlY19oZWFkZXJfaW4pOiAgWmVybyBvdXQgdGhlCisJaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgZmllbGRzIHRoYXQKKwlhcmUgdXNlZCwgc28gdGhhdCB0aGUgdW51c2VkIGZpZWxkcyBhcmUgaW4gYSBrbm93biBzdGF0ZS4KKworV2VkIEFwciAyMiAwOTozNjowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdGVraGV4LmMgKHN0cnVjdCBkYXRhX3N0cnVjdCk6ICBDb252ZXJ0IGZyb20gdHlwZWRlZiB0aGF0CisJdHlwZWRlZnMgbm90aGluZyB0byBhIG5vcm1hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24uCisJKiB0ZWtoZXguYyAocGFzc19vdmVyKTogIFByb3RvdHlwZSBhcmdzIGZvciBmdW5jdGlvbiB0aGF0CisJc2Vjb25kIGFyZyBwb2ludHMgdG8uCisKK01vbiBBcHIgMjAgMjI6MjI6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVtb3ZlIG9sZCBzdHlsZSBzdGFnaW5nLiAgRG8gbm90IHByaW50IHJlY3Vyc2lvbgorCSAgbGluZXMuCisKKwkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgQ0ZMQUdTIGNhbiBiZSBwYXNzZWQgZnJvbSB0aGUKKwkgIE1ha2VmaWxlIGNvbW1hbmQgbGluZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCisJICBQYXNzIENGTEFHUy4KKworRnJpIEFwciAxNyAwOToxNTozMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYmZkLmMsIE1ha2VmaWxlLmluOiBhZGRlZCB0ZWtoZXgKKwkqIGFvdXR4LmggKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogcGFnZXMgc2hvdWxkIGJlIHBhZGRlZCB0byB0aGUKKwlzaXplIG9mIGEgcGFnZSwgbm90IHRoZSBzaXplIG9mIGEgc2VnbWVudC4KKwkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgZ28zMiBob3N0IGFuZCBpMzg2LWFvdXQgdGFyZ2V0LgorCSogaTM4NmFvdXQuYywgbGliYW91dC5oOiBub3cgd29ya3MgZm9yIGdvMzIgdGFyZ2V0CisJKiBpZWVlLmM6IGZpeCBiaXQgcm90LgorCSogc2VjbGV0LmM6IHN1cHBvcnQgZm9yIHBhZGRpbmcgc2VjbGV0IHR5cGUuCisKK1dlZCBBcHIgMTUgMTg6MTE6NTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgLk5PRVhQT1JUOgorCitUdWUgQXByIDE0IDE0OjM0OjQyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBlbGYuYyAoYmZkX2FkZF9zdHJ0YWIsIGJmZF9hZGRfMl90b19zdHJ0YWIpOiAgQ09OU1Qgc3ByZWFkcworCWxpa2Ugb296ZS4KKwkqIGVsZi5jIChlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAorCWVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgUmV0dXJuIGJvb2xlYW4sIG5vdCBOVUxMICh3aGljaAorCWNhbiBiZSB2b2lkICopLgorCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBJZmRlZi1vdXQgZGVidWdnaW5nIGNvZGUuCisJQWxzbyBpZmRlZi1vdXQgY29kZSB0aGF0IGFib3J0cyBvbiB1bmhhbmRsZWQgc2VjdGlvbiB0eXBlcy4KKworRnJpIEFwciAxMCAyMjoyOToxOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5jcjMwMDAgY29uZmlnCisJKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBQYXNzIG9uIHRvIHJlY3Vyc2l2ZSBtYWtlcy4KKwkqIGhvc3RzL25jcjMwMDAuaCwgY29uZmlnL25jcjMwMDAubWg6ICBBZGQgaG9zdCBjb25maWcgZmlsZXMuCisKK1RodSBBcHIgIDIgMTc6NDI6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgTm93IHRoYXQgd2UgaGF2ZSBzeW0uaCBhbmQgc3ltY29uc3QuaCwgY29tcGlsZQorCWNvZmYtbXN5bS5jIG9uIGFsbCBzeXN0ZW1zLgorCSogY29uZmlnL3tkZWNzdGF0aW9uLm1oLCBpcml4My5taCwgaXJpeDQubWh9OiAgUmVtb3ZlIGNvZmYtbXN5bS5vIGRlcC4KKwkqIGNvZmYtbXN5bS5jOiAgVXBkYXRlIGluY2x1ZGUgZmlsZXMgYW5kIGNvbW1lbnRzOyBhZGQgd2Vha2V4dCBiaXQuCisKK1dlZCBBcHIgIDEgMjM6MTY6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYywgYmZkLmMsIGJvdXQuYywgY29mZmNvZGUuaCwgaW5pdC5jLCByZWxvYy5jLAorCXNlY3Rpb24uYywgc3JlYy5jLCBzeW1zLmMsIGNvZmYtaDgzMDAuYzogIExpbnQuCisKK1N1biBNYXIgMjkgMDk6Mzc6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtaTk2MC5jOiAgTGludC4KKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBuZXcgaG9zdCBhbmQgdGFyZ2V0IGNvbmZpZ3MuCisJKiBlbGYuYyAoYmZkX3Byc3RhdHVzLCBiZmRfZnByZWdzZXQpOiAgQXZvaWQgdHlwZW5hbWUgb2YgcmVnaXN0ZXIKKwlzdHJ1Y3RzLCB3aGljaCB2YXJ5OyBqdXN0IHVzZSBtZW1iZXIgbmFtZS4KKwkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgTGludCwgZml4IGNvbW1lbnRzLgorCSogY29uZmlnL3NwYXJjLWVsZi5tdCwgaG9zdHMvc3lzdjQuaDogIE5ldyBjb25maWcgZmlsZXMuCisKK1NhdCBNYXIgMjggMTM6MDc6MDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGVsZi5jIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBGaXggdG8gdXNlIG9ubHkgYSBzaW5nbGUKKwlsb2NhbCwgZGlzcG9zYWJsZSwgY29weSBvZiB0aGUgZXh0ZXJuYWwgZm9ybSBvZiBzZWN0aW9uIGhlYWRlcgorCXRhYmxlIGFuZCBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzLgorCitUaHUgTWFyIDI2IDE2OjU5OjU4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFNldCBNSU5JTUlaRSBiYWNrIHRvIDAgZm9yIGEgcmVhbCByZWxlYXNlLgorCitUdWUgTWFyIDI0IDE1OjU3OjAzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGNvbmZpZy9pcml4NC5tW2h0XSwgaG9zdHMvaXJpeDQuaDogYWRkIHN1cHBvcnQgZm9yCisJICBpcml4NC4KKworTW9uIE1hciAyMyAyMjozNzozNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9yZmRfaW4pOiAgcmVtb3ZlICYgZm9yIGFycmF5IHJlZi4KKworVHVlIE1hciAxNyAxNDoxMjoyNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiAgVXNlIEJGRF9BU1NFUlQgbWFjcm8sCisJbm90IGludGVybmFsIGJmZF9hc3NlcnQgZnVuY3Rpb24gKHR3aWNlKS4KKworVHVlIE1hciAxNyAxMDo0NToxMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dC10YXJnZXQuaDogY2hhbmdlIGFyX21heF9uYW1lbGVuIHRvIDE1ICh0aGUgcmlnaHQgdmFsdWUpCisJKiBjb2ZmLWEyOWssIGNvZmZjb2RlLmg6IG1vcmUgaGFuZ292ZXJzIGZyb20gdGhlIGJmZF9hYnNfc2VjdGlvbgorCWNoYW5nZQorCitNb24gTWFyIDE2IDE0OjU3OjIyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHJ0bC5jeWdudXMuY29tKQorCisJKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IGNoZWNrIGZvciBib3V0IGFyY2hpdmVzIHRvby4KKwkqIGJvdXQuYzogbWFrZSBpdCB3b3JrIGFnYWluLgorCitTYXQgTWFyIDE0IDE3OjMwOjQwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBlbGYuYyAoZWxmX2NvcmVmaWxlX25vdGUpOiAgQ2FsbCBiZmRfeG1hbGxvYygpIGluc3RlYWQgb2YgYmFyZQorCW1hbGxvYygpLgorCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogIENhbGwKKwliZmRfeG1hbGxvYygpIGluc3RlYWQgb2YgYmFyZSBtYWxsb2MoKS4KKworRnJpIE1hciAxMyAxNTo0NDozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBNQUtFSU5GTyBvbiBpbmZvLgorCitGcmkgTWFyIDEzIDA3OjQxOjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWcvbXQtPGZvbz4gbm93IDxmb28+Lm10LCBjb25maWcvbWgtPGZvbz4gbm93IDxmb28+Lm1oLgorCWhvc3QvaC08Zm9vPiBub3cganVzdCA8Zm9vPi4KKwkqIGNvbmZpZ3VyZS5pbjogcmVmbGVjdCBjaGFuZ2VzCisKK1RodSBNYXIgMTIgMTE6MTU6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGxpYmJmZC1pbi5oIChzZXRfdGRhdGEpOiAgTWFrZSBjaGFuZ2Ugb2YgRmViIDI3IGluIHRoZQorCWFjdHVhbCBzb3VyY2UgZmlsZSwgbm90IGp1c3QgdGhlIGdlbmVyYXRlZCBsaWJiZmQuaC4KKworU2F0IE1hciAgNyAxMDozMzo0MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1pOTYwLmMgKGljb2ZmX2xpdHRsZV92ZWMpOiBhZGQgQ09GRl9TV0FQX1RBQkxFIHNvIHdlIGNhbiBydW4KKwlnZGIgb24gbGl0dGxlLWVuZGlhbiA5NjAgY29kZS4KKwkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBpbmRpcmVjdCBzeW1ib2xzIHNob3VsZCBnbworCWludG8gdGhlIGFyY2hpdmUgaGVhZGVyIHRvby4KKworRnJpIE1hciAgNiAyMTo1NToxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KKworVGh1IE1hciAgNSAyMzo1MTo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29mZi1tc3ltLmM6ICBNb3ZlIHRoaXMgZmlsZSBmcm9tIGdkYi9lY29mZi5jLiAgSXQKKwloYW5kbGVzIGJ5dGUtc3dhcHBpbmcgZm9yIEVDT0ZGIChNSVBTIHN5bWJvbCkgZmlsZXMuCisJKiBjb25maWcvbWgtZGVjc3RhdGlvbiwgY29uZmlnL21oLWlyaXgzOiAgQWRkIGNvZmYtbXN5bS5vCisJdG8gdGhlIGZpbGVzIGJ1aWx0IG9uIE1JUFMtYmFzZWQgaG9zdHMuCisJKiBNYWtlZmlsZS5pbjogIEFkZCBydWxlIGZvciBjb2ZmLW1zeW0uCisKK1RodSBNYXIgIDUgMjE6MzY6MDUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4gIE1JTklNSVpFPTEuCisKK1N1biBNYXIgIDEgMjI6MzI6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGNvZmYtcnM2MDAwLmM6ICBNb3ZlIGNvcmUgZmlsZSBmdW5jdGlvbnMgaW50byBzZXBhcmF0ZQorCW5ldyBmaWxlIHJzNjAwMC1jb3JlLmMuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJlYWRpbmcKKwljb3JlIGZpbGVzIGRlcGVuZHMgb24gbmF0aXZlIGluY2x1ZGUgZmlsZXMgdGhhdCBjb25mbGljdAorCXdpdGggLi4vaW5jbHVkZS9jb2ZmL3JzNjAwMC5oLgorCSogY29uZmlnL21oLXJzNjAwMDogIEFkZCByczYwMDAtY29yZS5vIHRvIEhERVBGSUxFUy4KKworVGh1IEZlYiAyNyAyMjoxOTo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiBEb24ndCBwcmludAorCXN5bWJvbCBhZGRyZXNzcyBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCisJKiBjb2ZmLXJzNjAwMC5jOiAgVmFyaW91cyB1cGRhdGVzIChkdWUgdG8gdGFyZ2V0LQorCWluZGVwZW5kZW50IGNoYW5nZXMpLgorCSogbGliYmZkLmg6ICBEaXR0byAodGRhdGEgZmllbGQgaXMgbm93IGEgdW5pb24pLgorCSogaG9zdHMvaC1zcGFyYy5oOiAgUmVtb3ZlZCBwcm90b3R5cGUgZm9yIGJvZ3VzIGZ1bmN0aW9uCisJJ2Vtc2V0JyAocHJlc3VtYWJseSBzaG91bGQgaGF2ZSBiZWVuICdtZW1zZXQnIC0gd2hpY2ggaXMgdGhlcmUpLgorCitUaHUgRmViIDI3IDExOjQ2OjMzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKG1pcHMtYmlnLSogdGFyZ2V0KTogIFNhbWUgaXMgSXJpcy4KKworVGh1IEZlYiAyNyAwOToyNDo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IHdoZW4gY3JlYXRpbmcgYW4KKwlhbGlhcyBzeW1ib2wsIGZpbGwgaW4gdGhlIHNlY3Rpb24gYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbgorCWxlYXZpbmcgaXQgYmxhbmsuIElmIGFuIG91dHB1dCBzZWN0aW9uIGNhbid0IGJlIGZvdW5kIGZvciBhCisJc3ltYm9sLCB0aGVuIGRvbid0IGNvcmUgZHVtcC4KKworV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKKwkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAorCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCisKK1dlZCBGZWIgMjYgMTk6NDA6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGJmZC5jOiBsaW50CisJKiBjb2ZmLWg4MzAwLmM6IGZpeCBzdHVwaWQgcmVsb2Mgc3VidHJhY3Rpb24gYnVnCisJKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCk6IG9ubHkgc3dhcCBhIHR2bmR4IGJ5IDIgYnl0ZXMsCisJc2luY2UgdGhhdCdzIGhvdyB3aWRlIGl0IGlzLiAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBhbHdheXMgemVybyBvdXQKKwl0aGUgc3ltYm9sLmZsYWdzIGFuZCBkb25lX2xpbmVubyBmaWVsZHMuCisKK1R1ZSBGZWIgMjUgMTQ6Mjk6MjQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfc3ltYm9sKTogd3JpdGUgb3V0IHRoZSBjb3JyZWN0IG51bWJlciBvZgorCWF1eGVudHMuCisJKiBjcHUtaDgzMDAuYzogZml4IGRpc2Fzc2VtYmx5IGJ1ZworCitGcmkgRmViIDIxIDIxOjM5OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBiZmQtaW4uaCAoYmZkX2Vycm1zZyksIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4sCisJc2VjdGlvbl9mcm9tX2JmZF9pbmRleCksIGNwdS1oODMwMC5jIChob3d0bypfY2FsbGJhY2spLAorCXJlbG9jLmMsIHNlY3Rpb24uYyAoYmZkX21hcF9vdmVyX3NlY3Rpb25zKSwgdGFyZ2V0cy5jCisJKGJmZF90YXJnZXRfbGlzdCk6ICBQcm90b2xpbnQuCisJKiBsaWJiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBhIGxpYmJmZC1pbi5oIGZyb20gYSBtb250aCBhZ28uCisKK0ZyaSBGZWIgMjEgMTA6NTc6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBsaW50LCAoY29mZl9wcmludF9zeW1ib2wpOiBwcmludHMKKwlvdXQgdGFnbmR4IHRvby4KKwkqIGFvdXR4LmggKHN3YXBfc3RkX3JlbG9jX291dCwgc3dhcF9leHRfcmVsb2Nfb3V0KTogdXNlIHRoZSBvdXRwdXQKKwlzZWN0aW9uIG9mIGEgc3ltYm9sIHJhdGhlciB0aGFuIHRoZSBzZWN0aW9uIG9mIGEgcmVmZmVkIHN5bWJvbCB0bworCWRldGVybWluZSB0aGUgcl9pbmRleCBvZiBhbiBlbW1pdHRlZCByZWxvYy4KKworVGh1IEZlYiAyMCAxODoxMDozNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogUE9SVElORzogTmV3IChwcmVsaW1pbmFyeSkgcG9ydGluZyBndWlkZS4KKworV2VkIEZlYiAxOSAyMTozOTozNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYm91dC5jIChjYWxsal9jYWxsYmFjayksIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKSwgY29mZi1tODhrLmMKKwkoaG93dG9faHZydDE2KTogIGxpbnQuCisKK01vbiBGZWIgMTcgMTI6MDI6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGhwMzAwYnNkLmMgKG5ldyksIGNvbmZpZy9tdC1ocDMwMGJzZDogIE1ha2UgaHAzMDBic2QKKwlhIGZ1bGwgY29uZmlndXJhdGlvbiAod2l0aCBwb3NzaWJsZSBjcm9zcy1kZXZlbG9wbWVudCksCisJaW5zdGVhZCBvZiB1c2luZyBob3N0LWFvdXQuYy4KKworU3VuIEZlYiAxNiAxMzowMTo0OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogYW91dC10YXJnZXQuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKKwlTZXQgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpLgorCSogZ2VuLWFvdXQuYzogIENoYW5nZSB0byBlbWl0IGEgLmMgZmlsZXMsIG5vdCBhIC5oIGZpbGUuCisKK1RodSBGZWIgMTMgMjA6MTE6NDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGVsZi5jIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFJlbW92ZSBvYnNvbGV0ZSB1c2Ugb2YKKwlCU0ZfQUJTT0xVVEUgYW5kIHJlcGxhY2Ugd2l0aCBiZmRfYWJzX3NlY3Rpb24gcmVmZXJlbmNlLgorCitUaHUgRmViIDEzIDE3OjIyOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oIChnZXRfbm9ybWFsaXplZF9zeW10YWIpOiBmaXhlZCBidWcgd2hlcmUgc3ltYm9scworCXdpdGggbW9yZSB0aGFuIG9uZSBhdXhlbnQgY2FuIGNhdXNlIG5hc3R5IGNvcmUgZHVtcHMuCisKKwkqIGNvZmZjb2RlLmgsIGxpYmNvZmYuYzogYWRkZWQgbmV3IGZpZWxkZWQgdG8gY29mZl9zeW1ib2xfc3RydWN0CisJImRvbmVfbGluZW5vIiBzbyB0aGF0IGEgc3ltYm9sIHdoaWNoIGFwcGVhcnMgdHdpY2UgaW4gdGhlIHN5bWJvbAorCXRhYmxlIG9ubHkgZ2V0cyBpdCdzIGxpbmVudW1iZXJzIHJlbG9jYXRlZCBvbmNlLiBNb2RpZmVkCisJKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCkgYW5kIChjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKSB0byBtYWtlCisJdXNlIG9mIGl0LgorCitUdWUgRmViICA0IDE1OjM5OjU1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oOiAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IGZpeCBjb25zdHJ1Y3RvcgorCXN0dWZmIHRvIHVzZSB0aGUgTmV3IE9yZGVyLgorCitGcmkgSmFuIDMxIDAxOjM0OjQ1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGllZWUuYzogIENoYW5nZSB0eXBlIG9mIGVudmlbXSB0byB1bnNpZ25lZCBjaGFyLgorCisJKiBjb25maWd1cmUuaW46ICBmaXggdmF4IHVsdHJpeCBjb25maWd1cmF0aW9uLgorCisJKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIERlYWwgd2l0aCBudWxsIHJldHVybiBmcm9tCisJYmZkX21ha2Vfc2VjdGlvbigpLiAgKGVsZl9vYmplY3RfcCk6ICBTZWxlY3QgZW5kaWFuZXNzIHByb3Blcmx5LgorCitGcmkgSmFuIDMxIDAxOjE5OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBob3N0cy9oLXRhaG9lLmgsIGgtdmF4YnNkLmg6ICBGaXggc3RhY2sgaW4gY29yZSBmaWxlcy4KKworVGh1IEphbiAzMCAyMzo1MTowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBob3N0LWFvdXQuYyBkb2Vzbid0IGRlcGVuZCBvbiBhb3V0LXBhcmFtcy5oLgorCSogYW91dC10YXJnZXQuaDogIFVzZSBUQVJHRVRfQklHX0VORElBTl9QIHRvIHNldCB1cCB2ZWN0b3IuCisJKiBob3N0LWFvdXQuYzogIERvbid0IHVzZSBhb3V0LXBhcmFtcy5oOyBjb25maWd1cmUgdGhlc2Ugc3lzdGVtcworCWluIHRoZWlyIHhtIGZpbGVzLCBub3QgaW4gYSByYW5kb21seSBnZW5lcmF0ZWQgZmlsZS4KKwkqIGhvc3RzL2gtaHAzMDBic2QuaCwgaC10YWhvZS5oLCBoLXZheGJzZC5oLCBoLXZheHVsdC5oOgorCVNwZWNpZnkgYnl0ZSBvcmRlci4KKwkqIGhvc3RzL2gtdmF4YnNkLmg6ICBEZWZpbmUgdGhlIGZvcm0gb2YgZXhlYyBhbmQgY29yZSBmaWxlcy4KKworVGh1IEphbiAzMCAxMzowMjo0MSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LXRhaG9lLCBjb25maWcvbXQtdmF4OiAgQ2hhbmdlIERFRkFVTFRfVkVDVE9SIHRvCisJaG9zdF9hb3V0X3ZlYyBoZXJlIGFzIHdlbGwuCisKK1RodSBKYW4gMzAgMTE6NDE6NDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaG9zdC1hb3V0LmM6ICBDaGFuZ2UgVEFSR0VUTkFNRSB0byAiYS5vdXQiIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorCWdkYi4gIGNvbmZpZy9tdC1ocDMwMGJzZDogIENoYW5nZSBERUZBVUxUX1ZFQ1RPUiB0byBob3N0X2FvdXRfdmVjCisJdG8gcHJldmVudCB1bmRlZmluZWQgc3ltYm9sLgorCitUaHUgSmFuIDMwIDA3OjI2OjUzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJVmFyaW91cyBsaW50cyBmb3VuZCBvbiBQZXJzU29ueQorCSogYW91dHguaDogY2FzdCBhbiBlbnVtCisJKiBjb2ZmLWEyOWsuYzogbWFueSBpbnRzIGluIHJlbG9jIHN0cnVjdHVyZSB0dXJuZWQgdG8gZW51bQorCSogY29mZmNvZGUuaDogbW9yZSBlbnVtcworCSogY3B1LWg4MzAwLmM6IG1vcmUgZW51bXMKKwkqIG9wbmNscy5jOiBtb3JlIGVudW1zCisKK1RodSBKYW4gMzAgMDE6MTk6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgVGFob2UgY29uZmlndXJhdGlvbiB3b3JrIGFnYWluLgorCSogYmZkLWluLmg6ICBSZW1vdmUgdHJhaWxpbmcgY29tbWEgZnJvbSBlbnVtIGRlY2xhcmF0aW9uLgorCSogaWVlZS5jOiAgQ2FuJ3QgcHV0IGJ5dGUgdmFsdWVzID4weDdGIGludG8gYSBzaWduZWQgY2hhci4KKworVHVlIEphbiAyOCAyMToxMDo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBBZGQgZGVwZW5kZW5jaWVzIGZvciB2YXJpb3VzIGNvZmYtKi5vIGZpbGVzLgorCisJKiBlbGYuYzogIFJlbW92ZSBleHRyYW5lb3VzIHBhcmVuIGZyb20gY29yZV9wcnBzaW5mbyBhbmQKKwljb3JlX3BycHN0YXR1cyBtYWNyb3MsIHJlbmFtZSBjb3JlX3BycHN0YXR1cyB0byBjb3JlX3Byc3RhdHVzLgorCVJlcGxhY2UgcmVmZXJlbmNlcyB0byBvbGQgc2VjdGlvbiAic2l6ZSIgbWVtYmVyIHdpdGggbmV3CisJIl9yYXdfc2l6ZSIgbWVtYmVyLiAgSW1wbGVtZW50IGVsZl9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2gKKwlpcyBub3cgdXNlZC4KKworVHVlIEphbiAyOCAxNDo1MTo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiB0cmFkLWNvcmUuYywgYmZkLmMsIC4uL2luY2x1ZGUvYmZkLmg6ICBWYXJpb3VzIGZpeGVzIGZvciBQTUFYCisJY29yZSByZWFkaW5nLgorCitUdWUgSmFuIDI4IDEwOjQ2OjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9yZWxheF9zZWN0aW9uKTogbm93IHN0YXRpYy4KKwkoYmZkX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogdmFyaW91cyB0eXBlIGxpbnRzLgorCitNb24gSmFuIDI3IDE5OjQ0OjA4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJTmV3IGVudHJ5IHBvaW50IGluIHRoZSB0cmFuc2ZlciB2ZWN0b3IgLSBiZmRfcmVsYXhfc2VjdGlvbi4KKworCSogYW91dC10YXJnZXQuaDogYWRkIHRvIHZlY3RvciwgY2FsbCBnZW5lcmljX3JlbGF4CisJKiBiZmQtaW4uaDogYWRkIHRvIHZlY3RvcgorCSogYmZkLmM6IGFkZCAjZGVmaW5lIGZvciB2ZWN0b3IKKwkqIGJvdXQuYzogYWRkIHRvIHZlY3RvciwgY2FsbCBnZW5lcmljX3JlbGF4CisJKiBjb2ZmY29kZS5oOiBhZGQgdG8gdmVjdG9yLCBhbHNvIG5vdyBoYXMgY29mZiBzcGVjaWZpYyByZWxheCBjb2RlCisJZm9yIHRoZSByZWxheGFibGUgSDgvMzAwIHJlbG9jcy4gQWxzbyBjbGVhbiB1cCBhYnMgc2VjdGlvbiBjcnVmdC4KKwkqIGVsZi5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKKwkqIGllZWUuYzogY2FsbCBuZXcgdmVjdG9yLCBjbGVhbiB1cCBzb21lIGJ1Z3MgZHVlIHRvIHRoZSBjcmVhdGlvbgorCW9mIGJmZF9hYnNfc2VjdGlvbgorCSogbGliYmZkLmg6IGFkZCBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIEVYRlVOCisJKiBvYXN5cy5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKKwkqIHJlbG9jLmM6IGltcGxlbWVudCBnZW5lcmljX3JlbGF4CisJKiBzZWNsZXQuYzogbW92ZWQgbXVjaCBvZiB0aGlzIGludG8gY29mZmNvZGUuaAorCSogc3JlYy5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKKwkqIHRhcmdldHMuYzogZGVmaW5lIG5ldyB0cmFuc2ZlciB2ZWN0b3IKKworRnJpIEphbiAyNCAxNDo0MDoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogZXZlcnl0aGluZzogbm93IG1vZGlmaWVkIHRvIHVzZSBzbWFsbGVyIHJlbG9jIHR5cGUuIFNlbGYgaG9zdHMKKwlvbiBzdW4zICYgc3VuNC4KKworU2F0IEphbiAxOCAxNzowMDoxNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXN0cmF0dXMsIGNvbmZpZy9tdC1pODYwLWVsZiwgaG9zdHMvaC1zdHJhdHVzOgorCU5ldyBmaWxlcyBmb3Igc3RyYXR1cy4KKworCSogY29uZmlndXJlLmluOiAgQWRkIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnRzIGZvciBzdHJhdHVzLgorCitXZWQgSmFuIDE1IDEwOjAyOjQzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogRGVjbGFyZSB2YXJpb3VzIGZpbGVuYW1lCisJdmFyaWFibGVzIGFzIENPTlNUIHNpbmNlIHRoZXkgYXJlIHNldCB0byBwb2ludCB0byBhIGNvbnN0IGNoYXIKKwlzdHJpbmcuICBGaXhlcyBjb21waWxlciBjb21wbGFpbnRzLgorCitGcmkgSmFuIDEwIDE3OjQ0OjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBob3N0cy9oLWFtaXguaCBob3N0cy9oLWkzODZ2NC5oOiAgQ2hhbmdlIGFib3J0KCkgdG8gYSBmdW5jdGlvbgorCXJldHVybmluZyB2b2lkLgorCitGcmkgSmFuIDEwIDE0OjMzOjMyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogIFJlY29nbml6ZSBOX1NPTAorCXN5bWJvbHMsIHNvIHRoYXQgd2UgY2FuIGVtaXQgdGhlIGNvcnJlY3QgZmlsZSBuYW1lIGV2ZW4KKwlpZiBpdCdzIGFuIGluY2x1ZGUgZmlsZS4KKworVGh1IEphbiAgMiAxNjo0MzozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29mZi1pOTYwLmM6ICBBZGQgQ09GRl9TV0FQX1RBQkxFIHRvIGxpdHRsZV92ZWMgYXMgd2VsbCBhcyBiaWdfdmVjLgorCShSZXBvcnRlZCBieSBqb2huQGxhYnRhbS5sYWJ0YW0ub3ouYXUgKEpvaG4gQ2FyZXkpKS4KKworV2VkIEphbiAgMSAwNDoyMzowNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZWxmLmM6ICBDaGFuZ2UgYWxsICcjaWYgSEFWRV9QUk9DRlMnIHRvICcjaWZkZWYgSEFWRV9QUk9DRlMnLgorCisJKiBjb25maWcvbWgtYW1peCwgY29uZmlnL21oLWkzODZ2NDogIFJlbW92ZSBIREVGSU5FUyB0aGF0IHdhcworCWJlaW5nIHVzZWQgdG8gLURIQVZFX1BST0NGUy4KKworCSogaG9zdHMvaC1hbWl4LCBob3N0cy9oLWkzODZ2NDogIEFkZCAnI2RlZmluZSBIQVZFX1BST0NGUycuICBNb3ZlCisJJyNpbmNsdWRlICJmb3Blbi1zYW1lLmgiJyB0byBlbmQgb2YgZmlsZSB0byBtYXRjaCBvdGhlciBoLSogZmlsZXMuCisKK0ZyaSBEZWMgMjAgMTI6MDY6MTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuICBBZGQgY2FzZQorCSJ1bmtub3duIiBmb3IgdGFyZ2V0IHZlbmRvciBhbmQgaW5mZXIgc29tZSB0YXJnZXRzIGJhc2VkCisJb24gdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcgc3lzdGVtLgorCitXZWQgRGVjIDE4IDE3OjE3OjU5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGJmZC1pbi5oLCBsaWJhb3V0Lmg6ICBBTlNJZnkgZW51bXMuCisKK1dlZCBEZWMgMTggMTY6MTI6MjUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAobm9ybWFsaXplKTogY3JlYXRlZCB2ZXJzaW9uIGZvciBWTVMgd2hpY2ggcmVtb3ZlcyB0aGUKKwlWTVMgZGlyZWN0b3J5IGNyYXAgZnJvbSB0aGUgZnJvbnQgYW5kIGVuZCBvZiBhIGZpbGVuYW1lLCBlZyB0dXJuCisJWy0uZm9vXWJhci5vYmo7MTIzIGludG8gYmFyLm9iagorCShiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBub3cgd3JpdGVzIGluZGV4IGludG8gYW4KKwlleHRlbmRlZCBuYW1lIHRhYmxlIGluIGRlY2ltYWwgLSB0aGUgc2FtZSBiYXNlIHVzZWQgdG8gcmVhZCBhbgorCWV4dGVuZGVkIG5hbWUgdGFibGUuCisKK1dlZCBEZWMgMTggMTQ6NDA6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGFvdXQtZW5jYXAuYzogIEZpeCB0byB1c2UgYW91dC10YXJnZXQuaC4KKwkqIGFvdXRmMS5oOiAgVXNlIHN0YW5kYXJkIE1ZX29iamVjdF9wIGFuZCBNWV9jYWxsYmFjaworCWluIGFvdXQtdGFyZ2V0LmguICBSZW1vdmUgdGFyZ2V0LXNwZWNpZmljIHZlcnNpb25zLgorCSogaG9zdC1hb3V0LmM6ICBSZS13cml0ZSB0byB1c2UgYW91dC10YXJnZXQuaC4KKwkqIGdlbi1hb3V0LmM6ICBOZXcgZmlsZXMgdXNlIHdpdGggaG9zdC1hb3V0LmMgdG8gZ2VuZXJhdGUKKwlob3N0LXNwZWNpZmljIGEub3V0LXJlbGF0ZWQgcGFyYW1ldGVycy4KKwkqIE1ha2VmaWxlLmluOiAgaG9zdC1hb3V0Lm8gZGVwZW5kcyBvbiBhb3V0LXBhcmFtcy5oLCB3aGljaCBpcworCWdlbmVyYXRlZCBieSBnZW4tYW91dC4KKwkqIGFvdXQtdGFyZ2V0Lmg6ICBNYWtlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUuCisJKiBsaWJhb3V0LmgsIGFvdXQtdGFyZ2V0Lmg6ICBSZW1vdmVkIFdPUktfT1VUX0ZJTEVfUE9TVElPTlMKKwltYWNyby4gIEluc3RlYWQsIGlubGluZSBpdCBpbiBhb3V0LXRhcmdldC5oLgorCSogbmV3c29zMy5jOiAgRGVmaW5lIE5fU0hBUkVEX0xJQih4KSBhcyAwIHRvIGF2b2lkCisJYSBnY2MgLVdhbGwgd2FybmluZy4KKwkqIGFyY2hpdmUuYzogIEFkZCBtaXNzaW5nIGNvbW1hcyBpbiBERUZVTiBtYWNybyAoMiBwbGFjZXMpLgorCSogZWxmLmMsIGNvZmZjb2RlLmgsIGFvdXRmMS5oOiAgVXNlIEFOU0kgZnVuY3Rpb25zIGluc3RlYWQgb2YKKwlCZXJrZWxleSBvbmVzLCBub3cgdGhhdCBsaWJpYmVydHkgaGFzIHRoZW06CisJYmNvcHktPm1lbWNweSwgYnplcm8tPm1lbXNldCwgYmNtcC0+bWVtY21wLgorCSogYW91dHguaDogIFZhcmlvdXMgdG91Y2gtdXBzOiAgUmUtZm9ybWF0dGluZywgZml4IGEgY2FzdCwKKwlyZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCitUdWUgRGVjIDE3IDE5OjQ4OjU5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBlbGYuYyAoZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBFbmNsb3NlIGNvcmVuYW1lCisJYW5kIGV4ZWNuYW1lIGluc2lkZSBIQVZFX1BST0NGUyBpZmRlZiBzaW5jZSB0aGV5IGFyZSB1bnVzZWQKKwl3aGVuIGl0IGlzIG5vdCBkZWZpbmVkLgorCitNb24gRGVjIDE2IDEyOjAwOjEwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBlbGYuYzogIEZsYWcgYWxsIHNlY3Rpb25zIGFzIGVpdGhlciBjb2RlIG9yIGRhdGEuICBXZSBjYW4ndAorCWJlIHN1cmUgd2hhdCB0aGV5IGFyZSBhbnl3YXksIHNpbmNlIEVMRiBkb2Vzbid0IGZpdCB0aGUKKwl0cmFkaXRpb25hbCBtb2RlbCBvZiB0ZXh0K2RhdGErYnNzIHZlcnkgd2VsbC4gIEFkZCBuZXcgbG9jYWwKKwlmdW5jdGlvbiBlbGZfcmVhZCgpIHRvIHNpbXBsaWZ5IGNvZGUuICBSZWNvcmQgZW50cnkgcG9pbnQgaW4KKwl0aGUgYmZkIHN0cnVjdHVyZS4KKworVGh1IERlYyAxMiAyMTowMToyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaG9zdHMvaC0qLmg6ICBDb25maWd1cmUgZm9wZW4gdXNpbmcgLi4vaW5jbHVkZS9mb3Blbi0qLmgKKwlyYXRoZXIgdGhhbiBOIGNvcGllcyBvZiB0aGUgc2FtZSBsaW5lcy4KKworV2VkIERlYyAxMSAxNjozOTo0NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY3B1LWg4MzAwLmM6IGRpc2Fzc2VtYmxlIGJyYW5jaCBkaXNwbGFjZW1lbnRzIGNvcnJlY3RseQorCSogY29mZi1oODMwMC5jOiBwdXQgcmVsb2Mgb2Zmc2V0cyBvdXQgaW4gMzJiaXRzCisKKwkqIG1ha2VmaWxlLmRvcywgY29uZmlnZGouYmF0OiBOZXcgZmlsZXMgZnJvbSBESgorCSogY2FjaGUuYzogZm9wZW4gd2l0aCBuZXcgbWFjcm9zIGlzIG5lZWRlZCBmb3IgRE9TLgorCSogaWVlZS5jOiBlbnZpcm9uIHJlbmFtZWQgdG8gZW52aSB0byBzdG9wIGFuIGluY2x1ZGUgZmlsZQorCWNvbmZsaWN0LgorCSogb3BuY2xzLmMsIGNvZmYtcnM2MDAwLmM6IG1vcmUgZm9wZW5zIHdpdGggbWFjcm9zLgorCitUdWUgRGVjIDEwIDA0OjA3OjI0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitTYXQgRGVjICA3IDE2OjM5OjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJICogTWFrZWZpbGUuaW46IGZpeCB3aGVyZSBkb2NkaXIgbGl2ZXMKKworCSAqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGNhY2hlLmMsIGNvZmYtbTg4ay5jLAorCSBjb2ZmY29kZS5oLCBjb3JlLmMsIGN0b3IuYywgZWxmLmMsIGZvcm1hdC5jLCBpZWVlLmMsIGluaXQuYywKKwkgbGliYmZkLmMsIGxpYmJmZC5oLCBsaWJjb2ZmLmgsIG9wbmNscy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsCisJIHNyZWMuYywgc3ltcy5jLCB0YXJnZXRzLmMgOiBhbGwgbmV3IGRvY3VtZW50YXRpb24gYW5kIGxpbnQKKwkgcmVtb3ZhbC4KKworCitTYXQgRGVjICA3IDA3OjIyOjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oLCBzcmVjLmM6ICBMaW50LgorCitGcmkgRGVjICA2IDIyOjU4OjQ4IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluc3RhbGwgdXNpbmcgSU5TVEFMTF9EQVRBLCBhZGRlZCBzdGFuZGFyZHMudGV4dAorCSAgc3VwcG9ydC4KKworCSogY29uZmlndXJlLmluOiBtYXJrIGRpcmVjdG9yeSBhcyB0YXJnZXQgZGVwZW5kZW50LiAgY29uZmlndXJlCisJICBub3dzIHdvcmtzIGluIG9iamRpciBhbHdheXMgc28gbWFrZSBmaWxlIGV4aXN0ZW5jZSBjaGVja3MKKwkgIGFnYWluc3QgJHtzcmNkaXJ9LgorCitUaHUgRGVjICA1IDIyOjQ2OjE5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cworCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgorCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KKworV2VkIERlYyAgNCAxMDoxNDoxNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmggKHN1bm9zXzxzaXplPl9vYmplY3RfcCwgc3Vub3M0X2NhbGxiYWNrKTogbW92ZWQgdGhlCisJY29tcHV0YXRpb24gb2YgYXJjaCBhbmQgbWFjaGluZSB0eXBlIHNvIGl0J3Mgd29ya2VkIG91dCBiZWZvcmUKKwlzb21lX2FvdXRfb2JqZWN0X3AgaXMgY2FsbGVkLgorCSogYW91dHguaDogKHNvbWVfYW91dF9vYmplY3RfcCk6IGRvbid0IHNldCBhcmNoIGFuZCBtYWNoIHRvCisJdW5rbm93bi4KKwkqIGFyY2h1cmVzLmM6IGFkZCBleHRyYSBmaWVsZCAnc2VjdGlvbl9hbGlnbl9wb3dlcicgdG8gaG9sZAorCWRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgaW4gb2JqZWN0IGZpbGVzLgorCSogY3B1LWEyOWsuYywgY3B1LWg4MzAwLmMsIGNwdS1pMzg2LmMsIGNwdS1pOTYwLmMsIGNwdS1tNjhrLmMsCisJY3B1LW04OGsuYywgY3B1LW1pcHMuYywgY3B1LXJzNjAwMC5jLCBjcHUtc3BhcmMuYywgY3B1LXZheC5jOgorCWluaXRpYWxpemUgdGhlIG5ldyBmaWVsZC4KKwkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiByZXBsYWNlIHRoZSB0ZXh0IHNpemUsIHNpbmNlIGFvdXQKKwlmcmllcyB0aGVtLgorCSogYW91dHguaDogRG9jdW1lbnRhdGlvbiBpbiB0aGUgbmV3IHN0eWxlCisKK1dlZCBEZWMgIDQgMDI6MDA6MzAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGJmZC5jIChiZmRfZ2V0X210aW1lKTogIERvbid0IGNhY2hlIG10aW1lIGFueSBtb3JlOyBvbmx5CisJdXNlIHRoZSBzYXZlZCB2YWx1ZSBpZiBtdGltZV9zZXQgaXMgYWxyZWFkeSBzZXQgKGludGVuZGVkCisJZm9yIGFyY2hpdmUgZmlsZXMsIHRob3VnaCBhcHBhcmVudGx5IG5vdCB1c2VkIHlldCkuCisKK1R1ZSBEZWMgIDMgMjI6NTQ6NTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHRhcmdldHMuYzogIFJldmlzZSBjb21tZW50cyBhYm91dCBob3cgdG8gY29uZmlndXJlIHRoZSB0YXJnZXQKKwl2ZWN0b3IsIHRvIG1hdGNoIHJlYWxpdHkuICBSZW1vdmUgbWVudGlvbiBvZiBvYnNvbGV0ZSBtZXRob2RzLgorCVJlbW92ZSBsb25nIGxpc3RzIG9mIGNhcGl0YWxpemVkIG1hY3JvcyB0aGF0IHR1cm4gaW50byB0aGUgc2FtZQorCXRoaW5nIGluIGxvd2VyY2FzZS4gIE5vcm1hbCB2ZWN0b3Igc2ltcGx5IGxpc3RzIGFsbCBrbm93bgorCWxvd2VyY2FzZSB4dmVjIG5hbWVzOyBhbGwgb3RoZXIgY2FzZXMgYXJlIGhhbmRsZWQgYnkgU0VMRUNUX1ZFQ1MuCisKKwkqIGNvbmZpZy9tdC1pMzg2LWNvZmY6ICBTZXQgREVGQVVMVF9WRUNUT1IgdG8gcmVhbCBpZGVudGlmaWVyLAorCW5vdCBtYWNybyBuYW1lLgorCisJKiBjb25maWcvbXQtaTk2MC17Y29mZixib3V0fTogIFVzZSBTRUxFQ1RfVkVDUyB0byBtYWtlIGEgc2hvcnQKKwlsaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXRzLgorCitUdWUgRGVjICAzIDE0OjA2OjE1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6ICBUaGUgcGFkIGJ5dGUgc29tZXRpbWVzIGFkZGVkIHRvCisJdGhlIHN0cmluZyB0YWJsZSBpbiBhIF9fLlNZTURFRiBtZW1iZXIgaXMgbm93CisJY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUuCisJVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCByYW5saWIsIGFzIHdlbGwgYXMgU3VuJ3MuCisKK1R1ZSBEZWMgIDMgMTA6NTM6MzAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIHNyZWMuYzogUmV3cm90ZSB0byBmaXggbWFueSBidWdzOyBub3cgZ2V0cyB0aGUgcmVjb3JkIHR5cGUKKwlyaWdodCwgZG9lc24ndCBjaG9rZSBvbiBpbnB1dCwgc2V0cyB0aGUgc3RhcnQgYWRkcmVzcyBpbiBhbiBTOSBhbmQKKwlmaWxscyBpbiB0aGUgZmlsZW5hbWUgb24gYW4gUzAuCisKK1NhdCBOb3YgMzAgMjE6MTk6MTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNwdS1oODMwMC5jOiBBZGQgc3VwcG9ydCBmb3IgTUVNSU5EIGFkZHJlc3NpbmcgbW9kZQorCisJKiBjb2ZmLWEyOWsuYzogZGVmaW5lZCBSRUxPQ19QUk9DRVNTSU5HIHRvIHRha2UgdGhlICNpZmRlZiBvdXQgb2YKKwljb2ZmY29kZS5oCisJKiBjb2ZmY29kZS5oOiB1c2UgdGhlIG5ldyBtYWNybyBpZiBhdmFpbGFibGUKKworCSogZWxmLmMgKGVsZl9jb3JlZmlsZV9ub3RlKTogY2FzdCBtYWxsb2MgdG8gYXZvaWQgd2FybmluZy4KKwkqIE1ha2VmaWxlLmluOiBGaXhlZCBkZXBlbmRlbmNpZXMgZHVlIHRvIGZpbGUgcmVuYW1lCisKKwkqIGFvdXQtZW5jYXAuYywgYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLWEyOWsuYywKKwljb2ZmLWg4MzAwLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLAorCWNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jLCBjcHUtaDMwMC5jLCBlbGYuYywgaTM4NmFvdXQuYywKKwluZXdvczMuYywgc3RhYi1zeW1zLmMsIHN5bXMuYzogQWxsIHRoZXNlIGZpbGVzIGhhdmUgaGFkIHRoZWlyCisJI2luY2x1ZGVzIGFsdGVyZWQgdG8gcG9pbnQgdG8gdGhlIG5ldyBwbGFjZXMuCisKK0ZyaSBOb3YgMjkgMjA6MDQ6NDkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1pMzg2djQsIGNvbmZpZy9taC1pMzg2LWVsZiwgaG9zdHMvaC1pMzg2djQuaDogIE5ldyBmaWxlcy4KKworCSogY29uZmlndXJlLmluOiAgQWRkIHZlbmRvciAibmNyIiBhcyBzdXBwb3J0ZWQgcGVyLXRhcmdldCB2ZW5kb3IuCisJQWRkIHN2cjQgY2FzZSBmb3IgaTM4NiBwZXItaG9zdCBjYXNlLgorCisJKiBlbGYuYyAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgQWRkIG1pc3NpbmcgImJyZWFrIiB0bworCUVMRkRBVEEyTFNCIGNhc2VzLgorCitGcmkgTm92IDI5IDEyOjE2OjUxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiAgUmV0dXJuICdBJworCWZvciBzeW1ib2xzIHRoYXQgYXJlIGJvdGggYWJzb2x1dGUgYW5kIGdsb2JhbC4KKwkqIGFyY2hpdmUuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiAgUmV0dXJuIE5VTEwKKwlpZiBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSByZXR1cm5zIE5VTEwuCisKK1R1ZSBOb3YgMjYgMDk6MTA6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZGVkIGNvZmYtaDgzMDAKKwkqIGNvbmZpZ3VyZS5pbjogbm93IGg4IGlzIGEgY29mZiB0YXJnZXQKKwkqIGNwdS1oODMwMC5jOiBmaXggdmFyaW91cyBkaXNhc3NlbWJseSBwcm9ibGVtcworCSogbGliY29mZi5oOiB0b29rIG91dCBzb21lIGNvZGUgd2hpY2ggaGFzIGJlZW4gIzBlZCBmb3IgYSBsb25nCisJdGltZS4KKwkqIHRhcmdldHMuYzogYWRkZWQgaDggY29mZgorCSogY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jCisJYWRkZWQgbmV3IG1hY3JvIFJUWVBFMkhPV1RPIHRvIHRha2UgYSBsb2FkIG9mICNpZmRlZnMgb3V0IG9mCisJY29mZmNvZGUuaAorCSogY29mZmNvZGUuaDogU3RhcnRlZCB0byBjaGFuZ2UgdGhlIHdheSBtYWNoaW5lIGRlcGVuZGVuY2llcyBhcmUKKwloYW5kbGVkLCBmcm9tIHRoZSBuZXN0IG9mICNpZmRlZnMgdG8gbWFjcm9zIGRlZmluZWQgaW4gdGhlCisJaW5jbHVkaW5nIGNvZmYtPGZvbz4uYworCitGcmkgTm92IDIyIDA4OjExOjQyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IHRoZSBgZXhlY3V0YWJsZScgYml0CisJaWYgdGhlIGVudHJ5IHBvaW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgdGV4dCBzZWdtZW50LCBldmVuIGlmIHRoZQorCXRleHQgc2VnbWVudCBpcyBhdCBsb2NhdGlvbiAwLgorCisJKiBjb2ZmLW1pcHMuYywgY29mZmNvZGUuaDogIFBldGVyIFNjaGF1ZXIncyBwYXRjaCB0byBrbHVkZ2UgaW4KKwlub25zdGFuZGFyZCBNSVBTIHNlY3Rpb25zICgucmRhdGEsIC5zZGF0YSwgZXRjKS4KKworCSogYW91dHguaCwgYmZkLmMsIGNvZmZjb2RlLmgsIGllZWUuYywgb2FzeXMuYywgdGFyZ2V0cy5jOiBDT05TVCBsaW50LgorCSogbGliYmZkLWluLmgsIGxpYmJmZC5oLCBhb3V0eC5oLCBjb2ZmY29kZS5oLCBlbGYuYywgbGliYW91dC5oOgorCVJlbmFtZSBBTElHTiB0byBCRkRfQUxJR04gdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBCU0QgPHN5cy9wYXJhbS5oPi4KKwkqIGxpYmJmZC5jOiAgTGludC4KKwkqIGhvc3QtYW91dC5jLCB0cmFkLWNvcmUuYzogIEZpeCB3cml0ZV9hcm1hcCBwcm90b3R5cGVzLiAgTGludC4KKworVGh1IE5vdiAyMSAxOTo1Njo0MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogc3RhYi1zeW1zLmMsIHN5bXMuYzogIE1vdmVkIGJmZF9zdGFiX25hbWUoKSBhbmQgYmZkX3N0YWJfbmFtZXNbXQorCWZyb20gc3ltcy5jIHRvIG5ldyBmaWxlIHN0YWItc3ltcy5jLiAgQWxzbywgc2luY2UgR05VIGV4dGVuZGVkCisJdHlwZSBjb2RlcyBzdWNoIGFzIE5fU0VUVCBhcmUgbm8gbG9uZ2VyIGluIC4uL2luY2x1ZGUvc3RhYi5kZWYsCisJaW5jbHVkZSB0aGVtIG1hbnVhbGx5LgorCSogc3RhYi1zeW1zLmMsIGFvdXR4Lmg6IFJlbmFtZWQgYmZkX3N0YWJfbmFtZSgpIGFuZAorCWJmZF9zdGFiX25hbWVzW10gdG8gYW91dF9zdGFiX25hbWUoKSBhbmQgYW91dF9zdGFiX25hbWVzW10uCisJKiBsaWJhb3V0Lmg6IEFkZGVkIHByb3RvdHlwZSBmb3IgYW91dF9zdGFiX25hbWUoKS4KKwkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIE1ha2VmaWxlIGZvciBuZXcgc3RhYi1zeW1zLltjb10uCisKK1RodSBOb3YgMjEgMTE6NTA6NDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGxpYmFvdXQuaCAoV09SS19PVVRfRklMRV9QT1NJVElPTlMpOiAgT25lIG1vcmUgdHJ5IGF0IHRoaXMKKwlyYXRoZXIgY29tcGxpY2F0ZWQgc2VlbWluZyBwcm9ibGVtLiAgRWxpbWluYXRlIExPR0lDQUxfIHZlcnNpb25zLAorCWp1c3QgbWFrZSBOX1hYWCB3b3JrIGJ5IGV4Y2x1ZGluZyB0aGUgaGVhZGVyIGZyb20gdGhlIHRleHQgc2VnbWVudC4KKwkqIGFvdXR4Lmg6ICBGaXggY29tbWVudHMgdG8gbWF0Y2guCisKK1R1ZSBOb3YgMTkgMTg6NDk6MDEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGxpYmFvdXQuaCAoV09SS19PVVRfRklMRV9QT1NJVElPTlMpOiAgVXNlIG5ldyBMT0dJQ0FMX1RYVEFERFIsCisJTE9HSUNBTF9UWFRPRkYsIExPR0lDQUxfVFhUU0laRSBtYWNyb3MgdG8gZmlndXJlIG91dCBudW1iZXJzCisJZm9yIHRoZSAibG9naWNhbCIgdGV4dCBzZWdtZW50IChpLmUuIG5ldmVyIGNvbnNpZGVyIHRoZSBleGVjCisJaGVhZGVyIHRvIGJlIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCkuICBUaGlzIGNoYW5nZSBpcworCW5lZWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB2YXJpb3VzIG90aGVyIHBhcnRzIG9mIGJmZCBhbmQgbGQuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc29lX2FvdXRfb2JqZWN0X3ApKTogIEZpeCBjb21tZW50LAorCWFuZCBtb3ZlIGNhbGN1bGF0aW9uIG9mIG9ial90ZXh0c2VjKGFiZmQpLT5zaXplIHRvIGxpYmFvdXQuaC4KKwkqIGJmZC1pbi5oOiAgUmVtb3ZlZCBib2d1cyAnOycuCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIE1JTklNSVpFIGZsYWcgdG8gc2VsZWN0IGxlYW4KKwlvciBibG9hdGVkIHRhcmdldF92ZWN0b3IuCisJKiB0YXJnZXRzLmM6ICBVc2UgbmV3IE1JTklNSVpFIG1hY3JvLCBhbmQgYWRkIHRyYWRfY29yZSBpZiBuZWVkZWQuCisJKiBuZXdzb3MzLmM6ICBGaXhlcyB0byAuLi9pbmNsdWRlL2FvdXQ2NC5oIHJlbW92ZSBuZWVkCisJZm9yIHNwZWNpYWwgTl9UWFRPRkYgbWFjcm8sIGJ1dCByZXF1aXJlIE5fSEVBREVSX0lOX1RFWFQuCisKK01vbiBOb3YgMTggMTI6MDA6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGFvdXQtdGFyZ2V0LmgsIGFvdXRmMS5oLCBuZXdzb3MzLmM6ICBNYWtlIGFvdXQtdGFyZ2V0LmgKKwloYW5kbGUgYm90aCBsaXR0bGUgYW5kIGJpZy1lbmRpYW4gdGFyZ2V0cywgd2l0aCBsaXR0bGUKKwl0aGUgZGVmYXVsdCB1bmxlc3MgVEFSR0VUX0lTX0JJR19FTkRJQU5fUCBpcyBkZWZpbmVkLgorCSogaG9zdC1hb3V0LmM6ICBBZGQgRklYTUUgbm90ZS4KKworU3VuIE5vdiAxNyAxMzoyOTozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0cy5jOiAgTWFrZSB0aGUgZGVmYXVsdCB0YXJnZXRfdmVjdG9yIGNvbnRhaW4KKwlqdXN0ICZERUZBVUxUX1ZFQ1RPUi4gIFRoaXMgbWFrZXMgZXhlY3V0YWJsZXMgYSBsb3Qgc21hbGxlci4KKwlPbGQgYmVoYXZpb3IgY2FuIGJlIGdvdHRlbiBieSBkZWZpbmluZyBBTExfVEFSR0VUUy4KKwkqIGFvdXRmMS5oLCBkZW1vNjQuYywgaTM4NmFvdXQuYywgbmV3c29zMy5jLCBzdW5vcy5jOgorCUZhY3RvcmVkIG91dCBjb21tb24gY29kZSBpbnRvIG5ldyBmaWxlIGFvdXQtdGFyZ2V0LmguCisJU2F2ZXMgYSBsb3Qgb2YgZHVwbGljYXRlIGNvZGUgZm9yIGEub3V0IHZhcmlhbnRzLgorCitGcmkgTm92IDE1IDEzOjAwOjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJR2V0ICdtYWtlIGhlYWRlcnMnIHRvIHdvcmsgd2hlbiBjb25maWd1cmVkIHdpdGggK3N1YmRpcnMuCisJKiBNYWtlZmlsZS5pbjogQWRkICQoc3ViZGlyKSB0byBkb2NkaXIgcGF0aC4KKwkqIGRvYy9NYWtlZmlsZS5pbiAocHJvdG9zKTogQWRkICQoc3JjZGlyKSBwcmVmaXgKKwl0byBuYW1lIG9mIHNlZCBzY3JpcHRzLgorCitUaHUgTm92IDE0IDE5OjQ5OjEwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6ICBGaXggdGhpbmtvLgorCSogc3ltcy5jIChiZmRfc3RhYl9uYW1lcyk6ICBUdXJuIG9uIG5ldyBHTlVfRVhUUkFfU1RBQlMgbWFjcm8KKwl0byBpbmNsdWRlIG5hbWVzIG9mIE5fU0VUVCBldGMuCisKK1RodSBOb3YgMTQgMTk6MTE6MTMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKyAgICAJKiBlbGYuYzogIEFkZCBtaW5pbWFsIHN1cHBvcnQgZm9yIEVMRiBzeW1ib2wgdGFibGVzLiAgR2VuZXJhdGVzCisJY2Fub25pY2FsIGJmZCBzeW1ib2wgdGFibGVzIGZyb20gRUxGIHN5bWJvbCB0YWJsZXMuICBDaGFuZ2UgdGhlCisJbmFtZSBvZiBzb21lIGZ1bmN0aW9ucyBmcm9tIGJmZF88bmFtZT4gdG8gZWxmXzxuYW1lPi4KKworCSogc3ltcy5jOiAgVHJpdmlhbCBmaXggdG8gY29tbWVudCB0byByZW1vdmUgYSByZWR1bmRhbnQgInRvIi4KKworV2VkIE5vdiAxMyAxNzowMjowMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29mZi17aTM4NixtNjhrLG04OGt9LmM6ICBDaGFuZ2UgbmFtZSBvZiBmaWxlIGZvcm1hdCB0byBzdGFuZGFyZAorCWZvcm0gdGhhdCBHREIgcmVjb2duaXplcyBhcyBDT0ZGLgorCitXZWQgTm92IDEzIDA5OjA5OjQxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCisKKwkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6ICBjYXN0IE5VTEwgY29ycmVjdGx5LgorCSogY29uZmlndXJlLmluOiBhZGRlZCBoYXJyaXMgaG9zdAorCisJKiBjb2ZmLWEyOWsuYzogTG90cyBvZiBjaGFuZ2VzLCBtb3N0IGZyb20gRGF2aWQgV29vZC4KKworVHVlIE5vdiAxMiAwNzoyMTo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29mZi1tODhrLmMgKGNvZmZfd3JpdGVfYXJtYXApOiAgSnVzdCAjdW5kZWYgaXQuCisKK01vbiBOb3YgMTEgMjA6MzA6MTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHN0YW5kYXJkaXplIG9uIE1JTlVTX0cgdG8gZGlzYWJsZSBkZWJ1Z2dpbmcKKwkqIGNvZmYtbTg4ay5jOiBjcmVhdGUgY29mZiBhcm1hcHMgaW5zdGVhZCBvZiBic2Qgb25lcy4KKwkqIG9wbmNscy5jIChiZmRfY2xvc2VfYWxsX2RvbmUpLCAoYmZkX2Nsb3NlKTogTWFzayBvdXQgcmFuZG9tIGJpdHMKKwl3aGVuIGNhbGxpbmcgY2htb2QuCisKK01vbiBOb3YgMTEgMTk6MDc6MzIgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGVsZi5jOiAgQWRkaXRpb25zIHRvIHN1cHBvcnQgRUxGIGZvcm1hdCBjb3JlIGZpbGVzLgorCSogY29uZmlnL21oLWFtaXg6ICBBZGQgLURIQVZFX1BST0NGUyB0byBIREVGSU5FUywgc2luY2UgaG9zdAorCWhhcyBzdXBwb3J0IGZvciAvcHJvYyAoYWxsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHBhcnRpY3VsYXIpLgorCitNb24gTm92IDExIDE4OjM2OjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogIEhhbmRsZSB0aGUgY2FzZQorCW9mIHR3byBOX1NPIHN0YWJzLCBvbmUgZm9yIGRpcmVjdG9yeSwgYW5kIG9uZSBmb3IgZmlsZW5hbWUuCisKKwkqIGJmZC1pbi5oIChwcmludF92bWEpOiAgRmFjdG9yIG91dCBkdXBsaWNhdGUgZGVmaW5pdGlvbi4KKworCUV4aXQgYSBsaXR0bGUgbW9yZSBncmFjZWZ1bGx5IHdoZW4gbWFsbG9jIHJldHVybnMgTlVMTC4KKwkqIGxpYmJmZC5jOiBOZXcgZnVuY3Rpb24gYmZkX3htYWxsb2MgKG1hbGxvYyB3cmFwcGVyKS4KKwkqIG9wbmNscy5jLCBzeW1zLmMsIGJvdXQuYywgYW91dHguaDogIFJlcGxhY2UgbWFsbG9jIGJ5IGJmZF94bWFsbG9jLgorCSogbGliYmZkLmg6IFJyZS1nZW5lcmF0ZWQgZHVlIHRvIGxpYmJmZC5jIHVwZGF0ZS4KKworU2F0IE5vdiAgOSAxMzo0NTowMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LW02OGstZWxmOiAgRGVmaW5lIERFRkFVTFRfVkVDVE9SIGFzIGVsZl9iaWdfdmVjLgorCisJKiBlbGYuYyAoZWxmX29iamVjdF9wKTogIERvbid0IHRyeSB0byBjcmVhdGUgYSBiZmQgc2VjdGlvbiBmb3IKKwl0aGUgZmlyc3QgRUxGIHNlY3Rpb24gaGVhZGVyLiAgSXQgaXMganVzdCBhIHBsYWNlaG9sZGVyLgorCitTYXQgTm92ICA5IDAzOjA0OjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmLXJzNjAwMC5jLCBjb25maWcvbWgtcnM2MDAwOiAgTWFrZSBpdCB3b3JrIG9uIGFyY2hpdmUgYW5kCisJY29yZSBmaWxlcywgd2hlbiBjb21waWxpbmcgbmF0aXZlLgorCSogaG9zdHMvaC1yczYwMDAuaDogIERlZmluZSBGQVNDSVNUX0ZET1BFTiBmb3IgYmZkX2Zkb3BlbnIuCisKKwlGSVhNRTogIFRoZSBhb3V0ZjEuaCBjaGFuZ2UgYmVsb3cgbmVlZHMgdG8gYmUgcmV2ZXJzZWQgYmFjaworCXRvIHRoZSB3YXkgaXQgd2FzLgorCitUaHUgTm92ICA3IDExOjAzOjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oOiBEZWZpbmVkIG5ldyBtYWNyb3MgW1BVVHxHRVRdTElORU5PX0xOTk8gZm9yCisJbWFuaXB1bGF0aW9uIG9mIGxubm8gZmllbGRzIGluIGxpbmVubyBzdHJ1Y3RzIGluIGEgY29mZi08Zj4uaAorCWluZGVwZW5kZW50IHdheS4gT3ZlcnJpZGUgaXQgaW4gY29mZi08Zj4uaCB0byB5b3VyIGZhdm91cml0ZQorCW51bWJlciBpZiB5b3UgZG9uJ3QgaGF2ZSBhIDE2Yml0IGxubm8gZmllbGQuIChjb2ZmX3N3YXBfbGluZW5vX2luKQorCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IG1vZGlmaWVkIHRvIHVzZSB0aGUgbmV3IG1hY3Jvcy4KKworTW9uIE5vdiAgNCAxMTozODozMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0ZjEuaCAoc3Vub3M0X2NhbGxiYWNrKTogTm93IGRlZmF1bHRzIHRvIDY4MDIwIHJhdGhlciB0aGFuCisJdW5rbm93biBhcmNoIHdoZW4gdGhlIG1hZ2ljIG51bWJlciBkb2Vzbid0IHNwZWNpZnkgdGhlCisJYXJjaGl0ZWN0dXJlLCBzaW5jZSBzb21lIE9TcyAoZWcgb2xkIHN1bjNzKSBkb24ndCBzZXQgdGhlIG51bWJlciwgYW5kCisJMDIwIGlzIHByb2JhYmx5IHRoZSByaWdodCBhbnN3ZXIgYW55d2F5LgorCitTdW4gTm92ICAzIDEyOjA3OjA4IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBob3N0cy9oLW5ld3MuaCwgaG9zdHMvaC1ydGJzZC5oOgorCUdldCByaWQgb2YgTUlTU0lOR19WRlBSSU5URiwgc2luY2UgbGliaWJlcnR5IHByb3ZpZGVzIG9uZS4KKwkqIGJmZC1pbi5oIChiZmRfcHJpbnRfc3ltYm9sX3R5cGVfaG9wdyBlbnVtKTogICBBZGQgbmV3IG9wdGlvbgorCWJmZF9wcmludF9zeW1ib2xfbm0sIGZvciB1c2UgYnkgbm0uCisJKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6ICBBZGQgY29kZSBmb3IgbmV3CisJYmZkX3ByaW50X3N5bWJvbF9ubSBvcHRpb24sIHRvIHByaW50IGluIG5tIGZvcm1hdC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfcHJpbnRfc3ltYm9sKSwgaWVlZS5jIChpZWVlX3ByaW50X3N5bWJvbCkKKwlvYXN5cy5jIChvYXN5c19wcmludF9zeW1ib2wpOiAgUHJvdmlkZSBzdHViIGltcGxlbWVudGF0aW9ucworCWZvciBiZmRfcHJpbnRfc3ltYm9sX25tLgorCSogc3ltcy5jOiAgTmV3IGZ1bmN0aW9uIGJmZF9kZWNvZGVfc3ltY2xhc3MsIHVzZWQgYnkgbm0gcHJpbnRlci4KKwlOZXcgZnVuY3Rpb24gYmZkX3N0YWJfbmFtZSB0byBsb29rIHVwIHN0cmluZyBuYW1lIG9mIHN0YWIgY29kZS4KKworU2F0IE5vdiAgMiAxNDoyNjowMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGRlZCBjdG9yLmMKKwkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KSBhZGRlZAorCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwLgorCSogY29mZmNvZGUuaDogcmVtb3ZlZCBhIGxvYWQgb2YgI2lmIDBlZCBjb2RlLgorCShjb2ZmX2NvbXB1dGVfZmlsZV9zZWN0aW9uX3Bvc2l0aW9ucyk6IG5vdyB3b3JrcyBvdXQgdGhlIHNlY3Rpb24KKwlhbGlnbm1lbnQgYW5kIHNpemUgY29ycmVjdGx5IGluIGFsbCBjYXNlcy4KKwkoY29mZl9nZXRfc3ltdGFiKTogbG9va3MgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgYW5kIGNhbGxzIHRoZQorCXJpZ2h0IGZ1bmN0aW9uIHdoZW4gdGhleSdyZSBmb3VuZC4gKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKToKKwlrbm93cyB3aGVuIGEgc2VjdGlvbiBpcyBmdWxsIG9mIGNvbnN0cnVjdG9ycyBhbmQgZG9lcyB0aGUgcmlnaHQKKwl0aGluZy4KKwkqIGNwdS1tODhrLmM6IEFkZGVkIGRlZmF1bHRfcmVsb2NfdHlwZSBsb29rdXAgdG8gdGhlIGFyY2hpdGVjdHVyZQorCWRlc2NyaXB0aW9uLgorCSogbGliYmZkLWluLmg6IChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCkgZGVmdW4gIGFkZGVkLgorCSogbGliY29mZi5oOiByZW1vdmVkICNpZiAwZWQgY29kZQorCSogcmVsb2MuYzogKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgYWRkZWQgQkZEX1JFTE9DX0NUT1IgZm9yCisJYXJjaCBpbmRlcGVuZGVudCBjb25zdHJ1Y3RvciByZWxvY2F0aW9uIHR5cGUuCisJKGJmZF9yZWxvY190eXBlX2xvb2t1cCk6IHJlbW92ZWQgdGhlIGNvbW1lbnQgInRoaXMgd2lsbCBnbyBhd2F5IgorCXNpbmNlIGl0IHdvbid0LiAoYmZkX2hvd3RvXzMyKTogc3RvbGVuIGZyb20gODhrLCB0aGlzIGlzIGEgMzJiaXQKKwlyZWxvYyB3aGljaCBpcyB1c2VkIHdoZW4gQkZEX1JFTE9DX0NUT1IgZmFsbHMgdGhyb3VnaCB0byBnaXZlIGEKKwlkZWZhdWx0IDMyYml0IHJlbG9jIGZvciBjb25zdHJ1Y3RvcnMuCisJKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogYWRkZWQuCisJKiBhb3V0ZjEuaDogZml4ZWQgU0VHTUVOVF9TSVpFIHR5cG8uCisKK1RodSBPY3QgMzEgMTg6MjM6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvZmYtcnM2MDAwLmM6ICBDaGFuZ2UgbmFtZSB0byAiYWl4Y29mZi1yczYwMDAiLCB0byBhdm9pZAorCW1hdGNoaW5nIHByZWZpeCAiY29mZiIuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6ICBIYW5kbGUKKwlycy82MDAwIGNzZWN0IHJlY29yZHMuCisKK1N1biBPY3QgMjcgMTY6NTY6NTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmLW04OGsuYywgdGFyZ2V0cy5jOiBjaGFuZ2UgbmFtZSBvZiBtODhrX2JjcyB0byBtODhrYmNzCisJKiBjb25maWd1cmUuaW46IGFkZCBtb3Rvcm9sYSBkZWx0YTg4IGNhc2VzCisJKiBsaWJiZmQuaCwgbGliYmZkLWluLmgsIGFyY2hpdmUuYywgaWVlZS5jLCBlbGYuYywgc3JlYy5jOiBmaXgKKwl3cml0ZV9hcm1hcCBwcm90b3R5cGUKKwkqIGxpYmJmZC5jOiBhZGQgZG9jIG9uIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50CisKK0ZyaSBPY3QgMjUgMDI6NDg6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIFJlbmFtZSBDT0ZGLXJlbGF0ZWQgZmlsZXMgaW4gYGNvZmYtQVJDSC5jJyBmb3JtLgorCWNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywKKwljb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYyB0byBiZSBleGFjdC4KKworCSogTWFrZWZpbGUuaW46ICBPbmx5IHN1cHBseSBUQVJHRVRfREVGQVVMVFMgdG8gdGFyZ2V0cy5jLCByZWR1Y2luZworCW1ha2Ugb3V0cHV0IGNsdXR0ZXIuCisJKiBjb25maWcvbXQtKjogIERpdHRvLgorCitUaHUgT2N0IDI0IDIyOjQwOjA3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJUlMvNjAwMCBzdXBwb3J0LCBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGj79G5nLVRo5W8gVvUsIGFuZAorCUpvaG4gR2lsbW9yZS4gIEFyY2hpdmUgc3VwcG9ydCBmcm9tIERhbW9uIEEuIFBlcm1lemVsLgorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBjcHUtcnM2MDAwLmMgYW5kIHJzNjAwMGNvZmYuYy4KKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCByczYwMDAgY2FzZS4KKwkqIHRhcmdldHMuYzogIEFkZCByczYwMDAgdmVjdG9yLgorCSogYXJjaHVyZXMuYzogIEFkZCByczYwMDAsIGZpeCBjb21tZW50IG9uIHJvbXAuCisJKiBiZmQtaW4uaCAoZW51bSBiZmRfZXJyb3IpOiAgQWRkIG5vX2RlYnVnX3NlY3Rpb24gZXJyb3IuCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogIFJlbW92ZSB1bnVzZWQgc3RyaW5nX3RhYmxlLgorCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogIEFkZCBub19kZWJ1Z19zZWN0aW9uIGVycm9yIG1lc3NhZ2UuCisJKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb24pOiAgUmV0dXJuIE5VTEwgb24gYXR0ZW1wdCB0byBjcmVhdGUKKwlhIHNlY3Rpb24gdHdpY2UuCisJKiBjb2ZmY29kZS5oIChiZmRfc3dhcF9yZWxvY19pbik6ICBIYW5kbGUgcl90eXBlIGFuZCByX3NpemUuCisJKGJmZF9zd2FwX2FvdXRoZHJfaW4pOiAgSGFuZGxlIGxvdHMgbW9yZSBtZW1iZXJzLgorCShtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiAgSWYgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sCisJanVzdCByZXR1cm4gZmFsc2UgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgaXQuCisJKGNvZmZfcmVhbF9vYmplY3RfcCk6ICBVbmRlcnN0YW5kIGluY29taW5nIG1hZ2ljIG51bWJlcnMuCisJKGNvZmZfc2V0X2ZsYWdzKTogIFVuZGVyc3RhbmQgb3V0Z29pbmcgbWFnaWMgbnVtYmVycy4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiAgb3V0Z29pbmcgYW91dGhkciBtYWdpYyAjLgorCShidWlsZF9kZWJ1Z19zZWN0aW9uKTogIEFkZCBmbiBmb3IgcmVhZGluZyBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KKwkoZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogIEhhbmRsZSBzeW1ib2wgbmFtZXMgaW4gZGVidWcgc3RyaW5nIHNlY3Rpb24uCisJUmVtb3ZlIHVudXNlZCBvYmpfc3RyaW5nX3RhYmxlLgorCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kbGUgcnM2MDAwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3Nlcy4KKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MsIE5fU0VUKik6ICBDaGVjayBmb3IKKwlleGlzdGluZyBzZWN0aW9uIGJlZm9yZSBtYWtpbmcgb25lLgorCSogY3B1LXJzNjAwMC5jOiAgTmV3IGZpbGUuCisJKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KKworVGh1IE9jdCAyNCAwMjowMzoyNCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZWxmLmM6IEFkZCBwYXJ0aWFsIHN1cHBvcnQgZm9yIEVMRiBmb3JtYXQgY29yZWZpbGVzLiBTdGlsbCBuZWVkcworCXN1cHBvcnQgZm9yIGV4dHJhY3RpbmcgcmVnaXN0ZXJzIGZyb20gY29yZWZpbGVzLgorCisJKiBjb25maWcvdC1tNjhrLWVsZjogIFNldCBERUZBVUxUX1ZFQ1RPUiB0byBlbGZfYmlnX3ZlYy4KKworCSogY29uZmlnL3toLWFtaXgsaC1kZ3V4LGgtaXJpeDMsaC11bHRyYTN9OiBGb3Igc3lzdGVtcyB3aGVyZQorCVJBTkxJQiBpcyBkZWZpbmVkIGFzIGVjaG8sIHNlbmQgdGhlIG91dHB1dCB0byAvZGV2L251bGwgdG8gaGVscAorCXJlZHVjZSBjbHV0dGVyIGluIHRoZSBvdXRwdXQgZnJvbSBkb2luZyBhIG1ha2UuCisKK01vbiBPY3QgMjEgMTc6NDg6NDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGhvc3RzL2gtdmF4dWx0Lmg6ICBSZW1vdmUgbWFsbG9jL2ZyZWUgZGVjbHMgY292ZXJlZCBpbiBzdGRsaWIuaC4KKwlGaXggSE9TVF9QQUdFX1NJWkUgYW5kIEhPU1RfU0VHTUVOVF9TSVpFLiAgRnJvbSBEYXZpZCBUYXlsb3IuCisKK01vbiBPY3QgMjEgMDk6MzQ6MTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBtYWtlIGl0IHBhZAorCXNlY3Rpb24gc2l6ZSBvdXQgaWYgdGhlcmUgYXJlIGFsaWdubWVudCByZXN0cmljdGlvbnMgc28gdGhhdCB0aGUKKwlpbWFnZSB3aWxsIGJlIG9rIG9uIGEgc3lzdGVtIHdoZXJlIHNlY3Rpb24gcG9zaXRpb25zIGFyZSB3b3JrZWQKKwlvdXQgYnkgYWNjdW11bGF0aW5nIHNpemVzIHJhdGhlciB0aGFuIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycy4KKwkqIHRhcmdldHMuYyAocHJvdG8gd3JpdGVfYXJtYXApLiBDaGFuZ2VkIG9ybF9jb3VudCB0byB1bnNpZ25lZC4KKwkqIG9wbmNscy5jIChiZmRfY2xvc2VfYWxsX2RvbmUpLiBBZGRlZCBzbyB0aGF0IGdlbmVyYXRpdmUKKwlwcm9ncmFtcyBsaWtlIGdhcyBjYW4gY2xvc2UgYSBiZmQgd2l0aG91dCBjYXVzaW5nIGJmZCBjb25mdXNpb24uCisJKiBsaWJiZmQuaCAoY2hhbmdlZCBiZWN1YXNlIG9mIHByb3RvcykKKwkqIGFtZGNvZmYuYzogbWVzc2VkIHdpdGggdGhlIHdheSB0aGF0IGptcCBkaXNwbGFjZW1lbnRzIGFyZQorCWNhbGN1YWxhdGVkLiBUaGlzIG1heSBub3QgeWV0IGJlIHRvdGFsbHkgY29ycmVjdC4KKwkqIGFyY2hpdmUuYyAoY29mZl93cml0ZV9hcm1hcCk6IHJld3JvdGUgdGhlIHdheSB0aGF0IHJhbmxpYnMgYXJlCisJd3JpdHRlbiBvdXQuCisJKiBjb2ZmY29kZS5oIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBub3cgZG9lc24ndCBjb3JlIGR1bXAgaWYgYSBub24KKwlhYnMgc3ltYm9sIGhhcyBubyBzZWN0aW9uIChsaWtlIGEgcmVnaXN0ZXIgc3ltYm9sKS4KKwkoY29mZl93cml0ZV9zeW1ib2wpIG5vdyB6ZXJvcyBhdXhlbnQgYmVmb3JlIGZpbGxpbmcgaXQgdXAgdG8gaGVscAorCXdpdGggc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucy4KKwkqIGxpYmJmZC5jIChiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCk6IGFkZGVkLgorCitXZWQgT2N0IDE2IDIyOjU4OjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBiZmQuYzogIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYSBtYWNybyBzdHJlcnJvcigpLgorCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIElmIEZBU0NJU1RfRkRPUEVOLCB1c2UgInIiLCBub3QgInIrIi4KKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6ICBTdXBwcmVzcworCWF0dGVtcHQgdG8gcmVjb3ZlciBjb21tYW5kLCBpZmRlZiBOT19DT1JFX0NPTU1BTkQuCisJKiBob3N0cy9oLXRhaG9lLmg6ICBBZGQgRkFTQ0lTVF9GRE9QRU4gYW5kIE5PX0NPUkVfQ09NTUFORDsKKwlyZXZhbXAgSE9TVF8qLCBldGMuCisJKiBob3N0cy9oLWkzODZ2Lmg6ICBVc2UgPHV0aW1lLmg+LCBub3QgPHN5cy91dGltZS5oPiwgdW5saWtlIFBPU0lYLgorCitXZWQgT2N0IDE2IDEyOjQzOjQ5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcmdtYXApOiBUaGUgc2l6ZSBvZiB0aGUgcmFubGliIHN0cnVjdHVyZXMKKwlzaG91bGQgbm90IGluY2x1ZGUgdGhlIHNpemUgZmllbGQgaXRzZWxmLgorCSogYW91dHguaCwgbGliYW91dC5oIChOQU1FKGFvdXQsIHNpemVvZl9oZWFkZXJzKSk6ICBVc2UKKwlhZGF0YShhYmZkKS0+ZXhlY19ieXRlc19zaXplIGZpZWxkIGluc3RlYWQgb2YgY29uc3RhbnQgbWFjcm8sCisJYmVjYXVzZSBhb3V0eC5oIGNvbXBpbGVzIHRvIGEgc2ltcGxlIC5vIGZpbGUgc2hhcmVkIGJ5CisJYWxsIDMyLWJpdHMgYS5vdXQgdGFyZ2V0cy4KKworV2VkIE9jdCAxNiAxMToxMTowNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQWxsb3cgaTM4Ni1zY28tc3lzdi4KKwkqIGJvdXQuYzogIFJlbW92ZSB1bnVzZWQgaTk2MF9hbGlnbjsgbGludCBkdW1teSBjb3JlIGZpbGUgaGFuZGxlcnMuCisJKiBjcHUtaDgzMDAuYzogIGxpbnQuCisKKwkqIGhvc3QtYW91dC5jOiAgTmV3IHN0cmF0ZWd5LiAgV2UgdXNlIGNvbW1vbiBjb2RlLCBpbmNsdWRlIGZpbGVzLAorCWFuZCBkYXRhIHN0cnVjdHVyZXMgdG8gaGFuZGxlIHRoZSBmaWxlLCBidXQgc2V0IGEgZmV3IHBhcmFtZXRlcnMKKwlmcm9tIHRoZSBob3N0J3MgY29uZmlnIGZpbGUgKHBhZ2Ugc2l6ZSwgdGV4dCBzdGFydCBhZGRyLCBldGMpLgorCSogbGliYW91dC5oOiAgRGVmaW5lIEhQIEJTRCBtYWNoaW5lIHR5cGVzLgorCSogYW91dGYxLmg6ICBIYW5kbGUgcmVhZGluZyBhLm91dHMgd2l0aCB0aGVzZSB0eXBlcy4KKworCSogdHJhZC1jb3JlLmM6ICBQYXNzIHRoZSB1LnVfYXIwIHZhbHVlIGFzIHRoZSBuZWdhdGl2ZSBvZiB0aGUKKwl2aXJ0dWFsLW1lbW9yeS1hZGRyZXNzIG9mIHRoZSAucmVnIHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IG1ha2UgYQorCXNlY3Rpb24gZm9yICJhbGwgdGhlIHJlZ3MgYW5kIG5vdGhpbmcgZWxzZSIgYmVjYXVzZSBvbmx5IEdEQiBrbm93cworCWV4YWN0bHkgd2hlcmUgdGhlIHJlZ3MgYXJlIChzY2F0dGVyZWQgYXJvdW5kIHRoZSB1cGFnZSBhbmQgc3RhY2spLgorCUNsZWFuIHVwIG1lbW9yeSBhbGxvY2F0aW9uLiAgUmVtb3ZlIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4KKwl2ZWN0b3JzLCByZXBsYWNlIHdpdGggc2luZ2xlIHZlY3RvcjsgdGhpcyBvbmx5IHJ1bnMgb24gdGhlIGhvc3QsCisJaW4gaG9zdCBieXRlIG9yZGVyLiAgUmVwbGFjZSBieXRlc3dhcCByb3V0aW5lcyB3aXRoIGFib3J0cyBpbiBjYXNlCisJYW55b25lIGNhbGxzIHRoZW0uCisJKiB0YXJnZXRzLmM6ICBUaGVyZSdzIG9ubHkgb25lIHRyYWRfY29yZV92ZWMgbm93LgorCSogYW91dGYxLmggKHN1bm9zX2NvcmVfZmlsZV9wKTogIFZNQSBvZiAucmVnKiBub3cgbmVlZHMgdG8gYmUgMC4KKworVHVlIE9jdCAxNSAwODoyOTowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaG9zdHMvaC1hbWl4LmggKGZyZWUpOiAgRml4IHByb3RvdHlwZS4KKworCSogYW91dHguaDogIERvbid0IHVzZSBOVUxMIGFzIGFuIGludGVnZXIsIGZvciBicmFpbmRlYWQgc3lzdGVtcworCXRoYXQgZGVjbGFyZSBpdCBhcyAodm9pZCAqKTAuICAoRnJvbSBQZXRlciBTY2hhdWVyLikKKworTW9uIE9jdCAxNCAxNzoyMDo0NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIEFkZCBwYXJlbnRoZXNlcyB0byBhdm9pZCByZXBvcnRlZAorCXByb2JsZW0gd2l0aCBiYWQgVWx0cml4IHN5c3RlbSBoZWFkZXJzLgorCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6ICBUcnkgdG8gaGFuZGxlIHRoZQorCXZhcmlvdXMga2luZHMgb2YgYWxpZ25tZW50cyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YKKwltYWdpYyBudW1iZXJzLgorCitNb24gT2N0IDE0IDE0OjIzOjEwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBkb2MvTWFrZWZpbGU6ICBEb24ndCBhc3N1bWUgLiBpcyBvbiB0aGUgcGF0aCAoZnJvbSBKYW1lcyBDbGFyaykuCisKK0ZyaSBPY3QgMTEgMjI6NDU6MTQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncy4KKwkqIHRhcmdldHMuYzogIERlY2xhcmUgdHJhZF9jb3JlIHZlY3RvcnMgZXh0ZXJuLgorCitGcmkgT2N0IDExIDEzOjAzOjAyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oOiBNb3ZlZCBBTElHTiBtYWNybyB0byBsaWJiZmQuaC4gUmVtb3ZlZCBpOTYwX2FsaWduLgorCSogbGliYmZkLmg6IE1vdmVkIEFMSUdOIG1hY3JvIGhlcmUuCisJKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogUmVwbGFjZSBpOTYwX2FsaWduIGJ5IGFsaWduX3Bvd2VyLgorCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6ICBBZGRlZCBmaWVsZHMgcGFnZV9zaXplLAorCXNlZ21lbnRfc2l6ZSBhbmQgZXhlY19ieXRlc19zaXplLiAgVGhlc2UgaGVscCBnZW5lcmljIGNvZGUKKwkoaW4gYW91dHguaCBhbmQgbGliYW91dC5oKSB0byBmaWd1cmUgb3V0IHdoZXJlIHRvIGFsaWduCisJdGhlIHZhcmlvdXMgc2VnbWVudHMgaW4gYSBkZW1hbmQgcGFnZWQgZmlsZS4KKwkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSKTogIFVzZSBuZXcgKHN0cnVjdCBhb3V0ZGF0YSkgZmllbGRzCisJdG8gZGVjaWRlIGlmIHRoZSBleGVjIGhlYWRlciBjb3VudHMgaW4gYV90ZXh0ICh0ZXh0IHNlZ21lbnQgc2l6ZSkuCisJQWxzbywgYXNzdW1lIERfUEFHRUQgZmxhZyBpcyBzZXQ7IGRvbid0IHNldCBpdCBoZXJlLgorCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IEFkZCBpbml0aWFsaXphdGlvbiBvZgorCWFkYXRhIGZpZWxkcyBwYWdlX3NpemUsIHNlZ21lbnRfc2l6ZSwgYW5kIGV4ZWNfYnl0ZXNfc2l6ZS4KKwkqIGhvc3QtYW91dC5jIChOQU1FKGhvc3RfYW91dCwgY2FsbGJhY2spIGFuZAorCU5BTUUoaG9zdF9hb3V0LG1rb2JqZWN0KTogRGl0dG8uCisJKiBpMzg2YW91dC5jIChhb3V0Mzg2X2NhbGxiYWNrKSBhbmQgbmV3IGFvdXQzODZfbWtvYmplY3QpOiBEaXR0by4KKwkqIG5ld29zMy5jIChuZXdzb3MzX2NhbGxiYWNrKSBhbmQgbmV3IG5ld3Nvc19ta29iamVjdCk6IERpdHRvLgorCSogYW91dGYxLmMgKHN1bm9zNF9jYWxsYmFjaykgYW5kIG5ldyBzdW5vc19ta29iamVjdCk6IERpdHRvLgorCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzdWJ0cmFjdAorCUVYRUNfQllURVNfU0laRSBmcm9tIHRoZSBhX3Rlc3Qgc2l6ZTsgdGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlCisJZm9yIHNvbWUgc3lzdGVtcyAobWFpbmx5IHN1bm9zKSwgc28gZG8gaXQgaW4gdGhlIGNhbGxiYWNrIGluc3RlYWQuCisJU2FtZSByb3V0aW5lOiBBZGQgc3R1ZmYgdG8gdGhlIFRISVNfSVNfT05MWV9ET0NVTUVOVEFUSU9OIGNvbW1lbnQuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgdGhlIHdheQorCWZpbGVwb3MgYW5kIHNpemUgb2Ygc2VjdGlvbnMgYXJlIGNhcnJpZWQgb3V0IHRvIHN1cHBvcnQKKwlvbGRlciBzdHlsZXMgb2YgZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLgorCisKK0ZyaSBPY3QgMTEgMTI6MzM6MzYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCisJKiBiZmQtaW4uaDogQWRkZWQgbW9yZSBtYWNyb3MgdG8gQ09GRl9TV0FQX1RBQkxFLgorCSogYmZkLmM6IEFkZGVkIG1hY3JvcyB0byBlbmFibGUgZ2FzIHRvIHN3YXAgY29mZiByZWNvcmRzLgorCSogY29mZmNvZGUuaDogTWFrZSB0aGUgY29mZl9zd2FwXypfb3V0IHJvdXRpbmVzIHJldHVybiB0aGUgbnVtYmVyCisJb2YgYnl0ZXMgc3dhcHBlZCwgYW5kIGNsZWFuZWQgdXAgdGhlaXIgcHJvdG90eXBlcy4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgZWJtb24vY29mZiBzdXBwb3J0CisJKiBlY29mZi5jOiBDaGFuZ2VkIG51bGwgZGVmaW5pdGlvbnMgb2YgY29mZl9zd2FwXypfb3V0IHRvIGNvbmZvcm0KKwl0byBuZXcgcHJvdG90eXBlcworCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgZW50cnkgcG9pbnRzIGZvciBjb2ZmIHN3YXBwaW5nCisKK0ZyaSBPY3QgMTEgMDM6MDE6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCisKKwkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCisJKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byBob3N0cy9oLXh4eC5oLgorCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgorCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCisJZ2V0IGRlZmluZWQgZmlyc3QuCisJKiBNYWtlZmlsZS5pbjogIFVzZSAtSS4gdG8gZ2V0IHN5c2RlcC5oLiAgUmVtb3ZlIHJlZnMgdG8KKwkuLi9pbmNsdWRlL3N5c2RlcC5oLgorCSogY3B1LWk5NjAuYzogIFN0cm5jbXAgbmVlZGVkIGEgbGVuZ3RoIGFyZy4KKwkqIGVjb2ZmLmM6ICBEb24ndCBldmVyIGNhbGwgdHJhZF91bml4X2NvcmVfZmlsZV9wIGZyb20gaGVyZS4KKwkqIGkzODZhb3V0LmM6ICBSZW1vdmUgZGVhZCBOX1RYVE9GRiBvdmVycmlkZS4KKwkqIHRyYWQtY29yZS5jOiAgRG9uJ3QgZGlzYWJsZSB0aGUgd2hvbGUgZmlsZSBpZiBTVU40X1NZUy4KKwkqIGNvbmZpZy86ICBSZW5hbWUgc29tZSBjb25maWcgZmlsZXMgdG8gbWF0Y2ggdXAgaC0qLmggbmFtZXMuCisJUmVtb3ZlIGFsbCB0aGUgSE9TVF9TWVMgZGVmaW5pdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGVzLgorCSogaG9zdHMvaC1hbWl4LmgsIGgtaTM4NnYuaDogIERlZmluZSBQT1NJWF9VVElNRSwgbm90IFVTRy4KKwkqIGhvc3RzL2gtaHA5MDAwLmg6ICBSZW1vdmUgVVNHIGNvbW1lbnQuCisJKiBob3N0cy9oLXJzNjAwMC5oOiAgSW5jbHVkZSA8c3RkbGliLmg+IGZvciBtYWxsb2MuCisJKiBob3N0cy9oLW5ld3MuaCwgaC1zcGFyYy02NC5oOiAgTmV3IGNvbmZpZyBmaWxlcyB0aGF0IGhhZAorCXByZXZpb3VzbHkgYmVlbiBrbHVkZ2VkIGluIHRoZSA8c3lzZGVwLmg+IGZpbGUuCisKK1RodSBPY3QgMTAgMTc6NTQ6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy8qOiAgdHJhZC1jb3JlIHN1cHBvcnQgaXMgSE9TVCBkZXBlbmRlbnQsIG5vdCB0YXJnZXQKKwlkZXBlbmRlbnQuICBUYXJnZXQgY29uZmlnIGZpbGVzIG9ubHkgc2V0IERFRkFVTFRfVkVDVE9SIGFuZC9vcgorCW90aGVyIHZlY3RvciBlbGVtZW50cy4gIEV4Y2VwdGlvbjogIHdoZW4gaG9zdC1hb3V0LmMgaXMgaW4gdXNlLAorCWluIHdoaWNoIGNhc2Ugd2UncmUgZm9yY2VkIHRvIGFzc3VtZSB3ZSdyZSBuYXRpdmUgKGhwLCB2YXgsCisJdGFob2UpLiAgUmVuYW1lIFhERVBGSUxFUyB0byBIREVQRklMRVMuCisJKiBNYWtlZmlsZS5pbjogIFJlbmFtZSBYREVQRklMRVMuCisJKiBjb25maWcvaC1zdW4qOiAgRG9uJ3QgZm9yY2Ugc3RhdGljIGxpbmtpbmcuCisJKiB0cmFkLWNvcmUuYzogIERvY3VtZW50IGhvdyB0byB1c2UgaXQgbm93YWRheXMuCisJKiBpMzg2YW91dC5jLCBuZXdzb3MzLmM6ICBDbGVhbiB1cC4KKwkqIGkzODZjb2ZmLmM6ICBBbGxvdyAzODYgY29mZiBmaWxlcyB0byBiZSB1c2VkIGFzIGNvcmUgZmlsZXMgdG9vCisJKGZvciByZWFkaW5nIGNvcmUgZmlsZXMgZnJvbSBlbWJlZGRlZCBzeXN0ZW1zKS4KKworVHVlIE9jdCAgOCAxNTozMDozOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogQWRkIGkzODZhb3V0LmMgZm9yIGEub3V0IHN1cHBvcnQgb24gdGhlIGkzODYuCisKK1R1ZSBPY3QgIDggMTI6MTg6NTQgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzogY29ycmVjdCBpbmZvLW5vZGUKKwlzdHJ1Y3R1cmUgaW4gKmRvYyogY29tbWVudHMuCisJZG9jL01ha2VmaWxlOiBzdG9wIGhpZGluZyBjb21wbGFpbnRzIGZyb20gbWFrZWluZm8uCisKK1N1biBPY3QgIDYgMTk6MTA6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKC4uLnNvbWVfYW91dF9vYmplY3RfcCk6ICBUYWtlIGEgdGhpcmQgcGFyYW1ldGVyLAorCXRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdCwgYW5kIGF2b2lkIGV2ZXIgbG9va2luZyBhdCBhbgorCWV4dGVybmFsX2V4ZWMuICBBbGwgY2FsbGVycyBjaGFuZ2VkIHRvIHJlYWQgdGhlIGVudGlyZQorCWV4dGVybmFsX2V4ZWMgc3RydWN0LCBzd2FwIGFuZCBjaGVjayBpdHMgbWFnaWMgbnVtYmVyLAorCXN3YXAgaW4gdGhlIHdob2xlIHN0cnVjdHVyZSwgYW5kIHBhc3MgdGhlIHN3YXBwZWQtaW4gdmVyc2lvbiB0bworCXNvbWVfYW91dF9vYmplY3RfcC4KKwkqIGJvdXQuYzogIEJyaW5nIGludG8gbW9kZXJuIGVyYS4gIFVzZSBzaW5nbGUgX29iamVjdF9wIHJvdXRpbmUKKwlmb3IgYmlnLSBhYW5kIGxpdHRsZS1lbmRpYW4uICBQcm92aWRlIGludGVybmFsIGFuZCBleHRlcm5hbAorCWV4ZWMgaGVhZGVyIHN0cnVjdHMuICBVc2Ugc2VwYXJhdGUgc3dhcC1pbiBhbmQgc3dhcC1vdXQgcm91dGluZXMuCisKKwkqIGxpYmFvdXQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgZnJvbSAuLi9pbmNsdWRlL2FvdXQ2NC5oCisJdG8gaGVyZS4gIEFkZCBvYmpfc3ltYm9sX2VudHJ5X3NpemUgdG8gc3RydWN0IGFvdXRkYXRhLgorCSogYW91dHguaCAoLi4uc29tZV9hb3V0X29iamVjdF9wKTogIFNldCBvYmpfc3ltYm9sX2VudHJ5X3NpemUuCisKKwkqIC4uL2luY2x1ZGUvYW91dDY0Lmg6ICBDaGFuZ2UgRVhURVJOQUxfTElTVF9TSVpFIHRvCisJRVhURVJOQUxfTkxJU1RfU0laRS4gIENhbGxlcnMgY2hhbmdlZC4KKworRnJpIE9jdCAgNCAxODoxODo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYmZkLmM6ICBSZW1vdmUgc3RyZXJyb3IoKSB0byBsaWJpYmVydHkuCisKKwkqIGVsZi5jOiAgUmVtb3ZlIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cywgdXNlIGdlbmVyaWMgb25lLiAgTGludC4KKwkqIGxpYmJmZC1pbi5oLCBsaWJiZmQuYzogIEFkZCBiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cy4KKwkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY197Z2V0LHNldH1fc2VjdGlvbl9jb250ZW50cyk6ICBDaGVjayB0aGF0CisJbGFzdCBieXRlIG9mIHRyYW5zZmVyLCBub3QgZmlyc3QgYnl0ZSwgaXMgd2l0aGluIHRoZSBzZWN0aW9uLgorCisJKiBob3N0LWFvdXQuYzogIFJlbW92ZSBgQlNEJyBhcmNoaXZlIHN1cHBvcnQuICBMaW50LgorCisJKiBhcmNodXJlcy5jOiBSZW5hbWUgYHN0cnVjdCBiZmRfYXJjaF9pbmZvX3N0cnVjdCcgdG8gYHN0cnVjdAorCWJmZF9hcmNoX2luZm8nLiAgUmVuYW1lIGB0eXBlZGVmIGJmZF9hcmNoX2luZm9fc3RydWN0X3R5cGUnIHRvCisJYGJmZF9hcmNoX2luZm9fdHlwZScuICBBbGwgdXNlcyBjaGFuZ2VkLgorCSogcmVsb2MuYzogIFJlbmFtZSBgYmZkX3JlbG9jX3N0YXR1c19lbnVtX3R5cGUnIHRvCisJYGJmZF9yZWxvY19zdGF0dXNfdHlwZScuICBSZW5hbWUgYGJmZF9yZWxvY19jb2RlX2VudW1fcmVhbF90eXBlJworCXRvIGBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUnLiAgKFRoaXMgc2VlbXMgdG8gYmUgYSBtaXNub21lciwKKwlpdCBuZWVkcyBhIGJldHRlciBuYW1lLikgIEFsbCB1c2VzIGNoYW5nZWQuCisJKiB0YXJnZXRzLmM6ICBSZW5hbWUgYGVudW0gdGFyZ2V0X2ZsYXZvdXJfZW51bScgdG8gYGVudW0KKwl0YXJnZXRfZmxhdm91cicsIGFuZCByZW1vdmUgdGhlIGBfZW51bScgZnJvbSBhbGwgb2YgdGhlIGVudW0KKwl2YWx1ZXMgdGhlbXNlbHZlcy4gIEFsbCB1c2VzIGNoYW5nZWQuCisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtaTM4Nm1hY2g6ICBpMzg2IG1hY2ggaG9zdC4KKwkqIGNvbmZpZy90LWkzODYtYW91dDogIFVzZSBob3N0LWFvdXQuYy4KKworCSogdHJhZC1jb3JlLmM6ICBHaXZlIGl0IGl0cyBvd24geHZlYydzIHRvIG1ha2UgaXQgaW5kZXBlbmRlbnQKKwlvZiBvdGhlciBmaWxlIGZvcm1hdHMuCisJKiBlY29mZi5jLCBob3N0LWFvdXQuYzogIFJlbW92ZSByZWZzIHRvIHRyYWQtY29yZS4KKwkqIGNvbmZpZy90LWRlYzMxMDAsIHQtaHAzMDBic2QsIHQtdGFob2UsIHQtdmF4OiAgRGVmaW5lIFRSQURfQ09SRS4KKwkqIHRhcmdldHMuYzogICNpZmRlZiBUUkFEX0NPUkUsIGluY2x1ZGUgaXQgaW4gdGhlIHZlY3Rvci4KKworRnJpIE9jdCAgNCAxNzozODowMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIHJlbG9jLmM6IEV4dGVuZGVkIE5FV0hPV1RPIG1hY3JvCisJKiBpZWVlLmM6IENoYW5nZWQgdGhlIHdheSA4Yml0IHBjcmVsIGlzIGRvbmUKKwkqIGNwdS1oODMwMC5jOiBnb3QgdGhlIHJlZ2lzdGVycyBpbiB0aGUgcmlnaHQgb3JkZXIKKworVGh1IE9jdCAgMyAxOTozOTo1NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYmZkLWluLmg6ICBlbnVtIGJvb2xlYW4gPT4gZW51bSBiZmRfYm9vbGVhbiBmb3IgU1ZSNC4gIEd1bWJ5J3MKKwlwcmVkaWN0aW9uIGlzIHZpbmRpY2F0ZWQhCisKKwkqIGJmZC1pbi5oLCBsaWJiZmQtaW4uaCwgZG9jL01ha2VmaWxlLCBkb2MvdG9saWJiZmQsIGRvYy9pbnRvYmZkOgorCVJlbW92ZSByZWZzIHRvIGhvd3RvLmMsIHNpbmNlIFN0ZXZlIGZvcmdvdC4KKworVGh1IE9jdCAgMyAwNzo0OToyMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIGVsZi5jOiB0b29rIHRoZSBhYm9ydCBvdXQgb2Ygc2V0X2FyY2hfbWFjaCBzbyB0aGF0IG9iamR1bXAgLWkgd2lsbAorCXN0aWxsIHdvcmsuIE5vdyBhbGxvd3MgYW55IGFyY2hpdGVjdHVyZS9tYWNoaW5lIHRvIGJlIHNldC4KKworV2VkIE9jdCAgMiAxMzo1MDozNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIGhvd3RvLmMgZGVsZXRlZCBhbmQgbW92ZWQgY29kZSB0byByZWxvYy5jCisKKwkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCByZW1vdmVkICRpZCBzdHVmZiBmb3IgcmVhbAorCisJKiBjcHUtaDgzMDAuYyBNYWRlIGl0IG1hdGNoIHZhcmlvdXMgZGlmZmVyZW50IHNwZWxsaW5ncyBvZiBoODMwMC4KKworCSogYXJjaHVyZXMuYzogVG9vayBvdXQgdGhlIGZpcnN0IGNoYXIgZmlsdGVyIHdoaWNoIG1hZGUgaXQgb25seQorCWxvb2sgZm9yIGEgY3B1L2FyY2ggbWF0Y2ggd2hlbiB0aGUgZmlyc3QgY2hhcnMgb2Ygc3VwcGxpZWQgYW5kCisJdGVzdGVkIG5hbWVzIHdlcmUgdGhlIHNhbWUuCisKKwkqIHRhcmdldHMuYyByZW1vdmVkIG9hc3lzIHN0dWZmLCBwZW5kaW5nIHNvbWVvbmUgdG8gZml4IHRoZSBidWdzCisJaW4gaXQuCisKKworVHVlIE9jdCAgMSAxMjoyOTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jLCBlbGYuYzogIEFkZCBwcmVsaW1pbmFyeQorCUVMRiBzdXBwb3J0IGdvb2QgZW5vdWdoIGZvciBHREIuCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWFtaXgsIGNvbmZpZy90LW02OGstZWxmOiAgSGFuZGxlCisJbTY4ay1jYm0tc3ZyNCBob3N0IGFuZCB0YXJnZXQuCisJKiBjb25maWcvdC1tNjhrLWNvZmYsIHQtbTg4ay1jb2ZmLCB0LW04OGstYW91dDogIE1ha2UgZmlsZXMgbm9uZW1wdHkKKwlzbyBgZGlmZicgYW5kIGBwYXRjaCcgY2FuIGNvcGUuCisKK1R1ZSBPY3QgIDEgMTE6MjQ6MzEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCisJKiBhcmNodXJlcy5jOiByZW1vdmVkIHRleGluZm8gZXJyb3IKKworCSogaW5pdC5jOiBhZGRlZCB0ZXhpbmZvIGhvb2tzLCBhbmQgcmVtb3ZlZCBpbml0aWFsaXphdGlvbiBlcnJvcgorCW1lc3NhZ2UuCisKKwkqIGxpYmNvZmYtaW4uaCwgbGliYmZkLWluLmggcmVtb3ZlZCAkaWQgZmllbGQgc28gY3ZzIGNhbiBtZXJnZQorCXdpdGhvdXQgY29tcGxhaW50cy4KKworVHVlIE9jdCAgMSAwNTowMjo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY3B1LWk5NjAuYzogIEF2b2lkIG51bWVyaWNhbCBjb3VudCBvZiBpbml0aWFsaXplcnMuCisKKwlWYXggVWx0cml4IGNoYW5nZXMgZnJvbSBEYXZpZCBUYXlsb3IgPHRheWxvckB0aGluay5jb20+OgorCSogaG9zdC1hb3V0LmM6ICBNYWtlIGxpdHRsZS1lbmRpYW4gdmVjdG9yIHJlYWxseSBsaXR0bGUtZW5kaWFuLgorCSogY29uZmlndXJlLmluOiAgU2VwYXJhdGUgdmF4IGFuZCB0YWhvZSBjYXNlcywgaGFuZGxlIHVsdHJpeC4KKwkqIGNvbmZpZy90LXZheDogIEFkZCB0cmFkLWNvcmUuby4KKwkqIGNvbmZpZy9oLXZheHVsdDogIE5ldyBob3N0IHN5c3RlbS4KKworTW9uIFNlcCAzMCAxNToxMzo0NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIGJmZC1pbi5oIFZFUlNJT04sIGNoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAwLjE4LCB0aGlzIG1ha2VzIGEKKwlnYXAsIGJ1dCBub3cgaXMgdGhlIHNhbWUgYXMgdGhlIGxpbmtlciB2ZXJzaW9uIG51bWJlci4KKworCSogY3B1LWEyOWsuYywgY3B1LWkzODYuYywgY3B1LW02OGsuYywgY3B1LW1pcHMuYywgY3B1LXZheC5jLAorCWNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBjcHUtbTg4ay5jLCBjcHUtc3BhcmMuYzogYWRkZWQuIFRoZXNlCisJZmlsZXMgd2lsbCBldmVudHVhbGx5IGNvbnRhaW4gcHJvY2Vzc29yIHNwZWNpZmljIGJpdHMgZm9yIGJmZCwKKwlsaWtlIHN0cmFuZ2UgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGlzL2Fzc2VtYmx5LiAgU28gZmFyIG9ubHkKKwl0aGUgSDggaGFzIGJlZW4gZXZlbiBwYXJ0aWFsbHkgZG9uZS4gIFRoaXMgd29yayBhbHNvIHRpZXMgaW4gd2l0aAorCXRoZSBjaGFuZ2UgaW4gaGFuZGxpbmcgYXJjaGl0ZWN0dXJlcy4KKworCSogYW1kY29mZi5jOiAoYTI5a19yZWxvYykgZml4IGVycm9yIG1lc3NhZ2UuCisKKwkqIGFvdXQtZjEuaDogKGNob29zZV9yZWxvY19zaXplKSBub3cgY2FsbHMgYmZkX2dldF9hcmNoIHRvCisJZGlzY292ZXIgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgYmZkLiAoc3Vub3M0X2NhbGxiYWNrKSBjYWxscyB0aGUKKwlmdW5jdGlvbiBiZmRfc2V0X2FyY2hfbWFjaCByYXRoZXIgdGhhbiBzdHVmZmluZyBzdHVmZiBkaXJlY3RseQorCWludG8gdGhlIGJmZC4gKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpLCBjaGFuZ2VkIG5hbWVzIG9mCisJYWNjZXNzb3IgZnVuY3Rpb25zLgorCisJKiBhb3V0eC5oOiAoc2V0X2FyY2hfbWFjaCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8KKwlzZXR1cCB0aGUgZW52aXJvbm1lbnQuCisKKwkqIGFyY2hpdmUuYzogKGJmZF9zbHVycF9jb2ZmX2FybWFwKSBjb2ZmIGFyY2hpdmVzIGFsd2F5cyBoYXZlIHRoZQorCWhlYWRlcnMgaW4gYmlnIGVuZGlhbiBmb3JtYXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUKKwlob3N0IG9yIHRhcmdldC4KKworCSogYXJjaHVyZXMuYzogdG90YWxseSBjaGFuZ2VkLiBOb3cgYW4gYXJjaGl0ZWN0dXJlIGlzIHJlcHJlc2VudGVkCisJd2l0aCBhIHBvaW50ZXIgdG8gYW4gaW5mbyBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gYW4gZW51bWVyYXRlZCB0eXBlCisJYW5kIGEgbG9uZy4gVGhlIG9sZCBpbmZvIGlzIGF2YWlsYWJsZSBhcyB0d28gZWxlbWVudHMgaW4gdGhlCisJc3RydWN0dXJlLiAgRnV0dXJlIGVuaGFuY2VtZW50cyB0byBhcmNoaXRlY3VyZSBzdXBwb3J0IHdpbGwKKwlpbnZvbHZlIHBvaW50ZXJzIHRvIG1ldGhvZHMgYmVpbmcgcGxhY2VkIGludG8gdGhlIGluZm8gc3RydWN0dXJlLgorCisJKiBiZmQuYzogY2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYmZkIHN0cnVjdHVyZSBmb3IgdGhlIG5ldworCWFyY2hpdGVjdHVyZSBzdHVmZi4KKworCSogYm91dC5jOiAoYl9vdXRfc2V0X2FyY2hfbWFjaCkgY2hhbmdlZCB0byB1c2UgdGhlIG5ldworCWFyY2hpdGVjdHVyZSBtZWNoYW5pc20uCisKKwkqIGNvZmZjb2RlLmg6IChjb2ZmX3NldF9hcmNoX21hY2gsIGNvZmZfc2V0X2ZsYWdzKSBjaGFuZ2VkIHRvIHVzZQorCXRoZSBuZXcgYXJjaGl0ZWN0dXJlIG1lY2hhbmlzbS4KKworCSogY29uZmlndXJlLmluOiBhZGRlZCBoOCBzdHVmZi4KKworCSogaWVlZS5jOiB0b28gbWFueSBjaGFuZ2VzIHRvIG5vdGUuICBOb3cgaWVlZSBmaWxlcyB3cml0dGVuIHdpdGgKKwliZmQgZ2FzIGFuZCBsZCBjYW4gYmUgcmVhZCBieSBnbGQgYW5kIGllZWUgb25seSBsaW5rZXJzIGFuZAorCXNpbXVsYXRvcnMuCisKKwkqIGxpYmJmZC5jLCBsaWJiZmQuaDogY2hhbmdlZCBwcm90b3R5cGUgb2YgYmZkX3dyaXRlLgorCisJKiBuZXdzb3MzLmM6IChuZXdvczNfY2FsbGJhY2spIG5vdyBjYWxscyBiZmRfc2V0X2FyY2hfbWFjaCByYXRoZXIKKwl0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgorCisJKiBvYXN5cy5jOiAob2FzeXNfb2JqZWN0X3ApIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIHJhdGhlcgorCXRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCisKKwkqIG9wbmNscy5jOiAobmV3X2JmZCkgbWFrZXMgc3VyZSB0aGF0IGJmZF9pbml0IGhhcyBiZWVuIGNhbGxlZAorCWJlZm9yZSBvcGVuaW5nIGEgYmZkLgorCisJKiBzcmVjLmM6IChzcmVjX3NldF9hcmNoX21hY2gpIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCisJcmF0aGVyIHRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCisKKwkqIHRhcmdldHMuYzogKHRhcmdldF92ZWN0b3IpIG5vdyBieSBkZWZpbmluZyBTRUxFQ1RfVkVDUyAocGVyaGFwcworCWluIHRoZSB0L2htYWtlIGZpbGUpIGEgdXNlciBjYW4gc2VsZWN0IHdoaWNoIGJhY2tlbmRzIHRoZXkgd2FudAorCWxpbmtlZCB3aXRoIGJmZCB3aXRob3V0IGNoYW5naW5nIHRoZSBzb3VyY2UuCisKKwkqIGluaXQuYzogbmV3LCBsb29rcyBhZnRlciBpbml0aWFsaXppbmcgbW9kdWxlcy4KKworCSogaG93dG8uYzogZm9yIGZ1dHVyZSB1c2UsIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gd29yayBvdXQKKwl3aGF0IGNvb2tpZSB0byB1c2UgYXMgYSBoYW5kbGUgb24gYSByZWxjb2F0aW8gaG93dG8uCisKK01vbiBTZXAgMzAgMTM6MzE6MTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHNyZWMuYzogIEJldHRlciBlcnJvciBjaGVja2luZywgcGFydGx5IGZyb20gUGV0ZXIgU2NoYXVlci4KKwkoc3JlY19vYmplY3RfcCk6ICBBdm9pZCBhc3N1bWluZyBhbnkgZmlsZSB0aGF0IHN0YXJ0cyB3aXRoICdTJyBpcworCWFuIFMtcmVjb3JkIGZpbGUhICAoQ2hlY2sgZm9yIDMgdXBwZXJjYXNlLWhleCBkaWdpdHMgYWZ0ZXIgaXQuKQorCShJU0hFWCk6ICBEZWZpbmUgbmV3IG1hY3JvIGZvciBjaGVja2luZyBzdXBwb3NlZGx5IGhleCBjaGFyYWN0ZXJzLgorCShwYXNzX292ZXIpOiAgVHJlYXQgYXMgRU9GIGFueSBTLXJlY29yZCBsaW5lIHRoYXQ6CisJICAgICogIGRvZXNuJ3QgaGF2ZSBoZXggaW4gZWl0aGVyIHNpemUgY2hhcmFjdGVyCisJICAgICogIHByb2R1Y2VzIGEgc2l6ZSBsYXJnZXIgdGhhbiAweDdGCisJICAgICogIGhhcyBhbiB1bnJlY29nbml6ZWQgdHlwZSBudW1iZXIKKworVGh1IFNlcCAyNiAxNToyNzoyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmgsIGFvdXR4LmgsIGJvdXQuYywgY29mZmNvZGUuaCwgaG9zdC1hb3V0LmMsIG9hc3lzLmMsCisJb3BuY2xzLmM6ICBMaW50IChzYWJlciBhY3R1YWxseSkuCisKK1RodSBTZXAgMjYgMTE6MjQ6MjQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IFNldCBoZWFkZXIncyBhX3RleHQgZmllbGQgYWx3YXlzLgorCSogbmV3c29zMy5jOiBGaXhlZCB0d28gdHlwZXM6IG5ld29zMyAtPiBuZXdzb3MzLgorCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uCisJdG8gdXNlIGNvcnJlY3Qgc2VnbWVudC4KKworTW9uIFNlcCAyMyAxODoyNDozNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAocHJpbnRfc3ltYm9sKTogIEhhbmRsZSBtaXNzaW5nIHN5bWJvbC0+bmFtZS4KKworRnJpIFNlcCAyMCAxMjoyNjowMSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0ZjEuaCAoc3dhcGNvcmVfc3BhcmMpOiAgQ2hhbmdlIG5hbWUgb2YgVVNSU1RBQ0ssIGZpeCBjb21tZW50CisJYXQgdG9wIG9mIHJvdXRpbmUuCisKK1R1ZSBTZXAgMTcgMTc6MjM6NDkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogb2FzeXMuYywgY29uZmlndXJlLmluLCBjb25maWcvaC1pcml4MywgY29uZmlnL3QtaXJpeDM6CisJYWRkIHNnaS9pcml4IHN1cHBvcnQuCisKK1RodSBTZXAgMTIgMTQ6Mjk6MDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQ2hhbmdlcyBmb3IgdGhlIEFNRCAyOTAwMCBVbHRyYWNvbXB1dGVyIHBvcnQgZnJvbSBEYXZpZCBXb29kLgorCSh3b29kQG55dS5lZHUpLgorCisJKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgSGFuZGxlIE5PX0ZDTlRMLgorCisJKiBNYWtlZmlsZS5pbjogIE1ha2Ugc3ViZGlycyB3b3JrIGJ5IHVzaW5nICQoSU5DRElSKSBpbiB0aGUKKwljcnVkZSBkZXBlbmRlbmNpZXMuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6ICBQYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorCWN1cnJlbnQgZmlsZSdzIGNvZmYgc3ltYm9sIGZvcm1hdCB0byBCRkQgdmlhIHRoZSBjb2ZmX2RhdGEgc3RydWN0LgorCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogIG9ial9pY29mID0+IGNvZmZfZGF0YS4KKwkoY29mZl9zd2FwX3N5bV97aW4sb3V0fSk6ICBDaGVjayB0aGF0IFNZTU5NTEVOID09IEVfU1lNTk1MRU4uCisJKGNvZmZfc3dhcF9hdXhfe2luLG91dH0pOiAgQ2hlY2sgdGhhdCBGSUxOTUxFTiA9PSBFX0ZJTE5NTEVOCisJYW5kIERJTU5VTSA9PSBFX0RJTU5VTS4KKwkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBhMjlrLSotKiBob3N0cywgYW5kIHRhcmdldHMKKwlhMjlrLSotY29mZiwgYTI5ay0qLWFvdXQsIGFuZCBhMjlrLSotc3ltMS4KKwkqIGxpYmNvZmYtaW4uaDogIEFkZCBsb2NhbF9uX2J0bWFzaywgbG9jYWxfbl9idHNoZnQsCisJbG9jYWxfbl90bWFzaywgbG9jYWxfbl90c2hpZnQsIGxvY2FsX3N5bWVzeiwgbG9jYWxfYXV4ZXN6LAorCWxvY2FsX2xpbmVzeiB0byBgY29mZl9kYXRhJyAodGRhdGEpIHN0cnVjdC4KKwkoY29mZl9kYXRhLCBjb2ZmX2RhdGFfdHlwZSwgY29mZl90ZGF0YSk6ICBSZW5hbWUgc3RydWN0IGljb2ZkYXRhLgorCSogY29uZmlnL2gtdWx0cmEzOiAgSGFuZGxlIGEyOWstKi0qIGhvc3RzIGFzIFVsdHJhY29tcHV0ZXJzLgorCitUaHUgU2VwIDEyIDE0OjA3OjIyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogJChNQUtFKSBmb3IgbWFrZSwgJChkb2NkaXIpIGZvciBkb2MKKwkqIGRvYy9NYWtlZmlsZTogcmVkdW5kYW50IGRlcGVuZGVuY2llcyBmb3IgU3VuLW1ha2UgVlBBVEggYnVnCisKK1R1ZSBTZXAgMTAgMjA6MzQ6MTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBhb3V0ZjEuaCAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlbGVhc2UgdGhlIHJpZ2h0IHN0b3JhZ2UgaW4KKwllcnJvciBjYXNlLgorCShzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEZpeCBoZWFkZXIgY29tcGFyaXNvbi4KKwkqIGFvdXR4Lmg6ICBBdm9pZCBzaGlmdHMgb2YgMzIgYml0cywgdW5kZWZpbmVkIGluIEMuICBMaW50LgorCSogYm91dC5jLCBpY29mZi5jLCBpZWVlLmMsIGxpYmJmZC5jLCBvYXN5cy5jOiAgZ2NjIC1PIC1XIGxpbnQuCisKK1dlZCBTZXAgIDQgMDA6NDQ6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQWxsb3cgR0RCIHRvIHBhdGNoIG9iamVjdCBmaWxlcy4KKworCSogYW91dGYxLmggKHN1bm9zX2NvcmVfZmlsZV9wKTogIFNldCBTRUNfSEFTX0NPTlRFTlRTIG9uIGFsbCBzZWN0aW9ucy4KKwkqIHRyYWQtY29yZS5oICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgRGl0dG8uCisJKiBhb3V0eC5oIChhb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogIE9uIGZpcnN0IG91dHB1dCwgY2hlY2sKKwlhYmZkLT5kaXJlY3Rpb24gYW5kIGNvbXBsYWluIGlmIGVycm9uZW91cy4KKworCSogTWFrZWZpbGUuaW46ICBBZGQgY3J1ZGUgZGVwZW5kZW5jaWVzLgorCitUdWUgU2VwICAzIDEzOjQ2OjE5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy8qIGFvdXR4LmggY29uZmlndXJlKiBzaG9ydGVuZWQgYWxsIHRoZSBoL3RtYWtlLXh4eHgKKwl0byBoL3QteHh4eCBmaWxlcyBzbyB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCB3b3JrIG9uIFN5c3RlbSBWLgorCitGcmkgQXVnIDIzIDEzOjUxOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYW91dHguaDogIEFkZCBpbmZvcm1hdGlvbiBvbiBob3N0LWFvdXQuYyBhbmQgaG93IHRvIGNvbmZpZ3VyZQorCXRvIHVzZSBpdCwgdG8gdGhlIG1hbnVhbC4KKwkqIGNvbmZpZ3VyZS5pbjogIFRpeCB0eXBvLgorCSogZWNvZmYuYzogIElmIGNvbXBpbGluZyBmb3IgREVDMzEwMCwgdXNlIHRyYWRfdW5peCBjb3JlIGZpbGVzLAorCWVsc2UgZHVtbXkgb3V0IHRoZSBjb3JlIGZpbGUgc3VwcG9ydC4KKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgSWYgSE9TVF9EQVRBX1NUQVJUX0FERFIgaXMKKwlzcGVjaWZpZWQsIHVzZSBpdCB0byBsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbi4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfc3ltYm9scyk6ICBEZWNsYXJlIGJ1ZmZlciBhcyBiZmRfYnl0ZXMKKwlyYXRoZXIgdGhhbiBhcyBjaGFycyAobGludCkuCisKK1RodSBBdWcgMjIgMjI6MjA6MTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmgsIGNvZmZjb2RlLmg6ICBzYWJlcml6ZWQuCisKK1RodSBBdWcgMjIgMTE6Mjc6MDYgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGJmZC50ZXhpbmZvOiBzb21lIGNsZWFudXAsIHJlaW5jb3Jwb3JhdGVkIG1vcmUgaW50cm8gbWF0dGVyIGZyb20KKwliZmQuZG9jCisJYmZkLmMsIHRhcmdldHMuYzogbWlub3IgcmV3b3JkaW5nIG9mIGRvYyBzZWdtZW50cworCisKK1dlZCBBdWcgMjEgMTk6MTM6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIFVzZSBIT1NUX1RFWFRfU1RBUlRfQUREUiwKKwlldGMsIHJhdGhlciB0aGFuIFRFWFRfU1RBUlRfQUREUi4KKwkqIGhvc3QtYW91dC5jOiAgUmVtb3ZlICNpZiAwIGFyb3VuZCB3aG9sZSB0aGluZy4KKwlVcGRhdGUgdG8gbW9kZXJuICgzMi82NC1iaXQpIGEub3V0IG5hbWluZyBjb252ZW50aW9ucy4KKwlJbmNsdWRlIGEgbGFyZ2UgY2h1bmsgb2YgLi4vaW5jbHVkZS9hLm91dC5nbnUuaCB0byBnZXQgbWFjcm9zIHRoYXQKKwlhcmUgbm90IGRlZmluZWQgYnkgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzLgorCShob3N0X2FvdXRfezMyLDY0fV93cml0ZV9vYmplY3RfY29udGVudHMpOiAgVXNlIHRoZSBXUklURV9IRUFERVJTCisJbWFjcm8gdXNlZCBieSB0aGUgb3RoZXIgYS5vdXQgaW1wbGVtZW50YXRpb25zLgorCSogTWFrZWZpbGUuaW46ICBHaXZlIGRlcGVuZGVuY2llcyB0byBPUFRJT05BTF9CQUNLRU5EUy4KKworV2VkIEF1ZyAyMSAxNDozMzowNiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHVzZSB0YXJnZXRzICJiZmQuZHZpIiBhbmQgImJmZC5wcyIgaW5zdGVhZCBvZgorCXRleGRvYyBhbmQgcHNkb2M7IG1ha2UgdGhlc2UgZGVwZW5kIG9uIGdlbmVyYXRlZCAudGV4aSdzCisKKwkqIHNjYW5pdCwgKG5ldykgdW5QUk9UTzogdHVybiBQUk9UTyBtYWNyb3MgaW50byBBTlNJIGRlY2xhcmF0aW9ucyBpbgorCWRvYworCisJKiBiZmQuYywgcmVsb2MuYywgc3ltcy5jOiBtaW5vciBzcGVsbGluZy93b3JkaW5nIGZpeGVzIGluIGRvYworCXBvcnRpb25zCisKKwkqIE1ha2VmaWxlLmluLCBhd2tzY2FuLWlwLCBhd2tzY2FuLXAsIGludG9iZmQsCisJbGliYmZkLmgsIGxpYmNvZmYuaCwgdG9saWJjb2ZmOyBuZXcgYmZkLWluLmgsIGxpYmJmZC1pbi5oLAorCWxpYmNvZmYtaW4uaDogKGEpIHVzZSBzZXBhcmF0ZSBmaWxlcyBmb3IgaW52YXJpYW50IHBhcnRzIG9mIGJmZC5oLAorCWxpYmJmZC5oLCBhbmQgbGliY29mZi5oOyAoYikgaW4gZ2VuZXJhdGVkIHBhcnRzIG9mIHNhbWUsIHVzZSBsZXNzCisJb2J0cnVzaXZlIG1hcmtzIGluZGljYXRpbmcgLmMgb3JpZ2lucy4KKworCSogYmZkLnRleGluZm86IGdlbmVyYWxpemUgbW9zdCByZWZlcmVuY2VzIHRvIGxpbmtlcgorCitUdWUgQXVnIDIwIDE1OjE4OjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogaW5jbHVkZSBjb3JlLnAgaW4gUFJPVE9TIChidWlsZGluZyBiZXR0ZXIgYmZkLmgpCisJKiBhcmNodXJlcy5jOiByZW1vdmUgZW1wdHkgZm9vKCkgZGVmaW5pdGlvbiAoY3JlcHQgaW4gYXQgdm4xLjkpCisKK01vbiBBdWcgMTkgMTM6NDg6MjIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGJmZC50ZXhpbmZvOiB1c2UgQHNldGNoYXB0ZXJuZXdwYWdlIG9uIGluc3RlYWQgb2YgbG90cyBvZgorCUBwYWdlJ3M7IG1pbm9yIHJlcGhyYXNpbmcgaW4gSW50cm9kdWN0aW9uLgorCisJKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBiZmQudGV4aW5mbywgY2FjaGUuYywKKwljb2ZmY29kZS5oLCBjb3JlLmMsIGZvcm1hdC5jLCBpZWVlLmMsIGxpYmJmZC5jLCBsaWJiZmQuaCwgbGliY29mZi5oLAorCW9hc3lzLmMsIG9wbmNscy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jIChkb2N1bWVudGF0aW9uCisJc2VnbWVudHMpOiB1c2VkIEJGRCAoY2FwcykgbW9yZSBjb25zaXN0ZW50bHkgYXMgYSBuYW1lIGluCisJZGlzY291cnNlLCBmaXhlZCBhIGZldyBvdGhlciBtaW5vciB0eXBvcyBhbmQgdXNlcyBvZiBmb250cworCisKK1RodSBBdWcgIDggMTY6NDc6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaDogZml4ZWQgYnVnIHdoZXJlIHN0cmluZyB0YWJsZSBzaXplIHdhc24ndCBiZWluZyBzd2FwcGVkLgorCitUaHUgQXVnICAxIDE2OjM1OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHNlY3Rpb24uYzogYWRkZWQgU0VDX0NPTlNUUlVDVE9SX1RFWFR8REFUQXxCU1MgZmxhZ3MKKworCSogc3ltcy5jOiBhZGRlZCBCU0ZfQ09OU1RSVUNUT1IsIEJTRl9XQVJOSU5HIGFuZCBCU0ZfSU5ESVJFQ1QKKwlmbGFncy4gKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpIG5vdyBrbm93cyB3aGF0IHRvIGRvIHdpdGggdGhlCisJYWJvdmUgZmxhZ3MuCisKKwkqIGFvdXR4Lmg6IG1hZGUgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyBhbmQKKwl0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyBwcm9kdWNlIHRoZSBhYm92ZSBmbGFncy4KKworCitXZWQgSnVsIDMxIDA5OjUzOjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYWxsIGZpbGVzOiAgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzIGZvciBHUEwgdmVyc2lvbiAyLgorCUluc3RhbGwgaGVhZGVyIGNvbW1lbnRzIGFuZCBhdHRyaWJ1dGUgbW9zdCBtb2R1bGVzIHRvIHRoZWlyCisJYXV0aG9ycy4gIEJGRCdzIG5hbWUgaXMgbm93IG9mZmljaWFsbHkgIkJpbmFyeSBGaWxlIERlc2NyaXB0b3IiLAorCXNvIHJlbW92ZSBhbnkgY29uZmxpY3RpbmcgcGVqb3JhdGl2ZXMuCisJYXJjaHVyZXMuaDogIENvbnNpc3RzIHNvbGVseSBvZiBjb21tZW50czsgcmVtb3ZlIGl0LgorCitGcmkgSnVsIDI2IDE4OjExOjM0IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBiZmQuYzogTWFkZSBpdCBjb21waWxlIGFnYWluLgorCitGcmkgSnVsIDE5IDA4OjE3OjA5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIG5ld3NvczMuYywgdGFyZ2V0cy5jLCBjb2ZmY29kZS5oOiBuZXcgcGF0Y2hlcyBmcm9tIERhdmlkIFdvb2QKKworCitNb24gSnVsIDE1IDE2OjI3OjQyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGFvdXRmMS5oIGFyY2hpdmUuYyBiZmQuYyBjb2ZmY29kZS5oIGNvcmUuYyBlY29mZi5jIGllZWUuYworCWJmZC50ZXhpbmZvIG9hc3lzLmMgb3BuY2xzLmMgcmVsb2MuYyBzcmVjLmM6IE1vcmUgZG9jdW1lbnRhdGlvbiBvbgorCWxpbnQgZml4ZXMuCisKKwkqIGFtZGNvZmYuYyBiZmQudGV4aW5mbyBNYWtlZmlsZS5pbiA6IEZvbGRlZCBpbiBjaGFuZ2VzIGZvciBhbWQKKwkyOWsgY29mZiBieSBEYXZpZCBXb29kICh3b29kQGxhYi51bHRyYS5ueXUuZWR1KS4KKworVGh1IEp1bCAgNCAwOTo1MzoxNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBFdmVyeXRoaW5nOiBjcmVhdGVkIHNvbWUgbmV3IGZpbGVzLCBjb3JlLmMgZm9ybWF0LmMsIHJlbG9jLmMsCisJc2VjdGlvbi5jIGFuZCBzeW1zLmMgdG8gc3BsaXQgdGhlIGZ1bmN0aW9uYWxpdHkgYSBiaXQgYmV0dGVyLgorCUNsZWFuZWQgdXAgdGhlIHJlc3Qgb2YgdGhlIGZpbGVzIGEgYml0LCBhbmQgYWRkZWQgc29tZQorCWRvY3VtZW50YXRpb24uCisKKworTW9uIEp1bCAgMSAxMzoyOTo0NyAxOTkxICBEYXZpZCBXb29kICh3b29kIGF0IGRhdmlkLnVsdHJhLm55YS5lZHUpCisKKwkqIG9wbmNscy5jLCAuLi9pbmNsdWRlL3N5cy9oLXN1bjMuaCAuLi9pbmNsdWRlL3N5cy9oLXN1bjQuaDogZmNudGwKKwlyZWFsbHkgdGFrZXMgMyBhcmd1bWVudHMsIHBhdGNoZWQgY29kZSBhbmQgYW1tZW5kZWQgcHJvdG90eXBlcy4KKworRnJpIEp1biAxNCAxMzoxOTo0MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiAuLi9pbmNsdWRlL2JmZC5oIChzdHJ1Y3QgYmZkX3RhcmdldCk6IEFkZGVkIG5ldyBmaWVsZAorCSJhbGlnbl9wb3dlcl9taW4iIHdoaWNoIGNvbnRhaW5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBmb3IgYQorCXNlY3Rpb24uIFRoaXMgaXMgdXNlZCBpbiBjb2ZmX25ld19zZWN0aW9uX2hvb2suIFRoZSBmaWVsZAorCWluc2VydGlvbiBuZWNlc3NpdGF0ZXMgYW4gdXBkYXRlIG9mIGFsbCBiYWNrZW5kcy4uCisKKwkqIGFvdXRmMS5oIGp1bXAgdGFibGUgZmllbGQgaW5zZXJ0ZWQKKworCSogYXJjaGl2ZS5jKHNuYXJmX2FyX2hkcikoYmZkX3NsdXJwX2NvZmZfYXJtYXApIGNhbiBub3cgcGFyc2UgZGd1eCBzdHlsZSBleHRlbmRlZAorCWZpbGVuYW1lcyB0b28uCisKKwkqIGJvdXQuYyhiX291dF9zcXVpcnRfb3V0X3JlbG9jcykgZml4IHRvIGFzc2VydGlvbiB0ZXN0cy4gSnVtcAorCXRhYmxlIGZpZWxkIGluc2VydGVkLgorCisJKiBjb2ZmY29kZS5oKGp1c3QgYWJvdXQgZXZlcnl0aGluZykgTm93IHBhdGNoZXMgdXAgc3ltYm9sIHRhYmxlcworCXVzaW5nIGEgZGlmZmVyZW50IG1lY2hhbmlzbS4gVGhlIEludGVsIG1ham9yIGJ1ZyBoYXMgYmVlbiBmaXhlZCwKKwlhbmQgdGhlIGxpbmtlciBjYW4gc2VsZiBob3N0IG9uIHRoZSBBdmlpb24gYW5kIGJlIGRlYnVnZ2VkIHdpdGgKKwlnZGIuCisKKwkqIGVjb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCBpMzg2Y29mZi5jOiBuZXcKKwlpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCAgaWNvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUKKwlwYXRjaCwgaWVlZS5jOiBjYW4gbm93IHJlYWQgYXJjaGl2ZXMgY29udGFpbmluZyBpZWVlIG1vZHVsZXMuLAorCWxpYmNvZmYuaDogYWRkZWQgKGNvbWJpbmVkX2VudHJ5X3R5cGUpLCBsaWJpZWVlLmg6IHVwZWQgbWF4CisJc2VjdGlvbnMgdG8gMjAsIG02OGtjb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLAorCW04OGtiY3MuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsIG9hc3lzLmM6IHZhcmlvdXMgYnVncworCWZpeGVkLiBvcG5jbHMuYzogYWRkZWQgYmZkX2FsbG9jX2dyb3cgYW5kIGJmZF9hbGxvY19maW5pc2guCisJc3JlYy5jOiBqdW1wIHRhYmxlIHBhdGNoLiB0cmFkLWNvZGUuYyBmaXhlZCAjSUYgdHlwZW8KKworRnJpIEp1biAgNyAxMjozNTo0NiAxOTkxICBTZWFuIEZhZ2FuICAoc2VmIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisgCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IGFkZGVkIGVsc2UgY2FzZSB0byBkZWFsIHdpdGgKKyAJZmlsZW5hbWVzIGxlc3MgdGhhbiA5IGNoYXJhY3RlcnMuCisKKworVGh1IEp1biAgNiAxODoyNzozOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiAuLi9pbmNsdWRlL29hc3lzLmggb2FzeXMuYyAob2FzeXNfYXJjaGl2ZV9wKTogZml4ZWQgc28gaXQgd29ya3MKKworCSogc3JlYy5jOiBub3cgYWxsb3dzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMgdG8gYmUgY3JlYXRlZCBpbiBhCisJZmlsZS4gT3V0cHV0cyBhZGRyZXNzZXMgb2YgdGhlIHJpZ2h0IGxlbmd0aC4KKworVGh1IE1heSAzMCAxNTozMDoxMCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBiZmQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IEZpeGVkIHByb2JsZW0gd2hlcmUgd2hlbiBhIGRlZmF1bHRlZAorCXRhcmdldCBkaWRuJ3QgbWF0Y2gsIHRoZSBmb3JtYXQgZ290IHNldCB0byB0aGUgYXR0ZW1wdGVkIG1hdGNoLAorCWJyZWFraW5nIGEgZnV0dXJlIHRlc3QuCisKKyAgICAgICAgKi4uL2luY2x1ZGUvaTM4NmNvZmYuaCA6IGZpeGVkIHR5cG8gaW4gdHlwZSBmaWVsZCB3aXRoIHNpemUKKworCSogaTM4NmNvZmYuYyBpY29mZi5jIG04OGstYmNzLmMgZWNvZmYuYyAuLi9pbmNsdWRlL2JmZC5oIDogQWRkZWQKKwlzdXBwb3J0IGluIHRoZSBqdW1wIHRhYmxlIGZvciB0aGUgc3dhcHBpbmcgcm91dGluZXMgZXhwb3J0ZWQgdG8KKwlnZGIuIE5vdyBnZGIgd29ya3Mgd2l0aCB0aGUgMzg2LgorCitUdWUgTWF5IDI4IDE3OjIxOjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGdkYi0zLjk1IHJlbGVhc2UuCisJTWFrZWZpbGUuaW46ICBBbGxvdyBobWFrZSBhbmQgdG1ha2UgZmlsZXMgdG8gYWRkIE9GSUxFUy4KKwlhb3V0ZjEuaDoKKwliZmQuYzogIHN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4gIFdoZW4KKwlzZWFyY2hpbmcsIHRha2UgZGVmYXVsdCB0YXJnZXQgaW4gcHJlZmVyZW5jZSB0byBvdGhlcnMuCisJYmZkLmRvYzogIHR5cG9zCisJaWVlZS5jLCBvYXN5cy5jOiAgQXZvaWQgdXNpbmcgdGhlICJ0ZGF0YSIgbWFjcm9zIGxlZnQgb2YgYXNzaWdubWVudC4KKwlsaWJhLm91dC5oOiAgRG9uJ3QgaGFyZC1jb2RlIGZpbGUgb2Zmc2V0czsgdXNlIE5fIG1hY3JvcyBmb3IgdGhlbS4KKwlsaWJiZmQuaDogIFN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4KKwlvcG5jbHMuYzogIFN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4KKwl0YXJnZXRzLmM6ICBTZWFyY2ggaXMgc2hvcnQtY2lyY3VpdGVkIGlmIGRlZmF1bHQgdGFyZ2V0IG1hdGNoZXMuCisJbGlib2FzeXMuYywgbGliaWVlZS5jOiAgVW5kbyBib3RobmVyIGNoYW5nZXMgdGhhdCBtYWtlIG1hY3JvcworCXdvcmsgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCwgYnV0IHdoaWNoIGRlcGVuZCBvbiB0aGUKKwlyZXByZXNlbnRhdGlvbnMgb2YgZGlmZmVyZW50IHBvaW50ZXIgdHlwZXMgYmVpbmcgdGhlIHNhbWUuCisKK0ZyaSBNYXkgMjQgMTg6NTY6NTIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogaTM4NmNvZmYuYzogY3JlYXRlZC4KKwkqIGNvZmZjb2RlLmg6IGFkZGVkIHN1cHBvcnQgZm9yIDM4Ni4KKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdXBwb3J0IGZvciAzODYuCisJKiAuLi9pbmNsdWRlL2kzODZjb2ZmLmg6IGNyZWF0ZWQKKworV2VkIE1heSAyMiAwNzoyNjozOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oOiByZW1vdmVkIGFsbCBwdXRfeF88c2l6ZXM+CisJKiBsaWJiZmQuYzogQ2hhbmdlZCAjaWZkZWYgX19HTlVDX18gdG8gI2lmZGVmIEhPU1RfNjRfQklULCBBZGRlZAorCURFRlVOUworCisKK1R1ZSBNYXkgMjEgMDg6NTg6NTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKwkoYm90aG5lcikKKwkqIG9wbmNscy5jOiBDaGFuZ2VkIG9ic3RhY2tfY2h1bmtfYWxsb2MgdXNlIHhtYWxsb2MKKworTW9uIE1heSAyMCAxNzoxMjoxNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBldmVyeXRoaW5nOiBSZW1vdmVkIHN5c2RlcC5oIGZyb20gYmZkLmggYW5kIHB1dCBiYWNrIGludG8gZmlsZXMKKwlmcm9tIHdoaWNoIGl0IHdhcyBzcGxpdCBvdXQuIE5vdyA2NCBiaXQgdmVyc2lvbiBpcyBidWlsdCB3aXRoIGEKKwktREhPU1RfNjRfQklUPSJsb25nIGxvbmciIG9uIHRoZSBjb21waWxlIGxpbmUuCisKK0ZyaSBNYXkgMTcgMTk6MzU6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCUNoYW5nZWQgYWxsIHRoZSBbZ2V0fHB1dF1bbmFtZV0gcm91dGluZXMgdG8gdXNlICBbZ2V0fHB1dF1fW3NpemUKKwlpbiBieXRlc10uCisKKwlQdXQgaW4gc3VwcG9ydCBmb3IgNjQgYml0IHdvcmsuIE5vdyB0d28gdmVyc2lvbnMgb2YgYmZkIG1heSBiZQorCWdlbmVyYXRlZCwgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBvZiBUQVJHRVRfNjRfQklULCBvbmUgd2hpY2ggaXMKKwkzMiBiaXQgb25seSwgYW5kIG9uZSB3aGljaCBpcyA2NC8zMiBiaXRzLgorCUNyZWF0ZWQgbmV3IGJhY2sgZW5kICdkZW1vNjQnIHRvIHRlc3QgNjQgYml0IGZ1bmN0aW9uYWxpdHkuCisKKwlSZW5hbWVkIHNvbWUgZmlsZXMgdG8gd29yayBvbiBET1MuCisKKwkqIGFyY2hpdmUuYzogbGludCAqIGJmZC5jOiBwcm90b3R5cGVzIGFuZCBsaW50LiAqIGVjb2ZmLmM6IGFkZGVkCisJNjRiaXQgdHJhbnNmZXIgCSogaWNvZmYuYzogYWRkZWQgNjRiaXQgdHJhbnNmZXIgKiBpZWVlLmM6IG5hbWUKKwljaGFnZSwgNjQgYml0IHRyYW5zZmVyLiAqIGxpYmEub3V0Lmg6IFNwbGl0IG91dCBjb21tb24gY29kZSBmcm9tCisJc3Vub3MgYW5kIG5ld3NvcyBpbnRvIGxpYmEub3V0LiBOYW1lIGNoYW5nZXMgYW5kIHByb3RvdHlwZSBtb2RzLiAqCisJbGliYmZkLmM6IGxpbnQgYW5kIHByb3RvdHlwZXMsIGV4dHJhIDY0Yml0IHN3YXBzLiAqIGxpYmJmZC5oOgorCXByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuICogbGliY29mZi5oOiBsaW50ICogbGliaWVlZS5oOiBtYWtlCisJd29yayBvbiBET1MgKiBsaWJvYXN5cy5oOiBtYWtlIHdvcmsgb24gRE9TICogbTg4ay1iY3MuYzogTmFtZQorCWNoYW5nZSBhbmQgNjRiaXQgc3R1ZmYuKiBuZXdzb3MzLmM6IGNvbW1vbiBjb2RlIHJlbW92ZWQsIG5ldyBqdW1wCisJdGFibGUuICogb2FzeXMuYzogTmFtZSBjaGFuZ2UgKiBvcG5jbHMuYzogUG9ydGFiaWxpdHkgZml4ZXMgKgorCXNyZWMuYzogTmFtZSBjaGFuZ2VzICogc3Vub3MuYzogUmVtb3ZlZCBjb21vbiBjb2RlLiAqIHRhcmdldHMuYzoKKwlBZGRlZCBkZW1vICogYW91dDMyLCBhb3V0NjQuYyBpbmNsdWRlICBhb3V0eC5oICogYm91dC5jOiB1c2VkIHRvCisJYmUgY2FsbGVkIGIub3V0LmMgKiBjb2ZmY29kZS5oOiB1c2VkIHRvIGJlIGNhbGxlZCBjb2ZmLWNvZGUuaCwgbm93CisJNjRiaXQgaXplZC4gKiBkZW1vNjQuYzogNjQgYml0IGEub3V0IGJhY2sgZW5kCisKK1RodSBNYXkgMTYgMTY6MDI6MDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKwlmcm9tIGJvdGhuZXIKKyAJKiBsaWJpZWVlLmg6IE1ha2UgaWVlZV9kYXRhIGFuZCBpZWVlX2FyX2RhdGEgbWFjcm9zIHVzYWJsZQorCW9uIExIUyBvZiBhc3NpZ25tZW50LCBldmVuIHdoZW4gdXNpbmcgb2xkIGNvbXBpbGVycy4KKwkqIGxpYm9hc3lzLmg6IERpdHRvIGZvciBvYXN5c19kYXRhIGFuZCBvYXN5c19hcl9kYXRhLgorCSogbTY4a2NvZmYuYzogQWRkIGVudW0tdG8taW50IGNhc3RzIHRvIGFjY29tb2RhdGUgb2xkIGNvbXBpbGVycy4KKwkqIG5ld3NvczMuYzogRml4IGRlZmluaXRpb25zIG9mIFNFR01FTlRfU0laRSBhbmQgVEVYVF9TVEFSVF9BRERSLgorCSogb3BuY2xzLmM6IERlZmluZSBTX0lYVVNSLCBTX0lYR1JQLCBTX0lYT1RIIGlmIHVuZGVmaW5lZC4KKwkqIHRhcmdldHMuYzogQWRkIGRlY2xhcmF0aW9uIG9mIG5ld3NvczNfdmVjLgorCitNb24gTWF5IDEzIDEwOjAzOjI5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGFvdXQuYzogZml4eGVkIHNvbWUgb2YgdGhlIHByb2JsZW1zIHdpdGggZmlsZXBvcyBjYWxjdWxhdGlvbi4KKwkoc3dhcF9leHRfcmVsb2MpOiBmaXhlZCBwcm9ibGVtIHdpdGggY3JlYXRpb24gb2YgcmVsb2NzLgorCShhb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogZml4ZWQgZmlsZXBvcyBwcm9ibGVtCisKKwkqIGNvZmYtY29kZS5oOiAoc3dhcF9maWxlaGRyX2luLCBzd2FwX2ZpbGVoZHJfb3V0KSBhZGQuCisJKHN3YXBfZmlsZWhkcikgZGVsZXRlLiBDaGFuZ2VkIGFsbCB0aGUgdXNhZ2Ugb2YgYmZkX2hfcHV0X3guCisJKHN3YXBfYW91dGhkcl9pbiwgc3dhcF9hb3V0aGRyX291dCkgYWRkLiAoc3dhcF9hb3V0aGRyKSBkZWxldGUuCisJKGNvZmZfcmVhbF9vYmplY3RfcCkgY2xlYW5lZCB1cCwgYWRkZWQgTUlQUy4gKGNvZmZfb2JqZWN0X3ApCisJY2xlYW5lZCB1cC4gKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBjbGVhbmVkIHVwLgorCisJKiBlY29mZi5jOiBUb3RhbGx5IGRpZmZlcmVudC4gTm93IHN1cHBvcnRzIGVjb2ZmIGZ1bGx5LgorCisJKiBpY29mZi5jOiBmaXhlZCBwcm9ibGVtcyBpbiByZWxvY2F0aW9uIGNhbGxvdXQuCisKKwkqIGxpYmNvZmYuaDogKHN0cnVjdCBpY29mZGF0YSkgcmVtb3ZlZCBoZHIgc3RydWN0dXJlIGZyb20gdGRhdGEuCisKKwkqIG02OGtjb2ZmLmM6IHVwZGF0ZWQgdGFyZ2V0IHZlY3Rvci4KKworCSogc3Vub3MuYzogKGNob29zZV9yZWxvY19zaXplKSBhZGRlZDogKHN1bm9zNF9jYWxsYmFjaykgY2FsbHMKKwljaG9vc2VfcmVsb2Nfc2l6ZS4gKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpIG5vdyBjYWxscworCWNob29zZV9yZWxvY19zaXplIHNvIG91dHB1dHMgcmVsb2NzIGNvcnJlY3RseSwgYWxzbyBjYWxjdWxhdGVzIHRoZQorCXNpemUgb2YgdGhlIHNlY3Rpb25zIGNvcnJlY3RseS4KKworCisKK0ZyaSBNYXkgMTAgMTY6NTg6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJTWVyZ2UgUGVyIEJvdGhuZXIncyBjaGFuZ2VzIHRvIG1vZHVsYXJpemUgQkZEIGEub3V0IGEgYml0LgorCisJKiBsaWJiZmQuaCwgbGliYmZkLmMgKGJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogIEFkZC4KKwkqIGllZWUuYzogIENhc3QgZW51bXMgdG8gaW50IGJlZm9yZSBjb21wYXJpbmcgdGhlbSwgZm9yIGJyYWluLQorCWRlYWQgY29tcGlsZXJzLgorCSogY29mZi1jb2RlLmg6ICBSZW1vdmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHVzZSB0aGUKKwlnZW5lcmljIG9uZSBpbnN0ZWFkLgorCisJKiBhb3V0LmM6ICBEZXJpdmUgbmV3IG1vZHVsZSBmcm9tIHN1bm9zLmMsIGNvbnRhaW5pbmcgZ2VuZXJpYworCXN1cHBvcnQgY29kZSBmb3IgYWxsIGtpbmRzIG9mIGEub3V0IGZpbGVzLgorCisJKiBzdW5vcy5jOiBSZW1vdmUgYWxsIGNvZGUgdGhhdCBnb2VzIGluIGFvdXQuYy4gIFNwbGl0IG91dAorCW1hY2hpbmUgZGVwZW5kZW50IGZvbGxvd3VwIGluIHN1bm9zNF9vYmplY3RfcCBpbnRvCisJc3Vub3M0X2NhbGxiYWNrLiAgVXNlIEpVTVBfVEFCTEUoYW91dCkgZm9yIHRoZSB0cmFuc3ZlciB2ZWN0b3IsCisJYW5kIHJlZGVmaW5lIG9ubHkgdGhlIG5hbWVzIHdlIENIQU5HRSwgbm90IGFsbCB0aGUgbmFtZXMuICBEcm9wCisJdGhlIGxpdHRsZS1lbmRpYW4gdmVjdG9yLCBhbmQgcmVuYW1lIHRoZSB2ZWN0b3IgYXMgc3Vub3M0IHJhdGhlcgorCXRoYW4gZ2VuZXJpYy4KKworCSogYi5vdXQuYzogIFVzZSBhb3V0LmMgcm91dGluZXMgZm9yIG1vc3Qgb2YgdGhlIHdvcmsuICBTbGlnaHQKKwljaGFuZ2VzIGZvciB0aGUgbmV3IHJlZ2ltZS4gIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cCBhbmQKKwlnZXRfc2VjdGlvbl9jb250ZW50cyBpbiBmYXZvciBvZiBnZW5lcmljcy4gIE5ldyB0cmFuc2ZlciB2ZWN0b3IKKwlyZWdpbWUuCisKKwkqIG5ld3Nvcy5jOiAgTmV3IHN1cHBvcnQgZm9yIFNvbnkgTkVXUywgYW5vdGhlciBhLm91dCBmb3JtYXQuCisKKwkqIGVjb2ZmLmM6ICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAuICBOZXcgdHZlYyByZWdpbWUuCisJKiBpY29mZi5jLCBtODhrLWJjcy5jOiAgQWRkIHdyaXRlX2NvbnRlbnRzIHRvIHR2ZWMuCisJKiBpZWVlLmMsIG9hc3lzLmM6ICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAsIGFkZCB3cml0ZV9jb250ZW50cworCXRvIHR2ZWMuCisJKiBvcG5jbHMuYyAoYmZkX2Nsb3NlKTogIENhbGwgZm9ybWF0LWRlcGVuZGVudCB3cml0ZV9jb250ZW50cworCXJvdXRpbmUsIGlmIHdyaXRpbmcsIGJlZm9yZSBjYWxsaW5nIHRhcmdldC1kZXBlbmRlbnQKKwljbG9zZV9hbmRfY2xlYW51cCByb3V0aW5lICh3aGljaCBpcyBub3cgYWx3YXlzIGdlbmVyaWMsIEkgdGhpbmspLgorCSogc3JlYy5jOiAgVXNlIGJmZF9hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4gIFJlbW92ZQorCWNsb3NlX2FuZF9jbGVhbnVwIGFuZCBtb3ZlIGNvZGUgZnJvbSBpdCB0bworCXNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgQWRkIHdyaXRlX2NvbnRlbnRzIHRvIHR2ZWMuCisJKiB0YXJnZXRzLmM6ICBSZW1vdmUgYS5vdXQgbGl0dGxlIHZlY3RvciwgcmVwbGFjZSBhLm91dCBiaWcKKwl2ZWN0b3Igd2l0aCBTdW5PUyB2ZWN0b3IuICBGSVhNRTogIE5lZWQgVmF4IHN1cHBvcnQgYWdhaW4gbm93LgorCisJKiBsaWJiZmQuaDogIEFkZCB3cml0ZV9jb250ZW50cyBmb3JtYXQtZGVwZW5kZW50LXZlY3RvciB0byB0aGUKKwliZmRfdGFyZ2V0IHZlY3Rvci4gIFN1cHBseSBhIGdlbmVyaWMgY2xvc2VfYW5kX2NsZWFudXAgcm91dGluZS4KKwkqIGxpYmEub3V0Lmg6ICBIYW5kbGUgdGhlIG5ldyBhb3V0LmMgc3BsaXQuICBBZGQgcHJvdG90eXBlcyBmb3IKKwlhbGwgcm91dGluZXMgZGVmaW5lZCBpbiBhb3V0LmMuICBSZW5hbWUgInN1bm9zIiB0aGluZ3MgdG8gImFvdXQiCisJdGhpbmdzLiAgQWRkIGEgZmV3IGZpZWxkcyB3aGVyZSBuZWVkZWQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KKwkqIE1ha2VmaWxlLmluOiAgQWRkIGFvdXQuYyBhbmQgbmV3c29zLmMuCisKKwkqIGFyY2hpdmUuYywgaWVlZS5jLCBvYXN5cy5jOiAgTGludC4KKworRnJpIE1heSAxMCAxMjozNDo0OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiAuLi9pbmNsdWRlL2JmZC5oCisJY2hhbmdlZCBmb3J3YXJkIGRlY2xhcmF0aW9uIHN0cnVjdCBzdGF0OyB0byByZWR1Y2Ugd2FybmluZ3MuIENoYW5nZWQKKwljb21tZW50IG9uIGJmZF9oXzx4Pl94LgorCisJKiAuLi9pbmNsdWRlL202OGtjb2ZmLmgsIC4uL2luY2x1ZGUvaW50ZWwtY29mZi5oLAorCS4uL2luY2x1ZGUvbTg4ay1iY3MuaAorCU5vdyB0aGVyZSBhcmUgdHdvIGluY2FybmF0aW9ucyBvZiByZWxvY3MsIGxpbmVub3MgYW5kIHN5bWVudHMuIE9uZSBmb3IKKwlpbnRlcm5hbCBkaWdlc3Rpb24sIGFuZCBvbmUgZnVsbCBvZiBjaGFyIGFycmF5cyBmb3IgSS9PLiBUaGUgb3JpZ2luYWwKKwluYW1lcyBoYXZlIGdvbmUgdG8gZGV0ZWN0IGVycm9ycy4KKworCSogTWFrZWZpbGUuaW4sIG02OGtjb2ZmLmMsIHRhcmdldHMuYworCVRlc3QgbmV3IHN0cnVjdHVyZSBjb2RlIHdpdGggYSA2OGsgY29mZiBpbXBsZW1lbnRhaW9uCisKKwkqIGNvZmYtY29kZS5oLCBpY29mZi5jLCBjb2Zmc3dhcC5jLCBsaWJjb2ZmLmgKKwlGaXhlZCBhbGwgdGhlIHBsYWNlcyB3aGVyZSB0aGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggdGhlIHNpemUgYW5kCisJYWxpZ25tZW50cyBvZiBzdHJ1Y3R1cmVzIG9uIGRpc2sgYW5kIHN0cnVjdHVyZXMgaW4gbWVtb3J5LiAjaWZlZCBvdXQKKwlhbGwgdGhlIGNvZGUgaW4gY29mZnN3YXAuYywgc2luY2UgaXQgc2hvdWxkIGJlIGRvbmUgdXNpbmcgdGhlIHRhcmdldAorCXN3YXAgcm91dGluZXMgbm93LgorCitUaHUgTWF5ICA5IDExOjAwOjQ1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGllZWUuYyAoZG9fb25lLCBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IG5vdyBzdXBwb3J0cyB0aGUgbG9hZAorCW11bHRpcGxlIHJlbG9jIGNvbW1hbmQuCisKKwkqIHN1bm9zLmMgKHN1bm9zNF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE1hZGUgaXQgc28gdGhhdCBzZWN0aW9ucworCWFyZSBhbHdheXMgcGFkZGVkIHRvIHRoZWlyIGFsaWdubWVudCBzaXplLgorCitTYXQgTWF5ICA0IDE1OjQ5OjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jLCBiZmQuYywgY29mZi1jb2RlLmgsIG9wbmNscy5jLCBzdW5vcy5jLCB0cmFkLWNvcmUuYzoKKwlDbGVhbiB1cCB0eXBlcyBhbmQgc3VjaCAoc2FiZXIgQyBwcm9ibGVtcykuCisJKiBlY29mZi5jOiAgQ2xlYW4gdXAgdHlwZXMgYW5kIHN1Y2guICBSZW1vdmUgcm91dGluZXMgdGhhdCBhcmUKKwlub3QgdXNlZC4gIEZpeCB1cCByZWFkaW5nIGFuZCBzd2FwcGluZyBvZiBzaG9ydHMgZnJvbSBmaWxlcy4KKworICAgTm90ZXMgb24gYmZkLTAuNS4yLXBhdGNoMWEsIGZyb20gUGVyIEJvdGhuZXI6CisKKwkqIGEub3V0LnZheC5jOiBSZW1vdmUgdHdvIGJvZ3VzICJzdGF0aWMiIGZyb20gcHJvdG90eXBlcy4KKworCSogZWNvZmYuYzogR290IHJpZCBvZiBsb3RzIG9mIG5vbi13b3JraW5nIGp1bmsgKHRoYXQgaGFkCisJYmVlbiBjb3BpZWQgZGlyZWN0bHkgZnJvbSBjb2ZmLWNvZGUuaCkuCisJVXBkYXRlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdXBkYXRlcyB0byBpY29mZi5jIGFuZCBjb2ZmLWNvZGUuaC4KKworCSogbGliYmZkLmg6IEFkZGVkIGRlZmluaXRpb25zIGZvciBTX0lYVVNSLCBTX0lYR1JQLCBhbmQgU19JWE9USAorCWlmIHRoZXkncmUgbWlzc2luZyAoYXMgdGhleSBhcmUgaW4gKEJEUy00LjMtYmFzZWQpIE5ld3NPUy0zKS4KKworCSogc3Vub3MuYyAobl90eHRvZmYpOiAoUmUtKUFkZCBzdXBwb3J0IGZvciBzb255LiBUaGlzIGlzIGEga2x1ZGdlLAorCWJ1dCB1bnRpbCB0aGUgdGFyZ2V0X3ZlY3RvciBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwKKwlpdCdzIGFzIGdvb2QgYXMgYW55LiBOb3RlIHRoYXQgdGhlIHRleHQgb2Zmc2V0IGlzIHRoZSBvbmx5CisJZGlmZmVyZW5jZSBiZXR3ZWVuIE5ld3NPUyBhbmQgU3VuT3MgKGluY2x1ZGluZyBtYWdpYyBudW1iZXJzKS4KKwkoTW9zdCBvZiB0aGUgc3Vub3NfKiByb3V0aW5lcyBzaG91bGQgdG8gcmVuYW1lZCBic2RfKgorCWFuZCBtb3ZlIHRvIGEgYnNkLmMgZmlsZS4gVGhlbiAoYW5kIHdoZW4gdGhlIHRhcmdldF92ZWN0b3IKKwlpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCkgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBjcmVhdGUKKwlhIHNlcGFyYXRlIFNvbnkgdGFyZ2V0LikKKworCSogc3lzZGVwLmg6IERvbid0IGRlY2xhcmUgZnJlYWQgYW5kIGZ3cml0ZS4gQ2F1c2VzIHRyb3VibGUKKwlvbiBzb21lIHN5c3RlbXMsIGFuZCBkb2Vzbid0IGhlbHAgb24gb3RoZXJzLgorCVNpbWlsYXJseSwgb25seSBkZWZpbmUgWF9PSyBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCisJKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSBzeXMvc3RhdC5oIC0gYXQgbGVhc3QKKwlvbiBOZXdzT1MgMywgaXQgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZC4KKworVHVlIE1hciAgNSAwMTo0Nzo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGNvZmYtY29kZS5oIChiZmRfY29mZl9zd2FwX3N5bSwgYmZkX2NvZmZfc3dhcF9hdXgsCisJYmZkX2NvZmZfc3dhcF9saW5lbm8pOiAgRXhwb3J0IHRoZSByb3V0aW5lcyB0aGF0IGJ5dGUtc3dhcCBDT0ZGCisJc3ltYm9sIHRhYmxlcyBpZiBuZWNlc3Nhcnkgd2hlbiByZWFkaW5nIHRoZW0gaW4sIHNvIGdkYiBjYW4gdXNlCisJdGhlbS4gIEFkZCAiYmZkX2NvZmZfIiB0byB0aGUgbmFtZXMgc28gdGhleSB3b24ndCBjb25mbGljdCB3aXRoCisJbmFtZXMgaW4gY2FsbGluZyBwcm9ncmFtcy4gIEZJWE1FLXNvb246ICBpZiBjb2ZmLWNvZGUuaCBpcworCWluY2x1ZGVkIGluIHR3byBCRkQgbW9kdWxlcywgdGhpcyB3aWxsIGNhdXNlIGR1cGxpY2F0ZQorCWRlZmluaXRpb25zOyB0aGUgcm91dGluZXMgc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGEgc2VwYXJhdGUsCisJY29tbW9uLCBtb2R1bGUgKHByb2JhYmx5IGFsb25nIHdpdGggYSBtZXNzIG9mIG90aGVyIG9uZXMpLgorCitTYXQgTWFyICAyIDEyOjExOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCUltcHJvdmUgbW9kdGltZSBzdXBwb3J0LgorCisJKiBiZmQuaDogIEFkZCBib29sZWFuIG10aW1lX3NldCwgYW5kIGRlY2xhcmUgYmZkX2dldF9tdGltZS4KKwlSZW1vdmUgI2RlZmluZSBmb3IgYmZkX2dldF9tdGltZS4gIFJlbW92ZSBncmF0dWl0b3VzIGNvbW1lbnQuCisJKiBiZmQuYyAoYmZkX2dldF9tdGltZSk6ICBOZXcgZm4sIGNhY2hlcyBtdGltZSwgZ2V0cyBpZiBub3QgY2FjaGVkLgorCUJVRzogIGFyY2hpdmUgbWVtYmVycyBzdGlsbCBkbyBub3QgZ2V0IGNvcnJlY3QgbW9kIHRpbWVzLgorCisJSW1wcm92ZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGZvciBjb3JlIGZpbGVzLgorCisJKiBzdW5vcy5jIChzdHJ1Y3QgY29yZSk6ICBDaGFuZ2Ugdm9pZCAqZnBhX2R1bW15IHRvIGRvdWJsZSBmcF9zdHVmZi4KKwkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIENyZWF0ZSBhIHNlY29uZCByZWdpc3RlcnMgc2VjdGlvbiBpbiB0aGUKKwljb3JlIGZpbGUsIGNhbGxlZCAiLnJlZzIiLCBmb3IgdGhlIGZsb2F0IHJlZ2lzdGVycy4KKworVGh1IEZlYiAxNCAxNTo0OTowNiAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogbWFueSBjaGFuZ2VzIHRvIGltcHJvdmUgYXJjaGl2ZSBoYW5kbGluZzsgZm91bmQgYSBsb2dpYyBmbGF3IGluCisJICBiZmRfY2hlY2tfZm9ybWF0IHdoaWNoIG9ubHkganVzdCBoYXBwZW5lZCB0byB3b3JrIGJ5IGNvb25jaWRlbmNlLgorCitUaHUgRmViIDE0IDA3OjUzOjE2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGJmZC5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogZml4ZWQgdG8gdXNlIG91dHB1dF9vZmZzZXRzCisJY29ycmVjdGx5LgorCisJKiBiZmQuaDogY2hhbmdlZCB0eXBlIG9mIHVkYXRhIGluIGFzeW1ib2wgdG8gdm9pZCAqLCBsaWtlIGl0CisJc2hvdWxkIGJlLiBBZGRlZCBiZmRfcmVsb2NfZGFuZ2Vyb3VzIGVudW0gbWVtYmVyLgorCisJKiBjb2ZmLWNvZGUuaDogRml4ZWQgaXQgc28gdGhhdCBpbnRlcm5hbGx5IGdlbmVyYXRlZCBzeW1ib2xzIGdldAorCXRoZWlyIHZhbHVlcyByZWxvY2F0ZWQgY29ycmVjdGx5IGluIGFsbCBjYXNlcy4gUmVtb3ZlZCBjYWxscyB0bworCXhtYWxsb2MuCisKKwkqIGljb2ZmLmM6IE5vdCB1bmRlcnN0YW5kaW5nIHRoZSBkZXN0aW5hdGlvbiBzeW1ib2wgb2YgYSByZWxvYyBpcworCW5vdCBhIGZhaWx1cmUgYW55IG1vcmUsIGp1c3QgJ2Rhbmdlcm91cycuIFRoaXMgYWxsb3dzIGxpbmtpbmcgb2YKKwliLm91dCBhbmQgY29mZiBpbWFnZXMuCisKKwkqIHN1bm9zLmM6IENsZWFuZWQgdXAgdGhlIHdheSB0aGF0IFpNQUdJQyBzZWN0aW9uIHNpemVzIGFyZQorCWNhbGN1bGF0ZWQuCisKKworVHVlIEZlYiAxMiAxMzoyNTo0NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBzdW5vcy5jICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IGZpeGVkCisJc3ltX3BvaW50ZXItPm5fdmFsdWUgc28gdGhhdCBzeW1ib2xzIG9uIHRoZSB3YXkgb3V0IGdldCB0aGVpcgorCXNlY3Rpb24gcmVsYXRpdmUgdmFsdWVzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgorCisJKiBjb2ZmLWNvZGUuaCAobWFuZ2xlX3N5bWJvbHMpOiBmaXhlZCBwcm9ibGVtIHdoZXJlIHRhZ3Mgd2VyZSBub3QKKwliZWluZyByZWxvY2F0ZWQgZm9yIHN0cnVjdHMsIGVudW1zLCB1bmlvbnMuIEFsc28gdmFyaW91cyBsaW50cy4KKworTW9uIEZlYiAxMSAxOTo1MjoyNiAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYXJjaGl2ZS5jIChnZXRfZWx0X2F0X2ZpbGVwb3MpOiBzeXN0ZW1fY2FsbF9lcnJvciByZXR1cm5lZAorCSAgaW5jb3JyZWN0bHkuCisKK1N1biBGZWIgMTAgMjM6MTg6NDAgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIFJlc29sdmUgdGhlIHVzZSBvZiBub19lcnJvciBhbmQgc3lzdGVtX2NhbGxfZXJyb3IuCisJICBUaGUgYmZkIGxpYnJhcnkgaXRzZWxmIG5vdyB3aWxsIG5ldmVyIHNldCBiZmRfZXJyb3IgdG8KKwkgIG5vX2Vycm9yLgorCisJICBUaGUgY29kZSBzdGlsbCBuZWVkcyB0byBiZSBjb21iZWQgdG8gbWFrZSBzdXJlIGFsbCB0aGUgZXJyb3IKKwkgIGNvZGVzIGFyZSBjb3JyZWN0LiAgSSBzdXNwZWN0IHRoZXkgYXJlIG5vdCBhbHdheXMgc2V0IGNvcnJlY3RseS4KKworCSogVGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVzc2FnZXMgaGF2ZSBfIHByZXBlbmRlZCBiZWNhdXNlIHRoZSBzdW4KKwkgIGJ1bmRsZWQgY29tcGlsZXIgY2FuJ3QgZGlzdGluZ3Vpc2ggZnJvbSBhIG1hY3JvIHdoaWNoIHRha2VzIGFuCisJICBhcmd1bWVudCBhbmQgdGhlIHNhbWUgaWRlbnRpZmllciBpbiBhIG5vbi1tYWNybyBjb250ZXh0LgorCisJKiBUaGUgcmVhc29uIGZvciB0aGUgYWJvdmUgYmVpbmcgdGhhdCBlbnRyeSBwb2ludHMgd2hpY2ggdXNlZCB0bworCSAgYmUgdHJhbXBvbGluZSBmdW5jdGlvbnMgYXJlIG5vdyBqdXN0IG1hY3JvcyB3aGljaCBleHBhbmQgdG8gYQorCSAgZGlyZWN0IGNhbGwgdGhyb3VnaCB0aGUgYmZkJ3MgeGZlciB2ZWN0b3IuCisKKwkqICguLi9pbmNsdWRlL2ludGVsLWNvZmYuaCkgRl9BUjMyV1I6IGZpeCB0aGlzIGNvbnN0YW50LiAgV2h5CisJICBtdXN0IGdhcyBoYXZlIGl0cyBvd24gdmVyc2lvbiBvZiBldmVyeXRoaW5nICh0aGUgZ2FzIHZlcnNpb24KKwkgIGhhZCB0aGUgY29ycmVjdCB2YWx1ZSkKKworVHVlIEZlYiAgNSAxMTo0Njo1MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBiLm91dC5jOiBBZGRlZCBwYXRjaGVzIHN1cHBsaWVkIGJ5IGNocmlzYkBtaXBvbjIuaW50ZWwuY29tIHRvCisJcHJvcGVybHkgc3VwcG9ydCBpOTYwIGFyY2hpdGVjdHVyZSBhbmQgb3V0cHV0IGNvcnJlY3QgcmVsb2Mgc3R1ZmYuCisKKwkqIGJmZC5oOiBhZGRlZCBwcm90b3R5cGUgZm9yIGJmZF9wcmludGFibGVfYXJjaF9tYWNoLCBhZGRlZAorCUJGRF9GQUlMCisKKwkqIGNvZmYtY29kZS5oOiBBcHBsaWVkIHBhdGNoZXMgZnJvbSBjaHJpc2IgdG8gc3VwcG9ydCBpOTYwCisJYXJjaGl0ZWN0dXJlLCB6ZXJvIHJlbG9jcyBhbmQgc3dhcCB0aGVtIGNvcnJlY2x5IGFuZCBjb25kaXRpb25hbGx5CisJY29tcGlsZWQgdGhlIHRpbWVzdGFtcC4KKworCSogc3Vub3MuYzogTWFkZSB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCAyXjMgc28gdGhhdCBkb3VibGVzCisJYXJlIGRvbmUgcHJvcGVybHkuIEZpeGVkIHRoZSBzYW1lIHJlbG9jIGJ1ZyB0aGF0IHdhcyBpbiBiLm91dC5jCisKKwkqIHN5c2RlcC5oOiBOb3cgY29tcGlsZXMgb24gYSBQb3NpeCBib3gKKworV2VkIEphbiAzMCAyMTozNjoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGljb2ZmLmM6ICBGaXggY29tbWVudCBvbiBiaWctZW5kaWFuIHZlcnNpb24uCisJKiBjb2ZmLWNvZGUuaDogIE1ha2UgSEFTX1JFTE9DIHJlYWxseSB3b3JrIChpdCdzIGJhY2t3YXJkcyBmcm9tCisJRl9SRUxGTEcpLiAgU2V0IEZfQVIzMldSIGluIG91dHB1dCBmaWxlcyBpZiBsaXR0bGUgZW5kaWFuCisJYXJjaGl0ZWN0dXJlLgorCitUdWUgSmFuIDI5IDIwOjU2OjEwIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KKworCSogYXJjaHVyZXMuYyBmaXhlZCA9Lz09IHR5cG8KKworCSogc3Vub3MuYyBhZGRlZCBhcmNoaXRlY3R1cmUgc3R1ZmYgZm9yIG91dHB1dC4gRml4ZWQKKwlidWcgd2hlcmUgZmlsZXMgd2hlcmUgdm1hKGRhdGEpICE9IHNpemUodGV4dCkKKwl3ZXJlIHByb2Nlc3NlZCB3cm9uZy4KKworCSogY29mZi1jb2RlLmggYWRkZWQgYSBsaW50IGNhc3QKKworCSogKC4uL2luY2x1ZGUvYS5vdXQuc3VuNC5oKSBmaXhlZCBpdCBzbyB6bWFnaWMKKwl3b3JrZWQKKworTW9uIEphbiAyOCAxOToxNToyOSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCisKKwkqIGFyY2hpdmUuYyByZW1vdmVkIGxvYWRzIG9mIGluY2x1ZGVzLCBhbmQgZml4ZWQgYnVnIHdoZXJlIHN0cmluZworCXRhYmxlIGRpZG4ndCBoYXZlIGEgbnVsbCBhdCB0aGUgZW5kLgorCisJKiBiZmQuYyBmaXhlZCBpbmNsdWRlcywgYWRkZWQgc3ltYm9scyBhcmd1bWVudCB0bworCWNhbm9uaWNhbGl6ZV9yZWxvYyBlbnRyeSBwb2ludC4KKworCSogbGliYmZkLmMgZml4ZWQgaW5jbHVkZXMgYW5kIGFkZGVkIHNvbWUgbGludCBwYXRjaGVzLgorCisJKiB0YXJnZXRzLmMgYWRkZWQgYm90aCBzb3J0cyBvZiBpbnRlbCBjb2ZmLgorCisJKiBiLm91dC5jIGZpeGVkIGluY2x1ZGVkLCBjaGFuZ2VkIHdhcyB0aGUgY2Fub25pY2FsCisJcmVsb2NzIHdlcmUgZG9uZS4KKworCSogaWNvZmYuYyBhZGRlZCBzdXBwb3J0IGZvciBjYWxsaiBhbmQgYmlnIGFuZCBsaXR0bGUKKwllbmlkaWFuIHRhYmxlcy4KKworCSogb3BuY2xzLmMgYWRkZWQgY2htb2QreGluZyBmb3IgZmlsZXMgd2l0aCBFWEVDX1Agc2V0LgorCisJKiBzdW5vcy5jIGZpeGVkIGluY2x1ZGVzLiBDaGFuZ2VkIGRlZmF1bHQgc2VjdGlvbgorCWFsaWduZW1lbnQgdG8gd29yZHMuIEZpeGVkIHJlbG9jYXRpb24gc3R1ZmYgdG8gd29yayB3aXRoCisJbmV3IHNjaGVtZQorCisJKiBiZmQuaCB2YXJpb3VzIG5ldyB0eXBlcyBhZGRlZCwgcHJvdG90eXBlIGZvciBuZXcKKwlyZWxvYyBjYWxscywgY2hhbmdlZCBiZmQtPmlvc3RyZWFtIHRvIGEgdm9pZCAqCisJdG8gaW5jbHVkaW5nIGZpbGVzIGRvbid0IG5lZWQgc3RkaW8uaC4KKworCSogbGliY29mZi5oIGFkZGVkIGNvbnZlcnNpb24gdGFibGUgdG8gdGllIHJlbG9jcyB0bworCWNhbm9uaWNhbCBzeW1ib2xzCisKKwkqIHN5c2RlcC5oIGNyZWF0ZWQKKworCSogY29mZi1jb2RlLmggZml4ZWQgaW5jbHVkZXMuIEFkZGVkIGNvZGUgdG8gc3VwcG9ydAorCWJpZyBhbmQgbGl0dGxlIGVuZGlhbiBmb3JtYXRzLiBWYXJpb3VzIGxpbnRzLiBCZXR0ZXIKKwlwcm9jZXNzaW5nIG9mIHN5bWJvbHMuIENoYW5nZWQgcmVsb2Mgc3R1ZmYgdG8gbmV3CisJb3JkZXIKKworCSogbGliYmZkLmggZml4ZWQgaW5jbHVkZXMKKworCitNb24gSmFuIDIxIDExOjUzOjUxIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KKworCSogYmZkLmgJY2hhbmdlZCBuYW1lIG9mIGFsaWdubWVudCBlbnRyeSBpbiBzZWNfc3RydWN0IHRvCisJYWxpZ25tZW50X3Bvd2VyLCBiZWNhdXNlIG9mIGNvbmZsaWN0aW5nIHVzZXMgd2l0aGluIGJmZC4KKwlOb3cgaXQgc2hvdWxkIGJlIG9idmlvdXMgdGhhdCBpdCdzIGEgMioqbiBhbGlnbm1lbnQKKwlzcGVjaWZpZXIuIFJlbW92ZWQgc3RhcnRfcGFkLCBlbmRfYWxpZ25tZW50LCBibG9jaywgbWluc2l6ZSwKKwlvdXRwdXRfZmlsZV9hbGlnbm1lbnQsIHN1YnNlY3Rpb25fYWxpZ25tZW50IGFuZCBvcmlnaW5hbF92bWEgZmllbGRzLgorCUFkZGVkIGFsaWduX3Bvd2VyKCkgbWFjcm8uIEZpeGVkIGJmZF9zZWN0aW9uX2FsaWdubWVudAorCWFjZXNzb3IgbWFjcm9zLiBBZGRlZCBiZmRfc3ltYm9sX3NhbWVfdGFyZ2V0IG1hY3JvLgorCisJKiBiLm91dC5jIChiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpIGZpeGVkIHRvIHVzZQorCW5ldyBhbGlnbm1lbnQgbWVtYmVyLiBGaXhlZCAoY2FsbGpfY2FsbGJhY2spIHRvIHVzZSBzZWN0aW9uCisJcmVsYXRpdmUgc3ltYm9scyBwcm9wZXJseS4KKworCSogc3Vub3MuYyAoc3Vub3M0X29iamVjdF9wKSBmaXhlZCB0byB1c2UgbmV3IGFsaWdubWVudF9wb3dlci4KKwlGaXhlZCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncykgdG8gY29ycmVjdGx5IG1ha2UKKwlzeW1ib2xzIHNlY3Rpb24gcmVsYXRpdmUuCisKKwkqIGJmZC5jIChiZmRfZXJybXNnKSBmaXhlZCB2YXJpb3VzIGVudW0gY2FzdCBwcm9ibGVtcy4KKwkoYmZkX21ha2Vfc2VjdGlvbikgdG9vayBvdXQgaW5pdGlhbGl6YXRpb24gb2Ygb2Jzb2xldGUgbWVtYmVycy4KKwkoYmZkX3ByaW50X3N5bWJvbF92YW5kZikgYWRkZWQKKworCSogb3BuY2xzLmMgKGJmZF9jcmVhdGUpIGNyZWF0ZWQuCisKKwkqIGNvZmYtY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spIHRvb2sgYXdheSByZWZzCisJdG8gb2Jzb2xldGUgbWVtYmVycy4gKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSkgYWRkZWQKKwljb252ZXJzaW9uIGJldHdlZW4gYWxpZ25tZW50IHR5cGVzLiAoY29mZl9zeW1ib2xfZnJvbSkKKwlhZGRlZC4gKGNvZmZfY291bnRfbGluZW51bWJlcnMpIG9ubHkgY291bnRzIGxpbmVudW1iZXJzCisJaWYgc3ltYm9sIGlzIG9mIGNvZmYtdHlwZS4gKGNvZmZfbWFuZ2xlX3N5bWJvbHMpIG9ubHkKKwloZWF2aWx5IG1hbmdsZXMgc3ltYm9scyBpZiBzeW1ib2wgaXMgY29mZi10eXBlLgorCShjb2ZmX3dyaXRlX3N5bWJvbHMpIHZhcmlvdXMgbGludHMuIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cykKKwl2YXJpb3VzIGxpbnRzIGFuZCBtb2RpZmljYXRpb24gZm9yIGFsaWdubWVudCBjb252ZXJzaW9uLgorCShjb2ZmX3NsdXJwX3JlbG9jcykgZml4ZWQgZm9yIHVzZSB3aXRoIG5ldyBhc2VjdGlvbiBzaGFwZS4KKworU2F0IEphbiAxOSAxNjoxMDo0MiBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCisKKwkqIGFyY2hpdmUuYyBsb3RzIG9mIGxpbnQKKworCSogYi5vdXQuYyBhZGRlZCBjYWxsaiByZWxvY2F0aW9uIHN1cHBvcnQsIHVwZ3JhdGVkIHJlbG9jIGhvd3RvLgorCUZpeGVkIHNvIHRoYXQgYXN5bWJvbCBhbmQgcmVsb2MgcmVjb3JkcyBhcmUgb3V0cHV0CisJY29ycmVjdGx5LgorCisJKiBiZmQuYyBsb3RzIG9mIGxpbnQsIHN1cHBvcnQgZm9yIG5ldyBiZmQgZW50cnkgcG9pbnQKKwliZmRfcHJpbnRfc3ltYm9sLgorCisJKiBiZmQuaCBjaGFuZ2VkIGRlZmluaXRpb24gb2YgYXN5bWJvbCB0byBjb250YWluIHBvaW50ZXIgdG8KKwlvd25pbmcgYmZkLCByZW1vdmVkIHRhcmdldCBkZXBlbmRlbmNpZXMuCisKKwkqIGNhY2hlLmMgdG9vayBvdXQgcHJpbnQgc3RhdGVtZW50cywgcHV0IGluIEJGRF9BU1NFUlQgY2FsbHMuCisKKwkqIGNvZmYtY29kZS5oIHZhcmlvdXMgbGludHMsIGNvcnJlY3RlZCBsaW5lbnVtYmVyIG91dHB1dAorCWZ1bmN0aW9uYWxpdHkuIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBzdHlsZSBhc3ltYm9scyBhbmQKKwliZmRfcHJpbnRfc3ltYm9sLiBGaXhlZCBzbyB0aGF0IGFzeW1ib2wgYW5kCisJcmVsb2MgcmVjb3JkcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuIEFkZGVkIHRpbWVzdGFtcC4KKworCSogaWNvZmYuYyBBZGRlZCBzdXBwb3J0IGZvciBuZXcgaG93dG8gc2hhcGUuCisKKwkqIGxpYmEub3V0LmggQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUKKworCSogbGliYmZkLmMgdmFyaW91cyBsaW50cworCisJKiBsaWJiZmQuaCB2YXJpb3VzIGxpbnRzCisKKwkqIGxpYmNvZmYuaCBhZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZS4KKworCSogc3Vub3MuYyAgdmFyaW91cyBsaW50cy4gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUKKwlhbmQgYmZkX3ByaW50X3N5bWJvbC4KKworV2VkIEphbiAxNiAyMTozODowOSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCisKKwkqIGIub3V0LmMgcmVtb3ZlZCBwcm90b3R5cGUgb2Ygc3Vub3M0X2VubmF0aXZhdGVfc3ltdGFiLCBsb3RzIG9mCisJcG9pbnRlciBsaW50LiBBZGRlZCBzdXBwb3J0IGZvciBjYWxsaiByZWxvY2F0aW9uLiBGaXhlZCBidWcgd2hlcmUKKwl0aGUgbGFzdCAzMiBieXRlcyBvZiB0aGUgdGV4dCBzZWN0aW9uIHdlcmUgb3ZlcndyaXR0ZW4gYnkgZGF0YS4gRml4ZWQgYnVnCisJd2hlcmUgYXJjaGl2ZXMgb2YgYi5vdXQgZGlkbid0IHdvcmsgZHVlIGJmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCisJcmV0dXJuaW5nIGZhbHNlLgorCisJKiBzdW5vcy5jIGFkZGVkIHN1cHBvcnQgZm9yIG5fb3RoZXIgZmllbGQuIEJyYWNlZCB0aGUgaG93dG8gdGFibGUgc28KKwl0aGF0IGl0IHdvbid0IGJlIGFmZmVjdGVkIGJ5IGFueSBsZW5ndGhpbmcgb2YgdGhlIGhvd3RvIHN0cnVjdCB0eXBlZGVmLgorCVZhcmlvdXMgbGludHMKKworCSogYmZkLmggYWRkZWQgc3VwcG9ydCBmb3Igbl9vdGhlciBmaWVsZCwgYWRkZWQgc3BlY2lhbF9mdW5jdGlvbgorCXJlbG9jIHR5cGUsIG1vZGlmaWVkIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gcHJvdG90eXBlLiBBZGRlZCBiZmRfaF9nZXRfeAorCW1hY3Jvcy4KKworCSogYmZkLmMgdXBncmFkZWQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgdmFyaW91cyBsaW50cy4KKworV2VkIEphbiAxNiAwMTo1NTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgcnRsKQorCisJKiBDaGFuZ2VMb2c6ICBTdGFydGVkIENoYW5nZUxvZyBmb3IgQkZELgorCSogVG9EbzogIENyZWF0ZSBmaWxlIGZvciBzdWdnZXN0aW9ucy4KKworCSogTWFrZWZpbGU6ICBTdXBwb3J0IGVhc3kgbG9hZGluZyBpbnRvIFNhYmVyIEMuCisJQWRkIGRlcGVuZGVuY2llcyBmb3IgaWNvZmYubyBhbmQgYmNzODhrY29mZi5vLgorCVJlbmFtZSBjb2ZmLmMgdG8gY29mZi1jb2RlLmguICBDaGFuZ2UgY2FsbGVycy4KKworCSogYmZkLmMgKGJmZF9jaGVja19mb3JtYXQpOiAgQWxsb3cgdGhlIGNoZWNrX2Zvcm1hdCByb3V0aW5lcworCXRvIHJldHVybiB0aGUgZGVzaXJlZCB0YXJnZXQgdmVjdG9yLCByYXRoZXIgdGhhbiBqdXN0IGEgQm9vbGVhbi4KKwliZmQuaCAoYmZkX2NoZWNrX2Zvcm1hdCk6ICBDaGFuZ2UgZnVuY3Rpb24gcG9pbnRlciByZXR1cm4gdHlwZS4KKwlhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6ICBjaGFuZ2UgY2FsbGVlLgorCWIub3V0LmMgKGJfb3V0X2xpdHRsZV9vYmplY3RfcCwgYl9vdXRfYmlnX29iamVjdF9wLAorCWJfb3V0X3JlYWxfb2JqZWN0X3ApOiAgY2hhbmdlIGNhbGxlZS4KKwlsaWJiZmQuYyAoX2JmZF9kdW1teV90YXJnZXQpOiAgRHVtbXkgcm91dGluZSByZXBsYWNpbmcgYmZkX2ZhbHNlCisJaW4gY2hlY2tfZm9ybWF0IHRyYW5zZmVyIHZlY3RvcnMgdGhhdCBuZWVkIGEgZmlsbGVyLgorCWxpYmJmZC5oIChiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0KTogIEZpeCBkZWNscy4KKwliY3M4OGtjb2ZmLmM6ICBjaGFuZ2UgY2FsbGVlLgorCWNvZmYtY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3AsIGNvZmZfYmlnX29iamVjdF9wKTogIGNoYW5nZSBjYWxsZWUuCisJaWNvZmYuYzogIGNoYW5nZSBjYWxsZWUuCisJc3Vub3MuYyAoc3Vub3M0X29iamVjdF9wLCBzdW5vczRfY29yZV9maWxlX3ApOiAgY2hhbmdlIGNhbGxlZS4KKworCSogbGliYmZkLmMgKHphbGxvYyk6ICBJdCBzaG91bGQgYWN0dWFsbHkgemVybyB0aGUgc3RvcmFnZSEKKwlUaGlzIHdhcyBjb21tZW50ZWQgb3V0IGZvciBzb21lIHJlYXNvbi4KKworCSogbGliYmZkLmg6ICBBZGQgbWFsbG9jLCB4bWFsbG9jLCBtZW1jcHksIGFuZCBmYXRhbCBkZWNscy4KKwlUaGlzIGlzIHNvIGNhbGxlcnMgY2FuIGF2b2lkIDxzdGRsaWIuaD4gd2hpY2ggZG9lc24ndCBleGlzdAorCW9uIG9sZGVyIHN5c3RlbXMuCisKKwkqIGJmZC5jIChtYXBfb3Zlcl9zZWN0aW9ucyk6ICBBZGQgZGVidWdnaW5nIGNvZGUsIHNpbmNlIEkKKwlub3RpY2VkIHRoZSBzZWN0aW9uIGNvdW50IGZvciBzdW5vcyBjb3JlIGZpbGVzIHdhcyBiYWQsIGJ1dCBvbmx5CisJR0RCIGhhZCBkZXRlY3RlZCB0aGUgcHJvYmxlbS4KKwkoYmZkX3NldF9zZWN0aW9uX2xpbmVub19zaXplLCBiZmRfc2V0X3NlY3Rpb25fbGluZW5vcywKKwliZmRfZ2V0X3NlY3Rpb25fbGluZW5vcyk6ICBSZW1vdmUgb2Jzb2xldGUgZnVuY3Rpb25zLgorCShiZmRfYXBwbHlfcmVsb2NhdGlvbnMpOiAgVXNlIGxvbmdzLCBub3QgaW50cywgZm9yIHRoZSBtYXRoLgorCisJKiBiZmQuaDogIERlY2xhcmUgZW51bSBib29sZWFuIGFuZCBzdHJ1Y3QgYmZkX3RhcmdldCBhcyB3ZWxsCisJYXMgdHlwZWRlZnMgZm9yIHRoZW0uICBSZW1vdmUgb2Jzb2xldGUKKwliZmRfZ2V0X3NlY3Rpb25fbGluZW5vX3NpemUuCisKKwkqIGNhY2hlLmM6ICBNYWtlIHRoZSAiZmRvcGVuIiBzdXBwb3J0IHdvcmsuICBLZWVwIGJldHRlciB0cmFjaworCW9mIGhvdyBtYW55IGZpbGVzIGFyZSBvcGVuLiAgQ2VudHJhbGl6ZSB0aGUgb3BlbmluZyBvZiBmaWxlcworCWFuZCBiZSBzdXJlIGJmZF9vcGVuW3J3XSBhY3R1YWxseSB0cnkgdG8gb3BlbiB0aGUgZmlsZS4gIEV2YWRlCisJbGlua2VkIGxpc3QgaW5pdGlhbGl6YXRpb24gcHJvYmxlbXMuCisKKwkqIGIub3V0LmMsIGNvZmYtY29kZS5oLCBvcG5jbHMuYywgc3Vub3MuYzogIGxpbnQuCisKKwkqIGNvZmYtY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBOdWxsLXRlcm1pbmF0ZSBzeW10YWIgbmFtZXMuCisKKwkqIGNwbHVzLWRlbS5jOiAgRGVsZXRlIGZpbGUsIHNpbmNlIGl0IGlzIG5vdCBwYXJ0IG9mIEJGRC4KKworCSogb3BuY2xzLmMgKGJmZF9vcGVucik6ICBFbGltaW5hdGUgbWlzcGxhY2VkICNpZiAwIGNvZGUuCisJKGJmZF9vcGVuciwgYmZkX29wZW53KTogIEFjdHVhbGx5IG9wZW4gdGhlIGZpbGUsIGdpdmUgZXJyb3Igbm93LgorCisJKiBzdW5vcy5jIChzdW5vczRfY29yZV9maWxlX3ApOiAgU2V0IHNlY3Rpb24gY291bnQuCisJKHN1bm9zNF9zZXRfc2VjdGlvbl9saW5lbm9zLCBzdGFiX25hbWVzLCBmcHJpbnRfbmFtZSk6ICBFbGltaW5pYXRlCisJb2Jzb2xldGUgZGVmaW5pdGlvbnMuCisJKF93cml0ZV9zeW1ib2xfdGFibGUpOiAgSW5pdGlhbGl6ZSA8aWR4PiBjb3VudGVyLgorCShmb29wKTogIEVsaW1pbmF0ZSBkZWJ1Z2dpbmcgY29kZS4KKwwKK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IGNoYW5nZS1sb2cKK2xlZnQtbWFyZ2luOiA4CitmaWxsLWNvbHVtbjogNzQKK3ZlcnNpb24tY29udHJvbDogbmV2ZXIKK0VuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTQ5NSBiL2JmZC9DaGFuZ2VMb2ctOTQ5NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY4NTgzCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL0NoYW5nZUxvZy05NDk1CkBAIC0wLDAgKzEsMTAwNDMgQEAKK1RodSBEZWMgMjEgMTI6NDM6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgYSBwaG9ueSByZWxvYyB0byBoYW5kbGUgdGhlCisJb2xkIHN0eWxlIFRPQzE2IHJlZmVyZW5jZXMgd2l0aG91dCB1c2luZyBSX1BQQ19HT1QuCisJKHBwY19yZWxvY190eXBlKTogRGl0dG8uCisJKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgc3VwcG9ydCBmb3IgVE9DMTYuCisJKHBwY19lbGZfdG9jMTZfaW5uZXIpOiBSZW5hbWVkIGZyb20gcHBjX2VsZl9nb3QxNl9pbm5lci4KKwkocHBjX2VsZl90b2MxNl9yZWxvYyk6IFJlbmFtZWQgZnJvbSBwcGNfZWxmX3RvYzE2X3JlbG9jLgorCShwcGNfZWxmX2dvdDE2X3tpbm5lcixyZWxvY30pOiBTdHVicyBmb3IgcmVhbCBHT1Qgc3VwcG9ydC4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24gZm9yIEdPVC9QTFQgc3VwcG9ydCB0aGF0IGlzCisJd29yayBpbiBwcm9ncmVzcy4KKwkocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEaXR0by4KKwkocHBjX2VsZl9hZGp1c3RfZHluaW5keCk6IERpdHRvLgorCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERpdHRvLgorCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERpdHRvLgorCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGl0dG8uCisJKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKTogRGVmaW5lLgorCitXZWQgRGVjIDIwIDE5OjE0OjE4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAoY29weV9wcml2YXRlX2JmZF9kYXRhKTogV2hlbiBhdHRhY2hpbmcgc2VjdGlvbnMgdG8KKwlzZWdtZW50cyBpZ25vcmUgc2VjdGlvbnMgdGhhdCB3b24ndCBiZSBhbGxvY2F0ZWQuICBQYXRjaCBmcm9tCisJQW5kcmVhcyBTY2h3YWIuCisKK1R1ZSBEZWMgMTkgMjA6MDE6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IE1hdGNoIG9uIG02OGstY2JtLSogb25seSBpZiBPUyBkb2Vzbid0IG1hdGNoCisJYW55dGhpbmcgZWxzZS4KKworVHVlIERlYyAxOSAxNjozODo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaTk2MC5jIChDQUxDX0FEREVORCk6IERlZmluZS4KKwkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgdGhlIGlucHV0IHNlY3Rpb24gVk1BIHRvIHRoZQorCWFkZGVuZCBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLgorCitTdW4gRGVjIDE3IDIwOjExOjU1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKHBlX3ByaW50X3BkYXRhKTogTXVzdCB0ZXN0IHRoZSBlbnRpcmUgZW50cnkgZm9yIHplcm8KKwl0byBjb3JyZWN0bHkgdGVybWluYXRlLgorCitGcmkgRGVjIDE1IDEyOjA1OjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0cy5jIChlbnVtIGJmZF9lbmRpYW4pOiBEZWZpbmUuCisJKGJmZF90YXJnZXQpOiBSZW5hbWUgYnl0ZW9yZGVyX2JpZ19wIHRvIGJ5dGVvcmRlciwgYW5kIGNoYW5nZSBpdAorCWZyb20gYm9vbGVhbiB0byBlbnVtIGJmZF9lbmRpYW4uICBDaGFuZ2UgaGVhZGVyX2J5dGVvcmRlcl9iaWdfcAorCWNvcnJlc3BvbmRpbmdseS4KKwkqIGJmZC1pbi5oIChiZmRfYmlnX2VuZGlhbiwgYmZkX2xpdHRsZV9lbmRpYW4pOiBOZXcgbWFjcm9zLgorCShiZmRfaGVhZGVyX2JpZ19lbmRpYW4sIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbik6IE5ldyBtYWNyb3MuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBBbGwgdGFyZ2V0czogQ2hhbmdlIGluaXRpYWxpemF0aW9uIG9mIGJ5dGVvcmRlciBhbmQKKwloZWFkZXJfYnl0ZW9yZGVyIHRvIHVzZSBlbnVtIGJmZF9lbmRpYW4gdmFsdWVzIHJhdGhlciB0aGFuCisJYm9vbGVhbnMuCisJKiBBbGwgZmlsZXM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBieXRlb3JkZXJfYmlnX3AgYW5kCisJaGVhZGVyX2J5dGVvcmRlcl9iaWdfcCB0byB1c2UgbmV3IGJmZF8qX2VuZGlhbiBtYWNyb3MuCisKKwkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogU2V0IGxtYSB0byBzX3BhZGRyLCBub3QKKwlzX3ZhZGRyLgorCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgc19wYWRkciB0byBsbWEsIG5vdAorCXZtYS4KKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCisKK0ZyaSBEZWMgMTUgMDc6MzI6MDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogcGVbaV0taTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IERlZmluZSB0byAnXycuCisKK1RodSBEZWMgMTQgMTM6NDU6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmM6IExvdHMgb2YgbWlub3IgY2xlYW51cHMuICBNYWtlIG1hbnkgZnVuY3Rpb25zIHJldHVybgorCWVycm9ycyByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LiAgQWxzbzoKKwkoaWVlZV93cml0ZV90d29ieXRlKTogUmVtb3ZlOyBjaGFuZ2UgY2FsbGVycyB0byBjYWxsIGV4aXN0aW5nCisJaWVlZV93cml0ZV8yYnl0ZXMgZnVuY3Rpb24uCisJKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IERvbid0IG91dHB1dCB0aGUgc2VjdGlvbiB0d2ljZSB3aGVuCisJb3V0cHV0dGluZyBhIGxvY2FsIHN5bWJvbC4gIERvbid0IGVtaXQgYW4gZXh0cmFuZW91cyB6ZXJvIGlmIHRoZXJlCisJaXMgb25seSBvbmUgdGVybS4KKwkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFNldCB0aGUgbG1hIGFzIHdlbGwgYXMgdGhlIHZtYS4KKwkoaWVlZV9hcmNoaXZlX3ApOiBVc2UgYmZkX2FsbG9jX2dyb3cgcmF0aGVyIHRoYW4gYW4gb2JzdGFjay4KKworCSogaWhleC5jIChpaGV4X3NldF9hcmNoX21hY2gpOiBEb24ndCBhY2NlcHQgYW55IGFyY2hpdGVjdHVyZSwganVzdAorCWEgcmVjb2duaXplZCBvbmUgb3IgYmZkX2FyY2hfdW5rbm93bi4KKwkoaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbCwgdG8gcGVybWl0IG9iamNvcHkKKwl0byBzdWNjZWVkLgorCShpaGV4X2dldF9zeW10YWIpOiBMaWtld2lzZS4KKworV2VkIERlYyAxMyAxNTo0NDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXR4Lmg6IEluY2x1ZGUgPGN0eXBlLmg+LgorCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlKTogRGVmaW5lLgorCShzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyk6IERlZmluZS4KKwkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSk6IERlZmluZS4KKwkoYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCk6IERlZmluZSBtYWNyby4KKwkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGluY2x1ZGVzIGZpZWxkLgorCShhb3V0X2xpbmtfaW5jbHVkZXNfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IEluaXRpYWxpemUgaW5jbHVkZXMgaGFzaCB0YWJsZS4KKwkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBFbGltaW5hdGUgZHVwbGljYXRlIE5fQklOQ0wgZW50cmllcy4KKworV2VkIERlYyAxMyAxMDo1MjoxNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW46IE1hdGNoIG9uIG1pcHMtKi0qIGluc3RlYWQgb2YgbWlwcy1pZHQtZWNvZmYuCisKK1dlZCBEZWMgMTMgMTE6MDc6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiByZW1vdmVkIGRlYnVnZ2luZyBjb2RlLgorCitUdWUgRGVjIDEyIDE3OjQyOjA2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKHBlX3ByaW50X3JlbG9jKTogTmV3IGZ1bmN0aW9uIHRvIGR1bXAgdGhlIC5yZWxvYyBzZWN0aW9uLgorCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbCBwZV9wcmludF9yZWxvYy4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogLnJlbG9jIHNlY3Rpb24gYWxpZ25tZW50LgorCSogY29mZi1wcGMuYyAoaW5fcmVsb2NfcCk6IEFkZGVkIG1pc3Npbmcgbm9uLWVsaWdpYmxlIHJlbG9jcy4gU3BpZmZlZAorCXVwIHNvbWUgZGVidWdnaW5nIGFzIHdlbGwuCisKK1R1ZSBEZWMgMTIgMTE6MzQ6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkOiBIYW5kbGUgc3BhcmMtKi1lbGYqLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCisJPHJmZ0Btb25rZXlzLmNvbT4uCisKK0ZyaSBEZWMgIDggMTc6NDc6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBzZWN0aW9uX2NvdW50IHRvIDAKKwl3aGVuIHNldHRpbmcgc2VjdGlvbnMgdG8gTlVMTC4KKworV2VkIERlYyAgNiAxNzowNTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jIChzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8pOiBBZGQgZXhwb3J0X2RlZmluZWRzCisJZmllbGQuCisJKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgZXhwb3J0X2RlZmluZWRzIHBhcmFtZXRlci4KKwkoeGNvZmZfYnVpbGRfbGRzeW1zKTogSWYgZXhwb3J0X2RlZmluZWRzIGlzIHNldCwgc2V0IFhDT0ZGX0VYUE9SVAorCWZvciBhbGwgc3ltYm9scy4KKwkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitNb24gRGVjICA0IDE2OjQwOjQ3IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRmJ3MKKworTW9uIERlYyAgNCAxMToyNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGloZXguYyAoaWhleF9zY2FuKTogSGFuZGxlIHJlY29yZCB0eXBlcyA0IGFuZCA1LgorCShpaGV4X29iamVjdF9wKTogUGVybWl0IHR5cGVzIDQgYW5kIDUuCisJKGloZXhfc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgY2hlY2sgZm9yIG91dCBvZiByYW5nZQorCWFkZHJlc3Nlcy4KKwkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBHZW5lcmF0ZSB0eXBlcyA0IGFuZCA1LgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBKdXN0IGlnbm9yZSB3YXJuaW5nIGFuZAorCWluZGlyZWN0IHJlZmVyZW5jZXMgdG8gc3ltYm9scyB3aGljaCBkb24ndCByZWFsbHkgZXhpc3QuCisKK1N1biBEZWMgIDMgMTk6MDA6MjcgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBNaW5vciBmb3JtYXQgZml4ZXMKKwkocGVfcHJpbnRfZWRhdGEpOiBOZXcgZnVuY3Rpb24uIFVuZGVyIHByaXZhdGUgcHJpbnRpbmcsIHRoaXMgZm9ybWF0cworCXRoZSBlZGF0YSBzZWN0aW9uIG9mIGEgUEUgZmlsZS4KKwkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIGNhbGwgdG8gcGVfcHJpbnRfZWRhdGEuCisKK1N1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorCisJKiBhb3V0LWFybS5jIChNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgS0VFUElUIHRvIGdldCB0aGUgc3ltYm9sCisJaW5kZXgsIGRvbid0IGNhbGwgc3RvaS4KKworRnJpIERlYyAgMSAxNDo0Njo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNyZWMuYyAoc3JlY19zY2FuKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KKworCSogaWhleC5jOiBOZXcgZmlsZTsgc3VwcG9ydCBmb3IgSW50ZWwgSGV4IGZvcm1hdC4KKwkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ci4KKwkoaWhleF92ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFsd2F5cyBpbmNsdWRlIGloZXhfdmVjLgorCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGloZXhfZGF0YSBmaWVsZCB0byB0ZGF0YSB1bmlvbi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQkZEX0xJQlMpOiBBZGQgaWhleC5vCisJKEJGRF9MSUJTX0NGSUxFUyk6IEFkZCBpaGV4LmMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogU29ydCB0aGUgc2VjdGlvbnMgaW4KKwllYWNoIHNlZ21lbnQuCisJKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmV0dXJuIHRoZSByaWdodCBzaXplIGlmIHNlZ21lbnRfbWFwIGlzCisJbm90IE5VTEwuCisJKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzZWN0aW9ucy4KKworCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IE5ldyBmdW5jdGlvbi4KKwkqIGJmZC1pbi5oIChiZmRfcmVjb3JkX3BoZHIpOiBEZWNsYXJlLgorCSogYmZkX2luMi5oOiBSZWJ1aWxkLgorCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGJvZ3VzCisJQkZEX0FTU0VSVC4KKworCSogbGliYmZkLmMgKGJmZF9tYWxsb2MsIGJmZF9yZWFsbG9jKTogTmV3IGZ1bmN0aW9ucy4KKwkoYmZkX3ptYWxsb2MpOiBSZXR1cm4gUFRSLCBub3QgY2hhciAqLiAgVGFrZSBzaXplX3QsIG5vdAorCWJmZF9zaXplX3R5cGUuCisJKiBsaWJiZmQtaW4uaCAoYmZkX21hbGxvYywgYmZkX3JlYWxsb2MpOiBEZWNsYXJlLgorCShiZmRfem1hbGxvYyk6IENoYW5nZSBkZWNsYXJhdGlvbi4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogTWFueSBmaWxlczogVXNlIGJmZF9tYWxsb2MgYW5kIGJmZF9yZWFsbG9jIHJhdGhlciB0aGFuIG1hbGxvYworCWFuZCByZWFsbG9jLiAgRG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgdGhleSBmYWlsLgorCitUaHUgTm92IDMwIDE5OjMyOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBjb2ZmLXBwYy5jOiBBZGRlZCBtYWNyb3MgdG8gdGlkeSB1cCB0b2MgY2VsbCB0cmVhdG1lbnQuIE51bWVyb3VzCisJdXNlcyBhcyB3ZWxsLiBBZGRlZCBhIG5ldyBob3d0byB0byBkZWFsIHdpdGggVE9DUkVMMTYgcmVsb2NzIHRoYXQKKwlhcmUgVE9DREVGTiBhcyB3ZWxsLgorCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRXhwYW5kZWQgdHJlYXRtZW50IG9mIEFERFIzMk5CIHJlbG9jcworCXRvIGhhbmRsZSBSVkEgcmVsb2NzIGZyb20gZGxsdG9vbC4KKwkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgorCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCisJKHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KKworCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBjaGVjayBpZGF0YSRYIHNlY3Rpb25zCisJdG8gZ2V0IHRoZSByaWdodCBzZWN0aW9uIGFsaWdubWVudC4KKworVGh1IE5vdiAzMCAxNjo0ODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3Qgc2V0IGxtYSBiYXNlZCBvbgorCXBfcGFkZHIgaWYgcF9wYWRkciBpcyB6ZXJvLgorCShtYWtlX21hcHBpbmcpOiBTZXQgaW5jbHVkZXNfZmlsZWhkciBhbmQgaW5jbHVkZXNfcGhkcnMgZm9yIGZpcnN0CisJUFRfTE9BRCBzZWdtZW50LgorCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBTZXQgaW5jbHVkZXNfcGhkcnMgZm9yIFBUX1BIRFIKKwlzZWdtZW50LgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSGFuZGxlIGluY2x1ZGVzX2ZpbGVoZHIgYW5kCisJaW5jbHVkZXNfcGhkcnMuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiBQVF9QSERSIGFuZCBmaXJzdAorCVBUX0xPQUQgc2VnbWVudHMuCisJKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNldCBpbmNsdWRlc19maWxlaGRyIGFuZCBpbmNsdWRlc19waGRyCisJd2hlbiBhcHByb3ByaWF0ZS4gIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBUX1BIRFIgc2VnbWVudC4KKwlVc2UgYSBtb3JlIGNvbXBsZXggY29uZGl0aW9uIGZvciB3aGVuIGEgc2VjdGlvbiBpcyBpbmNsdWRlZCBpbiBhCisJc2VnbWVudCB0byBoYW5kbGUgU29sYXJpcyBsaW5rZXIgb2RkaXRpZXMuCisKK1RodSBOb3YgMzAgMTE6MTc6MzMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIGNvZmYtbTg4ay5jIChob3d0b190YWJsZSk6IFJlZm9ybWF0dGVkIGZvciBlYXNpZXIgcmVhZGluZzsKKwlzcGVjaWFsX2Z1bmN0aW9uIG5vdyBwb2ludHMgdG8gbmV3IGZ1bmN0aW9uIG04OGtfc3BlY2lhbF9yZWxvYy4KKwkoaG93dG9faHZydDE2KTogRnVuY3Rpb24gcHJldmlvdXNseSB1c2VkIGZvciBoYW5kbGluZyBIVlJUMTYgcmVsb2NzCisJcmVtb3ZlZC4KKwkocnR5cGUyaG93dG8pOiBEbyBub3QgYWRkIHJlbG9jJ3Mgcl9vZmZzZXQgdG8gdGhlIGFkZGVuZCwgdGhpcyB3aWxsCisJYmUgZG9uZSBjb3JyZWN0bHkgYnkgbTg4a19zcGVjaWFsX3JlbG9jLgorCShyZWxvY19wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgUkVMT0NfUFJPQ0VTU0lORy4KKwkoUkVMT0NfUFJPQ0VTU0lORyk6IERlZmluZSB0byBjYWxsIHJlbG9jX3Byb2Nlc3NpbmcuCisKK1dlZCBOb3YgMjkgMTI6NDI6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQ2FsbCBtYWxsb2MgcmF0aGVyIHRoYW4geG1hbGxvYy4KKwkocGVfcHJpbnRfcGRhdGEpOiBMaWtld2lzZS4KKworCSogb3BuY2xzLmMgKGJmZF9hbGxvY19ieV9zaXplX3QpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZgorCW9ic3RhY2tfYWxsb2MgZmFpbHMuCisJKGJmZF9hbGxvY19maW5pc2gpOiBTZXQgYmZkX2Vycm9yX25vX21lbW9yeSBpZiBvYnN0YWNrX2ZpbmlzaAorCWZhaWxzLgorCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgbWFsbG9jIGZhaWxzLgorCSogTWFueSBmaWxlczogZG9uJ3Qgc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgb25lIG9mIHRoZSBhYm92ZQorCXJvdXRpbmVzIGZhaWxzLgorCisJKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IGFkanVzdCBwX3BhZGRyCisJaWYgcF9wYWRkcl92YWxpZCBpcyBzZXQuCisJKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDYWxsIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KKworCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGaXggY2FzZSB3aGVyZSBleHRyYQorCXByb2dyYW0gaGVhZGVycyB3ZXJlIGFsbG9jYXRlZC4KKworCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCisJKiBlbGYtYmZkLmggKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgorCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0bworCV9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCisKKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbik6IERvbid0IGFib3J0IGlmCisJcl9zeW1uZHggaXMgUkVMT0NfU0VDVElPTl9OT05FIGZvciBhbiBBTFBIQV9SX0lHTk9SRSByZWxvYy4KKwlDaGFuZ2UgYSBSRUxPQ19TRUNUSU9OX0xJVEEgc3ltbmR4IHRvIFJFTE9DX1NFQ1RJT05fQUJTLgorCShhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCk6IENoYW5nZSBSRUxPQ19TRUNUSU9OX0FCUyB0bworCVJFTE9DX1NFQ1RJT05fTElUQSBmb3IgQUxQSEFfUl9JR05PUkUuCisJKGFscGhhX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgQUxQSEFfUl9JR05PUkUsIGRvbid0IGNoYW5nZQorCVJFTE9DX1NFQ1RJT05fQUJTIHRvIFJFTE9DX1NFQ1RJT05fTk9ORS4KKworVHVlIE5vdiAyOCAxNjo1OTo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgc2VnbWVudF9tYXAgZmllbGQuCisJKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWxmX3NvcnRfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBSZW1vdmUuCisJKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogUmVtb3ZlIHNvcnRlZF9oZHJzLCBjb3VudCwgYW5kCisJbWF4cGFnZXNpemUgcGFyYW1ldGVycy4gIFNpbXBsaWZ5LgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFdoZW4gZ2VuZXJhdGluZyBhbgorCWV4ZWN1dGFibGUsIHVzZSBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzLgorCShlbGZfc29ydF9oZHJzKTogUmVtb3ZlLgorCShfYmZkX2VsZl9zaXplb2ZfaGVhZGVycyk6IFJlbW92ZSBlbGltaW5hdGVkIHBhcmFtZXRlcnMgZnJvbSBjYWxsCisJdG8gZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuCisKK01vbiBOb3YgMjcgMTI6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBocDMwMGhwdXguYyAoTVkoY2FsbGJhY2spKTogU2V0IGxtYSBhcyB3ZWxsIGFzIHZtYS4KKworCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5KTogU2V0IGNvcnJlY3RseSwgdG8gMS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IFNldCBjb3JyZWN0bHksIHRvIDAuCisKK1dlZCBOb3YgMjIgMTI6MDI6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgorCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IExpa2V3aXNlLgorCShfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIFNUWVBfUkNPTlNULgorCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBIYW5kbGUgc2NSQ29uc3QuCisJKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fUkNPTlNULgorCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgorCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgorCShlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEhhbmRsZSBzY1JDb25zdC4KKwkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCisJKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBIYW5kbGUgLnJjb25zdCBzZWN0aW9uLgorCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgc2NSQ29uc3QuCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBIYW5kbGUgLnJjb25zdAorCXNlY3Rpb24uCisJKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9SQ09OU1QuCisKKwkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBPbmx5IHNldCB3cml0dGVuIGlmIHRoZQorCURFRl9EWU5BTUlDIGZsYWcgaXMgc2V0LgorCitUdWUgTm92IDIxIDEzOjI1OjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBob3N0LWFvdXQuYzogSWYgVFJBRF9IRUFERVIgaXMgZGVmaW5lZCwgaW5jbHVkZSBpdC4KKworVHVlIE5vdiAyMSAxMzowMzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KKwkoQkZEX0JJTkFSWV9GT1BFTik6IFJlcXVpcmUgQUNfQ0FOT05JQ0FMX1NZU1RFTS4KKwkoQkZEX05FRURfREVDTEFSQVRJT04pOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWd1cmUuaW46IFVzZSBCRkRfTkVFRF9ERUNMQVJBVElPTi4KKwkqIGFjY29uZmlnLmg6IFB1dCBORUVEX0RFQ0xBUkFUSU9OXyogaW4gQFRPUEAgc2VjdGlvbi4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgorCisJKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFyCisJc3BlY2lhbF9zZWN0aW9ucyBiZWZvcmUgcmV0dXJuaW5nIHdoZW4gY2FsbGVkIHdpdGggYSBub24gWENPRkYKKwlCRkQuCisKKwkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogU29ydCBjb21tb24gc3ltYm9scyB3aXRoCisJZ2xvYmFsIHN5bWJvbHMuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBwYWQgdGhlCisJcHJldmlvdXMgc2VjdGlvbiB0byBmb3JjZSBmaWxlIGFsaWdubWVudCB3aGVuIGNyZWF0aW5nIGFuCisJZXhlY3V0YWJsZS4KKworTW9uIE5vdiAyMCAxNDo1NDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYKKwlSUzYwMDBDT0ZGX0MsIHNldCB1cCB0aGUgLmRlYnVnIHNlY3Rpb24uCisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEFkanVzdCB0aGUgVE9DIGFuY2hvciB2YWx1ZQorCWlmIGl0IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgZW50aXJlIFRPQyBhcmVhIHdpdGgKKwlzaWduZWQgMTYgYml0IG9mZnNldHMuCisJKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBIYW5kbGUgbmVnYXRpdmUgVE9DIG9mZnNldHMgaW4gZ2xvYmFsCisJbGlua2FnZSBjb2RlLgorCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QgYQorCVRPQyBhbmNob3IgdG8gdXNlIHRoZSBUT0MgdmFsdWUgdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCisKK1NhdCBOb3YgMTggMTg6MDE6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IENhc3QgbWFsbG9jIHJldHVybi4KKwkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCisKK1NhdCBOb3YgMTggMTk6NDM6MDQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorCisJKiBwZS1hcm0uYzogRml4IHR5cG9zLgorCSogY29mZi1hcm0uYzogTGlrZXdpc2UuCisKK0ZyaSBOb3YgMTcgMTY6MjI6MDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvZmYtcHBjLmMgKGxpc3RfZWxlKTogQWRkZWQgImNhdCJlZ29yeSBtZW1iZXIuCisJKHJlY29yZF90b2MpOiBOZXcgY2F0ZWdvcnkgcGFyYW1ldGVyIChwcml2IG9yIHB1YikuCisJKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogQ2hlY2sgdG8gc2VlIGlmIHRvYyBib3VuZHMgZXhjZWVkZWQuCisJKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlZCBlbWJyaW9uaWMgZGF0YS1pbi10b2MgZnJvbQorCXRoZSBtYWlubGluZS4gSXQgYWRkZXMgZXh0cmEgdG9jIGNlbGxzIGluIGVycm9yLgorCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogQWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLgorCShkdW1wX3RvYyk6IENhbiBub3cgZGlhZ25vc2UgInZpcnR1YWwgdG9jIiBjaGljYW5lcnkuCisKK0ZyaSBOb3YgMTcgMTA6NDE6MjUgMTk5NSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSB0eXBlIG9mCisJZHluc3ltY291bnQgYW5kIGJ1Y2tldGNvdW50IGZpZWxkcyBmcm9tIHNpemVfdCB0byBiZmRfc2l6ZV90eXBlLgorCitGcmkgTm92IDE3IDEwOjAyOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogSTk2MCB2ZXJzaW9uOiBkb24ndAorCXBvaW50ZXJpemUgQ19MRUFGU1RBVCBvciBDX0xFQUZFWFQgZW50cmllcy4KKworCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE9ubHkgY3JlYXRlCisJRFRfSU5JVCBhbmQgRFRfRklOSSBlbnRyaWVzIGlmIHRoZSBfaW5pdCBvciBfZmluaSBzeW1ib2wgaXMKKwlkZWZpbmVkIG9yIG1lbnRpb25lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KKworVGh1IE5vdiAxNiAxNToxNjo0MiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF9kYXRhX2luX3RvY19lbnRyeSk6IG5ldyBmdW5jdGlvbgorCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFRPQ0RFRk4gYXR0cmlidXRlCisJKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IFJFTDI0IGhhbmRsaW5nCisJKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogQ29ycmVjdCBUT0NERUZOIGhhbmRsaW5nCisKKwkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkZWQgbmFtZSBkZXNjcmlwdGlvbnMKKworVGh1IE5vdiAxNiAwMzozODowMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogVkVSU0lPTjogVXBkYXRlZCB0byBjeWdudXMtMi42LgorCitXZWQgTm92IDE1IDE5OjMwOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiB0YXJnZXRzLmMgKG02OGs0a25ldGJzZF92ZWMpOiBEZWNsYXJlLgorCitXZWQgTm92IDE1IDE4OjA1OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIGFyZ3VtZW50IHRvCisJX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIGZyb20gdm9pZCAqIHRvIFBUUi4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0CisJdXNpbmcgUFRSIHJhdGhlciB0aGFuIHZvaWQgKi4KKwkqIGJmZC1pbjIsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogcGVpY29kZS5oIChwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2hhbmdlIHZmaWxlIGZyb20gdm9pZCAqCisJdG8gUFRSLgorCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcworCV9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSByYXRoZXIgdGhhbiBjYXN0aW5nCisJYmZkX3RydWUuCisKK1dlZCBOb3YgMTUgMDQ6MDk6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICguZGVwMSk6IEZpeCBzdHVwaWQgdHlwbyBpbiBsYXN0IGNoYW5nZS4gIFJlbW92ZSBhbnkKKwkiRE8gTk9UIERFTEVURSIgbGluZXMgb3IgYmxhbmsgbGluZXMgdGhhdCBta2RlcCB3cml0ZXMgb24gc29tZQorCXN5c3RlbXMuCisJKEJGRF9MSUJTX0NGSUxFUywgQUxMX01BQ0hJTkVTX0NGSUxFUywgQkZEMzJfQkFDS0VORFNfQ0ZJTEVTLAorCUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCisJKENGSUxFUyk6IFVzZSB0aGVtLgorCitUdWUgTm92IDE0IDExOjUyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgUFBDIFBFLCBzdGFydCBpc2l6ZSBhdCAwLAorCW5vdCBhdCB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQXZvaWQgdXNpbmcKKwl1bnBvcnRhYmxlICNlbGlmLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFdoZW4gZ2VuZXJhdGluZyBhIFBQQyBQRSBleGVjdXRhYmxlCisJd2l0aCBubyBzeW1ib2xzLCByb3VuZCB1cCB0aGUgZmlsZSBzaXplIHRvIGEgQ09GRl9QQUdFX1NJWkUKKwlib3VuZGFyeS4KKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsCisJZG9uJ3Qgd3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLgorCisJKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogV2hlbiB1c2luZyBhIGRpZmZlcmVudCBzZWN0aW9uCisJaGVhZGVyLCBwYXNzIHRoZSBuZXcgb25lIHRvIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCisJKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gYW5kIHNoX2VudHNpemUgZmllbGRzLgorCShlbGZfbWFwX3N5bWJvbHMpOiBBZGQgc2VjdGlvbiBWTUEgdG8gc3ltYm9sIHZhbHVlIHdoZW4gY29tcGFyaW5nCisJYWdhaW5zdCAwLgorCShfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGJ1aWxkIHN5bWJvbCB0YWJsZQorCWlmIHRoZXJlIGFyZSBzb21lIHN5bWJvbHMuICBTZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKKwlzZWN0aW9ucy4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBSZW1vdmUgZG9zeW1zIHBhcmFtZXRlci4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMuICBOZXZlciBzZXQgZmlsZSBvZmZzZXQgb2Ygc3ltdGFiIGFuZCBzdHJ0YWIKKwlzZWN0aW9ucy4KKwkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KKwkoTUFQX09ORVNZTVRBQiwgTUFQX0RZTlNZTVRBQiwgTUFQX1NUUlRBQiwgTUFQX1NIU1RSVEFCKTogRGVmaW5lLgorCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBOZXcgZnVuY3Rpb24uCisJKHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3Igc3BlY2lhbCBtYXBwaW5nIG9mIHN0X3NobmR4IGNyZWF0ZWQgYnkKKwljb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuCisJKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBjb3B5IHJvdXRpbmVzLgorCSogZWxmLWJmZC5oIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVjbGFyZS4KKworCSogY29uZmlnLmJmZCAoc2gtKi0qKTogU2V0IHRhcmdfZGVmdmVjIHRvIHNoY29mZl92ZWMuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgQ09GRl9XSVRIX1BFLCBoYW5kbGUKKwlDX05UX1dFQUsuCisKKwkqIGNvZmYtc2guYyAoc2hsY29mZl92ZWMpOiBVc2UgX2JmZF9nZW5lcmljX2FyY2hpdmVfcCwgbm90CisJX2JmZF9kdW1teV90YXJnZXQsIG1hdGNoaW5nIHRoZSByZWNlbnQgY2hhbmdlIHRvIGFyY2hpdmUKKwlyZWNvZ25pdGlvbi4KKworTW9uIE5vdiAxMyAxMzoyNDozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXNlIGNhc3RzIHRvIGF2b2lkIGRvaW5nCisJYXJpdGhtZXRpYyBvbiBQVFIgdHlwZXMuCisKKwkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgbG1hIG9mIHRoZSBzZWN0aW9ucy4KKworCSogZWNvZmYuYyAoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IFR1cm4gYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZAorCXN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbi4KKworTW9uIE5vdiAxMyAwNzozMTozNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29mZi1wcGMuYyAocHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgc3VwcG9ydCBmb3IgaW5saW5lCisJZ2x1ZSBmb3IgdGhlIHJlbG9jczogSU1HTFVFIGFuZCBJRkdMVUUuCisJKHJlY29yZF90b2MpOiBuZXcgZnVuY3Rpb24gLSB0cmFja3MgdG9jIGNvbnRlbnRzCisJKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogbmV3IGZ1bmN0aW9uIC0gc3VwcG9ydHMgdGhlIElNR0xVRSByZWxvYworCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgc3VwcG9ydCBhbmQgZml4ZXMgZm9yIElNR0xVRS9JRkdMVUUKKwkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKKwkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiByZW1vdmVkIGludmFsaWQgSU1HTFVFIGhhY2sKKwkocHBjX3JlY29yZF90b2NfZW50cnkpOiBSZW1vdmVkIGEgZGVidWcgZGVmaW5lIChkdWgpCisKKwkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBGaXhlZCBpbnZhbGlkIHN0cmNtcCBmb3IgIi5yZWxkYXRhIgorCShwZV9wcmludF9pZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIGlkYXRhIHNlY3Rpb24gZGF0YQorCShwZV9wcmludF9wZGF0YSk6IE5ldyBmdW5jdGlvbiAtIGZvcm1hdHMgdGhlIHBkYXRhIHNlY3Rpb24gZGF0YQorCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogY2FsbHMgdG8gYWJvdmUKKworU3VuIE5vdiAxMiAxMjoyMzoyNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChiZmRfbGlic19oZXJlLCBldGMpOiBQcm92aWRlIGVtcHR5IGRlZmluaXRpb25zLgorCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBBZGQgY29uZGl0aW9uYWwgZGVmaW5lcworCVRBUkdFVF9TWU0gYW5kIFRBUkdFVF9OQU1FIGZvciB2ZWN0b3IgYW5kIEJGRCBuYW1lLgorCSogY29mZi1wbWFjLmMgKHBtYWNfeGNvZmZfdmVjKTogUmVtb3ZlLgorCShUQVJHRVRfU1lNLCBUQVJHRVRfTkFNRSk6IERlZmluZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBbUE9XRVJNQUNdOiBTZXQgdGhlCisJbWFjaGluZSB0byAwLCBub3QgYWxsIFBvd2VyTWFjcyBhcmUgNjAxcy4KKworRnJpIE5vdiAxMCAxMjoxMDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVhZCBpbiBhbnkgcHJvZ3JhbSBoZWFkZXJzLgorCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGp1c3Qgc2VjdGlvbiBsbWEKKwliYXNlZCBvbiB0aGUgcHJvZ3JhbSBoZWFkZXJzLCBpZiBhbnkuCisJKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2FkZHIgZnJvbSB0aGUgdm1hLCBub3QgdGhlIGxtYS4KKwkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBTZXQgcF9wYWRkciBvZiBwcm9ncmFtIGhlYWRlcnMgYmFzZWQgb24KKwl0aGUgbG1hLgorCitUaHUgTm92ICA5IDEzOjAxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBQcmVzZXJ2ZSB0ZGF0YSBpbiBjYXNlIG9mCisJZmFpbHVyZS4KKworCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogUmVwb3J0IGEgcmVhc29uYWJsZSBlcnJvciB3aGVuCisJdHJ5aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBhIG5vbi1hLm91dCBvYmplY3QgZmlsZS4KKworCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUKKwlpbiBhbiBhcmNoaXZlIGV2ZW4gaWYgdGFyZ2V0X2RlZmF1bHRlZCBpcyBzZXQuICBJZiB0aGUgb2JqZWN0IGZpbGUKKwloYXMgdGhlIHdyb25nIHh2ZWMsIHJlamVjdCBpdC4KKworCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6IElmIGEgc2VjdGlvbiBjYW4gbm90CisJYmUgcmVwcmVzZW50ZWQsIHJlcG9ydCB0aGUgbmFtZSB2aWEgX2JmZF9lcnJvcl9oYW5kbGVyLgorCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogTGlrZXdpc2UuCisJKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFdyaXRlIFJTNjAwMENPRkZfQyB2ZXJzaW9uCisJd2hpY2ggY2hlY2tzIGZvciBTVFlQX09WUkZMTyBzZWN0aW9ucy4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZQorCXJlbG9jIGFuZCBsaW5lbm8gY291bnQgb3ZlcmZsb3dzLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgY29mZl9jb3VudF9saW5lbnVtYmVycyBiZWZvcmUKKwljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIElmIFJTNjAwMENPRkZfQywgaGFuZGxlCisJcmVsb2MgYW5kIGxpbmVubyBjb3VudCBvdmVyZmxvd3MuCisJKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENvdW50IGxpbmUgbnVtYmVycyBhbmQKKwlyZWxvY3MgYmVmb3JlIGRlYWxpbmcgd2l0aCAucGFkIHNlY3Rpb25zLiAgQ291bnQgb3ZlcmZsb3cgc2VjdGlvbgorCWhlYWRlcnMgd2hlbiBoYW5kbGluZyAucGFkIHNlY3Rpb25zLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBhLm91dCB2c3RhbXAgdG8gMQorCWlmIFJTNjAwMENPRkZfQy4KKworCSogeGNvZmZsaW5rLmMgKFhDT0ZGX0RFU0NSSVBUT1IpOiBEZWZpbmUuCisJKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZGVzY3JpcHRvcl9zZWN0aW9uIGFuZAorCXNwZWNpYWxfc2VjdGlvbnMgZmllbGRzLgorCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgorCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IGxpbmthZ2Ugc2VjdGlvbiBhbGlnbm1lbnQuICBDcmVhdGUKKwlkZXNjcmlwdG9yIHNlY3Rpb24uICBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzIChfdGV4dCwgZXRjLiksCisJYW5kIHJlY29yZCB0aGVtIGluIHNwZWNpYWxfc2VjdGlvbnMgaWYgZm91bmQuICBTZXQKKwlYQ09GRl9ERVNDUklQVE9SIGZsYWcgZm9yIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgYW5kIHNldCBpdHMKKwlkZXNjcmlwdG9yIGZpZWxkIHRvIHBvaW50IGJhY2sgdG8gdGhlIGZ1bmN0aW9uIGNvZGUgc3ltYm9sLgorCSh4Y29mZl9zd2VlcCk6IEFsd2F5cyBtYXJrIHRoZSBzcGVjaWFsIGRlc2NyaXB0b3Jfc2VjdGlvbi4KKwkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBDaGVjayB3aGV0aGVyIHRoZSBzeW1ib2wgbWlnaHQgYmUgYQorCWZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBtYXJrIGl0IGlmIGl0IGlzLgorCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIG5ldyBzcGVjaWFsX3NlY3Rpb25zCisJcGFyYW1ldGVyLCBhbmQgZmlsbCBpdCBpbi4gIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGVzY3JpcHRvcgorCXNlY3Rpb24uCisJKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnIHdoZW4gZGVmaW5pbmcKKwlnbG9iYWwgbGlua2FnZSBjb2RlLiAgSWYgYW4gdW5kZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IgaXMKKwlleHBvcnRlZCwgYXJyYW5nZSB0byBkZWZpbmUgaXQuICBXYXJuIGFib3V0IGFueSBvdGhlciB1bmRlZmluZWQKKwlleHBvcnRlZCBzeW1ib2wuCisJKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4KKwkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IENyZWF0ZSBhIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2hlbgorCW5lY2Vzc2FyeS4KKwkqIGJmZC1pbi5oIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitUaHUgTm92ICA5IDA4OjQwOjIzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBjb2ZmLXBwYy5jIChwcGNfY29mZl9saW5rX2hhc2hfZW50cnkpOiBuZXcgdHlwZXMgZm9yIGhhc2hpbmcKKwkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlKTogbmV3IHR5cGVzIGZvciBoYXNoaW5nCisJKHBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogaGFzaCBlbnRyeSBjb25zdHJ1Y3RvcgorCShwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IGhhc2ggdGFibGUgaW5pdGlhbGl6ZXIKKwkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IGhhc2ggdGFibGUgY29uc3RydWN0b3IKKwkocHBjX3JlY29yZF90b2NfZW50cnkpOiBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gaGFzaCB0YWJsZQorCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogY2hhbmdlZCByZWZlcmVuY2VzIHRvIGhhc2ggdGFibGUKKworCSogbGliY29mZi1pbi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IHJlbW92ZWQgdG9jX29mZnNldAorCSogbGliY29mZi5oOiBSZWJ1aWxkCisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0CisJKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IHJlbW92ZWQgdG9jX29mZnNldCBpbml0CisKK1RodSBOb3YgIDkgMDQ6MDA6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICguZGVwMSk6IE1ha2Ugc3VyZSB0aGUgZmlsZSBta2RlcCBpcyB0byB3cml0ZSBleGlzdHMKKwlmaXJzdC4KKworCSogY29uZmlndXJlLmluOiBBZGRlZCBuZXcgb3B0aW9uIC0td2l0aFtvdXRdLW1tYXAuICBTZXQgVVNFX01NQVAKKwlpZiBpdCBpcyBnaXZlbiBhbmQgbW1lcCBpcyBhdmFpbGFibGUuCisJKiBhY2NvbmZpZy5oOiBVbmRlZiBVU0VfTU1BUC4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KKwkqIGFvdXR4Lmg6IElmIFVTRV9NTUFQIGlzIG5vdCBkZWZpbmVkLCBkbyBhbGwgc3ltYm9sIGFuZCBzdHJpbmcKKwl0YWJsZSBoYW5kbGluZyB0aGUgb2xkIHdheS4KKwkoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IGNvbXBsYWluIGlmIGxhc3QgYnl0ZSBvZiBzdHJpbmcKKwl0YWJsZSBpcyBub256ZXJvLgorCSogbGliYmZkLmMgW0hBVkVfTUFEVklTRV06IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy9tbWFuLmguCisJKGJmZF9mcmVlX3dpbmRvdykgWyEgVVNFX01NQVBdOiBEb24ndCBkZWZpbmUuCisJKGJmZF9nZXRfZmlsZV93aW5kb3csCisJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykgWyEgVVNFX01NQVBdOiBBYm9ydC4KKworV2VkIE5vdiAgOCAyMDowMzo0NCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgorCisJKiBjb2ZmLWEyOWsuYyAoU0lHTl9FWFRFTkRfSFdPUkQpOiBVc2UgfjB4ZmZmZiByYXRoZXIgdGhhbgorCTB4ZmZmZjAwMDAuCisKK1dlZCBOb3YgIDggMTE6MzE6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IENoYW5nZSBoYW5kbGluZyBvZiBSX0lSRUwgcmVsb2MgdG8gYmUKKwljb21wYXRpYmxlIHdpdGggQU1EIGdlbmVyYXRlZCBDT0ZGIGZpbGVzLiAgVHJ5IHRvIHN1cHBvcnQgYm90aCBBTUQKKwlhbmQgR05VIGZvcm1hdHMgc2ltdWx0YW5lb3VzbHkuCisJKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHdyaXRhYmxlIHBhcmFtZXRlciBmcm9tCisJaW50IHRvIGJvb2xlYW47IHVwZGF0ZSBhbGwgY2FsbGVycy4gIFBhc3MgTUFQX1NIQVJFRCBpZiBub3QKKwl3cml0YWJsZS0taXQncyByZXF1aXJlZCBvbiBTb2xhcmlzLiAgQ2FzdCBmcHJpbnRmIGFyZ3VtZW50IHRvCisJYXZvaWQgd2FybmluZy4KKwkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogYW91dHguaDogVXBkYXRlIGNhbGxzIHRvIGJmZF9nZXRfZmlsZV93aW5kb3cuCisKKwkqIHhjb2ZmbGluay5jIChYQ09GRl9ERUZfRFlOQU1JQyk6IFJlbmFtZSBmcm9tIFhDT0ZGX1JFRl9EWU5BTUlDLgorCUNoYW5nZSBhbGwgdXNlcy4KKwkoeGNvZmZfc3dhcF9sZGhkcl9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHhjb2ZmX3N3YXBfbGRzeW1faW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh4Y29mZl9maW5kX3JlbG9jKTogSGFuZGxlIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHJlbG9jIGNvcnJlY3RseS4KKwkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IElmIHdlIGp1c3QgY3JlYXRlZCBhIGRlc2NyaXB0b3IsIHBhc3MgaXQKKwl0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCwgdG8gc2F2ZSBhIGhhc2ggbG9va3VwLgorCUhhbmRsZSBYVFlfRVIvWE1DX1hPIHN5bWJvbHMgY29ycmVjdGx5LgorCSh4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZXdyaXRlIHRvIHJlYWQgLmxvYWRlciBzeW1ib2xzCisJcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbCB0YWJsZS4KKwkoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBJdCdzIG5vdCBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzCisJYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgYWJzb2x1dGUgdmFsdWUuCisJKHhjb2ZmX21hcmspOiBXaGVuIGNvbnNpZGVyaW5nIGNhbGxlZCBzeW1ib2xzLCBjaGVjayB3aGV0aGVyIHRoZQorCWRlc2NyaXB0b3IgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCByYXRoZXIgdGhhbiB0aGUgc3ltYm9sCisJaXRzZWxmLgorCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBMaWtld2lzZS4KKworCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KKwlDYXN0IHJlYWxsb2MgYW5kIG1hbGxvYyByZXR1cm4gdmFsdWVzLiAgSWYgbWFsbG9jIG9yIHJlYWxsb2MgZmFpbCwKKwlzZXQgYmZkX2Vycm9yX25vX21lbW9yeS4KKwkqIGJmZC1pbi5oIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHR5cGUgdG8gYm9vbGVhbi4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworVHVlIE5vdiAgNyAxMTo1Mzo0OCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBuZXcgZnVuY3Rpb24uCisJKGluX3JlbG9jX3ApOiBjaGFuZ2VkIHJldHVybiB2YWx1ZS4KKwkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IG11Y2ggcmV3b3JrLgorCShwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBuZXcgZnVuY3Rpb24uCisJKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogbmV3IGZ1bmN0aW9uLgorCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogbmV3IGZ1bmN0aW9uLgorCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBpbml0aWFsaXplIHRvY19vZmZzZXQuCisJKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IGluaXRpYWxpemUgdG9jX29mZnNldC4KKworCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc3ltX2luKTogQWRkZWQgY29mZl9zd2FwX3N5bV9pbl9ob29rCisJKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEFkZGVkIG1vcmUgc2VjdGlvbnMgdG8gdGhlIGRhdGEKKwlkaWN0aW9uYXJ5IGZvciB0aGUgcGUgZmlsZSBoZWFkZXIuIEFsc28gY2hhbmdlZCBsaW5rZXIgdmVyc2lvbgorCW51bWJlciBvbiB0aGUgcHBjIHNpZGUuCisJKGRpcl9uYW1lcyk6IHNtYWxsIGltcHJvdmVtZW50cyB0byB0aGUgZGljdGlvbmFyeSBwcmludGluZy4KKwkocGVfbWtvYmplY3RfaG9vayk6IHNhdmUgdGhlIGZpbGUgbGV2ZWwgZmxhZ3MuCisKKwkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiBhZGRlZCB0b2Nfb2Zmc2V0IGZpZWxkCisJKHBlX3RkYXRhKTogYWRkZWQgcmVhbF9mbGFncyBmaWVsZAorCShjb2ZmX3RkYXRhKTogYWRkZWQgbG9jYWxfdG9jX3N5bV9tYXAgYW5kIGFjY2VzcyBtYWNybworCisJKiBsaWJjb2ZmLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgdG9jX29mZnNldCBmaWVsZAorCShwZV90ZGF0YSk6IGFkZGVkIHJlYWxfZmxhZ3MgZmllbGQKKwkoY29mZl90ZGF0YSk6IGFkZGVkIGxvY2FsX3RvY19zeW1fbWFwIGFuZCBhY2Nlc3MgbWFjcm8KKworCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBhZGRlZCBob29rIGZvciBQRS4KKwkoY29mZl9ta29iamVjdCk6IGluaXQgZm9yIGxvY2FsX3RvY19zeW1fbWFwCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IHRoZSBpbnRlcm5hbF9hLm1hZ2ljIHRvCisgICAgICAgIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyB3aGljaCBhcHBlYXJzIHRvIGJlIHdoYXQgb3RoZXIKKwlwcGMgY29tcGlsZXJzIHVzZS4KKworVHVlIE5vdiAgNyAxMzo0ODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogS2VlcCBsb29raW5nIHRocm91Z2ggc3RhYnMKKwllbnRyaWVzIHVudGlsIGJvdGggdGhlIGxpbmUgbnVtYmVyIGFkZHJlc3MgYW5kIHRoZSBmdW5jdGlvbiBuYW1lCisJYWRkcmVzcyBhcmUgdG9vIGxhcmdlLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfUFJPRyB0byBmaW5kIGFuZCBjYWNoZSBBUi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IGRlZmluZSBDQ19GT1JfQlVJTEQgaWYgaXQKKwlpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudC4KKworVHVlIE5vdiAgNyAxMDo1NzoyNCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KTogRGVmaW5lIHRvIHVzZQorCWdlbmVyaWMgdmVyc2lvbi4KKworTW9uIE5vdiAgNiAxNzoxMzoxNSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+CisKKwkqIGNvZmYtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY29mZi1pMzg2LmMuCisJKiBjcHUtaTg2MC5jOiBOZXcgZmlsZSwgYmFzZWQgb24gY3B1LWkzODYuYy4KKwkqIGhvc3RzL2k4NjBtYWNoMy5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaG9zdHMvaTM4Nm1hY2gzLmguCisJKiBjb25maWcuYmZkIChpODYwLSotbWFjaDMqLCBpODYwLSotb3NmMSosIGk4NjAtKi1jb2ZmKik6IE5ldworCXRhcmdldHMsIHVzaW5nIGk4NjBjb2ZmX3ZlYy4KKwkqIGNvbmZpZ3VyZS5pbiAoaTg2MC0qLW1hY2gzKiwgaTg2MC0qLW9zZjEqKTogTmV3IGhvc3RzLCB1c2luZworCXRyYWQtY29yZS5vIGFuZCBob3N0cy9pODYwbWFjaDMuaC4KKwkoaTg2MGNvZmZfdmVjKTogVXNlIGNvZmYtaTg2MC5vIGFuZCBjb2ZmbGluay5vLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShBTExfTUFDSElORVMpOiBBZGQgY3B1LWk4NjAuby4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1pODYwLm8uCisJKENGSUxFUyk6IEFkZCBjcHUtaTg2MC5jIGFuZCBjb2ZmLWk4NjAuYy4KKwkqIHRhcmdldHMuYyAoaTg2MGNvZmZfdmVjKTogRGVjbGFyZS4KKwkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmk4NjBjb2ZmX3ZlYy4KKwkqIGFyY2h1cmVzLmMgKGJmZF9pODYwX2FyY2gpOiBEZWNsYXJlLgorCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCAmYmZkX2k4NjBfYXJjaC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEk4NjAgbWFnaWMgbnVtYmVyLgorCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9pODYwLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBJODYwIGEub3V0IG1hZ2ljIG51bWJlci4KKworTW9uIE5vdiAgNiAxNDozNDowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgb2YKKwl0aGUgY3JlYXRlZCAudGMgc2VjdGlvbiB0byAyLgorCSh4Y29mZl9tYXJrKTogRG9uJ3Qga2VlcCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgY2FsbCB0byBhbgorCXVuZGVmaW5lZCBzeW1ib2wgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGdlbmVyYXRlCisJZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgYSBjYWxsIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wuCisKK1N1biBOb3YgIDUgMjE6NDQ6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBSZWJ1aWxkIGxpc3QgZnJvbSBCRkRfTElCUywgQUxMX01BQ0hJTkVTLAorCUJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUy4KKwkoLmRlcDEpOiBQdXQgbWtkZXAgb3V0cHV0IGluIGEgc2VwYXJhdGUgZmlsZS4KKwlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKworCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCk6IENhc3QgX2JmZF9yZWFkX2FyX2hkciByZXR1cm4KKwl2YWx1ZS4KKworCVBlcm1pdCB1c2Ugb2YgbW1hcCB3aGVuIGF2YWlsYWJsZToKKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbW1hcCwgbWFkdmlzZSwgbXByb3RlY3QuCisJKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKwkqIGxpYmJmZC5jIChzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwpOiBEZWZpbmUgdHlwZS4KKwkoYmZkX2luaXRfd2luZG93LCBiZmRfZnJlZV93aW5kb3csIGJmZF9nZXRfZmlsZV93aW5kb3cpOiBOZXcKKwlmdW5jdGlvbnMuCisJKG9rX3RvX21hcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUgZm9yIGRlYnVnZ2luZy4KKwkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IE5ldyBmdW5jdGlvbi4KKwkqIGJmZC1pbi5oIChiZmRfd2luZG93X2ludGVybmFsKTogRGVjbGFyZSB0eXBlLgorCShiZmRfd2luZG93KTogRGVmaW5lIHR5cGUuCisJKGJmZF9pbml0X3dpbmRvdywgYmZkX2ZyZWVfd2luZG93LCBiZmRfZ2V0X2ZpbGVfd2luZG93KTogRGVjbGFyZS4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KToKKwlEZWNsYXJlLgorCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCB0d28gd2luZG93IGZpZWxkcy4KKwkob2JqX2FvdXRfc3ltX3dpbmRvdywgb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyk6IE5ldyBtYWNyb3MuCisJKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBJbml0aWFsaXplIHdpbmRvd3MuCisJKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBHZXQgc3ltYm9sIGRhdGEgYW5kIHN0cmluZ3MgaW4KKwl3aW5kb3dzIGluc3RlYWQgb2YgZXhwbGljaXRseSBhbGxvY2F0ZWQgYnVmZmVycy4KKwkoc2x1cnBfc3ltYm9sX3RhYmxlKTogRnJlZSB3aW5kb3cgaW5zdGVhZCBvZiBtZW1vcnkuCisJKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogUmVsZWFzZSB3aW5kb3dzIGluc3RlYWQgb2YgZnJlZWluZyBzdG9yYWdlCisJZGlyZWN0bHkuCisJKGFvdXRfbGlua19mcmVlX3N5bWJvbHMpOiBEaXR0by4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIG5ldyBmaWVsZCBmb3IKKwlnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cuCisJKEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMpOiBVcGRhdGVkLgorCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBiaW5hcnkuYywgYm91dC5jLCBjb2ZmLWFscGhhLmMsCisJY29mZi1taXBzLmMsIGVsZnh4LXRhcmdldC5oLCBpMzg2bXNkb3MuYywgaTM4Nm9zOWsuYywgaWVlZS5jLAorCWxpYmNvZmYtaW4uaCwgb2FzeXMuYywgc3JlYy5jLCB0ZWtoZXguYywgdmVyc2Fkb3MuYzogQWRkZWQgbmV3CisJbWFjcm9zIGZvciBnZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgZmllbGQuCisKK1NhdCBOb3YgIDQgMTI6MjM6MjYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvcmUuYzogUmVuYW1lZCB0byBjb3JlZmlsZS5jCisJKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBDaGFuZ2UgY29yZS5vIHRvIGNvcmVmaWxlLm8KKwkqIE1ha2VmaWxlLmluIChDRklMRVMsIEJGRF9MSUJTKTogVXNlIGNvcmVmaWxlLmMgaW5zdGVhZCBvZiBjb3JlLmMKKworRnJpIE5vdiAgMyAxNTo1NDo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlIHN1YgorCXRvIG8uICBDbG9iYmVyIGFuZCByZXN0b3JlIHRoZSBsaXN0IG9mIG5ldyBjc2VjdHMgYXJvdW5kIHRoZSBjYWxsCisJdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wsIGluIGNhc2UgaXQgd2FudHMgdG8gcmVwb3J0IGEKKwlsaW5rZXIgZXJyb3IgYW5kIHRoZSBsaW5rZXIgd2FudHMgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgUmVzZXQKKwl0aGUgbGluZSBudW1iZXIgY291bnQgb2YgYSByZWFsIHNlY3Rpb24gZXZlbiBpZiBpdCBoYXMgbm8gcmVsb2NzLgorCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogSWYgc2hhcmVkLCBzZXQgdGhlIERZTkFNSUMgZmxhZy4KKworCSogY29mZmdlbi5jIChfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBXYXJuIGlmIHRoZSBzdHJpbmcgc2l6ZQorCWlzIHRvbyBzbWFsbC4KKworVGh1IE5vdiAgMiAyMzoxNjozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3Qgd2FybiBhYm91dAorCWFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYSBzaGFyZWQgbGluay4KKworCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQ29ycmVjdCB0eXBlIG9mCisJb2xkdHlwZSBmcm9tIGJmZF9saW5rX29yZGVyX3R5cGUgdG8gYmZkX2xpbmtfaGFzaF90eXBlLiAgRnJvbQorCXBoZG1AaW5mby51Y2wuYWMuYmUgKFBoaWxpcHBlIERlIE11eXRlcikuCisKK1dlZCBOb3YgIDEgMTQ6MjY6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIGNvZmYtbTg4ay5jIChydHlwZTJob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKFJUWVBFMkhPV1RPKTogVXNlIGl0IHJhdGhlciB0aGFuIGEgbWFjcm8gZGVmaW5pdGlvbi4KKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYworCXRvIFBBR0VNQUdJQ1BFWEVDUEFHRUQgI2lmIGRlZmluZWQgKE02OCkgJiYgIWRlZmluZWQgKExZTlhPUykuCisKKwkqIGNvbmZpZ3VyZS5pbjogbTY4Ki1tb3Rvcm9sYS1zeXN2KiBkb2VzIG5vdCB1c2UgcHRyYWNlLWNvcmUubzsKKwlkZWZpbmUgVFJBRF9IRUFERVIgdG8gbmV3IGZpbGUgaG9zdHMvZGVsdGE2OC5oLgorCW04OCotbW90b3JvbGEtc3lzdiosIGhvd2V2ZXIsIGRvZXMgdXNlIHB0cmFjZS1jb3JlLm8uCisJKiBob3N0cy9kZWx0YTY4Lmg6IE5ldyBmaWxlLgorCisJKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6IGNoYW5nZSBiZmRfem1hbGxvYyB0bworCWJmZF96YWxsb2M7IHByb3ZpZGUgcHJvcGVyIHBhcm0gYWJmZCB0byBjYWxscyB0byBiZmRfemFsbG9jLgorCitXZWQgTm92ICAxIDEzOjUxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBpMzg2bGludXguYyAoTVkodmVjKSk6IERlY2xhcmUgYmVmb3JlIHVzZS4KKworV2VkIE5vdiAgMSAxMTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgorCVBhc3MgaW5wdXRfYmZkLCBub3QgaW5fYmZkLCB0byBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzLgorCisJKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUKKwlCRkQgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgorCShiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCk6IExpa2V3aXNlLgorCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIHN1bm9zLmMgKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBMaWtld2lzZS4KKwkqIHhjb2ZmbGluay5jIChYQ09GRl9YVkVDUCk6IERlZmluZS4KKwkoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBCRkQgaXMgbm90CisJb2YgdGhlIHJpZ2h0IHR5cGUuCisJKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCisJKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogTGlrZXdpc2UuCisJKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogTGlrZXdpc2UuCisJKGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogTGlrZXdpc2UuCisJKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKworCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogT25seSBjaGVjayB0aGUgcmVsb2Mgc3ltYm9sCisJdGFibGUgaW5kZXggYWdhaW5zdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yIGEgYmFzZSByZWxhdGl2ZQorCXJlbG9jLgorCisJKiBjb2ZmLXJzNjAwMC5jIChfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzKTogQ2hhbmdlIGZyb20gbWFjcm8gdG8KKwlzdGF0aWMgZnVuY3Rpb24uCisJKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFNldAorCWZ1bGxfYW91dGhkciBmbGFnIGhlcmUuLi4KKwkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IC4uLm5vdCBoZXJlLgorCitUdWUgT2N0IDMxIDEyOjUyOjAyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBsaWJlbGYuaDogIFJlbmFtZSB0byBlbGYtYmZkLmggdG8gYXZvaWQgY29uZmxpY3Qgd2l0aAorCXN5c3RlbXMgdGhhdCBoYXZlIGEgc3lzdGVtIDxsaWJlbGYuaD4uCisJKiBNYWtlZmlsZS5pbjogR2xvYmFsbHkgcmVwbGFjZSBsaWJlbGYuaCB3aXRoIGVsZi1iZmQuaC4KKwkqIGJmZC5jLCBlbGYuYywgZWxmMzItYXJjLmMsIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsCisJZWxmMzItaHBwYS5oLCBlbGYzMi1pMzg2LmMsIGVsZjMyLWk4NjAuYywgZWxmMzItbTY4ay5jLAorCWVsZjMyLW04OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYywgZWxmMzItc3BhcmMuYywKKwllbGY2NC1nZW4uYywgZWxmNjQtc3BhcmMuYywgZWxmY29kZS5oLCBlbGZsaW5rLmMsCisJZWxmeHgtdGFyZ2V0Lmg6IEluY2x1ZGUgZWxmLWJmZC5oIHJhdGhlciB0aGFuIGxpYmVsZi5oLgorCSogZWxmeHgtdGFyZ2V0Lmg6IENoYW5nZSBsaWJlbGYuaCByZWZlcmVuY2UgdG8gZWxmLWJmZC5oLgorCitUdWUgT2N0IDMxIDE1OjMwOjA3IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+CisKKwkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IEFkZCBuZXcgcGFyYW1ldGVyIHdlYWsuICBJZgorCXNldCwgc2V0IEJTRl9XRUFLIGluIHN5bWJvbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkoZWNvZmZfZ2V0X2V4dHIpOiBTZXQgd2Vha2V4dCBiYXNlZCBvbiBCU0ZfV0VBSy4KKwkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogSWYgd2Vha2V4dCBpcyBzZXQsIHBhc3MgQlNGX1dFQUsgdG8KKwlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KKwkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIHRoYXQgdGhlIHNlY3Rpb24gdGRhdGEgcmVsb2NzCisJYXJlIG5vdCBOVUxMIGJlZm9yZSB1c2luZyB0aGVtLgorCisJKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLWxpbnV4Kik6IFNldCBDT1JFRklMRSB0byB0cmFkLWNvcmUubyBhbmQKKwlkZWZpbmUgVFJBRF9IRUFERVIgYXMgaG9zdHMvYWxwaGFsaW51eC5oLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogaG9zdHMvYWxwaGFsaW51eC5oOiBOZXcgZmlsZS4KKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYXN0IHUudV9hcjAgdG8gYmZkX3ZtYSwKKwlub3QgaW50LgorCitUdWUgT2N0IDMxIDEyOjM0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBY2NlcHQgQ19CQ09NTSBhbmQKKwlDX0VDT01NIHN0b3JhZ2UgY2xhc3Nlcy4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmtfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAorCW9mIHhjb2ZmX21hcmsuCisJKHhjb2ZmX21hcmspOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sLgorCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wuCisJKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbCByYXRoZXIgdGhhbgorCWRvaW5nIGl0IGJ5IGhhbmQuCisJKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IEJ1aWxkIGEgLmxvYWRlciBzeW1ib2wgZm9yIGFuIGV4cG9ydCBzeW1ib2wuCisKK01vbiBPY3QgMzAgMTQ6NTM6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB4Y29mZmxpbmsuYyAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBuZXcgbGluZV9maWxlcG9zCisJZmllbGQuCisJKHhjb2ZmX2ZpbmRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogVXNlIGl0LgorCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogU2V0IGZpbmZvLmxpbmVfZmlsZXBvcy4KKwkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTC4gIERvbid0CisJcmVsb2NhdGUgdGhlIHZhbHVlIG9mIENfREVDTC4KKworCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogUmVtb3ZlIGJvZ3VzIEJGRF9BU1NFUlQuCisKK1NhdCBPY3QgMjggMDE6MjU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UKKwljYWxsYmFjayBkZWNpZGUgd2hhdCBnb2VzIGluIC5yZWxvY3MuCisJKiBwZVtpXS1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogRGVmaW5lLgorCSogcGVpY29kZS5oIChwZV9ta29iamVjdF9ob29rKTogT25seSBjb3B5IGFvdXRoZHIgaWYKKwl0aGVyZSBpcyBvbmUuCisKK1NhdCBPY3QgMjggMDE6NTE6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEhhbmRsZSBjc2VjdHMgaW4gdGhlCisJYWJzb2x1dGUgc2VjdGlvbi4KKworRnJpIE9jdCAyNyAxODoxNDozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jOiBNb3JlIGltcHJvdmVtZW50cywgbW9zdGx5IHRvIGZpeCBoYW5kbGluZyBvZgorCWNvbnN0cnVjdG9ycyBhbmQgYSBmZXcgb3RoZXIgc3BlY2lhbCBjYXNlcy4KKwkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgYmFjayB0bworCXplcm8sIHJldmVydGluZyB5ZXN0ZXJkYXkncyBjaGFuZ2UuCisJKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCk6IERlY2xhcmUuCisJKGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jKTogRGVjbGFyZS4KKwkoYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitGcmkgT2N0IDI3IDE0OjQyOjE1IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+CisKKwkqIFBPUlRJTkcsIGFvdXQtYXJtLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwKKwlhb3V0eC5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaHAzMDBic2QuYywgaTM4NmFvdXQuYworCWkzODZic2QuYywgaTM4NmR5bml4LmMsIGkzODZsaW51eC5jLCBpMzg2bHlueC5jLCBpMzg2bWFjaDMuYywKKwlpMzg2bmV0YnNkLmMsIG02OGtseW54LmMsIG04OGttYWNoMy5jLCBtaXBzYnNkLmMsIG5ld3NvczMuYywKKwluczMya25ldGJzZC5jLCBwYzUzMi1tYWNoLmMsIHJpc2NpeC5jLCBzcGFyY2x5bnguYywgc3BhcmNuZXRic2QuYzoKKwlDaGFuZ2UgUEFHRV9TSVpFIHRvIFRBUkdFVF9QQUdFX1NJWkUuCisKKwkqIG02OGtuZXRic2QuYzogRGl0dG8gYXMgd2VsbCBhcyBhZGQgc3VwcG9ydCBmb3IgdGhlIG02OGs0ayBvYmplY3QKKwlmb3JtYXQuCisKKwkqIG5ldGJzZC5oOiBEb3VibGUgZGl0dG8gKGluY2wuIG02OGs0ayBzdXBwb3J0KS4gIE5ldEJTRCdzIHRleHQKKwlzZWdtZW50cyBpbmNsdWRlcyB0aGUgYS5vdXQgaGVhZGVyLiAgU2VlIHRvIHRoYXQgdGhlIG1hZ2ljIG51bWJlcgorCSphbHdheXMqIGlzIGJpZy1lbmRpYW4uCisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLWhwKi1uZXRic2QqIGNhc2UuICBDcm9zcy1wb2xsaW5hdGUgbTY4ayBhbmQKKwltNjhrNGsgTmV0QlNEIGNvbmZpZ3VyYXRpb25zLgorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogU2VwYXJhdGUgaTM4NiAmIG1pcHMgTmV0QlNECisJY29uZmlndXJhdGlvbnMgZnJvbSBvdGhlciBCU0Qgb25lcy4gIERvbid0IGFzc3VtZSBERUMgaXMgdGhlIG9ubHkKKwl0aGluZyBOZXRCU0QvbWlwcyBydW4gb24uICBBZGQge202OGssbnMzMmssc3BhcmN9LSotbmV0YnNkKgorCWNvbmZpZ3VyYXRpb25zLiAgQWRkIHN1cHBvcnQgZm9yIG02OGs0ayBOZXRCU0Qgb2JqZWN0IGZvcm1hdC4KKworCSogbGliYW91dC5oOiBBZGRlZCBNXzY4SzRLX05FVEJTRCBtYWdpYy4KKworCSogbTY4azRrbmV0YnNkLmM6IE5ldyBmaWxlLgorCisJKiBob3N0cy97bTY4ayxzcGFyY31uYnNkLmg6IERvbid0IGRlZmluZSBIT1NUX0JJR19FTkRJQU5fUC4KKworCSogaG9zdHMvbmJzZC5oOiBEZWZpbmUgSE9TVF9CSUdfRU5ESUFOX1AgYWNjb3JkaW5nIHRvCisJPG1hY2hpbmUvZW5kaWFuLmg+LgorCisJKiBob3N0cy9taXBzbmJzZC5oOiBOZXcgZmlsZS4KKworVGh1IE9jdCAyNiAxNDoxNjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldCBjbG9zZXIgdG8gYSB3b3JraW5nIFhDT0ZGCisJbGlua2VyLgorCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgZnVsbF9hb3V0aGRyLAorCXRvY19zZWN0aW9uLCBhbmQgZW50cnlfc2VjdGlvbiBmaWVsZHMuCisJKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogUmVtb3ZlIGxkcmVsX2NvdW50IGZpZWxkLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogSW5pdGlhbGl6ZSBuZXcgeGNvZmZfZGF0YQorCWZpZWxkcy4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBSUzYwMDBDT0ZGX0MsIGdlbmVyYXRlCisJZnVsbCBhLm91dCBoZWFkZXIgaWYgZnVsbF9hb3V0aGRyIGlzIHNldCBpbiB4Y29mZl9kYXRhLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLiAgU2V0IG9fc25lbnRyeSBhbmQgb19zbnRvYworCWJhc2VkIG9uIHNlY3Rpb25zIHN0b3JlZCBpbiB4Y29mZl9kYXRhLgorCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBuZXcgeGNvZmZfZGF0YQorCWZpZWxkcy4KKwkoeGNvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCisJKHJzNjAwMGNvZmZfdmVjKTogU2V0IHN5bWJvbF9sZWFkaW5nX2NoYXIgdG8gJy4nLgorCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW1ib2xfaW5mbyk6IElmIGZpeF92YWx1ZSBpcyBzZXQsIGZpeCB0aGUKKwl2YWx1ZSBzdG9yZWQgaW4gcmV0IHJhdGhlciB0aGFuIHJldHVybmluZyBhIHBvaW50ZXIgdmFsdWUuCisKK1dlZCBPY3QgMjUgMjM6MTA6MzkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkIChwb3dlcnBjeyxsZX0te2VsZixzeXN2NCxlYWJpLHNvbGFyaXMyfSk6IFJlbW92ZSBNQUMKKwlmb3JtYXQgZm9yIG5vdy4KKworV2VkIE9jdCAyNSAxNjoxOToyNyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgdGhlIHN0cmluZ3Mgd2l0aCBtYWxsb2MKKwlzaW5jZSB0aGV5J3JlIGZyZWUnZCBieSBmcmVlX2NhY2hlZF9pbmZvLgorCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU2ltaWxhcmx5IGZvciB0aGUgc3ltYm9sIHRhYmxlLgorCitXZWQgT2N0IDI1IDE0OjU5OjIyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIERvbid0IG1ha2UgaGVhZGVycy4KKworV2VkIE9jdCAyNSAxMTozMjo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKworCSogc3Vub3MuYyAoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBkbyBhbnl0aGluZyBpZgorCW91dHB1dF9iZmQgaXMgbm90IFN1bk9TLgorCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuICBEb24ndCBzY2FuIHJlbG9jcyBvZgorCW5vbi1TdW5PUyBpbnB1dCBmaWxlcy4KKworCSogeGNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgbGlua2luZyBzaGFyZWQgb2JqZWN0cworCWFuZCBnZW5lcmF0aW5nIGEgLmxvYWRlciBzZWN0aW9uLgorCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgaW1wb3J0X2ZpbGVfaWQgZmllbGQuCisJKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIGxpbmVub19jb3VudCwgZmlyc3Rfc3ltbmR4LAorCWxhc3Rfc3ltbmR4LCBhbmQgbGRyZWxfY291bnQgZmllbGRzLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaG93dG9fdGFibGUpOiBDb3JyZWN0IHJlbG9jIG5hbWVzLgorCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBEb24ndCBzZXQgYW55IGZsYWdzIGlmIFNUWVBfUEFECisJaXMgc2V0LgorCSogYmZkLWluLmggKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRGVjbGFyZS4KKwkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBEZWNsYXJlLgorCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworVHVlIE9jdCAyNCAxNzo0NDoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHhjb2ZmbGluay5vIHRvIHBtYWNfeGNvZmZfdmVjLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogbXB3LWNvbmZpZy5pbjogQWRkIHhjb2ZmbGluay5jLm8gdG8gcG93ZXJwYy1hcHBsZS1tYWNvcy4KKwkqIGNvZmYtcG1hYy5jOiBJbmNsdWRlIGNvZmYtcnM2MDAwLmMgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdHMKKwljb250ZW50cy4KKwkocG1hY194Y29mZl92ZWMpOiBVcGRhdGUgdG8gdXNlIG5ldyB4Y29mZiBzdXBwb3J0LgorCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTWFrZSBzdGF0aWMuCisJKHhjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBidWYgYXMgdW5zaWduZWQgY2hhci4KKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogRGVjbGFyZSBhIGxvY2FsIGFzIFBUUi4KKworCSogbXB3LW1ha2Uuc2VkOiBHZW5lcmFsaXplIHN1YmRpcl9kbyBlZGl0LgorCitUdWUgT2N0IDI0IDEwOjI1OjAxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaHBwYWJzZC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogSW5pdGlhbGl6ZSBhc2VjdC0+ZmlsZXBvcworCWNvcnJlY3RseS4gIERvbid0IGluaXRpYWxpemUgYXNlY3QtPnZtYS4KKworRnJpIE9jdCAyMCAxMzoyMzo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IElmIF9iZmRfY2h1bmtzaXplIHdhc24ndCBwcmVzZXQsIHVzZQorCXNvbWV0aGluZyBhIGxpdHRsZSBsZXNzIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4KKworVGh1IE9jdCAxOSAxMzowNjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IENsZWFyICphZGp1c3RlZHAuCisKK1dlZCBPY3QgMTggMTY6MjA6MDggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldy4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgLmJzcyBpcyBiZWZvcmUKKwkuZGF0YSB1cyB0aGF0IGFzIGRhdGFfc3RhcnQuCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogR2V0IHJlbG9jCisJY2FsYyBjb3JyZWN0LgorCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IFVzZSBfY29va2VkX3NpemUgb2YgZGF0YSBkaXJlY3RvcnkuCisJKGNvZmZfc3dhcF9vdXRoZHJfb3V0KTogSGFyZHdpcmUgaW4gdmVyc2lvbiBudW1iZXIuCisKK1dlZCBPY3QgMTggMTY6NTA6NTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGVzCisJbWFqb3IgYW5kIG1pbm9yIHRvICpfdm5vLCBzaW5jZSB0aGUgZm9ybWVyIGFyZSBhbHNvIG1hY3JvcyBpbgorCVN1bk9TIGhlYWRlciBmaWxlcy4gIENhc3QgcmVzdWx0IG9mIGJmZF9hbGxvYyB0byBhcHByb3ByaWF0ZQorCXR5cGUuCisKKwkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IENhc3QgdXNlZF9ieV9iZmQgdmFsdWUKKwliZWZvcmUgYXNzaWduaW5nIHRvIHNlY19kYXRhLgorCitXZWQgT2N0IDE4IDEzOjI1OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFRoZSBvZmZzZXQgYXJndW1lbnQgaXMKKwlub3cgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24sIG5vdCBhYnNvbHV0ZS4KKwkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogVXNlIHRoZSByaWdodCBzeW1ib2wgdG8KKwlnZXQgdGhlIGZpbGUgbmFtZSB3aGVuIHRoZXJlIGlzIGEgTl9TTyBkaXJlY3RvcnkgbmFtZS4gIFdoZW4KKwloYW5kbGluZyBzdGFicywgcmVtZW1iZXIgdGhhdCBzZWN0aW9uLT52bWEgd2FzIGFkZGVkIHRvIHRoZQorCW9mZnNldC4KKworVHVlIE9jdCAxNyAxODoyNDo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLgorCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogQ2FsbCBiZmRfcmVsZWFzZSwgbm90IGZyZWUuCisJKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5lZWRlZCBmaWVsZC4KKwkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFJlY29yZCBuZWVkZWQgb2JqZWN0cy4KKwkoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KKwkqIGJmZC1pbi5oIChiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogRGVjbGFyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworTW9uIE9jdCAxNiAxNDo0Mzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZS5pbl9yZWxvY19wKTogTmV3LgorCitNb24gT2N0IDE2IDEwOjUyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkLWluLmggKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCk6IFJlbmFtZSBmcm9tCisJYmZkX2VsZl9saW5rX25lZWRlZF9saXN0LgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogZWxmLmMsIGVsZmxpbmsuaCwgbGliZWxmLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworCUFkZCBzdGFydCBhdCBBSVggbGlua2VyIHN1cHBvcnQ7IG5vIHNoYXJlZCBsaWJyYXJpZXMgeWV0LgorCSogeGNvZmZsaW5rLmM6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluIChyczYwMGNvZmZfdmVjKTogVXNlIHhjb2ZmbGluay5vLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgY3NlY3RzIGFuZCBkZWJ1Z19pbmRpY2VzCisJZmllbGRzLgorCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KKwkoeGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lIG1hY3JvLgorCShfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVjbGFyZS4KKwkoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCisJKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgorCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVjbGFyZS4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmYtcnM2MDAwLmM6IENsZWFuIHVwIGEgYml0LgorCSh4Y29mZl9ta29iamVjdCk6IERlZmF1bHQgbW9kdHlwZSB0byAxTCwgbm90IFJFLiAgSW5pdGlhbGl6ZQorCWNwdXR5cGUsIGNzZWN0cywgYW5kIGRlYnVnX2luZGljZXMuCisJKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgY3B1dHlwZS4KKwkoeGNvZmZfaG93dG9fdGFibGUpOiBSZW5hbWUgZnJvbSByczYwMDBjb2ZmX2hvd3RvX3RhYmxlLgorCSh4Y29mZl9ydHlwZTJob3d0byk6IFJlbmFtZSBmcm9tIHJzNjAwMGNvZmZfcnR5cGUyaG93dG8uCisJKHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lIGZyb20KKwlyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLgorCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCisJKF9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBEZWZpbmUuCisJKF9iZmRfeGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KKwkoX2JmZF94Y29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KKwkoX2JmZF94Y29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogRGVmaW5lLgorCShyczYwMDBjb2ZmX3ZlYyk6IEZvciBCRkRfSlVNUF9UQUJMRV9MSU5LLCB1c2UgX2JmZF94Y29mZiwgbm90CisJY29mZi4KKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgQUlYLAorCWluY3JlbWVudCBzb2ZhciBieSBTTUFMTF9BT1VUU1ogaWYgbm90IGV4ZWN1dGFibGUuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQUlYLCBhbHdheXMgb3V0cHV0IGFuIGEub3V0CisJaGVhZGVyOyBpZiBub3QgZXhlY3V0YWJsZSwgaGVhZGVyIHNpemUgb2YgU01BTExfQU9VVFNaLgorCSogaGFzaC5jIChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoKTogQWRkIHhjb2ZmIGZpZWxkLgorCShfYmZkX3N0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSB4Y29mZiBmaWVsZC4KKwkoX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBmdW5jdGlvbi4KKwkoX2JmZF9zdHJpbmd0YWJfYWRkKTogSW4gWENPRkYgbW9kZSwgbGVhdmUgdHdvIGJ5dGVzIGZvciBsZW5ndGguCisJKF9iZmRfc3RyaW5ndGFiX2VtaXQpOiBJbiBYQ09GRiBtb2RlLCB3cml0ZSBvdXQgbGVuZ3RoLgorCSogbGliYmZkLWluLmggKF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHhjb2ZmbGluay5vLgorCShDRklMRVMpOiBBZGQgeGNvZmZsaW5rLmMuCisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBTZXQgU0VDX0FMTE9DLCBub3QKKwlTRUNfTk9fRkxBR1MsIGZvciAuYWNvbW1vbiBzZWN0aW9uLiAgRnJvbSBQZXRlciBTY2hhdWVyCisJPFBldGVyLlNjaGF1ZXJAUmVnZW50LkUtVGVjaG5pay5UVS1NdWVuY2hlbi5ERT4uCisKK1NhdCBPY3QgMTQgMjE6MzY6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb2ZmLXBwYy5jIChpbl9yZWxvY19wKTogQWRkLCBjbG9uZSBmcm9tIGNvZmYtaTM4Ni5jLgorCitGcmkgT2N0IDEzIDE3OjQ4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oIChIQVZFX1NZU19QUk9DRlNfSCk6IFVuZGVmLCB3aXRoIGNvbW1lbnQuCisJKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorCisJKiBvcG5jbHMuYyAoZ2V0cGFnZXNpemUpIFshSEFWRV9HRVRQQUdFU0laRV06IERlZmluZSBhcyAyMDQ4LgorCShfYmZkX2NodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KKwkoX2JmZF9uZXdfYmZkKTogU2V0IGl0IHRvIGdldHBhZ2VzaXplKCkgaWYgbmVnYXRpdmUsIGFuZCB1c2UgaXQKKwlmb3Igb2JzdGFjayBjaHVuayBzaXplLgorCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZ2V0cGFnZXNpemUuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogdHJhZC1jb3JlLmMgKHJhd3B0cik6IE1ha2UgaXQgYSBsb2NhbCB2YXJpYWJsZSBvZgorIAlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcC4KKworRnJpIE9jdCAxMyAxMToyMjowMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogTmV3LgorCSogY29mZi1pMzg2LmMgKGluX3JlbG9jX3ApOiBOZXcuCisJKiBjb2ZmY29kZS5oOiBBbGx3YXlzIGluY2x1ZGUgcGVpY29kZS5oIGlmIENPRkZfV0lUSF9QRS4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbmx5IHNldCBoYXNfcmVsb2Nfc2VjdGlvbgorCWlmIFBFX0lNQUdFLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENhbGwKKwlpbl9yZWxvY19wIHRvIGRlY2lkZSBpZiByZWxvYyBzaG91bGQgYmUgZW1pdHRlZC4KKwkqIGxpYmNvZmYuaCAocGVfZGF0YV90eXBlLmluX3JlbG9jX3ApOiBOZXcuCisJKiBwZWljb2RlLmggKHBlX21rb2JqZWN0KTogSW5pdGlhbGl6ZSBpbl9yZWxvY19wLgorCitXZWQgT2N0IDExIDAwOjQ5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTW92ZSB0byBjb2ZmZ2VuLmMuCisJKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IExpa2V3aXNlLgorCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBDb3B5IGZyb20gY29mZmdlbi5jLgorCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBMaWtld2lzZS4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDb3JyZWN0IGNvbmRpdGlvbnMKKwl1bmRlciB3aGljaCB0eXBlIGFuZCBzaXplIGNoYW5nZSB3YXJuaW5ncyBhcmUgaXNzdWVkLgorCitUdWUgT2N0IDEwIDE4OjMyOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmdlbi5jIChjb2ZmX2NvdW50X2xpbmVudW1iZXJzKTogRG9uJ3QgY291bnQgbGluZSBudW1iZXJzIGZvcgorCWEgc3ltYm9sIHdoaWNoIGlzIG5vdCBpbiBhIHJlYWwgc2VjdGlvbi4KKwkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZSBmcm9tCisJY29mZl9saW5rX2hhc2hfbmV3ZnVuYyBhbmQgbWFrZSBub24tc3RhdGljLgorCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKKwlfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KKwkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgaXQuCisJKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBNYWtlIHN0YXRpYy4KKwkqIGxpYmNvZmYtaW4uaCAoKF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmUuCisJKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IERlY2xhcmUuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IGNwdXR5cGUKKwlmaWVsZCBpbiBYQ09GRiB0ZGF0YS4KKwkoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBDaGVjayBpZmRlZiBSUzYwMDBDT0ZGX0MsIG5vdCBpZmRlZgorCVU4MDJST01BR0lDLCBmb3IgY2xhcml0eS4gIFRyeSB0byBzZXQgYXJjaCBhbmQgbWFjaGluZSBjb3JyZWN0bHkKKwliYXNlZCBvbiBjcHV0eXBlIHN0b3JlZCBpbiBhLm91dCBoZWFkZXIsIG9yIGluIG5fdHlwZSBvZiBpbml0aWFsCisJLmZpbGUgc3ltYm9sLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBjcHV0eXBlIGNvcnJlY3RseSBpbiBhLm91dAorCWhlYWRlci4KKwkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgY2FzdHMgdG8gZmlsZV9wdHIgdG8gYXZvaWQKKwl3YXJuaW5ncy4KKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogU3dhcCBpbiBjcHV0eXBlIGZpZWxkLgorCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBTd2FwIG91dCBjcHV0eXBlIGZpZWxkLiAgRG9uJ3QgY2xlYXIKKwlvbGQgcmVzdjEgZmllbGQuCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IEFkZCBjcHV0eXBlIGZpZWxkLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCisJKiBjcHUtcnM2MDAwLmMgKHJzNjAwMF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoYmZkX3JzNjAwMF9hcmNoKTogVXNlIGl0LgorCSogY3B1LXBvd2VycGMuYyAocG93ZXJwY19jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoYXJjaF9pbmZvX3N0cnVjdCk6IERlZmluZSB2YXJpb3VzIGZsYXZvdXJzIG9mIFBvd2VyUEMuCisJKGJmZF9wb3dlcnBjX2FyY2gpOiBVc2UgcG93ZXJwY19jb21wYXRpYmxlLiAgUG9pbnQgYXQKKwlhcmNoX2luZm9fc3RydWN0LgorCitUdWUgT2N0IDEwIDEwOjUwOjQ2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBSZW1vdmUgQklTT04uCisKK1R1ZSBPY3QgMTAgMDE6Mjg6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IHdhcm4gYWJvdXQKKwljaGFuZ2luZyB0aGUgc2l6ZSBvciB0eXBlIGlmIHRoZSBvbGQgZGVmaW5pdGlvbiB3YXMgd2Vhay4KKworTW9uIE9jdCAgOSAxMToyNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvbWJpbmVkX2VudHJ5X3R5cGUpOiBBZGQgZml4X2xpbmUgZmllbGQuCisJKGNvZmZfc2x1cnBfbGluZV90YWJsZSk6IFdhcm4gaWYgd2UgdHJ5IHRvIHNldCB0aGUgbGluZW5vIGZpZWxkIG9mCisJYSBzeW1ib2wgdHdpY2UuCisJKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgQ19CSU5DTCBhbmQKKwlDX0VJTkNMIGJ5IHNldHRpbmcgZml4X2xpbmUuICBGaXggQ19CU1RBVCBzeW1ib2wgdmFsdWUuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfbWFuZ2xlX3N5bWJvbHMpOiBIYW5kbGUgZml4X2xpbmUuCisJKGNvZmZfd3JpdGVfc3ltYm9sKTogT25seSB1c2UgTl9ERUJVRyBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZQorCWFic29sdXRlIHNlY3Rpb24uCisJKGNvZmZfcHJpbnRfc3ltYm9sKTogUHJpbnQgZml4X3ZhbHVlIHN5bWJvbHMgaW4gYSB1c2VmdWwgZmFzaGlvbi4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKworCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBEZWZpbmUuCisJKHhjb2ZmX2RhdGEpOiBEZWZpbmUuCisJKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGQgeGNvZmZfb2JqX2RhdGEgZmllbGQgdG8gdGRhdGEgdW5pb24uCisJKiBiZmQtaW4yLmgsIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX21rb2JqZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29mZl9ta29iamVjdCk6IERlZmluZS4KKwkoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgorCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfVE9DIGNvbXBsYWluX29uX292ZXJmbG93IGZyb20KKwlzaWduZWQgdG8gYml0ZmllbGQuCisJKHJzNjAwMGNvZmZfdmVjKTogQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgorCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSAucGFkIGFuZAorCS5sb2FkZXIgc2VjdGlvbnMgc3BlY2lhbGx5LgorCShjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIGdldCB0aGUgLnRleHQgYW5kIC5kYXRhCisJc2VjdGlvbiBhbGlnbm1lbnQgZnJvbSB0aGUgWENPRkYgdGRhdGEgaW5mb3JtYXRpb24uCisJKGNvZmZfbWtvYmplY3RfaG9vayk6IElmIFJTNjAwMENPRkZfQywgc2V0IERZTkFNSUMgYmFzZWQgb24KKwlGX1NIUk9CSiwgYW5kIGNvcHkgdGhlIGV4dHJhIGEub3V0IGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZQorCVhDT0ZGIHRkYXRhIHN0cnVjdHVyZS4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBGX1NIUk9CSiwKKwlGX0RZTkxPQUQgYW5kIHRoZSBleHRyYSBhLm91dCBoZWFkZXIgaW5mb3JtYXRpb24uCisJKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IEJTRl9OT1RfQVRfRU5EIGZvciBhIENfRVhUIG9yCisJQ19ISURFWFQgc3ltYm9sIHdpdGggYXR0YWNoZWQgY3NlY3QgaW5mb3JtYXRpb24uCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IElmIFJTNjAwMENPRkZfQywgc3dhcAorCWluIHRoZSBvX21heGRhdGEgZmllbGQuCisJKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IElmIFJTNjAwMENPRkZfQywgc3dhcCBleHRyYSBYQ09GRiBmaWVsZHMuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IERvbid0IG1vdmUgYW55IHN5bWJvbCB0byB0aGUKKwllbmQgaWYgQlNGX05PVF9BVF9FTkQgaXMgc2V0LgorCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW5hbWUgX2JmZF9yZWFkX2FyX2hkciBmaWVsZCB0bworCV9iZmRfcmVhZF9hcl9oZHJfZm4uCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9yZWFkX2FyX2hkcik6IFVwZGF0ZSBhY2NvcmRpbmdseS4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisJKiBhcmNoaXZlLmMgKF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zKTogQ2FzdCBfYmZkX3JlYWRfYXJfaGRyCisJcmV0dXJuIHZhbHVlLgorCShkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApOiBMaWtld2lzZS4KKwkoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IExpa2V3aXNlLgorCShfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBMaWtld2lzZS4KKworRnJpIE9jdCAgNiAxNjoxODozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGFyY2hpdmUuYyAoYmZkX2dldF9uZXh0X21hcGVudCk6IFJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTCisJd2hlbiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5LgorCisJKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHJlc2VydmUKKwlzcGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLCBzaW5jZSB3ZSBkb24ndCBvdXRwdXQgdGhlbSBlaXRoZXIuCisJKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogUmVtb3ZlZC4KKworCSogcHRyYWNlLWNvcmUuYyAocmF3cHRyKTogTWFrZSBpdCBhIGxvY2FsIHZhcmlhYmxlIG9mCisgCXB0cmFjZV91bml4X2NvcmVfZmlsZV9wLgorCitGcmkgT2N0ICA2IDEyOjI0OjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29mZi1yczYwMDAuYyAoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldHVybiBmYWxzZSwgbm90CisJTlVMTC4KKworCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LXtlbGYsc3lzdjQsZWFiaSxzb2xhcmlzMn0pOiBBZGQgTlQsIGFuZAorCU1hYyBvYmplY3QgZmlsZSBmb3JtYXRzLgorCitGcmkgT2N0ICA2IDEyOjA0OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmdlbi5jIChjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IERvbid0IHRyeSB0byBzZXQgdXAgZmlsZQorCWF1eGVudCBpZiB0aGVyZSBpc24ndCBvbmUuCisJKGNvZmZfd3JpdGVfc3ltYm9scyk6IElmIHRoZXJlIGlzIG5vIGZpbGUgYXV4ZW50LCB1c2UgU1lNTk1MRU4KKwlyYXRoZXIgdGhhbiBGSUxOTUxFTiBhcyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aC4KKworCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAorCV9iZmRfY29mZl9wcmludF9hdXguCisJKGJmZF9jb2ZmX3ByaW50X2F1eCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoUlM2MDAwQ09GRl9DIHZlcnNpb24pKTogUG9pbnRlcml6ZSB0aGUKKwlzY25sZW4gZmllbGQgb2YgYW4gWFRZX0xEIGNzZWN0IGF1eCBlbnRyeS4KKwkoY29mZl9wcmludF9hdXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHBvaW50ZXJpemUgc2NubGVuIGZpZWxkOyBub3cgZG9uZQorCWluIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KKwkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBDYWxsIGJmZF9jb2ZmX3ByaW50X2F1eC4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBPbiBBSVgsIGNsZWFyIEZfUkVMRkxHCisJaWYgdGhlcmUgYXJlIHN5bWJvbHMsIGZvciBuYXRpdmUgQUlYIGxkIGNvbXBhdGliaWxpdHkuCisKKwkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKKwlfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vay4KKwkoY29mZl9wb2ludGVyaXplX2F1eF9ob29rKTogRGVmaW5lIGFzIGEgZnVuY3Rpb24gaWYgUlM2MDAwQ09GRl9DCisJb3IgSTk2MCwgYW5kIGFzIDAgb3RoZXJ3aXNlLgorCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogQ2hhbmdlIHBhcmFtZXRlcnMgIHRvIHRha2UKKwlzeW1ib2wgcG9pbnRlciBpbnN0ZWFkIG9mIHR5cGUgYW5kIGNsYXNzLCBhbmQgdG8gdGFrZSBhdXggaW5kZXguCisJQ2FsbCBfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayBpZiBpdCBpcyBkZWZpbmVkLgorCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IEFsd2F5cyBjYWxsIGNvZmZfcG9pbnRlcml6ZV9hdXguCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgYWxsIGZpZWxkcy4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgorCisJKiBjb2ZmLXJzNjAwMC5jOiBBZGQgZnVsbCBzdXBwb3J0IGZvciBBSVggYXJjaGl2ZXMuICBSZXdyaXRlIG9sZAorCXJlYWQtb25seS9ob3N0LW9ubHkgc3VwcG9ydC4KKworCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQ19ISURFWFQgc3ltYm9scyB0byBiZQorCUJTRl9MT0NBTC4KKwkoT1RIRVJfR0xPQkFMX0NMQVNTKTogRG8gbm90IGRlZmluZSB0byBiZSBDX0hJREVYVCBpZgorCVJTNjAwMENPRkZfQy4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfcmVhZF9hcl9oZHIgZmllbGQuICBNb2RpZnkKKwlCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGFjY29yZGluZ2x5LgorCSogbGliYmZkLWluLmggKF9iZmRfc25hcmZfYXJfaGRyKTogRG9uJ3QgZGVjbGFyZS4KKwkoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IERlY2xhcmUuCisJKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IERlY2xhcmUuCisJKF9iZmRfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCisJKF9iZmRfbm9hcmNoaXZlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgorCShfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyKTogRGVmaW5lLgorCShfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KKwkqIGFyY2hpdmUuYzogQ2hhbmdlIGFsbCBjYWxsZXJzIG9mIF9iZmRfc25hcmZfYXJfaGRyIHRvIGNhbGwKKwlfYmZkX3JlYWRfYXJfaGRyIGluc3RlYWQuCisJKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFJlbmFtZSBmcm9tIF9iZmRfc25hcmZfYXJfaGRyLgorCShfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUmVuYW1lIGZyb20KKwljb21wdXRlX2FuZF93cml0ZV9hcm1hcC4gIE1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXApOiBDYWxsIF9iZmRfcmVhZF9hcl9oZHIgcmF0aGVyCisJdGhhbiBfYmZkX3NuYXJmX2FyX2hkci4KKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfYXJfaGRyKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCSogaWVlZS5jIChpZWVlX3JlYWRfYXJfaGRyKTogRGVmaW5lLgorCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9yZWFkX2FyX2hkcik6IERlZmluZS4KKwkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfYXJfaGRyKTogRGVmaW5lLgorCSogc29tLmMgKHNvbV9yZWFkX2FyX2hkcik6IERlZmluZS4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisKK1RodSBPY3QgIDUgMTQ6MDQ6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5jIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IElmIHN5bXB0ciBpcworCXplcm8sIHRoZXJlIGFyZW4ndCBhbnkgc3ltYm9scywgZXZlbiBpZiBuc3ltcyBpcyBzZXQuCisKK1RodSBPY3QgIDUgMTE6NDU6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGFkanVzdF9oZWFkZXJzCisJZmllbGQuCisJKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhCisJc2VjdGlvbnMsIGFuZCBzZXQgc3R5cCBjb3JyZWN0bHkgZm9yIHRoZW06IC5nb3QsIC5oYXNoLCAuZHluYW1pYywKKwkubGlibGlzdCwgLnJlbC5keW4sIC5jb25mbGljLCAuZHluc3RyLCAuZHluc3ltLCAuY29tbWVudC4KKwkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IENoZWNrIGZvciB2YXJpb3VzIEFscGhhIHNlY3Rpb24KKwl0eXBlcy4KKwkoZWNvZmZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmV0dXJuIGJvb2xlYW4sIG5vdCB2b2lkLgorCVNvcnQgdGhlIHNlY3Rpb25zIGJ5IFZNQSBiZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZW0uICBQdXQgdGhlCisJZmlyc3Qgbm9uIFNFQ19BTExPQyBzZWN0aW9uIG9uIGEgbmV3IHBhZ2UuICBQdXQgZXZlcnkgU0VDX0FMTE9DCisJc2VjdGlvbiBvbiBhbiBhcHByb3ByaWF0ZSBib3VuZGFyeSB3aXRoaW4gdGhlIHBhZ2UuCisJKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKKwllY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCisJKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKwkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYQorCXNlY3Rpb24gdHlwZXMgd2hlbiBpbmNyZW1lbnRpbmcgdGV4dF9zaXplIGFuZCBkYXRhX3NpemUuICBDYWxsCisJYWRqdXN0X2hlYWRlcnMgYmFja2VuZCBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2FkanVzdF9oZWFkZXJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBhZGp1c3RfaGVhZGVycyBmaWVsZC4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgorCisJKiBob3N0cy9pMzg2YnNkLmg6IFJlc3RvcmUgZmlsZSBpbmNvcnJlY3RseSBkZWxldGVkIG9uIFNlcCA2LgorCitXZWQgT2N0ICA0IDE4OjE1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKKworCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9WRVJTSU9OXzEpOiBVc2UgQ09SRV9WRVJTSU9OXzEgaW5zdGVhZAorCW9mIEFMVEVSTkFURV9BSVhfQ09SRV9GT1JNQVQuCisJKiBjb25maWd1cmUuaW4gKGFpeDQpOiBObyBsb25nZXIgbmVlZCBDT1JFX0ZMQUdTLgorCSogY29uZmlndXJlOiBVcGRhdGVkLgorCitXZWQgT2N0ICA0IDE1OjM2OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJTlMzMmsgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgorCSogYW91dHguaCAoTVlfZmluYWxfbGlua19yZWxvY2F0ZSwgTVlfcmVsb2NhdGVfY29udGVudHMpOiBOZXcKKwltYWNyb3MuCisJKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0LAorCWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogQ2FsbCB0aGVtIGluc3RlYWQgb2YgX2JmZF8qCisJdmVyc2lvbnMuCisJKiBhb3V0LXRhcmdldC5oIChNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCk6IE5ldyBtYWNybywgZGVmYXVsdHMKKwl0byB6ZXJvLgorCShiYWNrZW5kX2RhdGEpOiBVc2UgaXQgaW5zdGVhZCBvZiBoYXJkY29kZWQgemVyby4KKworCSogYW91dC1uczMyay5jIChDVE9SX1RBQkxFX1JFTE9DX0hPV1RPKTogTmV3IG1hY3JvLgorCShNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSBmb3IgS0VFUElULCBkb24ndCBjYWxsIHN0b2kuCisKKwkqIG5zMzJrbmV0YnNkLmM6IEluY2x1ZGUgYmZkLmguCisJKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLCBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgbWFjcm9zLgorCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWNsYXJlIGZ1bmN0aW9uIHRvby4KKwkqIHBjNTMyLW1hY2guYyAoc2V0X3NpemVzKTogRG9uJ3QgZGVjbGFyZS4KKwkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkKTogRGVmaW5lLgorCShiYWNrZW5kX2RhdGEsIE1ZX2JhY2tlbmRfZGF0YSk6IERvbid0IGRlZmluZS4KKworCSogY29uZmlnLmJmZDogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAorCW5zMzJrLSotbGl0ZXMqIGxpa2UgbnMzMmstKi1uZXRic2QqLgorCisJKiBob3N0cy9uYnNkLmg6IFN3YXAgb3JkZXIgb2Ygc3lzL3ZtcGFyYW0uaCBhbmQgc3lzL3BhcmFtLmgsIHRvCisJY29tcGlsZSBvbiBsaXRlcy4KKworV2VkIE9jdCAgNCAxNDoxNTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVzdG9yZSBzZXR0aW5nCisJZl90aW1kYXQgdG8gMCwgZGVsZXRlZCBvbiBBdWd1c3QgMjIuCisKK1R1ZSBPY3QgIDMgMTY6Mjg6MzIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLAorCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsCisJY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogaWZkZWYgdG8gYWxsb3cgb3ZlcnJpZGVzLgorCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcKKwkocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KKwkoY29mZl9zd2FwX3Njbmhkcl9pbik6IFN3YXAgYnNzIHNpemUgaW50byB0aGUgcmlnaHQgcGxhY2UuCisJKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc29tZSBuZXdsaW5lcy4KKworVHVlIE9jdCAgMyAxMTo1MzowNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCisKKwkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvbid0IGRpZSBpZiBhIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMuCisKK01vbiBPY3QgIDIgMTQ6MDg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGxldCBhIHdlYWsKKwlkeW5hbWljIHN5bWJvbCBvdmVycmlkZSBhIGNvbW1vbiBzeW1ib2wuICBEb24ndCBjaGFuZ2UgdGhlIHNpemUgb3IKKwl0eXBlIGlmIHRoZXkgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90IGEgZGVmaW5pdGlvbi4KKwlXYXJuIGlmIHRoZSBzaXplIG9yIHR5cGUgY2hhbmdlcy4KKworU3VuIE9jdCAgMSAwMTozNDo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlIG9yCisJc3ltYm9sCXN0cmluZ3MuCisJKHNvbV9maW5pc2hfd3JpdGluZyk6IFdyaXRlIHRoZW0gaGVyZS4gIFBsYWNlIHRoZW0gYWZ0ZXIgdGhlCisJc3Vic3BhY2UgZGF0YSwgYnV0IGJlZm9yZSB0aGUgcmVsb2NzLgorCitGcmkgU2VwIDI5IDExOjAxOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBKdXN0IHBhc3MgZmFsc2UsIG5vdAorCWluZm8tPnNoYXJlZF9saWJyYXJ5LCB0byBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KKwkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3Qgd2FybiBhYm91dCBhIHJlbG9jIGluIHRoZSAudGV4dAorCXNlY3Rpb24uCisJKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBSZW1vdmUgLnRleHQgc2VjdGlvbiBhc3NlcnRpb24uCisKK1RodSBTZXAgMjggMTg6NDg6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkOiBBZGQgcG93ZXJwYy0qLW1hY29zKiwgcG93ZXJwYy0qLW1wdyouCisJKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogQWRkIHBtYWNfeGNvZmZfdmVjIGNhc2UuCisJKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1wbWFjLm8uCisJKiBjb2ZmLXBtYWMuYzogTmV3IGZpbGUsIFBvd2VyTWFjIFhDT0ZGIHN1cHBvcnQuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEFkZCBQb3dlck1hYyBjYXNlLgorCSogdGFyZ2V0cy5jIChwbWFjX3hjb2ZmX3ZlYyk6IERlY2xhcmUuCisKKwkqIG1wdy1jb25maWcuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlCisJYXV0b2NvbmYtYmFzZWQgY29uZmlndXJ5LgorCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4CisJbWFrZWZpbGUgaW50byBNUFcgc3ludGF4LgorCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KKwkqIGhvc3RzL21wdy5oOiBSZW1vdmUuCisJKiBiZmQtaW4uaCwgYmZkLWluMi5oOiBJZiBNUFcsIGluY2x1ZGUgdGhlIGZpbGUgdGhhdCBkZWZpbmVzCisJdHJ1ZSBhbmQgZmFsc2UgYXMgZW51bXMsIHRoZW4gZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVELgorCitUaHUgU2VwIDI4IDE3OjA2OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGJpbmFyeS5jIChiaW5hcnlfZ2V0X3N5bXRhYik6IFJldHVybiBhbiBlbXB0eSBzdHJpbmcgb24gZXJyb3IuCisJKiBvcG5jbHMuYyAoYmZkX2ZkcGVucik6IENoYW5nZSBXSU4zMiByZXN0cmljdGlvbiB0byBXSU5HREIuCisKK1RodSBTZXAgMjggMTU6MzA6NDQgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KKworCSogY29mZi1wcGMuYzogUmVmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGdudSBjb252ZW50aW9ucworCSAgICAgICAgICAgICAgUmVtb3ZlZCBpcnJlbGV2YW50ICJpZiAwIiBjb2RlCisKK1RodSBTZXAgMjggMTE6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IFRyZWF0IHNlY29uZGFyeSBzeW1ib2xzIGFzIHdlYWsKKwlzeW1ib2xzIHJhdGhlciB0aGFuIGFzIGluZGlyZWN0IHN5bWJvbHMuCisJKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGFib3V0CisJc2Vjb25kYXJ5IHN5bWJvbHMuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IE1ha2Ugc3VyZSB0aGF0IHRoZSBhbGlnbm1lbnQKKwlvZiAuY3RvcnMgYW5kIC5kdG9ycyBzZWN0aW9ucyBpcyBubyBsYXJnZXIgdGhhbiAyLgorCisJKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNoYW5nZQorCWJmZF9saW5rX2hhc2hfY29tbW9uIHRvIGJmZF9saW5rX2hhc2hfbmV3LCBzaW5jZSBpdCBtYXkgYmUgb24gdGhlCisJdW5kZWYgbGlzdC4KKwkoYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEb24ndCBwdXQgX19EWU5BTUlDIGluIHRoZQorCWR5bmFtaWMgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IEhhbmRsZSByZWxvY3MgY29ycmVjdGx5IHdoZW4gY3JlYXRpbmcgYQorCXNoYXJlZCBsaWJyYXJ5LgorCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFyayB0aGUgX19EWU5BTUlDIHN5bWJvbCBhcworCXdyaXR0ZW4gZXZlbiBpZiBpdCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgorCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IFVzZSBwbHRfb2Zmc2V0IGZvciB0aGUgYWRkcmVzcyBvZgorCXRoZSBqdW1wIHRhYmxlIHJlbG9jLiAgQWRkIGFuIGFzc2VydGlvbi4gIFVzZSBSRUxPQ19KTVBfU0xPVAorCXJhdGhlciB0aGFuIHRoZSBjb25zdGFudCAyMi4KKwkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IEhhbmRsZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogU2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgR09UIHRvCisJemVybyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiB0aGVyZSBpcyBhIHN5bWJvbCBfX0RZTkFNSUMsCisJd3JpdGUgaXQgb3V0IGF0IHRoZSBzdGFydCBvZiB0aGUgc3ltYm9sIHRhYmxlLgorCisJKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hcm0uby4KKworVGh1IFNlcCAyOCAwMDo1ODowNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBhcm0tKi1jb2ZmLgorCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMuCisJKiB0YXJnZXRzLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IERlY2xhcmUuCisJKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYy4KKwkqIGNvZmYtYXJtLmMgKGFybWNvZmZfe2xpdHRsZSxiaWd9X3ZlYyk6IEFsd2F5cyBkZWZpbmUuCisKK1dlZCBTZXAgMjcgMTA6Mzc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB0YXJnZXRzLmMgKGJmZF9maW5kX3RhcmdldCk6IFJlbW92ZSBkZWJ1Z2dpbmcgY29kZS4KKworV2VkIFNlcCAyNyAwNzoyMzozOSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgorCisJKiBjb2ZmLXBwYy5jLCBwZS1wcGMuYywgcGVpLXBwYy5jOiBJbml0aWFsIGJmZCBmb3IgY29mZi9QRQorICAgICAgICBzdXBwb3J0IG9uIHBvd2VycGMuCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgKi1wcGMgZmlsZXMKKwkqIGNvZmZjb2RlLmg6IHBwYyBNQUdJQywgYW5kIHVzZSBwZWljb2RlLmggcmF0aGVyIHRoYW4gY29mZnN3YXAuaCB0bworICAgICAgICBhbGxvdyBwZSBiYXNlZCAubydzIHRvIGJlIHNoYXJlZCB3aXRoIG90aGVyIHRvb2xzIG9uIHBwYy9OVAorCSogY29uZmlnLmJmZDogYWRkZWQgcG93ZXJwY1tsZV0tW3BlfHdpbm50XSBjb25maWcgc3VwcG9ydAorCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IGFkZGVkIGJmZF9wb3dlcnBjW2xlXV9wZVtpXV92ZWMKKwkqIHBlaWNvZGUuaDogQWRkZWQgbW9yZSBzZWN0aW9uIGZsYWdzIGZvciBQRSBvbiBwcGMKKwkgICAgICAgICAgICAgQWRkZWQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IHRvIGFsbG93IHBlaWNvZGUuaCB0byBiZQorCQkgICAgIHVzZWQgZm9yIG5vbi1pbWFnZSBQRSBmaWxlcyBvbiBwcGMuCisJCSAgICAgQ2hlY2sgZm9yIGltYWdlLCBvciBub3QsIGJlZm9yZSBjb3B5aW5nIHBlX29wdGhkcgorCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgYmZkJ3MKKwkqIHRhcmdldHMuYzogUmVtb3ZlZCB0d28gaW5hY3RpdmUgYmZkcyB0aGF0IHNob3VsZG4ndCBoYXZlIG1hZGUgaXQgdGhpcworICAgICAgICAgICAgICAgICAgICAgZmFyLgorCitUdWUgU2VwIDI2IDE0OjA2OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19yZWxvY190eXBlKTogUmVuYW1lIGZyb20gcmVsb2NfdHlwZSwgYW5kIHVzZQorCWV4cGxpY2l0IHZhbHVlcyB0byBpbml0aWFsaXplIGFsbCByZWxvY3MuICBDaGFuZ2UgYWxsIHVzZXJzLgorCShwcGNfZWxmX2JydGFrZW5faW5uZXIpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGJyYW5jaCBwcmVkaWNpdGlvbgorCXJlbG9jcy4KKwkocHBjX2VsZl9icnRha2VuX3JlbG9jKTogRGl0dG8uCisJKHBwY19lbGZfaG93dG9fcmF3KTogVXNlIG5ldyBmdW5jdGlvbnMuICBNYWtlIHN1cmUgYWxsIHVuc3VwcG9ydGVkCisJcmVsb2NzIHVzZSBwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLgorCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW4gZXJyb3IKKwluZWVkcyB0byBiZSByZXBvcnRlZC4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogU3VwcG9ydCBicmFuY2ggcHJlZGljdGlvbiByZWxvY3MuCisKK1R1ZSBTZXAgMjYgMTI6NDg6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmQuYyAoYmZkX2Fzc2VydCk6IFJlbW92ZSBcbiBmcm9tIHN0cmluZyBwYXNzZWQgdG8KKyAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgorCisJKiBjb2ZmLWkzODYuYzogKFRXT19EQVRBX1NFQ1MpOiBEb24ndCBkZWZpbmUuCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgX2JmZF9tYWtlX3NlY3Rpb25faG9vay4KKwkoYmZkX2NvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWZpbmUuCisJKGNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBSZW1vdmUuCisJKHNlY190b19zdHlwX2ZsYWdzKTogUmVtb3ZlIFRXT19EQVRBX1NFQ1MgY2FzZS4KKwkoc3R5cF90b19zZWNfZmxhZ3MpOiBMaWtld2lzZS4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KKwkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBEb24ndCBpbml0aWFsaXplIG1ha2Vfc2VjdGlvbl9ob29rCisJZmllbGQuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisJKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEp1c3QgY2FsbAorCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5LCBub3QgYmZkX21ha2Vfc2VjdGlvbiBvcgorCWJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgorCSogZWNvZmYuYyAoX2JmZF9lY29mZl9tYWtlX3NlY3Rpb25faG9vayk6IFJlbW92ZS4KKwkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBEb24ndCBkZWNsYXJlLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBEb24ndCBpbml0aWFsaXplCisJbWFrZV9zZWN0aW9uX2hvb2sgZmllbGQuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHRyeSB0byBzdHVmZgorCXBvaW50ZXJzIGludG8gdmFsdWUgZmllbGQgZm9yIHdhcm5pbmcgYW5kIGluZGlyZWN0IHN5bWJvbHM7IGp1c3QKKwlsZWF2ZSB0aGUgdmFsdWUgZmllbGQgYWxvbmUuCisJKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFVzZSBuZXh0IHN5bWJvbCBmb3IKKwl3YXJuaW5nIGFuZCBpbmRpcmVjdCBzeW1ib2xzLCByYXRoZXIgdGhhbiBsb29raW5nIGluIHN5bWJvbCB2YWx1ZS4KKwkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IFJlbW92ZSBpbmRpcmVjdF9wdHJfcHRyCisJcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgUmVtb3ZlIHN1cHBvcnQgZm9yIGluZGlyZWN0CisJc3ltYm9sczsgaXQgZGlkbid0IHdvcmsgYW55aG93LgorCShfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZSBpbmRpcmVjdF9wdHIgdmFyaWFibGUuCisJKiBzeW1zLmM6IENoYW5nZSBjb21tZW50cyBhYm91dCBCU0ZfV0FSTklORyBhbmQgQlNGX0lORElSRUNULgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitNb24gU2VwIDI1IDE2OjA0OjA5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogRm9yIGFsbCAxNC1iaXQgYnJhbmNoIHJlbG9jcywKKwlnbyBiYWNrIHRvIHRlbGxpbmcgdGhlIHRvb2xzIHRoaXMgcmVsb2Mgb3BlcmF0ZXMgb24gMzIgYml0cy4KKworTW9uIFNlcCAyNSAxMTo0ODowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9jYWxsYmFjayk6IFVzZSBfYmZkX2Vycm9yX2hhbmRsZXIKKwlyYXRoZXIgdGhhbiBhIGRpcmVjdCBmcHJpbnRmLgorCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMaWtld2lzZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCisJKHBwY19lbGZfdW5zdXBwb3J0ZWRfcmVsb2MpOiBMaWtld2lzZS4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBpMzg2bGludXguYyAobGludXhfdGFsbHlfc3ltYm9scyk6IExpa2V3aXNlLgorCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCisJKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IExpa2V3aXNlLgorCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCSogc29tLmMgKHNvbV9zaXplb2ZfaGVhZGVycyk6IExpa2V3aXNlLgorCSogc3JlYy5jIChzcmVjX2JhZF9ieXRlKTogTGlrZXdpc2UuCisJKiBiZmQuYyAoYmZkX2Fzc2VydCk6IExpa2V3aXNlLiAgQWxzbyBjaGFuZ2UgZmlsZSB0byBiZSBjb25zdC4KKwkqIGxpYmJmZC1pbi5oIChiZmRfYXNzZXJ0KTogRGVjbGFyZSBmaXJzdCBwYXJhbWV0ZXIgY29uc3QuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKwkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IHJldHVybmluZworCWJmZF9yZWxvY19vdmVyZmxvdyBpcyBlbm91Z2guCisJKiBjb2ZmLWg4MzAwLmMgKHJ0eXBlMmhvd3RvKTogRG9uJ3QgYm90aGVyIHRvIGZwcmludGY7IGp1c3QgYWJvcnQuCisJKiBjb2ZmLWg4NTAwLmMgKHJ0eXBlMmhvd3RvKTogTGlrZXdpc2UuCisJKiBjb2ZmLXo4ay5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgorCSogY29mZmNvZGUuaCAoZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgorCSogZWxmLmMgKF9iZmRfZWxmX2dldF9saW5lbm8pOiBMaWtld2lzZS4KKwkoX2JmZF9lbGZfbm9faW5mb190b19ob3d0byk6IExpa2V3aXNlLgorCShfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCk6IExpa2V3aXNlLgorCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBMaWtld2lzZS4KKwkoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCisJKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlICNpZiAwIHNlY3Rpb25zLgorCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBsaW5lX2J1ZiBmaWVsZC4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBSZW1vdmUgc3RhdGljcyBidWZmZXIKKwlhbmQgZmlsZW5hbWVfYnVmZmVyLiAgSW5zdGVhZCwgdXNlIGEgbWFsbG9jIGJ1ZmZlciBzdG9yZWQgaW4gdGhlCisJbmV3IGxpbmVfYnVmIGZpZWxkLiAgUmVtb3ZlIGxlbmd0aCByZXN0cmljdGlvbnMuCisKKwkqIGNvZmZnZW4uYyAoc3RyaW5nX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgorCShkZWJ1Z19zdHJpbmdfc2l6ZSwgZGVidWdfc3RyaW5nX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBBZGQgc3RyaW5nX3NpemVfcCwgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKKwlhbmQgZGVidWdfc3RyaW5nX3NpemVfcCBwYXJhbWV0ZXJzLiAgVXNlIHRoZW0gaW5zdGVhZCBvZiB0aGUKKwlnbG9iYWwgdmFyaWFibGVzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShjb2ZmX3dyaXRlX3N5bWJvbCk6IExpa2V3aXNlLgorCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCwgY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogTGlrZXdpc2UuCisJKGNvZmZfd3JpdGVfc3ltYm9scyk6IEFkZCBsb2NhbCB2YXJpYWJsZXMgdG8gcmVwbGFjZSByZW1vdmVkCisJZ2xvYmFsIHZhcmlhYmxlcy4KKworCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIG9mZnNldCwgaSwKKwlmdW5jdGlvbiwgYW5kIGxpbmVfYmFzZSBmaWVsZHMuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBVc2Ugc2VjdGlvbiB0ZGF0YSB0byBjYWNoZQorCWluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiB1c2luZyBzdGF0aWMgdmFyaWFibGVzLgorCisJKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IEFkanVzdCBvZmZzZXRzIGluIGFuIE5NQUdJQworCWZpbGUuICBGcm9tIFBldGVyIERlV29sZiA8cGxkQGFtdC50YXkxLmRlYy5jb20+LgorCisJKiBpbml0LmMgKGluaXRpYWxpemVkKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KKwkoYmZkX2luaXQpOiBEb24ndCBib3RoZXIgc2V0dGluZyBpbml0aWFsaXplZC4KKwkoYmZkX2NoZWNrX2luaXQpOiBSZW1vdmUuCisJKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogRG9uJ3QgY2FsbCBiZmRfY2hlY2tfaW5pdC4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitTYXQgU2VwIDIzIDAxOjIyOjIzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgRG9uJ3QgY2hlY2sgdGhlIGNvcmUgZmlsZQorCXNpemUgZm9yIGZ1bGwgY29yZSBkdW1wcy4gQ29weSBjb3JlIGZpbGUgaGVhZGVyIHRvIHByaXZhdGUgZGF0YS4KKwkocnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLAorCXJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogIE5ldyBmdW5jdGlvbnMgdG8gZXh0cmFjdAorCXRoZSBmaWxlIG5hbWUgYW5kIHRlcm1pbmF0aW5nIHNpZ25hbCBmcm9tIHRoZSBjb3JlIGZpbGUuCisJKiBjb2ZmLXJzNjAwMC5jOiAgVXNlIHRoZW0uCisKK0ZyaSBTZXAgMjIgMTc6NDQ6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQ2hhbmdlIGFyY2ggaW5mbyB0byBiZSBjb25zdCwgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLgorCSogYXJjaHVyZXMuYzogUmVpbmRlbnQgbWFueSBmdW5jdGlvbnMuICBDaGFuZ2UgQ09OU1QgdG8gY29uc3QuCisJKGJmZF9hcmNoX2luZm9fdHlwZSk6IE1ha2UgYXJjaF9uYW1lIGNvbnN0LiAgUmVtb3ZlIGRpc2Fzc2VtYmxlOworCW5vdGhpbmcgc2V0IGl0IGFueWhvdy4gIE1ha2UgbmV4dCBjb25zdC4KKwkoYmZkX2FyY2hfaW5mb19saXN0KTogUmVtb3ZlLgorCShiZmRfYXJjaHVyZXNfbGlzdCk6IFJlbmFtZSBmcm9tIGFyY2h1cmVzX2luaXRfdGFibGUuICBDaGFuZ2UgZnJvbQorCWEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gYSB0YWJsZSBvZiBiZmRfYXJjaF9pbmZvX3R5cGUKKwlzdHJ1Y3R1cmUgYWRkcmVzc2VzLgorCShiZmRfc2Nhbl9hcmNoKTogUmV3cml0ZSBhY2NvcmRpbmdseS4gIFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCisJKGJmZF9sb29rdXBfYXJjaCk6IExpa2V3aXNlLgorCShiZmRfc2V0X2FyY2hfaW5mbyk6IFJld3JpdGUgYWNjb3JkaW5nbHkuICBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgYQorCWNvbnN0IHBvaW50ZXIuCisJKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KTogTWFrZSBjb25zdC4KKwkoYmZkX2FyY2hfaW5pdCwgYmZkX2FyY2hfbGlua2luKTogUmVtb3ZlLgorCShiZmRfZ2V0X2FyY2hfaW5mbyk6IFJldHVybiBhIGNvbnN0IHBvaW50ZXIuCisJKiBpbml0LmMgKGJmZF9pbml0KTogRG9uJ3QgY2FsbCBiZmRfYXJjaF9pbml0LgorCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTWFrZSBhcmNoX2luZm8gY29uc3QuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKwkqIGNvbmZpZ3VyZS5pbjogUHV0ICYgYmVmb3JlIGV2ZXJ5dGhpbmcgaW4gJHNlbGFyY2hzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY3B1LSouYzogQ2hhbmdlIGJmZF8qX2FyY2ggZnJvbSBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzCisJYmZkX2FyY2hfbGlua2luIHRvIGEgY29uc3Qgc3RydWN0dXJlLgorCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogTWFrZSBhcmNoIGNvbnN0LgorCitGcmkgU2VwIDIyIDE2OjIzOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCByZWxvY2F0aW9ucyB0byBzdXBwb3J0IGFsbCBvZgorCVBvd2VyUEMgVi40LgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgorCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCisKKwkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogVXBkYXRlIG5hbWVzIHRvIG1hdGNoIGN1cnJlbnQgZHJhZnQuCisJKHBwY19lbGZfaG93dG9fcmF3KTogTWFyayAxNCBiaXQgcmVsb2NzIGFzIHNob3J0IHNpemVkIGFuZCBQQworCXJlbGF0aXZlLiAgVXBkYXRlIG5hbWVzIHRvIGN1cnJlbnQgVi40IGRyYWZ0LgorCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHN1cHBvcnQgZm9yIG1vcmUgcmVsb2NhdGlvbnMuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSByZWxvY2F0aW9ucyB0byBtYXRjaCBkcmFmdC4KKworVGh1IFNlcCAyMSAyMTo1MzoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsbG93IG1vZHVsZXMKKwljb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZCB3aXRoIGVpdGhlciBub3JtYWwKKwltb2R1bGVzIG9yIC1tcmVsb2NhdGFibGUgbW9kdWxlcy4KKworV2VkIFNlcCAyMCAxMjowMzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYXIgdGhlIHZzdGFtcCBmaWVsZAorCWluIHRoZSBhLm91dCBoZWFkZXIuCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogRG9uJ3Qgc2V0IHJfZXh0ZXJuIGZvcgorCWEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgZXZlbiBpZiBpdCdzIG5vdCBhIHNlY3Rpb24uCisKK1R1ZSBTZXAgMTkgMTc6MDI6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW1vdmUgdW51c2VkIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIEFsbCBiYWNrZW5kczogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIGFsaWduX3Bvd2VyX21pbi4KKworVHVlIFNlcCAxOSAxNDowMjoyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogR2V0IHNpemVzIGZvciBCU1MgcmlnaHQuCisKK01vbiBTZXAgMTggMTQ6MzU6MDEgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+CisKKwkqIGNvbmZpZy5iZmQgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgorCSogY29uZmlndXJlLmhvc3QgKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgaG9zdC4KKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyBuYXRpdmUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBTZXAgMTUgMTA6MjQ6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJTWFrZSB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBtZXJnZSBjb21tb24gdHlwZXM6CisJKiBjb2ZmbGluay5jIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50KTogRGVmaW5lLgorCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKTogRGVmaW5lLgorCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KTogRGVmaW5lLgorCShzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlKTogRGVmaW5lLgorCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCk6IERlZmluZS4KKwkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUpOiBEZWZpbmUuCisJKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXApOiBEZWZpbmUuCisJKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBkZWJ1Z19tZXJnZSBmaWVsZC4KKwkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShfYmZkX2NvZmZfZmluYWxfbGluayk6IEFsbG9jYXRlIGFuZCBmcmVlIGRlYnVnX21lcmdlIHRhYmxlLgorCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCBhbmQgdW5pb24KKwl0eXBlcy4KKworVGh1IFNlcCAxNCAxNDo1Mzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlDb252ZXJ0IGk5NjAgQ09GRiB0byB1c2UgQ09GRiBiYWNrZW5kIGxpbmtlci4KKwkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBVc2UgYSBjb2ZmX3NlY3Rpb25fZGF0YQorCXN0cnVjdHVyZSB0byBzdG9yZSB0aGUgc3ltYm9sIGJlaW5nIHVzZWQuCisJKGNvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZS4KKwkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgorCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUuCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGNhbGxiYWNrIGZ1bmN0aW9uCisJX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsuCisJKGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUuCisJKGNvZmZfc3RhcnRfZmluYWxfbGluayk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBBZGQgY29mZl9zdGFydF9maW5hbF9saW5rLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogTWFrZSBnbG9iYWxseQorCXZpc2libGUuCisJKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FsbCBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIGlmIHRoZQorCWZ1bmN0aW9uIGNhbGxiYWNrIGlzIG5vdCBOVUxMLgorCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKTogQWRkIHRkYXRhIGZpZWxkLgorCShfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBEZWNsYXJlLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLmluIChpY29mZl9iaWdfdmVjKTogQWRkIGNvZmZsaW5rLm8uCisJKGljb2ZmX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIFNlcCAxMyAxNzozODoyMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjbGVhbi1pbmZvKTogUmVtb3ZlIGV4dHJhbmVvdXMgdGFiIGZyb20gbGluZQorCWZvbGxvd2luZyBhY3Rpb24uCisKK1dlZCBTZXAgMTMgMTM6Mjc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRmFpbCBpZiBhIHNlY3Rpb24gd2l0aCBubworCWNvbnRlbnRzIGhhcyByZWxvY3MuCisKK1RodSBTZXAgMTIgMTI6NDU6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBLZWVwIHRoZQorCXJhdyBzaXplIHNhZmUuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtZW1iZXIgaWYgaXQncyBhIHJlbG9jYXRhYmxlCisJZmlsZS4KKwkqIGxpYmNvZmYtaW4uaCAocGVfZGF0YV90eXBlKTogTmV3IG1lbWJlciAnaGFzX3JlbG9jX3NlY3Rpb24nCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IENsZWFyIG5vdC1yZWxvYyBmbGFnCisJaWYgcmVsb2NhdGFibGUgZmlsZS4gU3dhcCBvdXQgc2F2ZWQgcmF3IHNpemUuCisKK1R1ZSBTZXAgMTIgMTI6MTQ6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IFJlbmFtZSBmcm9tIGRvX3JlYWxjbGVhbi4KKwkobWFpbnRhaW5lci1jbGVhbik6IFJlbmFtZSBmcm9tIHJlYWxjbGVhbiwgcGFzc2luZworCW1haW50YWluZXItY2xlYW4gZG93biB0byBzdWJkaXJlY3RvcmllcywgYnV0IGxlYXZlIHJlYWxjbGVhbiBhcyBhCisJc3lub255bS4KKworCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUGFzcyBzeW1ib2wgbmFtZSB0bworCXdhcm5pbmcgY2FsbGJhY2suCisKKwkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBjb25maWcuaCBmcm9tIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMuCisKKwkqIHN1bm9zLmMgKHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwKKwlicm9rZW4gb3V0IG9mIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYi4KKwkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogQ2FsbCBuZXcgZnVuY3Rpb24KKwlzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYi4KKwkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFkZCB0aHJlZSBuZXcgcGFyYW1ldGVycy4gIFJldHVybiB0aGUKKwlkeW5hbWljIHN5bWJvbCB0YWJsZSB0byB0aGUgY2FsbGVyLgorCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IGFkZF9keW5hbWljX3N5bWJvbHMKKwljYWxsYmFjayB0byBvdmVycmlkZSB0aGUgc3ltYm9scyBiZWluZyByZWFkLgorCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgdGhyZWUgbmV3IHBhcmFtZXRlcnMKKwl0byBhZGRfZHluYW1pY19zeW1ib2xzIGNhbGxiYWNrLgorCisJRXh0ZW5zaXZlIG1pbm9yIGNoYW5nZXMgdG8gYXZvaWQgdmFyaW91cyBnY2Mgd2FybmluZ3MuICBBbHNvOgorCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIGNvZmYtYXJtLm8uCisJKiBhcmNodXJlcy5jIChiZmRfYXJjaF9pbmZvX3R5cGUpOiBDaGFuZ2UgbWFjaCBmaWVsZCBmcm9tIGxvbmcgdG8KKwl1bnNpZ25lZCBsb25nLgorCShiZmRfbG9va3VwX2FyY2gpOiBDaGFuZ2UgbWFjaGluZSBwYXJhbWV0ZXIgZnJvbSBsb25nIHRvIHVuc2lnbmVkCisJbG9uZy4KKworTW9uIFNlcCAxMSAxMDo1NTo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IEZpeCBCRkRfQVNTRVJUOiBpdCdzIE9LIHRvIGZpbmQKKwlhIHN5bWJvbCB3aXRoIGEgbm9uLXplcm8gcGx0X29mZnNldC4KKworRnJpIFNlcCAgOCAxMTo0NzoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoYWxpZ25fZmlsZV9wb3NpdGlvbik6IFJlbW92ZTsgbm90IHVzZWQuCisKKwkqIGNvbmZpZ3VyZS5pbjogT25seSBjaGVjayBmb3IgPHN5cy9wcm9jZnMuaD4gb24gYSBuYXRpdmUgc3lzdGVtLAorCWFuZCBtYWtlIHN1cmUgaXQgZGVmaW5lcyBwcnN0YXR1c190LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUaHUgU2VwICA3IDEyOjQ4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vub3MuYyAoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBDb3JyZWN0IG02OGsgYWJvcnQgdGVzdC4KKworCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgorCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KKwljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgorCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KKworCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KKwkoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUuCisJKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaW46IENyZWF0ZSBzdGFtcC1oIHdoZW4gcmVidWlsZGluZyBjb25maWcuaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIFNlcCAgNiAxNTowMDozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSLiAgU3Vic3RpdHV0ZQorCUhPU1RfNjRCSVRfTE9ORy4gIENoZWNrIHRoYXQgdmFyaW91cyBoZWFkZXIgZmlsZXMgZXhpc3QuICBDaGVjaworCXRoYXQgZmNudGwgZXhpc3RzLiAgQ2FsbCBCRkRfQklOQVJZX0ZPUEVOLiAgQ2hlY2sgd2hldGhlciBtYWxsb2MKKwlhbmQvb3IgZnJlZSBuZWVkIHRvIGJlIGRlY2xhcmVkLiAgRG9uJ3QgbWFrZSBhIGxpbmsgdG8gc3lzZGVwLmguCisJRGVmaW5lIFRSQURfSEVBREVSIGZvciB2YXJpb3VzIGhvc3RzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBteV9ob3N0LiAgQWRkIGRlZmluaXRpb25zIHRha2VuIGZyb20KKwlob3N0IGhlYWRlciBmaWxlcyBmb3IgdmFyaW91cyBlbnRyaWVzLiAgUmVtb3ZlIGVudHJpZXMgd2hpY2ggbm93CisJZG8gbm90aGluZy4KKwkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgorCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgorCSogc3lzZGVwLmg6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKGRvX2Rpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KKwkoUkVDT05GSUcpOiBSZW1vdmUuCisJKExPQ0FMX0hfREVQUyk6IE5ldyB2YXJpYWJsZS4KKwkoJChCRkRfTElCUykpOiBVc2UgJChMT0NBTF9IX0RFUFMpIHJhdGhlciB0aGFuIGxpYmJmZC5oIGFuZAorCSQoUkVDT05GSUcpLgorCSgkKEJGRF9NQUNISU5FUyksICQoQkZEX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgorCSgkKE9QVElPTkFMX0JBQ0tFTkRTKSk6IExpa2V3aXNlLgorCShzdG1wLWJmZC5oKTogSnVzdCBzdWJzdGl0dXRlIGZvciBCRkRfSE9TVF82NEJJVF9MT05HLCByYXRoZXIgdGhhbgorCWxvb2tpbmcgdGhyb3VnaCBzeXNkZXAuaC4KKwkqIGJmZC1pbi5oIChCRkRfSE9TVF82NEJJVF9MT05HKTogRGVmaW5lOyBzZXQgYnkgTWFrZWZpbGUuCisJKEJGRF9IT1NUXzY0X0JJVCk6IERlZmluZSBiYXNlZCBvbiBCRkRfSE9TVF82NEJJVF9MT05HLgorCShmcHJpbnRmX3ZtYSwgc3ByaW50Zl92bWEpOiBMaWtld2lzZS4KKwkoaW50NjRfdHlwZSwgdWludDY0X3R5cGUpOiBEb24ndCBkZWZpbmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBhcmNodXJlcy5jLCBiZmQuYywgc3JlYy5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KKwkqIGVsZmNvcmUuaDogQ2hlY2sgSEFWRV9TWVNfUFJPQ0ZTX0ggcmF0aGVyIHRoYW4gSEFWRV9QUk9DRlMuCisJKiBseW54LWNvcmUuYzogSW5jbHVkZSBzdHVmZiBmcm9tIG9sZCBob3N0cy9seW54LmguCisJKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDaGVjayBIQVZFX0ZOQ1RMIGFuZCBkZWZpbmVkIChGX0dFVEZMKSwKKwlyYXRoZXIgdGhhbiBOT19GQ05UTC4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KTogQ2hlY2sgSE9TVF9IUFBBSFBVWCBhbmQgISBfX1NURENfXworCXJhdGhlciB0aGFuIE5BVElWRV9IUFBBSFBVWF9DT01QSUxFUi4KKwkqIHRyYWQtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxlcnJuby5oPi4gIEluY2x1ZGUgVFJBRF9IRUFERVIgaWYgaXQKKwlpcyBkZWZpbmVkLgorCSogaG9zdHMvKi5oOiBSZW1vdmUgYWxsIGhlYWRlciBmaWxlcyB3aGljaCBtZXJlbHkgaW5jbHVkZSwKKwlkZWNsYXJlLCBhbmQgZGVmaW5lIHRoaW5ncy4gIExlYXZlIGhlYWRlciBmaWxlcyB3aGljaCBkZWZpbmUKKwlpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdHJhZC1jb3JlLmMuCisKKwkqIGFjbG9jYWwubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBEZWZpbmUuCisJKEJGRF9DQ19GT1JfQlVJTEQpOiBEZWZpbmUuCisJKiBjb25maWd1cmUuaW46IFVzZSBCRkRfQ0NfRk9SX0JVSUxELgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgU2VwICA1IDE5OjM1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogRG9uJ3QgdHJ5IHRvIGdyZXAgLi4vTWFrZWZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY29mZi1zcGFyYy5jIChDQUxDX0FEREVORCk6IERvbid0IHNldCB0aGUgYWRkZW5kIHRvIHRoZSB2YWx1ZSBvZgorCWEgZ2xvYmFsIHN5bWJvbC4KKworVHVlIFNlcCAgNSAxMjo0ODoyNiAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IGkzODZwZV92ZSAtPiBpMzg2cGVfdmVjLgorCitNb24gU2VwICA0IDE0OjAyOjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3Q6IEluY29ycG9yYXRlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnRzIGJ5IHNldHRpbmcKKwlzaGVsbCB2YXJpYWJsZXMuCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQy4gIFN1YnN0aXR1dGUgQ0ZMQUdTLCBIREVGSU5FUyBhbmQKKwlBUi4gIENhbGwgQUNfUFJPR19JTlNUQUxMLiAgU3Vic3RpdHV0ZSBDQ19GT1JfQlVJTEQsIGNob29zaW5nIGEKKwl2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb2RlIGlzIGJlaW5nIGNvbXBpbGVkIGJ5IGEgY3Jvc3MKKwljb21waWxlci4gIERvbid0IHN1YnN0aXR1dGUgaG9zdF9tYWtlZmlsZV9mcmFnIG9yIGZyYWdzLgorCSogYWNsb2NhbC5tNDogTmV3IGZpbGUgdG8gZGVmaW5lIGxvY2FsIEFDX1BST0dfQ0MuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCisJKElOU1RBTExfUFJPR1JBTSk6IFNldCB0byBASU5TVEFMTF9QUk9HUkFNQC4KKwkoSU5TVEFMTF9EQVRBKTogU2V0IHRvIEBJTlNUQUxMX0RBVEFALgorCShBUik6IFNldCB0byBAQVJALgorCShDQyk6IERlZmluZSBhcyBAQ0NALgorCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCisJKENDX0ZPUl9CVUlMRCk6IFNldCB0byBAQ0NfRk9SX0JVSUxEQC4KKwkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCisJKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChIREVGSU5FUykgdG8gQEhERUZJTkVTQC4gIE1vdmUgJChDRkxBR1MpCisJYWZ0ZXIgb3RoZXIgb3B0aW9ucy4KKwkoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSBkZXBlbmRlbmN5IHVwb24gQGZyYWdzQC4KKwkqIGNvbmZpZy8qLm1oLCBjb25maWcvUkVBRE1FOiBSZW1vdmUuCisKKwkqIGNvbmZpZy5iZmQ6IFJld3JpdGUgdG8gaW5jb3Jwb3JhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNYWtlZmlsZQorCWZyYWdtZW50cyBieSBzZXR0aW5nIHNoZWxsIHZhcmlhYmxlcywgcmF0aGVyIHRoYW4gbWVyZWx5IHJldHVybmluZworCXRoZSBuYW1lIG9mIGEgTWFrZWZpbGUgZnJhZ21lbnQuCisJKiBjb25maWd1cmUuaW46IFVzZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IGNvbmZpZy5iZmQgcmF0aGVyIHRoYW4KKwlsb29raW5nIGF0IHRoZSB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgZmlsZXMuICBEb24ndCBzdWJzdGl0dXRlCisJdGFyZ2V0X21ha2VmaWxlX2ZyYWcuICBEbyBzdWJzdGl0dXRlIFRERUZJTkVTLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKEB0YXJnZXRfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCisJKEFMTF9DRkxBR1MpOiBDaGFuZ2UgJChUREVGSU5FUykgdG8gQFRERUZJTkVTQC4KKwkqIGNvbmZpZy8qLm10OiBSZW1vdmUuCisKK01vbiBTZXAgIDQgMDM6MTM6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUHV0IGNoYW5nZXF1b3RlIGxpbmVzIGFyb3VuZCAiaVszNDVdODYiIHBhdHRlcm5zCisJc2VjdGlvbiBvZiBjb3JlIGZpbGUgc3VwcG9ydC4KKworU3VuIFNlcCAgMyAxMTozMTo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSB0byB1c2UgdGhlCisJZ2VuZXJpYyB2ZXJzaW9uLgorCitGcmkgU2VwICAxIDE3OjA4OjQwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBBZGQgSW1hZ2VCYXNlIHRvCisJZW50cnksIHRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQuCisKK0ZyaSBTZXAgIDEgMTg6MDY6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogUmVtb3ZlICQoVERFUEZJTEVTKS4KKwkqIGNvbmZpZy9hcG9sbG8ubXQgKFRERVBGSUxFUyk6IFJlbW92ZS4KKwkqIGNvbmZpZy9SRUFETUU6IFVwZGF0ZS4KKworCSogY29uZmlndXJlLmluOiBGb3IgYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgc2V0IENPUkVGSUxFIGFuZAorCUNPUkVGTEFHIGJhc2VkIG9uIHRoZSBjYW5vbmljYWwgaG9zdCBuYW1lLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShBTExfQ0ZMQUdTKTogQWRkIEBDT1JFRkxBR0AuCisJKE9GSUxFUyk6IFJlcGxhY2UgJChIREVQRklMRVMpIHdpdGggQENPUkVGSUxFQC4KKwkqIGNvZmYtcnM2MDAwLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYIGZvciBjb3JlIGZpbGUKKwlzdXBwb3J0IHJvdXRpbmVzLiAgQ2hlY2sgTFlOWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfTFlOWC4KKwkqIGx5bngtY29yZS5jOiBDaGVjayBMWU5YX0NPUkUgcmF0aGVyIHRoYW4gSE9TVF9MWU5YLgorCSogaTM4Nmx5bnguYzogTGlrZXdpc2UuCisJKiBtNjhrbHlueC5jOiBMaWtld2lzZS4KKwkqIHNwYXJjbHlueC5jOiBMaWtld2lzZS4KKwkqIHJzNjAwMC1jb3JlLmM6IENoZWNrIEFJWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfQUlYLgorCSogKi1jb3JlLmM6IENvbW1lbnQgY2hhbmdlcy4KKwkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVQRklMRVMpOiBSZW1vdmUuCisJKEhERUZJTkVTKTogUmVtb3ZlIC1EVFJBRF9DT1JFLgorCSogY29uZmlnL2lyaXgzLm1oIChSQU5MSUIpOiBSZW1vdmUuCisJKiBjb25maWcvaXJpeDQubWggKEhERVBGSUxFUywgUkFOTElCKTogUmVtb3ZlLgorCShIREVGSU5FUyk6IFJlbW92ZSAtRElSSVhfQ09SRS4KKwkqIGNvbmZpZy9yaXNjb3MubWggKFJBTkxJQiwgSERFUEZJTEVTKTogUmVtb3ZlLgorCShIREVGSU5FUyk6IFJlbW92ZSAtRFRSQURfQ09SRS4KKwkqIGNvbmZpZy9uY3IzMDAwLm1oIChBUl9GTEFHUywgUkFOTElCKTogUmVtb3ZlLgorCSogY29uZmlnL3VsdHJhMy5taCAoUkFOTElCKTogUmVtb3ZlLgorCSogY29uZmlnL2FpeDQubWgsIGNvbmZpZy9hbHBoYW9zZi5taCwgY29uZmlnL2FtaXgubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9kZWx0YTY4Lm1oLCBjb25maWcvZGVsdGE4OC5taDogUmVtb3ZlLgorCSogY29uZmlnL2RweDIubWgsIGNvbmZpZy9lc2l4Lm1oLCBjb25maWcvaGFycmlzLm1oOiBSZW1vdmUuCisJKiBjb25maWcvaHAzMDAubWgsIGNvbmZpZy9ocDMwMGJzZC5taCwgY29uZmlnL2hwcGFic2QubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy9ocHBhaHB1eC5taCwgY29uZmlnL2hwcGFvc2YubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy9pMzg2YWl4Lm1oLCBjb25maWcvaTM4NmJzZC5taDogUmVtb3ZlLgorCSogY29uZmlnL2kzODZsaW51eC5taCwgY29uZmlnL2kzODZtYWNoMy5taDogUmVtb3ZlLgorCSogY29uZmlnL2kzODZzY28ubWgsIGNvbmZpZy9pMzg2di5taCwgY29uZmlnL2kzODZ2NC5taDogUmVtb3ZlLgorCSogY29uZmlnL2lyaXg1Lm1oLCBjb25maWcvbTg4a21hY2gzLm1oLCBjb25maWcvbWlwc2JzZC5taDogUmVtb3ZlLgorCSogY29uZmlnL21pcHNtYWNoMy5taCwgY29uZmlnL25ld3MtbWlwcy5taDogUmVtb3ZlLgorCSogY29uZmlnL25ld3MubWgsIGNvbmZpZy9wYzUzMm1hY2gubWgsIGNvbmZpZy9yaXNjaXgubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy9yczYwMC5taCwgY29uZmlnL3JzNjAwMGx5bngubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy9zb2xhcmlzMi5taCwgY29uZmlnL3N0cmF0dXMubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy9zeW1tZXRyeS5taCwgY29uZmlnL3N5c3Y0Lm1oLCBjb25maWcvdGFob2UubWg6IFJlbW92ZS4KKwkqIGNvbmZpZy92YXhic2QubWgsIGNvbmZpZy92YXh1bHQubWgsIGNvbmZpZy92YXh1bHQyLm1oOiBSZW1vdmUuCisKK0ZyaSBTZXAgIDEgMTU6MTg6NTAgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2hhbmdlIGEgRFRfSU5JVCBvcgorCURUX0ZJTkkgZW50cnkgaWYgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuCisKKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzCisJYW5kIHdhbnRfaGRyX2luX3NlZyBmaWVsZHMuCisJKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRGVmaW5lIGlmIG5vdAorCWRlZmluZWQuCisJKGVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KKwkoZWxmTk5fYmVkKTogSW5pdGlhbGl6ZSBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGFuZAorCXdhbnRfaGRyX2luX3NlZy4KKwkqIGVsZi5jIChnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgY3JlYXRlX3Byb2dyYW1faGVhZGVycworCWJhY2tlbmQgcm91dGluZS4KKwkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDaGVjayB3YW50X2hkcl9pbl9zZWcgYmFja2VuZCBmaWVsZC4gIENhbGwKKwljcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGJhY2tlbmQgcm91dGluZS4KKworCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gbm9uIGFsbG9jYXRlZAorCXNlY3Rpb25zIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZS4KKworCSogZWxmY29kZS5oIChlbGZfc3dhcF9waGRyX2luKTogTWFrZSBub24gc3RhdGljLgorCShlbGZfc3dhcF9waGRyX291dCk6IE1ha2Ugbm9uIHN0YXRpYy4KKwkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KKwkoYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgorCShiZmRfZWxmNjRfc3dhcF9waGRyX2luKTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBEZWNsYXJlLgorCisJKiBlY29mZmxpbmsuYyAoZWNvZmZfY29sbGVjdF9zaHVmZmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyKTogTmV3IGZ1bmN0aW9uLgorCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0pOiBOZXcgZnVuY3Rpb24uCisJKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogTmV3IGZ1bmN0aW9uLgorCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3Bkcik6IERlY2xhcmUuCisJKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSk6IERlY2xhcmUuCisJKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzKTogRGVjbGFyZS4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitGcmkgU2VwICAxIDEzOjIwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEZpeCB0eXBvLgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBpbmRpcmVjdCBhbmQKKwl3YXJuaW5nIHN5bWJvbHMuICBJZiBhbnkgc2VjdGlvbiBpcyBuYW1lZCAuZ251Lndhcm5pbmcuWFhYLCB0cmVhdAorCXRoZSBjb250ZW50cyBhcyBhIHdhcm5pbmcgdG8gYmUgaXNzdWVkIGlmIHRoZSBzeW1ib2wgWFhYIGlzCisJcmVmZXJlbmNlZC4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEZvciBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwganVzdAorCW91dHB1dCB0aGUgc3ltYm9sIGl0IHBvaW50cyB0by4KKworCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBib3RoZXIgdG8gc2V0IGJmZF9lcnJvcgorCWlmIGJmZF9oYXNoX2FsbG9jYXRlIGZhaWxzLCBzaW5jZSBpdCB3aWxsIGFscmVhZHkgYmUgc2V0LgorCShnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCisJKGFyY2hpdmVfaGFzaF9uZXdmdW5jKTogTGlrZXdpc2UuCisJKGhhc2hfZW50cnlfYmZkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBQYXNzIG5ldyBhcmd1bWVudHMgdG8gd2FybmluZworCWNhbGxiYWNrLiAgQWxsb2NhdGUgYSBuZXcgd2FybmluZyB1c2luZyB0aGUgaGFzaCB0YWJsZSBuZXdmdW5jLgorCVVzZSBiZmRfaGFzaF9yZXBsYWNlIHRvIHVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUsIHJhdGhlcgorCXRoYW4gYXNzdW1pbmcgd2UgY2FuIGNvcHkgdGhlIGZpZWxkcyB3aXRoIHN0cnVjdHVyZSBhc3NpZ25tZW50LgorCisJKiBoYXNoLmMgKGJmZF9oYXNoX3JlcGxhY2UpOiBOZXcgZnVuY3Rpb24uCisJKiBiZmQtaW4uaCAoYmZkX2hhc2hfcmVwbGFjZSk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKK0ZyaSBTZXAgIDEgMDg6MTI6NTAgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAYmVhdXR5LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBtaXBzKnZyNDMwMC0qLWVsZiogdGFyZ2V0LgorCSogY29uZmlnL21pcHNidnI0MzAwLm10OiBBZGRlZC4KKworVGh1IEF1ZyAzMSAxNjowMDo1MyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgorCSogYmZkLWluLmggKFBFIFNUVUZGKTogRGVsZXRlZC4KKwkqIGJmZC5jICh0ZGF0YS0+cGVfb2JqX2RhdGEpOiBOZXcuCisJKGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgorCSogY29mZi1pMzg2LmMsIGNvZmYtYXJtLmMgKGNvZmZfKi1ydHlwZV90b19ob3d0byk6IEdldCBpbWFnZSBiYXNlIGZyb20KKwluZXcgcGxhY2UuCisJKiBsaWJjb2ZmLmgsIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IERlbGV0ZQorCShjb2ZmX21rb2JqZWN0LCBjb2ZmX21rb2JqZWN0X2hvb2spOiBDb25kaXRpb25hbGx5IGJ1aWxkLgorCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExvb2sgaW4gbmV3IHBsYWNlLgorCShhZGRfZGF0YV9lbnRyeSwgZmlsbF9wZV9oZWFkZXJfaW5mbyk6IERlbGV0ZWQuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIFBFIHN0dWZmLgorCShjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgorCSogY29mZnN3YXAuaDogUmVtb3ZlIFBFIHN0dWZmLgorCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCisJKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZSk6IE5ldy4KKwkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCisJKiB0YXJnZXRzLmMgKF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KKwkqIHBlaWNvZGUuaDogTmV3IGZpbGUuCisKK1RodSBBdWcgMzEgMTE6NDk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmQtaW4uaDogQWRkIGV4dGVybiAiQyIgaWYgX19jcGx1c3BsdXMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKKwkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb252ZXJ0IGEgcmVsb2MKKwlhZ2FpbnN0IGFuIGFic29sdXRlIHN5bWJvbCBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uCisKK1RodSBBdWcgMzEgMDg6MDA6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKwkKKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jKTogRml4IGNvbW1vbiBzaXplIHByb2JsZW0uCisJKGkzY29mZl9vYmplY3RfcCk6IERlbGV0ZS4KKworV2VkIEF1ZyAzMCAyMDo0MToyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChkZWxldGVtZWFjb2ZmX2FybV9yZWxvYyk6IERlbGV0ZWQuCisJKGFybTI2KTogTm90IHBhcnRpYWwgaW5wbGFjZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG9uJ3QKKwlkbyBwYWdlIGFsaWduaW5nIGlmIENPRkZfUEFHRV9TSVpFIGlzbid0IGRlZmluZWQuCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogVXBkYXRlIGltYWdlIGJhc2UgY29ycmVjdGx5LgorCitUdWUgQXVnIDI5IDEzOjUwOjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKToKKwlDb21waWxlIGV2ZW4gaWYgQ09GRl9QQUdFX1NJWkUgaXNuJ3QgZGVmaW5lZC4KKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogV3JpdGUKKwliYXNlIGZpbGUgaW5mbyBhcyBydmFzLgorCSogY29mZi1hcm0uYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlYWwgd2l0aCByZWxvYyAxMS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlICNpZjBlZCBjb2RlCisJT25seSByZW1vdmUgZW1wdHkgc2VjdGlvbnMgaW4gUEUgaW5tYWdlIGZpbGVzLgorCSogbGliYmZkLmgsIGJmZC1pbjIuaDogcmVnZW5lcmF0ZWQuCisJKiBjb2ZmLWFybS5jIChhb3V0YXJtX3N0ZF9yZWxvKTogTmV3IGVudHJ5IGF0IDExLgorCShhcm1fcmVsb2NfdHlwZV9sb29rdXApIDogVW5kZXJzdGFuZCB0eXBlIDExLgorCSogY29mZi1pMzg2LmMgKGhvd3RvX3RhYmxlKTogZml4IG5hbWUgb2YgcnZhIHR5cGUuCisJKGNvZmYtaTM4Nl9ydHlwZV90b19ob3d0byk6IFVuZGVyc3RhbmQgUl9JTUFHRUJBU0UgdHlwZS4KKwkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogLmVkYXRhIGlzIGRhdGEuCisJKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogR2V0IHBhZ2Ugc2l6ZSByaWdodCBmb3IgUEUuCisJUGFnZXNpemUgaW5mbyBpcyBvbmx5IHZhbGlkIGluIFBFIGltYWdlIGZpbGVzLgorCShmaWxsX3BlX2hlYWRlcl9pbmZvKTogRml4IGZpZWxkcy4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZW5kX29mX2ltYWdlIGNhbGMuCisJKF9iZmRfY29mZl9nZW5lcmF0ZV9yZWxvY19zZWN0aW9uKTogUmVtb3ZlIG9ycGhhbmVkIGNvbW1lbnQuCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX2luKTogRG9uJ3QgYWx3YXlzIGFkZCBJTUFHRV9CQVNFLgorCVN3YXAgaW4gUEUgaGVhZGVyLgorCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldHVwIFBFIGZsYWdzIGNvcnJlY3RseS4KKwkqIHJlbG9jLmMgKEJGRF9SRUxPQ19SVkEpOiBOZXcgZmllbGQuCisKK1RodSBBdWcgMjQgMTc6NDk6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgaW5jbHVkZSBsaW5lIG51bWJlcnMgZm9yCisJYSBzZWN0aW9uIGlmIGl0cyBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCisKK1dlZCBBdWcgMjMgMTY6NDg6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBBZGQgcGFyZW50aGVzZXMgdG8gRklYCisJZXhwcmVzc2lvbiB0byBhdm9pZCBjb21waWxlciBidWcgb24gSFAtVVggOS4wMS4KKworV2VkIEF1ZyAyMyAwOTo0OTozOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BydGwuY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBVbmFuc2lmeS4KKworTW9uIEF1ZyAyMSAxNzo0OToyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBiZmQtaW4uaCAoYmZkX2xpbmtfc3Vic3lzdGVtKTogVHVybiBlbnVtIGludG8gI2RlZmluZXMuCisJKGJmZF9saW5rX3BlX2luZm9fZHZhbCk6IE5ldworCShiZmRfbGlua19zdGFja19oZWFwKTogUmVuYW1lZCBhbmQgbWFzc2FnZWQgaW50byBiZmRfbGlua19wZV9pbmZvLgorCSogYmZkLWluMi5oOiByZWJ1aWx0LgorCSogYmZkLmMgKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZWQuCisJKiBjb2ZmY29kZS5oIChwZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KKwkoZmlsbF9wZV9oZWFkZXJfaW5mbyk6IE5ldyBmdW5jdGlvbi4KKwkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgbmV3IGZ1bmN0aW9uLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluaXRpYWx6ZSBsaW5rX2RhdGEgaWYgbm90IHNldC4KKwkqIGNvZmZsaW5rLmMgKGNvZmZfZmluYWxfbGlua19pbmZvKTogUmVtb3ZlIHBlIHJhbmRvbW5lc3MuCisJKGRvcmVzX2NvbSk6IFVwZGF0ZSBpbmZvIGluIGJmZF9saW5rX3BlX2luZm9fZHZhbC4KKwkocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IFVzZSB0aGUgYmZkX2xpbmtfcGVfaW5mb19kdmFsLgorCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFJlbW92ZSBQRSBzdHVmZiwgaW5pdGlhbGl6ZQorCWNvZmZfZGF0YS0+bGlua19pbmZvLgorCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX1thb3V0fGZpbGVoZHJdX291dCk6IFVzZSBpbmRpcmVjdCBQRSBwb2ludGVyLgorCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSByZWFsIGltYWdlYmFzZS4KKwkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUubGlua19pbmZvKTogTmV3IGZpZWxkLgorCitNb24gQXVnIDIxIDExOjEwOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogSWYgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSBmb2xsb3dzIGFuCisJdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlLCBjaGFuZ2UgdGhlIHR5cGUgdG8gdW5kZWZpbmVkLgorCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGFuCisJdW5kZWZpbmVkIHdlYWsgcmVmZXJlbmNlIGFzIGRlZmluZWQsIGluIGNhc2UgaXQgdHVybnMgaW50byBhIHJlYWwKKwl1bmRlZmluZWQgcmVmZXJlbmNlIGxhdGVyIGluIHRoZSBzYW1lIGFyY2hpdmUuCisKK1RodSBBdWcgMTcgMTY6Mjk6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBDYXN0IHZhbHVlIGZvciB1c2VkX2J5X2JmZCBmaWVsZAorCXRvIFBUUiwgbm90IGNvZmZfc2VjdGlvbl90ZGF0YSBwb2ludGVyLCBzaW5jZSBQVFIgaXMgdGhlIHJlYWwgdHlwZQorCW9mIHRoZSBmaWVsZC4KKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IERpdHRvLgorCitUaHUgQXVnIDE3IDE0OjQ0OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUFkZCBzdXBwb3J0IGZvciBsaW5raW5nIFNQQVJDIFN1bk9TIFBJQyBjb21waWxlZCBjb2RlLgorCSogc3Vub3MuYyAoU1BBUkNfUExUX1BJQ19XT1JEMCk6IERlZmluZS4KKwkoU1BBUkNfUExUX1BJQ19XT1JEMSwgU1BBUkNfUExUX1BJQ19XT1JEMik6IERlZmluZS4KKwkoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0CisJZmllbGRzLgorCShzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBhbmQKKwlkeW5hbWljX3NlY3Rpb25zX25lZWRlZCBmaWVsZHMuCisJKHN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgorCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgorCShzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKKwlvZiBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLgorCShzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KKwkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBDYWxsIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgorCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBzdW5vc19zY2FuX3JlbG9jcyBiZWZvcmUKKwljaGVja2luZyB3aGV0aGVyIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uCisJRGVmaW5lIF9fR0xPQkFMX09GRlNFVF9UQUJMRSBpZiBhbnl0aGluZyByZWZlcnJlZCB0byBpdC4KKwkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gIFVzZQorCXBsdF9vZmZzZXQgZmllbGQ7IG9ubHkgcHV0IHN5bWJvbCBpbiAucGx0IGlmIGl0IGlzIG5vdCBkZWZpbmVkIGJ5CisJYSByZWd1bGFyIG9iamVjdC4KKwkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuICBIYW5kbGUgYmFzZSByZWxhdGl2ZSByZWxvY3MuCisJKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBTdG9yZSBkeW5vYmogaW4gbG9jYWwgdmFyaWFibGUuCisJKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogQ2hlY2sgcGx0X29mZnNldCByYXRoZXIgdGhhbgorCWNoZWNraW5nIHdoZXRoZXIgc3ltYm9sIGlzIGluIC5wbHQgc2VjdGlvbi4gIElmIHN5bWJvbCBpcyBkZWZpbmVkCisJaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCB1c2UgU1BBUkNfUExUX1BJQ19XT1JEWzAxMl0sIGFuZCBkb24ndAorCWFkZCBhIEpNUF9UQkwgcmVsb2MuCisJKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBBZGQgY29udGVudHMgYW5kIHJlbG9jYXRpb25wIGZpZWxkcy4KKwlJZiBwbHRfb2Zmc2V0IGlzIHNldCwgcmVkaXJlY3QgcmVsb2NhdGlvbiB0byBQTFQuICBJZiB0aGlzIGlzIGEKKwliYXNlIHJlbGF0aXZlIHJlbG9jLCByZWRpcmVjdCByZWxvY2F0aW9uIHRvIEdPVC4gIENoZWNrCisJZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQgcmF0aGVyIHRoYW4gd2hldGhlciBkeW5vYmogaXMgc2V0LgorCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogQ2hlY2sgZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGQKKwlyYXRoZXIgdGhhbiB3aGV0aGVyIGR5bm9iaiBpcyBzZXQuICBEb24ndCBkaWUgaWYgLm5lZWQgYW5kIC5ydWxlcworCXNlY3Rpb25zIHdlcmUgbm90IGNyZWF0ZWQuCisJKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBNYXJrIFBDMTAsIFBDMjIsIGFuZCBKTVBfVEJMIGVudHJpZXMKKwlQQyByZWxhdGl2ZS4gIE1hcmsgUEMxMCBjb21wbGFpbl9vdmVyZmxvd19kb250LiAgTWFyayBQQzIyIGFuZAorCUpNUF9UQkwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgorCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiBpbmZvLT5zaGFyZWQgaXMgc2V0LCBzZXQgRFlOQU1JQy4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogQ2FsbCBjaGVja19keW5hbWljX3JlbG9jIGZvciBhbGwKKwlyZWxvY3MuICBQYXNzIGNvbnRlbnRzIGFuZCAmcmVsb2NhdGlvbi4gIERvbid0IHdhcm4gYWJvdXQgYW4KKwl1bmRlZmluZWQgc3ltYm9sIHVudGlsIGNoZWNrX2R5bmFtaWNfcmVsb2MgaGFzIGJlZW4gY2FsbGVkLiAgRG9uJ3QKKwl3YXJuIGFib3V0IGFuIHVuZGVmaW5lZCBzeW1ib2wgZm9yIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuICBGb3IgYSBiYXNlIHJlbGF0aXZlCisJcmVsb2MsIGFsd2F5cyB0cmVhdCByX2luZGV4IGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZS4KKwkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGNvbnRlbnRzIGFuZAorCXJlbG9jYXRpb24gYXJndW1lbnQgdG8gY2hlY2tfZHluYW1pY19yZWxvYyBlbnRyeSBwb2ludC4KKwkoc3RydWN0IGFvdXRkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgorCitXZWQgQXVnIDE2IDAxOjAzOjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlLgorCitNb24gQXVnIDE0IDExOjM5OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBIYW5kbGUgYSBtYWNoaW5lIG9mCisJYmZkX21hY2hfc3BhcmMgb3IgYmZkX21hY2hfc3BhcmM2NC4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBhIHN5bWJvbCBpcyBhIHdlYWsKKwlkZWZpbml0aW9uLCBhZGQgaXQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGFueSBkeW5hbWljCisJb2JqZWN0IG1lbnRpb25zIGl0LiAgSWYgd2UgZG8gYWRkIGl0LCBtYWtlIHN1cmUgd2UgYWRkIHRoZQorCWNvcnJlc3BvbmRpbmcgcmVhbCBzeW1ib2wuCisJKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBZGp1c3QgYSB3ZWFrIGRlZmluZWQgc3ltYm9sIHdoaWNoIHdlCisJcHV0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgZXZlbiBpZiBubyByZWd1bGFyIG9iamVjdCByZWZlcnMKKwl0byBpdC4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZAorCWxpYnJhcnksIGRvbid0IGFsbG9jYXRlIHNwYWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYQorCWxvY2FsIHN5bWJvbC4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hhbmdlIGFzc2VydGlvbgorCXRvIGFjY2VwdCBzeW1ib2wgd2l0aCB3ZWFrZGVmIHNldC4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKKwlsaWJhcnksIGRvbid0IGNvcHkgb3ZlciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBsb2NhbAorCXN5bWJvbC4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKworU3VuIEF1ZyAxMyAwMDo0MDo1OCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmggKFJfSFBQQV9CRUdJTl9CUlRBQik6IERlZmluZS4KKwkoUl9IUFBBX0VORF9CUlRBQik6IExpa2V3aXNlLgorCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9CUlRBQiBhbmQgUl9FTkRfQlJUQUIuCisKK1RodSBBdWcgMTAgMTU6NTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCB0aGUgYXJyYXkgZGltZW5zaW9ucworCXdoZW5ldmVyIHhfZmNuYXJ5IGlzIG5vdCBiZWluZyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSwgcmF0aGVyCisJdGhhbiBvbmx5IGZvciBhbiBhcnJheS4KKwkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KKworVHVlIEF1ZyAgOCAxNjozNDo1NyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIG1vc3QKKwlvZiBzcGVjaWFsIGNhc2Ugc3R1ZmYgZm9yIFBFLiAgTm93IGhhbmRsZWQgYnkgcmVsb2NzLgorCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IFNwZWNpYWwgY2FzZSBvZiBQRSB0eXBlIDdzLgorCShob3d0b190YWJsZSk6IFR5cGUgNyBpcyBkaXIzMi1ydmEuCisKK1R1ZSBBdWcgIDggMTA6MTU6NDMgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgYWl4NCBleHBsaWNpdGx5LgorCSogcnM2MDAwLWNvcmUuYyAoQ09SRV9EQVRBX1NJWkVfRklFTEQpOiBOZXcgbWFjcm8gdG8gZ2V0IGEgdGhlIHNpemUKKwlvZiBhIGNvcmUgZHVtcCdzIGRhdGEgc2VjdGlvbi4gIFByb3ZpZGUgYWx0ZXJuYXRlIGRlZmluaXRpb24gZm9yIGFpeDQuCisJKFNBVkVfRklFTEQpOiBTaW1pbGFybHkgZm9yIHNhdmUgc3RhdGUgZmllbGQgKHJlZ2lzdGVyIGluZm8pLgorCShTVEFDS19FTkRfQUREUik6IFByb3ZpZGUgZGVmaW5pdGlvbiBzdWl0YWJsZSBmb3IgYWl4NC4KKwkqIGNvbmZpZy97YWl4NC5taCxhaXg0Lm10fTogTmV3IGNvbmZpZ3VyYXRpb24gZmlsZXMuCisJKiBob3N0cy9haXg0Lmg6IExpa2V3aXNlLgorCitNb24gQXVnICA3IDIzOjAzOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogQ2FzdCBpbml0aWFsaXphdGlvbnMKKwl0byBhdm9pZCB3YXJuaW5ncy4KKworTW9uIEF1ZyAgNyAxNDo1MTowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9kZWNvZGVfc3ltY2xhc3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9scyBieSBjaGVja2luZworCXRoZSBTT00gdHlwZSAoc2luY2UgdGhleSB3aWxsIHJhcmVseSBpZiBldmVyIGJlIGluIHRoZSBhYnNvbHV0ZQorCXNlY3Rpb24pLgorCitXZWQgQXVnICA2IDA5OjEyOjUwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYzY0KTogRGVmaW5lLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KKwkqIGNwdS1zcGFyYy5jIChzcGFyY19hcmNoX2luZm8pOiBSZW5hbWVkIGZyb20gYXJjaF9pbmZvX3N0cnVjdC4KKwkoc3BhcmM2NF9hcmNoX2luZm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShiZmRfc3BhcmNfYXJjaCk6IExpbmsgaW4gc3BhcmM2NF9hcmNoX2luZm8uCisJKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl94eHgpOiBSZW5hbWVkIGZyb20gZWxmNjRfeHh4LgorCShzcGFyYzY0X2VsZl9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGVsZl9iYWNrZW5kX29iamVjdF9wKTogRGVmaW5lLgorCSogY29uZmlnL3NwYXJjNjQtZWxmLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBiZmRfZWxmMzJfc3BhcmNfdmVjLgorCitTYXQgQXVnICA1IDAwOjA0OjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20gKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gLTEgb24gZXJyb3IuICBDb21wdXRlCisJcmV0dXJuIHZhbHVlIHdpdGggc2l6ZW9mIChhcmVsZW50ICopLCBub3Qgc2l6ZW9mIChhcmVsZW50KS4KKworV2VkIEF1ZyAgMiAxMjozMjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiB0aGUgc2VjdGlvbiBwb2ludGVkIHRvIGJ5IHRoZQorCXNoX2xpbmsgZmllbGQgb2YgYSByZWxvYyBzZWN0aW9uIGlzIG5vdCBhIHN5bWJvbCB0YWJsZSwgYW5kIHRoZQorCWZpbGUgY29udGFpbnMgYSBzaW5nbGUgc3ltYm9sIHRhYmxlLCBjbG9iYmVyIHRoZSBzaF9saW5rIGZpZWxkIG9mCisJdGhlIHJlbG9jIHNlY3Rpb24gdG8gcG9pbnQgdG8gdGhlIHN5bWJvbCB0YWJsZS4KKworVHVlIEF1ZyAgMSAxMDowOTowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChob3d0byByZWxvYyBBUk0yNik6IENoYW5nZSBzaXplIGZyb20gMyB0byAyLgorCShob3d0byByZWxvYyBBUk0yNkQpOiBMaWtld2lzZS4KKworTW9uIEp1bCAyNCAxNDoxNzo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBVc2UgdGhlIGxpbmUganVzdCBiZWZvcmUKKwl0aGUgb2Zmc2V0LCBub3QgdGhlIG9uZSBqdXN0IGFmdGVyLiAgQnJlYWsgb3V0IG9mIHRoZSBsb29wIGFmdGVyCisJZmluZGluZyBhIGZ1bmN0aW9uIHBhc3QgdGhlIG9mZnNldCwgbm90IG1lcmVseSB3aGVuIGZpbmRpbmcgYQorCWZ1bmN0aW9uIHdpdGggYSBsaW5lIGRlZmluZWQuCisKKwkqIGVjb2ZmbGluay5jIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogV2hlbiBoYW5kbGluZyBzdGFiczoKKwljb3JyZWN0IHNldHRpbmcgb2Ygc3ltX3B0cl9lbmQgdG8gY29uc2lkZXIgc3ltYm9scyBza2lwcGVkIHdoZW4KKwlzZXR0aW5nIHN5bV9wdHI7IGRvbid0IGxlYXZlIGxvb3AgZWFybHkgdW5sZXNzIGFuIE5fRlVOIGlzIGZvdW5kCisJd2l0aCBhIGxhcmdlciB2YWx1ZS4KKworCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IE1hcmsgUl9TSF9QQ0RJU1A4QlkyIGFuZCBSX1NIX1BDRElTUAorCWFzIFBDIHJlbGF0aXZlLiAgRGVzY3JpYmUgUl9TSF9JTU0xNi4gIEFkZCBlbnRyaWVzIGZvcgorCVJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIsIFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgYW5kCisJUl9TSF9BTElHTi4KKwkoU1dBUF9JTl9SRUxPQ19PRkZTRVQpOiBEZWZpbmUuCisJKFNXQVBfT1VUX1JFTE9DX09GRlNFVCk6IERlZmluZS4KKwkoQ0FMQ19BRERFTkQpOiBEZWZpbmUuCisJKHNoX3JlbG9jKTogQ2hhbmdlIHN5bV92YWx1ZSBhbmQgYWRkciB0byB0eXBlIGJmZF92bWEuICBTa2lwIHJlbG9jCisJdHlwZXMgb3RoZXIgdGhhbiBSX1NIX0lNTTMyIGFuZCBSX1NIX1BDRElTUCBvbiBhbiBleHRlcm5hbCBzeW1ib2wuCisJKGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCisJKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KKwkoc2hfcmVsYXhfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgUl9TSF9QQ0RJU1Agb24gYW4gZXh0ZXJuYWwgc3ltYm9sLgorCShzaF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKKwkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsCisJX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLCBub3QgY29mZl9saW5rX2dldF9zeW1ib2xzLiAgQ2FsbAorCV9iZmRfY29mZl9mcmVlX3N5bWJvbHMsIG5vdCBjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzLiAgQ2FsbAorCV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSwgbm90IGNvZmZfcmVhZF9zdHJpbmdfdGFibGUuCisJKGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBMaWtld2lzZS4KKwkoY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgorCShjb2ZmX2xpbmtfZ2V0X3N5bWJvbHMpOiBNb3ZlIHRvIGNvZmZnZW4uYy4KKwkoY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgorCShjb2ZmX2xpbmtfZnJlZV9zeW1ib2xzKTogTGlrZXdpc2UuCisJKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogVXNlIF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZS4KKwkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KKwkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCisJKGNvZmZfbGlua19pbnB1dF9iZmQpOiBVc2UgY2FjaGVkIHNlY3Rpb24gY29udGVudHMgaWYgYXZhaWxhYmxlLgorCVVzZSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IGNhbGwgYmZkX3NlZWsuCisJKGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE9ubHkgZGVmaW5lIGlmIG5vdAorCWFscmVhZHkgZGVmaW5lZC4KKwkoY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgorCSogY29mZmdlbi5jIChidWlsZF9zdHJpbmdfdGFibGUpOiBSZW1vdmUuCisJKF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvbGQKKwljb2ZmX2xpbmtfZ2V0X3N5bWJvbHMgaW4gY29mZmxpbmsuYy4KKwkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tIG9sZAorCWNvZmZfcmVhZF9zdHJpbmdfdGFibGUgaW4gY29mZmxpbmsuYy4KKwkoX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJtbyBvbGQKKwljb2ZmX2xpbmtfZnJlZV9zeW1ib2xzIGluIGNvZmZsaW5rLmMuCisJKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVXNlIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scworCXJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIHN5bWJvbHMgZGlyZWN0bHkuICBUbyBmcmVlIHRoZW0sIGNhbGwKKwlfYmZkX2NvZmZfZnJlZV9zeW1ib2xzLiAgVXNlIF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSByYXRoZXIKKwl0aGFuIGJ1aWxkX3N0cmluZ190YWJsZS4KKwkqIGxpYmNvZmYtaW4uaCAob2JqX2NvZmZfa2VlcF9zeW1zKTogRGVmaW5lLgorCShvYmpfY29mZl9rZWVwX3N0cmluZ3MpOiBEZWZpbmUuCisJKGNvZmZfZGF0YV90eXBlKTogQWRkIGZpZWxkcyBrZWVwX3N5bXMgYW5kIGtlZXBfc3RyaW5ncy4KKwkoY29mZl9zZWN0aW9uX3RkYXRhKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCisJKGNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgorCShfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEZWNsYXJlLgorCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBEZWNsYXJlLgorCShfYmZkX2NvZmZfZnJlZV9zeW1ib2xzKTogRGVjbGFyZS4KKwkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogRGVjbGFyZS4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKworRnJpIEp1bCAyMSAyMjozMjo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAorCXJlbG9jYXRpb24uCisJKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KKwkocHBjX2VsZl9nb3QxNl9pbm5lcik6IERpdHRvLgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KKworVGh1IEp1bCAyMCAxOToxOTowNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgKGlnbm9yZWQpCisJYXJndW1lbnQuCisJKiBlbGYzMi1ocHBhLmg6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgorCitUaHUgSnVsIDIwIDE5OjAxOjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBsaWJhb3V0LmggKHNldF9hb3V0X3NlY3Rpb25fZGF0YSk6IE5ldyBtYWNyby4KKwkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fcmVsb2NzKTogVXNlIGl0LgorCisJKiBhb3V0LW5zMzJrLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX291dCk6IFVuZGVmIEtFRVBJVCBiZWZvcmUKKwlkZWZpbmluZyBpdC4KKworVGh1IEp1bCAyMCAxMzo0ODowMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogaG9zdHMvaTM4NnY0LmggKGdldGdpZCwgZ2V0dWlkKTogIENoYW5nZSBwcm90b3R5cGVzIHRvIGJlCisJY29tcGF0aWJsZSB3aXRoIFVuaXh3YXJlIDEueCBhbmQgVW5peHdhcmUgMi54LCBhbmQgcHJvYmFibHkgb3RoZXIKKwlpMzg2IHN2cjQgdmVyc2lvbnMgYXMgd2VsbC4KKworVGh1IEp1bCAyMCAxMzo0MToyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFNpbmNlIGFybXBlIGFuZCBhcm1wZWkgaGF2ZSBiZWVuCisJc3BsaXQgaW50byBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIHZhcmlhbnRzLCBsaXN0IGFsbCBvZiB0aGVtLAorCWluc3RlYWQgb2YgdGhlIG5vdy1ub25leGlzdGFudCBhcm1wZVtpXV92ZWMuCisKK1RodSBKdWwgMjAgMDA6MDY6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogU2V0IGxtYSBiYXNlZCBvbiBwX3BhZGRyLgorCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9hZGRyIGJhc2VkIG9uIGxtYSwgbm90IHZtYS4KKworV2VkIEp1bCAxOSAxNTo1MjowMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBSZXBsYWNlcyBUQVJHRVRfU1lNLgorCSogY29uZmlndXJlLmluIChhcm1wZV92ZWMsIGFybXBlaV92ZWMpOiBBZGQgYmktZW5kaWFuIHN1cHBvcnQuCisJKiBjb25maWd1cmU6ICJyZWdlbmVyYXRlZCIuCisJKiBwZS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KKwkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KKwkqIHBlaS1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KKwkoVEFSR0VUX0xJVFRMRV9OQU1FLCBUQVJHRVRfQklHX05BTUUpOiBSZXBsYWNlcyBUQVJHRVRfTkFNRS4KKwkqIHRhcmdldHMuYyAoYXJtcGVfdmVjLCBhcm1wZWlfdmVjKTogRGVsZXRlZC4KKwkoYXJtcGVfbGl0dGxlX3ZlYywgYXJtcGVfYmlnX3ZlYywgYXJtcGVpX2xpdHRsZV92ZWMsIGFybXBlaV9iaWdfdmVjKToKKwlBZGRlZC4KKwkqIGNvbmZpZy9hcm0tcGUubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmYXVsdCBpcyBhcm1wZV9saXR0bGVfdmVjLgorCShTRUxFQ1RfVkVDUyk6IEFkZCBiaS1lbmRpYW4gc3VwcG9ydC4KKworV2VkIEp1bCAxOSAxMDo0NzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc2guYzogQ2xlYW4gdXAgYW5kIGNvbW1lbnQuCisJKHJfaW1tMzIpOiBSZW1vdmUuCisJKHNoX2NvZmZfaG93dG9zKTogTmV3IHN0YXRpYyBhcnJheS4KKwkoU0hfQ09GRl9IT1dUT19DT1VOVCk6IERlZmluZS4KKwkoZ2V0X3N5bWJvbF92YWx1ZSk6IE1ha2UgcmVsb2NhdGlvbiBiZmRfdm1hIHJhdGhlciB0aGFuIGxvbmcuCisJKFJUWVBFMkhPV1RPKTogUmV3cml0ZSB0byB1c2Ugc2hfY29mZl9ob3d0b3MuCisJKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSB0byBzaF9yZWxvY2F0ZV9zZWN0aW9uLgorCShzaF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworU2F0IEp1bCAxNSAwMTowMjo1MyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIGdlbmVyaWMgbTY4ayBTVlI0IGhvc3QuCisKK0ZyaSBKdWwgMTQgMTM6MTM6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhb3V0eC5oIChLRUVQSVQpOiBDaGFuZ2UgZGVmaW5pdGlvbiB0byB1ZGF0YS5pLgorCShLRUVQSVRUWVBFKTogUmVtb3ZlLgorCShOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApKTogQWRkIGNhc2VzIHRvIHRoZQorCWV4dGVuZGVkIHJlbG9jIHR5cGUgc3dpdGNoOiBTUEFSQ19HT1QxMCwgU1BBUkNfR09UMTMsIFNQQVJDX0dPVDIyLAorCVNQQVJDX1BDMTAsIFNQQVJDX1BDMjIsIFNQQVJDX1dQTFQzMC4KKwkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBEb24ndCBib3RoZXIgdG8gdXNlIHN0b2kgd2hlbgorCXJldHJpZXZpbmcgS0VFUElUIHZhbHVlLgorCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLiAgQWxzbywgb25seSBhZGQgaW4KKwlvdXRwdXQgc2VjdGlvbiBWTUEgZm9yIHNlY3Rpb24gc3ltYm9scywgYW5kIGNoZWNrIEJTRl9TRUNUSU9OX1NZTQorCXRvIGNvbnRyb2wgd2hldGhlciB0byBzZXQgcl9leHRlcm4gdG8gMS4KKworCSogc3ltcy5jOiBGaXggY29tbWVudHMgc28gdGhhdCBgbWFrZSBpbmZvJyB3b3Jrcy4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFNldCBTRUNfSEFTX0NPTlRFTlRTCisJaW4gLm1kZWJ1ZyBzZWN0aW9uLCBpbiBjYXNlIGJhY2tlbmQgbGlua2VyIGhhcyBjbGVhcmVkIGl0LgorCitGcmkgSnVsIDE0IDExOjU4OjM0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogUmV3cml0ZSB0byB0YWtlIGp1c3Qgb25lCisJYXJndW1lbnQsIHRoZSBmaW5hbCByZWxvY2F0ZWQgYWRkcmVzcy4KKwkocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBBZGp1c3QgcHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIgY2FsbGVyLgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KKworVGh1IEp1bCAxMyAxNzoyMjowMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQ2hvb3NlIGEgcmVhc29uYWJsZSBmaWVsZAorCXNlbGVjdG9yIHJlbG9jYXRpb24gZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgorCitUaHUgSnVsIDEzIDEwOjMzOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENhc3QgYXJndW1lbnQgdG8gc2l6ZV90CisJZm9yIG1hbGxvYy4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZSwgZm9yIG1lbW1vdmUuCisJKG1pcHNfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgorCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IExpa2V3aXNlLgorCShfYmZkX2NvZmZfZmluYWxfbGluayk6IExpa2V3aXNlLgorCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KKwkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogTGlrZXdpc2UuCisJKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1lbWNweSBhbmQgbWFsbG9jLgorCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCisJKiBlY29mZmxpbmsuYyAoZWNvZmZfYWxpZ25fZGVidWcpOiBMaWtld2lzZSwgZm9yIG1lbXNldC4KKwkoZWNvZmZfd3JpdGVfc3ltaGRyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCisJKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IExpa2V3aXNlLgorCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UsIGZvcgorCXFzb3J0LgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuCisJKiBlbGZjb3JlLmggKGVsZl9jb3JlZmlsZV9ub3RlKTogTGlrZXdpc2UuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgorCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IExpa2V3aXNlLgorCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLCBmb3IgbWVtc2V0LgorCSogaTM4NmxpbnV4LmMgKGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGllZWUuYyAoZG9fd2l0aF9yZWxvY3MpOiBMaWtld2lzZS4KKwkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KKwkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogTGlrZXdpc2UuCisJKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KKwkqIG9hc3lzLmMgKG9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvciBtZW1jcHkuCisJKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwKKwlmb3IgbWFsbG9jLgorCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZSwgZm9yIG1lbWNweS4KKwkqIHNyZWMuYyAoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKiBzdW5vcy5jIChiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UsIGZvcgorCXJlYWxsb2MgYW5kIG1lbXNldC4KKwkoc3Vub3Nfc2Nhbl9yZWxvY3MpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KKwkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLCBmb3IgcmVhbGxvYy4KKwkqIHN5bXMuYyAoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KKwkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvcgorCW1lbWNweS4KKworCSogbGliYmZkLmMgKHJlYWxfcmVhZCk6IEFkZCBwcm90b3R5cGUuICBDaGFuZ2UgYXJndW1lbnQgdHlwZXMgZnJvbQorCWludCB0byBzaXplX3QuCisJKGJmZF9yZWFkKTogQ2FzdCByZWFsX3JlYWQgYXJndW1lbnQgdG8gc2l6ZV90LCBub3QgaW50LgorCShiZmRfd3JpdGUpOiBDYXN0IGZ3cml0ZSBhcmd1bWVudCB0byBzaXplX3QsIG5vdCBpbnQuCisKKwkqIGVsZjY0LWdlbi5jIChlbGZfaW5mb190b19ob3d0byk6IEZpeCBkZWZpbml0aW9uIGZvciByZWNlbnQgZWxmLmMKKwljaGFuZ2VzLgorCisJKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBjaGFuZ2UgeyRlbmFibGV2YWx9IHRvICR7ZW5hYmxldmFsfS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZmxpbmsuby4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIGZpZWxkcyBfcmVhZF9taW5pc3ltYm9scyBhbmQKKwlfbWluaXN5bWJvbF90b19zeW1ib2wuCisJKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBBZGQgX3JlYWRfbWluaXN5bWJvbHMgYW5kCisJX21pbmlzeW1ib2xfdG9fc3ltYm9sLgorCShiZmRfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KKwkoYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgorCSogc3ltcy5jIChfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KKwkoX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgorCSogbGliYmZkLWluLmggKF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCisJKF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgorCShfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyk6IERlY2xhcmUuCisJKF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKwkqIGFvdXR4LmggKE1JTklTWU1fVEhSRVNIT0xEKTogRGVmaW5lLgorCShOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykpOiBOZXcgZnVuY3Rpb24uCisJKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJhb3V0LmggKE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKSk6IERlY2xhcmUuCisJKE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkpOiBEZWNsYXJlLgorCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9taW5pc3ltYm9scyk6IERlZmluZS4KKwkoTVlfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWZpbmUuCisJKiBBbGwgdGFyZ2V0czogRGVmaW5lIHJlYWRfbWluaXN5bWJvbHMgYW5kIG1pbmlzeW1ib2xfdG9fc3ltYm9sLgorCitXZWQgSnVsIDEyIDE3OjU1OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KKwliZmRfYWxsb2MuCisKKwkqIGVsZmNvZGUuaCAoc2l6ZV9pbmZvKTogRG9uJ3QgdXNlICImIiBiZWZvcmUgZnVuY3Rpb24gbmFtZXMuCisKK1dlZCBKdWwgMTIgMDA6MTY6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+CisKKwkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogVXNlIHVuc2lnbmVkLCBub3QgdW5zaWduZWQgY2hhciwKKwlmb3IgYml0ZmllbGRzLgorCitUdWUgSnVsIDExIDE1OjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEluIGNhc2UgU0hUX1JFTFtBXSwgb25seSBnZXQgdGhlCisgICAgICAgIEJGRCBzZWN0aW9uIGZvciB0aGUgc2hfbGluayBzZWN0aW9uIGlmIGl0IGlzIGEgU1lNVEFCIHNlY3Rpb24uCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IERvbid0IGJvdGhlciB0byBjaGVjaworCXRoYXQgYXJjaGl2ZXMgaG9sZCBhLm91dCBvYmplY3RzLgorCSogY2YtaTM4Nmx5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KKwkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgorCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGRlZmluZS4KKwkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogUmVtb3ZlLgorCSogZWxmbGluay5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdAorCWFyY2hpdmVzIGhvbGQgRUxGIG9iamVjdHMuCisKKwkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBhbmQKKwl0aGUgdGFyZ2V0IHdhcyBkZWZhdWx0ZWQsIGJ1dCB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBhcmNoaXZlIGNhbgorCW5vdCBiZSBtYXRjaGVkIHdpdGggdGhhdCB0YXJnZXQsIHRoZW4gcmV0dXJuIGEgYmFkIGZvcm1hdCBlcnJvci4KKworCSogZWxmNjQtc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogU2V0IGhvd3RvIGZvciBXRElTUDE2IHRvCisJZWxmNjRfd2Rpc3AxNl9yZWxvYy4KKwkoZWxmNjRfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGVsZjY0X3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgorCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvCisJc3dhcF9zeW1ib2xfb3V0IGZyb20gY2hhciAqIHRvIFBUUi4KKwkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgorCSogZWxmY29kZS5oIChlbGZfc3dhcF9zeW1ib2xfb3V0KTogQ2hhbmdlIHR5cGUgb2YgY2RzdCBmcm9tIGNoYXIgKgorCXRvIFBUUi4KKwkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gY2FsbGluZworCXN3YXBfc3ltYm9sX291dCByb3V0aW5lLgorCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgorCShlbGZfbGlua19vdXRwdXRfc3ltKTogTGlrZXdpc2UuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisKK1R1ZSBKdWwgMTEgMTI6Mjk6NDkgMTk5NSAgUmljayBTbGFka2V5ICA8anJzQHdvcmxkLnN0ZC5jb20+CisKKwkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUKKwl0aGVyZSBpcyBubyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisKK01vbiBKdWwgMTAgMTE6NDU6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IEFkZCBiaW5hcnkubyBhbmQgdGVraGV4Lm8uICBGcm9tIERKCisJRGVsb3JpZS4KKworTW9uIEp1bCAxMCAxMTowOTo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpbmtlci5jIChzZXRfc3ltYm9sX2Zyb21faGFzaCk6IGJmZF9saW5rX2hhc2hfbmV3IGNhc2U6IERvbid0CisJYWJvcnQ7IGl0IGNhbiBoYXBwZW4gZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgd2hlbiBub3QgYnVpbGRpbmcKKwljb25zdHJ1Y3RvcnMuCisKKwkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBDb3JyZWN0IHR5cG86IHVzZSAhIG9uIHN0cmNtcCwKKwlub3Qgb24gc3RyaW5nLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKKwlsb2NhbCBpLgorCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBEb24ndCBkZWNsYXJlLgorCShQQ1JFTE9GRlNFVCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWFybS5vCisJKENGSUxFUyk6IEFkZCBjb2ZmLWFybS5jLCBwZS1hcm0uYywgcGVpLWFybS5jLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBBbGxvY2F0ZSBoYXNoIHRhYmxlCisJdXNpbmcgYmZkX2FsbG9jLCBub3QgbWFsbG9jLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKwkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKwkqIHN1bm9zLmMgKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKKwkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBJZiAtQnN5bWJvbGljLAorCW91dHB1dCBhIERUX1NZTUJPTElDIGR5bmFtaWMgZW50cnkuCisJKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBkb24ndCByZXF1aXJlIGEgUExUCisJZW50cnkgZm9yIGEgbG9jYWxseSBkZWZpbmVkIHN5bWJvbC4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvIHdhcm4KKwlhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYSBzeW1ib2wKKwlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KKwkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEgUkVMQVRJVkUKKwlyZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKKwlyZWd1bGFyIG9iamVjdCBmaWxlLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8gd2FybgorCWFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhIHN5bWJvbAorCWRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgorCShlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYSBSRUxBVElWRQorCXJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQorCXJlZ3VsYXIgb2JqZWN0IGZpbGUuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG8KKwl3YXJuIGFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgZmlsbCBpbiB0aGUgR09UIGVudHJ5IGZvciBhCisJc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgorCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiAtQnN5bWJvbGljLCBvdXRwdXQgYQorCVJFTEFUSVZFIHJlbG9jIHJhdGhlciB0aGFuIGEgR0xPQl9EQVQgcmVsb2MgZm9yIGEgc3ltYm9sIGRlZmluZWQKKwlpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCisKKwkqIGNvbmZpZy9tNjhrLWNvZmYubXQgKFNFTEVDVF9WRUNTKTogUmVuYW1lIGZyb20gU0VMRUNUX1ZFQ1RPUlMuCisJQ29ycmVjdCBlbGVtZW50cyB0byBiZSBhY3R1YWwgQkZEIHZlY3RvciBuYW1lcy4KKworCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4KKwkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEBmcmFnc0AuCisKK0ZyaSBKdWwgIDcgMTc6MzY6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBzeW1ib2xzIHRoYXQgYXJlCisJbmVpdGhlciBCU0ZfRlVOQ1RJT04gbm90IEJTRl9OT1RfQVRfRU5EIGp1c3QgYmVmb3JlIHVuZGVmaW5lZAorCXN5bWJvbHMuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfRlVOQ1RJT04gYXMgd2VsbAorCWFzIEJTRl9OT1RfQVRfRU5ELgorCitGcmkgSnVsICA3IDE3OjE2OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZG9fbW9zdGx5Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KKwkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KKworVGh1IEp1bCAgNiAxNDozNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFJldmVydCBNYXkgMjQgcGF0Y2guCisgICAgICAgIERvbid0IGNvcHkgUEMzMiByZWxvYyBhZ2FpbnN0IHNlY3Rpb24gaW50byBzaGFyZWQgb2JqZWN0LgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKENGSUxFUyk6IEFkZGVkIGVsZmxpbmsuYy4KKwkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzLCBub3QgY29uZmlndXJlLmluLgorCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldDsgZGVwZW5kIHVwb24gY29uZmlndXJlIGNvbmZpZ3VyZS5ob3N0CisJYW5kIGNvbmZpZy5iZmQuCisKK1dlZCBKdWwgIDUgMjA6MTc6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvcmUuaCwgZWxmbGluay5oLCBlbGZjb2RlLmgsIGVsZi5jLCBlbGZsaW5rLmM6IE1vdmVkIHNvbWUKKyAJcHJpbWFyaWx5IHNpemUtaW5kZXBlbmRlbnQgY29kZSBmcm9tIGVsZmNvZGUuaCB0byBlbGYuYyBhbmQgbmV3CisgCWZpbGUgZWxmbGluay5jOyBtb3ZlZCBvdXQgb3RoZXIgY29yZS0gb3IgbGlua2VyLXJlbGF0ZWQgcm91dGluZXMKKyAJaW50byBvdGhlciBuZXcgLmggZmlsZXMgZm9yIGNsYXJpdHkuICBSZW5hbWVkIG1hbnkgcm91dGluZXMgdG8KKyAJc3RhcnQgd2l0aCBiZmRfZWxmIG9yIF9iZmRfZWxmLiAgQWRkZWQgYSBzdHJ1Y3R1cmUgb2YKKyAJc2l6ZS1kZXBlbmRlbnQgYnV0IHRhcmdldC1pbmRlcGVuZGVudCBpbmZvIHRvIGVsZmNvZGUuaC4KKwkqIE1ha2VmaWxlLmluOiBCdWlsZCBlbGZsaW5rLm8uICBVcGRhdGUgZGVwZW5kZW5jaWVzLgorCSogbGliZWxmLmg6IFVwZGF0ZWQgc29tZSBkZWNsYXJhdGlvbnMuICBBZGRlZCBhIGRlZmluaXRpb24gZm9yIHRoZQorCW5ldyBzdHJ1Y3R1cmUgaW4gZWxmY29kZS5oLiAgQWRkZWQgbW9yZSBmaWVsZHMgdG8gZWxmIGJhY2tlbmQgZGF0YQorCXN0cnVjdHVyZS4KKwkqIGVsZnh4LXRhcmdldC5oOiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZS1kZXBlbmRlbnQgaW5mby4KKwkqIGVsZjMyLSouYzogQ2hhbmdlZCBzb21lIGZ1bmN0aW9uIG5hbWVzLiAgTW92ZWQgY29tbW9uCisJY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgY29kZSBmcm9tIG02OGssIHNwYXJjLCBhbmQgaTM4NiBzdXBwb3J0CisJaW50byBlbGZsaW5rLmMuICBEZWZpbmUgc29tZSBuZXcgbWFjcm9zIHRvIGZpbGwgaW4gbmV3IGZpZWxkcyBvZgorCWJhY2sgZW5kIGRhdGEuICBBbHNvIGNsZWFuIHVwIHNvbWUgImdjYyAtV2FsbCIgd2FybmluZ3MgcmVnYXJkaW5nCisJdW51c2VkIG9yIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgorCisJKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBObywgZG9uJ3QgcHV0IGVsZmxpbmsubyBoZXJlLgorCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGl0IGhlcmUgd2hlbmV2ZXIgZWxmLm8gaXMgc3BlY2lmaWVkLgorCitXZWQgSnVsICA1IDEwOjMxOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IFVuY29uZGl0aW9uYWxseSBzZXQKKwllbGZfYmFkX3N5bXRhYiwgc2luY2Ugc29tZXRpbWVzIHRoZSBzeW1ib2wgdGFibGUgaXMgbWVzc2VkIHVwIGFuZAorCXRoZSBsYXN0IHN5bWJvbCBpcyBnbG9iYWwuCisKKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgorCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9pc19sb2NhbF9sYWJlbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlICRhY19jb25maWdfc3ViLCBub3QgJGNvbmZpZ3N1Yi4KKwkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCisKKwlQZXJtaXQgLS1lbmFibGUtdGFyZ2V0cz1pZWVlOgorCSogY29uZmlnLmJmZCAoKi0qLWllZWUqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZy9pZWVlLm10OiBOZXcgZmlsZS4KKworV2VkIEp1bCAgNSAwNDoxNjozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODZhaXgubWggKEhERUZJTkVTKTogUmVtb3ZlIC1ERkFTQ0lTVF9GRE9QRU4uCisKKwlBdXRvY29uZmlzY2F0aW9uOgorCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBTd2l0Y2ggZnJvbSBDeWdudXMKKwljb25maWd1cmUgdG8gYXV0b2NvbmYgd2F5cyBvZiBwcm9jZXNzaW5nIC0tZW5hYmxlIGFyZ3VtZW50cywKKwlzZXR0aW5nIHVwIHN5bWxpbmtzLCBpbmNvcnBvcmF0aW5nIG1ha2VmaWxlIGZyYWdtZW50cywgcHJpbnRpbmcKKwltZXNzYWdlcyBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHNldHRpbmcgdmFyaWFibGVzIGluIE1ha2VmaWxlLgorCURlbGV0ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLiAgQ2hlY2sgZm9yIHJhbmxpYiB2aWEgYXV0b2NvbmYuCisJRm9yIG5vdywgY29uZmlndXJlIHNjcmlwdCByZW1vdmVzIGRvYy9jb25maWcuc3RhdHVzLgorCSogY29uZmlndXJlOiBOZXcgZmlsZS4KKwkqIGRlcC1pbi5zZWQ6IFVzZSBAU1JDRElSQCBpbnN0ZWFkIG9mIEBzcmNkaXJALCBzbyBNYWtlZmlsZS5pbgorCWxpbmUgZG9lc24ndCBnZXQgYnJva2VuIGJ5IGNvbmZpZ3VyZS4KKwkqIGRvYy9jb25maWd1cmUuaW46IFJlbW92ZWQuCisKK1R1ZSBKdWwgIDQgMTI6MjI6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcmNoaXZlLmMgKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBJZgorCUJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBsaW1pdCB0aGUgbGVuZ3RoIG9mIGFsbCBmaWxlIG5hbWVzCisJdG8gYXJfbWF4X25hbWVsZW4uCisJKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IElmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBjYWxsCisJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUuCisJKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFJldmVydCBKdW5lIDEgY2hhbmdlLgorCisJKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IEFkZCBwcm92aWRlCisJYXJndW1lbnQuCisJKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBVcGRhdGUgcHJvdG90eXBlLgorCShiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IExpa2V3aXNlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmVlZGVkIGZpZWxkLiAgUmVtb3ZlCisJc2F3X25lZWRlZCBmaWVsZC4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2R0X25lZWRlZF9uYW1lCisJaXMgYW4gZW1wdHkgc3RyaW5nLCBkb24ndCBtYWtlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSBvdXRwdXQKKwlmaWxlLiAgUmVjb3JkIGFsbCBEVF9ORUVERUQgZW50cmllcyBmb3VuZCBpbiBpbnB1dCBkeW5hbWljCisJb2JqZWN0cy4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IGNoZWNrIHNhd19uZWVkZWQgd2hlbiBpc3N1aW5nCisJd2FybmluZ3MuCisJKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplIG5lZWRlZCwgbm90CisJc2F3X25lZWRlZC4KKwkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCisJKiBiZmQtaW4uaCAoc3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCk6IERlZmluZS4KKwkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBEZWZpbmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGluaXRpYWxpemUKKwlmaW5kX2J1ZmZlciBhbmQgZmRydGFiX2xlbiBmaWVsZHMgb2YgbmV3bHkgYWxsb2NhdGVkCisJZmluZF9saW5lX2luZm8gc3RydWN0dXJlLgorCitNb24gSnVsICAzIDE3OjAzOjUyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBOZXcgYXJndW1lbnQgInN5bV9kaWZmIiwKKwlub256ZXJvIHdoZW4gd2UncmUgZ2VuZXJhdGluZyByZWxvY2F0aW9ucyBmb3IgYW4gZXhwcmVzc2lvbgorCXVzaW5nIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KKwlIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGZvciBib3RoIFJfSFBQQSBhbmQgUl9DT01QTEVYCisJY2FzZXMuCisJKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9DT01QMSwgUl9DT01QMiBhbmQgUl9DT0RFX0VYUFIKKwlmaXh1cHMuCisKK01vbiBKdWwgIDMgMTM6NTU6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZCAod2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KKwkqIGNvbmZpZ3VyZS5ob3N0IChwZSk6IENoYW5nZWQgdG8gaTM4NndpbjMyLgorCSogY29uZmlnL2kzODZwZS5taDogRGVsZXRlZC4KKwkqIGNvbmZpZy9pMzg2d2luMzIubWg6IE5ldyBmaWxlLgorCitNb24gSnVsICAzIDExOjMwOjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHdlIGFsbG9jYXRlCisJZmluZF9saW5lX2luZm8sIGNsZWFyIHRoZSBmZHJ0YWIgZmllbGQuCisKKwkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZCBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIgaGVyZSwKKwlyYXRoZXIgdGhhbiBpbiBiZmQtaW4yLmguCisKKwkqIGJmZC5jIChlbnVtIGJmZF9lcnJvcik6IERlZmluZSBiZmRfZXJyb3Jfbm9fYXJtYXAuCisJKGJmZF9lcnJtc2dzKTogQWRkIHN0cmluZyBmb3IgYmZkX2Vycm9yX25vX2FybWFwLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYW4gYXJjaGl2ZSBoYXMgbm8KKwlhcm1hcCwgc2V0IGJmZF9lcnJvcl9ub19hcm1hcCByYXRoZXIgdGhhbiBiZmRfZXJyb3Jfbm9fc3ltYm9scy4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgorCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KKworCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBQZXJtaXQgY29tbW9uIGFuZAorCWluZGlyZWN0IHN5bWJvbHMgaW4gd2Vha2RlZnMgQkZEX0FTU0VSVC4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2ltcGxpZnkKKwlCRkRfQVNTRVJUIHRvIHBlcm1pdCBzb21lIGxlZ2FsLCBidXQgb2RkLCBjYXNlcy4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB2ZXJzYWRvcy5vLgorCShDRklMRVMpOiBBZGQgcGUtaTM4Ni5jLCBwZWktaTM4Ni5jLCBhbmQgdmVyc2Fkb3MuYy4KKworU3VuIEp1bCAgMiAxNzo0OTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IGJhc2VfZmlsZQorCXRvIEZJTEUgKiBiZWZvcmUgdXNpbmcgaXQuCisJKiBzdGFiLXN5bXMuYzogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgorCitTYXQgSnVsICAxIDEyOjEwOjQyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzdGFiLXN5bXMuYyAoc3RkaW8uaCk6ICBJbmNsdWRlIHByaW9yIHRvIGxpYmFvdXQuaCwgd2hpY2gKKwlpbmNsdWRlcyBiZmRsaW5rLmgsIHdoaWNoIG5vdyB1c2VzIEZJTEUuCisKK1NhdCBKdWwgIDEgMDA6MTE6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGVsZnh4LXRhcmdldC5oOiBOZXcgZmlsZS4KKworCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGVsZl82NF9wIGZpZWxkLgorCSogZWxmeHgtdGFyZ2V0LmggKGVsZk5OX2JlZCk6IERvbid0IHNldCBpdC4KKworCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBEZWxldGVkLgorCSogTWFrZWZpbGUuaW4gKGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCk6IEJ1aWxkIHRoZW0gZnJvbQorCWVsZnh4LXRhcmdldC5oLgorCitGcmkgSnVuIDMwIDE2OjA3OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wYXJlCisJdGhlIGZ1bGwgdGV4dCBvZiAucmVsb2Mgb3IgLmVkYXRhIHNlY3Rpb24gbmFtZXMuCisKK0ZyaSBKdW4gMzAgMTU6NDc6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgorCVJlbW92ZSBleHRyYSAnKycuCisKK1RodSBKdW4gMjkgMTc6MjQ6NTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZi1oODMwMC5jIChDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgorCitXZWQgSnVuIDI4IDE4OjA0OjQyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiB2ZXJzYWRvcy5vIGlzIG5vdyBjb25kaXRpb25hbGx5IGJ1aWx0LgorCSogY29mZmNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBOZXcgZnVuY3Rpb24uCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2xlYW4gdXAuIENhbGN1bGF0ZQorCWRhdGEgZW50cmllcy4KKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOgorCS5yZWxvYyBhbmQgLmVkYXRhIHNlY3Rpb25zIGFyZSBJTUFHRV9CQVNFRCB0b28uCisJSWYgdGhlcmUncyBhIGJhc2VfZmlsZSB0aGVuIHdyaXRlIG91dCBiYXNlIGluZm9ybWF0aW9uLgorCSogY29uZmlndXJlLmhvc3QgKGkzODYtKi1wZSk6IE5ldy4KKwkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBPbmx5IHNjYW4gcHJlZml4ZXMuCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogVmVyc2Fkb3MgaXMgbm93IGNvbmRpdGlvbmFsbHkKKwlidWlsdC4KKwkqIGNvbmZpZy9tNjhrLWNvZmYubXQ6IEJ1aWxkIHZlcnNhZG9zLm8KKwkqIGhvc3RzL2kzODZwZS5oOiBOZXcgZmlsZS4KKworTW9uIEp1biAyNiAxMzo1Mzo0OSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IENsb3NlIGNvbW1lbnQgYmVmb3JlCisJUl9QQVJJU0NfRFBSRUwyMUwgaGFuZGxpbmcuCisKK1RodSBKdW4gMjIgMTk6Mjg6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCVN1biBNYXkgIDcgMTE6NTM6NDEgTURUIDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+CisKKwkqIGNvbmZpZy9pMzg2LW1vc3MubXQ6IGNyZWF0ZWQuCisKK1RodSBKdW4gMjIgMDg6NTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFkZCBjYXNlIGZvciAtdmUgd29yZHMuCisKK1dlZCBKdW4gMjEgMTM6MTM6NDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgdHJ5IHRvIGFwcGx5IGEKKwlyZWxvY2F0aW9uIGFnYWluc3QgYW4gdW5kZWZpbmVkIHN5bWJvbHMuCisKK1dlZCBKdW4gMjEgMTA6MTY6MTAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogdmVyc2Fkb3MuYzogU2Vjb25kIHBhc3MvcmV3cml0ZS4KKworTW9uIEp1biAxOSAwODo0MDo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogQ29tcGFyZSBvbmx5IHRoZSBmcm9udCBwYXJ0CisJb2YgYSBzZWN0aW9uIG5hbWUuCisKK1NhdCBKdW4gMTcgMDk6NDA6NDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViCisJc2VjdGlvbiBpZiB3ZSBnZXQgYW4gZXJyb3IuCisKKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IERvbid0IG1lc3MKKwl3aXRoIHRoZSBvcGVyYW5kcyBvZiBhbiBSX1BBUklTQ19EUFJFTDIxTCByZWxvY2F0aW9uIGlmIHRoZSBpbnNuCisJaXMgbm90ICJhZGRpbCA8c3ltYm9sPiwlcjI3Ii4KKworRnJpIEp1biAxNiAxNTowNDo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGJmZC1pbi5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWNsYXJlIGJ1dCBkb24ndAorCWRlZmluZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKwkqIGJmZC5jIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWZpbmUuCisKK0ZyaSBKdW4gMTYgMDA6MDc6MjUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfbGlua19saW5rX3JlbG9jYXRlKTogVXNlIHRoZSByaWdodAorCXR5cGUgZmllbGQgKHRoZXJlIGFyZSB0d28hKSB3aGVuIGNoZWNraW5nIHRvIHNlZSBpZiAkZ2xvYmFsJCBpcworCWRlZmluZWQuCisKK1RodSBKdW4gMTUgMTQ6MDM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBiZmQtaW4uaCwgYmZkLWluMi5oIChiZmRfYm9vbGVhbik6IFJlbmFtZSBiZmRfdHJ1ZSwgYmZkX2ZhbHNlCisJdG8gYmZkX3R0dHJ1ZSwgYmZkX2ZmZmFsc2Ugc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggZnVuY3Rpb25zLgorCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBSZW1vdmUgdmVyc2lvbiB0aGF0IHdhcworCWhhY2tlZCBmb3IgTVBXIEMuCisJKiBtcHctY29uZmlnLmluOiBTZXQgc2hlbGwgdmFycyBpbnN0ZWFkIG9mIHBhc3RpbmcgdG8gbWFrZWZpbGUKKwlmb3IgZWFjaCBjb25maWd1cmF0aW9uLCBlZGl0IGNvZmZzd2FwLmggdG8gbWFrZSBNUFcgQyBub3QgY2hva2UuCisJKGkzODYtdW5rbm93bi1jb2ZmLCBzaC1oaXRhY2hpLWhtcyk6IFJlY29nbml6ZS4KKwkqIG1wdy1tYWtlLmluIChCRkRfTElCUyk6IEFkZCB2ZXJzYWRvcy5jLm8uCisKKwkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX3NjYW4pOiBQcm9wZXJseSBjYXN0IHJlc3VsdHMgZnJvbSBiZmRfYWxsb2MuCisKK1dlZCBKdW4gMTQgMTU6Mjc6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAocHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyk6IE5ldyBmdW5jdGlvbgorCXJlYWRzIGFuZCBoYW5kbGVzIC5kcmVjdHZlIHNlY3Rpb25zIGZvciBQRS4KKwkoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgbmV3IGZ1bmN0aW9uIGlmIFBFLgorCitNb24gSnVuIDEyIDEyOjA5OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBiZmQtaW4uaCAoYmZkX3NldF9zZWN0aW9uX3ZtYSk6IENhc2UgdHJ1ZSB0byBhIGJvb2xlYW4uCisJKGJmZF9zZXRfY2FjaGVhYmxlKTogTGlrZXdpc2UuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKK0ZyaSBKdW4gIDkgMTI6MjA6MjggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFJld3JpdGUgdG8gYmUgc3ltbWV0cmljYWwuCisKK0ZyaSBKdW4gIDkgMTI6NDk6MDAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHRhcmdldHMuYzogQWRkIGNvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBhbmQgbGlua19zcGxpdF9zZWN0aW9uCisJdG8gdGhlIHRhcmdldCB2ZWN0b3IuCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWZpbmUuCisJKF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uKTogRGVjbGFyZS4KKwkqIHN5bXMuYyAoYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IERlZmluZS4KKwkqIGxpbmtlci5jIChiZl9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IE5ldyBmdW5jdGlvbgorCShzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IExpa2V3aXNlLgorCSogQWxsIG90aGVyIHRhcmdldHMgdXBkYXRlZCB3aXRoIGRlZmF1bHQgdmVyc2lvbnMgb2YgbmV3IHJvdXRpbmVzLgorCisJKiBUYWtlIG91dCBteSBicmFpbmRhbWFnZWQgYmZkX3RydWUvYmZkX2ZhbHNlIGNoYW5nZXMgZnJvbSBlYXJsaWVyCisJdG9kYXkuICBSZXBsYWNlIHdpdGgganVzdDoKKwkqIGJmZC1pbi5oOiAoVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQpOiBEZWZpbmUgdGhpcyBpZgorCWNvbXBpbGluZyB3aXRoIGcrKy0yLjYgb3IgbGF0ZXIuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKK0ZyaSBKdW4gIDkgMDc6NTQ6MjkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogdmVyc2Fkb3MuYyAoc3RydWN0IGVzZCwgZ2V0XzQpOiBMaW50OyB1c2UgdW5zaWduZWQgY2hhcnMuCisKKwkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiAgQ29tcGFyZSBvdXRwdXQgc2VjdGlvbiBuYW1lcworCXdoZW4gY29udmVydGluZyBmb3Igdnh3b3Jrcy4KKworV2VkIEp1biAgNyAxOTowMTozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogUGVybWl0IC5zY29tbW9uIG9yIENPTU1PTgorCXNlY3Rpb25zIGFzIHJhbmRvbSBTSFRfTk9CSVRTIHNlY3Rpb25zLCBpbiBjYXNlIGEgbGlua2VyIHNjcmlwdCBpcworCXN0cmFuZ2UuCisKK1R1ZSBKdW4gIDYgMTc6Mjk6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogYmZkLWluLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE1vdmVkIGZyb20gcGUuaAorCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IEdldCBQRSByZWxvY3MgcmlnaHQuCisJKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0KTogU2V0IHBlIHRkYXRhIGJpdCB3aGVuIHVzaW5nIFBFLgorCSogY29mZmxpbmsuYyAoQ09GRl9XSVRIX1BFIGNvZGUpOiBUZXN0IG9uIG9ial9wZSBiaXQgcmF0aGVyCisJdGhhbiBjb25kaXRpb25hbCBjb21waWxlLgorCSogY29uZmlndXJlLmluOiBGaXggUEUgZGVwZW5kZW5jaWVzLgorCSogbGliY29mZi1pbi5oIChvYmpfcGUpOiBOZXcuCisJKGNvZmZfdGRhdGEpOiBBZGRlZCBwZSBlbnRyeS4KKwkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZWQuCisKK01vbiBKdW4gIDUgMDk6MDc6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4KTogQ29tcGxldGVseSBwYXJlbnRoZXNpemUKKwltYWNyby4KKworTW9uIEp1biAgNSAwMjoxNToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+CisKKwlMaW5rZXIgc3VwcG9ydCBmb3IgbTY4ay1lbGYgZnJvbSBBbmRyZWFzIFNjaHdhYgorCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgorCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGVjayBmb3IgTlVMTCB3aGVuCisJbG9vcGluZyB0aHJvdWdoIHRoZSBzeW1ib2wgaGFzaGVzLgorCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXaGVuIGxvb2tpbmcgZm9yIF9pbml0IGFuZCBfZmluaSBkb24ndCB1c2UKKwl0aGUgc3ltYm9sIGlmIGl0IGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBvYmplY3QuCisJKiBlbGYzMi1tNjhrLmM6IFJlbG9jYXRpb24gdHlwZSBjaGFuZ2VkIGZyb20gUkVMIHRvIFJFTEEuICBSZWd1bGFyCisJYW5kIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBhZGRlZCwgc2ltaWxhciB0byBvdGhlciBlbGYKKwl0YXJnZXRzLgorCisJKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWdudSopOiBVc2UgRUxGIGNvbmZpZ3VyYXRpb24uCisKK0ZyaSBKdW4gIDIgMTg6NTQ6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogdmVyc2Fkb3MuYzogTmV3IGZpbGUuCisJKiBiZmQtaW4yLmggKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgorCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogTmV3IGZpZWxkLgorCSogY29uZmlndXJlLmluICh2ZXJzYWRvc192ZWMpOiBOZXcgZmllbGQuCisJKiB0YXJnZXRzLmMgKGJmZF9mbGF2b3IpOiBBZGRlZCB2ZXJzYWRvcy4KKworVGh1IEp1biAgMSAxMzo1MTo0OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncywgc3R5cF90b19zZWNfZmxhZ3MsIAorCWNvZmZfbmV3X3NlY3Rpb25faG9vayk6ICBBbnkgc2VjdGlvbiB0aGF0IHN0YXJ0cyAiLnN0YWIiCisJaXMgbm93IG1hcmtlZCBhcyBkZWJ1Z2dpbmcuCisKK1RodSBKdW4gIDEgMTY6MTU6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBEaXNhYmxlIGV4dGVuZGVkIG5hbWUKKwl0YWJsZSB1bnRpbCBpdCBjYW4gYmUgbWFkZSBvcHRpb25hbCwgc28gdGhhdCBuYXRpdmUgQVIgaGFzIGhhbGYgYQorCWNoYW5jZSBvbiBTdW5PUyBhbmQgSFAvVVguCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scywgY2FzZQorCWJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOiBBZGQgY2FzdCB0byBjb3JyZWN0IHBvaW50ZXIgdHlwZXMuCisKK1NhdCBNYXkgMjcgMjE6Mzc6MzEgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkIChtNjhrLWJ1bGwtc3lzdiopOiBBZGRlZCBzdHJpcF91bmRlcnNjb3JlPXllcy4KKwkgIChtNjhrLWVzdC1jb2ZmKTogUmVtb3ZlZC4gIHRhcmdldCBkb2VzIG5vdCBlZmZlY3Qgb2JqZWN0IGZvcm1hdC4KKworV2VkIE1heSAyNCAxMDo1MjowMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBDb3BlIHdpdGgKKwlpbmRpcmVjdCBzeW1ib2xzLgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBHaXZlIGVycm9yCisJbWVzc2FnZSB3aGVuIGxpbmtpbmcgdG8gYSBzaGFyZWQgcmVsb2Mgd2hpY2ggaXNuJ3QgdGhlcmUuCisKK1dlZCBNYXkgMjQgMTA6NDA6MDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCVN1cHBvcnQgZm9yIEFSTS1QRS4KKworCSogTWFrZWZpbGUuaW4sIGNvZmZjb2RlLmgsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgcGUtYXJtLmMsCisJIHBlaS1hcm0uYywgY29mZi1hcm0uYywgcmVsb2MuYywgdGFyZ2V0cy5jLCBjb25maWcvYXJtLXBlLm10OgorCSBTdXBwb3J0IGZvciBBUk0gQ09GRi9QRS4KKworVHVlIE1heSAyMyAxOToyNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBiZmQuYyAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5vdyBhIGZ1bmN0aW9uLAorCXRyaWVzIGNhbGxpbmcgcm91dGluZSBmcm9tIGlucHV0IGJmZCB0YXJnZXQgdmVjdG9yIGZvcgorCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgUHV0IGEgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCSogZWxmMzItbWlwcy5jIChncHJlbDE2X3dpdGhfZ3ApOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBmcm9tCisJbWlwc19lbGZfZ3ByZWwxNl9yZWxvYy4KKwkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IENhbGwgaXQuICBJZiBvdXRwdXQgYmZkIHRhcmdldCB2ZWN0b3IKKwlpc24ndCBlbGYgZmxhdm91cmVkLCBhYm9ydCwgc2luY2UgaXQncyBhc3N1bWVkIHRvIGJlIGVsZiBpbiBzb21lCisJb2YgdGhpcyBjb2RlLCBpbmNsdWRpbmcgdGhlIGNvZGUgdGhhdCBsb29rcyB1cCB0aGUgZ3AgdmFsdWUuCisJKGVsZjMyX21pcHNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLAorCW1vZGlmaWVkIGZyb20gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvIGRlYWwKKwl3aXRoIHBhc3NpbmcgZ3AgdG8gZ3ByZWwxNl93aXRoX2dwLgorCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBtYWNyby4KKwkqIGVsZjMyLXRhcmdldC5oIChiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6CisJRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KKworVHVlIE1heSAyMyAxNTo1ODoxNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWFrZWZpbGUuaW46IEluc3RhbGwgYmZkbGluay5oIHRvby4KKworU3VuIE1heSAyMSAyMjoyNTowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgdW5kZWZpbmVkIGFuZAorCW5vdHN1cHBvcnRlZCByZXR1cm4gY29kZXMgZnJvbSBmaW5hbF9saW5rX3JlbG9jYXRlICh1c2VkIHdoZW4KKwkkZ2xvYmFsJCBpcyB1bmRlZmluZWQgb3Igbm9uZXhpc3RhbnQpLgorCShlbGYzMl9ocHBhX2JmZF9saW5rX2xpbmtfcmVsb2NhdGUpOiBJZiAkZ2xvYmFsJCBleGlzdHMsIGJ1dCBpcworCW5vdCBkZWZpbmVkLHRoZW4gcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQuCisKK0ZyaSBNYXkgMTkgMTA6MDA6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvZmZzd2FwLmg6IChJTUFHRV9CQVNFKTogRGVmaW5lIHRvIDAgaWYgbm90LgorCitUaHUgTWF5IDE4IDA0OjI0OjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0YW5kYXJkKTogSWYgZGVmaW5lZCwgY2FsbAorCU1ZX3JlbG9jYXRhYmxlX3JlbG9jIGJlZm9yZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4KKworCSogYW91dC1hcm0uYzogKFdSSVRFX0hFQURFUlMpOiBEZWxldGUuCisJKE5BTUUpOiBEZWZpbmUgdmVyc2lvbiB0byBvdmVycmlkZSBkZWZhdWx0IGluIGFvdXR4LmgKKwkoTVkoaG93dG9fdGFibGUpKTogUmVmb3JtYXQuICBBbHRlciBzb21lIGVudHJpZXMgc2xpZ2h0bHkuCisJKFJFTE9DX0FSTV9CSVRTX05FR197QklHLExJVFRMRX0pOiBEZWZpbmUuCisJKE1ZKHJlbG9jX2hvd3RvKSwgTVkocHV0X3JlbG9jKSwgTVkocmVsb2NhdGFibGVfcmVsb2MpKTogTmV3IGZ1bmN0aW9ucy4KKwkoTVlfcmVsb2NfaG93dG8sIE1ZX3B1dF9yZWxvYywgTVlfcmVsb2NhdGFibGVfcmVsb2MpOiBEZWZpbmUuCisJKE1ZKGZpeF9wY3JlbF8yNikpOiBSZW5hbWVkIGZyb20gYW91dGFybV9maXhfcGNyZWxfMjYsIHJldHVybgorCWJmZF9yZWxvY19vayBub3QgYmZkX3JlbG9jX2NvbnRpbnVlLgorCShNWShmaXhfcGNyZWxfMjZfZG9uZSkpOiBMaWtld2lzZS4KKwkoTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKSk6IFJlbmFtZWQgZnJvbSBhb3V0YXJtX3JlbG9jX3R5cGVfbG9va3VwLgorCShNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgTVlfYmZkX2xpbmtfYWRkX3N5bWJvbHMsCisJTVlfYmZkX2ZpbmFsX2xpbmspOiBEZWxldGUuCisJKE1ZX3N3YXBfc3RkX3JlbG9jX2luLCBNWV9zd2FwX3N0ZF9yZWxvY19vdXQsIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzKToKKwlEZWZpbmUuCisJKGFvdXR4LmgpOiBJbmNsdWRlIGl0LgorCShNWShzd2FwX3N0ZF9yZWxvY197aW4sb3V0fSkpOiBOZXcgZnVuY3Rpb25zLgorCVVzZSBSRUxPQ19BUk1fQklUU19ORUdfe0JJRyxMSVRUTEV9IHRvIGV4dHJhY3QgbmVnYXRpdmUgcmVsb2MgYml0LgorCShhb3V0YXJtX3NxdWlydF9vdXRfcmVsb2NzKTogRGVsZXRlLgorIAorCUZyb206IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCisJKiBjb25maWcvYXJtW2xiXS1hb3V0Lm10OiBOZXcgZmlsZXMuCisJKiBhb3V0LWFybS5jOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy5iZmQ6IEhhbmRsZSBhcm17LGVbbGJdfS0qLWFvdXQKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHZldG9yIGZvciBhb3V0X2FybV97YmlnLGxpdHRsZX1fdmVjLgorCSogcmVsb2MuYzogTmV3IHJlbG9jYXRpb24gdHlwZXMgZm9yIHRoZSBBUk0uCisJKiB0YXJnZXRzLmMgKGFvdXRfYXJtX3tiaWcsbGl0dGxlfV92ZWMpOiBkZWNsYXJlLgorCitUdWUgTWF5IDE2IDEwOjI5OjUxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgorCisJKiBsaWJiZmQuYyAoYmZkX3N0YXQpOiBJZiBiZmRfY2FjaGVfbG9va3VwIHJldHVybnMgYW4gZXJyb3IsCisJcmV0dXJuIGFuIGVycm9yIHRvIHRoZSBjYWxsZXIuICBDYWxsIGJmZF9zZXRfZXJyb3Igb24gZXJyb3JzLgorCitUdWUgTWF5IDE2IDE0OjQ0OjQ1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGxpYmNvZmYtaW4uaCAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogTW9kaWZpZWQgcHJvdG90eXBlcyBpbgorCWFjY29yZGFuY2Ugd2l0aCAxMSBNYXkgbGliY29mZi5oIGNoYW5nZS4KKworVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJdGVraGV4LmMgKGZpcnN0X3BoYXNlKTogVW5kZXJzdGFuZCB0eXBlIDAgc3ltYm9scy4KKwkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEZpeCB0eXBvIGluIGZpbmFsIHJlY29yZC4KKworVGh1IE1heSAxMSAxNjo0MzoxNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb2ZmLWk5NjAuYyAob3B0Y2FsbF9jYWxsYmFjayk6IGRvbid0IHRyeSBhbmQgb3B0aW1pemUKKwl1bmRlZmluZWQgcmVmcy4gCisJKGNvZmZfd3JpdGVfcmVsb2NzKTogU2VhcmNoIGZvciBicm9rZW4gcmVsb2NzIG9uIHRoZSB3YXkKKwlvdXQgYW5kIGZpeCB0aGVtIHVwLgorCShjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDYWxjdWxhdGUgYW5kIHJldHVybiBpbmRleCBvZgorCWZpcnN0IHVuZGVmaW5lZCBzeW1ib2wuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgCisJYW5kIGNvZmZfd3JpdGVfcmVsb2NzIHdpdGggdGhlIG5ldyBhcmdzLgorCSogbGliY29mZi5oOiAoY29mZl9yZW51bWJlcl9zeW1ib2xzLCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOgorCU1vZGlmaWVkIHByb3RvdHlwZXMuCisKK1RodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKwkJCSAgVG9tIEdyaWVzdCA8Z3JpZXN0QGNzLnlhbGUuZWR1PgorCisJSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBmb3JtYXQuIAorCQorCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYywgY29uZmlndXJlLmluLCBjb25maWcuYmZkOgorCUFkZCBzdXBwb3J0IGZvciBpMzg2LSotd2lubnQgYW5kIGkzODYtKi1wZS4KKwkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6ICBVbmRlcnN0YW5kIE5UUEUgZm9ybWF0CisJYXJjaGl2ZXMuCisJKF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFR1cm4gXCBpbiBhIGZpbGVuYW1lCisJaW50byAvLgorCSogYmZkLWluLmggKGJmZF9saW5rX3N1YnN5c3RlbSwgX2JmZF9saW5rX3N0YWNrX2hlYXApOiBOZXcuCisJKiBjb2ZmLWkzODYuYyAgKGhvd3RvX3RhYmxlKTogQ29uZGl0aW9uYWxpemUgUENSRUxPRkZTRVQuCisJKiBjb2ZmY29kZS5oIChJTUFHRV9CQVNFKTogTmV3LgorCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFRocm93IGF3YXkgLmp1bmsKKwlzZWN0aW9ucyBmb3IgUEUsIGFsaWduIHN5bWJvbHMuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVGhyb3cgYXdheSAuanVuayBzZWN0aW9ucworCWZvciBQRS4gUmVtZW1iZXIgaW5mbyBvbiAuaWRhdGEgYW5kIC5yc3JjIHNlY3Rpb25zLgorCUZpbGwgaW4gdGhlIFBFIGhlYWRlci4KKwkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBQRSB1c2VzIENfU0VDVElPTiBjbGFzcy4KKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogS2VlcCBQRSBpbmZvIHVwIHRvIGRhdGUuCisJKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3BlIHdpdGggUEUgcmVsb2NzLgorCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3thb3V0L2ZpbGUvc2NuL3N5bX1oZHJfe2luL291dH0pOiAKKwlOZXcgY29kZSBmb3IgUEUgaGVhZGVycy4KKworVHVlIE1heSAgOSAxNzowMTozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uCisJKiB0YXJnZXRzLmM6IERpdHRvLgorCSogY29uZmlnL3BwY2xlLWVsZi5tdDogTmV3IGZpbGUsIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMKKwlzdXBwb3J0LgorCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCBsaXR0bGUgZW5kaWFuIHBvd2VycGMgdG8gdGhlIEJGRAorCXNlbGVjdGlvbiB2ZWN0b3JzLgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENvbXBsYWluIGlmCisJbGlua2luZyBhIGRpZmZlcmVudCBlbmRpYW4gb2JqZWN0IHRoYW4gd2UgZXhwZWN0LgorCShUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0xJVFRMRV9OQU1FKTogRGVmaW5lLCB0byBwcm92aWRlIGxpdHRsZQorCWVuZGlhbiBzdXBwb3J0LgorCitUdWUgTWF5ICAyIDE2OjMyOjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcuYmZkIChocHBhKi0qLWxpdGVzKik6IFRyZWF0IGp1c3QgbGlrZSBocHBhKi0qLSplbGYqLgorCitUdWUgQXByIDI1IDE5OjM4OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSW5pdGlhbGl6ZSBsbWEgc2FtZSBhcworCXZtYS4KKworVHVlIEFwciAyNSAxMTowMzoyMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogaG9zdHMvc3RkLWhvc3QuaDogI2luY2x1ZGUgYW5zaWRlY2wuaCAnY2F1c2UgUFRSIGlzIHVzZWQgaW4KKwlzdGQtaG9zdC5oLgorCitNb24gQXByIDI0IDIzOjU2OjQ0IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEb24ndCBkZWZpbmUgaXQuICBBZGRlZCBsZW5ndGh5CisJY29tbWVudCBleHBsYWluaW5nIHdoeS4KKworTW9uIEFwciAyNCAxMDozNDowMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogSWYgTk9fUFJPQ0ZTIGlzIGRlZmluZWQsIGRvbid0CisJZGVmaW5lIEhBVkVfUFJPQ0ZTLgorCitNb24gQXByIDI0IDA4OjMzOjEyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG8gbm90IGNvbnRpbnVlCisJcHJvY2Vzc2luZyB1bmtub3duIHN5bWJvbHMgdG8gcHJldmVudCBhIGNhc2NhZGUgb2YgZXJyb3JzLgorCitGcmkgQXByIDIxIDEyOjQ4OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwlQYXRjaGVzIGZyb20gSC5KLiBMdSBmb3IgTGludXggRUxGIGNvcmUgZmlsZSBzdXBwb3J0LgorCSogZWxmY29kZS5oIChlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSBbSEFWRV9QUk9DRlNdOgorCVVzZSBwcnBzaW5mb190IGluc3RlYWQgb2Ygc3RydWN0IHBycHNpbmZvLCBmb3IgY29uc2lzdGVuY3kuCisJKiBob3N0cy9pMzg2bGludXguaCAoSEFWRV9QUk9DRlMpOiBEZWZpbmUuCisKK1RodSBBcHIgMjAgMDk6MDc6MzkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogRG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gYSB1bmRlZmluZWQKKwlzdHJvbmcgc3ltYm9sIGFwcGVhcnMgYWZ0ZXIgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgorCitGcmkgQXByIDE0IDE2OjUxOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0byByZWxvY2F0ZQorCWEgd2hvbGUgc2VjdGlvbiBmb3IgdGhlIGxpbmtlciwgYnlwYXNzaW5nIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCisJKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24gdG8gbWFwIHRoZSBCRkQKKwllbnVtZXJhdGlvbiBjb2RlIGludG8gYSBob3d0byBzdHJ1Y3R1cmUuCisJKHBwY19lbGZfaG93dG9fcmF3KTogUmVuYW1lIGZyb20gcHBjX2VsZl9ob3d0b190YWJsZS4KKwkocHBjX2VsZl9ob3d0b190YWJsZSk6IE5ldyBhcnJheSB0aGF0IG1hcHMgUG93ZXJQQyByZWxvY2F0aW9uCisJbnVtYmVycyB0byBob3d0byBzdHJ1Y3R1cmVzIHdpdGhvdXQgYSBsaW5lYXIgc2VhcmNoLiAgQ2hhbmdlIGZyb20KKwl1c2luZyBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgdG8gdXNlIHBwY19lbGZfc3RkX3JlbG9jLgorCShwcGNfZWxmX2hvd3RvX2luaXQpOiBJbml0aWFsaXplIHBwY19lbGZfaG93dG9fdGFibGUgZnJvbQorCXBwY19lbGZfaG93dG9fcmF3LgorCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogVXNlIGEgY2FzZSBzdGF0ZW1lbnQgaW5zdGVhZCBvZiBhCisJbG9vcC4KKwkocHBjX2VsZl9zdGRfcmVsb2MpOiBSZXBsYWNlbWVudCBmb3IgYmZkX2VsZl9nZW5lcmljX3JlbG9jLgorCShwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKTogUHJpbnQgYSByZWFsIGVycm9yIG1lc3NhZ2UsIGluc3RlYWQKKwlvZiBjYWxsaW5nIGFib3J0LgorCShwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IEFic3RyYWN0IGdldHRpbmcgYWRqdXN0bWVudCBmcm9tCisJcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0CisJdG9vLgorCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IENhbGwgaXQuCisJKHBwY19lbGZfZ290MTZfaW5uZXIpOiBBYnN0cmFjdCBnZXR0aW5nIGFkanVzdG1lbnQgZnJvbQorCXBwY19lbGZfZ290MTZfcmVsb2MsIHNvIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYW4gdXNlIGl0IHRvby4KKwkocHBjX2VsZl9nb3QxNl9yZWxvYyk6IENhbGwgaXQuCisJKHBwY19lbGZfaW5mb190b19ob3d0byk6IFJlbmFtZSBmcm9tIHBvd2VycGNfaW5mb190b19ob3d0by4KKworCSogZWxmY29kZS5oIChlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IE9taXQgc3BhY2UgaW4gZGVidWdnaW5nCisJb3V0cHV0LgorCShlbGZfc3ltYm9sX2ZsYWdzKTogQWRkIGRlYnVnIGZ1bmN0aW9uIHRvIGRlY29kZSBmbGFncyBzbyB0aGF0CisJZGVmaW5pbmcgREVCVUcgdG8gYmUgNCB3aWxsIGNvbXBpbGUgYWdhaW4uCisJKGVsZl9kZWJ1Z19zZWN0aW9uKTogRml4IHR5cG8gaW4gZGVidWcgb3V0cHV0LgorCitGcmkgQXByIDE0IDE2OjAzOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBtNjgqLSotZWxmKi4KKwkqIGVsZjMyLW02OGsuYzogRmlsbGVkIG91dCBpbXBsZW1lbnRhdGlvbiwgZXhjZXB0IGZvciBkeW5hbWljCisJbGlua2luZyBzdXBwb3J0LgorCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgKl9HT1RfUENSRUwsICpfR09UT0ZGLAorCSpfUExUX1BDUkVMLCAqX1BMVE9GRiwgKl82OEtfKiByZWxvY2F0aW9ucyBmb3IgRUxGLgorCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisKK1RodSBBcHIgMTMgMTQ6Mjg6MDQgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+CisKKwkqIGNvZmYtbTY4ay5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBDaGFuZ2UgZnJvbQorCTEgdG8gMi4KKwkoYmZkX3RhcmdldCk6IENoYW5nZSBtaW5pbXVtIHNlY3Rpb24gYWxpZ25tZW50IGZyb20gMSB0byAyLgorCitXZWQgQXByIDEyIDEyOjQwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGFvdXR4LmggKG1hY2hpbmVfdHlwZSwgY2FzZSBiZmRfYXJjaF9taXBzKTogVHJlYXQgUjgwMDAgbGlrZQorCVI2MDAwIGFuZCBSNDAwMCBmb3Igbm93LgorCitUdWUgQXByICA0IDEyOjI4OjI1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KKwkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCisJKiBob3N0cy9tcHcuaDogTmV3IGZpbGUsIE1QVyBob3N0IGRlZmluaXRpb25zLgorCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luLCBlY29mZl9zd2FwX3Bkcl9pbikgW01QV19DXToKKwlBbHRlcm5hdGUgdmVyc2lvbnMgd2l0aG91dCBFQ09GRl82NCB0aGF0IGNob2tlcyBNUFcgQy4KKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogQWRkIGFsdGVybmF0aXZlIHZlcnNpb24gd2l0aAorCXBhcnRseS1leHBhbmRlZCBtYWNyb3MuCisKK1RodSBNYXIgMzAgMTQ6NTY6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvcgorCW92ZXJmbG93IGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgorCitUaHUgTWFyIDMwIDE0OjMyOjI2IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKKworCSogY29uZmlnLmJmZDogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKKwlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlicmFyeSB3aGljaCBkZWZhdWx0cyB0byBhLm91dC4KKwkqIGNvbmZpZy9pMzg2LWxhb3V0Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGludXgubXQuCisJKiBjb25maWcvaTM4Ni1saW51eC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxlbGYubXQuCisJQ29tbWVudCBvdXQgRVhUUkFMSUJTLgorCSogY29uZmlnL2kzODYtbGVsZi5tdDogUmVtb3ZlLgorCitXZWQgTWFyIDI5IDEyOjAxOjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IENhY2hlIHRoZSBzZWN0aW9uIHN5bWJvbCBpbgorCXRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiB0aGUgc2VjdGlvbiwgdG8gYXZvaWQgbG9vcGluZyBmb3IgZWFjaAorCXJlbG9jLgorCisJKiBjcHUtaDg1MDAuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMCIgdG8KKwkiaDgzMDAiIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGNwdS0qIGZpbGVzLgorCitUdWUgTWFyIDI4IDE1OjE0OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBIYW5kbGUgU0VDX0NPTlNUUlVDVE9SCisJc2VjdGlvbnMuCisJKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCisJKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFNraXAgY29uc3RydWN0b3IKKwlzeW1ib2xzIHdoaWNoIHRoZSBtYWluIGxpbmtlciBjb2RlIGRpZCBub3QgZG8gYW55dGhpbmcgd2l0aC4KKwkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2UgdWRhdGEucCBpZiBpdCBpcyBzZXQsCisJcmF0aGVyIHRoYW4gbG9va2luZyB0aGUgc3ltYm9sIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgSnVzdCBwYXNzCisJdGhyb3VnaCBjb25zdHJ1Y3RvciBzeW1ib2xzIGZvciB3aGljaCB1ZGF0YS5wIGlzIG5vdCBzZXQuICBJZiB0aGUKKwlsaW5rZXIgZGVmaW5lZCB0aGUgc3ltYm9sLCBjbGVhciB0aGUgY29uc3RydWN0b3IgZmxhZy4KKworVHVlIE1hciAyMSAxMDo1MDozMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFNpZ24gZXh0ZW5kIGNvbnN0YW50cyBmcm9tCisJUl9EQVRBX09WRVJSSURFIGZpeHVwcy4KKwkqIGxpYmhwcGEuaCAoc2lnbl9leHRlbmQpOiBSZW5hbWVkIGZyb20gc2lnbl9leHQuICBGaXguCisJKGxvd19zaWduX2V4dGVuZCk6IExpa2V3aXNlLgorCitNb24gTWFyIDIwIDIyOjM5OjEwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFRpZ2h0ZW4gdGVzdCB0byBkZXRlcm1pbmUKKwl3aGF0IHN5bWJvbHMgYXJlIHNlY3Rpb24gc3ltYm9scy4KKworU2F0IE1hciAxOCAwMTo1NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KKworRnJpIE1hciAxNyAxNjoyOTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IEp1c3QgcmV0dXJuIHRydWUgd2hlbgorCWVpdGhlciB0aGUgaW5wdXQgb3Igb3V0cHV0IHNlY3Rpb24gaXNuJ3QgYXR0YWNoZWQgdG8gYSBTT00gQkZELgorCShzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFNpbWlsYXJseSBmb3IgQkZEIHByaXZhdGUgZGF0YS4KKworRnJpIE1hciAxNyAxMTo1MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hlY2sgd2hldGhlciBhIGR5bmFtaWMKKwlvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZCwgYW5kIGlnbm9yZSBpdCB0aGUgc2Vjb25kIHRpbWUuCisKK1dlZCBNYXIgMTUgMTE6NTY6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMyBmcm9tCisJY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgorCisJKiBsaWJlbGYuaCAoYmZkX2VsZjMyX193cml0ZV9yZWxvY3MpOiBEb24ndCBkZWNsYXJlLgorCShiZmRfZWxmNjRfX3dyaXRlX3JlbG9jcyk6IERvbid0IGRlY2xhcmUuCisKK1R1ZSBNYXIgMTQgMDU6NTQ6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIHN0YWItc3ltcy5jIChhb3V0X3N0YWJfbmFtZSk6IE1vdmVkIGFvdXRfc3RhYl9uYW1lcyB0byBiZSBsb2NhbAorCXRvIHRoaXMgZnVuY3Rpb24uICBSZWNvZGVkIGZ1bmN0aW9uIHRvIHN0b3AgdXNpbmcgdGFibGUsIHRvCisJaW1wcm92ZSBwZXJmb3JtYW5jZSAob24gaTQ4Ni1uZXRic2QgaG9zdCkuICBMZWZ0IG9sZCB2ZXJzaW9uCisJaW50YWN0IHVuZGVyICIjaWYgMCIgZm9yIGZ1cnRoZXIgcGVyZm9ybWFuY2UgdGVzdGluZy4KKworTW9uIE1hciAxMyAxMzo0ODo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogTWFrZSBzdGF0aWMuICBVc2UgUFRSIGFyZ3VtZW50IGFzIGEKKwlwb2ludGVyIHRvIGEgYm9vbGVhbiB2YXJpYWJsZSBzZXQgdG8gdHJ1ZSBpZiBzb21ldGhpbmcgZmFpbHMuCisJQ2FzdCB0byBQVFIgcmF0aGVyIHRoYW4gdm9pZCAqLgorCShzeW1faXNfZ2xvYmFsKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KKwkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBJZiB0aGUgcHJvZ3JhbSBoZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwsCisJY2FsbCBfYmZkX2Vycm9yX2hhbmRsZXIgYW5kIHJldHVybiBmYWlsdXJlIHJhdGhlciB0aGFuIGFib3J0aW5nLgorCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgYm9vbGVhbiB2YXJpYWJsZSB3aGVuCisJY2FsbGluZyB3cml0ZV9yZWxvY3MuCisJKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCisJKHN0cnVjdCBlbGZfaW5mb19mYWlsZWQpOiBEZWZpbmUuCisJKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRGVjbGFyZSB2YXJpYWJsZXMgaW4gaW5uZXIKKwlibG9ja3MuICBQYXNzIGVsZl9pbmZvX2ZhaWxlZCBzdHJ1Y3R1cmUgd2hlbiBjYWxsaW5nCisJZWxmX2V4cG9ydF9zeW1ib2wgYW5kIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCisJKGVsZl9leHBvcnRfc3ltYm9sKTogVHJlYXQgZGF0YSBhcmd1bWVudCBhcyBlbGZfaW5mb19mYWlsZWQgcmF0aGVyCisJdGhhbiBiZmRfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KKwkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCShzdHJ1Y3QgZWxmX2ZpbmZvX2ZhaWxlZCk6IERlZmluZS4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogUGFzcyBlbGZfZmluZm9fZmFpbGVkIHN0cnVjdHVyZSB3aGVuIGNhbGxpbmcKKwllbGZfbGlua19vdXRwdXRfZXh0c3ltLiAgVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBUcmVhdCBkYXRhIGFyZ3VtZW50IGFzIGVsZl9maW5mb19mYWlsZWQKKwlyYXRoZXIgdGhhbiBlbGZfZmluYWxfbGlua19pbmZvLiAgU2V0IGZhaWxlZCBmaWVsZCBvbiBlcnJvci4KKwkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYWJvcnQuCisJKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCisKKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgd3JpdGUKKwlvdXQgUExUUkVMU1osIFBMVFJFTCBhbmQgSk1QUkVMIHJlbG9jcyBpZiB0aGVyZSBpcyBhIC5yZWxhLnBsdAorCXNlY3Rpb24uICBTb2xhcmlzIDIuNCBhcHBhcmVudGx5IGRvZXMgbm90IGhhbmRsZSBlbXB0eSByZWxvYworCWluZm9ybWF0aW9uIGNvcnJlY3RseS4KKworCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiBDYXN0IGdldHVpZCBhbmQgZ2V0Z2lkIHJlc3VsdHMgdG8KKwlsb25nLCBhbmQgcHJpbnQgd2l0aCAlbGQuCisKK0ZyaSBNYXIgMTAgMTY6NDE6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IEFsd2F5cyB1c2UgdGhlIG91dHB1dAorCXNlY3Rpb24gaWYgaXQgaXMgbm90IE5VTEwuCisKK1RodSBNYXIgIDkgMTU6MDY6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IElmIHRoZSBsaW5lIG51bWJlciBjb3VudCBvcgorCXRoZSByZWxvYyBjb3VudCBkb2VzIG5vdCBmaXQsIHByaW50IGFuIGVycm9yIGFuZCByZXR1cm4gMC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJY29mZl9zd2FwX3Njbmhkcl9vdXQuCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZQorCW9mIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KKworCSogYmZkLmM6IEluY2x1ZGUgPHN0ZGFyZy5oPiBvciA8dmFyYXJncy5oPiwgZGVwZW5kaW5nIHVwb24KKwlBTlNJX1BST1RPVFlQRVMuCisJKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpOiBOZXcgZ2xvYmFsIHR5cGUuCisJKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShfYmZkX2Vycm9yX2hhbmRsZXIpOiBOZXcgQkZEIHByaXZhdGUgZ2xvYmFsIHZhcmlhYmxlLgorCShiZmRfc2V0X2Vycm9yX2hhbmRsZXIpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KKwkoYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUpOiBOZXcgZ2xvYmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2Vycm9yX2hhbmRsZXIpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KKworCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIsCisJYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGJmZF9nZXRfc3ltY291bnQuICBDaGVjayByX2luZGV4IGFmdGVyCisJc2V0dGluZyByX2V4dGVybiBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgaXMgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLgorCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfSU4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlciwgYW5kIHVzZSBpdAorCWluc3RlYWQgb2YgYmZkX2dldF9zeW1jb3VudC4KKwkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYworCXN3YXAgcm91dGluZXMuCisJKiBsaWJhb3V0LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyCisJdG8gZGVjbGFyYXRpb24uCisJKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KKwkqIHN1bm9zLmMgKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogUGFzcworCWluZm8tPmR5bnN5bV9jb3VudCB0byByZWxvYyBzd2FwIHJvdXRpbmVzLgorCSogYW91dC1uczMyay5jIChNWV9zd2FwX3N0ZF9yZWxvY19pbik6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIuCisJKiBocDMwMGhwdXguYyAoTVkoc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCisJKE1ZKHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYyBzd2FwCisJcm91dGluZS4KKwkqIGkzODZseW54LmMgKE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQKKwlwYXJhbWV0ZXIuCisJKE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KKwkoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFBhc3MgYmZkX2dldF9zeW1jb3VudCB0byByZWxvYworCXN3YXAgcm91dGluZXMuCisKK1RodSBNYXIgIDkgMTI6MDQ6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBiZmQuYyAoYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24gdmVjdG9yIHRvIGJlCisJY2FsbGVkIGJ5IHRoZSBsaW5rZXIgdG8gbWVyZ2UgYW55IHByaXZhdGUgYmZkIGRhdGEgb2YgdGhlIGlucHV0CisJZmlsZXMgYW5kIHRoZSBvdXRwdXQgZmlsZS4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQgdG8KKwljaGVjayB3aGV0aGVyIC1tcmVsb2NhdGFibGUgaXMgdXNlZCBmb3IgYWxsIG1vZHVsZXMuCisJKGJmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IE5ldyBmdW5jdGlvbiB2ZWN0b3IgdG8gYmUgY2FsbGVkIGJ5IHRoZQorCWFzc2VtYmxlciB0byBzZXQgcHJpdmF0ZSBmbGFncy4gIFVzZWQgYnkgdGhlIFBvd2VyUEMgRUxGIHN1cHBvcnQKKwl0byBzZXQgdGhhdCBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgd2FzIGFzc2VtYmxlZCB3aXRoIHRoZQorCS1tcmVsb2NhdGFibGUgb3B0aW9uLgorCisJKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0NPUFkpOiBBZGQgaW50aWlhbGl6YXRpb24gb2YgdGhlCisJYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbgorCXZlY3RvcnMuCisKKwkqIGJmZC1pbjIuaCwgbGliYmZkLWluLmg6IFJlYnVpbGQgd2l0aCBiZmQuYyBhbmQgdGFyZ2V0cy5jCisJY2hhbmdlcy4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgZnVuY3Rpb24gdG8gc2V0IHRoZQorCUVMRiBlX2ZsYWdzIGZpZWxkLgorCShwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgdGhlIGVfZmxhZ3MgZmllbGQgZnJvbSB0aGUKKwlpbnB1dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKwkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2hlY2sgZm9yIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKKwllX2ZsYWdzIGZpZWxkIG9mIGFsbCBvZiB0aGUgbGlua2VyIGlucHV0IGZpbGVzLgorCisJKiBsaWJlbGYuaCAoZWxmX29ial90ZGF0YSk6IEFkZCBwcGNfZmxhZ3NfaW5pdCBmaWVsZCBzbyB0aGF0IHRoZQorCVBvd2VyUEMgc3VwcG9ydCBjYW4gY2hlY2sgaWYgY29tcGF0YWlibGUgZV9mbGFncyBhcmUgcHJlc2VudC4KKworCSogYW91dC10YXJnZXQuaDogQWRkIE5PUCBmb3IgdGhlIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisJYW5kIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyBmdW5jdGlvbiB2ZWN0b3JzLgorCSogY29mZmNvZGUuaDogRGl0dG8uCisJKiBlbGYzMi10YXJnZXQuaDogRGl0dG8uCisJKiBlbGY2NC10YXJnZXQuaDogRGl0dG8uCisJKiBsaWJiZmQuaDogRGl0dG8uCisJKiBsaWJlY29mZi5oOiBEaXR0by4KKwkqIHNvbS5jOiBEaXR0by4KKworV2VkIE1hciAgOCAwMDo1Mzo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwczo4MDAwIGVudHJ5LgorCisJKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBNYXJrIGFuIHVuZGVmaW5lZCBCU0ZfV0VBSyBzeW1ib2wgYXMKKwlTVEJfV0VBSyByYXRoZXIgdGhhbiBTVEJfR0xPQkFMLgorCitUdWUgTWFyICA3IDEyOjIzOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAorCV9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4LgorCShiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgorCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUgYXMgTlVMTCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkIHRvCisJY29mZl9hZGp1c3Rfc3ltbmR4LgorCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IENhbGwgY29mZl9hZGp1c3Rfc3ltbmR4IGlmIGl0CisJaXMgZGVmaW5lZC4KKwkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nIGNvZmZjb2RlLmguCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisKKwkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBTa2lwIGJpbmFyeV92ZWMgd2hlbgorCXNlYXJjaGluZyB0aHJvdWdoIGJmZF90YXJnZXRfdmVjdG9yLgorCisJKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBDaGVjayBTSFRfTk9CSVRTIGJlZm9yZSBjaGVja2luZworCXNoX3NpemUuCisKK01vbiBNYXIgIDYgMjM6MzE6MzYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBLZWVwIFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIKKwkhU0hUX05PQklUUyBvbmVzLgorCitNb24gTWFyICA2IDA5OjUzOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjcHUtaHBwYS5jIChhcmNoX2luZm9fc3RydWN0KTogU3VwcG9ydCBib3RoIFBBMS4wIGFuZCBQQTEuMQorCW1hY2hpbmUgdHlwZXMuCisJKGJmZF9ocHBhX2FyY2gpOiBMaW5rIGluIGJvdGggUEExLjAgYW5kIFBBMS4xIGFyY2hpdGVjdHVyZSBpbmZvCisJc3RydWN0dXJlcy4KKwkqIGxpYmhwcGEuaCAoZW51bSBwYV9hcmNoKTogTmV3IGVudW1lcmF0aW9uIHRvIGRlc2NyaWJlIHRoZQorCWRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUgUEEgYXJjaGl0ZWN0dXJlLgorCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBVc2UgbmV3IGVudW1lcmF0aW9uIHRvIHNldCBtYWNoaW5lCisJdHlwZS4KKwkoc29tX2ZpbmlzaF93cml0aW5nKTogSWYgdGhlIG1hY2hpbmUgdHlwZSBpcyBQQTEuMSwgdGhlbiB1c2UgdGhlCisJUEExLjEgbWFjaGluZSBpZGVudGlmaWVyIGluIHRoZSBvdXRwdXQgZmlsZS4KKworVGh1IE1hciAgMiAxNTo1ODoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBUcmVhdCB0aGUgaW5kZXggb2YgYQorICAgICAgICBiYXNlIHJlbGF0aXZlIHJlbG9jIGFzIGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZSwgcmVnYXJkbGVzcworICAgICAgICBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4KKwkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpKTogRG91YmxlIGNoZWNrIHRoYXQgdGhlCisJY2FsbGVyIGlzIHdyaXRpbmcgdG8gYSB2YWxpZCBzZWN0aW9uLgorCitUaHUgTWFyICAyIDE0OjM3OjU3IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+CisKKwkqIGJpbmFyeS5jOiBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBiaW5hcnkgZmlsZXMuICBMb2FkcyB0aGUgcmF3CisJY29udGVudHMgb2YgdGhlIGZpbGUgaW50byBhIGRhdGEgc2VjdGlvbiBhbmQgd3JhcHMgc29tZSBzeW1ib2xzCisJYXJvdW5kIGl0LiAgVGhlIHN5bWJvbHMgYF9iaW5hcnlfPGZpbGVuYW1lPl9zdGFydCcgYW5kCisJYF9iaW5hcnlfPGZpbGVuYW1lPl9lbmQnIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkYXRhLAorCXdoaWxlIGBfYmluYXJ5XzxmaWxlbmFtZT5fc2l6ZScgaXMgYW4gYWJzb2x1dGUgc3ltYm9sIHdob3NlIHZhbHVlCisJaXMgdGhlIHNpemUgb2YgdGhlIGRhdGEuICA8ZmlsZW5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBiaW5hcnkKKwlpbnB1dCBmaWxlLCB3aXRoIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgY29udmVydGVkIHRvCisJdW5kZXJzY29yZXMuCisKKwkqIGFyY2h1cmVzLmMgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlKTogQXNzdW1lIHVzZXJzIGtub3dzIHdoYXQKKwl0aGV5J3JlIGRvaW5nIGlmIG9uZSBvZiB0aGUgYXJjaGl0ZWN0dXJlcyBpcyBiZmRfYXJjaF91bmtub3duLgorCitXZWQgTWFyICAxIDE3OjMwOjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBGb3IgcmVsb2NhdGlvbgorCVJfUFBDX0dPVDE2LCBjaGFuZ2UgY29tcGxhaW5fb25fb3ZlcmZsb3cgdG8gYmUKKwljb21wbGFpbl9vdmVyZmxvd19zaWduZWQuCisKK1dlZCBNYXIgIDEgMTE6NTI6NTUgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgcG93ZXJwYy0qLWFpeCouCisKK1dlZCBNYXIgIDEgMTE6NTc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLWk5NjAuYyAoQ09GRl9QQUdFX1NJWkUpOiBEZWZpbmUuCisKKwkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSBvdXRwdXQgb2YgVERFRkFVTFRTIHRvIGF2b2lkIHJlbHlpbmcgb24KKwlzZW1hbnRpY3Mgb2Ygc2luZ2xlIHF1b3RlcyBpbiBwYXJhbWV0ZXIgc3Vic3RpdHV0aW9uLgorCitUdWUgRmViIDI4IDEyOjUzOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogU29ydCBlbXB0eSBzZWN0aW9ucyBiZWZvcmUgbm9uLWVtcHR5CisJc2VjdGlvbnMsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBWTUEuCisKKwkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotbGludXhlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWxlbGYuCisJKGlbMzQ1XTg2LSotZ251ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1nZWxmLgorCSogY29uZmlnL2kzODYtbGVsZi5tdDogTmV3IGZpbGUuCisJKiBjb25maWcvaTM4Ni1nZWxmLm10OiBOZXcgZmlsZS4KKworTW9uIEZlYiAyNyAxMjo1ODoyNSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkOiBhZGQgYTI5ay0qLXZ4d29ya3MgY29uZmlndXJhdGlvbi4KKworV2VkIEZlYiAyMiAxNDo0MDoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0bworCXVzZSByZWxvY19ob3d0b190eXBlIHJhdGhlciB0aGFuIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QuCisKK1R1ZSBGZWIgMjEgMTg6MTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIGlmIGFza2VkCisJZm9yIHJlbG9jYXRpb25zIGZvciB0aGUgLmJzcyBzZWN0aW9uLgorCitUdWUgRmViIDIxIDE1OjEzOjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBIYW5kbGUgb2JqZWN0cyB3aXRoIG9kZAorCWxlbmd0aHMuCisKK0ZyaSBGZWIgMTcgMTI6MzQ6MzYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2dvdDE2X3JlbG9jKTogTWFrZSBHT1Qgc3R5bGUgcmVsb2NzIGFkZAorCTMyNzY4LCBzbyB0aGUgR09UIHBvaW50ZXIgY2FuIHBvaW50IHRvIDE2Mzg0IHBvaW50ZXJzLCBpbnN0ZWFkIG9mCisJODE5Mi4KKworRnJpIEZlYiAxNyAxMTo0NTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGhvc3RzL3N5c3Y0Lmg6IEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0ZGxpYi5oPiwgYW5kIDx0aW1lLmg+LgorCU9ubHkgZGVmaW5lIFNFRUtfU0VUIGFuZCBTRUVLX0NVUiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBkZWZpbmVkLgorCVJlbW92ZSBhbGwgZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorCisJKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiBSZXR1cm4gJ1cnIGZvciBhIHdlYWsgc3ltYm9sLgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBzdGFydCBhZGRyZXNzIGFuZCBmbGFncworCWJlZm9yZSBjYWxsaW5nIGNvZmZfbWtvYmplY3RfaG9vay4gIFJlc3RvcmUgdGhlbSBvbiBmYWlsdXJlLgorCSogZWNvZmYuYyAoX2JmZF9lY29mZl9ta29iamVjdF9ob29rKTogSWYgbm90IEVDT0ZGX0FPVVRfWk1BR0lDLAorCWNsZWFyIERfUEFHRUQuCisKKwkqIGNvZmZnZW4uYzogUmVpbmRlbnRlZC4KKworVGh1IEZlYiAxNiAxNDozNzoyMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+CisKKwkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCB1c2UgYml0cG9zIGluIG92ZXJmbG93CisJY2FsY3VsYXRpb25zLgorCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCisKK1RodSBGZWIgMTYgMTM6MjI6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmUgYWxsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGljaCByZXR1cm4KKwlpbnQgb3Igdm9pZCwgZXhjZXB0IHRoZSBvbmUgZm9yIGZyZWUuCisKK1dlZCBGZWIgMTUgMTQ6NTQ6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBVc2UgYSBkZXN0aW5hdGlvbiBtYXNrIG9mCisJMHhmZmZmZmZmZiBmb3IgUl9QUENfUkVMMzIsIG5vdCAwLgorCShwb3dlcnBjX3JlbG9jX21hcCk6IEFkZCBsb3cgMTYgYml0LCBoaWdoIDE2IGJpdCwgYW5kIGhpZ2ggMTYgYml0CisJYWRqdXN0ZWQgcmVsb2NhdGlvbnMuCisKK1R1ZSBGZWIgMTQgMTc6NDc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpOiBEZWZpbmUuCisJKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoYmZkX2VsZjMyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVmaW5lLgorCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpbmRfbGluZV9pbmZvIGZpZWxkLgorCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogTW92ZSB0byBlY29mZmxpbmsuYy4KKwkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KKwkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KKwkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCisJKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4KKwkobWtfZmRydGFiKTogTGlrZXdpc2UuCisJKGxvb2t1cCk6IExpa2V3aXNlLgorCShfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCBjYWxsIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKKwl0byBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgQWxsb2NhdGUgZmluZF9saW5lX2luZm8gaWYgbmVjZXNzYXJ5LgorCSogZWNvZmZsaW5rLmM6IEluY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIuCisJKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBNb3ZlIGluIGZyb20gZWNvZmYuYy4KKwkoX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KKwkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBMaWtld2lzZS4KKwkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCisJKGNtcF9mZHJ0YWJfZW50cnkpOiBMaWtld2lzZS4gIFVzZSBQVFIgaW5zdGVhZCBvZiB2b2lkICouCisJKG1rX2ZkcnRhYik6IE1vdmUgaW4gZnJvbSBlY29mZi5jLiAgQWRkIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCisJYW5kIGxpbmVfaW5mbyBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mIGVjb2ZmX2RhdGEuCisJKGZkcnRhYl9sb29rdXApOiBNb3ZlIGluIGZyb20gbG9va3VwIGluIGVjb2ZmLmMuICBSZW1vdmUgYWJmZAorCWFyZ3VtZW50LCBhZGQgbGluZV9pbmZvIGFyZ3VtZW50LiAgVXNlIGl0IGluc3RlYWQgb2YgZWNvZmZfZGF0YS4KKwkoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IE5ldyBmdW5jdGlvbiwgbW9zdGx5IGZyb20gdGhlIG9sZAorCV9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUgaW4gZWNvZmYuYy4KKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IFJlbW92ZSBmaW5kX2J1ZmZlciwgZmRydGFiX2xlbiBhbmQKKwlmZHJ0YWIgZmllbGRzLCByZXBsYWNpbmcgdGhlbSBmaW5kX2xpbmVfaW5mbyBmaWVsZC4KKwkoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IERlY2xhcmUuCisJKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogRGVjbGFyZS4KKwkoX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4pOiBEZWNsYXJlLgorCShfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQpOiBEZWNsYXJlLgorCSogbGliYmZkLWluLmggKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBlY29mZi5vIGZvciBiZmRfZWxmMzJfYmlnbWlwc192ZWMgb3IKKwliZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisKK1R1ZSBGZWIgMTQgMTQ6MDQ6MjIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgZWxmX21hY2hpbmVfYWx0MSBhbmQKKwllbGZfbWFjaGluZV9hbHQyIHdoaWNoIHByb3ZpZGUgYWx0ZXJuYXRlIHZlcnNpb25zIG9mIHRoZSBtYWNoaW5lCisJY29kZS4KKworCSogZWxmMzItcHBjLmMgKEVMRl9NQUNISU5FX0FMVDEsIEVMRl9NQUNISU5FX0FMVDIpOiBEZWZpbmUgdG8KKwlyZWNvZ25pemUgb2xkIHZlcnNpb25zIG9mIHRoZSBQb3dlclBDIG1hY2hpbmUgY29kZS4KKworCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQorCWZpZWxkcyBkZWZpbmVkIGJ5IEVMRl9NQUNISU5FX0FMVDEgYW5kIEVMRl9NQUNISU5FX0FMVDIuCisKKwkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQpOiBJbml0aWFsaXplIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKKwlmaWVsZHMgZGVmaW5lZCBieSBFTEZfTUFDSElORV9BTFQxIGFuZCBFTEZfTUFDSElORV9BTFQyLgorCisJKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogSW4gYWRkaXRpb24gdG8gdGhlCisJbWFpbiBtYWNoaW5lIGNvZGUgZmllbGQsIGNoZWNrIHRoZSB0d28gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZQorCWZpZWxkcy4KKworVHVlIEZlYiAxNCAxMjo0Njo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXRmMS5oIChNQUNIVFlQRV9PSyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuICBEb24ndAorCWFjY2VwdCBNX1NQQVJDIGlmIGJmZF9hcmNoX3NwYXJjIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKKwlhcmNoaXRlY3R1cmVzLCBhbmQgZG9uJ3QgYWNjZXB0IGEgNjgweDAgbWFjaGluZSB0eXBlIGlmCisJYmZkX2FyY2hfbTY4ayBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMuCisJKiBhb3V0MC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KKworTW9uIEZlYiAxMyAyMzoyNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEb24ndCByZXR1cm4gYSBwb2ludGVyCisJdG8gZ2FyYmFnZSBpZiB0aGUgc3ltYm9sIGluZGV4IGlzIG91dCBvZiByYW5nZS4KKwkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgorCitUaHUgRmViICA5IDE4OjM2OjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBpMzg2bXNkb3Muby4KKworVGh1IEZlYiAgOSAxMjowMjozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGkzODZsaW51eC5jIChORUVEU19TSFJMSUIpOiBEZWZpbmUuCisJKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDcmFzaCBpZiBhIE5FRURTX1NIUkxJQiBzeW1ib2wgaXMKKwl1bmRlZmluZWQuICBGcm9tIGhqbEBueW5leHN0LmNvbSAoSC5KLiBMdSkuCisKK1dlZCBGZWIgIDggMTc6MjY6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEFsbG9jYXRlIGNvbW1vbgorCXN5bWJvbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIGNvbW1vbgorCXN5bWJvbCBzaXplIG92ZXJmbG93LgorCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQWRqdXN0IHJlZmVyZW5jZXMKKwl0byBjb21tb24gc3ltYm9sIGluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgorCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KKwkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCisKK1dlZCBGZWIgIDggMDk6NTM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogUHV0IFNIVF9OT0JJVFMgc2VjdGlvbnMgYWZ0ZXIgIVNIVF9OT0JJVFMuCisKK1R1ZSBGZWIgIDcgMTY6Mjc6MzMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fYmZkX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UsIGRvbid0CisJYWJvcnQuCisKK1R1ZSBGZWIgIDcgMTQ6NDM6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmM6IFJlZm9ybWF0dGVkIHNvbWUgY29tbWVudHMgYW5kIGJyYWNlIGNvbnN0cnVjdHMgaW4KKwlyZWNlbnQgY2hhbmdlcyB0byBHTlUgc3R5bGUuCisJKGNtcF9mZHJ0YWJfZW50cnksIG1rX2ZkcnRhYiwgbG9va3VwKTogVXNlIG9sZC1zdHlsZSBmdW5jdGlvbgorCWRlZmluaXRpb25zLgorCitUdWUgRmViICA3IDE0OjIxOjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogWmVybyBvdXQgaW50ZXJuIGJlZm9yZSBzZXR0aW5nCisJYW55IG9mIHRoZSBmaWVsZHMuCisKK01vbiBGZWIgIDYgMjA6MDE6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCVNhdCBGZWIgIDQgMTQ6MjA6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgorCisJKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9wZHJfaW4sIGVjb2ZmX3N3YXBfcGRyX291dCk6IGFkZGVkCisJaW50ZXJuYWxpemluZy9leHRlcm5hbGl6aW5nIG5ldyAicHJvZiIgZmllbGQuCisKKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX3RkYXRhKTogYWRkZWQgZmRydGFiLgorCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4ZWQuCisKK01vbiBGZWIgIDYgMTQ6MjU6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc2F3X25lZWRlZCBmaWVsZC4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IHNhd19uZWVkZWQgaWYKKwlEVF9ORUVERUQgc2VlbiBpbiAuZHluYW1pYyBzZWN0aW9uLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogV2FybiBpZiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzCisJb25seSByZWZlcmVuY2VkIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIG5vdCBtYWtpbmcgYSBzaGFyZWQKKwlvYmplY3QsIGFuZCBzYXdfbmVlZGVkIGlzIGZhbHNlLgorCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBzYXdfbmVlZGVkLgorCisJKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUspOiBEb24ndCBkZWZpbmUuCisJKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNsZWFyIG9yIHNldAorCUVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3QgY2hlY2sgRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCisKKwlEaXN0aW5ndWlzaCBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgZnJvbSBhIHJlZ3VsYXIgZGVmaW5lZCBzeW1ib2wuCisJKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBERUZXLgorCShsaW5rX2FjdGlvbik6IEFkZCBiZmRfbGlua19oYXNoX2RlZndlYWsgY29sdW1uLgorCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBERUZXIGNhc2UuICBIYW5kbGUKKwliZmRfbGlua19oYXNoX2RlZndlYWsgaW4gYSBmZXcgb3RoZXIgY2FzZXMuCisJKiBNYW55IGZpbGVzIChiZmRfbGlua19oYXNoX3VuZGVmd2Vhayk6IFJlbmFtZWQgZnJvbQorCWJmZF9saW5rX2hhc2hfd2Vhay4KKwkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KKwkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCisJKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgorCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBMaWtld2lzZS4KKwkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcyk6IExpa2V3aXNlLgorCSogY29mZmxpbmsuYyAoY29mZl93cml0ZV9nbG9iYWxfc3ltKTogTGlrZXdpc2UuCisJKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgorCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogTElrZXdpc2UuCisJKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBMaWtld2lzZS4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisJKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KKwkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisJKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBMaWtld2lzZS4KKwkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCShsaW51eF90YWxseV9zeW1ib2xzKTogTGlrZXdpc2UuCisJKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgorCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IExpa2V3aXNlLgorCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IExpa2V3aXNlLgorCShiZmRfcGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCisJKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBMaWtld2lzZS4KKwkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCisJKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKwkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKworTW9uIEZlYiAgNiAwMzoyMDoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQsIGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU6CisJKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLW1zZG9zKik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKGkzODZtc2Rvc192ZWMpOiBIYW5kbGUgaXQuCisJKiBpMzg2bXNkb3MuYzogTmV3IGZpbGUuCisJKiBjb25maWcvaTM4Ni1tc2Rvcy5tdDogTmV3IGZpbGUuCisJKiBiZmQuYyAoZW51bSBiZmRfZXJyb3IpOiBBZGRlZCBuZXcgdmFsdWUgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZy4KKwkoYmZkX2Vycm1zZ3MpOiBBZGRlZCBzdHJpbmcgdG8gdGFibGUuCisJKiBsaWJhb3V0LmggKHJlbG9jX3R5cGUtbG9va3VwKTogRGVjbGFyZSBpdC4KKwkqIHRhcmdldHMuYyAoZW51bSBiZmRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ci4KKwkoaTM4Nm1zZG9zX3ZlYyk6IERlY2xhcmUuCisJKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGl0IHRvIHRoZSBsaXN0LgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KKworV2VkIEZlYiAgMSAwMTozMjoxNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbywgY2FzZSBSX0RBVEFfT05FX1NZTUJPTCk6IElmIHRoZXJlJ3MKKwlub3RoaW5nIGluIFJfREFUQV9PVkVSUklERSwgdGhlbiB0cnkgdG8gZmluZCB0aGUgYWRkZW5kIGluIHRoZQorCXNlY3Rpb24ncyBjb250ZW50cy4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IElnbm9yZSB0aGUgYWRkZW5kIGluIGEgUl9EQVRBX09ORV9TWU1CT0wgZml4dXAuCisKKwkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogTW9yZSBoZXJ1aXN0aWNzIHRvIGRldGVjdCB0aGUKKwlicmFpbmRhbWFnZWQgSFAgT1NGMSBsaW5rZXIuIAorCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGZvcmdldCB0byBmcmVlIHN1YnNwYWNlX3NlY3Rpb25zIGlmIHdlIGdldAorCWFuIGVycm9yLgorCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogQWxsb2NhdGUgc3RyaW5ncyBvbiB0aGlzIGJmZCdzIG9ic3RhY2sKKwlyYXRoZXIgdGhhbiBkaXJlY3RseSBvdXQgb2YgdGhlIGhlYXAuCisJKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIHNhdmVkIGNvcHkgb2YgdGhlCisJY2Fub25pY2FsIHN5bWJvbHMuCisJKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgc2F2ZWQgY29weSBvZiB0aGUKKwljYW5vbmljYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMgd2hlbiB3ZSdyZQorCWRvbmUgd2l0aCB0aGVtLgorCitUdWUgSmFuIDMxIDIxOjUzOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBtZW1iZXIgcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KKwkqIGVsZmNvZGUuaCAoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBOZXcgcGFyYW1ldGVycyBzb3J0ZWRfaGRycywKKwljb3VudCwgYW5kIG1heHBhZ2VzaXplLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KKwlJZiBzb3J0ZWRfaGRycyBpcyBub24tTlVMTCwgdXNlIGl0IHRvIGNvbXB1dGUgdGhlIG51bWJlciBvZiBzZWdtZW50cy4KKwlTYXZlIHJlc3VsdCBpbiBjYXNlIGNhbGxlZCBhZ2Fpbi4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTb3J0IGhlYWRlcnMgYmVmb3JlIGNhbGxpbmcKKwlnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4KKworVHVlIEphbiAzMSAxNToyNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBBZGQgc29ydGVkX2hkcnMgcGFyYW1ldGVyLgorCVNlYXJjaCB0aHJvdWdoIGl0IHJhdGhlciB0aGFuIHRocm91Z2ggdW5zb3J0ZWQgc2VjdGlvbiBoZWFkZXJzLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFBhc3Mgc29ydGVkX2hkcnMgdG8KKwltYXBfcHJvZ3JhbV9zZWdtZW50cy4KKworTW9uIEphbiAzMCAyMjowNDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRml4IHByb2JsZW1zIGluIHJhbmdlCisJY2hlY2tpbmcuICBFeHBlY3QgYXJndW1lbnQgT0ZGU0VUIHRvIGJlIHNlY3Rpb24tcmVsYXRpdmUuICBGcm9tCisJRGF2aWQgTW9zYmVyZ2VyLVRhbmcsIGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUuCisKK01vbiBKYW4gMzAgMTE6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IERvbid0IGRvCisJYW55dGhpbmcgaWYgd2UgYXJlIG5vdCBsaW5raW5nIGFuIEVMRiBmaWxlLgorCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IExpa2V3aXNlLgorCitTYXQgSmFuIDI4IDEyOjQ4OjU3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoY29tcGFyZV9zdWJzcGFjZXMpOiBOZXcgZnVuY3Rpb24gdG8gc29ydCBzdWJzcGFjZXMgYnkKKwl0aGVpciBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCisJKHNldHVwX3NlY3Rpb25zKTogV2hlbiBjb21wdXRpbmcgdGhlIGluZGV4IGZvciBlYWNoIHN1YnNwYWNlLAorCWhhbmRsZSBjYXNlIHdoZXJlIHNldHVwX3NlY3Rpb25zIHJlYWRzIHRoZSBzdWJzcGFjZXMgaW4gYQorCWRpZmZlcmVudCBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4KKwkoc29tX2lzX3NwYWNlKTogQWxzbyBleGFtaW5lIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcKKwlzZWN0aW9uLgorCShzb21faXNfc3Vic3BhY2UsIHNvbV9pc19jb250YWluZXIpOiBMaWtld2lzZS4KKwkoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBwcmVwYXJlIG9yIHdyaXRlIGZpeHVwcyBoZXJlLiAgV2hlbgorCXdyaXRpbmcgdGhlIHN5bWJvbCBzdHJpbmdzLCB1c2UgdGhlIHVuc29ydGVkIHN5bWJvbCB0YWJsZS4KKwkoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHdyaXRlIHRoZSBzeW1ib2wgdGFibGUgaGVyZS4KKwkoc29tX2ZpbmlzaF93cml0aW5nKTogUHJlcGFyZSBhbmQgd3JpdGUgdGhlIGZpeHVwcyBoZXJlLiAgTGlrZXdpc2UKKwlmb3IgdGhlIHN5bWJvbCB0YWJsZS4KKwkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFVuZGVmaW5lZCBzeW1ib2xzIGFsd2F5cyBoYXZlCisJdHlwZSBTU19VTlNBVCByZWdhcmRsZXNzIG9mIEJTRl9FWFBPUlQuCisJKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFVucGFjayBhbmQgYXR0YWNoIGFyZ3VtZW50IGxvY2F0aW9uCisJaW5mb3JtYXRpb24gZm9yIFJfUENSRUxfQ0FMTCBhbmQgUl9BQlNfQ0FMTCByZWxvY2F0aW9ucy4KKworCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBOZXcgaGV1cmlzdGljIHRvIGRldGVybWluZSBpZiB0aGUKKwllbnRyeSBhbmQgZmxhZ3MgZmllbGRzIGFyZSBzd2l0Y2hlZCBpbiB0aGUgZXhlYyBoZWFkZXIuCisKK1NhdCBKYW4gMjggMDA6MTY6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSAqc3ltX2hhc2ggaW5zdGVhZAorCW9mIGggaWYgd2UgbWlnaHQgbm90IGJlIGRvaW5nIGFuIEVMRiBsaW5rLgorCitGcmkgSmFuIDI3IDE2OjEzOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogSWYgdGhlIHNpemUgb2YgYW4gaW5wdXQKKwkucmVnaW5mbyBzZWN0aW9uIGlzIHplcm8sIGZvcmNlIGl0IHRvIHRoZSBjb3JyZWN0IHNpemUsIHNpbmNlIHRoZQorCWxpbmtlciBlbXVsYXRpb24gY29kZSBtYXkgaGF2ZSBjbG9iYmVyZWQgaXQuCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IENvcnJlY3QgU0hGX0FMTE9DIHRlc3QuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRnJlZSBzb3J0ZWRfaGRycy4KKworVGh1IEphbiAyNiAwOTowMDoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IG9mZiBieQorCW9uZSBlbmQgYWRkcmVzcyBjYWxjdWxhdGlvbi4KKworCSogY29uZmlnLmJmZDogKG02OCotZXN0LWNvZmYpOiBOZXcgY29uZmlndXJhdGlvbi4KKworVGh1IEphbiAyNiAxMTozOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBleGFtaW5lIHdlYWtkZWYgaWYKKwl3ZSBhcmUgdXNpbmcgYW4gRUxGIGhhc2ggdGFibGUuCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQWx3YXlzIHNldCBFWEVDX1AgaWYKKwl0aGUgc3RhcnQgYWRkcmVzcyBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgZXZlbiBpZiBTVEFUX0ZPUl9FWEVDCisJaXMgc2V0LiAgSnVzdCB1c2UgU1RBVF9GT1JfRVhFQyBhcyBhbiBhZGRpdGlvbmFsIHRlc3QuCisKK1RodSBKYW4gMjYgMTE6MTI6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogVXNlIEVNX1BQQyBpbnN0ZWFkIG9mCisJRU1fQ1lHTlVTX1BPV0VSUEMuCisKKwkqIGVsZjMyLXBwYy5jIChyZWxvY190eXBlKTogQWRkIGFsbCBTeXN0ZW0gVi40IGFuZCBlQUJJCisJcmVsb2NhdGlvbnMgY3VycmVudGx5IGRlZmluZWQuCisJKHBvd2VycGNfcmVsb2NfbWFwKTogQWRqdXN0IHRvIG5ldyByZWxvY2F0aW9uIG5hbWVzLgorCShlbGZfcG93ZXJwY19ob3d0b190YWJsZSk6IEFkZCBtb3N0IG9mIHRoZSBuZXcgcmVsb2NhdGlvbnMuCisJKEVMRl9NQUNISU5FX0NPREUpOiBVc2UgRU1fUFBDIGluc3RlYWQgb2YgRU1fQ1lHTlVTX1BPV0VSUEMuCisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWFiaS4KKworCSogY29uZmlnL3BwYy1lbGYubXQ6IEFkZCByczYwMDAgYXJjaGl0ZWN0dXJlIHN1cHBvcnQgdG8gdGhlCisJUG93ZXJQQy4gIEFsc28gYWRkIFhDT0ZGIHN1cHBvcnQuCisKK1dlZCBKYW4gMjUgMjM6MjY6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXNoLmMgKENBTENfQURERU5EKTogRG9uJ3QgZGVmaW5lLgorCShjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUuCisJKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLgorCitUdWUgSmFuIDI0IDE0OjIyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSB2YWx1ZSBvZiB0aGUKKwlFQ09GRiBzeW1ib2wgZnJvbSB0aGUgaGFzaCB0YWJsZSBlbnRyeS4KKworTW9uIEphbiAyMyAxNDo1MzozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogY29mZi1zaC5jIChjb2ZmX3NoX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3Qgc3VidHJhY3QKKwl2bWEgdHdpY2UuCisKK01vbiBKYW4gMjMgMTM6MzM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb2ZmLXNoLmMgKHNoX3JlbG9jKTogRG9uJ3QgaWdub3JlIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiBhbgorCVJfU0hfSU1NMzIgcmVsb2MuCisKKwkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZ251Kik6IFNldCBiZmRfbmFtZSB0byBpMzg2LWdudS4KKwkqIGNvbmZpZy9pMzg2LWdudS5tdDogTmV3IGZpbGUuICBJbmNsdWRlIEVMRiBzdXBwb3J0LgorCisJKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogQ2FsbCBiZmRfY2FjaGVfaW5pdC4KKworRnJpIEphbiAyMCAxMTo0NDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogT25seSBzZXQgdGhlIHN1bm9zIHNwZWNpZmljCisJZmllbGRzIGlmIHdlIGFyZSBkb2luZyBhIHN1bm9zIGxpbmsuCisKK1dlZCBKYW4gMTggMTI6Mjg6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjcHUtaDgzMDAuYyAoaDgzMDBfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDAiIHRvCisJImg4MzAwIiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBjcHUtKiBmaWxlcy4KKwkoaDgzMDBoX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwSCIgdG8gImg4MzAwaCIuCisJKiBjb2ZmLWg4MzAwLmMgKHNwZWNpYWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGRpZmYuCisKK1R1ZSBKYW4gMTcgMTA6NTI6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBiZmQtaW4uaCAoYmZkX2J5dGUsIHJlbG9jX2hvd3RvX3R5cGUpOiBEZWZpbmUgaGVyZSwgbm90Li4uCisJKiByZWxvYy5jIChiZmRfYnl0ZSwgcmVsb2NfaG93dG9fdHlwZSk6IGhlcmUuCisJKiBDaGFuZ2VkIGFsbCBvY2N1cnJlbmNlcyBvZiBgYGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QnJworCXRvIGJlIGBgcmVsb2NfaG93dG9fdHlwZScnIGluc3RlYWQuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCisKKwkqIG9wbmNscy5jIChiZmRfb3BlbnN0cmVhbXIpOiBOZXcgZnVuY3Rpb24uCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKKwkqIGVsZjMyLW1pcHMuYyAoZW51bSByZWxvY190eXBlKTogRGVmaW5lIG5ldyByZWxvY3MgdXNlZCBvbiBJcml4LgorCShlbGZfbWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBuZXcgcmVsb2NzLgorCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19NU1lNLAorCVNIVF9NSVBTX0RXQVJGLCBhbmQgU0hUX01JUFNfRVZFTlRTLgorCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogSGFuZGxlIHNlY3Rpb25zIG5hbWVkIC5tc3ltLCAuZGVidWdfKgorCWFuZCAuTUlQUy5ldmVudHMuKi4KKworCSogc3JlYy5jIChzcmVjX2luaXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCisKK1NhdCBKYW4gMTQgMTk6MDk6NDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+CisKKwkqIGFyY2h1cmVzLmMsIE1ha2VmaWxlLmluLCB0YXJnZXRzLmMsIGJmZC1pbjIuaCwgY29mZmNvZGUuaCwKKwljb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGNvbmZpZy93NjUubXQ6IEluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIFc2NS4KKworU3VuIEphbiAxNSAxMzo1Nzo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ29uZmlndXJlIGZvciBXSU4zMi4KKworVGh1IEphbiAxMiAxNjozMDo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogSW5jbHVkZSBgaGVhZGVycycuCisKKwkqIHN1bm9zLmMgKG02OGtfcGx0X2ZpcnN0X2VudHJ5LCBzcGFyY19wbHRfZmlyc3RfZW50cnkpOiBOb3cKKwljb25zdC4KKwkqIHRla2hleC5jIChkaWdzKTogRGl0dG8uCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3BsdDBfZW50cnksIGVsZl9pMzg2X3BsdF9lbnRyeSk6IERpdHRvLgorCisJKiBzcmVjLmMsIHRla2hleC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgRGVsZXRlIHN0YXRpYyBhcnJheQorCWhleF92YWx1ZSBhbmQgcmVwbGFjZSByZWZlcmVuY2VzIHRvIGl0IHdpdGggcmVmZXJlbmNlcyB0bworCWhleF9pbml0LCBoZXhfcCwgYW5kIGhleF92YWx1ZS4KKwkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KKworCSogYXJjaHVyZXMuYyAoYXJjaHVyZXNfaW5pdF90YWJsZSk6IE5vdyBjb25zdC4KKwkoYmZkX2FyY2hfaW5pdCk6IEFkanVzdGVkIHR5cGUgb2YgbG9jYWwgdmFyIGBwdGFibGUnLgorCitUaHUgSmFuIDEyIDA5OjMzOjI0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaG9zdHMvc3ltbWV0cnkuaDogIFJlZGVmaW5lIGBzaGFyZWQnIHRvIGVuYWJsZSBjb21waWxhdGlvbgorCXdpdGggdGhlIG5hdGl2ZSBEeW5peCBjYyBjb21waWxlci4KKwkqIGkzODZkeW5peC5jOiAgSW5jbHVkZSBhb3V0eC5oIGluc3RlYWQgb2YgdXNpbmcgcm91dGluZXMKKwlmcm9tIGFvdXQzMi5jLgorCitXZWQgSmFuIDExIDIxOjMxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBNYWtlIHR5cGVkZWYgaW5jbHVkZSBgY29uc3QnLgorCSogYW91dC1uczMyay5jLCBhb3V0eC5oLCBib3V0LmMsIGNmLW02OGtseW54LmMsIGNvZmYtaTM4Ni5jLAorCWNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZmxpbmsuYywgY3B1LW5zMzJrLmMsIGVjb2ZmLmMsCisJZWxmMzItaHBwYS5jLCBlbGYzMi1pMzg2LmMsIGVsZjMyLW1pcHMuYywgZWxmMzItc3BhcmMuYywKKwllbGZjb2RlLmgsIGxpYmJmZC1pbi5oLCBsaW5rZXIuYywgbWlwc2JzZC5jLCBubG0zMi1wcGMuYywgb2FzeXMuYywKKwlyZWxvYy5jLCBzb20uYzogRG9uJ3QgdXNlIGBjb25zdCcgaW4gY29tYmluYXRpb24gd2l0aAorCWByZWxvY19ob3d0b190eXBlJy4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgorCisJKiBlY29mZi5jIChlY29mZl90eXBlX3RvX3N0cmluZyk6IExvY2FsIHZhcmlhYmxlIGBidWZmZXIxJyBkb2Vzbid0CisJbmVlZCB0byBiZSBzdGF0aWMuCisKK1dlZCBKYW4gMTEgMTQ6MzY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNvcmUgZHVtcCBpZiBhIG11bHRpcGxlCisJZGVmaW5pdGlvbiBvZiBhbiBhYnNvbHV0ZSBzeW1ib2wgaXMgZW5jb3VudGVyZWQuCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElnbm9yZQorCXJlZGVmaW5pdGlvbnMgb2YgYW4gYWJzb2x1dGUgc3ltYm9sIHRvIHRoZSBzYW1lIHZhbHVlLgorCitNb24gSmFuICA5IDE1OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJdCdzIHJlYXNvbmFibGUgZm9yIG5vCisJZmxhZ3MgdG8gYmUgc2V0LCBzbyBkb24ndCBpbnNpc3Qgb3RoZXJ3aXNlLgorCitGcmkgSmFuICA2IDE2OjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3Qgc2V0IEJTRl9HTE9CQUwgZm9yIGFuCisJdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCisJKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgorCitXZWQgSmFuICA0IDE0OjE0OjA1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSByZXR1cm4gc2VjdGlvbnMgd2hpY2gKKwljb3JyZXNwb25kIHRvIHN1YnNwYWNlcy4KKworCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgZm9yZ2V0IHRvIGJ1bXAgdGhlCisJdG90YWxfc3Vic3BhY2VzIHdoZW4gd3JpdGluZyB0aGUgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCisKK1dlZCBEZWMgMjggMjA6NTQ6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogVXNlIFNFQ19IQVNfQ09OVEVOVFMgdG8gaWRlbnRpZnkKKwlic3MtbGlrZSBzZWN0aW9ucy4KKwkoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKHNvbV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCitUdWUgRGVjIDI3IDE0OjAzOjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBUdXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIGZvciBic3MtbGlrZQorCXNlY3Rpb25zLgorCitUdWUgRGVjIDIwIDE1OjMwOjEyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvZmZnZW4uYyAoYmZkX2RlYnVnX3NlY3Rpb24pOiBEZWxldGVkLgorCShjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXgpOiBSZXR1cm4gYWJzb2x1dGUgc2VjdGlvbiBmb3IgZGVidWcKKwlzeW1ib2wuCisJKGNvZmZfd3JpdGVfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIENfRklMRSBzeW1ib2xzLiAgSWYKKwlCU0ZfREVCVUdHSU5HIGlzIHNldCwgc2V0IHNlY3Rpb24gdG8gTl9ERUJVRy4KKwkoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBVc2UgYWJzb2x1dGUgc2VjdGlvbi4KKworCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEluIGFzc2VydGlvbiwKKwlmb3JjZSBhbGwgdmFsdWVzIHRvIHRoZSBzYW1lIHR5cGUuCisKK1R1ZSBEZWMgMjAgMTE6MTE6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IEFsbCByZWxvY3MgZ2V0IGEgc3BlY2lhbCBmdW5jdGlvbi4KKwkoc3BlY2lhbCk6IE5ldmVyIGRvIGFueXRoaW5nIHdoZW4gbGlua2luZyAtci4KKworVHVlIERlYyAyMCAxMzo1ODowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IERvbid0IGRvIGFueXRoaW5nIExpbnV4CisJc3BlY2lmaWMgaWYgdGhpcyBpcyBub3QgYSBMaW51eCBoYXNoIHRhYmxlLiAgRnJvbSBFcmljIFlvdW5nZGFsZQorCTxlcmljQGFpYi5jb20+LgorCisJUGF0Y2hlcyBmcm9tIGtrb2ppbWFAbWl4Lm9yLmpwIChLYXp1bW90byBLb2ppbWEpOgorCSogbWlwc2JzZC5jIChtaXBzX2hvd3RvX3RhYmxlX2V4dCk6IENoYW5nZSBzaXplcyBvZiBtZW1vcnkgcmVsb2NzCisJYXBwbHkgdG8gZnJvbSB0d28gYnl0ZXMgdG8gZm91ciBieXRlcy4KKwkqIE1ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IGFuZCBleHBhbmQgdGhlCisJbGlzdCBvZiBjYXNlcyBmb3Igd2hpY2ggcmVsb2NhdGlvbiBuZWVkIG5vdCBiZSBjb21wdXRlZC4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKworTW9uIERlYyAxOSAyMzowOToxNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBEZWxldGUgZG9fbG9jYWxzIGFuZAorCWRvX2dsb2JhbHMgYXJndW1lbnRzLCBhbHdheXMgcmVhZCBzeW1ib2wgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGZvcgorCWdsb2JhbHMgYW5kIGxvY2Fscy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IFJld29yayB0byBvbmx5IHJlYWQgc3ltYm9sIGV4dGVuc2lvbgorCWluZm9ybWF0aW9uIG9uY2UgZm9yIGVhY2ggaW5wdXQgYmZkLiAgMTAlIGltcHJvdmVtZW50IGluIGxpbmtlcgorCXBlcmZvcm1hbmNlLgorCitGcmkgRGVjIDE2IDEyOjI4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogQ2hlY2sKKwliZmRfaXNfYWJzX3NlY3Rpb24sIGV0Yy4sIG9ubHkgYWZ0ZXIgY2hlY2tpbmcgZm9yIHRoZSBzZWN0aW9uIGluCisJdGhlIEJGRCBhbmQgYWZ0ZXIgY2FsbGluZyB0aGUgYmFja2VuZCByb3V0aW5lLgorCitXZWQgRGVjIDE0IDIwOjIxOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBPbmx5IHVzZSBzZWN0aW9uIHN5bWJvbHMgd2hvc2UKKwl2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIGNoZWNraW5nIG91dHB1dF9vZmZzZXQgd2hlbgorCXVzaW5nIG91dHB1dF9zZWN0aW9uLiAgV2hlbiBjcmVhdGluZyBhIG5ldyBzeW1ib2wsIHNldCB0aGUgdmFsdWUKKwl0byAwLCBzaW5jZSBCRkQgc3ltYm9sIHZhbHVlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZS4KKworVHVlIERlYyAxMyAxMzozMTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNwdS16OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IE1ha2UgejgwMDIgdGhlIGRlZmF1bHQKKwlhcmNoaXRlY3R1cmUuCisKK0ZyaSBEZWMgIDkgMTI6NDM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlCisJYXJjaGl2ZSBpcyBub3QgYW4gRUxGIG9iamVjdCwgcGFzcyB0aGUgYXJjaGl2ZSB0byB0aGUgYWRkX3N5bWJvbHMKKwllbnRyeSBwb2ludCBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpcnN0IG9iamVjdC4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKKwk8ZXJpY0BhaWIuY29tPi4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKSk6IFNpbWlsYXIgY2hhbmdlIGlmIHRoZQorCWZpcnN0IG9iamVjdCBpcyBub3QgYW4gYS5vdXQgb2JqZWN0LgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBjb21wdXRlCisJcmVsb2NhdGlvbiBpbiBjYXNlcyB3aGVyZSB3ZSB3b24ndCB1c2UgaXQuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKK1RodSBEZWMgIDggMTQ6MTk6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogcGM1MzItbWFjaC5jIChOQU1FKTogRGVmaW5lIHRvIHVzZSBuczMya2FvdXQgcHJlZml4LgorCSogbnMzMmtuZXRic2QuYyAoTkFNRSk6IERpdHRvLgorCShuczMya2FvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUgdG8gc3RhbmRhcmQgYW91dC0zMgorCXZlcnNpb24uCisKK0ZyaSBEZWMgIDIgMTM6NTY6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KKworCSogY29mZi1taXBzLmMgKG1pcHNfcmVhZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0CisJb2YgbWlwc19yZWxheF9zZWN0aW9uLgorCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBDYWxsIG1pcHNfcmVhZF9yZWxvY3MuCisJKGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCisJKiBiZmQtaW4uaCAoYmZkX21uaXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitXZWQgTm92IDMwIDE0OjEyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1zaC5jOiBVc2UgX2JmZF9kdW1teV90YXJnZXQgaW5zdGVhZCBvZiBub19hcmNoaXZlLgorCitUdWUgTm92IDI5IDE0OjAwOjE5IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0AucnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBVc2UgaTM4Ni1ic2QgYXMgYmZkX25hbWUuCisJKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1mcmVlYnNkKik6IFVzZSBpMzg2YnNkIGFzIG15X2hvc3QuCisKK01vbiBOb3YgMjggMTU6MzY6MDQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay1uYnNkLm10IChERUZBVUxUX1ZFQ1RPUik6IHNldCB0byBtNjhrbmV0YnNkX3ZlYy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGFuY2llcy4KKwkgIChDRklMRVMpOiBBZGRlZCBtNjhrbmV0YnNkLmMuCisJICAoSEZJTEVTKTogQWRkZWQgbmV0YnNkLmguCisKK1dlZCBOb3YgMjMgMTk6MjE6NDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZi1zaC5jIChzaGxjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgorCShub19hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgorCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssIGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlCisJbGl0dGxlIGVuZGlhbiBTSC4KKwkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHNobC4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hsY29mZl92ZWMuCisJKiBjb25maWcvc2gtY29mZi5tdCAoU0VMRUNUX1ZFQ1MpOiBIYW5kbGUgc2hsX2NvZmZfdmVjLgorCitXZWQgTm92IDIzIDEwOjUwOjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IERvIG5vdCBzdWJ0cmFjdCB0aGUgc2VjdGlvbidzIHZtYSBmcm9tCisJdGhlIHJlbG9jJ3Mgb2Zmc2V0IHdoZW4gd3JpdGluZyAubydzLiAgSW5zdGVhZCBhZGQgdGhlIHNlY3Rpb24ncworCXZtYSB0byB0aGUgcmVsb2MncyBvZmZzZXQgd2hlbiB3cml0aW5nIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkCisJbGlicmFyeS4KKworVHVlIE5vdiAyMiAyMzozNDozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRG8gbm90IGFkZAorCWlucHV0X3NlY3Rpb24tPnZtYSB0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KKworTW9uIE5vdiAyMSAxMjozNzoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIHNyZWMuYyAoc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCisJKHNyZWNfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLgorCShzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KKwkoc3JlY192ZWMsIHN5bWJvbHNyZWNfdmVjKTogVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYykuCisKK1NhdCBOb3YgMTkgMDM6MTA6NTEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1zb2xhcmlzKik6ICBVc2Ugc29sYXJpczIgdG8KKwllbmFibGUgZXh0cmFjdGlvbiBvZiBwcm9jZnMgaW5mbyBmcm9tIGNvcmUgZmlsZSBmb3IgR0RCLgorCitUaHUgTm92IDE3IDE3OjM3OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgbmV3IHZhbHVlIEJGRF9SRUxPQ18xMl9QQ1JFTC4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCisKK1RodSBOb3YgMTcgMTM6MTI6MDggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGJmZC9lbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGVkKTogVXNlIHRoZQorCXZtYSBmcm9tIHRoZSBvdXRwdXRfc2VjdGlvbiBjb250YWluaW5nICRnbG9iYWwkIHdoZW4gY29tcHV0aW5nCisJZ2xvYmFsX3ZsYXVlLgorCitUaHUgTm92IDE3IDE0OjI5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSb3VuZCB1cCB0aGUgYXJjaGl2ZQorCWhlYWRlciBzaXplIG9mIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHRvIGFuIGV2ZW4gbnVtYmVyLgorCitXZWQgTm92IDE2IDE2OjA4OjA2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvZmYtc2guYzogRGVsZXRlZCBzb21lIGNvZGUgdGhhdCB3YXMgY29tbWVudGVkIG91dCBvciBpbnNpZGUKKwkiI2lmIDAiLgorCShDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgorCisJKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENvbnZlcnQgbmFtZSB0byBsb3dlcmNhc2UsIGZvcgorCWNvbnNpc3RlbmN5IHdpdGggb3RoZXIgYXJjaGl0ZWN0dXJlcy4KKworU2F0IE5vdiAxMiAyMzo1MDoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX2V4cG9ydF9zeW1ib2wpOiBBbHNvIGV4cG9ydCBzeW1ib2xzIHdoaWNoIGFyZQorCXJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIGZpbGUuCisKK0ZyaSBOb3YgMTEgMTQ6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkCisJZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQsIGFuZCBoYW5kbGUgaXQuCisJKGVsZl9leHBvcnRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgorCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKK0ZyaSBOb3YgMTEgMTA6MzU6MzMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfc3RydWN0KTogRGVsZXRlIGhhbmRsZXMgZm9yIHRoZQorCWRhdGEsIHJlZyBhbmQgc3RhY2sgc2VjdGlvbnMuICBUaGV5J3JlIG5ldmVyIHVzZWQuICBEZWxldGUKKwlhY2Nlc3NvciBtYWNyb3MuCisJKG1ha2VfYmZkX2FzZWN0aW9uKTogVXNlIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IHNpbmNlIGRlYnVnZ2luZworCWNvcmVzIGZyb20gZHluYW1pYyBleGVjdXRhYmxlcyBtYXkgaGF2ZSBzZXZlcmFsIHNlY3Rpb25zIHdpdGggdGhlCisJc2FtZSBsb2dpY2FsIG5hbWUuCisJKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IERvbid0IHNhdmUgaGFuZGxlcyB0byBkYXRhLCByZWcgYW5kCisJc3RhY2sgc2VjdGlvbnMuICBIYW5kbGUgQ09SRV9URVhULCBDT1JFX01NRiBhbmQgQ09SRV9TSE0uCisKK1R1ZSBOb3YgIDggMTM6MDM6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBib3V0LmMgKGNhbGxqX2NhbGxiYWNrKTogQWRkIG5ldyBhcmd1bWVudCBzaHJpbmtpbmcuICBDaGFuZ2UgYWxsCisJY2FsbGVycy4gIEhhbmRsZSByZWxvY3MgYWdhaW5zdCBzZWN0aW9uIHN5bWJvbHMgY29ycmVjdGx5LiAgSWYgbm90CisJc2hyaW5raW5nLCBkb24ndCBzdWJ0cmFjdCBvdXQgZHN0aWR4OyB0aGUgc3VidHJhY3Rpb24gaXMgYWxyZWFkeQorCWluIHRoZSBvYmplY3QgZmlsZS4KKworU3VuIE5vdiAgNiAxMjo1MjowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmg6IENvbmRpdGlvbmFsbHkgaW5jbHVkZSA8c2hsLmg+IGFuZCA8ZGwuaD4uCisKK1RodSBOb3YgIDMgMTg6MTk6MTMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEluY2x1ZGUgbTY4a25ldGJzZC5vLgorCisJKiBjb25maWcvaTM4NmxpbnV4Lm1oIChFWFRSQUxJQlMpOiBJbmNsdWRlIC1sbS4KKworCVBhdGNoZXMgZnJvbSBESiBEZWxvcmllOgorCSogY29mZi1nbzMyLmM6IFJlcGxhY2VtZW50IGZpbGUsIHVzZXMgY29mZi1pMzg2LmMgd2l0aCBtaW5vcgorCWNoYW5nZXMuCisJKiBjb2ZmLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBhbGxvdyBvdGhlciBmaWxlcyB0byBvdmVycmlkZQorCXVuZGVyc2NvcmUgYWxzbworCSogbWFrZWZpbGUuZG9zOiBkZWwgY3Rvci5vLCBhZGQgY29mZmxpbmsubyBhbmQgZWxmMzIubworCisJKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHVzZXIgc2V0IGRhdGEgc2VjdGlvbiB2bWEsIHVzZSBpdAorCXRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBic3Mgdm1hLiAgUGF0Y2ggZnJvbSBUYWthZGEgSGlyb2FraSwKKwloaXJvQGlzLnMudS10b2t5by5hYy5qcC4KKwkobWFjaGluZV90eXBlLCBjYXNlIGJmZF9hcmNoX3ZheCk6IFNldCAqdW5rbm93biB0byBmYWxzZS4gIFBhdGNoCisJZnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgorCisJKiBjb25maWd1cmUuaW4gKHRiKTogUmVuYW1lIG5zMzJrbmV0YnNkX3ZlYyB0byBwYzUzMm5ldGJzZF92ZWMsCisJc2luY2UgdGhhdCdzIHdoYXQgaXQncyBjYWxsZWQuCisKK1dlZCBOb3YgIDIgMTU6MjQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSk6IENoYW5nZSB0byB0YWtlIGEgQkZEIGFzIGFuIGFyZ3VtZW50LgorCUNoYW5nZSBWTVMgdmVyc2lvbiB0byB1c2UgYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYywgc28gdGhhdCB3ZQorCWRvbid0IGxvc2UgdGhlIG1lbW9yeSBmb3JldmVyLgorCShfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgdGhlIG5hbWUgb2YgYW4gYXJjaGl2ZQorCWVudHJ5IHdoaWNoIGlzIG5vdCBiZWluZyBleHRlbmRlZCwgYW5kIGNvcnJlY3QgaXQgaWYgaXQgaXMgd3JvbmcuCisJVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSB0aGUgYXJjaGl2ZSB3YXMgY29uc3RydWN0ZWQgYnkgYW5vdGhlcgorCXByb2dyYW0gd2hpY2ggcHV0IGFuIGVudHJ5IGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIHdoaWNoIHdlCisJZG9uJ3QgcGxhbiB0byBwdXQgaW4gb3Vyc2VsdmVzLiAgRnJvbSBqamNAamNsYXJrLmNvbSAoSmFtZXMKKwlDbGFyaykuCisJKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBub3JtYWxpemUuCisKK01vbiBPY3QgMzEgMTQ6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1ocHBhLmMgKEVMRjMyX1BBUklTQ19TWF9TSVpFKTogRGVmaW5lLgorCShFTEYzMl9QQVJJU0NfU1hfR0VULCBFTEYzMl9QQVJJU0NfU1hfUFVUKTogRGVmaW5lLgorCShzeW1leHRuX2VudHJ5KTogRG9uJ3QgZGVmaW5lLgorCShzeW1leHRfY2hhaW5fc2l6ZSk6IENoYW5nZSB0eXBlIHRvIGJmZF9zaXplX3R5cGUuCisJKHN5bWV4dG5fY29udGVudHMpOiBDaGFuZ2UgdHlwZSB0byBiZmRfYnl0ZSAqLgorCShlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQorCUVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQgb2Ygc2l6ZW9mIChzeW1leHRfZW50cnlTKS4KKwkoZWxmMzJfaHBwYV9zaXplX3N5bWV4dCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIHR5cGUgb2Ygc2l6ZXAgdG8KKwliZmRfc2l6ZV90eXBlICouCisJKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBDYXN0IHN5bWV4dG5fY29udGVudHMgYXNzaWdubWVudCB0bworCWJmZF9ieXRlICouICBVc2UgRUxGMzJfUEFSSVNDX1NYX1BVVCBpbnN0ZWFkIG9mIGRpcmVjdCBhc3NpZ25tZW50LgorCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBVc2UKKwlFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkIG9mIHNpemVvZiAoc3ltZXh0X2VudHJ5UykuICBVc2UKKwlFTEYzMl9QQVJJU0NfU1hfR0VUIGluc2V0YWQgb2YgZGlyZWN0IGFzc2lnbm1lbnQuCisJKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGNvbnRlbnRzLCBhbmQgaXRzCisJYXNzaWdubWVudCBjYXN0LCB0byBiZmRfYnl0ZSAqLiAgVXNlIEVMRjMyX1BBUklTQ19TWF9TSVpFIGluc3RlYWQKKwlvZiBzaXplb2YgKHN5bWV4dG5fZW50cnkpLiAgVXNlIHN5bWV4dF9lbnRyeVMgaW5zdGVhZCBvZgorCXN5bWV4dG5fZW50cnkuICBVc2UgRUxGMzJfUEFSSVNDX1NYX0dFVCBpbnN0ZWFkIG9mIGRpcmVjdAorCWFzc2lnbm1lbnQuCisKKwkqIGFyY2hpdmUuYyAoYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lKTogQWRkIHRoZSBhciBwYWRkaW5nCisJY2hhcmFjdGVyLCBpZiB0aGVyZSBpcyByb29tIGZvciBpdCwgZXZlbiBpZiB0aGUgbmFtZSBpcyB0aGUKKwltYXhpbXVtIGxlbmd0aC4KKworCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFNvcnQgdGhlIEVMRgorCWhlYWRlcnMgYnkgc2VjdGlvbiBhZGRyZXNzIHdoZW4gYXNzaWduaW5nIGZpbGUgcG9zaXRpb25zLgorCShlbGZfc29ydF9oZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworU3VuIE9jdCAzMCAxODo1Njo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDcmVhdGUgRFRfSU5JVAorCWFuZCBEVF9GSU5JIGR5bmFtaWMgZW50cmllcyBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIF9pbml0IGFuZAorCV9maW5pIHN5bWJvbHMsIG5vdCBvbiB0aGUgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zLiAgVGhpcyBpcworCWNvbXBhdGlibGUgd2l0aCBzb21lIFNWUjQgbGlua2Vycy4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCisKK1NhdCBPY3QgMjkgMTI6MTg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1vdmUgYQorCXN5bWJvbCB3aXRoIGEgUExUIGVudHJ5IGludG8gdGhlIC5wbHQgc2VjdGlvbiBpZiBpdCBpcyBkZWZpbmVkIGluCisJYSByZWd1bGFyIGZpbGUuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKworCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJdCdzIG5vdCBhbgorCWVycm9yIGlmIGFuIGVtcHR5IGFyY2hpdmUgaGFzIG5vIHN5bWJvbCB0YWJsZS4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgorCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCisKK0ZyaSBPY3QgMjggMTA6MDg6NDEgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQorCisgICAgICAgIE5ldEJTRC9tNjhrIHN1cHBvcnQsIGJhc2VkIG9uIHdvcmsgYnkgbWlrZWJAc25vdy5kYXRhbWV0cmljcy5jb206IAorCSogY29uZmlnLmJmZCAobTY4Ki0qLW5ldGJzZCopOiBVc2UgbTY4ay1uYnNkIGFzIGJmZF9uYW1lLgorCSogY29uZmlndXJlLmluIChtNjhrbmV0YnNkX3ZlYyk6IEFkZGVkLgorCSogdGFyZ2V0cy5jIChiZmRfbTY4a25ldGJzZF92ZWMpOiBBZGRlZC4KKwkqIGhvc3RzL202OGtuYnNkLmgsIGNvbmZpZy9tNjhrLW5ic2QubXQsIG02OGtuZXRic2QuYzogTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTLCBDRklMRVMpOiBBZGQgbTY4a25ldGJzZC5jLgorCisJbWlzY2VsbGFuZW91cyBjbGVhbnVwIHJlcXVpcmVkIGJ5IGFsbCBuZXRic2QgdGFyZ2V0cywgYmFzZWQgb24gd29yayAKKwlieSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PjoKKwkqIG5ldGJzZC5oIChOX01BR0lDLCBOX1NFVF9NQUdJQywgTl9HRVRNQUdJQywgTl9HRVRNQUdJQzIsIE5fVFhUQUREUiwKKwkgIE5fVFhUT0ZGLCBOX0FMSUdOLCBOX0RBVEFERFIsIE5fREFUT0ZGKTogUmVtb3ZlZC4gIEdlbmVyaWMgYS5vdXQKKwkgIGRlZmluaXRpb25zIHdvcmsuCisJKiBpMzg2bmJzZC5jLCBuczMya25ic2QuYywgc3BhcmNuYnNkLmMgKF9fTERQR1NaKTogUmVtb3ZlZC4KKwkgIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIE5ldEJTRCdzIG1hZ2ljIG51bWJlcnMKKworVGh1IE9jdCAyNyAxNjo1OTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGxpYmVsZi5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgZmllbGQgZHluaW5keC4KKwkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBEb24ndCBmaW5hbGl6ZQorCXRoZSAuZHluc3ltLCAuZHluc3RyIG9yIC5oYXNoIHNlY3Rpb25zIHVudGlsIGFmdGVyIHRoZSBiYWNrZW5kCisJc2l6ZV9keW5hbWljX3NlY3Rpb25zIHJvdXRpbmUsIHNvIHRoYXQgaXQgY2FuIGFkZCBkeW5hbWljIHN5bWJvbHMKKwlpZiBpdCB3YW50cyB0by4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIHRoZQorCXN5bWJvbCB0byBiZSBpbiB0aGUgLnBsdCBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5CisJaWYgaXQgaXMgYSBkZWZpbmVkIHN5bWJvbC4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQKKwlsaWJyYXJ5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkeW5hbWljIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQKKwlzZWN0aW9uLCBzdG9yaW5nIHRoZSBpbmRleCBpbiB0aGUgZHluaW5keCBmaWVsZCBvZiB0aGUgRUxGIHNlY3Rpb24KKwlkYXRhLiAgQWRqdXN0IHRoZSBvdGhlciBkeW5pbmR4IGZpZWxkcyB0byBhY2NvdW50IGZvciB0aGlzLgorCShlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGNvcHlpbmcgYSByZWxvYyBpbnRvIGEgc2hhcmVkCisJbGlicmFyeSwgdXNlIHRoZSBvcmlnaW5hbCBhZGRlbmQgYXMgYXBwcm9wcmlhdGUuICBDb252ZXJ0IGFuCisJUl9TUEFSQ18zMiByZWxvYyBpbnRvIGFuIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MuICBVc2UgdGhlIGR5bmFtaWMKKwlzeW1ib2wgaW5kZXggb2YgdGhlIG91dHB1dCBzZWN0aW9uLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgaW5kZXguCisJKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZGllIGlmIGEgc2VjdGlvbiBkb2VzCisJbm90IGV4aXN0IHdoZW4gc2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGR5bmFtaWMgdGFncy4gIFdyaXRlIG91dAorCWEgZHluYW1pYyBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCisKK1dlZCBPY3QgMjYgMDE6MTU6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IERvbid0IGJvdGhlciB0byByZWFkIG9yIHdyaXRlCisJdGhlIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55LgorCitUdWUgT2N0IDI1IDExOjQ0OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0ZWtoZXguby4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBJZiBTRUxFQ1RfVkVDUyBpcyBub3QgZGVmaW5lZCwKKwlpbmNsdWRlIHRla2hleF92ZWMuCisJKiB0ZWtoZXguYyAoTklCQkxFLCBJU0hFWCk6IENhc3QgYXJyYXkgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGNoYXIuCisJKGdldHZhbHVlLCBnZXRzeW0sIG91dCk6IExpa2V3aXNlLgorCShmaW5kX2NodW5rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzLgorCShmaXJzdF9waGFzZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcy4KKwkocGFzc19vdmVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhZGRyZXNzLgorCSh0ZWtoZXhfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNlY3Rpb24uCisJKG1vdmVfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSByZXR1cm4gdHlwZSBmcm9tIGJvb2xlYW4gdG8gdm9pZC4KKwkodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHRkYXRhIGFuZAorCWxpc3QuCisKKwkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIENJTkQuCisJKGxpbmtfYWN0aW9uKTogQ2hhbmdlIENPTU1PTl9ST1dcaW5kciBmcm9tIE1ERUYgdG8gQ1JFRi4gIENoYW5nZQorCUlORFJfUk9XXGNvbW1vbiBmcm9tIE1ERUYgdG8gQ0lORC4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJbiBDUkVGIGNhc2UsIGhhbmRsZSBhbgorCWV4aXN0aW5nIHN5bWJvbCB3aGljaCBpcyBpbmRpcmVjdCByYXRoZXIgdGhhbiBkZWZpbmVkLiAgQWRkIG5ldworCUNJTkQgY2FzZS4KKworTW9uIE9jdCAyNCAxNTozMzoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwlDaGFuZ2UgUy1yZWNvcmQgYmFja2VuZCB0byB1c2UgbXVsdGlwbGUgc2VjdGlvbnMgdG8gaGFuZGxlIGdhcHMgaW4KKwlmaWxlLgorCSogc3JlYy5jIChzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QpOiBNb3ZlIGZpZWxkIG5leHQgZnJvbSBsYXN0IHBsYWNlCisJdG8gZmlyc3QuICBDaGFuZ2UgdHlwZSBvZiBkYXRhIHRvIGJmZF9ieXRlICouCisJKHN0cnVjdCBzcmVjX3N5bWJvbCk6IERlZmluZS4KKwkodGRhdGFfdHlwZSk6IFJlbW92ZSBkb25lX3N5bWJvbF9yZWFkLCBjb3VudCwgc3RyaW5ncywgc3ltYm9sX2lkeCwKKwlzdHJpbmdfc2l6ZSwgc3RyaW5nX2lkeC4gIENoYW5nZSB0eXBlIG9mIHN5bWJvbHMgdG8gc3RydWN0CisJc3JlY19zeW1ib2wgKi4gIEFkZCBzeW10YWlsIGFuZCBjc3ltYm9scy4KKwkobG93LCBoaWdoKTogUmVtb3ZlLgorCShzaXplX3N5bWJvbHMsIGZpbGx1cF9zeW1ib2xzLCBzaXplX3NyZWMsIGZpbGx1cCk6IFJlbW92ZS4KKwkod2hpdGUsIHNraXB3aGl0ZSwgcGFzc19vdmVyLCBvYmplY3RfcCk6IFJlbW92ZS4KKwkoc3JlY19ta29iamVjdCk6IENhbGwgc3JlY19pbml0LiAgQWRqdXN0IHRkYXRhIGluaXRpYWxpemF0aW9uIGZvcgorCWZpZWxkIGNoYW5nZXMuCisJKHNyZWNfZ2V0X2J5dGUsIHNyZWNfYmFkX2J5dGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKwkoc3JlY19uZXdfc3ltYm9sLCBzcmVjX3NjYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKwkoc3JlY19vYmplY3RfcCk6IENoYW5nZSB0eXBlIG9mIGIgdG8gYmZkX2J5dGUuICBFeHBsaWNpdGx5IHNldAorCXdyb25nX2Zvcm1hdCBlcnJvci4gIENhbGwgc3JlY19ta29iamVjdCBhbmQgc3JlY19zY2FuIGluc3RlYWQgb2YKKwlvYmplY3RfcC4KKwkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLiAgQWxzbywgY2hhbmdlIGIgdG8gYmUgb25seSB0d28KKwlieXRlcy4KKwkoc3JlY19yZWFkX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBzcmVjX3JlYWRfc2VjdGlvbiByYXRoZXIgdGhhbgorCXBhc3Nfb3Zlci4gIEhhbmRsZSB6ZXJvIGxlbmd0aCBzZWN0aW9uIGNvcnJlY3RseS4KKwkoc2V0X3NldF9hcmNoX21hY2gpOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byBtYWNyby4KKwkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBkYXRhIHRvIGJmZF9ieXRlICouCisJKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIGRhdGEsIGVuZCBhbmQgc3JjIHRvIGJmZF9ieXRlICouCisJKHNyZWNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIGJ1ZmZlciBhbmQgZHN0IHRvIGJmZF9ieXRlICouCisJKHNyZWNfd3JpdGVfc2VjdGlvbik6IENoYW5nZSBsb2NhdGlvbiB0byBiZmRfYnl0ZSAqLgorCShzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBDaGFuZ2UgYnVmZmVyIHRvIGJmZF9ieXRlICouCisJKHNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERvbid0IGNhbGwKKwlzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzLgorCShzcmVjX2dldF9zeW10YWIpOiBSZXdyaXRlLgorCisJKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBTZXQgdWRhdGEuaSB0byAwLCBub3QgTlVMTC4KKworRnJpIE9jdCAyMSAxNjo0MzoxMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGxpYmFvdXQuaCAobWFjaGluZV90eXBlKTogYWRkZWQgTV82OEtfTkVUQlNEIGFuZCBNX1NQQVJDX05FVEJTRC4KKwkqIGkzODZuZXRic2QuYywgbnMzMmtuZXRic2QuYywgc3BhcmNuZXRic2QuYzogcmVtb3ZlZCBSQ1MgSWQncy4KKwkgIGNoYW5nZWQgaG93IFBBR0VfU0laRSBhbmQgU0VHTUVOVF9TSVpFIGFyZSBkZWZpbmVkIHNvIHRoZXkgYXJlCisJICBjb25zaXN0YW50IHdpdGggZWFjaCBvdGhlci4KKwkqIG5ldGJzZC5oIChOX0hFQURFUl9JTl9URVhULCBURVhUX1NUQVJUX0FERFIpOiBOZXRCU0QgZml0cyBpdHMKKwkgIGhlYWRlciBpbnRvIHRoZSBzdGFydCBvZiBpdHMgdGV4dCBzZWdtZW50LgorCitGcmkgT2N0IDIxIDE3OjEzOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIGNhc2UgZm9yCisJX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLgorCShiZmRfdGFyZ2V0KTogQWRkIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuCisJKiBhcmNoaXZlLmMgKF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcKKwlmdW5jdGlvbi4KKwkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBOZXcgZnVuY3Rpb24uCisJKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW5hbWVkIGJ5IGFkZGluZyBhIGxlYWRpbmcKKwl1bmRlcnNjb3JlLCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuICBBZGRlZCB0cmFpbGluZ19zbGFzaAorCWFyZ3VtZW50LCBhbmQgdXNlZCBpdCBpbnN0ZWFkIG9mIGVsZl9zdHlsZS4gIENoYW5nZWQgdHlwZSBvZgorCXRhYmxlbiB0byBiZmRfc2l6ZV90eXBlICouCisJKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IFVzZSBCRkRfU0VORCB0byBjYWxsCisJY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUuICBVc2UgdGhlIHJldHVybmVkIG5hbWUuCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCisJKF9iZmRfbm9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgorCShfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KKwkoX2JmZF9hcmNoaXZlX2NvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBzb20uYyAoc29tX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgorCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6CisJRGVmaW5lLgorCSogaWVlZS5jIChpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgorCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KKwkqIG9hc3lzLmMgKG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgorCisJRml4IHRoZSBFTEYgbGlua2VyIHRvIG5vdCByZXF1aXJlIGFuIGludGVycHJldGVyIGlmIG5vIGR5bmFtaWMKKwlvYmplY3RzIHdlcmUgc2VlbiwgZXZlbiB3aGVuIGxpbmtpbmcgUElDIGNvZGUuCisJKiBsaWJlbGYuaCAoRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpOiBEZWZpbmUuCisJKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZC4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGR5bnN0ciBpZiBpdAorCWRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKwkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KKwlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgZmllbGQsIG5vdCBkeW5vYmogZmllbGQuICBEb24ndCBib3RoZXIgdG8KKwlzZXQgZHlub2JqLgorCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGR5bmFtaWMgc2VjdGlvbnMgd2VyZQorCWFscmVhZHkgY3JlYXRlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICBJZiBkeW5vYmogaXMgYWxyZWFkeSBzZXQsIHVzZQorCWl0OyBvdGhlcndpc2UsIHNldCBpdCB0byB0aGUgYmZkIGFyZ3VtZW50LiAgRG9uJ3QgaW5pdGlhbGl6ZQorCWR5bnN5bWNvdW50LiAgT25seSBjcmVhdGUgZHluc3RyIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgU2V0CisJZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHRvIHRydWUuCisJKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogU2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24KKwlpZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLgorCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzIHRoZQorCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcgc2V0LCBsZXQgdGhlIGJhY2tlbmQgYWRqdXN0IGl0LgorCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGFuZ2UgbW9zdCBkZWNpc2lvbnMgYmFzZWQgb24gZHlub2JqIHRvCisJY2hlY2sgZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGluc3RlYWQuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBPbmx5IGhhbmRsZSBkeW5hbWljIHN5bWJvbHMgaWYgYSBkeW5hbWljCisJb2JqZWN0IHdhcyBzZWVuLgorCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBuZXcgZmllbGQKKwlkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuICBTZXQgZHluc3ltY291bnQgdG8gMSwgbm90IDAuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbAorCWVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiByYXRoZXIgdGhhbiBjcmVhdGluZyB0aGUgLmdvdCBhbmQKKwkuZ290LnBsdCBzZWN0aW9ucy4KKwkoZWxmX2kzODZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjYWxsIGVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgorCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgorCU9ubHkgY3JlYXRlIHRoZSAucmVsLmdvdCBzZWN0aW9uLCBhbmQgb25seSBtYWtlIHNwYWNlIGZvciBhIHJlbG9jLAorCWZvciBhIGdsb2JhbCBzeW1ib2wgb3Igd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gIEZvciBhCisJUl8zODZfUExUMzIgcmVsb2MsIGp1c3Qgc2V0IHRoZQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnLgorCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBSZXdvcmsgaW5pdGlhbCBhc3NlcnRpb24gdG8KKwlwZXJtaXQgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCisJcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8KKwlkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuCisJKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlIHNlZW4sCisJc2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24sIGFuZCBmb3JjZSB0aGUgc2l6ZSBvZiB0aGUgLnJlbC5nb3QKKwlzZWN0aW9uIHRvIHplcm8uCisJKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBGb3IgYSBSXzM4Nl9HT1QzMiByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsCisJc3ltYm9sIHdoZW4gbm8gZHluYW1pYyBvYmplY3Qgd2FzIHNlZW4sIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCisJdGhlIC5nb3Qgc2VjdGlvbi4gIEZvciBhIFJfMzg2X0dPVDMyIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKKwljcmVhdGUgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgorCVRyZWF0IGEgUl8zODZfUExUMzIgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBmb3Igd2hpY2ggd2UgZGlkIG5vdAorCWNyZWF0ZSBhIFBMVCBlbnRyeSBhcyBhIFJfMzg2X1BDMzIgcmVsb2MuCisJKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBmaWRkbGUgd2l0aCB0aGUgZHluYW1pYworCWVudHJpZXMgYW5kIHRoZSBQTFQgaWYgd2Ugc2F3IGEgZHluYW1pYyBvYmplY3QuCisJKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBGaXggUl9TUEFSQ19QQzIyIGJ5CisJc2V0dGluZyByaWdodHNoaWZ0IHRvIDEwLiAgRml4IFJfU1BBUkNfV1BMVDIwIGJ5IHNldHRpbmcKKwlyaWdodHNoaWZ0IHRvIDIsIHNpemUgdG8gMiwgYml0c2l6ZSB0byAzMCwgYW5kIGRzdF9tYXNrIHRvCisJMHgzZmZmZmZmZi4KKwkoZWxmMzJfc3BhcmNfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgdGhlIHNpemUgb2YgdGhlCisJLnBsdCBzZWN0aW9uLiAgQ2FsbCBlbGYzMl9zcGFyY19jcmVhdGVfZ290X3NlY3Rpb24gcmF0aGVyIHRoYW4KKwljcmVhdGluZyB0aGUgLmdvdCBzZWN0aW9uLgorCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBDYWxsIGVsZjMyX3NwYXJjX2NyZWF0ZV9nb3Rfc2VjdGlvbiBpZgorCWEgR09UIHRhYmxlIGlzIG5lZWRlZCwgbm90IGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgorCU9ubHkgY3JlYXRlIHRoZSAucmVsYS5nb3Qgc2VjdGlvbiwgYW5kIG9ubHkgbWFrZSBzcGFjZSBmb3IgYQorCXJlbG9jLCBmb3IgYSBnbG9iYWwgc3ltYm9sIG9yIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCisJU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIC5yZWxhLmdvdCBzZWN0aW9uIHRvIDIuICBGb3IgYQorCVJfU1BBUkNfV1BMVDMwIHJlbG9jLCBqdXN0IHNldCB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZy4KKwkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV3b3JrIGluaXRpYWwgYXNzZXJ0aW9uIHRvCisJcGVybWl0IEVMRl9MSU5LX0hBU0hfTkVEU19QTFQgbm9uIGR5bmFtaWMgc3ltYm9scy4gIENyZWF0ZSBhCisJcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZm9yIHN1Y2ggc3ltYm9scy4gIEJ1dCwgaWYgbm8gZHluYW1pYworCW9iamVjdHMgd2VyZSBzZWVuLCBuZXZlciBjcmVhdGUgYSBQTFQgZW50cnkuICBJbml0aWFsaXplIHRoZSBzaXplCisJb2YgdGhlIC5wbHQgc2VjdGlvbi4KKwkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUKKwlzZWVuLCBza2lwIG1vc3Qgb2YgdGhpcyBmdW5jdGlvbiwgYW5kIGZvcmNlIHRoZSBzaXplIG9mIHRoZQorCS5yZWxhLmdvdCBzZWN0aW9uIHRvIHplcm8uICBTdHJpcCBlbXB0eSByZWxvYyBzZWN0aW9ucywgYW5kIHN0cmlwCisJYW4gZW1wdHkgLnBsdCBzZWN0aW9uLgorCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwKKwlzeW1ib2wgd2hlbiBubyBkeW5hbWljIG9iamVjdCB3YXMgc2VlbiwgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKKwl0aGUgLmdvdCBzZWN0aW9uLiAgRm9yIGEgR09UIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIG9ubHkKKwljcmVhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuCisJVHJlYXQgYSBSX1NQQVJDX1dQTFQzMCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGZvciB3aGljaCB3ZSBkaWQgbm90CisJY3JlYXRlIGEgUExUIGVudHJ5IGFzIGEgUl9TUEFSQ19XRElTUDMwIHJlbG9jLgorCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgZmlkZGxlIHdpdGggdGhlCisJZHluYW1pYyBlbnRyaWVzIGFuZCB0aGUgUExUIGlmIHdlIHNhdyBhIGR5bmFtaWMgb2JqZWN0LgorCitUaHUgT2N0IDIwIDEzOjI4OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCB3b3JyeSBhYm91dCBzZWN0aW9uIHN5bWJvbHMKKwlpbiBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCisJKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBTZXBhcmF0ZSBvdXQgbG9vcCB3aGljaCBjYWxscworCWJhY2tlbmQgcm91dGluZS4gIENoZWNrIGJmZF9zZWN0aW9uIGFuZCBjYWxsIHRoZSBiYWNrZW5kIHJvdXRpbmUKKwlldmVuIGZvciBhIHNlY3Rpb24gbm90IG93bmVkIGJ5IGFueSBCRkQuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZQorCS5hY29tbW9uIHNlY3Rpb24uCisKK1dlZCBPY3QgMTkgMTM6Mjg6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBNYWtlIG5hbWVzIGZvciBzZWN0aW9uIG51bWJlciBhbmQKKwlzdG9yYWdlIGNsYXNzIHNsaWdodGx5IG1vcmUgdmVyYm9zZS4gIEl0J3Mgbm90IGNsZWFyIGhvdyBtYW55CisJY2hhcmFjdGVycyBJIGNhbiBqdXN0aWZ5IHVzaW5nIHVwLCBidXQgYmVmb3JlIHRoaXMgY2hhbmdlIHRoZXkKKwlib3RoIHdlcmUgYWJicmV2aWF0ZWQgInNjIiB3aGljaCBpcyAoSU1ITykgY2xlYXJseSB1bmFjY2VwdGFibGUuCisKK1dlZCBPY3QgMTkgMDE6MjY6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IHRoZSBiYXNlIGZpbGUKKwlwb3NpdGlvbiBmcm9tIHRoZSBsb3dlc3Qgc2VjdGlvbiBWTUEsIG5vdCB0aGUgc3RhcnQgYWRkcmVzcy4KKworCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCByZXR1cm4gYW4gZXJyb3IKKwlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KKwkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBMaWtld2lzZS4KKwkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogTGlrZXdpc2UuCisKK1R1ZSBPY3QgMTggMTI6NTY6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE9ubHkgY29weQorCXN1YmZvcm1hdCB0byBhbm90aGVyIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyIGZpbGUuCisKKwkqIGJpbmFyeS5jOiBOZXcgZmlsZSBmb3IgcmF3IGJpbmFyeSBvdXRwdXQgZm9ybWF0LgorCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkIGJpbmFyeS5vLgorCShDRklMRVMpOiBBZGQgYmluYXJ5LmMuCisJKiB0YXJnZXRzLmMgKGJpbmFyeV92ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmluYXJ5X3ZlYy4KKworCSogc3JlYy5jICh0ZGF0YV90eXBlKTogQWRkIGZpZWxkIHRhaWwuCisJKHNyZWNfbWtvYmplY3QpOiBJbml0aWFsaXplIHRhaWwuCisJKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTb3J0IFMgcmVjb3JkIGxpc3QgYnkgYWRkcmVzcy4KKworTW9uIE9jdCAxNyAxMTozODoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogU29ydCB0aGUgc3ltYm9scyBpbnRvIGEgbmV3IGFycmF5LAorCXJhdGhlciB0aGFuIG1lc3Npbmcgd2l0aCBFbGZfU3ltX0V4dHJhLiAgU3RvcmUgdGhlIHN5bWJvbCBpbmRleCBpbgorCXRoZSB1ZGF0YS5pIGZpZWxkLgorCShzd2FwX291dF9zeW1zKTogVXNlIG91dGJvdW5kX3N5bXMgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGFzIGFuCisJYXJyYXkuICBEb24ndCB3b3JyeSBhYm91dCBlbGZfc3ltX251bS4KKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX3N5bV9leHRyYSk6IERvbid0IGRlZmluZS4KKwkoRWxmX1N5bV9FeHRyYSk6IERvbid0IGRlZmluZS4KKwkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW1vdmUgc3ltX2V4dHJhIGZpZWxkLgorCShlbGZfc3ltX2V4dHJhKTogRG9uJ3QgZGVmaW5lLgorCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZQorCXVkYXRhLmkgcmF0aGVyIHRoYW4gZWxmX3N5bV9leHRyYSBhcnJheS4KKworCSogc3ltcy5jIChhc3ltYm9sKTogQ2hhbmdlIHVkYXRhIGZpZWxkIGludG8gYSB1bmlvbi4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFVzZSB1ZGF0YS5wIHJhdGhlcgorCXRoYW4ganVzdCB1ZGF0YS4KKwkqIGJvdXQuYyAocGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCisJKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IExpa2V3aXNlLgorCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogTGlrZXdpc2UuCisJKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IExpa2V3aXNlLgorCSogb2FzeXMuYyAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCisJKiByZWxvYzE2LmMgKGJmZF9wZXJmb3JtX3NsaXApOiBMaWtld2lzZS4KKwkqIHNyZWMuYyAoZmlsbHVwX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkqIGNvZmZjb2RlLmggKGdldF9pbmRleCk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuIGp1c3QgdWRhdGEuCisJKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCisJKiBjb2ZmZ2VuLmMgKHNldF9pbmRleCk6IExpa2V3aXNlLgorCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTGlrZXdpc2UuCisJKiBlbGZjb2RlLmggKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogTGlrZXdpc2UuCisJKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc3ltX2luZGV4LCBlY29mZl9zZXRfc3ltX2luZGV4KTogTGlrZXdpc2UuCisJKiBzb20uYyAoY29tcGFyZV9zeW1zKTogTGlrZXdpc2UuCisJKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBMaWtld2lzZS4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IExpa2V3aXNlLgorCisJVXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IEVMRiBzeW1ib2wgbmFtZXMuCisJKiBlbGZjb2RlLmggKGVsZl9zdHJpbmd0YWJfaW5pdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGJmZF9uZXdfc3RydGFiLCBiZmRfYWRkX3RvX3N0cnRhYiwgYmZkX2FkZF8yX3RvX3N0cnRhYik6IFJlbW92ZS4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIGVsZl9zdHJpbmd0YWJfaW5pdCBvcgorCV9iZmRfc3RyaW5ndGFiX2FkZCwgYW5kIGdldCBzdHJpbmd0YWIgbGVuZ3RocyB1c2luZworCV9iZmRfc3RyaW5ndGFiX3NpemUuCisJKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hhbmdlIGlnbm9yZWQgYXJndW1lbnQgdG8gcG9pbnRlciB0bworCWJvb2xlYW4sIGFuZCBzZXQgdGhlIGJvb2xlYW4gdG8gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnMuICBJZiBhbgorCWVycm9yIGhhcyBhbHJlYWR5IG9jY3VycmVkLCBkb24ndCBkbyBhbnl0aGluZy4KKwkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IEp1c3Qgc2V0IHNoX3NpemUsIG5vdCBjb250ZW50cy4KKwkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFBhc3MgdGhlIGFkZHJlc3Mgb2YgYQorCWJvb2xlYW4gdG8gZWxmX2Zha2Vfc2VjdGlvbnMuICBQYXNzIHRoZSBhZGRyZXNzIG9mIGEKKwliZmRfc3RydGFiX2hhc2ggdG8gc3dhcF9vdXRfc3ltcy4gIFdyaXRlIG91dCB0aGUgLnN0cnRhYiBzZWN0aW9uLgorCShwcmVwX2hlYWRlcnMpOiBDaGFuZ2Ugc2hzdHJ0YWIgdG8gYmZkX3N0cnRhYl9oYXNoLgorCShzd2FwX291dF9zeW1zKTogVGFrZSBhIHBvaW50ZXIgdG8gYSBiZmRfc3RydGFiX2hhc2ggYXMgYW4KKwlhcmd1bWVudC4gIFNldCBpdCB0byB0aGUgc3ltYm9sIG5hbWVzLgorCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc2VjdGlvbgorCWhlYWRlciBuYW1lcyB1c2luZyBfYmZkX3N0cmluZ3RhYl9lbWl0LgorCShlbGZfZGVidWdfc2VjdGlvbik6IFJlbW92ZSBmaXJzdCBhcmd1bWVudDsgZ2V0IHRoZSBzZWN0aW9uIG5hbWUKKwl2aWEgdGhlIGJmZF9zZWN0aW9uIHBvaW50ZXIuICBDaGFuZ2UgY2FsbGVyLgorCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBuYW1lcyB1c2luZworCV9iZmRfc3RyaW5ndGFiX2VtaXQuICBMaWtld2lzZSBmb3IgdGhlIC5keW5zdHIgc2VjdGlvbiBjb250ZW50cy4KKwlGcmVlIHRoZSBzeW1ib2wgbmFtZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisJKGVsZl9saW5rX2lucHV0X2JmZCk6IFJlbW92ZSB0aGUgbGFzdCBhcmd1bWVudCwgb3V0cHV0X25hbWVzLAorCWZyb20gcmVsb2NhdGVfc2VjdGlvbi4gIFNhdmUgdGhlIG9sZCBzeW1ib2wgY29udGVudHMgYmVmb3JlCisJY2FsbGluZyBlbGZfbGlua19vdXRwdXRfc3ltLCBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyd2FyZC4KKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IENoYW5nZSBkeW5zdHIgZmllbGQgdG8KKwlzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoLgorCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBsYXN0IGFyZ3VtZW50LCBvdXRwdXRfbmFtZXMsCisJZnJvbSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgorCShzdHJ1Y3Qgc3RydGFiKTogRG9uJ3QgZGVmaW5lLgorCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IENoYW5nZSBzdHJ0YWJfcHRyIGZpZWxkIHRvIHN0cnVjdAorCWJmZF9zdHJ0YWJfaGFzaC4KKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIGxhc3QKKwlhcmd1bWVudCwgb3V0cHV0X25hbWVzLgorCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKworCSogbGliYmZkLWluLmggKERFRkFVTFRfU1RSSU5HX1NQQUNFX1NJWkUpOiBEb24ndCBkZWZpbmUuCisJKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogRG9uJ3QgZGVjbGFyZS4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogbGliYmZkLmMgKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogUmVtb3ZlLgorCisJKiBlbGZjb2RlLmggKGVsZl9zd2FwX3NoZHJfaW4pOiBVc2UgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLgorCUNsZWFyIGNvbnRlbnRzIGZpZWxkLgorCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJbiBTSFRfU1RSVEFCIGNhc2UsIGNoZWNrIGJmZF9zZWN0aW9uLAorCW5vdCByYXdkYXRhLiAgRG9uJ3Qgc2V0IHJhd2RhdGEgaWYgZV9zaHN0cm5keC4gIFVzZSBiZmRfc2VjdGlvbgorCXJhdGhlciB0aGFuIHJhd2RhdGEgaW4gY29tbWVudGVkIG91dCBjb2RlLiAgSW4gU0hUX1JFTFtBXSBjYXNlLAorCWRvbid0IGJvdGhlciB0byBjaGVjayBlbGZfc2VjdGlvbl9kYXRhIG9mIHNlY3Rpb24gcmV0dXJuZWQgYnkKKwlzZWN0aW9uX2Zyb21fZWxmX2luZGV4LgorCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuICBEb24ndCBzZXQKKwlzaXplLgorCShlbGZfbWFwX3N5bWJvbHMpOiBEb24ndCBzZXQgZWxmX251bV9zZWN0aW9uX3N5bXMuICBEb24ndCBjcmVhdGUKKwlzZWN0aW9uIHN5bWJvbHMgdGhhdCBhbHJlYWR5IGV4aXN0LgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IFVzZSBiZmRfc2VjdGlvbiwgbm90IHJhd2RhdGEuCisJKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBKdXN0IGNoZWNrIGJmZF9zZWN0aW9uIGZpZWxkLgorCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGVsZl9kZWJ1Z19zZWN0aW9uKTogRG9uJ3QgcHJpbnQgcmF3ZGF0YSwgY29udGVudHMsIG9yIHNpemUuCisJKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGVycm9yIG91dCBpZgorCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggcmV0dXJucyBOVUxMLgorCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBDaGVjayByZXR1cm4gdmFsdWUgZnJvbQorCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYWdhaW5zdCBOVUxMLCBub3QgYmZkX2lzX2Fic19zZWN0aW9uLgorCShlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGVjayBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybgorCXZhbHVlLgorCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIG51bV9zZWN0aW9uX3N5bXMgZmllbGQuCisJKGVsZl9udW1fc2VjdGlvbl9zeW1zKTogRG9uJ3QgZGVmaW5lLgorCSogZWxmLmMgKGVsZl9nZXRfc3RyX3NlY3Rpb24pOiBTdG9yZSBzZWN0aW9uIGNvbnRlbnRzIGluIGNvbnRlbnRzCisJZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KKwkoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uKTogTGlrZXdpc2UuCisJKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdG9yZSBCRkQgc2VjdGlvbiBwb2ludGVyIGluCisJYmZkX3NlY3Rpb24gZmllbGQgcmF0aGVyIHRoYW4gcmF3ZGF0YSBmaWVsZC4KKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogVXNlIGJmZF9zZWN0aW9uCisJcmF0aGVyIHRoYW4gcmF3ZGF0YS4KKwkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTGlrZXdpc2UuCisJKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERvbid0IHNldAorCXN5bWV4dG5faGRyLT5zaXplOyBqdXN0IHVzZSBzaF9zaXplLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogVXNlIGJmZF9zZWN0aW9uCisJcmF0aGVybiB0aGFuIHJhd2RhdGEuCisJKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTGlrZXdpc2UuCisJKG1pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IExpa2V3aXNlLgorCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBSZW1vdmUgcmF3ZGF0YSBjaGVjay4KKworCSogc3JlYy5jIChwYXNzX292ZXIpOiBTZXQgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIFM3LCBTOCBvciBTOS4KKworRnJpIE9jdCAxNCAxOToxNTo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBWRVJTSU9OOiBVcGRhdGVkIHRvIDIuNS4KKworRnJpIE9jdCAxNCAxMTowNzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBDYXN0IGVuZCB0byBiZSBub24gY29uc3QgYmVmb3JlIHBhc3NpbmcgaXQKKwl0byBzdHJ0b3VsLgorCitUaHUgT2N0IDEzIDE0OjQwOjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYmZkLmMgKGJmZF9zY2FuX3ZtYSk6IFBhc3MgZW5kIGFyZ3VtZW50IG9uIHRvIHN0cnRvdWwuCisKK1dlZCBPY3QgMTIgMTY6NDY6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogb3BuY2xzLmMgKGJmZF9yZWFsbG9jKTogRGVsZXRlZCwgc2luY2UgaXQncyBicm9rZW4gYW5kIGZpeGluZyBpdAorCXdvdWxkIG1ha2UgaXQgc2xvdy4gIEJlc2lkZXMsIGl0IGlzbid0IHVzZWQgbXVjaC4KKwkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQWx3YXlzIGFsbG9jYXRlIG5ldyBzdG9yYWdlIGZvciB0aGUKKwlzeW1ib2wgdGFibGUuCisKK1dlZCBPY3QgMTIgMTE6NTQ6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBNYXJrIGxvY2FsIHN0UHJvYywgc3RMYWJlbCBvcgorCXN0YWJzIHN5bWJvbHMgYXMgQlNGX0RFQlVHR0lORy4KKworCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBNYWtlCisJc3RyMSBhbmQgc3RyMiBjb25zdCBwb2ludGVycy4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgdG9wIGxldmVsIGluc3RhbGwuc2ggc2NyaXB0LgorCSogY29uZmlnL1JFQURNRSAoSU5TVEFMTCk6IFJlbW92ZS4KKwkqIGNvbmZpZy9kZWx0YTg4Lm1oIChJTlNUQUxMKTogUmVtb3ZlLgorCSogY29uZmlnL2kzODZ2NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KKwkqIGNvbmZpZy9pcml4NC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KKwkqIGNvbmZpZy9pcml4NS5taCAoSU5TVEFMTCk6IFJlbW92ZS4KKwkqIGNvbmZpZy9uY3J0MzAwMC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KKworVHVlIE9jdCAxMSAxMzo1Nzo1NiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYW5kYW50ZS5haWIuY29tKQorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE1ha2Ugc3VyZSB0aGF0IGEgc3ltYm9sCisJd2l0aCBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgb3IgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQorCWVudHJ5IGlzIGFkZGVkIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgorCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMKKwlhbHJlYWR5IGdvdHRlbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LCBjaGFuZ2UgdGhlCisJZGVmaW5pdGlvbiB0byB0aGUgUExUIGVudHJ5LgorCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisKK1R1ZSBPY3QgMTEgMTc6MTI6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBseW54LWNvcmUuYyAobHlueF9jb3JlX2ZpbGVfcCk6IFNQQVJDIEx5bnggYXBwZWFycyB0byBzdGFydAorCWR1bXBpbmcgdGhlIC5kYXRhIHNlY3Rpb24gaW4gYSBjb3JlIGZpbGUgYXQgYSBwYWdlIGJvdW5kYXJ5LgorCitNb24gT2N0IDEwIDE2OjI0OjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfaF9wdXRfMzIKKwl0byBjb3JyZWN0IHR5cGUuCisJKGNvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBDYXN0IGFyZ3VtZW50IHRvIGJmZF9oX2dldF8zMiB0byBjb3JyZWN0CisJdHlwZS4KKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENhc3QgYXJndW1lbnQgdG8KKwliZmRfZWxmX2hhc2ggdG8gY29ycmVjdCB0eXBlLgorCisJKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBUaGUgUEMxMCwgUEMyMiwgYW5kCisJV1BMVDMwIHJlbG9jYXRpb25zIGFyZSBQQy1yZWxhdGl2ZS4KKworVGh1IE9jdCAgNiAxMjo1NzoyNiAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQorCisJKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IENvcnJlY3RseSBpbml0aWFsaXplIHZtYSBpZiB0aGUgdm1hIG9mCisJdGhlIHRleHQgc2VjdGlvbiB3YXMgdXNlci1kZWZpbmVkLgorCitXZWQgT2N0ICA1IDE0OjQyOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBTVlI0IHVzZXMgc2xhc2gKKwluZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgbmFtZSwgbm90IGp1c3QgbmV3bGluZS4KKworVHVlIE9jdCAgNCAxMToyMzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQKKwlwb3dlciB0byA0LCByYXRoZXIgdGhhbiB1c2luZyBhbGlnbl9wb3dlcl9taW4uCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IERvbid0IHVzZSBhbGlnbl9wb3dlcl9taW47CisJdXNlIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiBpbnN0ZWFkLiAgRm9yY2UgdGhlIC5zdGFiCisJYW5kIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIGFsaWduZWQgdG8gbm8gbW9yZSB0aGFuIDIuICBSZW1vdmUKKwlDT0ZGX1NQQVJDIHNwZWNpYWwgY2FzZXMuCisJKiBjb2ZmLWEyOWsuYzogRGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUi4KKwkqIGNvZmYtYXBvbGxvLmMsIGNvZmYtZ28zMi5jLCBjb2ZmLWg4MzAwLmM6IExpa2V3aXNlLgorCSogY29mZi1oODUwMC5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jOiBMaWtld2lzZS4KKwkqIGNvZmYtbTg4ay5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtc3BhcmMuYzogTGlrZXdpc2UuCisJKiBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmM6IExpa2V3aXNlLgorCisJKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCisKKwkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCB0cnkgdG8gY29udmVydCBhIGxvbmcKKwlmaWxlbmFtZSBpZiB0aGUgb2Zmc2V0IGZpZWxkIGlzIHplcm8uCisKKwkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IElmIHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCisJd2FzIG5vdCBzZXQsIHVzZSBhIHNlbnNpYmxlIGRlZmF1bHQgcmF0aGVyIHRoYW4gemVyby4KKworTW9uIE9jdCAgMyAxNjowNDoyOSAxOTk0ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCisKKwkqIG9wbmNscy5jIChiZmRfY2xvc2UpOiBIb25vciB1bWFzayB3aGVuIHNldHRpbmcgZXhlY3V0aW9uIGJpdHMuCisJKGJmZF9jbG9zZV9hbGxfZG9uZSk6IExpa2V3aXNlLgorCitNb24gT2N0ICAzIDA0OjQxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgU2V0IFNFQ19IQVNfQ09OVEVOVFMgZmxhZworCWZvciAuc3RhY2sgYW5kIC5sZGluZm8gc2VjdGlvbnMuIENhc3QgY29yZWRhdGEuY190YWIgdG8gYQorCWZpbGVfcHRyIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gZ2NjLgorCitGcmkgU2VwIDMwIDEzOjExOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBSZW1vdmUgYXNzZXJ0aW9uIHdoZW4gYSBub24KKyAgICAgICAgU0VDX0lOX01FTU9SWSBzZWN0aW9uIGlzIGZvdW5kIGluIGR5bm9iai4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuCisJbGlua2luZyBQSUMgY29tcGlsZWQgY29kZS4KKworVGh1IFNlcCAyOSAxNToyMTo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2hhbmdlIHR5cGUgb2YgImRhdGEiIHRvCisJYmZkX2J5dGUgKiwgdG8gZ28gYWxvbmcgd2l0aCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCisKKwkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IE1vdmVkIGhlcmUgZnJvbSBlbGZfcHJpbnRfc3ltYm9sCisJaW4gZWxmY29kZS5oLiAgKGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGwpOiBQcmludCBzeW1ib2wncyBzaXplCisJZmllbGQsIGV4Y2VwdCBmb3IgY29tbW9uIHN5bWJvbHM7IHByaW50IHRoZWlyIGFsaWdubWVudC4KKwkqIGVsZmNvZGUuaCAoZWxmX3ByaW50X3N5bWJvbCk6IERlbGV0ZWQuCisJKiBsaWJlbGYuaCAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBEZWNsYXJlLgorCShiZmRfZWxmezMyLDY0fV9wcmludF9zeW1ib2wpOiBSZXBsYWNlIGRlY2xhcmF0aW9ucyB3aXRoIG1hY3Jvcy4KKworCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyBCU0ZfTE9DQUwgYW5kIEJTRl9HTE9CQUwKKwlpbiBvbmUgY29sdW1uLiAgVXNlIHRoZSBjb2x1bW4gZnJlZWQgdXAgdG8gc2hvdyBCU0ZfRlVOQ1RJT04gYW5kCisJQlNGX0ZJTEUuCisKK1RodSBTZXAgMjkgMTI6Mjk6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBzeW1zLmMgKHN0dCk6IEFkZCAucmRhdGEgYW5kIC5yb2RhdGEuCisKK1dlZCBTZXAgMjggMTM6MzU6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogQ2FzdCBkYXRhX3N0YXJ0IHRvIGJmZF9ieXRlICoKKwliZWZvcmUgdHJ5aW5nIHRvIGFkZCB2YWx1ZXMgdG8gaXQuCisKK1R1ZSBTZXAgMjcgMTY6NDc6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENhc3QKKwlyZXR1cm4gdmFsdWUgZnJvbSBlbGZfc3ltX2V4dHJhLgorCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBiZmRfemFsbG9jLgorCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tIG1hbGxvYy4KKworCSogZ2VuLWFvdXQuYyAobWFpbik6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgImFyY2giLgorCisJKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYXN0IHJldHVybiB2YWx1ZSBvZgorCWJmZF9oYXNoX2FsbG9jYXRlLgorCisJKiByaXNjaXguYyAocmlzY2l4X2NhbGxiYWNrKTogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGUuCisKKwkqIHJlbG9jLmMgKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24sIG1vc3RseSBjb3BpZWQKKwlmcm9tIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFkanVzdGVkIGZvciB0aGUgYXNzZW1ibGVyJ3MgbmVlZHMuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCitNb24gU2VwIDI2IDExOjAwOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIHRoZQorCXNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBwb3NpdGlvbiBldmVuIGlmIERfUEFHRUQgaXMgbm90IHNldC4KKworCSogYmZkLWluLmggKGJmZF9zZWVrKTogQ2hhbmdlIGRlY2xhcmF0aW9uIHRvIG5vdCBtYXJrIGZwIGNvbnN0LgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogbGliYmZkLmMgKGJmZF9zZWVrKTogRG9uJ3QgbWFyayBwYXJhbWV0ZXJzIGNvbnN0LCB0byBhdm9pZAorCWNvbmZsaWN0cyB3aXRoIGRlY2xhcmF0aW9uLgorCitGcmkgU2VwIDIzIDE1OjE1OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IERvbid0IGFib3J0IGlmIHdlIGFsbG9jYXRlZAorCXRvbyBtdWNoIHNwYWNlIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXIsIG9ubHkgaWYgd2UgYWxsb2NhdGVkIHRvbworCWxpdHRsZS4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTaW1pbGFyIGNoYW5nZS4KKworVHVlIFNlcCAyMCAxMzoxNzowNyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGxpYmFvdXQuaDogRml4IGNvbW1lbnQuCisJKiBuczMya25ic2QuaDogQ2hhbmdlZCBNX05TMzJLX05FVEJTRCB0byBNXzUzMl9ORVRCU0QgdG8gbWF0Y2gKKwkgIGxpYmFvdXQuaC4KKworVHVlIFNlcCAyMCAxNToyMzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNuZXRic2Quby4KKwkoQ0ZJTEVTKTogQWRkIG5zMzJrbmV0YnNkLmMgYW5kIHNwYXJjbmV0YnNkLmMuCisJKiB0YXJnZXRzLmM6IG5zMzJrbmV0YnNkX3ZlYyB3YXMgcmVuYW1lZCB0byBwYzUzMm5ldGJzZF92ZWMuCisKKwkqIGNvZmYtc2guYyAocnR5cGUyaG93dG8pOiBSZW1vdmU7IHVudXNlZC4KKwkoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSByc3RhdC4KKwkocmVsb2NfcHJvY2Vzc2luZyk6IENvbW1lbnQgb3V0OyB1bnVzZWQuCisKK0ZyaSBTZXAgMTYgMTI6MTI6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogSWYgaC0+aW5keCBpcyAtMiwgdGhlbgorCWFsd2F5cyB3cml0ZSBpdCBvdXQgZXZlbiBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSBzdHJpcHBlZC4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogSWYgd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYQorCXN0cmlwcGVkIGdsb2JhbCBzeW1ib2wsIGZvcmNlIGl0IHRvIGJlIHdyaXR0ZW4gb3V0IHJhdGhlciB0aGFuCisJbWVyZWx5IGNhbGxpbmcgdW5hdHRhY2hlZF9yZWxvYy4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCisJKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCisKK1dlZCBTZXAgMTQgMTU6Mzc6MTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IE5ldyBmaWVsZCBzb3J0ZWRfc3ltcy4KKwkob2JqX3NvbV9zb3J0ZWRfc3ltcyk6IEFjY2Vzc29yIG1hY3JvLgorCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBJbml0aWFsaXplIHNvcnRlZF9zeW1zIHRvIE5VTEwuCisJKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBTb3J0IGEgY29weSBvZiB0aGUgQkZEJ3Mgc3ltYm9sIHRhYmxlOworCXN0b3JlIHRoZSBzb3J0ZWQgc3ltYm9sIHRhYmxlIGluIHNvcnRlZF9zeW1zLgorCShzb21fd3JpdGVfZml4dXBzKTogSW5pdGFsaXplIHRtcF9yZWxvYyB0byBOVUxMIHRvIG1ha2UgR0NDIGhhcHB5LgorCShzb21fYmVnaW5fd3JpdGluZyk6IFNpbWlsYXJseSBmb3IgZXhlY19oZWFkZXIuICBQYXNzIHRoZSBzb3J0ZWQKKwlzeW1ib2wgdGFibGUgdG8gc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzLgorCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSB0aGUgc29ydGVkIHN5bWJvbHMgcmF0aGVyCisJdGhhbiB0aGUgY2Fub25pY2FsIHN5bWJvbCB0YWJsZS4KKworCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IEFkZCAic3RyaW5ndGFiX29mZnNldCIgZmllbGQuCisJKiBzb20uYyAoc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzKTogVXNlICJzdHJpbmd0YWJfb2Zmc2V0IgorCXJhdGhlciB0aGFuIGRlc3Ryb3lpbmcgdGhlICJuYW1lIiBmaWVsZCBpbiB0aGUgQkZEIHN5bWJvbC4KKwkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KKworV2VkIFNlcCAxNCAxNTowNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogUmVuYW1lIHNraXBfaW5kaXJlY3QgdG8KKwlza2lwX25leHQuICBJZiB3ZSBmaW5kIGFuIE5fV0FSTklORyBzeW1ib2wgd2hpY2ggaGFzIGFscmVhZHkgYmVlbgorCXdyaXR0ZW4gb3V0LCBzZXQgc2tpcF9uZXh0LgorCisJKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgZmllbGQgZmluZF9idWZmZXIuCisJKiBlY29mZi5jOiBJbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KKwkoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorCisJKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBLZWVwIGEgc3ltYm9sIG1hcmtlZCBhcyB3ZWFrCisJZXZlbiBpZiBpdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgb2JqZWN0LgorCitUdWUgU2VwIDEzIDE3OjU3OjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX2ZpeHVwX2Zvcm1hdHMpOiBDYXNlIFJfRU5UUlkgKDB4YjMpLCBzZXQgYm90aAorCSdUJyBhbmQgJ1UnIHRvIGdyYWIgYWxsIHRoZSB1bndpbmQgaW5mb3JtYXRpb24uCisJKHNvbV9zZXRfcmVsb2NfaW5mbyk6IE1ha2UgJ1UnIHVud2luZCBiaXRzIHBlcnNpc3QgYWNyb3NzCisJbXVsdGlwbGUgU09NIHJlbG9jYXRpb25zLiAgU2V0IHRoZSBhZGRlbmQgZmllbGQgb2YgYW4gUl9FTlRSWQorCXJlbG9jYXRpb24gdG8gdGhlIHZhbHVlIGluICdUJzsgc2V0IHRoZSBhZGRlbmQgZmllbGQgb24gYW4KKwlSX0VYSVQgcmVsb2NhdGlvbiB0byB0aGUgdmFsdWUgaW4gJ1UnLgorCisJKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogRGVsZXRlIHVud2luZCBmaWVsZC4KKworCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBGb3IgUl9FTlRSWSBmaXh1cHMsIGdldCAzMmJpdHMgb2YKKwl1bndpbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWRkZW5kIGZpZWxkIG9mIHRoZSBSX0VOVFJZLCBnZXQgdGhlCisJb3RoZXIgMzJiaXRzIGZyb20gdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgUl9FWElULgorCShiZmRfc29tX2F0dGFjaF91bndpbmRfaW5mbyk6IERlbGV0ZSBmdW5jdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCisKKwkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBEZWxldGUgdW51c2VkIGEub3V0LXJlbGF0ZWQgZmllbGRzLgorCisJKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogVXNlIGJmZF9hYnNfc2VjdGlvbl9wdHIKKwlpbnN0ZWFkIG9mICZiZmRfYWJzX3NlY3Rpb24uCisKKwkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogSGFuZGxlIGV4ZWNfZW50cnkgYW5kIGV4ZWNfZmxhZ3MgYmVpbmcKKwlzd2l0Y2hlZCBpbiBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IHRoZSBPU0YxIGxpbmtlci4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0VYSVQganVzdCBsaWtlIHRoZSBSX3tGLEwsUn1TRUwKKwlmaXh1cHMuICBTdXBwb3J0IFJfQUxUX0VOVFJZIChoYW5kbGUganVzdCBsaWtlIFJfRVhJVCkuCisKK1R1ZSBTZXAgMTMgMTY6MDQ6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IHN5bWVudF9iYXNlIGlzIHVuc2lnbmVkCisJc28gY2FuJ3QgY29tcGFyZSAtdmUgbnVtYmVycyB3aXRoIGl0LgorCitNb24gU2VwIDEyIDIwOjMxOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoc2hjb2ZmX3ZlYyk6IFVzZSBjb2ZmbGluay5vIG5vdy4KKwkqIGNvZmYtc2guYzogUmV3cml0dGVuIHRvIHVzZSBuZXcgZmFzdCBjb2ZmIGJhY2tlbmQuCisKK1R1ZSBTZXAgMTMgMTY6MjM6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhc3N1bWUgdGhhdCBhbGwgdGhlIGlucHV0CisgICAgICAgIGZpbGVzIGFyZSBhLm91dC4KKworVHVlIFNlcCAxMyAxMTowOTozOSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLW5ldGJzZCk6IHVzZSBzcGFyY25ic2QuCisJICAobnMzMmstKi1uZXRic2QpOiB1c2UgbnMzMmtuYnNkLgorCisJKiBob3N0cy97bmJzZCxpMzg2bmJzZCxuczMya25ic2Qsc3BhcmNuYnNkfS5oOiBOZXcgZmlsZXMsIE5ldEJTRAorCSAgaG9zdCBzdXBwb3J0LgorCisJKiBzcGFyY25ldGJzZC5jOiBOZXcgZmlsZSwgYWRkcyBzdXBwb3J0IGZvciBOZXRCU0Qvc3BhcmMuCisJKiBjb25maWcvc3BhcmMtbmJzZC5tdDogTGlrZXdpc2UuCisKKwkqIG5ldGJzZC5oOiBOZXcgZmlsZSwgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCBuZXRic2QgcG9ydHMuCisJKiBpMzg2bmV0YnNkLmM6IFVzZSBpdC4KKyAgICAgICAgKiBuczMya25ldGJzZC5jOiBVc2UgaXQuCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYywgY29uZmlnL2kzODYtbmJzZC5tdCwKKwkgIGNvbmZpZy9uczMyay1uYnNkLm10OiBjYW5vbmljYWxpemUgbmV0YnNkIHRhcmdldHMgdG8gY29uZm9ybSB0bworCSAgZmlsZS92YXJpYWJsZSBuYW1pbmcgY29udmVudGlvbnMuCisJKiBpMzg2bmV0YnNkLmM6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gbmV0YnNkMzg2LmMuCisJKiBuczMya25ldGJzZC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG5ldGJzZDUzMi5jLgorCQorTW9uIFNlcCAxMiAyMTo1NjoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9yZWxvY19za2lwKTogQ29ycmVjdCBvZmYtYnktb25lIGVycm9yIGZvciA0LWJ5dGUKKwlSX05PX1JFTE9DQVRJT04gZml4dXBzLgorCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZXR1cm4gdGhlIGFic29sdXRlIHNlY3Rpb24gaWYgdGhlCisJc3ltYm9sIGlzbid0IGNvbnRhaW5lZCBpbiBhbnkgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCisJKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTVF9QUklfUFJPRyBhbmQgU1RfU0VDX1BST0cgc3ltYm9scyBhcmUKKwlub3QgZnVuY3Rpb24gc3ltYm9scyAodGhleSBhcmUgbWFnaWMgY29kZSBsYWJlbHMgd2hpY2ggKmNhbiogYmUgdGhlCisJdGFyZ2V0cyBvZiBjcm9zcyBzcGFjZSBicmFuY2hlcykuICAkU1RBUlQkIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sLgorCitNb24gU2VwIDEyIDExOjQzOjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29mZi1hbHBoYS5jIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBCisJdG8gc2VjdGlvbl9mbGFncy4KKwkqIGNvZmYtbWlwcy5jIChlY29mZl9saXR0bGVfdmVjLCBlY29mZl9iaWdfdmVjKTogTGlrZXdpc2UuCisKKwkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IFNldCB0aGUgdHlwZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sCisJdG8gU1RUX0ZVTkMgaWYgdGhlIEJTRl9GVU5DVElPTiBmbGFnIGlzIHNldC4KKworCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IElmIHJfc3ltbmR4IGlzIC0xLCBkb24ndAorCWNoYW5nZSBpdC4KKwkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElmIHJfc3ltbmR4IGlzIC0xLCBpdCBpcyBhbgorCWFic29sdXRlIHJlbG9jLiAgRG9uJ3QgZHVtcCBjb3JlIHVzaW5nIHJfc3ltbmR4IGFzIGFuIGFycmF5IGluZGV4LgorCSogY2YtbTY4a2x5bnguYyAoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZS4KKwkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiAoY29weSBvZiBmdW5jdGlvbiBpbgorCWNvZmYtaTM4Ni5jKS4KKwkoY29mZl9tNjhrX2x5bnhydHlwZV90b19ob3d0byk6IHN5bSBhcmd1bWVudCBtYXkgYmUgTlVMTC4KKwkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KKwkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBhbiByX3N5bW5keAorCXZhbHVlIG9mIC0xLCBtZWFuaW5nIGFuIGFic29sdXRlIHJlbG9jLgorCisJKiBjdG9yLmM6IFJlbW92ZTsgb2Jzb2xldGUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKEJGRF9MSUJTKTogUmVtb3ZlIGN0b3Iuby4KKwkoQ0ZJTEVTKTogUmVtb3ZlIGN0b3IuYy4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitNb24gU2VwIDEyIDAxOjU4OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZXJlIHdhcyBhIGxpbmsKKwllcnJvciBvZiBzb21lIHNvcnQgKGZvciBleGFtcGxlLCB1bmRlZmluZWQgc3ltYm9scyksIHRoZW4gZG8gbm90CisJYXBwbHkgYW55IHJlbG9jcywganVzdCBub3RpZnkgdGhlIHVzZXIgb2YgdGhlIGVycm9ycy4KKwkoZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBEbyBub3QgYnVpbGQgYSBzeW1ib2wKKwlleHRlbnNpb24gc2VjdGlvbiBmb3IgYW4gZXhlY3V0YWJsZSAoaXQncyB1c2VsZXNzKS4KKwkoZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERvIG5vdGhpbmcgaWYgdGhlcmUgd2FzIGEKKwlsaW5rIGVycm9yIG9mIHNvbWUgc29ydCAoZm9yIGV4YW1wbGUsIHVuZGVmaW5lZCBzeW1ib2xzKS4KKwkoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogS2x1ZGdlLiAgVHVybiBvZmYgU0VDX0hBU19DT05URU5UUworCWZvciBhbGwgdGhlIGlucHV0IHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMgdG8ga2VlcCB0aGUgZ2VuZXJpYworCUJGRCBjb2RlIGhhcHB5LiAgVGVtcG9yYXJpbHkgdHVybiBpdCBvbiB0byByZWFkIHRoZSBjb250ZW50cyBvZgorCXRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uCisKK1N1biBTZXAgMTEgMjE6NTg6NTkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy9ocHBhb3NmLm1oIChSQU5MSUIpOiBEbyBub3Qgc2V0LgorCSogY29uZmlnL2hwcGFic2QubWggKFJBTkxJQik6IExpa2V3aXNlLgorCitTdW4gU2VwIDExIDIyOjUwOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY2YtaTM4Nmx5bnguYzogUmVtb3ZlICNpZiAwIGNvZGUuCisJKGkzODZfbHlueG9zX2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgorCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRGVmaW5lLgorCShseW54X2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmCisJY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGlzIGRlZmluZWQsIG9ubHkgZGVmaW5lIHRoaXMgaWYgbm90IGFscmVhZHkKKwlkZWZpbmVkLgorCShjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzLCBjb2ZmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEhhbmRsZQorCWJmZF9pbmRpcmVjdF9saW5rX29yZGVyIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIHZpYQorCV9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgorCShzZXRfc3ltYm9sX2Zyb21faGFzaCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKKwlfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLgorCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogU3ltYm9sIHNldHRpbmcgY29kZSBtb3ZlZAorCXRvIHNldF9zeW1ib2xfZnJvbV9oYXNoOyBjYWxsIGl0LgorCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBBZGQgZ2VuZXJpY19saW5rZXIgYXJndW1lbnQuCisJQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgZmFsc2UsIHNldCB0aGUgZ2VuZXJpYyBzeW1ib2xzIGJhc2VkIG9uCisJdGhlIGhhc2ggdGFibGUgZW50cmllcy4KKworRnJpIFNlcCAgOSAxMTo1MTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltdGFiKTogUmVpbmRlbnRlZC4gIFJlbW92ZWQgY29tbWVudGVkIG91dAorCWNhbGwgdG8gYmZkX2NvbnN0cnVjdG9yX2VudHJ5LgorCisJQ29udmVydCBtNjhrIENPRkYgdG8gdXNlIG5ldyBDT0ZGIGJhY2tlbmQgbGlua2VyLgorCSogY29mZi1tNjhrLmMgKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KKwkqIGNmLW02OGtseW54LmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUuCisJKGNvZmZfbTY4a19seW54X3J0eXBlX3RvX2hvd3RvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGNvbmZpZ3VyZS5pbiAobTY4a2NvZmZfdmVjKTogQnVpbGQgY29mZmxpbmsuby4KKwkobTY4a2NvZmZ1bl92ZWMsIG02OGtseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCisKK1RodSBTZXAgIDggMTY6MjA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjYXNlIFJFTEJZVEUpOiBGbGFnCisJb3ZlcmZsb3dzIGNvcnJlY3RseS4KKworV2VkIFNlcCAgNyAxOTowMTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IENoYW5nZSBzZWNvbmQgYXJndW1lbnQgb2YKKwllbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2sgdG8gYm9vbGVhbi4KKwkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbGlua2VyIGZpZWxkLgorCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBhc3MgdmFsdWUgb2YKKwl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gZmluYWxfd3JpdGVfcHJvY2Vzc2luZywgcmF0aGVyIHRoYW4gTlVMTC4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3QgY2FsbCBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2suICBTZXQKKwl0ZGF0YSBsaW5rZXIgZmllbGQgdG8gdHJ1ZS4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IENoYW5nZSB0eXBlIG9mCisJc2Vjb25kIGFyZ3VtZW50IHRvIGJvb2xlYW4uCisJKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKKwlMaWtld2lzZS4KKworCSogY29mZi1nbzMyLmMgKFJUWVBFMkhPV1RPKTogRnVsbHkgcGFyZW50aGVzaXplIGFyZ3VtZW50cy4KKwkqIGNvZmYtaTk2MC5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgorCSogY29mZi1tODhrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCisJKiBjb2ZmLXdlMzJrLmMgKFJUWVBFMkhPV1RPKTogTGlrZXdpc2UuCisKKwlNYWtlIGkzODYgQ09GRiB1c2UgbmV3IENPRkYgYmFja2VuZCBsaW5rZXIuCisJKiBjb2ZmLWkzODYuYyAoUlRZUEUySE9XVE8pOiBGdWxseSBwYXJlbnRoZXNpemUgYXJndW1lbnRzLgorCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCisJKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZ3VyZS5pbiAoaTM4NmNvZmZfdmVjKTogVXNlIGNvZmZsaW5rLm8uCisJKGkzODZseW54X2NvZmZfdmVjKTogTGlrZXdpc2UuCisKKwkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKKwlfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8uCisJKGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lLgorCShjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lIHRvIHVzZSBSVFlQRTJIT1dUTywgaWYgbm90IGFscmVhZHkKKwlkZWZpbmVkLgorCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBzZWN0aW9uX2NvdW50ICsgMQorCXNlY3Rpb25faW5mbyBzdHJ1Y3R1cmVzLCBzaW5jZSB0aGUgdGFyZ2V0X2luZGV4IGlzIDEgYmFzZWQuCisJKGNvZmZfbGlua19pbnB1dF9iZmQpOiBTZXQgKnNlY3BwIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIgZm9yIGEKKwljb21tb24gc3ltYm9sLiAgQWRqdXN0IHJlbF9oYXNoIGJ5IHRoZSBvdXRwdXQgcmVsb2MgY291bnQuCisJKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJjb2ZmLWluLmggKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWNsYXJlLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgorCitUdWUgU2VwICA2IDIzOjI4OjUyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFRyZWF0IHVuZGVmaW5lZCBjb2RlCisJc3ltYm9scyBhbmQgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggbm8gdHlwZSBpbiB0aGUgc2FtZSBtYW5uZXIKKwlpZiB0aGUgYXNzb2NpYXRlZCBCRkQgc3ltYm9sIGhhcyBCU0ZfRlVOQ1RJT04gc2V0LiAgRm9yIGEgZGVmaW5lZAorCXN5bWJvbCB3aGljaCBubyB0eXBlLCBzZWxlY3QgYSBTT00gdHlwZSBiYXNlZCBvbiB0aGUgZmxhZ3Mgb2YgdGhlCisJc2VjdGlvbiBjb250YWluaW5nIHRoZSBzeW1ib2wuCisJKHNvbV9zbHVycF9zeW1ib2xfdHlwZSk6IFNldCBCU0ZfRlVOQ1RJT04gZm9yIHVuZGVmaW5lZCBTVF9TVFVCCisJb3IgU1RfQ09ERSBzeW1ib2xzIChpbXBvcnRpbmcgYSBub24tZnVuY3Rpb24gY29kZSBzeW1ib2wgaXMKKwltZWFuaW5nbGVzcyBpbiBTT00pLgorCShzb21fc2V0X3JlbG9jX2luZm8pOiBEb24ndCBzZXQgIm9mZnNldCIgdG8gdGhlIHNlY3Rpb24ncyB2bWE7IGl0CisJc2hvdWxkIGFsd2F5cyBzdGFydCBhdCB6ZXJvLgorCitUdWUgU2VwICA2IDE0OjUxOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCUFkZCBuZXcgc3R5bGUgbGlua2VyIHN1cHBvcnQgdG8gQ09GRiBiYWNrZW5kLiAgYTI5ayBvbmx5IGZvciBub3cuCisJKiBjb2ZmbGluay5jOiBOZXcgZmlsZS4KKwkqIGxpYmNvZmYtaW4uaDogSW5jbHVkZSBiZmRsaW5rLmguCisJKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMsIG9ial9jb2ZmX3N0cmluZ3MpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCisJKG9ial9jb2ZmX3N5bV9oYXNoZXMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCisJKHN0cnVjdCBjb2ZmX3RkYXRhKTogQWRkIGZpZWxkcyBleHRlcm5hbF9zeW1zLCBzdHJpbmdzLCBhbmQKKwlzeW1faGFzaGVzLgorCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCisJKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KKwkoY29mZl9saW5rX2hhc2hfbG9va3VwLCBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KKwkoY29mZl9oYXNoX3RhYmxlKTogRGVmaW5lLgorCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCisJKF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzLCBfYmZkX2NvZmZfZmluYWxfbGluayk6IERlY2xhcmUuCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIF9iZmRfcmVsc3osCisJX2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4sIF9iZmRfY29mZl9zeW1faXNfZ2xvYmFsLAorCV9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMsCisJX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24uCisJKGJmZF9jb2ZmX3JlbHN6LCBiZmRfY29mZl9zd2FwX3JlbG9jX2luKTogRGVmaW5lLgorCShiZmRfY29mZl9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgorCShiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEZWZpbmUuCisJKGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCisJKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgb2JqX3Jhd19zeW1lbnRfY291bnQgYW5kCisJb2JqX2NvbnZfdGFibGVfc2l6ZS4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTZXQgdGFyZ2V0X2luZGV4IG9mIGFsbAorCXNlY3Rpb25zLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmllbGQuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHRhcmdldF9pbmRleDsgbm93IGRvbmUgYnkKKwljb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gIFJlbW92ZSBvYnNvbGV0ZSBoYW5kbGluZyBvZgorCXNjbl9iYXNlIGFuZCBkYXRhX2Jhc2UuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhhdCB0YXJnZXRfaW5kZXgKKwlpcyBwb3NpdGl2ZSwgc2luY2UgaXQgYWx3YXlzIGlzLiAgUmVtb3ZlIHVzZSBvZiBwYWQsIHdoaWNoIGlzCisJYWx3YXlzIHplcm8uICBDaGVjayBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90IGJmZF9nZXRfc3ltY291bnQsCisJZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scywgYnV0IG9ubHkgd3JpdGUgdGhlbSBvdXQgaWYKKwliZmRfZ2V0X3N5bWNvdW50IGlzIG5vbi16ZXJvLiAgRG9uJ3QgY2hlY2sgb2JqX3Jhd19zeW1lbnRfY291bnQKKwl1bnRpbCBhZnRlciBjb2ZmX3dyaXRlX3N5bWJvbHMgaXMgY2FsbGVkLgorCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBvYmpfcmF3X3N5bWVudF9jb3VudCwgbm90CisJYmZkX2dldF9zeW1jb3VudCBmb3IgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgRG9uJ3Qgc2V0CisJb2JqX2NvbnZfdGFibGVfc2l6ZS4KKwkoY29mZl9zeW1faXNfZ2xvYmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbiBvciBtYWNyby4KKwkoY29mZl9zbHVycF9yZWxvY190YWJsZSk6IENhbGwgY29mZl9zd2FwX3JlbG9jX2luLCBub3QKKwliZmRfc3dhcF9yZWxvY19pbi4KKwkoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IElmIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcworCWRlZmluZWQsIGRlZmluZSBhcyBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KKwkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IFNpbWlsYXIgY2hhbmdlLgorCShjb2ZmX2JmZF9maW5hbF9saW5rKTogU2ltaWxhciBjaGFuZ2UuCisJKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZSBhcyBOVUxMIGlmIG5vdCBkZWZpbmVkLgorCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KKwkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogRG9uJ3Qgc2V0IG9ial9yYXdfc3ltZW50X2NvdW50CisJYW5kIG9ial9jb252X3RhYmxlX3NpemUgaGVyZS4KKwkoY29mZl9jb3VudF9saW5lbnVtYmVycyk6IFJlaW5kZW50LiAgSWYgYmZkX2dldF9zeW1jb3VudCBpcyB6ZXJvLAorCWFkZCB1cCB0aGUgbGluZSBudW1iZXJzIGZyb20gdGhlIHNlY3Rpb25zLgorCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBTZXQgb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAorCWJmZF9nZXRfc3ltY291bnQuCisJKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBEb24ndCBwb2ludGVyaXplIGEgbm9ucG9zaXRpdmUgeF9lbmRuZHgKKwlmaWVsZC4KKwkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBVc2Ugb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAorCWJmZF9nZXRfc3ltY291bnQuCisJKGNvZmZfcHJpbnRfc3ltYm9sKTogSWYgYXV4cC0+Zml4X2VuZCwgcHJpbnQgeF9lbmRuZHggdmFsdWUuCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2NfaW4pOiBSZW5hbWUgZnJvbSBiZmRfc3dhcF9yZWxvY19pbi4KKwlSZWluZGVudC4gIENoYW5nZSBhcmd1bWVudCB0eXBlIHRvICBQVFIuCisJKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCisJKiBjb25maWd1cmUuaW4gKGEyOWtjb2ZmX2JpZ192ZWMpOiBDb21waWxlIGNvZmZsaW5rLm8uCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgorCSogbGliY29mZi5oOiBSZWJ1aWx0LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgorCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmbGluay5vLgorCShDRklMRVMpOiBBZGQgY29mZmxpbmsuYy4KKworVHVlIFNlcCAgNiAxNDowMDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sLCBjYXNlIGJmZF9zeW1ib2xfcHJpbnRfYWxsKTogQ2hlY2sKKwlmb3Igc2VjdGlvbiBzeW1ib2wsIGFuZCBwcmludCBpdHMgYXV4IGZpZWxkcyB3aXRoIGFwcHJvcHJpYXRlCisJbGFiZWxzLgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkZWQgY3B1LWFybS5vLgorCitTdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogUmVjb2duaXplIHRoZSBBUk0gcHJvY2Vzc29yLgorCSogYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3QsIGxpYmFvdXQuaCwgcmVsb2MuYywKKwl0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgQVJNLgorCSogY3B1LWFybS5jLCByaXNjaXguYywgY29uZmlnL3Jpc2NpeC5taCwgY29uZmlnL3Jpc2NpeC5tdDogTmV3IGZpbGVzLgorCisJKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFibGUpOiBDaGVjayB0aGF0IHN0ciBpc24ndCBhIE5VTEwgcG9pbnRlci4KKworRnJpIFNlcCAgMiAxNDoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBSZXdyb3RlIGRlZmluaXRpb24gdG8gdXNlCisJbmV3ICJjaGV3IiBjb21tYW5kcyBmb3Igc2ltdWx0YW5lb3VzIGRlZmluaXRpb24gb2YgZW51bWVyYXRvciBhbmQKKwllbnVtZXJhdG9yIG5hbWUgdGFibGUuCisJKGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lKTogTmV3IGZ1bmN0aW9uLCBmb3IgcmV0cmlldmluZyBhIHN5bWJvbGljCisJbmFtZSBhc3NvY2lhdGVkIHdpdGggYW4gZW51bWVyYXRvci4KKwkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCitUdWUgQXVnIDMwIDIxOjI0OjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcywgY2FzZSBSX0VOVFJZKTogSGFuZGxlIGNhc2Ugd2hlcmUgbm8KKwl1bndpbmQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCisKK1R1ZSBBdWcgMzAgMTE6NDM6MzAgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQorCisJKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHNvbmFtZQorCWFyZ3VtZW50LCBhbmQgdXNlIGl0IHRvIHNldCBEVF9TT05BTUUgZHluYW1pYyBlbnRyeS4KKwkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIHByb3RvdHlwZS4KKwkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKK0ZyaSBBdWcgMjYgMTU6NDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IFNldCBvYmpfcmF3X3N5bWVudF9jb3VudC4KKwkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBWZXJpZnkgb2JqX3Jhd19zeW1lbnRfY291bnQsIHJhdGhlcgorCXRoYW4gc2V0dGluZyBpdC4KKworVGh1IEF1ZyAyNSAxMDo0NDo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogUmVtb3ZlIGhvc3QgZGVwZW5kZW5jaWVzLgorCisJKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogQ2hlY2sgZm9yIF9iZmRfc3RyaW5ndGFiX2FkZCBlcnJvcgorCWJlZm9yZSBhZGRpbmcgQllURVNfSU5fV09SRC4KKworCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIGJlc3QgQ19GSUxFLAorCW5vdCBtZXJlbHkgdGhlIGZpcnN0LgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSWYgd2UgYXJlIG5vdCB1c2luZyB0aGUKKwlzeW1ib2wsIGNsZWFyIHRoZSBuYW1lIHNvIHRoYXQgaXQgaXMgbm90IHB1dCBpbiB0aGUgc3RyaW5nIHRhYmxlLgorCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCisKK1dlZCBBdWcgMjQgMTE6NDk6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQ2FzdCBwb2ludGVyIGRpZmZlcmVudCB0byBsb25nCisJYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCisJKiBvc2YtY29yZS5jIChvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwlkc2VjY250LgorCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfZXh0X291dCk6IElmIEVDT0ZGXzY0LCBjbGVhciByZW1haW5pbmcKKwlieXRlcyBpbiBiaXRzMi4KKworCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgorCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgb2JqX2NvbnZfdGFibGVfc2l6ZSBoZXJlLAorCXJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuCisJKGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKTogSnVzdCBpZ25vcmUgQlNGX0RFQlVHR0lORyBzeW1ib2xzLgorCUZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCisKKwkqIHNlY3Rpb24uYyAoYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkpOiBGaXggZmFpbHVyZSBjaGVjayBvZgorCWJmZF9tYWtlX2VtcHR5X3N5bWJvbC4gIEZyb20gQW50dGkuTWlldHRpbmVuQG50Yy5ub2tpYS5jb20uCisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogVXNlIHRoZSBvdXRwdXRfc2VjdGlvbgorCShhbmQgb3V0cHV0X29mZnNldCkgaWYgdGhlcmUgaXMgb25lLgorCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogRGlzY2FyZCB0aGUgc3ltYm9scworCWlmIHRoZSBhcmNoaXZlIGVsZW1lbnQgd2FzIG5vdCBuZWVkZWQuCisKKwkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBFbnN1cmUgdGhhdCBhIHplcm8gc3RyaW5nCisJaW5kZXggeWllbGRzIGFuIGVtcHR5IHN0cmluZy4KKwkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBJZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgdXNlIG5hbWUKKwlmcm9tIG9yaWdpbmFsIGhhc2ggdGFibGUgZW50cnksIG5vdCBmcm9tIGVudHJ5IGluICpzeW1faGFzaC4KKworCSogYW91dHguaCAoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvKTogQWRkIGZpZWxkcyBjb250ZW50cywKKwlyZWxvY3MsIHN5bWJvbF9tYXAgYW5kIG91dHB1dF9zeW1zLgorCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBXb3JrIG91dCB0aGUgbGFyZ2VzdCBzZWN0aW9uIHNpemUsIHJlbG9jCisJc2l6ZSwgYW5kIG51bWJlciBvZiBzeW1ib2xzLiAgVXNlIHRoZW0gdG8gcHJlYWxsb2NhdGUgYnVmZmVycyB0aGF0CisJYXJlIGxhcmdlIGVub3VnaCBmb3IgYWxsIGNhc2VzLgorCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogVXNlIHByZWFsbG9jYXRlZCBzeW1ib2xfbWFwLgorCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKKwlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgVXNlCisJcHJlYWxsb2NhdGVkIG91dHB1dF9zeW1zLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbAorCWNhbGxlcnMuICBVc2UgcHJlYWxsb2NhdGVkIGNvbnRlbnRzIGFuZCByZWxvY3MuCisJKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IFJlbW92ZSBzeW1ib2xfbWFwIGFyZ3VtZW50OyB1c2UKKwlwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcCBpbnN0ZWFkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KKworVHVlIEF1ZyAyMyAxMDo1MTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRG9uJ3QgdXBkYXRlIHRoZQorCXN5bWJvbCBtYXAgdGltZXN0YW1wIGlmIHRoZXJlIGlzIG5vIHN5bWJvbCBtYXAuICBGcm9tCisJc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCisKK01vbiBBdWcgMjIgMTI6MjY6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBBZGQgX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCisJKGJmZF90YXJnZXQpOiBBZGQgZmllbGQgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgorCSogYmZkLmMgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogbGliYmZkLWluLmggKF9iZmRfbm9hcmNoaXZlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCisJKF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlY2xhcmUuCisJKF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogQ2FsbAorCWJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGluc3RlYWQgb2YgY2hlY2tpbmcgZm9yIGEgQlNEIGFyY2hpdmUKKwlhbmQgY2FsbGluZyBic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KKwkoX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogUmVuYW1lIGZyb20KKwlfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuICBEb24ndCBhc3N1bWUgdGhhdCBhcm1hcF9kYXRlcG9zIGlzCisJYWxyZWFkeSBzZXQuCisJKiBhb3V0LXRhcmdldC5oIChNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5CisJZGVmaW5lZC4KKwkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KKwkqIGllZWUuYyAoaWVlZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgorCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgorCSogb2FzeXMuYyAob2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KKwkqIHNvbS5jIChzb21fdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KKworCSogaGFzaC5jOiBDb3B5IHN0cmluZyBoYXNoIGZ1bmN0aW9ucyBmcm9tIGFvdXR4LmguCisJKiBhb3V0eC5oOiBTdHJpbmcgaGFzaCBmdW5jdGlvbnMgbW92ZWQgdG8gaGFzaC5jLiAgUmV0YWluCisJc2ltcGxpZmllZCB2ZXJzaW9ucyBvZiBhZGRfdG9fc3RyaW5ndGFiIGFuZCBlbWl0X3N0cmluZ3RhYi4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBmdW5jdGlvbiBhbmQgc3RydWN0dXJlIG5hbWVzLgorCSogbGliYmZkLWluLmggKF9iZmRfc3RyaW5ndGFiX2luaXQsIF9iZmRfc3RyaW5ndGFiX2ZyZWUpOiBEZWNsYXJlLgorCShfYmZkX3N0cmluZ3RhYl9zaXplLCBfYmZkX3N0cmluZ3RhYl9hZGQpOiBEZWNsYXJlLgorCShfYmZkX3N0cmluZ3RhYl9lbWl0KTogRGVjbGFyZS4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCitNb24gQXVnIDIyIDEwOjQ5OjM3IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKKworCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogQ3JlYXRlIGEgZml4dXAgZm9yIGFueQorCWRlZmluZWQgYWJzb2x1dGUgc3ltYm9sLCBub3QganVzdCBHT1Qgb3IgUExUIHN5bWJvbHMuCisJKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIHJlZmVyZW5jZXMgdG8gZGVmaW5lZAorCXN5bWJvbHMuCisKK1RodSBBdWcgMTggMTY6Mjk6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJR2V0IGxkIC14IC1yIHRvIGhhbmRsZSBhLm91dCBzZXQgc3ltYm9scyBjb3JyZWN0bHkuCisJKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYyk6IElmIHRoZSAuYnNzIFZNQSB3YXMgc2V0IG91dHNpZGUgb2YKKwlCRkQsIHBhZCB0aGUgLmRhdGEgc2VjdGlvbiB1cCB0byB0aGUgVk1BIG9mIHRoZSAuYnNzIHNlY3Rpb24uCisJKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IElmIGEgc2V0IHN5bWJvbCBkb2VzIG5vdCBnZXQgbW9kaWZpZWQsCisJdHJlYXQgaXQgYXMgYSBsb2NhbCBzeW1ib2wuCisJKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogU2V0IHRoZSB2YWx1ZSBvZiBzZXQgc3ltYm9scworCWNvcnJlY3RseS4gIERvbid0IGRpc2NhcmQgc2V0IHN5bWJvbHMgZXZlbiBpZiBkaXNjYXJkaW5nIGxvY2FsCisJc3ltYm9scy4KKwkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IERvbid0IGFib3J0IG9uIGJmZF9saW5rX2hhc2hfbmV3LAorCXNpbmNlIGl0IGNhbiBub3cgaGFwcGVuIGZvciBzZXQgc3ltYm9scy4KKworCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEp1c3QgY2hlY2sgZm9yICIucmVsYSIgYW5kCisJIi5yZWwiLCBub3QgIi5yZWxhLiIgYW5kICIucmVsLiI7IG1ha2UgdGhpcyB3b3JrIGJ5IGNoZWNraW5nCisJdXNlX3JlbGFfcC4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSnVzdCBjaGVjayBmb3IgIi5yZWwiLCBub3QKKwkiLnJlbC4iCisJKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBKdXN0IGNoZWNrIGZvcgorCSIucmVsYSIsIG5vdCAiLnJlbGEuIgorCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCitXZWQgQXVnIDE3IDE2OjU0OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJbml0aWFsaXplCisJUEFTUyB0byB0aGUgb2xkIHZhbHVlICsgMS4KKworCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IElmIGEgQ19GSUxFIHN5bWJvbCBoYXMKKwlubyBhdXggZW50cmllcywgdXNlIHRoZSBzeW1ib2wgbmFtZSBhcyB0aGUgZmlsZSBuYW1lLgorCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogTG9vayBmb3IgdGhlIHJpZ2h0IENfRklMRSBzeW1ib2wsIHJhdGhlcgorCXRoYW4gYWx3YXlzIHVzaW5nIHRoZSBmaXJzdCBvbmUuICBJZiB0aGVyZSBpcyBhIGRlYnVnZ2luZyBzeW1ib2wKKwlhZnRlciBhIGZ1bmN0aW9uIHN5bWJvbCwgc2tpcCBpdC4gIEFkZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlIGxpbmUKKwlvZmZzZXQsIHNpbmNlIGl0IHdhcyBzdWJ0cmFjdGVkIG91dCBpbiBjb2ZmX3NsdXJwX2xpbmVfdGFibGUuCisKK1R1ZSBBdWcgMTYgMTY6NTM6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogSWYgd3JpdGluZyBzb21lIGZvcm0gb2YgYW4gZXhlY3V0YWJsZSwKKwlhbGxvY2F0ZSBhbmQgYXR0YWNoIGFuIGV4ZWMgaGVhZGVyIHRvIHRoZSBCRkQgcHJpdmF0ZSBkYXRhLgorCShzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IGZpbGwgZmllbGRzIG9mIHRoZSBleGVjIGhlYWRlciBiYXNlZAorCW9uIEJGRCBwcml2YXRlIGRhdGEgaGVyZSAobGlrZSB0aGUgZXhlYyBmbGFncykuICBEbyBub3Qgd3JpdGUKKwl0aGUgZXhlYyBoZWFkZXIgaGVyZS4KKwkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCisJKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBOZXcgZmllbGQgImV4ZWNfaGRyIiBmb3IgdGhlIGV4ZWN1dGFibGUKKwlmaWxlIGhlYWRlci4KKwkob2JqX3NvbV9leGVjX2hkcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KKworVHVlIEF1ZyAxNiAwMDoxMjozMSAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCisKKwkqIGkzODZsaW51eC5jIChsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIHNlY3Rpb24KKwluYW1lZCAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgorCShsaW51eF9hZGRfb25lX3N5bWJvbCk6IFVzZSAubGludXgtZHluYW1pYywgbm90IC5keW5hbWljLgorCShiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmspOiBMaWtld2lzZS4KKworTW9uIEF1ZyAxNSAxMjoxNjo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvZmZnZW4uYyAoU1RSSU5HX1NJWkVfU0laRSk6IERlZmluZS4KKwkoY29mZl9maXhfc3ltYm9sX25hbWUpOiBVc2UgU1RSSU5HX1NJWkVfU0laRSwgbm90IDQuCisJKGNvZmZfd3JpdGVfc3ltYm9scywgYnVpbGRfc3RyaW5nX3RhYmxlKTogTGlrZXdpc2UuCisJKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogTGlrZXdpc2UuCisKKwkqIGxpYmNvZmYtaW4uaCAob2JqX3N5bWJvbF9zbGV3KTogRG9uJ3QgZGVmaW5lLgorCShzdHJ1Y3QgY29mZl90ZGF0YSk6IFJlbW92ZSB1bnVzZWQgZmllbGRzIGluZGV4X3NsZXcsIHJhd19saW5lbm9zLAorCWFuZCBmbGFncy4KKwkqIGxpYmNvZmYuaDogUmVidWlsdC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3QpOiBEb24ndCBpbml0aWFsaXplIHJhd19saW5lbm9zLgorCShjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBpbml0aWFsaXplIGZsYWdzLgorCisJKiBhb3V0LXRhcmdldC5oIChNWV96bWFnaWNfY29udGlndW91cyk6IERlZmluZSBhcyAwIGlmIG5vdCBhbHJlYWR5CisJZGVmaW5lZC4KKwkoTVkoYmFja2VuZF9kYXRhKSk6IFVzZSBNWV96bWFnaWNfY29udGlndW91cywgbm90IGhhcmRjb2RlZCAwLgorCSogaTM4NmxpbnV4LmMgKE1ZX3ptYWdpY19jb250aWd1b3VzKTogRGVmaW5lLgorCisJKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IElmIGEgU0hUX1NZTVRBQiBzZWN0aW9uIGluIGEKKwlzaGFyZWQgb2JqZWN0IGhhcyBTSEZfQUxMT0Mgc2V0LCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgaXQuCisJKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUaGVyZSBtYXkgYmUgYSBCRkQgc2VjdGlvbiBmb3IgYQorCVNIVF9TWU1UQUIgc2VjdGlvbi4KKworCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBBZGQgbmFtZSBhcmd1bWVudC4gIElmIG5vIGZsYWdzCisJYXJlIHJlY29nbml6ZWQsIGNob3NlIHNlY3Rpb24gZmxhZ3MgYmFzZWQgb24gdGhlIG5hbWUuCisJKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IF9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vayBmaWVsZDogQWRkCisJbmFtZSBhcmd1bWVudC4KKwkoYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayk6IEFkZCBuYW1lIGFyZ3VtZW50LgorCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IGFkanVzdCB0aGUgc2VjdGlvbgorCXBvc2l0aW9uIGJ5IENPRkZfUEFHRV9TSVpFIHVubGVzcyBTRUNfQUxMT0MgaXMgc2V0LgorCSogbGliY29mZi5oOiBSZWJ1aWx0LgorCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBQYXNzIHNlY3Rpb24gbmFtZSB0bworCWJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2suCisJKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIHVudXNlZCBuYW1lCisJYXJndW1lbnQuCisJKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIG5hbWUgYXJndW1lbnQgdG8KKwlwcm90b3R5cGUuCisKK0ZyaSBBdWcgMTIgMTE6MjI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBDb3JyZWN0IGNoZWNrIGZvciBpbnZhbGlkCisJc2VjdGlvbiBpbmRleC4KKworCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiB0aGVyZSBpcyBubyBzeW1ib2wKKwl0YWJsZSwgdHJ5IHVzaW5nIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKKwk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisKKwkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXNvbGFyaXMyKik6IFVzZSBzb2xhcmlzMiwgbm90IHN5c3Y0LgorCVRoZSBsaW5rZXIgZGVwZW5kcyB1cG9uIGNvbmZpZ3VyaW5nIGZvciBzb2xhcmlzMi4KKwkqIGhvc3RzL3NvbGFyaXMyLmg6IE5ldyBmaWxlOyBpbmNsdWRlIGhvc3RzL3N5c3Y0LmguCisJKiBjb25maWcvc29sYXJpczIubWg6IE5ldyBmaWxlOyBjb3B5IG9mIGNvbmZpZy9zeXN2NC5taC4KKworV2VkIEF1ZyAxMCAxMzowOTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogTWFrZSBzdXJlIGRhdGEgc2VjdGlvbiBpcyBwYWRkZWQgdG8KKwlwYWdlIGJvdW5kYXJ5IHdoZW4gdGhlIFZNQSBpcyBzZXQgYnkgdGhlIGNhbGxpbmcgcHJvZ3JhbS4gIEZyb20KKwlFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisKK01vbiBBdWcgIDggMTc6MTg6NDkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJVXBkYXRlIHRvIG5zMzJrIHN1cHBvcnQsIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkuCisJKiBhb3V0LW5zMzJrLmM6IEFkZCBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIGluIGFvdXQtbnMzMmsuaCwgY2hhbmdlCisJZGVjbGFyYXRpb25zIHRvIHRyYWRpdGlvbmFsIGZvcm0uCisJKE1ZX3JlbG9jX2hvd3RvLCBNWV9wdXRfcmVsb2MpOiBDaGFuZ2UgZnJvbSBtYWNybyB0byBmdW5jdGlvbi4KKwkobnMzMmtfcmVsb2NhdGVfY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCisJKiBhb3V0LW5zMzJrLmg6IFJlbW92ZS4KKwkqIGNwdS1uczMyay5jOiBBZGQgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBpbiBhb3V0LW5zMzJrLmgsIGNoYW5nZQorCWRlY2xhcmF0aW9ucyB0byB0cmFkaXRpb25hbCBmb3JtLgorCShuczMya19maW5hbF9saW5rX3JlbG9jYXRlKTogQ2FsbCBuczMya19yZWxvY2F0ZV9jb250ZW50cy4KKwkqIG5ldGJzZDUzMi5jOiBSZWZvcm1hdCB0byBzdGFuZGFyZHMsIGFkZCBjb3B5cmlnaHQgbm90aWNlLgorCShBUkNIKTogRG9uJ3QgZGVmaW5lLgorCShhb3V0LW5zMzJrLmgpOiBEb24ndCBpbmNsdWRlLgorCSogcGM1MzItbWFjaC5jOiBEaXR0by4KKworTW9uIEF1ZyAgOCAxNzo1NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBEb24ndCB0cnkgdG8gY29udmVydCByZWxvY3MKKwlhZ2FpbnN0IGNvbW1vbiBzeW1ib2xzLgorCitTYXQgQXVnICA2IDIyOjI3OjMwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBJZ25vcmUgc2VjdGlvbnMgdGhhdAorCWFyZSBub3QgY29udGFpbmVkIGluIHRoZSBjb3JlIGZpbGUuCisKK1RodSBBdWcgIDQgMTE6MzI6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb2ZmLW02OGsuYyAobTY4a19yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KKwkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCisJKiBjZi1tNjhrbHlueC5jIChfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgorCisJKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IEZvcmNlIHRoZSB2bWEgb2Ygc2VjdGlvbnMgd2hpY2gKKwlkbyBub3QgaGF2ZSBTRUNfQUxMT0Mgc2V0IHRvIGJlIDAuICBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUKKwlyZWxvY3MgYWdhaW5zdCBkZWJ1Z2dpbmcgc2VjdGlvbnMuCisKK1dlZCBBdWcgIDMgMTY6NDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogUmV3cm90ZSB0byBjaGFuZ2UgcmVsb2NzCisJYWdhaW5zdCBsb2NhbGx5IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0IHNlY3Rpb24KKwlzeW1ib2xzLCBmb3IgVnhXb3JrcyA1LjEuCisKK1dlZCBBdWcgIDMgMTA6MzQ6MzcgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQorCisJKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBPbmx5IGhhbmRsZQorCVNIQVJBQkxFX0NPTkZMSUNUUyBzcGVjaWFsbHkgaWYgQlNGX0NPTlNUUlVDVE9SIGlzIHNldC4gIFNldCBoYXNocAorCWZvciBhIEdPVCBvciBQTFQgc3ltYm9sLiAgU2V0IGp1bXAgZmllbGQgb2YgZml4dXAgZm9yIGEgUExUIHN5bWJvbC4KKwkobGludXhfdGFsbHlfc3ltYm9scyk6IENoZWNrIHNlY3Rpb24gb2YgcmVhbCBzeW1ib2wuICBXaGVuIGxvb2tpbmcKKwlmb3IgYSBidWlsdGluIGZpeHVwLCBjaGVjayBidWlsdGluIGFuZCBqdW1wIGZsYWdzLiAgQ3JlYXRlIG5vIG1vcmUKKwl0aGFuIG9uZSBmaXh1cCwgYW5kIGFsd2F5cyBjcmVhdGUgb25lIGlmIHRoZSByZWFsIHN5bWJvbCBpcyBpbiB0aGUKKwlhYnNvbHV0ZSBzZWN0aW9uLiAgT25seSBzdHJpcCBhYnNvbHV0ZSBzeW1ib2xzLgorCitXZWQgQXVnICAzIDA1OjA4OjI0IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBzZXQgaW50ZXJuYWxfYS5tYWdpYyB0bworCUxZTlhDT0ZGTUFHSUMgd2hlbmV2ZXIgNjhrLCBTUEFSQyBvciBpMzg2IEx5bnhPUworCSh5ZXMsIHRoZXkgaGF2ZSB0aGUgc2FtZSBtYWdpYyBudW1iZXIhKQorCitUdWUgQXVnICAyIDEwOjQzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogaHAzMDBocHV4LmMgKEJNQUdJQyk6IERlZmluZSBhcyBIUFVYX0RPVF9PX01BR0lDLCB0byBtYWtlIHRlc3QKKwlpbiBhb3V0eC5oIHdvcmsgY29ycmVjdGx5LgorCisJKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgorCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQpOiBVc2UgaXQgYXMgc3BlY2lhbF9mdW5jdGlvbi4KKworCSogbGliYmZkLWluLmg6IE1vdmUgZGVjbGFyYXRpb25zIG9mIGJmZF9yZWFkLCBiZmRfd3JpdGUsIGJmZF9zZWVrLAorCWJmZF90ZWxsLCBiZmRfZmx1c2gsIGFuZCBiZmRfc3RhdCBmcm9tIGhlcmUuLi4KKwkqIGJmZC1pbi5oOiAuLi50byBoZXJlLCB0byBtYWtlIHRoZW0gdmlzaWJsZSB0byBwcm9ncmFtcyB3aGljaAorCWtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHRoYW4gQkZEIGRvZXMuCisJKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgorCitNb24gQXVnICAxIDE3OjU1OjUzIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCk6ICBDb252ZXJ0IHphbGxvYyB1c2FnZQorCXRvIGJmZF96YWxsb2MuCisKK01vbiBBdWcgIDEgMTI6MDQ6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBlbGY2NC1zcGFyYy5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCisKKwlFTEYgbGlua2VyIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisJKiBlbGZjb2RlLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKKwlfRFlOQU1JQyB0byBTVFRfT0JKRUNULgorCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBBbHdheXMgY3JlYXRlIGhhc2ggdGFibGUKKwllbnRyeS4gIFNldCB0eXBlIHRvIFNUVF9PQkpFQ1QuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBzZXQgdHlwZSBvZiB3ZWFrIGRlZmluZWQgc3ltYm9sIHRvCisJU1RCX1dFQUsgaWYgc3ltYm9sIHdhcyByZWZlcmVuY2VkLgorCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENoZWNrIERZTkFNSUMgYXMgd2VsbCBhcyBFWEVDX1AuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHR5cGUgb2YKKwlfR0xPQkFMX09GRlNFVF9UQUJMRSB0byBTVFRfT0JKRUNULgorCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBJZ25vcmUgbG9jYWwgUExUMzIgcmVsb2NzLgorCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogVHJlYXQgbG9jYWwgUExUMzIgcmVsb2NzIGFzIFBDMzIuCisKKwkqIGVsZmNvZGUuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENvcnJlY3Qgd2VhayBzeW1ib2wKKwloYW5kbGluZyBhZ2Fpbi4KKworCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUgcmVsb2NzCisJaWYgdGhlcmUgYXJlbid0IGFueS4KKworCSogY29uZmlndXJlLmhvc3QgKHNwYXJjLSotc29sYXJpczIqKTogVXNlIHN5c3Y0LCBub3Qgc29sYXJpczIuCisJKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUuCisJKiBjb25maWcvc29sYXJpczIubWg6IFJlbW92ZS4KKworU3VuIEp1bCAzMSAxNDoyNzowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jLCBlbGYzMi1ocHBhLmg6IFVwZGF0ZSBjb21tZW50IHJlZmxlY3Rpbmcgd2hpY2gKKwlIUFBBIEVMRiBzcGVjIHRoZSBjb2RlIGltcGxlbWVudHMuCisKK1R1ZSBKdWwgMjYgMTc6Mzg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY3B1LWk5NjAuYyAoTUFYX0FSQ0gpOiBOZXcgbWFjcm8uCisJKGNvbXBhdGlibGUpOiBVc2UgaXQgaW4gY29tcHV0aW5nIGFycmF5IGJvdW5kcy4gIFB1dCBjb21tYSBhZnRlcgorCWxhc3QgZW50cnkgaW4gYXJyYXksIGZvciByZWd1bGFyaXR5LgorCShhcmNoX2luZm9fc3RydWN0KTogQWRqdXN0IHNwYWNpbmcgZm9yIGVhc2llciByZWFkaW5nLgorCisJKiBjb2ZmLWk5NjAuYyAoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkLCBob3d0b19vcHRjYWxsKTogVXNlCisJSE9XVE8gbWFjcm8uCisKKwkqIGNwdS1pOTYwLmMgKEpYKTogRGVmaW5lIGFzIGJmZF9tYWNoX2k5NjBfanguCisJKHNjYW5fOTYwX21hY2gpOiBSZWNvZ25pemUganggbWFjaGluZS4KKwkoTUFYX0FSQ0gpOiBEZWZpbmUgdG8gYmUgSlguCisJKGNvbXBhdGlibGUpOiBBZGQgSlggcm93IHRvIGFycmF5LgorCShhcmNoX2luZm9fc3RydWN0KTogQWRkIEpYIGVudHJ5LgorCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pOTYwX2p4KTogTmV3IG1hY3JvLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KKworCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBGb3IgRl9JOTYwSlgsIHNldCBtYWNoaW5lCisJdG8gYmZkX21hY2hfaTk2MF9qeC4KKwkoY29mZl9zZXRfZmxhZ3MpOiBGb3IgYmZkX21hY2hfaTk2MF9qeCwgc2V0IEZfSTk2MEpYLgorCitUdWUgSnVsIDI2IDExOjA0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogV2hlbiBoYW5kbGluZyBhIHdlYWsKKwlzeW1ib2wsIGNvcnJlY3QgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGVxdWl2YWxlbnQgbm9ybWFsIHN5bWJvbAorCXdhcyByZWZlcmVuY2VkLgorCisJQWRkIHN1cHBvcnQgZm9yIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgaTM4NiBFTEYgYW5kIFNQQVJDCisJRUxGLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgY29weV9vZmZzZXQgZmllbGQuCisJQWRkIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQgZmllbGRzLgorCShFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgorCShFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDX01VTFRJUExFKTogRG9uJ3QgZGVmaW5lLgorCShFTEZfTElOS19IQVNIX05FRURTX0NPUFkpOiBEZWZpbmUuCisJKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGNoZWNrX3JlbG9jcyBmaWVsZC4KKwkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQ2hhbmdlIHJlbG9jcyBmcm9tIFBUUiB0bworCUVsZl9JbnRlcm5hbF9SZWxhICouCisJKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxvY2FsX2dvdF9vZmZzZXRzIGZpZWxkLgorCShlbGZfbG9jYWxfZ290X29mZnNldHMpOiBEZWZpbmUgYWNjZXNzb3IgbWFjcm8uCisJKGJmZF9lbGYzMl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KKwkoYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgorCShiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEZWNsYXJlLgorCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBEb24ndCB1c2UgdGhlIHNlY3Rpb24gZGF0YQorCXJlbG9jcyBmaWVsZC4KKwkoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCisJbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCkuCisJKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHB1dAorCW1ha2UgYWxsIGxvY2FsIHN5bWJvbHMgZHluYW1pYy4gIERvbid0IGJvdGhlciB3aXRoIHRoZQorCURZTkFNSUNfTVVMVElQTEUgZmxhZ3MuICBDYWxsIHRoZSBjaGVja19yZWxvY3MgYmFja2VuZCBmdW5jdGlvbiBpZgorCWl0IGlzIGRlZmluZWQuCisJKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgVXNlCisJbWFjcm8gdG8gcmVuYW1lIHRvIE5BTUUoYmZkX2VsZixsaW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKS4gIElmCisJY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0RZTkFNSUMgaXMgYWRkZWQgYXMgYQorCWR5bmFtaWMgc3ltYm9sLgorCShlbGZfbGlua19yZWFkX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KKwkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQKKwlsaWJyYXJ5LCBhbHdheXMgY3JlYXRlIHN5bWJvbHMsIGFuZCBhbHdheXMgbWFrZSB0aGVtIGR5bmFtaWMuCisJKGVsZl9iZmRfZmluYWxfbGluayk6IFBlcm1pdCBjcmVhdGlvbiBvZiBzaGFyZWQgbGlicmFyaWVzLgorCShlbGZfbGlua19pbnB1dF9iZmQpOiBVc2UgZWxmX2xpbmtfcmVhZF9yZWxvY3MgdG8gZ2V0IHRoZSByZWxvY3MuCisJKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplCisJY29weV9vZmZzZXQuICBJbml0aWFsaXplIGdvdF9vZmZzZXQgYW5kIHBsdF9vZmZzZXQuCisJKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90CisJZGVmaW5lZC4KKwkoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCisJKiBlbGY2NC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lIGFzIDAgaWYgbm90CisJZGVmaW5lZC4KKwkoZWxmNjRfYmVkKTogSW5pdGlhbGl6ZSBjaGVja19yZWxvY3MgZmllbGQuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IENoYW5nZSBSXzM4Nl9QTFQzMiBhbmQKKwlSXzM4Nl9HT1RQQyB0byBiZSBwY19yZWxhdGl2ZSBhbmQgcGNyZWxfb2Zmc2V0LgorCShlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSk6IERlZmluZS4KKwkoZWxmX2kzODZfcGljX3BsdF9lbnRyeSk6IERlZmluZS4KKwkoZWxmX2kzODZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgYSAuZ290LnBsdCBzZWN0aW9uLCBhbmQKKwlkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiBpdC4gIElmIGNyZWF0aW5nIGEKKwlzaGFyZWQgbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKKwlkeW5hbWljIHN5bWJvbC4gIERvbid0IGNyZWF0ZSAucmVsLmJzcyBpZiBjcmVhdGluZyBhIHNoYXJlZAorCWxpYnJhcnkuCisJKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKKwlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgorCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKKwlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KKwkoZWxmX2kzODZfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgorCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucworCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBSZW1vdmUgYW55IGVtcHR5IHJlbG9jCisJb3IgcGx0IHNlY3Rpb25zLiAgT25seSBhZGQgYSBEVF9ERUJVRyBlbnRyeSBpZiBub3QgY3JlYXRpbmcgYQorCXNoYXJlZCBsaWJyYXJ5LiAgT25seSBhZGQgYSBEVF9QTFRHT1QgZW50cnkgaWYgdGhlcmUgaXMgYSBQTFQuCisJQWRkIGEgRFRfVEVYVFJFTCBlbnRyeSBpZiByZXF1aXJlZC4KKwkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCB1bmRlZmluZWQgc3ltYm9scyB3aGVuCisJY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIEhhbmRsZSB0aGUgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzCisJc3BlY2lhbGx5LgorCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgYSBQTFQgZW50cnkgaWYgcGx0X29mZnNldAorCWlzIHNldC4gIElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgYSBQSUMgUExUIGVudHJ5LgorCU9ubHkgbWFyayBhIFBMVCBzeW1ib2wgYXMgdW5kZWZpbmVkIGlmIGl0IHdhcyBub3QgZGVmaW5lZCBieSBhCisJcmVndWxhciBvYmplY3QgZmlsZS4gIENyZWF0ZSBhIEdPVCBlbnRyeSBpZiBnb3Rfb2Zmc2V0IGlzIHNldC4KKwlDcmVhdGUgYSBjb3B5IHJlbG9jIGlmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSBpcyBzZXQuCisJKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogQ2hhbmdlIHRoZSBoYW5kbGluZyBvZgorCURUX1JFTFNaIHRvIHNpbXBseSBzdWJ0cmFjdCBvdXQgdGhlIHNpemUgb2YgLnJlbC5wbHQuICBJZiBjcmVhdGluZworCWEgc2hhcmVkIGxpYnJhcnksIHByb2R1Y2UgUElDIFBMVCBjb2RlLgorCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCisJKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl9TUEFSQ19HT1QxMCwKKwlSX1NQQVJDX0dPVDIyLCBhbmQgUl9TUEFSQ19QQzEwIHRvIG5vdCB3YXJuIGFib3V0IHJlbG9jIG92ZXJmbG93LgorCShlbGYzMl9zcGFyY19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIGNyZWF0aW5nIGEgc2hhcmVkCisJbGlicmFyeSwgbWFrZSBzdXJlIHRoYXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGFkZGVkIGFzIGEKKyAgICAgICAgZHluYW1pYyBzeW1ib2wsIGFuZCBzZXQgdGhlIHR5cGUgdG8gU1RUX09CSkVDVC4gIExpa2V3aXNlIGZvcgorICAgICAgICBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfLiAgRG9uJ3QgY3JlYXRlIC5yZWwuYnNzIGlmIGNyZWF0aW5nIGEKKyAgICAgICAgc2hhcmVkIGxpYnJhcnkuCisJKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgbWFrZSBhIFBMVCBlbnRyeSBpZiB0aGUKKwlzeW1ib2wgYWxyZWFkeSBoYXMgb25lLiAgV2hlbiBtYWtpbmcgYSBQTFQgZW50cnksIHNldCBwbHRfb2Zmc2V0LgorCURvbid0IGNyZWF0ZSBhIGNvcHkgcmVsb2Mgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgRG9uJ3QKKwlzZXQgY29weV9vZmZzZXQsIGp1c3Qgc2V0IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWS4KKwkoZWxmMzJfc3BhcmNfYWxsb2NhdGVfZHluYW1pY19zZWN0aW9uKTogUmVtb3ZlLgorCShlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMb29rIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucworCXJhdGhlciB0aGFuIGFzc3VtaW5nIHdlIGtub3cgdGhlaXIgbmFtZXMuICBPbmx5IGFkZCBhIERUX0RFQlVHCisJZW50cnkgaWYgbm90IGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBBZGQgYSBEVF9URVhUUkVMIGVudHJ5IGlmCisJcmVxdWlyZWQuCisJKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbgorCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBIYW5kbGUgdGhlIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcworCXNwZWNpYWxseS4KKwkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGEgUExUIGVudHJ5IGlmIHBsdF9vZmZzZXQKKwlpcyBzZXQuICBPbmx5IG1hcmsgYSBQTFQgc3ltYm9sIGFzIHVuZGVmaW5lZCBpZiBpdCB3YXMgbm90IGRlZmluZWQKKwlieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuICBDcmVhdGUgYSBHT1QgZW50cnkgaWYgZ290X29mZnNldCBpcworCXNldC4gIENyZWF0ZSBhIGNvcHkgcmVsb2MgaWYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIGlzIHNldC4KKwkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBTdG9yZSBkeW5vYmogaW4gYSBsb2NhbAorCXZhcmlhYmxlLgorCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCisKK01vbiBKdWwgMjUgMTI6MjE6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHBjNTMybWFjaF92ZWMpOiBDaGFuZ2UgdG8gcGM1MzJtYWNoYW91dF92ZWMuCisJKiBjb25maWcuYmZkIChuczMyay0qLW5ldGJzZCopOiBVc2UgbnMzMmstbmJzZCBhcyBiZmRfbmFtZS4KKwkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LW5zMzJrLm8uCisJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtbnMzMmsubywgbmV0YnNkNTMyLm8sIG04OGttYWNoMy5vLAorCXBjNTMyLW1hY2guby4KKwkqIHRhcmdldHMuYyAocGM1MzJtYWNoYW91dF92ZWMpOiBVc2UgaW5zdGVhZCBvZiBwYzUzMm1hY2hfdmVjLgorCSogY29uZmlnL3BjNTMyLW1hY2gubXQgKERFRkFVTFRfVkVDVE9SKTogRGl0dG8uCisJKFNFTEVDVF9WRUNTKTogUmVtb3ZlLgorCSogY29uZmlnL25zMzJrLW5ic2QubXQ6IE5ldyBmaWxlLCB3YXMgbnMzMmstbmV0YnNkLm10LgorCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdDogUmVtb3ZlLCBuYW1lIHRvbyBsb25nLgorCitGcmkgSnVsIDIyIDExOjA3OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBXaGVuIGNoYW5naW5nIGEKKwlzeW1ib2wgdG8gY29tbW9uLCBzZXQgdGhlIGFsaWdubWVudC4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBXaGVuIGNyZWF0aW5nIGEgY29tbW9uIHN5bWJvbCwKKwlzZXQgdGhlIGFsaWdubWVudC4KKwkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogV2hlbiBjaGFuZ2luZyBhIHN5bWJvbCB0bworCWNvbW1vbiwgc2V0IHRoZSBhbGlnbm1lbnQuCisJKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlc3RyaWN0IHRoZSBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sCisJdG8gdGhlIGFsaWdubWVudCBwb3dlciBnaXZlbiBieSB0aGUgYXJjaGl0ZWN0dXJlLgorCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogUmVtb3ZlIGFsaWduIGZpZWxkLiAgQWRkCisJY29weV9vZmZzZXQgZmllbGQuCisJKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFN0b3JlIGFsaWdubWVudCBpbgorCW5ldyBiZmRfbGlua19oYXNoX2VudHJ5IGZpZWxkLCBub3QgaW4gZWxmX2xpbmtfaGFzaF9lbnRyeSBmaWVsZC4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFNpbWlsYXIgY2hhbmdlIHdoZW4gZ2V0dGluZyBhbGlnbm1lbnQuCisJKiBlbGYuYyAoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplIGFsaWduLiAgRG8KKwlpbml0aWFsaXplIGNvcHlfb2Zmc2V0LgorCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgY29weV9vZmZzZXQKKwlmaWVsZCByYXRoZXIgdGhhbiBhbGlnbiBmaWVsZC4gIEdldCBhbGlnbm1lbnQgdXNpbmcgYmZkX2xvZzIKKwlyYXRoZXIgdGhhbiBzd2l0Y2guCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlIGNvcHlfb2Zmc2V0LAorCW5vdCBhbGlnbi4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEp1c3QgY2hlY2sKKwlTVEFUX0ZPUl9FWEVDLCBkb24ndCBjaGVjayBNQUNILgorCSogbTg4a21hY2gzLmMgKE1BQ0gpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvaTM4Ni1tYWNoMy5tdCAoVERFRklORVMpOiBEZWZpbmUgU1RBVF9GT1JfRVhFQy4KKwkqIGNvbmZpZy9tODhrLW1hY2gzLm10IChUREVGSU5FUyk6IExpa2V3aXNlLgorCSogY29uZmlnL21pcHMtbWFjaDMubXQgKFRERUZJTkVTKTogTGlrZXdpc2UuCisKK1RodSBKdWwgMjEgMTc6MjQ6MzEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBpMzg2bWFjaDMuYzogUmV2ZXJ0ZWQgdG8gdmVyc2lvbiBmcm9tIGJlZm9yZSBKdWwgNSAxOTk0IGNoYW5nZXMuCisKK1RodSBKdWwgMjEgMTI6MjY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiByZWxvYy5jIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogUmVtb3ZlIHNwZWNpYWxfZnVuY3Rpb24xLgorCUl0J3MgdGhlIHdyb25nIHdheSB0byBkbyB0aGluZ3MuCisJKEhPV1RPKTogQ2hhbmdlIGFjY29yZGluZ2x5LgorCShIT1dUTzIpOiBSZW1vdmUuCisJKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFJlbW92ZSByZWZlcmVuY2VzIHRvCisJc3BlY2lhbF9mdW5jdGlvbjEuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bworCXNwZWNpYWxfZnVuY3Rpb24xLgorCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgorCitXZWQgSnVsIDIwIDE1OjQ2OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBycGF0aAorCWFyZ3VtZW50LiAgSWYgaXQgaXMgbm90IE5VTEwsIHVzZSBpdCB0byBzZXQgRFRfUlBBVEguCisJKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCisJKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworU2F0IEp1bCAxNiAyMToxMDozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIHRoZXJlIGlzIG5vCisJZHluYW1pYyBzeW10YWIsIHJldHVybiBlcnJvci4KKworCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLKTogRGVmaW5lLgorCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBhcworCXdlYWssIHNldCBFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGFzIHdlYWssIG1hcmsgaXQKKwlTVEJfV0VBSy4KKworCSogbGliZWxmLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxvY3MgZmllbGQuCisJKHNoZHJfbmFtZSk6IFJlbW92ZTsgdW51c2VkLgorCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoIFJFTAorCWFuZCBSRUxBIHJlbG9jcy4gIEZyZWUgdXAgdGhlIHVuc3dhcHBlZCByZWxvY3MuICBQZXJtaXQgdGhlIHJlbG9jcworCXRvIGJlIGNhY2hlZCBpbiB0aGUgc2VjdGlvbl9kYXRhLiAgQ29ycmVjdCB0aGUgcmVsb2MgYWRkcmVzcy4KKwkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IFJlbW92ZS4KKwkoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFJld3JvdGUuCisJKGVsZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgcmVsb2NzIHRvIGJlIGNhY2hlZCBpbiB0aGUKKwlzZWN0aW9uIGRhdGEuCisKK1NhdCBKdWwgMTYgMTM6NTU6MzggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcuYmZkIChtODgqLWhhcnJpcy1jeHV4Kik6IFJlY29nbml6ZS4KKwkqIGhvc3RzL2hhcnJpcy5oIChQT1NJWF9VVElNRSwgSEFWRV9QUk9DRlMpOiBEZWZpbmUuCisKKwkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLWF0YXJpLXN5c3Y0Kik6IE5ldyBob3N0LgorCShtNjgqLWNibS1zeXN2NCopOiBVc2UgbTY4a3Y0IGluc3RlYWQgb2YgYW1peC4KKwkqIGhvc3RzL2FtaXguaDogUmVtb3ZlLgorCSogaG9zdHMvbTY4a3Y0Lmg6IE5ldyBmaWxlLCB3YXMgYW1peC5oLgorCitUaHUgSnVsIDE0IDE1OjEyOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCwgYmZkX3R5cGUsIHN0cnVjdAorCXJlbG9jX2hvd3RvX3N0cnVjdCwgcmVsb2NfaG93dG9fdHlwZSwgSE9XVE8sIEhPV1RPMik6IENvcGllZAorCWNoYW5nZXMgb3ZlciBmcm9tIGJmZC1pbjIuaCBzbyB0aGV5IGdldCBnZW5lcmF0ZWQgcHJvcGVybHkgbmV4dAorCXRpbWUgc29tZW9uZSBydW5zICJtYWtlIGhlYWRlcnMiLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCisJKiB0YXJnZXRzLmMgKG5ldGJzZDUzMl92ZWMsIHBjNTMybWFjaF92ZWMpOiBEZWNsYXJlIGNvbnN0LgorCShtODhrbWFjaDNfdmVjKTogUmVzdG9yZSBkZWxldGVkIGRlY2xhcmF0aW9uLgorCisJKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIHRhcmdldCB2ZWN0b3IgbmFtZXMuCisKKwkqIGNvbmZpZy9wYzUzMm1hY2gubWg6IE5ldyBmaWxlLgorCShIREVQRklMRVMsIEhERUZJTkVTKTogRGVmaW5lIGhlcmUuCisJKiBjb25maWcvcGM1MzItbWFjaC5tdCAoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlbGV0ZWQuCisJKiBjb25maWcvbnMzMmstbmV0YnNkLm10IChIREVQRklMRVMsIEhERUZJTkVTKTogRGVsZXRlZC4KKworCVN1biBKdWwgMTAgMDA6MDQ6MjAgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCisKKwkqIHBjNTMyLW1hY2guYzogTmV3IEZpbGUuIHBjNTMyLW1hY2ggYS5vdXQgZm9ybWF0LgorCisJKiBuZXRic2Q1MzIuYzogTmV3IGZpbGUuIHBjNTMyLW5ldGJzZDUzMiBhLm91dCBmb3JtYXQuCisKKwkqIGhvc3RzL3BjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCBob3N0IHN1cHBvcnQuCisKKwkqIGNwdS1uczMyay5jOiBOZXcgZmlsZS4gbnMzMmsgc3VwcG9ydCBjcHUgc3BlY2lmaWMgY29kZSByYXRoZXIKKwl0aGFuIGZvcm1hdCBzcGVjaWZpYyBjb2RlLgorCisJKiBjb25maWcvcGM1MzItbWFjaC5tdDogTmV3IGZpbGUuIFN1cHBvcnQgZm9yIHBjNTMyLW1hY2ggdGFyZ2V0LgorCisJKiBjb25maWcvbnMzMmstbmV0YnNkLm10OiBOZXcgZmlsZS4gU3VwcG9ydCBmb3IgbmV0YnNkNTMyIHRhcmdldC4KKworCSogYW91dC1uczMyay5jLCBhb3V0LW5zMzJrLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIGFvdXQgZm9ybWF0IGZvcgorCW5zMzJrIHNlcmllcy4gCisKKwkqIHRhcmdldHMuYzogQWRkIG5ldGJzZDUzMl92ZWMgYW5kIHBjNTMybWFjaGFvdXRfdmVjIGludG8KKwliZmRfdGFyZ2V0X3ZlY3RvciBhcnJheS4gTW92ZSBuZXRic2QzODZfdmVjIHRvIGFscGhhYmV0aWMgb3JkZXIKKwlsb2NhdGlvbi4KKworCSogcmVsb2MuYyAoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKSBBZGQgc3VwcG9ydCBmb3IKKwlzcGVjaWFsX2Z1bmN0aW9uMSBpbiBob3d0by4KKworCSogbGliYW91dC5oOiBhZGQgTV9OUzMyMDMyLCBNX05TMzI1MzIsIE1fNTMyX05FVEJTRCBlbnRyaWVzIGluCisJbWFjaGluZV90eXBlIGVudW0uCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIHBjNTMybWFjaF92ZWMgYW5kIG5ldGJzZDUzMl92ZWMgZW50cmllcy4KKworCSogY29uZmlnLmJmZDogYWRkIHBjNTMybWFjaCBob3N0IGVudHJpZXMuIFVzZSBmb3IgYm90aAorCW5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZC4KKworCSogY29uZmlnLmJmZDogaXQgZG9lc24ndCB3b3JrIHRvIHVzZSBpMzg2LW1hY2gzIGZvciBuczMyayotKi1tYWNoLgorCWFkZCBuczMyay1wYzUzMi1tYWNoKiBhbmQgbnMzMmstKi1uZXRic2QqIGVudHJpZXMuCisKKwkqIGJmZC1pbjIuaDogQWRkIG5zMzJrIHNwZWNpZmljIHJlbG9jYXRpb25zIHRvIGJmZF9yZWxvY19jb2RlX3JlYWwKKwllbnVtLgorCisJKiBiZmQtaW4yLmg6IEFkZCBzcGVjaWFsX2Z1bmN0aW9uMSB0byBzdHJ1Y3QgaG93dG8uIENoYW5nZSBIT1dUTworCWFuZCBORVdIT1dUTyBtYWNyb3MgdG8gbWFrZSBzcGVjaWFsX2Z1bmN0aW9uMSBOVUxMLiBOZXd3IEhPV1RPMgorCW1hY3JvLgorCisJKiBiZmQtaW4yLmg6IFNwbGl0IGRlZmluaXRpb24gb2Ygc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAorCWFuZCBjb3JyZXNwb25kaW5nIHR5cGVkZWYgaW50byB0d28gc3RhdGVtZW50cy4KKworCSogYmZkLWluMi5oOiBBZGQgZW50cnkgYmZkX2FyY2hfbnMzMmsgdG8gYmZkX2FyY2hpdGVjdHVyZSBlbnVtLgorCisJKiBhcmNodXJlcy5jOiBBZGQgYmZkX25zMzJrX2FyY2ggcHJvdG90eXBlLCBhbmQgZW50cnkgaW4KKwlhcmNodXJlc19pbml0X3RhYmxlLiAKKworCSogYW91dHguaCAoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBBbGxvdyBmb3IgdGFyZ2V0IGRlcGVuZGVudAorCU1ZX3B1dF9yZWxvYyBtYWNyby4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQgc3BlY2lhbF9mdW5jdGlvbjEKKwl0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4gCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IEFsbG93IGZvciB0YXJnZXQKKwlkZXBlbmRlbnQgZGV0ZXJtaW5hdGlvbiBvZiByZWxvYyBob3d0by4gQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQKKwlzcGVjaWFsX2Z1bmN0aW9uMSB0byBhcHBseSB0aGUgcmVsb2NhdGlvbi4KKworCSogYW91dHguaCAoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGV0ZWN0IGJzcyBhbmQgcmV0dXJuIDAuCisKKwkqIGFvdXR4LmggKHNsdXJwX3JlbG9jX3RhYmxlKTogRGV0ZWN0IGJzcyBhbmQgc3VjY2VzZnVsbHkgcmVhZAorCXplcm8gcmVsb2MgZW50cmllcy4KKworCSogYW91dHguaCAobWFjaGluZV90eXBlKTogQWRkIGJmZF9hcmNoX25zMzJrIGNhc2UuCisKKwkqIGFvdXR4Lmg6IFN0YXQgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFibGUgc3RhdHVzIGlmIFNUQVRfRk9SX0VYRUMKKwlpcyBkZWZpbmVkIChub3QganVzdCBNQUNIKS4gVXNlIGZzdGF0IGluc3RlYWQgb2Ygc3RhdCBhbmQgY2hlY2sKKwlmb3IgZnN0YXQgZXJyb3IuCisKKwkqIGFvdXR4Lmg6IEFsbG93IHRhcmdldCBkZXBlbmRlbnQgc3dhcF9zdGRfcmVsb2Nfe2luLG91dH0uCisKKwkqIGFvdXR4Lmg6IEFsbG93IENUT1JTIHJlbG9jIGluZm8gdG8gYmUgaW4gdGFyZ2V0IGRlcGVuZGVudCByZWxvYworCXRhYmxlLgorCisJKiBhb3V0LXRhcmdldC5oOiBBcHBseSBTV0FQX01BR0lDIChpZiBkZWZpbmVkKSBhZnRlcgorCXN3YXBfZXhlY19oZWFkZXJfaW4sIG90aGVyd2lzZSB3ZSBoYXZlIG1hZ2ljIGluIHRoZSB3cm9uZyBvcmRlci4KKworVGh1IEp1bCAxNCAxMTo0NzoyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IEhhdmUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KKworVHVlIEp1bCAxMiAxMjowODoxMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFpeDM4Ni1jb3JlLmMsIGFvdXRmMS5oLCBjaXNjby1jb3JlLmMsIGVsZmNvZGUuaCwgaHBwYWJzZC1jb3JlLmMsCisJaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLCBseW54LWNvcmUuYywgb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywKKwlyczYwMDAtY29yZS5jLCB0cmFkLWNvcmUuYzogIFJlbW92ZSBTRUNfQUxMT0MgZmxhZyBmcm9tIC5yZWcKKwlzZWN0aW9ucywgLnJlZyBzZWN0aW9ucyBhcmUgbm90IGFsbG9jYXRlZCBhbmQgY29udGFpbiBkZWJ1ZworCWluZm9ybWF0aW9uIG9ubHkuCisJKiBvc2YtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbiwgb3NmX2NvcmVfY29yZV9maWxlX3ApOiAgVXNlCisJYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgaW5zdGVhZCBvZiBidWlsZGluZyB1bmlxdWUgc2VjdGlvbiBuYW1lcy4KKworVHVlIEp1bCAxMiAxMTo0MToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGxpYmVsZi5oIChiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4pOiBEZWNsYXJlLgorCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luLCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0KTogRGVjbGFyZS4KKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGVfaW5pdCk6IENvcnJlY3QgY2FzdC4KKworCSogYW91dC1lbmNhcC5jIChBUkNIKTogRG9uJ3QgZGVmaW5lLiAgT2Jzb2xldGUuCisJKiBhb3V0MC5jLCBhb3V0eC5oLCBnZW4tYW91dC5jLCBocDMwMGJzZC5jLCBocDMwMGhwdXguYzogTGlrZXdpc2UuCisJKiBpMzg2YW91dC5jLCBpMzg2YnNkLmMsIGkzODZkeW5peC5jLCBpMzg2bGludXguYzogTGlrZXdpc2UuCisJKiBpMzg2bHlueC5jLCBtNjhrbHlueC5jLCBtaXBzYnNkLmMsIG5ldGJzZDM4Ni5jOiBMaWtld2lzZS4KKwkqIG5ld3NvczMuYywgc3BhcmNseW54LmMsIHN1bm9zLmM6IExpa2V3aXNlLgorCitNb24gSnVsIDExIDIwOjA4OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IE1ha2UgdGhlIHNpeHRoIGFyZ3VtZW50IGJvb2xlYW4sIG5vdAorCXRoZSBzZXZlbnRoLiAgRnJvbSBnYXJ5QHR1dmEucGFjc2VtaS5vei5hdSAoZ2FyeSBrb3BmZikuCisKK1N1biBKdWwgMTAgMDk6MTI6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IENoYW5nZSBuYW1lIG9mIEZSRUUgdG8gQkZDSV9GUkVFCisJaW4gb3JkZXIgbm90IHRvIGNvbGxpZGUgd2l0aCBMeW54T1MncyBkZWZpbml0aW9uIG9mIEZSRUUgaW4KKwkvdXNyL2luY2x1ZGUvc3lzL3Byb2MuaAorCitUaHUgSnVsICA3IDE0OjE4OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IGNsb2JiZXIgdGhlIHJlbG9jYXRpb24KKwl2YWx1ZSBmb3IgY29mZi1JbnRlbC1saXR0bGUgb3IgY29mZi1JbnRlbC1iaWcuICBIYWNrIHVwb24gaGFjay4KKworVGh1IEp1bCAgNyAxMDoxMDozNCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6ICBBZGQgZW50cnkgZm9yIEdPVCByZWxvY2F0aW9ucworCXdoaWNoIGFyZSBwcmVzZW50IGluIHN1bjMgc2hhcmVkIGxpYnJhcmllcywgdG8gYXZvaWQgYXNzZXJ0aW9ucworCXdoZW4gcmVhZGluZyB0aGUgZHluYW1pYyByZWxvY2F0aW9ucy4KKworVGh1IEp1bCAgNyAxMDoxOToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmggKFJfSFBQQV9DT01QTEVYKTogRml4IGR1bWIgdHlwby4gCisKK1dlZCBKdWwgIDYgMTk6MjE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBob3N0cy9zeXN2NC5oIChxc29ydCwgc3RydG9sKTogRG9uJ3QgZGVjbGFyZS4KKworCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogRG9uJ3QgY2FsbCBvdXRwdXRfc3ltYm9sX2hvb2sKKwlpZiBpdCBpcyBOVUxMLgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBBZGQgaWdub3JlZCBpbmZvCisJYXJndW1lbnQgdG8gY29ycmVzcG9uZCB0byByZWNlbnQgbGliZWxmLmggY2hhbmdlLgorCitXZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogIE5ldyBob29rIHRvCisJYWRkaXRpb25hbGx5IGNvcHkgb2JqZWN0IHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYWxwaGEgZmlsZQorCWhlYWRlciB0byB0aGUgQkZEIGZsYWdzLgorCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiAgVXNlIGl0LgorCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiAgQWRkIERZTkFNSUMgdG8gb2JqZWN0X2ZsYWdzLgorCSogYW91dDY0LmM6ICBGaXggdHlwbyBpbiBjb25kaXRpb25hbCBRTUFHSUMgZGVmaW5pdGlvbi4KKworV2VkIEp1bCAgNiAwMDoxMzoxNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCk6IFNhbml0eSBjaGVjayB0aGUKKwl2YWx1ZSBvZiBjbGlja3N6IHRvIGhlbHAgd2VlZCBvdXQgbm9uIEhQUEEgQlNEIGNvcmUgZmlsZXMuCisKK1R1ZSBKdWwgIDUgMTM6MjY6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJTWFjaCAzIHN1cHBvcnQuCisJKiBjb25maWcuYmZkIChtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6CisJTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaG9zdCAoaVszNF04Ni0qLW1hY2gzKiwgbnMzMmstKi1tYWNoMyopOiBSZWNvZ25pemUKKwkibWFjaDMiIGluc3RlYWQgb2YgIm1hY2giLgorCShtODgqLSotbWFjaDMqLCBtaXBzKi1kZWMtbWFjaDMqLCBtaXBzKi0qLW1hY2gzKik6IE5ldyBob3N0cy4KKwkqIHRhcmdldHMuYyAobTg4a21hY2gzX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2bWFjaDNfdmVjIGFuZCBtODhrbWFjaDNfdmVjLCBidXQKKwlpbnNpZGUgI2lmIDAuCisJKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApIFtNQUNIXTogUmVjb2duaXplIGV4ZWN1dGFibGVzIGJ5CisJY2hlY2tpbmcgZm9yIGV4ZWN1dGUgcGVybWlzc2lvbiwgaW5zdGVhZCBvZiBsb29raW5nIGF0IGVudHJ5CisJcG9pbnQuCisJKiBpMzg2bWFjaDMuYzogVXBkYXRlLCBkZWZpbmUgTUFDSCwgTl9UWFRPRkYsIE5fVFhUQUREUiwKKwlOX1NIQVJFRF9MSUIsIGRvbid0IGluY2x1ZGUgYW91dC8qLmggZmlsZXMsIGV0Yy4KKwkqIG04OGttYWNoMy5jOiBOZXcgZmlsZSwgbTg4ayBNYWNoIDMgdGFyZ2V0LgorCSogY29uZmlnL204OGstbWFjaDMubXQsCWNvbmZpZy9taXBzLW1hY2gzLm10OiBOZXcgZmlsZXMsIHRhcmdldAorCW1ha2VmaWxlIGZyYWdtZW50cy4KKwkqIGNvbmZpZy9pMzg2bWFjaDMubWgsIGNvbmZpZy9tODhrbWFjaDMubWgsIGNvbmZpZy9taXBzbWFjaDMubWg6CisJTmV3IGZpbGVzLCBob3N0CW1ha2VmaWxlIGZyYWdtZW50cy4KKwkqIGhvc3RzL204OGttYWNoMy5oLCBob3N0cy9taXBzbWFjaDMuaDogTmV3IGZpbGVzLCBob3N0IGRlZmluaXRpb25zLgorCitUdWUgSnVsICA1IDEzOjU2OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogR2V0IGFsaWdubWVudCBvZiBjb21tb24gc3ltYm9sIGZyb20KKwlzdF92YWx1ZSBmaWVsZCBvZiBzYXZlZCBFTEYgc3ltYm9sIGluZm9ybWF0aW9uLCBpZiB0aGVyZSBpcyBhbnkuCisKK01vbiBKdWwgIDQgMTk6MTM6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5oIChSX0hQUEFfQ09NUExFWCk6IERlZmluZS4KKwkqIGVsZjMyLWhwcGEuaCAoUl9IUFBBX0NPTVBMRVgpOiBEZWZpbmUuCisJKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IERlbGV0ZSBSX1BBUklTQ19TVFVCX0NBTExfMTcuCisKK0ZyaSBKdWwgIDEgMTI6MDc6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIFN1cHBvcnQgY29kZSBmb3IgZW5hYmxpbmcgdGhlIG5ldyBzdHlsZSBsaW5rZXIgZm9yIFBBIEVMRi4KKwkqIGVsZmNvZGUuaCAoc3dhcF9zeW1ib2xfaW4sIHN3YXBfc3ltYm9sX291dCk6IEV4dGVybmFsaXplLgorCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUGFzcyBsaW5rX2luZm8gdG8KKwl0aGUgYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBob29rLgorCShiZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFBhc3MgTlVMTCBmb3IgbmV3IGxpbmtfaW5mbworCWFyZ3VtZW50IHRvIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4KKwkoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IEFjY2VwdCBuZXcgImlucHV0X3NlY3Rpb24iIGFyZ3VtZW50IGZvcgorCXRoZSBzeW1ib2xzJ3MgaW5wdXQgc2VjdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBDYWxsIHRoZQorCWxpbmtfb3V0cHV0X3N5bWJvbF9ob29rIGlmIGl0J3MgZGVmaW5lZC4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2FsbCB0aGUgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIGlmCisJaXQncyBkZWZpbmVkLgorCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRGVjbGFyZS4KKwkoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFkZCBuZXcgImluZm8iIGFyZ3VtZW50LgorCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCisJKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBQcm92aWRlCisJYSBkZWZhdWx0IGRlZmluaXRpb24uCisJKGVsZjMyX2JlZCk6IEFkZCBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vay4KKwkqIGVsZjY0LXRhcmdldC5oOiBMaWtld2lzZS4KKwkKKwkqIE1ham9yIHJld29yayBvZiB0aGUgUEEgRUxGIGNvZGUuICBVc2VzIHRoZSBuZXcgc3R5bGUgQkZECisJbGlua2VyLCBtYWpvciBjbGVhbnVwcy4KKwkqIGhwcGFfc3R1YnMuaDogUmV3cml0ZSBmcm9tIHNjcmF0Y2guICBNdWNoIHNtYWxsZXIgYW5kIHNpbXBsZXIuCisJKiBlbGYzMi1ocHBhLmg6IERlbGV0ZSBhbGwgc3ltYm9sIGV4dGVuc2lvbiByZWxhdGVkIGNvZGUuCisJKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgorCShlbGYzMl9ocHBhX3NpemVfc3R1YnMsIGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMpOiBOZXcgZGVjbHMuCisJKiBlbGYzMi1ocHBhLmM6IFN5bWJvbCBleHRlbnNpb24gc3R1ZmYgbW92ZWQgZm9ybSBlbGYzMi1ocHBhLmgKKwlpbnRvIGVsZjMyLWhwcGEuYy4gIERvIG5vdCBpbmNsdWRlIGFvdXQ2NC5oLgorCSh0eXBkZWYgaHBwYV9zdHViX3R5cGUpOiBEZWxldGUuCisJKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3Rfc3RydWN0KTogRGVsZXRlLgorCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb25fc3RydWN0KTogRGVsZXRlLgorCShhcmdfcmVsb2NfdHlwZSk6IFVzZSBzaW1wbGVyIGVudW1lcmF0aW9ucy4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCisJKGFyZ19sb2NhdGlvbiwgYXJnX3JlbG9jX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KKwkoZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zdHJ1Y3QpOiBEZWxldGUuCisJKGdldF9zeW1ib2xfdmFsdWUpOiBEZWxldGUuCisJKGVsZjMyX2hwcGFfZ2V0X3N5bV9leHRuKTogRGVsZXRlLgorCShmaW5kX3N0dWJzLCBuZXdfc3R1YnMsIHR5cGVfb2ZfbWlzbWF0Y2gpOiBEZWxldGUuCisJKGZpbmRfc3R1Yl9ieV9uYW1lLCBhZGRfc3R1Yl9ieV9uYW1lKTogRGVsZXRlLgorCShocHBhX2VsZl9zdHViX2ZpbmlzaCwgaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IERlbGV0ZS4KKwkoaHBwYV9lbGZfYXJnX3JlbG9jX25lZWRlZCk6IFJlbmFtZWQuICBTaW1wbGlmeS4KKwkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIsIGhwcGFfZWxmX2NyZWF0ZV9zdHViX3NlYyk6IERlbGV0ZS4KKwkoaHBwYV9lbGZfbG9uZ19icmFuY2hfbmVlZGVkX3ApOiBEZWxldGUuCisJKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZS4KKwkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWxldGUuCisJKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZyk6IERlbGV0ZS4KKwkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlbGV0ZS4KKwkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVsZXRlLgorCShlbGYzMl9ocHBhX2JhY2tlbmRfZmFrZV9zZWN0aW9ucyk6IERlbGV0ZS4KKwkoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlbGV0ZS4KKwkoTkVXX0lOU1RSVUNUSU9OKTogRGVsZXRlLgorCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRGVsZXRlLgorCShlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQpOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2spOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViKTogTmV3IGZ1bmN0aW9uLgorCShlbGYzMl9ocHBhX3NpemVfb2Zfc3R1Yik6IE5ldyBmdW5jdGlvbi4KKwkoZWxmMzJfaHBwYV9idWlsZF9vbmVfc3ViKTogTmV3IGZ1bmN0aW9uLgorCShlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgorCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCisJKGxpbmtlciwgc3R1YiBhbmQgYXJndW1lbnQgaGFzaCB0YWJsZXMpOiBBZGQgYXBwcm9wcmlhdGUKKwlzdHJ1Y3R1cmVzLCBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBhbGwgdGhyZWUKKwloYXNoIHRhYmxlcy4KKwkoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IERvbid0IG5lZWQgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24KKwlpbiB0aGlzIGZ1bmN0aW9uLgorCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogQWNjZXB0IGEgc3ltYm9sJ3MgYXJndW1lbnQgbG9jYXRpb24KKwlpbmZvcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIGl0c2VsZi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogU2ltcGxpZnkuCisJKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3R1YiBzZWN0aW9uIGlzIG5vIGxvbmdlciBzcGVjaWFsLgorCShocHBhX2VsZl9yZWxvYyk6IEdyZWF0bHkgc2ltcGxpZnkuCisJKGVsZjMyX2hwcGFfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IEFjY2VwdCBsaW5rX2luZm8gYXJndW1lbnQuCisJSGFuZGxlIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBCRkQgYmFja2VuZCBsaW5rZXIuCisJKGVsZjMyX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgorCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbG9uZ2VyIGNhbGwgc3R1Yl9maW5pc2guCisJCitNb24gSnVuIDI3IDE4OjA3OjA2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFB1dCBpbiBwYXJlbnMgdG8gZ2V0CisJcHJlY2VkZW5jZSByaWdodC4KKworU3VuIEp1biAyNiAxODowODoyOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogbGliZWxmLmggKHJlbG9jYXRlX3NlY3Rpb24pOiBOZXcgYXJndW1lbnQgIm91dHB1dF9uYW1lcyIgYWRkZWQKKwl0byBwcm90b3R5cGUuCisJKiBlbGZjb2RlLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IE5ldyBhcmd1bWVudCAib3V0cHV0X25hbWVzIgorCWFkZGVkIHRvIHByb3RvdHlwZSBvZiByZWxvY2F0ZV9zZWN0aW9uLiAgUGFzcyB0aGUgb3V0cHV0IHN5bWJvbAorCW5hbWVzIHRvIHJlbG9jYXRlX3NlY3Rpb24uCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgIm91dHB1dF9uYW1lcyIgdG8KKwlkZXRlcm1pbmUgdGhlIG5hbWUgb2YgYSBsb2NhbCBzeW1ib2wuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKworRnJpIEp1biAyNCAwODoxNTo0MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwlBZGQgU29sYXJpcyBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzIGl0IHRvIHJ1bgorCVN1bk9TNCBhLm91dCBmaWxlcykgY29yZSBmaWxlIGhhbmRsaW5nLgorCSogYW91dGYxLmggKGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUsIHN3YXBjb3JlX3NvbGFyaXNfYmNwKToKKwlOZXcgc3RydWN0dXJlIGFuZCBpdHMgc3dhcCBpbiBmdW5jdGlvbi4KKwkoaW50ZXJuYWxfc3Vub3NfY29yZSk6ICBOZXcgbWVtYmVyIGNfZGF0YV9hZGRyLCB0byByZWNlaXZlIHRoZQorCXN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VjdGlvbiBpbiB0aGUgY29yZSBmaWxlLgorCShzd2FwY29yZV9zdW4zLCBzd2FwY29yZV9zcGFyYywgc3Vub3M0X2NvcmVfZmlsZV9wKTogIFVzZSBpdC4KKwkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlY29nbml6ZSBTb2xhcmlzIEJDUCBjb3JlIGZpbGUuCisJKHN1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiAgQWx3YXlzIGluZGljYXRlIG1hdGNoCisJZm9yIFNvbGFyaXMgQkNQIGNvcmUgZmlsZXMuCisKK1RodSBKdW4gMjMgMTU6MzE6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzLCBmcm9tIEVyaWMKKwlZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgorCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBJZiBEWU5BTUlDLCBzZXQgZV90eXBlIHRvIEVUX0RZTi4KKwkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LAorCWNyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIGZvciBmaXJzdCBpbnB1dCBCRkQgd2l0aCB0aGUgcmlnaHQgZm9ybWF0LgorCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyZWF0ZSAuaW50ZXJwIHNlY3Rpb24KKwlpZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorCShlbGZfbGlua19pbnB1dF9iZmQpOiBTa2lwIGR5bmFtaWMgc2VjdGlvbnMgaW4gaW5wdXQgZmlsZS4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgaXQncyBPSyBmb3IKKwlkeW5vYmogdG8gaGF2ZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19JTl9NRU1PUlkuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc2V0IC5pbnRlcnAKKwlzZWN0aW9uIGlmIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCisJKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IERvbid0IHNldCBEWU5BTUlDIGp1c3QgYmVjYXVzZSB0aGVyZQorCWlzIGFuIFNIVF9EWU5BTUlDIHNlY3Rpb24uCisKKwkqIGNmLWkzODZseW54LmMgKGkzODZjb2ZmX3ZlYyk6IERvbid0IGluY2x1ZGUgRFlOQU1JQyBpbgorCW9iamVjdF9mbGFncy4KKwkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IExpa2V3aXNlLgorCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV92ZWMpOiBMaWtld2lzZS4KKworCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzZXQgU0VDX1JFTE9DCisJanVzdCBiZWNhdXNlIERZTkFNSUMgaXMgc2V0LgorCitUaHUgSnVuIDIzIDEyOjUzOjQxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cyBhbmQKKwktLXdpdGgtNjQtYml0LWJmZCB0byAtLWVuYWJsZS02NC1iaXQtYmZkLgorCSogTWFrZWZpbGUuaW4sIG1wdy1tYWtlLmluLCB0YXJnZXRzLmM6IENoYW5nZSBjb21tZW50cy4KKworV2VkIEp1biAyMiAxNzo1OTo1OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcuYmZkIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZQorCXBvd2VycGMtKi1zeXN2NCouCisKKwkqIGxpbmtlci5jIChGQUlMKTogVW5kZWZpbmUgbWFjcm8gYmVmb3JlIGRlZmluaW5nIGFzIGVudW0uCisKK1dlZCBKdW4gMjIgMTA6NTI6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IEluaXRpYWxpemUKKwlwYXNzIGZyb20gYWJmZC0+YXJjaGl2ZV9wYXNzLCBhbmQgc2F2ZSBpdCB0aGVyZSBhcyB3ZWxsLgorCisJKiBoYXNoLmMgKGJmZF9oYXNoX2FsbG9jYXRlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X2Vycm9yIGlmCisJb2JzdGFja19hbGxvYyByZXR1cm5zIE5VTEwgdW5sZXNzIHRoZSBzaXplIGlzIG5vbi16ZXJvLgorCisJKiBsaW5rZXIuYyAoYXJjaGl2ZV9oYXNoX2FsbG9jYXRlKTogRGVmaW5lLgorCShfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZQorCXJhdGhlciB0aGFuIG9ic3RhY2tfYWxsb2MsIGZvciBjbGFyaXR5LgorCisJKiBlbGZjb2RlLmggKGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBDb3JyZWN0LgorCisJKiBhb3V0NjQuYyAoQk1BR0lDLCBRTUFHSUMpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIEZyb20KKwlQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uCisKKwlMaW51eCBaTUFHSUMgc3VwcG9ydCBmcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KKwkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGZpZWxkIHptYWdpY19kaXNrX2Jsb2NrX3NpemUuCisJKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBPbmx5IHNldCBhbGlnbm1lbnQgYWNjb3JkaW5nIHRvCisJYXJjaGl0ZWN0dXJlIGlmIHRoZSBzZWN0aW9uIHNpemVzIGFyZSBhbGlnbmVkIHRvIHRoYXQgYWxpZ25tZW50LAorCWZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCShNWShzZXRfc2l6ZXMpKTogSW5pdGlhbGl6ZSB6bWFnaWNfZGlza19ibG9ja19zaXplIGZpZWxkLgorCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBTZXQgenRpaCBpZiB1c2luZyBxX21hZ2ljX2Zvcm1hdC4gIFNldAorCXRleHQgc2VjdGlvbiBmaWxlcG9zIHRvIHptYWdpY19kaXNrX2Jsb2NrX3NpemUgaWYgbm90IHp0aWguICBVc2UgYQorCWRpZmZlcmVudCBwYWRkaW5nIGFsZ29yaXRobSBpZiBub3QgenRpaC4KKwkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERvbid0IGRlZmluZS4KKworCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBKdXN0IHNraXAgTl9TVEFCIGFuZCBOX0ZOCisgICAgICAgIHN5bWJvbHM7IGRvbid0IGxvb2sgdGhlbSB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gIEZyb20KKyAgICAgICAgcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaCBDYW1wYmVsbCkuCisKK1R1ZSBKdW4gMjEgMTE6NDc6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb2ZmLWdvMzIuYyAoZ28zMmNvZmZfYXJjaGl2ZV9wKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KKworCSogc2VjdGlvbi5jIChiZmRfYWJzX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgorCShiZmRfYWJzX3NlY3Rpb25fcHRyLCBiZmRfaXNfYWJzX3NlY3Rpb24pOiBEZWZpbmUuCisJKGJmZF91bmRfc2VjdGlvbik6IE1ha2UgY29uc3QuCisJKGJmZF91bmRfc2VjdGlvbl9wdHIsIGJmZF9pc191bmRfc2VjdGlvbik6IERlZmluZS4KKwkoYmZkX2NvbV9zZWN0aW9uKTogTWFrZSBjb25zdC4KKwkoYmZkX2NvbV9zZWN0aW9uX3B0cik6IERlZmluZS4KKwkoYmZkX2luZF9zZWN0aW9uKTogTWFrZSBjb25zdC4KKwkoYmZkX2luZF9zZWN0aW9uX3B0ciwgYmZkX2lzX2luZF9zZWN0aW9uKTogRGVmaW5lLgorCShiZmRfYWJzX3N5bWJvbCwgYmZkX2NvbV9zeW1ib2wpOiBNYWtlIGNvbnN0LgorCShiZmRfdW5kX3N5bWJvbCwgYmZkX2luZF9zeW1ib2wpOiBMaWtld2lzZS4KKwkoZ2xvYmFsX3N5bXMpOiBDYXN0IGluaXRpYWxpemF0aW9uIG9mIHNlY3Rpb24gZmllbGQuCisJKFNURF9TRUNUSU9OKTogRGVmaW5lIGFzIGNvbnN0LCBhbmQgY2FzdCBpbml0aWFsaXphdGlvbnMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBNYW55IGZpbGVzOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQorCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCisKK01vbiBKdW4gMjAgMTE6MDY6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBNYW55IGZpbGVzOiBjaGFuZ2UgYWxsIGJmZF90YXJnZXQgdmVjdG9ycyB0byBiZSBjb25zdC4gIENoYW5nZQorCWFsbCB1c2VzIG9mIGJmZF90YXJnZXQgKiB0byBiZSBjb25zdCBiZmRfdGFyZ2V0ICouICBDaGFuZ2UKKwliZmRfdGFyZ2V0X3ZlY3RvciBhbmQgYmZkX2RlZmF1bHRfdmVjdG9yIGFycmF5cyB0byBiZSBjb25zdAorCWJmZF90YXJnZXQgKiBjb25zdCAqLgorCisJKiBlY29mZi5jLCBsaWJlY29mZi5oLCBlY29mZnN3YXAuaCwgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywKKwllbGYzMi1taXBzLmM6IFJlbmFtZWQgYWxsIGV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcyB3aGljaAorCWFyZSBsb2NhbCB0byBCRkQgdG8gc3RhcnQgd2l0aCBfYmZkX2Vjb2ZmIGluc3RlYWQgb2YganVzdCBlY29mZi4KKworCSogZWNvZmYuYyAoZWNvZmZfc3dhcF90aXJfaW4pOiBDaGFuZ2UgaW5wdXQgYXJndW1lbnQgdG8gY29uc3QuCisJKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgorCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KKwkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IEFkZCBuZXcgYXJndW1lbnRzIHRvIGNvcnJlc3BvbmQgdG8KKwlyZWFkX2RlYnVnX2luZm8gZW50cnkgcG9pbnQgaW4gZWNvZmZfZGVidWdfc3dhcCBzdHJ1Y3R1cmUuCisJQ2hhbmdlIGFsbCBjYWxscy4KKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBDaGFuZ2UgZGVjbGFyYXRpb24uCisJKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF90aXJfaW4sIGVjb2ZmX3N3YXBfdGlyX291dCk6IERlY2xhcmUuCisJKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IERlY2xhcmUuCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3CisJZWNvZmZfZGVidWdfc3dhcCBmaWVsZHMuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogVW5kZWZpbmUgUkVBRC4KKwkobWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcCk6IEluaXRpYWxpemUgbmV3IGVjb2ZmX2RlYnVnX3N3YXAKKwlmaWVsZHMuCisJKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9iaWdtaXBzX3ZlYyk6IFVzZSBlY29mZi5vIGFuZAorCWVjb2ZmbGluay5vLgorCShiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpOiBMaWtld2lzZS4KKwkoZWNvZmZfYmlnX3ZlYywgZWNvZmZfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgorCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IFJlbW92ZSBlY29mZi5vIGFuZCBlY29mZmxpbmsuby4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWNvZmYubyBhbmQgZWNvZmZsaW5rLm8uCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IENoZWNrIGZsYXZvdXIgb2Ygc3ViLCBub3QgYWJmZCwKKwl3aGVuIGNvbXB1dGluZyByZWxvYyBzaXplcy4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKKwk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisJKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHRyeSB0byBjb21wdXRlIG1heGltdW0KKwlyZWxvYyBjb3VudCBvciBzaXplIGZvciBhIG5vbi1FTEYgZmlsZS4KKworCSogbWlwc2JzZC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCisKKwkqIGhwMzAwaHB1eC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGF2b2lkIHdhcm5pbmcuCisJKEJNQUdJQywgUU1BR0lDKTogRGVmaW5lOyB1c2VkIGJ5IGFvdXR4LmguCisJKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGFuZ2UgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncworCWNhbGxzIHRvIHVzZSBuZXcgcGFyYW1ldGVycy4KKworRnJpIEp1biAxNyAxNDo0NTozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFvdXQtdGFyZ2V0LmggKE1ZKGNhbGxiYWNrKSk6IFNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUgdGV4dCwKKwlkYXRhIGFuZCBic3Mgc2VjdGlvbnMgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhlIGFyY2hpdGVjdHVyZS4KKworCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBUcmVhdCBhIGNvbW1vbiBzeW1ib2wgZnJvbSBhCisJZHluYW1pYyBvYmplY3QgYXMgYmVpbmcgaW4gdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgb2JqZWN0LCByYXRoZXIKKwl0aGFuIGFzIGJlaW5nIHVuZGVmaW5lZC4KKworRnJpIEp1biAxNyAxMToxNjo1MCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogbGliaHBwYS5oIChiZmRfaHBwYV9pbnNuMmZtdCwgaHBwYV9yZWJ1aWxkX2luc24pOiBNYWtlIElOTElORS4KKworCSogZWxmMzItaHBwYS5oIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGRlY2wuCisKK1RodSBKdW4gMTYgMjM6MzY6MjMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIHJlYWQgbG9jYWwgc3ltYm9scworCWlmIHRoZXJlIGFyZW4ndCBhbnkgaW4gdGhlIGlucHV0IGZpbGUuCisKK1RodSBKdW4gMTYgMTQ6MjU6MjIgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQorCisJKiBpMzg2bGludXguYzogTWFueSBuZXcgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucyBmb3IgbGlua2VyCisJc3VwcG9ydCBmb3IgTGludXggc2hhcmVkIGxpYnJhcmllcy4KKwkqIGJmZC1pbi5oIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworVGh1IEp1biAxNiAxNDoyMzo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IElmIHNlY29uZCBhcmd1bWVudCBpcyBgYF8nJywgdGhlbiwgaW5zdGVhZCBvZgorCWVjaG9pbmcgY29uZmlnIGZpbGUgbmFtZSwgZWNobyB3aGV0aGVyIHRhcmdldCB1c2VzIGxlYWRpbmcKKwl1bmRlcnNjb3JlcyBvbiBzeW1ib2wgbmFtZXMuICBBZGQgYXBwcm9wcmlhdGUgc2V0dGluZ3MgdG8KKwlkaWZmZXJlbnQgY2FzZXMuICBVc2VkIGJ5IGJpbnV0aWxzL2NvbmZpZ3VyZS5pbiB0byBzZXQgZGVmYXVsdCBmb3IKKwljKytmaWx0LgorCisJKiBlbGZjb2RlLmggKGVsZl9iZmRfZmluYWxfbGluayk6IElmIHRyeWluZyB0byBnZW5lcmF0ZSBhIHNoYXJlZAorCW9iamVjdCwgd2FybiBhbmQgcmV0dXJuIGZhbHNlLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEFjY2VwdCBCTUFHSUMgb2JqZWN0cworCWFuZCB0cmVhdCB0aGVtIGFzIE9NQUdJQy4KKworV2VkIEp1biAxNSAxODowMjoyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJRW5hYmxlIHNwYXJjIHY5IHN1cHBvcnQgZm9yIHJlbGVhc2UuICBOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbCBhCisJd29yayBpbiBwcm9ncmVzcywgcGVuZGluZyByZWxlYXNlIG9mIGFuIEFCSSBzcGVjaWZpY2F0aW9uLgorCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmluOiBJbmNsdWRlIHNwYXJjIHY5IGVsZiBjb25maWcuCisJKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IEhhbmRsZSBzcGFyYyB2OSAoNjQgYml0KS4KKwkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBOZXcgcmVsb2MgdHlwZXMuCisJKiBlbGY2NC1zcGFyYy5jOiBJbXBsZW1lbnQgZWxmNjQtc3BhcmMgdGFyZ2V0LgorCSogTWFrZWZpbGUuaW4sIHRhcmdldHMuYzogVXBkYXRlZC4KKworV2VkIEp1biAxNSAwMTozNDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCBkdF9uZWVkZWRfbmFtZS4KKwkoZWxmX2R0X25lZWRlZF9uYW1lKTogTmV3IGFjY2Vzc29yIG1hY3JvLgorCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfZHRfbmVlZGVkX25hbWUKKwlpcyBzZXQsIHVzZSB0aGF0IGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lIGZvciB0aGUgRFRfTkVFREVEIGR5bmFtaWMKKwllbnRyeS4KKwkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGJmZC1pbi5oIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKKwkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgc2ludGVycHB0cgorCWFyZ3VtZW50LCBhbmQgc2V0IGl0IHRvIHRoZSAuaW50ZXJwIHNlY3Rpb24uCisJKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCisJKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworCSogY29mZi1zcGFyYy5jIChTV0FQX09VVF9SRUxPQ19FWFRSQSk6IERlZmluZSB0byBjbGVhciB0aGUgcl9zcGFyZQorCWZpZWxkIG9mIHRoZSByZWxvYyByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGJlIGdhcmJhZ2UuCisKKwkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2FybWFwKTogUmVjb2duaXplIF9fLlNZTURFRi8gYXMgd2VsbCBhcworCV9fLlNZTURFRjsgdGhlIGZvcm1lciB3YXMgdXNlZCBpbiBvbGQgTGludXggYXJjaGl2ZXMuICBGcm9tCisJanJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCisKKwkqIGkzODZsaW51eC5jIChpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lOyBsaWtlCisJTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBpbiBhb3V0LXRhcmdldC5oLCBidXQgc2V0IE1BQ0hUWVBFIHRvCisJTV8zODYuICBGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgorCShNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWZpbmUuCisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBUcmVhdCBOX1NFVFYgc3ltYm9scworCWFzIE5fREFUQSBzeW1ib2xzLgorCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KKworCSogYW91dHguaDogUmV3cml0ZSBzeW1ib2wgZHVwbGljYXRlIGVsaW1pbmF0aW9uIHRvIHVzZSBCRkQgaGFzaAorCXRhYmxlcy4KKwkoc3RydWN0IHN0cmluZ3RhYl9lbnRyeSwgc3RydWN0IHN0cmluZ3RhYl9kYXRhKTogUmVtb3ZlLgorCShIQVNITUFYTEVOLCBIQVNIX0NIQVIsIGhhc2gsIGNvbXBhcmUsIGxvZzIsIGVtaXRfc3RydGFiKTogUmVtb3ZlLgorCShzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnksIHN0cnVjdCBzdHJ0YWJfaGFzaCk6IERlZmluZS4KKwkoc3RydGFiX2hhc2hfbmV3ZnVuYywgc3RydGFiX2hhc2hfbG9va3VwKTogRGVmaW5lLgorCShzdHJpbmd0YWJfZnJlZSwgZW1pdF9zdHJpbmd0YWIpOiBEZWZpbmUuCisJKHN0cmluZ3RhYl9pbml0LCBhZGRfdG9fc3RyaW5ndGFiKTogUmV3cml0ZS4KKwkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogVXNlIG5ldyBzdHJpbmd0YWIgY29kZS4KKwkoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvLCBOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KKwkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMsIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KKworCSogYmZkLWluLmggKEJGRF9UUkFESVRJT05BTF9GT1JNQVQpOiBEZWZpbmUgbmV3IEJGRCBmbGFnIHRvCisJcmVxdWVzdCBCRkQgdG8gd3JpdGUgb2JqZWN0IGluIHRoZSB0cmFkaXRpb25hbCBmb3JtYXQsIHdoYXRldmVyCisJdGhhdCBtZWFucyBmb3IgdGhlIHBhcnRpY3VsYXIgYmFja2VuZC4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworCSogaGFzaC5jIChiZmRfaGFzaF9hbGxvY2F0ZSk6IElmIG9ic3RhY2tfYWxsb2MgZmFpbHMsIHNldAorCWJmZF9lcnJvcl9ub19tZW1vcnkuCisKK1R1ZSBKdW4gMTQgMTM6MDA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBxX21hZ2ljX2Zvcm1hdCB0byBzdWJmb3JtYXQKKwllbnVtLgorCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZSBhcyBmdW5jdGlvbgorCWlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBDb3B5IHN1YmZvcm1hdCBpbmZvcm1hdGlvbi4KKwkoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEZWZpbmUgYXMgMCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCShNWShiYWNrZW5kX2RhdGEpKTogVXNlIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIHJhdGhlciB0aGFuIDAuCisJKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBSZW5hbWUgZnJvbSBmaW5hbF9saW5rX2NhbGxiYWNrLCBhbmQKKwlkZWZpbmUgb25seSBpZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQuCisJKE1ZX2JmZF9maW5hbF9saW5rKTogUmVuYW1lIHVzZSBvZiBmaW5hbF9saW5rX2NhbGxiYWNrIHRvCisJTVlfZmluYWxfbGlua19jYWxsYmFjay4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSGFuZGxlIFFNQUdJQyBsaWtlCisJWk1BR0lDLCBidXQgc2V0IHRoZSBzdWJmb3JtYXQgdG8gcV9tYWdpY19mb3JtYXQuICBBYm9ydCBpZiB0aGUKKwltYWdpYyBudW1iZXIgaWYgbm90IHJlY29nbml6ZWQuCisJKGFkanVzdF96X21hZ2ljKTogVXNlIFFNQUdJQyBpZiBxX21hZ2ljX2Zvcm1hdC4KKwkqIGkzODZsaW51eC5jIChNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcik6IERlZmluZSBhcyAxLgorCShpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmspOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShNWV9iZmRfZmluYWxfbGluayk6IERlZmluZSBhcyBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsuCisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogQ2hlY2sgYm90aCBzZWN0aW9uIGFuZAorCW91dHB1dF9zZWN0aW9uIGFnYWluc3Qgc2VjdGlvbnMgb2YgYWJmZC4KKworCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mCisJd3JpdHRlbiBmcm9tIGJvb2xlYW4gdG8gY2hhci4gIEFkZCBuZXcgZmllbGQgc21hbGwuCisJKiBlY29mZi5jIChlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbiB0byAwCisJcmF0aGVyIHRoYW4gZmFsc2UuICBJbml0aWFsaXplIHNtYWxsIHRvIDAuCisJKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IElmIEVDT0ZGIHR5cGUgaXMgc2NTVW5kZWZpbmVkLCBzZXQKKwlzbWFsbC4gIElmIHNtYWxsIGlzIHNldCwgYW5kIGhhc2ggdGFibGUgdHlwZSBpcyBjb21tb24sIGZvcmNlIHRoZQorCXN5bWJvbCBpbnRvIGEgc2VjdGlvbiBuYW1lZCBTQ09NTU9OIGFuZCBjaGFuZ2UgdGhlIEVDT0ZGIHR5cGUgZnJvbQorCXNjQ29tbW9uIHRvIHNjU0NvbW1vbi4KKwkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB3cml0dGVuIHRvIDEgcmF0aGVyIHRoYW4gdHJ1ZS4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3JyZWN0IEpNUEFERFIgcmVsb2MKKwlvdmVyZmxvdyBjaGVjayB0byBjb25zaWRlciBzZWN0aW9uIFZNQSBvZiBpbnB1dCBmaWxlLgorCitNb24gSnVuIDEzIDE0OjIwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IEhhbmRsZSBhCisJbWFjaGluZSB0eXBlIG9mIDY4MDAwLgorCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBBZGQgbmV3IGFyZ3VtZW50IHVua25vd24uCisJU2V0ICp1bmtub3duIHRvIHRydWUgaWYgbWFjaGluZSB0eXBlIGlzIHJlYWxseSB1bmtub3duLCBhcyBvcHBvc2VkCisJdG8gTV9VTktOT1dOIGZvciB0aGUgNjgwMDAuCisJKE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKSk6IENoYW5nZSBOQU1FKGFvdXQsbWFjaGluZV90eXBlKSBjYWxsCisJYWNjb3JkaW5nbHkuCisJKiBsaWJhb3V0LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogQWRkIG5ldyBhcmd1bWVudCB0bworCXByb3RvdHlwZS4KKworU3VuIEp1biAxMiAyMDoyMTowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKEVYRUNfQVVYX0lEKTogRGVmaW5lIGJhc2VkIG9uIGF2YWlsYWJsaXR5IG9mIEhQVVhfQVVYX0lECisJb3IgSElVWF9BVVhfSUQuCisJKHNvbV9iZWdpbl93cml0aW5nKTogVXNlIEVYRUNfQVVYX0lEIGluc3RlYWQgb2YgSFBVWF9BVVhfSUQuCisJKHNvbV93cml0ZV9hcm1hcCk6IFVzZSBDUFVfUEFfUklTQzFfMCBhcyB0aGUgbWFnaWMgbnVtYmVyLiAgTm90ZQorCXNvbS5jIGlzIGNhcmVmdWwgdG8gYWx3YXlzIGRlZmluZSBDUFVfUEFfUklTQzFfMC4KKworU2F0IEp1biAxMSAxNjozMjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KKwkqIGFvdXR4LmggKHN5bV9pbl90ZXh0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCisJKHN5bV9pbl9kYXRhX3NlY3Rpb24sIHN5bV9pbl9ic3Nfc2VjdGlvbik6IExpa2V3aXNlLgorCShzeW1faXNfdW5kZWZpbmVkLCBzeW1faXNfZ2xvYmFsX2RlZm4pOiBMaWtld2lzZS4KKwkoc3ltX2lzX2RlYnVnZ2VyX2luZm8sIHN5bV9pc19mb3J0cmFuY29tbW9uKTogTGlrZXdpc2UuCisJKHN5bV9pc19hYnNvbHV0ZSwgc3ltX2lzX2luZGlyZWN0KTogTGlrZXdpc2UuCisJKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBSZXdyaXRlIGZvciBjbGFyaXR5LiAgUmVhcnJhbmdlCisJYXJndW1lbnRzIGFuZCBjaGFuZ2UgY2FsbGVyLiAgSGFuZGxlIHdlYWsgc3ltYm9scy4KKwkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KKwkoYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBEb24ndCBpZ25vcmUgd2VhayBzeW1ib2xzLiAgUHVsbAorCW9iamVjdCBpbiBmcm9tIGFyY2hpdmUgaWYgYSB3ZWFrIGRlZmludGlvbiBpcyBmb3VuZCBmb3IgYW4KKwlleGlzdGluZyB1bmRlZmluZWQgc3ltYm9sLgorCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBQdXQgYWxsIGNhc2VzIGluIHN3aXRjaC4gIFNldCBmbGFncyBvZiBhbgorCXVuZGVmaW5lZCBzeW1ib2wgdG8gMC4gIEhhbmRsZSB3ZWFrIHN5bWJvbHMuCisJKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KKwkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBMaWtld2lzZS4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCisJKiBzdW5vcy5jIChzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCitGcmkgSnVuIDEwIDEzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBIYW5kbGUgLmJzcyBzZWN0aW9uLgorCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgorCisJKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ19DVE9SLgorCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCBhc3N1bWUKKwl0aGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IE5VTEwuCisKK1dlZCBKdW4gIDggMjM6MTU6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiAgU2V0IEVYRUNfUCBhbmQgc3RhcnQgYWRkcmVzcyBmb3IgR0RCLgorCitXZWQgSnVuICA4IDIzOjU3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyk6IERvbid0IHRyeSB0byByZWFkIHRoZQorCXN0cmluZ3MgaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCisJKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBVc2UgdGhlIG91dHB1dCBzZWN0aW9uIHdoZW4KKwl3b3JraW5nIG91dCB0aGUgdHlwZS4KKworVHVlIEp1biAgNyAxMzoyNTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFB1dCBzaHN0cnRhYiwgc3ltdGFiIGFuZAorCXN0cnRhYiBzZWN0aW9ucyBhdCBlbmQgb2YgZmlsZS4gIEF2b2lkcyBidWcgaW4gc29tZSB2ZXJzaW9ucyBvZgorCVNWUjQgc3RyaXAuICBGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbD4uCisKKwkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWYgQ09GRl9QQUdFX1NJWkUgaXMgZGVmaW5lZCwKKwlzZXQgU0VDX0RFQlVHR0lORyBmb3IgU1RZUF9JTkZPIHNlY3Rpb25zLgorCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIENPRkZfUEFHRV9TSVpFIGlzCisJZGVmaW5lZCwgYW5kIERfUEFHRUQgaXMgc2V0LCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gZXF1YWwgdG8gdGhlCisJc2VjdGlvbiBWTUEgbW9kdWxvIENPRkZfUEFHRV9TSVpFLgorCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBJZiBGX0VYRUMgaXMgc2V0LCBzZXQgRF9QQUdFRC4KKwkqIGNvZmYtaTM4Ni5jOiBTZXQgRF9QQUdFRCBpbiBCRkQgdGFyZ2V0LgorCShDT0ZGX1BBR0VfU0laRSk6IERlZmluZS4KKwkqIGNvZmYtbTY4ay5jLCBjb2ZmLXNwYXJjLmM6IExpa2V3aXNlLgorCitNb24gSnVuICA2IDEwOjU3OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCB0dXJuIGEgcmVsb2Mgc2VjdGlvbgorCWludG8gYSBCRkQgc2VjdGlvbiBqdXN0IGJlY2F1c2UgU0hGX0FMTE9DIGlzIHNldDsgcmVxdWlyZSB0aGF0IGl0CisJbm90IHVzZSB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZS4KKwkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgorCisJQmV0dGVyIGluZGlyZWN0IGFuZCB3YXJuaW5nIHN5bWJvbCBoYW5kbGluZyBpbnNwaXJlZCBieSBTdHVhcnQKKwlRdWljayA8c3R1Y2tAY3MubWFuLmFjLnVrPi4KKwkqIGxpbmtlci5jIChlbnVtIGxpbmtfYWN0aW9uKTogQWRkIFJFRiwgTUlORCwgQ1dBUk4sIFJFRkMuCisJKGxpbmtfYWN0aW9uKTogQ2hhbmdlIFVOREVGX1JPVy9kZWYgYW5kIFVOREVGV19ST1cvZGVmIGZyb20gTk9BQ1QKKwl0byBSRUYuICBDaGFuZ2UgVU5ERUZfUk9XL2luZHIgYW5kIFVOREVGV19ST1cvaW5kciBmcm9tIENZQ0xFIHRvCisJUkVGQy4gIENoYW5nZSBERUZfUk9XL2luZHIgYW5kIENPTU1PTl9ST1cvaW5kciBmcm9tIENZQ0xFIHRvIE1ERUYuCisJQ2hhbmdlIERFRldfUk9XL2luZHIgZnJvbSBDWUNMRSB0byBOT0FDVC4gIENoYW5nZSBJTkRSX1JPVy9pbmRyCisJZnJvbSBNREVGIHRvIE1JTkQuICBDaGFuZ2UgSU5EUl9ST1cvd2FybiBmcm9tIFdBUk5DIHRvIENZQ0xFLgorCUNoYW5nZSBXQVJOX1JPVy9kZWYgYW5kIFdBUk5fUk9XL2luZHIgZnJvbSBNV0FSTiB0byBDV0FSTi4gIENoYW5nZQorCVdBUk5fUk9XL2NvbSBmcm9tIE1XQVJOIHRvIFdBUk4uICBDaGFuZ2UgV0FSTl9ST1cvd2FybiBmcm9tIE5PQUNUCisJdG8gQ1lDTEUuICBDaGFuZ2UgU0VUX1JPVy93YXJuIGZyb20gV0FSTkMgdG8gQ1lDTEU+CisJKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSGFuZGxlIFJFRiwgTUlORCwgQ1dBUk4gYW5kCisJUkVGQy4gIElmIGEgbmV3IGluZGlyZWN0IHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLCBwdXNoIHRoZQorCXJlZmVyZW5jZSBkb3duIHRvIHRoZSBzeW1ib2wgaXQgcG9pbnRzIHRvLiAgRkl4IGhhbmRsaW5nIG9mIFdBUk4uCisJKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogSWYgTl9XQVJOSU5HLCBkb24ndAorCWNsb2JiZXIgZV90eXBlIG9mIG5leHQgc3ltYm9sLgorCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IExpa2V3aXNlLgorCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IExvb3Agb24gYmZkX2xpbmtfaGFzaF93YXJuaW5nIGFzIHdlbGwKKwlhcyBiZmRfbGlua19oYXNoX2luZGlyZWN0LgorCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgorCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSk6IEluaXRpYWxpemUgd3JpdHRlbi4KKwkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KKwkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IExpa2V3aXNlLgorCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgorCSogZWNvZmYuYyAoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4uCisJKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiB1c2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KKwkqIGdlbmxpbmsuaCAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5KTogTmV3IGZpZWxkIHdyaXR0ZW4uCisJKiBsaW5rZXIuYyAoX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyk6IERvbid0IGluaXRpYWxpemUgd3JpdHRlbi4KKwkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgd3JpdHRlbi4KKwkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBVc2Ugd3JpdHRlbiwgbm90IHJvb3Qud3JpdHRlbi4KKwkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IExpa2V3aXNlLgorCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgorCisJKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGQgbGlua2VyIGZpZWxkLgorCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgbmV3IHRkYXRhIGxpbmtlcgorCWZpZWxkLCByYXRoZXIgdGhhbiBvdXRzeW1ib2xzIGJlaW5nIG5vbi1OVUxMLCB0byBkZWNpZGUgd2hldGhlciB0bworCW91dHB1dCB0aGUgc3ltYm9scyBhbmQgcmVsb2NzLgorCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCBuZXcgdGRhdGEgbGlua2VyIGZpZWxkIHRvIHRydWUuCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0cnkgdG8gY29weQorCWRhdGEgdG8gYSBub24tRUNPRkYgZmlsZS4KKworCSogbGliYmZkLWluLmg6IEFkZCB3YXJuaW5nIHRoYXQgbGliYmZkLmggaXMgYSBnZW5lcmF0ZWQgZmlsZS4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCitTdW4gSnVuICA1IDE1OjAyOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUNoYW5nZXMgdG8gc3VwcG9ydCBFTEYgc3RyaXAgYW5kIG9iamNvcHkgb24gZHluYW1pY2FsbHkgbGlua2VkCisJZmlsZXMuCisJKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWRkIHByb3RvdHlwZS4KKwkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFrZSBhIEJGRCBzZWN0aW9uIGZyb20gYW4gU0hUX0hBU0gKKwlzZWN0aW9uLCBhbmQgZnJvbSBhbiBTSFRfRFlOU1lNIHNlY3Rpb24sIGFuZCBmcm9tIHRoZSBkeW5hbWljCisJc3RyaW5nIHRhYmxlIHNlY3Rpb24uCisJKGVsZl9vYmplY3RfcCk6IFNldCBEX1BBR0VEIGlmIHRoZXJlIGlzIGEgcHJvZ3JhbSBoZWFkZXIuCisJKGVsZl9tYWtlX3NlY3Rpb25zKTogUmVtb3ZlLgorCShmaXhfdXBfc3RydGFicyk6IFJlbW92ZS4KKwkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXdyaXRlLiAgTm93IHNldHMgc2hfZW50c2l6ZS4KKwkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFJld3JpdGUuICBOb3cgc2V0cyBzaF9saW5rIGFuZCBzaF9pbmZvCisJZm9yIGFsbCBzZWN0aW9ucy4KKwkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6ICBEb24ndCBjYWxsIG9ic29sZXRlCisJZnVuY3Rpb25zIGVsZl9tYWtlX3NlY3Rpb25zIG9yIGZpeF91cF9zdHJ0YWJzLgorCShzd2FwX291dF9zeW1zKTogU2V0IHNoX2FkZHJhbGlnbiB0byBGSUxFX0FMSUdOIHJhdGhlciB0aGFuIDQuCisJKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogUGVybWl0IHdyaXRpbmcgRFlOQU1JQworCW9iamVjdHMuCisJKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBUcmVhdCBTSFRfRFlOU1lNIGxpa2Ugb3RoZXIgbm9ybWFsCisJc2VjdGlvbnMuICBJZiBhbiBTSFRfUkVMIG9yIFNIVF9SRUxBIHNlY3Rpb24gaXMgYWxsb2NhdGVkIG9yIHVzZXMKKwlhbiB1bnVzdWFsIHN5bWJvbCB0YWJsZSwgcGVybWl0IGEgQkZEIHNlY3Rpb24gdG8gbWFwIHRvIGl0LgorCVBlcm1pdCBtb3N0IFNIVF9TVFJUQUIgc2VjdGlvbnMgdG8gaGF2ZSBhIEJGRCBzZWN0aW9uIG1hcHBlZCB0bworCXRoZW0uCisJKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBzaF9saW5rLCBzaF9pbmZvIG9yIHNoX2VudHNpemUKKwlmaWVsZHMgb2YgZHluYW1pYyBzZWN0aW9ucyBoZXJlOyBkbyBpdCBpbiBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgorCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBBZGQgRF9QQUdFRCB0byBwZXJtaXR0ZWQgb2JqZWN0CisJZmxhZ3MuCisKKwkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogT25seSBzZXQgU0VDX0RBVEEgaWYKKwlTRUNfTE9BRCBpcyBzZXQsIHJhdGhlciB0aGFuIGNoZWNraW5nIFNFQ19BTExPQy4KKworCSogbGliYmZkLWluLmggKGJmZF9yZWFsbG9jKTogQ2hhbmdlIGxhc3QgYXJnIHRvICJzaXplX3Qgc2l6ZSIuCisKK0ZyaSBKdW4gIDMgMTA6NTg6MDIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY29tcHV0ZSB0aGUgZmlsZSBoZWFkZXIncworCWNoZWNrc3VtIGhlcmUuCisJKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgorCisJKiBsaWJiZmQuaCAoYmZkX3JlYWxsb2MpOiBDaGFuZ2UgbGFzdCBhcmcgdG8gInNpemVfdCBzaXplIi4KKworVGh1IEp1biAgMiAxNzozOToyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL3N1bjMuaDogSW5jbHVkZSA8c3RkbGliLmg+LiAgRG9uJ3QgZGVjbGFyZSBmcmVlLCBleGl0IG9yCisJZ2V0ZW52LgorCisJQWRkIGxpbmtlciBzdXBwb3J0IGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgorCSogc3Vub3MuYzogSW5jbHVkZSBiZmRsaW5rLmguICBBZGQgbWFueSBuZXcgZnVuY3Rpb25zIGFuZAorCWRlZmluaXRpb25zIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgorCSogYmZkLWluLmggKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KKwkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBhb3V0eC5oIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBNb3ZlIHRvIGxpYmFvdXQuaC4KKwkoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKTogTGlrZXdpc2UuCisJKGFvdXRfbGlua19oYXNoX2xvb2t1cCwgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KKwkoYW91dF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCisJKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBSZW5hbWUgZnJvbSBhb3V0X2xpbmtfaGFzaF9uZXdmdW5jCisJYW5kIG1ha2UgZXh0ZXJuYWxseSB2aXNpYmxlLgorCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogTmV3IGZ1bmN0aW9uLgorCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkpOiBDYWxsCisJTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSwgbm90IF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQuCisJKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGZhaWwgaWYgbm8gc3ltYm9scy4gIElmIGl0IGV4aXN0cywKKwljYWxsIGFkZF9keW5hbWljX3N5bWJvbHMgYmFja2VuZCBlbnRyeSBwb2ludCBmb3IgZHluYW1pYyBvYmplY3RzLgorCVVzZSBhZGRfb25lX3N5bWJvbCBiYWNrZW5kIGVudHJ5IHBvaW50IGlmIGl0IGV4aXN0cy4KKwkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQ2FsbCBmaW5pc2hfZHluYW1pY19saW5rIGJhY2tlbmQgZW50cnkKKwlwb2ludCwgaWYgaXQgZXhpc3RzLgorCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRm9yIGEgZHluYW1pYyBvYmplY3QsIGNhbGwKKwlsaW5rX2R5bmFtaWNfb2JqZWN0IGJhY2tlbmQgZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KKwkoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IENhbGwgd3JpdGVfZHluYW1pY19zeW1ib2wgYmFja2VuZAorCWVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCisJKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogRG9uJ3QgcmVhZCB0aGUgcmVsb2NzIGlmIHRoZXkgaGF2ZQorCWFscmVhZHkgYmVlbiByZWFkLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgbGluaywgZm9yIGEKKwlyZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgY2FsbCBjaGVja19keW5hbWljX3JlbG9jIGJhY2tlbmQKKwllbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KKwkqIGxpYmFvdXQuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gIEluY2x1ZGUKKwliZmRsaW5rLmguCisJKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSk6IE1vdmUgaW4gZnJvbSBhb3V0eC5oLgorCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpOiBMaWtld2lzZS4KKwkoYW91dF9saW5rX2hhc2hfbG9va3VwLCBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSk6IExpa2V3aXNlLgorCShhb3V0X2hhc2hfdGFibGUpOiBMaWtld2lzZS4KKwkoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBhZGRfZHluYW1pY19zeW1ib2xzLAorCWFkZF9vbmVfc3ltYm9sLCBsaW5rX2R5bmFtaWNfb2JqZWN0LCB3cml0ZV9keW5hbWljX3N5bWJvbCwKKwljaGVja19keW5hbWljX3JlbG9jLCBhbmQgZmluaXNoX2R5bmFtaWNfbGluay4KKwkoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IERlZmluZSBuZXcgc3RydWN0dXJlLgorCShhb3V0X3NlY3Rpb25fZGF0YSk6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCisJKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBEZWNsYXJlLgorCShOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpKTogRGVjbGFyZS4KKwkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBuZXcgYW91dF9iYWNrZW5kX2RhdGEKKwlmaWVsZHMuCisJKiBhb3V0LXRhcmdldC5oIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCisJKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCisJKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgorCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCisJKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHplcm8gb3V0IGNhY2hlZAorCXVudGlsIHdlIGtub3cgaXQgaXMgbm9uLU5VTEwuCisJKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRG9uJ3Qgc2tpcCBhIHdhcm5pbmcgc3ltYm9sIGV2ZW4gaWYgaXQKKwloYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LiAgSWYgc2tpcHBpbmcgYW4gaW5kaXJlY3Qgc3ltYm9sLAorCXNraXAgdGhlIG5leHQgc3ltYm9sIGFzIHdlbGwuCisKK1dlZCBKdW4gIDEgMTQ6Mzc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBob3N0cy9zdW4zLmg6IERvbid0IGRlY2xhcmUgcXNvcnQsIG1hbGxvYyBvciByZWFsbG9jLgorCitUaHUgTWF5IDI2IDEzOjU2OjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBDYXN0IGJmZF9ieXRlIHBvaW50ZXIKKwl0byBjaGFyIHBvaW50ZXIgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisKKwkqIGRlcC1pbi5zZWQ6IFJlbW92ZSBzcGFjZXMgYmVmb3JlIGNvbG9ucy4KKworCU1lcmdlZCBjaGFuZ2VzIGJhY2sgaW4gZnJvbSBGU0YgZ2FzIHJlbGVhc2UgMi4zOgorCisJKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IFdyYXAgYGlmJyBibG9jayBhcm91bmQgZ3JlcAorCWludm9jYXRpb24sIHRvIGF2b2lkIGEgYnVnIGluIEJTRCA0LjQgbWFrZS4KKworCUZyb20gUmFscGggQ2FtcGJlbGw6CisJKiBtaXBzYnNkLmMgKG1pcHNfZml4X2ptcF9hZGRyKTogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGFuCisJZXJyb3IuCisJKG1pcHNfZml4X2hpMTZfcyk6IERpdHRvLgorCisJRnJpIE1heSAxMyAyMToyMTowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCisKKwkqIG1ha2VmaWxlLmRvczogZGVmaW5lIGEgZGVmYXVsdCB0YXJnZXQsIG9yIGFyY2hpdmVzIHdvbid0IHdvcmsKKwkgIGR1ZSB0byBtdWx0aXBsZSBtYXRjaGVzLgorCisJV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCisKKwkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCisJKiBtYWtlZmlsZS5kb3M6IHVwZGF0ZSBmb3IgY29ycmVjdCB0YXJnZXRzIGFuZCBzb3VyY2VzCisJKiBjb2ZmLWdvMzIuYzogW25ld10gZ28zMidzIENPRkYgZm9ybWF0IChpMzg2Y29mZiB3aXRoIHVuZGVyc2NvcmVzKQorCSogdGFyZ2V0cy5jOiBhZGQgZ28zMmNvZmYgdGFyZ2V0CisJKiBtYWtlZmlsZS5pbjogYWRkIGNvZmYtZ28zMi5jIHN1cHBvcnQKKworVGh1IE1heSAyNiAxMDoxMDoyMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBEbyBub3Qgc2V0IHRoZSBzeXN0ZW1faWQgaGVyZSwgcHJpdmF0ZQorCWJmZCBkYXRhIGhhcyBub3QgYmVlbiBjb3BpZWQgeWV0LgorCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KKworVHVlIE1heSAyNCAxNjoxNzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlNYWtlIE1JUFMgRUxGIHVzZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyLiAgTm8gc2hhcmVkIGxpYnJhcnkKKwlzdXBwb3J0IHlldC4KKwkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9pbik6IE5ldyBmdW5jdGlvbi4KKwkoYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfZWxmX29iamVjdF9wKTogSWYgbGFzdCBzeW1ib2wgaXMgTE9DQUwsIHNldCBlbGZfYmFkX3N5bXRhYi4KKwkobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBzaF9pbmZvIGZpZWxkIGZvciAuZ3B0YWIuKgorCXNlY3Rpb25zLgorCShtaXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNoX2VudHNpemUgZm9yIC5ncHRhYi4qIHNlY3Rpb25zLgorCShtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZWFkIGFuZCBmcmVlIGV4dGVybmFsIHN5bWJvbHMgbGFzdCwKKwlub3QgZmlyc3QsIGZvciBjbGFyaXR5LgorCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCisJKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KKwkobWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCk6IERlZmluZSBuZXcgbWFjcm8uCisJKG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZSBuZXcgbWFjcm8uCisJKG1pcHNfZWxmX2hhc2hfdGFibGUpOiBEZWZpbmUgbmV3IG1hY3JvLgorCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KKwkobWlwc19lbGZfZ2V0X2V4dHIsIG1pcHNfZWxmX3NldF9pbmRleCk6IFJlbW92ZS4KKwkobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGdwdGFiX2NvbXBhcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShtaXBzX2VsZl9maW5hbF9saW5rKTogUmV3cml0ZSB0byB1c2UgRUxGIGJhY2tlbmQgbGlua2VyLCBhbmQgdG8KKwltZXJnZSBncHRhYiBpbmZvcm1hdGlvbiBpbiBpbnB1dCBmaWxlcy4KKwkobWlwc19lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUgYXMgbWFjcm8gYmVmb3JlCisJaW5jbHVkaW5nIGVsZjMyLXRhcmdldC5oLgorCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgorCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogUmVuYW1lIGZyb20KKwllbGZfbGlua19oYXNoX25ld2Z1bmMgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBjYWxsZXIuCisJKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCisJX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZS4KKwkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IFVzZQorCV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0LgorCSogbGliZWxmLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIG5ldyBmaWVsZCBiYWRfc3ltdGFiLgorCShlbGZfYmFkX3N5bXRhYik6IERlZmluZSBuZXcgYWNjZXNzb3IgbWFjcm8uCisJKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyZS4KKwkoX2Jld19lbGZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBEZWNsYXJlLgorCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBDYWxsIGJhY2tlbmQgb2JqZWN0X3AgaG9vayBhZnRlcgorCXN3YXBwaW5nIGluIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLgorCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvcnJlY3QgdHlwbzogSW50ZXJuYWwgZm9yIEV4dGVybmFsLgorCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBlbGZfYmFkX3N5bXRhYiBpcyBzZXQsIHJlYWQgYWxsCisJdGhlIHN5bWJvbHMuICBTa2lwIFNUQl9MT0NBTCBzeW1ib2xzIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KKwkoZWxmX2JmZF9maW5hbF9saW5rKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCBhbGxvY2F0ZSBzcGFjZSBmb3IKKwlhbGwgc3ltYm9scywgbm90IGp1c3QgbG9jYWxzLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT25seSBza2lwIGEgc3ltYm9sIG5vdCBtZW50aW9uZWQgYnkgYQorCXJlZ3VsYXIgZmlsZSBpZiBpdCBpcyBtZW50aW9uZWQgYnkgYSBkeW5hbWljIG9iamVjdC4KKwkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCByZWFkIGFsbCB0aGUKKwlzeW1ib2xzLgorCitGcmkgTWF5IDIwIDEzOjM4OjIzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX3NldF9yZWxvY19pbmZvKTogRG8gbm90IHNldCBhbnkgcmVsb2NhdGlvbiBpbmZvCisJZm9yIFNPTSBmaXh1cHMgd2hpY2ggYXJlIG5ldmVyIHBhc3NlZCB0byBCRkQuCisKK0ZyaSBNYXkgMjAgMTE6NTc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIE1JUFNfUl9KTVBBRERSIG92ZXJmbG93CisJY2hlY2tpbmcuCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIERUX0RFQlVHIHRvCisJdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIGRlYnVnZ2VyLgorCUZyb20gUGV0ZXIgU2NoYXVlci4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCisJKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KKwljb2RlIHJlcGVhdGVkIHRocmVlIHRpbWVzIGluIGJmZF9zZWN0aW9uX2Zyb21fc2hkciBpbiBlbGZjb2RlLmguCisJKiBsaWJlbGYuaCAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCisJKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBuZXcgZnVuY3Rpb24KKwlfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIHRvIGNyZWF0ZSBCRkQgc2VjdGlvbnMuICBJZiBhCisJcmVsb2Mgc2VjdGlvbiBkb2VzIG5vdCB1c2UgdGhlIG1haW4gc3ltYm9sIHRhYmxlLCBvciBpdCBpcyBwYXJ0IG9mCisJdGhlIHByb2Nlc3MgaW1hZ2UsIHRyZWF0IGl0IGFzIGEgbm9ybWFsIHNlY3Rpb24sIG5vdCByZWxvY3MuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIG5ldyBmdW5jdGlvbgorCV9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIuCisKK1RodSBNYXkgMTkgMTE6Mzc6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IENoYW5nZSBhcl9tYXhfbmFtZWxlbiB2YWx1ZSBmcm9tCisJMTUgdG8gMTQgdG8gbWF0Y2ggU1ZSNCBhci4KKworCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4gIExvb3NlbHkgYmFzZWQgb24gd29yayBieQorCUVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNvbT4uCisJKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkcyBmb3IgZHluYW1pYworCWxpbmtpbmc6IGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAorCWVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKKwllbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMsCisJZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAorCWVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLgorCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IENoYW5nZSB0eXBlIG9mIGFsaWduIGZpZWxkIHRvCisJYmZkX3NpemVfdHlwZS4gIEFkZCBmaWVsZHMgZHluaW5keCwgZHluc3RyX2luZGV4LCB3ZWFrZGVmLAorCWVsZl9saW5rX2hhc2hfZmxhZ3MuCisJKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkcyBkeW5vYmosIGR5bnN5bWNvdW50LAorCWR5bnN0ciwgYnVja2V0Y291bnQuCisJKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luLCBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQpOiBEZWNsYXJlLgorCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4sIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQpOiBEZWNsYXJlLgorCShiZmRfZWxmMzJfc3dhcF9keW5faW4sIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQpOiBEZWNsYXJlLgorCShiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWNsYXJlLgorCShiZmRfZWxmNjRfc3dhcF9yZWxvY19pbiwgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luLCBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X3N3YXBfZHluX2luLCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0KTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5KTogRGVjbGFyZS4KKwkqIGVsZmNvZGUuaCAoRWxmX0V4dGVybmFsX0R5bik6IERlZmluZS4KKwkoZWxmX3N3YXBfcmVsb2NfaW4pOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRS4gIE1ha2UgZXh0ZXJuYWxseQorCXZpc2libGUuCisJKGVsZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgorCShlbGZfc3dhcF9yZWxvY2FfaW4sIGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KKwkoZWxmX3N3YXBfZHluX2luLCBlbGZfc3dhcF9keW5fb3V0KTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUKKwlhbmQgYXMgbmV3IGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbi4KKwkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2VjdGlvbiB0eXBlIG9mIGR5bmFtaWMgc2VjdGlvbnMgYmFzZWQgb24KKwlzZWN0aW9uIG5hbWVzLgorCShlbGZfd3JpdGVfcGhkcnMpOiBSZW1vdmUuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogQWRkIG5ldyBhbGlnbiBhcmd1bWVudC4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoc3RydWN0IHNlZ19pbmZvKTogUmVtb3ZlLgorCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IENvbXBsZXRlbHkgcmV3cml0ZS4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBDb21wbGV0ZWx5IHJld3JpdGUuCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3Qgc2V0IGEgZmlsZSBwb3NpdGlvbiBmb3IKKwlzZWN0aW9ucyB3aGljaCBhbHJlYWR5IGhhdmUgb25lLiAgRG9uJ3QgYm90aGVyIHRvIGFsaWduIHRoZSBmaWxlCisJcG9zaXRpb24gaGVyZS4KKwkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IEhhbmRsZSBTSFRfSEFTSCBhbmQgU0hUX0RZTkFNSUMKKwlzZWN0aW9uIHR5cGVzLgorCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGZhaWxzLCBqdXN0CisJdXNlIGJmZF9hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCisJKGVsZl9zaXplb2ZfaGVhZGVycyk6IE1ha2UgdXNlZnVsLgorCShlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgZHluYW1pYyBvYmplY3RzLgorCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGVsZl9hZGRfZHluYW1pY19lbnRyeSk6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FIGFuZCBhcyBuZXcKKwlleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uCisJKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmX2J1Y2tldHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IE5ldyBmdW5jdGlvbi4KKwkoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8pOiBBZGQgZHluc3ltX3NlYyBhbmQgaGFzaF9zZWMgZmllbGRzLgorCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBIYW5kbGUgZHluYW1pYyBsaW5raW5nLiAgQ3JlYXRlIGEgc2VjdGlvbgorCXN5bWJvbCBmb3IgYWxsIEVMRiBzZWN0aW9ucywgbm90IGFsbCBCRkQgc2VjdGlvbnMuICBTdG9yZSBzZWN0aW9uCisJc3ltYm9sIGluZGV4IGluIHRhcmdldF9pbmRleCBmaWVsZCwgbm90IGluZGV4IGZpZWxkLiAgVHJhdmVyc2UKKwlvdmVyIGdsb2JhbCBzeW1ib2xzIGV2ZW4gaWYgc3RyaXBwaW5nLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT3V0cHV0IGR5bmFtaWMgc3ltYm9scy4gIE1hcmsgc3ltYm9scworCWRlZmluZWQgYnkgZHluYW1pYyBvYmplY3RzIGFzIHVuZGVmaW5lZC4KKwkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWdub3JlIGR5bmFtaWMgb2JqZWN0cy4gIFVzZSB0YXJnZXRfaW5kZXgKKwlmaWVsZCBmb3Igc2VjdGlvbiByZWxvY3MsIGFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgorCShlbGZfcmVsb2NfbGlua19vcmRlcik6IFVzZSB0YXJnZXRfaW5kZXggZmllbGQgZm9yIHNlY3Rpb24gcmVsb2NzLAorCWFuZCBtYWtlIHN1cmUgaXQgaXMgc2V0LgorCSogZWxmLmMgKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgZHluaW5keCwgZHluc3RyX2luZGV4LAorCXdlYWtkZWYgYW5kIGVsZl9saW5rX2hhc2hfZmxhZ3MgZmllbGRzLgorCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBkeW5vYmosIGR5bnN5bWNvdW50LAorCWR5bnN0ciBhbmQgYnVja2V0Y291bnQgZmllbGRzLgorCSogZWxmMzItdGFyZ2V0Lmg6IEluaXRpYWxpemUgbmV3IGR5bmFtaWMgbGlua2luZyBmaWVsZHMuCisJKiBlbGY2NC10YXJnZXQuaDogTGlrZXdpc2UuICAKKwkqIGVsZjMyLWkzODYuYzogTmV3IGZ1bmN0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuCisJKiBlbGYzMi1zcGFyYy5jOiBMaWtld2lzZS4KKwkqIGJmZC1pbi5oIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCisJKGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KKwkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCisJKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCitXZWQgTWF5IDE4IDA4OjI5OjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogc29tLmM6IERvbid0IGluY2x1ZGUgPHN5cy9kaXIuaD4gb3IgPHN5cy91c2VyLmg+LgorCShzb21fcmVsb2NfcXVldWVfZmluZCk6IENhbGwgbWVtY21wIGluc3RlYWQgb2YgYmNtcC4KKwkoc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCB0byBiZmQgKi4KKwkoY29tcGFyZV9zeW1zKTogQ2hhbmdlIHR5cGVzIG9mIGFyZ3VtZW50cyB0byBjb25zdCB2b2lkICouCisJKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIGZvdW5kLgorCShzb21fd3JpdGVfYXJtYXApOiBBZGQgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQgYW5kIGludCBhcmd1bWVudHMuCisJKHNvbV93cml0ZV9hcm1hcCk6IFVzZSAlbGQgYW5kIGNhc3QgdG8gbG9uZyBmb3IgZ2V0dWlkIHJlc3VsdC4KKworV2VkIE1heSAxOCAwOTowOTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5oIChSX0hQUEFfQUJTX0NBTEwpOiBEZWZpbmUuCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIGFic29sdXRlIGNhbGxzLgorCisJKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMKTogRGVmaW5lLgorCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogRGVsZXRlIGNvbXBsZXggcmVsb2NhdGlvbiB0eXBlcy4KKworVHVlIE1heSAxNyAxOTozMzoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb2ZmLWk5NjAuYyAoaWNvZmZfbGl0dGxlX3ZlYywgaWNvZmZfYmlnX3ZlYyk6IEluZGljYXRlIGxlYWRpbmcKKwl1bmRlcnNjb3JlLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEludGVsIHRvb2wgY2hhaW4gKGdudTk2MHYyKS4KKworTW9uIE1heSAxNiAxMDowOToyMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCisJKiBlbGYzMi1ocHBhLmM6IENoYW5nZSAuaHBwYV9saW5rZXJfc3R1YnMgdG8gLlBBUklTQy5zdHVicywKKwlsaWtld2lzZSBmb3Igb3RoZXIgUEEgc3BlY2lmaWMgc2VjdGlvbnMuCisJKGhwcGFfZWxmX3JlbG9jYXRlX3Vud2luZF90YWJsZSk6IERlbGV0ZSB1bnVzZWQKKwlmdW5jdGlvbi4KKwkoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBDb21wbGV0ZWx5IG5ldyB0YWJsZSBiYXNlZCBvbiA5NC0wMi0wMgorCWRyYWZ0IFBBIEVMRiBzcGVjLiAgQ2hhbmdlIHJlbG9jYXRpb24gdGFncyBhcHByb3ByaWF0ZWx5CisJdGhyb3VnaG91dCBlbGYzMi1ocHBhLmMKKwkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBSZXdyaXRlIGFuZCBzaW1wbGlmeSBiYXNlZCBvbiA5NC0wMi0wMgorCXNwZWMuCisJKGhwcGFfZWxmX3JlbG9jKTogTGlrZXdpc2UuCisJKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IExpa2V3aXNlCisJKEVMRl9NQUNISU5FX0NPREUpOiBDaGFuZ2UgdG8gRU1fUEFSSVNDLgorCSogZWxmMzItaHBwYS5oOiBJbmNsdWRlICJlbGYvaHBwYS5oIi4gIENoYW5nZSByZWxvY2F0aW9uIHRhZ3MgCisJYXBwcm9wcmlhdGVseSB0aHJvdWdob3V0IGVsZjMyLWhwcGEuaC4KKwkoZWxmMzJfaHBwYV9yZWxvY190eXBlKTogTmV3IHRhYmxlIGJhc2VkIG9uIDk0LTAyLTAyIGRyYWZ0IFBBIEVMRgorCXNwZWMuCisJKFJfSFBQQV9BQlNfQ0FMTCwgUl9IUFBBX0NPTVBMRVgqLCBSX0hQUEFfVU5XSU5EKTogRGVsZXRlIGRlZmluaXRpb25zLgorCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBVc2UgRU1fUEFSSVNDIGluc3RlYWQgb2YgRU1fSFBQQS4KKwkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWwpOiBEZWxldGUgdW51c2VkIEhQUEEgcmVsb2NhdGlvbnMuCisJKiBzb20uaCAoUl9IUFBBX0FCU19DQUxMLCBSX0hQUEFfQ09NUExFWCk6IERlbGV0ZSBkZWZpbml0aW9ucy4KKworCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IEF2b2lkIGFkZGluZyBjb25zdGFudF92YWx1ZSBpbnRvCisJdGhlIGZpbmFsIHZhbHVlIHR3aWNlIGZvciBMUiBhbmQgUlIgZmllbGQgc2VsZWN0b3JzLgorCitTYXQgTWF5IDE0IDA5OjA5OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChhZGRfdG9fc3RyaW5ndGFiKTogVXNlIEJGRF9BU1NFUlQgbm90IGFzc2VydC4gIFRoaXMKKwlhdm9pZHMgX19lcHJpbnRmIHRyb3VibGVzLgorCitGcmkgTWF5IDEzIDEwOjUxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYm91dC5jIChiX291dF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX0NUT1IuCisKKwkqIGNvbmZpZy9taXBzYmVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgZWNvZmZfYmlnX3ZlYyBhbmQKKwllY29mZl9saXR0bGVfdmVjIHNpbmNlIElyaXggNSBzdXBwb3J0cyBFQ09GRiBleGVjdXRhYmxlcy4KKworV2VkIE1heSAxMSAwMDozMTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIGZkci5hZHIgIT0gcGRyLmFkcgorCWNvcnJlY3RseS4KKworCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBVc2UgfHwgaW5zdGVhZCBvZiA7IHRvIGZvcmNlIFN1bk9TCisJbWFrZSB0byBpbnZva2UgdGhlIHNoZWxsLgorCitUdWUgTWF5IDEwIDE0OjIzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc2VjdGlvbi5jIChTRUNfQ09GRl9TSEFSRURfTElCUkFSWSk6IFJlbmFtZWQgZnJvbQorCVNFQ19TSEFSRURfTElCUkFSWSBmb3IgY2xhcml0eS4gIENoYW5nZWQgYWxsIHVzZXMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIGlzCisJc2V0LCBzZXQgU1RZUF9OT0xPQUQuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCk6IERvbid0IGdldCBhbiBhc3NlcnRpb24KKwlmYWlsdXJlIGJlY2F1c2Ugb2YgYSBiYWQgc2hhcmVkIGxpYnJhcnkuCisKK01vbiBNYXkgIDkgMTg6NTM6NDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBsaW5rZXIuYzogQWRkIG1pc3NpbmcgY29tbWVudCB0ZXJtaW5hdG9yLgorCitNb24gTWF5ICA5IDExOjUzOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWYgaGFzaHAgYW5kICpoYXNocAorCWFyZSBub3QgTlVMTCwgYXNzdW1lIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwIHRoZSBzeW1ib2wKKwlpbiB0aGUgaGFzaCB0YWJsZSBhbmQgaGFzIHN0b3JlZCB0aGUgZW50cnkgaW4gKmhhc2hwLgorCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogU2V0IGggdG8gTlVMTCBiZWZvcmUgY2FsbGluZworCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgorCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCisKKwkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCByZXF1aXJlCisJcGFnZSBzaGFyZWQgYmV0d2VlbiAuZGF0YSBhbmQgLmJzcyBzZWdtZW50cyB0byBjb250YWluIHplcm9lcy4KKworCSogZWxmY29kZS5oOiBJbmNsdWRlIGJmZGxpbmsuaC4gIEFkZGVkIHNldmVyYWwgbmV3IGZ1bmN0aW9ucyB0byBkbworCWxpbmtpbmcuCisJKEVMRl9SX1RZUEUpOiBEZWZpbmUuCisJKGJmZF9hZGRfdG9fc3RydGFiKTogUmV0dXJuIHVuc2lnbmVkIGxvbmcuICBDaGFuZ2UgY2hlY2sgZm9yCisJcmVhbGxvYyBmYWlsdXJlLgorCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfYWRkX3RvX3N0cnRhYi4KKwkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBsaW5rX2luZm8gYXJndW1lbnQuCisJQ2FsbCBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nIGhvb2sgYW5kIHByZXBfaGVhZGVycworCWhlcmUuICBPbmx5IGNhbGwgc3dhcF9vdXRfc3ltcyBpZiBsaW5rX2luZm8gaXMgTlVMTC4gIFNldCB1cAorCS5zaHN0cnRhYiBzZWN0aW9uIGhlcmUuICBQYXNzIGRvc3ltcyBhcmd1bWVudCB0bworCWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzLiAgU2V0IG91dHB1dF9oYXNfYmVndW4gZmxhZy4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBBZGQgZG9zeW1zCisJYXJndW1lbnQsIGFuZCB1c2UgaXQgdG8gY29udHJvbCBzZXR0aW5nIC5zeW10YWIgYW5kIC5zdHJ0YWIgZmlsZQorCXBvc2l0aW9ucy4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBZGQgZG9zeW1zIGFyZ3VtZW50LCBhbmQKKwlwYXNzIGl0IG9uLgorCShwcmVwX2hlYWRlcnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2FkZF90b19zdHJ0YWIuCisJKHN3YXBfb3V0X3N5bXMpOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IHNldCB1cCAuc2hzdHJ0YWIgaGVyZS4KKwkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTb21lIGNhbGxzIG1vdmVkIGludG8KKwllbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgorCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKwkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNITl9MT1JFU0VSViBjb3JyZWN0ZWQgdG8gU0hOX0xPUkVTRVJWRS4KKwkqIGxpYmVsZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KKwkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGNvbGxlY3QsCisJZWxmX2FkZF9zeW1ib2xfaG9vaywgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbi4KKwkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIGZpZWxkIHJlbF9oYXNoZXMuCisJKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIGZpZWxkcyBpbnRlcm5hbF9zeW1zIGFuZCBzeW1ib2xzLgorCUFkZCBmaWVsZCBzeW1faGFzaGVzLgorCShvYmpfc3ltYm9scywgb2JqX2ludGVybmFsX3N5bXMpOiBSZW1vdmUgZGVmaW5pdGlvbnMuCisJKGVsZl9zeW1faGFzaGVzKTogRGVmaW5lLgorCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KKwkoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCisJKGVsZl9saW5rX2hhc2hfbG9va3VwKTogRGVmaW5lLgorCShlbGZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgorCShlbGZfaGFzaF90YWJsZSk6IERlZmluZS4KKwkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCisJKGJmZF9lbGYzMl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCisJKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCisJKGJmZF9lbGY2NF9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUuCisJKGJmZF9lbGY2NF9iZmRfZmluYWxfbGluayk6IERlY2xhcmUuCisJKiBlbGYuYzogSW5jbHVkZSBiZmRsaW5rLmguCisJKGVsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGVsZjMyLXRhcmdldC5oIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgbm90IGRlZmluZWQsCisJZGVmaW5lIGFzIDAgYW5kIHVzZSBnZW5lcmljIGxpbmtlci4gIE90aGVyd2lzZSwgdXNlIEVMRiBiYWNrZW5kCisJbGlua2VyLgorCShlbGZfYmFja2VuZF9jb2xsZWN0KTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBmYWxzZS4KKwkoZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgorCShlbGYzMl9iZWQpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCisJKiBlbGY2NC10YXJnZXQuaDogU2FtZSBjaGFuZ2VzIGFzIGVsZjMyLXRhcmdldC5oLgorCSogZWxmMzItaTM4Ni5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KKwkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KKwkqIGVsZjMyLXNwYXJjLmM6IEluY2x1ZGUgYmZkbGluay5oLgorCShlbGZfaW5mb190b19ob3d0byk6IENoYW5nZSB0eXBlIG9mIGRzdCBmcm9tIEVsZjMyX0ludGVybmFsX1JlbGEKKwl0byBFbGZfSW50ZXJuYWxfUmVsYSAodGhleSdyZSB0aGUgc2FtZSB0eXBlIGFueWhvdykuCisJKGVsZl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgorCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF9jb2xsZWN0KTogRGVmaW5lLgorCisJKiBNYWtlZmlsZS5pbiAoc3RtcC1iZmQuaCk6IEF2b2lkIHVzZWxlc3MgbWFrZSBlcnJvciBtZXNzYWdlIGluIGEKKwlkaWZmZXJlbnQgd2F5OyB0b3VjaCB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnQgb24gc29tZSBzeXN0ZW1zLgorCitGcmkgTWF5ICA2IDEzOjM0OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IFJld29yayBjdXN0b20gaGVhZGVyCisJaGFuZGxpbmcgZm9yIGxhdGVzdCBzdWdnZXN0ZWQgZm9ybWF0LgorCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBMaWtld2lzZS4KKwkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgorCitGcmkgTWF5ICA2IDExOjExOjUwIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBlcnJpY3Nzb24gY29uZmlnIChmb3IgT1NFKS4KKworVGh1IE1heSAgNSAxNTo0MDo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgorCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9qbXBfYWRkcik6IE5ldyBmdW5jdGlvbi4KKwkobWlwc19maXhfaGkxNl9zKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbi4KKwkobWlwc19ob3d0b190YWJsZV9leHQpOiBDYWxsIG1pcHNfZml4X2ptcF9hZGRyIGZvciBNSVBTX1JFTE9DX0pNUC4KKworRnJpIE1heSAgNiAxMTo0ODo1NSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBjb25maWcvZ28zMi5taDogWFggc3VwcG9ydC4KKworCUZyb20gYmlsbAorCSogTWFrZWZpbGUuaW46IEJ1aWxkIHN5c2RlcC5oIHdpdGhvdXQgY2F1c2luZyB3b3JyeWluZyBidXQKKwloYXJtbGVzcyBlcnJvciBtZXNzYWdlLgorCitXZWQgTWF5ICA0IDExOjA5OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCUNoYW5nZWQgbTY4ay1hb3V0IHRvIHNldCBmbGFncyB0byAwOyBtNjhrLXN1bm9zIHN0aWxsIHVzZXMgMS4KKwkqIGFvdXQwLmM6IE5ldyBmaWxlLgorCSogdGFyZ2V0cy5jIChhb3V0MF9iaWdfdmVjKTogRGVjbGFyZS4KKwkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYW91dDBfYmlnX3ZlYy4KKwkqIGNvbmZpZy5iZmQgKG02OCotKi1hb3V0Kik6IFVzZSBtNjhrLTBhb3V0LCBub3QgbTY4ay1hb3V0LgorCSogY29uZmlnL202OGstYW91dC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmVkLgorCSogY29uZmlnL202OGstMGFvdXQubXQ6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluIChhb3V0MF9iaWdfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3I6IHVzZSBhb3V0MC5vLAorCWFvdXQzMi5vIGFuZCBzdGFiLXN5bXMuby4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dDAuby4KKwkoQ0ZJTEVTKTogQWRkIGFvdXQwLmMuCisKKwkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkIGV4ZWNfaGRyX2ZsYWdzLgorCSogYW91dC10YXJnZXQuaCAoTVlfZXhlY19oZHJfZmxhZ3MpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCisJTVkoYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KKwkqIGFvdXRmMS5oIChzdW5vc18zMl9zZXRfYXJjaF9tYWNoKTogTWFrZSBzdGF0aWMuCisJKGFvdXQzMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20gYmFja2VuZAorCWluZm8uCisJKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgorCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KKwkqIGFvdXQtZW5jYXAuYyAoZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IGZsYWdzIGZyb20KKwliYWNrZW5kIGluZm8uCisJKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogRGVmaW5lIGFzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURS4KKwkqIGhwMzAwaHB1eC5jIChNWV9leGVjX2hkcl9mbGFncyk6IERlZmluZSBhcyAweDIuCisJKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQgZmxhZ3MgZnJvbSBiYWNrZW5kIGluZm8uCisJKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZSBleGVjX2hkcl9mbGFncyBmaWVsZC4KKwkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCisJKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KKwkqIHNwYXJjbHlueC5jIChOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykpOiBTZXQKKwlmbGFncyBmcm9tIGJhY2tlbmQgaW5mby4KKwkoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCisKK1dlZCBNYXkgIDQgMDI6NTY6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQgKGkzODYtKi1nbnUqKTogVHJlYXQgbGlrZSBpMzg2LSotbWFjaCouCisJKG02OCotYXBvbGxvLSopOiBUcmVhdCBhbGwgQXBvbGxvIGNvbmZpZ3MgdGhlIHNhbWUsIGRvbid0IGhhbmRsZQorCUJTRCBzcGVjaWFsbHkuCisKK1R1ZSBNYXkgIDMgMTk6NDM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjYWNoZS5jOiBSZXdyb3RlIHRvIHdvcmsgY29ycmVjdGx5LgorCSogbGliYmZkLmg6IFJlYnVpbHQuCisJKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgorCShiZmRfZmRvcGVucik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfY2FjaGVfaW5pdC4KKworRnJpIEFwciAyOSAxNTowODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNmLW02OGtseW54LmMgKENBTENfQURERU5EKTogQ2hlY2sgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcyBieQorCWVudW1lcmF0aW5nIHRoZW0sIHNpbmNlIHRoZSByZWxvYyB0eXBlIGNhbiBub3Qgc2VydmUgYXMgYW4gaW5kZXgKKwlpbnRvIHRoZSBtNjhrIENPRkYgaG93dG9fdGFibGUuCisKK0ZyaSBBcHIgMjkgMDk6NDI6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworICAgICAgICAqIGNvbmZpZy5iZmQgKCotZ28zMik6IENoYW5nZWQgdG8gY29mZi4KKwkqIGNvZmYtaDgzMDAuYyAoSk1QTDEpOiBHZXQgSE9XVE8gcmlnaHQgZm9yIDI0Yml0IGJyYW5jaGVzLgorCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBXcml0ZSBvdXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCisJc3ltYm9scyBhbmQgZG9uJ3Qgc3RpY2sgaW4gZXh0cmEgbnVsbHMuCisKK1R1ZSBBcHIgMjYgMTU6MDc6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjZi1zcGFyY2x5bnguYyAoTFlOWE9TLCBDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lLgorCSogY29mZi1zcGFyYy5jIChCQURNQUcpOiBSZWNvZ25pemUgTFlOWENPRkZNQUdJQy4KKwkoQ09GRl9TUEFSQyk6IERlZmluZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfbmV3X3NlY3Rpb25faG9vayk6IElmIENPRkZfU1BBUkMsIHNldCBhbGlnbm1lbnQKKwlwb3dlciBvZiBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gMy4KKwkqIGhvc3RzL2x5bnguaCAoX19MWU5YT1MpOiBEZWZpbmUuCisKK1R1ZSBBcHIgMjYgMTU6MDQ6MjYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBBZGp1c3QgdGhlIGFkZGVuZCBvZiByZWxvY2F0aW9ucworCWFnYWluc3Qgc2VjdGlvbiBzeW1ib2xzIHRvIGF2b2lkIGxvc2luZyBkdXJpbmcgbGQgLXIuCisKK1R1ZSBBcHIgMjYgMTI6MTY6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKHNoc3RydGFiX2xlbmd0aF9maXhlZCk6IFJlbW92ZSB1c2VsZXNzIHN0YXRpYworCXZhcmlhYmxlLgorCShzdHJ1Y3QgZWxmX3NlY3RfZGF0YSk6IFJlbW92ZSB1bnVzZWQgc3RydWN0dXJlLgorCShlbGZfb2JqZWN0X3ApOiBGcmVlIG1lbW9yeSBpZiBlcnJvciBvY2N1cnMuICBDaGVjayByZXR1cm4gdmFsdWUKKwlvZiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgSWYgZWxmX2dldF9zdHJfc2VjdGlvbiBmYWlscywKKwlwcmVzZXJ2ZSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHNldHRpbmcgd3JvbmdfZm9ybWF0LgorCShudWxsX3NoZHIpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgorCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogUmVtb3ZlIHNoc3RydGFiX2xlbmd0aF9maXhlZCBhc3NpZ25tZW50LgorCUFsbG9jYXRlIGZpcnN0IHNlY3Rpb24gaGVhZGVyIG9uIEJGRCBvYnN0YWNrIHJhdGhlciB0aGFuIHVzaW5nCisJbnVsbF9zaGRyLgorCShiZmRfcHJwc2luZm8pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIG5ld3NlY3QuCisKK01vbiBBcHIgMjUgMTU6MzE6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IFVuZG8gcGF0Y2ggb2YgQXByIDEwOyBicmVha3MgU29sYXJpcy4KKworCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKKwl0byBjcmVhdGUgc2VjdGlvbnMuICBDaGVjayByZXR1cm4gdmFsdWUgb2YgcmVjdXJzaXZlIGNhbGxzLgorCShiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX21ha2Vfc2VjdGlvbi4KKwkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBMaWtld2lzZS4KKwkoZWxmX29iamVjdF9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWN0aW9uX2Zyb21fc2hkci4KKwkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IExpa2V3aXNlLgorCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJc2VjdGlvbl9mcm9tX2VsZl9pbmRleC4KKwkoYmZkX3Byc3RhdHVzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBDaGVjayByZXR1cm4gdmFsdWUgb2YKKwliZmRfbWFrZV9zZWN0aW9uLgorCShiZmRfZnByZWdzZXQpOiBMaWtld2lzZS4KKwkoYmZkX3BycHNpbmZvKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuCisJKGVsZl9jb3JlZmlsZV9ub3RlKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBvZiBiZmRfcHJzdGF0dXMsCisJYmZkX2ZwcmVnc2V0LCBhbmQgYmZkX3BycHNpbmZvLgorCShlbGZfY29yZV9maWxlX3ApOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgZWxmX2NvcmVmaWxlX25vdGUuCisKK0ZyaSBBcHIgMjIgMTE6MDg6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJR2V0IHJpZCBvZiB0aGUgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbiBoYWNrLgorCSogZWNvZmYuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IERvbid0IGNyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24uCisJKGVjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCBoYW5kbGUgdGhlIC5yZWdpbmZvIHNlY3Rpb24uCisJKGVjb2ZmX3NpemVvZl9oZWFkZXJzKTogTGlrZXdpc2UuCisJKGVjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgorCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCisJKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgorCShlY29mZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgorCShlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSB0aGUgR1AgdmFsdWUgYW5kIHRoZQorCXJlZ2lzdGVyIG1hc2tzLgorCShiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfZWNvZmZfc2V0X3JlZ21hc2tzKTogTmV3IGZ1bmN0aW9uLgorCSogYmZkLWluLmggKGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgorCShiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KKwkoYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKKwlGaXggRUNPRkYgb2JqY29weSB0byBhY3R1YWxseSBjb3B5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCisJKGVjb2ZmX2dldF9leHRyKTogQXNzdW1lIHRoYXQgYW55IEVDT0ZGIHN5bWJvbCB3aXRoIGxvY2FsIGNsZWFyIGlzCisJYW4gZXh0ZXJuYWwgc3ltYm9sLCByYXRoZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sIGZsYWdzLiAgT25seQorCWNoZWNrIHRoZSBmbGFncyBmb3Igbm9uLUVDT0ZGIHN5bWJvbHMuCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IERvbid0IGNyYXNoIGlmIHRoZQorCW91dHB1dF9zZWN0aW9uIGZpZWxkIG9mIHRoZSBzeW1ib2wgc2VjdGlvbiBpcyBOVUxMLgorCSogbGliZWNvZmYuaCAoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUgYXMKKwlmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZyBhcyBtYWNyby4KKworCSogaWVlZS5jIChpZWVlX29iamVjdF9wKTogU2V0IGJmZF9lcnJvcl9nb3Rfd3JvbmdfZm9ybWF0IGlmCisJYXBwcm9wcmlhdGUuCisKKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjMyX3Bvd2VycGNfdmVjLgorCisJKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgorCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBBY2NlcHQgYmZkX2FyY2hfbTY4ayBhcyB3ZWxsIGFzCisJYmZkX2FyY2hfdW5rbm93bi4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgorCWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guCisJKiBlbGZjb2RlLmggKGVsZl9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgY2hlY2sgYSBsaXN0IG9mIEVMRgorCWFyY2hpdGVjdHVyZXMsIGp1c3Qgc2VlIGlmIHRoZSBkZXNpcmVkIGFyY2hpdGVjdHVyZSBtYXRjaGVzIHdoYXQKKwl0aGUgRUxGIGJhY2tlbmQgcGVybWl0cy4KKworCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZW5hbWUgU0hNQUdJQyB0bworCVNIX0FSQ0hfTUFHSUMgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvc2guaC4KKwkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KKworCUZvbGxvdyBjb252ZW50aW9uIGluIHdoaWNoIGVhY2ggTkxNIGhlYWRlciBoYXMgYW4gOCBieXRlIHN0YW1wCisJZm9sbG93ZWQgYnkgYSBmb3VyIGJ5dGUgbGVuZ3RoLgorCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogUmVuYW1lIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKKwl0byBubG1fY3lnbnVzX2V4dF9oZWFkZXIsIGFuZCBjaGFuZ2UgdHlwZSB0bworCU5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlci4KKwkobmxtX2N5Z251c19leHRfaGVhZGVyKTogUmVuYW1lIGZyb20gbmxtX2N5Z251c19zZWN0aW9uX2hlYWRlci4KKwkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBVc2UgQ3lHblVzRXggaW5zdGVhZAorCW9mIEN5R25Vc1NlQ3MuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbiB0byBjeWdudXNfZXh0LiAgUmVxdWlyZQorCWxlbmd0aCB3b3JkIHRvIGJlIDguCisJKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uIHRvCisJY3lnbnVzX2V4dC4gIFNldCBsZW5ndGggd29yZCB0byA4LgorCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24KKwl0byBjeWdudXNfZXh0LgorCitUaHUgQXByIDIxIDIyOjU0OjIyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiAgS2VlcCBzZWN0aW9uIHRhYmxlCisJKGZyb20gQ3lHblVzU2VDcykgaW4gbW9yZSBwZXJtYW5lbnQgbWVtb3J5IHRvIGtlZXAgc2VjdGlvbiBuYW1lcworCWZyb20gZ2V0dGluZyB0cmFzaGVkLgorCitUaHUgQXByIDIxIDA5OjI5OjM3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbGliZWxmLmggKGVsZl9vYmpfdGRhdGEpOiAgQWRkIG1lbWJlcnMgZm9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlCisJaGFuZGxpbmcuCisJKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBIYW5kbGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCisJKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcgorCXRvIHNlbGVjdCBzdGF0aWMgb3IgZHluYW1pYyBzeW1ib2wgdGFibGUgYW5kIHJldHVybiBudW1iZXIgb2YKKwlzeW1ib2xzIHNsdXJwZWQgb3IgLTEgb24gZXJyb3IuCisJKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiKTogIFNldCBiZmQgc3ltY291bnQgZnJvbQorCWVsZl9zbHVycF9zeW1ib2xfdGFibGUgcmVzdWx0LgorCSogZWxmY29kZS5oIChlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLAorCWVsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiAgTmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgZHluYW1pYworCXN5bWJvbCB0YWJsZS4KKwkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaCAoQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyk6CisJQ2hhbmdlIHRvIGhhbmRsZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgcHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zCisJZm9yIGR5bmFtaWMgcmVsb2NzLgorCSogYW91dHguaCAoaG93dG9fdGFibGVfc3RkLCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSwKKwlOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pLCBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsCisJYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiAgSGFuZGxlIHJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUKKwlyZWxvY2F0aW9ucy4KKworVGh1IEFwciAyMSAxMTo1ODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlDbGVhbiB1cCB1c2VzIG9mIF9iZmRfZHVtbXlfdGFyZ2V0IChmcm9tIFBldGVyIFNjaGF1ZXIpLgorCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfdGFyZ2V0KTogU2V0IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCisJKiBubG0tdGFyZ2V0LmggKG5sbV9jb3JlX2ZpbGVfcCk6IERlZmluZSBhcyBfYmZkX2R1bW15X3RhcmdldCwgbm90CisJTlVMTC4KKwkqIHNyZWMuYyAoc3JlY192ZWMpOiBVc2UgX2JmZF9kdW1teV90YXJnZXQsIG5vdCBOVUxMLCBpbgorCV9iZmRfY2hlY2tfZm9ybWF0LgorCShzeW1ib2xzcmVjX3ZlYyk6IExpa2V3aXNlLgorCSogdGVraGV4LmMgKHRla2hleF92ZWMpOiBMaWtld2lzZS4KKworCSogbGlibmxtLmggKHN0cnVjdCBubG1fb2JqX3RkYXRhKTogQWRkIG5sbV9jeWdudXNfc2VjdGlvbl9oZHIKKwlmaWVsZC4KKwkobmxtX2N5Z251c19zZWN0aW9uX2hlYWRlcik6IE5ldyBhY2Nlc3NvciBtYWNyby4KKwkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogRnJlZSBuZXcgdGRhdGEgc3RydWN0dXJlIGlmIGZhaWx1cmUuCisJQWRkIGZpeGVkIHNlY3Rpb25zIGJlZm9yZSBzd2FwcGluZyBpbiBhdXhpbGlhcnkgaGVhZGVycy4gIEFmdGVyCisJYWRkaW5nIHNlY3Rpb25zLCB0cmVhdCBlcnJvcnMgYXMgcmVhbCwgbm90IGFzIHdyb25nIGZvcm1hdC4KKwkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBTd2FwIGluIHRoZSBzZWN0aW9ucyBoZWFkZXI7IGFkZAorCXNlY3Rpb25zIHRvIHRoZSBCRkQgZm9yIGVhY2ggc2VjdGlvbiBpdCBkZXNjcmliZXMuCisJKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFN3YXAgb3V0IHRoZSBzZWN0aW9ucyBoZWFkZXIuCisJKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBY2NvdW50IGZvciB0aGUgc2l6ZSBvZiB0aGUKKwlzZWN0aW9ucyBoZWFkZXIuCisKK1dlZCBBcHIgMjAgMTY6NDU6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29mZi1zcGFyYy5jIChzcGFyY2NvZmZfdmVjKTogQ2hhbmdlIG1pbmltdW0gYWxpZ25tZW50IHBvd2VyIHRvCisJMiwgc28gdGhhdCBzdGFiIHNlY3Rpb25zIGNhbiBiZSBtdWx0aXBsZXMgb2YgNCBieXRlcyBvbmx5LgorCisJKiBob3N0cy9pMzg2YWl4Lmg6IENoYW5nZXMgdG8gYXZvaWQgcHJvdG90eXBlcyBjb25mbGljdHMgd2l0aCB0aGUKKwlvbmVzIGRlZmluZWQgaW4gc3RkbGliLmguICAoRnJvbSBNaW5oIFRyYW4tTGUuKQorCitXZWQgQXByIDIwIDE0OjE1OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbmxtMzItcHBjLmM6IENvbXBsZXRlIHJld3JpdGUgZm9yIG5ldyB2ZXJzaW9uIG9mIFBvd2VyUEMKKwlOZXRXYXJlLiAgT2xkIGNvZGUgc3RpbGwgcHJlc2VudCwgYnV0IGlmZGVmZmVkIG91dC4KKworCSogbmxtY29kZS5oIChubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19pbik6IERvbid0IGFzc3VtZSBhCisJcGFydGljdWxhciBmb3JtYXQgZm9yIHRoZSBjdXN0b21lciBoZWFkZXIuICBBbGxvY2F0ZSBhIGJsb2NrIG9mCisJbWVtb3J5IGFuZCByZWFkIGl0IGludG8gdGhhdC4KKwkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogV3JpdGUgb3V0IHRoZSBibG9jayBvZiBtZW1vcnkuCisJKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJbmNsdWRlIGxlbmd0aCBvZiBjdXN0b21lcgorCWhlYWRlciB3aGVuIGNvbXB1dGluZyBpdHMgc2l6ZS4KKworTW9uIEFwciAxOCAxNDoyNzoxNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBHZXQgdGhlIHNwYWNlJ3MgbnVtYmVyIGZyb20gdGhlCisJYmFja2VuZCBwcml2YXRlIHNlY3Rpb24gZGF0YSByYXRoZXIgdGhhbiB0YXJnZXRfaW5kZXguCisJKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IFN0b3JlIHRoZSBzcGFjZSdzIG51bWJlcgorCWluIHRoZSBiYWNrZW5kIHByaXZhdGUgc2VjdGlvbiBkYXRhIHJhdGhlciB0aGFuIHRhcmdldF9pbmRleC4KKworCSogc29tLmggKHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KTogQWRkIHNwYWNlX251bWJlci4KKworRnJpIEFwciAxNSAxMjoyMjowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvZmYtYTI5ay5jIChyZWxvY19wcm9jZXNzaW5nKTogQWx3YXlzIHNldCB0aGUgYWRkcmVzcyBvZiBhCisJUl9JSENPTlNUIHJlbG9jIHRvIHRoYXQgb2YgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuCisJZ2FzIGRvZXMgdGhpcyBhbnlob3csIGJ1dCBzb21lIG90aGVyIGFzc2VtYmxlcnMgc2VlbSB0byBsZWF2ZQorCWdhcmJhZ2UgaW4gdGhlIFJfSUhDT05TVCBhZGRyZXNzIGZpZWxkLgorCisJKiBiZmQvYXJjaGl2ZS5jOiBDb25zaXN0ZW50bHkgdXNlIEFSRk1BRzsgZnJvbQorCXNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSAoQW5kcmVhcyBTY2h3YWIpLgorCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBVc2UgQVJGTUFHIHJhdGhlciB0aGFuICdgJyBhbmQKKwknXDAxMicuCisJKGJzZF93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgorCShjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCisKKwkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgbG9jYWwKKwlyZWxvY3MgYWdhaW5zdCB0aGUgLnRleHQgc2VjdGlvbiBhcyByZXF1aXJlZC4KKwkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IFdoZW4gcmVsYXhpbmcsIGFkanVzdAorCVBEUiBhZGRyZXNzZXMgYXMgcmVxdWlyZWQuCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVGFrZSBmZHIgYXJndW1lbnQuICBNYXAgZmRyCisJaW5kZXggdGhyb3VnaCByZmQgbWFwIGlmIGl0IGV4aXN0cy4gIENoZWNrIGZvciBhIGNvdXBsZSBvZiBjYXNlcworCXdoaWNoIGdkYiBoYW5kbGVzIHNwZWNpYWxseS4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkoZWNvZmZfdHlwZV90b19zdHJpbmcpOiBUYWtlIGZkciBhcmd1bWVudCByYXRoZXIgdGhhbiBhdXhfcHRyIGFuZAorCWJpZ2VuZGlhbiBhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkoZWNvZmZfcHJpbnRfc3ltYm9sKTogSGFuZGxlIHN0U3RydWN0LCBzdFVuaW9uIGFuZCBzdEVudW0uCisKK1RodSBBcHIgMTQgMTM6MDU6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBkdW1teSBlbnRyaWVzIHRvIGFjY291bnQgZm9yCisJbnVtYmVyaW5nIGNoYW5nZXMgaW4gaW5jbHVkZS9jb2ZmL21pcHMuaC4gIEFkZCBlbnRyaWVzIGZvcgorCU1JUFNfUl9SRUxISSBhbmQgTUlQU19SX1JFTExPLgorCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBIYW5kbGUgYW4gZXh0cmEgYml0IGZvciB0aGUgcmVsb2MgdHlwZQorCXdoZW4gbGl0dGxlIGVuZGlhbi4gIFRyZWF0IGludGVybmFsIE1JUFNfUl9SRUxMTyBvciBNSVBTX1JfUkVMSEkKKwlyZWxvY3MgbGlrZSBNSVBTX1JfU1dJVENILCBhbmQgY29udmVydCByX29mZnNldCBmcm9tIDI0IHRvIDMyCisJYml0cy4KKwkobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgorCShtaXBzX2FkanVzdF9yZWxvY19pbik6IEhhbmRsZSBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IKKwlNSVBTX1JfUkVMSEkgcmVsb2NzIGxpa2UgTUlQU19SX1NXSVRDSC4KKwkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCisJKG1pcHNfcmVsaGlfYWRkciwgbWlwc19yZWxoaV9hZGRlbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkobWlwc19yZWxoaV9yZWxvYywgbWlwc19yZWxsb19yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCisJKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVHVybiBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGludG8KKwlNSVBTX1JfUkVMSEkgYW5kIHR1cm4gQkZEX1JFTE9DX1BDUkVMX0xPMTYgaW50byBNSVBTX1JfUkVMTE8uCisJKG1pcHNfcmVsb2NhdGVfaGkpOiBSZW5hbWUgZnJvbSBtaXBzX3JlbG9jYXRlX3JlZmhpLCBhbmQgYWRkIHBjcmVsCisJYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgorCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgZ290X3JlZmxvIHRvIGdvdF9sbyBhbmQKKwlyZWZsb19pbnRfcmVsIHRvIGxvX2ludF9yZWwuICBIYW5kbGUgTUlQU19SX1JFTExPIGFuZCBNSVBTX1JfUkVMSEkKKwlyZWxvY3MuCisJKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfUkVMSEkvTUlQU19SX1JFTExPIHBhaXJzIHdoZW4KKwlleHBhbmRpbmcgYSBQQyByZWxhdGl2ZSBjYWxsLgorCisJKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUworCWFuZCBCRkRfUkVMT0NfUENSRUxfTE8xNi4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworV2VkIEFwciAxMyAxMTo1MDowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IFNldCBtaW5pbXVtIGFsaWdubWVudCBwb3dlciB0byAzLgorCitUdWUgQXByIDEyIDEzOjM2OjIwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEFsd2F5cyBlbWl0IGF0IGxlYXN0CisgICAgICAgIG9uZSByZWxvY2F0aW9uIGZvciBhbnkgbm9uLWJzcyBzZWN0aW9uLgorCitNb24gQXByIDExIDE0OjQxOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IHJlcXVpcmUKKwl0aGUgZmlsZSBhbGlnbm1lbnQgdG8gY29ycmVzcG9uZCB0byB0aGUgcGFnZSBzaXplIHdoZW4gbGlua2luZworCXdpdGggLU4uCisKK1N1biBBcHIgMTAgMDE6MDI6MjQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRm9yIHJlbGEgcmVsb2NhdGlvbnMsIGFkanVzdCB0aGUKKwlhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGludm9sdmluZyBzZWN0aW9uIHN5bWJvbHMgdG8gYWNjb3VudAorCWZvciB0aGUgbG9zc2FnZSBvZiAxOjEgbWFwcGluZyBmcm9tIGlucHV0IHNlY3Rpb24gc3ltYm9scyB0bworCW91dHB1dCBzZWN0aW9uIHN5bWJvbHMuCisKK0ZyaSBBcHIgIDggMTI6MjI6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBOZXcgZnVuY3Rpb24uCisJKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykKKwlyYXRoZXIgdGhhbiBtYWtpbmcgc2VjdGlvbnMgaW5saW5lLgorCShOQU1FKGFvdXQsbWtvYmplY3QpKTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCisJKE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpKTogQ2FsbCBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykuCisJKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGRlcmVmZXJlbmNlIG9ial90ZXh0c2VjIChhYmZkKSBvcgorCW9ial9kYXRhc2VjIChhYmZkKSBpZiB0aGV5IGFyZSBOVUxMLgorCSogbGliYW91dC5oIChOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykpOiBEZWNsYXJlLgorCSogYm91dC5jIChiX291dF9ta29iamVjdCk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgorCShiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KKwkoYl9vdXRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKwkqIGkzODZvczlrLmMgKG9zOWtfbWtvYmplY3QpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KKwkob3M5a193cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGFvdXRfMzJfbWFrZV9zZWN0aW9ucy4KKwkob3M5a19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykpOiBEb24ndCBzZXQgTl9FWFQgaW4gdGFyZ2V0CisJaW5kZXguCisKK1dlZCBBcHIgIDYgMjA6NDQ6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCisKK1RodSBBcHIgIDcgMTQ6MjM6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgTUlQU19SX1NXSVRDSC4KKwkobWlwc19lY29mZl9zd2FwX3JlbG9jX2luKTogRm9yIE1JUFNfUl9TV1RJQ0gsIGNvcHkgcl9zeW1uZHggaW50bworCXJfb2Zmc2V0IGFuZCBzZXQgcl9zeW1uZHggdG8gUkVMT0NfU0VDVElPTl9URVhULgorCShtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRm9yIE1JUFNfUl9TV0lUQ0gsIGdldCB0aGUgcl9zeW1uZHgKKwl2YWx1ZSBmcm9tIHRoZSByX29mZnNldCBmaWVsZC4KKwkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBNYXhpbXVtIHJfdHlwZSB2YWx1ZSBpcyBub3cgTUlQU19SX1NXSVRDSC4KKwlGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgcl9vZmZzZXQgZmllbGQgaW50byB0aGUgYWRkZW5kIGZpZWxkLgorCShtaXBzX2FkanVzdF9yZWxvY19vdXQpOiBGb3IgTUlQU19SX1NXSVRDSCwgY29weSB0aGUgYWRkZW5kIGZpZWxkCisJaW50byB0aGUgcl9vZmZzZXQgZmllbGQuCisJKG1pcHNfc3dpdGNoX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgorCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFRyYW5zbGF0ZSBCRkRfUkVMT0NfR1BSRUwzMiBpbnRvCisJTUlQU19SX1NXSVRDSC4KKwkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9TV0lUQ0guCisJKG1pcHNfcmVsYXhfc2VjdGlvbik6IEFkanVzdCBNSVBTX1JfU1dJVENIIG9mZnNldCBpZiBuZWNlc3NhcnkuCisKK1RodSBBcHIgIDcgMTE6MTA6NTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU3VwcG9ydCBjYWxsaW5nIHRoZSBiYWNrZW5kCisJZnVuY3Rpb24gZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyB3aGVuIGp1c3QgYmVnaW5uaW5nIHRvCisJd3JpdGUgYW4gb2JqZWN0IGZpbGUuCisKKwkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogRGVjbGFyZS4KKworCSogZWxmezMyLDY0fS10YXJnZXQuaCAoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IFByb3ZpZGUKKwlhIGRlZmF1bHQgZGVmaW5pdGlvbi4KKwkoZWxmezMyLDY0fV9iZWQpOiBBZGQgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZy4KKwkKKwkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbi4KKwkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgorCisJKiBlbGYzMi1ocHBhLmMgKHN5bWV4dF9jaGFpbl9idWlsdCk6IERlbGV0ZS4KKwkoc3ltZXh0X2NoYWluX3NpemUpOiBSZW5hbWVkIGZyb20gc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUuCisJKGVsZjMyX2hwcGFfYmFja2VuZF97YmVnaW4sZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb25zLgorCShhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluKTogTmV3IGZ1bmN0aW9uLgorCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSB3cml0ZXMgdG8gdGhlIHN5bWJvbCBleHRlbnNpb24KKwlzZWN0aW9uIHVudGlsIGl0J3MgYmVlbiByZWJ1aWx0IGludGVybmFsbHkuCisJKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogU3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIGlzIG5vCisJbG9uZ2VyIHNwZWNpYWwuCisJKGVsZl9iYWNrZW5kX3tiZWdpbixmaW5hbH1fd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KKwkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IFNpbXBsaWZ5IG5vdyB0aGF0IG11Y2ggY29kZSBoYXMKKwltaWdyYXRlZCBpbnRvIGVsZjMyX2hwcGFfYmFja2VuZF97YmVpbmcsZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcuCisKK1dlZCBBcHIgIDYgMTc6MjQ6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQWRkIG5ldyB0YXJnZXQgdmVjdG9ycyB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbHMgYW5kIGR5bmFtaWMKKwlyZWxvY3MuICBDaGFuZ2UgYS5vdXQgdG8gdXNlIHRoZXNlIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGR5bmFtaWMKKwlzeW1ib2xzIGFuZCByZWxvY3MgYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHN5bWJvbHMgYW5kIHJlbG9jcy4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBmaWVsZHMKKwlfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwKKwlfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwKKwlfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLAorCV9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MuCisJKEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMpOiBEZWZpbmUuCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKToKKwlEZWZpbmUuCisJKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KKwkoX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCisJKF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgorCSogYmZkLmMgKGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUuCisJKGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCisJKGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KKwkoYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgorCSogc3Vub3MuYyAoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCisJKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCisJKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZS4KKwkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgorCShNWV9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZS4KKwkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWZpbmUuCisJKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBkeW5zeW1fY291bnQgYW5kCisJZHlucmVsX2NvdW50IHRvIGxvbmcuICBBZGQgZmllbGRzIGNhbm9uaWNhbF9keW5zeW0gYW5kCisJY2Fub25pY2FsX2R5bnJlbC4KKwkoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayB0aGF0IEJGRCBoYWQgRFlOQU1JQyBmbGFnIHNldC4KKwlDbGVhciBpbmZvLT5jYW5vbmljYWxfZHluc3ltIGFuZCBpbmZvLT5jYW5vbmljYWxfZHlucmVsLgorCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykpOiBSZW1vdmVkLgorCShNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IFJlbW92ZWQuCisJKHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KKwkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgorCShzdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KKwkoc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJhb3V0Lmg6IERlY2xhcmUgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCBhbmQKKwlyZWxvY19zdGRfZXh0ZXJuYWwgdG8gYXZvaWQgcHJvdG90eXBlIHByb2JsZW1zLgorCShzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgZmllbGRzIHJlYWRfZHluYW1pY19zeW1ib2xzIGFuZAorCXJlYWRfZHluYW1pY19yZWxvY3MuCisJKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IERlY2xhcmUuCisJKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBEZWNsYXJlLgorCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogRGVjbGFyZS4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSk6IFJlbmFtZWQgZnJvbQorCXRyYW5zbGF0ZV9zeW1ib2xfdGFibGUgYW5kIG1hZGUgbm9uLXN0YXRpYy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCisJKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgcmVhZCBkeW5hbWljIHN5bWJvbHMuCisJKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBEb24ndCByZWFkIGR5bmFtaWMgcmVsb2NzLgorCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IERvbid0IGNvdW50IGR5bmFtaWMgcmVsb2NzLgorCSogYW91dGYxLmggKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGJvdGhlciB0bworCXJlbW92ZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJlbG9jcy4gIFRoZXkgd2lsbCBubyBsb25nZXIgYmUKKwlwcmVzZW50LgorCShNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KKwkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KKwkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCisJKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRlZmluZS4KKwkoTVlfcmVhZF9keW5hbWljX3JlbG9jcyk6IERvbid0IGRlZmluZS4KKwkoTVkoYmFja2VuZF9kYXRhKSk6IERvbid0IGluaXRpYWxpemUgZHluYW1pYyBlbnRyeSBwb2ludHMuCisJKE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgdG8KKwlfYmZkX25vZHluYW1pYyB2ZXJzaW9uLgorCShNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZS4KKwkoTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBMaWtld2lzZS4KKwkqIEFsbCBiYWNrZW5kczogQWRkZWQgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyB0byB0YXJnZXQgdmVjdG9yLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogbGliYmZkLmg6IFJlYnVpbHQuCisKKwkqIGNmLW02OGtseW54LmM6IEluY2x1ZGUgc3lzZGVwLmguCisKKwkqIGhwMzAwaHB1eC5jOiBSZW1vdmVkIHNvbWUgc3BhY2VzIGluIHVzZXMgb2YgTkFNRSB0byBhdm9pZAorCXByb2JsZW1zIHdpdGggdHJhZGl0aW9uYWwgQyBjb21waWxlcnMuCisKKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlYXJyYW5nZWQgZmllbGRzIGluIHRhcmdldCB2ZWN0b3IuCisJUmVtb3ZlZCBfYmZkX2RlYnVnX2luZm9fc3RhcnQsIF9iZmRfZGVidWdfaW5mb19lbmQgYW5kCisJX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUsIHdoaWNoIHdlcmUgbmV2ZXIgdXNlZC4KKwkoQkZEX0pVTVBfVEFCTEVfR0VORVJJQywgQkZEX0pVTVBfVEFCTEVfQ09QWSk6IERlZmluZWQuCisJKEJGRF9KVU1QX1RBQkxFX0NPUkUsIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUpOiBEZWZpbmVkLgorCShCRkRfSlVNUF9UQUJMRV9TWU1CT0xTLCBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MpOiBEZWZpbmVkLgorCShCRkRfSlVNUF9UQUJMRV9XUklURSwgQkZEX0pVTVBfVEFCTEVfTElOSyk6IERlZmluZWQuCisJKiBBbGwgYmFja2VuZHM6IENoYW5nZWQgdG8gdXNlIHRoZSBuZXcgQkZEX0pVTVBfVEFCTEVfKiBtYWNyb3MKKwlyYXRoZXIgdGhhbiB0aGUgc2luZ2xlIEpVTVBfVEFCTEUgbWFjcm8uICBSZW1vdmVkIG1hbnkgb2YgdGhlCisJd2VpcmQgbWFjcm8gZGVmaW5pdGlvbnMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG1vbm9saXRoaWMKKwlKVU1QX1RBQkxFLgorCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBSZW1vdmVkLgorCSogbGliYmZkLWluLmg6IERlZmluZSBhIGJ1bmNoIG9mIG1hY3JvcywgYW5kIGRlY2xhcmUgYSBmZXcKKwlmdW5jdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgbmV3IEJGRF9KVU1QX1RBQkxFXyogbWFjcm9zLgorCSogbGliYmZkLmMgKF9iZmRfZHVtbXlfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZWQuCisJKGJmZF9mYWxzZSk6IFNldCBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCisJKGJmZF9udWxsdm9pZHB0cik6IExpa2V3aXNlLgorCShiZmRfbjEpOiBOZXcgZnVuY3Rpb24uCisJKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IFJlbmFtZWQgZnJvbQorCV9iZmRfZHVtbXlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wLgorCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogU2ltaWxhciByZW5hbWUuICBTZXQKKwliZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24uCisJKF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IExpa2V3aXNlLgorCShfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW5hbWVkIGZyb20KKwliZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cy4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCisJKF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbWlsYXIgcmVuYW1lLgorCSogaWVlZS5jOiAjaWYgMCBvdXQgaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCwKKwlpZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCwgaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLiAgVGhleQorCXdlcmUgbmV2ZXIgY2FsbGVkLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogbGliYmZkLmg6IFJlYnVpbHQuCisKK1R1ZSBBcHIgIDUgMjI6MTA6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIENydWRlIHN1cHBvcnQgZm9yIGV4YW1pbmluZyBkeW5hbWljIGxpYnJhcmllcy4KKwkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IERZTkFNSUMgZmxhZyBmb3IgU0hMX01BR0lDIGFuZAorCURMX01BR0lDIG9iamVjdHMuCisJKHNvbV9wcmVwX2hlYWRlcnMpOiBQcmVzZXJ2ZSB0aGUgc3lzdGVtX2lkIGZvciBEWU5BTUlDIG9iamVjdHMuCisJVXNlIFNITF9NQUdJQyBhcyB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LgorCVdyaXRlIGV4ZWMgaGVhZGVycyBmb3IgRFlOQU1JQyBvYmplY3RzLgorCShzb21fYmVnaW5fd3JpdGluZyk6IERZTkFNSUMgb2JqZWN0cyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudAorCXJlc3RyaWN0aW9ucyBhcyBEX1BBR0VEIG9iamVjdHMuCisJKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFRyZWF0IERZTkFNSUMgb2JqZWN0cyBsaWtlIEVYRUNfUAorCW9iamVjdHMuCisJKG9iamVjdF9mbGFncyk6IEFkZCBEWU5BTUlDLgorCitUdWUgQXByICA1IDE3OjQ4OjUyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogaTM4Nmx5bnguYywgc3BhcmNseW54LmMgKE5BTUUpOiBSZW1vdmUgZW1iZWRkZWQgd2hpdGVzcGFjZSBpbgorCW1hY3JvIHVzZXMsIGNvbmZ1c2VzIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzLgorCitUdWUgQXByICA1IDE1OjUwOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogQWRkIG1pc3NpbmcgUEFSQU1TIGRlY2wuCisJRG9uJ3QgZnJlZSBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIGEgYmZkX29iamVjdC4KKwkoc29tX2Nsb3NlX2FuZF9jbGVhbnVwKTogQ2FsbCBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8uCisKK1R1ZSBBcHIgIDUgMTE6MjI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCByZW1vdmUgZW1wdHkgc2VjdGlvbnMuCisJSXQgdHVybnMgb3V0IG5vdCB0byBiZSByZXF1aXJlZCBvbiBJcml4IDUsIGFuZCBpdCBjYXVzZXMgcHJvYmxlbXMKKwlpZiB0aGUgc2VjdGlvbnMgaGFwcGVuIHRvIGNvbnRhaW4gc3ltYm9scy4KKworCSogZWxmY29kZS5oICh3cml0ZV9zaGRyc19hbmRfZWhkcik6IENvcnJlY3QgYmZkX3dyaXRlIGNoZWNrLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IERvbid0IGVycm9yIG91dCBpZgorCXNlY3Rpb24tPnJlbG9jYXRpb24gaXMgTlVMTDsgbWFsbG9jIG1pZ2h0IGhhdmUgcmV0dXJuZWQgTlVMTCB3aGVuCisJZ2l2ZW4gYSB6ZXJvIHNpemUgaWYgdGhlcmUgd2VyZSBubyByZWxvY2F0aW9ucy4KKwkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBjb2ZmY29kZS5oIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCSogZWNvZmYuYyAoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBlbGZjb2RlLmggKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KKwkqIG1pcHNic2QuYyAoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgorCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KKwkqIG5sbWNvZGUuaCAobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCSogc29tLmMgKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KKwkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9yZWxvY190YWJsZSkpOiBMaWtld2lzZS4gIEFsc28sIGlmIG1hbGxvYworCXJldHVybnMgTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgorCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IElmIG1hbGxvYyByZXR1cm5zCisJTlVMTCwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHdlIGFza2VkIGZvciB6ZXJvIGJ5dGVzLgorCSogbmxtY29kZS5oIChubG1fc2x1cnBfcmVsb2NfZml4dXBzKTogTGlrZXdpc2UuCisKK01vbiBBcHIgIDQgMTU6MzA6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogRG9uJ3QgZnJlZSBhbnl0aGluZworCWlmIHdlIGRvbid0IGhhdmUgYSBiZmRfb2JqZWN0LgorCisJTWFkZSBzdXJlIHRoYXQgZXZlcnkgY2FsbCB0byBiZmRfcmVhZCwgYmZkX3dyaXRlLCBhbmQgYmZkX3NlZWsKKwljaGVja3MgdGhlIHJldHVybiB2YWx1ZSBhbmQgaGFuZGxlZCBiZmRfZXJyb3IgY29ycmVjdGx5LiAgVGhlc2UKKwljaGFuZ2VzIGFyZSBub3QgaXRlbWlzZWQuICBBbHNvOgorCSogYW91dHguaCAoZW1pdF9zdHJ0YWIpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbiwgYW5kIHJldHVybgorCWVycm9ycy4KKwkoTkFNRShhb3V0LHdyaXRlX3N5bXMpKTogQ2hlY2sgZW1pdF9zdHJ0YWIgcmV0dXJuIHZhbHVlLgorCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBMaWtld2lzZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4sCisJYW5kIHJldHVybiBlcnJvcnMuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgY29mZl93cml0ZV9yZWxvY3MgcmV0dXJuCisJdmFsdWUuCisJKiBpMzg2b3M5ay5jIChvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4pOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KKwlib29sZWFuLgorCShvczlrX29iamVjdF9wKTogQ2hlY2sgb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIHJldHVybiB2YWx1ZS4KKwkqIG9hc3lzLmMgKG9hc3lzX3JlYWRfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCisJKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZTogQ2hlY2sgb2FzeXNfcmVhZF9yZWNvcmQgcmV0dXJuIHZhbHVlLgorCShvYXN5c19vYmplY3RfcCwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCisJKG9hc3lzX3dyaXRlX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgorCShvYXN5c193cml0ZV9zeW1zKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBvYXN5c193cml0ZV9yZWNvcmQKKwlyZXR1cm4gdmFsdWUuCisJKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogQ2hlY2sgb2FzeXNfd3JpdGVfcmVjb3JkIHJldHVybiB2YWx1ZS4KKwkob2FzeXNfd3JpdGVfaGVhZGVyKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uICBDaGVjaworCW9hc3lzX3dyaXRlX3JlY29yZCByZXR1cm4gdmFsdWUuCisJKG9hc3lzX3dyaXRlX2VuZCwgb2FzeXNfd3JpdGVfZGF0YSk6IExpa2V3aXNlLgorCShvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWVzIG9mCisJb2FzeXNfd3JpdGVfaGVhZGVyLCBvYXN5c193cml0ZV9zeW1zLCBvYXN5c193cml0ZV9kYXRhLCBhbmQKKwlvYXN5c193cml0ZV9lbmQuCisJKiBzcmVjLmMgKHNyZWNfd3JpdGVfcmVjb3JkKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCisJKHNyZWNfd3JpdGVfaGVhZGVyKTogTGlrZXdpc2UuICBBbHNvLCBjaGVjayBzcmVjX3dyaXRlX3JlY29yZAorCXJldHVybiB2YWx1ZS4KKwkoc3JlY193cml0ZV9zZWN0aW9uLCBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IpOiBMaWtld2lzZS4KKwkoc3JlY193cml0ZV9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCisJKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJc3JlY193cml0ZV9zeW1ib2xzLCBzcmVjX3dyaXRlX2hlYWRlciwgc3JlY193cml0ZV9zZWN0aW9uLCBhbmQKKwlzcmVjX3dyaXRlX3Rlcm1pbmF0b3IuCisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKworTW9uIEFwciAgNCAxMDo1Njo0NSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFpeDM4Ni1jb3JlLmMgKGFpeDM4Nl9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KKwlhc2VjdGlvbiB0byBhc3ltYm9sLgorCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCisJYmZkIHRvIGFzeW1ib2wuCisJKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQorCWFzZWN0aW9uIHRvIGFzeW1ib2wuCisKK1N1biBBcHIgIDMgMTg6Mjc6MjkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogVXNlIG1hbGxvYyB0byBhbGxvY2F0ZSBzcGFjZQorCWZvciB0aGUgY2FjaGVkIGNvcHkgb2YgdGhlIG5hdGl2ZSBzdHJpbmcgdGFibGUuCisJKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIG5hdGl2ZSBzeW1ib2wgdGFibGUuCisJKHNvbV9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlIGZvciB0aGUgbmF0aXZlIGFuZCBnZW5lcmljCisJcmVsb2NhdGlvbiB0YWJsZXMuCisJKHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IEZyZWUgdGhlIGNhY2hlZCBuYXRpdmUgc3RyaW5ncywKKwlzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbnMuICBBbHNvIGZyZWUgdGhlIGNhbm9uaWNhbCBjYWNoZWQKKwlyZWxvY2F0aW9ucy4KKworRnJpIEFwciAgMSAxMjo0MDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSWYga2VlcF9tZW1vcnkgaXMgZmFsc2UsIG1ha2UKKwlzdXJlIHRoZSBzeW1ib2wgbmFtZSBpcyBzdG9yZWQgaW4gcGVybWFuZW50IG1lbW9yeSBiZWZvcmUgYWRkaW5nCisJaXQgdG8gdGhlIHN0cmluZyB0YWJsZS4KKworCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBPbmNlIHdlJ3ZlIGZvdW5kIGFuCisJb2JqZWN0LCBkb24ndCBib3RoZXIgdG8gbG9vayBmb3IgbW9yZSB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8KKwlidWlsZCBhIG1hcC4KKwkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBBZnRlciBhZGRpbmcgdGhlIHN5bWJvbHMgZm9yIGEgQkZELAorCWNhbGwgYmZkX2ZyZWVfY2FjaGVkX2luZm8gb24gaXQuCisKKwlBZGQgYmZkX2ZyZWVfY2FjaGVkX2luZm8gc3VwcG9ydCB0byBhLm91dCBiYWNrZW5kcy4KKwkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20KKwlhb3V0X2xpbmtfZ2V0X3N5bWJvbHMuICBSZWFkIHN0cmluZ3MgZXZlbiBpZiBzeW1ib2xzIGhhdmUgYmVlbgorCXJlYWQuICBTdG9yZSBzdHJpbmcgc2l6ZSBpbiBvYmpfYW91dF9zdHJpbmdfc2l6ZS4KKwkoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDYWxsIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgdG8KKwlyZWFkIHRoZSBzeW1ib2xzLiAgQWxsb2NhdGUgdGhlIGNhY2hlZCBzeW1ib2xzIHdpdGggbWFsbG9jLCBub3QKKwliZmRfYWxsb2MuCisJKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBBbGxvY2F0ZSB0aGUgY2FjaGVkIHJlbG9jcyB3aXRoCisJbWFsbG9jLCBub3QgYmZkX2FsbG9jLgorCShOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogTmV3IGZ1bmN0aW9uOyBmcmVlIGNhY2hlZAorCXN5bWJvbHMgYW5kIHJlbG9jcy4KKwkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkIGV4dGVybmFsX3N0cmluZ19zaXplIGZpZWxkLgorCShvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KKwkoTkFNRShhb3V0LGNsb3NlX2FuZF9jbGVhbnVwKSk6IERvbid0IGRlY2xhcmUuCisJKE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykpOiBEZWNsYXJlLgorCShhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgorCShhb3V0XzY0X2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgorCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLAorCWRlZmluZSBhcyBOQU1FKGFvdXQsZnJlZV9jYWNoZWRfaW5mbykuCisJKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwgZGVmaW5lIGFzCisJTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCisJKiBhb3V0LWFkb2JlLmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCisJKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCisJKiBib3V0LmMgKGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXApOiBEZWZpbmUuCisJKGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEb24ndCBkZWZpbmUuCisJKiBocDMwMGhwdXguYyAoTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUgYXMgYmZkX3RydWUuCisJKE1ZX2Nsb3NlX2FuZF9jbGVhbnVwKTogRG9uJ3QgZGVmaW5lLgorCSogaTM4Nmx5bnguYyAoTkFNRShseW54LHNsdXJwX3JlbG9jX3RhYmxlKSk6IEFsbG9jYXRlIHRoZSBjYWNoZWQKKwlyZWxvY3Mgd2l0aCBtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCisJKiBpMzg2b3M5ay5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgorCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgorCisJQWRkIGEgbmV3IGVudHJ5IHBvaW50IHRvIGZyZWUgbWVtb3J5IGNhY2hlZCBieSBhIEJGRC4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8gZmllbGQuCisJKiBiZmQuYyAoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBEZWZpbmUuCisJKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8uCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBBbGwgYmFja2VuZHM6IEluaXRpYWxpemUgYmZkX2ZyZWVfY2FjaGVkX2luZm8gZW50cnkgcG9pbnQgdG8KKwliZmRfdHJ1ZS4KKworCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IENvcnJlY3QgdHlwZSBvZgorCWZpcnN0LCB1bnVzZWQsIGFyZ3VtZW50LgorCShocHBhX2VsZl9pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUgaW5zdGVhZCBvZgorCXNvbV9iZmRfaXNfbG9jYWxfbGFiZWwuCisKKwkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogQWRkIHJlbG9jX2VudHJ5LT5hZGRyZXNzIHRvIHZhbHVlIG9mCisJYWJzb2x1dGUgUl9JUkVMIHJlbG9jLgorCitUaHUgTWFyIDMxIDExOjUyOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgSXJpeCA0IHNoYXJlZCBsaWJyYXJpZXMuCisJKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgYQorCS5saWIgc2VjdGlvbi4KKwkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGlmCisJU1RZUF9FQ09GRl9MSUIgYml0IGlzIHNldC4KKwkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogUm91bmQgdGhlIGNvbnRlbnRzIG9mIGEKKwkubGliIHNlY3Rpb24gdXAgdG8gdGhlIG5leHQgcGFnZSBib3VuZGFyeS4KKwkoZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiB3ZSBzZWUgYSAubGliIHNlY3Rpb24sIGluY3JlbWVudAorCXRoZSB2bWEgYnkgb25lIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc2hhcmVkIGxpYnJhcmllcyB3ZSBoYXZlLgorCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiB3ZSBzZWUgYQorCVNUWVBfRUNPRkZfTElCIHNlY3Rpb24sIGFuZCBkb24ndCBhZGp1c3QgdGV4dF9zdGFydCBvciBkYXRhX3N0YXJ0CisJb3IgYnNzX3NpemUgZWl0aGVyLgorCisJKiBjb2ZmY29kZS5oIChDQUxDX0FEREVORCk6IENoYW5nZSB0byBmZXRjaCBvcmlnaW5hbCBzeW1ib2wgdmFsdWUKKwlmcm9tIG9yaWdpbmFsIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgdmFsdWUgb2YgY3VycmVudCBCRkQgc3ltYm9sLgorCU5lZWRlZCBmb3IgbmV3IGxpbmtlci4KKwkqIGNvZmYtc3BhcmMuYyAoQ0FMQ19BRERFTkQpOiBMaWtld2lzZS4KKworCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHRoZSB0ZXh0X3N0YXJ0IGFuZAorCWRhdGFfc3RhcnQgZW50cmllcyBpbiB0aGUgb3B0aW9uYWwgaGVhZGVyIGNvcnJlY3RseSBldmVuIGlmIGEgdGV4dAorCW9yIGRhdGEgc2VjdGlvbiBzdGFydHMgYXQgbG9jYXRpb24gemVyby4KKworCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkZWQgQkZEX1JFTE9DXzI2IChmcm9tIHNlZgorCWFuZCByYWVidXJuKS4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9yZWFkX2ltcG9ydCk6IE51bGwgdGVybWluYXRlIHRoZSBzeW1ib2wKKwluYW1lLgorCSogbmxtMzItYWxwaGEuYyAobmxtX2FscGhhX3JlYWRfaW1wb3J0KTogTGlrZXdpc2UuCisJKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBMaWtld2lzZS4KKworCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCk6IFJlaW5kZW50ZWQuICBDaGFuZ2VkIHRvIHJldHVybgorCWJvb2xlYW4sIGFuZCBjaGFuZ2VkIHdyaXR0ZW4gdG8gdW5zaWduZWQgaW50ICouICBDaGVjayBlcnJvcgorCXJldHVybnMgZnJvbSBjYWxsZWQgZnVuY3Rpb25zLgorCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IExpa2V3aXNlLgorCShjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wpOiBMaWtld2lzZS4KKwkoY29mZl93cml0ZV9zeW1ib2xzKTogTGlrZXdpc2UuICBSZXdvcmtlZCBjaGVja3Mgb24gd2hldGhlciB0bworCXdyaXRlIHN5bWJvbCBuYW1lIHRvIHN0cmluZyB0YWJsZSBmb3IgY2xhcml0eSBhbmQgdG8gYXZvaWQgY29yZQorCWR1bXBpbmcgd2hlbiBnaXZlbiBhIG5vbiBDT0ZGIHN5bWJvbC4KKwkqIGxpYmNvZmYtaW4uaCAoY29mZl93cml0ZV9zeW1ib2xzKTogRGVjbGFyZSBhcyByZXR1cm5pbmcgYm9vbGVhbi4KKwkqIGxpYmNvZmYuaDogUmVidWlsdC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJY29mZl93cml0ZV9zeW1ib2xzLgorCitXZWQgTWFyIDMwIDE2OjI1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUNoYW5nZXMgdG8gbGV0IEJGRCByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGlvbiBmcm9tCisJZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsCisJYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuICBUaGV5IG5vdworCXJldHVybiBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgaW50LCBhbmQgdXNlIC0xIHRvIGluZGljYXRlIGFuCisJZXJyb3IuICBBbG9uZyB0aGUgd2F5LCByZW5hbWUgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0bworCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgorCSogYmZkLmMgKGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uCisJZXJyb3JzLgorCShiZmRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBzeW1zLmMgKGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogUmVuYW1lZCBmcm9tCisJZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IFJlbmFtZWQgX2dldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KKwlfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIGFuZCBjaGFuZ2VkIGl0IGFuZAorCV9iZmRfY2Fub25pY2FsaXplX3N5bXRhYiBhbmQgX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKKwlfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyB0byBhbGwgcmV0dXJuIGxvbmcuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYikpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KKwkoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KKwkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KKwkoTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCisJKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCShiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KKwkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgorCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KKwkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCShlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKGVsZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCisJKiBocDMwMGhwdXguYyAoTVkoZ2V0X3N5bXRhYikpOiBMaWtld2lzZS4KKwkoTVkoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KKwkoTVkoY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgorCSogaTM4Nmx5bnguYyAoTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KKwkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCisJYm9vbGVhbi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBnZXRfc3ltYm9sLgorCShpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLiAgQ2hlY2sKKwlmb3IgZXJyb3JzIGZyb20gaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzLgorCShpZWVlX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KKwkoaWVlZV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCisJKGllZWVfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCisJKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBtaXBzYnNkLmMgKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KKwkqIG5sbWNvZGUuaCAobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkobmxtX2dldF9zeW10YWIpOiBMaWtld2lzZS4KKwkobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCShubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBvYXN5cy5jIChvYXN5c19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCisJKG9hc3lzX2dldF9zeW10YWIpOiBMaWtld2lzZS4KKwkob2FzeXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCisJKG9hc3lzX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCSogc29tLmMgKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCisJKHNvbV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCisJKHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCSogc3JlYy5jIChzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoc3JlY19nZXRfc3ltdGFiKTogTGlrZXdpc2UuCisJKHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KKwkoc3JlY19jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KKwkqIHRla2hleC5jICh0ZWtoZXhfZ2V0X3N5bXRhYik6IFJldHVybiBsb25nLCBhbmQgLTEgb24gZXJyb3JzLgorCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCSh0ZWtoZXhfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lIGFzIGJmZF8wbC4KKwkodGVraGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCSogbGliYW91dC5oIChOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBDaGFuZ2UKKwlkZWNsYXJhdGlvbiB0byByZXR1cm4gbG9uZy4KKwkoTkFNRShhb3V0LGdldF9zeW10YWIpKTogTGlrZXdpc2UuCisJKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCisJKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCisJKiBsaWJjb2ZmLWluLmggKGNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCShjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KKwkoY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkqIGxpYmVjb2ZmLmggKGVjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoZWNvZmZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgorCShlY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KKwkqIGxpYmVsZi5oIChiZmRfZWxmMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X2dldF9zeW10YWIpOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgorCShiZmRfZWxmNjRfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCisJKiBsaWJubG0uaCAobmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgorCShubG1OQU1FKGdldF9zeW10YWIpKTogTGlrZXdpc2UuCisJKG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgorCShubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KKwkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBVc2UgZXJyb3JfcmV0dXJuIGFuZAorCW5vX21lbW9yeV9yZXR1cm4gbGFiZWxzIHJhdGhlciB0aGFuIGZyZWVpbmcgaW5mb3JtYXRpb24gaW4gdmFyaW91cworCXBsYWNlcy4gIENoYW5nZSBzdG9yYWdlLCBzeW1jb3VudCBhbmQgc3JjX2NvdW50IHRvIGxvbmcuICBDaGVjaworCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAorCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgorCSogYm91dC5jIChiX291dF9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHJlbG9jX3NpemUgdG8gbG9uZy4gIENoZWNrCisJZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCisJYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KKwkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6CisJTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgorCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IExpa2V3aXNlLgorCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBDaGVjayBmb3IgZXJyb3JzIGZyb20KKwliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsIGFuZAorCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBmb3IgZXJyb3JzCisJZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCisJKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyk6IExpa2V3aXNlLgorCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IENoZWNrIGZvciBlcnJvcnMgZnJvbQorCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCisJKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKwkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKiBsaWJiZmQuYyAoYmZkXzBsKTogTmV3IGZ1bmN0aW9uLgorCSogbGliYmZkLWluLmggKGJmZF8wbCk6IERlY2xhcmUuCisJKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCwgZ2V0X3N5bXRhYiwKKwlnZXRfcmVsb2NfdXBwZXJfYm91bmQsIGFuZCBjYW5vbmljYWxpemVfcmVsb2MgdG8gdXNlIGJmZF8wbCByYXRoZXIKKwl0aGFuIGJmZF8wdS4KKwkqIGNpc2NvLWNvcmUuYywgaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jOiBMaWtld2lzZS4KKwkqIGlyaXgtY29yZS5jLCBvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogTGlrZXdpc2UuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGxpYmNvZmYuaDogUmVidWlsdC4KKworCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfcmVsb2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcworCXRlbXAgYW5kIG5hbWUuCisKK1dlZCBNYXIgMzAgMDg6MzM6MDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2RweDIuaDogRGVmaW5lIFBPU0lYX1VUSU1FLgorCitXZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaTM4NmR5bml4LmMsIGNvbmZpZy9pMzg2LWR5bml4Lm10OiAgTmV3IGZpbGVzLCBoYW5kbGluZyBEeW5peAorCXZhcmlhbnQgb2YgYS5vdXQuCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy5iZmQ6ICBVc2UgdGhlbSBmb3IgRHluaXguCisJKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRlbmNpZXMgZm9yIGkzODZkeW5peC5vLiAKKwkqIHRhcmdldHMuYzogIEFkZCBkZWZpbml0aW9uIGZvciBpMzg2ZHluaXhfdmVjLgorCSogaG9zdHMvc3ltbWV0cnkuaDogIERvIG5vdCBkZWZpbmUgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGZvciBEeW5peC4KKwlEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgYW5kIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwKKwlmb3IgRHluaXguIFJlbW92ZSBpbmNsdXNpb24gb2YgZHluaXgzLmgsIER5bml4IGJmZCBpcyBub3cgaGFuZGxlZCBieQorCWkzODZkeW5peC5jCisKK01vbiBNYXIgMjggMTI6NTM6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zcGFyYy5vLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjIGxpa2UKKwliZmRfYXJjaF9yczYwMDAuCisKKwkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIHJzNjAwMC5tdC4KKwkqIGNvbmZpZy9yczYwMDAubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogQWRkIGJmZF9wb3dlcnBjX2FyY2guCisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgU0VDX1JFTE9DIGZsYWcKKwlmb3IgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHNlY3Rpb24uCisKK1N1biBNYXIgMjcgMTY6MjU6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IE5ldyBhcHByb2FjaCBhdCBkZWFsaW5nIHdpdGggaG9sZXMKKwlpbiBleGVjdXRhYmxlcyBsZWZ0IGJ5IHRoZSBIUCBsaW5rZXIuICBEb2VzIG5vdCByZWx5IG9uIHN1YnNwYWNlCisJYWxpZ25tZW50cyBhcyBzdWJzcGFjZXMgYXJlICpOT1QqIGd1YXJhbnRlZWQgdG8gYmUgcHJvcGVybHkKKwlhbGlnbmVkIGluIGFuIGV4ZWN1dGFibGUgKGNhbiB5b3UgYmVsaWV2ZSB0aGF0ISkuCisKK1NhdCBNYXIgMjYgMTA6MjU6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uICBEbyBub3QgdHJ5CisJdG8gYWN0dWFsbHkgcmVhZCBkYXRhIGZyb20gYSBzZWN0aW9uIHRoYXQgZG9lc24ndCBoYXZlIGVpdGhlcgorCVNFQ19MT0FEIG9yIFNFQ19ERUJVR0dJTkcgc2V0IChlZyAkQlNTJCkganVzdCByZXR1cm4gdHJ1ZS4KKworICAgICAgICAqIGxpYmJmZC5jIChiZmRfcmVhZCk6IFNldCBiZmRfZXJyb3IgYXMgYXBwcm9wcmlhdGUgZm9yIGEgc2hvcnQKKwlyZWFkLiAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsIG9yIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkuCisKKwkqIHNvbS5jOiBEbyBub3QgYmxpbmRseSBzZXQgYmZkX2Vycm9yX3N5c3RlbV9jYWxsIGFmdGVyIGEKKwlmYWlsaW5nIGJmZF9yZWFkLCBiZmRfd3JpdGUsIG9yIGJmZF9zZWVrLiAgSW4gYSBmZXcgcGxhY2VzCisJKGxpa2Ugc29tX29iamVjdF9wKSBvdmVycmlkZSB0aGUgZXJyb3Igc3RhdHVzIHNldCBieSBiZmRfcmVhZC4KKworCSogYWl4Mzg2LWNvcmUuYywgYW91dC1lbmNhcCxjIGFyY2hpdmUuYywgYm91dC5jOiBMaWtld2lzZS4KKwkqIGNvZmYtcnM2MDAwLmMsIGNvZmZnZW4uYyBlY29mZi5jLCBlbGYuYzogTGlrZXdpc2UuCisJKiBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaCwgaHAzMDBocHV4LmMsIGkzODZseW54LmM6IExpa2V3aXNlLgorCSogbmxtMzItYWxwaGEuYywgbmxtMzItaTM4Ni5jLCBubG0zMi1zcGFyYy5jOiBMaWtld2lzZS4KKworCSogc29tLmM6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBzZXZlcmFsIGJmZF97c2VlayxyZWFkLHdyaXRlfQorCWNhbGxzIHRoYXQgd2UganVzdCBhc3N1bWVkIHdlcmUgbm90IGZhaWxpbmcuCisKK0ZyaSBNYXIgMjUgMTE6NDQ6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL3N5c3Y0LmggKEhBVkVfUFJPQ0ZTKTogQWRkIGNvbW1lbnRzIGFib3V0IHB0eDQuCisJKiBjb25maWcvc3lzdjQubWg6IEFkZCBjb21tZW50LgorCSogY29uZmlnL3N5bW1ldHJ5Lm1oOiBDaGFuZ2UgY29tbWVudC4KKwkqIGNvbmZpZ3VyZS5ob3N0OiBVc2Ugc3lzdjQsIG5vdCBzeW1tZXRyeSwgZm9yIGlbMzRdODYtc2VxdWVudC1zeXN2NCouCisKK0ZyaSBNYXIgMjUgMTc6MTA6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQ2hhbmdlcyB0byBzdXBwb3J0IGxpbmtlciByZWxheGluZyBvZiBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlIHRvCisJdXNlIGEgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IgZnVuY3Rpb24gY2FsbHMgd2hpY2ggYXJlIG91dCBvZgorCXJhbmdlIG9mIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uCisJKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZS4KKwkoZWNvZmZfc2VjdGlvbl9kYXRhKTogRGVmaW5lLgorCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERvbid0IGRlZmluZS4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IERvbid0IHJlYWQgb3IgZnJlZQorCXRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZWFkLgorCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogSGFuZGxlIF9jb29rZWRfc2l6ZSBiZWluZyBkaWZmZXJlbnQKKwlmcm9tIF9yYXdfc2l6ZS4gIERvbid0IHJlcmVhZCB0aGUgY29udGVudHMgb3IgdGhlIHJlbG9jcyBpZiB0aGV5CisJaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbi4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2hvd3RvX3RhYmxlKTogQ2hhbmdlIGJpdHNpemUgb2YgUENSRUwxNiBmcm9tCisJMTggdG8gMTYuCisJKFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQpOiBEZWZpbmUuCisJKG1pcHNfcmVsb2NhdGVfcmVmaGkpOiBUYWtlIGFkanVzdCBhcmd1bWVudC4KKwkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHJlbG9jIG9mZnNldHMgc3RvcmVkIGluIHNlY3Rpb24KKwl1c2VkX2J5X2JmZCBmaWVsZC4gIENhbGwgbWlwc19yZWxheF9wY3JlbDE2IHRvIGhhbmRsZSBkZXRhaWxzIG9mCisJZXhwYW5kaW5nIGFuIG91dCBvZiByYW5nZSBQQ1JFTDE2LiAgS2VlcCB0cmFjZSBvZiBhZGp1c3RtZW50cworCXJlcXVpcmVkIGJ5IGV4cGFuc2lvbnMuICBTZXQgcyBhbmQgdW5zZXQgaCB3aGVuIGNvbnZlcnRpbmcgYSByZWxvYworCWZyb20gdW5kZWZpbmVkIHRvIHNlY3Rpb24uICBDaGFuZ2UgaGFuZGxpbmcgb2YgUEMgcmVsYXRpdmUgcmVsb2NzOgorCWlmIGFnYWluc3QgYSBzZWN0aW9uLCB0aGV5IGFyZSBjb3JyZWN0IGluIHRoZSBvYmplY3QgZmlsZSwgaWYKKwlhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuCisJKG1pcHNfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkobWlwc19yZWxheF9wY3JlbDE2KTogTmV3IGZ1bmN0aW9uLgorCShlY29mZl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KKwkqIGNvZmYtYWxwaGEuYyAoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBIYW5kbGUgYWRqdXN0bWVudHMKKwlidWlsdCBieSBtaXBzX3JlbGF4X3NlY3Rpb24gd2hlbiB3cml0aW5nIG91dCBhZGRyZXNzZXMuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IENsZWFyIGFkanVzdCBmaWVsZC4KKworCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IFRoZSBjYWxsZXIgZXhwZWN0cworCWZ1bmN0aW9ubmFtZV9wdHIgdG8gYmUgc2V0IHRvIGEgc3ltYm9sIG5hbWUsIHNvIHByZXBlbmQKKwlzeW1ib2xfbGVhZGluZ19jaGFyLgorCitUaHUgTWFyIDI0IDExOjMzOjQ2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEFkZCByZWxheGluZyBpbmZvCisJZm9yIDE2Yml0IHJlbGF0aXZlIGJyYW5jaGVzLgorCSogY29mZi1oODUwMC5jIChyX2hpZ2g4LCByX2xvdzE2LCByX2hpZ2gxNik6IERvbid0IGNvbXBsYWluIG9uCisJb3ZlcmZsb3cuCisKK1RodSBNYXIgMjQgMDk6MjE6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogSWdub3JlIG5vbi1TT00gb2JqZWN0cy4KKwkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYsIHNvbV93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgorCitXZWQgTWFyIDIzIDE0OjI5OjMxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogbmV0YnNkMzg2LmMgKE5fU0VUX0ZMQUdTKTogRGVsZXRlIHRoZSBvbGQgZGVmaW5pdGlvbi4KKworV2VkIE1hciAyMyAxNDo1ODo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlDbGVhbiB1cCB0aGUgcmVsYXhpbmcgY29kZSBmb3IgdGhlIG5ldyBsaW5rZXIuCisJKiB0YXJnZXRzLmMgKF9iZmRfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKKwlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCisJKiBiZmQuYyAoYmZkX3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UgbmFtZSBvZiBmb3VydGggYXJndW1lbnQgZnJvbQorCXN5bWJvbHMgdG8gYWdhaW4uCisJKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbgorCWFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4gIEFsd2F5cyByZXR1cm4gdHJ1ZS4KKwkqIGJvdXQuYzogSW5jbHVkZSBnZW5saW5rLmguCisJKGFsaWduY29kZSwgcGVyZm9ybV9zbGlwKTogRGVjbGFyZS4KKwkocGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgorCUNoYW5nZWQgYWxsIGNhbGxlcnMuICBHZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELiAgQ2hhbmdlIHRoZQorCWhhc2ggdGFibGUgZW50cnkgdmFsdWUgYXMgd2VsbCBhcyB0aGUgc3ltYm9sIHZhbHVlLgorCShhYnMzMmNvZGUpOiBUYWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkCisJYWxsIGNhbGxlcnMuCisJKGFsaWduY29kZSk6IExpa2V3aXNlLgorCShiX291dF9yZWxheF9zZWN0aW9uKTogVGFrZSBib29sZWFuICphZ2FpbiBhcmd1bWVudCByYXRoZXIgdGhhbgorCWFzeW1ib2wgbGlzdC4gIE9ubHkgcmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgU2V0ICphZ2FpbgorCXRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCisJKiByZWxvYzE2LmM6IEluY2x1ZGUgZ2VubGluay5oLgorCShiZmRfcGVyZm9ybV9zbGlwKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgorCUdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuICBDaGFuZ2UgdGhlIGhhc2ggdGFibGUgZW50cnkgdmFsdWUKKwlhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgdmFsdWUuCisJKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQKKwlyYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBPbmx5IHJldHVybiBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKwlTZXQgKmFnYWluIHRvIGZhbHNlLiAgR2V0IHN5bWJvbHMgZnJvbSBCRkQuCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKKwlfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSB0byB0YWtlIEJGRCBhcmd1bWVudCByYXRoZXIgdGhhbgorCWFzeW1ib2wgbGlzdC4KKwkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgorCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCisJKiBsaWJjb2ZmLWluLmggKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IENoYW5nZQorCWRlY2xhcmF0aW9uIHRvIHRha2UgYm9vbGVhbiAqIHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KKwkoYmZkX3BlcmZvcm1fc2xpcCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB0YWtlIEJGRCByYXRoZXIgdGhhbgorCWFzeW1ib2wgbGlzdC4KKwkqIGNvZmYtaDgzMDAuYyAoaDMwMF9yZWxvYzE2X2VzdGltYXRlKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyCisJdGhhbiBhc3ltYm9sIGxpc3QuICBDaGFuZ2VkIGNhbGxzIHRvIGJmZF9wZXJmb3JtX3NsaXAuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGxpYmNvZmYuaDogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKworCSogZ2VubGluay5oIChfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyk6IERlZmluZS4KKwkoX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KTogRGVmaW5lLgorCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCisJKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgaXQuICBVc2UKKwlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyBhbmQgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50CisJdG8gZ2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4KKwkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IExpa2V3aXNlLgorCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IExpa2V3aXNlLgorCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgorCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KKwkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFN0b3JlIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeQorCWluIGFzeW1ib2wgdWRhdGEgZmllbGQuCisKK1R1ZSBNYXIgMjIgMTM6MDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IgbmV3IE1JUFNfUl9QQ1JFTDE2CisJcmVsb2MsIHVzZWQgaW4gZW1iZWRkZWQgUElDIGNvZGUuCisJKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogQ2hhbmdlIHNhbml0eSBjaGVjayB0byBwZXJtaXQgbmV3IHJlbG9jLgorCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMX1MyIGludG8KKwlNSVBTX1JfUENSRUwxNi4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlcgorCXJlbG9jcyB3aGVuIGFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgU2V0IFNFQ19SRUxPQyBmbGFnCisJZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcyByZWxvY3MuICBIYW5kbGUgbGlua19vcmRlciByZWxvY3MgaW4KKwlsaW5rX29yZGVyIGxvb3AuICBVc2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCBmb3IKKwlhZGRfc3ltYmxzIGVudHJ5IHBvaW50LgorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgcmVsb2NfY291bnQgdG8gMCBiZWZvcmUKKwljb3VudGluZyByZWxvY3MuICBTZXQgU0VDX1JFTE9DIGZsYWcgZm9yIGFueSBzZWN0aW9uIHdoaWNoIGhhcworCXJlbG9jcy4KKworCSogbGlua2VyLmMgKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9kYXRhX2xpbmtfb3JkZXIuCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyk6IEp1c3QgY2FsbAorCWdlbmVyaWNfbGlua19hZGRfc3ltYm9scy4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IE5ldyBmdW5jdGlvbiwgbGlrZQorCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCBhbHNvIGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZAorCWRlc3RydWN0b3JzIGJ5IG5hbWUgYXMgY29sbGVjdDIgZG9lcy4KKwkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLCBsaWtlIG9sZAorCV9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIGJ1dCB3aXRoIGNvbGxlY3QgYXJndW1lbnQuCisJKGdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBUYWtlIGNvbGxlY3QgYXJndW1lbnQuCisJKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdCk6IE5ldyBmdW5jdGlvbi4KKwkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0KTogTmV3IGZ1bmN0aW9uLgorCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgorCShnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgorCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbmFtZSBjb25zdHJ1Y3RvciBhcmd1bWVudCB0bworCWNvbGxlY3QuCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCk6IERlY2xhcmUuCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKworVHVlIE1hciAyMiAxMDowNDowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogYXJjaGl2ZS5jIChiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBVc2UgYXJfcGFkY2hhcgorCWZvciBmaXJzdCBjaGFyYWN0ZXIgaW4gYW4gZXh0ZW5kZWQgbmFtZS4KKwkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogSWYgYXJfcGFkY2hhciA9PSAnLycsIHRoZW4gdXNlCisJIi8vIiBhcyB0aGUgbmFtZSBvZiB0aGUgc3BlY2lhbCBhcmNoaXZlIG1lbWJlciBob2xkaW5nIHRoZQorCWV4dGVuZGVkIG5hbWUgdGFibGUuCisKK01vbiBNYXIgMjEgMTI6Mjg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJU3VwcG9ydCBmb3IgbGlua19vcmRlciB0eXBlcyB3aGljaCBnZW5lcmF0ZSByZWxvY3MgaW4gb3JkZXIgdG8KKwlzdXBwb3J0IC1VciBpbiB0aGUgbGlua2VyLgorCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudAorCWZyb20gY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudC4KKwlEb24ndCBwYXNzIGJpdHNpemUgdG8gY29uc3RydWN0b3IgY2FsbCBiYWNrLiAgUGFzcyBCRkRfUkVMT0NfQ1RPUgorCWluc3RlYWQgb2YgYml0c2l6ZSB0byBhZGRfdG9fc2V0IGNhbGwgYmFjay4KKwkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCisJYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBpbiBsaW5rX29yZGVyIGxvb3AuCisJKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgorCShfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IElmIGEgcmVsb2NfbGlua19vcmRlciBpcyBzZWVuIGhlcmUsCisJYWJvcnQuCisJKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgYml0c2l6ZQorCWFyZ3VtZW50IGZyb20gZGVjbGFyYXRpb24uCisJKF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyKTogRGVjbGFyZS4KKwkoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyk6IERlY2xhcmUuCisJKiBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KKwljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgorCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCisJYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBhZnRlciBoYW5kbGluZyBhbGwKKwlpbnB1dCBCRkRzLgorCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IFJlbW92ZSBiaXRzaXplIGFyZ3VtZW50IGZyb20KKwljYWxsIHRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLgorCShlY29mZl9iZmRfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIgcmVsb2NzIHdoZW4KKwlhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIEhhbmRsZSB0aGVtIGluIGxpbmtfb3JkZXIgbG9vcC4KKwkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFNldCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBhIGRlZmluZWQKKwlsaW5rZXIgY3JlYXRlZCBzeW1ib2wgYmFzZWQgb24gdGhlIHNlY3Rpb24gaXQgaXMgaW4uICBDb3JyZWN0CisJYmZkX2xpbmtfaGFzaF93ZWFrIGNhc2UgdG8gdXNlIC5zYyByYXRoZXIgdGhhbiAuc3QuCisJKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQorCUJGRF9SRUxPQ19DVE9SLgorCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCisKKwkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZHluc3ltCisJYW5kIGJ1Zi4KKworCSogY2lzY28tY29yZS5jIChjaXNjb19jb3JlX2ZpbGVfcCk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8KKwliZmRfem1hbGxvYy4gIEZyZWUgYSBwb2ludGVyLCBub3QgYSB1bmlvbi4KKwkoY2lzY29fYmZkX2lzX2xvY2FsX2xhYmVsKTogQ29ycmVjdCBjYXN0IGZyb20gYXNlY3Rpb24gdG8gYXN5bWJvbC4KKworU3VuIE1hciAyMCAwOToyNDozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogYmZkL3NvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCB0aGlua28gKG9mZiBieSBvbmUgZXJyb3IpLgorCisJKiBzb20uYyAoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogT25seSB0byBkbyB0aGUgdmFsdWUKKwljb21wYXJpc29uIGZvciBmdW5jdGlvbiBzeW1ib2xzIHdpdGhpbiBleGVjdXRhYmxlcy4KKworCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFJlbmFtZWQgZnJvbQorCXNvbV9zZWN0aW9uX2Zyb21fc3Vic3BhY2VfaW5kZXguICBQYXNzIGluIGEgbmF0aXZlIFNPTSBzeW1ib2wuCisJRm9yIGV4ZWN1dGFibGVzLCBpdGVyYXRlIHRocm91Z2ggdGhlIHNlY3Rpb25zIHRvIGZpbmQgb3V0CisJd2hpY2ggY29udGFpbnMgdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmF0aGVyIHRoYW4gdXNpbmcgdGhlCisJc3ltYm9sX2luZm8gZmllbGQuICAoc3ltYm9sX2luZm8gaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yCisJZHluYW1pY2x5IGxpbmtlZCBleGVjdXRhYmxlcy4pCisKKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBEb24ndCBwYXNzIGFiZmQgdG8KKwliZmRfem1hbGxvYy4KKworCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IGJyYWlubyAob25lIGNhbGwgdG8gYWxpZ24KKwlzcGFjZS9zdWJzcGFjZSBkYXRhIHdhcyBkb25lIHVuY29uZGl0aW9uYWxseSByYXRoZXIgdGhhbgorCWp1c3QgZm9yIGV4ZWN1dGFibGVzLikKKworCSogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogQWxpZ24gdGV4dCBpbiBhbGwgZXhlY3V0YWJsZXMgdG8KKwltYWtlIEhQVVgga2VybmVsIGhhcHB5LiAgRml4ZXMgc3RyaXAvb2JqY29weSBmb3Igc2hhcmVkCisJZXhlY3V0YWJsZXMuCisKK1NhdCBNYXIgMTkgMDc6MDY6NTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEFjY291bnQgZm9yIGFsaWdubWVudCBuZWVkcyBvZgorCXN1YnNwYWNlcyB0b28gd2hlbiB3cml0aW5nIGV4ZWN1dGFibGVzLiAgTmV2ZXIgcmVxdWVzdCBhIG5lZ2F0aXZlCisJYnNzIHNpemUuICBGaXhlcyBzb21lIHByb2JsZW1zIHdpdGggZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLAorCXN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIHB1cmUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBleGVjdXRhYmxlcy4KKworRnJpIE1hciAxOCAxOToxMjo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IENhbGwgYmZkX3ptYWxsb2Mgbm90CisJYmZkX3phbGxvYyBmb3IgcmF3cHRyLCBiZWNhdXNlIGxhdGVyIG9uIHdlIG1heSBjYWxsIGZyZWUsIG5vdAorCWJmZF9yZWxlYXNlLCBvbiBpdC4KKworCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGNpc2NvX2NvcmVfc3RydWN0IHRvIHRkYXRhIHVuaW9uLgorCSogbGliYmZkLmMgKGJmZF9yZWFkLCBiZmRfc2Vlayk6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgZXJyb3JzLgorCSogY2lzY28tY29yZS5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBjaXNjb19jb3JlX3ZlYy4KKwkqIGNvbmZpZy9tNjhrLWFvdXQubXQgKFNFTEVDVF9WRUNTKTogQWRkIGNpc2NvX2NvcmVfdmVjLgorCSogdGFyZ2V0cy5jOiBBZGQgY2lzY29fY29yZV92ZWMuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisKK0ZyaSBNYXIgMTggMTg6MTM6NDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5oIChzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUKKwljb250YWluaW5nIGFsbCB0aGUgcHJpdmF0ZSBzZWN0aW9uIGluZm9ybWF0aW9uIHdoaWNoIG5lZWRzCisJdG8gYmUgY29waWVkIGZyb20gaW5wdXQgc2VjdGlvbiB0byBvdXRwdXQgc2VjdGlvbiBkdXJpbmcKKwlvYmpjb3B5IG9yIHN0cmlwLgorCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IFJlbW92ZSBzZXZlcmFsIGZpZWxkcyBub3cgaW4KKwlzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdC4gIE1ha2UgdGhlIHNwYWNlIGFuZCAKKwlzdWJzcGFjZSBkaWN0aW9uYXJpZXMgYmUgcG9pbnRlcnMgKHRvIHNhdmUgc3BhY2Ugd2hlbgorCW9ubHkgcmVhZGluZyBvYmplY3RzKS4KKworCSogc29tLmMgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IE5vdyByZXR1cm5zIGEgYm9vbGVhbjsKKwlzb21lIHJlZmVyZW5jZXMgY2hhbmdlZC4gIEFsbG9jYXRlIGEgY29weWFibGUgZGF0YSBzdHVjdHVyZSBpZgorCW5vbmUgZXhpc3RzLiAgU3RvcmUgaW5mbyBpbnRvIHRoZSBjb3B5YWJsZSBkYXRhIHN0cnVjdHVyZS4KKwkoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogTGlrZXdpc2UuCisJKHNvbV9pc19zcGFjZSwgc29tX2lzX3N1YnNwYWNlLCBzb21faXNfY29udGFpbmVyKTogTmV3IGZ1bmN0aW9ucy4KKwlVc2UgdGhlc2UgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgcHJpdmF0ZSBkYXRhLgorCShzb21fcHJlcF9oZWFkZXJzKTogQWxsb2NhdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMgaGVyZS4KKwlGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBzcGFjZS9zdWJzcGFjZSBoZWFkZXJzIGZyb20gdGhlCisJY29weWFibGUgZGF0YS4KKwkoc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogT25seSBjb3B5IHRoZSBzdHVmZgorCXRoYXQgd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBvYmpjb3B5IGFuZCBzdHJpcCB3b3JrLiAgQWxsb2NhdGUKKwl0aGUgY29weV9kYXRhIHN0cnVjdHVyZSBmb3IgdGhlIG91dHB1dCBiZmQgYmVmb3JlIGNvcHlpbmcuCisKKwkqIHNvbS5oIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBleGVjCisJaW5mbyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIHdoZW4gcnVubmluZyBvYmpjb3B5L3N0cmlwLgorCShzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBuZXcgImV4ZWNfZGF0YSIgZmllbGQgYW5kIGFjY2Vzc29yCisJbWFjcm8uICBBZGQgc29tZSBjb21tZW50cyBvbiBob3cgdGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkLgorCShzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCk6IE1ha2UgaXNfc3BhY2UgYW5kIGlzX3N1YnNwYWNlIGJpdGZpZWxkcy4KKwlEZWxldGUgdW51c2VkIHN1YnNwYWNlX2luZGV4LiAgQWxsIHJlZmVyZW5jZXMgbm93IHVzZSB0aGUKKwl0YXJnZXRfaW5kZXggZmllbGQgd2l0aGluIHRoZSBzZWN0aW9uIHN0cnVjdHVyZSBpdHNlbGYuCisKKwkqIHNvbS5jIChtYWtlX3VuaXF1ZV9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBkZWNsYXJhdGlvbi4KKwkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgZnVuY3Rpb24uCisJKHNvbV9vYmplY3Rfc2V0dXApOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIHNhdmUgZXhlYyBpbmZvcm1hdGlvbgorCXRoYXQgbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBvYmpjb3B5L3N0cmlwLgorCShzb21fbWtvYmplY3QpOiBEbyBub3QgYWxsb2NhdGUgc3BhY2UgZm9yIGEgZmlsZSBoZWFkZXIgaGVyZS4KKwlJdCBpcyBub3QgdXNlZCB3aGVuIG9ubHkgcmVhZGluZyBTT00gb2JqZWN0cy4KKwkoc29tX3ByZXBfaGVhZGVycyk6IEFsbG9jYXRlIHNwYWNlIGZvciBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIKKwl0byB0aGUgb3V0cHV0IGJmZC4gIEZvciBleGVjdXRhYmxlcywgdXNlIHRoZSBzYXZlZCBzeXN0ZW1faWQKKwl2YWx1ZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZ3Vlc3MgdGhlIHJpZ2h0IHZhbHVlLiAgRG8gbm90IGFib3J0CisJd3doZW4gc2V0dGluZyBmaWxlX2hkci0+ZW50cnkqIGZvciBleGVjdXRhYmxlcy4KKwkoc29tX2JlZ2luX3dyaXRpbmcpOiBGb3IgZXhlY3V0YWJsZXMsIHNldCB0aGUgZXhlY19lbnRyeSBhbmQKKwlleGVjX2ZsYWdzIGZpZWxkcy4KKwkoc29tX2NvcHlfcHJpdmF0ZV9iYWNrZW5kX3NlY3Rpb25fZGF0YSk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKworCSogbGliaHBwYS5oIChQQV9QQUdFU0laRSk6IERlZmluZS4KKworCSogc29tLmMgKFNPTV9BTElHTik6IERlZmluZS4KKwkoc29tX2JlZ2luX3dyaXRpbmcpOiBJZiB3cml0aW5nIGFuIGV4ZWN1dGFibGUsIGluaXRpYWxpemUgYWxsCisJZmllbGRzIGluIHRoZSBleGVjIGhlYWRlciB0byB6ZXJvLiAgVXBkYXRlIGZpZWxkcyBpbiB0aGUgZXhlYworCWhlYWRlciBhcyBzaXplcyBvZiBsb2FkYWJsZSBzdWJzcGFjZXMgYXJlIGNvbXB1dGVkLiAgQ2FyZWZ1bGx5CisJcHJlc2VydmUgYWxpZ25tZW50cyB3aGVuIGJ1aWxkaW5nIGV4ZWN1dGFibGVzLiAgQWN0dWFsbHkgd3JpdGUgdGhlCisJZXhlYyBhZnRlciBhbGwgdGhlIGZpZWxkcyBhcmUgZmlsbGVkIGluLgorCisgICAgICAgICogQmV0dGVyIGxvbmctZmlsZW5hbWUgaGFuZGxpbmcuICBSZWFkcyBTT00gQUJJIGNvbXBsaWFudCBleHRlbmRlZAorCW5hbWVzLCBidXQgZG9lc24ndCBxdWl0ZSB3cml0ZSBjb21wbGlhbnQgZXh0ZW5kZWQgbmFtZXMgeWV0LgorCSogc29tLmMgKHNvbV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVsZXRlIGZ1bmN0aW9uLiAgVGhlCisJZ2VuZXJpYyBjb2RlIHdpbGwgaGFuZGxlIHRoaW5ncyBjb3JyZWN0bHkuCisJKHNvbV9zbHVycF9hcm1hcCk6IFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZW1iZXIuCisJKG5vcm1hbGl6ZSk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBUYWtlIHRoZSBzaXplIG9mIHRoZSBleHRlbmRlZAorCW5hbWUgdGFibGUgaW50byBhY2NvdW50IHdoZW4gY29tcHV0aW5nIHRoZSBmaWxlIG9mZnNldHMgaW4gdGhlCisJU09NIGRpY3Rpb25hcnkuICBNYWtlIHN1cmUgdG8gYWxpZ24gdG8gYW4gZXZlbiBib3VuZGFyeS4KKwkoc29tX3dyaXRlX2FybWFwKTogSW5pdGlhbGl6ZSB0aGUgY2hlY2tzdW0gdG8gemVyby4KKwkoYXJfbWF4Y2hhcnMpOiBGaXguICBPcHBzLgorCitGcmkgTWFyIDE4IDIwOjM1OjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SIG9uIGEgNjQtYml0CisJbWFjaGluZS4gIEhhbmRsZSBCRkRfUkVMT0NfU1BBUkMxMyBhbmQgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMy4KKworVGh1IE1hciAxNyAxODoyNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBiZmQtaW4uaCAoQkZEX1ZFUlNJT04pOiBVc2UgQFZFUlNJT05ALgorCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogUmVwbGFjZSBpdCB3aXRoIGNvbnRlbnRzIG9mIFZFUlNJT04gZmlsZS4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisKKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfYmZkX2lzX2xvY2FsX2xhYmVsKTogRml4ZWQgdHlwbyB3aGVyZQorCXRoaXMgd2FzIGFsc28gbmFtZWQgdHJhZF91bml4X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEuCisKK1RodSBNYXIgMTcgMTA6Mzc6MDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmgsIGVsZmNvZGUuaCwgY29mZi1hbHBoYS5jLCBib3V0LmMsIGVjb2ZmLmMsIGVjb2ZmbGluay5jLAorCWVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgc29tLmMsIHN1bm9zLmM6IElmIG1hbGxvYygwKQorCXJldHVybnMgTlVMTCwgaXQgaXMgbm90IGFuIGVycm9yLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2YKKwl0aGVzZSBjaGVja3MgYXJlIG5vdCBuZWNlc3NhcnkgKGJlY2F1c2UgdGhlIHNpemUgY2FuIG5ldmVyIGJlCisJemVybyksIGJ1dCBwdXR0aW5nIGluIHRoZSBjaGVja3MgaXMgdGhlIGNvbnNlcnZhdGl2ZSB0aGluZyB0byBkbworCWluIGxpZ2h0IG9mIHRoZSBmYWN0IHRoYXQgc29tZSBvZiB0aGVzZSBtYWxsb2MgY2FsbHMgcmVwbGFjZWQKKwl1bmNoZWNrZWQgYWxsb2NhIGNhbGxzLCBpbiB3aGljaCBhIHplcm8gYXJndW1lbnQgd291bGQgd29yayBmaW5lLgorCitUaHUgTWFyIDE3IDExOjQ0OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlbW92ZQorCWR1cGxpY2F0ZSBkZWZpbml0aW9uLgorCShvc2ZfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUuCisKKwkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGZhaWwKKwlpZiBtYWxsb2MgKDApIGZhaWxzLiAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyByZXR1cm5pbmcgMCBpcyBub3QgYQorCWZhaWx1cmUgaW5kaWNhdGlvbiwgaXQgbWVyZWx5IG1lYW5zIHRoZXJlIGFyZSBubyByZWxvY3MuCisKKwkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB1c2Ugc3BhY2UKKwlhZnRlciBOQU1FLCBzaW5jZSBTdW5PUyAvYmluL2NjIGNhbid0IGhhbmRsZSBpdC4KKworV2VkIE1hciAxNiAxNjo0MzozMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG5ldGJzZDM4Ni5jIChOX1NFVF9GTEFHUyk6IERvbid0IG51a2UgdGhlIG1hY2hpbmUgaWQgZmllbGQuCisJRnJvbSBzdWtlc0BnbHVlLnVtZC5lZHUgKFRhc3VraSBIaXJhdGEpLgorCitXZWQgTWFyIDE2IDA3OjU1OjU0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhb3V0ZjEuaCAoNCBwbGFjZXMpOiBVc2UgYSBzaW1wbGUgI2lmIG9uIEFSQ0hfU0laRSwgcmF0aGVyIHRoYW4KKwlhbGwgdGhhdCBjb252b2x1dGVkIHN0dWZmIHdpdGggTkFNRSwgQ0FUMywgZXRjLiAgVGhlIGNvbnZvbHV0ZWQKKwlzdHVmZiBicm9rZSBmb3IgU3VuT1M0IC9iaW4vY2MgKGR1ZSB0byBERUZVTiBlbGltaW5hdGlvbiwgSSBndWVzcykuCisKK1dlZCBNYXIgMTYgMDA6MDI6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fcHJlcF9mb3JfZml4dXBzKTogRGV0ZWN0IHNlY3Rpb24gc3ltYm9scyBiYXNlZAorCW9uIGVpdGhlciB0aGUgbGFjayBvZiBwcml2YXRlIGRhdGEgb3IgdGhlIHN5bWJvbCBmbGFncy4gIERvIG5vdAorCW11bmdlIHNlY3Rpb24gc3ltYm9sIG5hbWVzIGFueW1vcmUgLS0gdGhleSBubyBsb25nZXIgY29uZnVzZSBHREIuCisJKHNvbV9iZWdpbl93cml0aW5nKTogTGVhdmUgc3BhY2UgZm9yIGFuIGV4ZWMgaGVhZGVyIGlmIHdyaXRpbmcKKwlhbiBleGVjdXRhYmxlLgorCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogUmVjb2duaXplIGJvdGggZm9ybXMgb2Ygc2VjdGlvbiBzeW1ib2wKKwluYW1lcyAiTCQwXDAwMiIgYW5kICIkPEZPTz4kIi4gIENoYW5nZSB0aGUgbmFtZSBvZiAiTCQwXDAwMiIKKwlzZWN0aW9uIHN5bWJvbHMgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhleSByZXByZXNlbnQuCisJRGVidWdnaW5nICBzeW1ib2xzIGJlZ2luIHdpdGggIkwkMFwwMDEiLCBub3QganVzdCAiTCQiLgorCitUdWUgTWFyIDE1IDIyOjU4OjI4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmg6IFJlYnVpbHQuCisKKwkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBqdW1wIHRhYmxlCisJZm9yIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLAorCWFuZCBiZmRfaXNfbG9jYWxfbGFiZWwuCisKKwkqIHRhcmdldHMuYzogQWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZS4KKwkKKwkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGRlZmluaXRpb24uCisKKwkqIHNlY3Rpb24uYyAoYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZGVmaW5pdGlvbi4KKworCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZGVmaW5pdGlvbi4KKworCSogbGliYmZkLWluLmggKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KKworCSogbGliYmZkLmMgKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgorCisJKiAqLWNvcmUuYzogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBuZXcgZnVuY3Rpb25zIGluCisJdGhlIHRhcmdldCB2ZWN0b3Igd2hpY2ggYWxsIHBvaW50IHRvIGJmZF9mYWxzZS4KKworCSogYW91dC10YXJnZXQuaCwgY29mZmNvZGUuaCwgZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmgsIGllZWUuYworCWxpYmFvdXQuaCwgbGliZWNvZmYuaCwgbmxtLXRhcmdldC5oLCBvYXN5cy5jLCBzcmVjLmMsIHRla2hleC5jCisJRGVmYXVsdCBuZXcgdmVjdG9ycyBmb3IgY29weWluZyBwcml2YXRlIGJhY2tlbmQgZGF0YSB0byBiZmRfdHJ1ZS4KKwlEZWZhdWx0IG5ldyB2ZWN0b3IgZm9yIGRldGVybWluaW5nIGlmIGEgc3ltYm9sIGlzIGEgbG9jYWwgbGFiZWwKKwl0byBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbC4KKworCSogc29tLmMgKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2JmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KKwkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBGb3Igbm93IGRlZmF1bHQgdG8gYmZkX3RydWUuCisKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCisKK1R1ZSBNYXIgMTUgMjM6NTU6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjZi1tNjhrbHlueC5jIChDQUxDX0FEREVORCk6IFVzZSBfYmZkX202OGtseW54X2hvd3RvX3RhYmxlLgorCitUdWUgTWFyIDE1IDA0OjQxOjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogTW9zdCBmaWxlczoKKwlSZXBsYWNlIERFRlVOIGFuZCBERUZVTl9WT0lEIHdpdGggSyZSLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24uCisJSW5kZW50IHNvbWUgb2YgdGhlbSB0byBHTlUgc3RhbmRhcmRzLgorCisJKiBhb3V0MzIuYywgYXJjaHVyZXMuYywgY29yZS5jLCBjcHUtaDgzMDAuYywgY3B1LWk5NjAuYywKKwljcHUtbTY4ay5jLCBjcHUtbTg4ay5jLCBjcHUtbWlwcy5jLCBjcHUtdmF4LmMsIGN0b3IuYywgZGVtbzY0LmMsCisJZWxmMzItaHBwYS5oLCBnZW4tYW91dC5jLCBob3N0LWFvdXQuYywgaW5pdC5jLCBsaWJocHBhLmgsCisJbGliaWVlZS5oLCBsaWJvYXN5cy5oLCBuZXdzb3MzLmMsIHNvbS5oLCBzdGFiLXN5bXMuYywgc3Vub3MuYzoKKwlVcGRhdGUgY29weXJpZ2h0IHllYXJzLgorCitNb24gTWFyIDE0IDExOjQxOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IEEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgdGhlIHNlY3Rpb24KKwlzeW1ib2wgZm9yIHRoZSAqQUJTKiBzZWN0aW9uIGlzIHJlYWxseSBhIHJlbG9jYXRpb24gaW52b2x2aW5nCisJbm8gc3ltYm9sLgorCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IHNldCBCU0ZfR0xPQkFMIG9yIEJTRl9FWFBPUlQgZm9yCisJdW5kZWZpbmVkIHN5bWJvbHMuICBDb3JyZWN0bHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBkZWJ1Z2dlciBzeW1ib2xzCisJYW5kIHNlY3Rpb24gc3ltYm9scy4KKworCSogc29tIChzZXR1cF9zZWN0aW9ucyk6IFNldCBTRUNfREVCVUdHSU5HIGFuZCB0aGUgc2VjdGlvbiBhdHRyaWJ1dGVzCisJZm9yIHNwYWNlcyBhbmQgc3Vic3BhY2VzLgorCisJKiBzb20uYyAoc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzKTogRml4IHR5cG8uCisKKwkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogU2V0IEVYRUNfUCwgRF9QQUdFRCwgV1BfVEVYVCwgYW5kCisJSEFTX1JFTE9DIGJhc2VkIG9uIHRoZSBvYmplY3QncyBtYWdpYyBudW1iZXIuCisJKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiBEZWxldGUgZnVuY3Rpb24uICBCRkQgYW5kIGl0cyB1c2VycyBhcmUKKwlwcmVwYXJlZCB0byBoYW5kbGUgbXVsdGlwbGUgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLgorCShzZXR1cF9zZWN0aW9ucyk6IEFsbG9jYXRlIHNwYWNlIG9uIHRoZSBCRkQncyBvYnN0YWNrIHRvIGhvbGQKKwlzZWN0aW9uIG5hbWVzLiAgVXNlIGJmZF9tYWtlX3NldGlvbl9hbnl3YXkgcmF0aGVyIHRoYW4gdGhlCisJb2Jzb2xldGUgbWFrZV91bmlxdWVfc2VjdGlvbi4KKwkoc29tX3ByZXBfaGVhZGVycyk6IENob29zZSB0aGUgY29ycmVjdCBTT00gbWFnaWMgbnVtYmVyIGJhc2VkCisJb24gdGhlIEJGRCdzIGZsYWdzLgorCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IFJldHVybiBmYWxzZSwgbm90IE5VTEwgb24gZXJyb3IuCisKK1NhdCBNYXIgMTIgMDk6NDY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBlbGYzMi1wcGMuYzogUmVuYW1lZCBmcm9tIGVsZjMyLXBvd2VycGMuYy4KKwkqIG5sbTMyLXBwYy5jOiBSZW5hbWVkIGZyb20gbmxtMzItcG93ZXJwYy5jLgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCitGcmkgTWFyIDExIDIyOjI3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmMzItcG93ZXJwYy5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1cGRhdGUgdG8gcHJlbGltaW5hcnkgQUJJLgorCitGcmkgTWFyIDExIDAwOjM0OjU5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiAgQXNzdW1lIHRoYXQgZHluYW1pYyBpbmZvCisJaXMgYWx3YXlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24gdG8gYWxsb3cKKwlyZWNvdmVyeSBvZiB0aGUgZHluYW1pYyBpbmZvIGZyb20gYSBzdHJpcHBlZCBleGVjdXRhYmxlLgorCSogZWNvZmYuYyAoZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlIFNUWVBfUERBVEEsIFNUWVBfWERBVEEKKwlhbmQgU1RZUF9DT01NRU5ULgorCitXZWQgTWFyICA5IDE3OjE3OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBsaWJiZmQtaW4uaDogUmVtb3ZlIGFsbG9jYSBjcnVmdC4gIEl0IHdhcyBtaXNzaW5nIHNvbWUgbmVjZXNzYXJ5CisJY3J1ZnQgKGxpa2UgdGhlICNwcmFnbWEgYWxsb2NhIGZvciBBSVgpLgorCUluIGFkZGl0aW9uIHRvIHRoYXQgcHJvYmxlbSwgdGhlIEMgYWxsb2NhIGNhbGxzIHhtYWxsb2MsIHdoaWNoCisJbWVhbnMgY2hlY2tpbmcgZm9yIGJlaW5nIG91dCBvZiBtZW1vcnkgY2FuJ3Qgd29yayByaWdodC4gIFRoZQorCWZvbGxvd2luZyBjaGFuZ2VzIHJlbW92ZSBhbGwgdXNlcyBvZiBhbGxvY2EgZnJvbSBCRkQuCisJKiBob3N0cy9zb2xhcmlzMi5oOiBSZW1vdmUgYWxsb2NhIGNydWZ0LgorCSogc29tLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggYSBmaXhlZCBzaXplIGF1dG8gYXJyYXkuCisJKiBhb3V0eC5oLCBlbGZjb2RlLmgsIG5sbWNvZGUuaCwgYm91dC5jLCBjb2ZmLWFscGhhLmMsIGVjb2ZmLmMsCisJZWNvZmZsaW5rLmMsIGVsZjMyLWhwcGEuYywgZWxmMzItbWlwcy5jLCBsaW5rZXIuYywgcmVsb2MuYywgc29tLmMsCisJc3Vub3MuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBtYWxsb2MgYW5kIGFwcHJvcHJpYXRlIGVycm9yIGNoZWNraW5nIGFuZAorCWZyZWVpbmcuCisJKiBsaW5rZXIuYzogUmVwbGFjZSBhbGxvY2Egd2l0aCBvYnN0YWNrX2FsbG9jLgorCSogbGliYmZkLmg6IFJlYnVpbHQuCisKK1R1ZSBNYXIgIDggMTI6MTA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIE1JUFNfUl9MSVRFUkFMIGxpa2UKKwlNSVBTX1JfR1BSRUwuCisKK1NhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBlbGYzMi1ocHBhLmgsIGVsZmNvZGUuaDogIFJlcGxhY2UgdXNlcyBvZiBFbGYqX0hhbGYsIEVsZipfV29yZCwKKwlFbGYqX09mZiB0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24sIHRoZSB0eXBlZGVmcyBoYXZlIGJlZW4KKwlyZW1vdmVkIGZyb20gaW5jbHVkZS9lbGYvaW50ZXJuYWwuaC4KKwkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIEhhbmRsZSBTSFRfRFlOQU1JQyBzZWN0aW9uIGxpa2UKKwlTSFRfUFJPR0JJVFMgc2VjdGlvbi4KKworVGh1IE1hciAgMyAyMDowMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmggKF9QQV9SSVNDX0lEKTogVHJlYXQgSE9TVF9IUFBBT1NGIGp1c3QgbGlrZSBIT1NUX0hQUEFCU0QuCisKK1dlZCBNYXIgIDIgMTM6Mjg6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaVszNF04Ni1zZXF1ZW50LSouCisKKwkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBBIG5vbi16ZXJvLCBub3QgemVybywKKwlyZXR1cm4gZnJvbSBiZmRfc2VlayBpbmRpY2F0ZXMgYW4gZXJyb3IuCisJTmV3IG1hY3JvIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRSB0byByZXBsYWNlCisJVFJBRF9DT1JFX1NUQUNLX09GRlNFVC4KKwkqIGhvc3RzL3N5bW1ldHJ5Lmg6IERlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUgYW5kCisJVFJBRF9DT1JFX1VTRVJfT0ZGU0VUIGJ1dCBub3QgSE9TVF9TVEFDS19PRkZTRVQuCisKK1dlZCBNYXIgIDIgMTE6NTc6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5bY2hdOiBEbyBub3QgaW5jbHVkZSBsaWJocHBhLmggaW4gc29tLmMsIGluc3RlYWQgaW5jbHVkZQorCWl0IGluIHNvbS5oLgorCisJKiBlbGYzMi1ocHBhLltjaF06IERvIG5vdCBpbmNsdWRlIGxpYmhwcGEuaCBpbiBlbGYzMi1ocHBhLmMsIGluc3RlYWQKKwlpbmNsdWRlIGl0IGluIGVsZjMyLWhwcGEuaC4KKworCSogc29tLmMgKGxvZzIpOiBSZXR1cm4gLTEgb24gZXJyb3IgcmF0aGVyIHRoYW4gYWJvcnRpbmcuCisJKHNldHVwX3NlY3Rpb25zKTogQnViYmxlIHVwIGFuIGVycm9yIGZyb20gbG9nMi4KKworCSogQ2hhbmdlcyB0byBtYWtlIEhQIEMgY29tcGlsZXIgaGFwcHkgaW4gYm90aCB0cmFkaXRpb25hbAorCWFuZCBBTlNJIG1vZGUuCisJKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgY29ycmVjdCBlbnVtIHR5cGUgZm9yCisJZmllbGQgcGFyYW1ldGVyLgorCShiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBVc2UgdW5zaWduZWQgaW50IHJhdGhlciB0aGFuCisJdW5zaWduZWQgY2hhciB0byBhdm9pZCBHTlUtQyBleHRlbnNpb25zLgorCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogUmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBzdWNjZXNzCisJb3IgZmFpbHVyZSByYXRoZXIgdGhhbiBhYm9ydGluZyBvbiBmYWlsdXJlLgorCisJKiBzb20uaCAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogRml4IHByb3RvdHlwZSB0byBtYXRjaAorCXNvbS5jIGNoYW5nZXMuCisJKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBBZGQgcHJvdG90eXBlLgorCShocHBhX3NvbS1nZW5fcmVsb2NfdHlwZSk6IExpa2V3aXNlLgorCisJKiBlbGYzMi1ocHBhLmM6IEFkZCBhIGNvdXBsZSBjYXN0cyB0byBtYWtlIEhQIGNvbXBpbGVyIGhhcHB5LgorCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEbyBub3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKKwl1bnRpbCByZXN0IG9mIGNvZGUgaXMgcmVhZHkgdG8gaGFuZGxlIGl0LiAgQWJvcnQgZm9yIG5vdy4KKworVHVlIE1hciAgMSAxODozMzo1OSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCitUdWUgTWFyICAxIDEzOjA2OjUzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGkzODZvczlrLmM6IHVzZSBuZXcgZnVuY3Rpb25zIGJmZF9zZXRfZXJyb3IgYW5kIGJmZF9nZXRfZXJyb3IuCisJKiBNYWtlZmlsZS5pbjogZGVsZXRlIGFuIGV4dHJhIGJsYW5rLgorCSogY29uZmlndXJlLmluIDogQWRkIGkzOTZvczlrX3ZlYy4KKworTW9uIEZlYiAyOCAxNTo0MTowMSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBjb25maWcuYmZkIDogQWRkIGkzODYtb3M5ay4KKwkqIGNvbmZpZy9pMzg2LW9zOWsubXQgOiBOZXdseSBhZGQgb3M5ayB0YXJnZXQgbWFrZWZpbGUuCisKKwkqIGkzODZvczlrLmMgOiBuZXcgZmlsZSB0byBoYW5kbGUgb3M5ayBmb3JtYXQgYmZkLgorCSogTWFrZWZpbGUuaW4gOiBIYW5kbGUgbmV3IGZpbGUgaTM4Nm9zOWsuYworCSogdGFyZ2V0cy5jIDogQWRkIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyIGFuZCBpMzg2b3M5a192ZWMuCisJKiBjYWNoZS5jIDogSW5pdGlhbGl6ZSBjYWNoZV9zZW50aW5lbCB0byAwLgorCitTdW4gRmViIDI3IDE2OjMwOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBlbGYzMi1ocHBhLmMgKG1pc21hdGNoZXMsIHJldHZhbF9taXNtYXRjaGVzKTogRml4IG1pc21hdGNoCisJYWN0aW9uIGluIGNhc2Ugd2hlcmUgY2FsbGVyIHNwZWNpZmllZCBubyBhcmd1bWVudCByZWxvY2F0aW9uLgorCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFRyeSBhZ2FpbiB0byBnZXQgdGhlIHN5bV9wdHJfcHRyCisJcmlnaHQgaW4gdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24gYW5kIHRoZSBzdHViJ3MgcmVsb2NhdGlvbi4KKworICAgICAgICAqIGVsZjMyLWhwcGEuaCAoaHBwYV9sb29rX2Zvcl9zdHViX2luX3NlY3Rpb24pOiBGaXggdHlwby4gIERlbGV0ZQorCXVudXNlZCBzeW1ib2xzIGFyZ3VtZW50LgorCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBBY2NlcHQgYXN5bWJvbCAqKiByYXRoZXIKKwl0aGFuIGFzeW1ib2wgKiBmb3Igb3JpZ2luYWwgdGFyZ2V0IHN5bWJvbC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisJU2V0IHJlbG9jLT5zeW1fcHRyX3B0ciBhcHByb3ByaWF0ZWx5LgorCShocHBhX2VsZl9idWlsZF9saW5rZXJfc3R1Yik6IFNldCByZWxvYy0+c3ltX3B0cl9wdHIgY29ycmVjdGx5LgorCShocHBhX2VsZl9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTm8gbG9uZ2VyIG5lZWQgc3ltYm9scworCWFyZ3VtZW50LiAgVXNlIHRoZSBvdXRwdXQgc3ltYm9scyB3aGVuIGNhbm9uaWNhbGl6aW5nIHRoZSByZWxvY3MsCisJY3JlYXRpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERvIG5vdAorCXJlYnVpbGQvY2xvYmJlciB0aGUgb3V0cHV0IHN5bWJvbHMgaWYgdGhleSBhbHJlYWR5IGV4aXN0LgorCitTdW4gRmViIDI3IDE1OjIyOjM2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0cy5jIChCRkRfU0VORCwgQkZEX1NFTkRfRk1UKTogQWRkIGRlYnVnZ2luZyB2ZXJzaW9ucyB0aGF0CisJY2hlY2sgYWxsIHRoZSBwb2ludGVyIGRlcmVmZXJlbmNlcy4gIEVuYWJsZWQgdmlhIERFQlVHX0JGRF9TRU5ELgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCisJKiBzcmVjLmMgKGhleF92YWx1ZSk6IEFsd2F5cyBzZXQgdG8gYSBzaXplIG9mIDI1NiBieXRlcy4KKwkoc3JlY19pbml0KTogQ29zbWV0aWMgY2hhbmdlcy4KKworU3VuIEZlYiAyNyAxMToxODo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZWxmMzItaHBwYS5jOiBTZWNvbmQgaGFsZiBvZiBtYWpvciBjbGVhbnVwLiAgTW9yZSBjb21tZW50cywKKwlQQVJBTWl6ZSBhbmQgc3RhdGljaXplIHJlc3Qgb2YgZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZAorCWZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQvdW5uZWNlc3NhcnkgYXJndW1lbnRzIHRvIHNvbWUgZnVuY3Rpb25zLgorCUdyb3VwIHN0YXRpYyB2YXJzIHRvZ2V0aGVyLiAgQWJvcnQgZm9yIGJhZCBlcnJvcnMgdW50aWwgd2UgaGF2ZQorCWVycm9yIGNvZGUgcHJvcG9nYXRpb24gd29ya2luZy4gIFdvcmsgb24gc3BhY2luZyBhbmQgaW5kZW50aW9uLgorCUFkZCBGSVhNRXMgZm9yIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBVc2UgZW51bXMgcmF0aGVyIHRoYW4KKwkjZGVmaW5lcyBmb3IgbG90cyBvZiB0aGluZ3MuICBNZXJnZSB0d28gZnVuY3Rpb25zIHdoaWNoIGJ1aWxkCisJbGlua2VyIHN0dWJzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gKHNvIHRoZXkgY2FuIGVhc2lseSBzaGFyZSBhCisJdG9uIG9mIGNvbW1vbiBjb2RlKS4KKworU2F0IEZlYiAyNiAxMDowMDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHJlbG9jLmMgKF9iZmRfcmVsb2NhdGVfY29udGVudHMpOiBBZGp1c3QgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cgdG8KKwlhdm9pZCBkZXBlbmRpbmcgdXBvbiByaWdodCBzaGlmdHMgb2Ygc2lnbmVkIG51bWJlcnMsIGFuZCB0bworCWNvcnJlY3QgaGFuZGxpbmcgb2Ygc3JjX21hc2sgd2l0aCBsb3dlciBiaXRzIHplcm8uCisKKwkqIGFvdXR4LmgsIGFyY2hpdmUuYzogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KKwkqIGVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlY29mZnN3YXAuaCwgc3JlYy5jOiBMaWtld2lzZS4KKwkqIGVsZjMyLWkzODYuYzogTGlrZXdpc2UuCisJKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgaSB1bnNpZ25lZDsgcmVtb3ZlIG9sZAorCSNpZiAwIGNvZGUuCisJKGVsZl93cml0ZV9waGRycyk6IE1ha2UgaSB1bnNpZ25lZC4KKwkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBNYWtlIGkgYW5kIG5fbGVmdCB1bnNpZ25lZC4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCisJKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KKwkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MpOiBNYWtlIGkgdW5zaWduZWQuCisJKE5BTUUoYmZkLGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpKTogTWFrZSBjb3VudCB1bnNpZ25lZC4KKwkoc2VjdGlvbl9mcm9tX2VsZl9pbmRleCk6IE1ha2UgaW5kZXggYXJndW1lbnQgdW5zaWduZWQuCisKK0ZyaSBGZWIgMjUgMjE6MzQ6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmguCisJKHN3YXBfb3V0X3N5bXMpOiBVc2UgQkZEX0FTU0VSVCByYXRoZXIgdGhhbiBhc3NlcnQuCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQWRkIG1pc3NpbmcKKwlicmVhayBpbiBzd2l0Y2guCisKKwkqIGhvc3RzL2kzODZ2NC5oIChxc29ydCwgc3RydG9sKTogUmVtb3ZlIGluY29ycmVjdCBhbmQgdXNlbGVzcworCWRlY2xhcmF0aW9ucy4KKworRnJpIEZlYiAyNSAxNjozNTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogbGliaHBwYS5oIChocHBhX3JlYnVpbGRfaW5zbik6IE1vdmVkIGhlcmUgZnJvbSBlbGYzMi1ocHBhLmMuCisKKwkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWRkIG5ldyBhcmd1bWVudHMuCisJKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IEFkZCBleHRlcm4gZGVjbC4KKworCSogZWxmMzItaHBwYS5jOiBGaXJzdCBoYWxmIG9mIG1ham9yIGNsZWFudXAuICBBZGQvY2xlYW51cCBsb3RzIG9mCisJY29tbWVudHMuICBQQVJBTWl6ZSBzb21lIHN0YXRpYyBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucy4KKwlEZWxldGUgdW51c2VkL3VubmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBtYW55IGZ1bmN0aW9ucy4gIEdyb3VwCisJc3RhdGljIHZhcnMgdG9nZXRoZXIuICBDb2xsYXBzZSBjb21tb24gY2FzZSBzdGF0ZW1lbnRzIHRvZ2V0aGVyCisJaW4gbWFueSBwbGFjZXMuICBVc2UgZGVmYXVsdCBjYXNlIHdoZW4gcG9zc2libGUgaW5zdGVhZCBvZiBsaXN0aW5nCisJZWFjaCBjYXNlIHNlcGFyYXRlbHkuICBBYm9ydCBmb3IgYmFkIGVycm9ycyB1bnRpbCB3ZSBnZXQgZXJyb3IKKwljb2RlIHByb3BvZ2F0aW9uIHdvcmtpbmcuICBXb3JrIG9uIHNwYWNpbmcgYW5kIGluZGVudGlvbiBwcm9ibGVtcy4KKwlBZGQgRklYTUVzIGZvciBzb21lIHVucmVzb2x2ZWQgcHJvYmxlbXMuICBEZWxldGUgaG9wZWxlc3NseSBicm9rZW4gCisJQ09NUExFWCByZWxvY2F0aW9uIHN1cHBvcnQgKGl0J3MgbmV2ZXIgdXNlZCBhbnl3YXkpLgorCShocHBhX2VsZl9yZWJ1aWxkX2luc24pOiBEZWxldGUuICBNb3ZlZCBpbnRvIGxpYmhwcGEuaC4KKwkoZWxmX2hwcGFfdGNfc3ltYm9sKTogQWNjZXB0IGFuZCB1c2UgbmV3IGFyZ3VtZW50cyAoc3ltZXh0IGNoYWlucykuCisJKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KKworCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IEluaXRpYWxpemUgbWF0Y2hpbmdfdmVjdG9yCisJdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IEZpeCB0eXBvLgorCisJKiBzb20uYyAoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBVc2UgInNpemVvZiAoYXN5bWJvbCAqKSIKKwlub3QgInNpemVvZiAoc29tX3N5bWJvbF90eXBlICopIi4KKworCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFVzZSAic2l6ZW9mIChhc3ltYm9sICopIgorCW5vdCAic2l6ZW9mIChhc3ltYm9sIikuICBPcHBzLgorCitGcmkgRmViIDI1IDEzOjE5OjA0IDE5OTQgIFRlZCBMZW1vbiAgKG1lbGxvbkBwZXBwZXIubmNkLmNvbSkKKworCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSk6IENhbid0IHJldHVybiBncCB2YWx1ZSBvbiBhbiBhcmNoaXZlLgorCShiZmRfc2V0X2dwX3NpemUpOiAgQ2FuJ3Qgc2V0IGdwIHZhbHVlIG9uIGFuIGFyY2hpdmUuCisKK0ZyaSBGZWIgMjUgMTI6NTc6MDAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogc3JlYy5jIChwYXNzX292ZXIpOiBEb24ndCBza2lwIHRvbyBtYW55IGNoYXJhY3RlcnMgd2hlbgorCWVuZCBvZiBsaW5lIHNlZW4uCisKK0ZyaSBGZWIgMjUgMTE6NDE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9zaXplb2ZfaGVhZGVycyk6IEFsaWduIHJlc3VsdCB0byAxNiBieXRlCisJYm91bmRhcnkuCisKK1RodSBGZWIgMjQgMDc6MTM6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvKTogRGVyaXZlIHN5bWJvbF9pbmZvCisJZmllbGQgZm9yIGFic29sdXRlIHN5bWJvbHMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHVuZGVmaW5lZAorCWFuZCBjb21tb24gc3ltYm9scy4KKworVGh1IEZlYiAyNCAwNDoyOToxOSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGVsZmNvZGUuaCAoZWxmX2NvcmVfZmlsZV9wKTogIENoZWNrIGZvciBjb3JlIGZpbGUgZV9tYWNoaW5lIG1hdGNoCisJbGlrZSBpbiBlbGZfb2JqZWN0X3AuCisKK1dlZCBGZWIgMjMgMTg6Mjg6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZmNvZGUuaCAoYWxsb2NhKTogRGVsZXRlIGRlY2xhcmF0aW9uLgorCisJKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IFVzZSBDUFVfUEFfUklTQzFfMCBmb3IgbWFnaWMKKwludW1iZXIgcmF0aGVyIHRoYW4gSFA5MDAwUzgwMF9JRC4gIE5vdGUgc29tLmMgaXMgY2FyZWZ1bAorCXRvIG1ha2Ugc3VyZSBDUFVfUEFfUklTQzFfMCBpcyBhbHdheXMgZGVmaW5lZC4KKworTW9uIEZlYiAyMSAxMDoxMjowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh0YXJnZXRzLm8sIGFyY2h1cmVzLm8pOiBVc2UgQUxMX0NGTEFHUyB0byBzdXBwbHkKKwlmbGFncyB0byBleHBsaWNpdCBjb21waWxlIGFjdGlvbnMuCisKK01vbiBGZWIgMjEgMDk6NTA6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmbGluay5jIChlY29mZl93cml0ZV9zeW1oZHIpOiBTZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgorCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFrZSBzdXJlIC5ic3Mgc2VjdGlvbgorCWVuZHMgb24gYSBwYWdlIGJvdW5kYXJ5IGlmIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4KKwkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgc3ltaGRyLT5tYWdpYyBoZXJlLgorCisJKiBob3N0cy9ocDMwMC5oOiBJbmNsdWRlIDxzdGRsaWIuaD47IGRvbid0IGRlY2xhcmUgZnJlZS4KKworCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IFVzZSBhIHBvaW50ZXIgYW5kIGFsbG9jYQorCXJhdGhlciB0aGFuIGFuIGFycmF5IG9mIHZhcmlhYmxlIHNpemUuCisJKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTGlrZXdpc2UuCisJKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCisKKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFJld3JpdGUgbWFzayBhbmQgc2hpZnQKKwlvcGVyYXRpb24gdG8gYXZvaWQgT1NGIDEuMyBjYyBidWcuCisJKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBNYWtlIHRleHRfc2l6ZSwgZGF0YV9zaXplCisJYW5kIGJzc19zaXplIGJmZF9zaXplX3R5cGUgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgTWFrZQorCXRleHRfc3RhcnQgYW5kIGRhdGFfc3RhcnQgYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCisJKiBlY29mZmxpbmsuYyAoZWNvZmZfYWRkX3N0cmluZyk6IFJlbW92ZSBpbmNvcnJlY3QgY2FzdCBvZiByZXR1cm4KKwl2YWx1ZS4KKworU3VuIEZlYiAyMCAxNjowNjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBDb25zaWRlcgorCXN5bWJvbHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcC4KKworU2F0IEZlYiAxOSAwMzoxNzozMiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZworCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCisJKiBjb2ZmLXNwYXJjLmMgKGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MpOiAgQWRkIGZvcndhcmQgZGVjbGFyYXRpb24sCisJYWRkIG1pc3NpbmcgZXJyb3JfbWVzc2FnZSBhcmd1bWVudC4KKwkqIG1pcHNic2QuYyAobWlwc19maXhfaGkxNl9zKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLCBhZGQgbWlzc2luZworCWVycm9yX21lc3NhZ2UgYXJndW1lbnQuCisKK0ZyaSBGZWIgMTggMTE6NDE6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJU3VwcG9ydCBmb3IgUG93ZXJQQyBOZXRXYXJlLgorCSogbmxtMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtbmxtLgorCSogY29uZmlnL3BwYy1ubG0ubXQ6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluIChubG0zMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKKwlubG0zMi1wb3dlcnBjLm8sIG5sbTMyLm8sIG5sbS5vLgorCSogdGFyZ2V0cy5jIChubG0zMl9wb3dlcnBjX3ZlYyk6IERlY2xhcmUuCisJKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgbmxtMzItcG93ZXJwYy5vLgorCShDRklMRVMpOiBBZGQgbmxtMzItcG93ZXJwYy5jLgorCisJSW5pdGlhbCBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4gIERvbmUgd2l0aG91dCBhbiBBQkksIGFuZAorCXByb2JhYmx5IHRvIGJlIGNoYW5nZWQgd2hlbiBJIGdldCBhbiBBQkkuCisJKiBjb25maWcuYmZkIChwb3dlcnBjLSotc3lzdjQqKTogTmV3IHRhcmdldDsgdXNlIHBwYy1lbGYuCisJKiBjb25maWcvcHBjLWVsZi5tdDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOyB1c2UKKwllbGYzMi1wb3dlcnBjLm8sIGVsZjMyLm8sIGVsZi5vLgorCSogZWxmMzItcG93ZXJwYy5jOiBOZXcgZmlsZS4KKwkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX3Bvd2VycGMgY2FzZS4KKwkoZWxmX3NldF9hcmNoX21hY2gpOiBMaWtld2lzZS4KKwkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3Bvd2VycGNfdmVjKTogRGVjbGFyZS4KKwkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1wb3dlcnBjLm8uCisJKENGSUxFUyk6IEFkZCBlbGYzMi1wb3dlcnBjLmMuCisJUmVidWlsdCBkZXBlbmRlbmNpZXMuCisKK1RodSBGZWIgMTcgMTU6Mjk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfbGluZW51bWJlcnMpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEhhbmRsZSB6ZXJvIHN5bWJvbHMKKwlyZWFzb25hYmx5LiAgQWxsb2NhdGUgeF9zeW1wIHVzaW5nIGFsbG9jYS4KKworCSogZWxmY29kZS5oIChtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IEVMRiBwcm9ncmFtIGhlYWRlciBlbnRyaWVzCisJbXVzdCBiZSBzb3J0ZWQgYnkgbG9hZCBhZGRyZXNzLiAgVGhpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbnRyaWVzCisJaW4gcmV2ZXJzZSBvcmRlci4KKworCSogc2VjdGlvbi5jIChTRUNfSU5fTUVNT1JZKTogRGVmaW5lLgorCShhc2VjdGlvbik6IFJlbmFtZSB1bnVzZWQgZmllbGQgb3RoZXJ1c2VyZGF0YSB0byBjb250ZW50cywgYW5kCisJbWFrZSBpdCBjaGFyICouCisJKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogSW5pdGlhbGl6ZSBjb250ZW50cyBmaWVsZCB0byBOVUxMLgorCShiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBJZiBTRUNfSU5fTUVNT1JZIGlzIHNldCwgZ2V0IHNlY3Rpb24KKwljb250ZW50cyBmcm9tIGNvbnRlbnRzIGZpZWxkIHJhdGhlciB0aGFuIGZyb20gZmlsZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworVGh1IEZlYiAxNyAwODozMDo1MyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yLCBiZmRfc2V0X2Vycm9yKTogTmV3IGZ1bmN0aW9ucy4KKwkoYmZkX2Vycm9yKTogTWFrZSBzdGF0aWMuCisJKGJmZF9lcnJvcl90eXBlKTogUmVuYW1lZCBmcm9tIGJmZF9lYy4gIFByZXBlbmQgImJmZF9lcnJvcl8iIHRvCisJYWxsIHZhbHVlcy4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisJKiBhaXgzODYtY29yZS5jLCBhb3V0LWFkb2JlLmMsIGFvdXQtZW5jYXAuYywgYW91dC10YXJnZXQuaCwgCisJYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgCisJYmZkLmMsIGJvdXQuYywgY2FjaGUuYywgY29mZi1hbHBoYS5jLCBjb2ZmLW1pcHMuYywgCisJY29mZi1yczYwMDAuYywgY29mZmNvZGUuaCwgY29mZmdlbi5jLCBjb3JlLmMsIGN0b3IuYywgCisJZWNvZmYuYywgZWNvZmZsaW5rLmMsIGVsZi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgCisJZWxmY29kZS5oLCBmb3JtYXQuYywgaGFzaC5jLCBocDMwMGhwdXguYywgaHBwYWJzZC1jb3JlLmMsIAorCWkzODZseW54LmMsIGllZWUuYywgbGliYmZkLmMsIGxpYmVsZi5oLCBsaW5rZXIuYywgCisJbHlueC1jb3JlLmMsIG5sbS5jLCBubG0zMi1hbHBoYS5jLCBubG0zMi1pMzg2LmMsIAorCW5sbTMyLXNwYXJjLmMsIG5sbWNvZGUuaCwgb2FzeXMuYywgb3BuY2xzLmMsIG9zZi1jb3JlLmMsIAorCXB0cmFjZS1jb3JlLmMsIHJlbG9jMTYuYywgcnM2MDAwLWNvcmUuYywgc2VjdGlvbi5jLCBzb20uYywgCisJc3JlYy5jLCBzdW5vcy5jLCBzeW1zLmMsIHRhcmdldHMuYywgdGVraGV4LmMsIAorCXRyYWQtY29yZS5jOiBDaGFuZ2UgY2FsbGVycy4KKworVHVlIEZlYiAxNSAyMjoyNzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmM6IFJlbW92ZSBGSVhNRXMgZm9yIHRoaW5ncyB3aGljaCBoYXZlIGJlZW4gZGVhbHQgd2l0aC4KKworVHVlIEZlYiAxNSAxOTozOToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFNpbmNlIHRoaXMgZnVuY3Rpb24gcmVhZHMKKwl1bnJlbG9jYXRlZCBjb250ZW50cywgdGhlIHNlY3Rpb24ncyByYXcgc2l6ZSBpcyBhbHdheXMgdGhlIG9uZSB0bworCXVzZSBmb3IgYm91bmRzIGNoZWNraW5nLgorCisJKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogSW4gYXNzZXJ0aW9uLCBjb21wYXJlCisJbGlua19vcmRlciBzaXplIGZpZWxkIGFnYWluc3QgY29va2VkIHNpemUsIG5vdCByYXcgc2l6ZSwgb2YgaW5wdXQKKwlzZWN0aW9uLgorCisJKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IEZvciBCU1Mgc2VjdGlvbiwganVzdAorCXJldHVybiAwLgorCShhbGlnbmNvZGUpOiBXaGVuIHNocmlua2luZywgdGhlIGFkZGVuZCBzaG91bGQgYmUgc2V0IHRvIHRoZQorCWN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzZWN0aW9uIHBsdXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBwYWRkaW5nCisJdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHJldGFpbmVkLgorCShiX291dF9yZWxheF9zZWN0aW9uKTogSWYgYSBzZWN0aW9uIGNvbnRhaW5zIG5vIHJlbG9jYXRpb25zLCBkb24ndAorCWJvdGhlciBwcm9jZXNzaW5nIHRoZW0uCisJKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFNldCByZWxvY19kb25lLiAgQXNzZXJ0CisJdGhhdCBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgcmV0dXJucyB0cnVlLiAgQ2hlY2sgdGhhdCByZWxvY3MgYXJlCisJcHJvcGVybHkgb3JkZXJlZC4KKwkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlIEFMSUdORE9ORSk6IEFzc2VydAorCXRoYXQgcmVsb2MtPmFkZGVuZCBmYWxscyBiZXR3ZWVuIHRoZSBjdXJyZW50IHNvdXJjZSBvZmZzZXQgYW5kIHRoZQorCXJhdyBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uLgorCisJKiBjb25maWcuYmZkOiBTdXBwb3J0IGk5NjAgdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCB3aXRoIGNvZmYsIG5vdAorCWJvdXQuICBEZWZhdWx0IHdpdGggbm8gdmVyc2lvbiBudW1iZXIgaXMgc3RpbGwgYm91dC4gIFN1cHBvcnQKKwlleHBsaWNpdCBpOTYwLWNvZmYgdGFyZ2V0IHRvby4KKworCSogYm91dC5jOiBDaGFuZ2VkIHNvbWUgaW5kZW50YXRpb24sIGRlbGV0ZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwKKwlmaXhlZCBzb21lIGNvbW1lbnRzLCByZW1vdmVkIHNvbWUgIiNpZiAxIiBsaW5lcy4KKwkob3V0cHV0X2FkZHIpOiBOZXcgbWFjcm8uCisJKGNhbGxqeF9jYWxsYmFjaywgY2FsbGpfY2FsbGJhY2ssIGdldF92YWx1ZSwgYWJzMzJjb2RlLCBhbGlnbmNvZGUsCisJYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGl0IGZvciByZWFkYWJpbGl0eS4KKworVHVlIEZlYiAxNSAwOTowMDoxNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUpOiBJdGVyYXRlIHRocm91Z2ggdGhlIFNPTQorCXN5bWJvbHMsIG5vdCB0aGUgQkZEIHN5bWJvbHMuCisJKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTGlrZXdpc2UuCisKK01vbiBGZWIgMTQgMjI6NTU6MjAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogRG8gbm90IGRpZSBpZiBhIEJGRCBkb2Vzbid0CisJaGF2ZSBhbnkgc3ltYm9scy4KKworCSogRmluaXNoIGJhc2ljIHJlYWQtd3JpdGUgc3VwcG9ydCBmb3IgU09NIGFyY2hpdmUgbGlicmFyaWVzLiAgQnVncworCXN1cmVseSByZW1haW4gYXMgdGhpcyBoYXNuJ3QgYmVlbiB0ZXN0ZWQgYWxsIHRoYXQgbXVjaC4KKwkqIHNvbS5jIChTT01fTFNUX0hBU0hfU0laRSwgU09NX0xTVF9NT0RVTEVfTElNSVQpOiBEZWZpbmUuCisJKHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvIG5lY2Vzc2FyeQorCXRvIGJ1aWxkIGJvdGggbm9ybWFsIGFuZCBsaWJyYXJ5IHN5bWJvbCB0YWJsZXMuCisJKHNvbV9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbiB0byBkZXJpdmUgaW5mbyBuZWNlc3NhcnkKKwl0byBidWlsZCBib3RoIG5vcm1hbCBhbmQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgorCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFVzZSBuZXcgZnVuY3Rpb24gdG8gZGVyaXZlIG1pc2MKKwlzeW1ib2wgaW5mb3JtYXRpb24uCisJKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBVcGRhdGUgYmFja2VuZCBwcml2YXRlIGRhdGEgZm9yIHN5bWJvbHMKKwlhcHByb3ByaWF0ZWx5LgorCShzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogTmV3IGZ1bmN0aW9uLgorCShzb21fYmZkX2FyX3N5bWJvbF9oYXNoKTogTmV3IGZ1bmN0aW9uLgorCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBmdW5jdGlvbi4KKwkoc29tX3dyaXRlX2FybWFwKTogRmxlc2ggb3V0LgorCShzb21fdmVjKTogRml4IGFyIHBhZGRpbmcgY2hhcmFjdGVyLgorCisJKiBzb20uYzogQ29uc2lzdGVudGx5IHVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCisKK01vbiBGZWIgMTQgMTc6MDI6MjggMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29mZi1yczYwMDAuYzogIEFkZCBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LCB1c2UgSE9TVF9BSVgsIHdoZXJlCisJYXBwcm9wcmlhdGUuCisJKiByczYwMDAtY29yZS5jOiAgVXNlIEhPU1RfQUlYIGluc3RlYWQgb2YgQ09SRUZJTEVTX1BMRUFTRS4KKwkqIGNvbmZpZy9yczYwMDAubWg6ICBSZW1vdmUgZGVmcyBvZiBBUkNISVZFU19QTEVBU0UgYW5kCisJQ09SRUZJTEVTX1BMRUFTRS4KKwkqIGNvbmZpZy9yczYwMDBseW54Lm1oOiAgVHVybiBvbiBMeW54IGNvcmUgZmlsZSBzdXBwb3J0LgorCSogaG9zdHMvcnM2MDAwLmg6ICAjZGVmaW5lIEhPU1RfQUlYLgorCSogaG9zdHMvcnM2MDAwbHlueC5oOiAgQ3JlYXRlIHRoaXMgdG8gZW5hYmxlIEx5bnggaG9zdCBzdXBwb3J0LgorCitTdW4gRmViIDEzIDE0OjMwOjAwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb20uaCAoc29tX3N5bWJvbF9kYXRhKTogU2FmZWx5IGFjY2VzcyBiYWNrZW5kIHByaXZhdGUgZGF0YQorCWZvciBCRkQgc3ltYm9scy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisKKwkqIFJlYWQtb25seSBTT00gYXJjaGl2ZSBzdXBwb3J0LgorCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCisJKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzKTogTmV3IGhlbHBlciBmdW5jdGlvbi4KKwkoc29tX3NsdXJwX2FybWFwKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBTT00gTFNULgorCisJKiBzb20uaDogSW5jbHVkZSA8bHN0Lmg+IGFuZCA8YXIuaD4uCisKK1NhdCBGZWIgMTIgMjI6MzQ6MTQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRml4IHR5cG8uCisJKHdyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZXMgZnJvbSBwcmVwX2hlYWRlcnMgYW5kCisJZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KKwkoc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKworRnJpIEZlYiAxMSAxNjo1Njo1MCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAobm9ybWFsaXplKSBbVk1TXTogQ2FsbCBtYWxsb2MsIG5vdCBiZmRfeG1hbGxvYy4KKwkoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogQ2hlY2sgcmVzdWx0IG9mIG5vcm1hbGl6ZS4KKworVHVlIEZlYiAgOCAwODo1NzozMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwlNYWtlIGFsbCBjYWxsZXJzIG9mIG1hbGxvYyBvciByZWFsbG9jIChpbmNsdWRpbmcgdmlhIG9ic3RhY2tzKQorCWNoZWNrIHRoZSByZXN1bHQgZm9yIE5VTEwuICBNb3N0IHNldCBiZmRfZXJyb3IgdG8gbm9fbWVtb3J5IGFuZAorCXJldHVybiBpbiB0aGF0IGNhc2U7IGEgZmV3IGFyZSBoYXJkZXIgdG8gZml4LCBhbmQgYXJlIG1hcmtlZAorCXdpdGggIkZJWE1FIDxyZXR1cm4gdHlwZT4iLgorCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViCisJaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6ICBDaGVjayBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgcmV0dXJuLgorCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzCisJX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERpdHRvCisJKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogRGl0dG8uCisKKwkqIHRla2hleC5jIChmaW5kX2NodW5rIHRla2hleF9ta29iamVjdCk6IENoZWNrIGJmZF9hbGxvYy4KKwkoZmlyc3RfcGhhc2UpOiBEaXR0by4gIEZJWE1FIHZvaWQKKwkodGVraGV4X21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KKworCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBDaGVjayBiZmRfemFsbG9jLgorCShNWShyZWFkX2R5bmFtaWNfc3ltYm9scykgTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBDaGVjayBiZmRfYWxsb2MuCisKKwkqIHN0cmluZ2hhc2guYyAoX2JmZF9zdHJpbmd0YWJfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUuCisKKwkqIHNyZWMuYzogSW5kZW50LgorCShmaWxsdXBfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIHZvaWQKKwkoc3JlY19ta29iamVjdCBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCisJc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGJmZF9hbGxvYy4gCisJKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgorCisJKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgorCShtYWtlX3VuaXF1ZV9zZWN0aW9uKTogQ2hlY2sgYmZkX2FsbG9jLgorCShzb21fbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF96YWxsb2MuCisJKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBEaXR0by4gIEZJWE1FIHZvaWQKKworCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiBDaGVjayBiZmRfemFsbG9jLgorCisJKiBvc2YtY29yZS5jIChvc2ZfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCisJKG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogQ2hlY2sgYmZkX2FsbG9jLgorCisJKiBvYXN5cy5jIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgb2FzeXNfYXJjaGl2ZV9wCisJb2FzeXNfbWtvYmplY3Qgb2FzeXNfb2JqZWN0X3Agb2FzeXNfbmV3X3NlY3Rpb25faG9vaworCW9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgYmZkX2FsbG9jLgorCShvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEpOiBDaGVjayBiZmRfemFsbG9jIGFuZCBiZmRfYWxsb2MuCisJKG9hc3lzX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KKworCSogbmxtY29kZS5oIChubG1fbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgorCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYyBhbmQgYmZkX2FsbG9jLgorCisJKiBubG0zMi1zcGFyYy5jIChubG1fc3BhcmNfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCisKKwkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCisKKwkqIG5sbTMyLWFscGhhLmMgKG5sbV9hbHBoYV9yZWFkX2ltcG9ydCk6IENoZWNrIGJmZF9hbGxvYy4KKworCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMKKwkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYworCShhcmNoaXZlX2hhc2hfbmV3ZnVuYworCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlLgorCShfYmZkX2dlbmVyaWNfZmluYWxfbGluaworCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scworCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayBiZmRfYWxsb2MuCisJKGJmZF9uZXdfbGlua19vcmRlcik6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCisKKwkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgorCisJKiBpZWVlLmM6IEluZGVudC4KKwkocmVhZF9pZCBnZXRfc3ltYm9sIGdldF9zZWN0aW9uX2VudHJ5IGllZWVfYXJjaGl2ZV9wIGllZWVfb2JqZWN0X3AKKwlpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSBpZWVlX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfYWxsb2MuCisJKGRvX29uZSk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCisJKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogQ2hlY2sgaXQuCisJKGluaXRfZm9yX291dHB1dCk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCisJKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBpdC4KKwkoZG9fd2l0aF9yZWxvY3MpOiAgQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KKwkoaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKTogRGl0dG8uICBGSVhNRSB2b2lkLgorCShpZWVlX21rb2JqZWN0KTogQ2hlY2sgYmZkX3phbGxvYy4KKwkoaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96bWFsbG9jLgorCisJKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKKwliZmRfemFsbG9jLgorCisJKiBocHBhYnNkLWNvcmUuYyAoaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sKKwliZmRfemFsbG9jLgorCShocHBhYnNkX2NvcmVfY29yZV9maWxlX3ApOiBDaGVjayBiZmRfemFsbG9jLgorCisJKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoZWNrIGJmZF9hbGxvYy4KKworCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IENoZWNrIGJmZF9hbGxvYy4KKwkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogRGl0dG8uCisJKHdyaXRlX3JlbG9jcyk6IERpdHRvLiAgRklYTUUgdm9pZAorCShlbGZfbWFwX3N5bWJvbHMgYXNzaWduX3NlY3Rpb25fbnVtYmVycyBtYXBfcHJvZ3JhbV9zZWdtZW50cyk6CisJRGl0dG8uICBSZXR1cm4gYSBib29sZWFuLiAKKwkoc3dhcF9vdXRfc3ltcyk6IERpdHRvLiAgQ2hlY2sgZWxmX21hcF9zeW1ib2xzLgorCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgYmZkX3phbGxvYy4KKwkoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSk6IENoZWNrIGJmZF9hbGxvYy4KKwkoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRGl0dG8uCisJKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBhc3NpZ25fc2VjdGlvbl9udW1iZXJzLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IFJldHVybiBhIGJvb2xlYW4uCisJQ2hlY2sgbWFwX3Byb2dyYW1fc2VnbWVudHMuCisJKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBpdC4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogQ2hlY2sgYmZkX2FsbG9jLgorCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKTogQ2hlY2sgYmZkX3ptYWxsb2MgYW5kCisJcmVhbGxvYy4gCisJKGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBEaXR0by4KKwkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBDaGVjayBiZmRfemFsbG9jLgorCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogRGl0dG8uCisJKGVsZjMyX2hwcGFfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZyk6IERpdHRvLgorCisJKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgorCShlY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGVjayBpdC4KKwkoZWNvZmZfc2x1cnBfYXJtYXApOiBDaGVjayBiZmRfYWxsb2MuCisJKGVjb2ZmX3dyaXRlX2FybWFwKTogQ2hlY2sgYmZkX3phbGxvYy4KKwkoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSBhbmQKKwlfYmZkX2xpbmtfaGFzaF9uZXdmdW5jLiAKKwkoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogQ2hlY2sgYmZkX2FsbG9jLgorCisJKiBjdG9yLmMgKGJmZF9jb25zdHJ1Y3Rvcl9lbnRyeSk6IENoZWNrIGJmZF9hbGxvYy4KKworCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBDaGVjayBiZmRfYWxsb2MuCisJKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZXR1cm4gYSBib29sZWFuLgorCShjb2ZmX3dyaXRlX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvYy4gIEZJWE1FIGludAorCShjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KKwkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuCisJKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogQ2hlY2sgYmZkX2FsbG9jLgorCShjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCisJKiBsaWJjb2ZmLWluLmg6IENoYW5nZSBkZWNscyBvZiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMsCisJY29mZl93cml0ZV9saW5lbnVtYmVycy4KKwkqIGxpYmNvZmYuaDogUmVidWlsdC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sKKwljb2ZmX3JlbnVtYmVyX3N5bWJvbHMsIGNvZmZfd3JpdGVfbGluZW51bWJlcnMuCisKKwkqIGNvZmZjb2RlLmg6IEluZGVudC4KKwkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJldHVybiBhCisJYm9vbGVhbi4gCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaXQuCisKKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGJmZF9hbGxvYy4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KKworCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgorCShkb19zbHVycF9ic2RfYXJtYXApOiBEaXR0by4KKwkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBDaGVjayBiZmRfcmVhbGxvYyB2YWx1ZS4KKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIGJmZF9hbGxvYworCXJldHVybiB2YWx1ZS4gIFJldHVybiBib29sZWFuIHZhbHVlLgorCShOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpKTogQ2hlY2sgYmZkX3phbGxvYyByZXR1cm4gdmFsdWUuCisJKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hlY2sgYmZfYWxsb2MgYW5kIGJmZF96YWxsb2MKKwlyZXR1cm4gdmFsdWUuCisJKGFkZF90b19zdHJpbmd0YWIpOiBEaXR0by4gIEZJWE1FIHZvaWQKKwkoYW91dF9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIHJldHVybiB2YWx1ZS4KKwkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQ2hlY2sgYmZkX2FsbG9jIHZhbHVlLgorCSh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogQ2hlY2sgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4KKwkqIGhwMzAwaHB1eC5jIChNWShzbHVycF9zeW1ib2xfdGFibGUpKTogRGl0dG8uCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYy4KKworCSogb3BuY2xzLmMgKGJmZF96YWxsb2MgYmZkX3JlYWxsb2MpOiBDaGVjayByZXN1bHQgb2YgYmZkX2FsbG9jLgorCisJKiBvcG5jbHMuYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAorCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCisJKF9iZmRfbmV3X2JmZCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuLgorCisJKiBpZWVlLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKKwliZmRfeG1hbGxvY19ieV9zaXplX3QuIAorCShpZWVlX2FyY2hpdmVfcCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuIGFuZAorCW9ic3RhY2tfZmluaXNoIGZvciBOVUxMIHJldHVybi4KKworCSogaGFzaC5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90CisJYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKKwkoYmZkX2hhc2hfdGFibGVfaW5pdF9uKTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4gYW5kCisJb2JzdGFja19maW5pc2ggZm9yIE5VTEwgcmV0dXJuLgorCShiZmRfaGFzaF9sb29rdXApOiBDaGVjayBvYnN0YWNrX2FsbG9jIGZvciBOVUxMIHJldHVybi4KKworCSogZWNvZmZsaW5rLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKKwliZmRfeG1hbGxvY19ieV9zaXplX3QuIAorCWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCisJYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBDaGVjayBvYnN0YWNrX2FsbG9jLgorCShhZGRfZmlsZV9zaHVmZmxlIGFkZF9tZW1vcnlfc2h1ZmZsZSk6IENoZWNrIG9ic3RhY2tfYWxsb2MgZm9yCisJTlVMTCByZXR1cm4uICBSZXR1cm4gYm9vbGVhbiwgbm90IHZvaWQuCisJKGJmZF9lY29mZl9kZWJ1Z19pbml0KTogQ2hlY2sgb2JzdGFja19iZWdpbiBmb3IgMCByZXR1cm4uCisJKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogQ2hlY2sgYWRkX2ZpbGVfc2h1ZmZsZQorCWFuZCBhZGRfbWVtb3J5X3NodWZmbGUgcmV0dXJuLiAKKwkoc3RyaW5nX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlIGFuZCBiZmRfaGFzaF9uZXdmdW5jLgorCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IENoZWNrIGJmZF9hbGxvYy4KKwkoZWNvZmZfYWRkX3N0cmluZyk6IENoZWNrIGFkZF9tZW1vcnlfc2h1ZmZsZSByZXR1cm4uCisKKwkqIGxpYmJmZC1pbi5oICh4bWFsbG9jLCBiZmRfeG1hbGxvYywgYmZkX3htYWxsb2NfYnlfc2l6ZV90KToKKwlSZW1vdmUgZGVjbHMuIAorCSogbGliYmZkLmg6IFJlYnVpbHQuCisKK0ZyaSBGZWIgMTEgMTU6MzU6MzIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgTHlueC9yczYwMDAgc3VwcG9ydC4KKwkqIGNvbmZpZy9pMzg2LW5sbS5tdDogIEVuYWJsZSBhLm91dCBmaWxlIHN1cHBvcnQuCisJKiBjb25maWcvcnM2MDAwbHlueC5taDogIEx5bngvcnM2MDAwIGhvc3Qgc3VwcG9ydC4KKworRnJpIEZlYiAxMSAxNzoyNTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBSZXdyaXRlIHNvbWV3aGF0IHRvIGltcHJvdmUKKwltZW1vcnkgdXNhZ2UuCisKK0ZyaSBGZWIgMTEgMTM6MTA6NDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBhcmNoaXZlLmM6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byAnXG4nIGluIGFyY2hpdmUgbWFnaWMKKwl0byAnXDAxMicsIGZvciBncmVhdGVyIHBvcnRhYmlsaXR5LgorCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfYXJtYXApOiBEaXR0by4KKworVGh1IEZlYiAxMCAxMjo1ODo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBDaGVjayBzdHJpcCBzZXR0aW5ncyB0bworCXNlZSB3aGV0aGVyIHN5bWJvbCBzaG91bGQgYmUgb3V0cHV0LgorCSogZ2VubGluay5oIChzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8pOiBBZGRlZCBpbmZvCisJZmllbGQuCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIHdnaW5mby5pbmZvLgorCShfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogQ2hlY2sgc3RyaXAgc2V0dGluZ3MgdG8KKwlzZWUgd2hldGhlciBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEluaXRpYWxpemUgd2dpbmZvLmluZm8uCisKK1dlZCBGZWIgIDkgMjE6MzQ6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChzb21fcmVsb2NfcXVldWVfZmluZCk6IERvIG5vdCBleGFtaW5lIGEgTlVMTCBxdWV1ZSBlbnRyeS4KKworCSogc29tLmM6IENhc3QgcmV0dXJuIHZhbHVlcyBmcm9tIEJGRCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0bworCWF2b2lkIHdhcm5pbmdzIGZyb20gdGhlIEhQIGNvbXBpbGVyLgorCitXZWQgRmViICA5IDEyOjU1OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogQWNjZXB0IGEgTElURVJBTAorCXJlbG9jIG9uIGFuICJsZGwiIGluc3RydWN0aW9uIHRvby4KKworCSogYXJjaGl2ZS5jIChiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSk6IENhc3Qgc3RhdHVzIGVsZW1lbnRzCisJd2hlbiBwYXNzaW5nIHRoZW0gdG8gc3ByaW50Zi4gIFVzZSAlbGQgaW5zdGVhZCBvZiAlZC4KKworCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9ta2FyY2hpdmUpOiBSZXR1cm4gZmFsc2UuCisJKHJzNjAwMF9jb2ZmX3NuYXJmX2FyX2hkcik6IERvbid0IGRlY2xhcmUgZXJybm87IGl0J3Mgbm90IHVzZWQuCisJQWxzbyByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBuYW1lbGVuLgorCShyczYwMDBjb2ZmX3dyaXRlX2FybWFwKTogRGVjbGFyZSBvcmxfY291bnQgYW5kIHN0cmlkeCBwYXJhbWV0ZXJzLgorCitUdWUgRmViICA4IDE4OjAwOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGliYmZkLWluLmggKHhtYWxsb2MpOiBEb24ndCBkZWNsYXJlIHBhcmFtZXRlciB0eXBlLCB0byBhdm9pZAorCWNvbmZsaWN0cy4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCitUdWUgRmViICA4IDE1OjU1OjUwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvZmYtYWxwaGEuYyAocmVsb2NfbmlsKTogTmV3IGZ1bmN0aW9uLgorCShhbHBoYV9ob3d0b190YWJsZSk6IFVzZSBpdCBhcyBzcGVjaWFsX2Z1bmN0aW9uIHRvIHByZXZlbnQgY2VydGFpbgorCXJlbG9jcyBmcm9tIGJlaW5nIGFkanVzdGVkIGJ5IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJR05PUkUKKwlyZWxvYyBzaG91bGQgYmUgcGFydGlhbF9pbnBsYWNlLgorCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBY2NlcHQgYSBMSVRFUkFMCisJcmVsb2Mgb24gYW4gImxkbCIgaW5zdHJ1Y3Rpb24gdG9vLgorCitUdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZWxmMzItaHBwYS5jIChDVVJSRU5UX1NUVUJfT0ZGU0VULCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKKwlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogIENhc3QgdG8gY2hhciAqIGluc3RlYWQgb2YgaW50CisJYmVmb3JlIHBlcmZvcm1pbmcgcG9pbnRlciBhcml0aG1ldGljLgorCitNb24gRmViICA3IDIwOjU2OjI3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcuYmZkIChocHBhKi0qLW9zZiopOiBVc2UgYmZkX25hbWUgaHBwYW9zZiBmb3IgdGhpcworCWNvbmZpZ3VyYXRpb24uCisJKGhwcGEqLSotKmVsZiopOiBUaGlzIGNvbmZpZ3VyYXRpb24gdXNlZCBocHBhLWVsZiBub3cuCisKKwkqIHNvbS5jOiBUaGlzIGZpbGUgaXMgYWxzbyB1c2VkIGZvciBIT1NUX0hQUEFPU0YuCisKKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBFbmFibGUgc29tX3ZlYyBmb3IgSE9TVF9IUFBBT1NGLgorCisJKiBob3N0cy9ocHBhb3NmLmg6IE5ldyBob3N0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKworCSogY29uZmlnL2hwcGFic2QubXQgKFNFTEVDVF9WRUNTKTogQWRkIGJmZF9lbGYzMl9ocHBhX3ZlYyBhcworCUJTRCBoYW5kbGVzIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0IGZpbGVzLgorCisJKiBjb25maWcvaHBwYW9zZi5taCAoSERFRklORVMpOiBEZWxldGUuICBObyBsb25nZXIgbmVlZGVkLgorCShSQU5MSUIpOiBEb2Vzbid0IGRvIGFueXRoaW5nLCBkZWZpbmUgaXQgdG8gYmUgImVjaG8iLgorCisJKiBjb25maWcvaHBwYW9zZi5tdDogTmV3IHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYSBQQSBydW5uaW5nCisJT1NGMS4KKworTW9uIEZlYiAgNyAxNTowMjowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZGVkIGJmZF9hcmNoX3Bvd2VycGMuCisJKGFyY2h1cmVzX2luaXRfdGFibGUpOiBJZiBTRUxFQ1RfQVJDSElURUNUVVJFUyBpcyBub3QgZGVmaW5lZCwKKwlhZGRlZCBiZmRfcG93ZXJwY19hcmNoLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogY3B1LXBvd2VycGMuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTLCBDRklMRVMpOiBBZGRlZCBjcHUtcG93ZXJwYy5jLgorCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgorCisJKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEdldCB2bWEgYW5kIGFsaWdubWVudF9wb3dlcgorCW9mIGFuIFNIVF9TVFJUQUIgc2VjdGlvbiBmcm9tIHNoX2FkZHIgYW5kIHNoX2FkZHJhbGlnbiwgcmF0aGVyCisJdGhhbiBqdXN0IHNldHRpbmcgdGhlbSB0byB6ZXJvLgorCitTdW4gRmViICA2IDIwOjA0OjEwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMsIHN3YXBfb3V0X3N5bXMpOiBDaGVjayBmb3IgTlVMTCByZXR1cm4KKwlmcm9tIGJmZF9uZXdfc3RydGFiLiAKKwkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoZWNrIGZvciBmYWxzZSByZXR1cm4gZnJvbQorCXN3YXBfb3V0X3N5bXMuIAorCisJKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuCisJZnJvbSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgorCisJKiBzeW1zLmM6IE1ha2UgZXhhbXBsZSBhcHBsaWNhdGlvbiBpbiBkb2MgY2FsbCB4bWFsbG9jLCBub3QKKwliZmRfeG1hbGxvYy4gCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpLAorCWFvdXRfbGlua19nZXRfc3ltYm9scywgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKToKKwkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUsIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKToKKwkqIGVjb2ZmLmMgKGVjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2luaXQpOiAKKwkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiAKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IAorCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IAorCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiAKKwkoYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiAKKwkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiAKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IAorCSogZWxmY29kZS5oIChiZmRfbmV3X3N0cnRhYik6IAorCShiZmRfYWRkXzJfdG9fc3RydGFiKTogCisJKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAKKwkoZWxmX2NvcmVmaWxlX25vdGUpOiAKKwkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IAorCVVzZSBtYWxsb2MgYW5kIGNoZWNrIHRoZSByZXN1bHQsIGluc3RlYWQgb2YgYmZkX3htYWxsb2MuCisKK1NhdCBGZWIgIDUgMTI6Mzk6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IFB1dCBtNjgqLSotc3lzdiogbGluZSBhZnRlciBtNjgqLSotc3lzdjQqLgorCitTYXQgRmViICA1IDA1OjMyOjQ0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZCk6ICBQdXQgQ09OU1Qga2V5d29yZCBmb3IgInNyYyIgYmVmb3JlCisJInVuc2lnbmVkIiwgc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBpdCBhZnRlciAidW5zaWduZWQiLgorCSogbGliY29mZi5oLCBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiAgUmVuYW1lICJ2YWx1ZSIgdG8KKwkidmFsIiBpbiBwcm90b3R5cGUgZGVjbGFyYXRpb24gYmVjYXVzZSBzb21lIGNvbXBpbGVycyBkb24ndCBsaWtlCisJYXJndW1lbnRzIHdob3NlIG5hbWVzIGFyZSB0aGUgc2FtZSBhcyB0eXBlcy4KKworU2F0IEZlYiAgNSAwMToxNDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyCisJb2JqZWN0IGZpbGUgZGVmaW5lcyBzeW1ib2wuICBBbHNvLCBpZiBza2lwcGluZyBhIHN5bWJvbCwgc2tpcCB0aGUKKwlzZWNvbmQgc3ltYm9sIG9mIGEgTl9XQVJOSU5HIG9yIE5fSU5EUiBzeW1ib2wgYXMgd2VsbC4KKworRnJpIEZlYiAgNCAyMzo1NTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlBZGQgYmFzaWMgc3VwcG9ydCBmb3Igd3JpdGluZyBSUy82MDAwIFhDT0ZGIGZpbGVzLgorCSogY29mZi1yczYwMDAuYyAoZHVtbXlfcmVsb2MpOiBSZW1vdmVkLgorCShyczYwMDBjb2ZmX2hvd3RvX3RhYmxlKTogRGVmaW5lZCBYQ09GRiByZWxvY3MuCisJKFJUWVBFMkhPV1RPKTogRGVmaW5lZCB0byB1c2UgcnM2MDAwY29mZl9ydHlwZTJob3d0by4KKwkocnM2MDAwY29mZl9ydHlwZTJob3d0byk6IE5ldyBmdW5jdGlvbi4KKwkoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmVkIHRvIHVzZQorCXJzNjAwMGNvZmZfcmVsb2NfdHlwZV9sb29rdXAuIAorCShyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgorCShTRUxFQ1RfUkVMT0MpOiBEZWZpbmVkIHRvIHNldCByX3R5cGUgYW5kIHJfc2l6ZSBmaWVsZHMuCisJKENPRkZfTE9OR19GSUxFTkFNRVMpOiBEZWZpbmVkLgorCSogY29mZmNvZGUuaCAoY29tYmluZWRfZW50cnlfdHlwZSk6IENoYW5nZWQgZml4X3RhZyBhbmQgZml4X2VuZAorCWZpZWxkcyB0byBiaXRmaWVsZHMuICBBZGRlZCBmaWVsZHMgZml4X3ZhbHVlIGFuZCBmaXhfc2NubGVuLgorCShzZWNfdG9fc3R5cF9mbGFncyk6IElmIFNUWVBfREVCVUcgaXMgZGVmaW5lZCwgdXNlIGl0IHJhdGhlciB0aGFuCisJU1RZUF9JTkZPIGZvciB0aGUgdHlwZSBvZiBhIHNlY3Rpb24gbmFtZWQgLmRlYnVnLgorCShjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUgaWYgUlM2MDAwQ09GRl9DLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIFJTNjAwMENPRkZfQywgZG9uJ3QgY2FsbAorCWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scy4KKwkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBJZiBSUzYwMDBDT0ZGX0MsIHRoZW4gaWYgdGhlIGxhc3QgYXV4CisJZW50cnkgaGFzIHR5cGUgU1RZX0xEIGNoYW5nZSB0aGUgeF9zY25sZW4gaW50byBhIHBvaW50ZXIgdG8gYQorCXN5bWJvbCBhbmQgc2V0IGZpeF9zY25sZW4uICBBbHNvLCBmb3IgYSBDX0JTVEFUIHN5bWJvbCwgY2hhbmdlIHRoZQorCXZhbHVlIGludG8gYSBwb2ludGVyIHRvIGEgc3ltYm9sIGFuZCBzZXQgZml4X3ZhbHVlLgorCSogbGliY29mZi5oOiBSZWJ1aWx0LgorCSogY29mZmdlbi5jIChjb2ZmX21hbmdsZV9zeW1ib2xzKTogUmVpbmRlbnQuICBJZiBmaXhfdmFsdWUgaXMgc2V0LAorCWdldCB0aGUgc3ltYm9sIG9mZnNldC4gTGlrZXdpc2UgZm9yIGZpeF9zY25sZW4uCisJKHN0cmluZ19zaXplKTogQ2hhbmdlIHR5cGUgdG8gYmZkX3NpemVfdHlwZS4KKwkoZGVidWdfc3RyaW5nX3NpemUsIGRlYnVnX3N0cmluZ19zZWN0aW9uKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogSWYgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyByZXR1cm5zIHRydWUsCisJd3JpdGUgdGhlIHN5bWJvbCBuYW1lIGludG8gdGhlIC5kZWJ1ZyBzZWN0aW9uOyBhc3N1bWUgdGhhdCB0aGUKKwlzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCB3aXRoIHRoZSByaWdodCBzaXplLgorCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBJbml0aWFsaXplIGRlYnVnX3N0cmluZ19zaXplIHRvIDAuICBJZgorCWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgcmV0dXJucyB0cnVlLCBkb24ndCBwdXQgc3ltYm9sIG5hbWUgaW4KKwl1c3VhbCBzdHJpbmcgdGFibGUuICBBZnRlciB3cml0aW5nIG91dCBhbGwgc3ltYm9scywgaWYKKwlkZWJ1Z19zdHJpbmdfc2l6ZSBpcyBub3QgMCwgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIHRoZSBzaXplIG9mIHRoZQorCS5kZWJ1ZyBzZWN0aW9uLgorCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENsZWFyIG5ldyBmaXhfdmFsdWUgYW5kIGZpeF9zY25sZW4KKwlmaWVsZHMuICBJZiB0aGUgc3RyaW5nIG9mZnNldCBpcyAwLCBhbHdheXMgdXNlIGFuIGVtcHR5IHN0cmluZyBhcworCXRoZSBuYW1lLgorCShjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKTogWmVybyBvdXQgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogV29yayBhcm91bmQgb25lIGdyb3NzIGhhY2sKKwl3aXRoIGFub3RoZXI6IGFjdHVhbGx5IGxvb2sgYXQgdGhlIHRhcmdldCBuYW1lIHRvIGF2b2lkIHRoZSBicm9rZW4KKwlDT0ZGIGNoZWNrLgorCShiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMjYsCisJQkZEX1JFTE9DX1BQQ19CQTI2IGFuZCBCRkRfUkVMT0NfUFBDX1RPQzE2LgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCitGcmkgRmViICA0IDE3OjI4OjMyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGliYmZkLmMgKGJmZF96bWFsbG9jKTogQ2FsbCBiZmRfeG1hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4KKwkoYmZkX3htYWxsb2MsIGJmZF94bWFsbG9jX2J5X3NpemVfdCk6IEZ1bmN0aW9ucyBkZWxldGVkLgorCSogbGliYmZkLWluLmg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nIHhtYWxsb2MgYW5kIGRlY2xhcmUKKwl4bWFsbG9jLiAKKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCitUaHUgRmViICAzIDE2OjQ5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBJZiBhIHNtYWxsIHVuZGVmaW5lZAorCXN5bWJvbCBoYXMgYSB2YWx1ZSBpbiB0aGUgRUNPRkYgc3ltYm9sIGJ1dCBub3QgaW4gdGhlIEJGRCBzeW1ib2wsCisJa2VlcCB0aGUgdmFsdWUgaW4gdGhlIEVDT0ZGIHN5bWJvbC4gIFRoaXMgaGVscHMgZ2FzLgorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMsCisJX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IERvbid0IHJlcXVpcmUgdGhhdCBhbGwKKwlyZWZlcmVuY2VzIHRvIGEgY29tbW9uIHN5bWJvbCBiZSB0aGVtc2VsdmVzIGNvbW1vbiBzeW1ib2xzLgorCisJKiBhb3V0eC5oIChhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24pOiBIYW5kbGUgTl9VTkRGLgorCitXZWQgRmViICAyIDIwOjM3OjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBsaWJiZmQuYywgYmZkLWluLmgsIGhvc3RzL2FscGhhb3NmLmgsIGhvc3RzL3NwYXJjLWxsLmgsIGFvdXRmMS5oLAorCXNwYXJjbHlueC5jLCBNYWtlZmlsZS5pbjogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworV2VkIEZlYiAgMiAxMjozMDoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZSB0eXBlCisJYW5kIHNpemUgY29ycmVjdGx5LgorCShjb2ZmX3N3YXBfYXV4X2luKTogSWYgUlM2MDAwQ09GRl9DLCBjaGFuZ2UgeF9jc2VjdC54X3NjbmxlbiB0bworCXhfY3NlY3QueF9zY25sZW4ubCB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9pbnRlcm5hbC5oLgorCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpLCBjb2ZmLWFscGhhLmMKKwkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlIGNhc3RzIG9mIGF1eF9pbiBhbmQgYXV4X291dAorCWZpZWxkcyB0byBtYXRjaCB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFNFTEVDVF9SRUxPQyBpcyBkZWZpbmVkLCBwYXNzCisJaW4gdGhlIGludGVybmFsX3JlbG9jIGl0c2VsZiwgbm90IHRoZSB0eXBlLgorCSogY29mZi1hcG9sbG8uYywgY29mZi1oODMwMC5jLCBjb2ZmLWg4NTAwLmMsIGNvZmYtaTM4Ni5jLAorCWNvZmYtbTY4ay5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYzogQ2hhbmdlZAorCWRlZmluaXRpb24gb2YgU0VMRUNUX1JFTE9DIGFjY29yZGluZ2x5LgorCitUdWUgRmViICAxIDEyOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkZWQgbmV3IGFyZ3VtZW50cyB0bworCV9iZmRfY29mZl9zd2FwX2F1eF9pbiBhbmQgX2JmZF9jb2ZmX3N3YXBfYXV4X291dDogYXV4IGluZGV4IG51bWJlcgorCWFuZCBudW1iZXIgb2YgYXV4IGVudHJpZXMuCisJKGJmZF9jb2ZmX3N3YXBfYXV4X2luLCBiZmRfY29mZl9zd2FwX2F1eF9vdXQpOiBDaGFuZ2VkCisJYWNjb3JkaW5nbHkuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6IEFjY2VwdCBuZXcKKwlhcmd1bWVudHMuICBJZiBSUzYwMDBDT0ZGX0MsIG9ubHkgdHJlYXQgQ19FWFQgYW5kIENfSElERVhUCisJc3BlY2lhbGx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgYXV4IGVudHJ5LgorCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX3N5bWJvbCwgY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBQYXNzCisJbmV3IGFyZ3VtZW50cyB0byBzd2FwX2F1eCBmdW5jdGlvbnMuCisKK1N1biBKYW4gMzAgMTU6MTQ6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogZ2VuLWFvdXQuYyAobWFpbik6IFNldCBERUZBVUxUX0FSQ0ggYmFzZWQgb24gcHJlcHJvY2Vzc29yIG1hY3JvcworCShvbmx5IHRlc3RpbmcgZm9yIG02OGsgYW5kIHZheCBhdCB0aGUgbW9tZW50KTsgZG8gdmVyaWZ5IHRoYXQgdGhlCisJcHJlcHJvY2Vzc29yIGRpZG4ndCB0cmFzaCB0aGUgYXJjaCBuYW1lIGluc2lkZSB0aGUgc3RyaW5nIHZlcnNpb24uCisJRG9uJ3QgcHJpbnQgb3V0ICJwYWdlc2l6ZSA9IiBsaW5lIHRoYXQgcHJldmVudHMgb3V0cHV0IGZyb20KKwljb21waWxpbmcuICBEZXJpdmUgQllURVNfSU5fV09SRCBhbmQgQVJDSCB2YWx1ZXMgZnJvbSBzaXplb2YKKwlyZXN1bHRzLgorCSogTWFrZWZpbGUuaW4gKGFvdXQtcGFyYW1zLmgpOiBQYXNzIGdlbi1hb3V0IGEgZHVtbXkgdGFyZ2V0IG5hbWUuCisJKGNoZWNrLCBpbnN0YWxsY2hlY2spOiBJZGVudGlmeSBkaXJlY3RvcnkgaW4gIm5vIHRlc3RzdWl0ZXMiCisJbWVzc2FnZS4KKworU3VuIEphbiAzMCAxMzoyNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogV3JpdGUgb3V0IGNvcnJlY3QgdmFsdWUgZm9yCisJb2JqZWN0IGZpbGUgc3ltYm9sLgorCitGcmkgSmFuIDI4IDE4OjM0OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL3ZheGJzZC5oIChIT1NUX1NUQUNLX0VORF9BRERSKTogVmF4IEJTRCBkb2Vzbid0IGRlZmluZQorCUtFUk5CQVNFLCBzbyBoYXJkLWNvZGUgMHg4MDAwMDAwMCBpbnN0ZWFkLgorCitUaHUgSmFuIDI3IDEzOjU0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBJZiBzeW1ib2wgaXMgY29tbW9uLAorCXNldCB0aGUgQlNGX09MRF9DT01NT04gZmxhZy4KKworV2VkIEphbiAyNiAxMzo0NzoxNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBQdXQgdGhlIG5ldyBlbnRyeSBpbiB0aGUKKwljb3JyZWN0IGVsZW1lbnQgb2YgbWF0Y2hpbmdfdmVjdG9yLgorCitUdWUgSmFuIDI1IDExOjQzOjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzb20uYywgc29tLmggKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcywKKwliZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBDaGFuZ2UgcGFyYW1ldGVycyBmcm9tIGNoYXIKKwl0byBpbnQuICBGb2xsb3dpbmcgYSBwcm90b3R5cGUgd2l0aCBhbiBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbgorCWluIHRoZSBwcmVzZW5jZSBvZiB3aWRlbmVkIHBhcmFtZXRlcnMgaXMgYSBHQ0MtaXNtIG5vdCBzdXBwb3J0ZWQKKwlieSB0aGUgSFAgY29tcGlsZXIgaW4gQU5TSSBtb2RlLgorCitUdWUgSmFuIDI1IDExOjQ2OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogU2l6ZSBvZiB0eXBlIC0yIGlzIDQgYnl0ZXMsIG5vdCAyLgorCisJKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFdyaXRlIG91dCB0aGUgc3ltYm9scworCWJlZm9yZSB3cml0aW5nIG91dCB0aGUgcmVsb2NzLCBzbyB0aGF0IHRoZSByaWdodCBzeW1ib2wgaW5kaWNlcworCWFyZSB1c2VkLgorCisJKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2JzZF9hcm1hcCwgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IERvIG5vdAorCXRyeSB0byBvdmVybGF5IHRoZSBpbnRlcm5hbCBjYXJzeW1zIG9uIHRoZSBleHRlcm5hbCBzeW1kZWZzLiAgVGhhdAorCWNhbiBub3Qgd29yayBpZiB0aGUgc2l6ZSBvZiBhIGhvc3QgcG9pbnRlciBpcyBsYXJnZXIgdGhhbiA0IGJ5dGVzLgorCisJKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FzdCByZXN1bHQgb2YKKwliZmRfeG1hbGxvY19ieV9zaXplX3QuCisJKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkKTogQXZvaWQgQU5TSSBDIHByb3RvdHlwZS4KKworCSogYXJjaGl2ZS5jOiBSZWluZGVudGVkIHRvIEdOVSBzdGFuZGFyZHMuCisKK01vbiBKYW4gMjQgMTQ6NDE6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvcG5jbHMuYyAoX2JmZF9uZXdfYmZkLCBfYmZkX25ld19iZmRfY29udGFpbmVkX2luKTogQWRkCisJIl9iZmRfIiB0byBmdW5jdGlvbiBuYW1lcy4KKwkqIGFyY2hpdmUuYyAoX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsKSwKKwlsaWJiZmQtaW4uaDogQ2hhbmdlIGNhbGxlcnMuCisKKwkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IFJlbmFtZWQgZnJvbSB6YWxsb2MuCisJKiBsaWJiZmQuYyAoYmZkX2FkZF90b19zdHJpbmdfdGFibGUpLAorCXRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApLAorCXRhcmdldHMuYyAoYmZkX3RhcmdldF9saXN0KSwKKwlwdHJhY2UtY29yZS5jIChwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCksCisJb3BuY2xzLmMgKG5ld19iZmQpLCBsaWJiZmQtaW4uaCwKKwlpZWVlLmMgKGllZWVfbWFrZV9lbXB0eV9zeW1ib2wpLAorCWVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpLAorCShocHBhX2VsZl9zdHViX3JlbG9jKTogQ2hhbmdlIGNhbGxlcnMuCisJKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCisKKwkqIGFyY2hpdmUuYyAoX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUpOiBBZGQgIl9iZmRfIiB0byBuYW1lLgorCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyksIAorCWNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zKSwgbGliYmZkLWluLmg6CisJQ2hhbmdlIGNhbGxlcnMuCisKKwkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpLCBsaWJiZmQtaW4uaCwgdGFyZ2V0cy5jLAorCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmVuYW1lIHRhcmdldF92ZWN0b3IgdG8gYmZkX3RhcmdldF92ZWN0b3IKKwlhbmQgZGVmYXVsdF92ZWN0b3IgdG8gYmZkX2RlZmF1bHRfdmVjdG9yLgorCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgorCisJKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfY2hlY2tfZm9ybWF0KTogQ2FsbCBpdC4KKwkoYmZkX21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiByZW1vdmVkLgorCSogdGFyZ2V0cy5jOiBSZXBsYWNlIHRoZSB2ZWN0b3IgYWRkZWQgb24gSmFuIDIxIHdpdGggYSBjb3VudCBvZgorCWVudHJpZXMgaW4gZGVmYXVsdF92ZWN0b3IuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCitNb24gSmFuIDI0IDEyOjM4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbi4gIFNldCBzaXplIG9mCisJLnBkYXRhIHNlY3Rpb24gYmFzZWQgb24gbG5ub3B0ciBmaWVsZCwgbm90IHNlY3Rpb24gaGVhZGVyLgorCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGlmIHJfc3ltbmR4ID49IDAsCisJc2luY2UgaXQgaXMgdW5zaWduZWQuCisJKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IFVzZSBhbHBoYV9lY29mZl9vYmplY3RfcCByYXRoZXIgdGhhbgorCWNvZmZfb2JqZWN0X3AuCisJKiBlY29mZi5jIChlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGFsaWdubWVudF9wb3dlciBmaWVsZCBvZgorCS5wZGF0YSBzZWN0aW9uIHRvIDMuCisJKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFNhdmUgdGhlIHNpemUgb2YgdGhlCisJLnBkYXRhIHNlY3Rpb24gaW4gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZCwgYW5kIGFjdHVhbGx5IGFsaWduIHRoZQorCS5wZGF0YSBzZWN0aW9uIHRvIGFuIGFsaWdubWVudCBwb3dlciBvZiA0LgorCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogU2V0IG91dHB1dF9oYXNfYmVndW4gYWZ0ZXIKKwljYWxsaW5nIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHNfbG5ub3B0ciBmb3IgdGhlIC5wZGF0YQorCXNlY3Rpb24gZnJvbSB0aGUgbGluZV9maWxlcG9zIGZpZWxkLiAgU2V0IHZzdGFtcCBmb3IgdGhlIG9wdGlvbmFsCisJaGVhZGVyIGZyb20gdGhlIHZzdGFtcCBvZiB0aGUgc3ltYm9saWMgaGVhZGVyLgorCShlY29mZl9iZmRfZmluYWxfbGluayk6IFNldCB2c3RhbXAgb2YgdGhlIHN5bWJvbGljIGhlYWRlciB0byB0aGUKKwl2c3RhbXAgdXNlZCBieSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaW4gdGhlIGxpbmsuCisKKwkqIGVjb2ZmbGluay5jIChlY29mZl9hbGlnbl9kZWJ1Zyk6IEFsaWduIFJGRHMgdG8gZGVidWdfYWxpZ24uCisKKwkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYWNoaXZlX2VsZW1lbnQpOiBTZXQgU0VDX0FMTE9DIGZsYWcKKwlmb3IgYSBjcmVhdGVkIGNvbW1vbiBzZWN0aW9uLgorCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCisJKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBVc2UgZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiB0bworCWdldCB0aGUgaW5kZXggb2YgYSBjb21tb24gc2VjdGlvbiwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nCisJU0hOX0NPTU1PTiAoTUlQUyBoYXMgbXVsdGlwbGUgY29tbW9uIHNlY3Rpb25zKS4KKworCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFR5cG8gKD09IGZvciA9KS4KKworCSogYmZkL2FvdXR4LmggKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCwKKwlhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBQYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCisJcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywKKwlhbHBoYV9yZWxvY2F0X3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgorCSogY29mZi1oODUwMC5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBjb2ZmLXo4ay5jIChleHRyYV9jYXNlKTogTGlrZXdpc2UuCisJKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTGlrZXdpc2UuCisJKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKworCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrKTogVXNlIGdldF92YWx1ZSB0byBnZXQKKwl0aGUgc3ltYm9sIHZhbHVlIGFuZCBjaGVjayBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCisJKGdldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBsb29rIGl0IHVwIGluIHRoZSBsaW5rZXIKKwloYXNoIHRhYmxlLgorCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBGb3IgUENSRUwyNCBhbmQgUENSRUwxMworCXVzZSBnZXRfdmFsdWUgdG8gZ2V0IHRoZSBzeW1ib2wgdmFsdWUgYW5kIGNoZWNrIGZvciB1bmRlZmluZWQKKwlzeW1ib2xzLgorCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IElmIHRoZSBzeW1ib2wgaXMKKwl1bmRlZmluZWQsIGxvb2sgaXQgdXAgaW4gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgorCisJKiBhb3V0eC5oICh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogVGhlIHN0cmluZyBpbmRleCAwIGhhcyBhCisJc3BlY2lhbCBtZWFuaW5nIGZvciBub3JtYWwgc3ltYm9scywgYnV0IG5vdCBmb3IgZHluYW1pYyBzeW1ib2xzLgorCitTYXQgSmFuIDIyIDEyOjI2OjAxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjbHlueC5jOiAgU2V0dXAgYXBwcm9wcmlhdGUgbWFjcm9zIHRvIGVuYWJsZSBjb3JlIGZpbGUKKwlzdXBwb3J0LgorCitGcmkgSmFuIDIxIDE2OjI1OjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0cy5jOiBBZGQgYSB2ZWN0b3Igb2YgbWF0Y2hpbmcgZm9ybWF0IG5hbWVzLgorCSogZm9ybWF0LmMgKGJmZF9tYXRjaGluZ19mb3JtYXRzKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiBpdC4KKwkoYmZkX2NoZWNrX2Zvcm1hdCk6IFNldCBpdC4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisKKwkqIGJmZC1pbi5oOiBSZW1vdmUgZGVjbHMgb2YgYmZkX2VjIHR5cGUgYW5kIGVycm9yIHByaW50aW5nIGZ1bmN0aW9ucy4KKwlSZW1vdmUgZGVjbCBvZiB0eXBlIHN5bWNsYXNzOyB3YXNuJ3QgdXNlZC4KKwkqIGJmZC5jOiBEb2N1bWVudCBlcnJvciBoYW5kbGluZywgaW5jbHVkaW5nIGNvZGUgZnJhZ21lbnRzCisJY29udGFpbmluZyB0aGUgZXJyb3IgZGVjbHMgdGhhdCB3ZXJlIGluIGJmZC1pbi5oLgorCVJlbW92ZSBERUZVTnMuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCitGcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKKworCSogbmxtY29kZS5oLCBsaWJsbm0uaCwgbmxtMzItYWxwaGEuYyBubG0zMi1pMzg2LmMgbmxtMzItc3BhcmMuYzoKKwlUaGUgc3BhcmMgKGFuZCBwb3NzaWJseSBvdGhlcj8pIE5MTSBmb3JtYXQgcmVxdWlyZXMgYSBkaWZmZXJlbnQKKwl3YXkgdG8gd3JpdGUgZXhwb3J0cywgc28gYWRkIGEgd3JpdGVfZXhwb3J0IGZpZWxkIHRvIHRoZSBiYWNrZW5kCisJZGF0YSAoYW5kIHNldCBpdCB0byBOVUxMIGZvciBldmVyeXRoaW5nIGJ1dCB0aGUgc3BhcmMpLgorCitGcmkgSmFuIDIxIDE0OjExOjE2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdW5vcy5jIChNWShyZWFkX2R5bmFtaWNfcmVsb2NzKSk6IENvbXBhcmUgaW5mby0+ZHlucmVsIHdpdGggTlVMTCwKKwlub3QgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMLiAgaW5mby0+ZHlucmVsIGlzIGEgUFRSLCBub3QKKwlhIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqLgorCitGcmkgSmFuIDIxIDA5OjI5OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYmZkLmM6IFJlbW92ZSBlcnJvciBzdHJpbmdzIGZvciBlcnJvcnMgcmVtb3ZlZCBiZWxvdy4KKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKSwgYmZkLWluLmggKGJmZF9lYyksCisJb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW5hbWUKKwliZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uIHRvIG5vbnJlcHJlc2VudGFibGVfc2VjdGlvbi4KKwlOb25lIG9mIHRoZSBvdGhlciBiZmQgZXJyb3IgbmFtZXMgc3RhcnQgd2l0aCAiYmZkX2Vycm9yIi4KKwlSZW1vdmUgZXJyb3JzIHN5bWJvbF9ub3RfZm91bmQgYW5kIG5vX3JlbG9jYXRpb25faW5mbywgd2hpY2ggc2VlbQorCXRvIGJlIHVudXNlZC4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisKK0ZyaSBKYW4gMjEgMDE6MTE6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplKTogQWRkZWQgc3VwcG9ydCBmb3IgRUxGLgorCisJKiBzeW1zLmMgKEJTRl9EWU5BTUlDKTogTmV3IHN5bWJvbCBmbGFnLgorCShiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogUHJpbnQgaXQuCisJKiBiZmQtaW4yLmg6IFJlYnVpbHQuCisJKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyByZWFkX2R5bmFtaWNfc3ltYm9scworCWFuZCByZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KKwkoc3RydWN0IGFvdXRkYXRhKTogTmV3IGR5bmFtaWNfaW5mbyBmaWVsZC4KKwkob2JqX2FvdXRfZHluYW1pY19pbmZvKTogTmV3IGFjY2Vzc29yIG1hY3JvLgorCSogc3Vub3MuYyAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyk6IE5ldyBzdHJ1Y3R1cmUuCisJKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvLCBNWShyZWFkX2R5bmFtaWNfc3ltYm9scyksCisJTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBOZXcgZnVuY3Rpb25zIHRvIHJlYWQgZHluYW1pYyBzeW1ib2xzCisJYW5kIHJlbG9jcy4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSWYgdGhlIG9iamVjdCBpcworCWR5bmFtaWNhbGx5IGxpbmtlZCwgc2V0IFNFQ19SRUxPQyBmb3IgYm90aCB0aGUgLnRleHQgYW5kIC5kYXRhCisJc2VjdGlvbnMuCisJKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCBzZXQgQlNGX0xPQ0FMIGZvciBhbgorCXVuZGVmaW5lZCBzeW1ib2wuCisJKHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG91dCBvZgorCXNsdXJwX3N5bWJvbF90YWJsZTsgc2V0IHRoZSBCU0ZfRFlOQU1JQyBmbGFnIGFwcHJvcHJpYXRlbHkuCisJKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogUmVhZCBkeW5hbWljIHN5bWJvbHMsIGlmIGFueS4KKwkoTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSk6IFJlYWQgZHluYW1pYyByZWxvY3MsIGlmIGFueS4KKwkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBJbmNsdWRlIGR5bmFtaWMgcmVsb2MgY291bnQgaW4KKwlyZXR1cm4gdmFsdWUuCisJKiBhb3V0ZjEuaCAoTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3Qgd3JpdGUKKwlvdXQgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcyBhZ2FpbnN0IHJlbG9jIHN5bWJvbHMsIHNpbmNlIHRoZXkKKwlhcmUgYWxyZWFkeSBpbiB0aGUgLnRleHQgc2VjdGlvbiBhbmQgd2Ugd291bGRuJ3Qga25vdyB3aGVyZSB0bworCXdyaXRlIHRoZW0gYW55aG93LgorCShzdW5vczRfYW91dF9iYWNrZW5kKTogSW5pdGlhbGl6ZSByZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQKKwlyZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KKwkqIGFvdXQtdGFyZ2V0LmggKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplCisJcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kIHJlYWRfZHluYW1pY19yZWxvY3MgZmllbGRzLgorCitUaHUgSmFuIDIwIDIwOjU3OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2FscGhhb3NmLmggKHVpbnQ2NGVfdHlwZSwgdWludDY0X3R5cGUsIGludDY0X3R5cGUpOiBEZWxldGUKKwl0eXBlZGVmcywgc2luY2UgSE9TVF82NF9CSVQgd2lsbCB0YWtlIGNhcmUgb2YgZGVmaW5pbmcgdGhlbSBpbgorCWJmZC5oLgorCitXZWQgSmFuIDE5IDE3OjI4OjU5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiBEb24ndCBkZWZpbmUgSE9TVF82NF9CSVQgaGVyZTsKKwl0aGF0J3MgZGVhbHQgd2l0aCBlbHNld2hlcmUuCisJKiBob3N0cy9hbHBoYW9zZi5oIChzcHJpbnRmX3ZtYSwgZnByaW50Zl92bWEpOiBOZXcgbWFjcm9zLgorCSh1aW50NjRfdHlwZUhJR0gsIHVpbnQ2NF90eXBlTE9XKTogQ29tbWVudCB3aXRoIEhPU1RfNjRfQklUIHNvCisJdGhleSBnZXQgY29waWVkIHRvIGJmZC5oLgorCisJKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGQgc29tZSBBbHBoYSByZWxvY2F0aW9uCisJdHlwZXMuICBSZW9yZ2FuaXplZCBzb21lIG9mIHRoZSBleGlzdGluZyBvbmVzLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IENvbnN0cnVjdCA2NC1iaXQgbmVnYXRpdmUgb25lCisJdmFsdWVzIGluIGNhc2Ugb2YgY29tcGlsYXRpb24gb24gYSAzMi1iaXQgbWFjaGluZS4gIEZpeCBwY3JlbAorCWZpZWxkcyBvZiBzb21lIHJlbG9jIHR5cGVzLgorCShhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgbW9yZSByZWxvY2F0aW9uIHR5cGVzLgorCisJKiBiZmQtaW4uaCAodWludDY0X3R5cGVISUdILCB1aW50NjRfdHlwZUxPVyk6IFN1cHBseSBkZWZhdWx0CisJZGVmaW5pdGlvbnMgd2hlbiBub3QgZGVmaW5lZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVpbnQ2NF90eXBlIGlzCisJYSBkZWZpbmVkIG1hY3JvIG9yIG5vdC4KKwkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogRGVmaW5lIG9ubHkgaWYgZnByaW50Zl92bWEgaXMgbm90CisJYWxyZWFkeSBkZWZpbmVkLgorCitXZWQgSmFuIDE5IDAwOjAyOjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHR5cGUgb2YgYQorCUJTRl9XQVJOSU5HIHN5bWJvbCB0byBOX1dBUk5JTkcuCisKK1R1ZSBKYW4gMTggMTY6NDM6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBJbmNyZW1lbnQgc3ltX2hhc2ggYXMgd2VsbCBhcyBwCisJZm9yIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgorCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVwZGF0ZSBzeW1faGFzaCB3aXRoIHRoZSB0YXJnZXQgb2YgYW4KKwlpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4gIElmIGFuIGluZGlyZWN0IHN5bWJvbCBpcyBkZWZpbmVkLAorCW91dHB1dCB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBhbmQgZG9uJ3Qgb3V0cHV0IHRoZSB0YXJnZXQgc3ltYm9sLgorCitUdWUgSmFuIDE4IDAzOjU0OjU5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IEdpdmUgd2FybmluZyBzeW1ib2xzCisJYW4gKHVudXNlZCkgbm9uemVybyBzZWN0aW9uIHZhbHVlLCBuZWVkZWQgZm9yIGNoZWNrIGJlbG93LgorCitNb24gSmFuIDE3IDE1OjEyOjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncywKKwlhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBUcmVhdCBOX1NFVFtBQkRUXSB8IE5fRVhUIGxpa2UKKwlOX1NFVFtBQkRUXS4KKworRnJpIEphbiAxNCAxNjo0NTo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogSWYgdGhlcmUgaXMgYSBTSFRfRFlOQU1JQyBzZWN0aW9uLCBzZXQKKwl0aGUgRFlOQU1JQyBmbGFnIGZvciB0aGUgQkZELgorCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHRyeSB0byB3cml0ZSBvdXQgYQorCUJGRCB3aXRoIHRoZSBEWU5BTUlDIGZsYWcgc2V0LCBzaW5jZSB3ZSBkb24ndCBnZW5lcmF0ZSB0aGUgcHJvZ3JhbQorCWhlYWRlciB0YWJsZSBjb3JyZWN0bHkuCisKK0ZyaSBKYW4gMTQgMDE6MDQ6MzYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgRnJlZSB4X3N5bXAgYXQgdGhlIGVuZAorCW9mIHRoZSBmdW5jdGlvbiB0byBhdm9pZCBzdG9yYWdlIGxlYWsuCisKK1RodSBKYW4gMTMgMjM6MDc6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQW4gaWZkIGNhbiBiZSAtMS4KKworVGh1IEphbiAxMyAxMjozMzoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IFByb3ZpZGUgYSBkZWZhdWx0IHN5bWJvbCBmb3IKKwlyZWxvY2F0aW9ucyB3aGljaCBkb24ndCBhY3R1YWxseSBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgorCisJKiBzb20uYyAoaHBwYV9zb21fcmVsb2MpOiBBZGQgbmV3ICJlcnJvciBtZXNzYWdlIiBhcmd1bWVudC4KKworV2VkIEphbiAxMiAxMzozNjo0MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwlFbmFibGUgZ2RiIHRvIHdyaXRlIHRvIGNvcmUgZmlsZXMgb24gbW9yZSBjb3JlIGZpbGUgcmVhZGVycy4KKwkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZW1vdmUgcmFuZ2UgY2hlY2sKKwlmb3Igc2VjdGlvbiBzaXplLCBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCisJd2l0aCBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cuCisJKiBhaXgzODYtY29yZS5jLCBocHBhYnNkLWNvcmUuYywgaHB1eC1jb3JlLmMsIGlyaXgtY29yZS5jLAorCW9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsIHRyYWQtY29yZS5jICgqX3NldF9zZWN0aW9uX2NvbnRlbnRzKToKKwlVc2UgYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgaW5zdGVhZCBvZiBiZmRfZmFsc2UuCisKK1dlZCBKYW4gMTIgMTU6MzE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsaW5rZXIuYzogQWRkZWQgaW5pdGlhbCBkb2N1bWVudGF0aW9uLgorCisJKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogRG9uJ3QgZXhwZWN0IHNwYWNlIGZvcgorCW91dHB1dCByZWxvY2F0aW9ucyBpZiB0aGVyZSBhcmVuJ3QgYW55IGlucHV0IHJlbG9jYXRpb25zLgorCitUdWUgSmFuIDExIDE0OjM3OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogU2V0IGFfZW50cnkgYmVmb3JlIGNvbXB1dGluZworCWZpbGUgb2Zmc2V0cy4KKworCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogQSBjb21tb24gc3ltYm9sIGlzIFNUVF9PQkpFQ1QsIG5vdAorCVNUVF9OT1RZUEUuCisKK1R1ZSBKYW4gMTEgMDk6MTA6NTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy5iZmQ6IFVzZSBFTEYsIG5vdCBDT0ZGIGZvciBtODgqLSotZGd1eCouCisJQ29tYmluZSBtODhrLSotKiBhbmQgbTg4MTEwLSotKiBjYXNlcyBpbnRvIG04OCotKi0qLgorCitUdWUgSmFuIDExIDAwOjA3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmZsaW5rLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGNvbXByZXNzIGFuZCBtZXJnZSBkZWJ1Z2dpbmcKKwlpbmZvcm1hdGlvbiwgYW5kIHRvIHdyaXRlIHNvbWUgb2Ygb3V0IGRpcmVjdGx5IHJhdGhlciB0aGFuIHNhdmluZworCWl0IGluIG1lbW9yeS4gIFNldmVyYWwgbmV3IGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcywgYW5kIG5ldworCWFyZ3VtZW50cyB0byBleGlzdGluZyBmdW5jdGlvbnMuCisJKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogQ29tcHV0ZQorCXN5bV9maWxlcG9zIGFzIHdlbGwuCisJKGVjb2ZmX2dldF9leHRyKTogVXNlIGlmZG1hcCBpbnN0ZWFkIG9mIGlmZGJhc2UuCisJKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNvbXB1dGUgc3ltX2ZpbGVwb3MgaGVyZS4KKwlPbmx5IG91dHB1dCBzeW1ib2xzIGlmIG91dHN5bWJvbHMgaXMgbm90IE5VTEwuCisJKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluIGVjb2ZmX2RlYnVnX2luZm8gYW5kCisJYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4gIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGVyZS4KKwkoZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluCisJYmZkX2Vjb2ZmX2RlYnVnIGZ1bmN0aW9ucy4KKwkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IFVzZSBpZmRtYXAgcmF0aGVyIHRoYW4gaWZkYmFzZS4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVhZCBleHRlcm5hbCBzeW1ib2xzCisJZmlyc3QsIHRvIHB1dCB0aGVtIGluIHRoZSBmaXJzdCBtZW1vcnkgYnVmZmVyLiAgQ2xlYXIgZmRyIGZpZWxkLgorCShtaXBzX2VsZl9nZXRfZXh0cik6IFVzZSBwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wuCisJKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gYmZkX2Vjb2ZmIGZ1bmN0aW9ucy4KKwlQcmVzZXJ2ZSAudGV4dCwgLmRhdGEgYW5kIC5ic3MgZXZlbiBpZiB0aGV5IGFyZSBlbXB0eS4gIFNhdmUKKwlwb2ludGVyIHRvIHVuc3dhcHBlZCBleHRlcm5hbCBzeW1ib2wgcmF0aGVyIHRoYW4gY29weWluZyBpdC4KKwlEb24ndCBmcmVlIHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLgorCSogbGliZWxmLmggKGVsZl9zeW1ib2xfdHlwZSk6IENoYW5nZSBtaXBzX2V4dHIgdG8gUFRSLgorCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19pbml0LCBiZmRfZWNvZmZfZGVidWdfZnJlZSk6IERlY2xhcmUuCisJKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcik6IFJlbmFtZSBkZWNsYXJhdGlvbiBmcm9tCisJYmZkX2Vjb2ZmX2RlYnVnX2xpbmtfb3RoZXIgYW5kIHVwZGF0ZS4KKwkoYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnKTogRGVjbGFyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKworTW9uIEphbiAxMCAyMDo0Njo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgIkAiIHdoaWNoIGZvbGxvd3MgYSBiYWNrc2xhc2guICBJbgorCXRoaXMgcG9zaXRpb24gaXQganVzdCBjYXVzZXMgZXJyb3JzLCBub3Qgc3VwcHJlc3NlcyBlY2hvZXMuCisKK01vbiBKYW4gMTAgMDk6MDY6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEZpeCBoYW5kbGluZyBvZiBMVCBhbmQgUlQKKwlmaWVsZCBzZWxlY3RvcnMuCisKK1N1biBKYW4gIDkgMDQ6MzI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2LW5ldGJzZC5tdCAoU0VMRUNUX1ZFQ1MpOiBJbmNsdWRlIGkzODZic2RfdmVjLgorCitGcmkgSmFuICA3IDEwOjI3OjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCAoYWRqdXN0X3pfbWFnaWMpOiBEb24ndCBtZXJnZSB0aGUgc3RhcnQgb2YgYnNzIHdpdGggdGhlCisJZW5kIG9mIGRhdGEgaWYgdGhleSBhcmUgbm90IGNvbnRpZ3VvdXMuCisKKwkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogQ29tbWVudCB0aGUgZmllbGRzJyBtZWFuaW5ncy4KKworRnJpIEphbiAgNyAxNTo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBzZXQgU0VDX1NIQVJFRF9MSUJSQVJZIGZsYWcKKwlmb3IgLnJlZ2luZm8gc2VjdGlvbiBoZXJlLgorCShlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KKworRnJpIEphbiAgNyAxMDoyOToyNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKyAgICAJKiBiZmQtaW4uaDogKGJmZF9ib29sZWFuKTogQWRkIHdvcmthcm91bmQgZm9yIHN5c3RlbXMgdGhhdCBhbHNvCisJZGVmaW5lIHRydWUgYW5kIGZhbHNlIGFzIGVudW1zLgorCShBTE1PU1RfU1REQyk6IEFkZCBhcyBhbHRlcm5hdGl2ZSB0byBfX1NURENfXy4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKwkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IENvbnZlcnQgYSBQVFIgdG8gRklMRSouCisKK1RodSBKYW4gIDYgMTQ6MjQ6NDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IENhdGNoIHRoZSBjYXNlIHdoZXJlCisJdGhlcmUgaXMgbm8gb3V0cHV0IHNlY3Rpb24uCisKK1RodSBKYW4gIDYgMTQ6Mzc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IElmIHdlIGNhbid0IHJlYWQgdGhlIGZpeGVkIGhlYWRlciwKKwljb3VudCBpdCBhcyBhIHdyb25nIGZvcm1hdCBlcnJvciwgbm90IGEgc3lzdGVtIGNhbGwgZXJyb3IsIHNpbmNlCisJdGhlIG9iamVjdCBmaWxlIG1pZ2h0IHNpbXBseSBiZSB0b28gc21hbGwuCisKKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEFkZGVkIG5sbTMyX2FscGhhX3ZlYyBpbnNpZGUgI2lmZGVmCisJQkZENjQuCisJKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmUgbmxtMzItYWxwaGEuby4KKwkoQkZENjRfQkFDS0VORFMpOiBBZGQgbmxtMzItYWxwaGEuby4gIEl0IGRlcGVuZHMgb24gNjQgYml0CisJc3VwcG9ydCwgZXZlbiB0aG91Z2ggaXQgaXMgZm9yIGFuIEFscGhhIGluIDMyIGJpdCBtb2RlLgorCSogY29uZmlndXJlLmluIChubG0zMl9hbHBoYV92ZWMpOiBTZXQgdGFyZ2V0NjQgdG8gdHJ1ZS4KKworCSogbmxtMzItZ2VuLmMsIG5sbTY0LWdlbi5jOiBSZW1vdmVkLiAgQWxsIG5sbSB0YXJnZXRzIGFyZQorCWRpZmZlcmVudCwgc28gdGhlcmUgaXMgbm8gcG9pbnQgdG8gcHJvdmlkaW5nIGEgZ2VuZXJpYyBvbmUuCisJKiBsaWJubG0uaDogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBubG1fYmFja2VuZChiZmQpIGJlaW5nIE5VTEwKKwlpbiB0aGUgYmFja2VuZCBhY2Nlc3NvciBtYWNyb3M7IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBwb3NzaWJsZS4KKwkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgbmxtMzJfYmlnX2dlbmVyaWNfdmVjLAorCW5sbTY0X2JpZ19nZW5lcmljX3ZlYywgbmxtNjRfbGl0dGxlX2dlbmVyaWNfdmVjLgorCSogY29uZmlndXJlLmluIChubG0zMl9iaWdfZ2VuZXJpY192ZWMsIG5sbTMyX2xpdHRsZV9nZW5lcmljX3ZlYywKKwlubG02NF9iaWdfZ2VuZXJpY192ZWMsIG5sbTY0X2xpdHRsZV9nZW5lcmljX3ZlYyk6IFJlbW92ZWQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMsIGFuZAorCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZWQgbmxtMzItZ2VuLm8uCisJKEJGRDY0X0JBQ0tFTkRTKTogUmVtb3ZlZCBubG02NC1nZW4uby4KKwkoQ0ZJTEVTKTogUmVtb3ZlZCBubG0zMi1nZW4uYyBhbmQgbmxtNjQtZ2VuLmMuCisKKwkqIGhwMzAwaHB1eC5jIChBUkNIX1NJWkUpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZyBhb3V0eC5oLgorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgY29uc3RydWN0b3IgYW5kCisJYml0c2l6ZSBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzIChhb3V0eC5oKS4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEFkZCBjb25zdHJ1Y3RvcgorCWFuZCBiaXRzaXplIGFyZ3VtZW50cyB0byBkZWNsYXJhdGlvbi4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCisJKiBlY29mZi5jOiBGaXJzdCBjdXQgYXQgbmV3IHN0eWxlIG9mIGxpbmtlciBiYWNrZW5kIGZvcgorCUVDT0ZGLS1hZGRlZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gIEFsc286CisJKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogU2V0IGZsYWdzIGZvciAucGRhdGEgYW5kIC54ZGF0YS4KKwkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyKTogTmV3IGZ1bmN0aW9uLgorCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQ2FsbCBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIuCisJKGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMpOiBOZXcgZnVuY3Rpb24uCisJKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogR2V0IG91dCBxdWlja2x5IGlmIGNvdW50IGlzIHplcm8uCisJQ2hlY2sgZXJyb3JzIGJldHRlci4KKwkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUHV0IC54ZGF0YSBzZWN0aW9uIGluIGRhdGEgc2VnbWVudC4KKwlDYWxsIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMuICBEb24ndCBvdXRwdXQgcmVsb2NzIG9yCisJZXh0ZXJuYWwgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIE5VTEwuCisJKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogQ29tcGxldGVseSByZXdyaXR0ZW4uCisJKiBsaWJlY29mZi5oOiBJbmNsdWRlIGJmZGxpbmsuaC4KKwkoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgorCShlY29mZl9kYXRhX3R5cGUpOiBBZGQgc3ltX2hhc2hlcyBhbmQgc3ltbmR4X3RvX3NlY3Rpb24gZmllbGRzLgorCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgorCShzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgorCShlY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KKwkoZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKwkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogQ2FsbCBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsLgorCSogYmZkLWluLmggKGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWx0LgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSk6IE1hcmsgQlJBRERSIGFzCisJcGFydGlhbF9pbnBsYWNlLCBhbmQgc2V0IHRoZSBzcmNfbWFzayB0byAweDFmZmZmZi4KKwkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZAorCXZhcmlhYmxlIGdwX3dhcm5lZC4KKwkoYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIHJlbG9jYXRlX3NlY3Rpb24gZmllbGQuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9yZWZoaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgorCisJKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogQ29ycmVjdGVkIHNpZ25lZCBvdmVyZmxvdworCWNoZWNraW5nIHdoZW4gdGhlcmUgaXMgYW4gYWRkZW5kLgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBhYm9ydCB3aGVuIHRyeWluZyB0byBsaW5rCisJYSBub24gYS5vdXQgZmlsZSwganVzdCBwYXNzIGl0IHRvIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgorCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIGRvaW5nIGEgZmluYWwgUEMgcmVsYXRpdmUgbGluaworCWFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgc3VidHJhY3QgdGhlIFZNQSBvZiB0aGUgaW5wdXQgc2VjdGlvbi4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCisKKwkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBSZW5hbWVkIGZyb20KKwlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlciBhbmQgbWFkZSBzdGF0aWMuCisJKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogRG9uJ3Qgc3dpdGNoIG9uIGxpbmtfb3JkZXIgdHlwZSwganVzdAorCWNhbGwgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIuCisJKF9iZmRfZGVmYXVsdF9saW5rX29yZGVyKTogSGFuZGxlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyIHR5cGUuCisJKiBnZW5saW5rLmg6IFJlbW92ZWQgZGVjbGFyYXRpb24gb2YKKwlfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlci4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IERvbid0IHN3aXRjaCBvbiBsaW5rX29yZGVyCisJdHlwZSwganVzdCBjYWxsIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgorCitUdWUgSmFuICA0IDIxOjIzOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBCYXNlIHRoZSBuYW1lIG9mCisJdGhlIGNyZWF0ZWQgY29tbW9uIHNlY3Rpb24gb24gdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbAorCWNhbWUgZnJvbS4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiAoY2FzZSBCSUcpOiBBIGNvbW1vbiBzeW1ib2wKKwltdXN0IGhhdmUgYSBzZWN0aW9uLCBzbyBkb24ndCBib3RoZXIgdG8gY3JlYXRlIG9uZS4KKworTW9uIEphbiAgMyAxNTozMjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFvdXQtdGFyZ2V0LmggKE1ZKHZlYykpOiBBZGQgRFlOQU1JQyB0byBtYXNrIG9mIG9iamVjdCBmbGFncy4KKwkqIGFvdXRmMS5oIChOQU1FKGFvdXQsc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cykpOgorCUlmIHRoZSBEWU5BTUlDIGZsYWcgaXMgc2V0LCBzZXQgaXQgaW4gdGhlIGV4ZWMgaGVhZGVyLgorCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBJZiB0aGUgb2JqZWN0IGlzCisJZHluYW1pY2FsbHkgbGlua2VkLCBzZXQgdGhlIERZTkFNSUMgZmxhZyBpbiB0aGUgQkZELgorCSogbGliYW91dC5oIChOX1NFVF9EWU5BTUlDKTogTmV3IG1hY3JvLgorCShOX0RZTkFNSUMpOiBBZGQgbWlzc2luZyAwIGluIG1hc2suCisKK01vbiBKYW4gIDMgMTE6NDE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IERvbid0IG91dHB1dCBzZWN0aW9uIHN5bWJvbHMgYXMKKwlleHRlcm5hbCBzeW1ib2xzLgorCisJKiBiZmQtaW4uaCwgaGFzaC5jOiBDaGFuZ2UgYmZkX2hhc2hfYWxsb2NhdGUgYXJndW1lbnQgZnJvbSBzaXplX3QKKwl0byB1bnNpZ25lZCBpbnQsIGJlY2F1c2Ugc2l6ZV90IG1heSBub3QgYmUgZGVmaW5lZCBpbiBiZmQuaC4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKworCSogYmZkLWluLmggKGJmZF9nZXR7YixsfVtfc2lnbmVkX117MTYsMzIsNjR9KTogRGVjbGFyZSBhcmd1bWVudCB0bworCWJlIGEgY29uc3QgcG9pbnRlci4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKwkqIGxpYmJmZC5jIChiZmRfZ2V0e2IsbH1bX3NpZ25lZF9dezE2LDMyLDY0fSk6IERlY2xhcmUgYXJndW1lbnQgdG8KKwliZSBhIGNvbnN0IHBvaW50ZXIuCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBDaGFuZ2Ugc3dhcCBmdW5jdGlvbiBwb2ludGVycworCWFjY29yZGluZ2x5LgorCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogQ2hhbmdlIHN3YXAgYWNjb3JkaW5nbHkuCisJKiBhaXgzODYtY29yZS5jOiBDaGFuZ2UgTk9fR0VUIGFuZCBOT19HRVRTIGFjY29yZGluZ2x5LgorCSogaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywgb3NmLWNvcmUuYywKKwlwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYzogQ2hhbmdlIE5PX0dFVCBhbmQgTk9fU0lHTkVEX0dFVAorCWFjY29yZGluZ2x5LgorCisJKiBsaWJiZmQtaW4uaCAoc3RydWN0IGFydGRhdGEpOiBBZGRlZCB0ZGF0YSBmaWVsZC4KKwkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBEZWNsYXJlLgorCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IERlY2xhcmUuCisJKF9iZmRfc25hcmZfYXJfaGRyKTogUmVuYW1lZCBmcm9tIHNuYXJmX2FyX2hkci4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCSogYXJjaGl2ZS5jOiBDbGVhbmVkIHVwIHNvbWUgbW9yZS4KKwkoX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZQorCXBvaW50ZXIgZWxlbWVudHMgb2YgYXJ0ZGF0YS4KKwkoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUpOiBSZW5hbWVkIGZyb20gYWRkX2JmZF90b19jYWNoZS4KKwkoX2JmZF9zbmFyZl9hcl9oZHIpOiBSZW5hbWVkIGZyb20gc25hcmZfYXJfaGRyLgorCShfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IFJlbmFtZWQgZnJvbSBnZXRfZWx0X2F0X2ZpbGVwb3MuCisJKGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLAorCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IE1hZGUgc3RhdGljLgorCSogZWNvZmYuYzogU29tZSBjb21tZW50IGNoYW5nZXMuCisJKGVjb2ZmX3NsdXJwX2FybWFwKTogSGFuZGxlIHJlbmFtZSBvZiBzbmFyZl9hcl9oZHIuICBTZXQKKwlhcmRhdGEtPnRkYXRhIHRvIHJhd19hcm1hcC4KKwkoZWNvZmZfYXJjaGl2ZV9wKTogSW5pdGlhbGl6ZSBwb2ludGVyIGVsZW1lbnRzIG9mIGFydGRhdGEuCisJKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyk6IEhhbmRsZSByZW5hbWUgb2YKKwlhZGRfYmZkX3RvX2NhY2hlLgorCisJKiBoYXNoLmM6IEFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KKworTW9uIEphbiAgMyAxMTowOToyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYW91dC10YXJnZXQuaCwgbmV0YnNkMzg2LmM6IFJlcGxhY2UgTk9fU1dBUF9NQUdJQyB3aXRoIFNXQVBfTUFHSUMsCisJYW5kIGRvIHRoZSBzd2FwcGluZyBoZXJlIHJhdGhlciB0aGFuIGNhbGxpbmcgbnRvaGwgZnJvbSB0aGUgTl8qCisJbWFjcm9zLiAgVGhpcyBjbGVhbnMgdXAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHNpemUgb2YgYSBob3N0IGxvbmcsCisJdGhlIGV4aXN0ZW5jZSB0byBudG9obCwgZXRjLgorCitTYXQgSmFuICAxIDEzOjUwOjA1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLiBJdCBjdXJyZW50bHkgdXNlcworCWkzODYtYW91dC4KKworU2F0IEphbiAgMSAxMDoxODo1NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSk6IEZpeCB2YWx1ZS4KKwkqIGkzODZtYWNoMy5jIChTRUdNRU5UX1NJWkUpOiBGaXggdmFsdWUuCisKK0ZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTE5MworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZy05Njk3IGIvYmZkL0NoYW5nZUxvZy05Njk3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjJjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvQ2hhbmdlTG9nLTk2OTcKQEAgLTAsMCArMSw2NzExIEBACitUdWUgRGVjIDMwIDEyOjQ1OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QKKwlhbGxvY2F0ZSBzcGFjZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGlzCisJZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZS4KKwkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkgYSBQQworCXJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKKwlmaWxlLgorCitNb24gRGVjIDI5IDE4OjAyOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gSm9uYXRoYW4gU3RvbmUgPGpvbmF0aGFuQERTRy5TdGFuZm9yZC5FRFU+OgorCSogY29uZmlnLmJmZCAobWlwcy1kZWMtbmV0YnNkKik6IEFkZCBFQ09GRiB2ZWN0b3JzIHRvCisJdGFyZ19zZWx2ZWNzLgorCShtaXBzKmVsLSotbmV0YnNkKik6IExpa2UgbWlwcy1kZWMtbmV0YnNkKi4KKwkobWlwcyotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KKworTW9uIERlYyAyOSAxNzoxMzoyOCAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UKKwlmcm9tICJ1bmRlZmluZWQgdmVyc2lvbiBuYW1lIiB0byAidW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wKKwluYW1lIi4KKworTW9uIERlYyAyOSAxMTo0MToxNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8gZnJvbSBwcmV2aW91cworCWRlbHRhLgorCitUdWUgRGVjIDIzIDE3OjAxOjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliYmZkLWluLmggKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IC5yZWxvYyBzZWN0aW9uIHRvIGJlCisJc2hhcmVkLiAgU2V0IHN0YWIqIHNlY3Rpb25zIHRvIGJlIHNoYXJlZCBhbmQgcmVhZC4gIFNldCAucnNyYworCXNlY3Rpb24gdG8gYmUgcmVhZCBhbmQgc2hhcmVkLgorCitNb24gRGVjIDIyIDEzOjIwOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBkd2FyZjIubG8uCisJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZHdhcmYyLmMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogY29mZi1hcm0uYzogRG9uJ3QgaW5jbHVkZSBvYnN0YWNrLmguCisKK01vbiBEZWMgMjIgMTM6MDQ6MzMgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+CisKKyAgICAgICAgKiBjb25maWcuYmZkIChpWzM0NTZdODYqLWdvMzItcnRlbXMqKTogRml4IHRvIGJlIHRoZSBzYW1lIGFzCisJaVszNDU2XTg2LWdvMzIuCisKK1RodSBEZWMgMTggMTY6MDE6MjUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIGdldCBAU0hFTExAIHN1YnN0aXR1dGVkLgorCitXZWQgRGVjIDE3IDA5OjQ1OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBPbmx5IGxvb2sgYXQgc2VjdGlvbgorCW93bmVyIGlmIHRoZXJlIGlzIG9uZS4KKworCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGYWlsIGlmIHRoZXJlIGlzIG5vdAorCWVub3VnaCByb29tIGZvciB0aGUgcHJvZ3JhbSBoZWFkZXJzLgorCitUdWUgRGVjIDE2IDA4OjA5OjU2IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBDYWxsCisJX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgZmlyc3QuCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBTYW1lLgorCSogZHdhcmYyLmM6IE5ldyBmaWxlOyBpbXBsZW1lbnQgX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUuCisKK01vbiBEZWMgMTUgMTY6MDg6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogYXJjaHVyZXMuYzogQWRkIGJmZF9tYWNoX20zMnIuCisKK01vbiBEZWMgMTUgMTY6MTE6MjIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUpOiBEZWZpbmUgaWYgSTk2MCBub3QgZGVmaW5lZC4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVc2UgQUxJR05fU0VDVElPTlNfSU5fRklMRQorCXRvIGRlY2lkZSB3aGVuIHRvIGFsaWduIHRoZSBmaWxlIHNlY3Rpb25zIGZvciBwYWdpbmcuCisJKiBjb2ZmY29kZS5oIChBTElHTl9TRUNUSU9OU19JTl9GSUxFKTogVW5kZWZpbmUgZm9yIFRJQzgwQ09GRi4KKworTW9uIERlYyAxNSAxNTowMToxNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX29iamVjdF9wKTogTmV3IEZ1bmN0aW9uLgorCShtMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogIE5ldyBGdW5jdGlvbi4KKwkobTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiAgTmV3IEZ1bmN0aW9uLgorCShtMzJyX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgorCShtMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KKwkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCisJKGVsZl9iYWNrZW5kX29iamVjdF9wKTogUG9pbnQgdG8gbTMycl9vYmplY3RfcC4KKwkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFBvaW50IHRvCisJbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4KKwkoYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bworCW0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YS4KKwkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KKwltMzJyX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLgorCShiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogUG9pbnQgdG8KKwltMzJyX2VsZl9zZXRfcHJpdmF0ZV9iZmRfZGF0YS4KKwkoYmZkX2VsZjMyX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUG9pbnQgdG8KKwltMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhLgorCisKKwkqIGJmZC1pbjIuaCAoYmZkX21hY2hfbTMycik6IEFkZCBpZGVudGlmaWVyIGZvciBNMzJSIGFyY2hpdGVjdHVyZQorCW1hY2hpbmVzLgorCitGcmkgRGVjIDEyIDExOjMwOjI4IDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IE9ubHkgYnVpbGQgbGliYmZkIHNoYXJlZCBpZiAtLWVuYWJsZS1zaGFyZWQncyB2YWx1ZQorCXdhcyBgeWVzJywgb3Igd2FzIHNldCB0byBgKmJmZConLgorCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCisJKiBOT1RFOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBmaXhlZCBpbiBsaWJ0b29sL2xpYnRvb2wubTQsIHRoZQorCW9yaWdpbmFsIHNvdXJjZSBvZiB0aGlzIGJpdCBvZiBjb2RlLiAgSXQncyBub3QgY2xlYXIgd2hhdCB0aGUgYmVzdCBmaXgKKwl3b3VsZCBiZSwgdGhvdWdoLgorCitUaHUgRGVjIDExIDE3OjQ4OjExIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogQWx3YXlzIGluaXQgdWRhdGEucCBzbworCXRoYXQgdGhlIGdlbmVyaWMgcmVsYXhhdGlvbiBjb2RlIGNhbiBmdW5jdGlvbiB3aGVuIGlucHV0IGFuZCBvdXRwdXQKKwlmaWxlIGZvcm1hdHMgYXJlIG1pc21hdGNoZWQuCisKK1RodSBEZWMgMTEgMDE6MDI6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXNoLmMgKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCisKKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRm9yIGEgbG9hZGFibGUKKwlzZWN0aW9uLCBtYWtlIHN1cmUgdGhhdCB0aGUgbG9hZCBhZGRyZXNzIGlzIGNvcnJlY3QgcmVsYXRpdmUgdG8KKwl0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IHBsdXMgdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgc28KKwlmYXIuCisKKwkqIGNvZmZjb2RlLmggKF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IE1ha2Ugc3RhdGljLgorCShfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBMaWtld2lzZS4KKworV2VkIERlYyAxMCAyMzozNzoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIGEgcmVsb2NhdGVhYmxlIGxpbmsgaW4KKwl3aGljaCBhIHJlbG9jYXRpb24gcmVmZXJzIHRvIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLgorCitXZWQgRGVjIDEwIDExOjE1OjU1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGJmZF9hcm1fY29mZl9maW5hbF9saW5rKTogRnVuY3Rpb24gZGVsZXRlZC4KKwkoY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0KTogTmV3IGZ1bmN0aW9uLgorCShjb2ZmX2FybV9saW5rX291dHB1dF9oYXNfYmVndW4pOiBOZXcgZnVuY3Rpb24uCisKKwkqIGxpYmNvZmYuaCAoc3RydWN0IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGRzOgorCV9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gYW5kCisJX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdC4gIEFkZCBuZXcgbWFjcm9zOgorCWJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bigpIGFuZAorCWJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCgpLgorCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluc2VydCBjYWxscyB0bworCWJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bigpIGFuZAorCWJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCgpLgorCisJKiBjb2ZmY29kZS5oOiBBZGQgdHdvIG5ldyBmaWVsZHMgdG8gYmZkX2NvZmZfYmFja2VuZF9kYXRhCisJc3RydWN0dXJlOiBfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIGFuZAorCV9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQuICBBZGQgZGVmYXVsdCBpbml0aWFsaXNlcnMgZm9yCisJdGhlc2UgZmllbGRzLiAgQWRkIG92ZXJyaWRhYmxlIGFsaWFzZXMgZm9yIHRoZSBjb2ZmIHN3YXAgZnVuY3Rpb25zCisJaW4gdGhlIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUuCisKKwkqIGVsZjMyLXY4NTAuYzogVXBkYXRlIHdpdGggcGF0Y2hlcyBmcm9tIHRoZSBicmFuY2ggdG8gZml4CisJSEkxNl9TL0xPMTYgcmVsb2MgcGFpcnMuCisKK1dlZCBEZWMgMTAgMTQ6MDY6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWQzMHYuYyAoZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydAorCVJFTEEgcmVsb2NhdGlvbnMuCisJKFVTRV9SRUwpOiBEb24ndCBkZWZpbmUgYW55IG1vcmUsIHN3aXRjaCB0byB1c2luZyBSRUxBCisJcmVsb2NhdGlvbnMuCisJKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGFzIGQzMHZfaW5mb190b19ob3d0b19yZWxhLgorCitUdWUgRGVjICA5IDExOjM3OjUzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbWlwcyopOiBEZWZpbmUuCisJKGJmZF9kZWZhdWx0X3NjYW4pOiBGb3IgMzAwMCBhbmQgNDAwMCByZXBsYWNlIG1hZ2ljIGNvbnN0YW50IHdpdGgKKyAJbWFjcm8uCisKKwkqIGNwdS1taXBzLmMgKE4pOiBEZWZpbmUuCisJKGJmZF9taXBzX2FyY2gsIGFyY2hfaW5mb19zdHJ1Y3QpOiBSZS13cml0ZSB1c2luZyBtYWNybyBOLCByZXBsYWNlCisgCW51bWJlcnMgd2l0aCBiZmRfbWFjaF9taXBzKiBtYWNyb3MuCisKK0ZyaSBEZWMgIDUgMTE6MTM6NDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24sCisJdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCByZWxvYyBhZGRlbmQgaGFuZGxpbmcuCisJKHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiwgdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcsCisJdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rLCB2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vaywKKwl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fc2hkciwgdjg1MF9lbGZfZmFrZV9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbnMKKwl0byBjcmVhdGUgYW5kIGhhbmRsZSBzcGVjaWFsIGNvbW1vbiBzZWN0aW9ucy4KKwkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBISTE2IGFuZCBISTE2X1MgcmVsb2NhdGlvbnMKKwl3aGljaCBoYXZlIGRhdGEgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMuCisKK1R1ZSBEZWMgIDIgMTA6MjY6MTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBSZXZlcnQgYmFjayB0byAnXycKKwkoVVNFUl9MQUJFTF9QUkVGSVgpOiBSZXZlcnQgYmFjayB0byAnXycKKworCSogY29uZmlnLmJmZCAodGFyZ19jcHUpOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgorCitNb24gRGVjICAxIDIwOjI0OjE4IDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogY29mZi1zaC5jIChzaF9jb2ZmX2hvd3Rvcyk6IEFkZCBSX1NIX1NXSVRDSDggZW50cnkuCisJKGdldF9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgUl9TSF9TV0lUQ0g4LgorCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KKworV2VkIE5vdiAyNiAxNDoxMzozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IENoYW5nZWQgdG8gbWF0Y2ggZGVmaW5pdGlvbiBpbgorCWdjYy9jb25maWcvYXJtL3NlbWkuaAorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEFkZCBBUk0gYW5kIFRodW1iIHN5bWJvbAorCWNsYXNzZXMuCisKK1N1biBOb3YgMjMgMTY6MDI6NTggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBmcmVlYnNkLmggKFNXQVBfTUFHSUMpOiBSZWFkIG1hZ2ljIG51bWJlciBsaXR0bGUgYW5kIG5vdCBiaWcKKyAJZW5kaWFuLgorCitXZWQgTm92IDI2IDA5OjMwOjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IE9ubHkgc2V0IHByaXZhdGUgZmxhZ3MgZm9yIG5vbgorCVBFIEFSTSBwb3J0cy4KKworVHVlIE5vdiAyNSAxNTozMzoyMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQWxzbyBpZ25vcmUgTkVWRVJfTE9BRAorCXNlY3Rpb25zLgorCitUdWUgTm92IDI1IDEwOjU1OjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG8gbm90CisJY29tcGxhaW4gaWYgaW5vdXQgYW5kIG91dHB1dCBmb3JtYXRzIGRpZmZlci4KKworVHVlIE5vdiAyNSAxMToyNjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSB0ZWtoZXgubG8uCisJKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IFJlbW92ZSB0ZWtoZXguYy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBzcmMvTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBjdXJyZW50CisJYXV0b21ha2UgYW5kIGF1dG9jb25mLgorCisJKiBjb2ZmLWFybS5jIChhcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zKTogRml4IHR5cG8KKwkoQ09GRl9XSVRIX1BSIHRvIENPRkZfV0lUSF9QRSkuCisKK01vbiBOb3YgMjQgMTU6NDc6NDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYzogTWFrZSB2YXJpYWJsZXMgYW5kIHNvbWUgZnVuY3Rpb25zIHN0YXRpYywgc28gdGhhdAorCXRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgaW4gbXVsdGlwbGUgb2JqZWN0IGZpbGVzLgorCShjb2ZmX2FybV9iZmRfZmluYWxfbGluayk6IEZpeCBtaW5vciBidWcuCisKK1NhdCBOb3YgMjIgMTU6MTY6MDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIFBJQyBhbmQgQVBDUy1GTE9BVCB0eXBlIGJpbmFyaWVzLgorCisJKiBjb2ZmY29kZS5oOiBBZGQgc3VwcG9ydCBmb3IgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMuCisKK1NhdCBOb3YgMjIgMTY6MDY6NTYgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF93cml0ZV9lbWgpOiBVc2UgYWxsb2NhIGluc3RlYWQgb2Ygc3RyZHVwLgorCitTYXQgTm92IDIyIDEyOjI5OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBXaGVuIG92ZXJyaWRpbmcgYSBkZWZpbmVkCisJc3ltYm9sLCBzZXQgaXQgdG8gdW5kZWZpbmVkLCBub3QgbmV3LgorCisJKiBlbGYzMi1zaC5jIChzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3Qga2lsbCBMQUJFTAorCXJlbG9jcy4KKworRnJpIE5vdiAyMSAxNDoxNDoyMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X3NlY3Rpb24pOiBGb3JjZSBzaWduIGV4dGVudGlvbiBvZiBVU0VTIHJfb2Zmc2V0LgorCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBraWxsIExBQkVMIHJlbG9jcy4KKworTW9uIE5vdiAxNyAxNTowODozOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IEZpeCB0eXBvLgorCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCisKK1NhdCBOb3YgMTUgMTU6MzY6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBDYXN0IHNlY29uZCBhcmcgb2YKKwliZmRfaF9nZXRfKiBjYWxscyB0byAiYmZkX2J5dGUgKiIuCisKK1R1ZSBOb3YgMTEgMTA6Mzc6MjMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZAorCSJtb3ZtX3N0YWNrX3NpemUiLgorCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5jbHVkZSBzdGFjayBzcGFjZSBmb3IgcmVnaXN0ZXIgc2F2ZXMKKwlpbiB0aGUgaW1tOCBmaWVsZCBvZiBhICJjYWxsIiBpbnN0cnVjdGlvbi4KKwkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQorCXRoZSBtb3ZtIGluc3RydWN0aW9uLiAgRml4IHR5cG8uCisJKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG1vdm1fc3RhY2tfc2l6ZS4KKworTW9uIE5vdiAxMCAxNDozMjo0MCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERvbid0IGNyYXNoIGlmCisJYSB2ZXJzaW9uIGRlcGVuZGVuY3kgY291bGQgbm90IGJlIGZvdW5kLgorCitUdWUgTm92ICA0IDEyOjA1OjU2IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBjb25maWd1cmUuY29tOiBHZXQgdmVyc2lvbiBpbmZvIGZyb20gY29uZmlndXJlLmluCisKK0ZyaSBPY3QgMjQgMTE6MTU6NTggMTk5NyAgSmFrdWIgSmVsaW5layAgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+CisKKwkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOgorCU5ldyBmdW5jdGlvbi4gQXZvaWQgbWl4aW5nIFVTMSBhbmQgSEFMIFIxIGNvZGUuCisJU2V0IHJlc3VsdGluZyBtZW1vcnkgb3JkZXJpbmcgdG8gdGhlIHN0cm9uZ2VzdCBvbmUgdXNlZC4KKwkoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBTZXQgYmZkX21hY2ggY29ycmVjdGx5LgorCitUaHUgT2N0IDIzIDE0OjA5OjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogQWRkIFVBNjQgJiBVQTE2LgorCShzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MpOiBIYW5kbGUgdGhlbS4KKwkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLiAgQmVmb3JlIGVtaXR0aW5nIGEgZHluIHJlbG9jLAorCWNoZWNrIGFsaWdubWVudCBhbmQgdHJhbnNtdXRlIFJfU1BBUkNfeDwtPlJfU1BBUkNfVUF4LgorCitUaHUgT2N0IDIzIDAwOjUzOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWxpbnV4Kik6IFVzZSB0cmFkLWNvcmUgYW5kIC4uLgorCSogaG9zdHMvc3BhcmNsaW51eC5oOiBOZXcgZmlsZS4KKworVGh1IE9jdCAyMyAwMDoyNToyOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZCAoc3BhcmM2NC0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgcGx0X2FsaWdubWVudCBtZW1iZXIuCisJKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IFNldCAuZ290IGFsaWdubWVudCBiYXNlZAorCW9uIGFyY2hfc2l6ZS4KKwkoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZSBmb3IgLnJlbCogc2VjdGlvbnMuCisJU2V0IC5wbHQgYWxpZ25tZW50IGZyb20gbmV3IHBsdF9hbGlnbm1lbnQuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IHZlcnNpb24gc2VjdGlvbgorCWFsaWdubWVudCB0byBMT0dfRklMRV9BTElHTi4KKwkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50KTogUHJvdmlkZSBkZWZhdWx0LgorCShlbGZYWF9iZWQpOiBJbml0IHBsdF9hbGlnbm1lbnQuCisKKwkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcywKKwlzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucywKKwlzcGFyYzY0X2VsZl9hZGp1c3RfZHluaW5keCwgc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAorCXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucy4KKwkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBGaXggYSBmZXcgbmFtZSBzdHJpbmdzLgorCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IE5ldyBkZWZpbml0aW9uLgorCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHNoYXJlZCBsaWJyYXJpZXMuCisKKwkqIGVsZjY0LXNwYXJjLmMgKHN0cnVjdCBwbHRfdGVtcGxhdGUsIHBsdF8qX2hlYWRlciwgcGx0XypfZW50cnksCisJc3BhcmM2NF9lbGZfYnVpbGRfcGx0X2VudHJ5LCBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOgorCVBMVCBkZWZpbml0aW9ucyBzcGFyYzY0LWxpbnV4IG9yaWdpbmFsbHkgY2hvb3NlLiAgVGhlc2Ugd2lsbCBnbworCWF3YXkgc29vbiBpbiBmYXZvdXIgb2YgdGhlIG9mZmljaWFsIGFiaSBkZWZpbml0aW9ucy4KKworV2VkIE9jdCAyMiAxNjowODo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc2guYyAoY29mZl9zbWFsbF9vYmplY3RfcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfc21hbGxfbmV3X3NlY3Rpb25faG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUpOiBOZXcgc3RhdGljIGNvbnN0IHN0cnVjdHVyZS4KKwkoY29mZl9zbWFsbF9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KKwkoY29mZl9zbWFsbF9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERlZmluZS4KKwkoY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KKwkoY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBEZWZpbmUuCisJKHNoY29mZl9zbWFsbF92ZWMpOiBOZXcgc3RhdGljIHN0cnVjdHVyZS4KKwkoc2hsY29mZl9zbWFsbF92ZWMpOiBOZXcgc3RhdGljIHN0cnVjdHVyZS4KKwkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc2hjb2ZmX3NtYWxsX3ZlYyBhbmQKKwlzaGxjb2ZmX3NtYWxsX3ZlYy4KKwkqIGNvbmZpZy5iZmQgKHNoLSotZWxmKik6IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZAorCXNobGNvZmZfc21hbGxfdmVjIHRvIHRhcmdfc2VsdmVjcy4KKwkoc2gtKi0qKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmUuaW46IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZCBzaGxjb2ZmX3NtYWxsX3ZlYyBjYXNlcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworTW9uIE9jdCAyMCAxNTowMToyNyAxOTk3ICBLbGF1cyBLImFtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogZXZheC1lZ3NkLmM6IFdlYWsgc3ltYm9scyBhcmUgZ2xvYmFsLgorCisJKiBldmF4LWVtaC5jOiBVc2UgcHJvcGVyIGNhc3RzLgorCisJKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBSZW1vdmUgdW5uZWVkZWQgdW5hbWUuCisKKwkqIGV2YXgtZWdzZC5jOiBTZWN0aW9uIG5hbWVzIGFuZCBzeW1ib2xzIGhhdmUgZGlmZmVyZW50CisJbGVuZ3RoIHJlc3RyaWN0aW9ucy4gQWRkIGxlbmd0aCBwYXJhbWV0ZXIgdG8KKwlfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sLgorCSogZXZheC1ldGlyLmM6IExpa2V3aXNlLgorCSogZXZheC1taXNjLmMgKF9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wpOiBBZGQgbGVuZ3RoCisJcGFyYW1ldGVyLgorCSogZXZheC5oIChFT0JKX1NfQ19TRUNTSVopOiBEZWZpbmUuCisKKwkqIGV2YXgtYWxwaGEuYzogUmVtb3ZlIGR1cGxpY2F0ZSB0ZXN0LgorCisJKiBldmF4LWVtaC5jOiBTWVMkIGZ1bmN0aW9ucyBhcmUgdXBwZXItY2FzZS4KKworCSogZXZheC1lZ3NkLmM6IENyZWF0ZSBzZXBhcmF0ZSBzZWN0aW9ucyBmb3IgY29tbW9uIHN5bWJvbHMuCisJKiBldmF4LWV0aXIuYzogRG9uJ3Qgb3V0cHV0IGNvbW1vbiBzZWN0aW9uLgorCSogZXZheC5oOiBCdW1wIHVwIHNlY3Rpb24gY291bnQuCisKKwkqIGNvbmZpZ3VyZS5jb206IFVzZSA2NGJpdCBpbnRlZ2VycyB3aXRoIERFQyBDLgorCisJKiBldmF4LWVnc2QuYzogTWFrZSBzZWN0aW9uIGZsYWdzIGRlYyBjIGNvbXBhdGlibGUuCisKK01vbiBPY3QgMjAgMDk6Mzg6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb20uYyAobm9ybWFsaXplKTogRGVsZXRlIGZ1bmN0aW9uLgorCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IE5ldyBwYXJhbWV0ZXIgZWxlbmd0aC4gIEFsbCBjYWxsZXJzCisJY2hhbmdlZC4gIFVzZSBwYXNzZWQgaW4gZWxlbmd0aCB0byBkZXRlcm1pbmUgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQKKwluYW1lIHRhYmxlIGluc3RlYWQgb2YgY29tcHV0aW5nIGl0IGFnYWluLgorCitTdW4gT2N0IDE5IDIzOjM2OjIxIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFVzZSB8PSBub3QgPSB0byBzZXQKKwlJTUFHRV9TQ05fTUVNX1JFQUQgZm9yIGFuIHVucmVjb2duaXplZCBzZWN0aW9uLgorCitTdW4gT2N0IDE5IDIxOjA0OjU2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogQWNjb3VudCBmb3IgdHJhaWxpbmcKKwknLycgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuCisKK0ZyaSBPY3QgMTcgMDA6MDQ6MTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBGb3IgZXhwbGljaXRseSB2ZXJzaW9uZWQKKwlzeW1ib2xzLCBjaGVjayBnbG9iYWxzIGxpc3QgYmVmb3JlIG1hdGNoaW5nIG9uIGxvY2Fscy4KKworVGh1IE9jdCAxNiAwODoxNzowNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCxwZV9wcmludF9pZGF0YSk6IEZpeCBtYW5nbGVkCisJcGF0Y2guCisKK1dlZCBPY3QgMTUgMTM6NDU6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKHBlX21rb2JqZWN0X2hvb2spOiBTZXQgRExMIGZsYWcuCisJKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IERMTCBmbGFnLgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogU2V0IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKKwlmb3IgLnN0YWIqIHNlY3Rpb25zLiAgUmVwbGFjZSBzdHJsZW4gb2YgY29uc3RhbnQgc3RyaW5ncyB3aXRoCisJbnVtYmVyLgorCitUdWUgT2N0IDE0IDE1OjQyOjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX21lcmdlX2luZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIHRvCisJbWVyZ2UgZ290IGFuZCByZWxvYyBlbnRyaWVzIGZyb20gaW5kIHN5bXMgdG8gdGhlaXIgdGFyZ2V0LgorCShlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IENhbGwgaXQuCisJKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IE9wZXJhdGUgb24gdGhlIHRhcmdldCBvZiBpbmRpcmVjdCBzeW1ib2xzLgorCShlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyk6IExpa2V3aXNlLgorCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTGlrZXdpc2UuCisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBCYWNrIG91dCBISidzIGNoYW5nZSwKKwlhcyBpdCBpcyBpbnN1ZmZpY2llbnQgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9uIGNoYW5nZXMgYXMgd2VsbC4KKworTW9uIE9jdCAxMyAyMzoxMDowOCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGZvciBSRUxBVElWRQorCXJlbG9jcyBmb3Igc3ltYm9scyBpbiBzaGxpYnMgdGhhdCBoYXZlIGJlZW4gZm9yY2VkIGxvY2FsLgorCShlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogT3V0cHV0IFJFTEFUSVZFcyBpbiAuZ290IGZvciBzYW1lLgorCitNb24gT2N0IDEzIDIxOjI0OjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgdGhlCisJZ290X2VudGllcyBvZiB0aGUgZGVmYXVsdCBzeW1ib2wgZm9yIHRoZSBkZWZhdWx0IHZlcnNpb25lZAorCXN5bWJvbC4gIFBhdGNoIGZyb20gaGpsQGdudS5haS5taXQuZWR1LCBtb2RpZmllZCBub3QgdG8gdXNlCisJYWxsb2NhIGluIHRoZSBsb29wLgorCitNb24gT2N0IDEzIDE3OjM3OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE9ubHkgdXNlIHRoZSBib3R0b20KKwkyNCBiaXRzIG9mIHRoZSBQQyB3aGVuIGNvbXB1dGluZyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCisKK0ZyaSBPY3QgMTAgMTY6MDE6MzAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYywgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6CisJQ29ycmVjdCB2YWx1ZSBmb3IgbWF4aW11bSBwb3NpdGl2ZSAyMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4KKwkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBQcmV2ZW50IG92ZXJmbG93IGZyb20gSEkxNl9TIGFuZAorCUhJXzE2IHJlbG9jYXRpb25zLiAgQ29ycmVjdCBiaXQgYWRqdXN0bWVudCBpbiBUREEgb2Zmc2V0cy4KKworVGh1IE9jdCAgOSAxNjo0MzozOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbGY2NC1zcGFyYy5jIChzcGFyY19lbGZfe2hpeDIyLGxveDEwfV9yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCisJKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogVXNlIHRoZW0gZm9yIEhJWDIyLExPWDEwIHJlbG9jcy4KKworV2VkIE9jdCAgOCAxMTozODo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbGZjb3JlLmggKGJmZF9wcnN0YXR1cyk6IFBlZGFudGljbHksIGFsaWdubWVudF9wb3dlciBzaG91bGQKKwliZSBMT0dfRklMRV9BTElHTi4KKworV2VkIE9jdCAgOCAxMTozNjowMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkOiBNaXNzZWQgb25lIGFscGhhKiBjaGFuZ2UuCisKK1R1ZSBPY3QgIDcgMTM6MDA6MTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSZW1vdmUgQkZENjQgc3VwcG9ydC4KKwkqIGVsZjY0LXNwYXJjLmMgKFNQQVJDNjRfT0xEX1JFTE9DUyk6IFVuZGVmLgorCShNSU5VU19PTkUpOiBOZXcgbWFjcm8uCisJKHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIERJU1A2NCxQTFQ2NCxISVgyMixMT1gxMCwKKwlINDQsTTQ0LEw0NCxSRUdJU1RFUi4KKwkoc3BhcmNfcmVsb2NfbWFwKTogTGlrZXdpc2UuICBNYXAgQkZEX1JFTE9DX0NUT1IgdG8gUl9TUEFSQ182NC4KKwkoaW5pdF9pbnNuX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgorCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IFVzZSBpdC4KKwkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBlbnRyaWVzIGZvciBPTE8xMCxISVgyMixMT1gxMC4KKworVHVlIE9jdCAgNyAxMTo0MDozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNvbS5jIChzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBSZW1vdmUgc3RhdGljCisJZnVuY3Rpb24sIGFuZCBkZWZpbmUgYXMgbWFjcm8gaW5zdGVhZC4KKworRnJpIE9jdCAgMyAxNDowMjoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkOiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7IGNvbmZpZy5ndWVzcyBub3cKKwlyZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KKwkqIGNvbmZpZ3VyZS5ob3N0OiBMaWtld2lzZS4KKworRnJpIE9jdCAgMyAxMToyMzo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlNYWtlIGxkIC1zIHdvcmsgb24gQUlYOgorCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBjcmVhdGUgdGhlIC5kZWJ1ZworCXNlY3Rpb24gaWYgd2UgYXJlIHN0cmlwcGluZy4KKwkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCB0aGUgLmRlYnVnIHNlY3Rpb24KKwlzaXplIGlmIHdlIGFyZSBzdHJpcHBpbmcuCisJKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgU0VDX1JFTE9DIG9yIHJlbF9maWxlcG9zLAorCWFuZCBkb24ndCB3cml0ZSBvdXQgcmVsb2NzLCBpZiB3ZSBhcmUgc3RyaXBwaW5nLgorCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNldCB1cCByZWxvYyBpZiB3ZSBhcmUgc3RyaXBwaW5nLgorCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3Qgd3JpdGUgb3V0IHN5bWJvbCBvciByZWxvYyBpZiB3ZQorCWFyZSBzdHJpcHBpbmcuCisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgaW5jbHVkZSBlbGYubG8gYWdhaW4gZm9yIEVMRiB0YXJnZXRzOyBpdCdzCisJYWx3YXlzIGluIHRoZSBsaWJyYXJ5IGFueWhvdy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCisJKiBlbGYzMi1zcGFyYy5jIChzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IENhc3QgdG8gYmZkX2J5dGUgKiwgbm90CisJY2hhciAqLCB3aGVuIGNhbGxpbmcgYmZkX2dldF8zMiBhbmQgYmZkX3B1dF8zMi4KKwkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBDYXN0IGNvbnRlbnRzIHRvIGNoYXIgKgorCXdoZW4gY2FsbGluZyBzdHJjcHkuCisKK1RodSBPY3QgIDIgMTY6MTU6NTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYyAoYmZkX2NoZWNrX292ZXJmbG93KTogTmV3IGZ1bmN0aW9uLgorCShiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogVXNlIGl0LgorCShCRkRfUkVMT0NfU1BBUkNfe0RJU1A2NCxQTFQ2NH0pOiBOZXcgcmVsb2NzLgorCShCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwLEg0NCxNNDQsTDQ0LFJFR0lTVEVSfSk6IE5ldyByZWxvY3MuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCisJKiBsaWJiZmQuaDogUmVnZW5lcmF0ZS4KKworVGh1IE9jdCAgMiAxMzoxNzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgSU1BR0VfU0NOX01FTV9SRUFEIGZvciBhbgorCXVucmVjb2duaXplZCBzZWN0aW9uLiAgRnJvbSBKb24gVGhhY2tyYXkgPGpvbnRAaGFybGVxdWluLmNvLnVrPi4KKworV2VkIE9jdCAgMSAxNDowMzo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtICgkKEJGRF9IKSk6IENoYW5nZSBzdG1wLWJmZC5oIHRvIHN0bXAtYmZkLWguCisgCShzdG1wLWJmZC1oKTogUmVuYW1lIGZyb20gc3RtcC1iZmQuaC4KKyAJKEJGRF9IX0ZJTEVTLCBMSUJCRkRfSF9GSUxFUywgTElCQ09GRl9IX0ZJTEVTKTogTmV3IHZhcmlhYmxlcy4KKwkoJChzcmNkaXIpL2JmZC1pbjIuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RtcC1iaW4yLWguCisJKHN0bXAtYmluMi1oKTogTmV3IHRhcmdldC4KKwkoJChzcmNkaXIpL2xpYmJmZC5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWxiZmQtaC4KKwkoc3RtcC1sYmZkLWgpOiBOZXcgdGFyZ2V0LgorCSgkKHNyY2RpcikvbGliY29mZi5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWxjb2ZmLWguCisJKHN0bXAtbGNvZmYtaCk6IE5ldyB0YXJnZXQuCisJKENMRUFORklMRVMpOiBDaGFuZ2Ugc3RtcC1iZmQuaCB0byBzdG1wLWJmZC1oLiAgQWRkIHN0bXAtYmluMi5oLAorCXN0bXAtbGJmZC1oLCBhbmQgc3RtcC1sY29mZi1oLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIGEgZGl2ZXJzaW9uIHRvIHNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSB0aGUKKwlhcmd1bWVudHMgYXJlIHBhcnNlZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIFNlcCAzMCAxNDoxODozMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJfU1BBUkNfR0xPQl9KTVAKKwlyZW5hbWVkIHRvIFJfU1BBUkNfVU5VU0VEXzQyLgorCShzcGFyY19yZWxvY19tYXApOiBEZWxldGUgUl9TUEFSQ19HTE9CX0pNUCBlbnRyeS4KKwkqIGVsZjY0LXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUl9TUEFSQ19HTE9CX0pNUAorCXJlbmFtZWQgdG8gUl9TUEFSQ19VTlVTRURfNDIuCisJKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZSBSX1NQQVJDX0dMT0JfSk1QIGVudHJ5LgorCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NQQVJDX0dMT0JfSk1QKTogRGVsZXRlLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KKwkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KKworVGh1IFNlcCAyNSAxMjoxNTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvbid0IGNoZWNrIHRoZSBoYXNoIGNyZWF0b3IgdW50aWwKKwlhZnRlciB3ZSBoYXZlIHNldCAqc3ltX2hhc2guCisKK1dlZCBTZXAgMjQgMTY6NTI6MjggMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+CisKKyAgICAgICAgKiBjb25maWcuYmZkIChzaCotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIHNoLSotKmVsZiouCisKK1dlZCBTZXAgMjQgMTE6Mjc6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAobGliYmZkX2FfU09VUkNFUyk6IERlZmluZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfVE9PTCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgorCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgU2VwIDIzIDE5OjAzOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEV2ZW4gaWYgd2UgYXJlIG5vdCBkZW1hbmQKKwlwYWdlZCwgZG9uJ3QgcHV0IGEgbG9hZGFibGUgc2VjdGlvbiBhZnRlciBhIG5vbmxvYWRhYmxlIHNlY3Rpb24uCisJKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJbmNyZW1lbnQgdGhlIGZpbGUgb2Zmc2V0CisJZm9yIGEgc2VjdGlvbiB3aXRoIGNvbnRlbnRzLCBldmVuIGlmIGl0IGlzIG5vdCBsb2FkYWJsZS4KKworU3VuIFNlcCAyMSAxMTowMzoyNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBBZGQgcmV0dXJuIGNvZGUKKwlpbmRpY2F0aW5nIHRoYXQgX19jdGJwIGNvdWxkIG5vdCBiZSBmb3VuZC4KKworVGh1IFNlcCAxOCAxNTowNDo1NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KKworV2VkIFNlcCAxNyAwOTo1NDo1MSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIHY4NTBfZWxmX3JlbG9jLAorCXY4NTBfZWxmX2NoZWNrX3JlbG9jcywgdjg1MF9lbGZfcmVsb2NfbWFwLCB2ODUwX2VsZl9ob3d0b190YWJsZSk6CisJQWRkIHN1cHBvcnQgZm9yIHRoZSBDQUxMVCByZWxvY3MuCisKKwkqIHJlbG9jLmMgKENPTU1FTlQpOiBBZGQgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCBhbmQKKwlCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEFkZCBjaGVja3MgdG8gY2F0Y2gKKwlyZWxvY2F0aW9ucyBhZ2FpbnN0IG5vbi1leGlzdGFudCBzeW1ib2xzLgorCitUdWUgU2VwIDE2IDE0OjIwOjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlbG9jLmM6IEFkZCBCRlJfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlLAorCXY4NTBfZWxmX2hvd3RvX3RhYmxlLCB2ODUwX2VsZl9yZWxvY19tYXApOiBBZGQgc3VwcG9ydCBmb3IgYSAxNgorCWJpdCByZWxvYyBpbiB0aGUgdGlueSBkYXRhIGFyZWEuCisKK01vbiBTZXAgMTUgMTE6Mjc6MzYgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlNZXJnZWQgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgorCisJKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IENoYW5nZSBwYy1yZWxhdGl2ZSByZWxvY3MKKwlvdmVyIDJeMzIgYnl0ZXMgdG8gYmUgYWJzb2x1dGUuICBOZWVkZWQgYmVjYXVzZSBEMzBWIFBDIGRvZXNuJ3QKKwluZWNlc3NhcmlseSB3cmFwLgorCisJKiByZWxvYy5jLCBlbGYzMi1kMzB2LmMgKEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCisJQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SKTogTmV3IHJlbG9jcy4KKworCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2NfMjEpOiBOZXcgZnVuY3Rpb24uCisJRG8gMTUgYW5kIDIxIGJpdCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4KKwkqIHJlbG9jLmMgKEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IpOgorCU5ldyByZWxvY2F0aW9ucy4KKworCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBBZGRlbmQgbmVlZHMgdG8gYmUKKwlhZGRlZCB0byB0aGUgcmVsb2NhdGlvbiwgbm90IG9yJ2QuCisKK1dlZCBTZXAgMTAgMTU6MTc6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvYyk6IFJlbW92ZSBzcHVyaW91cyBlcnJvciBtZXNzYWdlLgorCitXZWQgU2VwIDEwIDExOjE3OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IFVzZSBzdHJjYXNlY21wLgorCShiZmRfZGVmYXVsdF9zY2FuKTogVGVzdCBmb3IgbWF0Y2ggd2l0aCBhcmNoX25hbWUgKyAiOiIgKworIAlwcmludGFibGVfbmFtZS4KKwkoYmZkX2RlZmF1bHRfc2Nhbik6IFRlc3QgZm9yIG1hdGNoIHdpdGggcHJpbnRhYmxlX25hbWUgLSAiOiIuCisJKGJmZF9kZWZhdWx0X3NjYW4pOiBEZWxldGUgdzY1LCBoODMwMCwgaDg1MDAsIHo4aywgaTk2MCBzcGVjaWFsCisgCWNhc2VzLiAgRWFjaCBpbXBsZW1lbnRzIHRoZWlyIG93biBzY2FuIGZ1bmN0aW9uLgorCShiZmRfZGVmYXVsdF9zY2FuKTogRGVsZXRlIDM4NiwgMjkwMCwgODYwLCBtaXBzIDIwMDAsIG1pcHMgNDQwMAorIAlzcGVjaWFsIGNhc2VzLiAgU2luY2UgaW5mby0+bWFjaCA9PSAwLiAgVGhlIHRlc3QgbWFjaCA9PSBudW1iZXIKKyAJZmFpbHMuCisJKGJmZF9hcmNoX2xpc3QpOiBOZXcgZnVuY3Rpb24sIHJldHVybiBuYW1lIG9mIGFsbCB0aGUgc3VwcG9ydGVkCisgCWFyY2hpdGVjdHVyZXMuCisKK1R1ZSBTZXAgIDkgMTA6MjE6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQnJlYWsgYWZ0ZXIKKwlkZWNvZGluZyBhcmNoaXRlY3R1cmUuCisJKHY4NTBfZWxmX3JlbG9jKTogRG8gbm90IGNvbXBsYWluIGlmIGEgUl9WODUwX0xPMTYgcmVsb2MgaGFzIGJpdAorCTE1IHNldC4KKworU3VuIFNlcCAgNyAxMjoyNToyMiAxOTk3ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQorCisJKiBiZmQvZWxmNjQtYWxwaGEuYyAocmVsb2NfaG93dG9fdHlwZSk6IEZpeCB0aGUgaG93dG8gdGFibGUuCisKK1RodSBTZXAgIDQgMDk6NDQ6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisgCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGNwdS12ODUwLmMuCisJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItdjg1MC5jLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIHJlbG9jLmM6IFJlbW92ZSBleHRyYW5lb3VzIGNvbW1hcyBmcm9tIHJlbG9jYXRpb24gZW50cmllcy4KKwlSZW1vdmUgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUHV0IFhUWV9DTS9YTUNfVEQgc3ltYm9scworCWluIHNlY3Rpb25zIG5hbWVkIC50b2Nic3MgcmF0aGVyIHRoYW4gLmJzcy4KKworV2VkIFNlcCAgMyAxMToyMzoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsaWJiZmQuaCwgYmZkLWluMi5oLCBlbGYzMi12ODUwLmM6IFJlbW92ZWQKKwlCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KKworVHVlIFNlcCAgMiAyMDo0NDoxMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMpOiBIYW5kbGUgQ19TWVNURU0gc3ltcworCXRoZSBzYW1lIGFzIENfRVhUIHN5bXMuCisJKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERpdHRvLgorCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEaXR0by4KKwkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IEFkZCBzYXZlX2dsb2JhbF90b19zdGF0aWMuICBVc2UKKwlpdCB0byBwcmVzZXJ2ZSBhbmQgcmVzdG9yZSBzdGF0ZSBvZiBnbG9iYWxfdG9fc3RhdGljIGZsYWcuCisKK1R1ZSBTZXAgIDIgMTc6NDU6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9vYmplY3RfcCk6IFNldCBtYWNoaW5lIG51bWJlciBiYXNlZCBvbgorCWJpdHMgaW4gZV9mbGFncyBmaWVsZCByYXRoZXIgdGhhbiBtYWdpYyBudW1iZXJzLgorCSh2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nLCB2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncywKKwl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsCisJdjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbnMuCisKK1R1ZSBTZXAgIDIgMTc6NDM6NDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IFJlbW92ZSBWODUwRSBtYWdpYyBudW1iZXIuCisJKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogUmVtb3ZlIFY4NTBFQSBtYWdpYyBudW1iZXIuCisKK1R1ZSBTZXAgIDIgMTc6MzU6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY3B1LWFyYy5jIChhcmNfZ2V0X21hY2gpOiBQcm9wZXJseSBzY2FuIGRlZmluZWQgbWFjaCBlbnRyaWVzLgorCitUdWUgU2VwICAyIDE4OjI5OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmLW0xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogUEMgcmVsYXRpdmUKKwlpbnN0cnVjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlCisJY3VycmVudCBpbnN0cnVjdGlvbi4KKwkobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IFNpbWlsYXJseS4KKworVHVlIFNlcCAgMiAxNTo0NTo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjcHUtdjg1MC5jOiBVc2UgYSBtYWNybyB0byBjb25zdHJ1Y3QgYmZkX2FyY2hfaW5mb190eXBlCisJZW50cmllcy4KKworCSogcmVsb2MuYywgbGliYmZkLmgsIGJmZC1pbjIuaCwgZWxmMzItdjg1MC5jOiBSZXBsYWNlCisJQkZEX1JFTE9DX1Y4NTBfe1NEQS9UREEvWkRBfV9PRkZTRVQgcmVsb2NzIHdpdGggbmV3IGJpdCBwYXR0ZXJuCisJc3BlY2lmaWMgdmVyc2lvbnM6IEJGRF9SRUxPQ19WODUwX3thcmVhfV97Yml0c31fT0ZGU0VULgorCitUaHUgQXVnIDI4IDE3OjAxOjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY3B1LXY4NTAuYzogUmVtb3ZlICJwbGFpbiIgZnJvbSB2ODUwIHByaW50YWJsZSBuYW1lLgorCShzY2FuKTogVXNlIHN0cmNhc2VjbXAuCisKKwkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTApOiBEZWZpbmUuCisKKwkqIGNwdS1zaC5jIChzY2FuX21hY2gpOiBDb21wYXJlIHdpdGggdGFibGUgaW5zdGVhZCBvZiBoYXJkd2lyZWQgdG8KKyAJanVzdCBzaC9TSCwgdXNlIHN0cmNhc2VjbXAuCisJKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgZW50cmllcyBmb3Igc2gzIGV0LmFsLgorCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zaCwgLi4uKTogRGVmaW5lLgorCitXZWQgQXVnIDI3IDE3OjMzOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYXJjaHVyZXMuYyAoYmZkX2FyY2h1cmVzX2xpc3QpOiBBbHdheXMgTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3QuCisKK1R1ZSBBdWcgMjYgMTc6MjY6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LWFyYy5jLgorCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLWFyYy5jLgorCShlbGYzMi1hcmMubG8pOiBSZW1vdmUgZXhwbGljaXQgZGVwZW5kZW5jeS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisJKiBhY2luY2x1ZGUubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBTZXQgRVhFRVhUX0ZPUl9CVUlMRC4KKwkqIGRvYy9NYWtlZmlsZS5hbSAoTUtET0MpOiBVc2UgRVhFRVhUX0ZPUl9CVUlMRCwgbm90IEVYRUVYVC4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEF1ZyAyNSAxNjoxNDozNCAxOTk3ICBDaHJpc3RvcGhlciBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxhdGVzdCBkZXZvIGF1dG9jb25mIGZvciBOVCBzdXBwb3J0CisKK01vbiBBdWcgMjUgMTY6MTE6MDQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogSWYgQiBpcyBhIGRlZmF1bHQgdHlwZSwgcmV0dXJuIEEuCisKK01vbiBBdWcgMjUgMTU6MzU6NDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY3B1LXY4NTAuYyAoc2Nhbik6IE5ldyBmdW5jdGlvbi4KKwkoYXJjaF9pbmZvX3N0cnVjdCk6IE5ldyBzdHJ1Y3R1cmUuCisJKGJmZF92ODUwX2FyY2gpOiBBZGQgbGluayBpbnRvIGFyY2hfaW5mb19zdHJ1Y3R1cmUuCisKKwkqIGNvbmZpZy5iZmQgKHRhcmdfY3B1KTogQWxsIHY4NTAgdmFyaWFudHMgdXNlIHRoZSBiZmRfYXJjaF92ODUwCisJYXJjaGl0ZWN0dXJlLgorCisJKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX29iamVjdF9wKTogTmV3IGZ1bmN0aW9uLgorCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwZSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlLgorCisJKiBiZmQtaW4yLmggKGJmZF9tYWNoX3Y4NTBlKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGUuCisKKwkqIGVsZjMyLXY4NTAuYyAoRUxGX01BQ0hJTkVfQ09ERSk6IERlZmF1bHQgdG8gdjg1MGUgbWFjaGluZQorCW51bWJlci4KKworCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSBtYWNoaW5lIG51bWJlci4KKworCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MGVhKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGVhLgorCisJKiBiZmQtaW4yLmggKGJmZF9tYWNoX3Y4NTBlYSk6IE1hY2hpbmUgdmFsdWUgZm9yIHY4NTBlYS4KKworCSogZWxmMzItdjg1MC5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmYXVsdCB0byB2ODUwZWEgbWFjaGluZQorCW51bWJlci4KKworCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgbWFjaGluZSBudW1iZXIuCisKK01vbiBBdWcgMjUgMTQ6MDc6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2xlYXIgdGhlCisgCWNhY2hlZF9zdGFiIGZpZWxkIGlmIHRoZSBvZmZzZXQgcHJldmVudHMgdXMgZnJvbSB1c2luZyB0aGUgY2FjaGUuCisKK01vbiBBdWcgMjUgMTI6MDg6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhb3V0LXRhcmdldC5oIChNWSh2ZWMpKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQSB0byBzZWN0aW9uCisJZmxhZ3MuCisJKiBhb3V0LWFybS5jIChhb3V0X2FybV9saXR0bGVfdmVjKTogTGlrZXdpc2UuCisJKGFvdXRfYXJtX2JpZ192ZWMpOiBMaWtld2lzZS4KKwkqIGJvdXQuYyAoYl9vdXRfdmVjX2JpZ19ob3N0KTogTGlrZXdpc2UuCisJKGJfb3V0X3ZlY19saXR0bGVfaG9zdCk6IExpa2V3aXNlLgorCSogbWlwc2JzZC5jIChhb3V0X21pcHNfbGl0dGxlX3ZlYyk6IExpa2V3aXNlLgorCShhb3V0X21pcHNfYmlnX3ZlYyk6IExpa2V3aXNlLgorCitUdWUgQXVnIDE5IDEwOjA5OjEwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXRpYzgwLmMgKENPRkZfQUxJR05fSU5fU0ZMQUdTKTogRGVmaW5lIHRvIDEuCisJKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IElnbm9yZSBpbmNvbWluZyBTVFlQX0lORk8KKwliaXQgaW4gc19mbGFncyBpZiBDT0ZGX0FMSUdOX0lOX1NfRkxBR1MgaXMgZGVmaW5lZC4KKworVHVlIEF1ZyAxOSAwODo0NzoxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29mZi1pOTYwLmMgKENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIpOiBEZWZpbmUgdG8gMS4KKwkoR0VUX1NDTkhEUl9BTElHTiwgUFVUX1NDTkhEUl9BTElHTik6IERlZmluZS4KKwkqIGNvZmYtbTg4ay5jIChHRVRfU0NOSERSX05SRUxPQywgR0VUX1NDTkhEUl9OTE5OTyk6IERlZmluZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogQ29uZGl0aW9uYWxseSBjb21waWxlIGluIGlmCisJQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiBpcyBkZWZpbmVkLiAgQ29udmVydCBhbGlnbm1lbnQgdG8gcG93ZXIKKwlvZiB0d28gZm9yIEk5NjAgb25seS4KKwkqIGNvZmZzd2FwLmggKEdFVF9TQ05IRFJfTlJFTE9DLCBQVVRfU0NOSERSX05SRUxPQywgR0VUX1NDTkRIUl9OTE5OTywKKwlQVVRfU0NOSERSX05MTk5PLCBHRVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0ZMQUdTKTogUHJvdmlkZQorCWRlZmF1bHQgZGVmaW5pdGlvbnMuCisJKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBVc2UgR0VUX1NDTkhEUl9GTEFHUywgR0VUX1NDTkhEUl9OUkVMT0MsCisJR0VUX1NDTkhEUl9OTE5OTywgYW5kIEdFVF9TQ05IRFJfQUxJR04uCisJKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFBVVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfQUxJR04uCisJKiBNYWtlZmlsZS5pbiAoY29mZi10aWM4MC5vKTogRGVwZW5kcyB1cG9uIGNvZmZzd2FwLmguCisJKiBjb2ZmLXRpYzgwLmMgKENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIpOiBEZWZpbmUgdG8gMS4KKwkoR0VUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9GTEFHUyk6IERlZmluZQorCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgYWxpZ25tZW50IGZpZWxkIGluCisgCXNlY3Rpb24gaGVhZGVyIGZvciBUSUM4MENPRkYgZmlsZXMuCisKK01vbiBBdWcgMTggMTE6MzY6MTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSwgdjg1MF9lbGZfcmVsb2NfbWFwLAorCXY4NTBfZWxmX2NoZWNrX3JlbG9jcywgdjg1MF9lbGZfcmVsb2MsCisJdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBBZGQgc3VwcG9ydCBmb3IKKwlCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgorCisJKiByZWxvYy5jIChDT01NRU5UKTogQWRkIHN1dXBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMCisJcmVsb2NhdGlvbi4KKworCSogbGliYmZkLmg6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgorCisJKiBiZmQtaW4yLmg6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTCByZWxvY2F0aW9uLgorCitNb24gQXVnIDE4IDExOjMzOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNwdS12ODUwZTogTmV3IGZpbGUuCisKKwkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgorCisJKiBiZmQtaW4yLmggKGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgorCisJKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgorCisJKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgorCitNb24gQXVnIDE4IDExOjMzOjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNwdS12ODUwZWE6IE5ldyBmaWxlLgorCisJKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCisKKwkqIGJmZC1pbjIuaCAoYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgorCisJKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KKworCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCisKK0ZyaSBBdWcgMTUgMTI6MDE6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBDb3JyZWN0bHkgaGFuZGxlIHRoZSBvZmZzZXQKKwlhcmd1bWVudCBhcyBzZWN0aW9uIHJlbGF0aXZlLCByYXRoZXIgdGhhbiBhbiBhYnNvbHV0ZSBhZGRyZXNzLgorCUZyb20gSmFuIEhvb2dlbnJhYWQgPGhvb2dlbnJkQG5hdGxhYi5yZXNlYXJjaC5waGlsaXBzLmNvbT4uCisKK0ZyaSBBdWcgMTUgMDQ6NTg6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZCAoYXJjLSotZWxmKik6IEFkZC4KKwkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3tsaXR0bGUsYmlnfWFyY192ZWMpOiBBZGQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5hbSAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1hcmMubG8uCisJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVsZjMyLWFyYy5sby4KKwkoY3B1LWFyYy5sbyxlbGYzMi1hcmMubG8pOiBBZGQgcnVsZXMgZm9yLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisJKiBhcmNodXJlcy5jIChhcmNoaXRlY3R1cmUgbGlzdCk6IEFkZCBiZmRfYXJjaF9hcmMuCisJKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9hcmNfYXJjaC4KKwkoYmZkX21hY2hfYXJjX2Jhc2UpOiBEZWZpbmUuCisJKiByZWxvYy5jIChCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCxCRkRfUkVMT0NfQVJDX0IyNik6IEFkZC4KKwkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX3tsaXR0bGUsYmlnfWFyY192ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3QpOiBBZGQgdGhlbS4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisJKiBjcHUtYXJjLmMsIGVsZjMyLWFyYy5jOiBOZXcgZmlsZXMuCisJKiBlbGYuYyAocHJlX2hlYWRlcnMpOiBSZWNvZ25pemUgYmZkX2FyY2hfYXJjLgorCitUdWUgQXVnIDEyIDExOjQ1OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgbm8gc3ltYm9scywgbWFrZSBzdXJlIHRoZQorCWRhdGEgc2VjdGlvbiBpcyBjb3JyZWN0bHkgcm91bmRlZCB0byBhIHBhZ2UgaW4gdGhlIGZpbGUuCisKK01vbiBBdWcgMTEgMTI6NDU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBlbWl0IHRoZSBzdHJpbmcgdGFibGUgaWYKKwl0aGVyZSBhcmUgbm8gc3ltYm9scy4KKworU3VuIEF1ZyAxMCAxNDo0NTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc3RnbzMyLmM6IFJlbmFtZSBmcm9tIGNvZmYtc3R1YmdvMzIuYyB0byBhdm9pZCBvbGQgU3lzdGVtIFYKKwlmaWxlIHN5c3RlbSAxNCBjaGFyYWN0ZXIgbGltaXQuCisJKiBNYWtlZmlsZS5hbSwgY29uZmlndXJlLmluOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgQXVnICA4IDE4OjM0OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IChBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGVsZjMyLWQxMHYuYy4KKwlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitXZWQgQXVnICA2IDE4OjU2OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGRvY2Rpcik6IERlZmluZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitUdWUgQXVnICA1IDIzOjA1OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4xLgorCitNb24gQXVnICA0IDEyOjAwOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlIHBhdGNoZXMuCisKK1N1biBBdWcgIDMgMDg6MTU6MTIgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiByczYwMDAtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6ICBOZXcgZnVuY3Rpb24gdG8gYWRkIGEgc2VjdGlvbgorCXRvIHRoZSBjb3JlIGZpbGUgYmZkLgorCShyczYwMDBjb2ZmX2NvcmVfcCk6ICBVc2UgbWFrZV9iZmRfYXNlY3Rpb24gdG8gYWRkIHRoZSBjb3JlIGZpbGUKKwlzZWN0aW9ucy4KKwlVc2UgQkZEIHJvdXRpbmVzIHRvIHNlZWssIHJlYWQgYW5kIHN0YXQgdGhlIGNvcmUgZmlsZS4KKwlIYW5kbGUgLmRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cyBhbmQgYW5vbnltb3VzbHkgbW1hcHBlZAorCXJlZ2lvbnMsIHRoZXNlIGFyZSBhdmFpbGFibGUgaW4gQUlYIDQgY29yZSBmaWxlcy4KKworRnJpIEF1ZyAgMSAxMjo1ODozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KKwkqIGFjaW5jbHVkZS5tNDogTW92ZSBhY21hY3Jvcy5tNCBpbiBoZXJlLiAgUmVtb3ZlIEFNX1BST0dfTElCVE9PTAorCWNvcHk7IHVzZSBhIHBhdGNoZXMgbGlidG9vbCBpbnN0ZWFkLgorCSogYWNtYWNyb3MubTQ6IFJlbW92ZS4KKwkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBKdWwgMzEgMTk6NTU6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KKwkqIGFjbWFjcm9zLm00OiBOZXcgZmlsZSwgY29waWVkIGZyb20gb2xkIGFjbG9jYWwubTQuCisJKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluOiBDYWxsIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZSBzaGFyZWQgbGlicmFyeQorCWhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZSBBQ19DT05GSUdfSEVBREVSIHdpdGgKKwlBTV9DT05GSUdfSEVBREVSLiAgUmVwbGFjZSBBQ19QUk9HX0lOU1RBTEwgd2l0aCBBTV9QUk9HX0lOU1RBTEwuCisJQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsIEFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgQ2hhbmdlIGFsbAorCS5vIGZpbGVzIHRvIC5sby4gIFJlbW92ZSBzdGFtcC1oIGhhbmRsaW5nIGluIEFDX09VVFBVVC4KKwkqIGFjY29uZmlnLmg6IE1lbnRpb24gUEFDS0FHRSBhbmQgVkVSU0lPTi4KKwkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgorCSogZGVwLWluLnNlZDogQ2hhbmdlIC5vIHRvIC5sby4KKwkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KKwkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCisJKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIFZFUlNJT046IFJlbW92ZS4KKworVGh1IEp1bCAzMSAxMjowOToyMCAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBzZXQgVEVYVFJFTAorIAlpZiB0aGVyZSBpcyBvbmx5IGEgcmVsb2NhdGlvbiB0byBhIHJlYWQtb25seSBidXQgbm90IGFsbG9jYXRhYmxlCisgCXNlY3Rpb24gKGxpa2UgLnN0YWIpLgorCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQ29ycmVjdCB2YXJpb3VzIGNvbW1lbnRzLgorCShwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFRoZXNlIHNlY3Rpb25zIGFyZSBub3QKKwljcmVhdGVkIGJ5IHRoZSBsaW5rZXIgKHRoYXQgaXMsIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIHVzZXIKKwlwdXR0aW5nIGRhdGEgaW4gdGhlbSkuIEluIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGJlIHRoZSBzb3VyY2UKKwlhbmQgdGFyZ2V0IG9mIHJlbG9jYXRpb25zLgorCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoZWNrIHBvc3Rjb25kaXRpb24gb2YKKyAJYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sLiAgQWxpZ24gMTYtYnl0ZSBjb21tb24KKyAJb2JqZWN0cyAoZm9yIGluc3RhbmNlLCAnbG9uZyBkb3VibGUnKSB0byAxNi1ieXRlIGJvdW5kYXJpZXMuCisJKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSB0aGUgY29kZSB0aGF0IGdlbmVyYXRlcworCXNlY3Rpb24gc3ltYm9scyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciBzcGFyYywgcmVkdWNpbmcgdGhlCisJbnVtYmVyIG9mIHNlY3Rpb24gc3ltYm9scyBvdXRwdXQuCisJKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQ2hlY2sgcG9zdGNvbmRpdGlvbiBvZgorCWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbC4gIE1ha2UgZGVmYXVsdCBjYXNlIHRoZQorCXNhbWUgYXMgY29ycmVzcG9uZGluZyBjb2RlIGZvciBzcGFyYywgZml4aW5nIGJ1ZyBpbnZvbHZpbmcKKwkucmVsYS5zdGFicy4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBGaXggY2FzZSBpbnZvbHZpbmcgR09UIHN5bWJvbHMKKyAJZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgdmVyc2lvbmluZyAoYnkgcmVwbGljYXRpbmcKKyAJY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gc3BhcmMpLiAgVHJlYXQgUl9QUENfUkVMQVRJVkUgUkVMQSByZWxvY3MKKyAJYXMgdXN1YWwgaW4gRUxGLCBub3QgYXMgcHNldWRvLVJFTCByZWxvY3MgKGFzIHRoZSBzcGFyYyBsaW5rZXIKKyAJZG9lcykuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBoYW5keSBkZWJ1Z2dpbmcgY29kZSBmb3Igd2hlbgorIAlhc3NlcnRpb24gZmFpbHMuICBBZGQgc29tZSBtb3JlICdzeW1ib2wgbWFkZSBsb2NhbCBiZWNhdXNlIG9mCisgCXZlcnNpb25pbmcnIGNhc2VzLgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29wZSB3aXRoIGFkZGVuZCB3aGVuCisJcHJvY2Vzc2luZyBhIEdPVCByZWxvY2F0aW9uIGFzIHJlcXVpcmVkIGJ5IEFCSS4KKworV2VkIEp1bCAzMCAyMTozMDozNSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBSZW1vdmUgYW55CisJdmVyc2lvbiBpbmZvIGlmIHRoaXMgc3ltYm9sIGNhbWUgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LgorCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgdGhlIHZlcnNpb24gaW5mbyBvZiBhIHN5bWJvbAorCW9ubHkgaWYgdGhlIG9iamVjdCBhY3R1YWxseSBjb250YWlucyB2ZXJzaW9uIGRlZmluaXRpb25zIGFuZAorCWRlZmluZXMgdGhpcyBzeW1ib2wuCisKK01vbiBKdWwgMjggMTg6MDc6NDMgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogQWRkIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3Jvcy4KKyAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgorICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCisgICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCisgICAgICAgICogZG9jL01ha2VmaWxlLmluOiBBZGQgJChFWEVFWFQpIHRvIGNoZXcgZXhlY3V0YWJsZS4KKworTW9uIEp1bCAyOCAwMjo1MDoyOSAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIElmIENPUkVfVFJVTkMgaXMgc2V0LCBwcmludAorCWEgd2FybmluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IuCisKK1N1biBKdWwgMjcgMTk6NTQ6MTQgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogYWRkIHNlbWljb2xvbiB0byBtYWtlIE1TVkMgaGFwcHkuCisKK0ZyaSBKdWwgMjUgMTQ6NTA6MDggMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBjaXNjby1jb3JlLmM6IGRlZmluZSBzaWduYWxzIGZvciB3aW5nZGIuCisKK0ZyaSBKdWwgMjUgMTY6Mjc6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBPbmx5IG1lcmdlIGZpbGVzIHdpdGgKKwl0aGUgc2FtZSBudW1iZXIgb2YgYXV4IGVudHJpZXMuCisKK0ZyaSBKdWwgMjUgMDg6MjI6MTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBVc2UgUl9EQVRBX0VYUFIgZm9yIHRoZQorCWRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaWYgdGhlIHJlbG9jYXRpb24gc2l6ZSBpcyAzMiBiaXRzLgorCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfREFUQV9FWFBSLgorCitXZWQgSnVsIDIzIDE2OjA4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IERvbid0IG9mZnNldCBhIGNvbW1vbiBzeW1ib2wgYnkKKwlpdHMgdmFsdWUgaWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQuCisKK1R1ZSBKdWwgMjIgMTc6MTk6NDUgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgorCisJKiBjb2ZmLXN0dWJnbzMyLmM6IE5ldyBmaWxlLgorCSogZ28zMnN0dWIuaDogTmV3IGZpbGUuCisJKiBjb2ZmLWkzODYuYzogSWYgQ09GRl9HTzMyX0VYRSwgaW5jbHVkZSBjb2ZmL2dvMzJleGUuaC4KKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX2luKTogSW52b2tlCisJQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QUkUgYW5kIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBpZiB0aGV5CisJYXJlIGRlZmluZWQuCisJKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgYW5kCisJQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgorCShjb2ZmX3N3YXBfYXV4X2luKTogSW52b2tlIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgYW5kCisJQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KKwkoY29mZl9zd2FwX2F1eF9vdXQpOiBJbnZva2UgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgYW5kCisJQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCisJKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBJbnZva2UgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BSRSBhbmQKKwlDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgorCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSBhbmQKKwlDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KKwkqIHRhcmdldHMuYyAoZ28zMnN0dWJiZWRjb2ZmX3ZlYyk6IERlY2xhcmUuCisJKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGdvMzJzdHViYmVkY29mZl92ZWMuCisJKiBjb25maWd1cmUuaW4gKGdvMzJjb2ZmX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgorCShnbzMyc3R1YmJlZGNvZmZfdmVjKTogTGlrZXdpc2UuCisJKiBjb25maWcuYmZkIChpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCisJKGlbMzQ1Nl04Ni0qLWdvMzIqKTogQ2hhbmdlIHRvIGJlIGxpa2UgbmV3IG1zZG9zZGpncHAqLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zdHViZ28zMi5vLgorCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1zdHViZ28zMi5jLgorCShIRklMRVMpOiBBZGQgZ28zMnN0dWIuaC4KKworVHVlIEp1bCAyMiAxNTowOToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGZkb3Blbi4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgorCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2hlY2sgSEFWRV9GRE9QRU4gcmF0aGVyIHRoYW4gVk1TIG9yCisJX19HTzMyX18uICBSZWluZGVudCBhIGJpdC4KKworU3VuIEp1bCAyMCAyMDowNToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IFNFQ19MSU5LRVJfQ1JFQVRFRAorCWZsYWcgZm9yIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbnMuCisJKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkaXNjYXJkIG5ld2x5IGNyZWF0ZWQgc2VjdGlvbnMKKwlpZiBzaGFyZWQgbGlicmFyeSBpcyBkeW5vYmouCisKK01vbiBKdWwgMTQgMTU6MzM6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogV2hlbiBjaGVja2luZyB3aGV0aGVyCisJaW5jbHVkaW5nIGEgc2VjdGlvbiBpbiBhIHNlZ21lbnQgd291bGQgZm9yY2UgdXMgdG8gc2tpcCBhIHBhZ2UsCisJYWxpZ24gdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgc2VnbWVudCB0byBhdm9pZCB3cmFwYXJvdW5kCisJcHJvYmxlbXMuCisKK1R1ZSBKdWwgIDggMTI6MTE6MjkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSW5pdGlhbGl6ZQorIAl0YXJnZXQgaWQgZmllbGQgdG8gVElDODBfVEFSR0VUX0lELgorCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogU3dhcCBvdXQgdGFyZ2V0IGlkIGZpZWxkCisgCWlmIHVzZWQuCisJKGNvZmZfc3dhcF9maWxlaGRyX2luKTogU3dhcCBpbiB0YXJnZXQgaWQgZmllbGQgaWYgdXNlZC4KKworTW9uIEp1bCAgNyAxNjo0MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24KKwlpZiBUQVJHRVRfVU5ERVJTQ09SRS4KKwkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBpZiBUQVJHRVRfVU5ERVJTQ09SRS4KKwkoaTM4NmNvZmZfdmVjKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQSB0byBzZWN0aW9uX2ZsYWdzLgorCitNb24gSnVuIDMwIDE0OjI5OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbTY4ay5jIChob3d0b190YWJsZSk6IFVzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgbm90CisJY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBmb3IgMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgorCitUaHUgSnVuIDI2IDAxOjI2OjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbgorCWluZGlyZWN0aW9uIHN5bWJvbCBpcyBvdmVycmlkZGVuLCBtYWtlIHRoZSBvcmlnaW5hbCBzeW1ib2wgcG9pbnQKKwlhdCB0aGUgcmVhbCBvdmVycmlkaW5nIHN5bWJvbC4KKworCSogZWxmLmMgKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24pOiBDaGVjayBmb3IgYW4gaW52YWxpZAorCXN0cmluZyBpbmRleC4KKworCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogVXNlIHRoZSByaWdodCBzZWN0aW9uIGZvciBhCisJY29tbW9uIHN5bWJvbC4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBJZiBhIGNvbW1vbgorCXN5bWJvbCB3YXMgaW4gLnNjb21tb24sIG1hcmsgaXQgYXMgU0hOX01JUFNfU0NPTU1PTi4KKworV2VkIEp1biAyNSAxMjo0MzoxMCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2xzKTogUmVzb2x2ZSBpbmRpcmVjdCBhbmQgd2FybmluZworCXN5bWJvbHMgYmVmb3JlIGNoZWNraW5nIGZvciBuZXcgc3ltYm9scy4KKworCSogZWxmY29yZS5oIChlbGZfY29yZWZpbGVfbm90ZSk6IE1vdmUgb3V0IG9mIEhBVkVfU1lTX1BST0NGU19ILgorCitUdWUgSnVuIDI0IDExOjIwOjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmdlbi5jIChjb2ZmX29iamVjdF9wKTogUmVhZCB0aGUgZl9vcHRoZHIgYnl0ZXMgZnJvbSB0aGUKKwlmaWxlLCBub3QgYW91dHN6IGJ5dGVzICh0aGV5IGFyZSBkaWZmZXJlbnQgaW4gWENPRkYgLm8gZmlsZXMpLgorCisJKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBzeW1ib2xzIHRvIGJlCisJcmVkZWZpbmVkIGJ5IG9iamVjdHMgaW5jbHVkZWQgZnJvbSBhcmNoaXZlcy4KKworTW9uIEp1biAyMyAxODowMzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEluIHRoZSBjYXNlIG9mIGEgbmV3IGRlZmluZWQKKwlzeW1ib2wgb3ZlcnJpZGluZyBhbiBvbGQgZGVmaW5lZCBzeW1ib2wsIHJldHVybiB0aGUgaGFzaCB0YWJsZQorCWVudHJ5IHdoaWNoIHdlIG1vZGlmeSwgZXZlbiBpZiBpdCBpcyB0aGUgdGFyZ2V0IG9mIGFuCisJaW5kaXJlY3Rpb24uCisJKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIHRoZSByZWFsIG5hbWUgb2YgdGhlIHN5bWJvbCBnZXRzCisJb3ZlcnJpZGRlbiwgY29udmVydCB0aGUgdmVyc2lvbmVkIHN5bWJvbCBpbnRvIGFuIGluZGlyZWN0IHN5bWJvbAorCXRvIHRoZSByZWFsIHN5bWJvbC4KKworCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgorCWVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scy4KKwkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbCBpdC4KKworU3VuIEp1biAyMiAxOTo0MDo1NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsIGhhY2sgdG8KKwloYW5kbGUgY2FzZSB3aGVyZSBDT0ZGIGZpbGVoZHIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93IFBFCisJaGVhZGVyLgorCSogY29mZmdlbi5jIChjb2ZmX29iamVjdF9wKTogUmVtb3ZlIHVzZWxlc3Mgc2VlayB0byBjdXJyZW50CisJbG9jYXRpb24uCisKK1dlZCBKdW4gMTggMTk6MDM6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaW5rZXIuYyAobGlua19hY3Rpb24pOiBDaGFuZ2UgQ09NTU9OX1JPVy9pbmRyIHRvIGZyb20gQ1JFRiB0bworCVJFRkMuCisKK1R1ZSBKdW4gMTcgMTE6NTU6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBzdHJpcHBpbmcgZGVidWdnaW5nCisJc3ltYm9scywgc2tpcCBOX0FCUyBzeW1ib2xzIHdpdGggZGVidWdnaW5nIHN0b3JhZ2UgY2xhc3Nlcy4KKworTW9uIEp1biAxNiAxODo1NjoyNyAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwqCisJcmVsb2NzIGluIHNoYXJlZCBsaWJyYXJpZXMgd2hpY2ggcmVmZXIgdG8gbG9jYWwgc3ltYm9scy4gIENvcGUKKwl3aXRoIGFkZGVuZCB3aGVuIHByb2Nlc3NpbmcgYSBHT1QgcmVsb2NhdGlvbi4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBjcmVhdGUgc3ltYm9scworCWZvciBzZWN0aW9ucyB0aGF0IHRoZSBsaW5rZXIgZGlkbid0IGNyZWF0ZS4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgdHJ5IHRvIHdyaXRlIG91dCBhIHNlY3Rpb24KKwlzeW1ib2wgaWYgaXQgd2FzIGNyZWF0ZWQgaW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvbXBsYWluIGlmIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSByZWxvYworCXJlbGF0aXZlIHRvIGEgc2VjdGlvbiBmb3Igd2hpY2ggd2UgZGlkbid0IG91dHB1dCBhIHN5bWJvbC4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2xlYW4gdXAuICBQTFQKKwlyZWxvY3MgYXJlICdyZWxhJyByZWxvY3MsIGxpa2UgZXZlcnl0aGluZyBlbHNlLiAgLnJlbGEucGx0IGlzIG5vdAorCWEgcmVhZC1vbmx5IHNlY3Rpb24sIHNvIHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbC1jYXNlIGl0LgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBFbnRyaWVzIGluIHRoZQorCS5yZWxhLmJzcyBzZWN0aW9uIGFyZSAob2YgY291cnNlKSAncmVsYScgcmVsb2NzIG5vdCAncmVsJyByZWxvY3MuCisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEluaXRpYWxpc2Ugc3JlbGdvdC4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQGdvdCBvZmZzZXRzIGFyZSA0IGZyb20gc3RhcnQgb2YgdGhlCisJYWN0dWFsIC5nb3Qgc2VjdGlvbi4KKwkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogVGhlIHRocmVlIHJlc2VydmVkCisJd29yZHMgc3RhcnQgZnJvbSB0aGUgc3ltYm9sICdfR0xPQkFMX09GRlNFVF9UQUJMRV8nLgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiAnLnJlbGEnIGlzIDUKKwljaGFyYWN0ZXJzLCBub3QgNC4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVXNlCisJX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIHRvIGNyZWF0ZSB0aGUgR09UIHJhdGhlciB0aGFuCisJcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24uIENyZWF0ZSB0aGUgJy5yZWxhLmdvdCcgc2VjdGlvbgorCW91cnNlbHZlcy4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTZXQgdXAgR09UIHJlbG9jYXRpb25zIHdoZW4gYQorCXN5bWJvbCBoYXMgYSBHT1QgZW50cnkuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFJlY29yZCB3aGVuIGEgc3ltYm9sIGlzIHVzZWQgdGhyb3VnaAorCXRoZSBHT1QsIGFuZCBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgR09UIGZvciBlYWNoIHN1Y2ggc3ltYm9sLgorCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERlbGV0ZSB1bnVzZWQgLmdvdC5wbHQgc3R1ZmYuCisJKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBMSU5LRVJfU0VDVElPTl9HT1QKKwlzdHVmZi4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogR09UMTZfSEEgcmVsb2NzIHNob3VsZCBiZQorCXRyZWF0ZWQgaW4gYSBzaW1pbGFyIHdheSB0byBBRERSMTZfSEEgcmVsb2NzLgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQTFRSRUwyNCByZWxvY3MgZG8gbm90IGdldCBjb3BpZWQgaW50bworCXNoYXJlZCBvYmplY3RzOyB0aGUgbGlua2VyIG11c3QgZGVhbCB3aXRoIHRoZW0uCisJKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogU3RvcCBzZXR0aW5nCisJX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHRvIHRoZSB3cm9uZyB2YWx1ZTsgZGVsZXRlIHVudXNlZAorCUxJTktFUl9TRUNUSU9OX1BMVCBzdHVmZi4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBEZWxldGUgdW51c2VkIExJTktFUl9TRUNUSU9OX1BMVCBzdHVmZi4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBCRkQgY2FsbHMgdG8gZ2V0IEdPVAorCXNlY3Rpb24sIG5vdCBFTEYtc3BlY2lmaWMgY2FsbHMuCisJKGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkKTogU2V0IHRvIDEuCisJKGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0KTogU2V0IHRvIDQuCisJKiBlbGYtYmZkLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgJ3BsdF9ub3RfbG9hZGVkJyBtZW1iZXIKKwlmb3Igd2hlbiBsZC5zbyBmaWxscyBpbiB0aGUgUExUOyBhbmQgJ2dvdF9zeW1ib2xfb2Zmc2V0JyBtZW1iZXIuCisJKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQXBwbHkKKwlwbHRfbm90X2xvYWRlZCBtZW1iZXIuCisJKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFwcGx5IGdvdF9zeW1ib2xfb2Zmc2V0LgorCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkKTogU2V0IGRlZmF1bHQgdG8KKwknbG9hZGVkJy4KKwkoZWxmX2JhY2tlbmRfR19PX1Rfb2Zmc2V0KTogU2V0IGRlZmF1bHQgdG8gMC4KKwkoZWxmTk5fYmVkKTogU2V0IGFkZGVkIGZpZWxkcy4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2FzIHNldHRpbmcKKwlEVF9SRUxFTlQgaW4gc2hhcmVkIG9iamVjdHM7IHNob3VsZCBiZSBEVF9SRUxBRU5ULgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGFnYXRlCisJUl9QUENfQUREUjE2X0hBIHJlbG9jcyB0byBzaGFyZWQgb2JqZWN0cy4gQ29wZSB3aXRoIGNhc2Ugd2hlcmUKKwlzdWNoIGEgcmVsb2MgKGluIGEgbm9uLXNoYXJlZCBvYmplY3QpIHJlZmVycyB0byBhIHN5bWJvbCB0aGF0J3MKKwlub3QgZGVmaW5lZC4KKworTW9uIEp1biAxNiAxNDo0MjoxNCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBlbGZjb2RlLmggKHB1dF9zaWduZWRfd29yZCk6IERlZmluZS4KKwkoZ2V0X3NpZ25lZF93b3JkKTogRGVmaW5lLgorCShlbGZfc3dhcF9yZWxvY2FfaW4pOiBVc2UgZ2V0X3NpZ25lZF93b3JkIGZvciB0aGUgcl9hZGRlbmQgZmllbGQuCisJKGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBVc2UgcHV0X3NpZ25lZF93b3JkIGZvciB0aGUgcl9hZGRlbmQKKwlmaWVsZC4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogVXNlCisJYmZkX2dldF9zaWduZWRfMzIgdG8gc2V0IHRoZSByX2FkZGVuZCBmaWVsZC4KKwkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbik6IFVzZQorCWJmZF9oX2dldF9zaWduZWRfNjQgdG8gc2V0IHRoZSByX2FkZGVuZCBmaWVsZC4KKworTW9uIEp1biAxNiAxMjozMToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdoZW4gZ2VuZXJhdGluZyBhCisJc2hhcmVkIGxpYnJhcnksIGRvIHRoZSByZWxvY2F0aW9uIGlmIHRoZSBpbnB1dCBzZWN0aW9uIGlzIG5vdAorCWFsbG9jYXRlZCBpbiBtZW1vcnkuCisKKwkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYWxsCisJZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIGJlZm9yZSBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgorCShlbGZfZml4X3N5bWJvbF9mbGFncyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKKwllbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgorCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2FsbCBlbGZfZml4X3N5bWJvbF9mbGFncy4KKwkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTGlrZXdpc2UuICBQZXJtaXQgYSBzeW1ib2wgdG8gYmUKKwlmb3JjZWQgbG9jYWwgZXZlbiBpZiBORUVEU19QTFQgaXMgc2V0LiAgV2hlbiBmb3JjaW5nIGEgc3ltYm9sIHRvCisJYmUgbG9jYWwsIGNsZWFyIE5FRURTX1BMVC4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgYmVkLgorCitXZWQgSnVuIDExIDIyOjQ0OjIwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbW4xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBzdHJ1Y3R1cmUKKwlmb3IgZGVyaXZlZCBlbGYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gIFJlZmVyZW5jZXMgdG8KKwllbGZfbGlua19oYXNoX2VudHJ5IGNoYW5nZWQgYXBwcm9wcmlhdGVseS4KKwkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpOiBOZXcgc3RydWN0dXJlIGZvciBkZXJpdmVkIGVsZgorCWxpbmtlciBoYXNoIHRhYmxlLgorCShlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUpOiBEZWZpbmUuCisJKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCisJKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgorCShlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogTGlrZXdpc2UuCisJKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBIYW5kbGUgImNhbGwiIC0+ICJjYWxscyIsIHJlbW92YWwKKwlvZiBwcm9sb2d1ZSBjb2RlLCBhbmQgY2FsbDozMi0+Y2FsbDoxNiByZWxheGluZy4KKwkoY29tcHV0ZV9mdW5jdGlvbl9pbmZvOiBOZXcgZnVuY3Rpb24uCisJKGJmZF9lbGYzMl9iZmRfaWxpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUuCisKK1dlZCBKdW4gMTEgMDA6MDA6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDYWxsIGZpbmlzaF9keW5hbWljX3N5bWJvbAorCWZvciBhIHN5bWJvbCB3aGljaCBpcyBiZWluZyBmb3JjZWQgdG8gYmUgbG9jYWwuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXcml0ZSBvdXQgdGhlCisJcmVsb2NhdGlvbiB2YWx1ZSBmb3IgYSBHT1QgcmVsb2MgZm9yIGEgc3ltYm9sIHdoaWNoIGlzIHR1cm5pbmcKKwlpbnRvIGEgbG9jYWwgc3ltYm9sLgorCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBpcyB0dXJuaW5nIGludG8gYQorCWxvY2FsIHN5bWJvbCwgd3JpdGUgb3V0IGEgUkVMQVRJVkUgcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVAorCXJlbG9jLgorCSogZWxmMzItbTY4ay5jLCBlbGYzMi1zcGFyYy5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEdldCB0aGUgcmVsb2NhdGlvbgorCXZhbHVlIGlmIHRoZSBzeW1ib2wgaXMgdHVybmluZyBpbnRvIGEgbG9jYWwgc3ltYm9sLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKKzE5OTctMDYtMTAgMjI6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEFsc28gcmVhZCB2ZXJuZWVkCisJaW5mb3JtYXRpb24gYnkgY2FsbGluZyBgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMnLgorCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMgbG9vayBmb3IKKwl2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSB2ZXJuZWVkIHJlY29yZHMuCisJKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBzb25hbWUgb2Ygc2hhcmVkIG9iamVjdAorCWZvciB2ZXJuZWVkIHJlY29yZCBpZiBpdCBpcyBhdmFpbGFibGUuCisKK1R1ZSBKdW4gMTAgMTE6MTM6MDMgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogY3B1LWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgY29tcGF0aWJsZSBhbmQgc2Nhbi4KKwkqIGNvZmZsaW5rLmM6IEFkZCBwcm90b3R5cGUgZm9yIG1hcmtfcmVsb2NzLgorCisJKiBhcmNoaXZlLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogQ2hhbmdlIGZpbGVuYW1lIHRvCisJY29uc3QgcG9pbnRlci4gIEFkZCBwcm90b3R5cGUuCisKK01vbiBKdW4gIDkgMTI6MzQ6MjEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWdub3JlIHJlbG9jYXRpb25zIG9mCisJc2VjdGlvbnMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZC4KKworMTk5Ny0wNi0wNiAyMjo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcyk6IFdoZW4gc2VhcmNoaW5nCisJZm9yIGtub3duIHZlcnNpb24gc3ltYm9sIHNraXAgbm9uLW1hdGNoaW5nIHZlcmRlZiByZWNvcmRzLCBub3QKKwltYXRjaGluZyByZWNvcmRzLgorCitUaHUgSnVuICA1IDE1OjUyOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFdyaXRlIGEgbG9uZywKKwlub3QgYSBiZmRfdm1hLCB0byB0aGUgYmFzZSBmaWxlLCB0byBtYXRjaCBob3cgZGxsdG9vbCByZWFkcyBpdC4KKworVHVlIEp1biAgMyAxNjo1Nzo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWxvYy5jOiBBZGQgdGh1bWIgcmVsb2NhdGlvbnMuCisKKwkqIGJmZC1pbjIuaDogQWRkIFRodW1iIHJlbG9jYXRpb25zLgorCisJKiBsaWJiZmQuaDogQWRkIFRodW1iIHJlbG9jYXRpb25zLgorCitNb24gSnVuICAyIDEwOjQxOjUyIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjcHUtbTY4ay5jIChhcmNoX2luZm9fc3RydWN0KTogRml4IDY4MDYwIGNwdSBuYW1lLgorCitGcmkgTWF5IDMwIDEyOjQ2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU2V0IGR5bmluZHgKKwlmb3IgYSBzZWN0aW9uIGV2ZW4gaWYgaXQgaXMgbm90IGxvYWRlZC4KKworCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogSWYgUEUgZmlsZSwgZG9uJ3Qgc3VidHJhY3QKKwlzZWN0aW9uIFZNQS4KKwkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2VwYXJhdGUgc2VjdGlvbiBWTUEgaGFuZGxpbmcgZm9yCisJaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KKwkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHdoZXRoZXIgaW5wdXQgZmlsZSwKKwlub3Qgb3V0cHV0IGZpbGUsIGlzIGEgUEUgZmlsZS4KKworV2VkIE1heSAyOCAxNTo0ODo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmLWFybS5jOiAoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTWFrZSBzdGF0aWMuCisKK1dlZCBNYXkgMjggMTY6MTY6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogRG9uJ3QganVzdCBleGl0IGlmIHdlIHNlZSBhbgorCVJfSU1BR0VCQVNFIHJlbG9jLgorCitXZWQgTWF5IDI4IDA5OjQ4OjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IEFkZCB0ZXN0IGZvciBzdXBlcnNldHMgb2YgQVJNCisJYXJjaGl0ZWN0dXJlcy4KKworVHVlIE1heSAyNyAxOTo0MjowMyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGdsb2JhbF90b19zdGF0aWMKKwltZW1iZXIuCisKK1R1ZSBNYXkgMjcgMTQ6MzQ6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKTogTWFrZSBnbG9iYWwuICBJdCBpcworCWNhbGxlZCBkaXJlY3RseSBieSBnYXMvY29uZmlnL3RjLWFybS5jLgorCitUdWUgTWF5IDI3IDE1OjU4OjUzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBlbGY2NC1hbHBoYS5jIChQTFRfRU5UUllfKik6IFVzZSBhIG5ldyB0aHJlYWQtc2FmZSBmb3JtYXQuCisJKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpbGwgaXQgaW4gcHJvcGVybHkuCisKK01vbiBNYXkgMjYgMTQ6MDU6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgUEUgZmlsZSwgZG9uJ3QgYWRkCisJc2VjdGlvbiBWTUEuCisKK01vbiBNYXkgMjYgMTA6NTc6NDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAoY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6ICN1bmRlZiBiZWZvcmUgI2RlZmluZS4KKwkoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCisJKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE1ha2Ugc3RhdGljLgorCShjb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgorCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEaXR0by4KKwkoY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERpdHRvLgorCitGcmkgTWF5IDIzIDE1OjE0OjU4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBib29sZWFuCisJZ2xvYmFsX3RvX3N0YXRpYyBtZW1iZXIgZm9yIHN1cHBvcnQgb2YgdGFzayBsaW5raW5nLgorCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogQWRkIHByb3RvdHlwZS4KKwkqIGxpYmNvZmYuaDogUmVnZW5lcmF0ZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlICNpZmRlZiB0bworCWNoZWNrIFJTNjAwMENPRkZfQywgdG8gYmUgY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB1c2VzCisJaW4gdGhpcyBmaWxlLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsCisJY2FsbCBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzLgorCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQKKwlnbG9iYWwgZnVuY3Rpb25zIHRvIHN0YXRpYy4KKwkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBJZiBkb2luZyB0YXNrIGxpbmtpbmcsIGNvbnZlcnQKKwlnbG9iYWwgdmFyaWFibGVzIHRvIHN0YXRpYy4KKwkoX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvZmYtdGljODAuYyAoVElDODBDT0ZGKTogRGVmaW5lIHRoaXMgaW5zdGVhZCBvZiBqdXN0IFRJQzgwLgorCShDX0FVVE9BUkcpOiAjdW5kZWYgc2luY2UgaXQgY2xhc2hlcyB3aXRoIENfVUVYVC4KKwkoQ19MQVNURU5UKTogI3VuZGVmIHNpbmNlIGl0IGNsYXNoZXMgd2l0aCBDX1NUQVRMQUIuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBUSUM4MENPRkYKKwlyYXRoZXIgdGhhbiBUSUM4MC4KKwkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgQ19TWVNURU0uICBIaWRlIENfQVVUT0FSRyB1c2UKKwl3aGVuIFRJQzgwQ09GRiBkZWZpbmVkIChjbGFzaGVzIHdpdGggQ19VRVhUKS4gIEV4cGxpY2l0bHkKKwlyZWNvZ25pemUgQ19VRVhULCBDX1NUQVRMQUIsIGFuZCBDX0VYVExBQiBhcyB1bnN1cHBvcnRlZC4KKworRnJpIE1heSAyMyAxMjozODoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtdGljODAuYyAodGljODBfaG93dG9fdGFibGUpOiBDaGFuZ2Ugb3ZlcmZsb3cgY2hlY2sgZm9yIG1vc3QKKwlQUCByZWxvY2F0aW9ucyB0byBjb21wbGFpbl9vdmVyZmxvd19kb250LgorCitUaHUgTWF5IDIyIDIwOjIyOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IEFkZCBQUCByZWxvY2F0aW9ucy4gIENoYW5nZQorCW5hbWUgb2YgUl9SRUxMT05HIHRvICJSRUxMT05HIi4gIFNldCByaWdodHNoaWZ0IGFuZCBjb21wbGFpbiBmb3IKKwlNX1BQQ1IuCisJKHBwYmFzZV9yZWxvYywgZ2xvYjE1X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKGdsb2IxNl9yZWxvYywgbG9jYWwxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCShydHlwZTJob3d0byk6IEhhbmRsZSBhbGwgcmVsb2NhdGlvbiB0eXBlcy4KKwkoY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lIHRvIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbi4KKwkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBEZXBlbmRzIHVwb24gaW5jbHVkZS9jb2ZmL3RpYzgwLmguCisKK1dlZCBNYXkgMjEgMTc6MTU6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIENPRkZfV0lUSF9QRSBvcgorCUNPRkZfSU1BR0VfV0lUSF9QRSwgZG9uJ3Qgc3VidHJhY3QgdGhlIHNlY3Rpb24gVk1BIGZyb20gdGhlIHN5bWJvbAorCXZhbHVlLgorCSogY29mZmdlbi5jIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBBZGQgYWJmZCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCisJY2FsbGVycy4gIElmIFBFIGZpbGUsIGRvbid0IGFkZCBzZWN0aW9uIFZNQS4KKwkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBJZiBQRSBmaWxlLCBkb24ndCBhZGQgc2VjdGlvbiBWTUEuCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KKwkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KKwkoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCisJKiBwZWljb2RlLmg6IEFkZCAmIDB4ZmZmZmZmZmYgd2hlbiB1c2luZyBJbWFnZUJhc2UgaW4gY2FzZSBiZmRfdm1hCisJaXMgNjQgYml0cy4KKworV2VkIE1heSAyMSAwOTo1ODoxMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChtYXJrX3JlbG9jcyk6IEFkZCBuZXcgZnVuY3Rpb24gdG8gbWFyayBzeW1ib2xzIHdoaWNoCisJYXJlIHVzZWQgYnkgcmVsb2NhdGlvbnMuCisJKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IEFkZCBjYWxsIHRvIG1hcmtfcmVsb2NzKCkgYW5kIGNvZGUgdG8KKwlzdXBwcmVzcyB0aGUgc2tpcHBpbmcgb2Ygc3ltYm9scyB0aGF0IGhhdmUgdGh1cyBiZWVuIG1hcmtlZC4KKworVHVlIE1heSAyMCAxODo0NToyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc2guYyAoc2hfbWVyZ2VfcHJpdmF0ZV9kYXRhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KKworTW9uIE1heSAxOSAxNDo0NjowMCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvZmYtdGljODAuYzogUmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZnMuCisJKiBjb25maWcuYmZkOiBTZXQgdGFyZ191bmRlcnNjb3JlIHRvIHllcyBmb3IgdGljODAuCisKK01vbiBNYXkgMTkgMTQ6MjY6MzYgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb2ZmLXRpYzgwLmMgKE5BTUVTX0hBVkVfVU5ERVJTQ09SRSk6IERlZmluZSAoZml4ZXMgcHJvYmxlbQorCXdpdGggdW5yZXNvbHZlZCBleHRlcm5hbCBzeW1ib2xzIGluIEdEQikuCisKK0ZyaSBNYXkgMTYgMTA6MjM6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYtbTEwMzAwLmMgKGVsZjMyX21uMTAzMDBfcmVsYXhfc2VjdGlvbik6IFJlYWQgaW4gYWxsCisJdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggQkZELgorCShtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBhZGp1c3QgdGhlIHNhbWUgc3ltYm9sCisJbW9yZSB0aGFuIG9uY2UuCisJKiBlbGYtbTEwMjAwLmM6IExpa2V3aXNlLgorCSogZWxmMzItbTMyci5jOiBMaWtld2lzZS4KKwkqIGVsZjMyLXNoLmM6IExpa2V3aXNlLgorCitGcmkgTWF5IDE2IDEyOjEwOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBkZWNyZWFzZSB0aGUKKwlhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sLiAgSWYgdHdvIHN5bWJvbHMgdGhhdCBsb29rIGxpa2UKKwljb21tb24gc3ltYm9scyBhcmUgZm91bmQgaW4gdHdvIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCB0aGUgc2l6ZSBpcworCWRpZmZlcmVudCwgdXNlIHRoZSBsYXJnZXIgc2l6ZSwgYW5kIHdhcm4gaWYgLS13YXJuLWNvbW1vbi4gIElmIGEKKwljb21tb24gc3ltYm9sIG92ZXJyaWRlcyBhIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeSwgc2V0IHRoZQorCXNpemUgdG8gdGhlIGxhcmdlciBzaXplLCBhbmQgd2FybiBpZiAtLXdhcm4tY29tbW9uLgorCitUaHUgTWF5IDE1IDE0OjMxOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6ICBBbGxvdyBkZWZhdWx0IG1hY2hpbmUgdG8gYmUgcG9seW1vcnBoZWQKKwlpbnRvIGFueSBvdGhlciBtYWNoaW5lIHR5cGUuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogIEluaXRpYWxpc2UgZmxhZ3MgdmFyaWFibGUgdG8gMC4KKworCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiAgV2hlbiBtZXJnaW5nCisJZGF0YSBpbnRvIGFuIHVuaXRpYWxpc2VkIGRlc3RpbmF0aW9uIHNldCBpdHMgbWFjaGluZSB0eXBlIGFzIHdlbGwuCisKK1RodSBNYXkgMTUgMTY6NDA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEZvcmNlIEVMRiBzeW1ib2wgc2l6ZQorCXRvIGNvbW1vbiBzeW1ib2wgc2l6ZS4gIENvbnNpc3RlbnRseSB0cmVhdCB1bmluaXRpYWxpemVkIHN5bWJvbHMKKwlpbiBzaGFyZWQgb2JqZWN0cyBhcyBjb21tb24gc3ltYm9scy4KKworRnJpIE1heSAgOSAxMDoxNToyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcmNodXJlcy5jIChjb25zdGFudHMpOiAgQWRkZWQgbmV3IGNvbnN0YW50cyB0byBpZGVudGlmeSB0aGUKKwl0eXBlIG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlOiBiZmRfbWFjaF9hcm1fMiwgYmZkX21hY2hfYXJtXzJhLAorCWJmZF9tYWNoX2FybV8zLAliZmRfbWFjaF9hcm1fM00sIGJmZF9tYWNoX2FybV80IGFuZCBiZmRfbWFjaF9hcm1fNFQuCisKKwkqIGJmZC1pbjIuaCAoY29uc3RhbnRzKTogICBBZGRlZCBuZXcgY29uc3RhbnRzIHRvIGlkZW50aWZ5CisJdGhlIHR5cGUgb2YgdGhlIEFSTSBhcmNoaXRlY3R1cmU6IGJmZF9tYWNoX2FybV8yLCBiZmRfbWFjaF9hcm1fMmEsCisJYmZkX21hY2hfYXJtXzMsIGJmZF9tYWNoX2FybV8zTSwgYmZkX21hY2hfYXJtXzQgYW5kCisJYmZkX21hY2hfYXJtXzRULiAgVGhpcyBmaWxlIGlzIGF1dG8tbWFnaWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZQorCWFyY2h1cmVzLmMgZmlsZS4gIFRoaXMgdXBkYXRlIGlzIGp1c3QgdG8gc2F2ZSB3b3JrLgorCisJKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwKKwljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwKKwljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MsCisJY29mZl9hcm1fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZGVkIHRoZXNlIG5ldyBmdW5jdGlvbnMuCisJKGdsb2JhbCk6IE1hY3JvIHJlZGVmaW5pdGlvbnMgc2V0IHVwIHRvIHVzZSB0aGVzZSBuZXcgZnVuY3Rpb25zLgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBBZGRlZCBjYWxsIHRvCisJY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkuCisJKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkZWQgY29kZSB0byBzZXQgbWFjaGluZSB0eXBlIGJhc2VkIG9uCisJYml0cyBzdG9yZWQgaW4gaW50ZXJuYWwgZmxhZ3MuCisgIAkoY29mZl9zZXRfZmxhZ3MpOiBBZGRlZCBjb2RlIHRvIHNldCB0aGUgbmV3IGJpdHMgaW4gdGhlIGZsYWdzCisJZmllbGQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgorCShmdW5jdGlvbiBkZWZpbml0aW9uIG1hY3Jvcyk6IE1hZGUgYWxsIGZ1bmN0aW9uIGRlZmluaXRpb24gbWFjcm9zCisJY29uZGl0aW9uYWwgc28gdGhhdCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRhcmdldCBzcGVjaWZpYworCWZpbGVzLgorCisJKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBBZGRlZCB0aGlzIGZ1bmN0aW9uLiAgKGFyY2hfaW5mb19zdHJ1Y3QpOgorCVN0cnVjdHVyZSBleHRlbmRlZCB0byBpbmNsdWRlIG5ldyB0eXBlcywgb25lIGVhY2ggZm9yIEFSTXYyLAorCUFSTXYyYSwgQVJNdjMsIEFSTXYzTSwgQVJNdjQgYW5kIEFSTXY0VC4KKworCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgY29mZl90ZGF0YSk6ICBBZGRlZCBmbGFncyBmaWVsZC4KKworRnJpIE1heSAgOSAxNzo0MDowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWdudSopOiBEb24ndCBpbmNsdWRlIE1hY2ggc3VwcG9ydC4KKworCSogY29uZmlnLmJmZDogQ2hhbmdlICNpZiAwIGFyb3VuZCB1c2VzIG9mIGhvc3RfYW91dF92ZWMgdG8gI2lmCisJSEFWRV9ob3N0X2FvdXRfdmVjLgorCitNb24gTWF5ICA1IDEzOjU3OjMyIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiB0aGVyZSBhcmUgbm8gc3ltZW50cywKKwlqdXN0IHJldHVybiBmYWxzZS4KKworTW9uIE1heSAgNSAxODoxODo0NSAxOTk3ICBQaGlsaXAgQmx1bmRlbGwgIDxwamIyN0BjYW0uYWMudWs+CisKKwkqIGNvbmZpZy5iZmQ6IGNvcGUgd2l0aCAnKi0qLWxpbnV4LWdudWFvdXQnIHRhcmdldHMuCisKK1RodSBNYXkgIDEgMTE6MzE6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB0YXJnbWF0Y2guc2VkOiBBZGQgZXhwbGljaXQgXG4gY2hhcmFjdGVycyB0byB3b3JrIGFyb3VuZCBidWcgaW4KKwlIUC9VWCAxMC4yMCBzZWQgcHJvZ3JhbS4KKworV2VkIEFwciAzMCAxMjoyNzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDYXN0IGNzZWNzIHRvIGF2b2lkIHNpZ24KKwlleHRlbnNpb24gcHJvYmxlbXMuCisKK1R1ZSBBcHIgMjIgMTI6MDY6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZG9fbWFpbnRhaW5lcl9jbGVhbik6IERvbid0IHJlbW92ZSBiZmQtaW4yLmguCisKK01vbiBBcHIgMjEgMTE6MjE6MzEgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGVsZjMyLW02OGsuYzogRm9sbG93IHRoZSBsYXN0IGNoYW5nZXMgaW4gZWxmMzItaTM4Ni5jOgorCShzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCwgc3RydWN0CisJZWxmX202OGtfbGlua19oYXNoX2VudHJ5LCBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlLAorCWVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSwgZWxmX202OGtfaGFzaF90YWJsZSwKKwllbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYywgZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwKKwllbGZfbTY4a19kaXNjYXJkX2NvcGllcywgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKToKKwlOZXcgZGVmaW5pdGlvbnMuCisJKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCBkb24ndCBjb3B5CisJUEMgcmVsYXRpdmUgcmVsb2NzIGZvciBhIGdsb2JhbCBzeW1ib2wgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKKwlvYmplY3QsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIGFueQorCWdsb2JhbCBzeW1ib2wuCisJKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLAorCXRyYXZlcnNlIHdpdGggZWxmX202OGtfZGlzY2FyZF9jb3BpZXMuCisKK1NhdCBBcHIgMTkgMjI6NTA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IE9ubHkgY291bnQgUEMgcmVsYXRpdmUKKwlyZWxvY3MuICBGcm9tIEphbWllIExva2llciA8amFtaWVAcmViZWxsaW9uLmNvLnVrPi4KKworCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZSB0aGUKKwlwb3RlbnRpYWwgbGFzdCBieXRlIGluIHRoZSBmaWxlIHRvIGJlIHdyaXR0ZW4gb3V0IHdoZW4KKwlDT0ZGX0lNQUdFX1dJVEhfUEUuCisKK1RodSBBcHIgMTcgMTM6NDY6NTYgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgorCisJKiBjb25maWd1cmUuaG9zdCAobWlwcyotKi1vcGVuYnNkKik6IE5ldyBob3N0LgorCitUaHUgQXByIDE3IDExOjEwOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHN1YnRyYWN0IHRoZQorCXNlY3Rpb24gVk1BIGZyb20gdGhlIHN5bWJvbCB2YWx1ZSBpZiB0aGlzIGlzIGEgZnVsbHkgbGlua2VkIGZpbGUuCisKKwkqIGVsZjMyLWkzODYuYyAoc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQpOiBEZWZpbmUuCisJKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCisJKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCisJKGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KKwkoZWxmX2kzODZfaGFzaF90YWJsZSk6IERlZmluZS4KKwkoZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkKKwlQQyByZWxhdGl2ZSByZWxvY3MgZm9yIGEgZ2xvYmFsIHN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhcgorCW9iamVjdCwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgYW55CisJZ2xvYmFsIHN5bWJvbC4KKwkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsCisJdHJhdmVyc2Ugd2l0aCBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcy4KKwkoZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWZpbmUuCisKKwlGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKKwkqIGFvdXRmMS5oIChNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisJKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBVc2UgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLgorCitXZWQgQXByIDE2IDEyOjQzOjMyIDE5OTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBlbGYzMi1kMzB2LmMgKGVsZl9kMzB2X2hvd3RvX3RhYmxlKTogQ2hhbmdlZCBzaXplIG9mCisJUl9EMzBWXzMyX05PUk1BTCB0byAyICg0IGJ5dGVzKS4KKworV2VkIEFwciAxNiAxNDowMjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKKwkqIG5ldGJzZC5oIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUuCisJKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KKwkqIG02OGtuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lIChyZXZlcnQgY2hhbmdlIG9mCisJQXByaWwgMTEpLgorCSogc3BhcmNuZXRic2QuYyAoVEFSR0VUX1BBR0VfU0laRSk6IERlZmluZSBhcyAweDIwMDAuCisJKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2V0IC5yZWxhLmJzcyBzaXplCisJdG8gc2l6ZW9mIFJlbGEgc3RydWN0dXJlLCBub3Qgc2l6ZW9mIFJlbCBzdHJ1Y3R1cmUuICBGcm9tIEdhcnkKKwlUaG9tYXMgPGcudGhvbWFzQG9wZW5ncm91cC5vcmc+LgorCitUdWUgQXByIDE1IDExOjUwOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogSWYgZW50cnlfaXNfdGV4dF9hZGRyZXNzLCBhZGp1c3QKKwl3aGVuZXZlciBlbnRyeSBpcyBsYXJnZXIgdGhhbiB0ZXh0IGFkZHJlc3MsIGJ1dCBvbmx5IGJ5IHdob2xlCisJcGFnZXMuICBGcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPi4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZQorCW1raW5zdGFsbGRpcnMgdG8gYnVpbGQgJChvbGRpbmNsdWRlZGlyKS4KKwkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGNhbGwgY2hlY2tfcmVsb2NzCisJaWYgdGhpcyBpcyBhIGRlYnVnZ2luZyBzZWN0aW9uIHdoaWNoIHdlIGFyZSBzdHJpcHBpbmcuCisKK01vbiBBcHIgMTQgMTI6Mzk6MzAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX29iamVjdF9wKTogQWxsb2NhdGUgdGhlCisJYWxwaGEtc3BlY2lmaWMgdGFyZ2V0IGRhdGEgc3RydWN0LgorCitNb24gQXByIDE0IDExOjQ1OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKKwkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KKwkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBBcHIgMTEgMTU6NDM6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBPbmx5IHN1YnRyYWN0IHRoZSBzZWN0aW9uCisJVk1BIGlmIHRoaXMgaXMgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIGEgc2hhcmVkIG9iamVjdC4KKworCSogdGFyZ2V0cy5jIChuZXRic2RfY29yZV92ZWMpOiBEZWNsYXJlLiAgRnJvbSBHb3Jkb24gVy4gUm9zcworCTxnd3JAbWMuY29tPi4KKworCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBBZGQgZW50cnlfaXNfdGV4dF9hZGRyZXNzCisJZmllbGQuCisJKiBhb3V0LXRhcmdldC5oIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgdG8gVEFSR0VUX1BBR0VfU0laRSBhdCB0aGUKKwlzdGFydCBvZiB0aGUgZmlsZS4gIFJlbW92ZSB1c2VzIGxhdGVyIG9uIHdoaWNoIHN3aXRjaCB1c2luZworCWlmZGVmLgorCShNWShjYWxsYmFjaykpOiBIYW5kbGUgZW50cnlfaXNfdGV4dF9hZGRyZXNzLgorCShNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisJKE1ZKGJhY2tlbmRfZGF0YSkpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCisJKiBpMzg2YW91dC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCisJKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgorCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCisJKiBzcGFyY2x5bnguYyAoc3BhcmNseW54X2FvdXRfYmFja2VuZCk6IExpa2V3aXNlLgorCSogbmV0YnNkLmggKFNFR01FTlRfU0laRSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkoTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzKTogRGVmaW5lLgorCSogbTY4a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgYXMgMHgyMDAwMC4KKworCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogSGFuZGxlIGltcG9ydGluZyBhIHN5bWJvbAorCXdob3NlIG5hbWUgc3RhcnRzIHdpdGggYC4nLgorCitGcmkgQXByIDExIDExOjU3OjE1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+CisKKwkqIGNvbmZpZy5iZmQ6IChpWzM0NTZdODYtKi1vcGVuYnNkKiwgbTY4Ki0qLW9wZW5ic2QqLAorCW1pcHMqZWwqLSotb3BlbmJzZCosIG1pcHMqLSotb3BlbmJzZCosIG5zMzJrLSotb3BlbmJzZCosCisJcG93ZXJwYy0qLSpic2QqLCBzcGFyYy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaW4gKGlbMzQ1Nl04Ni0qLW9wZW5ic2QqLCBtaXBzKi0qLW9wZW5ic2QqLAorCW02OCotKi1vcGVuYnNkKiwgbnMzMmstKi1vcGVuYnNkKiwgcG93ZXJwYy0qLSpic2QqLAorCXNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIEFwciAgOCAxODowOToyOSAxOTk3ICBKYW1pZSBMb2tpZXIgIDxqYW1pZUByZWJlbGxpb24uY28udWs+CisKKwkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyk6IE5ldyBmaWVsZAorCWBjdW11bGF0aXZlX3NraXBzJy4KKwkoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBGaWxsIHRoZSBhYm92ZSBhcnJheS4KKwkoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogVXNlIGBjdW11bGF0aXZlX3NraXBzJyB0bworCXNwZWVkIHVwIG9mZnNldCBjYWxjdWxhdGlvbi4KKworVHVlIEFwciAgOCAwMDowMTozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKyAgICAgICAgKiBlbGYtbW4xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogRG9uJ3QgZm9yZ2V0IHRoZQorICAgICAgICBhZGRlbmQgZm9yIG5vbiBwYy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4KKworCSogZWxmLW0xMDMwMC5jIChiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IFJlbW92ZSBwcm90b3R5cGUKKwlmb3Igbm9uLWV4aXN0ZW50IGZ1bmN0aW9uLgorCisJKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCisJKG1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgorCShtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wKTogTGlrZXdpc2UuCisJKG1uMTAzMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCisJKGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisKK01vbiBBcHIgIDcgMTY6NDc6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogU2V0IFNITElCX0xJQlMuCisJKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgU0hMSUJfTElCUy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChTSExJQl9MSUJTKTogTmV3IHZhcmlhYmxlLgorCSgkKFNITElCKSk6IFVzZSAkKFNITElCX0xJQlMpLgorCitNb24gQXByICA3IDEwOjUzOjUyIDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGJmZC1pbi5oIGJmZC1pbjIuaDogYWRkIGJmZF9zZWN0aW9uX2xtYSBtYWNybyB0byBjb3JyZXNwb25kCisJd2l0aCBiZmRfc2VjdGlvbl92bWEuCisKK0ZyaSBBcHIgIDQgMTE6Mzc6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVwZGF0ZSBmaWxlIG5hbWVzIGZvciBiZmRfZWxmMzJfbW4xMFsyM10wMF92ZWMuCisJQ29ycmVjdCBDUFUgZmlsZSBuYW1lcyBmb3IgbW4xMFsyM10wMC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogYmZkLmMgKGJmZF9yZWNvcmRfcGhkcik6IENhc3QgY291bnQgdG8gc2l6ZV90IGJlZm9yZQorCXN1YnRyYWN0aW9uLgorCisJKiBjb2ZmLXBwYy5jIChkdW1wX3RvYyk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcgZnJvbSBTdW5PUyBjYy4KKwkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX3JlYWRfYXJfaGRyKTogTGlrZXdpc2UuCisJKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBMSWtld2lzZS4KKwkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCShtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlKTogTGlrZXdpc2UuCisJKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTGlrZXdpc2UuCisJKHBlX3ByaW50X2VkYXRhLCBwZV9wcmludF9wZGF0YSwgcGVfcHJpbnRfcmVsb2MpOiBMaWtld2lzZS4KKwkqIHhjb2ZmbGluay5jICh4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IExpa2V3aXNlLgorCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KKworCSogcHBjYm9vdC5jIChwcGNib290X3NldF9hcmNoX21hY2gpOiBNYWtlIHN0YXRpYy4KKwkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgorCisJKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IFNldCBjb21wbGFpbl9vbl9vdmVyZmxvdworCXRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KKworVGh1IEFwciAgMyAxMTo1MTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIFZFUlNJT046IFNldCB0byAyLjguMS4KKworCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiAgRG9uJ3QgY2hlY2sgU0VDX0FMTE9DIHdoZW4KKwlkZWNpZGluZyB3aGV0aGVyIHRvIGNvcHkgYSByZWxvYyBpbnRvIGEgc2hhcmVkIG9iamVjdC4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuICBSZWxvY2F0ZSBSX1BQQ19SRUxBVElWRQorCXJlbG9jcyBpbiB1bmFsbG9jYXRlZCBzZWN0aW9ucy4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWxvY2F0ZQorCVJfU1BBUkNfUkVMQVRJVkUgcmVsb2NzIGluIHVuYWxsb2NhdGVkIHNlY3Rpb25zLgorCitXZWQgQXByICAyIDE2OjE5OjQxIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVbmRvIE1hcmNoIDI2IGNoYW5nZSBhbmQKKwlhbHdheXMgY3JlYXRlIGdvdCBzZWN0aW9uIHNvIHRoYXQgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBsYWJlbAorCWlzIGFsd2F5cyBjcmVhdGVkLgorCitXZWQgQXByICAyIDEwOjQ5OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMZXQgYSBjb21tb24gc3ltYm9sCisJb3ZlcnJpZGUgYW4gdW5pbml0aWFsaXplZCBzeW1ib2wgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggYQorCXNtYWxsZXIgc2l6ZS4KKworCSogZWxmLW0xMDIwMC5jOiBSZW5hbWUgZnJvbSBlbGYzMi1tbjEwMjAwLmMuCisJKiBlbGYtbTEwMzAwLmM6IFJlbmFtZSBmcm9tIGVsZjMyLW1uMTAzMDAuYy4KKwkqIGNwdS1tMTAyMDAuYzogUmVuYW1lIGZyb20gY3B1LW1uMTAyMDAuYworCSogY3B1LW0xMDMwMC5jOiBSZW5hbWUgZnJvbSBjcHUtbW4xMDMwMC5jCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgorCisJKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2N0b3I2NF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGVsZl9taXBzX2lzYSk6IE1vdmUgdG8gZWFybGllciBpbiBmaWxlLgorCShtaXBzX3JlbG9jX21hcCk6IFJlbW92ZSBCRkRfUkVMT0NfQ1RPUiBlbnRyeS4KKwkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUgorCXNwZWNpYWxseS4KKworCSogZWxmMzItbWlwcy5jIChtaXBzMTZfanVtcF9yZWxvYyk6IFByaW50IGEgd2FybmluZyByYXRoZXIgdGhhbgorCWNhbGxpbmcgYWJvcnQuCisKK1R1ZSBBcHIgIDEgMTY6MTg6MDUgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIGNvbmZpZ3VyZS5jb206IE5ldyBmaWxlLgorCSogY29uZmlnLmgtdm1zOiBSZW1vdmUgZmlsZS4KKwkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBuZXcgY29uZmlndXJlIHNjaGVtZS4KKworTW9uIE1hciAzMSAyMzoyODozOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBsaWJjb2ZmLWluLmggKHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbik6IERlY2xhcmUuCisJKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogRGVjbGFyZS4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKworCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogRGVjbGFyZSBpZiBub3QgYSBtYWNyby4KKworTW9uIE1hciAzMSAxNjoyOTo1MCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KKworICAgICAgICAqIGNvbmZpZy5iZmQgKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCisKK01vbiBNYXIgMzEgMTY6MTE6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCB1c2Ugc3ltbmR4IGFzIGEKKwlzeW1ib2wgaW5kZXggZm9yIGEgUl9JSENPTlNUIHJlbG9jLgorCitNb24gTWFyIDMxIDE1OjQwOjU5IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIHRhcmdtYXRjaC5zZWQ6IERvIG5vdCB1c2UgXChcKSByZWN1cnNpdmVseS4KKworRnJpIE1hciAyOCAxNDo0NDowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBtNjhrbGludXguYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCisJKiBpMzg2bGludXguYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCisKK0ZyaSBNYXIgMjggMTE6NTY6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGNhaXAucnV0Z2Vycy5lZHU+IGFuZCBILkouIEx1CisJPGhqbEBnbnUuYWkubWl0LmVkdT46CisJKiBzcGFyY2xpbnV4LmM6IE5ldyBmaWxlLgorCSogYmZkLWluLmggKGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBjb25maWcuYmZkIChzcGFyYy0qLWxpbnV4YW91dCosIHNwYXJjLSotbGludXgqKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaW4gKHNwYXJjbGludXhfdmVjKTogQWRkIHRvIGxpc3Qgb2YgdmVjdG9ycy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIHRhcmdldHMuYyAoc3BhcmNsaW51eF92ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzcGFyY2xpbnV4X3ZlYy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgc3BhcmNsaW51eC5vLgorCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgc3BhcmNsaW51eC5jLgorCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldworCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YSBmaWVsZC4KKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBiZmRfZWxmNjRfe2JpZyxsaXR0bGV9bWlwc192ZWMgdG8gdGFyZ19zZWx2ZWNzCisJZm9yIG1pcHMqZWwqLSotbGludXgqIGFuZCBtaXBzKi0qLWxpbnV4Ki4gIEZyb20gSC5KLiBMdQorCTxoamxAbHVjb24ub3JnPiBhbmQgUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1Pi4KKworCSogYmZkLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KKwkoc3RyZXJyb3IpOiBEb24ndCBkZWNsYXJlLgorCShiZmRfZXJybXNnKTogQ2FsbCB4c3RyZXJyb3IgcmF0aGVyIHRoYW4gc3RyZXJyb3IuCisKK1RodSBNYXIgMjcgMTI6NTU6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGEgQ09QWQorCXJlbG9jIGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLmJzcyBzZWN0aW9uLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgorCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisKKwkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKKwlfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlci4KKwkoYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcik6IERlZmluZS4KKwkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpbWl0IGFsaWdubWVudCBvZiBhIGNvbW1vbgorCXN5bWJvbCB0byB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudC4KKworCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgorCitUaHUgTWFyIDI3IDAwOjQ1OjU3IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1kMzB2LmMgKGVsZl9kMzB2X2hvd3RvX3RhYmxlKTogRml4IGEgdHlwbyBpbiB0aGUKKwkyMS1iaXQgYWJzb2x1dGUgdGhhdCBtYWRlIGl0IGFjdCBhcyBhIHJlbGF0aXZlLgorCitXZWQgTWFyIDI2IDE0OjUwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEb24ndCBzZXQKKwlic3Nfc2VjdGlvbiBhbmQgcmVsX3NlY3Rpb24gZnJvbSBleGlzdGluZyBzZWN0aW9ucy4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogT25seSBjcmVhdGUgdGhlIGdvdCBzZWN0aW9uCisJaWYgaXQgaXMgbmVlZGVkLgorCitUdWUgTWFyIDI1IDIyOjI2OjU2IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBDaGFuZ2UgZXhlY3V0YWJsZSB0ZXN0IHRvIGZpeAorCXByb2JsZW1zIHdpdGggZW1iZWRkZWQgYS5vdXQgc3lzdGVtcy4KKworVHVlIE1hciAyNSAxNDozNTozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLmMgKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IE5ldyBmdW5jdGlvbi4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBZGp1c3QgdGhlIG9mZnNldCBvZiBhCisJc3RhYiByZWxvYy4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogQ29weSBvdmVyIHRoZSBmaXJzdCBoZWFkZXIKKwlzeW1ib2wuICBDaGVjayBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvZiAqcHNpbmZvLgorCShfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBBZGQgcHNpbmZvIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLiAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIHN5bWJvbC4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKworTW9uIE1hciAyNCAyMDowNzoyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IEFkZCBSX0FCUyBlbnRyeS4KKwkocnR5cGUyaG93dG8pOiBIYW5kbGUgUl9BQlMgcmVsb2MgdHlwZS4gIEFsc28gYWJvcnQgb24gdW5oYW5kbGVkCisJcmVsb2MgdHlwZXMsIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgdG8gZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUuCisKK01vbiBNYXIgMjQgMTM6NDE6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB0YXJnbWF0Y2guc2VkOiBVc2UgdGhlIGhvbGQgc3BhY2UgdG8gcHV0IHRoZSAjaWZkZWYgYXJvdW5kIHRoZQorCXRoZSBzdHJpbmcgY29uc3RhbnQuCisJKiB0YXJnZXRzLmMgKFVOU1VQUE9SVEVEX1RBUkdFVCk6IERvbid0IGRlZmluZS4KKwkoZmluZF90YXJnZXQpOiBEb24ndCBjaGVjayBmb3IgVU5TVVBQT1JURURfVEFSR0VULgorCShiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0KTogRG9uJ3QgdHJ5IHRvIG9wdGltaXplIGJ5IGNoZWNraW5nIGZvcgorCWRlZmF1bHQuCisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LW0zMnIuYy4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLW0zMnIuYy4KKwkoZWxmMzItbTMyci5vKTogUmVtb3ZlIGV4cGxpY2l0IHRhcmdldC4KKworCSogY29uZmlnLmJmZDogRG9uJ3Qgc2V0IHRhcmdfdW5kZXJzY29yZSBmb3IgaVszNDU2XTg2LSotZ251KiBvcgorCWlbMzQ1Nl04Ni0qLWxpbnV4Ki4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QKKwljb3VudCBzZWN0aW9uIHN5bWJvbHMgZm9yIHNlY3Rpb25zIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IHRoZQorCWxpbmtlciwgb3IgYXJlIG5vdCBhbGxvY2F0YWJsZSBvciBub3QgbG9hZGFibGUuCisJKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT3V0cHV0IG91dHB1dCBzZWN0aW9uCisJc3ltYm9scyBmb3Igc2VjdGlvbiBmb3Igd2hpY2ggd2UgbWFkZSBzcGFjZSBmb3IgdGhlbS4KKworRnJpIE1hciAyMSAxMzowODoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZXJlIGlzCisJbm8gLnJlbGEucGx0IHNlY3Rpb24sIGRvbid0IG91dHB1dCBhIERUX1BMVEdPVCBkeW5hbWljIGVudHJ5LgorCitGcmkgTWFyIDIxIDEyOjM2OjQ2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfaG93dG9fdGFibGUpOiBVc2Ugc3BlY2lhbCBmdW5jdGlvbiBmb3IgTE8xNi4KKwkobTMycl9oaTE2X2xpc3QpOiBOZXcgc3RhdGljIGxvY2FsLgorCShtMzJyX2VsZl9oaTE2X3JlbG9jKTogRG9uJ3QgcGVyZm9ybSByZWxvYywganVzdCBxdWV1ZSBpdCB1cC4KKwkobTMycl9lbGZfZG9faGkxNl9yZWxvYyk6IERlbGV0ZS4KKwkobTMycl9lbGZfcmVsb2NhdGVfaGkxNik6IE5ldyBmdW5jdGlvbi4KKwkobTMycl9lbGZfbG8xNl9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KKwkobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBISTE2IHJlbG9jcywgc2NhbiBmb3IgY29ycmVzcG9uZGluZworCUxPMTYgcmVsb2MuCisKKwlNb24gTWFyIDEwIDE2OjAzOjMxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERlbGV0ZS4KKwkobTMycl9lbGZfYWRkX3N5bWJvbF9ob29rKTogUmV3cml0ZSBfU0RBX0JBU0VfIHN1cHBvcnQuCisJKG0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlKTogTmV3IGZ1bmN0aW9uLgorCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV3cml0ZSBzZGF0YSBzdXBwb3J0LgorCShtMzJyX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERlbGV0ZS4KKworVGh1IE1hciAyMCAxMjozOTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KKwkqIGNvZmYtc3ZtNjhrLmM6IE5ldyBmaWxlLiAgSnVzdCBkZWZpbmVzIHNvbWUgbWFjcm9zIGFuZCBpbmNsdWRlcworCWNvZmYtbTY4ay5jLgorCSogY29mZi1tNjhrLmM6IEFkZCBmdW5jdGlvbnMgdG8gaGFuZGxlIGNvbW1vbiBhZGRlbmRzLCBtb3ZlZCBpbgorCWZyb20gY2YtbTY4a2x5bnguYy4gIENvbnRyb2wgdGhlbSB1c2luZyBDT0ZGX0NPTU1PTl9BRERFTkQgbWFjcm8uCisJQ29udHJvbCB3aGV0aGVyIHJlbG9jcyBhcmUgdmlzaWJsZSB1c2luZyBTVEFUSUNfUkVMT0NTLgorCSogY2YtbTY4a2x5bnguYzogU2ltcGxpZnkgZ3JlYXRseToganVzdCBkZWZpbmUgbWFjcm9zIHRvIGNvbnRyb2wKKwljb2ZmLW02OGsuYy4KKwkqIGNvZmYtYXV4LmM6IExpa2V3aXNlLiAgSnVzdCBsZWF2ZSBhZGRfb25lX3N5bWJvbCByb3V0aW5lLgorCSogdGFyZ2V0cy4gKG02OGtzeXN2Y29mZl92ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBtNjhrc3lzdmNvZmZfdmVjLgorCSogY29uZmlnLmJmZCAobTY4Ki1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKG02OGtzeXN2Y29mZl92ZWMpOiBOZXcgdmVjdG9yLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1zdm02OGsuby4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGNvZmYtc3ZtNjhrLmMuCisKKwkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBnZXQgbWlzbGVkIGlmIHRoZQorIAlmaXJzdCBzZWN0aW9uIGlzIG5vdCBsb2FkYWJsZS4gIEZyb20gTWF0dGhldyBMLiBNYXJ0aW4KKyAJPG1sbUB4ZWRpYS5jb20+LgorCisJKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IFNldCB0aGUgdmFsdWUgb2YgYSBzZWN0aW9uCisJc3ltYm9sIHRvIHRoZSBzZWN0aW9uIGFkZHJlc3MgdW5sZXNzIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuCisKK1R1ZSBNYXIgMTggMjM6MDM6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNyZWF0ZQorCS5wbHQgZW50cnkgaWYgd2UndmUgdGFrZW4gdGhlIGZ1bmN0aW9uJ3MgYWRkcmVzcy4KKwkoZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyk6IE1lcmdlIGNvbGxlY3RlZCBmbGFncyBpbmZvIGFzIHdlbGwuCisKK1R1ZSBNYXIgMTggMjI6NDA6MDkgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+CisKKwkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgorCSogY3B1LW02OGsuYyAoYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCk6IERvbid0IGRlY2xhcmUuCisJKiBlY29mZmxpbmsuYzogSW5jbHVkZSAibGliY29mZi5oIiBhbmQgImxpYmVjb2ZmLmgiLgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IE1ha2Ugc3RhdGljLgorCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IENoYW5nZSBzdHJlYW0gcGFyYW1ldGVyIHRvIFBUUi4KKwkqIHBlaWNvZGUuaDogQ2hhbmdlIHNldmVyYWwgdm9pZCAqIHBhcmFtZXRlcnMgdG8gUFRSLgorCSogc3JlYy5jIChzcmVjX2dldF9zeW1ib2xfaW5mbyk6IE1ha2Ugc3RhdGljLgorCSogc3ltcy5jIChiZmRfc3ltYm9sX2lzX2Fic29sdXRlKTogUmVtb3ZlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCitUdWUgTWFyIDE4IDEyOjU4OjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogUmVtb3ZlLgorCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVmaW5lLgorCisJKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IENhbGwgYmZkX21hbGxvYyByYXRoZXIKKwl0aGFuIG1hbGxvYy4KKworTW9uIE1hciAxNyAxMTozMjo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZC1pbi5oOiBEb24ndCBpbmNsdWRlIG9ic3RhY2suaC4KKwkoc3RydWN0IGJmZF9oYXNoX3RhYmxlKTogQ2hhbmdlIG1lbW9yeSBmaWVsZCB0byBQVFIuCisJKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBDaGFuZ2UgbWVtb3J5IGZpZWxkIHRvIFBUUi4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIGxpYmJmZC1pbi5oIChiZmRfcmVsZWFzZSk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIGRvbid0IGRlZmluZSBhcworCW1hY3JvLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBvcG5jbHMuYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKKwlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgorCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCisJKGdldHBhZ2VzaXplKTogRG9uJ3QgZGVmaW5lLgorCShfYmZkX25ld19iZmQpOiBEb24ndCBzZXQgX2JmZF9jaHVua3NpemUuCisJKGJmZF9vcGVucik6IEZyZWUgbmV3IGJmZCBhbmQgb2JqYWxsb2Mgb24gZmFpbHVyZS4KKwkoYmZkX2Zkb3BlbnIsIGJmZF9vcGVuc3RyZWFtciwgYmZkX29wZW53KTogTGlrZXdpc2UuCisJKGJmZF9hbGxvY19zaXplKTogUmVtb3ZlLgorCShiZmRfcmVsZWFzZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGhhc2guYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKKwlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgorCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCisJKiBlY29mZmxpbmsuYzogSW5jbHVkZSAib2JqYWxsb2MuaCIgcmF0aGVyIHRoYW4gIm9ic3RhY2suaCIuICBVc2UKKwlvYmphbGxvYyByb3V0aW5lcyByYXRoZXIgdGhhbiBvYnN0YWNrIHJvdXRpbmVzLgorCShvYnN0YWNrX2NodW5rX2FsbG9jLCBvYnN0YWNrX2NodW5rX2ZyZWUpOiBEb24ndCBkZWZpbmUuCisJKHN0cnVjdCBhY2N1bXVsYXRlKTogQ2hhbmdlIG1lbW9yeSB0byBzdHJ1Y3Qgb2JqYWxsb2MgKi4KKwkqIGxpYm9hc3lzLmggKG9hc3lzX2RhdGFfdHlwZSk6IFJlbW92ZSBvYXN5c19vYnN0YWNrIGZpZWxkLgorCSogZGVwLWluLnNlZDogRG9uJ3QgcmVtb3ZlIG9ic3RhY2suaCBmcm9tIGRlcGVuZGVuY3kgbGlzdC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQkZEX0hfREVQUyk6IFJlbW92ZSBvYnN0YWNrLmguCisJKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIG9ic3RhY2suaC4KKwkqIE1hbnkgZmlsZXM6IERvbid0IGluY2x1ZGUgIm9ic3RhY2suaCIuCisJKiBWRVJTSU9OOiBCdW1wLgorCisJKiBvcG5jbHMuYyAoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvY19maW5pc2gpOiBSZW1vdmUuCisJKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jX2dyb3csIGJmZF9hbGxvY19maW5pc2gpOiBEb24ndCBkZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBpZWVlLmMgKGllZWVfYXJjaGl2ZV9wKTogUmV3cml0ZSB0byBub3QgdXNlIGJmZF9hbGxvY19ncm93LgorCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IExpa2V3aXNlLgorCSogc3JlYy5jIChzcmVjX3NjYW4pOiBSZXdyaXRlIHRvIG5vdCB1c2Ugb2JzdGFja18xZ3Jvdy4KKworCSogb3BuY2xzLmMgKGJmZF9hbGxvYyk6IFJlbmFtZSBmcm9tIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZW1vdmUKKwlvbGQgdmVyc2lvbiBvZiBiZmRfYWxsb2MuCisJKiBsaWJiZmQtaW4uaCAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IERvbid0IGRlY2xhcmUuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKwkqIFNldmVyYWwgZmlsZXM6IENhbGwgYmZkX2FsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvY19ieV9zaXplX3QuCisKK1NhdCBNYXIgMTUgMTU6MjQ6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBBY2NlcHQgdGhlIGdlbmVyaWMKKwlFTEYgbG9jYWwgbGFiZWwgc3ludGF4IGFzIHdlbGwuCisKK1NhdCBNYXIgMTUgMTA6MTY6NDIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQgKHBvd2VycGMtKi1iZW9zKik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1iZW9zKik6IEFkZCBjYXNlIHRoYXQgZXhwbGljaXRseQorCWRvZXMgbm90IHNldCBDT1JFRklMRSBmb3Igbm93LiAgQSBmdXR1cmUgQmVPUyB2ZXJzaW9uIGlzCisJZXhwZWN0ZWQgdG8gc3VwcG9ydCBjb3JlIGZpbGVzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCisKK0ZyaSBNYXIgMTQgMTY6NDM6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEdpdmUgYW4gZXJyb3IgaWYgQ0FMTDE2IGlzCisgCXNlZW4gd2l0aCBhIGxvY2FsIHN5bWJvbCwgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCisKKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHRyeSB0byByZWFkIHRoZQorCXZlcnNpb24gc3ltYm9scyBpZiB0aGVyZSBhcmVuJ3QgYW55LgorCitUaHUgTWFyIDEzIDE2OjM4OjMwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXRpYzgwLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWZpbmUKKwkoY29mZl90aWM4MF9ydHlwZV90b19ob3d0byk6IENsb25lIGdlbmVyaWMgY29mZiB2ZXJzaW9uIGFuZAorCWFkZCBjb2RlIHRvIGhhbmRsZSB0aGUgZnVua3kgVEkgImludGVybmFsIHJlbG9jYXRpb25zIi4KKworVGh1IE1hciAxMyAxNDowODo1MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3Qgd2FybiBhYm91dCB0eXBlCisJb3Igc2l6ZSBjaGFuZ2VzIGJlY2F1c2Ugb2YgYSB3ZWFrIHN5bWJvbC4KKworCSogY2lzY28tY29yZS5jIChTSUdFTVQpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisKK1dlZCBNYXIgMTIgMjE6MzY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBleHRzeW1vZmYgd2hlbgorCXNldHRpbmcgZXZlci4gIFNhbml0eSBjaGVjayB0aGUgdmVyc2lvbiBudW1iZXIuICBTb3J0IG91dCBjb3B5aW5nCisJZmxhZ3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIHdoZW4gYWRkaW5nIGFuIGluZGlyZWN0IHN5bWJvbC4KKwkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBQcmVzZXJ2ZSBhbnkgZHluYW1pYworCXN5bWJvbHMgYWRkZWQgYnkgdGhlIGJhY2tlbmQuICBDbGVhciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZQorCXZlcnN5bSBzZWN0aW9uLgorCShlbGZfZXhwb3J0X3N5bWJvbCk6IElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQWNjZXB0IGEgc2VjdGlvbiB3aXRob3V0IGFuIG93bmVyIGluIGFuCisJYXNzZXJ0LgorCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIGEgc2FuaXR5IGNoZWNrIG9uIHRoZQorCXZlcnNpb24gY291bnQuICBDb3JyZWN0IHRoZSBhbGxvY2F0aW9uIG9mIHhfdmVyc3ltcC4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEb24ndCBzZXQgdGhlIG93bmVyIG9mCisJdGhlIG1hZ2ljIHNlY3Rpb25zIHVzZWQgZm9yIFNITl9NSVBTX1RFWFQgYW5kIFNITl9NSVBTX0RBVEEuCisJRG9uJ3QgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHIgd2hlbiBpbmZvLT5zaGFyZWQuCisJKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBTZXQgdGhlIGFsaWdubWVudCBvZiAucnRwcm9jIHRvIDQsIG5vdCAxMi4KKwkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3JyZWN0IHR5cGU6IF49IGZvciAmPS4KKwkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogUmVzb2x2ZSBhbiBpbmRpcmVjdCBzeW1ib2wgaW4KKwlzeW1faGFzaGVzLgorCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjaGFuZ2UgU0hOX0FCUyBpbnRvCisJU0hOX01JUFNfVEVYVCBvciBTSE5fTUlQU19EQVRBLgorCisJKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBUd2VhayB2ZXJzaW9uIG91dHB1dCBzbGlnaHRseS4KKworVHVlIE1hciAxMSAwMTozODozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46CisJKiBlbGYtYmZkLmggKEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCk6IERlZmluZS4KKwkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IENvcnJlY3QgZXJyb3JzIGluIGxhc3QgY2hhbmdlLgorCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgY2FzZXMgaW4gd2hpY2ggYQorCXZlcnNpb25lZCBzeW1ib2wgYXBwZWFycyBpbiBib3RoIGEgcmVndWxhciBhbmQgYSBzaGFyZWQgb2JqZWN0LgorCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBTZXQgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMIHdoZW4KKwlhcHByb3ByaWF0ZS4gIEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KKwkoc3RydWN0IGVsZl9vdXRleHRfaW5mbyk6IFJlbmFtZSBmcm9tIGVsZl9maW5mb19mYWlsZWQuICBDaGFuZ2UKKwlhbGwgdXNlcy4gIEFkZCBsb2NhbHN5bXMgZmllbGQuCisJKGVsZl9iZmRfZmluYWxfbGluayk6IFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBjYWxsCisJZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0byBvdXRwdXQgYWxsIGxvY2FsIHN5bWJvbHMuCisJKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBIYW5kbGUgc3ltYm9scyB3aGljaCB3ZXJlIGZvcmNlZCB0bworCWJlY29tZSBsb2NhbC4KKworU3VuIE1hciAgOSAyMzowODo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46CisJKiBlbGYtYmZkLmggKGVsZl9zeW1ib2xfdHlwZSk6IEFkZCB2ZXJzaW9uIGZpZWxkLgorCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IHZlcnNpb24gZmllbGQuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gY3JlYXRpbmcgYW4KKyAJaW5kaXJlY3Qgc3ltYm9sIGZvciBhIGRlZmF1bHQgdmVyc2lvbiBzeW1ib2wsIHNldCBERUZfRFlOQU1JQyBpZgorIAlhcHByb3ByaWF0ZS4gIFNldCB1cCBhbiBpbmRpcmVjdGlvbiBmcm9tIHRoZSBub25kZWZhdWx0IHZlcnNpb24gb2YKKwl0aGUgc3ltYm9sIGFzIHdlbGwuCisJKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FsbAorCWVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbiBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGVyZSBhcmUgYW55CisJdmVyc2lvbnMuICBBbHdheXMgcmVjb3JkIHRoZSB2ZXJzaW9uIG5hbWUgYXMgYSBkeW5hbWljIHN5bWJvbC4KKwlJbml0aWFsaXplIGNvdW50ZXJzLgorCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBBZnRlciBmaW5kaW5nIGEgdmVyc2lvbiwgc2VlIGlmIGEKKwlzeW1ib2wgc2hvdWxkIGJlIGZvcmNlZCB0byBsb2NhbCBzY29wZS4gIENyZWF0ZSBhIG5ldyB2ZXJzaW9uCisJZGVmaW5pdGlvbiBpZiBhcHByb3ByaWF0ZS4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENvcnJlY3QgaW5kaXJlY3Qgc3ltYm9sIGhhbmRsaW5nLgorCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKwkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVHVybiB2ZXJzaW9uIHNlY3Rpb25zIGludG8gQkZEIHNlY3Rpb25zLgorCShlbGZfZmFrZV9zZWN0aW9ucyk6IE9ubHkgY29weSBjdmVyZGVmcyBhbmQgY3ZlcnJlZnMgaW50byBzaF9pbmZvCisJaWYgc2hfaW5mbyBpcyBub3QgYWxyZWFkeSBzZXQuCisJKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDb3B5IHNoX2luZm8gZm9yIHZlcnNpb24KKwlzZWN0aW9ucy4KKwkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBUZWxsCisJX2JmZF9zdHJpbmd0YWJfYWRkIHRvIGNvcHkgdGhlIG5hbWUgaW50byBwZXJtYW5lbnQgbWVtb3J5IGlmCisJYXBwcm9wcmlhdGUuCisKK0ZyaSBNYXIgIDcgMTE6NTU6MzEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogZWxmNjQtYWxwaGEuYyAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3ApOiBGdWxseSBwYXJlbnRoZXNpemUuCisKK0ZyaSBNYXIgIDcgMTA6Mzc6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2UKKwlfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIHRvIHJldHVybiBhIGJvb2xlYW4KKwl2YWx1ZS4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8KKwlib29sZWFuLiAgSWYgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbiBjaGFuZ2VkLCB0aGVuIG91dHB1dCBhCisJemVybyBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisKKwkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQWx3YXlzIGFsbG9jYXRlIHNwYWNlCisJZm9yIGF0IGxlYXN0IDYgb3V0cHV0IHN5bWJvbHMuCisJKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBXaGVuIGVtaXR0aW5nIFRPQyBlbnRyeSByZWxvY3MsIGFsc28KKwllbWl0IGEgVEMgY3NlY3QgdG8gcmVwcmVzZW50IHRoZSBzcGFjZSB0aGV5IHRha2UgdXAuICBGb3IgYW4gWE8KKwlzeW1ib2wsIGp1c3QgZW1pdCBhIHJlZmVyZW5jZSwgbm90IGEgY3NlY3QuCisKKwkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBKdXN0IHVzZSBsbiAtcywgbm90IGxuIC1zZiwgc2luY2UKKwlTb2xhcmlzIGRvZXNuJ3QgbGlrZSB0aGUgY29tYmluZWQgb3B0aW9ucywgYW5kIHRoZSAtZiBpcworCXVubmVjZXNzYXJ5LgorCShzdGFtcC10c2hsaW5rLCBpbnN0YWxsKTogTGlrZXdpc2UuCisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcnJlY3QgUl9NSVBTMTZfMjYKKwloYW5kbGluZyB3aGVuIGxpdHRsZSBlbmRpYW4uCisKK1RodSBNYXIgIDYgMTM6NTE6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi1tbjEwMzAwLmMgKG1uMTAzMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCisJKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KKworCSogZWxmMzItbW4xMDMwMC5jIChyZWxvY190eXBlKTogUmVtb3ZlIFBDUkVMezgsMTYsMzJ9X3sxLDJ9QllURQorCXJlbG9jcy4gIFJlcGxhY2UgdGhlbSB3aXRoIGdlbmVyaWMgUENSRUxfezgsMTYsMzJ9IHJlbG9jcy4KKwkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgorCShlbGYzMl9tbjEwMzAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCisKK1RodSBNYXIgIDYgMTI6MTk6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmYtdGljODAuYyAocnR5cGUyaG93dG8pOiBJZiBwYXNzZWQgYSByZWxvY2F0aW9uIHR5cGUgd2UgZG9uJ3QKKwl1bmRlcnN0YW5kLCBqdXN0IHNldCB0aGUgaG93dG8gZmllbGQgdG8gTlVMTCwgYW5kIHRoZSBjYWxsZXIgd2lsbAorCXByaW50IGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUHVsbCBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIGFuZAorCWNvZGUgZnJhZ21lbnQgb3V0IG9mIGJvdGggbGVncyBvZiAjaWZkZWYgUkVMT0NfUFJPQ0VTU0lORyAuLi4gI2VuZGlmCisJYmxvY2suICBVc2UgTlVMTCBmb3IgaW5pdGlhbGl6YXRpb25zIG9mICJwdHIiIHJhdGhlciB0aGFuIGJhcmUgMC4KKwkqIGNvZmYtaDgzMDAuYzogRml4IHR5cG8gaW4gY29tbWVudC4KKwkqIGNvZmYtaDg1MDAuYzogRGl0dG8uCisJKiBjb2ZmLXc2NS5jOiBEaXR0bworCSogY29mZi16OGsuYzogRGl0dG8uCisKK1dlZCBNYXIgIDUgMTM6NTk6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MpOiBGaXggb3ZlcmZsb3cgY2FsYy4KKwkobTMycl9lbGZfcmVsYXhfc2VjdGlvbiwgbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzLAorCW0zMnJfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEZpcnN0IHBhc3MgYXQgcmVsYXggc3VwcG9ydC4KKworTW9uIE1hciAgMyAxMzoyNzowOSAxOTk3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGNvcnJlY3Qgc2hfc2l6ZQorCWVudHJ5IGZvciByZWFkaW5nIHZlcmRlZiByZWNvcmRzLgorCVVzZSBjb3JyZWN0IGJyYWNlcyBmb3IgY29tcHV0aW5nIGluY3JlbWVudHMgb2YgZXh0dmVyZGF1eCBhbmQKKwlleHRldmVyZGVmIHJlY29yZCBwb2ludGVycy4KKworU3VuIE1hciAgMiAyMjo0Nzo1NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29mZi10aWM4MC5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBTZXQgdGhpcyB0byAyCisJaW5zdGVhZCBvZiA0LgorCitTdW4gTWFyICAyIDE2OjI1OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogQ2hlY2sgdGhhdAorCURFRl9SRUdVTEFSIGlzIG5vdCBzZXQgYXMgd2VsbCBhcyBjaGVja2luZyB0aGF0IERFRl9EWU5BTUlDIGlzCisJc2V0LgorCitGcmkgRmViIDI4IDE2OjUyOjQwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9mbGFncyk6IEFkZCBjYXNlIGZvciBUSUM4MF9BUkNIX01BR0lDLgorCitGcmkgRmViIDI4IDE1OjA2OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0cy5jIChiZmRfZGVmYXVsdF92ZWN0b3IpOiBNYWtlIG5vbi1jb25zdC4KKwkoZmluZF90YXJnZXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCisJYmZkX2ZpbmRfdGFyZ2V0LgorCShiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uLgorCShiZmRfZmluZF90YXJnZXQpOiBDYWxsIGZpbmRfdGFyZ2V0LiAgV2hlbiBkZWZhdWx0aW5nLCB1c2UKKwliZmRfZGVmYXVsdF92ZWN0b3JbMF0gaWYgaXQgaXMgbm90IE5VTEwuCisJKiBsaWJiZmQtaW4uaCAoYmZkX2RlZmF1bHRfdmVjdG9yKTogQWRqdXN0IGRlY2xhcmF0aW9uLgorCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KKworCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBSZXR1cm4gZmFsc2UgaWYgdGhlIHN5bWJvbCBoYXMgbm8KKwluYW1lLgorCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgorCSogY29mZi1tNjhrLmMgKG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgorCSogY29mZi1yczYwMDAuYyAoeGNvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KKwkqIGVsZi5jIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogVHJlYXQgc3ltYm9scyBiZWdpbm5pbmcKKwl3aXRoIC4uIG9yIF8uTF8gYXMgbG9jYWwuCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KKwkqIGV2YXgtYWxwaGEuYyAoZXZheF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFRyZWF0IHN5bWJvbHMKKwliZWdpbm5pbmcgd2l0aCAkIGFzIGxvY2FsLgorCitUaHUgRmViIDI3IDE4OjM2OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKKwlyYXRoZXIgdGhhbiBjb21wYXJpbmcgYWdhaW5zdCBpbmZvLT5scHJlZml4LgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgorCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KKworCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBhcworCV9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KKwkqIGVsZi5jIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCSogZWxmLWJmZC5oIChfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KKworCSogY29mZi1tODhrLmMgKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCisJKG04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUgYXMKKwlfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCSogY29mZmdlbi5jIChfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGxpYmNvZmYtaW4uaCAoX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCisJKiB0YXJnZXRzLmMgKEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMpOiBDaGFuZ2UgX2JmZF9pc19sb2NhbF9sYWJlbAorCXRvIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZS4KKwkoYmZkX3RhcmdldCk6IExpa2V3aXNlLgorCSogc3ltcy5jIChiZmRfaXNfbG9jYWxfbGFiZWwpOiBEZWZpbmUgYXMgZnVuY3Rpb24sIG5vdCBtYWNyby4KKwkoYmZkX2lzX2xvY2FsX25hbWUpOiBEZWZpbmUuCisJKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IFJlbmFtZSBmcm9tCisJYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwsIGFuZCB0YWtlIGEgc3RyaW5nIHJhdGhlciB0aGFuIGEKKwlzeW1ib2wuCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVmaW5lLgorCShfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KKyAJKGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsKTogRG9uJ3QgZGVjbGFyZS4KKwkoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2UgbG9jYWxfbGFiZWwgdG8gbG9jYWxfbGFiZWxfbmFtZS4KKworCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19nb3RfaW5mbyk6IEFkZCBhc3NpZ25lZF9nb3RubyBmaWVsZC4KKwkobWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCisJRG9uJ3QgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IHplcm8gZW50cnkgaXMgdW5hc3NpZ25lZDsgaW5zdGVhZCwgdXNlCisJYXNzaWduZWRfZ290bm8uCisJKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKKwltaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwuCisJKG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEluaXRpYWxpemUgYXNzaWduZWRfZ290bm8gZmllbGQuCisKK1dlZCBGZWIgMjYgMTU6MTk6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQWRkIGNvZGUgdG8gZG8gMzItYml0CisJcmVsb2NhdGlvbnMuCisKK1dlZCBGZWIgMjYgMTM6MzM6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNraXAgc3ltYm9scyBmcm9tIHNlY3Rpb25zCisJdGhhdCBoYXZlIG5vIGNvbnRlbnRzIG1lcmVseSBiZWNhdXNlIGxpbmtlcl9tYXJrIGlzIG5vdCBzZXQuCisKK1R1ZSBGZWIgMjUgMTg6NTE6MzUgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkIChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBhc3NlcnQgY29tcGFyZQorCWNvbnRlbnQgYnl0ZW9yZGVyIGluc3RlYWQgb2YgaGVhZGVyIGJ5dGVvcmRlci4KKwkoZWNvZmZfYmlnbGl0dGxlX3ZlYyk6IE5ldyBCRkQsIGJpZy1lbmRpYW4gaGVhZGVycywgbGl0dGxlLWVuZGlhbgorCWRhdGEuCisJKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGVjb2ZmX2JpZ2xpdHRsZV92ZWMuCisJKiBjb25maWd1cmUuaW4gKGVjb2ZmX2JpZ2xpdHRsZV92ZWMpOiBBZGQgY2FzZS4KKwkqIGNvbmZpZ3VyZTogVXBkYXRlLgorCitUdWUgRmViIDI1IDAwOjMyOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogVXNlIFNIVF9OT1RFIGZvciBhbnkgc2VjdGlvbiB3aG9zZQorCW5hbWUgYmVnaW5zIHdpdGggIi5ub3RlIi4KKwkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogQWRkIGEgUFRfTk9URSBzZWdtZW50IGZvciBhbnkgbG9hZGFibGUKKwlzZWN0aW9uIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggIi5ub3RlIi4KKwkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgZm9yIG1pc2FsaWduZWQKKwlqYWwgYW5kIGZvciBqYWwgb3ZlcmZsb3cuCisKK01vbiBGZWIgMjQgMTc6NTM6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgorCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSWYgYSBkZWZhdWx0IHN5bWJvbCBpcworCW5vdCBmb3VuZCwgdHJ5IGxvb2tpbmcgaXQgdXAgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbiBuYW1lLgorCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBBbHdheXMgbGluayBhZ2FpbnN0IHRoZSBkeW5hbWljCisJc3ltYm9sIHRhYmxlIG9mIGEgZHluYW1pYyBvYmplY3QuICBXaGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMKKwlvYmplY3QsIGluY2x1ZGUgdmVyc2lvbiBzdHJpbmdzIGluIHN5bWJvbCBuYW1lcywgYW5kIHNldCB1cAorCXZlcnNpb24gaW5mb3JtYXRpb24uICBBZGQgaW5kaXJlY3Qgc3ltYm9scyBmb3IgZGVmYXVsdCB2ZXJzaW9ucy4KKwkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGQgc3BlY2lhbCB2ZXJzaW9uIHNlY3Rpb25zLgorCShzdHJ1Y3QgZWxmX2Fzc2lnbl9zeW1fdmVyc2lvbl9pbmZvKTogRGVmaW5lLgorCShzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8pOiBEZWZpbmUuCisJKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHZlcmRlZnMgcGFyYW1ldGVyLiAgU2V0CisJdXAgdmVyc2lvbiBzZWN0aW9ucy4KKwkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLgorCShlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvKTogQWRkIHN5bXZlcl9zZWMgZmllbGQuCisJKGVsZl9iZmRfZmluYWxfbGluayk6IEluaXRpYWxpemUgZmluZm8uc3ltdmVyX3NlYy4gIERvbid0IGNvdW50CisJbG9jYWwgc3ltYm9scyBvZiBhIGR5bmFtaWMgb2JqZWN0LiAgSGFuZGxlIERUX1ZFUiogY29uc3RhbnRzLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2ltcGxpZnkgQkZEX0FTU0VSVCBjaGVja2luZyBmb3IgYQorCWR5bmFtaWMgb2JqZWN0LiAgU2tpcCBpbmRpcmVjdCBzeW1ib2xzIGZyb20gRUxGIG9iamVjdHMuICBSZW1vdmUKKwl0aGUgdmVyc2lvbiBuYW1lIGJlZm9yZSBjaG9vc2luZyBhIGhhc2ggYnVja2V0LiAgV3JpdGUgb3V0IHRoZQorCXZlcnNpb24gaW5mb3JtYXRpb24gaWYgYXBwcm9wcmlhdGUuCisJKGVsZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGZvciBEWU5BTUlDLCBub3QgRVRfRFlOLgorCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgdmVyaW5mbyBmaWVsZC4KKwlDaGFuZ2UgZWxmX2xpbmtfaGFzaF9mbGFncyB0byB1bnNpZ25lZCBzaG9ydC4KKwkoRUxGX0xJTktfSElEREVOKTogRGVmaW5lLgorCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaWVsZHMgZHludmVyc3ltX2hkciwgZHludmVycmVmX2hkciwKKwlkeW52ZXJkZWZfaGRyLCBkeW52ZXJzeW1fc2VjdGlvbiwgZHludmVyZGVmX3NlY3Rpb24sCisJZHludmVycmVmX3NlY3Rpb24sIGN2ZXJkZWZzLCBjdmVycmVmcywgdmVyZGVmLCB2ZXJyZWYuCisJKGVsZl9keW52ZXJzeW0sIGVsZl9keW52ZXJkZWYsIGVsZl9keW52ZXJyZWYpOiBEZWZpbmUuCisJKF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiwgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0KTogRGVjbGFyZS4KKwkoX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMpOiBEZWNsYXJlLgorCSogZWxmLmMgKF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luKTogTmV3IGZ1bmN0aW9uLgorCShfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQpOiBMaWtld2lzZS4KKwkoX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luLCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0KTogTGlrZXdpc2UuCisJKF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCk6IExpa2V3aXNlLgorCShfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQpOiBMaWtld2lzZS4KKwkoX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4sIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCk6IExpa2V3aXNlLgorCShfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkIERUX1ZFUiogY29uc3RhbnRzLiAgUHJpbnQKKwl2ZXJzaW9uIGluZm9ybWF0aW9uIGlmIHRoZXJlIGlzIGFueS4KKwkoX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHZlcmluZm8gZmllbGQuCisJKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfR05VX3Zlciogc2VjdGlvbiB0eXBlcy4KKwkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBIYW5kbGUgLmdudS52ZXJzaW9uKiBzZWN0aW9uIG5hbWVzLgorCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogSGFuZGxlIFNIVF9HTlVfdmVyKiBzZWN0aW9uIHR5cGVzLgorCShfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyk6IE5ldyBmdW5jdGlvbi4KKwkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpOiBEb24ndCBpbmNsdWRlCisJdmVyc2lvbiBuYW1lIGluIHN0cmluZyBlbnRlcmVkIGluIGR5bmFtaWMgaGFzaCB0YWJsZS4KKwkqIGVsZmNvZGUuaDogSW5jbHVkZSBmbm1hdGNoLmguCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgYSBkeW5hbWljCisJc3ltYm9sIHdoaWNoIHdhcyBmb3JjZWQgdG8gYmVjb21lIGxvY2FsLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IExpa2V3aXNlLgorCitGcmkgRmViIDIxIDE2OjE1OjE4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogU2ltcGxpZnkKKwlzb21ld2hhdC4KKwkobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IENvcnJlY3RseSBjb21wdXRlIGEgc3ltYm9sJ3MgdmFsdWUKKwl3aGVuIHRoZSBzeW1ib2wgaXMgbG9jYWwsIGJ1dCBub3QgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB3ZSBhcmUKKwlyZWxheGluZy4gIEltcGxlbWVudCBhYnMyNCAtPiBhYnMxNiwgaW1tMjQgLT4gaW1tMTYgYW5kIGQyNCAtPiBkMTYKKwlyZWxheGluZy4KKworRnJpIEZlYiAyMSAxMzo1NToxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogZWxmMzItbTMyci5jOiBSZXdyaXRlIHRvIHVzZSBFTEYgYmFja2VuZCBsaW5rZXIuCisJU3RvcmUgbG93ZXIgMTYgYml0cyBvZiBhZGRlbmQgaW4gUl9NMzJSX0hJMTZfW1NVXUxPIGluc25zLgorCUFkZCBzbWFsbCBkYXRhIGFyZWEgc3VwcG9ydCAoUl9NMzJSX1NEQTE2KS4KKwkqIHJlbG9jLmM6IERvY3VtZW50IEJGRF9SRUxPQ19NMzJSX1NEQTE2LgorCSogYmZkLWluMi5oLGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KKworVGh1IEZlYiAyMCAyMzo1MDozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLW1uMTAyMDAuYyAobW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkobW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCisJKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3ApOiBMaWtld2lzZS4KKwkobW4xMDIwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KKwkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KKworCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgorCShtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCisKK1R1ZSBGZWIgMTggMTc6MjI6NTkgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIGVsZi5jLAorCXJlbG9jLmMsIHRhcmdldHMuYzogTmV3IHRhcmdldCwgZWxmLSotRDMwVi4KKworCSogYmZkLWluMi5oLCBjb25maWd1cmUsIGxpYmJmZC5oOiBSZWJ1aWx0LgorCisJKiBjcHUtZDMwdi5jLCBlbGYzMi1kMzB2LmM6IE5ldyBmaWxlcy4KKworVHVlIEZlYiAxOCAxNTozMTo0OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYyAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IEZpeCB0eXBvIGluIGNvbW1lbnQuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCSogY29mZi10aWM4MC5jIChSVFlQRTJIT1dUTyk6IFJlcGxhY2UgYWJvcnQgd2l0aCByZWFsIGZ1bmN0aW9uLgorCShydHlwZTJob3d0byk6IEFkZCBmdW5jdGlvbi4KKwkodGljODBfaG93dG9fdGFibGUpOiBBZGQuCisKK1R1ZSBGZWIgMTggMTE6NDE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBzeXNkZXAuaDogRG9uJ3QgZGVmaW5lIGVycm5vIGluIE1TVkMgaWYgZXJyb3IuaCBpcyBpbmNsdWRlZC4KKworVHVlIEZlYiAxOCAxMDowNDoxMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2Ugc3VyZSByX3N5bW5keAorCWlzIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkLgorCitNb24gRmViIDE3IDExOjI4OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBEb24ndCBjb252ZXJ0IGEgc2Vjb25kYXJ5IGNvbW1vbgorCXN5bWJvbCBpbnRvIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sOyBsZWF2ZSBpdCBhcyBhIGNvbW1vbiBzeW1ib2wuCisKK0ZyaSBGZWIgMTQgMTk6MDg6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGlzc3VlIGEgd2FybmluZworCWFib3V0IGEgc3ltYm9sIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCisJZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgorCitUaHUgRmViIDEzIDIwOjUzOjIyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQorCisJKiBtYWtlZmlsZS52bXM6IEFkZCBnY2MgZmxhZ3MgdG8gYWxsb3cgY29tcGlsaW5nIHdpdGggY3VycmVudCBnY2MKKwlzbmFwc2hvdAorCSh0YXJnbWF0Y2guaCk6IE5ldyBkZXBlbmRlbmN5LgorCisJKiByZWxvYy5jIChCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbiBmb3IKKwlvcGVuVk1TL0FscGhhLgorCSogZXZheC5oIChBTFBIQV9SX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24uCisJKiBldmF4LWFscGhhLmMgKEFMUEhBX1JfQ09ERUFERFIpOiA2NCBiaXQgcHJvY2VkdXJlIHJlbG9jYXRpb24gZm9yCisJb3BlblZNUy9BbHBoYS4KKwkqIGV2YXgtZXRpci5jIChBTFBIQV9SX0NPREVBRERSKTogT3V0cHV0IG9iamVjdCBjb2RlIGZvciB0aGlzCisJcmVsb2NhdGlvbi4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisKKwlSZXN0cmljdCBzeW1ib2wgbGVuZ3RoIHRvIDY0IGJ5dGVzLCBjYXNlIHByZXNlcnZpbmc6CisJKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfd3JpdGVfZW1oKTogUmVtb3ZlIGNhc2UgaGFja2luZy4KKwkqIGV2YXgtbWlzYy5jIChfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbCk6IFJlbW92ZS4KKwkoX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCk6IEFkZGVkLgorCSogZXZheC1ldGlyLmMgKF9iZmRfZXZheF93cml0ZV9ldGlyKTogQ2FsbAorCV9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wgYmVmb3JlIG91dHB1dCBvZiBzeW1ib2wuCisJKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBMaWtld2lzZS4KKwkqIGV2YXguaCAoZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGZsYWdfc2hvd19hZnRlcl90cnVuYyk6IFJlbW92ZS4KKworCSogZXZheC1lbWguYzogT3V0cHV0IGZpbGVuYW1lIHRvIG9iamVjdCBmaWxlIHdpdGhvdXQgcGF0aC4KKworCSogZXZheC1lZ3NkLmM6IE5ldyBzZWN0aW9ucyBmb3IgbG9jYWwgYW5kIGdsb2JhbCBjb21tb25zLgorCisJKiBldmF4LWFscGhhLmMsIGV2YXgtZW1oLmMsIGV2YXgtZWdzZC5jLCBldmF4LWV0aXIuYywKKwlldmF4LW1pc2MuYywgZXZheC5oOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycyBmcm9tIGNvcHlyaWdodAorCW5vdGljZXMuICBSZXBsYWNlIEFYUCB3aXRoIEFscGhhLgorCitXZWQgRmViIDEyIDE4OjEwOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vub3MuYyAoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBXZSBuZWVkIHRoZSBkeW5hbWljCisJc2VjdGlvbnMgaWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCisKK1R1ZSBGZWIgMTEgMTU6NDU6NDMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3QgKGkzODYtd2luZG93cyk6IERvbid0IHNldCBob3N0NjQ9dHJ1ZS4KKworVHVlIEZlYiAxMSAxNToyNzozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IEFkZCBSX01JUFMxNl9HUFJFTC4KKwkoZWxmX21pcHMxNl9ncHJlbF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1pcHMxNl9ncHJlbF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9HUFJFTC4KKwkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KKwkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFMxNl9HUFJFTC4KKwkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwpOiBEZWZpbmUuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitNb24gRmViIDEwIDIzOjI1OjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1tMzJyLmMgKGVsZl9tMzJyX2hvd3RvX3RhYmxlKTogQ2hhbmdlIHBhcnRpYWxfaW5wbGFjZSB0byB0cnVlCisJZm9yIFJfTTMyUl97MTYsMzIsMjQsSEkxNl9VTE8sSEkxNl9TTE8sTE8xNn0uCisKK0ZyaSBGZWIgIDcgMTI6Mzk6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IElmIHdlJ3ZlIGRpc2NhcmRlZCBhIHNlY3Rpb24sCisJdGhlIG91dHB1dCBzZWN0aW9uIHdpbGwgYmUgdGhlIGFic29sdXRlIHNlY3Rpb247IGRvbid0IHByaW50IGFuCisJYXNzZXJ0aW9uIG1lc3NhZ2UgZm9yIHRoYXQgY2FzZSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuCisKK1RodSBGZWIgIDYgMTY6NTU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKEZOX1NUVUIsIENBTExfU1RVQiwgQ0FMTF9GUF9TVFVCKTogRGVmaW5lLgorCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG5ldyBmaWVsZHMgZm5fc3R1YiwKKwluZWVkX2ZuX3N1YiwgY2FsbF9zdHViLCBhbmQgY2FsbF9mcF9zdHViLgorCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIGZpZWxkIG1pcHMxNl9zdHVic19zZWVuLgorCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KKwkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgorCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVkaXJlY3QgcmVsb2NhdGlvbnMgdG8gdXNlIG1pcHMxNgorCXN0dWJzIHdoZW4gYXBwcm9wcmlhdGUuCisJKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEF0dGFjaCBzdHViIHNlY3Rpb25zIHRvIHRoZSBhcHByb3ByaWF0ZQorCXN5bWJvbC4gIFNldCBuZWVkX2ZuX3N0dWIgd2hlbiBhcHByb3ByaWF0ZS4KKwkobWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IERlZmluZS4KKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbG9jYWxfc3R1YnMgZmllbGQuCisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRGlzY2FyZCBsb2NhbCBzeW1ib2xzIHRoYXQgYXJlCisJYXR0YWNoZWQgdG8gc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4KKworV2VkIEZlYiAgNSAxMzoyMDoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlCisJc3ltYm9sIHZhbHVlIHdoZW4gY29tcHV0aW5nIHRoZSBhZGRlbmQgZm9yIGEgcGNfcmVsYXRpdmUKKwlwY3JlbF9vZmZzZXQgcmVsb2MuCisKK01vbiBGZWIgIDMgMTE6NTQ6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgZG9pbmcgYQorCXJlbG9jYXRlYWJsZSBsaW5rLCBqdXN0IHNraXAgcGNfcmVsYXRpdmUgcGNyZWxfb2Zmc2V0IHJlbG9jcy4KKwkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogUmV0dXJuIGEgZGlmZmVyZW50IGhvd3RvCisJc3RydWN0dXJlIGZvciBhbiBBUk0yNiByZWxvYyB3aGljaCBjYW4gYmUgcmVzb2x2ZWQuCisJKGNvZmZfYXJtX2FkanVzdF9zeW1uZHgpOiBPbmx5IGNvbnZlcnQgQVJNMjYgdG8gQVJNMjZEIGlmIHRoZQorCXJlbG9jIGNhbiBiZSByZXNvbHZlZC4KKworCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogQ29ycmVjdCBvZmYgYnkgb25lCisJZXJyb3IgaW4gb3ZlcmZsb3cgY2hlY2sgZm9yIFJfUkVMQllURS4KKworRnJpIEphbiAzMSAxNDowNzoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBQaWNrIHVwIHRoZSBzdGFydCBhZGRyZXNzLgorCUZyb20gTWFyayBSYXNpbiA8bWFyay5yYXNpbkB0ZWxyYWQuY28uaWw+LgorCisJKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IERvbid0IGFwcGx5IGRpc2NhcmRfbCB0bworCWRlYnVnZ2luZyBzeW1ib2xzLgorCitXZWQgSmFuIDI5IDAwOjAwOjQ5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbW4xMDIwMC5jIChyZWxvY190eXBlKTogQWRkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLgorCShlbGZfbW4xMDIwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgorCShtbjEwMjAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgorCitNb24gSmFuIDI3IDEyOjA3OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiByZWxvYy5jOiBBZGQgcmVsb2NzIEJGRF9SRUxPQ19NMzJSX3tISTE2X1tVU11MTyxMTzE2fS4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgorCSogZWxmMzItbTMyci5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlbS4KKworTW9uIEphbiAyNyAxMjoyNTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXQtYXJtLmMgKE1ZX3N3YXBfc3RkX3JlbG9jX2luKTogUmVtb3ZlIHVudXNlZCByX2xlbmd0aC4KKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgcGx0LgorCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogUmVtb3ZlIHVzZWQKKwlyX2Zvcm1hdCBhbmQgcl9wY3JlbC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKwkqIHJpc2NpeC5jIChNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogRGVmaW5lIHRvIGR1bW15IHZhbHVlLgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFdoZW4gY2hlY2tpbmcgZm9yCisJcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGUgdGV4dCBzZWdtZW50LCBsb29rIHVwIHRoZSBvdXRwdXQgbmFtZSBvZgorCXRoZSByZWxvYyBzZWN0aW9uLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisKK1dlZCBKYW4gMjIgMTU6NDA6MjggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IFVzZSBjb3JyZWN0IGRhdGEgcHV0L2dldAorCXJvdXRpbmVzIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBtYWdpYyB0bworIAlUSUM4MF9BUkNIX01BR0lDIGZvciBUSWM4MC4KKworVHVlIEphbiAyMSAxMjozMjo0MyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogQ2hhbmdlIHRvIGxpdHRsZSBlbmRpYW4gZGF0YQorCWFzIHRoZSBkZWZhdWx0LgorCitUaHUgSmFuIDE2IDE3OjQ1OjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENoYW5nZSB0eXBlIG9mCisJYXV4aWxpYXJ5X2ZpbHRlcnMgcGFyYW1ldGVyIHRvIGJlIGNvbnN0IGNoYXIgKiBjb25zdCAqLiAgQWNjZXB0IGEKKwlOVUxMIHRlcm1pbmF0ZWQgYXJyYXkuCisJKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworV2VkIEphbiAxNSAxMToyMTozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFRyZWF0IGEKKwlOT1RZUEUgc3ltYm9sIGluIGEgdGV4dCBzZWN0aW9uIGFzIGEgRlVOQyBzeW1ib2wuCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRm9yY2UKKwlyZWxvY2Jhc2UgdG8gYmUgYWxpZ25lZCB0byBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIuCisKK1R1ZSBKYW4gMTQgMDg6NDY6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbGliYW91dC5oIChtYWNoaW5lX3R5cGUpOiBSZXNlcnZlIHNldmVyYWwgdmFsdWVzIGZvciBzcGFyY2xldC4KKworTW9uIEphbiAxMyAyMjozOTowOCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQgKHRpYzgwLSotKik6IERvbid0IHJlcXVpcmUgJ2NvZmYnLgorCitNb24gSmFuIDEzIDE5OjM2OjI1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9ob3d0b190YWJsZSk6IFNldCB0aGUgc3BlY2lhbF9mdW5jdGlvbgorCXRhYmxlIHRvIHY4NTBfZWxmX3JlbG9jIGZvciBhbGwgbm9uLXN0YW5kYXJkIHJlbG9jYXRpb25zLgorCSh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgY2hlY2sgZm9yIGggYmVpbmcgbm9uLW51bGwuCisJKHY4NTBfZWxmX3JlbG9jKTogQWRkICBSX1Y4NTBfWkRBX09GRlNFVCBzdXBwb3J0LiAgVXNlIHN3aXRjaAorCXN0YXRlbWVudCBpbnN0ZWFkIG9mIG11bHRpcGxlIGlmcy4KKwkodjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB1cCBlcnJvciBtZXNzYWdlLCBkb24ndCBqdXN0IGNhbGwKKwlhYm9ydC4KKworTW9uIEphbiAgNiAxMzoyODozNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLW1uMTAyMDAuYyAoZWxmX21uMTAyMDBfaG93dG8pOiBEb24ndCBldmVyIHNldCBwYXJ0aWFsLWlucGxhY2UuCisJVXNlIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyBhcyBzcGVjaWFsIGZ1bmN0aW9uIGZvciBhbGwgcmVsb2NzLgorCShiZmRfZWxmMzJfbW4xMDIwMF9yZWxvYyk6IFJlbW92ZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4KKworCSogZWxmMzItbW4xMDIwMC5jIChlbGZfbW4xMDIwMF9ob3d0byk6IFNldCBwY3JlbF9vZmZzZXQgZm9yCisJMjRiaXQgcGMtcmVsYXRpdmUgcmVsb2MuCisKK0ZyaSBKYW4gIDMgMTY6MzM6MDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBBZGQgY29mZmNvZGUuaCB0byBkZXBlbmRlbmN5IGxpc3QuCisJKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBEYXRhIGJ5dGUgb3JkZXIgaXMgYmlnIGVuZGlhbiBhbmQKKwloZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuLiAgVXNlIGNvcnJlY3QgYmZkX2dldCBhbmQKKwliZmRfcHV0IHJvdXRpbmVzIGZvciBsaXR0bGUgZW5kaWFuIGhlYWRlcnMuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFNldCBhcmNoIHRvCisJYmZkX2FyY2hfdGljODAgZm9yIFRJQzgwX0FSQ0hfTUFHSUMgbnVtYmVyLgorCitGcmkgSmFuICAzIDE2OjU0OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcmVsb2MuYzogQWRkIEJGRF9SRUxPQ18yNC4KKwkqIGVsZjMyLW1uMTAyMDAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIDI0Yml0IGFuZCBwY3JlbCByZWxvY3MuCisJKGVsZl9tbjEwMjAwX2hvd3RvLCBtbjEwMjAwX3JlbG9jX21hcCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCisKK0ZyaSBKYW4gIDMgMTY6NTg6MzEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwllbGY2NC1hbHBoYSBtdWx0aXBsZSAuZ290IHJld3JpdGU6CisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgYWx3YXlzX3NpemVfc2VjdGlvbnMgZW50cnkuCisJKGJmZF9lbGYqX21rb2JqZWN0KTogRG9uJ3QgZGVmaW5lIGhlcmUgLi4uCisJKiBlbGZ4eC10YXJnZXQuaDogLi4uIGJ1dCByYXRoZXIgaGVyZS4gIERlZmF1bHQgYWx3YXlzX3NpemVfc2VjdGlvbnMKKwlob29rIHRvIE5VTEwuCisJKiBlbGYuYyAoZWxmX21rb2JqZWN0KTogUmVuYW1lIHRvIGJmZF9lbGZfbWtvYmplY3QsIHNpbmNlIHRoYXQgd2FzCisJd2hhdCB0aGUgI2RlZmluZXMgaW4gZWxmLWJmZC5oIHRyYW5zbXV0ZWQgaXQgdG8gYW55d2F5LgorCisJKiBzZWN0aW9uLmM6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgZmxhZy4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCB0bworCXJlbG9jYXRpb24gc2VjdGlvbiBmbGFncy4KKwkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIFNFQ19MSU5LRVJfQ1JFQVRFRCBpbnN0ZWFkIG9mCisJU0VDX0lOX01FTU9SWSB0byByZWNvZ25pemUgZ2VuZXJhdGVkIGJpdHMuCisJKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcywgZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKToKKwlMaWtld2lzZS4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluaywgbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsCisJbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24sIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiwKKwltaXBzX2VsZl9jaGVja19yZWxvY3MsIG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uLAorCXBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MsCisJZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbik6IEFkZCBTRUNfTElOS0VSX0NSRUFURUQgdG8KKwlzZWN0aW9uIGZsYWdzLgorCShfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBMaWtld2lzZS4KKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDYWxsIHRoZSBhbHdheXNfc2l6ZV9zZWN0aW9ucyBob29rLgorCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBVc2UgU0VDX0xJTktFUl9DUkVBVEVEIGluc3RlYWQgb2YgU0VDX0lOX01FTU9SWQorCXRvIGlkZW50aWZ5IGdlbmVyYXRlZCBiaXRzLgorCShlbGZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KKworCSogZWxmNjQtYWxwaGEuYzogUmV3cml0ZSBldmVyeXRoaW5nIHRvdWNoaW5nIHJlbG9jYXRpb25zLgorCitGcmkgSmFuICAzIDExOjQyOjUzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jIChhbGwgZnVuY3Rpb25zIGFuZCBzdGF0aWMgdmFyaWFibGVzKTogR28gdGhyb3VnaAorCWFuZCByZWd1bGFyaXplIG5hbWVzIHRvIGJlIG9mIHRoZSBmb3JtIHY4NTBfZWxmXzx4eHg+LgorCSh0b3BsZXZlbCk6IEluY2x1ZGUgPGVsZi92ODUwLmg+LgorCShlbnVtIHJlbG9jX3R5cGUpOiBNb3ZlIHRvIGluY2x1ZGUvZWxmL3Y4NTAuaC4KKwkodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogRm9yIGNvbW1vbiB2YXJpYWJsZXMsIGlmIHRoZSB2YXJpYWJsZSBpcworCXJlZmVyZW5jZWQgYnkgYSBSX1Y4NTBfe1NEQSxaREEsVERBfSByZWxvY2F0aW9uLCBwdXQgdGhlIHZhcmlhYmxlCisJaW50byB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KKwkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgorCitUdWUgRGVjIDMxIDE1OjE1OjI4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEZpeCBzb21lIHNwYWNpbmcuCisKK1R1ZSBEZWMgMzEgMTQ6NDQ6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkIChtaXBzKmVsLSotbGludXgqKTogTmV3IHRhcmdldC4KKwkobWlwcyotKi1saW51eCopOiBOZXcgdGFyZ2V0LgorCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENsZWFuIHVwLgorCVJldHVybiBhIHVzZWZ1bCB2YWx1ZS4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkLCBub3QKKwlhY19jdl9mdW5jX21tYXAuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWd1cmUuaG9zdDogVXNlIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgaW5zdGVhZCBvZgorCWFjX2N2X2Z1bmNfbW1hcCBpbiBiZmQvY29uZmlndXJlLmhvc3QuCisKKwkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQKKwlmaWx0ZXJfc2hsaWIgYW5kIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgcGFyYW1ldGVycy4KKwkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogSGFuZGxlIERUX0FVWElMSUFSWSBhbmQKKwlEVF9GSUxURVIuCisJKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCitNb24gRGVjIDMwIDE4OjQ4OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFdoZW4gZXhwb3J0aW5nIGFsbCBkZWZpbmVkCisJc3ltYm9scywgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgYnkgYW4gb2JqZWN0IGluIGFuCisJYXJjaGl2ZSB3aGljaCBjb250YWlucyBzaGFyZWQgb2JqZWN0cy4KKworTW9uIERlYyAzMCAxNjoxMjo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogYXJjaHVyZXMuYyAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX3RpYzgwCisJZm9yIFRJIFRNUzMyMGM4MCAoTVZQKS4KKwkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX3RpYzgwX2FyY2guCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUgYnkgcnVubmluZyAibWFrZSBoZWFkZXJzIi4KKworU3VuIERlYyAyOSAxNjoxODo1MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY3B1LXRpYzgwLmMgKGJmZF90aWM4MF9hcmNoKTogQWRkIHN0cnVjdC4KKwkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAkdmVjKTogQ29ycmVjdCB0eXBvLCAidGIiIG5vdCAidHAiLgorCUFsc28gYWRkIGNvZmZsaW5rLm8gZm9yIHRpYzgwY29mZl92ZWMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KKworTW9uIERlYyAzMCAxMTo1NDo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmJmZC5jOiBQYXRjaCB1cCB0aGUgbW1hcCBjb2RlIHNvIHRoYXQgaXQgaXMgb25seSBidWlsdCBpZiBCRkQKKwlpcyBjb25maWd1cmVkIHdpdGggLS13aXRoLW1tYXAuCisKK1N1biBEZWMgMjkgMTA6NDg6NTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXRpYzgwLm8KKwkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS10aWM4MC5vCisJKGNwdS10aWM4MC5vLCBjb2ZmLXRpYzgwLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgorCSogY29mZi10aWM4MC5jOiBBZGQgc2tlbGV0b24sIGNsb25lZCBmcm9tIGFub3RoZXIgY29mZiBjb25maWcuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBtYWdpYyB0byBUSUM4ME1BR0lDCisgCWZvciBUSWM4MC4KKworRnJpIERlYyAyNyAyMDo1Njo0MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogVE9ETzogQ29ycmVjdCBhIG1pc3NwZWxsaW5nLgorCSogY29mZi10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVlApLgorCSogY3B1LXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCisJKiBjb25maWd1cmUuaW4gKGNhc2UgJHZlYyk6IEFkZCB0aWM4MGNvZmZfdmVjIGVudHJ5LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCisJKiBhcmNodXJlcy5jIChiZmRfdGljODBfYXJjaCk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmggKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF90aWM4MC4KKwkqIGNvbmZpZy5iZmQgKGNhc2UgJHt0YXJnfSk6IEFkZCB0aWM4MCotKi1jb2ZmKiB0YXJnZXQuCisJKiB0YXJnZXRzLmMgKHRpYzgwY29mZl92ZWMpOiBBZGQgZGVjbCBhcyBleHRlcm4gYmZkX3RhcmdldC4KKwkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdGljODBjb2ZmX3ZlYyBlbnRyeS4KKworRnJpIERlYyAyNyAxMTo0ODoxMiAxOTk2ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KKworCSogZWxmbGluay5oIChlbGZfYnVja2V0cyk6IEFkZCBzb21lIG1vcmUgdmFsdWVzIGZvciBsYXJnZXIKKwliaW5hcmllcy4KKworVGh1IERlYyAyNiAxODozNjo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTW92ZSBzdWJkaXJfZG8gb3V0IG9mIGNvbmRpdGlvbmFsLiBGcm9tCisJRnJlZCBGaXNoIDxmbmZAY3lnbnVzLmNvbT4uCisKK1dlZCBEZWMgMTggMTA6MDQ6MzAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi1tbjEwMjAwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEVuYWJsZSBiYXNpYyA4LCAxNiwgYW5kCisJMzIgYml0IHJlbG9jcy4KKwkoZWxmX21uMTAyMDBfaG93dG9fdGFibGUpOiBMaWtld2lzZS4KKwkobW4xMDIwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KKworVHVlIERlYyAxNyAxMTowOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogQWRkIDEgdG8gdGhlIHZhbHVlIG9mIGEKKwltaXBzMTYgc3ltYm9sIGR1cmluZyB0aGUgbGluay4KKwkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogU3VidHJhY3QgMSBmcm9tIHRoZSB2YWx1ZSBvZiBhCisJbWlwczE2IHN5bWJvbC4KKwkobWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERlZmluZS4KKworCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogUHJpbnQgdGhlIHN0X290aGVyIGZpZWxkIGlmIGl0IGlzCisJbm90IHplcm8uCisKK01vbiBEZWMgMTYgMTQ6Mzg6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgY2hlY2sgZm9yIHJlbG9jIHNlY3Rpb25zCisJYWdhaW5zdCBTRUNfREVCVUdHSU5HIHNlY3Rpb25zIGhlcmUgKHJldmVydCBwYXRjaCBvZiBEZWNlbWJlciA1KS4KKwkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogQ2hlY2sgZm9yIHRoZW0gaGVyZSwgaW5zdGVhZC4KKworU3VuIERlYyAxNSAxNDo0NjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogQWRkIGR5bmFtaWMgcGFyYW1ldGVyLgorCSogZWxmLmMgKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IFBhc3MgbmV3IGFyZ3VtZW50IHRvCisJc2x1cnBfcmVsb2NfdGFibGUuCisJKF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgorCShfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBVcGRhdGUgZGVjbGFyYXRpb24gb2YKKwlzbHVycF9yZWxvY190YWJsZS4KKwkoX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlY2xhcmUuCisJKiBlbGZ4eC10YXJnZXQuaDogVXNlIG5ldyBkeW5hbWljIHJlbG9jIHJvdXRpbmVzIGJ5IGRlZmF1bHQuCisJKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUpOiBBZGQgZHluYW1pYworCXBhcmFtZXRlci4KKworRnJpIERlYyAxMyAxMzoxODo0OSAxOTk2ICBEYW4gV2lsZGVyICA8ZGFuQGdhc2JveS5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogVXNlIE1DNjhLQkNTTUFHSUMgZm9yIGJmZF9hcmNoX202OGsKKwlpZiBOQU1FU19IQVZFX1VOREVSU0NPUkUgaXMgZGVmaW5lZC4KKworRnJpIERlYyAxMyAxMToxMzoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBsaWJhb3V0LmggKGVudW0gbWFjaGluZV90eXBlKTogQ2hhbmdlIE1fU1BBUkNMRVQgZnJvbSAxNDIgdG8gMTMxLgorCitUaHUgRGVjIDEyIDE1OjA3OjIwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogTW92ZSBSX1BQQ19QTFRSRUwyNCBpbnRvIHRoZQorCXN1cHBvcnRlZCByZWxvY3MuCisKK1RodSBEZWMgMTIgMTQ6NTU6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgYWRkIGEgd2VhaworCXN5bWJvbCBpZiB0aGUgcmVhbCBkZWZpbml0aW9uIGlzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KKwlBZnRlciBmaW5kaW5nIHRoZSByZWFsIGRlZmluaXRpb24sIHRoZW4sIGlmIGl0IGlzIGR5bmFtaWMsIGFkZCB0aGUKKwl3ZWFrIHN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCisKKwkqIGNvZmYtYXV4LmMgKGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbCk6IE1ha2Ugc3RhdGljLgorCisJKiBwcGNib290LmMgKHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCk6IERvbid0IGRlZmluZTsgaXQncyBhCisJZnVuY3Rpb24uCisJKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGFuCisJYXJyYXkuCisKK1R1ZSBEZWMgMTAgMjM6MjM6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi1tbjEwMzAwLmMgKHJlbG9jX3R5cGUpOiBSZW1vdmUgYmlnIGVuZGlhbiBtbjEwMzAwIHJlbG9jCisJdmFyaWFudHMuCisJKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUsIG1uMTAzMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogV3JpdGUgZGF0YSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKwkqIHJlbG9jLmM6IFJlbW92ZSBtbjEwMzAwIGJpZyBlbmRpYW4gcmVsb2NzLgorCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KKworCSogZWxmMzItbW4xMDIwMC5jOiBVcGRhdGUgZnJvbSBlbGYzMi1tbjEwMzAwLmMuCisKK0ZyaSBEZWMgIDYgMTU6MTg6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi1tbjEwMzAwLmMgKGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyKTogRGVmaW5lLgorCisJKiBlbGYzMi1tbjEwMzAwLmM6IEFkZCBzb21lIGNvbW1lbnRzLgorCitGcmkgRGVjICA2IDE3OjE2OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWhleC5jIChpaGV4X3NjYW4pOiBBbHdheXMgaW5pdGlhbGl6ZSBidWYgYmVmb3JlIGp1bXBpbmcgdG8KKwllcnJvcl9yZXR1cm4uCisJKGloZXhfcmVhZF9zZWN0aW9uKTogTGlrZXdpc2UuCisKK1RodSBEZWMgIDUgMjI6Mjk6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi1tbjEwMzAwLmMgKGVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogRG9uJ3Qgc2V0IHBhcnRpYWwtCisJaW5wbGFjZSBmb3IgbW9zdCByZWxvY3MuCisKK1RodSBEZWMgIDUgMTM6MjQ6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENhbGxpbmcgY2hlY2tfcmVsb2NzCisJZXZlbiBpZiBTRUNfQUxMT0MgaXMgbm90IHNldC4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgY2hlY2sgU0VDX0FMTE9DCisJd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGNvcHkgYSByZWxvYyBpbnRvIGEgc2hhcmVkIG9iamVjdC4KKwkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCisJKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3Qgc2V0IFNFQ19BTExPQyBpbiBhCisJcmVsb2Mgc2VjdGlvbiBpZiBpdCBpcyBub3Qgc2V0IGluIHRoZSBzb3VyY2Ugc2VjdGlvbi4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgorCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1hcmsgYSByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQKKwl3aXRoIGEgU0VDX0RFQlVHR0lORyBzZWN0aW9uIGFzIFNFQ19ERUJVR0dJTkcuCisKK1dlZCBEZWMgIDQgMTQ6MTg6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiAjaWYgMCBjb2RlIHRoYXQKKwlleHBlY3RzIGEgLmdvdC5wbHQgdW50aWwgd2UgYWN0dWFsbHkgY3JlYXRlIGl0LgorCitNb24gRGVjICAyIDEyOjEzOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFByaW50IGFuIGVycm9yCisJbWVzc2FnZSBmb3IgYmZkX3JlbG9jX291dG9mcmFuZ2UsIHJhdGhlciB0aGFuIGFib3J0aW5nLiAgRnJvbQorCVBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MgaW4KKwlhIHJlbG9jYXRlYWJsZSBsaW5rLCBkb24ndCB0cnkgdG8gcHJvY2VzcyB0aGVtLiAgRnJvbSBIZWlueiBXcm9iZWwKKwk8d3JvYmVsQGxwci5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LgorCitNb24gRGVjICAyIDAwOjM5OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbW4xMDMwMC5jIChtbjEwMzAwX2luZm9faG93dG8pOiBSZW5hbWVkIGZyb20KKwltbjEwMzAwX2luZm9faG93dG9fcmVsLiAgVHdlYWsgcmVsb2MgYXJndW1lbnQgdG8gYmUgYW4KKwlFbGYzMl9JbnRlcm5hbF9SZWxhLgorCShVU0VfUkVMQSk6IERlZmluZSBpbnN0ZWFkIG9mIFVTRV9SRUwuCisJKGVsZl9pbmZvX3RvX2hvd3RvLCBlbGZfaW5mb19ob3d0b19yZWwpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1N1biBEZWMgIDEgMDA6MTg6NTkgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogIEhhbmRsZSBtaXBzKi1zZ2ktaXJpeDYqLgorCSogaXJpeC1jb3JlLmMgKGlyaXhfY29yZV9jb3JlX2ZpbGVfcCk6ICBBY2NlcHQgQ09SRV9NQUdJQ04zMgorCWNvcmUgZmlsZXMuCisKK1dlZCBOb3YgMjcgMTI6MTA6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBXYXJuIGFib3V0IGEKKwlyZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiBhIHNlY3Rpb24gd2l0aCBubyBvdXRwdXQKKwlzZWN0aW9uLgorCitUdWUgTm92IDI2IDExOjA3OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IERvbid0IHJlcXVpcmUgQUNfQ19DUk9TUy4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KKworCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBvdGhlciBmaWVsZC4KKwkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgb3RoZXIgZmllbGQuCisJKHN3YXBfb3V0X3N5bXMpOiBTZXQgc3Rfb3RoZXIgZnJvbSBleGlzdGluZyBzdF9vdGhlciBmaWVsZC4KKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU3RvcmUgc3Rfb3RoZXIgaW4gaGFzaAorCXRhYmxlIG90aGVyIGZpZWxkLgorCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogU2V0IHRoZSBvdGhlciBmaWVsZCBmcm9tIHRoZSBnbG9iYWwgaGFzaAorCXRhYmxlIGVudHJ5LgorCSogZWxmMzItbWlwcy5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9NSVBTMTZfMjYuCisJKGVsZl9taXBzMTZfanVtcF9ob3d0byk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1pcHMxNl9qdW1wX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0pNUC4KKwkobWlwc19pbmZvX3RvX2hvd3RvX3JlbCk6IEhhbmRsZSBSX01JUFMxNl8yNi4KKwkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFMxNl8yNi4gIEhhbmRsZSBSX01JUFNfMjYKKwl0byBhIG1pcHMxNiBzeW1ib2wuCisJKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQUzE2X0pNUCk6IEFkZCB0byBsaXN0IG9mIHJlbG9jcy4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisJKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHM6MTYgZW50cnkuCisKK01vbiBOb3YgMjUgMTE6MjM6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogVXNlIGxvbmcgbG9uZyBmb3IgbWlwcy1zZ2ktaXJpeDYqLgorCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IE1ha2UgbGluZSBudW1iZXIgb3ZlcmZsb3cKKwlvbmx5IGEgd2FybmluZy4gIEZyb20gUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRlbXV5dEB1bGIuYWMuYmU+LgorCitNb24gTm92IDI1IDA4OjUyOjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItbW4xMDMwMC5jIChiZmRfZWxmMzJfbW4xMDMwMF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KKwkoZW51bSByZWxvY190eXBlKTogQWRkIG1vcmUgcmVsb2MgdHlwZXMuCisJKGVsZjMyX21uMTAzMDBfaG93dG9fdGFibGUpOiBVcGRhdGUgZm9yIG5ldyByZWxvYyB0eXBlcy4KKwkoZWxmMzJfbW4xMDMwMF9yZWxvY19tYXApOiBVcGRhdGUgZm9yIG5ldyByZWxvYyB0eXBlcy4KKwkqIHJlbG9jLmM6IEFkZCBzb21lIG5ldyByZWxvY3MgZm9yIHRoZSBtbjEwMzAwIHNlcmllcy4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCisKK1NhdCBOb3YgMjMgMTM6MjY6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBsb3NlIGZvciBhIHNwYWNlIHdoaWNoIGhhcworCW5vIGRhdGEsIGJ1dCBzb21lIHN5bWJvbHMuCisKK0ZyaSBOb3YgMjIgMTE6MzI6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGdvdF9uZWVkZWQgZmllbGQuCisJKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGdvdF9uZWVkZWQuCisJKHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogT25seSBzZXQgLmdvdCBzZWN0aW9uIHNpemUgaWYgaXQKKwlpcyBub3QgYWxyZWFkeSBzZXQuICBTZXQgZ290X25lZWRlZC4KKwkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENoZWNrIGdvdF9uZWVkZWQuICBPbmx5IHNldAorCXNkeW5wdHIsIGFuZCBvbmx5IGhhbmRsZSBkeW5hbWljIHNlY3Rpb25zLCBpZiBkeW5hbWljIHNlY3Rpb25zIGFyZQorCW5lZWRlZC4KKwkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogUGFzcyBmYWxzZSB0byBjcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KKwlJbml0aWFsaXplIC5nb3Qgc2VjdGlvbi4KKwkoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogTGlrZXdpc2UuCisJKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogU2V0IHVwIFBMVCBlbnRyeSBldmVuIGlmIHRoaXMgaXMgbm90CisJYSBkeW5hbWljIHN5bWJvbC4KKwkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IENoZWNrIGdvdF9uZWVkZWQuICBPbmx5IHNldCB1cAorCWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBpZiBuZWVkZWQuCisKK1RodSBOb3YgMjEgMTA6MzE6MzEgMTk5NiAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQorCisJKiBjb25maWcuYmZkOiBBZGRlZCBWZXJzYURPUyBmb3JtYXQgdG8gdGhlIEVyaWNzc29uIGNvbmZpZ3VyYXRpb24uCisKK1dlZCBOb3YgMjAgMTY6MzE6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi1tbjEwMzAwLmM6IFJvdWdoIGN1dCBhdCByZWxvY3MgZm9yIHRoZSBtbjEwMzAwLgorCitXZWQgTm92IDEzIDA4OjEyOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVsZjMyLWQxMHYubyk6IERvbid0IGRlcGVuZCBvbiBlbGYvZDEwdi5oCisJYW55bW9yZS4KKworVHVlIE5vdiAxMiAxMzozMDowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIGZpbGVtb2RlLmM6IEluY2x1ZGUgc3lzZGVwLmguCisJKiBpaGV4LmM6IEFkZCBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCisJKiBzdW5vcy5jOiBBZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgorCitNb24gTm92IDExIDEwOjM3OjAyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIC5nb3QucGx0CisJc2VjdGlvbi4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgc3VwcG9ydCBmb3IgUl9QUENfTE9DQUwyNFBDLiAgTWFrZQorCWFwcHJvcHJpYXRlIHJlbG9jYXRpb25zIGluIHRoZSAuc28gZmlsZSBpZiBzaGFyZWQuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgorCitUdWUgT2N0IDI5IDE1OjAzOjAyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLW0zMnIuYyAoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8yNCk6IFVzZQorCWNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLgorCitUdWUgT2N0IDI5IDEyOjUzOjQ2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogRG9uJ3QgY29tcGxhaW4gb24KKwlvdmVyZmxvd3MgZm9yIFJfRDEwVl8xNiBhbmQgUl9EMTBWXzE4LgorCitUdWUgT2N0IDI5IDEzOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCk6IFVzZSBMTUEgcmF0aGVyIHRoYW4gVk1BLgorCShkb193aXRoX3JlbG9jcyk6IExpa2V3aXNlLgorCShkb19hc19yZXBlYXQpOiBMaWtld2lzZS4KKwkoY29weV9leHByZXNzaW9uKTogTGlrZXdpc2UuCisKK0ZyaSBPY3QgMjUgMTY6NTY6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmMgKGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCk6IENvcnJlY3RseSByZWNvcmQgd2hldGhlcgorCXRoZXJlIGlzIGFuIGV4dGVybmFsIHBhcnQuCisKK1RodSBPY3QgMjQgMTQ6MzI6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi12ODUwLmMgKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDb3JyZWN0bHkKKwloYW5kbGUgdGRhIG9mZnNldHMgZm9yIHNsZC53IGFuZCBzc3QudyBpbnN0cnVjdGlvbnMuCisJRml4IGFsaWdubWVudCBjaGVjayBpbiBzbGQudyBhbmQgc3N0LncgdGRhIHJlbG9jIGhhbmRsaW5nLgorCitUaHUgT2N0IDI0IDA5OjA4OjQ3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogIFNldCBVU0VfQklOQVJZX0ZPUEVOIGZvciAqLSotd2luZG93cy4KKworV2VkIE9jdCAyMyAwMDo1MzoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLXY4NTAuYzogQWRkIGNvbW1lbnRzIGFib3V0IGFzc3VtcHRpb25zIGFib3V0CisJY2hhciwgc2hvcnQgJiBsb25nIHNpemVzLgorCShlbGYzMl92ODUwX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IHNpZ24gZXh0ZW5zaW9uCisJcHJvYmxlbXMgZm9yIHNldmVyYWwgcmVsb2NzLgorCisJKiBlbGYzMi12ODUwLmMgKGVsZjMyX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggdHlwbyBpbgorCVJfVjg1MF9TREFfT0ZGU0VUIGVudHJ5LgorCitXZWQgT2N0IDIzIDAwOjIwOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogRG9uJ3QgYWxsb2NhdGUgbGRzeW0uCisJU3RvcmUgaW1wb3J0IGZpbGUgaW5kZXggaW4gbGRpbmR4LgorCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBBc3N1bWUgdGhhdCBsZHN5bSB3YXMgbm90IHByZXZpb3VzbHkKKwlhbGxvY2F0ZWQuICBGb3IgYW4gaW1wb3J0ZWQgc3ltYm9sLCBjb3B5IGxkaW5keCBpbnRvIGxfaWZpbGUuCisKK1R1ZSBPY3QgMjIgMTk6MjA6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogRml4IG9yZGVyaW5nIG9mCisJUl9WODUwX1pEQV9PRkZTRVQgYW5kIFJfVjg1MF9UREFfT0ZGU0VULiAgRml4IHZhcmlvdXMKKwlmaWVsZHMgaW4gUl9WODUwX1REQV9PRkZTRVQuCisJKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBUd2VhayBwYy1yZWxhdGl2ZQorCXJlbG9jcyB0byB3b3JrIG1vcmUgbGlrZSBvdGhlciByZWxvY3MuICBIYW5kbGUgUl9WODUwX1REQV9PRkZTRVQKKwlyZWxvY2F0aW9ucy4KKworCSogZWxmMzItdjg1MC5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KKwkoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBSZXR1cm4gYW4gZXJyb3IgaWYgd2UgZ2V0IGEgcmVsb2MKKwl3ZSBjYW4ndCBoYW5kbGUuCisJKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCisJKHY4NTBfZWxmX3JlbG9jYXRpb25fc2VjdGlvbik6IExpa2V3aXNlLgorCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgorCitUdWUgT2N0IDIyIDE3OjIyOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IElnbm9yZSBzZWN0aW9ucyB3aGljaAorCWRvbid0IGhhdmUgU0VDX0xPQUQgYW5kIFNFQ19BTExPQyBzZXQuCisKK01vbiBPY3QgMjEgMTI6MTM6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBBdm9pZCBsb3Npbmcgc3RhdGljCisJc3ltYm9scyBpbiB0aGUgLmJzcyBzZWN0aW9uLgorCitNb24gT2N0IDIxIDEwOjU0OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19ob3d0b190YWJsZSk6IERlc2NyaWJlIFJfTUlQU182NC4KKwkobWlwczMyXzY0Yml0X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobWlwc19yZWxvY19tYXApOiBBZGQgZW50cnkgZm9yIEJGRF9SRUxPQ182NC4KKwkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBSX01JUFNfNjQuCisKKwkqIGxpbmtlci5jIChkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBQcmludCBhbiBlcnJvciBtZXNzYWdlCisJd2hlbiBhdHRlbXB0aW5nIHRvIGRvIGEgcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCBkaWZmZXJlbnQgb2JqZWN0CisJZmlsZSBmb3JtYXRzLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgorCitUaHUgT2N0IDE3IDEwOjQzOjI5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJlbG9jLmMgKG0zMnIgcmVsb2NzKTogUmVuYW1lIHRoZW0uCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KKwkqIGVsZjMyLW0zMnIuYzogVXBkYXRlLgorCShtMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KKwkoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8xMF9QQ1JFTCBlbnRyeSk6IFVzZSBpdC4KKwkoZWxmX20zMnJfaG93dG9fdGFibGUsIFJfTTMyUl8yNCBlbnRyeSk6IEZpeCB7c3JjLGRzdH1fbWFza3MuCisKK1dlZCBPY3QgMTYgMTE6MjQ6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBTZXQgImxpbmtlcl9tYXJrIiBmb3IKKwlhbGwgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KKwkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEaXNjYXJkIHN5bWJvbHMgaW4gc2VjdGlvbnMKKwl3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLgorCSogZWxmMzItdjg1MC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX1NEQV9PRkZTRVQsCisJUl9WODUwX1REQV9PRkZTRVQgYW5kIFJfVjg1MF9aREFfT0ZGU0VULgorCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKwkoZWxmX3Y4NTBfcmVsb2NfbWFwKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCSogcmVsb2MuYzogQWRkIGFkZGl0aW9uYWwgVjg1MCByZWxvY2F0aW9ucy4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCisKKwkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBNYXNrIG91dCBiaXRzIHdlCisJbm8gbG9uZ2VyIHdhbnQgaW4gcGMtcmVsYXRpdmUgcmVsb2NzLgorCitUdWUgT2N0IDE1IDIyOjE3OjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IERvbid0IHNpbGVudGx5CisJYWNjZXB0IGEgcmVsb2MgYWdhaW5zdCBhbiB1bmRlZmluZWQgc3libW9sIQorCitUdWUgT2N0IDE1IDE2OjE3OjI4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLXY4NTAuYzogIERlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciB0byBiZSAnXycuCisKK1R1ZSBPY3QgMTUgMTI6NDA6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBWRVJTSU9OOiBCdW1wIGZvciBuZXcgcmVsb2NhdGlvbi4KKworCSogaG9zdHMvaTM4NmJzZC5oOiBJZiBOQlBHIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgaXQgYXMKKwlQQUdFX1NJWkUsIGZvciByZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRC4KKworTW9uIE9jdCAxNCAxMjozNzoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgYGxvbmcgbG9uZycgYXMgdGhlIDY0IGJpdCB0eXBlIG9uIGEgU29sYXJpcworCWhvc3QsIHNpbmNlIGJvdGggZ2NjIGFuZCB0aGUgU3VuUFJPIGNvbXBpbGVycyBzdXBwb3J0IGl0LgorCitNb24gT2N0IDE0IDExOjE3OjI0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiByZWxvYy5jOiBDcmVhdGUgYSBuZXcgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLiAgSXQgd2FzIGEKKwltaXN0YWtlIHRvIGhhdmUgcmV1c2VkIHRoZSBFQ09GRiBMSVRFUkFMIGZvciBFTEYgc2luY2UgdGhleSBoYXZlCisJZGlmZmVyZW50IHNlbWFudGljcy4KKwkqIGVsZjY0LWFscGhhLmMgKGVsZl9yZWxvY19tYXApOiBNYXAgZnJvbSBFTEZfTElURVJBTC4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFRyYXAgLmdvdAorCXNlY3Rpb24gb3ZlcmZsb3cuCisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgZW1pdCBhCisJZHluYW1pYyByZWxvY2F0aW9uIGZvciBhbiB1bmRlZndlYWsgc3ltYm9sIHdoZW4gd2UgYXJlIGJ1aWxkaW5nCisJYSBzdGF0aWMgZXhlY3V0YWJsZS4KKworVGh1IE9jdCAxMCAxMToxNTowNiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZCAoY29uZmlnLmJmZCwgdGFyZ21hdGNoLnNlZCk6IEVkaXQgcmVmZXJlbmNlcyB0bworCXBvaW50IGV4cGxpY2l0bHkgdG8gc3JjZGlyLgorCSh0YXJnbWF0Y2guaCk6IEVkaXQgcmVmZXJlbmNlcyB0byBwb2ludCBleHBsaWNpdGx5IHRvIG9iamRpci4KKworVGh1IE9jdCAxMCAxNDoxNDoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQ6IFdoZW4gc2V0dGluZyB0YXJnX2NwdSwgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5CisJbGludXgtZ251LgorCitUdWUgT2N0ICA4IDA4OjUxOjE5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIHN1cHBvcnQgZm9yIHdpbmRvd3MgaG9zdCAoYSBidWlsZCBkb25lCisJdW5kZXIgdGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCisKK1R1ZSBPY3QgIDggMTE6NDA6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGEgc3ltYm9sIGlzIGEgd2VhaworCWRlZmluaXRpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYWRkIGl0IHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQorCWlmIGFueSBkeW5hbWljIG9iamVjdCBtZW50aW9ucyBpdC4gIFJldmVydHMgcGFydCBvZiBsYXN0IHBhdGNoLgorCisJKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIGdvdF9iYXNlIGZpZWxkLgorCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBnb3RfYmFzZS4KKwkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZQorCXRoYW4gMHgxMDAwIGJ5dGVzLCBzZXQgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhbmQgZ290X2Jhc2UgdG8KKwkweDEwMDAuCisJKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBTdWJ0cmFjdCBnb3RfYmFzZSBmcm9tIGEgYmFzZQorCXJlbGF0aXZlIHJlbG9jYXRpb24uCisKKwkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaXNhKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3Qgd2FybiBhYm91dCBsaW5raW5nCisJLW1pcHMxIGFuZCAtbWlwczIgY29kZSB0b2dldGhlciwgb3IgLW1pcHMzIGFuZCAtbWlwczQgY29kZS4KKworTW9uIE9jdCAgNyAxMTo0NDoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IE9ubHkgdHJlYXQgYXJjaGl2ZSBhcyBsaXR0bGUKKwllbmRpYW4gZm9yIGk5NjAgQ09GRi4KKworRnJpIE9jdCAgNCAxMzo0OTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRqdXN0IHNvZmFyCisgCWJ5IHRoZSBjaGFuZ2UgaW4gc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aGVuIEVYRUNfUCBpcyBub3Qgc2V0LgorCisJKiBjb2ZmLW02OGsuYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkobTY4a2NvZmZfcnR5cGVfdG9faG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogY2YtbTY4a2x5bnguYyAoY29mZl9tNjhrX2x5bnhfcnR5cGVfdG9faG93dG8pOiBBZGQgdGhlIHNlY3Rpb24KKwlWTUEgdG8gdGhlIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYy4KKworCSogZGVwLWluLnNlZDogUmV3b3JrIGJhY2tzbGFzaCBsb29wIGEgYml0IHRvIGF2b2lkIGJ1ZyBpbiBzZWQgb24KKwlIUC9VWCAxMC4yMC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKworCSogZGVwLWluLnNlZDogUmVtb3ZlIC4uL2JmZC9zeXNkZXAuaCwgc2luY2UgaXQgd2lsbCBhcHBlYXIgd2hlbgorCXNvbS5oIGlzIGluY2x1ZGVkLgorCitGcmkgT2N0ICA0IDExOjQxOjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFJlbW92ZSBleHBsaWNpdCBkZXBlbmRlbmNpZXMgZm9yIG1uMTAyMDAgYW5kCisJbW4xMDMwMCBmaWxlcy4KKwkoQUxMX01BQ0hJTkVfQ0ZJTEVTKTogQWRkIGNwdS1tbjEwMjAwLmMgYW5kIGNwdS1tbjEwMzAwLmMuCisJKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGYzMi1tbjEwMjAwLmMgYW5kIGVsZjMyLW1uMTAzMDAuYworCShkZXBlbmRlbmNpZXMpOiBSZWJ1aWx0LgorCitUaHUgT2N0ICAzIDE2OjU3OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogU2V0IG9ial9jb2ZmX2tlZXBfc3ltcworCWR1cmluZyB0aGlzIGZ1bmN0aW9uLgorCisJKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE9ubHkgdXNlIGFuIGV4aXN0aW5nCisJc2VjdGlvbiBpZiB0aGUgZmxhZ3MgYXJlIGNvbXBhdGlibGUuCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGhhdmV2ZWNzLCBhbmQgcHV0IGl0IGluIHRkZWZhdWx0cy4KKwkqIG1wdy1jb25maWcuaW46IExpa2V3aXNlLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogdGFyZ21hdGNoLnNlZDogTmV3IGZpbGU7IGEgc2VkIHNjcmlwdCB0byBidWlsZCB0YXJnbWF0Y2guaCBmcm9tCisJY29uZmlnLmJmZC4KKwkqIGNvbmZpZy5iZmQ6IEFkZCAjaWYsICNlbmRpZiwgYW5kIGNvbW1lbnRzIGZvciB0YXJnbWF0Y2guaC4KKwkqIHRhcmdldHMuYzogSW5jbHVkZSAiZm5tYXRjaC5oIi4KKwkoc3RydWN0IHRhcmdtYXRjaCk6IERlZmluZS4KKwkoYmZkX3RhcmdldF9tYXRjaCk6IERlZmluZSBieSBpbmNsdWRpbmcgdGFyZ21hdGNoLmguCisJKGJmZF9maW5kX3RhcmdldCk6IElmIHRoZSB0YXJnZXQgaXMgbm90IGZvdW5kIGJ5IG5hbWUsIHNlYXJjaCBmb3IKKwlpdCBhcyBhIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtYXJtLm8sIGFvdXQtc3BhcmNsZS5vLCBocDMwMGJzZC5vLAorCWkzODZkeW5peC5vLCBtNjhrNGtuZXRic2QubywgYW5kIHJpc2NpeC5vLgorCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgYW91dC1hcm0uYywgYW91dC1zcGFyY2xlLmMsCisJaHAzMDBic2QuYywgaTM4NmR5bml4LmMsIG02OGs0a25ldGJzZC5jLCBhbmQgcmlzY2l4LmMuCisJKEhGSUxFUyk6IEFkZCB0YXJnbWF0Y2guaC4gIEFsc28sIGFscGhhYmV0aXplIGFuZCByZWluZGVudC4KKwkoQ0ZJTEVTKTogUmVtb3ZlIGkzODZkeW5peC5jIGFuZCBocDMwMGJzZC5jLgorCSh0YXJnbWF0Y2guaCk6IE5ldyB0YXJnZXQuCisJKGRvX2NsZWFuKTogUmVtb3ZlIHRhcmdtYXRjaC5oLgorCisJKiBjb25maWd1cmUuaW46IEFkZCBCRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpLgorCSogYWNjb25maWcuaDogQWRkIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisJKiBzeXNkZXAuaDogSWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYsIGRlY2xhcmUgZ2V0ZW52LgorCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogRG9uJ3QgZGVjbGFyZSBnZXRlbnYuCisKK1RodSBPY3QgIDMgMDk6Mjk6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjcHUtbW4xMHgwMC5jLCBlbGYzMi1tbjEweDAwOiBSZW1vdmVkLgorCSogY3B1LW1uMTAyMDAuYywgY3B1LW1uMTAzMDAuYzogTmV3IGZpbGVzLgorCSogZWxmMzItbW4xMDIwMC5jLCBlbGYzMi1tbjEwMzAwLmM6IE5ldyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byB0d28gc2VwYXJhdGUKKwljb25maWd1cmF0aW9ucywgbW4xMDIwMCBhbmQgbW4xMDMwMC4KKwkqIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgZWxmLmMsIHRhcmdldHMuYzogTGlrZXdpc2UuCisJKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZTogUmVidWlsdC4KKworVGh1IE9jdCAgMyAxNTozODoxOSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZG9fZGlzdGNsZWFuLgorCitXZWQgT2N0ICAyIDIxOjQwOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY3B1LW1uMTB4MDAuYywgZWxmMzItbW4xMHgwMC5jOiBOZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1tbjEweDAwLm8uCisJKEJGRDMyX0JBQ0tFTkRTKTogU2ltaWxhcmx5IGZvciBlbGYzMi1tbjEweDAwLm8uCisJKGVsZjMyLW1uMTB4MDAubyk6IEFkZCBkZXBlbmRlbmNpZXMuCisJKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfbW4xMHgwMC4KKwkoYmZkX21uMTB4MDBfYXJjaCk6IERlY2xhcmUuCisJKGJmZF9hcmNodXJlc19saXN0KTogQWRkIGJmZF9tbjEweDAwX2FyY2guCisJKiBjb25maWcuYmZkOiBBZGQgbW4xMHgwMC0qLSouCisJKiBjb25maWd1cmUuaW46IEFkZCBiZmRfZWxmMzJfbW4xMHgwMF92ZWMuCisJKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX21uMTB4MDAuCisJKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9tbjEweDAwX3ZlYyk6IERlY2xhcmUuCisJKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGYzMl9tbjEweDAwX3ZlYy4KKwkqIGJmZC1pbjIuaCwgY29uZmlndXJlOiBSZWJ1aWx0LgorCitXZWQgT2N0ICAyIDE1OjQ2OjQ1IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJb3BlblZNUy9BbHBoYTogUHJvdmlkZSBmaWxlbmFtZSBhbmQgY2FzZV9oYWNrIGZsYWdzIHZpYQorCXN5bWJvbCB0YWJsZSBmcm9tIGdhcy4KKwlBZGQgY2FzZV9oYWNrIGNvZGUgZm9yIHN5bWJvbCBvdXRwdXQgZnJvbSB2YXgvdm1zLgorCSogZXZheC1hbHBoYS5jIChldmF4X2luaXRpYWxpemUpOiBSZW1vdmUgZmlsZW5hbWUgaGFuZGxpbmcsCisJZmlsZW5hbWUgaXMgcHJvdmlkZWQgdmlhIHN5bWJvbCB0YWJsZS4KKwkoZXZheF9nZXRfc3ltdGFiKTogVXNlIGxvY2FsIHN5bWJvbCBjb3VudCB3aGVuIHNldHRpbmcgdXAgdGFibGUuCisJKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3NsdXJwX2Vnc2QpOiBQcmludCBjb3JyZWN0IG5hbWUgd2hlbgorCWRlYnVnZ2luZy4KKwkoX2JmZF9ldmF4X3dyaXRlX2Vnc2QpOiBTa2lwIGZpbGUgbmFtZSBzeW1ib2wuCisJKiBldmF4LWVtaC5jIChnZXRfdm1zX3RpbWVfc3RyaW5nKTogTG9jYWwgZnVuY3Rpb24gbm93LgorCShfYmZkX2V2YXhfd3JpdGVfZW1oKTogRXh0cmFjdCBzb3VyY2UgZmlsZW5hbWUgYW5kIGNhc2VfaGFjayBmbGFncworCWZyb20gc3ltYm9sIHRhYmxlLgorCSogZXZheF93cml0ZV9ldGlyIChfYmZkX2V2YXhfd3JpdGVfZXRpcik6IFBhc3MgYWxsIHN5bWJvbCBuYW1lcworCXRocm91Z2ggX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wuCisJKiBldmF4LW1pc2MuYyAoaGFzaF9zdHJpbmcsIF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sKTogTmV3CisJZnVuY3Rpb25zLgorCShfYmZkX2V2YXhfYmFzZW5hbWUpOiBSZW1vdmVkLgorCShfYmZkX2dldF92bXNfdGltZV9zdHJpbmcpOiBNb3ZlZCB0byBldmF4LWVtaC5jLgorCSogZXZheC5oIChldmF4X3ByaXZhdGVfZGF0YV9zdHJ1Y3QpOiBSZW1vdmUgZmlsZW5hbWUuCisJKGZsYWdfaGFzaF9sb25nX25hbWVzLCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMsCisJZmxhZ19ub19oYXNoX21peGVkX2Nhc2UsIHZtc19uYW1lX21hcHBpbmcpOiBOZXcgZmxhZ3MgZm9yCisJdm1zX2Nhc2VfaGFjay4KKworV2VkIE9jdCAgMiAxMjowMjowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGZyZWVic2QuaCAoTl9HRVRfTUFHSUNfTkVUKTogRG9uJ3QgdXNlIG50b2hsLgorCShOX0dFVE1JRF9ORVQsIE5fR0VURkxBR19ORVQpOiBMaWtld2lzZS4KKwkoTk9fU1dBUF9NQUdJQyk6IERvbid0IGRlZmluZS4KKwkoU1dBUF9NQUdJQyk6IERlZmluZS4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMKKwlubyBoYXNoIHRhYmxlIGVudHJ5IGZvciBhIGdsb2JhbCBzeW1ib2wuCisKK1R1ZSBPY3QgIDEgMTY6MTQ6MjIgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+CisKKwkqIGNvbmZpZy5iZmQgKG1pcHMqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBtaXBzKi0qLWVsZiouCisKK1R1ZSBPY3QgIDEgMTI6MzE6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBvdmVycmlkZSBhIG1lYW5pbmdmdWwKKwlzeW1ib2wgdHlwZSB3aXRoIFRfTlVMTC4gIFdhcm4gaWYgc3ltYm9sIHR5cGUgY2hhbmdlcy4gIEJhc2VkIG9uCisJcGF0Y2ggZnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgorCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgcHV0IGEgc3ltYm9sIGZyb20KKwlhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBpdCBpcyByZWZlcmVuY2VkCisJb3IgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LgorCitGcmkgU2VwIDI3IDE4OjQxOjA3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfaXNfbG9jYWxfbGFiZWwpOiAgTmV3IGZ1bmN0aW9uIHRvCisJcmVtb3ZlIGR3YXJmIGxvY2FsIGxhYmVscy4gIFNocmlua3MgYmluYXJpZXMgYnkgYSBmYWN0b3Igb2YgMyEKKworTW9uIFNlcCAyMyAxMzozMzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IENyZWF0ZSB0aGUgLnNic3Mgc2VjdGlvbgorCWJ5IGhhbmQsIHJhdGhlciB0aGFuIGJ5IGNhbGxpbmcgYmZkX21ha2Vfc2VjdGlvbi4KKworTW9uIFNlcCAyMyAwOToyMzo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYzogUmVuYW1lIG0zMnIgcmVsb2NzLgorCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KKwkqIGVsZjMyLW0zMnIuYzogVXBkYXRlLgorCitGcmkgU2VwIDIwIDExOjQzOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQorCWxpbmssIGFkanVzdCB0aGUgc3ltYm9sIGluZGV4IG9mIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4gIERvbid0CisJY2hhbmdlIHRoZSBhZGRlbmQgb2YgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiBwY3JlbF9vZmZzZXQgaXMgc2V0LgorCSogc3Vub3MuYyAoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGRvIGFueXRoaW5nIGZvcgorCWEgcmVsb2NhdGVhYmxlIGxpbmsuCisKKwkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBcHBseSB0aGUgcmVsb2NhdGlvbiBldmVuIGlmCisJaXQgaXMgemVybywgaW4gY2FzZSBzcmNfbWFzayBtYXR0ZXJzLgorCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCisKK1RodSBTZXAgMTkgMTE6MDM6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IEFsd2F5cyBpbml0aWFsaXplCisJa2VlcF9zeW1zLgorIAkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCB0YXJnZXRfaW5kZXgKKwl0byBhbiB1bmluaXRpYWxpemVkIHZhbHVlLgorCitUdWUgU2VwIDE3IDE0OjE4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogV2FybiBhYm91dCBpbGxlZ2FsIHN5bWJvbAorCWluZGljZXMsIHJhdGhlciB0aGFuIGNyYXNoaW5nLgorCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogTGlrZXdpc2UuICBDaGVjayB3aGV0aGVyIHRoZSBob3d0byBmaWVsZAorCWlzIE5VTEwuCisJKiBjb2ZmLXNoLmMgKHNoX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBmb3IgYW4gaWxsZWdhbCBzeW1ib2wKKwlpbmRleC4KKworTW9uIFNlcCAxNiAxMjozOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogQ2hhbmdlIGRzdF9tYXNrIGZvciBBUk0yNkQKKyAJcmVsb2MgdG8gMC4KKwkoY29mZl9hcm1fYWRqdXN0X3N5bW5keCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KKworCSogc3JlYy5jIChzcmVjX3NjYW4pOiBBY2NlcHQgbXVsdGlwbGUgc3ltYm9scyBvbiBhIHNpbmdsZSBsaW5lLgorCUZyb20gUGFzY2FsIE1hcnRpbiA8cG1hcnRpbkBhbHN5cy5jb20+LgorCisJKiBSRUFETUU6IE5ldyBmaWxlLgorCitGcmkgU2VwIDEzIDE0OjMyOjQyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGFvdXRmMS5oIChNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KKwkoc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBmdW5jdGlvbi4KKworRnJpIFNlcCAxMyAxNTo1MDo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZC5jIChiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogU3dpdGNoIG9uIG91dHB1dCBCRkQgcmF0aGVyCisJdGhhbiBpbnB1dCBCRkQuCisJKGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCisJKiBzZWN0aW9uLmMgKGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCisJKiBzeW1zLmMgKGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBMaWtld2lzZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2hlY2sgdGhhdAorCWJvdGggQkZEJ3MgYXJlIHRoZSByaWdodCBmbGF2b3VyLgorCSogZWNvZmYuYyAoX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCisJKiBlbGYuYyAoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCisJKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCisJKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgorCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgorCSogcGVpY29kZS5oIChwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgorCisJKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogRmlsbCBpbiBzb21lIGZpZWxkcyBmb3IKKwlSX1BBUklTQ19ESVIzMiwgc28gdGhhdCBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBwYXNzZXMKKwlpdHMgc2FuaXR5IGNoZWNrLgorCitUaHUgU2VwIDEyIDExOjQ1OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiByZWxvYy5jOiBBZGQgbTMyciByZWxvY3MuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgorCSogY3B1LW0zMnIuYyxlbGYzMi1tMzJyLmM6IE5ldyBmaWxlcy4KKworVGh1IFNlcCAxMiAxMToxMDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAoaWVlZV92ZWMpOiBTZXQgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCB0byAnXycuCisKK1dlZCBTZXAgMTEgMTE6NTc6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB0ZWtoZXguYyAoZmlyc3RfcGhhc2UpOiBDaGFuZ2UgdHlwZSBwYXJhbWV0ZXIgZnJvbSBjaGFyIHRvIGludC4KKwkob3V0KTogTGlrZXdpc2UuCisJKHBhc3Nfb3Zlcik6IENoYW5nZSBmdW5jIHRvIGV4cGVjdCBpbnQsIG5vdCBjaGFyLgorCisJKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFRlc3QgU0VDX0FMTE9DCisJcmF0aGVyIHRoYW4gU0VDX0xPQUQgd2hlbiBhbGlnbmluZyB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaXJzdAorCXNlY3Rpb24gaW4gYSBzZWdtZW50LgorCitUdWUgU2VwIDEwIDE2OjE4OjMwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogTWFrZSBhcmcgY29uc3QuCisJKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgYXJnCisJdG8gbWFrZV9iZmRfYXNlY3Rpb24oKS4KKwkqIGVsZi1iZmQuaCAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogQWRkIHByb3RvdHlwZS4KKwkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogUmVtb3ZlIHByb3RvdHlwZS4KKwkoX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQpOiBSZW1vdmUgcHJvdG90eXBlLgorCisJKiBuZXRic2QtY29yZS5jIChzd2FwX2Fib3J0KTogQWRkIHByb3RvdHlwZS4KKwkqIGFpeDM4Ni1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljCisJKiBocHV4LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCisJKiBpcml4LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCisJKiBwdHJhY2UtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KKwkqIHRyYWQtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19pbik6IERpdHRvLgorCShjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogRGl0dG8uCisJKGNvZmZfc3dhcF9maWxlaGRyX2luKTogRGl0dG8uCisJKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IERpdHRvLgorCShjb2ZmX3N3YXBfc3ltX2luKTogRGl0dG8uCisJKGNvZmZfc3dhcF9zeW1fb3V0KTogRGl0dG8uCisJKGNvZmZfc3dhcF9hdXhfaW4pOiBEaXR0by4KKwkoY29mZl9zd2FwX2F1eF9vdXQpOiBEaXR0by4KKwkoY29mZl9zd2FwX2xpbmVub19pbik6IERpdHRvLgorCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IERpdHRvLgorCShjb2ZmX3N3YXBfYW91dGhkcl9pbik6IERpdHRvLgorCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBEaXR0by4KKwkoY29mZl9zd2FwX3Njbmhkcl9pbik6IERpdHRvLgorCShjb2ZmX3N3YXBfc2NuaGRyX291dCk6IERpdHRvLgorCSogaWhleC5jIChpaGV4X3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCisJKiB0ZWtoZXguYyAoZ2V0c3ltKTogRGl0dG8uCisJKGZpbmRfY2h1bmspOiBEaXR0byAmIG1ha2Ugc3RhdGljLgorCShpbnNlcnRfYnl0ZSk6IERpdHRvLgorCShmaXJzdF9waGFzZSk6IERpdHRvLgorCShwYXNzX292ZXIpOiBEaXR0by4KKwkodGVraGV4X2dldF9zeW10YWIpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgorCSh0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCisJKHRla2hleF9ta29iamVjdCk6IERpdHRvLgorCSh0ZWtoZXhfb2JqZWN0X3ApOiBEaXR0by4KKwkobW92ZV9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCisJKHRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgorCSh0ZWtoZXhfc2V0X2FyY2hfbWFjaCk6IERpdHRvICYgbWFrZSBzdGF0aWMuCisJKHRla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgorCSh3cml0ZXZhbHVlKTogRGl0dG8uCisJKHdyaXRlc3ltKTogRGl0dG8uCisJKG91dCk6IERpdHRvLgorCSh0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCisJKHRla2hleF9zaXplb2ZfaGVhZGVycyk6IERpdHRvLgorCSh0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KKwkodGVraGV4X2dldF9zeW1ib2xfaW5mbyk6IERpdHRvLgorCSh0ZWtoZXhfcHJpbnRfc3ltYm9sKTogRGl0dG8uCisJKiBpcml4LWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24pOiBEaXR0by4KKwkoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogRGl0dG8uCisJKGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKTogRGl0dG8uCisJKGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBEaXR0by4KKwkoaXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IERpdHRvLgorCShpcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgorCSogc3JlYy5jIChzcmVjX25ld19zeW1ib2wpOiBEaXR0by4KKwkoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgorCShzcmVjX3NldF9hcmNoX21hY2gpOiBEaXR0by4KKwkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IERpdHRvLgorCShpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgorCShzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgorCShzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERpdHRvLgorCShzcmVjX3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCisJKHNyZWNfbWFrZV9lbXB0eV9zeW1ib2wpOiBEaXR0by4KKwkoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGl0dG8uCisJKHNyZWNfZ2V0X3N5bXRhYik6IERpdHRvLgorCShzcmVjX3ByaW50X3N5bWJvbCk6IERpdHRvIGFuZCBtYWtlIHN0YXRpYy4KKwkqIGVsZi5jIChlbGZfcmVhZCk6IERpdHRvCisJKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBEaXR0by4KKwkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEaXR0by4KKwkoc3ltX2lzX2dsb2JhbCk6IERpdHRvLgorCShlbGZfbWFwX3N5bWJvbHMpOiBEaXR0by4KKwkoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBEaXR0by4KKwkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogRGl0dG8uCisJKGNvZmZfcmVhbF9vYmplY3RfcCk6IERpdHRvLgorCShmaXh1cF9zeW1ib2xfdmFsdWUpOiBEaXR0by4KKwkoYnVpbGRfZGVidWdfc2VjdGlvbik6IERpdHRvLgorCShjb3B5X25hbWUpOiBEaXR0by4KKwkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBEaXR0by4KKworTW9uIFNlcCAgOSAyMjozNjowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGJmZC1pbjIuaDogUmVidWlsdCBhZnRlciBtMzJyIGNoYW5nZXMuCisKK01vbiBTZXAgIDkgMTI6MzE6MjIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZCxjb25maWd1cmUuaW4sY29uZmlndXJlOiBBZGQgbTMyciBzdXBwb3J0LgorCSogTWFrZWZpbGUuaW4sYXJjaHVyZXMuYyxlbGYuYyx0YXJnZXRzLmM6IExpa2V3aXNlLgorCSogY29uZmlnLmJmZDogS2VlcCB0YXJnZXQgbGlzdCBhbHBoYWJldGljYWxseSBzb3J0ZWQuCisKK01vbiBTZXAgIDkgMTE6NDg6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jLCBjYXNlIFJfVjg1MF9ISTE2KTogRG9uJ3QgZm9yZ2V0CisJdG8gYWRkIGluIHRoZSBjb25zdGFudCBwYXJ0IGZvdW5kIGluIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCisJKGNhc2UgUl9WODUwX0hJMTZfUyk6IExpa2V3aXNlLgorCitGcmkgU2VwICA2IDE3OjA0OjM5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogTW9kaWZ5IHRoZSBzaXplIG9mIFJfRDEwVl8xNgorCWFuZCBSX0QxMFZfMTggdG8gYmUgMSAod29yZCkuCisKK1RodSBTZXAgIDUgMTU6MjM6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IElmIHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZAorCW9mIGVpdGhlciBzZWN0aW9uIGlzIGJmZF9hYnNfc2VjdGlvbiwgdGhlbiB0aGUgbGlua2VyIGlzCisJZGlzY2FyZGluZyB0aGUgc2VjdGlvbiBhbmQgd2Ugc2hvdWxkIG5vdCBvcHRpbWl6ZSBpdC4KKworVHVlIFNlcCAgMyAxMjoxNjoyMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYW91dC1zcGFyY2xlLm8pOiBOZXcgdGFyZ2V0LgorCSogYW91dGYxLmggKFRBUkdFVF9JU19CSUdfRU5ESUFOX1ApOiBEb24ndCBkZWZpbmUgaWYgbGl0dGxlIGVuZGlhbi4KKwkqIGNvbmZpZy5iZmQgKHNwYXJjbGV0LSotYW91dCopOiBBZGQgY2FzZS4KKwkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsZV9hb3V0X3ZlYyk6IEFkZCBjYXNlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIHRhcmdldHMuYyAoc3BhcmNsZV9hb3V0X3ZlYyk6IERlY2xhcmUuCisJKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNwYXJjbGVfYW91dF92ZWMuCisJKiBhb3V0LXNwYXJjbGUuYzogTmV3IGZpbGUuCisKK1R1ZSBTZXAgIDMgMDA6NTc6MDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mCisJbG93IG9yZGVyIHNpZ24gYml0IHByb3BvZ2F0aW9uIGZvciBSX1Y4NTBfSEkxNl9TLgorCisJKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGZvcgorCWhhbmRsaW5nIFY4NTAgc3BlY2lmaWMgcmVsb2NzLgorCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IFVzZSB0aGUgbmV3IGZ1bmN0aW9uIGZvciBzb21lCisJcmVsb2NhdGlvbnMuICBUd2lkZGxlIG1hc2tzICYgc2hpZnRzIGZvciBzb21lIHJlbG9jcy4KKwlTZXQgcGFydGlhbF9pbnBsYWNlIHdoZXJlIG5lZWRlZC4KKworTW9uIFNlcCAgMiAxMjoxMjozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNwdS1taXBzLmM6IEFkZCBhbiBleHBsaWNpdCBtaXBzOjMwMDAgZW50cnksIGFuZCBjaGFuZ2UgdGhlCisJZGVmYXVsdCBhcmNoaXRlY3R1cmUgdG8gYSBtYWNoaW5lIG51bWJlciBvZiAwLgorCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX29iamVjdF9wKTogU2V0IHRoZSBtYWNoaW5lIG51bWJlcgorCWZvciBFX01JUFNfQVJDSF8xLgorCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBJZiB0aGUgbWFjaGluZSBudW1iZXIgb2YKKwl0aGUgb3V0cHV0IEJGRCBpcyB0aGUgZGVmYXVsdCwgc2V0IGl0IGZyb20gdGhlIGZpcnN0IGlucHV0IEJGRC4KKworU3VuIFNlcCAgMSAxODozODowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBbGwgdGhlIDE2Yml0IHJlbG9jcworCWluc2VydCBhdCBiaXRwb3MgemVyby4gIFRoZSBISTE2IHJlbG9jcyBhcmUgc2hpZnRlZCByaWdodAorCWJ5IDE2IGJpdHMuICBGaXggc3JjX21hc2sgZm9yIGFsbCByZWxvY3MuCisJKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfTElUVExFX05BTUUpOiBEZWZpbmUuICBUaGUgVjg1MCBpcworCWxpdHRsZSBlbmRpYW4hCisJKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfQklHX05BTUUpOiBSZW1vdmUuICBUaGUgVjg1MCBpcyBsaXR0bGUKKwllbmRpYW4hCisKK1N1biBTZXAgIDEgMTU6NDE6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6CisJUmV3cml0ZSB0byB1c2UgQkZEIGZpbGUgcmVhZCByb3V0aW5lcyBhbmQgdG8gYXZvaWQgdXNpbmcgYSBmaXhlZAorCWxlbmd0aCBmb3IgdGhlIGZpbGUgbmFtZS4KKworU2F0IEF1ZyAzMSAxMDoyMjoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLXY4NTAuYyAoZW51bSByZWxvY190eXBlKTogQWRkIFJfVjg1MF97MzIsMTYsOH0uCisJKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWRkIHN1cHBvcnQgZm9yIFJfVjg1MF97MzIsMTYsOH0uCisJKHY4NTBfcmVsb2NfbWFwKTogQWRkIHRyYW5zbGF0aW9uIGZyb20gQkZEX1JFTE9DX3szMiwxNiw4fQorCXRvIFJfVjg1MF97MzIsMTYsOH0uCisKK0ZyaSBBdWcgMzAgMTg6MDY6MDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXY4NTAuYyAocmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfSEkxNl9TLgorCShlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFkZCBpbmZvIGZvciBISTE2X1MgcmVsb2MuCisJKHY4NTBfcmVsb2NfbWFwKTogQWRkIEhJXzE2X1MgcmVsb2MuCisJKiByZWxvYy5jOiBEZWZpbmUgQkZEX1JFTE9DX1Y4NTBfKiByZWxvY3MuCisKK0ZyaSBBdWcgMzAgMTE6NDk6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQWRkIFNIIEVMRiBzdXBwb3J0LgorCSogZWxmMzItc2guYzogTmV3IGZpbGUuCisJKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogSGFuZGxlIGJmZF9hcmNoX3NoLgorCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBIYW5kbGUgYWJzb2x1dGUgc3ltYm9sLgorCSogZWxmLWJmZC5oIChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MpOiBEZWNsYXJlLgorCShfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MpOiBEZWNsYXJlLgorCSogZWxmbGluay5oIChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpKTogUmVuYW1lIGZyb20KKwllbGZfbGlua19yZWFkX3JlbG9jcy4gIE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCShlbGZfbGlua19pbnB1dF9iZmQpOiBHZXQgZXh0ZXJuYWwgc3ltYm9scyBmcm9tIGNhY2hlIGluCisJc3ltdGFiX2hkci0+Y29udGVudHMuICBHZXQgY29udGVudHMgZnJvbSBjYWNoZSBpbgorCWVsZl9zZWN0aW9uX2RhdGEuCisJKiBlbGZ4eC10YXJnZXQuaCAoYmZEX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uKTogT25seSBkZWZpbmUgaWYgbm90CisJYWxyZWFkeSBkZWZpbmVkLgorCSogcmVsb2MuYzogRGVmaW5lIEJGRF9SRUxPQ19TSF8qIHJlbG9jcy4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IERlY2xhcmUuCisJKiBjb2ZmLXNoLmMgKHNoX2luc25zX2NvbmZsaWN0KTogRml4IGEgcmV0dXJuIHZhbHVlLgorCShfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbik6IE5ldyBnbG9iYWxseSB2aXNpYmxlIGZ1bmN0aW9uLCBicm9rZW4KKwlvdXQgb2Ygc2hfYWxpZ25fbG9hZC4KKwkoc2hfYWxpZ25fbG9hZCk6IENhbGwgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4uCisJKHNoX3N3YXBfaW5zbnMpOiBDaGFuZ2UgcmVsb2NzIHBhcmFtZXRlciB0byBQVFIuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfc2hfdmVjKTogRGVjbGFyZS4KKwkoYmZkX2VsZjMyX3NobF92ZWMpOiBEZWNsYXJlLgorCSogY29uZmlnLmJmZCAoc2gtKi1lbGYqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX3NoX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgorCShiZmRfZWxmMzJfc2hsX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItc2guby4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLXNoLmMuCisKKwkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBDaGVjayB0aGF0IExNQSBkb2VzIG5vdCBza2lwIGEKKwlwYWdlIGJlZm9yZSBjaGVja2luZyBEX1BBR0VELgorCisJKiBpaGV4LmMgKGloZXhfc2Nhbik6IFJlbW92ZWQgdW5uZWNlc3NhcnkgZXh0YmFzZSB2YXJpYWJsZS4KKwkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgZXh0YmFzZTsgYWx3YXlzIHVzZSBzZWdiYXNlCisJaW5zdGVhZC4KKworVGh1IEF1ZyAyOSAxNjo1MjoxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgorCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotKik6IERpdHRvLgorCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi0qKTogRGl0dG8uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLWRndXgqKTogUmVjb2duaXplIGFzIGEgc3lub255bSBmb3IgeDg2CisJZWxmLgorCitUdWUgQXVnIDI3IDA5OjE4OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgYXJndW1lbnQuCisJKiBlbGYzMi1ocHBhLmggKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogVXBkYXRlIHByb3RvdHlwZS4KKwkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IEFkZCBuZXcgYXJndW1lbnQuICBJZgorCXdlIGVuY291bnRlciBhbiBSX0RBVEFfT05FX1NZTUJPTCByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIHRoYXQKKwl3aWxsIGhhdmUgYW4gU1RfQ09ERSB0eXBlLCBjaGFuZ2UgdGhlIHN5bWJvbCdzIHR5cGUgdG8gU1RfREFUQS4KKwkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVwZGF0ZSBwcm90b3R5cGUuCisKK1R1ZSBBdWcgMjcgMDA6MTI6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IFNldCBkeW5vYmogaWYgbmVlZGVkIGZvcgorCVJfTUlQU18zMiBhbmQgUl9NSVBTX1JFTDMyLiAgU2V0IHNnb3QgYW5kIGcgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgcmVxdWlyZSAuZ290IHRvIGV4aXN0LgorCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgorCitUaHUgQXVnIDIyIDEwOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3QgKEhMREVOVik6IE5ldyB2YXJpYWJsZSB0byBzZXQuICBTZXQgaXQgZm9yCisJKi0qLXN5c3Y0Kiwgc2luY2UgdGhvc2UgbGlua2VycyBtYXkgbm90IHN1cHBvcnQgLVIgYnV0IHRoZXkgYWx3YXlzCisJc3VwcG9ydCBMRF9SVU5fUEFUSC4KKworCSogbGliaWVlZS5oIChOU0VDVElPTlMpOiBEb24ndCBkZWZpbmUuCisJKGllZWVfZGF0YV9zdHJ1Y3QpOiBDaGFuZ2Ugc2VjdGlvbl90YWJsZSB0byBhc2VjdGlvbiAqKi4gIEFkZAorCXNlY3Rpb25fdGFibGVfc2l6ZS4KKwkqIGllZWUuYyAoZ2V0X3NlY3Rpb25fZW50cnkpOiBJZiB0aGUgdGFibGUgaXNuJ3QgYmlnIGVub3VnaCwgbWFrZQorCWl0IGJpZ2dlci4KKwkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IFJlbW92ZSBhc3NlcnRpb24gYWJvdXQgbnVtYmVyIG9mIHNlY3Rpb25zLgorCShpZWVlX29iamVjdF9wKTogQWRqdXN0IGluaXRpYWxpemF0aW9uIG9mIGllZWUgdG8gbWF0Y2ggY2hhbmdlcyB0bworCXRoZSBzdHJ1Y3R1cmUuCisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrKTogRG9uJ3QgY29weSByZWxvY3MgZm9yIHVuZGVmaW5lZAorCXN5bWJvbHMgbWVyZWx5IGJlY2F1c2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkoeGNvZmZfYnVpbGRfbGRzeW1zKTogRG9uJ3Qgc2V0IHVwIGdsb2JhbCBsaW5rYWdlIGNvZGUgZm9yIGFuCisJdW5kZWZpbmVkIHN5bWJvbCBtZXJlbHkgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZAorCWxpYnJhcnkuCisKK1R1ZSBBdWcgMjAgMTU6MDY6MDUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LXY4NTAuby4KKwkoQkZEMzJfQkFDS0VORFMpIEFkZCBlbGYzMi12ODUwLm8uCisJKiBhcmNodXJlcy5jOiBBZGQgYmZkX3Y4NTBfYXJjaC4KKwkqIGJmZC1pbjIuaDogQWRkIGJmZF92ODUwX2FyY2guCisJKiBjb25maWcuYmZkICh2ODUwLSotKik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IChiZmRfZWxmMzJfdjg1MF92ZWMpIE5ldyB2ZWN0b3IuCisJKiBjb25maWd1cmUuaW46IChiZmRfZWxmMzJfdjg1MF92ZWMpIE5ldyB2ZWN0b3IuCisJKiBjcHUtdjg1MC5jOiBOZXcgZmlsZS4KKwkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGRlZCBjYXNlIGJmZF9hcmNoX3Y4NTAuCisJKiBlbGYzMi12ODUwLmM6IE5ldyBmaWxlLgorCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfdjg1MF92ZWMpOiBOZXcgdmVjdG9yLgorCitGcmkgQXVnIDE2IDE2OjI1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IENyZWF0ZSBhbmQgZGVmaW5lCisgCWEgZnVuY3Rpb24gY29kZSBzeW1ib2wgZm9yIGFuIFhNQ19YTyBzeW1ib2wuCisKK1RodSBBdWcgMTUgMTI6MzM6MjkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluOiBVcGRhdGUgZWRpdGluZyBvZiBhdXRvY29uZiB2YXJzIHRvIHJlZmxlY3QKKwlKdWwgMTggY29uZmlndXJlLmluIGNoYW5nZS4KKwkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGVkaXRpbmcgb2YgaW5jbHVkZSBwYXRobmFtZXMgdG8gYmUKKwltb3JlIGdlbmVyYWwsIGFkZCBAREFTSF9DX0ZMQUdAIHRvIGV4cGxpY2l0IGNvbXBpbGUgcnVsZSBlZGl0LgorCitUaHUgQXVnIDE1IDEwOjM1OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltKTogVGhlIHNlY3Rpb24gZnJvbQorCXdoaWNoIHRvIG9mZnNldCB0byBnZXQgdGhlIC5wbHQgZW50cnkgYWRkcmVzcyBpcyAiLnBsdCIuCisKK1RodSBBdWcgMTUgMTY6NDA6MzAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiByZWxvYy5jOiAoQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAorCUJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQsIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUKToKKyAJQWRkZWQsIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIEFSTSBnYXMuCisJKiBsaWJiZmQuaDogUmVidWlsdAorCSogYmZkLWluMi5oOiBSZWJ1aWx0CisKK1dlZCBBdWcgMTQgMTc6MDI6MDkgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3QgdHlwbworCWluIHNlY3Rpb24gZHluaWR4IHN0YXJ0LgorCitUdWUgQXVnIDEzIDE0OjM1OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBUcmVhdCBzZWN0aW9ucyB3aG9zZQorCW5hbWUgYmVnaW5zIHdpdGggLmdudS5saW5rb25jZSBhcyBTRUNfTElOS19PTkNFLiAgVGhpcyBpcyBhbgorCW9wdGltaXphdGlvbiBmb3IgZysrLgorCitUdWUgQXVnIDEzIDE3OjA0OjQwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIG9uZSBtb2R1bGUgaGFzCisJdGhlIC1tcmVsb2NhdGFibGUtbGliIGJpdCBzZXQgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCBjbGVhciB0aGUKKwktbXJlbG9jYXRhYmxlLWxpYiBiaXQgaW4gdGhlIGhlYWRlci4KKworU2F0IEF1ZyAxMCAyMjo1OToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IHJlc29sdmUgYSBjb21tb24KKwlzeW1ib2wgYWdhaW5zdCBhIFNUVF9GVU5DIHN5bWJvbCBpbiBhIHNoYXJlZCBsaWJyYXJ5LgorCitGcmkgQXVnICA5IDEyOjQ0OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IElmIGEgZGVzY3JpcHRvcgorIAlzeW1ib2wgaXMgZm91bmQsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgCWNvZGUuCisKKwkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IE9ubHkgc2V0ICgqc3ltX2hhc2gpLT5udW1hdXgKKwlpZiBzeW0ubl9udW1hdXggaXMgbm90IHplcm8uCisJKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IFBlcm1pdCB0aGUgc3ltYm9sIGFuZCB0aGUgaGFzaCB0YWJsZQorCWVudHJ5IHRvIGRpc2FncmVlIGFib3V0IHRoZSBudW1iZXIgb2YgYXV4IGVudHJpZXMgaWYgdGhlIHN5bWJvbAorCWhhcyB6ZXJvLgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IENyZWF0ZSB0aGUgLnJlbC5keW4KKwlzZWN0aW9uIGlmIGl0IG1pZ2h0IGJlIG5lZWRlZCwgbm90IGp1c3QgaWYgaW5mby0+c2hhcmVkLgorCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBNYWtlIHJvb20gZm9yIGEgbnVsbCBlbGVtZW50IGF0CisJdGhlIHN0YXJ0IG9mIC5yZWwuZHluIGlmIHdlIGFyZSBnb2luZyB0byB1c2UgaXQuCisJKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSBjbGVhciB0aGUgZmlyc3QgZWxlbWVudAorCW9mIC5yZWwuZHluIGlmIHRoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCitUaHUgQXVnICA4IDE2OjI0OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgd2UgYWxyZWFkeSBjYWxsZWQgdGhlCisJdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjayBmb3IgYSBzeW1ib2wsIHRoZW4gZG9uJ3QgaXNzdWUgYW55IG1vcmUKKwl3YXJuaW5ncyBhYm91dCBsb2FkZXIgcmVsb2NzLgorCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZG8gYW55IGZ1cnRoZXIgcHJvY2Vzc2luZworCWFmdGVyIGNhbGxpbmcgdGhlIHVuZGVmaW5lZF9zeW1ib2wgY2FsbGJhY2suCisKKwkqIHhjb2ZmbGluay5jIChYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKTogRGVmaW5lLgorCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sCisJYXMgdGhlIEFJWCBsaW5rZXIgc2VlbXMgdG8gZG8uCisKK1RodSBBdWcgIDggMTI6MjE6NTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIGV2YXgtYWxwaGEuYyAoZXZheF9hbHBoYV92ZWMpOiBDb3JyZWN0ZWQgZmxhZ3MsIGNsZWFudXAuCisJKGV2YXhfaW5pdGlhbGl6ZSk6IFJlbW92ZSBldmF4X3JlbG9jX3RhYmxlLgorCShldmF4X2Nsb3NlX2FuZF9jbGVhbnVwKTogRGl0dG8uCisJKHJlbG9jX25pbCk6IERpdHRvLgorCShhbHBoYV9ob3d0b190YWJsZSk6IFJlbW92ZSBBTFBIQV9SX1NXUkVMMzIgYW5kIEFMUEhBX1JfU1dSRUw2NAorCWVudHJpZXMuCisJKGV2YXhfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCisJKiBldmF4LWVnc2QuYyAoX2JmZF9ldmF4X3NsdXJwX2Vnc2QpOiBBZGQgYSBmZXcgY2FzdHM7IHNldAorCWNvb2tlZF9zaXplID09IHJhd19zaXplLgorCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3JlZ2lzdGVyX2ZpbGVuYW1lKTogUmVtb3ZlLgorCSogZXZheC1ldGlyLmMgKGV0aXJfc3RjKTogQWxsb3cgRVRJUl9TX0NfU1RDX3h4IGNvbW1hbmRzLgorCSogZXZheC1taXNjLmMgKGFkZF9uZXdfY29udGVudHMpOiBNYWxsb2Mgc2VjdGlvbiBhdCBmdWxsIHNpemUuCisJKF9iZmRfc2F2ZV9ldmF4X3NlY3Rpb24pOiBNZW1jcHkgc2VjdGlvbiBjb250ZW50cyBkaXJlY3RseS4KKwkqIGV2YXguaCAoQUxQSEFfUl9TV1JFTDMyLCBBTFBIQV9SX1NXUkVMNjQpOiBSZW1vdmUuCisJKGV2YXhfcmVsb2NfdGFibGUpOiBSZW1vdmUuCisKKwkqIGhvc3RzL2FscGhhdm1zLmggKE9fQUNDTU9ERSk6IERlZmluZSBpZiBuZWVkZWQuCisKKwkqIG1ha2VmaWxlLnZtczogQWRkIGJldHRlciBzdXBwb3J0IGZvciBERUMgQyBjb21waWxhdGlvbgorCUFkZCBldmF4LmggZGVwZW5kZW5jaWVzCisKKwkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IEFkZCBjYXNlIGZvciAxNiBieXRlIHJlbG9jLgorCShCRkRfUkVMT0NfU1dSRUwzMixCRkRfUkVMT0NfU1dSRUw2NCk6IFJlbW92ZS4KKwkoQkZEX1JFTE9DX0FMUEhBX0JBU0VSRUcpOiBSZW1vdmUuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCitUaHUgQXVnICA4IDA4OjE3OjMyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogIElmZGVmIGFyb3VuZCBjYWxscyB0byBnZXR1aWQgYW5kCisJZ2V0Z2lkIGlmIF9XSU4zMiBpcyBkZWZpbmVkLgorCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIFJlbW92ZSB1bm5lY2Vzc2FyeSBXSU5HREIgaWZkZWYuCisKK1dlZCBBdWcgIDcgMjM6MTk6MDAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogYW91dHguaCBiZmQtaW4uaCBiZmQtaW4yLmggb3BuY2xzLmMgcmlzY2l4LmMgc29tLmMgdGFyZ2V0cy5jOgorCUNoYW5nZSBOT19GTEFHUyB0byBCRkRfTk9fRkxBR1MgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhbiBIUFVYCisJaW5jbHVkZSBmaWxlLgorCSogbGliYmZkLmM6ICBDcmVhdGUgZHVtbXkgZ2V0cGFnZXNpemUoKSBtYWNybyBpZiBIQVZFX0dFVFBBR0VTSVpFCisJaXNuJ3QgZGVmaW5lZC4KKworV2VkIEF1ZyAgNyAxNDoxMTo0NCAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kCisJcmVhbGxvYy4KKwkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgorCShORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MpOiBOZXcgbWFjcm8uCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKwkqIHN5c2RlcC5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgorCShyZWFsbG9jKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MuCisKKwkqIGFjbG9jYWwubTQgKEJGRF9ORUVEX0RFQ0xBUkFUSU9OKTogSW5jbHVkZSA8c3RyaW5nLmg+IG9yCisJPHN0cmluZ3MuaD4gaWYgdGhleSBleGlzdC4KKworCSogaWVlZS5jIChpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FzdCBiZmRfYWxsb2MgcmV0dXJuLgorCitXZWQgQXVnICA3IDEyOjEyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY3B1LWkzODYuYyAoaTgwODZfYXJjaCk6IEFyY2hpdGVjdHVyZSBpbmZvIGZvciB0aGUgaTgwODYuCisKKwlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBWYWxldHRlIDx2YWxldHRlQGNyZi5jYW5vbi5mcj46CisJKiBlbGYzMi1pMzg2LmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBGSVJTVF9JTlZBTElEX1JFTE9DLAorCUxBU1RfSU5WQUxJRF9SRUxPQywgUl8zODZfMTYsIFJfMzg2X1BDMTYsIFJfMzg2XzgsIFJfMzg2X1BDOC4KKwkoZWxmX2hvd3RvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIG5ldyByZWxvY3MuCisJKGVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIG5ldyByZWxvY3MuCisJKGVsZl9pMzg2X2luZm9fdG9faG93dG8pOiBKdXN0IGNhbGwgYWJvcnQuCisJKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogQ2hlY2sgdGhhdCB0aGUgcmVsb2MgdHlwZSBpcyB2YWxpZC4KKwkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCitUdWUgQXVnICA2IDEyOjU0OjU2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogQWRkZWQgUl9EMTBWXzMyLgorCitNb24gQXVnICA1IDEzOjQyOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBGb3IgYSBsb2FkYWJsZSBzZWN0aW9uLAorCW9ubHkgZ2V0IHRoZSBMTUEgZnJvbSB0aGUgcGhkciBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBwYXJ0IG9mIHRoZQorCWZpbGUuCisKKwkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBSZXdyaXRlIHRlc3RzIGZvciBzdGFydGluZyBhCisJbmV3IHNlZ21lbnQgdG8gbWFrZSB0aGVtIG1vcmUgY29tcHJlaGVuc2libGUuICBJZiB0aGUgcmVsYXRpb25zaGlwCisJYmV0d2VlbiB0aGUgTE1BIGFuZCB0aGUgVk1BIGNoYW5nZWQsIHN0YXJ0IGEgbmV3IHNlZ21lbnQuICBEb24ndAorCWNoZWNrIGR5bnNlYyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gc3RhcnQgYSBuZXcgc2VnbWVudCBmb3IgYQorCXdyaXRlYWJsZSBzZWN0aW9uOyAtTiB3aWxsIG5vdyBoYW5kbGUgdGhpcy4KKworVGh1IEF1ZyAgMSAyMjo0MzowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGxpYmhwcGEuaDogUmVtb3ZlICJlc2VsIiBjaGFuZ2VzLiAgTm90IHRoZSByaWdodCBhcHByb2FjaC4KKwkqIHNvbS5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisJKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBVc2UgU1RfREFUQSBmb3Igc3ltYm9scworCXdoaWNoIGRvbid0IGhhdmUgYSBTT00gc3ltYm9sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCisJUmV2ZXJzZXMgYSAxOTk0IGNoYW5nZS4KKworV2VkIEp1bCAzMSAxNTo1MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlNYWtlIGxkIC1OIG1vcmUgcmVhc29uYWJsZSBmb3IgRUxGOgorCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIERfUEFHRUQgaXMgbm90IHNldCwgc2V0CisJcGhkcl9pbl9zZWN0aW9uIHRvIGZhbHNlLCBhbmQgYWx3YXlzIHVzZSBhIHNpbmdsZSBsb2FkIHNlZ21lbnQuCisJKGVsZl9zb3J0X3NlY3Rpb25zKTogU29ydCBzZWN0aW9ucyBieSBMTUEgYWZ0ZXIgVk1BLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgRF9QQUdFRCBpcyBub3Qgc2V0LCBkb24ndAorCWFsaWduIHRvIG1heHBhZ2VzaXplLgorCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLgorCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBJZiBhIHNlY3Rpb24gaXMgbG9hZGVkIGJ1dCBub3QgcGFnZQorCWFsaWduZWQsIGNsZWFyIERfUEFHRUQuCisKK1dlZCBKdWwgMzEgMTU6MDA6MTIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiByZWxvYy5jOiAoQkZEX1JFTE9DX0FSTV9PRkZTRVRJTU04LCBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCk6CisgCUFkZGVkLCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBBUk0gZ2FzLgorCSogbGliYmZkLmg6IFJlYnVpbHQKKwkqIGJmZC1pbjIuaDogUmVidWlsdAorCitUdWUgSnVsIDMwIDE0OjE0OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbGliaHBwYS5oIChSX0hQUEFfRVNFTCk6IE5ldyBmaWVsZCBzZWxlY3Rvci4KKwkoZV9lc2VsKTogU2ltaWxhcmx5LgorCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSWYgd2UgZW5jb3VudGVyIGFuIGVfZXNlbCwKKwl0aGVuIGdlbmVyYXRlIFJfQ09NUDIgKFBVU0hfU1lNKSwgUl9EQVRBX0VYUFIgZml4dXAgc3RyZWFtLgorCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfREFUQV9FWFBSIGp1c3QgbGlrZSBSX0NPREVfRVhQUi4KKworVHVlIEp1bCAzMCAxMzozMToyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG8gdGhlIHJlZ3VsYXIKKwlhcmNoaXZlIHNlYXJjaCBiZWZvcmUgbG9va2luZyBmb3Igc3RyaXBwZWQgZHluYW1pYyBvYmplY3RzLgorCitGcmkgSnVsIDI2IDE3OjUxOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IE1ha2UgZXhwb3J0aW5nIGFuIHVuZGVmaW5lZAorCXN5bWJvbCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCisKK1dlZCBKdWwgMjQgMTI6MDI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFRyYWNrIHRoZSB2aXJ0dWFsCisJbWVtb3J5IHBvc2l0aW9uIHNlcGFyYXRlbHkgZnJvbSB0aGUgZmlsZSBwb3NpdGlvbiwgYW5kIHVzZSBpdCB0bworCWNvbXB1dGUgdGhlIGFsaWdubWVudCBhZGp1c3RtZW50LgorCitUdWUgSnVsIDIzIDEwOjQzOjMxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbGYzMi1kMTB2LmMgKGVsZl9kMTB2X2hvd3RvX3RhYmxlKTogQ2hhbmdlZCBhbGwgcmVsb2NzIHRvICJsb25nIgorIAlhbmQgZml4ZWQgbWFzayBvbiBSX0QxMFZfMTBfUENSRUxfTC4KKworTW9uIEp1bCAyMiAxNTozMDozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LW1pcHMuYzogSW5jbHVkZSAiYW91dC9hci5oIi4KKwkobWlwc19lbGY2NF9zbHVycF9hcm1hcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1pcHNfZWxmNjRfd3JpdGVfYXJtYXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShiZmRfZWxmNjRfYXJjaGl2ZV8qKTogRGVmaW5lLgorCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9hcmNoaXZlX3ApOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisJVXNlIGluc3RlYWQgb2YgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLgorCShiZmRfZWxmTk5fd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4gIFVzZQorCWluc3RlYWQgb2YgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLgorCShiZmRfZWxmTk5fbWtkYXJjaGl2ZSk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4gIFVzZSBpbnN0ZWFkIG9mCisJX2JmZF9nZW5lcmljX21rYXJjaGl2ZS4KKwkoVEFSR0VUX0JJR19TWU0pOiBJZiBiZmRfZWxmTk5fYXJjaGl2ZV9mdW5jdGlvbnMgaXMgZGVmaW5lZCwgdXNlCisJYmZkX2VsZk5OX2FyY2hpdmUgaW4gQkZEX0pVTVBfVEFCTEVfQVJDSElWRSByYXRoZXIgdGhhbgorCV9iZmRfYXJjaGl2ZV9jb2ZmLgorCShUQVJHRVRfTElUVExFX1NZTSk6IExpa2V3aXNlLgorCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiBDaGVjayBmb3IgYW5kIHJlamVjdCBhbiBhcmNoaXZlIG1hcAorCW5hbWUgb2YgL1NZTTY0Ly4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKworCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBIYW5kbGUKKwlTSFRfTUlQU19MSUJMSVNULCBTSFRfTUlQU19DT05URU5ULCBTSFRfTUlQU19TWU1CT0xfTElCLCBhbmQKKwlTSFRfTUlQU19FVkVOVFMgc2VjdGlvbnMuCisJKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfSUZBQ0UsCisJU0hUX01JUFNfQ09OVEVOVCwgU0hUX01JUFNfU1lNQk9MX0xJQiwgYW5kIFNIVF9NSVBTX0VWRU5UUworCXNlY3Rpb25zLgorCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KKworCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkIHJkYXRhX2luX3RleHQgZmllbGQuCisJKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDb3B5CisJcmRhdGFfaW5fdGV4dCBmcm9tIGJhY2tlbmQgaW5mbyB0byB0ZGF0YS4gIENsZWFyIGl0IGlmIGFueSBkYXRhCisJc2VjdGlvbiBjb21lcyBiZWZvcmUgLnJkYXRhLgorCShfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSByZGF0YV9pbl90ZXh0IGZpZWxkIGluCisJdGRhdGEgcmF0aGVyIHRoYW4gYmFja2VuZCBpbmZvLgorCitGcmkgSnVsIDE5IDE4OjE1OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaXggdGVzdCBmb3Igd2hldGhlciBhIGNvbXBpbGVyIGhhcyBhIDY0IGJpdAorCXR5cGUuICBGcm9tIEppbSBXaWxzb24gPHdpbHNvbkBjeWdudXMuY29tPi4KKworVGh1IEp1bCAxOCAxNTozOToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4NiopOiBOZXcgaG9zdC4KKworCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgVkVSU0lPTiwgQkZEX0hPU1RfNjRCSVRfTE9ORworCShyZXBsYWNpbmcgSE9TVF82NEJJVExPTkcpLCBCRkRfSE9TVF82NF9CSVRfREVGSU5FRCwKKwlCRkRfSE9TVF82NF9CSVQsIGFuZCBCRkRfSE9TVF9VXzY0X0JJVC4gIEFkZCBiZmQtaW4yLmg6YmZkLWluMi5oCisJdG8gQUNfT1VUUFVUIGNhbGwuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBiZmQtaW4uaCAoQkZEX0FSQ0hfU0laRSk6IERlZmluZSBhcyBAd29yZHNpemVALCBub3QgQFdPUkRTSVpFQC4KKwkoQkZEX0hPU1RfNjRfQklUKTogRGVmaW5lIGNvbmRpdGlvbmFsbHkuCisJKEJGRF9IT1NUX1VfNjRfQklUKTogRGVmaW5lIHdoZW4gQkZEX0hPU1RfNjRfQklUIGlzIGRlZmluZWQuCisJKGJmZF92bWEpOiBUeXBlZGVmIGFzIEJGRF9IT1NUX1VfNjRfQklULgorCShzeW12YWx1ZSwgYmZkX3NpemVfdHlwZSk6IExpa2V3aXNlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKGRvX2NsZWFuKTogUmVtb3ZlIGJmZC10bXAuaC4KKwkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIGJmZC1pbjMuaC4KKwkoc3RtcC1iZmQuaCk6IEp1c3QgZG8gY29weS1pZi1jaGFuZ2UgYmZkLWluMy5oIGJmZC5oLgorCShiZmQtaW4zLmgpOiBOZXcgdGFyZ2V0LgorCisJKiBjb25maWcuYmZkIChzcGFyYy0qLXN5c3Y0Kik6IERvbid0IGJ1aWxkIHN1bm9zX2JpZ192ZWMuICBGcm9tCisJQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+LgorCisJKiBjb25maWd1cmUuaG9zdDogU2V0IElOU1RBTExfU0hMSUIuCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfU1VCU1QgKElOU1RBTExfU0hMSUIpLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBVc2UgQElOU1RBTExfU0hMSUJALgorCisJKiBjb25maWcuYmZkIChtaXBzKi0qLWlyaXg2Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaG9zdDogSGFuZGxlIElyaXggNiBzaGFyZWQgbGlicmFyeSBsaWtlIElyaXggNS4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBjaGVjayBhbiBYTUNfVEQKKwlzeW1ib2wgZm9yIGEgbWFnaWMgbmFtZS4KKwkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjaGFuZ2UgdGhlIHJlbG9jIHN5bWJvbCBmb3IgYW4KKwlYTUNfVEQgc3ltYm9sLgorCShfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZ2V0IHRoZSBUT0Mgb2Zmc2V0IGZvciBhbgorCVhNQ19URCBzeW1ib2wuCisKK1RodSBKdWwgMTggMTE6MzY6MzEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluOiBBZGQgRUxGIHN1cHBvcnQgdG8gbWlwcyBjb25maWcsIGNyZWF0ZSB0aGUKKwllbGYzMi10YXJnZXQuaCBmaWxlIGluIHRoZSBvYmplY3QgZGlyLgorCSogbXB3LW1ha2Uuc2VkOiBFZGl0IGVsZlhYLXRhcmdldC5oIHJlZnMgYXQgYmVnaW5uaW5ncyBvZiBsaW5lcy4KKworV2VkIEp1bCAxNyAxODowMjozMiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29mZi1wcGMuYzogUmVkaWQgZGVidWcgc2NoZW1lIC0gbnVtZXJvdXMgZnByaW50ZidzIGdvbmUuCisJQWxzbyByZW1vdmVkIG1vc3QgYWJvcnQgY2FsbHMsIGluIGZhdm9yIG9mIHVzaW5nIGJmZCByZXBvcnRpbmcuCisKK1dlZCBKdWwgMTcgMTQ6NTE6NTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LWQxMHYuby4KKwkoQkZEMzJfQkFDS0VORFMpIEFkZCBlbGYzMi1kMTB2Lm8uCisJKiBhcmNodXJlcy5jOiBBZGQgYmZkX2QxMHZfYXJjaC4KKwkqIGJmZC1pbjIuaDogQWRkIGJmZF9kMTB2X2FyY2guCisJKiBjb25maWcuYmZkIChkMTB2LSotKik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IChiZmRfZWxmMzJfZDEwdl92ZWMpIE5ldyB2ZWN0b3IuCisJKiBjb25maWd1cmUuaW46IChiZmRfZWxmMzJfZDEwdl92ZWMpIE5ldyB2ZWN0b3IuCisJKiBjcHUtZDEwdi5jOiBOZXcgZmlsZS4KKwkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGRlZCBjYXNlIGJmZF9hcmNoX2QxMHYuCisJKiBlbGYzMi1kMTB2LmM6IE5ldyBmaWxlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiByZWxvYy5jIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLCBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLAorIAlCRkRfUkVMT0NfRDEwVl8xOCwgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwpOiBEZWZpbmUuCisJKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9kMTB2X3ZlYyk6IE5ldyB2ZWN0b3IuCisKK1dlZCBKdWwgMTcgMTA6NTg6NTUgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmVkIGJvZ3VzIGZwcmludGYKKworVHVlIEp1bCAxNiAyMzo0OTowMiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBhcmNodXJlcy5jIGJmZC1pbjIuaDogIEFkZCBiZmRfbWFjaF9pMzg2X2kzODYgYW5kCisJYmZkX21hY2hfaTM4Nl9pODA4NiBtYWNoaW5lIHR5cGVzLgorCitXZWQgSnVsIDEwIDEyOjQyOjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogU2V0IFNFQ19DT0RFIGZvciBfSU5JVAorCWFuZCBfRklOSSBzZWN0aW9ucy4KKworV2VkIEp1bCAxMCAxMToxODoyMSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEEvVVggZG9lcyBub3QgcmVxdWlyZQorCXNwZWNpYWwgaGFuZGxpbmcgb2YgdGhlIF9MSUIgc2VjdGlvbi4KKworVHVlIEp1bCAgOSAxNTo1MjoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IFVzZSB0aGUgY29ycmVjdAorCXZhbHVlIGZvciBSX1JFTEJZVEUuCisKKwkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogT25seSAic2hyaW5rcyIKKwlhcnJheSBpZiBvbmUgd2FzIGFsbG9jYXRlZC4KKworVHVlIEp1bCAgOSAxMjoyMTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBray5pbmZvLmthbmFnYXdhLXUuYWMuanA+OgorCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIG5ldyBmaWVsZHMKKwl1c2VfcmxkX29ial9oZWFkIGFuZCBybGRfdmFsdWUuCisJKG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCisJKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IE1hcmsgX19ybGRfb2JqX2hlYWQgc3ltYm9sIGFzCisJZHluYW1pYy4KKwkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgLnJsZF9tYXAgc2VjdGlvbi4gIElmCisJX19ybGRfb2JqX2hlYWQgc3ltYm9sIG5vdCBzZWVuLCBjcmVhdGUgYW4gX19ybGRfbWFwIHN5bWJvbC4KKwkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTWFrZSBzcGFjZSBpbiAucmxkX21hcCBzZWN0aW9uLgorCUNyZWF0ZSBhIERUX01JUFNfUkxEX01BUCBlbnRyeSByYXRoZXIgdGhhbiBhIERUX0RFQlVHIGVudHJ5LgorCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTYXZlIHZhbHVlIG9mIF9fcmxkX21hcCBvcgorCV9fcmxkX29ial9oZWFkIHN5bWJvbC4KKwkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBIYW5kbGUgRFRfTUlQU19STERfTUFQLgorCitNb24gSnVsICA4IDE2OjE4OjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IFJlbW92ZSBCRkRfUkVMT0NfMzJfUENSRUwgZW50cnkuCisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEZvciBSX1BQQ19BRERSMTZfSEEsIHVzZQorCXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLgorCShwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKKwkqIGNvZmYtbWlwcy5jIChzdHJ1Y3QgbWlwc19oaSk6IERlZmluZS4KKwkobWlwc19yZWZoaV9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKyAJKG1pcHNfcmVmaGlfYWRkciwgbWlwc19yZWZoaV9hZGRlbmQpOiBSZW1vdmUuCisJKG1pcHNfcmVmaGlfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIFJFRkhJIHJlbG9jcy4KKwkobWlwc19yZWZsb19yZWxvYyk6IFByb2Nlc3MgbWlwc19yZWZoaV9saXN0LgorCShtaXBzX3JlbGhpX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtaXBzX3JlbGhpX2FkZHIsIG1pcHNfcmVsaGlfYWRkZW5kKTogUmVtb3ZlLgorCShtaXBzX3JlbGhpX3JlbG9jKTogTWFpbnRhaW4gYSBsaXN0IG9mIHVubWF0Y2hlZCBSRUxISSByZWxvY3MuCisJKG1pcHNfcmVsbG9fcmVsb2MpOiBQcm9jZXNzIG1pcHNfcmVsaGlfbGlzdC4KKwkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgUkVGSEkgb3IKKwlSRUxISSByZWxvY3MgYmVmb3JlIHRoZSBhc3NvY2lhdGVkIFJFRkxPIG9yIFJFTExPIHJlbG9jLgorCitGcmkgSnVsICA1IDE5OjI3OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogU2V0IHJlbG9jX2NvdW50IGZpZWxkcy4KKworVGh1IEp1bCAgNCAxMjowMDozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBjcmVhdGUgZHluYW1pYworCXNlY3Rpb25zIHVubGVzcyB0aGlzIGlzIGEgU3VuT1MgbGluay4KKworCSogVkVSU0lPTjogU2V0IHRvIDIuNy4xLgorCisJKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCisKK1dlZCBKdWwgIDMgMTQ6NTk6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2YW91dC5jOiBJbmNsdWRlICJhb3V0L2FvdXQ2NC5oIi4KKyAJKGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZS4KKworCSogbmV0YnNkLmggKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBNYWtlIHN1cmUgdGhhdAorCWFkanVzdF9zaXplc19hbmRfdm1hcyBpcyBjYWxsZWQgYmVmb3JlIGZpZGRsaW5nIHdpdGggdGhlIG1hZ2ljCisJbnVtYmVyLgorCitUdWUgSnVsICAyIDIzOjMwOjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBGaXggY2FzdHMgb2YgcHNpbmZvLgorCitTdW4gSnVuIDMwIDEzOjM0OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliYmZkLWluLmggKGl0b3MsIHN0b2kpOiBEb24ndCBkZWZpbmUuCisJKiBsaWJiZmQuaDogUmVidWlsZC4KKwkqIGkzODZseW54LmMgKEtFRVBJVCk6IERlZmluZSBhcyB1ZGF0YS5pLgorCShOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSk6IERvbid0IHVzZSBzdG9pLgorCShOQU1FKGx5bngsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IExpa2V3aXNlLgorCSogcmlzY2l4LmMgKHJpc2NpeF9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbgorCWZsYWdzLiAgRG9uJ3QgdXNlIHN0b2kuCisKKwkqIGVsZjMyLW1pcHMuYyAoRUxGX01BR1BBR0VTSVpFKTogQ2hhbmdlIGRlZmluaXRpb24gdG8gMHgxMDAwLgorCisJKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRG9uJ3Qgc3RhcnQgYSBuZXcgc2VnbWVudCBmb3IKKyAJYSB3cml0YWJsZSBzZWN0aW9uIGlmIGl0J3Mgb24gdGhlIHNhbWUgcGFnZSBhcyB0aGUgcHJldmlvdXMKKyAJc2VnbWVudC4gIFJlc2V0IHRoZSB3cml0YWJsZSB2YXJpYWJsZSBmb3IgYSByZWFkb25seSBzZWN0aW9uLgorCitTYXQgSnVuIDI5IDE2OjE4OjUxIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogTWlzc2luZyBpbml0aWFsaXphdGlvbnMgb2YKKwlmaXJzdF90aHVua19hZGRyZXNzLCB0aHVua19zaXplLCBhbmQgaW1wb3J0X3RhYmxlX3NpemUuCisJKiBwZWljb2RlLmg6IEltcHJvdmVkIHNvbWUgZGlhZ25vc3RpY3MgcmVnYXJkaW5nIGVkYXRhIHNlY3Rpb25zLgorCisJKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogRWFybGllciBlcnJvciBjaGVjaworCW9uIElNR0xVRSByZWxvY3MuCisJKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBJbXByb3ZlZCBkaWFnbm9zdGljIGZvciBsYXJnZSBUT0NERUZOJ3MuCisJKFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkZWQgbWlzc2luZyBEX1BBR0VELgorCitGcmkgSnVuIDI4IDEzOjQ4OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEFuIHVuZGVmaW5lZCBzeW1ib2wKKwl3aXRoIFhDT0ZGX0RFRl9EWU5BTUlDIHNldCBpcyByZWFsbHkgZGVmaW5lZC4KKwkoeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IE9ubHkgY3JlYXRlIHNwZWNpYWwgc2VjdGlvbnMgaWYgdXNpbmcgYW4KKwlYQ09GRiBoYXNoIHRhYmxlLgorCisJKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIHhjb2ZmLXBvd2VybWFjIGxpa2UKKwlhaXhjb2ZmLXJzNjAwMC4KKwkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgorCitGcmkgSnVuIDI4IDExOjE3OjAwIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBlbGY2NC1hbHBoYS5jIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBmbGFncworCWZpZWxkLgorCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIpOiBEZWZpbmUuCisJKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfTUVNKTogRGVmaW5lLgorCShBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpOiBEZWZpbmUuCisJKGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBmbGFncyBmaWVsZC4KKwkoZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzKTogUmVjb3JkIHR5cGVzIG9mIExJVFVTRSBlbnRyaWVzIHRoYXQKKwlhcmUgZm91bmQgZm9yIExJVEVSQUwgcmVsb2NzLgorCShlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCBoYXMgaXRzIGFkZHJlc3MKKwl0YWtlbiwgd2UgY2Fubm90IGdlbmVyYXRlIGEgLnBsdCBlbnRyeSBmb3IgdGhlIHN5bWJvbC4KKworVGh1IEp1biAyNyAxMToyNDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0lTQ19QT1NJWCwgYW5kIGNoZWNrIGZvciBzZXRpdGltZXIgYW5kCisJc3lzY29uZiBmdW5jdGlvbnMgKGZvciBncHJvZikuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKworV2VkIEp1biAyNiAxNjoyOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfYXJjaGl2ZV9wKTogQ2hlY2sgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluCisJYW4gYXJjaGl2ZSBpZiBpdCBoYXMgYSBtYXAuICBJZiB0aGUgb2JqZWN0IGZpbGUgaGFzIHRoZSB3cm9uZworCXh2ZWMsIHJlamVjdCBpdC4KKworCSogY29mZi1hbHBoYS5jIChhbHBoYV9hZGp1c3RfcmVsb2NfaW4pOiBTZXQgdGhlIGFkZGVuZCBmb3IgYQorCUJSQUREUiwgU1JFTDE2LCBTUkVMMzIsIG9yIFNSRUw2NCByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsCisJc3ltYm9sLgorCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBVc2UgUkVMU1osIG5vdCBzaXplb2YuCisJKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IFVzZSBGSUxIU1osIG5vdCBzaXplb2YuCisJKGNvZmZfc3dhcF9zeW1fb3V0KTogVXNlIFNZTUVTWiwgbm90IHNpemVvZi4KKwkoY29mZl9zd2FwX2F1eF9vdXQpOiBVc2UgQVVYRVNaLCBub3Qgc2l6ZW9mLgorCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IFVzZSBMSU5FU1osIG5vdCBzaXplb2YuCisJKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IFVzZSBBT1VUU1osIG5vdCBzaXplb2YuCisJKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIFNDTkhTWiwgbm90IHNpemVvZi4KKwkqIHBlaWNvZGUuaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCitUdWUgSnVuIDI1IDE1OjI4OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBDb21tZW50IG91dCBjb2RlCisJZGVhbGluZyB3aXRoIG1ha2luZyBHT1QgcG9pbnRlcnMgbmVnYXRpdmUgb2YgdGhlIEdPVCBzeW1ib2wgZm9yCisJbm93LgorCitUdWUgSnVuIDI1IDExOjQxOjI0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndAorCWluY3JlbWVudCB0aGUgLnJlbGEucGx0IHNpemUgdW50aWwgYWZ0ZXIgd2UncmUgZG9uZSBjcmVhdGluZyB0aGUKKwkucGx0IGVudHJ5LgorCShlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgLnBsdCBlbnRyeSB0byBsb2FkIHRoZQorCS5yZWxhLnBsdCBvZmZzZXQgZGlyZWN0bHkgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgaXQuCisKK01vbiBKdW4gMjQgMTc6MTU6MTAgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworICAgICAgICAqIE1ha2VmaWxlLmluLCAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpcik6CisJVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisgICAgICAgICogZG9jL01ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLAorCWluY2x1ZGVkaXIsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldAorCXZhbHVlcy4KKyAgICAgICAgKGRvY2Rpcik6IERlbGV0ZWQuCisgICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiB2Mi41IG9yIGhpZ2hlci4KKyAgICAgICAgKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK01vbiBKdW4gMjQgMjI6NTA6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEZpeCB0eXBvIGluIFJfRU5EX1RSWSBmb3IgZXhjZXB0aW9uCisJaGFuZGxpbmcgY29kZSA+IDFrIGF3YXkuCisKK01vbiBKdW4gMjQgMTg6NDE6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IElmIERFQlVHIGlzCisJZGVmaW5lZCwgb3V0cHV0IHdoZW5ldmVyIHRoZSBzeW1ib2wgaXMgdXBkYXRlZC4KKworTW9uIEp1biAyNCAxNzo1ODoxMiAxOTk2ICBKb3VrZSBOdW1hbiAgPGpudW1hbkBiYXppcy5ubD4KKworCSogZWxmLmMgKGVsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2FkZHIgb2YgYSBub24gU0VDX0FMTE9DCisJc2VjdGlvbiB0byAwIGlmIHVzZXJfc2V0X3ZtYSBpcyBzZXQuCisJKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgorCitTdW4gSnVuIDIzIDIwOjQyOjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwlQYXJ0aWFsbHkgdW5kbyBwYXRjaCBvZiBKdW4gMjAuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IFVzZSBDT0ZGX0lNQUdFX1dJVEhfUEUuCisJKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBSZS1hZGQgZGVsZXRlZCBjb2RlLCBidXQKKwl1c2UgI2lmZGVmIENPRkZfV0lUSF9QRSwgbm90IENPRkZfT0JKX1dJVEhfUEUuCisJKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZS1hZGQgI2lmZGVmLgorCitGcmkgSnVuIDIxIDE3OjM4OjE1IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+CisKKwkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgorCitGcmkgSnVuIDIxIDE1OjE5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBiZmRfYXJjaF9hbHBoYSBjYXNlLgorCitGcmkgSnVuIDIxIDEyOjM1OjI3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBlbGY2NC1hbHBoYS5jOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy5iZmQgKGFscGhhLSotbGludXhlY29mZiopOiBOZXcgdGFyZ2V0LgorCShhbHBoYS0qLWxpbnV4KiwgYWxwaGEtKi1lbGYqKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaW4gKGJmZF9lbGY2NF9hbHBoYV92ZWMpOiBOZXcgdmVjdG9yLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogdGFyZ2V0cy5jIChiZmRfZWxmNjRfYWxwaGFfdmVjKTogRGVjbGFyZS4KKwkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjY0X2FscGhhX3ZlYyBpZiBCRkQ2NC4KKwkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9HUERJU1ApOiBEZWZpbmUuCisJKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoQkZENjRfQkFDS0VORFMpOiBBZGQgZWxmNjQtYWxwaGEuby4KKwkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjY0LWFscGhhLmMuCisKK1RodSBKdW4gMjAgMTg6MTQ6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5jIChlY29mZl9hcm1hcF9oYXNoKTogSWYgaGxvZyBpcyAwLCBqdXN0IHJldHVybiAwLCByYXRoZXIKKwl0aGFuIHJlbHlpbmcgb24gYSByaWdodCBzaGlmdCBvZiAzMi4KKworVGh1IEp1biAyMCAxMTowMDo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IENoYW5nZSBDT0ZGX0lNQUdFX1dJVEhfUEUKKwlpZmRlZiB0byBDT0ZGX1dJVEhfUEUuCisJKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuICBEZWxldGUgQ09GRl9PQkpfV0lUSF9QRS4KKwkqIHBlLXthcm0saTM4NixwcGN9LmMgKENPRkZfT0JKX1dJVEhfUEUpOiBEZWxldGUuCisJKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWxldGUgaWZkZWYKKwlDT0ZGX0lNQUdFX1dJVEhfUEUsIGFsd2F5cyBpbmNsdWRlLgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogIi5kcmVjdHZlIiBkb2Vzbid0IGhhdmUgdHJhaWxpbmcgMC4KKworV2VkIEp1biAxOSAxMTozNzo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBGaXggdXAgdGhlIHRlc3QgZm9yIC1UdGV4dCB0bworCWFwcHJveGltYXRlIHRoZSBjb3JyZWN0IGFuc3dlciBpZiBTSVpFT0ZfSEVBREVSUyB3YXMgbm90IHVzZWQuCisKKwkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTZXQgc2VjdGlvbiBmaWxlCisJcG9zaXRpb24gYmFzZWQgb24gTE1BIHJhdGhlciB0aGFuIFZNQS4KKworV2VkIEp1biAxOSAxMToxOToyNSAxOTk2ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FSUM1IDYwLzMvMTQyICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgorCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEb24ndCBvdXRwdXQgYW55CisJc3ltYm9scyBpZiBpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwuCisKK1R1ZSBKdW4gMTggMTU6MTc6MzYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvZmYtaDgzMDAuYzogUmVtb3ZlICNpZiAwIGNvZGUuCisJKGNvbXBhdGFibGUpOiBEb24ndCBhbGxvdyBtaXhpbmcvbWF0Y2hpbmcgb2YgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCisKKwkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2g4MzAwcyk6IEFkZC4KKwkqIGJmZC1pbjIuaDogUmVidWlsdC4KKwkqIGNvZmYtaDgzMDAuYyAoZnVuY3ZlY19oYXNoX25ld2Z1bmMpOiBIYW5kbGUgSDgvUyB0b28uCisJKEJBRE1BRyk6IExpa2V3aXNlLgorCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogTGlrZXdpc2UuCisJKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KKwkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogTGlrZXdpc2UuCisJKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCisJKiBjcHUtaDgzMDAuYyAoaDgzMDBfc2Nhbik6IExpa2V3aXNlLgorCUFkZCBIOC9TIHRvIGJmZF9oODMwMF9hcmNoIGxpc3QuCisKK1R1ZSBKdW4gMTggMTQ6NDI6NTggMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwlBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TOgorCSogZXZheC5oLCBldmF4LWFscGhhLmMsIGV2YXgtZWdzZC5jLCBldmF4LWVtaC5jOiBOZXcgZmlsZXMuCisJKiBldmF4LWV0aXIuYywgZXZheC1taXNjLmMsIGhvc3RzL2FscGhhdm1zLmg6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZy5oLXZtcywgbWFrZWZpbGUudm1zOiBOZXcgZmlsZXMuCisJKiBjb25maWcuYmZkIChhbHBoYS0qLSp2bXMqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbiAoZXZheF9hbHBoYV92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIHJlbG9jLmMgKEJGRF9SRUxPQ19TV1JFTDMyLCBCRkRfUkVMT0NfU1dSRUw2NCk6IERlZmluZS4KKwkoQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsIEJGRF9SRUxPQ19BTFBIQV9CQVNFUkVHKTogRGVmaW5lLgorCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cik6IERlZmluZS4KKwkoZXZheF9hbHBoYV92ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBlY29mZmFscGhhX2xpdHRsZV92ZWMgYW5kIGV2YXhfYWxwaGFfdmVjCisJaWYgQkZENjQgaXMgZGVmaW5lZC4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKEJGRDY0X0JBQ0tFTkRTKTogQWRkIGV2YXgtYWxwaGEubywgZXZheC1lZ3NkLm8sIGV2YXgtZXRpci5vLAorCWV2YXgtZW1oLm8sIGFuZCBldmF4LW1pc2Muby4KKwkoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGV2YXgtYWxwaGEuYywgZXZheC1lZ3NkLmMsCisJZXZheC1ldGlyLmMsIGV2YXgtZW1oLmMsIGFuZCBldmF4LW1pc2MuYy4KKwkoSEZJTEVTKTogQWRkIGV2YXguaC4KKworVHVlIEp1biAxOCAxMzo1NDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IE1ha2UgbmFtZSBhIGNvbnN0CisJcG9pbnRlci4KKwkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KKworTW9uIEp1biAxNyAxMDowNjo1MCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogc29tLmggKFJfSFBQQV9CRUdJTl9UUlksIFJfSFBQQV9FTkRfVFJZKTogRGVmaW5lLgorCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9CRUdJTl9UUlkgYW5kIFJfRU5EX1RSWS4KKworTW9uIEp1biAxNyAxMjo0OToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGNyZWF0ZSBhIHJlbG9jCisJZm9yIFJfTUlQU19SRUwzMiBhbmQgUl9NSVBTXzMyIHJlbG9jcyBpZiBubyBkeW5hbWljIHNlY3Rpb25zIHdlcmUKKwljcmVhdGVkLgorCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBPbmx5IGNyZWF0ZSAucmVsLmR5biBmb3IgUl9NSVBTX1JFTDMyIGFuZAorCVJfTUlQU18zMiByZWxvY3MgaWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KKworVGh1IEp1biAxMyAyMDoxNDo1MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogVXNlIHBlaV9zZWN0aW9uX2RhdGEgcmF0aGVyIHRoYW4KKwlfY29va2VkX3NpemUuICBDb3JyZXNwb25kcyB0byBNYXkgMTMgY2hhbmdlIGluIGNvZmZjb2RlLmguCisKK1RodSBKdW4gMTMgMTA6MjM6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHRoZXJlIGFyZSBsb25nCisJc2VjdGlvbiBuYW1lcywgYWx3YXlzIHNldCB0aGUgZl9zeW1wdHIgZmllbGQsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCisJc3ltYm9scy4KKwkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBjbGVhciB0aGUgZl9zeW1wdHIgZmllbGQKKwlpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4KKworCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKKwlfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuCisJKGNvZmZfcmVhbF9vYmplY3RfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgorCW1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZS4KKwkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgc29tZSBzeW1ib2xzCisJYmVmb3JlIHRyeWluZyB0byByZWFkIHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4KKworV2VkIEp1biAxMiAxMToxNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogV2hlbiBjb25zaWRlcmluZyB3aGV0aGVyCisJdG8gcmVwbGFjZSBhIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0IHdpdGggYSBzeW1ib2wgZnJvbSBhbm90aGVyCisJZHluYW1pYyBvYmplY3QsIGRvIHRoZSByZXBsYWNlbWVudCBpZiB0aGUgZXhpc3Rpbmcgc3ltYm9sIGlzCisJZ2xvYmFsIGxpbmthZ2UgY29kZS4KKworCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBleHBsaWNpdGx5CisJZm9yIF9wdHJnbCwgYW5kIHRyZWF0IGl0IGFzIGdsb2JhbCBsaW5rYWdlIGNvZGUuCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBOb3RpY2UgaWYgd2UgZmluZCBhCisJZmlsZW5hbWUgb3IgTl9TTyBzeW1ib2wgcGFzdCB0aGUgb2Zmc2V0LCBhbmQgdXNlIGl0IHRvIGluZGljYXRlCisJdGhhdCB0aGVyZSBpcyBubyBsaW5lIG51bWJlciBvciBmdW5jdGlvbiB3aGVuIGFwcHJvcHJpYXRlLgorCitUdWUgSnVuIDExIDE1OjI0OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IFNldCBYQ09GRl9ERUZfUkVHVUxBUiBmb3IgYQorCWNvbW1vbiBzeW1ib2wgZGVmaW5lZCBieSB0aGUgbGlua2VyLiAgRG9uJ3QgZXhwb3J0IGZ1bmN0aW9uIGNvZGUKKwlldmVuIGlmIGV4cG9ydF9kZWZpbmVkcyBpcyBzZXQuCisKK01vbiBKdW4gMTAgMTE6NTc6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogQWRkIG5ldyBlbnRyaWVzIGZvciBSX0JDQ19JTlYKKwlhbmQgUl9KTVBfREVMLgorCShydHlwZTJob3d0byk6IEhhbmRsZSBSX0JDQ19JTlYgYW5kIFJfSk1QX0RFTC4KKwkoaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCk6IE5ldyBmdW5jdGlvbi4KKwkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IEVsaW1pbmF0ZSBqdW1wcyBtYWRlIHVubmVjZXNzYXJ5IGJ5CisJcmVsYXhpbmcuCisKK1N1biBKdW4gIDkgMTY6MzA6MjAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBGaXggbWFueSBtaW5vciBzcGFjaW5nCisJcHJvYmxlbXMuCisJKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUsIGNhc2VzIFJfSk1QMSwgUl9KTVAyKTogQWRqdXN0ICJkb3QiCisJY29ycmVjdGx5IGZvciB0aGUgdHdvIHZhcmlhbnRzLiAgQWxsb3cgcmVsYXhpbmcgaWYgdGhlIHRhcmdldAorCWlzIDEyOCBieXRlcyBhd2F5IHNpbmNlIGFmdGVyIHJlbGF4YXRpb24gaXQnbGwgYmUgMTI2IGJ5dGVzIGF3YXkuCisJKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUsIGNhc2UgUl9QQ1JXT1JEKTogQ29ycmVjdGx5IGFkanVzdAorCSJkb3QiIGFuZCAidmFsdWUiLiAgQWxsb3cgcmVsYXhpbmcgaWYgdGhlIHRhcmdldCBpcyAxMjggYnl0ZXMKKwlhd2F5IHNpbmNlIGFmdGVyIHJlbGF4YXRpb24gaXQnbGwgYmUgMTI2IGJ5dGVzIGF3YXkuCisJKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IEtlZXAgcmVsYXhpbmcKKwl0aGUgZ2l2ZW4gc2VjdGlvbiB1bnRpbCBub3RoaW5nIGNoYW5nZXMuCisKK1RodSBKdW4gIDYgMTU6MjQ6NDUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFJlbW92ZSB0aGUgX1BEQVRBCisgCWFsaWdubWVudCBoYWNrLS13ZSBjYW4gZ2V0IHRoZSBsbm5vcHRyIGluZm8gYW5vdGhlciB3YXkgd2l0aG91dAorIAlzdWRkZW5seSBpbmNyZWFzaW5nIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiAgU2V0IHRoZSBmbGFncyBmb3IKKwl0aGUgX1BEQVRBIHNlY3Rpb24uCisJKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvIHNvLgorCitUaHUgSnVuICA2IDExOjI0OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFB1dCBhIHRpbWVzdGFtcCBpbiB0aGUgZmlsZQorCXRvIGtlZXAgdGhlIEhQIGVtdWxhdG9yIGRhdGFiYXNlIGhhcHB5LgorCisJKiBjb25maWcuYmZkOiBSZWNvZ25pemUgcG93ZXJwYy0qLWxpbnV4KiBhbmQgcG93ZXJwY2xlLSotbGludXgqLgorCUZyb20gS2V2aW4gQnVldHRuZXIgPGtldkBwcmltZW5ldC5jb20+LgorCitXZWQgSnVuICA1IDE1OjE2OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCB0cnkgdG8gcHJpbnQgdGhlCisJbmFtZSBvZiBhIE5VTEwgc2VjdGlvbi4KKworVHVlIEp1biAgNCAxODo1Mzo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElmIG5vdGljZV9hbGwgaXMKKwlzZXQsIGFsd2F5cyBjYWxsIHRoZSBub3RpY2UgY2FsbGJhY2suCisKKwkqIFZFUlNJT046IEluY3JlbWVudCBmb3IgYmZkbGluay5oIGNoYW5nZS4KKworTW9uIEp1biAgMyAxMTowMTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc2guYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogU2V0IHRvIDQuCisJKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgZGlmZmVyZW50bHkgc2l6ZWQKKwl0cmFpbGluZyBhbGlnbm1lbnQgcmVsb2MuCisKKwkqIGJmZC1pbi5oOiBVc2UgI2Vycm9yIGlmIEJGRF9IT1NUXzY0X0JJVCBjYW4gbm90IGJlIGRlZmluZWQuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBjb25maWd1cmUuaW46IFdhcm4gaWYgdGhlcmUgaXMgbm8ga25vd24gNjQgYml0IHR5cGUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHBwY2Jvb3Quby4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHBwY2Jvb3QuYy4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJbml0aWFsaXplIGMuCisJRnJvbSBQZXIgRm9nZWxzdHJvbSA8cGVyLmZvZ2Vsc3Ryb21AbWFpbGJveDIwMC5zd2lwbmV0LnNlPi4KKworU2F0IEp1biAgMSAyMTo0OTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LW1pcHMuYyAoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luKQorCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogTW92ZSBmcm9tIGhlcmUuLi4KKwkqIGVsZjMyLW1pcHMuYyAoYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luKQorCShiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0KTogLi4udG8gaGVyZS4KKworRnJpIE1heSAzMSAxMzo1MToyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LW1pcHMuYzogSW1wcm92ZSByZWxvYyBzcGVjaWFsX2Z1bmN0aW9ucyBhbmQgaGFuZGxpbmcgb2YKKwlTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyk6IFJlbmFtZSBmcm9tCisJbWlwc19lbGZfaGkxNl9yZWxvYyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgorCShfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9sbzE2X3JlbG9jIGFuZAorCW1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KKwkoX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dvdDE2X3JlbG9jIGFuZAorCW1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KKwkoX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ3ByZWwxNl9yZWxvYworCWFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKGdwcmVsMTZfd2l0aF9ncCk6IENoZWNrIGhvd3RvLT5zcmNfbWFzayBiZWZvcmUgdXNpbmcgdmFsdWUgaW4KKwlpbnNuLgorCShfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9ncHJlbDMyX3JlbG9jCisJYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KKwkoZ3ByZWwzMl93aXRoX2dwKTogQ2hlY2sgaG93dG8tPnNyY19tYXNrIGJlZm9yZSBmZXRjaGluZyB2YWx1ZS4KKwkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IE5ldyBmdW5jdGlvbi4KKwkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQpOiBOZXcgZnVuY3Rpb24uCisJKF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBSZW5hbWUgZnJvbQorCW1pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogUmVuYW1lIGZyb20KKwltaXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KKwkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogUmVuYW1lIGZyb20KKwltaXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBBY2NlcHQgLk1JUFMub3B0aW9ucyBhcyBhIG5hbWUKKwlmb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCisJKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgorCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBDb25zaWRlciAuTUlQUy5vcHRpb25zIHRvIGJlIHRoZQorCW5hbWUgb2YgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCisJKF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogU2V0IHRoZSBHUCB2YWx1ZSBpbiBhCisJU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLgorCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogUmVuYW1lIGZyb20KKwltaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgorCShiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCisJKiBlbGYtYmZkLmggKF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyk6IERlY2xhcmUuCisJKF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyk6IERlY2xhcmUuCisJKF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IERlY2xhcmUuCisJKF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogRGVjbGFyZS4KKwkoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogRGVjbGFyZS4KKwkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlY2xhcmUuCisKKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KKwllbGZfaW5mb190b19ob3d0by4KKwkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KKwllbGZfaW5mb190b19ob3d0by4KKwkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCisJKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9pbmZvX3RvX2hvd3RvKTogUmVuYW1lIGZyb20KKwllbGZfaW5mb190b19ob3d0by4KKwkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUuCisKKwkqIGNvZmYtdzY1LmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBSZW5hbWUgUl9NT1ZCWzEyXSB0bworCVJfTU9WMTZCWzEyXSwgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvaW50ZXJuYWwuaC4KKworVGh1IE1heSAzMCAxMjozODo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjY0LW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBwcm92aWRlIGJldHRlciBzdXBwb3J0IGZvcgorCXdyaXRpbmcgZmlsZXMgYW5kIGZvciBnYXMuCisJKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQKKwlvZiBtaXBzX2VsZl9vYmplY3RfcC4KKwkobWlwc19lbGYzMl9vYmplY3RfcCk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX29iamVjdF9wOyBjYWxsCisJX2JmZF9taXBzX2VsZl9vYmplY3RfcC4KKwkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KKwltaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFJlbmFtZSBmcm9tCisJbWlwc19lbGZfZmFrZV9zZWN0aW9ucyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgorCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IFJlbmFtZSBmcm9tCisJbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCisJbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nLgorCShtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCisJbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nOyBjYWxsCisJX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCisJKF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQorCW1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVuYW1lIGZyb20KKwltaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KKwkobWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwKTogUmVuYW1lIGZyb20KKwltaXBzX2VsZl9lY29mZl9kZWJ1Z19zd2FwLgorCSogZWxmLmMgKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBVc2UgYXN5bWJvbCByYXRoZXIgdGhhbgorCXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkuCisJKF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLCBtb3ZlZCBpbiBmcm9tCisJZWxmY29kZS5oOnZhbGlkYXRlX3JlbG9jLgorCSogZWxmY29kZS5oICh2YWxpZGF0ZV9yZWxvYyk6IFJlbW92ZTsgbW92ZWQgaW50byBlbGYuYyBhbmQgcmVuYW1lZAorCXRvIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCSogZWxmLWJmZC5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgorCShfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogRGVjbGFyZS4KKwkoX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogRGVjbGFyZS4KKwkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRGVjbGFyZS4KKwkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IERlY2xhcmUuCisJKF9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IERlY2xhcmUuCisJKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlY2xhcmUuCisJKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERvbid0IGRlZmluZQorCWlmIGFscmVhZHkgZGVmaW5lZC4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vYmplY3RfcCk6IEhhbmRsZSBFX01JUFNfQVJDSF80LgorCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCisKK1dlZCBNYXkgMjkgMTY6MTU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJNjQtYml0IE1JUFMgRUxGIEFCSSBvYmpkdW1wIHN1cHBvcnQ6CisJKiBlbGY2NC1taXBzLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoQkZENjRfQkFDS0VORFMpOiBBZGQgZWxmNjQtbWlwcy5vLgorCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmNjQtbWlwcy5jLgorCSogY29uZmlnLmJmZCAobWlwcyplbC0qLWVsZiopIEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCisJYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIHRvIHRhcmdfc2VsdmVjcy4KKwkobWlwcyotKi1lbGYqKTogTGlrZXdpc2UuCisJKiBjb25maW5ndXJlLmluOiBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAorCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyB0byB2ZWN0b3Igc3dpdGNoLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogTmV3IGZ1bmN0aW9uLAorCWJyb2tlbiBvdXQgb2YgbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuCisJKG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW5hbWUgZnJvbQorCW1pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLiAgQ2FsbCBuZXcgZnVuY3Rpb24uCisJKGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKTogVXBkYXRlIG5hbWUgb2YgcmVuYW1lZCBmdW5jdGlvbi4KKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBvZgorCXdyaXRlX291dF9waGRycyB0byBiZSBjb25zdC4gIExpa2V3aXNlIGZvciBzZWNvbmQgcGFyYW1ldGVyIG9mCisJc3dhcF9zeW1ib2xfb3V0LgorCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsX2hkcjIgZmllbGQuCisJKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgorCShiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9zd2FwX3JlbG9jX2luKTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4pOiBMaWtld2lzZS4KKwkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCk6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfc3dhcF9waGRyX2luKTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9zd2FwX2R5bl9pbik6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfc3dhcF9keW5fb3V0KTogTGlrZXdpc2UuCisJKGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWNsYXJlLgorCShiZmRfZWxmMzJfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWNsYXJlLgorCShiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzKTogRGVjbGFyZS4KKwkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCisJKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4pOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCisJKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgorCShiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCisJKGJmZF9lbGY2NF9zd2FwX3BoZHJfaW4pOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X3N3YXBfZHluX2luKTogTGlrZXdpc2UuCisJKGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQpOiBMaWtld2lzZS4KKwkoYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZSk6IERlY2xhcmUuCisJKGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlY2xhcmUuCisJKGJmZF9lbGY2NF93cml0ZV9vdXRfcGhkcnMpOiBEZWNsYXJlLgorCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRGVjbGFyZS4KKwkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBSZW1vdmUgYXNzZXJ0aW9uIHJlcXVpcmluZworCVNIVF9SRUwvU0hUX1JFTEEgdG8gbWF0Y2ggdXNlX3JlbGFfcC4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWxvYworCXNlY3Rpb24gZm9yIHRoZSBzZWN0aW9uLCBhZGQgdGhlIG5ldyBvbmUgdG8gcmVsX2hkcjIuICBJbmNyZW1lbnQKKwlyZWxvY19jb3VudCByYXRoZXIgdGhhbiBzZXR0aW5nIGl0LgorCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVmaW5lIG5hbWUgYXMgbWFjcm8uCisJUmVtb3ZlIHN0YXRpYyBkZWNsYXJhdGlvbi4KKwkoZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVmaW5lIG5hbWUgYXMgbWFjcm8uCisJKGVsZl93cml0ZV9vdXRfcGhkcnMpOiBMaWtld2lzZS4KKwkoZWxmX3N3YXBfZWhkcl9pbiwgZWxmX3N3YXBfZWhkcl9vdXQpOiBEZWNsYXJlLgorCShlbGZfc3dhcF9zaGRyX2luLCBlbGZfc3dhcF9zaGRyX291dCk6IERlY2xhcmUuCisJKGVsZl9zd2FwX3N5bWJvbF9pbik6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGJlIGNvbnN0LgorCShlbGZfc3dhcF9zeW1ib2xfb3V0KTogTGlrZXdpc2UuCisJKGVsZl9zd2FwX2VoZHJfaW4sIGVsZl9zd2FwX2VoZHJfb3V0KTogTGlrZXdpc2UuCisJKGVsZl9zd2FwX3NoZHJfaW4sIGVsZl9zd2FwX3NoZHJfb3V0KTogTGlrZXdpc2UuCisJKGVsZl9zd2FwX3BoZHJfaW4sIGVsZl9zd2FwX3BoZHJfb3V0KTogTGlrZXdpc2UuCisJKGVsZl9zd2FwX3JlbG9jX2luLCBlbGZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KKwkoZWxmX3N3YXBfcmVsb2NhX2luLCBlbGZfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCisJKGVsZl93cml0ZV9vdXRfcGhkcnMpOiBSZW5hbWUgZnJvbSB3cml0ZV9vdXRfcGhkcnMuICBDaGFuZ2Ugc2Vjb25kCisJcGFyYW1ldGVyIHRvIGJlIGNvbnN0LiAgTWFrZSBub24tc3RhdGljLgorCShlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBSZW5hbWUgZnJvbSB3cml0ZV9zaGRyc19hbmRfZWhkci4KKwlNYWtlIG5vbi1zdGF0aWMuCisJKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBNYWtlIG5vbi1zdGF0aWMuCisJKE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSk6IFVwZGF0ZSBuYW1lcyBvZiByZW5hbWVkIGZ1bmN0aW9ucy4KKwkqIGVsZnh4LXRhcmdldC5oIChlbGZfaW5mb190b19ob3d0byk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkoZWxmX2JhY2tlbmRfc2l6ZV9pbmZvKTogTGlrZXdpc2UuCisJKGVsZk5OX2JlZCk6IFVzZSBlbGZfYmFja2VuZF9zaXplX2luZm8uCisJKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyk6IERlY2xhcmUuCisJKGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyk6IERlY2xhcmUuCisJKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKKwliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgaWYgQkZENjQgaXMgZGVmaW5lZC4KKworCSogbGliYmZkLmMgKGJmZF9nZXRfZmlsZV93aW5kb3cpOiBBZGQgY2FzdCB0byBmcHJpbnRmIGFyZ3VtZW50LgorCitUdWUgTWF5IDI4IDExOjQyOjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBJbnNlcnQgbm9wIGluc3RydWN0aW9ucywgbm90CisJemVyb2VzLCBpbiBhbGlnbm1lbnQgaG9sZXMuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBNYWtlIHJvb20gZm9yIHRoZQorCXBvdGVudGlhbCBsZWFkaW5nIHVuZGVyc2NvcmUgaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIuCisKK0ZyaSBNYXkgMjQgMTQ6Mjg6MzggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEbyBub3QgcHV0IHNtYWxsIGNvbW1vbgorCXN5bWJvbHMgaW50byAuc2JzcyBpZiB0aGlzIGlzIGEgcmVsb2NhdGFibGUgbGluay4KKworVGh1IE1heSAyMyAxMjoyNjoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jIChfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogV2FybiBhYm91dAorCXVuZGVmaW5lZCBzeW1ib2xzIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KKworRnJpIE1heSAxNyAxMzo1NDoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc2guYzogQWRkIGEgYnVuY2ggb2YgbmV3IGNvZGUgYW5kIHN0YXRpYyBjb25zdCBhcnJheXMgdG8KKwlzdXBwb3J0IGFsaWduaW5nIGxvYWRzIGFuZCBzdG9yZXMgb24gZm91ciBieXRlIG1lbW9yeSBib3VuZGFyaWVzLgorCUFsc286CisJKHNoX2NvZmZfaG93dG9zKTogQWRkIGVudHJpZXMgZm9yIFJfU0hfQ09ERSwgUl9TSF9EQVRBIGFuZAorCVJfU0hfTEFCRUwuCisJKHNoX3JlbGF4X3NlY3Rpb24pOiBMb29rIGZvciBSX1NIX0NPREUgcmVsb2NzLiAgSWYgd2UgZmluZCBvbmUsCisJY2FsbCBzaF9hbGlnbl9sb2Fkcy4KKwkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogRG9uJ3QgbWFyayBSX1NIX0NPREUgb3IgUl9TSF9EQVRBIHJlbG9jcworCWFzIHVudXNlZC4KKworVGh1IE1heSAxNiAxNjozNDoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNhY2hlLmMgKGJmZF9vcGVuX2ZpbGUpOiBVbmxpbmsgdGhlIGZpbGUgYmVmb3JlIG9wZW5pbmcgaXQgZm9yCisJd3JpdGUuICBGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgorCisJKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBTZXQgb3BlbmVkX29uY2UuCisKK1R1ZSBNYXkgMTQgMTI6MzU6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzb20uYyAoc29tX3NsdXJwX3JlbG9jX3RhYmxlKTogQ2xlYXIgZXh0ZXJuYWxfcmVsb2NzIGNhY2hlIGFmdGVyCisJZnJlZWluZyBpdC4KKworCSogbGliYmZkLmM6IFJlbW92ZSAjaWZkZWYgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWCwgYW5kIGNvbXBpbGUKKwl0aGUgY29kZSB1bmNvbmRpdGlvbmFsbHkuCisKK01vbiBNYXkgMTMgMTk6NTE6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSk6IERlZmluZSBzdHJ1Y3R1cmUuCisJKHBlaV9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbWFjcm8uCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwKKwlzdG9yZSBzX3BhZGRyIGZpZWxkIGluIHBlaV9zZWN0aW9uX2RhdGEuCisJKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXNlIHBlaV9zZWN0aW9uX2RhdGEgcmF0aGVyCisJdGhhbiBfY29va2VkX3NpemUsIGFuZCBkb24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdmFsdWUuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9PQkpfV0lUSF9QRSwgc2V0IHNfcGFkZHIgdG8KKwkwLiAgSWYgQ09GRl9JTUFHRV9XSVRIX1BFLCBzZXQgc19wYWRkciB0byBwZWlfc2VjdGlvbl9kYXRhLgorCSogcGVpY29kZS5oIChjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogRGVmaW5lIGlmCisJQ09GRl9JTUFHRV9XSVRIX1BFLgorIAkocGVfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmCisJQ09GRl9JTUFHRV9XSVRIX1BFLgorCitXZWQgTWF5ICA4IDE2OjEwOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3JlYy5jIChzcmVjX3NldF9hcmNoX21hY2gpOiBXcml0ZSBhcyBhIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGEKKwltYWNybyBkZWZpbml0aW9uLgorCisJKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IElmIGFuIGFyY2hpdmUgaGFzCisJbm8gbWFwLCBqdXN0IGNoZWNrIGVhY2ggbWVtYmVyIGluIHR1cm4gdG8gc2VlIHdoZXRoZXIgaXQgaXMKKwlyZXF1aXJlZC4KKworV2VkIE1heSAgOCAwOToxNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoZWNrIGZvciB0eXBlIDB4NDEgaW4gcGFydGl0aW9uCisJdGFibGUuICBDYWxsIEJGRF9BU1NFUlQgdG8gdmFsaWRhdGUgaGVhZGVyIHNpemUsIGluc3RlYWQgb2YKKwljYWxsaW5nIGZhdGFsLgorCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogUHV0IHF1b3RlcyBhcm91bmQgcGFydGl0aW9uCisJbmFtZS4KKworVHVlIE1heSAgNyAxNjoxMDoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwY2Jvb3QuYzogTmV3IHRhcmdldCBmb3IgbG9va2luZyBhdCBQUENidWcgYm9vdCByZWNvcmRzLgorCisJKiBjb25maWd7dXJlLmluLC5iZmR9OiBBZGQgc3VwcG9ydCBmb3IgcHBjYm9vdCB0YXJnZXQuCisJKiB0YXJnZXRzLmM6IERpdHRvLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitUdWUgTWF5ICA3IDExOjE1OjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29mZi1oODMwMC5jIChob3d0b190YWJsZSk6IFVwZGF0ZSBuYW1lcyB0byBtYXRjaCByZWNlbnQKKwljaGFuZ2VzIHRvIGluY2x1ZGUvY29mZi9pbnRlcm5hbC5oLiAgRml4IG1pbm9yIGVycm9ycyBpbiB0aGUKKwlleGlzdGluZyByZWxvY3MuICBBZGQgUl9NT1ZMMSBhbmQgUl9NT1ZMMi4KKwkocnR5cGUyaG93dG8pOiBTaW1pbGFybHkuCisJKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBSZXdyaXRlIHRvIHNpbXBsaWZ5LCBmaXggYnVncyBpbiB0aGUKKwlleGlzdGluZyByZWxheGluZyBjb2RlICBhbmQgcGVmb3JtIG1vcmUgcmVsYXhpbmcuCisJKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KKworTW9uIE1heSAgNiAxODoyNDowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBIYW5kbGUgY29tbW9uCisJc3ltYm9scyBjb3JyZWN0bHkuCisKK1NhdCBNYXkgIDQgMDU6MDg6NDUgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6ICBSZWplY3QgZ2VuZXJpYyBFTEYgdGFyZ2V0IGlmCisJZV9tYWNoaW5lIG1hdGNoZXMgYW4gYWx0ZXJuYXRlIG1hY2hpbmUgY29kZSBpbiBhIHNwZWNpZmljIGJhY2tlbmQuCisKKwkqIG5ldGJzZC1jb3JlLmMgKG5ldGJzZF9jb3JlX3ZlYyk6ICBSZW1vdmUgaW5pdGlhbGl6ZXIgZm9yCisJb2Jzb2xldGUgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgorCitGcmkgTWF5ICAzIDEzOjA3OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29mZi1oODMwMC5jIChyZWxvY19ob3d0b190eXBlKTogQWRkIGhvd3RvIGVudHJ5IGZvcgorCVJfUENSV09SRF9CLgorCShydHlwZTJob3d0byk6IEhhbmRsZSBSX1BDUldPUkRfQi4KKwkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IEhhbmRsZSBSX1BDUldPUkRfQi4KKwkoaDgzMDBfcmVsb2NfMTZfZXN0aW1hdGUpOiBMaWtld2lzZS4gIFRyeSB0byB0dXJuIGEgMTZiaXQKKwlwYy1yZWxhdGl2ZSBicmFuY2ggKFJfUENSV09SRCkgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlCisJYnJhbmNoIChSX1BDV09SRF9CKS4KKworRnJpIE1heSAgMyAxMDo0Nzo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBTZXQgdGhlIHNlY3Rpb24gZm9yCisJQlNGX0NPTlNUUlVDVE9SIHN5bWJvbHMuCisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IENvcnJlY3Qgc2V0dGluZyBvZgorCWxhc3RfYmZfaW5kZXguCisKK1dlZCBNYXkgIDEgMTg6Mzk6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbiBjb21kYXQgc2VjdGlvbiBsb29rdXAsCisJc3RvcCBsb29raW5nIHdoZW4gc2VjdGlvbiBpcyBmb3VuZC4KKworV2VkIE1heSAgMSAxNDoxNzo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmZjb2RlLmggKFNUUklOR19TSVpFX1NJWkUpOiBEZWZpbmUuCisJKHN0eXBfdG9fc2VjX2ZsYWdzKTogSGFuZGxlIGxvbmcgc3ltYm9sIG5hbWVzIHdoZW4gbG9va2luZyBmb3IgdGhlCisJc2VjdGlvbiBzeW1ib2wuCisJKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIGZpZWxkLgorCShiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpOiBEZWZpbmUuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KKwkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogSGFuZGxlIGxvbmcgc2VjdGlvbgorCW5hbWVzLgorCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgorCSogcGUtYXJtLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgorCSogcGVpLWFybS5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KKwkqIHBlLWkzODYuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCisJKiBwZWktaTM4Ni5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KKwkqIHBlLXBwYy5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KKwkqIHBlaS1wcGMuYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCisKKwkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiBTZXQgbG1hIG9mIHNlY3Rpb25zLgorCShiX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUmVuYW1lIGluX2FiZmQKKwlwYXJhbWV0ZXIgdG8gb3V0cHV0X2JmZC4gIFVzZWQgaW5wdXRfYmZkIGluc3RlYWQgb2Ygb3V0cHV0X2JmZCBpbgorCXNldmVyYWwgcGxhY2VzLgorCitUdWUgQXByIDMwIDE3OjU2OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IGNyZWF0ZQorCVNFQ19DT05TVFJVQ1RPUiBzZWN0aW9ucy4KKwkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IExpa2V3aXNlLgorCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgZWxmX2dwLgorCUZyb20gRG9uIEJvd21hbiA8Ym93bWFuQHdhdGVybG9vLmhwLmNvbT4uCisKK1R1ZSBBcHIgMzAgMTc6MDY6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29mZi1hcm0uYyAoYXJtY29mZl9saXR0bGVfdmVjKTogSWYgQ09GRl9XSVRIX1BFIGlzIGRlZmluZWQsIGFkZAorCVNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVMgdG8gc2VjdGlvbl9mbGFncy4KKworTW9uIEFwciAyOSAxMzoxNToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZAorCW1pcHNfMzJfcmVsb2NzIGZpZWxkLgorCShtaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbWlwc18zMl9yZWxvY3MgZmllbGQuCisJKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3B5IFJfTUlQU19SRUwzMiBhbmQgUl9NSVBTXzMyCisJcmVsb2NzIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhcgorCWZpbGUuCisJKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IEZvciBhIFJfTUlQU19SRUwzMiBvciBSX01JUFNfMzIgcmVsb2MKKwlhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgaW5jcmVtZW50IG1pcHNfMzJfcmVsb2NzLgorCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBtaXBzXzMyX3JlbG9jcyBpcyBzZXQsIGFuZAorCXRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIG1ha2Ugcm9vbSBpbiB0aGUKKwkucmVsLmR5biBzZWN0aW9uLgorCitGcmkgQXByIDI2IDE4OjAwOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVHJhY2sgdGhlIHJlYWwKKwlmaWxlIHBvc2l0aW9uIGFuZCB0aGUgdmlydHVhbCBmaWxlIHBvc2l0aW9uIHNlcGFyYXRlbHkuICBTZXQKKwlmaWxlcG9zIGluZm9ybWF0aW9uIGJzYWVkIG9uIHRoZSByZWFsIGZpbGUgcG9zaXRpb24uCisJKF9iZmRfZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBIYW5kbGUgLmxpYiBzZWN0aW9ucyBsaWtlIHRoZQorCUphbiAyMyBjaGFuZ2UgdG8gY29mZmNvZGUuaC4KKworCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdGhlIHN5bWJvbCBjb3VudCB0byB0aGUKKwludW1iZXIgb2YgQkZEIHN5bWJvbHMgY3JlYXRlZC4KKworRnJpIEFwciAyNiAxMjozNDoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEZvcndhcmQgcmVsb2NhdGlvbnMgdG8gdGhlCisJb3V0cHV0IGZpbGUgaWYgbGlua2luZyBzaGFyZWQgb2JqZWN0cy4gIExvb3AgdG8gY2hlY2sgYWxsIHJlbG9jcywKKwlyYXRoZXIgdGhhbiByZXR1cm5pbmcgZmFsc2Ugb24gZmlyc3QgZXJyb3IuCisKK1RodSBBcHIgMjUgMTM6MjU6MTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBBZGQgUExUIGNhc2UuCisJKHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBJZiAuaW50ZXJwIHNlY3Rpb24sIGJ1bXAgIworCW9mIHByb2dyYW0gaGVhZGVycyBieSAxLgorCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEZsZXNoIG91dCBzdXBwb3J0LgorCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciAucGx0IHNlY3Rpb24uCisJKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUHJpbnQgb3V0IGZpbGVuYW1lIGluIGRlYnVnIGNvZGUuICBFbmFibGUKKwlQTFQgc3VwcG9ydC4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBZGQgc3VwcG9ydCBmb3IgUExUJ3MsIGJlZWYgdXAKKwlkZWJ1ZyBvdXRwdXQuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IElmIHRoZSBvdXRwdXQgc2VjdGlvbiBpc24ndCBkZWZpbmVkLAorCWRvbid0IGFib3J0LCBqdXN0IGdpdmUgYW4gZXJyb3IgbWVzc2FnZS4KKworCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IElmIHRoZSBzZWN0aW9uCisJYmVpbmcgY3JlYXRlZCBpcyAuc2RhdGEgb3IgLnNkYXRhMiwgZG9uJ3QgbWFrZSB0aGUgc3ltYm9sIGR5bmFtaWMuCisKK1dlZCBBcHIgMjQgMTQ6MDQ6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB4Y29mZmxpbmsuYyAoX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IExvb2sgdGhyb3VnaCB0aGUKKwltZW1iZXJzIG9mIGFuIGFyY2hpdmUgZm9yIGR5bmFtaWMgb2JqZWN0cyB3aXRoIG5vIHN5bWJvbHMsIGFuZAorCXBhc3MgdGhlbSBkaXJlY3RseSB0byBjaGVja19hcmNoaXZlX2VsZW1lbnQuCisJKHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFBhc3MgZHluYW1pYyBvYmplY3RzIHRvCisJeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMuCisJKHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl92ZWMpOiBDaGFuZ2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQworCWZyb20gX2JmZF9ub2R5bmFtaWMgdG8gX2JmZF94Y29mZi4KKwkqIGxpYmNvZmYtaW4uaCAoX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOgorCURlY2xhcmUuCisJKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVjbGFyZS4KKwkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlY2xhcmUuCisJKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBEZWNsYXJlLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogeGNvZmZsaW5rLmMgKHhjb2ZmX3N3YXBfbGRyZWxfaW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgorCShfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KKwkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IE5ldyBmdW5jdGlvbi4KKwkoeGNvZmZfZHluYW1pY19yZWxvYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCisJKHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyk6IFVzZSB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cy4KKworVHVlIEFwciAyMyAxMjo0ODo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtc3BhcmMuYyAoYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyk6IFJldHVybiBiZmRfcmVsb2Nfb2sgZXZlbgorCWlmIHJlbG9jX2VudHJ5LT5hZGRlbmQgaXMgbm90IDAuCisJKENBTENfQURERU5EKTogSnVzdCBzZXQgdGhlIGFkZGVuZCB0byByZWxvYy5yX29mZnNldC4KKworTW9uIEFwciAyMiAxODoyOTowMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IEZpeCBzcGVsbGluZyBvZgorCVJfU1BBUkNfR0xPQl9KTVAuCisJKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IExpa2V3aXNlLgorCUFkZCBlbnRyaWVzIGZvciBSX1NQQVJDX1s1Nl0uCisJKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBlbnRyaWVzIGZvciBSX1NQQVJDX1s1Nl0uCisKK01vbiBBcHIgMjIgMTU6MDc6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJT3B0aW1pemUgbGlua2luZyBvZiBzdGFicyBpbiBzZWN0aW9ucyBhcyB1c2VkIGluIEVMRiBhbmQgQ09GRi4KKwkqIHN0YWJzLmM6IE5ldyBmaWxlLgorCSogbGliYmZkLWluLmggKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogRGVjbGFyZS4KKwkoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzKTogRGVjbGFyZS4KKwkoX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgorCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZQorCXN0YWJfaW5mbyBmaWVsZC4KKwkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FsbCBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyBpZgorCWFwcHJvcHJpYXRlLgorCShfYmZkX2NvZmZfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MgaGFzaCB0YWJsZS4KKwkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIG9wdGltaXplZCBzdGFicyBzZWN0aW9ucy4KKwkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncworCWhhc2ggdGFibGUuCisJKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KKwkoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIHN0YWJfaW5mbyBmaWVsZC4KKwkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgc3RhYl9pbmZvCisJZmllbGQuCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGFwcHJvcHJpYXRlLCBjYWxsCisJX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMuCisJKGVsZl9iZmRfZmluYWxfbGluayk6IFdyaXRlIG91dCBzdGFiIHN0cmluZ3MgaGFzaCB0YWJsZS4KKwkoZWxmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIG9wdGltaXplZCBzdGFicyBzZWN0aW9ucy4KKwkqIHJlbG9jLmMgKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IENoZWNrIGFkZHJlc3MgYWdhaW5zdAorCV9yYXdfc2l6ZSByYXRoZXIgdGhhbiBfY29va2VkX3NpemUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKEJGRF9MSUJTKTogQWRkIHN0YWJzLm8KKwkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIHN0YWJzLmMuCisKKwkqIFZFUlNJT046IEluY3JlbWVudCBmb3IgYmZkbGluay5oIGNoYW5nZS4KKworCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mCisJQlNGX05PVF9BVF9FTkQgY29tbW9uIHN5bWJvbHMuCisKK0ZyaSBBcHIgMTkgMTk6MjE6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXBwYy5jIChyZWNvcmRfdG9jKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KKwkocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogTGlrZXdpc2UuCisJKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgQU5TSSBDIHN0cmluZyBjb25jYXRlbmF0aW9uLgorCShwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbW92ZSB1bnJlYWNoZWQgY29kZS4KKwkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgdGFrZSB0aGUgYWRkcmVzcworCW9mIGFuIGFycmF5LgorCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5nLgorCShwZV9wcmludF9lZGF0YSk6IExpa2V3aXNlLgorCShwZV9wcmludF9yZWxvYyk6IFJlbW92ZSBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24uCisKK1RodSBBcHIgMTggMTg6NTE6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBsYXN0X2JmX2luZGV4CisJYW5kIGxhc3RfYmYgZmllbGRzLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgorCXN5bWJvbHMuCisJKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBMaWtld2lzZS4KKwkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KKwkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KKwlzeW1ib2xzLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3RfYmZfaW5kZXgKKwlmaWVsZC4KKwkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTiBzeW1ib2xzLgorCUZpeCB1cCAuYmYgZW5kbmR4IGxpbmsgZmllbGRzLgorCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3RfYmZfaW5kZXgKKwlmaWVsZC4KKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGVuZG5keCBmaWVsZCBmb3IgQ19GQ04KKwlzeW1ib2xzLgorCitXZWQgQXByIDE3IDEyOjA4OjI0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcGV7LGl9LXBwYy5jIChQUENfUEUpOiBEZWZpbmUgaW5zdGVhZCBvZiBQUEMsIHNvIHRoYXQgY29tcGlsaW5nCisJb24gU29sYXJpcyBQb3dlclBDIHN5c3RlbXMgZG9lc24ndCBnZXQgY29uZnVzZWQuCisKKwkqIGNjZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlICNpZmRlZiBQUENfUEUsIG5vdAorCSNpZmRlZiBQUEMuCisKKwkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzLCBiZmRfZnByZWdzZXQpOiBBZGQgdGhyZWFkIGFyZ3VtZW50LgorCShlbGZfY29yZWZpbGVfbm90ZSk6IElmIEhBVkVfU1lTX1BST0NGU19IIGlzIG5vdCBkZWZpbmVkLCBkb24ndAorCXVwZGF0ZSBkaWRfcmVnIGFuZCBkaWRfcmVnMi4KKworV2VkIEFwciAxNyAxMzowNzozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IENoZWNrIGZvciBUT0Mgb3ZlcmZsb3cuCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFdoZW4gY2FsbGluZyB0aGUKKwljYWxsYmFjayByb3V0aW5lcywgcGFzcyBoLT5yb290LnN0cmluZyByYXRoZXIgdGhhbiBuYW1lLCBpbiBjYXNlCisJY29weSBpcyB0cnVlIGFuZCBuYW1lIGlzIHRyYW5zaWVudC4KKworVHVlIEFwciAxNiAxNjozNjozOCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBsaXNhLmN5Z251cy5jb20pCisKKwkqIGVsZmNvcmUuaDogIEFkZCBzdXBwb3J0IGZvciBjb3JlIGZpbGVzIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4KKwkoUHJpbWFyaWx5IGZvciBTb2xhcmlzLikKKworVHVlIEFwciAxNiAxMzo0NDowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykpOiBEb24ndCBkbyBhbnl0aGluZyBpZgorCXNlY3Rpb24tPm9yZWxvY2F0aW9uIGlzIE5VTEwuCisKKwkqIGNvZmZnZW4uYyAoYmZkX2NvZmZfZ2V0X3N5bWVudCk6IE5ldyBmdW5jdGlvbi4KKwkoYmZkX2NvZmZfZ2V0X2F1eGVudCk6IE5ldyBmdW5jdGlvbi4KKwkqIGJmZC1pbi5oIChiZmRfY29mZl9nZXRfc3ltZW50KTogRGVjbGFyZS4KKwkoYmZkX2NvZmZfZ2V0X2F1eGVudCk6IERlY2xhcmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisKK01vbiBBcHIgMTUgMTk6MDY6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2hpMTYpOiBEZWZpbmUuCisJKG1pcHNfaGkxNl9hZGRyLCBtaXBzX2hpMTZfYWRkZW5kKTogUmVtb3ZlLgorCShtaXBzX2hpMTZfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIEhJMTYgcmVsb2NzLgorCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogUHJvY2VzcyBtaXBzX2hpMTZfbGlzdC4KKwkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYKKwlyZWxvY3MgYmVmb3JlIHRoZSBhc3NvY2lhdGVkIExPMTYgcmVsb2MuCisKK1dlZCBBcHIgMTAgMDA6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19zY2FuKTogQ2hlY2sgYmZkX2FsbG9jIHJldHVybiB2YWx1ZS4KKwkodmVyc2Fkb3Nfb2JqZWN0X3ApOiBDaGVjayBhbGwgYmZkX3JlYWQgcmV0dXJuIHZhbHVlcy4gIFJlcXVpcmUKKwl0aGF0IGxhbmcgZmllbGQgYmUgbGVzcyB0aGFuIDEwLCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBJbnRlbCBIZXgKKwlmaWxlcy4KKworCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogV3JpdGUgb3V0IHRoZSByZWxvY3MgZXZlbiBpZiB0aGVyZQorCWFyZW4ndCBhbnkgc3ltYm9scy4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogU2V0IHJfaW5kZXggdG8gTl9BQlMsCisJbm90IDAsIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wuCisJKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuCisKKwkqIGloZXguYyAoaWhleF9zY2FuKTogQWNjZXB0IGEgbGVuZ3RoIG9mIDQgZm9yIHJlY29yZCB0eXBlIDUuCisJKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRm9yIGEgbGFyZ2Ugc3RhcnQgYWRkcmVzcywgb3V0cHV0CisJdGhlIGZ1bGwgMzIgYml0IGFkZHJlc3MgaW4gcmVjb3JkIHR5cGUgNS4KKworCSogaWVlZS5jIChpZWVlX3dyaXRlX2J5dGUpOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9ieXRlCisJdG8gaW50IHRvIGF2b2lkIHByb21vdGlvbiBwcm9ibGVtcyBpbiBwcm90b3R5cGUuCisKK1R1ZSBBcHIgIDkgMTE6NDQ6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogVXNlICR7c3JjZGlyfSB3aGVuIGxvb2tpbmcgZm9yIHBpY2ZyYWcuCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBTd2l0Y2ggb24gJHtsaWJkaXJ9LCBub3QgJChsaWJkaXIpLiAgRnJvbQorCWFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1IChBbGFuIE1vZHJhKS4KKworCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogQWx3YXlzIGNhbGwgYWRkX2R5bmFtaWNfc3ltYm9scworCWVudHJ5IHBvaW50LCBub3QganVzdCBmb3IgRFlOQU1JQyBvYmplY3RzLgorCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IEFsd2F5cyBjYWxsCisJc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICBJZiBjYWxsZWQgd2l0aCBhIG5vbiBEWU5BTUlDCisJb2JqZWN0LCBkb24ndCBkbyBhbnl0aGluZyBlbHNlLgorCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGNhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCisKK01vbiBBcHIgIDggMTI6MDk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKKwlkaXJlY3Rvcmllcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY29uZmlndXJlLmhvc3Q6IFNldCBITERGTEFHUyBhbmQgU0hMSUJfQ0ZMQUdTIGZvciAqLWRlYy1vc2YqCisJaG9zdCB3aGVuIGNvbmZpZ3VyaW5nIHdpdGggLS1lbmFibGUtc2hhcmQuCisKK0ZyaSBBcHIgIDUgMTI6MjQ6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcuYmZkOiBBZGQgaVszNDVdODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obiBQb2xzdHJhCisJPGpkcEBwb2xzdHJhLmNvbT4uCisKKwkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IEZvciBXQVJOX1JPVy93YXJuLCB1c2UgTVdBUk4sIG5vdCBDWUNMRSwKKwl0byBhdm9pZCBjcmFzaGluZyBpbiBiZmRfaGFzaF9yZXBsYWNlLgorCisJKiBzeXNkZXAuaDogVXNlICNpZmRlZiwgbm90ICNpZi4KKworVGh1IEFwciAgNCAyMzozMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5pbjogUmVidWlsZC4KKworVGh1IEFwciAgNCAxODo0OTowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtaXBzLXNvbnktYnNkKik6IEZpeCB0eXBvIGluIEFDX0RFRklORS4KKwkoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzeXMvdGltZS5oCisJKEFDX0hFQURFUl9USU1FKTogQWRkIG1hY3JvLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogc3lzZGVwLmg6IFVzZSBUSU1FX1dJVEhfU1lTX1RJTUUgYW5kIEhBVkVfU1lTX1RJTUVfSAorCXRvIGNvbnRyb2wgd2hhdCBjb21iaW5hdGlvbiBvZiA8dGltZT4gYW5kIDxzeXMvdGltZS5oPgorCWdldCBpbmNsdWRlZC4KKworVHVlIEFwciAgMiAxMzoxMTo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBhb3V0ZjEuaCAoc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBNX1NQQVJDTEVULgorCShhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogSGFuZGxlCisJYmZkX21hY2hfc3BhcmNfe3NwYXJjbGV0LHNwYXJjbGl0ZX0uCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY197c3BhcmNsZXQsc3BhcmNsaXRlfSk6IERlZmluZS4KKwkoYmZkX21hY2hfc3BhcmNfdjlfcCk6IFVwZGF0ZS4KKwkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIGVudHJpZXMgZm9yIHNwYXJjbGV0LHNwYXJjbGl0ZS4KKwkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9TUEFSQ0xFVC4KKwkqIHN1bm9zLmMgKE1BQ0hUWVBFX09LKTogRGVmaW5lLgorCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KKworVHVlIEFwciAgMiAwMDozMzoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgaGdvdCBmaWVsZC4KKwkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgaGdvdCBmaWVsZC4KKwkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogU3RvcmUgdGhlCisJX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGhhc2ggdGFibGUgZW50cnkgaW4gdGhlIGhnb3QgZmllbGQuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBJZiB0aGUgc2l6ZSBvZiB0aGUKKwlnbG9iYWwgb2Zmc2V0IHRhYmxlIGdvZXMgb3ZlciAweDEwMDAsIHNldCB0aGUgdmFsdWUgb2YKKwlfR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gMHgxMDAwIGludG8gdGhlIHNlY3Rpb24uCisJKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBTdWJ0cmFjdCB0aGUgb2Zmc2V0IG9mCisJX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHdoZW4gaGFuZGxpbmcgR09UIHJlbG9jYXRpb25zLgorCisJKiBlbGZjb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KKworTW9uIEFwciAgMSAxMDozOToyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWVkIGZyb20KKwlnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jLiAgQWxsIHJlZmVyZW5jZXMgY2hhbmdlZC4KKwkqIGdlbmxpbmsuaCAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogRGVjbGFyYXRpb24KKwltb3ZlZCBoZXJlIGZyb20gbGliYmZkLWluLmguCisJKiBsaWJiZmQtaW4uaDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgorCitNb24gQXByICAxIDEyOjM1OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiByZXBvcnRpbmcgYW4KKwlvdmVyZmxvdyBlcnJvciwgdXNlIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUgaWYKKwlhdmFpbGFibGUuCisJKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgorCisJKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIGNvbW1vbiBzeW1ib2wgZ290CisJZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgc2V0IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIuCisKK1N1biBNYXIgMzEgMDE6NTg6NDEgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBEZWxldGUgdGVzdCBmb3IgLmp1bmsuCisJKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgorCitGcmkgTWFyIDI5IDEyOjQ0OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2VjdGlvbi5jIChTRUNfTElOS19PTkNFKTogRGVmaW5lLgorCShTRUNfTElOS19EVVBMSUNBVEVTKTogRGVmaW5lLgorCShTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQpOiBEZWZpbmUuCisJKFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkpOiBEZWZpbmUuCisJKFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFKTogRGVmaW5lLgorCShTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMpOiBEZWZpbmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IElmIENPRkZfV0lUSF9QRSwgdHVybgorCVNFQ19MSU5LX09OQ0UgaW50byBJTUFHRV9TQ05fTE5LX0NPTURBVC4KKwkoc3R5cF90b19zZWNfZmxhZ3MpOiBJZiBDT0ZGX1dJVEhfUEUsIHR1cm4gSU1BR0VfU0NOX0xOS19SRU1PVkUKKwlpbnRvIFNFQ19FWENMVURFLiAgSWYgSU1BR0VfU0NOX0xOS19DT01EQVQgaXMgc2V0LCBzZXQKKwlTRUNfTElOS19PTkNFLCBhbmQgbG9vayB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgZm9yIHRoZSBzZXR0aW5nCisJZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgQ09GRl9XSVRIX1BFLCBpZiBTRUNfTElOS19PTkNFIGlzCisJc2V0IGZvciBhIHNlY3Rpb24sIGZpbmQgdGhlIHNlY3Rpb24gc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUsCisJYW5kIHNldCB0aGUgYXV4IGVudHJ5IGJhc2VkIG9uIFNFQ19MSU5LX0RVUExJQ0FURVMuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQWRkIGEgc3BhY2UgYmVmb3JlICJjaGVja3N1bSIuCisJKiBjb2ZmLWFybS5jIChhcm1jb2ZmX2JpZ192ZWMpOiBJZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZCwgYWRkCisJU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFUyB0byBzZWN0aW9uX2ZsYWdzLgorCSogY29mZi1pMzg2LmMgKGkzODZjb2ZmX3ZlYyk6IExpa2V3aXNlLgorCSogY29mZi1wcGMuYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogTGlrZXdpc2UuCisKKwkqIFZFUlNJT046IEJ1bXAgdG8gMi42LjEuCisJKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIFZFUlNJT04uCisKK1RodSBNYXIgMjggMjM6NDg6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBsaWJiZmQtaW4uaCAoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IEFkZCBkZWNsYXJhdGlvbi4KKwkqIGxpYmJmZC5oOiBSZWJ1aWx0LgorCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBObyBsb25nZXIgc3RhdGljLgorCSogY29mZmNvZGUuaCAoY29mZl9iZmRfbGlua19oYXNoX2NyZWF0ZSk6IEFsbG93IHNwZWNpZmljIHRhcmdldHMKKwl0byBvdmVycmlkZS4KKwkqIGNvZmYtaDgzMDAuYzogQWRkIHR3byBkZXJpdmVkIGhhc2ggdGFibGVzIGFuZCB0aGVpciBhc3NvY2lhdGVkCisJZnVudGlvbnMgYW5kICNkZWZpbmVzIGZvciB1c2UgYnkgdGhlIGg4MzAwIGxpbmtlci4KKwkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcywgY2FzZSBSX01FTV9JTkRJUkVDVCk6IENyZWF0ZSBlbnRyaWVzIGluCisJdGhlIGZ1bmN0aW9uIHZlY3RvciBhcyBuZWVkZWQuICBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24KKwl2ZWN0b3IgZW50cnkgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgUl9NRU1fSU5ESVJFQ1QgcmVsb2MuCisJUmV3cml0ZSB0aGUgdmVjdG9ycyBzZWN0aW9uIGNvbnRlbnRzIGFzIG5lY2Vzc2FyeS4KKwkoaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gZm9yIHRoZSBoODMwMCBsaW5rZXIuCisJKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUgdG8gdXNlIGg4MzAwIHNwZWNpZmljIHZlcnNpb24uCisJKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBMaWtld2lzZS4KKworVGh1IE1hciAyOCAxNzo0NDowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmhwcGEuaDogSWYgZ2NjIDIuNyBvciBoaWdoZXIsIGRlY2xhcmUgYWxsIHRoZSBmdW5jdGlvbnMgd2l0aAorCV9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkgc28gdGhhdCAtV2FsbCBkb2Vzbid0IHdhcm4gYWJvdXQKKwl0aGVtLgorCShocHBhX3JlYnVpbGRfaW5zbik6IFBhc3MgcG9pbnRlciB0byBjb3JyZWN0IHR5cGUgdG8KKwlsb3dfc2lnbl91bmV4dCBhbmQgZGlzX2Fzc2VtYmxlXzIxLgorCitUaHUgTWFyIDI4IDExOjAwOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5iZmQgKHNwYXJjNjQte3N5c3Y0Kixzb2xhcmlzMip9KTogRGVsZXRlLgorCVN0aWNrIHdpdGggc3BhcmMtKi17c3lzdjQqLHNvbGFyaXMyKn0uCisKK1dlZCBNYXIgMjcgMTA6NDM6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBTd2FwIGluIGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KKwkoY29mZl9zd2FwX2F1eF9vdXQpOiBTd2FwIG91dCBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCisJKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogWmVybyBvdXQgZXh0cmEgUEUgeF9zY24gZmllbGRzLgorCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IElmIGFueSBvZiB0aGUgZXh0cmEgUEUgeF9zY24KKwlmaWVsZHMgaXMgbm9uLXplcm8sIHByaW50IHRoZW0uCisKKwkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogUHV0IGluc2lkZSBDT0ZGX0lNQUdFX1dJVEhfUEUKKwlpZmRlZi4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCShwcGNfcmVjb3JkX2RhdGFfaW5fdG9jX2VudHJ5KTogSWZkZWYgb3V0LiAgUmVtb3ZlZCB1bnVzZWQKKwl2YXJpYWJsZXMuCisJKHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKTogUHV0IGluc2lkZSBDT0ZGX0lNQUdFX1dJVEhfUEUgaWZkZWYuCisJKGdldF9zeW1ib2xfdmFsdWUpOiBJZmRlZiBvdXQuCisJKHBlX3BwY19yZWxvYyk6IElmZGVmIG91dC4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBNYWtlCisJZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcyBjb3JyZXNwb25kLiAgUHV0IGJlZm9yZV9hZGRyIGluCisJREVCVUdfUkVMT0MgaWZkZWYuCisJKGR1bXBfdG9jKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuCisJKHBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBBbHdheXMKKwlyZXR1cm4gYSB2YWx1ZS4KKwkocHBjX3JlZmxvX3JlbG9jKTogSWZkZWYgb3V0LgorCShwcGNfYWRkcjMybmJfcmVsb2MpOiBJZmRlZiBvdXQuCisJKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzCisJY29ycmVzcG9uZC4KKwkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiBMaWtld2lzZS4KKwkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCisJKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTW92ZSBvdGhlcndpc2UgdW51c2VkIHZhcmlhYmxlcyBpbnRvCisJdGhlICNpZmRlZiB3aGVyZSB0aGV5IGFyZSB1c2VkLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgorCShwZV9wcmludF9lZGF0YSk6IE1ha2UgZnByaW50ZiBzdHJpbmdzIGFuZCBhcmd1bWVudCB0eXBlcworCWNvcnJlc3BvbmQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCisJKHBlX3ByaW50X3BkYXRhKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgYWRkcl92YWx1ZS4gIEFsd2F5cworCXJldHVybiBhIHZhbHVlLgorCShwZV9wcmludF9yZWxvYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgb25hbGluZS4gIE1ha2UgZnByaW50ZgorCXN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBSZXR1cm4gdHJ1ZS4KKwkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBNb3ZlIGRlZmluaXRpb24gb2YgdW51c2VkCisJdmFyaWFibGUgcmVsYSBpbnNpZGUgI2lmIDAgc2VjdGlvbiB3aGVyZSBpdCBpcyB1c2VkLgorCisJKiBuczMyay5oOiBOZXcgZmlsZS4KKwkqIGNwdS1uczMyay5oOiBJbmNsdWRlIG5zMzJrLmguICBSZW5hbWUgZXh0ZXJuYWxseSB2aXNpYmxlCisJZnVuY3Rpb25zIHRvIHN0YXJ0IHdpdGggX2JmZF8uCisJKiBhb3V0LW5zMzJrLmM6IEluY2x1ZGUgbnMzMmsuaC4gIENoYW5nZSByZWZlcmVuY2VzIHRvIHJlbmFtZWQKKwlmdW5jdGlvbnMgaW4gY3B1LW5zMzJrLmguCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKEhGSUxFUyk6IEFkZCBuczMyay5oLgorCisJKiBzZWN0aW9uLmMgKHN0cnVjdCBzZWMpOiBBZGQgbGlua2VyX21hcmsgZmllbGQuICBDaGFuZ2UKKwl1c2VyX3NldF92bWEgYW5kIHJlbG9jX2RvbmUgdG8gYmUgc2luZ2xlIGJpdCBmaWVsZHMuCisJKFNURF9TRUNUSU9OKTogVXBkYXRlIGFjY29yZGluZ2x5LgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKKwlsaW5rLgorCShhb3V0X2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKKwlsaW5rLgorCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgorCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluCisJdGhlIGxpbmsuCisJKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4gdGhlCisJbGluay4KKwkoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KKwkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZAorCWluIHRoZSBsaW5rLgorCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCisKKwkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSW5jbHVkZSBzZWN0aW9uIG5hbWUgaW4KKwlvdmVyZmxvdyBlcnJvciBtZXNzYWdlcy4KKworVHVlIE1hciAyNiAxNTo0NjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZC5jIChfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlcik6IElmIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lCisJaXMgbm90IHNldCwgcHJpbnQgIkJGRDogIiBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UuCisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBhciBhbmQgcmFubGliLiAgRnJvbQorCU1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBNYXIgMjIgMTI6MTc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBGaXggc2NhbiBmb3IgQ19CSU5DTC9DX0VJTkNMCisJc3ltYm9scy4KKworCSogY29uZmlnLmJmZDogQWRkIGllZWVfdmVjIHRvIHRhcmdfc2VsdmVjcyBmb3IgaTk2MCB0YXJnZXRzIGFuZAorCW02OGstYW91dCwgbTY4ay1jb2ZmLCBhbmQgbTY4ay1lbGYgdGFyZ2V0cy4KKworRnJpIE1hciAyMiAxMTozMzo0NCAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQGdvb2Z5LmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KKworCSogaWVlZS5jOiBDaGFuZ2VkICNpZmRlZiBLRUVQTUlOVVNQQ0lOSU5TVCB0byAjaWYgS0VFUE1JTlVTUENJTklOU1QuCisJKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogUmVzdHJ1Y3R1cmVkIHRvIHByZXZlbnQKKwlpZWVlX29iamVjdF9wIGZyb20gYmVpbmcgY2FsbGVkIHJlcGVhdGVkbHkuCisKK1RodSBNYXIgMjEgMTE6MDA6NDcgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgQWxsb2NhdGUKKwlidWZmZXJzIGxhcmdlIGVub3VnaCBmb3IgYW55IEZJTEVIRFIgb3IgQU9VVEhEUi4KKworVGh1IE1hciAyMSAxNjoyODoxNyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgorCisJKiBlY29mZmxpbmsuYyAobG9va3VwX2xpbmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCByZW5hbWVkIGFuZAorCXNsaWdobHkgY2hhbmdlZCBmcm9tIG9sZCBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lLgorCShfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogQ2FjaGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICBVc2UKKwlsb29rdXBfbGluZSBmb3IgYWN0dWFsIGxvb2t1cC4KKworVGh1IE1hciAyMSAxNDo1OToxMSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcGRhdGEpOiBXYXJuIGlmIHRoZSAucGRhdGEgc2VjdGlvbiBpcyBub3QgYQorCW11bHRpcGxlIG9mIDIwIGJ5dGVzLgorCitUaHUgTWFyIDIxIDEzOjU0OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBiZmRfemFsbG9jIHRvCisJYWxsb2NhdGUgZWNvZmZfZmluZF9saW5lLCBhbmQgZG9uJ3QgaW5pdGlhbGl6ZSBieSBoYW5kLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBiZmRfemFsbG9jIGZvcgorCW1pcHNfZWxmX2ZpbmRfbGluZSwgYW5kIGRvbid0IGNhbGwgbWVtc2V0LgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIG5vdAorCXByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUsIGRvbid0IGNvbnNpZGVyIHNvZmFyIHdoZW4gYWxpZ25pbmcKKwl0aGUgc2VjdGlvbiB0byB0aGUgY29ycmVjdCBzaXplLgorCitXZWQgTWFyIDIwIDE2OjUzOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogSWZkZWYgb3V0LgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNhbGwgY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLgorCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fc3ltYm9sKTogSWZkZWYgb3V0LgorCitNb24gTWFyIDE4IDEyOjU0OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogSW5pdGlhbGl6ZSBncCBpZgorCW91dHB1dF9iZmQgaXMgbm90IE5VTEwuCisKK1RodSBNYXIgMTQgMTc6MTI6MDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDYWxsIGJmZF96YWxsb2MgaW5zdGVhZAorCW9mIGJmZF9hbGxvYyAoZml4ZXMgZml4X2xpbmUgbm90IGJlaW5nIGluaXRpYWxpemVkKS4KKwlEZWxldGUgemVyb2luZyBvZiBmaXhfe3ZhbHVlLHRhZyxlbmQsc2NubGVufSBmaWVsZHMuCisKK1RodSBNYXIgMTQgMTY6MDY6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb2ZmY29kZS5oOiBBbGxvdyBzcGVjaWZpYyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUKKwliZmRfbGlua19hZGRfc3ltYm9scyByb3V0aW5lLgorCisJKiBjb2ZmLWg4MzAwLmM6IEluY2x1ZGUgZ2VubGluay5oLgorCShob3d0b190YWJsZSk6IEFkZCBSX01FTV9JTkRJUkVDVC4KKwkocnR5cGUyaG93dG8pOiBTdXBwb3J0IFJfTUVNX0lORElSRUNULgorCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogSGFuZGxlIFJfTUVNX0lORElSRUNUIGxpa2UgUl9SRUxCWVRFCisJZm9yIG5vdy4KKworVHVlIE1hciAxMiAxMjo0MToxNyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBrb2FsYS5henN0YXJuZXQuY29tPgorCisJKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UKKwlpbmZvLT5jYWxsYmFja3Nfd2FybmluZywgcmF0aGVyIHRoYW4gX2JmZF9lcnJvcl9oYW5kbGVyLCBmb3IKKwkibXVsdGlwbGUgZ3AiIHdhcm5pbmcuCisKK1R1ZSBNYXIgMTIgMTI6MTA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaW5rZXIuYyAoYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KKwkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VSVCBvbiBoYXNoCisJdGFibGUgc3RyaW5nLiAgVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAuCisJKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBSZW1vdmUgQkZEX0FTU0VSVCBvbiBoYXNoCisJdGFibGUgc3RyaW5nLgorCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVc2UgdGhlIG5hbWUgZnJvbSB0aGUgaGFzaAorCXRhYmxlLCBpZiBhbnksIHdoZW4gd3JpdGluZyBvdXQgc3ltYm9scy4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2ggdGFibGUsCisJaWYgYW55LCB3aGVuIHJlcG9ydGluZyB1bmRlZmluZWQgc3ltYm9scy4KKwkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCisJKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAuCisJKiBib3V0LmMgKGdldF92YWx1ZSk6IExpa2V3aXNlLgorCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KKwkqIGVjb2ZmLmMgKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogTGlrZXdpc2UuCisJKGVsZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCisJKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KKwkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KKwkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCisJKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCisJKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkoYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MpOiBMaWtld2lzZS4KKwkoeGNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgorCisJKiBlY29mZnN3YXAuaCAoZWNvZmZfc3dhcF9mZHJfaW4pOiBJZiBFQ09GRl82NCwgdHVybiAweGZmZmZmZmZmCisJaW50byAtMSBmb3IgaW50ZXJuLT5yc3MuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KKworTW9uIE1hciAxMSAxMjoyODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWItc3ltcy5jIChfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSk6IERlZmluZS4KKwkoYmZkX2dldF9zdGFiX25hbWUpOiBSZW5hbWUgZnJvbSBhb3V0X3N0YWJfbmFtZS4gIFJld3JpdGUgdG8gdXNlIGEKKwlzd2l0Y2guCisJKiBiZmQtaW4uaCAoYmZkX2dldF9zdGFiX25hbWUpOiBEZWNsYXJlLgorCSogYmZkLWluMi5oOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShCRkRfTElCUyk6IEFkZCBzdGFiLXN5bXMuby4KKwkoQkZEX0xJQlNfQ0ZJTEVTKTogQWRkIHN0YWItc3ltcy5jLgorCShCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBzdGFiLXN5bXMuby4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogUmVtb3ZlIHN0YWItc3ltcy5jLgorCSogY29uZmlndXJlLmluOiBEb24ndCBsaXN0IHN0YWItc3ltcy5vIGluIGJmZF9iYWNrZW5kcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGxpYmFvdXQuaCAoYW91dF9zdGFiX25hbWUpOiBEb24ndCBkZWNsYXJlLgorCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykpOiBDYWxsIGJmZF9nZXRfc3RhYl9uYW1lLAorCW5vdCBhb3V0X3N0YWJfbmFtZS4KKworRnJpIE1hciAgOCAxMToyNjoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWRqdXN0IGZpbGUgb2Zmc2V0CisJZm9yIHNlY3Rpb24gYWxpZ25tZW50IGV2ZW4gaWYgU0VDX0xPQUQgaXMgbm90IHNldC4KKworVHVlIE1hciAgNSAxMjowMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFNITElCIG9yIFNITElOSyB0byBhbiBlbXB0eSBzdHJpbmcsCisJc2luY2UgdGhleSBhcHBlYXIgYXMgdGFyZ2V0cyBpbiBNYWtlZmlsZS5pbi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogSWYgbm90IG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LAorCWRvbid0IGZpZGRsZSB3aXRoIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLgorCitNb24gTWFyICA0IDEyOjQ5OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmspOiBUcmVhdCB1bmRlZmluZWQgaW1wb3J0ZWQgc3ltYm9scyBhcworCXRob3VnaCB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc2hhcmVkIGxpYnJhcnkuCisJKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IExpa2V3aXNlLgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCBsb29rIGF0IHRoZSBsaW5lCisJbnVtYmVycyBmb3IgdGhlIHNlY3Rpb24gaWYgc2VjdGlvbi0+bGluZW5vIGlzIE5VTEwuCisKKwkqIGVsZi5jIChfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogUHJpbnQgYSB1c2VmdWwgZXJyb3IKKwltZXNzYWdlIHJhdGhlciB0aGFuIGNhbGxpbmcgQkZEX0FTU0VSVC4KKwkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbC4KKworRnJpIE1hciAgMSAwOTo0Mjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCBTRUNfTE9BRCBmbGFnCisJZm9yIC5zYnNzIHNlY3Rpb24uCisKK1dlZCBGZWIgMjggMTE6MjU6NDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBsaWJocHBhLmggKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IEFkZCBSX0hQUEFfTkxTRUwKKwlhbmQgUl9IUFBBX05MUlNFTC4KKwkoZV9uc2VsLCBlX25sc2VsLCBlX25scnNlbCk6IFVuZGVmaW5lLiAgQWRkIHRvCisJaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdC4KKwkoaHBwYV9maWVsZF9hZGp1c3QpOiBIYW5kbGUgZV9ubHNlbCwgZV9ubHJzZWwuICBGaXggZV9uc2VsIGhhbmRsaW5nLgorCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogSGFuZGxlIE4nLCBOTCcgTkxSJyBmaWVsZAorCXNlbGVjdG9ycy4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IEZpbmlzaCBoYW5kbGluZyBvZiBSX04wU0VMIGFuZCBSX04xU0VMLgorCitXZWQgRmViIDI4IDExOjAwOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBZGp1c3QgdGhlIHNlZ21lbnQKKwltZW1vcnkgc2l6ZSBmb3IgdGhlIGFsaWdubWVudCBvZiBhIFNFQ19BTExPQyBzZWN0aW9uLCBub3QganVzdCBhCisJU0VDX0xPQUQgc2VjdGlvbi4KKworVHVlIEZlYiAyNyAxNDoxNzozMSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbTY4a2xpbnV4LmM6IE5ldyBmaWxlLgorCSogaG9zdHMvbTY4a2xpbnV4Lmg6IE5ldyBmaWxlLgorCSogY29uZmlnLmJmZCAobTY4Ki0qLWxpbnV4YW91dCosIG02OCotKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZS5pbiAobTY4Ki0qLWxpbnV4Kik6IE5ldyBuYXRpdmUgaG9zdC4KKwkobTY4a2xpbnV4X3ZlYyk6IE5ldyB2ZWN0b3IuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiB0YXJnZXRzLmMgKG02OGtsaW51eF92ZWMpOiBEZWNsYXJlLgorCSogaTM4NmxpbnV4LmMgKGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogUmVuYW1lZCBmcm9tCisJYmZkX2xpbnV4X3NpemVfZHlubWljX3NlY3Rpb25zIHRvIGF2b2lkIGNsYXNoIHdpdGggbTY4a2xpbnV4LmMuCisJKiBiZmQtaW4uaCAoYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWUKKwlkZWNsYXJhdGlvbiBmcm9tIGJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCisJKGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQkZEMzJfQkFDS0VORFMpOiBBZGQgbTY4a2xpbnV4Lm8uCisJKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBtNjhrbGludXguYy4KKworVHVlIEZlYiAyNyAxMTozMTozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGxpYmhwcGEuaCAocGFfYXJjaCk6IEFkZCBwYTIwLgorCShocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBBZGQgUl9IUFBBX05TRUwuCisJKGVfbnNlbCk6IFVuZGVmaW5lLiAgQWRkIHRvIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQuCisJKGhwcGFfZmllbGRfYWRqdXN0KTogSGFuZGxlIGVfbnNlbC4KKwkqIHNvbS5jOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIG1hbnkgbmV3IHJlbG9jcyBmb3VuZCBvbmx5CisJaW4gaHB1eDEwIGluY2x1ZGUgZmlsZXMuCisJKHNvbV9maXh1cF9mb3JtYXRzKTogQWRkIHNldmVyYWwgbmV3IHJlbG9jcyBmcm9tIGhwdXgxMC4KKwkoc29tX2hwcGFfaG93dG9fdGFibGUpOiBBZGQgaHB1eDEwIHJlbG9jcy4KKwkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX04wU0VMIGFuZCBSX04xU0VMIGhwdXgxMCByZWxvY3MuCisKK01vbiBGZWIgMjYgMTI6NTI6NDggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHJlY2VudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LCBhbmQKKwlydWxlcyB0byByZWJ1aWxkIC5oIGZpbGVzIHVzaW5nIGRvYy9jaGV3LgorCitNb24gRmViIDI2IDE0OjQ4OjM5IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQEFaU3Rhck5ldC5jb20+CisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkanVzdCB0aGUgZmlsZQorCXNpemUgZXZlbiBvZiBzZWN0aW9ucyB3aXRoIG5vIGNvbnRlbnRzLgorCitNb24gRmViIDI2IDE0OjAxOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogV2hlbiBtZXJnaW5nLCBza2lwIG5hbWVzCisJc3RhcnRpbmcgd2l0aCAnJCcgdGhlIHdheSB3ZSBza2lwIG5hbWVzIHN0YXJ0aW5nIHdpdGggJy4nLiAgV2hlbgorCXVwZGF0aW5nIHhfZW5kbmR4LCBkb24ndCBiZSBmb29sZWQgYnkgYW4gaW5kZXggd2hpY2ggaGFzIGJlZW4KKwltZXJnZWQuCisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byBvcHRpbWl6ZSBhCisJc3RydWN0L3VuaW9uL2VudW0gdHlwZSB3aXRoIG5vIGVsZW1lbnRzLgorCitTYXQgRmViIDI0IDExOjM4OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkLmMgKGJmZF9lcnJtc2cpOiBIYW5kbGUgYSBOVUxMIHJldHVybiBmcm9tIHN0cmVycm9yLgorCisJKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IElmIHRoZSBmaXJzdCBmaWxlIGluIHRoZQorCWFyY2hpdmUgY2FuIG5vdCBiZSByZWNvZ25pemVkIGFzIGFuIG9iamVjdCwgZG9uJ3QgYXNzdW1lIHRoYXQgdGhpcworCWlzIHRoZSB3cm9uZyBmb3JtYXQuCisKKwkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZQorCWZvcm1hdCBpcyBub3QgYmZkX29iamVjdC4KKwkoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogTGlrZXdpc2UuCisKK1dlZCBGZWIgMjEgMTM6NTg6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IENvcnJlY3QgcmFuZ2Ugb2YgUl9TSF9VU0VTCisJcmVsb2MuCisKK1R1ZSBGZWIgMjAgMTY6MjI6NDQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBiZmQuYyAodGRhdGEpOiBBZGQgbmV0YnNkX2NvcmVfZGF0YS4KKwkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisKK1R1ZSBGZWIgMjAgMTY6NTA6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdW5vcy5jIChTVU5PU19DT05TVFJVQ1RPUik6IERlZmluZS4KKwkoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBsZXQgYSBzeW1ib2wgZnJvbSBhIGR5bmFtaWMgb2JqZWN0CisJb3ZlcnJpZGUgYSBjb25zdHJ1Y3RvciBzeW1ib2wuICBTZXQgU1VOT1NfQ09OU1RSVUNUT1Igd2hlbgorCWFwcHJvcHJpYXRlLgorCisJKiBib3V0LmMgKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogVXNlIHVkYXRhLmkgcmF0aGVyIHRoYW4gZmxhZ3MKKwl0byBnZXQgdGhlIHN5bWJvbCBpbmRleCwgbWF0Y2hpbmcgMTQgSnVsIDk1IGNoYW5nZS4KKworVHVlIEZlYiAyMCAwODoyNjoyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgorCVJlbW92ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBncC4KKworTW9uIEZlYiAxOSAxMjozNzo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QKKwlhc3N1bWUgdGhhdCB3ZSBjYW4gc2V0IHRoZSBHUCB2YWx1ZSBhbmQgdGhlbiBnZXQgdGhlIHNhbWUgdmFsdWUsCisJc2luY2UgaXQgd29uJ3QgYmUgdHJ1ZSBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgbmVpdGhlciBFTEYgbm9yCisJRUNPRkYuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBEb24ndCBib3RoZXIgdG8gdXNlCisJX2JmZF9nZXRfZ3BfdmFsdWUgaGVyZS4KKwkobWlwc19ncHJlbF9yZWxvYyk6IERvbid0IGFzc3VtZSB3ZSBjYW4gc2V0IGFuZCBnZXQgdGhlIEdQIHZhbHVlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9oaTE2X3JlbG9jKTogR2V0IGdwIHZhbHVlIGZyb20KKwltaXBzX2VsZl9maW5hbF9ncC4KKwkobWlwc19lbGZfbG8xNl9yZWxvYyk6IExpa2V3aXNlLgorCShtaXBzX2VsZl9maW5hbF9ncCk6IEFkZCBwZ3AgcGFyYW1ldGVyLiAgU2V0IGl0IHRvIHRoZSBHUCB2YWx1ZS4KKwlEb24ndCByZXF1aXJlIHRoYXQgdGhlIEJGRCBiZSBFTEYuCisJKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBHZXQgZ3AgdmFsdWUgZnJvbSBtaXBzX2VsZl9maW5hbF9ncC4KKwkobWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IExpa2V3aXNlLgorCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgYXNzdW1lIHdlIGNhbiBzZXQgYW5kIGdldCB0aGUKKwlHUCB2YWx1ZS4KKwkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgYm90aGVyIHRvIHVzZQorCV9iZmRfZ2V0X2dwX3ZhbHVlIGhlcmUuCisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSk6IEluaXRpYWxpemUgc3YuCisJRG9uJ3QgY2hhbmdlIGVwZHIgYmV0d2VlbiBtYWxsb2MgYW5kIGZyZWUuICBCZSBjYXJlZnVsIG5vdCB0byBmcmVlCisJTlVMTCBwb2ludGVycy4gIFplcm8gb3V0IHRoZSBmaXJzdCBSUERSLgorCisJKiBjb25maWd1cmUuaG9zdDogT24gTGludXgsIG9ubHkgcGFzcyAtcnBhdGggb3B0aW9uIGlmICQobGliZGlyKQorCWlzIG5laXRoZXIgL2xpYiBub3IgL3Vzci9saWIuICBGcm9tIEFsYW4gTW9kcmEKKwk8YWxhbkBtdWxsZXQuTGV2ZWxzLlVuaVNBLkVkdS5BdT4uCisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW5hbWUgZHRfbmVlZGVkX25hbWUgdG8KKwlkdF9uYW1lLgorCShlbGZfZHRfbmFtZSk6IFJlbmFtZSBmcm9tIGVsZl9kdF9uZWVkZWRfbmFtZS4KKwkqIGVsZi5jIChiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSk6IFVzZSBlbGZfZHRfbmFtZSwgbm90CisJZWxmX2R0X25lZWRlZF9uYW1lLgorCShiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVzZSBlbGZfZHRfbmFtZSwgbm90CisJZWxmX2R0X25lZWRlZF9uYW1lLiAgU2F2ZSB0aGUgU09OQU1FIGJhY2sgaW4gZWxmX2R0X25hbWUuCisJKiBiZmQtaW4uaCAoYmZkX2VsZl9nZXRfZHRfc29uYW1lKTogRGVjbGFyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworTW9uIEZlYiAxOSAwMjo1MDoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWVkIGZyb20KKwlfYmZkX3NwYXJjX2VsZl9yZWxvY190eXBlX2xvb2t1cC4KKwkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFVwZGF0ZS4KKwkqIGVsZjY0LXNwYXJjLmMgKFNQQVJDNjRfT0xEX1JFTE9DUyk6IERlZmluZS4KKwkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBEZWZpbmUuCisJKHNwYXJjX3JlbG9jX21hcCk6IERlZmluZS4KKwkoc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLgorCShlbGZfaW5mb190b19ob3d0byk6IFVzZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZS4KKwkoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVXBkYXRlLgorCitTdW4gRmViIDE4IDE1OjAyOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3Q6IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQorCXRyeWluZyB0byB1c2UgLXJwYXRoLgorCitGcmkgRmViIDE2IDEyOjQ2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkLmMgKF9iZmRfZ2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgorCShfYmZkX3NldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2dldF9ncF92YWx1ZSk6IERlY2xhcmUuCisJKF9iZmRfc2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KKwkqIGxpYmJmZC5oOiBSZWJ1aWxkLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBVc2UKKwlfYmZkX2dldF9ncF92YWx1ZSBhbmQgX2JmZF9zZXRfZ3BfdmFsdWUgcmF0aGVyIHRoYW4gcmVmZXJyaW5nCisJZGlyZWN0bHkgdG8gdGhlIGZpZWxkcyBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24uCisJKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2FkanVzdF9yZWxvY19pbik6IExpa2V3aXNlLgorCShtaXBzX2dwcmVsX3JlbG9jKTogTGlrZXdpc2UuCisJKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9oaTE2X3JlbG9jKTogTGlrZXdpc2UuCisJKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBMaWtld2lzZS4KKwkobWlwc19lbGZfZmluYWxfZ3ApOiBMaWtld2lzZS4KKwkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IExpa2V3aXNlLgorCShtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogTGlrZXdpc2UuCisJKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCisKKwkqIGJvdXQuYyAoYl9vdXRfc2V0X2FyY2hfbWFjaCk6IFJlY29nbml6ZSBiZmRfbWFjaF9pOTYwX2p4LgorCitUaHUgRmViIDE1IDExOjI5OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBpbmZvcm1hdGlvbiB3aGljaCBhdXRvY29uZiBzaG91bGQKKwlmaWd1cmUgb3V0LCBuYW1lbHkgQ0MsIENGTEFHUywgTERGTEFHUywgQVIsIGFuZCBSQU5MSUIuCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgZ28zMiBhbmQgd2luMzIgaG9zdCBpbmZvcm1hdGlvbiwgc2luY2UgaXQKKwlzaG91bGQgbm8gbG9uZ2VyIGJlIG5lZWRlZC4KKworCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIHdlIGhhdmUgYSAuZHluYW1pYyBzZWN0aW9uLAorCXRoZW4gc3RhcnQgYSBuZXcgc2VnbWVudCByYXRoZXIgdGhhbiBwdXQgYSB3cml0YWJsZSBzZWN0aW9uIGluIGEKKwlyZWFkb25seSBzZWdtZW50LgorCisJKiBjb25maWd1cmUuaG9zdDogU2V0IFJQQVRIX0VOVlZBUi4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCisJKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQKKwl6ZXJvX3NlY3Rpb24gdmFyaWFibGUuCisKK1RodSBGZWIgMTUgMTA6Mzk6MTcgMTk5NiAgSC5KLiBMdSAgPGhqbEB6b29tLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKCQoc3JjZGlyKS9iZmQtaW4yLmgpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYmZkLWluMi5oLgorCSgkKHNyY2RpcikvbGliYmZkLmgpOiBSZW5hbWUgZnJvbSBsaWJiZmQuaC4KKwkoJChzcmNkaXIpL2xpYmNvZmYuaCk6IFJlbmFtZSBmcm9tIGxpYmNvZmYuaC4KKworV2VkIEZlYiAxNCAxNjoyOTowNyAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgorCisJKiBpZWVlLmMgKGllZWVfd3JpdGVfZXhwcmVzc2lvbik6IE9ubHkgdXNlIGFuIFIgdmFyaWFibGUgZm9yIGEKKwlsb2NhbCBzeW1ib2wuICBEb24ndCBvdXRwdXQgYSB6ZXJvIG9mZnNldC4gIEhhbmRsZSBhIHplcm8gYWRkcmVzcy4KKwkoU1JDX01BU0ssIFBDUkVMX09GRlNFVCk6IERlZmluZSBiYXNlZCBvbiBLRUVQTUlOVVNQQ0lOSU5TVC4KKwkocmVsMzJfaG93dG8sIHJlbDE2X2hvd3RvLCByZWw4X2hvd3RvKTogVXNlIFNSQ19NQVNLIGFuZAorCVBDUkVMX09GRlNFVC4KKwkocGFyc2VfZXhwcmVzc2lvbik6IERvbid0IHRyeSB0byBoYW5kbGUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgYQorCVAgdmFyaWFibGUuICBIYW5kbGUgSSB2YXJpYWJsZXMgZGlmZmVyZW50bHkgZnJvbSBYIHZhcmlhYmxlcy4gIEZpeAorCXRoZSBvcmRlciBvZiBtaW51cyBleHByZXNzaW9ucy4KKwkoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogR2VuZXJhdGUgYW4gSSB2YXJpYWJsZSBmb3IgYW4gTk4KKwlyZWNvcmQuICBGaXggaGFuZGxpbmcgb2YgQVRJIGFuZCBBVFggcmVjb3Jkcy4KKwkoaWVlZV9zbHVycF9zZWN0aW9ucyk6IE9ubHkgc2V0IG1pbmltYWwgc2VjdGlvbiBhdHRyaWJ1dGVzLgorCUFkanVzdCB0aGVtIGxhdGVyLCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBjb250ZW50cy4KKwkoaWVlZV9vYmplY3RfcCk6IFJlYWQgaW4gdGhlIGZpbGUgdW50aWwganVzdCBhZnRlciB0aGUgTUUgcmVjb3JkLgorCUNhbGwgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzLgorCShkb19vbmUpOiBBZGQgaXRlcmF0aW9ucyBwYXJhbWV0ZXIuICBPbmx5IHJlcGVhdCB0aGUgZmlyc3QgbG9hZAorCWl0ZW0uICBTZXQgdGhlIHNlY3Rpb24gYW5kIGZpbGUgcmVsb2MgZmxhZ3MuCisJKGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhKTogU2V0IHNlY3Rpb24gZmxhZ3MuICBQYXNzIGl0ZXJhdGlvbnMgdG8KKwlkb19vbmUuCisJKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogSGFuZGxlIEkgdmFyaWFibGVzLgorCShkb193aXRoX3JlbG9jcyk6IE9ubHkgZW1pdCByZWxvY2F0aW9uIHNpemUgd2hlbiBuZWNlc3NhcnkuCisJSW5jcmVhc2UgTUFYUlVOIHRvIDEyNy4gIENoYW5nZSBvdiB0byBiZSBhc3NpZ25lZCwgYW5kIHRha2UKKwlzcmNfbWFzayBhbmQgcGNyZWxfb2Zmc2V0IGludG8gYWNjb3VudC4KKwkoaWVlZV93cml0ZV9kYXRhX3BhcnQpOiBTa2lwIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCBsb2FkZWQuCisJKGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCk6IERvbid0IG91dHB1dCBvcHRpb25hbCBsYXN0IGVudHJ5IG9mIFdYCisJcmVjb3Jkcy4KKwkoaWVlZV93cml0ZV9tZV9wYXJ0KTogTWFrZSBzZXR0aW5nIG9mIG1lX3JlY29yZCBuZWF0ZXIuCisJKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogR2V0IHRoZSBzaXplIG9mIGFuIGFyY2hpdmUgZWxlbWVudC4KKworCSogc3ltcy5jIChzdHQpOiBBZGQgZW50cmllcyBmb3IgemVyb3ZhcnMsIHZhcnMsIGFuZCBjb2RlLgorCisJKiBlbGZjb2RlLmggKHZhbGlkYXRlX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkod3JpdGVfcmVsb2NzKTogQ2FsbCB2YWxpZGF0ZV9yZWxvYyBmb3Igbm9uIEVMRiByZWxvY3MuCisKKwkqIGVsZnh4LXRhcmdldC5oIChlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkoVEFSR0VUX0JJR19TWU0pOiBVc2UgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIuCisJKFRBUkdFVF9MSVRUTEVfU1lNKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy5iZmQgKG02OCotKi1wc29zKik6IE5ldyB0YXJnZXQuCisKK1R1ZSBGZWIgMTMgMTU6NTY6MjIgMTk5NiAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBzbmFrZS5jcy51dGFoLmVkdT4KKworCSogaTM4Nm1zZG9zLmM6IFJlbW92ZSBzb21lICNpZiAwIGNvZGUuCisJKG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGluY2x1ZGUgZW1wdHkgc2VjdGlvbnMgaW4gdGhlCisJc2l6ZSBjb21wdXRhdGlvbiwgcmVnYXJkbGVzcyBvZiB0aGVpciBhZGRyZXNzLgorCitUdWUgRmViIDEzIDE1OjM2OjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHNlZ2ZhdWx0IGlmIGR5bmJvagorCWlzIE5VTEwsIGllLCB0aGUgLXIgc3dpdGNoIGlzIHVzZWQuCisKK1R1ZSBGZWIgMTMgMTQ6MzU6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik6IERlZmluZS4KKwkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpOiBEZWZpbmUuCisJKEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KTogRGVmaW5lLgorCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KKwkqIGVsZjMyLW1pcHMuYyAobWlwc19yZWxvY19tYXApOiBNYXAgbmV3IHJlbG9jcy4KKworCSogY29uZmlndXJlLmhvc3Q6IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCisKKwkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBDaGVjayB0cyBhZ2FpbnN0ICQoU0hMSUIpLCBub3QKKwkkKFNITElOSykuCisKKwkqIGllZWUuYyAoZ2V0X3N5bWJvbCk6IFNldCB0aGUgc2VjdGlvbiB0byBiZmRfYWJzX3NlY3Rpb24uCisJKGRvX3dpdGhfcmVsb2NzKTogSWYgRVhFQ19QIGlzIHNldCBhbmQgdGhlcmUgYXJlIG5vIHJlbG9jcywgdXNlIGEKKwlzaW1wbGUgbnVtYmVyIGZvciB0aGUgc2VjdGlvbiBhZGRyZXNzLCByYXRoZXIgdGhhbiBhbiBleHByZXNzaW9uLgorCUxpbWl0IHRoZSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiByZWxvY3MgdG8gTUFYUlVOLgorCShpZWVlX3dyaXRlX21lX3BhcnQpOiBTZXQgbWVfcmVjb3JkIHRvIHRoZSBmaWxlIG9mZnNldCBhZnRlciB0aGUKKwlzdGFydCBhZGRyZXNzLgorCShpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIGllZWVfd3JpdGVfcHJvY2Vzc29yLgorCitGcmkgRmViICA5IDEwOjUzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3Q6IFVzZSAke0NDLWdjY30gd2hlbiB0ZXN0aW5nIGZvciAtcnBhdGggb24gU3VuT1MuCisKKwkqIGNvZmYtYXV4LmM6IENoYW5nZSBpbmNsdWRlIG9mIGF1eC5oIHRvIGF1eC1jb2ZmLmguCisKK1RodSBGZWIgIDggMTQ6MDE6MDMgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIFJfNjhLX1JFTEFUSVZFCisJcmVsb2NhdGlvbiBwdXQgdGhlIGFkZGVuZCBib3RoIGluIHRoZSByZWxvYyBlbnRyeSBhbmQgdGhlIGRhdGEuCisJKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLiAgTWFzayBvdXQgbWFya2VyIGluCisJR09UIG9mZnNldCB2YWx1ZS4KKworCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgcmVzb2x2ZQorCWEgUl82OEtfUEN4eCByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBnbG9iYWwgc3ltYm9sIGRpcmVjdGx5LgorCShlbGZfbTY4a19jaGVja19yZWxvY3MpOiBEb24ndCBjb3VudCBzdWNoIGEgcmVsb2MuCisKKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogRG9uJ3QgcmVjb3JkIGEgc3ltYm9sIHdpdGgKKwlhIFBMVHh4IHJlbG9jIGFzIGR5bmFtaWMuICBEaXNhbGxvdyBQTFR4eE8gcmVsb2MgYWdhaW5zdCBhIGxvY2FsCisJc3ltYm9sIGZvciBub3csIG90aGVyd2lzZSBhbHdheXMgcmVjb3JkIHRoZSBzeW1ib2wgYXMgZHluYW1pYy4KKwkoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgd2l0aCBhIFBMVHh4IHJlbG9jCisJaXMgbm90IHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEKKwlzaGFyZWQgb2JqZWN0LCB0aGVuIGRvbid0IG1ha2UgYSBQTFQgZW50cnkuICBJZiB3ZSBkbyBtYWtlIGEgUExUCisJZW50cnksIG1ha2Ugc3VyZSB0aGUgc3ltYm9sIGhhcyBiZWVuIHJlY29yZGVkIGFzIGR5bmFtaWMuCisKK1dlZCBGZWIgIDcgMTM6NTY6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSwgc2V0IEhMREZMQUdTIHRvCisJcGFzcyBhbiBhcHByb3ByaWF0ZSAtcnBhdGggb3B0aW9uLiAgVXNlIHRoZSBtYWtlIHZhcmlhYmxlIFNPTkFNRQorCWFzIHRoZSBzaGFyZWQgbGlicmFyeSBzb25hbWUsIHJhdGhlciB0aGFuIGNvbXB1dGluZyBpdCBoZXJlLiAgT24KKwlTdW5PUywgYnVpbGQgc3RhbXAtdHNobGluayBpbiBwbGFjZSBvZiAkKFNITElOSykuCisJKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogTmV3IHZhcmlhYmxlLgorCSgkKFNITElOSykpOiBNYWtlIGEgbGluayB0byB0aGUgdHJhbnNmb3JtZWQgbmFtZSwgYXMgd2VsbC4KKwkoc3RhbXAtdHNobGluayk6IE5ldyB0YXJnZXQuCisJKGluc3RhbGwpOiBTa2lwIHN0YW1wLXRzaGxpbmsgZHVyaW5nIGluc3RhbGwuCisKK1dlZCBGZWIgIDcgMTM6Mzc6MzkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBEbyBub3QgYXNzdW1lIHRoYXQgdGhlCisJbGlua2VyIHNlY3Rpb25zIGhhdmUgYmVlbiBzZXQgdXAgeWV0LgorCisJKiBlbGYuYyAobWFrZV9tYXBwaW5nKTogQWRkIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gc3VwcHJlc3MKKwltYWtpbmcgdGhlIGZpcnN0IHNlY3Rpb24gaW5jbHVkZSB0aGUgcHJvZ3JhbSBoZWFkZXJzLgorCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBJZiB0aGUgdXNlciB1c2VkIC1UdGV4dCBzdWNoIHRoYXQgdGhlCisJcHJvZ3JhbSBoZWFkZXJzIGFyZSBvbiBhIGRpZmZlcmVudCBwYWdlLCBkbyBub3Qgc2V0IHRoZSBmbGFncworCXNheWluZyB0aGF0IHRoaXMgc2VjdGlvbiBpbmNsdWRlcyB0aGUgcHJvZ3JhbSBoZWFkZXJzLgorCitUdWUgRmViICA2IDE0OjA0OjQ5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICgqLSotbmV0YnNkKik6IFNldCBDT1JFRklMRSB0byBuZXRic2QtY29yZS5jLgorCWRvbid0IGRlZmluZSBUUkFEX0hFQURFUi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogbmV0YnNkLWNvcmUuYzogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIE5ldEJTRCBjb3JlIGZpbGVzLgorCSogaG9zdHMvKm5ic2QuaDogUmVtb3ZlZC4KKworVHVlIEZlYiAgNiAxMTo0Nzo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NQQVJDX1s1NjddKTogTmV3IHJlbG9jIHR5cGVzLgorCShCRkRfUkVMT0NfU1BBUkNfTE83IHJlbG9jIHR5cGUpOiBEZWxldGVkLgorCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCisJKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZWQgZnJvbQorCWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAuCisJKHJlbG9jX3R5cGV7LF9uYW1lc30pOiBEZWxldGVkLgorCShfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfc3BhcmNfaG93dG9fdGFibGUuCisJQWRkIHNwYXJjNjQgcmVsb2NzLgorCShzcGFyY19yZWxvY19tYXApOiBBZGQgc3BhcmM2NCByZWxvY3MuCisJKHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSBSX1NQQVJDX1dESVNQezE2LDE5fS4KKwkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgorCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfd2Rpc3AxNl9yZWxvYyk6IERlbGV0ZWQuCisJKHJlbG9jX3R5cGV7LF9uYW1lc30pOiBEZWxldGVkLgorCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEZWxldGVkLgorCShzcGFyY19yZWxvY19tYXApOiBEZWxldGVkLgorCShfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfc3BhcmNfaG93dG9fdGFibGUuCisJKGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBDaGFuZ2UgZnJvbSBmdW5jdGlvbiB0byAjZGVmaW5lLgorCitUdWUgRmViICA2IDEyOjEyOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3Q6IE1ha2UgU0hMSUJfQ0ZMQUdTIGluY2x1ZGUgJChQSUNGTEFHKSBvbiBhCisJKi0qLWhwdXgqIGhvc3QuCisKKwkqIE1ha2VmaWxlLmluIChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogTmV3IHZhcmlhYmxlLgorCShpbnN0YWxsKTogVHJhbnNmb3JtIGxpYnJhcnkgbmFtZSBiZWZvcmUgaW5zdGFsbGluZyBpdC4KKworTW9uIEZlYiAgNSAxMDozODoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2k5NjBfaHgpOiBEZWZpbmUuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBjcHUtaTk2MC5jIChzY2FuXzk2MF9tYWNoKTogQWNjZXB0IG1hY2hpbmUgImh4Ii4KKwkoTUFUUklYKTogRXhwYW5kIGVudHJpZXMgZm9yIEhYLgorCShhcmNoX2luZm9fc3RydWN0KTogQWRkIGk5NjA6aHggZW50cnkuCisJKiBib3V0LmMgKGJfb3V0X3NldF9hcmNoX21hY2gpOiBIYW5kbGUgYmZkX21hY2hfaTk2MF9oeC4KKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogSGFuZGxlIEZfSTk2MEhYLgorCShjb2ZmX3NldF9mbGFncyk6IEhhbmRsZSBiZmRfbWFjaF9pOTYwX2h4LgorCisJU3VwcG9ydCBmb3IgYnVpbGRpbmcgYXMgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcGF0Y2hlcyBmcm9tCisJQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgorCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3Igc2hhcmVkIGFuZCBjb21tb25iZmRsaWIuCisJTmV3IHN1YnN0aXR1dGlvbnM6IEFMTExJQlMsIFBJQ0ZMQUcsIFNITElCLCBTSExJQl9DQywKKwlTSExJQl9DRkxBR1MsIENPTU1PTl9TSExJQiwgUElDTElTVCwgU0hMSU5LLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLmhvc3Q6IElmIC0tZW5hYmxlLXNoYXJlZCwgYWRqdXN0IHNoYXJlZCBsaWJyYXJ5IHN0dWZmCisJYmFzZWQgb24gdGhlIGhvc3QuICBJZiB0aGUgaG9zdCBpcyBTdW5PUywgYW5kIHRoZSBsaW5rZXIgc3VwcG9ydHMKKwktcnBhdGgsIHNldCBITERGTEFHUyB0byB1c2UgaXQuCisJKiBNYWtlZmlsZS5pbiAoQUxMTElCUyk6IE5ldyB2YXJpYWJsZS4KKwkoUElDRkxBRywgU0hMSUIsIFNITElCX0NDLCBTSExJQl9DRkxBR1MpOiBOZXcgdmFyaWFibGVzLgorCShDT01NT05fU0hMSUIsIFNITElOSyk6IE5ldyB2YXJpYWJsZXMuCisJKC5jLm8pOiBJZiBQSUNGTEFHIGlzIHNldCwgY29tcGlsZSB0d2ljZSwgb25jZSBQSUMsIG9uY2Ugbm9ybWFsLgorCShTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgorCShhbGwpOiBEZXBlbmQgdXBvbiAkKEFMTExJQlMpIGFuZCBAUElDTElTVEAgcmF0aGVyIHRoYW4KKwkkKFRBUkdFVExJQikuCisJKHN0YW1wLW9maWxlcyk6IE5ldyB0YXJnZXQsIGxpa2Ugb2xkIG9maWxlcyB0YXJnZXQsIGJ1dCBidWlsZAorCXVzaW5nIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIG1vdmUtaWYtY2hhbmdlLCBhbmQgdG91Y2ggc3RhbXAtb2ZpbGVzCisJd2hlbiBkb25lLgorCShvZmlsZXMpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLW9maWxlcy4KKwkoc3RhbXAtcGljbGlzdCwgcGljbGlzdCk6IE5ldyB0YXJnZXRzLgorCSgkKFNITElCKSwgJChTSExJTkspKTogTmV3IHRhcmdldHMuCisJKHRhcmdldHMubywgYXJjaHVyZXMubyk6IEJ1aWxkIHR3aWNlIGlmIFBJQ0ZMQUcgaXMgc2V0LgorCShkb19tb3N0bHljbGVhbik6IFJlbW92ZSBwaWMvKi5vLgorCShkb19jbGVhbik6IFJlbW92ZSBzdGFtcC1vZmlsZXMsICQoU0hMSUIpLCAkKFNITElOSyksIHBpY2xpc3QsIGFuZAorCXN0YW1wLXBpY2xpc3QuCisJKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBwaWMgYW5kIHN0YW1wLXBpY2Rpci4KKwkoaW5zdGFsbCk6IEluc3RhbGwgc2hhcmVkIGxpYnJhcmllcy4KKwkoJChPRklMRVMpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgorCShzdGFtcC1waWNkaXIpOiBOZXcgdGFyZ2V0LgorCisJKiBsaWJjb2ZmLWluLmg6IEFkZCBjb21tZW50IHJlbWluZGluZyBwZW9wbGUgdGhhdCBsaWJjb2ZmLmggaXMgYQorCWdlbmVyYXRlZCBmaWxlLgorCSogbGliY29mZi5oOiBSZWJ1aWxkLgorCisJKiBlbGZsaW5rLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCB0cnkgdG8gZ2V0IHRoZQorCWZsYXZvdXIgb2YgYSBzZWN0aW9uIHdpdGggbm8gb3duZXIuCisKKwkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhcgorCUVMRl9MSU5LX05PTl9FTEYgZmxhZy4KKwkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIGVsZi5jOiBSZXZlcnQgbGFzdCBjaGFuZ2UsIHNpbmNlIGl0IGJyZWFrcyBkeW5hbWljIGxpbmtpbmcuCisJKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIHdhbnRfaGRyX2luX3NlZworCWZpZWxkLgorCSogZWxmMzItbWlwcy5jIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEb24ndCBkZWZpbmUuCisJKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfd2FudF9oZHJfaW5fc2VnKTogRG9uJ3QgZGVmaW5lLgorCShlbGZOTl9iZWQpOiBEb24ndCBpbml0aWFsaXplIHdhbnRfaGRyX2luX3NlZyBmaWVsZC4KKworU3VuIEZlYiAgNCAyMDo0NToxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgdGhlIGJhY2tlbmQgZG9lcworCW5vdCB3YW50IHRoZSBlbGYgaGVhZGVyIG9yIHRoZSBwcm9ncmFtIGhlYWRlcnMgaW4gdGhlIGFkZHJlc3MKKwlzcGFjZSwgZG8gbm90IGluY2x1ZGUgdGhlbSBpbiB0aGUgY2FsY3VsYXRpb25zLgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IE5ldyBob29rCisJZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgYWRkaXRpb25hbCBwcm9ncmFtIGhlYWRlcnMuCisJKHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwKTogRGVmaW5lIGFzIGEgTk9QIGZ1bmN0aW9uIGZvciBub3cuCisJKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogLnNkYXRhMiBpcyBhIHJlYWQtb25seSBzZWN0aW9uLgorCitTYXQgRmViICAzIDIzOjAwOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaDogTW92ZSB0b2RheSdzIGxpYmNvZmYuaCBjaGFuZ2UgaW50byBjb2ZmY29kZS5oLgorCitTYXQgRmViICAzIDE1OjQzOjQ0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLmggKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDb21iaW5lIG1hY3JvIGFyZ3MKKwliYWNrIGludG8gb25lIGxpbmUuICBTb21lIGNvbXBpbGVycyAoc3Vub3MgNC4xLjMgZm9yIGV4YW1wbGUpCisJd29uJ3QgYWNjZXB0IGFyZ3Mgc3BsaXQgYWNyb3NzIG1vcmUgdGhhbiBvbmUgbGluZS4KKworRnJpIEZlYiAgMiAxMTo0MjoxNSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChCRkRfQklOQVJZX0ZPUEVOKTogVW5kZXJzdGFuZCBjeWd3aW4zMi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworRnJpIEZlYiAgMiAxMjoxMjoxNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogRG9uJ3QKKwl0cnkgdG8gZG8gYXJpdGhtZXRpYyBvbiBhIHZvaWQgKiwgY2FzdCBpdCB0byBhIHVuc2lnbmVkIGNoYXIgKiBmaXJzdC4KKworVGh1IEZlYiAgMSAxNjowNDowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi1iZmQuaCAoRUxGX0xJTktfTk9OX0VMRik6IERlZmluZS4KKwkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFNldCBlbGZfbGlua19oYXNoX2ZsYWdzIHRvCisJRUxGX0xJTktfTk9OX0VMRi4KKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogUmVzZXQgRUxGX0xJTktfTk9OX0VMRgorCWZsYWcgZm9yIGEgbmV3bHkgZGVmaW5lZCBzeW1ib2wuCisJKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IExpa2V3aXNlLgorCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgRUxGX0xJTktfTk9OX0VMRiBpcyBzZXQsIHRyeSB0bworCXNldCB0aGUgREVGIG9yIFJFRl9SRUdVTEFSIGZsYWdzIGNvcnJlY3RseS4KKworCSogTWFrZWZpbGUuaW4gKGJmZC1pbjIuaCk6IE1ha2UgYmZkLmgsIG5vdCBwcm90b3MsIGluIGRvY2Rpci4KKwkobGliYmZkLmgsIGxpYmNvZmYuaCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgorCisJKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IERvbid0IHJlY29yZCBhIHN5bWJvbCB3aXRoCisJYSBQTFQzMiByZWxvYyBhcyBkeW5hbWljLgorCShlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCB3aXRoIGEgUExUMzIgcmVsb2MKKwlpcyBub3QgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYQorCXNoYXJlZCBvYmplY3QsIHRoZW4gZG9uJ3QgbWFrZSBhIFBMVCBlbnRyeS4gIElmIHdlIGRvIG1ha2UgYSBQTFQKKwllbnRyeSwgbWFrZSBzdXJlIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVjb3JkZWQgYXMgZHluYW1pYy4KKworV2VkIEphbiAzMSAxNzoyMzozMiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIEJGRF9SRUxPQ18zMl9QQ1JFTC4KKwkqIGNvbmZpZy5iZmQgKGlbMzQ1XTg2LSotd2luMzIpOiBCZWNvbWVzIGlbMzQ1XTg2LSotY3lnd2luMzIuCisJKHBvd2VycGNsZS0qLWN5Z3dpbjMyKTogTmV3LgorCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IEdldCBhZGRyZXNzIGZyb20gdm1hLgorCitXZWQgSmFuIDMxIDE2OjIzOjU3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBJZiB0aGUgc3ltYm9sCisJYXR0YWNoZWQgdG8gdGhlIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGFuIHVuZGVmaW5lZAorCXN5bWJvbCwgdHJlYXQgaXQgYXMgaWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQuCisKK1dlZCBKYW4gMzEgMTY6MTY6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IG91dHB1dCBpbml0aWFsIGR1bW15CisJc3ltYm9sIG9yIHNlY3Rpb24gc3ltYm9scyBpZiBzdHJpcHBpbmcgYWxsIHN5bWJvbHMgYW5kIHRoaXMgaXMgbm90CisJYSByZWxvY2F0ZWFibGUgbGluay4gIERvbid0IG91dHB1dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZSBpZgorCXRoZXJlIGFyZSBubyBzeW1ib2xzLgorCShlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyk6IERvbid0IGRvIGFueXRoaW5nIGlmIHRoZXJlIGFyZSBubworCXN5bWJvbHMgdG8gZmx1c2guCisKK1dlZCBKYW4gMzEgMTI6NTU6NDkgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGNvZmYtYXV4LmM6IE5ldyBmaWxlLgorCSogaG9zdHMvbTY4a2F1eC5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy5iZmQgKG02OCotYXBwbGUtYXV4Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKG02OCotYXBwbGUtYXV4Kik6IE5ldyBuYXRpdmUgaG9zdC4KKwkobTY4a2F1eF9jb2ZmX3ZlYyk6IE5ldyB2ZWN0b3IuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiB0YXJnZXRzLmMgKG02OGthdXhfY29mZl92ZWMpOiBEZWNsYXJlLgorCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkCisJX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wuCisJKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBEZWZpbmUuCisJKGNvbXBhcmVfYXJlbGVudF9wdHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIGlmIFRBUkdfQVVYLgorCShjb2ZmX3dyaXRlX3JlbG9jcyk6IElmIFRBUkdfQVVYLCBzb3J0IHRoZSByZWxvY3MuCisJKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IEEvVVggYW91dGhkciBtYWdpYyBudW1iZXIuCisJKGNvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENhbGwKKwliZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIHJhdGhlciB0aGFuCisJX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCisJKiBjb2ZmLW02OGsuYyAoQ09GRl9QQUdFX1NJWkUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgorCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLWF1eC5vLgorCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1hdXguYy4KKworV2VkIEphbiAzMSAxMTozNzo0NiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogRml4IFJfNjhLX0dPVCoKKwlyZWxvY2F0aW9uOyBpZ25vcmUgYWRkZW5kIHdpdGggUl82OEtfe0dPVCxQTFR9Kk8gcmVsb2NhdGlvbi4KKworVHVlIEphbiAzMCAxMjowOTowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogUmVtb3ZlICQoc3JjZGlyKS9iZmQtaW4yLmgsCisJJChzcmNkaXIpL2xpYmJmZC5oIGFuZCAkKHNyY2RpcikvbGliY29mZi5oLgorCShtYWludGFpbmVyLWNsZWFuKTogV2FybiBhYm91dCBkZWxldGluZyBzcGVjaWFsIGZpbGVzLgorCShiZmQtaW4yLmgsIGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBOZXcgdGFyZ2V0cy4KKworCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgaW5kaXJlY3QgYW5kCisJd2FybmluZyBzeW1ib2xzIGNvcnJlY3RseS4KKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KKworCSogc3ltcy5jIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYXN0cyB0byBhdm9pZAorCXdhcm5pbmdzLgorCitNb24gSmFuIDI5IDE0OjI3OjI0IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLWluLmg6IGFsaWduZWQgbmV3bHkgZXhwb3J0ZWQgbmFtZXMgd2l0aCBiZmQgbmFtaW5nCisJY29udmVudGlvbnMuIFJlbW92ZWQgYW4gZXJyb25lb3VzIGRlZmluZSBvZiBQT1dFUlBDX0xFX1BFLgorIAkqIGxpYmNvZmYuaDogUmVidWlsZC4KKwkqIGNvZmZsaW5rLmMsIGNvZmYtcHBjLmM6IHRoZSBhYm92ZSBmdW5jdGlvbiBuYW1lIGNoYW5nZXMKKworTW9uIEphbiAyOSAxMzowNjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEJhc2ltIEthZGhpbSA8a2FkaGltQHNwb2NrLmNzLmNvbG9yYWRvLmVkdT46CisJKiBlY29mZi5jIChzdHJ1Y3QgZXh0c3ltX2luZm8pOiBEZWZpbmUuCisJKF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBQYXNzIGEgcG9pbnRlciB0byBzdHJ1Y3QgZXh0c3ltX2luZm8KKwl0byBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLgorCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogQWNjZXB0IGEgc3RydWN0IGV4dHN5bV9pbmZvIHBvaW50ZXIuCisJU3RyaXAgc3ltYm9scyB3aGVuIGFwcHJvcHJpYXRlLgorCisJQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46CisJKiBzeW1zLmMgKEJTRl9PQkpFQ1QpOiBEZWZpbmUuCisJKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBQcmludCAnTycgZm9yIEJTRl9PQkpFQ1QuCisJKiBiZmQtaW4yLmg6IFJlYnVpbGQuCisJKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX09CSkVDVCBmb3IgYW4KKwlTVFRfT0JKRUNUIHN5bWJvbC4KKwkqIGVsZi5jIChzd2FwX291dF9zeW1zKTogT25seSBzZXQgdHlwZSB0byBTVFRfT0JKRUNUIGlmIEJTRl9PQkpFQ1QKKwlpcyBzZXQuCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIHdoZW4KKwljb3B5aW5nIHJlbG9jcyBpbnRvIGEgc2hhcmVkIG9iamVjdCwgdHJlYXQgYSBkZWZpbmVkIGdsb2JhbCBzeW1ib2wKKwlhcyBhIGxvY2FsIHN5bWJvbC4KKwkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBzZXQgd2Vha2RlZiB0byBhCisJcmVhbCBkZWZpbmVkIHN5bWJvbCwgbm90IHRvIGEgd2VhayBkZWZpbmVkIHN5bWJvbC4KKworTW9uIEphbiAyOSAxMTozNDozNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29mZmxpbmsuYzogcmVtb3ZlZCB0aGUgUE9XRVJQQ19MRV9QRSBoYWNrLCBwcm9tb3RlZCBzb21lIHR5cGVzCisJYW5kIG1hZGUgYSBmZXcgc3RhdGljIGZ1bmN0aW9ucyBleHRlcm5zLgorCisJKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IG5ldyBmdW5jdGlvbiwgcmVwbGFjZXMgdGhlCisJUE9XRVJQQ19MRV9QRSBoYWNrIGluIGNvZmZsaW5rLgorCisJKiBsaWJjb2ZmLWluLmg6IHByb21vdGVkIHRoZSBmb2xsb3dpbmcgZnJvbSBjb2ZmbGluay5jIHRvIGFsbG93CisJX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgdG8gYmUgb3ZlcnJpZGRlbiAtICBTVFJJTkdfU0laRV9TSVpFLAorCWNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCwgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSwKKwljb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnksIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSwKKwljb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCwgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlLAorCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAsIGNvZmZfbGlua19zZWN0aW9uX2luZm8sCisJY29mZl9maW5hbF9saW5rX2luZm8sIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jLAorCWNvZmZfd3JpdGVfZ2xvYmFsX3N5bSwgY29mZl9saW5rX2lucHV0X2JmZCwgY29mZl9yZWxvY19saW5rX29yZGVyLgorCisJKiBsaWJjb2ZmLmg6IHJlLWdlbidkCisKK0ZyaSBKYW4gMjYgMTg6MzM6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1zLmM6IEluY2x1ZGUgImJmZGxpbmsuaCIuCisJKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IERlZmluZS4KKwkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBOZXcgZnVuY3Rpb24uCisJKiBsaWJiZmQtaW4uaCAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisJKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmVfaW5mbyBmaWVsZC4KKwkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFRyeSBjYWxsaW5nCisJX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgYmVmb3JlIHNlYXJjaGluZyB0aGUgRUxGCisJc3ltYm9sIHRhYmxlLiAgRmluZCB0aGUgY2xvc2VzdCBTVFRfRlVOQyBzeW1ib2wsIG5vdCB0aGUgbGFzdCBvbmUuCisJKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlKTogQWRkIGxpbmVfaW5mbyBmaWVsZC4KKyAJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBUcnkgY2FsbGluZworCV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIGJlZm9yZSBzZWFyY2hpbmcgdGhlIENPRkYKKwlzeW1ib2wgdGFibGUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisKK0ZyaSBKYW4gMjYgMTY6MTE6MTkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAoUl9QUENfRU1CX1NEQTIxIHJlbG9jYXRpb25zKTogTWFrZSByZWxvY2F0aW9uIHNpemUKKwk0IGJ5dGVzLCBzbyB3ZSBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiB1cGRhdGluZyB0aGUgcmVnaXN0ZXIKKwlmaWVsZCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCisKK1RodSBKYW4gMjUgMTI6MTQ6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJjb2ZmLWluLmggKHN0cnVjdCB4Y29mZl90ZGF0YSk6IFJlbW92ZSB0b2Nfc2VjdGlvbiBhbmQKKwllbnRyeV9zZWN0aW9uIGZpZWxkcy4gIEFkZCBzbnRvYyBhbmQgc25lbnRyeSBmaWVsZHMuCisJKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCisJKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIHNudG9jIGFuZCBzbmVudHJ5LAorCW5vdCB0b2Nfc2VjdGlvbiBhbmQgZW50cnlfc2VjdGlvbiAodGhlIENPRkYgZmlsZSBkb2VzIG5vdCBoYXZlIGFueQorCXNlY3Rpb25zIGF0IHRoaXMgcG9pbnQpLgorCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBvX3NuZW50cnkgYW5kIG9fc250b2MgZnJvbQorCXNuZW50cnkgYW5kIHNudG9jIHJhdGhlciB0aGFuIGVudHJ5X3NlY3Rpb24gYW5kIHRvY19zZWN0aW9uLgorCSogY29mZi1yczYwMDAuYyAoeGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBzbnRvYyBhbmQKKwlzbmVudHJ5LCBub3QgdG9jX3NlY3Rpb24gYW5kIGVudHJ5X3NlY3Rpb24uCisJKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldAorCWVudHJ5X3NlY3Rpb24gZnJvbSBoZW50cnkuCisJKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSWYgYSBkZWZpbmVkIHN5bWJvbCBoYXMgWENPRkZfRU5UUlkgc2V0LAorCXNldCBzbmVudHkuCisJKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2V0IHNudG9jLCBub3QgdG9jX3NlY3Rpb24uCisJKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBHZXQgdG9jX3NlY3Rpb24gZnJvbSBzbnRvYywgcmF0aGVyCisJdGhhbiB1c2luZyB0b2Nfc2VjdGlvbiBkaXJlY3RseS4KKworCSogYXJjaHVyZXMuYzogQWRkIG1pc3NpbmcgYC4nIGluIGVudW0gYmZkX2FyY2hpdGVjdHVyZS4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKworCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1zY28qZWxmKik6IFVzZSBiZmRfZWxmMzJfaTM4Nl92ZWMuICBGcm9tCisJUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KKworVGh1IEphbiAyNSAxMjowODo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCAucmVsYS5zZGF0YXssMn0KKwl0byBzZWN0aW9ucyB3ZSBhbGxvY2F0ZS4gIFVzZSBiZmRfemFsbG9jIHRvIGFsbG9jYXRlIGluaXRpYWxpYWwKKwlzZWN0aW9ucywgbm90IGJmZF9hbGxvYy4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgQkZEX0FTU0VSVHMgZm9yICFzaGFyZWQgZnJvbQorCVNEQXssMn1JMTYgcmVsb2NhdGlvbnMuCisJKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogVXNlIHRoZSB2YWx1ZSBvZiAtRyBubiB0byBkZXRlcm1pbmUKKwl3aGV0aGVyIHRvIHB1dCBzb21ldGhpbmcgaW4gLnNic3Mgb3Igbm90LgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBBZGQgc3VwcG9ydCBmb3IgbW9yZSByZWxvY2F0aW9ucy4gIEFkZAorCWluIHNlYy0+b3V0cHV0X29mZnNldCB3aGVyZSBhcHByb3ByaWF0ZS4gIE1ha2UgZXJyb3IgbWVzc2FnZXMKKwlpbmNsdWRlIHRoZSBzeW1ib2wgbmFtZS4KKworCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBMb29rdXAgc3ltYm9sIGJlZm9yZQorCXRyeWluZyB0byBhZGQgaXQgdG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCisJZG9lc24ndCBnZXQgcmVkZWZpbmVkIG1lc3NhZ2VzIGlmIC1zaGFyZWQuCisKKwkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKSBPbmx5IGJ1bXAgUkVMQQorCXNlY3Rpb24gaWYgdGhlIHJlbF9zZWN0aW9uIGZpZWxkIGhhcyBiZWVuIHNldCB1cC4KKworV2VkIEphbiAyNCAyMDo0MDoyNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBpbiBlYWJpCisJcmVsb2NhdGlvbnMuCisKK1dlZCBKYW4gMjQgMTA6Mzg6MzQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWxldGUgY2hlY2tpbmcKKwlvZiBmbGFncywgb25seSBmbGFncyB1c2VkIGFyZSBjb250cm9sbGVkIGJ5IG1hY2ggbnVtYmVyLiAgQnVtcCB1cAorCW91dHB1dCBmaWxlIG1hY2ggbnVtYmVyIHRvIGhpZ2hlc3Qgb2YgaW5wdXQgZmlsZSBtYWNoIG51bWJlcnMuCisJKGVsZjMyX3NwYXJjX29iamVjdF9wKTogV2F0Y2ggZm9yIEVGX1NQQVJDX1NVTl9VUzEuCisJKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgRUZfU1BBUkNfU1VOX1VTMSBpZiB2OHBsdXNhLgorCisJKiBjb25maWcuYmZkIChzcGFyYzY0LSote3N5c3Y0Kixzb2xhcmlzMip9KTogQ29tbWVudCBvdXQKKwliZmRfZWxmNjRfc3BhcmNfdmVjIHN1cHBvcnQuCisKK1R1ZSBKYW4gMjMgMTQ6MzM6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCBjb21wbGFpbiBpZgorCXRoZSBlbWJlZGRlZCBiaXQgaXMgc2V0IG9uIHNvbWUgb2JqZWN0cyBhbmQgbm90IG9uIG90aGVycy4gIEp1c3QKKwlvciBpdCB0b2dldGhlci4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSW1wbGVtZW50IFJfUFBDX0VNQl97U0RBMjEsUkVMU0RBfQorCXJlbG9jYXRpb25zLgorCitUdWUgSmFuIDIzIDE0OjIyOjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgdHJ5IHRvIGFsaWduIHRoZQorCS5zdGFic3RyIHNlY3Rpb24uCisKKwkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBGaXggdGhlIGhhbmRsaW5nIG9mIHRoZQorCS5saWIgc2VjdGlvbiB0byB3b3JrIGV2ZW4gaWYgdGhlIGVudGlyZSBzZWN0aW9uIGNvbnRlbnRzIGFyZQorCXdyaXR0ZW4gYXQgb25jZS4gIEZyb20gR3ZyYW4gVWRkZWJvcmcgPGd2cmFuQHVkZGVib3JnLnBwLnNlPiBhbmQKKwlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgorCitNb24gSmFuIDIyIDE4OjQ1OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmbGluay5oIChlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEb24ndCBhbGxvY2F0ZQorCW1lbW9yeSBoZXJlIGZvciBjb250ZW50cy4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEJ1bXAgdXAgX1NEQV9CQVNFXyBhbmQKKwlfU0RBMl9CQVNFXyBieSAzMjc2OC4KKwkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiAjaWYgb3V0IFBMVCBjb2RlIHdoaWNoIHdlIGhhdmVuJ3QKKwlzdGFydGVkIHVzaW5nLiAgQWxsb2NhdGUgY29udGVudHMgZm9yIC5zZGF0YSBhbmQgLnNkYXRhMiBzZWN0aW9ucworCWFsc28uCisJKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogVXNlIGJmZF9nZXRfc2VjdGlvbl9uYW1lIGluIGRlYnVnIG1lc3NhZ2UsCisJcmF0aGVyIHRoYW4gX25hbWUuCisJKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogUmVtb3ZlIGNvZGUgdGhhdCBhdHRlbXB0ZWQgdG8KKwlzaXplIF9TREF7LDJ9X0JBU0VfLgorCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgaG93IHNkYXRheywyfSByZWxvY2F0aW9ucyBhcmUKKwlkb25lLgorCitNb24gSmFuIDIyIDA4OjUyOjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBlbGZsaW5rLmggKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEZpeCB0eXBvLgorCisJKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY192OSk6IFJlbmFtZWQgZnJvbSBiZmRfbWFjaF9zcGFyYzY0LgorCShiZmRfbWFjaF9zcGFyY197djhwbHVzLHY4cGx1c2F9KTogRGVmaW5lLgorCShiZmRfbWFjaF9zcGFyY192OWEpOiBEZWZpbmUuCisJKGJmZF9tYWNoX3NwYXJjX3Y5X3ApOiBEZWZpbmUuCisJKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgorCSogYW91dHguaCAoYW91dCxtYWNoaW5lX3R5cGUpOiBiZmRfbWFjaF9zcGFyYzY0IHJlbmFtZWQgdG8KKwliZmRfbWFjaF9zcGFyY192OS4KKwkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX29iamVjdF9wKTogTGlrZXdpc2UuCisJKiBjb25maWcuYmZkIChzcGFyYzY0LSotc3lzdjQqLHNwYXJjNjQtKi1zb2xhcmlzMiopOiBTZXQgdGFyZ19kZWZ2ZWMKKwl0byBiZmRfZWxmMzJfc3BhcmNfdmVjLgorCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBSZW5hbWVkIGZyb20gc3BhcmNfYXJjaF9pbmZvLgorCUFkZCB2OHBsdXN7LGF9IHN1cHBvcnQuCisJQWRkIHY5YSBzdXBwb3J0LgorCShzcGFyY19jb21wYXRpYmxlKTogTmV3IGZ1bmN0aW9uLgorCSogZWxmMzItc3BhcmMuaDogI2luY2x1ZGUgImVsZi9zcGFyYy5oIi4KKwkoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgZWxmMzJfc3BhcmNfb2JqZWN0X3AsCisJZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbnMuCisJKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCisJZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KKworTW9uIEphbiAyMiAxMToyMTo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQKKwlsaW5rZXJfc2VjdGlvbl9wb2ludGVyIGZpZWxkLgorCShlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKTogRW51bWVyYXRpb24gZm9yIG5ldyB3YXkgb2YKKwljcmVhdGluZyBsaW5rZXIgZHluYW1pYyBzZWN0aW9ucyBhbmQgc3ltYm9scy4KKwkoZWxmX2xpbmtlcl9zZWN0aW9ueyxfcG9pbnRlcnN9KTogTmV3IHN0cnVjdHVyZXMgZm9yIGNyZWF0aW5nCisJZHluYW1pYyBzZWN0aW9ucyBhbmQgc3ltYm9scy4KKwkoZWxmX29ial90ZGF0YSk6IEFkZCBsaW5rZXJfc2VjdGlvbl9wb2ludGVycyBhbmQgbGlua2VyX3NlY3Rpb24KKwlmaWVsZHMuCisJKGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyxlbGZfbGlua2VyX3NlY3Rpb24pOiBOZXcgYWNjZXNzb3IgbWFjcm9zLgorCShfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZGVjbGFyYXRpb25zLgorCShfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEaXR0by4KKwkoYmZkX2VsZnszMiw2NH1fe2NyZWF0ZSxmaW5pc2h9X3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBEaXR0by4KKwkoX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhKTogRGl0dG8uCisKKwkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWxldGUuCisJKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUKKwlzZWN0aW9ucyAuZ290LCAuc2RhdGEsIGFuZCAuc2RhdGEyLgorCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFphcCAucmVsYS57c2RhdGEsc2RhdGEyfSBpZgorCW5lZWRlZC4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBTdXBwb3J0IG1vcmUgb2YgdGhlIGVhYmkgcmVsb2NhdGlvbnMuCisJKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERpdHRvLgorCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbHMpOiBBZGp1c3QgX1NEQXssMn1fQkFTRV8gYnkgMzI3NjgKKwlpZiB0aGUgLnNkYXRheywyfSArIC5zYnNzeywyfSBzZWN0aW9uIHNpemUgaXMgPiAzMmsuCisKKwkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCisJY3JlYXRlIGluaXRpYWxpemVkIHBvaW50ZXJzIGluIGR5bmFtaWMgbGlua2VyIHNlY3Rpb25zLgorCShlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBBY3R1YWxseSBpbnRpYWxpemUgdGhlCisJcG9pbnRlcnMgY3JlYXRlZCBhYm92ZS4KKworCSogZWxmY29kZS5oIChiZmRfZWxmezMyLDY0fV9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldworCW1hY3JvcyB0byBwcm92aWRlIGJvdGggMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucyBvZgorCWVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbi4KKwkoYmZkX2VsZnszMiw2NH1fZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcgbWFjcm9zIHRvCisJcHJvdmlkZSBib3RoIDMyIGFuZCA2NCBiaXQgdmVyc2lvbnMgb2YKKwllbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24uCisKKwkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCisJY3JlYXRlIGEgbGlua2VyIHNlY3Rpb24uCisJKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEZpbmQgYSB1bmlxdWUgcG9pbnRlciB0byBhCisJZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgbGlua2VyIHBvaW50ZXIgb2Zmc2V0cyBjcmVhdGVkIGZvciBhIGdpdmVuCisJc3ltYm9sLgorCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBNYWtlIGEgUkVMQSBzZWN0aW9uCisJY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLgorCitTYXQgSmFuIDIwIDA4OjM2OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXNwYXJjLmMgKEVMRl9NQUNISU5FX0FMVDEpOiBEZWZpbmUuCisKK1RodSBKYW4gMTggMTg6MjU6MzQgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBjaGFuZ2VkIFRPQ0RFRk4gcmVsb2NzLgorCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHNwZWNpYWwgdmFsdWVzIGZvciBnY2MgYnVpbHQgZGxscy4KKwkoZHVtcF90b2MpOiBmaXggZGlhZ25vc2luZyBjb2RlIHRvIGlkZW50aWZ5IG91dC1vZi10b2MtYm91bmRzIGVudHJpZXMuCisJQWxzbyBiZWdpbiB0aGUgdG9jIGF0IDQgYXMgYW4gZXllIGNhdGNoZXIgKCczMTMxMzEzMScgbWFya3MgdGhlIGZpcnN0CisJdG9jIGVudHJ5IGluIGFuIG9iamR1bXApIGZvciBub3cuCisJKHBwY19kb19sYXN0LCBwcGNfZ2V0X2xhc3QpOiBOZXcgZnVuY3Rpb24gLSBuZWVkZWQgdG8gc2F2ZSBwcm9jZXNzaW5nCisJdGhlIHRvYyBvd25lciB0byB0aGUgZW5kLgorCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogUmVtb3ZlZCBhbiBpbmNvcnJlY3QgaGFjayBmb3IgZG9pbmcgdGhlCisJdG9jIG93bmVyIGxhc3QuCisKKwkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWRkZWQgYSBuZXcgaGFjayB0byBrZWVwIHRoZQorCXRvYyBvd25lciBmcm9tIGJlaW5nIGRvbmUgdGlsbCBsYXN0LiBNdXN0IGRlZmluZSBQT1dFUlBDX0xFX1BDCisJdG8gZW5hYmxlIGl0LgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IGFsaWdubWVudCBzZXR0aW5nIGZvciAuc3RhYgorCisJKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogc2V0IHNlY3Rpb24gZmxhZ3MgZm9yIHN0YWIvc3RyCisJdG8gSU5GTy4KKwkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogUmVtb3ZlZCBhIG5vbi13b3JraW5nIGhhY2sgZm9yIGNvbXB1dGluZyB0aGUKKwlTaXplT2ZJbWFnZSBmb3IgUG93ZXJQQy4gSWdub3JlIHRoZSBzaXplIG9mIHRoZSAuanVuayBzZWN0aW9uLgorCitUaHUgSmFuIDE4IDE3OjQyOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmY29yZS5oOiBJbmNsdWRlIDxzaWduYWwuaD4gYmVmb3JlIDxzeXMvcHJvY2ZzLmg+LgorCitXZWQgSmFuIDE3IDEyOjQwOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY3B1LXBvd2VycGMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBsYXN0IGVudHJ5IHRvIG5vdCBwb2ludAorCWJhY2sgdG8gZmlyc3QuCisJKGJmZF9wb3dlcnBjX2FyY2gpOiBQb2ludCBhdCBmaXJzdCBlbnRyeSBpbiBhcmNoX2luZm9fc3RydWN0LgorCitUdWUgSmFuIDE2IDE1OjEwOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBEb24ndCBpbmNyZW1lbnQgZmlsZQorCW9mZnNldCBmb3IgYSBzZWdtZW50IHdoaWNoIGNvbnRhaW5zIG5vIGxvYWRhYmxlIHNlY3Rpb25zLgorCitNb24gSmFuIDE1IDE3OjQ2OjI3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcmVsb2MuYzogQWRkIG5ldyBQb3dlclBDIHJlbG9jYXRpb25zLgorCSoge2JmZC1pbjIsbGliYmZkfS5oOiBSZWdlbmVyYXRlLgorCisJKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBBZGQgbW9yZSBQUEMgcmVsb2NhdGlvbnMuCisJKHBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBMb29rdXAgbmV3IHJlbG9jYXRpb25zLgorCitNb24gSmFuIDE1IDE0OjI5OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogRml4IFJFTE9DX0JBU0UxMCBhbmQgUkVMT0NfQkFTRTIyCisJZW50cmllcy4KKworCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9leHRfcmVsb2NzKTogRG9uJ3QgZmFpbCBhc3NlcnQgaWYKKyAgICAgICAgaW5mby0+c2hhcmVkLgorCisJKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCB0cnkgdG8gY2FjaGUKKwlpbmZvcm1hdGlvbiBpbiBzZWN0aW9ucyB0aGF0IGFyZSBub3Qgb3duZWQgYnkgYSBCRkQuICBGcm9tIFJpY2hhcmQKKwlIZW5kZXJzb24gPHJpY2hhcmRAYXRoZWlzdC50YW11LmVkdT4uCisKKwkqIGVsZjMyLW1pcHMuYzogTnVtZXJvdXMgY2hhbmdlcyB0byBkeW5hbWljIGxpbmtpbmcgY29kZSwgbW9zdGx5CisJZnJvbSBLYXp1bW90byBLb2ppbWEgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPi4KKwkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFJlbW92ZSBzcGVjaWFsIGNoZWNrIGZvcgorCV9ybGRfbmV3X2ludGVyZmFjZS4KKworCSogZWNvZmZzd2FwLmg6IEFkZCBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLgorCitTdW4gSmFuIDE0IDIxOjM2OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfe3Vuc3VwcG9ydGVkLHN0ZH1fcmVsb2MpOiBSZW1vdmUgZnVuY3Rpb25zLgorCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFJlbW92ZSBwcGNfZWxmX3t1bnN1cHBvcnRlZCxzdGR9X3JlbG9jCisJcmVmZXJlbmNlcy4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIE5vIGxvbmdlciBhbGxvdyAuc2RhdGEvLnNic3Mgc2VjdGlvbnMKKwl0byBzYXRpc2Z5IGEgVE9DMTYgcmVsb2NhdGlvbi4gCVJld3JpdGUgdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbgorCXN1cHBvcnQuICBCZWdpbiBzdXBwb3J0IGZvciBSX1BQQ19TREF7Mix9UkVMLgorCitTYXQgSmFuIDEzIDA5OjM2OjUyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24gdG8KKwljcmVhdGUgdGhlIC5nb3QgYW5kIC5nb3QubmVnIHNlY3Rpb25zLgorCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgaXQuCisJKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogQ2FsbCBpdC4KKwkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTdXBwb3J0IC5nb3QubmVnLCBqdXN0IGxpa2UgLmdvdC4KKwkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBBZGQgZXJyb3IgbWVzc2FnZXMgZm9yIHJlbG9jYXRpb25zIHdlCisJZG9uJ3QgeWV0IHN1cHBvcnQuICBEbyBub3QgaW5jbHVkZSBSX1BQQ19TREFSRUwxNiBsaWtlIGEgR09UCisJcmVsb2NhdGlvbi4KKworRnJpIEphbiAxMiAxNToyNzo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEZWZpbmUsIGFuZCBoYW5kbGUgdGhlIG5ldworCXNlY3Rpb24gZmxhZ3MgZm9yIFYuNCBhbmQgZWFiaS4KKworRnJpIEphbiAxMiAxMzo1OToxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogSWYgYSBzZWdtZW50CisJY29udGFpbnMgbm8gc2VjdGlvbnMsIGRvbid0IG1hcmsgaXQgYXMgcmVhZGFibGUuCisKKwkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRGVjbGFyZS4KKwkqIGVsZmNvZGUuaCAoX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KKworCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEdW1wIGNvbnRlbnRzIG9mCisJZHluYW1pYyBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuCisJKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQWRkIHN3YXBfZHluX2luIGZpZWxkLgorCShiZmRfZWxmMzJfc3dhcF9keW5faW4pOiBDaGFuZ2UgdHlwZSBvZiBzZWNvbmQgcGFyYW1ldGVyIHRvIFBUUi4KKwkoYmZkX2VsZjY0X3N3YXBfZHluX2luKTogTGlrZXdpc2UuCisJKiBlbGZjb2RlLmggKGVsZl9zd2FwX2R5bl9pbik6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBwYXJhbWV0ZXIgdG8KKwlQVFIuCisJKE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSk6IEluaXRpYWxpemUgc3dhcF9keW5faW4gZmllbGQuCisKKwkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgY3JlYXRlIGEKKwlEVF9URVhUUkVMIGVudHJ5IGJlY2F1c2Ugb2YgLnJlbC5wbHQuICBGcm9tIE1hcnRpbiBQaXJrZXIKKwk8cGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQ+LgorCitUaHUgSmFuIDExIDE3OjA2OjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2VjdGlvbi5jIChTRUNfe0VYQ0xVREUsU09SVF9FTlRSSUVTfSk6IE5ldyBzZWN0aW9uIGZsYWdzIGZvcgorCVBvd2VyUEMgVi40IGFuZCBlYWJpLgorIAkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KKwkqIGxpYmZkLmg6IFJlZ2VuZXJhdGUuCisKKwkqIGVsZnh4LXRhcmdldC5oIChUQVJHRVRfe0JJRyxMSVRUTEV9X1NZTSk6IEFkZCBuZXcgZmxhZ3MuCisKKwkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogU3VwcG9ydCBTSFRfT1JERVJFRAorCXNlY3Rpb24gdHlwZSBhbmQgU0hGX0VYQ0xVREUgc2VjdGlvbiBmbGFnLCB0dXJuaW5nIHRoZW0gaW50byB0aGUKKwlhcHByb3ByaWF0ZSBiZmQgc2VjdGlvbiBmbGFnLgorCitUaHUgSmFuIDExIDExOjIzOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDcmVhdGUgdGhlIHNwZWNpYWwKKwlzZWN0aW9ucyBpZiB3ZSBzZWUgYSBEWU5BTUlDIG9iamVjdCwgaW4gY2FzZSB0aGF0IGlzIHRoZSBvbmx5CisJWENPRkYgaW5wdXQgb2JqZWN0IHdlIHNlZS4KKworCSogZWxmMzItbWlwcy5jOiBFeHRlbnNpdmUgY2hhbmdlcyBmb3IgYSBzdGFydCBhdCBkeW5hbWljIGxpbmtpbmcKKwlzdXBwb3J0LCBmcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+LgorCisJKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIHR5cGVfY2hhbmdlX29rIGZpZWxkLgorCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZQorCWVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMgZmllbGQuICBBZGQKKwllbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBhbmQKKwllbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAgZmllbGRzLgorCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rKTogRGVmaW5lIGlmIG5vdAorCWRlZmluZWQuCisJKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCisJKGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCk6IExpa2V3aXNlLgorCShlbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgorCShlbGZOTl9iZWQpOiBDaGFuZ2UgdG8gYWNjb3VudCBmb3IgZmllbGQgY2hhbmdlcy4KKwkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQ2FsbCBuZXcKKwltb2RpZnlfc2VnbWVudF9tYXAgYmFja2VuZCBmdW5jdGlvbi4gIERvbid0IGNhbGwgb2xkCisJY3JlYXRlX3Byb2dyYW1faGVhZGVycyBiYWNrZW5kIGZ1bmN0aW9uLgorCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENhbGwgYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgcmF0aGVyCisJdGhhbiBjcmVhdGVfcHJvZ3JhbV9oZWFkZXJzLgorCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJbml0aWFsaXplCisJdHlwZV9jaGFuZ2Vfb2sgZnJvbSBuZXcgYmFja2VuZCBmaWVsZC4KKwkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IHdhcm4gaWYgX3JsZF9uZXdfaW50ZXJmYWNlIGlzCisJZGVmaW5lZC4KKwkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBUcmVhdCBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbCBhcworCWEgcmVsb2MgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4KKworCSogZWxmLWJmZC5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgdGRhdGEgZmllbGQuCisJKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVuYW1lIHBwY19mbGFnc19pbml0IGZpZWxkIHRvIGZsYWdzX2luaXQuCisJKGVsZl9mbGFnc19pbml0KTogUmVuYW1lIGZyb20gZWxmX3BwY19mbGFnc19pbml0LgorCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBVc2UgZWxmX2ZsYWdzX2luaXQsIG5vdAorCWVsZl9wcGNfZmxhZ3NfaW5pdC4KKwkocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KKwkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCisKKwkqIGVsZjMyLW02OGsuYyAoaG93dG9fdGFibGUpOiBDaGFuZ2Ugc3JjX21hc2sgdG8gMCBmb3IgYWxsCisJcmVsb2NhdGlvbiBlbnRyaWVzLgorCitUdWUgSmFuICA5IDE1OjIyOjUzIDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+CisKKwkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IER1cmluZyBmaW5hbCBsaW5rLCBhbGxvdworIAlvdXRwdXQgLmxpdGEgc2VjdGlvbiB0byBiZSBiaWdnZXIgdGhhbiA2NGsgYnkgYWRqdXN0aW5nIGdwIHZhbHVlCisgCW9uIGEgcGVyLWlucHV0IHNlY3Rpb24gYmFzaXMuCisJKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfdGRhdGEpOiBBZGQgaXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmcKKwlmaWVsZC4KKwkoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpOiBBZGQgZ3AgZmllbGQuCisKK1R1ZSBKYW4gIDkgMTI6MDA6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJSGFuZGxlIEFscGhhIEVDT0ZGIGNoYW5nZXMgaW4gT1NGLzEgMy4yLgorCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBnZXRfZWx0X2F0X2ZpbGVwb3MKKwlmaWVsZC4KKwkqIGNvZmYtYWxwaGEuYzogSW5jbHVkZSAiYW91dC9hci5oIi4KKwkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgcmVxdWlyZSBhbgorCUFMUEhBX1JfSUdOT1JFIHJlbG9jIGFmdGVyIGFuIEFMUEhBX1JfR1BESVNQIHJlbG9jLCBzaW5jZSBPU0YvMQorCTMuMiBkb2Vzbid0IGdlbmVyYXRlIG9uZS4KKwkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgorCShhbHBoYV9lY29mZl9zbHVycF9hcm1hcCk6IERlZmluZS4KKwkoYWxwaGFfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KKwkoYWxwaGFfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCisJKGFscGhhX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSk6IERlZmluZS4KKwkoYWxwaGFfZWNvZmZfd3JpdGVfYXJtYXApOiBEZWZpbmUuCisJKGFscGhhX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IERlZmluZS4KKwkoYWxwaGFfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KKwkoQVJGWk1BRyk6IERlZmluZS4KKwkoYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhbHBoYV9lY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2luZGV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBnZXRfZWx0X2F0X2ZpbGVwb3MgZmllbGQuCisJKGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyk6IENoYW5nZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIGZyb20KKwlfYmZkX2Vjb2ZmIHRvIGFscGhhX2Vjb2ZmLgorCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogVXNlIGdldF9lbHRfYXRfZmlsZXBvcworCWZpZWxkIGZyb20gYmFja2VuZCBzdHJ1Y3R1cmUsIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nCisJX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MuCisJKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplCisJZ2V0X2VsdF9hdF9maWxlcG9zIGZpZWxkLgorCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTmV3IGZ1bmN0aW9uLCBjb3BpZWQKKwlmcm9tIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciB3aXRoIG1pbm9yIGNoYW5nZXMuCisJKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcik6IFVzZSBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnLgorCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBEZWNsYXJlLgorCSogbGliYmZkLmg6IFJlYnVpbGQuCisKKwkqIGJmZC1pbi5oIChCRkRfSU5fTUVNT1JZKTogRGVmaW5lLgorCSogbGliYmZkLWluLmggKHN0cnVjdCBiZmRfaW5fbWVtb3J5KTogRGVmaW5lLgorCSogbGliYmZkLmMgKGJmZF9yZWFkKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KKwkoYmZkX2dldF9maWxlX3dpbmRvdyk6IERvbid0IHRyeSB0byBtYXAgYSBCRkRfSU5fTUVNT1JZIGZpbGUuCisJKGJmZF93cml0ZSwgYmZkX3N0YXQpOiBBYm9ydCBpZiBCRkRfSU5fTUVNT1JZIGlzIHNldC4KKwkoYmZkX3RlbGwsIGJmZF9mbHVzaCwgYmZkX3NlZWspOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgorCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQ2hhbmdlIGlvc3RyZWFtIGZpZWxkIGZyb20gY2hhciAqIHRvIFBUUi4KKwkoYmZkX2dldF9zaXplKTogSGFuZGxlIEJGRF9JTl9NRU1PUlkgZmxhZy4KKwkqIGNhY2hlLmMgKGJmZF9jYWNoZV9jbG9zZSk6IElnbm9yZSBCRkRfSU5fTUVNT1JZIGZpbGVzLgorCShiZmRfb3Blbl9maWxlKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gc2V0dGluZyBpb3N0cmVhbS4KKwkoYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIpOiBBYm9ydCBpZiBCRkRfSU5fTUVNT1JZIGlzIHNldC4KKwkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIHNldHRpbmcKKwlpb3N0cmVhbS4KKwkoYmZkX29wZW5zdHJlYW1yKTogTGlrZXdpc2UuCisJKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IE9ubHkgZnN0YXQgaW9zdHJlYW0gaWYKKwlCRkRfSU5fTUVNT1JZIGlzIG5vdCBzZXQuCisJKiByaXNjaXguYyAocmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCk6IExpa2V3aXNlLgorCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KKworCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkIF9iZmRfZ2V0X2VsdF9hdF9pbmRleCBmaWVsZC4KKwkoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBfZ2V0X2VsdF9hdF9pbmRleC4KKwkoYmZkX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCisJKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KTogUmVuYW1lIGZyb20KKwliZmRfZ2V0X2VsdF9hdF9pbmRleC4gIENoYW5nZSBpbmRleCBwYXJhbWV0ZXIgZnJvbSBpbnQgdG8KKwlzeW1pbmRleC4KKwkqIGxpYmJmZC1pbi5oIChfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleCk6IERlY2xhcmUuCisJKF9iZmRfbm9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCisJKF9iZmRfYXJjaGl2ZV9ic2RfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KKwkoX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KKwkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCisJKiBhb3V0LXRhcmdldC5oIChNWV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCSogY29mZi1yczYwMDAuYyAoeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KKwkqIGllZWUuYyAoaWVlZV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgorCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgorCSogb2FzeXMuYyAob2FzeXNfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KKwkqIHNvbS5jIChzb21fZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KKworCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHJlc3RyaWN0IGxpbmUKKwludW1iZXJzIHRvIHRoZSAudGV4dCBzZWN0aW9uLgorCitNb24gSmFuICA4IDE3OjAwOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX3dyaXRlX2RlYnVnX3BhcnQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KKwlJZiB0aGVyZSBpcyBhIFNFQ19ERUJVR0dJTkcgc2VjdGlvbiwgZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcKKwlpbmZvcm1hdGlvbiBwYXJ0IGZyb20gaXQuCisJKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTdG9yZSB0aGUgY29udGVudHMgb2YgYSBTRUNfREVCVUdHSU5HCisJc2VjdGlvbiBpbiBtZW1vcnkuCisJKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IHJldHVybi4KKworVGh1IEphbiAgNCAxNzoxMjozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1mcmVlYnNkKik6IEFkZCB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKGkzODZmcmVlYnNkX3ZlYyk6IEFkZCB2ZWMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgaTM4NmZyZWVic2Quby4KKwkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGkzODZmcmVlYnNkLmMuCisJUmVidWlsZCBkZXBlbmRlbmNpZXMuLgorCSogZnJlZWJzZC5oOiBOZXcgZmlsZS4KKwkqIGkzODZmcmVlYnNkLmM6IE5ldyBmaWxlLgorCSogdGFyZ2V0cy5jIChpMzg2ZnJlZWJzZF92ZWMpOiBEZWNsYXJlLgorCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpMzg2ZnJlZWJzZF92ZWMuCisJKiBpMzg2bGludXguYyAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGFzIFRBUkdFVF9QQUdFX1NJWkUKKwkqIGkzODZuZXRic2QuYyAoU0VHTUVOVF9TSVpFKTogIERlZmluZSBhcyBUQVJHRVRfUEFHRV9TSVpFCisKK1RodSBKYW4gIDQgMTY6Mjc6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmMgKGllZWVfc2x1cnBfZGVidWcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShpZWVlX29iamVjdF9wKTogQ2FsbCBpdC4KKwkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBTa2lwIGRlYnVnZ2luZyBzZWN0aW9ucy4KKwkoaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KKwkoaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgorCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgorCShpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCk6IExpa2V3aXNlLgorCShpZWVlX3dyaXRlX2RlYnVnX3BhcnQpOiBMaWtld2lzZS4KKwkoaWVlZV93cml0ZV9kYXRhX3BhcnQpOiBMaWtld2lzZS4KKwkoaW5pdF9mb3Jfb3V0cHV0KTogTGlrZXdpc2UuCisKK1dlZCBKYW4gIDMgMTk6NDI6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KKworCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE1ha2UgQEdPVCByZWxvY2F0aW9ucworCXdvcmsuCisJKHBwY19lbGZfaG93dG9fcmF3KTogSnVzdCB1c2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGZvciBhbGwgaG93dG8KKwlyZWxvY3MsIHNpbmNlIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBoYW5kbGVzIHRoZSBsaW5rZXIgY2FzZS4KKwkocHBjX2VsZl97YWRkcjE2X2hhLGdvdDE2LHRvYzE2LGJydGFrZW59X3JlbG9jKTogRGVsZXRlLCBubyBsb25nZXIKKwl1c2VkLgorCShwcGNfZWxmX3thZGRyMTZfaGEsZ290MTYsdG9jMTYsYnJ0YWtlbn1faW5uZXIpOiBNZXJnZSB0aGVzZSBpbnRvCisJcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIHNpbmNlIHRoYXQgaXMgbm93IHRoZSBvbmx5IGNhbGxlci4KKwkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCisKK1dlZCBKYW4gIDMgMTU6MTE6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIHdlIGRvbid0IGtub3cgdGhlCisJc2VjdGlvbiBvZiB0aGUgZW50cnkgcG9pbnQgZm9yIGFuIFhDT0ZGIGV4ZWN1dGFibGUsIGFsd2F5cyBzZXQgdGhlCisJZW50cnkgYWRkcmVzcyB0byAtMS4KKworVHVlIEphbiAgMiAxNDoxNzoxNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGQgc3VwcG9ydCBmb3Igbm90ZSBzZWN0aW9ucy4KKworVHVlIEphbiAgMiAxMzoxMDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZC1pbi5oIChzdHJ1Y3QgX3N5bWJvbF9pbmZvKTogQWRkIHN0YWJfdHlwZSBmaWVsZC4KKwkqIGJmZC1pbjIuaDogUmVidWlsZC4KKwkqIGFvdXR4LmggKE5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pKTogU2V0IHN0YWJfdHlwZS4KKworCSogZWxmMzItcHBjLmM6IFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lIGZyb20gY2FsbHMgdG8KKyAgICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyLgorCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBPbmx5IHdhcm4gYWJvdXQgZW5kaWFubmVzcworCWRpZmZlcmVuY2UgaWYgdGFyZ2V0IGVuZGlhbm5lc3MgaXMga25vd24uCisKK0ZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTQ5NQorDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvYmZkL01ha2VmaWxlLmFtIGIvYmZkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTUzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMDY1IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCisKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKKworSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKK0NTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkkKElOQ0RJUikKK0RFUCA9IG1rZGVwCisKK1NVQkRJUlMgPSBkb2MgcG8KKworZG9jZGlyID0gZG9jCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYmJmZC5sYQorCisjIGJmZC5oIGdvZXMgaGVyZSwgZm9yIG5vdworQkZEX0ggPSBiZmQuaAorCisjIEppbSBLaW5nZG9uIG5vdGVzOgorIyBXcml0aW5nIFMtcmVjb3JkcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYWxsIChvciBhdCBsZWFzdCBtb3N0KQorIyAqLSotY29mZiwgKi0qLWFvdXQsIGV0Yy4sIGNvbmZpZ3VyYXRpb25zLCBiZWNhdXNlIHBlb3BsZSB3aWxsIHdhbnQgdG8KKyMgYmUgYWJsZSB0byB1c2Ugb2JqY29weSB0byBjcmVhdGUgUy1yZWNvcmRzLiAgKFMtcmVjb3JkcyBhcmUgbm90IHVzZWZ1bAorIyBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBpZiB5b3UgYXJlIGRvd25sb2FkaW5nIHRoaW5ncyBhcyBTLXJlY29yZHMgeW91CisjIG5lZWQgdHdvIGNvcGllcyBvZiB0aGUgZXhlY3V0YWJsZSwgb25lIHRvIGRvd25sb2FkIGFuZCBvbmUgZm9yIHRoZQorIyBkZWJ1Z2dlcikuCitCRkRfTElCUyA9IFwKKwlhcmNoaXZlLmxvIGFyY2h1cmVzLmxvIGJmZC5sbyBjYWNoZS5sbyBjb2ZmZ2VuLmxvIGNvcmVmaWxlLmxvIFwKKwlmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIFwKKwlzZWN0aW9uLmxvIHN5bXMubG8gdGFyZ2V0cy5sbyBoYXNoLmxvIGxpbmtlci5sbyBcCisJc3JlYy5sbyBiaW5hcnkubG8gdGVraGV4LmxvIGloZXgubG8gc3RhYnMubG8gc3RhYi1zeW1zLmxvCisKK0JGRF9MSUJTX0NGSUxFUyA9IFwKKwlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKKwlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCisJc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKKwlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKKworIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGtlZXAgaW4gc3luYworIyB3aXRoIHRoZSBkZWNscyBhbmQgaW5pdGlhbGl6ZXIgaW4gYXJjaHVyZXMuYy4KK0FMTF9NQUNISU5FUyA9IFwKKwljcHUtYTI5ay5sbyBcCisJY3B1LWFscGhhLmxvIFwKKwljcHUtYXJjLmxvIFwKKwljcHUtYXJtLmxvIFwKKwljcHUtZDEwdi5sbyBcCisJY3B1LWQzMHYubG8gXAorCWNwdS1mcjMwLmxvIFwKKwljcHUtaDgzMDAubG8gXAorCWNwdS1oODUwMC5sbyBcCisJY3B1LWhwcGEubG8gXAorCWNwdS1pMzg2LmxvIFwKKwljcHUtaTg2MC5sbyBcCisJY3B1LWk5NjAubG8gXAorCWNwdS1tMzJyLmxvIFwKKwljcHUtbTY4ay5sbyBcCisJY3B1LW04OGsubG8gXAorCWNwdS1tMTAyMDAubG8gXAorCWNwdS1tMTAzMDAubG8gXAorCWNwdS1tY29yZS5sbyBcCisJY3B1LW1pcHMubG8gXAorCWNwdS1uczMyay5sbyBcCisJY3B1LXBvd2VycGMubG8gXAorCWNwdS1yczYwMDAubG8gXAorCWNwdS1zaC5sbyBcCisJY3B1LXNwYXJjLmxvIFwKKwljcHUtdGljMzAubG8gXAorCWNwdS10aWM4MC5sbyBcCisJY3B1LXY4NTAubG8gXAorCWNwdS12YXgubG8gXAorCWNwdS13ZTMyay5sbyBcCisJY3B1LXc2NS5sbyBcCisJY3B1LXo4ay5sbworCitBTExfTUFDSElORVNfQ0ZJTEVTID0gXAorCWNwdS1hMjlrLmMgXAorCWNwdS1hbHBoYS5jIFwKKwljcHUtYXJjLmMgXAorCWNwdS1hcm0uYyBcCisJY3B1LWQxMHYuYyBcCisJY3B1LWQzMHYuYyBcCisJY3B1LWZyMzAuYyBcCisJY3B1LWg4MzAwLmMgXAorCWNwdS1oODUwMC5jIFwKKwljcHUtaHBwYS5jIFwKKwljcHUtaTM4Ni5jIFwKKwljcHUtaTg2MC5jIFwKKwljcHUtaTk2MC5jIFwKKwljcHUtbTMyci5jIFwKKwljcHUtbTY4ay5jIFwKKwljcHUtbTg4ay5jIFwKKwljcHUtbTEwMjAwLmMgXAorCWNwdS1tMTAzMDAuYyBcCisJY3B1LW1jb3JlLmMgXAorCWNwdS1taXBzLmMgXAorCWNwdS1uczMyay5jIFwKKwljcHUtcG93ZXJwYy5jIFwKKwljcHUtcnM2MDAwLmMgXAorCWNwdS1zaC5jIFwKKwljcHUtc3BhcmMuYyBcCisJY3B1LXRpYzMwLmMgXAorCWNwdS10aWM4MC5jIFwKKwljcHUtdjg1MC5jIFwKKwljcHUtdmF4LmMgXAorCWNwdS13ZTMyay5jIFwKKwljcHUtdzY1LmMgXAorCWNwdS16OGsuYworCisjIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KKyMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgorQkZEMzJfQkFDS0VORFMgPSBcCisJYW91dC1hZG9iZS5sbyBcCisJYW91dC1hcm0ubG8gXAorCWFvdXQtbnMzMmsubG8gXAorCWFvdXQtc3BhcmNsZS5sbyBcCisJYW91dC10aWMzMC5sbyBcCisJYW91dDAubG8gXAorCWFvdXQzMi5sbyBcCisJYm91dC5sbyBcCisJY2YtaTM4Nmx5bngubG8gXAorCWNmLW02OGtseW54LmxvIFwKKwljZi1zcGFyY2x5bngubG8gXAorCWNvZmYtYTI5ay5sbyBcCisJY29mZi1hcG9sbG8ubG8gXAorCWNvZmYtYXJtLmxvIFwKKwljb2ZmLWF1eC5sbyBcCisJY29mZi1oODMwMC5sbyBcCisJY29mZi1oODUwMC5sbyBcCisJY29mZi1pMzg2LmxvIFwKKwljb2ZmLWdvMzIubG8gXAorCWNvZmYtaTg2MC5sbyBcCisJY29mZi1pOTYwLmxvIFwKKwljb2ZmLW02OGsubG8gXAorCWNvZmYtbTg4ay5sbyBcCisJY29mZi1taXBzLmxvIFwKKwljb2ZmLXBtYWMubG8gXAorCWNvZmYtcnM2MDAwLmxvIFwKKwljb2ZmLXNoLmxvIFwKKwljb2ZmLXNwYXJjLmxvIFwKKwljb2ZmLXN0Z28zMi5sbyBcCisJY29mZi1zdm02OGsubG8gXAorCWNvZmYtdGljMzAubG8gXAorCWNvZmYtdGljODAubG8gXAorCWNvZmYtdTY4ay5sbyBcCisJY29mZi13ZTMyay5sbyBcCisJY29mZi13NjUubG8gXAorCWNvZmYtejhrLmxvIFwKKwljb2ZmbGluay5sbyBcCisJZHdhcmYyLmxvIFwKKwllY29mZi5sbyBcCisJZWNvZmZsaW5rLmxvIFwKKwllbGYubG8gXAorCWVsZjMyLWFyYy5sbyBcCisJZWxmYXJtLW9hYmkubG8gXAorCWVsZmFybS1uYWJpLmxvIFwKKwllbGYzMi1kMTB2LmxvIFwKKwllbGYzMi1kMzB2LmxvIFwKKwllbGYzMi1mcjMwLmxvIFwKKwllbGYzMi1nZW4ubG8gXAorCWVsZjMyLWhwcGEubG8gXAorCWVsZjMyLWkzODYubG8gXAorCWVsZjMyLWk4NjAubG8gXAorCWVsZjMyLW0zMnIubG8gXAorCWVsZjMyLW02OGsubG8gXAorCWVsZjMyLW04OGsubG8gXAorCWVsZi1tMTAyMDAubG8gXAorCWVsZi1tMTAzMDAubG8gXAorCWVsZjMyLW1jb3JlLmxvIFwKKwllbGYzMi1taXBzLmxvIFwKKwllbGYzMi1wcGMubG8gXAorCWVsZjMyLXNoLmxvIFwKKwllbGYzMi1zcGFyYy5sbyBcCisJZWxmMzItdjg1MC5sbyBcCisJZWxmMzIubG8gXAorCWVsZmxpbmsubG8gXAorCWhwMzAwYnNkLmxvIFwKKwlocDMwMGhwdXgubG8gXAorCXNvbS5sbyBcCisJaTM4NmFvdXQubG8gXAorCWkzODZic2QubG8gXAorCWkzODZkeW5peC5sbyBcCisJaTM4NmZyZWVic2QubG8gXAorCWkzODZsaW51eC5sbyBcCisJaTM4Nmx5bngubG8gXAorCWkzODZtc2Rvcy5sbyBcCisJaTM4Nm5ldGJzZC5sbyBcCisJaTM4Nm1hY2gzLmxvIFwKKwlpMzg2b3M5ay5sbyBcCisJaWVlZS5sbyBcCisJbTY4azRrbmV0YnNkLmxvIFwKKwltNjhrbGludXgubG8gXAorCW02OGtseW54LmxvIFwKKwltNjhrbmV0YnNkLmxvIFwKKwltODhrbWFjaDMubG8gXAorCW1pcHNic2QubG8gXAorCW5ld3NvczMubG8gXAorCW5sbS5sbyBcCisJbmxtMzItaTM4Ni5sbyBcCisJbmxtMzItc3BhcmMubG8gXAorCW5sbTMyLXBwYy5sbyBcCisJbmxtMzIubG8gXAorCW5zMzJrbmV0YnNkLmxvIFwKKwlvYXN5cy5sbyBcCisJcGM1MzItbWFjaC5sbyBcCisJcGUtYXJtLmxvIFwKKwlwZWktYXJtLmxvIFwKKwlwZS1pMzg2LmxvIFwKKwlwZWktaTM4Ni5sbyBcCisJcGUtbWNvcmUubG8gXAorCXBlaS1tY29yZS5sbyBcCisJcGUtcHBjLmxvIFwKKwlwZWktcHBjLmxvIFwKKwlwcGNib290LmxvIFwKKwlyZWxvYzE2LmxvIFwKKwlyaXNjaXgubG8gXAorCXNwYXJjbGludXgubG8gXAorCXNwYXJjbHlueC5sbyBcCisJc3BhcmNuZXRic2QubG8gXAorCXN1bm9zLmxvIFwKKwl2YXhuZXRic2QubG8gXAorCXZlcnNhZG9zLmxvIFwKKwl2bXMubG8gXAorCXZtcy1nc2QubG8gXAorCXZtcy1oZHIubG8gXAorCXZtcy1taXNjLmxvIFwKKwl2bXMtdGlyLmxvIFwKKwl4Y29mZmxpbmsubG8KKworQkZEMzJfQkFDS0VORFNfQ0ZJTEVTID0gXAorCWFvdXQtYWRvYmUuYyBcCisJYW91dC1hcm0uYyBcCisJYW91dC1uczMyay5jIFwKKwlhb3V0LXNwYXJjbGUuYyBcCisJYW91dC10aWMzMC5jIFwKKwlhb3V0MC5jIFwKKwlhb3V0MzIuYyBcCisJYm91dC5jIFwKKwljZi1pMzg2bHlueC5jIFwKKwljZi1tNjhrbHlueC5jIFwKKwljZi1zcGFyY2x5bnguYyBcCisJY29mZi1hMjlrLmMgXAorCWNvZmYtYXBvbGxvLmMgXAorCWNvZmYtYXJtLmMgXAorCWNvZmYtYXV4LmMgXAorCWNvZmYtaDgzMDAuYyBcCisJY29mZi1oODUwMC5jIFwKKwljb2ZmLWkzODYuYyBcCisJY29mZi1pODYwLmMgXAorCWNvZmYtZ28zMi5jIFwKKwljb2ZmLWk5NjAuYyBcCisJY29mZi1tNjhrLmMgXAorCWNvZmYtbTg4ay5jIFwKKwljb2ZmLW1pcHMuYyBcCisJY29mZi1wbWFjLmMgXAorCWNvZmYtcnM2MDAwLmMgXAorCWNvZmYtc2guYyBcCisJY29mZi1zcGFyYy5jIFwKKwljb2ZmLXN0Z28zMi5jIFwKKwljb2ZmLXN2bTY4ay5jIFwKKwljb2ZmLXRpYzMwLmMgXAorCWNvZmYtdGljODAuYyBcCisJY29mZi11NjhrLmMgXAorCWNvZmYtd2UzMmsuYyBcCisJY29mZi13NjUuYyBcCisJY29mZi16OGsuYyBcCisJY29mZmxpbmsuYyBcCisJZHdhcmYyLmMgXAorCWVjb2ZmLmMgXAorCWVjb2ZmbGluay5jIFwKKwllbGYuYyBcCisJZWxmMzItYXJjLmMgXAorCWVsZmFybS1vYWJpLmMgXAorCWVsZmFybS1uYWJpLmMgXAorCWVsZjMyLWQxMHYuYyBcCisJZWxmMzItZDMwdi5jIFwKKwllbGYzMi1mcjMwLmMgXAorCWVsZjMyLWdlbi5jIFwKKwllbGYzMi1ocHBhLmMgXAorCWVsZjMyLWkzODYuYyBcCisJZWxmMzItaTg2MC5jIFwKKwllbGYzMi1tMzJyLmMgXAorCWVsZjMyLW02OGsuYyBcCisJZWxmMzItbTg4ay5jIFwKKwllbGYtbTEwMjAwLmMgXAorCWVsZi1tMTAzMDAuYyBcCisJZWxmMzItbWNvcmUuYyBcCisJZWxmMzItbWlwcy5jIFwKKwllbGYzMi1wcGMuYyBcCisJZWxmMzItc2guYyBcCisJZWxmMzItc3BhcmMuYyBcCisJZWxmMzItdjg1MC5jIFwKKwllbGYzMi5jIFwKKwllbGZsaW5rLmMgXAorCWhwMzAwYnNkLmMgXAorCWhwMzAwaHB1eC5jIFwKKwlzb20uYyBcCisJaTM4NmFvdXQuYyBcCisJaTM4NmJzZC5jIFwKKwlpMzg2ZHluaXguYyBcCisJaTM4NmZyZWVic2QuYyBcCisJaTM4NmxpbnV4LmMgXAorCWkzODZseW54LmMgXAorCWkzODZtc2Rvcy5jIFwKKwlpMzg2bmV0YnNkLmMgXAorCWkzODZtYWNoMy5jIFwKKwlpMzg2b3M5ay5jIFwKKwlpZWVlLmMgXAorCW02OGs0a25ldGJzZC5jIFwKKwltNjhrbGludXguYyBcCisJbTY4a2x5bnguYyBcCisJbTY4a25ldGJzZC5jIFwKKwltODhrbWFjaDMuYyBcCisJbWlwc2JzZC5jIFwKKwluZXdzb3MzLmMgXAorCW5sbS5jIFwKKwlubG0zMi1pMzg2LmMgXAorCW5sbTMyLXNwYXJjLmMgXAorCW5sbTMyLXBwYy5jIFwKKwlubG0zMi5jIFwKKwluczMya25ldGJzZC5jIFwKKwlvYXN5cy5jIFwKKwlwYzUzMi1tYWNoLmMgXAorCXBlLWFybS5jIFwKKwlwZWktYXJtLmMgXAorCXBlLWkzODYuYyBcCisJcGVpLWkzODYuYyBcCisJcGUtbWNvcmUuYyBcCisJcGVpLW1jb3JlLmMgXAorCXBlLXBwYy5jIFwKKwlwZWktcHBjLmMgXAorCXBwY2Jvb3QuYyBcCisJcmVsb2MxNi5jIFwKKwlyaXNjaXguYyBcCisJc3BhcmNsaW51eC5jIFwKKwlzcGFyY2x5bnguYyBcCisJc3BhcmNuZXRic2QuYyBcCisJc3Vub3MuYyBcCisJdmF4bmV0YnNkLmMgXAorCXZlcnNhZG9zLmMgXAorCXZtcy5jIFwKKwl2bXMtZ3NkLmMgXAorCXZtcy1oZHIuYyBcCisJdm1zLW1pc2MuYyBcCisJdm1zLXRpci5jIFwKKwl4Y29mZmxpbmsuYworCisjIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSA2NCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KKyMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsCisjIGFuZCAtLWVuYWJsZS02NC1iaXQtYmZkLgorQkZENjRfQkFDS0VORFMgPSBcCisJYW91dDY0LmxvIFwKKwljb2ZmLWFscGhhLmxvIFwKKwlkZW1vNjQubG8gXAorCWVsZjY0LWFscGhhLmxvIFwKKwllbGY2NC1nZW4ubG8gXAorCWVsZjY0LW1pcHMubG8gXAorCWVsZjY0LXNwYXJjLmxvIFwKKwllbGY2NC5sbyBcCisJbmxtMzItYWxwaGEubG8gXAorCW5sbTY0LmxvCisKK0JGRDY0X0JBQ0tFTkRTX0NGSUxFUyA9IFwKKwlhb3V0NjQuYyBcCisJY29mZi1hbHBoYS5jIFwKKwlkZW1vNjQuYyBcCisJZWxmNjQtYWxwaGEuYyBcCisJZWxmNjQtZ2VuLmMgXAorCWVsZjY0LW1pcHMuYyBcCisJZWxmNjQtc3BhcmMuYyBcCisJZWxmNjQuYyBcCisJbmxtMzItYWxwaGEuYyBcCisJbmxtNjQuYworCitPUFRJT05BTF9CQUNLRU5EUyA9IFwKKwlhaXgzODYtY29yZS5sbyBcCisJaHB1eC1jb3JlLmxvIFwKKwlpcml4LWNvcmUubG8gXAorCWx5bngtY29yZS5sbyBcCisJb3NmLWNvcmUubG8gXAorCXNjbzUtY29yZS5sbyBcCisJdHJhZC1jb3JlLmxvIFwKKwljaXNjby1jb3JlLmxvCisKK09QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyA9IFwKKwlhaXgzODYtY29yZS5jIFwKKwlocHV4LWNvcmUuYyBcCisJaXJpeC1jb3JlLmMgXAorCWx5bngtY29yZS5jIFwKKwlvc2YtY29yZS5jIFwKKwlzY281LWNvcmUuYyBcCisJdHJhZC1jb3JlLmMgXAorCWNpc2NvLWNvcmUuYworCisjIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IGNvbmZpZ3VyZS5pbjoKK1dPUkRTSVpFID0gQHdvcmRzaXplQAorQUxMX0JBQ0tFTkRTID0gQGFsbF9iYWNrZW5kc0AKK0JGRF9CQUNLRU5EUyA9IEBiZmRfYmFja2VuZHNACitCRkRfTUFDSElORVMgPSBAYmZkX21hY2hpbmVzQAorVERFRkFVTFRTID0gQHRkZWZhdWx0c0AKKworSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIEBIREVGSU5FU0AgQENPUkVGTEFHQCBAVERFRklORVNAICQoQ1NFQVJDSCkgJChDU1dJVENIRVMpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCisKKyMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCitDRklMRVMgPSBcCisJJChCRkRfTElCU19DRklMRVMpIFwKKwkkKEFMTF9NQUNISU5FU19DRklMRVMpIFwKKwkkKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUykgXAorCSQoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKSBcCisJJChPUFRJT05BTF9CQUNLRU5EU19DRklMRVMpCisKKyMjIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCAuaCBmaWxlcyB3aGljaCBhcmUgaW4gdGhlIHNvdXJjZSB0cmVlLgorU09VUkNFX0hGSUxFUyA9IFwKKwlhb3V0LXRhcmdldC5oIGFvdXRmMS5oIGFvdXR4LmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKKwllY29mZnN3YXAuaCBlbGYzMi1ocHBhLmggXAorCWVsZmNvZGUuaCBnZW5saW5rLmggZ28zMnN0dWIuaCBocHBhX3N0dWJzLmggbGliYW91dC5oIFwKKwlsaWJiZmQuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBlbGYtYmZkLmggbGliaHBwYS5oIGxpYmllZWUuaCBcCisJbGlibmxtLmggbGlib2FzeXMuaCBuZXRic2QuaCBubG0tdGFyZ2V0LmggbmxtY29kZS5oIG5zMzJrLmggXAorCXNvbS5oIHZtcy5oCisKK0hGSUxFUyA9IFwKKwllbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCB0YXJnbWF0Y2guaCBcCisJJChTT1VSQ0VfSEZJTEVTKQorCitQT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKFNPVVJDRV9IRklMRVMpCisKK3BvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCisJZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCisJICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCisKK2Rpc3RzdHVmZjogaW5mbworCisjIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgorIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgorIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KKyMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCitPRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKKworc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQorCXJtIC1mIHRvZmlsZXMKKwlmPSIiOyBcCisJZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAorCSAgY2FzZSAiICQkZiAiIGluIFwKKwkgICAgKiIgJCRpICIqKSA7OyBcCisJICAgICopIGY9IiQkZiAkJGkiIDs7IFwKKwkgIGVzYWMgOyBcCisJZG9uZSA7IFwKKwllY2hvICQkZiA+IHRvZmlsZXMKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKKwl0b3VjaCBzdGFtcC1vZmlsZXMKKworb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQorCitsaWJiZmRfbGFfU09VUkNFUyA9ICQoQkZEX0xJQlNfQ0ZJTEVTKQorbGliYmZkX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKSBvZmlsZXMKK2xpYmJmZF9sYV9MSUJBREQgPSBgY2F0IG9maWxlc2AgQFdJTjMyTElCQUREQAorbGliYmZkX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACisKKyMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYmJmZC5hLiAgV2UgY3JlYXRlIGxpYmJmZC5hIGluIHRoZSBidWlsZAorIyBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZSBwcm9ncmFtcyB0aGF0IHVzZQorIyBsaWJiZmQuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGlmCisjIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgorCitub2luc3RfTElCUkFSSUVTID0gbGliYmZkLmEKK2xpYmJmZF9hX1NPVVJDRVMgPQorCitzdGFtcC1saWI6IGxpYmJmZC5sYQorCWlmIFsgLWYgLmxpYnMvbGliYmZkLmEgXTsgdGhlbiBcCisJICBjcCAubGlicy9saWJiZmQuYSBsaWJiZmQudG1wOyBcCisJICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAorCWVsc2UgdHJ1ZTsgZmkKKwl0b3VjaCBzdGFtcC1saWIKKworbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCisKKyMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCisjIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQorIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCit0YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCisJcm0gLWYgdGFyZ21hdGNoLmgKKwlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKKwltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCisKKyMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0CisjIGluZm8gZnJvbSBjb25maWd1cmUuCisKK3RhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCisKK2FyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCisKK2VsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKKwlybSAtZiBlbGYzMi10YXJnZXQuaAorCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3CisJbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAorCitlbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCisJcm0gLWYgZWxmNjQtdGFyZ2V0LmgKKwlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldworCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKKworQkZEX0hfREVQUz0gJChJTkNESVIpL2Fuc2lkZWNsLmgKK0xPQ0FMX0hfREVQUz0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKKyQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQorJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQorJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQorJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCisKKyMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCitpbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCisJJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKKwkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCisJJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKKworIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KKy5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBiZmQuaAorCXJtIC1mIC5kZXAxCisJJChNQUtFKSBERVA9JChERVApIC5kZXAxCisJc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCisKKyMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCisjIFRoZSBOZXRCU0QgbWtkZXAgb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgZmlsZSBjb250ZW50cywgYW5kIGRvZXNuJ3QgaW5zZXJ0CisjIHRoZSAiRE8gTk9UIERFTEVURSIgbGluZS4KKyMgT3RoZXIgbWtkZXAgdmVyc2lvbnMgcmVxdWlyZSBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cywgYW5kIGRvIGluc2VydCBpdC4KKyMgSGVuY2UgdGhlIHdlaXJkbmVzcy4uLi4KKy5kZXAxOiAkKENGSUxFUykKKwlybSAtZiAuZGVwMiAuZGVwMmEKKwllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCisJZWNobyA+IC5kZXAyYQorCSQoREVQKSAtZiAuZGVwMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/CisJc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IC5kZXAyYSA+PiAuZGVwMgorCXJtIC1mIC5kZXAyYQorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQorCitkZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKKwlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKKwkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKKwkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAorCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJworCitkZXA6IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQorCitkZXAtaW46IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCisKK2RlcC1hbTogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KKworaG9zdC1hb3V0LmxvOiBNYWtlZmlsZQorCisjIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHNpbXBsZSBjb25maWcgZmlsZQorIyB3aGljaCBjYW4gYmUgZm9sZGVkIGludG8gYW4gaC1YWFggZmlsZSBmb3IgYSBuZXcgaG9zdCwgd2l0aCBzb21lIGVkaXRpbmcuCithb3V0LXBhcmFtcy5oOiBnZW4tYW91dAorCS4vZ2VuLWFvdXQgaG9zdCA+IGFvdXQtcGFyYW1zLmgKK2dlbi1hb3V0OiAkKHNyY2RpcikvZ2VuLWFvdXQuYyBNYWtlZmlsZQorCSQoQ0MpIC1vIGdlbi1hb3V0ICQoQ0ZMQUdTKSAkKExGTEFHUykgJChzcmNkaXIpL2dlbi1hb3V0LmMKKworJChCRkRfSCk6IHN0bXAtYmZkLWggOyBAdHJ1ZQorCitzdG1wLWJmZC1oOiBiZmQtaW4zLmgKKwlybSAtZiBiZmQtdG1wLmgKKwljcCBiZmQtaW4zLmggYmZkLXRtcC5oCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC10bXAuaCAkKEJGRF9IKQorCXJtIC1mIGJmZC10bXAuaAorCXRvdWNoIHN0bXAtYmZkLWgKKworQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAorCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYworTElCQkZEX0hfRklMRVMgPSBsaWJiZmQtaW4uaCBpbml0LmMgbGliYmZkLmMgY2FjaGUuYyByZWxvYy5jIGFyY2h1cmVzLmMgZWxmLmMKK0xJQkNPRkZfSF9GSUxFUyA9IGxpYmNvZmYtaW4uaCBjb2ZmY29kZS5oCisKKyMgQ291bGQgcmVhbGx5IHVzZSBhICJjb3B5LWlmLWNoYW5nZSIuLi4KK2hlYWRlcnM6CisJKGNkICQoZG9jZGlyKTsgJChNQUtFKSBwcm90b3MgJChGTEFHU19UT19QQVNTKSkKKwljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldworCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKKwljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3CisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKKwljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCisKKyMgV2Ugb25seSByZWJ1aWxkIHRoZSBoZWFkZXIgZmlsZXMgYXV0b21hdGljYWxseSBpZiB3ZSBoYXZlIGJlZW4KKyMgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLW1haW50YWluZXItbW9kZS4KKworJChzcmNkaXIpL2JmZC1pbjIuaDogQE1BSU5UQCBzdG1wLWJpbjItaCA7IEB0cnVlCitzdG1wLWJpbjItaDogJChCRkRfSF9GSUxFUykKKwkoY2QgJChkb2NkaXIpOyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgYmZkLmgpCisJY3AgJChkb2NkaXIpL2JmZC5oIGJmZC1pbjIuaC1uZXcKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLWluMi5oLW5ldyAkKHNyY2RpcikvYmZkLWluMi5oCisJdG91Y2ggc3RtcC1iaW4yLWgKKworJChzcmNkaXIpL2xpYmJmZC5oOiBATUFJTlRAIHN0bXAtbGJmZC1oIDsgQHRydWUKK3N0bXAtbGJmZC1oOiAkKExJQkJGRF9IX0ZJTEVTKQorCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJiZmQuaCkKKwljcCAkKGRvY2RpcikvbGliYmZkLmggbGliYmZkLmgtbmV3CisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmJmZC5oLW5ldyAkKHNyY2RpcikvbGliYmZkLmgKKwl0b3VjaCBzdG1wLWxiZmQtaAorCiskKHNyY2RpcikvbGliY29mZi5oOiBATUFJTlRAIHN0bXAtbGNvZmYtaCA7IEB0cnVlCitzdG1wLWxjb2ZmLWg6ICQoTElCQ09GRl9IX0ZJTEVTKQorCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBsaWJjb2ZmLmgpCisJY3AgJChkb2NkaXIpL2xpYmNvZmYuaCBsaWJjb2ZmLmgtbmV3CisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYmNvZmYuaC1uZXcgJChzcmNkaXIpL2xpYmNvZmYuaAorCXRvdWNoIHN0bXAtbGNvZmYtaAorCitNT1NUTFlDTEVBTkZJTEVTID0gZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0Lmggb2ZpbGVzIHN0YW1wLW9maWxlcyBcCisJdGFyZ21hdGNoLmgKKworQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCAuZGVwIC5kZXAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCisJc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCisKKyMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworCitlbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorCisjIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KK2VsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCisKKyMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCisjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCithcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYW91dC9yYW5saWIuaAorYXJjaHVyZXMubG86IGFyY2h1cmVzLmMKK2JmZC5sbzogYmZkLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIGxpYmNvZmYuaCBcCisgIGxpYmVjb2ZmLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKK2NhY2hlLmxvOiBjYWNoZS5jCitjb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCitjb3JlZmlsZS5sbzogY29yZWZpbGUuYworZm9ybWF0LmxvOiBmb3JtYXQuYworaW5pdC5sbzogaW5pdC5jCitsaWJiZmQubG86IGxpYmJmZC5jCitvcG5jbHMubG86IG9wbmNscy5jICQoSU5DRElSKS9vYmphbGxvYy5oCityZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvYmZkbGluay5oCitzZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2JmZGxpbmsuaAorc3ltcy5sbzogc3ltcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCit0YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZubWF0Y2guaCB0YXJnbWF0Y2guaAoraGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9vYmphbGxvYy5oCitsaW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oCitzcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCitiaW5hcnkubG86IGJpbmFyeS5jCit0ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAoraWhleC5sbzogaWhleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAorc3RhYnMubG86IHN0YWJzLmMgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgorc3RhYi1zeW1zLmxvOiBzdGFiLXN5bXMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCitjcHUtYTI5ay5sbzogY3B1LWEyOWsuYworY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYworY3B1LWFyYy5sbzogY3B1LWFyYy5jCitjcHUtYXJtLmxvOiBjcHUtYXJtLmMKK2NwdS1kMTB2LmxvOiBjcHUtZDEwdi5jCitjcHUtZDMwdi5sbzogY3B1LWQzMHYuYworY3B1LWZyMzAubG86IGNwdS1mcjMwLmMKK2NwdS1oODMwMC5sbzogY3B1LWg4MzAwLmMKK2NwdS1oODUwMC5sbzogY3B1LWg4NTAwLmMKK2NwdS1ocHBhLmxvOiBjcHUtaHBwYS5jCitjcHUtaTM4Ni5sbzogY3B1LWkzODYuYworY3B1LWk4NjAubG86IGNwdS1pODYwLmMKK2NwdS1pOTYwLmxvOiBjcHUtaTk2MC5jCitjcHUtbTMyci5sbzogY3B1LW0zMnIuYworY3B1LW02OGsubG86IGNwdS1tNjhrLmMKK2NwdS1tODhrLmxvOiBjcHUtbTg4ay5jCitjcHUtbTEwMjAwLmxvOiBjcHUtbTEwMjAwLmMKK2NwdS1tMTAzMDAubG86IGNwdS1tMTAzMDAuYworY3B1LW1jb3JlLmxvOiBjcHUtbWNvcmUuYworY3B1LW1pcHMubG86IGNwdS1taXBzLmMKK2NwdS1uczMyay5sbzogY3B1LW5zMzJrLmMgbnMzMmsuaAorY3B1LXBvd2VycGMubG86IGNwdS1wb3dlcnBjLmMKK2NwdS1yczYwMDAubG86IGNwdS1yczYwMDAuYworY3B1LXNoLmxvOiBjcHUtc2guYworY3B1LXNwYXJjLmxvOiBjcHUtc3BhcmMuYworY3B1LXRpYzMwLmxvOiBjcHUtdGljMzAuYworY3B1LXRpYzgwLmxvOiBjcHUtdGljODAuYworY3B1LXY4NTAubG86IGNwdS12ODUwLmMKK2NwdS12YXgubG86IGNwdS12YXguYworY3B1LXdlMzJrLmxvOiBjcHUtd2UzMmsuYworY3B1LXc2NS5sbzogY3B1LXc2NS5jCitjcHUtejhrLmxvOiBjcHUtejhrLmMKK2FvdXQtYWRvYmUubG86IGFvdXQtYWRvYmUuYyAkKElOQ0RJUikvYW91dC9hZG9iZS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCithb3V0LWFybS5sbzogYW91dC1hcm0uYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXR4LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAorYW91dC1uczMyay5sbzogYW91dC1uczMyay5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgbnMzMmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorYW91dC1zcGFyY2xlLmxvOiBhb3V0LXNwYXJjbGUuYyAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgbGliYW91dC5oIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCisgIGFvdXQtdGFyZ2V0LmgKK2FvdXQtdGljMzAubG86IGFvdXQtdGljMzAuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAorICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXR4LmgKK2FvdXQwLmxvOiBhb3V0MC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKK2FvdXQzMi5sbzogYW91dDMyLmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAorICAkKElOQ0RJUikvYW91dC9hci5oCitib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCitjZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjZi1tNjhrbHlueC5sbzogY2YtbTY4a2x5bnguYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvY29mZi9hMjlrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLWFybS5sbzogY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLWF1eC5sbzogY29mZi1hdXguYyAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2NvZmYvaTg2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1pOTYwLmxvOiBjb2ZmLWk5NjAuYyAkKElOQ0RJUikvY29mZi9pOTYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1tNjhrLmxvOiBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1tODhrLmxvOiBjb2ZmLW04OGsuYyAkKElOQ0RJUikvY29mZi9tODhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1taXBzLmxvOiBjb2ZmLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAorICAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBcCisgIGVjb2Zmc3dhcC5oCitjb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jIGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXJzNjAwMC5sbzogY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9nbzMyZXhlLmggXAorICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAorICBnbzMyc3R1Yi5oCitjb2ZmLXN2bTY4ay5sbzogY29mZi1zdm02OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXRpYzgwLmxvOiBjb2ZmLXRpYzgwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXU2OGsubG86IGNvZmYtdTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi93NjUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi96OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgbGliY29mZi5oCitkd2FyZjIubG86IGR3YXJmMi5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKK2Vjb2ZmLmxvOiBlY29mZi5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCisgICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAorICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgIGxpYmNvZmYuaCBsaWJlY29mZi5oCitlY29mZmxpbmsubG86IGVjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29iamFsbG9jLmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAorICBsaWJjb2ZmLmggbGliZWNvZmYuaAorZWxmLmxvOiBlbGYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAorZWxmMzItYXJjLmxvOiBlbGYzMi1hcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgJChJTkNESVIpL2VsZi9hcm0tb2FiaS5oIFwKKyAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCitlbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi1hcm0uaCBcCisgIGVsZjMyLXRhcmdldC5oCitlbGYzMi1kMTB2LmxvOiBlbGYzMi1kMTB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItZDMwdi5sbzogZWxmMzItZDMwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZjMyLWZyMzAubG86IGVsZjMyLWZyMzAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKK2VsZjMyLWdlbi5sbzogZWxmMzItZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItaHBwYS5sbzogZWxmMzItaHBwYS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgZWxmMzItaHBwYS5oIGxpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGVsZjMyLXRhcmdldC5oCitlbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKKyAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCisgIGVsZjMyLXRhcmdldC5oCitlbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKK2VsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgIGVsZmNvcmUuaCBlbGZsaW5rLmgKK2VsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAoraHAzMDBic2QubG86IGhwMzAwYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKKyAgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCisgIGFvdXQtdGFyZ2V0LmgKK3NvbS5sbzogc29tLmMKK2kzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAoraTM4NmJzZC5sbzogaTM4NmJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAoraTM4NmR5bml4LmxvOiBpMzg2ZHluaXguYyAkKElOQ0RJUikvYW91dC9keW5peDMuaCBhb3V0eC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAorICBhb3V0LXRhcmdldC5oCitpMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitpMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAoraTM4Nmx5bngubG86IGkzODZseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitpMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitpMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitpMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAoraTM4Nm9zOWsubG86IGkzODZvczlrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvb3M5ay5oCitpZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2llZWUuaCBsaWJpZWVlLmgKK202OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCittNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAorbTY4a2x5bngubG86IG02OGtseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCittNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCittODhrbWFjaDMubG86IG04OGttYWNoMy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorbWlwc2JzZC5sbzogbWlwc2JzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAorbmxtLmxvOiBubG0uYyBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAorbmxtMzItaTM4Ni5sbzogbmxtMzItaTM4Ni5jICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCisgIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKK25sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBcCisgIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKK25sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL25sbS9wcGMtZXh0LmggbGlibmxtLmggXAorICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggXAorICBubG1zd2FwLmggbmxtLXRhcmdldC5oCitubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCisgICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKK25zMzJrbmV0YnNkLmxvOiBuczMya25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL29hc3lzLmggbGlib2FzeXMuaAorcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorcGUtYXJtLmxvOiBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlaS1hcm0ubG86IHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlLWkzODYubG86IHBlLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAorcGVpLWkzODYubG86IHBlaS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlLW1jb3JlLmxvOiBwZS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlaS1tY29yZS5sbzogcGVpLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAorcGUtcHBjLmxvOiBwZS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCitwZWktcHBjLmxvOiBwZWktcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAorcHBjYm9vdC5sbzogcHBjYm9vdC5jCityZWxvYzE2LmxvOiByZWxvYzE2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaAorcmlzY2l4LmxvOiByaXNjaXguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCisgICQoSU5DRElSKS9hb3V0L2FyLmgKK3NwYXJjbGludXgubG86IHNwYXJjbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCisgIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKK3NwYXJjbHlueC5sbzogc3BhcmNseW54LmMgJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAorc3BhcmNuZXRic2QubG86IHNwYXJjbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitzdW5vcy5sbzogc3Vub3MuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBhb3V0ZjEuaCBcCisgICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCit2YXhuZXRic2QubG86IHZheG5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAordmVyc2Fkb3MubG86IHZlcnNhZG9zLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCit2bXMubG86IHZtcy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKK3Ztcy1nc2QubG86IHZtcy1nc2QuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCit2bXMtaGRyLmxvOiB2bXMtaGRyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAordm1zLW1pc2MubG86IHZtcy1taXNjLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAordm1zLXRpci5sbzogdm1zLXRpci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKK3hjb2ZmbGluay5sbzogeGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgbGliY29mZi5oCithb3V0NjQubG86IGFvdXQ2NC5jIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKKyAgJChJTkNESVIpL2FvdXQvYXIuaAorY29mZi1hbHBoYS5sbzogY29mZi1hbHBoYS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBsaWJjb2ZmLmggXAorICBsaWJlY29mZi5oIGNvZmZzd2FwLmggZWNvZmZzd2FwLmgKK2RlbW82NC5sbzogZGVtbzY0LmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIFwKKyAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAorICBhb3V0LXRhcmdldC5oCitlbGY2NC1hbHBoYS5sbzogZWxmNjQtYWxwaGEuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggXAorICBsaWJjb2ZmLmggbGliZWNvZmYuaCBlY29mZnN3YXAuaCBlbGY2NC10YXJnZXQuaAorZWxmNjQtZ2VuLmxvOiBlbGY2NC1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGVsZjY0LXRhcmdldC5oCitlbGY2NC1taXBzLmxvOiBlbGY2NC1taXBzLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgZ2VubGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9hbHBoYS5oIGVjb2Zmc3dhcC5oIFwKKyAgZWxmNjQtdGFyZ2V0LmgKK2VsZjY0LXNwYXJjLmxvOiBlbGY2NC1zcGFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBlbGY2NC10YXJnZXQuaAorZWxmNjQubG86IGVsZjY0LmMgZWxmY29kZS5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgZWxmY29yZS5oIGVsZmxpbmsuaAorbmxtMzItYWxwaGEubG86IG5sbTMyLWFscGhhLmMgJChJTkNESVIpL25sbS9hbHBoYS1leHQuaCBcCisgIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKK25sbTY0LmxvOiBubG02NC5jIG5sbWNvZGUuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAorYWl4Mzg2LWNvcmUubG86IGFpeDM4Ni1jb3JlLmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAoraHB1eC1jb3JlLmxvOiBocHV4LWNvcmUuYworaXJpeC1jb3JlLmxvOiBpcml4LWNvcmUuYworbHlueC1jb3JlLmxvOiBseW54LWNvcmUuYworb3NmLWNvcmUubG86IG9zZi1jb3JlLmMKK3NjbzUtY29yZS5sbzogc2NvNS1jb3JlLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKK3RyYWQtY29yZS5sbzogdHJhZC1jb3JlLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBob3N0cy9pMzg2bGludXguaAorY2lzY28tY29yZS5sbzogY2lzY28tY29yZS5jCisjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2JmZC9NYWtlZmlsZS5pbiBiL2JmZC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU4ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTU5OSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbGliZGlyID0gQGxpYmRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK21hbmRpciA9IEBtYW5kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCisKK0RFU1RESVIgPQorCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorCit0b3BfYnVpbGRkaXIgPSAuCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACisKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQVIgPSBAQVJACitBUyA9IEBBU0AKK0JGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKK0JGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACitCRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKK0JGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAorQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorQ0MgPSBAQ0NACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ09SRUZJTEUgPSBAQ09SRUZJTEVACitDT1JFRkxBRyA9IEBDT1JFRkxBR0AKK0RBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAorRExMVE9PTCA9IEBETExUT09MQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKK0dNT0ZJTEVTID0gQEdNT0ZJTEVTQAorR01TR0ZNVCA9IEBHTVNHRk1UQAorR1RfTk8gPSBAR1RfTk9ACitHVF9ZRVMgPSBAR1RfWUVTQAorSERFRklORVMgPSBASERFRklORVNACitJTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACitJTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACitJTlRMREVQUyA9IEBJTlRMREVQU0AKK0lOVExMSUJTID0gQElOVExMSUJTQAorSU5UTE9CSlMgPSBASU5UTE9CSlNACitMRCA9IEBMREAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xOX1MgPSBATE5fU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitNU0dGTVQgPSBATVNHRk1UQAorTk0gPSBATk1ACitQQUNLQUdFID0gQFBBQ0tBR0VACitQT0ZJTEVTID0gQFBPRklMRVNACitQT1NVQiA9IEBQT1NVQkAKK1JBTkxJQiA9IEBSQU5MSUJACitUREVGSU5FUyA9IEBUREVGSU5FU0AKK1VTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAorVVNFX05MUyA9IEBVU0VfTkxTQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKK1dJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAorYWxsX2JhY2tlbmRzID0gQGFsbF9iYWNrZW5kc0AKK2JmZF9iYWNrZW5kcyA9IEBiZmRfYmFja2VuZHNACitiZmRfbWFjaGluZXMgPSBAYmZkX21hY2hpbmVzQAorbCA9IEBsQAordGRlZmF1bHRzID0gQHRkZWZhdWx0c0AKK3dvcmRzaXplID0gQHdvcmRzaXplQAorCitBVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCisKK0lOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCitDU0VBUkNIID0gLUkuIC1JJChzcmNkaXIpIC1JJChJTkNESVIpCitERVAgPSBta2RlcAorCitTVUJESVJTID0gZG9jIHBvCisKK2RvY2RpciA9IGRvYworCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKKworIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKK0JGRF9IID0gYmZkLmgKKworIyBKaW0gS2luZ2RvbiBub3RlczoKKyMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKKyMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCisjIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKKyMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQorIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKKyMgZGVidWdnZXIpLgorQkZEX0xJQlMgPSBcCisJYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCisJZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCisJc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAorCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbworCisKK0JGRF9MSUJTX0NGSUxFUyA9IFwKKwlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKKwlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCisJc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKKwlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKKworCisjIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCisjIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgorQUxMX01BQ0hJTkVTID0gXAorCWNwdS1hMjlrLmxvIFwKKwljcHUtYWxwaGEubG8gXAorCWNwdS1hcmMubG8gXAorCWNwdS1hcm0ubG8gXAorCWNwdS1kMTB2LmxvIFwKKwljcHUtZDMwdi5sbyBcCisJY3B1LWZyMzAubG8gXAorCWNwdS1oODMwMC5sbyBcCisJY3B1LWg4NTAwLmxvIFwKKwljcHUtaHBwYS5sbyBcCisJY3B1LWkzODYubG8gXAorCWNwdS1pODYwLmxvIFwKKwljcHUtaTk2MC5sbyBcCisJY3B1LW0zMnIubG8gXAorCWNwdS1tNjhrLmxvIFwKKwljcHUtbTg4ay5sbyBcCisJY3B1LW0xMDIwMC5sbyBcCisJY3B1LW0xMDMwMC5sbyBcCisJY3B1LW1jb3JlLmxvIFwKKwljcHUtbWlwcy5sbyBcCisJY3B1LW5zMzJrLmxvIFwKKwljcHUtcG93ZXJwYy5sbyBcCisJY3B1LXJzNjAwMC5sbyBcCisJY3B1LXNoLmxvIFwKKwljcHUtc3BhcmMubG8gXAorCWNwdS10aWMzMC5sbyBcCisJY3B1LXRpYzgwLmxvIFwKKwljcHUtdjg1MC5sbyBcCisJY3B1LXZheC5sbyBcCisJY3B1LXdlMzJrLmxvIFwKKwljcHUtdzY1LmxvIFwKKwljcHUtejhrLmxvCisKKworQUxMX01BQ0hJTkVTX0NGSUxFUyA9IFwKKwljcHUtYTI5ay5jIFwKKwljcHUtYWxwaGEuYyBcCisJY3B1LWFyYy5jIFwKKwljcHUtYXJtLmMgXAorCWNwdS1kMTB2LmMgXAorCWNwdS1kMzB2LmMgXAorCWNwdS1mcjMwLmMgXAorCWNwdS1oODMwMC5jIFwKKwljcHUtaDg1MDAuYyBcCisJY3B1LWhwcGEuYyBcCisJY3B1LWkzODYuYyBcCisJY3B1LWk4NjAuYyBcCisJY3B1LWk5NjAuYyBcCisJY3B1LW0zMnIuYyBcCisJY3B1LW02OGsuYyBcCisJY3B1LW04OGsuYyBcCisJY3B1LW0xMDIwMC5jIFwKKwljcHUtbTEwMzAwLmMgXAorCWNwdS1tY29yZS5jIFwKKwljcHUtbWlwcy5jIFwKKwljcHUtbnMzMmsuYyBcCisJY3B1LXBvd2VycGMuYyBcCisJY3B1LXJzNjAwMC5jIFwKKwljcHUtc2guYyBcCisJY3B1LXNwYXJjLmMgXAorCWNwdS10aWMzMC5jIFwKKwljcHUtdGljODAuYyBcCisJY3B1LXY4NTAuYyBcCisJY3B1LXZheC5jIFwKKwljcHUtd2UzMmsuYyBcCisJY3B1LXc2NS5jIFwKKwljcHUtejhrLmMKKworCisjIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KKyMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgorQkZEMzJfQkFDS0VORFMgPSBcCisJYW91dC1hZG9iZS5sbyBcCisJYW91dC1hcm0ubG8gXAorCWFvdXQtbnMzMmsubG8gXAorCWFvdXQtc3BhcmNsZS5sbyBcCisJYW91dC10aWMzMC5sbyBcCisJYW91dDAubG8gXAorCWFvdXQzMi5sbyBcCisJYm91dC5sbyBcCisJY2YtaTM4Nmx5bngubG8gXAorCWNmLW02OGtseW54LmxvIFwKKwljZi1zcGFyY2x5bngubG8gXAorCWNvZmYtYTI5ay5sbyBcCisJY29mZi1hcG9sbG8ubG8gXAorCWNvZmYtYXJtLmxvIFwKKwljb2ZmLWF1eC5sbyBcCisJY29mZi1oODMwMC5sbyBcCisJY29mZi1oODUwMC5sbyBcCisJY29mZi1pMzg2LmxvIFwKKwljb2ZmLWdvMzIubG8gXAorCWNvZmYtaTg2MC5sbyBcCisJY29mZi1pOTYwLmxvIFwKKwljb2ZmLW02OGsubG8gXAorCWNvZmYtbTg4ay5sbyBcCisJY29mZi1taXBzLmxvIFwKKwljb2ZmLXBtYWMubG8gXAorCWNvZmYtcnM2MDAwLmxvIFwKKwljb2ZmLXNoLmxvIFwKKwljb2ZmLXNwYXJjLmxvIFwKKwljb2ZmLXN0Z28zMi5sbyBcCisJY29mZi1zdm02OGsubG8gXAorCWNvZmYtdGljMzAubG8gXAorCWNvZmYtdGljODAubG8gXAorCWNvZmYtdTY4ay5sbyBcCisJY29mZi13ZTMyay5sbyBcCisJY29mZi13NjUubG8gXAorCWNvZmYtejhrLmxvIFwKKwljb2ZmbGluay5sbyBcCisJZHdhcmYyLmxvIFwKKwllY29mZi5sbyBcCisJZWNvZmZsaW5rLmxvIFwKKwllbGYubG8gXAorCWVsZjMyLWFyYy5sbyBcCisJZWxmYXJtLW9hYmkubG8gXAorCWVsZmFybS1uYWJpLmxvIFwKKwllbGYzMi1kMTB2LmxvIFwKKwllbGYzMi1kMzB2LmxvIFwKKwllbGYzMi1mcjMwLmxvIFwKKwllbGYzMi1nZW4ubG8gXAorCWVsZjMyLWhwcGEubG8gXAorCWVsZjMyLWkzODYubG8gXAorCWVsZjMyLWk4NjAubG8gXAorCWVsZjMyLW0zMnIubG8gXAorCWVsZjMyLW02OGsubG8gXAorCWVsZjMyLW04OGsubG8gXAorCWVsZi1tMTAyMDAubG8gXAorCWVsZi1tMTAzMDAubG8gXAorCWVsZjMyLW1jb3JlLmxvIFwKKwllbGYzMi1taXBzLmxvIFwKKwllbGYzMi1wcGMubG8gXAorCWVsZjMyLXNoLmxvIFwKKwllbGYzMi1zcGFyYy5sbyBcCisJZWxmMzItdjg1MC5sbyBcCisJZWxmMzIubG8gXAorCWVsZmxpbmsubG8gXAorCWhwMzAwYnNkLmxvIFwKKwlocDMwMGhwdXgubG8gXAorCXNvbS5sbyBcCisJaTM4NmFvdXQubG8gXAorCWkzODZic2QubG8gXAorCWkzODZkeW5peC5sbyBcCisJaTM4NmZyZWVic2QubG8gXAorCWkzODZsaW51eC5sbyBcCisJaTM4Nmx5bngubG8gXAorCWkzODZtc2Rvcy5sbyBcCisJaTM4Nm5ldGJzZC5sbyBcCisJaTM4Nm1hY2gzLmxvIFwKKwlpMzg2b3M5ay5sbyBcCisJaWVlZS5sbyBcCisJbTY4azRrbmV0YnNkLmxvIFwKKwltNjhrbGludXgubG8gXAorCW02OGtseW54LmxvIFwKKwltNjhrbmV0YnNkLmxvIFwKKwltODhrbWFjaDMubG8gXAorCW1pcHNic2QubG8gXAorCW5ld3NvczMubG8gXAorCW5sbS5sbyBcCisJbmxtMzItaTM4Ni5sbyBcCisJbmxtMzItc3BhcmMubG8gXAorCW5sbTMyLXBwYy5sbyBcCisJbmxtMzIubG8gXAorCW5zMzJrbmV0YnNkLmxvIFwKKwlvYXN5cy5sbyBcCisJcGM1MzItbWFjaC5sbyBcCisJcGUtYXJtLmxvIFwKKwlwZWktYXJtLmxvIFwKKwlwZS1pMzg2LmxvIFwKKwlwZWktaTM4Ni5sbyBcCisJcGUtbWNvcmUubG8gXAorCXBlaS1tY29yZS5sbyBcCisJcGUtcHBjLmxvIFwKKwlwZWktcHBjLmxvIFwKKwlwcGNib290LmxvIFwKKwlyZWxvYzE2LmxvIFwKKwlyaXNjaXgubG8gXAorCXNwYXJjbGludXgubG8gXAorCXNwYXJjbHlueC5sbyBcCisJc3BhcmNuZXRic2QubG8gXAorCXN1bm9zLmxvIFwKKwl2YXhuZXRic2QubG8gXAorCXZlcnNhZG9zLmxvIFwKKwl2bXMubG8gXAorCXZtcy1nc2QubG8gXAorCXZtcy1oZHIubG8gXAorCXZtcy1taXNjLmxvIFwKKwl2bXMtdGlyLmxvIFwKKwl4Y29mZmxpbmsubG8KKworCitCRkQzMl9CQUNLRU5EU19DRklMRVMgPSBcCisJYW91dC1hZG9iZS5jIFwKKwlhb3V0LWFybS5jIFwKKwlhb3V0LW5zMzJrLmMgXAorCWFvdXQtc3BhcmNsZS5jIFwKKwlhb3V0LXRpYzMwLmMgXAorCWFvdXQwLmMgXAorCWFvdXQzMi5jIFwKKwlib3V0LmMgXAorCWNmLWkzODZseW54LmMgXAorCWNmLW02OGtseW54LmMgXAorCWNmLXNwYXJjbHlueC5jIFwKKwljb2ZmLWEyOWsuYyBcCisJY29mZi1hcG9sbG8uYyBcCisJY29mZi1hcm0uYyBcCisJY29mZi1hdXguYyBcCisJY29mZi1oODMwMC5jIFwKKwljb2ZmLWg4NTAwLmMgXAorCWNvZmYtaTM4Ni5jIFwKKwljb2ZmLWk4NjAuYyBcCisJY29mZi1nbzMyLmMgXAorCWNvZmYtaTk2MC5jIFwKKwljb2ZmLW02OGsuYyBcCisJY29mZi1tODhrLmMgXAorCWNvZmYtbWlwcy5jIFwKKwljb2ZmLXBtYWMuYyBcCisJY29mZi1yczYwMDAuYyBcCisJY29mZi1zaC5jIFwKKwljb2ZmLXNwYXJjLmMgXAorCWNvZmYtc3RnbzMyLmMgXAorCWNvZmYtc3ZtNjhrLmMgXAorCWNvZmYtdGljMzAuYyBcCisJY29mZi10aWM4MC5jIFwKKwljb2ZmLXU2OGsuYyBcCisJY29mZi13ZTMyay5jIFwKKwljb2ZmLXc2NS5jIFwKKwljb2ZmLXo4ay5jIFwKKwljb2ZmbGluay5jIFwKKwlkd2FyZjIuYyBcCisJZWNvZmYuYyBcCisJZWNvZmZsaW5rLmMgXAorCWVsZi5jIFwKKwllbGYzMi1hcmMuYyBcCisJZWxmYXJtLW9hYmkuYyBcCisJZWxmYXJtLW5hYmkuYyBcCisJZWxmMzItZDEwdi5jIFwKKwllbGYzMi1kMzB2LmMgXAorCWVsZjMyLWZyMzAuYyBcCisJZWxmMzItZ2VuLmMgXAorCWVsZjMyLWhwcGEuYyBcCisJZWxmMzItaTM4Ni5jIFwKKwllbGYzMi1pODYwLmMgXAorCWVsZjMyLW0zMnIuYyBcCisJZWxmMzItbTY4ay5jIFwKKwllbGYzMi1tODhrLmMgXAorCWVsZi1tMTAyMDAuYyBcCisJZWxmLW0xMDMwMC5jIFwKKwllbGYzMi1tY29yZS5jIFwKKwllbGYzMi1taXBzLmMgXAorCWVsZjMyLXBwYy5jIFwKKwllbGYzMi1zaC5jIFwKKwllbGYzMi1zcGFyYy5jIFwKKwllbGYzMi12ODUwLmMgXAorCWVsZjMyLmMgXAorCWVsZmxpbmsuYyBcCisJaHAzMDBic2QuYyBcCisJaHAzMDBocHV4LmMgXAorCXNvbS5jIFwKKwlpMzg2YW91dC5jIFwKKwlpMzg2YnNkLmMgXAorCWkzODZkeW5peC5jIFwKKwlpMzg2ZnJlZWJzZC5jIFwKKwlpMzg2bGludXguYyBcCisJaTM4Nmx5bnguYyBcCisJaTM4Nm1zZG9zLmMgXAorCWkzODZuZXRic2QuYyBcCisJaTM4Nm1hY2gzLmMgXAorCWkzODZvczlrLmMgXAorCWllZWUuYyBcCisJbTY4azRrbmV0YnNkLmMgXAorCW02OGtsaW51eC5jIFwKKwltNjhrbHlueC5jIFwKKwltNjhrbmV0YnNkLmMgXAorCW04OGttYWNoMy5jIFwKKwltaXBzYnNkLmMgXAorCW5ld3NvczMuYyBcCisJbmxtLmMgXAorCW5sbTMyLWkzODYuYyBcCisJbmxtMzItc3BhcmMuYyBcCisJbmxtMzItcHBjLmMgXAorCW5sbTMyLmMgXAorCW5zMzJrbmV0YnNkLmMgXAorCW9hc3lzLmMgXAorCXBjNTMyLW1hY2guYyBcCisJcGUtYXJtLmMgXAorCXBlaS1hcm0uYyBcCisJcGUtaTM4Ni5jIFwKKwlwZWktaTM4Ni5jIFwKKwlwZS1tY29yZS5jIFwKKwlwZWktbWNvcmUuYyBcCisJcGUtcHBjLmMgXAorCXBlaS1wcGMuYyBcCisJcHBjYm9vdC5jIFwKKwlyZWxvYzE2LmMgXAorCXJpc2NpeC5jIFwKKwlzcGFyY2xpbnV4LmMgXAorCXNwYXJjbHlueC5jIFwKKwlzcGFyY25ldGJzZC5jIFwKKwlzdW5vcy5jIFwKKwl2YXhuZXRic2QuYyBcCisJdmVyc2Fkb3MuYyBcCisJdm1zLmMgXAorCXZtcy1nc2QuYyBcCisJdm1zLWhkci5jIFwKKwl2bXMtbWlzYy5jIFwKKwl2bXMtdGlyLmMgXAorCXhjb2ZmbGluay5jCisKKworIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgNjQgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCisjIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbAorIyBhbmQgLS1lbmFibGUtNjQtYml0LWJmZC4KK0JGRDY0X0JBQ0tFTkRTID0gXAorCWFvdXQ2NC5sbyBcCisJY29mZi1hbHBoYS5sbyBcCisJZGVtbzY0LmxvIFwKKwllbGY2NC1hbHBoYS5sbyBcCisJZWxmNjQtZ2VuLmxvIFwKKwllbGY2NC1taXBzLmxvIFwKKwllbGY2NC1zcGFyYy5sbyBcCisJZWxmNjQubG8gXAorCW5sbTMyLWFscGhhLmxvIFwKKwlubG02NC5sbworCisKK0JGRDY0X0JBQ0tFTkRTX0NGSUxFUyA9IFwKKwlhb3V0NjQuYyBcCisJY29mZi1hbHBoYS5jIFwKKwlkZW1vNjQuYyBcCisJZWxmNjQtYWxwaGEuYyBcCisJZWxmNjQtZ2VuLmMgXAorCWVsZjY0LW1pcHMuYyBcCisJZWxmNjQtc3BhcmMuYyBcCisJZWxmNjQuYyBcCisJbmxtMzItYWxwaGEuYyBcCisJbmxtNjQuYworCisKK09QVElPTkFMX0JBQ0tFTkRTID0gXAorCWFpeDM4Ni1jb3JlLmxvIFwKKwlocHV4LWNvcmUubG8gXAorCWlyaXgtY29yZS5sbyBcCisJbHlueC1jb3JlLmxvIFwKKwlvc2YtY29yZS5sbyBcCisJc2NvNS1jb3JlLmxvIFwKKwl0cmFkLWNvcmUubG8gXAorCWNpc2NvLWNvcmUubG8KKworCitPUFRJT05BTF9CQUNLRU5EU19DRklMRVMgPSBcCisJYWl4Mzg2LWNvcmUuYyBcCisJaHB1eC1jb3JlLmMgXAorCWlyaXgtY29yZS5jIFwKKwlseW54LWNvcmUuYyBcCisJb3NmLWNvcmUuYyBcCisJc2NvNS1jb3JlLmMgXAorCXRyYWQtY29yZS5jIFwKKwljaXNjby1jb3JlLmMKKworCisjIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IGNvbmZpZ3VyZS5pbjoKK1dPUkRTSVpFID0gQHdvcmRzaXplQAorQUxMX0JBQ0tFTkRTID0gQGFsbF9iYWNrZW5kc0AKK0JGRF9CQUNLRU5EUyA9IEBiZmRfYmFja2VuZHNACitCRkRfTUFDSElORVMgPSBAYmZkX21hY2hpbmVzQAorVERFRkFVTFRTID0gQHRkZWZhdWx0c0AKKworSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIEBIREVGSU5FU0AgQENPUkVGTEFHQCBAVERFRklORVNAICQoQ1NFQVJDSCkgJChDU1dJVENIRVMpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCisKKyMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCitDRklMRVMgPSBcCisJJChCRkRfTElCU19DRklMRVMpIFwKKwkkKEFMTF9NQUNISU5FU19DRklMRVMpIFwKKwkkKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUykgXAorCSQoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKSBcCisJJChPUFRJT05BTF9CQUNLRU5EU19DRklMRVMpCisKKworU09VUkNFX0hGSUxFUyA9IFwKKwlhb3V0LXRhcmdldC5oIGFvdXRmMS5oIGFvdXR4LmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKKwllY29mZnN3YXAuaCBlbGYzMi1ocHBhLmggXAorCWVsZmNvZGUuaCBnZW5saW5rLmggZ28zMnN0dWIuaCBocHBhX3N0dWJzLmggbGliYW91dC5oIFwKKwlsaWJiZmQuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBlbGYtYmZkLmggbGliaHBwYS5oIGxpYmllZWUuaCBcCisJbGlibmxtLmggbGlib2FzeXMuaCBuZXRic2QuaCBubG0tdGFyZ2V0LmggbmxtY29kZS5oIG5zMzJrLmggXAorCXNvbS5oIHZtcy5oCisKKworSEZJTEVTID0gXAorCWVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIHRhcmdtYXRjaC5oIFwKKwkkKFNPVVJDRV9IRklMRVMpCisKKworUE9URklMRVMgPSAkKENGSUxFUykgJChTT1VSQ0VfSEZJTEVTKQorCisjIFZhcmlvdXMga2luZHMgb2YgLm8gZmlsZXMgdG8gcHV0IGluIGxpYmJmZC5hOgorIyBCRkRfQkFDS0VORFMJUm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgorIyBCRkRfTUFDSElORVMJQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHJvdXRpbmVzIHRoZSBjb25maWd1cmVkIHRhcmdldHMgbmVlZC4KKyMgQ09SRUZJTEUJQ29yZSBmaWxlIHJvdXRpbmVzIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uCitPRklMRVMgPSAkKEJGRF9CQUNLRU5EUykgJChCRkRfTUFDSElORVMpIEBDT1JFRklMRUAKKworbGliYmZkX2xhX1NPVVJDRVMgPSAkKEJGRF9MSUJTX0NGSUxFUykKK2xpYmJmZF9sYV9ERVBFTkRFTkNJRVMgPSAkKE9GSUxFUykgb2ZpbGVzCitsaWJiZmRfbGFfTElCQUREID0gYGNhdCBvZmlsZXNgIEBXSU4zMkxJQkFEREAKK2xpYmJmZF9sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAorCisjIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJiZmQuYS4gIFdlIGNyZWF0ZSBsaWJiZmQuYSBpbiB0aGUgYnVpbGQKKyMgZGlyZWN0b3J5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb252ZXJ0IGFsbCB0aGUgcHJvZ3JhbXMgdGhhdCB1c2UKKyMgbGliYmZkLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBpZgorIyBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KKworbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJmZC5hCitsaWJiZmRfYV9TT1VSQ0VTID0gCisKK0JGRF9IX0RFUFMgPSAkKElOQ0RJUikvYW5zaWRlY2wuaAorTE9DQUxfSF9ERVBTID0gbGliYmZkLmggc3lzZGVwLmggY29uZmlnLmgKKworQkZEX0hfRklMRVMgPSBiZmQtaW4uaCBpbml0LmMgb3BuY2xzLmMgbGliYmZkLmMgc2VjdGlvbi5jIGFyY2h1cmVzLmMgXAorCXJlbG9jLmMgc3ltcy5jIGJmZC5jIGFyY2hpdmUuYyBjb3JlZmlsZS5jIHRhcmdldHMuYyBmb3JtYXQuYworCitMSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYworTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKKworTU9TVExZQ0xFQU5GSUxFUyA9IGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIG9maWxlcyBzdGFtcC1vZmlsZXMgXAorCXRhcmdtYXRjaC5oCisKKworQ0xFQU5GSUxFUyA9IGJmZC5oIGRlcC5zZWQgc3RtcC1iZmQtaCAuZGVwIC5kZXAxIGxpYmJmZC5hIHN0YW1wLWxpYiBcCisJc3RtcC1iaW4yLWggc3RtcC1sYmZkLWggc3RtcC1sY29mZi1oCisKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSBjb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0gIGJmZC1pbjMuaAorTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKKworCitERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KK0NQUEZMQUdTID0gQENQUEZMQUdTQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCUyA9IEBMSUJTQAorbGliYmZkX2FfTElCQUREID0gCitsaWJiZmRfYV9PQkpFQ1RTID0gCitMVExJQlJBUklFUyA9ICAkKGxpYl9MVExJQlJBUklFUykKKworbGliYmZkX2xhX09CSkVDVFMgPSAgYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBcCitjb3JlZmlsZS5sbyBmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIHNlY3Rpb24ubG8gXAorc3ltcy5sbyB0YXJnZXRzLmxvIGhhc2gubG8gbGlua2VyLmxvIHNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBcCitpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbworQ0ZMQUdTID0gQENGTEFHU0AKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACitESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKK01ha2VmaWxlLmluIFRPRE8gYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgYmZkLWluMi5oIGNvbmZpZy5pbiBjb25maWd1cmUgXAorY29uZmlndXJlLmluCisKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKworVEFSID0gdGFyCitHWklQX0VOViA9IC0tYmVzdAorU09VUkNFUyA9ICQobGliYmZkX2FfU09VUkNFUykgJChsaWJiZmRfbGFfU09VUkNFUykKK09CSkVDVFMgPSAkKGxpYmJmZF9hX09CSkVDVFMpICQobGliYmZkX2xhX09CSkVDVFMpCisKK2FsbDogYWxsLXJlZGlyZWN0CisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5TIC5jIC5sbyAubyAucworJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00CisJY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKKyQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQorCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorCitjb25maWcuaDogc3RhbXAtaAorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCQlybSAtZiBzdGFtcC1oOyBcCisJCSQoTUFLRSkgc3RhbXAtaDsgXAorCWVsc2UgOjsgZmkKK3N0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAorCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisJQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKKyQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAorCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCisJZWxzZSA6OyBmaQorJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCisJQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCisKK21vc3RseWNsZWFuLWhkcjoKKworY2xlYW4taGRyOgorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBjb25maWcuaAorCittYWludGFpbmVyLWNsZWFuLWhkcjoKK2JmZC1pbjMuaDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgYmZkLWluMi5oCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kQDpiZmQtaW4yLmggQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCittb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVM6CisKK2NsZWFuLW5vaW5zdExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQorCitkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgorCittYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKKworLmMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKKy5zLm86CisJJChDT01QSUxFKSAtYyAkPAorCisuUy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCisKK2NsZWFuLWNvbXBpbGU6CisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK21haW50YWluZXItY2xlYW4tY29tcGlsZToKKworLmMubG86CisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8CisKKy5zLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAorCisuUy5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisKK21haW50YWluZXItY2xlYW4tbGlidG9vbDoKKworbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVM6CisKK2NsZWFuLWxpYkxUTElCUkFSSUVTOgorCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQorCitkaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVM6CisKK21haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVM6CisKK2luc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCisJICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgICQoTElCVE9PTCkgIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKKwlkb25lCisKK2xpYmJmZC5sYTogJChsaWJiZmRfbGFfT0JKRUNUUykgJChsaWJiZmRfbGFfREVQRU5ERU5DSUVTKQorCSQoTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYmJmZF9sYV9MREZMQUdTKSAkKGxpYmJmZF9sYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9MSUJBREQpICQoTElCUykKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKworQFNFVF9NQUtFQAorCithbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCitpbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKK2NoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKK21haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKKwlkb25lOyBcCisJdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCisJICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCisJICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisgICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorICAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKKwkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCisKK21vc3RseWNsZWFuLXRhZ3M6CisKK2NsZWFuLXRhZ3M6CisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElECisKK21haW50YWluZXItY2xlYW4tdGFnczoKKworZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQordG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCS1ybSAtcmYgJChkaXN0ZGlyKQorCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negorCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS89aW5zdAorCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCisJY2QgJChkaXN0ZGlyKS89YnVpbGQgXAorCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0CisJLXJtIC1yZiAkKGRpc3RkaXIpCisJQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKKwlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAorCWVjaG8gIiQkZGFzaGVzIjsgXAorCWVjaG8gIiQkYmFubmVyIjsgXAorCWVjaG8gIiQkZGFzaGVzIgorZGlzdDogZGlzdGRpcgorCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQorCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKKwktcm0gLXJmICQoZGlzdGRpcikKK2Rpc3QtYWxsOiBkaXN0ZGlyCisJLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQorCS1ybSAtcmYgJChkaXN0ZGlyKQorZGlzdGRpcjogJChESVNURklMRVMpCisJLXJtIC1yZiAkKGRpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKQorCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKKwkgIGZpOyBcCisJZG9uZQorCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitpbmZvLWFtOgoraW5mbzogaW5mby1yZWN1cnNpdmUKK2R2aS1hbToKK2R2aTogZHZpLXJlY3Vyc2l2ZQorY2hlY2stYW06CitjaGVjazogY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsY2hlY2stYW06CitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtaW5mby1hbTogCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKK2FsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZGF0YS1sb2NhbAoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChMVExJQlJBUklFUykgY29uZmlnLmgKK2FsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CisJJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobGliZGlyKQorCisKK21vc3RseWNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Cittb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAorCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKKwkJbW9zdGx5Y2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAorCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAorCQltb3N0bHljbGVhbi1hbQorCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2Rpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCisJCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCisJCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCisJLXJtIC1mIGxpYnRvb2wKKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIGNvbmZpZy5zdGF0dXMKKworbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAorCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAorCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIGNvbmZpZy5zdGF0dXMKKworLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAorbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAorY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKK21vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCittYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCitjbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCitkaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAorbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAoraW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCitpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAordW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAoraW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAorZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAorZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCitpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKK2luc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCBcCit1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKK2luc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KKworCitwby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQorCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAorCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgorCitkaXN0c3R1ZmY6IGluZm8KKworc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQorCXJtIC1mIHRvZmlsZXMKKwlmPSIiOyBcCisJZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAorCSAgY2FzZSAiICQkZiAiIGluIFwKKwkgICAgKiIgJCRpICIqKSA7OyBcCisJICAgICopIGY9IiQkZiAkJGkiIDs7IFwKKwkgIGVzYWMgOyBcCisJZG9uZSA7IFwKKwllY2hvICQkZiA+IHRvZmlsZXMKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKKwl0b3VjaCBzdGFtcC1vZmlsZXMKKworb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQorCitzdGFtcC1saWI6IGxpYmJmZC5sYQorCWlmIFsgLWYgLmxpYnMvbGliYmZkLmEgXTsgdGhlbiBcCisJICBjcCAubGlicy9saWJiZmQuYSBsaWJiZmQudG1wOyBcCisJICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAorCWVsc2UgdHJ1ZTsgZmkKKwl0b3VjaCBzdGFtcC1saWIKKworbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCisKKyMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCisjIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQorIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCit0YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCisJcm0gLWYgdGFyZ21hdGNoLmgKKwlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKKwltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCisKKyMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0CisjIGluZm8gZnJvbSBjb25maWd1cmUuCisKK3RhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCisKK2FyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCisKK2VsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKKwlybSAtZiBlbGYzMi10YXJnZXQuaAorCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3CisJbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAorCitlbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCisJcm0gLWYgZWxmNjQtdGFyZ2V0LmgKKwlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldworCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKKyQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQorJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQorJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQorJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCisKKyMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCitpbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCisJJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKKwkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCisJJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKKworIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KKy5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBiZmQuaAorCXJtIC1mIC5kZXAxCisJJChNQUtFKSBERVA9JChERVApIC5kZXAxCisJc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCisKKyMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCisjIFRoZSBOZXRCU0QgbWtkZXAgb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgZmlsZSBjb250ZW50cywgYW5kIGRvZXNuJ3QgaW5zZXJ0CisjIHRoZSAiRE8gTk9UIERFTEVURSIgbGluZS4KKyMgT3RoZXIgbWtkZXAgdmVyc2lvbnMgcmVxdWlyZSBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cywgYW5kIGRvIGluc2VydCBpdC4KKyMgSGVuY2UgdGhlIHdlaXJkbmVzcy4uLi4KKy5kZXAxOiAkKENGSUxFUykKKwlybSAtZiAuZGVwMiAuZGVwMmEKKwllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCisJZWNobyA+IC5kZXAyYQorCSQoREVQKSAtZiAuZGVwMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/CisJc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IC5kZXAyYSA+PiAuZGVwMgorCXJtIC1mIC5kZXAyYQorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQorCitkZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKKwlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKKwkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKKwkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAorCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJworCitkZXA6IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQorCitkZXAtaW46IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCisKK2RlcC1hbTogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KKworaG9zdC1hb3V0LmxvOiBNYWtlZmlsZQorCisjIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHNpbXBsZSBjb25maWcgZmlsZQorIyB3aGljaCBjYW4gYmUgZm9sZGVkIGludG8gYW4gaC1YWFggZmlsZSBmb3IgYSBuZXcgaG9zdCwgd2l0aCBzb21lIGVkaXRpbmcuCithb3V0LXBhcmFtcy5oOiBnZW4tYW91dAorCS4vZ2VuLWFvdXQgaG9zdCA+IGFvdXQtcGFyYW1zLmgKK2dlbi1hb3V0OiAkKHNyY2RpcikvZ2VuLWFvdXQuYyBNYWtlZmlsZQorCSQoQ0MpIC1vIGdlbi1hb3V0ICQoQ0ZMQUdTKSAkKExGTEFHUykgJChzcmNkaXIpL2dlbi1hb3V0LmMKKworJChCRkRfSCk6IHN0bXAtYmZkLWggOyBAdHJ1ZQorCitzdG1wLWJmZC1oOiBiZmQtaW4zLmgKKwlybSAtZiBiZmQtdG1wLmgKKwljcCBiZmQtaW4zLmggYmZkLXRtcC5oCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC10bXAuaCAkKEJGRF9IKQorCXJtIC1mIGJmZC10bXAuaAorCXRvdWNoIHN0bXAtYmZkLWgKKworIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgoraGVhZGVyczoKKwkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQorCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3CisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAorCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAorCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldworCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKKworIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgorIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgorCiskKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKK3N0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQorCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKKwljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldworCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKKwl0b3VjaCBzdG1wLWJpbjItaAorCiskKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQorc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCisJKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQorCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAorCXRvdWNoIHN0bXAtbGJmZC1oCisKKyQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKK3N0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCisJKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKKwljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCisJdG91Y2ggc3RtcC1sY29mZi1oCisKKyMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworCitlbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorCisjIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KK2VsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCisKKyMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCisjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCithcmNoaXZlLmxvOiBhcmNoaXZlLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYW91dC9yYW5saWIuaAorYXJjaHVyZXMubG86IGFyY2h1cmVzLmMKK2JmZC5sbzogYmZkLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIGxpYmNvZmYuaCBcCisgIGxpYmVjb2ZmLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmgKK2NhY2hlLmxvOiBjYWNoZS5jCitjb2ZmZ2VuLmxvOiBjb2ZmZ2VuLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCitjb3JlZmlsZS5sbzogY29yZWZpbGUuYworZm9ybWF0LmxvOiBmb3JtYXQuYworaW5pdC5sbzogaW5pdC5jCitsaWJiZmQubG86IGxpYmJmZC5jCitvcG5jbHMubG86IG9wbmNscy5jICQoSU5DRElSKS9vYmphbGxvYy5oCityZWxvYy5sbzogcmVsb2MuYyAkKElOQ0RJUikvYmZkbGluay5oCitzZWN0aW9uLmxvOiBzZWN0aW9uLmMgJChJTkNESVIpL2JmZGxpbmsuaAorc3ltcy5sbzogc3ltcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCit0YXJnZXRzLmxvOiB0YXJnZXRzLmMgJChJTkNESVIpL2ZubWF0Y2guaCB0YXJnbWF0Y2guaAoraGFzaC5sbzogaGFzaC5jICQoSU5DRElSKS9vYmphbGxvYy5oCitsaW5rZXIubG86IGxpbmtlci5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oCitzcmVjLmxvOiBzcmVjLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCitiaW5hcnkubG86IGJpbmFyeS5jCit0ZWtoZXgubG86IHRla2hleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAoraWhleC5sbzogaWhleC5jICQoSU5DRElSKS9saWJpYmVydHkuaAorc3RhYnMubG86IHN0YWJzLmMgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgorc3RhYi1zeW1zLmxvOiBzdGFiLXN5bXMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCitjcHUtYTI5ay5sbzogY3B1LWEyOWsuYworY3B1LWFscGhhLmxvOiBjcHUtYWxwaGEuYworY3B1LWFyYy5sbzogY3B1LWFyYy5jCitjcHUtYXJtLmxvOiBjcHUtYXJtLmMKK2NwdS1kMTB2LmxvOiBjcHUtZDEwdi5jCitjcHUtZDMwdi5sbzogY3B1LWQzMHYuYworY3B1LWZyMzAubG86IGNwdS1mcjMwLmMKK2NwdS1oODMwMC5sbzogY3B1LWg4MzAwLmMKK2NwdS1oODUwMC5sbzogY3B1LWg4NTAwLmMKK2NwdS1ocHBhLmxvOiBjcHUtaHBwYS5jCitjcHUtaTM4Ni5sbzogY3B1LWkzODYuYworY3B1LWk4NjAubG86IGNwdS1pODYwLmMKK2NwdS1pOTYwLmxvOiBjcHUtaTk2MC5jCitjcHUtbTMyci5sbzogY3B1LW0zMnIuYworY3B1LW02OGsubG86IGNwdS1tNjhrLmMKK2NwdS1tODhrLmxvOiBjcHUtbTg4ay5jCitjcHUtbTEwMjAwLmxvOiBjcHUtbTEwMjAwLmMKK2NwdS1tMTAzMDAubG86IGNwdS1tMTAzMDAuYworY3B1LW1jb3JlLmxvOiBjcHUtbWNvcmUuYworY3B1LW1pcHMubG86IGNwdS1taXBzLmMKK2NwdS1uczMyay5sbzogY3B1LW5zMzJrLmMgbnMzMmsuaAorY3B1LXBvd2VycGMubG86IGNwdS1wb3dlcnBjLmMKK2NwdS1yczYwMDAubG86IGNwdS1yczYwMDAuYworY3B1LXNoLmxvOiBjcHUtc2guYworY3B1LXNwYXJjLmxvOiBjcHUtc3BhcmMuYworY3B1LXRpYzMwLmxvOiBjcHUtdGljMzAuYworY3B1LXRpYzgwLmxvOiBjcHUtdGljODAuYworY3B1LXY4NTAubG86IGNwdS12ODUwLmMKK2NwdS12YXgubG86IGNwdS12YXguYworY3B1LXdlMzJrLmxvOiBjcHUtd2UzMmsuYworY3B1LXc2NS5sbzogY3B1LXc2NS5jCitjcHUtejhrLmxvOiBjcHUtejhrLmMKK2FvdXQtYWRvYmUubG86IGFvdXQtYWRvYmUuYyAkKElOQ0RJUikvYW91dC9hZG9iZS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCithb3V0LWFybS5sbzogYW91dC1hcm0uYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXR4LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAorYW91dC1uczMyay5sbzogYW91dC1uczMyay5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgbnMzMmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorYW91dC1zcGFyY2xlLmxvOiBhb3V0LXNwYXJjbGUuYyAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgbGliYW91dC5oIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCisgIGFvdXQtdGFyZ2V0LmgKK2FvdXQtdGljMzAubG86IGFvdXQtdGljMzAuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAorICAkKElOQ0RJUikvYW91dC9hci5oIGFvdXR4LmgKK2FvdXQwLmxvOiBhb3V0MC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKK2FvdXQzMi5sbzogYW91dDMyLmMgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAorICAkKElOQ0RJUikvYW91dC9hci5oCitib3V0LmxvOiBib3V0LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggJChJTkNESVIpL2JvdXQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oCitjZi1pMzg2bHlueC5sbzogY2YtaTM4Nmx5bnguYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjZi1tNjhrbHlueC5sbzogY2YtbTY4a2x5bnguYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjZi1zcGFyY2x5bngubG86IGNmLXNwYXJjbHlueC5jIGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1hMjlrLmxvOiBjb2ZmLWEyOWsuYyAkKElOQ0RJUikvY29mZi9hMjlrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1hcG9sbG8ubG86IGNvZmYtYXBvbGxvLmMgJChJTkNESVIpL2NvZmYvYXBvbGxvLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLWFybS5sbzogY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLWF1eC5sbzogY29mZi1hdXguYyAkKElOQ0RJUikvY29mZi9hdXgtY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9tNjhrLmggY29mZi1tNjhrLmMgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaDgzMDAubG86IGNvZmYtaDgzMDAuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaDg1MDAubG86IGNvZmYtaDg1MDAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaTM4Ni5sbzogY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtaTg2MC5sbzogY29mZi1pODYwLmMgJChJTkNESVIpL2NvZmYvaTg2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtZ28zMi5sbzogY29mZi1nbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1pOTYwLmxvOiBjb2ZmLWk5NjAuYyAkKElOQ0RJUikvY29mZi9pOTYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1tNjhrLmxvOiBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1tODhrLmxvOiBjb2ZmLW04OGsuYyAkKElOQ0RJUikvY29mZi9tODhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1taXBzLmxvOiBjb2ZmLW1pcHMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAorICAkKElOQ0RJUikvY29mZi9taXBzLmggbGliY29mZi5oIGxpYmVjb2ZmLmggY29mZnN3YXAuaCBcCisgIGVjb2Zmc3dhcC5oCitjb2ZmLXBtYWMubG86IGNvZmYtcG1hYy5jIGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXJzNjAwMC5sbzogY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtc2gubG86IGNvZmYtc2guYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3NoLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtc3BhcmMubG86IGNvZmYtc3BhcmMuYyAkKElOQ0RJUikvY29mZi9zcGFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi1zdGdvMzIubG86IGNvZmYtc3RnbzMyLmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9nbzMyZXhlLmggXAorICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmggXAorICBnbzMyc3R1Yi5oCitjb2ZmLXN2bTY4ay5sbzogY29mZi1zdm02OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXRpYzMwLmxvOiBjb2ZmLXRpYzMwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXRpYzgwLmxvOiBjb2ZmLXRpYzgwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCitjb2ZmLXU2OGsubG86IGNvZmYtdTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKK2NvZmYtd2UzMmsubG86IGNvZmYtd2UzMmsuYyAkKElOQ0RJUikvY29mZi93ZTMyay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi13NjUubG86IGNvZmYtdzY1LmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi93NjUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZi16OGsubG86IGNvZmYtejhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi96OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAorY29mZmxpbmsubG86IGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgbGliY29mZi5oCitkd2FyZjIubG86IGR3YXJmMi5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKK2Vjb2ZmLmxvOiBlY29mZi5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCisgICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAorICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgIGxpYmNvZmYuaCBsaWJlY29mZi5oCitlY29mZmxpbmsubG86IGVjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29iamFsbG9jLmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAorICBsaWJjb2ZmLmggbGliZWNvZmYuaAorZWxmLmxvOiBlbGYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAorZWxmMzItYXJjLmxvOiBlbGYzMi1hcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgJChJTkNESVIpL2VsZi9hcm0tb2FiaS5oIFwKKyAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCitlbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi1hcm0uaCBcCisgIGVsZjMyLXRhcmdldC5oCitlbGYzMi1kMTB2LmxvOiBlbGYzMi1kMTB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItZDMwdi5sbzogZWxmMzItZDMwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZjMyLWZyMzAubG86IGVsZjMyLWZyMzAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKK2VsZjMyLWdlbi5sbzogZWxmMzItZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItaHBwYS5sbzogZWxmMzItaHBwYS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgZWxmMzItaHBwYS5oIGxpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAorZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGVsZjMyLXRhcmdldC5oCitlbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAorICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBlbGYzMi10YXJnZXQuaAorZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKKyAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCisgIGVsZjMyLXRhcmdldC5oCitlbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCitlbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgZWxmMzItdGFyZ2V0LmgKK2VsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKK2VsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgIGVsZmNvcmUuaCBlbGZsaW5rLmgKK2VsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAoraHAzMDBic2QubG86IGhwMzAwYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKKyAgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCisgIGFvdXQtdGFyZ2V0LmgKK3NvbS5sbzogc29tLmMKK2kzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAoraTM4NmJzZC5sbzogaTM4NmJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAoraTM4NmR5bml4LmxvOiBpMzg2ZHluaXguYyAkKElOQ0RJUikvYW91dC9keW5peDMuaCBhb3V0eC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAorICBhb3V0LXRhcmdldC5oCitpMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitpMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAoraTM4Nmx5bngubG86IGkzODZseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitpMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitpMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitpMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAoraTM4Nm9zOWsubG86IGkzODZvczlrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvb3M5ay5oCitpZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2llZWUuaCBsaWJpZWVlLmgKK202OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCittNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAorbTY4a2x5bngubG86IG02OGtseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCittNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCittODhrbWFjaDMubG86IG04OGttYWNoMy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorbWlwc2JzZC5sbzogbWlwc2JzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAorbmxtLmxvOiBubG0uYyBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAorbmxtMzItaTM4Ni5sbzogbmxtMzItaTM4Ni5jICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCisgIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKK25sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBcCisgIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKK25sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL25sbS9wcGMtZXh0LmggbGlibmxtLmggXAorICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggXAorICBubG1zd2FwLmggbmxtLXRhcmdldC5oCitubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCisgICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKK25zMzJrbmV0YnNkLmxvOiBuczMya25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL29hc3lzLmggbGlib2FzeXMuaAorcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAorcGUtYXJtLmxvOiBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlaS1hcm0ubG86IHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlLWkzODYubG86IHBlLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAorcGVpLWkzODYubG86IHBlaS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlLW1jb3JlLmxvOiBwZS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKK3BlaS1tY29yZS5sbzogcGVpLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAorcGUtcHBjLmxvOiBwZS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCitwZWktcHBjLmxvOiBwZWktcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAorcHBjYm9vdC5sbzogcHBjYm9vdC5jCityZWxvYzE2LmxvOiByZWxvYzE2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaAorcmlzY2l4LmxvOiByaXNjaXguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCisgICQoSU5DRElSKS9hb3V0L2FyLmgKK3NwYXJjbGludXgubG86IHNwYXJjbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCisgIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKK3NwYXJjbHlueC5sbzogc3BhcmNseW54LmMgJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAorc3BhcmNuZXRic2QubG86IHNwYXJjbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCitzdW5vcy5sbzogc3Vub3MuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBhb3V0ZjEuaCBcCisgICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCit2YXhuZXRic2QubG86IHZheG5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAordmVyc2Fkb3MubG86IHZlcnNhZG9zLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCit2bXMubG86IHZtcy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKK3Ztcy1nc2QubG86IHZtcy1nc2QuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCit2bXMtaGRyLmxvOiB2bXMtaGRyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAordm1zLW1pc2MubG86IHZtcy1taXNjLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAordm1zLXRpci5sbzogdm1zLXRpci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKK3hjb2ZmbGluay5sbzogeGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgbGliY29mZi5oCithb3V0NjQubG86IGFvdXQ2NC5jIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKKyAgJChJTkNESVIpL2FvdXQvYXIuaAorY29mZi1hbHBoYS5sbzogY29mZi1hbHBoYS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBsaWJjb2ZmLmggXAorICBsaWJlY29mZi5oIGNvZmZzd2FwLmggZWNvZmZzd2FwLmgKK2RlbW82NC5sbzogZGVtbzY0LmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIFwKKyAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAorICBhb3V0LXRhcmdldC5oCitlbGY2NC1hbHBoYS5sbzogZWxmNjQtYWxwaGEuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggXAorICBsaWJjb2ZmLmggbGliZWNvZmYuaCBlY29mZnN3YXAuaCBlbGY2NC10YXJnZXQuaAorZWxmNjQtZ2VuLmxvOiBlbGY2NC1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCisgICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGVsZjY0LXRhcmdldC5oCitlbGY2NC1taXBzLmxvOiBlbGY2NC1taXBzLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgZ2VubGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9hbHBoYS5oIGVjb2Zmc3dhcC5oIFwKKyAgZWxmNjQtdGFyZ2V0LmgKK2VsZjY0LXNwYXJjLmxvOiBlbGY2NC1zcGFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBlbGY2NC10YXJnZXQuaAorZWxmNjQubG86IGVsZjY0LmMgZWxmY29kZS5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgZWxmY29yZS5oIGVsZmxpbmsuaAorbmxtMzItYWxwaGEubG86IG5sbTMyLWFscGhhLmMgJChJTkNESVIpL25sbS9hbHBoYS1leHQuaCBcCisgIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKK25sbTY0LmxvOiBubG02NC5jIG5sbWNvZGUuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKKyAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAorYWl4Mzg2LWNvcmUubG86IGFpeDM4Ni1jb3JlLmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAoraHB1eC1jb3JlLmxvOiBocHV4LWNvcmUuYworaXJpeC1jb3JlLmxvOiBpcml4LWNvcmUuYworbHlueC1jb3JlLmxvOiBseW54LWNvcmUuYworb3NmLWNvcmUubG86IG9zZi1jb3JlLmMKK3NjbzUtY29yZS5sbzogc2NvNS1jb3JlLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKK3RyYWQtY29yZS5sbzogdHJhZC1jb3JlLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBob3N0cy9pMzg2bGludXguaAorY2lzY28tY29yZS5sbzogY2lzY28tY29yZS5jCisjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL1BPUlRJTkcgYi9iZmQvUE9SVElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJmZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL1BPUlRJTkcKQEAgLTAsMCArMSw4MyBAQAorCVByZWxpbWluYXJ5IE5vdGVzIG9uIFBvcnRpbmcgQkZECisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICdob3N0JyBpcyB0aGUgc3lzdGVtIGEgdG9vbCBydW5zICpvbiouCitUaGUgJ3RhcmdldCcgaXMgdGhlIHN5c3RlbSBhIHRvb2wgcnVucyAqZm9yKiwgaS5lLgorYSB0b29sIGNhbiByZWFkL3dyaXRlIHRoZSBiaW5hcmllcyBvZiB0aGUgdGFyZ2V0LgorCitQb3J0aW5nIHRvIGEgbmV3IGhvc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUGljayBhIG5hbWUgZm9yIHlvdXIgaG9zdC4gQ2FsbCB0aGF0IDxob3N0Pi4KKyg8aG9zdD4gbWlnaHQgYmUgc3VuNCwgLi4uKQorQ3JlYXRlIGEgZmlsZSBob3N0cy88aG9zdD4ubWguCisKK1BvcnRpbmcgdG8gYSBuZXcgdGFyZ2V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUGljayBhIG5hbWUgZm9yIHlvdXIgdGFyZ2V0LiBDYWxsIHRoYXQgPHRhcmdldD4uCitDYWxsIHRoZSBuYW1lIGZvciB5b3VyIENQVSBhcmNoaXRlY3R1cmUgPGNwdT4uCitZb3UgbmVlZCB0byBjcmVhdGUgPHRhcmdldD4uYyBhbmQgY29uZmlnLzx0YXJnZXQ+Lm10LAorYW5kIGFkZCBhIGNhc2UgZm9yIGl0IHRvIGEgY2FzZSBzdGF0ZW1lbnRzIGluIGJmZC9jb25maWd1cmUuaG9zdCBhbmQKK2JmZC9jb25maWcuYmZkLCB3aGljaCBhc3NvY2lhdGVzIGVhY2ggY2Fub25pY2FsIGhvc3QgdHlwZSB3aXRoIGEgQkZECitob3N0IHR5cGUgKHVzZWQgYXMgdGhlIGJhc2Ugb2YgdGhlIG1ha2VmaWxlIGZyYWdtZW50IG5hbWVzKSwgYW5kIHRvIHRoZQordGFibGUgaW4gYmZkL2NvbmZpZ3VyZS5pbiB3aGljaCBhc3NvY2lhdGVzIGVhY2ggdGFyZ2V0IHZlY3RvciB3aXRoCit0aGUgLm8gZmlsZXMgaXQgdXNlcy4KKworY29uZmlnLzx0YXJnZXQ+Lm10IGlzIGEgTWFrZWZpbGUgZnJhZ21lbnQuCitUaGUgZm9sbG93aW5nIGlzIHVzdWFsbHkgZW5vdWdoOgorREVGQVVMVF9WRUNUT1I9PHRhcmdldD5fdmVjCitTRUxFQ1RfQVJDSElURUNUVVJFUz1iZmRfPGNwdT5fYXJjaAorCitTZWUgdGhlIGxpc3Qgb2YgY3B1IHR5cGVzIGluIGFyY2h1cmVzLmMsIG9yICJscyBjcHUtKi5jIi4KK0lmIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIG5ldywgeW91IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSB0YWJsZXMKK2luIGJmZC9hcmNodXJlcy5jLCBvcGNvZGVzL2NvbmZpZ3VyZS5pbiwgYW5kIGJpbnV0aWxzL29iamR1bXAuYy4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgLm10IGFuZCAubWggZmlsZXMsIHNlZSBjb25maWcvUkVBRE1FLgorCitUaGUgZmlsZSA8dGFyZ2V0Pi5jIGlzIHRoZSBoYXJkIHBhcnQuICBJdCBpbXBsZW1lbnRzIHRoZQorYmZkX3RhcmdldCA8dGFyZ2V0Pl92ZWMsIHdoaWNoIGluY2x1ZGVzIHBvaW50ZXJzIHRvCitmdW5jdGlvbnMgdGhhdCBkbyB0aGUgYWN0dWFsIDx0YXJnZXQ+LXNwZWNpZmljIG1ldGhvZHMuCisKK1BvcnRpbmcgdG8gYSA8dGFyZ2V0PiB0aGF0IHVzZXMgdGhlIGEub3V0IGJpbmFyeSBmb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhpcyBjYXNlLCB0aGUgaW5jbHVkZSBmaWxlIGFvdXQtdGFyZ2V0LmggcHJvYmFieSBkb2VzIG1vc3QKK29mIHdoYXQgeW91IG5lZWQuIFRoZSBwcm9ncmFtIGdlbi1hb3V0IGdlbmVyYXRlcyA8dGFyZ2V0Pi5jIGZvcgoreW91IGF1dG9tYXRpY2FsbHkgZm9yIG1hbnkgYS5vdXQgc3lzdGVtcy4gIERvOgorCW1ha2UgZ2VuLWFvdXQKKwkuL2dlbi1hb3V0IDx0YXJnZXQ+ID4gPHRhcmdldD4uYworKFRoaXMgb25seSB3b3JrcyBpZiB5b3UgYXJlIGJ1aWxkaW5nIG9uIHRoZSB0YXJnZXQgKCJuYXRpdmUiKS4KK0lmIHlvdSBtdXN0IG1ha2UgYSBjcm9zcy1wb3J0IGZyb20gc2NyYXRjaCwgY29weSB0aGUgbW9zdAorc2ltaWxhciBleGlzdGluZyBmaWxlIHRoYXQgaW5jbHVkZXMgYW91dC10YXJnZXQuaCwgYW5kIGZpeCB3aGF0IGlzIHdyb25nLikKKworQ2hlY2sgdGhlIHBhcmFtZXRlcnMgaW4gPHRhcmdldD4uYywgYW5kIGZpeCBhbnl0aGluZyB0aGF0IGlzIHdyb25nLgorKEFsc28gbGV0IHVzIGtub3cgYWJvdXQgaXQ7IHBlcmhhcHMgd2UgY2FuIGltcHJvdmUgZ2VuLWFvdXQuYy4pCisKK1RBUkdFVF9JU19CSUdfRU5ESUFOX1AKKwlTaG91bGQgYmUgZGVmaW5lZCBpZiA8dGFyZ2V0PiBpcyBiaWctZW5kaWFuLgorCitOX0hFQURFUl9JTl9URVhUKHgpCisJU2VlIGRpc2N1c3Npb24gaW4gLi4vaW5jbHVkZS9hb3V0L2FvdXQ2NC5oLgorCitCWVRFU19JTl9XT1JECisJTnVtYmVyIG9mIGJ5dGVzIHBlciB3b3JkLiAoVXN1YWxseSA0IGJ1dCBjYW4gYmUgOC4pCisKK0FSQ0gKKwlOdW1iZXIgb2YgYml0cyBwZXIgd29yZC4gIChVc3VhbGx5IDMyLCBidXQgY2FuIGJlIDY0LikKKworRU5UUllfQ0FOX0JFX1pFUk8KKwlEZWZpbmUgaWYgdGhlIGV4dHJ5IHBvaW50IChzdGFydCBhZGRyZXNzIG9mIGFuCisJZXhlY3V0YWJsZSBwcm9ncmFtKSBjYW4gYmUgMHgwLgorCitURVhUX1NUQVJUX0FERFIKKwlUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnZW1udCBpbgorCXZpcnR1YWwgbWVtb3J5LiAgTm9ybWFsbHksIHRoZSBzYW1lIGFzIHRoZSBlbnRyeSBwb2ludC4KKworVEFSR0VUX1BBR0VfU0laRQorCitTRUdNRU5UX1NJWkUKKyAgICAgICAgVXN1YWxseSwgdGhlIHNhbWUgYXMgdGhlIFRBUkdFVF9QQUdFX1NJWkUuCisgICAgICAgIEFsaWdubWVudCBuZWVkZWQgZm9yIHRoZSBkYXRhIHNlZ21lbnQuCisKK1RBUkdFVE5BTUUKKwlUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0LCBmb3IgcnVuLXRpbWUgbG9va3Vwcy4KKwlVc3VhbGx5ICJhLm91dC08dGFyZ2V0PiIKZGlmZiAtLWdpdCBhL2JmZC9SRUFETUUgYi9iZmQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxY2UxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvUkVBRE1FCkBAIC0wLDAgKzEsNDkgQEAKK0JGRCBpcyBhIGFuIG9iamVjdCBmaWxlIGxpYnJhcnkuICBJdCBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCitzYW1lIHJvdXRpbmVzIHRvIHByb2Nlc3Mgb2JqZWN0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgZm9ybWF0LgorCitCRkQgaXMgdXNlZCBieSB0aGUgR05VIGRlYnVnZ2VyLCBhc3NlbWJsZXIsIGxpbmtlciwgYW5kIHRoZSBiaW5hcnkKK3V0aWxpdGllcy4KKworVGhlIGRvY3VtZW50YXRpb24gb24gdXNpbmcgQkZEIGlzIHNjYW50eSBhbmQgbWF5IGJlIG9jY2FzaW9uYWxseQoraW5jb3JyZWN0LiAgUG9pbnRlcnMgdG8gZG9jdW1lbnRhdGlvbiBwcm9ibGVtcywgb3IgYW4gZW50aXJlbHkKK3Jld3JpdHRlbiBtYW51YWwsIHdvdWxkIGJlIGFwcHJlY2lhdGVkLgorCitUaGVyZSBpcyBzb21lIEJGRCBpbnRlcm5hbHMgZG9jdW1lbnRhdGlvbiBpbiBkb2MvYmZkaW50LnRleGkgd2hpY2ggbWF5CitoZWxwIHByb2dyYW1tZXJzIHdobyB3YW50IHRvIG1vZGlmeSBCRkQuCisKK0JGRCBpcyBub3JtYWxseSBidWlsdCBhcyBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIFNlZSB0aGUgYnVpbGQKK2luc3RydWN0aW9ucyBmb3IgdGhhdCBwYWNrYWdlLCBwcm9iYWJseSBpbiBhIFJFQURNRSBmaWxlIGluIHRoZQorYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgorCitCRkQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmUgb3B0aW9uczoKKworICAtLXRhcmdldD1UQVJHRVQKKwlUaGUgZGVmYXVsdCB0YXJnZXQgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVEFSR0VUIGlzCisJYSBjb25maWd1cmF0aW9uIHRhcmdldCB0cmlwbGV0LCBzdWNoIGFzIHNwYXJjLXN1bi1zb2xhcmlzLgorICAtLWVuYWJsZS10YXJnZXRzPVRBUkdFVCxUQVJHRVQsVEFSR0VULi4uCisJQWRkaXRpb25hbCB0YXJnZXRzIHRoZSBsaWJyYXJ5IHNob3VsZCBzdXBwb3J0LiAgVG8gaW5jbHVkZQorCXN1cHBvcnQgZm9yIGFsbCBrbm93biB0YXJnZXRzLCB1c2UgLS1lbmFibGUtdGFyZ2V0cz1hbGwuCisgIC0tZW5hYmxlLTY0LWJpdC1iZmQKKwlJbmNsdWRlIHN1cHBvcnQgZm9yIDY0IGJpdCB0YXJnZXRzLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5CisJdHVybmVkIG9uIGlmIHlvdSBleHBsaWNpdGx5IHJlcXVlc3QgYSA2NCBiaXQgdGFyZ2V0LCBidXQgbm90CisJZm9yIC0tZW5hYmxlLXRhcmdldHM9YWxsLiAgVGhpcyByZXF1aXJlcyBhIGNvbXBpbGVyIHdpdGggYSA2NAorCWJpdCBpbnRlZ2VyIHR5cGUsIHN1Y2ggYXMgZ2NjLgorICAtLWVuYWJsZS1zaGFyZWQKKwlCdWlsZCBCRkQgYXMgYSBzaGFyZWQgbGlicmFyeS4KKyAgLS13aXRoLW1tYXAKKwlVc2UgbW1hcCB3aGVuIGFjY2Vzc2luZyBmaWxlcy4gIFRoaXMgaXMgZmFzdGVyIG9uIHNvbWUgaG9zdHMsCisJYnV0IHNsb3dlciBvbiBvdGhlcnMuICBJdCBtYXkgbm90IHdvcmsgb24gYWxsIGhvc3RzLgorCitSZXBvcnQgYnVncyB3aXRoIEJGRCB0byBidWctZ251LXV0aWxzQGdudS5vcmcuCisKK1BhdGNoZXMgYXJlIGVuY291cmFnZWQuICBXaGVuIHNlbmRpbmcgcGF0Y2hlcywgYWx3YXlzIHNlbmQgdGhlIG91dHB1dAorb2YgZGlmZiAtdSBvciBkaWZmIC1jIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgRG8gbm90CitzZW5kIGRlZmF1bHQgZGlmZiBvdXRwdXQuICBEbyBub3QgbWFrZSB0aGUgZGlmZiBmcm9tIHRoZSBuZXcgZmlsZSB0bwordGhlIG9yaWdpbmFsIGZpbGUuICBSZW1lbWJlciB0aGF0IGFueSBwYXRjaCBtdXN0IG5vdCBicmVhayBvdGhlcgorc3lzdGVtcy4gIFJlbWVtYmVyIHRoYXQgQkZEIG11c3Qgc3VwcG9ydCBjcm9zcyBjb21waWxhdGlvbiBmcm9tIGFueQoraG9zdCB0byBhbnkgdGFyZ2V0LCBzbyBwYXRjaGVzIHdoaWNoIHVzZSBgYCNpZmRlZiBIT1NUJycgYXJlIG5vdAorYWNjZXB0YWJsZS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIGBgUmVwb3J0aW5nIEJ1Z3MnJyBzZWN0aW9uIG9mIHRoZQorZ2NjIG1hbnVhbC4KKworQnVnIHJlcG9ydHMgd2l0aG91dCBwYXRjaGVzIHdpbGwgYmUgcmVtZW1iZXJlZCwgYnV0IHRoZXkgbWF5IG5ldmVyIGdldAorZml4ZWQgdW50aWwgc29tZWJvZHkgdm9sdW50ZWVycyB0byBmaXggdGhlbS4KZGlmZiAtLWdpdCBhL2JmZC9UT0RPIGIvYmZkL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMjczNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9UT0RPCkBAIC0wLDAgKzEsMjUgQEAKK1RoaW5ncyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgZG9uZTogLSotIFRleHQgLSotCisKKyBvIC0gQSBzb3VyY2Ugb2Ygc3BhY2UgbG9zc2FnZSBpcyB0aGF0IGFsbCB0aGUgdGFyZ2V0LWRlcGVuZGVudCBjb2RlCisgICAgIGlzIGluIGEgc2luZ2xlIGJmZF90YXJnZXQgc3RydWN0dXJlLiAgSGVuY2UgYWxsIHRoZSBjb2RlIGZvcgorICAgICAqd3JpdGluZyogb2JqZWN0IGZpbGVzIGlzIHN0aWxsIHB1bGxlZCBpbnRvIGFsbCB0aGUgYXBwbGljYXRpb25zCisgICAgIHRoYXQgb25seSBjYXJlIGFib3V0ICpyZWFkaW5nKiAoZ2RiLCBubSwgb2JqZHVtcCksIHdoaWxlIGdhcyBoYXMKKyAgICAgdG8gY2FycnkgYWxvbmcgYWxsIHRoZSB1bm5lZWRlZCBiYWdnYWdlIGZvciByZWFkaW5nIG9iamVjdHMuICBBbmQKKyAgICAgc28gb24uICBUaGlzIHdvdWxkIGJlIGEgc3Vic3RhbnRpYWwgY2hhbmdlLCBhbmQgdGhlIHBheW9mZiB3b3VsZAorICAgICBub3QgYWxsIHRoYXQgZ3JlYXQgKGVzc2VudGlhbGx5IG5vbmUgaWYgYmZkIGlzIHVzZWQgYXMgYSBzaGFyZWQKKyAgICAgbGlicmFyeSkuCisKKyBvIC0gVGhlIHN0b3JhZ2UgbmVlZGVkIGJ5IEJGRCBkYXRhIHN0cnVjdHVyZXMgaXMgYWxzbyBsYXJnZXIgdGhhbiBzdHJpY3RseQorICAgICBuZWVkZWQuICBUaGlzIG1heSBiZSBkaWZmaWN1bHQgdG8gZG8gbXVjaCBhYm91dC4KKworIG8gLSBpbXBsZW1lbnQgYmZkX2Fib3J0LCB3aGljaCBzaG91bGQgY2xvc2UgdGhlIGJmZCBidXQgbm90IGFsdGVyIHRoZQorICAgICBmaWxlc3lzdGVtLgorCisgbyAtIHVwZGF0ZSB0aGUgYmZkIGRvYzsgd3JpdGUgYSBob3ctdG8td3JpdGUtYS1iYWNrZW5kIGRvYywgdGFrZSBvdXQKKyAgICAgdGhlIHN0dXBpZCBxdWlwcyBhbmQgZmlsbCBpbiBhbGwgdGhlIGJsYW5rcy4KKworIG8gLSB1cGdyYWRlIHRoZSByZWxvYyBoYW5kbGluZyBhcyBwZXIgU3RldmUncyBzdWdnZXN0aW9uLgorCisKKworCmRpZmYgLS1naXQgYS9iZmQvYWNpbmNsdWRlLm00IGIvYmZkL2FjaW5jbHVkZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmUxYzMwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FjaW5jbHVkZS5tNApAQCAtMCwwICsxLDEwNCBAQAorZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIGZvcGVuLWJpbi5oIHJhdGhlciB0aGFuIGZvcGVuLXNhbWUuaC4KK0FDX0RFRlVOKEJGRF9CSU5BUllfRk9QRU4sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1NZU1RFTV0pCitjYXNlICIke2hvc3R9IiBpbgorY2hhbmdlcXVvdGUoLClkbmwKKyotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQorY2hhbmdlcXVvdGUoWyxdKWRubAorICBBQ19ERUZJTkUoVVNFX0JJTkFSWV9GT1BFTiwgMSwgW1VzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/XSkgOzsKK2VzYWNdKWRubAorCitkbmwgR2V0IGEgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIHRvIHB1dCBpbnRvIE1ha2VmaWxlLgorQUNfREVGVU4oQkZEX0NDX0ZPUl9CVUlMRCwKK1sjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgorICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCisgIGVsc2UKKyAgICBDQ19GT1JfQlVJTEQ9Z2NjCisgIGZpCitmaQorQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQorIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJworZWxzZQorICBBQ19DQUNIRV9DSEVDSyhbZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeF0sIGJmZF9jdl9idWlsZF9leGVleHQsCisgICAgW2NhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCitpbnQgbWFpbigpIHsKKy8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KK30KK0VPRgorICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1CisgICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKKyAgICBybSAtZiBhY19jX3Rlc3QqCisgICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vXSkKKyAgRVhFRVhUX0ZPUl9CVUlMRD0iIgorICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQorZmkKK0FDX1NVQlNUKEVYRUVYVF9GT1JfQlVJTEQpXSlkbmwKKworZG5sIFNlZSB3aGV0aGVyIHdlIG5lZWQgYSBkZWNsYXJhdGlvbiBmb3IgYSBmdW5jdGlvbi4KK0FDX0RFRlVOKEJGRF9ORUVEX0RFQ0xBUkFUSU9OLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciAkMSBtdXN0IGJlIGRlY2xhcmVkXSkKK0FDX0NBQ0hFX1ZBTChiZmRfY3ZfZGVjbF9uZWVkZWRfJDEsCitbQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmXSwKK1tjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSAkMV0sCitiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9bm8sIGJmZF9jdl9kZWNsX25lZWRlZF8kMT15ZXMpXSkKK0FDX01TR19SRVNVTFQoJGJmZF9jdl9kZWNsX25lZWRlZF8kMSkKK2lmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoW05FRURfREVDTEFSQVRJT05fXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAorCSAgICBbRGVmaW5lIGlmICQxIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLl0pCitmaQorXSlkbmwKKworZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgYSB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAorCitBQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUsCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEgaW4gc3lzL3Byb2Nmcy5oXSkKKyBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxLAorICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCisgICAgICBbJDEgYXZhcl0sCisgICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9eWVzLAorICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPW5vCisgICApXSkKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEgPSB5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCisJICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS5dKQorIGZpCisgQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxKQorXSkKKworCitkbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBtZW1iZXIgJDIgaW4gdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKKworQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUiwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMS4kMiBpbiBzeXMvcHJvY2ZzLmhdKQorIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyLAorICAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPl0sCisgICAgICBbJDEgYXZhcjsgdm9pZCogYXJlZiA9ICh2b2lkKikgJmF2YXIuJDJdLAorICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj15ZXMsCisgICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPW5vCisgICApXSkKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyID0geWVzOyB0aGVuCisgICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pW19ddHJhbnNsaXQoJDIsIFthLXpdLCBbQS1aXSksIDEsCisJICAgICBbRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyAkMS4kMi5dKQorIGZpCisgQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMikKK10pCisKKwpkaWZmIC0tZ2l0IGEvYmZkL2FjbG9jYWwubTQgYi9iZmQvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzU4MDAwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FjbG9jYWwubTQKQEAgLTAsMCArMSw4NjEgQEAKK2RubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40CisKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKK2RubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitkbmwgUEFSVElDVUxBUiBQVVJQT1NFLgorCitkbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgorQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKK2Nhc2UgIiR7aG9zdH0iIGluCitjaGFuZ2VxdW90ZSgsKWRubAorKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCitjaGFuZ2VxdW90ZShbLF0pZG5sCisgIEFDX0RFRklORShVU0VfQklOQVJZX0ZPUEVOLCAxLCBbVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz9dKSA7OworZXNhY10pZG5sCisKK2RubCBHZXQgYSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgdG8gcHV0IGludG8gTWFrZWZpbGUuCitBQ19ERUZVTihCRkRfQ0NfRk9SX0JVSUxELAorWyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCisgIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgICAgQ0NfRk9SX0JVSUxEPSckKENDKScKKyAgZWxzZQorICAgIENDX0ZPUl9CVUlMRD1nY2MKKyAgZmkKK2ZpCitBQ19TVUJTVChDQ19GT1JfQlVJTEQpCisjIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCitlbHNlCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4XSwgYmZkX2N2X2J1aWxkX2V4ZWV4dCwKKyAgICBbY2F0ID4gYWNfY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCisgICAgJHtDQ19GT1JfQlVJTER9IC1vIGFjX2NfdGVzdCBhbV9jX3Rlc3QuYyAxPiY1IDI+JjUKKyAgICBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvIGFjX2NfdGVzdC4qIHwgZ3JlcCAtdiBhY19jX3Rlc3QuYyB8IHNlZCAtZSBzL2FjX2NfdGVzdC8vYAorICAgIHJtIC1mIGFjX2NfdGVzdCoKKyAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm9dKQorICBFWEVFWFRfRk9SX0JVSUxEPSIiCisgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9CitmaQorQUNfU1VCU1QoRVhFRVhUX0ZPUl9CVUlMRCldKWRubAorCitkbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCBhIGRlY2xhcmF0aW9uIGZvciBhIGZ1bmN0aW9uLgorQUNfREVGVU4oQkZEX05FRURfREVDTEFSQVRJT04sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICQxIG11c3QgYmUgZGVjbGFyZWRdKQorQUNfQ0FDSEVfVkFMKGJmZF9jdl9kZWNsX25lZWRlZF8kMSwKK1tBQ19UUllfQ09NUElMRShbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWZdLAorW2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpICQxXSwKK2JmZF9jdl9kZWNsX25lZWRlZF8kMT1ubywgYmZkX2N2X2RlY2xfbmVlZGVkXyQxPXllcyldKQorQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2RlY2xfbmVlZGVkXyQxKQoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCisgIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCisJICAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKK2ZpCitdKWRubAorCitkbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCisKK0FDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBpbiBzeXMvcHJvY2ZzLmhdKQorIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEsCisgICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKKyAgICAgIFskMSBhdmFyXSwKKyAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT15ZXMsCisgICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9bm8KKyAgICldKQorIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSA9IHllczsgdGhlbgorICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKKwkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLl0pCisgZmkKKyBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEpCitdKQorCisKK2RubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1lbWJlciAkMiBpbiB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAorCitBQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSLAorW0FDX01TR19DSEVDS0lORyhbZm9yICQxLiQyIGluIHN5cy9wcm9jZnMuaF0pCisgQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIsCisgICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKKyAgICAgIFskMSBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci4kMl0sCisgICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPXllcywKKyAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9bm8KKyAgICldKQorIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIgPSB5ZXM7IHRoZW4KKyAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSlbX110cmFuc2xpdCgkMiwgW2Etel0sIFtBLVpdKSwgMSwKKwkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLiQyLl0pCisgZmkKKyBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyKQorXSkKKworCisKKyMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQorIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCisjIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIHNlcmlhbCAxCisKK2RubCBVc2FnZToKK2RubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCisKK0FDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCitbQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKK1BBQ0tBR0U9WyQxXQorQUNfU1VCU1QoUEFDS0FHRSkKK1ZFUlNJT049WyQyXQorQUNfU1VCU1QoVkVSU0lPTikKK2RubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKK2ZpCitpZmVsc2UoWyQzXSwsCitBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCitBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKK0FDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCitBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCitkbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCisjCisKK0FDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKKyAgIGZpCisgICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKKyAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitybSAtZiBjb25mdGVzdCoKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKK2RubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQorZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KK0FDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKK1tBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAkMT0kMgorICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKK2Vsc2UKKyAgICQxPSIkMy9taXNzaW5nICQyIgorICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQorZmkKK0FDX1NVQlNUKCQxKV0pCisKKworIyBzZXJpYWwgMjUgQU1fUFJPR19MSUJUT09MCitBQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsCitbQUNfUkVRVUlSRShbQU1fRU5BQkxFX1NIQVJFRF0pZG5sCitBQ19SRVFVSVJFKFtBTV9FTkFCTEVfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1BST0dfTERdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19OTV0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAorZG5sCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgorbGlidG9vbF9mbGFncz0KK3Rlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCit0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICIkaG9zdCIgaW4KKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIDs7CisKKyotKi1jeWd3aW4qKQorICBBTV9TWVNfTElCVE9PTF9DWUdXSU4KKyAgOzsKKworZXNhYworCisjIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgorQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCitMRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCitETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAorJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAorJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKK3x8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKKworIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKKyMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCitleGVjIDU+Pi4vY29uZmlnLmxvZworXSkKKworIyBBTV9FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZworIyBVc2FnZTogQU1fRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELAorW2RlZmluZShbQU1fRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKHNoYXJlZCwKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QU1fRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3NoYXJlZD1BTV9FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCitdKQorCisjIEFNX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKK0FDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELAorW0FNX0VOQUJMRV9TSEFSRUQobm8pXSkKKworIyBBTV9ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCitBQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywKK1tBTV9FTkFCTEVfU1RBVElDKG5vKV0pCisKKyMgQU1fRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKKyMgVXNhZ2U6IEFNX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQorIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bworIyAgIGB5ZXMnLgorQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywKK1tkZWZpbmUoW0FNX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShzdGF0aWMsCitjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCis8PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFNX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfc3RhdGljPXllcyA7Oworbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyopCisgIGVuYWJsZV9zdGF0aWM9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc3RhdGljPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjXSwKK2VuYWJsZV9zdGF0aWM9QU1fRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAorXSkKKworCisjIEFNX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKK0FDX0RFRlVOKEFNX1BST0dfTEQsCitbQUNfQVJHX1dJVEgoZ251LWxkLAorWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCit0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCithY19wcm9nPWxkCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCisgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKKyAgY2FzZSAiJGFjX3Byb2ciIGluCisgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorY2hhbmdlcXVvdGUoLClkbmwKKyAgLyogfCBbQS1aYS16XTpcXCopCitjaGFuZ2VxdW90ZShbLF0pZG5sCisgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisgICAgICBlbHNlCisgICAgICAgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitlbHNlCisgIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGFjX2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitBQ19TVUJTVChMRCkKK0FNX1BST0dfTERfR05VCitdKQorCitBQ19ERUZVTihBTV9QUk9HX0xEX0dOVSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICBhY19jdl9wcm9nX2dudV9sZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KK2ZpXSkKK10pCisKKyMgQU1fUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oQU1fUFJPR19OTSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKK1tpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBhY19jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gL3Vzci91Y2IgL3Vzci9jY3MvYmluICRQQVRIIC9iaW47IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgorICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKKyAgICAgIGVsc2UKKyAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSIKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCitmaV0pCitOTT0iJGFjX2N2X3BhdGhfTk0iCitBQ19NU0dfUkVTVUxUKFskTk1dKQorQUNfU1VCU1QoTk0pCitdKQorCisjIEFNX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgorQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLAorW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCitBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCitdKQorCisjIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCisKK0FDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCitbQUNfUFJFUkVRKFsyLjEyXSkKK0FDX0NPTkZJR19IRUFERVIoWyQxXSkKK2RubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgorZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKK2RubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KK0FDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKK2lmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKKzw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCis8PGFtX2luZHg9MQorZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbworICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCisgICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+CisgICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKKyAgICA7OworICBlc2FjCisgIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAorZG9uZTw8Pj5kbmw+PikKK2NoYW5nZXF1b3RlKFssXSkpXSkKKworIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCisjIEZyb20gSmltIE1leWVyaW5nCisKKyMgc2VyaWFsIDEKKworQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQorICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCitbICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAorICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAorICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKKyAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKKyAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgQUNfU1VCU1QoTUFJTlQpZG5sCitdCispCisKKyMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCisKK0FDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAorW0FDX1NVQlNUKCQxX1RSVUUpCitBQ19TVUJTVCgkMV9GQUxTRSkKK2lmICQyOyB0aGVuCisgICQxX1RSVUU9CisgICQxX0ZBTFNFPScjJworZWxzZQorICAkMV9UUlVFPScjJworICAkMV9GQUxTRT0KK2ZpXSkKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworQUNfREVGVU4oQ1lfV0lUSF9OTFMsCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKKyAgICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKKyAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICAgIEFDX1NVQlNUKFVTRV9OTFMpCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQorICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKwlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KKwlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKKwkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAorCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCisJICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKKwkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQorCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCisJCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKKwkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQorCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKwkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAorCQkgIFtDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCisJCSAgW0NBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliXSkKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCV0pCisKKwlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KKyAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KKworICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgorCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKKyAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorICAgICAgICBBQ19TVUJTVChNU0dGTVQpCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisJZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKwlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBBQ19NU0dfUkVTVUxUKAorCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKKyAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCisgICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKENBVEFMT0dTKQorICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKyAgICBBQ19TVUJTVChHTU9GSUxFUykKKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorICAgIEFDX1NVQlNUKElOVExERVBTKQorICAgIEFDX1NVQlNUKElOVExMSUJTKQorICAgIEFDX1NVQlNUKElOVExPQkpTKQorICAgIEFDX1NVQlNUKFBPRklMRVMpCisgICAgQUNfU1VCU1QoUE9TVUIpCisgIF0pCisKK0FDX0RFRlVOKENZX0dOVV9HRVRURVhULAorICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKworICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQorICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQorCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCisgICBmaQorCisgICBBTV9MQ19NRVNTQUdFUworICAgQ1lfV0lUSF9OTFMKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCisgICAgIGZpCisKKyAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCisgICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKKyAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKKworICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQorICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6CisgICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAorICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQorCisJIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcworICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCisJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCisgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKKyAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKKyAgIGRubCBwYWNrYWdlcy4KKyAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICBBQ19TVUJTVChHVF9OTykKKyAgIEFDX1NVQlNUKEdUX1lFUykKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKKworICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCisgICBsPQorICAgQUNfU1VCU1QobCkKKworICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKKyAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQorICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCisgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgXSkKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAorZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKK1sjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIFskM107IHRoZW4KKwlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAorZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCitpZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgorXSlkbmwKKyAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoWyRdJDEpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorQUNfU1VCU1QoJDEpZG5sCitdKQorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAorICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAorICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisJCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCisgICAgZmkKKyAgZmldKQorCmRpZmYgLS1naXQgYS9iZmQvYWl4Mzg2LWNvcmUuYyBiL2JmZC9haXgzODYtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NWZhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYWl4Mzg2LWNvcmUuYwpAQCAtMCwwICsxLDI4MyBAQAorLyogQkZEIGJhY2stZW5kIGZvciBBSVggb24gUFMvMiBjb3JlIGZpbGVzLgorICAgVGhpcyB3YXMgYmFzZWQgb24gdHJhZC1jb3JlLmMsIHdoaWNoIHdhcyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZSBvZgorICAgICAgICBDeWdudXMgU3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBNaW5oIFRyYW4tTGUgPFRSQU5MRUBJTlRFTExJQ09SUC5DT00+LgorICAgQ29udmVydGVkIHRvIGJhY2sgZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2kzODYuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZiBkZWZpbmVkIChfQUlYKSAmJiBkZWZpbmVkIChfSTM4NikKKyNkZWZpbmUgTk9DSEVDS1MJCS8qIHRoaXMgaXMgZm9yIGNvcmVkdW1wLmggKi8KKyNkZWZpbmUgX2hfVVNFUgkJCS8qIGF2b2lkIGluY2x1ZGluZyB1c2VyLmggZnJvbSBjb3JlZHVtcC5oICovCisjaW5jbHVkZSA8dWluZm8uaD4KKyNpbmNsdWRlIDxzeXMvaTM4Ni9jb3JlZHVtcC5oPgorI2VuZGlmIC8qIF9BSVggJiYgX0kzODYgKi8KKworLyogbWF5YmUgdGhpcyBjb3VsZCB3b3JrIG9uIHNvbWUgb3RoZXIgaTM4NiBidXQgSSBoYXZlIG5vdCB0cmllZCBpdAorICogbXRyYW5sZUBwYXJpcyAtIFR1ZSBTZXAgMjQgMTI6NDk6MzUgMTk5MQorICovCisKKyNpZm5kZWYgQ09SX01BR0lDCisjIGRlZmluZSBDT1JfTUFHSUMgImNvcmUiCisjZW5kaWYKKworLyogbmVlZCB0aGlzIGNhc3QgYmVjYXVzZSBwdHIgaXMgcmVhbGx5IHZvaWQgKiAqLworI2RlZmluZSBjb3JlX2hkcihiZmQpIFwKKyAgICAoKChiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhKSktPmhkcikKKyNkZWZpbmUgY29yZV9zZWN0aW9uKGJmZCxuKSBcCisgICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5zZWN0aW9uc1tuXSkKKyNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSBcCisgICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5yZWdfc2VjdGlvbikKKyNkZWZpbmUgY29yZV9yZWcyc2VjKGJmZCkgXAorICAgICgoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhKS0+cmVnMl9zZWN0aW9uKQorCisvKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLworc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgeworICBzdHJ1Y3QgY29yZWhkciAqaGRyOwkJLyogY29yZSBmaWxlIGhlYWRlciAqLworICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247CisgIGFzZWN0aW9uICpyZWcyX3NlY3Rpb247CisgIGFzZWN0aW9uICpzZWN0aW9uc1tNQVhfQ09SRV9TRUdTXTsKK307CisKK3N0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCithaXgzODZfY29yZV9maWxlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IGksbjsKKyAgdW5zaWduZWQgY2hhciBsb25nYnVmWzRdOwkvKiBSYXcgYnl0ZXMgb2YgdmFyaW91cyBoZWFkZXIgZmllbGRzICovCisgIGludCBjb3JlX3NpemUgPSBzaXplb2YgKHN0cnVjdCBjb3JlaGRyKTsKKyAgc3RydWN0IGNvcmVoZHIgKmNvcmU7CisgIHN0cnVjdCBtZXJnZW0geworICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IGNvcmVkYXRhOworICAgIHN0cnVjdCBjb3JlaGRyIGludGVybmFsX2NvcmU7CisgIH0gKm1lcmdlbTsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0gc2l6ZW9mIChsb25nYnVmKSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHN0cm5jbXAobG9uZ2J1ZixDT1JfTUFHSUMsNCkpIHJldHVybiAwOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIGZhbHNlKSA8IDApIHJldHVybiAwOworCisgIG1lcmdlbSA9IChzdHJ1Y3QgbWVyZ2VtICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWVyZ2VtKSk7CisgIGlmIChtZXJnZW0gPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBjb3JlID0gJm1lcmdlbS0+aW50ZXJuYWxfY29yZTsKKworICBpZiAoKGJmZF9yZWFkICgoUFRSKSBjb3JlLCAxLCBjb3JlX3NpemUsIGFiZmQpKSAhPSBjb3JlX3NpemUpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBzZXRfdGRhdGEgKGFiZmQsICZtZXJnZW0tPmNvcmVkYXRhKTsKKyAgY29yZV9oZHIgKGFiZmQpID0gY29yZTsKKworICAvKiBjcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIHJlY2xhaW0KKyAgICAgdGhlbSAqLworICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOworICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCisgICAgeworICAgIGxvc2VyOgorICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgY29yZV9yZWcyc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7CisgIGlmIChjb3JlX3JlZzJzZWMgKGFiZmQpID09IE5VTEwpCisgICAgeworICAgIGxvc2VyMToKKyAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfcmVnc2VjIChhYmZkKSk7CisgICAgICBnb3RvIGxvc2VyOworICAgIH0KKworICBmb3IgKGk9MCwgbj0wIDsgKGkgPCBNQVhfQ09SRV9TRUdTKSAmJiAoY29yZS0+Y2Rfc2Vnc1tpXS5jc190eXBlKSA7IGkrKykKKyAgICB7CisgICAgICBpZiAoY29yZS0+Y2Rfc2Vnc1tpXS5jc19vZmZzZXQgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCxuKSA9CisJKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgICAgIGlmIChjb3JlX3NlY3Rpb24gKGFiZmQsbikgPT0gTlVMTCkKKwl7CisJICBpbnQgajsKKwkgIGlmIChuID4gMCkKKwkgICAgeworCSAgICAgIGZvciAoaj0wOyBqIDwgbjsgaisrKQorCQliZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9zZWN0aW9uKGFiZmQsIGopKTsKKwkgICAgfQorCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopbWVyZ2VtKTsKKwkgIGdvdG8gbG9zZXIxOworCX0KKworICAgICAgc3dpdGNoIChjb3JlLT5jZF9zZWdzW2ldLmNzX3R5cGUpCisJeworCWNhc2UgQ09SX1RZUEVfREFUQToKKwkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLmRhdGEiOworCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0xPQUQgKworCQkJCQkgICBTRUNfSEFTX0NPTlRFTlRTKTsKKwkgIGJyZWFrOworCWNhc2UgQ09SX1RZUEVfU1RBQ0s6CisJICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5zdGFjayI7CisJICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfTE9BRCArCisJCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMpOworCSAgYnJlYWs7CisJY2FzZSBDT1JfVFlQRV9MSUJEQVRBOgorCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIubGliZGF0YSI7CisJICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKKwkgIGJyZWFrOworCWNhc2UgQ09SX1RZUEVfV1JJVEU6CisJICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi53cml0ZWFibGUiOworCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7CisJICBicmVhazsKKwljYXNlIENPUl9UWVBFX01TQzoKKwkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLm1pc2MiOworCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmxhZ3MgPSAoU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUyk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIudW5rbm93biI7CisJICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPl9yYXdfc2l6ZSA9IGNvcmUtPmNkX3NlZ3NbaV0uY3NfbGVuOworICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+dm1hICAgICAgID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19hZGRyZXNzOworICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+ZmlsZXBvcyAgID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19vZmZzZXQ7CisgICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5hbGlnbm1lbnRfcG93ZXIgPSAyOworICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmV4dCAgICAgID0gTlVMTDsKKyAgICAgIGlmIChuID4gMCkKKwljb3JlX3NlY3Rpb24gKGFiZmQsIChuLTEpKS0+bmV4dCA9IGNvcmVfc2VjdGlvbiAoYWJmZCwgbik7CisKKyAgICAgIGFiZmQtPnNlY3Rpb25fY291bnQgPSArK247CisgICAgfQorCisgIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnMiI7CisKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7CisgIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKworICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZihjb3JlLT5jZF9yZWdzKTsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKGNvcmUtPmNkX2ZwcmVncyk7CisKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAtMTsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+dm1hID0gLTE7CisKKyAgLyogV2UnbGwgYWNjZXNzIHRoZSByZWdzIGFmcmVzaCBpbiB0aGUgY29yZSBmaWxlLCBsaWtlIGFueSBzZWN0aW9uOiAqLworICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpb2Zmc2V0b2Yoc3RydWN0IGNvcmVoZHIsY2RfcmVnc1swXSk7CisgIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpb2Zmc2V0b2Yoc3RydWN0IGNvcmVoZHIsCisJCQkJCQkgICAgY2RfZnByZWdzKTsKKworICAvKiBhZGQgdGhlIDIgcmVnIGZha2Ugc2VjdGlvbnMgdG8gYWJmZCAqLworICBhYmZkLT5zZWN0aW9uX2NvdW50ICs9IDI7CisgIGFiZmQtPnNlY3Rpb25zID0gY29yZV9yZWdzZWMgKGFiZmQpOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZzJzZWMgKGFiZmQpOworICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9zZWN0aW9uIChhYmZkLCAwKTsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKworc3RhdGljIGNoYXIgKgorYWl4Mzg2X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGNvcmVfaGRyIChhYmZkKS0+Y2RfY29tbTsKK30KKworc3RhdGljIGludAorYWl4Mzg2X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5jZF9jdXJzaWc7Cit9CisKK3N0YXRpYyBib29sZWFuCithaXgzODZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQ7CisgICAgIGJmZCAqZXhlY19iZmQ7Cit7CisgIHJldHVybiB0cnVlOwkJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMKKwkJCQkgICBwb2ludCAqLworfQorCisvKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCitzdGF0aWMgdm9pZAorc3dhcF9hYm9ydCgpCit7CisgIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLworfQorI2RlZmluZQlOT19HRVQJKChQUk9UTyhiZmRfdm1hLCAoKiksICggICAgICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKyNkZWZpbmUgTk9fR0VUUyAoKFBST1RPKGJmZF9zaWduZWRfdm1hLCAoKiksIChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19QVVQJKChQUk9UTyh2b2lkLCAgICAgICAgKCopLCAoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKworY29uc3QgYmZkX3RhcmdldCBhaXgzODZfY29yZV92ZWMgPQorICB7CisgICAgImFpeDM4Ni1jb3JlIiwKKyAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgICAgQkZEX0VORElBTkdfQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworICAgIDAsCQkJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICAgJyAnLAkJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgICAxNiwJCQkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAorICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULAorICAgIE5PX0dFVCwgTk9fR0VUUywgTk9fUFVULCAvKiBkYXRhICovCisgICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCisgICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCisgICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsIC8qIGhkcnMgKi8KKworICAgIHtfYmZkX2R1bW15X3RhcmdldCwgX2JmZF9kdW1teV90YXJnZXQsCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LCBhaXgzODZfY29yZV9maWxlX3B9LAorICAgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX2NyZWF0ZV9vYmplY3QgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2V9LAorICAgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChhaXgzODYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgICAgKFBUUikgMAorfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWFkb2JlLmMgYi9iZmQvYW91dC1hZG9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTFmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYW91dC1hZG9iZS5jCkBAIC0wLDAgKzEsNTI3IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0LmFkb2JlIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgQmFzZWQgb24gYm91dC5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgImFvdXQvYWRvYmUuaCIKKworI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsJCS8qIEZvcndhcmQgZGVjbCAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYW91dF9hZG9iZV9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOworCitleHRlcm4gYm9vbGVhbiBhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2V4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHZvaWQgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0KSk7CisKKy8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKKyAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCisKK3ZvaWQgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApKTsKKwkgCit2b2lkCithb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKKyAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7CisKKyAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KKyAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKKyAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOworICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7CisgIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOworICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7CisgIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7CisgIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOworICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKK30KKworLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHRoZQorICAgc3VwcGxpZWQgYnVmZmVyIHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suICAqLworCitQUk9UTyh2b2lkLCBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfb3V0LAorCSAgKGJmZCAqYWJmZCwKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCisJICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwordm9pZAorYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7CisgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKKworICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOworICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKK30KKworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCithb3V0X2Fkb2JlX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKKyAgY2hhciAqdGFyZzsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCisgICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKKyAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKKworICAvKiBOb3JtYWxseSB3ZSBqdXN0IGNvbXBhcmUgZm9yIHRoZSBtYWdpYyBudW1iZXIuCisgICAgIEhvd2V2ZXIsIGEgYnVuY2ggb2YgQWRvYmUgdG9vbHMgYXJlbid0IGZpeGVkIHVwIHlldDsgdGhleSBnZW5lcmF0ZQorICAgICBmaWxlcyB1c2luZyBaTUFHSUMoISkuCisgICAgIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQgaXMgc2V0IHRvICJhLm91dC5hZG9iZSIsIHdlIHdpbGwKKyAgICAgdGFrZSBqdXN0IGFib3V0IGFueSBhLm91dCBmaWxlIGFzIGFuIEFkb2JlIGEub3V0IGZpbGUuICBGSVhNRSEgICovCisKKyAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKSB7CisgICAgdGFyZyA9IGdldGVudiAoIkdOVVRBUkdFVCIpOworICAgIGlmICh0YXJnICYmICFzdHJjbXAgKHRhcmcsIGFfb3V0X2Fkb2JlX3ZlYy5uYW1lKSkKKyAgICAgIDsJCS8qIEp1c3QgY29udGludWUgYW55d2F5LCBpZiBzcGVjaWZpY2FsbHkgc2V0IHRvIHRoaXMgZm9ybWF0ICovCisgICAgZWxzZQorICAgICAgeworCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCXJldHVybiAwOworICAgICAgfQorICB9CisKKyAgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7CisgIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYW91dF9hZG9iZV9jYWxsYmFjayk7Cit9CisKKworLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQorICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorYW91dF9hZG9iZV9jYWxsYmFjayAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisgIGFzZWN0aW9uICpzZWN0OworICBzdHJ1Y3QgZXh0ZXJuYWxfc2VnZGVzYyBleHRbMV07CisgIGNoYXIgKnNlY3Rpb25fbmFtZTsKKyAgY2hhciB0cnlfYWdhaW5bMzBdOwkvKiBuYW1lIGFuZCBudW1iZXIgKi8KKyAgY2hhciAqbmV3bmFtZTsKKyAgaW50IHRyeW51bTsKKyAgZmxhZ3dvcmQgZmxhZ3M7CisKKyAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgLS0gdW5rbm93biBpbiB0aGlzIGZvcm1hdC4gICovCisgIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGJmZF9hcmNoX3Vua25vd24sIDApOworCisgIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KKyAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOworICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7CisKKyAgLyogU3VjayB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlLCBvbmUgc2VjdGlvbiBhdCBhIHRpbWUuICAqLworCisgIGZvciAoOzspIHsKKyAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dCwgMSwgc2l6ZW9mICgqZXh0KSwgYWJmZCkgIT0gc2l6ZW9mICgqZXh0KSkgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHN3aXRjaCAoZXh0LT5lX3R5cGVbMF0pIHsKKyAgICBjYXNlIE5fVEVYVDoKKyAgICAgIHNlY3Rpb25fbmFtZSA9ICIudGV4dCI7CisgICAgICBmbGFncyA9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fREFUQToKKyAgICAgIHNlY3Rpb25fbmFtZSA9ICIuZGF0YSI7CisgICAgICBmbGFncyA9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fQlNTOgorICAgICAgc2VjdGlvbl9uYW1lID0gIi5ic3MiOworICAgICAgZmxhZ3MgPSBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMDoKKyAgICAgIGdvdG8gbm9fbW9yZV9zZWN0aW9uczsKKworICAgIGRlZmF1bHQ6CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiJXM6IFVua25vd24gc2VjdGlvbiB0eXBlIGluIGEub3V0LmFkb2JlIGZpbGU6ICV4XG4iKSwgCisJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBleHQtPmVfdHlwZVswXSk7CisgICAgICBnb3RvIG5vX21vcmVfc2VjdGlvbnM7CisgICAgfQorCisgICAgLyogRmlyc3Qgb25lIGlzIGNhbGxlZCAiLnRleHQiIG9yIHdoYXRldmVyOyBzdWJzZXF1ZW50IG9uZXMgYXJlCisgICAgICAgIi50ZXh0MSIsICIudGV4dDIiLCAuLi4gKi8KKworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7CisgICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb25fbmFtZSk7CisgICAgdHJ5bnVtID0gMDsKKyAgICB3aGlsZSAoIXNlY3QpIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKKwlyZXR1cm4gMDsJLyogU29tZSBvdGhlciBlcnJvciAtLSBzbGlkZSBpbnRvIHRoZSBzdW5zZXQgKi8KKyAgICAgIHNwcmludGYgKHRyeV9hZ2FpbiwgIiVzJWQiLCBzZWN0aW9uX25hbWUsICsrdHJ5bnVtKTsKKyAgICAgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0cnlfYWdhaW4pOworICAgIH0KKworICAgIC8qIEZpeCB0aGUgbmFtZSwgaWYgaXQgaXMgYSBzcHJpbnRmJ2QgbmFtZS4gICovCisgICAgaWYgKHNlY3QtPm5hbWUgPT0gdHJ5X2FnYWluKSB7CisgICAgICBuZXduYW1lID0gKGNoYXIgKikgYmZkX3phbGxvYyhhYmZkLCBzdHJsZW4gKHNlY3QtPm5hbWUpKTsKKyAgICAgIGlmIChuZXduYW1lID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgICBzdHJjcHkgKG5ld25hbWUsIHNlY3QtPm5hbWUpOworICAgICAgc2VjdC0+bmFtZSA9IG5ld25hbWU7CisgICAgfQorCisgICAgLyogTm93IHNldCB0aGUgc2VjdGlvbidzIGF0dHJpYnV0ZXMuICAqLworICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCwgZmxhZ3MpOworICAgIHNlY3QtPl9yYXdfc2l6ZSA9ICgoZXh0LT5lX3NpemVbMF0gPDwgOCkJLyogQXNzdW1lZCBiaWctZW5kaWFuICovCisJCSAgICAgIHwgZXh0LT5lX3NpemVbMV0gPDwgOCkKKwkJICAgICAgfCBleHQtPmVfc2l6ZVsyXTsKKyAgICBzZWN0LT5fY29va2VkX3NpemUgPSBzZWN0LT5fcmF3X3NpemU7CisgICAgc2VjdC0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPmVfdmlydGJhc2UpOworICAgIHNlY3QtPmZpbGVwb3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+ZV9maWxlYmFzZSk7CisgICAgLyogRklYTUUgWFhYIGFsaWdubWVudD8gKi8KKworICAgIC8qIFNldCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBmaXJzdCBzZWN0aW9uIG9mIGVhY2ggdHlwZS4gICovCisgICAgaWYgKHRyeW51bSA9PSAwKSBzd2l0Y2ggKGV4dC0+ZV90eXBlWzBdKSB7CisgICAgY2FzZSBOX1RFWFQ6CisgICAgICBzZWN0LT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKKyAgICAgIHNlY3QtPnJlbG9jX2NvdW50ID0gZXhlY3AtPmFfdHJzaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fREFUQToKKyAgICAgIHNlY3QtPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGICgqZXhlY3ApOworICAgICAgc2VjdC0+cmVsb2NfY291bnQgPSBleGVjcC0+YV9kcnNpemU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK25vX21vcmVfc2VjdGlvbnM6ICAKKworICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKKyAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7CisgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLworICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KKyAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCB7CisgICAgc3RydWN0IGFvdXRkYXRhIGE7CisgICAgc3RydWN0IGludGVybmFsX2V4ZWMgZTsKK307CisKK3N0YXRpYyBib29sZWFuCithb3V0X2Fkb2JlX21rb2JqZWN0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7CisKKyAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKKyAgaWYgKHJhd3B0ciA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKKyAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKKworICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKKyAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7CisgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLworICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KKyAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworCisgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBib29sZWFuCithb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKKyAgc3RhdGljIHN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHNlbnRpbmVsWzFdOwkvKiBJbml0aWFsaXplZCB0byB6ZXJvICovCisgIGFzZWN0aW9uICpzZWN0OworCisgIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gWk1BR0lDOworCisgIC8qIENhbGN1bGF0ZSB0ZXh0IHNpemUgYXMgdG90YWwgb2YgdGV4dCBzZWN0aW9ucywgZXRjLiAqLworCisgIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gMDsKKyAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgPSAwOworICBleGVjX2hkciAoYWJmZCktPmFfYnNzICA9IDA7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSAwOworICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gMDsKKworICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKKyAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJeworICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgKz0gc2VjdC0+X3Jhd19zaXplOworICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSArPSBzZWN0LT5yZWxvY19jb3VudCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7CisgICAgfSBlbHNlIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7CisgICAgICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSArPSBzZWN0LT5fcmF3X3NpemU7CisgICAgICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplICs9IHNlY3QtPnJlbG9jX2NvdW50ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKKyAgICB9IGVsc2UgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0FMTE9DICYmICEoc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkpIHsKKyAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgICs9IHNlY3QtPl9yYXdfc2l6ZTsKKyAgICB9CisgIH0KKworICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpCisgICAgCQkJCSogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOworICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworCisgIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQorCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm93IHdyaXRlIG91dCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRleHQgZmlyc3QsIGRhdGEgbmV4dCwgcmVzdAorICAgICBhZnRlcndhcmQuICAqLworCisgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgeworICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7CisgICAgICBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpOworICAgIH0KKyAgfQorICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKKyAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJeworICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKKyAgICB9CisgIH0KKyAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7CisgICAgaWYgKCEoc2VjdC0+ZmxhZ3MgJiAoU0VDX0NPREV8U0VDX0RBVEEpKSkgeworICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKKyAgICB9CisgIH0KKworICAvKiBXcml0ZSBmaW5hbCBgc2VudGluZWxgIHNlY3Rpb24gaGVhZGVyICh3aXRoIHR5cGUgb2YgMCkuICAqLworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzZW50aW5lbCwgMSwgc2l6ZW9mICgqc2VudGluZWwpLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mICgqc2VudGluZWwpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAorICAgIHsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCisJICAhPSAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQorCSAgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgeworICAgICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJeworICAgICAgICAgIGlmICghYW91dF8zMl9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgc2VjdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCisJICAhPSAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7CisgICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7CisgICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCithb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0OworeworICAvKiBGSVhNRSBYWFggKi8KK30KKwwKK3N0YXRpYyBib29sZWFuCithb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIGZpbGVfcHRyIHNlY3Rpb25fc3RhcnQ7CisgIHNlY19wdHIgc2VjdDsKKworICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkgeyAvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLworCisgICAgLyogQXNzaWduIGZpbGUgb2Zmc2V0cyB0byBzZWN0aW9ucy4gIFRleHQgc2VjdGlvbnMgYXJlIGZpcnN0LCBhbmQKKyAgICAgICBhcmUgY29udGlndW91cy4gIFRoZW4gZGF0YSBzZWN0aW9ucy4gIEV2ZXJ5dGhpbmcgZWxzZSBhdCB0aGUgZW5kLiAgKi8KKworICAgIHNlY3Rpb25fc3RhcnQgPSBOX1RYVE9GRiAoaWdub3JlPC0tPm1lKTsKKworICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgeworICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKKyAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7CisJLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KKwlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKKyAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7CisgICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OworCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCisJc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7CisgICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTICYmCisJICAhKHNlY3QtPmZsYWdzICYgKFNFQ19DT0RFfFNFQ19EQVRBKSkpCXsKKyAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7CisJLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KKwlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGNvdW50ICE9IDApIHsKKyAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK2FvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKKyAgICAgYmZkICphYmZkOworICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOworeworICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bgorICAgICAgfHwgYXJjaCA9PSBiZmRfYXJjaF9tNjhrKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCAKK2FvdXRfYWRvYmVfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGJvb2xlYW4gaWdub3JlOworeworICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKK30KKworCisKKworLyogQnVpbGQgdGhlIHRyYW5zZmVyIHZlY3RvciBmb3IgQWRvYmUgQS5PdXQgZmlsZXMuICAqLworCisjZGVmaW5lIGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXAgYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbworCisjZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKKyAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCisKKyNkZWZpbmUgYW91dF8zMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAorICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBcCisgICAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBiZmRfbnVsbHZvaWRwdHIpCisKKyNkZWZpbmUJYW91dF8zMl9zZXRfYXJjaF9tYWNoCQlhb3V0X2Fkb2JlX3NldF9hcmNoX21hY2gKKyNkZWZpbmUJYW91dF8zMl9zZXRfc2VjdGlvbl9jb250ZW50cwlhb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzCisKKyNkZWZpbmUJYW91dF8zMl9zaXplb2ZfaGVhZGVycwkJYW91dF9hZG9iZV9zaXplb2ZfaGVhZGVycworI2RlZmluZSBhb3V0XzMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxheF9zZWN0aW9uICAgICAgIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgYW91dF8zMl9iZmRfZ2Nfc2VjdGlvbnMgICAgICAgICBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucworI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKyAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBhb3V0XzMyX2JmZF9maW5hbF9saW5rCQlfYmZkX2dlbmVyaWNfZmluYWxfbGluaworI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24JX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorCitjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYyA9Cit7CisgICJhLm91dC5hZG9iZSIsCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyB1bmtub3duIChiaWcgYXNzdW1lZCkgKi8KKyAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAorICAvKiBzZWN0aW9uIGZsYWdzICovCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JFTE9DKSwKKyAgJ18nLAkJCQkvKiAgc3ltYm9sIGxlYWRpbmcgY2hhciAqLworICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworIHtfYmZkX2R1bW15X3RhcmdldCwgYW91dF9hZG9iZV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisge2JmZF9mYWxzZSwgYW91dF9hZG9iZV9ta29iamVjdCwgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisge2JmZF9mYWxzZSwgYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChhb3V0XzMyKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpIDAKK307CmRpZmYgLS1naXQgYS9iZmQvYW91dC1hcm0uYyBiL2JmZC9hb3V0LWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjkwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYW91dC1hcm0uYwpAQCAtMCwwICsxLDU0NiBAQAorLyogQkZEIGJhY2stZW5kIGZvciByYXcgQVJNIGEub3V0IGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKyAgIAorVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKyAgKChOX01BR0lDKHgpID09IE5NQUdJQykgPyAweDgwMDAgOiBcCisgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMpID8gMCA6IFwKKyAgIChOX1NIQVJFRF9MSUIoeCkpID8gKCh4KS5hX2VudHJ5ICYgfihUQVJHRVRfUEFHRV9TSVpFIC0gMSkpIDogXAorICAgVEVYVF9TVEFSVF9BRERSKQorCisjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAweDgwMDAKKyNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDgwMDAKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2FybQorCisjZGVmaW5lIE1ZKE9QKSBDQVQoYW91dGFybV8sT1ApCisjZGVmaW5lIE5fQkFETUFHKHgpICgoKCh4KS5hX2luZm8gJiB+MDA3MjAwKSAhPSBaTUFHSUMpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICgoKHgpLmFfaW5mbyAmIH4wMDYwMDApICE9IE9NQUdJQykgJiYgXAorICAgICAgICAgICAgICAgICAgICAgKCh4KS5hX2luZm8gIT0gTk1BR0lDKSkKKyNkZWZpbmUgTl9NQUdJQyh4KSAoKHgpLmFfaW5mbyAmIH4wNzIwMCkKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisjZGVmaW5lIE1ZQVJNKE9QKSBDQVQoYW91dGFybV8sT1ApCityZWxvY19ob3d0b190eXBlIAkqTVlBUk0oYmZkX3JlbG9jX3R5cGVfbG9va3VwKQorCQkJCVBBUkFNUygoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOworc3RhdGljIGJvb2xlYW4gCQlNWUFSTSh3cml0ZV9vYmplY3RfY29udGVudHMpCVBBUkFNUygoYmZkICopKTsKKworLyogQXZvaWQgbXVsdGlwbGUgZGVmaW5pbml0aW9ucyBmcm9tIGFvdXR4IGlmIHN1cHBvcnRpbmcgc3RhbmRhcmFkIGEub3V0IAorICAgYXMgd2VsbCBhcyBvdXIgb3duLiAgKi8KKyNkZWZpbmUgTkFNRSh4LHkpIENBVDMoYW91dGFybSxfMzJfLHkpCisKKyNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFvdXRhcm1fYmZkX3JlbG9jX3R5cGVfbG9va3VwCisKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorTVkoZml4X3BjcmVsXzI2X2RvbmUpCVBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAorCQkJCSBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitNWShmaXhfcGNyZWxfMjYpCSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKKwkJCQkgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgdm9pZCBNWShzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKKwkJCQkJICAgYXJlbGVudCAqLCBhc3ltYm9sICoqLAorCQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7Cit2b2lkIE1ZKHN3YXBfc3RkX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgCisJCQkJICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopKTsKKworcmVsb2NfaG93dG9fdHlwZSBNWShob3d0b190YWJsZSlbXSA9Cit7CisgIC8qIHR5cGUgcnMgc2l6ZSBic3ogcGNyZWwgYml0cG9zIG92cmYgc2YgbmFtZSBwYXJ0X2lucGwgcmVhZG1hc2sgc2V0bWFzaworICAgICBwY2RvbmUgKi8KKyAgSE9XVE8gKDAsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLCB0cnVlLAorCSAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPICgxLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLCB0cnVlLAorCSAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPICgyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLCB0cnVlLAorCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPICgzLCAyLCAyLCAyNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBNWShmaXhfcGNyZWxfMjYpLAorCSAiQVJNMjYiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCB0cnVlKSwKKyAgSE9XVE8gKDQsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgdHJ1ZSwKKwkgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCisgIEhPV1RPICg1LCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDE2IiwgdHJ1ZSwKKwkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgdHJ1ZSksCisgIEhPV1RPICg2LCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgdHJ1ZSwKKwkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSksCisgIEhPV1RPICg3LCAyLCAyLCAyNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKKwkgTVkoZml4X3BjcmVsXzI2X2RvbmUpLCAiQVJNMjZEIiwgdHJ1ZSwgMHgwLCAweDAsCisJIGZhbHNlKSwKKyAgey0xfSwKKyAgSE9XVE8gKDksIDAsIC0xLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiTkVHMTYiLCB0cnVlLAorCSAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPICgxMCwgMCwgLTIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJORUczMiIsIHRydWUsCisJIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKQorfTsKKworI2RlZmluZSBSRUxPQ19BUk1fQklUU19ORUdfQklHICAgICAgKCh1bnNpZ25lZCBpbnQpIDB4MDgpCisjZGVmaW5lIFJFTE9DX0FSTV9CSVRTX05FR19MSVRUTEUgICAoKHVuc2lnbmVkIGludCkgMHgxMCkKKworcmVsb2NfaG93dG9fdHlwZSAqCitNWShyZWxvY19ob3d0bykoYWJmZCwgcmVsLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWw7CisgICAgIGludCAqcl9pbmRleDsKKyAgICAgaW50ICpyX2V4dGVybjsKKyAgICAgaW50ICpyX3BjcmVsOworeworICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7CisgIHVuc2lnbmVkIGludCByX3BjcmVsX2RvbmU7CisgIHVuc2lnbmVkIGludCByX25lZzsKKyAgaW50IGluZGV4OworCisgICpyX3BjcmVsID0gMDsKKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisgICAgeworICAgICAgKnJfaW5kZXggICAgID0gICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQorCQkgICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCisJCSAgICAgICB8IHJlbC0+cl9pbmRleFsyXSk7CisgICAgICAqcl9leHRlcm4gICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7CisgICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKKyAgICAgIHJfbmVnIAkgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0FSTV9CSVRTX05FR19CSUcpKTsKKyAgICAgIHJfbGVuZ3RoICAgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQorCQkgICAgICA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcl9pbmRleCAgICAgPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKKwkJICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCisJCSAgICAgIHwgcmVsLT5yX2luZGV4WzBdKTsKKyAgICAgICpyX2V4dGVybiAgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKKyAgICAgIHJfcGNyZWxfZG9uZSA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOworICAgICAgcl9uZWcgCSAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfQVJNX0JJVFNfTkVHX0xJVFRMRSkpOworICAgICAgcl9sZW5ndGggICAgID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpCisJCSAgICAgID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOworICAgIH0KKyAgaW5kZXggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsX2RvbmUgKyA4ICogcl9uZWc7CisgIGlmIChpbmRleCA9PSAzKQorICAgICpyX3BjcmVsID0gMTsKKworICByZXR1cm4gTVkoaG93dG9fdGFibGUpICsgaW5kZXg7Cit9CisgCisjZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCwgUkVMLCBJTiwgRVgsIFBDKSBcCisJTVkocmVsb2NfaG93dG8pIChCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKKwordm9pZAorTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgcl9leHRlcm47CisgICAgIGludCByX2luZGV4OworICAgICBsb25nIHZhbHVlOworICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Cit7CisgIHVuc2lnbmVkIGludCByX2xlbmd0aDsKKyAgaW50IHJfcGNyZWw7CisgIGludCByX25lZzsKKworICBQVVRfV09SRCAoYWJmZCwgdmFsdWUsIHJlbG9jLT5yX2FkZHJlc3MpOworICByX2xlbmd0aCA9IGhvd3RvLT5zaXplIDsJLyogU2l6ZSBhcyBhIHBvd2VyIG9mIHR3byAqLworCisgIC8qIFNwZWNpYWwgY2FzZSBmb3IgYnJhbmNoIHJlbG9jYXRpb25zLiAqLworICBpZiAoaG93dG8tPnR5cGUgPT0gMyB8fCBob3d0by0+dHlwZSA9PSA3KQorICAgIHJfbGVuZ3RoID0gMzsKKworICByX3BjcmVsICA9IGhvd3RvLT50eXBlICYgNDsgCS8qIFBDIFJlbGF0aXZlIGRvbmU/ICovCisgIHJfbmVnID0gaG93dG8tPnR5cGUgJiA4OwkvKiBOZWdhdGl2ZSByZWxvY2F0aW9uICovCisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgIHsKKyAgICAgIHJlbG9jLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKKyAgICAgIHJlbG9jLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OworICAgICAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4OworICAgICAgcmVsb2MtPnJfdHlwZVswXSA9CisJKChyX2V4dGVybiA/ICAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHIDogMCkKKwkgfCAocl9wY3JlbCA/ICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRyA6IDApCisJIHwgKHJfbmVnID8JIFJFTE9DX0FSTV9CSVRTX05FR19CSUcgOiAwKQorCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlbG9jLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKyAgICAgIHJlbG9jLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OworICAgICAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OworICAgICAgcmVsb2MtPnJfdHlwZVswXSA9CisJKChyX2V4dGVybiA/ICAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKKwkgfCAocl9wY3JlbCA/ICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSA6IDApCisJIHwgKHJfbmVnID8JIFJFTE9DX0FSTV9CSVRTX05FR19MSVRUTEUgOiAwKQorCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOworICAgIH0KK30KKyAKKyNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCisgIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCisKK3ZvaWQKK01ZKHJlbG9jYXRhYmxlX3JlbG9jKShob3d0bywgYWJmZCwgcmVsb2MsIGFtb3VudCwgcl9hZGRyKQorICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvYzsKKyAgICAgYmZkX3ZtYSAqYW1vdW50OworICAgICBiZmRfdm1hIHJfYWRkcjsKK3sKKyAgaWYgKGhvd3RvLT50eXBlID09IDMpCisgICAgeworICAgICAgaWYgKHJlbG9jLT5yX3R5cGVbMF0gCisJICAmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpCisJICAgICA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSkKKwl7CisJICAvKiBUaGUgcmVsb2MgaXMgc3RpbGwgZXh0ZXJuYWwsIHNvIGRvbid0IG1vZGlmeSBhbnl0aGluZy4gKi8KKwkgICphbW91bnQgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqYW1vdW50IC09IHJfYWRkcjsKKwkgIC8qIENoYW5nZSB0aGUgcl9wY3JlbCB2YWx1ZSAtLSBvbiB0aGUgQVJNLCB0aGlzIGJpdCBpcyBzZXQgb25jZSB0aGUKKwkgICAgIHJlbG9jYXRpb24gaXMgZG9uZS4gICovCisJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKKwkgICAgcmVsb2MtPnJfdHlwZVswXSB8PSBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc7CisJICBlbHNlCisJICAgIHJlbG9jLT5yX3R5cGVbMF0gfD0gUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGhvd3RvLT50eXBlID09IDcpCisgICAgKmFtb3VudCA9IDA7Cit9CisKKyNkZWZpbmUgTVlfcmVsb2NhdGFibGVfcmVsb2MoSE9XLCBCRkQsIFJFTCwgQU1PVU5ULCBBRERSKSBcCisgIE1ZKHJlbG9jYXRhYmxlX3JlbG9jKShIT1csIEJGRCwgUkVMLCAmKEFNT1VOVCksIEFERFIpCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK01ZKGZpeF9wY3JlbF8yNl9kb25lKSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitNWShmaXhfcGNyZWxfMjYpIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisgIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOworICAKKyAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KKyAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQorICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKKyAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCisgIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQorICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKKyAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7CisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisgIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiAtPSBhZGRyOworICBpZiAocmVsb2NhdGlvbiAmIDMpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQorICAgIHsKKyAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCisJZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICB9CisgIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKKyAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCisgIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKKyAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgorICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCisgIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZNWShob3d0b190YWJsZSlbN107CisgIAorICByZXR1cm4gZmxhZzsKK30KKworcmVsb2NfaG93dG9fdHlwZSAqCitNWShiZmRfcmVsb2NfdHlwZV9sb29rdXApKGFiZmQsY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyNkZWZpbmUgQVNURChpLGopICAgICAgIGNhc2UgaTogcmV0dXJuICZNWShob3d0b190YWJsZSlbal0KKyAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCisgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCisgICAgICB7CisgICAgICBjYXNlIDMyOgorICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOworICAgICAgfQorCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICBBU1REIChCRkRfUkVMT0NfMTYsIDEpOworICAgICAgQVNURCAoQkZEX1JFTE9DXzMyLCAyKTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAzKTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCA0KTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgNSk7CisgICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsIDYpOworICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOworICAgIH0KK30KKworI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKKyNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKKyNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCisvKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlICovCisvKiAjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzICovCisvKiAjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rICovCisKKyNpbmNsdWRlICJhb3V0eC5oIgorCitzdGF0aWMgdm9pZAorTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OworeworICBpbnQgcl9pbmRleDsKKyAgaW50IHJfZXh0ZXJuOworICBpbnQgcl9wY3JlbDsKKyAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKKworICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOworCisgIGNhY2hlX3B0ci0+aG93dG8gPSBNWV9yZWxvY19ob3d0byAoYWJmZCwgYnl0ZXMsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKTsKKworICBNT1ZFX0FERFJFU1MgKDApOworfQorCit2b2lkCitNWV9zd2FwX3N0ZF9yZWxvY19vdXQgKGFiZmQsIGcsIG5hdHB0cikKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpnOworICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHI7Cit7CisgIGludCByX2luZGV4OworICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKKyAgaW50IHJfZXh0ZXJuOworICBpbnQgcl9sZW5ndGg7CisgIGludCByX3BjcmVsOworICBpbnQgcl9uZWcgPSAwOwkvKiBOZWdhdGl2ZSByZWxvY3MgdXNlIHRoZSBCQVNFUkVMIGJpdC4gICovCisgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisKKyAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOworCisgIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOyAgIC8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KKyAgaWYgKHJfbGVuZ3RoIDwgMCkKKyAgICB7CisgICAgICByX2xlbmd0aCA9IC1yX2xlbmd0aDsKKyAgICAgIHJfbmVnID0gMTsKKyAgICB9CisKKyAgcl9wY3JlbCAgPSAoaW50KSBnLT5ob3d0by0+cGNfcmVsYXRpdmU7IC8qIFJlbGF0aXZlIHRvIFBDPyAqLworCisgIC8qIEZvciBSSVNDIGlYLCBpbiBwYy1yZWxhdGl2ZSByZWxvY3MgdGhlIHJfcGNyZWwgYml0IG1lYW5zIHRoYXQgdGhlCisgICAgIHJlbG9jYXRpb24gaGFzIGJlZW4gZG9uZSBhbHJlYWR5IChPbmx5IGZvciB0aGUgMjYtYml0IG9uZSBJIHRoaW5rKT8/PyEhIQorICAgICAqLworCisgIGlmIChnLT5ob3d0by0+dHlwZSA9PSAzKQorICAgIHsKKyAgICAgIHJfbGVuZ3RoID0gMzsKKyAgICAgIHJfcGNyZWwgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoZy0+aG93dG8tPnR5cGUgPT0gNykKKyAgICB7IAorICAgICAgcl9sZW5ndGggPSAzOworICAgICAgcl9wY3JlbCA9IDE7CisgICAgfQorICAKKworI2lmIDAKKyAgLyogRm9yIGEgc3RhbmRhcmQgcmVsb2MsIHRoZSBhZGRlbmQgaXMgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KKyAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworI2VuZGlmCisKKyAgLyogbmFtZSB3YXMgY2xvYmJlcmVkIGJ5IGFvdXRfd3JpdGVfc3ltcyB0byBiZSBzeW1ib2wgaW5kZXggKi8KKworICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgdGhlbiBzZXQgdGhlCisgICAgIHJfaW5kZXggdG8gdGhlIHN5bWJvbHMgaW5kZXgsIGFuZCB0aGUgcl9leHRlcm4gYml0LgorCisgICAgIEFic29sdXRlIHN5bWJvbHMgY2FuIGNvbWUgaW4gaW4gdHdvIHdheXMsIGVpdGhlciBhcyBhbiBvZmZzZXQKKyAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24sIG9yIGFzIGEgc3ltYm9sIHdoaWNoIGhhcyBhbiBhYnMgdmFsdWUuCisgICAgIGNoZWNrIGZvciB0aGF0IGhlcmUKKyAgICAgKi8KKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKKyAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24KKyAgICAgIHx8IG91dHB1dF9zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24pCisgICAgeworICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbi5zeW1ib2wgPT0gc3ltKQorCXsKKwkgIC8qIFdob29wcywgbG9va2VkIGxpa2UgYW4gYWJzIHN5bWJvbCwgYnV0IGlzIHJlYWxseSBhbiBvZmZzZXQKKwkgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCisJICByX2luZGV4ID0gMDsKKwkgIHJfZXh0ZXJuID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KKwkgIHJfZXh0ZXJuID0gMTsKKwkgIHJfaW5kZXggPSAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLworICAgICAgcl9leHRlcm4gPSAwOworICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworICAgIH0KKworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKKyAgICB7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OworICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OworICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleDsKKyAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KKwkoICAocl9leHRlcm4gPyAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc6IDApCisJIHwgKHJfcGNyZWwgID8gICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCisJIHwgKHJfbmVnICAgID8gICBSRUxPQ19BUk1fQklUU19ORUdfQklHOiAwKQorCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OworICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQorCSggIChyX2V4dGVybiA/ICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKKwkgfCAocl9wY3JlbCAgPyAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTogMCkKKwkgfCAocl9uZWcgICAgPyAgIFJFTE9DX0FSTV9CSVRTX05FR19MSVRUTEU6IDApCisJIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7CisgICAgfQorfQorCisjZGVmaW5lIE1ZX0JGRF9UQVJHRVQKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCisKK2NvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fbGl0dGxlX3ZlYyA9Cit7CisgICJhLm91dC1hcm0tbGl0dGxlIiwgICAgICAgICAgIC8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyIChsaXR0bGUpICovCisgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8ICAgICAgICAgLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKKyAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKKyAgQVJfUEFEX0NIQVIsICAgICAgICAgICAgICAgICAgLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisgICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAorICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LCAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisgICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKE1ZKSwKKworICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCit9OworCitjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2JpZ192ZWMgPQoreworICAiYS5vdXQtYXJtLWJpZyIsICAgICAgICAgICAvKiBuYW1lICovCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0JJRywgICAgICAgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLworICBCRkRfRU5ESUFOX0JJRywgICAgICAgICAgICAgICAvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChiaWcpICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAgIC8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCisgIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCisgIEFSX1BBRF9DSEFSLCAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCisgIDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKKyAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAorICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCisKKyAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LWVuY2FwLmMgYi9iZmQvYW91dC1lbmNhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWY5MDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FvdXQtZW5jYXAuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogQkZEIGJhY2stZW5kIGZvciBhLm91dCBmaWxlcyBlbmNhcHN1bGF0ZWQgd2l0aCBDT0ZGIGhlYWRlcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVEhJUyBNT0RVTEUgSVMgTk9UIEZJTklTSEVELiAgSVQgUFJPQkFCTFkgRE9FU04nVCBFVkVOIENPTVBJTEUuICAqLworCisjaWYgMAorI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKKyNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CisjZW5kaWYKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgPHN5c2RlcC5oPgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgPGFvdXQvYW91dDY0Lmg+CisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorI2luY2x1ZGUgImFvdXQvYXIuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisKK2NvbnN0IGJmZF90YXJnZXQgKmVuY2FwX3JlYWxfY2FsbGJhY2sgKCk7CisKK2NvbnN0IGJmZF90YXJnZXQgKgorZW5jYXBfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgdW5zaWduZWQgY2hhciBtYWdpY2J1Zls0XTsgLyogUmF3IGJ5dGVzIG9mIG1hZ2ljIG51bWJlciBmcm9tIGZpbGUgKi8KKyAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFN3YXBwZWQgbWFnaWMgbnVtYmVyICovCisgIHNob3J0IGNvZmZfbWFnaWM7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGV4ZWM7CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKW1hZ2ljYnVmLCAxLCBzaXplb2YgKG1hZ2ljYnVmKSwgYWJmZCkgIT0KKyAgICAgIHNpemVvZiAobWFnaWNidWYpKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIGNvZmZfbWFnaWMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIG1hZ2ljYnVmKTsKKyAgaWYgKGNvZmZfbWFnaWMgIT0gQ09GRl9NQUdJQykKKyAgICByZXR1cm4gMDsJCQkvKiBOb3QgYW4gZW5jYXAgY29mZiBmaWxlICovCisKKyAgX19oZWFkZXJfb2Zmc2V0X3RlbXA9PUNPRkZfTUFHSUMgPyBzaXplb2Yoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKKyAgKGZzZWVrICgoZiksIEhFQURFUl9PRkZTRVQoKGYpKSwgMSkpCisKKyAgbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIG1hZ2ljYnVmKTsKKworICBpZiAoTl9CQURNQUcgKCooKHN0cnVjdCBpbnRlcm5hbF9leGVjICopICZtYWdpYykpKSByZXR1cm4gMDsKKworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCisgICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKKyAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKKworICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZleGVjLCBlbmNhcF9yZWFsY2FsbGJhY2spOworfQorCisvKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYSBlbmNhcHN1bGF0ZWQtY29mZiBhLm91dCBmaWxlIGhlYWRlciAqLworY29uc3QgYmZkX3RhcmdldCAqCitlbmNhcF9yZWFsX2NhbGxiYWNrIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKyAgCisgIE1ZKGNhbGxiYWNrKShhYmZkLCBleGVjcCk7CisgIAorICAvKiBJZiB3ZSBoYXZlIGEgY29mZiBoZWFkZXIsIGl0IGNhbiBnaXZlIHVzIGJldHRlciB2YWx1ZXMgZm9yCisgICAgIHRleHRfc3RhcnQgYW5kIGV4ZWNfZGF0YV9zdGFydC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAorICAgICBmb3IgcmVtb3RlIGRlYnVnZ2luZyBvZiBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KKyAgaWYgKE5fRkxBR1MoZXhlY19hb3V0aGRyKSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkKKyAgeworCSAgc3RydWN0IGNvZmZoZWFkZXIgY2g7CisJICBpbnQgdmFsOworCSAgdmFsID0gbHNlZWsgKGV4ZWNjaGFuLCAtKHNpemVvZiAoQU9VVEhEUikgKyBzaXplb2YgKGNoKSksIDEpOworCSAgaWYgKHZhbCA9PSAtMSkKKwkJICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisJICB2YWwgPSBteXJlYWQgKGV4ZWNjaGFuLCAmY2gsIHNpemVvZiAoY2gpKTsKKwkgIGlmICh2YWwgPCAwKQorCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKwkgIHRleHRfc3RhcnQgPSBjaC50ZXh0X3N0YXJ0OworCSAgZXhlY19kYXRhX3N0YXJ0ID0gY2guZGF0YV9zdGFydDsKKyAgfSBlbHNlCisJIHsKKwkgIHRleHRfc3RhcnQgPQorCSAgICBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKSA/IDAgOiBOX1RYVEFERFIgKGV4ZWNfYW91dGhkcik7CisJICBleGVjX2RhdGFfc3RhcnQgPSBJU19PQkpFQ1RfRklMRSAoZXhlY19hb3V0aGRyKQorCSAgICA/IGV4ZWNfYW91dGhkci5hX3RleHQgOiBOX0RBVEFERFIgKGV4ZWNfYW91dGhkcik7CisgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7IC8qIEZJWE1FICovCisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKKy8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEVuY2Fwc3VsYXRlZCBDT0ZGIGZvcm1hdC4KKyAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQorICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KKworYm9vbGVhbgorZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQgPSAwOworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisKKy8qKioqKiogRklYTUU6ICBGcmFnbWVudHMgZnJvbSB0aGUgb2xkIEdOVSBMRCBwcm9ncmFtIGZvciBkZWFsaW5nIHdpdGgKKyAgICAgICAgZW5jYXAgY29mZi4gICovCitzdHJ1Y3QgY29mZmhlYWRlciBjb2ZmaGVhZGVyOworaW50IG5lZWRfY29mZl9oZWFkZXI7CisKKyAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgdG8gY291bnQgdGhlIGhlYWRlciBhcyBwYXJ0IG9mCisgICAgIHRoZSB0ZXh0IHNpemUsIGFuZCBpbml0aWFsaXplIHRoZSB0ZXh0IHNpemUgYWNjb3JkaW5nbHkuCisgICAgIFRoaXMgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBzeXN0ZW0gYW5kIG9uIHRoZSBvdXRwdXQgZm9ybWF0IHNlbGVjdGVkLiAgKi8KKworICBOX1NFVF9NQUdJQyAob3V0aGVhZGVyLCBtYWdpYyk7CisjaWZkZWYgSU5JVElBTElaRV9IRUFERVIKKyAgSU5JVElBTElaRV9IRUFERVI7CisjZW5kaWYKKworICB0ZXh0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleGVjKTsKKyNpZmRlZiBDT0ZGX0VOQ0FQU1VMQVRFCisgIGlmIChyZWxvY2F0YWJsZV9vdXRwdXQgPT0gMCAmJiBmaWxlX3RhYmxlWzBdLmp1c3Rfc3ltc19mbGFnID09IDApCisgICAgeworICAgICAgbmVlZF9jb2ZmX2hlYWRlciA9IDE7CisgICAgICAvKiBzZXQgdGhpcyBmbGFnIG5vdywgc2luY2UgaXQgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBOX1RYVE9GRiwgZXRjICovCisgICAgICBOX1NFVF9GTEFHUyAob3V0aGVhZGVyLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKKyAgICAgIHRleHRfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKKyAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCisgICAgeworICAgICAgLyogV2UgYXJlIGVuY2Fwc3VsYXRpbmcgQlNEIGZvcm1hdCB3aXRoaW4gQ09GRiBmb3JtYXQuICAqLworICAgICAgc3RydWN0IGNvZmZzY24gKnRwLCAqZHAsICpicDsKKworICAgICAgdHAgPSAmY29mZmhlYWRlci5zY25zWzBdOworICAgICAgZHAgPSAmY29mZmhlYWRlci5zY25zWzFdOworICAgICAgYnAgPSAmY29mZmhlYWRlci5zY25zWzJdOworCisgICAgICBzdHJjcHkgKHRwLT5zX25hbWUsICIudGV4dCIpOworICAgICAgdHAtPnNfcGFkZHIgPSB0ZXh0X3N0YXJ0OworICAgICAgdHAtPnNfdmFkZHIgPSB0ZXh0X3N0YXJ0OworICAgICAgdHAtPnNfc2l6ZSA9IHRleHRfc2l6ZTsKKyAgICAgIHRwLT5zX3NjbnB0ciA9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYyk7CisgICAgICB0cC0+c19yZWxwdHIgPSAwOworICAgICAgdHAtPnNfbG5ub3B0ciA9IDA7CisgICAgICB0cC0+c19ucmVsb2MgPSAwOworICAgICAgdHAtPnNfbmxubm8gPSAwOworICAgICAgdHAtPnNfZmxhZ3MgPSAweDIwOworICAgICAgc3RyY3B5IChkcC0+c19uYW1lLCAiLmRhdGEiKTsKKyAgICAgIGRwLT5zX3BhZGRyID0gZGF0YV9zdGFydDsKKyAgICAgIGRwLT5zX3ZhZGRyID0gZGF0YV9zdGFydDsKKyAgICAgIGRwLT5zX3NpemUgPSBkYXRhX3NpemU7CisgICAgICBkcC0+c19zY25wdHIgPSB0cC0+c19zY25wdHIgKyB0cC0+c19zaXplOworICAgICAgZHAtPnNfcmVscHRyID0gMDsKKyAgICAgIGRwLT5zX2xubm9wdHIgPSAwOworICAgICAgZHAtPnNfbnJlbG9jID0gMDsKKyAgICAgIGRwLT5zX25sbm5vID0gMDsKKyAgICAgIGRwLT5zX2ZsYWdzID0gMHg0MDsKKyAgICAgIHN0cmNweSAoYnAtPnNfbmFtZSwgIi5ic3MiKTsKKyAgICAgIGJwLT5zX3BhZGRyID0gZHAtPnNfdmFkZHIgKyBkcC0+c19zaXplOworICAgICAgYnAtPnNfdmFkZHIgPSBicC0+c19wYWRkcjsKKyAgICAgIGJwLT5zX3NpemUgPSBic3Nfc2l6ZTsKKyAgICAgIGJwLT5zX3NjbnB0ciA9IDA7CisgICAgICBicC0+c19yZWxwdHIgPSAwOworICAgICAgYnAtPnNfbG5ub3B0ciA9IDA7CisgICAgICBicC0+c19ucmVsb2MgPSAwOworICAgICAgYnAtPnNfbmxubm8gPSAwOworICAgICAgYnAtPnNfZmxhZ3MgPSAweDgwOworCisgICAgICBjb2ZmaGVhZGVyLmZfbWFnaWMgPSBDT0ZGX01BR0lDOworICAgICAgY29mZmhlYWRlci5mX25zY25zID0gMzsKKyAgICAgIC8qIHN0b3JlIGFuIHVubGlrZWx5IHRpbWUgc28gcHJvZ3JhbXMgY2FuCisgICAgICAgKiB0ZWxsIHRoYXQgdGhlcmUgaXMgYSBic2QgaGVhZGVyCisgICAgICAgKi8KKyAgICAgIGNvZmZoZWFkZXIuZl90aW1kYXQgPSAxOworICAgICAgY29mZmhlYWRlci5mX3N5bXB0ciA9IDA7CisgICAgICBjb2ZmaGVhZGVyLmZfbnN5bXMgPSAwOworICAgICAgY29mZmhlYWRlci5mX29wdGhkciA9IDI4OworICAgICAgY29mZmhlYWRlci5mX2ZsYWdzID0gMHgxMDM7CisgICAgICAvKiBhb3V0aGRyICovCisgICAgICBjb2ZmaGVhZGVyLm1hZ2ljID0gWk1BR0lDOworICAgICAgY29mZmhlYWRlci52c3RhbXAgPSAwOworICAgICAgY29mZmhlYWRlci50c2l6ZSA9IHRwLT5zX3NpemU7CisgICAgICBjb2ZmaGVhZGVyLmRzaXplID0gZHAtPnNfc2l6ZTsKKyAgICAgIGNvZmZoZWFkZXIuYnNpemUgPSBicC0+c19zaXplOworICAgICAgY29mZmhlYWRlci5lbnRyeSA9IG91dGhlYWRlci5hX2VudHJ5OworICAgICAgY29mZmhlYWRlci50ZXh0X3N0YXJ0ID0gdHAtPnNfdmFkZHI7CisgICAgICBjb2ZmaGVhZGVyLmRhdGFfc3RhcnQgPSBkcC0+c192YWRkcjsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKKyAgaWYgKG5lZWRfY29mZl9oZWFkZXIpCisgICAgbXl3cml0ZSAoJmNvZmZoZWFkZXIsIHNpemVvZiBjb2ZmaGVhZGVyLCAxLCBvdXRkZXNjKTsKKyNlbmRpZgorCisjaWZuZGVmIENPRkZfRU5DQVBTVUxBVEUKKyAgcGFkZmlsZSAoTl9UWFRPRkYgKG91dGhlYWRlcikgLSBzaXplb2Ygb3V0aGVhZGVyLCBvdXRkZXNjKTsKKyNlbmRpZgorCisgIHRleHRfc2l6ZSAtPSBOX1RYVE9GRiAob3V0aGVhZGVyKTsKKyAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50IGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cworI2RlZmluZSBNWV9vYmplY3RfcCBlbmNhcF9vYmplY3RfcAorI2RlZmluZSBNWV9leGVjX2hkcl9mbGFncyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC1uczMyay5jIGIvYmZkL2FvdXQtbnMzMmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTMzNWFhCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FvdXQtbnMzMmsuYwpAQCAtMCwwICsxLDM3MCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBuczMyayBhLm91dC1pc2ggYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IElhbiBEYWxsIChpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCisjaW5jbHVkZSAibnMzMmsuaCIKKworI2RlZmluZSBNWU5TKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKK3JlbG9jX2hvd3RvX3R5cGUgKgorTVlOUyhiZmRfcmVsb2NfdHlwZV9sb29rdXApCisgIFBBUkFNUygoYmZkICphYmZkIEFORAorCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKKworYm9vbGVhbgorTVlOUyh3cml0ZV9vYmplY3RfY29udGVudHMpCisgIFBBUkFNUygoYmZkICphYmZkKSk7CisKKy8qIEF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyZCBhLm91dCBmb3JtYXQocykKKyAqIGFzIHdlbGwgYXMgdGhpcyBvbmUKKyAqLworI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhuczMya2FvdXQsXzMyXyx5KQorCit2b2lkIGJmZF9uczMya19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKKworI2luY2x1ZGUgImxpYmFvdXQuaCIKKworI2RlZmluZSBNWShPUCkgTVlOUyhPUCkKKworI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKKyNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKKworc3RhdGljIHZvaWQKK01ZX3N3YXBfc3RkX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXMsCisJCQkgICAgICBhcmVsZW50ICpjYWNoZV9wdHIsIGFzeW1ib2wgKipzeW1ib2xzLAorCQkJICAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCkpOworCitzdGF0aWMgdm9pZAorTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqZywKKwkJCSAgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHIpKTsKKworLyogVGhlIG5zMzJrIHNlcmllcyBpcyBhaCwgdW51c3VhbCwgd2hlbiBpdCBjb21lcyB0byByZWxvY2F0aW9uLgorICogVGhlcmUgYXJlIHRocmVlIHN0b3JhZ2UgbWV0aG9kcyBmb3IgcmVsb2NhdGVhYmxlIG9iamVjdHMuICBUaGVyZQorICogYXJlIGRpc3BsYWNlbWVudHMsIGltbWVkaWF0ZSBvcGVyYW5kcyBhbmQgb3JkaW5hcnkgdHdvcyBjb21wbGVtZW50CisgKiBkYXRhLiBPZiB0aGVzZSwgb25seSB0aGUgbGFzdCBmaXRzIGludG8gdGhlIHN0YW5kYXJkIHJlbG9jYXRpb24KKyAqIHNjaGVtZS4gIEltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGh1ZmZtYW4gZW5jb2RlZCBhbmQKKyAqIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGJpZyBlbmRpYW4gKHdoZXJlIGFzIHRoZSBuYXR1cmFsIGJ5dGUKKyAqIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gZm9yIHRoaXMgYWNoaXRlY3R1cmUpLgorCisgKiBOb3RlIHRoYXQgdGhlIG5zMzJrIGRpc3BsYWNlbWVudCBzdG9yYWdlIG1ldGhvZCBpcyBvcnRob2dvbmFsIHRvCisgKiB3aGV0aGVyIHRoZSByZWxvY2F0aW9uIGlzIHBjIHJlbGF0aXZlIG9yIG5vdC4gVGhlICJkaXNwbGFjZW1lbnQiCisgKiBzdG9yYWdlIHNjaGVtZSBpcyB1c2VkIGZvciBlc3NlbnRpYWxseSBhbGwgYWRkcmVzcyBjb25zdGFudHMuIFRoZQorICogZGlzcGxhY2VtZW50IGNhbiBiZSByZWxhdGl2ZSB0byB6ZXJvIChhYnNvbHV0ZSBkaXNwbGFjZW1lbnQpLAorICogcmVsYXRpdmUgdG8gdGhlIHBjIChwYyByZWxhdGl2ZSksIHRoZSBzdGFjayBwb2ludGVyLCB0aGUgZnJhbWUKKyAqIHBvaW50ZXIsIHRoZSBzdGF0aWMgYmFzZSByZWdpc3RlciBhbmQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGV0Yy4KKworICogRm9yIGV4YW1wbGU6CisgKgorICogIHN5bTE6IC5sb25nIC4JIyBwYyByZWxhdGl2ZSAyJ3MgY29tcGxlbWVudAorICogIHN5bTE6IC5sb25nIGZvbwkjIDIncyBjb21wbGVtZW50IG5vdCBwYyByZWxhdGl2ZQorICoKKyAqICBzZWxmOiAgbW92ZCBAc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKKyAqCSAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKKyAqCisgKiAgc2VsZjogIG1vdmQgc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKKyAqICAgICAgICAgbW92ZCBmb28sIHIwICMgbm9uIHBjIHJlbGF0aXZlIGltbWVkaWF0ZQorICoKKyAqIEluIGFkZGl0aW9uLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBlbmNvZGluZyBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlcworICogaW4gdGhlIGEub3V0IGZvcm1hdCByZWxvY2F0aW9uIGVudHJpZXMgaXMgc3VjaCB0aGF0IGV2ZW4gdGhlIHJlbG9jYXRpb24KKyAqIG1ldGhvZHMgd2hpY2ggYXJlIHN0YW5kYXJkIGFyZSBub3QgZW5jb2RlZCB0aGUgc3RhbmRhcmQgd2F5LgorICoKKyAqLworCityZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0gCit7CisgIC8qIG5zMzJrIGltbWVkaWF0ZSBvcGVyYW5kcyAqLworICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV84LCAwLCAwLCA4LCBmYWxzZSwgMCwgdHJ1ZSwKKwkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fOCIsCisJIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAorICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLCB0cnVlLAorCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgICJOUzMyS19JTU1fMTYiLAorCSB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgdHJ1ZSwKKwkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fMzIiLAorCSB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCisJIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzgiLAorCSB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgZmFsc2UsCisJIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzE2IiwKKwkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgZmFsc2UsCisJIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzMyIiwKKwkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCisKKyAgLyogbnMzMmsgZGlzcGxhY2VtZW50cyAqLworICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCisJIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfOCIsCisJIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAorICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKKwkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiTlMzMktfRElTUF8xNiIsCisJIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCisJIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMzIiLAorCSB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCAwLCAwLCA4LCB0cnVlLCAwLCBmYWxzZSwKKwkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF84IiwKKwkgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAorCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzE2IiwKKwkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAorCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzMyIiwKKwkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCisKKyAgLyogTm9ybWFsIDIncyBjb21wbGVtZW50ICovCisgIEhPV1RPIChCRkRfUkVMT0NfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCisJICI4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKKwkgIjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKKwkgIjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPIChCRkRfUkVMT0NfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAorCSAiUENSRUxfOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAorICBIT1dUTyAoQkZEX1JFTE9DXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAorCSAiUENSRUxfMTYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKEJGRF9SRUxPQ18zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKKwkgIlBDUkVMXzMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCit9OworCisKKyNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpIChNWShob3d0b190YWJsZSkgKyAxNCkKKworI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0JJRyAweDA2CisjZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfTElUVExFIDB4NjAKKyNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9CSUcgMQorI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSA1CisKK3JlbG9jX2hvd3RvX3R5cGUgKgorTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOworICAgICBpbnQgKnJfaW5kZXg7CisgICAgIGludCAqcl9leHRlcm47CisgICAgIGludCAqcl9wY3JlbDsKK3sKKyAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOworICBpbnQgcl9uczMya190eXBlOworLyogIEJGRF9BU1NFUlQoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCisgICpyX2luZGV4ID0gICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQorCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKKwkgICAgICAgfCAgcmVsLT5yX2luZGV4WzBdICk7CisgICpyX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7CisgICpyX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKKyAgcl9sZW5ndGggID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQorCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKKyAgcl9uczMya190eXBlICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9MSVRUTEUpCisJCSAgICA+PiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7CisgIHJldHVybiAoTVkoaG93dG9fdGFibGUpICsgcl9sZW5ndGggKyAzICogKCpyX3BjcmVsKSArIDYgKiByX25zMzJrX3R5cGUpOworfQorCisjZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCxSRUwsSU4sRVgsUEMpIE1ZKHJlbG9jX2hvd3RvKShCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKKwordm9pZAorTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgcl9leHRlcm47CisgICAgIGludCByX2luZGV4OworICAgICBsb25nIHZhbHVlOworICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Cit7CisgIHVuc2lnbmVkIGludCByX2xlbmd0aDsKKyAgaW50IHJfcGNyZWw7CisgIGludCByX25zMzJrX3R5cGU7CisgIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7CisgIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCisgIHJfcGNyZWwgID0gKGludCkgaG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KKyAgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpICkvNjsKKy8qICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KKyAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OworICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKyAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OworICByZWxvYy0+cl90eXBlWzBdID0KKyAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCisgICAgICB8IChyX3BjcmVsPyAgICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQorCXwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKQorCSAgfCAocl9uczMya190eXBlIDw8ICBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Cit9CisKKyNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCisgIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCisKKyNkZWZpbmUgU1RBVF9GT1JfRVhFQworCisjZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCisjZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKKworI2luY2x1ZGUgPGFvdXR4Lmg+CisKK3JlbG9jX2hvd3RvX3R5cGUgKgorTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisKKyNkZWZpbmUgRU5UUlkoaSxqKQljYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCisKKyAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKKworICBCRkRfQVNTRVJUKGV4dCA9PSAwKTsKKyAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCisgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCisgICAgICB7CisgICAgICBjYXNlIDMyOgorCWNvZGUgPSBCRkRfUkVMT0NfMzI7CisJYnJlYWs7CisgICAgICB9CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzgsIDApOworICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMSk7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAyKTsKKyAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMyk7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCA0KTsKKyAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsIDUpOworICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgNik7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwgNyk7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgOCk7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCA5KTsKKyAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLCAxMCk7CisgICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMTEpOworICAgICAgRU5UUlkoQkZEX1JFTE9DXzgsIDEyKTsKKyAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNiwgMTMpOworICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyLCAxNCk7CisgICAgICBFTlRSWShCRkRfUkVMT0NfOF9QQ1JFTCwgMTUpOworICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2X1BDUkVMLCAxNik7CisgICAgICBFTlRSWShCRkRfUkVMT0NfMzJfUENSRUwsIDE3KTsKKyAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKKyAgICB9CisjdW5kZWYgRU5UUlkKK30KKworCitzdGF0aWMgdm9pZAorTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OworeworICBpbnQgcl9pbmRleDsKKyAgaW50IHJfZXh0ZXJuOworICBpbnQgcl9wY3JlbDsKKyAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7CisKKyAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKKworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworCisgIGNhY2hlX3B0ci0+aG93dG8gPSBNWV9yZWxvY19ob3d0byhhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOworCisgIE1PVkVfQUREUkVTUygwKTsKK30KKworc3RhdGljIHZvaWQKK01ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmc7CisgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKK3sKKyAgaW50IHJfaW5kZXg7CisgIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOworICBpbnQgcl9leHRlcm47CisgIHVuc2lnbmVkIGludCByX2FkZGVuZDsKKyAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKworICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisgICAgCisgIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCisKKyAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZSAKKyAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCisKKyAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAorICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KKyAgICAgQ2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCisgICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCisgICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKSAKKyAgICB7CisgICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCisJeworCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAorCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KKwkgIHJfaW5kZXggPSAwOworCSAgcl9leHRlcm4gPSAwOworCX0KKyAgICAgIGVsc2UgCisJeworCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KKwkgIHJfZXh0ZXJuID0gMTsKKyN1bmRlZiBLRUVQSVQKKyNkZWZpbmUgS0VFUElUIHVkYXRhLmkKKwkgIHJfaW5kZXggPSAgKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOworI3VuZGVmIEtFRVBJVCAgICAgCisJfQorICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsgICAgICAKKyAgICB9CisKKyAgTVlfcHV0X3JlbG9jIChhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgZy0+YWRkcmVzcywgZy0+aG93dG8sIG5hdHB0cik7Cit9CisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Cit7CisgIGludCByX25zMzJrX3R5cGUgPSAoaG93dG8gLSBNWShob3d0b190YWJsZSkpIC8gNjsKKyAgbG9uZyAoKmdldF9kYXRhKSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7CisgIGludCAoKnB1dF9kYXRhKSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7CisKKyAgc3dpdGNoIChyX25zMzJrX3R5cGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIGdldF9kYXRhID0gX2JmZF9uczMya19nZXRfaW1tZWRpYXRlOworICAgICAgcHV0X2RhdGEgPSBfYmZkX25zMzJrX3B1dF9pbW1lZGlhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBnZXRfZGF0YSA9IF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudDsKKyAgICAgIHB1dF9kYXRhID0gX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCisJCQkJICAgIGxvY2F0aW9uKTsKKyAgICAgIC8qIE5PVCBSRUFDSEVEICovCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisgICAgfQorICByZXR1cm4gX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKKwkJCQkgICAgICAgbG9jYXRpb24sIGdldF9kYXRhLCBwdXRfZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9iZmQvYW91dC1zcGFyY2xlLmMgYi9iZmQvYW91dC1zcGFyY2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzYjEzNgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9hb3V0LXNwYXJjbGUuYwpAQCAtMCwwICsxLDMyIEBACisvKiBCRkQgYmFja2VuZCBmb3Igc3BhcmMgbGl0dGxlLWVuZGlhbiBhb3V0IGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpdHRsZSIKKyNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2xlX2FvdXRfLE9QKQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIKKworI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fU1BBUkNMRVQpCisKKy8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLworI2RlZmluZSBUQVJHRVRfSVNfTElUVExFX0VORElBTl9QCisjaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dC10YXJnZXQuaCBiL2JmZC9hb3V0LXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWUwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYW91dC10YXJnZXQuaApAQCAtMCwwICsxLDY1MCBAQAorLyogRGVmaW5lIGEgdGFyZ2V0IHZlY3RvciBhbmQgc29tZSBzbWFsbCByb3V0aW5lcyBmb3IgYSB2YXJpYW50IG9mIGEub3V0LgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorLyojaW5jbHVkZSAibGliYW91dC5oIiovCisKKyNpZm5kZWYgU0VHTUVOVF9TSVpFCisjZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCisjZW5kaWYKKworZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgKiBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKKworLyogU2V0IHBhcmFtZXRlcnMgYWJvdXQgdGhpcyBhLm91dCBmaWxlIHRoYXQgYXJlIG1hY2hpbmUtZGVwZW5kZW50LgorICAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHNvbWVfYW91dF9vYmplY3RfcCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiAgKi8KKyNpZm5kZWYgTVlfY2FsbGJhY2sKKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKGNhbGxiYWNrKSBQQVJBTVMgKChiZmQgKikpOworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitNWShjYWxsYmFjaykgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgYXJjaF9hbGlnbl9wb3dlcjsKKyAgdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduOworCisgIC8qIENhbGN1bGF0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHBhcnRzIG9mIGEgbmV3bHkgcmVhZCBhb3V0IGhlYWRlciAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOworCisgIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7CisgIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7CisKKyAgLyogRm9yIHNvbWUgdGFyZ2V0cywgaWYgdGhlIGVudHJ5IHBvaW50IGlzIG5vdCBpbiB0aGUgc2FtZSBwYWdlCisgICAgIGFzIHRoZSBzdGFydCBvZiB0aGUgdGV4dCwgdGhlbiBhZGp1c3QgdGhlIFZNQSBzbyB0aGF0IGl0IGlzLgorICAgICBGSVhNRTogRG8gdGhpcyB3aXRoIGEgbWFjcm8gbGlrZSBTRVRfQVJDSF9NQUNIIGluc3RlYWQ/ICAqLworICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5lbnRyeV9pc190ZXh0X2FkZHJlc3MKKyAgICAgICYmIGV4ZWNwLT5hX2VudHJ5ID4gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCisgICAgeworICAgICAgYmZkX3ZtYSBhZGp1c3Q7CisKKyAgICAgIGFkanVzdCA9IGV4ZWNwLT5hX2VudHJ5IC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7CisgICAgICAvKiBBZGp1c3Qgb25seSBieSB3aG9sZSBwYWdlcy4gKi8KKyAgICAgIGFkanVzdCAmPSB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKTsKKyAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKKyAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hICs9IGFkanVzdDsKKyAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OworICAgIH0KKworICAvKiBTZXQgdGhlIGxvYWQgYWRkcmVzc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7CisgIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOworCisgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOworICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKKworICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOworICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7CisKKyAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLworICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7CisgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKKyAgCisgIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKyNpZmRlZiBTRVRfQVJDSF9NQUNICisgIFNFVF9BUkNIX01BQ0goYWJmZCwgKmV4ZWNwKTsKKyNlbHNlCisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgREVGQVVMVF9BUkNILCAwKTsKKyNlbmRpZgorCisgIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgorICAgICBTRVRfQVJDSF9NQUNILiAgSXQgYXNzdW1lcyB0aGF0IFNFVF9BUkNIX01BQ0ggd2lsbCBzZXQKKyAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgY29ycmVjdGx5LCBpZiB0aGUgcmVsb2Mgc2l6ZSBpcyBub3QKKyAgICAgUkVMT0NfU1REX1NJWkUuICAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID0KKyAgICBleGVjcC0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQorICAgIGV4ZWNwLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBhcmNoaXRlY3R1cmUsIHNldCB0aGUgYWxpZ25tZW50cyBvZiB0aGUKKyAgICAgc2VjdGlvbnMuICBUaGlzIGlzIG5vcm1hbGx5IGRvbmUgYnkgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spLAorICAgICBidXQgd2hlbiB0aGUgaW5pdGlhbCBzZWN0aW9ucyB3ZXJlIGNyZWF0ZWQgdGhlIGFyY2hpdGVjdHVyZSBoYWQKKyAgICAgbm90IHlldCBiZWVuIHNldC4gIEhvd2V2ZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZSBkb24ndAorICAgICBzZXQgdGhlIGFsaWdubWVudCBwb3dlciBhbnkgaGlnaGVyIHRoYW4gYXMgcmVxdWlyZWQgYnkgdGhlIHNpemUKKyAgICAgb2YgdGhlIHNlY3Rpb24uICAqLworICBhcmNoX2FsaWduX3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOworICBhcmNoX2FsaWduID0gMSA8PCBhcmNoX2FsaWduX3Bvd2VyOworICBpZiAoKEJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCisgICAgICAgPT0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUpCisgICAgICAmJiAoQkZEX0FMSUdOIChvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKKwkgID09IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplKQorICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKKwkgID09IG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUpKQorICAgIHsKKyAgICAgIG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKKyAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKKyAgICAgIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOworICAgIH0KKworICAvKiBEb24ndCBzZXQgc2l6ZXMgbm93IC0tIGNhbid0IGJlIHN1cmUgdW50aWwgd2Uga25vdyBhcmNoICYgbWFjaC4KKyAgICAgU2l6ZXMgZ2V0IHNldCBpbiBzZXRfc2l6ZXMgY2FsbGJhY2ssIGxhdGVyLiAgKi8KKyNpZiAwCisgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7CisgIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKKyAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworI2VuZGlmCisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisjZW5kaWYKKworI2lmbmRlZiBNWV9vYmplY3RfcAorLyogRmluaXNoIHVwIHRoZSByZWFkaW5nIG9mIGFuIGEub3V0IGZpbGUgaGVhZGVyICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpNWShvYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorTVkob2JqZWN0X3ApIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KKyAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJCS8qIENsZWFuZWQtdXAgZXhlYyBoZWFkZXIgKi8KKyAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKKyAgICAgICE9IEVYRUNfQllURVNfU0laRSkgeworICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgIHJldHVybiAwOworICB9CisKKyNpZmRlZiBTV0FQX01BR0lDCisgIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOworI2Vsc2UKKyAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKKyNlbmRpZiAvKiBTV0FQX01BR0lDICovCisKKyAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7CisjaWZkZWYgTUFDSFRZUEVfT0sKKyAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOworI2VuZGlmCisKKyAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7CisKKyNpZmRlZiBTV0FQX01BR0lDCisgIC8qIHN3YXBfZXhlY19oZWFkZXJfaW4gcmVhZCBpbiBhX2luZm8gd2l0aCB0aGUgd3JvbmcgYnl0ZSBvcmRlciAqLworICBleGVjLmFfaW5mbyA9IFNXQVBfTUFHSUMgKGV4ZWNfYnl0ZXMuZV9pbmZvKTsKKyNlbmRpZiAvKiBTV0FQX01BR0lDICovCisKKyAgdGFyZ2V0ID0gTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCBNWShjYWxsYmFjaykpOworCisjaWZkZWYgRU5UUllfQ0FOX0JFX1pFUk8KKyAgLyogVGhlIE5FV1NPUzMgZW50cnktcG9pbnQgaXMvd2FzIDAsIHdoaWNoIChhbW9uZ3N0IG90aGVyIGxvc3NhZ2UpCisgICAqIG1lYW5zIHRoYXQgaXQgaXNuJ3Qgb2J2aW91cyBpZiBFWEVDX1Agc2hvdWxkIGJlIHNldC4KKyAgICogQWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlIGZvciBhbiBleGVjdXRhYmxlOgorICAgKiBUaGVyZSBtdXN0IGJlIG5vIHJlbG9jYXRpb25zLCB0aGUgYmZkIGNhbiBiZSBuZWl0aGVyIGFuCisgICAqIGFyY2hpdmUgbm9yIGFuIGFyY2hpdmUgZWxlbWVudCwgYW5kIHRoZSBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZS4gKi8KKworICBpZiAoZXhlYy5hX3Ryc2l6ZSArIGV4ZWMuYV9kcnNpemUgPT0gMAorICAgICAgJiYgYmZkX2dldF9mb3JtYXQoYWJmZCkgPT0gYmZkX29iamVjdCAmJiBhYmZkLT5teV9hcmNoaXZlID09IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHN0YXQgYnVmOworI2lmbmRlZiBTX0lYVVNSCisjZGVmaW5lIFNfSVhVU1IgMDEwMAkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KKyNlbmRpZgorICAgICAgaWYgKHN0YXQoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDAgJiYgKGJ1Zi5zdF9tb2RlICYgU19JWFVTUikpCisJYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOworICAgIH0KKyNlbmRpZiAvKiBFTlRSWV9DQU5fQkVfWkVSTyAqLworCisgIHJldHVybiB0YXJnZXQ7Cit9CisjZGVmaW5lIE1ZX29iamVjdF9wIE1ZKG9iamVjdF9wKQorI2VuZGlmCisKKworI2lmbmRlZiBNWV9ta29iamVjdAorCitzdGF0aWMgYm9vbGVhbiBNWShta29iamVjdCkgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGJvb2xlYW4KK01ZKG1rb2JqZWN0KSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoTkFNRShhb3V0LG1rb2JqZWN0KShhYmZkKSA9PSBmYWxzZSkKKyAgICByZXR1cm4gZmFsc2U7CisjaWYgMCAvKiBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIsIGFmdGVyIHdlIGtub3cKKwkgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZS4gICovCisgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7CisgIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKKyAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworI2VuZGlmCisgIHJldHVybiB0cnVlOworfQorI2RlZmluZSBNWV9ta29iamVjdCBNWShta29iamVjdCkKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCisKKy8qIENvcHkgcHJpdmF0ZSBzZWN0aW9uIGRhdGEuICBUaGlzIGFjdHVhbGx5IGRvZXMgbm90aGluZyB3aXRoIHRoZQorICAgc2VjdGlvbnMuICBJdCBjb3BpZXMgdGhlIHN1YmZvcm1hdCBmaWVsZC4gIFdlIGNvcHkgaXQgaGVyZSwgYmVjYXVzZQorICAgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIFFNQUdJQyBmaWxlIGJlZm9yZSB3ZSBzZXQgdGhlCisgICBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgY29weV9wcml2YXRlX2JmZF9kYXRhIGlzIG5vdCBjYWxsZWQgdW50aWwKKyAgIGFmdGVyIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQuICAqLworCitzdGF0aWMgYm9vbGVhbiBNWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYXNlY3Rpb24gKmlzZWM7CisgICAgIGJmZCAqb2JmZDsKKyAgICAgYXNlY3Rpb24gKm9zZWM7Cit7CisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCisgICAgICAmJiBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQorICAgIG9ial9hb3V0X3N1YmZvcm1hdCAob2JmZCkgPSBvYmpfYW91dF9zdWJmb3JtYXQgKGliZmQpOworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKKy8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgorICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCisgICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLworCisjaWZuZGVmIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cworc3RhdGljIGJvb2xlYW4KK01ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisjaWYgQ0hPT1NFX1JFTE9DX1NJWkUKKyAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7CisjZWxzZQorICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKKyNlbmRpZgorCisgIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOworCisgIHJldHVybiB0cnVlOworfQorI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQorI2VuZGlmCisKKyNpZm5kZWYgTVlfc2V0X3NpemVzCisKK3N0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGJvb2xlYW4KK01ZKHNldF9zaXplcykgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKKyAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOworCisjaWZkZWYgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQorICBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplID0gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRTsKKyNlbHNlCisgIGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOworI2VuZGlmCisKKyAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworICByZXR1cm4gdHJ1ZTsKK30KKyNkZWZpbmUgTVlfc2V0X3NpemVzIE1ZKHNldF9zaXplcykKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCisjZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDAKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JhY2tlbmRfZGF0YQorCisjaWZuZGVmIE1ZX3ptYWdpY19jb250aWd1b3VzCisjZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDAKKyNlbmRpZgorI2lmbmRlZiBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlcgorI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAwCisjZW5kaWYKKyNpZm5kZWYgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzCisjZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAwCisjZW5kaWYKKyNpZm5kZWYgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQKKyNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMAorI2VuZGlmCisjaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKKyNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCisjZW5kaWYKKyNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKKyNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAorI2VuZGlmCisjaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKKyNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCisjZW5kaWYKKyNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAorI2VuZGlmCisjaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKKyNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCisjZW5kaWYKKyNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluaworI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKKyNlbmRpZgorCitzdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7CisgIE1ZX3ptYWdpY19jb250aWd1b3VzLAorICBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciwKKyAgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLAorICBNWV9leGVjX2hkcl9mbGFncywKKyAgMCwJCQkJLyogdGV4dCB2bWE/ICovCisgIE1ZX3NldF9zaXplcywKKyAgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQsCisgIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMsCisgIE1ZX2FkZF9vbmVfc3ltYm9sLAorICBNWV9saW5rX2R5bmFtaWNfb2JqZWN0LAorICBNWV93cml0ZV9keW5hbWljX3N5bWJvbCwKKyAgTVlfY2hlY2tfZHluYW1pY19yZWxvYywKKyAgTVlfZmluaXNoX2R5bmFtaWNfbGluaworfTsKKyNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCisjZW5kaWYKKworI2lmbmRlZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrCisKKy8qIENhbGxiYWNrIGZvciB0aGUgZmluYWxfbGluayByb3V0aW5lIHRvIHNldCB0aGUgc2VjdGlvbiBvZmZzZXRzLiAgKi8KKworc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjaworICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOworCitzdGF0aWMgdm9pZAorTVlfZmluYWxfbGlua19jYWxsYmFjayAoYWJmZCwgcHRyZWxvZmYsIHBkcmVsb2ZmLCBwc3ltb2ZmKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGZpbGVfcHRyICpwdHJlbG9mZjsKKyAgICAgZmlsZV9wdHIgKnBkcmVsb2ZmOworICAgICBmaWxlX3B0ciAqcHN5bW9mZjsKK3sKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisgICpwdHJlbG9mZiA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKKyAgKnBkcmVsb2ZmID0gTl9EUkVMT0ZGICgqZXhlY3ApOworICAqcHN5bW9mZiA9IE5fU1lNT0ZGICgqZXhlY3ApOworfQorCisjZW5kaWYKKworI2lmbmRlZiBNWV9iZmRfZmluYWxfbGluaworCisvKiBGaW5hbCBsaW5rIHJvdXRpbmUuICBXZSBuZWVkIHRvIHVzZSBhIGNhbGwgYmFjayB0byBnZXQgdGhlIGNvcnJlY3QKKyAgIG9mZnNldHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4gTVlfYmZkX2ZpbmFsX2xpbmsgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworc3RhdGljIGJvb2xlYW4KK01ZX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKK30KKworI2VuZGlmCisKKy8qIFdlIGFzc3VtZSBCRkQgZ2VuZXJpYyBhcmNoaXZlIGZpbGVzLiAgKi8KKyNpZm5kZWYJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCisjZGVmaW5lCU1ZX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKKyNlbmRpZgorI2lmbmRlZiBNWV9nZXRfZWx0X2F0X2luZGV4CisjZGVmaW5lIE1ZX2dldF9lbHRfYXRfaW5kZXgJCV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4CisjZW5kaWYKKyNpZm5kZWYJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CisjZGVmaW5lCU1ZX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CisjZW5kaWYKKyNpZm5kZWYJTVlfc2x1cnBfYXJtYXAKKyNkZWZpbmUJTVlfc2x1cnBfYXJtYXAJCQliZmRfc2x1cnBfYnNkX2FybWFwCisjZW5kaWYKKyNpZm5kZWYJTVlfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2RlZmluZQlNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2VuZGlmCisjaWZuZGVmIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisjZGVmaW5lIE1ZX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKKyAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2VuZGlmCisjaWZuZGVmCU1ZX3dyaXRlX2FybWFwCisjZGVmaW5lCU1ZX3dyaXRlX2FybWFwCQlic2Rfd3JpdGVfYXJtYXAKKyNlbmRpZgorI2lmbmRlZiBNWV9yZWFkX2FyX2hkcgorI2RlZmluZSBNWV9yZWFkX2FyX2hkcgkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCisjZW5kaWYKKyNpZm5kZWYJTVlfdHJ1bmNhdGVfYXJuYW1lCisjZGVmaW5lCU1ZX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKKyNlbmRpZgorI2lmbmRlZiBNWV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCisjZGVmaW5lIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wCisjZW5kaWYKKworLyogTm8gY29yZSBmaWxlIGRlZmluZWQgaGVyZSAtLSBjb25maWd1cmUgaW4gdHJhZC1jb3JlLmMgc2VwYXJhdGVseS4gICovCisjaWZuZGVmCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKyNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCisjZW5kaWYKKyNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKKyNlbmRpZgorI2lmbmRlZglNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCVwKKwkJCQlfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyNlbmRpZgorI2lmbmRlZglNWV9jb3JlX2ZpbGVfcAorI2RlZmluZQlNWV9jb3JlX2ZpbGVfcAkJX2JmZF9kdW1teV90YXJnZXQKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CisjZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAorI2VuZGlmCisjaWZuZGVmIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAorI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCisjZW5kaWYKKyNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQorI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKKwkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKyNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBOQU1FKGFvdXQsY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkKKyNlbmRpZgorI2lmbmRlZiBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKKyNkZWZpbmUgTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpCisjZW5kaWYKKyNpZm5kZWYgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisjZGVmaW5lIE1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBOQU1FKGFvdXQsY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQorI2VuZGlmCisjaWZuZGVmIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIE1ZX3NldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykKKyNlbmRpZgorI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyBOQU1FKGFvdXQsZ2V0X3NlY3Rpb25fY29udGVudHMpCisjZW5kaWYKKyNpZm5kZWYgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisjZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisjZW5kaWYKKyNpZm5kZWYgTVlfbmV3X3NlY3Rpb25faG9vaworI2RlZmluZSBNWV9uZXdfc2VjdGlvbl9ob29rIE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKQorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQKKyNkZWZpbmUgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKKyNlbmRpZgorI2lmbmRlZiBNWV9nZXRfc3ltdGFiCisjZGVmaW5lIE1ZX2dldF9zeW10YWIgTkFNRShhb3V0LGdldF9zeW10YWIpCisjZW5kaWYKKyNpZm5kZWYgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCisjZGVmaW5lIE1ZX2dldF9yZWxvY191cHBlcl9ib3VuZCBOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQorI2VuZGlmCisjaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYworI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykKKyNlbmRpZgorI2lmbmRlZiBNWV9tYWtlX2VtcHR5X3N5bWJvbAorI2RlZmluZSBNWV9tYWtlX2VtcHR5X3N5bWJvbCBOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpCisjZW5kaWYKKyNpZm5kZWYgTVlfcHJpbnRfc3ltYm9sCisjZGVmaW5lIE1ZX3ByaW50X3N5bWJvbCBOQU1FKGFvdXQscHJpbnRfc3ltYm9sKQorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9zeW1ib2xfaW5mbworI2RlZmluZSBNWV9nZXRfc3ltYm9sX2luZm8gTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykKKyNlbmRpZgorI2lmbmRlZiBNWV9nZXRfbGluZW5vCisjZGVmaW5lIE1ZX2dldF9saW5lbm8gTkFNRShhb3V0LGdldF9saW5lbm8pCisjZW5kaWYKKyNpZm5kZWYgTVlfc2V0X2FyY2hfbWFjaAorI2RlZmluZSBNWV9zZXRfYXJjaF9tYWNoIE5BTUUoYW91dCxzZXRfYXJjaF9tYWNoKQorI2VuZGlmCisjaWZuZGVmIE1ZX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIE1ZX2ZpbmRfbmVhcmVzdF9saW5lIE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKKyNlbmRpZgorI2lmbmRlZiBNWV9zaXplb2ZfaGVhZGVycworI2RlZmluZSBNWV9zaXplb2ZfaGVhZGVycyBOQU1FKGFvdXQsc2l6ZW9mX2hlYWRlcnMpCisjZW5kaWYKKyNpZm5kZWYgTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKwkJCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2VuZGlmCisjaWZuZGVmIE1ZX2JmZF9yZWxheF9zZWN0aW9uCisjZGVmaW5lIE1ZX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfZ2Nfc2VjdGlvbnMKKyNkZWZpbmUgTVlfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZW5kaWYKKyNpZm5kZWYgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApCisjZW5kaWYKKyNpZm5kZWYgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIE1ZX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAwCisjZW5kaWYKKyNpZm5kZWYgTVlfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBNWV9yZWFkX21pbmlzeW1ib2xzIE5BTUUoYW91dCxyZWFkX21pbmlzeW1ib2xzKQorI2VuZGlmCisjaWZuZGVmIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sCisjZGVmaW5lIE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sIE5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfbGlua19zcGxpdF9zZWN0aW9uCisjZGVmaW5lIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKyNlbmRpZgorCisKKyNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCisjZW5kaWYKKworI2lmbmRlZiBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKKyNkZWZpbmUgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQorI2VuZGlmCisKKyNpZm5kZWYgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgTVlfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCisjZW5kaWYKKworI2lmbmRlZiBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKKyNkZWZpbmUgTVlfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIE1ZX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCisjZGVmaW5lIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvIE5BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwCisjZGVmaW5lIE1ZX2Nsb3NlX2FuZF9jbGVhbnVwIE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvCisjZW5kaWYKKworI2lmbmRlZiBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKKyNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFwKKyAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCisjZW5kaWYKKyNpZm5kZWYgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCisjZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBcCisgIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCisjZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFwKKyAgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKKyNlbmRpZgorI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYworI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCisgIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCisjZW5kaWYKKworLyogQW91dCBzeW1ib2xzIG5vcm1hbGx5IGhhdmUgbGVhZGluZyB1bmRlcnNjb3JlcyAqLworI2lmbmRlZiBNWV9zeW1ib2xfbGVhZGluZ19jaGFyIAorI2RlZmluZSBNWV9zeW1ib2xfbGVhZGluZ19jaGFyICdfJworI2VuZGlmCisKKy8qIEFvdXQgYXJjaGl2ZXMgbm9ybWFsbHkgdXNlIHNwYWNlcyBmb3IgcGFkZGluZyAqLworI2lmbmRlZiBBUl9QQURfQ0hBUgorI2RlZmluZSBBUl9QQURfQ0hBUiAnICcKKyNlbmRpZgorCisjaWZuZGVmIE1ZX0JGRF9UQVJHRVQKK2NvbnN0IGJmZF90YXJnZXQgTVkodmVjKSA9Cit7CisgIFRBUkdFVE5BTUUsCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorI2lmZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKyAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAoYmlnKSAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGJpZykgKi8KKyNlbHNlCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCisjZW5kaWYKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAorICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAorICBBUl9QQURfQ0hBUiwJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyNpZmRlZiBUQVJHRVRfSVNfQklHX0VORElBTl9QCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworI2Vsc2UKKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisjZW5kaWYKKyAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCisgICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKKyAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAorCisgIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKK307CisjZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtdGljMzAuYyBiL2JmZC9hb3V0LXRpYzMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlNmNiNwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9hb3V0LXRpYzMwLmMKQEAgLTAsMCArMSwxMDY1IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBhLm91dCBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CisjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAxMDI0CisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMTI4CisjZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCisjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF90aWMzMAorI2RlZmluZSBBUkNIX1NJWkUgMzIKKworI2RlZmluZSBNWShPUCkgQ0FUKHRpYzMwX2FvdXRfLE9QKQorI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC10aWMzMCIKKyNkZWZpbmUgTkFNRSh4LHkpIENBVDModGljMzBfYW91dCxfMzJfLHkpCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfMTYKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzMyCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNgorICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICp0aWMzMF9hb3V0X3JlbG9jX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGludCAqLCBpbnQgKiwgaW50ICopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cworICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQorICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAorCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0aWMzMF9hb3V0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiB0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKKworI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSB0aWMzMF9hb3V0X3JlbG9jX2hvd3RvKEJGRCxSRUwsJklOLCZFWCwmUEMpCisjZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlCisjZGVmaW5lIE1ZX29iamVjdF9wIHRpYzMwX2FvdXRfb2JqZWN0X3AKKyNkZWZpbmUgTVlfbWtvYmplY3QgTkFNRShhb3V0LG1rb2JqZWN0KQorI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMKKyNkZWZpbmUgTVlfc2V0X3NpemVzIHRpYzMwX2FvdXRfc2V0X3NpemVzCisKKyNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKKyNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQorI2VuZGlmCisKKyNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCisKKyNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKKyNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAorI2VuZGlmCisjaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCisjZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKKyNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAorI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCisjZW5kaWYKKyNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scworI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAorI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCisjZW5kaWYKKyNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAorI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKKyNlbmRpZgorI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAorI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCisjZW5kaWYKKyNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYworI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCisjZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAorI2VuZGlmCisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgdGljMzBfYW91dF9iYWNrZW5kX2RhdGEgPQoreworICBNWV96bWFnaWNfY29udGlndW91cywKKyAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCisgIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKKyAgTVlfZXhlY19oZHJfZmxhZ3MsCisgIDAsCQkJCS8qIHRleHQgdm1hPyAqLworICBNWV9zZXRfc2l6ZXMsCisgIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAorICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAorICBNWV9hZGRfb25lX3N5bWJvbCwKKyAgTVlfbGlua19keW5hbWljX29iamVjdCwKKyAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCisgIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCisgIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKK307CisjZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmdGljMzBfYW91dF9iYWNrZW5kX2RhdGEKKyNlbmRpZgorCisvKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIGFvdXR4Lmggc2hvdWxkIHJlYWxseSBvbmx5IGJlIGluY2x1ZGVkIGJ5CisgICBhb3V0MzIuYy4gICovCisKKyNpbmNsdWRlICJhb3V0eC5oIgorCisvKiBUaGlzIHRhYmxlIGxpc3RzIHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgVE1TMzIwQzMwLiAgVGhlcmUgYXJlCisgICBvbmx5IGEgZmV3IHJlbG9jYXRpb25zIHJlcXVpcmVkLCBhbmQgYWxsIG11c3QgYmUgZGl2aWRlZCBieSA0ICg+PgorICAgMikgdG8gZ2V0IHRoZSAzMi1iaXQgYWRkcmVzc2VzIGluIHRoZSBmb3JtYXQgdGhlIFRNUzMyMEMzMCBsaWtlcworICAgaXQuICovCityZWxvY19ob3d0b190eXBlIHRpYzMwX2FvdXRfaG93dG9fdGFibGVbXSA9Cit7CisgIHstMX0sCisgIEhPV1RPICgxLCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIHRpYzMwX2FvdXRfZml4XzE2LAorCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAorICBIT1dUTyAoMiwgMiwgMiwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKKwkgIjI0IiwgZmFsc2UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIGZhbHNlKSwKKyAgSE9XVE8gKDMsIDE4LCAzLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAorCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKKyAgSE9XVE8gKDQsIDIsIDQsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHRpYzMwX2FvdXRfZml4XzMyLAorCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAorICBIT1dUTyAoNSwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKKwkgdGljMzBfYW91dF9maXhfcGNyZWxfMTYsICJQQ1JFTCIsIHRydWUsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIHRydWUpLAorICB7LTF9LAorICB7LTF9LAorICB7LTF9LAorICB7LTF9LAorICB7LTF9Cit9OworCitleHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqTkFNRSAoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApICgpOworCityZWxvY19ob3d0b190eXBlICoKK3RpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfODoKKyAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6CisgICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbM107CisgICAgY2FzZSBCRkRfUkVMT0NfMTY6CisgICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMV07CisgICAgY2FzZSBCRkRfUkVMT0NfMjQ6CisgICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMl07CisgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CisgICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNV07CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNF07CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOworICAgIH0KK30KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgordGljMzBfYW91dF9yZWxvY19ob3d0byAoYWJmZCwgcmVsb2NzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7CisgICAgIGludCAqcl9pbmRleDsKKyAgICAgaW50ICpyX2V4dGVybjsKKyAgICAgaW50ICpyX3BjcmVsOworeworICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7CisgIHVuc2lnbmVkIGludCByX3BjcmVsX2RvbmU7CisgIGludCBpbmRleDsKKworICAqcl9wY3JlbCA9IDA7CisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgIHsKKyAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMF0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFsyXSk7CisgICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7CisgICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKKyAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMl0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFswXSk7CisgICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7CisgICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKKyAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOworICAgIH0KKyAgaW5kZXggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsX2RvbmU7CisgIHJldHVybiB0aWMzMF9hb3V0X2hvd3RvX3RhYmxlICsgaW5kZXg7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGNhbGxiYWNrIGZvciAxNi1iaXQgcmVsb2NzLiAgVGhpcyBpcworICAgcmVxdWlyZWQgZm9yIHJlbG9jYXRpb25zIGJldHdlZW4gc2VnbWVudHMuICBBIGxpbmUgaW4gYW91dHguaAorICAgcmVxdWlyZXMgdGhhdCBhbnkgcmVsb2NhdGlvbnMgZm9yIHRoZSBkYXRhIHNlY3Rpb24gc2hvdWxkIHBvaW50IHRvCisgICB0aGUgZW5kIG9mIHRoZSBhbGlnbmVkIHRleHQgc2VjdGlvbiwgcGx1cyBhbiBvZmZzZXQuICBCeSBkZWZhdWx0LAorICAgdGhpcyBkb2VzIG5vdCBoYXBwZW4sIHRoZXJlZm9yZSB0aGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YKKyAgIHRoYXQuICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3RpYzMwX2FvdXRfZml4XzE2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworCisgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCisgIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQorICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKKyAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAorICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCisgIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7CisgIHJlbG9jYXRpb24gKz0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisgIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGljMzBfYW91dF9maXhfMTYgZXhjZXB0IGZvciAzMgorICAgYml0IHJlbG9jYXRpb25zLiAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCit0aWMzMF9hb3V0X2ZpeF8zMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbiBpcyBkZWZpbmVkLiAqLworICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKKyAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7CisgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbiBhbmQgdHVybiBpdCBpbnRvIHRoZSBUTVMzMjBDMzAKKyAgICAgMzItYml0IGFkZHJlc3MgZm9ybWF0LiAqLworICByZWxvY2F0aW9uID0gKHN5bWJvbC0+c2VjdGlvbi0+dm1hID4+IDIpOworICByZWxvY2F0aW9uICs9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY2F0aW9uLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdvcmsgb3V0IHBjLXJlbGF0aXZlIG9mZnNldHMgZm9yIHRoZQorICAgVE1TMzIwQzMwLiAgVGhlIGRhdGEgYWxyZWFkeSBwbGFjZWQgYnkgbWRfcGNyZWxfZnJvbSB3aXRoaW4gZ2FzIGlzCisgICB1c2VsZXNzIGZvciBhIHJlbG9jYXRpb24sIHNvIHdlIGp1c3QgZ2V0IHRoZSBvZmZzZXQgdmFsdWUgYW5kIHBsYWNlCisgICBhIHZlcnNpb24gb2YgdGhpcyB3aXRoaW4gdGhlIG9iamVjdCBjb2RlLgorICAgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlIHdpbGwgdGhlbiBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkCisgICByZWxvY2F0aW9uIHRvIGFkZCBvbiB0byB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBjb2RlLiAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCit0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMTsKKyAgYmZkX2J5dGUgb2Zmc2V0X2RhdGEgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgLSAxKTsKKworICAvKiBUaGUgYnl0ZSBiZWZvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXggY29udGFpbnMgYml0cyAyMy0xNiBvZgorICAgICB0aGUgcGNyZWwgaW5zdHJ1Y3Rpb24uICBCaXQgMjEgaXMgc2V0IGZvciBhIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24KKyAgICAgd2hpY2ggcmVxdWlyZXMgb24gb2Zmc2V0IG9mIDMgaW5zdGVhZCBvZiAxLiAqLworICBpZiAob2Zmc2V0X2RhdGEgJiAweDIwKQorICAgIHJlbG9jYXRpb24gLT0gMzsKKyAgZWxzZQorICAgIHJlbG9jYXRpb24gLT0gMTsKKyAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKy8qIFRoZXNlIG1hY3JvcyB3aWxsIGdldCAyNC1iaXQgdmFsdWVzIGZyb20gdGhlIGJmZCBkZWZpbml0aW9uLgorICAgQmlnLWVuZGlhbiBvbmx5LiAqLworI2RlZmluZSBiZmRfZ2V0Yl8yNChCRkQsQUREUikgKGJmZF9nZXRfOChCRkQsQUREUikgPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9nZXRfOChCRkQsQUREUisxKSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfZ2V0XzgoQkZELEFERFIrMikpCisKKyNkZWZpbmUgYmZkX3B1dGJfMjQoQkZELERBVEEsQUREUikgYmZkX3B1dF84KEJGRCwoYmZkX2J5dGUpKChEQVRBID4+IDE2KSAmIDB4RkYpLEFERFIpOyBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKSgoREFUQSA+PiA4KSAmIDB4RkYpLEFERFIrMSk7IFwKKwkJICAgICAgICAgCQkJCSAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKShEQVRBICYgMHhGRiksQUREUisyKQorCisvKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCisgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCit0aWMzMF9hb3V0X2NhbGxiYWNrIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKyAgdW5zaWduZWQgaW50IGFyY2hfYWxpZ25fcG93ZXI7CisgIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbjsKKworICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7CisKKyAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOworICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOworCisgIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7CisgIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOworCisgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOworICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKKworICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKKworICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKKyAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOworCisgIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKyNpZmRlZiBTRVRfQVJDSF9NQUNICisgIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7CisjZWxzZQorICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOworI2VuZGlmCisKKyAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgYXJjaGl0ZWN0dXJlLCBzZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlCisgICAgIHNlY3Rpb25zLiAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSwKKyAgICAgYnV0IHdoZW4gdGhlIGluaXRpYWwgc2VjdGlvbnMgd2VyZSBjcmVhdGVkIHRoZSBhcmNoaXRlY3R1cmUgaGFkCisgICAgIG5vdCB5ZXQgYmVlbiBzZXQuICBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UgZG9uJ3QKKyAgICAgc2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgYW55IGhpZ2hlciB0aGFuIGFzIHJlcXVpcmVkIGJ5IHRoZSBzaXplCisgICAgIG9mIHRoZSBzZWN0aW9uLiAgKi8KKyAgYXJjaF9hbGlnbl9wb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKKyAgYXJjaF9hbGlnbiA9IDEgPDwgYXJjaF9hbGlnbl9wb3dlcjsKKyAgaWYgKChCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQorICAgICAgID09IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplKQorICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCisJICA9PSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKKyAgICAgICYmIChCRkRfQUxJR04gKG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCisJICA9PSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplKSkKKyAgICB7CisgICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7CisgICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7CisgICAgICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKKyAgICB9CisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCit0aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAorCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYmZkX3ZtYSBhZGRyZXNzOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBiZmRfdm1hIGFkZGVuZDsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworCisgIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7CisgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCisgICAgeworICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCisJcmVsb2NhdGlvbiAtPSBhZGRyZXNzOworICAgIH0KKyAgcmV0dXJuIHRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCisJCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Cit9CisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQordGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Cit7CisgIGJmZF92bWEgeDsKKyAgYm9vbGVhbiBvdmVyZmxvdzsKKworICBpZiAoaG93dG8tPnNpemUgPCAwKQorICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKKworICBzd2l0Y2ggKGhvd3RvLT5zaXplKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgeCA9IGJmZF9nZXRiXzI0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgfQorICBvdmVyZmxvdyA9IGZhbHNlOworICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCisgICAgeworICAgICAgYmZkX3ZtYSBjaGVjazsKKyAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKKyAgICAgIGJmZF92bWEgYWRkOworICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKKworICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCisJeworCSAgY2hlY2sgPSByZWxvY2F0aW9uOworCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7CisJICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCisJICAgIHNpZ25lZF9jaGVjayA9IGNoZWNrOworCSAgZWxzZQorCSAgICBzaWduZWRfY2hlY2sgPSAoY2hlY2sgfCAoKGJmZF92bWEpIC0gMSAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKKwl9CisgICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOworICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKKyAgICAgIGlmICgoYWRkICYgKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spKSAhPSAwKQorCXNpZ25lZF9hZGQgLT0gKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spIDw8IDE7CisgICAgICBpZiAoaG93dG8tPmJpdHBvcyA9PSAwKQorCXsKKwkgIGNoZWNrICs9IGFkZDsKKwkgIHNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKKwkgIGlmIChzaWduZWRfYWRkID49IDApCisJICAgIHNpZ25lZF9jaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKKwkgIGVsc2UKKwkgICAgc2lnbmVkX2NoZWNrICs9ICgoYWRkID4+IGhvd3RvLT5iaXRwb3MpIHwgKChiZmRfdm1hKSAtIDEgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKKwl9CisgICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKKwl7CisJY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6CisJICB7CisJICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOworCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7CisJICAgIGlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCisJICAgICAgb3ZlcmZsb3cgPSB0cnVlOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKKwkgIHsKKwkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKKwkgICAgaWYgKGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQorCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6CisJICB7CisJICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOworCSAgICBpZiAoKGNoZWNrICYgfnJlbG9jX2JpdHMpICE9IDAgJiYgKCgoYmZkX3ZtYSkgc2lnbmVkX2NoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCisJICAgICAgb3ZlcmZsb3cgPSB0cnVlOworCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKKyAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7CisgIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKKyAgc3dpdGNoIChob3d0by0+c2l6ZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDA6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgYmZkX3B1dGJfMjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Cit9CisKKy8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCit0aWMzMF9hb3V0X29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KKyAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLworICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKKyAgICAgICE9IEVYRUNfQllURVNfU0laRSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNpZmRlZiBTV0FQX01BR0lDCisgIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOworI2Vsc2UKKyAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKKyNlbmRpZiAvKiBTV0FQX01BR0lDICovCisKKyAgaWYgKE5fQkFETUFHIChleGVjKSkKKyAgICByZXR1cm4gMDsKKyNpZmRlZiBNQUNIVFlQRV9PSworICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOworCisjaWZkZWYgU1dBUF9NQUdJQworICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KKyAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7CisjZW5kaWYgLyogU1dBUF9NQUdJQyAqLworCisgIHRhcmdldCA9IE5BTUUgKGFvdXQsIHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCB0aWMzMF9hb3V0X2NhbGxiYWNrKTsKKworI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCisgIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQorICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCisgICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKKyAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgorICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCisKKyAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKKyAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisjaWZuZGVmIFNfSVhVU1IKKyNkZWZpbmUgU19JWFVTUiAwMTAwCQkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KKyNlbmRpZgorICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQorCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKKyAgICB9CisjZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KKworICByZXR1cm4gdGFyZ2V0OworfQorCisvKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKKyAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKKyAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQorICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCisgICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KKworLypBUkdTVVNFRCAqLworc3RhdGljIGJvb2xlYW4KK01ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQorICAgICBiZmQgKmliZmQ7CisgICAgIGFzZWN0aW9uICppc2VjOworICAgICBiZmQgKm9iZmQ7CisgICAgIGFzZWN0aW9uICpvc2VjOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKKyAgICBvYmpfYW91dF9zdWJmb3JtYXQgKG9iZmQpID0gb2JqX2FvdXRfc3ViZm9ybWF0IChpYmZkKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgorICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCisgICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgordGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisjaWYgQ0hPT1NFX1JFTE9DX1NJWkUKKyAgQ0hPT1NFX1JFTE9DX1NJWkUgKGFiZmQpOworI2Vsc2UKKyAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisjZW5kaWYKKyAgeworICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCisgICAgZmlsZV9wdHIgdGV4dF9lbmQ7CisgICAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCisgICAgICBOQU1FIChhb3V0LCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOworCisgICAgZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsKKyAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisKKyAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKKyAgICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKKyAgICBOQU1FIChhb3V0LCBzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7CisKKyAgICBpZiAoYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA+IDApCisgICAgICB7CisJaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQorCSAgcmV0dXJuIGZhbHNlOworCWlmIChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSwgYWJmZCkgIT0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KKworICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCisJJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKKyAgICAgIHsKKwlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fU1lNT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCisJICByZXR1cm4gZmFsc2U7CisKKwlpZiAoIU5BTUUgKGFvdXQsIHdyaXRlX3N5bXMpIChhYmZkKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFOQU1FIChhb3V0LCBzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCit0aWMzMF9hb3V0X3NldF9zaXplcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKKworI2lmZGVmIFNFR01FTlRfU0laRQorICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOworI2Vsc2UKKyAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7CisjZW5kaWYKKworI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKKyAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOworI2Vsc2UKKyAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOworI2VuZGlmCisKKyAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmbmRlZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrCisKKy8qIENhbGxiYWNrIGZvciB0aGUgZmluYWxfbGluayByb3V0aW5lIHRvIHNldCB0aGUgc2VjdGlvbiBvZmZzZXRzLiAgKi8KKworc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjaworICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOworCitzdGF0aWMgdm9pZAorTVlfZmluYWxfbGlua19jYWxsYmFjayAoYWJmZCwgcHRyZWxvZmYsIHBkcmVsb2ZmLCBwc3ltb2ZmKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGZpbGVfcHRyICpwdHJlbG9mZjsKKyAgICAgZmlsZV9wdHIgKnBkcmVsb2ZmOworICAgICBmaWxlX3B0ciAqcHN5bW9mZjsKK3sKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisgICpwdHJlbG9mZiA9IG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyArIGV4ZWNwLT5hX2RhdGE7CisgICpwZHJlbG9mZiA9ICpwdHJlbG9mZiArIGV4ZWNwLT5hX3Ryc2l6ZTsKKyAgKnBzeW1vZmYgPSAqcGRyZWxvZmYgKyBleGVjcC0+YV9kcnNpemU7OworfQorCisjZW5kaWYKKworI2lmbmRlZiBNWV9iZmRfZmluYWxfbGluaworCisvKiBGaW5hbCBsaW5rIHJvdXRpbmUuICBXZSBuZWVkIHRvIHVzZSBhIGNhbGwgYmFjayB0byBnZXQgdGhlIGNvcnJlY3QKKyAgIG9mZnNldHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK01ZX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisgIGZpbGVfcHRyIHBvczsKKyAgYmZkX3ZtYSB2bWEgPSAwOworICBpbnQgcGFkOworCisgIC8qIFNldCB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgc2l6ZSB0byAwLCBhcyB3ZSBkb24ndCB3YW50IG9uZSBmb3IgYW4KKyAgICAgb3V0cHV0LiAqLworICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gMDsKKyAgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKKyAgLyogVGV4dC4gICovCisgIHZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT52bWE7CisgIHBvcyArPSB2bWE7CisgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHBvczsKKyAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSB2bWE7CisgIG9ial90ZXh0c2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKKyAgcG9zICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOworICB2bWEgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisKKyAgLyogRGF0YS4gICovCisgIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCisgICAgeworICAgICAgaWYgKGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWEgPiAwKQorCW9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24tPm5leHQtPnZtYTsKKyAgICAgIGVsc2UKKwlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKKyAgICB9CisgIGlmIChvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA8IHZtYSkKKyAgICB7CisgICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKKyAgICB9CisgIG9ial9kYXRhc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKKyAgdm1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IHZtYSArIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7CisgIGV4ZWNwLT5hX3RleHQgPSB2bWEgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV90ZXh0OworCisgIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLworICB2bWEgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOworICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7CisgIHBvcyArPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKKyAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOworCisgIC8qIEJTUy4gICovCisgIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSB2bWE7CisgIG9ial9ic3NzZWMgKGFiZmQpLT51c2VyX3NldF92bWEgPSAxOworCisgIC8qIFdlIGFyZSBmdWxseSByZXNpemVkLCBzbyBkb24ndCByZWFkanVzdCBpbiBmaW5hbF9saW5rLiAqLworICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOworCisgIHJldHVybiBOQU1FIChhb3V0LCBmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Cit9CisKKyNlbmRpZgorCitlbnVtIG1hY2hpbmVfdHlwZQordGljMzBfYW91dF9tYWNoaW5lX3R5cGUgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7CisgICAgIGJvb2xlYW4gKnVua25vd247Cit7CisgIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7CisKKyAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKKyAgKnVua25vd24gPSB0cnVlOworCisgIHN3aXRjaCAoYXJjaCkKKyAgICB7CisgICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKKyAgICAgICp1bmtub3duID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKKyAgICB9CisgIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKKyAgICAqdW5rbm93biA9IGZhbHNlOworICByZXR1cm4gYXJjaF9mbGFnczsKK30KKworYm9vbGVhbgordGljMzBfYW91dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIGlmICghYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQorICAgIHsKKyAgICAgIGJvb2xlYW4gdW5rbm93bjsKKyAgICAgIHRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7CisgICAgICBpZiAodW5rbm93bikKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKKyAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKK30KKworLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLworI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKKyNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKKyNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKKyNlbmRpZgorI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKKyNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKKyNlbmRpZgorI2lmbmRlZglNWV9zbHVycF9hcm1hcAorI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKKyNlbmRpZgorI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCisjZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCisjZW5kaWYKKyNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKKyNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisjZW5kaWYKKyNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKKyNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAorI2VuZGlmCisjaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCisjZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKKyNlbmRpZgorI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKKyNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQorI2VuZGlmCisjaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKKyNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKKyNlbmRpZgorCisvKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KKyNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAorI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKyNlbmRpZgorI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKKyNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorI2VuZGlmCisjaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAorI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAorCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAorI2VuZGlmCisjaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAorI2VuZGlmCisKKyNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKKyNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCisjZW5kaWYKKyNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCisjZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCisjZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAorCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAorI2VuZGlmCisKKyNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAorI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQorI2VuZGlmCisjaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKKyNlbmRpZgorI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCisjZW5kaWYKKyNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKKyNlbmRpZgorI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKKyNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKKyNlbmRpZgorI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCisjZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCisjZW5kaWYKKyNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAorI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9zeW10YWIKKyNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKKyNlbmRpZgorI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKKyNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCisjZW5kaWYKKyNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCisjZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQorI2VuZGlmCisjaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCisjZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKKyNlbmRpZgorI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKKyNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCisjZW5kaWYKKyNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCisjZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQorI2VuZGlmCisjaWZuZGVmIE1ZX2dldF9saW5lbm8KKyNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKKyNlbmRpZgorI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCisjZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoCisjZW5kaWYKKyNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKKyNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQorI2VuZGlmCisjaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCisjZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZW5kaWYKKyNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgorI2VuZGlmCisjaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucworI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAKKyNlbmRpZgorI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKKyNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCisjZW5kaWYKKyNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKKyNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQorI2VuZGlmCisjaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQorI2VuZGlmCisjaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQorI2VuZGlmCisjaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KKyNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorI2VuZGlmCisKKworI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2VuZGlmCisKKyNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQorI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCisjZW5kaWYKKworI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncworI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncworI2VuZGlmCisKKyNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKKyNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2VuZGlmCisKKyNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKyNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQorI2VuZGlmCisKKyNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKKyNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKyNlbmRpZgorCisjaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAorI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAorICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKKyNlbmRpZgorI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKKyNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKKyAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCisjZW5kaWYKKyNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKKyNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAorICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAorI2VuZGlmCisjaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCisjZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKKyAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKKyNlbmRpZgorCisvKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCisjaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIKKyNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKKyNlbmRpZgorCisvKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KKyNpZm5kZWYgQVJfUEFEX0NIQVIKKyNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCisjZW5kaWYKKworI2lmbmRlZiBNWV9CRkRfVEFSR0VUCitjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2FvdXRfdmVjID0KK3sKKyAgVEFSR0VUTkFNRSwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLworICAoSEFTX1JFTE9DIHwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKKyAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLworICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKKyAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAorCisgIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKK307CisjZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQwLmMgYi9iZmQvYW91dDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmM3YWUwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FvdXQwLmMKQEAgLTAsMCArMSwzMiBAQAorLyogQkZEIGJhY2tlbmQgZm9yIFN1bk9TIHN0eWxlIGEub3V0IHdpdGggZmxhZ3Mgc2V0IHRvIDAKKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC16ZXJvLWJpZyIKKyNkZWZpbmUgTVkoT1ApIENBVChhb3V0MF9iaWdfLE9QKQorCisjaW5jbHVkZSAiYmZkLmgiCisKKyNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMAorCisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCisgICgobXR5cGUpID09IE1fVU5LTk9XTiB8fCAobXR5cGUpID09IE1fNjgwMTAgfHwgKG10eXBlKSA9PSBNXzY4MDIwKQorCisvKiBJbmNsdWRlIHRoZSB1c3VhbCBhLm91dCBzdXBwb3J0LiAgKi8KKyNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0MzIuYyBiL2JmZC9hb3V0MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmM0MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FvdXQzMi5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgMzItYml0IGEub3V0IGZpbGVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBBUkNIX1NJWkUgMzIKKworI2luY2x1ZGUgImFvdXR4LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDY0LmMgYi9iZmQvYW91dDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwMzZjOAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9hb3V0NjQuYwpAQCAtMCwwICsxLDMxIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIDY0LWJpdCBhLm91dCBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBBUkNIX1NJWkUgNjQKKworLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLworI2lmbmRlZiBCTUFHSUMKKyNkZWZpbmUgQk1BR0lDIDAKKyNlbmRpZgorI2lmbmRlZiBRTUFHSUMKKyNkZWZpbmUgUU1BR0lDIDAKKyNlbmRpZgorCisjaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0ZjEuaCBiL2JmZC9hb3V0ZjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY5NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FvdXRmMS5oCkBAIC0wLDAgKzEsODU5IEBACisvKiBBLm91dCAiZm9ybWF0IDEiIGZpbGUgaGFuZGxpbmcgY29kZSBmb3IgQkZELgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaW5jbHVkZSAiYW91dC9zdW40LmgiCisjaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorCisvKiBUaGlzIGlzIG5lZWRlZCB0byByZWplY3QgYSBOZXdzT1MgZmlsZSwgZS5nLiBpbgorICAgZ2RiL3Rlc3RzdWl0ZS9nZGIudDEwL2Nyb3NzbG9hZC5leHAuIDxraW5nZG9uQGN5Z251cy5jb20+CisgICBJIG5lZWRlZCB0byBhZGQgTV9VTktOT1dOIHRvIHJlY29nbml6ZSBhIDY4MDAwIG9iamVjdCwgc28gdGhpcyB3aWxsCisgICBwcm9iYWJseSBubyBsb25nZXIgcmVqZWN0IGEgTmV3c09TIG9iamVjdC4gIDxpYW5AY3lnbnVzLmNvbT4uICovCisjaWZuZGVmIE1BQ0hUWVBFX09LCisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCisgICgoKG10eXBlKSA9PSBNX1NQQVJDICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIDApICE9IE5VTEwpIFwKKyAgIHx8ICgoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkgXAorICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfbTY4aywgMCkgIT0gTlVMTCkpCisjZW5kaWYKKworLyoKK1RoZSBmaWxlIEBjb2Rle2FvdXRmMS5ofSBjb250YWlucyB0aGUgY29kZSBmb3IgQkZEJ3MKK2Eub3V0IGJhY2sgZW5kLiBDb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBiYWNrIGVuZCBpcyBnaXZlbiBieSB0aGVzZQordHdvIHByZXByb2Nlc3NvciBuYW1lczoKK0B0YWJsZSBAY29kZQorQGl0ZW0gQVJDSF9TSVpFCitUaGlzIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgMzIgb3IgNjQsIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIGFuCitpbnQgaW4gdGhlIHRhcmdldCBmb3JtYXQuIEl0IGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzIHdoaWNoCitwZXJmb3JtIHRoZSBtZW1vcnkvZGlzayBtYXBwaW5nIG9mIHN0cnVjdHVyZXMuCisKK1RoZSA2NCBiaXQgYmFja2VuZCBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIDY0CitpbnRzIChlZyBsb25nIGxvbmcgd2l0aCBnY2MpLCBieSBkZWZpbmluZyB0aGUgbmFtZSBAY29kZXtCRkRfSE9TVF82NF9CSVR9IGluIEBjb2Rle2JmZC5ofS4KK1dpdGggdGhpcyBuYW1lIGRlZmluZWQsIEBlbXBoe2FsbH0gYmZkIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIDY0Yml0Cithcml0aG1ldGljLCBub3QganVzdCB0aG9zZSB0byBhIDY0Yml0IHRhcmdldC4KKworQGl0ZW0gVEFSR0VUTkFNRQorVGhlIG5hbWUgcHV0IGludG8gdGhlIHRhcmdldCB2ZWN0b3IuCitAaXRlbQorQGVuZCB0YWJsZQorCisqLworCisvKlNVUFBSRVNTNTU4Ki8KKy8qU1VQUFJFU1M1MjkqLworCisjaWYgQVJDSF9TSVpFID09IDY0CisjZGVmaW5lIHN1bm9zX3NldF9hcmNoX21hY2ggc3Vub3NfNjRfc2V0X2FyY2hfbWFjaAorI2RlZmluZSBzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgYW91dF82NF9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCisjZWxzZQorI2RlZmluZSBzdW5vc19zZXRfYXJjaF9tYWNoIHN1bm9zXzMyX3NldF9hcmNoX21hY2gKKyNkZWZpbmUgc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cworI2VuZGlmCisKK3N0YXRpYyBib29sZWFuIHN1bm9zX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgdm9pZCBzdW5vc19zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGNob29zZV9yZWxvY19zaXplIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdW5vc193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpzdW5vczRfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjaGFyICpzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4gc3Vub3M0X3NldF9zaXplcyBQQVJBTVMgKChiZmQgKikpOworCisvKiBNZXJnZSBiYWNrZW5kIGRhdGEgaW50byB0aGUgb3V0cHV0IGZpbGUuCisgICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzcGFyY2xldC1hb3V0IHdoZXJlIHdlIHdhbnQgdGhlIHJlc3VsdGFudCBtYWNoaW5lCisgICBudW1iZXIgdG8gYmUgTV9TUEFSQ0xFVCBpZiBhbnkgaW5wdXQgZmlsZSBpcyBNX1NQQVJDTEVULiAgKi8KKworI2RlZmluZSBNWV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisKK3N0YXRpYyBib29sZWFuCitzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQsICpvYmZkOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfYXJjaF9zcGFyYykKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCisJYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgZWl0aGVyIHN1bm9zXzMyX3NldF9hcmNoX21hY2ggb3Igc3Vub3NfNjRfc2V0X2FyY2hfbWFjaCwKKyAgIGRlcGVuZGluZyB1cG9uIEFSQ0hfU0laRS4gICovCisKK3N0YXRpYyB2b2lkCitzdW5vc19zZXRfYXJjaF9tYWNoIChhYmZkLCBtYWNodHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgbWFjaHR5cGU7Cit7CisgIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKyAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgIGxvbmcgbWFjaGluZTsKKyAgc3dpdGNoIChtYWNodHlwZSkKKyAgICB7CisKKyAgICBjYXNlIE1fVU5LTk9XTjoKKyAgICAgIC8qIFNvbWUgU3VuM3MgbWFrZSBtYWdpYyBudW1iZXJzIHdpdGhvdXQgY3B1IHR5cGVzIGluIHRoZW0sIHNvCisJIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIDY4MDAwLiAqLworICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fNjgwMTA6CisgICAgY2FzZSBNX0hQMjAwOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDEwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fNjgwMjA6CisgICAgY2FzZSBNX0hQMzAwOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU1BBUkM6CisgICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7CisgICAgICBtYWNoaW5lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NQQVJDTEVUOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOworICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU1BBUkNMSVRFX0xFOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOworICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNXzM4NjoKKyAgICBjYXNlIE1fMzg2X0RZTklYOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX2kzODY7CisgICAgICBtYWNoaW5lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNXzI5SzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9IUFVYOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKK30KKworI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKKyAgTkFNRShzdW5vcyxzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKKyAgY2hvb3NlX3JlbG9jX3NpemUoQUJGRCk7CisKKy8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KK3N0YXRpYyB2b2lkCitjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCisgICAgeworICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6CisgICAgY2FzZSBiZmRfYXJjaF9hMjlrOgorICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIFN1bk9TIGZvcm1hdC4gIFNlY3Rpb24gY29udGVudHMgaGF2ZQorICAgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZAorICAgcmVsb2NhdGlvbi4gIFRoZSByZWFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBlaXRoZXIKKyAgIGFvdXRfNjRfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyBvcgorICAgYW91dF8zMl9zdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBkZXBlbmRpbmcgdXBvbiBBUkNIX1NJWkUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKworICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCisgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfYXJjaF9tNjhrOgorICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorCXsKKwljYXNlIGJmZF9tYWNoX202ODAwMDoKKwkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fVU5LTk9XTik7CisJICBicmVhazsKKwljYXNlIGJmZF9tYWNoX202ODAxMDoKKwkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMTApOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIGJmZF9tYWNoX202ODAyMDoKKwkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMjApOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKKyAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKKwl7CisJY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldDoKKwkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkNMRVQpOworCSAgYnJlYWs7CisJY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGU6CisJICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDTElURV9MRSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQyk7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2kzODY6CisgICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2EyOWs6CisgICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzI5Syk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9VTktOT1dOKTsKKyAgICB9CisKKyAgY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpOworCisgIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOworCisgIE5fU0VUX0RZTkFNSUMgKCpleGVjcCwgYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpOworCisgIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIGNvcmUgZmlsZXMgKi8KKworI2RlZmluZSBDT1JFX01BR0lDIDB4MDgwNDU2CisjZGVmaW5lIENPUkVfTkFNRUxFTiAxNgorCisvKiBUaGUgY29yZSBzdHJ1Y3R1cmUgaXMgdGFrZW4gZnJvbSB0aGUgU3VuIGRvY3VtZW50YXRpb24uCisgIFVuZm9ydHVuYXRlbHksIHRoZXkgZG9uJ3QgZG9jdW1lbnQgdGhlIEZQQSBzdHJ1Y3R1cmUsIG9yIGF0IGxlYXN0IEkKKyAgY2FuJ3QgZmluZCBpdCBlYXNpbHkuICBGb3J0dW5hdGVseSB0aGUgY29yZSBoZWFkZXIgY29udGFpbnMgaXRzIG93bgorICBsZW5ndGguICBTbyB0aGlzIHNob3VsZG4ndCBjYXVzZSBwcm9ibGVtcywgZXhjZXB0IGZvciBjX3Vjb2RlLCB3aGljaAorICBzbyBmYXIgd2UgZG9uJ3QgdXNlIGJ1dCBpcyBlYXN5IHRvIGZpbmQgd2l0aCBhIGxpdHRsZSBhcml0aG1ldGljLiAqLworCisvKiBCdXQgdGhlIHJlZyBzdHJ1Y3R1cmUgY2FuIGJlIGdvdHRlbiBmcm9tIHRoZSBTUEFSQyBwcm9jZXNzb3IgaGFuZGJvb2suCisgIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBpbiBhIEdOVSBpbmNsdWRlIGZpbGUgdGhvdWdoIHNvIHRoYXQgZ2RiIGNhbiB1c2UKKyAgdGhlIHNhbWUgaW5mby4gKi8KK3N0cnVjdCByZWdzCit7CisgIGludCByX3BzcjsKKyAgaW50IHJfcGM7CisgIGludCByX25wYzsKKyAgaW50IHJfeTsKKyAgaW50IHJfZzE7CisgIGludCByX2cyOworICBpbnQgcl9nMzsKKyAgaW50IHJfZzQ7CisgIGludCByX2c1OworICBpbnQgcl9nNjsKKyAgaW50IHJfZzc7CisgIGludCByX28wOworICBpbnQgcl9vMTsKKyAgaW50IHJfbzI7CisgIGludCByX28zOworICBpbnQgcl9vNDsKKyAgaW50IHJfbzU7CisgIGludCByX282OworICBpbnQgcl9vNzsKK307CisKKy8qIFRha2VuIGZyb20gU3VuIGRvY3VtZW50YXRpb246ICovCisKKy8qIEZJWE1FOiAgSXQncyB3b3JzZSB0aGFuIHdlIGV4cGVjdC4gIFRoaXMgc3RydWN0IGNvbnRhaW5zIFRXTyBzdWJzdHJ1Y3RzCisgIG5laXRoZXIgb2Ygd2hvc2Ugc2l6ZSB3ZSBrbm93LCBXSVRIIFNUVUZGIElOIEJFVFdFRU4gVEhFTSEgIFdlIGNhbid0CisgIGV2ZW4gcG9ydGFibHkgYWNjZXNzIHRoZSBzdHVmZiBpbiBiZXR3ZWVuISAgKi8KKworc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUKKyAgeworICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCisgICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCisjZGVmaW5lCVNQQVJDX0NPUkVfTEVOCTQzMgorICAgIGludCBjX3JlZ3NbMTldOwkJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtLSBNQUNIREVQIFNJWkUgKi8KKyAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBjX2FvdXRoZHI7CS8qIEEub3V0IGhlYWRlciAqLworICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLworICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KKyAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCisgICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KKyAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCisgICAgZG91YmxlIGZwX3N0dWZmWzFdOwkJLyogZXh0ZXJuYWwgRlBVIHN0YXRlIChzaXplIHVua25vd24gYnkgdXMpICovCisgICAgLyogVGhlIHR5cGUgImRvdWJsZSIgaXMgY3JpdGljYWwgaGVyZSwgZm9yIGFsaWdubWVudC4KKyAgICBTdW5PUyBkZWNsYXJlcyBhIHN0cnVjdCBoZXJlLCBidXQgdGhlIHN0cnVjdCdzIGFsaWdubWVudAorICAgICAgaXMgZG91YmxlIHNpbmNlIGl0IGNvbnRhaW5zIGRvdWJsZXMuICAqLworICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLworICAgIC8qICh0aGlzIG1lbWJlciBpcyBub3QgYWNjZXNzaWJsZSBieSBuYW1lIHNpbmNlIHdlIGRvbid0CisgICAgcG9ydGFibHkga25vdyB0aGUgc2l6ZSBvZiBmcF9zdHVmZi4pICovCisgIH07CisKKy8qIENvcmUgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzCisgICBpdCB0byBydW4gU3VuT1M0IGEub3V0IGZpbGVzKS4gICovCitzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZQorICB7CisgICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KKyAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KKyNkZWZpbmUJU09MQVJJU19CQ1BfQ09SRV9MRU4JNDU2CisgICAgaW50IGNfcmVnc1sxOV07CQkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIC0tIE1BQ0hERVAgU0laRSAqLworICAgIGludCBjX2V4ZGF0YV92cDsJCS8qIGV4ZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgY19leGRhdGFfdHNpemU7CisgICAgaW50IGNfZXhkYXRhX2RzaXplOworICAgIGludCBjX2V4ZGF0YV9ic2l6ZTsKKyAgICBpbnQgY19leGRhdGFfbHNpemU7CisgICAgaW50IGNfZXhkYXRhX25zaGxpYnM7CisgICAgc2hvcnQgY19leGRhdGFfbWFjaDsKKyAgICBzaG9ydCBjX2V4ZGF0YV9tYWc7CisgICAgaW50IGNfZXhkYXRhX3RvZmZzZXQ7CisgICAgaW50IGNfZXhkYXRhX2RvZmZzZXQ7CisgICAgaW50IGNfZXhkYXRhX2xvZmZzZXQ7CisgICAgaW50IGNfZXhkYXRhX3R4dG9yZzsKKyAgICBpbnQgY19leGRhdGFfZGF0b3JnOworICAgIGludCBjX2V4ZGF0YV9lbnRsb2M7CisgICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCisgICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLworICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KKyAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLworICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KKyAgICBkb3VibGUgZnBfc3R1ZmZbMV07CQkvKiBleHRlcm5hbCBGUFUgc3RhdGUgKHNpemUgdW5rbm93biBieSB1cykgKi8KKyAgICAvKiBUaGUgdHlwZSAiZG91YmxlIiBpcyBjcml0aWNhbCBoZXJlLCBmb3IgYWxpZ25tZW50LgorICAgIFN1bk9TIGRlY2xhcmVzIGEgc3RydWN0IGhlcmUsIGJ1dCB0aGUgc3RydWN0J3MgYWxpZ25tZW50CisgICAgICBpcyBkb3VibGUgc2luY2UgaXQgY29udGFpbnMgZG91Ymxlcy4gICovCisgICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCisgICAgLyogKHRoaXMgbWVtYmVyIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUgc2luY2Ugd2UgZG9uJ3QKKyAgICBwb3J0YWJseSBrbm93IHRoZSBzaXplIG9mIGZwX3N0dWZmLikgKi8KKyAgfTsKKworc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZQorICB7CisgICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KKyAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KKyNkZWZpbmUJU1VOM19DT1JFX0xFTgk4MjYJLyogQXMgb2YgU3VuT1MgNC4xLjEgKi8KKyAgICBpbnQgY19yZWdzWzE4XTsJCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLS0gTUFDSERFUCBTSVpFICovCisgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgY19hb3V0aGRyOwkvKiBBLm91dCBoZWFkZXIgKi8KKyAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KKyAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCisgICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLworICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCisgICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLworICAgIGRvdWJsZSBmcF9zdHVmZlsxXTsJCS8qIGV4dGVybmFsIEZQVSBzdGF0ZSAoc2l6ZSB1bmtub3duIGJ5IHVzKSAqLworICAgIC8qIFRoZSB0eXBlICJkb3VibGUiIGlzIGNyaXRpY2FsIGhlcmUsIGZvciBhbGlnbm1lbnQuCisgICAgU3VuT1MgZGVjbGFyZXMgYSBzdHJ1Y3QgaGVyZSwgYnV0IHRoZSBzdHJ1Y3QncyBhbGlnbm1lbnQKKyAgICAgIGlzIGRvdWJsZSBzaW5jZSBpdCBjb250YWlucyBkb3VibGVzLiAgKi8KKyAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KKyAgICAvKiAodGhpcyBtZW1iZXIgaXMgbm90IGFjY2Vzc2libGUgYnkgbmFtZSBzaW5jZSB3ZSBkb24ndAorICAgIHBvcnRhYmx5IGtub3cgdGhlIHNpemUgb2YgZnBfc3R1ZmYuKSAqLworICB9OworCitzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZQorICB7CisgICAgaW50IGNfbWFnaWM7CQkvKiBDb3JlZmlsZSBtYWdpYyBudW1iZXIgKi8KKyAgICBpbnQgY19sZW47CQkJLyogU2l6ZW9mIChzdHJ1Y3QgY29yZSkgKi8KKyAgICBsb25nIGNfcmVnc19wb3M7CQkvKiBmaWxlIG9mZnNldCBvZiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCisgICAgaW50IGNfcmVnc19zaXplOwkJLyogc2l6ZSBvZiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCisgICAgc3RydWN0IGludGVybmFsX2V4ZWMgY19hb3V0aGRyOwkvKiBBLm91dCBoZWFkZXIgKi8KKyAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KKyAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCisgICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLworICAgIGJmZF92bWEgY19kYXRhX2FkZHI7CS8qIERhdGEgc3RhcnQgKGFkZHJlc3MpICovCisgICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KKyAgICBiZmRfdm1hIGNfc3RhY2t0b3A7CQkvKiBTdGFjayB0b3AgKGFkZHJlc3MpICovCisgICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLworICAgIGxvbmcgZnBfc3R1ZmZfcG9zOwkJLyogZmlsZSBvZmZzZXQgb2YgZXh0ZXJuYWwgRlBVIHN0YXRlIChyZWdzKSAqLworICAgIGludCBmcF9zdHVmZl9zaXplOwkJLyogU2l6ZSBvZiBpdCAqLworICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLworICB9OworCitzdGF0aWMgdm9pZCBzd2FwY29yZV9zdW4zCisgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICopKTsKK3N0YXRpYyB2b2lkIHN3YXBjb3JlX3NwYXJjCisgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICopKTsKK3N0YXRpYyB2b2lkIHN3YXBjb3JlX3NvbGFyaXNfYmNwCisgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICopKTsKKworLyogYnl0ZS1zd2FwIGluIHRoZSBTdW4tMyBjb3JlIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQKK3N3YXBjb3JlX3N1bjMgKGFiZmQsIGV4dCwgaW50Y29yZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpleHQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICppbnRjb3JlOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICpleHRjb3JlID0gKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgZXh0OworCisgIGludGNvcmUtPmNfbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX21hZ2ljKTsKKyAgaW50Y29yZS0+Y19sZW4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2xlbik7CisgIGludGNvcmUtPmNfcmVnc19wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSAwKS0+Y19yZWdzKTsKKyAgaW50Y29yZS0+Y19yZWdzX3NpemUgPSBzaXplb2YgKGV4dGNvcmUtPmNfcmVncyk7CisjaWYgQVJDSF9TSVpFID09IDY0CisgIGFvdXRfNjRfc3dhcF9leGVjX2hlYWRlcl9pbgorI2Vsc2UKKyAgYW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luCisjZW5kaWYKKyAgICAoYWJmZCwgJmV4dGNvcmUtPmNfYW91dGhkciwgJmludGNvcmUtPmNfYW91dGhkcik7CisgIGludGNvcmUtPmNfc2lnbm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NpZ25vKTsKKyAgaW50Y29yZS0+Y190c2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfdHNpemUpOworICBpbnRjb3JlLT5jX2RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19kc2l6ZSk7CisgIGludGNvcmUtPmNfZGF0YV9hZGRyID0gTl9EQVRBRERSIChpbnRjb3JlLT5jX2FvdXRoZHIpOworICBpbnRjb3JlLT5jX3NzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zc2l6ZSk7CisgIG1lbWNweSAoaW50Y29yZS0+Y19jbWRuYW1lLCBleHRjb3JlLT5jX2NtZG5hbWUsIHNpemVvZiAoaW50Y29yZS0+Y19jbWRuYW1lKSk7CisgIGludGNvcmUtPmZwX3N0dWZmX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIDApLT5mcF9zdHVmZik7CisgIC8qIEZQIHN0dWZmIHRha2VzIHVwIHdob2xlIHJlc3Qgb2Ygc3RydWN0LCBleGNlcHQgY191Y29kZS4gKi8KKyAgaW50Y29yZS0+ZnBfc3R1ZmZfc2l6ZSA9IGludGNvcmUtPmNfbGVuIC0gKHNpemVvZiBleHRjb3JlLT5jX3Vjb2RlKSAtCisgICAgKGZpbGVfcHRyKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIDApLT5mcF9zdHVmZik7CisgIC8qIFVjb2RlIGlzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBzdHJ1Y3QgLS0ganVzdCBiZWZvcmUgdGhlIGVuZCAqLworICBpbnRjb3JlLT5jX3Vjb2RlID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsCisgICAgaW50Y29yZS0+Y19sZW4gLSBzaXplb2YgKGV4dGNvcmUtPmNfdWNvZGUpICsgKHVuc2lnbmVkIGNoYXIgKikgZXh0Y29yZSk7CisgIGludGNvcmUtPmNfc3RhY2t0b3AgPSAweDBFMDAwMDAwOwkvKiBCeSBleHBlcmltZW50YXRpb24gKi8KK30KKworCisvKiBieXRlLXN3YXAgaW4gdGhlIFNwYXJjIGNvcmUgc3RydWN0dXJlICovCitzdGF0aWMgdm9pZAorc3dhcGNvcmVfc3BhcmMgKGFiZmQsIGV4dCwgaW50Y29yZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpleHQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICppbnRjb3JlOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqZXh0Y29yZSA9IChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSBleHQ7CisKKyAgaW50Y29yZS0+Y19tYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbWFnaWMpOworICBpbnRjb3JlLT5jX2xlbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfbGVuKTsKKyAgaW50Y29yZS0+Y19yZWdzX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSAwKS0+Y19yZWdzKTsKKyAgaW50Y29yZS0+Y19yZWdzX3NpemUgPSBzaXplb2YgKGV4dGNvcmUtPmNfcmVncyk7CisjaWYgQVJDSF9TSVpFID09IDY0CisgIGFvdXRfNjRfc3dhcF9leGVjX2hlYWRlcl9pbgorI2Vsc2UKKyAgYW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luCisjZW5kaWYKKyAgICAoYWJmZCwgJmV4dGNvcmUtPmNfYW91dGhkciwgJmludGNvcmUtPmNfYW91dGhkcik7CisgIGludGNvcmUtPmNfc2lnbm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3NpZ25vKTsKKyAgaW50Y29yZS0+Y190c2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfdHNpemUpOworICBpbnRjb3JlLT5jX2RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19kc2l6ZSk7CisgIGludGNvcmUtPmNfZGF0YV9hZGRyID0gTl9EQVRBRERSIChpbnRjb3JlLT5jX2FvdXRoZHIpOworICBpbnRjb3JlLT5jX3NzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zc2l6ZSk7CisgIG1lbWNweSAoaW50Y29yZS0+Y19jbWRuYW1lLCBleHRjb3JlLT5jX2NtZG5hbWUsIHNpemVvZiAoaW50Y29yZS0+Y19jbWRuYW1lKSk7CisgIGludGNvcmUtPmZwX3N0dWZmX3BvcyA9IChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc3BhcmNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOworICAvKiBGUCBzdHVmZiB0YWtlcyB1cCB3aG9sZSByZXN0IG9mIHN0cnVjdCwgZXhjZXB0IGNfdWNvZGUuICovCisgIGludGNvcmUtPmZwX3N0dWZmX3NpemUgPSBpbnRjb3JlLT5jX2xlbiAtIChzaXplb2YgZXh0Y29yZS0+Y191Y29kZSkgLQorICAgIChmaWxlX3B0cikgKCgoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKKyAgLyogVWNvZGUgaXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIHN0cnVjdCAtLSBqdXN0IGJlZm9yZSB0aGUgZW5kICovCisgIGludGNvcmUtPmNfdWNvZGUgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwKKyAgICBpbnRjb3JlLT5jX2xlbiAtIHNpemVvZiAoZXh0Y29yZS0+Y191Y29kZSkgKyAodW5zaWduZWQgY2hhciAqKSBleHRjb3JlKTsKKworICAvKiBTdXBwb3NlZGx5IHRoZSB1c2VyIHN0YWNrIGdyb3dzIGRvd253YXJkIGZyb20gdGhlIGJvdHRvbSBvZiBrZXJuZWwgbWVtb3J5LgorICAgICBQcmVzdW1pbmcgdGhhdCB0aGlzIHJlbWFpbnMgdHJ1ZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgd29yay4gICovCisgIC8qIE5vdyBzdW4gaGFzIHByb3ZpZGVkIHVzIHdpdGggYW5vdGhlciBjaGFsbGVuZ2UuICBUaGUgdmFsdWUgaXMgZGlmZmVyZW50CisgICAgIGZvciBzcGFyYzIgYW5kIHNwYXJjMTAgKGJvdGggcnVubmluZyBTdW5PUyA0LjEuMykuICBXZSBwaWNrIG9uZSBvcgorICAgICB0aGUgb3RoZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGlzCisgICAgIGxvc2VzIChhKSBpZiB0aGUgc3RhY2sgcG9pbnRlciBoYXMgYmVlbiBjbG9iYmVyZWQsIG9yIChiKSBpZiB0aGUgc3RhY2sKKyAgICAgaXMgbGFyZ2VyIHRoYW4gMTI4IG1lZ2FieXRlcy4KKworICAgICBJdCdzIHRpbWVzIGxpa2UgdGhlc2UgeW91J3JlIGdsYWQgdGhleSdyZSBzd2l0Y2hpbmcgdG8gRUxGLgorCisgICAgIE5vdGUgdGhhdCB1c2luZyBpbmNsdWRlIGZpbGVzIG9yIG5saXN0IG9uIC92bXVuaXggd291bGQgYmUgd3JvbmcsCisgICAgIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgZm9yIHRoaXMgY29yZSBmaWxlLCBubyBtYXR0ZXIgd2hhdCBraW5kIG9mCisgICAgIG1hY2hpbmUgd2Ugd2VyZSBjb21waWxlZCBvbiBvciBhcmUgcnVubmluZyBvbi4gICovCisjZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMiAoKGJmZF92bWEpMHhmODAwMDAwMCkKKyNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCAoKGJmZF92bWEpMHhmMDAwMDAwMCkKKyAgeworICAgIGJmZF92bWEgc3AgPSBiZmRfaF9nZXRfMzIKKyAgICAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJigoc3RydWN0IHJlZ3MgKikgJmV4dGNvcmUtPmNfcmVnc1swXSktPnJfbzYpOworICAgIGlmIChzcCA8IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTApCisgICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMDsKKyAgICBlbHNlCisgICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMyOworICB9Cit9CisKKy8qIGJ5dGUtc3dhcCBpbiB0aGUgU29sYXJpcyBCQ1AgY29yZSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB2b2lkCitzd2FwY29yZV9zb2xhcmlzX2JjcCAoYWJmZCwgZXh0LCBpbnRjb3JlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKmV4dDsKKyAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmludGNvcmU7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICpleHRjb3JlID0KKyAgICAoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgZXh0OworCisgIGludGNvcmUtPmNfbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX21hZ2ljKTsKKyAgaW50Y29yZS0+Y19sZW4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2xlbik7CisgIGludGNvcmUtPmNfcmVnc19wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgMCktPmNfcmVncyk7CisgIGludGNvcmUtPmNfcmVnc19zaXplID0gc2l6ZW9mIChleHRjb3JlLT5jX3JlZ3MpOworCisgIC8qIFRoZSBTb2xhcmlzIEJDUCBleGRhdGEgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW4gYV9zeW1zIGZpZWxkLAorICAgICBzbyB3ZSBhcmUgdW5hYmxlIHRvIHN5bnRoZXNpemUgYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIuCisgICAgIEx1Y2tpbHkgd2UgYXJlIGFibGUgdG8gZmlndXJlIG91dCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWN0aW9uLAorICAgICB3aGljaCBpcyB0aGUgb25seSB0aGluZyBuZWVkZWQgZnJvbSB0aGUgaW50ZXJuYWwgZXhlYyBoZWFkZXIsCisgICAgIGZyb20gdGhlIGV4ZGF0YSBzdHJ1Y3R1cmUuCisKKyAgICAgQXMgb2YgU29sYXJpcyAyLjMsIEJDUCBjb3JlIGZpbGVzIGZvciBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcworICAgICBhcmUgYnVnZ3kuIFRoZSBleGRhdGEgc3RydWN0dXJlIGlzIG5vdCBwcm9wZXJseSBmaWxsZWQgaW4sIGFuZAorICAgICB0aGUgZGF0YSBzZWN0aW9uIGlzIHdyaXR0ZW4gZnJvbSBhZGRyZXNzIHplcm8gaW5zdGVhZCBvZiB0aGUgZGF0YQorICAgICBzdGFydCBhZGRyZXNzLiAgKi8KKyAgbWVtc2V0ICgoUFRSKSAmaW50Y29yZS0+Y19hb3V0aGRyLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7CisgIGludGNvcmUtPmNfZGF0YV9hZGRyID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2V4ZGF0YV9kYXRvcmcpOworICBpbnRjb3JlLT5jX3NpZ25vID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zaWdubyk7CisgIGludGNvcmUtPmNfdHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3RzaXplKTsKKyAgaW50Y29yZS0+Y19kc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZHNpemUpOworICBpbnRjb3JlLT5jX3NzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zc2l6ZSk7CisgIG1lbWNweSAoaW50Y29yZS0+Y19jbWRuYW1lLCBleHRjb3JlLT5jX2NtZG5hbWUsIHNpemVvZiAoaW50Y29yZS0+Y19jbWRuYW1lKSk7CisgIGludGNvcmUtPmZwX3N0dWZmX3BvcyA9CisgICAgKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIDApLT5mcF9zdHVmZik7CisgIC8qIEZQIHN0dWZmIHRha2VzIHVwIHdob2xlIHJlc3Qgb2Ygc3RydWN0LCBleGNlcHQgY191Y29kZS4gKi8KKyAgaW50Y29yZS0+ZnBfc3R1ZmZfc2l6ZSA9IGludGNvcmUtPmNfbGVuIC0gKHNpemVvZiBleHRjb3JlLT5jX3Vjb2RlKSAtCisgICAgKGZpbGVfcHRyKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOworICAvKiBVY29kZSBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc3RydWN0IC0tIGp1c3QgYmVmb3JlIHRoZSBlbmQgKi8KKyAgaW50Y29yZS0+Y191Y29kZSA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLAorICAgIGludGNvcmUtPmNfbGVuIC0gc2l6ZW9mIChleHRjb3JlLT5jX3Vjb2RlKSArICh1bnNpZ25lZCBjaGFyICopIGV4dGNvcmUpOworCisgIC8qIFN1cHBvc2VkbHkgdGhlIHVzZXIgc3RhY2sgZ3Jvd3MgZG93bndhcmQgZnJvbSB0aGUgYm90dG9tIG9mIGtlcm5lbCBtZW1vcnkuCisgICAgIFByZXN1bWluZyB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLCB0aGlzIGRlZmluaXRpb24gd2lsbCB3b3JrLiAgKi8KKyAgLyogTm93IHN1biBoYXMgcHJvdmlkZWQgdXMgd2l0aCBhbm90aGVyIGNoYWxsZW5nZS4gIFRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQKKyAgICAgZm9yIHNwYXJjMiBhbmQgc3BhcmMxMCAoYm90aCBydW5uaW5nIFN1bk9TIDQuMS4zKS4gIFdlIHBpY2sgb25lIG9yCisgICAgIHRoZSBvdGhlciBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RhY2sgcG9pbnRlci4gIFRoaXMKKyAgICAgbG9zZXMgKGEpIGlmIHRoZSBzdGFjayBwb2ludGVyIGhhcyBiZWVuIGNsb2JiZXJlZCwgb3IgKGIpIGlmIHRoZSBzdGFjaworICAgICBpcyBsYXJnZXIgdGhhbiAxMjggbWVnYWJ5dGVzLgorCisgICAgIEl0J3MgdGltZXMgbGlrZSB0aGVzZSB5b3UncmUgZ2xhZCB0aGV5J3JlIHN3aXRjaGluZyB0byBFTEYuCisKKyAgICAgTm90ZSB0aGF0IHVzaW5nIGluY2x1ZGUgZmlsZXMgb3Igbmxpc3Qgb24gL3ZtdW5peCB3b3VsZCBiZSB3cm9uZywKKyAgICAgYmVjYXVzZSB3ZSB3YW50IHRoZSB2YWx1ZSBmb3IgdGhpcyBjb3JlIGZpbGUsIG5vIG1hdHRlciB3aGF0IGtpbmQgb2YKKyAgICAgbWFjaGluZSB3ZSB3ZXJlIGNvbXBpbGVkIG9uIG9yIGFyZSBydW5uaW5nIG9uLiAgKi8KKyNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMyICgoYmZkX3ZtYSkweGY4MDAwMDAwKQorI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwICgoYmZkX3ZtYSkweGYwMDAwMDAwKQorICB7CisgICAgYmZkX3ZtYSBzcCA9IGJmZF9oX2dldF8zMgorICAgIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmKChzdHJ1Y3QgcmVncyAqKSAmZXh0Y29yZS0+Y19yZWdzWzBdKS0+cl9vNik7CisgICAgaWYgKHNwIDwgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCkKKyAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzEwOworICAgIGVsc2UKKyAgICAgIGludGNvcmUtPmNfc3RhY2t0b3AgPSBTUEFSQ19VU1JTVEFDS19TUEFSQzI7CisgIH0KK30KKworLyogbmVlZCB0aGlzIGNhc3QgYmVjYXVzZSBwdHIgaXMgcmVhbGx5IHZvaWQgKiAqLworI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuc3VuX2NvcmVfZGF0YSkKKyNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPmRhdGFfc2VjdGlvbikKKyNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5zdGFja19zZWN0aW9uKQorI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWdfc2VjdGlvbikKKyNkZWZpbmUgY29yZV9yZWcyc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPnJlZzJfc2VjdGlvbikKKworLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KK3N0cnVjdCBzdW5fY29yZV9zdHJ1Y3QKK3sKKyAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmhkcjsJLyogY29yZSBmaWxlIGhlYWRlciAqLworICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOworICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKKyAgYXNlY3Rpb24gKnJlZ19zZWN0aW9uOworICBhc2VjdGlvbiAqcmVnMl9zZWN0aW9uOworfTsKKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorc3Vub3M0X2NvcmVfZmlsZV9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgbG9uZ2J1Zls0XTsJLyogUmF3IGJ5dGVzIG9mIHZhcmlvdXMgaGVhZGVyIGZpZWxkcyAqLworICBiZmRfc2l6ZV90eXBlIGNvcmVfc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBjb3JlX21hZzsKKyAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgKmNvcmU7CisgIGNoYXIgKmV4dGNvcmU7CisgIHN0cnVjdCBtZXJnZW0KKyAgICB7CisgICAgICBzdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0IHN1bmNvcmVkYXRhOworICAgICAgc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUgaW50ZXJuYWxfc3Vub3NfY29yZTsKKyAgICAgIGNoYXIgZXh0ZXJuYWxfY29yZVsxXTsKKyAgICB9CisgICAqbWVyZ2VtOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgbG9uZ2J1ZiwgMSwgc2l6ZW9mIChsb25nYnVmKSwgYWJmZCkgIT0KKyAgICAgIHNpemVvZiAobG9uZ2J1ZikpCisgICAgcmV0dXJuIDA7CisgIGNvcmVfbWFnID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBsb25nYnVmKTsKKworICBpZiAoY29yZV9tYWcgIT0gQ09SRV9NQUdJQykKKyAgICByZXR1cm4gMDsKKworICAvKiBTdW5PUyBjb3JlIGhlYWRlcnMgY2FuIHZhcnkgaW4gbGVuZ3RoOyBzZWNvbmQgd29yZCBpcyBzaXplOyAqLworICBpZiAoYmZkX3JlYWQgKChQVFIpIGxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9CisgICAgICBzaXplb2YgKGxvbmdidWYpKQorICAgIHJldHVybiAwOworICBjb3JlX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGxvbmdidWYpOworICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgaWYgKGNvcmVfc2l6ZSA+IDIwMDAwKQorICAgIHJldHVybiAwOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgPCAwKQorICAgIHJldHVybiAwOworCisgIG1lcmdlbSA9IChzdHJ1Y3QgbWVyZ2VtICopIGJmZF96YWxsb2MgKGFiZmQsIGNvcmVfc2l6ZSArIHNpemVvZiAoc3RydWN0IG1lcmdlbSkpOworICBpZiAobWVyZ2VtID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgZXh0Y29yZSA9IG1lcmdlbS0+ZXh0ZXJuYWxfY29yZTsKKworICBpZiAoKGJmZF9yZWFkICgoUFRSKSBleHRjb3JlLCAxLCBjb3JlX3NpemUsIGFiZmQpKSAhPSBjb3JlX3NpemUpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChjaGFyICopIG1lcmdlbSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogVmFsaWRhdGUgdGhhdCBpdCdzIGEgY29yZSBmaWxlIHdlIGtub3cgaG93IHRvIGhhbmRsZSwgZHVlIHRvIHN1bgorICAgICBib3RjaGluZyB0aGUgcG9zaXRpb25pbmcgb2YgcmVnaXN0ZXJzIGFuZCBvdGhlciBmaWVsZHMgaW4gYSBtYWNoaW5lCisgICAgIGRlcGVuZGVudCB3YXkuICAqLworICBjb3JlID0gJm1lcmdlbS0+aW50ZXJuYWxfc3Vub3NfY29yZTsKKyAgc3dpdGNoIChjb3JlX3NpemUpCisgICAgeworICAgIGNhc2UgU1BBUkNfQ09SRV9MRU46CisgICAgICBzd2FwY29yZV9zcGFyYyAoYWJmZCwgZXh0Y29yZSwgY29yZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNVTjNfQ09SRV9MRU46CisgICAgICBzd2FwY29yZV9zdW4zIChhYmZkLCBleHRjb3JlLCBjb3JlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09MQVJJU19CQ1BfQ09SRV9MRU46CisgICAgICBzd2FwY29yZV9zb2xhcmlzX2JjcCAoYWJmZCwgZXh0Y29yZSwgY29yZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsJLyogRklYTUUgKi8KKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKSBtZXJnZW0pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGFiZmQtPnRkYXRhLnN1bl9jb3JlX2RhdGEgPSAmbWVyZ2VtLT5zdW5jb3JlZGF0YTsKKyAgYWJmZC0+dGRhdGEuc3VuX2NvcmVfZGF0YS0+aGRyID0gY29yZTsKKworICAvKiBjcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIHJlY2xhaW0KKyAgICAgdGhlbSAqLworICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7CisgIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQorICAgIHsKKyAgICBsb3NlcjoKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKSBtZXJnZW0pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKKyAgICB7CisgICAgbG9zZXIxOgorICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfc3RhY2tzZWMgKGFiZmQpKTsKKyAgICAgIGdvdG8gbG9zZXI7CisgICAgfQorICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOworICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCisgICAgeworICAgIGxvc2VyMjoKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX2RhdGFzZWMgKGFiZmQpKTsKKyAgICAgIGdvdG8gbG9zZXIxOworICAgIH0KKyAgY29yZV9yZWcyc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7CisgIGlmIChjb3JlX3JlZzJzZWMgKGFiZmQpID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcmVfcmVnc2VjIChhYmZkKSk7CisgICAgICBnb3RvIGxvc2VyMjsKKyAgICB9CisKKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnMiI7CisKKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOworICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7CisgIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+Y19zc2l6ZTsKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+Y19kc2l6ZTsKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBjb3JlLT5jX3JlZ3Nfc2l6ZTsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+ZnBfc3R1ZmZfc2l6ZTsKKworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gKGNvcmUtPmNfc3RhY2t0b3AgLSBjb3JlLT5jX3NzaXplKTsKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gY29yZS0+Y19kYXRhX2FkZHI7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMDsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+dm1hID0gMDsKKworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGNvcmUtPmNfbGVuICsgY29yZS0+Y19kc2l6ZTsKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGNvcmUtPmNfbGVuOworICAvKiBXZSdsbCBhY2Nlc3MgdGhlIHJlZ3MgYWZyZXNoIGluIHRoZSBjb3JlIGZpbGUsIGxpa2UgYW55IHNlY3Rpb246ICovCisgIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cikgY29yZS0+Y19yZWdzX3BvczsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cikgY29yZS0+ZnBfc3R1ZmZfcG9zOworCisgIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKyAgY29yZV9yZWcyc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnMnNlYyAoYWJmZCk7CisKKyAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDQ7CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKK3N0YXRpYyBjaGFyICoKK3N1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmhkci0+Y19jbWRuYW1lOworfQorCitzdGF0aWMgaW50CitzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmhkci0+Y19zaWdubzsKK30KKworc3RhdGljIGJvb2xlYW4KK3N1bm9zNF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKKyAgICAgYmZkICpjb3JlX2JmZDsKKyAgICAgYmZkICpleGVjX2JmZDsKK3sKKyAgaWYgKGNvcmVfYmZkLT54dmVjICE9IGV4ZWNfYmZkLT54dmVjKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFNvbGFyaXMgY29yZSBmaWxlcyBkbyBub3QgaW5jbHVkZSBhbiBhb3V0aGRyLiAqLworICBpZiAoKGNvcmVfaGRyIChjb3JlX2JmZCktPmhkciktPmNfbGVuID09IFNPTEFSSVNfQkNQX0NPUkVfTEVOKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiAobWVtY21wICgoY2hhciAqKSAmKChjb3JlX2hkciAoY29yZV9iZmQpLT5oZHIpLT5jX2FvdXRoZHIpLAorCQkgIChjaGFyICopIGV4ZWNfaGRyIChleGVjX2JmZCksCisJCSAgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpID09IDApID8gdHJ1ZSA6IGZhbHNlOworfQorCisjZGVmaW5lIE1ZX3NldF9zaXplcyBzdW5vczRfc2V0X3NpemVzCitzdGF0aWMgYm9vbGVhbgorc3Vub3M0X3NldF9zaXplcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKKyAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7CisgICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwOworICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKKyAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7CisgICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwMDsKKyAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKKy8qIFdlIGRlZmF1bHQgdG8gc2V0dGluZyB0aGUgdG9vbHZlcnNpb24gZmllbGQgdG8gMSwgYXMgaXMgcmVxdWlyZWQgYnkKKyAgIFN1bk9TLiAgKi8KKyNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKKyNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQorI2VuZGlmCisKKyNpZm5kZWYgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzCisjZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAwCisjZW5kaWYKKyNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scworI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAorI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCisjZW5kaWYKKyNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAorI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKKyNlbmRpZgorI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAorI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCisjZW5kaWYKKyNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYworI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKKyNlbmRpZgorI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCisjZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAorI2VuZGlmCisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgc3Vub3M0X2FvdXRfYmFja2VuZCA9Cit7CisgIDAsCQkJCS8qIHptYWdpYyBmaWxlcyBhcmUgbm90IGNvbnRpZ3VvdXMgKi8KKyAgMSwJCQkJLyogdGV4dCBpbmNsdWRlcyBoZWFkZXIgKi8KKyAgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzLAorICBNWV9leGVjX2hkcl9mbGFncywKKyAgMCwJCQkJLyogZGVmYXVsdCB0ZXh0IHZtYSAqLworICBzdW5vczRfc2V0X3NpemVzLAorICAwLAkJCQkvKiBoZWFkZXIgaXMgY291bnRlZCBpbiB6bWFnaWMgdGV4dCAqLworICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAorICBNWV9hZGRfb25lX3N5bWJvbCwKKyAgTVlfbGlua19keW5hbWljX29iamVjdCwKKyAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCisgIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCisgIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKK307CisMCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgCXN1bm9zNF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisKKyNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCisjZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKKyNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCisJCQkodm9pZCAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAorI2RlZmluZSBNWV9jb3JlX2ZpbGVfcAkJCXN1bm9zNF9jb3JlX2ZpbGVfcAorI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMJTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpCisjZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YQkJCSZzdW5vczRfYW91dF9iYWNrZW5kCisKKyNpZm5kZWYgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUAorI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCisjZW5kaWYKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dHguaCBiL2JmZC9hb3V0eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDRlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYW91dHguaApAQCAtMCwwICsxLDU3MDYgQEAKKy8qIEJGRCBzZW1pLWdlbmVyaWMgYmFjay1lbmQgZm9yIGEub3V0IGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKK1NFQ1RJT04KKwlhLm91dCBiYWNrZW5kcworCisKK0RFU0NSSVBUSU9OCisKKwlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGEub3V0IGZvcm1hdCwKKwl0aG91Z2ggdGhlIG1ham9yIGRpZmZlcmVuY2VzIGFyZSBvbmx5IHRoZSBzaXplcyBvZiB0aGUKKwlzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgc2hhcGUgb2YgdGhlIHJlbG9jYXRpb24KKwlpbmZvcm1hdGlvbi4KKworCVRoZSBzdXBwb3J0IGlzIHNwbGl0IGludG8gYSBiYXNpYyBzdXBwb3J0IGZpbGUgQGZpbGV7YW91dHguaH0KKwlhbmQgb3RoZXIgZmlsZXMgd2hpY2ggZGVyaXZlIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlLiBPbmUKKwlkZXJpdmF0aW9uIGZpbGUgaXMgQGZpbGV7YW91dGYxLmh9IChmb3IgYS5vdXQgZmxhdm91ciAxKSwgYW5kCisJYWRkcyB0byB0aGUgYmFzaWMgYS5vdXQgZnVuY3Rpb25zIHN1cHBvcnQgZm9yIHN1bjMsIHN1bjQsIDM4NgorCWFuZCAyOWsgYS5vdXQgZmlsZXMsIHRvIGNyZWF0ZSBhIHRhcmdldCBqdW1wIHZlY3RvciBmb3IgYQorCXNwZWNpZmljIHRhcmdldC4KKworCVRoaXMgaW5mb3JtYXRpb24gaXMgZnVydGhlciBzcGxpdCBvdXQgaW50byBtb3JlIHNwZWNpZmljIGZpbGVzCisJZm9yIGVhY2ggbWFjaGluZSwgaW5jbHVkaW5nIEBmaWxle3N1bm9zLmN9IGZvciBzdW4zIGFuZCBzdW40LAorCUBmaWxle25ld3NvczMuY30gZm9yIHRoZSBTb255IE5FV1MsIGFuZCBAZmlsZXtkZW1vNjQuY30gZm9yIGEKKwlkZW1vbnN0cmF0aW9uIG9mIGEgNjQgYml0IGEub3V0IGZvcm1hdC4KKworCVRoZSBiYXNlIGZpbGUgQGZpbGV7YW91dHguaH0gZGVmaW5lcyBnZW5lcmFsIG1lY2hhbmlzbXMgZm9yCisJcmVhZGluZyBhbmQgd3JpdGluZyByZWNvcmRzIHRvIGFuZCBmcm9tIGRpc2sgYW5kIHZhcmlvdXMKKwlvdGhlciBtZXRob2RzIHdoaWNoIEJGRCByZXF1aXJlcy4gSXQgaXMgaW5jbHVkZWQgYnkKKwlAZmlsZXthb3V0MzIuY30gYW5kIEBmaWxle2FvdXQ2NC5jfSB0byBmb3JtIHRoZSBuYW1lcworCTw8YW91dF8zMl9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIDw8YW91dF82NF9zd2FwX2V4ZWNfaGVhZGVyX2luPj4sIGV0Yy4KKworCUFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCBnb2VzIG9uIHRvIG1ha2UgdGhlIGJhY2sgZW5kIGZvciBhCisJc3VuNCwgZnJvbSBAZmlsZXthb3V0MzIuY306CisKK3wJI2RlZmluZSBBUkNIX1NJWkUgMzIKK3wJI2luY2x1ZGUgImFvdXR4LmgiCisKKwlXaGljaCBleHBvcnRzIG5hbWVzOgorCit8CS4uLgorfAlhb3V0XzMyX2Nhbm9uaWNhbGl6ZV9yZWxvYworfAlhb3V0XzMyX2ZpbmRfbmVhcmVzdF9saW5lCit8CWFvdXRfMzJfZ2V0X2xpbmVubworfAlhb3V0XzMyX2dldF9yZWxvY191cHBlcl9ib3VuZAorfAkuLi4KKworCWZyb20gQGZpbGV7c3Vub3MuY306CisKK3wJI2RlZmluZSBUQVJHRVRfTkFNRSAiYS5vdXQtc3Vub3MtYmlnIgorfAkjZGVmaW5lIFZFQ05BTUUgICAgc3Vub3NfYmlnX3ZlYworfAkjaW5jbHVkZSAiYW91dGYxLmgiCisKKwlyZXF1aXJlcyBhbGwgdGhlIG5hbWVzIGZyb20gQGZpbGV7YW91dDMyLmN9LCBhbmQgcHJvZHVjZXMgdGhlIGp1bXAgdmVjdG9yCisKK3wJc3Vub3NfYmlnX3ZlYworCisJVGhlIGZpbGUgQGZpbGV7aG9zdC1hb3V0LmN9IGlzIGEgc3BlY2lhbCBjYXNlLiAgSXQgaXMgZm9yIGEgbGFyZ2Ugc2V0CisJb2YgaG9zdHMgdGhhdCB1c2UgYGBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQnJyBhLm91dCBmaWxlcywgYW5kCisJZm9yIHdoaWNoIGNyb3NzLWRlYnVnZ2luZyBpcyBub3QgaW50ZXJlc3RpbmcuICBJdCB1c2VzIHRoZQorCXN0YW5kYXJkIDMyLWJpdCBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLCBidXQgZGV0ZXJtaW5lcyB0aGUKKwlmaWxlIG9mZnNldHMgYW5kIGFkZHJlc3NlcyBvZiB0aGUgdGV4dCwgZGF0YSwgYW5kIEJTUworCXNlY3Rpb25zLCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSwgYW5kIHRoZQorCWVudHJ5IHBvaW50IGFkZHJlc3MsIGluIGEgaG9zdC1kZXBlbmRlbnQgbWFubmVyLiAgT25jZSB0aGVzZQorCXZhbHVlcyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCwgZ2VuZXJpYyBjb2RlIGlzIHVzZWQgdG8gaGFuZGxlCisJdGhlICBvYmplY3QgZmlsZS4KKworCVdoZW4gcG9ydGluZyBpdCB0byBydW4gb24gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6CisKK3wgICAgICAgIEhPU1RfUEFHRV9TSVpFCit8ICAgICAgICBIT1NUX1NFR01FTlRfU0laRQorfCAgICAgICAgSE9TVF9NQUNISU5FX0FSQ0ggICAgICAgKG9wdGlvbmFsKQorfCAgICAgICAgSE9TVF9NQUNISU5FX01BQ0hJTkUgICAgKG9wdGlvbmFsKQorfCAgICAgICAgSE9TVF9URVhUX1NUQVJUX0FERFIKK3wgICAgICAgIEhPU1RfU1RBQ0tfRU5EX0FERFIKKworCWluIHRoZSBmaWxlIEBmaWxley4uL2luY2x1ZGUvc3lzL2gtQHZhcntYWFh9Lmh9IChmb3IgeW91ciBob3N0KS4gIFRoZXNlCisJdmFsdWVzLCBwbHVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgZGVmaW5lZCBpbiBAZmlsZXthLm91dC5ofSBvbgorCXlvdXIgaG9zdCBzeXN0ZW0sIHdpbGwgcHJvZHVjZSBhIEJGRCB0YXJnZXQgdGhhdCB3aWxsIGFjY2VzcworCW9yZGluYXJ5IGEub3V0IGZpbGVzIG9uIHlvdXIgaG9zdC4gVG8gY29uZmlndXJlIGEgbmV3IG1hY2hpbmUKKwl0byB1c2UgQGZpbGV7aG9zdC1hb3V0LmN9LCBzcGVjaWZ5OgorCit8CVRERUZBVUxUUyA9IC1EREVGQVVMVF9WRUNUT1I9aG9zdF9hb3V0X2JpZ192ZWMKK3wJVERFUEZJTEVTPSBob3N0LWFvdXQubyB0cmFkLWNvcmUubworCisJaW4gdGhlIEBmaWxle2NvbmZpZy9AdmFye1hYWH0ubXR9IGZpbGUsIGFuZCBtb2RpZnkgQGZpbGV7Y29uZmlndXJlLmlufQorCXRvIHVzZSB0aGUKKwlAZmlsZXtAdmFye1hYWH0ubXR9IGZpbGUgKGJ5IHNldHRpbmcgIjw8YmZkX3RhcmdldD1YWFg+PiIpIHdoZW4geW91cgorCWNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuCisKKyovCisKKy8qIFNvbWUgYXNzdW1wdGlvbnM6CisgICAqIEFueSBCRkQgd2l0aCBEX1BBR0VEIHNldCBpcyBaTUFHSUMsIGFuZCB2aWNlIHZlcnNhLgorICAgICBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBzZXR0aW5nIG9mIFdQX1RFWFQgaXMgb24gb3V0cHV0LCBidXQgaXQnbGwKKyAgICAgZ2V0IHNldCBvbiBpbnB1dC4KKyAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgY2xlYXIgYW5kIFdQX1RFWFQgc2V0IGlzIE5NQUdJQy4KKyAgICogQW55IEJGRCB3aXRoIGJvdGggZmxhZ3MgY2xlYXIgaXMgT01BR0lDLgorICAgKEp1c3Qgd2FudCB0byBtYWtlIHRoZXNlIGV4cGxpY2l0LCBzbyB0aGUgY29uZGl0aW9ucyB0ZXN0ZWQgaW4gdGhpcworICAgZmlsZSBtYWtlIHNlbnNlIGlmIHlvdSdyZSBtb3JlIGZhbWlsaWFyIHdpdGggYS5vdXQgdGhhbiB3aXRoIEJGRC4pICAqLworCisjZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxpYmFvdXQuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisKK3N0YXRpYyBib29sZWFuIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MKKyAgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICopKTsKK3N0YXRpYyB2b2lkIGFkanVzdF9vX21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7CitzdGF0aWMgdm9pZCBhZGp1c3Rfel9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOworc3RhdGljIHZvaWQgYWRqdXN0X25fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKKworLyoKK1NVQlNFQ1RJT04KKwlSZWxvY2F0aW9ucworCitERVNDUklQVElPTgorCVRoZSBmaWxlIEBmaWxle2FvdXR4Lmh9IHByb3ZpZGVzIGZvciBib3RoIHRoZSBAZW1waHtzdGFuZGFyZH0KKwlhbmQgQGVtcGh7ZXh0ZW5kZWR9IGZvcm1zIG9mIGEub3V0IHJlbG9jYXRpb24gcmVjb3Jkcy4KKworCVRoZSBzdGFuZGFyZCByZWNvcmRzIGNvbnRhaW4gb25seSBhbgorCWFkZHJlc3MsIGEgc3ltYm9sIGluZGV4LCBhbmQgYSB0eXBlIGZpZWxkLiBUaGUgZXh0ZW5kZWQgcmVjb3JkcworCSh1c2VkIG9uIDI5a3MgYW5kIHNwYXJjcykgYWxzbyBoYXZlIGEgZnVsbCBpbnRlZ2VyIGZvciBhbgorCWFkZGVuZC4KKworKi8KKyNpZm5kZWYgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTworI2RlZmluZSBDVE9SX1RBQkxFX1JFTE9DX0lEWCAyCisjZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSE9XVE8oQkZEKSAoKG9ial9yZWxvY19lbnRyeV9zaXplKEJGRCkgPT0gUkVMT0NfRVhUX1NJWkUgXAorCSAgICAgPyBob3d0b190YWJsZV9leHQgOiBob3d0b190YWJsZV9zdGQpIFwKKwkgICAgKyBDVE9SX1RBQkxFX1JFTE9DX0lEWCkKKyNlbmRpZgorCisjaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX2luCisjZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX2luIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikKKyNlbmRpZgorCisjaWZuZGVmIE1ZX3N3YXBfc3RkX3JlbG9jX291dAorI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19vdXQgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkKKyNlbmRpZgorCisjaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUKKyNkZWZpbmUgTVlfZmluYWxfbGlua19yZWxvY2F0ZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKKyNlbmRpZgorCisjaWZuZGVmIE1ZX3JlbG9jYXRlX2NvbnRlbnRzCisjZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfcmVsb2NhdGVfY29udGVudHMKKyNlbmRpZgorCisjZGVmaW5lIGhvd3RvX3RhYmxlX2V4dCBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKQorI2RlZmluZSBob3d0b190YWJsZV9zdGQgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSkKKworcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9leHRbXSA9Cit7CisgIC8qIHR5cGUgICAgICAgICAgIHJzICAgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgc2V0bWFzayBwY2RvbmUgKi8KKyAgSE9XVE8oUkVMT0NfOCwgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLCAgICAgICAgZmFsc2UsIDAsMHgwMDAwMDBmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ18xNiwgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsICAgICAgIGZhbHNlLCAwLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUkVMT0NfMzIsICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPKFJFTE9DX0RJU1A4LCAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQOCIsIAlmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPKFJFTE9DX0RJU1AxNiwgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMTYiLCAJZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19ESVNQMzIsIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiRElTUDMyIiwgCWZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUkVMT0NfV0RJU1AzMCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIldESVNQMzAiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19XRElTUDIyLDIsICAyLCAJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AyMiIsIAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCisgIEhPV1RPKFJFTE9DX0hJMjIsICAgMTAsIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkhJMjIiLAlmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCisgIEhPV1RPKFJFTE9DXzIyLCAgICAgMCwgIDIsIAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjIyIiwgICAgICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ18xMywgICAgIDAsICAyLCAJMTMsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxMyIsICAgICAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUkVMT0NfTE8xMCwgICAwLCAgMiwgCTEwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJMTzEwIiwgICAgIGZhbHNlLCAwLDB4MDAwMDAzZmYsIGZhbHNlKSwKKyAgSE9XVE8oUkVMT0NfU0ZBX0JBU0UsMCwgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX0JBU0UiLCBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPKFJFTE9DX1NGQV9PRkYxMywwLDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNGQV9PRkYxMyIsZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19CQVNFMTAsIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkJBU0UxMCIsICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19CQVNFMTMsIDAsICAyLAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJCQVNFMTMiLCAgIGZhbHNlLCAwLDB4MDAwMDFmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUkVMT0NfQkFTRTIyLCAxMCwgMiwJMjIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMjIiLCAgIGZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUkVMT0NfUEMxMCwgICAwLCAgMiwJMTAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlBDMTAiLAlmYWxzZSwgMCwweDAwMDAwM2ZmLCB0cnVlKSwKKyAgSE9XVE8oUkVMT0NfUEMyMiwgICAxMCwgIDIsCTIyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIlBDMjIiLCBmYWxzZSwgMCwweDAwM2ZmZmZmLCB0cnVlKSwKKyAgSE9XVE8oUkVMT0NfSk1QX1RCTCwyLCAgMiwgCTMwLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkpNUF9UQkwiLCAJZmFsc2UsIDAsMHgzZmZmZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19TRUdPRkYxNiwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlNFR09GRjE2IiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19HTE9CX0RBVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdMT0JfREFUIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19KTVBfU0xPVCwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkpNUF9TTE9UIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAorICBIT1dUTyhSRUxPQ19SRUxBVElWRSwwLCAyLAkwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwJZmFsc2UsIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAorICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTygwLCAgMCwgMCwgICAgMCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorI2RlZmluZSBSRUxPQ19TUEFSQ19SRVYzMiBSRUxPQ19XRElTUDE5CisgIEhPV1RPKFJFTE9DX1NQQVJDX1JFVjMyLCAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwwLCJSX1NQQVJDX1JFVjMyIiwgICAgICAgZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAorfTsKKworLyogQ29udmVydCBzdGFuZGFyZCByZWxvYyByZWNvcmRzIHRvICJhcmVsZW50IiBmb3JtYXQgKGluY2wgYnl0ZSBzd2FwKS4gICovCisKK3JlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVfc3RkW10gPSB7CisgIC8qIHR5cGUgICAgICAgICAgICAgIHJzIHNpemUgYnN6ICBwY3JlbCBiaXRwb3Mgb3ZyZiAgICAgICAgICAgICAgICAgICAgIHNmIG5hbWUgICAgIHBhcnRfaW5wbCByZWFkbWFzayAgc2V0bWFzayAgICBwY2RvbmUgKi8KK0hPV1RPKCAwLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwJCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAorSE9XVE8oIDEsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKK0hPV1RPKCAyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCitIT1dUTyggMywJICAgICAgIDAsICA0LCAJNjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI2NCIsCXRydWUsIDB4ZGVhZGRlYWQsMHhkZWFkZGVhZCwgZmFsc2UpLAorSE9XVE8oIDQsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKK0hPV1RPKCA1LAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAorSE9XVE8oIDYsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDMyIiwJdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCitIT1dUTyggNywJICAgICAgIDAsICA0LCAJNjQsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQNjQiLAl0cnVlLCAweGZlZWRmYWNlLDB4ZmVlZGZhY2UsIGZhbHNlKSwKK0hPV1RPKCA4LAkgICAgICAgMCwgIDIsICAgIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJHT1RfUkVMIiwJZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCitIT1dUTyggOSwJICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTE2IiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCitIT1dUTygxMCwJICAgICAgIDAsICAyLCAgIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiQkFTRTMyIiwJZmFsc2UsMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCisgIEhPV1RPKDE2LAkgICAgICAgMCwgIDIsCSAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSk1QX1RBQkxFIiwgZmFsc2UsICAgICAgICAgMCwweDAwMDAwMDAwLCBmYWxzZSksCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sCit7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwKKyAgSE9XVE8oMzIsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSRUxBVElWRSIsICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKK3sgLTEgfSwKK3sgLTEgfSwKK3sgLTEgfSwKK3sgLTEgfSwKK3sgLTEgfSwKK3sgLTEgfSwKK3sgLTEgfSwKKyAgSE9XVE8oNDAsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFUkVMIiwgICBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKK307CisKKyNkZWZpbmUgVEFCTEVfU0laRShUQUJMRSkJKHNpemVvZihUQUJMRSkvc2l6ZW9mKFRBQkxFWzBdKSkKKworcmVsb2NfaG93dG9fdHlwZSAqCitOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIChhYmZkLGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisjZGVmaW5lIEVYVChpLGopCWNhc2UgaTogcmV0dXJuICZob3d0b190YWJsZV9leHRbal0KKyNkZWZpbmUgU1REKGksaikJY2FzZSBpOiByZXR1cm4gJmhvd3RvX3RhYmxlX3N0ZFtqXQorICBpbnQgZXh0ID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFOworICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKKyAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKKyAgICAgIHsKKyAgICAgIGNhc2UgMzI6CisJY29kZSA9IEJGRF9SRUxPQ18zMjsKKwlicmVhazsKKyAgICAgIGNhc2UgNjQ6CisJY29kZSA9IEJGRF9SRUxPQ182NDsKKwlicmVhazsKKyAgICAgIH0KKyAgaWYgKGV4dCkKKyAgICBzd2l0Y2ggKGNvZGUpCisgICAgICB7CisJRVhUIChCRkRfUkVMT0NfMzIsIDIpOworCUVYVCAoQkZEX1JFTE9DX0hJMjIsIDgpOworCUVYVCAoQkZEX1JFTE9DX0xPMTAsIDExKTsKKwlFWFQgKEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgNik7CisJRVhUIChCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgNyk7CisJRVhUIChCRkRfUkVMT0NfU1BBUkMxMywgMTApOworCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCAxNCk7CisJRVhUIChCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLCAxNSk7CisJRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMTMsIDE1KTsKKwlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgMTYpOworCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1BDMTAsIDE3KTsKKwlFWFQgKEJGRF9SRUxPQ19TUEFSQ19QQzIyLCAxOCk7CisJRVhUIChCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCAxOSk7CisJRVhUIChCRkRfUkVMT0NfU1BBUkNfUkVWMzIsIDI2KTsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOworICAgICAgfQorICBlbHNlCisgICAgLyogc3RkIHJlbG9jcyAqLworICAgIHN3aXRjaCAoY29kZSkKKyAgICAgIHsKKwlTVEQgKEJGRF9SRUxPQ18xNiwgMSk7CisJU1REIChCRkRfUkVMT0NfMzIsIDIpOworCVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOworCVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKKwlTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7CisJU1REIChCRkRfUkVMT0NfMTZfQkFTRVJFTCwgOSk7CisJU1REIChCRkRfUkVMT0NfMzJfQkFTRVJFTCwgMTApOworICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7CisgICAgICB9Cit9CisKKy8qCitTVUJTRUNUSU9OCisJSW50ZXJuYWwgZW50cnkgcG9pbnRzCisKK0RFU0NSSVBUSU9OCisJQGZpbGV7YW91dHguaH0gZXhwb3J0cyBzZXZlcmFsIHJvdXRpbmVzIGZvciBhY2Nlc3NpbmcgdGhlCisJY29udGVudHMgb2YgYW4gYS5vdXQgZmlsZSwgd2hpY2ggYXJlIGdhdGhlcmVkIGFuZCBleHBvcnRlZCBpbgorCXR1cm4gYnkgdmFyaW91cyBmb3JtYXQgc3BlY2lmaWMgZmlsZXMgKGVnIHN1bm9zLmMpLgorCisqLworCisvKgorRlVOQ1RJT04KKwkgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfaW4KKworU1lOT1BTSVMKKwl2b2lkIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX2luLAorICAgICAgICAgICAoYmZkICphYmZkLAorICAgICAgICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKKyAgICAgICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCk7CisKK0RFU0NSSVBUSU9OCisJU3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgQHZhcntyYXdfYnl0ZXN9IHRha2VuCisJZnJvbSBhIHJhdyBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UgaW50byB0aGUgaW50ZXJuYWwgZXhlYyBoZWFkZXIKKwlzdHJ1Y3R1cmUgQHZhcntleGVjcH0uCisqLworCisjaWZuZGVmIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbgordm9pZAorTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOworCisgIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKKyAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCisgICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKKyAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLworICBtZW1zZXQgKChQVFIpIGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7CisgIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCisgIGV4ZWNwLT5hX2luZm8gICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfaW5mbyk7CisgIGV4ZWNwLT5hX3RleHQgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90ZXh0KTsKKyAgZXhlY3AtPmFfZGF0YSAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOworICBleGVjcC0+YV9ic3MgICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKKyAgZXhlY3AtPmFfc3ltcyAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpOworICBleGVjcC0+YV9lbnRyeSAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOworICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKKyAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Cit9CisjZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikKKyNlbmRpZgorCisvKgorRlVOQ1RJT04KKwlhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9vdXQKKworU1lOT1BTSVMKKwl2b2lkIGFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX291dAorCSAgKGJmZCAqYWJmZCwKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCisJICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcyk7CisKK0RFU0NSSVBUSU9OCisJU3dhcCB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlCisJQHZhcntleGVjcH0gaW50byB0aGUgYnVmZmVyIEB2YXJ7cmF3X2J5dGVzfSByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLgorKi8KK3ZvaWQKK05BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOworICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7CisKKyAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOworICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOworICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7Cit9CisKKy8qIE1ha2UgYWxsIHRoZSBzZWN0aW9uIGZvciBhbiBhLm91dCBmaWxlLiAgKi8KKworYm9vbGVhbgorTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKKyAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIudGV4dCIpID09IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAorICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIikgPT0gKGFzZWN0aW9uICopIE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAob2JqX2Jzc3NlYyAoYWJmZCkgPT0gKGFzZWN0aW9uICopIE5VTEwKKyAgICAgICYmIGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuYnNzIikgPT0gKGFzZWN0aW9uICopIE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKK0ZVTkNUSU9OCisJYW91dF9AdmFye3NpemV9X3NvbWVfYW91dF9vYmplY3RfcAorCitTWU5PUFNJUworCWNvbnN0IGJmZF90YXJnZXQgKmFvdXRfQHZhcntzaXplfV9zb21lX2FvdXRfb2JqZWN0X3AKKwkgKGJmZCAqYWJmZCwKKwkgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkoKSk7CisKK0RFU0NSSVBUSU9OCisJU29tZSBhLm91dCB2YXJpYW50IHRoaW5rcyB0aGF0IHRoZSBmaWxlIG9wZW4gaW4gQHZhcnthYmZkfQorCWNoZWNraW5nIGlzIGFuIGEub3V0IGZpbGUuICBEbyBzb21lIG1vcmUgY2hlY2tpbmcsIGFuZCBzZXQgdXAKKwlmb3IgYWNjZXNzIGlmIGl0IHJlYWxseSBpcy4gIENhbGwgYmFjayB0byB0aGUgY2FsbGluZworCWVudmlyb25tZW50J3MgImZpbmlzaCB1cCIgZnVuY3Rpb24ganVzdCBiZWZvcmUgcmV0dXJuaW5nLCB0bworCWhhbmRsZSBhbnkgbGFzdC1taW51dGUgc2V0dXAuCisqLworCitjb25zdCBiZmRfdGFyZ2V0ICoKK05BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIChhYmZkLCBleGVjcCwgY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7CisgICAgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKK3sKKyAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0ciwgKm9sZHJhd3B0cjsKKyAgY29uc3QgYmZkX3RhcmdldCAqcmVzdWx0OworCisgIHJhd3B0ciA9IChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKTsKKyAgaWYgKHJhd3B0ciA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIG9sZHJhd3B0ciA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YTsKKyAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOworCisgIC8qIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGQgdGRhdGEgc3RydWN0LgorICAgICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRoZSBzdWJmb3JtYXQsIHNpbmNlIGZvciBocHV4IGl0IHdhcyBzZXQgaW4KKyAgICAgaHAzMDBocHV4LmM6c3dhcF9leGVjX2hlYWRlcl9pbiBhbmQgd2lsbCBiZSB1c2VkIGluCisgICAgIGhwMzAwaHB1eC5jOmNhbGxiYWNrLiAgKi8KKyAgaWYgKG9sZHJhd3B0ciAhPSBOVUxMKQorICAgICphYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSAqb2xkcmF3cHRyOworCisgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIgPSAmcmF3cHRyLT5lOworICAqKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHIpID0gKmV4ZWNwOwkvKiBDb3B5IGluIHRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdCAqLworICBleGVjcCA9IGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YS5oZHI7CisKKyAgLyogU2V0IHRoZSBmaWxlIGZsYWdzICovCisgIGFiZmQtPmZsYWdzID0gQkZEX05PX0ZMQUdTOworICBpZiAoZXhlY3AtPmFfZHJzaXplIHx8IGV4ZWNwLT5hX3Ryc2l6ZSkKKyAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7CisgIC8qIFNldHRpbmcgb2YgRVhFQ19QIGhhcyBiZWVuIGRlZmVycmVkIHRvIHRoZSBib3R0b20gb2YgdGhpcyBmdW5jdGlvbiAqLworICBpZiAoZXhlY3AtPmFfc3ltcykKKyAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOworICBpZiAoTl9EWU5BTUlDKCpleGVjcCkpCisgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKKworICBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBaTUFHSUMpCisgICAgeworICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7CisgICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOworICAgIH0KKyAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBRTUFHSUMpCisgICAgeworICAgICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRCB8IFdQX1RFWFQ7CisgICAgICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOworICAgICAgYWRhdGEgKGFiZmQpLnN1YmZvcm1hdCA9IHFfbWFnaWNfZm9ybWF0OworICAgIH0KKyAgZWxzZSBpZiAoTl9NQUdJQyAoKmV4ZWNwKSA9PSBOTUFHSUMpCisgICAgeworICAgICAgYWJmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKKyAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG5fbWFnaWM7CisgICAgfQorICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE9NQUdJQworCSAgIHx8IE5fTUFHSUMgKCpleGVjcCkgPT0gQk1BR0lDKQorICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG9fbWFnaWM7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGNoZWNrZWQgd2l0aCBOX0JBRE1BRyBiZWZvcmUgdGhpcyByb3V0aW5lCisJIHdhcyBjYWxsZWQuICAqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBleGVjcC0+YV9lbnRyeTsKKworICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IChhb3V0X3N5bWJvbF90eXBlICopTlVMTDsKKyAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOworCisgIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFY3IFVuaXguICAqLworICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKKworICAvKiBUaGUgZGVmYXVsdCBzeW1ib2wgZW50cnkgc2l6ZSBpcyB0aGF0IG9mIHRyYWRpdGlvbmFsIFVuaXguICovCisgIG9ial9zeW1ib2xfZW50cnlfc2l6ZSAoYWJmZCkgPSBFWFRFUk5BTF9OTElTVF9TSVpFOworCisjaWZkZWYgVVNFX01NQVAKKyAgYmZkX2luaXRfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOworICBiZmRfaW5pdF93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7CisjZW5kaWYKKyAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOworICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IE5VTEw7CisgIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpID0gTlVMTDsKKworICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQorICAgIHJldHVybiBOVUxMOworCisgIG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfZGF0YTsKKyAgb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX2JzczsKKworICBvYmpfdGV4dHNlYyAoYWJmZCktPmZsYWdzID0KKyAgICAoZXhlY3AtPmFfdHJzaXplICE9IDAKKyAgICAgPyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVMT0MpCisgICAgIDogKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTKSk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPQorICAgIChleGVjcC0+YV9kcnNpemUgIT0gMAorICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKKyAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKKyAgb2JqX2Jzc3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DOworCisjaWZkZWYgVEhJU19JU19PTkxZX0RPQ1VNRU5UQVRJT04KKyAgLyogVGhlIGNvbW1vbiBjb2RlIGNhbid0IGZpbGwgaW4gdGhlc2UgdGhpbmdzIGJlY2F1c2UgdGhleSBkZXBlbmQKKyAgICAgb24gZWl0aGVyIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlZ21lbnQsIHRoZSByb3VuZGluZworICAgICB1cCBvZiB2aXJ0dWFsIGFkZHJlc3NlcyBiZXR3ZWVuIHNlZ21lbnRzLCBvciB0aGUgc3RhcnRpbmcgZmlsZQorICAgICBwb3NpdGlvbiBvZiB0aGUgdGV4dCBzZWdtZW50IC0tIGFsbCBvZiB3aGljaCB2YXJpZXMgYW1vbmcgZGlmZmVyZW50CisgICAgIHZlcnNpb25zIG9mIGEub3V0LiAgKi8KKworICAvKiBDYWxsIGJhY2sgdG8gdGhlIGZvcm1hdC1kZXBlbmRlbnQgY29kZSB0byBmaWxsIGluIHRoZSByZXN0IG9mIHRoZQorICAgICBmaWVsZHMgYW5kIGRvIGFueSBmdXJ0aGVyIGNsZWFudXAuICBUaGluZ3MgdGhhdCBzaG91bGQgYmUgZmlsbGVkCisgICAgIGluIGJ5IHRoZSBjYWxsYmFjazogICovCisKKyAgc3RydWN0IGV4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisgIG9ial90ZXh0c2VjIChhYmZkKS0+c2l6ZSA9IE5fVFhUU0laRSgqZXhlY3ApOworICBvYmpfdGV4dHNlYyAoYWJmZCktPnJhd19zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7CisgIC8qIGRhdGEgYW5kIGJzcyBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gc2luY2UgdGhleSdyZSBzbyBzdGFuZGFyZCAqLworCisgIC8qIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gTl9UWFRBRERSKCpleGVjcCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSKCpleGVjcCk7CisgIG9ial9ic3NzZWMgIChhYmZkKS0+dm1hID0gTl9CU1NBRERSKCpleGVjcCk7CisKKyAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc2VjdGlvbnMgKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYoKmV4ZWNwKTsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYoKmV4ZWNwKTsKKworICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRigqZXhlY3ApOworICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGKCpleGVjcCk7CisKKyAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLworICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7CisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKKworICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCisgIHN3aXRjaCAoTl9NQUNIVFlQRSAoKmV4ZWNfaGRyIChhYmZkKSkpIHsKKyAgZGVmYXVsdDoKKyAgICBhYmZkLT5vYmpfYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7CisgICAgYnJlYWs7CisgIH0KKworICBhZGF0YShhYmZkKS0+cGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKKyAgYWRhdGEoYWJmZCktPnNlZ21lbnRfc2l6ZSA9IFNFR01FTlRfU0laRTsKKyAgYWRhdGEoYWJmZCktPmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKKworICAvKiBUaGUgYXJjaGl0ZWN0dXJlIGlzIGVuY29kZWQgaW4gdmFyaW91cyB3YXlzIGluIHZhcmlvdXMgYS5vdXQgdmFyaWFudHMsCisgICAgIG9yIGlzIG5vdCBlbmNvZGVkIGF0IGFsbCBpbiBzb21lIG9mIHRoZW0uICBUaGUgcmVsb2NhdGlvbiBzaXplIGRlcGVuZHMKKyAgICAgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIGEub3V0IHZhcmlhbnQuICBGaW5hbGx5LCB0aGUgcmV0dXJuIHZhbHVlCisgICAgIGlzIHRoZSBiZmRfdGFyZ2V0IHZlY3RvciBpbiB1c2UuICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiB6ZXJvIGFuZAorICAgICBzZXQgYmZkX2Vycm9yIHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorCisgICAgIEZvcm1hdHMgc3VjaCBhcyBiLm91dCwgd2hpY2ggaGF2ZSBhZGRpdGlvbmFsIGZpZWxkcyBpbiB0aGUgYS5vdXQKKyAgICAgaGVhZGVyLCBzaG91bGQgY29wZSB3aXRoIHRoZW0gaW4gdGhpcyBjYWxsYmFjayBhcyB3ZWxsLiAgKi8KKyNlbmRpZgkJCQkvKiBET0NVTUVOVEFUSU9OICovCisKKyAgcmVzdWx0ID0gKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKShhYmZkKTsKKworICAvKiBOb3cgdGhhdCB0aGUgc2VnbWVudCBhZGRyZXNzZXMgaGF2ZSBiZWVuIHdvcmtlZCBvdXQsIHRha2UgYSBiZXR0ZXIKKyAgICAgZ3Vlc3MgYXQgd2hldGhlciB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLiAgSWYgdGhlIGVudHJ5IHBvaW50CisgICAgIGlzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhc3N1bWUgaXQgaXMuICAoVGhpcyBtYWtlcyBmaWxlcworICAgICBleGVjdXRhYmxlIGV2ZW4gaWYgdGhlaXIgZW50cnkgcG9pbnQgYWRkcmVzcyBpcyAwLCBhcyBsb25nIGFzCisgICAgIHRoZWlyIHRleHQgc3RhcnRzIGF0IHplcm8uKS4KKworICAgICBUaGlzIHRlc3QgaGFkIHRvIGJlIGNoYW5nZWQgdG8gZGVhbCB3aXRoIHN5c3RlbXMgd2hlcmUgdGhlIHRleHQgc2VnbWVudAorICAgICBydW5zIGF0IGEgZGlmZmVyZW50IGxvY2F0aW9uIHRoYW4gdGhlIGRlZmF1bHQuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZQorICAgICBlbnRyeSBhZGRyZXNzIGNhbiBhcHBlYXIgdG8gYmUgb3V0c2lkZSB0aGUgdGV4dCBzZWdtZW50LCB0aHVzIGNhdXNpbmcgYW4KKyAgICAgZXJyb25lb3VzIGNvbmNsdXNpb24gdGhhdCB0aGUgZmlsZSBpc24ndCBleGVjdXRhYmxlLgorCisgICAgIFRvIGZpeCB0aGlzLCB3ZSBub3cgYWNjZXB0IGFueSBub24temVybyBlbnRyeSBwb2ludCBhcyBhbiBpbmRpY2F0aW9uIG9mCisgICAgIGV4ZWN1dGFiaWxpdHkuICBUaGlzIHdpbGwgd29yayBtb3N0IG9mIHRoZSB0aW1lLCBzaW5jZSBvbmx5IHRoZSBsaW5rZXIKKyAgICAgc2V0cyB0aGUgZW50cnkgcG9pbnQsIGFuZCB0aGF0IGlzIGxpa2VseSB0byBiZSBub24temVybyBmb3IgbW9zdCBzeXN0ZW1zLiAqLworCisgIGlmIChleGVjcC0+YV9lbnRyeSAhPSAwCisgICAgICB8fCAoZXhlY3AtPmFfZW50cnkgPj0gb2JqX3RleHRzZWMoYWJmZCktPnZtYQorCSAgJiYgZXhlY3AtPmFfZW50cnkgPCBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hICsgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSkpCisgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOworI2lmZGVmIFNUQVRfRk9SX0VYRUMKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOworCisgICAgICAvKiBUaGUgb3JpZ2luYWwgaGV1cmlzdGljIGRvZXNuJ3Qgd29yayBpbiBzb21lIGltcG9ydGFudCBjYXNlcy4KKyAgICAgICAgVGhlIGEub3V0IGZpbGUgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHN0YXJ0CisgICAgICAgIGFkZHJlc3MuICBGb3IgZmlsZXMgKGxpa2Uga2VybmVscykgbGlua2VkIHRvIG5vbi1zdGFuZGFyZAorICAgICAgICBhZGRyZXNzZXMgKGxkIC1UdGV4dCBubm4pIHRoZSBlbnRyeSBwb2ludCBtYXkgbm90IGJlIGJldHdlZW4KKyAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBzdGFydCAob2JqX3RleHRzZWMoYWJmZCktPnZtYSkgYW5kCisgICAgICAgIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSArIHRleHQgc2l6ZS4gIFRoaXMgaXMgbm90IGp1c3QgYSBtYWNoCisgICAgICAgIGlzc3VlLiAgTWFueSBrZXJuZWxzIGFyZSBsb2FkZWQgYXQgbm9uIHN0YW5kYXJkIGFkZHJlc3Nlcy4gICovCisgICAgICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTAorCSAgJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMAorCSAgJiYgKGZzdGF0KGZpbGVubygoRklMRSAqKSAoYWJmZC0+aW9zdHJlYW0pKSwgJnN0YXRfYnVmKSA9PSAwKQorCSAgJiYgKChzdGF0X2J1Zi5zdF9tb2RlICYgMDExMSkgIT0gMCkpCisJYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOworICAgIH0KKyNlbmRpZiAvKiBTVEFUX0ZPUl9FWEVDICovCisKKyAgaWYgKHJlc3VsdCkKKyAgICB7CisjaWYgMCAvKiBUaGVzZSBzaG91bGQgYmUgc2V0IGNvcnJlY3RseSBhbnl3YXlzLiAgKi8KKyAgICAgIGFiZmQtPnNlY3Rpb25zID0gb2JqX3RleHRzZWMgKGFiZmQpOworICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5uZXh0ID0gb2JqX2RhdGFzZWMgKGFiZmQpOworICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gb2JqX2Jzc3NlYyAoYWJmZCk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcmVlIChyYXdwdHIpOworICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gb2xkcmF3cHRyOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKK0ZVTkNUSU9OCisJYW91dF9AdmFye3NpemV9X21rb2JqZWN0CisKK1NZTk9QU0lTCisJYm9vbGVhbiBhb3V0X0B2YXJ7c2l6ZX1fbWtvYmplY3QsIChiZmQgKmFiZmQpOworCitERVNDUklQVElPTgorCUluaXRpYWxpemUgQkZEIEB2YXJ7YWJmZH0gZm9yIHVzZSB3aXRoIGEub3V0IGZpbGVzLgorKi8KKworYm9vbGVhbgorTkFNRShhb3V0LG1rb2JqZWN0KSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAgKnJhd3B0cjsKKworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworCisgIC8qIFVzZSBhbiBpbnRlcm1lZGlhdGUgdmFyaWFibGUgZm9yIGNsYXJpdHkgKi8KKyAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCApKTsKKworICBpZiAocmF3cHRyID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9IHJhd3B0cjsKKyAgZXhlY19oZHIgKGFiZmQpID0gJihyYXdwdHItPmUpOworCisgIG9ial90ZXh0c2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7CisgIG9ial9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7CisgIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKgorRlVOQ1RJT04KKwlhb3V0X0B2YXJ7c2l6ZX1fbWFjaGluZV90eXBlCisKK1NZTk9QU0lTCisJZW51bSBtYWNoaW5lX3R5cGUgIGFvdXRfQHZhcntzaXplfV9tYWNoaW5lX3R5cGUKKwkgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAorCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7CisKK0RFU0NSSVBUSU9OCisJS2VlcCB0cmFjayBvZiBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGZvcgorCWEub3V0J3MuIFJldHVybiB0aGUgPDxtYWNoaW5lX3R5cGU+PiBmb3IgYSBwYXJ0aWN1bGFyCisJYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLCBvciA8PE1fVU5LTk9XTj4+IGlmIHRoYXQgZXhhY3QgYXJjaGl0ZWN0dXJlCisJYW5kIG1hY2hpbmUgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gYS5vdXQgZm9ybWF0LgorCisJSWYgdGhlIGFyY2hpdGVjdHVyZSBpcyB1bmRlcnN0b29kLCBtYWNoaW5lIHR5cGUgMCAoZGVmYXVsdCkKKwlpcyBhbHdheXMgdW5kZXJzdG9vZC4KKyovCisKK2VudW0gbWFjaGluZV90eXBlCitOQU1FKGFvdXQsbWFjaGluZV90eXBlKSAoYXJjaCwgbWFjaGluZSwgdW5rbm93bikKKyAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKKyAgICAgYm9vbGVhbiAqdW5rbm93bjsKK3sKKyAgZW51bSBtYWNoaW5lX3R5cGUgYXJjaF9mbGFnczsKKworICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOworICAqdW5rbm93biA9IHRydWU7CisKKyAgc3dpdGNoIChhcmNoKSB7CisgIGNhc2UgYmZkX2FyY2hfc3BhcmM6CisgICAgaWYgKG1hY2hpbmUgPT0gMAorCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmMKKwl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQorCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCisJfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY192OSkKKyAgICAgIGFyY2hfZmxhZ3MgPSBNX1NQQVJDOworICAgIGVsc2UgaWYgKG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpCisgICAgICBhcmNoX2ZsYWdzID0gTV9TUEFSQ0xFVDsKKyAgICBicmVhazsKKworICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgc3dpdGNoIChtYWNoaW5lKSB7CisgICAgY2FzZSAwOgkJICBhcmNoX2ZsYWdzID0gTV82ODAxMDsgYnJlYWs7CisgICAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6IGFyY2hfZmxhZ3MgPSBNX1VOS05PV047ICp1bmtub3duID0gZmFsc2U7IGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOiBhcmNoX2ZsYWdzID0gTV82ODAxMDsgYnJlYWs7CisgICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6IGFyY2hfZmxhZ3MgPSBNXzY4MDIwOyBicmVhazsKKyAgICBkZWZhdWx0OgkJICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBiZmRfYXJjaF9pMzg2OgorICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNXzM4NjsKKyAgICBicmVhazsKKworICBjYXNlIGJmZF9hcmNoX2EyOWs6CisgICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fMjlLOworICAgIGJyZWFrOworCisgIGNhc2UgYmZkX2FyY2hfYXJtOgorICAgIGlmIChtYWNoaW5lID09IDApCWFyY2hfZmxhZ3MgPSBNX0FSTTsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSBiZmRfYXJjaF9taXBzOgorICAgIHN3aXRjaCAobWFjaGluZSkgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIGJmZF9tYWNoX21pcHMzMDAwOgorICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6CisgICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6CisgICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6CisgICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKKyAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgorICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6CisgICAgY2FzZSBiZmRfbWFjaF9taXBzNDQwMDoKKyAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjAwOgorICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6CisgICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKKyAgICBjYXNlIGJmZF9tYWNoX21pcHMxMDAwMDoKKyAgICBjYXNlIGJmZF9tYWNoX21pcHMxNjoKKyAgICAgIC8qIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgTUlQUzMgb3IgTUlQUzQuICAqLworICAgICAgYXJjaF9mbGFncyA9IE1fTUlQUzI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIGJmZF9hcmNoX25zMzJrOgorICAgIHN3aXRjaCAobWFjaGluZSkgeworICAgIGNhc2UgMDogICAgCQlhcmNoX2ZsYWdzID0gTV9OUzMyNTMyOyBicmVhazsKKyAgICBjYXNlIDMyMDMyOgkJYXJjaF9mbGFncyA9IE1fTlMzMjAzMjsgYnJlYWs7CisgICAgY2FzZSAzMjUzMjoJCWFyY2hfZmxhZ3MgPSBNX05TMzI1MzI7IGJyZWFrOworICAgIGRlZmF1bHQ6CQlhcmNoX2ZsYWdzID0gTV9VTktOT1dOOyBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBiZmRfYXJjaF92YXg6CisgICAgKnVua25vd24gPSBmYWxzZTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047CisgIH0KKworICBpZiAoYXJjaF9mbGFncyAhPSBNX1VOS05PV04pCisgICAgKnVua25vd24gPSBmYWxzZTsKKworICByZXR1cm4gYXJjaF9mbGFnczsKK30KKworCisvKgorRlVOQ1RJT04KKwlhb3V0X0B2YXJ7c2l6ZX1fc2V0X2FyY2hfbWFjaAorCitTWU5PUFNJUworCWJvb2xlYW4gYW91dF9AdmFye3NpemV9X3NldF9hcmNoX21hY2gsCisJIChiZmQgKiwKKwkgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAorCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7CisKK0RFU0NSSVBUSU9OCisJU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBtYWNoaW5lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSB0byB0aGUKKwl2YWx1ZXMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gIFZlcmlmeSB0aGF0IEB2YXJ7YWJmZH0ncyBmb3JtYXQKKwljYW4gc3VwcG9ydCB0aGUgYXJjaGl0ZWN0dXJlIHJlcXVpcmVkLgorKi8KKworYm9vbGVhbgorTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQorICAgIHsKKyAgICAgIGJvb2xlYW4gdW5rbm93bjsKKworICAgICAgTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgKGFyY2gsIG1hY2hpbmUsICZ1bmtub3duKTsKKyAgICAgIGlmICh1bmtub3duKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSAqLworICBzd2l0Y2ggKGFyY2gpIHsKKyAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKKyAgY2FzZSBiZmRfYXJjaF9hMjlrOgorICBjYXNlIGJmZF9hcmNoX21pcHM6CisgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gKCphb3V0X2JhY2tlbmRfaW5mbyhhYmZkKS0+c2V0X3NpemVzKSAoYWJmZCk7Cit9CisKK3N0YXRpYyB2b2lkCithZGp1c3Rfb19tYWdpYyAoYWJmZCwgZXhlY3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOworeworICBmaWxlX3B0ciBwb3MgPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOworICBiZmRfdm1hIHZtYSA9IDA7CisgIGludCBwYWQgPSAwOworCisgIC8qIFRleHQuICAqLworICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKKyAgaWYgKCFvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQorICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSB2bWE7CisgIGVsc2UKKyAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOworCisgIHBvcyArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOworICB2bWEgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKworICAvKiBEYXRhLiAgKi8KKyAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQorICAgIHsKKyNpZiAwCSAgICAvKiA/PyBEb2VzIGFsaWdubWVudCBpbiB0aGUgZmlsZSBpbWFnZSByZWFsbHkgbWF0dGVyPyAqLworICAgICAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7CisjZW5kaWYKKyAgICAgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOworICAgICAgcG9zICs9IHBhZDsKKyAgICAgIHZtYSArPSBwYWQ7CisgICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gdm1hOworICAgIH0KKyAgZWxzZQorICAgIHZtYSA9IG9ial9kYXRhc2VjKGFiZmQpLT52bWE7CisgIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOworICBwb3MgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKyAgdm1hICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7CisKKyAgLyogQlNTLiAgKi8KKyAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCisgICAgeworI2lmIDAKKyAgICAgIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikgLSB2bWE7CisjZW5kaWYKKyAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOworICAgICAgcG9zICs9IHBhZDsKKyAgICAgIHZtYSArPSBwYWQ7CisgICAgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEgPSB2bWE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIFZNQSBvZiB0aGUgLmJzcyBzZWN0aW9uIGlzIHNldCBieSB0aGUgdGhlIFZNQSBvZiB0aGUKKyAgICAgICAgIC5kYXRhIHNlY3Rpb24gcGx1cyB0aGUgc2l6ZSBvZiB0aGUgLmRhdGEgc2VjdGlvbi4gIFdlIG1heQorICAgICAgICAgbmVlZCB0byBhZGQgcGFkZGluZyBieXRlcyB0byBtYWtlIHRoaXMgdHJ1ZS4gICovCisgICAgICBwYWQgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hIC0gdm1hOworICAgICAgaWYgKHBhZCA+IDApCisJeworCSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgKz0gcGFkOworCSAgcG9zICs9IHBhZDsKKwl9CisgICAgfQorICBvYmpfYnNzc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOworCisgIC8qIEZpeCB1cCB0aGUgZXhlYyBoZWFkZXIuICAqLworICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKyAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7CisgIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKyAgTl9TRVRfTUFHSUMgKCpleGVjcCwgT01BR0lDKTsKK30KKworc3RhdGljIHZvaWQKK2FkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Cit7CisgIGJmZF9zaXplX3R5cGUgZGF0YV9wYWQsIHRleHRfcGFkOworICBmaWxlX3B0ciB0ZXh0X2VuZDsKKyAgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICphYmRwOworICBpbnQgenRpaDsJCQkvKiBOb256ZXJvIGlmIHRleHQgaW5jbHVkZXMgZXhlYyBoZWFkZXIuICAqLworICAKKyAgYWJkcCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKTsKKworICAvKiBUZXh0LiAgKi8KKyAgenRpaCA9IChhYmRwICE9IE5VTEwKKwkgICYmIChhYmRwLT50ZXh0X2luY2x1ZGVzX2hlYWRlcgorCSAgICAgIHx8IG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gcV9tYWdpY19mb3JtYXQpKTsKKyAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSAoenRpaAorCQkJCT8gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplCisJCQkJOiBhZGF0YShhYmZkKS56bWFnaWNfZGlza19ibG9ja19zaXplKTsKKyAgaWYgKCEgb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKKyAgICB7CisgICAgICAvKiA/PyBEbyB3ZSByZWFsbHkgbmVlZCB0byBjaGVjayBmb3IgcmVsb2NzIGhlcmU/ICAqLworICAgICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpCisJCQkJPyAwCisJCQkJOiAoenRpaAorCQkJCSAgID8gKGFiZHAtPmRlZmF1bHRfdGV4dF92bWEKKwkJCQkgICAgICArIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKKwkJCQkgICA6IGFiZHAtPmRlZmF1bHRfdGV4dF92bWEpKTsKKyAgICAgIHRleHRfcGFkID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgLnRleHQgc2VjdGlvbiBpcyBiZWluZyBsb2FkZWQgYXQgYW4gdW51c3VhbCBhZGRyZXNzLiAgV2UKKyAgICAgICAgIG1heSBuZWVkIHRvIHBhZCBpdCBzdWNoIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gc3RhcnRzIGF0IGEgcGFnZQorICAgICAgICAgYm91bmRhcnkuICAqLworICAgICAgaWYgKHp0aWgpCisJdGV4dF9wYWQgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyAtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hKQorCQkgICAgJiAoYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSAtIDEpKTsKKyAgICAgIGVsc2UKKwl0ZXh0X3BhZCA9ICgoLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKKwkJICAgICYgKGFkYXRhIChhYmZkKS5wYWdlX3NpemUgLSAxKSk7CisgICAgfQorCisgIC8qIEZpbmQgc3RhcnQgb2YgZGF0YS4gICovCisgIGlmICh6dGloKQorICAgIHsKKyAgICAgIHRleHRfZW5kID0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zICsgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgICAgICB0ZXh0X3BhZCArPSBCRkRfQUxJR04gKHRleHRfZW5kLCBhZGF0YSAoYWJmZCkucGFnZV9zaXplKSAtIHRleHRfZW5kOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGUgdGhhdCBpZiBwYWdlX3NpemUgPT0gem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSwgdGhlbgorCSBmaWxlcG9zID09IHBhZ2Vfc2l6ZSwgYW5kIHRoaXMgY2FzZSBpcyB0aGUgc2FtZSBhcyB0aGUgenRpaAorCSBjYXNlLiAgKi8KKyAgICAgIHRleHRfZW5kID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgICAgICB0ZXh0X3BhZCArPSBCRkRfQUxJR04gKHRleHRfZW5kLCBhZGF0YSAoYWJmZCkucGFnZV9zaXplKSAtIHRleHRfZW5kOworICAgICAgdGV4dF9lbmQgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zOworICAgIH0KKyAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSB0ZXh0X3BhZDsKKyAgdGV4dF9lbmQgKz0gdGV4dF9wYWQ7CisKKyAgLyogRGF0YS4gICovCisgIGlmICghb2JqX2RhdGFzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKKyAgICB7CisgICAgICBiZmRfdm1hIHZtYTsKKyAgICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOworICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUpOworICAgIH0KKyAgaWYgKGFiZHAgJiYgYWJkcC0+em1hZ2ljX21hcHBlZF9jb250aWd1b3VzKQorICAgIHsKKyAgICAgIHRleHRfcGFkID0gKG9ial9kYXRhc2VjKGFiZmQpLT52bWEKKwkJICAtIG9ial90ZXh0c2VjKGFiZmQpLT52bWEKKwkJICAtIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpOworICAgICAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSB0ZXh0X3BhZDsKKyAgICB9CisgIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gKG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zCisJCQkJKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKTsKKyAgCisgIC8qIEZpeCB1cCBleGVjIGhlYWRlciB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCisgIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOworICBpZiAoenRpaCAmJiAoIWFiZHAgfHwgKGFiZHAgJiYgIWFiZHAtPmV4ZWNfaGVhZGVyX25vdF9jb3VudGVkKSkpCisgICAgZXhlY3AtPmFfdGV4dCArPSBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7CisgIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IHFfbWFnaWNfZm9ybWF0KQorICAgIE5fU0VUX01BR0lDICgqZXhlY3AsIFFNQUdJQyk7CisgIGVsc2UKKyAgICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBaTUFHSUMpOworCisgIC8qIFNwZWMgc2F5cyBkYXRhIHNlY3Rpb24gc2hvdWxkIGJlIHJvdW5kZWQgdXAgdG8gcGFnZSBib3VuZGFyeS4gICovCisgIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUKKyAgICA9IGFsaWduX3Bvd2VyIChvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAorCQkgICBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOworICBleGVjcC0+YV9kYXRhID0gQkZEX0FMSUdOIChvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAorCQkJICAgICBhZGF0YShhYmZkKS5wYWdlX3NpemUpOworICBkYXRhX3BhZCA9IGV4ZWNwLT5hX2RhdGEgLSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOworCisgIC8qIEJTUy4gICovCisgIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQorICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IChvYmpfZGF0YXNlYyhhYmZkKS0+dm1hCisJCQkgICAgICsgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSk7CisgIC8qIElmIHRoZSBCU1MgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uIGFuZCBleHRyYSBzcGFjZQorICAgICBpbiB0aGUgcGFnZSBpcyBsZWZ0IGFmdGVyIHRoZSBkYXRhIHNlY3Rpb24sIGZ1ZGdlIGRhdGEKKyAgICAgaW4gdGhlIGhlYWRlciBzbyB0aGF0IHRoZSBic3Mgc2VjdGlvbiBsb29rcyBzbWFsbGVyIGJ5IHRoYXQKKyAgICAgYW1vdW50LiAgV2UnbGwgc3RhcnQgdGhlIGJzcyBzZWN0aW9uIHRoZXJlLCBhbmQgbGllIHRvIHRoZSBPUy4KKyAgICAgKE5vdGUgdGhhdCBhIGxpbmtlciBzY3JpcHQsIGFzIHdlbGwgYXMgdGhlIGFib3ZlIGFzc2lnbm1lbnQsCisgICAgIGNvdWxkIGhhdmUgZXhwbGljaXRseSBzZXQgdGhlIEJTUyB2bWEgdG8gaW1tZWRpYXRlbHkgZm9sbG93CisgICAgIHRoZSBkYXRhIHNlY3Rpb24uKSAgKi8KKyAgaWYgKGFsaWduX3Bvd2VyIChvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcikKKyAgICAgID09IG9ial9kYXRhc2VjKGFiZmQpLT52bWEgKyBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplKQorICAgIGV4ZWNwLT5hX2JzcyA9IChkYXRhX3BhZCA+IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSkgPyAwIDoKKyAgICAgIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSAtIGRhdGFfcGFkOworICBlbHNlCisgICAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOworfQorCitzdGF0aWMgdm9pZAorYWRqdXN0X25fbWFnaWMgKGFiZmQsIGV4ZWNwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKK3sKKyAgZmlsZV9wdHIgcG9zID0gYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplOworICBiZmRfdm1hIHZtYSA9IDA7CisgIGludCBwYWQ7CisgIAorICAvKiBUZXh0LiAgKi8KKyAgb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7CisgIGlmICghb2JqX3RleHRzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKKyAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gdm1hOworICBlbHNlCisgICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKKyAgcG9zICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7CisgIHZtYSArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOworCisgIC8qIERhdGEuICAqLworICBvYmpfZGF0YXNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKKyAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQorICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSBCRkRfQUxJR04gKHZtYSwgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplKTsKKyAgdm1hID0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKKyAgCisgIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLworICB2bWEgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKyAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKKyAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7CisgIHBvcyArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOworCisgIC8qIEJTUy4gICovCisgIGlmICghb2JqX2Jzc3NlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQorICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IHZtYTsKKyAgZWxzZQorICAgIHZtYSA9IG9ial9ic3NzZWMoYWJmZCktPnZtYTsKKworICAvKiBGaXggdXAgZXhlYyBoZWFkZXIuICAqLworICBleGVjcC0+YV90ZXh0ID0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKyAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7CisgIGV4ZWNwLT5hX2JzcyA9IG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZTsKKyAgTl9TRVRfTUFHSUMgKCpleGVjcCwgTk1BR0lDKTsKK30KKworYm9vbGVhbgorTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsIHRleHRfc2l6ZSwgdGV4dF9lbmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3NpemVfdHlwZSAqdGV4dF9zaXplOworICAgICBmaWxlX3B0ciAqdGV4dF9lbmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKworICBpZiAoISBOQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYWRhdGEoYWJmZCkubWFnaWMgIT0gdW5kZWNpZGVkX21hZ2ljKQorICAgIHJldHVybiB0cnVlOworCisgIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUgPQorICAgIGFsaWduX3Bvd2VyKG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCisJCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOworCisgICp0ZXh0X3NpemUgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKKyAgLyogUnVsZSAoaGV1cmlzdGljKSBmb3Igd2hlbiB0byBwYWQgdG8gYSBuZXcgcGFnZS4gIE5vdGUgdGhhdCB0aGVyZQorICAgICBhcmUgKGF0IGxlYXN0KSB0d28gd2F5cyBkZW1hbmQtcGFnZWQgKFpNQUdJQykgZmlsZXMgaGF2ZSBiZWVuCisgICAgIGhhbmRsZWQuICBNb3N0IEJlcmtlbGV5LWJhc2VkIHN5c3RlbXMgc3RhcnQgdGhlIHRleHQgc2VnbWVudCBhdAorICAgICAoVEFSR0VUX1BBR0VfU0laRSkuICBIb3dldmVyLCBuZXdlciB2ZXJzaW9ucyBvZiBTVU5PUyBzdGFydCB0aGUgdGV4dAorICAgICBzZWdtZW50IHJpZ2h0IGFmdGVyIHRoZSBleGVjIGhlYWRlcjsgdGhlIGxhdHRlciBpcyBjb3VudGVkIGluIHRoZQorICAgICB0ZXh0IHNlZ21lbnQgc2l6ZSwgYW5kIGlzIHBhZ2VkIGluIGJ5IHRoZSBrZXJuZWwgd2l0aCB0aGUgcmVzdCBvZgorICAgICB0aGUgdGV4dC4gKi8KKworICAvKiBUaGlzIHBlcmhhcHMgaXNuJ3QgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzLCBidXQgbWFkZSBpdCBzaW1wbGVyIGZvciBtZQorICAgICB0byB1bmRlcnN0YW5kIGVub3VnaCB0byBpbXBsZW1lbnQgaXQuICBCZXR0ZXIgd291bGQgcHJvYmFibHkgYmUgdG8gZ28KKyAgICAgcmlnaHQgZnJvbSBCRkQgZmxhZ3MgdG8gYWxpZ25tZW50L3Bvc2l0aW9uaW5nIGNoYXJhY3RlcmlzdGljcy4gIEJ1dCB0aGUKKyAgICAgb2xkIGNvZGUgd2FzIHNsb3BweSBlbm91Z2ggYWJvdXQgaGFuZGxpbmcgdGhlIGZsYWdzLCBhbmQgaGFkIGVub3VnaAorICAgICBvdGhlciBtYWdpYywgdGhhdCBpdCB3YXMgYSBsaXR0bGUgaGFyZCBmb3IgbWUgdG8gdW5kZXJzdGFuZC4gIEkgdGhpbmsKKyAgICAgSSB1bmRlcnN0YW5kIGl0IGJldHRlciBub3csIGJ1dCBJIGhhdmVuJ3QgdGltZSB0byBkbyB0aGUgY2xlYW51cCB0aGlzCisgICAgIG1pbnV0ZS4gICovCisKKyAgaWYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkKKyAgICAvKiBXaGV0aGVyIG9yIG5vdCBXUF9URVhUIGlzIHNldCAtLSBsZXQgRF9QQUdFRCBvdmVycmlkZS4gICovCisgICAgYWRhdGEoYWJmZCkubWFnaWMgPSB6X21hZ2ljOworICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCisgICAgYWRhdGEoYWJmZCkubWFnaWMgPSBuX21hZ2ljOworICBlbHNlCisgICAgYWRhdGEoYWJmZCkubWFnaWMgPSBvX21hZ2ljOworCisjaWZkZWYgQkZEX0FPVVRfREVCVUcgLyogcmVxdWlyZXMgZ2NjMiAqLworI2lmIF9fR05VQ19fID49IDIKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXMgdGV4dD08JXgsJXgsJXg+IGRhdGE9PCV4LCV4LCV4PiBic3M9PCV4LCV4LCV4PlxuIiwKKwkgICAoeyBjaGFyICpzdHI7CisJICAgICAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykgeworCSAgICAgIGNhc2Ugbl9tYWdpYzogc3RyID0gIk5NQUdJQyI7IGJyZWFrOworCSAgICAgIGNhc2Ugb19tYWdpYzogc3RyID0gIk9NQUdJQyI7IGJyZWFrOworCSAgICAgIGNhc2Ugel9tYWdpYzogc3RyID0gIlpNQUdJQyI7IGJyZWFrOworCSAgICAgIGRlZmF1bHQ6IGFib3J0ICgpOworCSAgICAgIH0KKwkgICAgICBzdHI7CisJICAgIH0pLAorCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCisJICAgCW9ial90ZXh0c2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIsCisJICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKKwkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKKwkgICBvYmpfYnNzc2VjKGFiZmQpLT52bWEsIG9ial9ic3NzZWMoYWJmZCktPl9yYXdfc2l6ZSwKKwkgICAJb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgc3dpdGNoIChhZGF0YShhYmZkKS5tYWdpYykKKyAgICB7CisgICAgY2FzZSBvX21hZ2ljOgorICAgICAgYWRqdXN0X29fbWFnaWMgKGFiZmQsIGV4ZWNwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugel9tYWdpYzoKKyAgICAgIGFkanVzdF96X21hZ2ljIChhYmZkLCBleGVjcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIG5fbWFnaWM6CisgICAgICBhZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworI2lmZGVmIEJGRF9BT1VUX0RFQlVHCisgIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXg+XG4iLAorCSAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEsIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUsCisJICAgCW9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zLAorCSAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEsIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCisJICAgCW9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zLAorCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKTsKKyNlbmRpZgorCisgIHJldHVybiB0cnVlOworfQorCisvKgorRlVOQ1RJT04KKwlhb3V0X0B2YXJ7c2l6ZX1fbmV3X3NlY3Rpb25faG9vaworCitTWU5PUFNJUworICAgICAgICBib29sZWFuIGFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rLAorCSAgIChiZmQgKmFiZmQsCisJICAgIGFzZWN0aW9uICpuZXdzZWN0KSk7CisKK0RFU0NSSVBUSU9OCisJQ2FsbGVkIGJ5IHRoZSBCRkQgaW4gcmVzcG9uc2UgdG8gYSBAY29kZXtiZmRfbWFrZV9zZWN0aW9ufQorCXJlcXVlc3QuCisqLworYm9vbGVhbgorTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spIChhYmZkLCBuZXdzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpuZXdzZWN0OworeworICAvKiBhbGlnbiB0byBkb3VibGUgYXQgbGVhc3QgKi8KKyAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYmZkX2dldF9hcmNoX2luZm8oYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7CisKKworICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCisgIHsKKyAgICBpZiAob2JqX3RleHRzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIudGV4dCIpKSB7CisJb2JqX3RleHRzZWMoYWJmZCk9IG5ld3NlY3Q7CisJbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9URVhUOworCXJldHVybiB0cnVlOworICAgICAgfQorCisgICAgaWYgKG9ial9kYXRhc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmRhdGEiKSkgeworCW9ial9kYXRhc2VjKGFiZmQpID0gbmV3c2VjdDsKKwluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX0RBVEE7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICBpZiAob2JqX2Jzc3NlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi5ic3MiKSkgeworCW9ial9ic3NzZWMoYWJmZCkgPSBuZXdzZWN0OworCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fQlNTOworCXJldHVybiB0cnVlOworICAgICAgfQorCisgIH0KKworICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbGVhbgorTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgZmlsZV9wdHIgdGV4dF9lbmQ7CisgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOworCisgIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCisgICAgeworICAgICAgaWYgKCEgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoc2VjdGlvbiAhPSBvYmpfdGV4dHNlYyAoYWJmZCkKKyAgICAgICYmIHNlY3Rpb24gIT0gb2JqX2RhdGFzZWMgKGFiZmQpKQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoY291bnQgIT0gMCkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbHMgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2FvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOworCisgICAgICBjb3VudCA9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zIC8gRVhURVJOQUxfTkxJU1RfU0laRTsKKworI2lmZGVmIFVTRV9NTUFQCisgICAgICBpZiAoYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwKKwkJCSAgICAgICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywKKwkJCSAgICAgICAmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCksIHRydWUpID09IGZhbHNlKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHN5bXMgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIG9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpLmRhdGE7CisjZWxzZQorICAgICAgLyogV2UgYWxsb2NhdGUgdXNpbmcgbWFsbG9jIHRvIG1ha2UgdGhlIHZhbHVlcyBlYXN5IHRvIGZyZWUKKwkgbGF0ZXIgb24uICBJZiB3ZSBwdXQgdGhlbSBvbiB0aGUgb2JqYWxsb2MgaXQgbWlnaHQgbm90IGJlCisJIHBvc3NpYmxlIHRvIGZyZWUgdGhlbS4gICovCisgICAgICBzeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKKwkgICAgICBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKKyAgICAgIGlmIChzeW1zID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCAmJiBjb3VudCAhPSAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgKGJmZF9yZWFkIChzeW1zLCAxLCBleGVjX2hkciAoYWJmZCktPmFfc3ltcywgYWJmZCkKKwkgICAgICAhPSBleGVjX2hkciAoYWJmZCktPmFfc3ltcykpCisJeworCSAgZnJlZSAoc3ltcyk7CisJICByZXR1cm4gZmFsc2U7CisJfQorI2VuZGlmCisKKyAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gc3ltczsKKyAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSBjb3VudDsKKyAgICB9CisgICAgICAKKyAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID09IE5VTEwKKyAgICAgICYmIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zICE9IDApCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBzdHJpbmdfY2hhcnNbQllURVNfSU5fV09SRF07CisgICAgICBiZmRfc2l6ZV90eXBlIHN0cmluZ3NpemU7CisgICAgICBjaGFyICpzdHJpbmdzOworCisgICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBzdHJpbmdfY2hhcnMsIEJZVEVTX0lOX1dPUkQsIDEsIGFiZmQpCisJICAgICAgIT0gQllURVNfSU5fV09SRCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgc3RyaW5nc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBzdHJpbmdfY2hhcnMpOworCisjaWZkZWYgVVNFX01NQVAKKyAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBzdHJpbmdzaXplLAorCQkJICAgICAgICZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCisJcmV0dXJuIGZhbHNlOworICAgICAgc3RyaW5ncyA9IChjaGFyICopIG9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLmRhdGE7CisjZWxzZQorICAgICAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN0cmluZ3NpemUgKyAxKTsKKyAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBTa2lwIHNwYWNlIGZvciB0aGUgc3RyaW5nIGNvdW50IGluIHRoZSBidWZmZXIgZm9yIGNvbnZlbmllbmNlCisJIHdoZW4gdXNpbmcgaW5kZXhlcy4gICovCisgICAgICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBCWVRFU19JTl9XT1JELCAxLCBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCwKKwkJICAgIGFiZmQpCisJICAhPSBzdHJpbmdzaXplIC0gQllURVNfSU5fV09SRCkKKwl7CisJICBmcmVlIChzdHJpbmdzKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisjZW5kaWYKKworICAgICAgLyogRW5zdXJlIHRoYXQgYSB6ZXJvIGluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuICAqLworICAgICAgc3RyaW5nc1swXSA9ICdcMCc7CisKKyAgICAgIHN0cmluZ3Nbc3RyaW5nc2l6ZSAtIDFdID0gMDsKKworICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOworICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUgKGFiZmQpID0gc3RyaW5nc2l6ZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRyYW5zbGF0ZSBhbiBhLm91dCBzeW1ib2wgaW50byBhIEJGRCBzeW1ib2wuICBUaGUgZGVzYywgb3RoZXIsIHR5cGUKKyAgIGFuZCBzeW1ib2wtPnZhbHVlIGZpZWxkcyBvZiBDQUNIRV9QVFIgd2lsbCBiZSBzZXQgZnJvbSB0aGUgYS5vdXQKKyAgIG5saXN0IHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKKyAgIHN5bWJvbC0+ZmxhZ3MgYW5kIHN5bWJvbC0+c2VjdGlvbiwgYW5kIGFkanVzdGluZyBzeW1ib2wtPnZhbHVlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3RyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZV9wdHI7Cit7CisgIGZsYWd3b3JkIHZpc2libGU7CisKKyAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX1NUQUIpICE9IDAKKyAgICAgIHx8IGNhY2hlX3B0ci0+dHlwZSA9PSBOX0ZOKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisKKyAgICAgIC8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KKworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworCisgICAgICAvKiBXb3JrIG91dCB0aGUgc3ltYm9sIHNlY3Rpb24uICAqLworICAgICAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCisJeworCWNhc2UgTl9URVhUOgorCWNhc2UgTl9GTjoKKwkgIHNlYyA9IG9ial90ZXh0c2VjIChhYmZkKTsKKwkgIGJyZWFrOworCWNhc2UgTl9EQVRBOgorCSAgc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOworCSAgYnJlYWs7CisJY2FzZSBOX0JTUzoKKwkgIHNlYyA9IG9ial9ic3NzZWMgKGFiZmQpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIE5fQUJTOgorCSAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgIGJyZWFrOworCX0KKworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IHNlYzsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IHNlYy0+dm1hOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBkZWZhdWx0IHZpc2liaWxpdHkuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFsbCB0eXBlcywgc28KKyAgICAgd2UganVzdCBob2xkIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgdG8gdXNlIGlmIHdhbnRlZC4gICovCisgIGlmICgoY2FjaGVfcHRyLT50eXBlICYgTl9FWFQpID09IDApCisgICAgdmlzaWJsZSA9IEJTRl9MT0NBTDsKKyAgZWxzZQorICAgIHZpc2libGUgPSBCU0ZfR0xPQkFMOworCisgIHN3aXRjaCAoY2FjaGVfcHRyLT50eXBlKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgTl9BQlM6IGNhc2UgTl9BQlMgfCBOX0VYVDoKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgorICAgICAgaWYgKGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlICE9IDApCisJeworCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLworCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfR0xPQkFMOworCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gMDsKKwkgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1RFWFQ6IGNhc2UgTl9URVhUIHwgTl9FWFQ6CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIE5fU0VUViBzeW1ib2xzIHVzZWQgdG8gcmVwcmVzZW50IHNldCB2ZWN0b3JzIHBsYWNlZCBpbiB0aGUKKwkgZGF0YSBzZWN0aW9uLiAgVGhleSBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZC4gIFRoZW9yZXRpY2FsbHksCisJIGl0IHdhcyBwb3NzaWJsZSB0byBleHRyYWN0IHRoZSBlbnRyaWVzIGFuZCBjb21iaW5lIHRoZW0gd2l0aAorCSBuZXcgb25lcywgYWx0aG91Z2ggSSBkb24ndCBrbm93IGlmIHRoYXQgd2FzIGV2ZXIgYWN0dWFsbHkKKwkgZG9uZS4gIFVubGVzcyB0aGF0IGZlYXR1cmUgaXMgcmVzdG9yZWQsIHRyZWF0IHRoZW0gYXMgZGF0YQorCSBzeW1ib2xzLiAgKi8KKyAgICBjYXNlIE5fU0VUVjogY2FzZSBOX1NFVFYgfCBOX0VYVDoKKyAgICBjYXNlIE5fREFUQTogY2FzZSBOX0RBVEEgfCBOX0VYVDoKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9CU1M6IGNhc2UgTl9CU1MgfCBOX0VYVDoKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6CisgICAgY2FzZSBOX1NFVFQ6IGNhc2UgTl9TRVRUIHwgTl9FWFQ6CisgICAgY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6CisgICAgY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6CisgICAgICB7CisJLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8gbWFrZQorICAgICAgICAgICB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdyBoYW5kbGVkIGluCisgICAgICAgICAgIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLworI2lmIDAKKwlhc2VjdGlvbiAqc2VjdGlvbjsKKwlhcmVsZW50X2NoYWluICpyZWxvYzsKKwlhc2VjdGlvbiAqaW50b19zZWN0aW9uOworCisJLyogVGhpcyBpcyBhIHNldCBzeW1ib2wuICBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBuYW1lCisJICAgb2YgdGhlIHNldCAoZS5nLiwgX19DVE9SX0xJU1RfXykuICBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbAorCSAgIGlzIHRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNldC4gIFdlIGNyZWF0ZSBhIHNlY3Rpb24gd2l0aAorCSAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN5bWJvbCwgYW5kIGFkZCBhIHJlbG9jIHRvIGluc2VydCB0aGUKKwkgICBhcHByb3ByaWF0ZSB2YWx1ZSBpbnRvIHRoZSBzZWN0aW9uLgorCisJICAgVGhpcyBhY3Rpb24gaXMgYWN0dWFsbHkgb2Jzb2xldGU7IGl0IHVzZWQgdG8gbWFrZSB0aGUKKwkgICBsaW5rZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLCBidXQgdGhlIGxpbmtlciBubyBsb25nZXIgdXNlcworCSAgIHRoaXMgZnVuY3Rpb24uICAqLworCisJc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKKwlpZiAoc2VjdGlvbiA9PSBOVUxMKQorCSAgeworCSAgICBjaGFyICpjb3B5OworCisJICAgIGNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoY2FjaGVfcHRyLT5zeW1ib2wubmFtZSkgKyAxKTsKKwkgICAgaWYgKGNvcHkgPT0gTlVMTCkKKwkgICAgICByZXR1cm4gZmFsc2U7CisKKwkgICAgc3RyY3B5IChjb3B5LCBjYWNoZV9wdHItPnN5bWJvbC5uYW1lKTsKKwkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIGNvcHkpOworCSAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKworCXJlbG9jID0gKGFyZWxlbnRfY2hhaW4gKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnRfY2hhaW4pKTsKKwlpZiAocmVsb2MgPT0gTlVMTCkKKwkgIHJldHVybiBmYWxzZTsKKworCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhlIGNvbnN0cnVjdG9yLiAgKi8KKwlzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKKwkgIHsKKwkgIGNhc2UgTl9TRVRBOgorCSAgICBpbnRvX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0FCUzsKKwkgICAgYnJlYWs7CisJICBjYXNlIE5fU0VUVDoKKwkgICAgaW50b19zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOworCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX1RFWFQ7CisJICAgIGJyZWFrOworCSAgY2FzZSBOX1NFVEQ6CisJICAgIGludG9fc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKKwkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9EQVRBOworCSAgICBicmVhazsKKwkgIGNhc2UgTl9TRVRCOgorCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKKwkgICAgY2FjaGVfcHRyLT50eXBlID0gTl9CU1M7CisJICAgIGJyZWFrOworCSAgfQorCisJLyogQnVpbGQgYSByZWxvY2F0aW9uIHBvaW50aW5nIGludG8gdGhlIGNvbnN0cnVjdG9yIHNlY3Rpb24KKwkgICBwb2ludGluZyBhdCB0aGUgc3ltYm9sIGluIHRoZSBzZXQgdmVjdG9yIHNwZWNpZmllZC4gICovCisJcmVsb2MtPnJlbGVudC5hZGRlbmQgPSBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZTsKKwljYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gaW50b19zZWN0aW9uOworCXJlbG9jLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBpbnRvX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOworCisJLyogV2UgbW9kaWZ5IHRoZSBzeW1ib2wgdG8gYmVsb25nIHRvIGEgc2VjdGlvbiBkZXBlbmRpbmcgdXBvbgorCSAgIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGFuZCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24KKwkgICB0byBjb250YWluIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLiBCdWlsZCBhIHJlbG9jIGVudHJ5IHRvCisJICAgcmVsb2NhdGUgdG8gdGhpcyBzeW1ib2wgYXR0YWNoZWQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KKwlzZWN0aW9uLT5mbGFncyA9IFNFQ19DT05TVFJVQ1RPUiB8IFNFQ19SRUxPQzsKKworCXNlY3Rpb24tPnJlbG9jX2NvdW50Kys7CisJc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworCXJlbG9jLT5uZXh0ID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47CisJc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvYzsKKwlyZWxvYy0+cmVsZW50LmFkZHJlc3MgPSBzZWN0aW9uLT5fcmF3X3NpemU7CisJc2VjdGlvbi0+X3Jhd19zaXplICs9IEJZVEVTX0lOX1dPUkQ7CisKKwlyZWxvYy0+cmVsZW50Lmhvd3RvID0gQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhhYmZkKTsKKworI2VuZGlmIC8qIDAgKi8KKworCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQorCSAgeworCSAgY2FzZSBOX1NFVEE6CisJICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgICBicmVhazsKKwkgIGNhc2UgTl9TRVRUOgorCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOworCSAgICBicmVhazsKKwkgIGNhc2UgTl9TRVREOgorCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOworCSAgICBicmVhazsKKwkgIGNhc2UgTl9TRVRCOgorCSAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fV0FSTklORzoKKyAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIHRoZSB0ZXh0IG9mIGEgd2FybmluZyBtZXNzYWdlLiAgVGhlIG5leHQKKwkgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdG8gYXNzb2NpYXRlIHRoZSB3YXJuaW5nIHdpdGguICBJZiBhCisJIHJlZmVyZW5jZSBpcyBtYWRlIHRvIHRoYXQgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgKi8KKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORyB8IEJTRl9XQVJOSU5HOworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9JTkRSOiBjYXNlIE5fSU5EUiB8IE5fRVhUOgorICAgICAgLyogQW4gaW5kaXJlY3Qgc3ltYm9sLiAgVGhpcyBjb25zaXN0cyBvZiB0d28gc3ltYm9scyBpbiBhIHJvdy4KKwkgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgaW5kaXJlY3Rpb24uICBUaGUgc2Vjb25kCisJIHN5bWJvbCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LiAgQSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0CisJIHN5bWJvbCBiZWNvbWVzIGEgcmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQuICAqLworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX0lORElSRUNUIHwgdmlzaWJsZTsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fV0VBS1U6CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9XRUFLQToKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1dFQUtUOgorICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9XRUFLRDoKKyAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fV0VBS0I6CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7CisgICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdGhlIGZpZWxkcyBvZiBTWU1fUE9JTlRFUiBhY2NvcmRpbmcgdG8gQ0FDSEVfUFRSLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3RyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBjYWNoZV9wdHIsIHN5bV9wb2ludGVyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKmNhY2hlX3B0cjsKKyAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fcG9pbnRlcjsKK3sKKyAgYmZkX3ZtYSB2YWx1ZSA9IGNhY2hlX3B0ci0+dmFsdWU7CisgIGFzZWN0aW9uICpzZWM7CisgIGJmZF92bWEgb2ZmOworCisgIC8qIE1hc2sgb3V0IGFueSBleGlzdGluZyB0eXBlIGJpdHMgaW4gY2FzZSBjb3B5aW5nIGZyb20gb25lIHNlY3Rpb24KKyAgICAgdG8gYW5vdGhlci4gICovCisgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJj0gfk5fVFlQRTsKKworICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKGNhY2hlX3B0cik7CisgIG9mZiA9IDA7CisKKyAgaWYgKHNlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMsIGUuZy4sIGZvciB0aGUgKkRFQlVHKiBzZWN0aW9uIG9mIGEgQ09GRgorCSBmaWxlLiAgKi8KKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBmb3Igc3ltYm9sIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCisJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAKKwkgY2FjaGVfcHRyLT5uYW1lICE9IE5VTEwgPyBjYWNoZV9wdHItPm5hbWUgOiBfKCIqdW5rbm93bioiKSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBvZmYgPSBzZWMtPm91dHB1dF9vZmZzZXQ7CisgICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOworICAgIH0KKworICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQorICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9BQlM7CisgIGVsc2UgaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCisgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX1RFWFQ7CisgIGVsc2UgaWYgKHNlYyA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCisgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0RBVEE7CisgIGVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChhYmZkKSkKKyAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fQlNTOworICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCisgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOworICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCisgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fSU5EUjsKKyAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQorICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSBOX1VOREYgfCBOX0VYVDsKKyAgZWxzZQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFR1cm4gdGhlIHN5bWJvbCBmcm9tIHNlY3Rpb24gcmVsYXRpdmUgdG8gYWJzb2x1dGUgYWdhaW4gKi8KKyAgdmFsdWUgKz0gc2VjLT52bWEgKyBvZmY7CisKKyAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCisgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fV0FSTklORzsKKworICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQorICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKKyAgZWxzZSBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQorICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9FWFQ7CisKKyAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKQorICAgIHsKKyAgICAgIGludCB0eXBlID0gKChhb3V0X3N5bWJvbF90eXBlICopIGNhY2hlX3B0ciktPnR5cGU7CisgICAgICBzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgTl9BQlM6CXR5cGUgPSBOX1NFVEE7IGJyZWFrOworCWNhc2UgTl9URVhUOgl0eXBlID0gTl9TRVRUOyBicmVhazsKKwljYXNlIE5fREFUQToJdHlwZSA9IE5fU0VURDsgYnJlYWs7CisJY2FzZSBOX0JTUzoJdHlwZSA9IE5fU0VUQjsgYnJlYWs7CisJfQorICAgICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IHR5cGU7CisgICAgfQorCisgIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQorICAgIHsKKyAgICAgIGludCB0eXBlOworCisgICAgICBzd2l0Y2ggKHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gJiBOX1RZUEUpCisJeworCWRlZmF1bHQ6CisJY2FzZSBOX0FCUzoJdHlwZSA9IE5fV0VBS0E7IGJyZWFrOworCWNhc2UgTl9URVhUOgl0eXBlID0gTl9XRUFLVDsgYnJlYWs7CisJY2FzZSBOX0RBVEE6CXR5cGUgPSBOX1dFQUtEOyBicmVhazsKKwljYXNlIE5fQlNTOgl0eXBlID0gTl9XRUFLQjsgYnJlYWs7CisJY2FzZSBOX1VOREY6CXR5cGUgPSBOX1dFQUtVOyBicmVhazsKKwl9CisgICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKKyAgICB9CisKKyAgUFVUX1dPUkQoYWJmZCwgdmFsdWUsIHN5bV9wb2ludGVyLT5lX3ZhbHVlKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KKworYXN5bWJvbCAqCitOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFvdXRfc3ltYm9sX3R5cGUgICpuZXcgPQorICAgIChhb3V0X3N5bWJvbF90eXBlICopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7CisgIGlmICghbmV3KQorICAgIHJldHVybiBOVUxMOworICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKworICByZXR1cm4gJm5ldy0+c3ltYm9sOworfQorCisvKiBUcmFuc2xhdGUgYSBzZXQgb2YgaW50ZXJuYWwgc3ltYm9scyBpbnRvIGV4dGVybmFsIHN5bWJvbHMuICAqLworCitib29sZWFuCitOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgKGFiZmQsIGluLCBleHQsIGNvdW50LCBzdHIsIHN0cnNpemUsIGR5bmFtaWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYW91dF9zeW1ib2xfdHlwZSAqaW47CisgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworICAgICBjaGFyICpzdHI7CisgICAgIGJmZF9zaXplX3R5cGUgc3Ryc2l6ZTsKKyAgICAgYm9vbGVhbiBkeW5hbWljOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmV4dF9lbmQ7CisKKyAgZXh0X2VuZCA9IGV4dCArIGNvdW50OworICBmb3IgKDsgZXh0IDwgZXh0X2VuZDsgZXh0KyssIGluKyspCisgICAgeworICAgICAgYmZkX3ZtYSB4OworCisgICAgICB4ID0gR0VUX1dPUkQgKGFiZmQsIGV4dC0+ZV9zdHJ4KTsKKyAgICAgIGluLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7CisKKyAgICAgIC8qIEZvciB0aGUgbm9ybWFsIHN5bWJvbHMsIHRoZSB6ZXJvIGluZGV4IHBvaW50cyBhdCB0aGUgbnVtYmVyCisJIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcgdGFibGUgYnV0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIHRoZQorCSBudWxsIHN0cmluZy4gIEZvciB0aGUgZHluYW1pYyBzeW1ib2xzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCisJIHRoZSBzdHJpbmcgdGFibGUgaXMgc3RvcmVkIGluIHRoZSBfX0RZTkFNSUMgc3RydWN0dXJlIGFuZCB0aGUKKwkgemVybyBpbmRleCBwb2ludHMgYXQgYW4gYWN0dWFsIHN0cmluZy4gICovCisgICAgICBpZiAoeCA9PSAwICYmICEgZHluYW1pYykKKwlpbi0+c3ltYm9sLm5hbWUgPSAiIjsKKyAgICAgIGVsc2UgaWYgKHggPCBzdHJzaXplKQorCWluLT5zeW1ib2wubmFtZSA9IHN0ciArIHg7CisgICAgICBlbHNlCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpbi0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCAgZXh0LT5lX3ZhbHVlKTsKKyAgICAgIGluLT5kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPmVfZGVzYyk7CisgICAgICBpbi0+b3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgZXh0LT5lX290aGVyKTsKKyAgICAgIGluLT50eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsICBleHQtPmVfdHlwZSk7CisgICAgICBpbi0+c3ltYm9sLnVkYXRhLnAgPSBOVUxMOworCisgICAgICBpZiAoISB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzIChhYmZkLCBpbikpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoZHluYW1pYykKKwlpbi0+c3ltYm9sLmZsYWdzIHw9IEJTRl9EWU5BTUlDOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCisgICBmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KKyAgIGhvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KKworYm9vbGVhbgorTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvbGRfZXh0ZXJuYWxfc3ltczsKKyAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOworICBzaXplX3QgY2FjaGVkX3NpemU7CisKKyAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLworICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBvbGRfZXh0ZXJuYWxfc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOworCisgIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjYWNoZWRfc2l6ZSA9IChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpCisJCSAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOworICBjYWNoZWQgPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBiZmRfbWFsbG9jIChjYWNoZWRfc2l6ZSk7CisgIGlmIChjYWNoZWQgPT0gTlVMTCAmJiBjYWNoZWRfc2l6ZSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGNhY2hlZF9zaXplICE9IDApCisgICAgbWVtc2V0IChjYWNoZWQsIDAsIGNhY2hlZF9zaXplKTsKKworICAvKiBDb252ZXJ0IGZyb20gZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHRvIGludGVybmFsLiAgKi8KKyAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQorCSAoYWJmZCwgY2FjaGVkLAorCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCksCisJICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpLAorCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCisJICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCisJICBmYWxzZSkpKQorICAgIHsKKyAgICAgIGZyZWUgKGNhY2hlZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKKworICBvYmpfYW91dF9zeW1ib2xzIChhYmZkKSA9IGNhY2hlZDsKKworICAvKiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFueWJvZHkgd2hvIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QKKyAgICAgd2FudCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBzbyBpZiBpdCB3YXMgYWxsb2NhdGVkCisgICAgIGJlY2F1c2Ugb2Ygb3VyIGNhbGwgdG8gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scywgd2UgZnJlZSBpdCB1cAorICAgICByaWdodCBhd2F5IHRvIHNhdmUgc3BhY2UuICAqLworICBpZiAob2xkX2V4dGVybmFsX3N5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMCisgICAgICAmJiBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCisgICAgeworI2lmZGVmIFVTRV9NTUFQCisgICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7CisjZWxzZQorICAgICAgZnJlZSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOworI2VuZGlmCisgICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB3aGVuIHdyaXRpbmcgb3V0IHN5bWJvbHMgc28gdGhhdCB3ZSBvbmx5IHdyaXRlCisgICBvdXQgYSBwYXJ0aWN1bGFyIHN0cmluZyBvbmNlLiAgVGhpcyBoZWxwcyBwYXJ0aWN1bGFybHkgd2hlbiB0aGUKKyAgIGxpbmtlciB3cml0ZXMgb3V0IHN0YWJzIGRlYnVnZ2luZyBlbnRyaWVzLCBiZWNhdXNlIGVhY2ggZGlmZmVyZW50CisgICBjb250cmlidXRpbmcgb2JqZWN0IGZpbGUgdGVuZHMgdG8gaGF2ZSBtYW55IGR1cGxpY2F0ZSBzdGFicworICAgc3RyaW5ncy4KKworICAgVGhpcyBoYXNoIHRhYmxlIGNvZGUgYnJlYWtzIGRieCBvbiBTdW5PUyA0LjEuMywgc28gd2UgZG9uJ3QgZG8gaXQKKyAgIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LiAgKi8KKworc3RhdGljIGJmZF9zaXplX3R5cGUgYWRkX3RvX3N0cmluZ3RhYgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIGVtaXRfc3RyaW5ndGFiIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKKworLyogR2V0IHRoZSBpbmRleCBvZiBhIHN0cmluZyBpbiBhIHN0cnRhYiwgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdAorICAgYWxyZWFkeSBwcmVzZW50LiAgKi8KKworc3RhdGljIElOTElORSBiZmRfc2l6ZV90eXBlCithZGRfdG9fc3RyaW5ndGFiIChhYmZkLCB0YWIsIHN0ciwgY29weSkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7CisgICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICAgYm9vbGVhbiBjb3B5OworeworICBib29sZWFuIGhhc2g7CisgIGJmZF9zaXplX3R5cGUgaW5kZXg7CisKKyAgLyogQW4gaW5kZXggb2YgMCBhbHdheXMgbWVhbnMgdGhlIGVtcHR5IHN0cmluZy4gICovCisgIGlmIChzdHIgPT0gMCB8fCAqc3RyID09ICdcMCcpCisgICAgcmV0dXJuIDA7CisKKyAgLyogRG9uJ3QgaGFzaCBpZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgYmVjYXVzZSBTdW5PUyBkYngKKyAgICAgZG9lc24ndCB1bmRlcnN0YW5kIGEgaGFzaGVkIHN0cmluZyB0YWJsZS4gICovCisgIGhhc2ggPSB0cnVlOworICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKKyAgICBoYXNoID0gZmFsc2U7CisKKyAgaW5kZXggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHRhYiwgc3RyLCBoYXNoLCBjb3B5KTsKKworICBpZiAoaW5kZXggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQorICAgIHsKKyAgICAgIC8qIEFkZCBCWVRFU19JTl9XT1JEIHRvIHRoZSByZXR1cm4gdmFsdWUgdG8gYWNjb3VudCBmb3IgdGhlCisJIHNwYWNlIHRha2VuIHVwIGJ5IHRoZSBzdHJpbmcgdGFibGUgc2l6ZS4gICovCisgICAgICBpbmRleCArPSBCWVRFU19JTl9XT1JEOworICAgIH0KKworICByZXR1cm4gaW5kZXg7Cit9CisKKy8qIFdyaXRlIG91dCBhIHN0cnRhYi4gIEFCRkQgaXMgYWxyZWFkeSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlCisgICBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VtaXRfc3RyaW5ndGFiIChhYmZkLCB0YWIpCisgICAgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOworeworICBiZmRfYnl0ZSBidWZmZXJbQllURVNfSU5fV09SRF07CisKKyAgLyogVGhlIHN0cmluZyB0YWJsZSBzdGFydHMgd2l0aCB0aGUgc2l6ZS4gICovCisgIFBVVF9XT1JEIChhYmZkLCBfYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpICsgQllURVNfSU5fV09SRCwgYnVmZmVyKTsKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBCWVRFU19JTl9XT1JELCBhYmZkKSAhPSBCWVRFU19JTl9XT1JEKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKTsKK30KKwwKK2Jvb2xlYW4KK05BTUUoYW91dCx3cml0ZV9zeW1zKSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICB1bnNpZ25lZCBpbnQgY291bnQgOworICBhc3ltYm9sICoqZ2VuZXJpYyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7CisgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKKworICBzdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOworICBpZiAoc3RydGFiID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOyBjb3VudCsrKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKmcgPSBnZW5lcmljW2NvdW50XTsKKyAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKKyAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBuc3A7CisKKyAgICAgIGluZHggPSBhZGRfdG9fc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIsIGctPm5hbWUsIGZhbHNlKTsKKyAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIFBVVF9XT1JEIChhYmZkLCBpbmR4LCAoYmZkX2J5dGUgKikgbnNwLmVfc3RyeCk7CisKKyAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyKGcpID09IGFiZmQtPnh2ZWMtPmZsYXZvdXIpCisJeworCSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5kZXNjLCAgbnNwLmVfZGVzYyk7CisJICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+b3RoZXIsICBuc3AuZV9vdGhlcik7CisJICBiZmRfaF9wdXRfOChhYmZkLCBhb3V0X3N5bWJvbChnKS0+dHlwZSwgIG5zcC5lX3R5cGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZmRfaF9wdXRfMTYoYWJmZCwwLCBuc3AuZV9kZXNjKTsKKwkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX290aGVyKTsKKwkgIGJmZF9oX3B1dF84KGFiZmQsIDAsIG5zcC5lX3R5cGUpOworCX0KKworICAgICAgaWYgKCEgdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGcsICZuc3ApKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpZiAoYmZkX3dyaXRlKChQVFIpJm5zcCwxLEVYVEVSTkFMX05MSVNUX1NJWkUsIGFiZmQpCisJICAhPSBFWFRFUk5BTF9OTElTVF9TSVpFKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICAvKiBOQjogYEtFRVBJVCcgY3VycmVudGx5IG92ZXJsYXlzIGB1ZGF0YS5wJywgc28gc2V0IHRoaXMgb25seQorCSBoZXJlLCBhdCB0aGUgZW5kLiAgKi8KKyAgICAgIGctPktFRVBJVCA9IGNvdW50OworICAgIH0KKworICBpZiAoISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgc3RydGFiKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOworCisgIHJldHVybiB0cnVlOworCitlcnJvcl9yZXR1cm46CisgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7CisgIHJldHVybiBmYWxzZTsKK30KKworDAorbG9uZworTkFNRShhb3V0LGdldF9zeW10YWIpIChhYmZkLCBsb2NhdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqbG9jYXRpb247Cit7CisgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOworICAgIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7CisKKyAgICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChzeW1iYXNlID0gb2JqX2FvdXRfc3ltYm9scyhhYmZkKTsgY291bnRlcisrIDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7KQorICAgICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopKCBzeW1iYXNlKyspOworICAgICpsb2NhdGlvbisrID0wOworICAgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKK30KKworDAorLyogU3RhbmRhcmQgcmVsb2Mgc3R1ZmYgKi8KKy8qIE91dHB1dCBzdGFuZGFyZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KKworZXh0ZXJuIHZvaWQgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikpOworCit2b2lkCitOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmc7CisgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKK3sKKyAgaW50IHJfaW5kZXg7CisgIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOworICBpbnQgcl9leHRlcm47CisgIHVuc2lnbmVkIGludCByX2xlbmd0aDsKKyAgaW50IHJfcGNyZWw7CisgIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7CisgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisKKyAgUFVUX1dPUkQoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOworCisgIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCisgIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KKyAgLyogWFhYIFRoaXMgcmVsaWVzIG9uIHJlbG9jcyBjb21pbmcgZnJvbSBhLm91dCBmaWxlcy4gICovCisgIHJfYmFzZXJlbCA9IChnLT5ob3d0by0+dHlwZSAmIDgpICE9IDA7CisgIHJfam1wdGFibGUgPSAoZy0+aG93dG8tPnR5cGUgJiAxNikgIT0gMDsKKyAgcl9yZWxhdGl2ZSA9IChnLT5ob3d0by0+dHlwZSAmIDMyKSAhPSAwOworCisjaWYgMAorICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLworICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisjZW5kaWYKKworICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLworCisgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKKyAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCisKKyAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAorICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KKyAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQorICAgICAqLworCisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCisgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQorICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCisgICAgeworICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCisgICAgICB7CisJLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAorCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCisJcl9pbmRleCA9IE5fQUJTOworCXJfZXh0ZXJuID0gMDsKKyAgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJLyogRmlsbCBpbiBzeW1ib2wgKi8KKwlyX2V4dGVybiA9IDE7CisJcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKKworICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLworICAgICAgcl9leHRlcm4gPSAwOworICAgICAgcl9pbmRleCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworICAgIH0KKworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgeworICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7CisgICAgICBuYXRwdHItPnJfdHlwZVswXSA9CisgICAgICAgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQorCXwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUc6IDApCisJIHwgKHJfYmFzZXJlbD8gICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRzogMCkKKwkgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUc6IDApCisJICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRzogMCkKKwkgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOworICAgIH0gZWxzZSB7CisJbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKwluYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisJbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKKwluYXRwdHItPnJfdHlwZVswXSA9CisJIChyX2V4dGVybj8gICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKKwkgIHwgKHJfcGNyZWw/ICAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCisJICAgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFOiAwKQorCSAgICB8IChyX2ptcHRhYmxlPyAgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFOiAwKQorCSAgICAgfCAocl9yZWxhdGl2ZT8gIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRTogMCkKKwkgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7CisgICAgICB9Cit9CisKKworLyogRXh0ZW5kZWQgc3R1ZmYgKi8KKy8qIE91dHB1dCBleHRlbmRlZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGEgZmlsZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gKi8KKworZXh0ZXJuIHZvaWQgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSk7CisKK3ZvaWQKK05BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqZzsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOworeworICBpbnQgcl9pbmRleDsKKyAgaW50IHJfZXh0ZXJuOworICB1bnNpZ25lZCBpbnQgcl90eXBlOworICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7CisgIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOworICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7CisKKyAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7CisKKyAgcl9hZGRlbmQgPSBnLT5hZGRlbmQ7CisgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKyAgICByX2FkZGVuZCArPSAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCisgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKKyAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCisKKyAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAorICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KKyAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCisKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKKyAgICB7CisgICAgICByX2V4dGVybiA9IDA7CisgICAgICByX2luZGV4ID0gTl9BQlM7CisgICAgfQorICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCisJICB8fCAoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCisJcl9leHRlcm4gPSAxOworICAgICAgZWxzZQorCXJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaW5kZXggPSAoKihnLT5zeW1fcHRyX3B0cikpLT5LRUVQSVQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCisgICAgICByX2V4dGVybiA9IDA7CisgICAgICByX2luZGV4ID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKyAgICB9CisKKyAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKKyAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OworICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKyAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OworICAgIG5hdHB0ci0+cl90eXBlWzBdID0KKyAgICAgICgocl9leHRlcm4/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc6IDApCisgICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7CisgIH0gZWxzZSB7CisgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKyAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKKyAgICBuYXRwdHItPnJfdHlwZVswXSA9CisgICAgIChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTogMCkKKyAgICAgIHwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7CisgIH0KKworICBQVVRfV09SRCAoYWJmZCwgcl9hZGRlbmQsIG5hdHB0ci0+cl9hZGRlbmQpOworfQorCisvKiBCRkQgZGVhbHMgaW50ZXJuYWxseSB3aXRoIGFsbCB0aGluZ3MgYmFzZWQgZnJvbSB0aGUgc2VjdGlvbiB0aGV5J3JlCisgICBpbi4gc28sIHNvbWV0aGluZyBpbiAxMCBieXRlcyBpbnRvIGEgdGV4dCBzZWN0aW9uICB3aXRoIGEgYmFzZSBvZgorICAgNTAgd291bGQgaGF2ZSBhIHN5bWJvbCAoLnRleHQrMTApIGFuZCBrbm93IC50ZXh0IHZtYSB3YXMgNTAuCisKKyAgIEFvdXQga2VlcHMgYWxsIGl0J3Mgc3ltYm9scyBiYXNlZCBmcm9tIHplcm8sIHNvIHRoZSBzeW1ib2wgd291bGQKKyAgIGNvbnRhaW4gNjAuIFRoaXMgbWFjcm8gc3VicyB0aGUgYmFzZSBvZiBlYWNoIHNlY3Rpb24gZnJvbSB0aGUgdmFsdWUKKyAgIHRvIGdpdmUgdGhlIHRydWUgb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24gKi8KKworCisjZGVmaW5lIE1PVkVfQUREUkVTUyhhZCkgICAgICAgCQkJCQkJXAorICBpZiAocl9leHRlcm4pIHsJCQkJCQkJXAorICAgLyogdW5kZWZpbmVkIHN5bWJvbCAqLwkJCQkJCVwKKyAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyByX2luZGV4OwkJCVwKKyAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCisgICAgIH0gZWxzZSB7CQkJCQkJCQlcCisgICAgLyogZGVmaW5lZCwgc2VjdGlvbiByZWxhdGl2ZS4gcmVwbGFjZSBzeW1ib2wgd2l0aCBwb2ludGVyIHRvICAgIAlcCisgICAgICAgc3ltYm9sIHdoaWNoIHBvaW50cyB0byBzZWN0aW9uICAqLwkJCQlcCisgICAgc3dpdGNoIChyX2luZGV4KSB7CQkJCQkJCVwKKyAgICBjYXNlIE5fVEVYVDoJCQkJCQkJXAorICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CQkJCQkJXAorICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfdGV4dHNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgIC0gc3UtPnRleHRzZWMtPnZtYTsJCQlcCisgICAgICBicmVhazsJCQkJCQkJCVwKKyAgICBjYXNlIE5fREFUQToJCQkJCQkJXAorICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CQkJCQkJXAorICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+ZGF0YXNlYy0+dm1hOwkJCVwKKyAgICAgIGJyZWFrOwkJCQkJCQkJXAorICAgIGNhc2UgTl9CU1M6CQkJCQkJCQlcCisgICAgY2FzZSBOX0JTUyB8IE5fRVhUOgkJCQkJCQlcCisgICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmJzc3NlYy0+dm1hOwkJCQlcCisgICAgICBicmVhazsJCQkJCQkJCVwKKyAgICBkZWZhdWx0OgkJCQkJCQkJXAorICAgIGNhc2UgTl9BQlM6CQkJCQkJCQlcCisgICAgY2FzZSBOX0FCUyB8IE5fRVhUOgkJCQkJCQlcCisgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZDsJCQkJCQlcCisgICAgICBicmVhazsJCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICB9ICAgICAJCQkJCQkJCVwKKwordm9pZAorTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqYnl0ZXM7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Cit7CisgIHVuc2lnbmVkIGludCByX2luZGV4OworICBpbnQgcl9leHRlcm47CisgIHVuc2lnbmVkIGludCByX3R5cGU7CisgIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7CisKKyAgY2FjaGVfcHRyLT5hZGRyZXNzID0gKEdFVF9TV09SRCAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcykpOworCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7CisgICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCisJICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQorCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMl07CisgICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKKyAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCisJCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUc7CisgIH0gZWxzZSB7CisgICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMl0gPDwgMTYpCisJICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQorCSAgICAgfCAgYnl0ZXMtPnJfaW5kZXhbMF07CisgICAgcl9leHRlcm4gPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKKyAgICByX3R5cGUgICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCisJCQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7CisgIH0KKworICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZTsKKworICAvKiBCYXNlIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIHN5bWJvbCB0YWJsZSwKKyAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiByX2V4dGVybi4gIHJfZXh0ZXJuIGp1c3QgcmVmbGVjdHMKKyAgICAgd2hldGhlciB0aGUgc3ltYm9sIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGlzIGxvY2FsIG9yIGdsb2JhbC4gICovCisgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCisgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCisgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQorICAgIHJfZXh0ZXJuID0gMTsKKworICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQorICAgIHsKKyAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCisgICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLworICAgICAgcl9leHRlcm4gPSAwOworICAgICAgcl9pbmRleCA9IE5fQUJTOworICAgIH0KKworICBNT1ZFX0FERFJFU1MoR0VUX1NXT1JEKGFiZmQsIGJ5dGVzLT5yX2FkZGVuZCkpOworfQorCit2b2lkCitOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKK3sKKyAgdW5zaWduZWQgaW50IHJfaW5kZXg7CisgIGludCByX2V4dGVybjsKKyAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOworICBpbnQgcl9wY3JlbDsKKyAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKKyAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7CisgIHVuc2lnbmVkIGludCBob3d0b19pZHg7CisKKyAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKKworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgeworICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzBdIDw8IDE2KQorICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKKwl8ICBieXRlcy0+cl9pbmRleFsyXTsKKyAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKKyAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOworICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKKyAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOworICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHKSk7CisgICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfQklHKQorICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKKyAgfSBlbHNlIHsKKyAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKKyAgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCisJfCAgYnl0ZXMtPnJfaW5kZXhbMF07CisgICAgcl9leHRlcm4gID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7CisgICAgcl9wY3JlbCAgID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKKyAgICByX2Jhc2VyZWwgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7CisgICAgcl9qbXB0YWJsZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKKyAgICByX3JlbGF0aXZlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOworICAgIHJfbGVuZ3RoICA9ICAgICAgIChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKKyAgICAgIAkJCT4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7CisgIH0KKworICBob3d0b19pZHggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAorCSAgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlOworICBCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7CisgIEJGRF9BU1NFUlQgKGNhY2hlX3B0ci0+aG93dG8tPnR5cGUgIT0gKHVuc2lnbmVkIGludCkgLTEpOworCisgIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAorICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cworICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KKyAgaWYgKHJfYmFzZXJlbCkKKyAgICByX2V4dGVybiA9IDE7CisKKyAgaWYgKHJfZXh0ZXJuICYmIHJfaW5kZXggPiBzeW1jb3VudCkKKyAgICB7CisgICAgICAvKiBXZSBjb3VsZCBhcnJhbmdlIHRvIHJldHVybiBhbiBlcnJvciwgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bAorICAgICAgICAgdG8gc2VlIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYmFkLiAgKi8KKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaW5kZXggPSBOX0FCUzsKKyAgICB9CisKKyAgTU9WRV9BRERSRVNTKDApOworfQorCisvKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gICovCisKK2Jvb2xlYW4KK05BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKKyAgUFRSIHJlbG9jczsKKyAgYXJlbGVudCAqcmVsb2NfY2FjaGU7CisgIHNpemVfdCBlYWNoX3NpemU7CisgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKKyAgYXJlbGVudCAqY2FjaGVfcHRyOworCisgIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCisgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKKyAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQorICAgIHJlbG9jX3NpemUgPSBleGVjX2hkcihhYmZkKS0+YV90cnNpemU7CisgIGVsc2UgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQorICAgIHJlbG9jX3NpemUgPSAwOworICBlbHNlCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7CisKKyAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOworCisgIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSkpOworICBpZiAocmVsb2NfY2FjaGUgPT0gTlVMTCAmJiBjb3VudCAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgbWVtc2V0IChyZWxvY19jYWNoZSwgMCwgY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKKworICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKKyAgaWYgKHJlbG9jcyA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKKyAgICB7CisgICAgICBmcmVlIChyZWxvY19jYWNoZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQorICAgIHsKKyAgICAgIGZyZWUgKHJlbG9jcyk7CisgICAgICBmcmVlIChyZWxvY19jYWNoZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOworICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPQorCShzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jczsKKworICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQorCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKKwkJCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcnB0ciA9CisJKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOworCisgICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCisJTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKKwkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKKyAgICB9CisKKyAgZnJlZSAocmVsb2NzKTsKKworICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbG9jX2NhY2hlOworICBhc2VjdC0+cmVsb2NfY291bnQgPSBjYWNoZV9wdHIgLSByZWxvY19jYWNoZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IGEgcmVsb2NhdGlvbiBzZWN0aW9uIGludG8gYW4gb2JqZWN0IGZpbGUuICAqLworCitib29sZWFuCitOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBzZWN0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICBhcmVsZW50ICoqZ2VuZXJpYzsKKyAgdW5zaWduZWQgY2hhciAqbmF0aXZlLCAqbmF0cHRyOworICBzaXplX3QgZWFjaF9zaXplOworCisgIHVuc2lnbmVkIGludCBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OworICBzaXplX3QgbmF0c2l6ZTsKKworICBpZiAoY291bnQgPT0gMCB8fCBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKKyAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OworICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKKyAgaWYgKCFuYXRpdmUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKKworICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQorICAgIHsKKyAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOworCSAgIGNvdW50ICE9IDA7CisJICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQorCU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiluYXRwdHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOworCSAgIGNvdW50ICE9IDA7CisJICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQorCU1ZX3N3YXBfc3RkX3JlbG9jX291dChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiluYXRwdHIpOworICAgIH0KKworICBpZiAoIGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKSB7CisgICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLworbG9uZworTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOworICB1bnNpZ25lZCBpbnQgY291bnQ7CisKKyAgaWYgKHNlY3Rpb24gPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCisgICAgeworICAgICAgKnJlbHB0ciA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCEodGJscHRyIHx8IE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKKyAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCArKykgeworICAgICAgKnJlbHB0ciArKyA9ICZjaGFpbi0+cmVsZW50OworICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQorICAgICAgeworCSpyZWxwdHIrKyA9IHRibHB0cisrOworICAgICAgfQorICB9CisgICpyZWxwdHIgPSAwOworCisgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKK30KKworbG9uZworTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgKGFiZmQsIGFzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7Cit7CisgIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpIHsKKyAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqIChhc2VjdC0+cmVsb2NfY291bnQrMSkpOworICB9CisKKyAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKKyAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKQorCSAgICAqICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKQorCSAgICAgICArIDEpKTsKKworICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKQorICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopCisJICAgICogKChleGVjX2hkcihhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCisJICAgICAgICsgMSkpOworCisgIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKKyAgICByZXR1cm4gc2l6ZW9mIChhcmVsZW50ICopOworCisgIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKKyAgICByZXR1cm4gMDsKKworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICByZXR1cm4gLTE7Cit9CisKKwwKK2xvbmcKK05BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoIU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKGFiZmQpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKzEpICogKHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSAqKSk7Cit9CisKKy8qQVJHU1VTRUQqLworIGFsZW50ICoKK05BTUUoYW91dCxnZXRfbGluZW5vKSAoaWdub3JlX2FiZmQsIGlnbm9yZV9zeW1ib2wpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzeW1ib2wgKmlnbm9yZV9zeW1ib2w7Cit7CityZXR1cm4gKGFsZW50ICopTlVMTDsKK30KKworLypBUkdTVVNFRCovCit2b2lkCitOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIHN5bWJvbF9pbmZvICpyZXQ7Cit7CisgIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOworCisgIGlmIChyZXQtPnR5cGUgPT0gJz8nKQorICAgIHsKKyAgICAgIGludCB0eXBlX2NvZGUgPSBhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlICYgMHhmZjsKKyAgICAgIGNvbnN0IGNoYXIgKnN0YWJfbmFtZSA9IGJmZF9nZXRfc3RhYl9uYW1lICh0eXBlX2NvZGUpOworICAgICAgc3RhdGljIGNoYXIgYnVmWzEwXTsKKworICAgICAgaWYgKHN0YWJfbmFtZSA9PSBOVUxMKQorCXsKKwkgIHNwcmludGYoYnVmLCAiKCVkKSIsIHR5cGVfY29kZSk7CisJICBzdGFiX25hbWUgPSBidWY7CisJfQorICAgICAgcmV0LT50eXBlID0gJy0nOworICAgICAgcmV0LT5zdGFiX3R5cGUgPSB0eXBlX2NvZGU7CisgICAgICByZXQtPnN0YWJfb3RoZXIgPSAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPm90aGVyICYgMHhmZik7CisgICAgICByZXQtPnN0YWJfZGVzYyA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZik7CisgICAgICByZXQtPnN0YWJfbmFtZSA9IHN0YWJfbmFtZTsKKyAgICB9Cit9CisKKy8qQVJHU1VTRUQqLwordm9pZAorTkFNRShhb3V0LHByaW50X3N5bWJvbCkgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIFBUUiBhZmlsZTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OworeworICBGSUxFICpmaWxlID0gKEZJTEUgKilhZmlsZTsKKworICBzd2l0Y2ggKGhvdykgeworICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKKyAgICBpZiAoc3ltYm9sLT5uYW1lKQorICAgICAgZnByaW50ZihmaWxlLCIlcyIsIHN5bWJvbC0+bmFtZSk7CisgICAgYnJlYWs7CisgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgorICAgIGZwcmludGYoZmlsZSwiJTR4ICUyeCAlMngiLCh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiksCisJICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKSwKKwkgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT50eXBlKSk7CisgICAgYnJlYWs7CisgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6CisgICAgeworICAgQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOworCisKKyAgICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7CisKKyAgICAgIGZwcmludGYoZmlsZSwiICUtNXMgJTA0eCAlMDJ4ICUwMngiLAorCSAgICAgIHNlY3Rpb25fbmFtZSwKKwkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPmRlc2MgJiAweGZmZmYpLAorCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKSwKKwkgICAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgICYgMHhmZikpOworICAgICAgaWYgKHN5bWJvbC0+bmFtZSkKKyAgICAgICAgZnByaW50ZihmaWxlLCIgJXMiLCBzeW1ib2wtPm5hbWUpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorfQorCisvKiBJZiB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiAxTUIgdG8gaG9sZCB0aGUgZ2VuZXJpYworICAgc3ltYm9scywgd2UgdXNlIHRoZSBnZW5lcmljIG1pbmlzeW1ib2wgbWV0aG9yZDogaXQncyBmYXN0ZXIsIHNpbmNlCisgICBpdCBvbmx5IHRyYW5zbGF0ZXMgdGhlIHN5bWJvbHMgb25jZSwgbm90IG11bHRpcGxlIHRpbWVzLiAgKi8KKyNkZWZpbmUgTUlOSVNZTV9USFJFU0hPTEQgKDEwMDAwMDAgLyBzaXplb2YgKGFzeW1ib2wpKQorCisvKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKKyAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCisgICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KKworbG9uZworTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZHluYW1pYzsKKyAgICAgUFRSICptaW5pc3ltc3A7CisgICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Cit7CisgIGlmIChkeW5hbWljKQorICAgIHsKKyAgICAgIC8qIFdlIGNvdWxkIGhhbmRsZSB0aGUgZHluYW1pYyBzeW1ib2xzIGhlcmUgYXMgd2VsbCwgYnV0IGl0J3MKKyAgICAgICAgIGVhc2llciB0byBoYW5kIHRoZW0gb2ZmLiAgKi8KKyAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7CisgICAgfQorCisgIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQorICAgIHJldHVybiAtMTsKKworICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA8IE1JTklTWU1fVEhSRVNIT0xEKQorICAgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7CisKKyAgKm1pbmlzeW1zcCA9IChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOworCisgIC8qIEJ5IHBhc3NpbmcgdGhlIGV4dGVybmFsIHN5bWJvbHMgYmFjayBmcm9tIHRoaXMgcm91dGluZSwgd2UgYXJlCisgICAgIGdpdmluZyB1cCBjb250cm9sIG92ZXIgdGhlIG1lbW9yeSBibG9jay4gIENsZWFyCisgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMsIHNvIHRoYXQgd2UgZG8gbm90IHRyeSB0byBmcmVlIGl0CisgICAgIG91cnNlbHZlcy4gICovCisgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKKworICAqc2l6ZXAgPSBFWFRFUk5BTF9OTElTVF9TSVpFOworICByZXR1cm4gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKK30KKworLyogQ29udmVydCBhIG1pbmlzeW1ib2wgdG8gYSBCRkQgYXN5bWJvbC4gIEEgbWluaXN5bWJvbCBpcyBqdXN0IGFuCisgICB1bm1vZGlmaWVkIGEub3V0IHN5bWJvbC4gIFRoZSBTWU0gYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmUgcmV0dXJuZWQKKyAgIGJ5IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2ggd2UgZmlsbCBpbiBoZXJlLiAgKi8KKworYXN5bWJvbCAqCitOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBkeW5hbWljOworICAgICBjb25zdCBQVFIgbWluaXN5bTsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBpZiAoZHluYW1pYworICAgICAgfHwgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA8IE1JTklTWU1fVEhSRVNIT0xEKQorICAgIHJldHVybiBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7CisKKyAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpOworCisgIC8qIFdlIGNhbGwgdHJhbnNsYXRlX3N5bWJvbF90YWJsZSB0byB0cmFuc2xhdGUgYSBzaW5nbGUgc3ltYm9sLiAgKi8KKyAgaWYgKCEgKE5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKQorCSAoYWJmZCwKKwkgIChhb3V0X3N5bWJvbF90eXBlICopIHN5bSwKKwkgIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgbWluaXN5bSwKKwkgIChiZmRfc2l6ZV90eXBlKSAxLAorCSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCksCisJICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCksCisJICBmYWxzZSkpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBzeW07Cit9CisKKy8qCisgcHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZQorIGFuZCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZSBuZWFyZXN0IHRvIHRoZQorIHdhbnRlZCBsb2NhdGlvbi4KKyovCisKK2Jvb2xlYW4KK05BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkKKyAgICAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKK3sKKyAgLyogUnVuIGRvd24gdGhlIGZpbGUgbG9va2luZyBmb3IgdGhlIGZpbGVuYW1lLCBmdW5jdGlvbiBhbmQgbGluZW51bWJlciAqLworICBhc3ltYm9sICoqcDsKKyAgQ09OU1QgY2hhciAqZGlyZWN0b3J5X25hbWUgPSBOVUxMOworICBDT05TVCBjaGFyICptYWluX2ZpbGVfbmFtZSA9IE5VTEw7CisgIENPTlNUIGNoYXIgKmN1cnJlbnRfZmlsZV9uYW1lID0gTlVMTDsKKyAgQ09OU1QgY2hhciAqbGluZV9maWxlX25hbWUgPSBOVUxMOyAvKiBWYWx1ZSBvZiBjdXJyZW50X2ZpbGVfbmFtZSBhdCBsaW5lIG51bWJlci4gKi8KKyAgQ09OU1QgY2hhciAqbGluZV9kaXJlY3RvcnlfbmFtZSA9IE5VTEw7IC8qIFZhbHVlIG9mIGRpcmVjdG9yeV9uYW1lIGF0IGxpbmUgbnVtYmVyLiAqLworICBiZmRfdm1hIGxvd19saW5lX3ZtYSA9IDA7CisgIGJmZF92bWEgbG93X2Z1bmNfdm1hID0gMDsKKyAgYXN5bWJvbCAqZnVuYyA9IDA7CisgIHNpemVfdCBmaWxlbGVuLCBmdW5jbGVuOworICBjaGFyICpidWY7CisKKyAgKmZpbGVuYW1lX3B0ciA9IGFiZmQtPmZpbGVuYW1lOworICAqZnVuY3Rpb25uYW1lX3B0ciA9IDA7CisgICpsaW5lX3B0ciA9IDA7CisgIGlmIChzeW1ib2xzICE9IChhc3ltYm9sICoqKU5VTEwpIHsKKyAgICBmb3IgKHAgPSBzeW1ib2xzOyAqcDsgcCsrKSB7CisgICAgICBhb3V0X3N5bWJvbF90eXBlICAqcSA9IChhb3V0X3N5bWJvbF90eXBlICopKCpwKTsKKyAgICBuZXh0OgorICAgICAgc3dpdGNoIChxLT50eXBlKXsKKyAgICAgIGNhc2UgTl9URVhUOgorCS8qIElmIHRoaXMgbG9va3MgbGlrZSBhIGZpbGUgbmFtZSBzeW1ib2wsIGFuZCBpdCBjb21lcyBhZnRlcgorICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2UgaGF2ZSBmb3VuZCBzbyBmYXIsIGJ1dCBiZWZvcmUgdGhlCisgICAgICAgICAgIG9mZnNldCwgdGhlbiB3ZSBoYXZlIHByb2JhYmx5IG5vdCBmb3VuZCB0aGUgcmlnaHQgbGluZQorICAgICAgICAgICBudW1iZXIuICAqLworCWlmIChxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0CisJICAgICYmICgocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hCisJCSAmJiAobGluZV9maWxlX25hbWUgIT0gTlVMTAorCQkgICAgIHx8ICpsaW5lX3B0ciAhPSAwKSkKKwkJfHwgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYQorCQkgICAgJiYgZnVuYyAhPSBOVUxMKSkpCisJICB7CisJICAgIGNvbnN0IGNoYXIgKnN5bW5hbWU7CisKKwkgICAgc3ltbmFtZSA9IHEtPnN5bWJvbC5uYW1lOworCSAgICBpZiAoc3RyY21wIChzeW1uYW1lICsgc3RybGVuIChzeW1uYW1lKSAtIDIsICIubyIpID09IDApCisJICAgICAgeworCQlpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hKQorCQkgIHsKKwkJICAgICpsaW5lX3B0ciA9IDA7CisJCSAgICBsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7CisJCSAgfQorCQlpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hKQorCQkgIGZ1bmMgPSBOVUxMOworCSAgICAgIH0KKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBOX1NPOgorCS8qIElmIHRoaXMgc3ltYm9sIGlzIGxlc3MgdGhhbiB0aGUgb2Zmc2V0LCBidXQgZ3JlYXRlciB0aGFuCisgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3ZSBoYXZlIGZvdW5kIHNvIGZhciwgdGhlbiB3ZSBoYXZlIG5vdAorICAgICAgICAgICBmb3VuZCB0aGUgcmlnaHQgbGluZSBudW1iZXIuICAqLworCWlmIChxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQorCSAgeworCSAgICBpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2xpbmVfdm1hKQorCSAgICAgIHsKKwkJKmxpbmVfcHRyID0gMDsKKwkJbGluZV9maWxlX25hbWUgPSBOVUxMOworCSAgICAgIH0KKwkgICAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IGxvd19mdW5jX3ZtYSkKKwkgICAgICBmdW5jID0gTlVMTDsKKwkgIH0KKworCW1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKKwkvKiBMb29rIGFoZWFkIHRvIG5leHQgc3ltYm9sIHRvIGNoZWNrIGlmIHRoYXQgdG9vIGlzIGFuIE5fU08uICovCisJcCsrOworCWlmICgqcCA9PSBOVUxMKQorCSAgYnJlYWs7CisJcSA9IChhb3V0X3N5bWJvbF90eXBlICopKCpwKTsKKwlpZiAocS0+dHlwZSAhPSAoaW50KU5fU08pCisJICBnb3RvIG5leHQ7CisKKwkvKiBGb3VuZCBhIHNlY29uZCBOX1NPICBGaXJzdCBpcyBkaXJlY3Rvcnk7IHNlY29uZCBpcyBmaWxlbmFtZS4gKi8KKwlkaXJlY3RvcnlfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOworCW1haW5fZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKKwlpZiAob2JqX3RleHRzZWMoYWJmZCkgIT0gc2VjdGlvbikKKwkgIGdvdG8gZG9uZTsKKwlicmVhazsKKyAgICAgIGNhc2UgTl9TT0w6CisJY3VycmVudF9maWxlX25hbWUgPSBxLT5zeW1ib2wubmFtZTsKKwlicmVhazsKKworICAgICAgY2FzZSBOX1NMSU5FOgorCisgICAgICBjYXNlIE5fRFNMSU5FOgorICAgICAgY2FzZSBOX0JTTElORToKKwkvKiBXZSdsbCBrZWVwIHRoaXMgaWYgaXQgcmVzb2x2ZXMgbmVhcmVyIHRoYW4gdGhlIG9uZSB3ZSBoYXZlCisgICAgICAgICAgIGFscmVhZHkuICAqLworCWlmIChxLT5zeW1ib2wudmFsdWUgPj0gbG93X2xpbmVfdm1hCisJICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCisJICB7CisJICAgICpsaW5lX3B0ciA9IHEtPmRlc2M7CisJICAgIGxvd19saW5lX3ZtYSA9IHEtPnN5bWJvbC52YWx1ZTsKKwkgICAgbGluZV9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZTsKKwkgICAgbGluZV9kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOworCSAgfQorCWJyZWFrOworICAgICAgY2FzZSBOX0ZVTjoKKwl7CisJICAvKiBXZSdsbCBrZWVwIHRoaXMgaWYgaXQgaXMgbmVhcmVyIHRoYW4gdGhlIG9uZSB3ZSBoYXZlIGFscmVhZHkgKi8KKwkgIGlmIChxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmNfdm1hICYmCisJICAgICAgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkgeworCSAgICBsb3dfZnVuY192bWEgPSBxLT5zeW1ib2wudmFsdWU7CisJICAgIGZ1bmMgPSAoYXN5bWJvbCAqKXE7CisJICB9CisJICBlbHNlIGlmIChxLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCisJICAgIGdvdG8gZG9uZTsKKwl9CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyBkb25lOgorICBpZiAoKmxpbmVfcHRyICE9IDApCisgICAgeworICAgICAgbWFpbl9maWxlX25hbWUgPSBsaW5lX2ZpbGVfbmFtZTsKKyAgICAgIGRpcmVjdG9yeV9uYW1lID0gbGluZV9kaXJlY3RvcnlfbmFtZTsKKyAgICB9CisKKyAgaWYgKG1haW5fZmlsZV9uYW1lID09IE5VTEwKKyAgICAgIHx8IG1haW5fZmlsZV9uYW1lWzBdID09ICcvJworICAgICAgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKKyAgICBmaWxlbGVuID0gMDsKKyAgZWxzZQorICAgIGZpbGVsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKSArIHN0cmxlbiAobWFpbl9maWxlX25hbWUpOworICBpZiAoZnVuYyA9PSBOVUxMKQorICAgIGZ1bmNsZW4gPSAwOworICBlbHNlCisgICAgZnVuY2xlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoZnVuYykpOworCisgIGlmIChhZGF0YSAoYWJmZCkubGluZV9idWYgIT0gTlVMTCkKKyAgICBmcmVlIChhZGF0YSAoYWJmZCkubGluZV9idWYpOworICBpZiAoZmlsZWxlbiArIGZ1bmNsZW4gPT0gMCkKKyAgICBhZGF0YSAoYWJmZCkubGluZV9idWYgPSBidWYgPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoZmlsZWxlbiArIGZ1bmNsZW4gKyAzKTsKKyAgICAgIGFkYXRhIChhYmZkKS5saW5lX2J1ZiA9IGJ1ZjsKKyAgICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChtYWluX2ZpbGVfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChtYWluX2ZpbGVfbmFtZVswXSA9PSAnLycgfHwgZGlyZWN0b3J5X25hbWUgPT0gTlVMTCkKKwkqZmlsZW5hbWVfcHRyID0gbWFpbl9maWxlX25hbWU7CisgICAgICBlbHNlCisJeworCSAgc3ByaW50ZiAoYnVmLCAiJXMlcyIsIGRpcmVjdG9yeV9uYW1lLCBtYWluX2ZpbGVfbmFtZSk7CisJICAqZmlsZW5hbWVfcHRyID0gYnVmOworCSAgYnVmICs9IGZpbGVsZW4gKyAxOworCX0KKyAgICB9CisKKyAgaWYgKGZ1bmMpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb24gPSBmdW5jLT5uYW1lOworICAgICAgY2hhciAqcDsKKworICAgICAgLyogVGhlIGNhbGxlciBleHBlY3RzIGEgc3ltYm9sIG5hbWUuICBXZSBhY3R1YWxseSBoYXZlIGEKKwkgZnVuY3Rpb24gbmFtZSwgd2l0aG91dCB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLiAgUHV0IHRoZQorCSB1bmRlcnNjb3JlIGJhY2sgaW4sIHNvIHRoYXQgdGhlIGNhbGxlciBnZXRzIGEgc3ltYm9sIG5hbWUuICAqLworICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gJ1wwJykKKwlzdHJjcHkgKGJ1ZiwgZnVuY3Rpb24pOworICAgICAgZWxzZQorCXsKKwkgIGJ1ZlswXSA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7CisJICBzdHJjcHkgKGJ1ZiArIDEsIGZ1bmN0aW9uKTsKKwl9CisgICAgICAvKiBIYXZlIHRvIHJlbW92ZSA6IHN0dWZmICovCisgICAgICBwID0gc3RyY2hyIChidWYsICc6Jyk7CisgICAgICBpZiAocCAhPSBOVUxMKQorCSpwID0gJ1wwJzsKKyAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gYnVmOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLypBUkdTVVNFRCovCitpbnQKK05BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgKGFiZmQsIGV4ZWNhYmxlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlY2FibGU7Cit7CisgIHJldHVybiBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Cit9CisKKy8qIEZyZWUgYWxsIGluZm9ybWF0aW9uIHdlIGhhdmUgY2FjaGVkIGZvciB0aGlzIEJGRC4gIFdlIGNhbiBhbHdheXMKKyAgIHJlYWQgaXQgYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdC4gICovCisKK2Jvb2xlYW4KK05BTUUoYW91dCxiZmRfZnJlZV9jYWNoZWRfaW5mbykgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKm87CisKKyAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQorICAgIHJldHVybiB0cnVlOworCisjZGVmaW5lIEJGQ0lfRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQorICBCRkNJX0ZSRUUgKG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpKTsKKyNpZmRlZiBVU0VfTU1BUAorICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IDA7CisgIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKKyAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOworICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IDA7CisjZWxzZQorICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpKTsKKyAgQkZDSV9GUkVFIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSk7CisjZW5kaWYKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIEJGQ0lfRlJFRSAoby0+cmVsb2NhdGlvbik7CisjdW5kZWYgQkZDSV9GUkVFCisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBhLm91dCBsaW5rIGNvZGUuICAqLworCitzdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7CitzdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfYWRkX3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK05BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKKwkJCQkgdGFibGUsIHN0cmluZykpOworICBpZiAocmV0KQorICAgIHsKKyAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLworICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7CisgICAgICByZXQtPmluZHggPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBJbml0aWFsaXplIGFuIGEub3V0IGxpbmsgaGFzaCB0YWJsZS4gICovCisKK2Jvb2xlYW4KK05BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQorICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCQkJY29uc3QgY2hhciAqKSk7Cit7CisgIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOworfQorCisvKiBDcmVhdGUgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqcmV0OworCisgIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKHJldCwgYWJmZCwKKwkJCQkJIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpKQorICAgIHsKKyAgICAgIGZyZWUgKHJldCk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorICByZXR1cm4gJnJldC0+cm9vdDsKK30KKworLyogR2l2ZW4gYW4gYS5vdXQgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKKyAgIGFwcHJvcHJpYXRlLiAgKi8KKworYm9vbGVhbgorTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfb2JqZWN0OgorICAgICAgcmV0dXJuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOworICAgIGNhc2UgYmZkX2FyY2hpdmU6CisgICAgICByZXR1cm4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworCShhYmZkLCBpbmZvLCBhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTsKKyAgICBkZWZhdWx0OgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKiBBZGQgc3ltYm9scyBmcm9tIGFuIGEub3V0IG9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2FvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQorICAgIHsKKyAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBDaGVjayBhIHNpbmdsZSBhcmNoaXZlIGVsZW1lbnQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbgorICAgdGhlIGxpbmsuICAqUE5FRURFRCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzCisgICBuZWVkZWQgaW4gdGhlIGxpbmsgb3Igbm90LiAgVGhpcyBpcyBjYWxsZWQgZnJvbQorICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCisKK3N0YXRpYyBib29sZWFuCithb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBib29sZWFuICpwbmVlZGVkOworeworICBpZiAoISBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKnBuZWVkZWQpCisgICAgeworICAgICAgaWYgKCEgYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCisgICAgeworICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRnJlZSB1cCB0aGUgaW50ZXJuYWwgc3ltYm9scyByZWFkIGZyb20gYW4gYS5vdXQgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCithb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCisgICAgeworI2lmZGVmIFVTRV9NTUFQCisgICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7CisjZWxzZQorICAgICAgZnJlZSAoKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOworI2VuZGlmCisgICAgICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTDsKKyAgICB9CisgIGlmIChvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSAhPSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyNpZmRlZiBVU0VfTU1BUAorICAgICAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkpOworI2Vsc2UKKyAgICAgIGZyZWUgKChQVFIpIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKKyNlbmRpZgorICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPSAoY2hhciAqKSBOVUxMOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIExvb2sgdGhyb3VnaCB0aGUgaW50ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBvYmplY3QgZmlsZSBzaG91bGQKKyAgIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBvYmplY3QgZmlsZSBpZiBpdAorICAgZGVmaW5lcyBhbnkgc3ltYm9scyB3aGljaCBhcmUgY3VycmVudGx5IHVuZGVmaW5lZC4gIElmIHRoaXMgb2JqZWN0CisgICBmaWxlIGRlZmluZXMgYSBjb21tb24gc3ltYm9sLCB0aGVuIHdlIG1heSBhZGp1c3QgdGhlIHNpemUgb2YgdGhlCisgICBrbm93biBzeW1ib2wgYnV0IHdlIGRvIG5vdCBpbmNsdWRlIHRoZSBvYmplY3QgZmlsZSBpbiB0aGUgbGluaworICAgKHVubGVzcyB0aGVyZSBpcyBzb21lIG90aGVyIHJlYXNvbiB0byBpbmNsdWRlIGl0KS4gICovCisKK3N0YXRpYyBib29sZWFuCithb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYm9vbGVhbiAqcG5lZWRlZDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOworICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7CisgIGNoYXIgKnN0cmluZ3M7CisKKyAgKnBuZWVkZWQgPSBmYWxzZTsKKworICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzLiAgKi8KKyAgcCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOworICBwZW5kID0gcCArIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7CisgIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKTsKKyAgZm9yICg7IHAgPCBwZW5kOyBwKyspCisgICAgeworICAgICAgaW50IHR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgcC0+ZV90eXBlKTsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgLyogSWdub3JlIHN5bWJvbHMgdGhhdCBhcmUgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoaXMgaXMgYW4KKwkgb3B0aW1pemF0aW9uIG9ubHksIGFzIHdlIGNoZWNrIHRoZSB0eXBlIG1vcmUgdGhvcm91Z2hseQorCSBiZWxvdy4gICovCisgICAgICBpZiAoKCh0eXBlICYgTl9FWFQpID09IDAKKwkgICB8fCAodHlwZSAmIE5fU1RBQikgIT0gMAorCSAgIHx8IHR5cGUgPT0gTl9GTikKKwkgICYmIHR5cGUgIT0gTl9XRUFLQQorCSAgJiYgdHlwZSAhPSBOX1dFQUtUCisJICAmJiB0eXBlICE9IE5fV0VBS0QKKwkgICYmIHR5cGUgIT0gTl9XRUFLQikKKwl7CisJICBpZiAodHlwZSA9PSBOX1dBUk5JTkcKKwkgICAgICB8fCB0eXBlID09IE5fSU5EUikKKwkgICAgKytwOworCSAgY29udGludWU7CisJfQorCisgICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOworICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCisgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5CisJIHVuZGVmaW5lZCBvciBjb21tb24uICAqLworICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCisJeworCSAgaWYgKHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSkKKwkgICAgKytwOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAodHlwZSA9PSAoTl9URVhUIHwgTl9FWFQpCisJICB8fCB0eXBlID09IChOX0RBVEEgfCBOX0VYVCkKKwkgIHx8IHR5cGUgPT0gKE5fQlNTIHwgTl9FWFQpCisJICB8fCB0eXBlID09IChOX0FCUyB8IE5fRVhUKQorCSAgfHwgdHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpKQorCXsKKwkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbC4gIFdlIG11c3QgbGluayBpdAorCSAgICAgaW4uICBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjdXJyZW50CisJICAgICBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGNvbW1vbi4gIElmIHRoZQorCSAgICAgY3VycmVudCBkZWZpbml0aW9uIGlzIGNvbW1vbiwgd2UgaGF2ZSBhIGNhc2UgaW4gd2hpY2ggd2UKKwkgICAgIGhhdmUgYWxyZWFkeSBzZWVuIGFuIG9iamVjdCBmaWxlIGluY2x1ZGluZworCSAgICAgICAgIGludCBhOworCSAgICAgYW5kIHRoaXMgb2JqZWN0IGZpbGUgZnJvbSB0aGUgYXJjaGl2ZSBpbmNsdWRlcworCSAgICAgICAgIGludCBhID0gNTsKKwkgICAgIEluIHN1Y2ggYSBjYXNlIHdlIG11c3QgaW5jbHVkZSB0aGlzIG9iamVjdCBmaWxlLgorCisJICAgICBGSVhNRTogVGhlIFN1bk9TIDQuMS4zIGxpbmtlciB3aWxsIHB1bGwgaW4gdGhlIGFyY2hpdmUKKwkgICAgIGVsZW1lbnQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSAuZGF0YSBzZWN0aW9uLAorCSAgICAgYnV0IG5vdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhhdAorCSAgICAgc2VlbXMgYSBiaXQgY3JhenkgdG8gbWUsIGFuZCBJIGhhdmVuJ3QgaW1wbGVtZW50ZWQgaXQuCisJICAgICBIb3dldmVyLCBpdCBtaWdodCBiZSBjb3JyZWN0LiAgKi8KKwkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgICpwbmVlZGVkID0gdHJ1ZTsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgaWYgKHR5cGUgPT0gKE5fVU5ERiB8IE5fRVhUKSkKKwl7CisJICBiZmRfdm1hIHZhbHVlOworCisJICB2YWx1ZSA9IEdFVF9XT1JEIChhYmZkLCBwLT5lX3ZhbHVlKTsKKwkgIGlmICh2YWx1ZSAhPSAwKQorCSAgICB7CisJICAgICAgLyogVGhpcyBzeW1ib2wgaXMgY29tbW9uIGluIHRoZSBvYmplY3QgZnJvbSB0aGUgYXJjaGl2ZQorCQkgZmlsZS4gICovCisJICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJCXsKKwkJICBiZmQgKnN5bWJmZDsKKwkJICB1bnNpZ25lZCBpbnQgcG93ZXI7CisKKwkJICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7CisJCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCisJCSAgICB7CisJCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tCisJCQkgb3V0c2lkZSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluaworCQkJIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgZG9uZSBmb3IgdGhlIC11CisJCQkgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLworCQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sCisJCQkJCQkJCSAgICAgYWJmZCwKKwkJCQkJCQkJICAgICBuYW1lKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgKnBuZWVkZWQgPSB0cnVlOworCQkgICAgICByZXR1cm4gdHJ1ZTsKKwkJICAgIH0KKwkJICAvKiBUdXJuIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGludG8gYSBjb21tb24KKwkJICAgICBzeW1ib2wuICBJdCBpcyBhbHJlYWR5IG9uIHRoZSB1bmRlZnMgbGlzdC4gICovCisJCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOworCQkgIGgtPnUuYy5wID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKKwkJCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCisJCQkJICBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKKwkJICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKworCQkgIGgtPnUuYy5zaXplID0gdmFsdWU7CisKKwkJICAvKiBGSVhNRTogVGhpcyBpc24ndCBxdWl0ZSByaWdodC4gIFRoZSBtYXhpbXVtCisJCSAgICAgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCBzaG91bGQgYmUgc2V0IGJ5IHRoZQorCQkgICAgIGFyY2hpdGVjdHVyZSBvZiB0aGUgb3V0cHV0IGZpbGUsIG5vdCBvZiB0aGUgaW5wdXQKKwkJICAgICBmaWxlLiAgKi8KKwkJICBwb3dlciA9IGJmZF9sb2cyICh2YWx1ZSk7CisJCSAgaWYgKHBvd2VyID4gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyKQorCQkgICAgcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7CisJCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOworCisJCSAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKKwkJCQkJCQkJIkNPTU1PTiIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmCisJCSAgICAgbmVjZXNzYXJ5LiAgKi8KKwkJICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKKwkJICAgIGgtPnUuYy5zaXplID0gdmFsdWU7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKHR5cGUgPT0gTl9XRUFLQQorCSAgfHwgdHlwZSA9PSBOX1dFQUtUCisJICB8fCB0eXBlID09IE5fV0VBS0QKKwkgIHx8IHR5cGUgPT0gTl9XRUFLQikKKwl7CisJICAvKiBUaGlzIHN5bWJvbCBpcyB3ZWFrIGJ1dCBkZWZpbmVkLiAgV2UgbXVzdCBwdWxsIGl0IGluIGlmCisJICAgICB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyB1bmRlZmluZWQsIGJ1dCB3ZSBkb24ndCB3YW50CisJICAgICBpdCBpZiB0aGUgY3VycmVudCBsaW5rIHN5bWJvbCBpcyBjb21tb24uICAqLworCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJICAgIHsKKwkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgKnBuZWVkZWQgPSB0cnVlOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhbGwgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2FvdXRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCisJCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCisJCQkJICAgICBib29sZWFuLAorCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKKyAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOworICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKKyAgY2hhciAqc3RyaW5nczsKKyAgYm9vbGVhbiBjb3B5OworICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKKyAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpwOworICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnBlbmQ7CisKKyAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpOworICBzeW1fY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOworICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCk7CisgIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKKyAgICBjb3B5ID0gZmFsc2U7CisgIGVsc2UKKyAgICBjb3B5ID0gdHJ1ZTsKKworICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgKCgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfZHluYW1pY19zeW1ib2xzKQorCSAgICAgKGFiZmQsIGluZm8sICZzeW1zLCAmc3ltX2NvdW50LCAmc3RyaW5ncykpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCisgICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gIFdlIGNvdWxkIGp1c3QgbG9vayB0aGVtIHVwIGluIHRoZSBoYXNoCisgICAgIHRhYmxlLCBidXQga2VlcGluZyB0aGUgbGlzdCBpcyBtb3JlIGVmZmljaWVudC4gIFBlcmhhcHMgdGhpcworICAgICBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gaW5mby0+a2VlcF9tZW1vcnkuICAqLworICBzeW1faGFzaCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqKQorCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCSAoKHNpemVfdCkgc3ltX2NvdW50CisJCQkgICogc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpKSk7CisgIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bV9jb3VudCAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKKworICBhZGRfb25lX3N5bWJvbCA9IGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+YWRkX29uZV9zeW1ib2w7CisgIGlmIChhZGRfb25lX3N5bWJvbCA9PSBOVUxMKQorICAgIGFkZF9vbmVfc3ltYm9sID0gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w7CisKKyAgcCA9IHN5bXM7CisgIHBlbmQgPSBwICsgc3ltX2NvdW50OworICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgc3ltX2hhc2grKykKKyAgICB7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBiZmRfdm1hIHZhbHVlOworICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgICBmbGFnd29yZCBmbGFnczsKKyAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKworICAgICAgKnN5bV9oYXNoID0gTlVMTDsKKworICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBwLT5lX3R5cGUpOworCisgICAgICAvKiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMuICAqLworICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQorCWNvbnRpbnVlOworCisgICAgICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOworICAgICAgdmFsdWUgPSBHRVRfV09SRCAoYWJmZCwgcC0+ZV92YWx1ZSk7CisgICAgICBmbGFncyA9IEJTRl9HTE9CQUw7CisgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisKKwljYXNlIE5fVU5ERjoKKwljYXNlIE5fQUJTOgorCWNhc2UgTl9URVhUOgorCWNhc2UgTl9EQVRBOgorCWNhc2UgTl9CU1M6CisJY2FzZSBOX0ZOX1NFUToKKwljYXNlIE5fQ09NTToKKwljYXNlIE5fU0VUVjoKKwljYXNlIE5fRk46CisJICAvKiBJZ25vcmUgc3ltYm9scyB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLiAgKi8KKwkgIGNvbnRpbnVlOworCWNhc2UgTl9JTkRSOgorCSAgLyogSWdub3JlIGxvY2FsIGluZGlyZWN0IHN5bWJvbC4gICovCisJICArK3A7CisJICArK3N5bV9oYXNoOworCSAgY29udGludWU7CisKKwljYXNlIE5fVU5ERiB8IE5fRVhUOgorCSAgaWYgKHZhbHVlID09IDApCisJICAgIHsKKwkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgICAgICBmbGFncyA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICBicmVhazsKKwljYXNlIE5fQUJTIHwgTl9FWFQ6CisJICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgIGJyZWFrOworCWNhc2UgTl9URVhUIHwgTl9FWFQ6CisJICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOworCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7CisJICBicmVhazsKKwljYXNlIE5fREFUQSB8IE5fRVhUOgorCWNhc2UgTl9TRVRWIHwgTl9FWFQ6CisJICAvKiBUcmVhdCBOX1NFVFYgc3ltYm9scyBhcyBOX0RBVEEgc3ltYm9sOyBzZWUgY29tbWVudCBpbgorCSAgICAgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncy4gICovCisJICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOworCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7CisJICBicmVhazsKKwljYXNlIE5fQlNTIHwgTl9FWFQ6CisJICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7CisJICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKKwkgIGJyZWFrOworCWNhc2UgTl9JTkRSIHwgTl9FWFQ6CisJICAvKiBBbiBpbmRpcmVjdCBzeW1ib2wuICBUaGUgbmV4dCBzeW1ib2wgaXMgdGhlIHN5bWJvbAorCSAgICAgd2hpY2ggdGhpcyBvbmUgcmVhbGx5IGlzLiAgKi8KKwkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7CisJICArK3A7CisJICBzdHJpbmcgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7CisJICBzZWN0aW9uID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKKwkgIGZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKKwkgIGJyZWFrOworCWNhc2UgTl9DT01NIHwgTl9FWFQ6CisJICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKwkgIGJyZWFrOworCWNhc2UgTl9TRVRBOiBjYXNlIE5fU0VUQSB8IE5fRVhUOgorCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7CisJICBicmVhazsKKwljYXNlIE5fU0VUVDogY2FzZSBOX1NFVFQgfCBOX0VYVDoKKwkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7CisJICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7CisJICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKKwkgIGJyZWFrOworCWNhc2UgTl9TRVREOiBjYXNlIE5fU0VURCB8IE5fRVhUOgorCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKKwkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKKwkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOworCSAgYnJlYWs7CisJY2FzZSBOX1NFVEI6IGNhc2UgTl9TRVRCIHwgTl9FWFQ6CisJICBzZWN0aW9uID0gb2JqX2Jzc3NlYyAoYWJmZCk7CisJICBmbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7CisJICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKKwkgIGJyZWFrOworCWNhc2UgTl9XQVJOSU5HOgorCSAgLyogQSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgb25lIHRvIHdhcm4KKwkgICAgIGFib3V0LiAgKi8KKwkgIEJGRF9BU1NFUlQgKHAgKyAxIDwgcGVuZCk7CisJICArK3A7CisJICBzdHJpbmcgPSBuYW1lOworCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKKwkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCSAgZmxhZ3MgfD0gQlNGX1dBUk5JTkc7CisJICBicmVhazsKKwljYXNlIE5fV0VBS1U6CisJICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgIGZsYWdzID0gQlNGX1dFQUs7CisJICBicmVhazsKKwljYXNlIE5fV0VBS0E6CisJICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgIGZsYWdzID0gQlNGX1dFQUs7CisJICBicmVhazsKKwljYXNlIE5fV0VBS1Q6CisJICBzZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOworCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7CisJICBmbGFncyA9IEJTRl9XRUFLOworCSAgYnJlYWs7CisJY2FzZSBOX1dFQUtEOgorCSAgc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKKwkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOworCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKKwkgIGJyZWFrOworCWNhc2UgTl9XRUFLQjoKKwkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKKwkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOworCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKCEgKCgqYWRkX29uZV9zeW1ib2wpCisJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNvcHksIGZhbHNlLAorCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFJlc3RyaWN0IHRoZSBtYXhpbXVtIGFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wgYmFzZWQgb24KKwkgdGhlIGFyY2hpdGVjdHVyZSwgc2luY2UgYS5vdXQgaGFzIG5vIHdheSB0byByZXByZXNlbnQKKwkgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIHNlY3Rpb24gaW4gYSAubyBmaWxlLiAgRklYTUU6CisJIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQ6IGl0IHNob3VsZCB1c2UgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUKKwkgb3V0cHV0IGZpbGUsIG5vdCB0aGUgaW5wdXQgZmlsZXMuICAqLworICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KKwkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyID4KKwkgICAgICBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXIpKQorCSgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPQorCSAgYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5zZWN0aW9uX2FsaWduX3Bvd2VyOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgc2V0IHN5bWJvbCwgYW5kIHdlIGFyZSBub3QgYnVpbGRpbmcgc2V0cywgdGhlbgorCSBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGhhc2ggZW50cnkgdG8gbm90IGhhdmUgYmVlbiBzZXQuICBJbgorCSBzdWNoIGEgY2FzZSwgdHJlYXQgdGhlIHN5bWJvbCBhcyBub3QgZ2xvYmFsbHkgZGVmaW5lZC4gICovCisgICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKKwl7CisJICBCRkRfQVNTRVJUICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApOworCSAgKnN5bV9oYXNoID0gTlVMTDsKKwl9CisKKyAgICAgIGlmICh0eXBlID09IChOX0lORFIgfCBOX0VYVCkgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCisJKytzeW1faGFzaDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KKworc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZQoreworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKK307CisKKy8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgorICAgZmlsZS4gICovCisKK3N0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzCit7CisgIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OworICBiZmRfdm1hIHRvdGFsOworfTsKKworLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLworICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOworfTsKKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKKyAgKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKKyAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKKworLyogRHVyaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAgd2UgbmVlZCB0byBwYXNzIGFyb3VuZCBhIGJ1bmNoIG9mCisgICBpbmZvcm1hdGlvbiwgc28gd2UgZG8gaXQgaW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8KK3sKKyAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgIC8qIE91dHB1dCBiZmQuICAqLworICBiZmQgKm91dHB1dF9iZmQ7CisgIC8qIFJlbG9jIGZpbGUgcG9zaXRpb25zLiAgKi8KKyAgZmlsZV9wdHIgdHJlbG9mZiwgZHJlbG9mZjsKKyAgLyogRmlsZSBwb3NpdGlvbiBvZiBzeW1ib2xzLiAgKi8KKyAgZmlsZV9wdHIgc3ltb2ZmOworICAvKiBTdHJpbmcgdGFibGUuICAqLworICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7CisgIC8qIEhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLworICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOworICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLworICBQVFIgcmVsb2NzOworICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc3ltYm9sIG1hcCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KKyAgaW50ICpzeW1ib2xfbWFwOworICAvKiBBIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBvZiBhbnkgaW5wdXQgQkZELiAgKi8KKyAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRwdXRfc3ltczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfYmZkCisgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCkpOworc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3dyaXRlX3N5bWJvbHMKKyAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkKSk7CitzdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uCisgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKKwkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgZmlsZV9wdHIgKnJlbG9mZl9wdHIsCisJICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSkpOworc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkCisgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKKwkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqLAorCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOworc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0CisgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKmlucHV0X2JmZCwKKwkgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqLAorCSAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemUsIGJmZF9ieXRlICpjb250ZW50cykpOworc3RhdGljIElOTElORSBhc2VjdGlvbiAqYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyCisgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CisKKy8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK2FvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQorICAgIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAorCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX2VudHJ5ICopCisJIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPnRvdGFscyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKworLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gIFRoaXMgaXMgY2FsbGVkIG9uIHRoZSBvdXRwdXQgQkZELiAgVGhlCisgICBJTkZPIHN0cnVjdHVyZSBzaG91bGQgcG9pbnQgdG8gYSBsaXN0IG9mIEJGRHMgbGlua2VkIHRocm91Z2ggdGhlCisgICBsaW5rX25leHQgZmllbGQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBlYWNoIEJGRCB3aGljaCB0YWtlcyBwYXJ0CisgICBpbiB0aGUgb3V0cHV0LiAgQWxzbywgZWFjaCBzZWN0aW9uIGluIEFCRkQgc2hvdWxkIHBvaW50IHRvIGEgbGlzdAorICAgb2YgYmZkX2xpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCBsaXN0IGFsbCB0aGUgaW5wdXQgc2VjdGlvbnMgZm9yCisgICB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCitib29sZWFuCitOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIGNhbGxiYWNrKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICB2b2lkICgqY2FsbGJhY2spIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Cit7CisgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyBhb3V0X2luZm87CisgIGJvb2xlYW4gaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IGZhbHNlOworICByZWdpc3RlciBiZmQgKnN1YjsKKyAgYmZkX3NpemVfdHlwZSB0cnNpemUsIGRyc2l6ZTsKKyAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOworICBzaXplX3QgbWF4X3JlbG9jc19zaXplOworICBzaXplX3QgbWF4X3N5bV9jb3VudDsKKyAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7CisgIGZpbGVfcHRyIHRleHRfZW5kOworICByZWdpc3RlciBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7CisgIGFzZWN0aW9uICpvOworICBib29sZWFuIGhhdmVfbGlua19vcmRlcl9yZWxvY3M7CisKKyAgaWYgKGluZm8tPnNoYXJlZCkKKyAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOworCisgIGFvdXRfaW5mby5pbmZvID0gaW5mbzsKKyAgYW91dF9pbmZvLm91dHB1dF9iZmQgPSBhYmZkOworICBhb3V0X2luZm8uY29udGVudHMgPSBOVUxMOworICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKKyAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSBOVUxMOworICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSBOVUxMOworCisgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290LAorCQkJICAgICAgIGFvdXRfbGlua19pbmNsdWRlc19uZXdmdW5jLAorCQkJICAgICAgIDI1MSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSB0cnVlOworCisgIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3Qgc2VjdGlvbiBzaXplLiAgQWxzbywgaWYgZ2VuZXJhdGluZworICAgICByZWxvY2F0ZWFibGUgb3V0cHV0LCBjb3VudCB0aGUgcmVsb2NzLiAgKi8KKyAgdHJzaXplID0gMDsKKyAgZHJzaXplID0gMDsKKyAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOworICBtYXhfcmVsb2NzX3NpemUgPSAwOworICBtYXhfc3ltX2NvdW50ID0gMDsKKyAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCisgICAgeworICAgICAgc2l6ZV90IHN6OworCisgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCXsKKwkgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKHN1YikgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCisJICAgIHsKKwkgICAgICB0cnNpemUgKz0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOworCSAgICAgIGRyc2l6ZSArPSBleGVjX2hkciAoc3ViKS0+YV9kcnNpemU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEZJWE1FOiBXZSBuZWVkIHRvIGlkZW50aWZ5IHRoZSAudGV4dCBhbmQgLmRhdGEgc2VjdGlvbnMKKwkJIGFuZCBjYWxsIGdldF9yZWxvY191cHBlcl9ib3VuZCBhbmQgY2Fub25pY2FsaXplX3JlbG9jIHRvCisJCSB3b3JrIG91dCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBuZWVkZWQsIGFuZCB0aGVuIG11bHRpcGx5CisJCSBieSB0aGUgcmVsb2Mgc2l6ZS4gICovCisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCIlczogcmVsb2NhdGVhYmxlIGxpbmsgZnJvbSAlcyB0byAlcyBub3Qgc3VwcG9ydGVkIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkJIHN1Yi0+eHZlYy0+bmFtZSwgYWJmZC0+eHZlYy0+bmFtZSk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKKwl7CisJICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX3RleHRzZWMgKHN1YikpOworCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCisJICAgIG1heF9jb250ZW50c19zaXplID0gc3o7CisJICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKHN1Yiwgb2JqX2RhdGFzZWMgKHN1YikpOworCSAgaWYgKHN6ID4gbWF4X2NvbnRlbnRzX3NpemUpCisJICAgIG1heF9jb250ZW50c19zaXplID0gc3o7CisKKwkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfdHJzaXplOworCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQorCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKKwkgIHN6ID0gZXhlY19oZHIgKHN1YiktPmFfZHJzaXplOworCSAgaWYgKHN6ID4gbWF4X3JlbG9jc19zaXplKQorCSAgICBtYXhfcmVsb2NzX3NpemUgPSBzejsKKworCSAgc3ogPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKHN1Yik7CisJICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQorCSAgICBtYXhfc3ltX2NvdW50ID0gc3o7CisJfQorICAgIH0KKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHsKKyAgICAgIGlmIChvYmpfdGV4dHNlYyAoYWJmZCkgIT0gKGFzZWN0aW9uICopIE5VTEwpCisJdHJzaXplICs9IChfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzIChvYmpfdGV4dHNlYyAoYWJmZCkKKwkJCQkJCSAtPmxpbmtfb3JkZXJfaGVhZCkKKwkJICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOworICAgICAgaWYgKG9ial9kYXRhc2VjIChhYmZkKSAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKwlkcnNpemUgKz0gKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKG9ial9kYXRhc2VjIChhYmZkKQorCQkJCQkJIC0+bGlua19vcmRlcl9oZWFkKQorCQkgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CisgICAgfQorCisgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSB0cnNpemU7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSBkcnNpemU7CisKKyAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKKworICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIHZtYXMgYWNjb3JkaW5nIHRvIHRoZSBtYWdpYyBudW1iZXIuCisgICAgIFRoaXMgc2V0cyBhX3RleHQsIGFfZGF0YSBhbmQgYV9ic3MgaW4gdGhlIGV4ZWNfaGRyIGFuZCBzZXRzIHRoZQorICAgICBmaWxlcG9zIGZvciBlYWNoIHNlY3Rpb24uICAqLworICBpZiAoISBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgcmVsb2NhdGlvbiBhbmQgc3ltYm9sIGZpbGUgcG9zaXRpb25zIGRpZmZlciBhbW9uZyBhLm91dAorICAgICB0YXJnZXRzLiAgV2UgYXJlIHBhc3NlZCBhIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgYmFja2VuZAorICAgICBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSB0aGlzLgorICAgICBGSVhNRTogQXQgdGhpcyBwb2ludCB3ZSBkbyBub3Qga25vdyBob3cgbXVjaCBzcGFjZSB0aGUgc3ltYm9sCisgICAgIHRhYmxlIHdpbGwgcmVxdWlyZS4gIFRoaXMgd2lsbCBub3Qgd29yayBmb3IgYW55IChub25zdGFuZGFyZCkKKyAgICAgYS5vdXQgdGFyZ2V0IHRoYXQgbmVlZHMgdG8ga25vdyB0aGUgc3ltYm9sIHRhYmxlIHNpemUgYmVmb3JlIGl0CisgICAgIGNhbiBjb21wdXRlIHRoZSByZWxvY2F0aW9uIGZpbGUgcG9zaXRpb25zLiAgVGhpcyBtYXkgb3IgbWF5IG5vdAorICAgICBiZSB0aGUgY2FzZSBmb3IgdGhlIGhwMzAwaHB1eCB0YXJnZXQsIGZvciBleGFtcGxlLiAgKi8KKyAgKCpjYWxsYmFjaykgKGFiZmQsICZhb3V0X2luZm8udHJlbG9mZiwgJmFvdXRfaW5mby5kcmVsb2ZmLAorCSAgICAgICAmYW91dF9pbmZvLnN5bW9mZik7CisgIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBhb3V0X2luZm8udHJlbG9mZjsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IGFvdXRfaW5mby5kcmVsb2ZmOworICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gYW91dF9pbmZvLnN5bW9mZjsKKworICAvKiBXZSBrZWVwIGEgY291bnQgb2YgdGhlIHN5bWJvbHMgYXMgd2Ugb3V0cHV0IHRoZW0uICAqLworICBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpID0gMDsKKworICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBzdHJpbmcgdGFibGUgYXMgd2Ugd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KKyAgYW91dF9pbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7CisgIGlmIChhb3V0X2luZm8uc3RydGFiID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogQWxsb2NhdGUgYnVmZmVycyB0byBob2xkIHNlY3Rpb24gY29udGVudHMgYW5kIHJlbG9jcy4gICovCisgIGFvdXRfaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7CisgIGFvdXRfaW5mby5yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NzX3NpemUpOworICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IChpbnQgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAoaW50ICopKTsKKyAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKKwkJCSAgIGJmZF9tYWxsb2MgKChtYXhfc3ltX2NvdW50ICsgMSkKKwkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCkpKTsKKyAgaWYgKChhb3V0X2luZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSAhPSAwKQorICAgICAgfHwgKGFvdXRfaW5mby5yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NzX3NpemUgIT0gMCkKKyAgICAgIHx8IChhb3V0X2luZm8uc3ltYm9sX21hcCA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKKyAgICAgIHx8IGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIElmIHdlIGhhdmUgYSBzeW1ib2wgbmFtZWQgX19EWU5BTUlDLCBmb3JjZSBpdCBvdXQgbm93LiAgVGhpcyBpcworICAgICByZXF1aXJlZCBieSBTdW5PUy4gIERvaW5nIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBzdW5vcy5jIGlzIGEKKyAgICAgaGFjaywgYnV0IGl0J3MgZWFzaWVyIHRoYW4gZXhwb3J0aW5nIGV2ZXJ5dGhpbmcgd2hpY2ggd291bGQgYmUKKyAgICAgbmVlZGVkLiAgKi8KKyAgeworICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgIGggPSBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKGFvdXRfaGFzaF90YWJsZSAoaW5mbyksICJfX0RZTkFNSUMiLAorCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgIGlmIChoICE9IE5VTEwpCisgICAgICBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAmYW91dF9pbmZvKTsKKyAgfQorCisgIC8qIFRoZSBtb3N0IHRpbWUgZWZmaWNpZW50IHdheSB0byBkbyB0aGUgbGluayB3b3VsZCBiZSB0byByZWFkIGFsbAorICAgICB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGludG8gbWVtb3J5IGFuZCB0aGVuIHNvcnQgb3V0IHRoZQorICAgICBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFVuZm9ydHVuYXRlbHksIHRoYXQgd2lsbAorICAgICBwcm9iYWJseSB1c2UgdG9vIG11Y2ggbWVtb3J5LiAgQW5vdGhlciBtZXRob2Qgd291bGQgYmUgdG8gc3RlcAorICAgICB0aHJvdWdoIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgdGV4dCBzZWN0aW9uIGFuZCB3cml0ZSBpdAorICAgICBvdXQsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgdGhhdCBjb21wb3NlcyB0aGUgZGF0YSBzZWN0aW9uIGFuZCB3cml0ZQorICAgICBpdCBvdXQsIGFuZCB0aGVuIHdyaXRlIG91dCB0aGUgcmVsb2NzLCBhbmQgdGhlbiB3cml0ZSBvdXQgdGhlCisgICAgIHN5bWJvbHMuICBVbmZvcnR1bmF0ZWx5LCB0aGF0IHJlcXVpcmVzIHJlYWRpbmcgc3R1ZmYgZnJvbSBlYWNoCisgICAgIGlucHV0IGZpbGUgc2V2ZXJhbCB0aW1lcywgYW5kIHdlIHdpbGwgbm90IGJlIGFibGUgdG8ga2VlcCBhbGwgdGhlCisgICAgIGlucHV0IGZpbGVzIG9wZW4gc2ltdWx0YW5lb3VzbHksIGFuZCByZW9wZW5pbmcgdGhlbSB3aWxsIGJlIHNsb3cuCisKKyAgICAgV2hhdCB3ZSBkbyBpcyBiYXNpY2FsbHkgcHJvY2VzcyBvbmUgaW5wdXQgZmlsZSBhdCBhIHRpbWUuICBXZSBkbworICAgICBldmVyeXRoaW5nIHdlIG5lZWQgdG8gZG8gd2l0aCBhbiBpbnB1dCBmaWxlIG9uY2UtLWNvcHkgb3ZlciB0aGUKKyAgICAgc2VjdGlvbiBjb250ZW50cywgaGFuZGxlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBhbmQgd3JpdGUKKyAgICAgb3V0IHRoZSBzeW1ib2xzLS1hbmQgdGhlbiB3ZSB0aHJvdyBhd2F5IHRoZSBpbmZvcm1hdGlvbiB3ZSByZWFkCisgICAgIGZyb20gaXQuICBUaGlzIGFwcHJvYWNoIHJlcXVpcmVzIGEgbG90IG9mIGxzZWVrcyBvZiB0aGUgb3V0cHV0CisgICAgIGZpbGUsIHdoaWNoIGlzIHVuZm9ydHVuYXRlIGJ1dCBzdGlsbCBmYXN0ZXIgdGhhbiByZW9wZW5pbmcgYSBsb3QKKyAgICAgb2YgZmlsZXMuCisKKyAgICAgV2UgdXNlIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkIG9mIHRoZSBpbnB1dCBCRkRzIHRvIHNlZQorICAgICB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIGl0LiAgKi8KKyAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gKGJmZCAqKSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKKyAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKKworICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBUaGlzCisgICAgIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IHdlCisgICAgIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2ggdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QKKyAgICAgaW5jbHVkZS4gICovCisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwl7CisJICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKKwkgICAgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5saW5rZXJfbWFyayA9IHRydWU7CisJfQorICAgIH0KKworICBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzID0gZmFsc2U7CisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7CisJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisJICAgcCA9IHAtPm5leHQpCisJeworCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKKwkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQorCQkgID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKSkKKwkgICAgeworCSAgICAgIGJmZCAqaW5wdXRfYmZkOworCisJICAgICAgaW5wdXRfYmZkID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKKwkgICAgICBpZiAoISBpbnB1dF9iZmQtPm91dHB1dF9oYXNfYmVndW4pCisJCXsKKwkJICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfYmZkICgmYW91dF9pbmZvLCBpbnB1dF9iZmQpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgaW5wdXRfYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKKwkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCisJICAgIHsKKwkgICAgICAvKiBUaGVzZSBhcmUgaGFuZGxlZCBiZWxvdy4gICovCisJICAgICAgaGF2ZV9saW5rX29yZGVyX3JlbG9jcyA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFdyaXRlIG91dCBhbnkgc3ltYm9scyB0aGF0IHdlIGhhdmUgbm90IGFscmVhZHkgd3JpdHRlbiBvdXQuICAqLworICBhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZSAoYW91dF9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wsCisJCQkgICAoUFRSKSAmYW91dF9pbmZvKTsKKworICAvKiBOb3cgaGFuZGxlIGFueSByZWxvY3Mgd2Ugd2VyZSBhc2tlZCB0byBjcmVhdGUgYnkgdGhlIGxpbmtlci4KKyAgICAgVGhlc2UgZGlkIG5vdCBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBXZSBtdXN0IGRvIHRoZXNlIGFmdGVyCisgICAgIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBzeW1ib2xzLCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbAorICAgICBpbmRpY2VzIHRvIHVzZS4gICovCisgIGlmIChoYXZlX2xpbmtfb3JkZXJfcmVsb2NzKQorICAgIHsKKyAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKKwl7CisJICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7CisJICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCSAgICAgICBwID0gcC0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKKwkJICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKKwkJeworCQkgIGlmICghIGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyICgmYW91dF9pbmZvLCBvLCBwKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOworICAgICAgYW91dF9pbmZvLmNvbnRlbnRzID0gTlVMTDsKKyAgICB9CisgIGlmIChhb3V0X2luZm8ucmVsb2NzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoYW91dF9pbmZvLnJlbG9jcyk7CisgICAgICBhb3V0X2luZm8ucmVsb2NzID0gTlVMTDsKKyAgICB9CisgIGlmIChhb3V0X2luZm8uc3ltYm9sX21hcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGFvdXRfaW5mby5zeW1ib2xfbWFwKTsKKyAgICAgIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gTlVMTDsKKyAgICB9CisgIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOworICAgICAgYW91dF9pbmZvLm91dHB1dF9zeW1zID0gTlVMTDsKKyAgICB9CisgIGlmIChpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCk7CisgICAgICBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgIC8qIEZpbmlzaCB1cCBhbnkgZHluYW1pYyBsaW5raW5nIHdlIG1heSBiZSBkb2luZy4gICovCisgIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmZpbmlzaF9keW5hbWljX2xpbmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISAoKmFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZmluaXNoX2R5bmFtaWNfbGluaykgKGFiZmQsIGluZm8pKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBVcGRhdGUgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCisgIGFiZmQtPnN5bWNvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKKyAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBhYmZkLT5zeW1jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CisgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpICsgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7CisgIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQorICAgIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQorICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUsIHVubGVzcyB0aGVyZSBhcmUgbm8gc3ltYm9scy4gICovCisgIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCisgICAgeworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgISBlbWl0X3N0cmluZ3RhYiAoYWJmZCwgYW91dF9pbmZvLnN0cnRhYikpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorICBlbHNlIGlmIChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDAKKwkgICAmJiBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50ID09IDApCisgICAgeworICAgICAgYmZkX2J5dGUgYjsKKworICAgICAgYiA9IDA7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCSAgICAob2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zCisJCSAgICAgKyBleGVjX2hkciAoYWJmZCktPmFfZGF0YQorCQkgICAgIC0gMSksCisJCSAgICBTRUVLX1NFVCkgIT0gMAorCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChhb3V0X2luZm8uY29udGVudHMgIT0gTlVMTCkKKyAgICBmcmVlIChhb3V0X2luZm8uY29udGVudHMpOworICBpZiAoYW91dF9pbmZvLnJlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGFvdXRfaW5mby5yZWxvY3MpOworICBpZiAoYW91dF9pbmZvLnN5bWJvbF9tYXAgIT0gTlVMTCkKKyAgICBmcmVlIChhb3V0X2luZm8uc3ltYm9sX21hcCk7CisgIGlmIChhb3V0X2luZm8ub3V0cHV0X3N5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChhb3V0X2luZm8ub3V0cHV0X3N5bXMpOworICBpZiAoaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCkKKyAgICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIExpbmsgYW4gYS5vdXQgaW5wdXQgQkZEIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2FvdXRfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCisgICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworeworICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKKworICBCRkRfQVNTRVJUIChiZmRfZ2V0X2Zvcm1hdCAoaW5wdXRfYmZkKSA9PSBiZmRfb2JqZWN0KTsKKworICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIGl0IG1heSBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuICAqLworICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCisgICAgICAmJiBhb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiAoKCphb3V0X2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+bGlua19keW5hbWljX29iamVjdCkKKwkgICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCkpOworICAgIH0KKworICAvKiBHZXQgdGhlIHN5bWJvbHMuICBXZSBwcm9iYWJseSBoYXZlIHRoZW0gYWxyZWFkeSwgdW5sZXNzCisgICAgIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZS4gICovCisgIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMgYW5kIGdldCBhIG1hcCBvZiB0aGUgbmV3IGluZGljZXMuICBUaGUgbWFwCisgICAgIGlzIHBsYWNlZCBpbnRvIGZpbmZvLT5zeW1ib2xfbWFwLiAgKi8KKyAgaWYgKCEgYW91dF9saW5rX3dyaXRlX3N5bWJvbHMgKGZpbmZvLCBpbnB1dF9iZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBSZWxvY2F0ZSBhbmQgd3JpdGUgb3V0IHRoZSBzZWN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlCisgICAgIHN5bWJvbCBtYXAgY3JlYXRlZCBieSBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scy4gIFRoZSBsaW5rZXJfbWFyaworICAgICBmaWVsZCB3aWxsIGJlIHNldCBpZiB0aGVzZSBzZWN0aW9ucyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgIGxpbmssIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlIGNhc2UuICAqLworICBpZiAob2JqX3RleHRzZWMgKGlucHV0X2JmZCktPmxpbmtlcl9tYXJrKQorICAgIHsKKyAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLAorCQkJCSAgICAgb2JqX3RleHRzZWMgKGlucHV0X2JmZCksCisJCQkJICAgICAmZmluZm8tPnRyZWxvZmYsCisJCQkJICAgICBleGVjX2hkciAoaW5wdXRfYmZkKS0+YV90cnNpemUpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmIChvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKS0+bGlua2VyX21hcmspCisgICAgeworICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsCisJCQkJICAgICBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKSwKKwkJCQkgICAgICZmaW5mby0+ZHJlbG9mZiwKKwkJCQkgICAgIGV4ZWNfaGRyIChpbnB1dF9iZmQpLT5hX2Ryc2l6ZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBJZiB3ZSBhcmUgbm90IGtlZXBpbmcgbWVtb3J5LCB3ZSBkb24ndCBuZWVkIHRoZSBzeW1ib2xzIGFueQorICAgICBsb25nZXIuICBXZSBzdGlsbCBuZWVkIHRoZW0gaWYgd2UgYXJlIGtlZXBpbmcgbWVtb3J5LCBiZWNhdXNlIHRoZQorICAgICBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIHBvaW50IGludG8gdGhlbS4gICovCisgIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKKyAgICB7CisgICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChpbnB1dF9iZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkanVzdCBhbmQgd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGZvciBhbiBhLm91dCBmaWxlLiAgU2V0IHRoZSBuZXcKKyAgIHN5bWJvbCBpbmRpY2VzIGludG8gYSBzeW1ib2xfbWFwLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2FvdXRfbGlua193cml0ZV9zeW1ib2xzIChmaW5mbywgaW5wdXRfYmZkKQorICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKK3sKKyAgYmZkICpvdXRwdXRfYmZkOworICBiZmRfc2l6ZV90eXBlIHN5bV9jb3VudDsKKyAgY2hhciAqc3RyaW5nczsKKyAgZW51bSBiZmRfbGlua19zdHJpcCBzdHJpcDsKKyAgZW51bSBiZmRfbGlua19kaXNjYXJkIGRpc2NhcmQ7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOworICBiZmRfc2l6ZV90eXBlIHN0cnRhYl9pbmRleDsKKyAgcmVnaXN0ZXIgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW07CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKKyAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7CisgIGludCAqc3ltYm9sX21hcDsKKyAgYm9vbGVhbiBwYXNzOworICBib29sZWFuIHNraXBfbmV4dDsKKworICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7CisgIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoaW5wdXRfYmZkKTsKKyAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7CisgIHN0cmlwID0gZmluZm8tPmluZm8tPnN0cmlwOworICBkaXNjYXJkID0gZmluZm8tPmluZm8tPmRpc2NhcmQ7CisgIG91dHN5bSA9IGZpbmZvLT5vdXRwdXRfc3ltczsKKworICAvKiBGaXJzdCB3cml0ZSBvdXQgYSBzeW1ib2wgZm9yIHRoaXMgb2JqZWN0IGZpbGUsIHVubGVzcyB3ZSBhcmUKKyAgICAgZGlzY2FyZGluZyBzdWNoIHN5bWJvbHMuICAqLworICBpZiAoc3RyaXAgIT0gc3RyaXBfYWxsCisgICAgICAmJiAoc3RyaXAgIT0gc3RyaXBfc29tZQorCSAgfHwgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBpbnB1dF9iZmQtPmZpbGVuYW1lLAorCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQorICAgICAgJiYgZGlzY2FyZCAhPSBkaXNjYXJkX2FsbCkKKyAgICB7CisgICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgTl9URVhULCBvdXRzeW0tPmVfdHlwZSk7CisgICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG91dHN5bS0+ZV9kZXNjKTsKKyAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCisJCQkJICAgICAgIGlucHV0X2JmZC0+ZmlsZW5hbWUsIGZhbHNlKTsKKyAgICAgIGlmIChzdHJ0YWJfaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorCXJldHVybiBmYWxzZTsKKyAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBzdHJ0YWJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKKyAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAorCQkoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKKwkJCQkgICAgICBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+b3V0cHV0X3NlY3Rpb24pCisJCSArIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5vdXRwdXRfb2Zmc2V0KSwKKwkJb3V0c3ltLT5lX3ZhbHVlKTsKKyAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKKyAgICAgICsrb3V0c3ltOworICAgIH0KKworICBwYXNzID0gZmFsc2U7CisgIHNraXBfbmV4dCA9IGZhbHNlOworICBzeW0gPSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOworICBzeW1fZW5kID0gc3ltICsgc3ltX2NvdW50OworICBzeW1faGFzaCA9IG9ial9hb3V0X3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisgIHN5bWJvbF9tYXAgPSBmaW5mby0+c3ltYm9sX21hcDsKKyAgbWVtc2V0IChzeW1ib2xfbWFwLCAwLCBzeW1fY291bnQgKiBzaXplb2YgKnN5bWJvbF9tYXApOworICBmb3IgKDsgc3ltIDwgc3ltX2VuZDsgc3ltKyssIHN5bV9oYXNoKyssIHN5bWJvbF9tYXArKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgaW50IHR5cGU7CisgICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBib29sZWFuIHNraXA7CisgICAgICBhc2VjdGlvbiAqc3ltc2VjOworICAgICAgYmZkX3ZtYSB2YWwgPSAwOworICAgICAgYm9vbGVhbiBjb3B5OworCisgICAgICAvKiBXZSBzZXQgKnN5bWJvbF9tYXAgdG8gMCBhYm92ZSBmb3IgYWxsIHN5bWJvbHMuICBJZiBpdCBoYXMKKyAgICAgICAgIGFscmVhZHkgYmVlbiBzZXQgdG8gLTEgZm9yIHRoaXMgc3ltYm9sLCBpdCBtZWFucyB0aGF0IHdlIGFyZQorICAgICAgICAgZGlzY2FyZGluZyBpdCBiZWNhdXNlIGl0IGFwcGVhcnMgaW4gYSBkdXBsaWNhdGUgaGVhZGVyIGZpbGUuCisgICAgICAgICBTZWUgdGhlIE5fQklOQ0wgY29kZSBiZWxvdy4gICovCisgICAgICBpZiAoKnN5bWJvbF9tYXAgPT0gLTEpCisJY29udGludWU7CisKKyAgICAgIC8qIEluaXRpYWxpemUgKnN5bWJvbF9tYXAgdG8gLTEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN5bWJvbCB3YXMKKyAgICAgICAgIG5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSB3aWxsIGNoYW5nZSBpdCBsYXRlciBpZgorICAgICAgICAgd2UgZG8gY29weSB0aGUgc3ltYm9sIG92ZXIuICAqLworICAgICAgKnN5bWJvbF9tYXAgPSAtMTsKKworICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV90eXBlKTsKKyAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3N0cngpOworCisgICAgICBoID0gTlVMTDsKKworICAgICAgaWYgKHBhc3MpCisJeworCSAgLyogUGFzcyB0aGlzIHN5bWJvbCB0aHJvdWdoLiAgSXQgaXMgdGhlIHRhcmdldCBvZiBhbgorCSAgICAgaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuICAqLworCSAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKKwkgIHBhc3MgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlIGlmIChza2lwX25leHQpCisJeworCSAgLyogU2tpcCB0aGlzIHN5bWJvbCwgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdAorCSAgICAgc3ltYm9sIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIHRvIG5vIGxvbmdlciBiZSBhbiBpbmRpcmVjdAorCSAgICAgc3ltYm9sLiAgKi8KKwkgIHNraXBfbmV4dCA9IGZhbHNlOworCSAgY29udGludWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaHJlc29sdmU7CisKKwkgIC8qIFdlIGhhdmUgc2F2ZWQgdGhlIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sLCBpZgorCSAgICAgdGhlcmUgaXMgb25lLiAgTm90ZSB0aGF0IHdlIGNvdWxkIGp1c3QgbG9vayBpdCB1cCBhZ2FpbgorCSAgICAgaW4gdGhlIGhhc2ggdGFibGUsIHByb3ZpZGVkIHdlIGZpcnN0IGNoZWNrIHRoYXQgaXQgaXMgYW4KKwkgICAgIGV4dGVybmFsIHN5bWJvbC4gKi8KKwkgIGggPSAqc3ltX2hhc2g7CisKKwkgIC8qIFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoIHRhYmxlLCBpbiBjYXNlIHRoZSBzeW1ib2wgd2FzCisgICAgICAgICAgICAgd3JhcHBlZC4gICovCisJICBpZiAoaCAhPSBOVUxMKQorCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKworCSAgLyogSWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbCwgdGhlbiBjaGFuZ2UKKwkgICAgIGhyZXNvbHZlIHRvIHRoZSBiYXNlIHN5bWJvbC4gIFdlIGFsc28gY2hhbmdlICpzeW1faGFzaCBzbworCSAgICAgdGhhdCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyByZWxvY2F0ZSBhZ2FpbnN0IHRoZSByZWFsCisJICAgICBzeW1ib2wuICAqLworCSAgaHJlc29sdmUgPSBoOworCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykpCisJICAgIHsKKwkgICAgICBocmVzb2x2ZSA9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKKwkgICAgICB3aGlsZSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisJCWhyZXNvbHZlID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKKwkJCSAgICBocmVzb2x2ZS0+cm9vdC51LmkubGluayk7CisJICAgICAgKnN5bV9oYXNoID0gaHJlc29sdmU7CisJICAgIH0KKworCSAgLyogSWYgdGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LCBza2lwIGl0LiAgKi8KKwkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3dhcm5pbmcKKwkgICAgICAmJiBoLT53cml0dGVuKQorCSAgICB7CisJICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0lORFIKKwkJICB8fCB0eXBlID09IE5fV0FSTklORykKKwkJc2tpcF9uZXh0ID0gdHJ1ZTsKKwkgICAgICAqc3ltYm9sX21hcCA9IGgtPmluZHg7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogU2VlIGlmIHdlIGFyZSBzdHJpcHBpbmcgdGhpcyBzeW1ib2wuICAqLworCSAgc2tpcCA9IGZhbHNlOworCSAgc3dpdGNoIChzdHJpcCkKKwkgICAgeworCSAgICBjYXNlIHN0cmlwX25vbmU6CisJICAgICAgYnJlYWs7CisJICAgIGNhc2Ugc3RyaXBfZGVidWdnZXI6CisJICAgICAgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQorCQlza2lwID0gdHJ1ZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBzdHJpcF9zb21lOgorCSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKKwkJICA9PSBOVUxMKQorCQlza2lwID0gdHJ1ZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBzdHJpcF9hbGw6CisJICAgICAgc2tpcCA9IHRydWU7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChza2lwKQorCSAgICB7CisJICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorCQloLT53cml0dGVuID0gdHJ1ZTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLworCSAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX1RFWFQKKwkgICAgICB8fCB0eXBlID09IE5fV0VBS1QpCisJICAgIHN5bXNlYyA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOworCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fREFUQQorCQkgICB8fCB0eXBlID09IE5fV0VBS0QpCisJICAgIHN5bXNlYyA9IG9ial9kYXRhc2VjIChpbnB1dF9iZmQpOworCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQlNTCisJCSAgIHx8IHR5cGUgPT0gTl9XRUFLQikKKwkgICAgc3ltc2VjID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKKwkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0FCUworCQkgICB8fCB0eXBlID09IE5fV0VBS0EpCisJICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmICgoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUgorCQkgICAgJiYgKGhyZXNvbHZlID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCQkJfHwgKGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCQkgICAgJiYgaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKKwkJCSAgICAmJiBocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkpCisJCSAgIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQorCSAgICB7CisJICAgICAgLyogUGFzcyB0aGUgbmV4dCBzeW1ib2wgdGhyb3VnaCB1bmNoYW5nZWQuICBUaGUKKwkJIGNvbmRpdGlvbiBhYm92ZSBmb3IgaW5kaXJlY3Qgc3ltYm9scyBpcyBzbyB0aGF0IGlmCisJCSB0aGUgaW5kaXJlY3Qgc3ltYm9sIHdhcyBkZWZpbmVkLCB3ZSBvdXRwdXQgaXQgd2l0aAorCQkgdGhlIGNvcnJlY3QgZGVmaW5pdGlvbiBzbyB0aGUgZGVidWdnZXIgd2lsbAorCQkgdW5kZXJzdGFuZCBpdC4gICovCisJICAgICAgcGFzcyA9IHRydWU7CisJICAgICAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKKwkgICAgICBzeW1zZWMgPSBOVUxMOworCSAgICB9CisJICBlbHNlIGlmICgodHlwZSAmIE5fU1RBQikgIT0gMCkKKwkgICAgeworCSAgICAgIHZhbCA9IEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSk7CisJICAgICAgc3ltc2VjID0gTlVMTDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBhbiBpbmRpcmVjdCBzeW1ib2wsIGl0IG1lYW5zIHRoYXQKKwkJIHdlIGFyZSBvdXRwdXR0aW5nIGl0IHdpdGggYSByZWFsIGRlZmluaXRpb24uICBJbiBzdWNoCisJCSBhIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gb3V0cHV0IHRoZSBuZXh0IHN5bWJvbCwKKwkJIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluZGlyZWN0aW9uLiAgKi8KKwkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUikKKwkJc2tpcF9uZXh0ID0gdHJ1ZTsKKworCSAgICAgIHN5bXNlYyA9IE5VTEw7CisKKwkgICAgICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgaGFzaCB0YWJsZS4gIFdlIHVzZQorCQkgaHJlc29sdmUgc28gdGhhdCBpZiB3ZSBoYXZlIGRlZmluZWQgYW4gaW5kaXJlY3QKKwkJIHN5bWJvbCB3ZSBvdXRwdXQgdGhlIGZpbmFsIGRlZmluaXRpb24uICAqLworCSAgICAgIGlmIChoID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkJeworCQkgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKKwkJICAgIHsKKwkJICAgIGNhc2UgTl9TRVRUOgorCQkgICAgICBzeW1zZWMgPSBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIE5fU0VURDoKKwkJICAgICAgc3ltc2VjID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBOX1NFVEI6CisJCSAgICAgIHN5bXNlYyA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBOX1NFVEE6CisJCSAgICAgIHN5bXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgdmFsID0gMDsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICAgfHwgaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJCXsKKwkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKwkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisKKwkJICAvKiBUaGlzIGNhc2UgdXN1YWxseSBtZWFucyBhIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2FzCisJCSAgICAgdHVybmVkIGludG8gYSBkZWZpbmVkIHN5bWJvbC4gICovCisJCSAgaW5wdXRfc2VjdGlvbiA9IGhyZXNvbHZlLT5yb290LnUuZGVmLnNlY3Rpb247CisJCSAgb3V0cHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKwkJICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQorCQkJICAgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOworCQkgIHZhbCA9IChocmVzb2x2ZS0+cm9vdC51LmRlZi52YWx1ZQorCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pCisJCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKworCQkgIC8qIEdldCB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSBzZWN0aW9uLiAgSWYKKwkJICAgICB0aGlzIGlzIGEgY29uc3RydWN0ZWQgc2V0LCBmb3JjZSBpdCB0byBiZQorCQkgICAgIGdsb2JhbGx5IHZpc2libGUuICAqLworCQkgIGlmICh0eXBlID09IE5fU0VUVAorCQkgICAgICB8fCB0eXBlID09IE5fU0VURAorCQkgICAgICB8fCB0eXBlID09IE5fU0VUQgorCQkgICAgICB8fCB0eXBlID09IE5fU0VUQSkKKwkJICAgIHR5cGUgfD0gTl9FWFQ7CisKKwkJICB0eXBlICY9fiBOX1RZUEU7CisKKwkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQorCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCSAgICAgPyBOX1RFWFQKKwkJCSAgICAgOiBOX1dFQUtUKTsKKwkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCisJCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJICAgICA/IE5fREFUQQorCQkJICAgICA6IE5fV0VBS0QpOworCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQorCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCSAgICAgPyBOX0JTUworCQkJICAgICA6IE5fV0VBS0IpOworCQkgIGVsc2UKKwkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCQkgICAgID8gTl9BQlMKKwkJCSAgICAgOiBOX1dFQUtBKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCisJCXZhbCA9IGhyZXNvbHZlLT5yb290LnUuYy5zaXplOworCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJCXsKKwkJICB2YWwgPSAwOworCQkgIHR5cGUgPSBOX1dFQUtVOworCQl9CisJICAgICAgZWxzZQorCQl2YWwgPSAwOworCSAgICB9CisJICBpZiAoc3ltc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQorCSAgICB2YWwgPSAoc3ltc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICsgc3ltc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICsgKEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bS0+ZV92YWx1ZSkKKwkJICAgICAgLSBzeW1zZWMtPnZtYSkpOworCisJICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCBzZXQgdGhlIHdyaXR0ZW4gZmxhZywgYW5kIGlmCisJICAgICBpdCBpcyBhIGxvY2FsIHN5bWJvbCBzZWUgaWYgd2Ugc2hvdWxkIGRpc2NhcmQgaXQuICAqLworCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorCSAgICB7CisJICAgICAgaC0+d3JpdHRlbiA9IHRydWU7CisJICAgICAgaC0+aW5keCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVFQKKwkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAorCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRCCisJCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEEpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGRpc2NhcmQpCisJCXsKKwkJY2FzZSBkaXNjYXJkX25vbmU6CisJCSAgYnJlYWs7CisJCWNhc2UgZGlzY2FyZF9sOgorCQkgIGlmICgodHlwZSAmIE5fU1RBQikgPT0gMAorCQkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkKKwkJICAgIHNraXAgPSB0cnVlOworCQkgIGJyZWFrOworCQljYXNlIGRpc2NhcmRfYWxsOgorCQkgIHNraXAgPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisJICAgICAgaWYgKHNraXApCisJCXsKKwkJICBwYXNzID0gZmFsc2U7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgfQorCisJICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicworCSAgICAgZW50cmllcyBmb3IgYSBoZWFkZXIgZmlsZS4gIFdlIG5lZWQgdG8gc2NhbiBhaGVhZCB0byB0aGUKKwkgICAgIG5leHQgTl9FSU5DTCBzeW1ib2wsIGlnbm9yaW5nIG5lc3RpbmcsIGFkZGluZyB1cCBhbGwgdGhlCisJICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKKwkgICAgIG51bWJlcnMgaW4gdHlwZXMgKHRoZSBmaXJzdCBudW1iZXIgYWZ0ZXIgYW4gb3BlbgorCSAgICAgcGFyZW50aGVzaXMpLiAgKi8KKwkgIGlmICh0eXBlID09IE5fQklOQ0wpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmluY2xfc3ltOworCSAgICAgIGludCBuZXN0OworCSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKmluY2xfZW50cnk7CisJICAgICAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7CisKKwkgICAgICB2YWwgPSAwOworCSAgICAgIG5lc3QgPSAwOworCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyAxOyBpbmNsX3N5bSA8IHN5bV9lbmQ7IGluY2xfc3ltKyspCisJCXsKKwkJICBpbnQgaW5jbF90eXBlOworCisJCSAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7CisJCSAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQorCQkgICAgeworCQkgICAgICBpZiAobmVzdCA9PSAwKQorCQkJYnJlYWs7CisJCSAgICAgIC0tbmVzdDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKKwkJICAgICsrbmVzdDsKKwkJICBlbHNlIGlmIChuZXN0ID09IDApCisJCSAgICB7CisJCSAgICAgIGNvbnN0IGNoYXIgKnM7CisKKwkJICAgICAgcyA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV9zdHJ4KTsKKwkJICAgICAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKKwkJCXsKKwkJCSAgdmFsICs9ICpzOworCQkJICBpZiAoKnMgPT0gJygnKQorCQkJICAgIHsKKwkJCSAgICAgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KKwkJCSAgICAgICsrczsKKwkJCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQorCQkJCSsrczsKKwkJCSAgICAgIC0tczsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlCisgICAgICAgICAgICAgICAgIHNhbWUgdmFsdWUsIHRoZW4gcmVwbGFjZSB0aGlzIG9uZSB3aXRoIGFuIE5fRVhDTAorICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLworCSAgICAgIGNvcHkgPSAhIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeTsKKwkgICAgICBpbmNsX2VudHJ5ID0gYW91dF9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJmZpbmZvLT5pbmNsdWRlcywKKwkJCQkJCSAgICAgIG5hbWUsIHRydWUsIGNvcHkpOworCSAgICAgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCisJCWlmICh0LT50b3RhbCA9PSB2YWwpCisJCSAgYnJlYWs7CisJICAgICAgaWYgKHQgPT0gTlVMTCkKKwkJeworCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBzZWVuIHRoaXMgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGggdGhpcyBzZXQgb2Ygc3RhYnMgc3RyaW5ncy4gICovCisJCSAgdCA9ICgoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKikKKwkJICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmZmluZm8tPmluY2x1ZGVzLnJvb3QsCisJCQkJCSAgc2l6ZW9mICp0KSk7CisJCSAgaWYgKHQgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICB0LT50b3RhbCA9IHZhbDsKKwkJICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOworCQkgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpbnQgKmluY2xfbWFwOworCisJCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBoZWFkZXIgZmlsZS4gIFdlIG11c3QgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgICBpdCB0byBiZSBhbiBOX0VYQ0wgZW50cnksIGFuZCBtYXJrIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIHN5bWJvbHMgdG8gcHJldmVudCBvdXRwdXR0aW5nIHRoZW0uICAqLworCQkgIHR5cGUgPSBOX0VYQ0w7CisKKwkJICBuZXN0ID0gMDsKKwkJICBmb3IgKGluY2xfc3ltID0gc3ltICsgMSwgaW5jbF9tYXAgPSBzeW1ib2xfbWFwICsgMTsKKwkJICAgICAgIGluY2xfc3ltIDwgc3ltX2VuZDsKKwkJICAgICAgIGluY2xfc3ltKyssIGluY2xfbWFwKyspCisJCSAgICB7CisJCSAgICAgIGludCBpbmNsX3R5cGU7CisKKwkJICAgICAgaW5jbF90eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgaW5jbF9zeW0tPmVfdHlwZSk7CisJCSAgICAgIGlmIChpbmNsX3R5cGUgPT0gTl9FSU5DTCkKKwkJCXsKKwkJCSAgaWYgKG5lc3QgPT0gMCkKKwkJCSAgICB7CisJCQkgICAgICAqaW5jbF9tYXAgPSAtMTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIH0KKwkJCSAgLS1uZXN0OworCQkJfQorCQkgICAgICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKKwkJCSsrbmVzdDsKKwkJICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQorCQkJKmluY2xfbWFwID0gLTE7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworICAgICAgLyogQ29weSB0aGlzIHN5bWJvbCBpbnRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvCisJIHdyaXRlIG91dC4gICovCisgICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOworICAgICAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV9vdGhlciksCisJCSAgIG91dHN5bS0+ZV9vdGhlcik7CisgICAgICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIGJmZF9oX2dldF8xNiAoaW5wdXRfYmZkLCBzeW0tPmVfZGVzYyksCisJCSAgICBvdXRzeW0tPmVfZGVzYyk7CisgICAgICBjb3B5ID0gZmFsc2U7CisgICAgICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCisJeworCSAgLyogbmFtZSBwb2ludHMgaW50byBhIHN0cmluZyB0YWJsZSB3aGljaCB3ZSBhcmUgZ29pbmcgdG8KKwkgICAgIGZyZWUuICBJZiB0aGVyZSBpcyBhIGhhc2ggdGFibGUgZW50cnksIHVzZSB0aGF0IHN0cmluZy4KKwkgICAgIE90aGVyd2lzZSwgY29weSBuYW1lIGludG8gbWVtb3J5LiAgKi8KKwkgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICBlbHNlCisJICAgIGNvcHkgPSB0cnVlOworCX0KKyAgICAgIHN0cnRhYl9pbmRleCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsCisJCQkJICAgICAgIG5hbWUsIGNvcHkpOworICAgICAgaWYgKHN0cnRhYl9pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJcmV0dXJuIGZhbHNlOworICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHN0cnRhYl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOworICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKKyAgICAgICpzeW1ib2xfbWFwID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKKyAgICAgICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKKyAgICAgICsrb3V0c3ltOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIG91dHB1dCBzeW1ib2xzIHdlIGhhdmUganVzdCBjb25zdHJ1Y3RlZC4gICovCisgIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0cHV0X3N5bXMpCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBvdXRzeW1fY291bnQ7CisKKyAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgZmluZm8tPnN5bW9mZiwgU0VFS19TRVQpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgb3V0c3ltX2NvdW50ID0gb3V0c3ltIC0gZmluZm8tPm91dHB1dF9zeW1zOworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZmluZm8tPm91dHB1dF9zeW1zLAorCQkgICAgIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAorCQkgICAgIChiZmRfc2l6ZV90eXBlKSBvdXRzeW1fY291bnQsIG91dHB1dF9iZmQpCisJICAhPSBvdXRzeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGZpbmZvLT5zeW1vZmYgKz0gb3V0c3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCBhIHN5bWJvbCB0aGF0IHdhcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGEub3V0IGlucHV0CisgICBvYmplY3QuICAqLworCitzdGF0aWMgYm9vbGVhbgorYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKKyAgYmZkICpvdXRwdXRfYmZkOworICBpbnQgdHlwZTsKKyAgYmZkX3ZtYSB2YWw7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCBvdXRzeW07CisgIGJmZF9zaXplX3R5cGUgaW5keDsKKworICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7CisKKyAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+d3JpdGVfZHluYW1pY19zeW1ib2wgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISAoKCphb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPndyaXRlX2R5bmFtaWNfc3ltYm9sKQorCSAgICAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoKSkpCisJeworCSAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgaWYgKGgtPndyaXR0ZW4pCisgICAgcmV0dXJuIHRydWU7CisKKyAgaC0+d3JpdHRlbiA9IHRydWU7CisKKyAgLyogQW4gaW5keCBvZiAtMiBtZWFucyB0aGUgc3ltYm9sIG11c3QgYmUgd3JpdHRlbi4gICovCisgIGlmIChoLT5pbmR4ICE9IC0yCisgICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAorCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCisJICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBoLT5yb290LnJvb3Quc3RyaW5nLAorCQkJCSAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChoLT5yb290LnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgorICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBzZXQgc3ltYm9scyB3aGVuIHNldHMgYXJlIG5vdCBiZWluZworICAgICAgICAgYnVpbHQuICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKKyAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKKyAgICAgIHZhbCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKyAgICAgIHsKKwlhc2VjdGlvbiAqc2VjOworCisJc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKwlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKKwkJICAgIHx8IHNlYy0+b3duZXIgPT0gb3V0cHV0X2JmZCk7CisJaWYgKHNlYyA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCisJICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fVEVYVCA6IE5fV0VBS1Q7CisJZWxzZSBpZiAoc2VjID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKKwkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9EQVRBIDogTl9XRUFLRDsKKwllbHNlIGlmIChzZWMgPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCisJICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQlNTIDogTl9XRUFLQjsKKwllbHNlCisJICB0eXBlID0gaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCA/IE5fQUJTIDogTl9XRUFLQTsKKwl0eXBlIHw9IE5fRVhUOworCXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJICAgICAgICsgc2VjLT52bWEKKwkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKyAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKKyAgICAgIHZhbCA9IGgtPnJvb3QudS5jLnNpemU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgorICAgICAgdHlwZSA9IE5fV0VBS1U7CisgICAgICB2YWwgPSAwOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKKyAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCisJIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0uZV90eXBlKTsKKyAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS5lX290aGVyKTsKKyAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0uZV9kZXNjKTsKKyAgaW5keCA9IGFkZF90b19zdHJpbmd0YWIgKG91dHB1dF9iZmQsIGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCisJCQkgICBmYWxzZSk7CisgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaW5keCwgb3V0c3ltLmVfc3RyeCk7CisgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS5lX3ZhbHVlKTsKKworICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIGZpbmZvLT5zeW1vZmYsIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpICZvdXRzeW0sIChiZmRfc2l6ZV90eXBlKSBFWFRFUk5BTF9OTElTVF9TSVpFLAorCQkgICAgKGJmZF9zaXplX3R5cGUpIDEsIG91dHB1dF9iZmQpICE9IEVYVEVSTkFMX05MSVNUX1NJWkUpCisgICAgeworICAgICAgLyogRklYTUU6IE5vIHdheSB0byBoYW5kbGUgZXJyb3JzLiAgKi8KKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBmaW5mby0+c3ltb2ZmICs9IEVYVEVSTkFMX05MSVNUX1NJWkU7CisgIGgtPmluZHggPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOworICArK29ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIExpbmsgYW4gYS5vdXQgc2VjdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCithb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2ZmX3B0ciwKKwkJCSByZWxfc2l6ZSkKKyAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBmaWxlX3B0ciAqcmVsb2ZmX3B0cjsKKyAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKK3sKKyAgYmZkX3NpemVfdHlwZSBpbnB1dF9zaXplOworICBQVFIgcmVsb2NzOworCisgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgIGlucHV0X3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOworICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkgIChQVFIpIGZpbmZvLT5jb250ZW50cywKKwkJCQkgIChmaWxlX3B0cikgMCwgaW5wdXRfc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcyBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBpdC4gICovCisgIGlmIChhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbikgIT0gTlVMTAorICAgICAgJiYgYW91dF9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MgIT0gTlVMTCkKKyAgICByZWxvY3MgPSBhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jczsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlbG9jcyA9IGZpbmZvLT5yZWxvY3M7CisgICAgICBpZiAocmVsX3NpemUgPiAwKQorCXsKKwkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgaW5wdXRfYmZkKSAhPSByZWxfc2l6ZSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLworICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpCisgICAgeworICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQkgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAorCQkJCQkgcmVsX3NpemUsIGZpbmZvLT5jb250ZW50cykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCAoZmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKKwkJCQkJIHJlbF9zaXplLCBmaW5mby0+Y29udGVudHMpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChmaW5mby0+b3V0cHV0X2JmZCwKKwkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLAorCQkJCSAgKFBUUikgZmluZm8tPmNvbnRlbnRzLAorCQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKKwkJCQkgIGlucHV0X3NpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZSByZWxvY3Mgd2VyZQorICAgICBtb2RpZmllZCwgYW5kIHdlIG5vdyB3cml0ZSB0aGVtIG91dC4gICovCisgIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlICYmIHJlbF9zaXplID4gMCkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGZpbmZvLT5vdXRwdXRfYmZkLCAqcmVsb2ZmX3B0ciwgU0VFS19TRVQpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGJmZF93cml0ZSAocmVsb2NzLCAoYmZkX3NpemVfdHlwZSkgMSwgcmVsX3NpemUsIGZpbmZvLT5vdXRwdXRfYmZkKQorCSAgIT0gcmVsX3NpemUpCisJcmV0dXJuIGZhbHNlOworICAgICAgKnJlbG9mZl9wdHIgKz0gcmVsX3NpemU7CisKKyAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIHN5bWJvbHMsIGFuZAorCSB0aGF0IGlmIHRoZXNlIGFyZSB0aGUgdGV4dCByZWxvY3MgdGhleSBoYXZlIG5vdCBydW4gaW50byB0aGUKKwkgZGF0YSByZWxvY3MuICAqLworICAgICAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKKwkJICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKKwkJICAgICAgfHwgKCpyZWxvZmZfcHRyCisJCQkgIDw9IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCktPnJlbF9maWxlcG9zKSkpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2V0IHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWxvYyBpbmRleC4gICovCisKK3N0YXRpYyBJTkxJTkUgYXNlY3Rpb24gKgorYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChhYmZkLCBpbmR4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBpbmR4OworeworICBzd2l0Y2ggKGluZHggJiBOX1RZUEUpCisgICAgeworICAgIGNhc2UgTl9URVhUOgorICAgICAgcmV0dXJuIG9ial90ZXh0c2VjIChhYmZkKTsKKyAgICBjYXNlIE5fREFUQToKKyAgICAgIHJldHVybiBvYmpfZGF0YXNlYyAoYWJmZCk7CisgICAgY2FzZSBOX0JTUzoKKyAgICAgIHJldHVybiBvYmpfYnNzc2VjIChhYmZkKTsKKyAgICBjYXNlIE5fQUJTOgorICAgIGNhc2UgTl9VTkRGOgorICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogUmVsb2NhdGUgYW4gYS5vdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCBhLm91dCByZWxvY3MuICAqLworCitzdGF0aWMgYm9vbGVhbgorYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY3MsCisJCQkgICAgIHJlbF9zaXplLCBjb250ZW50cykKKyAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7CisgICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKK3sKKyAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgYmZkICosIGFzZWN0aW9uICosCisJCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosCisJCQkJCSAgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCisJCQkJCSAgYmZkX3ZtYSAqKSk7CisgIGJmZCAqb3V0cHV0X2JmZDsKKyAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKKyAgY2hhciAqc3RyaW5nczsKKyAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgaW50ICpzeW1ib2xfbWFwOworICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OworICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWw7CisgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbF9lbmQ7CisKKyAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOworICBjaGVja19keW5hbWljX3JlbG9jID0gYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT5jaGVja19keW5hbWljX3JlbG9jOworCisgIEJGRF9BU1NFUlQgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKTsKKyAgQkZEX0FTU0VSVCAoaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCisJICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcik7CisKKyAgcmVsb2NhdGVhYmxlID0gZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZTsKKyAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7CisgIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChpbnB1dF9iZmQpOworICBzeW1faGFzaGVzID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOworCisgIHJlbG9jX2NvdW50ID0gcmVsX3NpemUgLyBSRUxPQ19TVERfU0laRTsKKyAgcmVsID0gcmVsb2NzOworICByZWxfZW5kID0gcmVsICsgcmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxfZW5kOyByZWwrKykKKyAgICB7CisgICAgICBiZmRfdm1hIHJfYWRkcjsKKyAgICAgIGludCByX2luZGV4OworICAgICAgaW50IHJfZXh0ZXJuOworICAgICAgaW50IHJfcGNyZWw7CisgICAgICBpbnQgcl9iYXNlcmVsID0gMDsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKKyAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOworCisgICAgICByX2FkZHIgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZHJlc3MpOworCisjaWZkZWYgTVlfcmVsb2NfaG93dG8KKyAgICAgIGhvd3RvID0gTVlfcmVsb2NfaG93dG8oaW5wdXRfYmZkLCByZWwsIHJfaW5kZXgsIHJfZXh0ZXJuLCByX3BjcmVsKTsKKyNlbHNlICAgICAgCisgICAgICB7CisJaW50IHJfam1wdGFibGU7CisJaW50IHJfcmVsYXRpdmU7CisJaW50IHJfbGVuZ3RoOworCXVuc2lnbmVkIGludCBob3d0b19pZHg7CisKKwlpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQorCSAgeworCSAgICByX2luZGV4ICAgPSAgKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCisJCQkgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQorCQkJICB8IHJlbC0+cl9pbmRleFsyXSk7CisJICAgIHJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpKTsKKwkgICAgcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7CisJICAgIHJfYmFzZXJlbCA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7CisJICAgIHJfam1wdGFibGU9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOworCSAgICByX3JlbGF0aXZlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKKwkgICAgcl9sZW5ndGggID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCisJCQkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7CisJICB9CisJZWxzZQorCSAgeworCSAgICByX2luZGV4ICAgPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKKwkJCSB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKKwkJCSB8IHJlbC0+cl9pbmRleFswXSk7CisJICAgIHJfZXh0ZXJuICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKKwkgICAgcl9wY3JlbCAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFKSk7CisJICAgIHJfYmFzZXJlbCA9ICgwICE9IChyZWwtPnJfdHlwZVswXQorCQkJICAgICAgICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKKwkgICAgcl9qbXB0YWJsZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCisJCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKKwkgICAgcl9yZWxhdGl2ZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCisJCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUpKTsKKwkgICAgcl9sZW5ndGggID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpCisJCQkgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7CisJICB9CisKKwlob3d0b19pZHggPSAocl9sZW5ndGggKyA0ICogcl9wY3JlbCArIDggKiByX2Jhc2VyZWwKKwkJICAgICArIDE2ICogcl9qbXB0YWJsZSArIDMyICogcl9yZWxhdGl2ZSk7CisJQkZEX0FTU0VSVCAoaG93dG9faWR4IDwgVEFCTEVfU0laRSAoaG93dG9fdGFibGVfc3RkKSk7CisJaG93dG8gPSBob3d0b190YWJsZV9zdGQgKyBob3d0b19pZHg7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgYW5kIG11c3QKKwkgICAgIG1vZGlmeSB0aGUgcmVsb2MgYWNjb3JkaW5nbHkuICAqLworCSAgaWYgKHJfZXh0ZXJuKQorCSAgICB7CisJICAgICAgLyogSWYgd2Uga25vdyB0aGUgc3ltYm9sIHRoaXMgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0LAorCQkgY29udmVydCBpdCBpbnRvIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoaXMKKwkJIGlzIHdoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgZG9lcy4gICovCisJICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07CisJICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisJCXsKKwkJICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisKKwkJICAvKiBDaGFuZ2UgdGhlIHJfZXh0ZXJuIHZhbHVlLiAgKi8KKwkJICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKKwkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOworCQkgIGVsc2UKKwkJICAgIHJlbC0+cl90eXBlWzBdICY9fiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOworCisJCSAgLyogQ29tcHV0ZSBhIG5ldyByX2luZGV4LiAgKi8KKwkJICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisJCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKKwkJICAgIHJfaW5kZXggPSBOX1RFWFQ7CisJCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQorCQkgICAgcl9pbmRleCA9IE5fREFUQTsKKwkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKKwkJICAgIHJfaW5kZXggPSBOX0JTUzsKKwkJICBlbHNlCisJCSAgICByX2luZGV4ID0gTl9BQlM7CisKKwkJICAvKiBBZGQgdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZQorCQkgICAgIGFkZGVuZCBzdG9yZWQgaW4gdGhlIGNvbnRlbnRzLiAgKi8KKwkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCQkrIG91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBXZSBtdXN0IGNoYW5nZSByX2luZGV4IGFjY29yZGluZyB0byB0aGUgc3ltYm9sCisJCSAgICAgbWFwLiAgKi8KKwkJICByX2luZGV4ID0gc3ltYm9sX21hcFtyX2luZGV4XTsKKworCQkgIGlmIChyX2luZGV4ID09IC0xKQorCQkgICAgeworCQkgICAgICBpZiAoaCAhPSBOVUxMKQorCQkJeworCQkJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybnMgb3V0IHRoYXQgd2UgY2FuJ3QuICBOb3RlIHRoYXQgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24gaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbC4gICovCisJCQkgIGlmIChoLT5pbmR4IDwgMCkKKwkJCSAgICB7CisJCQkgICAgICBoLT5pbmR4ID0gLTI7CisJCQkgICAgICBoLT53cml0dGVuID0gZmFsc2U7CisJCQkgICAgICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLAorCQkJCQkJCQkgIChQVFIpIGZpbmZvKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkgICAgfQorCQkJICByX2luZGV4ID0gaC0+aW5keDsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBjb25zdCBjaGFyICpuYW1lOworCisJCQkgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKKwkJCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOworCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQorCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkgIHJfYWRkcikpKQorCQkJICAgIHJldHVybiBmYWxzZTsKKwkJCSAgcl9pbmRleCA9IDA7CisJCQl9CisJCSAgICB9CisKKwkJICByZWxvY2F0aW9uID0gMDsKKwkJfQorCisJICAgICAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9pbmRleCB2YWx1ZS4gICovCisJICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCisJCXsKKwkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OworCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKwkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKwkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisJCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleDsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKworCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgV2UgbXVzdAorCQkgYWRqdXN0IGJ5IHRoZSBhbW91bnQgdGhhdCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCisJICAgICAgc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKKwkgICAgICByZWxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgICAtIHNlY3Rpb24tPnZtYSk7CisJICAgIH0KKworCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KKwkgIFBVVF9XT1JEIChvdXRwdXRfYmZkLAorCQkgICAgcl9hZGRyICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCwKKwkJICAgIHJlbC0+cl9hZGRyZXNzKTsKKworCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlCisJICAgICB0byB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgc2VjdGlvbiBhbmQgaW5jbHVkaW5nIHRoZQorCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBuZXcgYWRkcmVzcy4gICovCisJICBpZiAocl9wY3JlbCkKKwkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7CisKKyNpZmRlZiBNWV9yZWxvY2F0YWJsZV9yZWxvYworCSAgTVlfcmVsb2NhdGFibGVfcmVsb2MgKGhvd3RvLCBvdXRwdXRfYmZkLCByZWwsIHJlbG9jYXRpb24sIHJfYWRkcik7CisjZW5kaWYKKworCSAgaWYgKHJlbG9jYXRpb24gPT0gMCkKKwkgICAgciA9IGJmZF9yZWxvY19vazsKKwkgIGVsc2UKKwkgICAgciA9IE1ZX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKKwkJCQkJaW5wdXRfYmZkLCByZWxvY2F0aW9uLAorCQkJCQljb250ZW50cyArIHJfYWRkcik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJvb2xlYW4gaHVuZGVmOworCisJICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlLCBhbmQgbXVzdCBkbyBhIGZ1bGwKKwkgICAgIHJlbG9jYXRpb24uICAqLworCSAgaHVuZGVmID0gZmFsc2U7CisKKwkgIGlmIChyX2V4dGVybikKKwkgICAgeworCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOworCisJICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisJCXsKKwkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJCSAgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJCXJlbG9jYXRpb24gPSAwOworCSAgICAgIGVsc2UKKwkJeworCQkgIGh1bmRlZiA9IHRydWU7CisJCSAgcmVsb2NhdGlvbiA9IDA7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisKKwkgICAgICBzZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOworCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCQkJICAgIC0gc2VjdGlvbi0+dm1hKTsKKwkgICAgICBpZiAocl9wY3JlbCkKKwkJcmVsb2NhdGlvbiArPSBpbnB1dF9zZWN0aW9uLT52bWE7CisJICAgIH0KKworCSAgaWYgKGNoZWNrX2R5bmFtaWNfcmVsb2MgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGJvb2xlYW4gc2tpcDsKKworCSAgICAgIGlmICghICgoKmNoZWNrX2R5bmFtaWNfcmVsb2MpCisJCSAgICAgKGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGgsCisJCSAgICAgIChQVFIpIHJlbCwgY29udGVudHMsICZza2lwLCAmcmVsb2NhdGlvbikpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgaWYgKHNraXApCisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIE5vdyB3YXJuIGlmIGEgZ2xvYmFsIHN5bWJvbCBpcyB1bmRlZmluZWQuICBXZSBjb3VsZCBub3QKKyAgICAgICAgICAgICBkbyB0aGlzIGVhcmxpZXIsIGJlY2F1c2UgY2hlY2tfZHluYW1pY19yZWxvYyBtaWdodCB3YW50CisgICAgICAgICAgICAgdG8gc2tpcCB0aGlzIHJlbG9jLiAgKi8KKwkgIGlmIChodW5kZWYgJiYgISBmaW5mby0+aW5mby0+c2hhcmVkICYmICEgcl9iYXNlcmVsKQorCSAgICB7CisJICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworCSAgICAgIGlmIChoICE9IE5VTEwpCisJCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCSAgICAgIGVsc2UKKwkJbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7CisJICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICByID0gTVlfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCisJCQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICAgIGNvbnRlbnRzLCByX2FkZHIsIHJlbG9jYXRpb24sCisJCQkJICAgICAgKGJmZF92bWEpIDApOworCX0KKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgICAgIGFib3J0ICgpOworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJaWYgKGggIT0gTlVMTCkKKwkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkJZWxzZSBpZiAocl9leHRlcm4pCisJCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAorCQkJCQkgICAgIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGFzZWN0aW9uICpzOworCisJCSAgICBzID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOworCQkgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgcyk7CisJCSAgfQorCQlpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaG93dG8tPm5hbWUsCisJCQkoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVsb2NhdGUgYW4gYS5vdXQgc2VjdGlvbiB1c2luZyBleHRlbmRlZCBhLm91dCByZWxvY3MuICAqLworCitzdGF0aWMgYm9vbGVhbgorYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0IChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY3MsCisJCQkgICAgIHJlbF9zaXplLCBjb250ZW50cykKKyAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWxvY3M7CisgICAgIGJmZF9zaXplX3R5cGUgcmVsX3NpemU7CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKK3sKKyAgYm9vbGVhbiAoKmNoZWNrX2R5bmFtaWNfcmVsb2MpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgYmZkICosIGFzZWN0aW9uICosCisJCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosCisJCQkJCSAgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCisJCQkJCSAgYmZkX3ZtYSAqKSk7CisgIGJmZCAqb3V0cHV0X2JmZDsKKyAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltczsKKyAgY2hhciAqc3RyaW5nczsKKyAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgaW50ICpzeW1ib2xfbWFwOworICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OworICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWw7CisgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbF9lbmQ7CisKKyAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOworICBjaGVja19keW5hbWljX3JlbG9jID0gYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT5jaGVja19keW5hbWljX3JlbG9jOworCisgIEJGRF9BU1NFUlQgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX0VYVF9TSVpFKTsKKyAgQkZEX0FTU0VSVCAoaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCisJICAgICAgPT0gb3V0cHV0X2JmZC0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcik7CisKKyAgcmVsb2NhdGVhYmxlID0gZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZTsKKyAgc3ltcyA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7CisgIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChpbnB1dF9iZmQpOworICBzeW1faGFzaGVzID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOworCisgIHJlbG9jX2NvdW50ID0gcmVsX3NpemUgLyBSRUxPQ19FWFRfU0laRTsKKyAgcmVsID0gcmVsb2NzOworICByZWxfZW5kID0gcmVsICsgcmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxfZW5kOyByZWwrKykKKyAgICB7CisgICAgICBiZmRfdm1hIHJfYWRkcjsKKyAgICAgIGludCByX2luZGV4OworICAgICAgaW50IHJfZXh0ZXJuOworICAgICAgdW5zaWduZWQgaW50IHJfdHlwZTsKKyAgICAgIGJmZF92bWEgcl9hZGRlbmQ7CisgICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOworICAgICAgYXNlY3Rpb24gKnJfc2VjdGlvbiA9IE5VTEw7CisgICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisKKyAgICAgIHJfYWRkciA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkcmVzcyk7CisKKyAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCisJeworCSAgcl9pbmRleCAgPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKKwkJICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCisJCSAgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKKwkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOworCSAgcl90eXBlICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcpCisJCSAgICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcl9pbmRleCAgPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKKwkJICAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCisJCSAgICAgIHwgcmVsLT5yX2luZGV4WzBdKTsKKwkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOworCSAgcl90eXBlICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCisJCSAgICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKKwl9CisKKyAgICAgIHJfYWRkZW5kID0gR0VUX1NXT1JEIChpbnB1dF9iZmQsIHJlbC0+cl9hZGRlbmQpOworCisgICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9leHQpKTsKKworICAgICAgaWYgKHJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSwgYW5kIG11c3QKKwkgICAgIG1vZGlmeSB0aGUgcmVsb2MgYWNjb3JkaW5nbHkuICAqLworCSAgaWYgKHJfZXh0ZXJuCisJICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMAorCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKKwkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQorCSAgICB7CisJICAgICAgLyogSWYgd2Uga25vdyB0aGUgc3ltYm9sIHRoaXMgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0LAorCQkgY29udmVydCBpdCBpbnRvIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoaXMKKwkJIGlzIHdoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgZG9lcy4gICovCisJICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKKwkJICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCisJCSAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKKwkJaCA9IE5VTEw7CisJICAgICAgZWxzZQorCQloID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKKwkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwkJeworCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKworCQkgIC8qIENoYW5nZSB0aGUgcl9leHRlcm4gdmFsdWUuICAqLworCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQorCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUc7CisJCSAgZWxzZQorCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEU7CisKKwkJICAvKiBDb21wdXRlIGEgbmV3IHJfaW5kZXguICAqLworCQkgIG91dHB1dF9zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKwkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQorCQkgICAgcl9pbmRleCA9IE5fVEVYVDsKKwkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCisJCSAgICByX2luZGV4ID0gTl9EQVRBOworCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQorCQkgICAgcl9pbmRleCA9IE5fQlNTOworCQkgIGVsc2UKKwkJICAgIHJfaW5kZXggPSBOX0FCUzsKKworCQkgIC8qIEFkZCB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlCisJCSAgICAgYWRkZW5kLiAgKi8KKwkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCQkrIG91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisKKwkJICAvKiBOb3cgUkVMT0NBVElPTiBpcyB0aGUgVk1BIG9mIHRoZSBmaW5hbAorCQkgICAgIGRlc3RpbmF0aW9uLiAgSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLAorCQkgICAgIHRoZW4gQURERU5EIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgc291cmNlIFZNQS4KKwkJICAgICBXZSB3YW50IHRvIHNldCBBRERFTkQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorCQkgICAgIHRoZSBkZXN0aW5hdGlvbiBWTUEgYW5kIHRoZSBzb3VyY2UgVk1BLCB3aGljaAorCQkgICAgIG1lYW5zIHdlIG11c3QgYWRqdXN0IFJFTE9DQVRJT04gYnkgdGhlIGNoYW5nZSBpbgorCQkgICAgIHRoZSBzb3VyY2UgVk1BLiAgVGhpcyBpcyBkb25lIGJlbG93LiAgKi8KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFdlIG11c3QgY2hhbmdlIHJfaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wKKwkJICAgICBtYXAuICAqLworCQkgIHJfaW5kZXggPSBzeW1ib2xfbWFwW3JfaW5kZXhdOworCisJCSAgaWYgKHJfaW5kZXggPT0gLTEpCisJCSAgICB7CisJCSAgICAgIGlmIChoICE9IE5VTEwpCisJCQl7CisJCQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndC4gIE5vdGUgdGhhdCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NlIHRoZSBvdGhlciBhbmQgZGVzYyBpbmZvcm1hdGlvbiBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLiAgKi8KKwkJCSAgaWYgKGgtPmluZHggPCAwKQorCQkJICAgIHsKKwkJCSAgICAgIGgtPmluZHggPSAtMjsKKwkJCSAgICAgIGgtPndyaXR0ZW4gPSBmYWxzZTsKKwkJCSAgICAgIGlmICghIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsCisJCQkJCQkJCSAgKFBUUikgZmluZm8pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCSAgICB9CisJCQkgIHJfaW5kZXggPSBoLT5pbmR4OworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAorCQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7CisJCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCisJCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgcl9hZGRyKSkpCisJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJICByX2luZGV4ID0gMDsKKwkJCX0KKwkJICAgIH0KKworCQkgIHJlbG9jYXRpb24gPSAwOworCisJCSAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIHRoZSBhZGRlbmQKKwkJICAgICBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIHNvdXJjZSBWTUEuICBXZSBtdXN0CisJCSAgICAgYWRqdXN0IGl0IGJ5IHRoZSBjaGFuZ2UgaW4gdGhlIHNvdXJjZSBWTUEuICBUaGlzCisJCSAgICAgaXMgZG9uZSBiZWxvdy4gICovCisJCX0KKworCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgbmV3IHJfaW5kZXggdmFsdWUuICAqLworCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQorCQl7CisJCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKKwkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisJCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7CisJCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OworCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXg7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBXZSBtdXN0CisJCSBhZGp1c3QgYnkgdGhlIGFtb3VudCB0aGF0IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KKwkgICAgICByX3NlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7CisJICAgICAgcmVsb2NhdGlvbiA9IChyX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCQkJICAgIC0gcl9zZWN0aW9uLT52bWEpOworCisJICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIHRoZSBhZGRlbmQgaXMKKwkJIHRoZSBkaWZmZXJlbmNlIGluIFZNQSBiZXR3ZWVuIHRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlCisJCSBzb3VyY2UuICBXZSBoYXZlIGp1c3QgYWRqdXN0ZWQgZm9yIHRoZSBjaGFuZ2UgaW4gVk1BCisJCSBvZiB0aGUgZGVzdGluYXRpb24sIHNvIHdlIG11c3QgYWxzbyBhZGp1c3QgYnkgdGhlCisJCSBjaGFuZ2UgaW4gVk1BIG9mIHRoZSBzb3VyY2UuICBUaGlzIGlzIGRvbmUgYmVsb3cuICAqLworCSAgICB9CisKKwkgIC8qIEFzIGRlc2NyaWJlZCBhYm92ZSwgd2UgbXVzdCBhbHdheXMgYWRqdXN0IGEgUEMgcmVsYXRpdmUKKwkgICAgIHJlbG9jIGJ5IHRoZSBjaGFuZ2UgaW4gVk1BIG9mIHRoZSBzb3VyY2UuICBIb3dldmVyLCBpZgorCSAgICAgcGNyZWxfb2Zmc2V0IGlzIHNldCwgdGhlbiB0aGUgYWRkZW5kIGRvZXMgbm90IGluY2x1ZGUgdGhlCisJICAgICBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgbmVlZAorCSAgICAgdG8gYWRqdXN0IGFueXRoaW5nLiAgKi8KKwkgIGlmIChob3d0b190YWJsZV9leHRbcl90eXBlXS5wY19yZWxhdGl2ZQorCSAgICAgICYmICEgaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNyZWxfb2Zmc2V0KQorCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKKworCSAgLyogQ2hhbmdlIHRoZSBhZGRlbmQgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIGlmIChyZWxvY2F0aW9uICE9IDApCisJICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZGVuZCArIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOworCisJICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLworCSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCisJCSAgICByX2FkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAorCQkgICAgcmVsLT5yX2FkZHJlc3MpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBib29sZWFuIGh1bmRlZjsKKwkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOworCisJICAvKiBXZSBhcmUgZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlLCBhbmQgbXVzdCBkbyBhIGZ1bGwKKwkgICAgIHJlbG9jYXRpb24uICAqLworCSAgaHVuZGVmID0gZmFsc2U7CisKKwkgIGlmIChyX2V4dGVybikKKwkgICAgeworCSAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOworCisJICAgICAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisJCXsKKwkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJCSAgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJCXJlbG9jYXRpb24gPSAwOworCSAgICAgIGVsc2UKKwkJeworCQkgIGh1bmRlZiA9IHRydWU7CisJCSAgcmVsb2NhdGlvbiA9IDA7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAocl90eXBlID09IFJFTE9DX0JBU0UxMAorCQkgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCisJCSAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bTsKKwkgICAgICBpbnQgdHlwZTsKKworCSAgICAgIC8qIEZvciBiYXNlIHJlbGF0aXZlIHJlbG9jcywgcl9pbmRleCBpcyBhbHdheXMgYW4gaW5kZXgKKyAgICAgICAgICAgICAgICAgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBldmVuIGlmIHJfZXh0ZXJuIGlzIDAuICAqLworCSAgICAgIHN5bSA9IHN5bXMgKyByX2luZGV4OworCSAgICAgIHR5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBzeW0tPmVfdHlwZSk7CisJICAgICAgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX1RFWFQKKwkJICB8fCB0eXBlID09IE5fV0VBS1QpCisJCXJfc2VjdGlvbiA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOworCSAgICAgIGVsc2UgaWYgKCh0eXBlICYgTl9UWVBFKSA9PSBOX0RBVEEKKwkJICAgICAgIHx8IHR5cGUgPT0gTl9XRUFLRCkKKwkJcl9zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7CisJICAgICAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQlNTCisJCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0IpCisJCXJfc2VjdGlvbiA9IG9ial9ic3NzZWMgKGlucHV0X2JmZCk7CisJICAgICAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQUJTCisJCSAgICAgICB8fCB0eXBlID09IE5fV0VBS0EpCisJCXJfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICAgICAgZWxzZQorCQlhYm9ydCAoKTsKKwkgICAgICByZWxvY2F0aW9uID0gKHJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgcl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgKyAoR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKQorCQkJICAgICAgIC0gcl9zZWN0aW9uLT52bWEpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcl9zZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOworCisJICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIFJfQURERU5EIGlzIHRoZQorCQkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdm1hcywgb3IKKwkJICAgb2xkX2Rlc3Rfc2VjICsgb2xkX2Rlc3Rfb2ZmIC0gKG9sZF9zcmNfc2VjICsgb2xkX3NyY19vZmYpCisJCSB3aGVyZQorCQkgICBvbGRfZGVzdF9zZWMgPT0gc2VjdGlvbi0+dm1hCisJCSBhbmQKKwkJICAgb2xkX3NyY19zZWMgPT0gaW5wdXRfc2VjdGlvbi0+dm1hCisJCSBhbmQKKwkJICAgb2xkX3NyY19vZmYgPT0gcl9hZGRyCisKKwkJIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSBleHBlY3RzIFJFTE9DQVRJT04gKworCQkgUl9BRERFTkQgdG8gYmUgdGhlIFZNQSBvZiB0aGUgZGVzdGluYXRpb24gbWludXMKKwkJIHJfYWRkciAodGhlIG1pbnVzIHJfYWRkciBpcyBiZWNhdXNlIHRoaXMgcmVsb2NhdGlvbgorCQkgaXMgbm90IHBjcmVsX29mZnNldCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nIGFuZAorCQkgc2hvdWxkLCBwZXJoYXBzLCBiZSBjaGFuZ2VkKSwgb3IKKwkJICAgbmV3X2Rlc3Rfc2VjCisJCSB3aGVyZQorCQkgICBuZXdfZGVzdF9zZWMgPT0gb3V0cHV0X3NlY3Rpb24tPnZtYSArIG91dHB1dF9vZmZzZXQKKwkJIFdlIGFycmFuZ2UgZm9yIHRoaXMgdG8gaGFwcGVuIGJ5IHNldHRpbmcgUkVMT0NBVElPTiB0bworCQkgICBuZXdfZGVzdF9zZWMgKyBvbGRfc3JjX3NlYyAtIG9sZF9kZXN0X3NlYworCisJCSBJZiB0aGlzIGlzIG5vdCBhIFBDIHJlbGF0aXZlIHJlbG9jLCB0aGVuIFJfQURERU5EIGlzCisJCSBzaW1wbHkgdGhlIFZNQSBvZiB0aGUgZGVzdGluYXRpb24sIHNvIHdlIHNldAorCQkgUkVMT0NBVElPTiB0byB0aGUgY2hhbmdlIGluIHRoZSBkZXN0aW5hdGlvbiBWTUEsIG9yCisJCSAgIG5ld19kZXN0X3NlYyAtIG9sZF9kZXN0X3NlYworCQkgKi8KKwkgICAgICByZWxvY2F0aW9uID0gKHJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgcl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgLSByX3NlY3Rpb24tPnZtYSk7CisJICAgICAgaWYgKGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjX3JlbGF0aXZlKQorCQlyZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKKwkgICAgfQorCisJICBpZiAoY2hlY2tfZHluYW1pY19yZWxvYyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYm9vbGVhbiBza2lwOworCisJICAgICAgaWYgKCEgKCgqY2hlY2tfZHluYW1pY19yZWxvYykKKwkJICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwKKwkJICAgICAgKFBUUikgcmVsLCBjb250ZW50cywgJnNraXAsICZyZWxvY2F0aW9uKSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBpZiAoc2tpcCkKKwkJY29udGludWU7CisJICAgIH0KKworCSAgLyogTm93IHdhcm4gaWYgYSBnbG9iYWwgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIFdlIGNvdWxkIG5vdAorICAgICAgICAgICAgIGRvIHRoaXMgZWFybGllciwgYmVjYXVzZSBjaGVja19keW5hbWljX3JlbG9jIG1pZ2h0IHdhbnQKKyAgICAgICAgICAgICB0byBza2lwIHRoaXMgcmVsb2MuICAqLworCSAgaWYgKGh1bmRlZgorCSAgICAgICYmICEgZmluZm8tPmluZm8tPnNoYXJlZAorCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMTAKKwkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTEzCisJICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UyMikKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkgICAgICBpZiAoaCAhPSBOVUxMKQorCQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkgICAgICBlbHNlCisJCW5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltc1tyX2luZGV4XS5lX3N0cngpOworCSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaWYgKHJfdHlwZSAhPSBSRUxPQ19TUEFSQ19SRVYzMikKKwkgICAgciA9IE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvX3RhYmxlX2V4dCArIHJfdHlwZSwKKwkJCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQljb250ZW50cywgcl9hZGRyLCByZWxvY2F0aW9uLAorCQkJCQlyX2FkZGVuZCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfdm1hIHg7CisKKwkgICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJfYWRkcik7CisJICAgICAgeCA9IHggKyByZWxvY2F0aW9uICsgcl9hZGRlbmQ7CisJICAgICAgYmZkX3B1dGwzMiAoLyppbnB1dF9iZmQsKi8geCwgY29udGVudHMgKyByX2FkZHIpOworCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7CisJICAgIH0KKworCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCSAgICB7CisJICAgICAgc3dpdGNoIChyKQorCQl7CisJCWRlZmF1bHQ6CisJCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJCSAgYWJvcnQgKCk7CisJCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCQkgIHsKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJICAgIGlmIChoICE9IE5VTEwpCisJCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCQkgICAgZWxzZSBpZiAocl9leHRlcm4KKwkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMAorCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCisJCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCisJCSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGlucHV0X2JmZCwKKwkJCQkJCSBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCWFzZWN0aW9uICpzOworCisJCQlzID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOworCQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgcyk7CisJCSAgICAgIH0KKwkJICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkJICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBob3d0b190YWJsZV9leHRbcl90eXBlXS5uYW1lLAorCQkJICAgIHJfYWRkZW5kLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgfQorCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBIYW5kbGUgYSBsaW5rIG9yZGVyIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGdlbmVyYXRlIGEgcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIgKGZpbmZvLCBvLCBwKQorICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOworICAgICBhc2VjdGlvbiAqbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworeworICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKnByOworICBpbnQgcl9pbmRleDsKKyAgaW50IHJfZXh0ZXJuOworICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgZmlsZV9wdHIgKnJlbG9mZl9wdHI7CisgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgc3JlbDsKKyAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCBlcmVsOworICBQVFIgcmVsX3B0cjsKKworICBwciA9IHAtPnUucmVsb2MucDsKKworICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyKQorICAgIHsKKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHByLT51LnNlY3Rpb24pKQorCXJfaW5kZXggPSBOX0FCUyB8IE5fRVhUOworICAgICAgZWxzZQorCXsKKwkgIEJGRF9BU1NFUlQgKHByLT51LnNlY3Rpb24tPm93bmVyID09IGZpbmZvLT5vdXRwdXRfYmZkKTsKKwkgIHJfaW5kZXggPSBwci0+dS5zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgQkZEX0FTU0VSVCAocC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpOworICAgICAgcl9leHRlcm4gPSAxOworICAgICAgaCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCisJICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAorCQkJCQkgcHItPnUubmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7CisgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICYmIGgtPmluZHggPj0gMCkKKwlyX2luZGV4ID0gaC0+aW5keDsKKyAgICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwl7CisJICAvKiBXZSBkZWNpZGVkIHRvIHN0cmlwIHRoaXMgc3ltYm9sLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgd2UKKwkgICAgIGNhbid0LiAgTm90ZSB0aGF0IHdlIGxvc2UgdGhlIG90aGVyIGFuZCBkZXNjIGluZm9ybWF0aW9uCisJICAgICBoZXJlLiAgSSBkb24ndCB0aGluayB0aGF0IHdpbGwgZXZlciBtYXR0ZXIgZm9yIGEgZ2xvYmFsCisJICAgICBzeW1ib2wuICAqLworCSAgaC0+aW5keCA9IC0yOworCSAgaC0+d3JpdHRlbiA9IGZhbHNlOworCSAgaWYgKCEgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwgKFBUUikgZmluZm8pKQorCSAgICByZXR1cm4gZmFsc2U7CisJICByX2luZGV4ID0gaC0+aW5keDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKKwkJIChmaW5mby0+aW5mbywgcHItPnUubmFtZSwgKGJmZCAqKSBOVUxMLAorCQkgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICByX2luZGV4ID0gMDsKKwl9CisgICAgfQorCisgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChmaW5mby0+b3V0cHV0X2JmZCwgcHItPnJlbG9jKTsKKyAgaWYgKGhvd3RvID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChvID09IG9ial90ZXh0c2VjIChmaW5mby0+b3V0cHV0X2JmZCkpCisgICAgcmVsb2ZmX3B0ciA9ICZmaW5mby0+dHJlbG9mZjsKKyAgZWxzZSBpZiAobyA9PSBvYmpfZGF0YXNlYyAoZmluZm8tPm91dHB1dF9iZmQpKQorICAgIHJlbG9mZl9wdHIgPSAmZmluZm8tPmRyZWxvZmY7CisgIGVsc2UKKyAgICBhYm9ydCAoKTsKKworICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKKyAgICB7CisjaWZkZWYgTVlfcHV0X3JlbG9jCisgICAgICBNWV9wdXRfcmVsb2MoZmluZm8tPm91dHB1dF9iZmQsIHJfZXh0ZXJuLCByX2luZGV4LCBwLT5vZmZzZXQsIGhvd3RvLAorCQkgICAmc3JlbCk7CisjZWxzZQorICAgICAgeworCWludCByX3BjcmVsOworCWludCByX2Jhc2VyZWw7CisJaW50IHJfam1wdGFibGU7CisJaW50IHJfcmVsYXRpdmU7CisJaW50IHJfbGVuZ3RoOworCisJcl9wY3JlbCA9IGhvd3RvLT5wY19yZWxhdGl2ZTsKKwlyX2Jhc2VyZWwgPSAoaG93dG8tPnR5cGUgJiA4KSAhPSAwOworCXJfam1wdGFibGUgPSAoaG93dG8tPnR5cGUgJiAxNikgIT0gMDsKKwlyX3JlbGF0aXZlID0gKGhvd3RvLT50eXBlICYgMzIpICE9IDA7CisJcl9sZW5ndGggPSBob3d0by0+c2l6ZTsKKworCVBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcC0+b2Zmc2V0LCBzcmVsLnJfYWRkcmVzcyk7CisJaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZmluZm8tPm91dHB1dF9iZmQpKQorCSAgeworCSAgICBzcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OworCSAgICBzcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisJICAgIHNyZWwucl9pbmRleFsyXSA9IHJfaW5kZXg7CisJICAgIHNyZWwucl90eXBlWzBdID0KKwkgICAgICAoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQorCSAgICAgICB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHIDogMCkKKwkgICAgICAgfCAocl9iYXNlcmVsID8gIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKKwkgICAgICAgfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRyA6IDApCisJICAgICAgIHwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcgOiAwKQorCSAgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRykpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgc3JlbC5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKwkgICAgc3JlbC5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OworCSAgICBzcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4OworCSAgICBzcmVsLnJfdHlwZVswXSA9CisJICAgICAgKChyX2V4dGVybiA/ICAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKKwkgICAgICAgfCAocl9wY3JlbCA/ICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSA6IDApCisJICAgICAgIHwgKHJfYmFzZXJlbCA/ICBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCisJICAgICAgIHwgKHJfam1wdGFibGUgPyBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUgOiAwKQorCSAgICAgICB8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFIDogMCkKKwkgICAgICAgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgcmVsX3B0ciA9IChQVFIpICZzcmVsOworCisgICAgICAvKiBXZSBoYXZlIHRvIHdyaXRlIHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0IGZpbGUsIHNpbmNlCisJIHN0YW5kYXJkIGEub3V0IHJlbG9jcyBhcmUgaW4gcGxhY2UuICBJdCB3b3VsZCBiZSBtb3JlCisJIHJlbGlhYmxlIGlmIHdlIGhhZCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZmlsZSBoZXJlLAorCSByYXRoZXIgdGhhbiBhc3N1bWluZyB6ZXJvZXMsIGJ1dCB3ZSBjYW4ndCByZWFkIHRoZSBmaWxlIHNpbmNlCisJIGl0IHdhcyBvcGVuZWQgdXNpbmcgYmZkX29wZW53LiAgKi8KKyAgICAgIGlmIChwci0+YWRkZW5kICE9IDApCisJeworCSAgYmZkX3NpemVfdHlwZSBzaXplOworCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisJICBiZmRfYnl0ZSAqYnVmOworCSAgYm9vbGVhbiBvazsKKworCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOworCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKKwkgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHIgPSBNWV9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGZpbmZvLT5vdXRwdXRfYmZkLAorCQkJCSAgICAgIHByLT5hZGRlbmQsIGJ1Zik7CisJICBzd2l0Y2ggKHIpCisJICAgIHsKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb2s6CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAgICAgYWJvcnQgKCk7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgIChmaW5mby0+aW5mbywKKwkJICAgICAgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCQkgICAgICAgPyBiZmRfc2VjdGlvbl9uYW1lIChmaW5mby0+b3V0cHV0X2JmZCwKKwkJCQkJICAgcHItPnUuc2VjdGlvbikKKwkJICAgICAgIDogcHItPnUubmFtZSksCisJCSAgICAgIGhvd3RvLT5uYW1lLCBwci0+YWRkZW5kLCAoYmZkICopIE5VTEwsCisJCSAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQorCQl7CisJCSAgZnJlZSAoYnVmKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGZpbmZvLT5vdXRwdXRfYmZkLCBvLAorCQkJCQkgKFBUUikgYnVmLAorCQkJCQkgKGZpbGVfcHRyKSBwLT5vZmZzZXQsCisJCQkJCSBzaXplKTsKKwkgIGZyZWUgKGJ1Zik7CisJICBpZiAoISBvaykKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHAtPm9mZnNldCwgZXJlbC5yX2FkZHJlc3MpOworCisgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChmaW5mby0+b3V0cHV0X2JmZCkpCisJeworCSAgZXJlbC5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKKwkgIGVyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKwkgIGVyZWwucl9pbmRleFsyXSA9IHJfaW5kZXg7CisJICBlcmVsLnJfdHlwZVswXSA9CisJICAgICgocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHIDogMCkKKwkgICAgIHwgKGhvd3RvLT50eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGVyZWwucl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7CisJICBlcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisJICBlcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4OworCSAgZXJlbC5yX3R5cGVbMF0gPQorCSAgICAocl9leHRlcm4gPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFIDogMCkKKwkgICAgICB8IChob3d0by0+dHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7CisJfQorCisgICAgICBQVVRfV09SRCAoZmluZm8tPm91dHB1dF9iZmQsIHByLT5hZGRlbmQsIGVyZWwucl9hZGRlbmQpOworCisgICAgICByZWxfcHRyID0gKFBUUikgJmVyZWw7CisgICAgfQorCisgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsICpyZWxvZmZfcHRyLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgKGJmZF93cml0ZSAocmVsX3B0ciwgKGJmZF9zaXplX3R5cGUpIDEsCisJCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSwKKwkJICAgICBmaW5mby0+b3V0cHV0X2JmZCkKKwkgICE9IG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICAqcmVsb2ZmX3B0ciArPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpOworCisgIC8qIEFzc2VydCB0aGF0IHRoZSByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIHN5bWJvbHMsIGFuZCB0aGF0IG4KKyAgICAgdGhlIHRleHQgcmVsb2NzIGhhdmUgbm90IHJ1biBpbnRvIHRoZSBkYXRhIHJlbG9jcy4gICovCisgIEJGRF9BU1NFUlQgKCpyZWxvZmZfcHRyIDw9IG9ial9zeW1fZmlsZXBvcyAoZmluZm8tPm91dHB1dF9iZmQpCisJICAgICAgJiYgKHJlbG9mZl9wdHIgIT0gJmZpbmZvLT50cmVsb2ZmCisJCSAgfHwgKCpyZWxvZmZfcHRyCisJCSAgICAgIDw9IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCktPnJlbF9maWxlcG9zKSkpOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmZkL2FyY2hpdmUuYyBiL2JmZC9hcmNoaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjNWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9hcmNoaXZlLmMKQEAgLTAsMCArMSwyMTI3IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIGFyY2hpdmUgZmlsZXMgKGxpYnJhcmllcykuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIE1vc3RseSBHdW1ieSBIZW5rZWwtV2FsbGFjZSdzIGZhdWx0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitAc2V0ZmlsZW5hbWUgYXJjaGl2ZS1pbmZvCitTRUNUSU9OCisJQXJjaGl2ZXMKKworREVTQ1JJUFRJT04KKwlBbiBhcmNoaXZlIChvciBsaWJyYXJ5KSBpcyBqdXN0IGFub3RoZXIgQkZELiAgSXQgaGFzIGEgc3ltYm9sCisJdGFibGUsIGFsdGhvdWdoIHRoZXJlJ3Mgbm90IG11Y2ggYSB1c2VyIHByb2dyYW0gd2lsbCBkbyB3aXRoIGl0LgorCisJVGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW4gYW4gYXJjaGl2ZSBCRkQgYW5kIGFuIG9yZGluYXJ5IEJGRAorCWlzIHRoYXQgdGhlIGFyY2hpdmUgZG9lc24ndCBoYXZlIHNlY3Rpb25zLiAgSW5zdGVhZCBpdCBoYXMgYQorCWNoYWluIG9mIEJGRHMgdGhhdCBhcmUgY29uc2lkZXJlZCBpdHMgY29udGVudHMuICBUaGVzZSBCRkRzIGNhbgorCWJlIG1hbmlwdWxhdGVkIGxpa2UgYW55IG90aGVyLiAgVGhlIEJGRHMgY29udGFpbmVkIGluIGFuCisJYXJjaGl2ZSBvcGVuZWQgZm9yIHJlYWRpbmcgd2lsbCBhbGwgYmUgb3BlbmVkIGZvciByZWFkaW5nLiAgWW91CisJbWF5IHB1dCBlaXRoZXIgaW5wdXQgb3Igb3V0cHV0IEJGRHMgaW50byBhbiBhcmNoaXZlIG9wZW5lZCBmb3IKKwlvdXRwdXQ7IHRoZXkgd2lsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSB3aGVuIHRoZSBhcmNoaXZlIGlzIGNsb3NlZC4KKworCVVzZSA8PGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGU+PiB0byBzdGVwIHRocm91Z2gKKwl0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBvcGVuZWQgZm9yIGlucHV0LiAgWW91IGRvbid0CisJaGF2ZSB0byByZWFkIHRoZSBlbnRpcmUgYXJjaGl2ZSBpZiB5b3UgZG9uJ3Qgd2FudAorCXRvISAgUmVhZCBpdCB1bnRpbCB5b3UgZmluZCB3aGF0IHlvdSB3YW50LgorCisJQXJjaGl2ZSBjb250ZW50cyBvZiBvdXRwdXQgQkZEcyBhcmUgY2hhaW5lZCB0aHJvdWdoIHRoZQorCTw8bmV4dD4+IHBvaW50ZXIgaW4gYSBCRkQuICBUaGUgZmlyc3Qgb25lIGlzIGZpbmRhYmxlIHRocm91Z2gKKwl0aGUgPDxhcmNoaXZlX2hlYWQ+PiBzbG90IG9mIHRoZSBhcmNoaXZlLiAgU2V0IGl0IHdpdGgKKwk8PGJmZF9zZXRfYXJjaGl2ZV9oZWFkPj4gKHEudi4pLiAgQSBnaXZlbiBCRkQgbWF5IGJlIGluIG9ubHkgb25lCisJb3BlbiBvdXRwdXQgYXJjaGl2ZSBhdCBhIHRpbWUuCisKKwlBcyBleHBlY3RlZCwgdGhlIEJGRCBhcmNoaXZlIGNvZGUgaXMgbW9yZSBnZW5lcmFsIHRoYW4gdGhlCisJYXJjaGl2ZSBjb2RlIG9mIGFueSBnaXZlbiBlbnZpcm9ubWVudC4gIEJGRCBhcmNoaXZlcyBtYXkKKwljb250YWluIGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzIChlLmcuLCBhLm91dCBhbmQgY29mZikgYW5kCisJZXZlbiBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gIFlvdSBtYXkgZXZlbiBwbGFjZSBhcmNoaXZlcworCXJlY3Vyc2l2ZWx5IGludG8gYXJjaGl2ZXMhCisKKwlUaGlzIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGNvbmZ1c2lvbiwgc2luY2Ugc29tZSBhcmNoaXZlCisJZm9ybWF0cyBhcmUgbW9yZSBleHByZXNzaXZlIHRoYW4gb3RoZXJzLiAgRm9yIGluc3RhbmNlLCBJbnRlbAorCUNPRkYgYXJjaGl2ZXMgY2FuIHByZXNlcnZlIGxvbmcgZmlsZW5hbWVzOyBTdW5PUyBhLm91dCBhcmNoaXZlcworCWNhbm5vdC4gIElmIHlvdSBtb3ZlIGEgZmlsZSBmcm9tIHRoZSBmaXJzdCB0byB0aGUgc2Vjb25kCisJZm9ybWF0IGFuZCBiYWNrIGFnYWluLCB0aGUgZmlsZW5hbWUgbWF5IGJlIHRydW5jYXRlZC4KKwlMaWtld2lzZSwgZGlmZmVyZW50IGEub3V0IGVudmlyb25tZW50cyBoYXZlIGRpZmZlcmVudAorCWNvbnZlbnRpb25zIGFzIHRvIGhvdyB0aGV5IHRydW5jYXRlIGZpbGVuYW1lcywgd2hldGhlciB0aGV5CisJcHJlc2VydmUgZGlyZWN0b3J5IG5hbWVzIGluIGZpbGVuYW1lcywgZXRjLiAgV2hlbgorCWludGVyb3BlcmF0aW5nIHdpdGggbmF0aXZlIHRvb2xzLCBiZSBzdXJlIHlvdXIgZmlsZXMgYXJlCisJaG9tb2dlbmVvdXMuCisKKwlCZXdhcmU6IG1vc3Qgb2YgdGhlc2UgZm9ybWF0cyBkbyBub3QgcmVhY3Qgd2VsbCB0byB0aGUKKwlwcmVzZW5jZSBvZiBzcGFjZXMgaW4gZmlsZW5hbWVzLiAgV2UgZG8gdGhlIGJlc3Qgd2UgY2FuLCBidXQKKwljYW4ndCBhbHdheXMgaGFuZGxlIHRoaXMgY2FzZSBkdWUgdG8gcmVzdHJpY3Rpb25zIGluIHRoZSBmb3JtYXQgb2YKKwlhcmNoaXZlcy4gIE1hbnkgVW5peCB1dGlsaXRpZXMgYXJlIGJyYWluZGVhZCBpbiByZWdhcmRzIHRvCisJc3BhY2VzIGFuZCBzdWNoIGluIGZpbGVuYW1lcyBhbnl3YXksIHNvIHRoaXMgc2hvdWxkbid0IGJlIG11Y2gKKwlvZiBhIHJlc3RyaWN0aW9uLgorCisJQXJjaGl2ZXMgYXJlIHN1cHBvcnRlZCBpbiBCRkQgaW4gPDxhcmNoaXZlLmM+Pi4KKworKi8KKworLyogQXNzdW1lczoKKyAgIG8gLSBhbGwgYXJjaGl2ZSBlbGVtZW50cyBzdGFydCBvbiBhbiBldmVuIGJvdW5kYXJ5LCBuZXdsaW5lIHBhZGRlZDsKKyAgIG8gLSBhbGwgYXJjaCBoZWFkZXJzIGFyZSBjaGFyICo7CisgICBvIC0gYWxsIGFyY2ggaGVhZGVycyBhcmUgdGhlIHNhbWUgc2l6ZSAoYWNyb3NzIGFyY2hpdGVjdHVyZXMpLgorKi8KKworLyogU29tZSBmb3JtYXRzIHByb3ZpZGUgYSB3YXkgdG8gY3JhbSBhIGxvbmcgZmlsZW5hbWUgaW50byB0aGUgc2hvcnQKKyAgICgxNiBjaGFycykgc3BhY2UgcHJvdmlkZWQgYnkgYSBCU0QgYXJjaGl2ZS4gIFRoZSB0cmljayBpczogbWFrZSBhCisgICBzcGVjaWFsICJmaWxlIiBpbiB0aGUgZnJvbnQgb2YgdGhlIGFyY2hpdmUsIHNvcnQgb2YgbGlrZSB0aGUgU1lNREVGCisgICBlbnRyeS4gIElmIHRoZSBmaWxlbmFtZSBpcyB0b28gbG9uZyB0byBmaXQsIHB1dCBpdCBpbiB0aGUgZXh0ZW5kZWQKKyAgIG5hbWUgdGFibGUsIGFuZCB1c2UgaXRzIGluZGV4IGFzIHRoZSBmaWxlbmFtZS4gIFRvIHByZXZlbnQKKyAgIGNvbmZ1c2lvbiBwcmVwZW5kIHRoZSBpbmRleCB3aXRoIGEgc3BhY2UuICBUaGlzIG1lYW5zIHlvdSBjYW4ndAorICAgaGF2ZSBmaWxlbmFtZXMgdGhhdCBzdGFydCB3aXRoIGEgc3BhY2UsIGJ1dCB0aGVuIGFnYWluLCBtYW55IFVuaXgKKyAgIHV0aWxpdGllcyBjYW4ndCBoYW5kbGUgdGhhdCBhbnl3YXkuCisKKyAgIFRoaXMgc2NoZW1lIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgdGhhdCB5b3Ugc3RhbmQgb24geW91ciBoZWFkIGluCisgICBvcmRlciB0byB3cml0ZSBhbiBhcmNoaXZlIHNpbmNlIHlvdSBuZWVkIHRvIHB1dCBhIG1hZ2ljIGZpbGUgYXQgdGhlCisgICBmcm9udCwgYW5kIG5lZWQgdG8gdG91Y2ggZXZlcnkgZW50cnkgdG8gZG8gc28uICBDJ2VzdCBsYSB2aWUuCisKKyAgIFdlIHN1cHBvcnQgdHdvIHZhcmlhbnRzIG9mIHRoaXMgaWRlYToKKyAgIFRoZSBTVlI0IGZvcm1hdCAoZXh0ZW5kZWQgbmFtZSB0YWJsZSBpcyBuYW1lZCAiLy8iKSwKKyAgIGFuZCBhbiBleHRlbmRlZCBwc2V1ZG8tQlNEIHZhcmlhbnQgKGV4dGVuZGVkIG5hbWUgdGFibGUgaXMgbmFtZWQKKyAgICJBUkZJTEVOQU1FUy8iKS4gIFRoZSBvcmlnaW4gb2YgdGhlIGxhdHRlciBmb3JtYXQgaXMgdW5jZXJ0YWluLgorCisgICBCU0QgNC40IHVzZXMgYSB0aGlyZCBzY2hlbWU6ICBJdCB3cml0ZXMgYSBsb25nIGZpbGVuYW1lCisgICBkaXJlY3RseSBhZnRlciB0aGUgaGVhZGVyLiAgVGhpcyBhbGxvd3MgJ2FyIHEnIHRvIHdvcmsuCisgICBXZSBjdXJyZW50bHkgY2FuIHJlYWQgQlNEIDQuNCBhcmNoaXZlcywgYnV0IG5vdCB3cml0ZSB0aGVtLgorKi8KKworLyogU3VtbWFyeSBvZiBhcmNoaXZlIG1lbWJlciBuYW1lczoKKworIFN5bWJvbCB0YWJsZSAobXVzdCBiZSBmaXJzdCk6CisgIl9fLlNZTURFRiAgICAgICAiIC0gU3ltYm9sIHRhYmxlLCBCZXJrZWxleSBzdHlsZSwgcHJvZHVjZWQgYnkgcmFubGliLgorICIvICAgICAgICAgICAgICAgIiAtIFN5bWJvbCB0YWJsZSwgc3lzdGVtIDUgc3R5bGUuCisKKyBMb25nIG5hbWUgdGFibGUgKG11c3QgYmUgYmVmb3JlIHJlZ3VsYXIgZmlsZSBtZW1iZXJzKToKKyAiLy8gICAgICAgICAgICAgICIgLSBMb25nIG5hbWUgdGFibGUsIFN5c3RlbSA1IFI0IHN0eWxlLgorICJBUkZJTEVOQU1FUy8gICAgIiAtIExvbmcgbmFtZSB0YWJsZSwgbm9uLXN0YW5kYXJkIGV4dGVuZGVkIEJTRCAobm90IEJTRCA0LjQpLgorCisgUmVndWxhciBmaWxlIG1lbWJlcnMgd2l0aCBzaG9ydCBuYW1lczoKKyAiZmlsZW5hbWUuby8gICAgICIgLSBSZWd1bGFyIGZpbGUsIFN5c3RlbSA1IHN0eWxlIChlbWJlZGRlZCBzcGFjZXMgb2spLgorICJmaWxlbmFtZS5vICAgICAgIiAtIFJlZ3VsYXIgZmlsZSwgQmVya2VsZXkgc3R5bGUgKG5vIGVtYmVkZGVkIHNwYWNlcykuCisKKyBSZWd1bGFyIGZpbGVzIHdpdGggbG9uZyBuYW1lcyAob3IgZW1iZWRkZWQgc3BhY2VzLCBmb3IgQlNEIHZhcmlhbnRzKToKKyAiLzE4ICAgICAgICAgICAgICIgLSBTVlI0IHN0eWxlLCBuYW1lIGF0IG9mZnNldCAxOCBpbiBuYW1lIHRhYmxlLgorICIjMS8yMyAgICAgICAgICAgIiAtIExvbmcgbmFtZSAob3IgZW1iZWRkZWQgcGFjZXMpIDIzIGNoYXJhY3RlcnMgbG9uZywKKwkJICAgICAgQlNEIDQuNCBzdHlsZSwgZnVsbCBuYW1lIGZvbGxvd3MgaGVhZGVyLgorCQkgICAgICBJbXBsZW1lbnRlZCBmb3IgcmVhZGluZywgbm90IHdyaXRpbmcuCisgIiAxOCAgICAgICAgICAgICAiIC0gTG9uZyBuYW1lIDE4IGNoYXJhY3RlcnMgbG9uZywgZXh0ZW5kZWQgcHNldWRvLUJTRC4KKyAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorI2luY2x1ZGUgImFvdXQvcmFubGliLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmbmRlZiBlcnJubworZXh0ZXJuIGludCBlcnJubzsKKyNlbmRpZgorCisjaWZkZWYgR05VOTYwCisjZGVmaW5lIEJGRF9HTlU5NjBfQVJNQUcoYWJmZCkJKEJGRF9DT0ZGX0ZJTEVfUCgoYWJmZCkpID8gQVJNQUcgOiBBUk1BR0IpCisjZW5kaWYKKworLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQgKi8KKworI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgodW5zaWduZWQgbG9uZykgJigoVFlQRSAqKTApLT5NRU1CRVIpCisjZW5kaWYKKworLyogV2Uga2VlcCBhIGNhY2hlIG9mIGFyY2hpdmUgZmlsZXBvaW50ZXJzIHRvIGFyY2hpdmUgZWxlbWVudHMgdG8KKyAgIHNwZWVkIHVwIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBieSBmaWxlcG9zLiAgV2Ugb25seSBhZGQgYW4gZW50cnkgdG8KKyAgIHRoZSBjYWNoZSB3aGVuIHdlIGFjdHVhbGx5IHJlYWQgb25lLiAgV2UgYWxzbyBkb24ndCBzb3J0IHRoZSBjYWNoZTsKKyAgIGl0J3MgZ2VuZXJhbGx5IHNob3J0IGVub3VnaCB0byBzZWFyY2ggbGluZWFybHkuCisgICBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGhlcmUgcG9pbnQgdG8gdGhlIGZyb250IG9mIHRoZSBhcl9oZHIsIG5vdAorICAgdG8gdGhlIGZyb250IG9mIHRoZSBjb250ZW50cyEKKyovCitzdHJ1Y3QgYXJfY2FjaGUKK3sKKyAgZmlsZV9wdHIgcHRyOworICBiZmQgKmFyZWx0OworICBzdHJ1Y3QgYXJfY2FjaGUgKm5leHQ7Cit9OworCisjZGVmaW5lIGFyX3BhZGNoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+YXJfcGFkX2NoYXIpCisjZGVmaW5lIGFyX21heG5hbWVsZW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+YXJfbWF4X25hbWVsZW4pCisKKyNkZWZpbmUgYXJjaF9lbHRkYXRhKGJmZCkgKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSkKKyNkZWZpbmUgYXJjaF9oZHIoYmZkKSAoKHN0cnVjdCBhcl9oZHIgKilhcmNoX2VsdGRhdGEoYmZkKS0+YXJjaF9oZWFkZXIpCisKK3N0YXRpYyBjaGFyICpnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgUEFSQU1TICgoYmZkICphcmNoLAorCQkJCQkJICBjb25zdCBjaGFyICpuYW1lKSk7CitzdGF0aWMgYm9vbGVhbiBkb19zbHVycF9ic2RfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgYm9vbGVhbiBkb19zbHVycF9jb2ZmX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqZmlsZSkpOworc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKmJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkJCQkgICAgIGNvbnN0IGNoYXIgKiwKKwkJCQkJCQkgICAgIGJmZCAqbWVtYmVyKSk7CisMCitib29sZWFuCitfYmZkX2dlbmVyaWNfbWthcmNoaXZlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9ICgoc3RydWN0IGFydGRhdGEgKikKKwkJCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKSk7CisKKyAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7CisgIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7CisgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7CisgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IE5VTEw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9nZXRfbmV4dF9tYXBlbnQKKworU1lOT1BTSVMKKwlzeW1pbmRleCBiZmRfZ2V0X25leHRfbWFwZW50KGJmZCAqYWJmZCwgc3ltaW5kZXggcHJldmlvdXMsIGNhcnN5bSAqKnN5bSk7CisKK0RFU0NSSVBUSU9OCisJU3RlcCB0aHJvdWdoIGFyY2hpdmUgQHZhcnthYmZkfSdzIHN5bWJvbCB0YWJsZSAoaWYgaXQKKwloYXMgb25lKS4gIFN1Y2Nlc3NpdmVseSB1cGRhdGUgQHZhcntzeW19IHdpdGggdGhlIG5leHQgc3ltYm9sJ3MKKwlpbmZvcm1hdGlvbiwgcmV0dXJuaW5nIHRoYXQgc3ltYm9sJ3MgKGludGVybmFsKSBpbmRleCBpbnRvIHRoZQorCXN5bWJvbCB0YWJsZS4KKworCVN1cHBseSA8PEJGRF9OT19NT1JFX1NZTUJPTFM+PiBhcyB0aGUgQHZhcntwcmV2aW91c30gZW50cnkgdG8gZ2V0CisJdGhlIGZpcnN0IG9uZTsgcmV0dXJucyA8PEJGRF9OT19NT1JFX1NZTUJPTFM+PiB3aGVuIHlvdSd2ZSBhbHJlYWR5CisJZ290IHRoZSBsYXN0IG9uZS4KKworCUEgPDxjYXJzeW0+PiBpcyBhIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gIFRoZSBvbmx5CisJdXNlci12aXNpYmxlIGVsZW1lbnQgaXMgaXRzIG5hbWUsIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyovCisKK3N5bWluZGV4CitiZmRfZ2V0X25leHRfbWFwZW50IChhYmZkLCBwcmV2LCBlbnRyeSkKKyAgICAgYmZkICphYmZkOworICAgICBzeW1pbmRleCBwcmV2OworICAgICBjYXJzeW0gKiplbnRyeTsKK3sKKyAgaWYgKCFiZmRfaGFzX21hcCAoYWJmZCkpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTOworICAgIH0KKworICBpZiAocHJldiA9PSBCRkRfTk9fTU9SRV9TWU1CT0xTKQorICAgIHByZXYgPSAwOworICBlbHNlCisgICAgKytwcmV2OworICBpZiAocHJldiA+PSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50KQorICAgIHJldHVybiBCRkRfTk9fTU9SRV9TWU1CT0xTOworCisgICplbnRyeSA9IChiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyArIHByZXYpOworICByZXR1cm4gcHJldjsKK30KKworLyogVG8gYmUgY2FsbGVkIGJ5IGJhY2tlbmRzIG9ubHkgKi8KKworYmZkICoKK19iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAob2JmZCkKKyAgICAgYmZkICpvYmZkOworeworICByZXR1cm4gX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiAob2JmZCk7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9zZXRfYXJjaGl2ZV9oZWFkCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfc2V0X2FyY2hpdmVfaGVhZChiZmQgKm91dHB1dCwgYmZkICpuZXdfaGVhZCk7CisKK0RFU0NSSVBUSU9OCisJU2V0IHRoZSBoZWFkIG9mIHRoZSBjaGFpbiBvZgorCUJGRHMgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlIEB2YXJ7b3V0cHV0fSB0byBAdmFye25ld19oZWFkfS4KKyovCisKK2Jvb2xlYW4KK2JmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRwdXRfYXJjaGl2ZSwgbmV3X2hlYWQpCisgICAgIGJmZCAqb3V0cHV0X2FyY2hpdmU7CisgICAgIGJmZCAqbmV3X2hlYWQ7Cit7CisKKyAgb3V0cHV0X2FyY2hpdmUtPmFyY2hpdmVfaGVhZCA9IG5ld19oZWFkOworICByZXR1cm4gdHJ1ZTsKK30KKworYmZkICoKK19iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIChhcmNoX2JmZCwgZmlsZXBvcykKKyAgICAgYmZkICphcmNoX2JmZDsKKyAgICAgZmlsZV9wdHIgZmlsZXBvczsKK3sKKyAgc3RydWN0IGFyX2NhY2hlICpjdXJyZW50OworCisgIGZvciAoY3VycmVudCA9IGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGU7IGN1cnJlbnQgIT0gTlVMTDsKKyAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKKyAgICBpZiAoY3VycmVudC0+cHRyID09IGZpbGVwb3MpCisgICAgICByZXR1cm4gY3VycmVudC0+YXJlbHQ7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEtpbmQgb2Ygc3R1cGlkIHRvIGNhbGwgY29ucyBmb3IgZWFjaCBvbmUsIGJ1dCB3ZSBkb24ndCBkbyB0b28gbWFueSAqLworYm9vbGVhbgorX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgKGFyY2hfYmZkLCBmaWxlcG9zLCBuZXdfZWx0KQorICAgICBiZmQgKmFyY2hfYmZkLCAqbmV3X2VsdDsKKyAgICAgZmlsZV9wdHIgZmlsZXBvczsKK3sKKyAgc3RydWN0IGFyX2NhY2hlICpuZXdfY2FjaGUgPSAoKHN0cnVjdCBhcl9jYWNoZSAqKQorCQkJCWJmZF96YWxsb2MgKGFyY2hfYmZkLAorCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYXJfY2FjaGUpKSk7CisKKyAgaWYgKG5ld19jYWNoZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBuZXdfY2FjaGUtPnB0ciA9IGZpbGVwb3M7CisgIG5ld19jYWNoZS0+YXJlbHQgPSBuZXdfZWx0OworICBuZXdfY2FjaGUtPm5leHQgPSAoc3RydWN0IGFyX2NhY2hlICopIE5VTEw7CisgIGlmIChiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlID09IE5VTEwpCisgICAgYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZSA9IG5ld19jYWNoZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBhcl9jYWNoZSAqY3VycmVudCA9IGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGU7CisKKyAgICAgIHdoaWxlIChjdXJyZW50LT5uZXh0ICE9IE5VTEwpCisJY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgICBjdXJyZW50LT5uZXh0ID0gbmV3X2NhY2hlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFRoZSBuYW1lIGJlZ2lucyB3aXRoIHNwYWNlLiAgSGVuY2UgdGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgYW4gaW5kZXggaW50bworICAgdGhlIHN0cmluZyB0YWJsZS4gKi8KKworc3RhdGljIGNoYXIgKgorZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIChhcmNoLCBuYW1lKQorICAgICBiZmQgKmFyY2g7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSAwOworCisgIC8qIFNob3VsZCBleHRyYWN0IHN0cmluZyBzbyB0aGF0IEkgY2FuIGd1YXJhbnRlZSBub3QgdG8gb3ZlcmZsb3cgaW50bworICAgICB0aGUgbmV4dCByZWdpb24sIGJ1dCBJJ20gdG9vIGxhenkuICovCisgIGVycm5vID0gMDsKKyAgLyogU2tpcCBmaXJzdCBjaGFyLCB3aGljaCBpcyAnLycgaW4gU1ZSNCBvciAnICcgaW4gc29tZSBvdGhlciB2YXJpYW50cy4gKi8KKyAgaW5kZXggPSBzdHJ0b2wgKG5hbWUgKyAxLCBOVUxMLCAxMCk7CisgIGlmIChlcnJubyAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGJmZF9hcmRhdGEgKGFyY2gpLT5leHRlbmRlZF9uYW1lcyArIGluZGV4OworfQorCisvKiBUaGlzIGZ1bmN0aW9ucyByZWFkcyBhbiBhcmNoIGhlYWRlciBhbmQgcmV0dXJucyBhbiBhcmVsdGRhdGEgcG9pbnRlciwgb3IKKyAgIE5VTEwgb24gZXJyb3IuCisKKyAgIFByZXN1bWVzIHRoZSBmaWxlIHBvaW50ZXIgaXMgYWxyZWFkeSBpbiB0aGUgcmlnaHQgcGxhY2UgKGllIHBvaW50aW5nCisgICB0byB0aGUgYXJfaGRyIGluIHRoZSBmaWxlKS4gICBNb3ZlcyB0aGUgZmlsZSBwb2ludGVyOyBvbiBzdWNjZXNzIGl0CisgICBzaG91bGQgYmUgcG9pbnRpbmcgdG8gdGhlIGZyb250IG9mIHRoZSBmaWxlIGNvbnRlbnRzOyBvbiBmYWlsdXJlIGl0CisgICBjb3VsZCBoYXZlIGJlZW4gbW92ZWQgYXJiaXRyYXJpbHkuCisqLworCitQVFIKK19iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Cit9CisKKy8qIEFscGhhIEVDT0ZGIHVzZXMgYW4gb3B0aW9uYWwgZGlmZmVyZW50IEFSRk1BRyB2YWx1ZSwgc28gd2UgaGF2ZSBhCisgICB2YXJpYW50IG9mIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciB3aGljaCBhY2NlcHRzIGEgbWFnaWMgc3RyaW5nLiAgKi8KKworUFRSCitfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnIChhYmZkLCBtYWcpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbWFnOworeworICBzdHJ1Y3QgYXJfaGRyIGhkcjsKKyAgY2hhciAqaGRycCA9IChjaGFyICopICZoZHI7CisgIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsKKyAgc3RydWN0IGFyZWx0ZGF0YSAqYXJlZDsKKyAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgbmFtZWxlbiA9IDA7CisgIHVuc2lnbmVkIGludCBhbGxvY3NpemUgPSBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKKyAgY2hhciAqYWxsb2NwdHIgPSAwOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgaGRycCwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKKyAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaWYgKHN0cm5jbXAgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpICE9IDAKKyAgICAgICYmIChtYWcgPT0gTlVMTAorCSAgfHwgc3RybmNtcCAoaGRyLmFyX2ZtYWcsIG1hZywgMikgIT0gMCkpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBlcnJubyA9IDA7CisgIHBhcnNlZF9zaXplID0gc3RydG9sIChoZHIuYXJfc2l6ZSwgTlVMTCwgMTApOworICBpZiAoZXJybm8gIT0gMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEV4dHJhY3QgdGhlIGZpbGVuYW1lIGZyb20gdGhlIGFyY2hpdmUgLSB0aGVyZSBhcmUgdHdvIHdheXMgdG8KKyAgICAgc3BlY2lmeSBhbiBleHRlbmRlZCBuYW1lIHRhYmxlLCBlaXRoZXIgdGhlIGZpcnN0IGNoYXIgb2YgdGhlCisgICAgIG5hbWUgaXMgYSBzcGFjZSwgb3IgaXQncyBhIHNsYXNoLiAgKi8KKyAgaWYgKChoZHIuYXJfbmFtZVswXSA9PSAnLycKKyAgICAgICB8fCAoaGRyLmFyX25hbWVbMF0gPT0gJyAnCisJICAgJiYgbWVtY2hyIChoZHIuYXJfbmFtZSwgJy8nLCBhcl9tYXhuYW1lbGVuIChhYmZkKSkgPT0gTlVMTCkpCisgICAgICAmJiBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IGdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSAoYWJmZCwgaGRyLmFyX25hbWUpOworICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisgIC8qIEJTRDQuNC1zdHlsZSBsb25nIGZpbGVuYW1lLgorICAgICBPbmx5IGltcGxlbWVudGVkIGZvciByZWFkaW5nLCBzbyBmYXIhICovCisgIGVsc2UgaWYgKGhkci5hcl9uYW1lWzBdID09ICcjJworCSAgICYmIGhkci5hcl9uYW1lWzFdID09ICcxJworCSAgICYmIGhkci5hcl9uYW1lWzJdID09ICcvJworCSAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBoZHIuYXJfbmFtZVszXSkpCisgICAgeworICAgICAgLyogQlNELTQuNCBleHRlbmRlZCBuYW1lICovCisgICAgICBuYW1lbGVuID0gYXRvaSAoJmhkci5hcl9uYW1lWzNdKTsKKyAgICAgIGFsbG9jc2l6ZSArPSBuYW1lbGVuICsgMTsKKyAgICAgIHBhcnNlZF9zaXplIC09IG5hbWVsZW47CisKKyAgICAgIGFsbG9jcHRyID0gYmZkX3phbGxvYyAoYWJmZCwgYWxsb2NzaXplKTsKKyAgICAgIGlmIChhbGxvY3B0ciA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgICAgZmlsZW5hbWUgPSAoYWxsb2NwdHIKKwkJICArIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkKKwkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOworICAgICAgaWYgKGJmZF9yZWFkIChmaWxlbmFtZSwgMSwgbmFtZWxlbiwgYWJmZCkgIT0gbmFtZWxlbikKKwl7CisJICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIGZpbGVuYW1lW25hbWVsZW5dID0gJ1wwJzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBqdWRnZSB0aGUgZW5kIG9mIHRoZSBuYW1lIGJ5IGxvb2tpbmcgZm9yICcvJyBvciAnICcuCisJIE5vdGU6ICBUaGUgU1lTViBmb3JtYXQgKHRlcm1pbmF0ZWQgYnkgJy8nKSBhbGxvd3MgZW1iZWRkZWQKKwkgc3BhY2VzLCBzbyBvbmx5IGxvb2sgZm9yICcgJyBpZiB3ZSBkb24ndCBmaW5kICcvJy4gKi8KKworICAgICAgY2hhciAqZTsKKyAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnXDAnLCBhcl9tYXhuYW1lbGVuIChhYmZkKSk7CisgICAgICBpZiAoZSA9PSBOVUxMKQorCXsKKyAgICAgICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJy8nLCBhcl9tYXhuYW1lbGVuIChhYmZkKSk7CisJICBpZiAoZSA9PSBOVUxMKQorICAgICAgICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICcgJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOworCX0KKworICAgICAgaWYgKGUgIT0gTlVMTCkKKwluYW1lbGVuID0gZSAtIGhkci5hcl9uYW1lOworICAgICAgZWxzZQorCXsKKwkgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGEgdGVybWluYXRpb24gY2hhcmFjdGVyLCB0aGVuIHRoZSBuYW1lCisJICAgICBtdXN0IGJlIHRoZSBlbnRpcmUgZmllbGQuICAqLworCSAgbmFtZWxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOworCX0KKworICAgICAgYWxsb2NzaXplICs9IG5hbWVsZW4gKyAxOworICAgIH0KKworICBpZiAoIWFsbG9jcHRyKQorICAgIHsKKyAgICAgIGFsbG9jcHRyID0gYmZkX3phbGxvYyAoYWJmZCwgYWxsb2NzaXplKTsKKyAgICAgIGlmIChhbGxvY3B0ciA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIH0KKworICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYWxsb2NwdHI7CisKKyAgYXJlZC0+YXJjaF9oZWFkZXIgPSBhbGxvY3B0ciArIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSk7CisgIG1lbWNweSAoKGNoYXIgKikgYXJlZC0+YXJjaF9oZWFkZXIsIChjaGFyICopICZoZHIsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOworICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHBhcnNlZF9zaXplOworCisgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQorICAgIGFyZWQtPmZpbGVuYW1lID0gZmlsZW5hbWU7CisgIGVsc2UKKyAgICB7CisgICAgICBhcmVkLT5maWxlbmFtZSA9IGFsbG9jcHRyICsgKHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkgKworCQkJCSAgIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOworICAgICAgaWYgKG5hbWVsZW4pCisJbWVtY3B5IChhcmVkLT5maWxlbmFtZSwgaGRyLmFyX25hbWUsIG5hbWVsZW4pOworICAgICAgYXJlZC0+ZmlsZW5hbWVbbmFtZWxlbl0gPSAnXDAnOworICAgIH0KKworICByZXR1cm4gKFBUUikgYXJlZDsKK30KKwwKKy8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb247IGl0J3MgbWFpbmx5IHVzZWQgd2hlbiBpbmRleGluZworICAgdGhyb3VnaCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUsIGJ1dCBhbHNvIHVzZWQgdG8gZ2V0IHRoZSBuZXh0CisgICBlbGVtZW50LCBzaW5jZSBpdCBoYW5kbGVzIHRoZSBib29ra2VlcGluZyBzbyBuaWNlbHkgZm9yIHVzLiAgKi8KKworYmZkICoKK19iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKQorICAgICBiZmQgKmFyY2hpdmU7CisgICAgIGZpbGVfcHRyIGZpbGVwb3M7Cit7CisgIHN0cnVjdCBhcmVsdGRhdGEgKm5ld19hcmVsZGF0YTsKKyAgYmZkICpuX25mZDsKKworICBuX25mZCA9IF9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlIChhcmNoaXZlLCBmaWxlcG9zKTsKKyAgaWYgKG5fbmZkKQorICAgIHJldHVybiBuX25mZDsKKworICBpZiAoMCA+IGJmZF9zZWVrIChhcmNoaXZlLCBmaWxlcG9zLCBTRUVLX1NFVCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKChuZXdfYXJlbGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhcmNoaXZlKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBuX25mZCA9IF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAoYXJjaGl2ZSk7CisgIGlmIChuX25mZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhcmNoaXZlLCAoUFRSKSBuZXdfYXJlbGRhdGEpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG5fbmZkLT5vcmlnaW4gPSBiZmRfdGVsbCAoYXJjaGl2ZSk7CisgIG5fbmZkLT5hcmVsdF9kYXRhID0gKFBUUikgbmV3X2FyZWxkYXRhOworICBuX25mZC0+ZmlsZW5hbWUgPSBuZXdfYXJlbGRhdGEtPmZpbGVuYW1lOworCisgIGlmIChfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSAoYXJjaGl2ZSwgZmlsZXBvcywgbl9uZmQpKQorICAgIHJldHVybiBuX25mZDsKKworICAvKiBodWg/ICovCisgIGJmZF9yZWxlYXNlIChhcmNoaXZlLCAoUFRSKSBuX25mZCk7CisgIGJmZF9yZWxlYXNlIChhcmNoaXZlLCAoUFRSKSBuZXdfYXJlbGRhdGEpOworICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBCRkQgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ltYm9sIGluIEFCRkQgaW5kZXhlZCBieQorICAgSU5ERVguICBJTkRFWCBzaG91bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGJmZF9nZXRfbmV4dF9tYXBlbnQuICAqLworCitiZmQgKgorX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN5bWluZGV4IGluZGV4OworeworICBjYXJzeW0gKmVudHJ5OworCisgIGVudHJ5ID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBpbmRleDsKKyAgcmV0dXJuIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhYmZkLCBlbnRyeS0+ZmlsZV9vZmZzZXQpOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCisKK1NZTk9QU0lTCisJYmZkICpiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKGJmZCAqYXJjaGl2ZSwgYmZkICpwcmV2aW91cyk7CisKK0RFU0NSSVBUSU9OCisJUHJvdmlkZWQgYSBCRkQsIEB2YXJ7YXJjaGl2ZX0sIGNvbnRhaW5pbmcgYW4gYXJjaGl2ZSBhbmQgTlVMTCwgb3BlbgorCWFuIGlucHV0IEJGRCBvbiB0aGUgZmlyc3QgY29udGFpbmVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhhdC4KKwlTdWJzZXF1ZW50IGNhbGxzIHNob3VsZCBwYXNzCisJdGhlIGFyY2hpdmUgYW5kIHRoZSBwcmV2aW91cyByZXR1cm4gdmFsdWUgdG8gcmV0dXJuIGEgY3JlYXRlZAorCUJGRCB0byB0aGUgbmV4dCBjb250YWluZWQgZWxlbWVudC4gTlVMTCBpcyByZXR1cm5lZCB3aGVuIHRoZXJlCisJYXJlIG5vIG1vcmUuCisKKyovCisKK2JmZCAqCitiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCisgICAgIGJmZCAqYXJjaGl2ZTsKKyAgICAgYmZkICpsYXN0X2ZpbGU7Cit7CisgIGlmICgoYmZkX2dldF9mb3JtYXQgKGFyY2hpdmUpICE9IGJmZF9hcmNoaXZlKSB8fAorICAgICAgKGFyY2hpdmUtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIEJGRF9TRU5EIChhcmNoaXZlLAorCQkgICBvcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUsCisJCSAgIChhcmNoaXZlLAorCQkgICAgbGFzdF9maWxlKSk7Cit9CisKK2JmZCAqCitiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyY2hpdmUsIGxhc3RfZmlsZSkKKyAgICAgYmZkICphcmNoaXZlOworICAgICBiZmQgKmxhc3RfZmlsZTsKK3sKKyAgZmlsZV9wdHIgZmlsZXN0YXJ0OworCisgIGlmICghbGFzdF9maWxlKQorICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IGFyZWx0X3NpemUgKGxhc3RfZmlsZSk7CisgICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4uLgorCSBOb3RlIHRoYXQgbGFzdF9maWxlLT5vcmlnaW4gY2FuIGJlIG9kZCBpbiB0aGUgY2FzZSBvZgorCSBCU0QtNC40LXN0eWxlIGVsZW1lbnQgd2l0aCBhIGxvbmcgb2RkIHNpemUuICovCisgICAgICBmaWxlc3RhcnQgPSBsYXN0X2ZpbGUtPm9yaWdpbiArIHNpemU7CisgICAgICBmaWxlc3RhcnQgKz0gZmlsZXN0YXJ0ICUgMjsKKyAgICB9CisKKyAgcmV0dXJuIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlc3RhcnQpOworfQorCisKK2NvbnN0IGJmZF90YXJnZXQgKgorYmZkX2dlbmVyaWNfYXJjaGl2ZV9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBhcnRkYXRhICp0ZGF0YV9ob2xkOworICBjaGFyIGFybWFnW1NBUk1BRyArIDFdOworCisgIHRkYXRhX2hvbGQgPSBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGE7CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSBhcm1hZywgMSwgU0FSTUFHLCBhYmZkKSAhPSBTQVJNQUcpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZkZWYgR05VOTYwCisgIGlmIChzdHJuY21wIChhcm1hZywgQkZEX0dOVTk2MF9BUk1BRyAoYWJmZCksIFNBUk1BRykgIT0gMCkKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgIGlmIChzdHJuY21wIChhcm1hZywgQVJNQUcsIFNBUk1BRykgIT0gMCAmJgorICAgICAgc3RybmNtcCAoYXJtYWcsIEFSTUFHQiwgU0FSTUFHKSAhPSAwKQorICAgIHJldHVybiAwOworI2VuZGlmCisKKyAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQorICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYXNzaWdubWVudC4gKi8KKyAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gKChzdHJ1Y3QgYXJ0ZGF0YSAqKQorCQkJICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpKTsKKworICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOworICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKKyAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOworCisgIGlmICghQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2x1cnBfYXJtYXAsIChhYmZkKSkpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKKyAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCFCRkRfU0VORCAoYWJmZCwgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlLCAoYWJmZCkpKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7CisgICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChiZmRfaGFzX21hcCAoYWJmZCkpCisgICAgeworICAgICAgYmZkICpmaXJzdDsKKworICAgICAgLyogVGhpcyBhcmNoaXZlIGhhcyBhIG1hcCwgc28gd2UgbWF5IHByZXN1bWUgdGhhdCB0aGUgY29udGVudHMKKwkgYXJlIG9iamVjdCBmaWxlcy4gIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBmaXJzdCBmaWxlIGluIHRoZQorCSBhcmNoaXZlIGNhbiBiZSByZWNvZ25pemVkIGFzIGFuIG9iamVjdCBmaWxlLCBpdCBpcyBmb3IgdGhpcworCSB0YXJnZXQuICBJZiBub3QsIGFzc3VtZSB0aGF0IHRoaXMgaXMgdGhlIHdyb25nIGZvcm1hdC4gIElmCisJIHRoZSBmaXJzdCBmaWxlIGlzIG5vdCBhbiBvYmplY3QgZmlsZSwgc29tZWJvZHkgaXMgZG9pbmcKKwkgc29tZXRoaW5nIHdlaXJkLCBhbmQgd2UgcGVybWl0IGl0IHNvIHRoYXQgYXIgLXQgd2lsbCB3b3JrLgorCisJIFRoaXMgaXMgZG9uZSBiZWNhdXNlIGFueSBub3JtYWwgZm9ybWF0IHdpbGwgcmVjb2duaXplIGFueQorCSBub3JtYWwgYXJjaGl2ZSwgcmVnYXJkbGVzcyBvZiB0aGUgZm9ybWF0IG9mIHRoZSBvYmplY3QgZmlsZXMuCisJIFdlIGRvIGFjY2VwdCBhbiBlbXB0eSBhcmNoaXZlLiAgKi8KKworICAgICAgZmlyc3QgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpOworICAgICAgaWYgKGZpcnN0ICE9IE5VTEwpCisJeworCSAgYm9vbGVhbiBmYWlsOworCisJICBmaXJzdC0+dGFyZ2V0X2RlZmF1bHRlZCA9IGZhbHNlOworCSAgZmFpbCA9IGZhbHNlOworCSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGZpcnN0LCBiZmRfb2JqZWN0KQorCSAgICAgICYmIGZpcnN0LT54dmVjICE9IGFiZmQtPnh2ZWMpCisJICAgIHsKKwkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChmaXJzdCk7CisJICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKKwkgICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisKKwkgIC8qIFdlIG91Z2h0IHRvIGNsb3NlIGZpcnN0IGhlcmUsIGJ1dCB3ZSBjYW4ndCwgYmVjYXVzZSB3ZQorICAgICAgICAgICAgIGhhdmUgbm8gd2F5IHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBhcmNoaXZlIGNhY2hlLiAgRklYTUUuICAqLworCX0KKyAgICB9CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKKy8qIFNvbWUgY29uc3RhbnRzIGZvciBhIDMyIGJpdCBCU0QgYXJjaGl2ZSBzdHJ1Y3R1cmUuICBXZSBkbyBub3QKKyAgIHN1cHBvcnQgNjQgYml0IGFyY2hpdmVzIHByZXNlbnRseTsgc28gZmFyIGFzIEkga25vdywgbm9uZSBhY3R1YWxseQorICAgZXhpc3QuICBTdXBwb3J0aW5nIHRoZW0gd291bGQgcmVxdWlyZSBjaGFuZ2luZyB0aGVzZSBjb25zdGFudHMsIGFuZAorICAgY2hhbmdpbmcgc29tZSBiZmRfaF9nZXRfMzIgdG8gYmZkX2hfZ2V0XzY0LiAgKi8KKworLyogVGhlIHNpemUgb2YgYW4gZXh0ZXJuYWwgc3ltZGVmIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIEJTRF9TWU1ERUZfU0laRSA4CisKKy8qIFRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgYSBzeW1kZWYgc3RydWN0dXJlIHRvIHRoZSBmaWxlIG9mZnNldC4gICovCisjZGVmaW5lIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUgNAorCisvKiBUaGUgc2l6ZSBvZiB0aGUgc3ltZGVmIGNvdW50LiAgKi8KKyNkZWZpbmUgQlNEX1NZTURFRl9DT1VOVF9TSVpFIDQKKworLyogVGhlIHNpemUgb2YgdGhlIHN0cmluZyBjb3VudC4gICovCisjZGVmaW5lIEJTRF9TVFJJTkdfQ09VTlRfU0laRSA0CisKKy8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCisKK3N0YXRpYyBib29sZWFuCitkb19zbHVycF9ic2RfYXJtYXAgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKKyAgdW5zaWduZWQgaW50IGNvdW50ZXI7CisgIGJmZF9ieXRlICpyYXdfYXJtYXAsICpyYmFzZTsKKyAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOworICBjaGFyICpzdHJpbmdiYXNlOworICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7CisgIGNhcnN5bSAqc2V0OworCisgIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKKyAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7CisgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsJLyogRG9uJ3QgbmVlZCBpdCBhbnkgbW9yZS4gKi8KKworICByYXdfYXJtYXAgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgcGFyc2VkX3NpemUpOworICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgcGFyc2VkX3NpemUsIGFiZmQpICE9IHBhcnNlZF9zaXplKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOworICAgIGJ5ZWJ5ZToKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKSAvIEJTRF9TWU1ERUZfU0laRTsKKworICBpZiAoYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUgPgorICAgICAgcGFyc2VkX3NpemUgLSBCU0RfU1lNREVGX0NPVU5UX1NJWkUpCisgICAgeworICAgICAgLyogUHJvYmFibHkgd2UncmUgdXNpbmcgdGhlIHdyb25nIGJ5dGUgb3JkZXJpbmcuICAqLworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICBnb3RvIGJ5ZWJ5ZTsKKyAgICB9CisKKyAgYXJkYXRhLT5jYWNoZSA9IDA7CisgIHJiYXNlID0gcmF3X2FybWFwICsgQlNEX1NZTURFRl9DT1VOVF9TSVpFOworICBzdHJpbmdiYXNlID0gKChjaGFyICopIHJiYXNlCisJCSsgYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUKKwkJKyBCU0RfU1RSSU5HX0NPVU5UX1NJWkUpOworICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKKwkJCQkJICAgKiBzaXplb2YgKGNhcnN5bSkpKTsKKyAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoY291bnRlciA9IDAsIHNldCA9IGFyZGF0YS0+c3ltZGVmczsKKyAgICAgICBjb3VudGVyIDwgYXJkYXRhLT5zeW1kZWZfY291bnQ7CisgICAgICAgY291bnRlcisrLCBzZXQrKywgcmJhc2UgKz0gQlNEX1NZTURFRl9TSVpFKQorICAgIHsKKyAgICAgIHNldC0+bmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UpICsgc3RyaW5nYmFzZTsKKyAgICAgIHNldC0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7CisgICAgfQorCisgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOworICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLworICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKKyAgLyogRklYTUUsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUgd2F5IHRvIGZyZWUgcmF3X2FyZGF0YSB3aGVuCisgICAgIHdlIGFyZSBkb25lIHVzaW5nIHRoZSBzdHJpbmdzIGZyb20gaXQuICBGb3Igbm93LCBpdCBzZWVtcworICAgICB0byBiZSBhbGxvY2F0ZWQgb24gYW4gb2JqYWxsb2MgYW55d2F5Li4uICovCisgIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7CisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLworc3RhdGljIGJvb2xlYW4KK2RvX3NsdXJwX2NvZmZfYXJtYXAgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKKyAgaW50ICpyYXdfYXJtYXAsICpyYXdwdHI7CisgIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKKyAgY2hhciAqc3RyaW5nYmFzZTsKKyAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7CisgIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsKKyAgY2Fyc3ltICpjYXJzeW1zOworICB1bnNpZ25lZCBpbnQgbnN5bXo7CQkvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBhcm1hcC4gKi8KKyAgYmZkX3ZtYSAoKnN3YXApIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKyAgY2hhciBpbnRfYnVmW3NpemVvZiAobG9uZyldOworICB1bnNpZ25lZCBpbnQgY2Fyc3ltX3NpemUsIHB0cnNpemUsIGk7CisKKyAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOworICBpZiAobWFwZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwkvKiBEb24ndCBuZWVkIGl0IGFueSBtb3JlLiAqLworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgaW50X2J1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIC8qIEl0IHNlZW1zIHRoYXQgYWxsIG51bWVyaWMgaW5mb3JtYXRpb24gaW4gYSBjb2ZmIGFyY2hpdmUgaXMgYWx3YXlzCisgICAgIGluIGJpZyBlbmRpYW4gZm9ybWF0LCBub21hdHRlciB0aGUgaG9zdCBvciB0YXJnZXQuICovCisgIHN3YXAgPSBiZmRfZ2V0YjMyOworICBuc3lteiA9IGJmZF9nZXRiMzIgKChQVFIpIGludF9idWYpOworICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSAoNCAqIG5zeW16KSAtIDQ7CisKKyNpZiAxCisgIC8qIC4uLiBleGNlcHQgdGhhdCBzb21lIGFyY2hpdmUgZm9ybWF0cyBhcmUgYnJva2VuLCBhbmQgaXQgbWF5IGJlIG91cgorICAgICBmYXVsdCAtIHRoZSBpOTYwIGxpdHRsZSBlbmRpYW4gY29mZiBzb21ldGltZXMgaGFzIGJpZyBhbmQgc29tZXRpbWVzCisgICAgIGxpdHRsZSwgYmVjYXVzZSBvdXIgdG9vbHMgY2hhbmdlZC4gIEhlcmUncyBhIGhvcnJpYmxlIGhhY2sgdG8gY2xlYW4KKyAgICAgdXAgdGhlIGNyYXAuICAqLworCisgIGlmIChzdHJpbmdzaXplID4gMHhmZmZmZgorICAgICAgJiYgYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF9pOTYwCisgICAgICAmJiBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorICAgIHsKKyAgICAgIC8qIFRoaXMgbG9va3MgZGFuZ2Vyb3VzLCBsZXQncyBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZCAqLworICAgICAgbnN5bXogPSBiZmRfZ2V0bDMyICgoUFRSKSBpbnRfYnVmKTsKKyAgICAgIHN0cmluZ3NpemUgPSBwYXJzZWRfc2l6ZSAtICg0ICogbnN5bXopIC0gNDsKKyAgICAgIHN3YXAgPSBiZmRfZ2V0bDMyOworICAgIH0KKyNlbmRpZgorCisgIC8qIFRoZSBjb2ZmIGFybWFwIG11c3QgYmUgcmVhZCBzZXF1ZW50aWFsbHkuICBTbyB3ZSBjb25zdHJ1Y3QgYQorICAgICBic2Qtc3R5bGUgb25lIGluIGNvcmUgYWxsIGF0IG9uY2UsIGZvciBzaW1wbGljaXR5LiAqLworCisgIGNhcnN5bV9zaXplID0gKG5zeW16ICogc2l6ZW9mIChjYXJzeW0pKTsKKyAgcHRyc2l6ZSA9ICg0ICogbnN5bXopOworCisgIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX3phbGxvYyAoYWJmZCwgY2Fyc3ltX3NpemUgKyBzdHJpbmdzaXplICsgMSk7CisgIGlmIChhcmRhdGEtPnN5bWRlZnMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGNhcnN5bXMgPSBhcmRhdGEtPnN5bWRlZnM7CisgIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgYXJkYXRhLT5zeW1kZWZzKSArIGNhcnN5bV9zaXplOworCisgIC8qIEFsbG9jYXRlIGFuZCByZWFkIGluIHRoZSByYXcgb2Zmc2V0cy4gKi8KKyAgcmF3X2FybWFwID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHB0cnNpemUpOworICBpZiAocmF3X2FybWFwID09IE5VTEwpCisgICAgZ290byByZWxlYXNlX3N5bWRlZnM7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBwdHJzaXplLCBhYmZkKSAhPSBwdHJzaXplCisgICAgICB8fCBiZmRfcmVhZCAoKFBUUikgc3RyaW5nYmFzZSwgMSwgc3RyaW5nc2l6ZSwgYWJmZCkgIT0gc3RyaW5nc2l6ZSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKyAgICAgIGdvdG8gcmVsZWFzZV9yYXdfYXJtYXA7CisgICAgfQorCisgIC8qIE9LLCBidWlsZCB0aGUgY2Fyc3ltcyAqLworICBmb3IgKGkgPSAwOyBpIDwgbnN5bXo7IGkrKykKKyAgICB7CisgICAgICByYXdwdHIgPSByYXdfYXJtYXAgKyBpOworICAgICAgY2Fyc3ltcy0+ZmlsZV9vZmZzZXQgPSBzd2FwICgoUFRSKSByYXdwdHIpOworICAgICAgY2Fyc3ltcy0+bmFtZSA9IHN0cmluZ2Jhc2U7CisgICAgICBzdHJpbmdiYXNlICs9IHN0cmxlbiAoc3RyaW5nYmFzZSkgKyAxOworICAgICAgY2Fyc3ltcysrOworICAgIH0KKyAgKnN0cmluZ2Jhc2UgPSAwOworCisgIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gbnN5bXo7CisgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOworICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLworICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKKworCisgIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7CisgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOworCisKKyAgLyogQ2hlY2sgZm9yIGEgc2Vjb25kIGFyY2hpdmUgaGVhZGVyIChhcyB1c2VkIGJ5IFBFKSAqLworICB7CisgICAgc3RydWN0IGFyZWx0ZGF0YSAqdG1wOworCisgICAgYmZkX3NlZWsgKGFiZmQsICAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MsIFNFRUtfU0VUKTsKKyAgICB0bXAgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKKyAgICBpZiAodG1wICE9IE5VTEwpIAorICAgICAgeworCWlmICh0bXAtPmFyY2hfaGVhZGVyWzBdID09ICcvJworCSAgICAmJiB0bXAtPmFyY2hfaGVhZGVyWzFdID09ICcgJykgCisJICB7CisJICAgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9CisJICAgICAgKHRtcC0+cGFyc2VkX3NpemUgKyBzaXplb2Yoc3RydWN0IGFyX2hkcikgKyAxKSAmIH4xOworCSAgfQorCWJmZF9yZWxlYXNlIChhYmZkLCB0bXApOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7CisKK3JlbGVhc2VfcmF3X2FybWFwOgorICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKK3JlbGVhc2Vfc3ltZGVmczoKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIChhcmRhdGEpLT5zeW1kZWZzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBUaGlzIHJvdXRpbmUgY2FuIGhhbmRsZSBlaXRoZXIgY29mZi1zdHlsZSBvciBic2Qtc3R5bGUgYXJtYXBzLgorICAgUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KKworYm9vbGVhbgorYmZkX3NsdXJwX2FybWFwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgbmV4dG5hbWVbMTddOworICBpbnQgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOworCisgIGlmIChpID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChpICE9IDE2KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYgICAgICAgIiwgMTYpCisgICAgICB8fCAhc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYvICAgICAgIiwgMTYpKSAvKiBvbGQgTGludXggYXJjaGl2ZXMgKi8KKyAgICByZXR1cm4gZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKTsKKyAgZWxzZSBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKKyAgICByZXR1cm4gZG9fc2x1cnBfY29mZl9hcm1hcCAoYWJmZCk7CisgIGVsc2UgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIi9TWU02NC8gICAgICAgICAiLCAxNikpCisgICAgeworICAgICAgLyogSXJpeCA2IGFyY2hpdmUtLW11c3QgYmUgcmVjb2duaXplZCBieSBjb2RlIGluIGVsZjY0LW1pcHMuYy4gICovCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorDAorLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KKy8qIGZsYXZvciAyIG9mIGEgYnNkIGFybWFwLCBzaW1pbGFyIHRvIGJmZF9zbHVycF9ic2RfYXJtYXAgZXhjZXB0IHRoZQorICAgaGVhZGVyIGlzIGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG9yZGVyIGFuZCB0aGUgbWFwIG5hbWUgaXMgJy8nLgorICAgVGhpcyBmbGF2b3VyIGlzIHVzZWQgYnkgaHAzMDBocHV4LiAqLworCisjZGVmaW5lIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUgMgorCitib29sZWFuCitiZmRfc2x1cnBfYnNkX2FybWFwX2YyIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7CisgIGNoYXIgbmV4dG5hbWVbMTddOworICB1bnNpZ25lZCBpbnQgY291bnRlcjsKKyAgYmZkX2J5dGUgKnJhd19hcm1hcCwgKnJiYXNlOworICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7CisgIGNoYXIgKnN0cmluZ2Jhc2U7CisgIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOworICBjYXJzeW0gKnNldDsKKyAgaW50IGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKKworICBpZiAoaSA9PSAwKQorICAgIHJldHVybiB0cnVlOworICBpZiAoaSAhPSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIGFyY2hpdmUgaGFzIGF0IGxlYXN0IDE2IGJ5dGVzIGluIGl0ICovCisgIGlmIChiZmRfc2VlayAoYWJmZCwgLTE2TCwgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYgICAgICAgIiwgMTYpCisgICAgICB8fCAhc3RybmNtcCAobmV4dG5hbWUsICJfXy5TWU1ERUYvICAgICAgIiwgMTYpKSAvKiBvbGQgTGludXggYXJjaGl2ZXMgKi8KKyAgICByZXR1cm4gZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKTsKKworICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvICAgICAgICAgICAgICAgIiwgMTYpKQorICAgIHsKKyAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKKyAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIG1hcGRhdGEtPnBhcnNlZF9zaXplKTsKKyAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQorICAgIHsKKyAgICBieWVieWU6CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChiZmRfcmVhZCAoKFBUUikgcmF3X2FybWFwLCAxLCBtYXBkYXRhLT5wYXJzZWRfc2l6ZSwgYWJmZCkgIT0KKyAgICAgIG1hcGRhdGEtPnBhcnNlZF9zaXplKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOworICAgIGJ5ZWJ5ZWJ5ZToKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOworICAgICAgZ290byBieWVieWU7CisgICAgfQorCisgIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoUFRSKSByYXdfYXJtYXApOworCisgIGlmIChhcmRhdGEtPnN5bWRlZl9jb3VudCAqIEJTRF9TWU1ERUZfU0laRQorICAgICAgPiBtYXBkYXRhLT5wYXJzZWRfc2l6ZSAtIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUpCisgICAgeworICAgICAgLyogUHJvYmFibHkgd2UncmUgdXNpbmcgdGhlIHdyb25nIGJ5dGUgb3JkZXJpbmcuICAqLworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICBnb3RvIGJ5ZWJ5ZWJ5ZTsKKyAgICB9CisKKyAgYXJkYXRhLT5jYWNoZSA9IDA7CisKKyAgc3RyaW5nc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwICsgSFBVWF9TWU1ERUZfQ09VTlRfU0laRSk7CisgIC8qIHNraXAgc3ltIGNvdW50IGFuZCBzdHJpbmcgc3ogKi8KKyAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSByYXdfYXJtYXAKKwkJKyBIUFVYX1NZTURFRl9DT1VOVF9TSVpFCisJCSsgQlNEX1NUUklOR19DT1VOVF9TSVpFKTsKKyAgcmJhc2UgPSAoYmZkX2J5dGUgKikgc3RyaW5nYmFzZSArIHN0cmluZ3NpemU7CisgIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgIChhcmRhdGEtPnN5bWRlZl9jb3VudAorCQkJCQkgICAqIEJTRF9TWU1ERUZfU0laRSkpOworICBpZiAoIWFyZGF0YS0+c3ltZGVmcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChjb3VudGVyID0gMCwgc2V0ID0gYXJkYXRhLT5zeW1kZWZzOworICAgICAgIGNvdW50ZXIgPCBhcmRhdGEtPnN5bWRlZl9jb3VudDsKKyAgICAgICBjb3VudGVyKyssIHNldCsrLCByYmFzZSArPSBCU0RfU1lNREVGX1NJWkUpCisgICAgeworICAgICAgc2V0LT5uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSkgKyBzdHJpbmdiYXNlOworICAgICAgc2V0LT5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UgKyBCU0RfU1lNREVGX09GRlNFVF9TSVpFKTsKKyAgICB9CisKKyAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7CisgIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5IGlmIHlvdSBoYXZlIHRvICovCisgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IChhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcykgJSAyOworICAvKiBGSVhNRSwgd2Ugc2hvdWxkIHByb3ZpZGUgc29tZSB3YXkgdG8gZnJlZSByYXdfYXJkYXRhIHdoZW4KKyAgICAgd2UgYXJlIGRvbmUgdXNpbmcgdGhlIHN0cmluZ3MgZnJvbSBpdC4gIEZvciBub3csIGl0IHNlZW1zCisgICAgIHRvIGJlIGFsbG9jYXRlZCBvbiBhbiBvYmphbGxvYyBhbnl3YXkuLi4gKi8KKyAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiogRXh0ZW5kZWQgbmFtZSB0YWJsZS4KKworICBOb3JtYWxseSBhcmNoaXZlcyBzdXBwb3J0IG9ubHkgMTQtY2hhcmFjdGVyIGZpbGVuYW1lcy4KKworICBJbnRlbCBoYXMgZXh0ZW5kZWQgdGhlIGZvcm1hdDogbG9uZ2VyIG5hbWVzIGFyZSBzdG9yZWQgaW4gYSBzcGVjaWFsCisgIGVsZW1lbnQgKHRoZSBmaXJzdCBpbiB0aGUgYXJjaGl2ZSwgb3Igc2Vjb25kIGlmIHRoZXJlIGlzIGFuIGFybWFwKTsKKyAgdGhlIG5hbWUgaW4gdGhlIGFyX2hkciBpcyByZXBsYWNlZCBieSA8c3BhY2U+PGluZGV4IGludG8gZmlsZW5hbWUKKyAgZWxlbWVudD4uICBJbmRleCBpcyB0aGUgUC5SLiBvZiBhbiBpbnQgKGRlY2ltYWwpLiAgRGF0YSBHZW5lcmFsIGhhdmUKKyAgZXh0ZW5kZWQgdGhlIGZvcm1hdCBieSB1c2luZyB0aGUgcHJlZml4IC8vIGZvciB0aGUgc3BlY2lhbCBlbGVtZW50ICovCisKKy8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCitib29sZWFuCitfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciBuZXh0bmFtZVsxN107CisgIHN0cnVjdCBhcmVsdGRhdGEgKm5hbWVkYXRhOworCisgIC8qIEZJWE1FOiAgRm9ybWF0dGluZyBzdWNrcyBoZXJlLCBhbmQgaW4gY2FzZSBvZiBmYWlsdXJlIG9mIEJGRF9SRUFELAorICAgICB3ZSBwcm9iYWJseSBkb24ndCB3YW50IHRvIHJldHVybiB0cnVlLiAgKi8KKyAgYmZkX3NlZWsgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MsIFNFRUtfU0VUKTsKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpID09IDE2KQorICAgIHsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIkFSRklMRU5BTUVTLyAgICAiLCAxNikgIT0gMCAmJgorCSAgc3RybmNtcCAobmV4dG5hbWUsICIvLyAgICAgICAgICAgICAgIiwgMTYpICE9IDApCisJeworCSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgbmFtZWRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKKyAgICAgIGlmIChuYW1lZGF0YSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0KKwliZmRfemFsbG9jIChhYmZkLCBuYW1lZGF0YS0+cGFyc2VkX3NpemUpOworICAgICAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9PSBOVUxMKQorCXsKKwlieWVieWU6CisJICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbmFtZWRhdGEpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMsIDEsCisJCSAgICBuYW1lZGF0YS0+cGFyc2VkX3NpemUsIGFiZmQpICE9IG5hbWVkYXRhLT5wYXJzZWRfc2l6ZSkKKwl7CisJICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7CisJICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgKGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcykpOworCSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKKwkgIGdvdG8gYnllYnllOworCX0KKworICAgICAgLyogU2luY2UgdGhlIGFyY2hpdmUgaXMgc3VwcG9zZWQgdG8gYmUgcHJpbnRhYmxlIGlmIGl0IGNvbnRhaW5zCisJIHRleHQsIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSBuZXdsaW5lLXBhZGRlZCwgbm90IG51bGwKKwkgcGFkZGVkLiBJbiBTVlI0LXN0eWxlIGFyY2hpdmVzLCB0aGUgbmFtZXMgYWxzbyBoYXZlIGEKKwkgdHJhaWxpbmcgJy8nLiAgRE9TL05UIGNyZWF0ZWQgYXJjaGl2ZSBvZnRlbiBoYXZlIFwgaW4gdGhlbQorCSBXZSdsbCBmaXggYWxsIHByb2JsZW1zIGhlcmUuLiAgKi8KKyAgICAgIHsKKwljaGFyICp0ZW1wID0gYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzOworCWNoYXIgKmxpbWl0ID0gdGVtcCArIG5hbWVkYXRhLT5wYXJzZWRfc2l6ZTsKKwlmb3IgKDsgdGVtcCA8IGxpbWl0OyArK3RlbXApIHsKKwkgIGlmICgqdGVtcCA9PSAnXDAxMicpCisJICAgIHRlbXBbdGVtcFstMV0gPT0gJy8nID8gLTEgOiAwXSA9ICdcMCc7CisJICBpZiAoKnRlbXAgPT0gJ1xcJykKKwkgICAgKnRlbXAgPSAnLyc7CisJfQorICAgICAgfQorCisgICAgICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLworICAgICAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKKyAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0KKwkoYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcykgJSAyOworCisgICAgICAvKiBGSVhNRSwgd2UgY2FuJ3QgcmVsZWFzZSBuYW1lZGF0YSBoZXJlIGJlY2F1c2UgaXQgd2FzIGFsbG9jYXRlZAorCSBiZWxvdyBleHRlbmRlZF9uYW1lcyBvbiB0aGUgb2JqYWxsb2MuLi4gKi8KKyAgICAgIC8qIGJmZF9yZWxlYXNlIChhYmZkLCBuYW1lZGF0YSk7ICovCisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworI2lmZGVmIFZNUworCisvKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHVmZiBpbiB0aGUgZmlsZW5hbWUgYmV0d2VlbiBhbnkgOl0+IGFuZCBhCisgICBzZW1pY29sb24gKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK25vcm1hbGl6ZSAoYWJmZCwgZmlsZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpmaWxlOworeworICBDT05TVCBjaGFyICpmaXJzdDsKKyAgQ09OU1QgY2hhciAqbGFzdDsKKyAgY2hhciAqY29weTsKKworICBmaXJzdCA9IGZpbGUgKyBzdHJsZW4gKGZpbGUpIC0gMTsKKyAgbGFzdCA9IGZpcnN0ICsgMTsKKworICB3aGlsZSAoZmlyc3QgIT0gZmlsZSkKKyAgICB7CisgICAgICBpZiAoKmZpcnN0ID09ICc7JykKKwlsYXN0ID0gZmlyc3Q7CisgICAgICBpZiAoKmZpcnN0ID09ICc6JyB8fCAqZmlyc3QgPT0gJ10nIHx8ICpmaXJzdCA9PSAnPicpCisJeworCSAgZmlyc3QrKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIGZpcnN0LS07CisgICAgfQorCisgIGNvcHkgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGxhc3QgLSBmaXJzdCArIDEpOworICBpZiAoY29weSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAoY29weSwgZmlyc3QsIGxhc3QgLSBmaXJzdCk7CisgIGNvcHlbbGFzdCAtIGZpcnN0XSA9IDA7CisKKyAgcmV0dXJuIGNvcHk7Cit9CisKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciAqCitub3JtYWxpemUgKGFiZmQsIGZpbGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqZmlsZTsKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOworCisgIGlmIChmaWxlbmFtZSAhPSAoY2hhciAqKSBOVUxMKQorICAgIGZpbGVuYW1lKys7CisgIGVsc2UKKyAgICBmaWxlbmFtZSA9IGZpbGU7CisgIHJldHVybiBmaWxlbmFtZTsKK30KKyNlbmRpZgorCisvKiBCdWlsZCBhIEJGRCBzdHlsZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KKworYm9vbGVhbgorX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqKnRhYmxvYzsKKyAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOworICAgICBjb25zdCBjaGFyICoqbmFtZTsKK3sKKyAgKm5hbWUgPSAiQVJGSUxFTkFNRVMvIjsKKyAgcmV0dXJuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIGZhbHNlLCB0YWJsb2MsIHRhYmxlbik7Cit9CisKKy8qIEJ1aWxkIGFuIFNWUjQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCisKK2Jvb2xlYW4KK19iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0YWJsb2MsIHRhYmxlbiwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICoqdGFibG9jOworICAgICBiZmRfc2l6ZV90eXBlICp0YWJsZW47CisgICAgIGNvbnN0IGNoYXIgKipuYW1lOworeworICAqbmFtZSA9ICIvLyI7CisgIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cnVlLCB0YWJsb2MsIHRhYmxlbik7Cit9CisKKy8qIEZvbGxvd3MgYXJjaGl2ZV9oZWFkIGFuZCBwcm9kdWNlcyBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmCisgICBuZWNlc3NhcnkuICBSZXR1cm5zIChpbiB0YWJsb2MpIGEgcG9pbnRlciB0byBhbiBleHRlbmRlZCBuYW1lCisgICB0YWJsZSwgYW5kIGluIHRhYmxlbiB0aGUgbGVuZ3RoIG9mIHRoZSB0YWJsZS4gIElmIGl0IG1ha2VzIGFuIGVudHJ5CisgICBpdCBjbG9iYmVycyB0aGUgZmlsZW5hbWUgc28gdGhhdCB0aGUgZWxlbWVudCBtYXkgYmUgd3JpdHRlbiB3aXRob3V0CisgICBmdXJ0aGVyIG1hc3NhZ2UuICBSZXR1cm5zIHRydWUgaWYgaXQgcmFuIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYKKyAgIHNvbWV0aGluZyB3ZW50IHdyb25nLiAgQSBzdWNjZXNzZnVsIHJldHVybiBtYXkgc3RpbGwgaW52b2x2ZSBhCisgICB6ZXJvLWxlbmd0aCB0YWJsZW4hICAqLworCitib29sZWFuCitfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCB0cmFpbGluZ19zbGFzaCwgdGFibG9jLCB0YWJsZW4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiB0cmFpbGluZ19zbGFzaDsKKyAgICAgY2hhciAqKnRhYmxvYzsKKyAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOworeworICB1bnNpZ25lZCBpbnQgbWF4bmFtZSA9IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuOworICB1bnNpZ25lZCBpbnQgdG90YWxfbmFtZWxlbiA9IDA7CisgIGJmZCAqY3VycmVudDsKKyAgY2hhciAqc3RycHRyOworCisgICp0YWJsZW4gPSAwOworCisgIC8qIEZpZ3VyZSBvdXQgaG93IGxvbmcgdGhlIHRhYmxlIHNob3VsZCBiZSAqLworICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbm9ybWFsOworICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47CisKKyAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOworICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKKworICAgICAgaWYgKHRoaXNsZW4gPiBtYXhuYW1lCisJICAmJiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCisJdGhpc2xlbiA9IG1heG5hbWU7CisKKyAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKKwl7CisJICAvKiBBZGQgb25lIHRvIGxlYXZlIHJvb20gZm9yIFxuLiAgKi8KKwkgIHRvdGFsX25hbWVsZW4gKz0gdGhpc2xlbiArIDE7CisJICBpZiAodHJhaWxpbmdfc2xhc2gpCisJICAgIHsKKwkgICAgICAvKiBMZWF2ZSByb29tIGZvciB0cmFpbGluZyBzbGFzaC4gICovCisJICAgICAgKyt0b3RhbF9uYW1lbGVuOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKKwkgIGlmIChzdHJuY21wIChub3JtYWwsIGhkci0+YXJfbmFtZSwgdGhpc2xlbikgIT0gMAorCSAgICAgIHx8ICh0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZQorCQkgICYmIGhkci0+YXJfbmFtZVt0aGlzbGVuXSAhPSBhcl9wYWRjaGFyIChjdXJyZW50KSkpCisJICAgIHsKKwkgICAgICAvKiBNdXN0IGhhdmUgYmVlbiB1c2luZyBleHRlbmRlZCBmb3JtYXQgZXZlbiB0aG91Z2ggaXQKKwkgICAgICAgICBkaWRuJ3QgbmVlZCB0by4gIEZpeCBpdCB0byB1c2Ugbm9ybWFsIGZvcm1hdC4gICovCisJICAgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIG5vcm1hbCwgdGhpc2xlbik7CisJICAgICAgaWYgKHRoaXNsZW4gPCBtYXhuYW1lCisJCSAgfHwgKHRoaXNsZW4gPT0gbWF4bmFtZSAmJiB0aGlzbGVuIDwgc2l6ZW9mIGhkci0+YXJfbmFtZSkpCisJCWhkci0+YXJfbmFtZVt0aGlzbGVuXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAodG90YWxfbmFtZWxlbiA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgICp0YWJsb2MgPSBiZmRfemFsbG9jIChhYmZkLCB0b3RhbF9uYW1lbGVuKTsKKyAgaWYgKCp0YWJsb2MgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKnRhYmxlbiA9IHRvdGFsX25hbWVsZW47CisgIHN0cnB0ciA9ICp0YWJsb2M7CisKKyAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPQorICAgICAgIGN1cnJlbnQtPm5leHQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbm9ybWFsOworICAgICAgdW5zaWduZWQgaW50IHRoaXNsZW47CisKKyAgICAgIG5vcm1hbCA9IG5vcm1hbGl6ZSAoY3VycmVudCwgY3VycmVudC0+ZmlsZW5hbWUpOworICAgICAgaWYgKG5vcm1hbCA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgdGhpc2xlbiA9IHN0cmxlbiAobm9ybWFsKTsKKyAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZSkKKwl7CisJICAvKiBXb3JrcyBmb3Igbm93OyBtYXkgbmVlZCB0byBiZSByZS1lbmdpbmVlcmVkIGlmIHdlCisJICAgICBlbmNvdW50ZXIgYW4gb2RkYmFsbCBhcmNoaXZlIGZvcm1hdCBhbmQgd2FudCB0bworCSAgICAgZ2VuZXJhbGlzZSB0aGlzIGhhY2suICovCisJICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7CisJICBzdHJjcHkgKHN0cnB0ciwgbm9ybWFsKTsKKwkgIGlmICghIHRyYWlsaW5nX3NsYXNoKQorCSAgICBzdHJwdHJbdGhpc2xlbl0gPSAnXDAxMic7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJwdHJbdGhpc2xlbl0gPSAnLyc7CisJICAgICAgc3RycHRyW3RoaXNsZW4gKyAxXSA9ICdcMDEyJzsKKwkgICAgfQorCSAgaGRyLT5hcl9uYW1lWzBdID0gYXJfcGFkY2hhciAoY3VycmVudCk7CisJICAvKiBXZSBrbm93IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIChvbmUgb2YgdGhlIGZldworCSAgICAgY2FzZXMgd2hlcmUgeW91IG1heSBzYWZlbHkgdXNlIHNwcmludGYpLiAqLworCSAgc3ByaW50ZiAoKGhkci0+YXJfbmFtZSkgKyAxLCAiJS1kIiwgKHVuc2lnbmVkKSAoc3RycHRyIC0gKnRhYmxvYykpOworCSAgLyogS2luZGEgS2x1ZGd5LiAgV2Ugc2hvdWxkIGp1c3QgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZgorCSAgICAgc3ByaW50ZiBidXQgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgZ2V0IHRoaXMgcmlnaHQgKi8KKwkgIHsKKwkgICAgY2hhciAqdGVtcCA9IGhkci0+YXJfbmFtZSArIDI7CisJICAgIGZvciAoOyB0ZW1wIDwgaGRyLT5hcl9uYW1lICsgbWF4bmFtZTsgdGVtcCsrKQorCSAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQorCQkqdGVtcCA9ICcgJzsKKwkgIH0KKwkgIHN0cnB0ciArPSB0aGlzbGVuICsgMTsKKwkgIGlmICh0cmFpbGluZ19zbGFzaCkKKwkgICAgKytzdHJwdHI7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qKiBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyX2hkcnMgKi8KKworLyogVGFrZXMgYSBmaWxlbmFtZSwgcmV0dXJucyBhbiBhcmVsdF9kYXRhIGZvciBpdCwgb3IgTlVMTCBpZiBpdCBjYW4ndAorICAgbWFrZSBvbmUuICBUaGUgZmlsZW5hbWUgbXVzdCByZWZlciB0byBhIGZpbGVuYW1lIGluIHRoZSBmaWxlc3lzdGVtLgorICAgVGhlIGZpbGVuYW1lIGZpZWxkIG9mIHRoZSBhcl9oZHIgd2lsbCBOT1QgYmUgaW5pdGlhbGl6ZWQuICBJZiBtZW1iZXIKKyAgIGlzIHNldCwgYW5kIGl0J3MgYW4gaW4tbWVtb3J5IGJmZCwgd2UgZmFrZSBpdC4gKi8KKworc3RhdGljIHN0cnVjdCBhcmVsdGRhdGEgKgorYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFiZmQsIGZpbGVuYW1lLCBtZW1iZXIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGJmZCAqbWVtYmVyOworeworICBzdHJ1Y3Qgc3RhdCBzdGF0dXM7CisgIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7CisgIHN0cnVjdCBhcl9oZHIgKmhkcjsKKyAgY2hhciAqdGVtcCwgKnRlbXAxOworCisgIGlmIChtZW1iZXIgJiYgKG1lbWJlci0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIEFzc3VtZSB3ZSBqdXN0ICJtYWRlIiB0aGUgbWVtYmVyLCBhbmQgZmFrZSBpdCAqLworICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBtZW1iZXItPmlvc3RyZWFtOworICAgICAgdGltZSgmc3RhdHVzLnN0X210aW1lKTsKKyAgICAgIHN0YXR1cy5zdF91aWQgPSBnZXR1aWQoKTsKKyAgICAgIHN0YXR1cy5zdF9naWQgPSBnZXRnaWQoKTsKKyAgICAgIHN0YXR1cy5zdF9tb2RlID0gMDY0NDsKKyAgICAgIHN0YXR1cy5zdF9zaXplID0gYmltLT5zaXplOworICAgIH0KKyAgZWxzZSBpZiAoc3RhdCAoZmlsZW5hbWUsICZzdGF0dXMpICE9IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhcmVkID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArCisJCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7CisgIGlmIChhcmVkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGhkciA9IChzdHJ1Y3QgYXJfaGRyICopICgoKGNoYXIgKikgYXJlZCkgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpKTsKKworICAvKiBhciBoZWFkZXJzIGFyZSBzcGFjZSBwYWRkZWQsIG5vdCBudWxsIHBhZGRlZCEgKi8KKyAgbWVtc2V0ICgoUFRSKSBoZHIsICcgJywgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7CisKKyAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOworCisgIC8qIEdvZGRhbW5lZCBzcHJpbnRmIGRvZXNuJ3QgcGVybWl0IE1BWElNVU0gZmllbGQgbGVuZ3RocyAqLworICBzcHJpbnRmICgoaGRyLT5hcl9kYXRlKSwgIiUtMTJsZCIsIChsb25nKSBzdGF0dXMuc3RfbXRpbWUpOworICBzcHJpbnRmICgoaGRyLT5hcl91aWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF91aWQpOworICBzcHJpbnRmICgoaGRyLT5hcl9naWQpLCAiJWxkIiwgKGxvbmcpIHN0YXR1cy5zdF9naWQpOworICBzcHJpbnRmICgoaGRyLT5hcl9tb2RlKSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0dXMuc3RfbW9kZSk7CisgIHNwcmludGYgKChoZHItPmFyX3NpemUpLCAiJS0xMGxkIiwgKGxvbmcpIHN0YXR1cy5zdF9zaXplKTsKKyAgLyogQ29ycmVjdCBmb3IgYSBsb3NzYWdlIGluIHNwcmludGYgd2hlcmVieSBpdCBudWxsLXRlcm1pbmF0ZXMuICBJIGNhbm5vdAorICAgICB1bmRlcnN0YW5kIGhvdyB0aGVzZSBDIGxvc2VycyBjb3VsZCBkZXNpZ24gc3VjaCBhIHJhbXNoYWNrbGUgYnVuY2ggb2YKKyAgICAgSU8gb3BlcmF0aW9ucyAqLworICB0ZW1wID0gKGNoYXIgKikgaGRyOworICB0ZW1wMSA9IHRlbXAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpIC0gMjsKKyAgZm9yICg7IHRlbXAgPCB0ZW1wMTsgdGVtcCsrKQorICAgIHsKKyAgICAgIGlmICgqdGVtcCA9PSAnXDAnKQorCSp0ZW1wID0gJyAnOworICAgIH0KKyAgc3RybmNweSAoaGRyLT5hcl9mbWFnLCBBUkZNQUcsIDIpOworICBhcmVkLT5wYXJzZWRfc2l6ZSA9IHN0YXR1cy5zdF9zaXplOworICBhcmVkLT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcjsKKworICByZXR1cm4gYXJlZDsKK30KKworLyogVGhpcyBpcyBtYWdpYyByZXF1aXJlZCBieSB0aGUgImFyIiBwcm9ncmFtLiAgU2luY2UgaXQncworICAgIHVuZG9jdW1lbnRlZCwgaXQncyB1bmRvY3VtZW50ZWQuICBZb3UgbWF5IHRoaW5rIHRoYXQgaXQgd291bGQgdGFrZQorICAgIGEgc3Ryb25nIHN0b21hY2ggdG8gd3JpdGUgdGhpcywgYW5kIGl0IGRvZXMsIGJ1dCBpdCB0YWtlcyBldmVuIGEKKyAgICBzdHJvbmdlciBzdG9tYWNoIHRvIHRyeSB0byBjb2RlIGFyb3VuZCBzdWNoIGEgdGhpbmchICAqLworCitzdHJ1Y3QgYXJfaGRyICpiZmRfc3BlY2lhbF91bmRvY3VtZW50ZWRfZ2x1ZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0cnVjdCBhcl9oZHIgKgorYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgKGFiZmQsIGZpbGVuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworeworICBzdHJ1Y3QgYXJlbHRkYXRhICphcl9lbHQgPSBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYWJmZCwgZmlsZW5hbWUsIDApOworICBpZiAoYXJfZWx0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiAoc3RydWN0IGFyX2hkciAqKSBhcl9lbHQtPmFyY2hfaGVhZGVyOworfQorCisKKy8qIEFuYWxvZ291cyB0byBzdGF0IGNhbGwgKi8KK2ludAorYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBzdGF0ICpidWY7Cit7CisgIHN0cnVjdCBhcl9oZHIgKmhkcjsKKyAgY2hhciAqYWxvc2VyOworCisgIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaGRyID0gYXJjaF9oZHIgKGFiZmQpOworCisjZGVmaW5lIGZvbyhhcmVsdCwgc3RlbHQsIHNpemUpICBcCisgIGJ1Zi0+c3RlbHQgPSBzdHJ0b2wgKGhkci0+YXJlbHQsICZhbG9zZXIsIHNpemUpOyBcCisgIGlmIChhbG9zZXIgPT0gaGRyLT5hcmVsdCkgcmV0dXJuIC0xOworCisgIGZvbyAoYXJfZGF0ZSwgc3RfbXRpbWUsIDEwKTsKKyAgZm9vIChhcl91aWQsIHN0X3VpZCwgMTApOworICBmb28gKGFyX2dpZCwgc3RfZ2lkLCAxMCk7CisgIGZvbyAoYXJfbW9kZSwgc3RfbW9kZSwgOCk7CisKKyAgYnVmLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7CisKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2JmZF9kb250X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOworICAgICBjaGFyICphcmhkcjsKK3sKKyAgLyogRklYTUU6IFRoaXMgaW50ZXJhY3RzIHVucGxlYXNhbnRseSB3aXRoIGFyJ3MgcXVpY2stYXBwZW5kIG9wdGlvbi4KKyAgICAgRm9ydHVuYXRlbHkgaWM5NjAgdXNlcnMgd2lsbCBuZXZlciB1c2UgdGhhdCBvcHRpb24uICBGaXhpbmcgdGhpcworICAgICBpcyB2ZXJ5IGhhcmQ7IGZvcnR1bmF0ZWx5IEkga25vdyBob3cgdG8gZG8gaXQgYW5kIHdpbGwgZG8gc28gb25jZQorICAgICBpbnRlbCdzIHJlbGVhc2UgaXMgb3V0IHRoZSBkb29yLiAqLworCisgIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOworICBzaXplX3QgbGVuZ3RoOworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgc2l6ZV90IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOworCisgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCisgICAgeworICAgICAgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZpbGVuYW1lID0gbm9ybWFsaXplIChhYmZkLCBwYXRobmFtZSk7CisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEZJWE1FICovCisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7CisKKyAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCisgICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOworCisgIC8qIEFkZCB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICAqLworICBpZiAobGVuZ3RoIDwgbWF4bGVuCisgICAgICB8fCAobGVuZ3RoID09IG1heGxlbiAmJiBsZW5ndGggPCBzaXplb2YgaGRyLT5hcl9uYW1lKSkKKyAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Cit9CisKK3ZvaWQKK2JmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7CisgICAgIGNoYXIgKmFyaGRyOworeworICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKKyAgaW50IGxlbmd0aDsKKyAgQ09OU1QgY2hhciAqZmlsZW5hbWUgPSBzdHJyY2hyIChwYXRobmFtZSwgJy8nKTsKKyAgaW50IG1heGxlbiA9IGFyX21heG5hbWVsZW4gKGFiZmQpOworCisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgIGZpbGVuYW1lID0gcGF0aG5hbWU7CisgIGVsc2UKKyAgICArK2ZpbGVuYW1lOworCisgIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOworCisgIGlmIChsZW5ndGggPD0gbWF4bGVuKQorICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KKyAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKKyAgICAgIGxlbmd0aCA9IG1heGxlbjsKKyAgICB9CisKKyAgaWYgKGxlbmd0aCA8IG1heGxlbikKKyAgICAoaGRyLT5hcl9uYW1lKVtsZW5ndGhdID0gYXJfcGFkY2hhciAoYWJmZCk7Cit9CisKKy8qIFN0b3JlIG5hbWUgaW50byBhciBoZWFkZXIuICBUcnVuY2F0ZXMgdGhlIG5hbWUgdG8gZml0LgorICAgMT4gc3RyaXAgcGF0aG5hbWUgdG8gYmUganVzdCB0aGUgYmFzZW5hbWUuCisgICAyPiBpZiBpdCdzIHNob3J0IGVudWYgdG8gZml0LCBzdHVmZiBpdCBpbi4KKyAgIDM+IElmIGl0IGRvZXNuJ3QgZW5kIHdpdGggLm8sIHRydW5jYXRlIGl0IHRvIGZpdAorICAgND4gdHJ1bmNhdGUgaXQgYmVmb3JlIHRoZSAubywgYXBwZW5kIC5vLCBzdHVmZiBUSEFUIGluLiAgKi8KKworLyogVGhpcyBpcyB3aGF0IGdudSBhciBkb2VzLiAgSXQncyBiZXR0ZXIgYnV0IGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgYnNkIGFyLiAqLworCit2b2lkCitiZmRfZ251X3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOworICAgICBjaGFyICphcmhkcjsKK3sKKyAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7CisgIGludCBsZW5ndGg7CisgIENPTlNUIGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAocGF0aG5hbWUsICcvJyk7CisgIGludCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKKworICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOworICBlbHNlCisgICAgKytmaWxlbmFtZTsKKworICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKKworICBpZiAobGVuZ3RoIDw9IG1heGxlbikKKyAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7CisgIGVsc2UKKyAgICB7CQkJCS8qIHBhdGhuYW1lOiBtZWV0IHByb2NydXN0ZXMgKi8KKyAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbWF4bGVuKTsKKyAgICAgIGlmICgoZmlsZW5hbWVbbGVuZ3RoIC0gMl0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbbGVuZ3RoIC0gMV0gPT0gJ28nKSkKKwl7CisJICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMl0gPSAnLic7CisJICBoZHItPmFyX25hbWVbbWF4bGVuIC0gMV0gPSAnbyc7CisJfQorICAgICAgbGVuZ3RoID0gbWF4bGVuOworICAgIH0KKworICBpZiAobGVuZ3RoIDwgMTYpCisgICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOworfQorDAorLyogVGhlIEJGRCBpcyBvcGVuIGZvciB3cml0ZSBhbmQgaGFzIGl0cyBmb3JtYXQgc2V0IHRvIGJmZF9hcmNoaXZlICovCisKK2Jvb2xlYW4KK19iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYXJjaCkKKyAgICAgYmZkICphcmNoOworeworICBiZmQgKmN1cnJlbnQ7CisgIGNoYXIgKmV0YWJsZSA9IE5VTEw7CisgIGJmZF9zaXplX3R5cGUgZWxlbmd0aCA9IDA7CisgIGNvbnN0IGNoYXIgKmVuYW1lID0gTlVMTDsKKyAgYm9vbGVhbiBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFyY2gpOworICBib29sZWFuIGhhc29iamVjdHMgPSBmYWxzZTsJLyogaWYgbm8gLm8ncywgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBtYXAgKi8KKyAgYmZkX3NpemVfdHlwZSB3cm90ZTsKKyAgdW5zaWduZWQgaW50IGk7CisgIGludCB0cmllczsKKworICAvKiBWZXJpZnkgdGhlIHZpYWJpbGl0eSBvZiBhbGwgZW50cmllczsgaWYgYW55IG9mIHRoZW0gbGl2ZSBpbiB0aGUKKyAgICAgZmlsZXN5c3RlbSAoYXMgb3Bwb3NlZCB0byBsaXZpbmcgaW4gYW4gYXJjaGl2ZSBvcGVuIGZvciBpbnB1dCkKKyAgICAgdGhlbiBjb25zdHJ1Y3QgYSBmcmVzaCBhcl9oZHIgZm9yIHRoZW0uICAqLworICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChiZmRfd3JpdGVfcCAoY3VycmVudCkpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCisJeworCSAgY3VycmVudC0+YXJlbHRfZGF0YSA9CisJICAgIChQVFIpIGJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhcmNoLCBjdXJyZW50LT5maWxlbmFtZSwgY3VycmVudCk7CisJICBpZiAoIWN1cnJlbnQtPmFyZWx0X2RhdGEpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogUHV0IGluIHRoZSBmaWxlIG5hbWUgKi8KKwkgIEJGRF9TRU5EIChhcmNoLCBfYmZkX3RydW5jYXRlX2FybmFtZSwgKGFyY2gsCisJCQkJCQkgY3VycmVudC0+ZmlsZW5hbWUsCisJCQkJCSAgICAgIChjaGFyICopIGFyY2hfaGRyIChjdXJyZW50KSkpOworCX0KKworICAgICAgaWYgKG1ha2VtYXAgJiYgISBoYXNvYmplY3RzKQorCXsJCQkvKiBkb24ndCBib3RoZXIgaWYgd2Ugd29uJ3QgbWFrZSBhIG1hcCEgKi8KKwkgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkpCisjaWYgMAkJCQkvKiBGSVhNRSAtLSB0aGVzZSBhcmUgbm90IHNldCBjb3JyZWN0bHkgKi8KKwkgICAgICAmJiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoY3VycmVudCkgJiBIQVNfU1lNUykpCisjZW5kaWYKKwkgICAgKQorCSAgICBoYXNvYmplY3RzID0gdHJ1ZTsKKwl9CisgICAgfQorCisgIGlmICghQkZEX1NFTkQgKGFyY2gsIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUsCisJCSAoYXJjaCwgJmV0YWJsZSwgJmVsZW5ndGgsICZlbmFtZSkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3NlZWsgKGFyY2gsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworI2lmZGVmIEdOVTk2MAorICB3cm90ZSA9IGJmZF93cml0ZSAoQkZEX0dOVTk2MF9BUk1BRyAoYXJjaCksIDEsIFNBUk1BRywgYXJjaCk7CisjZWxzZQorICB3cm90ZSA9IGJmZF93cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgYXJjaCk7CisjZW5kaWYKKyAgaWYgKHdyb3RlICE9IFNBUk1BRykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKKyAgICB7CisgICAgICBpZiAoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCkgIT0gdHJ1ZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChlbGVuZ3RoICE9IDApCisgICAgeworICAgICAgc3RydWN0IGFyX2hkciBoZHI7CisKKyAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKKyAgICAgIHN0cmNweSAoaGRyLmFyX25hbWUsIGVuYW1lKTsKKyAgICAgIC8qIFJvdW5kIHNpemUgdXAgdG8gZXZlbiBudW1iZXIgaW4gYXJjaGl2ZSBoZWFkZXIuICAqLworICAgICAgc3ByaW50ZiAoJihoZHIuYXJfc2l6ZVswXSksICIlLTEwZCIsCisJICAgICAgIChpbnQpICgoZWxlbmd0aCArIDEpICYgfjEpKTsKKyAgICAgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKKwlpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKKwkgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7CisgICAgICBpZiAoKGJmZF93cml0ZSAoKGNoYXIgKikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKKwkgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQorCSAgfHwgYmZkX3dyaXRlIChldGFibGUsIDEsIGVsZW5ndGgsIGFyY2gpICE9IGVsZW5ndGgpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKChlbGVuZ3RoICUgMikgPT0gMSkKKwl7CisJICBpZiAoYmZkX3dyaXRlICgiXDAxMiIsIDEsIDEsIGFyY2gpICE9IDEpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGZvciAoY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCisgICAgeworICAgICAgY2hhciBidWZmZXJbREVGQVVMVF9CVUZGRVJTSVpFXTsKKyAgICAgIHVuc2lnbmVkIGludCByZW1haW5pbmcgPSBhcmVsdF9zaXplIChjdXJyZW50KTsKKyAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGFyY2hfaGRyIChjdXJyZW50KTsKKworICAgICAgLyogd3JpdGUgYXIgaGVhZGVyICovCisgICAgICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBoZHIsIDEsIHNpemVvZiAoKmhkciksIGFyY2gpICE9IHNpemVvZiAoKmhkcikpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGJmZF9zZWVrIChjdXJyZW50LCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHdoaWxlIChyZW1haW5pbmcpCisJeworCSAgdW5zaWduZWQgaW50IGFtdCA9IERFRkFVTFRfQlVGRkVSU0laRTsKKwkgIGlmIChhbXQgPiByZW1haW5pbmcpCisJICAgIGFtdCA9IHJlbWFpbmluZzsKKwkgIGVycm5vID0gMDsKKwkgIGlmIChiZmRfcmVhZCAoYnVmZmVyLCBhbXQsIDEsIGN1cnJlbnQpICE9IGFtdCkKKwkgICAgeworCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgYW10LCAxLCBhcmNoKSAhPSBhbXQpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHJlbWFpbmluZyAtPSBhbXQ7CisJfQorICAgICAgaWYgKChhcmVsdF9zaXplIChjdXJyZW50KSAlIDIpID09IDEpCisJeworCSAgaWYgKGJmZF93cml0ZSAoIlwwMTIiLCAxLCAxLCBhcmNoKSAhPSAxKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQorICAgIHsKKyAgICAgIC8qIFZlcmlmeSB0aGUgdGltZXN0YW1wIGluIHRoZSBhcmNoaXZlIGZpbGUuICBJZiBpdCB3b3VsZCBub3QgYmUKKwkgYWNjZXB0ZWQgYnkgdGhlIGxpbmtlciwgcmV3cml0ZSBpdCB1bnRpbCBpdCB3b3VsZCBiZS4gIElmCisJIGFueXRoaW5nIG9kZCBoYXBwZW5zLCBicmVhayBvdXQgYW5kIGp1c3QgcmV0dXJuLiAgKFRoZQorCSBCZXJrZWxleSBsaW5rZXIgY2hlY2tzIHRoZSB0aW1lc3RhbXAgYW5kIHJlZnVzZXMgdG8gcmVhZCB0aGUKKwkgdGFibGUtb2YtY29udGVudHMgaWYgaXQgaXMgPjYwIHNlY29uZHMgbGVzcyB0aGFuIHRoZSBmaWxlJ3MKKwkgbW9kaWZpZWQtdGltZS4gIFRoYXQgcGFpbmZ1bCBoYWNrIHJlcXVpcmVzIHRoaXMgcGFpbmZ1bCBoYWNrLiAgKi8KKyAgICAgIHRyaWVzID0gMTsKKyAgICAgIGRvCisJeworCSAgaWYgKGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKSkKKwkgICAgYnJlYWs7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIldhcm5pbmc6IHdyaXRpbmcgYXJjaGl2ZSB3YXMgc2xvdzogcmV3cml0aW5nIHRpbWVzdGFtcFxuIikpOworCX0KKyAgICAgIHdoaWxlICgrK3RyaWVzIDwgNik7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogTm90ZSB0aGF0IHRoZSBuYW1pZHggZm9yIHRoZSBmaXJzdCBzeW1ib2wgaXMgMCAqLworCitib29sZWFuCitfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoKQorICAgICBiZmQgKmFyY2g7CisgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOworeworICBjaGFyICpmaXJzdF9uYW1lID0gTlVMTDsKKyAgYmZkICpjdXJyZW50OworICBmaWxlX3B0ciBlbHRfbm8gPSAwOworICBzdHJ1Y3Qgb3JsICptYXAgPSBOVUxMOworICBpbnQgb3JsX21heCA9IDEwMjQ7CQkvKiBmaW5lIGluaXRpYWwgZGVmYXVsdCAqLworICBpbnQgb3JsX2NvdW50ID0gMDsKKyAgaW50IHN0cmlkeCA9IDA7CQkvKiBzdHJpbmcgaW5kZXggKi8KKyAgYXN5bWJvbCAqKnN5bXMgPSBOVUxMOworICBsb25nIHN5bXNfbWF4ID0gMDsKKyAgYm9vbGVhbiByZXQ7CisKKyAgLyogRHVubm8gaWYgdGhpcyBpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBpbmZvLi4uICovCisgIGlmIChlbGVuZ3RoICE9IDApCisgICAgZWxlbmd0aCArPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOworICBlbGVuZ3RoICs9IGVsZW5ndGggJSAyOworCisgIG1hcCA9IChzdHJ1Y3Qgb3JsICopIGJmZF9tYWxsb2MgKG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKTsKKyAgaWYgKG1hcCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFdlIHB1dCB0aGUgc3ltYm9sIG5hbWVzIG9uIHRoZSBhcmNoIG9iamFsbG9jLCBhbmQgdGhlbiBkaXNjYXJkCisgICAgIHRoZW0gd2hlbiBkb25lLiAgKi8KKyAgZmlyc3RfbmFtZSA9IGJmZF9hbGxvYyAoYXJjaCwgMSk7CisgIGlmIChmaXJzdF9uYW1lID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogRHJvcCBhbGwgdGhlIGZpbGVzIGNhbGxlZCBfXy5TWU1ERUYsIHdlJ3JlIGdvaW5nIHRvIG1ha2Ugb3VyCisgICAgIG93biAqLworICB3aGlsZSAoYXJjaC0+YXJjaGl2ZV9oZWFkICYmCisJIHN0cmNtcCAoYXJjaC0+YXJjaGl2ZV9oZWFkLT5maWxlbmFtZSwgIl9fLlNZTURFRiIpID09IDApCisgICAgYXJjaC0+YXJjaGl2ZV9oZWFkID0gYXJjaC0+YXJjaGl2ZV9oZWFkLT5uZXh0OworCisgIC8qIE1hcCBvdmVyIGVhY2ggZWxlbWVudCAqLworICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7CisgICAgICAgY3VycmVudCAhPSAoYmZkICopIE5VTEw7CisgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsIGVsdF9ubysrKQorICAgIHsKKyAgICAgIGlmICgoYmZkX2NoZWNrX2Zvcm1hdCAoY3VycmVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKKwkgICYmICgoYmZkX2dldF9maWxlX2ZsYWdzIChjdXJyZW50KSAmIEhBU19TWU1TKSkpCisJeworCSAgbG9uZyBzdG9yYWdlOworCSAgbG9uZyBzeW1jb3VudDsKKwkgIGxvbmcgc3JjX2NvdW50OworCisJICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGN1cnJlbnQpOworCSAgaWYgKHN0b3JhZ2UgPCAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKHN0b3JhZ2UgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChzdG9yYWdlID4gc3ltc19tYXgpCisJCXsKKwkJICBpZiAoc3ltc19tYXggPiAwKQorCQkgICAgZnJlZSAoc3ltcyk7CisJCSAgc3ltc19tYXggPSBzdG9yYWdlOworCQkgIHN5bXMgPSAoYXN5bWJvbCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3ltc19tYXgpOworCQkgIGlmIChzeW1zID09IE5VTEwpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGN1cnJlbnQsIHN5bXMpOworCSAgICAgIGlmIChzeW1jb3VudCA8IDApCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgLyogTm93IG1hcCBvdmVyIGFsbCB0aGUgc3ltYm9scywgcGlja2luZyBvdXQgdGhlIG9uZXMgd2Ugd2FudCAqLworCSAgICAgIGZvciAoc3JjX2NvdW50ID0gMDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQorCQl7CisJCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoc3ltc1tzcmNfY291bnRdKS0+ZmxhZ3M7CisJCSAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbc3JjX2NvdW50XS0+c2VjdGlvbjsKKworCQkgIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMIHx8CisJCSAgICAgICBmbGFncyAmIEJTRl9XRUFLIHx8CisJCSAgICAgICBmbGFncyAmIEJTRl9JTkRJUkVDVCB8fAorCQkgICAgICAgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQorCQkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKKwkJICAgIHsKKwkJICAgICAgc2l6ZV90IG5hbWVsZW47CisJCSAgICAgIHN0cnVjdCBvcmwgKm5ld19tYXA7CisKKwkJICAgICAgLyogVGhpcyBzeW1ib2wgd2lsbCBnbyBpbnRvIHRoZSBhcmNoaXZlIGhlYWRlciAqLworCQkgICAgICBpZiAob3JsX2NvdW50ID09IG9ybF9tYXgpCisJCQl7CisJCQkgIG9ybF9tYXggKj0gMjsKKwkJCSAgbmV3X21hcCA9CisJCQkgICAgKChzdHJ1Y3Qgb3JsICopCisJCQkgICAgIGJmZF9yZWFsbG9jIChtYXAsIG9ybF9tYXggKiBzaXplb2YgKHN0cnVjdCBvcmwpKSk7CisJCQkgIGlmIChuZXdfbWFwID09IChzdHJ1Y3Qgb3JsICopIE5VTEwpCisJCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkJCSAgbWFwID0gbmV3X21hcDsKKwkJCX0KKworCQkgICAgICBuYW1lbGVuID0gc3RybGVuIChzeW1zW3NyY19jb3VudF0tPm5hbWUpOworCQkgICAgICBtYXBbb3JsX2NvdW50XS5uYW1lID0gKChjaGFyICoqKQorCQkJCQkgICAgIGJmZF9hbGxvYyAoYXJjaCwKKwkJCQkJCQlzaXplb2YgKGNoYXIgKikpKTsKKwkJICAgICAgaWYgKG1hcFtvcmxfY291bnRdLm5hbWUgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkgICAgICAqKG1hcFtvcmxfY291bnRdLm5hbWUpID0gYmZkX2FsbG9jIChhcmNoLCBuYW1lbGVuICsgMSk7CisJCSAgICAgIGlmICgqKG1hcFtvcmxfY291bnRdLm5hbWUpID09IE5VTEwpCisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJICAgICAgc3RyY3B5ICgqKG1hcFtvcmxfY291bnRdLm5hbWUpLCBzeW1zW3NyY19jb3VudF0tPm5hbWUpOworCQkgICAgICAobWFwW29ybF9jb3VudF0pLnBvcyA9IChmaWxlX3B0cikgY3VycmVudDsKKwkJICAgICAgKG1hcFtvcmxfY291bnRdKS5uYW1pZHggPSBzdHJpZHg7CisKKwkJICAgICAgc3RyaWR4ICs9IG5hbWVsZW4gKyAxOworCQkgICAgICArK29ybF9jb3VudDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIC8qIE5vdyBhc2sgdGhlIEJGRCB0byBmcmVlIHVwIGFueSBjYWNoZWQgaW5mb3JtYXRpb24sIHNvIHdlCisJICAgICBkb24ndCBmaWxsIGFsbCBvZiBtZW1vcnkgd2l0aCBzeW1ib2wgdGFibGVzLiAgKi8KKwkgIGlmICghIGJmZF9mcmVlX2NhY2hlZF9pbmZvIChjdXJyZW50KSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICAvKiBPSywgbm93IHdlIGhhdmUgY29sbGVjdGVkIGFsbCB0aGUgZGF0YSwgbGV0J3Mgd3JpdGUgdGhlbSBvdXQgKi8KKyAgcmV0ID0gQkZEX1NFTkQgKGFyY2gsIHdyaXRlX2FybWFwLAorCQkgIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KSk7CisKKyAgaWYgKHN5bXNfbWF4ID4gMCkKKyAgICBmcmVlIChzeW1zKTsKKyAgaWYgKG1hcCAhPSBOVUxMKQorICAgIGZyZWUgKG1hcCk7CisgIGlmIChmaXJzdF9uYW1lICE9IE5VTEwpCisgICAgYmZkX3JlbGVhc2UgKGFyY2gsIGZpcnN0X25hbWUpOworCisgIHJldHVybiByZXQ7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChzeW1zX21heCA+IDApCisgICAgZnJlZSAoc3ltcyk7CisgIGlmIChtYXAgIT0gTlVMTCkKKyAgICBmcmVlIChtYXApOworICBpZiAoZmlyc3RfbmFtZSAhPSBOVUxMKQorICAgIGJmZF9yZWxlYXNlIChhcmNoLCBmaXJzdF9uYW1lKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2xlYW4KK2JzZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKKyAgICAgYmZkICphcmNoOworICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKKyAgICAgc3RydWN0IG9ybCAqbWFwOworICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OworICAgICBpbnQgc3RyaWR4OworeworICBpbnQgcGFkaXQgPSBzdHJpZHggJiAxOworICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IG9ybF9jb3VudCAqIEJTRF9TWU1ERUZfU0laRTsKKyAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKKyAgLyogSW5jbHVkZSA4IGJ5dGVzIHRvIHN0b3JlIHJhbmxpYnNpemUgYW5kIHN0cmluZ3NpemUgaW4gb3V0cHV0LiAqLworICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHJhbmxpYnNpemUgKyBzdHJpbmdzaXplICsgODsKKyAgZmlsZV9wdHIgZmlyc3RyZWFsOworICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7CisgIGJmZCAqbGFzdF9lbHQgPSBjdXJyZW50OwkvKiBsYXN0IGVsZW1lbnQgYXJjaCBzZWVuICovCisgIGJmZF9ieXRlIHRlbXBbNF07CisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgc3RydWN0IGFyX2hkciBoZHI7CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZpcnN0cmVhbCA9IG1hcHNpemUgKyBlbGVuZ3RoICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIFNBUk1BRzsKKworICBzdGF0IChhcmNoLT5maWxlbmFtZSwgJnN0YXRidWYpOworICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7CisgIHNwcmludGYgKGhkci5hcl9uYW1lLCBSQU5MSUJNQUcpOworICAvKiBSZW1lbWJlciB0aGUgdGltZXN0YW1wLCB0byBrZWVwIGl0IGhvbHkuICBCdXQgZnVkZ2UgaXQgYSBsaXR0bGUuICAqLworICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIEFSTUFQX1RJTUVfT0ZGU0VUOworICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfZGF0ZXBvcyA9IChTQVJNQUcKKwkJCQkgICAgICArIG9mZnNldG9mIChzdHJ1Y3QgYXJfaGRyLCBhcl9kYXRlWzBdKSk7CisgIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7CisjaWZuZGVmIF9XSU4zMgorICBzcHJpbnRmIChoZHIuYXJfdWlkLCAiJWxkIiwgKGxvbmcpIGdldHVpZCAoKSk7CisgIHNwcmludGYgKGhkci5hcl9naWQsICIlbGQiLCAobG9uZykgZ2V0Z2lkICgpKTsKKyNlbHNlCisgIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgNjY2KTsKKyAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSA0Mik7CisjZW5kaWYKKyAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOworICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKKyAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKKyAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7CisgIGlmIChiZmRfd3JpdGUgKChjaGFyICopICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCisgICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgYmZkX2hfcHV0XzMyIChhcmNoLCAoYmZkX3ZtYSkgcmFubGlic2l6ZSwgdGVtcCk7CisgIGlmIChiZmRfd3JpdGUgKHRlbXAsIDEsIHNpemVvZiAodGVtcCksIGFyY2gpICE9IHNpemVvZiAodGVtcCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9ybF9jb3VudDsgY291bnQrKykKKyAgICB7CisgICAgICBiZmRfYnl0ZSBidWZbQlNEX1NZTURFRl9TSVpFXTsKKworICAgICAgaWYgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpICE9IGxhc3RfZWx0KQorCXsKKwkgIGRvCisJICAgIHsKKwkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOworCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOworCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OworCSAgICB9CisJICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIChtYXBbY291bnRdKS5wb3MpOworCX0JCQkvKiBpZiBuZXcgYXJjaGl2ZSBlbGVtZW50ICovCisKKyAgICAgIGxhc3RfZWx0ID0gY3VycmVudDsKKyAgICAgIGJmZF9oX3B1dF8zMiAoYXJjaCwgbWFwW2NvdW50XS5uYW1pZHgsIGJ1Zik7CisgICAgICBiZmRfaF9wdXRfMzIgKGFyY2gsIGZpcnN0cmVhbCwgYnVmICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7CisgICAgICBpZiAoYmZkX3dyaXRlIChidWYsIEJTRF9TWU1ERUZfU0laRSwgMSwgYXJjaCkgIT0gQlNEX1NZTURFRl9TSVpFKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KKyAgYmZkX2hfcHV0XzMyIChhcmNoLCBzdHJpbmdzaXplLCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAodGVtcCwgMSwgc2l6ZW9mICh0ZW1wKSwgYXJjaCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9ybF9jb3VudDsgY291bnQrKykKKyAgICB7CisgICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7CisKKyAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogVGhlIHNwZWMgc2V6IHRoaXMgc2hvdWxkIGJlIGEgbmV3bGluZS4gIEJ1dCBpbiBvcmRlciB0byBiZQorICAgICBidWctY29tcGF0aWJsZSBmb3Igc3VuJ3MgYXIgd2UgdXNlIGEgbnVsbC4gKi8KKyAgaWYgKHBhZGl0KQorICAgIHsKKyAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEF0IHRoZSBlbmQgb2YgYXJjaGl2ZSBmaWxlIGhhbmRsaW5nLCB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUKKyAgIGZpbGUsIHNvIHRoZSBsaW5rZXIgd2lsbCBhY2NlcHQgaXQuCisKKyAgIFJldHVybiB0cnVlIGlmIHRoZSB0aW1lc3RhbXAgd2FzIE9LLCBvciBhbiB1bnVzdWFsIHByb2JsZW0gaGFwcGVuZWQuCisgICBSZXR1cm4gZmFsc2UgaWYgd2UgdXBkYXRlZCB0aGUgdGltZXN0YW1wLiAgKi8KKworYm9vbGVhbgorX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKQorICAgICBiZmQgKmFyY2g7Cit7CisgIHN0cnVjdCBzdGF0IGFyY2hzdGF0OworICBzdHJ1Y3QgYXJfaGRyIGhkcjsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLyogRmx1c2ggd3JpdGVzLCBnZXQgbGFzdC13cml0ZSB0aW1lc3RhbXAgZnJvbSBmaWxlLCBhbmQgY29tcGFyZSBpdAorICAgICB0byB0aGUgdGltZXN0YW1wIElOIHRoZSBmaWxlLiAgKi8KKyAgYmZkX2ZsdXNoIChhcmNoKTsKKyAgaWYgKGJmZF9zdGF0IChhcmNoLCAmYXJjaHN0YXQpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoXygiUmVhZGluZyBhcmNoaXZlIGZpbGUgbW9kIHRpbWVzdGFtcCIpKTsKKyAgICAgIHJldHVybiB0cnVlOwkJLyogQ2FuJ3QgcmVhZCBtb2QgdGltZSBmb3Igc29tZSByZWFzb24gKi8KKyAgICB9CisgIGlmIChhcmNoc3RhdC5zdF9tdGltZSA8PSBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKQorICAgIHJldHVybiB0cnVlOwkJLyogT0sgYnkgdGhlIGxpbmtlcidzIHJ1bGVzICovCisKKyAgLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAuICAqLworICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gYXJjaHN0YXQuc3RfbXRpbWUgKyBBUk1BUF9USU1FX09GRlNFVDsKKworICAvKiBQcmVwYXJlIGFuIEFTQ0lJIHZlcnNpb24gc3VpdGFibGUgZm9yIHdyaXRpbmcuICAqLworICBtZW1zZXQgKGhkci5hcl9kYXRlLCAwLCBzaXplb2YgKGhkci5hcl9kYXRlKSk7CisgIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5hcl9kYXRlKTsgaSsrKQorICAgIGlmIChoZHIuYXJfZGF0ZVtpXSA9PSAnXDAnKQorICAgICAgKGhkci5hcl9kYXRlKVtpXSA9ICcgJzsKKworICAvKiBXcml0ZSBpdCBpbnRvIHRoZSBmaWxlLiAgKi8KKyAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MgPSAoU0FSTUFHCisJCQkJICAgICAgKyBvZmZzZXRvZiAoc3RydWN0IGFyX2hkciwgYXJfZGF0ZVswXSkpOworICBpZiAoYmZkX3NlZWsgKGFyY2gsIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgKGJmZF93cml0ZSAoaGRyLmFyX2RhdGUsIHNpemVvZiAoaGRyLmFyX2RhdGUpLCAxLCBhcmNoKQorCSAgIT0gc2l6ZW9mIChoZHIuYXJfZGF0ZSkpKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBiZmQgY2FuJ3QgY2FsbCBwZXJyb3IuICAqLworICAgICAgcGVycm9yIChfKCJXcml0aW5nIHVwZGF0ZWQgYXJtYXAgdGltZXN0YW1wIikpOworICAgICAgcmV0dXJuIHRydWU7CQkvKiBTb21lIGVycm9yIHdoaWxlIHdyaXRpbmcgKi8KKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOwkJCS8qIFdlIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcCBzdWNjZXNzZnVsbHkuICAqLworfQorDAorLyogQSBjb2ZmIGFybWFwIGxvb2tzIGxpa2UgOgorICAgbEFSTUFHCisgICBzdHJ1Y3QgYXJfaGRyIHdpdGggbmFtZSA9ICcvJworICAgbnVtYmVyIG9mIHN5bWJvbHMKKyAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgMAorICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCAxCisKKyAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgbi0xCisgICBzeW1ib2wgbmFtZSAwCisgICBzeW1ib2wgbmFtZSAxCisKKyAgIHN5bWJvbCBuYW1lIG4tMQorKi8KKworYm9vbGVhbgorY29mZl93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBzeW1ib2xfY291bnQsIHN0cmlkeCkKKyAgICAgYmZkICphcmNoOworICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKKyAgICAgc3RydWN0IG9ybCAqbWFwOworICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50OworICAgICBpbnQgc3RyaWR4OworeworICAvKiBUaGUgc2l6ZSBvZiB0aGUgcmFubGliIGlzIHRoZSBudW1iZXIgb2YgZXhwb3J0ZWQgc3ltYm9scyBpbiB0aGUKKyAgICAgYXJjaGl2ZSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBpbnQsICsgYW4gaW50IGZvciB0aGUgY291bnQgKi8KKyAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSAoc3ltYm9sX2NvdW50ICogNCkgKyA0OworICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeDsKKyAgdW5zaWduZWQgaW50IG1hcHNpemUgPSBzdHJpbmdzaXplICsgcmFubGlic2l6ZTsKKyAgZmlsZV9wdHIgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHI7CisgIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKKyAgdW5zaWduZWQgaW50IGNvdW50OworICBzdHJ1Y3QgYXJfaGRyIGhkcjsKKyAgdW5zaWduZWQgaW50IGk7CisgIGludCBwYWRpdCA9IG1hcHNpemUgJiAxOworCisgIGlmIChwYWRpdCkKKyAgICBtYXBzaXplKys7CisKKyAgLyogd29yayBvdXQgd2hlcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIHdpbGwgZ28gaW4gdGhlIGFyY2hpdmUgKi8KKyAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgPSAobWFwc2l6ZQorCQkJICAgICArIGVsZW5ndGgKKwkJCSAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCisJCQkgICAgICsgU0FSTUFHKTsKKworICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7CisgIGhkci5hcl9uYW1lWzBdID0gJy8nOworICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7CisgIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIHRpbWUgKE5VTEwpKTsKKyAgLyogVGhpcywgYXQgbGVhc3QsIGlzIHdoYXQgSW50ZWwgY29mZiBzZXRzIHRoZSB2YWx1ZXMgdG8uOiAqLworICBzcHJpbnRmICgoaGRyLmFyX3VpZCksICIlZCIsIDApOworICBzcHJpbnRmICgoaGRyLmFyX2dpZCksICIlZCIsIDApOworICBzcHJpbnRmICgoaGRyLmFyX21vZGUpLCAiJS03byIsICh1bnNpZ25lZCkgMCk7CisgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCisgICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCisgICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOworCisgIC8qIFdyaXRlIHRoZSBhciBoZWFkZXIgZm9yIHRoaXMgaXRlbSBhbmQgdGhlIG51bWJlciBvZiBzeW1ib2xzICovCisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKKyAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhcmNoLCBzeW1ib2xfY291bnQpOworCisgIC8qIFR3byBwYXNzZXMsIGZpcnN0IHdyaXRlIHRoZSBmaWxlIG9mZnNldHMgZm9yIGVhY2ggc3ltYm9sIC0KKyAgICAgcmVtZW1iZXJpbmcgdGhhdCBlYWNoIG9mZnNldCBpcyBvbiBhIHR3byBieXRlIGJvdW5kYXJ5LiAgKi8KKworICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggZWFjaAorICAgICBzeW1ib2wsIGFuZCByZW1lbWJlciB0byBrZWVwIHRoZSBvZmZzZXRzIHBhZGRlZCBvdXQuICAqLworCisgIGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7CisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMICYmIGNvdW50IDwgc3ltYm9sX2NvdW50KQorICAgIHsKKyAgICAgIC8qIEZvciBlYWNoIHN5bWJvbCB3aGljaCBpcyB1c2VkIGRlZmluZWQgaW4gdGhpcyBvYmplY3QsIHdyaXRlIG91dAorCSB0aGUgb2JqZWN0IGZpbGUncyBhZGRyZXNzIGluIHRoZSBhcmNoaXZlICovCisKKyAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSA9PSBjdXJyZW50KQorCXsKKwkgIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhcmNoLCBhcmNoaXZlX21lbWJlcl9maWxlX3B0cik7CisJICBjb3VudCsrOworCX0KKyAgICAgIC8qIEFkZCBzaXplIG9mIHRoaXMgYXJjaGl2ZSBlbnRyeSAqLworICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gKGFyZWx0X3NpemUgKGN1cnJlbnQpCisJCQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOworICAgICAgLyogcmVtZW1iZXIgYWJvb3V0IHRoZSBldmVuIGFsaWdubWVudCAqLworICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgJSAyOworICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorCisgIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN5bWJvbF9jb3VudDsgY291bnQrKykKKyAgICB7CisgICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7CisKKyAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogVGhlIHNwZWMgc2V6IHRoaXMgc2hvdWxkIGJlIGEgbmV3bGluZS4gIEJ1dCBpbiBvcmRlciB0byBiZQorICAgICBidWctY29tcGF0aWJsZSBmb3IgYXJjOTYwIHdlIHVzZSBhIG51bGwuICovCisgIGlmIChwYWRpdCkKKyAgICB7CisgICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmZkL2FyY2h1cmVzLmMgYi9iZmQvYXJjaHVyZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQzODYyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2FyY2h1cmVzLmMKQEAgLTAsMCArMSw4OTYgQEAKKy8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIGFyY2hpdGVjdHVyZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgSGFja2VkIGJ5IEpvaG4gR2lsbW9yZSBhbmQgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qCisKK1NFQ1RJT04KKwlBcmNoaXRlY3R1cmVzCisKKwlCRkQga2VlcHMgb25lIGF0b20gaW4gYSBCRkQgZGVzY3JpYmluZyB0aGUKKwlhcmNoaXRlY3R1cmUgb2YgdGhlIGRhdGEgYXR0YWNoZWQgdG8gdGhlIEJGRDogYSBwb2ludGVyIHRvIGEKKwk8PGJmZF9hcmNoX2luZm9fdHlwZT4+LiAgCisKKwlQb2ludGVycyB0byBzdHJ1Y3R1cmVzIGNhbiBiZSByZXF1ZXN0ZWQgaW5kZXBlbmRlbnRseSBvZiBhIEJGRAorCXNvIHRoYXQgYW4gYXJjaGl0ZWN0dXJlJ3MgaW5mb3JtYXRpb24gY2FuIGJlIGludGVycm9nYXRlZAorCXdpdGhvdXQgYWNjZXNzIHRvIGFuIG9wZW4gQkZELgorCisJVGhlIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBieSBlYWNoIGFyY2hpdGVjdHVyZSBwYWNrYWdlLgorCVRoZSBzZXQgb2YgZGVmYXVsdCBhcmNoaXRlY3R1cmVzIGlzIHNlbGVjdGVkIGJ5IHRoZSBtYWNybworCTw8U0VMRUNUX0FSQ0hJVEVDVFVSRVM+Pi4gIFRoaXMgaXMgbm9ybWFsbHkgc2V0IHVwIGluIHRoZQorCUBmaWxle2NvbmZpZy9AdmFye3RhcmdldH0ubXR9IGZpbGUgb2YgeW91ciBjaG9pY2UuICBJZiB0aGUgbmFtZSBpcyBub3QKKwlkZWZpbmVkLCB0aGVuIGFsbCB0aGUgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYXJlIGluY2x1ZGVkLiAKKworCVdoZW4gQkZEIHN0YXJ0cyB1cCwgYWxsIHRoZSBhcmNoaXRlY3R1cmVzIGFyZSBjYWxsZWQgd2l0aCBhbgorCWluaXRpYWxpemUgbWV0aG9kLiAgSXQgaXMgdXAgdG8gdGhlIGFyY2hpdGVjdHVyZSBiYWNrIGVuZCB0bworCWluc2VydCBhcyBtYW55IGl0ZW1zIGludG8gdGhlIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyBhcyBpdCB3YW50cyB0bzsKKwlnZW5lcmFsbHkgdGhpcyB3b3VsZCBiZSBvbmUgZm9yIGVhY2ggbWFjaGluZSBhbmQgb25lIGZvciB0aGUKKwlkZWZhdWx0IGNhc2UgKGFuIGl0ZW0gd2l0aCBhIG1hY2hpbmUgZmllbGQgb2YgMCkuIAorCisJQkZEJ3MgaWRlYSBvZiBhbiBhcmNoaXRlY3R1cmUgaXMgaW1wbGVtZW50ZWQgaW4JQGZpbGV7YXJjaHVyZXMuY30uCisqLworCisvKgorCitTVUJTRUNUSU9OCisJYmZkX2FyY2hpdGVjdHVyZQorCitERVNDUklQVElPTgorCVRoaXMgZW51bSBnaXZlcyB0aGUgb2JqZWN0IGZpbGUncyBDUFUgYXJjaGl0ZWN0dXJlLCBpbiBhCisJZ2xvYmFsIHNlbnNlLS0taS5lLiwgd2hhdCBwcm9jZXNzb3IgZmFtaWx5IGRvZXMgaXQgYmVsb25nIHRvPworCUFub3RoZXIgZmllbGQgaW5kaWNhdGVzIHdoaWNoIHByb2Nlc3NvciB3aXRoaW4KKwl0aGUgZmFtaWx5IGlzIGluIHVzZS4gIFRoZSBtYWNoaW5lIGdpdmVzIGEgbnVtYmVyIHdoaWNoCisJZGlzdGluZ3Vpc2hlcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGFyY2hpdGVjdHVyZSwKKwljb250YWluaW5nLCBmb3IgZXhhbXBsZSwgMiBhbmQgMyBmb3IgSW50ZWwgaTk2MCBLQSBhbmQgaTk2MCBLQiwKKwlhbmQgNjgwMjAgYW5kIDY4MDMwIGZvciBNb3Rvcm9sYSA2ODAyMCBhbmQgNjgwMzAuIAorCisuZW51bSBiZmRfYXJjaGl0ZWN0dXJlIAorLnsKKy4gIGJmZF9hcmNoX3Vua25vd24sICAgeyogRmlsZSBhcmNoIG5vdCBrbm93biAqfQorLiAgYmZkX2FyY2hfb2JzY3VyZSwgICB7KiBBcmNoIGtub3duLCBub3Qgb25lIG9mIHRoZXNlICp9CisuICBiZmRfYXJjaF9tNjhrLCAgICAgIHsqIE1vdG9yb2xhIDY4eHh4ICp9CisuI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQorLiNkZWZpbmUgYmZkX21hY2hfbTY4MDA4IDIKKy4jZGVmaW5lIGJmZF9tYWNoX202ODAxMCAzCisuI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAorLiNkZWZpbmUgYmZkX21hY2hfbTY4MDMwIDUKKy4jZGVmaW5lIGJmZF9tYWNoX202ODA0MCA2CisuI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNworLiNkZWZpbmUgYmZkX21hY2hfY3B1MzIgIDgKKy4gIGJmZF9hcmNoX3ZheCwgICAgICAgeyogREVDIFZheCAqfSAgIAorLiAgYmZkX2FyY2hfaTk2MCwgICAgICB7KiBJbnRlbCA5NjAgKn0KKy4gICAgeyogVGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgaW1wb3J0YW50LgorLiAgICAgICBsb3dlciBudW1iZXIgaW5kaWNhdGVzIGEgbWFjaGluZSB0eXBlIHRoYXQgCisuICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisuICAgICAgIGF2YWlsYWJsZSB0byBtYWNoaW5lcyB3aXRoIGhpZ2hlciBudW1iZXJzLgorLiAgICAgICBUaGUgZXhjZXB0aW9uIGlzIHRoZSAiY2EiLCB3aGljaCBpcworLiAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAorLiAgICAgICAiY29yZSIuICp9CisuCisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX2thX3NhICAgICAyCisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX2tiX3NiICAgICAzCisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0CisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX3hhICAgICAgICA1CisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NhICAgICAgICA2CisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4CSA3CisuI2RlZmluZSBiZmRfbWFjaF9pOTYwX2h4ICAgICAgICA4CisuCisuICBiZmRfYXJjaF9hMjlrLCAgICAgIHsqIEFNRCAyOTAwMCAqfQorLiAgYmZkX2FyY2hfc3BhcmMsICAgICB7KiBTUEFSQyAqfQorLiNkZWZpbmUgYmZkX21hY2hfc3BhcmMJCQkxCisueyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2OHBsdXMgYW5kIHY5IGlzIHRoYXQgdjkgaXMgYSB0cnVlIDY0IGJpdCBlbnYuICAqfQorLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQJMgorLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlCTMKKy4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwkJNAorLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzYQkJNSB7KiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICp9CisuI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUJNgorLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjkJCTcKKy4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YQkJOCB7KiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICp9CisueyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKn0KKy4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5X3AobWFjaCkgXAorLiAgKChtYWNoKSA+PSBiZmRfbWFjaF9zcGFyY192OHBsdXMgJiYgKG1hY2gpIDw9IGJmZF9tYWNoX3NwYXJjX3Y5YSkKKy4gIGJmZF9hcmNoX21pcHMsICAgICAgeyogTUlQUyBSeHh4eCAqfQorLiNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAJCTMwMDAKKy4jZGVmaW5lIGJmZF9tYWNoX21pcHMzOTAwCQkzOTAwCisuI2RlZmluZSBiZmRfbWFjaF9taXBzNDAwMAkJNDAwMAorLiNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAJCTQwMTAKKy4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MTAwCQk0MTAwCisuI2RlZmluZSBiZmRfbWFjaF9taXBzNDExMQkJNDExMQorLiNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAJCTQzMDAKKy4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NDAwCQk0NDAwCisuI2RlZmluZSBiZmRfbWFjaF9taXBzNDYwMAkJNDYwMAorLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAJCTQ2NTAKKy4jZGVmaW5lIGJmZF9tYWNoX21pcHM1MDAwCQk1MDAwCisuI2RlZmluZSBiZmRfbWFjaF9taXBzNjAwMAkJNjAwMAorLiNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAJCTgwMDAKKy4jZGVmaW5lIGJmZF9tYWNoX21pcHMxMDAwMAkJMTAwMDAKKy4jZGVmaW5lIGJmZF9tYWNoX21pcHMxNgkJMTYKKy4gIGJmZF9hcmNoX2kzODYsICAgICAgeyogSW50ZWwgMzg2ICp9CisuI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODYgMAorLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCisuI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4IDIKKy4gIGJmZF9hcmNoX3dlMzJrLCAgICAgeyogQVQmVCBXRTMyeHh4ICp9CisuICBiZmRfYXJjaF90YWhvZSwgICAgIHsqIENDSS9IYXJyaXMgVGFob2UgKn0KKy4gIGJmZF9hcmNoX2k4NjAsICAgICAgeyogSW50ZWwgODYwICp9CisuICBiZmRfYXJjaF9yb21wLCAgICAgIHsqIElCTSBST01QIFBDL1JUICp9CisuICBiZmRfYXJjaF9hbGxpYW50LCAgIHsqIEFsbGlhbnQgKn0KKy4gIGJmZF9hcmNoX2NvbnZleCwgICAgeyogQ29udmV4ICp9CisuICBiZmRfYXJjaF9tODhrLCAgICAgIHsqIE1vdG9yb2xhIDg4eHh4ICp9CisuICBiZmRfYXJjaF9weXJhbWlkLCAgIHsqIFB5cmFtaWQgVGVjaG5vbG9neSAqfQorLiAgYmZkX2FyY2hfaDgzMDAsICAgICB7KiBIaXRhY2hpIEg4LzMwMCAqfQorLiNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCisuI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKKy4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwcyAgMworLiAgYmZkX2FyY2hfcG93ZXJwYywgICB7KiBQb3dlclBDICp9CisuICBiZmRfYXJjaF9yczYwMDAsICAgIHsqIElCTSBSUy82MDAwICp9CisuICBiZmRfYXJjaF9ocHBhLCAgICAgIHsqIEhQIFBBIFJJU0MgKn0KKy4gIGJmZF9hcmNoX2QxMHYsICAgICAgeyogTWl0c3ViaXNoaSBEMTBWICp9CisuICBiZmRfYXJjaF9kMzB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDMwViAqfQorLiAgYmZkX2FyY2hfejhrLCAgICAgICB7KiBaaWxvZyBaODAwMCAqfQorLiNkZWZpbmUgYmZkX21hY2hfejgwMDEJCTEKKy4jZGVmaW5lIGJmZF9tYWNoX3o4MDAyCQkyCisuICBiZmRfYXJjaF9oODUwMCwgICAgIHsqIEhpdGFjaGkgSDgvNTAwICp9CisuICBiZmRfYXJjaF9zaCwgICAgICAgIHsqIEhpdGFjaGkgU0ggKn0KKy4jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAorLiNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCisuI2RlZmluZSBiZmRfbWFjaF9zaDNlICAgICAgIDB4M2UKKy4gIGJmZF9hcmNoX2FscGhhLCAgICAgeyogRGVjIEFscGhhICp9CisuI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjQgIDB4MTAKKy4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAorLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY2ICAweDMwCisuICBiZmRfYXJjaF9hcm0sICAgICAgIHsqIEFkdmFuY2VkIFJpc2MgTWFjaGluZXMgQVJNICp9CisuI2RlZmluZSBiZmRfbWFjaF9hcm1fMgkJMQorLiNkZWZpbmUgYmZkX21hY2hfYXJtXzJhCQkyCisuI2RlZmluZSBiZmRfbWFjaF9hcm1fMwkJMworLiNkZWZpbmUgYmZkX21hY2hfYXJtXzNNIAk0CisuI2RlZmluZSBiZmRfbWFjaF9hcm1fNCAJCTUKKy4jZGVmaW5lIGJmZF9tYWNoX2FybV80VCAJNgorLiAgYmZkX2FyY2hfbnMzMmssICAgICB7KiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICp9CisuICBiZmRfYXJjaF93NjUsICAgICAgIHsqIFdEQyA2NTgxNiAqfQorLiAgYmZkX2FyY2hfdGljMzAsICAgICB7KiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKn0KKy4gIGJmZF9hcmNoX3RpYzgwLCAgICAgeyogVEkgVE1TMzIwYzgwIChNVlApICp9CisuICBiZmRfYXJjaF92ODUwLCAgICAgIHsqIE5FQyBWODUwICp9CisuI2RlZmluZSBiZmRfbWFjaF92ODUwICAgICAgICAgIDAKKy4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlIAknRScKKy4jZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYQknQScKKy4gIGJmZF9hcmNoX2FyYywgICAgICAgeyogQXJnb25hdXQgUklTQyBDb3JlICp9CisuI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCisuICBiZmRfYXJjaF9tMzJyLCAgICAgIHsqIE1pdHN1YmlzaGkgTTMyUi9EICp9CisuI2RlZmluZSBiZmRfbWFjaF9tMzJyCQkwIHsqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICp9CisuICBiZmRfYXJjaF9tbjEwMjAwLCAgIHsqIE1hdHN1c2hpdGEgTU4xMDIwMCAqfQorLiAgYmZkX2FyY2hfbW4xMDMwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAzMDAgKn0KKy4jZGVmaW5lIGJmZF9tYWNoX21uMTAzMDAJCTMwMAorLiAgYmZkX2FyY2hfZnIzMCwKKy4jZGVmaW5lIGJmZF9tYWNoX2ZyMzAJCTB4NDY1MjMzMzAKKy4gIGJmZF9hcmNoX21jb3JlLAorLiAgYmZkX2FyY2hfbGFzdAorLiAgfTsKKworCisqLworCisvKgorCitTVUJTRUNUSU9OCisJYmZkX2FyY2hfaW5mbworCitERVNDUklQVElPTgorCVRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGFyY2hpdGVjdHVyZXMgZm9yIHVzZQorCXdpdGhpbiBCRkQuCisKKy4KKy50eXBlZGVmIHN0cnVjdCBiZmRfYXJjaF9pbmZvIAorLnsKKy4gIGludCBiaXRzX3Blcl93b3JkOworLiAgaW50IGJpdHNfcGVyX2FkZHJlc3M7CisuICBpbnQgYml0c19wZXJfYnl0ZTsKKy4gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworLiAgdW5zaWduZWQgbG9uZyBtYWNoOworLiAgY29uc3QgY2hhciAqYXJjaF9uYW1lOworLiAgY29uc3QgY2hhciAqcHJpbnRhYmxlX25hbWU7CisuICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9hbGlnbl9wb3dlcjsKKy4geyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBkZWZhdWx0IG1hY2hpbmUgZm9yIHRoZSBhcmNoaXRlY3R1cmUgKn0KKy4gIGJvb2xlYW4gdGhlX2RlZmF1bHQ7CQorLiAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiAoKmNvbXBhdGlibGUpCisuCVBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphLAorLgkgICAgICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYikpOworLgorLiAgYm9vbGVhbiAoKnNjYW4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICosIGNvbnN0IGNoYXIgKikpOworLgorLiAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKm5leHQ7CisufSBiZmRfYXJjaF9pbmZvX3R5cGU7CisqLworCitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hMjlrX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hbHBoYV9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJjX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcm1fYXJjaDsKK2V4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2QxMHZfYXJjaDsKK2V4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2QzMHZfYXJjaDsKK2V4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2g4MzAwX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODUwMF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYV9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTg2MF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTk2MF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTMycl9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTY4a19hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTg4a19hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWlwc19hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbW4xMDIwMF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbW4xMDMwMF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcG93ZXJwY19hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfcnM2MDAwX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zaF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc3BhcmNfYXJjaDsKK2V4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzMwX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWM4MF9hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdmF4X2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93ZTMya19hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfejhrX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9uczMya19hcmNoOworZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92ODUwX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9mcjMwX2FyY2g7CitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tY29yZV9hcmNoOworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgYmZkX2FyY2h1cmVzX2xpc3RbXSA9Cit7CisjaWZkZWYgU0VMRUNUX0FSQ0hJVEVDVFVSRVMKKyAgU0VMRUNUX0FSQ0hJVEVDVFVSRVMsCisjZWxzZQorICAmYmZkX2EyOWtfYXJjaCwKKyAgJmJmZF9hbHBoYV9hcmNoLAorICAmYmZkX2FyY19hcmNoLAorICAmYmZkX2FybV9hcmNoLAorICAmYmZkX2QxMHZfYXJjaCwKKyAgJmJmZF9kMzB2X2FyY2gsCisgICZiZmRfaDgzMDBfYXJjaCwKKyAgJmJmZF9oODUwMF9hcmNoLAorICAmYmZkX2hwcGFfYXJjaCwKKyAgJmJmZF9pMzg2X2FyY2gsCisgICZiZmRfaTg2MF9hcmNoLAorICAmYmZkX2k5NjBfYXJjaCwKKyAgJmJmZF9tMzJyX2FyY2gsCisgICZiZmRfbTY4a19hcmNoLAorICAmYmZkX204OGtfYXJjaCwKKyAgJmJmZF9taXBzX2FyY2gsCisgICZiZmRfbW4xMDIwMF9hcmNoLAorICAmYmZkX21uMTAzMDBfYXJjaCwKKyAgJmJmZF9wb3dlcnBjX2FyY2gsCisgICZiZmRfcnM2MDAwX2FyY2gsCisgICZiZmRfc2hfYXJjaCwKKyAgJmJmZF9zcGFyY19hcmNoLAorICAmYmZkX3RpYzMwX2FyY2gsCisgICZiZmRfdGljODBfYXJjaCwKKyAgJmJmZF92YXhfYXJjaCwKKyAgJmJmZF93ZTMya19hcmNoLAorICAmYmZkX3o4a19hcmNoLAorICAmYmZkX25zMzJrX2FyY2gsCisgICZiZmRfdzY1X2FyY2gsCisgICZiZmRfdjg1MF9hcmNoLAorICAmYmZkX2ZyMzBfYXJjaCwKKyAgJiBiZmRfbWNvcmVfYXJjaCwKKyNlbmRpZgorICAwCit9OworCisvKgorRlVOQ1RJT04KKwliZmRfcHJpbnRhYmxlX25hbWUKKworU1lOT1BTSVMKKwljb25zdCBjaGFyICpiZmRfcHJpbnRhYmxlX25hbWUoYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gYSBwcmludGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCisJZnJvbSB0aGUgcG9pbnRlciB0byB0aGUgYXJjaGl0ZWN0dXJlIGluZm8gc3RydWN0dXJlLgorCisqLworCitjb25zdCBjaGFyICoKK2JmZF9wcmludGFibGVfbmFtZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5wcmludGFibGVfbmFtZTsKK30KKworCisKKy8qCitGVU5DVElPTgorCWJmZF9zY2FuX2FyY2gKKworU1lOT1BTSVMKKwljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9zY2FuX2FyY2goY29uc3QgY2hhciAqc3RyaW5nKTsKKworREVTQ1JJUFRJT04KKwlGaWd1cmUgb3V0IGlmIEJGRCBzdXBwb3J0cyBhbnkgY3B1IHdoaWNoIGNvdWxkIGJlIGRlc2NyaWJlZCB3aXRoCisJdGhlIG5hbWUgQHZhcntzdHJpbmd9LiAgUmV0dXJuIGEgcG9pbnRlciB0byBhbiA8PGFyY2hfaW5mbz4+CisJc3RydWN0dXJlIGlmIGEgbWFjaGluZSBpcyBmb3VuZCwgb3RoZXJ3aXNlIE5VTEwuCisKKyovCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCitiZmRfc2Nhbl9hcmNoIChzdHJpbmcpCisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcCwgKmFwOworCisgIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGluc3RhbGxlZCBhcmNoaXRlY3R1cmVzICovCisgIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCisgICAgeworICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJeworCSAgaWYgKGFwLT5zY2FuIChhcCwgc3RyaW5nKSkKKwkgICAgcmV0dXJuIGFwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworCisvKgorRlVOQ1RJT04KKwliZmRfYXJjaF9saXN0CisKK1NZTk9QU0lTCisJY29uc3QgY2hhciAqKmJmZF9hcmNoX2xpc3Qodm9pZCk7CisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIGEgZnJlc2hseSBtYWxsb2NlZCBOVUxMLXRlcm1pbmF0ZWQgdmVjdG9yIG9mIHRoZSBuYW1lcworCW9mIGFsbCB0aGUgdmFsaWQgQkZEIGFyY2hpdGVjdHVyZXMuICBEbyBub3QgbW9kaWZ5IHRoZSBuYW1lcy4KKworKi8KKworY29uc3QgY2hhciAqKgorYmZkX2FyY2hfbGlzdCAoKQoreworICBpbnQgdmVjX2xlbmd0aCA9IDA7CisgIGNvbnN0IGNoYXIgKipuYW1lX3B0cjsKKyAgY29uc3QgY2hhciAqKm5hbWVfbGlzdDsKKyAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcDsKKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhcmNoaXRlY3R1cmVzICovCisgIHZlY19sZW5ndGggPSAwOworICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQorICAgIHsKKyAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7CisgICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKKwl7CisJICB2ZWNfbGVuZ3RoKys7CisJfQorICAgIH0KKworICBuYW1lX2xpc3QgPSAoQ09OU1QgY2hhciAqKikKKyAgICBiZmRfbWFsbG9jICgodmVjX2xlbmd0aCArIDEpICogc2l6ZW9mIChjaGFyICoqKSk7CisgIGlmIChuYW1lX2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBQb2ludCB0aGUgbGlzdCBhdCBlYWNoIG9mIHRoZSBuYW1lcyAqLworICBuYW1lX3B0ciA9IG5hbWVfbGlzdDsKKyAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKKyAgICB7CisgICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOworICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJeworCSAgKm5hbWVfcHRyID0gYXAtPnByaW50YWJsZV9uYW1lOworCSAgbmFtZV9wdHIrKzsKKwl9CisgICAgfQorICAqbmFtZV9wdHIgPSBOVUxMOworCisgIHJldHVybiBuYW1lX2xpc3Q7Cit9CisKKworCisvKgorRlVOQ1RJT04KKwliZmRfYXJjaF9nZXRfY29tcGF0aWJsZQorCitTWU5PUFNJUworCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUoCisJCWNvbnN0IGJmZCAqYWJmZCwKKwkgICAgICAgIGNvbnN0IGJmZCAqYmJmZCk7CisKK0RFU0NSSVBUSU9OCisJRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIEJGRHMnCisJYXJjaGl0ZWN0dXJlcyBhbmQgbWFjaGluZSB0eXBlcyBhcmUgY29tcGF0aWJsZS4gIENhbGN1bGF0ZXMKKwl0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBiZXR3ZWVuIHRoZSB0d28gYXJjaGl0ZWN0dXJlcworCWFuZCBtYWNoaW5lIHR5cGVzIGltcGxpZWQgYnkgdGhlIEJGRHMgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvCisJYW4gPDxhcmNoX2luZm8+PiBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgY29tcGF0aWJsZSBtYWNoaW5lLgorKi8KKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKK2JmZF9hcmNoX2dldF9jb21wYXRpYmxlIChhYmZkLCBiYmZkKQorICAgICBjb25zdCBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGJmZCAqYmJmZDsKK3sKKyAgLyogSWYgZWl0aGVyIGFyY2hpdGVjdHVyZSBpcyB1bmtub3duLCB0aGVuIGFsbCB3ZSBjYW4gZG8gaXMgYXNzdW1lCisgICAgIHRoZSB1c2VyIGtub3dzIHdoYXQgaGUncyBkb2luZy4gICovCisgIGlmIChhYmZkLT5hcmNoX2luZm8tPmFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKKyAgCXJldHVybiBiYmZkLT5hcmNoX2luZm87CisgIGlmIChiYmZkLT5hcmNoX2luZm8tPmFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKKyAgCXJldHVybiBhYmZkLT5hcmNoX2luZm87CisKKyAgLyogT3RoZXJ3aXNlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGhhcyB0byBkZWNpZGUuICAqLworICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5jb21wYXRpYmxlIChhYmZkLT5hcmNoX2luZm8sIGJiZmQtPmFyY2hfaW5mbyk7Cit9CisKKworLyoKK0lOVEVSTkFMX0RFRklOSVRJT04KKwliZmRfZGVmYXVsdF9hcmNoX3N0cnVjdAorCitERVNDUklQVElPTgorCVRoZSA8PGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0Pj4gaXMgYW4gaXRlbSBvZgorCTw8YmZkX2FyY2hfaW5mb190eXBlPj4gd2hpY2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gYSBmYWlybHkKKwlnZW5lcmljIHN0YXRlLiAgQSBCRkQgc3RhcnRzIGxpZmUgYnkgcG9pbnRpbmcgdG8gdGhpcworCXN0cnVjdHVyZSwgdW50aWwgdGhlIGNvcnJlY3QgYmFjayBlbmQgaGFzIGRldGVybWluZWQgdGhlIHJlYWwKKwlhcmNoaXRlY3R1cmUgb2YgdGhlIGZpbGUuCisKKy5leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OworCisqLworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QgPQoreworICAgIDMyLDMyLDgsYmZkX2FyY2hfdW5rbm93biwwLCJ1bmtub3duIiwidW5rbm93biIsMix0cnVlLAorICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCisgICAgYmZkX2RlZmF1bHRfc2NhbiwgCisgICAgMCwKK307CisKKy8qCitGVU5DVElPTgorCWJmZF9zZXRfYXJjaF9pbmZvCisKK1NZTk9QU0lTCisJdm9pZCBiZmRfc2V0X2FyY2hfaW5mbyhiZmQgKmFiZmQsIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJnKTsKKworREVTQ1JJUFRJT04KKwlTZXQgdGhlIGFyY2hpdGVjdHVyZSBpbmZvIG9mIEB2YXJ7YWJmZH0gdG8gQHZhcnthcmd9LgorKi8KKwordm9pZAorYmZkX3NldF9hcmNoX2luZm8gKGFiZmQsIGFyZykKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZzsKK3sKKyAgYWJmZC0+YXJjaF9pbmZvID0gYXJnOworfQorCisvKgorSU5URVJOQUxfRlVOQ1RJT04KKwliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGJmZCAqYWJmZCwKKwkJZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCisJCXVuc2lnbmVkIGxvbmcgbWFjaCk7CisKK0RFU0NSSVBUSU9OCisJU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBpbiBCRkQgQHZhcnthYmZkfQorCXRvIEB2YXJ7YXJjaH0gYW5kIEB2YXJ7bWFjaH0uICBGaW5kIHRoZSBjb3JyZWN0CisJcG9pbnRlciB0byBhIHN0cnVjdHVyZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIDw8YXJjaF9pbmZvPj4KKwlwb2ludGVyLiAKKyovCisKK2Jvb2xlYW4KK2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKK3sKKyAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcCwgKmFwOworCisgIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCisgICAgeworICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCisJeworCSAgaWYgKGFwLT5hcmNoID09IGFyY2gKKwkgICAgICAmJiAoYXAtPm1hY2ggPT0gbWFjaAorCQkgIHx8IChtYWNoID09IDAgJiYgYXAtPnRoZV9kZWZhdWx0KSkpCisJICAgIHsKKwkgICAgICBhYmZkLT5hcmNoX2luZm8gPSBhcDsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgYWJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qCitGVU5DVElPTgorCWJmZF9nZXRfYXJjaAorCitTWU5PUFNJUworCWVudW0gYmZkX2FyY2hpdGVjdHVyZSBiZmRfZ2V0X2FyY2goYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIGVudW1lcmF0ZWQgdHlwZSB3aGljaCBkZXNjcmliZXMgdGhlIEJGRCBAdmFye2FiZmR9J3MKKwlhcmNoaXRlY3R1cmUuCisKKyovCisKK2VudW0gYmZkX2FyY2hpdGVjdHVyZQorYmZkX2dldF9hcmNoIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgICAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+YXJjaDsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2dldF9tYWNoCisKK1NZTk9QU0lTCisJdW5zaWduZWQgbG9uZyBiZmRfZ2V0X21hY2goYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIGxvbmcgdHlwZSB3aGljaCBkZXNjcmliZXMgdGhlIEJGRCBAdmFye2FiZmR9J3MKKwltYWNoaW5lLgorKi8KKwordW5zaWduZWQgbG9uZyAgCitiZmRfZ2V0X21hY2ggKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvLT5tYWNoOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfYXJjaF9iaXRzX3Blcl9ieXRlCisKK1NZTk9QU0lTCisJdW5zaWduZWQgaW50IGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUoYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIG9uZSBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0ncworCWFyY2hpdGVjdHVyZSdzIGJ5dGVzLgorCisqLworCit1bnNpZ25lZCBpbnQKK2JmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+Yml0c19wZXJfYnl0ZTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcworCitTWU5PUFNJUworCXVuc2lnbmVkIGludCBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzKGJmZCAqYWJmZCk7CisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBvbmUgb2YgdGhlIEJGRCBAdmFye2FiZmR9J3MKKwlhcmNoaXRlY3R1cmUncyBhZGRyZXNzZXMuCisqLworCit1bnNpZ25lZCBpbnQKK2JmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+Yml0c19wZXJfYWRkcmVzczsKK30KKworCisvKgorSU5URVJOQUxfRlVOQ1RJT04gCisJYmZkX2RlZmF1bHRfY29tcGF0aWJsZQorCitTWU5PUFNJUworCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX2RlZmF1bHRfY29tcGF0aWJsZQorCShjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmEsCisJY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiKTsKKworREVTQ1JJUFRJT04KKwlUaGUgZGVmYXVsdCBmdW5jdGlvbiBmb3IgdGVzdGluZyBmb3IgY29tcGF0aWJpbGl0eS4KKyovCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCitiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLGIpCisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOworeworICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKKyAgICByZXR1cm4gYTsKKworICBpZiAoYi0+bWFjaCA+IGEtPm1hY2gpCisgICAgcmV0dXJuIGI7CisKKyAgcmV0dXJuIGE7Cit9CisKKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2RlZmF1bHRfc2NhbgorCitTWU5PUFNJUworCWJvb2xlYW4gYmZkX2RlZmF1bHRfc2Nhbihjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqc3RyaW5nKTsKKworREVTQ1JJUFRJT04KKwlUaGUgZGVmYXVsdCBmdW5jdGlvbiBmb3Igd29ya2luZyBvdXQgd2hldGhlciB0aGlzIGlzIGFuCisJYXJjaGl0ZWN0dXJlIGhpdCBhbmQgYSBtYWNoaW5lIGhpdC4KKyovCisKK2Jvb2xlYW4gCitiZmRfZGVmYXVsdF9zY2FuIChpbmZvLCBzdHJpbmcpCisgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIGNvbnN0IGNoYXIgKnB0cl9zcmM7CisgIGNvbnN0IGNoYXIgKnB0cl90c3Q7CisgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgY29uc3QgY2hhciAqcHJpbnRhYmxlX25hbWVfY29sb247CisKKyAgLyogRXhhY3QgbWF0Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBuYW1lIChBUkNIX05BTUUpIGFuZCBhbHNvIHRoZQorICAgICBkZWZhdWx0IGFyY2hpdGVjdHVyZT8gKi8KKyAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+YXJjaF9uYW1lKSA9PSAwCisgICAgICAmJiBpbmZvLT50aGVfZGVmYXVsdCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBFeGFjdCBtYXRjaCBvZiB0aGUgbWFjaGluZSBuYW1lIChQUklOVEFCTEVfTkFNRSk/ICovCisgIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworICAgICAKKyAgLyogR2l2ZW4gdGhhdCBwcmludGFibGVfbmFtZSBjb250YWlucyBubyBjb2xvbiwgYXR0ZW1wdCB0byBtYXRjaDoKKyAgICAgQVJDSF9OQU1FIFsgIjoiIF0gUFJJTlRBQkxFX05BTUU/ICovCisgIHByaW50YWJsZV9uYW1lX2NvbG9uID0gc3RyY2hyIChpbmZvLT5wcmludGFibGVfbmFtZSwgJzonKTsKKyAgaWYgKHByaW50YWJsZV9uYW1lX2NvbG9uID09IE5VTEwpCisgICAgeworICAgICAgaW50IHN0cmxlbl9hcmNoX25hbWUgPSBzdHJsZW4gKGluZm8tPmFyY2hfbmFtZSk7CisgICAgICBpZiAoc3RybmNhc2VjbXAgKHN0cmluZywgaW5mby0+YXJjaF9uYW1lLCBzdHJsZW5fYXJjaF9uYW1lKSA9PSAwKQorCXsKKwkgIGlmIChzdHJpbmdbc3RybGVuX2FyY2hfbmFtZV0gPT0gJzonKQorCSAgICB7CisJICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZyArIHN0cmxlbl9hcmNoX25hbWUgKyAxLAorCQkJICAgICAgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCisJCXJldHVybiB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nICsgc3RybGVuX2FyY2hfbmFtZSwKKwkJCSAgICAgIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogR2l2ZW4gdGhhdCBQUklOVEFCTEVfTkFNRSBoYXMgdGhlIGZvcm06IDxhcmNoPiAiOiIgPG1hY2g+OworICAgICBBdHRlbXB0IHRvIG1hdGNoOiA8YXJjaD4gPG1hY2g+PyAqLworICBpZiAocHJpbnRhYmxlX25hbWVfY29sb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgY29sb25faW5kZXggPSBwcmludGFibGVfbmFtZV9jb2xvbiAtIGluZm8tPnByaW50YWJsZV9uYW1lOworICAgICAgaWYgKHN0cm5jYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lLCBjb2xvbl9pbmRleCkgPT0gMAorCSAgJiYgc3RyY2FzZWNtcCAoc3RyaW5nICsgY29sb25faW5kZXgsCisJCQkgaW5mby0+cHJpbnRhYmxlX25hbWUgKyBjb2xvbl9pbmRleCArIDEpID09IDApCisJcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIEdpdmVuIHRoYXQgUFJJTlRBQkxFX05BTUUgaGFzIHRoZSBmb3JtOiA8YXJjaD4gIjoiIDxtYWNoPjsgRG8gbm90CisgICAgIGF0dGVtcHQgdG8gbWF0Y2gganVzdCA8bWFjaD4sIGl0IGNvdWxkIGJlIGFtYmlnaW91cy4gIFRoaXMgdGVzdAorICAgICBpcyBsZWZ0IHVudGlsIGxhdGVyLiAqLworCisgIC8qIE5PVEU6IFRoZSBiZWxvdyBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LiBQbGVhc2UgZG8gbm90CisgICAgIGFkZCB0byB0aGlzIGNvZGUgKi8KKworICAvKiBTZWUgaG93IG11Y2ggb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBtYXRjaGVzIHdpdGggdGhlCisgICAgIGFyY2hpdGVjdHVyZSwgZWcgdGhlIHN0cmluZyBtNjhrOjY4MDIwIHdvdWxkIG1hdGNoIHRoZSA2OGsgZW50cnkKKyAgICAgdXAgdG8gdGhlIDosIHRoZW4gd2UgZ2V0IGxlZnQgd2l0aCB0aGUgbWFjaGluZSBudW1iZXIgKi8KKworICBmb3IgKHB0cl9zcmMgPSBzdHJpbmcsIHB0cl90c3QgPSBpbmZvLT5hcmNoX25hbWU7IAorICAgICAgICpwdHJfc3JjICYmICpwdHJfdHN0OworICAgICAgIHB0cl9zcmMrKywgcHRyX3RzdCsrKSAKKyAgICB7CisgICAgICBpZiAoKnB0cl9zcmMgIT0gKnB0cl90c3QpIGJyZWFrOworICAgIH0KKworICAvKiBDaGV3ZWQgdXAgYXMgbXVjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFzIHdpbGwgbWF0Y2gsIHNraXAgYW55CisgICAgIGNvbG9ucyAqLworICBpZiAoKnB0cl9zcmMgPT0gJzonKQorICAgIHB0cl9zcmMrKzsKKyAgCisgIGlmICgqcHRyX3NyYyA9PSAwKQorICAgIHsKKyAgICAgIC8qIG5vdGhpbmcgbW9yZSwgdGhlbiBvbmx5IGtlZXAgdGhpcyBvbmUgaWYgaXQgaXMgdGhlIGRlZmF1bHQKKwkgbWFjaGluZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKyAgICAgIHJldHVybiBpbmZvLT50aGVfZGVmYXVsdDsKKyAgICB9CisKKyAgbnVtYmVyID0gMDsKKyAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcHRyX3NyYykpCisgICAgeworICAgICAgbnVtYmVyID0gbnVtYmVyICogMTAgKyAqcHRyX3NyYyAgLSAnMCc7CisgICAgICBwdHJfc3JjKys7CisgICAgfQorCisgIC8qIE5PVEU6IFRoZSBiZWxvdyBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgorICAgICBQTEVBU0UgRE8gTk9UIEFERCBUTyBUSElTIENPREUuICovCisKKyAgc3dpdGNoIChudW1iZXIpIAorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBUaGVzZSBhcmUgbmVlZGVkIHRvIHBhcnNlIElFRUUgb2JqZWN0cy4gICovCisgICAgY2FzZSA2ODAwMDogCisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX202ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjgwMTA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX202ODAxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjgwMjA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX202ODAyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjgwMzA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX202ODAzMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjgwNDA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX202ODA0MDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjgwNjA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX202ODA2MDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjgzMzI6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX2NwdTMyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDMyMDAwOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3dlMzJrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDMwMDA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX21pcHMzMDAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQwMDA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKKyAgICAgIG51bWJlciA9IGJmZF9tYWNoX21pcHM0MDAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDYwMDA6CisgICAgICBhcmNoID0gYmZkX2FyY2hfcnM2MDAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAgCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChhcmNoICE9IGluZm8tPmFyY2gpIAorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobnVtYmVyICE9IGluZm8tPm1hY2gpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisKKy8qCitGVU5DVElPTgorCWJmZF9nZXRfYXJjaF9pbmZvCisKK1NZTk9QU0lTCisJY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYmZkX2dldF9hcmNoX2luZm8oYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIGFyY2hpdGVjdHVyZSBpbmZvIHN0cnVjdCBpbiBAdmFye2FiZmR9LgorKi8KKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKK2JmZF9nZXRfYXJjaF9pbmZvIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBhYmZkLT5hcmNoX2luZm87Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX2xvb2t1cF9hcmNoCisKK1NZTk9QU0lTCisJY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfbG9va3VwX2FyY2gKKwkJKGVudW0gYmZkX2FyY2hpdGVjdHVyZQorCQlhcmNoLAorCQl1bnNpZ25lZCBsb25nIG1hY2hpbmUpOworCitERVNDUklQVElPTgorCUxvb2sgZm9yIHRoZSBhcmNoaXRlY3VyZSBpbmZvIHN0cnVjdHVyZSB3aGljaCBtYXRjaGVzIHRoZQorCWFyZ3VtZW50cyBAdmFye2FyY2h9IGFuZCBAdmFye21hY2hpbmV9LiBBIG1hY2hpbmUgb2YgMCBtYXRjaGVzIHRoZQorCW1hY2hpbmUvYXJjaGl0ZWN0dXJlIHN0cnVjdHVyZSB3aGljaCBtYXJrcyBpdHNlbGYgYXMgdGhlCisJZGVmYXVsdC4KKyovCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIAorYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoaW5lKQorICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOworeworICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBjb25zdCAqYXBwLCAqYXA7CisKKyAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKKyAgICB7CisgICAgICBmb3IgKGFwID0gKmFwcDsgYXAgIT0gTlVMTDsgYXAgPSBhcC0+bmV4dCkKKwl7CisJICBpZiAoYXAtPmFyY2ggPT0gYXJjaAorCSAgICAgICYmIChhcC0+bWFjaCA9PSBtYWNoaW5lCisJCSAgfHwgKG1hY2hpbmUgPT0gMCAmJiBhcC0+dGhlX2RlZmF1bHQpKSkKKwkgICAgcmV0dXJuIGFwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX3ByaW50YWJsZV9hcmNoX21hY2gKKworU1lOT1BTSVMKKwljb25zdCBjaGFyICpiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaAorCQkoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsIHVuc2lnbmVkIGxvbmcgbWFjaGluZSk7CisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIGEgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBhbmQKKwltYWNoaW5lIHR5cGUuIAorCisJVGhpcyByb3V0aW5lIGlzIGRlcHJlY2lhdGVkLgorKi8KKworY29uc3QgY2hhciAqCitiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYXJjaCwgbWFjaGluZSkKKyAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKK3sKKyAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoaW5lKTsKKworICAgIGlmIChhcCkKKyAgICAgIHJldHVybiBhcC0+cHJpbnRhYmxlX25hbWU7CisgICAgcmV0dXJuICJVTktOT1dOISI7Cit9CmRpZmYgLS1naXQgYS9iZmQvYmZkLWluLmggYi9iZmQvYmZkLWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkYmY4MAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9iZmQtaW4uaApAQCAtMCwwICsxLDcyNyBAQAorLyogTWFpbiBoZWFkZXIgZmlsZSBmb3IgdGhlIGJmZCBsaWJyYXJ5IC0tIHBvcnRhYmxlIGFjY2VzcyB0byBvYmplY3QgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCisqKiBOT1RFOiBiZmQuaCBhbmQgYmZkLWluMi5oIGFyZSBHRU5FUkFURUQgZmlsZXMuICBEb24ndCBjaGFuZ2UgdGhlbTsKKyoqIGluc3RlYWQsIGNoYW5nZSBiZmQtaW4uaCBvciB0aGUgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcyBwcm9jZXNzZWQgdG8KKyoqIGdlbmVyYXRlIHRoZXNlIGZpbGVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIGJmZC5oIC0tIFRoZSBvbmx5IGhlYWRlciBmaWxlIHJlcXVpcmVkIGJ5IHVzZXJzIG9mIHRoZSBiZmQgbGlicmFyeSAKKworVGhlIGJmZC5oIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYmZkLWluLmggYW5kIHZhcmlvdXMgLmMgZmlsZXM7IGlmIHlvdQorY2hhbmdlIGl0LCB5b3VyIGNoYW5nZXMgd2lsbCBwcm9iYWJseSBiZSBsb3N0LgorCitBbGwgdGhlIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvbGxvd2luZyB0aGUgY29tbWVudCAiVEhFIEZPTExPV0lORworSVMgRVhUUkFDVEVEIEZST00gVEhFIFNPVVJDRSIgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgZmlsZXMgZm9yCitCRkQuICBJZiB5b3UgY2hhbmdlIGl0LCBzb21lb25lIG9uZWRheSB3aWxsIGV4dHJhY3QgaXQgZnJvbSB0aGUgc291cmNlCithZ2FpbiwgYW5kIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGxvc3QuICBUbyBzYXZlIHlvdXJzZWxmIGZyb20gdGhpcyBiaW5kLAorY2hhbmdlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgc291cmNlIGluIHRoZSBiZmQgZGlyZWN0b3J5LiAgVHlwZSAibWFrZQorZG9jcyIgYW5kIHRoZW4gIm1ha2UgaGVhZGVycyIgaW4gdGhhdCBkaXJlY3RvcnksIGFuZCBtYWdpY2FsbHkgdGhpcyBmaWxlCit3aWxsIGNoYW5nZSB0byByZWZsZWN0IHlvdXIgY2hhbmdlcy4KKworSWYgeW91IGRvbid0IGhhdmUgdGhlIHRvb2xzIHRvIHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24sIHRoZW4geW91IGFyZQorc2FmZSBmcm9tIHNvbWVvbmUgb24geW91ciBzeXN0ZW0gdHJhbXBsaW5nIG92ZXIgeW91ciBoZWFkZXIgZmlsZXMuCitZb3Ugc2hvdWxkIHN0aWxsIG1haW50YWluIHRoZSBlcXVpdmFsZW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRoaXMKK2ZpbGUgdGhvdWdoOyBldmVyeSBjaGFuZ2UgeW91IG1ha2UgdG8gdGhlIC5jIGZpbGUgc2hvdWxkIGJlIHJlZmxlY3RlZAoraGVyZS4gICovCisKKyNpZm5kZWYgX19CRkRfSF9TRUVOX18KKyNkZWZpbmUgX19CRkRfSF9TRUVOX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKworLyogVGhlc2UgdHdvIGxpbmVzIGdldCBzdWJzdGl0dXRpb25zIGRvbmUgYnkgY29tbWFuZHMgaW4gTWFrZWZpbGUuaW4uICAqLworI2RlZmluZSBCRkRfVkVSU0lPTiAgIkBWRVJTSU9OQCIKKyNkZWZpbmUgQkZEX0FSQ0hfU0laRSBAd29yZHNpemVACisjZGVmaW5lIEJGRF9IT1NUXzY0QklUX0xPTkcgQEJGRF9IT1NUXzY0QklUX0xPTkdACisjaWYgQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAorI2RlZmluZSBCRkRfSE9TVF82NF9CSVQgQEJGRF9IT1NUXzY0X0JJVEAKKyNkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgQEJGRF9IT1NUX1VfNjRfQklUQAorI2VuZGlmCisKKyNpZiBCRkRfQVJDSF9TSVpFID49IDY0CisjZGVmaW5lIEJGRDY0CisjZW5kaWYKKworI2lmbmRlZiBJTkxJTkUKKyNpZiBfX0dOVUNfXyA+PSAyCisjZGVmaW5lIElOTElORSBfX2lubGluZV9fCisjZWxzZQorI2RlZmluZSBJTkxJTkUKKyNlbmRpZgorI2VuZGlmCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IF9iZmQgYmZkOworCisvKiBUbyBzcXVlbGNoIGVycm9uZW91cyBjb21waWxlciB3YXJuaW5ncyAoImlsbGVnYWwgcG9pbnRlcgorICAgY29tYmluYXRpb24iKSBmcm9tIHRoZSBTVlIzIGNvbXBpbGVyLCB3ZSB3b3VsZCBsaWtlIHRvIHR5cGVkZWYKKyAgIGJvb2xlYW4gdG8gaW50IChpdCBkb2Vzbid0IGxpa2UgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBib29sZWFuLgorICAgTWFraW5nIHN1cmUgdGhleSBhcmUgbmV2ZXIgaW1wbGljaXRseSBkZWNsYXJlZCB0byByZXR1cm4gaW50CisgICBkb2Vzbid0IHNlZW0gdG8gaGVscCkuICBCdXQgdGhpcyBmaWxlIGlzIG5vdCBjb25maWd1cmVkIGJhc2VkIG9uCisgICB0aGUgaG9zdC4gICovCisvKiBHZW5lcmFsIHJ1bGVzOiBmdW5jdGlvbnMgd2hpY2ggYXJlIGJvb2xlYW4gcmV0dXJuIHRydWUgb24gc3VjY2VzcworICAgYW5kIGZhbHNlIG9uIGZhaWx1cmUgKHVubGVzcyB0aGV5J3JlIGEgcHJlZGljYXRlKS4gICAtLSBiZmQuZG9jICovCisvKiBJJ20gc3VyZSB0aGlzIGlzIGdvaW5nIHRvIGJyZWFrIHNvbWV0aGluZyBhbmQgc29tZW9uZSBpcyBnb2luZyB0bworICAgZm9yY2UgbWUgdG8gY2hhbmdlIGl0LiAqLworLyogdHlwZWRlZiBlbnVtIGJvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOyAqLworLyogWXVwLCBTVlI0IGhhcyBhICJ0eXBlZGVmIGVudW0gYm9vbGVhbiIgaW4gPHN5cy90eXBlcy5oPiAgLWZuZiAqLworLyogSXQgZ2V0cyB3b3JzZSBpZiB0aGUgaG9zdCBhbHNvIGRlZmluZXMgYSB0cnVlL2ZhbHNlIGVudW0uLi4gLXN0cyAqLworLyogQW5kIGV2ZW4gd29yc2UgaWYgeW91ciBjb21waWxlciBoYXMgYnVpbHQtaW4gYm9vbGVhbiB0eXBlcy4uLiAtbGF3ICovCisjaWYgZGVmaW5lZCAoX19HTlVHX18pICYmIChfX0dOVUNfTUlOT1JfXyA+IDUpCisjZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECisjZW5kaWYKKyNpZmRlZiBNUFcKKy8qIFByZS1lbXB0aXZlIHN0cmlrZSAtIGdldCB0aGUgZmlsZSB3aXRoIHRoZSBlbnVtLiAqLworI2luY2x1ZGUgPFR5cGVzLmg+CisjZGVmaW5lIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECisjZW5kaWYgLyogTVBXICovCisjaWZuZGVmIFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVECit0eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOworI2RlZmluZSBCRkRfVFJVRV9GQUxTRQorI2Vsc2UKKy8qIFVzZSBlbnVtIG5hbWVzIHRoYXQgd2lsbCBhcHBlYXIgbm93aGVyZSBlbHNlLiAgKi8KK3R5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7YmZkX2ZmZmFsc2UsIGJmZF90dHRydWV9IGJvb2xlYW47CisjZW5kaWYKKworLyogQSBwb2ludGVyIHRvIGEgcG9zaXRpb24gaW4gYSBmaWxlLiAgKi8KKy8qIEZJWE1FOiAgVGhpcyBzaG91bGQgYmUgdXNpbmcgb2ZmX3QgZnJvbSA8c3lzL3R5cGVzLmg+LgorICAgRm9yIG5vdywgdHJ5IHRvIGF2b2lkIGJyZWFraW5nIHN0dWZmIGJ5IG5vdCBpbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBoZXJlLgorICAgVGhpcyB3aWxsIGJyZWFrIG9uIHN5c3RlbXMgd2l0aCA2NC1iaXQgZmlsZSBvZmZzZXRzIChlLmcuIDQuNEJTRCkuCisgICBQcm9iYWJseSB0aGUgYmVzdCBsb25nLXRlcm0gYW5zd2VyIGlzIHRvIGF2b2lkIHVzaW5nIGZpbGVfcHRyIEFORCBvZmZfdCAKKyAgIGluIHRoaXMgaGVhZGVyIGZpbGUsIGFuZCB0byBoYW5kbGUgdGhpcyBpbiB0aGUgQkZEIGltcGxlbWVudGF0aW9uCisgICByYXRoZXIgdGhhbiBpbiBpdHMgaW50ZXJmYWNlLiAgKi8KKy8qIHR5cGVkZWYgb2ZmX3QJZmlsZV9wdHI7ICovCit0eXBlZGVmIGxvbmcgaW50IGZpbGVfcHRyOworCisvKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgc2l6ZXMgb2YgdGFyZ2V0IGZvcm1hdCBpbnRzIGFuZCBhZGRyZXNzZXMuCisgICBJZiB0aGUgdHlwZSBgbG9uZycgaXMgYXQgbGVhc3QgNjQgYml0cywgQkZEX0hPU1RfNjRCSVRfTE9ORyB3aWxsIGJlCisgICBzZXQgdG8gMSBhYm92ZS4gIE90aGVyd2lzZSwgaWYgZ2NjIGlzIGJlaW5nIHVzZWQsIHRoaXMgY29kZSB3aWxsCisgICB1c2UgZ2NjJ3MgImxvbmcgbG9uZyIgdHlwZS4gIE90aGVyd2lzZSwgQkZEX0hPU1RfNjRfQklUIG11c3QgYmUKKyAgIGRlZmluZWQgYWJvdmUuICAqLworCisjaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAorIyBpZiBCRkRfSE9TVF82NEJJVF9MT05HCisjICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcKKyMgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nCisjIGVsc2UKKyMgIGlmZGVmIF9fR05VQ19fCisjICAgaWYgX19HTlVDX18gPj0gMgorIyAgICBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGxvbmcgbG9uZworIyAgICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZyBsb25nCisjICAgZW5kaWYgLyogX19HTlVDX18gPj0gMiAqLworIyAgZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KKyMgZW5kaWYgLyogISBCRkRfSE9TVF82NEJJVF9MT05HICovCisjZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCisKKyNpZmRlZiBCRkQ2NAorCisjaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAorICNlcnJvciBObyA2NCBiaXQgaW50ZWdlciB0eXBlIGF2YWlsYWJsZQorI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLworCit0eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF92bWE7Cit0eXBlZGVmIEJGRF9IT1NUXzY0X0JJVCBiZmRfc2lnbmVkX3ZtYTsKK3R5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3NpemVfdHlwZTsKK3R5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgc3ltdmFsdWU7CisKKyNpZm5kZWYgZnByaW50Zl92bWEKKyNpZiBCRkRfSE9TVF82NEJJVF9MT05HCisjZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwMTZseCIsIHgpCisjZGVmaW5lIGZwcmludGZfdm1hKGYseCkgZnByaW50ZiAoZiwgIiUwMTZseCIsIHgpCisjZWxzZQorI2RlZmluZSBfYmZkX2ludDY0X2xvdyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKQorI2RlZmluZSBfYmZkX2ludDY0X2hpZ2goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkKKyNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBcCisgIGZwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCisjZGVmaW5lIHNwcmludGZfdm1hKHMseCkgXAorICBzcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQorI2VuZGlmCisjZW5kaWYKKworI2Vsc2UgLyogbm90IEJGRDY0ICAqLworCisvKiBSZXByZXNlbnQgYSB0YXJnZXQgYWRkcmVzcy4gIEFsc28gdXNlZCBhcyBhIGdlbmVyaWMgdW5zaWduZWQgdHlwZQorICAgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55IGFyaXRobWV0aWMgdHlwZXMKKyAgIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfdm1hOworCisvKiBBIGdlbmVyaWMgc2lnbmVkIHR5cGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55CisgICBhcml0aG1ldGljIHR5cGVzIHdlIG5lZWQgdG8gZGVhbCB3aXRoLiAgQ2FuIGJlIGFzc3VtZWQgdG8gYmUgY29tcGF0aWJsZQorICAgd2l0aCBiZmRfdm1hIGluIHRoZSBzYW1lIHdheSB0aGF0IHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cyBhcmUgY29tcGF0aWJsZQorICAgKGFzIHBhcmFtZXRlcnMsIGluIGFzc2lnbm1lbnQsIGV0YykuICAqLwordHlwZWRlZiBsb25nIGJmZF9zaWduZWRfdm1hOworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltdmFsdWU7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3NpemVfdHlwZTsKKworLyogUHJpbnQgYSBiZmRfdm1hIHggb24gc3RyZWFtIHMuICAqLworI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIGZwcmludGYocywgIiUwOGx4IiwgeCkKKyNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmKHMsICIlMDhseCIsIHgpCisKKyNlbmRpZiAvKiBub3QgQkZENjQgICovCisKKyNkZWZpbmUgcHJpbnRmX3ZtYSh4KSBmcHJpbnRmX3ZtYShzdGRvdXQseCkKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZmxhZ3dvcmQ7CS8qIDMyIGJpdHMgb2YgZmxhZ3MgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBiZmRfYnl0ZTsKKwwKKy8qKiBGaWxlIGZvcm1hdHMgKi8KKwordHlwZWRlZiBlbnVtIGJmZF9mb3JtYXQgeworCSAgICAgIGJmZF91bmtub3duID0gMCwJLyogZmlsZSBmb3JtYXQgaXMgdW5rbm93biAqLworCSAgICAgIGJmZF9vYmplY3QsCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KKwkgICAgICBiZmRfYXJjaGl2ZSwJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLworCSAgICAgIGJmZF9jb3JlLAkJLyogY29yZSBkdW1wICovCisJICAgICAgYmZkX3R5cGVfZW5kfQkvKiBtYXJrcyB0aGUgZW5kOyBkb24ndCB1c2UgaXQhICovCisgICAgICAgICBiZmRfZm9ybWF0OworCisvKiBWYWx1ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIEJGRC4gIFRoZXNlIGFsc28KKyAgIGFwcGVhciBpbiB0aGUgb2JqZWN0X2ZsYWdzIGZpZWxkIG9mIHRoZSBiZmRfdGFyZ2V0IHN0cnVjdHVyZSwgd2hlcmUKKyAgIHRoZXkgaW5kaWNhdGUgdGhlIHNldCBvZiBmbGFncyB1c2VkIGJ5IHRoYXQgYmFja2VuZCAobm90IGFsbCBmbGFncworICAgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzKSAoRklYTUU6IGF0IHRoZSBtb21lbnQsCisgICB0aGUgb2JqZWN0X2ZsYWdzIHZhbHVlcyBoYXZlIG1vc3RseSBqdXN0IGJlZW4gY29waWVkIGZyb20gYmFja2VuZAorICAgdG8gYW5vdGhlciwgYW5kIGFyZSBub3QgbmVjZXNzYXJpbHkgY29ycmVjdCkuICAqLworCisvKiBObyBmbGFncy4gICovCisjZGVmaW5lIEJGRF9OT19GTEFHUyAgIAkweDAwCisKKy8qIEJGRCBjb250YWlucyByZWxvY2F0aW9uIGVudHJpZXMuICAqLworI2RlZmluZSBIQVNfUkVMT0MgICAJMHgwMQorCisvKiBCRkQgaXMgZGlyZWN0bHkgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIEVYRUNfUCAgICAgIAkweDAyCisKKy8qIEJGRCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKGJhc2ljYWxseSB1c2VkIGZvciBGX0xOTk8gaW4gYQorICAgQ09GRiBoZWFkZXIpLiAgKi8KKyNkZWZpbmUgSEFTX0xJTkVOTyAgCTB4MDQKKworLyogQkZEIGhhcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworI2RlZmluZSBIQVNfREVCVUcgICAJMHgwOAorCisvKiBCRkQgaGFzIHN5bWJvbHMuICAqLworI2RlZmluZSBIQVNfU1lNUyAgICAJMHgxMAorCisvKiBCRkQgaGFzIGxvY2FsIHN5bWJvbHMgKGJhc2ljYWxseSB1c2VkIGZvciBGX0xTWU1TIGluIGEgQ09GRgorICAgaGVhZGVyKS4gICovCisjZGVmaW5lIEhBU19MT0NBTFMgIAkweDIwCisKKy8qIEJGRCBpcyBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KKyNkZWZpbmUgRFlOQU1JQyAgICAgCTB4NDAKKworLyogVGV4dCBzZWN0aW9uIGlzIHdyaXRlIHByb3RlY3RlZCAoaWYgRF9QQUdFRCBpcyBub3Qgc2V0LCB0aGlzIGlzCisgICBsaWtlIGFuIGEub3V0IE5NQUdJQyBmaWxlKSAodGhlIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0CisgICBjbGVhcnMgaXQgZm9yIC1yIG9yIC1OKS4gICovCisjZGVmaW5lIFdQX1RFWFQgICAgIAkweDgwCisKKy8qIEJGRCBpcyBkeW5hbWljYWxseSBwYWdlZCAodGhpcyBpcyBsaWtlIGFuIGEub3V0IFpNQUdJQyBmaWxlKSAodGhlCisgICBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dCBjbGVhcnMgaXQgZm9yIC1yIG9yIC1uIG9yIC1OKS4gICovCisjZGVmaW5lIERfUEFHRUQgICAgIAkweDEwMAorCisvKiBCRkQgaXMgcmVsYXhhYmxlICh0aGlzIG1lYW5zIHRoYXQgYmZkX3JlbGF4X3NlY3Rpb24gbWF5IGJlIGFibGUgdG8KKyAgIGRvIHNvbWV0aGluZykgKHNvbWV0aW1lcyBiZmRfcmVsYXhfc2VjdGlvbiBjYW4gZG8gc29tZXRoaW5nIGV2ZW4gaWYKKyAgIHRoaXMgaXMgbm90IHNldCkuICAqLworI2RlZmluZSBCRkRfSVNfUkVMQVhBQkxFIDB4MjAwCisKKy8qIFRoaXMgbWF5IGJlIHNldCBiZWZvcmUgd3JpdGluZyBvdXQgYSBCRkQgdG8gcmVxdWVzdCB1c2luZyBhCisgICB0cmFkaXRpb25hbCBmb3JtYXQuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyB1c2VkIHRvIHJlcXVlc3QgdGhhdCB3aGVuCisgICB3cml0aW5nIG91dCBhbiBhLm91dCBvYmplY3QgdGhlIHN5bWJvbHMgbm90IGJlIGhhc2hlZCB0byBlbGltaW5hdGUKKyAgIGR1cGxpY2F0ZXMuICAqLworI2RlZmluZSBCRkRfVFJBRElUSU9OQUxfRk9STUFUIDB4NDAwCisKKy8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgQkZEIGNvbnRlbnRzIGFyZSBhY3R1YWxseSBjYWNoZWQgaW4KKyAgIG1lbW9yeS4gIElmIHRoaXMgaXMgc2V0LCBpb3N0cmVhbSBwb2ludHMgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICovCisjZGVmaW5lIEJGRF9JTl9NRU1PUlkgMHg4MDAKKwwKKy8qIHN5bWJvbHMgYW5kIHJlbG9jYXRpb24gKi8KKworLyogQSBjb3VudCBvZiBjYXJzeW1zIChjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzKS4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc3ltaW5kZXg7CisKKy8qIEhvdyB0byBwZXJmb3JtIGEgcmVsb2NhdGlvbi4gICovCit0eXBlZGVmIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZTsKKworI2RlZmluZSBCRkRfTk9fTU9SRV9TWU1CT0xTICgoc3ltaW5kZXgpIH4wKQorCisvKiBHZW5lcmFsIHB1cnBvc2UgcGFydCBvZiBhIHN5bWJvbCBYOworICAgdGFyZ2V0IHNwZWNpZmljIHBhcnRzIGFyZSBpbiBsaWJjb2ZmLmgsIGxpYmFvdXQuaCwgZXRjLiAgKi8KKworI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbikKKyNkZWZpbmUgYmZkX2dldF9vdXRwdXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKKyNkZWZpbmUgYmZkX3NldF9zZWN0aW9uKHgseSkgKCh4KS0+c2VjdGlvbikgPSAoeSkKKyNkZWZpbmUgYmZkX2FzeW1ib2xfYmFzZSh4KSAoKHgpLT5zZWN0aW9uLT52bWEpCisjZGVmaW5lIGJmZF9hc3ltYm9sX3ZhbHVlKHgpIChiZmRfYXN5bWJvbF9iYXNlKHgpICsgKHgpLT52YWx1ZSkKKyNkZWZpbmUgYmZkX2FzeW1ib2xfbmFtZSh4KSAoKHgpLT5uYW1lKQorLypQZXJoYXBzIGZ1dHVyZTogI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+c2VjdGlvbi0+b3duZXIpKi8KKyNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnRoZV9iZmQpCisjZGVmaW5lIGJmZF9hc3ltYm9sX2ZsYXZvdXIoeCkgKGJmZF9hc3ltYm9sX2JmZCh4KS0+eHZlYy0+Zmxhdm91cikKKworLyogQSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICAqLworLyogVGhpcyBpcyBhIHR5cGUgcHVuIHdpdGggc3RydWN0IHJhbmxpYiBvbiBwdXJwb3NlISAqLwordHlwZWRlZiBzdHJ1Y3QgY2Fyc3ltIHsKKyAgY2hhciAqbmFtZTsKKyAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CQkvKiBsb29rIGhlcmUgdG8gZmluZCB0aGUgZmlsZSAqLworfSBjYXJzeW07CQkJLyogdG8gbWFrZSB0aGVzZSB5b3UgY2FsbCBhIGNhcnN5bW9nZW4gKi8KKworICAKKy8qIFVzZWQgaW4gZ2VuZXJhdGluZyBhcm1hcHMgKGFyY2hpdmUgdGFibGVzIG9mIGNvbnRlbnRzKS4KKyAgIFBlcmhhcHMganVzdCBhIGZvcndhcmQgZGVmaW5pdGlvbiB3b3VsZCBkbz8gKi8KK3N0cnVjdCBvcmwgewkJCS8qIG91dHB1dCByYW5saWIgKi8KKyAgY2hhciAqKm5hbWU7CQkJLyogc3ltYm9sIG5hbWUgKi8gCisgIGZpbGVfcHRyIHBvczsJCQkvKiBiZmQqIG9yIGZpbGUgcG9zaXRpb24gKi8KKyAgaW50IG5hbWlkeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSAqLworfTsKKwwKKworLyogTGluZW51bWJlciBzdHVmZiAqLwordHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5IHsKKyAgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyOwkvKiBMaW5lbnVtYmVyIGZyb20gc3RhcnQgb2YgZnVuY3Rpb24qLyAgCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW07IC8qIEZ1bmN0aW9uIG5hbWUgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsJLyogT2Zmc2V0IGludG8gc2VjdGlvbiAqLworICB9IHU7Cit9IGFsZW50OworDAorLyogb2JqZWN0IGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KKworI2RlZmluZQlhbGlnbl9wb3dlcihhZGRyLCBhbGlnbikJXAorCSggKChhZGRyKSArICgoMTw8KGFsaWduKSktMSkpICYgKC0xIDw8IChhbGlnbikpKQorCit0eXBlZGVmIHN0cnVjdCBzZWMgKnNlY19wdHI7CisKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSArIDApCisjZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hICsgMCkKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgKyAwKQorI2RlZmluZSBiZmRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUpCisjZGVmaW5lIGJmZF9zZWN0aW9uX3NpemUoYmZkLCBwdHIpIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MocHRyKSkKKyNkZWZpbmUgYmZkX3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSkKKyNkZWZpbmUgYmZkX3NlY3Rpb25fbG1hKGJmZCwgcHRyKSAoKHB0ciktPmxtYSkKKyNkZWZpbmUgYmZkX3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlcikKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGJmZCwgcHRyKSAoKHB0ciktPmZsYWdzICsgMCkKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyKSAoKHB0ciktPnVzZXJkYXRhKQorCisjZGVmaW5lIGJmZF9pc19jb21fc2VjdGlvbihwdHIpICgoKHB0ciktPmZsYWdzICYgU0VDX0lTX0NPTU1PTikgIT0gMCkKKworI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnZtYSA9IChwdHIpLT5sbWE9ICh2YWwpKSwgKChwdHIpLT51c2VyX3NldF92bWEgPSAoYm9vbGVhbil0cnVlKSwgdHJ1ZSkKKyNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgPSAodmFsKSksdHJ1ZSkKKyNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPnVzZXJkYXRhID0gKHZhbCkpLHRydWUpCisKK3R5cGVkZWYgc3RydWN0IHN0YXQgc3RhdF90eXBlOyAKKwwKK3R5cGVkZWYgZW51bSBiZmRfcHJpbnRfc3ltYm9sCit7IAorICBiZmRfcHJpbnRfc3ltYm9sX25hbWUsCisgIGJmZF9wcmludF9zeW1ib2xfbW9yZSwKKyAgYmZkX3ByaW50X3N5bWJvbF9hbGwKK30gYmZkX3ByaW50X3N5bWJvbF90eXBlOworICAgIAorLyogSW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wgdGhhdCBubSBuZWVkcy4gICovCisKK3R5cGVkZWYgc3RydWN0IF9zeW1ib2xfaW5mbworeworICBzeW12YWx1ZSB2YWx1ZTsKKyAgY2hhciB0eXBlOworICBDT05TVCBjaGFyICpuYW1lOyAgICAgICAgICAgIC8qIFN5bWJvbCBuYW1lLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzdGFiX3R5cGU7ICAgICAvKiBTdGFiIHR5cGUuICAqLworICBjaGFyIHN0YWJfb3RoZXI7ICAgICAgICAgICAgIC8qIFN0YWIgb3RoZXIuICovCisgIHNob3J0IHN0YWJfZGVzYzsgICAgICAgICAgICAgLyogU3RhYiBkZXNjLiAgKi8KKyAgQ09OU1QgY2hhciAqc3RhYl9uYW1lOyAgICAgICAvKiBTdHJpbmcgZm9yIHN0YWIgdHlwZS4gICovCit9IHN5bWJvbF9pbmZvOworCisvKiBHZXQgdGhlIG5hbWUgb2YgYSBzdGFicyB0eXBlIGNvZGUuICAqLworCitleHRlcm4gY29uc3QgY2hhciAqYmZkX2dldF9zdGFiX25hbWUgUEFSQU1TICgoaW50KSk7CisMCisvKiBIYXNoIHRhYmxlIHJvdXRpbmVzLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KKworLyogQW4gZWxlbWVudCBpbiB0aGUgaGFzaCB0YWJsZS4gIE1vc3QgdXNlcyB3aWxsIGFjdHVhbGx5IHVzZSBhIGxhcmdlcgorICAgc3RydWN0dXJlLCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdCBmaWVsZC4gICovCisKK3N0cnVjdCBiZmRfaGFzaF9lbnRyeQoreworICAvKiBOZXh0IGVudHJ5IGZvciB0aGlzIGhhc2ggY29kZS4gICovCisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbmV4dDsKKyAgLyogU3RyaW5nIGJlaW5nIGhhc2hlZC4gICovCisgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgLyogSGFzaCBjb2RlLiAgVGhpcyBpcyB0aGUgZnVsbCBoYXNoIGNvZGUsIG5vdCB0aGUgaW5kZXggaW50byB0aGUKKyAgICAgdGFibGUuICAqLworICB1bnNpZ25lZCBsb25nIGhhc2g7Cit9OworCisvKiBBIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYmZkX2hhc2hfdGFibGUKK3sKKyAgLyogVGhlIGhhc2ggYXJyYXkuICAqLworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKip0YWJsZTsKKyAgLyogVGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCisgIHVuc2lnbmVkIGludCBzaXplOworICAvKiBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIG5ldyBlbGVtZW50cyBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZQorICAgICBmaXJzdCBlbnRyeSBpcyBpdHNlbGYgYSBwb2ludGVyIHRvIGFuIGVsZW1lbnQuICBXaGVuIHRoaXMKKyAgICAgZnVuY3Rpb24gaXMgZmlyc3QgaW52b2tlZCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgTlVMTC4gIEhvd2V2ZXIsCisgICAgIGhhdmluZyB0aGUgcG9pbnRlciBwZXJtaXRzIGEgaGllcmFyY2h5IG9mIG1ldGhvZCBmdW5jdGlvbnMgdG8gYmUKKyAgICAgYnVpbHQgZWFjaCBvZiB3aGljaCBjYWxscyB0aGUgZnVuY3Rpb24gaW4gdGhlIHN1cGVyY2xhc3MuICBUaHVzCisgICAgIGVhY2ggZnVuY3Rpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgb2YgbWVtb3J5CisgICAgIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIE5VTEwuICAqLworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJCSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCSAgICAgY29uc3QgY2hhciAqKSk7CisgICAvKiBBbiBvYmphbGxvYyBmb3IgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpcyBhIHN0cnVjdCBvYmphbGxvYyAqLAorICAgICBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZiBvYmphbGxvYy5oLiAgKi8KKyAgUFRSIG1lbW9yeTsKK307CisKKy8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlLiAgKi8KK2V4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXQKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOworCisvKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZSBzcGVjaWZ5aW5nIGEgc2l6ZS4gICovCitleHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0X24KKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKSwKKwkgICB1bnNpZ25lZCBpbnQgc2l6ZSkpOworCisvKiBGcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCitleHRlcm4gdm9pZCBiZmRfaGFzaF90YWJsZV9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSk7CisKKy8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgSWYgQ1JFQVRFIGlzIHRydWUsIGEgbmV3IGVudHJ5CisgICB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgc3RyaW5nIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiAgVGhlCisgICBDT1BZIGFyZ3VtZW50IG11c3QgYmUgdHJ1ZSBpZiB0aGlzIHJvdXRpbmUgc2hvdWxkIGNvcHkgdGhlIHN0cmluZworICAgaW50byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5IHdoZW4gYWRkaW5nIGFuIGVudHJ5LiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX2xvb2t1cAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuIGNyZWF0ZSwKKwkgICBib29sZWFuIGNvcHkpKTsKKworLyogUmVwbGFjZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLworZXh0ZXJuIHZvaWQgYmZkX2hhc2hfcmVwbGFjZQorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpvbGQsCisJICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudykpOworCisvKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmJmZF9oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCSAgIGNvbnN0IGNoYXIgKikpOworCisvKiBHcmFiIHNvbWUgc3BhY2UgZm9yIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCitleHRlcm4gUFRSIGJmZF9oYXNoX2FsbG9jYXRlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCkpOworCisvKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUgaW4gYSByYW5kb20gb3JkZXIsIGNhbGxpbmcgYSBmdW5jdGlvbiBvbiBlYWNoCisgICBlbGVtZW50LiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSB0cmF2ZXJzYWwgc3RvcHMuICBUaGUKKyAgIElORk8gYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gICovCitleHRlcm4gdm9pZCBiZmRfaGFzaF90cmF2ZXJzZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkgICAgICAgYm9vbGVhbiAoKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCQkJICAgIFBUUiksCisJCQkJICAgICAgIFBUUiBpbmZvKSk7CisMCisvKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KKyAgIFRoZSBDQVQ0IGhhY2sgaXMgdG8gYXZvaWQgYSBwcm9ibGVtIHdpdGggc29tZSBzdHJpY3QgQU5TSSBDIHByZXByb2Nlc3NvcnMuCisgICBUaGUgcHJvYmxlbSBpcywgIjMyXyIgaXMgbm90IGEgdmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbiwgYW5kIHdlIGRvbid0CisgICB3YW50IGV4dHJhIHVuZGVyc2NvcmVzIChlLmcuLCAibmxtXzMyXyIpLiAgVGhlIFhDQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlCisgICBpbm5lciBDQVQgbWFjcm9zIHRvIGJlIGV2YWx1YXRlZCBmaXJzdCwgcHJvZHVjaW5nIHN0aWxsLXZhbGlkIHBwLXRva2Vucy4KKyAgIFRoZW4gdGhlIGZpbmFsIGNvbmNhdGVuYXRpb24gY2FuIGJlIGRvbmUuICAoU2lnaC4pICAqLworI2lmbmRlZiBDQVQKKyNpZmRlZiBTQUJFUgorI2RlZmluZSBDQVQoYSxiKQlhIyNiCisjZGVmaW5lIENBVDMoYSxiLGMpCWEjI2IjI2MKKyNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhIyNiIyNjIyNkCisjZWxzZQorI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCisjZGVmaW5lIENBVChhLGIpIGEjI2IKKyNkZWZpbmUgQ0FUMyhhLGIsYykgYSMjYiMjYworI2RlZmluZSBYQ0FUMihhLGIpCUNBVChhLGIpCisjZGVmaW5lIENBVDQoYSxiLGMsZCkJWENBVDIoQ0FUKGEsYiksQ0FUKGMsZCkpCisjZWxzZQorI2RlZmluZSBDQVQoYSxiKSBhLyoqL2IKKyNkZWZpbmUgQ0FUMyhhLGIsYykgYS8qKi9iLyoqL2MKKyNkZWZpbmUgQ0FUNChhLGIsYyxkKQlhLyoqL2IvKiovYy8qKi9kCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQ09GRl9TV0FQX1RBQkxFIChQVFIpICZiZmRfY29mZl9zdGRfc3dhcF90YWJsZQorDAorLyogVXNlciBwcm9ncmFtIGFjY2VzcyB0byBCRkQgZmFjaWxpdGllcyAqLworCisvKiBEaXJlY3QgSS9PIHJvdXRpbmVzLCBmb3IgcHJvZ3JhbXMgd2hpY2gga25vdyBtb3JlIGFib3V0IHRoZSBvYmplY3QKKyAgIGZpbGUgdGhhbiBCRkQgZG9lcy4gIFVzZSBoaWdoZXIgbGV2ZWwgcm91dGluZXMgaWYgcG9zc2libGUuICAqLworCitleHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfcmVhZAorICBQQVJBTVMgKChQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOworZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3dyaXRlCisgIFBBUkFNUyAoKGNvbnN0IFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7CitleHRlcm4gaW50IGJmZF9zZWVrIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmlsZV9wdHIgZnAsIGludCBkaXJlY3Rpb24pKTsKK2V4dGVybiBsb25nIGJmZF90ZWxsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworZXh0ZXJuIGludCBiZmRfZmx1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7CitleHRlcm4gaW50IGJmZF9zdGF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHN0YXQgKikpOworCisKKy8qIENhc3QgZnJvbSBjb25zdCBjaGFyICogdG8gY2hhciAqIHNvIHRoYXQgY2FsbGVyIGNhbiBhc3NpZ24gdG8KKyAgIGEgY2hhciAqIHdpdGhvdXQgYSB3YXJuaW5nLiAgKi8KKyNkZWZpbmUgYmZkX2dldF9maWxlbmFtZShhYmZkKSAoKGNoYXIgKikgKGFiZmQpLT5maWxlbmFtZSkKKyNkZWZpbmUgYmZkX2dldF9jYWNoZWFibGUoYWJmZCkgKChhYmZkKS0+Y2FjaGVhYmxlKQorI2RlZmluZSBiZmRfZ2V0X2Zvcm1hdChhYmZkKSAoKGFiZmQpLT5mb3JtYXQpCisjZGVmaW5lIGJmZF9nZXRfdGFyZ2V0KGFiZmQpICgoYWJmZCktPnh2ZWMtPm5hbWUpCisjZGVmaW5lIGJmZF9nZXRfZmxhdm91cihhYmZkKSAoKGFiZmQpLT54dmVjLT5mbGF2b3VyKQorI2RlZmluZSBiZmRfYmlnX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCisjZGVmaW5lIGJmZF9saXR0bGVfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKKyNkZWZpbmUgYmZkX2hlYWRlcl9iaWdfZW5kaWFuKGFiZmQpIFwKKyAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKKyNkZWZpbmUgYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuKGFiZmQpIFwKKyAgKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKKyNkZWZpbmUgYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPmZsYWdzKQorI2RlZmluZSBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPm9iamVjdF9mbGFncykKKyNkZWZpbmUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5zZWN0aW9uX2ZsYWdzKQorI2RlZmluZSBiZmRfbXlfYXJjaGl2ZShhYmZkKSAoKGFiZmQpLT5teV9hcmNoaXZlKQorI2RlZmluZSBiZmRfaGFzX21hcChhYmZkKSAoKGFiZmQpLT5oYXNfYXJtYXApCisKKyNkZWZpbmUgYmZkX3ZhbGlkX3JlbG9jX3R5cGVzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnZhbGlkX3JlbG9jX3R5cGVzKQorI2RlZmluZSBiZmRfdXNyZGF0YShhYmZkKSAoKGFiZmQpLT51c3JkYXRhKQorCisjZGVmaW5lIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyhhYmZkKSAoKGFiZmQpLT5zdGFydF9hZGRyZXNzKQorI2RlZmluZSBiZmRfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQorI2RlZmluZSBiZmRfZ2V0X291dHN5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKKyNkZWZpbmUgYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpICgoYWJmZCktPnNlY3Rpb25fY291bnQpCisKKyNkZWZpbmUgYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPnN5bWJvbF9sZWFkaW5nX2NoYXIpCisKKyNkZWZpbmUgYmZkX3NldF9jYWNoZWFibGUoYWJmZCxib29sKSAoKChhYmZkKS0+Y2FjaGVhYmxlID0gKGJvb2xlYW4pKGJvb2wpKSwgdHJ1ZSkKKworZXh0ZXJuIGJvb2xlYW4gYmZkX3JlY29yZF9waGRyCisgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLCBmbGFnd29yZCwgYm9vbGVhbiwgYmZkX3ZtYSwKKwkgICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBzZWMgKiopKTsKKworLyogQnl0ZSBzd2FwcGluZyByb3V0aW5lcy4gICovCisKK2JmZF92bWEJCWJmZF9nZXRiNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfdm1hIAliZmRfZ2V0bDY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzY0IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3ZtYQkJYmZkX2dldGIzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF92bWEJCWJmZF9nZXRsMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMzIgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfdm1hCQliZmRfZ2V0YjE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3ZtYQkJYmZkX2dldGwxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8xNiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK3ZvaWQJCWJmZF9wdXRiNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Cit2b2lkCQliZmRfcHV0bDY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwordm9pZAkJYmZkX3B1dGIzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKK3ZvaWQJCWJmZF9wdXRsMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Cit2b2lkCQliZmRfcHV0YjE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwordm9pZAkJYmZkX3B1dGwxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKKwwKKy8qIEV4dGVybmFsbHkgdmlzaWJsZSBFQ09GRiByb3V0aW5lcy4gICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQorc3RydWN0IGVjb2ZmX2RlYnVnX2luZm87CitzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcDsKK3N0cnVjdCBlY29mZl9leHRyOworc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeTsKK3N0cnVjdCBiZmRfbGlua19pbmZvOworc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnk7CitzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWU7CisjZW5kaWYKK2V4dGVybiBiZmRfdm1hIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICogYWJmZCkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF92bWEgZ3BfdmFsdWUpKTsKK2V4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfcmVnbWFza3MKKyAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBsb25nIGdwcm1hc2ssIHVuc2lnbmVkIGxvbmcgZnBybWFzaywKKwkgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrKSk7CitleHRlcm4gUFRSIGJmZF9lY29mZl9kZWJ1Z19pbml0CisgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKKwkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIHZvaWQgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUKKyAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQorICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAorCSAgIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5wdXRfZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXAsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIKKyAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwgYmZkICppbnB1dF9iZmQsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKKwkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKKwkgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKKwkgICBib29sZWFuICgqZ2V0X2V4dHIpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCisJCQkJc3RydWN0IGVjb2ZmX2V4dHIgKiksCisJICAgdm9pZCAoKnNldF9pbmRleCkgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKKwkJCSAgICAgIGJmZF9zaXplX3R5cGUpKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAorCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBlY29mZl9leHRyICplc3ltKSk7CitleHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfZWNvZmZfZGVidWdfc2l6ZQorICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKKwkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLCBmaWxlX3B0ciB3aGVyZSkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnCisgIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAorCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBmaWxlX3B0ciB3aGVyZSkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX21pcHNfZWNvZmZfY3JlYXRlX2VtYmVkZGVkX3JlbG9jcworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqLCBzdHJ1Y3Qgc2VjICosCisJICAgY2hhciAqKikpOworCisvKiBFeHRlcm5hbGx5IHZpc2libGUgRUxGIHJvdXRpbmVzLiAgKi8KKworc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0Cit7CisgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmV4dDsKKyAgYmZkICpieTsKKyAgY29uc3QgY2hhciAqbmFtZTsKK307CisKK2V4dGVybiBib29sZWFuIGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKK2V4dGVybiBib29sZWFuIGJmZF9lbGY2NF9yZWNvcmRfbGlua19hc3NpZ25tZW50CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKK2V4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9lbGZfZ2V0X25lZWRlZF9saXN0CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKKwkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKKwkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwKKwkgICBjb25zdCBjaGFyICogY29uc3QgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwKKwkgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9lbGZfZ2V0X2R0X3NvbmFtZSBQQVJBTVMgKChiZmQgKikpOworCisvKiBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHNlYyAqKiwgc3RydWN0IHNlYyAqKiwKKwkgICBzdHJ1Y3Qgc2VjICoqKSk7CisKKy8qIExpbnV4IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLworCitleHRlcm4gYm9vbGVhbiBiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBib29sZWFuIGJmZF9zcGFyY2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBtbWFwIGhhY2tzICovCisKK3N0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbDsKK3R5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsIGJmZF93aW5kb3dfaW50ZXJuYWw7CisKK3R5cGVkZWYgc3RydWN0IF9iZmRfd2luZG93IHsKKyAgLyogV2hhdCB0aGUgdXNlciBhc2tlZCBmb3IuICAqLworICBQVFIgZGF0YTsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICAvKiBUaGUgYWN0dWFsIHdpbmRvdyB1c2VkIGJ5IEJGRC4gIFNtYWxsIHVzZXItcmVxdWVzdGVkIHJlYWQtb25seQorICAgICByZWdpb25zIHNoYXJpbmcgYSBwYWdlIG1heSBzaGFyZSBhIHNpbmdsZSB3aW5kb3cgaW50byB0aGUgb2JqZWN0CisgICAgIGZpbGUuICBSZWFkLXdyaXRlIHZlcnNpb25zIHNob3VsZG4ndCB1bnRpbCBJJ3ZlIGZpeGVkIHRoaW5ncyB0bworICAgICBrZWVwIHRyYWNrIG9mIHdoaWNoIHBvcnRpb25zIGhhdmUgYmVlbiBjbGFpbWVkIGJ5IHRoZQorICAgICBhcHBsaWNhdGlvbjsgZG9uJ3Qgd2FudCB0byBnaXZlIHRoZSBzYW1lIHJlZ2lvbiBiYWNrIHdoZW4gdGhlCisgICAgIGFwcGxpY2F0aW9uIHdhbnRzIHR3byB3cml0YWJsZSBjb3BpZXMhICAqLworICBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgKmk7Cit9IGJmZF93aW5kb3c7CisKK2V4dGVybiB2b2lkIGJmZF9pbml0X3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKK2V4dGVybiB2b2lkIGJmZF9mcmVlX3dpbmRvdyBQQVJBTVMgKChiZmRfd2luZG93ICopKTsKK2V4dGVybiBib29sZWFuIGJmZF9nZXRfZmlsZV93aW5kb3cKKyAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBiZmRfd2luZG93ICosIGJvb2xlYW4pKTsKKworLyogWENPRkYgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCisKK2V4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCisJICAgYmZkX3NpemVfdHlwZSkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCisJICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCisJICAgYm9vbGVhbikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwKKwkgICBpbnQsIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBzZWMgKiopKTsKKworLyogRXh0ZXJuYWxseSB2aXNpYmxlIENPRkYgcm91dGluZXMuICAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKK3N0cnVjdCBpbnRlcm5hbF9zeW1lbnQ7Cit1bmlvbiBpbnRlcm5hbF9hdXhlbnQ7CisjZW5kaWYKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X3N5bWVudAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfZ2V0X2F1eGVudAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBpbnQsIHVuaW9uIGludGVybmFsX2F1eGVudCAqKSk7CisKK2V4dGVybiBib29sZWFuIGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgdW5zaWduZWQgaW50KSk7CisKKy8qIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCitleHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK2V4dGVybiBib29sZWFuIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7CisKK2V4dGVybiBib29sZWFuIGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKy8qIEVMRiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLworICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucworICAgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKyAKKyAgZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCisgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKyAKKyAgZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKKyAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBBbmQgbW9yZSBmcm9tIHRoZSBzb3VyY2UuICAqLwpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbjIuaCBiL2JmZC9iZmQtaW4yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NjMwNAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9iZmQtaW4yLmgKQEAgLTAsMCArMSwzMDAzIEBACisvKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKKyoqIE5PVEU6IGJmZC5oIGFuZCBiZmQtaW4yLmggYXJlIEdFTkVSQVRFRCBmaWxlcy4gIERvbid0IGNoYW5nZSB0aGVtOworKiogaW5zdGVhZCwgY2hhbmdlIGJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bworKiogZ2VuZXJhdGUgdGhlc2UgZmlsZXMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogYmZkLmggLS0gVGhlIG9ubHkgaGVhZGVyIGZpbGUgcmVxdWlyZWQgYnkgdXNlcnMgb2YgdGhlIGJmZCBsaWJyYXJ5IAorCitUaGUgYmZkLmggZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBiZmQtaW4uaCBhbmQgdmFyaW91cyAuYyBmaWxlczsgaWYgeW91CitjaGFuZ2UgaXQsIHlvdXIgY2hhbmdlcyB3aWxsIHByb2JhYmx5IGJlIGxvc3QuCisKK0FsbCB0aGUgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9sbG93aW5nIHRoZSBjb21tZW50ICJUSEUgRk9MTE9XSU5HCitJUyBFWFRSQUNURUQgRlJPTSBUSEUgU09VUkNFIiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIHNvdXJjZSBmaWxlcyBmb3IKK0JGRC4gIElmIHlvdSBjaGFuZ2UgaXQsIHNvbWVvbmUgb25lZGF5IHdpbGwgZXh0cmFjdCBpdCBmcm9tIHRoZSBzb3VyY2UKK2FnYWluLCBhbmQgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gIFRvIHNhdmUgeW91cnNlbGYgZnJvbSB0aGlzIGJpbmQsCitjaGFuZ2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzb3VyY2UgaW4gdGhlIGJmZCBkaXJlY3RvcnkuICBUeXBlICJtYWtlCitkb2NzIiBhbmQgdGhlbiAibWFrZSBoZWFkZXJzIiBpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIG1hZ2ljYWxseSB0aGlzIGZpbGUKK3dpbGwgY2hhbmdlIHRvIHJlZmxlY3QgeW91ciBjaGFuZ2VzLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgdG9vbHMgdG8gcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiwgdGhlbiB5b3UgYXJlCitzYWZlIGZyb20gc29tZW9uZSBvbiB5b3VyIHN5c3RlbSB0cmFtcGxpbmcgb3ZlciB5b3VyIGhlYWRlciBmaWxlcy4KK1lvdSBzaG91bGQgc3RpbGwgbWFpbnRhaW4gdGhlIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhpcworZmlsZSB0aG91Z2g7IGV2ZXJ5IGNoYW5nZSB5b3UgbWFrZSB0byB0aGUgLmMgZmlsZSBzaG91bGQgYmUgcmVmbGVjdGVkCitoZXJlLiAgKi8KKworI2lmbmRlZiBfX0JGRF9IX1NFRU5fXworI2RlZmluZSBfX0JGRF9IX1NFRU5fXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorCisvKiBUaGVzZSB0d28gbGluZXMgZ2V0IHN1YnN0aXR1dGlvbnMgZG9uZSBieSBjb21tYW5kcyBpbiBNYWtlZmlsZS5pbi4gICovCisjZGVmaW5lIEJGRF9WRVJTSU9OICAiQFZFUlNJT05AIgorI2RlZmluZSBCRkRfQVJDSF9TSVpFIEB3b3Jkc2l6ZUAKKyNkZWZpbmUgQkZEX0hPU1RfNjRCSVRfTE9ORyBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKKyNpZiBAQkZEX0hPU1RfNjRfQklUX0RFRklORURACisjZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBAQkZEX0hPU1RfNjRfQklUQAorI2RlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCBAQkZEX0hPU1RfVV82NF9CSVRACisjZW5kaWYKKworI2lmIEJGRF9BUkNIX1NJWkUgPj0gNjQKKyNkZWZpbmUgQkZENjQKKyNlbmRpZgorCisjaWZuZGVmIElOTElORQorI2lmIF9fR05VQ19fID49IDIKKyNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KKyNlbHNlCisjZGVmaW5lIElOTElORQorI2VuZGlmCisjZW5kaWYKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgX2JmZCBiZmQ7CisKKy8qIFRvIHNxdWVsY2ggZXJyb25lb3VzIGNvbXBpbGVyIHdhcm5pbmdzICgiaWxsZWdhbCBwb2ludGVyCisgICBjb21iaW5hdGlvbiIpIGZyb20gdGhlIFNWUjMgY29tcGlsZXIsIHdlIHdvdWxkIGxpa2UgdG8gdHlwZWRlZgorICAgYm9vbGVhbiB0byBpbnQgKGl0IGRvZXNuJ3QgbGlrZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGJvb2xlYW4uCisgICBNYWtpbmcgc3VyZSB0aGV5IGFyZSBuZXZlciBpbXBsaWNpdGx5IGRlY2xhcmVkIHRvIHJldHVybiBpbnQKKyAgIGRvZXNuJ3Qgc2VlbSB0byBoZWxwKS4gIEJ1dCB0aGlzIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgYmFzZWQgb24KKyAgIHRoZSBob3N0LiAgKi8KKy8qIEdlbmVyYWwgcnVsZXM6IGZ1bmN0aW9ucyB3aGljaCBhcmUgYm9vbGVhbiByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCisgICBhbmQgZmFsc2Ugb24gZmFpbHVyZSAodW5sZXNzIHRoZXkncmUgYSBwcmVkaWNhdGUpLiAgIC0tIGJmZC5kb2MgKi8KKy8qIEknbSBzdXJlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgc29tZXRoaW5nIGFuZCBzb21lb25lIGlzIGdvaW5nIHRvCisgICBmb3JjZSBtZSB0byBjaGFuZ2UgaXQuICovCisvKiB0eXBlZGVmIGVudW0gYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47ICovCisvKiBZdXAsIFNWUjQgaGFzIGEgInR5cGVkZWYgZW51bSBib29sZWFuIiBpbiA8c3lzL3R5cGVzLmg+ICAtZm5mICovCisvKiBJdCBnZXRzIHdvcnNlIGlmIHRoZSBob3N0IGFsc28gZGVmaW5lcyBhIHRydWUvZmFsc2UgZW51bS4uLiAtc3RzICovCisvKiBBbmQgZXZlbiB3b3JzZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBidWlsdC1pbiBib29sZWFuIHR5cGVzLi4uIC1sYXcgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUdfXykgJiYgKF9fR05VQ19NSU5PUl9fID4gNSkKKyNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKKyNlbmRpZgorI2lmZGVmIE1QVworLyogUHJlLWVtcHRpdmUgc3RyaWtlIC0gZ2V0IHRoZSBmaWxlIHdpdGggdGhlIGVudW0uICovCisjaW5jbHVkZSA8VHlwZXMuaD4KKyNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKKyNlbmRpZiAvKiBNUFcgKi8KKyNpZm5kZWYgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKK3R5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47CisjZGVmaW5lIEJGRF9UUlVFX0ZBTFNFCisjZWxzZQorLyogVXNlIGVudW0gbmFtZXMgdGhhdCB3aWxsIGFwcGVhciBub3doZXJlIGVsc2UuICAqLwordHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtiZmRfZmZmYWxzZSwgYmZkX3R0dHJ1ZX0gYm9vbGVhbjsKKyNlbmRpZgorCisvKiBBIHBvaW50ZXIgdG8gYSBwb3NpdGlvbiBpbiBhIGZpbGUuICAqLworLyogRklYTUU6ICBUaGlzIHNob3VsZCBiZSB1c2luZyBvZmZfdCBmcm9tIDxzeXMvdHlwZXMuaD4uCisgICBGb3Igbm93LCB0cnkgdG8gYXZvaWQgYnJlYWtpbmcgc3R1ZmYgYnkgbm90IGluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IGhlcmUuCisgICBUaGlzIHdpbGwgYnJlYWsgb24gc3lzdGVtcyB3aXRoIDY0LWJpdCBmaWxlIG9mZnNldHMgKGUuZy4gNC40QlNEKS4KKyAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBhbnN3ZXIgaXMgdG8gYXZvaWQgdXNpbmcgZmlsZV9wdHIgQU5EIG9mZl90IAorICAgaW4gdGhpcyBoZWFkZXIgZmlsZSwgYW5kIHRvIGhhbmRsZSB0aGlzIGluIHRoZSBCRkQgaW1wbGVtZW50YXRpb24KKyAgIHJhdGhlciB0aGFuIGluIGl0cyBpbnRlcmZhY2UuICAqLworLyogdHlwZWRlZiBvZmZfdAlmaWxlX3B0cjsgKi8KK3R5cGVkZWYgbG9uZyBpbnQgZmlsZV9wdHI7CisKKy8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBzaXplcyBvZiB0YXJnZXQgZm9ybWF0IGludHMgYW5kIGFkZHJlc3Nlcy4KKyAgIElmIHRoZSB0eXBlIGBsb25nJyBpcyBhdCBsZWFzdCA2NCBiaXRzLCBCRkRfSE9TVF82NEJJVF9MT05HIHdpbGwgYmUKKyAgIHNldCB0byAxIGFib3ZlLiAgT3RoZXJ3aXNlLCBpZiBnY2MgaXMgYmVpbmcgdXNlZCwgdGhpcyBjb2RlIHdpbGwKKyAgIHVzZSBnY2MncyAibG9uZyBsb25nIiB0eXBlLiAgT3RoZXJ3aXNlLCBCRkRfSE9TVF82NF9CSVQgbXVzdCBiZQorICAgZGVmaW5lZCBhYm92ZS4gICovCisKKyNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCisjIGlmIEJGRF9IT1NUXzY0QklUX0xPTkcKKyMgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZworIyAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcKKyMgZWxzZQorIyAgaWZkZWYgX19HTlVDX18KKyMgICBpZiBfX0dOVUNfXyA+PSAyCisjICAgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZyBsb25nCisjICAgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nIGxvbmcKKyMgICBlbmRpZiAvKiBfX0dOVUNfXyA+PSAyICovCisjICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLworIyBlbmRpZiAvKiAhIEJGRF9IT1NUXzY0QklUX0xPTkcgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KKworI2lmZGVmIEJGRDY0CisKKyNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCisgI2Vycm9yIE5vIDY0IGJpdCBpbnRlZ2VyIHR5cGUgYXZhaWxhYmxlCisjZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCisKK3R5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3ZtYTsKK3R5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGJmZF9zaWduZWRfdm1hOwordHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfc2l6ZV90eXBlOwordHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBzeW12YWx1ZTsKKworI2lmbmRlZiBmcHJpbnRmX3ZtYQorI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKKyNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkKKyNkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkKKyNlbHNlCisjZGVmaW5lIF9iZmRfaW50NjRfbG93KHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpCisjZGVmaW5lIF9iZmRfaW50NjRfaGlnaCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKQorI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIFwKKyAgZnByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKKyNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBcCisgIHNwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCisjZW5kaWYKKyNlbmRpZgorCisjZWxzZSAvKiBub3QgQkZENjQgICovCisKKy8qIFJlcHJlc2VudCBhIHRhcmdldCBhZGRyZXNzLiAgQWxzbyB1c2VkIGFzIGEgZ2VuZXJpYyB1bnNpZ25lZCB0eXBlCisgICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkgYXJpdGhtZXRpYyB0eXBlcworICAgd2UgbmVlZCB0byBkZWFsIHdpdGguICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF92bWE7CisKKy8qIEEgZ2VuZXJpYyBzaWduZWQgdHlwZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkKKyAgIGFyaXRobWV0aWMgdHlwZXMgd2UgbmVlZCB0byBkZWFsIHdpdGguICBDYW4gYmUgYXNzdW1lZCB0byBiZSBjb21wYXRpYmxlCisgICB3aXRoIGJmZF92bWEgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzIGFyZSBjb21wYXRpYmxlCisgICAoYXMgcGFyYW1ldGVycywgaW4gYXNzaWdubWVudCwgZXRjKS4gICovCit0eXBlZGVmIGxvbmcgYmZkX3NpZ25lZF92bWE7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW12YWx1ZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZV90eXBlOworCisvKiBQcmludCBhIGJmZF92bWEgeCBvbiBzdHJlYW0gcy4gICovCisjZGVmaW5lIGZwcmludGZfdm1hKHMseCkgZnByaW50ZihzLCAiJTA4bHgiLCB4KQorI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYocywgIiUwOGx4IiwgeCkKKworI2VuZGlmIC8qIG5vdCBCRkQ2NCAgKi8KKworI2RlZmluZSBwcmludGZfdm1hKHgpIGZwcmludGZfdm1hKHN0ZG91dCx4KQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnd29yZDsJLyogMzIgYml0cyBvZiBmbGFncyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJmZF9ieXRlOworDAorLyoqIEZpbGUgZm9ybWF0cyAqLworCit0eXBlZGVmIGVudW0gYmZkX2Zvcm1hdCB7CisJICAgICAgYmZkX3Vua25vd24gPSAwLAkvKiBmaWxlIGZvcm1hdCBpcyB1bmtub3duICovCisJICAgICAgYmZkX29iamVjdCwJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLworCSAgICAgIGJmZF9hcmNoaXZlLAkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCisJICAgICAgYmZkX2NvcmUsCQkvKiBjb3JlIGR1bXAgKi8KKwkgICAgICBiZmRfdHlwZV9lbmR9CS8qIG1hcmtzIHRoZSBlbmQ7IGRvbid0IHVzZSBpdCEgKi8KKyAgICAgICAgIGJmZF9mb3JtYXQ7CisKKy8qIFZhbHVlcyB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgQkZELiAgVGhlc2UgYWxzbworICAgYXBwZWFyIGluIHRoZSBvYmplY3RfZmxhZ3MgZmllbGQgb2YgdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLCB3aGVyZQorICAgdGhleSBpbmRpY2F0ZSB0aGUgc2V0IG9mIGZsYWdzIHVzZWQgYnkgdGhhdCBiYWNrZW5kIChub3QgYWxsIGZsYWdzCisgICBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMpIChGSVhNRTogYXQgdGhlIG1vbWVudCwKKyAgIHRoZSBvYmplY3RfZmxhZ3MgdmFsdWVzIGhhdmUgbW9zdGx5IGp1c3QgYmVlbiBjb3BpZWQgZnJvbSBiYWNrZW5kCisgICB0byBhbm90aGVyLCBhbmQgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0KS4gICovCisKKy8qIE5vIGZsYWdzLiAgKi8KKyNkZWZpbmUgQkZEX05PX0ZMQUdTICAgCTB4MDAKKworLyogQkZEIGNvbnRhaW5zIHJlbG9jYXRpb24gZW50cmllcy4gICovCisjZGVmaW5lIEhBU19SRUxPQyAgIAkweDAxCisKKy8qIEJGRCBpcyBkaXJlY3RseSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgRVhFQ19QICAgICAgCTB4MDIKKworLyogQkZEIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTE5OTyBpbiBhCisgICBDT0ZGIGhlYWRlcikuICAqLworI2RlZmluZSBIQVNfTElORU5PICAJMHgwNAorCisvKiBCRkQgaGFzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIEhBU19ERUJVRyAgIAkweDA4CisKKy8qIEJGRCBoYXMgc3ltYm9scy4gICovCisjZGVmaW5lIEhBU19TWU1TICAgIAkweDEwCisKKy8qIEJGRCBoYXMgbG9jYWwgc3ltYm9scyAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTFNZTVMgaW4gYSBDT0ZGCisgICBoZWFkZXIpLiAgKi8KKyNkZWZpbmUgSEFTX0xPQ0FMUyAgCTB4MjAKKworLyogQkZEIGlzIGEgZHluYW1pYyBvYmplY3QuICAqLworI2RlZmluZSBEWU5BTUlDICAgICAJMHg0MAorCisvKiBUZXh0IHNlY3Rpb24gaXMgd3JpdGUgcHJvdGVjdGVkIChpZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHRoaXMgaXMKKyAgIGxpa2UgYW4gYS5vdXQgTk1BR0lDIGZpbGUpICh0aGUgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQKKyAgIGNsZWFycyBpdCBmb3IgLXIgb3IgLU4pLiAgKi8KKyNkZWZpbmUgV1BfVEVYVCAgICAgCTB4ODAKKworLyogQkZEIGlzIGR5bmFtaWNhbGx5IHBhZ2VkICh0aGlzIGlzIGxpa2UgYW4gYS5vdXQgWk1BR0lDIGZpbGUpICh0aGUKKyAgIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0IGNsZWFycyBpdCBmb3IgLXIgb3IgLW4gb3IgLU4pLiAgKi8KKyNkZWZpbmUgRF9QQUdFRCAgICAgCTB4MTAwCisKKy8qIEJGRCBpcyByZWxheGFibGUgKHRoaXMgbWVhbnMgdGhhdCBiZmRfcmVsYXhfc2VjdGlvbiBtYXkgYmUgYWJsZSB0bworICAgZG8gc29tZXRoaW5nKSAoc29tZXRpbWVzIGJmZF9yZWxheF9zZWN0aW9uIGNhbiBkbyBzb21ldGhpbmcgZXZlbiBpZgorICAgdGhpcyBpcyBub3Qgc2V0KS4gICovCisjZGVmaW5lIEJGRF9JU19SRUxBWEFCTEUgMHgyMDAKKworLyogVGhpcyBtYXkgYmUgc2V0IGJlZm9yZSB3cml0aW5nIG91dCBhIEJGRCB0byByZXF1ZXN0IHVzaW5nIGEKKyAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGF0IHdoZW4KKyAgIHdyaXRpbmcgb3V0IGFuIGEub3V0IG9iamVjdCB0aGUgc3ltYm9scyBub3QgYmUgaGFzaGVkIHRvIGVsaW1pbmF0ZQorICAgZHVwbGljYXRlcy4gICovCisjZGVmaW5lIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgMHg0MDAKKworLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBCRkQgY29udGVudHMgYXJlIGFjdHVhbGx5IGNhY2hlZCBpbgorICAgbWVtb3J5LiAgSWYgdGhpcyBpcyBzZXQsIGlvc3RyZWFtIHBvaW50cyB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KKyNkZWZpbmUgQkZEX0lOX01FTU9SWSAweDgwMAorDAorLyogc3ltYm9scyBhbmQgcmVsb2NhdGlvbiAqLworCisvKiBBIGNvdW50IG9mIGNhcnN5bXMgKGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMpLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbmRleDsKKworLyogSG93IHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KK3R5cGVkZWYgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCByZWxvY19ob3d0b190eXBlOworCisjZGVmaW5lIEJGRF9OT19NT1JFX1NZTUJPTFMgKChzeW1pbmRleCkgfjApCisKKy8qIEdlbmVyYWwgcHVycG9zZSBwYXJ0IG9mIGEgc3ltYm9sIFg7CisgICB0YXJnZXQgc3BlY2lmaWMgcGFydHMgYXJlIGluIGxpYmNvZmYuaCwgbGliYW91dC5oLCBldGMuICAqLworCisjZGVmaW5lIGJmZF9nZXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uKQorI2RlZmluZSBiZmRfZ2V0X291dHB1dF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQorI2RlZmluZSBiZmRfc2V0X3NlY3Rpb24oeCx5KSAoKHgpLT5zZWN0aW9uKSA9ICh5KQorI2RlZmluZSBiZmRfYXN5bWJvbF9iYXNlKHgpICgoeCktPnNlY3Rpb24tPnZtYSkKKyNkZWZpbmUgYmZkX2FzeW1ib2xfdmFsdWUoeCkgKGJmZF9hc3ltYm9sX2Jhc2UoeCkgKyAoeCktPnZhbHVlKQorI2RlZmluZSBiZmRfYXN5bWJvbF9uYW1lKHgpICgoeCktPm5hbWUpCisvKlBlcmhhcHMgZnV0dXJlOiAjZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT5zZWN0aW9uLT5vd25lcikqLworI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+dGhlX2JmZCkKKyNkZWZpbmUgYmZkX2FzeW1ib2xfZmxhdm91cih4KSAoYmZkX2FzeW1ib2xfYmZkKHgpLT54dmVjLT5mbGF2b3VyKQorCisvKiBBIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gICovCisvKiBUaGlzIGlzIGEgdHlwZSBwdW4gd2l0aCBzdHJ1Y3QgcmFubGliIG9uIHB1cnBvc2UhICovCit0eXBlZGVmIHN0cnVjdCBjYXJzeW0geworICBjaGFyICpuYW1lOworICBmaWxlX3B0ciBmaWxlX29mZnNldDsJCS8qIGxvb2sgaGVyZSB0byBmaW5kIHRoZSBmaWxlICovCit9IGNhcnN5bTsJCQkvKiB0byBtYWtlIHRoZXNlIHlvdSBjYWxsIGEgY2Fyc3ltb2dlbiAqLworCisgIAorLyogVXNlZCBpbiBnZW5lcmF0aW5nIGFybWFwcyAoYXJjaGl2ZSB0YWJsZXMgb2YgY29udGVudHMpLgorICAgUGVyaGFwcyBqdXN0IGEgZm9yd2FyZCBkZWZpbml0aW9uIHdvdWxkIGRvPyAqLworc3RydWN0IG9ybCB7CQkJLyogb3V0cHV0IHJhbmxpYiAqLworICBjaGFyICoqbmFtZTsJCQkvKiBzeW1ib2wgbmFtZSAqLyAKKyAgZmlsZV9wdHIgcG9zOwkJCS8qIGJmZCogb3IgZmlsZSBwb3NpdGlvbiAqLworICBpbnQgbmFtaWR4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlICovCit9OworDAorCisvKiBMaW5lbnVtYmVyIHN0dWZmICovCit0eXBlZGVmIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgeworICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXI7CS8qIExpbmVudW1iZXIgZnJvbSBzdGFydCBvZiBmdW5jdGlvbiovICAKKyAgdW5pb24geworICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bTsgLyogRnVuY3Rpb24gbmFtZSAqLworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBzZWN0aW9uICovCisgIH0gdTsKK30gYWxlbnQ7CisMCisvKiBvYmplY3QgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLworCisjZGVmaW5lCWFsaWduX3Bvd2VyKGFkZHIsIGFsaWduKQlcCisJKCAoKGFkZHIpICsgKCgxPDwoYWxpZ24pKS0xKSkgJiAoLTEgPDwgKGFsaWduKSkpCisKK3R5cGVkZWYgc3RydWN0IHNlYyAqc2VjX3B0cjsKKworI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lICsgMCkKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEgKyAwKQorI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlciArIDApCisjZGVmaW5lIGJmZF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSkKKyNkZWZpbmUgYmZkX3NlY3Rpb25fc2l6ZShiZmQsIHB0cikgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhwdHIpKQorI2RlZmluZSBiZmRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hKQorI2RlZmluZSBiZmRfc2VjdGlvbl9sbWEoYmZkLCBwdHIpICgocHRyKS0+bG1hKQorI2RlZmluZSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyKQorI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYmZkLCBwdHIpICgocHRyKS0+ZmxhZ3MgKyAwKQorI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIpICgocHRyKS0+dXNlcmRhdGEpCisKKyNkZWZpbmUgYmZkX2lzX2NvbV9zZWN0aW9uKHB0cikgKCgocHRyKS0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKSAhPSAwKQorCisjZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dm1hID0gKHB0ciktPmxtYT0gKHZhbCkpLCAoKHB0ciktPnVzZXJfc2V0X3ZtYSA9IChib29sZWFuKXRydWUpLCB0cnVlKQorI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPmFsaWdubWVudF9wb3dlciA9ICh2YWwpKSx0cnVlKQorI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dXNlcmRhdGEgPSAodmFsKSksdHJ1ZSkKKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdCBzdGF0X3R5cGU7IAorDAordHlwZWRlZiBlbnVtIGJmZF9wcmludF9zeW1ib2wKK3sgCisgIGJmZF9wcmludF9zeW1ib2xfbmFtZSwKKyAgYmZkX3ByaW50X3N5bWJvbF9tb3JlLAorICBiZmRfcHJpbnRfc3ltYm9sX2FsbAorfSBiZmRfcHJpbnRfc3ltYm9sX3R5cGU7CisgICAgCisvKiBJbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCB0aGF0IG5tIG5lZWRzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3N5bWJvbF9pbmZvCit7CisgIHN5bXZhbHVlIHZhbHVlOworICBjaGFyIHR5cGU7CisgIENPTlNUIGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyogU3ltYm9sIG5hbWUuICAqLworICB1bnNpZ25lZCBjaGFyIHN0YWJfdHlwZTsgICAgIC8qIFN0YWIgdHlwZS4gICovCisgIGNoYXIgc3RhYl9vdGhlcjsgICAgICAgICAgICAgLyogU3RhYiBvdGhlci4gKi8KKyAgc2hvcnQgc3RhYl9kZXNjOyAgICAgICAgICAgICAvKiBTdGFiIGRlc2MuICAqLworICBDT05TVCBjaGFyICpzdGFiX25hbWU7ICAgICAgIC8qIFN0cmluZyBmb3Igc3RhYiB0eXBlLiAgKi8KK30gc3ltYm9sX2luZm87CisKKy8qIEdldCB0aGUgbmFtZSBvZiBhIHN0YWJzIHR5cGUgY29kZS4gICovCisKK2V4dGVybiBjb25zdCBjaGFyICpiZmRfZ2V0X3N0YWJfbmFtZSBQQVJBTVMgKChpbnQpKTsKKwwKKy8qIEhhc2ggdGFibGUgcm91dGluZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gZnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLworCisvKiBBbiBlbGVtZW50IGluIHRoZSBoYXNoIHRhYmxlLiAgTW9zdCB1c2VzIHdpbGwgYWN0dWFsbHkgdXNlIGEgbGFyZ2VyCisgICBzdHJ1Y3R1cmUsIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KKworc3RydWN0IGJmZF9oYXNoX2VudHJ5Cit7CisgIC8qIE5leHQgZW50cnkgZm9yIHRoaXMgaGFzaCBjb2RlLiAgKi8KKyAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpuZXh0OworICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KKyAgY29uc3QgY2hhciAqc3RyaW5nOworICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQorICAgICB0YWJsZS4gICovCisgIHVuc2lnbmVkIGxvbmcgaGFzaDsKK307CisKKy8qIEEgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBiZmRfaGFzaF90YWJsZQoreworICAvKiBUaGUgaGFzaCBhcnJheS4gICovCisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnRhYmxlOworICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgdW5zaWduZWQgaW50IHNpemU7CisgIC8qIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgbmV3IGVsZW1lbnRzIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlCisgICAgIGZpcnN0IGVudHJ5IGlzIGl0c2VsZiBhIHBvaW50ZXIgdG8gYW4gZWxlbWVudC4gIFdoZW4gdGhpcworICAgICBmdW5jdGlvbiBpcyBmaXJzdCBpbnZva2VkLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBOVUxMLiAgSG93ZXZlciwKKyAgICAgaGF2aW5nIHRoZSBwb2ludGVyIHBlcm1pdHMgYSBoaWVyYXJjaHkgb2YgbWV0aG9kIGZ1bmN0aW9ucyB0byBiZQorICAgICBidWlsdCBlYWNoIG9mIHdoaWNoIGNhbGxzIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3VwZXJjbGFzcy4gIFRodXMKKyAgICAgZWFjaCBmdW5jdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBvZiBtZW1vcnkKKyAgICAgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgTlVMTC4gICovCisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkJICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkJICAgICBjb25zdCBjaGFyICopKTsKKyAgIC8qIEFuIG9iamFsbG9jIGZvciB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGlzIGEgc3RydWN0IG9iamFsbG9jICosCisgICAgIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mIG9iamFsbG9jLmguICAqLworICBQVFIgbWVtb3J5OworfTsKKworLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUuICAqLworZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7CisKKy8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIHNwZWNpZnlpbmcgYSBzaXplLiAgKi8KK2V4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXRfbgorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCSAgICAgICBjb25zdCBjaGFyICopLAorCSAgIHVuc2lnbmVkIGludCBzaXplKSk7CisKKy8qIEZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KK2V4dGVybiB2b2lkIGJmZF9oYXNoX3RhYmxlX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopKTsKKworLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICBJZiBDUkVBVEUgaXMgdHJ1ZSwgYSBuZXcgZW50cnkKKyAgIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBzdHJpbmcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICBUaGUKKyAgIENPUFkgYXJndW1lbnQgbXVzdCBiZSB0cnVlIGlmIHRoaXMgcm91dGluZSBzaG91bGQgY29weSB0aGUgc3RyaW5nCisgICBpbnRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgd2hlbiBhZGRpbmcgYW4gZW50cnkuICAqLworZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbG9va3VwCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAorCSAgIGJvb2xlYW4gY29weSkpOworCisvKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCitleHRlcm4gdm9pZCBiZmRfaGFzaF9yZXBsYWNlCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZCwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53KSk7CisKKy8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGhhc2ggdGFibGUgZW50cnkuICAqLworZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJICAgY29uc3QgY2hhciAqKSk7CisKKy8qIEdyYWIgc29tZSBzcGFjZSBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KK2V4dGVybiBQVFIgYmZkX2hhc2hfYWxsb2NhdGUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJICAgICAgdW5zaWduZWQgaW50KSk7CisKKy8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZSBpbiBhIHJhbmRvbSBvcmRlciwgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2gKKyAgIGVsZW1lbnQuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHRyYXZlcnNhbCBzdG9wcy4gIFRoZQorICAgSU5GTyBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiB2b2lkIGJmZF9oYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCSAgICAgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJCQkgICAgUFRSKSwKKwkJCQkgICAgICAgUFRSIGluZm8pKTsKKwwKKy8qIFNlbWktcG9ydGFibGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gaW4gY3BwLgorICAgVGhlIENBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMgcHJlcHJvY2Vzc29ycy4KKyAgIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBpcyBub3QgYSB2YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuLCBhbmQgd2UgZG9uJ3QKKyAgIHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sICJubG1fMzJfIikuICBUaGUgWENBVDIgbWFjcm8gd2lsbCBjYXVzZSB0aGUKKyAgIGlubmVyIENBVCBtYWNyb3MgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLgorICAgVGhlbiB0aGUgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCisjaWZuZGVmIENBVAorI2lmZGVmIFNBQkVSCisjZGVmaW5lIENBVChhLGIpCWEjI2IKKyNkZWZpbmUgQ0FUMyhhLGIsYykJYSMjYiMjYworI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKKyNlbHNlCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKKyNkZWZpbmUgQ0FUKGEsYikgYSMjYgorI2RlZmluZSBDQVQzKGEsYixjKSBhIyNiIyNjCisjZGVmaW5lIFhDQVQyKGEsYikJQ0FUKGEsYikKKyNkZWZpbmUgQ0FUNChhLGIsYyxkKQlYQ0FUMihDQVQoYSxiKSxDQVQoYyxkKSkKKyNlbHNlCisjZGVmaW5lIENBVChhLGIpIGEvKiovYgorI2RlZmluZSBDQVQzKGEsYixjKSBhLyoqL2IvKiovYworI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBDT0ZGX1NXQVBfVEFCTEUgKFBUUikgJmJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlCisMCisvKiBVc2VyIHByb2dyYW0gYWNjZXNzIHRvIEJGRCBmYWNpbGl0aWVzICovCisKKy8qIERpcmVjdCBJL08gcm91dGluZXMsIGZvciBwcm9ncmFtcyB3aGljaCBrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdAorICAgZmlsZSB0aGFuIEJGRCBkb2VzLiAgVXNlIGhpZ2hlciBsZXZlbCByb3V0aW5lcyBpZiBwb3NzaWJsZS4gICovCisKK2V4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9yZWFkCisgIFBBUkFNUyAoKFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7CitleHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfd3JpdGUKKyAgUEFSQU1TICgoY29uc3QgUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKK2V4dGVybiBpbnQgYmZkX3NlZWsgUEFSQU1TICgoYmZkICphYmZkLCBmaWxlX3B0ciBmcCwgaW50IGRpcmVjdGlvbikpOworZXh0ZXJuIGxvbmcgYmZkX3RlbGwgUEFSQU1TICgoYmZkICphYmZkKSk7CitleHRlcm4gaW50IGJmZF9mbHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2V4dGVybiBpbnQgYmZkX3N0YXQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqKSk7CisKKworLyogQ2FzdCBmcm9tIGNvbnN0IGNoYXIgKiB0byBjaGFyICogc28gdGhhdCBjYWxsZXIgY2FuIGFzc2lnbiB0bworICAgYSBjaGFyICogd2l0aG91dCBhIHdhcm5pbmcuICAqLworI2RlZmluZSBiZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpICgoY2hhciAqKSAoYWJmZCktPmZpbGVuYW1lKQorI2RlZmluZSBiZmRfZ2V0X2NhY2hlYWJsZShhYmZkKSAoKGFiZmQpLT5jYWNoZWFibGUpCisjZGVmaW5lIGJmZF9nZXRfZm9ybWF0KGFiZmQpICgoYWJmZCktPmZvcm1hdCkKKyNkZWZpbmUgYmZkX2dldF90YXJnZXQoYWJmZCkgKChhYmZkKS0+eHZlYy0+bmFtZSkKKyNkZWZpbmUgYmZkX2dldF9mbGF2b3VyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmZsYXZvdXIpCisjZGVmaW5lIGJmZF9iaWdfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKKyNkZWZpbmUgYmZkX2xpdHRsZV9lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQorI2RlZmluZSBiZmRfaGVhZGVyX2JpZ19lbmRpYW4oYWJmZCkgXAorICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQorI2RlZmluZSBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4oYWJmZCkgXAorICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQorI2RlZmluZSBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+ZmxhZ3MpCisjZGVmaW5lIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+b2JqZWN0X2ZsYWdzKQorI2RlZmluZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnNlY3Rpb25fZmxhZ3MpCisjZGVmaW5lIGJmZF9teV9hcmNoaXZlKGFiZmQpICgoYWJmZCktPm15X2FyY2hpdmUpCisjZGVmaW5lIGJmZF9oYXNfbWFwKGFiZmQpICgoYWJmZCktPmhhc19hcm1hcCkKKworI2RlZmluZSBiZmRfdmFsaWRfcmVsb2NfdHlwZXMoYWJmZCkgKChhYmZkKS0+eHZlYy0+dmFsaWRfcmVsb2NfdHlwZXMpCisjZGVmaW5lIGJmZF91c3JkYXRhKGFiZmQpICgoYWJmZCktPnVzcmRhdGEpCisKKyNkZWZpbmUgYmZkX2dldF9zdGFydF9hZGRyZXNzKGFiZmQpICgoYWJmZCktPnN0YXJ0X2FkZHJlc3MpCisjZGVmaW5lIGJmZF9nZXRfc3ltY291bnQoYWJmZCkgKChhYmZkKS0+c3ltY291bnQpCisjZGVmaW5lIGJmZF9nZXRfb3V0c3ltYm9scyhhYmZkKSAoKGFiZmQpLT5vdXRzeW1ib2xzKQorI2RlZmluZSBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCkgKChhYmZkKS0+c2VjdGlvbl9jb3VudCkKKworI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+c3ltYm9sX2xlYWRpbmdfY2hhcikKKworI2RlZmluZSBiZmRfc2V0X2NhY2hlYWJsZShhYmZkLGJvb2wpICgoKGFiZmQpLT5jYWNoZWFibGUgPSAoYm9vbGVhbikoYm9vbCkpLCB0cnVlKQorCitleHRlcm4gYm9vbGVhbiBiZmRfcmVjb3JkX3BoZHIKKyAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sIGZsYWd3b3JkLCBib29sZWFuLCBiZmRfdm1hLAorCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgc3RydWN0IHNlYyAqKikpOworCisvKiBCeXRlIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KKworYmZkX3ZtYQkJYmZkX2dldGI2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF92bWEgCWJmZF9nZXRsNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfdm1hCQliZmRfZ2V0YjMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3ZtYQkJYmZkX2dldGwzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKK2JmZF92bWEJCWJmZF9nZXRiMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CitiZmRfdm1hCQliZmRfZ2V0bDE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOworYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwordm9pZAkJYmZkX3B1dGI2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKK3ZvaWQJCWJmZF9wdXRsNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Cit2b2lkCQliZmRfcHV0YjMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwordm9pZAkJYmZkX3B1dGwzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKK3ZvaWQJCWJmZF9wdXRiMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Cit2b2lkCQliZmRfcHV0bDE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOworDAorLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzLiAgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCitzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbzsKK3N0cnVjdCBlY29mZl9kZWJ1Z19zd2FwOworc3RydWN0IGVjb2ZmX2V4dHI7CitzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Oworc3RydWN0IGJmZF9saW5rX2luZm87CitzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeTsKK3N0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZTsKKyNlbmRpZgorZXh0ZXJuIGJmZF92bWEgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSBncF92YWx1ZSkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcworICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgZ3BybWFzaywgdW5zaWduZWQgbG9uZyBmcHJtYXNrLAorCSAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2spKTsKK2V4dGVybiBQVFIgYmZkX2Vjb2ZmX2RlYnVnX2luaXQKKyAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWNvZmZfZGVidWdfZnJlZQorICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAorCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCisgIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKKwkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCisJICAgYmZkICppbnB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZywKKwkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcCwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcgorICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLCBiZmQgKmlucHV0X2JmZCwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAorCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAorCSAgIGJvb2xlYW4gKCpnZXRfZXh0cikgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKKwkJCQlzdHJ1Y3QgZWNvZmZfZXh0ciAqKSwKKwkgICB2b2lkICgqc2V0X2luZGV4KSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAorCQkJICAgICAgYmZkX3NpemVfdHlwZSkpKTsKK2V4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwKKyAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCisJICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVjb2ZmX2V4dHIgKmVzeW0pKTsKK2V4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9lY29mZl9kZWJ1Z19zaXplCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfZGVidWcKKyAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsIGZpbGVfcHRyIHdoZXJlKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcKKyAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGZpbGVfcHRyIHdoZXJlKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICosIHN0cnVjdCBzZWMgKiwKKwkgICBjaGFyICoqKSk7CisKKy8qIEV4dGVybmFsbHkgdmlzaWJsZSBFTEYgcm91dGluZXMuICAqLworCitzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QKK3sKKyAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZXh0OworICBiZmQgKmJ5OworICBjb25zdCBjaGFyICpuYW1lOworfTsKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBib29sZWFuIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAorCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAorCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAorCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAorCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gY29uc3QgY2hhciAqYmZkX2VsZl9nZXRfZHRfc29uYW1lIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLworCitleHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLCBzdHJ1Y3Qgc2VjICoqLAorCSAgIHN0cnVjdCBzZWMgKiopKTsKKworLyogTGludXggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCisKK2V4dGVybiBib29sZWFuIGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKy8qIG1tYXAgaGFja3MgKi8KKworc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsOwordHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgYmZkX3dpbmRvd19pbnRlcm5hbDsKKwordHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3cgeworICAvKiBXaGF0IHRoZSB1c2VyIGFza2VkIGZvci4gICovCisgIFBUUiBkYXRhOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIC8qIFRoZSBhY3R1YWwgd2luZG93IHVzZWQgYnkgQkZELiAgU21hbGwgdXNlci1yZXF1ZXN0ZWQgcmVhZC1vbmx5CisgICAgIHJlZ2lvbnMgc2hhcmluZyBhIHBhZ2UgbWF5IHNoYXJlIGEgc2luZ2xlIHdpbmRvdyBpbnRvIHRoZSBvYmplY3QKKyAgICAgZmlsZS4gIFJlYWQtd3JpdGUgdmVyc2lvbnMgc2hvdWxkbid0IHVudGlsIEkndmUgZml4ZWQgdGhpbmdzIHRvCisgICAgIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydGlvbnMgaGF2ZSBiZWVuIGNsYWltZWQgYnkgdGhlCisgICAgIGFwcGxpY2F0aW9uOyBkb24ndCB3YW50IHRvIGdpdmUgdGhlIHNhbWUgcmVnaW9uIGJhY2sgd2hlbiB0aGUKKyAgICAgYXBwbGljYXRpb24gd2FudHMgdHdvIHdyaXRhYmxlIGNvcGllcyEgICovCisgIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqaTsKK30gYmZkX3dpbmRvdzsKKworZXh0ZXJuIHZvaWQgYmZkX2luaXRfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOworZXh0ZXJuIHZvaWQgYmZkX2ZyZWVfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2dldF9maWxlX3dpbmRvdworICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJmZF93aW5kb3cgKiwgYm9vbGVhbikpOworCisvKiBYQ09GRiBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBiZmRfc2l6ZV90eXBlKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBib29sZWFuKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLAorCSAgIGludCwgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IHNlYyAqKikpOworCisvKiBFeHRlcm5hbGx5IHZpc2libGUgQ09GRiByb3V0aW5lcy4gICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQorc3RydWN0IGludGVybmFsX3N5bWVudDsKK3VuaW9uIGludGVybmFsX2F1eGVudDsKKyNlbmRpZgorCitleHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfc3ltZW50CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOworCitleHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfYXV4ZW50CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIGludCwgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCB1bnNpZ25lZCBpbnQpKTsKKworLyogQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KK2V4dGVybiBib29sZWFuIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworLyogRUxGIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCisgIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCisgICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworIAorICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KKyAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworIAorICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZworICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKy8qIEFuZCBtb3JlIGZyb20gdGhlIHNvdXJjZS4gICovCit2b2lkIAorYmZkX2luaXQgUEFSQU1TICgodm9pZCkpOworCitiZmQgKgorYmZkX29wZW5yIFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKKworYmZkICoKK2JmZF9mZG9wZW5yIFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQsIGludCBmZCkpOworCitiZmQgKgorYmZkX29wZW5zdHJlYW1yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBQVFIpKTsKKworYmZkICoKK2JmZF9vcGVudyBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KSk7CisKK2Jvb2xlYW4gCitiZmRfY2xvc2UgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2Jvb2xlYW4gCitiZmRfY2xvc2VfYWxsX2RvbmUgUEFSQU1TICgoYmZkICopKTsKKworYmZkICoKK2JmZF9jcmVhdGUgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIGJmZCAqdGVtcGwpKTsKKworYm9vbGVhbiAKK2JmZF9tYWtlX3dyaXRhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitib29sZWFuIAorYmZkX21ha2VfcmVhZGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7CisKKworIC8qIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciB1c2VyIHNlY3Rpb24gZGF0YS4gICovCisKKyNkZWZpbmUgYmZkX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCisgICAgICAgICAgICAgICAgKCooKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgPSAodW5zaWduZWQgY2hhcikodmFsKSkKKyNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCisgICAgICAgICAgICAgICBiZmRfcHV0XzgKKyNkZWZpbmUgYmZkX2dldF84KGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgICgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSkKKyNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCisKKyNkZWZpbmUgYmZkX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCisjZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzE2IFwKKyAgICAgICAgICAgICAgICBiZmRfcHV0XzE2CisjZGVmaW5lIGJmZF9nZXRfMTYoYWJmZCwgcHRyKSBcCisgICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCisjZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQorCisjZGVmaW5lIGJmZF9wdXRfMzIoYWJmZCwgdmFsLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQorI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8zMiBcCisgICAgICAgICAgICAgICAgYmZkX3B1dF8zMgorI2RlZmluZSBiZmRfZ2V0XzMyKGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQorI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQorCisjZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDY0LCAoKHZhbCksIChwdHIpKSkKKyNkZWZpbmUgYmZkX3B1dF9zaWduZWRfNjQgXAorICAgICAgICAgICAgICAgIGJmZF9wdXRfNjQKKyNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDY0LCAocHRyKSkKKyNkZWZpbmUgYmZkX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCisgICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzY0LCAocHRyKSkKKworCisgLyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIGZpbGUgaGVhZGVyIGRhdGEuICAqLworCisjZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCisgICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQorI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzgoYWJmZCwgdmFsLCBwdHIpIFwKKyAgICAgICAgICAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdmFsLCBwdHIpCisjZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgYmZkX2dldF84IChhYmZkLCBwdHIpCisjZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKKworI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQorI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzE2IFwKKyAgICAgICAgICAgICAgICBiZmRfaF9wdXRfMTYKKyNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKKyNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8xNiwgKHB0cikpCisKKyNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCisgICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDMyLCh2YWwscHRyKSkKKyNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCisgICAgICAgICAgICAgICAgYmZkX2hfcHV0XzMyCisjZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCisjZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCisgICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQorCisjZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQorI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKKyAgICAgICAgICAgICAgICBiZmRfaF9wdXRfNjQKKyNkZWZpbmUgYmZkX2hfZ2V0XzY0KGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKKyNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCisKK3R5cGVkZWYgc3RydWN0IHNlYworeworICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAgdGhlIHNhbWUgYXMgdGhhdCBwYXNzZWQgdG8gYmZkX21ha2Vfc2VjdGlvbi4gKi8KKworICAgIENPTlNUIGNoYXIgKm5hbWU7CisKKyAgICAgICAgIC8qIFdoaWNoIHNlY3Rpb24gaXMgaXQ7IDAuLm50aC4gICAgICAqLworCisgICBpbnQgaW5kZXg7CisKKyAgICAgICAgIC8qIFRoZSBuZXh0IHNlY3Rpb24gaW4gdGhlIGxpc3QgYmVsb25naW5nIHRvIHRoZSBCRkQsIG9yIE5VTEwuICovCisKKyAgICBzdHJ1Y3Qgc2VjICpuZXh0OworCisgICAgICAgICAvKiBUaGUgZmllbGQgZmxhZ3MgY29udGFpbnMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbi4gU29tZQorICAgICAgICAgICBmbGFncyBhcmUgcmVhZCBpbiBmcm9tIHRoZSBvYmplY3QgZmlsZSwgYW5kIHNvbWUgYXJlCisgICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqLworCisgICAgZmxhZ3dvcmQgZmxhZ3M7CisKKyNkZWZpbmUgU0VDX05PX0ZMQUdTICAgMHgwMDAKKworICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzIHNlY3Rpb24gd2hlbiBsb2FkaW5nLgorICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgorICAgICAgICAgICBvbmx5LiAqLworI2RlZmluZSBTRUNfQUxMT0MgICAgICAweDAwMQorCisgICAgICAgICAvKiBUZWxscyB0aGUgT1MgdG8gbG9hZCB0aGUgc2VjdGlvbiBmcm9tIHRoZSBmaWxlIHdoZW4gbG9hZGluZy4KKyAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSAuYnNzIHNlY3Rpb24uICovCisjZGVmaW5lIFNFQ19MT0FEICAgICAgIDB4MDAyCisKKyAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgc3RpbGwgdG8gYmUgcmVsb2NhdGVkLCBzbyB0aGVyZSBpcworICAgICAgICAgICBzb21lIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG9vLiAqLworI2RlZmluZSBTRUNfUkVMT0MgICAgICAweDAwNAorCisjaWYgMCAgICAvKiBPYnNvbGV0ZSA/ICovCisjZGVmaW5lIFNFQ19CQUxJR04gICAgIDB4MDA4CisjZW5kaWYKKworICAgICAgICAgLyogQSBzaWduYWwgdG8gdGhlIE9TIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgcmVhZCBvbmx5CisgICAgICAgICAgZGF0YS4gKi8KKyNkZWZpbmUgU0VDX1JFQURPTkxZICAgMHgwMTAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29kZSBvbmx5LiAqLworI2RlZmluZSBTRUNfQ09ERSAgICAgICAweDAyMAorCisgICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkuICovCisjZGVmaW5lIFNFQ19EQVRBICAgICAgIDB4MDQwCisKKyAgICAgICAgIC8qIFRoZSBzZWN0aW9uIHdpbGwgcmVzaWRlIGluIFJPTS4gKi8KKyNkZWZpbmUgU0VDX1JPTSAgICAgICAgMHgwODAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgorICAgICAgICAgICB0eXBlIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBjcmVhdGUgbGlzdHMgb2YgY29uc3RydWN0b3JzIGFuZAorICAgICAgICAgICBkZXN0cnVjdG9ycyB1c2VkIGJ5IDw8ZysrPj4uIFdoZW4gYSBiYWNrIGVuZCBzZWVzIGEgc3ltYm9sCisgICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldworICAgICAgICAgICBzZWN0aW9uIGZvciB0aGUgdHlwZSBvZiBuYW1lIChlLmcuLCA8PF9fQ1RPUl9MSVNUX18+PiksIGF0dGFjaGVzCisgICAgICAgICAgIHRoZSBzeW1ib2wgdG8gaXQsIGFuZCBidWlsZHMgYSByZWxvY2F0aW9uLiBUbyBidWlsZCB0aGUgbGlzdHMKKyAgICAgICAgICAgb2YgY29uc3RydWN0b3JzLCBhbGwgdGhlIGxpbmtlciBoYXMgdG8gZG8gaXMgY2F0ZW5hdGUgYWxsIHRoZQorICAgICAgICAgICBzZWN0aW9ucyBjYWxsZWQgPDxfX0NUT1JfTElTVF9fPj4gYW5kIHJlbG9jYXRlIHRoZSBkYXRhCisgICAgICAgICAgIGNvbnRhaW5lZCB3aXRoaW4gLSBleGFjdGx5IHRoZSBvcGVyYXRpb25zIGl0IHdvdWxkIHBlZm9ybSBvbgorICAgICAgICAgICBzdGFuZGFyZCBkYXRhLiAqLworI2RlZmluZSBTRUNfQ09OU1RSVUNUT1IgMHgxMDAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gaXMgYSBjb25zdHJ1Y3RvciwgYW5kIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlCisgICAgICAgICAgZW5kIG9mIHRoZSB0ZXh0LCBkYXRhLCBvciBic3Mgc2VjdGlvbig/KS4gKi8KKyNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX1RFWFQgMHgxMTAwCisjZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9EQVRBIDB4MjEwMAorI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfQlNTICAweDMxMDAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gaGFzIGNvbnRlbnRzIC0gYSBkYXRhIHNlY3Rpb24gY291bGQgYmUKKyAgICAgICAgICAgPDxTRUNfQUxMT0M+PiB8IDw8U0VDX0hBU19DT05URU5UUz4+OyBhIGRlYnVnIHNlY3Rpb24gY291bGQgYmUKKyAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKi8KKyNkZWZpbmUgU0VDX0hBU19DT05URU5UUyAweDIwMAorCisgICAgICAgICAvKiBBbiBpbnN0cnVjdGlvbiB0byB0aGUgbGlua2VyIHRvIG5vdCBvdXRwdXQgdGhlIHNlY3Rpb24KKyAgICAgICAgICAgZXZlbiBpZiBpdCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKi8KKyNkZWZpbmUgU0VDX05FVkVSX0xPQUQgMHg0MDAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gaXMgYSBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uICBUaGlzIGZsYWcgaXMKKyAgICAgICAgICAgb25seSBmb3IgdGhlIGxpbmtlci4gIElmIHRoaXMgdHlwZSBvZiBzZWN0aW9uIGFwcGVhcnMgaW4KKyAgICAgICAgICAgdGhlIGlucHV0IGZpbGUsIHRoZSBsaW5rZXIgbXVzdCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSB2bWEgb3Igc2l6ZS4gIEZJWE1FOiBBbHRob3VnaCB0aGlzCisgICAgICAgICAgIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGdlbmVyYWwsIGl0IHJlYWxseSBpcyBDT0ZGCisgICAgICAgICAgIHNwZWNpZmljIChhbmQgdGhlIGZsYWcgd2FzIHJlbmFtZWQgdG8gaW5kaWNhdGUgdGhpcykuICBJdAorICAgICAgICAgICBtaWdodCBiZSBjbGVhbmVyIHRvIGhhdmUgc29tZSBtb3JlIGdlbmVyYWwgbWVjaGFuaXNtIHRvCisgICAgICAgICAgIGFsbG93IHRoZSBiYWNrIGVuZCB0byBjb250cm9sIHdoYXQgdGhlIGxpbmtlciBkb2VzIHdpdGgKKyAgICAgICAgICAgc2VjdGlvbnMuICovCisjZGVmaW5lIFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZIDB4ODAwCisKKyAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbW1vbiBzeW1ib2xzIChzeW1ib2xzIG1heSBiZSBkZWZpbmVkCisgICAgICAgICAgIG11bHRpcGxlIHRpbWVzLCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgdGhlIGFtb3VudCBvZgorICAgICAgICAgICBzcGFjZSBpdCByZXF1aXJlcywgYW5kIHRoZSBsYXJnZXN0IHN5bWJvbCB2YWx1ZSBpcyB0aGUgb25lCisgICAgICAgICAgIHVzZWQpLiAgTW9zdCB0YXJnZXRzIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgKHdoaWNoIHdlCisgICAgICAgICAgIHRyYW5zbGF0ZSB0byBiZmRfY29tX3NlY3Rpb25fcHRyKSwgYnV0IEVDT0ZGIGhhcyB0d28uICovCisjZGVmaW5lIFNFQ19JU19DT01NT04gMHg4MDAwCisKKyAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRm9yCisgICAgICAgICAgIGV4YW1wbGUsIHRoaXMgaXMgc2V0IGZvciBFTEYgLmRlYnVnIGFuZCAuc3RhYiBzZWN0aW9ucy4KKyAgICAgICAgICAgc3RyaXAgdGVzdHMgdGhpcyBmbGFnIHRvIHNlZSBpZiBhIHNlY3Rpb24gY2FuIGJlCisgICAgICAgICAgIGRpc2NhcmRlZC4gKi8KKyNkZWZpbmUgU0VDX0RFQlVHR0lORyAweDEwMDAwCisKKyAgICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIGhlbGQgaW4gbWVtb3J5IHBvaW50ZWQgdG8KKyAgICAgICAgICAgYnkgdGhlIGNvbnRlbnRzIGZpZWxkLiAgVGhpcyBpcyBjaGVja2VkIGJ5CisgICAgICAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHRoZSBkYXRhIGlzIHJldHJpZXZlZCBmcm9tCisgICAgICAgICAgIG1lbW9yeSBpZiBhcHByb3ByaWF0ZS4gICovCisjZGVmaW5lIFNFQ19JTl9NRU1PUlkgMHgyMDAwMAorCisgICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBleGNsdWRlZCBieSB0aGUKKyAgICAgICAgICAgbGlua2VyIGZvciBleGVjdXRhYmxlIGFuZCBzaGFyZWQgb2JqZWN0cyB1bmxlc3MgdGhvc2UKKyAgICAgICAgICAgb2JqZWN0cyBhcmUgdG8gYmUgZnVydGhlciByZWxvY2F0ZWQuICAqLworI2RlZmluZSBTRUNfRVhDTFVERSAweDQwMDAwCisKKyAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgc29ydGVkIGJ5IHRoZQorICAgICAgICAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKKyAgICAgICAgICB0YWJsZS4gICovCisjZGVmaW5lIFNFQ19TT1JUX0VOVFJJRVMgMHg4MDAwMAorCisgICAgICAgIC8qIFdoZW4gbGlua2luZywgZHVwbGljYXRlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2hvdWxkIGJlCisgICAgICAgICAgZGlzY2FyZGVkLCByYXRoZXIgdGhhbiBiZWluZyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHNlY3Rpb24gYXMKKyAgICAgICAgICBpcyB1c3VhbGx5IGRvbmUuICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGNvbW1vbiBzeW1ib2xzIGFyZQorICAgICAgICAgIGhhbmRsZWQuICBTZWUgU0VDX0xJTktfRFVQTElDQVRFUyBiZWxvdy4gICovCisjZGVmaW5lIFNFQ19MSU5LX09OQ0UgMHgxMDAwMDAKKworICAgICAgICAvKiBJZiBTRUNfTElOS19PTkNFIGlzIHNldCwgdGhpcyBiaXRmaWVsZCBkZXNjcmliZXMgaG93IHRoZSBsaW5rZXIKKyAgICAgICAgICBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSBzZWN0aW9ucy4gICovCisjZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVMgMHg2MDAwMDAKKworICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgZHVwbGljYXRlCisgICAgICAgICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBzaW1wbHkgYmUgZGlzY2FyZGVkLiAqLworI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQgMHgwCisKKyAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKKyAgICAgICAgICBzaG91bGQgd2FybiBpZiB0aGVyZSBhcmUgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucywgYWx0aG91Z2gKKyAgICAgICAgICBpdCBzaG91bGQgc3RpbGwgb25seSBsaW5rIG9uZSBjb3B5LiAgKi8KKyNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWSAweDIwMDAwMAorCisgICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCisgICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBhcmUgYSBkaWZmZXJlbnQgc2l6ZS4gICovCisjZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFIDB4NDAwMDAwCisKKyAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKKyAgICAgICAgICBzaG91bGQgd2FybiBpZiBhbnkgZHVwbGljYXRlIHNlY3Rpb25zIGNvbnRhaW4gZGlmZmVyZW50CisgICAgICAgICAgY29udGVudHMuICAqLworI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMgMHg2MDAwMDAKKworICAgICAgICAvKiBUaGlzIHNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlciBhcyBwYXJ0IG9mIGR5bmFtaWMKKyAgICAgICAgICByZWxvY2F0aW9uIG9yIG90aGVyIGFyY2FuZSBwcm9jZXNzaW5nLiAgSXQgaXMgc2tpcHBlZCB3aGVuCisgICAgICAgICAgZ29pbmcgdGhyb3VnaCB0aGUgZmlyc3QtcGFzcyBvdXRwdXQsIHRydXN0aW5nIHRoYXQgc29tZW9uZQorICAgICAgICAgIGVsc2UgdXAgdGhlIGxpbmUgd2lsbCB0YWtlIGNhcmUgb2YgaXQgbGF0ZXIuICAqLworI2RlZmluZSBTRUNfTElOS0VSX0NSRUFURUQgMHg4MDAwMDAKKworICAgICAgICAvKiBUaGlzIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCisjZGVmaW5lIFNFQ19LRUVQIDB4MTAwMDAwMAorCisgICAgICAgIC8qICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICovCisKKyAgICAgICAgLyogU29tZSBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLworCisgICAgICAgIC8qIFNlZSB0aGUgdm1hIGZpZWxkLiAgKi8KKyAgICAgICB1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKKworICAgICAgICAvKiBXaGV0aGVyIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLworICAgICAgIHVuc2lnbmVkIGludCByZWxvY19kb25lIDogMTsKKworICAgICAgICAvKiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICovCisgICAgICAgdW5zaWduZWQgaW50IGxpbmtlcl9tYXJrIDogMTsKKworICAgICAgICAvKiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgbGlua2VyIGJhY2tlbmRzIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLworICAgICAgIHVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKKworICAgICAgICAvKiBFbmQgb2YgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKi8KKworICAgICAgICAvKiAgVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3aWxsIGJlCisgICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKKyAgICAgICAgICAgdXNlcl9zZXRfdm1hIGZsYWcgaXMgbWFpbnRhaW5lZCBieSBiZmQ7IGlmIGl0J3Mgbm90IHNldCwgdGhlCisgICAgICAgICAgIGJhY2tlbmQgY2FuIGFzc2lnbiBhZGRyZXNzZXMgKGZvciBleGFtcGxlLCBpbiA8PGEub3V0Pj4sIHdoZXJlCisgICAgICAgICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCisgICAgICAgICAgIHRhcmdldCBhbmQgdmFyaW91cyBmbGFncykuICAqLworCisgICBiZmRfdm1hIHZtYTsKKworICAgICAgICAvKiAgVGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdvdWxkIGJlIGluIGEKKyAgICAgICAgICAgcm9tIGltYWdlOyByZWFsbHkgb25seSB1c2VkIGZvciB3cml0aW5nIHNlY3Rpb24gaGVhZGVyCisgICAgICAgICAgIGluZm9ybWF0aW9uLiAqLworCisgICBiZmRfdm1hIGxtYTsKKworICAgICAgICAgLyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgorICAgICAgICAgICBjb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKKyAgICAgICAgICAgc2l6ZSBvZiA8PC5ic3M+PikuIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gYWZ0ZXIgcmVsb2NhdGlvbiAqLworCisgICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKKworICAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiwgaW4gYnl0ZXMuICBOb3JtYWxseSB0aGlzCisgICAgICAgICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKKyAgICAgICAgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqLworCisgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKKworICAgICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQorICAgICAgICAgICBvZmZzZXQgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGlucHV0CisgICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCisgICAgICAgICAgIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSAxMDAuICovCisKKyAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKKworICAgICAgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKi8KKworICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247CisKKyAgICAgICAgIC8qIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQorICAgICAgICAgICBlLmcuLCAzIGFsaWducyB0byAyXjMgKG9yIDgpLiAqLworCisgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOworCisgICAgICAgICAvKiBJZiBhbiBpbnB1dCBzZWN0aW9uLCBhIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcmVsb2NhdGlvbgorICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICovCisKKyAgIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqcmVsb2NhdGlvbjsKKworICAgICAgICAgLyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bworICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KKworICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247CisKKyAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICovCisKKyAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OworCisgICAgICAgICAvKiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKKyAgICAgICAgICAgb3IgdXBkYXRlZC4gICovCisKKyAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICovCisKKyAgIGZpbGVfcHRyIGZpbGVwb3M7CisKKyAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICovCisKKyAgIGZpbGVfcHRyIHJlbF9maWxlcG9zOworCisgICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqLworCisgICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7CisKKyAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICovCisKKyAgIFBUUiB1c2VyZGF0YTsKKworICAgICAgICAgLyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKKyAgICAgICAgICAgY29udGVudHMuICAqLworICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7CisKKyAgICAgICAgIC8qIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICovCisKKyAgIGFsZW50ICpsaW5lbm87CisKKyAgICAgICAgIC8qIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKi8KKworICAgdW5zaWduZWQgaW50IGxpbmVub19jb3VudDsKKworICAgICAgICAgLyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQorICAgICAgICAgICBsaW5lbnVtYmVycyBhcmUgd3JpdHRlbiBvdXQgKi8KKworICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKKworICAgICAgICAgLyogV2hhdCB0aGUgc2VjdGlvbiBudW1iZXIgaXMgaW4gdGhlIHRhcmdldCB3b3JsZCAgKi8KKworICAgaW50IHRhcmdldF9pbmRleDsKKworICAgUFRSIHVzZWRfYnlfYmZkOworCisgICAgICAgICAvKiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQorICAgICAgICAgICByZWxvY2F0aW9ucyBjcmVhdGVkIHRvIHJlbG9jYXRlIGl0ZW1zIHdpdGhpbiBpdC4gKi8KKworICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47CisKKyAgICAgICAgIC8qIFRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc2VjdGlvbi4gKi8KKworICAgYmZkICpvd25lcjsKKworICAgICAgICAgLyogQSBzeW1ib2wgd2hpY2ggcG9pbnRzIGF0IHRoaXMgc2VjdGlvbiBvbmx5ICovCisgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7CisgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7CisKKyAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcl9oZWFkOworICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Cit9IGFzZWN0aW9uIDsKKworICAgICAvKiBUaGVzZSBzZWN0aW9ucyBhcmUgZ2xvYmFsLCBhbmQgYXJlIG1hbmFnZWQgYnkgQkZELiAgVGhlIGFwcGxpY2F0aW9uCisgICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgorICAgICAgIHRoZXNlIHNlY3Rpb25zLiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgc2VjdGlvbl9wdHIgbWFjcm9zIHJhdGhlcgorICAgICAgIHRoYW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBjb25zdCBzZWN0aW9ucy4gIFRoZSBjb25zdCBzZWN0aW9ucworICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICovCisjZGVmaW5lIEJGRF9BQlNfU0VDVElPTl9OQU1FICIqQUJTKiIKKyNkZWZpbmUgQkZEX1VORF9TRUNUSU9OX05BTUUgIipVTkQqIgorI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCisjZGVmaW5lIEJGRF9JTkRfU0VDVElPTl9OQU1FICIqSU5EKiIKKworICAgICAvKiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqLworZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKKyNkZWZpbmUgYmZkX2Fic19zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfYWJzX3NlY3Rpb24pCisjZGVmaW5lIGJmZF9pc19hYnNfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQorICAgICAvKiBQb2ludGVyIHRvIHRoZSB1bmRlZmluZWQgc2VjdGlvbiAqLworZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKKyNkZWZpbmUgYmZkX3VuZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24pCisjZGVmaW5lIGJmZF9pc191bmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQorICAgICAvKiBQb2ludGVyIHRvIHRoZSBjb21tb24gc2VjdGlvbiAqLworZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKKyNkZWZpbmUgYmZkX2NvbV9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfY29tX3NlY3Rpb24pCisgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IHNlY3Rpb24gKi8KK2V4dGVybiBjb25zdCBhc2VjdGlvbiBiZmRfaW5kX3NlY3Rpb247CisjZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQorI2RlZmluZSBiZmRfaXNfaW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2luZF9zZWN0aW9uX3B0cikKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2NvbV9zeW1ib2w7CitleHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF91bmRfc3ltYm9sOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHNlY3Rpb24pIFwKKyAgICAgKHNlY3Rpb24tPnJlbG9jX2RvbmUgPyAoYWJvcnQoKSwxKTogKHNlY3Rpb24pLT5fcmF3X3NpemUpCisjZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKKyAgICAgKChzZWN0aW9uLT5yZWxvY19kb25lKSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplOiAoYWJvcnQoKSwxKSkKK2FzZWN0aW9uICoKK2JmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOworCithc2VjdGlvbiAqCitiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7CisKK2FzZWN0aW9uICoKK2JmZF9tYWtlX3NlY3Rpb25fYW55d2F5IFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSkpOworCithc2VjdGlvbiAqCitiZmRfbWFrZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKSk7CisKK2Jvb2xlYW4gCitiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncykpOworCit2b2lkIAorYmZkX21hcF9vdmVyX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqYWJmZCwKKyAgICB2b2lkICgqZnVuYykoYmZkICphYmZkLAorICAgIGFzZWN0aW9uICpzZWN0LAorICAgIFBUUiBvYmopLAorICAgIFBUUiBvYmopKTsKKworYm9vbGVhbiAKK2JmZF9zZXRfc2VjdGlvbl9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpKTsKKworYm9vbGVhbiAKK2JmZF9zZXRfc2VjdGlvbl9jb250ZW50cworIFBBUkFNUyAoKGJmZCAqYWJmZCwKKyAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKyAgICBQVFIgZGF0YSwKKyAgICBmaWxlX3B0ciBvZmZzZXQsCisgICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOworCitib29sZWFuIAorYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCisgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLAorICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCkpOworCitib29sZWFuIAorYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYykpOworCisjZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAorICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBcCisgICAgICAgICAgICAgICAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKK3ZvaWQgCitfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKKyBQQVJBTVMgKChhc2VjdGlvbiAqc2VjdGlvbikpOworCitlbnVtIGJmZF9hcmNoaXRlY3R1cmUgCit7CisgIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KKyAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLworICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLworI2RlZmluZSBiZmRfbWFjaF9tNjgwMDAgMQorI2RlZmluZSBiZmRfbWFjaF9tNjgwMDggMgorI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMworI2RlZmluZSBiZmRfbWFjaF9tNjgwMjAgNAorI2RlZmluZSBiZmRfbWFjaF9tNjgwMzAgNQorI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgorI2RlZmluZSBiZmRfbWFjaF9tNjgwNjAgNworI2RlZmluZSBiZmRfbWFjaF9jcHUzMiAgOAorICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCisgIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLworICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCisgICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAorICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCisgICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKKyAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAorICAgICAgICJjb3JlIi4gKi8KKworI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMworI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0CisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgorI2RlZmluZSBiZmRfbWFjaF9pOTYwX2p4ICAgICAgICA3CisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfaHggICAgICAgIDgKKworICBiZmRfYXJjaF9hMjlrLCAgICAgICAvKiBBTUQgMjkwMDAgKi8KKyAgYmZkX2FyY2hfc3BhcmMsICAgICAgLyogU1BBUkMgKi8KKyNkZWZpbmUgYmZkX21hY2hfc3BhcmMgICAgICAgICAgICAgICAgIDEKKyAvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHY4cGx1cyBhbmQgdjkgaXMgdGhhdCB2OSBpcyBhIHRydWUgNjQgYml0IGVudi4gICovCisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0ICAgICAgICAyCisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSAgICAgICAzCisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyAgICAgICAgICA0CisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgICAgICAgICA1ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSAgICA2CisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5ICAgICAgICAgICAgICA3CisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5YSAgICAgICAgICAgICA4ICAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zICovCisgLyogTm9uemVybyBpZiBNQUNIIGhhcyB0aGUgdjkgaW5zdHJ1Y3Rpb24gc2V0LiAgKi8KKyNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlfcChtYWNoKSBcCisgICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCisgIGJmZF9hcmNoX21pcHMsICAgICAgIC8qIE1JUFMgUnh4eHggKi8KKyNkZWZpbmUgYmZkX21hY2hfbWlwczMwMDAgICAgICAgICAgICAgIDMwMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczM5MDAgICAgICAgICAgICAgIDM5MDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAgICAgICAgICAgICAgIDQwMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQwMTAgICAgICAgICAgICAgIDQwMTAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQxMDAgICAgICAgICAgICAgIDQxMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEgICAgICAgICAgICAgIDQxMTEKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQzMDAgICAgICAgICAgICAgIDQzMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQ0MDAgICAgICAgICAgICAgIDQ0MDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAgICAgICAgICAgICAgIDQ2MDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczQ2NTAgICAgICAgICAgICAgIDQ2NTAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczUwMDAgICAgICAgICAgICAgIDUwMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAgICAgICAgICAgICAgIDYwMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczgwMDAgICAgICAgICAgICAgIDgwMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczEwMDAwICAgICAgICAgICAgIDEwMDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHMxNiAgICAgICAgICAgICAgICAxNgorICBiZmRfYXJjaF9pMzg2LCAgICAgICAvKiBJbnRlbCAzODYgKi8KKyNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKKyNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pODA4NiAxCisjZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXggMgorICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KKyAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLworICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KKyAgYmZkX2FyY2hfcm9tcCwgICAgICAgLyogSUJNIFJPTVAgUEMvUlQgKi8KKyAgYmZkX2FyY2hfYWxsaWFudCwgICAgLyogQWxsaWFudCAqLworICBiZmRfYXJjaF9jb252ZXgsICAgICAvKiBDb252ZXggKi8KKyAgYmZkX2FyY2hfbTg4aywgICAgICAgLyogTW90b3JvbGEgODh4eHggKi8KKyAgYmZkX2FyY2hfcHlyYW1pZCwgICAgLyogUHlyYW1pZCBUZWNobm9sb2d5ICovCisgIGJmZF9hcmNoX2g4MzAwLCAgICAgIC8qIEhpdGFjaGkgSDgvMzAwICovCisjZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQorI2RlZmluZSBiZmRfbWFjaF9oODMwMGggIDIKKyNkZWZpbmUgYmZkX21hY2hfaDgzMDBzICAzCisgIGJmZF9hcmNoX3Bvd2VycGMsICAgIC8qIFBvd2VyUEMgKi8KKyAgYmZkX2FyY2hfcnM2MDAwLCAgICAgLyogSUJNIFJTLzYwMDAgKi8KKyAgYmZkX2FyY2hfaHBwYSwgICAgICAgLyogSFAgUEEgUklTQyAqLworICBiZmRfYXJjaF9kMTB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQxMFYgKi8KKyAgYmZkX2FyY2hfZDMwdiwgICAgICAgLyogTWl0c3ViaXNoaSBEMzBWICovCisgIGJmZF9hcmNoX3o4aywgICAgICAgIC8qIFppbG9nIFo4MDAwICovCisjZGVmaW5lIGJmZF9tYWNoX3o4MDAxICAgICAgICAgMQorI2RlZmluZSBiZmRfbWFjaF96ODAwMiAgICAgICAgIDIKKyAgYmZkX2FyY2hfaDg1MDAsICAgICAgLyogSGl0YWNoaSBIOC81MDAgKi8KKyAgYmZkX2FyY2hfc2gsICAgICAgICAgLyogSGl0YWNoaSBTSCAqLworI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKKyNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCisjZGVmaW5lIGJmZF9tYWNoX3NoM2UgICAgICAgMHgzZQorICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KKyNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCisjZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NSAgMHgyMAorI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjYgIDB4MzAKKyAgYmZkX2FyY2hfYXJtLCAgICAgICAgLyogQWR2YW5jZWQgUmlzYyBNYWNoaW5lcyBBUk0gKi8KKyNkZWZpbmUgYmZkX21hY2hfYXJtXzIgICAgICAgICAxCisjZGVmaW5lIGJmZF9tYWNoX2FybV8yYSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIGJmZF9tYWNoX2FybV8zICAgICAgICAgMworI2RlZmluZSBiZmRfbWFjaF9hcm1fM00gICAgICAgIDQKKyNkZWZpbmUgYmZkX21hY2hfYXJtXzQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgYmZkX21hY2hfYXJtXzRUICAgICAgICA2CisgIGJmZF9hcmNoX25zMzJrLCAgICAgIC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3JzIG5zMzIwMDAgKi8KKyAgYmZkX2FyY2hfdzY1LCAgICAgICAgLyogV0RDIDY1ODE2ICovCisgIGJmZF9hcmNoX3RpYzMwLCAgICAgIC8qIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCAqLworICBiZmRfYXJjaF90aWM4MCwgICAgICAvKiBUSSBUTVMzMjBjODAgKE1WUCkgKi8KKyAgYmZkX2FyY2hfdjg1MCwgICAgICAgLyogTkVDIFY4NTAgKi8KKyNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCisjZGVmaW5lIGJmZF9tYWNoX3Y4NTBlICAgICAgICAgJ0UnCisjZGVmaW5lIGJmZF9tYWNoX3Y4NTBlYSAgICAgICAgJ0EnCisgIGJmZF9hcmNoX2FyYywgICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLworI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCisgIGJmZF9hcmNoX20zMnIsICAgICAgIC8qIE1pdHN1YmlzaGkgTTMyUi9EICovCisjZGVmaW5lIGJmZF9tYWNoX20zMnIgICAgICAgICAgMCAgLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgYmZkX2FyY2hfbW4xMDIwMCwgICAgLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCisgIGJmZF9hcmNoX21uMTAzMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDMwMCAqLworI2RlZmluZSBiZmRfbWFjaF9tbjEwMzAwICAgICAgICAgICAgICAgMzAwCisgIGJmZF9hcmNoX2ZyMzAsCisjZGVmaW5lIGJmZF9tYWNoX2ZyMzAgICAgICAgICAgMHg0NjUyMzMzMAorICBiZmRfYXJjaF9tY29yZSwKKyAgYmZkX2FyY2hfbGFzdAorICB9OworCit0eXBlZGVmIHN0cnVjdCBiZmRfYXJjaF9pbmZvIAoreworICBpbnQgYml0c19wZXJfd29yZDsKKyAgaW50IGJpdHNfcGVyX2FkZHJlc3M7CisgIGludCBiaXRzX3Blcl9ieXRlOworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgdW5zaWduZWQgbG9uZyBtYWNoOworICBjb25zdCBjaGFyICphcmNoX25hbWU7CisgIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOworICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9hbGlnbl9wb3dlcjsKKyAgLyogdHJ1ZSBpZiB0aGlzIGlzIHRoZSBkZWZhdWx0IG1hY2hpbmUgZm9yIHRoZSBhcmNoaXRlY3R1cmUgKi8KKyAgYm9vbGVhbiB0aGVfZGVmYXVsdDsgCisgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQorICAgICAgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpiKSk7CisKKyAgYm9vbGVhbiAoKnNjYW4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICosIGNvbnN0IGNoYXIgKikpOworCisgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OworfSBiZmRfYXJjaF9pbmZvX3R5cGU7Citjb25zdCBjaGFyICoKK2JmZF9wcmludGFibGVfbmFtZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKK2JmZF9zY2FuX2FyY2ggUEFSQU1TICgoY29uc3QgY2hhciAqc3RyaW5nKSk7CisKK2NvbnN0IGNoYXIgKioKK2JmZF9hcmNoX2xpc3QgUEFSQU1TICgodm9pZCkpOworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgorYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUgUEFSQU1TICgoCisgICAgY29uc3QgYmZkICphYmZkLAorICAgIGNvbnN0IGJmZCAqYmJmZCkpOworCit2b2lkIAorYmZkX3NldF9hcmNoX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZykpOworCitlbnVtIGJmZF9hcmNoaXRlY3R1cmUgCitiZmRfZ2V0X2FyY2ggUEFSQU1TICgoYmZkICphYmZkKSk7CisKK3Vuc2lnbmVkIGxvbmcgCitiZmRfZ2V0X21hY2ggUEFSQU1TICgoYmZkICphYmZkKSk7CisKK3Vuc2lnbmVkIGludCAKK2JmZF9hcmNoX2JpdHNfcGVyX2J5dGUgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK3Vuc2lnbmVkIGludCAKK2JmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIAorYmZkX2dldF9hcmNoX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCitiZmRfbG9va3VwX2FyY2gKKyBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUKKyAgICBhcmNoLAorICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOworCitjb25zdCBjaGFyICoKK2JmZF9wcmludGFibGVfYXJjaF9tYWNoCisgUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOworCit0eXBlZGVmIGVudW0gYmZkX3JlbG9jX3N0YXR1cworeworICAgICAgICAvKiBObyBlcnJvcnMgZGV0ZWN0ZWQgKi8KKyAgYmZkX3JlbG9jX29rLAorCisgICAgICAgIC8qIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCB0aGVyZSB3YXMgYW4gb3ZlcmZsb3cuICovCisgIGJmZF9yZWxvY19vdmVyZmxvdywKKworICAgICAgICAvKiBUaGUgYWRkcmVzcyB0byByZWxvY2F0ZSB3YXMgbm90IHdpdGhpbiB0aGUgc2VjdGlvbiBzdXBwbGllZC4gKi8KKyAgYmZkX3JlbG9jX291dG9mcmFuZ2UsCisKKyAgICAgICAgLyogVXNlZCBieSBzcGVjaWFsIGZ1bmN0aW9ucyAqLworICBiZmRfcmVsb2NfY29udGludWUsCisKKyAgICAgICAgLyogVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBzaXplIHJlcXVlc3RlZC4gKi8KKyAgYmZkX3JlbG9jX25vdHN1cHBvcnRlZCwKKworICAgICAgICAvKiBVbnVzZWQgKi8KKyAgYmZkX3JlbG9jX290aGVyLAorCisgICAgICAgIC8qIFRoZSBzeW1ib2wgdG8gcmVsb2NhdGUgYWdhaW5zdCB3YXMgdW5kZWZpbmVkLiAqLworICBiZmRfcmVsb2NfdW5kZWZpbmVkLAorCisgICAgICAgIC8qIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCBtYXkgbm90IGJlIG9rIC0gcHJlc2VudGx5CisgICAgICAgICAgZ2VuZXJhdGVkIG9ubHkgd2hlbiBsaW5raW5nIGk5NjAgY29mZiBmaWxlcyB3aXRoIGk5NjAgYi5vdXQKKyAgICAgICAgICBzeW1ib2xzLiAgSWYgdGhpcyB0eXBlIGlzIHJldHVybmVkLCB0aGUgZXJyb3JfbWVzc2FnZSBhcmd1bWVudAorICAgICAgICAgIHRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gd2lsbCBiZSBzZXQuICAqLworICBiZmRfcmVsb2NfZGFuZ2Vyb3VzCisgfQorIGJmZF9yZWxvY19zdGF0dXNfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeQoreworICAgICAgICAvKiBBIHBvaW50ZXIgaW50byB0aGUgY2Fub25pY2FsIHRhYmxlIG9mIHBvaW50ZXJzICAqLworICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltX3B0cl9wdHI7CisKKyAgICAgICAgLyogb2Zmc2V0IGluIHNlY3Rpb24gKi8KKyAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOworCisgICAgICAgIC8qIGFkZGVuZCBmb3IgcmVsb2NhdGlvbiB2YWx1ZSAqLworICBiZmRfdm1hIGFkZGVuZDsKKworICAgICAgICAvKiBQb2ludGVyIHRvIGhvdyB0byBwZXJmb3JtIHRoZSByZXF1aXJlZCByZWxvY2F0aW9uICovCisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworCit9IGFyZWxlbnQ7CitlbnVtIGNvbXBsYWluX292ZXJmbG93Cit7CisgICAgICAgIC8qIERvIG5vdCBjb21wbGFpbiBvbiBvdmVyZmxvdy4gKi8KKyAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKKworICAgICAgICAvKiBDb21wbGFpbiBpZiB0aGUgYml0ZmllbGQgb3ZlcmZsb3dzLCB3aGV0aGVyIGl0IGlzIGNvbnNpZGVyZWQKKyAgICAgICAgICBhcyBzaWduZWQgb3IgdW5zaWduZWQuICovCisgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCisgICAgICAgIC8qIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIHNpZ25lZAorICAgICAgICAgIG51bWJlci4gKi8KKyAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAorCisgICAgICAgIC8qIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIGFuCisgICAgICAgICAgdW5zaWduZWQgbnVtYmVyLiAqLworICBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZAorfTsKKworc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAoreworICAgICAgICAvKiAgVGhlIHR5cGUgZmllbGQgaGFzIG1haW5seSBhIGRvY3VtZW50YXJ5IHVzZSAtIHRoZSBiYWNrIGVuZCBjYW4KKyAgICAgICAgICAgZG8gd2hhdCBpdCB3YW50cyB3aXRoIGl0LCB0aG91Z2ggbm9ybWFsbHkgdGhlIGJhY2sgZW5kJ3MKKyAgICAgICAgICAgZXh0ZXJuYWwgaWRlYSBvZiB3aGF0IGEgcmVsb2MgbnVtYmVyIGlzIHN0b3JlZAorICAgICAgICAgICBpbiB0aGlzIGZpZWxkLiBGb3IgZXhhbXBsZSwgYSBQQyByZWxhdGl2ZSB3b3JkIHJlbG9jYXRpb24KKyAgICAgICAgICAgaW4gYSBjb2ZmIGVudmlyb25tZW50IGhhcyB0aGUgdHlwZSAwMjMgLSBiZWNhdXNlIHRoYXQncworICAgICAgICAgICB3aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbGxzIGEgUl9QQ1JXT1JEIHJlbG9jLiAqLworICB1bnNpZ25lZCBpbnQgdHlwZTsKKworICAgICAgICAvKiAgVGhlIHZhbHVlIHRoZSBmaW5hbCByZWxvY2F0aW9uIGlzIHNoaWZ0ZWQgcmlnaHQgYnkuIFRoaXMgZHJvcHMKKyAgICAgICAgICAgdW53YW50ZWQgZGF0YSBmcm9tIHRoZSByZWxvY2F0aW9uLiAgKi8KKyAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQ7CisKKyAgICAgICAgLyogIFRoZSBzaXplIG9mIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgKm5vdCogYQorICAgICAgICAgICBwb3dlci1vZi10d28gbWVhc3VyZS4gIFRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkCisgICAgICAgICAgIG9uIGJ5IGEgdHlwZSBvZiByZWxvY2F0aW9uLCB1c2UgYmZkX2dldF9yZWxvY19zaXplLiAgKi8KKyAgaW50IHNpemU7CisKKyAgICAgICAgLyogIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzIHVzZWQKKyAgICAgICAgICAgd2hlbiBkb2luZyBvdmVyZmxvdyBjaGVja2luZy4gICovCisgIHVuc2lnbmVkIGludCBiaXRzaXplOworCisgICAgICAgIC8qICBOb3RlcyB0aGF0IHRoZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUKKyAgICAgICAgICAgZGF0YSBzZWN0aW9uIG9mIHRoZSBhZGRlbmQuIFRoZSByZWxvY2F0aW9uIGZ1bmN0aW9uIHdpbGwKKyAgICAgICAgICAgc3VidHJhY3QgZnJvbSB0aGUgcmVsb2NhdGlvbiB2YWx1ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KKyAgICAgICAgICAgYmVpbmcgcmVsb2NhdGVkLiAqLworICBib29sZWFuIHBjX3JlbGF0aXZlOworCisgICAgICAgIC8qICBUaGUgYml0IHBvc2l0aW9uIG9mIHRoZSByZWxvYyB2YWx1ZSBpbiB0aGUgZGVzdGluYXRpb24uCisgICAgICAgICAgIFRoZSByZWxvY2F0ZWQgdmFsdWUgaXMgbGVmdCBzaGlmdGVkIGJ5IHRoaXMgYW1vdW50LiAqLworICB1bnNpZ25lZCBpbnQgYml0cG9zOworCisgICAgICAgIC8qIFdoYXQgdHlwZSBvZiBvdmVyZmxvdyBlcnJvciBzaG91bGQgYmUgY2hlY2tlZCBmb3Igd2hlbgorICAgICAgICAgIHJlbG9jYXRpbmcuICovCisgIGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgY29tcGxhaW5fb25fb3ZlcmZsb3c7CisKKyAgICAgICAgLyogSWYgdGhpcyBmaWVsZCBpcyBub24gbnVsbCwgdGhlbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gaXMKKyAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5CisgICAgICAgICAgc3RyYW5nZSByZWxvY2F0aW9uIG1ldGhvZHMgdG8gYmUgYWNjb21vZGF0ZWQgKGUuZy4sIGk5NjAgY2FsbGoKKyAgICAgICAgICBpbnN0cnVjdGlvbnMpLiAqLworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgKCpzcGVjaWFsX2Z1bmN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKmFiZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOworCisgICAgICAgIC8qIFRoZSB0ZXh0dWFsIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24gdHlwZS4gKi8KKyAgY2hhciAqbmFtZTsKKworICAgICAgICAvKiBXaGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmssIHNvbWUgZm9ybWF0cyBtdXN0IG1vZGlmeSB0aGUKKyAgICAgICAgICByZWxvY2F0aW9ucyByYXRoZXIgdGhhbiB0aGUgZGF0YSAtIHRoaXMgZmxhZyBzaWduYWxzIHRoaXMuKi8KKyAgYm9vbGVhbiBwYXJ0aWFsX2lucGxhY2U7CisKKyAgICAgICAgLyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQorICAgICAgICAgIGFyZSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uIHN1bS4gIEUuZy4sIGlmIHRoaXMgd2FzIGFuIDggYml0CisgICAgICAgICAgYml0IG9mIGRhdGEgd2hpY2ggd2UgcmVhZCBhbmQgcmVsb2NhdGVkLCB0aGlzIHdvdWxkIGJlCisgICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcworICAgICAgICAgIHN1bjQgZXh0ZW5kZWQgcmVsb2NzLCB0aGUgdmFsdWUgaW4gdGhlIG9mZnNldCBwYXJ0IG9mIGEKKyAgICAgICAgICByZWxvY2F0aW5nIGZpZWxkIGlzIGdhcmJhZ2Ugc28gd2UgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqLworICBiZmRfdm1hIHNyY19tYXNrOworCisgICAgICAgIC8qIFRoZSBkc3RfbWFzayBzZWxlY3RzIHdoaWNoIHBhcnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgcmVwbGFjZWQKKyAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKKyAgICAgICAgICBleGNlcHQgaW4gdGhlIGFib3ZlIHNwZWNpYWwgY2FzZSwgd2hlcmUgZHN0X21hc2sgd291bGQgYmUKKyAgICAgICAgICAweDAwMDAwMGZmLCBhbmQgc3JjX21hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gICAqLworICBiZmRfdm1hIGRzdF9tYXNrOworCisgICAgICAgIC8qIFdoZW4gc29tZSBmb3JtYXRzIGNyZWF0ZSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMsIHRoZXkgbGVhdmUKKyAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBjIG9mIHRoZSBwbGFjZSBiZWluZyByZWxvY2F0ZWQgaW4gdGhlIG9mZnNldAorICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KKyAgICAgICAgICBiZSBtYWRlIGp1c3QgYnkgYWRkaW5nIGluIGFuIG9yZGluYXJ5IG9mZnNldCAoZS5nLiwgc3VuMyBhLm91dCkuCisgICAgICAgICAgU29tZSBmb3JtYXRzIGxlYXZlIHRoZSBkaXNwbGFjZW1lbnQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbgorICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0LiovCisgIGJvb2xlYW4gcGNyZWxfb2Zmc2V0OworCit9OworI2RlZmluZSBIT1dUTyhDLCBSLFMsQiwgUCwgQkksIE8sIFNGLCBOQU1FLCBJTlBMQUNFLCBNQVNLU1JDLCBNQVNLRFNULCBQQykgXAorICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBPLFNGLE5BTUUsSU5QTEFDRSxNQVNLU1JDLE1BU0tEU1QsUEN9CisjZGVmaW5lIE5FV0hPV1RPKCBGVU5DVElPTiwgTkFNRSxTSVpFLFJFTCxJTikgSE9XVE8oMCwwLFNJWkUsMCxSRUwsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LEZVTkNUSU9OLCBOQU1FLGZhbHNlLDAsMCxJTikKKworI2RlZmluZSBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbCkgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpIHsgICAgICAgICAgICAgXAorICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpIHsgXAorICAgICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQordW5zaWduZWQgaW50IAorYmZkX2dldF9yZWxvY19zaXplICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVsZW50X2NoYWluIHsKKyAgYXJlbGVudCByZWxlbnQ7CisgIHN0cnVjdCAgIHJlbGVudF9jaGFpbiAqbmV4dDsKK30gYXJlbGVudF9jaGFpbjsKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorCitiZmRfY2hlY2tfb3ZlcmZsb3cKKyBQQVJBTVMgKChlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdywKKyAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZSwKKyAgICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCwKKyAgICB1bnNpZ25lZCBpbnQgYWRkcnNpemUsCisgICAgYmZkX3ZtYSByZWxvY2F0aW9uKSk7CisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorCitiZmRfcGVyZm9ybV9yZWxvY2F0aW9uCisgUEFSQU1TICgoYmZkICphYmZkLAorICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAorICAgIFBUUiBkYXRhLAorICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorICAgIGJmZCAqb3V0cHV0X2JmZCwKKyAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOworCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKKworYmZkX2luc3RhbGxfcmVsb2NhdGlvbgorIFBBUkFNUyAoKGJmZCAqYWJmZCwKKyAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKKyAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAorICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7CisKK2VudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCB7CisgIF9kdW1teV9maXJzdF9iZmRfcmVsb2NfY29kZV9yZWFsLAorCisKKy8qIEJhc2ljIGFic29sdXRlIHJlbG9jYXRpb25zIG9mIE4gYml0cy4gKi8KKyAgQkZEX1JFTE9DXzY0LAorICBCRkRfUkVMT0NfMzIsCisgIEJGRF9SRUxPQ18yNiwKKyAgQkZEX1JFTE9DXzI0LAorICBCRkRfUkVMT0NfMTYsCisgIEJGRF9SRUxPQ18xNCwKKyAgQkZEX1JFTE9DXzgsCisKKy8qIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zLiAgU29tZXRpbWVzIHRoZXNlIGFyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcworb2YgdGhlIHJlbG9jYXRpb24gaXRzZWxmOyBzb21ldGltZXMgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCit0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSByZWxvY2F0aW9uLiAgSXQgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgdGFyZ2V0LgorCitUaGUgMjQtYml0IHJlbG9jYXRpb24gaXMgdXNlZCBpbiBzb21lIEludGVsIDk2MCBjb25maWd1cmF0aW9ucy4gKi8KKyAgQkZEX1JFTE9DXzY0X1BDUkVMLAorICBCRkRfUkVMT0NfMzJfUENSRUwsCisgIEJGRF9SRUxPQ18yNF9QQ1JFTCwKKyAgQkZEX1JFTE9DXzE2X1BDUkVMLAorICBCRkRfUkVMT0NfMTJfUENSRUwsCisgIEJGRF9SRUxPQ184X1BDUkVMLAorCisvKiBGb3IgRUxGLiAqLworICBCRkRfUkVMT0NfMzJfR09UX1BDUkVMLAorICBCRkRfUkVMT0NfMTZfR09UX1BDUkVMLAorICBCRkRfUkVMT0NfOF9HT1RfUENSRUwsCisgIEJGRF9SRUxPQ18zMl9HT1RPRkYsCisgIEJGRF9SRUxPQ18xNl9HT1RPRkYsCisgIEJGRF9SRUxPQ19MTzE2X0dPVE9GRiwKKyAgQkZEX1JFTE9DX0hJMTZfR09UT0ZGLAorICBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiwKKyAgQkZEX1JFTE9DXzhfR09UT0ZGLAorICBCRkRfUkVMT0NfMzJfUExUX1BDUkVMLAorICBCRkRfUkVMT0NfMjRfUExUX1BDUkVMLAorICBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLAorICBCRkRfUkVMT0NfOF9QTFRfUENSRUwsCisgIEJGRF9SRUxPQ18zMl9QTFRPRkYsCisgIEJGRF9SRUxPQ18xNl9QTFRPRkYsCisgIEJGRF9SRUxPQ19MTzE2X1BMVE9GRiwKKyAgQkZEX1JFTE9DX0hJMTZfUExUT0ZGLAorICBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiwKKyAgQkZEX1JFTE9DXzhfUExUT0ZGLAorCisvKiBSZWxvY2F0aW9ucyB1c2VkIGJ5IDY4SyBFTEYuICovCisgIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsCisgIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QsCisgIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUsCisKKy8qIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuICovCisgIEJGRF9SRUxPQ18zMl9CQVNFUkVMLAorICBCRkRfUkVMT0NfMTZfQkFTRVJFTCwKKyAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCwKKyAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCwKKyAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMLAorICBCRkRfUkVMT0NfOF9CQVNFUkVMLAorICBCRkRfUkVMT0NfUlZBLAorCisvKiBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uICovCisgIEJGRF9SRUxPQ184X0ZGbm4sCisKKy8qIFRoZXNlIFBDLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgYXMgd29yZCBkaXNwbGFjZW1lbnRzIC0tCitpLmUuLCBieXRlIGRpc3BsYWNlbWVudHMgc2hpZnRlZCByaWdodCB0d28gYml0cy4gIFRoZSAzMC1iaXQgd29yZAorZGlzcGxhY2VtZW50ICg8PDMyX1BDUkVMX1MyPj4gLS0gMzIgYml0cywgc2hpZnRlZCAyKSBpcyB1c2VkIG9uIHRoZQorU1BBUkMuICAoU1BBUkMgdG9vbHMgZ2VuZXJhbGx5IHJlZmVyIHRvIHRoaXMgYXMgPDxXRElTUDMwPj4uKSAgVGhlCitzaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBNSVBTLCBhbmQgdGhlIDIzLWJpdAorZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIEFscGhhLiAqLworICBCRkRfUkVMT0NfMzJfUENSRUxfUzIsCisgIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMiwKKyAgQkZEX1JFTE9DXzIzX1BDUkVMX1MyLAorCisvKiBIaWdoIDIyIGJpdHMgYW5kIGxvdyAxMCBiaXRzIG9mIDMyLWJpdCB2YWx1ZSwgcGxhY2VkIGludG8gbG93ZXIgYml0cyBvZgordGhlIHRhcmdldCB3b3JkLiAgVGhlc2UgYXJlIHVzZWQgb24gdGhlIFNQQVJDLiAqLworICBCRkRfUkVMT0NfSEkyMiwKKyAgQkZEX1JFTE9DX0xPMTAsCisKKy8qIEZvciBzeXN0ZW1zIHRoYXQgYWxsb2NhdGUgYSBHbG9iYWwgUG9pbnRlciByZWdpc3RlciwgdGhlc2UgYXJlCitkaXNwbGFjZW1lbnRzIG9mZiB0aGF0IHJlZ2lzdGVyLiAgVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUKK2hhbmRsZWQgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZSB2YWx1ZSB0aGUgcmVnaXN0ZXIgd2lsbCBoYXZlIGlzCitkZWNpZGVkIHJlbGF0aXZlbHkgbGF0ZS4gKi8KKyAgQkZEX1JFTE9DX0dQUkVMMTYsCisgIEJGRF9SRUxPQ19HUFJFTDMyLAorCisvKiBSZWxvYyB0eXBlcyB1c2VkIGZvciBpOTYwL2Iub3V0LiAqLworICBCRkRfUkVMT0NfSTk2MF9DQUxMSiwKKworLyogU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKK3JlbG9jYXRpb24gdHlwZXMgYWxyZWFkeSBkZWZpbmVkLiAqLworICBCRkRfUkVMT0NfTk9ORSwKKyAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsCisgIEJGRF9SRUxPQ19TUEFSQzIyLAorICBCRkRfUkVMT0NfU1BBUkMxMywKKyAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLAorICBCRkRfUkVMT0NfU1BBUkNfR09UMTMsCisgIEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwKKyAgQkZEX1JFTE9DX1NQQVJDX1BDMTAsCisgIEJGRF9SRUxPQ19TUEFSQ19QQzIyLAorICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLAorICBCRkRfUkVMT0NfU1BBUkNfQ09QWSwKKyAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULAorICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsCisgIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSwKKyAgQkZEX1JFTE9DX1NQQVJDX1VBMzIsCisKKy8qIEkgdGhpbmsgdGhlc2UgYXJlIHNwZWNpZmljIHRvIFNQQVJDIGEub3V0IChlLmcuLCBTdW4gNCkuICovCisgIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMsCisgIEJGRF9SRUxPQ19TUEFSQ19CQVNFMjIsCisKKy8qIFNQQVJDNjQgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgQkZEX1JFTE9DX1NQQVJDXzY0IEJGRF9SRUxPQ182NAorICBCRkRfUkVMT0NfU1BBUkNfMTAsCisgIEJGRF9SRUxPQ19TUEFSQ18xMSwKKyAgQkZEX1JFTE9DX1NQQVJDX09MTzEwLAorICBCRkRfUkVMT0NfU1BBUkNfSEgyMiwKKyAgQkZEX1JFTE9DX1NQQVJDX0hNMTAsCisgIEJGRF9SRUxPQ19TUEFSQ19MTTIyLAorICBCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwKKyAgQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAsCisgIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLAorICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwKKyAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTksCisgIEJGRF9SRUxPQ19TUEFSQ183LAorICBCRkRfUkVMT0NfU1BBUkNfNiwKKyAgQkZEX1JFTE9DX1NQQVJDXzUsCisjZGVmaW5lIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQgQkZEX1JFTE9DXzY0X1BDUkVMCisgIEJGRF9SRUxPQ19TUEFSQ19QTFQ2NCwKKyAgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLAorICBCRkRfUkVMT0NfU1BBUkNfTE9YMTAsCisgIEJGRF9SRUxPQ19TUEFSQ19INDQsCisgIEJGRF9SRUxPQ19TUEFSQ19NNDQsCisgIEJGRF9SRUxPQ19TUEFSQ19MNDQsCisgIEJGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiwKKworLyogU1BBUkMgbGl0dGxlIGVuZGlhbiByZWxvY2F0aW9uICovCisgIEJGRF9SRUxPQ19TUEFSQ19SRVYzMiwKKworLyogQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgorImFkZGVuZCIgaW4gc29tZSBzcGVjaWFsIHdheS4KK0ZvciBHUERJU1BfSEkxNiAoImdwZGlzcCIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGlnbm9yZWQgd2hlbgord3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQorYWRkZW5kIGlzIHRoZSBkaXNwbGFjZW1lbnQgaW4gYnl0ZXMgb2YgdGhlICJsZGEiIGluc3RydWN0aW9uIGZyb20KK3RoZSAibGRhaCIgaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIGF0IHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MpLiAqLworICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYsCisKKy8qIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKK3dpdGggR1BESVNQX0hJMTYgcmVsb2NzLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZyB0aGUKK3JlbG9jYXRpb25zIG91dCwgYW5kIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBmaWxlJ3MgR1AgdmFsdWUgb24KK3JlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4gKi8KKyAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2LAorCisvKiBUaGUgRUxGIEdQRElTUCByZWxvY2F0aW9uIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIEdQRElTUF9ISTE2CityZWxvY2F0aW9uIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGFjY29tcGFueWluZyBHUERJU1BfTE8xNgorcmVsb2NhdGlvbi4gKi8KKyAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUCwKKworLyogVGhlIEFscGhhIExJVEVSQUwvTElUVVNFIHJlbG9jcyBhcmUgcHJvZHVjZWQgYnkgYSBzeW1ib2wgcmVmZXJlbmNlOwordGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKK3RoZSBzeW1ib2wsIGFuZCB0aGVuIGZpbGxzIGluIGEgcmVnaXN0ZXIgaW4gdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uCisKK1RoZSBMSVRFUkFMIHJlbG9jLCBhdCB0aGUgTERRIGluc3RydWN0aW9uLCByZWZlcnMgdG8gdGhlIC5saXRhCitzZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKK2luIHdpdGggdGhlIGZpbGUncyBHUCB2YWx1ZSBvbiByZWFkaW5nLCBmb3IgY29udmVuaWVuY2UsIGFzIHdpdGggdGhlCitHUERJU1BfTE8xNiByZWxvYy4KKworVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCitJdCBzaG91bGQgcmVmZXIgdG8gdGhlIHN5bWJvbCB0byBiZSByZWZlcmVuY2VkLCBhcyB3aXRoIDE2X0dPVE9GRiwKK2J1dCBpdCBnZW5lcmF0ZXMgb3V0cHV0IG5vdCBiYXNlZCBvbiB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSAuZ290CitzZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQorZmluYWwgbGluayBzdGFnZS4KKworVGhlIExJVFVTRSByZWxvYywgb24gdGhlIGluc3RydWN0aW9uIHVzaW5nIHRoZSBsb2FkZWQgYWRkcmVzcywgZ2l2ZXMKK2luZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQorYXdheSBzb21lIGxpdGVyYWwgc2VjdGlvbiByZWZlcmVuY2VzLiAgVGhlIHN5bWJvbCBpcyBpZ25vcmVkIChyZWFkCithcyB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wpLCBhbmQgdGhlICJhZGRlbmQiIGluZGljYXRlcyB0aGUgdHlwZQorb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgorMSAtICJtZW1vcnkiIGZtdCBpbnNuCisyIC0gYnl0ZS1tYW5pcHVsYXRpb24gKGJ5dGUgb2Zmc2V0IHJlZykKKzMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCisKK1RoZSBHTlUgbGlua2VyIGN1cnJlbnRseSBkb2Vzbid0IGRvIGFueSBvZiB0aGlzIG9wdGltaXppbmcuICovCisgIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMLAorICBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwsCisgIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0UsCisKKy8qIFRoZSBISU5UIHJlbG9jYXRpb24gaW5kaWNhdGVzIGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgZmlsbGVkIGludG8gdGhlCisiaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KK3ByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4gKi8KKyAgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCisKKy8qIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCit3aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KKyAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UsCisKKy8qIFRoZSBDT0RFQUREUiByZWxvY2F0aW9uIG91dHB1dHMgYSBTVE9fQ0EgaW4gdGhlIG9iamVjdCBmaWxlLAord2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuICovCisgIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUiwKKworLyogQml0cyAyNy4uMiBvZiB0aGUgcmVsb2NhdGlvbiBhZGRyZXNzIHNoaWZ0ZWQgcmlnaHQgMiBiaXRzOworc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4gKi8KKyAgQkZEX1JFTE9DX01JUFNfSk1QLAorCisvKiBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uICovCisgIEJGRF9SRUxPQ19NSVBTMTZfSk1QLAorCisvKiBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuICovCisgIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwsCisKKy8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4gKi8KKyAgQkZEX1JFTE9DX0hJMTYsCisKKy8qIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KK2V4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2CitiaXRzIGZvcm0gYSBuZWdhdGl2ZSBudW1iZXIsIHdlIG5lZWQgdG8gYWRkIG9uZSB0byB0aGUgaGlnaCB2YWx1ZQordG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuICovCisgIEJGRF9SRUxPQ19ISTE2X1MsCisKKy8qIExvdyAxNiBiaXRzLiAqLworICBCRkRfUkVMT0NfTE8xNiwKKworLyogTGlrZSBCRkRfUkVMT0NfSEkxNl9TLCBidXQgUEMgcmVsYXRpdmUuICovCisgIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MsCisKKy8qIExpa2UgQkZEX1JFTE9DX0xPMTYsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KKyAgQkZEX1JFTE9DX1BDUkVMX0xPMTYsCisKKy8qIFJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGdsb2JhbCBwb2ludGVyLiAqLworI2RlZmluZSBCRkRfUkVMT0NfTUlQU19HUFJFTCBCRkRfUkVMT0NfR1BSRUwxNgorCisvKiBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4gKi8KKyAgQkZEX1JFTE9DX01JUFNfTElURVJBTCwKKworLyogTUlQUyBFTEYgcmVsb2NhdGlvbnMuICovCisgIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAorICBCRkRfUkVMT0NfTUlQU19DQUxMMTYsCisjZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIgQkZEX1JFTE9DX0dQUkVMMzIKKyAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYsCisgIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAorICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYsCisgIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwKKworCisvKiBpMzg2L2VsZiByZWxvY2F0aW9ucyAqLworICBCRkRfUkVMT0NfMzg2X0dPVDMyLAorICBCRkRfUkVMT0NfMzg2X1BMVDMyLAorICBCRkRfUkVMT0NfMzg2X0NPUFksCisgIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQsCisgIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9ULAorICBCRkRfUkVMT0NfMzg2X1JFTEFUSVZFLAorICBCRkRfUkVMT0NfMzg2X0dPVE9GRiwKKyAgQkZEX1JFTE9DXzM4Nl9HT1RQQywKKworLyogbnMzMmsgcmVsb2NhdGlvbnMgKi8KKyAgQkZEX1JFTE9DX05TMzJLX0lNTV84LAorICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2LAorICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyLAorICBCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwsCisgIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsCisgIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsCisgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzgsCisgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LAorICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwKKyAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCwKKyAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsCisgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMLAorCisvKiBQb3dlcihyczYwMDApIGFuZCBQb3dlclBDIHJlbG9jYXRpb25zLiAqLworICBCRkRfUkVMT0NfUFBDX0IyNiwKKyAgQkZEX1JFTE9DX1BQQ19CQTI2LAorICBCRkRfUkVMT0NfUFBDX1RPQzE2LAorICBCRkRfUkVMT0NfUFBDX0IxNiwKKyAgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTiwKKyAgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4sCisgIEJGRF9SRUxPQ19QUENfQkExNiwKKyAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4sCisgIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiwKKyAgQkZEX1JFTE9DX1BQQ19DT1BZLAorICBCRkRfUkVMT0NfUFBDX0dMT0JfREFULAorICBCRkRfUkVMT0NfUFBDX0pNUF9TTE9ULAorICBCRkRfUkVMT0NfUFBDX1JFTEFUSVZFLAorICBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQywKKyAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTywKKyAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQSwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2LAorICBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2LAorICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMLAorICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMSwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGLAorICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8sCisgIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJLAorICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQSwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRCwKKyAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBLAorCisvKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIHRvIGJ1aWxkIGEgY29udHJ1Y3RvciB0YWJsZSAtIGF0IHRoZSBtb21lbnQKK3Byb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KK0l0IGdlbmVyYWxseSBkb2VzIG1hcCB0byBvbmUgb2YgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuICovCisgIEJGRF9SRUxPQ19DVE9SLAorCisvKiBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKK25vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAqLworICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwKKworLyogVGhlc2UgcmVsb2NzIGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZSBBUk0gYXNzZW1ibGVyLiAgVGhleSBhcmUgbm90CisoYXQgcHJlc2VudCkgd3JpdHRlbiB0byBhbnkgb2JqZWN0IGZpbGVzLiAqLworICBCRkRfUkVMT0NfQVJNX0lNTUVESUFURSwKKyAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLAorICBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSwKKyAgQkZEX1JFTE9DX0FSTV9TV0ksCisgIEJGRF9SRUxPQ19BUk1fTVVMVEksCisgIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSwKKyAgQkZEX1JFTE9DX0FSTV9BRFJfSU1NLAorICBCRkRfUkVMT0NfQVJNX0xEUl9JTU0sCisgIEJGRF9SRUxPQ19BUk1fTElURVJBTCwKKyAgQkZEX1JFTE9DX0FSTV9JTl9QT09MLAorICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04LAorICBCRkRfUkVMT0NfQVJNX0hXTElURVJBTCwKKyAgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQsCisgIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NLAorICBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZULAorICBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwKKyAgQkZEX1JFTE9DX0FSTV9HT1QxMiwKKyAgQkZEX1JFTE9DX0FSTV9HT1QzMiwKKyAgQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsCisgIEJGRF9SRUxPQ19BUk1fQ09QWSwKKyAgQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCwKKyAgQkZEX1JFTE9DX0FSTV9QTFQzMiwKKyAgQkZEX1JFTE9DX0FSTV9SRUxBVElWRSwKKyAgQkZEX1JFTE9DX0FSTV9HT1RPRkYsCisgIEJGRF9SRUxPQ19BUk1fR09UUEMsCisKKy8qIEhpdGFjaGkgU0ggcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLworICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwKKyAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLAorICBCRkRfUkVMT0NfU0hfSU1NNCwKKyAgQkZEX1JFTE9DX1NIX0lNTTRCWTIsCisgIEJGRF9SRUxPQ19TSF9JTU00Qlk0LAorICBCRkRfUkVMT0NfU0hfSU1NOCwKKyAgQkZEX1JFTE9DX1NIX0lNTThCWTIsCisgIEJGRF9SRUxPQ19TSF9JTU04Qlk0LAorICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLAorICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LAorICBCRkRfUkVMT0NfU0hfU1dJVENIMTYsCisgIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMiwKKyAgQkZEX1JFTE9DX1NIX1VTRVMsCisgIEJGRF9SRUxPQ19TSF9DT1VOVCwKKyAgQkZEX1JFTE9DX1NIX0FMSUdOLAorICBCRkRfUkVMT0NfU0hfQ09ERSwKKyAgQkZEX1JFTE9DX1NIX0RBVEEsCisgIEJGRF9SRUxPQ19TSF9MQUJFTCwKKworLyogVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAorYmUgemVybyBhbmQgaXMgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCisgIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LAorICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsCisgIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywKKworLyogQXJnb25hdXQgUklTQyBDb3JlIChBUkMpIHJlbG9jcy4KK0FSQyAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQorbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgordGhyb3VnaCA3IG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KKyAgQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwsCisKKy8qIEFSQyAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZSBub3QKK3N0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwordGhyb3VnaCAwLiAqLworICBCRkRfUkVMT0NfQVJDX0IyNiwKKworLyogTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KK1RoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCithc3N1bWVkIHRvIGJlIDAuICovCisgIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsCisKKy8qIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCitUaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cworYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKK2V4Y2VwdCBpdCBpcyBpbiB0aGUgbGVmdCBjb250YWluZXIsIGkuZS4sCitzaGlmdGVkIGxlZnQgMTUgYml0cy4gKi8KKyAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwKKworLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCithc3N1bWVkIHRvIGJlIDAuICovCisgIEJGRF9SRUxPQ19EMTBWXzE4LAorCisvKiBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKK2Fzc3VtZWQgdG8gYmUgMC4gKi8KKyAgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwsCisKKy8qIE1pdHN1YmlzaGkgRDMwViByZWxvY3MuCitUaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuICovCisgIEJGRF9SRUxPQ19EMzBWXzYsCisKKy8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAordGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCisgIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsCisKKy8qIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAordGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKK2FzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKK29mIHRoZSBjb250YWluZXIuICovCisgIEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiwKKworLyogVGhpcyBpcyBhIDEyLWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIHRoZSAKK3JpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gKi8KKyAgQkZEX1JFTE9DX0QzMFZfMTUsCisKKy8qIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKK3RoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLworICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCwKKworLyogVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAordGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKK2FzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKK29mIHRoZSBjb250YWluZXIuICovCisgIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IsCisKKy8qIFRoaXMgaXMgYW4gMTgtYml0IGFic29sdXRlIHJlbG9jIHdpdGggCit0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KKyAgQkZEX1JFTE9DX0QzMFZfMjEsCisKKy8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCit0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KKyAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUwsCisKKy8qIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCit0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQorYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQorb2YgdGhlIGNvbnRhaW5lci4gKi8KKyAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwKKworLyogVGhpcyBpcyBhIDMyLWJpdCBhYnNvbHV0ZSByZWxvYy4gKi8KKyAgQkZEX1JFTE9DX0QzMFZfMzIsCisKKy8qIFRoaXMgaXMgYSAzMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2MuICovCisgIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMLAorCisvKiBNaXRzdWJpc2hpIE0zMlIgcmVsb2NzLgorVGhpcyBpcyBhIDI0IGJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAqLworICBCRkRfUkVMT0NfTTMyUl8yNCwKKworLyogVGhpcyBpcyBhIDEwLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLworICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTCwKKworLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KKyAgQkZEX1JFTE9DX00zMlJfMThfUENSRUwsCisKKy8qIFRoaXMgaXMgYSAyNi1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KKyAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsCisKKy8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKK3VzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4gKi8KKyAgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCisKKy8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKK3VzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyBzaWduZWQuICovCisgIEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPLAorCisvKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGxvd2VyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gKi8KKyAgQkZEX1JFTE9DX00zMlJfTE8xNiwKKworLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBzbWFsbCBkYXRhIGFyZWEgb2Zmc2V0IGZvciB1c2UgaW4KK2FkZDMsIGxvYWQsIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuICovCisgIEJGRF9SRUxPQ19NMzJSX1NEQTE2LAorCisvKiBUaGlzIGlzIGEgOS1iaXQgcmVsb2MgKi8KKyAgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCwKKworLyogVGhpcyBpcyBhIDIyLWJpdCByZWxvYyAqLworICBCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCwKKworLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQsCisKKy8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCitzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gKi8KKyAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwKKworLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gKi8KKyAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwKKworLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKK3plcm8gZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQsCisKKy8qIFRoaXMgaXMgYW4gOCBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDYgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKK3RpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VULAorCisvKiBUaGlzIGlzIGFuIDhiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDcgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQorZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLworICBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgNSBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDQgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQorZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICovCisgIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKK2JpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCisgIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsCisKKy8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCitiaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLiAqLworICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLiAqLworICBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VULAorCisvKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gKi8KKyAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULAorCisKKy8qIFRoaXMgaXMgYSAzMmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCitpbnN0cnVjdGlvbi4gKi8KKyAgQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwsCisKKy8qIFRoaXMgaXMgYSAxNmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCitpbnN0cnVjdGlvbi4gKi8KKyAgQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwsCisKKy8qIFRoaXMgaXMgYSA4Yml0IERQIHJlbG9jIGZvciB0aGUgdG1zMzIwYzMwLCB3aGVyZSB0aGUgbW9zdAorc2lnbmlmaWNhbnQgOCBiaXRzIG9mIGEgMjQgYml0IHdvcmQgYXJlIHBsYWNlZCBpbnRvIHRoZSBsZWFzdAorc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBvcGNvZGUuICovCisgIEJGRF9SRUxPQ19USUMzMF9MRFAsCisKKy8qIFRoaXMgaXMgYSA0OCBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIDMyIGJpdHMuICovCisgIEJGRF9SRUxPQ19GUjMwXzQ4LAorCisvKiBUaGlzIGlzIGEgMzIgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAyMCBiaXRzIHNwbGl0IHVwIGludG8KK3R3byBzZWN0aW9ucy4gKi8KKyAgQkZEX1JFTE9DX0ZSMzBfMjAsCisKKy8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgNiBiaXQgd29yZCBvZmZzZXQgaW4KKzQgYml0cy4gKi8KKyAgQkZEX1JFTE9DX0ZSMzBfNl9JTl80LAorCisvKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhbiA4IGJpdCBieXRlIG9mZnNldAoraW50byA4IGJpdHMuICovCisgIEJGRF9SRUxPQ19GUjMwXzhfSU5fOCwKKworLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBzaG9ydCBvZmZzZXQKK2ludG8gOCBiaXRzLiAqLworICBCRkRfUkVMT0NfRlIzMF85X0lOXzgsCisKKy8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTAgYml0IHdvcmQgb2Zmc2V0CitpbnRvIDggYml0cy4gKi8KKyAgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOCwKKworLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA5IGJpdCBwYyByZWxhdGl2ZQorc2hvcnQgb2Zmc2V0IGludG8gOCBiaXRzLiAqLworICBCRkRfUkVMT0NfRlIzMF85X1BDUkVMLAorCisvKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEyIGJpdCBwYyByZWxhdGl2ZQorc2hvcnQgb2Zmc2V0IGludG8gMTEgYml0cy4gKi8KKyAgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwsCisKKy8qIE1vdG9yb2xhIE1jb3JlIHJlbG9jYXRpb25zLiAqLworICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCwKKyAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyLAorICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMiwKKyAgQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyLAorICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLAorCisvKiBUaGVzZSB0d28gcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGxpbmtlciB0byBkZXRlcm1pbmUgd2hpY2ggb2YgCit0aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgordGhlIC0tZ2Mtc2VjdGlvbnMgb3B0aW9uIGlzIGdpdmVuLCB0aGUgbGlua2VyIHdpbGwgemVybyBvdXQgdGhlIGVudHJpZXMKK3RoYXQgYXJlIG5vdCB1c2VkLCBzbyB0aGF0IHRoZSBjb2RlIGZvciB0aG9zZSBmdW5jdGlvbnMgbmVlZCBub3QgYmUKK2luY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisKK1ZUQUJMRV9JTkhFUklUIGlzIGEgemVyby1zcGFjZSByZWxvY2F0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdG8gdGhlCitsaW5rZXIgdGhlIGluaGVyaXRlbmNlIHRyZWUgb2YgYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gIFRoZQorcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCityZWxvY2F0aW9uIHNob3VsZCBiZSBsb2NhdGVkIGF0IHRoZSBjaGlsZCB2dGFibGUuCisKK1ZUQUJMRV9FTlRSWSBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgdXNlIG9mIGEKK3ZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQordGFibGUgb2YgdGhlIGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgY29kZS4gIE9mZiBvZiB0aGF0IGJhc2UsIGFuIG9mZnNldAorZGVzY3JpYmVzIHRoZSBlbnRyeSB0aGF0IGlzIGJlaW5nIHVzZWQuICBGb3IgUmVsYSBob3N0cywgdGhpcyBvZmZzZXQgCitpcyBzdG9yZWQgaW4gdGhlIHJlbG9jJ3MgYWRkZW5kLiAgRm9yIFJlbCBob3N0cywgd2UgYXJlIGZvcmNlZCB0byBwdXQKK3RoaXMgb2Zmc2V0IGluIHRoZSByZWxvYydzIHNlY3Rpb24gb2Zmc2V0LiAqLworICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsCisgIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksCisgIEJGRF9SRUxPQ19VTlVTRUQgfTsKK3R5cGVkZWYgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZTsKK3JlbG9jX2hvd3RvX3R5cGUgKgorCitiZmRfcmVsb2NfdHlwZV9sb29rdXAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKKworY29uc3QgY2hhciAqCitiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAgUEFSQU1TICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKKworCit0eXBlZGVmIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkKK3sKKyAgICAgICAgLyogQSBwb2ludGVyIHRvIHRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc3ltYm9sLiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCisgICAgICAgICAgaW5mb3JtYXRpb24gKGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gd3JpdGVyKSBpcyBjYXJyaWVkCisgICAgICAgICAgd2l0aCB0aGUgc3ltYm9sLgorCisgICAgICAgICAgVGhpcyBmaWVsZCBpcyAqYWxtb3N0KiByZWR1bmRhbnQsIHNpbmNlIHlvdSBjYW4gdXNlIHNlY3Rpb24tPm93bmVyCisgICAgICAgICAgaW5zdGVhZCwgZXhjZXB0IHRoYXQgc29tZSBzeW1ib2xzIHBvaW50IHRvIHRoZSBnbG9iYWwgc2VjdGlvbnMKKyAgICAgICAgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKKyAgICAgICAgICB0aGVzZSBnbG9iYWxzIGJlIHBlci1iZmQgKG9yIHBlci10YXJnZXQtZmxhdm9yKS4gIEZJWE1FLiAqLworCisgIHN0cnVjdCBfYmZkICp0aGVfYmZkOyAgLyogVXNlIGJmZF9hc3ltYm9sX2JmZChzeW0pIHRvIGFjY2VzcyB0aGlzIGZpZWxkLiAqLworCisgICAgICAgIC8qIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKKyAgICAgICAgICBhcHBsaWNhdGlvbiBtYXkgbm90IGFsdGVyIGl0LiAqLworICBDT05TVCBjaGFyICpuYW1lOworCisgICAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQorICAgICAgICAgIG51bWVyaWMgdmFsdWUgd2l0aCBhIHBvaW50ZXIsIHNpbmNlIHNvbWUgZmxhZ3MgaW5kaWNhdGUgdGhhdAorICAgICAgICAgIGEgcG9pbnRlciB0byBhbm90aGVyIHN5bWJvbCBpcyBzdG9yZWQgaGVyZS4gICovCisgIHN5bXZhbHVlIHZhbHVlOworCisgICAgICAgIC8qIEF0dHJpYnV0ZXMgb2YgYSBzeW1ib2w6ICovCisKKyNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKKworICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBsb2NhbCBzY29wZTsgPDxzdGF0aWM+PiBpbiA8PEM+Pi4gVGhlIHZhbHVlCisgICAgICAgICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLworI2RlZmluZSBCU0ZfTE9DQUwgICAgICAweDAxCisKKyAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKKyAgICAgICAgICB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCisjZGVmaW5lIEJTRl9HTE9CQUwgICAgIDB4MDIKKworICAgICAgICAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGUgYW5kIGlzIGV4cG9ydGVkLiBUaGUgdmFsdWUgaXMKKyAgICAgICAgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICovCisjZGVmaW5lIEJTRl9FWFBPUlQgICAgIEJTRl9HTE9CQUwgIC8qIG5vIHJlYWwgZGlmZmVyZW5jZSAqLworCisgICAgICAgIC8qIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKKyAgICAgICAgICA8PEJTRl9MT0NBTD4+LCA8PEJTRl9GT1JUX0NPTU0+PiwgIDw8QlNGX1VOREVGSU5FRD4+IG9yCisgICAgICAgICAgPDxCU0ZfR0xPQkFMPj4gKi8KKworICAgICAgICAvKiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQorICAgICAgICAgIG1lYW5pbmcuICovCisjZGVmaW5lIEJTRl9ERUJVR0dJTkcgIDB4MDgKKworICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gIFVzZWQgaW4gRUxGLAorICAgICAgICAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqLworI2RlZmluZSBCU0ZfRlVOQ1RJT04gICAgMHgxMAorCisgICAgICAgIC8qIFVzZWQgYnkgdGhlIGxpbmtlci4gKi8KKyNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKKyNkZWZpbmUgQlNGX0tFRVBfRyAgICAgIDB4NDAKKworICAgICAgICAvKiBBIHdlYWsgZ2xvYmFsIHN5bWJvbCwgb3ZlcnJpZGFibGUgd2l0aG91dCB3YXJuaW5ncyBieQorICAgICAgICAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqLworI2RlZmluZSBCU0ZfV0VBSyAgICAgICAgMHg4MAorCisgICAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIHRvIHBvaW50IHRvIGEgc2VjdGlvbiwgZS5nLiBFTEYncworICAgICAgICAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqLworI2RlZmluZSBCU0ZfU0VDVElPTl9TWU0gMHgxMDAKKworICAgICAgICAvKiBUaGUgc3ltYm9sIHVzZWQgdG8gYmUgYSBjb21tb24gc3ltYm9sLCBidXQgbm93IGl0IGlzCisgICAgICAgICAgYWxsb2NhdGVkLiAqLworI2RlZmluZSBCU0ZfT0xEX0NPTU1PTiAgMHgyMDAKKworICAgICAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgY29tbW9uIGRhdGEuICovCisjZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCisKKyAgICAgICAgLyogSW4gc29tZSBmaWxlcyB0aGUgdHlwZSBvZiBhIHN5bWJvbCBzb21ldGltZXMgYWx0ZXJzIGl0cworICAgICAgICAgIGxvY2F0aW9uIGluIGFuIG91dHB1dCBmaWxlIC0gaWUgaW4gY29mZiBhIDw8SVNGQ04+PiBzeW1ib2wKKyAgICAgICAgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKKyAgICAgICAgICBkZWNsYXJlZCBhbmQgbm90IGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgVGhpcyBiaXQgaXMgc2V0CisgICAgICAgICAgYnkgdGhlIHRhcmdldCBCRkQgcGFydCB0byBjb252ZXkgdGhpcyBpbmZvcm1hdGlvbi4gKi8KKworI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAorCisgICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgdGhlIGxhYmVsIG9mIGNvbnN0cnVjdG9yIHNlY3Rpb24uICovCisjZGVmaW5lIEJTRl9DT05TVFJVQ1RPUiAgIDB4ODAwCisKKyAgICAgICAgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQorICAgICAgICAgIHdhcm5pbmcuICBUaGUgbmFtZSBvZiB0aGUgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0OworICAgICAgICAgIGlmIGEgcmVmZXJlbmNlIGlzIG1hZGUgdG8gYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0CisgICAgICAgICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICovCisjZGVmaW5lIEJTRl9XQVJOSU5HICAgICAgIDB4MTAwMAorCisgICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgaW5kaXJlY3QuICBUaGlzIHN5bWJvbCBpcyBhbiBpbmRpcmVjdAorICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqLworI2RlZmluZSBCU0ZfSU5ESVJFQ1QgICAgICAweDIwMDAKKworICAgICAgICAvKiBCU0ZfRklMRSBtYXJrcyBzeW1ib2xzIHRoYXQgY29udGFpbiBhIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZAorICAgICAgICAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICovCisjZGVmaW5lIEJTRl9GSUxFICAgICAgICAgIDB4NDAwMAorCisgICAgICAgIC8qIFN5bWJvbCBpcyBmcm9tIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIEJTRl9EWU5BTUlDICAgICAgIDB4ODAwMAorCisgICAgICAgIC8qIFRoZSBzeW1ib2wgZGVub3RlcyBhIGRhdGEgb2JqZWN0LiAgVXNlZCBpbiBFTEYsIGFuZCBwZXJoYXBzCisgICAgICAgICAgb3RoZXJzIHNvbWVkYXkuICAqLworI2RlZmluZSBCU0ZfT0JKRUNUICAgICAgICAweDEwMDAwCisKKyAgZmxhZ3dvcmQgZmxhZ3M7CisKKyAgICAgICAgLyogQSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoaXMgc3ltYm9sIGlzCisgICAgICAgICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAorICAgICAgICAgIHNlY3Rpb25zIGZvciB1bmRlZmluZWQgYW5kIGFic29sdXRlIHN5bWJvbHMuICAqLworICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOworCisgICAgICAgIC8qIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICovCisgIHVuaW9uCisgICAgeworICAgICAgUFRSIHA7CisgICAgICBiZmRfdm1hIGk7CisgICAgfSB1ZGF0YTsKKworfSBhc3ltYm9sOworI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCisgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKK2Jvb2xlYW4gCitiZmRfaXNfbG9jYWxfbGFiZWwgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW0pKTsKKworYm9vbGVhbiAKK2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqbmFtZSkpOworCisjZGVmaW5lIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lKGFiZmQsIG5hbWUpIFwKKyAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSwgKGFiZmQsIG5hbWUpKQorI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYihhYmZkLCBsb2NhdGlvbikgXAorICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKKyAgICAgICAgICAgICAgICAgIChhYmZkLCBsb2NhdGlvbikpCitib29sZWFuIAorYmZkX3NldF9zeW10YWIgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uLCB1bnNpZ25lZCBpbnQgY291bnQpKTsKKwordm9pZCAKK2JmZF9wcmludF9zeW1ib2xfdmFuZGYgUEFSQU1TICgoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCkpOworCisjZGVmaW5lIGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKSBcCisgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZW1wdHlfc3ltYm9sLCAoYWJmZCkpCisjZGVmaW5lIGJmZF9tYWtlX2RlYnVnX3N5bWJvbChhYmZkLHB0cixzaXplKSBcCisgICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKK2ludCAKK2JmZF9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sKSk7CisKK3ZvaWQgCitiZmRfc3ltYm9sX2luZm8gUEFSQU1TICgoYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7CisKK2Jvb2xlYW4gCitiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYXN5bWJvbCAqaXN5bSwgYmZkICpvYmZkLCBhc3ltYm9sICpvc3ltKSk7CisKKyNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCisgICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwgXAorICAgICAgICAgICAgICAgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpKQorc3RydWN0IF9iZmQgCit7CisgICAgIC8qIFRoZSBmaWxlbmFtZSB0aGUgYXBwbGljYXRpb24gb3BlbmVkIHRoZSBCRkQgd2l0aC4gICovCisgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgICAgIAorCisgICAgIC8qIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGp1bXAgdGFibGUuICAgICAgICAgICAgICovCisgICAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7CisKKyAgICAgLyogVG8gYXZvaWQgZHJhZ2dpbmcgdG9vIG1hbnkgaGVhZGVyIGZpbGVzIGludG8gZXZlcnkgZmlsZSB0aGF0CisgICAgICAgaW5jbHVkZXMgYDw8YmZkLmg+PicsIElPU1RSRUFNIGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgImNoYXIKKyAgICAgICAqIiwgYW5kIE1USU1FIGFzIGEgImxvbmciLiAgVGhlaXIgY29ycmVjdCB0eXBlcywgdG8gd2hpY2ggdGhleQorICAgICAgIGFyZSBjYXN0IHdoZW4gdXNlZCwgYXJlICJGSUxFICoiIGFuZCAidGltZV90Ii4gICAgVGhlIGlvc3RyZWFtCisgICAgICAgaXMgdGhlIHJlc3VsdCBvZiBhbiBmb3BlbiBvbiB0aGUgZmlsZW5hbWUuICBIb3dldmVyLCBpZiB0aGUKKyAgICAgICBCRkRfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGVuIGlvc3RyZWFtIGlzIGFjdHVhbGx5IGEgcG9pbnRlcgorICAgICAgIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLworICAgIFBUUiBpb3N0cmVhbTsKKworICAgICAvKiBJcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIGNhY2hlZD8gIFRoYXQgaXMsIGNhbiBpdCBiZSBjbG9zZWQgYXMKKyAgICAgICBuZWVkZWQsIGFuZCByZS1vcGVuZWQgd2hlbiBhY2Nlc3NlZCBsYXRlcj8gICovCisKKyAgICBib29sZWFuIGNhY2hlYWJsZTsKKworICAgICAvKiBNYXJrcyB3aGV0aGVyIHRoZXJlIHdhcyBhIGRlZmF1bHQgdGFyZ2V0IHNwZWNpZmllZCB3aGVuIHRoZQorICAgICAgIEJGRCB3YXMgb3BlbmVkLiBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1hdGNoaW5nIGFsZ29yaXRobQorICAgICAgIHRvIHVzZSB0byBjaG9vc2UgdGhlIGJhY2sgZW5kLiAqLworCisgICAgYm9vbGVhbiB0YXJnZXRfZGVmYXVsdGVkOworCisgICAgIC8qIFRoZSBjYWNoaW5nIHJvdXRpbmVzIHVzZSB0aGVzZSB0byBtYWludGFpbiBhCisgICAgICAgbGVhc3QtcmVjZW50bHktdXNlZCBsaXN0IG9mIEJGRHMgKi8KKworICAgIHN0cnVjdCBfYmZkICpscnVfcHJldiwgKmxydV9uZXh0OworCisgICAgIC8qIFdoZW4gYSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgY2FjaGluZyByb3V0aW5lcywgQkZEIHJldGFpbnMKKyAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmlsZSBoZXJlOiAqLworCisgICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKKworICAgICAvKiBhbmQgaGVyZTogKGBgb25jZScnIG1lYW5zIGF0IGxlYXN0IG9uY2UpICovCisKKyAgICBib29sZWFuIG9wZW5lZF9vbmNlOworCisgICAgIC8qIFNldCBpZiB3ZSBoYXZlIGEgbG9jYWxseSBtYWludGFpbmVkIG10aW1lIHZhbHVlLCByYXRoZXIgdGhhbgorICAgICAgIGdldHRpbmcgaXQgZnJvbSB0aGUgZmlsZSBlYWNoIHRpbWU6ICovCisKKyAgICBib29sZWFuIG10aW1lX3NldDsKKworICAgICAvKiBGaWxlIG1vZGlmaWVkIHRpbWUsIGlmIG10aW1lX3NldCBpcyB0cnVlOiAqLworCisgICAgbG9uZyBtdGltZTsgICAgICAgICAgCisKKyAgICAgLyogUmVzZXJ2ZWQgZm9yIGFuIHVuaW1wbGVtZW50ZWQgZmlsZSBsb2NraW5nIGV4dGVuc2lvbi4qLworCisgICAgaW50IGlmZDsKKworICAgICAvKiBUaGUgZm9ybWF0IHdoaWNoIGJlbG9uZ3MgdG8gdGhlIEJGRC4gKG9iamVjdCwgY29yZSwgZXRjLikgKi8KKworICAgIGJmZF9mb3JtYXQgZm9ybWF0OworCisgICAgIC8qIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqLworCisgICAgZW51bSBiZmRfZGlyZWN0aW9uIHtub19kaXJlY3Rpb24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhfZGlyZWN0aW9uID0gM30gZGlyZWN0aW9uOworCisgICAgIC8qIEZvcm1hdF9zcGVjaWZpYyBmbGFncyovCisKKyAgICBmbGFnd29yZCBmbGFnczsgICAgICAgICAgICAgIAorCisgICAgIC8qIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bworICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgorICAgICAgIG9yaWdpbiwgd2l0aCBvcmlnaW4gc2V0IHRvIDAgZm9yIG5vbiBhcmNoaXZlIGZpbGVzLiAgICovCisKKyAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAorCisgICAgIC8qIFJlbWVtYmVyIHdoZW4gb3V0cHV0IGhhcyBiZWd1biwgdG8gc3RvcCBzdHJhbmdlIHRoaW5ncworICAgICAgIGZyb20gaGFwcGVuaW5nLiAqLworICAgIGJvb2xlYW4gb3V0cHV0X2hhc19iZWd1bjsKKworICAgICAvKiBQb2ludGVyIHRvIGxpbmtlZCBsaXN0IG9mIHNlY3Rpb25zKi8KKyAgICBzdHJ1Y3Qgc2VjICAqc2VjdGlvbnM7CisKKyAgICAgLyogVGhlIG51bWJlciBvZiBzZWN0aW9ucyAqLworICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OworCisgICAgIC8qIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBvYmplY3QgZmlsZXM6IAorICAgICAgIFRoZSBzdGFydCBhZGRyZXNzLiAqLworICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKKworICAgICAvKiBVc2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0Ki8KKyAgICB1bnNpZ25lZCBpbnQgc3ltY291bnQ7CisKKyAgICAgLyogU3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgQkZEICh3aXRoIHN5bWNvdW50IGVudHJpZXMpICovCisgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKKworICAgICAvKiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qLworICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoX2luZm87CisKKyAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOiovCisgICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKKyAgICBzdHJ1Y3QgX2JmZCAqbXlfYXJjaGl2ZTsgICAgICAvKiBUaGUgY29udGFpbmluZyBhcmNoaXZlIEJGRC4gICovCisgICAgc3RydWN0IF9iZmQgKm5leHQ7ICAgICAgICAgICAgLyogVGhlIG5leHQgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KKyAgICBzdHJ1Y3QgX2JmZCAqYXJjaGl2ZV9oZWFkOyAgICAvKiBUaGUgZmlyc3QgQkZEIGluIHRoZSBhcmNoaXZlLiAgKi8KKyAgICBib29sZWFuIGhhc19hcm1hcDsgICAgICAgICAgIAorCisgICAgIC8qIEEgY2hhaW4gb2YgQkZEIHN0cnVjdHVyZXMgaW52b2x2ZWQgaW4gYSBsaW5rLiAgKi8KKyAgICBzdHJ1Y3QgX2JmZCAqbGlua19uZXh0OworCisgICAgIC8qIEEgZmllbGQgdXNlZCBieSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgVGhpcyB3aWxsCisgICAgICAgYmUgdXNlZCBvbmx5IGZvciBhcmNoaXZlIGVsZW1lbnRzLiAgKi8KKyAgICBpbnQgYXJjaGl2ZV9wYXNzOworCisgICAgIC8qIFVzZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGhvbGQgcHJpdmF0ZSBkYXRhLiAqLworCisgICAgdW5pb24gCisgICAgICB7CisgICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOworICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKKyAgICAgIHN0cnVjdCBfb2FzeXNfZGF0YSAqb2FzeXNfb2JqX2RhdGE7CisgICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7CisgICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKKyAgICAgIHN0cnVjdCBwZV90ZGF0YSAqcGVfb2JqX2RhdGE7CisgICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmX29ial9kYXRhOworICAgICAgc3RydWN0IGVjb2ZmX3RkYXRhICplY29mZl9vYmpfZGF0YTsKKyAgICAgIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0ICppZWVlX2RhdGE7CisgICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOworICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKKyAgICAgIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICppaGV4X2RhdGE7CisgICAgICBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKKyAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7CisgICAgICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmxtX29ial9kYXRhOworICAgICAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKmJvdXRfZGF0YTsKKyAgICAgIHN0cnVjdCBzdW5fY29yZV9zdHJ1Y3QgKnN1bl9jb3JlX2RhdGE7CisgICAgICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqc2NvNV9jb3JlX2RhdGE7CisgICAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqdHJhZF9jb3JlX2RhdGE7CisgICAgICBzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICpzb21fZGF0YTsKKyAgICAgIHN0cnVjdCBocHV4X2NvcmVfc3RydWN0ICpocHV4X2NvcmVfZGF0YTsKKyAgICAgIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpocHBhYnNkX2NvcmVfZGF0YTsKKyAgICAgIHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKnNnaV9jb3JlX2RhdGE7CisgICAgICBzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqbHlueF9jb3JlX2RhdGE7CisgICAgICBzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICpvc2ZfY29yZV9kYXRhOworICAgICAgc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICpjaXNjb19jb3JlX2RhdGE7CisgICAgICBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QgKnZlcnNhZG9zX2RhdGE7CisgICAgICBzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICpuZXRic2RfY29yZV9kYXRhOworICAgICAgUFRSIGFueTsKKyAgICAgIH0gdGRhdGE7CisgIAorICAgICAvKiBVc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBob2xkIHByaXZhdGUgZGF0YSovCisgICAgUFRSIHVzcmRhdGE7CisKKyAgIC8qIFdoZXJlIGFsbCB0aGUgYWxsb2NhdGVkIHN0dWZmIHVuZGVyIHRoaXMgQkZEIGdvZXMuICBUaGlzIGlzIGEKKyAgICAgc3RydWN0IG9iamFsbG9jICosIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mCisgICAgIG9iamFsbG9jLmguICAqLworICAgIFBUUiBtZW1vcnk7Cit9OworCit0eXBlZGVmIGVudW0gYmZkX2Vycm9yCit7CisgIGJmZF9lcnJvcl9ub19lcnJvciA9IDAsCisgIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKKyAgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAorICBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LAorICBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24sCisgIGJmZF9lcnJvcl9ub19tZW1vcnksCisgIGJmZF9lcnJvcl9ub19zeW1ib2xzLAorICBiZmRfZXJyb3Jfbm9fYXJtYXAsCisgIGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzLAorICBiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUsCisgIGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkLAorICBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLAorICBiZmRfZXJyb3Jfbm9fY29udGVudHMsCisgIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCisgIGJmZF9lcnJvcl9ub19kZWJ1Z19zZWN0aW9uLAorICBiZmRfZXJyb3JfYmFkX3ZhbHVlLAorICBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsCisgIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcsCisgIGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUKK30gYmZkX2Vycm9yX3R5cGU7CisKK2JmZF9lcnJvcl90eXBlIAorYmZkX2dldF9lcnJvciAgUEFSQU1TICgodm9pZCkpOworCit2b2lkIAorYmZkX3NldF9lcnJvciAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7CisKK0NPTlNUIGNoYXIgKgorYmZkX2Vycm1zZyAgUEFSQU1TICgoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKSk7CisKK3ZvaWQgCitiZmRfcGVycm9yICBQQVJBTVMgKChDT05TVCBjaGFyICptZXNzYWdlKSk7CisKK3R5cGVkZWYgdm9pZCAoKmJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7CisKK2JmZF9lcnJvcl9oYW5kbGVyX3R5cGUgCitiZmRfc2V0X2Vycm9yX2hhbmRsZXIgIFBBUkFNUyAoKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpKTsKKwordm9pZCAKK2JmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lICBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSAKK2JmZF9nZXRfZXJyb3JfaGFuZGxlciAgUEFSQU1TICgodm9pZCkpOworCitsb25nIAorYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7CisKK2xvbmcgCitiZmRfY2Fub25pY2FsaXplX3JlbG9jCisgUEFSQU1TICgoYmZkICphYmZkLAorICAgIGFzZWN0aW9uICpzZWMsCisgICAgYXJlbGVudCAqKmxvYywKKyAgICBhc3ltYm9sICoqc3ltcykpOworCit2b2lkIAorYmZkX3NldF9yZWxvYworIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQorICAgIAorICAgICk7CisKK2Jvb2xlYW4gCitiZmRfc2V0X2ZpbGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOworCitib29sZWFuIAorYmZkX3NldF9zdGFydF9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpKTsKKworbG9uZyAKK2JmZF9nZXRfbXRpbWUgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2xvbmcgCitiZmRfZ2V0X3NpemUgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2ludCAKK2JmZF9nZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKwordm9pZCAKK2JmZF9zZXRfZ3Bfc2l6ZSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpKSk7CisKK2JmZF92bWEgCitiZmRfc2Nhbl92bWEgUEFSQU1TICgoQ09OU1QgY2hhciAqc3RyaW5nLCBDT05TVCBjaGFyICoqZW5kLCBpbnQgYmFzZSkpOworCitib29sZWFuIAorYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOworCisjZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAorICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIFwKKyAgICAgICAgICAgICAgIChpYmZkLCBvYmZkKSkKK2Jvb2xlYW4gCitiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGJmZCAqb2JmZCkpOworCisjZGVmaW5lIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKKyAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwgXAorICAgICAgICAgICAgICAgKGliZmQsIG9iZmQpKQorYm9vbGVhbiAKK2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKSk7CisKKyNkZWZpbmUgYmZkX3NldF9wcml2YXRlX2ZsYWdzKGFiZmQsIGZsYWdzKSBcCisgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCisgICAgICAgICAgICAgICAoYWJmZCwgZmxhZ3MpKQorI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKKyAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2l6ZW9mX2hlYWRlcnMsIChhYmZkLCByZWxvYykpCisKKyNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCisgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLCAgKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSkKKworICAgICAgICAvKiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKi8KKyNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAorICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYWJmZCkpCisKKyNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19lbmQsIChhYmZkKSkKKworI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYWJmZCwgc2VjdGlvbikpCisKKworI2RlZmluZSBiZmRfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KSBcCisgICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQorCisjZGVmaW5lIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKGFiZmQpIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCwgKGFiZmQpKQorCisjZGVmaW5lIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2gpXAorICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQorCisjZGVmaW5lIGJmZF9yZWxheF9zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pIFwKKyAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWxheF9zZWN0aW9uLCAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikpCisKKyNkZWZpbmUgYmZkX2djX3NlY3Rpb25zKGFiZmQsIGxpbmtfaW5mbykgXAorICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2djX3NlY3Rpb25zLCAoYWJmZCwgbGlua19pbmZvKSkKKworI2RlZmluZSBiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZShhYmZkKSBcCisgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSwgKGFiZmQpKQorCisjZGVmaW5lIGJmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pIFwKKyAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2FkZF9zeW1ib2xzLCAoYWJmZCwgaW5mbykpCisKKyNkZWZpbmUgYmZkX2ZpbmFsX2xpbmsoYWJmZCwgaW5mbykgXAorICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmFsX2xpbmssIChhYmZkLCBpbmZvKSkKKworI2RlZmluZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyhhYmZkKSBcCisgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZnJlZV9jYWNoZWRfaW5mbywgKGFiZmQpKQorCisjZGVmaW5lIGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAorICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwgKGFiZmQpKQorCisjZGVmaW5lIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKGFiZmQsIGZpbGUpXAorICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEsIChhYmZkLCBmaWxlKSkKKworI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKGFiZmQsIGFzeW1ib2xzKSBcCisgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiLCAoYWJmZCwgYXN5bWJvbHMpKQorCisjZGVmaW5lIGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZChhYmZkKSBcCisgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkKSkKKworI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MoYWJmZCwgYXJlbHMsIGFzeW1zKSBcCisgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MsIChhYmZkLCBhcmVscywgYXN5bXMpKQorCitleHRlcm4gYmZkX2J5dGUgKmJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosCisgICAgICAgICAgICAgICAgIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKKworc3ltaW5kZXggCitiZmRfZ2V0X25leHRfbWFwZW50IFBBUkFNUyAoKGJmZCAqYWJmZCwgc3ltaW5kZXggcHJldmlvdXMsIGNhcnN5bSAqKnN5bSkpOworCitib29sZWFuIAorYmZkX3NldF9hcmNoaXZlX2hlYWQgUEFSQU1TICgoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpKTsKKworYmZkICoKK2JmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLCBiZmQgKnByZXZpb3VzKSk7CisKK0NPTlNUIGNoYXIgKgorYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2ludCAKK2JmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2Jvb2xlYW4gCitjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7CisKKyNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCisgICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQorCisjaWZkZWYgREVCVUdfQkZEX1NFTkQKKyN1bmRlZiBCRkRfU0VORAorI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKKyAgKCgoYmZkKSAmJiAoYmZkKS0+eHZlYyAmJiAoYmZkKS0+eHZlYy0+bWVzc2FnZSkgPyBcCisgICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkgOiBcCisgICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCisjZW5kaWYKKyNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAorICAgICAgICAgICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpCisKKyNpZmRlZiBERUJVR19CRkRfU0VORAorI3VuZGVmIEJGRF9TRU5EX0ZNVAorI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCisgICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAorICAgKCgoYmZkKS0+eHZlYy0+bWVzc2FnZVsoaW50KSgoYmZkKS0+Zm9ybWF0KV0pIGFyZ2xpc3QpIDogXAorICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCisjZW5kaWYKK2VudW0gYmZkX2ZsYXZvdXIgeworICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAorICBiZmRfdGFyZ2V0X2loZXhfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKKyAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfdmVyc2Fkb3NfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAorICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKK307CisKK2VudW0gYmZkX2VuZGlhbiB7IEJGRF9FTkRJQU5fQklHLCBCRkRfRU5ESUFOX0xJVFRMRSwgQkZEX0VORElBTl9VTktOT1dOIH07CisKKyAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87CisKK3R5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKK3sKKyAgY2hhciAqbmFtZTsKKyAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOworICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOworICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKKyAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKKyAgZmxhZ3dvcmQgc2VjdGlvbl9mbGFnczsKKyAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOworICBjaGFyIGFyX3BhZF9jaGFyOyAgICAgICAgICAgIAorICB1bnNpZ25lZCBzaG9ydCBhcl9tYXhfbmFtZWxlbjsKKyAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF82NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisgIGJmZF92bWEgICAgICAoKmJmZF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKyAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKyAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOworICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisgIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisgIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKKyAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisgIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKyAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisgIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisgIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOworICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKyAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKKyAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKigqX2JmZF9jaGVja19mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKKyAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfc2V0X2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOworICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF93cml0ZV9jb250ZW50c1tiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOworCisgICAvKiBHZW5lcmljIGVudHJ5IHBvaW50cy4gICovCisjZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMoTkFNRSlcCitDQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKK0NBVChOQU1FLF9iZmRfZnJlZV9jYWNoZWRfaW5mbyksXAorQ0FUKE5BTUUsX25ld19zZWN0aW9uX2hvb2spLFwKK0NBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAorQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKKworICAgLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KKyAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKKyAgIC8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCisgIGJvb2xlYW4gKCpfYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7CisgICAvKiBDYWxsZWQgd2hlbiBhIG5ldyBzZWN0aW9uIGlzIGNyZWF0ZWQuICAqLworICBib29sZWFuICAgICAgICgqX25ld19zZWN0aW9uX2hvb2spIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7CisgICAvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLworICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisgIGJvb2xlYW4gICAgICAgKCpfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKworICAgLyogRW50cnkgcG9pbnRzIHRvIGNvcHkgcHJpdmF0ZSBkYXRhLiAgKi8KKyNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKK0NBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKSxcCitDQVQoTkFNRSxfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpLFwKK0NBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAorQ0FUKE5BTUUsX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpLFwKK0NBVChOQU1FLF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpLFwKK0NBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCisgICAvKiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKKyAgICAgdG8gYW5vdGhlci4gICovCisgIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CisgICAvKiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCisgICAgIHRvIGEgY29tbW9uIG91dHB1dCBmaWxlIHdoZW4gbGlua2luZy4gICovCisgIGJvb2xlYW4gICAgICAgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCisgICAgIHRvIGFub3RoZXIuICAqLworICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOworICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAorICAgICB0byBhbm90aGVyLiAgKi8KKyAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqLCBhc3ltYm9sICopKTsKKyAgIC8qIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICovCisgIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKKworICAgLyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKi8KKyAgYm9vbGVhbiAgICAgICAoKl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIFBUUikpOworCisgICAvKiBDb3JlIGZpbGUgZW50cnkgcG9pbnRzLiAgKi8KKyNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKK0NBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSxcCitDQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSxcCitDQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQorICBjaGFyICogICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSBQQVJBTVMgKChiZmQgKikpOworICBpbnQgICAgICAoKl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpIFBBUkFNUyAoKGJmZCAqKSk7CisgIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CisKKyAgIC8qIEFyY2hpdmUgZW50cnkgcG9pbnRzLiAgKi8KKyNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQVJDSElWRShOQU1FKVwKK0NBVChOQU1FLF9zbHVycF9hcm1hcCksXAorQ0FUKE5BTUUsX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpLFwKK0NBVChOQU1FLF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSksXAorQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAorQ0FUKE5BTUUsX3dyaXRlX2FybWFwKSxcCitDQVQoTkFNRSxfcmVhZF9hcl9oZHIpLFwKK0NBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKK0NBVChOQU1FLF9nZXRfZWx0X2F0X2luZGV4KSxcCitDQVQoTkFNRSxfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KSxcCitDQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKKyAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2FybWFwKSBQQVJBTVMgKChiZmQgKikpOworICBib29sZWFuICAoKl9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSkgUEFSQU1TICgoYmZkICopKTsKKyAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQorICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKKyAgdm9pZCAgICAgKCpfYmZkX3RydW5jYXRlX2FybmFtZSkgUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwgY2hhciAqKSk7CisgIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcmwgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkeCkpOworICBQVFIgKCpfYmZkX3JlYWRfYXJfaGRyX2ZuKSBQQVJBTVMgKChiZmQgKikpOworICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKKyNkZWZpbmUgYmZkX2dldF9lbHRfYXRfaW5kZXgoYixpKSBCRkRfU0VORChiLCBfYmZkX2dldF9lbHRfYXRfaW5kZXgsIChiLGkpKQorICBiZmQgKiAgICAoKl9iZmRfZ2V0X2VsdF9hdF9pbmRleCkgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7CisgIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOworICBib29sZWFuICAoKl9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkgUEFSQU1TICgoYmZkICopKTsKKworICAgLyogRW50cnkgcG9pbnRzIHVzZWQgZm9yIHN5bWJvbHMuICAqLworI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAorQ0FUKE5BTUUsX2dldF9zeW10YWJfdXBwZXJfYm91bmQpLFwKK0NBVChOQU1FLF9nZXRfc3ltdGFiKSxcCitDQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKK0NBVChOQU1FLF9wcmludF9zeW1ib2wpLFwKK0NBVChOQU1FLF9nZXRfc3ltYm9sX2luZm8pLFwKK0NBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAorQ0FUKE5BTUUsX2dldF9saW5lbm8pLFwKK0NBVChOQU1FLF9maW5kX25lYXJlc3RfbGluZSksXAorQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAorQ0FUKE5BTUUsX3JlYWRfbWluaXN5bWJvbHMpLFwKK0NBVChOQU1FLF9taW5pc3ltYm9sX3RvX3N5bWJvbCkKKyAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7CisgIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiKSBQQVJBTVMgKChiZmQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKKyAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgorICAgICAgICAgICAgICAgICgqX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCkgUEFSQU1TICgoYmZkICopKTsKKyAgdm9pZCAgICAgICAgICAoKl9iZmRfcHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKiwgUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOworI2RlZmluZSBiZmRfcHJpbnRfc3ltYm9sKGIscCxzLGUpIEJGRF9TRU5EKGIsIF9iZmRfcHJpbnRfc3ltYm9sLCAoYixwLHMsZSkpCisgIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2luZm8gKikpOworI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKKyAgYm9vbGVhbiAgICAgICAoKl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSkgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworCisgIGFsZW50ICogICAgKCpfZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKikpOworICBib29sZWFuICAgICgqX2JmZF9maW5kX25lYXJlc3RfbGluZSkgUEFSQU1TICgoYmZkICphYmZkLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlLCBDT05TVCBjaGFyICoqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsaW5lKSk7CisgIC8qIEJhY2stZG9vciB0byBhbGxvdyBmb3JtYXQtYXdhcmUgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBkZWJ1ZyBzeW1ib2xzCisgICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCisgICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KKyAgYXN5bWJvbCAqICAoKl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpIFBBUkFNUyAoKAorICAgICAgIGJmZCAqYWJmZCwKKyAgICAgICB2b2lkICpwdHIsCisgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSk7CisjZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKKyAgQkZEX1NFTkQgKGIsIF9yZWFkX21pbmlzeW1ib2xzLCAoYiwgZCwgbSwgcykpCisgIGxvbmcgICgqX3JlYWRfbWluaXN5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKKyNkZWZpbmUgYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sKGIsIGQsIG0sIGYpIFwKKyAgQkZEX1NFTkQgKGIsIF9taW5pc3ltYm9sX3RvX3N5bWJvbCwgKGIsIGQsIG0sIGYpKQorICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKikpOworCisgICAvKiBSb3V0aW5lcyBmb3IgcmVsb2NzLiAgKi8KKyNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAorQ0FUKE5BTUUsX2dldF9yZWxvY191cHBlcl9ib3VuZCksXAorQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9yZWxvYyksXAorQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKKyAgbG9uZyAgKCpfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOworICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgYXJlbGVudCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworICAgLyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqLworICByZWxvY19ob3d0b190eXBlICoKKyAgICAgICAoKnJlbG9jX3R5cGVfbG9va3VwKSBQQVJBTVMgKChiZmQgKmFiZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKKworICAgLyogUm91dGluZXMgdXNlZCB3aGVuIHdyaXRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLworI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9XUklURShOQU1FKVwKK0NBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCitDQVQoTkFNRSxfc2V0X3NlY3Rpb25fY29udGVudHMpCisgIGJvb2xlYW4gICAgKCpfYmZkX3NldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKKyAgYm9vbGVhbiAgICAgICAoKl9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisKKyAgIC8qIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCisjZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0xJTksoTkFNRSlcCitDQVQoTkFNRSxfc2l6ZW9mX2hlYWRlcnMpLFwKK0NBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCitDQVQoTkFNRSxfYmZkX3JlbGF4X3NlY3Rpb24pLFwKK0NBVChOQU1FLF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSksXAorQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCitDQVQoTkFNRSxfYmZkX2ZpbmFsX2xpbmspLFwKK0NBVChOQU1FLF9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSxcCitDQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQorICBpbnQgICAgICAgICgqX2JmZF9zaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKKyAgYmZkX2J5dGUgKiAoKl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCisgICAgICAgICAgICAgICAgICAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworCisgIGJvb2xlYW4gICAgKCpfYmZkX3JlbGF4X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICosCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKmFnYWluKSk7CisKKyAgIC8qIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKKyAgICAgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoaXMgdGFibGUuICAqLworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCpfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpIFBBUkFNUyAoKGJmZCAqKSk7CisKKyAgIC8qIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgYm9vbGVhbiAoKl9iZmRfbGlua19hZGRfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworICAgLyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAorICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqLworICBib29sZWFuICgqX2JmZF9maW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisgICAvKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLworICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKKworICAgLyogUmVtb3ZlIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGZyb20gdGhlIG91dHB1dC4gICovCisgIGJvb2xlYW4gKCpfYmZkX2djX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisgICAvKiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqLworI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKE5BTUUpXAorQ0FUKE5BTUUsX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCksXAorQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAorQ0FUKE5BTUUsX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSxcCitDQVQoTkFNRSxfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCisgICAvKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAqLworICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOworICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KKyAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKKyAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworICAgLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KKyAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOworICAgLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLworICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MpCisgICAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKKworIFBUUiBiYWNrZW5kX2RhdGE7Cit9IGJmZF90YXJnZXQ7Citib29sZWFuIAorYmZkX3NldF9kZWZhdWx0X3RhcmdldCAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOworCitjb25zdCBiZmRfdGFyZ2V0ICoKK2JmZF9maW5kX3RhcmdldCBQQVJBTVMgKChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKSk7CisKK2NvbnN0IGNoYXIgKioKK2JmZF90YXJnZXRfbGlzdCBQQVJBTVMgKCh2b2lkKSk7CisKK2Jvb2xlYW4gCitiZmRfY2hlY2tfZm9ybWF0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpKTsKKworYm9vbGVhbiAKK2JmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0LCBjaGFyICoqKm1hdGNoaW5nKSk7CisKK2Jvb2xlYW4gCitiZmRfc2V0X2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7CisKK0NPTlNUIGNoYXIgKgorYmZkX2Zvcm1hdF9zdHJpbmcgUEFSQU1TICgoYmZkX2Zvcm1hdCBmb3JtYXQpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2JmZC5jIGIvYmZkL2JmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2U4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYmZkLmMKQEAgLTAsMCArMSwxMTU5IEBACisvKiBHZW5lcmljIEJGRCBsaWJyYXJ5IGludGVyZmFjZSBhbmQgc3VwcG9ydCByb3V0aW5lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorU0VDVElPTgorCTw8dHlwZWRlZiBiZmQ+PgorCisJQSBCRkQgaGFzIHR5cGUgPDxiZmQ+Pjsgb2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIHRoZQorCWNvcm5lcnN0b25lIG9mIGFueSBhcHBsaWNhdGlvbiB1c2luZyBCRkQuIFVzaW5nIEJGRAorCWNvbnNpc3RzIG9mIG1ha2luZyByZWZlcmVuY2VzIHRob3VnaCB0aGUgQkZEIGFuZCB0byBkYXRhIGluIHRoZSBCRkQuCisKKwlIZXJlIGlzIHRoZSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZSB0eXBlIDw8YmZkPj4uICBJdAorCWNvbnRhaW5zIHRoZSBtYWpvciBkYXRhIGFib3V0IHRoZSBmaWxlIGFuZCBwb2ludGVycworCXRvIHRoZSByZXN0IG9mIHRoZSBkYXRhLgorCitDT0RFX0ZSQUdNRU5UCisuCisuc3RydWN0IF9iZmQgCisueworLiAgICB7KiBUaGUgZmlsZW5hbWUgdGhlIGFwcGxpY2F0aW9uIG9wZW5lZCB0aGUgQkZEIHdpdGguICAqfQorLiAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgCisuCisuICAgIHsqIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGp1bXAgdGFibGUuICAgICAgICAgICAgICp9CisuICAgIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOworLgorLiAgICB7KiBUbyBhdm9pZCBkcmFnZ2luZyB0b28gbWFueSBoZWFkZXIgZmlsZXMgaW50byBldmVyeSBmaWxlIHRoYXQKKy4gICAgICAgaW5jbHVkZXMgYDw8YmZkLmg+PicsIElPU1RSRUFNIGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgImNoYXIKKy4gICAgICAgKiIsIGFuZCBNVElNRSBhcyBhICJsb25nIi4gIFRoZWlyIGNvcnJlY3QgdHlwZXMsIHRvIHdoaWNoIHRoZXkKKy4gICAgICAgYXJlIGNhc3Qgd2hlbiB1c2VkLCBhcmUgIkZJTEUgKiIgYW5kICJ0aW1lX3QiLiAgICBUaGUgaW9zdHJlYW0KKy4gICAgICAgaXMgdGhlIHJlc3VsdCBvZiBhbiBmb3BlbiBvbiB0aGUgZmlsZW5hbWUuICBIb3dldmVyLCBpZiB0aGUKKy4gICAgICAgQkZEX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhlbiBpb3N0cmVhbSBpcyBhY3R1YWxseSBhIHBvaW50ZXIKKy4gICAgICAgdG8gYSBiZmRfaW5fbWVtb3J5IHN0cnVjdC4gICp9CisuICAgIFBUUiBpb3N0cmVhbTsKKy4KKy4gICAgeyogSXMgdGhlIGZpbGUgZGVzY3JpcHRvciBiZWluZyBjYWNoZWQ/ICBUaGF0IGlzLCBjYW4gaXQgYmUgY2xvc2VkIGFzCisuICAgICAgIG5lZWRlZCwgYW5kIHJlLW9wZW5lZCB3aGVuIGFjY2Vzc2VkIGxhdGVyPyAgKn0KKy4KKy4gICAgYm9vbGVhbiBjYWNoZWFibGU7CisuCisuICAgIHsqIE1hcmtzIHdoZXRoZXIgdGhlcmUgd2FzIGEgZGVmYXVsdCB0YXJnZXQgc3BlY2lmaWVkIHdoZW4gdGhlCisuICAgICAgIEJGRCB3YXMgb3BlbmVkLiBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG1hdGNoaW5nIGFsZ29yaXRobQorLiAgICAgICB0byB1c2UgdG8gY2hvb3NlIHRoZSBiYWNrIGVuZC4gKn0KKy4KKy4gICAgYm9vbGVhbiB0YXJnZXRfZGVmYXVsdGVkOworLgorLiAgICB7KiBUaGUgY2FjaGluZyByb3V0aW5lcyB1c2UgdGhlc2UgdG8gbWFpbnRhaW4gYQorLiAgICAgICBsZWFzdC1yZWNlbnRseS11c2VkIGxpc3Qgb2YgQkZEcyAqfQorLgorLiAgICBzdHJ1Y3QgX2JmZCAqbHJ1X3ByZXYsICpscnVfbmV4dDsKKy4KKy4gICAgeyogV2hlbiBhIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBjYWNoaW5nIHJvdXRpbmVzLCBCRkQgcmV0YWlucworLiAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmlsZSBoZXJlOiAqfQorLgorLiAgICBmaWxlX3B0ciB3aGVyZTsgICAgICAgICAgICAgIAorLgorLiAgICB7KiBhbmQgaGVyZTogKGBgb25jZScnIG1lYW5zIGF0IGxlYXN0IG9uY2UpICp9CisuCisuICAgIGJvb2xlYW4gb3BlbmVkX29uY2U7CisuCisuICAgIHsqIFNldCBpZiB3ZSBoYXZlIGEgbG9jYWxseSBtYWludGFpbmVkIG10aW1lIHZhbHVlLCByYXRoZXIgdGhhbgorLiAgICAgICBnZXR0aW5nIGl0IGZyb20gdGhlIGZpbGUgZWFjaCB0aW1lOiAqfQorLgorLiAgICBib29sZWFuIG10aW1lX3NldDsKKy4KKy4gICAgeyogRmlsZSBtb2RpZmllZCB0aW1lLCBpZiBtdGltZV9zZXQgaXMgdHJ1ZTogKn0KKy4KKy4gICAgbG9uZyBtdGltZTsgICAgICAgICAgCisuCisuICAgIHsqIFJlc2VydmVkIGZvciBhbiB1bmltcGxlbWVudGVkIGZpbGUgbG9ja2luZyBleHRlbnNpb24uKn0KKy4KKy4gICAgaW50IGlmZDsKKy4KKy4gICAgeyogVGhlIGZvcm1hdCB3aGljaCBiZWxvbmdzIHRvIHRoZSBCRkQuIChvYmplY3QsIGNvcmUsIGV0Yy4pICp9CisuCisuICAgIGJmZF9mb3JtYXQgZm9ybWF0OworLgorLiAgICB7KiBUaGUgZGlyZWN0aW9uIHRoZSBCRkQgd2FzIG9wZW5lZCB3aXRoKn0KKy4KKy4gICAgZW51bSBiZmRfZGlyZWN0aW9uIHtub19kaXJlY3Rpb24gPSAwLAorLiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfZGlyZWN0aW9uID0gMSwKKy4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9kaXJlY3Rpb24gPSAyLAorLiAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhfZGlyZWN0aW9uID0gM30gZGlyZWN0aW9uOworLgorLiAgICB7KiBGb3JtYXRfc3BlY2lmaWMgZmxhZ3MqfQorLgorLiAgICBmbGFnd29yZCBmbGFnczsgICAgICAgICAgICAgIAorLgorLiAgICB7KiBDdXJyZW50bHkgbXlfYXJjaGl2ZSBpcyB0ZXN0ZWQgYmVmb3JlIGFkZGluZyBvcmlnaW4gdG8KKy4gICAgICAgYW55dGhpbmcuIEkgYmVsaWV2ZSB0aGF0IHRoaXMgY2FuIGJlY29tZSBhbHdheXMgYW4gYWRkIG9mCisuICAgICAgIG9yaWdpbiwgd2l0aCBvcmlnaW4gc2V0IHRvIDAgZm9yIG5vbiBhcmNoaXZlIGZpbGVzLiAgICp9CisuCisuICAgIGZpbGVfcHRyIG9yaWdpbjsgICAgICAgICAgICAgCisuCisuICAgIHsqIFJlbWVtYmVyIHdoZW4gb3V0cHV0IGhhcyBiZWd1biwgdG8gc3RvcCBzdHJhbmdlIHRoaW5ncworLiAgICAgICBmcm9tIGhhcHBlbmluZy4gKn0KKy4gICAgYm9vbGVhbiBvdXRwdXRfaGFzX2JlZ3VuOworLgorLiAgICB7KiBQb2ludGVyIHRvIGxpbmtlZCBsaXN0IG9mIHNlY3Rpb25zKn0KKy4gICAgc3RydWN0IHNlYyAgKnNlY3Rpb25zOworLgorLiAgICB7KiBUaGUgbnVtYmVyIG9mIHNlY3Rpb25zICp9CisuICAgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OworLgorLiAgICB7KiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3Igb2JqZWN0IGZpbGVzOiAKKy4gICAgICAgVGhlIHN0YXJ0IGFkZHJlc3MuICp9CisuICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKKy4KKy4gICAgeyogVXNlZCBmb3IgaW5wdXQgYW5kIG91dHB1dCp9CisuICAgIHVuc2lnbmVkIGludCBzeW1jb3VudDsKKy4KKy4gICAgeyogU3ltYm9sIHRhYmxlIGZvciBvdXRwdXQgQkZEICh3aXRoIHN5bWNvdW50IGVudHJpZXMpICp9CisuICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoqb3V0c3ltYm9sczsgICAgICAgICAgICAgCisuCisuICAgIHsqIFBvaW50ZXIgdG8gc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbip9CisuICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoX2luZm87CisuCisuICAgIHsqIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBhcmNoaXZlczoqfQorLiAgICBQVFIgYXJlbHRfZGF0YTsgICAgICAgICAgICAgIAorLiAgICBzdHJ1Y3QgX2JmZCAqbXlfYXJjaGl2ZTsgICAgIHsqIFRoZSBjb250YWluaW5nIGFyY2hpdmUgQkZELiAgKn0KKy4gICAgc3RydWN0IF9iZmQgKm5leHQ7ICAgICAgICAgICB7KiBUaGUgbmV4dCBCRkQgaW4gdGhlIGFyY2hpdmUuICAqfQorLiAgICBzdHJ1Y3QgX2JmZCAqYXJjaGl2ZV9oZWFkOyAgIHsqIFRoZSBmaXJzdCBCRkQgaW4gdGhlIGFyY2hpdmUuICAqfQorLiAgICBib29sZWFuIGhhc19hcm1hcDsgICAgICAgICAgIAorLgorLiAgICB7KiBBIGNoYWluIG9mIEJGRCBzdHJ1Y3R1cmVzIGludm9sdmVkIGluIGEgbGluay4gICp9CisuICAgIHN0cnVjdCBfYmZkICpsaW5rX25leHQ7CisuCisuICAgIHsqIEEgZmllbGQgdXNlZCBieSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgVGhpcyB3aWxsCisuICAgICAgIGJlIHVzZWQgb25seSBmb3IgYXJjaGl2ZSBlbGVtZW50cy4gICp9CisuICAgIGludCBhcmNoaXZlX3Bhc3M7CisuCisuICAgIHsqIFVzZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGhvbGQgcHJpdmF0ZSBkYXRhLiAqfQorLgorLiAgICB1bmlvbiAKKy4gICAgICB7CisuICAgICAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKmFvdXRfZGF0YTsKKy4gICAgICBzdHJ1Y3QgYXJ0ZGF0YSAqYW91dF9hcl9kYXRhOworLiAgICAgIHN0cnVjdCBfb2FzeXNfZGF0YSAqb2FzeXNfb2JqX2RhdGE7CisuICAgICAgc3RydWN0IF9vYXN5c19hcl9kYXRhICpvYXN5c19hcl9kYXRhOworLiAgICAgIHN0cnVjdCBjb2ZmX3RkYXRhICpjb2ZmX29ial9kYXRhOworLiAgICAgIHN0cnVjdCBwZV90ZGF0YSAqcGVfb2JqX2RhdGE7CisuICAgICAgc3RydWN0IHhjb2ZmX3RkYXRhICp4Y29mZl9vYmpfZGF0YTsKKy4gICAgICBzdHJ1Y3QgZWNvZmZfdGRhdGEgKmVjb2ZmX29ial9kYXRhOworLiAgICAgIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0ICppZWVlX2RhdGE7CisuICAgICAgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgKmllZWVfYXJfZGF0YTsKKy4gICAgICBzdHJ1Y3Qgc3JlY19kYXRhX3N0cnVjdCAqc3JlY19kYXRhOworLiAgICAgIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICppaGV4X2RhdGE7CisuICAgICAgc3RydWN0IHRla2hleF9kYXRhX3N0cnVjdCAqdGVraGV4X2RhdGE7CisuICAgICAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKmVsZl9vYmpfZGF0YTsKKy4gICAgICBzdHJ1Y3QgbmxtX29ial90ZGF0YSAqbmxtX29ial9kYXRhOworLiAgICAgIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpib3V0X2RhdGE7CisuICAgICAgc3RydWN0IHN1bl9jb3JlX3N0cnVjdCAqc3VuX2NvcmVfZGF0YTsKKy4gICAgICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqc2NvNV9jb3JlX2RhdGE7CisuICAgICAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnRyYWRfY29yZV9kYXRhOworLiAgICAgIHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKnNvbV9kYXRhOworLiAgICAgIHN0cnVjdCBocHV4X2NvcmVfc3RydWN0ICpocHV4X2NvcmVfZGF0YTsKKy4gICAgICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqaHBwYWJzZF9jb3JlX2RhdGE7CisuICAgICAgc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAqc2dpX2NvcmVfZGF0YTsKKy4gICAgICBzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqbHlueF9jb3JlX2RhdGE7CisuICAgICAgc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAqb3NmX2NvcmVfZGF0YTsKKy4gICAgICBzdHJ1Y3QgY2lzY29fY29yZV9zdHJ1Y3QgKmNpc2NvX2NvcmVfZGF0YTsKKy4gICAgICBzdHJ1Y3QgdmVyc2Fkb3NfZGF0YV9zdHJ1Y3QgKnZlcnNhZG9zX2RhdGE7CisuICAgICAgc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCAqbmV0YnNkX2NvcmVfZGF0YTsKKy4gICAgICBQVFIgYW55OworLiAgICAgIH0gdGRhdGE7CisuICAKKy4gICAgeyogVXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gaG9sZCBwcml2YXRlIGRhdGEqfQorLiAgICBQVFIgdXNyZGF0YTsKKy4KKy4gIHsqIFdoZXJlIGFsbCB0aGUgYWxsb2NhdGVkIHN0dWZmIHVuZGVyIHRoaXMgQkZEIGdvZXMuICBUaGlzIGlzIGEKKy4gICAgIHN0cnVjdCBvYmphbGxvYyAqLCBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZgorLiAgICAgb2JqYWxsb2MuaC4gICp9CisuICAgIFBUUiBtZW1vcnk7CisufTsKKy4KKyovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9zeW0uaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisjaW5jbHVkZSAibGliZWNvZmYuaCIKKyN1bmRlZiBvYmpfc3ltYm9scworI2luY2x1ZGUgImVsZi1iZmQuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisMCisvKiBwcm92aWRlIHN0b3JhZ2UgZm9yIHN1YnN5c3RlbSwgc3RhY2sgYW5kIGhlYXAgZGF0YSB3aGljaCBtYXkgaGF2ZSBiZWVuCisgICBwYXNzZWQgaW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIExkIHB1dHMgdGhpcyBkYXRhIGludG8gYSBiZmRfbGlua19pbmZvCisgICBzdHJ1Y3Qgd2hpY2ggdWx0aW1hdGVseSBnZXRzIHBhc3NlZCBpbiB0byB0aGUgYmZkLiAgV2hlbiBpdCBhcnJpdmVzLCBjb3B5CisgICBpdCB0byB0aGUgZm9sbG93aW5nIHN0cnVjdCBzbyB0aGF0IHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIGluIGNvZmZjb2RlLmgKKyAgIHdoZXJlIGl0IGlzIG5lZWRlZC4gIFRoZSB0eXBlZGVmJ3MgdXNlZCBhcmUgZGVmaW5lZCBpbiBiZmQuaCAqLworCisKKwwKKy8qCitTRUNUSU9OCisJRXJyb3IgcmVwb3J0aW5nCisKKwlNb3N0IEJGRCBmdW5jdGlvbnMgcmV0dXJuIG5vbnplcm8gb24gc3VjY2VzcyAoY2hlY2sgdGhlaXIKKwlpbmRpdmlkdWFsIGRvY3VtZW50YXRpb24gZm9yIHByZWNpc2Ugc2VtYW50aWNzKS4gIE9uIGFuIGVycm9yLAorCXRoZXkgY2FsbCA8PGJmZF9zZXRfZXJyb3I+PiB0byBzZXQgYW4gZXJyb3IgY29uZGl0aW9uIHRoYXQgY2FsbGVycworCWNhbiBjaGVjayBieSBjYWxsaW5nIDw8YmZkX2dldF9lcnJvcj4+LgorICAgICAgICBJZiB0aGF0IHJldHVybnMgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiwgdGhlbiBjaGVjaworCTw8ZXJybm8+Pi4KKworCVRoZSBlYXNpZXN0IHdheSB0byByZXBvcnQgYSBCRkQgZXJyb3IgdG8gdGhlIHVzZXIgaXMgdG8KKwl1c2UgPDxiZmRfcGVycm9yPj4uCisKK1NVQlNFQ1RJT04KKwlUeXBlIDw8YmZkX2Vycm9yX3R5cGU+PgorCisJVGhlIHZhbHVlcyByZXR1cm5lZCBieSA8PGJmZF9nZXRfZXJyb3I+PiBhcmUgZGVmaW5lZCBieSB0aGUKKwllbnVtZXJhdGVkIHR5cGUgPDxiZmRfZXJyb3JfdHlwZT4+LgorCitDT0RFX0ZSQUdNRU5UCisuCisudHlwZWRlZiBlbnVtIGJmZF9lcnJvcgorLnsKKy4gIGJmZF9lcnJvcl9ub19lcnJvciA9IDAsCisuICBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCisuICBiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQsCisuICBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LAorLiAgYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLAorLiAgYmZkX2Vycm9yX25vX21lbW9yeSwKKy4gIGJmZF9lcnJvcl9ub19zeW1ib2xzLAorLiAgYmZkX2Vycm9yX25vX2FybWFwLAorLiAgYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMsCisuICBiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUsCisuICBiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCwKKy4gIGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsCisuICBiZmRfZXJyb3Jfbm9fY29udGVudHMsCisuICBiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLAorLiAgYmZkX2Vycm9yX25vX2RlYnVnX3NlY3Rpb24sCisuICBiZmRfZXJyb3JfYmFkX3ZhbHVlLAorLiAgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLAorLiAgYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZywKKy4gIGJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUKKy59IGJmZF9lcnJvcl90eXBlOworLgorKi8KKworc3RhdGljIGJmZF9lcnJvcl90eXBlIGJmZF9lcnJvciA9IGJmZF9lcnJvcl9ub19lcnJvcjsKKworQ09OU1QgY2hhciAqQ09OU1QgYmZkX2Vycm1zZ3NbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBlcnJvciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTl8oIlN5c3RlbSBjYWxsIGVycm9yIiksCisgICAgICAgICAgICAgICAgICAgICAgICBOXygiSW52YWxpZCBiZmQgdGFyZ2V0IiksCisgICAgICAgICAgICAgICAgICAgICAgICBOXygiRmlsZSBpbiB3cm9uZyBmb3JtYXQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJJbnZhbGlkIG9wZXJhdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk1lbW9yeSBleGhhdXN0ZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJObyBzeW1ib2xzIiksCisJCQlOXygiQXJjaGl2ZSBoYXMgbm8gaW5kZXg7IHJ1biByYW5saWIgdG8gYWRkIG9uZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vIG1vcmUgYXJjaGl2ZWQgZmlsZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJNYWxmb3JtZWQgYXJjaGl2ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICBOXygiRmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzIiksCisgICAgICAgICAgICAgICAgICAgICAgICBOXygiU2VjdGlvbiBoYXMgbm8gY29udGVudHMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJOb25yZXByZXNlbnRhYmxlIHNlY3Rpb24gb24gb3V0cHV0IiksCisJCQlOXygiU3ltYm9sIG5lZWRzIGRlYnVnIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgZXhpc3QiKSwKKwkJCU5fKCJCYWQgdmFsdWUiKSwKKwkJCU5fKCJGaWxlIHRydW5jYXRlZCIpLAorCQkJTl8oIkZpbGUgdG9vIGJpZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgTl8oIiM8SW52YWxpZCBlcnJvciBjb2RlPiIpCisgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qCitGVU5DVElPTgorCWJmZF9nZXRfZXJyb3IKKworU1lOT1BTSVMKKwliZmRfZXJyb3JfdHlwZSBiZmRfZ2V0X2Vycm9yICh2b2lkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIGN1cnJlbnQgQkZEIGVycm9yIGNvbmRpdGlvbi4KKyovCisKK2JmZF9lcnJvcl90eXBlCitiZmRfZ2V0X2Vycm9yICgpCit7CisgIHJldHVybiBiZmRfZXJyb3I7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9zZXRfZXJyb3IKKworU1lOT1BTSVMKKwl2b2lkIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZyk7CisKK0RFU0NSSVBUSU9OCisJU2V0IHRoZSBCRkQgZXJyb3IgY29uZGl0aW9uIHRvIGJlIEB2YXJ7ZXJyb3JfdGFnfS4KKyovCisKK3ZvaWQKK2JmZF9zZXRfZXJyb3IgKGVycm9yX3RhZykKKyAgICAgYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnOworeworICBiZmRfZXJyb3IgPSBlcnJvcl90YWc7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9lcnJtc2cKKworU1lOT1BTSVMKKwlDT05TVCBjaGFyICpiZmRfZXJybXNnIChiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWcpOworCitERVNDUklQVElPTgorCVJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvciBAdmFye2Vycm9yX3RhZ30sIG9yCisJdGhlIHN5c3RlbSBlcnJvciBpZiBAdmFye2Vycm9yX3RhZ30gaXMgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+Pi4KKyovCisKK0NPTlNUIGNoYXIgKgorYmZkX2Vycm1zZyAoZXJyb3JfdGFnKQorICAgICBiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWc7Cit7CisjaWZuZGVmIGVycm5vCisgIGV4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKyAgaWYgKGVycm9yX3RhZyA9PSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisgICAgcmV0dXJuIHhzdHJlcnJvciAoZXJybm8pOworCisgIGlmICgoKChpbnQpZXJyb3JfdGFnIDwoaW50KSBiZmRfZXJyb3Jfbm9fZXJyb3IpIHx8CisgICAgICAgKChpbnQpZXJyb3JfdGFnID4gKGludCliZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlKSkpCisgICAgZXJyb3JfdGFnID0gYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZTsvKiBzYW5pdHkgY2hlY2sgKi8KKworICByZXR1cm4gXyhiZmRfZXJybXNncyBbKGludCllcnJvcl90YWddKTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX3BlcnJvcgorCitTWU5PUFNJUworCXZvaWQgYmZkX3BlcnJvciAoQ09OU1QgY2hhciAqbWVzc2FnZSk7CisKK0RFU0NSSVBUSU9OCisJUHJpbnQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSBhIHN0cmluZyBkZXNjcmliaW5nIHRoZQorCWxhc3QgQkZEIGVycm9yIHRoYXQgb2NjdXJyZWQsIG9yIHRoZSBsYXN0IHN5c3RlbSBlcnJvciBpZgorCXRoZSBsYXN0IEJGRCBlcnJvciB3YXMgYSBzeXN0ZW0gY2FsbCBmYWlsdXJlLiAgSWYgQHZhcnttZXNzYWdlfQorCWlzIG5vbi1OVUxMIGFuZCBub24tZW1wdHksIHRoZSBlcnJvciBzdHJpbmcgcHJpbnRlZCBpcyBwcmVjZWRlZAorCWJ5IEB2YXJ7bWVzc2FnZX0sIGEgY29sb24sIGFuZCBhIHNwYWNlLiAgSXQgaXMgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgorKi8KKwordm9pZAorYmZkX3BlcnJvciAobWVzc2FnZSkKKyAgICAgQ09OU1QgY2hhciAqbWVzc2FnZTsKK3sKKyAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorICAgIHBlcnJvcigoY2hhciAqKW1lc3NhZ2UpOyAgICAgICAgICAgIC8qIG11c3QgYmUgc3lzdGVtIGVycm9yIHRoZW4uLi4gKi8KKyAgZWxzZSB7CisgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCB8fCAqbWVzc2FnZSA9PSAnXDAnKQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG1lc3NhZ2UsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgfQorfQorCisvKgorU1VCU0VDVElPTgorCUJGRCBlcnJvciBoYW5kbGVyCisKKwlTb21lIEJGRCBmdW5jdGlvbnMgd2FudCB0byBwcmludCBtZXNzYWdlcyBkZXNjcmliaW5nIHRoZQorCXByb2JsZW0uICBUaGV5IGNhbGwgYSBCRkQgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi4gIFRoaXMKKwlmdW5jdGlvbiBtYXkgYmUgb3ZlcnJpZGVuIGJ5IHRoZSBwcm9ncmFtLgorCisJVGhlIEJGRCBlcnJvciBoYW5kbGVyIGFjdHMgbGlrZSBwcmludGYuCisKK0NPREVfRlJBR01FTlQKKy4KKy50eXBlZGVmIHZvaWQgKCpiZmRfZXJyb3JfaGFuZGxlcl90eXBlKSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOworLgorKi8KKworLyogVGhlIHByb2dyYW0gbmFtZSB1c2VkIHdoZW4gcHJpbnRpbmcgQkZEIGVycm9yIG1lc3NhZ2VzLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKl9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lOworCisvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIEJGRCBlcnJvciBtZXNzYWdlcy4gICovCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKworc3RhdGljIHZvaWQgX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgUEFSQU1TICgoY29uc3QgY2hhciAqcywgLi4uKSk7CisKK3N0YXRpYyB2b2lkCitfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAoY29uc3QgY2hhciAqcywgLi4uKQoreworICB2YV9saXN0IHA7CisKKyAgaWYgKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lICE9IE5VTEwpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTsKKyAgZWxzZQorICAgIGZwcmludGYgKHN0ZGVyciwgIkJGRDogIik7CisKKyAgdmFfc3RhcnQgKHAsIHMpOworCisgIHZmcHJpbnRmIChzdGRlcnIsIHMsIHApOworCisgIHZhX2VuZCAocCk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKK30KKworI2Vsc2UgLyogISBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpICovCisKK3N0YXRpYyB2b2lkIF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyICgpOworCitzdGF0aWMgdm9pZAorX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKK3sKKyAgdmFfbGlzdCBwOworICBjb25zdCBjaGFyICpzOworCisgIGlmIChfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSAhPSBOVUxMKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk7CisgIGVsc2UKKyAgICBmcHJpbnRmIChzdGRlcnIsICJCRkQ6ICIpOworCisgIHZhX3N0YXJ0IChwKTsKKworICBzID0gdmFfYXJnIChwLCBjb25zdCBjaGFyICopOworICB2ZnByaW50ZiAoc3RkZXJyLCBzLCBwKTsKKworICB2YV9lbmQgKHApOworCisgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Cit9CisKKyNlbmRpZiAvKiAhIGRlZmluZWQgKEFOU0lfUFJPVE9UWVBFUykgKi8KKworLyogVGhpcyBpcyBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHJvdXRpbmUgd2hpY2ggc2hvdWxkIGhhbmRsZSBCRkQKKyAgIGVycm9yIG1lc3NhZ2VzLiAgSXQgaXMgY2FsbGVkIHdoZW4gYSBCRkQgcm91dGluZSBlbmNvdW50ZXJzIGFuCisgICBlcnJvciBmb3Igd2hpY2ggaXQgd2FudHMgdG8gcHJpbnQgYSBtZXNzYWdlLiAgR29pbmcgdGhyb3VnaCBhCisgICBmdW5jdGlvbiBwb2ludGVyIHBlcm1pdHMgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IEJGRCB0byBpbnRlcmNlcHQKKyAgIHRoZSBtZXNzYWdlcyBhbmQgZGVhbCB3aXRoIHRoZW0gaXRzZWxmLiAgKi8KKworYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXIgPSBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlcjsKKworLyoKK0ZVTkNUSU9OCisJYmZkX3NldF9lcnJvcl9oYW5kbGVyCisKK1NZTk9QU0lTCisJYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBiZmRfc2V0X2Vycm9yX2hhbmRsZXIgKGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpOworCitERVNDUklQVElPTgorCVNldCB0aGUgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uICBSZXR1cm5zIHRoZSBwcmV2aW91cworCWZ1bmN0aW9uLgorKi8KKworYmZkX2Vycm9yX2hhbmRsZXJfdHlwZQorYmZkX3NldF9lcnJvcl9oYW5kbGVyIChwbmV3KQorICAgICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBuZXc7Cit7CisgIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgcG9sZDsKKworICBwb2xkID0gX2JmZF9lcnJvcl9oYW5kbGVyOworICBfYmZkX2Vycm9yX2hhbmRsZXIgPSBwbmV3OworICByZXR1cm4gcG9sZDsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUKKworU1lOT1BTSVMKKwl2b2lkIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChjb25zdCBjaGFyICopOworCitERVNDUklQVElPTgorCVNldCB0aGUgcHJvZ3JhbSBuYW1lIHRvIHVzZSB3aGVuIHByaW50aW5nIGEgQkZEIGVycm9yLiAgVGhpcworCWlzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlIGZvbGxvd2VkIGJ5IGEgY29sb24gYW5kCisJc3BhY2UuICBUaGUgc3RyaW5nIG11c3Qgbm90IGJlIGNoYW5nZWQgYWZ0ZXIgaXQgaXMgcGFzc2VkIHRvCisJdGhpcyBmdW5jdGlvbi4KKyovCisKK3ZvaWQKK2JmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSA9IG5hbWU7Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX2dldF9lcnJvcl9oYW5kbGVyCisKK1NZTk9QU0lTCisJYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBiZmRfZ2V0X2Vycm9yX2hhbmRsZXIgKHZvaWQpOworCitERVNDUklQVElPTgorCVJldHVybiB0aGUgQkZEIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uCisqLworCitiZmRfZXJyb3JfaGFuZGxlcl90eXBlCitiZmRfZ2V0X2Vycm9yX2hhbmRsZXIgKCkKK3sKKyAgcmV0dXJuIF9iZmRfZXJyb3JfaGFuZGxlcjsKK30KKwwKKy8qCitTRUNUSU9OCisJU3ltYm9scworKi8KKworLyoKK0ZVTkNUSU9OCisJYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZAorCitTWU5PUFNJUworCWxvbmcgYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUKKwlyZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBzZWN0aW9uIEB2YXJ7c2VjdH0KKwlhdHRhY2hlZCB0byBiZmQgQHZhcnthYmZkfS4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLgorCisqLworCisKK2xvbmcKK2JmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7Cit7CisgIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCAoYWJmZCwgYXNlY3QpKTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYworCitTWU5PUFNJUworCWxvbmcgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYworICAgICAgICAJKGJmZCAqYWJmZCwKKwkJYXNlY3Rpb24gKnNlYywKKwkJYXJlbGVudCAqKmxvYywKKwkJYXN5bWJvbAkqKnN5bXMpOworCitERVNDUklQVElPTgorCUNhbGwgdGhlIGJhY2sgZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlbiBCRkQKKwlAdmFye2FiZmR9IGFuZCB0cmFuc2xhdGUgdGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIHJlbG9jYXRpb24KKwlpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBAdmFye3NlY30gaW50byB0aGUgaW50ZXJuYWwgY2Fub25pY2FsCisJZm9ybS4gIFBsYWNlIHRoZSB0YWJsZSBpbnRvIG1lbW9yeSBhdCBAdmFye2xvY30sIHdoaWNoIGhhcworCWJlZW4gcHJlYWxsb2NhdGVkLCB1c3VhbGx5IGJ5IGEgY2FsbCB0bworCTw8YmZkX2dldF9yZWxvY191cHBlcl9ib3VuZD4+LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlbG9jcywgb3IKKwktMSBvbiBlcnJvci4KKworCVRoZSBAdmFye3N5bXN9IHRhYmxlIGlzIGFsc28gbmVlZGVkIGZvciBob3JyaWJsZSBpbnRlcm5hbCBtYWdpYworCXJlYXNvbnMuCisKKworKi8KK2xvbmcKK2JmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIGFzZWN0LCBsb2NhdGlvbiwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworICAgICBhcmVsZW50ICoqbG9jYXRpb247CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX3JlbG9jLAorCQkgICAoYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBzeW1ib2xzKSk7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9zZXRfcmVsb2MKKworU1lOT1BTSVMKKwl2b2lkIGJmZF9zZXRfcmVsb2MKKwkgIChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGFyZWxlbnQgKipyZWwsIHVuc2lnbmVkIGludCBjb3VudCkKKworREVTQ1JJUFRJT04KKwlTZXQgdGhlIHJlbG9jYXRpb24gcG9pbnRlciBhbmQgY291bnQgd2l0aGluCisJc2VjdGlvbiBAdmFye3NlY30gdG8gdGhlIHZhbHVlcyBAdmFye3JlbH0gYW5kIEB2YXJ7Y291bnR9LgorCVRoZSBhcmd1bWVudCBAdmFye2FiZmR9IGlzIGlnbm9yZWQuCisKKyovCisvKkFSR1NVU0VEKi8KK3ZvaWQKK2JmZF9zZXRfcmVsb2MgKGlnbm9yZV9hYmZkLCBhc2VjdCwgbG9jYXRpb24sIGNvdW50KQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworICAgICBhcmVsZW50ICoqbG9jYXRpb247CisgICAgIHVuc2lnbmVkIGludCBjb3VudDsKK3sKKyAgYXNlY3QtPm9yZWxvY2F0aW9uID0gbG9jYXRpb247CisgIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OworfQorCisvKgorRlVOQ1RJT04KKwliZmRfc2V0X2ZpbGVfZmxhZ3MKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9zZXRfZmlsZV9mbGFncyhiZmQgKmFiZmQsIGZsYWd3b3JkIGZsYWdzKTsKKworREVTQ1JJUFRJT04KKwlTZXQgdGhlIGZsYWcgd29yZCBpbiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LgorCisJUG9zc2libGUgZXJyb3JzIGFyZToKKwlvIDw8YmZkX2Vycm9yX3dyb25nX2Zvcm1hdD4+IC0gVGhlIHRhcmdldCBiZmQgd2FzIG5vdCBvZiBvYmplY3QgZm9ybWF0LgorCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtIFRoZSB0YXJnZXQgYmZkIHdhcyBvcGVuIGZvciByZWFkaW5nLgorCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCisJVGhlIGZsYWcgd29yZCBjb250YWluZWQgYSBiaXQgd2hpY2ggd2FzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZQorCXR5cGUgb2YgZmlsZS4gIEUuZy4sIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gc2V0IHRoZSA8PERfUEFHRUQ+PiBiaXQKKwlvbiBhIEJGRCBmb3JtYXQgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBkZW1hbmQgcGFnaW5nLgorCisqLworCitib29sZWFuCitiZmRfc2V0X2ZpbGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGZsYWd3b3JkIGZsYWdzOworeworICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QpIHsKKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkpIHsKKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgPSBmbGFnczsKKyAgaWYgKChmbGFncyAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKGFiZmQpKSAhPSBmbGFncykgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK3JldHVybiB0cnVlOworfQorCit2b2lkCitiZmRfYXNzZXJ0IChmaWxlLCBsaW5lKQorICAgICBjb25zdCBjaGFyICpmaWxlOworICAgICBpbnQgbGluZTsKK3sKKyAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJiZmQgYXNzZXJ0aW9uIGZhaWwgJXM6JWQiKSwgZmlsZSwgbGluZSk7Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX3NldF9zdGFydF9hZGRyZXNzCisKK1NZTk9QU0lTCisgCWJvb2xlYW4gYmZkX3NldF9zdGFydF9hZGRyZXNzKGJmZCAqYWJmZCwgYmZkX3ZtYSB2bWEpOworCitERVNDUklQVElPTgorCU1ha2UgQHZhcnt2bWF9IHRoZSBlbnRyeSBwb2ludCBvZiBvdXRwdXQgQkZEIEB2YXJ7YWJmZH0uCisKK1JFVFVSTlMKKwlSZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvdGhlcndpc2UuCisqLworCitib29sZWFuCitiZmRfc2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCwgdm1hKQorYmZkICphYmZkOworYmZkX3ZtYSB2bWE7Cit7CisgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSB2bWE7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qCitGVU5DVElPTgorCWJmZF9nZXRfbXRpbWUKKworU1lOT1BTSVMKKwlsb25nIGJmZF9nZXRfbXRpbWUoYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgKGFzIHJlYWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0sIG9yCisJZnJvbSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFyY2hpdmUgbWVtYmVycykuCisKKyovCisKK2xvbmcKK2JmZF9nZXRfbXRpbWUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgRklMRSAqZnA7CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICBpZiAoYWJmZC0+bXRpbWVfc2V0KQorICAgIHJldHVybiBhYmZkLT5tdGltZTsKKworICBmcCA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOworICBpZiAoMCAhPSBmc3RhdCAoZmlsZW5vIChmcCksICZidWYpKQorICAgIHJldHVybiAwOworCisgIGFiZmQtPm10aW1lID0gYnVmLnN0X210aW1lOwkJLyogU2F2ZSB2YWx1ZSBpbiBjYXNlIGFueW9uZSB3YW50cyBpdCAqLworICByZXR1cm4gYnVmLnN0X210aW1lOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfZ2V0X3NpemUKKworU1lOT1BTSVMKKwlsb25nIGJmZF9nZXRfc2l6ZShiZmQgKmFiZmQpOworCitERVNDUklQVElPTgorCVJldHVybiB0aGUgZmlsZSBzaXplIChhcyByZWFkIGZyb20gZmlsZSBzeXN0ZW0pIGZvciB0aGUgZmlsZQorCWFzc29jaWF0ZWQgd2l0aCBCRkQgQHZhcnthYmZkfS4KKworCVRoZSBpbml0aWFsIG1vdGl2YXRpb24gZm9yLCBhbmQgdXNlIG9mLCB0aGlzIHJvdXRpbmUgaXMgbm90CisJc28gd2UgY2FuIGdldCB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb2JqZWN0IHRoZSBCRkQgYXBwbGllcyB0bywgc2luY2UKKwl0aGF0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsbHkgcG9zc2libGUgKGFyY2hpdmUgbWVtYmVycyBmb3IgZXhhbXBsZSkuCisJSXQgd291bGQgYmUgaWRlYWwgaWYgc29tZW9uZSBjb3VsZCBldmVudHVhbGx5IG1vZGlmeQorCWl0IHNvIHRoYXQgc3VjaCByZXN1bHRzIHdlcmUgZ3VhcmFudGVlZC4KKworCUluc3RlYWQsIHdlIHdhbnQgdG8gYXNrIHF1ZXN0aW9ucyBsaWtlICJpcyB0aGlzIE5OTiBieXRlIHNpemVkCisJb2JqZWN0IEknbSBhYm91dCB0byB0cnkgcmVhZCBmcm9tIGZpbGUgb2Zmc2V0IFlZWSByZWFzb25hYmxlPyIKKwlBcyBhcyBleGFtcGxlIG9mIHdoZXJlIHdlIG1pZ2h0IGRvIHRoaXMsIHNvbWUgb2JqZWN0IGZvcm1hdHMKKwl1c2Ugc3RyaW5nIHRhYmxlcyBmb3Igd2hpY2ggdGhlIGZpcnN0IDw8c2l6ZW9mKGxvbmcpPj4gYnl0ZXMgb2YgdGhlCisJdGFibGUgY29udGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgaXRzZWxmLCBpbmNsdWRpbmcgdGhlIHNpemUgYnl0ZXMuCisJSWYgYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gcmVhZCB3aGF0IGl0IHRoaW5rcyBpcyBvbmUgb2YgdGhlc2UKKwlzdHJpbmcgdGFibGVzLCB3aXRob3V0IHNvbWUgd2F5IHRvIHZhbGlkYXRlIHRoZSBzaXplLCBhbmQgZm9yCisJc29tZSByZWFzb24gdGhlIHNpemUgaXMgd3JvbmcgKGJ5dGUgc3dhcHBpbmcgZXJyb3IsIHdyb25nIGxvY2F0aW9uCisJZm9yIHRoZSBzdHJpbmcgdGFibGUsIGV0Yy4pLCB0aGUgb25seSBjbHVlIGlzIGxpa2VseSB0byBiZSBhIHJlYWQKKwllcnJvciB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgdGhlIHRhYmxlLCBvciBhICJ2aXJ0dWFsIG1lbW9yeQorCWV4aGF1c3RlZCIgZXJyb3Igd2hlbiBpdCB0cmllcyB0byBhbGxvY2F0ZSAxNSBiYXppbGxvbiBieXRlcworCW9mIHNwYWNlIGZvciB0aGUgMTUgYmF6aWxsb24gYnl0ZSB0YWJsZSBpdCBpcyBhYm91dCB0byByZWFkLgorCVRoaXMgZnVuY3Rpb24gYXQgbGVhc3QgYWxsb3dzIHVzIHRvIGFuc3dlciB0aGUgcXVlc2lvbiwgImlzIHRoZQorCXNpemUgcmVhc29uYWJsZT8iLgorKi8KKworbG9uZworYmZkX2dldF9zaXplIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIEZJTEUgKmZwOworICBzdHJ1Y3Qgc3RhdCBidWY7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCisgICAgcmV0dXJuICgoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW0pLT5zaXplOworCisgIGZwID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7CisgIGlmICgwICE9IGZzdGF0IChmaWxlbm8gKGZwKSwgJmJ1ZikpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGJ1Zi5zdF9zaXplOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfZ2V0X2dwX3NpemUKKworU1lOT1BTSVMKKwlpbnQgYmZkX2dldF9ncF9zaXplKGJmZCAqYWJmZCk7CisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQCisJcmVnaXN0ZXIgdW5kZXIgTUlQUyBFQ09GRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieSB0aGUgPDwtRz4+CisJYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgorKi8KKworaW50CitiZmRfZ2V0X2dwX3NpemUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQorICAgIHsKKyAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKKwlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemU7CisgICAgICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisJcmV0dXJuIGVsZl9ncF9zaXplIChhYmZkKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfc2V0X2dwX3NpemUKKworU1lOT1BTSVMKKwl2b2lkIGJmZF9zZXRfZ3Bfc2l6ZShiZmQgKmFiZmQsIGludCBpKTsKKworREVTQ1JJUFRJT04KKwlTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AKKwlyZWdpc3RlciB1bmRlciBFQ09GRiBvciBNSVBTIEVMRi4gIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieQorCXRoZSA8PC1HPj4gYXJndW1lbnQgdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IgbGlua2VyLgorKi8KKwordm9pZAorYmZkX3NldF9ncF9zaXplIChhYmZkLCBpKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBpOworeworICAvKiBEb24ndCB0cnkgdG8gc2V0IEdQIHNpemUgb24gYW4gYXJjaGl2ZSBvciBjb3JlIGZpbGUhICovCisgIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKKyAgICByZXR1cm47CisgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKKyAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSA9IGk7CisgIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICBlbGZfZ3Bfc2l6ZSAoYWJmZCkgPSBpOworfQorCisvKiBHZXQgdGhlIEdQIHZhbHVlLiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHNvbWUgb2YgdGhlCisgICByZWxvY2F0aW9uIHNwZWNpYWxfZnVuY3Rpb24gcm91dGluZXMgb24gdGFyZ2V0cyB3aGljaCBzdXBwb3J0IGEgR1AKKyAgIHJlZ2lzdGVyLiAgKi8KKworYmZkX3ZtYQorX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGFiZmQtPmZvcm1hdCA9PSBiZmRfb2JqZWN0KQorICAgIHsKKyAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKKwlyZXR1cm4gZWNvZmZfZGF0YSAoYWJmZCktPmdwOworICAgICAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorCXJldHVybiBlbGZfZ3AgKGFiZmQpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFNldCB0aGUgR1AgdmFsdWUuICAqLworCit2b2lkCitfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgdikKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfdm1hIHY7Cit7CisgIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkKKyAgICByZXR1cm47CisgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKKyAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSB2OworICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgZWxmX2dwIChhYmZkKSA9IHY7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9zY2FuX3ZtYQorCitTWU5PUFNJUworCWJmZF92bWEgYmZkX3NjYW5fdm1hKENPTlNUIGNoYXIgKnN0cmluZywgQ09OU1QgY2hhciAqKmVuZCwgaW50IGJhc2UpOworCitERVNDUklQVElPTgorCUNvbnZlcnQsIGxpa2UgPDxzdHJ0b3VsPj4sIGEgbnVtZXJpY2FsIGV4cHJlc3Npb24KKwlAdmFye3N0cmluZ30gaW50byBhIDw8YmZkX3ZtYT4+IGludGVnZXIsIGFuZCByZXR1cm4gdGhhdCBpbnRlZ2VyLgorCShUaG91Z2ggd2l0aG91dCBhcyBtYW55IGJlbGxzIGFuZCB3aGlzdGxlcyBhcyA8PHN0cnRvdWw+Pi4pCisJVGhlIGV4cHJlc3Npb24gaXMgYXNzdW1lZCB0byBiZSB1bnNpZ25lZCAoaS5lLiwgcG9zaXRpdmUpLgorCUlmIGdpdmVuIGEgQHZhcntiYXNlfSwgaXQgaXMgdXNlZCBhcyB0aGUgYmFzZSBmb3IgY29udmVyc2lvbi4KKwlBIGJhc2Ugb2YgMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIGludGVycHJldCB0aGUgc3RyaW5nCisJaW4gaGV4IGlmIGEgbGVhZGluZyAiMHgiIG9yICIwWCIgaXMgZm91bmQsIG90aGVyd2lzZQorCWluIG9jdGFsIGlmIGEgbGVhZGluZyB6ZXJvIGlzIGZvdW5kLCBvdGhlcndpc2UgaW4gZGVjaW1hbC4KKworCU92ZXJmbG93IGlzIG5vdCBkZXRlY3RlZC4KKyovCisKK2JmZF92bWEKK2JmZF9zY2FuX3ZtYSAoc3RyaW5nLCBlbmQsIGJhc2UpCisgICAgIENPTlNUIGNoYXIgKnN0cmluZzsKKyAgICAgQ09OU1QgY2hhciAqKmVuZDsKKyAgICAgaW50IGJhc2U7Cit7CisgIGJmZF92bWEgdmFsdWU7CisgIGludCBkaWdpdDsKKworICAvKiBMZXQgdGhlIGhvc3QgZG8gaXQgaWYgcG9zc2libGUuICAqLworICBpZiAoc2l6ZW9mKGJmZF92bWEpIDw9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyAgICByZXR1cm4gKGJmZF92bWEpIHN0cnRvdWwgKHN0cmluZywgKGNoYXIgKiopIGVuZCwgYmFzZSk7CisKKyAgLyogQSBuZWdhdGl2ZSBiYXNlIG1ha2VzIG5vIHNlbnNlLCBhbmQgd2Ugb25seSBuZWVkIHRvIGdvIGFzIGhpZ2ggYXMgaGV4LiAgKi8KKyAgaWYgKChiYXNlIDwgMCkgfHwgKGJhc2UgPiAxNikpCisgICAgcmV0dXJuIChiZmRfdm1hKSAwOworCisgIGlmIChiYXNlID09IDApCisgICAgeworICAgICAgaWYgKHN0cmluZ1swXSA9PSAnMCcpCisJeworCSAgaWYgKChzdHJpbmdbMV0gPT0gJ3gnKSB8fCAoc3RyaW5nWzFdID09ICdYJykpCisJICAgIGJhc2UgPSAxNjsKKwkgIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBhbGxvdyAiMGIiIG9yICIwQiIgdG8gc2V0IGJhc2UgdG8gMj8gKi8KKwkgIGVsc2UKKwkgICAgYmFzZSA9IDg7CisJfQorICAgICAgZWxzZQorCWJhc2UgPSAxMDsKKyAgICB9CisgIGlmICgoYmFzZSA9PSAxNikgJiYKKyAgICAgIChzdHJpbmdbMF0gPT0gJzAnKSAmJiAoKHN0cmluZ1sxXSA9PSAneCcpIHx8IChzdHJpbmdbMV0gPT0gJ1gnKSkpCisgICAgc3RyaW5nICs9IDI7CisgIC8qIFhYWCBzaG91bGQgd2UgYWxzbyBza2lwIG92ZXIgIjBiIiBvciAiMEIiIGlmIGJhc2UgaXMgMj8gKi8KKyAgICAKKy8qIFNwZWVkIGNvdWxkIGJlIGltcHJvdmVkIHdpdGggYSB0YWJsZSBsaWtlIGhleF92YWx1ZVtdIGluIGdhcy4gICovCisjZGVmaW5lIEhFWF9WQUxVRShjKSBcCisgIChpc3hkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpCQkJCQlcCisgICA/IChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykJCQkJXAorICAgICAgPyAoYyAtICcwJykJCQkJCQlcCisgICAgICA6ICgxMCArIGMgLSAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSkpCVwKKyAgIDogNDIpCisKKyAgZm9yICh2YWx1ZSA9IDA7IChkaWdpdCA9IEhFWF9WQUxVRSgqc3RyaW5nKSkgPCBiYXNlOyBzdHJpbmcrKykKKyAgICB7CisgICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGRpZ2l0OworICAgIH0KKworICBpZiAoZW5kKQorICAgICplbmQgPSBzdHJpbmc7CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGJmZCAqaWJmZCwgYmZkICpvYmZkKTsKKworREVTQ1JJUFRJT04KKwlDb3B5IHByaXZhdGUgQkZEIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBAdmFye2liZmR9IHRvIHRoZSAKKwl0aGUgQkZEIEB2YXJ7b2JmZH0uICBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLgorCVBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgorCisJbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCisJTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uCisKKy4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoaWJmZCwgb2JmZCkgXAorLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLCBcCisuCQkoaWJmZCwgb2JmZCkpCisKKyovCisKKy8qCitGVU5DVElPTgorCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShiZmQgKmliZmQsIGJmZCAqb2JmZCk7CisKK0RFU0NSSVBUSU9OCisJTWVyZ2UgcHJpdmF0ZSBCRkQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIEB2YXJ7aWJmZH0gdG8gdGhlIAorCXRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KKwlvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKKworCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQorCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgorCisuI2RlZmluZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCisuICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBcCisuCQkoaWJmZCwgb2JmZCkpCisKKyovCisKKy8qCitGVU5DVElPTgorCWJmZF9zZXRfcHJpdmF0ZV9mbGFncworCitTWU5PUFNJUworCWJvb2xlYW4gYmZkX3NldF9wcml2YXRlX2ZsYWdzKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpOworCitERVNDUklQVElPTgorCVNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KKwlSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG9uIGVycm9yLiAgUG9zc2libGUgZXJyb3IKKwlyZXR1cm5zIGFyZToKKworCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQorCU5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LgorCisuI2RlZmluZSBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYWJmZCwgZmxhZ3MpIFwKKy4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NldF9wcml2YXRlX2ZsYWdzLCBcCisuCQkoYWJmZCwgZmxhZ3MpKQorCisqLworCisvKgorRlVOQ1RJT04KKwlzdHVmZgorCitERVNDUklQVElPTgorCVN0dWZmIHdoaWNoIHNob3VsZCBiZSBkb2N1bWVudGVkOgorCisuI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKKy4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NpemVvZl9oZWFkZXJzLCAoYWJmZCwgcmVsb2MpKQorLgorLiNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCisuICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5kX25lYXJlc3RfbGluZSwgIChhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkpCisuCisuICAgICAgIHsqIERvIHRoZXNlIHRocmVlIGRvIGFueXRoaW5nIHVzZWZ1bCBhdCBhbGwsIGZvciBhbnkgYmFjayBlbmQ/ICAqfQorLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAorLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19zdGFydCwgKGFiZmQpKQorLgorLiNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKKy4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fZW5kLCAoYWJmZCkpCisuCisuI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKKy4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgKGFiZmQsIHNlY3Rpb24pKQorLgorLgorLiNkZWZpbmUgYmZkX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCkgXAorLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc3RhdF9hcmNoX2VsdCwoYWJmZCwgc3RhdCkpCisuCisuI2RlZmluZSBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcChhYmZkKSBcCisuICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLCAoYWJmZCkpCisuCisuI2RlZmluZSBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoKVwKKy4gICAgICAgIEJGRF9TRU5EICggYWJmZCwgX2JmZF9zZXRfYXJjaF9tYWNoLCAoYWJmZCwgYXJjaCwgbWFjaCkpCisuCisuI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSBcCisuICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlbGF4X3NlY3Rpb24sIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSkKKy4KKy4jZGVmaW5lIGJmZF9nY19zZWN0aW9ucyhhYmZkLCBsaW5rX2luZm8pIFwKKy4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2Nfc2VjdGlvbnMsIChhYmZkLCBsaW5rX2luZm8pKQorLgorLiNkZWZpbmUgYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoYWJmZCkgXAorLglCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCAoYWJmZCkpCisuCisuI2RlZmluZSBiZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKSBcCisuCUJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfYWRkX3N5bWJvbHMsIChhYmZkLCBpbmZvKSkKKy4KKy4jZGVmaW5lIGJmZF9maW5hbF9saW5rKGFiZmQsIGluZm8pIFwKKy4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZmluYWxfbGluaywgKGFiZmQsIGluZm8pKQorLgorLiNkZWZpbmUgYmZkX2ZyZWVfY2FjaGVkX2luZm8oYWJmZCkgXAorLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLCAoYWJmZCkpCisuCisuI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKKy4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCisuCisuI2RlZmluZSBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YShhYmZkLCBmaWxlKVwKKy4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSwgKGFiZmQsIGZpbGUpKQorLgorLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYihhYmZkLCBhc3ltYm9scykgXAorLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsIChhYmZkLCBhc3ltYm9scykpCisuCisuI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoYWJmZCkgXAorLglCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwgKGFiZmQpKQorLgorLiNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKGFiZmQsIGFyZWxzLCBhc3ltcykgXAorLglCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYywgKGFiZmQsIGFyZWxzLCBhc3ltcykpCisuCisuZXh0ZXJuIGJmZF9ieXRlICpiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisuCVBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorLgkJICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYmZkX2J5dGUgKiwKKy4JCSAgYm9vbGVhbiwgYXN5bWJvbCAqKikpOworLgorCisqLworCitiZmRfYnl0ZSAqCitiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCisJCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIGJmZCAqYWJmZDI7CisgIGJmZF9ieXRlICooKmZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLCBib29sZWFuLAorCQkJICAgYXN5bWJvbCAqKikpOworCisgIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorICAgIHsKKyAgICAgIGFiZmQyID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKKyAgICAgIGlmIChhYmZkMiA9PSAwKQorCWFiZmQyID0gYWJmZDsKKyAgICB9CisgIGVsc2UKKyAgICBhYmZkMiA9IGFiZmQ7CisgIGZuID0gYWJmZDItPnh2ZWMtPl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzOworCisgIHJldHVybiAoKmZuKSAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpOworfQorCisvKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUxGIHByb2dyYW0gaGVhZGVyLiAgKi8KKworYm9vbGVhbgorYmZkX3JlY29yZF9waGRyIChhYmZkLCB0eXBlLCBmbGFnc192YWxpZCwgZmxhZ3MsIGF0X3ZhbGlkLCBhdCwKKwkJIGluY2x1ZGVzX2ZpbGVoZHIsIGluY2x1ZGVzX3BoZHJzLCBjb3VudCwgc2VjcykKKyAgICAgYmZkICphYmZkOworICAgICB1bnNpZ25lZCBsb25nIHR5cGU7CisgICAgIGJvb2xlYW4gZmxhZ3NfdmFsaWQ7CisgICAgIGZsYWd3b3JkIGZsYWdzOworICAgICBib29sZWFuIGF0X3ZhbGlkOworICAgICBiZmRfdm1hIGF0OworICAgICBib29sZWFuIGluY2x1ZGVzX2ZpbGVoZHI7CisgICAgIGJvb2xlYW4gaW5jbHVkZXNfcGhkcnM7CisgICAgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgICAgYXNlY3Rpb24gKipzZWNzOworeworICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOworCisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQorICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKKwkJICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQorCQkgICArICgoc2l6ZV90KSBjb3VudCAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbS0+bmV4dCA9IE5VTEw7CisgIG0tPnBfdHlwZSA9IHR5cGU7CisgIG0tPnBfZmxhZ3MgPSBmbGFnczsKKyAgbS0+cF9wYWRkciA9IGF0OworICBtLT5wX2ZsYWdzX3ZhbGlkID0gZmxhZ3NfdmFsaWQ7CisgIG0tPnBfcGFkZHJfdmFsaWQgPSBhdF92YWxpZDsKKyAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IGluY2x1ZGVzX2ZpbGVoZHI7CisgIG0tPmluY2x1ZGVzX3BoZHJzID0gaW5jbHVkZXNfcGhkcnM7CisgIG0tPmNvdW50ID0gY291bnQ7CisgIGlmIChjb3VudCA+IDApCisgICAgbWVtY3B5IChtLT5zZWN0aW9ucywgc2VjcywgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKKworICBmb3IgKHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCisgICAgOworICAqcG0gPSBtOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmZkL2JpbmFyeS5jIGIvYmZkL2JpbmFyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjNmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvYmluYXJ5LmMKQEAgLTAsMCArMSwzODYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgYmluYXJ5IG9iamVjdHMuCisgICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyBhIEJGRCBiYWNrZW5kIHdoaWNoIG1heSBiZSB1c2VkIHRvIHdyaXRlIGJpbmFyeSBvYmplY3RzLgorICAgSXQgbWF5IG9ubHkgYmUgdXNlZCBmb3Igb3V0cHV0LCBub3QgaW5wdXQuICBUaGUgaW50ZW50aW9uIGlzIHRoYXQKKyAgIHRoaXMgbWF5IGJlIHVzZWQgYXMgYW4gb3V0cHV0IGZvcm1hdCBmb3Igb2JqY29weSBpbiBvcmRlciB0bworICAgZ2VuZXJhdGUgcmF3IGJpbmFyeSBkYXRhLgorCisgICBUaGlzIGlzIHZlcnkgc2ltcGxlLiAgVGhlIG9ubHkgY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhlIHJlYWwgZGF0YQorICAgd2lsbCBzdGFydCBhdCBzb21lIGFkZHJlc3MgWCwgYW5kIGluIHNvbWUgY2FzZXMgd2Ugd2lsbCBub3Qgd2FudCB0bworICAgaW5jbHVkZSBYIHplcm9lcyBqdXN0IHRvIGdldCB0byB0aGF0IHBvaW50LiAgU2luY2UgdGhlIHN0YXJ0CisgICBhZGRyZXNzIGlzIG5vdCBtZWFuaW5nZnVsIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCwgd2UgdXNlIGl0CisgICBpbnN0ZWFkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgemVyb2VzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mCisgICB0aGUgZmlsZS4gIG9iamNvcHkgY29vcGVyYXRlcyBieSBzcGVjaWFsbHkgc2V0dGluZyB0aGUgc3RhcnQKKyAgIGFkZHJlc3MgdG8gemVybyBieSBkZWZhdWx0LiAgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworLyogQW55IGJmZCB3ZSBjcmVhdGUgYnkgcmVhZGluZyBhIGJpbmFyeSBmaWxlIGhhcyB0aHJlZSBzeW1ib2xzOgorICAgYSBzdGFydCBzeW1ib2wsIGFuIGVuZCBzeW1ib2wsIGFuZCBhbiBhYnNvbHV0ZSBsZW5ndGggc3ltYm9sLiAgKi8KKyNkZWZpbmUgQklOX1NZTVMgMworCitzdGF0aWMgYm9vbGVhbiBiaW5hcnlfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpiaW5hcnlfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGJpbmFyeV9nZXRfc2VjdGlvbl9jb250ZW50cworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOworc3RhdGljIGxvbmcgYmluYXJ5X2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjaGFyICptYW5nbGVfbmFtZSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7CitzdGF0aWMgbG9uZyBiaW5hcnlfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworc3RhdGljIGFzeW1ib2wgKmJpbmFyeV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHZvaWQgYmluYXJ5X2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBpbnQgYmluYXJ5X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7CisKKy8qIENyZWF0ZSBhIGJpbmFyeSBvYmplY3QuICBJbnZva2VkIHZpYSBiZmRfc2V0X2Zvcm1hdC4gICovCisKK3N0YXRpYyBib29sZWFuCitiaW5hcnlfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYmluYXJ5IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKKyAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcworICAgYmVpbmcgYmluYXJ5LiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorYmluYXJ5X29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgIGFzZWN0aW9uICpzZWM7CisKKyAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgYWJmZC0+c3ltY291bnQgPSBCSU5fU1lNUzsKKworICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLworICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KKyAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7CisgIGlmIChzZWMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTOworICBzZWMtPnZtYSA9IDA7CisgIHNlYy0+X3Jhd19zaXplID0gc3RhdGJ1Zi5zdF9zaXplOworICBzZWMtPmZpbGVwb3MgPSAwOworCisgIGFiZmQtPnRkYXRhLmFueSA9IChQVFIpIHNlYzsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKworI2RlZmluZSBiaW5hcnlfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCisjZGVmaW5lIGJpbmFyeV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKyNkZWZpbmUgYmluYXJ5X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKKworLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3JlYWQgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgbG9uZworYmluYXJ5X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIChCSU5fU1lNUyArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOworfQorCisvKiBDcmVhdGUgYSBzeW1ib2wgbmFtZSBiYXNlZCBvbiB0aGUgYmZkJ3MgZmlsZW5hbWUuICAqLworCitzdGF0aWMgY2hhciAqCittYW5nbGVfbmFtZSAoYWJmZCwgc3VmZml4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKnN1ZmZpeDsKK3sKKyAgaW50IHNpemU7CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciAqcDsKKworICBzaXplID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpCisJICArIHN0cmxlbiAoc3VmZml4KQorCSAgKyBzaXplb2YgIl9iaW5hcnlfXyIpOworCisgIGJ1ZiA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CisgIGlmIChidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gIiI7CisKKyAgc3ByaW50ZiAoYnVmLCAiX2JpbmFyeV8lc18lcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdWZmaXgpOworCisgIC8qIENoYW5nZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHVuZGVyc2NvcmVzLiAgKi8KKyAgZm9yIChwID0gYnVmOyAqcDsgcCsrKQorICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkpCisgICAgICAqcCA9ICdfJzsKKworICByZXR1cm4gYnVmOworfQorCisvKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisKK3N0YXRpYyBsb25nCitiaW5hcnlfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKiphbG9jYXRpb247Cit7CisgIGFzZWN0aW9uICpzZWMgPSAoYXNlY3Rpb24gKikgYWJmZC0+dGRhdGEuYW55OworICBhc3ltYm9sICpzeW1zOworICB1bnNpZ25lZCBpbnQgaTsKKworICBzeW1zID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBCSU5fU1lNUyAqIHNpemVvZiAoYXN5bWJvbCkpOworICBpZiAoc3ltcyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBTdGFydCBzeW1ib2wuICAqLworICBzeW1zWzBdLnRoZV9iZmQgPSBhYmZkOworICBzeW1zWzBdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInN0YXJ0Iik7CisgIHN5bXNbMF0udmFsdWUgPSAwOworICBzeW1zWzBdLmZsYWdzID0gQlNGX0dMT0JBTDsKKyAgc3ltc1swXS5zZWN0aW9uID0gc2VjOworICBzeW1zWzBdLnVkYXRhLnAgPSBOVUxMOworCisgIC8qIEVuZCBzeW1ib2wuICAqLworICBzeW1zWzFdLnRoZV9iZmQgPSBhYmZkOworICBzeW1zWzFdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgImVuZCIpOworICBzeW1zWzFdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7CisgIHN5bXNbMV0uZmxhZ3MgPSBCU0ZfR0xPQkFMOworICBzeW1zWzFdLnNlY3Rpb24gPSBzZWM7CisgIHN5bXNbMV0udWRhdGEucCA9IE5VTEw7CisKKyAgLyogU2l6ZSBzeW1ib2wuICAqLworICBzeW1zWzJdLnRoZV9iZmQgPSBhYmZkOworICBzeW1zWzJdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInNpemUiKTsKKyAgc3ltc1syXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOworICBzeW1zWzJdLmZsYWdzID0gQlNGX0dMT0JBTDsKKyAgc3ltc1syXS5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgc3ltc1syXS51ZGF0YS5wID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgQklOX1NZTVM7IGkrKykKKyAgICAqYWxvY2F0aW9uKysgPSBzeW1zKys7CisgICphbG9jYXRpb24gPSBOVUxMOworCisgIHJldHVybiBCSU5fU1lNUzsKK30KKworLyogTWFrZSBhbiBlbXB0eSBzeW1ib2wuICAqLworCitzdGF0aWMgYXN5bWJvbCAqCitiaW5hcnlfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Cit9CisKKyNkZWZpbmUgYmluYXJ5X3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKKworLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KKworc3RhdGljIHZvaWQKK2JpbmFyeV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBzeW1ib2xfaW5mbyAqcmV0OworeworICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKK30KKworI2RlZmluZSBiaW5hcnlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBiaW5hcnlfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCisjZGVmaW5lIGJpbmFyeV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQorI2RlZmluZSBiaW5hcnlfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBiaW5hcnlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBiaW5hcnlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCisKKyNkZWZpbmUgYmluYXJ5X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQorI2RlZmluZSBiaW5hcnlfY2Fub25pY2FsaXplX3JlbG9jIFwKKyAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCisjZGVmaW5lIGJpbmFyeV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKKworLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYSBiaW5hcnkgZmlsZS4gICovCisjZGVmaW5lIGJpbmFyeV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCisKKy8qIFdyaXRlIHNlY3Rpb24gY29udGVudHMgb2YgYSBiaW5hcnkgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBkYXRhOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKK3sKKyAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKKyAgICB7CisgICAgICBib29sZWFuIGZvdW5kX2xvdzsKKyAgICAgIGJmZF92bWEgbG93OworICAgICAgYXNlY3Rpb24gKnM7CisKKyAgICAgIC8qIFRoZSBsb3dlc3Qgc2VjdGlvbiBMTUEgc2V0cyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydAorICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSB1c2UgdGhpcyB0byBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQorICAgICAgICAgc2VjdGlvbnMuICAqLworICAgICAgZm91bmRfbG93ID0gZmFsc2U7CisgICAgICBsb3cgPSAwOworICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJaWYgKCgocy0+ZmxhZ3MKKwkgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfTkVWRVJfTE9BRCkpCisJICAgICA9PSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKKwkgICAgJiYgKCEgZm91bmRfbG93IHx8IHMtPmxtYSA8IGxvdykpCisJICB7CisJICAgIGxvdyA9IHMtPmxtYTsKKwkgICAgZm91bmRfbG93ID0gdHJ1ZTsKKwkgIH0KKworICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgcy0+ZmlsZXBvcyA9IHMtPmxtYSAtIGxvdzsKKworCSAgLyogU2tpcCBmb2xsb3dpbmcgd2FybmluZyBjaGVjayBmb3Igc2VjdGlvbnMgdGhhdCB3aWxsIG5vdAorCSAgICAgb2NjdXB5IGZpbGUgc3BhY2UuICAqLyAKKwkgIGlmICgocy0+ZmxhZ3MKKwkgICAgICAgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKKwkgICAgICAhPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQykpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBJZiBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGEgYmluYXJ5IGZpbGUgZnJvbSBhIGJmZCB3aXRoCisJICAgICBMTUEncyBhbGwgb3ZlciB0aGUgcGxhY2UsIGh1Z2UgKHNwYXJzZT8pIGJpbmFyeSBmaWxlcyBtYXkKKwkgICAgIHJlc3VsdC4gIFRoaXMgY29uZGl0aW9uIGF0dGVtcHRzIHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbgorCSAgICAgYW5kIHByaW50IGEgd2FybmluZy4gIEJldHRlciBoZXVyaXN0aWNzIHdvdWxkIGJlIG5pY2UgdG8KKwkgICAgIGhhdmUuICovCisKKwkgIGlmIChzLT5maWxlcG9zIDwgMCkKKwkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgICAgKF8oIldhcm5pbmc6IFdyaXRpbmcgc2VjdGlvbiBgJXMnIHRvIGh1Z2UgKGllIG5lZ2F0aXZlKSBmaWxlIG9mZnNldCAweCVseC4iKSwKKwkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpLAorCSAgICAgICAodW5zaWduZWQgbG9uZykgcy0+ZmlsZXBvcyk7CisJfQorCisgICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKKyAgICB9CisKKyAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgYW55dGhpbmcgZm9yIGEgc2VjdGlvbiB0aGF0IGlzIG5laXRoZXIKKyAgICAgbG9hZGVkIG5vciBhbGxvY2F0ZWQuICBUaGUgY29udGVudHMgb2Ygc3VjaCBhIHNlY3Rpb24gYXJlIG5vdAorICAgICBtZWFuaW5nZnVsIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KKyAgaWYgKChzZWMtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChzZWMtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOworfQorCisvKiBObyBzcGFjZSBpcyByZXF1aXJlZCBmb3IgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIGludAorYmluYXJ5X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlYzsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgYmluYXJ5X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgYmluYXJ5X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgYmluYXJ5X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucworI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIGJpbmFyeV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluaworI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCisjZGVmaW5lIGJpbmFyeV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKK2NvbnN0IGJmZF90YXJnZXQgYmluYXJ5X3ZlYyA9Cit7CisgICJiaW5hcnkiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCS8qIGZsYXZvdXIgKi8KKyAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogYnl0ZW9yZGVyICovCisgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIGhlYWRlcl9ieXRlb3JkZXIgKi8KKyAgRVhFQ19QLAkJCS8qIG9iamVjdF9mbGFncyAqLworICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCisgICB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTKSwgLyogc2VjdGlvbl9mbGFncyAqLworICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLworICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICBfYmZkX2R1bW15X3RhcmdldCwKKyAgICBiaW5hcnlfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgIH0sCisgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICBiZmRfZmFsc2UsCisgICAgYmluYXJ5X21rb2JqZWN0LAorICAgIGJmZF9mYWxzZSwKKyAgICBiZmRfZmFsc2UsCisgIH0sCisgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgYmZkX2ZhbHNlLAorICAgIGJmZF90cnVlLAorICAgIGJmZF9mYWxzZSwKKyAgICBiZmRfZmFsc2UsCisgIH0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmluYXJ5KSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGJpbmFyeSksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmluYXJ5KSwKKyAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJpbmFyeSksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJpbmFyeSksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBOVUxMCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2JvdXQuYyBiL2JmZC9ib3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmMTBmNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ib3V0LmMKQEAgLTAsMCArMSwxNTM0IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBiLm91dCBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJnZW5saW5rLmgiCisjaW5jbHVkZSAiYm91dC5oIgorCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KKworCitzdGF0aWMgaW50IGFsaWduY29kZSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorCQkJICAgICAgYXJlbGVudCAqciwgdW5zaWduZWQgaW50IHNocmluaykpOworc3RhdGljIHZvaWQgcGVyZm9ybV9zbGlwIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHNsaXAsCisJCQkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX3ZtYSB2YWx1ZSkpOworc3RhdGljIGJvb2xlYW4gYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmJfb3V0X2NhbGxiYWNrIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqeF9jYWxsYmFjaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXJlbGVudCAqLCBQVFIgc3JjLCBQVFIgZHN0LAorCSAgIGFzZWN0aW9uICopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY2FsbGpfY2FsbGJhY2sKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIGRhdGEsCisJICAgdW5zaWduZWQgaW50IHNyY2lkeCwgdW5zaWduZWQgaW50IGRzdGlkeCwgYXNlY3Rpb24gKiwgYm9vbGVhbikpOworc3RhdGljIGJmZF92bWEgZ2V0X3ZhbHVlIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkgIGFzZWN0aW9uICopKTsKK3N0YXRpYyBpbnQgYWJzMzJjb2RlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICosCisJCQkgICAgICB1bnNpZ25lZCBpbnQsIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAorCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJCWJvb2xlYW4gKikpOworc3RhdGljIGJmZF9ieXRlICpiX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKKwkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7CisKKy8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKKyAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCisKK3ZvaWQKK2JvdXRfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKKworICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLworICBleGVjcC0+YV9pbmZvICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOworICBleGVjcC0+YV90ZXh0ICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGV4dCk7CisgIGV4ZWNwLT5hX2RhdGEgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kYXRhKTsKKyAgZXhlY3AtPmFfYnNzICAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Jzcyk7CisgIGV4ZWNwLT5hX3N5bXMgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKKyAgZXhlY3AtPmFfZW50cnkgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2VudHJ5KTsKKyAgZXhlY3AtPmFfdHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Ryc2l6ZSk7CisgIGV4ZWNwLT5hX2Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9kcnNpemUpOworICBleGVjcC0+YV90bG9hZCAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdGxvYWQpOworICBleGVjcC0+YV9kbG9hZCAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGxvYWQpOworICBleGVjcC0+YV90YWxpZ24gPSBieXRlcy0+ZV90YWxpZ25bMF07CisgIGV4ZWNwLT5hX2RhbGlnbiA9IGJ5dGVzLT5lX2RhbGlnblswXTsKKyAgZXhlY3AtPmFfYmFsaWduID0gYnl0ZXMtPmVfYmFsaWduWzBdOworICBleGVjcC0+YV9yZWxheGFibGUgPSBieXRlcy0+ZV9yZWxheGFibGVbMF07Cit9CisKKy8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUgaW50byB0aGUKKyAgIHN1cHBsaWVkIGJ1ZmZlciByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLiAgKi8KKworUFJPVE8odm9pZCwgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX291dCwKKwkgIChiZmQgKmFiZmQsCisJICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAorCSAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXMpKTsKK3ZvaWQKK2JvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNwLCByYXdfYnl0ZXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOworICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7CisKKyAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvICAsIGJ5dGVzLT5lX2luZm8pOworICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGV4dCAgLCBieXRlcy0+ZV90ZXh0KTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2RhdGEgICwgYnl0ZXMtPmVfZGF0YSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9ic3MgICAsIGJ5dGVzLT5lX2Jzcyk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9zeW1zICAsIGJ5dGVzLT5lX3N5bXMpOworICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZW50cnkgLCBieXRlcy0+ZV9lbnRyeSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7CisgIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90bG9hZCAsIGJ5dGVzLT5lX3Rsb2FkKTsKKyAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Rsb2FkICwgYnl0ZXMtPmVfZGxvYWQpOworICBieXRlcy0+ZV90YWxpZ25bMF0gPSBleGVjcC0+YV90YWxpZ247CisgIGJ5dGVzLT5lX2RhbGlnblswXSA9IGV4ZWNwLT5hX2RhbGlnbjsKKyAgYnl0ZXMtPmVfYmFsaWduWzBdID0gZXhlY3AtPmFfYmFsaWduOworICBieXRlcy0+ZV9yZWxheGFibGVbMF0gPSBleGVjcC0+YV9yZWxheGFibGU7Cit9CisKKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorYl9vdXRfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgYW5leGVjOworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKKyAgICAgICE9IEVYRUNfQllURVNfU0laRSkgeworICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgIHJldHVybiAwOworICB9CisKKyAgYW5leGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOworCisgIGlmIChOX0JBRE1BRyAoYW5leGVjKSkgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgIHJldHVybiAwOworICB9CisKKyAgYm91dF9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7CisgIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYl9vdXRfY2FsbGJhY2spOworfQorCisKKy8qIEZpbmlzaCB1cCB0aGUgb3BlbmluZyBvZiBhIGIub3V0IGZpbGUgZm9yIHJlYWRpbmcuICBGaWxsIGluIGFsbCB0aGUKKyAgIGZpZWxkcyB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSBjb21tb24gY29kZS4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK2Jfb3V0X2NhbGxiYWNrIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKyAgdW5zaWduZWQgbG9uZyBic3Nfc3RhcnQ7CisKKyAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgKi8KKyAgYmZkX3NldF9hcmNoX21hY2goYWJmZCwKKwkJICAgIGJmZF9hcmNoX2k5NjAsIC8qIEIub3V0IG9ubHkgdXNlZCBvbiBpOTYwICovCisJCSAgICBiZmRfbWFjaF9pOTYwX2NvcmUgLyogRGVmYXVsdCAqLworCQkgICAgKTsKKworICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCisgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKKyAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOworCisgIC8qIFRoZSBhbGlnbm1lbnRzIG9mIHRoZSBzZWN0aW9ucyAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX3RhbGlnbjsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9kYWxpZ247CisgIG9ial9ic3NzZWMgIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOworCisgIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKKworICBvYmpfdGV4dHNlYyAoYWJmZCktPmxtYSA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOworICBvYmpfZGF0YXNlYyAoYWJmZCktPmxtYSA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOworCisgIC8qIEFuZCByZWxvYWQgdGhlIHNpemVzLCBzaW5jZSB0aGUgYW91dCBtb2R1bGUgemFwcyB0aGVtICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKKworICBic3Nfc3RhcnQgPSBleGVjcC0+YV9kbG9hZCArIGV4ZWNwLT5hX2RhdGE7IC8qIEJTUyA9IGVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KKyAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IGFsaWduX3Bvd2VyIChic3Nfc3RhcnQsIGV4ZWNwLT5hX2JhbGlnbik7CisKKyAgb2JqX2Jzc3NlYyAoYWJmZCktPmxtYSA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWE7CisKKyAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRigqZXhlY3ApOworICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRigqZXhlY3ApOworCisgIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RST0ZGKCpleGVjcCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSAgTl9EUk9GRigqZXhlY3ApOworCisgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7CS8qIE5vdCBhcHBsaWNhYmxlLiAqLworICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KKyAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworCisgIGlmIChleGVjcC0+YV9yZWxheGFibGUpCisgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKworc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgeworICAgIHN0cnVjdCBhb3V0ZGF0YSBhOworICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Cit9OworCitzdGF0aWMgYm9vbGVhbgorYl9vdXRfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKKworICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOworICBpZiAocmF3cHRyID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKKyAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKKworICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOworICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOworICBvYmpfYnNzc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKU5VTEw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK2Jfb3V0X3N5bWJvbF9jbXAgKGEsIGIpCisgICAgIHN0cnVjdCBhb3V0X3N5bWJvbCAqKmEsICoqYjsKK3sKKyAgYXNlY3Rpb24gKnNlYzsKKyAgYmZkX3ZtYSBhdiwgYnY7CisKKyAgLyogUHJpbWFyeSBrZXkgaXMgYWRkcmVzcyAqLworICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKCYoKmEpLT5zeW1ib2wpOworICBhdiA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArICgqYSktPnN5bWJvbC52YWx1ZTsKKyAgc2VjID0gYmZkX2dldF9zZWN0aW9uICgmKCpiKS0+c3ltYm9sKTsKKyAgYnYgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAoKmIpLT5zeW1ib2wudmFsdWU7CisKKyAgaWYgKGF2IDwgYnYpCisgICAgcmV0dXJuIC0xOworICBpZiAoYXYgPiBidikKKyAgICByZXR1cm4gMTsKKworICAvKiBTZWNvbmRhcnkga2V5IHB1dHMgQ0FMTE5BTUUgc3ltcyBsYXN0IGFuZCBCQUxOQU1FIHN5bXMgZmlyc3QsIHNvCisgICAgIHRoYXQgdGhleSBoYXZlIHRoZSBiZXN0IGNoYW5jZSBvZiBiZWluZyBjb250aWd1b3VzLiAgKi8KKyAgaWYgKElTX0JBTE5BTUUgKCgqYSktPm90aGVyKSB8fCBJU19DQUxMTkFNRSAoKCpiKS0+b3RoZXIpKQorICAgIHJldHVybiAtMTsKKyAgaWYgKElTX0NBTExOQU1FICgoKmEpLT5vdGhlcikgfHwgSVNfQkFMTkFNRSAoKCpiKS0+b3RoZXIpKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgYm9vbGVhbgorYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIHN3YXBwZWRfaGRyOworCisgIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gQk1BR0lDOworCisgIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgPSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplOworICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChzdHJ1Y3Qgbmxpc3QpOworICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKKworICBleGVjX2hkciAoYWJmZCktPmFfdGFsaWduID0gb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kYWxpZ24gPSBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKKyAgZXhlY19oZHIgKGFiZmQpLT5hX2JhbGlnbiA9IG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7CisKKyAgZXhlY19oZHIgKGFiZmQpLT5hX3Rsb2FkID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kbG9hZCA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOworCisgIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQorCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCisgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB7Q0FMTCxCQUx9TkFNRSBzeW1ib2xzIHJlbWFpbiBhZGphY2VudCBvbiBvdXRwdXQKKwkgYnkgc29ydGluZy4gIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBzdGFicyBhcmUKKwkgYWxzbyBvcmRlcmVkLiAgU29sdmUgdGhpcyBieSBzaGlmdGluZyBhbGwgc3RhYnMgdG8gdGhlIGVuZAorCSBpbiBvcmRlciwgdGhlbiBzb3J0aW5nIHRoZSByZXN0LiAgKi8KKworICAgICAgYXN5bWJvbCAqKm91dHN5bXMsICoqcCwgKipxOworCisgICAgICBvdXRzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKKyAgICAgIHAgPSBvdXRzeW1zICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisKKyAgICAgIGZvciAocSA9IHAtLTsgcCA+PSBvdXRzeW1zOyBwLS0pCisJeworCSAgaWYgKCgqcCktPmZsYWdzICYgQlNGX0RFQlVHR0lORykKKwkgICAgeworCSAgICAgIGFzeW1ib2wgKnQgPSAqLS1xOworCSAgICAgICpxID0gKnA7CisJICAgICAgKnAgPSB0OworCSAgICB9CisJfQorCisgICAgICBpZiAocSA+IG91dHN5bXMpCisJcXNvcnQgKG91dHN5bXMsIHEgLSBvdXRzeW1zLCBzaXplb2YoYXN5bWJvbCopLCBiX291dF9zeW1ib2xfY21wKTsKKworICAgICAgLyogQmFjayB0byB5b3VyIHJlZ3VsYXJseSBzY2hlZHVsZWQgcHJvZ3JhbS4gICovCisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCisJICAhPSAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RST0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RST0ZGKCpleGVjX2hkcihhYmZkKSkpLCBTRUVLX1NFVCkKKwkgICE9IDApCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qKiBTb21lIHJlbG9jIGhhY2tlcnkgKi8KKworI2RlZmluZSBDQUxMUwkgIDB4NjYwMDM4MDAJLyogVGVtcGxhdGUgZm9yICdjYWxscycgaW5zdHJ1Y3Rpb24JKi8KKyNkZWZpbmUgQkFMCSAgMHgwYjAwMDAwMAkvKiBUZW1wbGF0ZSBmb3IgJ2JhbCcgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgQkFMX01BU0sgIDB4MDBmZmZmZmYKKyNkZWZpbmUgQkFMWAkgIDB4ODVmMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWx4JyBpbnN0cnVjdGlvbgkqLworI2RlZmluZSBCQUxYX01BU0sgMHgwMDA3ZmZmZgorI2RlZmluZSBDQUxMICAgICAgMHgwOTAwMDAwMAorI2RlZmluZSBQQ1JFTDEzX01BU0sgMHgxZmZmCisKKworI2RlZmluZSBvdXRwdXRfYWRkcihzZWMpICgoc2VjKS0+b3V0cHV0X29mZnNldCsoc2VjKS0+b3V0cHV0X3NlY3Rpb24tPnZtYSkKKworLyogTWFnaWMgdG8gdHVybiBjYWxseCBpbnRvIGNhbGxqeCAqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorY2FsbGp4X2NhbGxiYWNrIChhYmZkLCBsaW5rX2luZm8sIHJlbG9jX2VudHJ5LCBzcmMsIGRzdCwgaW5wdXRfc2VjdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgUFRSIHNyYzsKKyAgICAgUFRSIGRzdDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Cit7CisgIGludCB3b3JkID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjKTsKKyAgYXN5bWJvbCAqc3ltYm9sX2luID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOworICBhb3V0X3N5bWJvbF90eXBlICpzeW1ib2wgPSBhb3V0X3N5bWJvbCAoc3ltYm9sX2luKTsKKyAgYmZkX3ZtYSB2YWx1ZTsKKworICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2NfZW50cnksIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgaWYgKElTX0NBTExOQU1FIChzeW1ib2wtPm90aGVyKSkKKyAgICB7CisgICAgICBhb3V0X3N5bWJvbF90eXBlICpiYWxzeW0gPSBzeW1ib2wrMTsKKyAgICAgIGludCBpbnN0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy00KTsKKyAgICAgIC8qIFRoZSBuZXh0IHN5bWJvbCBzaG91bGQgYmUgYW4gTl9CQUxOQU1FICovCisgICAgICBCRkRfQVNTRVJUIChJU19CQUxOQU1FIChiYWxzeW0tPm90aGVyKSk7CisgICAgICBpbnN0ICY9IEJBTFhfTUFTSzsKKyAgICAgIGluc3QgfD0gQkFMWDsKKyAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc3QsIChiZmRfYnl0ZSAqKSBkc3QtNCk7CisgICAgICBzeW1ib2wgPSBiYWxzeW07CisgICAgICB2YWx1ZSA9IChzeW1ib2wtPnN5bWJvbC52YWx1ZQorCSAgICAgICArIG91dHB1dF9hZGRyIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uKSk7CisgICAgfQorCisgIHdvcmQgKz0gdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIGJmZF9wdXRfMzIoYWJmZCwgd29yZCwgZHN0KTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworCisvKiBNYWdpYyB0byB0dXJuIGNhbGwgaW50byBjYWxsaiAqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorY2FsbGpfY2FsbGJhY2sgKGFiZmQsIGxpbmtfaW5mbywgcmVsb2NfZW50cnksICBkYXRhLCBzcmNpZHgsIGRzdGlkeCwKKwkJaW5wdXRfc2VjdGlvbiwgc2hyaW5raW5nKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBQVFIgZGF0YTsKKyAgICAgdW5zaWduZWQgaW50IHNyY2lkeDsKKyAgICAgdW5zaWduZWQgaW50IGRzdGlkeDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJvb2xlYW4gc2hyaW5raW5nOworeworICBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgc3JjaWR4KTsKKyAgYXN5bWJvbCAqc3ltYm9sX2luID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOworICBhb3V0X3N5bWJvbF90eXBlICpzeW1ib2wgPSBhb3V0X3N5bWJvbCAoc3ltYm9sX2luKTsKKyAgYmZkX3ZtYSB2YWx1ZTsKKworICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2NfZW50cnksIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgaWYgKElTX09USEVSKHN5bWJvbC0+b3RoZXIpKQorICAgIHsKKyAgICAgIC8qIENhbGwgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlIC0gcmVwbGFjZSBjb2RlIHdpdGggc3lzdGVtCisJIHByb2NlZHVyZSBudW1iZXIuICAqLworICAgICAgd29yZCA9IENBTExTIHwgKHN5bWJvbC0+b3RoZXIgLSAxKTsKKyAgICB9CisgIGVsc2UgaWYgKElTX0NBTExOQU1FKHN5bWJvbC0+b3RoZXIpKQorICAgIHsKKyAgICAgIGFvdXRfc3ltYm9sX3R5cGUgKmJhbHN5bSA9IHN5bWJvbCsxOworCisgICAgICAvKiBUaGUgbmV4dCBzeW1ib2wgc2hvdWxkIGJlIGFuIE5fQkFMTkFNRS4gICovCisgICAgICBCRkRfQVNTRVJUKElTX0JBTE5BTUUoYmFsc3ltLT5vdGhlcikpOworICAgICAgCisgICAgICAvKiBXZSBhcmUgY2FsbGluZyBhIGxlYWYsIHNvIHJlcGxhY2UgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhCisJIGJhbC4gICovCisgICAgICB3b3JkID0gQkFMIHwgKCh3b3JkCisJCSAgICAgKyBvdXRwdXRfYWRkciAoYmFsc3ltLT5zeW1ib2wuc2VjdGlvbikKKwkJICAgICArIGJhbHN5bS0+c3ltYm9sLnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZAorCQkgICAgIC0gZHN0aWR4CisJCSAgICAgLSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikpCisJCSAgICAmIEJBTF9NQVNLKTsKKyAgICB9CisgIGVsc2UgaWYgKChzeW1ib2wtPnN5bWJvbC5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBBIGNhbGxqIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiBpcyBhIGZ1bGx5CisgICAgICAgICByZXNvbHZlZCByZWxhdGl2ZSBjYWxsLiAgV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLgorICAgICAgICAgSWYgdGhlIHN5bWJvbCBpcyBub3QgaW4gdGhlIHNhbWUgc2VjdGlvbiwgSSdtIG5vdCBzdXJlIHdoYXQKKyAgICAgICAgIHRvIGRvOyBmb3J0dW5hdGVseSwgdGhpcyBjYXNlIHdpbGwgcHJvYmFibHkgbmV2ZXIgYXJpc2UuICAqLworICAgICAgQkZEX0FTU0VSVCAoISBzaHJpbmtpbmcpOworICAgICAgQkZEX0FTU0VSVCAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3b3JkID0gQ0FMTCB8ICgoKHdvcmQgJiBCQUxfTUFTSykKKwkJICAgICAgKyB2YWx1ZQorCQkgICAgICArIHJlbG9jX2VudHJ5LT5hZGRlbmQKKwkJICAgICAgLSAoc2hyaW5raW5nID8gZHN0aWR4IDogMCkKKwkJICAgICAgLSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikpCisJCSAgICAgJiBCQUxfTUFTSyk7CisgICAgfQorICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgZHN0aWR4KTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogdHlwZSByc2hpZnQgc2l6ZSAgYml0c2l6ZSAgCXBjcmVsCWJpdHBvcyAgYWJzb2x1dGUgb3ZlcmZsb3cgY2hlY2sqLworCisjZGVmaW5lIEFCUzMyQ09ERSAwCisjZGVmaW5lIEFCUzMyQ09ERV9TSFJVTksgMQorI2RlZmluZSBQQ1JFTDI0IDIKKyNkZWZpbmUgQ0FMTEogMworI2RlZmluZSBBQlMzMiA0CisjZGVmaW5lIFBDUkVMMTMgNQorI2RlZmluZSBBQlMzMl9NQVlCRV9SRUxBWEFCTEUgMQorI2RlZmluZSBBQlMzMl9XQVNfUkVMQVhBQkxFIDIKKworI2RlZmluZSBBTElHTkVSIDEwCisjZGVmaW5lIEFMSUdORE9ORSAxMQorc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfY2FsbGogPQorSE9XVE8oQ0FMTEosIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsImNhbGxqIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZixmYWxzZSk7CitzdGF0aWMgIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzIgPQorSE9XVE8oQUJTMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiYWJzMzIiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfcGNyZWwyNCA9CitIT1dUTyhQQ1JFTDI0LCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsInBjcmVsMjQiLCB0cnVlLCAweDAwZmZmZmZmLDB4MDBmZmZmZmYsZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxvY19wY3JlbDEzID0KK0hPV1RPKFBDUkVMMTMsIDAsIDIsIDEzLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwicGNyZWwxMyIsIHRydWUsIDB4MDAwMDFmZmYsMHgwMDAwMWZmZixmYWxzZSk7CisKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rID0KK0hPV1RPKEFCUzMyQ09ERV9TSFJVTkssIDAsIDIsIDI0LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsImNhbGx4LT5jYWxsaiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsZmFsc2UpOworCitzdGF0aWMgIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfYWJzMzJjb2RlID0KK0hPV1RPKEFCUzMyQ09ERSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJjYWxseCIsIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2FsaWduX3RhYmxlW10gPSB7CisgIEhPV1RPIChBTElHTkVSLCAwLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24xNiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCisgIEhPV1RPIChBTElHTkVSLCAwLCAweDMsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCisgIEhPV1RPIChBTElHTkVSLCAwLCAweDcsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ242NCIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCisgIEhPV1RPIChBTElHTkVSLCAwLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiYWxpZ24xMjgiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAorfTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fZG9uZV9hbGlnbl90YWJsZVtdID0geworICBIT1dUTyAoQUxJR05ET05FLCAweDEsIDB4MSwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24xNiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCisgIEhPV1RPIChBTElHTkRPTkUsIDB4MywgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjMyIiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKKyAgSE9XVE8gKEFMSUdORE9ORSwgMHg3LCAweDcsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAorICBIT1dUTyAoQUxJR05ET05FLCAweGYsIDB4ZiwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24xMjgiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAorfTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorYl9vdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgorICAgICAgcmV0dXJuICZob3d0b19yZWxvY19jYWxsajsKKyAgICBjYXNlIEJGRF9SRUxPQ18zMjoKKyAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgorICAgICAgcmV0dXJuICZob3d0b19yZWxvY19hYnMzMjsKKyAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKKyAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfcGNyZWwyNDsKKyAgICB9Cit9CisKKy8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHJlbG9jIGVudHJpZXMsIHBsdXMgcG9pbnRlcnMgdG8gdGhlbSBhbGwgKi8KKworc3RhdGljIGJvb2xlYW4KK2Jfb3V0X3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcnB0cjsKKyAgdW5zaWduZWQgaW50IGNvdW50ZXIgOworICBhcmVsZW50ICpjYWNoZV9wdHIgOworICBpbnQgZXh0ZXJuX21hc2ssIHBjcmVsX21hc2ssIGNhbGxqX21hc2ssIGxlbmd0aF9zaGlmdDsKKyAgaW50IGluY29kZV9tYXNrOworICBpbnQgc2l6ZV9tYXNrOworICBiZmRfdm1hIHByZXZfYWRkciA9IDA7CisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgc2l6ZV90ICByZWxvY19zaXplOworICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyZWxvY3M7CisgIGFyZWxlbnQgKnJlbG9jX2NhY2hlOworCisgIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpIHsKKyAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOworICAgIGdvdG8gZG9pdDsKKyAgfQorCisgIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpIHsKKyAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfdHJzaXplOworICAgIGdvdG8gZG9pdDsKKyAgfQorCisgIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkgeworICAgIHJlbG9jX3NpemUgPSAwOworICAgIGdvdG8gZG9pdDsKKyAgfQorCisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgIHJldHVybiBmYWxzZTsKKworIGRvaXQ6CisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShhc2VjdC0+cmVsX2ZpbGVwb3MpLCAgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICBjb3VudCA9IHJlbG9jX3NpemUgLyBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOworCisgIHJlbG9jcyA9IChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOworICBpZiAoIXJlbG9jcyAmJiByZWxvY19zaXplICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICByZWxvY19jYWNoZSA9IChhcmVsZW50ICopIGJmZF9tYWxsb2MgKChjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCkpOworICBpZiAoIXJlbG9jX2NhY2hlKSB7CisgICAgaWYgKHJlbG9jcyAhPSBOVUxMKQorICAgICAgZnJlZSAoKGNoYXIqKXJlbG9jcyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpIHsKKyAgICBmcmVlIChyZWxvY19jYWNoZSk7CisgICAgaWYgKHJlbG9jcyAhPSBOVUxMKQorICAgICAgZnJlZSAocmVsb2NzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworCisKKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKKyAgICAvKiBiaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCisgICAgcGNyZWxfbWFzayAgPSAweDgwOworICAgIGV4dGVybl9tYXNrID0gMHgxMDsKKyAgICBpbmNvZGVfbWFzayA9IDB4MDg7CisgICAgY2FsbGpfbWFzayAgPSAweDAyOworICAgIHNpemVfbWFzayA9ICAgMHgyMDsKKyAgICBsZW5ndGhfc2hpZnQgPSA1OworICB9IGVsc2UgeworICAgIC8qIGxpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KKyAgICBwY3JlbF9tYXNrICA9IDB4MDE7CisgICAgZXh0ZXJuX21hc2sgPSAweDA4OworICAgIGluY29kZV9tYXNrID0gMHgxMDsKKyAgICBjYWxsal9tYXNrICA9IDB4NDA7CisgICAgc2l6ZV9tYXNrICAgPSAweDAyOworICAgIGxlbmd0aF9zaGlmdCA9IDE7CisgIH0KKworICBmb3IgKHJwdHIgPSByZWxvY3MsIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlLCBjb3VudGVyID0gMDsKKyAgICAgICBjb3VudGVyIDwgY291bnQ7CisgICAgICAgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQorICB7CisgICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKilycHRyOworICAgIHVuc2lnbmVkIGludCBzeW1udW07CisgICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXcgKyAwKTsKKyAgICBjYWNoZV9wdHItPmhvd3RvID0gMDsKKyAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKKyAgICB7CisgICAgICBzeW1udW0gPSAocmF3WzRdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNl07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzeW1udW0gPSAocmF3WzZdIDw8IDE2KSB8IChyYXdbNV0gPDwgOCkgfCByYXdbNF07CisgICAgfQorCisgICAgaWYgKHJhd1s3XSAmIGV4dGVybl9tYXNrKQorICAgIHsKKyAgICAgIC8qIGlmIHRoaXMgaXMgc2V0IHRoZW4gdGhlIHJfaW5kZXggaXMgYSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGU7CisgICAgICAgKiBpZiB0aGUgYml0IGlzIG5vdCBzZXQgdGhlbiByX2luZGV4IGNvbnRhaW5zIGEgc2VjdGlvbiBtYXAuCisgICAgICAgKiB3ZSBlaXRoZXIgZmlsbCBpbiB0aGUgc3ltIGVudHJ5IHdpdGggYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wsCisgICAgICAgKiBvciBwb2ludCB0byB0aGUgY29ycmVjdCBzZWN0aW9uCisgICAgICAgKi8KKyAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3ltbnVtOworICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgIC8qIGluIGEub3V0IHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgKiBmaWxlIHJhdGhlciB0aGFuIHNlY3Rpb25zID8KKyAgICAgICAqIChsb29rIGluIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpCisgICAgICAgKiB0aGUgcmVsb2MgZW50cnkgYWRkZW5kIGhhcyBhZGRlZCB0byBpdCB0aGUgb2Zmc2V0IGludG8gdGhlCisgICAgICAgKiBmaWxlIG9mIHRoZSBkYXRhLCBzbyBzdWJ0cmFjdCB0aGUgYmFzZSB0byBtYWtlIHRoZSByZWxvYworICAgICAgICogc2VjdGlvbiByZWxhdGl2ZSAqLworICAgICAgaW50IHM7CisgICAgICB7CisJLyogc2lnbi1leHRlbmQgc3ltbnVtIGZyb20gMjQgYml0cyB0byB3aGF0ZXZlciBob3N0IHVzZXMgKi8KKwlzID0gc3ltbnVtOworCWlmIChzICYgKDEgPDwgMjMpKQorCSAgcyB8PSAofjApIDw8IDI0OworICAgICAgfQorICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKU5VTEw7CisgICAgICBzd2l0Y2ggKHMpCisgICAgICB7CisgICAgICAgY2FzZSBOX1RFWFQ6CisgICAgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKKwljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOworCWNhY2hlX3B0ci0+YWRkZW5kID0gLSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOworCWJyZWFrOworICAgICAgIGNhc2UgTl9EQVRBOgorICAgICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CisJY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKKwljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKKwlicmVhazsKKyAgICAgICBjYXNlIE5fQlNTOgorICAgICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKKwljYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CisJY2FjaGVfcHRyLT5hZGRlbmQgPSAgLSBvYmpfYnNzc2VjKGFiZmQpLT52bWE7CisJYnJlYWs7CisgICAgICAgY2FzZSBOX0FCUzoKKyAgICAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CisJY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOworCWNhY2hlX3B0ci0+YWRkZW5kID0gMDsKKwlicmVhazsKKyAgICAgIGNhc2UgLTI6IC8qIC5hbGlnbiAqLworCWlmIChyYXdbN10gJiBwY3JlbF9tYXNrKQorCSAgeworCSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX2FsaWduX3RhYmxlWyhyYXdbN10gPj4gbGVuZ3RoX3NoaWZ0KSAmIDNdOworCSAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisJICB9CisJZWxzZQorCSAgeworCSAgICAvKiAub3JnPyAqLworCSAgICBhYm9ydCAoKTsKKwkgIH0KKwljYWNoZV9wdHItPmFkZGVuZCA9IDA7CisJYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKwlCRkRfQVNTRVJUKDApOworCWJyZWFrOworICAgICAgfQorCisgICAgfQorCisgICAgLyogdGhlIGk5NjAgb25seSBoYXMgYSBmZXcgcmVsb2NhdGlvbiB0eXBlczoKKyAgICAgICBhYnMgMzItYml0IGFuZCBwY3JlbCAyNGJpdC4gICBleGNlcHQgZm9yIGNhbGxqJ3MhICAqLworICAgIGlmIChjYWNoZV9wdHItPmhvd3RvICE9IDApCisgICAgICA7CisgICAgZWxzZSBpZiAocmF3WzddICYgY2FsbGpfbWFzaykKKyAgICB7CisgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX2NhbGxqOworICAgIH0KKyAgICBlbHNlIGlmICggcmF3WzddICYgcGNyZWxfbWFzaykKKyAgICB7CisgICAgICBpZiAocmF3WzddICYgc2l6ZV9tYXNrKQorICAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfcGNyZWwxMzsKKyAgICAgIGVsc2UKKyAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocmF3WzddICYgaW5jb2RlX21hc2spCisgICAgICB7CisJY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGNhY2hlX3B0ci0+YWRkcmVzcyA8IHByZXZfYWRkcikKKyAgICB7CisgICAgICAvKiBPdWNoISB0aGlzIHJlbG9jIGlzIG91dCBvZiBvcmRlciwgaW5zZXJ0IGludG8gdGhlIHJpZ2h0IHBsYWNlCisgICAgICAgKi8KKyAgICAgIGFyZWxlbnQgdG1wOworICAgICAgYXJlbGVudCAqY3Vyc29yID0gY2FjaGVfcHRyLTE7CisgICAgICBiZmRfdm1hIHN0b3AgPSBjYWNoZV9wdHItPmFkZHJlc3M7CisgICAgICB0bXAgID0gKmNhY2hlX3B0cjsKKyAgICAgIHdoaWxlIChjdXJzb3ItPmFkZHJlc3MgPiBzdG9wICYmIGN1cnNvciA+PSByZWxvY19jYWNoZSkKKyAgICAgIHsKKwljdXJzb3JbMV0gPSBjdXJzb3JbMF07CisJY3Vyc29yLS07CisgICAgICB9CisgICAgICBjdXJzb3JbMV0gPSB0bXA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmV2X2FkZHIgPSBjYWNoZV9wdHItPmFkZHJlc3M7CisgICAgfQorICB9CisKKworICBpZiAocmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAocmVsb2NzKTsKKyAgYXNlY3QtPnJlbG9jYXRpb24gPSByZWxvY19jYWNoZTsKKyAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7CisKKworICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgYm9vbGVhbgorYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGFyZWxlbnQgKipnZW5lcmljOworICBpbnQgcl9leHRlcm4gPSAwOworICBpbnQgcl9pZHg7CisgIGludCBpbmNvZGVfbWFzazsKKyAgaW50IGxlbl8xOworICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqbmF0aXZlLCAqbmF0cHRyOworICBzaXplX3QgbmF0c2l6ZSA9IGNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKKyAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCAgbGVuXzIsIGNhbGxqX21hc2s7CisgIGlmIChjb3VudCA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgZ2VuZXJpYyAgID0gc2VjdGlvbi0+b3JlbG9jYXRpb247CisgIG5hdGl2ZSA9ICgoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChuYXRzaXplKSk7CisgIGlmICghbmF0aXZlICYmIG5hdHNpemUgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisgIHsKKyAgICAvKiBCaWctZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCisgICAgcGNyZWxfbWFzayAgPSAweDgwOworICAgIGV4dGVybl9tYXNrID0gMHgxMDsKKyAgICBsZW5fMiAgICAgICA9IDB4NDA7CisgICAgbGVuXzEgICAgICAgPSAweDIwOworICAgIGNhbGxqX21hc2sgID0gMHgwMjsKKyAgICBpbmNvZGVfbWFzayA9IDB4MDg7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTGl0dGxlLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLworICAgIHBjcmVsX21hc2sgID0gMHgwMTsKKyAgICBleHRlcm5fbWFzayA9IDB4MDg7CisgICAgbGVuXzIgICAgICAgPSAweDA0OworICAgIGxlbl8xICAgICAgID0gMHgwMjsKKyAgICBjYWxsal9tYXNrICA9IDB4NDA7CisgICAgaW5jb2RlX21hc2sgPSAweDEwOworICB9CisKKyAgZm9yIChuYXRwdHIgPSBuYXRpdmU7IGNvdW50ID4gMDsgLS1jb3VudCwgKytuYXRwdHIsICsrZ2VuZXJpYykKKyAgeworICAgIGFyZWxlbnQgKmcgPSAqZ2VuZXJpYzsKKyAgICB1bnNpZ25lZCBjaGFyICpyYXcgPSAodW5zaWduZWQgY2hhciAqKW5hdHB0cjsKKyAgICBhc3ltYm9sICpzeW0gPSAqKGctPnN5bV9wdHJfcHRyKTsKKworICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisKKyAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZy0+YWRkcmVzcywgcmF3KTsKKyAgICAvKiBGaW5kIGEgdHlwZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB3aGljaCBtYXRjaGVzIHRoZSBpbnB1dCBob3d0byAtCisgICAgICogYXQgdGhlIG1vbWVudCB3ZSBhc3N1bWUgaW5wdXQgZm9ybWF0ID09IG91dHB1dCBmb3JtYXQgRklYTUUhIQorICAgICAqLworICAgIHJfaWR4ID0gMDsKKyAgICAvKiBGSVhNRTogIE5lZWQgY2FsbGogc3R1ZmYgaGVyZSwgYW5kIHRvIGNoZWNrIHRoZSBob3d0byBlbnRyaWVzIHRvCisgICAgICAgYmUgc3VyZSB0aGV5IGFyZSByZWFsIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gICovCisgICAgaWYgKGctPmhvd3RvPT0gJmhvd3RvX3JlbG9jX2NhbGxqKQorICAgIHsKKyAgICAgIHJhd1s3XSA9IGNhbGxqX21hc2sgKyBwY3JlbF9tYXNrICsgbGVuXzI7CisgICAgfQorICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDI0KQorICAgIHsKKyAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMjsKKyAgICB9CisgICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX3BjcmVsMTMpCisgICAgeworICAgICAgcmF3WzddID0gcGNyZWxfbWFzayArIGxlbl8xOworICAgIH0KKyAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlKQorICAgIHsKKyAgICAgIHJhd1s3XSA9IGxlbl8yICsgaW5jb2RlX21hc2s7CisgICAgfQorICAgIGVsc2UgaWYgKGctPmhvd3RvID49IGhvd3RvX2FsaWduX3RhYmxlCisJICAgICAmJiBnLT5ob3d0byA8PSAoaG93dG9fYWxpZ25fdGFibGUKKwkJCSAgICArIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGUpIC8gc2l6ZW9mIChob3d0b19hbGlnbl90YWJsZVswXSkKKwkJCSAgICAtIDEpKQorICAgICAgeworCS8qIHN5bW51bSA9PSAtMjsgZXh0ZXJuX21hc2sgbm90IHNldCwgcGNyZWxfbWFzayBzZXQgKi8KKwlyX2lkeCA9IC0yOworCXJfZXh0ZXJuID0gMDsKKwlyYXdbN10gPSAocGNyZWxfbWFzaworCQkgIHwgKChnLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKSA8PCAxKSk7CisgICAgICB9CisgICAgZWxzZSB7CisgICAgICByYXdbN10gPSBsZW5fMjsKKyAgICB9CisKKyAgICBpZiAocl9pZHggIT0gMCkKKyAgICAgIC8qIGFscmVhZHkgbXVja2VkIHdpdGggcl9leHRlcm4sIHJfaWR4ICovOworICAgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCisJICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQorCSAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCisgICAgeworCisgICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKKyAgICAgIHsKKwkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0CisJICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KKwlyX2lkeCA9IDA7CisJcl9leHRlcm4gPSAwOworICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwkvKiBGaWxsIGluIHN5bWJvbCAqLworCisJcl9leHRlcm4gPSAxOworCXJfaWR4ID0gKCpnLT5zeW1fcHRyX3B0ciktPnVkYXRhLmk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaWR4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgfQorCisgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKKyAgICAgIHJhd1s0XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gMTYpOworICAgICAgcmF3WzVdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAgOCk7CisgICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOworICAgIH0gZWxzZSB7CisgICAgICByYXdbNl0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKKyAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHg+PiAgOCk7CisgICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ICAgICApOworICAgIH0KKyAgICBpZiAocl9leHRlcm4pCisgICAgIHJhd1s3XSB8PSBleHRlcm5fbWFzazsKKyAgfQorCisgIGlmIChiZmRfd3JpdGUgKChQVFIpIG5hdGl2ZSwgMSwgbmF0c2l6ZSwgYWJmZCkgIT0gbmF0c2l6ZSkgeworICAgIGZyZWUoKFBUUiluYXRpdmUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBmcmVlICgoUFRSKW5hdGl2ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLworc3RhdGljIGxvbmcKK2Jfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgYXJlbGVudCAqKnJlbHB0cjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIGFyZWxlbnQgKnRibHB0cjsKKyAgdW5zaWduZWQgaW50IGNvdW50OworCisgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpICE9IDApCisgICAgeworICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKKyAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQorCXsKKwkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OworCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gPT0gTlVMTAorCSAgJiYgISBiX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scykpCisJcmV0dXJuIC0xOworCisgICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOworICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCisJKnJlbHB0cisrID0gdGJscHRyKys7CisgICAgfQorCisgICpyZWxwdHIgPSBOVUxMOworCisgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKK30KKworc3RhdGljIGxvbmcKK2Jfb3V0X2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBhc2VjdDsKK3sKKyAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7CisgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQorICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKikgKiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSk7CisKKyAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKKyAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCisJICAgICgoZXhlY19oZHIoYWJmZCktPmFfZHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKKwkgICAgICsxKSk7CisKKyAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKKyAgICByZXR1cm4gKHNpemVvZiAoYXJlbGVudCAqKSAqCisJICAgICgoZXhlY19oZHIoYWJmZCktPmFfdHJzaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSkKKwkgICAgICsxKSk7CisKKyAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQorICAgIHJldHVybiAwOworCisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgIHJldHVybiAtMTsKK30KKwwKK3N0YXRpYyBib29sZWFuCitiX291dF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworCisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKSB7IC8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCisgICAgaWYgKCEgYW91dF8zMl9tYWtlX3NlY3Rpb25zIChhYmZkKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHNpemVvZihzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7CisgICAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisKKyAgfQorICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGNvdW50ICE9IDApIHsKKyAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK2Jfb3V0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKK3sKKyAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKKworICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQkvKiBVbmtub3duIG1hY2hpbmUgYXJjaCBpcyBPSyAqLworICAgIHJldHVybiB0cnVlOworICBpZiAoYXJjaCA9PSBiZmRfYXJjaF9pOTYwKQkvKiBpOTYwIGRlZmF1bHQgaXMgT0sgKi8KKyAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6CisgICAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgorICAgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6CisgICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitiX291dF9zaXplb2ZfaGVhZGVycyAoaWdub3JlX2FiZmQsIGlnbm9yZSkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgYm9vbGVhbiBpZ25vcmU7Cit7CisgIHJldHVybiBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiZmRfdm1hCitnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCisgICAgIGFyZWxlbnQgKnJlbG9jOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKK3sKKyAgYmZkX3ZtYSB2YWx1ZTsKKyAgYXN5bWJvbCAqc3ltYm9sID0gKihyZWxvYy0+c3ltX3B0cl9wdHIpOworCisgIC8qIEEgc3ltYm9sIGhvbGRzIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUKKyAgICAgYmFzZSBvZiB0aGUgc2VjdGlvbi4gIFRvIHJlbG9jYXRlLCB3ZSBmaW5kIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwKKyAgICAgbGl2ZSBpbiB0aGUgb3V0cHV0IGFuZCBhZGQgdGhhdCBpbiAqLworCisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgeworICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgQkZELiAgTG9vayBpdCB1cCBpbiB0aGUKKwkgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2hlbgorCSB3ZSBjb252ZXJ0IGIub3V0IHRvIHVzZSBhIHNwZWNpZmljIGZpbmFsX2xpbmsgZnVuY3Rpb24gYW5kCisJIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvIG5vdCByZXF1aXJlIHRoZQorCSBnZW5lcmljIHN5bWJvbHMuICAqLworICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGlucHV0X3NlY3Rpb24tPm93bmVyLCBsaW5rX2luZm8sCisJCQkJCWJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCisJCQkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQorCXZhbHVlID0gaC0+dS5kZWYudmFsdWUgKyBvdXRwdXRfYWRkciAoaC0+dS5kZWYuc2VjdGlvbik7CisgICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJICAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCisJdmFsdWUgPSBoLT51LmMuc2l6ZTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCisJCSAgaW5wdXRfc2VjdGlvbi0+b3duZXIsIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCisJICAgIGFib3J0ICgpOworCSAgdmFsdWUgPSAwOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zZWN0aW9uKTsKKyAgICB9CisKKyAgLyogQWRkIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlbG9jYXRpb24gKi8KKyAgdmFsdWUgKz0gcmVsb2MtPmFkZGVuZDsKKworICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkCitwZXJmb3JtX3NsaXAgKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBzbGlwOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgYXN5bWJvbCAqKnM7CisKKyAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKKyAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7CisKKyAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdworICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KKyAgd2hpbGUgKCpzKQorICB7CisgICAgYXN5bWJvbCAqcCA9ICpzOworICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pCisgICAgeworICAgICAgLyogVGhpcyB3YXMgcG9pbnRpbmcgaW50byB0aGlzIHNlY3Rpb24sIHNvIG1hbmdsZSBpdCAqLworICAgICAgaWYgKHAtPnZhbHVlID4gdmFsdWUpCisgICAgICB7CisJcC0+dmFsdWUgLT1zbGlwOworCWlmIChwLT51ZGF0YS5wICE9IE5VTEwpCisJICB7CisJICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBwLT51ZGF0YS5wOworCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKTsKKwkgICAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOworCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnUuZGVmLnZhbHVlID09IHAtPnZhbHVlKTsKKwkgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcysrOworCisgIH0KK30KKworLyogVGhpcyByb3V0aW5lIHdvcmtzIG91dCBpZiB0aGUgdGhpbmcgd2Ugd2FudCB0byBnZXQgdG8gY2FuIGJlCisgICByZWFjaGVkIHdpdGggYSAyNGJpdCBvZmZzZXQgaW5zdGVhZCBvZiBhIDMyIGJpdCBvbmUuCisgICBJZiBpdCBjYW4sIHRoZW4gaXQgY2hhbmdlcyB0aGUgYW1vZGUgKi8KKworc3RhdGljIGludAorYWJzMzJjb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssIGxpbmtfaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYXJlbGVudCAqcjsKKyAgICAgdW5zaWduZWQgaW50IHNocmluazsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKK3sKKyAgYmZkX3ZtYSB2YWx1ZSA9IGdldF92YWx1ZSAociwgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKyAgYmZkX3ZtYSBkb3QgPSBvdXRwdXRfYWRkciAoaW5wdXRfc2VjdGlvbikgKyByLT5hZGRyZXNzOworICBiZmRfdm1hIGdhcDsKKworICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMl4yMyBieXRlcyBvZiB3aGVyZQorICAgICB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKKyAgICAganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCisKKyAgZ2FwID0gdmFsdWUgLSAoZG90IC0gc2hyaW5rKTsKKworCisgIGlmICgtMTw8MjMgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTw8MjMgKQorICB7CisgICAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMzJiaXRjb2RlIHBvc3NpYmxlIDI0LCB0byAyNGJpdAorICAgICAgIHBvc3NpYmxlIDMyICovCisKKyAgICByLT5ob3d0byA9ICZob3d0b19yZWxvY19hYnMzMmNvZGVzaHJ1bms7CisgICAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBmb3VyIGJ5dGVzICovCisgICAgci0+YWRkcmVzcyAtPTQ7CisKKyAgICAvKiBUaGlzIHdpbGwgYmUgZm91ciBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLworICAgIHNocmluayArPSA0IDsKKyAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3Mtc2hyaW5rICsgNCk7CisgIH0KKyAgcmV0dXJuIHNocmluazsKK30KKworc3RhdGljIGludAorYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGFyZWxlbnQgKnI7CisgICAgIHVuc2lnbmVkIGludCBzaHJpbms7Cit7CisgIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKKyAgYmZkX3ZtYSBnYXA7CisgIGJmZF92bWEgb2xkX2VuZDsKKyAgYmZkX3ZtYSBuZXdfZW5kOworICBpbnQgc2hyaW5rX2RlbHRhOworICBpbnQgc2l6ZSA9IHItPmhvd3RvLT5zaXplOworCisgIC8qIFJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgYWxpZ25tZW50IHNvIHRoYXQgaXQncyBzdGlsbCBhbGlnbmVkIGJ1dAorICAgICBzbWFsbGVyICAtIHRoZSBjdXJyZW50IHNpemUgaXMgYWxyZWFkeSB0aGUgc2FtZSBzaXplIGFzIG9yIGJpZ2dlcgorICAgICB0aGFuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAqLworCisgIC8qIGNhbGN1bGF0ZSB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBhZGRpbmcgYmVmb3JlIHdlIG9wdGltaXplICovCisgIG9sZF9lbmQgPSAoKGRvdCArIHNpemUgKSAmIH5zaXplKSArIHNpemUrMTsKKyAgLyogd29yayBvdXQgd2hlcmUgdGhlIG5ldyBlbmQgd2lsbCBiZSAtIHJlbWVtYmVyIHRoYXQgd2UncmUgc21hbGxlcgorICAgICB0aGFuIHdlIHVzZWQgdG8gYmUgKi8KKyAgbmV3X2VuZCA9ICgoZG90IC0gc2hyaW5rICsgc2l6ZSkgJiB+c2l6ZSk7CisKKyAgLyogVGhpcyBpcyB0aGUgbmV3IGVuZCAqLworICBnYXAgPSBvbGRfZW5kIC0gKChkb3QgKyBzaXplKSAmIH5zaXplKTsKKworICBzaHJpbmtfZGVsdGEgPSAob2xkX2VuZCAtIG5ld19lbmQpIC0gc2hyaW5rOworCisgIGlmIChzaHJpbmtfZGVsdGEpCisgIHsKKyAgICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHNvIHRoYXQgaXQga25vd3MgaG93IGZhciB0byBhbGlnbiB0byAqLworICAgIHItPmhvd3RvID0gaG93dG9fZG9uZV9hbGlnbl90YWJsZSArIChyLT5ob3d0byAtIGhvd3RvX2FsaWduX3RhYmxlKTsKKworICAgIC8qIEVuY29kZSB0aGUgc3R1ZmYgaW50byB0aGUgYWRkZW5kIC0gZm9yIGZ1dHVyZSB1c2Ugd2UgbmVlZCB0bworICAgICAgIGtub3cgaG93IGJpZyB0aGUgcmVsb2MgdXNlZCB0byBiZSAqLworICAgIHItPmFkZGVuZCA9IG9sZF9lbmQgLSBkb3QgKyByLT5hZGRyZXNzOworCisgICAgLyogVGhpcyB3aWxsIGJlIE4gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4sIGFkanVzdCBhbGwgdGhlIHN5bWJvbHMgKi8KKyAgICBwZXJmb3JtX3NsaXAgKGFiZmQsIHNocmlua19kZWx0YSwgaW5wdXRfc2VjdGlvbiwgci0+YWRkcmVzcyAtIHNocmluayk7CisgICAgc2hyaW5rICs9IHNocmlua19kZWx0YTsKKyAgfQorICByZXR1cm4gc2hyaW5rOworfQorCitzdGF0aWMgYm9vbGVhbgorYl9vdXRfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIGksIGxpbmtfaW5mbywgYWdhaW4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKmk7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGJvb2xlYW4gKmFnYWluOworeworICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLworICBiZmQgKmlucHV0X2JmZCA9IGktPm93bmVyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGk7CisgIGludCBzaHJpbmsgPSAwIDsKKyAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7CisgIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQoaW5wdXRfYmZkLAorCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uKTsKKworICBpZiAocmVsb2Nfc2l6ZSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFdlIG9ubHkgcnVuIHRoaXMgcmVsYXhhdGlvbiBvbmNlLiAgSXQgbWlnaHQgd29yayB0byBydW4gaXQKKyAgICAgbXVsdGlwbGUgdGltZXMsIGJ1dCBpdCBoYXNuJ3QgYmVlbiB0ZXN0ZWQuICAqLworICAqYWdhaW4gPSBmYWxzZTsKKworICBpZiAocmVsb2Nfc2l6ZSkKKyAgICB7CisgICAgICBsb25nIHJlbG9jX2NvdW50OworCisgICAgICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7CisgICAgICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLworICAgICAgcmVsb2NfY291bnQgPQorCWJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2NfdmVjdG9yLAorCQkJCV9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKTsKKyAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAocmVsb2NfY291bnQgPiAwKQorCXsKKwkgIGFyZWxlbnQgKipwYXJlbnQ7CisJICBmb3IgKHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyspCisJICAgIHsKKwkgICAgICBhcmVsZW50ICpyID0gKnBhcmVudDsKKwkgICAgICBzd2l0Y2ggKHItPmhvd3RvLT50eXBlKQorCQl7CisJCWNhc2UgQUxJR05FUjoKKwkJICAvKiBBbiBhbGlnbm1lbnQgcmVsb2MgKi8KKwkJICBzaHJpbmsgPSBhbGlnbmNvZGUgKGFiZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluayk7CisJCSAgYnJlYWs7CisJCWNhc2UgQUJTMzJDT0RFOgorCQkgIC8qIEEgMzJiaXQgcmVsb2MgaW4gYW4gYWRkcmVzc2luZyBtb2RlICovCisJCSAgc2hyaW5rID0gYWJzMzJjb2RlIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHIsIHNocmluaywKKwkJCQkgICAgICBsaW5rX2luZm8pOworCQkgIGJyZWFrOworCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6CisJCSAgc2hyaW5rKz00OworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBzaHJpbms7CisKKyAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQorICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgIHJldHVybiB0cnVlOworIGVycm9yX3JldHVybjoKKyAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQorICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJmZF9ieXRlICoKK2Jfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKKwkJCQkJICBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworICAgICBiZmRfYnl0ZSAqZGF0YTsKKyAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLworICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7CisgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOworICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsCisJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKKyAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7CisgIGxvbmcgcmVsb2NfY291bnQ7CisKKyAgaWYgKHJlbG9jX3NpemUgPCAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIElmIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBkb24ndCBib3RoZXIgdG8gcmVsYXguICAqLworICBpZiAocmVsb2NhdGVhYmxlKQorICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKKwkJCQkJCSAgICAgICBsaW5rX29yZGVyLAorCQkJCQkJICAgICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwKKwkJCQkJCSAgICAgICBzeW1ib2xzKTsKKworICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7CisgIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IDE7CisKKyAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLworICBCRkRfQVNTRVJUICh0cnVlID09IGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLAorCQkJCQkJaW5wdXRfc2VjdGlvbiwKKwkJCQkJCWRhdGEsCisJCQkJCQkwLAorCQkJCQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSk7CisKKyAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCisJCQkJCWlucHV0X3NlY3Rpb24sCisJCQkJCXJlbG9jX3ZlY3RvciwKKwkJCQkJc3ltYm9scyk7CisgIGlmIChyZWxvY19jb3VudCA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGlmIChyZWxvY19jb3VudCA+IDApCisgICAgeworICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKKyAgICAgIGFyZWxlbnQgKnJlbG9jIDsKKworICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7CisgICAgICB1bnNpZ25lZCBpbnQgcnVuOworICAgICAgdW5zaWduZWQgaW50IGlkeDsKKworICAgICAgLyogRmluZCBob3cgbG9uZyBhIHJ1biB3ZSBjYW4gZG8gKi8KKyAgICAgIHdoaWxlIChkc3RfYWRkcmVzcyA8IGxpbmtfb3JkZXItPnNpemUpCisJeworCSAgcmVsb2MgPSAqcGFyZW50OworCSAgaWYgKHJlbG9jKQorCSAgICB7CisJICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCisJCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCisJCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCisJICAgICAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZHJlc3MgPj0gc3JjX2FkZHJlc3MpOworCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7CisJICAgICAgcGFyZW50Kys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKKwkgICAgfQorCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KKwkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKKwkgICAgeworCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOworCSAgICB9CisKKwkgIC8qIE5vdyBkbyB0aGUgcmVsb2NhdGlvbiAqLworCisJICBpZiAocmVsb2MpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKKwkJeworCQljYXNlIEFCUzMyQ09ERToKKwkJICBjYWxsanhfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywKKwkJCQkgICBzcmNfYWRkcmVzcyArIGRhdGEsIGRzdF9hZGRyZXNzICsgZGF0YSwKKwkJCQkgICBpbnB1dF9zZWN0aW9uKTsKKwkJICBzcmNfYWRkcmVzcys9NDsKKwkJICBkc3RfYWRkcmVzcys9NDsKKwkJICBicmVhazsKKwkJY2FzZSBBQlMzMjoKKwkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCisJCQkgICAgICAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgc3JjX2FkZHJlc3MpCisJCQkgICAgICAgKyBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pKSwKKwkJCSAgICAgIGRhdGEgKyBkc3RfYWRkcmVzcyk7CisJCSAgc3JjX2FkZHJlc3MrPTQ7CisJCSAgZHN0X2FkZHJlc3MrPTQ7CisJCSAgYnJlYWs7CisJCWNhc2UgQ0FMTEo6CisJCSAgY2FsbGpfY2FsbGJhY2sgKGlucHV0X2JmZCwgbGlua19pbmZvLCByZWxvYywgZGF0YSwKKwkJCQkgIHNyY19hZGRyZXNzLCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKKwkJCQkgIGZhbHNlKTsKKwkJICBzcmNfYWRkcmVzcys9NDsKKwkJICBkc3RfYWRkcmVzcys9NDsKKwkJICBicmVhazsKKwkJY2FzZSBBTElHTkRPTkU6CisJCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA+PSBzcmNfYWRkcmVzcyk7CisJCSAgQkZEX0FTU0VSVCAocmVsb2MtPmFkZGVuZCA8PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOworCQkgIHNyY19hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKKwkJICBkc3RfYWRkcmVzcyA9ICgoZHN0X2FkZHJlc3MgKyByZWxvYy0+aG93dG8tPnNpemUpCisJCQkJICYgfnJlbG9jLT5ob3d0by0+c2l6ZSk7CisJCSAgYnJlYWs7CisJCWNhc2UgQUJTMzJDT0RFX1NIUlVOSzoKKwkJICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjYWxseCwgYnV0IHdlJ3ZlIGZvdW5kIG91dCB0aGF0IGEKKwkJICAgICBjYWxsaiB3aWxsIHJlYWNoLCBzbyBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLworCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCisJCQkJICBzcmNfYWRkcmVzcyArIDQsIGRzdF9hZGRyZXNzLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgdHJ1ZSk7CisJCSAgZHN0X2FkZHJlc3MrPTQ7CisJCSAgc3JjX2FkZHJlc3MrPTg7CisJCSAgYnJlYWs7CisJCWNhc2UgUENSRUwyNDoKKwkJICB7CisJCSAgICBsb25nIGludCB3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAorCQkJCQkJZGF0YSArIHNyY19hZGRyZXNzKTsKKwkJICAgIGJmZF92bWEgdmFsdWU7CisKKwkJICAgIHZhbHVlID0gZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKwkJICAgIHdvcmQgPSAoKHdvcmQgJiB+QkFMX01BU0spCisJCQkgICAgfCAoKCh3b3JkICYgQkFMX01BU0spCisJCQkJKyB2YWx1ZQorCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pCisJCQkJKyByZWxvYy0+YWRkZW5kKQorCQkJICAgICAgICYgQkFMX01BU0spKTsKKworCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB3b3JkLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCQkgICAgZHN0X2FkZHJlc3MrPTQ7CisJCSAgICBzcmNfYWRkcmVzcys9NDsKKworCQkgIH0KKwkJICBicmVhazsKKworCQljYXNlIFBDUkVMMTM6CisJCSAgeworCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKKwkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7CisJCSAgICBiZmRfdm1hIHZhbHVlOworCisJCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisJCSAgICB3b3JkID0gKCh3b3JkICYgflBDUkVMMTNfTUFTSykKKwkJCSAgICB8ICgoKHdvcmQgJiBQQ1JFTDEzX01BU0spCisJCQkJKyB2YWx1ZQorCQkJCSsgcmVsb2MtPmFkZGVuZAorCQkJCS0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQorCQkJICAgICAgICYgUENSRUwxM19NQVNLKSk7CisKKwkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKwkJICAgIGRzdF9hZGRyZXNzKz00OworCQkgICAgc3JjX2FkZHJlc3MrPTQ7CisKKwkJICB9CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICBhYm9ydCgpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCisgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKKyAgcmV0dXJuIGRhdGE7CisgZXJyb3JfcmV0dXJuOgorICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCisgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJ1aWxkIHRoZSB0cmFuc2ZlciB2ZWN0b3JzIGZvciBCaWcgYW5kIExpdHRsZS1FbmRpYW4gQi5PVVQgZmlsZXMuICAqLworCisjZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKworI2RlZmluZSBiX291dF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBiX291dF9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBiX291dF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluaworI2RlZmluZSBiX291dF9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCisjZGVmaW5lIGJfb3V0X2JmZF9nY19zZWN0aW9ucyAgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKKworI2RlZmluZSBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCisgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKKworY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfYmlnX2hvc3QgPQoreworICAiYi5vdXQuYmlnIiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKyAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAorICAnXycsCQkJCS8qIHN5bWJvbCBsZWFkaW5nIGNoYXIgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKyB7X2JmZF9kdW1teV90YXJnZXQsIGJfb3V0X29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyB7YmZkX2ZhbHNlLCBiX291dF9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisge2JmZF9mYWxzZSwgYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSAwLAorfTsKKworCitjb25zdCBiZmRfdGFyZ2V0IGJfb3V0X3ZlY19saXR0bGVfaG9zdCA9Cit7CisgICJiLm91dC5saXR0bGUiLAkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKKyAgJ18nLAkJCQkvKiBzeW1ib2wgbGVhZGluZyBjaGFyICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisKKyAge19iZmRfZHVtbXlfdGFyZ2V0LCBiX291dF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyAge2JmZF9mYWxzZSwgYl9vdXRfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChhb3V0XzMyKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfYnNkKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYW91dF8zMiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYl9vdXQpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYl9vdXQpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiX291dCksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSAwCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NhY2hlLmMgYi9iZmQvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhkZTRiCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NhY2hlLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qIEJGRCBsaWJyYXJ5IC0tIGNhY2hpbmcgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgKHN0ZXZlQGN5Z251cy5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitTRUNUSU9OCisJRmlsZSBjYWNoaW5nCisKKwlUaGUgZmlsZSBjYWNoaW5nIG1lY2hhbmlzbSBpcyBlbWJlZGRlZCB3aXRoaW4gQkZEIGFuZCBhbGxvd3MKKwl0aGUgYXBwbGljYXRpb24gdG8gb3BlbiBhcyBtYW55IEJGRHMgYXMgaXQgd2FudHMgd2l0aG91dAorCXJlZ2FyZCB0byB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtJ3MgZmlsZSBkZXNjcmlwdG9yCisJbGltaXQgKG9mdGVuIGFzIGxvdyBhcyAyMCBvcGVuIGZpbGVzKS4gIFRoZSBtb2R1bGUgaW4KKwk8PGNhY2hlLmM+PiBtYWludGFpbnMgYSBsZWFzdCByZWNlbnRseSB1c2VkIGxpc3Qgb2YKKwk8PEJGRF9DQUNIRV9NQVhfT1BFTj4+IGZpbGVzLCBhbmQgZXhwb3J0cyB0aGUgbmFtZQorCTw8YmZkX2NhY2hlX2xvb2t1cD4+LCB3aGljaCBydW5zIGFyb3VuZCBhbmQgbWFrZXMgc3VyZSB0aGF0CisJdGhlIHJlcXVpcmVkIEJGRCBpcyBvcGVuLiBJZiBub3QsIHRoZW4gaXQgY2hvb3NlcyBhIGZpbGUgdG8KKwljbG9zZSwgY2xvc2VzIGl0IGFuZCBvcGVucyB0aGUgb25lIHdhbnRlZCwgcmV0dXJuaW5nIGl0cyBmaWxlCisJaGFuZGxlLiAKKworKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCitzdGF0aWMgdm9pZCBpbnNlcnQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIHNuaXAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGNsb3NlX29uZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYm9vbGVhbiBiZmRfY2FjaGVfZGVsZXRlIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qCitJTlRFUk5BTF9GVU5DVElPTgorCUJGRF9DQUNIRV9NQVhfT1BFTiBtYWNybworCitERVNDUklQVElPTgorCVRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB3aGljaCB0aGUgY2FjaGUgd2lsbCBrZWVwIG9wZW4gYXQKKwlvbmUgdGltZS4KKworLiNkZWZpbmUgQkZEX0NBQ0hFX01BWF9PUEVOIDEwCisKKyovCisKKy8qIFRoZSBudW1iZXIgb2YgQkZEIGZpbGVzIHdlIGhhdmUgb3Blbi4gICovCisKK3N0YXRpYyBpbnQgb3Blbl9maWxlczsKKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2xhc3RfY2FjaGUKKworU1lOT1BTSVMKKwlleHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKKworREVTQ1JJUFRJT04KKwlaZXJvLCBvciBhIHBvaW50ZXIgdG8gdGhlIHRvcG1vc3QgQkZEIG9uIHRoZSBjaGFpbi4gIFRoaXMgaXMKKwl1c2VkIGJ5IHRoZSA8PGJmZF9jYWNoZV9sb29rdXA+PiBtYWNybyBpbiBAZmlsZXtsaWJiZmQuaH0gdG8KKwlkZXRlcm1pbmUgd2hlbiBpdCBjYW4gYXZvaWQgYSBmdW5jdGlvbiBjYWxsLgorKi8KKworYmZkICpiZmRfbGFzdF9jYWNoZTsKKworLyoKKyAgSU5URVJOQUxfRlVOQ1RJT04KKyAgCWJmZF9jYWNoZV9sb29rdXAKKyAKKyAgREVTQ1JJUFRJT04KKyAJQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1aXJlZCBCRkQgaXMgdGhlIHNhbWUgYXMgdGhlIGxhc3Qgb25lCisgCWxvb2tlZCB1cC4gSWYgc28sIHRoZW4gaXQgY2FuIHVzZSB0aGUgc3RyZWFtIGluIHRoZSBCRkQgd2l0aAorIAlpbXB1bml0eSwgc2luY2UgaXQgY2FuJ3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGxvb2t1cDsKKyAJb3RoZXJ3aXNlLCBpdCBoYXMgdG8gcGVyZm9ybSB0aGUgY29tcGxpY2F0ZWQgbG9va3VwIGZ1bmN0aW9uLgorIAorICAuI2RlZmluZSBiZmRfY2FjaGVfbG9va3VwKHgpIFwKKyAgLiAgICAoKHgpPT1iZmRfbGFzdF9jYWNoZT8gXAorICAuICAgICAgKEZJTEUqKShiZmRfbGFzdF9jYWNoZS0+aW9zdHJlYW0pOiBcCisgIC4gICAgICAgYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoeCkpCisgCisgCisgKi8KKworLyogSW5zZXJ0IGEgQkZEIGludG8gdGhlIGNhY2hlLiAgKi8KKworc3RhdGljIElOTElORSB2b2lkCitpbnNlcnQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGJmZF9sYXN0X2NhY2hlID09IE5VTEwpCisgICAgeworICAgICAgYWJmZC0+bHJ1X25leHQgPSBhYmZkOworICAgICAgYWJmZC0+bHJ1X3ByZXYgPSBhYmZkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFiZmQtPmxydV9uZXh0ID0gYmZkX2xhc3RfY2FjaGU7CisgICAgICBhYmZkLT5scnVfcHJldiA9IGJmZF9sYXN0X2NhY2hlLT5scnVfcHJldjsKKyAgICAgIGFiZmQtPmxydV9wcmV2LT5scnVfbmV4dCA9IGFiZmQ7CisgICAgICBhYmZkLT5scnVfbmV4dC0+bHJ1X3ByZXYgPSBhYmZkOworICAgIH0KKyAgYmZkX2xhc3RfY2FjaGUgPSBhYmZkOworfQorCisvKiBSZW1vdmUgYSBCRkQgZnJvbSB0aGUgY2FjaGUuICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK3NuaXAgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYWJmZC0+bHJ1X3ByZXYtPmxydV9uZXh0ID0gYWJmZC0+bHJ1X25leHQ7CisgIGFiZmQtPmxydV9uZXh0LT5scnVfcHJldiA9IGFiZmQtPmxydV9wcmV2OworICBpZiAoYWJmZCA9PSBiZmRfbGFzdF9jYWNoZSkKKyAgICB7CisgICAgICBiZmRfbGFzdF9jYWNoZSA9IGFiZmQtPmxydV9uZXh0OworICAgICAgaWYgKGFiZmQgPT0gYmZkX2xhc3RfY2FjaGUpCisJYmZkX2xhc3RfY2FjaGUgPSBOVUxMOworICAgIH0KK30KKworLyogV2UgbmVlZCB0byBvcGVuIGEgbmV3IGZpbGUsIGFuZCB0aGUgY2FjaGUgaXMgZnVsbC4gIEZpbmQgdGhlIGxlYXN0CisgICByZWNlbnRseSB1c2VkIGNhY2hlYWJsZSBCRkQgYW5kIGNsb3NlIGl0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2Nsb3NlX29uZSAoKQoreworICByZWdpc3RlciBiZmQgKmtpbGw7CisKKyAgaWYgKGJmZF9sYXN0X2NhY2hlID09IE5VTEwpCisgICAga2lsbCA9IE5VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGtpbGwgPSBiZmRfbGFzdF9jYWNoZS0+bHJ1X3ByZXY7CisJICAgISBraWxsLT5jYWNoZWFibGU7CisJICAga2lsbCA9IGtpbGwtPmxydV9wcmV2KQorCXsKKwkgIGlmIChraWxsID09IGJmZF9sYXN0X2NhY2hlKQorCSAgICB7CisJICAgICAga2lsbCA9IE5VTEw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChraWxsID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhlcmUgYXJlIG5vIG9wZW4gY2FjaGVhYmxlIEJGRCdzLiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBraWxsLT53aGVyZSA9IGZ0ZWxsICgoRklMRSAqKSBraWxsLT5pb3N0cmVhbSk7CisKKyAgcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgKGtpbGwpOworfQorCisvKiBDbG9zZSBhIEJGRCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGNhY2hlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2JmZF9jYWNoZV9kZWxldGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYm9vbGVhbiByZXQ7CisKKyAgaWYgKGZjbG9zZSAoKEZJTEUgKikgYWJmZC0+aW9zdHJlYW0pID09IDApCisgICAgcmV0ID0gdHJ1ZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJldCA9IGZhbHNlOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyAgICB9CisKKyAgc25pcCAoYWJmZCk7CisKKyAgYWJmZC0+aW9zdHJlYW0gPSBOVUxMOworICAtLW9wZW5fZmlsZXM7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2NhY2hlX2luaXQKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9jYWNoZV9pbml0IChiZmQgKmFiZmQpOworCitERVNDUklQVElPTgorCUFkZCBhIG5ld2x5IG9wZW5lZCBCRkQgdG8gdGhlIGNhY2hlLgorKi8KKworYm9vbGVhbgorYmZkX2NhY2hlX2luaXQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgQkZEX0FTU0VSVCAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTCk7CisgIGlmIChvcGVuX2ZpbGVzID49IEJGRF9DQUNIRV9NQVhfT1BFTikKKyAgICB7CisgICAgICBpZiAoISBjbG9zZV9vbmUgKCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgaW5zZXJ0IChhYmZkKTsKKyAgKytvcGVuX2ZpbGVzOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2NhY2hlX2Nsb3NlCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfY2FjaGVfY2xvc2UgKGJmZCAqYWJmZCk7CisKK0RFU0NSSVBUSU9OCisJUmVtb3ZlIHRoZSBCRkQgQHZhcnthYmZkfSBmcm9tIHRoZSBjYWNoZS4gSWYgdGhlIGF0dGFjaGVkIGZpbGUgaXMgb3BlbiwKKwl0aGVuIGNsb3NlIGl0IHRvby4KKworUkVUVVJOUworCTw8ZmFsc2U+PiBpcyByZXR1cm5lZCBpZiBjbG9zaW5nIHRoZSBmaWxlIGZhaWxzLCA8PHRydWU+PiBpcworCXJldHVybmVkIGlmIGFsbCBpcyB3ZWxsLgorKi8KKworYm9vbGVhbgorYmZkX2NhY2hlX2Nsb3NlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChhYmZkLT5pb3N0cmVhbSA9PSBOVUxMCisgICAgICB8fCAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBiZmRfY2FjaGVfZGVsZXRlIChhYmZkKTsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX29wZW5fZmlsZQorCitTWU5PUFNJUworCUZJTEUqIGJmZF9vcGVuX2ZpbGUoYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlDYWxsIHRoZSBPUyB0byBvcGVuIGEgZmlsZSBmb3IgQHZhcnthYmZkfS4gIFJldHVybiB0aGUgPDxGSUxFICo+PgorCShwb3NzaWJseSA8PE5VTEw+PikgdGhhdCByZXN1bHRzIGZyb20gdGhpcyBvcGVyYXRpb24uICBTZXQgdXAgdGhlCisJQkZEIHNvIHRoYXQgZnV0dXJlIGFjY2Vzc2VzIGtub3cgdGhlIGZpbGUgaXMgb3Blbi4gSWYgdGhlIDw8RklMRSAqPj4KKwlyZXR1cm5lZCBpcyA8PE5VTEw+PiwgdGhlbiBpdCB3b24ndCBoYXZlIGJlZW4gcHV0IGluIHRoZQorCWNhY2hlLCBzbyBpdCB3b24ndCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSBpdC4KKyovCisKK0ZJTEUgKgorYmZkX29wZW5fZmlsZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhYmZkLT5jYWNoZWFibGUgPSB0cnVlOwkvKiBBbGxvdyBpdCB0byBiZSBjbG9zZWQgbGF0ZXIuICovCisKKyAgaWYgKG9wZW5fZmlsZXMgPj0gQkZEX0NBQ0hFX01BWF9PUEVOKQorICAgIHsKKyAgICAgIGlmICghIGNsb3NlX29uZSAoKSkKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc3dpdGNoIChhYmZkLT5kaXJlY3Rpb24pCisgICAgeworICAgIGNhc2UgcmVhZF9kaXJlY3Rpb246CisgICAgY2FzZSBub19kaXJlY3Rpb246CisgICAgICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fUkIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKKyAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKKyAgICAgIGlmIChhYmZkLT5vcGVuZWRfb25jZSA9PSB0cnVlKQorCXsKKwkgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9SVUIpOworCSAgaWYgKGFiZmQtPmlvc3RyZWFtID09IE5VTEwpCisJICAgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9XVUIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBDcmVhdGUgdGhlIGZpbGUuICBVbmxpbmsgaXQgZmlyc3QsIGZvciB0aGUgY29udmVuaWVuY2Ugb2YKKyAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtcyB3aGljaCB3b3JyeSBhYm91dCBvdmVyd3JpdGluZyBydW5uaW5nCisgICAgICAgICAgICAgYmluYXJpZXMuICAqLworCSAgdW5saW5rIChhYmZkLT5maWxlbmFtZSk7CisJICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChhYmZkLT5maWxlbmFtZSwgRk9QRU5fV0IpOworCSAgYWJmZC0+b3BlbmVkX29uY2UgPSB0cnVlOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfY2FjaGVfaW5pdCAoYWJmZCkpCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiAoRklMRSAqKSBhYmZkLT5pb3N0cmVhbTsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIKKworU1lOT1BTSVMKKwlGSUxFICpiZmRfY2FjaGVfbG9va3VwX3dvcmtlcihiZmQgKmFiZmQpOworCitERVNDUklQVElPTgorCUNhbGxlZCB3aGVuIHRoZSBtYWNybyA8PGJmZF9jYWNoZV9sb29rdXA+PiBmYWlscyB0byBmaW5kIGEKKwlxdWljayBhbnN3ZXIuICBGaW5kIGEgZmlsZSBkZXNjcmlwdG9yIGZvciBAdmFye2FiZmR9LiAgSWYKKwluZWNlc3NhcnksIGl0IG9wZW4gaXQuICBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3JlIHRoYW4KKwk8PEJGRF9DQUNIRV9NQVhfT1BFTj4+IGZpbGVzIG9wZW4sIGl0IHRyaWVzIHRvIGNsb3NlIG9uZSBmaXJzdCwgdG8KKwlhdm9pZCBydW5uaW5nIG91dCBvZiBmaWxlIGRlc2NyaXB0b3JzLiAgCisqLworCitGSUxFICoKK2JmZF9jYWNoZV9sb29rdXBfd29ya2VyIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQorICAgIGFib3J0ICgpOworCisgIGlmIChhYmZkLT5teV9hcmNoaXZlKSAKKyAgICBhYmZkID0gYWJmZC0+bXlfYXJjaGl2ZTsKKworICBpZiAoYWJmZC0+aW9zdHJlYW0gIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBNb3ZlIHRoZSBmaWxlIHRvIHRoZSBzdGFydCBvZiB0aGUgY2FjaGUuICAqLworICAgICAgaWYgKGFiZmQgIT0gYmZkX2xhc3RfY2FjaGUpCisJeworCSAgc25pcCAoYWJmZCk7CisJICBpbnNlcnQgKGFiZmQpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYmZkX29wZW5fZmlsZSAoYWJmZCkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIGlmIChmc2VlayAoKEZJTEUgKikgYWJmZC0+aW9zdHJlYW0sIGFiZmQtPndoZXJlLCBTRUVLX1NFVCkgIT0gMCkKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChGSUxFICopIGFiZmQtPmlvc3RyZWFtOworfQpkaWZmIC0tZ2l0IGEvYmZkL2NmLWkzODZseW54LmMgYi9iZmQvY2YtaTM4Nmx5bnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTE0YmRlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NmLWkzODZseW54LmMKQEAgLTAsMCArMSwzMSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBMeW54T1MgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisjZGVmaW5lIFRBUkdFVF9TWU0JaTM4Nmx5bnhfY29mZl92ZWMKKyNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtaTM4Ni1seW54IgorCisjZGVmaW5lIExZTlhPUworCisjZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKKworI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NmLW02OGtseW54LmMgYi9iZmQvY2YtbTY4a2x5bnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc0ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NmLW02OGtseW54LmMKQEAgLTAsMCArMSwyOCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBNNjhLIENPRkYgTHlueE9TIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX1NZTQltNjhrbHlueF9jb2ZmX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLWx5bngiCisjZGVmaW5lIExZTlhPUworI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCisjZGVmaW5lIFNUQVRJQ19SRUxPQ1MKKyNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECisKKyNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jZi1zcGFyY2x5bnguYyBiL2JmZC9jZi1zcGFyY2x5bnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRhMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NmLXNwYXJjbHlueC5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgU3BhcmMgQ09GRiBMeW54T1MgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfU1lNCXNwYXJjbHlueF9jb2ZmX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1zcGFyYy1seW54IgorCisjZGVmaW5lIExZTlhPUworCisjZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKKworI2luY2x1ZGUgImNvZmYtc3BhcmMuYyIKZGlmZiAtLWdpdCBhL2JmZC9jaXNjby1jb3JlLmMgYi9iZmQvY2lzY28tY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzliYmQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY2lzY28tY29yZS5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIENJU0NPIGNyYXNoIGR1bXBzLgorCitDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisvKiBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgcmV0dXJucyBhIGhvc3Qgc2lnbmFsICh0aGlzIHByb2JhYmx5IHNob3VsZAorICAgYmUgZml4ZWQpLiAgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyogZm9yIE1TVkMgYnVpbGRzICovCisjaWZuZGVmIFNJR1RSQVAKKyMgZGVmaW5lIFNJR1RSQVAgNQorI2VuZGlmCisjaWZuZGVmIFNJR0VNVAorIyBkZWZpbmUgU0lHRU1UIDYKKyNlbmRpZgorI2lmbmRlZiBTSUdCVVMKKyMgZGVmaW5lIFNJR0JVUyAxMAorI2VuZGlmCisMCisjZGVmaW5lIENSQVNIX0lORk8gKDB4ZmZjKQorI2RlZmluZSBDUkFTSF9NQUdJQyAweGRlYWQxMjM0CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ1JBU0hfUkVBU09OX05PVENSQVNIRUQgPSAwLAorICAgIENSQVNIX1JFQVNPTl9FWENFUFRJT04gPSAxLAorICAgIENSQVNIX1JFQVNPTl9DT1JSVVBUID0gMiwKKyAgfSBjcmFzaHJlYXNvbjsKKworc3RydWN0IGNyYXNoaW5mb19leHRlcm5hbAoreworICBjaGFyIG1hZ2ljWzRdOwkJCS8qIE1hZ2ljIG51bWJlciAqLworICBjaGFyIHZlcnNpb25bNF07CQkvKiBWZXJzaW9uIG51bWJlciAqLworICBjaGFyIHJlYXNvbls0XTsJCS8qIENyYXNoIHJlYXNvbiAqLworICBjaGFyIGNwdV92ZWN0b3JbNF07CQkvKiBDUFUgdmVjdG9yIGZvciBleGNlcHRpb25zICovCisgIGNoYXIgcmVnaXN0ZXJzWzRdOwkJLyogUG9pbnRlciB0byBzYXZlZCByZWdpc3RlcnMgKi8KKyAgY2hhciByYW1iYXNlWzRdOwkJLyogQmFzZSBvZiBSQU0gKG5vdCBpbiBWMSBjcmFzaCBpbmZvKSAqLworfTsKKwwKK3N0cnVjdCBjaXNjb19jb3JlX3N0cnVjdAoreworICBpbnQgc2lnOworfTsKKwwKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK2Npc2NvX2NvcmVfZmlsZV9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgYnVmWzRdOworICB1bnNpZ25lZCBpbnQgY3Jhc2hpbmZvX29mZnNldDsKKyAgc3RydWN0IGNyYXNoaW5mb19leHRlcm5hbCBjcmFzaGluZm87CisgIGludCBucmVhZDsKKyAgdW5zaWduZWQgaW50IHJhbWJhc2U7CisgIHNlY19wdHIgYXNlY3Q7CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBDUkFTSF9JTkZPLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBucmVhZCA9IGJmZF9yZWFkIChidWYsIDEsIDQsIGFiZmQpOworICBpZiAobnJlYWQgIT0gNCkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGNyYXNoaW5mb19vZmZzZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYpOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgY3Jhc2hpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbnJlYWQgPSBiZmRfcmVhZCAoJmNyYXNoaW5mbywgMSwgc2l6ZW9mIChjcmFzaGluZm8pLCBhYmZkKTsKKyAgaWYgKG5yZWFkICE9IHNpemVvZiAoY3Jhc2hpbmZvKSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5tYWdpYykgIT0gQ1JBU0hfTUFHSUMpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc3dpdGNoIChiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8udmVyc2lvbikpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAxOgorICAgICAgcmFtYmFzZSA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMjoKKyAgICAgIHJhbWJhc2UgPSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8ucmFtYmFzZSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlLiAgKi8KKworICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEgPQorICAgICgoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICopCisgICAgIGJmZF96bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCkpKTsKKyAgaWYgKGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN3aXRjaCAoKGNyYXNocmVhc29uKSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8ucmVhc29uKSkKKyAgICB7CisgICAgY2FzZSBDUkFTSF9SRUFTT05fTk9UQ1JBU0hFRDoKKyAgICAgIC8qIENyYXNoIGZpbGUgcHJvYmFibHkgY2FtZSBmcm9tIHdyaXRlIGNvcmUuICAqLworICAgICAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUkFTSF9SRUFTT05fQ09SUlVQVDoKKyAgICAgIC8qIFRoZSBjcmFzaCBjb250ZXh0IGFyZWEgd2FzIGNvcnJ1cHQgLS0gcHJvY2VlZCB3aXRoIGNhdXRpb24uCisJIFdlIGhhdmUgbm8gd2F5IG9mIHBhc3NpbmcgdGhpcyBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSBjYWxsZXIuICAqLworICAgICAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUkFTSF9SRUFTT05fRVhDRVBUSU9OOgorICAgICAgLyogQ3Jhc2ggb2NjdXJlZCBkdWUgdG8gQ1BVIGV4Y2VwdGlvbi4gICovCisKKyAgICAgIC8qIFRoaXMgaXMgNjhrLXNwZWNpZmljOyBmb3IgTUlQUyB3ZSdsbCBuZWVkIHRvIGludGVycHJldAorCSBjcHVfdmVjdG9yIGRpZmZlcmVudGx5IGJhc2VkIG9uIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbgorCSAoc2luY2UgQ0lTQ08gY29yZSBmaWxlcyBkb24ndCBzZWVtIHRvIGhhdmUgdGhlIHByb2Nlc3NvcgorCSBlbmNvZGVkIGluIHRoZW0pLiAgKi8KKworICAgICAgc3dpdGNoIChiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8uY3B1X3ZlY3RvcikpCisJeworCSAgIC8qIGJ1cyBlcnJvciAgICAgICAgICAgKi8KKwljYXNlIDIgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0JVUzsgYnJlYWs7CisJICAgLyogYWRkcmVzcyBlcnJvciAgICAgICAqLworCWNhc2UgMyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKKwkgICAvKiBpbGxlZ2FsIGluc3RydWN0aW9uICovCisJY2FzZSA0IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdJTEw7ICBicmVhazsKKwkgICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCisJY2FzZSA1IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKKwkgICAvKiBjaGsgaW5zdHJ1Y3Rpb24gICAgICovCisJY2FzZSA2IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7IGJyZWFrOworCSAgIC8qIHRyYXB2IGluc3RydWN0aW9uICAgKi8KKwljYXNlIDcgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7CisJICAgLyogcHJpdmlsZWdlIHZpb2xhdGlvbiAqLworCWNhc2UgOCA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHU0VHVjsgYnJlYWs7CisJICAgLyogdHJhY2UgdHJhcCAgICAgICAgICAqLworCWNhc2UgOSA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHVFJBUDsgIGJyZWFrOworCSAgIC8qIGxpbmUgMTAxMCBlbXVsYXRvciAgKi8KKwljYXNlIDEwOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOworCSAgIC8qIGxpbmUgMTExMSBlbXVsYXRvciAgKi8KKwljYXNlIDExOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOworCisJICAvKiBDb3Byb2Nlc3NvciBwcm90b2NvbCB2aW9sYXRpb24uICBVc2luZyBhIHN0YW5kYXJkIE1NVSBvciBGUFUKKwkgICAgIHRoaXMgY2Fubm90IGJlIHRyaWdnZXJlZCBieSBzb2Z0d2FyZS4gIENhbGwgaXQgYSBTSUdCVVMuICAqLworCWNhc2UgMTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyAgYnJlYWs7CisKKwkgIC8qIGludGVycnVwdCAgICAgICAgICAgKi8KKwljYXNlIDMxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lOVDsgIGJyZWFrOworCSAgLyogYnJlYWtwb2ludCAgICAgICAgICAqLworCWNhc2UgMzM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHVFJBUDsgIGJyZWFrOworCisJICAvKiBmbG9hdGluZyBwb2ludCBlcnIgICovCisJY2FzZSA0ODogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKKwkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KKwljYXNlIDQ5OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOworCSAgLyogemVybyBkaXZpZGUgICAgICAgICAqLworCWNhc2UgNTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7CisJICAvKiB1bmRlcmZsb3cgICAgICAgICAgICovCisJY2FzZSA1MTogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKKwkgIC8qIG9wZXJhbmQgZXJyb3IgICAgICAgKi8KKwljYXNlIDUyOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOworCSAgIC8qIG92ZXJmbG93ICAgICAgICAgICAgKi8KKwljYXNlIDUzOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOworCSAgLyogTkFOICAgICAgICAgICAgICAgICAqLworCWNhc2UgNTQ6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7CisJZGVmYXVsdDoKKyNpZm5kZWYgU0lHRU1UCisjZGVmaW5lIFNJR0VNVCBTSUdUUkFQCisjZW5kaWYKKwkgIC8qICJzb2Z0d2FyZSBnZW5lcmF0ZWQiKi8KKwkgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRU1UOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBVbmtub3duIGNyYXNoIHJlYXNvbi4gICovCisgICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOworICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKKworICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOworICBpZiAoYXNlY3QgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgYXNlY3QtPm5hbWUgPSAiLnJlZyI7CisgIGFzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7CisgIC8qIFRoaXMgY2FuIGJlIGJpZ2dlciB0aGFuIHRoZSByZWFsIHNpemUuICBTZXQgaXQgdG8gdGhlIHNpemUgb2YgdGhlIHdob2xlCisgICAgIGNvcmUgZmlsZS4gICovCisgIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7CisgIGFzZWN0LT52bWEgPSAwOworICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWdpc3RlcnMpIC0gcmFtYmFzZTsKKyAgYXNlY3QtPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKKyAgYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDsKKyAgKythYmZkLT5zZWN0aW9uX2NvdW50OworCisgIC8qIFRoZXJlIGlzIG9ubHkgb25lIHNlY3Rpb24gY29udGFpbmluZyBkYXRhIGZyb20gdGhlIHRhcmdldCBzeXN0ZW0ncyBSQU0uCisgICAgIFdlIGNhbGwgaXQgLmRhdGEuICAqLworICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOworICBpZiAoYXNlY3QgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgYXNlY3QtPm5hbWUgPSAiLmRhdGEiOworICBhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7CisgIC8qIFRoZSBzaXplIG9mIG1lbW9yeSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29yZSBmaWxlIGl0c2VsZi4gICovCisgIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7CisgIGFzZWN0LT52bWEgPSByYW1iYXNlOworICBhc2VjdC0+ZmlsZXBvcyA9IDA7CisgIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7CisgIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7CisgICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKKworIGVycm9yX3JldHVybjoKKyAgeworICAgIHNlY19wdHIgbmV4dHNlY3Q7CisgICAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdCAhPSBOVUxMOykKKyAgICAgIHsKKwluZXh0c2VjdCA9IGFzZWN0LT5uZXh0OworCWZyZWUgKGFzZWN0KTsKKwlhc2VjdCA9IG5leHRzZWN0OworICAgICAgfQorICAgIGZyZWUgKGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY2hhciAqCitjaXNjb19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBOVUxMOworfQorCitpbnQKK2Npc2NvX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWc7Cit9CisKK2Jvb2xlYW4KK2Npc2NvX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQorICAgICBiZmQgKmNvcmVfYmZkOworICAgICBiZmQgKmV4ZWNfYmZkOworeworICByZXR1cm4gdHJ1ZTsKK30KKwwKK2NvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV92ZWMgPQorICB7CisgICAgInRyYWQtY29yZSIsCisgICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLworICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCisgICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCisgICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCisgICAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworCisgICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KKyAgICAgY2lzY29fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KKyAgICB9LAorICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCisgICAgfSwKKyAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKKyAgICB9LAorICAgIAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChjaXNjbyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYTI5ay5jIGIvYmZkL2NvZmYtYTI5ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjIzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi1hMjlrLmMKQEAgLTAsMCArMSw2NDAgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgQU1EIDI5MDAwIENPRkYgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBhdCBOZXcgWW9yayBVbml2ZXJzaXR5IDcvOC85MS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEEyOUsgMQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiY29mZi9hMjlrLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworc3RhdGljIGxvbmcgZ2V0X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChhc3ltYm9sICopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYTI5a19yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOworc3RhdGljIGJvb2xlYW4gY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCisKKyNkZWZpbmUgSU5TRVJUX0hXT1JEKFdPUkQsSFdPUkQpCVwKKyAgICAoKChXT1JEKSAmIDB4ZmYwMGZmMDApIHwgKCgoSFdPUkQpICYgMHhmZjAwKSA8PCA4KSB8ICgoSFdPUkQpJiAweGZmKSkKKyNkZWZpbmUgRVhUUkFDVF9IV09SRChXT1JEKSBcCisgICAgKCgoKFdPUkQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKFdPUkQpJiAweGZmKSkKKyNkZWZpbmUgU0lHTl9FWFRFTkRfSFdPUkQoSFdPUkQpIFwKKyAgICAoKEhXT1JEKSAmIDB4ODAwMCA/IChIV09SRCl8KH4weGZmZmZMKSA6IChIV09SRCkpCisKKy8qIFByb3ZpZGVkIHRoZSBzeW1ib2wsIHJldHVybnMgdGhlIHZhbHVlIHJlZmZlZCAqLworc3RhdGljIGxvbmcKK2dldF9zeW1ib2xfdmFsdWUgKHN5bWJvbCkgICAgICAgCisgICAgIGFzeW1ib2wgKnN5bWJvbDsKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbG9uZyByZWxvY2F0aW9uID0gMDsKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICB7CisgICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKyAgZWxzZSAKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWUgKworICAgICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKworICAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHJldHVybihyZWxvY2F0aW9uKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBpbiBjaGFyZ2Ugb2YgcGVyZm9ybWluZyBhbGwgdGhlIDI5ayByZWxvY2F0aW9ucyAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCithMjlrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAorCSAgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2xfaW47CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgLyogdGhlIGNvbnN0aCByZWxvY2F0aW9uIGNvbWVzIGluIHR3byBwYXJ0cywgd2UgaGF2ZSB0byByZW1lbWJlcgorICAgICB0aGUgc3RhdGUgYmV0d2VlbiBjYWxscywgaW4gdGhlc2UgdmFyaWFibGVzICovCisgIHN0YXRpYyBib29sZWFuIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydDFfY29uc3RoX3ZhbHVlOworCisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7CisgIHVuc2lnbmVkIGxvbmcgdW5zaWduZWRfdmFsdWU7CisgIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKKyAgbG9uZyBzaWduZWRfdmFsdWU7CisKKyAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KKyAgYmZkX2J5dGUgICpoaXRfZGF0YSA9YWRkciArIChiZmRfYnl0ZSAqKShkYXRhKTsKKwkKKyAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOworCisgIGlmIChvdXRwdXRfYmZkKSB7CisgICAgLyogUGFydGlhbCBsaW5raW5nIC0gZG8gbm90aGluZyAqLworICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICB9CisKKyAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCisgICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCisgIHsKKyAgICAvKiBLZWVwIHRoZSBzdGF0ZSBtYWNoaW5lIGhhcHB5IGluIGNhc2Ugd2UncmUgY2FsbGVkIGFnYWluICovCisgICAgaWYgKHJfdHlwZSA9PSBSX0lISUhBTEYpIAorICAgIHsKKyAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOworICAgICAgcGFydDFfY29uc3RoX3ZhbHVlICA9IDA7CisgICAgfQorICAgIHJldHVybihiZmRfcmVsb2NfdW5kZWZpbmVkKTsKKyAgfQorCisgIGlmICgocGFydDFfY29uc3RoX2FjdGl2ZSkgJiYgKHJfdHlwZSAhPSBSX0lIQ09OU1QpKSAKKyAgeworICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKKyAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhDT05TVCIpOworICAgIHJldHVybihiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKKyAgfQorCisKKyAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOworCisgIHN3aXRjaCAocl90eXBlKSAKKyAgeworICAgY2FzZSBSX0lSRUw6IAkKKyAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAorICAgIC8qIFRha2UgdGhlIHZhbHVlIGluIHRoZSBmaWVsZCBhbmQgc2lnbiBleHRlbmQgaXQgKi8KKyAgICBzaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEKGluc24pOworICAgIHNpZ25lZF92YWx1ZSA9IFNJR05fRVhURU5EX0hXT1JEKHNpZ25lZF92YWx1ZSk7CisgICAgc2lnbmVkX3ZhbHVlIDw8PSAyOworCisgICAgLyogU2VlIHRoZSBub3RlIG9uIHRoZSBSX0lSRUwgcmVsb2MgaW4gY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24uICAqLworICAgIGlmIChzaWduZWRfdmFsdWUgPT0gLSAobG9uZykgcmVsb2NfZW50cnktPmFkZHJlc3MpCisgICAgICBzaWduZWRfdmFsdWUgPSAwOworCisgICAgc2lnbmVkX3ZhbHVlICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisgICAgaWYgKChzaWduZWRfdmFsdWUgJiB+MHgzZmZmZikgPT0gMCkKKyAgICB7CQkJCS8qIEFic29sdXRlIGptcC9jYWxsICovCisgICAgICBpbnNuIHw9ICgxPDwyNCk7CQkvKiBNYWtlIGl0IGFic29sdXRlICovCisgICAgICAvKiBGSVhNRTogU2hvdWxkIHdlIGNoYW5nZSByX3R5cGUgdG8gUl9JQUJTICovCisgICAgfSAKKyAgICBlbHNlIAorICAgIHsKKyAgICAgIC8qIFJlbGF0aXZlIGptcC9jYWxsLCBzbyBzdWJ0cmFjdCBmcm9tIHRoZSB2YWx1ZSB0aGUKKwkgYWRkcmVzcyBvZiB0aGUgcGxhY2Ugd2UncmUgY29taW5nIGZyb20gKi8KKyAgICAgIHNpZ25lZF92YWx1ZSAtPSAocmVsb2NfZW50cnktPmFkZHJlc3MKKwkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIGlmIChzaWduZWRfdmFsdWU+MHgxZmZmZiB8fCBzaWduZWRfdmFsdWU8LTB4MjAwMDApIAorICAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOworICAgIH0KKyAgICBzaWduZWRfdmFsdWUgPj49IDI7CisgICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCBzaWduZWRfdmFsdWUpOworICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiAsaGl0X2RhdGEpOyAKKyAgICBicmVhazsKKyAgIGNhc2UgUl9JTE9IQUxGOiAKKyAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAorICAgIHVuc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKKyAgICB1bnNpZ25lZF92YWx1ZSArPSAgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgICBpbnNuID0gSU5TRVJUX0hXT1JEKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKKyAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCisgICAgYnJlYWs7CisgICBjYXNlIFJfSUhJSEFMRjoKKyAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAorICAgIC8qIGNvbnN0aCwgcGFydCAxIAorICAgICAgIEp1c3QgZ2V0IHRoZSBzeW1ib2wgdmFsdWUgdGhhdCBpcyByZWZlcmVuY2VkICovCisgICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7CisgICAgcGFydDFfY29uc3RoX3ZhbHVlID0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgICAvKiBEb24ndCBtb2RpZnkgaW5zbiB1bnRpbCBSX0lIQ09OU1QgKi8KKyAgICBicmVhazsKKyAgIGNhc2UgUl9JSENPTlNUOgkKKyAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAorICAgIC8qIGNvbnN0aCwgcGFydCAyIAorICAgICAgIE5vdyByZWxvY2F0ZSB0aGUgcmVmZXJlbmNlICovCisgICAgaWYgKHBhcnQxX2NvbnN0aF9hY3RpdmUgPT0gZmFsc2UpIHsKKyAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBJSElIQUxGIik7CisgICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7CisgICAgfQorICAgIC8qIHN5bV9wdHJfcHRyID0gcl9zeW1uZHgsIGluIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUoKSAqLworICAgIHVuc2lnbmVkX3ZhbHVlID0gMDsJCS8qRVhUUkFDVF9IV09SRChpbnNuKSA8PCAxNjsqLworICAgIHVuc2lnbmVkX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7IC8qIHJfc3ltbmR4ICovCisgICAgdW5zaWduZWRfdmFsdWUgKz0gcGFydDFfY29uc3RoX3ZhbHVlOworICAgIHVuc2lnbmVkX3ZhbHVlID0gdW5zaWduZWRfdmFsdWUgPj4gMTY7CisgICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7CisgICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOworICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKKyAgICBicmVhazsKKyAgIGNhc2UgUl9CWVRFOgorICAgIGluc24gPSBiZmRfZ2V0XzgoYWJmZCwgaGl0X2RhdGEpOyAKKyAgICB1bnNpZ25lZF92YWx1ZSA9IGluc24gKyBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwkKKyAgICBpZiAodW5zaWduZWRfdmFsdWUgJiAweGZmZmZmZjAwKQorICAgICAgcmV0dXJuKGJmZF9yZWxvY19vdmVyZmxvdyk7CisgICAgYmZkX3B1dF84KGFiZmQsIHVuc2lnbmVkX3ZhbHVlLCBoaXRfZGF0YSk7IAorICAgIGJyZWFrOworICAgY2FzZSBSX0hXT1JEOgorICAgIGluc24gPSBiZmRfZ2V0XzE2KGFiZmQsIGhpdF9kYXRhKTsgCisgICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCisgICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmMDAwMCkKKyAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOworICAgIGJmZF9wdXRfMTYoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOyAKKyAgICBicmVhazsKKyAgIGNhc2UgUl9XT1JEOgorICAgIGluc24gPSBiZmRfZ2V0XzMyKGFiZmQsIGhpdF9kYXRhKTsgCisgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOyAgCisgICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7CisgICAgYnJlYWs7CisgICBkZWZhdWx0OgorICAgICplcnJvcl9tZXNzYWdlID0gXygiVW5yZWNvZ25pemVkIHJlbG9jIik7CisgICAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKKyAgfQorCisKKyAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQorfQorCisvKiAgICAgIHR5cGUJICAgcmlnaHRzaGlmdAorCQkgICAgICAgc2l6ZQorCQkJICBiaXRzaXplCisJCQkgICAgICAgcGMtcmVsYXRpdmUKKwkJCQkgICAgIGJpdHBvcworCQkJCQkgYWJzb2x1dGUKKwkJCQkJICAgICBjb21wbGFpbl9vbl9vdmVyZmxvdworCQkJCQkJICBzcGVjaWFsX2Z1bmN0aW9uCisJCQkJCQkgICAgcmVsb2NhdGlvbiBuYW1lCisJCQkJCQkJICAgICAgIHBhcnRpYWxfaW5wbGFjZSAKKwkJCQkJCQkJICAgICAgc3JjX21hc2sKKyovCisKKy8qRklYTUU6IEknbSBub3QgcmVhbCBzdXJlIGFib3V0IHRoaXMgdGFibGUgKi8KK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKK3sKKyAge1JfQUJTLCAgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxhMjlrX3JlbG9jLCJBQlMiLCAgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCisgIHsxfSwgIHsyfSwgIHszfSwgICB7NH0sICB7NX0sICB7Nn0sICB7N30sICB7OH0sICB7OX0sIHsxMH0sCisgIHsxMX0sIHsxMn0sIHsxM30sIHsxNH0sIHsxNX0sIHsxNn0sIHsxN30sIHsxOH0sIHsxOX0sIHsyMH0sCisgIHsyMX0sIHsyMn0sIHsyM30sCisgIHtSX0lSRUwsICAgIDAsIDMsIDMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLGEyOWtfcmVsb2MsIklSRUwiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKKyAge1JfSUFCUywgICAgMCwgMywgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiSUFCUyIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAorICB7Ul9JTE9IQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgYTI5a19yZWxvYywiSUxPSEFMRiIsIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2V9LAorICB7Ul9JSElIQUxGLCAwLCAzLCAxNiwgdHJ1ZSwgIDE2LCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklISUhBTEYiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKKyAge1JfSUhDT05TVCwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklIQ09OU1QiLCB0cnVlLCAweGZmZmYwMDAwLDB4ZmZmZjAwMDAsIGZhbHNlfSwKKyAge1JfQllURSwgICAgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJCWVRFIiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZX0sCisgIHtSX0hXT1JELCAgIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIkhXT1JEIiwgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKKyAge1JfV09SRCwgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiV09SRCIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAorfTsKKworI2RlZmluZSBCQURNQUcoeCkgQTI5S0JBRE1BRyh4KQorCisjZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikgXAorIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKworc3RhdGljIHZvaWQKK3JlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCxyZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKyAgICAgYXJlbGVudCAqcmVsZW50OworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgICBzdGF0aWMgYmZkX3ZtYSBpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOworCisgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7CQkKKyAgICByZWxlbnQtPmhvd3RvID0gaG93dG9fdGFibGUgKyByZWxvYy0+cl90eXBlOworICAgIGlmIChyZWxvYy0+cl90eXBlID09IFJfSUhDT05TVCkgCisgICAgewkJCisgICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBSX0lIQ09OU1Qgc2hvdWxkIGFsd2F5cyBiZSB0aGUgYWRkcmVzcyBvZgorCSB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIFJfSUhJSEFMRi4gIHJlbG9jcyBnZW5lcmF0ZWQgYnkgZ2FzCisJIGFyZSBjb3JyZWN0LCBidXQgcmVsb2NzIGdlbmVyYXRlZCBieSBIaWdoIEMgYXJlIGRpZmZlcmVudCAoSQorCSBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgdGhlIGFkZHJlc3MgbWVhbnMgZm9yIEhpZ2ggQykuICBXZSBjYW4KKwkgaGFuZGxlIGJvdGggZ2FzIGFuZCBIaWdoIEMgYnkgaWdub3JpbmcgdGhlIGFkZHJlc3MgaGVyZSwgYW5kCisJIHNpbXBseSByZXVzaW5nIHRoZSBhZGRyZXNzIHNhdmVkIGZvciBSX0lISUhBTEYuICAqLworICAgICAgICBpZiAoaWhpaGFsZl92YWRkciA9PSAoYmZkX3ZtYSkgLTEpCisJICBhYm9ydCAoKTsKKwlyZWxlbnQtPmFkZHJlc3MgPSBpaGloYWxmX3ZhZGRyOworCWloaWhhbGZfdmFkZHIgPSAoYmZkX3ZtYSkgLTE7CisJcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9zeW1uZHg7CQkKKwlyZWxlbnQtPnN5bV9wdHJfcHRyPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICBhc3ltYm9sICpwdHI7CisgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0KGFiZmQpW3JlbG9jLT5yX3N5bW5keF07CisKKyAgICAgIHB0ciA9ICoocmVsZW50LT5zeW1fcHRyX3B0cik7CisKKyAgICAgIGlmIChwdHIgCisJICAmJiBiZmRfYXN5bWJvbF9iZmQocHRyKSA9PSBhYmZkCQkKKworCSAgJiYgKChwdHItPmZsYWdzICYgQlNGX09MRF9DT01NT04pPT0gMCkpCQorICAgICAgewkJCQkJCQorCSAgcmVsZW50LT5hZGRlbmQgPSAwOworICAgICAgfQkJCQkJCQorICAgICAgZWxzZQorICAgICAgewkJCQkJCisJICByZWxlbnQtPmFkZGVuZCA9IDA7CQkJCisgICAgICB9CQkJCisgICAgICByZWxlbnQtPmFkZHJlc3MtPSBzZWN0aW9uLT52bWE7CisgICAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lISUhBTEYpCisJaWhpaGFsZl92YWRkciA9IHJlbGVudC0+YWRkcmVzczsKKyAgICAgIGVsc2UgaWYgKGloaWhhbGZfdmFkZHIgIT0gKGJmZF92bWEpIC0xKQorCWFib3J0ICgpOworICB9Cit9CisKKy8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOworICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOworeworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7CisgIGJvb2xlYW4gaGloYWxmOworICBiZmRfdm1hIGhpaGFsZl92YWw7CisKKyAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhCisgICAgIHRoaW5nLiAgVGhlIGNhbGxlciB3aWxsIHRha2UgY2FyZSBvZiBhZGp1c3RpbmcgdGhlIHJlbG9jCisgICAgIGFkZHJlc3NlcyBhbmQgc3ltYm9sIGluZGljZXMuICAqLworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworCisgIGhpaGFsZiA9IGZhbHNlOworICBoaWhhbGZfdmFsID0gMDsKKworICByZWwgPSByZWxvY3M7CisgIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICB7CisgICAgICBsb25nIHN5bW5keDsKKyAgICAgIGJmZF9ieXRlICpsb2M7CisgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgICAgYmZkX3ZtYSB2YWw7CisgICAgICBib29sZWFuIG92ZXJmbG93OworICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICAgbG9uZyBzaWduZWRfdmFsdWU7CisgICAgICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OworCisgICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OworICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7CisKKyAgICAgIGlmIChzeW1uZHggPT0gLTEgfHwgcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCWggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07CisKKyAgICAgIHN5bSA9IE5VTEw7CisgICAgICBzZWMgPSBOVUxMOworICAgICAgdmFsID0gMDsKKworICAgICAgLyogQW4gUl9JSENPTlNUIHJlbG9jIGRvZXMgbm90IGhhdmUgYSBzeW1ib2wuICBJbnN0ZWFkLCB0aGUKKyAgICAgICAgIHN5bWJvbCBpbmRleCBpcyBhbiBhZGRlbmQuICBSX0lIQ09OU1QgaXMgYWx3YXlzIHVzZWQgaW4KKyAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggUl9JSEhBTEYuICAqLworICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfSUhDT05TVCkKKwl7CisJICBpZiAoaCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKHN5bW5keCA9PSAtMSkKKwkJc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgICAgICBlbHNlCisJCXsKKwkJICBzeW0gPSBzeW1zICsgc3ltbmR4OworCQkgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07CisJCSAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkgKyBzeW0tPm5fdmFsdWUKKwkJCSAtIHNlYy0+dm1hKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJCXsKKwkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJCSAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCSArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisKKwkgIGlmIChoaWhhbGYpCisJICAgIHsKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKKwkJICAgICAoaW5mbywgXygibWlzc2luZyBJSENPTlNUIHJlbG9jIiksIGlucHV0X2JmZCwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBoaWhhbGYgPSBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKKworICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKKwl7CisJZGVmYXVsdDoKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCisJY2FzZSBSX0lSRUw6CisJICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOworCisJICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQuICAqLworCSAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7CisJICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRCAoc2lnbmVkX3ZhbHVlKTsKKwkgIHNpZ25lZF92YWx1ZSA8PD0gMjsKKworCSAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ09GRgorCSAgICAgYTI5ay4gIEluIHRoZSBvcmlnaW5hbCBBTUQgdmVyc2lvbiwgdGhlIHZhbHVlIHN0b3JlZCBpbgorCSAgICAgdGhlIGZpZWxkIGZvciB0aGUgUl9JUkVMIHJlbG9jIGlzIGEgc2ltcGxlIGFkZGVuZC4gIEluCisJICAgICB0aGUgR05VIHZlcnNpb24sIHRoZSB2YWx1ZSBpcyB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3MKKwkgICAgIG9mIHRoZSByZWxvYyB3aXRoaW4gc2VjdGlvbi4gIFdlIHRyeSB0byBjb3BlIGhlcmUgYnkKKwkgICAgIGFzc3VtaW5nIHRoZSBBTUQgdmVyc2lvbiwgdW5sZXNzIHRoZSBhZGRlbmQgaXMgZXhhY3RseQorCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzOyBpbiB0aGUgbGF0dGVyIGNhc2Ugd2UgYXNzdW1lCisJICAgICB0aGUgR05VIHZlcnNpb24uICBUaGlzIG1lYW5zIHRoYXQgc29tZXRoaW5nIGxpa2UKKwkgICAgICAgICAudGV4dAorCQkgbm9wCisJCSBqbXAgaS00CisJICAgICB3aWxsIGZhaWwsIGJlY2F1c2UgdGhlIGFkZGVuZCBvZiAtNCB3aWxsIGhhcHBlbiB0byBlcXVhbAorCSAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZQorCSAgICAgY29tcGlsZXIgd2lsbCBuZXZlciBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpcy4KKworCSAgICAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIHRha2Ugb3V0IHRoaXMKKwkgICAgIGNoZWNrLiAgKi8KKworCSAgaWYgKHNpZ25lZF92YWx1ZSA9PSAtIChsb25nKSAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkKKwkgICAgc2lnbmVkX3ZhbHVlID0gMDsKKworCSAgLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUganVtcC4gICovCisJICBzaWduZWRfdmFsdWUgKz0gdmFsOworCisJICBpZiAoKHNpZ25lZF92YWx1ZSAmIH4weDNmZmZmKSA9PSAwKQorCSAgICB7CisJICAgICAgLyogV2UgY2FuIHVzZSBhbiBhYnNvbHV0ZSBqdW1wLiAgKi8KKwkgICAgICBpbnNuIHw9ICgxIDw8IDI0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTWFrZSB0aGUgZGVzdGluYXRpb24gUEMgcmVsYXRpdmUuICAqLworCSAgICAgIHNpZ25lZF92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCQkJICAgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOworCSAgICAgIGlmIChzaWduZWRfdmFsdWUgPiAweDFmZmZmIHx8IHNpZ25lZF92YWx1ZSA8IC0gMHgyMDAwMCkKKwkJeworCQkgIG92ZXJmbG93ID0gdHJ1ZTsKKwkJICBzaWduZWRfdmFsdWUgPSAwOworCQl9CisJICAgIH0KKworCSAgLyogUHV0IHRoZSBhZGp1c3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KKwkgIHNpZ25lZF92YWx1ZSA+Pj0gMjsKKwkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHNpZ25lZF92YWx1ZSk7CisKKwkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7CisKKwkgIGJyZWFrOworCisJY2FzZSBSX0lMT0hBTEY6CisJICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOworCSAgdW5zaWduZWRfdmFsdWUgPSBFWFRSQUNUX0hXT1JEIChpbnNuKTsKKwkgIHVuc2lnbmVkX3ZhbHVlICs9IHZhbDsKKwkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKKwkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgbG9jKTsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lISUhBTEY6CisJICAvKiBTYXZlIHRoZSB2YWx1ZSBmb3IgdGhlIFJfSUhDT05TVCByZWxvYy4gICovCisJICBoaWhhbGYgPSB0cnVlOworCSAgaGloYWxmX3ZhbCA9IHZhbDsKKwkgIGJyZWFrOworCisJY2FzZSBSX0lIQ09OU1Q6CisJICBpZiAoISBoaWhhbGYpCisJICAgIHsKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKKwkJICAgICAoaW5mbywgXygibWlzc2luZyBJSElIQUxGIHJlbG9jIiksIGlucHV0X2JmZCwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBoaWhhbGZfdmFsID0gMDsKKwkgICAgfQorCisJICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2MpOworCSAgdW5zaWduZWRfdmFsdWUgPSByZWwtPnJfc3ltbmR4ICsgaGloYWxmX3ZhbDsKKwkgIHVuc2lnbmVkX3ZhbHVlID4+PSAxNjsKKwkgIGluc24gPSBJTlNFUlRfSFdPUkQgKGluc24sIHVuc2lnbmVkX3ZhbHVlKTsKKwkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24sIGxvYyk7CisKKwkgIGhpaGFsZiA9IGZhbHNlOworCisJICBicmVhazsKKworCWNhc2UgUl9CWVRFOgorCWNhc2UgUl9IV09SRDoKKwljYXNlIFJfV09SRDoKKwkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZSwKKwkJCQkJICBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKKwkgIGlmIChyc3RhdCA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpCisJICAgIG92ZXJmbG93ID0gdHJ1ZTsKKwkgIGVsc2UgaWYgKHJzdGF0ICE9IGJmZF9yZWxvY19vaykKKwkgICAgYWJvcnQgKCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChvdmVyZmxvdykKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKKworCSAgaWYgKHN5bW5keCA9PSAtMSkKKwkgICAgbmFtZSA9ICIqQUJTKiI7CisJICBlbHNlIGlmIChoICE9IE5VTEwpCisJICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCSAgZWxzZSBpZiAoc3ltID09IE5VTEwpCisJICAgIG5hbWUgPSAiKnVua25vd24qIjsKKwkgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAorCQkgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCisJICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7CisJICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7CisJICAgICAgbmFtZSA9IGJ1ZjsKKwkgICAgfQorCisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgKGluZm8sIG5hbWUsIGhvd3RvX3RhYmxlW3JlbC0+cl90eXBlXS5uYW1lLCAoYmZkX3ZtYSkgMCwKKwkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfSAgICAgCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uCisKKy8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzeW1uZHggb2YgYSBSX0lIQ09OU1QgcmVsb2MsIHNpbmNlIGl0CisgICBpcyBhY3R1YWxseSBhbiBhZGRlbmQsIG5vdCBhIHN5bWJvbCBpbmRleCBhdCBhbGwuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCisgICAgIGJmZCAqb2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOworICAgICBib29sZWFuICphZGp1c3RlZHA7Cit7CisgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9JSENPTlNUKQorICAgICphZGp1c3RlZHAgPSB0cnVlOworICBlbHNlCisgICAgKmFkanVzdGVkcCA9IGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggY29mZl9hMjlrX2FkanVzdF9zeW1uZHgKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKK2NvbnN0IGJmZF90YXJnZXQgYTI5a2NvZmZfYmlnX3ZlYyA9Cit7CisgICJjb2ZmLWEyOWstYmlnIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgIAorICAgfCBTRUNfUkVBRE9OTFkgKSwKKyAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgLyogZGF0YSAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgICBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCisgIC8qIGhkcnMgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsICAgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAorCisgeworCSAgICAKKyAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgY29mZl9vYmplY3RfcCwKKyAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKKyAgIF9iZmRfZHVtbXlfdGFyZ2V0CisgIH0sCisgeworICAgYmZkX2ZhbHNlLAorICAgY29mZl9ta29iamVjdCwKKyAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCisgICBiZmRfZmFsc2UKKyAgfSwKKyB7CisgICBiZmRfZmFsc2UsCisgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywKKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKKyAgIGJmZF9mYWxzZQorICB9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFCisgfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFscGhhLmMgYi9iZmQvY29mZi1hbHBoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDE2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi1hbHBoYS5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyogQkZEIGJhY2stZW5kIGZvciBBTFBIQSBFeHRlbmRlZC1Db2ZmIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBNb2RpZmllZCBmcm9tIGNvZmYtbWlwcy5jIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4gYW5kCisgICBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9zeW0uaCIKKyNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCisjaW5jbHVkZSAiY29mZi9lY29mZi5oIgorI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorI2luY2x1ZGUgImxpYmVjb2ZmLmgiCisMCisvKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmFscGhhX2Vjb2ZmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBhbHBoYV9lY29mZl9iYWRfZm9ybWF0X2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOworc3RhdGljIFBUUiBhbHBoYV9lY29mZl9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZWhkciwgUFRSIGFvdXRoZHIpKTsKK3N0YXRpYyB2b2lkIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKKwkJCQkJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKK3N0YXRpYyB2b2lkIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCisJCQkJCSAgICAgICBQVFIpKTsKK3N0YXRpYyB2b2lkIGFscGhhX2FkanVzdF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwKKwkJCQkJICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICosCisJCQkJCSAgIGFyZWxlbnQgKikpOworc3RhdGljIHZvaWQgYWxwaGFfYWRqdXN0X3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgYXJlbGVudCAqLAorCQkJCQkgICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICphbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CitzdGF0aWMgYmZkX2J5dGUgKmFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAorCSAgIGJmZF9ieXRlICpkYXRhLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKK3N0YXRpYyBiZmRfdm1hIGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKiwKKwkgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKK3N0YXRpYyBib29sZWFuIGFscGhhX3JlbG9jYXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwKKwkJCQkJICAgICAgIGJmZF9ieXRlICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gYWxwaGFfYWRqdXN0X2hlYWRlcnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICosIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopKTsKK3N0YXRpYyBQVFIgYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBiZmQgKmFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIpKTsKK3N0YXRpYyBiZmQgKmFscGhhX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBiZmQgKmFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7CisMCisvKiBFQ09GRiBoYXMgQ09GRiBzZWN0aW9ucywgYnV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluCisgICBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvcm1hdC4gIEVDT0ZGIHRhcmdldHMgdXNlIHNvbWUgb2YgdGhlCisgICBzd2FwcGluZyByb3V0aW5lcyBmcm9tIGNvZmZzd2FwLmgsIGFuZCBzb21lIG9mIHRoZSBnZW5lcmljIENPRkYKKyAgIHJvdXRpbmVzIGluIGNvZmZnZW4uYywgYnV0LCB1bmxpa2UgdGhlIHJlYWwgQ09GRiB0YXJnZXRzLCBkbyBub3QKKyAgIHVzZSBjb2ZmY29kZS5oIGl0c2VsZi4KKworICAgR2V0IHRoZSBnZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGV4Y2VwdCBmb3IgdGhlIHJlbG9jLAorICAgc3ltYm9sLCBhbmQgbGluZW5vIG9uZXMuICBHaXZlIHRoZW0gZWNvZmYgbmFtZXMuICBEZWZpbmUgc29tZQorICAgYWNjZXNzb3IgbWFjcm9zIGZvciB0aGUgbGFyZ2Ugc2l6ZXMgdXNlZCBmb3IgQWxwaGEgRUNPRkYuICAqLworCisjZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfNjQKKyNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF82NAorI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfNjQKKyNkZWZpbmUgUFVUX0FPVVRIRFJfVFNJWkUgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF82NAorI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfNjQKKyNkZWZpbmUgR0VUX0FPVVRIRFJfQlNJWkUgYmZkX2hfZ2V0XzY0CisjZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF82NAorI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfNjQKKyNkZWZpbmUgUFVUX0FPVVRIRFJfRU5UUlkgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzY0CisjZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfZ2V0XzY0CisjZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzY0CisjZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9TQ05IRFJfVkFERFIgYmZkX2hfZ2V0XzY0CisjZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfNjQKKyNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF82NAorI2RlZmluZSBHRVRfU0NOSERSX1NDTlBUUiBiZmRfaF9nZXRfNjQKKyNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzY0CisjZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF82NAorI2RlZmluZSBQVVRfU0NOSERSX1JFTFBUUiBiZmRfaF9wdXRfNjQKKyNkZWZpbmUgR0VUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX2dldF82NAorI2RlZmluZSBQVVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfcHV0XzY0CisKKyNkZWZpbmUgQUxQSEFFQ09GRgorCisjZGVmaW5lIE5PX0NPRkZfUkVMT0NTCisjZGVmaW5lIE5PX0NPRkZfU1lNQk9MUworI2RlZmluZSBOT19DT0ZGX0xJTkVOT1MKKyNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfaW4gYWxwaGFfZWNvZmZfc3dhcF9maWxlaGRyX2luCisjZGVmaW5lIGNvZmZfc3dhcF9maWxlaGRyX291dCBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfb3V0CisjZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbgorI2RlZmluZSBjb2ZmX3N3YXBfYW91dGhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX291dAorI2RlZmluZSBjb2ZmX3N3YXBfc2NuaGRyX2luIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX2luCisjZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX291dAorI2luY2x1ZGUgImNvZmZzd2FwLmgiCisKKy8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLworI2RlZmluZSBFQ09GRl82NAorI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgorDAorLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCityZWxvY19uaWwgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCisJCSAgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3JlbG9jX25pbCAoYWJmZCwgcmVsb2MsIHN5bSwgZGF0YSwgc2VjLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jOworICAgICBhc3ltYm9sICpzeW07CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCisgICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCisjZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Cit7CisgIC8qIFJlbG9jIHR5cGUgMCBpcyBpZ25vcmVkIGJ5IGl0c2VsZi4gIEhvd2V2ZXIsIGl0IGFwcGVhcnMgYWZ0ZXIgYQorICAgICBHUERJU1AgcmVsb2MgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBsb3cgb3JkZXIgMTYgYml0cworICAgICBvZiB0aGUgZ3AgcmVnaXN0ZXIgYXJlIGxvYWRlZC4gICovCisgIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCisgIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfUkVGUVVBRCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAzMiBiaXQgR1AgcmVsYXRpdmUgb2Zmc2V0LiAgVGhpcyBpcyBqdXN0IGxpa2UgUkVGTE9ORyBleGNlcHQKKyAgICAgdGhhdCB3aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIHRoZSB2YWx1ZSBvZiB0aGUgZ3AgcmVnaXN0ZXIgd2lsbCBiZQorICAgICBhZGRlZCBpbi4gICovCisgIEhPV1RPIChBTFBIQV9SX0dQUkVMMzIsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiR1BSRUwzMiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVXNlZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcnMgdG8gbWVtb3J5IG9mZiB0aGUgR1AKKyAgICAgcmVnaXN0ZXIuICBUaGUgb2Zmc2V0IGlzIDE2IGJpdHMgb2YgdGhlIDMyIGJpdCBpbnN0cnVjdGlvbi4gIFRoaXMKKyAgICAgcmVsb2MgYWx3YXlzIHNlZW1zIHRvIGJlIGFnYWluc3QgdGhlIC5saXRhIHNlY3Rpb24uICAqLworICBIT1dUTyAoQUxQSEFfUl9MSVRFUkFMLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJMSVRFUkFMIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhpcyByZWxvYyBvbmx5IGFwcGVhcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgTElURVJBTCByZWxvYy4KKyAgICAgSXQgaWRlbnRpZmllcyBhIHVzZSBvZiB0aGUgbGl0ZXJhbC4gIEl0IHNlZW1zIHRoYXQgdGhlIGxpbmtlciBjYW4KKyAgICAgdXNlIHRoaXMgdG8gZWxpbWluYXRlIGEgcG9ydGlvbiBvZiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoZSBzeW1ib2wKKyAgICAgaW5kZXggaXMgc3BlY2lhbDogMSBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSBiYXNlCisgICAgIHJlZ2lzdGVyIG9mIGEgbWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbjsgMiBtZWFucyB0aGUgbGl0ZXJhbAorICAgICBhZGRyZXNzIGlzIGluIHRoZSBieXRlIG9mZnNldCByZWdpc3RlciBvZiBhIGJ5dGUtbWFuaXB1bGF0aW9uCisgICAgIGluc3RydWN0aW9uOyAzIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIHRhcmdldAorICAgICByZWdpc3RlciBvZiBhIGpzciBpbnN0cnVjdGlvbi4gIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55CisgICAgIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoQUxQSEFfUl9MSVRVU0UsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgorICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgbmV4dCByZWxvYworICAgICB3aWxsIGJlIGFuIElHTk9SRSByZWxvYyB3aGljaCBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGRhCisgICAgIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHN5bWJvbCBpbmRleCBvZgorICAgICB0aGUgR1BESVNQIGluc3RydWN0aW9uIGFwcGVhcnMgdG8gYWN0dWFsbHkgYmUgdGhlIG51bWJlciBvZiBieXRlcworICAgICBiZXR3ZWVuIHRoZSBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBnaXZlcyB0d28gZGlmZmVyZW50CisgICAgIHdheXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaXM7IEkgZG9uJ3Qga25vdyB3aHkKKyAgICAgYm90aCBhcmUgdXNlZC4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uIGlzIHRoZQorICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUgY3VycmVudCBsb2NhdGlvbjsgdGhlCisgICAgIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIgaG9sZGluZyB0aGUgY3VycmVudAorICAgICBhZGRyZXNzLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfR1BESVNQLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkdQRElTUCIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMjEgYml0IGJyYW5jaC4gIFRoZSBuYXRpdmUgYXNzZW1ibGVyIGdlbmVyYXRlcyB0aGVzZSBmb3IKKyAgICAgYnJhbmNoZXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFuZCBhbHNvIGZpbGxzIGluIHRoZSBQQworICAgICByZWxhdGl2ZSBvZmZzZXQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfQlJBRERSLAkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyMSwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkJSQUREUiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MWZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfSElOVCwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkhJTlQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlNSRUwxNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLworICBIT1dUTyAoQUxQSEFfUl9TUkVMMzIsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLworICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDY0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KKyAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLworICBIT1dUTyAoQUxQSEFfUl9PUF9TVE9SRSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKKyAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCisgIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQorICAgICBnaXZlbiB2YWx1ZS4gICovCisgIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEFkanVzdCB0aGUgR1AgdmFsdWUgZm9yIGEgbmV3IHJhbmdlIGluIHRoZSBvYmplY3QgZmlsZS4gICovCisgIEhPV1RPIChBTFBIQV9SX0dQVkFMVUUsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLworfTsKKwwKKy8qIFJlY29nbml6ZSBhbiBBbHBoYSBFQ09GRiBmaWxlLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorYWxwaGFfZWNvZmZfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnJldDsKKworICByZXQgPSBjb2ZmX29iamVjdF9wIChhYmZkKTsKKworICBpZiAocmV0ICE9IE5VTEwpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNlYzsKKworICAgICAgLyogQWxwaGEgRUNPRkYgaGFzIGEgLnBkYXRhIHNlY3Rpb24uICBUaGUgbG5ub3B0ciBmaWVsZCBvZiB0aGUKKwkgLnBkYXRhIHNlY3Rpb24gaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGl0IGNvbnRhaW5zLiAgRWFjaAorCSBlbnRyeSB0YWtlcyB1cCA4IGJ5dGVzLiAgVGhlIG51bWJlciBvZiBlbnRyaWVzIGlzIHJlcXVpcmVkCisJIHNpbmNlIHRoZSBzZWN0aW9uIGlzIGFsaWduZWQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LiAgV2hlbiB3ZQorCSBsaW5rIC5wZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUKKwkgYWxpZ25tZW50IGJ5dGVzLiAgV2UgaGFuZGxlIHRoaXMgb24gaW5wdXQgYnkgZmFraW5nIHRoZSBzaXplCisJIG9mIHRoZSAucGRhdGEgc2VjdGlvbiB0byByZW1vdmUgdGhlIHVud2FudGVkIGFsaWdubWVudCBieXRlcy4KKwkgT24gb3V0cHV0IHdlIHdpbGwgc2V0IHRoZSBsbm5vcHRyIGZpZWxkIGFuZCBmb3JjZSB0aGUKKwkgYWxpZ25tZW50LiAgKi8KKyAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBfUERBVEEpOworICAgICAgaWYgKHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKwl7CisJICBiZmRfc2l6ZV90eXBlIHNpemU7CisKKwkgIHNpemUgPSBzZWMtPmxpbmVfZmlsZXBvcyAqIDg7CisJICBCRkRfQVNTRVJUIChzaXplID09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykKKwkJICAgICAgfHwgc2l6ZSArIDggPT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSk7CisJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBzaXplKSkKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBTZWUgd2hldGhlciB0aGUgbWFnaWMgbnVtYmVyIG1hdGNoZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorYWxwaGFfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBmaWxlaGRyOworeworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOworCisgIGlmIChBTFBIQV9FQ09GRl9CQURNQUcgKCppbnRlcm5hbF9mKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgYSBob29rIGNhbGxlZCBieSBjb2ZmX3JlYWxfb2JqZWN0X3AgdG8gY3JlYXRlIGFueSBiYWNrZW5kCisgICBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyBQVFIKK2FscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGZpbGVoZHI7CisgICAgIFBUUiBhb3V0aGRyOworeworICBQVFIgZWNvZmY7CisKKyAgZWNvZmYgPSBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpOworCisgIGlmIChlY29mZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7CisKKyAgICAgIC8qIFNldCBhZGRpdGlvbmFsIEJGRCBmbGFncyBhY2NvcmRpbmcgdG8gdGhlIG9iamVjdCB0eXBlIGZyb20gdGhlCisJIG1hY2hpbmUgc3BlY2lmaWMgZmlsZSBoZWFkZXIgZmxhZ3MuICAqLworICAgICAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9BTFBIQV9PQkpFQ1RfVFlQRV9NQVNLKQorCXsKKwljYXNlIEZfQUxQSEFfU0hBUkFCTEU6CisJICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOworCSAgYnJlYWs7CisJY2FzZSBGX0FMUEhBX0NBTExfU0hBUkVEOgorCSAgLyogQWx3YXlzIGV4ZWN1dGFibGUgaWYgdXNpbmcgc2hhcmVkIGxpYnJhcmllcyBhcyB0aGUgcnVuIHRpbWUKKwkgICAgIGxvYWRlciBtaWdodCByZXNvbHZlIHVuZGVmaW5lZCByZWZlcmVuY2VzLiAgKi8KKwkgIGFiZmQtPmZsYWdzIHw9IChEWU5BTUlDIHwgRVhFQ19QKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiBlY29mZjsKK30KKwwKKy8qIFJlbG9jIGhhbmRsaW5nLiAgKi8KKworLyogU3dhcCBhIHJlbG9jIGluLiAgKi8KKworc3RhdGljIHZvaWQKK2FscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZXh0X3B0cjsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Cit7CisgIGNvbnN0IFJFTE9DICpleHQgPSAoUkVMT0MgKikgZXh0X3B0cjsKKworICBpbnRlcm4tPnJfdmFkZHIgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOworICBpbnRlcm4tPnJfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5yX3N5bW5keCk7CisKKyAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7CisKKyAgaW50ZXJuLT5yX3R5cGUgPSAoKGV4dC0+cl9iaXRzWzBdICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpCisJCSAgICA+PiBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSk7CisgIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFKSAhPSAwOworICBpbnRlcm4tPnJfb2Zmc2V0ID0gKChleHQtPnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpCisJCSAgICAgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOworICAvKiBJZ25vcmVkIHRoZSByZXNlcnZlZCBiaXRzLiAgKi8KKyAgaW50ZXJuLT5yX3NpemUgPSAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpCisJCSAgICA+PiBSRUxPQ19CSVRTM19TSVpFX1NIX0xJVFRMRSk7CisKKyAgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfTElUVVNFCisgICAgICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0dQRElTUCkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgdGhlIExJVFVTRSBhbmQgR1BESVNQIHJlbG9jcyBzcGVjaWFsbHkuICBJdHMgc3ltbmR4CisJIHZhbHVlIGlzIG5vdCBhY3R1YWxseSBhIHN5bWJvbCBpbmRleCwgYnV0IGlzIGluc3RlYWQgYQorCSBzcGVjaWFsIGNvZGUuICBXZSBwdXQgdGhlIGNvZGUgaW4gdGhlIHJfc2l6ZSBmaWVsZCwgYW5kCisJIGNsb2JiZXIgdGhlIHN5bW5keC4gICovCisgICAgICBpZiAoaW50ZXJuLT5yX3NpemUgIT0gMCkKKwlhYm9ydCAoKTsKKyAgICAgIGludGVybi0+cl9zaXplID0gaW50ZXJuLT5yX3N5bW5keDsKKyAgICAgIGludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX05PTkU7CisgICAgfQorICBlbHNlIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0lHTk9SRSkKKyAgICB7CisgICAgICAvKiBUaGUgSUdOT1JFIHJlbG9jIGdlbmVyYWxseSBmb2xsb3dzIGEgR1BESVNQIHJlbG9jLCBhbmQgaXMKKwkgYWdhaW5zdCB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoZSBzZWN0aW9uIGlzIGlycmVsZXZhbnQuICAqLworICAgICAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybiAmJgorCSAgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0FCUykKKwlhYm9ydCAoKTsKKyAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4gJiYgaW50ZXJuLT5yX3N5bW5keCA9PSBSRUxPQ19TRUNUSU9OX0xJVEEpCisJaW50ZXJuLT5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQUJTOworICAgIH0KK30KKworLyogU3dhcCBhIHJlbG9jIG91dC4gICovCisKK3N0YXRpYyB2b2lkCithbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgaW50ZXJuLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47CisgICAgIFBUUiBkc3Q7Cit7CisgIFJFTE9DICpleHQgPSAoUkVMT0MgKikgZHN0OworICBsb25nIHN5bW5keDsKKyAgdW5zaWduZWQgY2hhciBzaXplOworCisgIC8qIFVuZG8gdGhlIGhhY2tlcnkgZG9uZSBpbiBzd2FwX3JlbG9jX2luLiAgKi8KKyAgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfTElUVVNFCisgICAgICB8fCBpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0dQRElTUCkKKyAgICB7CisgICAgICBzeW1uZHggPSBpbnRlcm4tPnJfc2l6ZTsKKyAgICAgIHNpemUgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUKKwkgICAmJiAhIGludGVybi0+cl9leHRlcm4KKwkgICAmJiBpbnRlcm4tPnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fQUJTKQorICAgIHsKKyAgICAgIHN5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKKyAgICAgIHNpemUgPSBpbnRlcm4tPnJfc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzeW1uZHggPSBpbnRlcm4tPnJfc3ltbmR4OworICAgICAgc2l6ZSA9IGludGVybi0+cl9zaXplOworICAgIH0KKworICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfZXh0ZXJuCisJICAgICAgfHwgKGludGVybi0+cl9zeW1uZHggPj0gMCAmJiBpbnRlcm4tPnJfc3ltbmR4IDw9IDE0KSk7CisKKyAgYmZkX2hfcHV0XzY0IChhYmZkLCBpbnRlcm4tPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHN5bW5keCwgKGJmZF9ieXRlICopIGV4dC0+cl9zeW1uZHgpOworCisgIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpOworCisgIGV4dC0+cl9iaXRzWzBdID0gKChpbnRlcm4tPnJfdHlwZSA8PCBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSkKKwkJICAgICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpOworICBleHQtPnJfYml0c1sxXSA9ICgoaW50ZXJuLT5yX2V4dGVybiA/IFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUgOiAwKQorCQkgICAgfCAoKGludGVybi0+cl9vZmZzZXQgPDwgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSkKKwkJICAgICAgICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkpOworICBleHQtPnJfYml0c1syXSA9IDA7CisgIGV4dC0+cl9iaXRzWzNdID0gKChzaXplIDw8IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKQorCQkgICAgJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSk7Cit9CisKKy8qIEZpbmlzaCBjYW5vbmljYWxpemluZyBhIHJlbG9jLiAgUGFydCBvZiB0aGlzIGlzIGdlbmVyaWMgdG8gYWxsCisgICBFQ09GRiB0YXJnZXRzLCBhbmQgdGhhdCBwYXJ0IGlzIGluIGVjb2ZmLmMuICBUaGUgcmVzdCBpcyBkb25lIGluCisgICB0aGlzIGJhY2tlbmQgcm91dGluZS4gIEl0IG11c3QgZmlsbCBpbiB0aGUgaG93dG8gZmllbGQuICAqLworCitzdGF0aWMgdm9pZAorYWxwaGFfYWRqdXN0X3JlbG9jX2luIChhYmZkLCBpbnRlcm4sIHJwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47CisgICAgIGFyZWxlbnQgKnJwdHI7Cit7CisgIGlmIChpbnRlcm4tPnJfdHlwZSA+IEFMUEhBX1JfR1BWQUxVRSkKKyAgICBhYm9ydCAoKTsKKworICBzd2l0Y2ggKGludGVybi0+cl90eXBlKQorICAgIHsKKyAgICBjYXNlIEFMUEhBX1JfQlJBRERSOgorICAgIGNhc2UgQUxQSEFfUl9TUkVMMTY6CisgICAgY2FzZSBBTFBIQV9SX1NSRUwzMjoKKyAgICBjYXNlIEFMUEhBX1JfU1JFTDY0OgorICAgICAgLyogVGhpcyByZWxvY3MgYXBwZWFyIHRvIGJlIGZ1bGx5IHJlc29sdmVkIHdoZW4gdGhleSBhcmUgYWdhaW5zdAorICAgICAgICAgaW50ZXJuYWwgc3ltYm9scy4gIEFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scywgQlJBRERSIGF0IGxlYXN0CisgICAgICAgICBhcHBlYXJzIHRvIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybikKKwlycHRyLT5hZGRlbmQgPSAwOworICAgICAgZWxzZQorCXJwdHItPmFkZGVuZCA9IC0gKGludGVybi0+cl92YWRkciArIDQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFMUEhBX1JfR1BSRUwzMjoKKyAgICBjYXNlIEFMUEhBX1JfTElURVJBTDoKKyAgICAgIC8qIENvcHkgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGFkZGVuZCwgdG8KKwkgZW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBjb25mdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KKyAgICAgIGlmICghIGludGVybi0+cl9leHRlcm4pCisJcnB0ci0+YWRkZW5kICs9IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9SX0xJVFVTRToKKyAgICBjYXNlIEFMUEhBX1JfR1BESVNQOgorICAgICAgLyogVGhlIExJVFVTRSBhbmQgR1BESVNQIHJlbG9jcyBkbyBub3QgdXNlIGEgc3ltYm9sLCBvciBhbgorCSBhZGRlbmQsIGJ1dCB0aGV5IGRvIHVzZSBhIHNwZWNpYWwgY29kZS4gIFB1dCB0aGlzIGNvZGUgaW4gdGhlCisJIGFkZGVuZCBmaWVsZC4gICovCisgICAgICBycHRyLT5hZGRlbmQgPSBpbnRlcm4tPnJfc2l6ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9SX09QX1NUT1JFOgorICAgICAgLyogVGhlIFNUT1JFIHJlbG9jIG5lZWRzIHRoZSBzaXplIGFuZCBvZmZzZXQgZmllbGRzLiAgV2Ugc3RvcmUKKwkgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KKyAgICAgIEJGRF9BU1NFUlQgKGludGVybi0+cl9vZmZzZXQgPD0gMjU2ICYmIGludGVybi0+cl9zaXplIDw9IDI1Nik7CisgICAgICBycHRyLT5hZGRlbmQgPSAoaW50ZXJuLT5yX29mZnNldCA8PCA4KSArIGludGVybi0+cl9zaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFMUEhBX1JfT1BfUFVTSDoKKyAgICBjYXNlIEFMUEhBX1JfT1BfUFNVQjoKKyAgICBjYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKKyAgICAgIC8qIFRoZSBQVVNILCBQU1VCIGFuZCBQUlNISUZUIHJlbG9jcyBkbyBub3QgYWN0dWFsbHkgdXNlIGFuCisJIGFkZHJlc3MuICBJIGJlbGlldmUgdGhhdCB0aGUgYWRkcmVzcyBzdXBwbGllZCBpcyByZWFsbHkgYW4KKwkgYWRkZW5kLiAgKi8KKyAgICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl92YWRkcjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9SX0dQVkFMVUU6CisgICAgICAvKiBTZXQgdGhlIGFkZGVuZCBmaWVsZCB0byB0aGUgbmV3IEdQIHZhbHVlLiAgKi8KKyAgICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9zeW1uZHggKyBlY29mZl9kYXRhIChhYmZkKS0+Z3A7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6CisgICAgICAvKiBJZiB0aGUgdHlwZSBpcyBBTFBIQV9SX0lHTk9SRSwgbWFrZSBzdXJlIHRoaXMgaXMgYSByZWZlcmVuY2UKKwkgdG8gdGhlIGFic29sdXRlIHNlY3Rpb24gc28gdGhhdCB0aGUgcmVsb2MgaXMgaWdub3JlZC4gIEZvcgorCSBzb21lIHJlYXNvbiB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jIHR5cGUgaXMgbm90IGFkanVzdGVkIGJ5CisJIHRoZSBzZWN0aW9uIHZtYS4gIFdlIHJlY29yZCB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUKKwkgaGVyZSwgZm9yIGNvbnZlbmllbmNlIHdoZW4gZG9pbmcgdGhlIEdQRElTUCByZWxvY2F0aW9uLiAgKi8KKyAgICAgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisgICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLT5yX3ZhZGRyOworICAgICAgcnB0ci0+YWRkZW5kID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJwdHItPmhvd3RvID0gJmFscGhhX2hvd3RvX3RhYmxlW2ludGVybi0+cl90eXBlXTsKK30KKworLyogV2hlbiB3cml0aW5nIG91dCBhIHJlbG9jIHdlIG5lZWQgdG8gcHVsbCBzb21lIHZhbHVlcyBiYWNrIG91dCBvZgorICAgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSByZWxvYy4gIFRoaXMgaXMgcm91Z2hseSB0aGUgcmV2ZXJzZSBvZgorICAgYWxwaGFfYWRqdXN0X3JlbG9jX2luLCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBjaGFuZ2VzIHdlIGRvCisgICBub3QgbmVlZCB0byB1bmRvLiAgKi8KKworc3RhdGljIHZvaWQKK2FscGhhX2FkanVzdF9yZWxvY19vdXQgKGFiZmQsIHJlbCwgaW50ZXJuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGFyZWxlbnQgKnJlbDsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Cit7CisgIHN3aXRjaCAoaW50ZXJuLT5yX3R5cGUpCisgICAgeworICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6CisgICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKKyAgICAgIGludGVybi0+cl9zaXplID0gcmVsLT5hZGRlbmQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9PUF9TVE9SRToKKyAgICAgIGludGVybi0+cl9zaXplID0gcmVsLT5hZGRlbmQgJiAweGZmOworICAgICAgaW50ZXJuLT5yX29mZnNldCA9IChyZWwtPmFkZGVuZCA+PiA4KSAmIDB4ZmY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9PUF9QVVNIOgorICAgIGNhc2UgQUxQSEFfUl9PUF9QU1VCOgorICAgIGNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgorICAgICAgaW50ZXJuLT5yX3ZhZGRyID0gcmVsLT5hZGRlbmQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9JR05PUkU6CisgICAgICBpbnRlcm4tPnJfdmFkZHIgPSByZWwtPmFkZHJlc3M7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFRoZSBzaXplIG9mIHRoZSBzdGFjayBmb3IgdGhlIHJlbG9jYXRpb24gZXZhbHVhdG9yLiAgKi8KKyNkZWZpbmUgUkVMT0NfU1RBQ0tTSVpFICgxMCkKKworLyogQWxwaGEgRUNPRkYgcmVsb2NzIGhhdmUgYSBidWlsdCBpbiBleHByZXNzaW9uIGV2YWx1YXRvciBhcyB3ZWxsIGFzCisgICBvdGhlciBpbnRlcmRlcGVuZGVuY2llcy4gIFJhdGhlciB0aGFuIHVzZSBhIGJ1bmNoIG9mIHNwZWNpYWwKKyAgIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcywgd2UgdXNlIGEgc2luZ2xlIHJvdXRpbmUgdG8gZG8gYWxsCisgICB0aGUgcmVsb2NhdGlvbiBmb3IgYSBzZWN0aW9uLiAgSSBoYXZlbid0IHlldCB3b3JrZWQgb3V0IGhvdyB0aGUKKyAgIGFzc2VtYmxlciBpcyBnb2luZyB0byBoYW5kbGUgdGhpcy4gICovCisKK3N0YXRpYyBiZmRfYnl0ZSAqCithbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKKwkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKKyAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247CisgIGxvbmcgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7CisgIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOworICBsb25nIHJlbG9jX2NvdW50OworICBiZmQgKm91dHB1dF9iZmQgPSByZWxvY2F0ZWFibGUgPyBhYmZkIDogKGJmZCAqKSBOVUxMOworICBiZmRfdm1hIGdwOworICBib29sZWFuIGdwX3VuZGVmaW5lZDsKKyAgYmZkX3ZtYSBzdGFja1tSRUxPQ19TVEFDS1NJWkVdOworICBpbnQgdG9zID0gMDsKKworICBpZiAocmVsb2Nfc2l6ZSA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKKyAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgZGF0YSwKKwkJCQkgIChmaWxlX3B0cikgMCwgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgc2VjdGlvbiBzaXplIGlzIG5vdCBnb2luZyB0byBjaGFuZ2UuICAqLworICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7CisgIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOworCisgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQlyZWxvY192ZWN0b3IsIHN5bWJvbHMpOworICBpZiAocmVsb2NfY291bnQgPCAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBpZiAocmVsb2NfY291bnQgPT0gMCkKKyAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOworCisgIC8qIEdldCB0aGUgR1AgdmFsdWUgZm9yIHRoZSBvdXRwdXQgQkZELiAgKi8KKyAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7CisgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpOworICBpZiAoZ3AgPT0gMCkKKyAgICB7CisgICAgICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQorCXsKKwkgIGFzZWN0aW9uICpzZWM7CisJICBiZmRfdm1hIGxvOworCisJICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLworCSAgbG8gPSAoYmZkX3ZtYSkgLTE7CisJICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKHNlYy0+dm1hIDwgbG8KKwkJICAmJiAoc3RyY21wIChzZWMtPm5hbWUsICIuc2JzcyIpID09IDAKKwkJICAgICAgfHwgc3RyY21wIChzZWMtPm5hbWUsICIuc2RhdGEiKSA9PSAwCisJCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLmxpdDQiKSA9PSAwCisJCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLmxpdDgiKSA9PSAwCisJCSAgICAgIHx8IHN0cmNtcCAoc2VjLT5uYW1lLCAiLmxpdGEiKSA9PSAwKSkKKwkJbG8gPSBzZWMtPnZtYTsKKwkgICAgfQorCSAgZ3AgPSBsbyArIDB4ODAwMDsKKwkgIF9iZmRfc2V0X2dwX3ZhbHVlIChhYmZkLCBncCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby0+aGFzaCwgIl9ncCIsIGZhbHNlLCBmYWxzZSwKKwkJCQkgICAgdHJ1ZSk7CisJICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQorCSAgICBncF91bmRlZmluZWQgPSB0cnVlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZ3AgPSAoaC0+dS5kZWYudmFsdWUKKwkJICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3ApOworCSAgICB9CisJfQorICAgIH0KKworICBmb3IgKDsgKnJlbG9jX3ZlY3RvciAhPSAoYXJlbGVudCAqKSBOVUxMOyByZWxvY192ZWN0b3IrKykKKyAgICB7CisgICAgICBhcmVsZW50ICpyZWw7CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKyAgICAgIGNoYXIgKmVycjsKKworICAgICAgcmVsID0gKnJlbG9jX3ZlY3RvcjsKKyAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7CisgICAgICBzd2l0Y2ggKHJlbC0+aG93dG8tPnR5cGUpCisJeworCWNhc2UgQUxQSEFfUl9JR05PUkU6CisJICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX1JFRkxPTkc6CisJY2FzZSBBTFBIQV9SX1JFRlFVQUQ6CisJY2FzZSBBTFBIQV9SX0JSQUREUjoKKwljYXNlIEFMUEhBX1JfSElOVDoKKwljYXNlIEFMUEhBX1JfU1JFTDE2OgorCWNhc2UgQUxQSEFfUl9TUkVMMzI6CisJY2FzZSBBTFBIQV9SX1NSRUw2NDoKKwkgIGlmIChyZWxvY2F0ZWFibGUKKwkgICAgICAmJiAoKCpyZWwtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCisJICAgIHsKKwkgICAgICByZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICAgIG91dHB1dF9iZmQsICZlcnIpOworCSAgYnJlYWs7CisKKwljYXNlIEFMUEhBX1JfR1BSRUwzMjoKKwkgIC8qIFRoaXMgcmVsb2NhdGlvbiBpcyB1c2VkIGluIGEgc3dpdGNoIHRhYmxlLiAgSXQgaXMgYSAzMgorCSAgICAgYml0IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IEdQIHZhbHVlLiAgV2UgbXVzdCBhZGp1c3QgaXQKKwkgICAgIGJ5IHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgR1AgdmFsdWUgYW5kIHRoZQorCSAgICAgY3VycmVudCBHUCB2YWx1ZS4gIFRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlCisJICAgICBhZGRlbmQuICBXZSBhZGp1c3QgdGhlIGFkZGVuZCBhbmQgbGV0CisJICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCB0aGUgam9iLiAgKi8KKwkgIHJlbC0+YWRkZW5kIC09IGdwOworCSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcmVsLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICAgIG91dHB1dF9iZmQsICZlcnIpOworCSAgaWYgKHIgPT0gYmZkX3JlbG9jX29rICYmIGdwX3VuZGVmaW5lZCkKKwkgICAgeworCSAgICAgIHIgPSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworCSAgICAgIGVyciA9IChjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIik7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX0xJVEVSQUw6CisJICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgbGl0ZXJhbCB2YWx1ZSwgZ2VuZXJhbGx5CisJICAgICAoYWx3YXlzPykgaW4gdGhlIC5saXRhIHNlY3Rpb24uICBUaGlzIGlzIGEgMTYgYml0IEdQCisJICAgICByZWxhdGl2ZSByZWxvY2F0aW9uLiAgU29tZXRpbWVzIHRoZSBzdWJzZXF1ZW50IHJlbG9jIGlzIGEKKwkgICAgIExJVFVTRSByZWxvYywgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGlzIHJlbG9jIGlzIHVzZWQuCisJICAgICBUaGlzIHNvbWV0aW1lcyBwZXJtaXRzIHJld3JpdGluZyB0aGUgdHdvIGluc3RydWN0aW9ucworCSAgICAgcmVmZXJyZWQgdG8gYnkgdGhlIExJVEVSQUwgYW5kIHRoZSBMSVRVU0UgaW50byBkaWZmZXJlbnQKKwkgICAgIGluc3RydWN0aW9ucyB3aGljaCBkbyBub3QgcmVmZXIgdG8gLmxpdGEuICBUaGlzIGNhbiBzYXZlCisJICAgICBhIG1lbW9yeSByZWZlcmVuY2UsIGFuZCBwZXJtaXRzIHJlbW92aW5nIGEgdmFsdWUgZnJvbQorCSAgICAgLmxpdGEgdGh1cyBzYXZpbmcgR1AgcmVsYXRpdmUgc3BhY2UuCisKKwkgICAgIFdlIGRvIG5vdCB0aGVzZSBvcHRpbWl6YXRpb25zLiAgVG8gZG8gdGhlbSB3ZSB3b3VsZCBuZWVkCisJICAgICB0byBhcnJhbmdlIHRvIGxpbmsgdGhlIC5saXRhIHNlY3Rpb24gZmlyc3QsIHNvIHRoYXQgYnkKKwkgICAgIHRoZSB0aW1lIHdlIGdvdCBoZXJlIHdlIHdvdWxkIGtub3cgdGhlIGZpbmFsIHZhbHVlcyB0bworCSAgICAgdXNlLiAgVGhpcyB3b3VsZCBub3QgYmUgcGFydGljdWxhcmx5IGRpZmZpY3VsdCwgYnV0IGl0IGlzCisJICAgICBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAgKi8KKworCSAgeworCSAgICB1bnNpZ25lZCBsb25nIGluc247CisKKwkgICAgLyogSSBiZWxpZXZlIHRoYXQgdGhlIExJVEVSQUwgcmVsb2Mgd2lsbCBvbmx5IGFwcGx5IHRvIGEKKwkgICAgICAgbGRxIG9yIGxkbCBpbnN0cnVjdGlvbiwgc28gY2hlY2sgbXkgYXNzdW1wdGlvbi4gICovCisJICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOworCSAgICBCRkRfQVNTRVJUICgoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOQorCQkJfHwgKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjgpOworCisJICAgIHJlbC0+YWRkZW5kIC09IGdwOworCSAgICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLCByZWwsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkJCW91dHB1dF9iZmQsICZlcnIpOworCSAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2sgJiYgZ3BfdW5kZWZpbmVkKQorCSAgICAgIHsKKwkJciA9IGJmZF9yZWxvY19kYW5nZXJvdXM7CisJCWVyciA9CisJCSAgKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9MSVRVU0U6CisJICAvKiBTZWUgQUxQSEFfUl9MSVRFUkFMIGFib3ZlIGZvciB0aGUgdXNlcyBvZiB0aGlzIHJlbG9jLiAgSXQKKwkgICAgIGRvZXMgbm90IGNhdXNlIGFueXRoaW5nIHRvIGhhcHBlbiwgaXRzZWxmLiAgKi8KKwkgIHJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCSAgYnJlYWs7CisJICAgIAorCWNhc2UgQUxQSEFfUl9HUERJU1A6CisJICAvKiBUaGlzIG1hcmtzIHRoZSBsZGFoIG9mIGFuIGxkYWgvbGRhIHBhaXIgd2hpY2ggbG9hZHMgdGhlCisJICAgICBncCByZWdpc3RlciB3aXRoIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBncCB2YWx1ZSBhbmQgdGhlCisJICAgICBjdXJyZW50IGxvY2F0aW9uLiAgVGhlIHNlY29uZCBvZiB0aGUgcGFpciBpcyByX3NpemUgYnl0ZXMKKwkgICAgIGFoZWFkOyBpdCB1c2VkIHRvIGJlIG1hcmtlZCB3aXRoIGFuIEFMUEhBX1JfSUdOT1JFIHJlbG9jLAorCSAgICAgYnV0IHRoYXQgbm8gbG9uZ2VyIGhhcHBlbnMgaW4gT1NGLzEgMy4yLiAgKi8KKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBpbnNuMSwgaW5zbjI7CisJICAgIGJmZF92bWEgYWRkZW5kOworCisJICAgIC8qIEdldCB0aGUgdHdvIGluc3RydWN0aW9ucy4gICovCisJICAgIGluc24xID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKKwkgICAgaW5zbjIgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MgKyByZWwtPmFkZGVuZCk7CisKKwkgICAgQkZEX0FTU0VSVCAoKChpbnNuMSA+PiAyNikgJiAweDNmKSA9PSAweDA5KTsgLyogbGRhaCAqLworCSAgICBCRkRfQVNTRVJUICgoKGluc24yID4+IDI2KSAmIDB4M2YpID09IDB4MDgpOyAvKiBsZGEgKi8KKworCSAgICAvKiBHZXQgdGhlIGV4aXN0aW5nIGFkZGVuZC4gIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIHNpZ24KKwkgICAgICAgZXh0ZW5zaW9uIGRvbmUgYnkgbGRhIGFuZCBsZGFoLiAgKi8KKwkgICAgYWRkZW5kID0gKChpbnNuMSAmIDB4ZmZmZikgPDwgMTYpICsgKGluc24yICYgMHhmZmZmKTsKKwkgICAgaWYgKGluc24xICYgMHg4MDAwKQorCSAgICAgIHsKKwkJYWRkZW5kIC09IDB4ODAwMDAwMDA7CisJCWFkZGVuZCAtPSAweDgwMDAwMDAwOworCSAgICAgIH0KKwkgICAgaWYgKGluc24yICYgMHg4MDAwKQorCSAgICAgIGFkZGVuZCAtPSAweDEwMDAwOworCisJICAgIC8qIFRoZSBleGlzdGluZyBhZGRlbmQgaW5jbHVkZXMgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZQorCSAgICAgICBncCBvZiB0aGUgaW5wdXQgQkZEIGFuZCB0aGUgYWRkcmVzcyBpbiB0aGUgaW5wdXQgQkZELgorCSAgICAgICBTdWJ0cmFjdCB0aGlzIG91dC4gICovCisJICAgIGFkZGVuZCAtPSAoZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AKKwkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPnZtYSArIHJlbC0+YWRkcmVzcykpOworCisJICAgIC8qIE5vdyBhZGQgaW4gdGhlIGZpbmFsIGdwIHZhbHVlLCBhbmQgc3VidHJhY3Qgb3V0IHRoZQorCSAgICAgICBmaW5hbCBhZGRyZXNzLiAgKi8KKwkgICAgYWRkZW5kICs9IChncAorCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgKyByZWwtPmFkZHJlc3MpKTsKKworCSAgICAvKiBDaGFuZ2UgdGhlIGluc3RydWN0aW9ucywgYWNjb3VudGluZyBmb3IgdGhlIHNpZ24KKwkgICAgICAgZXh0ZW5zaW9uLCBhbmQgd3JpdGUgdGhlbSBvdXQuICAqLworCSAgICBpZiAoYWRkZW5kICYgMHg4MDAwKQorCSAgICAgIGFkZGVuZCArPSAweDEwMDAwOworCSAgICBpbnNuMSA9IChpbnNuMSAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKTsKKwkgICAgaW5zbjIgPSAoaW5zbjIgJiAweGZmZmYwMDAwKSB8IChhZGRlbmQgJiAweGZmZmYpOworCisJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24xLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKKwkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjIsCisJCQlkYXRhICsgcmVsLT5hZGRyZXNzICsgcmVsLT5hZGRlbmQpOworCisJICAgIHJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCSAgfQorCSAgYnJlYWs7CisJICAKKwljYXNlIEFMUEhBX1JfT1BfUFVTSDoKKwkgIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCisJICB7CisJICAgIGFzeW1ib2wgKnN5bWJvbDsKKwkgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworCisJICAgIGlmIChyZWxvY2F0ZWFibGUpCisJICAgICAgeworCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIC8qIEZpZ3VyZSBvdXQgdGhlIHJlbG9jYXRpb24gb2YgdGhpcyBzeW1ib2wuICAqLworCSAgICBzeW1ib2wgPSAqcmVsLT5zeW1fcHRyX3B0cjsKKworCSAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorCSAgICAgIHIgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisJICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIGVsc2UKKwkgICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKKwkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisJICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCSAgICByZWxvY2F0aW9uICs9IHJlbC0+YWRkZW5kOworCisJICAgIGlmICh0b3MgPj0gUkVMT0NfU1RBQ0tTSVpFKQorCSAgICAgIGFib3J0ICgpOworCisJICAgIHN0YWNrW3RvcysrXSA9IHJlbG9jYXRpb247CisJICB9CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKKwkgIC8qIFN0b3JlIGEgdmFsdWUgZnJvbSB0aGUgcmVsb2Mgc3RhY2sgaW50byBhIGJpdGZpZWxkLiAgKi8KKwkgIHsKKwkgICAgYmZkX3ZtYSB2YWw7CisJICAgIGludCBvZmZzZXQsIHNpemU7CisKKwkgICAgaWYgKHJlbG9jYXRlYWJsZSkKKwkgICAgICB7CisJCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgaWYgKHRvcyA9PSAwKQorCSAgICAgIGFib3J0ICgpOworCisJICAgIC8qIFRoZSBvZmZzZXQgYW5kIHNpemUgZm9yIHRoaXMgcmVsb2MgYXJlIGVuY29kZWQgaW50byB0aGUKKwkgICAgICAgYWRkZW5kIGZpZWxkIGJ5IGFscGhhX2FkanVzdF9yZWxvY19pbi4gICovCisJICAgIG9mZnNldCA9IChyZWwtPmFkZGVuZCA+PiA4KSAmIDB4ZmY7CisJICAgIHNpemUgPSByZWwtPmFkZGVuZCAmIDB4ZmY7CisKKwkgICAgdmFsID0gYmZkX2dldF82NCAoYWJmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7CisJICAgIHZhbCAmPX4gKCgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldCk7CisJICAgIHZhbCB8PSAoc3RhY2tbLS10b3NdICYgKCgxIDw8IHNpemUpIC0gMSkpIDw8IG9mZnNldDsKKwkgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX09QX1BTVUI6CisJICAvKiBTdWJ0cmFjdCBhIHZhbHVlIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLworCSAgeworCSAgICBhc3ltYm9sICpzeW1ib2w7CisJICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKworCSAgICBpZiAocmVsb2NhdGVhYmxlKQorCSAgICAgIHsKKwkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KKwkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7CisKKwkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKwkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorCSAgICAgIHJlbG9jYXRpb24gPSAwOworCSAgICBlbHNlCisJICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisJICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKwkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKKworCSAgICBpZiAodG9zID09IDApCisJICAgICAgYWJvcnQgKCk7CisKKwkgICAgc3RhY2tbdG9zIC0gMV0gLT0gcmVsb2NhdGlvbjsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6CisJICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLworCSAgeworCSAgICBhc3ltYm9sICpzeW1ib2w7CisJICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKworCSAgICBpZiAocmVsb2NhdGVhYmxlKQorCSAgICAgIHsKKwkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICAvKiBGaWd1cmUgb3V0IHRoZSByZWxvY2F0aW9uIG9mIHRoaXMgc3ltYm9sLiAgKi8KKwkgICAgc3ltYm9sID0gKnJlbC0+c3ltX3B0cl9wdHI7CisKKwkgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKwkgICAgICByID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworCSAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorCSAgICAgIHJlbG9jYXRpb24gPSAwOworCSAgICBlbHNlCisJICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisJICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKwkgICAgcmVsb2NhdGlvbiArPSByZWwtPmFkZGVuZDsKKworCSAgICBpZiAodG9zID09IDApCisJICAgICAgYWJvcnQgKCk7CisKKwkgICAgc3RhY2tbdG9zIC0gMV0gPj49IHJlbG9jYXRpb247CisJICB9CisJICBicmVhazsKKwkgICAgCisJY2FzZSBBTFBIQV9SX0dQVkFMVUU6CisJICAvKiBJIHJlYWxseSBkb24ndCBrbm93IGlmIHRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcuICAqLworCSAgZ3AgPSByZWwtPmFkZGVuZDsKKwkgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBpZiAocmVsb2NhdGVhYmxlKQorCXsKKwkgIGFzZWN0aW9uICpvcyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisJICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzLiAgKi8KKwkgIG9zLT5vcmVsb2NhdGlvbltvcy0+cmVsb2NfY291bnRdID0gcmVsOworCSAgb3MtPnJlbG9jX2NvdW50Kys7CisJfQorCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spIAorCXsKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6CisJICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbC0+c3ltX3B0cl9wdHIpLAorCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+YWRkcmVzcykpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOiAKKwkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQorCQkgICAgIChsaW5rX2luZm8sIGVyciwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPmFkZHJlc3MpKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsLT5zeW1fcHRyX3B0ciksCisJCSAgICAgIHJlbC0+aG93dG8tPm5hbWUsIHJlbC0+YWRkZW5kLCBpbnB1dF9iZmQsCisJCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+YWRkcmVzcykpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKHRvcyAhPSAwKQorICAgIGFib3J0ICgpOworCisgc3VjY2Vzc2Z1bF9yZXR1cm46CisgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKKyAgICBmcmVlIChyZWxvY192ZWN0b3IpOworICByZXR1cm4gZGF0YTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQorICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgIHJldHVybiBOVUxMOworfQorCisvKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSBnZW5lcmljIHJlbG9jIHR5cGUuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCithbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIGludCBhbHBoYV90eXBlOworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZMT05HOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CisgICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKKyAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRlFVQUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BSRUwzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6CisgICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9MSVRFUkFMOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElUVVNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6CisgICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9HUERJU1A7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKKyAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0lHTk9SRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfQlJBRERSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKKyAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0hJTlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTDoKKyAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUwxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6CisgICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMNjQ7CisgICAgICBicmVhazsKKyNpZiAwCisgICAgY2FzZSA/Pz86CisgICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9PUF9QVVNIOworICAgICAgYnJlYWs7CisgICAgY2FzZSA/Pz86CisgICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9PUF9TVE9SRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgPz8/OgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFNVQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgPz8/OgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfT1BfUFJTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgPz8/OgorICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfR1BWQUxVRTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOworICAgIH0KKworICByZXR1cm4gJmFscGhhX2hvd3RvX3RhYmxlW2FscGhhX3R5cGVdOworfQorDAorLyogQSBoZWxwZXIgcm91dGluZSBmb3IgYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiB3aGljaCBjb252ZXJ0cyBhbgorICAgZXh0ZXJuYWwgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBSZXR1cm5zIHRoZQorICAgcmVsb2NhdGlvbiBhbW91bnQuICAqLworCitzdGF0aWMgYmZkX3ZtYQorYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBleHRfcmVsLCBoKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOworICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworeworICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworICBiZmRfdm1hIHJlbG9jYXRpb247CisKKyAgQkZEX0FTU0VSVCAoaW5mby0+cmVsb2NhdGVhYmxlKTsKKworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICB7CisgICAgICBhc2VjdGlvbiAqaHNlYzsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIG91dHB1dC4gIENvbnZlcnQgdGhlIHJlbG9jIGZyb20KKwkgYmVpbmcgYWdhaW5zdCB0aGUgc3ltYm9sIHRvIGJlaW5nIGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLworCisgICAgICAvKiBDbGVhciB0aGUgcl9leHRlcm4gYml0LiAgKi8KKyAgICAgIGV4dF9yZWwtPnJfYml0c1sxXSAmPX4gUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRTsKKworICAgICAgLyogQ29tcHV0ZSBhIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCisgICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBoc2VjLT5vdXRwdXRfc2VjdGlvbik7CisKKyAgICAgIHJfc3ltbmR4ID0gLTE7CisgICAgICBzd2l0Y2ggKG5hbWVbMV0pCisJeworCWNhc2UgJ0EnOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKKwkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKKwkgIGJyZWFrOworCWNhc2UgJ2InOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQorCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQlNTOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQorCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKKwkgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKKwkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7CisJICBicmVhazsKKwljYXNlICdpJzoKKwkgIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCisJICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9JTklUOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJICBpZiAoc3RyY21wIChuYW1lLCAiLmxpdGEiKSA9PSAwKQorCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKKwkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDg7CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCisJICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OworCSAgYnJlYWs7CisJY2FzZSAncCc6CisJICBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKKwkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1BEQVRBOworCSAgYnJlYWs7CisJY2FzZSAncic6CisJICBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKKwkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOworCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCisJICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7CisJICBicmVhazsKKwljYXNlICdzJzoKKwkgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQorCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCisJICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOworCSAgYnJlYWs7CisJY2FzZSAndCc6CisJICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQorCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKKwkgIGJyZWFrOworCWNhc2UgJ3gnOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCisJICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9YREFUQTsKKwkgIGJyZWFrOworCX0KKwkJICAgICAgCisgICAgICBpZiAocl9zeW1uZHggPT0gLTEpCisJYWJvcnQgKCk7CisKKyAgICAgIC8qIEFkZCB0aGUgc2VjdGlvbiBWTUEgYW5kIHRoZSBzeW1ib2wgdmFsdWUuICAqLworICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICsgaHNlYy0+b3V0cHV0X29mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBzeW1uZHggdmFsdWUgdG8gdGhlIHJpZ2h0IG9uZSBmb3IKKwkgdGhlIG91dHB1dCBCRkQuICAqLworICAgICAgcl9zeW1uZHggPSBoLT5pbmR4OworICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQorCXsKKwkgIC8qIENhbGxlciBtdXN0IGdpdmUgYW4gZXJyb3IuICAqLworCSAgcl9zeW1uZHggPSAwOworCX0KKyAgICAgIHJlbG9jYXRpb24gPSAwOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX3N5bW5keCB2YWx1ZS4gICovCisgIGJmZF9oX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgcl9zeW1uZHgsCisJCShiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3N5bW5keCk7CisKKyAgcmV0dXJuIHJlbG9jYXRpb247Cit9CisKKy8qIFJlbG9jYXRlIGEgc2VjdGlvbiB3aGlsZSBsaW5raW5nIGFuIEFscGhhIEVDT0ZGIGZpbGUuICBUaGlzIGlzCisgICBxdWl0ZSBzaW1pbGFyIHRvIGdldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4gIFBlcmhhcHMgdGhleQorICAgY291bGQgYmUgY29tYmluZWQgc29tZWhvdy4gICovCisKK3N0YXRpYyBib29sZWFuCithbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQljb250ZW50cywgZXh0ZXJuYWxfcmVsb2NzKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgUFRSIGV4dGVybmFsX3JlbG9jczsKK3sKKyAgYXNlY3Rpb24gKipzeW1uZHhfdG9fc2VjdGlvbiwgKmxpdGFfc2VjOworICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSBncDsKKyAgYm9vbGVhbiBncF91bmRlZmluZWQ7CisgIGJmZF92bWEgc3RhY2tbUkVMT0NfU1RBQ0tTSVpFXTsKKyAgaW50IHRvcyA9IDA7CisgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKKyAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKKworICAvKiBXZSBrZWVwIGEgdGFibGUgbWFwcGluZyB0aGUgc3ltbmR4IGZvdW5kIGluIGFuIGludGVybmFsIHJlbG9jIHRvCisgICAgIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIHVwIHRoZQorICAgICBzZWN0aW9uIGJ5IG5hbWUgZWFjaCB0aW1lLiAgKi8KKyAgc3ltbmR4X3RvX3NlY3Rpb24gPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbjsKKyAgaWYgKHN5bW5keF90b19zZWN0aW9uID09IChhc2VjdGlvbiAqKikgTlVMTCkKKyAgICB7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbiA9ICgoYXNlY3Rpb24gKiopCisJCQkgICBiZmRfYWxsb2MgKGlucHV0X2JmZCwKKwkJCQkgICAgICAoTlVNX1JFTE9DX1NFQ1RJT05TCisJCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKKyAgICAgIGlmICghc3ltbmR4X3RvX3NlY3Rpb24pCisJcmV0dXJuIGZhbHNlOworCisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX05PTkVdID0gTlVMTDsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fVEVYVF0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIudGV4dCIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SREFUQV0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucmRhdGEiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fREFUQV0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZGF0YSIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TREFUQV0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2RhdGEiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0JTU10gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuc2JzcyIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9CU1NdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmJzcyIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9JTklUXSA9CisJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5pbml0Iik7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDhdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDgiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUNF0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0NCIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9YREFUQV0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIueGRhdGEiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUERBVEFdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnBkYXRhIik7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0ZJTkldID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmZpbmkiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUQV0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0YSIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9BQlNdID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkNPTlNUXSA9CisJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5yY29uc3QiKTsKKworICAgICAgZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb24gPSBzeW1uZHhfdG9fc2VjdGlvbjsKKyAgICB9CisKKyAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bV9oYXNoZXM7CisKKyAgLyogT24gdGhlIEFscGhhLCB0aGUgLmxpdGEgc2VjdGlvbiBtdXN0IGJlIGFkZHJlc3NhYmxlIGJ5IHRoZSBnbG9iYWwKKyAgICAgcG9pbnRlci4gIFRvIHN1cHBvcnQgbGFyZ2UgcHJvZ3JhbXMsIHdlIG5lZWQgdG8gYWxsb3cgbXVsdGlwbGUKKyAgICAgZ2xvYmFsIHBvaW50ZXJzLiAgVGhpcyB3b3JrcyBhcyBsb25nIGFzIGVhY2ggaW5wdXQgLmxpdGEgc2VjdGlvbgorICAgICBpcyA8NjRLQiBiaWcuICBUaGlzIGltcGxpZXMgdGhhdCB3aGVuIHByb2R1Y2luZyByZWxvY2F0YWJsZQorICAgICBvdXRwdXQsIHRoZSAubGl0YSBzZWN0aW9uIGlzIGxpbWl0ZWQgdG8gNjRLQi4gLiAqLworCisgIGxpdGFfc2VjID0gc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVRBXTsKKyAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7CisgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSAmJiBsaXRhX3NlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICpsaXRhX3NlY19kYXRhOworCisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHNlY3Rpb24gZGF0YSBzdHJ1Y3R1cmUgdG8gd2hpY2ggd2UgY2FuCisJIGhhbmcgb24gdG8gdGhlIGdwIHZhbHVlIHdlIHBpY2sgZm9yIHRoZSBzZWN0aW9uLiAgKi8KKyAgICAgIGxpdGFfc2VjX2RhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbGl0YV9zZWMpOworICAgICAgaWYgKGxpdGFfc2VjX2RhdGEgPT0gTlVMTCkKKwl7CisJICBsaXRhX3NlY19kYXRhID0gKChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKQorCQkJICAgYmZkX3phbGxvYyAoaW5wdXRfYmZkLAorCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhKSkpOworCSAgZWNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGxpdGFfc2VjKSA9IGxpdGFfc2VjX2RhdGE7CisJfQorCisgICAgICBpZiAobGl0YV9zZWNfZGF0YS0+Z3AgIT0gMCkKKwl7CisJICAvKiBJZiB3ZSBhbHJlYWR5IGFzc2lnbmVkIGEgZ3AgdG8gdGhpcyBzZWN0aW9uLCB3ZSBiZXR0ZXIKKwkgICAgIHN0aWNrIHdpdGggdGhhdCB2YWx1ZS4gICovCisJICBncCA9IGxpdGFfc2VjX2RhdGEtPmdwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZmRfdm1hIGxpdGFfdm1hOworCSAgYmZkX3NpemVfdHlwZSBsaXRhX3NpemU7CisKKwkgIGxpdGFfdm1hID0gbGl0YV9zZWMtPm91dHB1dF9vZmZzZXQgKyBsaXRhX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKwkgIGxpdGFfc2l6ZSA9IGxpdGFfc2VjLT5fY29va2VkX3NpemU7CisJICBpZiAobGl0YV9zaXplID09IDApCisJICAgIGxpdGFfc2l6ZSA9IGxpdGFfc2VjLT5fcmF3X3NpemU7CisKKwkgIGlmIChncCA9PSAwCisJICAgICAgfHwgbGl0YV92bWEgPCAgZ3AgLSAweDgwMDAKKwkgICAgICB8fCBsaXRhX3ZtYSArIGxpdGFfc2l6ZSA+PSBncCArIDB4ODAwMCkKKwkgICAgeworCSAgICAgIC8qIEVpdGhlciBncCBoYXNuJ3QgYmVlbiBzZXQgYXQgYWxsIG9yIHRoZSBjdXJyZW50IGdwCisJCSBjYW5ub3QgYWRkcmVzcyB0aGlzIC5saXRhIHNlY3Rpb24uICBJbiBib3RoIGNhc2VzIHdlCisJCSByZXNldCB0aGUgZ3AgdG8gcG9pbnQgaW50byB0aGUgIm1pZGRsZSIgb2YgdGhlCisJCSBjdXJyZW50IGlucHV0IC5saXRhIHNlY3Rpb24uICAqLworCSAgICAgIGlmIChncCAmJiAhZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nKQorCQl7CisJCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLAorCQkJCQkgICAgICAgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksCisJCQkJCSAgICAgICAoY2hhciAqKSBOVUxMLCBvdXRwdXRfYmZkLAorCQkJCQkgICAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKKwkJICBlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+aXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmcgPSB0cnVlOworCQl9CisJICAgICAgaWYgKGxpdGFfdm1hIDwgZ3AgLSAweDgwMDApCisJCWdwID0gbGl0YV92bWEgKyBsaXRhX3NpemUgLSAweDgwMDA7CisJICAgICAgZWxzZQorCQlncCA9IGxpdGFfdm1hICsgMHg4MDAwOworCisJICAgIH0KKworCSAgbGl0YV9zZWNfZGF0YS0+Z3AgPSBncDsKKwl9CisKKyAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7CisgICAgfQorCisgIGdwX3VuZGVmaW5lZCA9IChncCA9PSAwKTsKKworICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKG91dHB1dF9iZmQpKTsKKyAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChpbnB1dF9iZmQpKTsKKworICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBleHRlcm5hbF9yZWxvY3M7CisgIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworICBmb3IgKDsgZXh0X3JlbCA8IGV4dF9yZWxfZW5kOyBleHRfcmVsKyspCisgICAgeworICAgICAgYmZkX3ZtYSByX3ZhZGRyOworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIGludCByX3R5cGU7CisgICAgICBpbnQgcl9leHRlcm47CisgICAgICBpbnQgcl9vZmZzZXQ7CisgICAgICBpbnQgcl9zaXplOworICAgICAgYm9vbGVhbiByZWxvY2F0ZXA7CisgICAgICBib29sZWFuIGFkanVzdF9hZGRycDsKKyAgICAgIGJvb2xlYW4gZ3BfdXNlZHA7CisgICAgICBiZmRfdm1hIGFkZGVuZDsKKworICAgICAgcl92YWRkciA9IGJmZF9oX2dldF82NCAoaW5wdXRfYmZkLCAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7CisgICAgICByX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoaW5wdXRfYmZkLCAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl9zeW1uZHgpOworCisgICAgICByX3R5cGUgPSAoKGV4dF9yZWwtPnJfYml0c1swXSAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKQorCQk+PiBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRSk7CisgICAgICByX2V4dGVybiA9IChleHRfcmVsLT5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFKSAhPSAwOworICAgICAgcl9vZmZzZXQgPSAoKGV4dF9yZWwtPnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUpCisJCSAgPj4gUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSk7CisgICAgICAvKiBJZ25vcmVkIHRoZSByZXNlcnZlZCBiaXRzLiAgKi8KKyAgICAgIHJfc2l6ZSA9ICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUpCisJCT4+IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKTsKKworICAgICAgcmVsb2NhdGVwID0gZmFsc2U7CisgICAgICBhZGp1c3RfYWRkcnAgPSB0cnVlOworICAgICAgZ3BfdXNlZHAgPSBmYWxzZTsKKyAgICAgIGFkZGVuZCA9IDA7CisKKyAgICAgIHN3aXRjaCAocl90eXBlKQorCXsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisKKwljYXNlIEFMUEhBX1JfSUdOT1JFOgorCSAgLyogVGhpcyByZWxvYyBhcHBlYXJzIGFmdGVyIGEgR1BESVNQIHJlbG9jLiAgT24gZWFybGllcgorCSAgICAgdmVyc2lvbnMgb2YgT1NGLzEsIEl0IG1hcmtlZCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZAorCSAgICAgaW5zdHJ1Y3Rpb24gdG8gYmUgYWx0ZXJlZCBieSB0aGUgR1BESVNQIHJlbG9jLCBidXQgaXQgaXMKKwkgICAgIG5vdCBvdGhlcndpc2UgdXNlZCBmb3IgYW55dGhpbmcuICBGb3Igc29tZSByZWFzb24sIHRoZQorCSAgICAgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiBkb2VzIG5vdCBhcHBlYXIgdG8gaW5jbHVkZSB0aGUKKwkgICAgIHNlY3Rpb24gVk1BLCB1bmxpa2UgdGhlIG90aGVyIHJlbG9jYXRpb24gdHlwZXMuICAqLworCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwkgICAgYmZkX2hfcHV0XzY0IChpbnB1dF9iZmQsCisJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyByX3ZhZGRyLAorCQkJICAoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7CisJICBhZGp1c3RfYWRkcnAgPSBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX1JFRkxPTkc6CisJY2FzZSBBTFBIQV9SX1JFRlFVQUQ6CisJY2FzZSBBTFBIQV9SX0hJTlQ6CisJICByZWxvY2F0ZXAgPSB0cnVlOworCSAgYnJlYWs7CisKKwljYXNlIEFMUEhBX1JfQlJBRERSOgorCWNhc2UgQUxQSEFfUl9TUkVMMTY6CisJY2FzZSBBTFBIQV9SX1NSRUwzMjoKKwljYXNlIEFMUEhBX1JfU1JFTDY0OgorCSAgaWYgKHJfZXh0ZXJuKQorCSAgICBhZGRlbmQgKz0gLSAocl92YWRkciArIDQpOworCSAgcmVsb2NhdGVwID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX0dQUkVMMzI6CisJICAvKiBUaGlzIHJlbG9jYXRpb24gaXMgdXNlZCBpbiBhIHN3aXRjaCB0YWJsZS4gIEl0IGlzIGEgMzIKKwkgICAgIGJpdCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBHUCB2YWx1ZS4gIFdlIG11c3QgYWRqdXN0IGl0CisJICAgICBieSB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIEdQIHZhbHVlIGFuZCB0aGUKKwkgICAgIGN1cnJlbnQgR1AgdmFsdWUuICAqLworCSAgcmVsb2NhdGVwID0gdHJ1ZTsKKwkgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7CisJICBncF91c2VkcCA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9MSVRFUkFMOgorCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdmFsdWUsIGdlbmVyYWxseQorCSAgICAgKGFsd2F5cz8pIGluIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCBHUAorCSAgICAgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFNvbWV0aW1lcyB0aGUgc3Vic2VxdWVudCByZWxvYyBpcyBhCisJICAgICBMSVRVU0UgcmVsb2MsIHdoaWNoIGluZGljYXRlcyBob3cgdGhpcyByZWxvYyBpcyB1c2VkLgorCSAgICAgVGhpcyBzb21ldGltZXMgcGVybWl0cyByZXdyaXRpbmcgdGhlIHR3byBpbnN0cnVjdGlvbnMKKwkgICAgIHJlZmVycmVkIHRvIGJ5IHRoZSBMSVRFUkFMIGFuZCB0aGUgTElUVVNFIGludG8gZGlmZmVyZW50CisJICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90IHJlZmVyIHRvIC5saXRhLiAgVGhpcyBjYW4gc2F2ZQorCSAgICAgYSBtZW1vcnkgcmVmZXJlbmNlLCBhbmQgcGVybWl0cyByZW1vdmluZyBhIHZhbHVlIGZyb20KKwkgICAgIC5saXRhIHRodXMgc2F2aW5nIEdQIHJlbGF0aXZlIHNwYWNlLgorCisJICAgICBXZSBkbyBub3QgdGhlc2Ugb3B0aW1pemF0aW9ucy4gIFRvIGRvIHRoZW0gd2Ugd291bGQgbmVlZAorCSAgICAgdG8gYXJyYW5nZSB0byBsaW5rIHRoZSAubGl0YSBzZWN0aW9uIGZpcnN0LCBzbyB0aGF0IGJ5CisJICAgICB0aGUgdGltZSB3ZSBnb3QgaGVyZSB3ZSB3b3VsZCBrbm93IHRoZSBmaW5hbCB2YWx1ZXMgdG8KKwkgICAgIHVzZS4gIFRoaXMgd291bGQgbm90IGJlIHBhcnRpY3VsYXJseSBkaWZmaWN1bHQsIGJ1dCBpdCBpcworCSAgICAgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCisKKwkgIC8qIEkgYmVsaWV2ZSB0aGF0IHRoZSBMSVRFUkFMIHJlbG9jIHdpbGwgb25seSBhcHBseSB0byBhIGxkcQorCSAgICAgb3IgbGRsIGluc3RydWN0aW9uLCBzbyBjaGVjayBteSBhc3N1bXB0aW9uLiAgKi8KKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBpbnNuOworCisJICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCisJCQkgICAgICAgY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKKwkgICAgQkZEX0FTU0VSVCAoKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjkKKwkJCXx8ICgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI4KTsKKwkgIH0KKworCSAgcmVsb2NhdGVwID0gdHJ1ZTsKKwkgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7CisJICBncF91c2VkcCA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9MSVRVU0U6CisJICAvKiBTZWUgQUxQSEFfUl9MSVRFUkFMIGFib3ZlIGZvciB0aGUgdXNlcyBvZiB0aGlzIHJlbG9jLiAgSXQKKwkgICAgIGRvZXMgbm90IGNhdXNlIGFueXRoaW5nIHRvIGhhcHBlbiwgaXRzZWxmLiAgKi8KKwkgIGJyZWFrOworCSAgICAKKwljYXNlIEFMUEhBX1JfR1BESVNQOgorCSAgLyogVGhpcyBtYXJrcyB0aGUgbGRhaCBvZiBhbiBsZGFoL2xkYSBwYWlyIHdoaWNoIGxvYWRzIHRoZQorCSAgICAgZ3AgcmVnaXN0ZXIgd2l0aCB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgZ3AgdmFsdWUgYW5kIHRoZQorCSAgICAgY3VycmVudCBsb2NhdGlvbi4gIFRoZSBzZWNvbmQgb2YgdGhlIHBhaXIgaXMgcl9zeW1uZHgKKwkgICAgIGJ5dGVzIGFoZWFkLiAgSXQgdXNlZCB0byBiZSBtYXJrZWQgd2l0aCBhbiBBTFBIQV9SX0lHTk9SRQorCSAgICAgcmVsb2MsIGJ1dCBPU0YvMSAzLjIgbm8gbG9uZ2VyIGRvZXMgdGhhdC4gICovCisJICB7CisJICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOworCisJICAgIC8qIEdldCB0aGUgdHdvIGluc3RydWN0aW9ucy4gICovCisJICAgIGluc24xID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAorCQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7CisJICAgIGluc24yID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAorCQkJCShjb250ZW50cworCQkJCSArIHJfdmFkZHIKKwkJCQkgLSBpbnB1dF9zZWN0aW9uLT52bWEKKwkJCQkgKyByX3N5bW5keCkpOworCisJICAgIEJGRF9BU1NFUlQgKCgoaW5zbjEgPj4gMjYpICYgMHgzZikgPT0gMHgwOSk7IC8qIGxkYWggKi8KKwkgICAgQkZEX0FTU0VSVCAoKChpbnNuMiA+PiAyNikgJiAweDNmKSA9PSAweDA4KTsgLyogbGRhICovCisKKwkgICAgLyogR2V0IHRoZSBleGlzdGluZyBhZGRlbmQuICBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBzaWduCisJICAgICAgIGV4dGVuc2lvbiBkb25lIGJ5IGxkYSBhbmQgbGRhaC4gICovCisJICAgIGFkZGVuZCA9ICgoaW5zbjEgJiAweGZmZmYpIDw8IDE2KSArIChpbnNuMiAmIDB4ZmZmZik7CisJICAgIGlmIChpbnNuMSAmIDB4ODAwMCkKKwkgICAgICB7CisJCS8qIFRoaXMgaXMgYWRkZW5kIC09IDB4MTAwMDAwMDAwIHdpdGhvdXQgY2F1c2luZyBhbgorCQkgICBpbnRlZ2VyIG92ZXJmbG93IG9uIGEgMzIgYml0IGhvc3QuICAqLworCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKKwkJYWRkZW5kIC09IDB4ODAwMDAwMDA7CisJICAgICAgfQorCSAgICBpZiAoaW5zbjIgJiAweDgwMDApCisJICAgICAgYWRkZW5kIC09IDB4MTAwMDA7CisKKwkgICAgLyogVGhlIGV4aXN0aW5nIGFkZGVuZCBpbmNsdWRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorCSAgICAgICBncCBvZiB0aGUgaW5wdXQgQkZEIGFuZCB0aGUgYWRkcmVzcyBpbiB0aGUgaW5wdXQgQkZELgorCSAgICAgICBXZSB3YW50IHRvIGNoYW5nZSB0aGlzIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCisJICAgICAgIGZpbmFsIEdQIGFuZCB0aGUgZmluYWwgYWRkcmVzcy4gICovCisJICAgIGFkZGVuZCArPSAoZ3AKKwkJICAgICAgIC0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AKKwkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCkpOworCisJICAgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb25zLCBhY2NvdW50aW5nIGZvciB0aGUgc2lnbgorCSAgICAgICBleHRlbnNpb24sIGFuZCB3cml0ZSB0aGVtIG91dC4gICovCisJICAgIGlmIChhZGRlbmQgJiAweDgwMDApCisJICAgICAgYWRkZW5kICs9IDB4MTAwMDA7CisJICAgIGluc24xID0gKGluc24xICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpOworCSAgICBpbnNuMiA9IChpbnNuMiAmIDB4ZmZmZjAwMDApIHwgKGFkZGVuZCAmIDB4ZmZmZik7CisKKwkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjEsCisJCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMiwKKwkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSArIHJfc3ltbmR4KTsKKworCSAgICBncF91c2VkcCA9IHRydWU7CisJICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgorCWNhc2UgQUxQSEFfUl9PUF9QU1VCOgorCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgorCSAgLyogTWFuaXB1bGF0ZSB2YWx1ZXMgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICBUaGUKKwkgICAgIHJfdmFkZHIgZmllbGQgaXMgbm90IGFuIGFkZHJlc3MgaW4gaW5wdXRfc2VjdGlvbiwgaXQgaXMKKwkgICAgIHRoZSBjdXJyZW50IHZhbHVlIChpbmNsdWRpbmcgYW55IGFkZGVuZCkgb2YgdGhlIG9iamVjdAorCSAgICAgYmVpbmcgdXNlZC4gICovCisJICBpZiAoISByX2V4dGVybikKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzOworCisJICAgICAgcyA9IHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XTsKKwkgICAgICBpZiAocyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKwkJYWJvcnQgKCk7CisJICAgICAgYWRkZW5kID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQgLSBzLT52bWE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keF07CisJICAgICAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkJYWJvcnQgKCk7CisKKwkgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCisJCXsKKwkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCQkgICAgYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBOb3RlIHRoYXQgd2UgcGFzcyB0aGUgYWRkcmVzcyBhcyAwLCBzaW5jZSB3ZQorCQkJIGRvIG5vdCBoYXZlIGEgbWVhbmluZ2Z1bCBudW1iZXIgZm9yIHRoZQorCQkJIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiB0aGF0IGlzIGJlaW5nCisJCQkgcmVsb2NhdGVkLiAgKi8KKwkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAorCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgKGJmZF92bWEpIDApKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgYWRkZW5kID0gMDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKKwkJICAgICAgJiYgaC0+aW5keCA9PSAtMSkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBzeW1ib2wgaXMgbm90IGJlaW5nIHdyaXR0ZW4gb3V0LiAgUGFzcworCQkJIHRoZSBhZGRyZXNzIGFzIDAsIGFzIHdpdGggdW5kZWZpbmVkX3N5bWJvbCwKKwkJCSBhYm92ZS4gICovCisJCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKKwkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJCSAgICAgIGlucHV0X3NlY3Rpb24sIChiZmRfdm1hKSAwKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisKKwkJICBhZGRlbmQgPSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jIChvdXRwdXRfYmZkLCBpbmZvLAorCQkJCQkJCSBpbnB1dF9iZmQsCisJCQkJCQkJIGV4dF9yZWwsIGgpOworCQl9CisJICAgIH0KKworCSAgYWRkZW5kICs9IHJfdmFkZHI7CisKKwkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJICAgIHsKKwkgICAgICAvKiBBZGp1c3Qgcl92YWRkciBieSB0aGUgYWRkZW5kLiAgKi8KKwkgICAgICBiZmRfaF9wdXRfNjQgKGlucHV0X2JmZCwgYWRkZW5kLAorCQkJICAgIChiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3dpdGNoIChyX3R5cGUpCisJCXsKKwkJY2FzZSBBTFBIQV9SX09QX1BVU0g6CisJCSAgaWYgKHRvcyA+PSBSRUxPQ19TVEFDS1NJWkUpCisJCSAgICBhYm9ydCAoKTsKKwkJICBzdGFja1t0b3MrK10gPSBhZGRlbmQ7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBBTFBIQV9SX09QX1BTVUI6CisJCSAgaWYgKHRvcyA9PSAwKQorCQkgICAgYWJvcnQgKCk7CisJCSAgc3RhY2tbdG9zIC0gMV0gLT0gYWRkZW5kOworCQkgIGJyZWFrOworCisJCWNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgorCQkgIGlmICh0b3MgPT0gMCkKKwkJICAgIGFib3J0ICgpOworCQkgIHN0YWNrW3RvcyAtIDFdID4+PSBhZGRlbmQ7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICBhZGp1c3RfYWRkcnAgPSBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX09QX1NUT1JFOgorCSAgLyogU3RvcmUgYSB2YWx1ZSBmcm9tIHRoZSByZWxvYyBzdGFjayBpbnRvIGEgYml0ZmllbGQuICBJZgorCSAgICAgd2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYWxsIHdlIGRvIGlzCisJICAgICBhZGp1c3QgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jLiAgKi8KKwkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKKwkgICAgeworCSAgICAgIGJmZF92bWEgbWFzazsKKwkgICAgICBiZmRfdm1hIHZhbDsKKworCSAgICAgIGlmICh0b3MgPT0gMCkKKwkJYWJvcnQgKCk7CisKKwkgICAgICAvKiBHZXQgdGhlIHJlbG9jYXRpb24gbWFzay4gIFRoZSBzZXBhcmF0ZSBzdGVwcyBhbmQgdGhlCisJCSBjYXN0cyB0byBiZmRfdm1hIGFyZSBhdHRlbXB0cyB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUKKwkJIEFscGhhIE9TRiAxLjMgQyBjb21waWxlci4gIFNlZSByZWxvYy5jIGZvciBtb3JlCisJCSBkZXRhaWxzLiAgKi8KKwkgICAgICBtYXNrID0gMTsKKwkgICAgICBtYXNrIDw8PSAoYmZkX3ZtYSkgcl9zaXplOworCSAgICAgIG1hc2sgLT0gMTsKKworCSAgICAgIC8qIEZJWE1FOiBJIGRvbid0IGtub3cgd2hhdCBraW5kIG9mIG92ZXJmbG93IGNoZWNraW5nLAorCQkgaWYgYW55LCBzaG91bGQgYmUgZG9uZSBoZXJlLiAgKi8KKwkgICAgICB2YWwgPSBiZmRfZ2V0XzY0IChpbnB1dF9iZmQsCisJCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKKwkgICAgICB2YWwgJj1+IG1hc2sgPDwgKGJmZF92bWEpIHJfb2Zmc2V0OworCSAgICAgIHZhbCB8PSAoc3RhY2tbLS10b3NdICYgbWFzaykgPDwgKGJmZF92bWEpIHJfb2Zmc2V0OworCSAgICAgIGJmZF9wdXRfNjQgKGlucHV0X2JmZCwgdmFsLAorCQkJICBjb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9HUFZBTFVFOgorCSAgLyogSSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGlzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KKwkgIGdwID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgKyByX3N5bW5keDsKKwkgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAocmVsb2NhdGVwKQorCXsKKwkgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7CisJICBhc2VjdGlvbiAqcyA9IE5VTEw7CisJICBiZmRfdm1hIHJlbG9jYXRpb247CisJICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworCSAgLyogUGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLworCisJICBob3d0byA9ICZhbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdOworCisJICBpZiAocl9leHRlcm4pCisJICAgIHsKKwkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keF07CisJICAgICAgLyogSWYgaCBpcyBOVUxMLCB0aGF0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSByZWxvYworCQkgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgd2hpY2ggd2UgdGhvdWdodCB3YXMganVzdAorCQkgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gICovCisJICAgICAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkJYWJvcnQgKCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChyX3N5bW5keCA+PSBOVU1fUkVMT0NfU0VDVElPTlMpCisJCXMgPSBOVUxMOworCSAgICAgIGVsc2UKKwkJcyA9IHN5bW5keF90b19zZWN0aW9uW3Jfc3ltbmR4XTsKKworCSAgICAgIGlmIChzID09IChhc2VjdGlvbiAqKSBOVUxMKQorCQlhYm9ydCAoKTsKKwkgICAgfQorCisJICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgLyogV2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIG11c3QKKwkJIGNvbnZlcnQgdGhlIGV4aXN0aW5nIHJlbG9jLiAgKi8KKwkgICAgICBpZiAocl9leHRlcm4pCisJCXsKKwkJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisJCSAgICAgICYmIGgtPmluZHggPT0gLTEpCisJCSAgICB7CisJCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gICovCisJCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKKwkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJCSAgICAgIGlucHV0X3NlY3Rpb24sIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgIH0KKworCQkgIHJlbG9jYXRpb24gPSBhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jIChvdXRwdXRfYmZkLAorCQkJCQkJCSAgICAgaW5mbywKKwkJCQkJCQkgICAgIGlucHV0X2JmZCwKKwkJCQkJCQkgICAgIGV4dF9yZWwsCisJCQkJCQkJICAgICBoKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgQWRqdXN0CisJCSAgICAgdGhlIHZhbHVlIGJ5IHRoZSBhbW91bnQgdGhlIHNlY3Rpb24gbW92ZWQuICAqLworCQkgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSsgcy0+b3V0cHV0X29mZnNldAorCQkJCS0gcy0+dm1hKTsKKwkJfQorCisJICAgICAgLyogSWYgdGhpcyBpcyBQQyByZWxhdGl2ZSwgdGhlIGV4aXN0aW5nIG9iamVjdCBmaWxlCisJCSBhcHBlYXJzIHRvIGFscmVhZHkgaGF2ZSB0aGUgcmVsb2Mgd29ya2VkIG91dC4gIFdlCisJCSBtdXN0IHN1YnRyYWN0IG91dCB0aGUgb2xkIHZhbHVlIGFuZCBhZGQgaW4gdGhlIG5ldworCQkgb25lLiAgKi8KKwkgICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorCQlyZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCisJICAgICAgLyogUHV0IGluIGFueSBhZGRlbmQuICAqLworCSAgICAgIHJlbG9jYXRpb24gKz0gYWRkZW5kOworCisJICAgICAgLyogQWRqdXN0IHRoZSBjb250ZW50cy4gICovCisJICAgICAgciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCisJCQkJCSAgKGNvbnRlbnRzCisJCQkJCSAgICsgcl92YWRkcgorCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSBhcmUgcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCisJICAgICAgaWYgKHJfZXh0ZXJuKQorCQl7CisJCSAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wuICAqLworCQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJCSAgICB7CisJCSAgICAgIGFzZWN0aW9uICpoc2VjOworCisJCSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJCSAgICArIGhzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgICAgKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJCSAgICAgIGlucHV0X3NlY3Rpb24sCisJCQkgICAgICByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIHJlbG9jYXRpb24gPSAwOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KKwkJICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkrIHMtPm91dHB1dF9vZmZzZXQKKwkJCQktIHMtPnZtYSk7CisKKwkJICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZQorCQkgICAgIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgc291cmNlIHNlY3Rpb24uICAqLworCQkgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCisJCSAgICByZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKKwkJfQorCisJICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCisJCQkJCSAgICBpbnB1dF9iZmQsCisJCQkJCSAgICBpbnB1dF9zZWN0aW9uLAorCQkJCQkgICAgY29udGVudHMsCisJCQkJCSAgICByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAorCQkJCQkgICAgcmVsb2NhdGlvbiwKKwkJCQkJICAgIGFkZGVuZCk7CisJICAgIH0KKworCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCSAgICB7CisJICAgICAgc3dpdGNoIChyKQorCQl7CisJCWRlZmF1bHQ6CisJCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJCSAgYWJvcnQgKCk7CisJCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCQkgIHsKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJICAgIGlmIChyX2V4dGVybikKKwkJICAgICAgbmFtZSA9IHN5bV9oYXNoZXNbcl9zeW1uZHhdLT5yb290LnJvb3Quc3RyaW5nOworCQkgICAgZWxzZQorCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAorCQkJCQkgICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bcl9zeW1uZHhdKTsKKwkJICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCQkgICAoaW5mbywgbmFtZSwgYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLAorCQkJICAgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkgICAgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgfQorCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgJiYgYWRqdXN0X2FkZHJwKQorCXsKKwkgIC8qIENoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCisJICBiZmRfaF9wdXRfNjQgKGlucHV0X2JmZCwKKwkJCShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgLSBpbnB1dF9zZWN0aW9uLT52bWEKKwkJCSArIHJfdmFkZHIpLAorCQkJKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOworCX0KKworICAgICAgaWYgKGdwX3VzZWRwICYmIGdwX3VuZGVmaW5lZCkKKwl7CisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKKwkJIChpbmZvLCBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKKwkJICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KKwkgIGdwID0gNDsKKwkgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7CisJICBncF91bmRlZmluZWQgPSBmYWxzZTsKKwl9CisgICAgfQorCisgIGlmICh0b3MgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIHRoZSBmaWxlaGRyIGFuZCB0aGUgYW91dGhkci4gIFRoaXMgcm91dGluZQorICAgc2V0cyB0aGUgZHluYW1pYyBiaXRzIGluIHRoZSBmaWxlIGhlYWRlci4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK2FscGhhX2FkanVzdF9oZWFkZXJzIChhYmZkLCBmaGRyLCBhaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaGRyOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYWhkcjsKK3sKKyAgaWYgKChhYmZkLT5mbGFncyAmIChEWU5BTUlDIHwgRVhFQ19QKSkgPT0gKERZTkFNSUMgfCBFWEVDX1ApKQorICAgIGZoZHItPmZfZmxhZ3MgfD0gRl9BTFBIQV9DQUxMX1NIQVJFRDsKKyAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKyAgICBmaGRyLT5mX2ZsYWdzIHw9IEZfQUxQSEFfU0hBUkFCTEU7CisgIHJldHVybiB0cnVlOworfQorDAorLyogQXJjaGl2ZSBoYW5kbGluZy4gIEluIE9TRi8xIChvciBEaWdpdGFsIFVuaXgpIHYzLjIsIERpZ2l0YWwKKyAgIGludHJvZHVjZWQgYXJjaGl2ZSBwYWNraW5nLCBpbiB3aGljaCB0aGUgZWxlbWVudHMgaW4gYW4gYXJjaGl2ZSBhcmUKKyAgIG9wdGlvbmFsbHkgY29tcHJlc3NlZCB1c2luZyBhIHNpbXBsZSBkaWN0aW9uYXJ5IHNjaGVtZS4gIFdlIGtub3cKKyAgIGhvdyB0byByZWFkIHN1Y2ggYXJjaGl2ZXMsIGJ1dCB3ZSBkb24ndCB3cml0ZSB0aGVtLiAgKi8KKworI2RlZmluZSBhbHBoYV9lY29mZl9zbHVycF9hcm1hcCBfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwCisjZGVmaW5lIGFscGhhX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAorICBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKKyNkZWZpbmUgYWxwaGFfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorICBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisjZGVmaW5lIGFscGhhX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZQorI2RlZmluZSBhbHBoYV9lY29mZl93cml0ZV9hcm1hcCBfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwCisjZGVmaW5lIGFscGhhX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBfYmZkX2Vjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAorI2RlZmluZSBhbHBoYV9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIF9iZmRfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAorCisvKiBBIGNvbXByZXNzZWQgZmlsZSB1c2VzIHRoaXMgaW5zdGVhZCBvZiBBUkZNQUcuICAqLworCisjZGVmaW5lIEFSRlpNQUcgIlpcMDEyIgorCisvKiBSZWFkIGFuIGFyY2hpdmUgaGVhZGVyLiAgVGhpcyBpcyBsaWtlIHRoZSBzdGFuZGFyZCByb3V0aW5lLCBidXQgaXQKKyAgIGFsc28gYWNjZXB0cyBBUkZaTUFHLiAgKi8KKworc3RhdGljIFBUUgorYWxwaGFfZWNvZmZfcmVhZF9hcl9oZHIgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGFyZWx0ZGF0YSAqcmV0OworICBzdHJ1Y3QgYXJfaGRyICpoOworCisgIHJldCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIEFSRlpNQUcpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaCA9IChzdHJ1Y3QgYXJfaGRyICopIHJldC0+YXJjaF9oZWFkZXI7CisgIGlmIChzdHJuY21wIChoLT5hcl9mbWFnLCBBUkZaTUFHLCAyKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9ieXRlIGFiWzhdOworCisgICAgICAvKiBUaGlzIGlzIGEgY29tcHJlc3NlZCBmaWxlLiAgV2UgbXVzdCBzZXQgdGhlIHNpemUgY29ycmVjdGx5LgorICAgICAgICAgVGhlIHNpemUgaXMgdGhlIGVpZ2h0IGJ5dGVzIGFmdGVyIHRoZSBkdW1teSBmaWxlIGhlYWRlci4gICovCisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIEZJTEhTWiwgU0VFS19DVVIpICE9IDAKKwkgIHx8IGJmZF9yZWFkIChhYiwgMSwgOCwgYWJmZCkgIT0gOAorCSAgfHwgYmZkX3NlZWsgKGFiZmQsIC0gKEZJTEhTWiArIDgpLCBTRUVLX0NVUikgIT0gMCkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgcmV0LT5wYXJzZWRfc2l6ZSA9IGJmZF9oX2dldF82NCAoYWJmZCwgYWIpOworICAgIH0KKworICByZXR1cm4gKFBUUikgcmV0OworfQorCisvKiBHZXQgYW4gYXJjaGl2ZSBlbGVtZW50IGF0IGEgc3BlY2lmaWVkIGZpbGUgcG9zaXRpb24uICBUaGlzIGlzIHdoZXJlCisgICB3ZSB1bmNvbXByZXNzIHRoZSBhcmNoaXZlIGVsZW1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KKworc3RhdGljIGJmZCAqCithbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVwb3MpCisgICAgIGJmZCAqYXJjaGl2ZTsKKyAgICAgZmlsZV9wdHIgZmlsZXBvczsKK3sKKyAgYmZkICpuYmZkID0gTlVMTDsKKyAgc3RydWN0IGFyZWx0ZGF0YSAqdGRhdGE7CisgIHN0cnVjdCBhcl9oZHIgKmhkcjsKKyAgYmZkX2J5dGUgYWJbOF07CisgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgYmZkX2J5dGUgKmJ1ZiwgKnA7CisgIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW07CisKKyAgbmJmZCA9IF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlcG9zKTsKKyAgaWYgKG5iZmQgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoKG5iZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgZXhwYW5kZWQgdGhpcyBCRkQuICAqLworICAgICAgcmV0dXJuIG5iZmQ7CisgICAgfQorCisgIHRkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgbmJmZC0+YXJlbHRfZGF0YTsKKyAgaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgdGRhdGEtPmFyY2hfaGVhZGVyOworICBpZiAoc3RybmNtcCAoaGRyLT5hcl9mbWFnLCBBUkZaTUFHLCAyKSAhPSAwKQorICAgIHJldHVybiBuYmZkOworCisgIC8qIFdlIG11c3QgdW5jb21wcmVzcyB0aGlzIGVsZW1lbnQuICBXZSBkbyB0aGlzIGJ5IGNvcHlpbmcgaXQgaW50byBhCisgICAgIG1lbW9yeSBidWZmZXIsIGFuZCBtYWtpbmcgYmZkX3JlYWQgYW5kIGJmZF9zZWVrIHVzZSB0aGF0IGJ1ZmZlci4KKyAgICAgVGhpcyBjYW4gdXNlIGEgbG90IG9mIG1lbW9yeSwgYnV0IGl0J3Mgc2ltcGxlciB0aGFuIGdldHRpbmcgYQorICAgICB0ZW1wb3JhcnkgZmlsZSwgbWFraW5nIHRoYXQgd29yayB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgY2FjaGluZworICAgICBjb2RlLCBhbmQgbWFraW5nIHN1cmUgdGhhdCBpdCBpcyBkZWxldGVkIGF0IGFsbCBhcHByb3ByaWF0ZQorICAgICB0aW1lcy4gIEl0IGNhbiBiZSBjaGFuZ2VkIGlmIGl0IGV2ZXIgYmVjb21lcyBpbXBvcnRhbnQuICAqLworCisgIC8qIFRoZSBjb21wcmVzc2VkIGZpbGUgc3RhcnRzIHdpdGggYSBkdW1teSBFQ09GRiBmaWxlIGhlYWRlci4gICovCisgIGlmIChiZmRfc2VlayAobmJmZCwgRklMSFNaLCBTRUVLX1NFVCkgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgbmV4dCBlaWdodCBieXRlcyBhcmUgdGhlIHJlYWwgZmlsZSBzaXplLiAgKi8KKyAgaWYgKGJmZF9yZWFkIChhYiwgMSwgOCwgbmJmZCkgIT0gOCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgc2l6ZSA9IGJmZF9oX2dldF82NCAobmJmZCwgYWIpOworCisgIGlmIChzaXplID09IDApCisgICAgYnVmID0gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgbGVmdDsKKyAgICAgIGJmZF9ieXRlIGRpY3RbNDA5Nl07CisgICAgICB1bnNpZ25lZCBpbnQgaDsKKyAgICAgIGJmZF9ieXRlIGI7CisKKyAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG5iZmQsIHNpemUpOworICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgcCA9IGJ1ZjsKKworICAgICAgbGVmdCA9IHNpemU7CisKKyAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBuZXh0IGVpZ2h0IGJ5dGVzIGFyZSBmb3IuICovCisgICAgICBpZiAoYmZkX3JlYWQgKGFiLCAxLCA4LCBuYmZkKSAhPSA4KQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICAvKiBUaGlzIGlzIHRoZSB1bmNvbXByZXNzaW9uIGFsZ29yaXRobS4gIEl0J3MgYSBzaW1wbGUKKwkgZGljdGlvbmFyeSBiYXNlZCBzY2hlbWUgaW4gd2hpY2ggZWFjaCBjaGFyYWN0ZXIgaXMgcHJlZGljdGVkCisJIGJ5IGEgaGFzaCBvZiB0aGUgcHJldmlvdXMgdGhyZWUgY2hhcmFjdGVycy4gIEEgY29udHJvbCBieXRlCisJIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgcHJlZGljdGVkIG9yIHdoZXRoZXIgaXQKKwkgYXBwZWFycyBpbiB0aGUgaW5wdXQgc3RyZWFtOyBlYWNoIGNvbnRyb2wgYnl0ZSBtYW5hZ2VzIHRoZQorCSBuZXh0IGVpZ2h0IGJ5dGVzIGluIHRoZSBvdXRwdXQgc3RyZWFtLiAgKi8KKyAgICAgIG1lbXNldCAoZGljdCwgMCwgc2l6ZW9mIGRpY3QpOworICAgICAgaCA9IDA7CisgICAgICB3aGlsZSAoYmZkX3JlYWQgKCZiLCAxLCAxLCBuYmZkKSA9PSAxKQorCXsKKwkgIHVuc2lnbmVkIGludCBpOworCisJICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBiID4+PSAxKQorCSAgICB7CisJICAgICAgYmZkX2J5dGUgbjsKKworCSAgICAgIGlmICgoYiAmIDEpID09IDApCisJCW4gPSBkaWN0W2hdOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICghIGJmZF9yZWFkICgmbiwgMSwgMSwgbmJmZCkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBkaWN0W2hdID0gbjsKKwkJfQorCisJICAgICAgKnArKyA9IG47CisKKwkgICAgICAtLWxlZnQ7CisJICAgICAgaWYgKGxlZnQgPT0gMCkKKwkJYnJlYWs7CisKKwkgICAgICBoIDw8PSA0OworCSAgICAgIGggXj0gbjsKKwkgICAgICBoICY9IHNpemVvZiBkaWN0IC0gMTsKKwkgICAgfQorCisJICBpZiAobGVmdCA9PSAwKQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIE5vdyB0aGUgdW5jb21wcmVzc2VkIGZpbGUgY29udGVudHMgYXJlIGluIGJ1Zi4gICovCisgIGJpbSA9ICgoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikKKwkgYmZkX2FsbG9jIChuYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfaW5fbWVtb3J5KSkpOworICBpZiAoYmltID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGJpbS0+c2l6ZSA9IHNpemU7CisgIGJpbS0+YnVmZmVyID0gYnVmOworCisgIG5iZmQtPm10aW1lX3NldCA9IHRydWU7CisgIG5iZmQtPm10aW1lID0gc3RydG9sIChoZHItPmFyX2RhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7CisKKyAgbmJmZC0+ZmxhZ3MgfD0gQkZEX0lOX01FTU9SWTsKKyAgbmJmZC0+aW9zdHJlYW0gPSAoUFRSKSBiaW07CisgIEJGRF9BU1NFUlQgKCEgbmJmZC0+Y2FjaGVhYmxlKTsKKworICByZXR1cm4gbmJmZDsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKG5iZmQgIT0gTlVMTCkKKyAgICBiZmRfY2xvc2UgKG5iZmQpOworICByZXR1cm4gTlVMTDsgIAorfQorCisvKiBPcGVuIHRoZSBuZXh0IGFyY2hpdmVkIGZpbGUuICAqLworCitzdGF0aWMgYmZkICoKK2FscGhhX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQorICAgICBiZmQgKmFyY2hpdmU7CisgICAgIGJmZCAqbGFzdF9maWxlOworeworICBmaWxlX3B0ciBmaWxlc3RhcnQ7CisKKyAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMKQorICAgIGZpbGVzdGFydCA9IGJmZF9hcmRhdGEgKGFyY2hpdmUpLT5maXJzdF9maWxlX2ZpbGVwb3M7CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgYXJlbHRkYXRhICp0OworICAgICAgc3RydWN0IGFyX2hkciAqaDsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworICAgICAgLyogV2UgY2FuJ3QgdXNlIGFyZWx0X3NpemUgaGVyZSwgYmVjYXVzZSB0aGF0IHVzZXMgcGFyc2VkX3NpemUsCisgICAgICAgICB3aGljaCBpcyB0aGUgdW5jb21wcmVzc2VkIHNpemUuICBXZSBuZWVkIHRoZSBjb21wcmVzc2VkIHNpemUuICAqLworICAgICAgdCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGxhc3RfZmlsZS0+YXJlbHRfZGF0YTsKKyAgICAgIGggPSAoc3RydWN0IGFyX2hkciAqKSB0LT5hcmNoX2hlYWRlcjsKKyAgICAgIHNpemUgPSBzdHJ0b2wgKGgtPmFyX3NpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7CisKKyAgICAgIC8qIFBhZCB0byBhbiBldmVuIGJvdW5kYXJ5Li4uCisJIE5vdGUgdGhhdCBsYXN0X2ZpbGUtPm9yaWdpbiBjYW4gYmUgb2RkIGluIHRoZSBjYXNlIG9mCisJIEJTRC00LjQtc3R5bGUgZWxlbWVudCB3aXRoIGEgbG9uZyBvZGQgc2l6ZS4gKi8KKyAgICAgIGZpbGVzdGFydCA9IGxhc3RfZmlsZS0+b3JpZ2luICsgc2l6ZTsKKyAgICAgIGZpbGVzdGFydCArPSBmaWxlc3RhcnQgJSAyOworICAgIH0KKworICByZXR1cm4gYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhcmNoaXZlLCBmaWxlc3RhcnQpOworfQorCisvKiBPcGVuIHRoZSBhcmNoaXZlIGZpbGUgZ2l2ZW4gYW4gaW5kZXggaW50byB0aGUgYXJtYXAuICAqLworCitzdGF0aWMgYmZkICoKK2FscGhhX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGluZGV4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN5bWluZGV4IGluZGV4OworeworICBjYXJzeW0gKmVudHJ5OworCisgIGVudHJ5ID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBpbmRleDsKKyAgcmV0dXJuIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgZW50cnktPmZpbGVfb2Zmc2V0KTsKK30KKwwKKy8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCisgICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhID0KK3sKKyAgLyogQ09GRiBiYWNrZW5kIHN0cnVjdHVyZS4gICovCisgIHsKKyAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLGludCxpbnQsaW50LGludCxQVFIpKSkgYmZkX3ZvaWQsIC8qIGF1eF9pbiAqLworICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBzeW1faW4gKi8KKyAgICAodm9pZCAoKikgUEFSQU1TICgoYmZkICosUFRSLFBUUikpKSBiZmRfdm9pZCwgLyogbGluZW5vX2luICovCisgICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKWJmZF92b2lkLC8qYXV4X291dCovCisgICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBzeW1fb3V0ICovCisgICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9fb3V0ICovCisgICAgKHVuc2lnbmVkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiByZWxvY19vdXQgKi8KKyAgICBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAorICAgIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX291dCwKKyAgICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCAwLCAwLCAwLCAwLCB0cnVlLCBmYWxzZSwgNCwKKyAgICBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbiwKKyAgICBhbHBoYV9lY29mZl9zd2FwX3Njbmhkcl9pbiwgTlVMTCwKKyAgICBhbHBoYV9lY29mZl9iYWRfZm9ybWF0X2hvb2ssIF9iZmRfZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLAorICAgIGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2ssIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MsCisgICAgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKKyAgfSwKKyAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCisgIGJmZF9hcmNoX2FscGhhLAorICAvKiBJbml0aWFsIHBvcnRpb24gb2YgYXJtYXAgc3RyaW5nLiAgKi8KKyAgIl9fX19fX19fNjQiLAorICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCisgICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCisgIDB4MjAwMCwKKyAgLyogVHJ1ZSBpZiB0aGUgLnJkYXRhIHNlY3Rpb24gaXMgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LCBhcyBvbiB0aGUKKyAgICAgQWxwaGEuICBGYWxzZSBpZiAucmRhdGEgaXMgcGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LCBhcyBvbiB0aGUKKyAgICAgTUlQUy4gICovCisgIHRydWUsCisgIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCisgIDY0LAorICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLworICAmYWxwaGFfaG93dG9fdGFibGVbQUxQSEFfUl9SRUZRVUFEXSwKKyAgeworICAgIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLworICAgIG1hZ2ljU3ltMiwKKyAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCisgICAgOCwKKyAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCisgICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCisgICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgICAgZWNvZmZfc3dhcF9oZHJfaW4sCisgICAgZWNvZmZfc3dhcF9kbnJfaW4sCisgICAgZWNvZmZfc3dhcF9wZHJfaW4sCisgICAgZWNvZmZfc3dhcF9zeW1faW4sCisgICAgZWNvZmZfc3dhcF9vcHRfaW4sCisgICAgZWNvZmZfc3dhcF9mZHJfaW4sCisgICAgZWNvZmZfc3dhcF9yZmRfaW4sCisgICAgZWNvZmZfc3dhcF9leHRfaW4sCisgICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKKyAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKKyAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgICAgZWNvZmZfc3dhcF9oZHJfb3V0LAorICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKKyAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCisgICAgZWNvZmZfc3dhcF9zeW1fb3V0LAorICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKKyAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCisgICAgZWNvZmZfc3dhcF9yZmRfb3V0LAorICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKKyAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKKyAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCisgICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KKyAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KKyAgfSwKKyAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCisgIFJFTFNaLAorICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLworICBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX2luLAorICBhbHBoYV9lY29mZl9zd2FwX3JlbG9jX291dCwKKyAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCisgIGFscGhhX2FkanVzdF9yZWxvY19pbiwKKyAgYWxwaGFfYWRqdXN0X3JlbG9jX291dCwKKyAgLyogUmVsb2NhdGUgc2VjdGlvbiBjb250ZW50cyB3aGlsZSBsaW5raW5nLiAgKi8KKyAgYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiwKKyAgLyogRG8gZmluYWwgYWRqdXN0bWVudHMgdG8gZmlsZWhkciBhbmQgYW91dGhkci4gICovCisgIGFscGhhX2FkanVzdF9oZWFkZXJzLAorICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCisgIGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcworfTsKKworLyogTG9va2luZyB1cCBhIHJlbG9jIHR5cGUgaXMgQWxwaGEgc3BlY2lmaWMuICAqLworI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKworLyogU28gaXMgZ2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cy4gICovCisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworCisvKiBIYW5kbGluZyBmaWxlIHdpbmRvd3MgaXMgZ2VuZXJpYy4gICovCisjZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworCisvKiBSZWxheGluZyBzZWN0aW9ucyBpcyBnZW5lcmljLiAgKi8KKyNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisKK2NvbnN0IGJmZF90YXJnZXQgZWNvZmZhbHBoYV9saXR0bGVfdmVjID0KK3sKKyAgImVjb2ZmLWxpdHRsZWFscGhhIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgYWxwaGFfZWNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl9ta29iamVjdCwgIC8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2Vjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChhbHBoYV9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgJmFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YQorfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWFwb2xsby5jIGIvYmZkL2NvZmYtYXBvbGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZWM4OQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLWFwb2xsby5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEFwb2xsbyA2ODAwMCBDT0ZGIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIEJ5IFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKKyAgIEJhc2VkIG9uIG02OGsgc3RhbmRhcmQgQ09GRiB2ZXJzaW9uIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImNvZmYvYXBvbGxvLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCisKKyNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCitleHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW107CisjZWxzZQorcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW10gPSAKK3sKKyAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKK307CisjZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KKworI2lmbmRlZiBCQURNQUcKKyNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKKyNlbmRpZgorI2RlZmluZSBBUE9MTE9fTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCisKKy8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCisKKyNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCitleHRlcm4gdm9pZCBhcG9sbG9fcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7CitleHRlcm4gaW50IGFwb2xsb19ob3d0bzJydHlwZSBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKKyNlbHNlCit2b2lkCithcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIHJlbG9jZW50cnkpCisgICAgIGFyZWxlbnQgKmludGVybmFsOworICAgICBpbnQgcmVsb2NlbnRyeTsKK3sKKyAgc3dpdGNoIChyZWxvY2VudHJ5KSAKKyAgeworICAgY2FzZSBSX1JFTEJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKKyAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7CisgICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDI7IGJyZWFrOworICAgY2FzZSBSX1BDUkJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKKyAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7CisgICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDU7IGJyZWFrOworICAgY2FzZSBSX1JFTExPTkdfTkVHOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7CisgIH0KK30KKworaW50IAorYXBvbGxvX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Cit7CisgIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAorICB7CisgICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCisgICAgeworICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOworICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOworICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpCisgICAgIHsKKyAgICAgIGNhc2UgMzI6IHJldHVybiBSX1JFTExPTkc7CisgICAgICBjYXNlIDE2OiByZXR1cm4gUl9SRUxXT1JEOworICAgICAgY2FzZSA4OiByZXR1cm4gUl9SRUxCWVRFOworICAgICB9CisgIH0KKyAgcmV0dXJuIFJfUkVMTE9ORzsgICAgCit9CisjZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KKworI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAorICBhcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIChyZWxvY2VudHJ5KS0+cl90eXBlKQorCisjZGVmaW5lIFNFTEVDVF9SRUxPQyhleHRlcm5hbCwgaW50ZXJuYWwpIFwKKyAgZXh0ZXJuYWwucl90eXBlID0gYXBvbGxvX2hvd3RvMnJ0eXBlKGludGVybmFsKTsKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKK2NvbnN0IGJmZF90YXJnZXQgCisjaWZkZWYgVEFSR0VUX1NZTQorICBUQVJHRVRfU1lNID0KKyNlbHNlCisgIGFwb2xsb2NvZmZfdmVjID0KKyNlbmRpZgoreworI2lmZGVmIFRBUkdFVF9OQU1FCisgIFRBUkdFVF9OQU1FLAorI2Vsc2UKKyAgImFwb2xsby1tNjhrIiwJCQkvKiBuYW1lICovCisjZW5kaWYKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisjaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCisgICdfJywKKyNlbHNlCisgIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworI2VuZGlmCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworCisge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgYmZkX2ZhbHNlfSwKKyB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUKKyB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXJtLmMgYi9iZmQvY29mZi1hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc4Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtYXJtLmMKQEAgLTAsMCArMSwyNTU3IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBDT0ZGIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaW5jbHVkZSAiY29mZi9hcm0uaCIKKworI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKworI2lmZGVmIENPRkZfV0lUSF9QRQorI2luY2x1ZGUgImNvZmYvcGUuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibGliY29mZi5oIgorCisvKiBNYWNyb3MgZm9yIG1hbmlwdWxhdGlvbiB0aGUgYml0cyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgdGhlIGNvZmYgZGF0YQorICAgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgQVBDU18yNl9GTEFHKCAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9BUENTXzI2KQorI2RlZmluZSBBUENTX0ZMT0FUX0ZMQUcoICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0FQQ1NfRkxPQVQpCisjZGVmaW5lIFBJQ19GTEFHKCAgICAgICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfUElDKQorI2RlZmluZSBBUENTX1NFVCggICAgICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0FQQ1NfU0VUKQorI2RlZmluZSBTRVRfQVBDU19GTEFHUyggICAgIGFiZmQsIGZsZ3MpCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyA9IFwKKwkJCQkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgfiAoRl9BUENTXzI2IHwgRl9BUENTX0ZMT0FUIHwgRl9QSUMpKSBcCisJCQkJCSB8IChmbGdzIHwgRl9BUENTX1NFVCkpCisjZGVmaW5lIElOVEVSV09SS19GTEFHKCAgICAgYWJmZCApIAkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0lOVEVSV09SSykKKyNkZWZpbmUgSU5URVJXT1JLX1NFVCggICAgICBhYmZkICkgCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfSU5URVJXT1JLX1NFVCkKKyNkZWZpbmUgU0VUX0lOVEVSV09SS19GTEFHKCBhYmZkLCBmbGcgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgPSBcCisJCQkJCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIH4gRl9JTlRFUldPUkspIFwKKwkJCQkJIHwgKGZsZyB8IEZfSU5URVJXT1JLX1NFVCkpCisgICAgIAordHlwZWRlZiBlbnVtIHtidW5rbm93biwgYjksIGIxMiwgYjIzfSB0aHVtYl9wY3JlbF9icmFuY2h0eXBlOworLyogc29tZSB0eXBlZGVmcyBmb3IgaG9sZGluZyBpbnN0cnVjdGlvbnMgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgaW5zbjMyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgaW5zbjE2OworCisKKyAgICAgLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHN0dXBpZCBjb21waWxlcnMuICAqLworc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisgICAgICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGFvdXRhcm1fZml4X3BjcmVsXzI2X2RvbmUKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGFvdXRhcm1fZml4X3BjcmVsXzI2CisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX3RodW1iX3BjcmVsXzIzCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX3RodW1iX3BjcmVsXzEyCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX3RodW1iX3BjcmVsXzkKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfYXJtX3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fYWRqdXN0X3N5bW5keAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosCisJICAgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCWJvb2xlYW4gKikpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBjb2ZmX2FybV9ydHlwZV90b19ob3d0byAKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAorCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGJmZF92bWEgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbgorICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiosCisJICAgdGh1bWJfcGNyZWxfYnJhbmNodHlwZSkpOworc3RhdGljIENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKiBjb2ZmX2FybV9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgaW5zbjMyIGluc2VydF90aHVtYl9icmFuY2gKKyAgUEFSQU1TICgoaW5zbjMyLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiBmaW5kX3RodW1iX2dsdWUKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOworc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGZpbmRfYXJtX2dsdWUKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOworc3RhdGljIHZvaWQgcmVjb3JkX2FybV90b190aHVtYl9nbHVlCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgdm9pZCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCisgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIF9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKKyAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfYXJtX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICopKTsKKworLyogVGhlIGxpbmtlciBzY3JpcHQga25vd3MgdGhlIHNlY3Rpb24gbmFtZXMgZm9yIHBsYWNlbWVudC4KKyAgIFRoZSBlbnRyeV9uYW1lcyBhcmUgdXNlZCB0byBkbyBzaW1wbGUgbmFtZSBtYW5nbGluZyBvbiB0aGUgc3R1YnMuCisgICBHaXZlbiBhIGZ1bmN0aW9uIG5hbWUsIGFuZCBpdHMgdHlwZSwgdGhlIHN0dWIgY2FuIGJlIGZvdW5kLiBUaGUKKyAgIG5hbWUgY2FuIGJlIGNoYW5nZWQuIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoZSAlcyBiZSBwcmVzZW50LgorICAgKi8KKyAgIAorI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUgIi5nbHVlXzd0IgorI2RlZmluZSBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FICAgIl9fJXNfZnJvbV90aHVtYiIKKworI2RlZmluZSBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUgIi5nbHVlXzciCisjZGVmaW5lIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX2FybSIKKworLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorY29mZl9hcm1fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCisJCSBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgc3ltdmFsdWUgZGlmZjsKKyAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisKKyAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisKKyNkZWZpbmUgRE9JVCh4KSBcCisgIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgZGlmZikgJiBob3d0by0+ZHN0X21hc2spKQorCisgICAgaWYgKGRpZmYgIT0gMCkKKyAgICAgIHsKKwlyZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKKwl1bnNpZ25lZCBjaGFyICphZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOworCisJc3dpdGNoIChob3d0by0+c2l6ZSkKKwkgIHsKKwkgIGNhc2UgMDoKKwkgICAgeworCSAgICAgIGNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgYWRkcik7CisJICAgICAgRE9JVCAoeCk7CisJICAgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAxOgorCSAgICB7CisJICAgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOworCSAgICAgIERPSVQgKHgpOworCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGFkZHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIDI6CisJICAgIHsKKwkgICAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKKwkgICAgICBET0lUICh4KTsKKwkgICAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgYWJvcnQgKCk7CisJICB9CisgICAgICB9CisKKyAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KKyAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKK30KKworLyogSWYgVVNFUl9MQUJFTF9QUkVGSVggaXMgZGVmaW5lZCBhcyAiXyIgKHNlZSBjb2ZmX2FybV9pc19sb2NhbF9sYWJlbF9uYW1lKCkKKyAgIGluIHRoaXMgZmlsZSksIHRoZW4gVEFSR0VUX1VOREVSU0NPUkUgc2hvdWxkIGJlIGRlZmluZWQsIG90aGVyd2lzZSBpdAorICAgc2hvdWxkIG5vdC4gICovCisjaWZuZGVmIFRBUkdFVF9VTkRFUlNDT1JFCisjZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICdfJworI2VuZGlmCisKKyNpZm5kZWYgUENSRUxPRkZTRVQKKyNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQorI2VuZGlmCisKKy8qIFRoZXNlIG1vc3QgY2VydGFpbmx5IGJlbG9uZyBzb21ld2hlcmUgZWxzZS4gSnVzdCBoYWQgdG8gZ2V0IHJpZCBvZgorICAgdGhlIG1hbmlmZXN0IGNvbnN0YW50cyBpbiB0aGUgY29kZS4gKi8KKworI2RlZmluZSBBUk1fOCAgICAgICAgMAorI2RlZmluZSBBUk1fMTYgICAgICAgMQorI2RlZmluZSBBUk1fMzIgICAgICAgMgorI2RlZmluZSBBUk1fMjYgICAgICAgMworI2RlZmluZSBBUk1fRElTUDggICAgNAorI2RlZmluZSBBUk1fRElTUDE2ICAgNQorI2RlZmluZSBBUk1fRElTUDMyICAgNgorI2RlZmluZSBBUk1fMjZEICAgICAgNworLyogOCBpcyB1bnVzZWQgKi8KKyNkZWZpbmUgQVJNX05FRzE2ICAgIDkKKyNkZWZpbmUgQVJNX05FRzMyICAgMTAKKyNkZWZpbmUgQVJNX1JWQTMyICAgMTEKKyNkZWZpbmUgQVJNX1RIVU1COSAgMTIKKyNkZWZpbmUgQVJNX1RIVU1CMTIgMTMKKyNkZWZpbmUgQVJNX1RIVU1CMjMgMTQKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYW91dGFybV9zdGRfcmVsb2NfaG93dG9bXSA9IAoreworICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCisgIEhPV1RPKEFSTV84LAkJCS8qIHR5cGUgKi8KKwkwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkwLAkJCS8qIHNpemUgKi8KKwk4LAkJCS8qIGJpdHNpemUgKi8KKwlmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCTAsCQkJLyogYml0cG9zICovCisJY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJY29mZl9hcm1fcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJIkFSTV84IiwJCS8qIG5hbWUgKi8KKyAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KKwkweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KKwlQQ1JFTE9GRlNFVAkJLyogcGNyZWxfb2Zmc2V0ICovKSwKKyAgSE9XVE8oQVJNXzE2LCAgCisJMCwgCisJMSwgCisJMTYsIAorCWZhbHNlLAorCTAsCisJY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJY29mZl9hcm1fcmVsb2MsCisJIkFSTV8xNiIsIAorCXRydWUsCisJMHgwMDAwZmZmZiwKKwkweDAwMDBmZmZmLCAKKwlQQ1JFTE9GRlNFVCksCisgIEhPV1RPKEFSTV8zMiwgCisJMCwKKwkyLCAKKwkzMiwKKwlmYWxzZSwKKwkwLAorCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCWNvZmZfYXJtX3JlbG9jLAorCSJBUk1fMzIiLAorICAgICAgICB0cnVlLAorCTB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwKKwlQQ1JFTE9GRlNFVCksCisgIEhPV1RPKEFSTV8yNiwKKwkyLAorCTIsCisJMjQsCisJdHJ1ZSwKKwkwLAorCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKKwlhb3V0YXJtX2ZpeF9wY3JlbF8yNiAsCisJIkFSTV8yNiIsCisJZmFsc2UsCisJMHgwMGZmZmZmZiwKKwkweDAwZmZmZmZmLCAKKwlQQ1JFTE9GRlNFVCksCisgIEhPV1RPKEFSTV9ESVNQOCwgICAgICAgIAorCTAsCisJMCwKKwk4LCAKKwl0cnVlLAorCTAsCisJY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAKKwljb2ZmX2FybV9yZWxvYywKKwkiQVJNX0RJU1A4IiwgIAorCXRydWUsCisJMHgwMDAwMDBmZiwKKwkweDAwMDAwMGZmLAorCXRydWUpLAorICBIT1dUTyggQVJNX0RJU1AxNiwgCisJMCwKKwkxLAorCTE2LAorCXRydWUsCisJMCwKKwljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIAorCWNvZmZfYXJtX3JlbG9jLAorCSJBUk1fRElTUDE2IiwKKwl0cnVlLAorCTB4MDAwMGZmZmYsCisJMHgwMDAwZmZmZiwKKwl0cnVlKSwKKyAgSE9XVE8oIEFSTV9ESVNQMzIsCisJMCwKKwkyLAorCTMyLAorCXRydWUsCisJMCwKKwljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIAorIAljb2ZmX2FybV9yZWxvYywKKwkiQVJNX0RJU1AzMiIsCisJdHJ1ZSwKKwkweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsCisJdHJ1ZSksCisgIEhPV1RPKCBBUk1fMjZELCAgCisJMiwgCisJMiwKKwkyNCwKKwlmYWxzZSwKKwkwLAorCWNvbXBsYWluX292ZXJmbG93X2RvbnQsCisJYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZSwgCisJIkFSTV8yNkQiLAorCXRydWUsCisJMHgwMGZmZmZmZiwKKwkweDAsCisJZmFsc2UpLAorICAvKiA4IGlzIHVudXNlZCAqLworICB7LTF9LAorICBIT1dUTyggQVJNX05FRzE2LAorCTAsCisJLTEsCisJMTYsCisJZmFsc2UsCisJMCwgCisJY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJY29mZl9hcm1fcmVsb2MsCisJIkFSTV9ORUcxNiIsCisgICAgICAgIHRydWUsIAorCTB4MDAwMGZmZmYsCisJMHgwMDAwZmZmZiwgCisJZmFsc2UpLAorICBIT1dUTyggQVJNX05FRzMyLCAKKwkwLCAKKwktMiwKKwkzMiwKKwlmYWxzZSwKKwkwLAorCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCWNvZmZfYXJtX3JlbG9jLAorCSJBUk1fTkVHMzIiLAorICAgICAgICB0cnVlLAorCTB4ZmZmZmZmZmYsCisJMHhmZmZmZmZmZiwKKwlmYWxzZSksCisgIEhPV1RPKCBBUk1fUlZBMzIsIAorCTAsCisJMiwgCisJMzIsCisJZmFsc2UsCisJMCwKKwljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwljb2ZmX2FybV9yZWxvYywKKwkiQVJNX1JWQTMyIiwKKyAgICAgICAgdHJ1ZSwKKwkweGZmZmZmZmZmLAorCTB4ZmZmZmZmZmYsCisJUENSRUxPRkZTRVQpLAorICBIT1dUTyggQVJNX1RIVU1COSwKKwkxLAorCTEsCisJOCwKKwl0cnVlLAorCTAsCisJY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAorCWNvZmZfdGh1bWJfcGNyZWxfOSAsCisJIkFSTV9USFVNQjkiLAorCWZhbHNlLAorCTB4MDAwMDAwZmYsCisJMHgwMDAwMDBmZiwgCisJUENSRUxPRkZTRVQpLAorICBIT1dUTyggQVJNX1RIVU1CMTIsCisJMSwKKwkxLAorCTExLAorCXRydWUsCisJMCwKKwljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCisJY29mZl90aHVtYl9wY3JlbF8xMiAsCisJIkFSTV9USFVNQjEyIiwKKwlmYWxzZSwKKwkweDAwMDAwN2ZmLAorCTB4MDAwMDA3ZmYsIAorCVBDUkVMT0ZGU0VUKSwKKyAgSE9XVE8oIEFSTV9USFVNQjIzLAorCTEsCisJMiwKKwkyMiwKKwl0cnVlLAorCTAsCisJY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAorCWNvZmZfdGh1bWJfcGNyZWxfMjMgLAorCSJBUk1fVEhVTUIyMyIsCisJZmFsc2UsCisJMHgwN2ZmMDdmZiwKKwkweDA3ZmYwN2ZmLCAKKwlQQ1JFTE9GRlNFVCksCit9OworCisjaWZkZWYgQ09GRl9XSVRIX1BFCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkCisgICBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4gKi8KKworc3RhdGljIGJvb2xlYW4KK2luX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQorICAgICBiZmQgKiBhYmZkOworICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Cit7CisgIHJldHVybiAhaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IEFSTV9SVkEzMjsKK30gICAgIAorI2VuZGlmCisKKworI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAorCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIChkc3QpLT5yX3R5cGU7CisKKyNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2FybV9ydHlwZV90b19ob3d0bworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitjb2ZmX2FybV9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGJmZF92bWEgKmFkZGVuZHA7Cit7CisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworCisgIGhvd3RvID0gYW91dGFybV9zdGRfcmVsb2NfaG93dG8gKyByZWwtPnJfdHlwZTsKKworICBpZiAocmVsLT5yX3R5cGUgPT0gQVJNX1JWQTMyKQorICAgIHsKKyAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOworICAgIH0KKworICByZXR1cm4gaG93dG87CisKK30KKy8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIC8qIFRoaXMgaXMgZGVhZCBzaW1wbGUgYXQgcHJlc2VudC4gICovCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKy8qIFVzZWQgYnkgdGhlIGFzc2VtYmxlci4gKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorYW91dGFybV9maXhfcGNyZWxfMjYgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisgIGxvbmcgdGFyZ2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7CisgIAorICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLworICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCisgICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2NfY29udGludWUgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisgIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAorICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KKyAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCisgICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisKKyAgcmVsb2NhdGlvbiA9ICh0YXJnZXQgJiAweDAwZmZmZmZmKSA8PCAyOworICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gXiAweDAyMDAwMDAwKSAtIDB4MDIwMDAwMDA7IC8qIFNpZ24gZXh0ZW5kICovCisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT52YWx1ZTsKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisgIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICByZWxvY2F0aW9uIC09IGFkZHI7CisgIAorICBpZiAocmVsb2NhdGlvbiAmIDMpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQorICAgIHsKKyAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCisJZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICB9CisgIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKKyAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCisgIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKKyAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgorICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCisgIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZhb3V0YXJtX3N0ZF9yZWxvY19ob3d0b1tBUk1fMjZEXTsKKworICByZXR1cm4gZmxhZzsKK30KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYnR5cGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworICAgICB0aHVtYl9wY3JlbF9icmFuY2h0eXBlIGJ0eXBlOworeworICBiZmRfdm1hIHJlbG9jYXRpb24gPSAwOworICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKKyAgYmZkX3ZtYSBkc3Rtc2s7CisgIGJmZF92bWEgb2ZmbXNrOworICBiZmRfdm1hIHNpZ25iaXQ7CisKKyAgLyogTk9URTogVGhpcyByb3V0aW5lIGlzIGN1cnJlbnRseSB1c2VkIGJ5IEdBUywgYnV0IG5vdCBieSB0aGUgbGluaworICAgICBwaGFzZS4gICovCisKKyAgc3dpdGNoIChidHlwZSkKKyAgICB7CisgICAgY2FzZSBiOToKKyAgICAgIGRzdG1zayAgPSAweDAwMDAwMGZmOworICAgICAgb2ZmbXNrICA9IDB4MDAwMDAxZmU7CisgICAgICBzaWduYml0ID0gMHgwMDAwMDEwMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiMTI6CisgICAgICBkc3Rtc2sgID0gMHgwMDAwMDdmZjsKKyAgICAgIG9mZm1zayAgPSAweDAwMDAwZmZlOworICAgICAgc2lnbmJpdCA9IDB4MDAwMDA4MDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYjIzOgorICAgICAgZHN0bXNrICA9IDB4MDdmZjA3ZmY7CisgICAgICBvZmZtc2sgID0gMHgwMDdmZmZmZjsKKyAgICAgIHNpZ25iaXQgPSAweDAwNDAwMDAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICAKKyAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KKyAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQorICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKKyAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCisgIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQorICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworCisgIHN3aXRjaCAoYnR5cGUpCisgICAgeworICAgIGNhc2UgYjk6CisgICAgY2FzZSBiMTI6CisgICAgICByZWxvY2F0aW9uID0gKCh0YXJnZXQgJiBkc3Rtc2spIDw8IDEpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGIyMzoKKyAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCisJcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEpICB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gNCk7CisgICAgICBlbHNlCisJcmVsb2NhdGlvbiA9ICgodGFyZ2V0ICYgMHg3ZmYpIDw8IDEyKSB8ICgodGFyZ2V0ICYgMHgwN2ZmMDAwMCkgPj4gMTUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIHNpZ25iaXQpIC0gc2lnbmJpdDsgLyogU2lnbiBleHRlbmQgKi8KKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgIHJlbG9jYXRpb24gLT0gYWRkcjsKKworICBpZiAocmVsb2NhdGlvbiAmIDEpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgaWYgKHJlbG9jYXRpb24gJiBzaWduYml0KQorICAgIHsKKyAgICAgIGlmICgocmVsb2NhdGlvbiAmIH5vZmZtc2spICE9IH5vZmZtc2spCisJZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICB9CisgIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+b2ZmbXNrKQorICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgdGFyZ2V0ICY9IH5kc3Rtc2s7CisgIHN3aXRjaCAoYnR5cGUpCisgICB7CisgICBjYXNlIGI5OgorICAgY2FzZSBiMTI6CisgICAgIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAxKTsKKyAgICAgYnJlYWs7CisKKyAgIGNhc2UgYjIzOgorICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgICAgIHRhcmdldCB8PSAoKHJlbG9jYXRpb24gJiAweGZmZikgPj4gMSkgIHwgKChyZWxvY2F0aW9uIDw8IDQpICAmIDB4MDdmZjAwMDApOworICAgICBlbHNlCisgICAgICAgdGFyZ2V0IHw9ICgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpOworICAgICBicmVhazsKKworICAgZGVmYXVsdDoKKyAgICAgYWJvcnQgKCk7CisgICB9CisKKyAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgorICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCisgIHJlbG9jX2VudHJ5LT5ob3d0byA9ICYgYW91dGFybV9zdGRfcmVsb2NfaG93dG8gW0FSTV8yNkRdOworICAKKyAgLyogVE9ETzogV2Ugc2hvdWxkIHBvc3NpYmx5IGhhdmUgRE9ORSBlbnRyaWVzIGZvciB0aGUgVEhVTUIgUENSRUwgcmVsb2NhdGlvbnMgKi8KKyAgcmV0dXJuIGZsYWc7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2NvZmZfdGh1bWJfcGNyZWxfMjMgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiMjMpOworfQorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitjb2ZmX3RodW1iX3BjcmVsXzEyIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjEyKTsKK30KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorY29mZl90aHVtYl9wY3JlbF85IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICByZXR1cm4gY29mZl90aHVtYl9wY3JlbF9jb21tb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgYjkpOworfQorCisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKK2NvZmZfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICAgYmZkICogYWJmZDsKKyAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworI2RlZmluZSBBU1REKGksaikgICAgICAgY2FzZSBpOiByZXR1cm4gJmFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW2pdCisgIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQorICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQorICAgICAgeworICAgICAgY2FzZSAzMjoKKyAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKKyAgICAgIH0KKworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgICAgQVNURCAoQkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBBUk1fOCk7CisgICAgICBBU1REIChCRkRfUkVMT0NfMTYsICAgICAgICAgICAgICAgICAgIEFSTV8xNik7CisgICAgICBBU1REIChCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIEFSTV8zMik7CisgICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIEFSTV8yNik7CisgICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgICAgICAgICAgICAgIEFSTV9ESVNQOCk7CisgICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsICAgICAgICAgICAgIEFSTV9ESVNQMTYpOworICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICBBUk1fRElTUDMyKTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgQVJNX1JWQTMyKTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgQVJNX1RIVU1COSk7CisgICAgICBBU1REIChCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsIEFSTV9USFVNQjEyKTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgQVJNX1RIVU1CMjMpOworICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOworICAgIH0KK30KKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCisjZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAorLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLworCisjZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KKyNkZWZpbmUgQkFETUFHKHgpIEFSTUJBRE1BRyh4KQorI2RlZmluZSBBUk0gMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCisKKy8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgQVJNIHNwZWNpZmljIGZpZWxkcy4KKyAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKKyAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCitzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlCit7CisgIC8qIFRoZSBvcmlnaW5hbCBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUuICBNVVNUIGJlIGZpcnN0IGZpZWxkLiAgKi8KKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCXJvb3Q7CisgIAorICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgVGh1bWItdG8tQVJNIGdsdWUuICAqLworICBsb25nIGludCAJCQl0aHVtYl9nbHVlX3NpemU7CisgIAorICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc2VjdGlvbiBjb250YWluZyB0aGUgQVJNLXRvLVRodW1iIGdsdWUuICAqLworICBsb25nIGludCAJCQlhcm1fZ2x1ZV9zaXplOworCisgIC8qIEFuIGFyYml0YXJ5IGlucHV0IEJGRCBjaG9zZW4gdG8gaG9sZCB0aGUgZ2x1ZSBzZWN0aW9ucy4gICovCisgIGJmZCAqCQkJCWJmZF9vZl9nbHVlX293bmVyOworCisgIC8qIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkLCBub24taW50ZXJ3b3JraW5nIGF3YXJlIEFSTSBjb2RlLiAqLworICBpbnQgCQkJCXN1cHBvcnRfb2xkX2NvZGU7Cit9OworCisvKiBHZXQgdGhlIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgY29mZl9hcm1faGFzaF90YWJsZShpbmZvKSBcCisgICgoc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKKworLyogQ3JlYXRlIGFuIEFSTSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKK2NvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqIGFiZmQ7Cit7CisgIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiByZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0CisgICAgICAoJiByZXQtPnJvb3QsIGFiZmQsIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorCisgIHJldC0+dGh1bWJfZ2x1ZV9zaXplICAgPSAwOworICByZXQtPmFybV9nbHVlX3NpemUgICAgID0gMDsKKyAgcmV0LT5iZmRfb2ZfZ2x1ZV9vd25lciA9IE5VTEw7CisKKyAgcmV0dXJuICYgcmV0LT5yb290LnJvb3Q7Cit9CisKK3N0YXRpYworYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY19vZmZzZXQpCisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICAgYmZkX3ZtYSByZWxvY19vZmZzZXQ7Cit7CisgIGJmZF92bWEgYWRkciA9IHJlbG9jX29mZnNldAorICAgICAgICAgICAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hCisgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisgICAgICAgICAgICAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisKKyAgaWYgKGNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCisgICAgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKKyAgZndyaXRlICgmYWRkciwgMSwgc2l6ZW9mIChhZGRyKSwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKKworfQorDAorLyogVGhlIHRodW1iIGZvcm0gb2YgYSBsb25nIGJyYW5jaCBpcyBhIGJpdCBmaW5pY2t5LCBiZWNhdXNlIHRoZSBvZmZzZXQKKyAgIGVuY29kaW5nIGlzIHNwbGl0IG92ZXIgdHdvIGZpZWxkcywgZWFjaCBpbiBpdCdzIG93biBpbnN0cnVjdGlvbi4gVGhleQorICAgY2FuIG9jY3VyIGluIGFueSBvcmRlci4gU28gZ2l2ZW4gYSB0aHVtYiBmb3JtIG9mIGxvbmcgYnJhbmNoLCBhbmQgYW4gCisgICBvZmZzZXQsIGluc2VydCB0aGUgb2Zmc2V0IGludG8gdGhlIHRodW1iIGJyYW5jaCBhbmQgcmV0dXJuIGZpbmlzaGVkCisgICBpbnN0cnVjdGlvbi4gCisKKyAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMgCisgICAxMSBiaXRzIHRvIGludmVzdC4gVGhlIHVwcGVyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiBvbmUgKGlkZW50aWZlZCBieQorICAgSC0wLi4gc2VlIGJlbG93KSwgdGhlIGxvd2VyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgb3RoZXIgKGlkZW50aWZpZWQgCisgICBieSBILTEpLiAKKworICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kIAorICAgdGhlcmUgeW91IGhhdmUgaXQuCisKKyAgICAgT3A6IDExMTEgPSBGLAorICAgICBILTAsIHVwcGVyIGFkZHJlc3MtMCA9IDAwMAorICAgICBPcDogMTExMSA9IEYsCisgICAgIEgtMSwgbG93ZXIgYWRkcmVzcy0wID0gODAwCisKKyAgIFRoZXkgY2FuIGJlIG9yZGVyZWQgZWl0aGVyIHdheSwgYnV0IHRoZSBhcm0gdG9vbHMgSSd2ZSBzZWVuIGFsd2F5cyBwdXQgCisgICB0aGUgbG93ZXIgb25lIGZpcnN0LiBJdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlci4ga3JrQGN5Z251cy5jb20KKworICAgWFhYOiAgQWN0dWFsbHkgdGhlIG9yZGVyIGRvZXMgbWF0dGVyLiAgVGhlIHNlY29uZCBpbnN0cnVjdGlvbiAoSC0xKQorICAgbW92ZXMgdGhlIGNvbXB1dGVkIGFkZHJlc3MgaW50byB0aGUgUEMsIHNvIGl0IG11c3QgYmUgdGhlIHNlY29uZCBvbmUKKyAgIGluIHRoZSBzZXF1ZW5jZS4gIFRoZSBwcm9ibGVtLCBob3dldmVyIGlzIHRoYXQgd2hpbHN0IGxpdHRsZSBlbmRpYW4gY29kZQorICAgc3RvcmVzIHRoZSBpbnN0cnVjdGlvbnMgaW4gSEkgdGhlbiBMT1cgb3JkZXIsIGJpZyBlbmRpYW4gY29kZSBkb2VzIHRoZQorICAgcmV2ZXJzZS4gIG5pY2tjQGN5Z251cy5jb20gICovCisKKyNkZWZpbmUgTE9XX0hJX09SREVSIDB4RjgwMEYwMDAKKyNkZWZpbmUgSElfTE9XX09SREVSIDB4RjAwMEY4MDAKKworc3RhdGljIGluc24zMgoraW5zZXJ0X3RodW1iX2JyYW5jaCAoYnJfaW5zbiwgcmVsX29mZikKKyAgICAgaW5zbjMyIGJyX2luc247CisgICAgIGludCByZWxfb2ZmOworeworICB1bnNpZ25lZCBpbnQgbG93X2JpdHM7CisgIHVuc2lnbmVkIGludCBoaWdoX2JpdHM7CisKKworICBCRkRfQVNTRVJUKChyZWxfb2ZmICYgMSkgIT0gMSk7CisKKyAgcmVsX29mZiA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYWxmIHdvcmQgYWxpZ25lZCBhZGRyZXNzICovCisgIGxvd19iaXRzID0gcmVsX29mZiAmIDB4MDAwMDA3RkY7ICAgICAgICAgICAgLyogdGhlIGJvdHRvbSAxMSBiaXRzICovCisgIGhpZ2hfYml0cyA9IChyZWxfb2ZmID4+IDExKSAmIDB4MDAwMDA3RkY7ICAgLyogdGhlIHRvcCAxMSBiaXRzICovCisKKyAgaWYgKChicl9pbnNuICYgTE9XX0hJX09SREVSKSA9PSBMT1dfSElfT1JERVIpCisgICAgYnJfaW5zbiA9IExPV19ISV9PUkRFUiB8IChsb3dfYml0cyA8PCAxNikgfCBoaWdoX2JpdHM7CisgIGVsc2UgaWYgKChicl9pbnNuICYgSElfTE9XX09SREVSKSA9PSBISV9MT1dfT1JERVIpCisgICAgYnJfaW5zbiA9IEhJX0xPV19PUkRFUiB8IChoaWdoX2JpdHMgPDwgMTYpIHwgbG93X2JpdHM7CisgIGVsc2UKKyAgICBhYm9ydCgpOyAvKiBlcnJvciAtIG5vdCBhIHZhbGlkIGJyYW5jaCBpbnN0cnVjdGlvbiBmb3JtICovCisKKyAgLyogRklYTUU6IGFib3J0IGlzIHByb2JhYmx5IG5vdCB0aGUgcmlnaHQgY2FsbC4ga3JrQGN5Z251cy5jb20gKi8KKworICByZXR1cm4gYnJfaW5zbjsKK30KKworDAorc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqCitmaW5kX3RodW1iX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworICAgICBDT05TVCBjaGFyICogICAgICAgICAgIG5hbWU7CisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOworeworICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogbXloOworCisgIHRtcF9uYW1lID0gKChjaGFyICopCisJIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSkpOworCisgIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKKworICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7CisgIAorICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKKyAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIAorICBpZiAobXloID09IE5VTEwpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciKSwKKwkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKKyAgCisgIGZyZWUgKHRtcF9uYW1lKTsKKworICByZXR1cm4gbXloOworfQorCitzdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoKK2ZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworICAgICBDT05TVCBjaGFyICogICAgICAgICAgIG5hbWU7CisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOworeworICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogbXloOworCisgIHRtcF9uYW1lID0gKChjaGFyICopCisJICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7CisKKyAgQkZEX0FTU0VSVCAodG1wX25hbWUpOworCisgIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKKyAgCisgIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAorICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKworICBpZiAobXloID09IE5VTEwpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIiksCisJCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7CisgIAorICBmcmVlICh0bXBfbmFtZSk7CisKKyAgcmV0dXJuIG15aDsKK30KKworLyoKKyAgQVJNLT5UaHVtYiBnbHVlOgorCisgICAgICAgLmFybQorICAgICAgIF9fZnVuY19mcm9tX2FybToKKwkgICAgIGxkciByMTIsIF9fZnVuY19hZGRyCisJICAgICBieCAgcjEyCisgICAgICAgX19mdW5jX2FkZHI6CisgICAgICAgICAgICAud29yZCBmdW5jICAgIEAgYmVoYXZlIGFzIGlmIHlvdSBzYXcgYSBBUk1fMzIgcmVsb2MKKyovCisKKyNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0laRSAxMgorc3RhdGljIGNvbnN0IGluc24zMiBhMnQxX2xkcl9pbnNuICAgICAgID0gMHhlNTlmYzAwMDsKK3N0YXRpYyBjb25zdCBpbnNuMzIgYTJ0Ml9ieF9yMTJfaW5zbiAgICA9IDB4ZTEyZmZmMWM7CitzdGF0aWMgY29uc3QgaW5zbjMyIGEydDNfZnVuY19hZGRyX2luc24gPSAweDAwMDAwMDAxOworCisjZGVmaW5lIEEyVDNfT0ZGU0VUIDgKKworLyoKKyAgIFRodW1iLT5BUk06CQkJCVRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCisKKyAgIC50aHVtYgkJCQkudGh1bWIKKyAgIC5hbGlnbiAyCQkJCS5hbGlnbiAyCisgICAgICBfX2Z1bmNfZnJvbV90aHVtYjoJCSAgIF9fZnVuY19mcm9tX3RodW1iOgorCSAgIGJ4IHBjCQkJCXB1c2gge3I2LCBscn0KKwkgICBub3AJCQkJCWxkciAgcjYsIF9fZnVuY19hZGRyCisgICAuYXJtCQkJCQkJbW92ICBsciwgcGMKKyAgICAgIF9fZnVuY19jaGFuZ2VfdG9fYXJtOgkJCWJ4ICAgcjYKKwkgICBiIGZ1bmMgICAJCQkuYXJtCisJCQkJCSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgorICAgCQkgIAkJCQlsZG1pYSByMTMhIHtyNiwgbHJ9CisgICAJCQkJCSAgICAgICAgYnggICAgbHIKKyAgIAkJCQkJICAgX19mdW5jX2FkZHI6CisJCQkJCSAgICAgICAgLndvcmQJZnVuYyAKKyovCisKKyNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IDIwIDogOCkKK3N0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9ieF9wY19pbnNuID0gMHg0Nzc4Oworc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX25vb3BfaW5zbiAgPSAweDQ2YzA7CitzdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuICAgICA9IDB4ZWEwMDAwMDA7CisKKyNkZWZpbmUgVDJBM19PRkZTRVQgOAorCitzdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfcHVzaF9pbnNuICA9IDB4YjU0MDsKK3N0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiAgID0gMHg0ZTAzOworc3RhdGljIGNvbnN0IGluc24xNiB0MmEzX21vdl9pbnNuICAgPSAweDQ2ZmU7CitzdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiAgICA9IDB4NDczMDsKK3N0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiAgID0gMHhlOGJkNDA0MDsKK3N0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuICAgID0gMHhlMTJmZmYxZTsKKworLyogVE9ETzoKKyAgICAgV2Ugc2hvdWxkIHJlYWxseSBjcmVhdGUgbmV3IGxvY2FsIChzdGF0aWMpIHN5bWJvbHMgaW4gZGVzdGluYXRpb24KKyAgICAgb2JqZWN0IGZvciBlYWNoIHN0dWIgd2UgY3JlYXRlLiAgV2Ugc2hvdWxkIGFsc28gY3JlYXRlIGxvY2FsCisgICAgIChzdGF0aWMpIHN5bWJvbHMgd2l0aGluIHRoZSBzdHVicyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIEFSTSBhbmQKKyAgICAgVGh1bWIgY29kZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZGVidWdnZXIgYW5kIGRpc2Fzc2VtYmxlcgorICAgICBjYW4gcHJlc2VudCBhIGJldHRlciB2aWV3IG9mIHN0dWJzLgorCisgICAgIFdlIGNhbiB0cmVhdCBzdHVicyBsaWtlIGxpdGVyYWwgc2VjdGlvbnMsIGFuZCBmb3IgdGhlIFRIVU1COSBvbmVzCisgICAgIChzaG9ydCBhZGRyZXNzaW5nIHJhbmdlKSB3ZSBzaG91bGQgYmUgYWJsZSB0byBpbnNlcnQgdGhlIHN0dWJzCisgICAgIGJldHdlZW4gc2VjdGlvbnMuIGkuZS4gdGhlIHNpbXBsZXN0IGFwcHJvYWNoIChzaW5jZSByZWxvY2F0aW9ucworICAgICBhcmUgZG9uZSBvbiBhIHNlY3Rpb24gYmFzaXMpIGlzIHRvIGR1bXAgdGhlIHN0dWJzIGF0IHRoZSBlbmQgb2YKKyAgICAgcHJvY2Vzc2luZyBhIHNlY3Rpb24uIFRoYXQgd2F5IHdlIGNhbiBhbHdheXMgdHJ5IGFuZCBtaW5pbWlzZSB0aGUKKyAgICAgb2Zmc2V0IHRvIGFuZCBmcm9tIGEgc3R1Yi4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBtYXAgd2VsbCBvbnRvCisgICAgIHRoZSB3YXkgdGhhdCB0aGUgbGlua2VyL0JGRCBkb2VzIGl0cyB3b3JrOiBtYXBwaW5nIGFsbCBpbnB1dAorICAgICBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMgdmlhIHRoZSBsaW5rZXIgc2NyaXB0IGJlZm9yZSBkb2luZworICAgICBhbGwgdGhlIHByb2Nlc3NpbmcuCisKKyAgICAgVW5mb3J0dW5hdGVseSBpdCBtYXkgYmUgZWFzaWVyIHRvIGp1c3QgdG8gZGlzYWxsb3cgc2hvcnQgcmFuZ2UKKyAgICAgVGh1bWItPkFSTSBzdHVicyAoaS5lLiBubyBjb25kaXRpb25hbCBpbnRlci13b3JraW5nIGJyYW5jaGVzLAorICAgICBvbmx5IGJyYW5jaC1hbmQtbGluayAoQkwpIGNhbGxzLiAgVGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBwcm9jZXNzaW5nCisgICAgIHNpbmNlIHdlIGNhbiB0aGVuIHB1dCBhbGwgb2YgdGhlIHN0dWJzIGludG8gdGhlaXIgb3duIHNlY3Rpb24uCisKKyAgVE9ETzoKKyAgICAgT24gYSBkaWZmZXJlbnQgc3ViamVjdCwgcmF0aGVyIHRoYW4gY29tcGxhaW5pbmcgd2hlbiBhCisgICAgIGJyYW5jaCBjYW5ub3QgZml0IGluIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIHRoZQorICAgICBpbnN0cnVjdGlvbiB3ZSBzaG91bGQgZ2VuZXJhdGUgYSB0cmFtcG9saW5lIHN0dWIgKG5lZWRlZCB0bworICAgICBhZGRyZXNzIHRoZSBjb21wbGV0ZSAzMmJpdCBhZGRyZXNzIHNwYWNlKS4gICovCisKKy8qIFRoZSBzdGFuZGFyZCBDT0ZGIGJhY2tlbmQgbGlua2VyIGRvZXMgbm90IGNvcGUgd2l0aCB0aGUgc3BlY2lhbCAKKyAgIFRodW1iIEJSQU5DSDIzIHJlbG9jYXRpb24uICBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gc3BsaXQgdGhlCisgICBCUkFOQ0gyMyBpbnRvIHNlcGVyYXRlIEhJMjMgYW5kIExPMjMgcmVsb2NhdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIGEKKyAgIGJpdCBzaW1wbGVyIHNpbXBseSBwcm92aWRpbmcgb3VyIG93biByZWxvY2F0aW9uIGRyaXZlci4gKi8KKworLyogVGhlIHJlbG9jIHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhlIEFSTS9UaHVtYiBDT0ZGIGxpbmtlci4gIE5PVEU6CisgICBUaGlzIGNvZGUgaXMgYSB2ZXJ5IHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YKKyAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24uICBJdCB3b3VsZCBiZSBhIG11Y2ggbW9yZQorICAgbWFpbnRhaW5hYmxlIHNvbHV0aW9uIHRvIGhhdmUgYSBNQUNSTyB0aGF0IGNvdWxkIGJlIGV4cGFuZGVkIHdpdGhpbgorICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiB0aGF0IHdvdWxkIG9ubHkgYmUgcHJvdmlkZWQgZm9yCisgICBBUk0vVGh1bWIgYnVpbGRzLiAgSXQgaXMgb25seSB0aGUgY29kZSBtYXJrZWQgVEhVTUJFWFRFTlNJT04gdGhhdAorICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7CisgICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsZW5kOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAwOworICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKKyAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICBoOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqICAgICAgIHN5bTsKKyAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQ7CisgICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICAgIGhvd3RvOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICAgIHJzdGF0OworICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGhfdmFsOworCisgICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OworCisgICAgICBpZiAoc3ltbmR4ID09IC0xKQorCXsKKwkgIGggPSBOVUxMOworCSAgc3ltID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeyAgICAKKwkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07CisJICBzeW0gPSBzeW1zICsgc3ltbmR4OworCX0KKworICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQorICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAorICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKKyAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLworCisgICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCisJYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7CisgICAgICBlbHNlCisJYWRkZW5kID0gMDsKKworCisgICAgICBob3d0byA9IGNvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAorCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOworICAgICAgaWYgKGhvd3RvID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBUaGUgcmVsb2NhdGlvbl9zZWN0aW9uIGZ1bmN0aW9uIHdpbGwgc2tpcCBwY3JlbF9vZmZzZXQgcmVsb2NzCisgICAgICAgICB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnZlcnQKKyAgICAgICAgIEFSTTI2IHRvIEFSTTI2RCByZWxvY3MgaWYgcG9zc2libGUuICBXZSByZXR1cm4gYSBmYWtlIGhvd3RvIGluCisgICAgICAgICB0aGlzIGNhc2Ugd2l0aG91dCBwY3JlbF9vZmZzZXQgc2V0LCBhbmQgYWRqdXN0IHRoZSBhZGRlbmQgdG8KKyAgICAgICAgIGNvbXBlbnNhdGUuICAqLworICAgICAgaWYgKHJlbC0+cl90eXBlID09IEFSTV8yNgorICAgICAgICAgICYmIGggIT0gTlVMTAorICAgICAgICAgICYmIGluZm8tPnJlbG9jYXRlYWJsZQorICAgICAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICAgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZmFrZV9hcm0yNl9yZWxvYyA9IAorCSAgICBIT1dUTyAoQVJNXzI2LAorICAgIAkgICAgICAgMiwKKyAgICAJICAgICAgIDIsCisgICAgCSAgICAgICAyNCwKKyAgICAJICAgICAgIHRydWUsCisgICAgCSAgICAgICAwLAorICAgIAkgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAorICAgIAkgICAgICAgYW91dGFybV9maXhfcGNyZWxfMjYgLAorICAgIAkgICAgICAgIkFSTV8yNiIsCisgICAgCSAgICAgICBmYWxzZSwKKyAgICAJICAgICAgIDB4MDBmZmZmZmYsCisgICAgCSAgICAgICAweDAwZmZmZmZmLCAKKyAgICAJICAgICAgIGZhbHNlKTsKKworICAgICAgICAgIGFkZGVuZCAtPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7CisgICAgICAgICAgaG93dG8gPSAmZmFrZV9hcm0yNl9yZWxvYzsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlbiB3ZSBjYW4ganVzdCBpZ25vcmUKKyAgICAgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MgdGhhdCBpcyBwY3JlbF9vZmZzZXQuICBJdCB3aWxsIGFscmVhZHkKKyAgICAgICAgIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUuICBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLAorICAgICAgICAgdGhlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBzeW1ib2wgdmFsdWUuICAqLworICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+cGNyZWxfb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKKyAgICAgICAgICAgIGFkZGVuZCArPSBzeW0tPm5fdmFsdWU7CisgICAgICAgIH0KKworICAgICAgdmFsID0gMDsKKworICAgICAgaWYgKGggPT0gTlVMTCkKKwl7CisJICBhc2VjdGlvbiAqc2VjOworCisJICBpZiAoc3ltbmR4ID09IC0xKQorCSAgICB7CisJICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgICAgICB2YWwgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOworICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJICAgICArIHN5bS0+bl92YWx1ZQorCQkgICAgIC0gc2VjLT52bWEpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKyNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCisgICAgICAgICAgLyogV2UgZG9uJ3Qgb3V0cHV0IHRoZSBzdHVicyBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBhCisgICAgICAgICAgICAgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUsIHNpbmNlIHdlIG1heSBhcyB3ZWxsIGxlYXZlIHRoZQorICAgICAgICAgICAgIHN0dWIgZ2VuZXJhdGlvbiB0byB0aGUgZmluYWwgbGlua2VyIHBhc3MuIElmIHdlIGZhaWwgdG8KKwkgICAgIHZlcmlmeSB0aGF0IHRoZSBuYW1lIGlzIGRlZmluZWQsIHdlJ2xsIHRyeSB0byBidWlsZCBzdHVicworCSAgICAgZm9yIGFuIHVuZGVmaW5lZCBuYW1lLi4uICovCisgICAgICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCisJICAgICAgJiYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKyAgICAgICAgICAgIHsKKwkgICAgICBhc2VjdGlvbiAqICAgaF9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgY29uc3QgY2hhciAqIG5hbWUgID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkgICAgICAKKwkgICAgICAvKiBoIGxvY2F0ZXMgdGhlIHN5bWJvbCByZWZlcmVuY2VkIGluIHRoZSByZWxvYy4gICovCisJICAgICAgaF92YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICAgKyBoX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgKyBoX3NlYy0+b3V0cHV0X29mZnNldCk7CisKKyAgICAgICAgICAgICAgaWYgKGhvd3RvLT50eXBlID09IEFSTV8yNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCisJCSAgICAgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKQorCQkgICAgeworCQkgICAgICAvKiBBcm0gY29kZSBjYWxsaW5nIGEgVGh1bWIgZnVuY3Rpb24gKi8KKwkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgICAgICAgICAgICAgICAgIHRtcDsKKwkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29mZnNldDsKKwkJICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgIHM7CisJCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OworCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgbXloOyAKKwkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7CisJCSAgICAgIAorCQkgICAgICBteWggPSBmaW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOworCQkgICAgICBpZiAobXloID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJICAgICAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOworCisJCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7CisJCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworCQkJCisJCSAgICAgIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKKwkJICAgICAgCisJCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIAorCQkJCQkJICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOworCQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCQkgICAgICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKKwkJICAgICAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7CisKKwkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQorCQkJeworCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKKwkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKKwkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikpCisJCQkgICAgeworCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCisJCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkJCQkoXygiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCisJCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGhfc2VjLT5vd25lciksIG5hbWUpOworCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCisJCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkJCQkoXygiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiKSwKKwkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7CisJCQkgICAgfQorCisJCQkgIC0tbXlfb2Zmc2V0OworCQkJICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7CisKKwkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0MV9sZHJfaW5zbiwKKwkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCk7CisJCQkgIAorCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAorCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7CisJCQkgIAorCQkJICAvKiBJdCdzIGEgdGh1bWIgYWRkcmVzcy4gIEFkZCB0aGUgbG93IG9yZGVyIGJpdC4gICovCisJCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhfdmFsIHwgYTJ0M19mdW5jX2FkZHJfaW5zbiwKKwkJCQkgICAgICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCBBMlQzX09GRlNFVCk7CisKKwkJCX0KKworCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7CisKKwkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgorCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7CisJCSAgICAgIAorCQkgICAgICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOworCisJCSAgICAgIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLworCQkgICAgICByZXRfb2Zmc2V0ID0KKwkJCXMtPm91dHB1dF9vZmZzZXQKKwkJCSsgbXlfb2Zmc2V0IAorCQkJKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCisJCQkgICArIHJlbC0+cl92YWRkcikKKwkJCS0gODsKKworCQkgICAgICB0bXAgPSB0bXAgfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKTsKKwkJICAgICAgCisJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHRtcCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKKwkJCQkgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKKwkJICAgICAgCisJCSAgICAgIGRvbmUgPSAxOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKwkgICAgICAKKwkgICAgICAvKiBOb3RlOiBXZSB1c2VkIHRvIGNoZWNrIGZvciBBUk1fVEhVTUI5IGFuZCBBUk1fVEhVTUIxMiAqLworICAgICAgICAgICAgICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSBBUk1fVEhVTUIyMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoICAgaC0+Y2xhc3MgPT0gQ19FWFQgCisJCSAgICAgIHx8IGgtPmNsYXNzID09IENfU1RBVAorCQkgICAgICB8fCBoLT5jbGFzcyA9PSBDX0xBQkVMKQorCQkgICAgeworCQkgICAgICAvKiBUaHVtYiBjb2RlIGNhbGxpbmcgYW4gQVJNIGZ1bmN0aW9uICovCisJCSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7CisJCSAgICAgIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OworCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgIHRtcDsKKwkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfb2Zmc2V0OworCQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgICAgIG15aDsKKwkJICAgICAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqICBnbG9iYWxzOworCisJCSAgICAgIG15aCA9IGZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKKwkJICAgICAgaWYgKG15aCA9PSBOVUxMKQorCQkJcmV0dXJuIGZhbHNlOworCisJCSAgICAgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKKwkJICAgICAgCisJCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7CisJCSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworCQkgICAgICAKKwkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOworCQkgICAgICAKKwkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCisJCQkJCQkgICBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworCQkgICAgICAKKwkJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkJICAgICAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7CisJCSAgICAgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOworCQkgICAgICAKKwkJICAgICAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQorCQkJeworCQkJICBpZiAoaF9zZWMtPm93bmVyICE9IE5VTEwKKwkJCSAgICAgICYmIElOVEVSV09SS19TRVQgKGhfc2VjLT5vd25lcikKKwkJCSAgICAgICYmICEgSU5URVJXT1JLX0ZMQUcgKGhfc2VjLT5vd25lcikKKwkJCSAgICAgICYmICEgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSkKKwkJCSAgICB7CisJCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKKwkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKKwkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7CisJCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKKwkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIpLAorCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKKwkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgorCQkJCShfKCIgIGNvbnNpZGVyIHJlbGlua2luZyB3aXRoIC0tc3VwcG9ydC1vbGQtY29kZSBlbmFibGVkIikpOworCQkJICAgIH0KKwkJCSAgCisJCQkgIC0tIG15X29mZnNldDsKKwkJCSAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OworCisJCQkgIGlmIChnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQorCQkJICAgIHsKKwkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfcHVzaF9pbnNuLAorCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKKwkJCSAgICAgIAorCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMl9sZHJfaW5zbiwKKwkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOworCisJCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEzX21vdl9pbnNuLAorCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7CisKKwkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTRfYnhfaW5zbiwKKwkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDYpOworCQkJICAgICAgCisJCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0MmE1X3BvcF9pbnNuLAorCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7CisJCQkgICAgICAKKwkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTZfYnhfaW5zbiwKKwkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDEyKTsKKwkJCSAgICAgIAorCQkJICAgICAgLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBsYXN0IHdvcmQgb2YgdGhlIHN0dWIuICAqLworCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwsCisJCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyAxNik7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9ieF9wY19pbnNuLAorCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKKwkJICAgICAgCisJCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX25vb3BfaW5zbiwKKwkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOworCQkgICAgICAKKwkJCSAgICAgIHJldF9vZmZzZXQgPQorCQkJCSgoYmZkX3NpZ25lZF92bWEpIGhfdmFsKQkvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHViICovCisJCQkJLSAoKGJmZF9zaWduZWRfdm1hKQorCQkJCSAgIChzLT5vdXRwdXRfb2Zmc2V0IAkJLyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCisJCQkJICAgICsgbXlfb2Zmc2V0CQkJLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHN0dWIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KKwkJCQkgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSAJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCisJCQkJICAgKyA0CQkJCS8qIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXMgNCBieXRlcyBpbnRvIHRoZSBzdHViLiAgKi8KKwkJCQkgICArIDgpOwkJCS8qIEFSTSBicmFuY2hlcyB3b3JrIGZyb20gdGhlIHBjIG9mIHRoZSBpbnN0cnVjdGlvbiArIDguICAqLworCQkJICAgICAgCisJCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAorCQkJCQkgIHQyYTNfYl9pbnNuIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRiksCisJCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCBUMkEzX09GRlNFVCk7CisJCQkgICAgfQorCQkJfQorCisJCSAgICAgIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOworCisJCSAgICAgIC8qIE5vdyBnbyBiYWNrIGFuZCBmaXggdXAgdGhlIG9yaWdpbmFsIEJMIGluc24gdG8gcG9pbnQKKwkJCSB0byBoZXJlLiAgKi8KKwkJICAgICAgcmV0X29mZnNldCA9CisJCQlzLT5vdXRwdXRfb2Zmc2V0CisJCQkrIG15X29mZnNldAorCQkJLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCQkJICAgKyByZWwtPnJfdmFkZHIpCisJCQktNDsKKwkJICAgICAgCisJCSAgICAgIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKKwkJCQkJLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCisJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCQkJICBpbnNlcnRfdGh1bWJfYnJhbmNoICh0bXAsIHJldF9vZmZzZXQpLAorCQkJCSAgY29udGVudHMgKyByZWwtPnJfdmFkZHIKKwkJCQkgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKKwkJICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyKTsKKworCQkgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgIAorICAgICAgICAgIC8qIElmIHRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIGRlc3RpbmF0aW9uIHN5bWJvbCBkb2VzIG5vdAorICAgICAgICAgICAgIGZhbGwgaW50byBvbmUgb2YgdGhlIGFib3ZlIGNhdGVnb3JpZXMsIHRoZW4gd2UgY2FuIGp1c3QKKyAgICAgICAgICAgICBwZXJmb3JtIGEgZGlyZWN0IGxpbmsuICovCisKKwkgIGlmIChkb25lKQorCSAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKKwkgIGVsc2UgCisjZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KKwkgICAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzZWM7CisKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgICB9CisKKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCisJeworCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KKwkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCisgICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7CisJfQorICAKKyNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCisgICAgICBpZiAoZG9uZSkKKwlyc3RhdCA9IGJmZF9yZWxvY19vazsKKyAgICAgIC8qIE9ubHkgcGVyZm9ybSB0aGlzIGZpeCBkdXJpbmcgdGhlIGZpbmFsIGxpbmssIG5vdCBhIHJlbG9jYXRhYmxlIGxpbmsuICBuaWNrY0BjeWdudXMuY29tICAqLworICAgICAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKKwkgICAgICAgJiYgaG93dG8tPnR5cGUgPT0gQVJNX1RIVU1CMjMpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBUaGlzIGlzIHByZXR0eSBtdWNoIGEgY29weSBvZiB3aGF0IHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIGFuZCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCisgICAgICAgICAgICAgcm91dGluZXMgZG8gdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24sIHdpdGggc3BlY2lhbAorICAgICAgICAgICAgIHByb2Nlc3NpbmcgZm9yIHRoZSBzcGxpdCBhZGRyZXNzaW5nIG9mIHRoZSBUaHVtYiBCTAorICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgQWdhaW4sIGl0IHdvdWxkIHByb2JhYmx5IGJlIHNpbXBsZXIgYWRkaW5nIGEKKyAgICAgICAgICAgICBUaHVtYkJSQU5DSDIzIHNwZWNpZmljIG1hY3JvIGV4cGFuc2lvbiBpbnRvIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgY29kZS4gICovCisJICAKKyAgICAgICAgICBiZmRfdm1hIGFkZHJlc3MgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7CisJICAKKyAgICAgICAgICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKKwkgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJmZF92bWEgICAgICAgICByZWxvY2F0aW9uICAgICAgID0gdmFsICsgYWRkZW5kOworCSAgICAgIGludCAgICAgICAgICAgICBzaXplICAgICAgICAgICAgID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7CisJICAgICAgYm9vbGVhbiAgICAgICAgIG92ZXJmbG93ICAgICAgICAgPSBmYWxzZTsKKwkgICAgICBiZmRfYnl0ZSAqICAgICAgbG9jYXRpb24gICAgICAgICA9IGNvbnRlbnRzICsgYWRkcmVzczsKKwkgICAgICBiZmRfdm1hICAgICAgICAgeCAgICAgICAgICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOworCSAgICAgIGJmZF92bWEgICAgICAgICBzcmNfbWFzayAgICAgICAgID0gMHgwMDdGRkZGRTsKKwkgICAgICBiZmRfc2lnbmVkX3ZtYSAgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7CisJICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKKwkgICAgICBiZmRfdm1hICAgICAgICAgY2hlY2s7CisJICAgICAgYmZkX3NpZ25lZF92bWEgIHNpZ25lZF9jaGVjazsKKwkgICAgICBiZmRfdm1hICAgICAgICAgYWRkOworCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfYWRkOworCisJICAgICAgQkZEX0FTU0VSVCAoc2l6ZSA9PSA0KTsKKwkgICAgICAKKyAgICAgICAgICAgICAgLyogaG93dG8tPnBjX3JlbGF0aXZlIHNob3VsZCBiZSBUUlVFIGZvciB0eXBlIDE0IEJSQU5DSDIzICovCisgICAgICAgICAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgICAKKyAgICAgICAgICAgICAgLyogaG93dG8tPnBjcmVsX29mZnNldCBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLworICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IGFkZHJlc3M7CisJICAgICAgCisJICAgICAgLyogTm8gbmVlZCB0byBuZWdhdGUgdGhlIHJlbG9jYXRpb24gd2l0aCBCUkFOQ0gyMy4gKi8KKwkgICAgICAvKiBob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkIGZvciBCUkFOQ0gyMy4gICovCisJICAgICAgLyogaG93dG8tPnJpZ2h0c2hpZnQgPT0gMSAqLworCSAgICAgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCisJICAgICAgCisJICAgICAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OworCQkKKwkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKKwkJIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KKwkgICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCisJCXNpZ25lZF9jaGVjayA9IGNoZWNrOworCSAgICAgIGVsc2UKKwkJc2lnbmVkX2NoZWNrID0gKGNoZWNrCisJCQkJfCAoKGJmZF92bWEpIC0gMQorCQkJCSAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOworCSAgICAgIAorCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLworCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKKwkJeworCQkgIGFkZCA9ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gNCkgfCAoKCh4KSAmIDB4N2ZmKSA8PCAxKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGFkZCA9ICgoKCh4KSAmIDB4N2ZmKSA8PCAxMikgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE1KSk7CisJCX0KKworCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBhbiBhcHByb3ByaWF0ZSBzaWduLgorCQkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKKwkJIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCisJCSBhZGRpbmcsIGl0IGlzIG5lZ2F0aXZlLCBhbmQgd2Ugc3VidHJhY3Qgb3V0IHRoYXQgbnVtYmVyIHRpbWVzCisJCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKKwkJIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQorCQkgc2lnbmVkX2FkZCBuZWVkcyBubyBhZGp1c3RtZW50IHRvIGJlY29tZSBuZWdhdGl2ZSBpbiB0aGF0CisJCSBjYXNlLiAgKi8KKwkgICAgICAKKwkgICAgICBzaWduZWRfYWRkID0gYWRkOworCSAgICAgIAorCSAgICAgIGlmICgoYWRkICYgKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykpICE9IDApCisJCXNpZ25lZF9hZGQgLT0gKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykgPDwgMTsKKwkgICAgICAKKwkgICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQorCQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KKwkgICAgICAvKiBob3d0by0+Yml0cG9zID09IDAgKi8KKwkgICAgICAKKwkgICAgICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKKwkgICAgICByZWxvY2F0aW9uICs9IHNpZ25lZF9hZGQ7CisKKwkgICAgICBCRkRfQVNTRVJUIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKTsKKworCSAgICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCisJICAgICAgaWYgKCAgIHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKKwkJICB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgICAgCisJICAgICAgLyogUHV0IFJFTE9DQVRJT04gaW50byB0aGUgY29ycmVjdCBiaXRzOiAgKi8KKwkgICAgICAKKwkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCisJCXsKKwkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA+PiAxKSAgfCAoKHJlbG9jYXRpb24gPDwgNCkgJiAweDA3ZmYwMDAwKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpKTsKKwkJfQorCSAgICAgIAorCSAgICAgIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSBjb3JyZWN0IGJpdHMgb2YgWDogICovCisJICAgICAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgcmVsb2NhdGlvbik7CisKKwkgICAgICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCisJICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7CisKKwkgICAgICByc3RhdCA9IG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KKyAgICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgYWRkZW5kKTsKKyNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCisgICAgICAvKiBGSVhNRTogCisJIElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZpeCB1cCB0aHVtYiBhZGRyZXNzZXM/IGtya0BjeWdudXMuY29tCisJIFByb2JhYmx5IG5vdCwgYnV0IGl0IHdvcmtzLCBhbmQgaWYgaXQgd29ya3MgaXQgZG9uJ3QgbmVlZCBmaXhpbmchICBuaWNrY0BjeWdudXMuY29tICovCisgICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KKyAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQorCSAgJiYgcmVsLT5yX3R5cGUgPT0gQVJNXzMyKQorCXsKKwkgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNldCB0aGUgYm90dG9tIGJpdCBvZiBhIHJlbG9jYXRlZCBhZGRyZXNzCisJICAgICBiZWNhdXNlIHRoZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIGEgVGh1bWIgY29kZSBzeW1ib2wuICAqLworCSAgICAgCisJICBpbnQgcGF0Y2hpdCA9IGZhbHNlOworCSAgCisJICBpZiAoaCAhPSBOVUxMCisJICAgICAgJiYgKCAgIGgtPmNsYXNzID09IENfVEhVTUJTVEFURlVOQworCQkgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKSkKKwkgICAgeworCSAgICAgIHBhdGNoaXQgPSB0cnVlOworCSAgICB9CisJICBlbHNlIGlmIChzeW0gIT0gTlVMTAorCQkgICAmJiBzeW0tPm5fc2NudW0gPiBOX1VOREVGKQorCSAgICB7CisJICAgICAgLyogTm8gaGFzaCBlbnRyeSAtIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuICAqLworCisJICAgICAgaWYgKCAgIHN5bS0+bl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCisJCSAgfHwgc3ltLT5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKKwkJcGF0Y2hpdCA9IHRydWU7CisJICAgIH0KKworCSAgaWYgKHBhdGNoaXQpCisJICAgIHsKKwkgICAgICBiZmRfYnl0ZSAqIGxvY2F0aW9uID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7CisJICAgICAgYmZkX3ZtYSAgICB4ICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOworCisJICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4IHwgMSwgbG9jYXRpb24pOworCSAgICB9CisJfQorI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovICAgICAgCisgICAgICAKKyAgICAgIHN3aXRjaCAocnN0YXQpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAorCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOworCSAgcmV0dXJuIGZhbHNlOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCisJICAgIGlmIChzeW1uZHggPT0gLTEpCisJICAgICAgbmFtZSA9ICIqQUJTKiI7CisJICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7CisJCWlmIChuYW1lID09IE5VTEwpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKworCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCisJCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmbmRlZiBDT0ZGX1dJVEhfUEUKK2Jvb2xlYW4KK2JmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKSAKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworeworICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKKyAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvbzsKKyAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7CisjaWYgMAorICBzdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jaGFyID0gJzEnOworI2VuZGlmCisKKyAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOworICAKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKKworICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworICAgICAgCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKKwkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7CisKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICAKKyAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKKwkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOworI2lmIDAKKyAgICAgIG1lbXNldCAoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOworI2VuZGlmCisgICAgICAKKyAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7CisgICAgICBzLT5jb250ZW50cyA9IGZvbzsKKyAgICB9CisKKyAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworICAgICAgCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKKwkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7CisKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICAKKyAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKKwkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7CisjaWYgMAorICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKKyNlbmRpZgorICAgICAgCisgICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7CisgICAgICBzLT5jb250ZW50cyA9IGZvbzsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87CisgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Cit7CisgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKyAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgIHM7CisgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsKKyAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7CisKKyAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOworCisgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7CisgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQorICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKKworICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgIHRtcF9uYW1lID0gKChjaGFyICopCisJICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7CisKKyAgQkZEX0FTU0VSVCAodG1wX25hbWUpOworCisgIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKKyAgCisgIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAorICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgCisgIGlmIChteWggIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlICh0bXBfbmFtZSk7CisgICAgICByZXR1cm47IC8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLworICAgIH0KKworICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCisgICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZworICAgICBpdC4gICovCisKKyAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAorCQkJCUJTRl9HTE9CQUwsIAorCQkJCXMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAorCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKKwkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKKyAgCisgIGZyZWUgKHRtcF9uYW1lKTsKKyAgCisgIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKKworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87CisgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Cit7CisgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisgIHJlZ2lzdGVyIGFzZWN0aW9uICogICAgICAgICAgICAgICAgczsKKyAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgICBteWg7CisgIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiAgZ2xvYmFsczsKKworICAKKyAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOworICAKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCisgICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworCisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOworCisgIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKKworICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7CisKKyAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCisgICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAKKyAgaWYgKG15aCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKHRtcF9uYW1lKTsKKyAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCisgICAgfQorCisgIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKKwkJCQlCU0ZfR0xPQkFMLCBzLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKyAxLAorCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKKwkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKKyAgCisgIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCisgIG15aC0+Y2xhc3MgPSBDX1RIVU1CRVhURlVOQzsKKworICBmcmVlICh0bXBfbmFtZSk7CisKKyAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLworICAgICAgCisjZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKKyNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgorICAKKyAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOworICAKKyAgQkZEX0FTU0VSVCAodG1wX25hbWUpOworICAKKyAgc3ByaW50ZiAodG1wX25hbWUsIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyBCQUNLX0ZST01fQVJNIDogQ0hBTkdFX1RPX0FSTSwgbmFtZSk7CisKKyAgbXloID0gTlVMTDsKKyAgCisgIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKKwkJCQlCU0ZfTE9DQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZQorCQkJCSsgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyA4IDogNCksCisJCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAorCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOworCisgIGZyZWUgKHRtcF9uYW1lKTsgIAorICAKKyAgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7CisKKyAgcmV0dXJuOworfQorCisvKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCisgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCisgICB7YXJtY29mZi9wZX0uZW0gICovCitib29sZWFuCitiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICogCQkgICAgYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworeworICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKKyAgZmxhZ3dvcmQgICAJCQkgICAgZmxhZ3M7CisgIGFzZWN0aW9uICogCQkJICAgIHNlYzsKKyAgICAKKyAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCisgICAgIGdldHRpbmcgYSBiZmQgdG8gaG9sZCB0aGUgZ2x1ZS4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7CisgIAorICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOworCisgIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQorICAgIHJldHVybiB0cnVlOworICAKKyAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7CisgIAorICBpZiAoc2VjID09IE5VTEwpIAorICAgIHsKKyAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKKyAgICAgIAorICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKKyAgICAgIAorICAgICAgaWYgKHNlYyA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworCisgIGlmIChzZWMgPT0gTlVMTCkgCisgICAgeworICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOworICAgICAgCisgICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworICAgICAgCisgICAgICBpZiAoc2VjID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIAorICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCisgIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKKyAgCisgIHJldHVybiB0cnVlOworfQorCitib29sZWFuCitiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGluZm8sIHN1cHBvcnRfb2xkX2NvZGUpCisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87CisgICAgIGludAkJICAgICBzdXBwb3J0X29sZF9jb2RlOworeworICBhc2VjdGlvbiAqIHNlYzsKKyAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7CisKKyAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCisgICAgIHRvIGNvbnN0cnVjdCBhbnkgZ2x1ZS4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisgIAorICAvKiBIZXJlIHdlIGhhdmUgYSBiZmQgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgbGluay4gIFdlIGhhdmUgYSBob29rCisgICAgIHRvIGRvIHJlbG9jIHJ1bW1hZ2luZywgYmVmb3JlIHNlY3Rpb24gc2l6ZXMgYXJlIG5haWxlZCBkb3duLiAgKi8KKworICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpOworCisgIGdsb2JhbHMgPSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKKyAgCisgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7CisgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworCisgIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPSBzdXBwb3J0X29sZF9jb2RlOworICAKKyAgLyogUnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgZ2x1ZSB2ZWN0b3JzLiAgKi8KKyAgc2VjID0gYWJmZC0+c2VjdGlvbnM7CisKKyAgaWYgKHNlYyA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAoOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIGk7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7CisKKyAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApIAorCWNvbnRpbnVlOworCisgICAgICAvKiBMb2FkIHRoZSByZWxvY3MuICAqLworICAgICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlLiAqLworICAgICAgCisgICAgICBpID0gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIDEsIDAsIDAsIDApOworICAgIAorICAgICAgQkZEX0FTU0VSVCAoaSAhPSAwKTsKKworICAgICAgZm9yIChyZWwgPSBpOyByZWwgPCBpICsgc2VjLT5yZWxvY19jb3VudDsgKytyZWwpIAorCXsKKwkgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICByX3R5cGUgID0gcmVsLT5yX3R5cGU7CisJICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OworCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7CisKKwkgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7CisKKwkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIG5vdCBhZ2FpbnN0IGEgc3ltYm9sIGl0IGNhbm5vdCBjb25jZXJuIHVzLiAqLworCSAgaWYgKHN5bW5keCA9PSAtMSkKKwkgICAgY29udGludWU7CisKKwkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtzeW1uZHhdOworCisJICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgorCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgIHN3aXRjaCAocl90eXBlKQorCSAgICB7CisJICAgIGNhc2UgQVJNXzI2OgorCSAgICAgIC8qIFRoaXMgb25lIGlzIGEgY2FsbCBmcm9tIGFybSBjb2RlLiAgV2UgbmVlZCB0byBsb29rIHVwCisJCSB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhIHRodW1iIHRhcmdldCwgd2UKKwkJIGluc2VydCBnbHVlLiAgKi8KKwkgICAgICAKKwkgICAgICBpZiAoaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCisJCXJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZSAoaW5mbywgaCk7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQVJNX1RIVU1CMjM6CisJICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gdGh1bWIgY29kZS4gIFdlIHVzZWQgdG8gbG9vaworCQkgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyIGFzIHdlbGwuICBXZSBuZWVkIHRvIGxvb2sKKwkJIHVwIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGFuIGFybSB0YXJnZXQsIHdlCisJCSBpbnNlcnQgZ2x1ZS4gIElmIHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZQorCQkgZ2l2ZW4gYSBjbGFzcyBvZiBDX0VYVCBhbmQgc28gd2Ugd2lsbCBnZW5lcmF0ZSBhIHN0dWIKKwkJIGZvciBpdC4gIFRoaXMgaXMgbm90IHJlYWxseSBhIHByb2JsZW0sIHNpbmNlIHRoZSBsaW5rCisJCSBpcyBkb29tZWQgYW55d2F5LiAgKi8KKworCSAgICAgIHN3aXRjaCAoaC0+Y2xhc3MpCisJCXsKKwkJY2FzZSBDX0VYVDoKKwkJY2FzZSBDX1NUQVQ6CisJCWNhc2UgQ19MQUJFTDoKKwkJICByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIDsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmIC8qICEgQ09GRl9XSVRIX1BFICovCisKKyNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgCQljb2ZmX2FybV9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gCQkJY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIAkJY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHgJCQljb2ZmX2FybV9hZGp1c3Rfc3ltbmR4CisjZGVmaW5lIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIAkJY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuCisjZGVmaW5lIGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0CQljb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQKKyNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCQljb2ZmX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgICAgICBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgICAgICAgICBjb2ZmX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQkJY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorCisKKy8qIFdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2Ugd2FudCB0byBjb252ZXJ0IEFSTTI2IHJlbG9jcworICAgaW50byBBUk0yNkQgcmVsb2NzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfYXJtX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQorICAgICBiZmQgKm9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmliZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKKyAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOworeworICBpZiAoaXJlbC0+cl90eXBlID09IDMpCisgICAgeworICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaWJmZClbaXJlbC0+cl9zeW1uZHhdOworICAgICAgaWYgKGggIT0gTlVMTAorCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBzZWMtPm91dHB1dF9zZWN0aW9uKQorCWlyZWwtPnJfdHlwZSA9IDc7CisgICAgfQorICAqYWRqdXN0ZWRwID0gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvKiBDYWxsZWQgd2hlbiBtZXJnaW5nIHRoZSBwcml2YXRlIGRhdGEgYXJlYXMgb2YgdHdvIEJGRHMuCisgICBUaGlzIGlzIGltcG9ydGFudCBhcyBpdCBhbGxvd3MgdXMgdG8gZGV0ZWN0IGlmIHdlIGFyZQorICAgYXR0ZW1wdGluZyB0byBtZXJnZSBiaW5hcmllcyBjb21waWxlZCBmb3IgZGlmZmVyZW50IEFSTQorICAgdGFyZ2V0cywgZWcgZGlmZmVyZW50IENQVXMgb3IgZGlmZmVyZW50cyBBUENTJ3MuICAgICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICogICBpYmZkOworICAgICBiZmQgKiAgIG9iZmQ7Cit7CisgIEJGRF9BU1NFUlQgKGliZmQgIT0gTlVMTCAmJiBvYmZkICE9IE5VTEwpOworCisgIGlmIChpYmZkID09IG9iZmQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSWYgdGhlIHR3byBmb3JtYXRzIGFyZSBkaWZmZXJlbnQgd2UgY2Fubm90IG1lcmdlIGFueXRoaW5nLgorICAgICBUaGlzIGlzIG5vdCBhbiBlcnJvciwgc2luY2UgaXQgaXMgcGVybWlzc2FibGUgdG8gY2hhbmdlIHRoZQorICAgICBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMuICAqLworICBpZiAoICAgaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgorICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBWZXJpZnkgdGhhdCB0aGUgQVBDUyBpcyB0aGUgc2FtZSBmb3IgdGhlIHR3byBCRkRzICovCisgIGlmIChBUENTX1NFVCAoaWJmZCkpCisgICAgeworICAgICAgaWYgKEFQQ1NfU0VUIChvYmZkKSkKKwl7CisJICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IEFQQ1MgZmxhZyBiaXRzIHNldCwgZmFpbC4gICovCisJICBpZiAoQVBDU18yNl9GTEFHIChvYmZkKSAhPSBBUENTXzI2X0ZMQUcgKGliZmQpKQorCSAgICB7CisJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCisJCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLworCQkoXygiJXM6IEVSUk9SOiBjb21waWxlZCBmb3IgQVBDUy0lZCB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIEFQQ1MtJWQiKSwKKwkJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBBUENTXzI2X0ZMQUcgKGliZmQpID8gMjYgOiAzMiwKKwkJIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBBUENTXzI2X0ZMQUcgKG9iZmQpID8gMjYgOiAzMgorCQkgKTsKKworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgCisJICBpZiAoQVBDU19GTE9BVF9GTEFHIChvYmZkKSAhPSBBUENTX0ZMT0FUX0ZMQUcgKGliZmQpKQorCSAgICB7CisJICAgICAgY29uc3QgY2hhciAqbXNnOworCisJICAgICAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkpCisJCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLworCQltc2cgPSBfKCIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gZmxvYXQgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgaW50ZWdlciByZWdpc3RlcnMiKTsKKwkgICAgICBlbHNlCisJCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLworCQltc2cgPSBfKCIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gaW50ZWdlciByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBmbG9hdCByZWdpc3RlcnMiKTsKKwkgICAgICAKKwkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCisJCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIAorCSAgaWYgKFBJQ19GTEFHIChvYmZkKSAhPSBQSUNfRkxBRyAoaWJmZCkpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICogbXNnOworCisJICAgICAgaWYgKFBJQ19GTEFHIChpYmZkKSkKKwkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCisJCW1zZyA9IF8oIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgYWJzb2x1dGUgcG9zaXRpb24iKTsKKwkgICAgICBlbHNlCisJCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLworCQltc2cgPSBfKCIlczogRVJST1I6IGNvbXBpbGVkIGFzIGFic29sdXRlIHBvc2l0aW9uIGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzIHBvc2l0aW9uIGluZGVwZW5kZW50Iik7CisJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAorCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOworCisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIFNFVF9BUENTX0ZMQUdTIChvYmZkLCBBUENTXzI2X0ZMQUcgKGliZmQpIHwgQVBDU19GTE9BVF9GTEFHIChpYmZkKSB8IFBJQ19GTEFHIChpYmZkKSk7CisJICAKKwkgIC8qIFNldCB1cCB0aGUgYXJjaCBhbmQgZmllbGRzIGFzIHdlbGwgYXMgdGhlc2UgYXJlIHByb2JhYmx5IHdyb25nLiAgKi8KKwkgIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLCBiZmRfZ2V0X21hY2ggKGliZmQpKTsKKwl9CisgICAgfQorCisgIC8qIENoZWNrIHRoZSBpbnRlcndvcmtpbmcgc3VwcG9ydC4gICovCisgIGlmIChJTlRFUldPUktfU0VUIChpYmZkKSkKKyAgICB7CisgICAgICBpZiAoSU5URVJXT1JLX1NFVCAob2JmZCkpCisJeworCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBkaWZmZXIgaW4gdGhlaXIgaW50ZXJ3b3JraW5nIGlzc3VlIGEgd2FybmluZy4gICovCisJICBpZiAoSU5URVJXT1JLX0ZMQUcgKG9iZmQpICE9IElOVEVSV09SS19GTEFHIChpYmZkKSkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKiBtc2c7CisKKwkgICAgICBpZiAoSU5URVJXT1JLX0ZMQUcgKGliZmQpKQorCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KKwkJbXNnID0gXygiV2FybmluZzogaW5wdXQgZmlsZSAlcyBzdXBwb3J0cyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcyBub3QuIik7CisJICAgICAgZWxzZQorCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KKwkJbXNnID0gXygiV2FybmluZzogaW5wdXQgZmlsZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzLiIpOworCSAgICAgIAorCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKKwkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBTRVRfSU5URVJXT1JLX0ZMQUcgKG9iZmQsIElOVEVSV09SS19GTEFHIChpYmZkKSk7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZC4gICovCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCisgICAgIGJmZCAqICAgYWJmZDsKKyAgICAgUFRSICAgICBwdHI7Cit7CisgIEZJTEUgKiBmaWxlID0gKEZJTEUgKikgcHRyOworICAKKyAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKKyAgCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAleDoiKSwgY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MpOworICAKKyAgaWYgKEFQQ1NfU0VUIChhYmZkKSkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDogQVBDUyBpcyBBUk0gUHJvZGVjdXJlIENhbGwgU3RhbmRhcmQsIGl0IHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gICovCisgICAgICBmcHJpbnRmIChmaWxlLCAiIFtBUENTLSVkXSIsIEFQQ1NfMjZfRkxBRyAoYWJmZCkgPyAyNiA6IDMyKTsKKworICAgICAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAoYWJmZCkpCisJZnByaW50ZiAoZmlsZSwgXygiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iKSk7CisgICAgICBlbHNlCisJZnByaW50ZiAoZmlsZSwgXygiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIpKTsKKworICAgICAgaWYgKFBJQ19GTEFHIChhYmZkKSkKKwlmcHJpbnRmIChmaWxlLCBfKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmIChmaWxlLCBfKCIgW2Fic29sdXRlIHBvc2l0aW9uXSIpKTsKKyAgICB9CisgIAorICBpZiAoISBJTlRFUldPUktfU0VUIChhYmZkKSkKKyAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBmbGFnIG5vdCBpbml0aWFsaXNlZF0iKSk7CisgIGVsc2UgaWYgKElOVEVSV09SS19GTEFHIChhYmZkKSkKKyAgICBmcHJpbnRmIChmaWxlLCBfKCIgW2ludGVyd29ya2luZyBzdXBwb3J0ZWRdIikpOworICBlbHNlCisgICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgbm90IHN1cHBvcnRlZF0iKSk7CisgIAorICBmcHV0YyAoJ1xuJywgZmlsZSk7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBDb3BpZXMgdGhlIGdpdmVuIGZsYWdzIGludG8gdGhlIGNvZmZfdGRhdGEuZmxhZ3MgZmllbGQuCisgICBUeXBpY2FsbHkgdGhlc2UgZmxhZ3MgY29tZSBmcm9tIHRoZSBmX2ZsYWdzW10gZmllbGQgb2YKKyAgIHRoZSBDT0ZGIGZpbGVoZHIgc3RydWN0dXJlLCB3aGljaCBjb250YWlucyBpbXBvcnRhbnQsCisgICB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgICBOb3RlOiBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIHN0YXRpYywgaXQgaXMgZXhwbGljaXRseQorICAgY2FsbGVkIGZyb20gYm90aCBjb2ZmY29kZS5oIGFuZCBwZWljb2RlLmguICAqLworCitzdGF0aWMgYm9vbGVhbgorX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCisJYmZkICoJICAgYWJmZDsKKwlmbGFnd29yZCAgIGZsYWdzOworeworICBmbGFnd29yZCBmbGFnOworCisgIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCk7CisKKyAgZmxhZyA9IChmbGFncyAmIEZfQVBDUzI2KSA/IEZfQVBDU18yNiA6IDA7CisgIAorICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQVBDUyBmaWVsZCBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgdG8gdGhlIG9wcG9zaXRlCisgICAgIHZhbHVlLiAgKi8KKyAgaWYgKEFQQ1NfU0VUIChhYmZkKQorICAgICAgJiYgKCAgIChBUENTXzI2X0ZMQUcgICAgKGFiZmQpICE9IGZsYWcpCisJICB8fCAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSAhPSAoZmxhZ3MgJiBGX0FQQ1NfRkxPQVQpKQorCSAgfHwgKFBJQ19GTEFHICAgICAgICAoYWJmZCkgIT0gKGZsYWdzICYgRl9QSUNfSU5UID8gRl9QSUMgOiAwKSkKKwkgICkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZsYWcgfD0gKGZsYWdzICYgKEZfQVBDU19GTE9BVCB8IEZfUElDKSk7CisgIAorICBTRVRfQVBDU19GTEFHUyAoYWJmZCwgZmxhZyk7CisKKyAgZmxhZyA9IChmbGFncyAmIEZfSU5URVJXT1JLKTsKKyAgCisgIC8qIElmIHRoZSBCRkQgaGFzIGFscmVhZHkgaGFkIGl0cyBpbnRlcndvcmtpbmcgZmxhZyBzZXQsIGJ1dCBpdAorICAgICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgdGhhdCB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gc2V0LAorICAgICB0aGVuIGFzc3VtZSB0aGF0IHRoYXQgbWVyZ2VkIGNvZGUgd2lsbCBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcKKyAgICAgYW5kIHNldCB0aGUgZmxhZyBhY2NvcmRpbmdseS4gICovCisgIGlmIChJTlRFUldPUktfU0VUIChhYmZkKSAmJiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpICE9IGZsYWcpKQorICAgIHsKKyAgICAgIGlmIChmbGFnKQorCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLworCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKKwkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBlbHNlCisJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCisJX2JmZF9lcnJvcl9oYW5kbGVyIChfKCJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAorCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIGZsYWcgPSAwOworICAgIH0KKworICBTRVRfSU5URVJXT1JLX0ZMQUcgKGFiZmQsIGZsYWcpOworCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIENvcHkgdGhlIGltcG9ydGFudCBwYXJ0cyBvZiB0aGUgdGFyZ2V0IHNwZWNpZmljIGRhdGEKKyAgIGZyb20gb25lIGluc3RhbmNlIG9mIGEgQkZEIHRvIGFub3RoZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCisgICAgIGJmZCAqICBzcmM7CisgICAgIGJmZCAqICBkZXN0OworeworICBCRkRfQVNTRVJUIChzcmMgIT0gTlVMTCAmJiBkZXN0ICE9IE5VTEwpOworIAorICBpZiAoc3JjID09IGRlc3QpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG5vdCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHNvdXJjZSwgZG8gbm90IGRvCisgICAgIHRoZSBjb3B5LiAgKi8KKyAgaWYgKHNyYy0+eHZlYyAhPSBkZXN0LT54dmVjKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIGNvcHkgdGhlIGZsYWdzIGZpZWxkICovCisgIGlmIChBUENTX1NFVCAoc3JjKSkKKyAgICB7CisgICAgICBpZiAoQVBDU19TRVQgKGRlc3QpKQorCXsKKwkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KKwkgIGlmIChBUENTXzI2X0ZMQUcgKGRlc3QpICE9IEFQQ1NfMjZfRkxBRyAoc3JjKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgCisJICBpZiAoQVBDU19GTE9BVF9GTEFHIChkZXN0KSAhPSBBUENTX0ZMT0FUX0ZMQUcgKHNyYykpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIAorCSAgaWYgKFBJQ19GTEFHIChkZXN0KSAhPSBQSUNfRkxBRyAoc3JjKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwlTRVRfQVBDU19GTEFHUyAoZGVzdCwgQVBDU18yNl9GTEFHIChzcmMpIHwgQVBDU19GTE9BVF9GTEFHIChzcmMpCisJCQl8IFBJQ19GTEFHIChzcmMpKTsKKyAgICB9CisKKyAgaWYgKElOVEVSV09SS19TRVQgKHNyYykpCisgICAgeworICAgICAgaWYgKElOVEVSV09SS19TRVQgKGRlc3QpKQorCXsKKwkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzIHRoZW4gdHVybgorCSAgICAgb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KKwkgIGlmIChJTlRFUldPUktfRkxBRyAoZGVzdCkgIT0gSU5URVJXT1JLX0ZMQUcgKHNyYykpCisJICAgIHsKKwkgICAgICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpKQorCQl7CisJCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkJICBfYmZkX2Vycm9yX2hhbmRsZXIgKCgiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBiaXQgb2YgJXMsIGJlY2F1c2UgdGhlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBjb3BpZWQgaW50byBpdCIpLAorCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGRlc3QpLAorCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHNyYykpOworCQl9CisJICAgICAgCisJICAgICAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCAwKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBTRVRfSU5URVJXT1JLX0ZMQUcgKGRlc3QsIElOVEVSV09SS19GTEFHIChzcmMpKTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBOb3RlOiAgdGhlIGRlZmluaXRpb25zIGhlcmUgb2YgTE9DQUxfTEFCRUxfUFJFRklYIGFuZCBVU0VSX0xBQkVMX1BSRUlGWAorICptdXN0KiBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gZ2NjL2NvbmZpZy9hcm0vY29mZi5oIGFuZCBzZW1pLmggKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxfUFJFRklYICIuIgorI2lmbmRlZiBVU0VSX0xBQkVMX1BSRUZJWAorI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAiXyIKKyNlbmRpZgorCitzdGF0aWMgYm9vbGVhbgorY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICogICAgICAgIGFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKiBuYW1lOworeworI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAorICAvKiBJZiB0aGVyZSBpcyBhIHByZWZpeCBmb3IgbG9jYWwgbGFiZWxzIHRoZW4gbG9vayBmb3IgdGhpcy4KKyAgICAgSWYgdGhlIHByZWZpeCBleGlzdHMsIGJ1dCBpdCBpcyBlbXB0eSwgdGhlbiBpZ25vcmUgdGhlIHRlc3QuICovCisgIAorICBpZiAoTE9DQUxfTEFCRUxfUFJFRklYWzBdICE9IDApCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIExPQ0FMX0xBQkVMX1BSRUZJWCwgc3RybGVuIChMT0NBTF9MQUJFTF9QUkVGSVgpKSA9PSAwKQorCXJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgorI2lmZGVmIFVTRVJfTEFCRUxfUFJFRklYCisgIGlmIChVU0VSX0xBQkVMX1BSRUZJWFswXSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wIChuYW1lLCBVU0VSX0xBQkVMX1BSRUZJWCwgc3RybGVuIChVU0VSX0xBQkVMX1BSRUZJWCkpID09IDApCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorICAKKyAgLyogZGV2by9nY2MvY29uZmlnL2RieGNvZmYuaCBkZWZpbmVzIEFTTV9PVVRQVVRfU09VUkNFX0xJTkUgdG8gZ2VuZXJhdGUKKyAgICAgbG9jYWwgbGluZSBudW1iZXJzIGFzIC5MTTxudW1iZXI+LCBzbyB0cmVhdCB0aGVzZSBhcyBsb2NhbC4gICovCisgIAorICBzd2l0Y2ggKG5hbWVbMF0pCisgICAgeworICAgIGNhc2UgJ0wnOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlICcuJzogcmV0dXJuIChuYW1lWzFdID09ICdMJyAmJiBuYW1lWzJdID09ICdNJykgPyB0cnVlIDogZmFsc2U7CisgICAgZGVmYXVsdDogIHJldHVybiBmYWxzZTsgICAgIC8qIENhbm5vdCBtYWtlIG91ciBtaW5kcyB1cCAtIGRlZmF1bHQgdG8KKwkJCQkgICBmYWxzZSBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIHN0cmlwcGVkCisJCQkJICAgYnkgYWNjaWRlbnQuICAqLyAKKyAgICB9Cit9CisKKy8qIFRoaXMgcGllY2Ugb2YgbWFjaGluZXJ5IGV4aXN0cyBvbmx5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBiZmQgdGhhdCBob2xkcworICAgdGhlIGdsdWUgc2VjdGlvbiBpcyB3cml0dGVuIGxhc3QuIAorCisgICBUaGlzIGRvZXMgZGVwZW5kIG9uIGJmZF9tYWtlX3NlY3Rpb24gYXR0YWNoaW5nIGEgbmV3IHNlY3Rpb24gdG8gdGhlCisgICBlbmQgb2YgdGhlIHNlY3Rpb24gbGlzdCBmb3IgdGhlIGJmZC4gCisKKyAgIGtya0BjeWdudXMuY29tICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuIChzdWIsIGluZm8pCisgICAgIGJmZCAqIHN1YjsKKyAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogaW5mbzsKK3sKKyAgcmV0dXJuIChzdWItPm91dHB1dF9oYXNfYmVndW4KKwkgIHx8IHN1YiA9PSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvLT5pbmZvKS0+YmZkX29mX2dsdWVfb3duZXIpOworfQorCitzdGF0aWMgYm9vbGVhbgorY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCBwZmluZm8pCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbzsKK3sKKyAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7CisKKyAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKHBmaW5mby0+aW5mbyk7CisgIAorICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOworICAKKyAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChwZmluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKKyAgICB9CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIDAKKyNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiAgYXJtX2JmZF9jb2ZmX3N3YXBfc3ltX2luCisKK3N0YXRpYyB2b2lkIGNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CisKKy8qIFNlcGNpYWwgdmVyc2lvbiBvZiBzeW1ib2wgc3dhcHBlciwgdXNlZCB0byBncmFiIGEgYmZkCisgICBvbnRvIHdoaWNoIHRoZSBnbHVlIHNlY3Rpb25zIGNhbiBiZSBhdHRhY2hlZC4gICovCitzdGF0aWMgdm9pZAorYXJtX2JmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIFBUUiAgIGV4dDE7CisgICAgIFBUUiAgIGluMTsKK3sKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIHJlZ2lzdGVyIGFzZWN0aW9uICogczsKKworICAvKiBEbyB0aGUgbm9ybWFsIHN3YXAgaW4uICAqLworICBjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpOworCisgIGlmIChiZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKSAvKiB3ZSBhbHJlYWR5IGhhdmUgYSB0b2MsIHNvIGdvIGhvbWUgKi8KKyAgICByZXR1cm47CisKKyAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uLiAgKi8KKyAgYmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX2dsdWVfb3duZXIgLCAKKwkJCSAgICAgICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOworCisgIGlmIChzID09IE5VTEwpIAorICAgIHsKKyAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7CisgICAgICAKKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChiZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKKworICAgICAgaWYgKHMgPT0gTlVMTAorCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYmZkX29mX2dsdWVfb3duZXIsIHMsIGZsYWdzKQorCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGJmZF9vZl9nbHVlX293bmVyLCBzLCAyKSkKKwl7CisJICAvKiBGSVhNRTogc2V0IGFwcHJvcHJpYXRlIGJmZCBlcnJvciAqLworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7CisKKyAgaWYgKHMgPT0gTlVMTCkgCisgICAgeworICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIDsKKyAgICAgIAorICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworICAgICAgCisgICAgICBpZiAocyA9PSBOVUxMCisJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgZmxhZ3MpCisJICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYmZkX29mX2dsdWVfb3duZXIsIHMsIDIpKQorCXsKKwkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yIGtya0BjeWdudXMuY29tICovCisJICBhYm9ydCgpOworCX0KKyAgICB9CisgIAorICByZXR1cm47Cit9CisjZW5kaWYKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKK2NvbnN0IGJmZF90YXJnZXQKKyNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQorVEFSR0VUX0xJVFRMRV9TWU0gPQorI2Vsc2UKK2FybWNvZmZfbGl0dGxlX3ZlYyA9CisjZW5kaWYKK3sKKyNpZmRlZiBUQVJHRVRfTElUVExFX05BTUUKKyAgVEFSR0VUX0xJVFRMRV9OQU1FLAorI2Vsc2UKKyAgImNvZmYtYXJtLWxpdHRsZSIsCisjZW5kaWYKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKworI2lmbmRlZiBDT0ZGX1dJVEhfUEUKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyNlbHNlCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLworICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCisgIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisjZWxzZQorICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyNlbmRpZgorICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLworCisvKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLworICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCisgICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgICBiZmRfZmFsc2V9LAorICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSAmIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlLAorfTsKKworY29uc3QgYmZkX3RhcmdldAorI2lmZGVmIFRBUkdFVF9CSUdfU1lNCitUQVJHRVRfQklHX1NZTSA9CisjZWxzZQorYXJtY29mZl9iaWdfdmVjID0KKyNlbmRpZgoreworI2lmZGVmIFRBUkdFVF9CSUdfTkFNRQorICBUQVJHRVRfQklHX05BTUUsCisjZWxzZQorICAiY29mZi1hcm0tYmlnIiwKKyNlbmRpZgorICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorCisjaWZuZGVmIENPRkZfV0lUSF9QRQorICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworI2Vsc2UKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCisgICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKKyAgVEFSR0VUX1VOREVSU0NPUkUsCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyNlbHNlCisgIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworI2VuZGlmCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisKKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCisKKy8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCisgICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBjb2ZmX29iamVjdF9wfSwKKyAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICAgIGJmZF9mYWxzZX0sCisgICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpICYgYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXV4LmMgYi9iZmQvY29mZi1hdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTY2MzkyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtYXV4LmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgTTY4SyBDT0ZGIEEvVVggMy54IGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX1NZTQltNjhrYXV4X2NvZmZfdmVjCisjZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstYXV4IgorCisjaWZuZGVmIFRBUkdfQVVYCisjZGVmaW5lIFRBUkdfQVVYCisjZW5kaWYKKworI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCisKKy8qIDRrIHBhZ2VzICovCisjZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAorCisvKiBPbiBBVVgsIGEgU1RZUF9OT0xPQUR8U1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkIGxpYnJhcnkuICovCisjZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKKworI2RlZmluZSBTVEFUSUNfUkVMT0NTCisKKyNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworc3RhdGljIGJvb2xlYW4gY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCAKKyAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLCAKKyAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKKworI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sCisKKyNpbmNsdWRlICJjb2ZmL2F1eC1jb2ZmLmgiICAvKiBvdmVycmlkZSBjb2ZmL2ludGVybmFsLmggYW5kIGNvZmYvbTY4ay5oICovCisjaW5jbHVkZSAiY29mZi1tNjhrLmMiCisKKy8qIFdlIG5lZWQgbm9uLWFic29sdXRlIHN5bWJvbHMgdG8gb3ZlcnJpZGUgYWJzb2x1dGUgc3ltYm9scy4gIFRoaXMKKyAgIG1pcnJvcnMgQXBwbGUncyAic29sdXRpb24iIHRvIGxldCBhIHN0YXRpYyBsaWJyYXJ5IHN5bWJvbCBvdmVycmlkZQorICAgYSBzaGFyZWQgbGlicmFyeSBzeW1ib2wuICBPbiB0aGUgd2hvbGUgbm90IGEgZ29vZCB0aGluZywgZ2l2ZW4gaG93CisgICBzaGFyZWQgbGlicmFyaWVzIHdvcmsgaGVyZSwgYnV0IGNhbiB3b3JrIGlmIHlvdSBhcmUgY2FyZWZ1bCB3aXRoCisgICB3aGF0IHlvdSBpbmNsdWRlIGluIHRoZSBzaGFyZWQgb2JqZWN0LiAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCisJCQkJICAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGJvb2xlYW4gY29weTsKKyAgICAgYm9vbGVhbiBjb2xsZWN0OworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICBpZiAoKGZsYWdzICYgKEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SIHwgQlNGX1dFQUspKSA9PSAwICYmCisgICAgICAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSAmJgorICAgICAgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCisgICAgeworICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgYSBkZWZpbml0aW9uIG9yIGFuIGluZGlyZWN0IGRlZmluaXRpb24gKi8KKworICAgICAgLyogVGhpcyBiaXQgY29waWVkIGZyb20gbGlua2VyLmMgKi8KKyAgICAgIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQorCXsKKwkgIGggPSAqaGFzaHA7CisJICBCRkRfQVNTRVJUIChzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCBuYW1lKSA9PSAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCB0cnVlLCBjb3B5LCBmYWxzZSk7CisJICBpZiAoaCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCisJCSpoYXNocCA9IE5VTEw7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICBpZiAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCisJICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQorCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpCisJeworCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPm5vdGljZSkgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKKwkqaGFzaHAgPSBoOworICAgICAgLyogZW5kIGR1cGxpY2F0aW9uIGZyb20gbGlua2VyLmMgKi8KKworICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCisJeworCSAgYXNlY3Rpb24gKm1zZWM7CisKKwkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKKwkgICAgbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247CisJICBlbHNlCisJICAgIG1zZWMgPSBiZmRfaW5kX3NlY3Rpb25fcHRyOworCisJICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKSAmJiAhYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKSkKKwkgICAgeworCSAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOworCSAgICAgIGgtPnUuZGVmLnZhbHVlID0gdmFsdWU7CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKwkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykpCisJICAgIHJldHVybiB0cnVlOworCX0KKyAgICB9CisKKyAgLyogSWYgd2UgZGlkbid0IGV4aXQgZWFybHksIGZpbmlzaCBwcm9jZXNzaW5nIGluIHRoZSBnZW5lcmljIHJvdXRpbmUgKi8KKyAgcmV0dXJuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKKwkJCQkJICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKKwkJCQkJICAgaGFzaHApOworfQpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtZ28zMi5jIGIvYmZkL2NvZmYtZ28zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNGFkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi1nbzMyLmMKQEAgLTAsMCArMSwyNSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcyAoZ28zMiB2YXJpYW50KS4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBESiBEZWxvcmllLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX1NZTQkJZ28zMmNvZmZfdmVjCisjZGVmaW5lIFRBUkdFVF9OQU1FCQkiY29mZi1nbzMyIgorI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRQknXycKKworI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDgzMDAuYyBiL2JmZC9jb2ZmLWg4MzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhNGVjMwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLWg4MzAwLmMKQEAgLTAsMCArMSwxMzg4IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvMzAwIENPRkYgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJnZW5saW5rLmgiCisjaW5jbHVkZSAiY29mZi9oODMwMC5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKKyNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQorCisvKiBXZSBkZXJpdmUgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGJhc2ljIEJGRCBoYXNoIHRhYmxlIHRvCisgICBob2xkIGVudHJpZXMgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEFzaWRlIGZyb20gdGhlIAorICAgaW5mbyBzdG9yZWQgYnkgdGhlIGJhc2ljIGhhc2ggdGFibGUsIHdlIG5lZWQgdGhlIG9mZnNldAorICAgb2YgYSBwYXJ0aWN1bGFyIGVudHJ5IHdpdGhpbiB0aGUgaGFzaCB0YWJsZSBhcyB3ZWxsIGFzCisgICB0aGUgb2Zmc2V0IHdoZXJlIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCisKK3N0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkKK3sKKyAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUgZW50cnkuICAqLworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKKworICAvKiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgdmVjdG9ycyBzZWN0aW9uIHdoZXJlCisgICAgIHRoaXMgZW50cnkgbGl2ZXMuICAqLworICBiZmRfdm1hIG9mZnNldDsKK307CisKK3N0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUKK3sKKyAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUuICAqLworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKKworICBiZmQgKmFiZmQ7CisKKyAgLyogT2Zmc2V0IGF0IHdoaWNoIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCisgIHVuc2lnbmVkIGludCBvZmZzZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK2Z1bmN2ZWNfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyBib29sZWFuCitmdW5jdmVjX2hhc2hfdGFibGVfaW5pdAorICBQQVJBTVMgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICosIGJmZCAqLAorICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpKSk7CisKKy8qIFRvIGxvb2t1cCBhIHZhbHVlIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCisjZGVmaW5lIGZ1bmN2ZWNfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCisgICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKSBcCisgICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCisKKy8qIFRoZSBkZXJpdmVkIGg4MzAwIENPRkYgbGlua2VyIHRhYmxlLiAgTm90ZSBpdCdzIGRlcml2ZWQgZnJvbQorICAgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUsIG5vdCB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBoYXNoCisgICB0YWJsZSEgIFdlIHVzZSB0aGlzIHRvIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEgc3RydWN0dXJlcyB3ZQorICAgbmVlZCB3aGlsZSBsaW5raW5nIG9uIHRoZSBoODMwMC4gICovCitzdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUKK3sKKyAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCisgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSByb290OworCisgIC8qIFNlY3Rpb24gZm9yIHRoZSB2ZWN0b3JzIHRhYmxlLiAgVGhpcyBnZXRzIGF0dGFjaGVkIHRvIGEKKyAgICAgcmFuZG9tIGlucHV0IGJmZCwgd2Uga2VlcCBpdCBoZXJlIGZvciBlYXN5IGFjY2Vzcy4gICovCisgIGFzZWN0aW9uICp2ZWN0b3JzX3NlYzsKKworICAvKiBIYXNoIHRhYmxlIG9mIHRoZSBmdW5jdGlvbnMgd2UgbmVlZCB0byBlbnRlciBpbnRvIHRoZSBmdW5jdGlvbgorICAgICB2ZWN0b3IuICAqLworICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Cit9OworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworCisvKiBHZXQgdGhlIEg4LzMwMCBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBoODMwMF9jb2ZmX2hhc2hfdGFibGUocCkgXAorICAoKHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKGNvZmZfaGFzaF90YWJsZSAocCkpKSkKKworLyogSW5pdGlhbGl6ZSBmaWVsZHMgd2l0aGluIGEgZnVuY3ZlYyBoYXNoIHRhYmxlIGVudHJ5LiAgQ2FsbGVkIHdoZW5ldmVyCisgICBhIG5ldyBlbnRyeSBpcyBhZGRlZCB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitmdW5jdmVjX2hhc2hfbmV3ZnVuYyAoZW50cnksIGdlbl90YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmdlbl90YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpyZXQ7CisgIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKnRhYmxlOworCisgIHJldCA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIGVudHJ5OworICB0YWJsZSA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICopIGdlbl90YWJsZTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQorICAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoZ2VuX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikKKyAgICAgICAgIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCBnZW5fdGFibGUsIHN0cmluZykpOworCisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBOb3RlIHdoZXJlIHRoaXMgZW50cnkgd2lsbCByZXNpZGUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCisgIHJldC0+b2Zmc2V0ID0gdGFibGUtPm9mZnNldDsKKworICAvKiBCdW1wIHRoZSBvZmZzZXQgYXQgd2hpY2ggd2Ugc3RvcmUgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24KKyAgICAgdmVjdG9yLiAgV2UnZCBsaWtlIHRvIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbiwKKyAgICAgYnV0IGl0J3Mgbm90IGVhc2lseSBhdmFpbGFibGUgaGVyZS4gICovCisgIGlmIChiZmRfZ2V0X21hY2ggKHRhYmxlLT5hYmZkKSA9PSBiZmRfbWFjaF9oODMwMCkKKyAgICB0YWJsZS0+b2Zmc2V0ICs9IDI7CisgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAorCSAgIHx8IGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKKyAgICB0YWJsZS0+b2Zmc2V0ICs9IDQ7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBFdmVyeXRoaW5nIHdlbnQgT0suICAqLworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2Z1bmN2ZWNfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKKyAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICopKTsKK3sKKyAgLyogSW5pdGlhbGl6ZSBvdXIgbG9jYWwgZmllbGRzLCB0aGVuIGNhbGwgdGhlIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24KKyAgICAgcm91dGluZS4gICovCisgIHRhYmxlLT5vZmZzZXQgPSAwOworICB0YWJsZS0+YWJmZCA9IGFiZmQ7CisgIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Cit9CisKKy8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSBhIGRlcml2ZWQgaGFzaCB0YWJsZQorICAgYmFzaWNhbGx5IHRvIGhvbGQgInN0YXRpYyIgaW5mb3JtYXRpb24gZHVyaW5nIGFuIGg4LzMwMCBjb2ZmIGxpbmsKKyAgIHdpdGhvdXQgdXNpbmcgc3RhdGljIHZhcmlhYmxlcy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7CisgIHJldCA9ICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopCisgICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdC5yb290LCBhYmZkLCBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEluaXRpYWxpemUgb3VyIGRhdGEuICAqLworICByZXQtPnZlY3RvcnNfc2VjID0gTlVMTDsKKyAgcmV0LT5mdW5jdmVjX2hhc2hfdGFibGUgPSBOVUxMOworCisgIC8qIE9LLiAgRXZlcnl0aGluZydzIGludGlhbGl6ZWQsIHJldHVybiB0aGUgYmFzZSBwb2ludGVyLiAgKi8KKyAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKK30KKworLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgSDgvMzAwIHJlbG9jcy4KKyAgIFdlIG9ubHkgY29tZSBoZXJlIGZvciBwY3JlbCBzdHVmZiBhbmQgcmV0dXJuIG5vcm1hbGx5IGlmIG5vdCBhbiAtciBsaW5rLgorICAgV2hlbiBkb2luZyAtciwgd2UgY2FuJ3QgZG8gYW55IGFyaXRobWV0aWMgZm9yIHRoZSBwY3JlbCBzdHVmZiwgYmVjYXVzZQorICAgdGhlIGNvZGUgaW4gcmVsb2MuYyBhc3N1bWVzIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIHRhcmdldHMgb2YKKyAgIHRoZSBwY3JlbCBicmFuY2hlcy4gIFRoaXMgaXNuJ3Qgc28sIHNpbmNlIHRoZSBIOC8zMDAgY2FuIGRvIHJlbGF4aW5nLCAKKyAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdhcCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBlbm91Z2ggdG8KKyAgIGNvbnRhaW4gdGhlIG9mZnNldCByZXF1aXJlZCBmb3IgdGhlIGJyYW5jaCwgc28gd2UgaGF2ZSB0byB1c2UgdGhlIG9ubHkKKyAgIHRoZSBhZGRlbmQgdW50aWwgdGhlIGZpbmFsIGxpbmsgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorc3BlY2lhbCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKKwkJIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KK3sKKyAgSE9XVE8gKFJfUkVMQllURSwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNiIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPIChSX1BDUkJZVEUsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAorICBIT1dUTyAoUl9QQ1JXT1JELCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAorICBIT1dUTyAoUl9QQ1JMT05HLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAorICBIT1dUTyAoUl9NT1YxNkIxLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhhYmxlIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKFJfTU9WMTZCMiwgMCwgMSwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBtb3YuYjoxNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChSX0pNUDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNi9wY3JlbCIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPIChSX0pNUDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjcmVjbC8xNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChSX0pNUEwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMjQvcGNyZWxsIiwgZmFsc2UsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKFJfSk1QTDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjOC8yNCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChSX01PVjI0QjEsIDAsIDEsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MjQiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAorICBIT1dUTyAoUl9NT1YyNEIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjI0IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKworICAvKiBBbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbi4gIFRoaXMgY2F1c2VzIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MKKyAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciBpbiBsby1tZW0gYW5kIHB1dHMgdGhlIGFkZHJlc3Mgb2YKKyAgICAgdGhlIGZ1bmN0aW9uIHZlY3RvcidzIGVudHJ5IGluIHRoZSBqc3IgaW5zdHJ1Y3Rpb24uICAqLworICBIT1dUTyAoUl9NRU1fSU5ESVJFQ1QsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjgvaW5kaXJlY3QiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAorCisgIC8qIEludGVybmFsIHJlbG9jIGZvciByZWxheGluZy4gIFRoaXMgaXMgY3JlYXRlZCB3aGVuIGEgMTZiaXQgcGMtcmVsYXRpdmUKKyAgICAgYnJhbmNoIGlzIHR1cm5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KKyAgSE9XVE8gKFJfUENSV09SRF9CLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgYkNDOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKKworICBIT1dUTyAoUl9NT1ZMMSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGVjaWFsLCAiMzIvMjQgcmVsYXhhYmxlIG1vdmUiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAorCisgIEhPV1RPIChSX01PVkwyLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMzIvMjQgcmVsYXhlZCBtb3ZlIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKworICBIT1dUTyAoUl9CQ0NfSU5WLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQOCBpbnZlcnRlZCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKKworICBIT1dUTyAoUl9KTVBfREVMLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJEZWxldGVkIGp1bXAiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCit9OworCisKKy8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIFwKKyAgeyB4LnJfdHlwZSA9IHNlbGVjdF9yZWxvYyhob3d0byk7IH0KKworI2RlZmluZSBCQURNQUcoeCkgKEg4MzAwQkFETUFHKHgpICYmIEg4MzAwSEJBRE1BRyh4KSAmJiBIODMwMFNCQURNQUcoeCkpCisjZGVmaW5lIEg4MzAwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLworI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKworCisKKy8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KKyNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgorI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAorICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKKyAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOworCisKK3N0YXRpYyBpbnQKK3NlbGVjdF9yZWxvYyAoaG93dG8pCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworeworICByZXR1cm4gaG93dG8tPnR5cGU7Cit9CisKKy8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQorICAgKi8KKworc3RhdGljIHZvaWQKK3J0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQorICAgICBhcmVsZW50ICppbnRlcm5hbDsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Cit7CisgIHN3aXRjaCAoZHN0LT5yX3R5cGUpCisgICAgeworICAgIGNhc2UgUl9SRUxCWVRFOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1JFTFdPUkQ6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfUkVMTE9ORzoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9QQ1JCWVRFOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1BDUldPUkQ6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfUENSTE9ORzoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9NT1YxNkIxOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX01PVjE2QjI6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfSk1QMToKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9KTVAyOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0pNUEwxOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9KTVBMMjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfTU9WMjRCMToKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfTU9WMjRCMjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfTUVNX0lORElSRUNUOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9QQ1JXT1JEX0I6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX01PVkwxOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9NT1ZMMjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfQkNDX0lOVjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTg7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfSk1QX0RFTDoKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCisKKworLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLworCisKKyNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAorIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKKworCisjZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCisgcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQorCitzdGF0aWMgdm9pZAorcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKyAgICAgYXJlbGVudCAqIHJlbGVudDsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKKyAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOworICAgICBiZmQgKiBhYmZkOworICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Cit7CisgIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOworICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7CisKKyAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKKyAgICB7CisgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKyAgICB9CisKKworCisgIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OworCisgIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7CisgIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCit9CisKK3N0YXRpYyBib29sZWFuCitoODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfdm1hIGFkZHJlc3M7Cit7CisgIGFzeW1ib2wgKipzOworCisgIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7CisgIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOworCisgIC8qIFNlYXJjaCBhbGwgdGhlIHN5bWJvbHMgZm9yIG9uZSBpbiBJTlBVVF9TRUNUSU9OIHdpdGgKKyAgICAgYWRkcmVzcyBBRERSRVNTLiAgKi8KKyAgd2hpbGUgKCpzKSAKKyAgICB7CisgICAgICBhc3ltYm9sICpwID0gKnM7CisgICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uCisJICAmJiAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCSAgICAgICsgcC0+dmFsdWUpID09IGFkZHJlc3MpCisJcmV0dXJuIHRydWU7CisgICAgICBzKys7CisgICAgfSAgICAKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIElmIFJFTE9DIHJlcHJlc2VudHMgYSByZWxheGFibGUgaW5zdHJ1Y3Rpb24vcmVsb2MsIGNoYW5nZSBpdCBpbnRvCisgICB0aGUgcmVsYXhlZCByZWxvYywgbm90aWZ5IHRoZSBsaW5rZXIgdGhhdCBzeW1ib2wgYWRkcmVzc2VzCisgICBoYXZlIGNoYW5nZWQgKGJmZF9wZXJmb3JtX3NsaXApIGFuZCByZXR1cm4gaG93IG11Y2ggdGhlIGN1cnJlbnQKKyAgIHNlY3Rpb24gaGFzIHNocnVuayBieS4KKworICAgRklYTUU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBrbm93bGVkZ2Ugb2YgdGhlIG9yZGVyaW5nIG9mIGVudHJpZXMKKyAgIGluIHRoZSBob3d0byB0YWJsZS4gIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuICAqLworCitzdGF0aWMgaW50CitoODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIHVuc2lnbmVkIGludCBzaHJpbms7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Cit7CisgIGJmZF92bWEgdmFsdWU7ICAKKyAgYmZkX3ZtYSBkb3Q7CisgIGJmZF92bWEgZ2FwOworICBzdGF0aWMgYXNlY3Rpb24gKmxhc3RfaW5wdXRfc2VjdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBhcmVsZW50ICpsYXN0X3JlbG9jID0gTlVMTDsKKworICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAorICAgICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rIC0gYnV0IHdlIGRvbid0IGNoYW5nZSByZWxvYy0+YWRkcmVzcyBoZXJlLAorICAgICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQorICAgICB1bmNvb2tlZCBzZWN0aW9uLiAgKi8KKyAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7CisKKyAgaWYgKGlucHV0X3NlY3Rpb24gIT0gbGFzdF9pbnB1dF9zZWN0aW9uKQorICAgIGxhc3RfcmVsb2MgPSBOVUxMOworCisgIC8qIE9ubHkgZXhhbWluZSB0aGUgcmVsb2NzIHdoaWNoIG1pZ2h0IGJlIHJlbGF4YWJsZS4gICovCisgIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQorICAgIHsgICAgIAorCisgICAgLyogVGhpcyBpcyB0aGUgMTYvMjQgYml0IGFic29sdXRlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKKyAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLworICAgIGNhc2UgUl9KTVAxOgorICAgIGNhc2UgUl9KTVBMMToKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KKyAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLworICAgICAgZG90ID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3MpOworCisgICAgICAvKiBBZGp1c3QgZm9yIFJfSk1QMSB2cyBSX0pNUEwxLiAgKi8KKyAgICAgIGRvdCArPSAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfSk1QMSA/IDEgOiAyKTsKKworICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLworICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7CisgIAorICAgICAgLyogSWYgdGhlIGRpc3RhbmNlIGlzIHdpdGhpbiAtMTI4Li4rMTI4IGluY2x1c2l2ZSwgdGhlbiB3ZSBjYW4gcmVsYXgKKwkgdGhpcyBqdW1wLiAgKzEyOCBpcyB2YWxpZCBzaW5jZSB0aGUgdGFyZ2V0IHdpbGwgbW92ZSB0d28gYnl0ZXMKKwkgY2xvc2VyIGlmIHdlIGRvIHJlbGF4IHRoaXMgYnJhbmNoLiAgKi8KKyAgICAgIGlmICgoaW50KWdhcCA+PSAtMTI4ICYmIChpbnQpZ2FwIDw9IDEyOCApCisJeyAKKworCSAgLyogSXQncyBwb3NzaWJsZSB3ZSBtYXkgYmUgYWJsZSB0byBlbGltaW5hdGUgdGhpcyBicmFuY2ggZW50aXJlbHk7CisJICAgICBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYXJvdW5kIHRoaXMgaW5zdHJ1Y3Rpb24sCisJICAgICBhbmQgdGhlcmUncyBubyBsYWJlbCBhdCB0aGlzIGluc3RydWN0aW9uLCB0aGVuIHdlIGNhbiByZXZlcnNlCisJICAgICB0aGUgY29uZGl0aW9uIG9uIHRoZSBwcmV2aW91cyBicmFuY2ggYW5kIGVsaW1pbmF0ZSB0aGlzIGp1bXAuCisKKwkgICAgICAgb3JpZ2luYWw6CQkJbmV3OgorCQkgYkNDIGxhYjEJCQliQ0MnIGxhYjIKKwkJIGptcCBsYWIyCisJCWxhYjE6CQkJCWxhYjE6CisJCisJICAgICBUaGlzIHNhdmVzIDQgYnl0ZXMgaW5zdGVhZCBvZiB0d28sIGFuZCBzaG91bGQgYmUgcmVsYXRpdmVseQorCSAgICAgY29tbW9uLiAgKi8KKworCSAgaWYgKGdhcCA8PSAxMjYKKwkgICAgICAmJiBsYXN0X3JlbG9jCisJICAgICAgJiYgbGFzdF9yZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9QQ1JCWVRFKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlOworCSAgICAgIGxhc3RfdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAobGFzdF9yZWxvYywgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pICsgMTsKKworCSAgICAgIGlmIChsYXN0X3ZhbHVlID09IGRvdCArIDIKKwkJICAmJiBsYXN0X3JlbG9jLT5hZGRyZXNzICsgMSA9PSByZWxvYy0+YWRkcmVzcworCQkgICYmICEgaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgZG90IC0gMikpCisJCXsKKwkJICByZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE5OworCQkgIGxhc3RfcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKKwkJICBsYXN0X3JlbG9jLT5zeW1fcHRyX3B0ciA9IHJlbG9jLT5zeW1fcHRyX3B0cjsKKwkJICBsYXN0X3JlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkZW5kOworCQkgIHNocmluayArPSA0OworCQkgIGJmZF9wZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KKwkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCisKKwkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KKwkgIHNocmluayArPSAyOworCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKKwl9CisgICAgICBicmVhazsKKworICAgIC8qIFRoaXMgaXMgdGhlIDE2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0CisgICAgICAgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KKyAgICBjYXNlIFJfUENSV09SRDoKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLCBhZGQgb25lIHRvIHRoZSB2YWx1ZQorICAgICAgICAgYmVjYXVzZSB0aGUgYWRkZW5kIGZpZWxkIGluIFBDcmVsIGp1bXBzIGlzIG9mZiBieSAtMS4gICovCisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pICsgMTsKKwkKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpZiB3ZSB3ZXJlIHRvIHJlbGF4LiAgKi8KKyAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKworCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOworICAKKyAgICAgIC8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBpbnNuIHRvIHRoZSBicmFuY2ggdGFyZ2V0LiAgKi8KKyAgICAgIGdhcCA9IHZhbHVlIC0gZG90OworCisgICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAorCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcworCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLworICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKKwl7IAorCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KKwkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7CisKKwkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KKwkgIHNocmluayArPSAyOworCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKKwl9CisgICAgICBicmVhazsKKworICAgIC8qIFRoaXMgaXMgYSAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iIGluc24sIHdoaWNoIGNhbgorICAgICAgIGJlY29tZSBhbiA4IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KKyAgICBjYXNlIFJfTU9WMTZCMToKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCisgICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmMDAuLjB4ZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwIG9yCisJIDB4ZmZmZjAwLi4weGZmZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwaCwgdGhlbiB3ZSBjYW4KKwkgcmVsYXggdGhpcyBtb3YuYiAgKi8KKyAgICAgIGlmICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMAorCSAgICYmIHZhbHVlID49IDB4ZmYwMAorCSAgICYmIHZhbHVlIDw9IDB4ZmZmZikKKwkgIHx8ICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKKwkgICAgICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCisJICAgICAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKKwkgICAgICAmJiB2YWx1ZSA8PSAweGZmZmZmZikpCisJeworCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KKwkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CisKKwkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KKwkgIHNocmluayArPSAyOworCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKKwl9CisgICAgICBicmVhazsKKworICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iLiAgTm90ZSB0aGF0CisgICAgICAgaWYgd2UgY2FuJ3QgcmVsYXggdGhpcyBpbnRvIGFuIDggYml0IGFic29sdXRlLCB3ZSdsbCBmYWxsIHRocm91Z2gKKyAgICAgICBhbmQgdHJ5IHRvIHJlbGF4IGl0IGludG8gYSAxNmJpdCBhYnNvbHV0ZS4gICovCisgICAgY2FzZSBSX01PVjI0QjE6CisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdi5iIGluc24uICAqLworICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKworICAgICAgLyogVGhlIGFkZHJlc3MgaXMgaW4gMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLAorCSB0aGVuIHdlIGNhbiByZWxheCB0aGlzIG1vdi5iICAqLworICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAorCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQorCSAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKKwkgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKQorCXsKKwkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCisJICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOworCisJICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IGZvdXIgYnl0ZXMuICAqLworCSAgc2hyaW5rICs9IDQ7CisJICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOworCisJICAvKiBEb25lIHdpdGggdGhpcyByZWxvYy4gICovCisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEZBTExUSFJPVUdIIGFuZCB0cnkgdG8gdHVybiB0aGUgMzIvMjQgYml0IHJlbG9jIGludG8gYSAxNiBiaXQKKwkgcmVsb2MuICAqLworCisgICAgLyogVGhpcyBpcyBhIDI0LzMyIGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92IGluc24sIHdoaWNoIGNhbgorICAgICAgIGJlY29tZSBhbiAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByaWdodCByYW5nZS4gICovCisgICAgY2FzZSBSX01PVkwxOgorICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YgaW5zbi4gICovCisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCisgICAgICAvKiBJZiB0aGlzIGFkZHJlc3MgaXMgaW4gMHgwMDAwLi4weDdmZmYgaW5jbHVzaXZlIG9yCisgICAgICAgICAweGZmODAwMC4uMHhmZmZmZmYgaW5jbHVzaXZlLCB0aGVuIGl0IGNhbiBiZSByZWxheGVkLiAgKi8KKyAgICAgIGlmICh2YWx1ZSA8PSAweDdmZmYgfHwgdmFsdWUgPj0gMHhmZjgwMDApCisJeworCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KKwkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7CisKKwkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KKwkgIHNocmluayArPSAyOworCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKKwl9CisgICAgICBicmVhazsKKworICAgICAgLyogTm8gb3RoZXIgcmVsb2MgdHlwZXMgcmVwcmVzZW50IHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLworICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9CisKKyAgbGFzdF9yZWxvYyA9IHJlbG9jOworICBsYXN0X2lucHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uOworICByZXR1cm4gc2hyaW5rOworfQorCisKKy8qIEhhbmRsZSByZWxvY2F0aW9ucyBmb3IgdGhlIEg4LzMwMCwgaW5jbHVkaW5nIHJlbG9jcyBmb3IgcmVsYXhlZAorICAgaW5zdHJ1Y3Rpb25zLgorCisgICBGSVhNRTogTm90IGFsbCByZWxvY2F0aW9ucyBjaGVjayBmb3Igb3ZlcmZsb3chICAqLworCitzdGF0aWMgdm9pZAoraDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKKwkJCSAgIGRzdF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworICAgICBhcmVsZW50ICpyZWxvYzsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOworeworICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKKyAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7CisgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOworICBiZmRfdm1hIHZhbHVlOworICBiZmRfdm1hIGRvdDsKKyAgaW50IGdhcCx0bXA7CisKKyAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCisgICAgeworCisgICAgLyogR2VuZXJpYyA4Yml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24uICAqLworICAgIGNhc2UgUl9QQ1JCWVRFOgorICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLworICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKworICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKKwkgICAgICsgZHN0X2FkZHJlc3MgCisJICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisKKyAgICAgIGdhcCA9IHZhbHVlIC0gZG90OworCisgICAgICAvKiBTYW5pdHkgY2hlY2suICAqLworICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQorCXsKKwkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAorCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCisJCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkgICAgYWJvcnQgKCk7CisJfQorCisgICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKKwkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLworCisgICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKyAgICAgIGRzdF9hZGRyZXNzKys7CisgICAgICBzcmNfYWRkcmVzcysrOworCisgICAgICAvKiBBbGwgZG9uZS4gICovCisgICAgICBicmVhazsKKworICAgIC8qIEdlbmVyaWMgMTZiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCisgICAgY2FzZSBSX1BDUldPUkQ6CisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCisgICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAorCSAgICAgKyBkc3RfYWRkcmVzcyAKKwkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7CisKKyAgICAgIGdhcCA9IHZhbHVlIC0gZG90OworCisgICAgICAvKiBTYW5pdHkgY2hlY2suICAqLworICAgICAgaWYgKGdhcCA+IDMyNzY2IHx8IGdhcCA8IC0zMjc2OCkKKwl7CisJICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKKwkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAorCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCisJICAgIGFib3J0ICgpOworCX0KKworICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCisJIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KKworICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKKyAgICAgIHNyY19hZGRyZXNzICs9IDI7CisKKyAgICAgIC8qIEFsbCBkb25lLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgLyogR2VuZXJpYyA4Yml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLworICAgIGNhc2UgUl9SRUxCWVRFOgorICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGlzIGluc24uICAqLworICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCisgICAgICBpZiAodmFsdWUgPD0gMHhmZgorCSAgfHwgKHZhbHVlID49IDB4MDAwMGZmMDAgJiYgdmFsdWUgPD0gMHgwMDAwZmZmZikKKyAgCSAgfHwgKHZhbHVlID49IDB4MDBmZmZmMDAgJiYgdmFsdWUgPD0gMHgwMGZmZmZmZikKKwkgIHx8ICh2YWx1ZSA+PSAweGZmZmZmZjAwICYmIHZhbHVlIDw9IDB4ZmZmZmZmZmYpKQorCXsKKwkgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQorCSAgICAgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLworCisJICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKwkgIGRzdF9hZGRyZXNzICs9IDE7CisJICBzcmNfYWRkcmVzcyArPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKKwkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAorCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCisJICAgIGFib3J0ICgpOworCX0KKworICAgICAgLyogQWxsIGRvbmUuICAqLworICAgICAgYnJlYWs7CisKKyAgICAvKiBWYXJpb3VzIHNpbXBsZSAxNmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCisgICAgY2FzZSBSX01PVjE2QjE6CisgICAgY2FzZSBSX0pNUDE6CisgICAgY2FzZSBSX1JFTFdPUkQ6CisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7CisgICAgICBkc3RfYWRkcmVzcyArPSAyOworICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKKyAgICAgIGJyZWFrOworCisgICAgLyogVmFyaW91cyBzaW1wbGUgMjQvMzJiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLworICAgIGNhc2UgUl9NT1YyNEIxOgorICAgIGNhc2UgUl9NT1ZMMToKKyAgICBjYXNlIFJfUkVMTE9ORzoKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KKyAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAorICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7CisgICAgICBkc3RfYWRkcmVzcyArPSA0OworICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKKyAgICAgIGJyZWFrOworCisgICAgLyogQW5vdGhlciAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KKyAgICBjYXNlIFJfSk1QTDE6CisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKworICAgICAgdmFsdWUgPSAoKHZhbHVlICYgMHgwMGZmZmZmZikKKwkgICAgICAgfCAoYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIHNyY19hZGRyZXNzKSAmIDB4ZmYwMDAwMDApKTsKKyAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOworICAgICAgZHN0X2FkZHJlc3MgKz0gNDsKKyAgICAgIHNyY19hZGRyZXNzICs9IDQ7CisgICAgICBicmVhazsKKworICAgIC8qIEEgMTZiaXQgYWJvbHV0ZSByZWxvY2F0aW9uIHRoYXQgd2FzIGZvcm1lcmxseSBhIDI0LzMyYml0CisgICAgICAgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCisgICAgY2FzZSBSX01PVkwyOgorICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCisgICAgICBpZiAodmFsdWUgPCAweDgwMDAgfHwgdmFsdWUgPiAweGZmODAwMCkKKwl7CisJICAvKiBJbnNlcnQgdGhlIDE2Yml0IHZhbHVlIGludG8gdGhlIHByb3BlciBsb2NhdGlvbi4gICovCisJICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKworCSAgLyogRml4IHRoZSBvcGNvZGUuICBGb3IgYWxsIHRoZSBtb3ZlIGluc25zLCB3ZSBzaW1wbHkKKwkgICAgIG5lZWQgdG8gdHVybiBvZmYgYml0IDB4MjAgaW4gdGhlIHByZXZpb3VzIGJ5dGUuICAqLworICAgICAgICAgIGRhdGFbZHN0X2FkZHJlc3MgLSAxXSAmPSB+MHgyMDsKKwkgIGRzdF9hZGRyZXNzICs9IDI7CisJICBzcmNfYWRkcmVzcyArPSA0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKKwkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAorCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCisJICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgYnJhbmNoIHRoYXQgaXMgbm93IGFuIDgtYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCisgICAgY2FzZSBSX0pNUDI6CisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKworICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KKyAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKKwkgICAgICsgZHN0X2FkZHJlc3MKKwkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7CisKKyAgICAgIGdhcCA9IHZhbHVlIC0gZG90OworCisgICAgICAvKiBTYW5pdHkgY2hlY2suICAqLworICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQorCXsKKwkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAorCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCisJCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkgICAgYWJvcnQgKCk7CisJfQorCisgICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuICAqLworICAgICAgc3dpdGNoIChkYXRhW2RzdF9hZGRyZXNzIC0gMV0pCisJeworCWNhc2UgMHg1ZToKKwkgIC8qIGpzciAtPiBic3IgKi8KKwkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7CisJICBicmVhazsKKwljYXNlIDB4NWE6CisJICAvKiBqbXAgLT5icmEgKi8KKwkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIC8qIFdyaXRlIG91dCB0aGUgOGJpdCB2YWx1ZS4gICovCisgICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKworICAgICAgZHN0X2FkZHJlc3MgKz0gMTsKKyAgICAgIHNyY19hZGRyZXNzICs9IDM7CisKKyAgICAgIGJyZWFrOworCisgICAgLyogQSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KKyAgICBjYXNlIFJfUENSV09SRF9COgorICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLworICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KKyAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKKwkgICAgICsgZHN0X2FkZHJlc3MKKwkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gMSk7CisKKyAgICAgIGdhcCA9IHZhbHVlIC0gZG90OworCisgICAgICAvKiBTYW5pdHkgY2hlY2suICAqLworICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQorCXsKKwkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAorCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCisJCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkgICAgYWJvcnQgKCk7CisJfQorCisgICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbi4gICovCisgICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSkKKwl7CisJY2FzZSAweDU4OgorCSAgLyogYkNDOjE2IC0+IGJDQzo4ICovCisJICAvKiBHZXQgdGhlIGNvbmRpdGlvbiBjb2RlIGZyb20gdGhlIG9yaWdpbmFsIGluc24uICAqLworCSAgdG1wID0gZGF0YVtkc3RfYWRkcmVzcyAtIDFdOworCSAgdG1wICY9IDB4ZjA7CisJICB0bXAgPj49IDQ7CisKKwkgIC8qIE5vdyBvciBpbiB0aGUgaGlnaCBuaWJibGUgb2YgdGhlIG9wY29kZS4gICovCisJICB0bXAgfD0gMHg0MDsKKworCSAgLyogV3JpdGUgaXQuICAqLworCSAgYmZkX3B1dF84IChhYmZkLCB0bXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDIpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorCisJLyogT3V0cHV0IHRoZSB0YXJnZXQuICAqLworCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKKworCS8qIFdlIGRvbid0IGFkdmFuY2UgZHN0X2FkZHJlc3MgLS0gdGhlIDhiaXQgcmVsb2MgaXMgYXBwbGllZCBhdAorCSAgIGRzdF9hZGRyZXNzIC0gMSwgc28gdGhlIG5leHQgaW5zbiBzaG91bGQgYmVnaW4gYXQgZHN0X2FkZHJlc3MuICAqLworCXNyY19hZGRyZXNzICs9IDI7CisKKwlicmVhazsKKyAgICAgIAorICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBhYnNvbHV0ZSB0aGF0IGlzIG5vdyA4IGJpdHMuICAqLworICAgIGNhc2UgUl9KTVBMMjoKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KKyAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCisgICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0CisJICAgICArIGRzdF9hZGRyZXNzCisJICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpOworCisgICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKKworICAgICAgLyogRml4IHRoZSBpbnN0cnVjdGlvbi4gICovCisgICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3NdKQorCXsKKwljYXNlIDB4NWU6CisJICAvKiBqc3IgLT4gYnNyICovCisJICBiZmRfcHV0XzggKGFiZmQsIDB4NTUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7CisJICBicmVhazsKKwljYXNlIDB4NWE6CisJICAvKiBqbXAgLT5icmEgKi8KKwkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgKyAxKTsKKyAgICAgIGRzdF9hZGRyZXNzICs9IDI7CisgICAgICBzcmNfYWRkcmVzcyArPSA0OworCisgICAgICBicmVhazsKKworICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgbW92LmIgdGhhdCBpcyBub3cgYW4gOGJpdCBhYnNvbHV0ZSBtb3YuYi4gICovCisgICAgY2FzZSBSX01PVjE2QjI6CisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKworICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KKyAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKKwlhYm9ydCAoKTsKKworICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLworICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKKwl7CisJY2FzZSAweDAwOgorCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKKwkgIGJyZWFrOworCWNhc2UgMHg4MDoKKwkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7CisgICAgICBzcmNfYWRkcmVzcyArPSAyOworICAgICAgYnJlYWs7CisKKyAgICAvKiBTaW1pbGFybHkgZm9yIGEgMjRiaXQgbW92LmIgICovCisgICAgY2FzZSBSX01PVjI0QjI6CisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKKworICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KKyAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKKwlhYm9ydCAoKTsKKworICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLworICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKKwl7CisJY2FzZSAweDIwOgorCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKKwkgIGJyZWFrOworCWNhc2UgMHhhMDoKKwkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7CisgICAgICBzcmNfYWRkcmVzcyArPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfQkNDX0lOVjoKKyAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KKyAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisKKyAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCisJICAgICArIGRzdF9hZGRyZXNzIAorCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpICsgMTsKKworICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7CisKKyAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCisgICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCisJeworCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCisJCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKKwkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQorCSAgICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBGaXggdGhlIGNvbmRpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFwcGx5CisJIHRoZSByZWxvY2F0aW9uLCBhbmQgdXBkYXRlIHRoZSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCisKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX2dldF84IChhYmZkLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKSBeIDEsCisJCSBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworICAgICAgZHN0X2FkZHJlc3MrKzsKKyAgICAgIHNyY19hZGRyZXNzKys7CisKKyAgICAgIC8qIEFsbCBkb25lLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0pNUF9ERUw6CisgICAgICBzcmNfYWRkcmVzcyArPSA0OworICAgICAgYnJlYWs7CisKKyAgICAvKiBBbiA4Yml0IG1lbW9yeSBpbmRpcmVjdCBpbnN0cnVjdGlvbiAoam1wL2pzcikuCisKKyAgICAgICBUaGVyZSdzIHNldmVyYWwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIGhhbmRsZQorICAgICAgIHRoaXMgcmVsb2NhdGlvbi4KKworICAgICAgIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wsIHRoZW4KKyAgICAgICB3ZSBzaG91bGQgaGFuZGxlIGl0IGp1c3QgUl9SRUxCWVRFLiAgTGlrZXdpc2UgaWYgaXQncworICAgICAgIGZvciBhIHN5bWJvbCB3aXRoIGEgdmFsdWUgZ2UgMCBhbmQgbGUgMHhmZi4KKworICAgICAgIE90aGVyd2lzZSBpdCdzIGEganVtcC9jYWxsIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHZlY3RvciwKKyAgICAgICBhbmQgdGhlIGxpbmtlciBpcyBleHBlY3RlZCB0byBzZXQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvcgorICAgICAgIGFuZCBwdXQgdGhlIHJpZ2h0IHZhbHVlIGludG8gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCisgICAgY2FzZSBSX01FTV9JTkRJUkVDVDoKKyAgICAgIHsKKwkvKiBXZSBuZWVkIHRvIGZpbmQgdGhlIHN5bWJvbCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGl0J3MKKwkgICBhZGRyZXNzIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgdGFibGUuICAqLworCWFzeW1ib2wgKnN5bWJvbDsKKwliZmRfdm1hIHZhbHVlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKKwlhc2VjdGlvbiAqdmVjdG9yc19zZWMgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGxpbmtfaW5mbyktPnZlY3RvcnNfc2VjOworCisJLyogRmlyc3Qgc2VlIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wKKwkgICBvciBhZ2FpbnN0IGEgc3ltYm9sIHdpdGggYSBub25uZWdhdGl2ZSB2YWx1ZSA8PSAweGZmLiAgKi8KKwlzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7CisJdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisJaWYgKHN5bWJvbCA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wKKwkgICAgfHwgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMHhmZikpCisJICB7CisJICAgIC8qIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gYSBtYW5uZXIgdmVyeSBzaW1pbGFyIHRvCisJICAgICAgIFJfUkVMQllURVMuICAgSWYgdGhlIHZhbHVlIGlzIGluIHJhbmdlLCB0aGVuIGp1c3Qgc2xhbQorCSAgICAgICB0aGUgdmFsdWUgaW50byB0aGUgcmlnaHQgbG9jYXRpb24uICBFbHNlIHRyaWdnZXIgYQorCSAgICAgICByZWxvYyBvdmVyZmxvdyBjYWxsYmFjay4gICovCisJICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDB4ZmYpCisJICAgICAgeworCQliZmRfcHV0XzggKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCQlkc3RfYWRkcmVzcyArPSAxOworCQlzcmNfYWRkcmVzcyArPSAxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCisJCQlyZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAorCQkJaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkJICBhYm9ydCAoKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCisJLyogVGhpcyBpcyBhIGp1bXAvY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gdmVjdG9yLCBhbmQgd2UncmUKKwkgICBleHBlY3RlZCB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIHZlY3RvciBvdXJzZWx2ZXMuIAorCisJICAgRmlyc3QgbG9vayB1cCB0aGlzIHN5bWJvbCBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgLS0gd2UgbmVlZAorCSAgIHRoZSBkZXJpdmVkIGxpbmtlciBzeW1ib2wgd2hpY2ggaG9sZHMgdGhpcyBzeW1ib2wncyBpbmRleAorCSAgIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICAqLworCW5hbWUgPSBzeW1ib2wtPm5hbWU7CisJaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCisJICB7CisJICAgIGNoYXIgKm5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDkpOworCSAgICBpZiAobmV3X25hbWUgPT0gTlVMTCkKKwkgICAgICBhYm9ydCAoKTsKKworCSAgICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKKwkgICAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAorCQkgICAgIChpbnQpc3ltYm9sLT5zZWN0aW9uKTsKKwkgICAgbmFtZSA9IG5ld19uYW1lOworCSAgfQorCisJaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAorCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UpOworCisJLyogVGhpcyBzaG91bGRuJ3QgZXZlciBoYXBwZW4uICBJZiBpdCBkb2VzIHRoYXQgbWVhbnMgd2UndmUgZ290CisJICAgZGF0YSBjb3JydXB0aW9uIG9mIHNvbWUga2luZC4gIEFib3J0aW5nIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlCisJICAgdGhpbmsgdG8gZG8gaGVyZS4gICovCisJaWYgKGggPT0gTlVMTCB8fCB2ZWN0b3JzX3NlYyA9PSBOVUxMKQorCSAgYWJvcnQgKCk7CisKKwkvKiBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdmVjdG9yIGVudHJ5IGludG8gdGhlCisJICAgcmVsb2MncyBhZGRyZXNzLiAgKi8KKwliZmRfcHV0XzggKGFiZmQsCisJCSAgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgaC0+b2Zmc2V0LAorCQkgICBkYXRhICsgZHN0X2FkZHJlc3MpOworCisJZHN0X2FkZHJlc3MrKzsKKwlzcmNfYWRkcmVzcysrOworCisJLyogTm93IGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGl0c2VsZi4gICovCisJaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwKQorCSAgYmZkX3B1dF8xNiAoYWJmZCwKKwkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAorCQkJCQkJICBsaW5rX2luZm8sCisJCQkJCQkgIGlucHV0X3NlY3Rpb24pLAorCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOworCWVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwaAorCQkgfHwgYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBzKQorCSAgYmZkX3B1dF8zMiAoYWJmZCwKKwkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAorCQkJCQkJICBsaW5rX2luZm8sCisJCQkJCQkgIGlucHV0X3NlY3Rpb24pLAorCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOworCWVsc2UKKwkgIGFib3J0ICgpOworCisJLyogR3Jvc3MuICBXZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZWN0b3Igc2VjdGlvbgorCSAgIGJlZm9yZSB3ZSBnZXQgaGVyZS4uLiAgU28gd2Ugd3JpdGUgaXQgYWdhaW4gd2l0aCB0aGUgbmV3IGRhdGEuICAqLworCWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAodmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciwKKwkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfc2VjdGlvbiwKKwkJCQkgIHZlY3RvcnNfc2VjLT5jb250ZW50cywKKwkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0LAorCQkJCSAgdmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKworICAgIH0KKworICAqc3JjX3B0ciA9IHNyY19hZGRyZXNzOworICAqZHN0X3B0ciA9IGRzdF9hZGRyZXNzOworfQorCisKKy8qIFJvdXRpbmUgZm9yIHRoZSBoODMwMCBsaW5rZXIuCisKKyAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoZSBzcGVjaWFsIFJfTUVNX0lORElSRUNUCisgICByZWxvY3Mgb24gdGhlIGg4MzAwLiAgSXQncyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhIHZlY3RvcnMKKyAgIHNlY3Rpb24gYW5kIGF0dGFjaGluZyBpdCB0byBhbiBpbnB1dCBiZmQgYXMgd2VsbCBhcyBzaXppbmcKKyAgIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBJdCBhbHNvIGNyZWF0ZXMgb3VyIHZlY3RvcnMgaGFzaCB0YWJsZS4KKworICAgSXQgdXNlcyB0aGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzLgorICAgZnJvbSB0aGlzIEJGRCB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgSXQgbWF5IGFkZCBhIGZldworICAgc2VsZWN0ZWQgc3RhdGljIHN5bWJvbHMgdG8gdGhlIGJmZCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqc2VjOworICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7CisKKyAgLyogSWYgd2UgaGF2ZW4ndCBjcmVhdGVkIGEgdmVjdG9ycyBzZWN0aW9uLCBkbyBzbyBub3cuICAqLworICBpZiAoIWg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjKQorICAgIHsKKyAgICAgIGZsYWd3b3JkIGZsYWdzOworCisgICAgICAvKiBNYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFyZSBzZXQsIGluY2x1ZGluZyBTRUNfSU5fTUVNT1JZLiAgKi8KKyAgICAgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FECisJICAgICAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfUkVBRE9OTFkpOworICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLAorCQkJCQkJCQkgICAgIi52ZWN0b3JzIik7CisKKyAgICAgIC8qIElmIHRoZSBzZWN0aW9uIHdhc24ndCBjcmVhdGVkLCBvciB3ZSBjb3VsZG4ndCBzZXQgdGhlIGZsYWdzLAorCSBxdWl0IHF1aWNrbHkgbm93LCByYXRoZXIgdGhhbiBkaWVpbmcgYSBwYWluZnVsIGRlYXRoIGxhdGVyLiAgKi8KKyAgICAgIGlmICghIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKKwkJCQkgICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUoaW5mbyktPnZlY3RvcnNfc2VjLAorCQkJCSAgICAgIGZsYWdzKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIEFsc28gY3JlYXRlIHRoZSB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCisgICAgICBmdW5jdmVjX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikKKwliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSkpKTsKKworICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGUpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KKyAgICAgIGlmICghZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKGZ1bmN2ZWNfaGFzaF90YWJsZSwgYWJmZCwKKwkJCQkgICAgZnVuY3ZlY19oYXNoX25ld2Z1bmMpKQorCXsKKwkgIGJmZF9yZWxlYXNlIChhYmZkLCBmdW5jdmVjX2hhc2hfdGFibGUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogU3RvcmUgYXdheSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN2ZWMgaGFzaCB0YWJsZS4gICovCisgICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUgPSBmdW5jdmVjX2hhc2hfdGFibGU7CisgICAgfQorCisgIC8qIExvYWQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KKyAgZnVuY3ZlY19oYXNoX3RhYmxlID0gaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlOworCisgIC8qIEFkZCB0aGUgc3ltYm9scyB1c2luZyB0aGUgZ2VuZXJpYyBjb2RlLiAgKi8KKyAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pOworCisgIC8qIE5vdyBzY2FuIHRoZSByZWxvY3MgZm9yIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhpcyBiZmQ7IGNyZWF0ZQorICAgICBhZGRpdGlvbmFsIHNwYWNlIGluIHRoZSAudmVjdG9ycyBzZWN0aW9uIGFzIG5lZWRlZC4gICovCisgIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQorICAgIHsKKyAgICAgIGxvbmcgcmVsb2Nfc2l6ZSwgcmVsb2NfY291bnQsIGk7CisgICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgIGFyZWxlbnQgKipyZWxvY3M7CisKKyAgICAgIC8qIFN1Y2sgaW4gdGhlIHJlbG9jcywgc3ltYm9scyAmIGNhbm9uaWNhbGl6ZSB0aGVtLiAgKi8KKyAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOworICAgICAgaWYgKHJlbG9jX3NpemUgPD0gMCkKKwljb250aW51ZTsKKworICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKiopYmZkX21hbGxvYyAoKHNpemVfdClyZWxvY19zaXplKTsKKyAgICAgIGlmICghcmVsb2NzKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogVGhlIHN5bWJvbHMgc2hvdWxkIGhhdmUgYmVlbiByZWFkIGluIGJ5IF9iZmRfZ2VuZXJpYyBsaW5rX2FkZF9zeW1ib2xzCisJIGNhbGwgYWJvdmVjLCBzbyB3ZSBjYW4gY2hlYXQgYW5kIHVzZSB0aGUgcG9pbnRlciB0byB0aGVtIHRoYXQgd2FzCisJIHNhdmVkIGluIHRoZSBhYm92ZSBjYWxsLiAgKi8KKyAgICAgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyhhYmZkKTsKKyAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxvY3MsIHN5bWJvbHMpOworICAgICAgaWYgKHJlbG9jX2NvdW50IDw9IDApCisJeworCSAgZnJlZSAocmVsb2NzKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogTm93IHdhbGsgdGhyb3VnaCBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoaXMgc2VjdGlvbi4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKKwl7CisJICBhcmVsZW50ICpyZWxvYyA9IHJlbG9jc1tpXTsKKwkgIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkgIC8qIFdlJ3ZlIGdvdCBhbiBpbmRpcmVjdCByZWxvYy4gIFNlZSBpZiB3ZSBuZWVkIHRvIGFkZCBpdAorCSAgICAgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlCisJICAgICB0byBhZGQgYSBuZXcgZW50cnkgZm9yIGVhY2ggdW5pcXVlIHN5bWJvbCByZWZlcmVuY2VkCisJICAgICBieSBhbiBSX01FTV9JTkRJUkVDVCByZWxvY2F0aW9uIGV4Y2VwdCBmb3IgYSByZWxvYworCSAgICAgYWdhaW5zdCB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICAqLworCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX01FTV9JTkRJUkVDVAorCSAgICAgICYmIHN5bWJvbCAhPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wpCisKKwkgICAgeworCSAgICAgIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKmg7CisKKwkgICAgICBuYW1lID0gc3ltYm9sLT5uYW1lOworCSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKQorCQl7CisJCSAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7CisKKwkJICBpZiAobmV3X25hbWUgPT0gTlVMTCkKKwkJICAgIGFib3J0ICgpOworCisJCSAgc3RyY3B5IChuZXdfbmFtZSwgbmFtZSk7CisJCSAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAorCQkJICAgKGludClzeW1ib2wtPnNlY3Rpb24pOworCQkgIG5hbWUgPSBuZXdfbmFtZTsKKwkJfQorCisJICAgICAgLyogTG9vayB0aGlzIHN5bWJvbCB1cCBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLworCSAgICAgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCisJCQkJICAgICAgIG5hbWUsIGZhbHNlLCBmYWxzZSk7CisKKworCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzbid0IGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUsIGFkZAorCQkgaXQgYW5kIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUuICAqLworCSAgICAgIGlmIChoID09IE5VTEwpCisJCXsKKwkJICBoID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAorCQkJCQkgICBuYW1lLCB0cnVlLCB0cnVlKTsKKwkJICBpZiAoaCA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBmcmVlIChyZWxvY3MpOworCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICB9CisKKwkJICAvKiBCdW1wIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBFYWNoIHZlY3RvcgorCQkgICAgIHRha2VzIDIgYnl0ZXMgb24gdGhlIGg4MzAwIGFuZCA0IGJ5dGVzIG9uIHRoZSBoODMwMGguICAqLworCQkgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQorCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSAyOworCQkgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCisJCQkgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKKwkJICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgKz0gNDsKKwkJfQorCSAgICB9CisJfQorCisgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIHJlbG9jYXRpb25zLCByZWxlYXNlIHRoZW0uICAqLworICAgICAgZnJlZSAocmVsb2NzKTsKKyAgICB9CisKKyAgLyogTm93IGFjdHVhbGx5IGFsbG9jYXRlIHNvbWUgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICBJdCdzCisgICAgIHdhc3RlZnVsIHRvIGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UsIGJ1dCB0aGlzIGlzIGVhc2llci4gICovCisgIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICE9IDApCisgICAgeworICAgICAgLyogRnJlZSB0aGUgb2xkIGNvbnRlbnRzLiAgKi8KKyAgICAgIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpCisJZnJlZSAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzKTsKKworICAgICAgLyogQWxsb2NhdGUgbmV3IGNvbnRlbnRzLiAgKi8KKyAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cworCT0gYmZkX21hbGxvYyAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCisjZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCisjZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMKKyNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKworI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCisjaW5jbHVkZSAiY29mZmNvZGUuaCIKKworCisjdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgorCisKKworY29uc3QgYmZkX3RhcmdldCBoODMwMGNvZmZfdmVjID0KK3sKKyAgImNvZmYtaDgzMDAiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyBjaGFyICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUsCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDg1MDAuYyBiL2JmZC9jb2ZmLWg4NTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExMDllYQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLWg4NTAwLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBIOC81MDAgQ09GRiBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJjb2ZmL2g4NTAwLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tOCA9CitIT1dUTyAoUl9IODUwMF9JTU04LCAwLCAxLCA4LCBmYWxzZSwgMCwKKyAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0xNiA9CitIT1dUTyAoUl9IODUwMF9JTU0xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLAorICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0xNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0yNCA9CitIT1dUTyAoUl9IODUwMF9JTU0yNCwgMCwgMSwgMjQsIGZhbHNlLCAwLAorICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0yNCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0zMiA9CitIT1dUTyAoUl9IODUwMF9JTU0zMiwgMCwgMSwgMzIsIGZhbHNlLCAwLAorICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0zMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKTsKKworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2hpZ2g4ID0KK0hPV1RPIChSX0g4NTAwX0hJR0g4LCAwLCAxLCA4LCBmYWxzZSwgMCwKKyAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9oaWdoOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9sb3cxNiA9CitIT1dUTyAoUl9IODUwMF9MT1cxNiwgMCwgMSwgMTYsIGZhbHNlLCAwLAorICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJyX2xvdzE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX3BjcmVsOCA9CitIT1dUTyAoUl9IODUwMF9QQ1JFTDgsIDAsIDEsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInJfcGNyZWw4IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7CisKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDE2ID0KK0hPV1RPIChSX0g4NTAwX1BDUkVMMTYsIDAsIDEsIDE2LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsMTYiLCB0cnVlLCAwLCAwLCB0cnVlKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoMTYgPQorSE9XVE8gKFJfSDg1MDBfSElHSDE2LCAwLCAxLCA4LCBmYWxzZSwgMCwKKyAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9oaWdoMTYiLCB0cnVlLCAweDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKKworCisvKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLworCitzdGF0aWMgaW50IAorY29mZl9oODUwMF9zZWxlY3RfcmVsb2MgKGhvd3RvKQorICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKK3sKKyAgcmV0dXJuIGhvd3RvLT50eXBlOworfQorCisjZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB4LnJfdHlwZSA9IGNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jKGhvd3RvKQorCisKKyNkZWZpbmUgQkFETUFHKHgpIEg4NTAwQkFETUFHKHgpCisjZGVmaW5lIEg4NTAwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLworCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworCisvKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCisjZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICAgYmZkX2hfZ2V0XzMyCisjZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIFwKKyAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCisgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKKworLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCisgICAqLworCitzdGF0aWMgdm9pZAorcnR5cGUyaG93dG8oaW50ZXJuYWwsIGRzdCkKKyAgICAgYXJlbGVudCAqIGludGVybmFsOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKK3sKKyAgc3dpdGNoIChkc3QtPnJfdHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0g4NTAwX0lNTTg6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW04OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0g4NTAwX0lNTTE2OgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfSDg1MDBfSU1NMjQ6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0yNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0g4NTAwX1BDUkVMODoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9QQ1JFTDE2OgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfcGNyZWwxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9ISUdIODoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2hpZ2g4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0g4NTAwX0hJR0gxNjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2hpZ2gxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9MT1cxNjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2xvdzE2OworICAgICAgYnJlYWs7CisgICAgfQorfQorCisjZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQorCisKKy8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KKworCisjZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKKyBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7CisKKworI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAorIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKworc3RhdGljIHZvaWQgcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKyAgICAgYXJlbGVudCAqIHJlbGVudDsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKKyAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOworICAgICBiZmQgKiBhYmZkOworICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Cit7CisgIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOworICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7CisKKyAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCisgICAgeworICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisgICAgfQorCisKKyAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7CisgIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Cit9CisKK3N0YXRpYyB2b2lkCitleHRyYV9jYXNlIChpbl9hYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKQorICAgICBiZmQgKmluX2FiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7CisgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKK3sKKyAgYmZkX2J5dGUgKmQgPSBkYXRhKypkc3RfcHRyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKyAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCisgICAgeworICAgIGNhc2UgUl9IODUwMF9JTU04OgorICAgICAgYmZkX3B1dF84IChpbl9hYmZkLAorCQkgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAorCQkgZCk7CisgICAgICAoKmRzdF9wdHIpICs9IDE7CisgICAgICAoKnNyY19wdHIpICs9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9IODUwMF9ISUdIODoKKyAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKKwkJIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKKwkJICA+PiAxNiksCisJCSBkICk7CisgICAgICAoKmRzdF9wdHIpICs9IDE7CisgICAgICAoKnNyY19wdHIpICs9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKKyAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCisJCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAorCQkgIGQgICk7CisgICAgICAoKmRzdF9wdHIpICs9IDI7CisgICAgICAoKnNyY19wdHIpICs9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9IODUwMF9MT1cxNjoKKyAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCisJCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAorCQkgIGQpOworCisgICAgICAoKmRzdF9wdHIpICs9IDI7CisgICAgICAoKnNyY19wdHIpICs9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6CisgICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAorCQkgIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKKwkJICAgPj4xNiksCisJCSAgZCk7CisKKyAgICAgICgqZHN0X3B0cikgKz0gMjsKKyAgICAgICgqc3JjX3B0cikgKz0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0g4NTAwX0lNTTI0OgorICAgICAgeworCWludCB2ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisJaW50IG8gPSBiZmRfZ2V0XzMyKGluX2FiZmQsIGRhdGErICpkc3RfcHRyIC0xKTsKKwl2ID0gKHYgJiAweDAwZmZmZmZmKSB8IChvICYgMHhmZjAwMDAwKTsKKwliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyIC0xKTsKKwkoKmRzdF9wdHIpICs9MzsKKwkoKnNyY19wdHIpKz0zOzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKKyAgICAgIHsKKwlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCWJmZF9wdXRfMzIgKGluX2FiZmQsIHYsIGRhdGEgICsgKmRzdF9wdHIpOworCSgqZHN0X3B0cikgKz00OworCSgqc3JjX3B0cikrPTQ7OworICAgICAgfQorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6CisgICAgICB7CisJYmZkX3ZtYSBkc3QgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKKwkJCQkJCSAgaW5wdXRfc2VjdGlvbik7CisJYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQKKwkgICsgKmRzdF9wdHIKKwkgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisJaW50IGdhcCA9IGRzdCAtIGRvdCAtIDE7IC8qIC0xIHNpbmNlIHdlcmUgaW4gdGhlIG9kZCBieXRlIG9mIHRoZQorCQkJCSAgICB3b3JkIGFuZCB0aGUgcGMncyBiZWVuIGluY3JlbWVudGVkICovCisKKwlpZiAoZ2FwID4gMTI4IHx8IGdhcCA8IC0xMjgpCisJICB7CisJICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCisJCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAorCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkgICAgICBhYm9ydCAoKTsKKwkgIH0KKwliZmRfcHV0XzggKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKKwkoKmRzdF9wdHIpKys7CisJKCpzcmNfcHRyKSsrOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgUl9IODUwMF9QQ1JFTDE2OgorICAgICAgeworCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgIGlucHV0X3NlY3Rpb24pOworCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0CisJICArICpkc3RfcHRyCisJICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKKwkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLworCisJaWYgKGdhcCA+IDMyNzY3IHx8IGdhcCA8IC0zMjc2OCkKKwkgIHsKKwkgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKKwkJICAgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCisJCSAgICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQorCSAgICAgIGFib3J0ICgpOworCSAgfQorCWJmZF9wdXRfMTYgKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKKwkoKmRzdF9wdHIpKz0yOworCSgqc3JjX3B0cikrPTI7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisjZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBleHRyYV9jYXNlCisKKyNpbmNsdWRlICJjb2ZmY29kZS5oIgorCisKKyN1bmRlZiAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgorCitjb25zdCBiZmRfdGFyZ2V0IGg4NTAwY29mZl92ZWMgPQoreworICAiY29mZi1oODUwMCIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCisKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUsCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaTM4Ni5jIGIvYmZkL2NvZmYtaTM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OThjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi1pMzg2LmMKQEAgLTAsMCArMSw2MzcgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IENPRkYgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNpbmNsdWRlICJjb2ZmL2kzODYuaCIKKworI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKworI2lmZGVmIENPRkZfV0lUSF9QRQorI2luY2x1ZGUgImNvZmYvcGUuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09GRl9HTzMyX0VYRQorI2luY2x1ZGUgImNvZmYvZ28zMmV4ZS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pMzg2X3JlbG9jIAorICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8KKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAorCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCisKKwkgICBiZmRfdm1hICopKTsKKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCisvKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KKworI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKKworLyogRm9yIHNvbWUgcmVhc29uIHdoZW4gdXNpbmcgaTM4NiBDT0ZGIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIC50ZXh0CisgICBzZWN0aW9uIGZvciBhIHJlZmVyZW5jZSB0byBhIGNvbW1vbiBzeW1ib2wgaXMgdGhlIHZhbHVlIGl0c2VsZiBwbHVzCisgICBhbnkgZGVzaXJlZCBvZmZzZXQuICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4gICovCisKKy8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgbmVlZCB0byBkbyBzb21lCisgICBhZGp1c3RtZW50cyB0byB0aGUgb2JqZWN0IGZpbGUgdGhhdCBhcmUgbm90IGRvbmUgYnkgdGhlCisgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXZlcnkKKyAgIHJlbG9jIHR5cGUgdG8gbWFrZSBhbnkgcmVxdWlyZWQgYWRqdXN0bWVudHMuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitjb2ZmX2kzODZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCisJCSBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgc3ltdmFsdWUgZGlmZjsKKworICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyNpZm5kZWYgQ09GRl9XSVRIX1BFCisgICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKKwkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCisJIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKKwkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCisJIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQorCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCisJIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQorCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCisJIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgorCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAorCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KKyAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKKyNlbHNlCisgICAgICAvKiBJbiBQRSBtb2RlLCB3ZSBkbyBub3Qgb2Zmc2V0IHRoZSBjb21tb24gc3ltYm9sLiAgKi8KKyAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRm9yIHNvbWUgcmVhc29uIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYWx3YXlzIGVmZmVjdGl2ZWx5CisJIGlnbm9yZXMgdGhlIGFkZGVuZCBmb3IgYSBDT0ZGIHRhcmdldCB3aGVuIHByb2R1Y2luZworCSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhpcyBzZWVtcyB0byBiZSBhbHdheXMgd3JvbmcgZm9yIDM4NgorCSBDT0ZGLCBzbyB3ZSBoYW5kbGUgdGhlIGFkZGVuZCBoZXJlIGluc3RlYWQuICAqLworICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisgICAgfQorCisjaWZkZWYgQ09GRl9XSVRIX1BFCisgIC8qIEZJWE1FOiBIb3cgc2hvdWxkIHRoaXMgY2FzZSBiZSBoYW5kbGVkPyAgKi8KKyAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSA9PSBSX0lNQUdFQkFTRSAmJiBkaWZmICE9IDApCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworI2RlZmluZSBET0lUKHgpIFwKKyAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCisKKyAgICBpZiAoZGlmZiAhPSAwKQorICAgICAgeworCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOworCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7CisKKwlzd2l0Y2ggKGhvd3RvLT5zaXplKQorCSAgeworCSAgY2FzZSAwOgorCSAgICB7CisJICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKKwkgICAgICBET0lUICh4KTsKKwkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIDE6CisJICAgIHsKKwkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7CisJICAgICAgRE9JVCAoeCk7CisJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgMjoKKwkgICAgeworCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOworCSAgICAgIERPSVQgKHgpOworCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBhYm9ydCAoKTsKKwkgIH0KKyAgICAgIH0KKworICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLworICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworfQorCisjaWZkZWYgQ09GRl9XSVRIX1BFCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkCisgICBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4gKi8KKworc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcChhYmZkLCBob3d0bykKKyAgICAgYmZkICogYWJmZDsKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Cit7CisgIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBSX0lNQUdFQkFTRTsKK30gICAgIAorI2VuZGlmCisKKyNpZm5kZWYgUENSRUxPRkZTRVQKKyNkZWZpbmUgUENSRUxPRkZTRVQgZmFsc2UKKyNlbmRpZgorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCit7CisgIHswfSwKKyAgezF9LAorICB7Mn0sCisgIHszfSwKKyAgezR9LAorICB7NX0sCisgIEhPV1RPIChSX0RJUjMyLCAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGNvZmZfaTM4Nl9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiZGlyMzIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIC8qIHs3fSwgKi8KKyAgSE9XVE8gKFJfSU1BR0VCQVNFLCAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGNvZmZfaTM4Nl9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAicnZhMzIiLAkgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICB7MDEwfSwKKyAgezAxMX0sCisgIHswMTJ9LAorICB7MDEzfSwKKyAgezAxNH0sCisgIHswMTV9LAorICB7MDE2fSwKKyAgSE9XVE8gKFJfUkVMQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIjgiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLworICBIT1dUTyAoUl9SRUxXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIjE2IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgSE9XVE8gKFJfUkVMTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICIzMiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisgIEhPV1RPIChSX1BDUkJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJESVNQOCIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgSE9XVE8gKFJfUENSV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJESVNQMTYiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisgIEhPV1RPIChSX1BDUkxPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIFBDUkVMT0ZGU0VUKQkJLyogcGNyZWxfb2Zmc2V0ICovCit9OworCisvKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQorI2RlZmluZSBCQURNQUcoeCkgSTM4NkJBRE1BRyh4KQorI2RlZmluZSBJMzg2IDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLworCisjZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCisJICAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgKGRzdCktPnJfdHlwZTsKKworLyogRm9yIDM4NiBDT0ZGIGEgU1RZUF9OT0xPQUQgfCBTVFlQX0JTUyBzZWN0aW9uIGlzIHBhcnQgb2YgYSBzaGFyZWQKKyAgIGxpYnJhcnkuICBPbiBzb21lIG90aGVyIENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBub3JtYWxseQorICAgU1RZUF9OT0xPQUQuICAqLworI2RlZmluZSBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCisKKy8qIENvbXB1dGUgdGhlIGFkZGVuZCBvZiBhIHJlbG9jLiAgSWYgdGhlIHJlbG9jIGlzIHRvIGEgY29tbW9uIHN5bWJvbCwKKyAgIHRoZSBvYmplY3QgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBCeSB0aGUKKyAgIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBsaW5rZXIgbWF5IGJlIHVzaW5nIGEgZGlmZmVyZW50IHN5bWJvbAorICAgZnJvbSBhIGRpZmZlcmVudCBvYmplY3QgZmlsZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiAgVGhlcmVmb3JlLCB3ZQorICAgaGFjayB3aWxkbHkgdG8gbG9jYXRlIHRoZSBvcmlnaW5hbCBzeW1ib2wgZnJvbSB0aGlzIGZpbGUgc28gdGhhdCB3ZQorICAgY2FuIG1ha2UgdGhlIGNvcnJlY3QgYWRqdXN0bWVudC4gIFRoaXMgbWFjcm8gc2V0cyBjb2Zmc3ltIHRvIHRoZQorICAgc3ltYm9sIGZyb20gdGhlIG9yaWdpbmFsIGZpbGUsIGFuZCB1c2VzIGl0IHRvIHNldCB0aGUgYWRkZW5kIHZhbHVlCisgICBjb3JyZWN0bHkuICBJZiB0aGlzIGlzIG5vdCBhIGNvbW1vbiBzeW1ib2wsIHRoZSB1c3VhbCBhZGRlbmQKKyAgIGNhbGN1bGF0aW9uIGlzIGRvbmUsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgdHdlYWsgaXMgbmVlZGVkIGZvcgorICAgUEMgcmVsYXRpdmUgcmVsb2NzLgorICAgRklYTUU6IFRoaXMgbWFjcm8gcmVmZXJzIHRvIHN5bWJvbHMgYW5kIGFzZWN0OyB0aGVzZSBhcmUgZnJvbSB0aGUKKyAgIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCB0aGUgbWFjcm8gYXJndW1lbnRzLiAgKi8KKworI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpCQlcCisgIHsJCQkJCQkJCVwKKyAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2Zmc3ltID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsJXAorICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpCQkJXAorICAgICAgY29mZnN5bSA9IChvYmpfc3ltYm9scyAoYWJmZCkJCQkJXAorCSAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7CQlcCisgICAgZWxzZSBpZiAocHRyKQkJCQkJCVwKKyAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOwkJCVwKKyAgICBpZiAoY29mZnN5bSAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCQkJXAorCSYmIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9PSAwKQkJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIGNvZmZzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsJXAorICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZAkJXAorCSAgICAgJiYgcHRyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQkJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAtIChwdHItPnNlY3Rpb24tPnZtYSArIHB0ci0+dmFsdWUpOwlcCisgICAgZWxzZQkJCQkJCQlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7CQkJCQlcCisgICAgaWYgKHB0ciAmJiBob3d0b190YWJsZVtyZWxvYy5yX3R5cGVdLnBjX3JlbGF0aXZlKQkJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAorICB9CisKKy8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgRm9yIG5vcm1hbCBpMzg2IENPRkYsIHdlCisgICBjYW4gdXNlIHRoZSBnZW5lcmljIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gIEZvciBQRSwgd2UgbmVlZCBvdXIKKyAgIG93biByb3V0aW5lLiAgKi8KKworI2lmbmRlZiBDT0ZGX1dJVEhfUEUKKworI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgorCisjZWxzZSAvKiBDT0ZGX1dJVEhfUEUgKi8KKworLyogVGhlIFBFIHJlbG9jYXRlIHNlY3Rpb24gcm91dGluZS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCisgICBhbmQgdGhlIHJlZ3VsYXIgcm91dGluZSBpcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgZm9yIGEKKyAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KKworc3RhdGljIGJvb2xlYW4gY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7CisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAorCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCisJCQkgICAgICAgc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKKyAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKKyAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKK3sKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAorCQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAorCQkJCQkgICAgIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpOworfQorCisjZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbgorCisjZW5kaWYgLyogQ09GRl9XSVRIX1BFICovCisKKy8qIENvbnZlcnQgYW4gcnR5cGUgdG8gaG93dG8gZm9yIHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOworICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKKyAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKK3sKKworICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKworICBob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7CisKKyNpZmRlZiBDT0ZGX1dJVEhfUEUKKyAgKmFkZGVuZHAgPSAwOworI2VuZGlmCisKKyAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKKyAgICAqYWRkZW5kcCArPSBzZWMtPnZtYTsKKworICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtID09IDAgJiYgc3ltLT5uX3ZhbHVlICE9IDApCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgc2VjdGlvbiBjb250ZW50cyBpbmNsdWRlIHRoZQorCSBzaXplIChzeW0tPm5fdmFsdWUpIGFzIGFuIGFkZGVuZC4gIFRoZSByZWxvY2F0ZV9zZWN0aW9uCisJIGZ1bmN0aW9uIHdpbGwgYmUgYWRkaW5nIGluIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgV2UKKwkgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgc2l6ZSBpbiBvcmRlciB0byBnZXQgdGhlCisJIGNvcnJlY3QgcmVzdWx0LiAgKi8KKyAKKyAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7CisKKyNpZm5kZWYgQ09GRl9XSVRIX1BFCisgICAgICAvKiBJIHRoaW5rIHdlICpkbyogd2FudCB0byBieXBhc3MgdGhpcy4gIElmIHdlIGRvbid0LCBJIGhhdmUKKwkgc2VlbiBzb21lIGRhdGEgcGFyYW1ldGVycyBnZXQgdGhlIHdyb25nIHJlbG9jYXRpb24gYWRkcmVzcy4KKwkgSWYgSSBsaW5rIHR3byB2ZXJzaW9ucyB3aXRoIGFuZCB3aXRob3V0IHRoaXMgc2VjdGlvbiBieXBhc3NlZAorCSBhbmQgdGhlbiBkbyBhIGJpbmFyeSBjb21wYXJpc29uLCB0aGUgYWRkcmVzc2VzIHdoaWNoIGFyZQorCSBkaWZmZXJlbnQgY2FuIGJlIGxvb2tlZCB1cCBpbiB0aGUgbWFwLiAgVGhlIGNhc2UgaW4gd2hpY2gKKwkgdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAorCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwLiAgKi8KKyAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKKyNlbmRpZgorICAgIH0KKworI2lmbmRlZiBDT0ZGX1dJVEhfUEUKKyAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCisgICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCisgICAgIGNvbW1vbiBzeW1ib2wuICAqLworICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikgCisgICAgKmFkZGVuZHAgKz0gaC0+cm9vdC51LmMuc2l6ZTsKKyNlbmRpZgorCisjaWZkZWYgQ09GRl9XSVRIX1BFCisgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCisgICAgeworICAgICAgKmFkZGVuZHAgLT0gNDsKKworICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBnZW5lcmljIGNvZGUgaXMgZ29pbmcgdG8KKyAgICAgICAgIGFkZCBiYWNrIHRoZSBzeW1ib2wgdmFsdWUgaW4gb3JkZXIgdG8gY2FuY2VsIG91dCBhbgorICAgICAgICAgYWRqdXN0bWVudCBpdCBtYWRlIHRvIHRoZSBhZGRlbmQuICBIb3dldmVyLCB3ZSBzZXQgdGhlIGFkZGVuZAorICAgICAgICAgdG8gMCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4gIFdlIG5lZWQgdG8gYWRqdXN0IGhlcmUsCisgICAgICAgICB0byBhdm9pZCB0aGUgYWRqdXN0bWVudCB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgbWFrZS4gIEZJWE1FOgorICAgICAgICAgVGhpcyBpcyBnZXR0aW5nIGEgYml0IGhhY2tpc2guICAqLworICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQorCSphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKKyAgICB9CisKKyAgaWYgKHJlbC0+cl90eXBlID09IFJfSU1BR0VCQVNFKQorICAgIHsKKyAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBob3d0bzsKK30KKworCisjZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGNvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAorCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2NvZmZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ19SVkE6CisgICAgICByZXR1cm4gaG93dG9fdGFibGUgK1JfSU1BR0VCQVNFOworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9ESVIzMjsKKyAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKKyAgICAgIHJldHVybiBob3d0b190YWJsZSArIFJfUENSTE9ORzsKKyAgICBkZWZhdWx0OgorICAgICAgQkZEX0ZBSUwgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKyNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byBjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8KKworI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCisKKy8qIElmIGkzODYgZ2NjIHVzZXMgdW5kZXJzY29yZXMgZm9yIHN5bWJvbCBuYW1lcywgdGhlbiBpdCBkb2VzIG5vdCB1c2UKKyAgIGEgbGVhZGluZyBkb3QgZm9yIGxvY2FsIGxhYmVscywgc28gaWYgVEFSR0VUX1VOREVSU0NPUkUgaXMgZGVmaW5lZAorICAgd2UgdHJlYXQgYWxsIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBMIGFzIGxvY2FsLiAgKi8KKworc3RhdGljIGJvb2xlYW4gY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworCitzdGF0aWMgYm9vbGVhbgorY29mZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgaWYgKG5hbWVbMF0gPT0gJ0wnKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Cit9CisKKyNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZQorCisjZW5kaWYgLyogVEFSR0VUX1VOREVSU0NPUkUgKi8KKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK2kzY29mZl9vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorICAvKiBXZSBuZWVkIHRvIGhhY2sgYmFkbHkgdG8gaGFuZGxlIGEgUEUgaW1hZ2UgY29ycmVjdGx5LiAgSW4gUEUKKyAgICAgaW1hZ2VzIGNyZWF0ZWQgYnkgdGhlIEdOVSBsaW5rZXIsIHRoZSBvZmZzZXQgdG8gdGhlIENPRkYgaGVhZGVyCisgICAgIGlzIGFsd2F5cyB0aGUgc2l6ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGltYWdlcworICAgICBnZW5lcmF0ZWQgYnkgb3RoZXIgUEUgbGlua2Vycy4gIFRoZSBQRSBmb3JtYXQgc3RvcmVzIGEgZm91ciBieXRlCisgICAgIG9mZnNldCB0byB0aGUgUEUgc2lnbmF0dXJlIGp1c3QgYmVmb3JlIHRoZSBDT0ZGIGhlYWRlciBhdAorICAgICBsb2NhdGlvbiAweDNjIG9mIHRoZSBmaWxlLiAgV2UgcGljayB1cCB0aGF0IG9mZnNldCwgdmVyaWZ5IHRoYXQKKyAgICAgdGhlIFBFIHNpZ25hdHVyZSBpcyB0aGVyZSwgYW5kIHRoZW4gc2V0IG91cnNlbHZlcyB1cCB0byByZWFkIGluCisgICAgIHRoZSBDT0ZGIGhlYWRlci4gICovCisgIHsKKyAgICBiZmRfYnl0ZSBleHRfb2Zmc2V0WzRdOworICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICBiZmRfYnl0ZSBleHRfc2lnbmF0dXJlWzRdOworICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlOworCisgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAweDNjLCBTRUVLX1NFVCkgIT0gMAorCXx8IGJmZF9yZWFkIChleHRfb2Zmc2V0LCAxLCA0LCBhYmZkKSAhPSA0KQorICAgICAgeworCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCXJldHVybiBOVUxMOworICAgICAgfQorICAgIG9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X29mZnNldCk7CisgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJfHwgYmZkX3JlYWQgKGV4dF9zaWduYXR1cmUsIDEsIDQsIGFiZmQpICE9IDQpCisgICAgICB7CisJaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgc2lnbmF0dXJlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfc2lnbmF0dXJlKTsKKworICAgIGlmIChzaWduYXR1cmUgIT0gMHg0NTUwKQorICAgICAgeworCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCXJldHVybiBOVUxMOworICAgICAgfQorCisgICAgLyogSGVyZSBpcyB0aGUgaGFjay4gIGNvZmZfb2JqZWN0X3Agd2FudHMgdG8gcmVhZCBmaWxoc3ogYnl0ZXMgdG8KKyAgICAgICBwaWNrIHVwIHRoZSBDT0ZGIGhlYWRlci4gIFdlIGFkanVzdCBzbyB0aGF0IHRoYXQgd2lsbCB3b3JrLiAgMjAKKyAgICAgICBpcyB0aGUgc2l6ZSBvZiB0aGUgaTM4NiBDT0ZGIGZpbGVoZHIuICAqLworCisgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkgIChiZmRfdGVsbCAoYWJmZCkKKwkJICAgLSBiZmRfY29mZl9maWxoc3ogKGFiZmQpCisJCSAgICsgMjApLAorCQkgIFNFRUtfU0VUKQorCSE9IDApCisgICAgICB7CisJaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKK30KKworY29uc3QgYmZkX3RhcmdldAorI2lmZGVmIFRBUkdFVF9TWU0KKyAgVEFSR0VUX1NZTSA9CisjZWxzZQorICBpMzg2Y29mZl92ZWMgPQorI2VuZGlmCit7CisjaWZkZWYgVEFSR0VUX05BTUUKKyAgVEFSR0VUX05BTUUsCisjZWxzZQorICAiY29mZi1pMzg2IiwJCQkvKiBuYW1lICovCisjZW5kaWYKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKworI2lmbmRlZiBDT0ZGX1dJVEhfUEUKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCisgICB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAorI2Vsc2UKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCisgICB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKKyAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAorI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfVU5ERVJTQ09SRQorICBUQVJHRVRfVU5ERVJTQ09SRSwJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworI2Vsc2UKKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisjZW5kaWYKKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KKworLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KKyAgICB7X2JmZF9kdW1teV90YXJnZXQsIGkzY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgaTNjb2ZmX29iamVjdF9wfSwKKyAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICAgIGJmZF9mYWxzZX0sCisgICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIENPRkZfU1dBUF9UQUJMRSwKK307CmRpZmYgLS1naXQgYS9iZmQvY29mZi1pODYwLmMgYi9iZmQvY29mZi1pODYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ZmE0MgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLWk4NjAuYwpAQCAtMCwwICsxLDQyMiBAQAorLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA4NjAgQ09GRiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDcmVhdGVkIG1vc3RseSBieSBzdWJzdGl0dXRpbmcgIjg2MCIgZm9yICIzODYiIGluIGNvZmYtaTM4Ni5jCisgICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgImNvZmYvaTg2MC5oIgorCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibGliY29mZi5oIgorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTg2MF9yZWxvYyAKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKKwkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAorCSAgIGJmZF92bWEgKikpOworCisjZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKKy8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLworCisjZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAorCisvKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpODYwIENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKKyAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKKyAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KKworLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKKyAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKKyAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQorICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2NvZmZfaTg2MF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKKwkJIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBzeW12YWx1ZSBkaWZmOworCisgIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworCisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICB7CisgICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKKwkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCisJIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKKwkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCisJIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQorCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCisJIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQorCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCisJIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgorCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAorCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KKyAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKKwkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCisJIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgODYwCisJIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCisgICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgICB9CisKKworI2RlZmluZSBET0lUKHgpIFwKKyAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCisKKyAgICBpZiAoZGlmZiAhPSAwKQorICAgICAgeworCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOworCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7CisKKwlzd2l0Y2ggKGhvd3RvLT5zaXplKQorCSAgeworCSAgY2FzZSAwOgorCSAgICB7CisJICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKKwkgICAgICBET0lUICh4KTsKKwkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIDE6CisJICAgIHsKKwkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7CisJICAgICAgRE9JVCAoeCk7CisJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgMjoKKwkgICAgeworCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOworCSAgICAgIERPSVQgKHgpOworCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBhYm9ydCAoKTsKKwkgIH0KKyAgICAgIH0KKworICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLworICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworfQorCisjaWZuZGVmIFBDUkVMT0ZGU0VUCisjZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCisjZW5kaWYKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAoreworICB7MH0sCisgIHsxfSwKKyAgezJ9LAorICB7M30sCisgIHs0fSwKKyAgezV9LAorICBIT1dUTyAoUl9ESVIzMiwgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgImRpcjMyIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAvKiB7N30sICovCisgIEhPV1RPIChSX0lNQUdFQkFTRSwgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgInJ2YTMyIiwJICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgezAxMH0sCisgIHswMTF9LAorICB7MDEyfSwKKyAgezAxM30sCisgIHswMTR9LAorICB7MDE1fSwKKyAgezAxNn0sCisgIEhPV1RPIChSX1JFTEJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICI4IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgSE9XVE8gKFJfUkVMV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICIxNiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisgIEhPV1RPIChSX1JFTExPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiMzIiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLworICBIT1dUTyAoUl9QQ1JCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiRElTUDgiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisgIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiRElTUDE2IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLworICBIT1dUTyAoUl9QQ1JMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIkRJU1AzMiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLworfTsKKworLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLworCisjZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KKyNkZWZpbmUgQkFETUFHKHgpIEk4NjBCQURNQUcoeCkKKyNkZWZpbmUgSTg2MCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KKworI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAorCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7CisKKy8qIEZvciA4NjAgQ09GRiBhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkCisgICBsaWJyYXJ5LiAgT24gc29tZSBvdGhlciBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgbm9ybWFsbHkKKyAgIFNUWVBfTk9MT0FELiAgKi8KKyNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQorCisvKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCisgICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCisgICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKKyAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKKyAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKKyAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKKyAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQorICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCisgICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKKyAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KKyAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCisgICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCisKKyNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAorICB7CQkJCQkJCQlcCisgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKKyAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKKyAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKKwkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAorICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCisgICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCisgICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKKwkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKKyAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKKwkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAorICAgIGVsc2UJCQkJCQkJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAorICAgIGlmIChwdHIgJiYgaG93dG9fdGFibGVbcmVsb2Mucl90eXBlXS5wY19yZWxhdGl2ZSkJCVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKKyAgfQorCisvKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCisjZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2NvZmZfaTg2MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGJmZF92bWEgKmFkZGVuZHA7Cit7CisKKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisKKyAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOworCisgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCisgICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7CisKKyAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKKwkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgorCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCisJIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQorCSBjb3JyZWN0IHJlc3VsdC4gICovCisgCisgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOworCisKKyAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZSBzZWVuIHNvbWUgZGF0YQorCSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsY2F0aW9uIGFkZHJlc3MuICBJZiBJIGxpbmsgdHdvIHZlcnNpb25zCisJIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sCisJIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgCisJIGNhc2UgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAorCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwICovCisgICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7CisgICAgfQorCisgIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQorICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQorICAgICBjb21tb24gc3ltYm9sLiAgKi8KKyAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAorICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7CisKKyAgcmV0dXJuIGhvd3RvOworfQorCisjZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCisKKyNpbmNsdWRlICJjb2ZmY29kZS5oIgorCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitpM2NvZmZfb2JqZWN0X3AoYSkKKyAgICAgYmZkICphOworeworICByZXR1cm4gY29mZl9vYmplY3RfcChhKTsKK30KKworY29uc3QgYmZkX3RhcmdldAorI2lmZGVmIFRBUkdFVF9TWU0KKyAgVEFSR0VUX1NZTSA9CisjZWxzZQorICBpODYwY29mZl92ZWMgPQorI2VuZGlmCit7CisjaWZkZWYgVEFSR0VUX05BTUUKKyAgVEFSR0VUX05BTUUsCisjZWxzZQorICAiY29mZi1pODYwIiwJCQkvKiBuYW1lICovCisjZW5kaWYKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLworCisvKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLworICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAorICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgICAgYmZkX2ZhbHNlfSwKKyAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk5NjAuYyBiL2JmZC9jb2ZmLWk5NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQ1NWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtaTk2MC5jCkBAIC0wLDAgKzEsNzAzIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDk2MCBDT0ZGIGZpbGVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSTk2MCAxCisjZGVmaW5lIEJBRE1BRyh4KSBJOTYwQkFETUFHKHgpCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgkJLyogdG8gYWxsb3cgZWFzaWVyIGFic3RyYWN0aW9uLWJyZWFraW5nICovCisKK3N0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgb3B0Y2FsbF9jYWxsYmFjaworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9pOTYwX3JlbG9jYXRlCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCisJICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJvb2xlYW4gKikpOworCisjZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKKyNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCisKKyNkZWZpbmUgR0VUX1NDTkhEUl9BTElHTiBiZmRfaF9nZXRfMzIKKyNkZWZpbmUgUFVUX1NDTkhEUl9BTElHTiBiZmRfaF9wdXRfMzIKKworLyogVGhlIGk5NjAgZG9lcyBub3Qgc3VwcG9ydCBhbiBNTVUsIHNvIENPRkZfUEFHRV9TSVpFIGNhbiBiZQorICAgYXJiaXRyYXJpbHkgc21hbGwuICAqLworI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAxCisKKyNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUworCisvKiBUaGlzIHNldCBvZiBsb2NhbCBsYWJlbCBuYW1lcyBpcyB0YWtlbiBmcm9tIGdhcy4gICovCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnCisJICB8fCAobmFtZVswXSA9PSAnLicKKwkgICAgICAmJiAobmFtZVsxXSA9PSAnQycKKwkJICB8fCBuYW1lWzFdID09ICdJJworCQkgIHx8IG5hbWVbMV0gPT0gJy4nKSkpOworfQorCisvKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgdXN1YWwgQ0FMQ19BRERFTkQsIGJ1dCBpdCBpbmNsdWRlcyB0aGUKKyAgIHNlY3Rpb24gVk1BIGZvciBQQyByZWxhdGl2ZSByZWxvY3MuICAqLworI2lmbmRlZiBDQUxDX0FEREVORAorI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAorICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAorICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gMjUgfHwgcmVsb2Mucl90eXBlID09IDI3KSkJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgKz0gYXNlY3QtPnZtYTsJCQkJXAorICB9CisjZW5kaWYKKworI2RlZmluZSBDQUxMUwkgMHg2NjAwMzgwMAkvKiBUZW1wbGF0ZSBmb3IgJ2NhbGxzJyBpbnN0cnVjdGlvbgkqLworI2RlZmluZSBCQUwJIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uCSovCisjZGVmaW5lIEJBTF9NQVNLIDB4MDBmZmZmZmYKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKK29wdGNhbGxfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCisJCSAgaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqaWdub3JlX2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIC8qIFRoaXMgaXRlbSBoYXMgYWxyZWFkeSBiZWVuIHJlbG9jYXRlZCBjb3JyZWN0bHksIGJ1dCB3ZSBtYXkgYmUKKyAgICogYWJsZSB0byBwYXRjaCBpbiB5ZXQgYmV0dGVyIGNvZGUgLSBkb25lIGJ5IGRpZ2dpbmcgb3V0IHRoZQorICAgKiBjb3JyZWN0IGluZm8gb24gdGhpcyBzeW1ib2wgKi8KKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJlc3VsdDsKKyAgY29mZl9zeW1ib2xfdHlwZSAqY3MgPSBjb2Zmc3ltYm9sKHN5bWJvbF9pbik7CisKKyAgLyogRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBzeW1ib2xzIHdoaWNoIGFyZW4ndCB0aWVkIHVwIHlldCwKKyAgICAgZXhjZXB0IG1vdmUgdGhlIHJlbG9jLiAqLworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChjcy0+c3ltYm9sLnNlY3Rpb24pKSB7CisgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICB9CisgICAgCisgIC8qIFNvIHRoZSB0YXJnZXQgc3ltYm9sIGhhcyB0byBiZSBvZiBjb2ZmIHR5cGUsIGFuZCB0aGUgc3ltYm9sIAorICAgICBoYXMgdG8gaGF2ZSB0aGUgY29ycmVjdCBuYXRpdmUgaW5mb3JtYXRpb24gd2l0aGluIGl0ICovCisgIGlmICgoYmZkX2FzeW1ib2xfZmxhdm91cigmY3MtPnN5bWJvbCkgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCisgICAgICB8fCAoY3MtPm5hdGl2ZSA9PSAoY29tYmluZWRfZW50cnlfdHlwZSAqKU5VTEwpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgaW50ZXJlc3RpbmcsIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHdlJ3JlIG91dHB1dHRpbmcgY29mZgorCSBmcm9tIGEgbWl4IG4gbWF0Y2ggaW5wdXQsIGxpbmtpbmcgZnJvbSBjb2ZmIHRvIGEgc3ltYm9sIGRlZmluZWQgaW4gYQorCSBib3V0IGZpbGUgd2lsbCBjYXVzZSB0aGlzIG1hdGNoIHRvIGJlIHRydWUuIFNob3VsZCBJIGNvbXBsYWluPyAgVGhpcworCSB3aWxsIG9ubHkgd29yayBpZiB0aGUgYm91dCBzeW1ib2wgaXMgbm9uIGxlYWYuICAqLworICAgICAgKmVycm9yX21lc3NhZ2UgPQorCShjaGFyICopIF8oInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIpOworICAgICAgcmVzdWx0ID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgc3dpdGNoIChjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcykgCisgICAgICB7CisgICAgICBjYXNlIENfTEVBRlNUQVQ6CisgICAgICBjYXNlIENfTEVBRkVYVDoKKyAgCS8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmUsIHJlcGxhY2UgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhbAorCSAgIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiAgKi8KKwl7CisJICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eCA9ICYoKGNzLT5uYXRpdmUrMiktPnUuYXV4ZW50KTsKKwkgIGludCB3b3JkID0gYmZkX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworCSAgaW50IG9sZiA9IChhdXgtPnhfYmFsLnhfYmFsbnRyeSAtIGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUpOworCSAgQkZEX0FTU0VSVChjcy0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eD09Mik7CisKKwkgIC8qIFdlIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhbCB0bworCSAgICAgdGhlIGJhbCBlbnRyeSBwb2ludCAtIHRoZSBvZmZzZXQgb2Ygd2hpY2ggaXMgZGVzY3JpYmVkIGluCisJICAgICB0aGUgMm5kIGF1eGVudCBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sLiBXZSBrZWVwIHRoZSBuYXRpdmUKKwkgICAgIHN5bSBhbmQgYXV4ZW50cyB1bnRvdWNoZWQsIHNvIHRoZSBkZWx0YSBiZXR3ZWVuIHRoZSB0d28KKwkgICAgIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJhbCBlbnRyeSBwb2ludC4gICovCisJICB3b3JkID0gKCh3b3JkICsgIG9sZikgICYgQkFMX01BU0spIHwgQkFMOworICAJICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworICAJfQorCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKKwlicmVhazsKKyAgICAgIGNhc2UgQ19TQ0FMTDoKKwkvKiBUaGlzIGlzIGEgY2FsbCB0byBhIHN5c3RlbSBjYWxsLCByZXBsYWNlIHdpdGggYSBjYWxscyB0byAjICovCisJQkZEX0FTU0VSVCgwKTsKKwlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXJlc3VsdCA9IGJmZF9yZWxvY19vazsKKwlicmVhazsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBpOTYwIENPRkYgaXMgdXNlZCBieSBWeFdvcmtzIDUuMS4gIEhvd2V2ZXIsIFZ4V29ya3MgNS4xIGRvZXMgbm90CisgICBhcHBlYXIgdG8gY29ycmVjdGx5IGhhbmRsZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUKKyAgIHNhbWUgb2JqZWN0IGZpbGUuICBJdCBhcHBlYXJzIHRvIHNpbXBseSBkaXNjYXJkIHN1Y2ggcmVsb2NzLCByYXRoZXIKKyAgIHRoYW4gYWRkaW5nIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGhlcmUKKyAgIGJ5IGNvbnZlcnRpbmcgYWxsIHJlbG9jcyBhZ2FpbnN0IGRlZmluZWQgc3ltYm9scyBpbnRvIHJlbG9jcworICAgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wsIHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQKKyAgIGZpbGUuCisKKyAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSBub3QgdXNpbmcgdGhlIENPRkYKKyAgIHNwZWNpZmljIGJhY2tlbmQgbGlua2VyLiAgSXQgb25seSBkb2VzIHNvbWV0aGluZyB3aGVuIGRvaW5nIGEKKyAgIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgZmFpbCB3aGVuIG5vdAorICAgZ2VuZXJhdGluZyBDT0ZGIGk5NjAgb3V0cHV0LCBzbyB0aGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IG5vIGxvbmdlcgorICAgdXNlZnVsLiAgSXQgd2FzIHVzZWQgYmVmb3JlIHRoaXMgdGFyZ2V0IHdhcyBjb252ZXJ0ZWQgdG8gdXNlIHRoZQorICAgQ09GRiBzcGVjaWZpYyBiYWNrZW5kIGxpbmtlci4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCitjb2ZmX2k5NjBfcmVsb2NhdGUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYXNlY3Rpb24gKm9zZWM7CisKKyAgaWYgKG91dHB1dF9iZmQgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBOb3QgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUuICAqLworICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKyAgICB9CisKKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKKyAgICB7CisgICAgICAvKiBTeW1ib2wgaXMgbm90IGRlZmluZWQsIHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXQuICAqLworICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKyAgICB9CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpKSkKKyAgICB7CisgICAgICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhlIHJpZ2h0IGFjdGlvbiBpcyBmb3IgYSBjb21tb24KKyAgICAgICAgIHN5bWJvbC4gICovCisgICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworICAgIH0KKworICAvKiBDb252ZXJ0IHRoZSByZWxvYyB0byB1c2UgdGhlIHNlY3Rpb24gc3ltYm9sLiAgRklYTUU6IFRoaXMgbWV0aG9kCisgICAgIGlzIHJpZGljdWxvdXMuICAqLworICBvc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW1ib2wpLT5vdXRwdXRfc2VjdGlvbjsKKyAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKSAhPSBOVUxMCisgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhICE9IE5VTEwpCisgICAgcmVsb2NfZW50cnktPnN5bV9wdHJfcHRyID0KKyAgICAgIChhc3ltYm9sICoqKSBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhOworICBlbHNlCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VjX25hbWU7CisgICAgICBhc3ltYm9sICoqc3ltcywgKipzeW1fZW5kOworCisgICAgICBzZWNfbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBvc2VjKTsKKyAgICAgIHN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOworICAgICAgc3ltX2VuZCA9IHN5bXMgKyBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKKyAgICAgIGZvciAoOyBzeW1zIDwgc3ltX2VuZDsgc3ltcysrKQorCXsKKwkgIGlmIChiZmRfYXN5bWJvbF9uYW1lICgqc3ltcykgIT0gTlVMTAorCSAgICAgICYmICgqc3ltcyktPnZhbHVlID09IDAKKwkgICAgICAmJiBzdHJjbXAgKCgqc3ltcyktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5uYW1lLAorCQkJIHNlY19uYW1lKSA9PSAwKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIGlmIChzeW1zID49IHN5bV9lbmQpCisJYWJvcnQgKCk7CisKKyAgICAgIHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0ciA9IHN5bXM7CisKKyAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYykgPT0gTlVMTCkKKwl7CisJICBvc2VjLT51c2VkX2J5X2JmZCA9CisJICAgICgoUFRSKSBiZmRfemFsbG9jIChhYmZkLAorCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKKwkgIGlmIChvc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQorCSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCX0KKyAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChvdXRwdXRfYmZkLCBvc2VjKS0+dGRhdGEgPSAoUFRSKSBzeW1zOworICAgIH0KKworICAvKiBMZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBkbyBpdHMgdGhpbmcsIHdoaWNoIHdpbGwgaW5jbHVkZQorICAgICBzdHVmZmluZyB0aGUgc3ltYm9sIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCisgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Cit9CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbGxvbmcgPQorICBIT1dUTyAoKHVuc2lnbmVkIGludCkgUl9SRUxMT05HLCAwLCAyLCAzMixmYWxzZSwgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGNvZmZfaTk2MF9yZWxvY2F0ZSwicmVsbG9uZyIsIHRydWUsCisJIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDApOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9faXBybWVkID0KKyAgSE9XVE8gKFJfSVBSTUVELCAwLCAyLCAyNCx0cnVlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKKwkgY29mZl9pOTYwX3JlbG9jYXRlLCAiaXBybWVkICIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIDApOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fb3B0Y2FsbCA9CisgIEhPV1RPIChSX09QVENBTEwsIDAsMiwyNCx0cnVlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKKwkgb3B0Y2FsbF9jYWxsYmFjaywgIm9wdGNhbGwiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAwKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorY29mZl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgorICAgICAgcmV0dXJuICZob3d0b19vcHRjYWxsOworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CisgICAgICByZXR1cm4gJmhvd3RvX3JlbGxvbmc7CisgICAgY2FzZSBCRkRfUkVMT0NfMjRfUENSRUw6CisgICAgICByZXR1cm4gJmhvd3RvX2lwcm1lZDsKKyAgICB9Cit9CisKKy8qIFRoZSByZWFsIGNvZGUgaXMgaW4gY29mZmNvZGUuaCAqLworCisjZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCit7CQkJCQkJCVwKKyAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3B0cjsJCQkJXAorICAgc3dpdGNoICgoZHN0KS0+cl90eXBlKSB7CQkJCVwKKyAgICAgY2FzZSAxNzogaG93dG9fcHRyID0gJmhvd3RvX3JlbGxvbmc7IGJyZWFrOwlcCisgICAgIGNhc2UgMjU6IGhvd3RvX3B0ciA9ICZob3d0b19pcHJtZWQ7IGJyZWFrOwkJXAorICAgICBjYXNlIDI3OiBob3d0b19wdHIgPSAmaG93dG9fb3B0Y2FsbDsgYnJlYWs7CVwKKyAgICAgZGVmYXVsdDogaG93dG9fcHRyID0gMDsgYnJlYWs7CQkJXAorICAgICB9CQkJCQkJCVwKKyAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGhvd3RvX3B0cjsJCQlcCisgfQorCisvKiBpOTYwIENPRkYgaXMgdXNlZCBieSBWeFdvcmtzIDUuMS4gIEhvd2V2ZXIsIFZ4V29ya3MgNS4xIGRvZXMgbm90CisgICBhcHBlYXIgdG8gY29ycmVjdGx5IGhhbmRsZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUKKyAgIHNhbWUgb2JqZWN0IGZpbGUuICBJdCBhcHBlYXJzIHRvIHNpbXBseSBkaXNjYXJkIHN1Y2ggcmVsb2NzLCByYXRoZXIKKyAgIHRoYW4gYWRkaW5nIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFdlIGhhbmRsZSB0aGlzIGJ5CisgICBjb252ZXJ0aW5nIGFsbCByZWxvY3MgYWdhaW5zdCBnbG9iYWwgc3ltYm9scyBpbnRvIHJlbG9jcyBhZ2FpbnN0CisgICBpbnRlcm5hbCBzeW1ib2xzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgcm91dGluZSBpcworICAgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlua2luZyBwcm9jZXNzLCBhbmQgaXQgY3JlYXRlcyB0aGUKKyAgIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfaTk2MF9zdGFydF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisgIGFzZWN0aW9uICpvOworICBiZmRfYnl0ZSAqZXN5bTsKKworICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZXN5bSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzeW1lc3opOworICBpZiAoZXN5bSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07CisKKyAgICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgby0+bmFtZSwgU1lNTk1MRU4pOworICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKKyAgICAgIGlzeW0ubl9zY251bSA9IG8tPnRhcmdldF9pbmRleDsKKyAgICAgIGlzeW0ubl90eXBlID0gVF9OVUxMOworICAgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKKyAgICAgIGlzeW0ubl9udW1hdXggPSAwOworCisgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZpc3ltLCAoUFRSKSBlc3ltKTsKKworICAgICAgaWYgKGJmZF93cml0ZSAoZXN5bSwgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCisJeworCSAgZnJlZSAoZXN5bSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKz0gMTsKKyAgICB9CisKKyAgZnJlZSAoZXN5bSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgICBjb250ZW50cywgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOworICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOworeworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgbG9uZyBzeW1uZHg7CisgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgICBiZmRfdm1hIGFkZGVuZDsKKyAgICAgIGJmZF92bWEgdmFsOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7CisgICAgICBib29sZWFuIGRvbmU7CisKKyAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7CisKKyAgICAgIGlmIChzeW1uZHggPT0gLTEpCisJeworCSAgaCA9IE5VTEw7CisJICBzeW0gPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7ICAgIAorCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKKwkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7CisJfQorCisgICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCisJYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7CisgICAgICBlbHNlCisJYWRkZW5kID0gMDsKKworICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKKwl7CisJY2FzZSAxNzogaG93dG8gPSAmaG93dG9fcmVsbG9uZzsgYnJlYWs7CisJY2FzZSAyNTogaG93dG8gPSAmaG93dG9faXBybWVkOyBicmVhazsKKwljYXNlIDI3OiBob3d0byA9ICZob3d0b19vcHRjYWxsOyBicmVhazsKKwlkZWZhdWx0OgorCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICB2YWwgPSAwOworCisgICAgICBpZiAoaCA9PSBOVUxMKQorCXsKKwkgIGFzZWN0aW9uICpzZWM7CisKKwkgIGlmIChzeW1uZHggPT0gLTEpCisJICAgIHsKKwkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgICAgIHZhbCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07CisgICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAorCQkgICAgICsgc3ltLT5uX3ZhbHVlCisJCSAgICAgLSBzZWMtPnZtYSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnNlYzsKKworCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCSAgICB9CisJICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICBkb25lID0gZmFsc2U7CisKKyAgICAgIGlmIChob3d0by0+dHlwZSA9PSBSX09QVENBTEwgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUgJiYgc3ltbmR4ICE9IC0xKQorCXsKKwkgIGludCBjbGFzczsKKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgY2xhc3MgPSBoLT5jbGFzczsKKwkgIGVsc2UKKwkgICAgY2xhc3MgPSBzeW0tPm5fc2NsYXNzOworCisJICBzd2l0Y2ggKGNsYXNzKQorCSAgICB7CisJICAgIGNhc2UgQ19OVUxMOgorCSAgICAgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgbm90IGZyb20gYSBDT0ZGIGlucHV0IGZpbGUuCisgICAgICAgICAgICAgICAgIFdlIHdhcm4sIGFuZCB0aGVuIGFzc3VtZSB0aGF0IGl0IGlzIG5vdCBhIGxlYWYKKyAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICAqLworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQorCQkgICAgIChpbmZvLAorCQkgICAgICBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKSwKKwkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENfTEVBRlNUQVQ6CisJICAgIGNhc2UgQ19MRUFGRVhUOgorCSAgICAgIC8qIFRoaXMgaXMgYSBjYWxsIHRvIGEgbGVhZiBwcm9jZWR1cmU7IHVzZSB0aGUgYmFsCisgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgKi8KKwkgICAgICB7CisJCWxvbmcgb2xmOworCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisKKwkJaWYgKGggIT0gTlVMTCkKKwkJICB7CisJCSAgICBCRkRfQVNTRVJUIChoLT5udW1hdXggPT0gMik7CisJCSAgICBvbGYgPSBoLT5hdXhbMV0ueF9iYWwueF9iYWxudHJ5OworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGJmZF9ieXRlICplc3ltczsKKwkJICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7CisKKwkJICAgIEJGRF9BU1NFUlQgKHN5bS0+bl9udW1hdXggPT0gMik7CisJCSAgICBlc3ltcyA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOworCQkgICAgZXN5bXMgKz0gKHN5bW5keCArIDIpICogYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOworCQkgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bXMsIHN5bS0+bl90eXBlLAorCQkJCQkgIHN5bS0+bl9zY2xhc3MsIDEsIHN5bS0+bl9udW1hdXgsCisJCQkJCSAgKFBUUikgJmF1eCk7CisJCSAgICBvbGYgPSBhdXgueF9iYWwueF9iYWxudHJ5OworCQkgIH0KKworCQl3b3JkID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAorCQkJCSAgIChjb250ZW50cworCQkJCSAgICArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7CisJCXdvcmQgPSAoKHdvcmQgKyBvbGYgLSB2YWwpICYgQkFMX01BU0spIHwgQkFMOworCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsCisJCQkgICAgd29yZCwKKwkJCSAgICAoY29udGVudHMKKwkJCSAgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOworCQlkb25lID0gdHJ1ZTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ19TQ0FMTDoKKwkgICAgICBCRkRfQVNTRVJUICgwKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgZG9uZSkKKwl7CisJICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorCSAgICBhZGRlbmQgKz0gaW5wdXRfc2VjdGlvbi0+dm1hOworCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgICBjb250ZW50cywKKwkJCQkJICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKKwkJCQkJICAgIHZhbCwgYWRkZW5kKTsKKwl9CisKKyAgICAgIHN3aXRjaCAocnN0YXQpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCisJICAgIGlmIChzeW1uZHggPT0gLTEpCisJICAgICAgbmFtZSA9ICIqQUJTKiI7CisJICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7CisJCWlmIChuYW1lID09IE5VTEwpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKworCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCisJCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRqdXN0IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHRvCisgICBpbnN0ZWFkIGJlIGEgcmVsb2MgYWdhaW5zdCB0aGUgaW50ZXJuYWwgc3ltYm9sIHdlIGNyZWF0ZWQgc3BlY2lhbGx5CisgICBmb3IgdGhlIHNlY3Rpb24uICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keCAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCBpcmVsLCBhZGp1c3RlZHApCisgICAgIGJmZCAqb2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOworICAgICBib29sZWFuICphZGp1c3RlZHA7Cit7CisgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAqYWRqdXN0ZWRwID0gZmFsc2U7CisKKyAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKKyAgaWYgKGggPT0gTlVMTAorICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQorICAgIHJldHVybiB0cnVlOworCisgIGlyZWwtPnJfc3ltbmR4ID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4IC0gMTsKKyAgKmFkanVzdGVkcCA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZQorCisjZGVmaW5lIGNvZmZfc3RhcnRfZmluYWxfbGluayBjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluaworCisjZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX2k5NjBfcmVsb2NhdGVfc2VjdGlvbgorCisjZGVmaW5lIGNvZmZfYWRqdXN0X3N5bW5keCBjb2ZmX2k5NjBfYWRqdXN0X3N5bW5keAorCisjZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cAorCisjaW5jbHVkZSAiY29mZmNvZGUuaCIKKworY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjID0KK3sKKyAgImNvZmYtSW50ZWwtbGl0dGxlIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisKKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisKKyB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAorIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAorIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIENPRkZfU1dBUF9UQUJMRSwKK307CisKKworY29uc3QgYmZkX3RhcmdldCBpY29mZl9iaWdfdmVjID0KK3sKKyAgImNvZmYtSW50ZWwtYmlnIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisKK2JmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KK2JmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKworICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW02OGsuYyBiL2JmZC9jb2ZmLW02OGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTA2YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtbTY4ay5jCkBAIC0wLDAgKzEsNDgwIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIDY4MDAwIENPRkYgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImNvZmYvbTY4ay5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKKy8qIFRoaXMgc291cmNlIGZpbGUgaXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHZhcmlvdXMgbTY4ayBDT0ZGCisgICB2YXJpYW50cy4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyb2wgaXRzIGJlaGF2aW91cjoKKworICAgVEFSR0VUX1NZTQorICAgICBUaGUgQyBuYW1lIG9mIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4gIFRoZSBkZWZhdWx0IGlzIG02OGtjb2ZmX3ZlYy4KKyAgIFRBUkdFVF9OQU1FCisgICAgIFRoZSB1c2VyIHZpc2libGUgdGFyZ2V0IG5hbWUuICBUaGUgZGVmYXVsdCBpcyAiY29mZi1tNjhrIi4KKyAgIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQorICAgICBXaGV0aGVyIHN5bWJvbCBuYW1lcyBoYXZlIGFuIHVuZGVyc2NvcmUuCisgICBPTkxZX0RFQ0xBUkVfUkVMT0NTCisgICAgIE9ubHkgZGVjbGFyZSB0aGUgcmVsb2NhdGlvbiBob3d0byBhcnJheS4gIERvbid0IGFjdHVhbGx5IGNvbXBpbGUKKyAgICAgaXQuICBUaGUgYWN0dWFsIGFycmF5IHdpbGwgYmUgcGlja2VkIHVwIGluIGFub3RoZXIgdmVyc2lvbiBvZiB0aGUKKyAgICAgZmlsZS4KKyAgIFNUQVRJQ19SRUxPQ1MKKyAgICAgTWFrZSB0aGUgcmVsb2NhdGlvbiBob3d0byBhcnJheSwgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25zLCBzdGF0aWMuCisgICBDT0ZGX0NPTU1PTl9BRERFTkQKKyAgICAgSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGVuLCBmb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBjb21tb24KKyAgICAgc3ltYm9sLCB0aGUgb2JqZWN0IGZpbGUgaG9sZHMgdGhlIHZhbHVlICh0aGUgc2l6ZSkgb2YgdGhlIGNvbW1vbgorICAgICBzeW1ib2wuICBJZiB0aGlzIGlzIG5vdCBkZWZpbmVkLCB0aGVuLCBmb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYQorICAgICBjb21tb24gc3ltYm9sLCB0aGUgb2JqZWN0IGZpbGUgaG9sZHMgemVyby4gICovCisKKyNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQorCisjaWZuZGVmIENPRkZfUEFHRV9TSVpFCisvKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KKyNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgyMDAwCisjZW5kaWYKKworI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKKyNkZWZpbmUgUkVMT0NfU1BFQ0lBTF9GTiAwCisjZWxzZQorc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4KKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCisJICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKKwkgICBiZmRfdm1hICopKTsKKyNkZWZpbmUgUkVMT0NfU1BFQ0lBTF9GTiBtNjhrY29mZl9jb21tb25fYWRkZW5kX3NwZWNpYWxfZm4KKyNlbmRpZgorCitzdGF0aWMgYm9vbGVhbiBtNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CisKKy8qIE9uIHRoZSBkZWx0YSwgYSBzeW1ib2wgc3RhcnRpbmcgd2l0aCBMJSBpcyBsb2NhbC4gIFdlIHdvbid0IHNlZQorICAgc3VjaCBhIHN5bWJvbCBvbiBvdGhlciBwbGF0Zm9ybXMsIHNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGFsd2F5cworICAgY29uc2lkZXIgaXQgbG9jYWwgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCittNjhrX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpZiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJScpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKK30KKworI2lmbmRlZiBTVEFUSUNfUkVMT0NTCisvKiBDbGVhbiB1cCBuYW1lc3BhY2UuICAqLworI2RlZmluZSBtNjhrY29mZl9ob3d0b190YWJsZQlfYmZkX202OGtjb2ZmX2hvd3RvX3RhYmxlCisjZGVmaW5lIG02OGtfcnR5cGUyaG93dG8JX2JmZF9tNjhrY29mZl9ydHlwZTJob3d0bworI2RlZmluZSBtNjhrX2hvd3RvMnJ0eXBlCV9iZmRfbTY4a2NvZmZfaG93dG8ycnR5cGUKKyNkZWZpbmUgbTY4a19yZWxvY190eXBlX2xvb2t1cAlfYmZkX202OGtjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCisjZW5kaWYKKworI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKK2V4dGVybiByZWxvY19ob3d0b190eXBlIG02OGtjb2ZmX2hvd3RvX3RhYmxlW107CisjZWxzZQorI2lmZGVmIFNUQVRJQ19SRUxPQ1MKK3N0YXRpYworI2VuZGlmCityZWxvY19ob3d0b190eXBlIG02OGtjb2ZmX2hvd3RvX3RhYmxlW10gPSAKK3sKKyAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKK307CisjZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KKworI2lmbmRlZiBCQURNQUcKKyNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKKyNlbmRpZgorI2RlZmluZSBNNjggMQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KKworLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KKworI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKK2V4dGVybiB2b2lkIG02OGtfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7CitleHRlcm4gaW50IG02OGtfaG93dG8ycnR5cGUgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqKSk7CitleHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqbTY4a19yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CisjZWxzZQorI2lmZGVmIFNUQVRJQ19SRUxPQ1MKK3N0YXRpYworI2VuZGlmCit2b2lkCittNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCByZWxvY2VudHJ5KQorICAgICBhcmVsZW50ICppbnRlcm5hbDsKKyAgICAgaW50IHJlbG9jZW50cnk7Cit7CisgIHN3aXRjaCAocmVsb2NlbnRyeSkgCisgIHsKKyAgIGNhc2UgUl9SRUxCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7IGJyZWFrOworICAgY2FzZSBSX1JFTFdPUkQ6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7CisgICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOyBicmVhazsKKyAgIGNhc2UgUl9QQ1JCWVRFOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7IGJyZWFrOworICAgY2FzZSBSX1BDUldPUkQ6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7CisgICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA1OyBicmVhazsKKyAgIGNhc2UgUl9SRUxMT05HX05FRzoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA2OyBicmVhazsKKyAgfQorfQorCisjaWZkZWYgU1RBVElDX1JFTE9DUworc3RhdGljCisjZW5kaWYKK2ludCAKK202OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQorICAgICByZWxvY19ob3d0b190eXBlICppbnRlcm5hbDsKK3sKKyAgaWYgKGludGVybmFsLT5wY19yZWxhdGl2ZSkgCisgIHsKKyAgICBzd2l0Y2ggKGludGVybmFsLT5iaXRzaXplKSAKKyAgICB7CisgICAgIGNhc2UgMzI6IHJldHVybiBSX1BDUkxPTkc7CisgICAgIGNhc2UgMTY6IHJldHVybiBSX1BDUldPUkQ7CisgICAgIGNhc2UgODogcmV0dXJuIFJfUENSQllURTsKKyAgICB9CisgIH0KKyAgZWxzZSAKKyAgeworICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpIAorICAgICB7CisgICAgICBjYXNlIDMyOiByZXR1cm4gUl9SRUxMT05HOworICAgICAgY2FzZSAxNjogcmV0dXJuIFJfUkVMV09SRDsKKyAgICAgIGNhc2UgODogcmV0dXJuIFJfUkVMQllURTsKKyAgICAgfQorICB9CisgIHJldHVybiBSX1JFTExPTkc7ICAgIAorfQorCisjaWZkZWYgU1RBVElDX1JFTE9DUworc3RhdGljCisjZW5kaWYKK3JlbG9jX2hvd3RvX3R5cGUgKgorbTY4a19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBkZWZhdWx0OgkJCXJldHVybiBOVUxMOworICAgIGNhc2UgQkZEX1JFTE9DXzg6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAwOworICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMTsKKyAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgorICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJcmV0dXJuIG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMjsKKyAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAzOworICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA0OworICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOglyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA1OworICAgICAgLyogRklYTUU6IFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGNvZGUgZm9yIFJfUkVMTE9OR19ORUcuICAqLworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKworI2VuZGlmIC8qIG5vdCBPTkxZX0RFQ0xBUkVfUkVMT0NTICovCisKKyNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIFwKKyAgbTY4a19ydHlwZTJob3d0byhpbnRlcm5hbCwgKHJlbG9jZW50cnkpLT5yX3R5cGUpCisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKGV4dGVybmFsLCBpbnRlcm5hbCkgXAorICBleHRlcm5hbC5yX3R5cGUgPSBtNjhrX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKKworI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtNjhrX3JlbG9jX3R5cGVfbG9va3VwCisKKyNpZm5kZWYgQ09GRl9DT01NT05fQURERU5ECisjaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KKworI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIG02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICptNjhrY29mZl9ydHlwZV90b19ob3d0bworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCisJICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKKwkgICBiZmRfdm1hICopKTsKKworLypBUkdTVVNFRCovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCittNjhrY29mZl9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGJmZF92bWEgKmFkZGVuZHA7Cit7CisgIGFyZWxlbnQgcmVsZW50OworICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKworICBSVFlQRTJIT1dUTyAoJnJlbGVudCwgcmVsKTsKKworICBob3d0byA9IHJlbGVudC5ob3d0bzsKKworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorICAgICphZGRlbmRwICs9IHNlYy0+dm1hOworCisgIHJldHVybiBob3d0bzsKK30KKworI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKENPRkZfQ09NTU9OX0FEREVORCkgKi8KKwwKKyNpZmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKKworLyogSWYgQ09GRl9DT01NT05fQURERU5EIGlzIGRlZmluZWQsIHRoZW4gd2hlbiB1c2luZyBtNjhrIENPRkYgdGhlCisgICB2YWx1ZSBzdG9yZWQgaW4gdGhlIC50ZXh0IHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uCisgICBzeW1ib2wgaXMgdGhlIHZhbHVlIGl0c2VsZiBwbHVzIGFueSBkZXNpcmVkIG9mZnNldC4gICh0YWtlbiBmcm9tCisgICB3b3JrIGRvbmUgYnkgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsIGZvciBJMzg2IENPRkYpLiAgKi8KKworLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKKyAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKKyAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQorICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK202OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJCQkgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgc3ltdmFsdWUgZGlmZjsKKworICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQorCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKKwkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAorCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKKwkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCisJIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KKwkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5CisJIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KKwkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCisJIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCisJIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLworICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGFsd2F5cyBlZmZlY3RpdmVseQorCSBpZ25vcmVzIHRoZSBhZGRlbmQgZm9yIGEgQ09GRiB0YXJnZXQgd2hlbiBwcm9kdWNpbmcKKwkgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoaXMgc2VlbXMgdG8gYmUgYWx3YXlzIHdyb25nIGZvciAzODYKKwkgQ09GRiwgc28gd2UgaGFuZGxlIHRoZSBhZGRlbmQgaGVyZSBpbnN0ZWFkLiAgKi8KKyAgICAgIGRpZmYgPSByZWxvY19lbnRyeS0+YWRkZW5kOworICAgIH0KKworI2RlZmluZSBET0lUKHgpIFwKKyAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCisKKyAgaWYgKGRpZmYgIT0gMCkKKyAgICB7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7CisKKyAgICAgIHN3aXRjaCAoaG93dG8tPnNpemUpCisJeworCWNhc2UgMDoKKwkgIHsKKwkgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKKwkgICAgRE9JVCAoeCk7CisJICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7CisJICB9CisJICBicmVhazsKKworCWNhc2UgMToKKwkgIHsKKwkgICAgc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHIpOworCSAgICBET0lUICh4KTsKKwkgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7CisJICB9CisJICBicmVhazsKKworCWNhc2UgMjoKKwkgIHsKKwkgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7CisJICAgIERPSVQgKHgpOworCSAgICBiZmRfcHV0XzMyIChhYmZkLCB4LCBhZGRyKTsKKwkgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgLyogTm93IGxldCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGZpbmlzaCBldmVyeXRoaW5nIHVwLiAgKi8KKyAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKK30KKworLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAorICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQorICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCisgICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCisgICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCisgICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCisgICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKKyAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAorICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCisgICBQQyByZWxhdGl2ZSByZWxvY3MuCisgICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQorICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLworCisjZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKKyAgewkJCQkJCQkJXAorICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCisgICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCisgICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCisJICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKKyAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAorICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAorICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCisJJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCisgICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCisJICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKKyAgICBlbHNlCQkJCQkJCVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKKyAgICBpZiAocHRyICYmIChyZWxvYy5yX3R5cGUgPT0gUl9QQ1JCWVRFCQkJXAorCQl8fCByZWxvYy5yX3R5cGUgPT0gUl9QQ1JXT1JECQkJXAorCQl8fCByZWxvYy5yX3R5cGUgPT0gUl9QQ1JMT05HKSkJCQlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCisgIH0KKworI2lmbmRlZiBjb2ZmX3J0eXBlX3RvX2hvd3RvCisKKy8qIGNvZmYtbTY4ay5jIHVzZXMgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gIFdlIG5lZWQgdG8KKyAgIGFkanVzdCBjb21tb24gc3ltYm9scy4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGJmZF92bWEgKmFkZGVuZHA7Cit7CisgIGFyZWxlbnQgcmVsZW50OworICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKworICBSVFlQRTJIT1dUTyAoJnJlbGVudCwgcmVsKTsKKworICBob3d0byA9IHJlbGVudC5ob3d0bzsKKworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorICAgICphZGRlbmRwICs9IHNlYy0+dm1hOworCisgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCisJIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KKwkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQorCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKKwkgY29ycmVjdCByZXN1bHQuICAqLworICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKKyAgICAgICphZGRlbmRwIC09IHN5bS0+bl92YWx1ZTsKKyAgICB9CisKKyAgLyogSWYgdGhlIG91dHB1dCBzeW1ib2wgaXMgY29tbW9uIChpbiB3aGljaCBjYXNlIHRoaXMgbXVzdCBiZSBhCisgICAgIHJlbG9jYXRlYWJsZSBsaW5rKSwgd2UgbmVlZCB0byBhZGQgaW4gdGhlIGZpbmFsIHNpemUgb2YgdGhlCisgICAgIGNvbW1vbiBzeW1ib2wuICAqLworICBpZiAoaCAhPSBOVUxMICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKyAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOworCisgIHJldHVybiBob3d0bzsKK30KKworI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfcnR5cGVfdG9faG93dG8KKworI2VuZGlmIC8qICEgZGVmaW5lZCAoY29mZl9ydHlwZV90b19ob3d0bykgKi8KKworI2VuZGlmIC8qIENPRkZfQ09NTU9OX0FEREVORCAqLworDAorI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCisKKyNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24KKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKKyNpZm5kZWYgVEFSR0VUX1NZTQorI2RlZmluZSBUQVJHRVRfU1lNIG02OGtjb2ZmX3ZlYworI2VuZGlmCisKKyNpZm5kZWYgVEFSR0VUX05BTUUKKyNkZWZpbmUgVEFSR0VUX05BTUUgImNvZmYtbTY4ayIKKyNlbmRpZgorCitjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9TWU0gPQoreworICBUQVJHRVRfTkFNRSwKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworI2lmZGVmIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQorICAnXycsCisjZWxzZQorICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyNlbmRpZgorICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKworIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgIGJmZF9mYWxzZX0sCisge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbTg4ay5jIGIvYmZkL2NvZmYtbTg4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTBiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi1tODhrLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgODgwMDAgQ09GRiAiQmluYXJ5IENvbXBhdGFiaWxpdHkgU3RhbmRhcmQiIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgTTg4IDEJCS8qIEN1c3RvbWl6ZSB2YXJpb3VzIGluY2x1ZGUgZmlsZXMgKi8KKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL204OGsuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCitzdGF0aWMgYm9vbGVhbiBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtODhrX3NwZWNpYWxfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgdm9pZCBydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7CitzdGF0aWMgdm9pZCByZWxvY19wcm9jZXNzaW5nCisgIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGFzeW1ib2wgKiosIGJmZCAqLCBhc2VjdGlvbiAqKSk7CisKKyNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQorCisjZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8zMgorI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8zMgorCisvKiBPbiBjb2ZmLW04OGssIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICdAJy4gICovCisKKyNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUKKworc3RhdGljIGJvb2xlYW4KK204OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZXR1cm4gbmFtZVswXSA9PSAnQCc7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCittODhrX3NwZWNpYWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87CisKKyAgc3dpdGNoIChob3d0by0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBSX0hWUlQxNjoKKyAgICBjYXNlIFJfTFZSVDE2OgorICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorCXsKKwkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZQorCSAgICAgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLgorCSAgICAgTW9kaWZ5IHRoZSByZWxvYyBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCisKKwkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOworCSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisJICBiZmRfdm1hIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKKwkgIGxvbmcgcmVsb2NhdGlvbiA9IDA7CisKKwkgIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKKwkgICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KKworCSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLworCSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworCisJICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisJICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KKwkgIGlmIChvdXRwdXRfYmZkKQorCSAgICBvdXRwdXRfYmFzZSA9IDA7CisJICBlbHNlCisJICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7CisKKwkgIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKwkgIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLworCSAgcmVsb2NhdGlvbiArPSAoKHJlbG9jX2VudHJ5LT5hZGRlbmQgPDwgaG93dG8tPmJpdHNpemUpICsgeCk7CisKKwkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOworCisJICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7CisKKwkgIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCisKKwkgIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOworCisJICBpZiAocmVsb2NhdGlvbikKKwkgICAgICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY2F0aW9uLCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7CisJfQorCisgICAgICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKKwkgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gICovCisgICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKKwl7CisJICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUKKwkgICAgIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4KKwkgICAgIE1vZGlmeSB0aGUgcmVsb2MgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLworCisJICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCSAgcmV0dXJuIGJmZF9yZWxvY19vazsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAoreworICBIT1dUTyAoUl9QQ1IxNkwsCQkJLyogdHlwZSAqLworCSAwMiwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUENSMTZMIiwJCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QQ1IyNkwsCQkJLyogdHlwZSAqLworCSAwMiwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMjYsCQkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUENSMjZMIiwJCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwM2ZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweDAzZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9WUlQxNiwJCQkvKiB0eXBlICovCisJIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJWUlQxNiIsCQkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfSFZSVDE2LAkJCS8qIHR5cGUgKi8KKwkgMTYsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSFZSVDE2IiwJCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9MVlJUMTYsCQkJLyogdHlwZSAqLworCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJMVlJUMTYiLAkJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1ZSVDMyLAkJCS8qIHR5cGUgKi8KKwkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlZSVDMyIiwJCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KK307CisKKy8qIENvZGUgdG8gdHVybiBhbiBleHRlcm5hbCByX3R5cGUgaW50byBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlCisgICBhYm92ZSBob3d0byB0YWJsZS4gICovCitzdGF0aWMgdm9pZAorcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQorICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OworeworICBpZiAoZHN0LT5yX3R5cGUgPj0gUl9QQ1IxNkwgJiYgZHN0LT5yX3R5cGUgPD0gUl9WUlQzMikKKyAgICB7CisgICAgICBjYWNoZV9wdHItPmhvd3RvID0gaG93dG9fdGFibGUgKyBkc3QtPnJfdHlwZSAtIFJfUENSMTZMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKDApOworICAgIH0KK30KKworI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQorCisKKy8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2Mgb2Zmc2V0ICovCisjZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMTYKKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8xNgorCisKKyNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pCVwKKyAgcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQorCitzdGF0aWMgdm9pZAorcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKyAgICAgYXJlbGVudCAqcmVsZW50OworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7CisgIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKKworICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQorICAgIHsKKyAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworICAgIH0KKworICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKKyAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKK30KKworI2RlZmluZSBCQURNQUcoeCkgTUM4OEJBRE1BRyh4KQorI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKKyN1bmRlZiBjb2ZmX3dyaXRlX2FybWFwCisKK2NvbnN0IGJmZF90YXJnZXQgbTg4a2Jjc192ZWMgPQoreworICAiY29mZi1tODhrYmNzIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworCisgICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgICBiZmRfZmFsc2V9LAorICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUsCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbWNvcmUuYyBiL2JmZC9jb2ZmLW1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4NzA5NgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLW1jb3JlLmMKQEAgLTAsMCArMSw3MDMgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGxhIE1Db3JlIENPRkYvUEUKKyAgIENvcHlyaWdodCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImNvZmYvbWNvcmUuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9wZS5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworI2lmZGVmIEJBRE1BRworI3VuZGVmIEJBRE1BRworI2VuZGlmCisjZGVmaW5lIEJBRE1BRyh4KSBNQ09SRUJBRE1BRyh4KQorCisjaWZuZGVmIE5VTV9FTEVNCisjZGVmaW5lIE5VTV9FTEVNKEEpIChzaXplb2YgKEEpIC8gc2l6ZW9mIChBKVswXSkKKyNlbmRpZgorCisvKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgbW9yZSB0aGFuIG9uY2UsIGJ1dCB3ZSBvbmx5IGNvbXBpbGUgdGhlCisgICBmaW5hbF9saW5rIHJvdXRpbmUgb25jZS4gICovCitleHRlcm4gYm9vbGVhbiBtY29yZV9iZmRfY29mZl9maW5hbF9saW5rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIGNvZmZfbWNvcmVfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYyAKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICBpbl9yZWxvY19wCisgIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKK3N0YXRpYyBib29sZWFuICAgICAgICAgICAgICAgICAgICAgIGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisJICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgY29mZl9tY29yZV9ydHlwZV90b19ob3d0bworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCisJICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYmZkX3ZtYSAqKSk7CitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqICAgICAgICAgICBwZV9vYmplY3RfcAorICBQQVJBTVMgKChiZmQgKikpOworCisKKwwKKy8qIFRoZSBOVCBsb2FkZXIgcG9pbnRzIHRoZSB0b2MgcmVnaXN0ZXIgdG8gJnRvYyArIDMyNzY4LCBpbiBvcmRlciB0bworICAgdXNlIHRoZSBjb21wbGV0ZSByYW5nZSBvZiBhIDE2LWJpdCBkaXNwbGFjZW1lbnQuIFdlIGhhdmUgdG8gYWRqdXN0CisgICBmb3IgdGhpcyB3aGVuIHdlIGZpeCB1cCBsb2FkcyBkaXNwbGFjZWQgb2ZmIHRoZSB0b2MgcmVnLiAgKi8KKyNkZWZpbmUgVE9DX0xPQURfQURKVVNUTUVOVCAoLTMyNzY4KQorI2RlZmluZSBUT0NfU0VDVElPTl9OQU1FICIucHJpdmF0ZS50b2MiCisKKy8qIFRoZSBtYWluIGJvZHkgb2YgY29kZSBpcyBpbiBjb2ZmY29kZS5oLiAgKi8KKyNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQorCisvKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCisgICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCisjZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKKworDAorc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWNvcmVfY29mZl9ob3d0b190YWJsZVtdID0KK3sKKyAgLyogVW51c2VkOiAqLworICBIT1dUTyAoSU1BR0VfUkVMX01DT1JFX0FCU09MVVRFLC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGRvbnQgY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIkFCU09MVVRFIiwgICAgICAgICAgICAgLyogbmFtZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4MDAsCSAJICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDAwLCAgICAgICAgCQkgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUREUjMyLC8qIHR5cGUgKi8KKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIkFERFIzMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIDggYml0cyArIDIgemVybyBiaXRzOyBqbXBpL2pzcmkvbHJ3IGluc3RydWN0aW9ucy4KKyAgICAgU2hvdWxkIG5vdCBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLiAqLworICBIT1dUTyAoSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQsCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtY29yZV9jb2ZmX3Vuc3VwcG9ydGVkX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJJTU04Qlk0IiwgICAgICAgICAgICAgLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIGJzci9idC9iZi9iciBpbnN0cnVjdGlvbnM7IDExIGJpdHMgKyAxIHplcm8gYml0IAorICAgICBTcGFuIDJrIGluc3RydWN0aW9ucyA9PSA0ayBieXRlcy4KKyAgICAgT25seSB1c2VmdWwgcGllY2VzIGF0IHRoZSByZWxvY2F0ZWQgYWRkcmVzcyBhcmUgdGhlIG9wY29kZSAoNSBiaXRzKSAqLworICBIT1dUTyAoSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTExQlkyLC8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDExLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJJTU0xMUJZMiIsICAgICAgICAgICAgLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwLAkJCS8qIHNyY19tYXNrICovCisJIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDQgYml0cyArIDEgemVybyBiaXQ7ICdsb29wdCcgaW5zdHJ1Y3Rpb24gb25seTsgdW5zdXBwb3J0ZWQuICovCisgIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMiwJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCisgIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKKyAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCisgICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAorICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAorICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAorICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcworICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCisgIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDExLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwLAkJCS8qIHNyY19tYXNrICovCisJIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCit9OworDAorLyogRXh0ZW5kIHRoZSBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUgd2l0aCBhIGZldyBNKkNvcmUgc3BlY2lmaWMgZmllbGRzLgorICAgVGhpcyBhbGxvd3MgdXMgdG8gc3RvcmUgZ2xvYmFsIGRhdGEgaGVyZSB3aXRob3V0IGFjdHVhbGx5IGNyZWF0aW5nIGFueQorICAgZ2xvYmFsIHZhcmlhYmxlcywgd2hpY2ggaXMgYSBuby1ubyBpbiB0aGUgQkZEIHdvcmxkLiAgKi8KK3R5cGVkZWYgc3RydWN0IGNvZmZfbWNvcmVfbGlua19oYXNoX3RhYmxlCit7CisgIC8qIFRoZSBvcmlnaW5hbCBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUuICBNVVNUIGJlIGZpcnN0IGZpZWxkLiAgKi8KKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCXJvb3Q7CisKKyAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgYmZkX29mX3RvY19vd25lcjsKKyAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RvY19zaXplOworICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfdGFibGVfc2l6ZTsKKyAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdGh1bmtfYWRkcmVzczsKKyAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgdGh1bmtfc2l6ZTsKK30KK21jb3JlX2hhc2hfdGFibGU7CisKKy8qIEdldCB0aGUgTUNvcmUgY29mZiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIGNvZmZfbWNvcmVfaGFzaF90YWJsZShpbmZvKSBcCisgICgobWNvcmVfaGFzaF90YWJsZSAqKSAoKGluZm8pLT5oYXNoKSkKKworLyogQ3JlYXRlIGFuIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKK2NvZmZfbWNvcmVfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICogYWJmZDsKK3sKKyAgbWNvcmVfaGFzaF90YWJsZSAqIHJldDsKKworICByZXQgPSAoKG1jb3JlX2hhc2hfdGFibGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCogcmV0KSkpOworICBpZiAocmV0ID09IChtY29yZV9oYXNoX3RhYmxlICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0CisgICAgICAoJiByZXQtPnJvb3QsIGFiZmQsIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorCisgIHJldC0+YmZkX29mX3RvY19vd25lciA9IE5VTEw7CisgIHJldC0+Z2xvYmFsX3RvY19zaXplICA9IDA7CisgIHJldC0+aW1wb3J0X3RhYmxlX3NpemUgPSAwOworICByZXQtPmZpcnN0X3RodW5rX2FkZHJlc3MgPSAwOworICByZXQtPnRodW5rX3NpemUgPSAwOworCisgIHJldHVybiAmIHJldC0+cm9vdC5yb290OworfQorDAorLypBUkdTVVNFRCovCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittY29yZV9jb2ZmX3Vuc3VwcG9ydGVkX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgYXJlbGVudCAqIHJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICogc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOworICAgICBiZmQgKiBvdXRwdXRfYmZkOworICAgICBjaGFyICoqIGVycm9yX21lc3NhZ2U7Cit7CisgIEJGRF9BU1NFUlQgKHJlbG9jX2VudHJ5LT5ob3d0byAhPSAocmVsb2NfaG93dG9fdHlwZSAqKTApOworICAKKyAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogUmVsb2NhdGlvbiAlcyAoJWQpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIiksCisJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPm5hbWUsCisJCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZSk7CisgIAorICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKK30KKworDAorLyogQSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZS4gKi8KKyNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUsIG1jb3JlX3J0eXBlKSAgXAorIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJiBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlIFttY29yZV9ydHlwZV0KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7IAorICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICAgICAgICAgICAgSU1BR0VfUkVMX01DT1JFX0FERFIzMik7CisgICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCwgICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCk7CisgICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIsICAgICBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIpOworICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIsICAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTRCWTIpOworICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DXzMyX1BDUkVMLCAgICAgICAgICAgICAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMXzMyKTsKKyAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIsIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIpOworICAgZGVmYXVsdDogCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKyN1bmRlZiBIT1cyTUFQCisKKyNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKKyAgKGNhY2hlX3B0ciktPmhvd3RvID0gbWNvcmVfY29mZl9ob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2NvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGFzZWN0aW9uICogc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7CisgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW07CisgICAgIGJmZF92bWEgKiBhZGRlbmRwOworeworICByZWxvY19ob3d0b190eXBlICogaG93dG87CisKKworICBpZiAocmVsLT5yX3R5cGUgPj0gTlVNX0VMRU0gKG1jb3JlX2NvZmZfaG93dG9fdGFibGUpKQorICAgIHJldHVybiBOVUxMOworICAKKyAgaG93dG8gPSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7CisgIAorICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorICAgIHsKKyAgICAgICogYWRkZW5kcCA9IHNlYy0+dm1hIC0gMjsgLyogWFhYIGd1ZXNzIC0gaXMgdGhpcyByaWdodCA/ICovCisgICAgICAKKyAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZ2VuZXJpYyBjb2RlIGlzIGdvaW5nIHRvCisgICAgICAgICBhZGQgYmFjayB0aGUgc3ltYm9sIHZhbHVlIGluIG9yZGVyIHRvIGNhbmNlbCBvdXQgYW4KKyAgICAgICAgIGFkanVzdG1lbnQgaXQgbWFkZSB0byB0aGUgYWRkZW5kLiAgSG93ZXZlciwgd2Ugc2V0IHRoZSBhZGRlbmQKKyAgICAgICAgIHRvIDAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICBXZSBuZWVkIHRvIGFkanVzdCBoZXJlLAorICAgICAgICAgdG8gYXZvaWQgdGhlIGFkanVzdG1lbnQgdGhlIGdlbmVyaWMgY29kZSB3aWxsIG1ha2UuICBGSVhNRToKKyAgICAgICAgIFRoaXMgaXMgZ2V0dGluZyBhIGJpdCBoYWNraXNoLiAgKi8KKyAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKKwkqIGFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOworICAgIH0KKyAgZWxzZQorICAgICogYWRkZW5kcCA9IDA7CisgIAorICByZXR1cm4gaG93dG87Cit9CisMCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkCisgICBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4gKi8KK3N0YXRpYyBib29sZWFuIGluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQorICAgICBiZmQgKiBhYmZkOworICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Cit7CisgIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZTsKK30gICAgIAorCisvKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KK3N0YXRpYyBib29sZWFuCitjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQorICAgICBiZmQgKiBvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87CisgICAgIGJmZCAqIGlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqIGNvbnRlbnRzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWxvY3M7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW1zOworICAgICBhc2VjdGlvbiAqKiBzZWN0aW9uczsKK3sKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWxlbmQ7CisgIGJvb2xlYW4gaGloYWxmOworICBiZmRfdm1hIGhpaGFsZl92YWw7CisgIAorICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKKyAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKKyAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgorCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcik7CisKKyAgaGloYWxmID0gZmFsc2U7CisgIGhpaGFsZl92YWwgPSAwOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIAorICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICB7CisgICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgdG9jX3NlY3Rpb24gPSBOVUxMOworICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247CisgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqICAgICAgIHN5bTsKKyAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICB2YWw7CisgICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICAgIHJzdGF0OworICAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgIGxvYzsKKyAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICByX3R5cGUgPSByZWwtPnJfdHlwZTsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgICBob3d0byA9IE5VTEw7CisgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgaDsKKyAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICBteV9uYW1lOworICAKKyAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7CisgICAgICBsb2MgPSBjb250ZW50cyArIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKKworICAgICAgaWYgKHN5bW5keCA9PSAtMSkKKwl7CisJICBoID0gTlVMTDsKKwkgIHN5bSA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07CisJICBzeW0gPSBzeW1zICsgc3ltbmR4OworCX0KKworICAgICAgLyogR2V0IHRoZSBob3d0byBhbmQgaW5pdGlhbGlzZSB0aGUgYWRkZW5kLiAgKi8KKyAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAorCQkJCSAgICAgICBzeW0sICYgYWRkZW5kKTsKKyAgICAgIGlmIChob3d0byA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgdmFsID0gMDsKKyAgICAgIAorICAgICAgaWYgKGggPT0gTlVMTCkKKwl7CisJICBpZiAoc3ltbmR4ID09IC0xKQorCSAgICBteV9uYW1lID0gIipBQlMqIjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICogc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKKwkgICAgICAKKwkgICAgICB2YWwgPSAoc3ltLT5uX3ZhbHVlIAorCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCisJICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCQlteV9uYW1lID0gIip1bmtub3duKiI7CisJICAgICAgZWxzZSBpZiAoICAgc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCisJCSAgICAgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCisJCW15X25hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKKwkgICAgICBlbHNlIAorCQl7CisJCSAgc3RhdGljIGNoYXIgYnVmIFtTWU1OTUxFTiArIDFdOworCQkgIAorCQkgIHN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7CisJCSAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7CisJCSAgbXlfbmFtZSA9IGJ1ZjsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICogc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIAorCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICAKKwkgIG15X25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCX0JCisKKyAgICAgIHJzdGF0ID0gYmZkX3JlbG9jX29rOworICAgICAgCisgICAgICAvKiBFYWNoIGNhc2UgbXVzdCBkbyBpdHMgb3duIHJlbG9jYXRpb24sIHNldHRpbmcgcnN0YXQgYXBwcm9wcmlhdGVseS4gICovCisgICAgICBzd2l0Y2ggKHJfdHlwZSkKKwl7CisJZGVmYXVsdDoKKwkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKKwkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwkgIAorCWNhc2UgSU1BR0VfUkVMX01DT1JFX0FCU09MVVRFOgorCSAgZnByaW50ZiAoc3RkZXJyLCAKKwkJICAgXygiV2FybmluZzogdW5zdXBwb3J0ZWQgcmVsb2MgJXMgPGZpbGUgJXMsIHNlY3Rpb24gJXM+XG4iKSwgCisJCSAgIGhvd3RvLT5uYW1lLAorCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAorCQkgICBpbnB1dF9zZWN0aW9uLT5uYW1lKTsKKwkgIAorCSAgZnByaW50ZiAoc3RkZXJyLCJzeW0gJWxkICglcyksIHJfdmFkZHIgJWxkICglbHgpXG4iLCAKKwkJICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkcik7ICAKKwkgIGJyZWFrOworCSAgCisJY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNDoKKwljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU0xMUJZMjoKKwljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyOgorCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMXzMyOgorCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKKwljYXNlIElNQUdFX1JFTF9NQ09SRV9BRERSMzI6CisJICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHZhbCwgbG9jKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIAorICAgICAgc3dpdGNoIChyc3RhdCkKKwl7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCSAgCisJY2FzZSBiZmRfcmVsb2Nfb2s6CisJICBicmVhazsKKwkgIAorCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChpbmZvLCBteV9uYW1lLCBob3d0by0+bmFtZSwgCisJCSAgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKKwkJICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9ICAgICAKKworICByZXR1cm4gdHJ1ZTsKK30KKworDAorLyogVGFpbG9yIGNvZmZjb2RlLmggLS0gbWFjcm8gaGVhdmVuLiAqLworCisvKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlciwgd2l0aCBvdXIgb3duIHNwZWNpYWwgdG91Y2guICAqLworCisjZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwICAgbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gICAgICAgIGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvICAgICAgICAgIGNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8KKworI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKSB7aW50ZXJuYWwucl90eXBlID0gaG93dG8tPnR5cGU7fQorCisjZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgMHgxMDAwCisKKyNpbmNsdWRlICJjb2ZmY29kZS5oIgorDAorc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorcGVfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqIGFiZmQ7Cit7CisjaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCisgIC8qIFdlIG5lZWQgdG8gaGFjayBiYWRseSB0byBoYW5kbGUgYSBQRSBpbWFnZSBjb3JyZWN0bHkuICBJbiBQRQorICAgICBpbWFnZXMgY3JlYXRlZCBieSB0aGUgR05VIGxpbmtlciwgdGhlIG9mZnNldCB0byB0aGUgQ09GRiBoZWFkZXIKKyAgICAgaXMgYWx3YXlzIHRoZSBzaXplLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gaW1hZ2VzCisgICAgIGdlbmVyYXRlZCBieSBvdGhlciBQRSBsaW5rZXJzLiAgVGhlIFBFIGZvcm1hdCBzdG9yZXMgYSBmb3VyIGJ5dGUKKyAgICAgb2Zmc2V0IHRvIHRoZSBQRSBzaWduYXR1cmUganVzdCBiZWZvcmUgdGhlIENPRkYgaGVhZGVyIGF0CisgICAgIGxvY2F0aW9uIDB4M2Mgb2YgdGhlIGZpbGUuICBXZSBwaWNrIHVwIHRoYXQgb2Zmc2V0LCB2ZXJpZnkgdGhhdAorICAgICB0aGUgUEUgc2lnbmF0dXJlIGlzIHRoZXJlLCBhbmQgdGhlbiBzZXQgb3Vyc2VsdmVzIHVwIHRvIHJlYWQgaW4KKyAgICAgdGhlIENPRkYgaGVhZGVyLiAgKi8KKyAgeworICAgIGJmZF9ieXRlIGV4dF9vZmZzZXRbNF07CisgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgIGJmZF9ieXRlIGV4dF9zaWduYXR1cmVbNF07CisgICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7CisKKyAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIDB4M2MsIFNFRUtfU0VUKSAhPSAwCisJfHwgYmZkX3JlYWQgKGV4dF9vZmZzZXQsIDEsIDQsIGFiZmQpICE9IDQpCisgICAgICB7CisJaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgCisgICAgb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfb2Zmc2V0KTsKKyAgICAKKyAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDAKKwl8fCBiZmRfcmVhZCAoZXh0X3NpZ25hdHVyZSwgMSwgNCwgYWJmZCkgIT0gNCkKKyAgICAgIHsKKwlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAKKyAgICBzaWduYXR1cmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9zaWduYXR1cmUpOworCisgICAgaWYgKHNpZ25hdHVyZSAhPSAweDQ1NTApCisgICAgICB7CisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAvKiBIZXJlIGlzIHRoZSBoYWNrLiAgY29mZl9vYmplY3RfcCB3YW50cyB0byByZWFkIGZpbGhzeiBieXRlcyB0bworICAgICAgIHBpY2sgdXAgdGhlIENPRkYgaGVhZGVyLiAgV2UgYWRqdXN0IHNvIHRoYXQgdGhhdCB3aWxsIHdvcmsuICAyMAorICAgICAgIGlzIHRoZSBzaXplIG9mIHRoZSBtaXBzIENPRkYgZmlsZWhkci4gICovCisgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoYmZkX3RlbGwgKGFiZmQpIC0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKSArIDIwKSwKKwkJICBTRUVLX1NFVCkgIT0gMCkKKyAgICAgIHsKKwlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOworfQorDAorLyogVGhlIHRyYW5zZmVyIHZlY3RvcnMgdGhhdCBsZWFkIHRoZSBvdXRzaWRlIHdvcmxkIHRvIGFsbCBvZiB0aGUgYWJvdmUuICovCisKK2NvbnN0IGJmZF90YXJnZXQKK1RBUkdFVF9CSUdfU1lNID0KK3sKKyAgVEFSR0VUX0JJR19OQU1FLAorICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAorCisgIDAsCQkJCS8qIGxlYWRpbmcgY2hhciAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCisKKyAgeyBfYmZkX2R1bW15X3RhcmdldCwKKyAgICBwZV9vYmplY3RfcCwgCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAJLyogX2JmZF9kdW1teV90YXJnZXQgKi8KKyAgICBwZV9vYmplY3RfcAorICB9LAorICB7IGJmZF9mYWxzZSwKKyAgICBjb2ZmX21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIAkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgIGJmZF9mYWxzZQorICB9LAorICB7IGJmZF9mYWxzZSwKKyAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAorICAgIGJmZF9mYWxzZQorICB9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKKworY29uc3QgYmZkX3RhcmdldAorVEFSR0VUX0xJVFRMRV9TWU0gPQoreworICBUQVJHRVRfTElUVExFX05BTUUsCisgIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCisgICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKKyAgCisgIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KKworLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KKyAgeworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIHBlX29iamVjdF9wLCAJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCisgICAgcGVfb2JqZWN0X3AKKyAgfSwKKyAgeworICAgIGJmZF9mYWxzZSwKKyAgICBjb2ZmX21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIAkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgIGJmZF9mYWxzZQorICB9LAorICB7CisgICAgYmZkX2ZhbHNlLAorICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2ZhbHNlCisgIH0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUsCit9OworCmRpZmYgLS1naXQgYS9iZmQvY29mZi1taXBzLmMgYi9iZmQvY29mZi1taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxZWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLW1pcHMuYwpAQCAtMCwwICsxLDI3MjYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCisgICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9zeW0uaCIKKyNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCisjaW5jbHVkZSAiY29mZi9lY29mZi5oIgorI2luY2x1ZGUgImNvZmYvbWlwcy5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKyNpbmNsdWRlICJsaWJlY29mZi5oIgorDAorLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuIG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKK3N0YXRpYyB2b2lkIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLAorCQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOworc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKKwkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAorCQkJCQkgICAgICAgUFRSKSk7CitzdGF0aWMgdm9pZCBtaXBzX2FkanVzdF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKKwkJCQkJICBhcmVsZW50ICopKTsKK3N0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgYXJlbGVudCAqLAorCQkJCQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJCSBhcmVsZW50ICpyZWxvYywKKwkJCQkJCQkgYXN5bWJvbCAqc3ltYm9sLAorCQkJCQkJCSBQVFIgZGF0YSwKKwkJCQkJCQkgYXNlY3Rpb24gKnNlY3Rpb24sCisJCQkJCQkJIGJmZCAqb3V0cHV0X2JmZCwKKwkJCQkJCQkgY2hhciAqKmVycm9yKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVmaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAorCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKKwkJCQkJCSAgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCisJCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVmbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAorCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKKwkJCQkJCSAgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCisJCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZ3ByZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAorCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKKwkJCQkJCSAgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCisJCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVsaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAorCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKKwkJCQkJCSAgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCisJCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVsbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAorCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKKwkJCQkJCSAgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCisJCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfc3dpdGNoX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkJCQlhcmVsZW50ICpyZWxvYywKKwkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCisJCQkJCQkJUFRSIGRhdGEsCisJCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCisJCQkJCQkJYmZkICpvdXRwdXRfYmZkLAorCQkJCQkJCWNoYXIgKiplcnJvcikpOworc3RhdGljIHZvaWQgbWlwc19yZWxvY2F0ZV9oaSBQQVJBTVMgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmhpLAorCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG8sCisJCQkJICAgICAgYmZkICppbnB1dF9iZmQsCisJCQkJICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisJCQkJICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAorCQkJCSAgICAgIHNpemVfdCBhZGp1c3QsCisJCQkJICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uLAorCQkJCSAgICAgIGJvb2xlYW4gcGNyZWwpKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJICAgICAgYmZkICosIGFzZWN0aW9uICosCisJCQkJCSAgICAgIGJmZF9ieXRlICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gbWlwc19yZWFkX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19yZWxheF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAorCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkgICBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfcmVsYXhfcGNyZWwxNiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKKwkJCQkJICAgYXNlY3Rpb24gKiwKKwkJCQkJICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLAorCQkJCQkgICBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOworCisMCisvKiBFQ09GRiBoYXMgQ09GRiBzZWN0aW9ucywgYnV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluCisgICBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvcm1hdC4gIEVDT0ZGIHRhcmdldHMgdXNlIHNvbWUgb2YgdGhlCisgICBzd2FwcGluZyByb3V0aW5lcyBmcm9tIGNvZmZzd2FwLmgsIGFuZCBzb21lIG9mIHRoZSBnZW5lcmljIENPRkYKKyAgIHJvdXRpbmVzIGluIGNvZmZnZW4uYywgYnV0LCB1bmxpa2UgdGhlIHJlYWwgQ09GRiB0YXJnZXRzLCBkbyBub3QKKyAgIHVzZSBjb2ZmY29kZS5oIGl0c2VsZi4KKworICAgR2V0IHRoZSBnZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGV4Y2VwdCBmb3IgdGhlIHJlbG9jLAorICAgc3ltYm9sLCBhbmQgbGluZW5vIG9uZXMuICBHaXZlIHRoZW0gRUNPRkYgbmFtZXMuICAqLworI2RlZmluZSBNSVBTRUNPRkYKKyNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKKyNkZWZpbmUgTk9fQ09GRl9TWU1CT0xTCisjZGVmaW5lIE5PX0NPRkZfTElORU5PUworI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgorI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfb3V0CisjZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX2luIG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX2luCisjZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKKyNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX2luCisjZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0CisjaW5jbHVkZSAiY29mZnN3YXAuaCIKKworLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gICovCisjZGVmaW5lIEVDT0ZGXzMyCisjaW5jbHVkZSAiZWNvZmZzd2FwLmgiCisMCisvKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvY3MgdHlwZXMuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2hvd3RvX3RhYmxlW10gPQoreworICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZC4gIFRoZSByZWxvYyByZWFkaW5nIGNvZGUgZW5zdXJlcyB0aGF0CisgICAgIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlIC5hYnMgc2VjdGlvbiwgd2hpY2ggd2lsbCBjYXVzZQorICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHRvIGRvIG5vdGhpbmcuICAqLworICBIT1dUTyAoTUlQU19SX0lHTk9SRSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDE2IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLworICBIT1dUTyAoTUlQU19SX1JFRkhBTEYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUkVGSEFMRiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCisgIEhPV1RPIChNSVBTX1JfUkVGV09SRCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUZXT1JEIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDI2IGJpdCBhYnNvbHV0ZSBqdW1wIGFkZHJlc3MuICAqLworICBIT1dUTyAoTUlQU19SX0pNUEFERFIsCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93CisJCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCisJCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCisJIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSk1QQUREUiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICBtaXBzX3JlZmhpX3JlbG9jLiAgKi8KKyAgSE9XVE8gKE1JUFNfUl9SRUZISSwJCS8qIHR5cGUgKi8KKwkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtaXBzX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUZISSIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoZSBsb3cgMTYgYml0cyBvZiBhIHN5bWJvbCB2YWx1ZS4gICovCisgIEhPV1RPIChNSVBTX1JfUkVGTE8sCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1pcHNfcmVmbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJFRkxPIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWZlcmVuY2UgdG8gYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgSGFuZGxlZCBieSB0aGUKKyAgICAgZnVuY3Rpb24gbWlwc19ncHJlbF9yZWxvYy4gICovCisgIEhPV1RPIChNSVBTX1JfR1BSRUwsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbWlwc19ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiR1BSRUwiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdXNpbmcgYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLgorICAgICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KKyAgSE9XVE8gKE1JUFNfUl9MSVRFUkFMLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbWlwc19ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTElURVJBTCIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIHsgOCB9LAorICB7IDkgfSwKKyAgeyAxMCB9LAorICB7IDExIH0sCisKKyAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KKyAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgYSAxNiBiaXQgUEMKKyAgICAgcmVsYXRpdmUgcmVsb2MgcmlnaHRzaGlmdGVkIHR3aWNlIGFzIHVzZWQgaW4gdGhlIE1JUFMgYnJhbmNoCisgICAgIGluc3RydWN0aW9ucy4gICovCisgIEhPV1RPIChNSVBTX1JfUENSRUwxNiwJLyogdHlwZSAqLworCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJQQ1JFTDE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KKyAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGhpZ2ggMTYKKyAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgVGhlIG5leHQgcmVsb2MgbXVzdCBiZQorICAgICBNSVBTX1JfUkVMTE8sIGFuZCB0aGUgYWRkZW5kIGlzIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIHRoZQorICAgICB0d28gaW5zdHJ1Y3Rpb25zLCBqdXN0IGFzIGluIE1JUFNfUl9SRUZISSBhbmQgTUlQU19SX1JFRkxPLiAgVGhlCisgICAgIGZpbmFsIHZhbHVlIGlzIGFjdHVhbGx5IFBDIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgICAgTUlQU19SX1JFTExPIHJlbG9jLCBub3QgdGhlIE1JUFNfUl9SRUxISSByZWxvYy4gICovCisgIEhPV1RPIChNSVBTX1JfUkVMSEksCQkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtaXBzX3JlbGhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUxISSIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoaXMgcmVsb2MgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCisgICAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCByZXByZXNlbnRzIHRoZSBsb3cgMTYKKyAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KKyAgSE9XVE8gKE1JUFNfUl9SRUxMTywJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtaXBzX3JlbGxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUxMTyIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIHsgMTUgfSwKKyAgeyAxNiB9LAorICB7IDE3IH0sCisgIHsgMTggfSwKKyAgeyAxOSB9LAorICB7IDIwIH0sCisgIHsgMjEgfSwKKworICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgorICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhbiBlbnRyeSBpbgorICAgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpbgorICAgICB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZSBzeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQorICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBzdWJ0cmFoZW5kLiAgU2VlIGluY2x1ZGUvY29mZi9taXBzLmggZm9yCisgICAgIG1vcmUgZGV0YWlscy4gICovCisgIEhPV1RPIChNSVBTX1JfU1dJVENILAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1pcHNfc3dpdGNoX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJTV0lUQ0giLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCit9OworCisjZGVmaW5lIE1JUFNfSE9XVE9fQ09VTlQgXAorICAoc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSkKKworLyogV2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIHJlbGF4aW5nLCBpdCBtYXkgY2hhbmdlIGEgZXh0ZXJuYWwgUENSRUwxNgorICAgcmVsb2MuICBUaGlzIHR5cGljYWxseSByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGxpa2UKKyAgICAgICBiYWwgZm9vCisgICBXZSBjaGFuZ2UgaXQgdG8KKyAgICAgICAuc2V0ICBub3Jlb3JkZXIKKyAgICAgICBiYWwgICAkTDEKKyAgICAgICBsdWkgICAkYXQsJWhpKGZvbyAtICRMMSkKKyAgICAgJEwxOgorICAgICAgIGFkZGl1ICRhdCwlbG8oZm9vIC0gJEwxKQorICAgICAgIGFkZHUgICRhdCwkYXQsJDMxCisgICAgICAgamFsciAgJGF0CisgICBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhpcyBjaGFuZ2VzIHRoZQorICAgaW5zdHJ1Y3Rpb24gYnkuICAqLworCisjZGVmaW5lIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgKDQgKiA0KQorDAorLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBmaWxlaGRyOworeworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOworCisgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKKyAgICB7CisgICAgY2FzZSBNSVBTX01BR0lDXzE6CisgICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCBlbmRpYW5uZXNzIHRoaXMgaW1wbGllcy4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTUlQU19NQUdJQ19CSUc6CisgICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6CisgICAgY2FzZSBNSVBTX01BR0lDX0JJRzM6CisgICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOworCisgICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKKyAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMjoKKyAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKKyAgICAgIHJldHVybiBiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCk7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwwKKy8qIFJlbG9jIGhhbmRsaW5nLiAgTUlQUyBFQ09GRiByZWxvY3MgYXJlIHBhY2tlZCBpbnRvIDggYnl0ZXMgaW4KKyAgIGV4dGVybmFsIGZvcm0uICBUaGV5IHVzZSBhIGJpdCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ltYm9sCisgICBpcyBleHRlcm5hbC4gICovCisKKy8qIFN3YXAgYSByZWxvYyBpbi4gICovCisKK3N0YXRpYyB2b2lkCittaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZXh0X3B0cjsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Cit7CisgIGNvbnN0IFJFTE9DICpleHQgPSAoUkVMT0MgKikgZXh0X3B0cjsKKworICBpbnRlcm4tPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKKyAgICB7CisgICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQorCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHKQorCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQorCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcpCisJCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCisJCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRykpOworICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCisJCQk+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRyk7CisgICAgICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgIT0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQorCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFKQorCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQorCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEUpCisJCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCisJCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRSkpOworICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQorCQkJID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFKQorCQkJfCAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSkKKwkJCSAgIDw8IFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpKTsKKyAgICAgIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFKSAhPSAwOworICAgIH0KKworICAvKiBJZiB0aGlzIGlzIGEgTUlQU19SX1NXSVRDSCByZWxvYywgb3IgYW4gaW50ZXJuYWwgTUlQU19SX1JFTEhJIG9yCisgICAgIE1JUFNfUl9SRUxMTyByZWxvYywgcl9zeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQorICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBiYXNlIG9mIHRoZSBkaWZmZXJlbmNlIChzZWUKKyAgICAgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IgbW9yZSBkZXRhaWxzKS4gIFdlIGNvcHkgc3ltbmR4IGludG8gdGhlCisgICAgIHJfb2Zmc2V0IGZpZWxkIHNvIGFzIG5vdCB0byBjb25mdXNlIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIGluCisgICAgIGVjb2ZmLmMuICBJbiBhZGp1c3RfcmVsb2NfaW4gd2UgdGhlbiBjb3B5IHJfb2Zmc2V0IGludG8gdGhlIHJlbG9jCisgICAgIGFkZGVuZC4gICovCisgIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICisgICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCisJICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPCisJICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKSkpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAoISBpbnRlcm4tPnJfZXh0ZXJuKTsKKyAgICAgIGludGVybi0+cl9vZmZzZXQgPSBpbnRlcm4tPnJfc3ltbmR4OworICAgICAgaWYgKGludGVybi0+cl9vZmZzZXQgJiAweDgwMDAwMCkKKwlpbnRlcm4tPnJfb2Zmc2V0IC09IDB4MTAwMDAwMDsKKyAgICAgIGludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7CisgICAgfQorfQorCisvKiBTd2FwIGEgcmVsb2Mgb3V0LiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOworICAgICBQVFIgZHN0OworeworICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKKyAgbG9uZyByX3N5bW5keDsKKworICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfZXh0ZXJuCisJICAgICAgfHwgKGludGVybi0+cl9zeW1uZHggPj0gMCAmJiBpbnRlcm4tPnJfc3ltbmR4IDw9IDEyKSk7CisKKyAgLyogSWYgdGhpcyBpcyBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxMTyBvcgorICAgICBNSVBTX1JfUkVMSEkgcmVsb2MsIHdlIGFjdHVhbGx5IHdhbnQgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mCisgICAgIHJfb2Zmc2V0IG91dCBhcyB0aGUgc3ltYm9sIGluZGV4LiAgVGhpcyB1bmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5CisgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCisgIGlmIChpbnRlcm4tPnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICisgICAgICAmJiAoaW50ZXJuLT5yX2V4dGVybgorCSAgfHwgKGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxISQorCSAgICAgICYmIGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQorICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKKyAgZWxzZQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUKTsKKyAgICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX29mZnNldCAmIDB4ZmZmZmZmOworICAgIH0KKworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cl92YWRkciwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7CisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgIHsKKyAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHOworICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUc7CisgICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRzsKKyAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcpCisJCQkgJiBSRUxPQ19CSVRTM19UWVBFX0JJRykKKwkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fQklHIDogMCkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFOworICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEU7CisgICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRTsKKyAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCisJCQkgJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKKwkJCXwgKChpbnRlcm4tPnJfdHlwZSA+PiBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCisJCQkgICAgJiBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFKSkKKwkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFIDogMCkpOworICAgIH0KK30KKworLyogRmluaXNoIGNhbm9uaWNhbGl6aW5nIGEgcmVsb2MuICBQYXJ0IG9mIHRoaXMgaXMgZ2VuZXJpYyB0byBhbGwKKyAgIEVDT0ZGIHRhcmdldHMsIGFuZCB0aGF0IHBhcnQgaXMgaW4gZWNvZmYuYy4gIFRoZSByZXN0IGlzIGRvbmUgaW4KKyAgIHRoaXMgYmFja2VuZCByb3V0aW5lLiAgSXQgbXVzdCBmaWxsIGluIHRoZSBob3d0byBmaWVsZC4gICovCisKK3N0YXRpYyB2b2lkCittaXBzX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOworICAgICBhcmVsZW50ICpycHRyOworeworICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBNSVBTX1JfU1dJVENIKQorICAgIGFib3J0ICgpOworCisgIGlmICghIGludGVybi0+cl9leHRlcm4KKyAgICAgICYmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfR1BSRUwKKwkgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9MSVRFUkFMKSkKKyAgICBycHRyLT5hZGRlbmQgKz0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOworCisgIC8qIElmIHRoZSB0eXBlIGlzIE1JUFNfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCisgICAgIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICAqLworICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX0lHTk9SRSkKKyAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworCisgIC8qIElmIHRoaXMgaXMgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKKyAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSB3YW50IHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIEJGRCByZWxvY3RvCisgICAgIGhvbGQgdGhlIHZhbHVlIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGluIHRoZSBzeW1uZHggZmllbGQgb2YgdGhlCisgICAgIGludGVybmFsIE1JUFMgRUNPRkYgcmVsb2MuICBUaGlzIHZhbHVlIHdhcyBjb3BpZWQgaW50bworICAgICBpbnRlcm4tPnJfb2Zmc2V0IGJ5IG1pcHNfc3dhcF9yZWxvY19pbiwgYW5kIGhlcmUgd2UgY29weSBpdCBpbnRvCisgICAgIHRoZSBhZGRlbmQgZmllbGQuICAqLworICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAorICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgorCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQorCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQorICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9vZmZzZXQ7CisKKyAgcnB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Cit9CisKKy8qIE1ha2UgYW55IGFkanVzdG1lbnRzIG5lZWRlZCB0byBhIHJlbG9jIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIE5vbmUKKyAgIGFyZSBuZWVkZWQgZm9yIE1JUFMuICAqLworCitzdGF0aWMgdm9pZAorbWlwc19hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBhcmVsZW50ICpyZWw7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOworeworICAvKiBGb3IgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKKyAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSBtdXN0IGNvcHkgcmVsLT5hZGRlbmQgaW50bworICAgICBpbnRlcm4tPnJfb2Zmc2V0LiAgVGhpcyB3aWxsIHRoZW4gYmUgd3JpdHRlbiBvdXQgYXMgdGhlIHN5bWJvbAorICAgICBpbmRleCBieSBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LiAgVGhpcyBvcGVyYXRpb24gcGFyYWxsZWxzIHRoZQorICAgICBhY3Rpb24gb2YgbWlwc19hZGp1c3RfcmVsb2NfaW4uICAqLworICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAorICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgorCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQorCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQorICAgIGludGVybi0+cl9vZmZzZXQgPSByZWwtPmFkZGVuZDsKK30KKworLyogRUNPRkYgcmVsb2NzIGFyZSBlaXRoZXIgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLCBvciBhZ2FpbnN0CisgICBzZWN0aW9ucy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHRoZSByZWxvYworICAgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nIGhhcyBnaXZlbiB1cyBhbnkKKyAgIGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbyBiZSBhZ2FpbnN0IHRoZQorICAgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcKKyAgIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwgYWxsIGJlIGRvbmUgYXQKKyAgIGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZSBpbnRvCisgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCisgICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZworICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwKKwkJICAgIHJlbG9jX2VudHJ5LAorCQkgICAgc3ltYm9sLAorCQkgICAgZGF0YSwKKwkJICAgIGlucHV0X3NlY3Rpb24sCisJCSAgICBvdXRwdXRfYmZkLAorCQkgICAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKyAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKK30KKworLyogRG8gYSBSRUZISSByZWxvY2F0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbiB3aXRoIGEKKyAgIFJFRkxPIHJlbG9jLCBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgUkVGTE8gdG8gdGhlIFJFRkhJLgorICAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZSBhY3R1YWwKKyAgIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIFJFRkxPLiAgTUlQUyBFQ09GRiByZXF1aXJlcyB0aGF0IHRoZQorICAgUkVGTE8gaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBSRUZISS4gIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0CisgICBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJIHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8KKyAgIHJlbG9jLiAgVGhpcyBleHRlbnNpb24gcGVybWl0cyBnY2MgdG8gb3V0cHV0IHRoZSBISSBhbmQgTE8gcmVsb2NzCisgICBpdHNlbGYuICAqLworCitzdHJ1Y3QgbWlwc19oaQoreworICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKKyAgYmZkX2J5dGUgKmFkZHI7CisgIGJmZF92bWEgYWRkZW5kOworfTsKKworLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbWlwc19oaSAqbWlwc19yZWZoaV9saXN0OworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittaXBzX3JlZmhpX3JlbG9jIChhYmZkLAorCQkgIHJlbG9jX2VudHJ5LAorCQkgIHN5bWJvbCwKKwkJICBkYXRhLAorCQkgIGlucHV0X3NlY3Rpb24sCisJCSAgb3V0cHV0X2JmZCwKKwkJICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworICBzdHJ1Y3QgbWlwc19oaSAqbjsKKworICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKKyAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICByZXQgPSBiZmRfcmVsb2Nfb2s7CisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKKyAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZWxvY2F0aW9uID0gMDsKKyAgZWxzZQorICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworCisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVGTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KKyAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOworICBpZiAobiA9PSBOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKyAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7CisgIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247CisgIG4tPm5leHQgPSBtaXBzX3JlZmhpX2xpc3Q7CisgIG1pcHNfcmVmaGlfbGlzdCA9IG47CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogRG8gYSBSRUZMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgaW5wbGFjZQorICAgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFRkhJCisgICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfcmVmbG9fcmVsb2MgKGFiZmQsCisJCSAgcmVsb2NfZW50cnksCisJCSAgc3ltYm9sLAorCQkgIGRhdGEsCisJCSAgaW5wdXRfc2VjdGlvbiwKKwkJICBvdXRwdXRfYmZkLAorCQkgIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBpZiAobWlwc19yZWZoaV9saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IG1pcHNfaGkgKmw7CisKKyAgICAgIGwgPSBtaXBzX3JlZmhpX2xpc3Q7CisgICAgICB3aGlsZSAobCAhPSBOVUxMKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKwkgIHVuc2lnbmVkIGxvbmcgdmFsOworCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKKwkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OworCisJICAvKiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAorCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUZMTyBpdHNlbGYsIGV4Y2VwdAorCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCisJICAgICBSRUZISS4gICovCisJICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7CisJICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQorCQkgICAmIDB4ZmZmZik7CisJICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOworCSAgdmFsICs9IGwtPmFkZGVuZDsKKworCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAorCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCisJICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCisJICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKKwkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCisJICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KKwkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCisJICAgIHZhbCAtPSAweDEwMDAwOworCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCisJICAgIHZhbCArPSAweDEwMDAwOworCisJICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7CisJICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKKworCSAgbmV4dCA9IGwtPm5leHQ7CisJICBmcmVlIChsKTsKKwkgIGwgPSBuZXh0OworCX0KKworICAgICAgbWlwc19yZWZoaV9saXN0ID0gTlVMTDsKKyAgICB9CisKKyAgLyogTm93IGRvIHRoZSBSRUZMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KKyAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOworfQorCisvKiBEbyBhIEdQUkVMIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QgYmVjb21lCisgICB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorbWlwc19ncHJlbF9yZWxvYyAoYWJmZCwKKwkJICByZWxvY19lbnRyeSwKKwkJICBzeW1ib2wsCisJCSAgZGF0YSwKKwkJICBpbnB1dF9zZWN0aW9uLAorCQkgIG91dHB1dF9iZmQsCisJCSAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOworICBiZmRfdm1hIGdwOworICBiZmRfdm1hIHJlbG9jYXRpb247CisgIHVuc2lnbmVkIGxvbmcgdmFsOworICB1bnNpZ25lZCBsb25nIGluc247CisKKyAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KKyAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCisgICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFQ09GRgorICAgICBmaWxlLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisgICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOworICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOworICAgIH0KKworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCisgICAgICAmJiByZWxvY2F0ZWFibGUgPT0gZmFsc2UpCisgICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7CisKKyAgLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQorICAgICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0CisgICAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVDT0ZGCisgICAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KKyAgICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCisgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOworICBpZiAoZ3AgPT0gMAorICAgICAgJiYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQorCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQorICAgIHsKKyAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCisJeworCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KKwkgIGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOworCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgaW50IGNvdW50OworCSAgYXN5bWJvbCAqKnN5bTsKKwkgIHVuc2lnbmVkIGludCBpOworCisJICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOworCSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKKworCSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKKwkgICAgaSA9IGNvdW50OworCSAgZWxzZQorCSAgICB7CisJICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQorCQl7CisJCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKKworCQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKKwkJICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCisJCSAgICB7CisJCSAgICAgIGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOworCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIGlmIChpID49IGNvdW50KQorCSAgICB7CisJICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLworCSAgICAgIGdwID0gNDsKKwkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOworCSAgICAgICplcnJvcl9tZXNzYWdlID0KKwkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOworCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJlbG9jYXRpb24gPSAwOworICBlbHNlCisgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCisgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworCisgIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCisgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKKyAgaWYgKHZhbCAmIDB4ODAwMCkKKyAgICB2YWwgLT0gMHgxMDAwMDsKKworICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQorICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKKyAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KKyAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQorICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCisgICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKKworICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOworICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKworICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQorICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KKyAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKy8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCisgICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KKyAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAorICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLworCitzdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKKwkJICByZWxvY19lbnRyeSwKKwkJICBzeW1ib2wsCisJCSAgZGF0YSwKKwkJICBpbnB1dF9zZWN0aW9uLAorCQkgIG91dHB1dF9iZmQsCisJCSAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgc3RydWN0IG1pcHNfaGkgKm47CisKKyAgLyogSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgdGhlbiBpdCBpcyBjb3JyZWN0CisgICAgIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBjYXNlIGlzCisgICAgIHdoZW4gd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhhdCBpcyBoYW5kbGVkIGVudGlyZWx5IGJ5CisgICAgIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBhbmQgbmV2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbi4gICovCisgIGlmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisJcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgSWYgd2UncmUgcmVsb2NhdGluZywgd2UgZG9uJ3Qgd2FudAorICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIHJldCA9IGJmZF9yZWxvY19vazsKKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQorICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJlbG9jYXRpb24gPSAwOworICBlbHNlCisgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisKKyAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBSRUxMTyBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLworICBuID0gKHN0cnVjdCBtaXBzX2hpICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKKyAgbi0+bmV4dCA9IG1pcHNfcmVsaGlfbGlzdDsKKyAgbWlwc19yZWxoaV9saXN0ID0gbjsKKworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICByZXR1cm4gcmV0OworfQorCisvKiBEbyBhIFJFTExPIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIDE2IGJpdCBQQworICAgcmVsYXRpdmUgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFTEhJCisgICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfcmVsbG9fcmVsb2MgKGFiZmQsCisJCSAgcmVsb2NfZW50cnksCisJCSAgc3ltYm9sLAorCQkgIGRhdGEsCisJCSAgaW5wdXRfc2VjdGlvbiwKKwkJICBvdXRwdXRfYmZkLAorCQkgIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBpZiAobWlwc19yZWxoaV9saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IG1pcHNfaGkgKmw7CisKKyAgICAgIGwgPSBtaXBzX3JlbGhpX2xpc3Q7CisgICAgICB3aGlsZSAobCAhPSBOVUxMKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKwkgIHVuc2lnbmVkIGxvbmcgdmFsOworCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKKwkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OworCisJICAvKiBEbyB0aGUgUkVMSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAorCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUxMTyBpdHNlbGYsIGV4Y2VwdAorCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCisJICAgICBSRUxISS4gICovCisJICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7CisJICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQorCQkgICAmIDB4ZmZmZik7CisJICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOworCSAgdmFsICs9IGwtPmFkZGVuZDsKKworCSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBtYWtlIHZhbCBQQyByZWxhdGl2ZS4gIElmIHRoZQorCSAgICAgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcywgYmVjYXVzZQorCSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlIHRvIGluY29ycG9yYXRlCisJICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2MuICAqLworCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpCisJICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCisJICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCSAgICArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKworCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAorCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCisJICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCisJICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKKwkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCisJICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KKwkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCisJICAgIHZhbCAtPSAweDEwMDAwOworCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCisJICAgIHZhbCArPSAweDEwMDAwOworCisJICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7CisJICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKKworCSAgbmV4dCA9IGwtPm5leHQ7CisJICBmcmVlIChsKTsKKwkgIGwgPSBuZXh0OworCX0KKworICAgICAgbWlwc19yZWxoaV9saXN0ID0gTlVMTDsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgdGhlbiBpdCBpcyBjb3JyZWN0CisgICAgIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBjYXNlIGlzCisgICAgIHdoZW4gd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhhdCBpcyBoYW5kbGVkIGVudGlyZWx5IGJ5CisgICAgIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBhbmQgbmV2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbi4gICovCisgIGlmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisJcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZG9lcyBub3QgaGFuZGxlIHBjcmVsX29mZnNldCByZWxvY2F0aW9ucworICAgICBjb3JyZWN0bHkgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGZpbGUsIHNvIGhhbmRsZSB0aGVtCisgICAgIGRpcmVjdGx5IGhlcmUuICAqLworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIE5vdyBkbyB0aGUgUkVMTE8gcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCisgIHJldHVybiBtaXBzX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKK30KKworLyogVGhpcyBpcyB0aGUgc3BlY2lhbCBmdW5jdGlvbiBmb3IgdGhlIE1JUFNfUl9TV0lUQ0ggcmVsb2MuICBUaGlzCisgICBzcGVjaWFsIHJlbG9jIGlzIG5vcm1hbGx5IGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBhbmQgb25seQorICAgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyB3aGVuIHJlbGF4aW5nLiAgV2UgZG9uJ3Qgd2FudAorICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byB0YW1wZXIgd2l0aCBpdCBhdCBhbGwuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfc3dpdGNoX3JlbG9jIChhYmZkLAorCQkgICByZWxvY19lbnRyeSwKKwkJICAgc3ltYm9sLAorCQkgICBkYXRhLAorCQkgICBpbnB1dF9zZWN0aW9uLAorCQkgICBvdXRwdXRfYmZkLAorCQkgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIGludCBtaXBzX3R5cGU7CisKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ18xNjoKKyAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZIQUxGOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKKyAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZXT1JEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6CisgICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfSk1QQUREUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKKyAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZISTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CisgICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVGTE87CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMOgorICAgICAgbWlwc190eXBlID0gTUlQU19SX0dQUkVMOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOgorICAgICAgbWlwc190eXBlID0gTUlQU19SX0xJVEVSQUw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKKyAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9QQ1JFTDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TOgorICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTEhJOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKKyAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUxMTzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6CisgICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfU1dJVENIOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOworICAgIH0KKworICByZXR1cm4gJm1pcHNfaG93dG9fdGFibGVbbWlwc190eXBlXTsKK30KKwwKKy8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiB3aGljaCBoYW5kbGVzIHRoZSBSRUZISQorICAgYW5kIFJFTEhJIHJlbG9jYXRpb25zLiAgVGhlIFJFRkhJIHJlbG9jYXRpb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhCisgICBSRUZMTyByZWxvY2F0aW9uIChhbmQgUkVMSEkgYnkgYSBSRUxMTyksIGFuZCB0aGUgYWRkZW5kIHVzZWQgaXMKKyAgIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIGJvdGggaW5zdHJ1Y3Rpb25zLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfcmVsb2NhdGVfaGkgKHJlZmhpLCByZWZsbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAorCQkgIHJlbG9jYXRpb24sIHBjcmVsKQorICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmhpOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmxvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgc2l6ZV90IGFkanVzdDsKKyAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICBib29sZWFuIHBjcmVsOworeworICB1bnNpZ25lZCBsb25nIGluc247CisgIHVuc2lnbmVkIGxvbmcgdmFsOworICB1bnNpZ25lZCBsb25nIHZhbGxvOworCisgIGlmIChyZWZoaSA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgCisgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCisJCSAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7CisgIGlmIChyZWZsbyA9PSBOVUxMKQorICAgIHZhbGxvID0gMDsKKyAgZWxzZQorICAgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKKwkJCSBjb250ZW50cyArIGFkanVzdCArIHJlZmxvLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQorCSAgICAgJiAweGZmZmYpOworIAorICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOworICB2YWwgKz0gcmVsb2NhdGlvbjsKKworICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkIHZhbHVlLgorICAgICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzIHJlcXVpcmVzIGFuCisgICAgIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQgdG8gbWFrZSB0aGlzCisgICAgIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlIHRvb2sgZnJvbSB0aGUgZGF0YSwKKyAgICAgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLworICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQorICAgIHZhbCAtPSAweDEwMDAwOworCisgIGlmIChwY3JlbCkKKyAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJICAgICsgKHJlZmxvLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgYWRqdXN0KSk7CisKKyAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCisgICAgdmFsICs9IDB4MTAwMDA7CisKKyAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOworICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuLAorCSAgICAgIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmaGktPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworfQorCisvKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgIGNvbnRlbnRzLCBleHRlcm5hbF9yZWxvY3MpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOworeworICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOworICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSBncDsKKyAgYm9vbGVhbiBncF91bmRlZmluZWQ7CisgIHNpemVfdCBhZGp1c3Q7CisgIGxvbmcgKm9mZnNldHM7CisgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKKyAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGJvb2xlYW4gZ290X2xvOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgbG9faW50X3JlbDsKKworICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgorCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcik7CisKKyAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bworICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKKyAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCisgIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247CisgIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCisgICAgeworICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQorCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCisJCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUworCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7CisgICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQorCXJldHVybiBmYWxzZTsKKworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9CisJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9CisJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0gTlVMTDsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUERBVEFdID0gTlVMTDsKKyAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fRklOSV0gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZmluaSIpOworICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVRBXSA9IE5VTEw7CisgICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0FCU10gPSBOVUxMOworCisgICAgICBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbiA9IHN5bW5keF90b19zZWN0aW9uOworICAgIH0KKworICBzeW1faGFzaGVzID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltX2hhc2hlczsKKworICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKKyAgaWYgKGdwID09IDApCisgICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKKyAgZWxzZQorICAgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOworCisgIGdvdF9sbyA9IGZhbHNlOworCisgIGFkanVzdCA9IDA7CisKKyAgaWYgKGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMKQorICAgIG9mZnNldHMgPSBOVUxMOworICBlbHNlCisgICAgb2Zmc2V0cyA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+b2Zmc2V0czsKKworICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBleHRlcm5hbF9yZWxvY3M7CisgIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworICBmb3IgKGkgPSAwOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOworICAgICAgYm9vbGVhbiB1c2VfbG8gPSBmYWxzZTsKKyAgICAgIGJmZF92bWEgYWRkZW5kOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKKyAgICAgIGFzZWN0aW9uICpzID0gTlVMTDsKKyAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOworCisgICAgICBpZiAoISBnb3RfbG8pCisJbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKKyAgICAgIGVsc2UKKwl7CisJICBpbnRfcmVsID0gbG9faW50X3JlbDsKKwkgIGdvdF9sbyA9IGZhbHNlOworCX0KKworICAgICAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX3R5cGUKKwkJICA8IHNpemVvZiBtaXBzX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIG1pcHNfaG93dG9fdGFibGVbMF0pOworCisgICAgICAvKiBUaGUgUkVGSEkgYW5kIFJFTEhJIHJlbG9jcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgdGhleQorCSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgUkVGTE8gb3IgUkVMTE8gcmVsb2MsIHJlc3BlY3RpdmVseSwgYW5kCisJIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gYm90aCByZWxvY3MuICAqLworICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZISQorCSAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQorCXsKKwkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqbG9fZXh0X3JlbDsKKworCSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBwZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBSRUZISQorICAgICAgICAgICAgIG9yIFJFTEhJIHJlbG9jcyBiZWZvcmUgdGhlIFJFRkxPIG9yIFJFTExPIHJlbG9jLiAgVGhpcworICAgICAgICAgICAgIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KKwkgIGZvciAobG9fZXh0X3JlbCA9IGV4dF9yZWwgKyAxOworCSAgICAgICBsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQ7CisJICAgICAgIGxvX2V4dF9yZWwrKykKKwkgICAgeworCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoaW5wdXRfYmZkLCAoUFRSKSBsb19leHRfcmVsLAorCQkJCQkmbG9faW50X3JlbCk7CisJICAgICAgaWYgKGxvX2ludF9yZWwucl90eXBlICE9IGludF9yZWwucl90eXBlKQorCQlicmVhazsKKwkgICAgfQorCisJICBpZiAobG9fZXh0X3JlbCA8IGV4dF9yZWxfZW5kCisJICAgICAgJiYgKGxvX2ludF9yZWwucl90eXBlCisJCSAgPT0gKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZISQorCQkgICAgICA/IE1JUFNfUl9SRUZMTworCQkgICAgICA6IE1JUFNfUl9SRUxMTykpCisJICAgICAgJiYgaW50X3JlbC5yX2V4dGVybiA9PSBsb19pbnRfcmVsLnJfZXh0ZXJuCisJICAgICAgJiYgaW50X3JlbC5yX3N5bW5keCA9PSBsb19pbnRfcmVsLnJfc3ltbmR4KQorCSAgICB7CisJICAgICAgdXNlX2xvID0gdHJ1ZTsKKwkgICAgICBpZiAobG9fZXh0X3JlbCA9PSBleHRfcmVsICsgMSkKKwkJZ290X2xvID0gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgaG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRfcmVsLnJfdHlwZV07CisKKyAgICAgIC8qIFRoZSBTV0lUQ0ggcmVsb2MgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoaXMgcmVsb2MgaXMKKwkgbWFya3MgdGhlIGxvY2F0aW9uIG9mIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb3J0aW9ucyBvZiBhbgorCSBvYmplY3QgZmlsZS4gIFRoZSBzeW1ib2wgaW5kZXggZG9lcyBub3QgcmVmZXJlbmNlIGEgc3ltYm9sLAorCSBidXQgaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZSByZWxvYyB0byB0aGUgc3VidHJhaGVuZAorCSBvZiB0aGUgZGlmZmVyZW5jZS4gIFRoaXMgcmVsb2MgaXMgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsCisJIGFuZCBuZWVkcyBubyBmdXJ0aGVyIGFkanVzdG1lbnQsIHVubGVzcyB3ZSBhcmUgcmVsYXhpbmcuICBJZgorCSB3ZSBhcmUgcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkZCBpbiBhbiBvZmZzZXQuICBTaW5jZSBubworCSBzeW1ib2xzIGFyZSBpbnZvbHZlZCBpbiB0aGlzIHJlbG9jLCB3ZSBoYW5kbGUgaXQgY29tcGxldGVseQorCSBoZXJlLiAgKi8KKyAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQorCXsKKwkgIGlmIChvZmZzZXRzICE9IE5VTEwKKwkgICAgICAmJiBvZmZzZXRzW2ldICE9IDApCisJICAgIHsKKwkgICAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKKwkJCQkJICAoYmZkX3ZtYSkgb2Zmc2V0c1tpXSwKKwkJCQkJICAoY29udGVudHMKKwkJCQkJICAgKyBhZGp1c3QKKwkJCQkJICAgKyBpbnRfcmVsLnJfdmFkZHIKKwkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKKwkgICAgICBCRkRfQVNTRVJUIChyID09IGJmZF9yZWxvY19vayk7CisJICAgIH0KKworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoaW50X3JlbC5yX2V4dGVybikKKwl7CisJICBoID0gc3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKKwkgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCBhbgorCSAgICAgZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QgYSBkZWJ1Z2dpbmcKKwkgICAgIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLworCSAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkgICAgYWJvcnQgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChpbnRfcmVsLnJfc3ltbmR4IDwgMCB8fCBpbnRfcmVsLnJfc3ltbmR4ID49IE5VTV9SRUxPQ19TRUNUSU9OUykKKwkgICAgcyA9IE5VTEw7CisJICBlbHNlCisJICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltpbnRfcmVsLnJfc3ltbmR4XTsKKworCSAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCisJICAgIGFib3J0ICgpOworCX0KKworICAgICAgLyogVGhlIEdQUkVMIHJlbG9jIHVzZXMgYW4gYWRkZW5kOiB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgR1AKKwkgdmFsdWVzLiAgKi8KKyAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfR1BSRUwKKwkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9MSVRFUkFMKQorCWFkZGVuZCA9IDA7CisgICAgICBlbHNlCisJeworCSAgaWYgKGdwX3VuZGVmaW5lZCkKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQorCQkgICAgIChpbmZvLCBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKKwkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCisJICAgICAgZ3AgPSA0OworCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7CisJICAgICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7CisJICAgIH0KKwkgIGlmICghIGludF9yZWwucl9leHRlcm4pCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoZSBjdXJyZW50CisJCSBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKwkJIElOUFVUX1NFQ1RJT04tPnZtYSBhbmQgdGhlIEdQIHZhbHVlIG9mIElOUFVUX0JGRC4gIFdlCisJCSBtdXN0IGNoYW5nZSB0aGlzIHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCisJCSBmaW5hbCBkZWZpbml0aW9uICh3aGljaCB3aWxsIGVuZCB1cCBpbiBSRUxPQ0FUSU9OKQorCQkgYW5kIHRoZSBHUCB2YWx1ZSBvZiBPVVRQVVRfQkZEICh3aGljaCBpcyBpbiBHUCkuICAqLworCSAgICAgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7CisJICAgIH0KKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCisJCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbC4gIFRoZQorCQkgY3VycmVudCBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHNpbXBseSB0aGUKKwkJIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlIHN5bWJvbCAobm9ybWFsbHkgemVybykuICBXZQorCQkgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGlzIGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYQorCQkgZGVmaW5lZCBzeW1ib2wsIHNvIHdlIHdhbnQgdGhlIGluc3RydWN0aW9uIHRvIGhvbGQKKwkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpbmFsIGRlZmluaXRpb24gb2YgdGhlCisJCSBzeW1ib2wgKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pIGFuZCB0aGUgR1AKKwkJIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCisJICAgICAgYWRkZW5kID0gLSBncDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiB1bmRlZmluZWQgb3IgY29tbW9uCisJCSBzeW1ib2wuICBUaGUgY3VycmVudCBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzCisJCSBzaW1wbHkgdGhlIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlIHN5bWJvbCAobm9ybWFsbHkKKwkJIHplcm8pLiAgV2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHdlCisJCSBhcmVuJ3QgZ29pbmcgdG8gZGVmaW5lIHRoaXMgc3ltYm9sLCBzbyB3ZSBqdXN0IGxlYXZlCisJCSB0aGUgaW5zdHJ1Y3Rpb24gYWxvbmUuICAqLworCSAgICAgIGFkZGVuZCA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIElmIHdlIGFyZSByZWxheGluZywgbWlwc19yZWxheF9zZWN0aW9uIG1heSBoYXZlIHNldAorCSBvZmZzZXRzW2ldIHRvIHNvbWUgdmFsdWUuICBBIHZhbHVlIG9mIDEgbWVhbnMgd2UgbXVzdCBleHBhbmQKKwkgYSBQQyByZWxhdGl2ZSBicmFuY2ggaW50byBhIG11bHRpLWluc3RydWN0aW9uIG9mIHNlcXVlbmNlLAorCSBhbmQgYW55IG90aGVyIHZhbHVlIGlzIGFuIGFkZGVuZC4gICovCisgICAgICBpZiAob2Zmc2V0cyAhPSBOVUxMCisJICAmJiBvZmZzZXRzW2ldICE9IDApCisJeworCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5yZWxvY2F0ZWFibGUpOworCSAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYKKwkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCisJCSAgICAgIHx8IGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxMTyk7CisJICBpZiAob2Zmc2V0c1tpXSAhPSAxKQorCSAgICBhZGRlbmQgKz0gb2Zmc2V0c1tpXTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJmZF9ieXRlICpoZXJlOworCisJICAgICAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX2V4dGVybgorCQkJICAmJiBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNik7CisKKwkgICAgICAvKiBNb3ZlIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgdXAuICAqLworCSAgICAgIGhlcmUgPSAoY29udGVudHMKKwkJICAgICAgKyBhZGp1c3QKKwkJICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKKwkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCSAgICAgIG1lbW1vdmUgKGhlcmUgKyBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5ULCBoZXJlLAorCQkgICAgICAgKHNpemVfdCkgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZQorCQkJCSAtIChpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7CisJCSAgICAgICAKKwkgICAgICAvKiBHZW5lcmF0ZSB0aGUgbmV3IGluc3RydWN0aW9ucy4gICovCisJICAgICAgaWYgKCEgbWlwc19yZWxheF9wY3JlbDE2IChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCWgsIGhlcmUsCisJCQkJCShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCQkJICsgKGludF9yZWwucl92YWRkcgorCQkJCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpCisJCQkJCSArIGFkanVzdCkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICAvKiBXZSBtdXN0IGFkanVzdCBldmVyeXRoaW5nIGVsc2UgdXAgYSBub3RjaC4gICovCisJICAgICAgYWRqdXN0ICs9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7CisKKwkgICAgICAvKiBtaXBzX3JlbGF4X3BjcmVsMTYgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhpcworCQkgcmVsb2NhdGlvbi4gICovCisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIElmIHdlIGFyZSByZWxheGluZywgYW5kIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSAudGV4dAorCSBzZWdtZW50LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgaXQgaWYgc29tZSBicmFuY2hlcyBoYXZlIGJlZW4KKwkgZXhwYW5kZWQuICBUaGUgcmVsb2MgdHlwZXMgd2hpY2ggYXJlIGxpa2VseSB0byBvY2N1ciBpbiB0aGUKKwkgLnRleHQgc2VjdGlvbiBhcmUgaGFuZGxlZCBlZmZpY2llbnRseSBieSBtaXBzX3JlbGF4X3NlY3Rpb24sCisJIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHRvIGJlIGhhbmRsZWQgaGVyZS4gICovCisgICAgICBpZiAoZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5hZGp1c3QgIT0gTlVMTAorCSAgJiYgISBpbnRfcmVsLnJfZXh0ZXJuCisJICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fVEVYVAorCSAgJiYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCisJCSAgICAgICIudGV4dCIpICE9IDAKKwkgICAgICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1BDUkVMMTYKKwkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICisJCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCisJCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTExPKSkpCisJeworCSAgYmZkX3ZtYSBhZHI7CisJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphOworCisJICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgYWRkZW5kIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIHdlIG5lZWQKKwkgICAgIHRvIGFkanVzdCB0aGUgYWRkcmVzcy4gICovCisJICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVGV09SRCk7CisKKwkgIGFkciA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKKwkJCSAgICAoY29udGVudHMKKwkJCSAgICAgKyBhZGp1c3QKKwkJCSAgICAgKyBpbnRfcmVsLnJfdmFkZHIKKwkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKKworCSAgZm9yIChhID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5hZGp1c3Q7CisJICAgICAgIGEgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKKwkgICAgICAgYSA9IGEtPm5leHQpCisJICAgIHsKKwkgICAgICBpZiAoYWRyID49IGEtPnN0YXJ0ICYmIGFkciA8IGEtPmVuZCkKKwkJYWRkZW5kICs9IGEtPmFkanVzdDsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgbXVzdCBjb252ZXJ0CisJICAgICB0aGUgZXhpc3RpbmcgcmVsb2MuICAqLworCSAgaWYgKGludF9yZWwucl9leHRlcm4pCisJICAgIHsKKwkgICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkJICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKSkKKwkJeworCQkgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0CisJCSAgICAgdGhlIHJlbG9jIGZyb20gYmVpbmcgYWdhaW5zdCB0aGUgc3ltYm9sIHRvIGJlaW5nCisJCSAgICAgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCisKKwkJICAvKiBDbGVhciB0aGUgcl9leHRlcm4gYml0LiAgKi8KKwkJICBpbnRfcmVsLnJfZXh0ZXJuID0gMDsKKworCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLworCQkgIHMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAorCQkJCQkgICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOworCisJCSAgaW50X3JlbC5yX3N5bW5keCA9IC0xOworCQkgIHN3aXRjaCAobmFtZVsxXSkKKwkJICAgIHsKKwkJICAgIGNhc2UgJ2InOgorCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCisJCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnZCc6CisJCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCisJCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ2YnOgorCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQorCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdpJzoKKwkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKKwkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnbCc6CisJCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCisJCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OworCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCisJCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ3InOgorCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKKwkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ3MnOgorCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKKwkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOworCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCisJCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ3QnOgorCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQorCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgICAgIAorCQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4ID09IC0xKQorCQkgICAgYWJvcnQgKCk7CisKKwkJICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KKwkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCQkrIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkrIHMtPm91dHB1dF9vZmZzZXQpOworCisJCSAgLyogRm9yIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiwgdGhlIG9iamVjdCBmaWxlCisJCSAgICAgY3VycmVudGx5IGhvbGRzIGp1c3QgdGhlIGFkZGVuZC4gIFdlIG11c3QgYWRqdXN0CisJCSAgICAgYnkgdGhlIGFkZHJlc3MgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZS4gICovCisJCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKKwkJICAgIHsKKwkJICAgICAgcmVsb2NhdGlvbiAtPSBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7CisKKwkJICAgICAgLyogSWYgd2UgYXJlIGNvbnZlcnRpbmcgYSBSRUxISSBvciBSRUxMTyByZWxvYworCQkJIGZyb20gYmVpbmcgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgdG8KKwkJCSBiZWluZyBhZ2FpbnN0IGEgc2VjdGlvbiwgd2UgbXVzdCBwdXQgYQorCQkJIHNwZWNpYWwgdmFsdWUgaW50byB0aGUgcl9vZmZzZXQgZmllbGQuICBUaGlzCisJCQkgdmFsdWUgaXMgdGhlIG9sZCBhZGRlbmQuICBUaGUgcl9vZmZzZXQgZm9yCisJCQkgYm90aCB0aGUgUkVMSEkgYW5kIFJFTExPIHJlbG9jcyBhcmUgdGhlIHNhbWUsCisJCQkgYW5kIHdlIHNldCBib3RoIHdoZW4gd2Ugc2VlIFJFTEhJLiAgKi8KKwkJICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSkKKwkJCXsKKwkJCSAgbG9uZyBhZGRoaSwgYWRkbG87CisKKwkJCSAgYWRkaGkgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCisJCQkJCSAgICAgIChjb250ZW50cworCQkJCQkgICAgICAgKyBhZGp1c3QKKwkJCQkJICAgICAgICsgaW50X3JlbC5yX3ZhZGRyCisJCQkJCSAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOworCQkJICBhZGRoaSAmPSAweGZmZmY7CisJCQkgIGlmIChhZGRoaSAmIDB4ODAwMCkKKwkJCSAgICBhZGRoaSAtPSAweDEwMDAwOworCQkJICBhZGRoaSA8PD0gMTY7CisKKwkJCSAgaWYgKCEgdXNlX2xvKQorCQkJICAgIGFkZGxvID0gMDsKKwkJCSAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAorCQkJCQkJICAoY29udGVudHMKKwkJCQkJCSAgICsgYWRqdXN0CisJCQkJCQkgICArIGxvX2ludF9yZWwucl92YWRkcgorCQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKKwkJCSAgICAgIGFkZGxvICY9IDB4ZmZmZjsKKwkJCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKKwkJCQlhZGRsbyAtPSAweDEwMDAwOworCisJCQkgICAgICBsb19pbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKKwkJCSAgICB9CisKKwkJCSAgaW50X3JlbC5yX29mZnNldCA9IGFkZGhpICsgYWRkbG87CisJCQl9CisJCSAgICB9CisKKwkJICBoID0gTlVMTDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yIHRoZQorCQkgICAgIG91dHB1dCBCRkQuICAqLworCQkgIGludF9yZWwucl9zeW1uZHggPSBoLT5pbmR4OworCQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4ID09IC0xKQorCQkgICAgeworCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLworCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCisJCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCQkgICAgICBpbnB1dF9zZWN0aW9uLAorCQkJICAgICAgaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIGludF9yZWwucl9zeW1uZHggPSAwOworCQkgICAgfQorCQkgIHJlbG9jYXRpb24gPSAwOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgQWRqdXN0IHRoZQorCQkgdmFsdWUgYnkgdGhlIGFtb3VudCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCisJICAgICAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgKyBzLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgLSBzLT52bWEpOworCSAgICB9CisKKwkgIHJlbG9jYXRpb24gKz0gYWRkZW5kOworCSAgYWRkZW5kID0gMDsKKworCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlCisJICAgICB0byB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgc2VjdGlvbiBhbmQgaW5jbHVkaW5nIHRoZQorCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBuZXcgYWRkcmVzcy4gIEhvd2V2ZXIsIGV4dGVybmFsIFJFTEhJCisJICAgICBhbmQgUkVMTE8gcmVsb2NzIGFyZSBQQyByZWxhdGl2ZSwgYnV0IGRvbid0IGluY2x1ZGUgYW55CisJICAgICByZWZlcmVuY2UgdG8gdGhlIGFkZHJlc3MuICBUaGUgYWRkZW5kIGlzIG1lcmVseSBhbgorCSAgICAgYWRkZW5kLiAgKi8KKwkgIGlmIChob3d0by0+cGNfcmVsYXRpdmUKKwkgICAgICAmJiAoISBpbnRfcmVsLnJfZXh0ZXJuCisJCSAgfHwgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISQorCQkgICAgICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKKwkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7CisKKwkgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLworCSAgaWYgKHJlbG9jYXRpb24gPT0gMCkKKwkgICAgciA9IGJmZF9yZWxvY19vazsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVGSEkKKwkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkpCisJCXIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAorCQkJCQkgICAgKGNvbnRlbnRzCisJCQkJCSAgICAgKyBhZGp1c3QKKwkJCQkJICAgICArIGludF9yZWwucl92YWRkcgorCQkJCQkgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgbWlwc19yZWxvY2F0ZV9oaSAoJmludF9yZWwsCisJCQkJICAgIHVzZV9sbyA/ICZsb19pbnRfcmVsIDogTlVMTCwKKwkJCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKKwkJCQkgICAgYWRqdXN0LCByZWxvY2F0aW9uLAorCQkJCSAgICBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpOworCQkgIHIgPSBiZmRfcmVsb2Nfb2s7CisJCX0KKwkgICAgfQorCisJICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3MuICAqLworCSAgaW50X3JlbC5yX3ZhZGRyICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKKworCSAgLyogU2F2ZSB0aGUgY2hhbmdlZCByZWxvYyBpbmZvcm1hdGlvbi4gICovCisJICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IChpbnB1dF9iZmQsICZpbnRfcmVsLCAoUFRSKSBleHRfcmVsKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLworCSAgaWYgKGludF9yZWwucl9leHRlcm4pCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gICovCisJICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCQl7CisJCSAgYXNlY3Rpb24gKmhzZWM7CisKKwkJICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJCSsgaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSsgaHNlYy0+b3V0cHV0X29mZnNldCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJCSAgaW5wdXRfc2VjdGlvbiwKKwkJCSAgaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgcmVsb2NhdGlvbiA9IDA7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KKwkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKKwkJCSAgICAtIHMtPnZtYSk7CisKKwkgICAgICAvKiBBIFBDIHJlbGF0aXZlIHJlbG9jIGlzIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0CisJCSBmaWxlLiAgTWFrZSBpdCBsb29rIGxpa2UgYSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbiBieQorCQkgYWRkaW5nIGluIHRoZSBzdGFydCBhZGRyZXNzLiAgKi8KKwkgICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorCQl7CisJCSAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSB8fCAhIHVzZV9sbykKKwkJICAgIHJlbG9jYXRpb24gKz0gaW50X3JlbC5yX3ZhZGRyICsgYWRqdXN0OworCQkgIGVsc2UKKwkJICAgIHJlbG9jYXRpb24gKz0gbG9faW50X3JlbC5yX3ZhZGRyICsgYWRqdXN0OworCQl9CisJICAgIH0KKworCSAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQorCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKKwkgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCisJCQkJCSAgaW5wdXRfYmZkLAorCQkJCQkgIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgY29udGVudHMsCisJCQkJCSAgKGludF9yZWwucl92YWRkcgorCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYQorCQkJCQkgICArIGFkanVzdCksCisJCQkJCSAgcmVsb2NhdGlvbiwKKwkJCQkJICBhZGRlbmQpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgbWlwc19yZWxvY2F0ZV9oaSAoJmludF9yZWwsCisJCQkJdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAorCQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIGFkanVzdCwKKwkJCQlyZWxvY2F0aW9uLAorCQkJCWludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7CisJICAgICAgciA9IGJmZF9yZWxvY19vazsKKwkgICAgfQorCX0KKworICAgICAgLyogTUlQU19SX0pNUEFERFIgcmVxdWlyZXMgcGVjdWxpYXIgb3ZlcmZsb3cgZGV0ZWN0aW9uLiAgVGhlCisJIGluc3RydWN0aW9uIHByb3ZpZGVzIGEgMjggYml0IGFkZHJlc3MgKHRoZSB0d28gbG93ZXIgYml0cyBhcmUKKwkgaW1wbGljaXQgemVyb2VzKSB3aGljaCBpcyBjb21iaW5lZCB3aXRoIHRoZSB1cHBlciBmb3VyIGJpdHMKKwkgb2YgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MuICAqLworICAgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rCisJICAmJiBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfSk1QQUREUgorCSAgJiYgKCgocmVsb2NhdGlvbgorCQkrIGFkZGVuZAorCQkrIChpbnRfcmVsLnJfZXh0ZXJuID8gMCA6IHMtPnZtYSkpCisJICAgICAgICYgMHhmMDAwMDAwMCkKKwkgICAgICAhPSAoKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCSAgICsgKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkKKwkJICAgKyBhZGp1c3QpCisJCSAgJiAweGYwMDAwMDAwKSkpCisJciA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgICAgIGFib3J0ICgpOworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJaWYgKGludF9yZWwucl9leHRlcm4pCisJCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJCWVsc2UKKwkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKKwkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQlpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworeworICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKKworICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOworICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTCkKKyAgICB7CisgICAgICBzZWMtPnVzZWRfYnlfYmZkID0KKwkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKKyAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOworICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gTlVMTDsKKyAgICAgIHNlY3Rpb25fdGRhdGEtPm9mZnNldHMgPSBOVUxMOworICAgIH0KKworICBpZiAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKKworICAgICAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSAoZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemUKKwkJCSAgICAgICogc2VjLT5yZWxvY19jb3VudCk7CisKKyAgICAgIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyA9CisJKFBUUikgYmZkX2FsbG9jIChhYmZkLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7CisgICAgICBpZiAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKwkgIHx8IChiZmRfcmVhZCAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzLCAxLAorCQkJZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCisJICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlbGF4IGEgc2VjdGlvbiB3aGVuIGxpbmtpbmcgYSBNSVBTIEVDT0ZGIGZpbGUuICBUaGlzIGlzIHVzZWQgZm9yCisgICBlbWJlZGRlZCBQSUMgY29kZSwgd2hpY2ggYWx3YXlzIHVzZXMgUEMgcmVsYXRpdmUgYnJhbmNoZXMgd2hpY2gKKyAgIG9ubHkgaGF2ZSBhbiAxOCBiaXQgcmFuZ2Ugb24gTUlQUy4gIElmIGEgYnJhbmNoIGlzIG5vdCBpbiByYW5nZSwgd2UKKyAgIGdlbmVyYXRlIGEgbG9uZyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB0byBjb21wZW5zYXRlLiAgRWFjaCB0aW1lIHdlCisgICBmaW5kIGEgYnJhbmNoIHRvIGV4cGFuZCwgd2UgaGF2ZSB0byBjaGVjayBhbGwgdGhlIG90aGVycyBhZ2FpbiB0bworICAgbWFrZSBzdXJlIHRoZXkgYXJlIHN0aWxsIGluIHJhbmdlLiAgVGhpcyBpcyBzbG93LCBidXQgaXQgb25seSBoYXMKKyAgIHRvIGJlIGRvbmUgd2hlbiAtcmVsYXggaXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIuCisKKyAgIFRoaXMgcm91dGluZSBmaWd1cmVzIG91dCB3aGljaCBicmFuY2hlcyBuZWVkIHRvIGV4cGFuZDsgdGhlIGFjdHVhbAorICAgZXhwYW5zaW9uIGlzIGRvbmUgaW4gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gdGhlIHNlY3Rpb24KKyAgIGNvbnRlbnRzIGFyZSByZWxvY2F0ZWQuICBUaGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBvZmZzZXRzCisgICBmaWVsZCBvZiB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICBBbiBvZmZzZXQgb2YgMSBtZWFucworICAgdGhhdCB0aGUgYnJhbmNoIG11c3QgYmUgZXhwYW5kZWQgaW50byBhIG11bHRpLWluc3RydWN0aW9uIFBDCisgICByZWxhdGl2ZSBicmFuY2ggKHN1Y2ggYW4gb2Zmc2V0IHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZQorICAgYnJhbmNoIHRvIGFuIGV4dGVybmFsIHN5bWJvbCkuICBBbnkgb3RoZXIgb2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZQorICAgb2YgZm91ciwgYW5kIGlzIHRoZSBhbW91bnQgdG8gY2hhbmdlIHRoZSBicmFuY2ggYnkgKHN1Y2ggYW4gb2Zmc2V0CisgICB3aWxsIG9ubHkgb2NjdXIgZm9yIGEgUEMgcmVsYXRpdmUgYnJhbmNoIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uKS4KKworICAgV2UgZG8gbm90IG1vZGlmeSB0aGUgc2VjdGlvbiByZWxvY3Mgb3IgY29udGVudHMgdGhlbXNlbHZlcyBzbyB0aGF0CisgICBpZiBtZW1vcnkgdXNhZ2UgYmVjb21lcyBhbiBpc3N1ZSB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFuZCByZWFkIHRoZW0KKyAgIGFnYWluLiAgVGhlIG9ubHkgaW5mb3JtYXRpb24gd2UgbXVzdCBzYXZlIGluIG1lbW9yeSBiZXR3ZWVuIHRoaXMKKyAgIHJvdXRpbmUgYW5kIHRoZSBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gcm91dGluZSBpcyB0aGUgdGFibGUgb2YKKyAgIG9mZnNldHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGluZm8sIGFnYWluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBib29sZWFuICphZ2FpbjsKK3sKKyAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7CisgIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7CisgIGxvbmcgKm9mZnNldHM7CisgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKKyAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLyogQXNzdW1lIHdlIGFyZSBub3QgZ29pbmcgdG8gbmVlZCBhbm90aGVyIHBhc3MuICAqLworICAqYWdhaW4gPSBmYWxzZTsKKworICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgYW4gRUNPRkYgZmlsZSwgdGhpcyBpcyBtdWNoIHRvbworICAgICBjb25mdXNpbmcgdG8gZGVhbCB3aXRoLiAgKi8KKyAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVsb2NzLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAgKi8KKyAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIFBDIHJlbGF0aXZlIHJlbG9jcywgYW5kIHdoeSB3b3VsZCB0aGVyZQorICAgICBldmVyIGJlIG9uZSBmcm9tIGFueXRoaW5nIGJ1dCB0aGUgLnRleHQgc2VjdGlvbj8gICovCisgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRleHQiKSAhPSAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGdvdCB0aGVtLiAgKi8KKyAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKTsKKyAgaWYgKHNlY3Rpb25fdGRhdGEgPT0gKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIE5VTEwKKyAgICAgIHx8IHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYykpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOworICAgIH0KKworICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBXZSBtdXN0IGluaXRpYWxpemUgX2Nvb2tlZF9zaXplIG9ubHkgdGhlIGZpcnN0IHRpbWUgd2UgYXJlCisJIGNhbGxlZC4gICovCisgICAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOworICAgIH0KKworICBjb250ZW50cyA9IHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzOworICBvZmZzZXRzID0gc2VjdGlvbl90ZGF0YS0+b2Zmc2V0czsKKworICAvKiBMb29rIGZvciBhbnkgZXh0ZXJuYWwgUEMgcmVsYXRpdmUgcmVsb2NzLiAgSW50ZXJuYWwgUEMgcmVsYXRpdmUKKyAgICAgcmVsb2NzIGFyZSBhbHJlYWR5IGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBzbyB0aGV5IGNlcnRhaW5seQorICAgICBjYW4gbm90IG92ZXJmbG93LiAgKi8KKyAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOworICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKGkgPSAwOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOworICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIGFzZWN0aW9uICpoc2VjOworICAgICAgYmZkX3NpZ25lZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYWRqX2V4dF9yZWw7CisgICAgICB1bnNpZ25lZCBpbnQgYWRqX2k7CisgICAgICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKKyAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHI7CisgICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqYWRqX2hfcHRyX2VuZDsKKyAgICAgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKKworICAgICAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgcmVsb2MsIHdlIGNlcnRhaW5seSBkb24ndAorCSBuZWVkIHRvIGRvIGl0IGFnYWluLiAgKi8KKyAgICAgIGlmIChvZmZzZXRzICE9IChsb25nICopIE5VTEwgJiYgb2Zmc2V0c1tpXSA9PSAxKQorCWNvbnRpbnVlOworCisgICAgICAvKiBRdWlja2x5IGNoZWNrIHRoYXQgdGhpcyByZWxvYyBpcyBleHRlcm5hbCBQQ1JFTDE2LiAgKi8KKyAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorCXsKKwkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgPT0gMAorCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfQklHKQorCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRykKKwkJICAhPSBNSVBTX1JfUENSRUwxNikpCisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUpID09IDAKKwkgICAgICB8fCAoKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKKwkJICAgPj4gUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCisJCSAgIT0gTUlQU19SX1BDUkVMMTYpKQorCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOworCisgICAgICBoID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07CisgICAgICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorCWFib3J0ICgpOworCisgICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwl7CisJICAvKiBKdXN0IGlnbm9yZSB1bmRlZmluZWQgc3ltYm9scy4gIFRoZXNlIHdpbGwgcHJlc3VtYWJseQorCSAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgbGF0ZXIgaW4gdGhlIGxpbmsuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLworICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOworCisgICAgICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4gICovCisgICAgICByZWxvY2F0aW9uIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAorCQkgICAgICsgKGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKSk7CisKKyAgICAgIC8qIFRoZSBhZGRlbmQgaXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIHRoZSBub3JtYWwgY2FzZQorCSBvZiBgYGJhbCBzeW1ib2wnJywgdGhlIGFkZGVuZCB3aWxsIGJlIC00LiAgSXQgd2lsbCBvbmx5IGJlCisJIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZiBgYGJhbCBzeW1ib2wrY29uc3RhbnQnJy4gIFRvIGF2b2lkCisJIGFsd2F5cyByZWFkaW5nIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3ZSBkb24ndCBjaGVjayB0aGUKKwkgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSAod2UgY291bGQgZWFzaWx5IGNoZWNrIHRoZSBjb250ZW50cworCSBpZiB3ZSBoYXBwZW4gdG8gaGF2ZSBhbHJlYWR5IHJlYWQgdGhlbSBpbiwgYnV0IEkgZmVhciB0aGF0CisJIHRoaXMgY291bGQgYmUgY29uZnVzaW5nKS4gIFRoaXMgbWVhbnMgd2Ugd2lsbCBzY3JldyB1cCBpZgorCSB0aGVyZSBpcyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGluIHJhbmdlLCBidXQgYWRkZWQgdG8KKwkgYSBjb25zdGFudCB3aGljaCBwdXRzIGl0IG91dCBvZiByYW5nZTsgaW4gc3VjaCBhIGNhc2UgdGhlCisJIGxpbmsgd2lsbCBmYWlsIHdpdGggYSByZWxvYyBvdmVyZmxvdyBlcnJvci4gIFNpbmNlIHRoZQorCSBjb21waWxlciB3aWxsIG5ldmVyIGdlbmVyYXRlIHN1Y2ggY29kZSwgaXQgc2hvdWxkIGJlIGVhc3kKKwkgZW5vdWdoIHRvIHdvcmsgYXJvdW5kIGl0IGJ5IGNoYW5naW5nIHRoZSBhc3NlbWJseSBjb2RlIGluIHRoZQorCSBzb3VyY2UgZmlsZS4gICovCisgICAgICByZWxvY2F0aW9uIC09IDQ7CisKKyAgICAgIC8qIE5vdyBSRUxPQ0FUSU9OIGlzIHRoZSBudW1iZXIgd2Ugd2FudCB0byBwdXQgaW4gdGhlIG9iamVjdAorCSBmaWxlLiAgU2VlIHdoZXRoZXIgaXQgZml0cy4gICovCisgICAgICBpZiAocmVsb2NhdGlvbiA+PSAtMHgyMDAwMCAmJiByZWxvY2F0aW9uIDwgMHgyMDAwMCkKKwljb250aW51ZTsKKworICAgICAgLyogTm93IHRoYXQgd2Uga25vdyB0aGlzIHJlbG9jIG5lZWRzIHdvcmssIHdoaWNoIHdpbGwgcmFyZWx5CisJIGhhcHBlbiwgZ28gYWhlYWQgYW5kIGdyYWIgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLworICAgICAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQorCXsKKwkgIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKKwkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzZWMtPl9yYXdfc2l6ZSk7CisJICBlbHNlCisJICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHNlYy0+X3Jhd19zaXplKTsKKwkgIGlmIChjb250ZW50cyA9PSAoYmZkX2J5dGUgKikgTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgKFBUUikgY29udGVudHMsCisJCQkJCSAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQorCSAgICBzZWN0aW9uX3RkYXRhLT5jb250ZW50cyA9IGNvbnRlbnRzOworCX0KKworICAgICAgLyogV2Ugb25seSBzdXBwb3J0IGNoYW5naW5nIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uICBJdCB3b3VsZCBiZQorCSBwb3NzaWJsZSB0byBoYW5kbGUgb3RoZXIgUEMgcmVsYXRpdmUgYnJhbmNoZXMsIGJ1dCBzb21lIG9mCisJIHRoZW0gKHRoZSBjb25kaXRpb25hbCBicmFuY2hlcykgd291bGQgcmVxdWlyZSBhIGRpZmZlcmVudAorCSBsZW5ndGggaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugd2hpY2ggd291bGQgY29tcGxpY2F0ZSBib3RoIHRoaXMKKwkgcm91dGluZSBhbmQgbWlwc19yZWxheF9wY3JlbDE2LiAgSXQgY291bGQgYmUgd3JpdHRlbiBpZgorCSBzb21lYm9keSBmZWx0IGl0IHdlcmUgaW1wb3J0YW50LiAgSWdub3JpbmcgdGhpcyByZWxvYyB3aWxsCisJIHByZXN1bWFibHkgY2F1c2UgYSByZWxvYyBvdmVyZmxvdyBlcnJvciBsYXRlciBvbi4gICovCisgICAgICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpbnRfcmVsLnJfdmFkZHIgLSBzZWMtPnZtYSkKKwkgICE9IDB4MDQxMWZmZmYpIC8qIGJnZXphbCAkMCwuID09IGJhbCAuICovCisJY29udGludWU7CisKKyAgICAgIC8qIEJvdGhlci4gIFdlIG5lZWQgdG8gZXhwYW5kIHRoaXMgcmVsb2MsIGFuZCB3ZSB3aWxsIG5lZWQgdG8KKwkgbWFrZSBhbm90aGVyIHJlbGF4YXRpb24gcGFzcyBzaW5jZSB0aGlzIGNoYW5nZSBtYXkgcHV0IG90aGVyCisJIHJlbG9jcyBvdXQgb2YgcmFuZ2UuICBXZSBuZWVkIHRvIGV4YW1pbmUgdGhlIGxvY2FsIGJyYW5jaGVzCisJIGFuZCB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBvZmZzZXRzIHdlIG11c3QKKwkgYWRkIHRvIHRoZW0uICBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSB2YWx1ZXMgb2YgYWxsCisJIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGZvbGxvd2luZyB0aGlzIGxvY2F0aW9uLiAgKi8KKworICAgICAgc2VjLT5fY29va2VkX3NpemUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKKyAgICAgICphZ2FpbiA9IHRydWU7CisKKyAgICAgIGlmIChvZmZzZXRzID09IChsb25nICopIE5VTEwpCisJeworCSAgc2l6ZV90IHNpemU7CisKKwkgIHNpemUgPSBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChsb25nKTsKKwkgIG9mZnNldHMgPSAobG9uZyAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOworCSAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBtZW1zZXQgKG9mZnNldHMsIDAsIHNpemUpOworCSAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IG9mZnNldHM7CisJfQorCisgICAgICBvZmZzZXRzW2ldID0gMTsKKworICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBQQyByZWxhdGl2ZSByZWZlcmVuY2VzIHRoYXQgY3Jvc3MgdGhpcyByZWxvYworCSBhbmQgYWRqdXN0IHRoZWlyIG9mZnNldHMuICAqLworICAgICAgYWRqX2V4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKKyAgICAgIGZvciAoYWRqX2kgPSAwOyBhZGpfZXh0X3JlbCA8IGV4dF9yZWxfZW5kOyBhZGpfZXh0X3JlbCsrLCBhZGpfaSsrKQorCXsKKwkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBhZGpfaW50X3JlbDsKKwkgIGJmZF92bWEgc3RhcnQsIHN0b3A7CisJICBpbnQgY2hhbmdlOworCisJICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGFkal9leHRfcmVsLCAmYWRqX2ludF9yZWwpOworCisJICBpZiAoYWRqX2ludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworCisJICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IGxvY2FsIHJlZmVyZW5jZXMuICBFeHRlcm5hbCBvbmVzCisJCSB3aWxsIGJlIHJlbG9jYXRlZCBjb3JyZWN0bHkgYW55aG93LiAgKi8KKwkgICAgICBpZiAoYWRqX2ludF9yZWwucl9leHRlcm4pCisJCWNvbnRpbnVlOworCisJICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIFBDIHJlbGF0aXZlIHJlbG9jIHdpdGhpbgorCQkgdGhpcyBzZWN0aW9uLiAgRklYTUU6IENyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUKKwkJIHJlbG9jcyBtYXkgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5OyBkb2VzIGFueWJvZHkKKwkJIGNhcmU/ICAqLworCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX3N5bW5keCAhPSBSRUxPQ19TRUNUSU9OX1RFWFQpCisJCWNvbnRpbnVlOworCisJICAgICAgc3RhcnQgPSBhZGpfaW50X3JlbC5yX3ZhZGRyOworCisJICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsCisJCQkJIGNvbnRlbnRzICsgYWRqX2ludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKTsKKworCSAgICAgIHN0b3AgPSAoaW5zbiAmIDB4ZmZmZikgPDwgMjsKKwkgICAgICBpZiAoKHN0b3AgJiAweDIwMDAwKSAhPSAwKQorCQlzdG9wIC09IDB4NDAwMDA7CisJICAgICAgc3RvcCArPSBhZGpfaW50X3JlbC5yX3ZhZGRyICsgNDsKKwkgICAgfQorCSAgZWxzZSBpZiAoYWRqX2ludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSkKKwkgICAgeworCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyByZWxsbzsKKwkgICAgICBsb25nIGFkZGhpLCBhZGRsbzsKKworCSAgICAgIC8qIFRoZSBuZXh0IHJlbG9jIG11c3QgYmUgTUlQU19SX1JFTExPLCBhbmQgd2UgaGFuZGxlCisJCSB0aGVtIHRvZ2V0aGVyLiAgKi8KKwkgICAgICBCRkRfQVNTRVJUIChhZGpfZXh0X3JlbCArIDEgPCBleHRfcmVsX2VuZCk7CisKKwkgICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIChhZGpfZXh0X3JlbCArIDEpLCAmcmVsbG8pOworCisJICAgICAgQkZEX0FTU0VSVCAocmVsbG8ucl90eXBlID09IE1JUFNfUl9SRUxMTyk7CisJICAgICAgCisJICAgICAgYWRkaGkgPSBiZmRfZ2V0XzMyIChhYmZkLAorCQkJCSAgIGNvbnRlbnRzICsgYWRqX2ludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKTsKKwkgICAgICBhZGRoaSAmPSAweGZmZmY7CisJICAgICAgaWYgKGFkZGhpICYgMHg4MDAwKQorCQlhZGRoaSAtPSAweDEwMDAwOworCSAgICAgIGFkZGhpIDw8PSAxNjsKKworCSAgICAgIGFkZGxvID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyByZWxsby5yX3ZhZGRyIC0gc2VjLT52bWEpOworCSAgICAgIGFkZGxvICY9IDB4ZmZmZjsKKwkgICAgICBpZiAoYWRkbG8gJiAweDgwMDApCisJCWFkZGxvIC09IDB4MTAwMDA7CisKKwkgICAgICBpZiAoYWRqX2ludF9yZWwucl9leHRlcm4pCisJCXsKKwkJICAvKiBUaGUgdmFsdWUgd2Ugd2FudCBoZXJlIGlzCisJCSAgICAgICBzeW0gLSBSRUxMT2FkZHIgKyBhZGRlbmQKKwkJICAgICB3aGljaCB3ZSBjYW4gZXhwcmVzcyBhcworCQkgICAgICAgc3ltIC0gKFJFTExPYWRkciAtIGFkZGVuZCkKKwkJICAgICBUaGVyZWZvcmUgaWYgd2UgYXJlIGV4cGFuZGluZyB0aGUgYXJlYSBiZXR3ZWVuCisJCSAgICAgUkVMTE9hZGRyIGFuZCBSRUxMT2FkZHIgLSBhZGRlbmQgd2UgbXVzdCBhZGp1c3QKKwkJICAgICB0aGUgYWRkZW5kLiAgVGhpcyBpcyBhZG1pdHRlZGx5IGFtYmlndW91cywgc2luY2UKKwkJICAgICB3ZSBtaWdodCBtZWFuIChzeW0gKyBhZGRlbmQpIC0gUkVMTE9hZGRyLCBidXQgaW4KKwkJICAgICBwcmFjdGljZSB3ZSBkb24ndCwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUKKwkJICAgICB0aGF0IGNhc2UgY29ycmVjdGx5IHNpbmNlIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZQorCQkgICAgIG5vIGlkZWEgd2hldGhlciBhbnkgcmVsb2MgaXMgYmVpbmcgZXhwYW5kZWQKKwkJICAgICBiZXR3ZWVuIHN5bSBhbmQgc3ltICsgYWRkZW5kLiAgKi8KKwkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSAoYWRkaGkgKyBhZGRsbyk7CisJCSAgc3RvcCA9IHJlbGxvLnJfdmFkZHI7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBBbiBpbnRlcm5hbCBSRUxISS9SRUxMTyBwYWlyIHJlcHJlc2VudHMgdGhlCisJCSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhZGRyZXNzZXMsICRMQzAgLSBmb28uCisJCSAgICAgVGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSB0aGUgZGlmZmVyZW5jZQorCQkgICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMQzAuICBUaGlzIGxldHMgdXMKKwkJICAgICBjb21wdXRlICRMQzAsIGFuZCwgYnkgY29uc2lkZXJpbmcgdGhlIGFkZGVuZCwKKwkJICAgICBmb28uICBJZiB0aGUgcmVsb2Mgd2UgYXJlIGV4cGFuZGluZyBmYWxscyBiZXR3ZWVuCisJCSAgICAgdGhvc2UgdHdvIHJlbG9jcywgd2UgbXVzdCBhZGp1c3QgdGhlIGFkZGVuZC4gIEF0CisJCSAgICAgdGhpcyBwb2ludCwgdGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSBpbiB0aGUKKwkJICAgICByX29mZnNldCBmaWVsZCwgd2hlcmUgaXQgd2FzIHB1dCBieQorCQkgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCisJCSAgc3RhcnQgPSByZWxsby5yX3ZhZGRyIC0gYWRqX2ludF9yZWwucl9vZmZzZXQ7CisJCSAgc3RvcCA9IHN0YXJ0ICsgYWRkaGkgKyBhZGRsbzsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSCkKKwkgICAgeworCSAgICAgIC8qIEEgTUlQU19SX1NXSVRDSCByZWxvYyByZXByZXNlbnRzIGEgd29yZCBvZiB0aGUgZm9ybQorCQkgICAud29yZCAkTDMtJExTMTIKKwkJIFRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUgaXMgY29ycmVjdCwgYXNzdW1pbmcgdGhlCisJCSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMuICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5CisJCSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCAkTFMxMi4KKwkJIFRoaXMgbGV0cyB1cyBjb21wdXRlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTFMxMiBhcworCQkgICB2YWRkciAtIHN5bW5keAorCQkgYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMgYXMKKwkJICAgdmFkZHIgLSBzeW1uZHggKyBhZGRlbmQKKwkJIHdoZXJlIGFkZGVuZCBpcyB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICBBdAorCQkgdGhpcyBwb2ludCwgdGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSBmb3VuZCBpbiB0aGUKKwkJIHJfb2Zmc2V0IGZpZWxkLCBzaW5jZSBpdCB3YXMgbW92ZWQgYnkKKwkJIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCisJICAgICAgc3RhcnQgPSBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gYWRqX2ludF9yZWwucl9vZmZzZXQ7CisJICAgICAgc3RvcCA9IHN0YXJ0ICsgYmZkX2dldF8zMiAoYWJmZCwKKwkJCQkJIChjb250ZW50cworCQkJCQkgICsgYWRqX2ludF9yZWwucl92YWRkcgorCQkJCQkgIC0gc2VjLT52bWEpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBjb250aW51ZTsKKworCSAgLyogSWYgdGhlIHJhbmdlIGV4cHJlc3NlZCBieSB0aGlzIHJlbG9jLCB3aGljaCBpcyB0aGUKKwkgICAgIGRpc3RhbmNlIGJldHdlZW4gU1RBUlQgYW5kIFNUT1AgY3Jvc3NlcyB0aGUgcmVsb2Mgd2UgYXJlCisJICAgICBleHBhbmRpbmcsIHdlIG11c3QgYWRqdXN0IHRoZSBvZmZzZXQuICBUaGUgc2lnbiBvZiB0aGUKKwkgICAgIGFkanVzdG1lbnQgZGVwZW5kcyB1cG9uIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHJhbmdlCisJICAgICBjcm9zc2VzIHRoZSByZWxvYyBiZWluZyBleHBhbmRlZC4gICovCisJICBpZiAoc3RhcnQgPD0gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPiBpbnRfcmVsLnJfdmFkZHIpCisJICAgIGNoYW5nZSA9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7CisJICBlbHNlIGlmIChzdGFydCA+IGludF9yZWwucl92YWRkciAmJiBzdG9wIDw9IGludF9yZWwucl92YWRkcikKKwkgICAgY2hhbmdlID0gLSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOworCSAgZWxzZQorCSAgICBjaGFuZ2UgPSAwOworCisJICBvZmZzZXRzW2Fkal9pXSArPSBjaGFuZ2U7CisKKwkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQorCSAgICB7CisJICAgICAgYWRqX2V4dF9yZWwrKzsKKwkgICAgICBhZGpfaSsrOworCSAgICAgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKKwkgICAgfQorCX0KKworICAgICAgLyogRmluZCBhbGwgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24gZGVmaW5lZCBieSB0aGlzIG9iamVjdCBmaWxlCisJIGFuZCBhZGp1c3QgdGhlaXIgdmFsdWVzLiAgTm90ZSB0aGF0IHdlIGRlY2lkZSB3aGV0aGVyIHRvCisJIGFkanVzdCB0aGUgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgRUNPRkYgRVhUUgorCSBzdHJ1Y3R1cmUsIGJlY2F1c2UgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZSBtYXkKKwkgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgYW4gZWFybGllciBleHBhbmRlZCByZWxvYyBhbmQgdGh1cyBtYXkKKwkgbm8gbG9uZ2VyIGNvcnJlY3RseSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgYmVmb3JlIG9yCisJIGFmdGVyIHRoZSBleHBhbmRlZCByZWxvYy4gICovCisgICAgICBleHRfY291bnQgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKKyAgICAgIGFkal9oX3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOworICAgICAgYWRqX2hfcHRyX2VuZCA9IGFkal9oX3B0ciArIGV4dF9jb3VudDsKKyAgICAgIGZvciAoOyBhZGpfaF9wdHIgPCBhZGpfaF9wdHJfZW5kOyBhZGpfaF9wdHIrKykKKwl7CisJICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICphZGpfaDsKKworCSAgYWRqX2ggPSAqYWRqX2hfcHRyOworCSAgaWYgKGFkal9oICE9IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICAgICAmJiAoYWRqX2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgICAmJiBhZGpfaC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYworCSAgICAgICYmIGFkal9oLT5lc3ltLmFzeW0udmFsdWUgPiBpbnRfcmVsLnJfdmFkZHIpCisJICAgIGFkal9oLT5yb290LnUuZGVmLnZhbHVlICs9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7CisJfQorCisgICAgICAvKiBBZGQgYW4gZW50cnkgdG8gdGhlIHN5bWJvbCB2YWx1ZSBhZGp1c3QgbGlzdC4gIFRoaXMgaXMgdXNlZAorCSBieSBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZgorCSBpbnRlcm5hbCBzeW1ib2xzIGFuZCBGRFIncy4gICovCisgICAgICBhZGp1c3QgPSAoKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikKKwkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QpKSk7CisgICAgICBpZiAoYWRqdXN0ID09IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGFkanVzdC0+c3RhcnQgPSBpbnRfcmVsLnJfdmFkZHI7CisgICAgICBhZGp1c3QtPmVuZCA9IHNlYy0+dm1hICsgc2VjLT5fcmF3X3NpemU7CisgICAgICBhZGp1c3QtPmFkanVzdCA9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7CisKKyAgICAgIGFkanVzdC0+bmV4dCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKKyAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCA9IGFkanVzdDsKKyAgICB9CisKKyAgaWYgKGNvbnRlbnRzICE9IChiZmRfYnl0ZSAqKSBOVUxMICYmICEgaW5mby0+a2VlcF9tZW1vcnkpCisgICAgZnJlZSAoY29udGVudHMpOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKKyAgICBmcmVlIChjb250ZW50cyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiB3aGVuIGEgUEMKKyAgIHJlbGF0aXZlIHJlbG9jIG11c3QgYmUgZXhwYW5kZWQgaW50byB0aGUgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KKyAgIEl0IGhhbmRsZXMgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBleHBhbnNpb24sIGluY2x1ZGluZyByZXNvbHZpbmcKKyAgIHRoZSByZWxvYy4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwgbG9jYXRpb24sIGFkZHJlc3MpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKKyAgICAgYmZkX3ZtYSBhZGRyZXNzOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisKKyAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KKyAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7CisKKyAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQorICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCisgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7CisKKyAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCisgIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKKyAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7CisKKyAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KKyAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAorCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLworCSAgICAgIGxvY2F0aW9uICsgNCk7CisgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKKwkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCisJICAgICAgbG9jYXRpb24gKyA4KTsKKyAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLworICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLworCisgIHJldHVybiB0cnVlOworfQorCisvKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCisgICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKKyAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQorICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKKyAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKKyAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcworICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZworICAgLW1lbWJlZGRlZC1waWMuICAqLworCitib29sZWFuCitiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKmRhdGFzZWM7CisgICAgIGFzZWN0aW9uICpyZWxzZWM7CisgICAgIGNoYXIgKiplcnJtc2c7Cit7CisgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKKyAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOworICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOworICBiZmRfYnl0ZSAqcDsKKworICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7CisKKyAgKmVycm1zZyA9IE5VTEw7CisKKyAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOworCisgIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKKyAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcCA9IHJlbHNlYy0+Y29udGVudHM7CisKKyAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7CisgIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKKyAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOworICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOworCisgICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKKworICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYworCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCisJIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKKwkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKKwkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKKwkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcworCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCisJIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQorCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCisJIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLworCisgICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCisgICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCisJeworCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCisJeworCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07CisJICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KKwkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCisJICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KKwkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisJICAgIGFib3J0ICgpOworCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKKwkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7CisJICBlbHNlCisJICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQorCSAgICB7CisJICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgorCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6CisJICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgorCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKKwkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYworICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KKwkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQorCXsKKwkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBiZmRfcHV0XzMyIChhYmZkLAorCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAorCQkgIHApOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCisgICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQoreworICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KKyAgeworICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCisgICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLworICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KKyAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KKyAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KKyAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KKyAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLworICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAorICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAorICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIHRydWUsIGZhbHNlLCA0LAorICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX2luLCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbiwKKyAgICBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX2luLCBOVUxMLAorICAgIG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rLCBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKKyAgICBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2ssIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MsCisgICAgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKKyAgfSwKKyAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCisgIGJmZF9hcmNoX21pcHMsCisgIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLworICAiX19fX19fX19fXyIsCisgIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKKyAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KKyAgMHgxMDAwLAorICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQorICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQorICAgICBNSVBTLiAgKi8KKyAgZmFsc2UsCisgIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCisgIDMyLAorICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLworICAmbWlwc19ob3d0b190YWJsZVtNSVBTX1JfUkVGV09SRF0sCisgIHsKKyAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KKyAgICBtYWdpY1N5bSwKKyAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCisgICAgNCwKKyAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCisgICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCisgICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCisgICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgICAgZWNvZmZfc3dhcF9oZHJfaW4sCisgICAgZWNvZmZfc3dhcF9kbnJfaW4sCisgICAgZWNvZmZfc3dhcF9wZHJfaW4sCisgICAgZWNvZmZfc3dhcF9zeW1faW4sCisgICAgZWNvZmZfc3dhcF9vcHRfaW4sCisgICAgZWNvZmZfc3dhcF9mZHJfaW4sCisgICAgZWNvZmZfc3dhcF9yZmRfaW4sCisgICAgZWNvZmZfc3dhcF9leHRfaW4sCisgICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKKyAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKKyAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgICAgZWNvZmZfc3dhcF9oZHJfb3V0LAorICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKKyAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCisgICAgZWNvZmZfc3dhcF9zeW1fb3V0LAorICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKKyAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCisgICAgZWNvZmZfc3dhcF9yZmRfb3V0LAorICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKKyAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKKyAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCisgICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KKyAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KKyAgfSwKKyAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCisgIFJFTFNaLAorICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLworICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCisgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQsCisgIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLworICBtaXBzX2FkanVzdF9yZWxvY19pbiwKKyAgbWlwc19hZGp1c3RfcmVsb2Nfb3V0LAorICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLworICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24sCisgIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLworICBOVUxMLAorICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCisgIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zCit9OworCisvKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBNSVBTIHNwZWNpZmljLiAgKi8KKyNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKKworLyogR2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cyBpcyBnZW5lcmljLiAgKi8KKyNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisKKy8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KKyNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKKy8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIE1JUFMgc3BlY2lmaWMuICAqLworI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIG1pcHNfcmVsYXhfc2VjdGlvbgorCisvKiBHQyBvZiBzZWN0aW9ucyBpcyBub3QgZG9uZS4gICovCisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisKK2NvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYyA9Cit7CisgICJlY29mZi1saXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAorICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisKKyAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCit9OworCitjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWMgPQoreworICAiZWNvZmYtYmlnbWlwcyIsCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCisge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCit9OworCitjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWMgPQoreworICAiZWNvZmYtYmlnbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAorICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpICZtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YQorfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXBtYWMuYyBiL2JmZC9jb2ZmLXBtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzMzMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtcG1hYy5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgQXBwbGUgZXQgYWwgUG93ZXJQQyBNYWMgIlhDT0ZGIiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX1NZTQlwbWFjX3hjb2ZmX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRQkieGNvZmYtcG93ZXJtYWMiCisKKy8qIFR3ZWFrIGNvZmZjb2RlLmggYmFzZWQgb24gdGhpcyBiZWluZyBhIFBvd2VyTWFjIGluc3RlYWQgb2YgUlMvNjAwMC4gKi8KKworI2RlZmluZSBQT1dFUk1BQworCisjaW5jbHVkZSAiY29mZi1yczYwMDAuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXBwYy5jIGIvYmZkL2NvZmYtcHBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0NTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLXBwYy5jCkBAIC0wLDAgKzEsMjkzNCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIE1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgT3JpZ2luYWwgdmVyc2lvbiBwaWVjZWQgdG9nZXRoZXIgYnkgS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKKworICAgVGhlcmUgaXMgbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1bi4gVGhpcyBmaWxlIGRyYXdzIGEgbG90IG9uIG90aGVyCisgICBjb2ZmIGZpbGVzLCBpbiBwYXJ0aWN1bGFyLCB0aG9zZSBmb3IgdGhlIHJzLzYwMDAsIGFscGhhLCBtaXBzLCBhbmQgCisgICBpbnRlbCBiYWNrZW5kcywgYW5kIHRoZSBQRSB3b3JrIGZvciB0aGUgYXJtLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBDdXJyZW50IFN0YXRlOgorICAgLSBvYmpkdW1wIHdvcmtzCisgICAtIHJlbG9jcyBnZW5lcmF0ZWQgYnkgZ2FzCisgICAtIGxkIHdpbGwgbGluayBmaWxlcywgYnV0IHRoZXkgZG8gbm90IHJ1bi4KKyAgIC0gZGxsdG9vbCB3aWxsIG5vdCBwcm9kdWNlIGNvcnJlY3Qgb3V0cHV0IGluIHNvbWUgLnJlbG9jIGNhc2VzLCBhbmQgd2lsbCAKKyAgICAgbm90IHByb2R1Y2UgdGhlIHJpZ2h0IGdsdWUgY29kZSBmb3IgZGxsIGZ1bmN0aW9uIGNhbGxzLgorKi8KKworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgImNvZmYvcG93ZXJwYy5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImNvZmYvcGUuaCIKKworI2lmZGVmIEJBRE1BRworI3VuZGVmIEJBRE1BRworI2VuZGlmCisKKyNkZWZpbmUgQkFETUFHKHgpIFBQQ0JBRE1BRyh4KQorCisjaW5jbHVkZSAibGliY29mZi5oIgorCisvKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgbW9yZSB0aGFuIG9uY2UsIGJ1dCB3ZSBvbmx5IGNvbXBpbGUgdGhlCisgICBmaW5hbF9saW5rIHJvdXRpbmUgb25jZS4gICovCitleHRlcm4gYm9vbGVhbiBwcGNfYmZkX2NvZmZfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIHZvaWQgZHVtcF90b2MgUEFSQU1TICgoUFRSKSk7CisKKy8qIFRoZSB0b2MgaXMgYSBzZXQgb2YgYmZkX3ZtYSBmaWVsZHMuIFdlIHVzZSB0aGUgZmFjdCB0aGF0IHZhbGlkICAgICAgICAgKi8KKy8qIGFkZHJlc3NlcyBhcmUgZXZlbiAoaS5lLiB0aGUgYml0IHJlcHJlc2VudGluZyAiMSIgaXMgb2ZmKSB0byBhbGxvdyAgICAgKi8KKy8qIHVzIHRvIGVuY29kZSBhIGxpdHRsZSBleHRyYSBpbmZvcm1hdGlvbiBpbiB0aGUgZmllbGQgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gVW5hbGxvY2F0ZWQgYWRkcmVzc2VzIGFyZSBpbnRpYWxpemVkIHRvIDEuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0gQWxsb2NhdGVkIGFkZHJlc3NlcyBhcmUgZXZlbiBudW1iZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBmaXJzdCB0aW1lIHdlIGFjdHVhbGx5IHdyaXRlIGEgcmVmZXJlbmNlIHRvIHRoZSB0b2MgaW4gdGhlIGJmZCwgICAgKi8KKy8qIHdlIHdhbnQgdG8gcmVjb3JkIHRoYXQgZmFjdCBpbiBhIGZpeHVwIGZpbGUgKGlmIGl0IGlzIGFza2VkIGZvciksIHNvICAgKi8KKy8qIHdlIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3QgYW4gYWRkcmVzcyBoYXMgYmVlbiB3cml0dGVuIGJ5IG1hcmtpbmcgKi8KKy8qIHRoZSBsb3cgb3JkZXIgYml0IHdpdGggYSAiMSIgdXBvbiB3cml0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBTRVRfVU5BTExPQ0FURUQoeCkgICgoeCkgPSAxKQorI2RlZmluZSBJU19VTkFMTE9DQVRFRCh4KSAgICgoeCkgPT0gMSkKKworI2RlZmluZSBJU19XUklUVEVOKHgpICAgICAgICgoeCkgJiAxKQorI2RlZmluZSBNQVJLX0FTX1dSSVRURU4oeCkgICgoeCkgfD0gMSkKKyNkZWZpbmUgTUFLRV9BRERSX0FHQUlOKHgpICAoKHgpICY9IH4xKQorCisKKy8qIFR1cm4gb24gdGhpcyBjaGVjayBpZiB5b3Ugc3VzcGVjdCBzb21ldGhpbmcgYW1pc3MgaW4gdGhlIGhhc2ggdGFibGVzICovCisjaWZkZWYgREVCVUdfSEFTSAorCisvKiBOZWVkIGEgNyBjaGFyIHN0cmluZyBmb3IgYW4gZXllIGNhdGNoZXIgKi8KKyNkZWZpbmUgRVlFICJrcmtqdW5rIgorCisjZGVmaW5lIEhBU0hfQ0hFQ0tfRENMIGNoYXIgZXllX2NhdGNoZXJbOF07CisjZGVmaW5lIEhBU0hfQ0hFQ0tfSU5JVChyZXQpICAgICAgc3RyY3B5KHJldC0+ZXllX2NhdGNoZXIsIEVZRSkKKyNkZWZpbmUgSEFTSF9DSEVDSyhhZGRyKSBcCisgaWYgKHN0cmNtcChhZGRyLT5leWVfY2F0Y2hlciwgRVlFKSAhPSAwKSBcCisgIHsgXAorICAgIGZwcmludGYoc3RkZXJyLFwKKyAgICBfKCJGaWxlICVzLCBsaW5lICVkLCBIYXNoIGNoZWNrIGZhaWx1cmUsIGJhZCBleWUgJThzXG4iKSwgXAorICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYWRkci0+ZXllX2NhdGNoZXIpOyBcCisgICAgYWJvcnQoKTsgXAorIH0KKworCisjZWxzZQorCisjZGVmaW5lIEhBU0hfQ0hFQ0tfRENMCisjZGVmaW5lIEhBU0hfQ0hFQ0tfSU5JVChyZXQpCisjZGVmaW5lIEhBU0hfQ0hFQ0soYWRkcikKKworI2VuZGlmCisKKy8qIEluIG9yZGVyIG5vdCB0byBhZGQgYW4gaW50IHRvIGV2ZXJ5IGhhc2ggdGFibGUgaXRlbSBmb3IgZXZlcnkgY29mZgorICAgbGlua2VyLCB3ZSBkZWZpbmUgb3VyIG93biBoYXNoIHRhYmxlLCBkZXJpdmVkIGZyb20gdGhlIGNvZmYgb25lICovCisKKy8qIFBFIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICovCisKK3N0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkKK3sKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5IHJvb3Q7IC8qIEZpcnN0IGVudHJ5LCBhcyByZXF1aXJlZCAgKi8KKworICAvKiBBcyB3ZSB3b25kZXIgYXJvdW5kIHRoZSByZWxvY3MsIHdlJ2xsIGtlZXAgdGhlIGFzc2lnbmVkIHRvY19vZmZzZXQKKyAgICAgaGVyZSAqLworICBiZmRfdm1hIHRvY19vZmZzZXQ7ICAgICAgICAgICAgICAgLyogT3VyIGFkZGl0aW9uLCBhcyByZXF1aXJlZCAqLworICBpbnQgc3ltYm9sX2lzX2dsdWU7CisgIHVuc2lnbmVkIGxvbmcgaW50IGdsdWVfaW5zbjsKKworICBIQVNIX0NIRUNLX0RDTAorfTsKKworCisvKiBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlIHJvb3Q7IC8qIEZpcnN0IGVudHJ5LCBhcyByZXF1aXJlZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqcHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCSAgIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKKyAgUEFSQU1TICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7CitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9wcGNfcnR5cGVfdG9faG93dG8KKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAorCSAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosCisJICAgYmZkX3ZtYSAqKSk7CisKKy8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK3BwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAKKyAgICAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopCisgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIAorCQkJIHNpemVvZiAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSkpOworCisgIGlmIChyZXQgPT0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCAKKwkJCQkgICAgICB0YWJsZSwgc3RyaW5nKSk7CisKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLworICAgICAgU0VUX1VOQUxMT0NBVEVEKHJldC0+dG9jX29mZnNldCk7CisgICAgICByZXQtPnN5bWJvbF9pc19nbHVlID0gMDsKKyAgICAgIHJldC0+Z2x1ZV9pbnNuID0gMDsKKworICAgICAgSEFTSF9DSEVDS19JTklUKHJldCk7CisgICAgfQorCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKworLyogSW5pdGlhbGl6ZSBhIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKKyAgICAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCQljb25zdCBjaGFyICopKTsKK3sKKyAgcmV0dXJuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBhYmZkLCBuZXdmdW5jKTsKK30KKworLyogQ3JlYXRlIGEgUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0IChyZXQsIGFiZmQsCisJCQkJCXBwY19jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKKyAgICB9CisgIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Cit9CisKKy8qIE5vdywgdGFpbG9yIGNvZmZjb2RlLmggdG8gdXNlIG91ciBoYXNoIHN0dWZmICovCisKKyNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisKKwwKKy8qIFRoZSBudCBsb2FkZXIgcG9pbnRzIHRoZSB0b2MgcmVnaXN0ZXIgdG8gJnRvYyArIDMyNzY4LCBpbiBvcmRlciB0byAqLworLyogdXNlIHRoZSBjb21wbGV0ZSByYW5nZSBvZiBhIDE2LWJpdCBkaXNwbGFjZW1lbnQuIFdlIGhhdmUgdG8gYWRqdXN0ICovCisvKiBmb3IgdGhpcyB3aGVuIHdlIGZpeCB1cCBsb2FkcyBkaXNwbGFjZWQgb2ZmIHRoZSB0b2MgcmVnLiAgICAgICAgICAgKi8KKyNkZWZpbmUgVE9DX0xPQURfQURKVVNUTUVOVCAoLTMyNzY4KQorI2RlZmluZSBUT0NfU0VDVElPTl9OQU1FICIucHJpdmF0ZS50b2MiCisKKy8qIFRoZSBtYWluIGJvZHkgb2YgY29kZSBpcyBpbiBjb2ZmY29kZS5oLiAgKi8KKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCisKKy8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKKyAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KKyNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQorCisvKiB0aGVzZSBzaG91bGQgZGVmaW5pdGVseSBnbyBpbiBhIGhlYWRlciBmaWxlIHNvbWV3aGVyZS4uLiAqLworCisvKiBOT1AgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BQlNPTFVURSAgICAgICAgICAweDAwMDAKKworLyogNjQtYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSNjQgICAgICAgICAgICAweDAwMDEKKworLyogMzItYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMzIgICAgICAgICAgICAweDAwMDIKKworLyogMjYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggYWJzb2x1dGUpICovCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjI0ICAgICAgICAgICAgMHgwMDAzCisKKy8qIDE2LWJpdCBhZGRyZXNzICovCisjZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjE2ICAgICAgICAgICAgMHgwMDA0CisKKy8qIDE2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIxNCAgICAgICAgICAgIDB4MDAwNQorCisvKiAyNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIHJlbGF0aXZlKSAqLworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDI0ICAgICAgICAgICAgIDB4MDAwNgorCisvKiAxNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnIgY29uZCByZWxhdGl2ZSkgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUwxNCAgICAgICAgICAgICAweDAwMDcKKworLyogMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlICovCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgICAgICAgICAgMHgwMDA4CisKKy8qIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCAgICAgICAgICAweDAwMDkKKworLyogMzItYml0IGFkZHIgdy9vIGltYWdlIGJhc2UgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMzJOQiAgICAgICAgICAweDAwMEEKKworLyogdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChhcyBpbiBhbiBpbWFnZSBzZWN0aW9uaGRyKSAqLworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTCAgICAgICAgICAgIDB4MDAwQgorCisvKiBzZWN0aW9uaGVhZGVyIG51bWJlciAqLworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1NFQ1RJT04gICAgICAgICAgIDB4MDAwQworCisvKiBzdWJzdGl0dXRlIFRPQyByZXN0b3JlIGluc3RydWN0aW9uIGlmZiBzeW1ib2wgaXMgZ2x1ZSBjb2RlICovCisjZGVmaW5lIElNQUdFX1JFTF9QUENfSUZHTFVFICAgICAgICAgICAgMHgwMDBECisKKy8qIHN5bWJvbCBpcyBnbHVlIGNvZGU7IHZpcnR1YWwgYWRkcmVzcyBpcyBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBJTUFHRV9SRUxfUFBDX0lNR0xVRSAgICAgICAgICAgIDB4MDAwRQorCisvKiB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGxpbWl0ZWQgdG8gMTYgYml0cykgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19TRUNSRUwxNiAgICAgICAgICAweDAwMEYKKworLyogc3R1ZmYgdG8gaGFuZGxlIGltbWVkaWF0ZSBkYXRhIHdoZW4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSAqLworLyogZGF0YSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpbW1lZGlhdGUgZmllbGQgKi8KKy8qIFdlIG5lZWQgdG8gZG8gKHVzdWFsbHkpIDMyIGJpdCBhcml0aG1ldGljIG9uIDE2IGJpdCBjaHVua3MgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUZISSAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19SRUZMTyAgICAgICAgICAgICAweDAwMTEKKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19QQUlSICAgICAgICAgICAgICAweDAwMTIKKworLyogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0b2NyZWwxNiwgd2l0aCBUT0NERUZOIGFzc3VtZWQgKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNl9ERUZOICAgICAweDAwMTMKKworLyogIEZsYWcgYml0cyBpbiBJTUFHRV9SRUxPQ0FUSU9OLlRZUEUgKi8KKworLyogc3VidHJhY3QgcmVsb2MgdmFsdWUgcmF0aGVyIHRoYW4gYWRkaW5nIGl0ICovCisjZGVmaW5lIElNQUdFX1JFTF9QUENfTkVHICAgICAgICAgICAgICAgMHgwMTAwCisKKy8qIGZpeCBicmFuY2ggcHJlZGljdGlvbiBiaXQgdG8gcHJlZGljdCBicmFuY2ggdGFrZW4gKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUlRBS0VOICAgICAgICAgICAweDAyMDAKKworLyogZml4IGJyYW5jaCBwcmVkaWN0aW9uIGJpdCB0byBwcmVkaWN0IGJyYW5jaCBub3QgdGFrZW4gKi8KKyNkZWZpbmUgSU1BR0VfUkVMX1BQQ19CUk5UQUtFTiAgICAgICAgICAweDA0MDAKKworLyogdG9jIHNsb3QgZGVmaW5lZCBpbiBmaWxlIChvciwgZGF0YSBpbiB0b2MpICovCisjZGVmaW5lIElNQUdFX1JFTF9QUENfVE9DREVGTiAgICAgICAgICAgMHgwODAwCisKKy8qIG1hc2tzIHRvIGlzb2xhdGUgYWJvdmUgdmFsdWVzIGluIElNQUdFX1JFTE9DQVRJT04uVHlwZSAqLworI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RZUEVNQVNLICAgICAgICAgIDB4MDBGRgorI2RlZmluZSBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLICAgICAgICAgIDB4MEYwMAorCisjZGVmaW5lIEVYVFJBQ1RfVFlQRSh4KSAgICAgICAgICAgICAgICAgKCh4KSAmIElNQUdFX1JFTF9QUENfVFlQRU1BU0spCisjZGVmaW5lIEVYVFJBQ1RfRkxBR1MoeCkgKCh4KSAmIElNQUdFX1JFTF9QUENfRkxBR01BU0spCisjZGVmaW5lIEVYVFJBQ1RfSlVOSyh4KSAgXAorICAgICAgICAgICAoKHgpICYgfihJTUFHRV9SRUxfUFBDX1RZUEVNQVNLIHwgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSykpCisKKwwKKy8qIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UgcmVsb2NhdGlvbiB3b3JrICovCisvKiAoV29yayBJbiBQcm9ncmVzcykgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfcmVmaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgYXJlbGVudCAqcmVsb2MsCisJCQkJCQkgICAgICBhc3ltYm9sICpzeW1ib2wsCisJCQkJCQkgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAorCQkJCQkJICAgICAgYmZkICpvdXRwdXRfYmZkLAorCQkJCQkJICAgICAgY2hhciAqKmVycm9yKSk7CisjaWYgMAorc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfcmVmbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICAgYXJlbGVudCAqcmVsb2MsCisJCQkJCQkgICAgICBhc3ltYm9sICpzeW1ib2wsCisJCQkJCQkgICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAorCQkJCQkJICAgICAgYmZkICpvdXRwdXRfYmZkLAorCQkJCQkJICAgICAgY2hhciAqKmVycm9yKSk7CisjZW5kaWYKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3BhaXJfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJICAgICBhcmVsZW50ICpyZWxvYywKKwkJCQkJCSAgICAgYXN5bWJvbCAqc3ltYm9sLAorCQkJCQkJICAgICBQVFIgZGF0YSwKKwkJCQkJCSAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCisJCQkJCQkgICAgIGJmZCAqb3V0cHV0X2JmZCwKKwkJCQkJCSAgICAgY2hhciAqKmVycm9yKSk7CisKKwwKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3RvYzE2X3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkJCSAgICAgIGFyZWxlbnQgKnJlbG9jLAorCQkJCQkJICAgICAgYXN5bWJvbCAqc3ltYm9sLAorCQkJCQkJICAgICAgUFRSIGRhdGEsCisJCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCSAgICAgIGJmZCAqb3V0cHV0X2JmZCwKKwkJCQkJCSAgICAgIGNoYXIgKiplcnJvcikpOworCisjaWYgMAorc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfYWRkcjMybmJfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJCSBhcmVsZW50ICpyZWxvYywKKwkJCQkJCQkgYXN5bWJvbCAqc3ltYm9sLAorCQkJCQkJCSBQVFIgZGF0YSwKKwkJCQkJCQkgYXNlY3Rpb24gKnNlY3Rpb24sCisJCQkJCQkJIGJmZCAqb3V0cHV0X2JmZCwKKwkJCQkJCQkgY2hhciAqKmVycm9yKSk7CisjZW5kaWYKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3NlY3Rpb25fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCQkJCWFyZWxlbnQgKnJlbG9jLAorCQkJCQkJCWFzeW1ib2wgKnN5bWJvbCwKKwkJCQkJCQlQVFIgZGF0YSwKKwkJCQkJCQlhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkJCQliZmQgKm91dHB1dF9iZmQsCisJCQkJCQkJY2hhciAqKmVycm9yKSk7CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcHBjX3NlY3JlbF9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCisJCQkJCQkgICAgICAgYXJlbGVudCAqcmVsb2MsCisJCQkJCQkgICAgICAgYXN5bWJvbCAqc3ltYm9sLAorCQkJCQkJICAgICAgIFBUUiBkYXRhLAorCQkJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAorCQkJCQkJICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKKwkJCQkJCSAgICAgICBjaGFyICoqZXJyb3IpKTsKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfaW1nbHVlX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKKwkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCisJCQkJCQkgICAgICAgUFRSIGRhdGEsCisJCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCisJCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAorCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOworCisKKworc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcCBQQVJBTVMoKGJmZCAqYWJmZCwgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8pKTsKKworDAorLyogRklYTUU6IEl0J2xsIHRha2UgYSB3aGlsZSB0byBnZXQgdGhyb3VnaCBhbGwgb2YgdGhlc2UuIEkgb25seSBuZWVkIGEgZmV3IHRvCisgICBnZXQgdXMgc3RhcnRlZCwgc28gdGhvc2UgSSdsbCBtYWtlIHN1cmUgd29yay4gVGhvc2UgbWFya2VkIEZJWE1FIGFyZSBlaXRoZXIKKyAgIGNvbXBsZXRlbHkgdW52ZXJpZmllZCBvciBoYXZlIGEgc3BlY2lmaWMgdW5rbm93biBtYXJrZWQgaW4gdGhlIGNvbW1lbnQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVsb2NhdGlvbiBlbnRyaWVzIGZvciBXaW5kb3dzL05UIG9uIFBvd2VyUEMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRnJvbSB0aGUgZG9jdW1lbnQgIiIgd2UgZmluZCB0aGUgZm9sbG93aW5nIGxpc3RlZCBhcyB1c2VkIHJlbG9jczogICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBQlNPTFVURSAgICAgICA6IFRoZSBub29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBRERSWzY0fDMyfDE2XSA6IGZpZWxkcyB0aGF0IGhvbGQgYWRkcmVzc2VzIGluIGRhdGEgZmllbGRzIG9yIHRoZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIDE2IGJpdCBkaXNwbGFjZW1lbnQgZmllbGQgb24gYSBsb2FkL3N0b3JlLiAgICAgICAgICAgICAqLworLyogICBBRERSWzI0fDE0XSAgICA6IGZpZWxkcyB0aGF0IGhvbGQgYWRkcmVzc2VzIGluIGJyYW5jaCBhbmQgY29uZCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGJyYW5jaGVzLiBUaGVzZSByZXByZXNlbnQgWzI2fDE2XSBiaXQgYWRkcmVzc2VzLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIFRoZSBsb3cgb3JkZXIgMiBiaXRzIGFyZSBwcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogICBSRUxbMjR8MTRdICAgICA6IGJyYW5jaGVzIHJlbGF0aXZlIHRvIHRoZSBJbnN0cnVjdGlvbiBBZGRyZXNzICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyLiBUaGVzZSByZXByZXNlbnQgWzI2fDE2XSBiaXQgYWRkcmVzc2VzLCAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGFzIGJlZm9yZS4gVGhlIGluc3RydWN0aW9uIGZpZWxkIHdpbGwgYmUgemVybywgYW5kICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBTWU0gd2lsbCBiZSBpbnNlcnRlZCBhdCBsaW5rIHRpbWUuICAqLworLyogICBUT0NSRUwxNiAgICAgICA6IDE2IGJpdCBkaXNwbGFjZW1lbnQgZmllbGQgcmVmZXJyaW5nIHRvIGEgc2xvdCBpbiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIHRvYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUT0NSRUwxNCAgICAgICA6IDE2IGJpdCBkaXNwbGFjZW1lbnQgZmllbGQsIHNpbWlsYXIgdG8gUkVMMTQgb3IgQUREUjE0LiAqLworLyogICBBRERSMzJOQiAgICAgICA6IDMyIGJpdCBhZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSB2aXJ0dWFsIG9yaWdpbi4gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIChPbiB0aGUgYWxwaGEsIHRoaXMgaXMgYWx3YXlzIGEgbGlua2VyIGdlbmVyYXRlZCB0aHVuaykqLworLyogICAgICAgICAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLworLyogICBTRUNSRUwgICAgICAgICA6IFRoZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTRUNUSU9OICAgICAgICA6IGFjY2VzcyB0byB0aGUgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGl0ZW0uIFN1cHBvcnRzIHRoZSAqLworLyogICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3IGRlYnVnZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW4gcGFydGljdWxhciwgbm90ZSB0aGF0IHRoZSBkb2N1bWVudCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IHRoZSAgICAgICAgICAqLworLyogcmVsb2NhdGlvbnMgbGlzdGVkIGluIHRoZSBoZWFkZXIgZmlsZSBhcmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBwcGNfY29mZl9ob3d0b190YWJsZVtdID0KK3sKKyAgLyogSU1BR0VfUkVMX1BQQ19BQlNPTFVURSAweDAwMDAgICBOT1AgKi8KKyAgLyogVW51c2VkOiAqLworICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BQlNPTFVURSwgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogSU1BR0VfUkVMX1BQQ19BRERSNjQgMHgwMDAxICA2NC1iaXQgYWRkcmVzcyAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPKElNQUdFX1JFTF9QUENfQUREUjY0LCAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJMCwJICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJMywJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJNjQsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwlmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJMCwJICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIAkgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkwLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSJBRERSNjQiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KKwl0cnVlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwlNSU5VU19PTkUsCSAJIC8qIHNyY19tYXNrICovCisJTUlOVVNfT05FLCAgICAgICAgCSAvKiBkc3RfbWFzayAqLworCWZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIElNQUdFX1JFTF9QUENfQUREUjMyIDB4MDAwMiAgMzItYml0IGFkZHJlc3MgKi8KKyAgLyogVXNlZDogKi8KKyAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjMyLAkvKiB0eXBlICovCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJBRERSMzIiLCAgICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBJTUFHRV9SRUxfUFBDX0FERFIyNCAweDAwMDMgIDI2LWJpdCBhZGRyZXNzLCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIGFic29sdXRlKSAqLworICAvKiB0aGUgTEkgZmllbGQgaXMgaW4gYml0IDYgdGhyb3VnaCBiaXQgMjkgaXMgMjQgYml0cywgKyAyIGZvciB0aGUgc2hpZnQgKi8KKyAgLyogT2YgY291cnNlLCBUaGF0J3MgdGhlIElCTSBhcHByb3ZlZCBiaXQgbnVtYmVyaW5nLCB3aGljaCBpcyBub3Qgd2hhdCAqLworICAvKiBhbnlvbmUgZWxzZSB1c2VzLi4uLiBUaGUgbGkgZmllbGQgaXMgaW4gYml0IDIgdGhydSAyNSAqLyAKKyAgLyogVXNlZDogKi8KKyAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjI0LCAgLyogdHlwZSAqLworCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJBRERSMjQiLCAgICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDA3ZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgwN2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBJTUFHRV9SRUxfUFBDX0FERFIxNiAweDAwMDQgIDE2LWJpdCBhZGRyZXNzICovCisgIC8qIFVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNiwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIElNQUdFX1JFTF9QUENfQUREUjE0IDB4MDAwNSAqLworICAvKiAgMTYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCisgIC8qIEZJWE1FOiB0aGUgbWFzayBpcyBsaWtlbHkgd3JvbmcsIGFuZCB0aGUgYml0IHBvc2l0aW9uIG1heSBiZSBhcyB3ZWxsICovCisgIC8qIFVudXNlZDogKi8KKyAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE0LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogSU1BR0VfUkVMX1BQQ19SRUwyNCAweDAwMDYgKi8KKyAgLyogICAyNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnJhbmNoIHJlbGF0aXZlKSAqLworICAvKiBVc2VkOiAqLworICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUwyNCwgICAvKiB0eXBlICovCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSRUwyNCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogSU1BR0VfUkVMX1BQQ19SRUwxNCAweDAwMDcgKi8KKyAgLyogICAxNi1iaXQgUEMtcmVsYXRpdmUgb2Zmc2V0LCBzaGlmdGVkIGxlZnQgMiAoYnIgY29uZCByZWxhdGl2ZSkgKi8KKyAgLyogRklYTUU6IHRoZSBtYXNrIGlzIGxpa2VseSB3cm9uZywgYW5kIHRoZSBiaXQgcG9zaXRpb24gbWF5IGJlIGFzIHdlbGwgKi8KKyAgLyogRklYTUU6IGhvdyBkb2VzIGl0IGtub3cgaG93IGZhciB0byBzaGlmdD8gKi8KKyAgLyogVW51c2VkOiAqLworICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTQsICAvKiB0eXBlICovICAgICAgICAgICAgIAorCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IDB4MDAwOCAqLworICAvKiAgIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSAqLworICAvKiBVc2VkOiAqLworICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiwvKiB0eXBlICovICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBwcGNfdG9jMTZfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlRPQ1JFTDE2IiwgICAgICAgICAgICAvKiBuYW1lICovCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCAweDAwMDkgKi8KKyAgLyogICAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCisgIC8qIFVudXNlZDogKi8KKyAgSE9XVE8gKElNQUdFX1JFTF9QUENfVE9DUkVMMTQsLyogdHlwZSAqLyAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJUT0NSRUwxNCIsICAgICAgICAgICAgLyogbmFtZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIElNQUdFX1JFTF9QUENfQUREUjMyTkIgMHgwMDBBICovCisgIC8qICAgMzItYml0IGFkZHIgdy8gaW1hZ2UgYmFzZSAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIzMk5CLC8qIHR5cGUgKi8gICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJBRERSMzJOQiIsICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogSU1BR0VfUkVMX1BQQ19TRUNSRUwgMHgwMDBCICovCisgIC8qICAgdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChhcyBpbiBhbiBpbWFnZSBzZWN0aW9uaGRyKSAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX1NFQ1JFTCwvKiB0eXBlICovICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHBwY19zZWNyZWxfcmVsb2MsICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiU0VDUkVMIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIElNQUdFX1JFTF9QUENfU0VDVElPTiAweDAwMEMgKi8KKyAgLyogICBzZWN0aW9uaGVhZGVyIG51bWJlciAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX1NFQ1RJT04sLyogdHlwZSAqLyAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBwcGNfc2VjdGlvbl9yZWxvYywgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlNFQ1RJT04iLCAgICAgICAgICAgICAvKiBuYW1lICovCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJTUFHRV9SRUxfUFBDX0lGR0xVRSAweDAwMEQgKi8KKyAgLyogICBzdWJzdGl0dXRlIFRPQyByZXN0b3JlIGluc3RydWN0aW9uIGlmZiBzeW1ib2wgaXMgZ2x1ZSBjb2RlICovCisgIC8qIFVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX0lGR0xVRSwvKiB0eXBlICovICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIklGR0xVRSIsICAgICAgICAgICAgICAvKiBuYW1lICovCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJTUFHRV9SRUxfUFBDX0lNR0xVRSAweDAwMEUgKi8KKyAgLyogICBzeW1ib2wgaXMgZ2x1ZSBjb2RlOyB2aXJ0dWFsIGFkZHJlc3MgaXMgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KKyAgLyogVW51c2VkOiAqLworICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19JTUdMVUUsLyogdHlwZSAqLyAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcHBjX2ltZ2x1ZV9yZWxvYywgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJJTUdMVUUiLCAgICAgICAgICAgICAgLyogbmFtZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1JFTDE2IDB4MDAwRiAqLworICAvKiAgIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAobGltaXRlZCB0byAxNiBiaXRzKSAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX1NFQ1JFTDE2LC8qIHR5cGUgKi8gICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiU0VDUkVMMTYiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJTUFHRV9SRUxfUFBDX1JFRkhJICAgICAgICAgICAgIDB4MDAxMCAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFRkhJLCAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcHBjX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSRUZISSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIElNQUdFX1JFTF9QUENfUkVGTE8gICAgICAgICAgICAgMHgwMDExICovCisgIC8qIFVudXNlZDogKi8KKyAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVGTE8sICAgLyogdHlwZSAqLyAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBwcGNfcmVmaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJFRkxPIiwgICAgICAgICAgICAgICAvKiBuYW1lICovCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJTUFHRV9SRUxfUFBDX1BBSVIgICAgICAgICAgICAgIDB4MDAxMiAqLworICAvKiBVbnVzZWQ6ICovCisgIEhPV1RPIChJTUFHRV9SRUxfUFBDX1BBSVIsICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcHBjX3BhaXJfcmVsb2MsICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJQQUlSIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSU1BR0VfUkVMX1BQQ19UT0NSRUwxNl9ERUZOIDB4MDAxMyAqLworICAvKiAgIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgd2l0aG91dCBjYXVzaW5nIGEgZGVmaW5pdGlvbiAqLworICAvKiBVc2VkOiAqLworICBIT1dUTyAoIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IHwgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSwgLyogdHlwZSAqLyAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJUT0NSRUwxNiwgVE9DREVGTiIsICAgLyogbmFtZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworfTsKKworCisMCisKKy8qIFNvbWUgcmVhbGx5IGNoZWV6eSBtYWNyb3MgdGhhdCBjYW4gYmUgdHVybmVkIG9uIHRvIHRlc3Qgc3RkZXJyIDotKSAqLworCisjaWZkZWYgREVCVUdfUkVMT0MKKyNkZWZpbmUgVU5fSU1QTCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgc3RhdGljIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGlmIChpID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBmcHJpbnRmKHN0ZGVycixfKCJVbmltcGxlbWVudGVkIFJlbG9jYXRpb24gLS0gJXNcbiIpLHgpOyBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIERVTVBfUkVMT0MobixyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZnByaW50ZihzdGRlcnIsIiVzIHN5bSAlZCwgYWRkciAlZCwgYWRkZW5kICVkXG4iLCBcCisJICAgbiwgKCooci0+c3ltX3B0cl9wdHIpKS0+bmFtZSwgICAgICAgICAgICAgXAorCSAgIHItPmFkZHJlc3MsIHItPmFkZGVuZCk7ICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogR2l2ZW4gYSByZWxvYyBuYW1lLCBuLCBhbmQgYSBwb2ludGVyIHRvIGFuIGludGVybmFsX3JlbG9jLCAKKyAgIGR1bXAgb3V0IGludGVyZXN0aW5nIGluZm9ybWF0aW9uIG9uIHRoZSBjb250ZW50cyAKKworI2RlZmluZSBuX25hbWUJCV9uLl9uX25hbWUKKyNkZWZpbmUgbl96ZXJvZXMJX24uX25fbi5fbl96ZXJvZXMKKyNkZWZpbmUgbl9vZmZzZXQJX24uX25fbi5fbl9vZmZzZXQKKworKi8KKworI2RlZmluZSBEVU1QX1JFTE9DMihuLHIpICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZnByaW50ZihzdGRlcnIsIiVzIHN5bSAlZCwgcl92YWRkciAlZCAlc1xuIiwgXAorCSAgIG4sIHItPnJfc3ltbmR4LCByLT5yX3ZhZGRyLFwKKwkgICAoKChyLT5yX3R5cGUpICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSA9PSAwKSBcCisJICAgPyIgIjoiIFRPQ0RFRk4iICApOyAgICAgIFwKK30KKworI2Vsc2UKKyNkZWZpbmUgVU5fSU1QTCh4KQorI2RlZmluZSBEVU1QX1JFTE9DKG4scikKKyNkZWZpbmUgRFVNUF9SRUxPQzIobixyKQorI2VuZGlmCisKKworDAorLyogdG9jIGNvbnN0cnVjdGlvbiBhbmQgbWFuYWdlbWVudCByb3V0aW5lcyAqLworCisvKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIGFuZCB0aGVzZSB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gb25lCisgICBvZiB0aGUgY29tcGlsYXRpb25zLiAgRklYTUU6IFRoaXMgaXMgY29uZnVzaW5nIGFuZCB3ZWlyZC4gIEFsc28sCisgICBCRkQgc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4gICovCitleHRlcm4gYmZkKiBiZmRfb2ZfdG9jX293bmVyOworZXh0ZXJuIGxvbmcgaW50IGdsb2JhbF90b2Nfc2l6ZTsKKworZXh0ZXJuIGxvbmcgaW50IGltcG9ydF90YWJsZV9zaXplOworZXh0ZXJuIGxvbmcgaW50IGZpcnN0X3RodW5rX2FkZHJlc3M7CitleHRlcm4gbG9uZyBpbnQgdGh1bmtfc2l6ZTsKKworZW51bSB0b2NfdHlwZQoreworICBkZWZhdWx0X3RvYywKKyAgdG9jXzMyLAorICB0b2NfNjQKK307CisKK2VudW0gcmVmX2NhdGVnb3J5Cit7CisgIHByaXYsCisgIHB1YiwKKyAgZGF0YQorfTsKKworc3RydWN0IGxpc3RfZWxlCit7CisgIHN0cnVjdCBsaXN0X2VsZSAqbmV4dDsKKyAgYmZkX3ZtYSBhZGRyOworICBlbnVtIHJlZl9jYXRlZ29yeSBjYXQ7CisgIGludCBvZmZzZXQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitleHRlcm4gc3RydWN0IGxpc3RfZWxlICpoZWFkOworZXh0ZXJuIHN0cnVjdCBsaXN0X2VsZSAqdGFpbDsKKworc3RhdGljIHZvaWQgcmVjb3JkX3RvYworICBQQVJBTVMgKChhc2VjdGlvbiAqLCBpbnQsIGVudW0gcmVmX2NhdGVnb3J5LCBjb25zdCBjaGFyICopKTsKKworc3RhdGljIHZvaWQKK3JlY29yZF90b2MgKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgY2F0LCBuYW1lKQorICAgICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247CisgICAgIGludCBvdXJfdG9jX29mZnNldDsKKyAgICAgZW51bSByZWZfY2F0ZWdvcnkgY2F0OworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICAvKiBhZGQgdGhpcyBlbnRyeSB0byBvdXIgdG9jIGFkZHItb2Zmc2V0LW5hbWUgbGlzdCAqLworICBzdHJ1Y3QgbGlzdF9lbGUgKnQ7CisgIHQgPSAoc3RydWN0IGxpc3RfZWxlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpc3RfZWxlKSk7CisgIGlmICh0ID09IE5VTEwpCisgICAgYWJvcnQgKCk7CisgIHQtPm5leHQgPSAwOworICB0LT5vZmZzZXQgPSBvdXJfdG9jX29mZnNldDsKKyAgdC0+bmFtZSA9IG5hbWU7CisgIHQtPmNhdCA9IGNhdDsKKyAgdC0+YWRkciA9IHRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgb3VyX3RvY19vZmZzZXQ7CisKKyAgaWYgKGhlYWQgPT0gMCkKKyAgICB7CisgICAgICBoZWFkID0gdDsKKyAgICAgIHRhaWwgPSB0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRhaWwtPm5leHQgPSB0OworICAgICAgdGFpbCA9IHQ7CisgICAgfQorfQorCisjaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCisKK3N0YXRpYyBib29sZWFuIHBwY19yZWNvcmRfdG9jX2VudHJ5CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBpbnQsIGVudW0gdG9jX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHBwY19tYXJrX3N5bWJvbF9hc19nbHVlCisgIFBBUkFNUyAoKGJmZCAqLCBpbnQsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7CisKKy8qIHJlY29yZCBhIHRvYyBvZmZzZXQgYWdhaW5zdCBhIHN5bWJvbCAqLworc3RhdGljIGJvb2xlYW4KK3BwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgc3ltLCB0b2Nfa2luZCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgaW50IHN5bTsKKyAgICAgZW51bSB0b2NfdHlwZSB0b2Nfa2luZDsKK3sKKyAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBpbnQgKmxvY2FsX3N5bXM7CisKKyAgaCA9IDA7CisKKyAgaCA9IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIChvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtzeW1dKTsKKyAgaWYgKGggIT0gMCkKKyAgICB7CisgICAgICBIQVNIX0NIRUNLKGgpOworICAgIH0KKworICBpZiAoaCA9PSAwKSAKKyAgICB7IAorICAgICAgbG9jYWxfc3ltcyA9IG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShhYmZkKTsKKyAgICAgIGlmIChsb2NhbF9zeW1zID09IDApCisJeworCSAgdW5zaWduZWQgaW50IGk7CisJICAvKiBhbGxvY2F0ZSBhIHRhYmxlICovCisJICBsb2NhbF9zeW1zID0gCisJICAgIChpbnQgKikgYmZkX3phbGxvYyAoYWJmZCwgCisJCQkJb2JqX3Jhd19zeW1lbnRfY291bnQoYWJmZCkgKiBzaXplb2YoaW50KSk7CisJICBpZiAobG9jYWxfc3ltcyA9PSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoYWJmZCkgPSBsb2NhbF9zeW1zOworCSAgZm9yIChpID0gMDsgaSA8IG9ial9yYXdfc3ltZW50X2NvdW50KGFiZmQpOyArK2kpCisJICAgIHsKKwkgICAgICBTRVRfVU5BTExPQ0FURUQobG9jYWxfc3ltc1tpXSk7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChJU19VTkFMTE9DQVRFRChsb2NhbF9zeW1zW3N5bV0pKSAKKwl7CisJICBsb2NhbF9zeW1zW3N5bV0gPSBnbG9iYWxfdG9jX3NpemU7CisJICBnbG9iYWxfdG9jX3NpemUgKz0gNDsKKworCSAgLyogVGhlIHNpemUgbXVzdCBmaXQgaW4gYSAxNmJpdCBkaXNwbGFjbWVudCAqLworCSAgaWYgKGdsb2JhbF90b2Nfc2l6ZSA+IDY1NTM1KQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUT0Mgb3ZlcmZsb3ciKSk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7CisKKyAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGEgdG9jIHNsb3QgYWxsb2NhdGVkLiBJZiBub3QsIGRvIGl0CisJIGhlcmUuIEl0IHdpbGwgYmUgdXNlZCBpbiByZWxvY2F0ZV9zZWN0aW9uICovCisgICAgICBpZiAoSVNfVU5BTExPQ0FURUQoaC0+dG9jX29mZnNldCkpCisJeworCSAgaC0+dG9jX29mZnNldCA9IGdsb2JhbF90b2Nfc2l6ZTsKKwkgIGdsb2JhbF90b2Nfc2l6ZSArPSA0OworCisJICAvKiBUaGUgc2l6ZSBtdXN0IGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCisJICBpZiAoZ2xvYmFsX3RvY19zaXplID49IDY1NTM1KQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUT0Mgb3ZlcmZsb3ciKSk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogcmVjb3JkIGEgdG9jIG9mZnNldCBhZ2FpbnN0IGEgc3ltYm9sICovCitzdGF0aWMgdm9pZAorcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgc3ltLCByZWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHN5bTsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Cit7CisgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgaCA9IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIChvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKVtzeW1dKTsKKworICBIQVNIX0NIRUNLKGgpOworCisgIGgtPnN5bWJvbF9pc19nbHVlID0gMTsKKyAgaC0+Z2x1ZV9pbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopICZyZWwtPnJfdmFkZHIpOworCisgIHJldHVybjsKK30KKworI2VuZGlmIC8qIENPRkZfSU1BR0VfV0lUSF9QRSAqLworDAorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRpb24gc2hvdWxkCisgICBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4gKi8KKworc3RhdGljIGJvb2xlYW4gaW5fcmVsb2NfcChhYmZkLCBob3d0bykKKyAgICAgYmZkICogYWJmZDsKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Cit7CisgIHJldHVybiAKKyAgICAoISBob3d0by0+cGNfcmVsYXRpdmUpIAorICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfQUREUjMyTkIpCisgICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNikKKyAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lNR0xVRSkKKyAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX0lGR0xVRSkgCisgICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwpCisgICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNUSU9OKQorICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfU0VDUkVMMTYpCisgICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19SRUZISSkKKyAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkxPKQorICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikKKyAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pIDsKK30gICAgIAorCisjaWYgMAorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiBwZXJmb3JtaW5nIGFsbCB0aGUgcHBjIFBFIHJlbG9jYXRpb25zICovCisvKiBEb24ndCB5ZXQga25vdyBpZiB3ZSB3YW50IHRvIGRvIHRoaXMgdGhpcyBwYXJ0aWN1bGFyIHdheSAuLi4gKGtyaykgICovCisvKiBGSVhNRTogKGl0IGlzIG5vdCB5ZXQgZW5hYmxlZCkgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcGVfcHBjX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAorCSAgICAgIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICAvKiB0aGUgY29uc3RoIHJlbG9jYXRpb24gY29tZXMgaW4gdHdvIHBhcnRzLCB3ZSBoYXZlIHRvIHJlbWVtYmVyCisgICAgIHRoZSBzdGF0ZSBiZXR3ZWVuIGNhbGxzLCBpbiB0aGVzZSB2YXJpYWJsZXMgKi8KKyAgc3RhdGljIGJvb2xlYW4gcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0MV9jb25zdGhfdmFsdWU7CisKKyAgdW5zaWduZWQgbG9uZyBzeW1fdmFsdWU7CisgIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKKyAgdW5zaWduZWQgbG9uZyBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3MgOyAvKisgaW5wdXRfc2VjdGlvbi0+dm1hKi8KKwkKKyAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOworCisgIGlmIChvdXRwdXRfYmZkKSAKKyAgICB7CisgICAgICAvKiBQYXJ0aWFsIGxpbmtpbmcgLSBkbyBub3RoaW5nICovCisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsgCisgICAgfQorCisgIGlmIChzeW1ib2xfaW4gIT0gTlVMTAorICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIC8qIEtlZXAgdGhlIHN0YXRlIG1hY2hpbmUgaGFwcHkgaW4gY2FzZSB3ZSdyZSBjYWxsZWQgYWdhaW4gKi8KKyAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19SRUZISSkgCisJeworCSAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IHRydWU7CisJICBwYXJ0MV9jb25zdGhfdmFsdWUgID0gMDsKKwl9CisgICAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7CisgICAgfQorICAKKyAgaWYgKChwYXJ0MV9jb25zdGhfYWN0aXZlKSAmJiAocl90eXBlICE9IElNQUdFX1JFTF9QUENfUEFJUikpIAorICAgIHsKKyAgICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKKyAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiTWlzc2luZyBQQUlSIik7CisgICAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7CisgICAgfQorCisKKyAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZShzeW1ib2xfaW4pOworICAKKyAgcmV0dXJuKGJmZF9yZWxvY19vayk7CQorfQorCisjZW5kaWYgLyogMCAqLworCisvKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7CisgICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKKyAgYm9vbGVhbiBoaWhhbGY7CisgIGJmZF92bWEgaGloYWxmX3ZhbDsKKyAgYXNlY3Rpb24gKnRvY19zZWN0aW9uID0gMDsKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworICByZWxvY19ob3d0b190eXBlICpob3d0byA9IDA7CisgIAorICAvKiBJZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEKKyAgICAgdGhpbmcuICBUaGUgY2FsbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGFkanVzdGluZyB0aGUgcmVsb2MKKyAgICAgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisgIAorICBoaWhhbGYgPSBmYWxzZTsKKyAgaGloYWxmX3ZhbCA9IDA7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgbG9uZyBzeW1uZHg7CisgICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOworICAgICAgYmZkX3ZtYSB2YWw7CisKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7CisgICAgICBiZmRfYnl0ZSAqbG9jOworCisgICAgICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7CisgICAgICB1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7CisgIAorICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKKyAgICAgIGxvYyA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOworCisgICAgICAvKiBGSVhNRTogY2hlY2sgYm91bmRzIG9uIHJfdHlwZSAqLworICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgaWYgKHN5bW5keCA9PSAtMSkKKwl7CisJICBoID0gTlVMTDsKKwkgIHN5bSA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGggPSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSAKKwkgICAgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XSk7CisJICBpZiAoaCAhPSAwKSAKKwkgICAgeworCSAgICAgIEhBU0hfQ0hFQ0soaCk7CisJICAgIH0KKworCSAgc3ltID0gc3ltcyArIHN5bW5keDsKKwl9CisKKyAgICAgIGlmIChyX3R5cGUgPT0gSU1BR0VfUkVMX1BQQ19JTUdMVUUgJiYgaCA9PSAwKQorCXsKKwkgIC8qIEFuIElNR0xVRSByZWxvYyBtdXN0IGhhdmUgYSBuYW1lLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KKwkgIGFib3J0KCk7CisJfQorCisgICAgICBzZWMgPSBOVUxMOworICAgICAgdmFsID0gMDsKKworICAgICAgLyogRklYTUU6IFBBSVIgdW5zdXBwb3J0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCisgICAgICBpZiAoaCA9PSBOVUxMKQorCXsKKwkgIGlmIChzeW1uZHggPT0gLTEpCisJICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOworCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAorCQkgICAgICsgc3ltLT5uX3ZhbHVlKTsKKwkgICAgICBpZiAoISBvYmpfcGUgKG91dHB1dF9iZmQpKQorCQl2YWwgLT0gc2VjLT52bWE7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgSEFTSF9DSEVDSyhoKTsKKworCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKKwkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7CisgICAgICAKKyAgICAgIC8qIEVhY2ggY2FzZSBtdXN0IGRvIGl0cyBvd24gcmVsb2NhdGlvbiwgc2V0dGluZyByc3RhdCBhcHByb3ByaWF0ZWx5ICovCisgICAgICBzd2l0Y2ggKHJfdHlwZSkKKwl7CisJZGVmYXVsdDoKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHJfdHlwZSk7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwljYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6CisJICB7CisJICAgIGJmZF92bWEgb3VyX3RvY19vZmZzZXQ7CisJICAgIGludCBmaXhpdDsKKworCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKKworCSAgICBpZiAodG9jX3NlY3Rpb24gPT0gMCkgCisJICAgICAgeworCQl0b2Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiZmRfb2ZfdG9jX293bmVyLCAKKwkJCQkJCSAgICAgICBUT0NfU0VDVElPTl9OQU1FKTsKKworCQlpZiAoIHRvY19zZWN0aW9uID09IE5VTEwgKSAKKwkJICB7CisJCSAgICAvKiBUaGVyZSBpcyBubyB0b2Mgc2VjdGlvbi4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCisJCSAgICBhYm9ydCgpOworCQkgIH0KKwkgICAgICB9CisKKwkgICAgLyogCisJICAgICAqICBBbWF6aW5nIGJpdCB0cmlja3MgcHJlc2VudC4gQXMgd2UgbWF5IGhhdmUgc2VlbiBlYXJsaWVyLCB3ZQorCSAgICAgKiAgdXNlIHRoZSAxIGJpdCB0byB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IGEgdG9jIG9mZnNldCBoYXMgYmVlbgorCSAgICAgKiAgYWxsb2NhdGVkLiBOb3cgdGhhdCB0aGV5J3ZlIGFsbCBiZWVuIGFsbG9jYXRlZCwgd2Ugd2lsbCB1c2UKKwkgICAgICogIHRoZSAxIGJpdCB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHdyaXR0ZW4gdGhpcyBwYXJ0aWN1bGFyIHRvYworCSAgICAgKiAgZW50cnkgb3V0LgorCSAgICAgKi8KKwkgICAgZml4aXQgPSBmYWxzZTsKKwkgICAgaWYgKGggPT0gMCkKKwkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KKwkJaW50ICpsb2NhbF90b2NfdGFibGU7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJc3ltID0gc3ltcyArIHN5bW5keDsKKwkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKKworCQlsb2NhbF90b2NfdGFibGUgPSBvYmpfY29mZl9sb2NhbF90b2NfdGFibGUoaW5wdXRfYmZkKTsKKwkJb3VyX3RvY19vZmZzZXQgPSBsb2NhbF90b2NfdGFibGVbc3ltbmR4XTsKKworCQlpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCisJCSAgeworCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKKwkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKKwkJICAgICAgIGFnYWluLgorCQkgICAgICovCisJCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCisJCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCAKKwkJCSAgICAgICBvdXJfdG9jX29mZnNldCwgCisJCQkgICAgICAgcHJpdiwgCisJCQkgICAgICAgc3RyZHVwKG5hbWUpKTsKKworCQkgICAgYmZkX3B1dF8zMihvdXRwdXRfYmZkLAorCQkJICAgICAgIHZhbCwKKwkJCSAgICAgICB0b2Nfc2VjdGlvbi0+Y29udGVudHMgKyBvdXJfdG9jX29mZnNldCk7CisKKwkJICAgIE1BUktfQVNfV1JJVFRFTihsb2NhbF90b2NfdGFibGVbc3ltbmR4XSk7CisJCSAgICBmaXhpdCA9IHRydWU7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKKwkJb3VyX3RvY19vZmZzZXQgPSBoLT50b2Nfb2Zmc2V0OworCisJCWlmICgocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgCisJCSAgICA9PSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gKQorCQkgIHsKKwkJICAgIC8qIFRoaXMgaXMgdW5iZWxpZXZhYmxlIGNoZWVzZS4gU29tZSBrbm93bGVkZ2FibGUgYXNtIAorCQkgICAgICAgaGFja2VyIGhhcyBkZWNpZGVkIHRvIHVzZSByMiBhcyBhIGJhc2UgZm9yIGxvYWRpbmcgCisJCSAgICAgICBhIHZhbHVlLiBIZS9TaGUgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHRvY2RlZm4gYml0LCAKKwkJICAgICAgIGFuZCBub3Qgc3VwcGx5aW5nIGEgdG9jIGRlZmluaXRpb24uIFRoZSBiZWhhdmlvdXIgaXMgCisJCSAgICAgICB0aGVuIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiB0aGUgCisJCSAgICAgICBzeW1ib2wgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YgdGhlIHRvYyBhcyB0aGUgdG9jIAorCQkgICAgICAgaW5kZXguIAorCisJCSAgICAgICBJbiBmYWN0LCB3aGF0IGlzIHVzdWFsbHkgaGFwcGVuaW5nIGlzLCBiZWNhdXNlIHRoZQorCQkgICAgICAgSW1wb3J0IEFkZHJlc3MgVGFibGUgaXMgbWFwcGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZworCQkgICAgICAgdGhlIHRvYywgc29tZSB0cmlwcHkgbGlicmFyeSBjb2RlIHRyeWluZyBmb3Igc3BlZWQgb24KKwkJICAgICAgIGRsbCBsaW5rYWdlLCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhhdCBhbmQgY29uc2lkZXJzIAorCQkgICAgICAgdGhlIElBVCB0byBiZSBwYXJ0IG9mIHRoZSB0b2MsIHRodXMgc2F2aW5nIGEgbG9hZC4KKwkJICAgICovCisKKwkJICAgIG91cl90b2Nfb2Zmc2V0ID0gdmFsIC0gCisJCSAgICAgICh0b2Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAorCQkgICAgICAgdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJCSAgICAvKiBUaGUgc2l6ZSBtdXN0IHN0aWxsIGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCisJCSAgICBpZiAob3VyX3RvY19vZmZzZXQgPj0gNjU1MzUpCisJCSAgICAgIHsKKwkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJICAoXygiJXM6IFJlbG9jYXRpb24gZm9yICVzIG9mICV4IGV4Y2VlZHMgVG9jIHNpemUgbGltaXQiKSwgCisJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBuYW1lLCBvdXJfdG9jX29mZnNldCk7CisJCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgfQorCisJCSAgICByZWNvcmRfdG9jKHRvY19zZWN0aW9uLCBvdXJfdG9jX29mZnNldCwgcHViLCBzdHJkdXAobmFtZSkpOworCQkgIH0KKwkJZWxzZSBpZiAoSVNfV1JJVFRFTihvdXJfdG9jX29mZnNldCkpCisJCSAgeworCQkgICAgLyogaWYgaXQgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGl0IGlzIG1hcmtlZCB3aXRoIHRoZSAKKwkJICAgICAgIDEgYml0LiBGaXggdXAgb3VyIG9mZnNldCwgYnV0IGRvIG5vdCB3cml0ZSBpdCBvdXQKKwkJICAgICAgIGFnYWluLgorCQkgICAgICovCisJCSAgICBNQUtFX0FERFJfQUdBSU4ob3VyX3RvY19vZmZzZXQpOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7CisKKwkJICAgIC8qIHdyaXRlIG91dCB0aGUgdG9jIGVudHJ5ICovCisJCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCisJCQkgICAgICAgdmFsLAorCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKKworCQkgICAgTUFSS19BU19XUklUVEVOKGgtPnRvY19vZmZzZXQpOworCQkgICAgLyogVGhlIHRyaWNreSBwYXJ0IGlzIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyB0aGF0ICovCisJCSAgICAvKiBuZWVkcyBhIC5yZWxvYyBlbnRyeSBmb3IgaXQgKi8KKwkJICAgIGZpeGl0ID0gdHJ1ZTsKKwkJICB9CisJICAgICAgfQorCisJICAgIGlmIChmaXhpdCAmJiBpbmZvLT5iYXNlX2ZpbGUpIAorCSAgICAgIHsKKwkJLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKKwkJICAgdG8gYSBzZWN0aW9uIG9yIGEgY29tbW9uIHN5bWJvbCwgdGhlbiBpdCBuZWVkcyBhIHJlbG9jICovCisKKwkJLyogcmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2gKKwkJICAgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKKwkJICAgdG8gYSBmaWxlICovCisKKwkJYmZkX3ZtYSBhZGRyID0gIHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgKyB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIG91cl90b2Nfb2Zmc2V0OworCQkgICAgCisJCWlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQorCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKKworCQlmd3JpdGUgKCZhZGRyLCAxLDQsIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7CisJICAgICAgfQorCisKKwkgICAgLyogRklYTUU6IHRoaXMgdGVzdCBpcyBjb25zZXJ2YXRpdmUgKi8KKwkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICYmCisJCW91cl90b2Nfb2Zmc2V0ID4gdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSkKKwkgICAgICB7CisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgIChfKCIlczogUmVsb2NhdGlvbiBleGNlZWRzIGFsbG9jYXRlZCBUT0MgKCV4KSIpLCAKKwkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJICAgdG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSk7CisJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCisJICAgIC8qIE5vdyB3ZSBrbm93IHRoZSByZWxvY2F0aW9uIGZvciB0aGlzIHRvYyByZWZlcmVuY2UgKi8KKwkgICAgcmVsb2NhdGlvbiA9ICBvdXJfdG9jX29mZnNldCArIFRPQ19MT0FEX0FESlVTVE1FTlQ7CisJICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCisJCQkJCSAgICBpbnB1dF9iZmQsIAorCQkJCQkgICAgcmVsb2NhdGlvbiwgCisJCQkJCSAgICBsb2MpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKKwkgIHsKKwkgICAgLyogVG8gc29sdmUgdGhpcywgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBzeW1ib2wgKi8KKwkgICAgLyogYXBwZWFyaW5nIG9uIHRoZSBjYWxsIGluc3RydWN0aW9uIGlzIGEgZ2x1ZSBmdW5jdGlvbiBvciBub3QuICovCisJICAgIC8qIEEgZ2x1ZSBmdW5jdGlvbiBtdXN0IGFubm91bmNlIGl0c2VsZiB2aWEgYSBJTUdMVUUgcmVsb2MsIGFuZCAqLworCSAgICAvKiB0aGUgcmVsb2MgY29udGFpbnMgdGhlIHJlcXVpcmVkIHRvYyByZXN0b3JlIGluc3RydWN0aW9uICovCisJICAKKwkgICAgYmZkX3ZtYSB4OworCSAgICBjb25zdCBjaGFyICpteV9uYW1lOworCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKKworCSAgICBpZiAoaCAhPSAwKQorCSAgICAgIHsKKwkJbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKKwkJaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAorCQkgIHsKKwkJICAgIHggPSBiZmRfZ2V0XzMyKGlucHV0X2JmZCwgbG9jKTsKKwkJICAgIGJmZF9wdXRfMzIoaW5wdXRfYmZkLCBoLT5nbHVlX2luc24sIGxvYyk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6CisJICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KKwkgIC8qIEZvciBmYXN0IGFjY2VzcyB0byB0aGUgaGVhZGVyIG9mIHRoZSBzZWN0aW9uIAorCSAgICAgY29udGFpbmluZyB0aGUgaXRlbS4gKi8KKwkgIGJyZWFrOworCWNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgorCSAgLyogVW5pbXBsZW1lbnRlZDogY29kZXZpZXcgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCisJICAvKiBJcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSByZWxhdGl2ZQorCSAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQorCSAgICAgc3ltYm9sICovCisJICBicmVhazsKKwljYXNlIElNQUdFX1JFTF9QUENfQUJTT0xVVEU6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm15X25hbWU7CisJICAgIGlmIChoID09IDApCisJCW15X25hbWUgPSAoc3ltcytzeW1uZHgpLT5fbi5fbl9uYW1lOworCSAgICBlbHNlCisJICAgICAgeworCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOworCSAgICAgIH0KKworCSAgICBmcHJpbnRmKHN0ZGVyciwgCisJCSAgICBfKCJXYXJuaW5nOiB1bnN1cHBvcnRlZCByZWxvYyAlcyA8ZmlsZSAlcywgc2VjdGlvbiAlcz5cbiIpLCAKKwkJICAgIGhvd3RvLT5uYW1lLAorCQkgICAgYmZkX2dldF9maWxlbmFtZShpbnB1dF9iZmQpLAorCQkgICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7CisKKwkgICAgZnByaW50ZihzdGRlcnIsInN5bSAlbGQgKCVzKSwgcl92YWRkciAlbGQgKCVseClcbiIsIAorCQkgICAgcmVsLT5yX3N5bW5keCwgbXlfbmFtZSwgKGxvbmcpIHJlbC0+cl92YWRkciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCisJICB9CisJICBicmVhazsKKwljYXNlIElNQUdFX1JFTF9QUENfSU1HTFVFOgorCSAgeworCSAgICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4gVGhpcyByZWxvYyB3YXMgbm90ZWQgaW4gdGhlIGZpcnN0CisJICAgICAgIHBhc3Mgb3ZlciB0aGUgcmVsb2NzLCBhbmQgdGhlIGdsdWUgaW5zdHJ1Y3Rpb24gZXh0cmFjdGVkICovCisJICAgIGNvbnN0IGNoYXIgKm15X25hbWU7CisJICAgIGlmIChoLT5zeW1ib2xfaXNfZ2x1ZSA9PSAxKSAKKwkgICAgICBicmVhazsKKwkgICAgbXlfbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKKworCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgICAoXygiJXM6IE91dCBvZiBvcmRlciBJTUdMVUUgcmVsb2MgZm9yICVzIiksIAorCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBteV9uYW1lKTsKKwkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKworCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKKwkgIHsKKwkgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpteWggPSAwOworCSAgICBjb25zdCBjaGFyICpuYW1lID0gMDsKKwkgICAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7CisKKwkgICAgaWYgKHN0cm5jbXAoIi5pZGF0YSQyIixpbnB1dF9zZWN0aW9uLT5uYW1lLDgpID09IDAgJiYgZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQorCSAgICAgIHsKKwkJLyogc2V0IG1hZ2ljIHZhbHVlcyAqLworCQlpbnQgaWRhdGE1b2Zmc2V0OworCQlzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7CisJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCisJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAorCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAorCQkgICAgc2VjLT5vdXRwdXRfb2Zmc2V0IC0gCisJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7CisJCQorCQlpZGF0YTVvZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7CisJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCisJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkJCisJCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7CisJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCisJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkJaW1wb3J0X3RhYmxlX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7CisJICAgICAgfQorCisJICAgIGlmIChoID09IDApCisJICAgICAgeyAvKiBpdCBpcyBhIGZpbGUgbG9jYWwgc3ltYm9sICovCisJCXN5bSA9IHN5bXMgKyBzeW1uZHg7CisJCW5hbWUgPSBzeW0tPl9uLl9uX25hbWU7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQljaGFyICp0YXJnZXQgPSAwOworCisJCW5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7CisJCWlmIChzdHJjbXAoIi5pZGF0YSQyIiwgbmFtZSkgPT0gMCkKKwkJICB0YXJnZXQgPSAiX19pZGF0YTJfbWFnaWNfXyI7CisJCWVsc2UgaWYgKHN0cmNtcCgiLmlkYXRhJDQiLCBuYW1lKSA9PSAwKQorCQkgIHRhcmdldCA9ICJfX2lkYXRhNF9tYWdpY19fIjsKKwkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNSIsIG5hbWUpID09IDApCisJCSAgdGFyZ2V0ID0gIl9faWRhdGE1X21hZ2ljX18iOworCisJCWlmICh0YXJnZXQgIT0gMCkKKwkJICB7CisJCSAgICBteWggPSAwOworCisJCSAgICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJCQkgdGFyZ2V0LAorCQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCSAgICBpZiAobXloID09IDApIAorCQkgICAgICB7CisJCQkvKiBNaXNzaW5nIG1hZ2ljIGNvb2tpZXMuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLworCQkJYWJvcnQoKTsKKwkJICAgICAgfQorCQkgICAgCisJCSAgICB2YWwgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgKyAKKwkJICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OworCQkgICAgaWYgKGZpcnN0X3RodW5rX2FkZHJlc3MgPT0gMCkKKwkJICAgICAgeworCQkJaW50IGlkYXRhNW9mZnNldDsKKwkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJCSAgICAgIl9faWRhdGE1X21hZ2ljX18iLAorCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOworCQkJZmlyc3RfdGh1bmtfYWRkcmVzcyA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAorCQkJICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAKKwkJCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKKwkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7CisJCQkKKwkJCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKKwkJCW15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJCSAgICAgIl9faWRhdGE2X21hZ2ljX18iLAorCQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOworCQkJCisJCQl0aHVua19zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlIC0gaWRhdGE1b2Zmc2V0OworCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCQkJICAgICAiX19pZGF0YTRfbWFnaWNfXyIsCisJCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKKwkJICAgICAgfQorCQkgIH0KKwkgICAgICB9CisKKwkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKKwkJICAgICAgCSAgICAgIGlucHV0X2JmZCwgCisJCQkgICAgICB2YWwgLSAKKwkJCSAgICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UsCisJCQkgICAgICBsb2MpOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIElNQUdFX1JFTF9QUENfUkVMMjQ6CisJICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKKwkgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisKKwkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sCisJCQkJCSAgaW5wdXRfYmZkLCAKKwkJCQkJICB2YWwsIAorCQkJCQkgIGxvYyk7CisJICBicmVhazsKKwljYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgorCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6CisJY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKKwkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOworCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKKwkJCQkJICBpbnB1dF9iZmQsIAorCQkJCQkgIHZhbCwgCisJCQkJCSAgbG9jKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKCBpbmZvLT5iYXNlX2ZpbGUgKQorCXsKKwkgIC8qIFNvIGlmIHRoaXMgaXMgbm9uIHBjcmVsYXRpdmUsIGFuZCBpcyByZWZlcmVuY2VkCisJICAgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KKwkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCisJICAgIHsKKwkgICAgICAvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAorCQkgaXNuJ3QgYWJzb2x1dGUgLSB3ZSBvdXRwdXQgdGhlIGFkZHJlc3MgaGVyZSAKKwkJIHRvIGEgZmlsZSAqLworCSAgICAgIGJmZF92bWEgYWRkciA9IHJlbC0+cl92YWRkciAKKwkJLSBpbnB1dF9zZWN0aW9uLT52bWEgCisJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKKwkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisKKwkgICAgICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKKwkJeworCQkgIGFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKKwkJfQorCSAgICAgIGZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoIChyc3RhdCkKKwl7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCWNhc2UgYmZkX3JlbG9jX29rOgorCSAgYnJlYWs7CisJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisJICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07CisKKwkgICAgaWYgKHN5bW5keCA9PSAtMSkKKwkgICAgICBuYW1lID0gIipBQlMqIjsKKwkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQorCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7CisJICAgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQorCSAgICAgIG5hbWUgPSAiKnVua25vd24qIjsKKwkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCisJCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQorCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJc3RybmNweSAoYnVmLCBzeW0tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKKwkJYnVmW1NZTU5NTEVOXSA9ICdcMCc7CisJCW5hbWUgPSBidWY7CisJICAgICAgfQorCisJICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgCisJCSAgICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAorCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJICAgICAgeworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgfQorCX0KKworICAgIH0gICAgIAorCisgIHJldHVybiB0cnVlOworfQorCisjaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCisKKy8qIEZJWE1FOiBCRkQgc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4gIFRoaXMgZmlsZSBpcyBjb21waWxlZAorICAgdHdpY2UsIGFuZCB0aGVzZSB2YXJpYWJsZXMgYXJlIHNoYXJlZC4gIFRoaXMgaXMgY29uZnVzaW5nIGFuZAorICAgd2VpcmQuICAqLworCitsb25nIGludCBnbG9iYWxfdG9jX3NpemUgPSA0OworCitiZmQqIGJmZF9vZl90b2Nfb3duZXIgPSAwOworCitsb25nIGludCBpbXBvcnRfdGFibGVfc2l6ZTsKK2xvbmcgaW50IGZpcnN0X3RodW5rX2FkZHJlc3M7Citsb25nIGludCB0aHVua19zaXplOworCitzdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7CitzdHJ1Y3QgbGlzdF9lbGUgKnRhaWw7CisKK3N0YXRpYyBjaGFyICoKK2gxID0gTl8oIlxuXHRcdFx0VE9DIE1BUFBJTkdcblxuIik7CitzdGF0aWMgY2hhciAqCitoMiA9IE5fKCIgVE9DICAgIGRpc2Fzc2VtYmx5ICBDb21tZW50cyAgICAgICBOYW1lXG4iKTsKK3N0YXRpYyBjaGFyICoKK2gzID0gTl8oIiBPZmZzZXQgIHNwZWxsaW5nICAgICAgICAgICAgICAgICAgIChpZiBwcmVzZW50KVxuIik7CisKK3ZvaWQKK2R1bXBfdG9jICh2ZmlsZSkKKyAgICAgUFRSIHZmaWxlOworeworICBGSUxFICpmaWxlID0gKEZJTEUgKikgdmZpbGU7CisgIHN0cnVjdCBsaXN0X2VsZSAqdDsKKworICBmcHJpbnRmKGZpbGUsIF8oaDEpKTsKKyAgZnByaW50ZihmaWxlLCBfKGgyKSk7CisgIGZwcmludGYoZmlsZSwgXyhoMykpOworCisgIGZvcih0ID0gaGVhZDsgdCAhPSAwOyB0PXQtPm5leHQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqY2F0ID0gIiI7CisKKyAgICAgIGlmICh0LT5jYXQgPT0gcHJpdikKKwljYXQgPSBfKCJwcml2YXRlICAgICAgICIpOworICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IHB1YikKKwljYXQgPSBfKCJwdWJsaWMgICAgICAgICIpOworICAgICAgZWxzZSBpZiAodC0+Y2F0ID09IGRhdGEpCisJY2F0ID0gXygiZGF0YS1pbi10b2MgICAiKTsKKworICAgICAgaWYgKHQtPm9mZnNldCA+IGdsb2JhbF90b2Nfc2l6ZSkKKwl7CisJICBpZiAodC0+b2Zmc2V0IDw9IGdsb2JhbF90b2Nfc2l6ZSArIHRodW5rX3NpemUpCisJICAgIGNhdCA9IF8oIklBVCByZWZlcmVuY2UgIik7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcHJpbnRmKGZpbGUsCisJCSAgICAgIF8oIioqKiogZ2xvYmFsX3RvY19zaXplICVsZCglbHgpLCB0aHVua19zaXplICVsZCglbHgpXG4iKSwKKwkJICAgICAgZ2xvYmFsX3RvY19zaXplLCBnbG9iYWxfdG9jX3NpemUsIHRodW5rX3NpemUsIHRodW5rX3NpemUpOworCSAgICAgIGNhdCA9IF8oIk91dCBvZiBib3VuZHMhIik7CisJICAgIH0KKwl9CisKKyAgICAgIGZwcmludGYoZmlsZSwKKwkgICAgICAiICUwNGx4ICAgICglZCkiLCAodW5zaWduZWQgbG9uZykgdC0+b2Zmc2V0LCB0LT5vZmZzZXQgLSAzMjc2OCk7CisgICAgICBmcHJpbnRmKGZpbGUsCisJICAgICAgIiAgICAlcyAlc1xuIiwKKwkgICAgICBjYXQsIHQtPm5hbWUpOworCisgICAgfQorCisgIGZwcmludGYoZmlsZSwgIlxuIik7Cit9CisKK2Jvb2xlYW4KK3BwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoaW5mbykgCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqczsKKyAgYmZkX2J5dGUgKmZvbzsKKyAgc3RhdGljIGNoYXIgdGVzdF9jaGFyID0gJzEnOworCisgIGlmICggZ2xvYmFsX3RvY19zaXplID09IDAgKSAvKiBGSVhNRTogZG9lcyB0aGlzIGdldCBtZSBpbiB0cm91YmxlPyAqLworICAgIHJldHVybiB0cnVlOworCisgIGlmIChiZmRfb2ZfdG9jX293bmVyID09IDApCisgICAgeworICAgICAgLyogTm8gdG9jIG93bmVyPyBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KKyAgICAgIGFib3J0KCk7CisgICAgfQorCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoIGJmZF9vZl90b2Nfb3duZXIgLCBUT0NfU0VDVElPTl9OQU1FKTsKKyAgaWYgKHMgPT0gTlVMTCkgCisgICAgeworICAgICAgLyogTm8gdG9jIHNlY3Rpb24/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLworICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyhiZmRfb2ZfdG9jX293bmVyLCBnbG9iYWxfdG9jX3NpemUpOworICBtZW1zZXQoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbF90b2Nfc2l6ZSk7CisKKyAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFsX3RvY19zaXplOworICBzLT5jb250ZW50cyA9IGZvbzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbGVhbgorcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGFzZWN0aW9uICpzZWM7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaSwgKnJlbDsKKworICAvKiBoZXJlIHdlIGhhdmUgYSBiZmQgdGhhdCBpcyB0byBiZSBpbmNsdWRlZCBvbiB0aGUgbGluay4gV2UgaGF2ZSBhIGhvb2sKKyAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICovCisKKyAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKGFiZmQpOworCisgIC8qIHJ1bW1hZ2UgYXJvdW5kIGFsbCB0aGUgcmVsb2NzIGFuZCBtYXAgdGhlIHRvYyAqLworICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKKworICBpZiAoc2VjID09IDApCisgICAgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGZvciAoOyBzZWMgIT0gMDsgc2VjID0gc2VjLT5uZXh0KQorICB7CisgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkgCisgICAgICBjb250aW51ZTsKKworICAgIC8qIGxvYWQgdGhlIHJlbG9jcyAqLworICAgIC8qIEZJWE1FOiB0aGVyZSBtYXkgYmUgYSBzdG9yYWdlIGxlYWsgaGVyZSAqLworICAgIGk9X2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKGFiZmQsc2VjLDEsMCwwLDApOworICAgIAorICAgIGlmIChpID09IDApCisgICAgICBhYm9ydCgpOworCisgICAgZm9yIChyZWw9aTtyZWw8aStzZWMtPnJlbG9jX2NvdW50OysrcmVsKSAKKyAgICAgIHsKKwl1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7CisJdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOworCWJvb2xlYW4gb2sgPSB0cnVlOworCisJRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOworCisJc3dpdGNoKHJfdHlwZSkgCisJICB7CisJICBjYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6CisJICAgIC8qIGlmIFRPQ0RFRk4gaXMgb24sIGlnbm9yZSBhcyBzb21lb25lIGVsc2UgaGFzIGFsbG9jYXRlZCB0aGUKKwkgICAgICAgdG9jIGVudHJ5ICovCisJICAgIGlmICggKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pICE9IElNQUdFX1JFTF9QUENfVE9DREVGTiApCisJICAgICAgb2sgPSBwcGNfcmVjb3JkX3RvY19lbnRyeShhYmZkLCBpbmZvLCBzZWMsIAorCQkJCQlyZWwtPnJfc3ltbmR4LCBkZWZhdWx0X3RvYyk7CisJICAgIGlmICghb2spCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICBicmVhazsKKwkgIGNhc2UgSU1BR0VfUkVMX1BQQ19JTUdMVUU6CisJICAgIHBwY19tYXJrX3N5bWJvbF9hc19nbHVlKGFiZmQsIHJlbC0+cl9zeW1uZHgsIHJlbCk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcHBjX3JlZmhpX3JlbG9jIChhYmZkLAorCQkgcmVsb2NfZW50cnksCisJCSBzeW1ib2wsCisJCSBkYXRhLAorCQkgaW5wdXRfc2VjdGlvbiwKKwkJIG91dHB1dF9iZmQsCisJCSBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgVU5fSU1QTCgiUkVGSEkiKTsKKyAgRFVNUF9SRUxPQygiUkVGSEkiLHJlbG9jX2VudHJ5KTsKKworICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKK30KKworI2lmIDAKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcHBjX3JlZmxvX3JlbG9jIChhYmZkLAorCQkgcmVsb2NfZW50cnksCisJCSBzeW1ib2wsCisJCSBkYXRhLAorCQkgaW5wdXRfc2VjdGlvbiwKKwkJIG91dHB1dF9iZmQsCisJCSBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgVU5fSU1QTCgiUkVGTE8iKTsKKyAgRFVNUF9SRUxPQygiUkVGTE8iLHJlbG9jX2VudHJ5KTsKKworICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3BwY19wYWlyX3JlbG9jIChhYmZkLAorCQlyZWxvY19lbnRyeSwKKwkJc3ltYm9sLAorCQlkYXRhLAorCQlpbnB1dF9zZWN0aW9uLAorCQlvdXRwdXRfYmZkLAorCQllcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgVU5fSU1QTCgiUEFJUiIpOworICBEVU1QX1JFTE9DKCJQQUlSIixyZWxvY19lbnRyeSk7CisKKyAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisKKyAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Cit9CisKKwwKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3BwY190b2MxNl9yZWxvYyAoYWJmZCwKKwkJIHJlbG9jX2VudHJ5LAorCQkgc3ltYm9sLAorCQkgZGF0YSwKKwkJIGlucHV0X3NlY3Rpb24sCisJCSBvdXRwdXRfYmZkLAorCQkgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIFVOX0lNUEwoIlRPQ1JFTDE2Iik7CisgIERVTVBfUkVMT0MoIlRPQ1JFTDE2IixyZWxvY19lbnRyeSk7CisKKyAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisgICAgfQorCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKyNpZiAwCisKKy8qIEFERFIzMk5CIDogMzIgYml0IGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHZpcnR1YWwgb3JpZ2luLiAgICAgICAgICovCisvKiAgICAgICAgICAgIChPbiB0aGUgYWxwaGEsIHRoaXMgaXMgYWx3YXlzIGEgbGlua2VyIGdlbmVyYXRlZCB0aHVuaykqLworLyogICAgICAgICAgICAoaS5lLiAzMmJpdCBhZGRyIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBiYXNlKSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitwcGNfYWRkcjMybmJfcmVsb2MgKGFiZmQsCisJCSAgICByZWxvY19lbnRyeSwKKwkJICAgIHN5bWJvbCwKKwkJICAgIGRhdGEsCisJCSAgICBpbnB1dF9zZWN0aW9uLAorCQkgICAgb3V0cHV0X2JmZCwKKwkJICAgIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBVTl9JTVBMKCJBRERSMzJOQiIpOworICBEVU1QX1JFTE9DKCJBRERSMzJOQiIscmVsb2NfZW50cnkpOworCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitwcGNfc2VjcmVsX3JlbG9jIChhYmZkLAorCQkgIHJlbG9jX2VudHJ5LAorCQkgIHN5bWJvbCwKKwkJICBkYXRhLAorCQkgIGlucHV0X3NlY3Rpb24sCisJCSAgb3V0cHV0X2JmZCwKKwkJICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgVU5fSU1QTCgiU0VDUkVMIik7CisgIERVTVBfUkVMT0MoIlNFQ1JFTCIscmVsb2NfZW50cnkpOworCisgIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3BwY19zZWN0aW9uX3JlbG9jIChhYmZkLAorCQkgICByZWxvY19lbnRyeSwKKwkJICAgc3ltYm9sLAorCQkgICBkYXRhLAorCQkgICBpbnB1dF9zZWN0aW9uLAorCQkgICBvdXRwdXRfYmZkLAorCQkgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgVU5fSU1QTCgiU0VDVElPTiIpOworICBEVU1QX1JFTE9DKCJTRUNUSU9OIixyZWxvY19lbnRyeSk7CisKKyAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcHBjX2ltZ2x1ZV9yZWxvYyAoYWJmZCwKKwkJICByZWxvY19lbnRyeSwKKwkJICBzeW1ib2wsCisJCSAgZGF0YSwKKwkJICBpbnB1dF9zZWN0aW9uLAorCQkgIG91dHB1dF9iZmQsCisJCSAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIFVOX0lNUEwoIklNR0xVRSIpOworICBEVU1QX1JFTE9DKCJJTUdMVUUiLHJlbG9jX2VudHJ5KTsKKworICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisMCisKKyNkZWZpbmUgTUFYX1JFTE9DX0lOREVYICBcCisgICAgICAoc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlKSAvIHNpemVvZihwcGNfY29mZl9ob3d0b190YWJsZVswXSkgLSAxKQorCisKKy8qIEZJWE1FOiBUaGVyZSBpcyBhIHBvc3NpYmxpdHkgdGhhdCB3aGVuIHdlIHJlYWQgaW4gYSByZWxvYyBmcm9tIGEgZmlsZSwKKyAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBzb21lIGJpdHMgZW5jb2RlZCBpbiB0aGUgdXBwZXIgcG9ydGlvbiBvZiB0aGUgCisJICB0eXBlIGZpZWxkLiBOb3QgeWV0IGltcGxlbWVudGVkLgorKi8KK3N0YXRpYyB2b2lkIHBwY19jb2ZmX3J0eXBlMmhvd3RvIFBBUkFNUyAoKGFyZWxlbnQgKnJlbGVudCwKKwkJCQkJICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsKSk7CisKK3N0YXRpYyB2b2lkCitwcGNfY29mZl9ydHlwZTJob3d0byAocmVsZW50LCBpbnRlcm5hbCkKKyAgICAgYXJlbGVudCAqcmVsZW50OworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsOworeyAgCisKKyAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQorICAgICB0eXBlOgorICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgorICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKKyAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKKyAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCisgICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKKyAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKKyAgICAgdGhhbiB0aGF0LgorICAqLworICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgdW5zaWduZWQgc2hvcnQgcl90eXBlICA9IEVYVFJBQ1RfVFlQRSAoaW50ZXJuYWwtPnJfdHlwZSk7CisgIHVuc2lnbmVkIHNob3J0IHJfZmxhZ3MgPSBFWFRSQUNUX0ZMQUdTKGludGVybmFsLT5yX3R5cGUpOworICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChpbnRlcm5hbC0+cl90eXBlKTsKKworICAvKiB0aGUgbWFza2luZyBwcm9jZXNzIG9ubHkgc2xpY2VzIG9mZiB0aGUgYm90dG9tIGJ5dGUgZm9yIHJfdHlwZS4gKi8KKyAgaWYgKCByX3R5cGUgPiBNQVhfUkVMT0NfSU5ERVggKSAKKyAgICBhYm9ydCgpOworCisgIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCisgIGlmICgganVuayAhPSAwICkKKyAgICBhYm9ydCgpOworCisgIHN3aXRjaChyX3R5cGUpIAorICAgIHsKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgorICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19SRUwyNDoKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjI0OgorICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzI6CisgICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjMyTkI6CisgICAgY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1RJT046CisgICAgY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDoKKyAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOworICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19JTUdMVUU6CisgICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIGludGVybmFsKTsKKyAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfVE9DUkVMMTY6CisgICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIGludGVybmFsKTsKKyAgICAgIGlmIChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKQorCWhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk47CisgICAgICBlbHNlCisJaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZihzdGRlcnIsIAorCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKKwkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCisJICAgICAgcl90eXBlKTsKKyAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7ICAgICAgCisgICAgICBicmVhazsKKyAgICB9CisgIAorICByZWxlbnQtPmhvd3RvID0gaG93dG87CisgIAorfQorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitjb2ZmX3BwY19ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGJmZF92bWEgKmFkZGVuZHA7Cit7CisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworCisgIC8qIFdlIGNhbiBlbmNvZGUgb25lIG9mIHRocmVlIHRoaW5ncyBpbiB0aGUgdHlwZSBmaWVsZCwgYXNpZGUgZnJvbSB0aGUKKyAgICAgdHlwZToKKyAgICAgMS4gSU1BR0VfUkVMX1BQQ19ORUcgLSBpbmRpY2F0ZXMgdGhlIHZhbHVlIGZpZWxkIGlzIGEgc3VidHJhY3Rpb24KKyAgICAgICAgdmFsdWUsIHJhdGhlciB0aGFuIGFuIGFkZGl0aW9uIHZhbHVlCisgICAgIDIuIElNQUdFX1JFTF9QUENfQlJUQUtFTiwgSU1BR0VfUkVMX1BQQ19CUk5UQUtFTiAtIGluZGljYXRlcyB0aGF0CisgICAgICAgIHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4gb3Igbm90LgorICAgICAzLiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gLSB0b2Mgc2xvdCBkZWZpbml0aW9uIGluIHRoZSBmaWxlCisgICAgIEZvciBub3csIHdlIGp1c3Qgc3RyaXAgdGhpcyBzdHVmZiB0byBmaW5kIHRoZSB0eXBlLCBhbmQgaWdub3JlIGl0IG90aGVyCisgICAgIHRoYW4gdGhhdC4KKyAgKi8KKworICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChyZWwtPnJfdHlwZSk7CisgIHVuc2lnbmVkIHNob3J0IHJfZmxhZ3MgPSBFWFRSQUNUX0ZMQUdTKHJlbC0+cl90eXBlKTsKKyAgdW5zaWduZWQgc2hvcnQganVuayAgICA9IEVYVFJBQ1RfSlVOSyAocmVsLT5yX3R5cGUpOworCisgIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLworICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAorICAgIGFib3J0KCk7CisgIAorICAvKiBjaGVjayBmb3IgYWJzb2x1dGUgY3JhcCAqLworICBpZiAoIGp1bmsgIT0gMCApCisgICAgYWJvcnQoKTsKKyAgICAKKyAgc3dpdGNoKHJfdHlwZSkgCisgICAgeworICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKKyAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKKyAgICAgICphZGRlbmRwIC09IHBlX2RhdGEoc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3duZXIpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOworICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKKyAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKKyAgICAgIGlmIChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKQorCWhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk47CisgICAgICBlbHNlCisJaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjE2OgorICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19SRUwyNDoKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfQUREUjI0OgorICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzI6CisgICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lGR0xVRToKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKKyAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgorICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOworICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19JTUdMVUU6CisgICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7CisgICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAKKwkgICAgICBfKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCByZWxvYyAlcyBbJWRdIHVzZWQgLS0gaXQgbWF5IG5vdCB3b3JrLlxuIiksCisJICAgICAgcHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLAorCSAgICAgIHJfdHlwZSk7CisgICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgcmV0dXJuIGhvd3RvOworfQorCisKKy8qIGEgY2hlZXN5IGxpdHRsZSBtYWNybyB0byBtYWtlIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgcmVhZGFibGUgKi8KKyNkZWZpbmUgSE9XMk1BUChiZmRfcnR5cGUscHBjX3J0eXBlKSAgXAorIGNhc2UgYmZkX3J0eXBlOiByZXR1cm4gJnBwY19jb2ZmX2hvd3RvX3RhYmxlW3BwY19ydHlwZV0KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCitQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK3BwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMzJfR09UT0ZGLCAgICBJTUFHRV9SRUxfUFBDX0lNR0xVRSk7CisgICAgICBIT1cyTUFQKEJGRF9SRUxPQ18xNl9HT1RfUENSRUwsIElNQUdFX1JFTF9QUENfSUZHTFVFKTsKKyAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzE2LCAgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMTYpOworICAgICAgSE9XMk1BUChCRkRfUkVMT0NfUFBDX0IyNiwgICAgICBJTUFHRV9SRUxfUFBDX1JFTDI0KTsKKyAgICAgIEhPVzJNQVAoQkZEX1JFTE9DX1BQQ19CQTI2LCAgICAgSU1BR0VfUkVMX1BQQ19BRERSMjQpOworICAgICAgSE9XMk1BUChCRkRfUkVMT0NfUFBDX1RPQzE2LCAgICBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2KTsKKyAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzE2X0dPVE9GRiwgICAgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNl9ERUZOKTsKKyAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzMyLCAgICAgICAgICAgSU1BR0VfUkVMX1BQQ19BRERSMzIpOworICAgICAgSE9XMk1BUChCRkRfUkVMT0NfUlZBLCAgICAgICAgICBJTUFHRV9SRUxfUFBDX0FERFIzMk5CKTsKKyAgICBkZWZhdWx0OiAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKworI3VuZGVmIEhPVzJNQVAKKworDAorLyogVGFpbG9yIGNvZmZjb2RlLmggLS0gbWFjcm8gaGVhdmVuLiAqLworCisjZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSAgcHBjX2NvZmZfcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQorCisjaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorc3RhdGljIHZvaWQgcHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKKyNlbmRpZgorCisvKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlciwgd2l0aCBvdXIgb3duIHNwZWNpYWwgdG91Y2guICAqLworCisjZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwICAgcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKKyNkZWZpbmUgY29mZl9ydHlwZV90b19ob3d0byAgICAgICAgICBjb2ZmX3BwY19ydHlwZV90b19ob3d0bworI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gICAgICAgIGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24KKyNkZWZpbmUgY29mZl9iZmRfZmluYWxfbGluayAgICAgICAgICBwcGNfYmZkX2NvZmZfZmluYWxfbGluayAKKworI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKyNkZWZpbmUgY29mZl9zd2FwX3N5bV9pbl9ob29rICAgICAgICBwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rCisjZW5kaWYKKworI2RlZmluZSBTRUxFQ1RfUkVMT0MoaW50ZXJuYWwsIGhvd3RvKSB7aW50ZXJuYWwucl90eXBlPWhvd3RvLT50eXBlO30KKworI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgUE9XRVJQQ19MRV9QRQorCisjaW5jbHVkZSAiY29mZmNvZGUuaCIKKworDAorCisjaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorLyogRklYTUU6CisgICBXaGF0IHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGFsbG9jYXRlIGEgdG9jIHNlY3Rpb24gKGVhcmx5KSwgYW5kIGF0dGFjaCAKKyAgIGl0IHRvIHRoZSBsYXN0IGJmZCB0byBiZSBwcm9jZXNzZWQuIFRoaXMgYXZvaWRzIHRoZSBwcm9ibGVtIG9mIGhhdmluZyBhIHRvYworICAgd3JpdHRlbiBvdXQgYmVmb3JlIGFsbCBmaWxlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiBUaGlzIGNvZGUgYWxsb2NhdGVzCisgICBhIHRvYyBzZWN0aW9uIGZvciBldmVyeSBmaWxlLCBhbmQgcmVjb3JkcyB0aGUgbGFzdCBvbmUgc2Vlbi4gVGhlcmUgYXJlCisgICBhdCBsZWFzdCB0d28gcHJvYmxlbXMgd2l0aCB0aGlzIGFwcHJvYWNoOgorICAgMS4gV2UgYWxsb2NhdGUgd2hvbGUgYnVuY2hlcyBvZiB0b2Mgc2VjdGlvbnMgdGhhdCBhcmUgaWdub3JlZCwgYnV0IGF0CisgICAgICBhdCBsZWFzdCB3ZSB3aWxsIG5vdCBhbGxvY2F0ZSBhIHRvYyBpZiBubyAudG9jIGlzIHByZXNlbnQuCisgICAyLiBJdCdzIG5vdCBjbGVhciB0byBtZSB0aGF0IGJlaW5nIHRoZSBsYXN0IGJmZCByZWFkIG5lY2Vzc2FyaWx5IG1lYW5zCisgICAgICB0aGF0IHlvdSBhcmUgdGhlIGxhc3QgYmZkIGNsb3NlZC4KKyAgIDMuIERvaW5nIGl0IG9uIGEgInN3YXAgaW4iIGhvb2sgZGVwZW5kcyBvbiB3aGVuIHRoZSAic3dhcCBpbiIgaXMgY2FsbGVkLAorICAgICAgYW5kIGhvdyBvZnRlbiwgZXRjLiBJdCdzIG5vdCBjbGVhciB0byBtZSB0aGF0IHRoZXJlIGlzbid0IGEgaG9sZSBoZXJlLgorKi8KKworc3RhdGljIHZvaWQKK3BwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sgKGFiZmQsIGV4dDEsIGluMSkKKyAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7CisgICAgIFBUUiBleHQxOworICAgICBQVFIgaW4xOworeworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7CisKKyAgaWYgKGJmZF9vZl90b2Nfb3duZXIgIT0gMCkgLyogd2UgYWxyZWFkeSBoYXZlIGEgdG9jLCBzbyBnbyBob21lICovCisgICAgcmV0dXJuOworCisgIGlmIChzdHJjbXAoaW4tPl9uLl9uX25hbWUsICIudG9jIikgPT0gMCkKKyAgICB7CisgICAgICBmbGFnd29yZCBmbGFnczsKKyAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKCBhYmZkICwgVE9DX1NFQ1RJT05fTkFNRSk7CisgICAgICBpZiAocyAhPSBOVUxMKSAKKwl7CisJICByZXR1cm47CisJfQorCisgICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgOworCisgICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVE9DX1NFQ1RJT05fTkFNRSk7CisKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQorCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQorCXsKKwkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yICovCisJICBhYm9ydCgpOworCX0KKworICAgICAgLyogc2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uICovCisgICAgICBiZmRfb2ZfdG9jX293bmVyID0gYWJmZDsKKyAgICB9CisKKyAgcmV0dXJuOworfQorI2VuZGlmCisKKyNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCisKK3N0YXRpYyBib29sZWFuIHBwY19kb19sYXN0IFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYmZkICpwcGNfZ2V0X2xhc3QgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgYm9vbGVhbgorcHBjX2RvX2xhc3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGFiZmQgPT0gYmZkX29mX3RvY19vd25lcikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJmZCAqCitwcGNfZ2V0X2xhc3QoKQoreworICByZXR1cm4gYmZkX29mX3RvY19vd25lcjsKK30KKworLyogdGhpcyBwaWVjZSBvZiBtYWNoaW5lcnkgZXhpc3RzIG9ubHkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJmZCB0aGF0IGhvbGRzCisgICB0aGUgdG9jIHNlY3Rpb24gaXMgd3JpdHRlbiBsYXN0LiAKKworICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBiZmRfbWFrZV9zZWN0aW9uIGF0dGFjaGluZyBhIG5ldyBzZWN0aW9uIHRvIHRoZQorICAgZW5kIG9mIHRoZSBzZWN0aW9uIGxpc3QgZm9yIHRoZSBiZmQuIAorCisgICBUaGlzIGlzIG90aGVyd2lzZSBpbnRlbmRlZCB0byBiZSBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgYXMgCisgICBjb2ZmbGluay5jOl9iZmRfY29mZl9maW5hbF9saW5rKCkuIEl0IGlzIHNwZWNpZmljYWxseSBkaWZmZXJlbnQgb25seSAKKyAgIHdoZXJlIHRoZSBQT1dFUlBDX0xFX1BFIG1hY3JvIG1vZGlmaWVzIHRoZSBjb2RlLiBJdCBpcyBsZWZ0IGluIGFzIGEgCisgICBwcmVjaXNlIGZvcm0gb2YgY29tbWVudC4ga3JrQGN5Z251cy5jb20KKyovCisjZGVmaW5lIFBPV0VSUENfTEVfUEUKKworCisvKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KKworYm9vbGVhbgorcHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gZmluZm87CisgIGJvb2xlYW4gZGVidWdfbWVyZ2VfYWxsb2NhdGVkOworICBhc2VjdGlvbiAqbzsKKyAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICBzaXplX3QgbWF4X3N5bV9jb3VudDsKKyAgc2l6ZV90IG1heF9saW5lbm9fY291bnQ7CisgIHNpemVfdCBtYXhfcmVsb2NfY291bnQ7CisgIHNpemVfdCBtYXhfb3V0cHV0X3JlbG9jX2NvdW50OworICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7CisgIGZpbGVfcHRyIHJlbF9maWxlcG9zOworICB1bnNpZ25lZCBpbnQgcmVsc3o7CisgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKKyAgdW5zaWduZWQgaW50IGxpbmVzejsKKyAgYmZkICpzdWI7CisgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBjaGFyIHN0cmJ1ZltTVFJJTkdfU0laRV9TSVpFXTsKKworICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOworCisgIGZpbmZvLmluZm8gPSBpbmZvOworICBmaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKKyAgZmluZm8uc3RydGFiID0gTlVMTDsKKyAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKKyAgZmluZm8ubGFzdF9maWxlX2luZGV4ID0gLTE7CisgIGZpbmZvLmxhc3RfYmZfaW5kZXggPSAtMTsKKyAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7CisgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKKyAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOworICBmaW5mby5vdXRzeW1zID0gTlVMTDsKKyAgZmluZm8ubGluZW5vcyA9IE5VTEw7CisgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKKyAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gZmFsc2U7CisKKyAgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvID0gaW5mbzsKKworICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOworICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKCEgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQgKCZmaW5mby5kZWJ1Z19tZXJnZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IHRydWU7CisKKyAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLworICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBDb3VudCB0aGUgbGluZSBudW1iZXJzIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQorICAgICBvdXRwdXQgZmlsZS4gIFNldCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSByZWxvY3MuICAqLworICByZWxfZmlsZXBvcyA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOworICByZWxzeiA9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKKyAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOworICBtYXhfbGluZW5vX2NvdW50ID0gMDsKKyAgbWF4X3JlbG9jX2NvdW50ID0gMDsKKworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBvLT5yZWxvY19jb3VudCA9IDA7CisgICAgICBvLT5saW5lbm9fY291bnQgPSAwOworICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCXsKKworCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2VjOworCisJICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOworCisJICAgICAgLyogTWFyayBhbGwgc2VjdGlvbnMgd2hpY2ggYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQorCQkgbGluay4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBldmVyeSBzZWN0aW9uLiAgV2UgbmVlZAorCQkgdG8gZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBpZGVudGlmeSBhbnkgc2VjdGlvbnMgd2hpY2gKKwkJIHRoZSBsaW5rZXIgaGFzIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUuICAqLworCSAgICAgIHNlYy0+bGlua2VyX21hcmsgPSB0cnVlOworCisJICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKKwkJICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQorCQlvLT5saW5lbm9fY291bnQgKz0gc2VjLT5saW5lbm9fY291bnQ7CisKKwkgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCQlvLT5yZWxvY19jb3VudCArPSBzZWMtPnJlbG9jX2NvdW50OworCisJICAgICAgaWYgKHNlYy0+X3Jhd19zaXplID4gbWF4X2NvbnRlbnRzX3NpemUpCisJCW1heF9jb250ZW50c19zaXplID0gc2VjLT5fcmF3X3NpemU7CisJICAgICAgaWYgKHNlYy0+bGluZW5vX2NvdW50ID4gbWF4X2xpbmVub19jb3VudCkKKwkJbWF4X2xpbmVub19jb3VudCA9IHNlYy0+bGluZW5vX2NvdW50OworCSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID4gbWF4X3JlbG9jX2NvdW50KQorCQltYXhfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OworCSAgICB9CisJICBlbHNlIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKKwkJICAgJiYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCQkgICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpKQorCSAgICArK28tPnJlbG9jX2NvdW50OworCX0KKyAgICAgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQorCW8tPnJlbF9maWxlcG9zID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBvLT5mbGFncyB8PSBTRUNfUkVMT0M7CisJICBvLT5yZWxfZmlsZXBvcyA9IHJlbF9maWxlcG9zOworCSAgcmVsX2ZpbGVwb3MgKz0gby0+cmVsb2NfY291bnQgKiByZWxzejsKKwl9CisgICAgfQorCisgIC8qIElmIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcG9pbnRlcnMgd2UKKyAgICAgbmVlZCB0byBrZWVwLiAgKi8KKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgLyogV2UgdXNlIHNlY3Rpb25fY291bnQgKyAxLCByYXRoZXIgdGhhbiBzZWN0aW9uX2NvdW50LCBiZWNhdXNlCisgICAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCisgICAgICBmaW5mby5zZWN0aW9uX2luZm8gPQorCSgoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8gKikKKwkgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQorCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbykpKTsKKyAgICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQorCXsKKwkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOworCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgPSBOVUxMOworCX0KKyAgICB9CisKKyAgLyogV2Ugbm93IGtub3cgdGhlIHNpemUgb2YgdGhlIHJlbG9jcywgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZmlsZQorICAgICBwb3NpdGlvbnMgb2YgdGhlIGxpbmUgbnVtYmVycy4gICovCisgIGxpbmVfZmlsZXBvcyA9IHJlbF9maWxlcG9zOworICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOworICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwKQorCW8tPmxpbmVfZmlsZXBvcyA9IDA7CisgICAgICBlbHNlCisJeworCSAgby0+bGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOworCSAgbGluZV9maWxlcG9zICs9IG8tPmxpbmVub19jb3VudCAqIGxpbmVzejsKKwl9CisKKyAgICAgIGlmIChvLT5yZWxvY19jb3VudCAhPSAwKQorCXsKKwkgIC8qIFdlIGRvbid0IGtub3cgdGhlIGluZGljZXMgb2YgZ2xvYmFsIHN5bWJvbHMgdW50aWwgd2UgaGF2ZQorICAgICAgICAgICAgIHdyaXR0ZW4gb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZvciBlYWNoIHNlY3Rpb24gaW4KKyAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUsIHdlIGtlZXAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFzaAorICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhCisgICAgICAgICAgICAgcmVsb2MuICBXaGVuIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgd2UKKyAgICAgICAgICAgICBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbgorICAgICAgICAgICAgIGZpeCB1cCB0aGUgc3ltYm9sIGluZGV4IGFmdGVyIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZQorICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuCisKKwkgICAgIEJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtLCB3ZSBhbHNvIGtlZXAgdGhlIHJlbG9jcyBpbgorCSAgICAgbWVtb3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIHdhc3RlcyBtZW1vcnksCisJICAgICBidXQgb25seSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdoaWNoIGlzIG5vdCB0aGUKKwkgICAgIGNvbW1vbiBjYXNlLiAgKi8KKwkgIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7CisJICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQorCSAgICAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQorCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKKwkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPQorCSAgICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKKwkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50CisJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9PSBOVUxMCisJICAgICAgfHwgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gbWF4X291dHB1dF9yZWxvY19jb3VudCkKKwkgICAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IG8tPnJlbG9jX2NvdW50OworCX0KKworICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bworCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KKyAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKKyAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7CisgICAgfQorCisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7CisKKyAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCisgICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQorICAgICBpbnB1dCBCRkQncy4gICovCisgIG1heF9zeW1fY291bnQgPSAwOworICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKKyAgICB7CisgICAgICBzaXplX3Qgc3o7CisKKyAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOworICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKKyAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCisJbWF4X3N5bV9jb3VudCA9IHN6OworICAgIH0KKworICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KKyAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQorCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKKwkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOworICBmaW5mby5zZWNfcHRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAorCQkJCQkgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgIGZpbmZvLnN5bV9pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOworICBmaW5mby5vdXRzeW1zID0gKChiZmRfYnl0ZSAqKQorCQkgICBiZmRfbWFsbG9jICgoc2l6ZV90KSAoKG1heF9zeW1fY291bnQgKyAxKSAqIHN5bWVzeikpKTsKKyAgZmluZm8ubGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfbGluZW5vX2NvdW50CisJCQkJICAgICAgICogYmZkX2NvZmZfbGluZXN6IChhYmZkKSk7CisgIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKKyAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudCAqIHJlbHN6KTsKKyAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCisJCQkgICAgIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudAorCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKKyAgaWYgKChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCisgICAgICB8fCAoZmluZm8uc2VjX3B0cnMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKKyAgICAgIHx8IChmaW5mby5zeW1faW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQorICAgICAgfHwgZmluZm8ub3V0c3ltcyA9PSBOVUxMCisgICAgICB8fCAoZmluZm8ubGluZW5vcyA9PSBOVUxMICYmIG1heF9saW5lbm9fY291bnQgPiAwKQorICAgICAgfHwgKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgPiAwKQorICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY19jb3VudCA+IDApCisgICAgICB8fCAoISBpbmZvLT5yZWxvY2F0ZWFibGUKKwkgICYmIGZpbmZvLmludGVybmFsX3JlbG9jcyA9PSBOVUxMCisJICAmJiBtYXhfcmVsb2NfY291bnQgPiAwKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKKyAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKKyAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZworICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKKyAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCisgIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IDA7CisKKyAgaWYgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspCisgICAgeworICAgICAgaWYgKCEgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwl7CisJICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgorCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCisJCSAgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpKQorCSAgICB7CisJICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKKyNpZmRlZiBQT1dFUlBDX0xFX1BFCisJICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuICYmICFwcGNfZG9fbGFzdChzdWIpKQorI2Vsc2UKKwkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4pCisjZW5kaWYKKwkJeworCQkgIGlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKKwkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCisJICAgIHsKKwkgICAgICBpZiAoISBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgJmZpbmZvLCBvLCBwKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisjaWZkZWYgUE9XRVJQQ19MRV9QRQorICB7CisgICAgYmZkKiBsYXN0X29uZSA9IHBwY19nZXRfbGFzdCgpOworICAgIGlmIChsYXN0X29uZSkKKyAgICAgIHsKKwlpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgbGFzdF9vbmUpKQorCSAgZ290byBlcnJvcl9yZXR1cm47CisgICAgICB9CisgICAgbGFzdF9vbmUtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOworICB9CisjZW5kaWYKKworICAvKiBGcmVlIHVwIHRoZSBidWZmZXJzIHVzZWQgYnkgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKworICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKKyAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gZmFsc2U7CisKKyAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKKyAgICAgIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLnNlY19wdHJzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uc2VjX3B0cnMpOworICAgICAgZmluZm8uc2VjX3B0cnMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOworICAgICAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKKyAgICAgIGZpbmZvLmxpbmVub3MgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uY29udGVudHMpOworICAgICAgZmluZm8uY29udGVudHMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7CisgICAgICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7CisgICAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOworICAgIH0KKworICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc3ltYm9sCisgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBleHRlcm5hbCBzeW1ib2wuICBXcml0ZSBpdCBvdXQgYWdhaW4gaWYKKyAgICAgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKGZpbmZvLmxhc3RfZmlsZV9pbmRleCAhPSAtMQorICAgICAgJiYgKHVuc2lnbmVkIGludCkgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgIT0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpKQorICAgIHsKKyAgICAgIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmZmluZm8ubGFzdF9maWxlLAorCQkJICAgICAoUFRSKSBmaW5mby5vdXRzeW1zKTsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKKwkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCisJCSAgICAgKyBmaW5mby5sYXN0X2ZpbGVfaW5kZXggKiBzeW1lc3opLAorCQkgICAgU0VFS19TRVQpICE9IDAKKwkgIHx8IGJmZF93cml0ZSAoZmluZm8ub3V0c3ltcywgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KKyAgZmluZm8uZmFpbGVkID0gZmFsc2U7CisgIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSwKKwkJCSAgIChQVFIpICZmaW5mbyk7CisgIGlmIChmaW5mby5mYWlsZWQpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogVGhlIG91dHN5bXMgYnVmZmVyIGlzIHVzZWQgYnkgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0uICAqLworICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOworICAgICAgZmluZm8ub3V0c3ltcyA9IE5VTEw7CisgICAgfQorCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgeworICAgICAgLyogTm93IHRoYXQgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlIGdsb2JhbCBzeW1ib2xzLCB3ZSBrbm93CisJIHRoZSBzeW1ib2wgaW5kaWNlcyB0byB1c2UgZm9yIHJlbG9jcyBhZ2FpbnN0IHRoZW0sIGFuZCB3ZSBjYW4KKwkgZmluYWxseSB3cml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCisgICAgICBleHRlcm5hbF9yZWxvY3MgPSAoKGJmZF9ieXRlICopCisJCQkgYmZkX21hbGxvYyAobWF4X291dHB1dF9yZWxvY19jb3VudCAqIHJlbHN6KSk7CisgICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorCXsKKwkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKKwkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGVuZDsKKwkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOworCSAgYmZkX2J5dGUgKmVyZWw7CisKKwkgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQorCSAgICBjb250aW51ZTsKKworCSAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKKwkgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7CisJICByZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXM7CisJICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOworCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyssIGVyZWwgKz0gcmVsc3opCisJICAgIHsKKwkgICAgICBpZiAoKnJlbF9oYXNoICE9IE5VTEwpCisJCXsKKwkJICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKKwkJICBpcmVsLT5yX3N5bW5keCA9ICgqcmVsX2hhc2gpLT5pbmR4OworCQl9CisJICAgICAgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIChQVFIpIGlyZWwsIChQVFIpIGVyZWwpOworCSAgICB9CisKKwkgIGlmIChiZmRfc2VlayAoYWJmZCwgby0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCisJICAgICAgfHwgYmZkX3dyaXRlICgoUFRSKSBleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBvLT5yZWxvY19jb3VudCwKKwkJCSAgICBhYmZkKSAhPSByZWxzeiAqIG8tPnJlbG9jX2NvdW50KQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKyAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7CisgICAgICBleHRlcm5hbF9yZWxvY3MgPSBOVUxMOworICAgIH0KKworICAvKiBGcmVlIHVwIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQorCXsKKwkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCisJICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCisJICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKKwl9CisgICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOworICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKKyAgICB9CisKKyAgLyogSWYgd2UgaGF2ZSBvcHRpbWl6ZWQgc3RhYnMgc3RyaW5ncywgb3V0cHV0IHRoZW0uICAqLworICBpZiAoY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgX2JmZF93cml0ZV9zdGFiX3N0cmluZ3MgKGFiZmQsICZjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUuICAqLworICBpZiAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICE9IDApCisgICAgeworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKKwkJICAgICArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCisJCSAgICBTRUVLX1NFVCkgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKKyAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwKKwkJICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAorCQkgICAgKGJmZF9ieXRlICopIHN0cmJ1Zik7CisjZWxzZQorICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCisjZW5kaWYKKworICAgICAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZmluZm8uc3RydGFiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7CisKKyAgLyogU2V0dGluZyBiZmRfZ2V0X3N5bWNvdW50IHRvIDAgd2lsbCBjYXVzZSB3cml0ZV9vYmplY3RfY29udGVudHMgdG8KKyAgICAgbm90IHRyeSB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLworICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQpCisgICAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7CisgIGlmIChmaW5mby5zdHJ0YWIgIT0gTlVMTCkKKyAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOworICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCisJeworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7CisJICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOworCX0KKyAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7CisgICAgfQorICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOworICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7CisgIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKKyAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKKyAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKKyAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoZmluZm8uY29udGVudHMpOworICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKKyAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7CisgIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOworICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKwwKKworLyogVGhlIHRyYW5zZmVyIHZlY3RvcnMgdGhhdCBsZWFkIHRoZSBvdXRzaWRlIHdvcmxkIHRvIGFsbCBvZiB0aGUgYWJvdmUuICovCisKKyNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQorY29uc3QgYmZkX3RhcmdldAorVEFSR0VUX0xJVFRMRV9TWU0gPQoreworICBUQVJHRVRfTElUVExFX05BTUUsCQkvKiBuYW1lIG9yIGNvZmYtYXJtLWxpdHRsZSAqLworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBGSVhNRTogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgCisjaWZuZGVmIENPRkZfV0lUSF9QRQorICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworI2Vsc2UKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCisgICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKKyNlbmRpZgorCisgIDAsCQkJCS8qIGxlYWRpbmcgY2hhciAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbj8/PyBGSVhNRW1nbyAqLworCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisgIAorICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgLyogX2JmZF9kdW1teV90YXJnZXQgKi8gY29mZl9vYmplY3RfcCB9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKyAgCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisgIAorICBDT0ZGX1NXQVBfVEFCTEUsCit9OworI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfQklHX1NZTQorY29uc3QgYmZkX3RhcmdldAorVEFSR0VUX0JJR19TWU0gPQoreworICBUQVJHRVRfQklHX05BTUUsCisgIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKKyAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBGSVhNRTogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKworI2lmbmRlZiBDT0ZGX1dJVEhfUEUKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyNlbHNlCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLworICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCisjZW5kaWYKKworICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KKworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCisKKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCisgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvY29mZi1yczYwMDAuYyBiL2JmZC9jb2ZmLXJzNjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGNkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi1yczYwMDAuYwpAQCAtMCwwICsxLDE0MTggQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/CisgICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAorICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0CisgICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgorICAgV3JpdHRlbiBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUsIAorICAgICBhbmQgSm9obiBHaWxtb3JlLgorICAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCisgICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24gYW5kIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEludGVybmFsY29mZi5oIGFuZCBjb2ZmY29kZS5oIG1vZGlmeSB0aGVtc2VsdmVzIGJhc2VkIG9uIHRoaXMgZmxhZy4gICovCisjZGVmaW5lIFJTNjAwMENPRkZfQyAxCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9yczYwMDAuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKKy8qIFRoZSBtYWluIGJvZHkgb2YgY29kZSBpcyBpbiBjb2ZmY29kZS5oLiAgKi8KKworc3RhdGljIGJvb2xlYW4geGNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgeGNvZmZfcnR5cGUyaG93dG8KKyAgUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqeGNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgUFRSIHhjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYmZkICp4Y29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgaW50IHhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOworc3RhdGljIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZV9maWxlbmFtZSBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfYXJtYXAKKyAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOworc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7CisMCisvKiBXZSB1c2Ugb3VyIG93biB0ZGF0YSB0eXBlLiAgSXRzIGZpcnN0IGZpZWxkIGlzIHRoZSBDT0ZGIHRkYXRhIHR5cGUsCisgICBzbyB0aGUgQ09GRiByb3V0aW5lcyBhcmUgY29tcGF0aWJsZS4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl9ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKKworICBhYmZkLT50ZGF0YS54Y29mZl9vYmpfZGF0YSA9CisgICAgKChzdHJ1Y3QgeGNvZmZfdGRhdGEgKikKKyAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfdGRhdGEpKSk7CisgIGlmIChhYmZkLT50ZGF0YS54Y29mZl9vYmpfZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgY29mZiA9IGNvZmZfZGF0YSAoYWJmZCk7CisgIGNvZmYtPnN5bWJvbHMgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOworICBjb2ZmLT5jb252ZXJzaW9uX3RhYmxlID0gKHVuc2lnbmVkIGludCAqKSBOVUxMOworICBjb2ZmLT5yYXdfc3ltZW50cyA9IChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopIE5VTEw7CisgIGNvZmYtPnJlbG9jYmFzZSA9IDA7CisKKyAgeGNvZmZfZGF0YSAoYWJmZCktPm1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOworCisgIC8qIFdlIHNldCBjcHV0eXBlIHRvIC0xIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIG5vdCBiZWVuCisgICAgIGluaXRpYWxpemVkLiAgKi8KKyAgeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgPSAtMTsKKworICB4Y29mZl9kYXRhIChhYmZkKS0+Y3NlY3RzID0gTlVMTDsKKyAgeGNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZGljZXMgPSBOVUxMOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBDb3B5IFhDT0ZGIGRhdGEgZnJvbSBvbmUgQkZEIHRvIGFub3RoZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQ7CisgICAgIGJmZCAqb2JmZDsKK3sKKyAgc3RydWN0IHhjb2ZmX3RkYXRhICppeCwgKm94OworICBhc2VjdGlvbiAqc2VjOworCisgIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCisgICAgcmV0dXJuIHRydWU7CisgIGl4ID0geGNvZmZfZGF0YSAoaWJmZCk7CisgIG94ID0geGNvZmZfZGF0YSAob2JmZCk7CisgIG94LT5mdWxsX2FvdXRoZHIgPSBpeC0+ZnVsbF9hb3V0aGRyOworICBveC0+dG9jID0gaXgtPnRvYzsKKyAgaWYgKGl4LT5zbnRvYyA9PSAwKQorICAgIG94LT5zbnRvYyA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbnRvYyk7CisgICAgICBpZiAoc2VjID09IE5VTEwpCisJb3gtPnNudG9jID0gMDsKKyAgICAgIGVsc2UKKwlveC0+c250b2MgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgfQorICBpZiAoaXgtPnNuZW50cnkgPT0gMCkKKyAgICBveC0+c25lbnRyeSA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbmVudHJ5KTsKKyAgICAgIGlmIChzZWMgPT0gTlVMTCkKKwlveC0+c25lbnRyeSA9IDA7CisgICAgICBlbHNlCisJb3gtPnNuZW50cnkgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgfQorICBveC0+dGV4dF9hbGlnbl9wb3dlciA9IGl4LT50ZXh0X2FsaWduX3Bvd2VyOworICBveC0+ZGF0YV9hbGlnbl9wb3dlciA9IGl4LT5kYXRhX2FsaWduX3Bvd2VyOworICBveC0+bW9kdHlwZSA9IGl4LT5tb2R0eXBlOworICBveC0+Y3B1dHlwZSA9IGl4LT5jcHV0eXBlOworICBveC0+bWF4ZGF0YSA9IGl4LT5tYXhkYXRhOworICBveC0+bWF4c3RhY2sgPSBpeC0+bWF4c3RhY2s7CisgIHJldHVybiB0cnVlOworfQorCisvKiBJIGRvbid0IHRoaW5rIFhDT0ZGIHJlYWxseSBoYXMgYSBub3Rpb24gb2YgbG9jYWwgbGFiZWxzIGJhc2VkIG9uCisgICBuYW1lLiAgVGhpcyB3aWxsIG1lYW4gdGhhdCBsZCAtWCBkb2Vzbid0IGFjdHVhbGx5IHN0cmlwIGFueXRoaW5nLgorICAgVGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMgbm90IGhhdmUgYSAtWCBvcHRpb24sIGFuZCBpdCBpZ25vcmVzIHRoZQorICAgLXggb3B0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3hjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIGZhbHNlOworfQorDAorLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCisgICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQorICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgorICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQorICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KK3sKKyAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KKyAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCisgIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCisgIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLworICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICB7IDcgfSwKKyAgCisgIC8qIE5vbiBtb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCisgIEhPV1RPICg4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9CQSIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIHsgOSB9LAorCisgIC8qIE5vbiBtb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCisgIEhPV1RPICgweGEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX0JSIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgeyAweGIgfSwKKworICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KKyAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBMb2FkIGFkZHJlc3MuICAqLworICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIHsgMHhlIH0sCisgIAorICAvKiBOb24tcmVsb2NhdGluZyByZWZlcmVuY2UuICAqLworICBIT1dUTyAoMHhmLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SRUYiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwgICAgIAkgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgeyAweDEwIH0sCisgIHsgMHgxMSB9LAorICAKKyAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLworICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KKyAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLworICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KKyAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLworICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLworICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCisgIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KKyAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLworICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLworICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCit9OworCitzdGF0aWMgdm9pZAoreGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCisgICAgIGFyZWxlbnQgKnJlbGVudDsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKK3sKKyAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKKworICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCisgICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCisgICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKKyAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLworICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKKyAgICBhYm9ydCAoKTsKKyNpZiAwCisgIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKKyAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKKyAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKKyAgICBhYm9ydCAoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCit4Y29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjI2OgorICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVsweGFdOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTI2OgorICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVs4XTsKKyAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6CisgICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzNdOworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CisgICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzBdOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykJCQkJCVwKKyAgewkJCQkJCQkJCVwKKyAgICBpbnRlcm5hbC5yX3R5cGUgPSBob3d0by0+dHlwZTsJCQkJCVwKKyAgICBpbnRlcm5hbC5yX3NpemUgPQkJCQkJCQlcCisgICAgICAoKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQJCVwKKwk/IDB4ODAJCQkJCQkJCVwKKwk6IDApCQkJCQkJCQlcCisgICAgICAgfCAoaG93dG8tPmJpdHNpemUgLSAxKSk7CQkJCQkJXAorICB9CisMCisjZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKKworI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCisKKyNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHhjb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKKworI2RlZmluZSBjb2ZmX21rb2JqZWN0IHhjb2ZmX21rb2JqZWN0CisjZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSB4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSB4Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCisKKyNpbmNsdWRlICJjb2ZmY29kZS5oIgorDAorLyogWENPRkYgYXJjaGl2ZSBzdXBwb3J0LiAgVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBjb2RlIHdhcyBieQorICAgRGFtb24gQS4gUGVybWV6ZWwuICBJdCB3YXMgZW5oYW5jZWQgdG8gcGVybWl0IGNyb3NzIHN1cHBvcnQsIGFuZAorICAgd3JpdGluZyBhcmNoaXZlIGZpbGVzLCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgWENPRkYgdXNlcyBpdHMgb3duIGFyY2hpdmUgZm9ybWF0LiAgRXZlcnl0aGluZyBpcyBob29rZWQgdG9nZXRoZXIKKyAgIHdpdGggZmlsZSBvZmZzZXQgbGlua3MsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHJhcGlkbHkgdXBkYXRlIGFuCisgICBhcmNoaXZlIGluIHBsYWNlLiAgT2YgY291cnNlLCB3ZSBkb24ndCBkbyB0aGF0LiAgQW4gWENPRkYgYXJjaGl2ZQorICAgaGFzIGEgcmVhbCBmaWxlIGhlYWRlciwgbm90IGp1c3QgYW4gQVJNQUcgc3RyaW5nLiAgVGhlIHN0cnVjdHVyZSBvZgorICAgdGhlIGZpbGUgaGVhZGVyIGFuZCBvZiBlYWNoIGFyY2hpdmUgaGVhZGVyIGFwcGVhciBiZWxvdy4KKworICAgQW4gWENPRkYgYXJjaGl2ZSBhbHNvIGhhcyBhIG1lbWJlciB0YWJsZSwgd2hpY2ggaXMgYSBsaXN0IG9mCisgICBlbGVtZW50cyBpbiB0aGUgYXJjaGl2ZSAoeW91IGNhbiBnZXQgdGhhdCBieSBsb29raW5nIHRocm91Z2ggdGhlCisgICBsaW5rZWQgbGlzdCwgYnV0IHlvdSBoYXZlIHRvIHJlYWQgYSBsb3QgbW9yZSBvZiB0aGUgZmlsZSkuICBUaGUKKyAgIG1lbWJlciB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIgd2l0aCBhbiBlbXB0eSBuYW1lLiAgSXQgaXMKKyAgIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKSB0aGUgc2Vjb25kIHRvIGxhc3QgZW50cnkgaW4gdGhlCisgICBhcmNoaXZlLiAgVGhlIG1lbWJlciB0YWJsZSBkYXRhIGlzIGFsbW9zdCBwcmludGFibGUgQVNDSUkuICBJdAorICAgc3RhcnRzIHdpdGggYSAxMiBjaGFyYWN0ZXIgZGVjaW1hbCBzdHJpbmcgd2hpY2ggaXMgdGhlIG51bWJlciBvZgorICAgZW50cmllcyBpbiB0aGUgdGFibGUuICBGb3IgZWFjaCBlbnRyeSBpdCBoYXMgYSAxMiBjaGFyYWN0ZXIgZGVjaW1hbAorICAgc3RyaW5nIHdoaWNoIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGFyY2hpdmUgb2YgdGhhdCBtZW1iZXIuICBUaGVzZQorICAgZW50cmllcyBhcmUgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3Mgd2hpY2gKKyAgIGFyZSB0aGUgbWVtYmVyIG5hbWVzIGZvciBlYWNoIGVudHJ5LgorCisgICBGaW5hbGx5LCBhbiBYQ09GRiBhcmNoaXZlIGhhcyBhIGdsb2JhbCBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIHdoYXQKKyAgIHdlIGNhbGwgdGhlIGFybWFwLiAgVGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgaGFzIGEgbm9ybWFsIGFyY2hpdmUKKyAgIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcyBub3JtYWxseSAoYW5kIHBlcmhhcHMgbXVzdCBiZSkKKyAgIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcmNoaXZlLiAgVGhlIGNvbnRlbnRzIHN0YXJ0IHdpdGggYSBmb3VyIGJ5dGUKKyAgIGJpbmFyeSBudW1iZXIgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgVGhpcyBpcyBmb2xsb3dlZCBieQorICAgYSB0aGF0IG1hbnkgZm91ciBieXRlIGJpbmFyeSBudW1iZXJzOyBlYWNoIGlzIHRoZSBmaWxlIG9mZnNldCBvZiBhbgorICAgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGVzZSBudW1iZXJzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZgorICAgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHdoaWNoIGFyZSBzeW1ib2wgbmFtZXMuICAqLworCisvKiBYQ09GRiBhcmNoaXZlcyB1c2UgdGhpcyBhcyBhIG1hZ2ljIHN0cmluZy4gICovCisKKyNkZWZpbmUgWENPRkZBUk1BRyAiPGFpYWZmPlwwMTIiCisjZGVmaW5lIFNYQ09GRkFSTUFHIDgKKworLyogVGhpcyB0ZXJtaW5hdGVzIGFuIFhDT0ZGIGFyY2hpdmUgbWVtYmVyIG5hbWUuICAqLworCisjZGVmaW5lIFhDT0ZGQVJGTUFHICJgXDAxMiIKKyNkZWZpbmUgU1hDT0ZGQVJGTUFHIDIKKworLyogWENPRkYgYXJjaGl2ZXMgc3RhcnQgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCB4Y29mZl9hcl9maWxlX2hkcgoreworICAvKiBNYWdpYyBzdHJpbmcuICAqLworICBjaGFyIG1hZ2ljW1NYQ09GRkFSTUFHXTsKKworICAvKiBPZmZzZXQgb2YgdGhlIG1lbWJlciB0YWJsZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KKyAgY2hhciBtZW1vZmZbMTJdOworCisgIC8qIE9mZnNldCBvZiB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KKyAgY2hhciBzeW1vZmZbMTJdOworCisgIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgbWVtYmVyIGluIHRoZSBhcmNoaXZlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLworICBjaGFyIGZpcnN0bWVtb2ZmWzEyXTsKKworICAvKiBPZmZzZXQgb2YgdGhlIGxhc3QgbWVtYmVyIGluIHRoZSBhcmNoaXZlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLworICBjaGFyIGxhc3RtZW1vZmZbMTJdOworCisgIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgbWVtYmVyIG9uIHRoZSBmcmVlIGxpc3QgKGRlY2ltYWwgQVNDSUkKKyAgICAgc3RyaW5nKS4gICovCisgIGNoYXIgZnJlZW9mZlsxMl07Cit9OworCisjZGVmaW5lIFNJWkVPRl9BUl9GSUxFX0hEUiAoNSAqIDEyICsgU1hDT0ZGQVJNQUcpCisKKy8qIEVhY2ggWENPRkYgYXJjaGl2ZSBtZW1iZXIgc3RhcnRzIHdpdGggdGhpcyAocHJpbnRhYmxlKSBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgeGNvZmZfYXJfaGRyCit7CisgIC8qIEZpbGUgc2l6ZSBub3QgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCisgIGNoYXIgc2l6ZVsxMl07CisKKyAgLyogRmlsZSBvZmZzZXQgb2YgbmV4dCBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KKyAgY2hhciBuZXh0b2ZmWzEyXTsKKworICAvKiBGaWxlIG9mZnNldCBvZiBwcmV2aW91cyBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KKyAgY2hhciBwcmV2b2ZmWzEyXTsKKworICAvKiBGaWxlIG10aW1lIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLworICBjaGFyIGRhdGVbMTJdOworCisgIC8qIEZpbGUgVUlEIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLworICBjaGFyIHVpZFsxMl07CisKKyAgLyogRmlsZSBHSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCisgIGNoYXIgZ2lkWzEyXTsKKworICAvKiBGaWxlIG1vZGUgKG9jdGFsIEFTQ0lJIHN0cmluZykuICAqLworICBjaGFyIG1vZGVbMTJdOworCisgIC8qIExlbmd0aCBvZiBmaWxlIG5hbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCisgIGNoYXIgbmFtbGVuWzRdOworCisgIC8qIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIG5hbWUuICBUaGUgbGVuZ3RoIG9mIHRoZQorICAgICBuYW1lIGlzIGdpdmVuIGluIHRoZSBuYW1sZW4gZmllbGQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzCisgICAgIG9kZCwgdGhlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBUaGUgbmFtZSBhbmQgb3B0aW9uYWwKKyAgICAgbnVsbCBieXRlIGFyZSBmb2xsb3dlZCBieSBYQ09GRkFSRk1BRywgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluCisgICAgIG5hbWxlbi4gIFRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIgZm9sbG93OyB0aGUgbnVtYmVyIG9mCisgICAgIGJ5dGVzIGlzIGdpdmVuIGluIHRoZSBzaXplIGZpZWxkLiAgKi8KK307CisKKyNkZWZpbmUgU0laRU9GX0FSX0hEUiAoNyAqIDEyICsgNCkKKworLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9maWxlX2hkciBpbiB0aGUgdGRhdGEgZmllbGQgb2YgdGhlCisgICBhcnRkYXRhIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIHhjb2ZmX2FyZGF0YShhYmZkKSBcCisgICgoc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyICopIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSkKKworLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9oZHIgaW4gdGhlIGFyZWx0X2RhdGEgZmllbGQgb2YgYW4KKyAgIGFyY2hpdmUgZWxlbWVudC4gICovCisjZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSAoKGJmZCktPmFyZWx0X2RhdGEpKQorI2RlZmluZSBhcmNoX3hoZHIoYmZkKSBcCisgICgoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBhcmNoX2VsdGRhdGEgKGJmZCktPmFyY2hfaGVhZGVyKQorCisvKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhbnl0aGluZyB3aGljaCBjb3JyZXNwb25kcyB0byBhbgorICAgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCisKKyNkZWZpbmUgeGNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKKyNkZWZpbmUgeGNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAorICAgYmZkX2ZhbHNlKQorI2RlZmluZSB4Y29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCisKKy8qIFdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIGdldF9lbHRfYXRfaW5kZXggcm91dGluZS4gICovCisKKyNkZWZpbmUgeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAorCisvKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhIHRpbWVzdGFtcC4gICovCisKKyNkZWZpbmUgeGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQorCisvKiBSZWFkIGluIHRoZSBhcm1hcCBvZiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3hjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGZpbGVfcHRyIG9mZjsKKyAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7CisgIHNpemVfdCBuYW1sZW47CisgIGJmZF9zaXplX3R5cGUgc3o7CisgIGJmZF9ieXRlICpjb250ZW50cywgKmNlbmQ7CisgIHVuc2lnbmVkIGludCBjLCBpOworICBjYXJzeW0gKmFyc3ltOworICBiZmRfYnl0ZSAqcDsKKworICBpZiAoeGNvZmZfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIG9mZiA9IHN0cnRvbCAoeGNvZmZfYXJkYXRhIChhYmZkKS0+c3ltb2ZmLCAoY2hhciAqKikgTlVMTCwgMTApOworICBpZiAob2ZmID09IDApCisgICAgeworICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgbm9ybWFsIGFyY2hpdmUgaGVhZGVyLiAgKi8KKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBTa2lwIHRoZSBuYW1lIChub3JtYWxseSBlbXB0eSkuICAqLworICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7CisgIGlmIChiZmRfc2VlayAoYWJmZCwgKChuYW1sZW4gKyAxKSAmIH4xKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFJlYWQgaW4gdGhlIGVudGlyZSBzeW1ib2wgdGFibGUuICAqLworICBzeiA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7CisgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3opOworICBpZiAoY29udGVudHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIHN6LCBhYmZkKSAhPSBzeikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIHN5bWJvbCB0YWJsZSBzdGFydHMgd2l0aCBhIGZvdXIgYnl0ZSBjb3VudC4gICovCisgIGMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzKTsKKworICBpZiAoYyAqIDQgPj0gc3opCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gKChjYXJzeW0gKikKKwkJCQliZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKGNhcnN5bSkpKTsKKyAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEFmdGVyIHRoZSBjb3VudCBjb21lcyBhIGxpc3Qgb2YgZm91ciBieXRlIGZpbGUgb2Zmc2V0cy4gICovCisgIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMsIHAgPSBjb250ZW50cyArIDQ7CisgICAgICAgaSA8IGM7CisgICAgICAgKytpLCArK2Fyc3ltLCBwICs9IDQpCisgICAgYXJzeW0tPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKKworICAvKiBBZnRlciB0aGUgZmlsZSBvZmZzZXRzIGNvbWUgbnVsbCB0ZXJtaW5hdGVkIHN5bWJvbCBuYW1lcy4gICovCisgIGNlbmQgPSBjb250ZW50cyArIHN6OworICBmb3IgKGkgPSAwLCBhcnN5bSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOworICAgICAgIGkgPCBjOworICAgICAgICsraSwgKythcnN5bSwgcCArPSBzdHJsZW4gKChjaGFyICopIHApICsgMSkKKyAgICB7CisgICAgICBpZiAocCA+PSBjZW5kKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGFyc3ltLT5uYW1lID0gKGNoYXIgKikgcDsKKyAgICB9CisKKyAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCA9IGM7CisgIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNlZSBpZiB0aGlzIGlzIGFuIFhDT0ZGIGFyY2hpdmUuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCit4Y29mZl9hcmNoaXZlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGhkcjsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkKKyAgICAgICE9IFNJWkVPRl9BUl9GSUxFX0hEUikKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKHN0cm5jbXAgKGhkci5tYWdpYywgWENPRkZBUk1BRywgU1hDT0ZGQVJNQUcpICE9IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQorICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKKyAgICAgYXNzaWdubWVudC4gICovCisgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9CisgICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKKworICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IHN0cnRvbCAoaGRyLmZpcnN0bWVtb2ZmLAorCQkJCQkJICAoY2hhciAqKikgTlVMTCwgMTApOworICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKKyAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOworCisgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUik7CisgIGlmIChiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBtZW1jcHkgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSwgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSKTsKKworICBpZiAoISB4Y29mZl9zbHVycF9hcm1hcCAoYWJmZCkpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKKyAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IChzdHJ1Y3QgYXJ0ZGF0YSAqKSBOVUxMOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCisvKiBSZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KKworc3RhdGljIFBUUgoreGNvZmZfcmVhZF9hcl9oZHIgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7CisgIHNpemVfdCBuYW1sZW47CisgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7CisgIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOworICBoZHJwID0gKHN0cnVjdCB4Y29mZl9hcl9oZHIgKikgYmZkX2FsbG9jIChhYmZkLCBTSVpFT0ZfQVJfSERSICsgbmFtbGVuICsgMSk7CisgIGlmIChoZHJwID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIG1lbWNweSAoaGRycCwgJmhkciwgU0laRU9GX0FSX0hEUik7CisgIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFIsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuKQorICAgIHJldHVybiBOVUxMOworICAoKGNoYXIgKikgaGRycClbU0laRU9GX0FSX0hEUiArIG5hbWxlbl0gPSAnXDAnOworCisgIHJldCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0LT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcnA7CisgIHJldC0+cGFyc2VkX3NpemUgPSBzdHJ0b2wgKGhkci5zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOworICByZXQtPmZpbGVuYW1lID0gKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFI7CisKKyAgLyogU2tpcCBvdmVyIHRoZSBYQ09GRkFSRk1BRyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUuICAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChuYW1sZW4gJiAxKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIChQVFIpIHJldDsKK30KKworLyogT3BlbiB0aGUgbmV4dCBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLworCitzdGF0aWMgYmZkICoKK3hjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQorICAgICBiZmQgKmFyY2hpdmU7CisgICAgIGJmZCAqbGFzdF9maWxlOworeworICBmaWxlX3B0ciBmaWxlc3RhcnQ7CisKKyAgaWYgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKKyAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOworICBlbHNlCisgICAgZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHIgKGxhc3RfZmlsZSktPm5leHRvZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7CisKKyAgaWYgKGZpbGVzdGFydCA9PSAwCisgICAgICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5tZW1vZmYsCisJCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApCisgICAgICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5zeW1vZmYsCisJCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVzdGFydCk7Cit9CisKKy8qIFN0YXQgYW4gZWxlbWVudCBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KKworc3RhdGljIGludAoreGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBzdGF0ICpzOworeworICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICpoZHJwOworCisgIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaGRycCA9IGFyY2hfeGhkciAoYWJmZCk7CisKKyAgcy0+c3RfbXRpbWUgPSBzdHJ0b2wgKGhkcnAtPmRhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7CisgIHMtPnN0X3VpZCA9IHN0cnRvbCAoaGRycC0+dWlkLCAoY2hhciAqKikgTlVMTCwgMTApOworICBzLT5zdF9naWQgPSBzdHJ0b2wgKGhkcnAtPmdpZCwgKGNoYXIgKiopIE5VTEwsIDEwKTsKKyAgcy0+c3RfbW9kZSA9IHN0cnRvbCAoaGRycC0+bW9kZSwgKGNoYXIgKiopIE5VTEwsIDgpOworICBzLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIE5vcm1hbGl6ZSBhIGZpbGUgbmFtZSBmb3IgaW5jbHVzaW9uIGluIGFuIGFyY2hpdmUuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitub3JtYWxpemVfZmlsZW5hbWUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY29uc3QgY2hhciAqZmlsZTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisKKyAgZmlsZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOworICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7CisgIGlmIChmaWxlbmFtZSAhPSBOVUxMKQorICAgIGZpbGVuYW1lKys7CisgIGVsc2UKKyAgICBmaWxlbmFtZSA9IGZpbGU7CisgIHJldHVybiBmaWxlbmFtZTsKK30KKworLyogV3JpdGUgb3V0IGFuIFhDT0ZGIGFybWFwLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfd3JpdGVfYXJtYXAgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7CisgICAgIHN0cnVjdCBvcmwgKm1hcDsKKyAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKKyAgICAgaW50IHN0cmlkeDsKK3sKKyAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7CisgIGNoYXIgKnA7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICBiZmQgKnN1YjsKKyAgZmlsZV9wdHIgZmlsZW9mZjsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgbWVtc2V0ICgmaGRyLCAwLCBzaXplb2YgaGRyKTsKKyAgc3ByaW50ZiAoaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDQgKyBvcmxfY291bnQgKiA0ICsgc3RyaWR4KSk7CisgIHNwcmludGYgKGhkci5uZXh0b2ZmLCAiJWQiLCAwKTsKKyAgbWVtY3B5IChoZHIucHJldm9mZiwgeGNvZmZfYXJkYXRhIChhYmZkKS0+bWVtb2ZmLCAxMik7CisgIHNwcmludGYgKGhkci5kYXRlLCAiJWQiLCAwKTsKKyAgc3ByaW50ZiAoaGRyLnVpZCwgIiVkIiwgMCk7CisgIHNwcmludGYgKGhkci5naWQsICIlZCIsIDApOworICBzcHJpbnRmIChoZHIubW9kZSwgIiVkIiwgMCk7CisgIHNwcmludGYgKGhkci5uYW1sZW4sICIlZCIsIDApOworCisgIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCisgIGZvciAocCA9IChjaGFyICopICZoZHI7IHAgPCAoY2hhciAqKSAmaGRyICsgU0laRU9GX0FSX0hEUjsgcCsrKQorICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgKnAgPSAnICc7CisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgorICAgICAgfHwgYmZkX3dyaXRlIChYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKSAhPSBTWENPRkZBUkZNQUcpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBvcmxfY291bnQsIGJ1Zik7CisgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOworICBmaWxlb2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOworICBpID0gMDsKKyAgd2hpbGUgKHN1YiAhPSBOVUxMICYmIGkgPCBvcmxfY291bnQpCisgICAgeworICAgICAgc2l6ZV90IG5hbWxlbjsKKworICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbaV0pLnBvcykgPT0gc3ViKQorCXsKKwkgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZmlsZW9mZiwgYnVmKTsKKwkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgKytpOworCX0KKyAgICAgIG5hbWxlbiA9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKTsKKyAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOworICAgICAgZmlsZW9mZiArPSAoU0laRU9GX0FSX0hEUgorCQkgICsgbmFtbGVuCisJCSAgKyBTWENPRkZBUkZNQUcKKwkJICArIGFyZWx0X3NpemUgKHN1YikpOworICAgICAgZmlsZW9mZiA9IChmaWxlb2ZmICsgMSkgJn4gMTsKKyAgICAgIHN1YiA9IHN1Yi0+bmV4dDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG9ybF9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBzaXplX3QgbmFtbGVuOworCisgICAgICBuYW1lID0gKm1hcFtpXS5uYW1lOworICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKKyAgICAgIGlmIChiZmRfd3JpdGUgKG5hbWUsIDEsIG5hbWxlbiArIDEsIGFiZmQpICE9IG5hbWxlbiArIDEpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoKHN0cmlkeCAmIDEpICE9IDApCisgICAgeworICAgICAgY2hhciBiOworCisgICAgICBiID0gJ1wwJzsKKyAgICAgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCBhbiBYQ09GRiBhcmNoaXZlLiAgV2UgYWx3YXlzIHdyaXRlIGFuIGVudGlyZSBhcmNoaXZlLAorICAgcmF0aGVyIHRoYW4gZnVzc2luZyB3aXRoIHRoZSBmcmVlbGlzdCBhbmQgc28gZm9ydGguICAqLworCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgZmhkcjsKKyAgc2l6ZV90IGNvdW50OworICBzaXplX3QgdG90YWxfbmFtbGVuOworICBmaWxlX3B0ciAqb2Zmc2V0czsKKyAgYm9vbGVhbiBtYWtlbWFwOworICBib29sZWFuIGhhc29iamVjdHM7CisgIGZpbGVfcHRyIHByZXZvZmYsIG5leHRvZmY7CisgIGJmZCAqc3ViOworICB1bnNpZ25lZCBpbnQgaTsKKyAgc3RydWN0IHhjb2ZmX2FyX2hkciBhaGRyOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIGNoYXIgKnA7CisgIGNoYXIgZGVjYnVmWzEzXTsKKworICBtZW1zZXQgKCZmaGRyLCAwLCBzaXplb2YgZmhkcik7CisgIHN0cm5jcHkgKGZoZHIubWFnaWMsIFhDT0ZGQVJNQUcsIFNYQ09GRkFSTUFHKTsKKyAgc3ByaW50ZiAoZmhkci5maXJzdG1lbW9mZiwgIiVkIiwgU0laRU9GX0FSX0ZJTEVfSERSKTsKKyAgc3ByaW50ZiAoZmhkci5mcmVlb2ZmLCAiJWQiLCAwKTsKKworICBjb3VudCA9IDA7CisgIHRvdGFsX25hbWxlbiA9IDA7CisgIGZvciAoc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0KQorICAgIHsKKyAgICAgICsrY291bnQ7CisgICAgICB0b3RhbF9uYW1sZW4gKz0gc3RybGVuIChub3JtYWxpemVfZmlsZW5hbWUgKHN1YikpICsgMTsKKyAgICB9CisgIG9mZnNldHMgPSAoZmlsZV9wdHIgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoZmlsZV9wdHIpKTsKKyAgaWYgKG9mZnNldHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBTSVpFT0ZfQVJfRklMRV9IRFIsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFiZmQpOworICBoYXNvYmplY3RzID0gZmFsc2U7CisgIHByZXZvZmYgPSAwOworICBuZXh0b2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOworICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZCwgaSA9IDA7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQsIGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgc2l6ZV90IG5hbWxlbjsKKyAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmFoZHJwOworICAgICAgYmZkX3NpemVfdHlwZSByZW1haW5pbmc7CisKKyAgICAgIGlmIChtYWtlbWFwICYmICEgaGFzb2JqZWN0cykKKwl7CisJICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoc3ViLCBiZmRfb2JqZWN0KSkKKwkgICAgaGFzb2JqZWN0cyA9IHRydWU7CisJfQorCisgICAgICBuYW1lID0gbm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpOworICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKKworICAgICAgaWYgKHN1Yi0+YXJlbHRfZGF0YSAhPSBOVUxMKQorCWFoZHJwID0gYXJjaF94aGRyIChzdWIpOworICAgICAgZWxzZQorCWFoZHJwID0gTlVMTDsKKworICAgICAgaWYgKGFoZHJwID09IE5VTEwpCisJeworCSAgc3RydWN0IHN0YXQgczsKKworCSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOworCSAgYWhkcnAgPSAmYWhkcjsKKwkgIGlmIChzdGF0IChiZmRfZ2V0X2ZpbGVuYW1lIChzdWIpLCAmcykgIT0gMCkKKwkgICAgeworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIHNwcmludGYgKGFoZHJwLT5zaXplLCAiJWxkIiwgKGxvbmcpIHMuc3Rfc2l6ZSk7CisJICBzcHJpbnRmIChhaGRycC0+ZGF0ZSwgIiVsZCIsIChsb25nKSBzLnN0X210aW1lKTsKKwkgIHNwcmludGYgKGFoZHJwLT51aWQsICIlbGQiLCAobG9uZykgcy5zdF91aWQpOworCSAgc3ByaW50ZiAoYWhkcnAtPmdpZCwgIiVsZCIsIChsb25nKSBzLnN0X2dpZCk7CisJICBzcHJpbnRmIChhaGRycC0+bW9kZSwgIiVvIiwgKHVuc2lnbmVkIGludCkgcy5zdF9tb2RlKTsKKworCSAgaWYgKHN1Yi0+YXJlbHRfZGF0YSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc3ViLT5hcmVsdF9kYXRhID0gYmZkX2FsbG9jIChzdWIsIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOworCSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGFyY2hfZWx0ZGF0YSAoc3ViKS0+cGFyc2VkX3NpemUgPSBzLnN0X3NpemU7CisJfQorCisgICAgICBzcHJpbnRmIChhaGRycC0+cHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKKyAgICAgIHNwcmludGYgKGFoZHJwLT5uYW1sZW4sICIlbGQiLCAobG9uZykgbmFtbGVuKTsKKworICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyBvZGQsIHdlIHdyaXRlIG91dCB0aGUgbnVsbCBieXRlCisgICAgICAgICBhZnRlciB0aGUgbmFtZSBhcyB3ZWxsLiAgKi8KKyAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOworCisgICAgICByZW1haW5pbmcgPSBhcmVsdF9zaXplIChzdWIpOworICAgICAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCisJICAgICAgKyBuYW1sZW4KKwkgICAgICArIFNYQ09GRkFSRk1BRworCSAgICAgICsgcmVtYWluaW5nKTsKKworICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOworCisgICAgICBvZmZzZXRzW2ldID0gbmV4dG9mZjsKKworICAgICAgcHJldm9mZiA9IG5leHRvZmY7CisgICAgICBuZXh0b2ZmICs9IHNpemUgKyAoc2l6ZSAmIDEpOworCisgICAgICBzcHJpbnRmIChhaGRycC0+bmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKKworICAgICAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KKyAgICAgIGZvciAocCA9IChjaGFyICopIGFoZHJwOyBwIDwgKGNoYXIgKikgYWhkcnAgKyBTSVpFT0ZfQVJfSERSOyBwKyspCisJaWYgKCpwID09ICdcMCcpCisJICAqcCA9ICcgJzsKKworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYWhkcnAsIDEsIFNJWkVPRl9BUl9IRFIsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKKwkgIHx8IGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4KKwkgIHx8IChiZmRfd3JpdGUgKChQVFIpIFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpCisJICAgICAgIT0gU1hDT0ZGQVJGTUFHKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfc2VlayAoc3ViLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCkKKwl7CisJICBiZmRfc2l6ZV90eXBlIGFtdDsKKwkgIGJmZF9ieXRlIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOworCisJICBhbXQgPSBzaXplb2YgYnVmZmVyOworCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKKwkgICAgYW10ID0gcmVtYWluaW5nOworCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIDEsIGFtdCwgc3ViKSAhPSBhbXQKKwkgICAgICB8fCBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgYW10LCBhYmZkKSAhPSBhbXQpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHJlbWFpbmluZyAtPSBhbXQ7CisJfQorCisgICAgICBpZiAoKHNpemUgJiAxKSAhPSAwKQorCXsKKwkgIGJmZF9ieXRlIGI7CisKKwkgIGIgPSAnXDAnOworCSAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHNwcmludGYgKGZoZHIubGFzdG1lbW9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIG1lbWJlciB0YWJsZS4gICovCisKKyAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOworICBzcHJpbnRmIChmaGRyLm1lbW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKKworICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7CisgIHNwcmludGYgKGFoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoMTIgKyBjb3VudCAqIDEyICsgdG90YWxfbmFtbGVuKSk7CisgIHNwcmludGYgKGFoZHIucHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKKyAgc3ByaW50ZiAoYWhkci5kYXRlLCAiJWQiLCAwKTsKKyAgc3ByaW50ZiAoYWhkci51aWQsICIlZCIsIDApOworICBzcHJpbnRmIChhaGRyLmdpZCwgIiVkIiwgMCk7CisgIHNwcmludGYgKGFoZHIubW9kZSwgIiVkIiwgMCk7CisgIHNwcmludGYgKGFoZHIubmFtbGVuLCAiJWQiLCAwKTsKKworICBzaXplID0gKFNJWkVPRl9BUl9IRFIKKwkgICsgMTIKKwkgICsgY291bnQgKiAxMgorCSAgKyB0b3RhbF9uYW1sZW4KKwkgICsgU1hDT0ZGQVJGTUFHKTsKKworICBwcmV2b2ZmID0gbmV4dG9mZjsKKyAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKKworICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQorICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKKyAgZWxzZQorICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVkIiwgMCk7CisKKyAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KKyAgZm9yIChwID0gKGNoYXIgKikgJmFoZHI7IHAgPCAoY2hhciAqKSAmYWhkciArIFNJWkVPRl9BUl9IRFI7IHArKykKKyAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICpwID0gJyAnOworCisgIGlmIChiZmRfd3JpdGUgKChQVFIpICZhaGRyLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCisgICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQorCSAgIT0gU1hDT0ZGQVJGTUFHKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIGNvdW50KTsKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCisgICAgcmV0dXJuIGZhbHNlOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBzcHJpbnRmIChkZWNidWYsICIlLTEybGQiLCAobG9uZykgb2Zmc2V0c1tpXSk7CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWNidWYsIDEsIDEyLCBhYmZkKSAhPSAxMikKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgc2l6ZV90IG5hbWxlbjsKKworICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKKyAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmICgoc2l6ZSAmIDEpICE9IDApCisgICAgeworICAgICAgYmZkX2J5dGUgYjsKKworICAgICAgYiA9ICdcMCc7CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYiwgMSwgMSwgYWJmZCkgIT0gMSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFdyaXRlIG91dCB0aGUgYXJtYXAsIGlmIGFwcHJvcHJpYXRlLiAgKi8KKworICBpZiAoISBtYWtlbWFwIHx8ICEgaGFzb2JqZWN0cykKKyAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVkIiwgMCk7CisgIGVsc2UKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7CisgICAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKKyAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IChQVFIpICZmaGRyOworICAgICAgaWYgKCEgX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYWJmZCwgMCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIGFyY2hpdmUgZmlsZSBoZWFkZXIuICAqLworCisgIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCisgIGZvciAocCA9IChjaGFyICopICZmaGRyOyBwIDwgKGNoYXIgKikgJmZoZHIgKyBTSVpFT0ZfQVJfRklMRV9IRFI7IHArKykKKyAgICBpZiAoKnAgPT0gJ1wwJykKKyAgICAgICpwID0gJyAnOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJmZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkgIT0KKwkgIFNJWkVPRl9BUl9GSUxFX0hEUikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogV2UgY2FuJ3QgdXNlIHRoZSB1c3VhbCBjb2ZmX3NpemVvZl9oZWFkZXJzIHJvdXRpbmUsIGJlY2F1c2UgQUlYCisgICBhbHdheXMgdXNlcyBhbiBhLm91dCBoZWFkZXIuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBpbnQKK19iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gcmVsb2M7Cit7CisgIGludCBzaXplOworCisgIHNpemUgPSBGSUxIU1o7CisgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQorICAgIHNpemUgKz0gQU9VVFNaOworICBlbHNlCisgICAgc2l6ZSArPSBTTUFMTF9BT1VUU1o7CisgIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKKyAgcmV0dXJuIHNpemU7Cit9CisMCisjZGVmaW5lIENPUkVfRklMRV9QIF9iZmRfZHVtbXlfdGFyZ2V0CisKKyNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKyNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCisjZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKKyAgX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisKKyNpZmRlZiBBSVhfQ09SRQorI3VuZGVmIENPUkVfRklMRV9QCisjZGVmaW5lIENPUkVfRklMRV9QIHJzNjAwMGNvZmZfY29yZV9wCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIHJzNjAwMGNvZmZfY29yZV9wICgpOworZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoKTsKK2V4dGVybiBib29sZWFuIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOworCisjdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIFwKKwkJCQkgICAgIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisKK2V4dGVybiBjaGFyICpyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7CisjdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCisjZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKworZXh0ZXJuIGludCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKyN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorCisjdW5kZWYJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKKyNlbmRpZiAvKiBBSVhfQ09SRSAqLworCisjaWZkZWYgTFlOWF9DT1JFCisKKyN1bmRlZiBDT1JFX0ZJTEVfUAorI2RlZmluZSBDT1JFX0ZJTEVfUCBseW54X2NvcmVfZmlsZV9wCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworZXh0ZXJuIGJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwKKwkJCQkJCQkgICAgYmZkICpleGVjX2JmZCkpOworI3VuZGVmCWNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisjZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisKK2V4dGVybiBjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7CisjdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCisjZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKworZXh0ZXJuIGludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKyN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorCisjZW5kaWYgLyogTFlOWF9DT1JFICovCisKKyNkZWZpbmUgX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gY29mZl9iZmRfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nY19zZWN0aW9ucyBjb2ZmX2JmZF9nY19zZWN0aW9ucworI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCisKKy8qIFRoZSB0cmFuc2ZlciB2ZWN0b3IgdGhhdCBsZWFkcyB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLworCitjb25zdCBiZmRfdGFyZ2V0CisjaWZkZWYgVEFSR0VUX1NZTQorICBUQVJHRVRfU1lNID0KKyNlbHNlCisgIHJzNjAwMGNvZmZfdmVjID0KKyNlbmRpZgoreworI2lmZGVmIFRBUkdFVF9OQU1FCisgIFRBUkdFVF9OQU1FLAorI2Vsc2UKKyAgImFpeGNvZmYtcnM2MDAwIiwJCS8qIG5hbWUgKi8KKyNlbmRpZgorICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLworICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KKworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKworICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIHhjb2ZmX2FyY2hpdmVfcCwgQ09SRV9GSUxFX1B9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHhjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAorCisgIENPRkZfU1dBUF9UQUJMRSwKK307CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zaC5jIGIvYmZkL2NvZmYtc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Q2ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtc2guYwpAQCAtMCwwICsxLDI5NTkgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSGl0YWNoaSBTdXBlci1IIENPRkYgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCisgICBSZWxheGluZyBjb2RlIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgPGlhbkBjeWdudXMuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImNvZmYvc2guaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMuICAqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBsb25nIGdldF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoYXN5bWJvbCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzaF9tZXJnZV9wcml2YXRlX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzaF9yZWxheF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgaW50KSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqc2hfaW5zbl9pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworc3RhdGljIGJvb2xlYW4gc2hfYWxpZ25fbG9hZHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHNoX3N3YXBfaW5zbnMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gc2hfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisJICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyBiZmRfYnl0ZSAqc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAorCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKKworLyogRGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCB0byAyKio0LiAgKi8KKyNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICg0KQorCisvKiBHZW5lcmF0ZSBsb25nIGZpbGUgbmFtZXMuICAqLworI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCisKKy8qIFRoZSBzdXBwb3J0ZWQgcmVsb2NhdGlvbnMuICBUaGVyZSBhcmUgYSBsb3Qgb2YgcmVsb2NhdGlvbnMgZGVmaW5lZAorICAgaW4gY29mZi9pbnRlcm5hbC5oIHdoaWNoIHdlIGRvIG5vdCBleHBlY3QgdG8gZXZlciBzZWUuICAqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfY29mZl9ob3d0b3NbXSA9Cit7CisgIHsgMCB9LAorICB7IDEgfSwKKyAgeyAyIH0sCisgIHsgMyB9LCAvKiBSX1NIX1BDUkVMOCAqLworICB7IDQgfSwgLyogUl9TSF9QQ1JFTDE2ICovCisgIHsgNSB9LCAvKiBSX1NIX0hJR0g4ICovCisgIHsgNiB9LCAvKiBSX1NIX0lNTTI0ICovCisgIHsgNyB9LCAvKiBSX1NIX0xPVzE2ICovCisgIHsgOCB9LAorICB7IDkgfSwgLyogUl9TSF9QQ0RJU1A4Qlk0ICovCisKKyAgSE9XVE8gKFJfU0hfUENESVNQOEJZMiwJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfcGNkaXNwOGJ5MiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIHsgMTEgfSwgLyogUl9TSF9QQ0RJU1A4ICovCisKKyAgSE9XVE8gKFJfU0hfUENESVNQLAkJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJyX3BjZGlzcDEyYnkyIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICB7IDEzIH0sCisKKyAgSE9XVE8gKFJfU0hfSU1NMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfaW1tMzIiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIHsgMTUgfSwKKyAgeyAxNiB9LCAvKiBSX1NIX0lNTTggKi8KKyAgeyAxNyB9LCAvKiBSX1NIX0lNTThCWTIgKi8KKyAgeyAxOCB9LCAvKiBSX1NIX0lNTThCWTQgKi8KKyAgeyAxOSB9LCAvKiBSX1NIX0lNTTQgKi8KKyAgeyAyMCB9LCAvKiBSX1NIX0lNTTRCWTIgKi8KKyAgeyAyMSB9LCAvKiBSX1NIX0lNTTRCWTQgKi8KKworICBIT1dUTyAoUl9TSF9QQ1JFTElNTThCWTIsCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfcGNyZWxpbW04YnkyIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfU0hfUENSRUxJTU04Qlk0LAkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJyX3BjcmVsaW1tOGJ5NCIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1NIX0lNTTE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJyX2ltbTE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfU0hfU1dJVENIMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfc3dpdGNoMTYiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAicl9zd2l0Y2gzMiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfU0hfVVNFUywJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAicl91c2VzIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfY291bnQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1NIX0FMSUdOLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJyX2FsaWduIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJyX2NvZGUiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfZGF0YSIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgInJfbGFiZWwiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1NIX1NXSVRDSDgsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAicl9zd2l0Y2g4IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLworfTsKKworI2RlZmluZSBTSF9DT0ZGX0hPV1RPX0NPVU5UIChzaXplb2Ygc2hfY29mZl9ob3d0b3MgLyBzaXplb2Ygc2hfY29mZl9ob3d0b3NbMF0pCisKKy8qIENoZWNrIGZvciBhIGJhZCBtYWdpYyBudW1iZXIuICAqLworI2RlZmluZSBCQURNQUcoeCkgU0hCQURNQUcoeCkKKworLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKHRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkKS4gICovCisjZGVmaW5lIFNIIDEKKworLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZS4gICovCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworCisvKiBTd2FwIHRoZSByX29mZnNldCBmaWVsZCBpbiBhbmQgb3V0LiAgKi8KKyNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgorI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCisKKy8qIFN3YXAgb3V0IGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSByZWxvYyBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkJXAorICBkbwkJCQkJCVwKKyAgICB7CQkJCQkJXAorICAgICAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOwkJCVwKKyAgICAgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsJCQlcCisgICAgfQkJCQkJCVwKKyAgd2hpbGUgKDApCisKKy8qIEdldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgbG9uZworZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sKSAgICAgICAKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiZmRfdm1hIHJlbG9jYXRpb247CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZWxzZSAKKyAgICByZWxvY2F0aW9uID0gKHN5bWJvbC0+dmFsdWUgKworCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCisJCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKworICByZXR1cm4gcmVsb2NhdGlvbjsKK30KKworLyogVGhpcyBtYWNybyBpcyB1c2VkIGluIGNvZmZjb2RlLmggdG8gZ2V0IHRoZSBob3d0byBjb3JyZXNwb25kaW5nIHRvCisgICBhbiBpbnRlcm5hbCByZWxvYy4gICovCisKKyNkZWZpbmUgUlRZUEUySE9XVE8ocmVsZW50LCBpbnRlcm5hbCkJCVwKKyAgKChyZWxlbnQpLT5ob3d0byA9CQkJCVwKKyAgICgoaW50ZXJuYWwpLT5yX3R5cGUgPCBTSF9DT0ZGX0hPV1RPX0NPVU5UCVwKKyAgICA/ICZzaF9jb2ZmX2hvd3Rvc1soaW50ZXJuYWwpLT5yX3R5cGVdCVwKKyAgICA6IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpKQorCisvKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBtYWNybyBpbiBjb2ZmY29kZS5oLCBleGNlcHQgdGhhdCBpdCBjb3BpZXMKKyAgIHJfb2Zmc2V0IGludG8gcmVsb2NfZW50cnktPmFkZGVuZCBmb3Igc29tZSByZWxvY3MuICAqLworI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAorICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAorICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4CQkJCVwKKwl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2CQkJXAorCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIMzIJCQlcCisJfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9VU0VTCQkJCVwKKwl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0NPVU5UCQkJCVwKKwl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX0FMSUdOKQkJCVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gKHJlbG9jKS5yX29mZnNldDsJCQlcCisgIH0KKworLyogVGhpcyBpcyB0aGUgaG93dG8gZnVuY3Rpb24gZm9yIHRoZSBTSCByZWxvY2F0aW9ucy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3NoX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAorCSAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgYmZkX3ZtYSBzeW1fdmFsdWU7CisgIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsKKyAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisgIGJmZF9ieXRlICpoaXRfZGF0YSA9IGFkZHIgKyAoYmZkX2J5dGUgKikgZGF0YTsKKworICByX3R5cGUgPSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBQYXJ0aWFsIGxpbmtpbmctLWRvIG5vdGhpbmcuICAqLworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QgYmUKKyAgICAgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KKyAgaWYgKHJfdHlwZSAhPSBSX1NIX0lNTTMyCisgICAgICAmJiAocl90eXBlICE9IFJfU0hfUENESVNQCisJICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICBpZiAoc3ltYm9sX2luICE9IE5VTEwKKyAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICBzeW1fdmFsdWUgPSBnZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2xfaW4pOworCisgIHN3aXRjaCAocl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfU0hfSU1NMzI6CisgICAgICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgaGl0X2RhdGEpOworICAgICAgaW5zbiArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOworICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1NIX1BDRElTUDoKKyAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaXRfZGF0YSk7CisgICAgICBzeW1fdmFsdWUgKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgICAgIHN5bV92YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCSAgICArIGFkZHIKKwkJICAgICsgNCk7CisgICAgICBzeW1fdmFsdWUgKz0gKGluc24gJiAweGZmZikgPDwgMTsKKyAgICAgIGlmIChpbnNuICYgMHg4MDApCisJc3ltX3ZhbHVlIC09IDB4MTAwMDsKKyAgICAgIGluc24gPSAoaW5zbiAmIDB4ZjAwMCkgfCAoc3ltX3ZhbHVlICYgMHhmZmYpOworICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOworICAgICAgaWYgKHN5bV92YWx1ZSA8IChiZmRfdm1hKSAtMHgxMDAwIHx8IHN5bV92YWx1ZSA+PSAweDEwMDApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGZvciBsaW5raW5nIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBvYmplY3RzCisgICB0b2dldGhlci4gICovCisKK3N0YXRpYyBib29sZWFuCitzaF9tZXJnZV9wcml2YXRlX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworeworICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgorICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuIiwKKwkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCisJIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCisJIGJmZF9iaWdfZW5kaWFuIChvYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOworCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBzaF9tZXJnZV9wcml2YXRlX2RhdGEKKworLyogV2UgY2FuIGRvIHJlbGF4aW5nLiAgKi8KKyNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBzaF9yZWxheF9zZWN0aW9uCisKKy8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KKyNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIHNoX3JlbG9jYXRlX3NlY3Rpb24KKworLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byB1c2Ugc3BlY2lhbCBjb2RlIHRvIGdldCB0aGUgcmVsb2NhdGVkCisgICBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisMCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgb24gdGhlIFNILgorCisgICBGdW5jdGlvbiBjYWxscyBvbiB0aGUgU0ggbG9vayBsaWtlIHRoaXM6CisKKyAgICAgICBtb3ZsICBMMSxyMAorICAgICAgIC4uLgorICAgICAgIGpzciAgIEByMAorICAgICAgIC4uLgorICAgICBMMToKKyAgICAgICAubG9uZyBmdW5jdGlvbgorCisgICBUaGUgY29tcGlsZXIgYW5kIGFzc2VtYmxlciB3aWxsIGNvb3BlcmF0ZSB0byBjcmVhdGUgUl9TSF9VU0VTCisgICByZWxvY3Mgb24gdGhlIGpzciBpbnN0cnVjdGlvbnMuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlCisgICBSX1NIX1VTRVMgcmVsb2MgaXMgdGhlIFBDIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKKyAgIGxvYWRzIHRoZSByZWdpc3RlciAodGhlIHJfb2Zmc2V0IGZpZWxkIGlzIGNvbXB1dGVkIGFzIHRob3VnaCBpdAorICAgd2VyZSBhIGp1bXAgaW5zdHJ1Y3Rpb24sIHNvIHRoZSBvZmZzZXQgdmFsdWUgaXMgYWN0dWFsbHkgZnJvbSBmb3VyCisgICBieXRlcyBwYXN0IHRoZSBpbnN0cnVjdGlvbikuICBUaGUgbGlua2VyIGNhbiB1c2UgdGhpcyByZWxvYyB0bworICAgZGV0ZXJtaW5lIGp1c3Qgd2hpY2ggZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLCBhbmQgdGh1cyBkZWNpZGUKKyAgIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuCisKKyAgIElmIG11bHRpcGxlIGZ1bmN0aW9uIGNhbGxzIGFyZSBhbGwgYmFzZWQgb24gYSBzaW5nbGUgcmVnaXN0ZXIgbG9hZAorICAgKGkuZS4sIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyksIHRoZSBjb21waWxlcgorICAgZ3VhcmFudGVlcyB0aGF0IGVhY2ggZnVuY3Rpb24gY2FsbCB3aWxsIGhhdmUgYW4gUl9TSF9VU0VTIHJlbG9jLgorICAgVGhlcmVmb3JlLCBpZiB0aGUgbGlua2VyIGlzIGFibGUgdG8gY29udmVydCBlYWNoIFJfU0hfVVNFUyByZWxvYworICAgd2hpY2ggcmVmZXJzIHRvIHRoYXQgYWRkcmVzcywgaXQgY2FuIHNhZmVseSBlbGltaW5hdGUgdGhlIHJlZ2lzdGVyCisgICBsb2FkLgorCisgICBXaGVuIHRoZSBhc3NlbWJsZXIgY3JlYXRlcyBhbiBSX1NIX1VTRVMgcmVsb2MsIGl0IGV4YW1pbmVzIGl0IHRvCisgICBkZXRlcm1pbmUgd2hpY2ggYWRkcmVzcyBpcyBiZWluZyBsb2FkZWQgKEwxIGluIHRoZSBhYm92ZSBleGFtcGxlKS4KKyAgIEl0IHRoZW4gY291bnRzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byB0aGF0IGFkZHJlc3MsIGFuZAorICAgY3JlYXRlcyBhbiBSX1NIX0NPVU5UIHJlbG9jIGF0IHRoYXQgYWRkcmVzcy4gIFRoZSByX29mZnNldCBmaWVsZCBvZgorICAgdGhlIFJfU0hfQ09VTlQgcmVsb2Mgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMuICBJZiB0aGUKKyAgIGxpbmtlciBpcyBhYmxlIHRvIGVsaW1pbmF0ZSBhIHJlZ2lzdGVyIGxvYWQsIGl0IGNhbiB1c2UgdGhlCisgICBSX1NIX0NPVU5UIHJlbG9jIHRvIHNlZSB3aGV0aGVyIGl0IGNhbiBhbHNvIGVsaW1pbmF0ZSB0aGUgZnVuY3Rpb24KKyAgIGFkZHJlc3MuCisKKyAgIFNIIHJlbGF4aW5nIGFsc28gaGFuZGxlcyBhbm90aGVyLCB1bnJlbGF0ZWQsIG1hdHRlci4gIE9uIHRoZSBTSCwgaWYKKyAgIGEgbG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbiBpcyBub3QgYWxpZ25lZCBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeSwKKyAgIHRoZSBtZW1vcnkgY3ljbGUgaW50ZXJmZXJlcyB3aXRoIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gZmV0Y2gsCisgICBjYXVzaW5nIGEgb25lIGN5Y2xlIGJ1YmJsZSBpbiB0aGUgcGlwZWxpbmUuICBUaGVyZWZvcmUsIHdlIHRyeSB0bworICAgYWxpZ24gbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIG9uIGZvdXIgYnl0ZSBib3VuZGFyaWVzIGlmIHdlCisgICBjYW4sIGJ5IHN3YXBwaW5nIHRoZW0gd2l0aCBvbmUgb2YgdGhlIGFkamFjZW50IGluc3RydWN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuIAorc2hfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGJvb2xlYW4gKmFnYWluOworeworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpmcmVlX3JlbG9jcyA9IE5VTEw7CisgIGJvb2xlYW4gaGF2ZV9jb2RlOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOworICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOworICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKyAgKmFnYWluID0gZmFsc2U7CisKKyAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAorICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAorICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCisgIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQorICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7CisKKyAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcworCQkgICAgIChhYmZkLCBzZWMsIGxpbmtfaW5mby0+a2VlcF9tZW1vcnksCisJCSAgICAgIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKKwkJICAgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKyAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKworICBoYXZlX2NvZGUgPSBmYWxzZTsKKworICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7CisgICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZm4sICppcmVsc2NhbiwgKmlyZWxjb3VudDsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOworICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKKworICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0NPREUpCisJaGF2ZV9jb2RlID0gdHJ1ZTsKKworICAgICAgaWYgKGlyZWwtPnJfdHlwZSAhPSBSX1NIX1VTRVMpCisJY29udGludWU7CisKKyAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwl7CisJICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAorCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyAhPSBOVUxMKQorCSAgICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKKwkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAorCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFRoZSByX29mZnNldCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KKyAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9vZmZzZXQgZmllbGQgaXMKKyAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAorICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KKyAgICAgIGxhZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hICsgNDsKKyAgICAgIC8qIENhcmVmdWwgdG8gc2lnbiBleHRlbmQgdGhlIDMyLWJpdCBvZmZzZXQuICAqLworICAgICAgbGFkZHIgKz0gKChpcmVsLT5yX29mZnNldCAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwOworICAgICAgaWYgKGxhZGRyID49IHNlYy0+X3Jhd19zaXplKQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBvZmZzZXQiLAorCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkJCQkgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpOworCSAgY29udGludWU7CisJfQorICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOworCisgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8uICAqLworICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSAhPSAweGQwMDApCisJeworCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiLAorCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIsIGluc24pKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzIGJlaW5nIGxvYWRlZC4gIFRoZQorICAgICAgCSBkaXNwbGFjZW1lbnQgaW4gdGhlIG1vdi5sIGluc3RydWN0aW9uIGlzIHF1YWRydXBsZWQuICBJdCBpcyBhCisgICAgICAJIGRpc3BsYWNlbWVudCBmcm9tIGZvdXIgYnl0ZXMgYWZ0ZXIgdGhlIG1vdmwgaW5zdHJ1Y3Rpb24sIGJ1dCwKKyAgICAgIAkgYmVmb3JlIGFkZGluZyBpbiB0aGUgUEMgYWRkcmVzcywgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMKKyAgICAgIAkgb2YgdGhlIFBDIGFyZSBjbGVhcmVkLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZAorICAgICAgCSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCisgICAgICBwYWRkciA9IGluc24gJiAweGZmOworICAgICAgcGFkZHIgKj0gNDsKKyAgICAgIHBhZGRyICs9IChsYWRkciArIDQpICZ+IDM7CisgICAgICBpZiAocGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCisJeworCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIGxvYWQgb2Zmc2V0IiwKKwkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCisgICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcworICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KKyAgICAgIHBhZGRyICs9IHNlYy0+dm1hOworICAgICAgZm9yIChpcmVsZm4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxmbiA8IGlyZWxlbmQ7IGlyZWxmbisrKQorCWlmIChpcmVsZm4tPnJfdmFkZHIgPT0gcGFkZHIKKwkgICAgJiYgaXJlbGZuLT5yX3R5cGUgPT0gUl9TSF9JTU0zMikKKwkgIGJyZWFrOworICAgICAgaWYgKGlyZWxmbiA+PSBpcmVsZW5kKQorCXsKKwkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAoIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgcmVsb2MiLAorCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLworICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLAorCQkJICAgICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKKwkJCSAgICAgKyAoaXJlbGZuLT5yX3N5bW5keAorCQkJCSogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAorCQkJICAgICZzeW0pOworICAgICAgaWYgKHN5bS5uX3NjbnVtICE9IDAgJiYgc3ltLm5fc2NudW0gIT0gc2VjLT50YXJnZXRfaW5kZXgpCisJeworCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBzeW1ib2wgaW4gdW5leHBlY3RlZCBzZWN0aW9uIiwKKwkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUKQorCXsKKwkgIHN5bXZhbCA9IChzeW0ubl92YWx1ZQorCQkgICAgLSBzZWMtPnZtYQorCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZClbaXJlbGZuLT5yX3N5bW5keF07CisJICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOworCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCisgICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJfQorCisgICAgICBzeW12YWwgKz0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBwYWRkciAtIHNlYy0+dm1hKTsKKworICAgICAgLyogU2VlIGlmIHRoaXMgZnVuY3Rpb24gY2FsbCBjYW4gYmUgc2hvcnRlbmVkLiAgKi8KKyAgICAgIGZvZmYgPSAoc3ltdmFsCisJICAgICAgLSAoaXJlbC0+cl92YWRkcgorCQkgLSBzZWMtPnZtYQorCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSArIDQpKTsKKyAgICAgIGlmIChmb2ZmIDwgLTB4MTAwMCB8fCBmb2ZmID49IDB4MTAwMCkKKwl7CisJICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCB3ZSBjYW4ndCBzaG9ydGVuIHRoaXMgZnVuY3Rpb24gY2FsbC4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFNob3J0ZW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLworCisgICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KKwkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKKwkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKKwkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCisJIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOworCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgorCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCisKKyAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQorCXsKKwkgIHNlYy0+dXNlZF9ieV9iZmQgPQorCSAgICAoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOworCSAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorCisgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfcmVsb2NzID0gdHJ1ZTsKKyAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7CisgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9jb250ZW50cyA9IHRydWU7CisgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKworICAgICAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7CisKKyAgICAgIC8qIFJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KKworICAgICAgLyogQ2hhbmdlIHRoZSBSX1NIX1VTRVMgcmVsb2MgaW50byBhbiBSX1NIX1BDRElTUCByZWxvYywgYW5kCisgICAgICAgICByZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCisgICAgICBpcmVsLT5yX3R5cGUgPSBSX1NIX1BDRElTUDsKKyAgICAgIGlyZWwtPnJfc3ltbmR4ID0gaXJlbGZuLT5yX3N5bW5keDsKKyAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQpCisJeworCSAgLyogSWYgdGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIGJlY2F1c2Ugb2YgZnV0dXJlIHJlbGF4aW5nLAorICAgICAgICAgICAgIGl0IHdpbGwgYmUgaGFuZGxlZCBoZXJlIGxpa2Ugb3RoZXIgaW50ZXJuYWwgUENESVNQCisgICAgICAgICAgICAgcmVsb2NzLiAgKi8KKwkgIGJmZF9wdXRfMTYgKGFiZmQsCisJCSAgICAgIDB4YjAwMCB8ICgoZm9mZiA+PiAxKSAmIDB4ZmZmKSwKKwkJICAgICAgY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBjYW4ndCBmdWxseSByZXNvbHZlIHRoaXMgeWV0LCBiZWNhdXNlIHRoZSBleHRlcm5hbAorICAgICAgICAgICAgIHN5bWJvbCB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBieSBmdXR1cmUgcmVsYXhpbmcuICBXZSBsZXQKKyAgICAgICAgICAgICB0aGUgZmluYWwgbGluayBwaGFzZSBoYW5kbGUgaXQuICAqLworCSAgYmZkX3B1dF8xNiAoYWJmZCwgMHhiMDAwLCBjb250ZW50cyArIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSk7CisJfQorCisgICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBSX1NIX1VTRVMgcmVsb2MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lCisgICAgICAgICByZWdpc3RlciBsb2FkLiAgKi8KKyAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbGVuZDsgaXJlbHNjYW4rKykKKwlpZiAoaXJlbHNjYW4tPnJfdHlwZSA9PSBSX1NIX1VTRVMKKwkgICAgJiYgbGFkZHIgPT0gaXJlbHNjYW4tPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpCisJICBicmVhazsKKyAgICAgIGlmIChpcmVsc2NhbiA8IGlyZWxlbmQpCisJeworCSAgLyogU29tZSBvdGhlciBmdW5jdGlvbiBjYWxsIGRlcGVuZHMgdXBvbiB0aGlzIHJlZ2lzdGVyIGxvYWQsCisJICAgICBhbmQgd2UgaGF2ZSBub3QgeWV0IGNvbnZlcnRlZCB0aGF0IGZ1bmN0aW9uIGNhbGwuCisJICAgICBJbmRlZWQsIHdlIG1heSBuZXZlciBiZSBhYmxlIHRvIGNvbnZlcnQgaXQuICBUaGVyZSBpcworCSAgICAgbm90aGluZyBlbHNlIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50LiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogTG9vayBmb3IgYSBSX1NIX0NPVU5UIHJlbG9jIG9uIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUKKyAgICAgICAgIGZ1bmN0aW9uIGFkZHJlc3MgaXMgc3RvcmVkLiAgRG8gdGhpcyBiZWZvcmUgZGVsZXRpbmcgYW55CisgICAgICAgICBieXRlcywgdG8gYXZvaWQgY29uZnVzaW9uIGFib3V0IHRoZSBhZGRyZXNzLiAgKi8KKyAgICAgIGZvciAoaXJlbGNvdW50ID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsY291bnQgPCBpcmVsZW5kOyBpcmVsY291bnQrKykKKwlpZiAoaXJlbGNvdW50LT5yX3ZhZGRyID09IHBhZGRyCisJICAgICYmIGlyZWxjb3VudC0+cl90eXBlID09IFJfU0hfQ09VTlQpCisJICBicmVhazsKKworICAgICAgLyogRGVsZXRlIHRoZSByZWdpc3RlciBsb2FkLiAgKi8KKyAgICAgIGlmICghIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBsYWRkciwgMikpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywganVzdCBpbiBjYXNlIGl0IHBlcm1pdHMgc29tZQorICAgICAgICAgb3RoZXIgZnVuY3Rpb24gY2FsbCB0byBjb21lIHdpdGhpbiByYW5nZSwgd2Ugc2hvdWxkIHJlbGF4CisgICAgICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKyAgICAgICphZ2FpbiA9IHRydWU7CisKKyAgICAgIC8qIE5vdyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIENPVU5UIHJlbG9jLiAgKi8KKyAgICAgIGlmIChpcmVsY291bnQgPj0gaXJlbGVuZCkKKwl7CisJICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIENPVU5UIHJlbG9jIiwKKwkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGUgbnVtYmVyIG9mIHVzZXMgaXMgc3RvcmVkIGluIHRoZSByX29mZnNldCBmaWVsZC4gIFdlJ3ZlCisgICAgICAgICBqdXN0IGRlbGV0ZWQgb25lLiAgKi8KKyAgICAgIGlmIChpcmVsY291bnQtPnJfb2Zmc2V0ID09IDApCisJeworCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAweCVseDogd2FybmluZzogYmFkIGNvdW50IiwKKwkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC0taXJlbGNvdW50LT5yX29mZnNldDsKKworICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcywgd2UgY2FuIGRlbGV0ZSB0aGUgYWRkcmVzcy4gIFJlbG9hZAorICAgICAgICAgdGhlIGFkZHJlc3MgZnJvbSBpcmVsZm4sIGluIGNhc2UgaXQgd2FzIGNoYW5nZWQgYnkgdGhlCisgICAgICAgICBwcmV2aW91cyBjYWxsIHRvIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcy4gICovCisgICAgICBpZiAoaXJlbGNvdW50LT5yX29mZnNldCA9PSAwKQorCXsKKwkgIGlmICghIHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCSAgICAgICBpcmVsZm4tPnJfdmFkZHIgLSBzZWMtPnZtYSwgNCkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgLyogV2UndmUgZG9uZSBhbGwgd2UgY2FuIHdpdGggdGhhdCBmdW5jdGlvbiBjYWxsLiAgKi8KKyAgICB9CisKKyAgLyogTG9vayBmb3IgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgY2FuIGFsaWduIG9uIGZvdXIKKyAgICAgYnl0ZSBib3VuZGFyaWVzLiAgKi8KKyAgaWYgKGhhdmVfY29kZSkKKyAgICB7CisgICAgICBib29sZWFuIHN3YXBwZWQ7CisKKyAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwl7CisJICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTAorCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyAhPSBOVUxMKQorCSAgICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKKwkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAorCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIGlmICghIHNoX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsICZzd2FwcGVkKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKHN3YXBwZWQpCisJeworCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzZWMtPnVzZWRfYnlfYmZkID0KKwkJKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKKwkgICAgICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCisJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfcmVsb2NzID0gdHJ1ZTsKKwkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7CisJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+a2VlcF9jb250ZW50cyA9IHRydWU7CisJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKworCSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7CisJfQorICAgIH0KKworICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKwlmcmVlIChmcmVlX2NvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgY29mZl9saW5rX2lucHV0X2JmZC4gICovCisJICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNlYy0+dXNlZF9ieV9iZmQgPQorCQkoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOworCSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBOVUxMOworCSAgICB9CisJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBjb250ZW50czsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLworCitzdGF0aWMgYm9vbGVhbgorc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgaW50IGNvdW50OworeworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGFsaWduOworICBiZmRfdm1hIHRvYWRkcjsKKyAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOworICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7CisgIGFzZWN0aW9uICpvOworCisgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzOworCisgIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50CisgICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KKworICBpcmVsYWxpZ24gPSBOVUxMOworICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKKworICBpcmVsID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsKKyAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKKyAgICB7CisgICAgICBpZiAoaXJlbC0+cl90eXBlID09IFJfU0hfQUxJR04KKwkgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+IGFkZHIKKwkgICYmIGNvdW50IDwgKDEgPDwgaXJlbC0+cl9vZmZzZXQpKQorCXsKKwkgIGlyZWxhbGlnbiA9IGlyZWw7CisJICB0b2FkZHIgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLworICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOworICBpZiAoaXJlbGFsaWduID09IE5VTEwpCisgICAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKworI2RlZmluZSBOT1BfT1BDT0RFICgweDAwMDkpCisKKyAgICAgIEJGRF9BU1NFUlQgKChjb3VudCAmIDEpID09IDApOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpCisJYmZkX3B1dF8xNiAoYWJmZCwgTk9QX09QQ09ERSwgY29udGVudHMgKyB0b2FkZHIgLSBjb3VudCArIGkpOworICAgIH0KKworICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLworICBmb3IgKGlyZWwgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGJmZF92bWEgbnJhZGRyLCBzdG9wOworICAgICAgYmZkX3ZtYSBzdGFydCA9IDA7CisgICAgICBpbnQgaW5zbiA9IDA7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKKyAgICAgIGludCBvZmYsIGFkanVzdCwgb2luc247CisgICAgICBiZmRfc2lnbmVkX3ZtYSB2b2ZmID0gMDsKKyAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7CisKKyAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLworICAgICAgbnJhZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOworICAgICAgaWYgKChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPiBhZGRyCisJICAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hIDwgdG9hZGRyKQorCSAgfHwgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0FMSUdOCisJICAgICAgJiYgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID09IHRvYWRkcikpCisJbnJhZGRyIC09IGNvdW50OworCisgICAgICAvKiBTZWUgaWYgdGhpcyByZWxvYyB3YXMgZm9yIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQsIGluIHdoaWNoCisJIGNhc2Ugd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgaXQuICBEb24ndCBkZWxldGUgcmVsb2NzIHdoaWNoCisJIHJlcHJlc2VudCBhZGRyZXNzZXMsIHRob3VnaC4gICovCisgICAgICBpZiAoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID49IGFkZHIKKwkgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA8IGFkZHIgKyBjb3VudAorCSAgJiYgaXJlbC0+cl90eXBlICE9IFJfU0hfQUxJR04KKwkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0NPREUKKwkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0RBVEEKKwkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0xBQkVMKQorCWlyZWwtPnJfdHlwZSA9IFJfU0hfVU5VU0VEOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHNlZSBpZiB0aGUgcmFuZ2UgaXQgY292ZXJzCisgICAgICAgICBpbmNsdWRlcyB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLiAgKi8KKyAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQorCXsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfUENESVNQOEJZMjoKKwljYXNlIFJfU0hfUENESVNQOgorCWNhc2UgUl9TSF9QQ1JFTElNTThCWTI6CisJY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKKwkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOworCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCisJeworCWRlZmF1bHQ6CisJICBzdGFydCA9IHN0b3AgPSBhZGRyOworCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfSU1NMzI6CisJICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGlzCisgICAgICAgICAgICAgc2VjdGlvbiwgYW5kIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUgYWRqdXN0ZWQgYmVsb3csIHdlCisgICAgICAgICAgICAgbXVzdCBjaGVjayB0aGUgYWRkZW5kIHRvIHNlZSBpdCB3aWxsIHB1dCB0aGUgdmFsdWUgaW4KKyAgICAgICAgICAgICByYW5nZSB0byBiZSBhZGp1c3RlZCwgYW5kIGhlbmNlIG11c3QgYmUgY2hhbmdlZC4gICovCisJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKKwkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCisJCQkJICsgKGlyZWwtPnJfc3ltbmR4CisJCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAorCQkJCSZzeW0pOworCSAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVAorCSAgICAgICYmIHN5bS5uX3NjbnVtID09IHNlYy0+dGFyZ2V0X2luZGV4CisJICAgICAgJiYgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSA8PSBhZGRyCisJCSAgfHwgKGJmZF92bWEpIHN5bS5uX3ZhbHVlID49IHRvYWRkcikpCisJICAgIHsKKwkgICAgICBiZmRfdm1hIHZhbDsKKworCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgICAgICB2YWwgKz0gc3ltLm5fdmFsdWU7CisJICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQorCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwgY29udGVudHMgKyBucmFkZHIpOworCSAgICB9CisJICBzdGFydCA9IHN0b3AgPSBhZGRyOworCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfUENESVNQOEJZMjoKKwkgIG9mZiA9IGluc24gJiAweGZmOworCSAgaWYgKG9mZiAmIDB4ODApCisJICAgIG9mZiAtPSAweDEwMDsKKwkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7CisJICBicmVhazsKKworCWNhc2UgUl9TSF9QQ0RJU1A6CisJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKKwkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCisJCQkJICsgKGlyZWwtPnJfc3ltbmR4CisJCQkJICAgICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSkpLAorCQkJCSZzeW0pOworCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKKwkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKKwkgICAgICBpZiAob2ZmICYgMHg4MDApCisJCW9mZiAtPSAweDEwMDA7CisJICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfUENSRUxJTU04QlkyOgorCSAgb2ZmID0gaW5zbiAmIDB4ZmY7CisJICBzdG9wID0gc3RhcnQgKyA0ICsgb2ZmICogMjsKKwkgIGJyZWFrOworCisJY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKKwkgIG9mZiA9IGluc24gJiAweGZmOworCSAgc3RvcCA9IChzdGFydCAmfiAoYmZkX3ZtYSkgMykgKyA0ICsgb2ZmICogNDsKKwkgIGJyZWFrOworCisJY2FzZSBSX1NIX1NXSVRDSDg6CisJY2FzZSBSX1NIX1NXSVRDSDE2OgorCWNhc2UgUl9TSF9TV0lUQ0gzMjoKKwkgIC8qIFRoZXNlIHJlbG9jcyB0eXBlcyByZXByZXNlbnQKKwkgICAgICAgLndvcmQgTDItTDEKKwkgICAgIFRoZSByX29mZnNldCBmaWVsZCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYworCSAgICAgYWRkcmVzcyBhbmQgTDEuICBUaGF0IGlzIHRoZSBzdGFydCBvZiB0aGUgcmVsb2MsIGFuZAorCSAgICAgYWRkaW5nIGluIHRoZSBjb250ZW50cyBnaXZlcyB1cyB0aGUgdG9wLiAgV2UgbXVzdCBhZGp1c3QKKwkgICAgIGJvdGggdGhlIHJfb2Zmc2V0IGZpZWxkIGFuZCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisKKwkgIHN0YXJ0ID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOworCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCAtIChsb25nKSBpcmVsLT5yX29mZnNldCk7CisKKwkgIGlmIChzdGFydCA+IGFkZHIKKwkgICAgICAmJiBzdGFydCA8IHRvYWRkcgorCSAgICAgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQorCSAgICBpcmVsLT5yX29mZnNldCArPSBjb3VudDsKKwkgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCisJCSAgICYmIHN0b3AgPCB0b2FkZHIKKwkJICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKKwkgICAgaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7CisKKwkgIHN0YXJ0ID0gc3RvcDsKKworCSAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX1NXSVRDSDE2KQorCSAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgIGVsc2UgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX1NXSVRDSDgpCisJICAgIHZvZmYgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgIGVsc2UKKwkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7CisJICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgdm9mZik7CisKKwkgIGJyZWFrOworCisJY2FzZSBSX1NIX1VTRVM6CisJICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKKwkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKKwkJCSAgICArIChsb25nKSBpcmVsLT5yX29mZnNldAorCQkJICAgICsgNCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChzdGFydCA+IGFkZHIKKwkgICYmIHN0YXJ0IDwgdG9hZGRyCisJICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKKwlhZGp1c3QgPSBjb3VudDsKKyAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCisJICAgICAgICYmIHN0b3AgPCB0b2FkZHIKKwkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKKwlhZGp1c3QgPSAtIGNvdW50OworICAgICAgZWxzZQorCWFkanVzdCA9IDA7CisKKyAgICAgIGlmIChhZGp1c3QgIT0gMCkKKwl7CisJICBvaW5zbiA9IGluc247CisJICBvdmVyZmxvdyA9IGZhbHNlOworCSAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfU0hfUENESVNQOEJZMjoKKwkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKKwkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7CisJICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9QQ0RJU1A6CisJICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOworCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKKwkJb3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfU0hfUENSRUxJTU04Qlk0OgorCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKKwkgICAgICBpZiAoY291bnQgPj0gNCkKKwkJaW5zbiArPSBhZGp1c3QgLyA0OworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICgoaXJlbC0+cl92YWRkciAmIDMpID09IDApCisJCSAgICArK2luc247CisJCX0KKwkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCisJCW92ZXJmbG93ID0gdHJ1ZTsKKwkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX1NIX1NXSVRDSDg6CisJICAgICAgdm9mZiArPSBhZGp1c3Q7CisJICAgICAgaWYgKHZvZmYgPCAwIHx8IHZvZmYgPj0gMHhmZikKKwkJb3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdm9mZiwgY29udGVudHMgKyBucmFkZHIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKKwkgICAgICB2b2ZmICs9IGFkanVzdDsKKwkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6CisJICAgICAgdm9mZiArPSBhZGp1c3Q7CisJICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfU0hfVVNFUzoKKwkgICAgICBpcmVsLT5yX29mZnNldCArPSBhZGp1c3Q7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKG92ZXJmbG93KQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiwKKwkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKSk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICBpcmVsLT5yX3ZhZGRyID0gbnJhZGRyICsgc2VjLT52bWE7CisgICAgfQorCisgIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKKyAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAorICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxzY2FuLCAqaXJlbHNjYW5lbmQ7CisgICAgICBiZmRfYnl0ZSAqb2NvbnRlbnRzOworCisgICAgICBpZiAobyA9PSBzZWMKKwkgIHx8IChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAorCSAgfHwgby0+cmVsb2NfY291bnQgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogV2UgYWx3YXlzIGNhY2hlIHRoZSByZWxvY3MuICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcworICAgICAgICAgZmFsc2UsIHdlIHNob3VsZCBmcmVlIHRoZW0sIGlmIHdlIGFyZSBwZXJtaXR0ZWQgdG8sIHdoZW4gd2UKKyAgICAgICAgIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCisgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCisJCQkgKGFiZmQsIG8sIHRydWUsIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKKwkJCSAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7CisgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBvY29udGVudHMgPSBOVUxMOworICAgICAgaXJlbHNjYW5lbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKKyAgICAgIGZvciAoaXJlbHNjYW4gPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWxzY2FuIDwgaXJlbHNjYW5lbmQ7IGlyZWxzY2FuKyspCisJeworCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07CisKKwkgIGlmIChpcmVsc2Nhbi0+cl90eXBlICE9IFJfU0hfSU1NMzIpCisJICAgIGNvbnRpbnVlOworCisJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKKwkJCQkoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCisJCQkJICsgKGlyZWxzY2FuLT5yX3N5bW5keAorCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKKwkJCQkmc3ltKTsKKwkgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQKKwkgICAgICAmJiBzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAorCSAgICAgICYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPD0gYWRkcgorCQkgIHx8IChiZmRfdm1hKSBzeW0ubl92YWx1ZSA+PSB0b2FkZHIpKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSB2YWw7CisKKwkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCisJCXsKKwkJICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50cyAhPSBOVUxMKQorCQkgICAgb2NvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50czsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KKwkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7CisJCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCisJCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCisJCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmNvbnRlbnRzID0gb2NvbnRlbnRzOworCQkgICAgfQorCQl9CisKKwkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl92YWRkciAtIG8tPnZtYSk7CisJICAgICAgdmFsICs9IHN5bS5uX3ZhbHVlOworCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKKwkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsCisJCQkgICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfdmFkZHIgLSBvLT52bWEpOworCisJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogQWRqdXN0aW5nIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHdpbGwgbm90IHdvcmsgaWYgc29tZXRoaW5nIGhhcworICAgICBhbHJlYWR5IHJldHJpZXZlZCB0aGUgZ2VuZXJpYyBzeW1ib2xzLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8KKyAgICAgbWFrZSB0aGlzIHdvcmsgYnkgYWRqdXN0aW5nIHRoZSBnZW5lcmljIHN5bWJvbHMgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgSG93ZXZlciwgdGhpcyBjYXNlIHNob3VsZCBub3QgYXJpc2UgaW4gbm9ybWFsIHVzYWdlLiAgKi8KKyAgaWYgKG9ial9zeW1ib2xzIChhYmZkKSAhPSBOVUxMCisgICAgICB8fCBvYmpfcmF3X3N5bWVudHMgKGFiZmQpICE9IE5VTEwpCisgICAgeworICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorICAgICAgICgiJXM6IGZhdGFsOiBnZW5lcmljIHN5bWJvbHMgcmV0cmlldmVkIGJlZm9yZSByZWxheGluZyIsCisJYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIEFkanVzdCBhbGwgdGhlIHN5bWJvbHMuICAqLworICBzeW1faGFzaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpOworICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOworICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOworICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKKyAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKKworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZpc3ltKTsKKworICAgICAgaWYgKGlzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAorCSAgJiYgKGJmZF92bWEpIGlzeW0ubl92YWx1ZSA+IGFkZHIKKwkgICYmIChiZmRfdm1hKSBpc3ltLm5fdmFsdWUgPCB0b2FkZHIpCisJeworCSAgaXN5bS5uX3ZhbHVlIC09IGNvdW50OworCisJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZpc3ltLCAoUFRSKSBlc3ltKTsKKworCSAgaWYgKCpzeW1faGFzaCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgQkZEX0FTU0VSVCAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCSAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOworCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID49IGFkZHIKKwkJCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpOworCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OworCSAgICB9CisJfQorCisgICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7CisgICAgICBzeW1faGFzaCArPSBpc3ltLm5fbnVtYXV4ICsgMTsKKyAgICB9CisKKyAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAorICAgICByX3ZhZGRyIGZvciBpdCBhbHJlYWR5LiAgKi8KKyAgaWYgKGlyZWxhbGlnbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF92bWEgYWxpZ250bywgYWxpZ25hZGRyOworCisgICAgICBhbGlnbnRvID0gQkZEX0FMSUdOICh0b2FkZHIsIDEgPDwgaXJlbGFsaWduLT5yX29mZnNldCk7CisgICAgICBhbGlnbmFkZHIgPSBCRkRfQUxJR04gKGlyZWxhbGlnbi0+cl92YWRkciAtIHNlYy0+dm1hLAorCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9vZmZzZXQpOworICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQorCXsKKwkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KKwkgIHJldHVybiBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWxpZ25hZGRyLAorCQkJCQlhbGlnbnRvIC0gYWxpZ25hZGRyKTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogVGhpcyBpcyB5ZXQgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBTSCBvcGNvZGUgdGFibGUsIHVzZWQgdG8gcmFwaWRseQorICAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4gICovCisKKy8qIFRoZSBvcGNvZGUgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUKKyAgIGFycmF5IGlzIGluZGV4ZWQgYnkgdGhlIGhpZ2ggb3JkZXIgZm91ciBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCisKK3N0cnVjdCBzaF9tYWpvcl9vcGNvZGUKK3sKKyAgLyogQSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0LiAgVGhpcyBpcyBhbiBhcnJheSB3aGljaAorICAgICBjb250YWlucyBhbGwgdGhlIGluc3RydWN0aW9ucyB3aXRoIHRoaXMgbWFqb3Igb3Bjb2RlLiAgKi8KKyAgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSAqbWlub3Jfb3Bjb2RlczsKKyAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBtaW5vcl9vcGNvZGVzLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgY291bnQ7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBzZXQgb2YgU0ggb3Bjb2Rlcy4gIFRoZQorICAgaW5zdHJ1Y3Rpb24gY29kZSBpcyBhbmRlZCB3aXRoIHRoZSBtYXNrIHZhbHVlLCBhbmQgdGhlIHJlc3VsdGluZworICAgdmFsdWUgaXMgdXNlZCB0byBzZWFyY2ggdGhlIG9yZGVyIG9wY29kZSBsaXN0LiAgKi8KKworc3RydWN0IHNoX21pbm9yX29wY29kZQoreworICAvKiBUaGUgc29ydGVkIG9wY29kZSBsaXN0LiAgKi8KKyAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3Bjb2RlczsKKyAgLyogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBvcGNvZGVzLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgY291bnQ7CisgIC8qIFRoZSBtYXNrIHZhbHVlIHRvIHVzZSB3aGVuIHNlYXJjaGluZyB0aGUgb3Bjb2RlIGxpc3QuICAqLworICB1bnNpZ25lZCBzaG9ydCBtYXNrOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGFuIFNIIGluc3RydWN0aW9uLiAgQW4gYXJyYXkKKyAgIG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgc29ydGVkIGluIG9yZGVyIGJ5IG9wY29kZS4gICovCisKK3N0cnVjdCBzaF9vcGNvZGUKK3sKKyAgLyogVGhlIGNvZGUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIGFmdGVyIGl0IGhhcyBiZWVuIGFuZGVkIHdpdGggdGhlCisgICAgIG1hc2sgdmFsdWUgaW4gdGhlIHNoX21ham9yX29wY29kZSBzdHJ1Y3R1cmUuICAqLworICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7CisgIC8qIEZsYWdzIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Cit9OworCisvKiBGbGFnIHdoaWNoIGFwcGVhciBpbiB0aGUgc2hfb3Bjb2RlIHN0cnVjdHVyZS4gICovCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gbG9hZHMgYSB2YWx1ZSBmcm9tIG1lbW9yeS4gICovCisjZGVmaW5lIExPQUQgKDB4MSkKKworLyogVGhpcyBpbnN0cnVjdGlvbiBzdG9yZXMgYSB2YWx1ZSB0byBtZW1vcnkuICAqLworI2RlZmluZSBTVE9SRSAoMHgyKQorCisvKiBUaGlzIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoLiAgKi8KKyNkZWZpbmUgQlJBTkNIICgweDQpCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVsYXkgc2xvdC4gICovCisjZGVmaW5lIERFTEFZICgweDgpCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAorICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVVNFUzEgKDB4MTApCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAorICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVVNFUzIgKDB4MjApCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgdmFsdWUgaW4gcmVnaXN0ZXIgMC4gICovCisjZGVmaW5lIFVTRVNSMCAoMHg0MCkKKworLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0CisgICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTRVRTMSAoMHg4MCkKKworLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0CisgICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTRVRTMiAoMHgxMDApCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyByZWdpc3RlciAwLiAgKi8KKyNkZWZpbmUgU0VUU1IwICgweDIwMCkKKworLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIGEgc3BlY2lhbCByZWdpc3Rlci4gICovCisjZGVmaW5lIFNFVFNTUCAoMHg0MDApCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBhIHNwZWNpYWwgcmVnaXN0ZXIuICAqLworI2RlZmluZSBVU0VTU1AgKDB4ODAwKQorCisvKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAorICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVVNFU0YxICgweDEwMDApCisKKy8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0CisgICBtYXNrIDB4MDBmMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBVU0VTRjIgKDB4MjAwMCkKKworLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIDAuICAqLworI2RlZmluZSBVU0VTRjAgKDB4NDAwMCkKKworLyogVGhpcyBpbnN0cnVjdGlvbiBzZXRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKKyAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNFVFNGMSAoMHg4MDAwKQorCitzdGF0aWMgYm9vbGVhbiBzaF9pbnNuX3VzZXNfcmVnCisgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIHNoX2luc25fdXNlc19mcmVnCisgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIHNoX2luc25zX2NvbmZsaWN0CisgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqLCB1bnNpZ25lZCBpbnQsCisJICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzaF9sb2FkX3VzZQorICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50LAorCSAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKikpOworCisvKiBUaGUgb3Bjb2RlIG1hcHMuICAqLworCisjZGVmaW5lIE1BUChhKSBhLCBzaXplb2YgYSAvIHNpemVvZiBhWzBdCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAwW10gPQoreworICB7IDB4MDAwOCwgU0VUU1NQIH0sCQkJLyogY2xydCAqLworICB7IDB4MDAwOSwgMCB9LAkJCS8qIG5vcCAqLworICB7IDB4MDAwYiwgQlJBTkNIIHwgREVMQVkgfCBVU0VTU1AgfSwJLyogcnRzICovCisgIHsgMHgwMDE4LCBTRVRTU1AgfSwJCQkvKiBzZXR0ICovCisgIHsgMHgwMDE5LCBTRVRTU1AgfSwJCQkvKiBkaXYwdSAqLworICB7IDB4MDAxYiwgMCB9LAkJCS8qIHNsZWVwICovCisgIHsgMHgwMDI4LCBTRVRTU1AgfSwJCQkvKiBjbHJtYWMgKi8KKyAgeyAweDAwMmIsIEJSQU5DSCB8IERFTEFZIHwgU0VUU1NQIH0sCS8qIHJ0ZSAqLworICB7IDB4MDAzOCwgVVNFU1NQIHwgU0VUU1NQIH0sCQkvKiBsZHRsYiAqLworICB7IDB4MDA0OCwgU0VUU1NQIH0sCQkJLyogY2xycyAqLworICB7IDB4MDA1OCwgU0VUU1NQIH0JCQkvKiBzZXRzICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMVtdID0KK3sKKyAgeyAweDAwMDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNyLHJuICovCisgIHsgMHgwMDAzLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIHwgU0VUU1NQIH0sCS8qIGJzcmYgcm4gKi8KKyAgeyAweDAwMGEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIG1hY2gscm4gKi8KKyAgeyAweDAwMTIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIGdicixybiAqLworICB7IDB4MDAxYSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgbWFjbCxybiAqLworICB7IDB4MDAyMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgdmJyLHJuICovCisgIHsgMHgwMDIzLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBicmFmIHJuICovCisgIHsgMHgwMDI5LCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIG1vdnQgcm4gKi8KKyAgeyAweDAwMmEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIHByLHJuICovCisgIHsgMHgwMDMyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzc3Iscm4gKi8KKyAgeyAweDAwNDIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHNwYyxybiAqLworICB7IDB4MDA1YSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgZnB1bCxybiAqLworICB7IDB4MDA2YSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdHMgZnBzY3Iscm4gKi8KKyAgeyAweDAwODIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHIwX2Jhbmsscm4gKi8KKyAgeyAweDAwODMsIExPQUQgfCBVU0VTMSB9LAkJCS8qIHByZWYgQHJuICovCisgIHsgMHgwMDkyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMV9iYW5rLHJuICovCisgIHsgMHgwMGEyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMl9iYW5rLHJuICovCisgIHsgMHgwMGIyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByM19iYW5rLHJuICovCisgIHsgMHgwMGMyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNF9iYW5rLHJuICovCisgIHsgMHgwMGQyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNV9iYW5rLHJuICovCisgIHsgMHgwMGUyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByNl9iYW5rLHJuICovCisgIHsgMHgwMGYyLCBTRVRTMSB8IFVTRVNTUCB9CQkJLyogc3RjIHI3X2Jhbmsscm4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTAyW10gPQoreworICB7IDB4MDAwNCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIHJtLEAocjAscm4pICovCisgIHsgMHgwMDA1LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92Lncgcm0sQChyMCxybikgKi8KKyAgeyAweDAwMDYsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YubCBybSxAKHIwLHJuKSAqLworICB7IDB4MDAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbXVsLmwgcm0scm4gKi8KKyAgeyAweDAwMGMsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIEAocjAscm0pLHJuICovCisgIHsgMHgwMDBkLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyBAKHIwLHJtKSxybiAqLworICB7IDB4MDAwZSwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmwgQChyMCxybSkscm4gKi8KKyAgeyAweDAwMGYsIExPQUR8U0VUUzF8U0VUUzJ8U0VUU1NQfFVTRVMxfFVTRVMyfFVTRVNTUCB9LCAvKiBtYWMubCBAcm0rLEBybisgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTBbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGUwMCksIDB4ZmZmZiB9LAorICB7IE1BUCAoc2hfb3Bjb2RlMDEpLCAweGYwZmYgfSwKKyAgeyBNQVAgKHNoX29wY29kZTAyKSwgMHhmMDBmIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTEwW10gPQoreworICB7IDB4MTAwMCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0JLyogbW92Lmwgcm0sQChkaXNwLHJuKSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlMVtdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZTEwKSwgMHhmMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTIwW10gPQoreworICB7IDB4MjAwMCwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YuYiBybSxAcm4gKi8KKyAgeyAweDIwMDEsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92Lncgcm0sQHJuICovCisgIHsgMHgyMDAyLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi5sIHJtLEBybiAqLworICB7IDB4MjAwNCwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92LmIgcm0sQC1ybiAqLworICB7IDB4MjAwNSwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92Lncgcm0sQC1ybiAqLworICB7IDB4MjAwNiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJLyogbW92Lmwgcm0sQC1ybiAqLworICB7IDB4MjAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNTUCB9LAkvKiBkaXYwcyAqLworICB7IDB4MjAwOCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogdHN0IHJtLHJuICovCisgIHsgMHgyMDA5LCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGFuZCBybSxybiAqLworICB7IDB4MjAwYSwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiB4b3Igcm0scm4gKi8KKyAgeyAweDIwMGIsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogb3Igcm0scm4gKi8KKyAgeyAweDIwMGMsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9zdHIgcm0scm4gKi8KKyAgeyAweDIwMGQsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogeHRyY3Qgcm0scm4gKi8KKyAgeyAweDIwMGUsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG11bHUudyBybSxybiAqLworICB7IDB4MjAwZiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9CQkvKiBtdWxzLncgcm0scm4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTJbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGUyMCksIDB4ZjAwZiB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUzMFtdID0KK3sKKyAgeyAweDMwMDAsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9lcSBybSxybiAqLworICB7IDB4MzAwMiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2hzIHJtLHJuICovCisgIHsgMHgzMDAzLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZ2Ugcm0scm4gKi8KKyAgeyAweDMwMDQsIFNFVFNTUCB8IFVTRVNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJLyogZGl2MSBybSxybiAqLworICB7IDB4MzAwNSwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogZG11bHUubCBybSxybiAqLworICB7IDB4MzAwNiwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2hpIHJtLHJuICovCisgIHsgMHgzMDA3LCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZ3Qgcm0scm4gKi8KKyAgeyAweDMwMDgsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogc3ViIHJtLHJuICovCisgIHsgMHgzMDBhLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwgLyogc3ViYyBybSxybiAqLworICB7IDB4MzAwYiwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIHN1YnYgcm0scm4gKi8KKyAgeyAweDMwMGMsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogYWRkIHJtLHJuICovCisgIHsgMHgzMDBkLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBkbXVscy5sIHJtLHJuICovCisgIHsgMHgzMDBlLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwgLyogYWRkYyBybSxybiAqLworICB7IDB4MzAwZiwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0JLyogYWRkdiBybSxybiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlM1tdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZTMwKSwgMHhmMDBmIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQwW10gPQoreworICB7IDB4NDAwMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hsbCBybiAqLworICB7IDB4NDAwMSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hsciBybiAqLworICB7IDB4NDAwMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIG1hY2gsQC1ybiAqLworICB7IDB4NDAwMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNyLEAtcm4gKi8KKyAgeyAweDQwMDQsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHJvdGwgcm4gKi8KKyAgeyAweDQwMDUsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHJvdHIgcm4gKi8KKyAgeyAweDQwMDYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssbWFjaCAqLworICB7IDB4NDAwNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzciAqLworICB7IDB4NDAwOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGwyIHJuICovCisgIHsgMHg0MDA5LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hscjIgcm4gKi8KKyAgeyAweDQwMGEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLG1hY2ggKi8KKyAgeyAweDQwMGIsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGpzciBAcm4gKi8KKyAgeyAweDQwMGUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNyICovCisgIHsgMHg0MDEwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBkdCBybiAqLworICB7IDB4NDAxMSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBjbXAvcHogcm4gKi8KKyAgeyAweDQwMTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBtYWNsLEAtcm4gKi8KKyAgeyAweDQwMTMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBnYnIsQC1ybiAqLworICB7IDB4NDAxNSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBjbXAvcGwgcm4gKi8KKyAgeyAweDQwMTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssbWFjbCAqLworICB7IDB4NDAxNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxnYnIgKi8KKyAgeyAweDQwMTgsIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxsOCBybiAqLworICB7IDB4NDAxOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHI4IHJuICovCisgIHsgMHg0MDFhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxtYWNsICovCisgIHsgMHg0MDFiLCBMT0FEIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHRhcy5iIEBybiAqLworICB7IDB4NDAxZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sZ2JyICovCisgIHsgMHg0MDIwLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGFsIHJuICovCisgIHsgMHg0MDIxLCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiBzaGFyIHJuICovCisgIHsgMHg0MDIyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgcHIsQC1ybiAqLworICB7IDB4NDAyMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHZicixALXJuICovCisgIHsgMHg0MDI0LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHJvdGNsIHJuICovCisgIHsgMHg0MDI1LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHJvdGNyIHJuICovCisgIHsgMHg0MDI2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLHByICovCisgIHsgMHg0MDI3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHZiciAqLworICB7IDB4NDAyOCwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobGwxNiBybiAqLworICB7IDB4NDAyOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHIxNiBybiAqLworICB7IDB4NDAyYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0scHIgKi8KKyAgeyAweDQwMmIsIEJSQU5DSCB8IERFTEFZIHwgVVNFUzEgfSwJCS8qIGptcCBAcm4gKi8KKyAgeyAweDQwMmUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHZiciAqLworICB7IDB4NDAzMywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNzcixALXJuICovCisgIHsgMHg0MDM3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNzciAqLworICB7IDB4NDAzZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3NyICovCisgIHsgMHg0MDQzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgc3BjLEAtcm4gKi8KKyAgeyAweDQwNDcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3BjICovCisgIHsgMHg0MDRlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzcGMgKi8KKyAgeyAweDQwNTIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBmcHVsLEAtcm4gKi8KKyAgeyAweDQwNTYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssZnB1bCAqLworICB7IDB4NDA1YSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMubCBybSxmcHVsICovCisgIHsgMHg0MDYyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgZnBzY3IsQC1ybiAqLworICB7IDB4NDA2NiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxmcHNjciAqLworICB7IDB4NDA2YSwgU0VUU1NQIHwgVVNFUzEgfQkJCS8qIGxkcyBybSxmcHNjciAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNDFbXSA9Cit7CisgIHsgMHg0MDgzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgcnhfYmFuayxALXJuICovCisgIHsgMHg0MDg3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHJ4X2JhbmsgKi8KKyAgeyAweDQwOGUsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZGMgcm0scnhfYmFuayAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNDJbXSA9Cit7CisgIHsgMHg0MDBjLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCQkvKiBzaGFkIHJtLHJuICovCisgIHsgMHg0MDBkLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCQkvKiBzaGxkIHJtLHJuICovCisgIHsgMHg0MDBmLCBMT0FEfFNFVFMxfFNFVFMyfFNFVFNTUHxVU0VTMXxVU0VTMnxVU0VTU1AgfSwgLyogbWFjLncgQHJtKyxAcm4rICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU0W10gPQoreworICB7IE1BUCAoc2hfb3Bjb2RlNDApLCAweGYwZmYgfSwKKyAgeyBNQVAgKHNoX29wY29kZTQxKSwgMHhmMDhmIH0sCisgIHsgTUFQIChzaF9vcGNvZGU0MiksIDB4ZjAwZiB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU1MFtdID0KK3sKKyAgeyAweDUwMDAsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0JLyogbW92LmwgQChkaXNwLHJtKSxybiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNVtdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZTUwKSwgMHhmMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTYwW10gPQoreworICB7IDB4NjAwMCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi5iIEBybSxybiAqLworICB7IDB4NjAwMSwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi53IEBybSxybiAqLworICB7IDB4NjAwMiwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfSwJCS8qIG1vdi5sIEBybSxybiAqLworICB7IDB4NjAwMywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG1vdiBybSxybiAqLworICB7IDB4NjAwNCwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YuYiBAcm0rLHJuICovCisgIHsgMHg2MDA1LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi53IEBybSsscm4gKi8KKyAgeyAweDYwMDYsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LmwgQHJtKyxybiAqLworICB7IDB4NjAwNywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG5vdCBybSxybiAqLworICB7IDB4NjAwOCwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIHN3YXAuYiBybSxybiAqLworICB7IDB4NjAwOSwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIHN3YXAudyBybSxybiAqLworICB7IDB4NjAwYSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMiB8IFVTRVNTUCB9LAkvKiBuZWdjIHJtLHJuICovCisgIHsgMHg2MDBiLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogbmVnIHJtLHJuICovCisgIHsgMHg2MDBjLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0dS5iIHJtLHJuICovCisgIHsgMHg2MDBkLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0dS53IHJtLHJuICovCisgIHsgMHg2MDBlLCBTRVRTMSB8IFVTRVMyIH0sCQkJLyogZXh0cy5iIHJtLHJuICovCisgIHsgMHg2MDBmLCBTRVRTMSB8IFVTRVMyIH0JCQkvKiBleHRzLncgcm0scm4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTZbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGU2MCksIDB4ZjAwZiB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU3MFtdID0KK3sKKyAgeyAweDcwMDAsIFNFVFMxIHwgVVNFUzEgfQkJLyogYWRkICNpbW0scm4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTdbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGU3MCksIDB4ZjAwMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU4MFtdID0KK3sKKyAgeyAweDgwMDAsIFNUT1JFIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LmIgcjAsQChkaXNwLHJuKSAqLworICB7IDB4ODEwMCwgU1RPUkUgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YudyByMCxAKGRpc3Ascm4pICovCisgIHsgMHg4NDAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFUzIgfSwJLyogbW92LmIgQChkaXNwLHJtKSxyMCAqLworICB7IDB4ODUwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVMyIH0sCS8qIG1vdi53IEAoZGlzcCxybikscjAgKi8KKyAgeyAweDg4MDAsIFNFVFNTUCB8IFVTRVNSMCB9LAkJLyogY21wL2VxICNpbW0scjAgKi8KKyAgeyAweDg5MDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJLyogYnQgbGFiZWwgKi8KKyAgeyAweDhiMDAsIEJSQU5DSCB8IFVTRVNTUCB9LAkJLyogYmYgbGFiZWwgKi8KKyAgeyAweDhkMDAsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0sCS8qIGJ0L3MgbGFiZWwgKi8KKyAgeyAweDhmMDAsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0JLyogYmYvcyBsYWJlbCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlOFtdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZTgwKSwgMHhmZjAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTkwW10gPQoreworICB7IDB4OTAwMCwgTE9BRCB8IFNFVFMxIH0JLyogbW92LncgQChkaXNwLHBjKSxybiAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlOVtdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZTkwKSwgMHhmMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWEwW10gPQoreworICB7IDB4YTAwMCwgQlJBTkNIIHwgREVMQVkgfQkvKiBicmEgbGFiZWwgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWFbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGVhMCksIDB4ZjAwMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGViMFtdID0KK3sKKyAgeyAweGIwMDAsIEJSQU5DSCB8IERFTEFZIH0JLyogYnNyIGxhYmVsICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGViW10gPQoreworICB7IE1BUCAoc2hfb3Bjb2RlYjApLCAweGYwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYzBbXSA9Cit7CisgIHsgMHhjMDAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmIgcjAsQChkaXNwLGdicikgKi8KKyAgeyAweGMxMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YudyByMCxAKGRpc3AsZ2JyKSAqLworICB7IDB4YzIwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5sIHIwLEAoZGlzcCxnYnIpICovCisgIHsgMHhjMzAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCQkvKiB0cmFwYSAjaW1tICovCisgIHsgMHhjNDAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YuYiBAKGRpc3AsZ2JyKSxyMCAqLworICB7IDB4YzUwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LncgQChkaXNwLGdicikscjAgKi8KKyAgeyAweGM2MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5sIEAoZGlzcCxnYnIpLHIwICovCisgIHsgMHhjNzAwLCBTRVRTUjAgfSwJCQkJLyogbW92YSBAKGRpc3AscGMpLHIwICovCisgIHsgMHhjODAwLCBTRVRTU1AgfCBVU0VTUjAgfSwJCQkvKiB0c3QgI2ltbSxyMCAqLworICB7IDB4YzkwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogYW5kICNpbW0scjAgKi8KKyAgeyAweGNhMDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIHhvciAjaW1tLHIwICovCisgIHsgMHhjYjAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiBvciAjaW1tLHIwICovCisgIHsgMHhjYzAwLCBMT0FEIHwgU0VUU1NQIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIHRzdC5iICNpbW0sQChyMCxnYnIpICovCisgIHsgMHhjZDAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogYW5kLmIgI2ltbSxAKHIwLGdicikgKi8KKyAgeyAweGNlMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiB4b3IuYiAjaW1tLEAocjAsZ2JyKSAqLworICB7IDB4Y2YwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0JLyogb3IuYiAjaW1tLEAocjAsZ2JyKSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlY1tdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZWMwKSwgMHhmZjAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWQwW10gPQoreworICB7IDB4ZDAwMCwgTE9BRCB8IFNFVFMxIH0JCS8qIG1vdi5sIEAoZGlzcCxwYykscm4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWRbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGVkMCksIDB4ZjAwMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVlMFtdID0KK3sKKyAgeyAweGUwMDAsIFNFVFMxIH0JCS8qIG1vdiAjaW1tLHJuICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVlW10gPQoreworICB7IE1BUCAoc2hfb3Bjb2RlZTApLCAweGYwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZjBbXSA9Cit7CisgIHsgMHhmMDAwLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZhZGQgZm0sZm4gKi8KKyAgeyAweGYwMDEsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZnN1YiBmbSxmbiAqLworICB7IDB4ZjAwMiwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmbXVsIGZtLGZuICovCisgIHsgMHhmMDAzLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZkaXYgZm0sZm4gKi8KKyAgeyAweGYwMDQsIFNFVFNTUCB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmNtcC9lcSBmbSxmbiAqLworICB7IDB4ZjAwNSwgU0VUU1NQIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmY21wL2d0IGZtLGZuICovCisgIHsgMHhmMDA2LCBMT0FEIHwgU0VUU0YxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogZm1vdi5zIEAocjAscm0pLGZuICovCisgIHsgMHhmMDA3LCBTVE9SRSB8IFVTRVMxIHwgVVNFU0YyIHwgVVNFU1IwIH0sCS8qIGZtb3YucyBmbSxAKHIwLHJuKSAqLworICB7IDB4ZjAwOCwgTE9BRCB8IFNFVFNGMSB8IFVTRVMyIH0sCQkvKiBmbW92LnMgQHJtLGZuICovCisgIHsgMHhmMDA5LCBMT0FEIHwgU0VUUzIgfCBTRVRTRjEgfCBVU0VTMiB9LAkvKiBmbW92LnMgQHJtKyxmbiAqLworICB7IDB4ZjAwYSwgU1RPUkUgfCBVU0VTMSB8IFVTRVNGMiB9LAkJLyogZm1vdi5zIGZtLEBybiAqLworICB7IDB4ZjAwYiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU0YyIH0sCS8qIGZtb3YucyBmbSxALXJuICovCisgIHsgMHhmMDBjLCBTRVRTRjEgfCBVU0VTRjIgfSwJCQkvKiBmbW92IGZtLGZuICovCisgIHsgMHhmMDBlLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfCBVU0VTRjAgfQkvKiBmbWFjIGYwLGZtLGZuICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVmMVtdID0KK3sKKyAgeyAweGYwMGQsIFNFVFNGMSB8IFVTRVNTUCB9LAkvKiBmc3RzIGZwdWwsZm4gKi8KKyAgeyAweGYwMWQsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmbGRzIGZuLGZwdWwgKi8KKyAgeyAweGYwMmQsIFNFVFNGMSB8IFVTRVNTUCB9LAkvKiBmbG9hdCBmcHVsLGZuICovCisgIHsgMHhmMDNkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZnRyYyBmbixmcHVsICovCisgIHsgMHhmMDRkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZm5lZyBmbiAqLworICB7IDB4ZjA1ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZhYnMgZm4gKi8KKyAgeyAweGYwNmQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmc3FydCBmbiAqLworICB7IDB4ZjA3ZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZ0c3QvbmFuIGZuICovCisgIHsgMHhmMDhkLCBTRVRTRjEgfSwJCS8qIGZsZGkwIGZuICovCisgIHsgMHhmMDlkLCBTRVRTRjEgfQkJLyogZmxkaTEgZm4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWZbXSA9Cit7CisgIHsgTUFQIChzaF9vcGNvZGVmMCksIDB4ZjAwZiB9LAorICB7IE1BUCAoc2hfb3Bjb2RlZjEpLCAweGYwZmYgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9tYWpvcl9vcGNvZGUgc2hfb3Bjb2Rlc1tdID0KK3sKKyAgeyBNQVAgKHNoX29wY29kZTApIH0sCisgIHsgTUFQIChzaF9vcGNvZGUxKSB9LAorICB7IE1BUCAoc2hfb3Bjb2RlMikgfSwKKyAgeyBNQVAgKHNoX29wY29kZTMpIH0sCisgIHsgTUFQIChzaF9vcGNvZGU0KSB9LAorICB7IE1BUCAoc2hfb3Bjb2RlNSkgfSwKKyAgeyBNQVAgKHNoX29wY29kZTYpIH0sCisgIHsgTUFQIChzaF9vcGNvZGU3KSB9LAorICB7IE1BUCAoc2hfb3Bjb2RlOCkgfSwKKyAgeyBNQVAgKHNoX29wY29kZTkpIH0sCisgIHsgTUFQIChzaF9vcGNvZGVhKSB9LAorICB7IE1BUCAoc2hfb3Bjb2RlYikgfSwKKyAgeyBNQVAgKHNoX29wY29kZWMpIH0sCisgIHsgTUFQIChzaF9vcGNvZGVkKSB9LAorICB7IE1BUCAoc2hfb3Bjb2RlZSkgfSwKKyAgeyBNQVAgKHNoX29wY29kZWYpIH0KK307CisKKy8qIEdpdmVuIGFuIGluc3RydWN0aW9uLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICBzaF9vcGNvZGUgc3RydWN0dXJlLiAgUmV0dXJuIE5VTEwgaWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdAorICAgcmVjb2duaXplZC4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICoKK3NoX2luc25faW5mbyAoaW5zbikKKyAgICAgdW5zaWduZWQgaW50IGluc247Cit7CisgIGNvbnN0IHN0cnVjdCBzaF9tYWpvcl9vcGNvZGUgKm1hajsKKyAgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSAqbWluLCAqbWluZW5kOworCisgIG1haiA9ICZzaF9vcGNvZGVzWyhpbnNuICYgMHhmMDAwKSA+PiAxMl07CisgIG1pbiA9IG1hai0+bWlub3Jfb3Bjb2RlczsKKyAgbWluZW5kID0gbWluICsgbWFqLT5jb3VudDsKKyAgZm9yICg7IG1pbiA8IG1pbmVuZDsgbWluKyspCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGw7CisgICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcCwgKm9wZW5kOworCisgICAgICBsID0gaW5zbiAmIG1pbi0+bWFzazsKKyAgICAgIG9wID0gbWluLT5vcGNvZGVzOworICAgICAgb3BlbmQgPSBvcCArIG1pbi0+Y291bnQ7CisKKyAgICAgIC8qIFNpbmNlIHRoZSBvcGNvZGVzIHRhYmxlcyBhcmUgc29ydGVkLCB3ZSBjb3VsZCB1c2UgYSBiaW5hcnkKKyAgICAgICAgIHNlYXJjaCBoZXJlIGlmIHRoZSBjb3VudCB3ZXJlIGFib3ZlIHNvbWUgY3V0b2ZmIHZhbHVlLiAgKi8KKyAgICAgIGZvciAoOyBvcCA8IG9wZW5kOyBvcCsrKQorCWlmIChvcC0+b3Bjb2RlID09IGwpCisJICByZXR1cm4gb3A7CisgICAgfQorCisgIHJldHVybiBOVUxMOyAgCit9CisKKy8qIFNlZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIHVzZXMgYSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorc2hfaW5zbl91c2VzX3JlZyAoaW5zbiwgb3AsIHJlZykKKyAgICAgdW5zaWduZWQgaW50IGluc247CisgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOworICAgICB1bnNpZ25lZCBpbnQgcmVnOworeworICB1bnNpZ25lZCBpbnQgZjsKKworICBmID0gb3AtPmZsYWdzOworCisgIGlmICgoZiAmIFVTRVMxKSAhPSAwCisgICAgICAmJiAoKGluc24gJiAweDBmMDApID4+IDgpID09IHJlZykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChmICYgVVNFUzIpICE9IDAKKyAgICAgICYmICgoaW5zbiAmIDB4MDBmMCkgPj4gNCkgPT0gcmVnKQorICAgIHJldHVybiB0cnVlOworICBpZiAoKGYgJiBVU0VTUjApICE9IDAKKyAgICAgICYmIHJlZyA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLyogU2VlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NoX2luc25fdXNlc19mcmVnIChpbnNuLCBvcCwgZnJlZykKKyAgICAgdW5zaWduZWQgaW50IGluc247CisgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wOworICAgICB1bnNpZ25lZCBpbnQgZnJlZzsKK3sKKyAgdW5zaWduZWQgaW50IGY7CisKKyAgZiA9IG9wLT5mbGFnczsKKworICAvKiBXZSBjYW4ndCB0ZWxsIGlmIHRoaXMgaXMgYSBkb3VibGUtcHJlY2lzaW9uIGluc24sIHNvIGp1c3QgcGxheSBzYWZlCisgICAgIGFuZCBhc3N1bWUgdGhhdCBpdCBtaWdodCBiZS4gIFNvIG5vdCBvbmx5IGhhdmUgd2UgdGVzdCBGUkVHIGFnYWluc3QKKyAgICAgaXRzZWxmLCBidXQgYWxzbyBldmVuIEZSRUcgYWdhaW5zdCBGUkVHKzEgLSBpZiB0aGUgdXNpbmcgaW5zbiB1c2VzCisgICAgIGp1c3QgdGhlIGxvdyBwYXJ0IG9mIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSAtIGJ1dCBhbHNvIGFuIG9kZAorICAgICBGUkVHIGFnYWluc3QgRlJFRy0xIC0gIGlmIHRoZSBzZXR0aW5nIGluc24gc2V0cyBqdXN0IHRoZSBsb3cgcGFydAorICAgICBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUuCisgICAgIFNvIHdoYXQgdGhpcyBhbGwgYm9pbHMgZG93biB0byBpcyB0aGF0IHdlIGhhdmUgdG8gaWdub3JlIHRoZSBsb3dlc3QKKyAgICAgYml0IG9mIHRoZSByZWdpc3RlciBudW1iZXIuICAqLworICAgICAKKyAgaWYgKChmICYgVVNFU0YxKSAhPSAwCisgICAgICAmJiAoKGluc24gJiAweDBlMDApID4+IDgpID09IChmcmVnICYgMHhlKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChmICYgVVNFU0YyKSAhPSAwCisgICAgICAmJiAoKGluc24gJiAweDAwZTApID4+IDQpID09IChmcmVnICYgMHhlKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChmICYgVVNFU0YwKSAhPSAwCisgICAgICAmJiBmcmVnID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBTZWUgd2hldGhlciBpbnN0cnVjdGlvbnMgSTEgYW5kIEkyIGNvbmZsaWN0LCBhc3N1bWluZyBJMSBjb21lcworICAgYmVmb3JlIEkyLiAgT1AxIGFuZCBPUDIgYXJlIHRoZSBjb3JyZXNwb25kaW5nIHNoX29wY29kZSBzdHJ1Y3R1cmVzLgorICAgVGhpcyBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSBjb25mbGljdCwgb3IgZmFsc2UgaWYgdGhlCisgICBpbnN0cnVjdGlvbnMgY2FuIGJlIHN3YXBwZWQgc2FmZWx5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NoX2luc25zX2NvbmZsaWN0IChpMSwgb3AxLCBpMiwgb3AyKQorICAgICB1bnNpZ25lZCBpbnQgaTE7CisgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMTsKKyAgICAgdW5zaWduZWQgaW50IGkyOworICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDI7Cit7CisgIHVuc2lnbmVkIGludCBmMSwgZjI7CisKKyAgZjEgPSBvcDEtPmZsYWdzOworICBmMiA9IG9wMi0+ZmxhZ3M7CisKKyAgLyogTG9hZCBvZiBmcHNjciBjb25mbGljdHMgd2l0aCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgorICAgICBGSVhNRTogc2hvdWxkbid0IHRlc3QgcmF3IG9wY29kZXMgaGVyZS4gICovCisgIGlmICgoKGkxICYgMHhmMGZmKSA9PSAweDQwNjYgJiYgKGkyICYgMHhmMDAwKSA9PSAweGYwMDApCisgICAgICB8fCAoKGkyICYgMHhmMGZmKSA9PSAweDQwNjYgJiYgKGkxICYgMHhmMDAwKSA9PSAweGYwMDApKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICgoZjEgJiAoQlJBTkNIIHwgREVMQVkpKSAhPSAwCisgICAgICB8fCAoZjIgJiAoQlJBTkNIIHwgREVMQVkpKSAhPSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICgoZjEgJiBTRVRTU1ApICE9IDAgJiYgKGYyICYgVVNFU1NQKSAhPSAwKQorICAgIHJldHVybiB0cnVlOworICBpZiAoKGYyICYgU0VUU1NQKSAhPSAwICYmIChmMSAmIFVTRVNTUCkgIT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoKGYxICYgU0VUUzEpICE9IDAKKyAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIChpMSAmIDB4MGYwMCkgPj4gOCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICgoZjEgJiBTRVRTMikgIT0gMAorICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwMGYwKSA+PiA0KSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChmMSAmIFNFVFNSMCkgIT0gMAorICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgMCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICgoZjEgJiBTRVRTRjEpICE9IDAKKyAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICgoZjIgJiBTRVRTMSkgIT0gMAorICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTEsIG9wMSwgKGkyICYgMHgwZjAwKSA+PiA4KSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChmMiAmIFNFVFMyKSAhPSAwCisgICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMSwgb3AxLCAoaTIgJiAweDAwZjApID4+IDQpKQorICAgIHJldHVybiB0cnVlOworICBpZiAoKGYyICYgU0VUU1IwKSAhPSAwCisgICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMSwgb3AxLCAwKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChmMiAmIFNFVFNGMSkgIT0gMAorICAgICAgJiYgc2hfaW5zbl91c2VzX2ZyZWcgKGkxLCBvcDEsIChpMiAmIDB4MGYwMCkgPj4gOCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogVGhlIGluc3RydWN0aW9ucyBkbyBub3QgY29uZmxpY3QuICAqLworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIEkxIGlzIGEgbG9hZCBpbnN0cnVjdGlvbiwgYW5kIEkyIGlzIHNvbWUgb3RoZXIgaW5zdHJ1Y3Rpb24uICBSZXR1cm4KKyAgIHRydWUgaWYgSTEgbG9hZHMgYSByZWdpc3RlciB3aGljaCBJMiB1c2VzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NoX2xvYWRfdXNlIChpMSwgb3AxLCBpMiwgb3AyKQorICAgICB1bnNpZ25lZCBpbnQgaTE7CisgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wMTsKKyAgICAgdW5zaWduZWQgaW50IGkyOworICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDI7Cit7CisgIHVuc2lnbmVkIGludCBmMTsKKworICBmMSA9IG9wMS0+ZmxhZ3M7CisKKyAgaWYgKChmMSAmIExPQUQpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIElmIGJvdGggU0VUUzEgYW5kIFNFVFNTUCBhcmUgc2V0LCB0aGF0IG1lYW5zIGEgbG9hZCB0byBhIHNwZWNpYWwKKyAgICAgcmVnaXN0ZXIgdXNpbmcgcG9zdGluY3JlbWVudCBhZGRyZXNzaW5nIG1vZGUsIHdoaWNoIHdlIGRvbid0IGNhcmUKKyAgICAgYWJvdXQgaGVyZS4gICovCisgIGlmICgoZjEgJiBTRVRTMSkgIT0gMAorICAgICAgJiYgKGYxICYgU0VUU1NQKSA9PSAwCisgICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICgoZjEgJiBTRVRTUjApICE9IDAKKyAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIDApKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICgoZjEgJiBTRVRTRjEpICE9IDAKKyAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLyogVHJ5IHRvIGFsaWduIGxvYWRzIGFuZCBzdG9yZXMgd2l0aGluIGEgc3BhbiBvZiBtZW1vcnkuICBUaGlzIGlzCisgICBjYWxsZWQgYnkgYm90aCB0aGUgRUxGIGFuZCB0aGUgQ09GRiBzaCB0YXJnZXRzLiAgQUJGRCBhbmQgU0VDIGFyZQorICAgdGhlIEJGRCBhbmQgc2VjdGlvbiB3ZSBhcmUgZXhhbWluaW5nLiAgQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9mCisgICB0aGUgc2VjdGlvbi4gIFNXQVAgaXMgdGhlIHJvdXRpbmUgdG8gY2FsbCB0byBzd2FwIHR3byBpbnN0cnVjdGlvbnMuCisgICBSRUxPQ1MgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCB0byBiZQorICAgcGFzc2VkIHRvIFNXQVAuICBQTEFCRUwgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxhYmVsIGluIGEKKyAgIHNvcnRlZCBsaXN0IG9mIGxhYmVsczsgTEFCRUxfRU5EIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBTVEFSVCBhbmQKKyAgIFNUT1AgYXJlIHRoZSByYW5nZSBvZiBtZW1vcnkgdG8gZXhhbWluZS4gIElmIGEgc3dhcCBpcyBtYWRlLAorICAgKlBTV0FQUEVEIGlzIHNldCB0byB0cnVlLiAgKi8KKworYm9vbGVhbgorX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHN3YXAsIHJlbG9jcywKKwkJCSBwbGFiZWwsIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYm9vbGVhbiAoKnN3YXApIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKKyAgICAgUFRSIHJlbG9jczsKKyAgICAgYmZkX3ZtYSAqKnBsYWJlbDsKKyAgICAgYmZkX3ZtYSAqbGFiZWxfZW5kOworICAgICBiZmRfdm1hIHN0YXJ0OworICAgICBiZmRfdm1hIHN0b3A7CisgICAgIGJvb2xlYW4gKnBzd2FwcGVkOworeworICBiZmRfdm1hIGk7CisKKyAgLyogSW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBhbGlnbmVkIG9uIDIgYnl0ZSBib3VuZGFyaWVzLiAgKi8KKyAgaWYgKChzdGFydCAmIDEpID09IDEpCisgICAgKytzdGFydDsKKworICAvKiBOb3cgbG9vayB0aHJvdWdoIHRoZSB1bmFsaWduZWQgYWRkcmVzc2VzLiAgKi8KKyAgaSA9IHN0YXJ0OworICBpZiAoKGkgJiAyKSA9PSAwKQorICAgIGkgKz0gMjsKKyAgZm9yICg7IGkgPCBzdG9wOyBpICs9IDQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGluc247CisgICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKKyAgICAgIHVuc2lnbmVkIGludCBwcmV2X2luc24gPSAwOworICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqcHJldl9vcCA9IE5VTEw7CisKKyAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkpOworICAgICAgb3AgPSBzaF9pbnNuX2luZm8gKGluc24pOworICAgICAgaWYgKG9wID09IE5VTEwKKwkgIHx8IChvcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogVGhpcyBpcyBhIGxvYWQgb3Igc3RvcmUgd2hpY2ggaXMgbm90IG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KKworICAgICAgd2hpbGUgKCpwbGFiZWwgPCBsYWJlbF9lbmQgJiYgKipwbGFiZWwgPCBpKQorCSsrKnBsYWJlbDsKKworICAgICAgaWYgKGkgPiBzdGFydCkKKwl7CisJICBwcmV2X2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgLSAyKTsKKwkgIHByZXZfb3AgPSBzaF9pbnNuX2luZm8gKHByZXZfaW5zbik7CisKKwkgIC8qIElmIHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGlzIGluIGEgZGVsYXkgc2xvdCwgd2UKKwkgICAgIGNhbid0IHN3YXAuICAqLworCSAgaWYgKHByZXZfb3AgPT0gTlVMTAorCSAgICAgIHx8IChwcmV2X29wLT5mbGFncyAmIERFTEFZKSAhPSAwKQorCSAgICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoaSA+IHN0YXJ0CisJICAmJiAoKnBsYWJlbCA+PSBsYWJlbF9lbmQgfHwgKipwbGFiZWwgIT0gaSkKKwkgICYmIHByZXZfb3AgIT0gTlVMTAorCSAgJiYgKHByZXZfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKKwkgICYmICEgc2hfaW5zbnNfY29uZmxpY3QgKHByZXZfaW5zbiwgcHJldl9vcCwgaW5zbiwgb3ApKQorCXsKKwkgIGJvb2xlYW4gb2s7CisKKwkgIC8qIFRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIGRvZXMgbm90IGhhdmUgYSBsYWJlbCwgYW5kCisJICAgICB0aGVyZSBpcyBhIHByZXZpb3VzIGluc3RydWN0aW9uOyBQUkVWX0lOU04gaXMgbm90CisJICAgICBpdHNlbGYgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLCBhbmQgUFJFVl9JTlNOIGFuZAorCSAgICAgSU5TTiBkbyBub3QgY29uZmxpY3QuICAqLworCisJICBvayA9IHRydWU7CisKKwkgIGlmIChpID49IHN0YXJ0ICsgNCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBwcmV2Ml9pbnNuOworCSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnByZXYyX29wOworCisJICAgICAgcHJldjJfaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaSAtIDQpOworCSAgICAgIHByZXYyX29wID0gc2hfaW5zbl9pbmZvIChwcmV2Ml9pbnNuKTsKKworCSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgUFJFVl9JTlNOIGhhcyBhIGRlbGF5CisJCSBzbG90LS10aGF0IGlzLCBQUkVWX0lOU04gaXMgaW4gYSBkZWxheSBzbG90LS13ZQorCQkgY2FuIG5vdCBzd2FwLiAgKi8KKwkgICAgICBpZiAocHJldjJfb3AgPT0gTlVMTAorCQkgIHx8IChwcmV2Ml9vcC0+ZmxhZ3MgJiBERUxBWSkgIT0gMCkKKwkJb2sgPSBmYWxzZTsKKworCSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgUFJFVl9JTlNOIGlzIGEgbG9hZCwKKwkJIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIgd2hpY2ggSU5TTiB1c2VzLCB0aGVuCisJCSBwdXR0aW5nIElOU04gaW1tZWRpYXRlbHkgYWZ0ZXIgUFJFVl9JTlNOIHdpbGwKKwkJIGNhdXNlIGEgcGlwZWxpbmUgYnViYmxlLCBzbyB0aGVyZSBpcyBubyBwb2ludCB0bworCQkgbWFraW5nIHRoZSBzd2FwLiAgKi8KKwkgICAgICBpZiAob2sKKwkJICAmJiAocHJldjJfb3AtPmZsYWdzICYgTE9BRCkgIT0gMAorCQkgICYmIHNoX2xvYWRfdXNlIChwcmV2Ml9pbnNuLCBwcmV2Ml9vcCwgaW5zbiwgb3ApKQorCQlvayA9IGZhbHNlOworCSAgICB9CisKKwkgIGlmIChvaykKKwkgICAgeworCSAgICAgIGlmICghICgqc3dhcCkgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgaSAtIDIpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgKnBzd2FwcGVkID0gdHJ1ZTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKworICAgICAgd2hpbGUgKCpwbGFiZWwgPCBsYWJlbF9lbmQgJiYgKipwbGFiZWwgPCBpICsgMikKKwkrKypwbGFiZWw7CisKKyAgICAgIGlmIChpICsgMiA8IHN0b3AKKwkgICYmICgqcGxhYmVsID49IGxhYmVsX2VuZCB8fCAqKnBsYWJlbCAhPSBpICsgMikpCisJeworCSAgdW5zaWduZWQgaW50IG5leHRfaW5zbjsKKwkgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm5leHRfb3A7CisKKwkgIC8qIFRoZXJlIGlzIGFuIGluc3RydWN0aW9uIGFmdGVyIHRoZSBsb2FkL3N0b3JlCisJICAgICBpbnN0cnVjdGlvbiwgYW5kIGl0IGRvZXMgbm90IGhhdmUgYSBsYWJlbC4gICovCisJICBuZXh0X2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgKyAyKTsKKwkgIG5leHRfb3AgPSBzaF9pbnNuX2luZm8gKG5leHRfaW5zbik7CisJICBpZiAobmV4dF9vcCAhPSBOVUxMCisJICAgICAgJiYgKG5leHRfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKKwkgICAgICAmJiAhIHNoX2luc25zX2NvbmZsaWN0IChpbnNuLCBvcCwgbmV4dF9pbnNuLCBuZXh0X29wKSkKKwkgICAgeworCSAgICAgIGJvb2xlYW4gb2s7CisKKwkgICAgICAvKiBORVhUX0lOU04gaXMgbm90IGl0c2VsZiBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sCisJCSBhbmQgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBJTlNOLiAgKi8KKworCSAgICAgIG9rID0gdHJ1ZTsKKworCSAgICAgIC8qIElmIFBSRVZfSU5TTiBpcyBhIGxvYWQsIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIKKwkJIHdoaWNoIE5FWFRfSU5TTiB1c2VzLCB0aGVuIHB1dHRpbmcgTkVYVF9JTlNOCisJCSBpbW1lZGlhdGVseSBhZnRlciBQUkVWX0lOU04gd2lsbCBjYXVzZSBhIHBpcGVsaW5lCisJCSBidWJibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYWtlIHRoaXMgc3dhcC4gICovCisJICAgICAgaWYgKHByZXZfb3AgIT0gTlVMTAorCQkgICYmIChwcmV2X29wLT5mbGFncyAmIExPQUQpICE9IDAKKwkJICAmJiBzaF9sb2FkX3VzZSAocHJldl9pbnNuLCBwcmV2X29wLCBuZXh0X2luc24sIG5leHRfb3ApKQorCQlvayA9IGZhbHNlOworCisJICAgICAgLyogSWYgSU5TTiBpcyBhIGxvYWQsIGFuZCBpdCBzZXRzIGEgcmVnaXN0ZXIgd2hpY2gKKwkJIHRoZSBpbnNuIGFmdGVyIE5FWFRfSU5TTiB1c2VzLCB0aGVuIGRvaW5nIHRoZQorCQkgc3dhcCB3aWxsIGNhdXNlIGEgcGlwZWxpbmUgYnViYmxlLCBzbyB0aGVyZSBpcyBubworCQkgcmVhc29uIHRvIG1ha2UgdGhlIHN3YXAuICBIb3dldmVyLCBpZiB0aGUgaW5zbgorCQkgYWZ0ZXIgTkVYVF9JTlNOIGlzIGl0c2VsZiBhIGxvYWQgb3Igc3RvcmUKKwkJIGluc3RydWN0aW9uLCB0aGVuIGl0IGlzIG1pc2FsaWduZWQsIHNvCisJCSBvcHRpbWlzdGljYWxseSBob3BlIHRoYXQgaXQgd2lsbCBiZSBzd2FwcGVkCisJCSBpdHNlbGYsIGFuZCBqdXN0IGxpdmUgd2l0aCB0aGUgcGlwZWxpbmUgYnViYmxlIGlmCisJCSBpdCBpc24ndC4gICovCisJICAgICAgaWYgKG9rCisJCSAgJiYgaSArIDQgPCBzdG9wCisJCSAgJiYgKG9wLT5mbGFncyAmIExPQUQpICE9IDApCisJCXsKKwkJICB1bnNpZ25lZCBpbnQgbmV4dDJfaW5zbjsKKwkJICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpuZXh0Ml9vcDsKKworCQkgIG5leHQyX2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgKyA0KTsKKwkJICBuZXh0Ml9vcCA9IHNoX2luc25faW5mbyAobmV4dDJfaW5zbik7CisJCSAgaWYgKChuZXh0Ml9vcC0+ZmxhZ3MgJiAoTE9BRCB8IFNUT1JFKSkgPT0gMAorCQkgICAgICAmJiBzaF9sb2FkX3VzZSAoaW5zbiwgb3AsIG5leHQyX2luc24sIG5leHQyX29wKSkKKwkJICAgIG9rID0gZmFsc2U7CisJCX0KKworCSAgICAgIGlmIChvaykKKwkJeworCQkgIGlmICghICgqc3dhcCkgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgaSkpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgKnBzd2FwcGVkID0gdHJ1ZTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayBmb3IgbG9hZHMgYW5kIHN0b3JlcyB3aGljaCB3ZSBjYW4gYWxpZ24gdG8gZm91ciBieXRlCisgICBib3VuZGFyaWVzLiAgU2VlIHRoZSBsb25nZXIgY29tbWVudCBhYm92ZSBzaF9yZWxheF9zZWN0aW9uIGZvciB3aHkKKyAgIHRoaXMgaXMgZGVzaXJhYmxlLiAgVGhpcyBzZXRzICpQU1dBUFBFRCBpZiBzb21lIGluc3RydWN0aW9uIHdhcworICAgc3dhcHBlZC4gICovCisKK3N0YXRpYyBib29sZWFuCitzaF9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCBwc3dhcHBlZCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBib29sZWFuICpwc3dhcHBlZDsKK3sKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKKyAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKKyAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7CisKKyAgKnBzd2FwcGVkID0gZmFsc2U7CisKKyAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisKKyAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLworICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7CisgIGlmIChsYWJlbHMgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgbGFiZWxfZW5kID0gbGFiZWxzOworICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisgICAgeworICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0xBQkVMKQorCXsKKwkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7CisJICArK2xhYmVsX2VuZDsKKwl9CisgICAgfQorCisgIC8qIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIGN1cnJlbnRseSBhbHdheXMgb3V0cHV0cyByZWxvY3MgaW4KKyAgICAgYWRkcmVzcyBvcmRlci4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbCBuZWVkIHRvIHNvcnQKKyAgICAgdGhlIGxhYmVsIHZhbHVlcyBhbmQgdGhlIHJlbG9jcy4gICovCisKKyAgbGFiZWwgPSBsYWJlbHM7CisKKyAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGJmZF92bWEgc3RhcnQsIHN0b3A7CisKKyAgICAgIGlmIChpcmVsLT5yX3R5cGUgIT0gUl9TSF9DT0RFKQorCWNvbnRpbnVlOworCisgICAgICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKKworICAgICAgZm9yIChpcmVsKys7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisJaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0RBVEEpCisJICBicmVhazsKKyAgICAgIGlmIChpcmVsIDwgaXJlbGVuZCkKKwlzdG9wID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOworICAgICAgZWxzZQorCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKKworICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX3N3YXBfaW5zbnMsCisJCQkJICAgICAoUFRSKSBpbnRlcm5hbF9yZWxvY3MsICZsYWJlbCwKKwkJCQkgICAgIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgZnJlZSAobGFiZWxzKTsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGxhYmVscyAhPSBOVUxMKQorICAgIGZyZWUgKGxhYmVscyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogU3dhcCB0d28gU0ggaW5zdHJ1Y3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NoX3N3YXBfaW5zbnMgKGFiZmQsIHNlYywgcmVsb2NzLCBjb250ZW50cywgYWRkcikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBQVFIgcmVsb2NzOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopIHJlbG9jczsKKyAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOworCisgIC8qIFN3YXAgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgKi8KKyAgaTEgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIpOworICBpMiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOworICBiZmRfcHV0XzE2IChhYmZkLCBpMiwgY29udGVudHMgKyBhZGRyKTsKKyAgYmZkX3B1dF8xNiAoYWJmZCwgaTEsIGNvbnRlbnRzICsgYWRkciArIDIpOworCisgIC8qIEFkanVzdCBhbGwgcmVsb2MgYWRkcmVzc2VzLiAgKi8KKyAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKKyAgICB7CisgICAgICBpbnQgdHlwZSwgYWRkOworCisgICAgICAvKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCB0eXBlcyBvZiByZWxvY3MgdGhhdCB3ZSBkb24ndCB3YW50IHRvCisgICAgICAgICBhZGp1c3QuICBUaGVzZSByZWxvY3MgZG8gbm90IGFwcGx5IHRvIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsCisgICAgICAgICBidXQgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLiAgKi8KKyAgICAgIHR5cGUgPSBpcmVsLT5yX3R5cGU7CisgICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCisJICB8fCB0eXBlID09IFJfU0hfQ09ERQorCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKKwkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKKwljb250aW51ZTsKKworICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZworICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcworICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAorICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZworICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCisgICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KKyAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKKwl7CisJICBiZmRfdm1hIG9mZjsKKworCSAgb2ZmID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hICsgNCArIGlyZWwtPnJfb2Zmc2V0OworCSAgaWYgKG9mZiA9PSBhZGRyKQorCSAgICBpcmVsLT5yX29mZnNldCArPSAyOworCSAgZWxzZSBpZiAob2ZmID09IGFkZHIgKyAyKQorCSAgICBpcmVsLT5yX29mZnNldCAtPSAyOworCX0KKworICAgICAgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSBhZGRyKQorCXsKKwkgIGlyZWwtPnJfdmFkZHIgKz0gMjsKKwkgIGFkZCA9IC0yOworCX0KKyAgICAgIGVsc2UgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSBhZGRyICsgMikKKwl7CisJICBpcmVsLT5yX3ZhZGRyIC09IDI7CisJICBhZGQgPSAyOworCX0KKyAgICAgIGVsc2UKKwlhZGQgPSAwOworCisgICAgICBpZiAoYWRkICE9IDApCisJeworCSAgYmZkX2J5dGUgKmxvYzsKKwkgIHVuc2lnbmVkIHNob3J0IGluc24sIG9pbnNuOworCSAgYm9vbGVhbiBvdmVyZmxvdzsKKworCSAgbG9jID0gY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7CisJICBvdmVyZmxvdyA9IGZhbHNlOworCSAgc3dpdGNoICh0eXBlKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX1NIX1BDRElTUDhCWTI6CisJICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTI6CisJICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7CisJICAgICAgb2luc24gPSBpbnNuOworCSAgICAgIGluc24gKz0gYWRkIC8gMjsKKwkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCisJCW92ZXJmbG93ID0gdHJ1ZTsKKwkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9QQ0RJU1A6CisJICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7CisJICAgICAgb2luc24gPSBpbnNuOworCSAgICAgIGluc24gKz0gYWRkIC8gMjsKKwkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCisJCW92ZXJmbG93ID0gdHJ1ZTsKKwkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6CisJICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKKyAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCisgICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCisgICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCisgICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKKyAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCisJICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKKwkJeworCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOworCQkgIG9pbnNuID0gaW5zbjsKKwkJICBpbnNuICs9IGFkZCAvIDI7CisJCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQorCQkgICAgb3ZlcmZsb3cgPSB0cnVlOworCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7CisJCX0KKworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChvdmVyZmxvdykKKwkgICAgeworCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgICAgKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIsCisJCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBUaGlzIGlzIGEgbW9kaWZpY2F0aW9uIG9mIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHdoaWNoCisgICB3aWxsIGhhbmRsZSBTSCByZWxheGluZy4gICovCisKK3N0YXRpYyBib29sZWFuCitzaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAorCQkgICAgIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKKyAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKKyAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKK3sKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGxvbmcgc3ltbmR4OworICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOworICAgICAgYmZkX3ZtYSBhZGRlbmQ7CisgICAgICBiZmRfdm1hIHZhbDsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OworCisgICAgICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0CisgICAgICAgICBiZSBkb25lIGZvciB0aGVtLCBpdCBoYXMgYmVlbiBkb25lIGluIHNoX3JlbGF4X3NlY3Rpb24uICAqLworICAgICAgaWYgKHJlbC0+cl90eXBlICE9IFJfU0hfSU1NMzIKKwkgICYmIHJlbC0+cl90eXBlICE9IFJfU0hfUENESVNQKQorCWNvbnRpbnVlOworCisgICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OworCisgICAgICBpZiAoc3ltbmR4ID09IC0xKQorCXsKKwkgIGggPSBOVUxMOworCSAgc3ltID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeyAgICAKKwkgIGlmIChzeW1uZHggPCAwCisJICAgICAgfHwgKHVuc2lnbmVkIGxvbmcpIHN5bW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKKwkgICAgeworCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkoIiVzOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIiwKKwkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHN5bW5keCk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOworCSAgc3ltID0gc3ltcyArIHN5bW5keDsKKwl9CisKKyAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKKwlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKKyAgICAgIGVsc2UKKwlhZGRlbmQgPSAwOworCisgICAgICBpZiAocmVsLT5yX3R5cGUgPT0gUl9TSF9QQ0RJU1ApCisJYWRkZW5kIC09IDQ7CisKKyAgICAgIGlmIChyZWwtPnJfdHlwZSA+PSBTSF9DT0ZGX0hPV1RPX0NPVU5UKQorCWhvd3RvID0gTlVMTDsKKyAgICAgIGVsc2UKKwlob3d0byA9ICZzaF9jb2ZmX2hvd3Rvc1tyZWwtPnJfdHlwZV07CisKKyAgICAgIGlmIChob3d0byA9PSBOVUxMKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgdmFsID0gMDsKKworICAgICAgaWYgKGggPT0gTlVMTCkKKwl7CisJICBhc2VjdGlvbiAqc2VjOworCisJICAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciBhbiBpbnRlcm5hbCBQQ0RJU1AgcmVsb2MuICAqLworCSAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKHN5bW5keCA9PSAtMSkKKwkgICAgeworCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICAgICAgdmFsID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKKyAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgKyBzeW0tPm5fdmFsdWUKKwkJICAgICAtIHNlYy0+dm1hKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2VjOworCisJICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisKKyAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQljb250ZW50cywKKwkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAorCQkJCQl2YWwsIGFkZGVuZCk7CisKKyAgICAgIHN3aXRjaCAocnN0YXQpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCisJICAgIGlmIChzeW1uZHggPT0gLTEpCisJICAgICAgbmFtZSA9ICIqQUJTKiI7CisJICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkgICAgZWxzZSBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCisJCSAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQorCSAgICAgIG5hbWUgPSBvYmpfY29mZl9zdHJpbmdzIChpbnB1dF9iZmQpICsgc3ltLT5fbi5fbl9uLl9uX29mZnNldDsKKwkgICAgZWxzZQorCSAgICAgIHsKKyAJCXN0cm5jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7CisJCWJ1ZltTWU1OTUxFTl0gPSAnXDAnOworCQluYW1lID0gYnVmOworCSAgICAgIH0KKworCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCisJCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisgICB3aGljaCB1c2VzIHNoX3JlbG9jYXRlX3NlY3Rpb24uICAqLworCitzdGF0aWMgYmZkX2J5dGUgKgorc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKKwkJCQkJZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247CisgIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisgIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmludGVybmFsX3N5bXMgPSBOVUxMOworCisgIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCisgICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCisgIGlmIChyZWxvY2F0ZWFibGUKKyAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pID09IE5VTEwKKyAgICAgIHx8IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5jb250ZW50cyA9PSBOVUxMKQorICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKKwkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAorCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKKwkJCQkJCSAgICAgICBzeW1ib2xzKTsKKworICBtZW1jcHkgKGRhdGEsIGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLT5jb250ZW50cywKKwkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7CisKKyAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAorICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOworICAgICAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7CisgICAgICBhc2VjdGlvbiAqKnNlY3BwOworCisgICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKKwkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBmYWxzZSwgKGJmZF9ieXRlICopIE5VTEwsCisJCQkgIGZhbHNlLCAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpKTsKKyAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQorCQkgICAgICAgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKKwkJCQkgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKKyAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKQorCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOworICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKKyAgICAgIHNlY3BwID0gc2VjdGlvbnM7CisgICAgICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7CisgICAgICBlc3ltZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc3ltZXN6OworICAgICAgd2hpbGUgKGVzeW0gPCBlc3ltZW5kKQorCXsKKwkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIChQVFIpIGlzeW1wKTsKKworCSAgaWYgKGlzeW1wLT5uX3NjbnVtICE9IDApCisJICAgICpzZWNwcCA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+bl9zY251bSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoaXN5bXAtPm5fdmFsdWUgPT0gMCkKKwkJKnNlY3BwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgICAgICBlbHNlCisJCSpzZWNwcCA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICAgIH0KKworCSAgZXN5bSArPSAoaXN5bXAtPm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7CisJICBzZWNwcCArPSBpc3ltcC0+bl9udW1hdXggKyAxOworCSAgaXN5bXAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKKwl9CisKKyAgICAgIGlmICghIHNoX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAorCQkJCSBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCisJCQkJIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgZnJlZSAoc2VjdGlvbnMpOworICAgICAgc2VjdGlvbnMgPSBOVUxMOworICAgICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7CisgICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKKyAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7CisgICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gZGF0YTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7CisgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCisgICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7CisgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQorICAgIGZyZWUgKHNlY3Rpb25zKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRoZSB0YXJnZXQgdmVjdG9ycy4gICovCisKK2NvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3ZlYyA9Cit7CisgICJjb2ZmLXNoIiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KKyAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KKworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSksCisKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCisgICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKworICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKKworY29uc3QgYmZkX3RhcmdldCBzaGxjb2ZmX3ZlYyA9Cit7CisgICJjb2ZmLXNobCIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKKyAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKKyAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUsCit9OworCisvKiBTb21lIHBlb3BsZSB3YW50IHZlcnNpb25zIG9mIHRoZSBTSCBDT0ZGIHRhcmdldCB3aGljaCBkbyBub3QgYWxpZ24KKyAgIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4gIFdlIGltcGxlbWVudCB0aGF0IGJ5IGFkZGluZyBhIGNvdXBsZSBvZiBuZXcKKyAgIHRhcmdldCB2ZWN0b3JzLiAgVGhlc2UgYXJlIGp1c3QgbGlrZSB0aGUgb25lcyBhYm92ZSwgYnV0IHRoZXkKKyAgIGNoYW5nZSB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudC4gIFRvIGdlbmVyYXRlIHRoZW0gaW4gdGhlCisgICBhc3NlbWJsZXIsIHVzZSAtc21hbGwuICBUbyB1c2UgdGhlbSBpbiB0aGUgbGlua2VyLCB1c2UgLWIKKyAgIGNvZmYtc2h7bH0tc21hbGwgYW5kIC1vZm9ybWF0IGNvZmYtc2h7bH0tc21hbGwuCisKKyAgIFllcywgdGhpcyBpcyBhIGhvcnJpYmxlIGhhY2suICBBIGdlbmVyYWwgc29sdXRpb24gZm9yIHNldHRpbmcKKyAgIHNlY3Rpb24gYWxpZ25tZW50IGluIENPRkYgaXMgcmF0aGVyIGNvbXBsZXguICBFTEYgaGFuZGxlcyB0aGlzCisgICBjb3JyZWN0bHkuICAqLworCisvKiBPbmx5IHJlY29nbml6ZSB0aGUgc21hbGwgdmVyc2lvbnMgaWYgdGhlIHRhcmdldCB3YXMgbm90IGRlZmF1bHRlZC4KKyAgIE90aGVyd2lzZSB3ZSB3b24ndCByZWNvZ25pemUgdGhlIG5vbiBkZWZhdWx0IGVuZGlhbm5lc3MuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitjb2ZmX3NtYWxsX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChhYmZkLT50YXJnZXRfZGVmYXVsdGVkKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Cit9CisKKy8qIFNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgZm9yIHRoZSBzbWFsbCB2ZXJzaW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3NtYWxsX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGlmICghIGNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFdlIG11c3QgYWxpZ24gdG8gYXQgbGVhc3QgYSBmb3VyIGJ5dGUgYm91bmRhcnksIGJlY2F1c2UgbG9uZ3dvcmQKKyAgICAgYWNjZXNzZXMgbXVzdCBiZSBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCisgIGlmIChzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPT0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKQorICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgY29waWVkIGZyb20gYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUgc28gdGhhdCB3ZSBjYW4gY2hhbmdlCisgICB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCBwb3dlci4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfY29mZl9iYWNrZW5kX2RhdGEgYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSA9Cit7CisgIGNvZmZfc3dhcF9hdXhfaW4sIGNvZmZfc3dhcF9zeW1faW4sIGNvZmZfc3dhcF9saW5lbm9faW4sCisgIGNvZmZfc3dhcF9hdXhfb3V0LCBjb2ZmX3N3YXBfc3ltX291dCwKKyAgY29mZl9zd2FwX2xpbmVub19vdXQsIGNvZmZfc3dhcF9yZWxvY19vdXQsCisgIGNvZmZfc3dhcF9maWxlaGRyX291dCwgY29mZl9zd2FwX2FvdXRoZHJfb3V0LAorICBjb2ZmX3N3YXBfc2NuaGRyX291dCwKKyAgRklMSFNaLCBBT1VUU1osIFNDTkhTWiwgU1lNRVNaLCBBVVhFU1osIFJFTFNaLCBMSU5FU1osCisjaWZkZWYgQ09GRl9MT05HX0ZJTEVOQU1FUworICB0cnVlLAorI2Vsc2UKKyAgZmFsc2UsCisjZW5kaWYKKyNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworICB0cnVlLAorI2Vsc2UKKyAgZmFsc2UsCisjZW5kaWYKKyAgMiwKKyAgY29mZl9zd2FwX2ZpbGVoZHJfaW4sIGNvZmZfc3dhcF9hb3V0aGRyX2luLCBjb2ZmX3N3YXBfc2NuaGRyX2luLAorICBjb2ZmX3N3YXBfcmVsb2NfaW4sIGNvZmZfYmFkX2Zvcm1hdF9ob29rLCBjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKKyAgY29mZl9ta29iamVjdF9ob29rLCBzdHlwX3RvX3NlY19mbGFncywgY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssCisgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLCBzeW1uYW1lX2luX2RlYnVnX2hvb2ssIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaywKKyAgY29mZl9wcmludF9hdXgsIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcywgY29mZl9yZWxvYzE2X2VzdGltYXRlLAorICBjb2ZmX3N5bV9pc19nbG9iYWwsIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAorICBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmssIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiwgY29mZl9ydHlwZV90b19ob3d0bywKKyAgY29mZl9hZGp1c3Rfc3ltbmR4LCBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wsCisgIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuLCBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAorfTsKKworI2RlZmluZSBjb2ZmX3NtYWxsX2Nsb3NlX2FuZF9jbGVhbnVwIFwKKyAgY29mZl9jbG9zZV9hbmRfY2xlYW51cAorI2RlZmluZSBjb2ZmX3NtYWxsX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFwKKyAgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbworI2RlZmluZSBjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCisgIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKK2NvbnN0IGJmZF90YXJnZXQgc2hjb2ZmX3NtYWxsX3ZlYyA9Cit7CisgICJjb2ZmLXNoLXNtYWxsIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKKworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKKyAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLworCisgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQorfTsKKworY29uc3QgYmZkX3RhcmdldCBzaGxjb2ZmX3NtYWxsX3ZlYyA9Cit7CisgICJjb2ZmLXNobC1zbWFsbCIsCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgZW5kaWFuIHRvbyovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAorICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisKKyAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX3NtYWxsX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LCAgIAorICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmX3NtYWxsKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpICZiZmRfY29mZl9zbWFsbF9zd2FwX3RhYmxlCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3BhcmMuYyBiL2JmZC9jb2ZmLXNwYXJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyY2YxNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLXNwYXJjLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgU3BhcmMgQ09GRiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiY29mZi9zcGFyYy5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKKyNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQorCisjZGVmaW5lIEJBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gU1BBUkNNQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBMWU5YQ09GRk1BR0lDKQorCisvKiBUaGUgcGFnZSBzaXplIGlzIGEgZ3Vlc3MgYmFzZWQgb24gRUxGLiAgKi8KKyNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwMAorCitlbnVtIHJlbG9jX3R5cGUKKyAgeworICAgIFJfU1BBUkNfTk9ORSA9IDAsCisgICAgUl9TUEFSQ184LAkJUl9TUEFSQ18xNiwJCVJfU1BBUkNfMzIsIAorICAgIFJfU1BBUkNfRElTUDgsCVJfU1BBUkNfRElTUDE2LAkJUl9TUEFSQ19ESVNQMzIsIAorICAgIFJfU1BBUkNfV0RJU1AzMCwJUl9TUEFSQ19XRElTUDIyLAorICAgIFJfU1BBUkNfSEkyMiwJUl9TUEFSQ18yMiwKKyAgICBSX1NQQVJDXzEzLAkJUl9TUEFSQ19MTzEwLAorICAgIFJfU1BBUkNfR09UMTAsCVJfU1BBUkNfR09UMTMsCQlSX1NQQVJDX0dPVDIyLAorICAgIFJfU1BBUkNfUEMxMCwJUl9TUEFSQ19QQzIyLAorICAgIFJfU1BBUkNfV1BMVDMwLAorICAgIFJfU1BBUkNfQ09QWSwKKyAgICBSX1NQQVJDX0dMT0JfREFULAlSX1NQQVJDX0pNUF9TTE9ULAorICAgIFJfU1BBUkNfUkVMQVRJVkUsCisgICAgUl9TUEFSQ19VQTMyLAorICAgIFJfU1BBUkNfbWF4CisgIH07CisKKyNpZiAwCitzdGF0aWMgQ09OU1QgY2hhciAqQ09OU1QgcmVsb2NfdHlwZV9uYW1lc1tdID0KK3sKKyAgIlJfU1BBUkNfTk9ORSIsCisgICJSX1NQQVJDXzgiLAkJIlJfU1BBUkNfMTYiLAkJIlJfU1BBUkNfMzIiLAorICAiUl9TUEFSQ19ESVNQOCIsCSJSX1NQQVJDX0RJU1AxNiIsCSJSX1NQQVJDX0RJU1AzMiIsCisgICJSX1NQQVJDX1dESVNQMzAiLAkiUl9TUEFSQ19XRElTUDIyIiwKKyAgIlJfU1BBUkNfSEkyMiIsCSJSX1NQQVJDXzIyIiwKKyAgIlJfU1BBUkNfMTMiLAkJIlJfU1BBUkNfTE8xMCIsCisgICJSX1NQQVJDX0dPVDEwIiwJIlJfU1BBUkNfR09UMTMiLAkiUl9TUEFSQ19HT1QyMiIsCisgICJSX1NQQVJDX1BDMTAiLAkiUl9TUEFSQ19QQzIyIiwKKyAgIlJfU1BBUkNfV1BMVDMwIiwKKyAgIlJfU1BBUkNfQ09QWSIsCisgICJSX1NQQVJDX0dMT0JfREFUIiwJIlJfU1BBUkNfSk1QX1NMT1QiLAorICAiUl9TUEFSQ19SRUxBVElWRSIsCisgICJSX1NQQVJDX1VBMzIiLAorfTsKKyNlbmRpZgorCisvKiBUaGlzIGlzIHN0b2xlbiBwcmV0dHkgZGlyZWN0bHkgZnJvbSBlbGYuYy4gICovCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitiZmRfY29mZl9nZW5lcmljX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAorCQkJCWFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQlvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKK30KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgY29mZl9zcGFyY19ob3d0b190YWJsZVtdID0gCit7CisgIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzgsICAgICAgIDAsMCwgOCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgIDAsMCwgOCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgMCwyLDMyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAyLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfR09UMjIsICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0NPUFksICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCit9OworCitzdHJ1Y3QgY29mZl9yZWxvY19tYXAgeworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBjb2ZmX3JlbG9jX3ZhbDsKK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgY29mZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQoreworICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAorICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKKyAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAorICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzMyIH0sIC8qIEBAIEFzc3VtZXMgMzIgYml0cy4gICovCisgIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCisgIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAorICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKKyAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAorICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAorICAvKiAgeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2NvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHVuc2lnbmVkIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgY29mZl9yZWxvY19tYXApOyBpKyspCisgICAgeworICAgICAgaWYgKHNwYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisJcmV0dXJuICZjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5jb2ZmX3JlbG9jX3ZhbF07CisgICAgfQorICByZXR1cm4gMDsKK30KKyNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cAorCitzdGF0aWMgdm9pZAorcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQorICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OworeworICBCRkRfQVNTRVJUIChkc3QtPnJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlW2RzdC0+cl90eXBlXTsKK30KKworI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKKworI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVAliZmRfaF9nZXRfMzIKKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCWJmZF9oX3B1dF8zMgorI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpIFwKKyAgY2FjaGVfcHRyLT5hZGRlbmQgPSByZWxvYy5yX29mZnNldDsKKworLyogQ2xlYXIgdGhlIHJfc3BhcmUgZmllbGQgaW4gcmVsb2NzLiAgKi8KKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxzcmMsZHN0KSBcCisgIGRvIHsgXAorICAgICAgIGRzdC0+cl9zcGFyZVswXSA9IDA7IFwKKyAgICAgICBkc3QtPnJfc3BhcmVbMV0gPSAwOyBcCisgICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19BX01BR0lDX1NFVF9fCisKKy8qIEVuYWJsZSBTcGFyYy1zcGVjaWZpYyBoYWNrcyBpbiBjb2ZmY29kZS5oLiAqLworCisjZGVmaW5lIENPRkZfU1BBUkMKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKK2NvbnN0IGJmZF90YXJnZXQKKyNpZmRlZiBUQVJHRVRfU1lNCisgIFRBUkdFVF9TWU0gPQorI2Vsc2UKKyAgc3BhcmNjb2ZmX3ZlYyA9CisjZW5kaWYKK3sKKyNpZmRlZiBUQVJHRVRfTkFNRQorICBUQVJHRVRfTkFNRSwKKyNlbHNlCisgICJjb2ZmLXNwYXJjIiwJCQkvKiBuYW1lICovCisjZW5kaWYKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCisgIEJGRF9FTkRJQU5fQklHLAkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KKworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKworLyogTm90ZSB0aGF0IHdlIGFsbG93IGFuIG9iamVjdCBmaWxlIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb3JlIGZpbGUgYXMgd2VsbC4gKi8KKyAgICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIGNvZmZfb2JqZWN0X3B9LAorICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgICAgYmZkX2ZhbHNlfSwKKyAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN0Z28zMi5jIGIvYmZkL2NvZmYtc3RnbzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3MjRmZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLXN0Z28zMi5jCkBAIC0wLDAgKzEsNDY0IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzIChnbzMyIHZhcmlhbnQgd2l0aCBhIHN0dWIpLgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFJvYmVydCBIb2VobmUuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhhbmRsZXMgbm93IGFsc28gc3R1YmJlZCBjb2ZmIGltYWdlcy4gVGhlIHN0dWIgaXMgYSBzbWFsbAorICAgRE9TIGV4ZWN1dGFibGUgcHJvZ3JhbSBiZWZvcmUgdGhlIGNvZmYgaW1hZ2UgdG8gbG9hZCBpdCBpbiBtZW1vcnkKKyAgIGFuZCBleGVjdXRlIGl0LiBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBET1MgY2Fubm90IHJ1biBjb2ZmIGZpbGVzLgorCisgICBBbGwgdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucworICAgZnJvbSBjb2Zmc3dhcC5oLgorICAgVGhlIG9ubHkgdGhpbmcgd2hhdCB0aGV5IGRvIGlzIHRvIGFkanVzdCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluCisgICB0aGUgQ09GRiBmaWxlIHdoaWNoIGFyZSBvZmZzZXQgaW50byB0aGUgZmlsZS4KKyAgIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERKR1BQIHVzZXMgYSB2ZXJ5IHNwZWNpYWwgd2F5IHRvIGxvYWQgYW5kIHJ1bgorICAgdGhlIGNvZmYgaW1hZ2UuIEl0IGxvYWRzIHRoZSBpbWFnZSBpbiBtZW1vcnkgYW5kIGFzc3VtZXMgdGhlbiwgdGhhdCB0aGUKKyAgIGltYWdlIGhhZCBubyBzdHViIGJ5IHVzaW5nIHRoZSBmaWxlcG9pbnRlcnMgYXMgcG9pbnRlcnMgaW4gdGhlIGNvZmYKKyAgIGltYWdlIGFuZCBOT1QgaW4gdGhlIGZpbGUuCisKKyAgIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgZXhpc3RpbmcgZXhlY3V0YWJsZXMgSSBoYXZlIGZpeGVkIHRoaXMKKyAgIGhlcmUgYW5kIE5PVCBpbiB0aGUgREpHUFAgc3RhcnR1cCBjb2RlLgorICovCisKKyNkZWZpbmUgVEFSR0VUX1NZTQkJZ28zMnN0dWJiZWRjb2ZmX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMi1leGUiCisjZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJworI2RlZmluZSBDT0ZGX0dPMzJfRVhFCisKKyNpbmNsdWRlICJiZmQuaCIKKworLyogQXQgZmlyc3QgdGhlIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FkanVzdF9maWxlaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIHNyYywgUFRSIGRzdCkpOworc3RhdGljIHZvaWQKK2FkanVzdF9maWxlaGRyX291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7CitzdGF0aWMgdm9pZAorYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7CisKK3N0YXRpYyB2b2lkCithZGp1c3Rfc2NuaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dCwgUFRSIGluKSk7CitzdGF0aWMgdm9pZAorYWRqdXN0X3Njbmhkcl9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOworc3RhdGljIHZvaWQKK2FkanVzdF9zY25oZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7CisKK3N0YXRpYyB2b2lkCithZGp1c3RfYXV4X2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dDEsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAorCQkJICAgIGludCBudW1hdXgsIFBUUiBpbjEpKTsKK3N0YXRpYyB2b2lkCithZGp1c3RfYXV4X291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGlucCwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCisJCQkgICAgaW50IG51bWF1eCwgUFRSIGV4dHApKTsKK3N0YXRpYyB2b2lkCithZGp1c3RfYXV4X291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbnAsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAorCQkJICAgICBpbnQgbnVtYXV4LCBQVFIgZXh0cCkpOworCitzdGF0aWMgdm9pZAorY3JlYXRlX2dvMzJfc3R1YiBQQVJBTVMgKChiZmQgKiBhYmZkKSk7CisKKy8qCisgICBBbGwgdGhhdCAuLi5fUFJFIGFuZCAuLi5QT1NUIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGNvZmZfc3dhcC4uLiBmdW5jdGlvbnMuIFRoZSAuLi5QUkUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZworICAgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgLi4uUE9TVCBmdW5jdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3dhcCByb3V0aW5lcy4KKyAqLworCisjZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBhZGp1c3RfZmlsZWhkcl9pbl9wb3N0CisjZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSBhZGp1c3RfZmlsZWhkcl9vdXRfcHJlCisjZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QKKworI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBhZGp1c3Rfc2NuaGRyX2luX3Bvc3QKKyNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYWRqdXN0X3Njbmhkcl9vdXRfcHJlCisjZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCBhZGp1c3Rfc2NuaGRyX291dF9wb3N0CisKKyNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgYWRqdXN0X2F1eF9pbl9wb3N0CisjZGVmaW5lIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFkanVzdF9hdXhfb3V0X3ByZQorI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgYWRqdXN0X2F1eF9vdXRfcG9zdAorCitzdGF0aWMgYm9vbGVhbgorICBnbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqIGliZmQsIGJmZCAqIG9iZmQpKTsKKworI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQorCisjaW5jbHVkZSAiY29mZi1pMzg2LmMiCisKKy8qIEkgaG9sZCBpbiB0aGUgdXNyZGF0YSB0aGUgc3R1YiAqLworI2RlZmluZSBiZmRfY29mZl9nbzMyc3R1YiBiZmRfdXNyZGF0YQorCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQsIGJlY2F1c2UgSSBjYW5ub3QgYXNzdW1lIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCisgICBob3N0IHN5c3RlbSAqLworI2RlZmluZSBfSChpbmRleCkgKGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikoaGVhZGVyK2luZGV4KjIpKSkKKworLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGJmZCBpcyBhIHN0dWJiZWQgY29mZiBpbWFnZSAqLworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorZ28zMl9zdHViYmVkX2NvZmZfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOworICBjaGFyIG1hZ2ljWzhdOworICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKKworICBpZiAoYmZkX3JlYWQgKCZoZWFkZXIsIDEsIHNpemVvZiAoaGVhZGVyKSwgYWJmZCkgIT0gc2l6ZW9mIChoZWFkZXIpKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKF9IICgwKSAhPSAweDVhNGQpCQkvKiBpdCBpcyBub3QgYW4gZXhlIGZpbGUuIG1heWJlIGEgY29mZi1pbWFnZSAqLworICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgY29mZl9zdGFydCA9IChsb25nKSBfSCAoMikgKiA1MTJMOworICBpZiAoX0ggKDEpKQorICAgIGNvZmZfc3RhcnQgKz0gKGxvbmcpIF9IICgxKSAtIDUxMkw7CisKKyAgLyogV2UgY2FuIGhhbmRsZSBvbmx5IGEgc3R1YiB3aXRoIGEgbGVuZ3RoIG9mIFNUVUJTSVpFICovCisgIGlmIChjb2ZmX3N0YXJ0ICE9IFNUVUJTSVpFKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBleGVfc3RhcnQgPSBfSCAoNCkgKiAxNjsKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiAwOworICBpZiAoYmZkX3JlYWQgKCZtYWdpYywgMSwgOCwgYWJmZCkgIT0gOCkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChtZW1jbXAgKG1hZ2ljLCAiZ28zMnN0dWIiLCA4KSAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiAwOworCisgIC8qIENhbGwgdGhlIG5vcm1hbCBDT0ZGIGRldGVjdGlvbiByb3V0aW5lICovCisgIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKK30KKworLyogVGhlc2UgYnl0ZXMgYXJlIGEgMjA0OC1ieXRlIERPUyBleGVjdXRhYmxlLCB3aGljaCBsb2FkcyB0aGUgQ09GRgorICAgaW1hZ2UgaW50byBtZW1vcnkgYW5kIHRoZW4gcnVucyBpdC4gSXQgaXMgY2FsbGVkICdzdHViJyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzdHViX2J5dGVzW1NUVUJTSVpFXSA9Cit7CisjaW5jbHVkZSAiZ28zMnN0dWIuaCIKK307CisKKy8qCisgICBJIGhhdmUgbm90IGNvbW1lbnRlZCBlYWNoIHN3YXAgZnVuY3Rpb24gYmVsb3csIGJlY2F1c2UgdGhlCisgICB0ZWNobmlxdWUgaXMgaW4gYW55IGZ1bmN0aW9uIHRoZSBzYW1lLiBGb3IgdGhlIC4uLmluIGZ1bmN0aW9uLAorICAgYWxsIHRoZSBwb2ludGVycyBhcmUgYWRqdXN0ZWQgYnkgYWRkaW5nIFNUVUJTSVpFIGFuZCBmb3IgdGhlCisgICAuLi5vdXQgZnVuY3Rpb24sIGl0IGlzIHN1YnRyYWN0ZWQgZmlyc3QgYW5kIGFmdGVyIGNhbGxpbmcgdGhlCisgICBzdGFuZGFyZCBzd2FwIGZ1bmN0aW9uIGl0IGlzIHJlc2V0IHRvIHRoZSBvbGQgdmFsdWUgKi8KKworLyogVGhpcyBtYWNybyBpcyB1c2VkIGZvciBhZGp1c3RpbmcgdGhlIGZpbGVwb2ludGVycywgd2hpY2gKKyAgIGlzIGRvbmUgb25seSwgaWYgdGhlIHBvaW50ZXIgaXMgbm9uemVybyAqLworCisjZGVmaW5lIEFESlVTVF9WQUwodmFsLGRpZmYpIFwKKyAgaWYgKHZhbCAhPSAwKSB2YWwgKz0gZGlmZgorCitzdGF0aWMgdm9pZAorYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdCAgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBzcmM7CisgICAgIFBUUiBkc3Q7Cit7CisgIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKKyAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKKworICBBREpVU1RfVkFMIChmaWxlaGRyX2RzdC0+Zl9zeW1wdHIsIFNUVUJTSVpFKTsKKworICAvKiBTYXZlIG5vdyB0aGUgc3R1YiB0byBiZSB1c2VkIGxhdGVyICovCisgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgU1RVQlNJWkUpOworCisgIC8qIFNpbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBubyBzdGF0dXMsIEkgZG8gbm90IHNldCBoZXJlCisgICAgIGFueSBiZmRfZXJyb3JfLi4uCisgICAgIFRoYXQgbWVhbnMsIGJlZm9yZSB0aGUgdXNlIG9mIGJmZF9jb2ZmX2dvMzJzdHViICgpLCB0aGlzIHZhbHVlCisgICAgIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzICE9IE5VTEwgKi8KKyAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGZpbGVoZHJfc3JjLT5zdHViLCBTVFVCU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkCithZGp1c3RfZmlsZWhkcl9vdXRfcHJlICAoYWJmZCwgaW4sIG91dCkKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgaW47CisgICAgIFBUUiBvdXQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGluOworICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKSBvdXQ7CisKKyAgLyogR2VuZXJhdGUgdGhlIHN0dWIgKi8KKyAgY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCk7CisKKyAgLyogQ29weSB0aGUgc3R1YiB0byB0aGUgZmlsZSBoZWFkZXIgKi8KKyAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSAhPSBOVUxMKQorICAgIG1lbWNweSAoZmlsZWhkcl9vdXQtPnN0dWIsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgU1RVQlNJWkUpOworICBlbHNlCisgICAgLyogdXNlIHRoZSBkZWZhdWx0ICovCisgICAgbWVtY3B5IChmaWxlaGRyX291dC0+c3R1Yiwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOworCisgIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCAtU1RVQlNJWkUpOworfQorCitzdGF0aWMgdm9pZAorYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgIChhYmZkLCBpbiwgb3V0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBpbjsKKyAgICAgUFRSIG91dDsKK3sKKyAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgaW47CisgIC8qIHVuZG8gdGhlIGFib3ZlIGNoYW5nZSAqLworICBBREpVU1RfVkFMIChmaWxlaGRyX2luLT5mX3N5bXB0ciwgU1RVQlNJWkUpOworfQorCitzdGF0aWMgdm9pZAorYWRqdXN0X3Njbmhkcl9pbl9wb3N0ICAoYWJmZCwgZXh0LCBpbikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZXh0OworICAgICBQVFIgaW47Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKKworICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgU1RVQlNJWkUpOworICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgU1RVQlNJWkUpOworICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIFNUVUJTSVpFKTsKK30KKworc3RhdGljIHZvaWQKK2FkanVzdF9zY25oZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGluOworICAgICBQVFIgb3V0OworeworICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47CisKKyAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIC1TVFVCU0laRSk7CisgIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCAtU1RVQlNJWkUpOworICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIC1TVFVCU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkCithZGp1c3Rfc2NuaGRyX291dF9wb3N0IChhYmZkLCBpbiwgb3V0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBpbjsKKyAgICAgUFRSIG91dDsKK3sKKyAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOworCisgIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCBTVFVCU0laRSk7CisgIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCBTVFVCU0laRSk7CisgIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgU1RVQlNJWkUpOworfQorCitzdGF0aWMgdm9pZAorYWRqdXN0X2F1eF9pbl9wb3N0ICAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBleHQxOworICAgICBpbnQgdHlwZTsKKyAgICAgaW50IGNsYXNzOworICAgICBpbnQgaW5keDsKKyAgICAgaW50IG51bWF1eDsKKyAgICAgUFRSIGluMTsKK3sKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikgaW4xOworCisgIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQorICAgIHsKKyAgICAgIEFESlVTVF9WQUwgKGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIFNUVUJTSVpFKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGp1c3RfYXV4X291dF9wcmUgIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGlucDsKKyAgICAgaW50IHR5cGU7CisgICAgIGludCBjbGFzczsKKyAgICAgaW50IGluZHg7CisgICAgIGludCBudW1hdXg7CisgICAgIFBUUiBleHRwOworeworICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7CisKKyAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCisgICAgeworICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgLVNUVUJTSVpFKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGp1c3RfYXV4X291dF9wb3N0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGlucDsKKyAgICAgaW50IHR5cGU7CisgICAgIGludCBjbGFzczsKKyAgICAgaW50IGluZHg7CisgICAgIGludCBudW1hdXg7CisgICAgIFBUUiBleHRwOworeworICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7CisKKyAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCisgICAgeworICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgU1RVQlNJWkUpOworICAgIH0KK30KKworLyoKKyAgIFRoYXQncyB0aGUgZnVuY3Rpb24sIHdoaWNoIGNyZWF0ZXMgdGhlIHN0dWIuIFRoZXJlIGFyZQorICAgZGlmZmVyZW50IGNhc2VzIGZyb20gd2hlcmUgdGhlIHN0dWIgaXMgdGFrZW4uCisgICBBdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgaXMgY2hlY2tlZCBhbmQgdGhlbgorICAgJChTVFVCKSBpZiBpdCB3YXMgbm90IHNldC4KKyAgIElmIGl0IGV4aXN0cyBhbmQgcG9pbnRzIHRvIGEgdmFsaWQgc3R1YiB0aGUgc3R1YiBpcyB0YWtlbiBmcm9tCisgICB0aGF0IGZpbGUuIFRoaXMgZmlsZSBjYW4gYmUgYWxzbyBhIHdob2xlIGV4ZWN1dGFibGUgZmlsZSwgYmVjYXVzZQorICAgdGhlIHN0dWIgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZXhlIGluZm9ybWF0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGF0CisgICBmaWxlLgorCisgICBJZiB0aGVyZSB3YXMgYW55IGVycm9yLCB0aGUgc3RhbmRhcmQgc3R1YiAoY29tcGlsZWQgaW4gdGhpcyBmaWxlKQorICAgaXMgdGFrZW4uCisgKi8KKworc3RhdGljIHZvaWQKK2NyZWF0ZV9nbzMyX3N0dWIgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgLyogRG8gaXQgb25seSBvbmNlICovCisgIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpzdHViOworICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICBpbnQgZjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzEwXTsKKyAgICAgIGNoYXIgbWFnaWNbOF07CisgICAgICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKKworICAgICAgLyogQ2hlY2sgYXQgZmlyc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICQoR08zMlNUVUIpICovCisgICAgICBzdHViID0gZ2V0ZW52ICgiR08zMlNUVUIiKTsKKyAgICAgIC8qIE5vdyBjaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChTVFVCKSAqLworICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKKwlzdHViID0gZ2V0ZW52ICgiU1RVQiIpOworICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKKwlnb3RvIHN0dWJfZW5kOworICAgICAgaWYgKHN0YXQgKHN0dWIsICZzdCkgIT0gMCkKKwlnb3RvIHN0dWJfZW5kOworI2lmZGVmIE9fQklOQVJZCisgICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisjZWxzZQorICAgICAgZiA9IG9wZW4gKHN0dWIsIE9fUkRPTkxZKTsKKyNlbmRpZgorICAgICAgaWYgKGYgPCAwKQorCWdvdG8gc3R1Yl9lbmQ7CisgICAgICBpZiAocmVhZCAoZiwgJmhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKSA8IDApCisJeworCSAgY2xvc2UgKGYpOworCSAgZ290byBzdHViX2VuZDsKKwl9CisgICAgICBpZiAoX0ggKDApICE9IDB4NWE0ZCkJLyogaXQgaXMgbm90IGFuIGV4ZSBmaWxlICovCisJeworCSAgY2xvc2UgKGYpOworCSAgZ290byBzdHViX2VuZDsKKwl9CisgICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzdHViIChpdCBpcyBldmVyeSB0aGluZyB1cAorICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29mZiBpbWFnZSkgKi8KKyAgICAgIGNvZmZfc3RhcnQgPSAobG9uZykgX0ggKDIpICogNTEyTDsKKyAgICAgIGlmIChfSCAoMSkpCisJY29mZl9zdGFydCArPSAobG9uZykgX0ggKDEpIC0gNTEyTDsKKworICAgICAgLyogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgYSBmaXhlZCBzdHViIHNpemUgb2YgMjA0OCBieXRlcworICAgICAgICAgc3VwcG9ydGVkICovCisgICAgICBpZiAoY29mZl9zdGFydCAhPSAyMDQ4KQorCXsKKwkgIGNsb3NlIChmKTsKKwkgIGdvdG8gc3R1Yl9lbmQ7CisJfQorICAgICAgZXhlX3N0YXJ0ID0gX0ggKDQpICogMTY7CisgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGxzZWVrIChmLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSBleGVfc3RhcnQpCisJeworCSAgY2xvc2UgKGYpOworCSAgZ290byBzdHViX2VuZDsKKwl9CisgICAgICBpZiAocmVhZCAoZiwgJm1hZ2ljLCA4KSAhPSA4KQorCXsKKwkgIGNsb3NlIChmKTsKKwkgIGdvdG8gc3R1Yl9lbmQ7CisJfQorICAgICAgaWYgKG1lbWNtcCAobWFnaWMsICJnbzMyc3R1YiIsIDgpICE9IDApCisJeworCSAgY2xvc2UgKGYpOworCSAgZ290byBzdHViX2VuZDsKKwl9CisgICAgICAvKiBOb3cgd2UgZm91bmQgYSBjb3JyZWN0IHN0dWIgKGhvcGVmdWxseSkgKi8KKyAgICAgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgY29mZl9zdGFydCk7CisgICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCisJeworCSAgY2xvc2UgKGYpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGxzZWVrIChmLCAwTCwgU0VFS19TRVQpOworICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSByZWFkIChmLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGNvZmZfc3RhcnQpCisJICAhPSBjb2ZmX3N0YXJ0KQorCXsKKwkgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkpOworCSAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gTlVMTDsKKwl9CisgICAgICBjbG9zZSAoZik7CisgICAgfQorc3R1Yl9lbmQ6CisgIC8qIFRoZXJlIHdhcyBzb21ldGhpbmcgd3JvbmcgYWJvdmUsIHNvIHVzZSBub3cgdGhlIHN0YW5kYXJkIGJ1aWx0aW4KKyAgICAgc3R1YiAqLworICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCisgICAgeworICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBTVFVCU0laRSk7CisgICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCisJeworCSAgcmV0dXJuOworCX0KKworICAgICAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIHN0dWJfYnl0ZXMsIFNUVUJTSVpFKTsKKyAgICB9Cit9CisKKy8qIElmIGliZmQgd2FzIGEgc3R1YmJlZCBjb2ZmIGltYWdlLCBjb3B5IHRoZSBzdHViIGZyb20gdGhhdCBiZmQKKyAgIHRvIHRoZSBuZXcgb2JmZC4KKyAqLworCitzdGF0aWMgYm9vbGVhbgorZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworeworICAvKiBjaGVjayBpZiBib3RoIGFyZSB0aGUgc2FtZSB0YXJnZXRzICovCisgIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogY2hlY2sgaWYgYm90aCBoYXZlIGEgdmFsaWQgc3R1YiAqLworICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGliZmQpID09IE5VTEwKKyAgICAgIHx8IGJmZF9jb2ZmX2dvMzJzdHViIChvYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIE5vdyBjb3B5IHRoZSBzdHViICovCisgIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpLCBiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCksIFNUVUJTSVpFKTsKKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN2bTY4ay5jIGIvYmZkL2NvZmYtc3ZtNjhrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyYTVhNwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLXN2bTY4ay5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgc3lzdjY4CisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9TWU0JbTY4a3N5c3Zjb2ZmX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLXN5c3YiCisjZGVmaW5lIFNUQVRJQ19SRUxPQ1MKKyNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECisKKyNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXRpYzMwLmMgYi9iZmQvY29mZi10aWMzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjhjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi10aWMzMC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBjb2ZmIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJjb2ZmL3RpYzMwLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCisKK3JlbG9jX2hvd3RvX3R5cGUgdGljMzBfY29mZl9ob3d0b190YWJsZVtdID0KK3sKKyAgSE9XVE8gKFJfVElDMzBfQUJTMTYsIDIsIDEsIDE2LCBmYWxzZSwgMCwgMCwgTlVMTCwKKwkgIjE2IiwgZmFsc2UsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIGZhbHNlKSwKKyAgSE9XVE8gKFJfVElDMzBfQUJTMjQsIDIsIDIsIDI0LCBmYWxzZSwgOCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCisJICIyNCIsIGZhbHNlLCAweEZGRkZGRjAwLCAweEZGRkZGRjAwLCBmYWxzZSksCisgIEhPV1RPIChSX1RJQzMwX0xEUCwgMTgsIDAsIDI0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIE5VTEwsCisJICJMRFAiLCBmYWxzZSwgMHgwMEZGMDAwMCwgMHgwMDAwMDBGRiwgZmFsc2UpLAorICBIT1dUTyAoUl9USUMzMF9BQlMzMiwgMiwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKKwkgIjMyIiwgZmFsc2UsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIGZhbHNlKSwKKyAgSE9XVE8gKFJfVElDMzBfUEMxNiwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgTlVMTCwKKwkgIlBDUkVMIiwgZmFsc2UsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIGZhbHNlKSwKKyAgey0xfQorfTsKKworI2lmbmRlZiBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCB0aWMzMF9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCisKKy8qIEZvciB0aGUgY2FzZSBzdGF0ZW1lbnQgdXNlIHRoZSBjb2RlIHZhbHVlcyB1c2VkIGluIHRjX2dlbl9yZWxvYyB0bworICAgbWFwIHRvIHRoZSBob3d0byB0YWJsZSBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhvc2UgaW4gYm90aCB0aGUgYW91dAorICAgYW5kIGNvZmYgaW1wbGVtZW50YXRpb25zLiAqLworcmVsb2NfaG93dG9fdHlwZSAqCit0aWMzMF9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgIGNhc2UgQkZEX1JFTE9DXzg6CisgICAgY2FzZSBCRkRfUkVMT0NfVElDMzBfTERQOgorICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzJdOworICAgIGNhc2UgQkZEX1JFTE9DXzE2OgorICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzBdOworICAgIGNhc2UgQkZEX1JFTE9DXzI0OgorICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzFdOworICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgorICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzRdOworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgICAgcmV0dXJuICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzNdOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLworCitzdGF0aWMgaW50Citjb2ZmX3RpYzMwX3NlbGVjdF9yZWxvYyAoaG93dG8pCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworeworICByZXR1cm4gaG93dG8tPnR5cGU7Cit9CisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl90aWMzMF9zZWxlY3RfcmVsb2MoaG93dG8pCisKKworI2RlZmluZSBCQURNQUcoeCkgVElDMzBCQURNQUcoeCkKKyNkZWZpbmUgVElDMzAgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworCisvKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCisjZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMzIKKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgorI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCitkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7CisKKy8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZS4gKi8KKworc3RhdGljIHZvaWQKK3J0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQorICAgICBhcmVsZW50ICppbnRlcm5hbDsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Cit7CisgIHN3aXRjaCAoZHN0LT5yX3R5cGUpCisgICAgeworICAgIGNhc2UgUl9USUMzMF9BQlMxNjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1RJQzMwX0FCUzI0OgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMV07CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfVElDMzBfQUJTMzI6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVszXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9USUMzMF9MRFA6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVsyXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9USUMzMF9QQzE2OgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbNF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCisKKy8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KKworI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCisgY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OworCisKKyNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKKyByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCisKK3N0YXRpYyB2b2lkCityZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQorICAgICBhcmVsZW50ICpyZWxlbnQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKKyAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOworCisgIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQorICAgIHsKKyAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworICAgIH0KKyAgcmVsZW50LT5hZGRlbmQgPSByZWxvYy0+cl9vZmZzZXQ7CisgIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Cit9CisKKyNpbmNsdWRlICJjb2ZmY29kZS5oIgorCitjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjID0KK3sKKyAgImNvZmYtdGljMzAiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KKworICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdGljODAuYyBiL2JmZC9jb2ZmLXRpYzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzYzhhMAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLXRpYzgwLmMKQEAgLTAsMCArMSw3NTkgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzgwIE11bHRpbWVkaWEgVmlkZW8gUHJvY2Vzc29yIChNVlApLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKKworICAgVGhlcmUgaXMgbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1bi4gVGhpcyBmaWxlIGRyYXdzIGEgbG90IG9uIG90aGVyCisgICBjb2ZmIGZpbGVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImNvZmYvdGljODAuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCisjZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKKyNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCisjZGVmaW5lIENPRkZfQUxJR05fSU5fU0ZMQUdTIDEKKworI2RlZmluZSBHRVRfU0NOSERSX0ZMQUdTIGJmZF9oX2dldF8xNgorI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8xNgorCitzdGF0aWMgdm9pZCBydHlwZTJob3d0bworICBQQVJBTVMgKChhcmVsZW50ICpjYWNoZV9wdHIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0KSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwYmFzZV9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ2xvYjE1X3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTZfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGxvY2FsMTZfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIHRpYzgwX2hvd3RvX3RhYmxlW10gPQoreworCisgIEhPV1RPIChSX1JFTExPTkcsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUxMT05HIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX01QUENSLAkJCS8qIHR5cGUgKi8KKwkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTVBQQ1IiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQUJTLAkJCQkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkFCUyIsCQkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1BQQkFTRSwJCQkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcHBiYXNlX3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQQkFTRSIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUExCQVNFLAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBMQkFTRSIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUDE1LAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTUsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDYsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFAxNSIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUDE1VywJCQkvKiB0eXBlICovCisJIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE1LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA2LAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQMTVXIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCisJIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1BQMTVILAkJCS8qIHR5cGUgKi8KKwkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTUsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDYsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFAxNUgiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfUFAxNkIsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgNiwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJQUDE2QiIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUEwxNSwJCQkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE1LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBMMTUiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1BQTDE1VywJCQkvKiB0eXBlICovCisJIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE1LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBMMTVXIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUEwxNUgsCQkJLyogdHlwZSAqLworCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNSwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQTDE1SCIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfUFBMMTZCLAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQTDE2QiIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfUFBOMTUsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTUsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDYsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBOMTUiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfUFBOMTVXLAkJCS8qIHR5cGUgKi8KKwkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE1LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA2LAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQTjE1VyIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUE4xNUgsCQkJLyogdHlwZSAqLworCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTUsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDYsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBOMTVIIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCisJIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1BQTjE2QiwJCQkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgNiwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJQUE4xNkIiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4M2ZmYzAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHgzZmZjMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfUFBMTjE1LAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE1LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBMTjE1IiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9QUExOMTVXLAkJCS8qIHR5cGUgKi8KKwkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE1LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUFBMTjE1VyIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfUFBMTjE1SCwJCQkvKiB0eXBlICovCisJIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNSwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQTE4xNUgiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX1BQTE4xNkIsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTUsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlBQTE4xNkIiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpCQkJCS8qIHBjcmVsX29mZnNldCAqLworfTsKKwwKKy8qIFNwZWNpYWwgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIHVzZWQgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90CisgICBpdHNlbGYgYSBDT0ZGIFRJYzgwIGZpbGUuICAqLworCisvKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGJhc2UgYWRkcmVzcyB0eXBlCisgICByZWxvY2F0aW9ucy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3BwYmFzZV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKKwkgICAgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2xfaW47CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgLyogRklYTUUuICAqLworICBhYm9ydCAoKTsKK30KKworLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBnbG9iYWwgMTUgYml0IHJlbG9jYXRpb25zLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorZ2xvYjE1X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAorCSAgICAgIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICAvKiBGSVhNRS4gICovCisgIGFib3J0ICgpOworfQorCisvKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitnbG9iMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCisJICAgICAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIC8qIEZJWE1FLiAgKi8KKyAgYWJvcnQgKCk7Cit9CisKKy8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgbG9jYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorbG9jYWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKKwkgICAgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2xfaW47CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgLyogRklYTUUuICAqLworICBhYm9ydCAoKTsKK30KKwwKKy8qIENvZGUgdG8gdHVybiBhbiBleHRlcm5hbCByX3R5cGUgaW50byBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGhvd3RvX3RhYmxlLgorICAgSWYgcGFzc2VkIGFuIHJfdHlwZSB3ZSBkb24ndCByZWNvZ25pemUgdGhlIGFib3J0IHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcKKyAgIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlLiAqLworCitzdGF0aWMgdm9pZAorcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQorICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRpYzgwX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIHRpYzgwX2hvd3RvX3RhYmxlWzBdOyBpKyspCisgICAgeworICAgICAgaWYgKHRpYzgwX2hvd3RvX3RhYmxlW2ldLnR5cGUgPT0gZHN0LT5yX3R5cGUpCisJeworCSAgY2FjaGVfcHRyLT5ob3d0byA9IHRpYzgwX2hvd3RvX3RhYmxlICsgaTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5yZWNvZ25pemVkIHJlbG9jIHR5cGUgMHgleCIpLAorCQkJICh1bnNpZ25lZCBpbnQpIGRzdC0+cl90eXBlKTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9IHRpYzgwX2hvd3RvX3RhYmxlICsgMDsKK30KKworI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQorI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfdGljODBfcnR5cGVfdG9faG93dG8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorY29mZl90aWM4MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGJmZF92bWEgKmFkZGVuZHA7Cit7CisgIGFyZWxlbnQgZ2VucmVsOworCisgIGlmIChyZWwgLT4gcl9zeW1uZHggPT0gLTEgJiYgYWRkZW5kcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBUSSAiaW50ZXJuYWwgcmVsb2NhdGlvbiIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlbG9jYXRpb24KKwkgYW1vdW50IGlzIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBiZWluZyByZWxvY2F0ZWQKKwkgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAqLworICAgICAgKmFkZGVuZHAgPSAoc2VjIC0+IG91dHB1dF9zZWN0aW9uIC0+IHZtYSArIHNlYyAtPiBvdXRwdXRfb2Zmc2V0KSAtIHNlYyAtPiB2bWE7CisgICAgfQorICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKKyAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKK30KKworI2lmbmRlZiBCQURNQUcKKyNkZWZpbmUgQkFETUFHKHgpIFRJQzgwQkFETUFHKHgpCisjZW5kaWYKKwwKKyNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbgorCisvKiBXZSBuZWVkIGEgc3BlY2lhbCByZWxvY2F0aW9uIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSBQUCByZWxvY3MuICBNb3N0CisgICBvZiB0aGlzIGlzIGEgY29weSBvZiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAorCQkJICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAorCQkJICAgICBzZWN0aW9ucykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOworICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOworeworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgbG9uZyBzeW1uZHg7CisgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgICBiZmRfdm1hIGFkZGVuZDsKKyAgICAgIGJmZF92bWEgdmFsOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7CisgICAgICBiZmRfdm1hIGFkZHI7CisKKyAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7CisKKyAgICAgIGlmIChzeW1uZHggPT0gLTEpCisJeworCSAgaCA9IE5VTEw7CisJICBzeW0gPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7ICAgIAorCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKKwkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7CisJfQorCisgICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCisgICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0CisgICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQorICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCisKKyAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKKwlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKKyAgICAgIGVsc2UKKwlhZGRlbmQgPSAwOworCisgICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKKwkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKKyAgICAgIGlmIChob3d0byA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgdmFsID0gMDsKKworICAgICAgaWYgKGggPT0gTlVMTCkKKwl7CisJICBhc2VjdGlvbiAqc2VjOworCisJICBpZiAoc3ltbmR4ID09IC0xKQorCSAgICB7CisJICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgICAgICB2YWwgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOworICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJICAgICArIHN5bS0+bl92YWx1ZSk7CisJICAgICAgaWYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKSkKKwkJdmFsIC09IHNlYy0+dm1hOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzZWM7CisKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgICB9CisKKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisKKyAgICAgIGFkZHIgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7CisKKyAgICAgIC8qIEZJWE1FOiBUaGlzIGNvZGUgYXNzdW1lcyBsaXR0bGUgZW5kaWFuLCBidXQgdGhlIFBQIGNhbgorICAgICAgICAgYXBwYXJlbnRseSBiZSBiaS1lbmRpYW4uICBJIGRvbid0IGtub3cgaWYgdGhlIGJpLWVuZGlhbm5lc3MKKyAgICAgICAgIGFwcGxpZXMgdG8gdGhlIGluc3RydWN0aW9uIHNldCBvciBqdXN0IHRvIHRoZSBkYXRhLiAgKi8KKyAgICAgIHN3aXRjaCAoaG93dG8tPnR5cGUpCisJeworCWRlZmF1bHQ6CisJY2FzZSBSX0FCUzoKKwljYXNlIFJfUkVMTE9OR1g6CisJY2FzZSBSX1BQTDE1OgorCWNhc2UgUl9QUEwxNVc6CisJY2FzZSBSX1BQTDE1SDoKKwljYXNlIFJfUFBMTjE1OgorCWNhc2UgUl9QUExOMTVXOgorCWNhc2UgUl9QUExOMTVIOgorCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgICBjb250ZW50cywgYWRkciwgdmFsLCBhZGRlbmQpOworCSAgYnJlYWs7CisKKwljYXNlIFJfUFAxNToKKwljYXNlIFJfUFAxNVc6CisJY2FzZSBSX1BQMTVIOgorCWNhc2UgUl9QUE4xNToKKwljYXNlIFJfUFBOMTVXOgorCWNhc2UgUl9QUE4xNUg6CisJICAvKiBPZmZzZXQgdGhlIGFkZHJlc3Mgc28gdGhhdCB3ZSBjYW4gdXNlIDQgYnl0ZSByZWxvY2F0aW9ucy4gICovCisJICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJICAgIGNvbnRlbnRzICsgMiwgYWRkciwgdmFsLCBhZGRlbmQpOworCSAgYnJlYWs7CisKKwljYXNlIFJfUFAxNkI6CisJY2FzZSBSX1BQTjE2QjoKKwkgIHsKKwkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHN0b3JlZCBpbiBiaXQgNi4gICovCisJICAgIGJmZF9ieXRlIGhvbGQ7CisKKwkgICAgaG9sZCA9IGNvbnRlbnRzW2FkZHIgKyA0XTsKKwkgICAgY29udGVudHNbYWRkciArIDRdICY9fiAweDIwOworCSAgICBjb250ZW50c1thZGRyICsgNF0gfD0gKGNvbnRlbnRzW2FkZHJdID4+IDEpICYgMHgyMDsKKwkgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgICAgIGNvbnRlbnRzICsgMiwgYWRkciwKKwkJCQkJICAgICAgdmFsLCBhZGRlbmQpOworCSAgICBjb250ZW50c1thZGRyXSAmPX4gMHg0MDsKKwkgICAgY29udGVudHNbYWRkcl0gfD0gKGNvbnRlbnRzW2FkZHIgKyA0XSA8PCAxKSAmIDB4NDA7CisJICAgIGNvbnRlbnRzW2FkZHIgKyA0XSAmPX4gMHgyMDsKKwkgICAgY29udGVudHNbYWRkciArIDRdIHw9IGhvbGQgJiAweDIwOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgUl9QUEwxNkI6CisJY2FzZSBSX1BQTE4xNkI6CisJICB7CisJICAgIC8qIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBzdG9yZWQgaW4gYml0IDI4LiAgKi8KKwkgICAgYmZkX2J5dGUgaG9sZDsKKworCSAgICBob2xkID0gY29udGVudHNbYWRkciArIDFdOworCSAgICBjb250ZW50c1thZGRyICsgMV0gJj1+IDB4ODA7CisJICAgIGNvbnRlbnRzW2FkZHIgKyAxXSB8PSAoY29udGVudHNbYWRkciArIDNdIDw8IDMpICYgMHg4MDsKKwkgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgICAgIGNvbnRlbnRzLCBhZGRyLAorCQkJCQkgICAgICB2YWwsIGFkZGVuZCk7CisJICAgIGNvbnRlbnRzW2FkZHIgKyAzXSAmPSB+MHgxMDsKKwkgICAgY29udGVudHNbYWRkciArIDNdIHw9IChjb250ZW50c1thZGRyICsgMV0gPj4gMykgJiAweDEwOworCSAgICBjb250ZW50c1thZGRyICsgMV0gJj1+IDB4ODA7CisJICAgIGNvbnRlbnRzW2FkZHIgKyAxXSB8PSBob2xkICYgMHg4MDsKKwkgICAgYnJlYWs7CisJICB9CisJCisJY2FzZSBSX1BQQkFTRToKKwkgIC8qIFBhcmFtZXRlciBSQU0gaXMgZnJvbSAweDEwMDAwMDAgdG8gMHgxMDAwODAwLiAgKi8KKwkgIGNvbnRlbnRzW2FkZHJdICY9fiAweDM7CisJICBpZiAodmFsID49IDB4MTAwMDAwMCAmJiB2YWwgPCAweDEwMDA4MDApCisJICAgIGNvbnRlbnRzW2FkZHJdIHw9IDB4MzsKKwkgIGVsc2UKKwkgICAgY29udGVudHNbYWRkcl0gfD0gMHgyOworCSAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7CisJICBicmVhazsKKworCWNhc2UgUl9QUExCQVNFOgorCSAgLyogUGFyYW1ldGVyIFJBTSBpcyBmcm9tIDB4MTAwMDAwMCB0byAweDEwMDA4MDAuICAqLworCSAgY29udGVudHNbYWRkciArIDJdICY9IH4weGMwOworCSAgaWYgKHZhbCA+PSAweDEwMDAwMDAgJiYgdmFsIDwgMHgxMDAwODAwKQorCSAgICBjb250ZW50c1thZGRyICsgMl0gfD0gMHhjMDsKKwkgIGVsc2UKKwkgICAgY29udGVudHNbYWRkciArIDJdIHw9IDB4ODA7CisJICByc3RhdCA9IGJmZF9yZWxvY19vazsKKwkgIGJyZWFrOworCX0KKworICAgICAgc3dpdGNoIChyc3RhdCkKKwl7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCWNhc2UgYmZkX3JlbG9jX29rOgorCSAgYnJlYWs7CisJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCisJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7CisJICByZXR1cm4gZmFsc2U7CisJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisJICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07CisKKwkgICAgaWYgKHN5bW5keCA9PSAtMSkKKwkgICAgICBuYW1lID0gIipBQlMqIjsKKwkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQorCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCSAgICBlbHNlCisJICAgICAgeworCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKKwkJaWYgKG5hbWUgPT0gTlVMTCkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCisJICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKKwkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwl9CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwwKKyNkZWZpbmUgVElDODBDT0ZGIDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCisjdW5kZWYgQ19BVVRPQVJHCQkvKiBDbGFzaGVzIHdpdGggVEljODAncyBDX1VFWFQgKi8KKyN1bmRlZiBDX0xBU1RFTlQJCS8qIENsYXNoZXMgd2l0aCBUSWM4MCdzIENfU1RBVExBQiAqLworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKK2NvbnN0IGJmZF90YXJnZXQgCisgIHRpYzgwY29mZl92ZWMgPQoreworICAiY29mZi10aWM4MCIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIChhcmNoIHN1cHBvcnRzIGJvdGgpICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAorICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLworCisge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgYmZkX2ZhbHNlfSwKKyB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICBDT0ZGX1NXQVBfVEFCTEUKKyB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdTY4ay5jIGIvYmZkL2NvZmYtdTY4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWE3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZi11NjhrLmMKQEAgLTAsMCArMSwzNSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSA2ODAwMCBDT0ZGIGJpbmFyaWVzIGhhdmluZyB1bmRlcnNjb3JlIHdpdGggbmFtZS4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2NvZmZ1bl92ZWMKKyNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay11biIKKworI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKKworLyogZGVmaW5lIHRoaXMgdG8gbm90IGhhdmUgbXVsdGlwbGUgY29weSBvZiBtNjhrX3J0eXBlMmhvd3RvCisgICBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlICovCisjZGVmaW5lIE9OTFlfREVDTEFSRV9SRUxPQ1MKKworLyogVGhpcyBtYWdpYyBudW1iZXIgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVzIGhhdmUgdW5kZXJzY29yZXMuCisgICBPdGhlciA2OGsgbWFnaWMgbnVtYmVycyBpbmRpY2F0ZSB0aGF0IHRoZSBuYW1lcyBkbyBub3QgaGF2ZQorICAgdW5kZXJzY29yZXMuICAqLworI2RlZmluZSBCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IE1DNjhLQkNTTUFHSUMpCisKKyNpbmNsdWRlICJjb2ZmLW02OGsuYyIKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXc2NS5jIGIvYmZkL2NvZmYtdzY1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkNjhjMwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmLXc2NS5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIFdEQyA2NTgxNiBDT0ZGIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IDE5OTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImNvZmYvdzY1LmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KK3sKKyAgSE9XVE8gKFJfVzY1X0FCUzgsICAgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnM4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAorICBIT1dUTyAoUl9XNjVfQUJTMTYsICAgMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKFJfVzY1X0FCUzI0LCAgIDAsICAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMjQiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPIChSX1c2NV9BQlM4UzgsICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiPmFiczgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChSX1c2NV9BQlM4UzE2LCAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiXmFiczgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPIChSX1c2NV9BQlMxNlM4LCAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIj5hYnMxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKFJfVzY1X0FCUzE2UzE2LDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiXmFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAorICBIT1dUTyAoUl9XNjVfUENSOCwgICAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInBjcmVsOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAorICBIT1dUTyAoUl9XNjVfUENSMTYsICAgMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJwY3JlbDE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgdHJ1ZSksCisgIEhPV1RPIChSX1c2NV9EUCwgICAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImRwIiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAorCit9OworCisKKy8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIFwKKyAgeyB4LnJfdHlwZSA9IHNlbGVjdF9yZWxvYyhob3d0byk7IH0KKworI2RlZmluZSBCQURNQUcoeCkgKFc2NUJBRE1BRyh4KSkKKyNkZWZpbmUgVzY1IDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLworI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKworCisvKiBDb2RlIHRvIHN3YXAgaW4gdGhlIHJlbG9jICovCisjZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICAgYmZkX2hfZ2V0XzMyCisjZGVmaW5lIFNXQVBfT1VUX1JFTE9DX09GRlNFVCBiZmRfaF9wdXRfMzIKKyNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpIFwKKyAgZHN0LT5yX3N0dWZmWzBdID0gJ1MnOyBcCisgIGRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKKworCitzdGF0aWMgaW50CitzZWxlY3RfcmVsb2MgKGhvd3RvKQorICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKK3sKKyAgcmV0dXJuIGhvd3RvLT50eXBlIDsKK30KKworLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlCisgICAqLworCitzdGF0aWMgdm9pZAorcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCisgICAgIGFyZWxlbnQgKmludGVybmFsOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKK3sKKyAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgZHN0LT5yX3R5cGUgLSAxOworfQorCisjZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQorCisKKy8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KKworCisjZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKKyBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7CisKKworI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAorIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKKworc3RhdGljIHZvaWQKK3JlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCisgICAgIGFyZWxlbnQgKiByZWxlbnQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7CisgICAgIGFzeW1ib2wgKiogc3ltYm9sczsKKyAgICAgYmZkICogYWJmZDsKKyAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOworeworICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKKyAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOworCisgIGlmICgoKGludCkgcmVsb2MtPnJfc3ltbmR4KSA+IDApCisgICAgeworICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopJihiZmRfYWJzX3N5bWJvbCk7CisgICAgfQorCisKKworICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKKworICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOworICAvKiAgcmVsZW50LT5zZWN0aW9uID0gMDsqLworfQorCisKK3N0YXRpYyBpbnQKK2g4MzAwX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBhcmVsZW50ICpyZWxvYzsKKyAgICAgdW5zaWduZWQgaW50IHNocmluazsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKK3sKKyAgYmZkX3ZtYSB2YWx1ZTsgIAorICBiZmRfdm1hIGRvdDsKKyAgYmZkX3ZtYSBnYXA7CisKKyAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHRoaW5nIHRvIGJlIHJlbG9jYXRlZCB3aWxsIGhhdmUgbW92ZWQgYmFjayBieSAKKyAgIHRoZSBzaXplIG9mIHRoZSBzaHJpbmsgIC0gYnV0IHdlIGRvbid0IGNoYW5nZSByZWxvYy0+YWRkcmVzcyBoZXJlLAorICAgc2luY2Ugd2UgbmVlZCBpdCB0byBrbm93IHdoZXJlIHRoZSByZWxvY2F0aW9uIGxpdmVzIGluIHRoZSBzb3VyY2UKKyAgIHVuY29va2VkIHNlY3Rpb24gKi8KKworICAvKiAgcmVsb2MtPmFkZHJlc3MgLT0gc2hyaW5rOyAgIGNvbmNlcHR1YWwgKi8KKworICBiZmRfdm1hIGFkZHJlc3MgPSByZWxvYy0+YWRkcmVzcyAtIHNocmluazsKKyAgCisKKyAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCisgICAgeyAgICAgCisgICAgY2FzZSBSX01PVjE2QjI6CisgICAgY2FzZSBSX0pNUDI6CisgICAgICBzaHJpbmsrPTI7CisgICAgICBicmVhazsKKworICAgICAgLyogVGhpbmcgaXMgYSBtb3ZlIG9uZSBieXRlICovCisgICAgY2FzZSBSX01PVjE2QjE6CisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCisgICAgICBpZiAodmFsdWUgPj0gMHhmZjAwKQorCXsgCisKKwkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDE2Yml0LCBwb3NzaWJsZSA4IHRvIDhiaXQKKwkgICAgIHBvc3NpYmxlIDE2ICovCisJICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwkgIAorCSAgLyogVGhlIHBsYWNlIHRvIHJlbGMgbW92ZXMgYmFjayBieSBvbmUgKi8KKwkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KKwkgIHNocmluayArPTIgOworCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKKwl9ICAgICAgCisKKyAgICAgIGJyZWFrOworICAgICAgLyogVGhpcyBpcyB0aGUgMjQgYml0IGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXR0ZXIsIAorICAgICAgIHRoZSByZWxvY2F0aW9uIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgaW5zbiwgbm90IHRoZQorICAgICAgIGFjdHVhbCBkYXRhICovCisKKyAgICBjYXNlIFJfSk1QTDE6CisgICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOworCQorICAgICAgZG90ID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCisJaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3M7CisgIAorICAgICAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDEyNyBieXRlcyBvZiB3aGVyZQorCSB3ZSBhcmUsIGlmIHNvIHRoZW4gd2UgY2FuIHVzZSBhIHNtYWxsIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUKKwkganVtcCB3ZSB3ZXJlIGdvaW5nIHRvICovCisKKyAgICAgIGdhcCA9IHZhbHVlIC0gZG90IDsKKyAgCisgICAgICBpZiAoLTEyMCA8IChsb25nKWdhcCAmJiAobG9uZylnYXAgPCAxMjAgKQorCXsgCisKKwkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDI0Yml0LCBwb3NzaWJsZSA4IHRvIDhiaXQKKwkgICAgIHBvc3NpYmxlIDMyICovCisJICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwkgIAorCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLworCSAgc2hyaW5rICs9MiA7CisJICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0pNUDE6CisKKyAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7CisJCisgICAgICBkb3QgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKKwlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzczsKKyAgCisgICAgICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMTI3IGJ5dGVzIG9mIHdoZXJlCisJIHdlIGFyZSwgaWYgc28gdGhlbiB3ZSBjYW4gdXNlIGEgc21hbGwgYnJhbmNoIHJhdGhlciB0aGFuIHRoZQorCSBqdW1wIHdlIHdlcmUgZ29pbmcgdG8gKi8KKworICAgICAgZ2FwID0gdmFsdWUgLSAoZG90IC0gc2hyaW5rKTsKKyAgCisKKyAgICAgIGlmICgtMTIwIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDEyMCApCisJeyAKKworCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMTZiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAorCSAgICAgcG9zc2libGUgMTYgKi8KKwkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCisJICAvKiBUaGUgcGxhY2UgdG8gcmVsYyBtb3ZlcyBiYWNrIGJ5IG9uZSAqLworCisJICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCisJICBzaHJpbmsgKz0yIDsKKwkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIAorICByZXR1cm4gc2hyaW5rOworfQorCisKKy8qIEZpcnN0IHBoYXNlIG9mIGEgcmVsYXhpbmcgbGluayAqLworCisvKiBSZWxvYyB0eXBlcworICAgbGFyZ2UJCXNtYWxsCisgICBSX01PVjE2QjEJCVJfTU9WMTZCMgltb3YuYiB3aXRoIDE2Yml0IG9yIDggYml0IGFkZHJlc3MKKyAgIFJfSk1QMQkJUl9KTVAyCQlqbXAgb3IgcGNyZWwgYnJhbmNoCisgICBSX0pNUEwxCQlSX0pNUExfQjgJMjRqbXAgb3IgcGNyZWwgYnJhbmNoCisgICBSX01PVjI0QjEJCVJfTU9WMjRCMgkyNCBvciA4IGJpdCByZWxvYyBmb3IgbW92LmIKKworKi8KKworc3RhdGljIHZvaWQKK2g4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsCisJCQkgICBkc3RfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHI7CisgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cjsKK3sKKyAgdW5zaWduZWQgaW50IHNyY19hZGRyZXNzID0gKnNyY19wdHI7CisgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9ICpkc3RfcHRyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKworICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBSX1c2NV9BQlM4OgorICAgIGNhc2UgUl9XNjVfRFA6CisgICAgICB7CisJdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOworCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCWRzdF9hZGRyZXNzICs9IDE7CisJc3JjX2FkZHJlc3MgKz0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX1c2NV9BQlM4Uzg6CisgICAgICB7CisJdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOworCWdhcCA+Pj0gODsKKwliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKwlkc3RfYWRkcmVzcyArPSAxOworCXNyY19hZGRyZXNzICs9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9XNjVfQUJTOFMxNjoKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7CisJZ2FwID4+PTE2OworCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCWRzdF9hZGRyZXNzICs9IDE7CisJc3JjX2FkZHJlc3MgKz0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX1c2NV9BQlMxNjoKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7CisKKwliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7CisJZHN0X2FkZHJlc3MgKz0gMjsKKwlzcmNfYWRkcmVzcyArPSAyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1c2NV9BQlMxNlM4OgorICAgICAgeworCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKKwkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKKwlnYXAgPj49IDg7CisJYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCWRzdF9hZGRyZXNzICs9IDI7CisJc3JjX2FkZHJlc3MgKz0gMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9XNjVfQUJTMTZTMTY6CisgICAgICB7CisJdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOworCWdhcCA+Pj0gMTY7CisJYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCWRzdF9hZGRyZXNzICs9IDI7CisJc3JjX2FkZHJlc3MgKz0gMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX1c2NV9BQlMyNDoKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7CisJYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOworCWJmZF9wdXRfOCAoYWJmZCwgZ2FwPj4xNiwgZGF0YStkc3RfYWRkcmVzcysyKTsKKwlkc3RfYWRkcmVzcyArPSAzOworCXNyY19hZGRyZXNzICs9IDM7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9XNjVfUENSODoKKyAgICAgIHsKKwlpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCSAgICAgIGlucHV0X3NlY3Rpb24pOworCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0IAorCSAgKyBkc3RfYWRkcmVzcyAKKwkgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisKKwlnYXAgLT0gZG90ICsgMTsKKwlpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjcpIHsKKwkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAorCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCisJCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkgICAgYWJvcnQoKTsKKwl9CisJYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7CisJZHN0X2FkZHJlc3MgKz0gMTsKKwlzcmNfYWRkcmVzcyArPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfVzY1X1BDUjE2OgorICAgICAgeworCWJmZF92bWEgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgIGlucHV0X3NlY3Rpb24pOworCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0IAorCSAgKyBkc3RfYWRkcmVzcyAKKwkgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisKKworCS8qIFRoaXMgd3JhcHMgd2l0aGluIHRoZSBwYWdlLCBzbyBpZ25vcmUgdGhlIHJlbGF0aXZlbmVzcywgbG9vayBhdCB0aGUKKwkgICBoaWdoIHBhcnQgKi8KKwlpZiAoKGdhcCAmIDB4ZjAwMDApICE9IChkb3QgJiAweGYwMDAwKSkgeworCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCisJCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKKwkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQorCSAgICBhYm9ydCgpOworCX0KKworCWdhcCAtPSBkb3QgKyAyOworCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKKwlkc3RfYWRkcmVzcyArPSAyOworCXNyY19hZGRyZXNzICs9IDI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmKF8oImlnbm9yaW5nIHJlbG9jICVzXG4iKSwgcmVsb2MtPmhvd3RvLT5uYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgfQorICAqc3JjX3B0ciA9IHNyY19hZGRyZXNzOworICAqZHN0X3B0ciA9IGRzdF9hZGRyZXNzOworCit9CisKKyNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMKKyNkZWZpbmUgY29mZl9yZWxvYzE2X2VzdGltYXRlIGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKKworI3VuZGVmIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KKworCisKK2JmZF90YXJnZXQgdzY1X3ZlYyA9Cit7CisgICJjb2ZmLXc2NSIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUgKSwKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgJ18nLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KKyAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCisKKyAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIENPRkZfU1dBUF9UQUJMRSwKK307CmRpZmYgLS1naXQgYS9iZmQvY29mZi13ZTMyay5jIGIvYmZkL2NvZmYtd2UzMmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjZiYmUzCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtd2UzMmsuYwpAQCAtMCwwICsxLDEwOSBAQAorLyogQkZEIGJhY2stZW5kIGZvciB3ZTMyayBDT0ZGIGZpbGVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQnJlbmRhbiBLZWhvZSAoYnJlbmRhbkBjcy53aWRlbmVyLmVkdSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImNvZmYvd2UzMmsuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCisjZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAoreworICAgIHswfSwKKyAgICB7MX0sCisgICAgezJ9LAorICAgIHszfSwKKyAgICB7NH0sCisgICAgezV9LAorICBIT1dUTyhSX0RJUjMyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJkaXIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAorICAgIHs3fSwKKyAgICB7MDEwfSwKKyAgICB7MDExfSwKKyAgICB7MDEyfSwKKyAgICB7MDEzfSwKKyAgICB7MDE0fSwKKyAgICB7MDE1fSwKKyAgICB7MDE2fSwKKyAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCisgIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAorICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKK307CisKKy8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KKworI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9CisjZGVmaW5lIEJBRE1BRyh4KSBXRTMyS0JBRE1BRyh4KQorI2RlZmluZSBXRTMySwkxCisKKyNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKKwkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOworCisjaW5jbHVkZSAiY29mZmNvZGUuaCIKKworI2RlZmluZSBjb2ZmX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAorCitjb25zdCBiZmRfdGFyZ2V0IHdlMzJrY29mZl92ZWMgPQoreworICAiY29mZi13ZTMyayIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCisKKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCisKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisKKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCisKKyB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAorIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCisgICBiZmRfZmFsc2V9LAorIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIENPRkZfU1dBUF9UQUJMRSwKK307CmRpZmYgLS1naXQgYS9iZmQvY29mZi16OGsuYyBiL2JmZC9jb2ZmLXo4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDQ5ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvZmYtejhrLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgWmlsb2cgWjgwMG4gQ09GRiBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAiY29mZi96OGsuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCisjZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW0zMiA9CitIT1dUTyAoUl9JTU0zMiwgMCwgMSwgMzIsIGZhbHNlLCAwLAorICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9pbW0zMiIsIHRydWUsIDB4ZmZmZmZmZmYsCisgICAgICAgMHhmZmZmZmZmZiwgZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTRsID0KK0hPV1RPIChSX0lNTTRMLCAwLCAxLCA0LCBmYWxzZSwgMCwKKyAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tNGwiLCB0cnVlLCAweGYsIDB4ZiwgZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2RhID0KK0hPV1RPIChSX0lNTTE2LCAwLCAxLCAxNiwgZmFsc2UsIDAsCisgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2RhIiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwKKyAgICAgICBmYWxzZSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tOCA9CitIT1dUTyAoUl9JTU04LCAwLCAxLCA4LCBmYWxzZSwgMCwKKyAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsCisgICAgICAgZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2pyID0KK0hPV1RPIChSX0pSLCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsCisgICAgICAgInJfanIiLCB0cnVlLCAwLCAwLCB0cnVlKTsKKworLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KKworc3RhdGljIGludCAKK2NvZmZfejhrX3NlbGVjdF9yZWxvYyAoaG93dG8pCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworeworICByZXR1cm4gaG93dG8tPnR5cGU7Cit9CisKKyNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHgucl90eXBlID0gY29mZl96OGtfc2VsZWN0X3JlbG9jKGhvd3RvKQorCisKKyNkZWZpbmUgQkFETUFHKHgpIFo4S0JBRE1BRyh4KQorI2RlZmluZSBaOEsgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworCisKKworLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLworI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgorI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCisjZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCisgIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAorICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7CisKKy8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQorICAgKi8KKworc3RhdGljIHZvaWQKK3J0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQorICAgICBhcmVsZW50ICogaW50ZXJuYWw7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OworeworICBzd2l0Y2ggKGRzdC0+cl90eXBlKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfSU1NODoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTg7CisgICAgICBicmVhazsKKyAgICAgY2FzZSBSX0lNTTE2OgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfZGE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfSlI6CisgICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9qcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9JTU0zMjoKKyAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0lNTTRMOgorICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tNGw7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCisKKworLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLworCisKKyNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAorIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKKworCisjZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCisgcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQorCitzdGF0aWMgdm9pZCAKK3JlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCisgICAgIGFyZWxlbnQgKiByZWxlbnQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7CisgICAgIGFzeW1ib2wgKiogc3ltYm9sczsKKyAgICAgYmZkICogYWJmZDsKKyAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOworeworICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKKyAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOworCisgIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQorICAgIHsKKyAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworICAgIH0KKworCisgIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OworICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOworfQorCitzdGF0aWMgdm9pZAorZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKKyAgICAgYmZkICppbl9hYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisgICAgIGFyZWxlbnQgKnJlbG9jOworICAgICBiZmRfYnl0ZSAqZGF0YTsKKyAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOworICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Cit7CisgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOworCisgIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQorICAgIHsKKyAgICBjYXNlIFJfSU1NODoKKyAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKKwkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKKwkJIGRhdGEgKyAqZHN0X3B0cik7CisgICAgICAoKmRzdF9wdHIpICs9IDE7CisgICAgICAoKnNyY19wdHIpICs9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9JTU0zMjoKKyAgICAgIGJmZF9wdXRfMzIgKGluX2FiZmQsCisJCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAorCQkgIGRhdGEgKyAqZHN0X3B0cik7CisgICAgICAoKmRzdF9wdHIpICs9IDQ7CisgICAgICAoKnNyY19wdHIpICs9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9JTU00TDoKKyAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKKwkJICgoYmZkX2dldF84IChpbl9hYmZkLCBkYXRhICsgKmRzdF9wdHIpICYgMHhmMCkgCisJCSAgfCAoMHgwZgorCQkgICAgICYgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgICBpbnB1dF9zZWN0aW9uKSkpLAorCQkgZGF0YSArICpkc3RfcHRyKTsKKyAgICAgICgqZHN0X3B0cikgKz0gMTsKKyAgICAgICgqc3JjX3B0cikgKz0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0lNTTE2OgorICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKKwkJICBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCisJCSAgZGF0YSArICpkc3RfcHRyKTsKKyAgICAgICgqZHN0X3B0cikgKz0gMjsKKyAgICAgICgqc3JjX3B0cikgKz0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0pSOgorICAgICAgeworCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCisJCQkJCQkgIGlucHV0X3NlY3Rpb24pOworCWJmZF92bWEgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldAorCQkgICAgICAgKyAqZHN0X3B0cgorCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKKwlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKKwkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLworCisJaWYgKGdhcCAmIDEpCisJICBhYm9ydCAoKTsKKwlnYXAgLz0gMjsKKwlpZiAoZ2FwID4gMTI4IHx8IGdhcCA8IC0xMjgpCisJICB7CisJICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCisJCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAorCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKKwkgICAgICBhYm9ydCAoKTsKKwkgIH0KKwliZmRfcHV0XzggKGluX2FiZmQsIGdhcCwgZGF0YSArICpkc3RfcHRyKTsKKwkoKmRzdF9wdHIpKys7CisJKCpzcmNfcHRyKSsrOworCWJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGV4dHJhX2Nhc2UKKworI2luY2x1ZGUgImNvZmZjb2RlLmgiCisKKworI3VuZGVmICBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyN1bmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCisjZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCisKK2NvbnN0IGJmZF90YXJnZXQgejhrY29mZl92ZWMgPQoreworICAiY29mZi16OGsiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLworCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAorCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCisgICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLworICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KKworICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAorICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAorCisgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgQ09GRl9TV0FQX1RBQkxFLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmY29kZS5oIGIvYmZkL2NvZmZjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzNzE5YwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmY29kZS5oCkBAIC0wLDAgKzEsNDMxOCBAQAorLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgbW9zdCBDT0ZGIHZhcmlhbnRzLCBmb3IgQkZELgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKK01vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAorCQkJc2FjQGN5Z251cy5jb20KKyovCisvKgorCitTRUNUSU9OCisJY29mZiBiYWNrZW5kcworCisJQkZEIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmbGF2b3VycyBvZiBjb2ZmIGZvcm1hdC4KKwlUaGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBmb3JtYXRzIGFyZSB0aGUgc2l6ZXMgYW5kCisJYWxpZ25tZW50cyBvZiBmaWVsZHMgaW4gc3RydWN0dXJlcyBvbiBkaXNrLCBhbmQgdGhlIG9jY2FzaW9uYWwKKwlleHRyYSBmaWVsZC4KKworCUNvZmYgaW4gYWxsIGl0cyB2YXJpZXRpZXMgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIGZldyBjb21tb24KKwlmaWxlcyBhbmQgYSBudW1iZXIgb2YgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZmlsZXMuIEZvcgorCWV4YW1wbGUsIFRoZSA4OGsgYmNzIGNvZmYgZm9ybWF0IGlzIGltcGxlbWVudGVkIGluIHRoZSBmaWxlCisJQGZpbGV7Y29mZi1tODhrLmN9LiBUaGlzIGZpbGUgQGNvZGV7I2luY2x1ZGV9cworCUBmaWxle2NvZmYvbTg4ay5ofSB3aGljaCBkZWZpbmVzIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmUgb2YgdGhlCisJY29mZiBmb3JtYXQgZm9yIHRoZSA4OGssIGFuZCBAZmlsZXtjb2ZmL2ludGVybmFsLmh9IHdoaWNoCisJZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlLiBAZmlsZXtjb2ZmLW04OGsuY30gYWxzbworCWRlZmluZXMgdGhlIHJlbG9jYXRpb25zIHVzZWQgYnkgdGhlIDg4ayBmb3JtYXQKKwlAeHJlZntSZWxvY2F0aW9uc30uCisKKwlUaGUgSW50ZWwgaTk2MCBwcm9jZXNzb3IgdmVyc2lvbiBvZiBjb2ZmIGlzIGltcGxlbWVudGVkIGluCisJQGZpbGV7Y29mZi1pOTYwLmN9LiBUaGlzIGZpbGUgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcworCUBmaWxle2NvZmYtbTg4ay5jfSwgZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgQGZpbGV7Y29mZi9pOTYwLmh9CisJcmF0aGVyIHRoYW4gQGZpbGV7Y29mZi1tODhrLmh9LgorCitTVUJTRUNUSU9OCisJUG9ydGluZyB0byBhIG5ldyB2ZXJzaW9uIG9mIGNvZmYKKworCVRoZSByZWNvbW1lbmRlZCBtZXRob2QgaXMgdG8gc2VsZWN0IGZyb20gdGhlIGV4aXN0aW5nCisJaW1wbGVtZW50YXRpb25zIHRoZSB2ZXJzaW9uIG9mIGNvZmYgd2hpY2ggaXMgbW9zdCBsaWtlIHRoZSBvbmUKKwl5b3Ugd2FudCB0byB1c2UuICBGb3IgZXhhbXBsZSwgd2UnbGwgc2F5IHRoYXQgaTM4NiBjb2ZmIGlzCisJdGhlIG9uZSB5b3Ugc2VsZWN0LCBhbmQgdGhhdCB5b3VyIGNvZmYgZmxhdm91ciBpcyBjYWxsZWQgZm9vLgorCUNvcHkgQGZpbGV7aTM4NmNvZmYuY30gdG8gQGZpbGV7Zm9vY29mZi5jfSwgY29weQorCUBmaWxley4uL2luY2x1ZGUvY29mZi9pMzg2Lmh9IHRvIEBmaWxley4uL2luY2x1ZGUvY29mZi9mb28uaH0sCisJYW5kIGFkZCB0aGUgbGluZXMgdG8gQGZpbGV7dGFyZ2V0cy5jfSBhbmQgQGZpbGV7TWFrZWZpbGUuaW59CisJc28gdGhhdCB5b3VyIG5ldyBiYWNrIGVuZCBpcyB1c2VkLiBBbHRlciB0aGUgc2hhcGVzIG9mIHRoZQorCXN0cnVjdHVyZXMgaW4gQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2Zvby5ofSBzbyB0aGF0IHRoZXkgbWF0Y2gKKwl3aGF0IHlvdSBuZWVkLiBZb3Ugd2lsbCBwcm9iYWJseSBhbHNvIGhhdmUgdG8gYWRkCisJQGNvZGV7I2lmZGVmfXMgdG8gdGhlIGNvZGUgaW4gQGZpbGV7Y29mZi9pbnRlcm5hbC5ofSBhbmQKKwlAZmlsZXtjb2ZmY29kZS5ofSBpZiB5b3VyIHZlcnNpb24gb2YgY29mZiBpcyB0b28gd2lsZC4KKworCVlvdSBjYW4gdmVyaWZ5IHRoYXQgeW91ciBuZXcgQkZEIGJhY2tlbmQgd29ya3MgcXVpdGUgc2ltcGx5IGJ5CisJYnVpbGRpbmcgQGZpbGV7b2JqZHVtcH0gZnJvbSB0aGUgQGZpbGV7YmludXRpbHN9IGRpcmVjdG9yeSwKKwlhbmQgbWFraW5nIHN1cmUgdGhhdCBpdHMgdmVyc2lvbiBvZiB3aGF0J3MgZ29pbmcgb24gYW5kIHlvdXIKKwlob3N0IHN5c3RlbSdzIGlkZWEgKGFzc3VtaW5nIGl0IGhhcyB0aGUgcHJldHR5IHN0YW5kYXJkIGNvZmYKKwlkdW1wIHV0aWxpdHksIHVzdWFsbHkgY2FsbGVkIEBjb2Rle2F0dC1kdW1wfSBvciBqdXN0CisJQGNvZGV7ZHVtcH0pIGFyZSB0aGUgc2FtZS4gIFRoZW4gY2xlYW4gdXAgeW91ciBjb2RlLCBhbmQgc2VuZAorCXdoYXQgeW91J3ZlIGRvbmUgdG8gQ3lnbnVzLiBUaGVuIHlvdXIgc3R1ZmYgd2lsbCBiZSBpbiB0aGUKKwluZXh0IHJlbGVhc2UsIGFuZCB5b3Ugd29uJ3QgaGF2ZSB0byBrZWVwIGludGVncmF0aW5nIGl0LgorCitTVUJTRUNUSU9OCisJSG93IHRoZSBjb2ZmIGJhY2tlbmQgd29ya3MKKworU1VCU1VCU0VDVElPTgorCUZpbGUgbGF5b3V0CisKKwlUaGUgQ29mZiBiYWNrZW5kIGlzIHNwbGl0IGludG8gZ2VuZXJpYyByb3V0aW5lcyB0aGF0IGFyZQorCWFwcGxpY2FibGUgdG8gYW55IENvZmYgdGFyZ2V0IGFuZCByb3V0aW5lcyB0aGF0IGFyZSBzcGVjaWZpYworCXRvIGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgdGFyZ2V0LXNwZWNpZmljIHJvdXRpbmVzIGFyZQorCWZ1cnRoZXIgc3BsaXQgaW50byBvbmVzIHdoaWNoIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgZm9yIGFsbAorCUNvZmYgdGFyZ2V0cyBleGNlcHQgdGhhdCB0aGV5IHVzZSB0aGUgZXh0ZXJuYWwgc3ltYm9sIGZvcm1hdAorCW9yIHVzZSBkaWZmZXJlbnQgdmFsdWVzIGZvciBjZXJ0YWluIGNvbnN0YW50cy4KKworCVRoZSBnZW5lcmljIHJvdXRpbmVzIGFyZSBpbiBAZmlsZXtjb2ZmZ2VuLmN9LiAgVGhlc2Ugcm91dGluZXMKKwl3b3JrIGZvciBhbnkgQ29mZiB0YXJnZXQuICBUaGV5IHVzZSBzb21lIGhvb2tzIGludG8gdGhlIHRhcmdldAorCXNwZWNpZmljIGNvZGU7IHRoZSBob29rcyBhcmUgaW4gYSBAY29kZXtiZmRfY29mZl9iYWNrZW5kX2RhdGF9CisJc3RydWN0dXJlLCBvbmUgb2Ygd2hpY2ggZXhpc3RzIGZvciBlYWNoIHRhcmdldC4KKworCVRoZSBlc3NlbnRpYWxseSBzaW1pbGFyIHRhcmdldC1zcGVjaWZpYyByb3V0aW5lcyBhcmUgaW4KKwlAZmlsZXtjb2ZmY29kZS5ofS4gIFRoaXMgaGVhZGVyIGZpbGUgaW5jbHVkZXMgZXhlY3V0YWJsZSBDIGNvZGUuCisJVGhlIHZhcmlvdXMgQ29mZiB0YXJnZXRzIGZpcnN0IGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIENvZmYKKwloZWFkZXIgZmlsZSwgbWFrZSBhbnkgc3BlY2lhbCBkZWZpbmVzIHRoYXQgYXJlIG5lZWRlZCwgYW5kCisJdGhlbiBpbmNsdWRlIEBmaWxle2NvZmZjb2RlLmh9LgorCisJU29tZSBvZiB0aGUgQ29mZiB0YXJnZXRzIHRoZW4gYWxzbyBoYXZlIGFkZGl0aW9uYWwgcm91dGluZXMgaW4KKwl0aGUgdGFyZ2V0IHNvdXJjZSBmaWxlIGl0c2VsZi4KKworCUZvciBleGFtcGxlLCBAZmlsZXtjb2ZmLWk5NjAuY30gaW5jbHVkZXMKKwlAZmlsZXtjb2ZmL2ludGVybmFsLmh9IGFuZCBAZmlsZXtjb2ZmL2k5NjAuaH0uICBJdCB0aGVuCisJZGVmaW5lcyBhIGZldyBjb25zdGFudHMsIHN1Y2ggYXMgQGNvZGV7STk2MH0sIGFuZCBpbmNsdWRlcworCUBmaWxle2NvZmZjb2RlLmh9LiAgU2luY2UgdGhlIGk5NjAgaGFzIGNvbXBsZXggcmVsb2NhdGlvbgorCXR5cGVzLCBAZmlsZXtjb2ZmLWk5NjAuY30gYWxzbyBpbmNsdWRlcyBzb21lIGNvZGUgdG8KKwltYW5pcHVsYXRlIHRoZSBpOTYwIHJlbG9jcy4gIFRoaXMgY29kZSBpcyBub3QgaW4KKwlAZmlsZXtjb2ZmY29kZS5ofSBiZWNhdXNlIGl0IHdvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlcgorCXRhcmdldC4KKworU1VCU1VCU0VDVElPTgorCUJpdCB0d2lkZGxpbmcKKworCUVhY2ggZmxhdm91ciBvZiBjb2ZmIHN1cHBvcnRlZCBpbiBCRkQgaGFzIGl0cyBvd24gaGVhZGVyIGZpbGUKKwlkZXNjcmliaW5nIHRoZSBleHRlcm5hbCBsYXlvdXQgb2YgdGhlIHN0cnVjdHVyZXMuIFRoZXJlIGlzIGFsc28KKwlhbiBpbnRlcm5hbCBkZXNjcmlwdGlvbiBvZiB0aGUgY29mZiBsYXlvdXQsIGluCisJQGZpbGV7Y29mZi9pbnRlcm5hbC5ofS4gQSBtYWpvciBmdW5jdGlvbiBvZiB0aGUKKwljb2ZmIGJhY2tlbmQgaXMgc3dhcHBpbmcgdGhlIGJ5dGVzIGFuZCB0d2lkZGxpbmcgdGhlIGJpdHMgdG8KKwl0cmFuc2xhdGUgdGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIHN0cnVjdHVyZXMgaW50byB0aGUgbm9ybWFsCisJaW50ZXJuYWwgZm9ybS4gVGhpcyBpcyBhbGwgcGVyZm9ybWVkIGluIHRoZQorCUBjb2Rle2JmZF9zd2FwfV9AaXt0aGluZ31fQGl7ZGlyZWN0aW9ufSByb3V0aW5lcy4gU29tZQorCWVsZW1lbnRzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKKwljb2ZmOyBpdCBpcyB0aGUgZHV0eSBvZiB0aGUgY29mZiB2ZXJzaW9uIHNwZWNpZmljIGluY2x1ZGUgZmlsZQorCXRvIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucyBvZiB2YXJpb3VzIHBhY2tpbmcgcm91dGluZXMgaW4KKwlAZmlsZXtjb2ZmY29kZS5ofS4gRS5nLiwgdGhlIHNpemUgb2YgbGluZSBudW1iZXIgZW50cnkgaW4gY29mZiBpcworCXNvbWV0aW1lcyAxNiBiaXRzLCBhbmQgc29tZXRpbWVzIDMyIGJpdHMuIEBjb2RleyNkZWZpbmV9aW5nCisJQGNvZGV7UFVUX0xOU1pfTE5OT30gYW5kIEBjb2Rle0dFVF9MTlNaX0xOTk99IHdpbGwgc2VsZWN0IHRoZQorCWNvcnJlY3Qgb25lLiBObyBkb3VidCwgc29tZSBkYXkgc29tZW9uZSB3aWxsIGZpbmQgYSB2ZXJzaW9uIG9mCisJY29mZiB3aGljaCBoYXMgYSB2YXJ5aW5nIGZpZWxkIHNpemUgbm90IGNhdGVyZWQgdG8gYXQgdGhlCisJbW9tZW50LiBUbyBwb3J0IEJGRCwgdGhhdCBwZXJzb24gd2lsbCBoYXZlIHRvIGFkZCBtb3JlIEBjb2RleyNkZWZpbmVzfS4KKwlUaHJlZSBvZiB0aGUgYml0IHR3aWRkbGluZyByb3V0aW5lcyBhcmUgZXhwb3J0ZWQgdG8KKwlAY29kZXtnZGJ9OyBAY29kZXtjb2ZmX3N3YXBfYXV4X2lufSwgQGNvZGV7Y29mZl9zd2FwX3N5bV9pbn0KKwlhbmQgQGNvZGV7Y29mZl9zd2FwX2xpbm5vX2lufS4gQGNvZGV7R0RCfSByZWFkcyB0aGUgc3ltYm9sCisJdGFibGUgb24gaXRzIG93biwgYnV0IHVzZXMgQkZEIHRvIGZpeCB0aGluZ3MgdXAuICBNb3JlIG9mIHRoZQorCWJpdCB0d2lkZGxlcnMgYXJlIGV4cG9ydGVkIGZvciBAY29kZXtnYXN9OworCUBjb2Rle2NvZmZfc3dhcF9hdXhfb3V0fSwgQGNvZGV7Y29mZl9zd2FwX3N5bV9vdXR9LAorCUBjb2Rle2NvZmZfc3dhcF9saW5lbm9fb3V0fSwgQGNvZGV7Y29mZl9zd2FwX3JlbG9jX291dH0sCisJQGNvZGV7Y29mZl9zd2FwX2ZpbGVoZHJfb3V0fSwgQGNvZGV7Y29mZl9zd2FwX2FvdXRoZHJfb3V0fSwKKwlAY29kZXtjb2ZmX3N3YXBfc2NuaGRyX291dH0uIEBjb2Rle0dhc30gY3VycmVudGx5IGtlZXBzIHRyYWNrCisJb2YgYWxsIHRoZSBzeW1ib2wgdGFibGUgYW5kIHJlbG9jIGRydWRnZXJ5IGl0c2VsZiwgdGhlcmVieQorCXNhdmluZyB0aGUgaW50ZXJuYWwgQkZEIG92ZXJoZWFkLCBidXQgdXNlcyBCRkQgdG8gc3dhcCB0aGluZ3MKKwlvbiB0aGUgd2F5IG91dCwgbWFraW5nIGNyb3NzIHBvcnRzIG11Y2ggc2FmZXIuICBEb2luZyBzbyBhbHNvCisJYWxsb3dzIEJGRCAoYW5kIHRodXMgdGhlIGxpbmtlcikgdG8gdXNlIHRoZSBzYW1lIGhlYWRlciBmaWxlcworCWFzIEBjb2Rle2dhc30sIHdoaWNoIG1ha2VzIG9uZSBhdmVudWUgdG8gZGlzYXN0ZXIgZGlzYXBwZWFyLgorCitTVUJTVUJTRUNUSU9OCisJU3ltYm9sIHJlYWRpbmcKKworCVRoZSBzaW1wbGUgY2Fub25pY2FsIGZvcm0gZm9yIHN5bWJvbHMgdXNlZCBieSBCRkQgaXMgbm90IHJpY2gKKwllbm91Z2ggdG8ga2VlcCBhbGwgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiBhIGNvZmYgc3ltYm9sCisJdGFibGUuIFRoZSBiYWNrIGVuZCBnZXRzIGFyb3VuZCB0aGlzIHByb2JsZW0gYnkga2VlcGluZyB0aGUgb3JpZ2luYWwKKwlzeW1ib2wgdGFibGUgYXJvdW5kLCAiYmVoaW5kIHRoZSBzY2VuZXMiLgorCisJV2hlbiBhIHN5bWJvbCB0YWJsZSBpcyByZXF1ZXN0ZWQgKHRocm91Z2ggYSBjYWxsIHRvCisJQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9KSwgYSByZXF1ZXN0IGdldHMgdGhyb3VnaCB0bworCUBjb2Rle2NvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFifS4gVGhpcyByZWFkcyB0aGUgc3ltYm9sIHRhYmxlIGZyb20KKwl0aGUgY29mZiBmaWxlIGFuZCBzd2FwcyBhbGwgdGhlIHN0cnVjdHVyZXMgaW5zaWRlIGludG8gdGhlCisJaW50ZXJuYWwgZm9ybS4gSXQgYWxzbyBmaXhlcyB1cCBhbGwgdGhlIHBvaW50ZXJzIGluIHRoZSB0YWJsZQorCShyZXByZXNlbnRlZCBpbiB0aGUgZmlsZSBieSBvZmZzZXRzIGZyb20gdGhlIGZpcnN0IHN5bWJvbCBpbgorCXRoZSB0YWJsZSkgaW50byBwaHlzaWNhbCBwb2ludGVycyB0byBlbGVtZW50cyBpbiB0aGUgbmV3CisJaW50ZXJuYWwgdGFibGUuIFRoaXMgaW52b2x2ZXMgc29tZSB3b3JrIHNpbmNlIHRoZSBtZWFuaW5ncyBvZgorCWZpZWxkcyBjaGFuZ2UgZGVwZW5kaW5nIHVwb24gY29udGV4dDogYSBmaWVsZCB0aGF0IGlzIGEKKwlwb2ludGVyIHRvIGFub3RoZXIgc3RydWN0dXJlIGluIHRoZSBzeW1ib2wgdGFibGUgYXQgb25lIG1vbWVudAorCW1heSBiZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIHN0cnVjdHVyZSBhdCB0aGUgbmV4dC4gIEFub3RoZXIKKwlwYXNzIGlzIG1hZGUgb3ZlciB0aGUgdGFibGUuIEFsbCBzeW1ib2xzIHdoaWNoIG1hcmsgZmlsZSBuYW1lcworCSg8PENfRklMRT4+IHN5bWJvbHMpIGFyZSBtb2RpZmllZCBzbyB0aGF0IHRoZSBpbnRlcm5hbAorCXN0cmluZyBwb2ludHMgdG8gdGhlIHZhbHVlIGluIHRoZSBhdXhlbnQgKHRoZSByZWFsIGZpbGVuYW1lKQorCXJhdGhlciB0aGFuIHRoZSBub3JtYWwgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbAorCShAY29kZXsiLmZpbGUifSkuCisKKwlBdCB0aGlzIHRpbWUgdGhlIHN5bWJvbCBuYW1lcyBhcmUgbW92ZWQgYXJvdW5kLiBDb2ZmIHN0b3JlcworCWFsbCBzeW1ib2xzIGxlc3MgdGhhbiBuaW5lIGNoYXJhY3RlcnMgbG9uZyBwaHlzaWNhbGx5CisJd2l0aGluIHRoZSBzeW1ib2wgdGFibGU7IGxvbmdlciBzdHJpbmdzIGFyZSBrZXB0IGF0IHRoZSBlbmQgb2YKKwl0aGUgZmlsZSBpbiB0aGUgc3RyaW5nIAl0YWJsZS4gVGhpcyBwYXNzIG1vdmVzIGFsbCBzdHJpbmdzCisJaW50byBtZW1vcnkgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCBwb2ludGVycyB0byB0aGUgc3RyaW5ncy4KKworCisJVGhlIHN5bWJvbCB0YWJsZSBpcyBtYXNzYWdlZCBvbmNlIGFnYWluLCB0aGlzIHRpbWUgdG8gY3JlYXRlCisJdGhlIGNhbm9uaWNhbCB0YWJsZSB1c2VkIGJ5IHRoZSBCRkQgYXBwbGljYXRpb24uIEVhY2ggc3ltYm9sCisJaXMgaW5zcGVjdGVkIGluIHR1cm4sIGFuZCBhIGRlY2lzaW9uIG1hZGUgKHVzaW5nIHRoZQorCUBjb2Rle3NjbGFzc30gZmllbGQpIGFib3V0IHRoZSB2YXJpb3VzIGZsYWdzIHRvIHNldCBpbiB0aGUKKwlAY29kZXthc3ltYm9sfS4gIEB4cmVme1N5bWJvbHN9LiBUaGUgZ2VuZXJhdGVkIGNhbm9uaWNhbCB0YWJsZQorCXNoYXJlcyBzdHJpbmdzIHdpdGggdGhlIGhpZGRlbiBpbnRlcm5hbCBzeW1ib2wgdGFibGUuCisKKwlBbnkgbGluZW51bWJlcnMgYXJlIHJlYWQgZnJvbSB0aGUgY29mZiBmaWxlIHRvbywgYW5kIGF0dGFjaGVkCisJdG8gdGhlIHN5bWJvbHMgd2hpY2ggb3duIHRoZSBmdW5jdGlvbnMgdGhlIGxpbmVudW1iZXJzIGJlbG9uZyB0by4KKworU1VCU1VCU0VDVElPTgorCVN5bWJvbCB3cml0aW5nCisKKwlXcml0aW5nIGEgc3ltYm9sIHRvIGEgY29mZiBmaWxlIHdoaWNoIGRpZG4ndCBjb21lIGZyb20gYSBjb2ZmCisJZmlsZSB3aWxsIGxvc2UgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhlIEBjb2Rle2FzeW1ib2x9CisJc3RydWN0dXJlIHJlbWVtYmVycyB0aGUgQkZEIGZyb20gd2hpY2ggdGhlIHN5bWJvbCB3YXMgdGFrZW4sIGFuZCBvbgorCW91dHB1dCB0aGUgYmFjayBlbmQgbWFrZXMgc3VyZSB0aGF0IHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRhcmdldCBhcworCXNvdXJjZSB0YXJnZXQgaXMgcHJlc2VudC4KKworCVdoZW4gdGhlIHN5bWJvbHMgaGF2ZSBjb21lIGZyb20gYSBjb2ZmIGZpbGUgdGhlbiBhbGwgdGhlCisJZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZC4KKworCVN5bWJvbCB0YWJsZXMgYXJlIHByb3ZpZGVkIGZvciB3cml0aW5nIHRvIHRoZSBiYWNrIGVuZCBpbiBhCisJdmVjdG9yIG9mIHBvaW50ZXJzIHRvIHBvaW50ZXJzLiBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgbGlrZQorCXRoZSBsaW5rZXIgdG8gYWNjdW11bGF0ZSBhbmQgb3V0cHV0IGxhcmdlIHN5bWJvbCB0YWJsZXMKKwl3aXRob3V0IGhhdmluZyB0byBkbyB0b28gbXVjaCBieXRlIGNvcHlpbmcuCisKKwlUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgcHJvdmlkZWQgc3ltYm9sIHRhYmxlIGFuZAorCXBhdGNoZXMgZWFjaCBzeW1ib2wgbWFya2VkIGFzIGEgZmlsZSBwbGFjZSBob2xkZXIKKwkoQGNvZGV7Q19GSUxFfSkgdG8gcG9pbnQgdG8gdGhlIG5leHQgZmlsZSBwbGFjZSBob2xkZXIgaW4gdGhlCisJbGlzdC4gSXQgYWxzbyBtYXJrcyBlYWNoIEBjb2Rle29mZnNldH0gZmllbGQgaW4gdGhlIGxpc3Qgd2l0aAorCXRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIG9mIHRoZSBjdXJyZW50IHN5bWJvbC4KKworCUFub3RoZXIgZnVuY3Rpb24gb2YgdGhpcyBwcm9jZWR1cmUgaXMgdG8gdHVybiB0aGUgY2Fub25pY2FsCisJdmFsdWUgZm9ybSBvZiBCRkQgaW50byB0aGUgZm9ybSB1c2VkIGJ5IGNvZmYuIEludGVybmFsbHksIEJGRAorCWV4cGVjdHMgc3ltYm9sIHZhbHVlcyB0byBiZSBvZmZzZXRzIGZyb20gYSBzZWN0aW9uIGJhc2U7IHNvIGEKKwlzeW1ib2wgcGh5c2ljYWxseSBhdCAweDEyMCwgYnV0IGluIGEgc2VjdGlvbiBzdGFydGluZyBhdAorCTB4MTAwLCB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAweDIwLiBDb2ZmIGV4cGVjdHMgc3ltYm9scyB0bworCWNvbnRhaW4gdGhlaXIgZmluYWwgdmFsdWUsIHNvIHN5bWJvbHMgaGF2ZSB0aGVpciB2YWx1ZXMKKwljaGFuZ2VkIGF0IHRoaXMgcG9pbnQgdG8gcmVmbGVjdCB0aGVpciBzdW0gd2l0aCB0aGVpciBvd25pbmcKKwlzZWN0aW9uLiAgVGhpcyB0cmFuc2Zvcm1hdGlvbiB1c2VzIHRoZQorCTw8b3V0cHV0X3NlY3Rpb24+PiBmaWVsZCBvZiB0aGUgQGNvZGV7YXN5bWJvbH0ncworCUBjb2Rle2FzZWN0aW9ufSBAeHJlZntTZWN0aW9uc30uCisKKwlvIDw8Y29mZl9tYW5nbGVfc3ltYm9scz4+CisKKwlUaGlzIHJvdXRpbmUgcnVucyB0aG91Z2ggdGhlIHByb3ZpZGVkIHN5bWJvbCB0YWJsZSBhbmQgdXNlcworCXRoZSBvZmZzZXRzIGdlbmVyYXRlZCBieSB0aGUgcHJldmlvdXMgcGFzcyBhbmQgdGhlIHBvaW50ZXJzCisJZ2VuZXJhdGVkIHdoZW4gdGhlIHN5bWJvbCB0YWJsZSB3YXMgcmVhZCBpbiB0byBjcmVhdGUgdGhlCisJc3RydWN0dXJlZCBoaWVyYWNoeSByZXF1aXJlZCBieSBjb2ZmLiBJdCBjaGFuZ2VzIGVhY2ggcG9pbnRlcgorCXRvIGEgc3ltYm9sIGludG8gdGhlIGluZGV4IGludG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgYXN5bWJvbC4KKworCW8gPDxjb2ZmX3dyaXRlX3N5bWJvbHM+PgorCisJVGhpcyByb3V0aW5lIHJ1bnMgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGFuZCBwYXRjaGVzIHVwIHRoZQorCXN5bWJvbHMgZnJvbSB0aGVpciBpbnRlcm5hbCBmb3JtIGludG8gdGhlIGNvZmYgd2F5LCBjYWxscyB0aGUKKwliaXQgdHdpZGRsZXJzLCBhbmQgd3JpdGVzIG91dCB0aGUgdGFibGUgdG8gdGhlIGZpbGUuCisKKyovCisKKy8qCitJTlRFUk5BTF9ERUZJTklUSU9OCisJY29mZl9zeW1ib2xfdHlwZQorCitERVNDUklQVElPTgorCVRoZSBoaWRkZW4gaW5mb3JtYXRpb24gZm9yIGFuIDw8YXN5bWJvbD4+IGlzIGRlc2NyaWJlZCBpbiBhCisJPDxjb21iaW5lZF9lbnRyeV90eXBlPj46CisKK0NPREVfRlJBR01FTlQKKy4KKy50eXBlZGVmIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QKKy57CisuCisuICAgICAgIHsqIFJlbWVtYmVycyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgZmlsZSBmb3IKKy4gICAgICAgICAgdGhpcyBzeW1ib2wuIEdlbmVyYXRlZCBieSBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMuICp9CisudW5zaWduZWQgaW50IG9mZnNldDsKKy4KKy4gICAgICAgeyogU2hvdWxkIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLiAgVXNlZCBmb3IKKy4gICAgICAgICAgWENPRkYgQ19CU1RBVCBzeW1ib2xzLiAgU2V0IGJ5IGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKn0KKy51bnNpZ25lZCBpbnQgZml4X3ZhbHVlIDogMTsKKy4KKy4gICAgICAgeyogU2hvdWxkIHRoZSB0YWcgZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KKy4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQorLnVuc2lnbmVkIGludCBmaXhfdGFnIDogMTsKKy4KKy4gICAgICAgeyogU2hvdWxkIHRoZSBlbmRpZHggZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KKy4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQorLnVuc2lnbmVkIGludCBmaXhfZW5kIDogMTsKKy4KKy4gICAgICAgeyogU2hvdWxkIHRoZSB4X2NzZWN0Lnhfc2NubGVuIGZpZWxkIGJlIHJlbnVtYmVyZWQuCisuICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKn0KKy51bnNpZ25lZCBpbnQgZml4X3NjbmxlbiA6IDE7CisuCisuICAgICAgIHsqIEZpeCB1cCBhbiBYQ09GRiBDX0JJTkNML0NfRUlOQ0wgc3ltYm9sLiAgVGhlIHZhbHVlIGlzIHRoZQorLiAgICAgICAgICBpbmRleCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzLiAgU2V0IGJ5CisuICAgICAgICAgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKn0KKy51bnNpZ25lZCBpbnQgZml4X2xpbmUgOiAxOworLgorLiAgICAgICB7KiBUaGUgY29udGFpbmVyIGZvciB0aGUgc3ltYm9sIHN0cnVjdHVyZSBhcyByZWFkIGFuZCB0cmFuc2xhdGVkCisuICAgICAgICAgICBmcm9tIHRoZSBmaWxlLiAqfQorLgorLnVuaW9uIHsKKy4gICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OworLiAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OworLiB9IHU7CisufSBjb21iaW5lZF9lbnRyeV90eXBlOworLgorLgorLnsqIEVhY2ggY2Fub25pY2FsIGFzeW1ib2wgcmVhbGx5IGxvb2tzIGxpa2UgdGhpczogKn0KKy4KKy50eXBlZGVmIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QKKy57CisuICAgeyogVGhlIGFjdHVhbCBzeW1ib2wgd2hpY2ggdGhlIHJlc3Qgb2YgQkZEIHdvcmtzIHdpdGggKn0KKy5hc3ltYm9sIHN5bWJvbDsKKy4KKy4gICB7KiBBIHBvaW50ZXIgdG8gdGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKn0KKy5jb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7CisuCisuICAgeyogQSBwb2ludGVyIHRvIHRoZSBsaW5lbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqfQorLnN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmxpbmVubzsKKy4KKy4gICB7KiBIYXZlIHRoZSBsaW5lIG51bWJlcnMgYmVlbiByZWxvY2F0ZWQgeWV0ID8gKn0KKy5ib29sZWFuIGRvbmVfbGluZW5vOworLn0gY29mZl9zeW1ib2xfdHlwZTsKKworCisqLworCisjaWZkZWYgQ09GRl9XSVRIX1BFCisjaW5jbHVkZSAicGVpY29kZS5oIgorI2Vsc2UKKyNpbmNsdWRlICJjb2Zmc3dhcC5oIgorI2VuZGlmCisKKyNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKKworc3RhdGljIGxvbmcgc2VjX3RvX3N0eXBfZmxhZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqLCBmbGFnd29yZCkpOworc3RhdGljIGZsYWd3b3JkIHN0eXBfdG9fc2VjX2ZsYWdzIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gY29mZl9iYWRfZm9ybWF0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gY29mZl9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9hcmNoX21hY2hfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX3NldF9mbGFncworICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIHNob3J0ICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfc2V0X2FyY2hfbWFjaAorICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBQVFIgYnV5X2FuZF9yZWFkIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgaW50LCBzaXplX3QpKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfbGluZV90YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfc2x1cnBfcmVsb2NfdGFibGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiopKTsKK3N0YXRpYyBsb25nIGNvZmZfY2Fub25pY2FsaXplX3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7CisjaWZuZGVmIGNvZmZfbWtvYmplY3RfaG9vaworc3RhdGljIFBUUiBjb2ZmX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgIFBUUikpOworI2VuZGlmCisMCisvKiB2b2lkIHdhcm5pbmcoKTsgKi8KKworLyoKKyAqIFJldHVybiBhIHdvcmQgd2l0aCBTVFlQXyogKHNjbmhkci5zX2ZsYWdzKSBmbGFncyBzZXQgdG8gcmVwcmVzZW50IHRoZQorICogaW5jb21pbmcgU0VDXyogZmxhZ3MuICBUaGUgaW52ZXJzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN0eXBfdG9fc2VjX2ZsYWdzKCkuCisgKiBOT1RFOiBJZiB5b3UgYWRkIHRvL2NoYW5nZSB0aGlzIHJvdXRpbmUsIHlvdSBzaG91bGQgbWlycm9yIHRoZSBjaGFuZ2VzCisgKiAJaW4gc3R5cF90b19zZWNfZmxhZ3MoKS4KKyAqLworc3RhdGljIGxvbmcKK3NlY190b19zdHlwX2ZsYWdzIChzZWNfbmFtZSwgc2VjX2ZsYWdzKQorICAgICBDT05TVCBjaGFyICpzZWNfbmFtZTsKKyAgICAgZmxhZ3dvcmQgc2VjX2ZsYWdzOworeworICBsb25nIHN0eXBfZmxhZ3MgPSAwOworCisgIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1RFWFQpKQorICAgIHsKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7CisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0RBVEEpKQorICAgIHsKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RBVEE7CisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0JTUykpCisgICAgeworICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOworI2lmZGVmIF9DT01NRU5UCisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0NPTU1FTlQpKQorICAgIHsKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87CisjZW5kaWYgLyogX0NPTU1FTlQgKi8KKyNpZmRlZiBfTElCCisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0xJQikpCisgICAgeworICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElCOworI2VuZGlmIC8qIF9MSUIgKi8KKyNpZmRlZiBfTElUCisgICAgfQorICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX0xJVCkpCisgICAgeworICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOworI2VuZGlmIC8qIF9MSVQgKi8KKyAgICB9CisgIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCAiLmRlYnVnIikpCisgICAgeworI2lmZGVmIFNUWVBfREVCVUcKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0RFQlVHOworI2Vsc2UKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0lORk87CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKCFzdHJuY21wIChzZWNfbmFtZSwgIi5zdGFiIiwgNSkpCisgICAgeworICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKKyAgICB9CisjaWZkZWYgQ09GRl9XSVRIX1BFCisgIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCAiLmVkYXRhIikpCisgICAgeworICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREFUQTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9QQUQpKQorICAgIHsKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1BBRDsKKyAgICB9CisgIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTE9BREVSKSkKKyAgICB7CisgICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MT0FERVI7CisgICAgfQorI2VuZGlmCisgIC8qIFRyeSBhbmQgZmlndXJlIG91dCB3aGF0IGl0IHNob3VsZCBiZSAqLworICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfQ09ERSkKKyAgICB7CisgICAgICBzdHlwX2ZsYWdzID0gU1RZUF9URVhUOworICAgIH0KKyAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX0RBVEEpCisgICAgeworICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREFUQTsKKyAgICB9CisgIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19SRUFET05MWSkKKyAgICB7CisjaWZkZWYgU1RZUF9MSVQJCQkvKiAyOWsgcmVhZG9ubHkgdGV4dC9kYXRhIHNlY3Rpb24gKi8KKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xJVDsKKyNlbHNlCisgICAgICBzdHlwX2ZsYWdzID0gU1RZUF9URVhUOworI2VuZGlmIC8qIFNUWVBfTElUICovCisgICAgfQorICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfTE9BRCkKKyAgICB7CisgICAgICBzdHlwX2ZsYWdzID0gU1RZUF9URVhUOworICAgIH0KKyAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX0FMTE9DKQorICAgIHsKKyAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0JTUzsKKyAgICB9CisKKyNpZmRlZiBTVFlQX05PTE9BRAorICBpZiAoKHNlY19mbGFncyAmIChTRUNfTkVWRVJfTE9BRCB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZKSkgIT0gMCkKKyAgICBzdHlwX2ZsYWdzIHw9IFNUWVBfTk9MT0FEOworI2VuZGlmCisKKyNpZmRlZiBDT0ZGX1dJVEhfUEUKKyAgaWYgKHNlY19mbGFncyAmIFNFQ19MSU5LX09OQ0UpCisgICAgc3R5cF9mbGFncyB8PSBJTUFHRV9TQ05fTE5LX0NPTURBVDsKKyNlbmRpZgorCisgIHJldHVybiAoc3R5cF9mbGFncyk7Cit9CisvKgorICogUmV0dXJuIGEgd29yZCB3aXRoIFNFQ18qIGZsYWdzIHNldCB0byByZXByZXNlbnQgdGhlIGluY29taW5nCisgKiBTVFlQXyogZmxhZ3MgKGZyb20gc2NuaGRyLnNfZmxhZ3MpLiAgIFRoZSBpbnZlcnNlIG9mIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIHNlY190b19zdHlwX2ZsYWdzKCkuCisgKiBOT1RFOiBJZiB5b3UgYWRkIHRvL2NoYW5nZSB0aGlzIHJvdXRpbmUsIHlvdSBzaG91bGQgbWlycm9yIHRoZSBjaGFuZ2VzCisgKiAgICAgIGluIHNlY190b19zdHlwX2ZsYWdzKCkuCisgKi8KK3N0YXRpYyBmbGFnd29yZAorc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgaGRyOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOworICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOworICBmbGFnd29yZCBzZWNfZmxhZ3MgPSAwOworCisjaWZkZWYgU1RZUF9OT0xPQUQKKyAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX05PTE9BRCkKKyAgICB7CisgICAgICBzZWNfZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7CisgICAgfQorI2VuZGlmIC8qIFNUWVBfTk9MT0FEICovCisKKyAgLyogRm9yIDM4NiBDT0ZGLCBhdCBsZWFzdCwgYW4gdW5sb2FkYWJsZSB0ZXh0IG9yIGRhdGEgc2VjdGlvbiBpcworICAgICBhY3R1YWxseSBhIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uICAqLworICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKKyAgICB7CisgICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCisJc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7CisgICAgICBlbHNlCisJc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7CisgICAgfQorICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9EQVRBKQorICAgIHsKKyAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKKwlzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKKyAgICAgIGVsc2UKKwlzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKKyAgICB9CisgIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0JTUykKKyAgICB7CisjaWZkZWYgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQorICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQorCXNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCXNlY19mbGFncyB8PSBTRUNfQUxMT0M7CisgICAgfQorICBlbHNlIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9JTkZPKQorICAgIHsKKyAgICAgIC8qIFdlIG1hcmsgdGhlc2UgYXMgU0VDX0RFQlVHR0lORywgYnV0IG9ubHkgaWYgQ09GRl9QQUdFX1NJWkUgaXMKKwkgZGVmaW5lZC4gIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIHVzZXMKKwkgQ09GRl9QQUdFX1NJWkUgdG8gZW5zdXJlIHRoYXQgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZQorCSBzZWN0aW9uIFZNQSBhbmQgdGhlIGZpbGUgb2Zmc2V0IG1hdGNoLiAgSWYgd2UgZG9uJ3Qga25vdworCSBDT0ZGX1BBR0VfU0laRSwgd2UgY2FuJ3QgZW5zdXJlIHRoZSBjb3JyZWN0IGNvcnJlc3BvbmRlbmNlLAorCSBhbmQgZGVtYW5kIHBhZ2UgbG9hZGluZyBvZiB0aGUgZmlsZSB3aWxsIGZhaWwuICAqLworI2lmIGRlZmluZWQgKENPRkZfUEFHRV9TSVpFKSAmJiAhZGVmaW5lZCAoQ09GRl9BTElHTl9JTl9TX0ZMQUdTKQorICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX1BBRCkKKyAgICB7CisgICAgICBzZWNfZmxhZ3MgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCisJc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7CisgICAgICBlbHNlCisJc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EQVRBKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKKwlzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKKyAgICAgIGVsc2UKKwlzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0JTUykgPT0gMCkKKyAgICB7CisjaWZkZWYgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQorICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQorCXNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCXNlY19mbGFncyB8PSBTRUNfQUxMT0M7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGVidWciKSA9PSAwCisjaWZkZWYgX0NPTU1FTlQKKwkgICB8fCBzdHJjbXAgKG5hbWUsIF9DT01NRU5UKSA9PSAwCisjZW5kaWYKKwkgICB8fCBzdHJuY21wIChuYW1lLCAiLnN0YWIiLCA1KSA9PSAwKQorICAgIHsKKyNpZmRlZiBDT0ZGX1BBR0VfU0laRQorICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7CisjZW5kaWYKKyAgICB9CisjaWZkZWYgX0xJQgorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUIpID09IDApCisgICAgOworI2VuZGlmCisjaWZkZWYgX0xJVAorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVQpID09IDApCisgICAgeworICAgICAgc2VjX2ZsYWdzID0gU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFk7CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICB7CisgICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7CisgICAgfQorCisjaWZkZWYgU1RZUF9MSVQJCQkvKiBBMjlrIHJlYWRvbmx5IHRleHQvZGF0YSBzZWN0aW9uIHR5cGUgKi8KKyAgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVQpID09IFNUWVBfTElUKQorICAgIHsKKyAgICAgIHNlY19mbGFncyA9IChTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWSk7CisgICAgfQorI2VuZGlmIC8qIFNUWVBfTElUICovCisjaWZkZWYgU1RZUF9PVEhFUl9MT0FECQkvKiBPdGhlciBsb2FkZWQgc2VjdGlvbnMgKi8KKyAgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX09USEVSX0xPQUQpCisgICAgeworICAgICAgc2VjX2ZsYWdzID0gKFNFQ19MT0FEIHwgU0VDX0FMTE9DKTsKKyAgICB9CisjZW5kaWYgLyogU1RZUF9TREFUQSAqLworCisjaWZkZWYgQ09GRl9XSVRIX1BFCisgIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0xOS19SRU1PVkUpCisgICAgc2VjX2ZsYWdzIHw9IFNFQ19FWENMVURFOworCisgIGlmIChzdHlwX2ZsYWdzICYgSU1BR0VfU0NOX0xOS19DT01EQVQpCisgICAgeworICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX09OQ0U7CisKKyAgICAgIC8qIFVuZm9ydHVuYXRlbHksIHRoZSBQRSBmb3JtYXQgc3RvcmVzIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBpbgorICAgICAgICAgdGhlIHN5bWJvbCB0YWJsZSwgb2YgYWxsIHBsYWNlcy4gIFdlIG5lZWQgdG8gZXh0cmFjdCB0aGF0CisgICAgICAgICBpbmZvcm1hdGlvbiBub3csIHNvIHRoYXQgb2JqZHVtcCBhbmQgdGhlIGxpbmtlciB3aWxsIGtub3cgaG93CisgICAgICAgICB0byBoYW5kbGUgdGhlIHNlY3Rpb24gd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgc3ltYm9scy4gIFdlCisgICAgICAgICBjYW4ndCBjYWxsIHNsdXJwX3N5bXRhYiwgYmVjYXVzZSB0aGUgbGlua2VyIGRvZXNuJ3Qgd2FudCB0aGUKKyAgICAgICAgIHN3YXBwZWQgc3ltYm9scy4gICovCisKKyAgICAgIGlmIChfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQorCXsKKwkgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKKworCSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKKwkgIGVzeW1lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogU1lNRVNaOworCisJICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07CisKKwkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOworCisJICAgICAgaWYgKHNpemVvZiAoaW50ZXJuYWxfcy0+c19uYW1lKSA+IFNZTU5NTEVOKQorCQl7CisJCSAgLyogVGhpcyBjYXNlIGltcGxpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgc3ltYm9sIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCisJCSAgYWJvcnQgKCk7CisJCX0KKworCSAgICAgIGlmIChpc3ltLm5fc2NsYXNzID09IENfU1RBVAorCQkgICYmIGlzeW0ubl90eXBlID09IFRfTlVMTAorCQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKKwkJeworCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07CisJCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKKworCQkgIHN5bW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZpc3ltLCBidWYpOworCQkgIGlmIChzeW1uYW1lID09IE5VTEwpCisJCSAgICBhYm9ydCAoKTsKKworCQkgIGlmIChzdHJjbXAgKG5hbWUsIHN5bW5hbWUpID09IDApCisJCSAgICB7CisJCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7CisKKwkJICAgICAgLyogVGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLworCisJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIFNZTUVTWiksCisJCQkJCSAgICBpc3ltLm5fdHlwZSwgaXN5bS5uX3NjbGFzcywKKwkJCQkJICAgIDAsIGlzeW0ubl9udW1hdXgsIChQVFIpICZhdXgpOworCisJCSAgICAgIHN3aXRjaCAoYXV4Lnhfc2NuLnhfY29tZGF0KQorCQkJeworCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX05PRFVQTElDQVRFUzoKKwkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk7CisJCQkgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWToKKwkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKKwkJCSAgYnJlYWs7CisKKwkJCWNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU6CisJCQkgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRTsKKwkJCSAgYnJlYWs7CisKKwkJCWNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSDoKKwkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzsKKwkJCSAgYnJlYWs7CisKKwkJCWNhc2UgSU1BR0VfQ09NREFUX1NFTEVDVF9BU1NPQ0lBVElWRToKKwkJCSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCisJCQkgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7CisJCQkgIGJyZWFrOworCQkJfQorCisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisKKwkgICAgICBlc3ltICs9IChpc3ltLm5fbnVtYXV4ICsgMSkgKiBTWU1FU1o7CisJICAgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIChzZWNfZmxhZ3MpOworfQorCisjZGVmaW5lCWdldF9pbmRleChzeW1ib2wpCSgoc3ltYm9sKS0+dWRhdGEuaSkKKworLyoKK0lOVEVSTkFMX0RFRklOSVRJT04KKwliZmRfY29mZl9iYWNrZW5kX2RhdGEKKworQ09ERV9GUkFHTUVOVAorCitTcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2RiIHRvIHN3YXAgaW4gY29mZiBzeW1ib2wgdGFibGUgcGFydHM6CisudHlwZWRlZiBzdHJ1Y3QKKy57CisuICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYXV4X2luKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCisuICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCisuICAgICAgIGludCAgICAgICAgICAgICB0eXBlLAorLiAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCisuICAgICAgIGludCAgICAgICAgICAgICBpbmRhdXgsCisuICAgICAgIGludCAgICAgICAgICAgICBudW1hdXgsCisuICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOworLgorLiAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX3N5bV9pbikgUEFSQU1TICgoCisuICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKKy4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKKy4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7CisuCisuICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCisuICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKKy4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7CisuCisKK1NwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnYXMgdG8gc3dhcCBvdXQgY29mZiBwYXJ0czoKKworLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgCSphYmZkLAorLiAgICAgICBQVFIJaW4sCisuICAgICAgIGludCAgICAJdHlwZSwKKy4gICAgICAgaW50ICAgIAljbGFzcywKKy4gICAgICAgaW50ICAgICBpbmRhdXgsCisuICAgICAgIGludCAgICAgbnVtYXV4LAorLiAgICAgICBQVFIgICAgCWV4dCkpOworLgorLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSBQQVJBTVMgKCgKKy4gICAgICBiZmQgICAgICAqYWJmZCwKKy4gICAgICBQVFIJaW4sCisuICAgICAgUFRSCWV4dCkpOworLgorLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKKy4gICAgICAJYmZkICAgCSphYmZkLAorLiAgICAgIAlQVFIJaW4sCisuCVBUUglleHQpKTsKKy4KKy4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSBQQVJBTVMgKCgKKy4gICAgICAJYmZkICAgICAqYWJmZCwKKy4gICAgIAlQVFIJc3JjLAorLglQVFIJZHN0KSk7CisuCisuIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSBQQVJBTVMgKCgKKy4gICAgICAJYmZkICAJKmFiZmQsCisuCVBUUiAJaW4sCisuCVBUUiAJb3V0KSk7CisuCisuIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSBQQVJBTVMgKCgKKy4gICAgICAJYmZkIAkqYWJmZCwKKy4JUFRSIAlpbiwKKy4JUFRSCW91dCkpOworLgorLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSBQQVJBTVMgKCgKKy4gICAgICAJYmZkICAJKmFiZmQsCisuICAgICAgCVBUUglpbiwKKy4JUFRSCW91dCkpOworLgorCitTcGVjaWFsIGVudHJ5IHBvaW50cyBmb3IgZ2VuZXJpYyBDT0ZGIHJvdXRpbmVzIHRvIGNhbGwgdGFyZ2V0CitkZXBlbmRlbnQgQ09GRiByb3V0aW5lczoKKworLiB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7CisuIHVuc2lnbmVkIGludCBfYmZkX2FvdXRzejsKKy4gdW5zaWduZWQgaW50IF9iZmRfc2NuaHN6OworLiB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7CisuIHVuc2lnbmVkIGludCBfYmZkX2F1eGVzejsKKy4gdW5zaWduZWQgaW50IF9iZmRfcmVsc3o7CisuIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKKy4gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19maWxlbmFtZXM7CisuIGJvb2xlYW4gX2JmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lczsKKy4gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOworLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgUEFSQU1TICgoCisuICAgICAgIGJmZCAgICAgKmFiZmQsCisuICAgICAgIFBUUiAgICAgZXh0LAorLiAgICAgICBQVFIgICAgIGluKSk7CisuIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAqYWJmZCwKKy4gICAgICAgUFRSICAgICBleHQsCisuICAgICAgIFBUUiAgICAgaW4pKTsKKy4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCisuICAgICAgIGJmZCAgICAgKmFiZmQsCisuICAgICAgIFBUUiAgICAgZXh0LAorLiAgICAgICBQVFIgICAgIGluKSk7CisuIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgUEFSQU1TICgoCisuICAgICAgIGJmZCAgICAgKmFiZmQsCisuICAgICAgIFBUUiAgICAgZXh0LAorLiAgICAgICBQVFIgICAgIGluKSk7CisuIGJvb2xlYW4gKCpfYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAqYWJmZCwKKy4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7CisuIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAqYWJmZCwKKy4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7CisuIFBUUiAoKl9iZmRfY29mZl9ta29iamVjdF9ob29rKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAqYWJmZCwKKy4gICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyLAorLiAgICAgICBQVFIgICAgIGludGVybmFsX2FvdXRoZHIpKTsKKy4gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAorLiAgICAgICBiZmQgICAgICphYmZkLAorLiAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkciwKKy4gICAgICAgY29uc3QgY2hhciAqbmFtZSkpOworLiB2b2lkICgqX2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIFBBUkFNUyAoKAorLiAgICAgICBiZmQgICAgICphYmZkLAorLiAgICAgICBhc2VjdGlvbiAqc2VjLAorLiAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkcikpOworLiBib29sZWFuICgqX2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoCisuICAgICAgIGJmZCAgICAgKmFiZmQpKTsKKy4gYm9vbGVhbiAoKl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICAgICAqYWJmZCwKKy4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltKSk7CisuIGJvb2xlYW4gKCpfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykgUEFSQU1TICgoCisuICAgICAgIGJmZCAqYWJmZCwKKy4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKKy4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAorLiAgICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4LAorLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgpKTsKKy4gYm9vbGVhbiAoKl9iZmRfY29mZl9wcmludF9hdXgpIFBBUkFNUyAoKAorLiAgICAgICBiZmQgKmFiZmQsCisuICAgICAgIEZJTEUgKmZpbGUsCisuICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCisuICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbCwKKy4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4LAorLiAgICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4KSk7CisuIHZvaWQgKCpfYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcykgUEFSQU1TICgoCisuICAgICAgIGJmZCAgICAgKmFiZmQsCisuICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCisuICAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKKy4gICAgICAgYXJlbGVudCAqcmVsb2MsCisuICAgICAgIGJmZF9ieXRlICpkYXRhLAorLiAgICAgICB1bnNpZ25lZCBpbnQgKnNyY19wdHIsCisuICAgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cikpOworLiBpbnQgKCpfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSkgUEFSQU1TICgoCisuICAgICAgIGJmZCAqYWJmZCwKKy4gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisuICAgICAgIGFyZWxlbnQgKnIsCisuICAgICAgIHVuc2lnbmVkIGludCBzaHJpbmssCisuICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKKy4gYm9vbGVhbiAoKl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICphYmZkLAorLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKKy4gYm9vbGVhbiAoKl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpIFBBUkFNUyAoKAorLiAgICAgICBiZmQgKmFiZmQpKTsKKy4gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKKy4gICAgICAgYmZkICpvdXRwdXRfYmZkLAorLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOworLiBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAorLiAgICAgICBiZmQgKm91dHB1dF9iZmQsCisuICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorLiAgICAgICBiZmQgKmlucHV0X2JmZCwKKy4gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisuICAgICAgIGJmZF9ieXRlICpjb250ZW50cywKKy4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCisuICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXMsCisuICAgICAgIGFzZWN0aW9uICoqc2VjdGlvbnMpKTsKKy4gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAorLiAgICAgICBiZmQgKmFiZmQsCisuICAgICAgIGFzZWN0aW9uICpzZWMsCisuICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAorLiAgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgsCisuICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSwKKy4gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOworLiBib29sZWFuICgqX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpIFBBUkFNUyAoKAorLiAgICAgICBiZmQgKm9iZmQsCisuICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorLiAgICAgICBiZmQgKmliZmQsCisuICAgICAgIGFzZWN0aW9uICpzZWMsCisuICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCisuICAgICAgIGJvb2xlYW4gKmFkanVzdGVkcCkpOworLiBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpIFBBUkFNUyAoKAorLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKy4gICAgICAgYmZkICphYmZkLAorLiAgICAgICBjb25zdCBjaGFyICpuYW1lLAorLiAgICAgICBmbGFnd29yZCBmbGFncywgCisuICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAorLiAgICAgICBiZmRfdm1hIHZhbHVlLAorLiAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCisuICAgICAgIGJvb2xlYW4gY29weSwKKy4gICAgICAgYm9vbGVhbiBjb2xsZWN0LCAKKy4gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOworLgorLiBib29sZWFuICgqX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgUEFSQU1TICgoCisuCWJmZCAqIGFiZmQsCisuICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOworLiBib29sZWFuICgqX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgUEFSQU1TICgoCisuCWJmZCAqIGFiZmQsCisuCXN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOworLgorLn0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOworLgorLiNkZWZpbmUgY29mZl9iYWNrZW5kX2luZm8oYWJmZCkgKChiZmRfY29mZl9iYWNrZW5kX2RhdGEgKikgKGFiZmQpLT54dmVjLT5iYWNrZW5kX2RhdGEpCisuCisuI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9pbihhLGUsdCxjLGluZCxudW0saSkgXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9pbikgKGEsZSx0LGMsaW5kLG51bSxpKSkKKy4KKy4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX2luKGEsZSxpKSBcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX2luKSAoYSxlLGkpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4oYSxlLGkpIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKCBhKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSAoYSxlLGkpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQoYWJmZCwgaSwgbykgXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgKGFiZmQsIGksIG8pKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KGFiZmQsIGksIG8pIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSAoYWJmZCwgaSwgbykpCisuCisuI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9vdXQoYSxpLHQsYyxpbmQsbnVtLG8pIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSAoYSxpLHQsYyxpbmQsbnVtLG8pKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1fb3V0KGFiZmQsIGksbykgXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIChhYmZkLCBpLCBvKSkKKy4KKy4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dChhYmZkLCBpLG8pIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KSAoYWJmZCwgaSwgbykpCisuCisuI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KGFiZmQsIGksbykgXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSAoYWJmZCwgaSwgbykpCisuCisuI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsIGksbykgXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSAoYWJmZCwgaSwgbykpCisuCisuI2RlZmluZSBiZmRfY29mZl9maWxoc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxoc3opCisuI2RlZmluZSBiZmRfY29mZl9hb3V0c3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hb3V0c3opCisuI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCisuI2RlZmluZSBiZmRfY29mZl9zeW1lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zeW1lc3opCisuI2RlZmluZSBiZmRfY29mZl9hdXhlc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9hdXhlc3opCisuI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKKy4jZGVmaW5lIGJmZF9jb2ZmX2xpbmVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2xpbmVzeikKKy4jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX2ZpbGVuYW1lcykKKy4jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyhhYmZkKSBcCisuICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKQorLiNkZWZpbmUgYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcihhYmZkKSBcCisuCSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcikKKy4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbihhYmZkLCBpLG8pIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSAoYWJmZCwgaSwgbykpCisuCisuI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4oYWJmZCwgaSxvKSBcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgKGFiZmQsIGksIG8pKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4oYWJmZCwgaSxvKSBcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKSAoYWJmZCwgaSwgbykpCisuCisuI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX2luKGFiZmQsIGksIG8pIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgKGFiZmQsIGksIG8pKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKGFiZmQsIGZpbGVoZHIpIFwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCisuCisuI2RlZmluZSBiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2soYWJmZCwgZmlsZWhkcilcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQorLiNkZWZpbmUgYmZkX2NvZmZfbWtvYmplY3RfaG9vayhhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKVwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayhhYmZkLCBzY25oZHIsIG5hbWUpXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaykgKGFiZmQsIHNjbmhkciwgbmFtZSkpCisuCisuI2RlZmluZSBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2soYWJmZCwgc2VjLCBzY25oZHIpXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSAoYWJmZCwgc2VjLCBzY25oZHIpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKGFiZmQpXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKSkKKy4KKy4jZGVmaW5lIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcoYWJmZCwgc3ltKVwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgKGFiZmQsIHN5bSkpCisuCisuI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3ByaW50X2F1eClcCisuICAgICAgICAgKGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyhhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKVwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcylcCisuICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKKy4gICAgICAgICAoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKSkKKy4KKy4jZGVmaW5lIGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwoYWJmZCwgc3ltKVwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltX2lzX2dsb2JhbClcCisuICAgICAgICAgKGFiZmQsIHN5bSkpCisuCisuI2RlZmluZSBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMoYWJmZClcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucylcCisuICAgICAgICAgKGFiZmQpKQorLgorLiNkZWZpbmUgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayhvYmZkLCBpbmZvKVwKKy4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCisuICAgICAgICAgKG9iZmQsIGluZm8pKQorLiNkZWZpbmUgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbihvYmZkLGluZm8saWJmZCxvLGNvbixyZWwsaXN5bXMsc2VjcylcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAorLiAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBvLCBjb24sIHJlbCwgaXN5bXMsIHNlY3MpKQorLiNkZWZpbmUgYmZkX2NvZmZfcnR5cGVfdG9faG93dG8oYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcClcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKKy4gICAgICAgICAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkpCisuI2RlZmluZSBiZmRfY29mZl9hZGp1c3Rfc3ltbmR4KG9iZmQsIGluZm8sIGliZmQsIHNlYywgcmVsLCBhZGp1c3RlZHApXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKKy4gICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcCkpCisuI2RlZmluZSBiZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKGluZm8sYWJmZCxuYW1lLGZsYWdzLHNlY3Rpb24sdmFsdWUsc3RyaW5nLGNwLGNvbGwsaGFzaHApXAorLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKKy4gICAgICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNwLCBjb2xsLCBoYXNocCkpCisuCisuI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgKGEscCkpCisuI2RlZmluZSBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQoYSxwKSBcCisuICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCisuCisqLworCisvKiBTZWUgd2hldGhlciB0aGUgbWFnaWMgbnVtYmVyIG1hdGNoZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsIGZpbGVoZHIpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIFBUUiBmaWxlaGRyOworeworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOworCisgIGlmIChCQURNQUcgKCppbnRlcm5hbF9mKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogaWYgdGhlIG9wdGlvbmFsIGhlYWRlciBpcyBOVUxMIG9yIG5vdCB0aGUgY29ycmVjdCBzaXplIHRoZW4KKyAgICAgcXVpdDsgdGhlIG9ubHkgZGlmZmVyZW5jZSBJIGNhbiBzZWUgYmV0d2VlbiBtODhrIGRndXggaGVhZGVycyAoTUM4OERNQUdJQykKKyAgICAgYW5kIEludGVsIDk2MCByZWFkd3JpdGUgaGVhZGVycyAoSTk2MFdSTUFHSUMpIGlzIHRoYXQgdGhlCisgICAgIG9wdGlvbmFsIGhlYWRlciBpcyBvZiBhIGRpZmZlcmVudCBzaXplLgorCisgICAgIEJ1dCB0aGUgbWlwcyBrZWVwcyBleHRyYSBzdHVmZiBpbiBpdCdzIG9wdGhkciwgc28gZG9udCBjaGVjaworICAgICB3aGVuIGRvaW5nIHRoYXQKKyAgICAgKi8KKworI2lmIGRlZmluZWQoTTg4KSB8fCBkZWZpbmVkKEk5NjApCisgIGlmIChpbnRlcm5hbF9mLT5mX29wdGhkciAhPSAwICYmIEFPVVRTWiAhPSBpbnRlcm5hbF9mLT5mX29wdGhkcikKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAgIGluaXRpYWxpemUgYSBzZWN0aW9uIHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIHBlY3VsaWFyIHRvIHRoaXMKKyAgIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgY29mZgorKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKKyAgICAgYmZkICogYWJmZDsKKyAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOworeworICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7CisKKyAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSOworCisjaWZkZWYgUlM2MDAwQ09GRl9DCisgIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlciAhPSAwCisgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwgIi50ZXh0IikgPT0gMCkKKyAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB4Y29mZl9kYXRhIChhYmZkKS0+dGV4dF9hbGlnbl9wb3dlcjsKKyAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyICE9IDAKKyAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLmRhdGEiKSA9PSAwKQorICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5kYXRhX2FsaWduX3Bvd2VyOworI2VuZGlmCisKKyAgLyogQWxsb2NhdGUgYXV4IHJlY29yZHMgZm9yIHNlY3Rpb24gc3ltYm9scywgdG8gc3RvcmUgc2l6ZSBhbmQKKyAgICAgcmVsYXRlZCBpbmZvLgorCisgICAgIEBAIFRoZSAxMCBpcyBhIGd1ZXNzIGF0IGEgcGxhdXNpYmxlIG1heGltdW0gbnVtYmVyIG9mIGF1eCBlbnRyaWVzCisgICAgIChidXQgc2hvdWxkbid0IGJlIGEgY29uc3RhbnQpLiAgKi8KKyAgbmF0aXZlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCisJICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCkpOworICBpZiAobmF0aXZlID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIG5fbmFtZSwgbl92YWx1ZSwgb3Igbl9zY251bSBpbiB0aGUgbmF0aXZlCisgICAgIHN5bWJvbCBpbmZvcm1hdGlvbiwgc2luY2UgdGhleSdsbCBiZSBvdmVycmlkZW4gYnkgdGhlIEJGRCBzeW1ib2wKKyAgICAgYW55aG93LiAgSG93ZXZlciwgd2UgZG8gbmVlZCB0byBzZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MsCisgICAgIGluIGNhc2UgdGhpcyBzeW1ib2wgd2luZHMgdXAgZ2V0dGluZyB3cml0dGVuIG91dC4gIFRoZSB2YWx1ZSAwCisgICAgIGZvciBuX251bWF1eCBpcyBhbHJlYWR5IGNvcnJlY3QuICAqLworCisgIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOworICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gQ19TVEFUOworCisgIGNvZmZzeW1ib2wgKHNlY3Rpb24tPnN5bWJvbCktPm5hdGl2ZSA9IG5hdGl2ZTsKKworICAvKiBUaGUgLnN0YWIgc2VjdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8gMioqMiBhdCBtb3N0LCBiZWNhdXNlCisgICAgIG90aGVyd2lzZSB0aGVyZSBtYXkgYmUgZ2FwcyBpbiB0aGUgc2VjdGlvbiB3aGljaCBnZGIgd2lsbCBub3QKKyAgICAga25vdyBob3cgdG8gaW50ZXJwcmV0LiAgRXhhbWluaW5nIHRoZSBzZWN0aW9uIG5hbWUgaXMgYSBoYWNrLCBidXQKKyAgICAgdGhhdCBpcyBhbHNvIGhvdyBnZGIgbG9jYXRlcyB0aGUgc2VjdGlvbi4KKyAgICAgV2UgbmVlZCB0byBoYW5kbGUgdGhlIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb25zIHNpbWlsYXJseSwgdG8KKyAgICAgYXZvaWQgaW50cm9kdWNpbmcgbnVsbCB3b3JkcyBpbiB0aGUgdGFibGVzLiAgKi8KKyAgaWYgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiA+IDIKKyAgICAgICYmIChzdHJuY21wIChzZWN0aW9uLT5uYW1lLCAiLnN0YWIiLCA1KSA9PSAwCisJICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuY3RvcnMiKSA9PSAwCisJICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuZHRvcnMiKSA9PSAwKSkKKyAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOworCisgIC8qIFNpbWlsYXJseSwgdGhlIC5zdGFic3RyIHNlY3Rpb24gbXVzdCBiZSBhbGlnbmVkIHRvIDIqKjAgYXQgbW9zdC4gICovCisgIGlmIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgPiAwCisgICAgICAmJiBzdHJuY21wIChzZWN0aW9uLT5uYW1lLCAiLnN0YWJzdHIiLCA4KSA9PSAwKQorICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDA7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZmRlZiBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSCisKKy8qIFNldCB0aGUgYWxpZ25tZW50IG9mIGEgQkZEIHNlY3Rpb24uICAqLworCitzdGF0aWMgdm9pZCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKK3N0YXRpYyB2b2lkCitjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgc2VjdGlvbiwgc2NuaGRyKQorICAgICBiZmQgKiBhYmZkOworICAgICBhc2VjdGlvbiAqIHNlY3Rpb247CisgICAgIFBUUiBzY25oZHI7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKKyAgdW5zaWduZWQgaW50IGk7CisKKyNpZmRlZiBJOTYwCisgIC8qIEV4dHJhY3QgQUxJR04gZnJvbSAyKipBTElHTiBzdG9yZWQgaW4gc2VjdGlvbiBoZWFkZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgaWYgKCgxIDw8IGkpID49IGhkci0+c19hbGlnbikKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgVElDODBDT0ZGCisgIC8qIFRJIHRvb2xzIGhpamFjayBiaXRzIDgtMTEgZm9yIHRoZSBhbGlnbm1lbnQgKi8KKyAgaSA9IChoZHItPnNfZmxhZ3MgPj4gOCkgJiAweEYgOworI2VuZGlmCisgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IGk7Cit9CisKKyNlbHNlIC8qICEgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAqLworI2lmZGVmIENPRkZfV0lUSF9QRQorCisvKiBhIGNvdXBsZSBvZiBtYWNyb3MgdG8gaGVscCBzZXR0aW5nIHRoZSBhbGlnbm1lbnQgcG93ZXIgZmllbGQgKi8KKyNkZWZpbmUgQUxJR05fU0VUKGZpZWxkLHgseSkgXAorICBpZiAoKChmaWVsZCkgJiBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUykgPT0geCApXAorICB7XAorICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB5O1wKKyAgfQorCisjZGVmaW5lIEVMSUZBTElHTl9TRVQoZmllbGQseCx5KSBcCisgIGVsc2UgaWYgKCggKGZpZWxkKSAmIElNQUdFX1NDTl9BTElHTl82NEJZVEVTKSA9PSB4ICkgXAorICB7XAorICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB5O1wKKyAgfQorCitzdGF0aWMgdm9pZCBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKK3N0YXRpYyB2b2lkCitjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgc2VjdGlvbiwgc2NuaGRyKQorICAgICBiZmQgKiBhYmZkOworICAgICBhc2VjdGlvbiAqIHNlY3Rpb247CisgICAgIFBUUiBzY25oZHI7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKKworICBBTElHTl9TRVQgICAgIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl82NEJZVEVTLCA2KQorICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTLCA1KQorICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xNkJZVEVTLCA0KQorICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl84QllURVMsICAzKQorICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl80QllURVMsICAyKQorICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8yQllURVMsICAxKQorICBFTElGQUxJR05fU0VUIChoZHItPnNfZmxhZ3MsIElNQUdFX1NDTl9BTElHTl8xQllURVMsICAwKQorCisjaWZkZWYgUE9XRVJQQ19MRV9QRQorICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDIiKSA9PSAwKQorICAgIHsKKyAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDA7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkMyIpID09IDApCisgICAgeworICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ0IikgPT0gMCkKKyAgICB7CisgICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDUiKSA9PSAwKQorICAgIHsKKyAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkNiIpID09IDApCisgICAgeworICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5yZWxvYyIpID09IDApCisgICAgeworICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKHNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpID09IDApCisgICAgeworICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorICAvKiBJbiBhIFBFIGltYWdlIGZpbGUsIHRoZSBzX3BhZGRyIGZpZWxkIGhvbGRzIHRoZSB2aXJ0dWFsIHNpemUgb2YgYQorICAgICBzZWN0aW9uLCB3aGlsZSB0aGUgc19zaXplIGZpZWxkIGhvbGRzIHRoZSByYXcgc2l6ZS4gICovCisgIGlmIChoZHItPnNfcGFkZHIgIT0gMCkKKyAgICB7CisgICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pID09IE5VTEwpCisJeworCSAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQorCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKKwkgIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogRklYTUU6IFJldHVybiBlcnJvci4gICovCisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKKwl7CisJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnRkYXRhID0KKwkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEpKTsKKwkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnRkYXRhID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pLT52aXJ0X3NpemUgPSBoZHItPnNfcGFkZHI7CisgICAgfQorI2VuZGlmCisKK30KKyN1bmRlZiBBTElHTl9TRVQKKyN1bmRlZiBFTElGQUxJR05fU0VUCisKKyNlbHNlIC8qICEgQ09GRl9XSVRIX1BFICovCisjaWZkZWYgUlM2MDAwQ09GRl9DCisKKy8qIFdlIGdyb3NzbHkgYWJ1c2UgdGhpcyBmdW5jdGlvbiB0byBoYW5kbGUgWENPRkYgb3ZlcmZsb3cgaGVhZGVycy4KKyAgIFdoZW4gd2Ugc2VlIG9uZSwgd2UgY29ycmVjdCB0aGUgcmVsb2MgYW5kIGxpbmUgbnVtYmVyIGNvdW50cyBpbiB0aGUKKyAgIHJlYWwgaGVhZGVyLCBhbmQgcmVtb3ZlIHRoZSBzZWN0aW9uIHdlIGp1c3QgY3JlYXRlZC4gICovCisKK3N0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKKworc3RhdGljIHZvaWQKK2NvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIFBUUiBzY25oZHI7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKKyAgYXNlY3Rpb24gKnJlYWxfc2VjOworICBhc2VjdGlvbiAqKnBzOworCisgIGlmICgoaGRyLT5zX2ZsYWdzICYgU1RZUF9PVlJGTE8pID09IDApCisgICAgcmV0dXJuOworCisgIHJlYWxfc2VjID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBoZHItPnNfbnJlbG9jKTsKKyAgaWYgKHJlYWxfc2VjID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHJlYWxfc2VjLT5yZWxvY19jb3VudCA9IGhkci0+c19wYWRkcjsKKyAgcmVhbF9zZWMtPmxpbmVub19jb3VudCA9IGhkci0+c192YWRkcjsKKworICBmb3IgKHBzID0gJmFiZmQtPnNlY3Rpb25zOyAqcHMgIT0gTlVMTDsgcHMgPSAmKCpwcyktPm5leHQpCisgICAgeworICAgICAgaWYgKCpwcyA9PSBzZWN0aW9uKQorCXsKKwkgICpwcyA9ICgqcHMpLT5uZXh0OworCSAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworI2Vsc2UgLyogISBSUzYwMDBDT0ZGX0MgKi8KKworI2RlZmluZSBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBcCisgICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpKSBiZmRfdm9pZCkKKworI2VuZGlmIC8qICEgUlM2MDAwQ09GRl9DICovCisjZW5kaWYgLyogISBDT0ZGX1dJVEhfUEUgKi8KKyNlbmRpZiAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KKworI2lmbmRlZiBjb2ZmX21rb2JqZWN0CisKK3N0YXRpYyBib29sZWFuIGNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGJvb2xlYW4KK2NvZmZfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqIGFiZmQ7Cit7CisgIGNvZmZfZGF0YV90eXBlICpjb2ZmOworCisgIGFiZmQtPnRkYXRhLmNvZmZfb2JqX2RhdGEgPSAoc3RydWN0IGNvZmZfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX2RhdGFfdHlwZSkpOworICBpZiAoYWJmZC0+dGRhdGEuY29mZl9vYmpfZGF0YSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgY29mZiA9IGNvZmZfZGF0YSAoYWJmZCk7CisgIGNvZmYtPnN5bWJvbHMgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOworICBjb2ZmLT5jb252ZXJzaW9uX3RhYmxlID0gKHVuc2lnbmVkIGludCAqKSBOVUxMOworICBjb2ZmLT5yYXdfc3ltZW50cyA9IChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopIE5VTEw7CisgIGNvZmYtPnJlbG9jYmFzZSA9IDA7CisgIGNvZmYtPmxvY2FsX3RvY19zeW1fbWFwID0gMDsKKworLyogIG1ha2VfYWJzX3NlY3Rpb24oYWJmZCk7Ki8KKworICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisvKiBDcmVhdGUgdGhlIENPRkYgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCisjaWZuZGVmIGNvZmZfbWtvYmplY3RfaG9vaworc3RhdGljIFBUUgorY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQorICAgICBiZmQgKiBhYmZkOworICAgICBQVFIgZmlsZWhkcjsKKyAgICAgUFRSIGFvdXRoZHI7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7CisgIGNvZmZfZGF0YV90eXBlICpjb2ZmOworCisgIGlmIChjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKKyAgICByZXR1cm4gTlVMTDsKKworICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKKworICBjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOworCisgIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCisgICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJworICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCisgIGNvZmYtPmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7CisgIGNvZmYtPmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7CisgIGNvZmYtPmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOworICBjb2ZmLT5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOworICBjb2ZmLT5sb2NhbF9zeW1lc3ogPSBTWU1FU1o7CisgIGNvZmYtPmxvY2FsX2F1eGVzeiA9IEFVWEVTWjsKKyAgY29mZi0+bG9jYWxfbGluZXN6ID0gTElORVNaOworCisgIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9CisgICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQorICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKKworI2lmZGVmIFJTNjAwMENPRkZfQworICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1NIUk9CSikgIT0gMCkKKyAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOworICBpZiAoYW91dGhkciAhPSBOVUxMICYmIGludGVybmFsX2YtPmZfb3B0aGRyID49IEFPVVRTWikKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYSA9CisJKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7CisgICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmOworCisgICAgICB4Y29mZiA9IHhjb2ZmX2RhdGEgKGFiZmQpOworICAgICAgeGNvZmYtPmZ1bGxfYW91dGhkciA9IHRydWU7CisgICAgICB4Y29mZi0+dG9jID0gaW50ZXJuYWxfYS0+b190b2M7CisgICAgICB4Y29mZi0+c250b2MgPSBpbnRlcm5hbF9hLT5vX3NudG9jOworICAgICAgeGNvZmYtPnNuZW50cnkgPSBpbnRlcm5hbF9hLT5vX3NuZW50cnk7CisgICAgICB4Y29mZi0+dGV4dF9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbnRleHQ7CisgICAgICB4Y29mZi0+ZGF0YV9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbmRhdGE7CisgICAgICB4Y29mZi0+bW9kdHlwZSA9IGludGVybmFsX2EtPm9fbW9kdHlwZTsKKyAgICAgIHhjb2ZmLT5jcHV0eXBlID0gaW50ZXJuYWxfYS0+b19jcHV0eXBlOworICAgICAgeGNvZmYtPm1heGRhdGEgPSBpbnRlcm5hbF9hLT5vX21heGRhdGE7CisgICAgICB4Y29mZi0+bWF4c3RhY2sgPSBpbnRlcm5hbF9hLT5vX21heHN0YWNrOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQVJNIAorICAvKiBTZXQgdGhlIGZsYWdzIGZpZWxkIGZyb20gdGhlIENPRkYgaGVhZGVyIHJlYWQgaW4gKi8KKyAgaWYgKCEgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgaW50ZXJuYWxfZi0+Zl9mbGFncykpCisgICAgY29mZi0+ZmxhZ3MgPSAwOworI2VuZGlmCisgIAorICByZXR1cm4gKFBUUikgY29mZjsKK30KKyNlbmRpZgorCisvKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgRklYTUU6IFRoaXMgaXMgdGFyZ2V0CisgICBkZXBlbmRlbnQgYmVjYXVzZSB0aGUgbWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiB0aGUgdGFyZ2V0CisgICBkZXBlbmRlbnQgaGVhZGVyIGZpbGVzLiAgQnV0IHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgbmVlZCBmb3IgdGhpcy4KKyAgIElmIHRoZSBtYWdpYyBudW1iZXJzIHdlcmUgbW92ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlLCB0aGlzIGZ1bmN0aW9uCisgICB3b3VsZCBiZSB0YXJnZXQgaW5kZXBlbmRlbnQgYW5kIHdvdWxkIGFsc28gYmUgbXVjaCBtb3JlIHN1Y2Nlc3NmdWwKKyAgIGF0IGxpbmtpbmcgdG9nZXRoZXIgQ09GRiBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIGZpbGVoZHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGZpbGVoZHI7Cit7CisgIGxvbmcgbWFjaGluZTsKKyAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7CisKKyAgbWFjaGluZSA9IDA7CisgIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKKyAgICB7CisjaWZkZWYgUFBDTUFHSUMKKyAgICBjYXNlIFBQQ01BR0lDOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7CisgICAgICBtYWNoaW5lID0gMDsgLyogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKGtyaykgKi8KKyAgICAgIGJyZWFrOyAKKyNlbmRpZgorI2lmZGVmIEkzODZNQUdJQworICAgIGNhc2UgSTM4Nk1BR0lDOgorICAgIGNhc2UgSTM4NlBUWE1BR0lDOgorICAgIGNhc2UgSTM4NkFJWE1BR0lDOgkJLyogRGFuYnVyeSBQUy8yIEFJWCBDIENvbXBpbGVyICovCisgICAgY2FzZSBMWU5YQ09GRk1BR0lDOgkvKiBzaGFkb3dzIHRoZSBtNjhrIEx5bnggbnVtYmVyIGJlbG93LCBzaWdoICovCisgICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKKyAgICAgIG1hY2hpbmUgPSAwOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBMjlLX01BR0lDX0JJRworICAgIGNhc2UgQTI5S19NQUdJQ19CSUc6CisgICAgY2FzZSBBMjlLX01BR0lDX0xJVFRMRToKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSTU1BR0lDCisgICAgY2FzZSBBUk1NQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9hcm07CisgICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSykKKwl7CisJY2FzZSBGX0FSTV8yOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8yOyAgYnJlYWs7CisJY2FzZSBGX0FSTV8zOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zOyAgYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIEZfQVJNXzQ6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzQ7ICBicmVhazsKKwljYXNlIEZfQVJNXzRUOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzRUOyBicmVhazsKKwl9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIE1DNjhNQUdJQworICAgIGNhc2UgTUM2OE1BR0lDOgorICAgIGNhc2UgTTY4TUFHSUM6CisjaWZkZWYgTUM2OEtCQ1NNQUdJQworICAgIGNhc2UgTUM2OEtCQ1NNQUdJQzoKKyNlbmRpZgorI2lmZGVmIEFQT0xMT002OEtNQUdJQworICAgIGNhc2UgQVBPTExPTTY4S01BR0lDOgorI2VuZGlmCisjaWZkZWYgTFlOWENPRkZNQUdJQworICAgIGNhc2UgTFlOWENPRkZNQUdJQzoKKyNlbmRpZgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNQzg4TUFHSUMKKyAgICBjYXNlIE1DODhNQUdJQzoKKyAgICBjYXNlIE1DODhETUFHSUM6CisgICAgY2FzZSBNQzg4T01BR0lDOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX204OGs7CisgICAgICBtYWNoaW5lID0gODgxMDA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFo4S01BR0lDCisgICAgY2FzZSBaOEtNQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF96OGs7CisgICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX01BQ0hNQVNLKQorCXsKKwljYXNlIEZfWjgwMDE6CisJICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDE7CisJICBicmVhazsKKwljYXNlIEZfWjgwMDI6CisJICBtYWNoaW5lID0gYmZkX21hY2hfejgwMDI7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgSTg2MAorICAgIGNhc2UgSTg2ME1BR0lDOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX2k4NjA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEk5NjAKKyNpZmRlZiBJOTYwUk9NQUdJQworICAgIGNhc2UgSTk2MFJPTUFHSUM6CisgICAgY2FzZSBJOTYwUldNQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9pOTYwOworICAgICAgc3dpdGNoIChGX0k5NjBUWVBFICYgaW50ZXJuYWxfZi0+Zl9mbGFncykKKwl7CisJZGVmYXVsdDoKKwljYXNlIEZfSTk2MENPUkU6CisJICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBLQjoKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBNQzoKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX21jOworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBYQToKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBDQToKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NhOworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBLQToKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBKWDoKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2p4OworCSAgYnJlYWs7CisJY2FzZSBGX0k5NjBIWDoKKwkgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2h4OworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUlM2MDAwQ09GRl9DCisgICAgY2FzZSBVODAyUk9NQUdJQzoKKyAgICBjYXNlIFU4MDJXUk1BR0lDOgorICAgIGNhc2UgVTgwMlRPQ01BR0lDOgorICAgICAgeworCWludCBjcHV0eXBlOworCisJaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlICE9IC0xKQorCSAgY3B1dHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlICYgMHhmZjsKKwllbHNlCisJICB7CisJICAgIC8qIFdlIGRpZCBub3QgZ2V0IGEgdmFsdWUgZnJvbSB0aGUgYS5vdXQgaGVhZGVyLiAgSWYgdGhlCisJICAgICAgIGZpbGUgaGFzIG5vdCBiZWVuIHN0cmlwcGVkLCB3ZSBtYXkgYmUgYWJsZSB0byBnZXQgdGhlCisJICAgICAgIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaXJzdCBzeW1ib2wsIGlmIGl0CisJICAgICAgIGlzIGEgLmZpbGUgc3ltYm9sLiAgKi8KKwkgICAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9PSAwKQorCSAgICAgIGNwdXR5cGUgPSAwOworCSAgICBlbHNlCisJICAgICAgeworCQliZmRfYnl0ZSBidWZbU1lNRVNaXTsKKwkJc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07CisKKwkJaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAorCQkgICAgfHwgYmZkX3JlYWQgKGJ1ZiwgMSwgU1lNRVNaLCBhYmZkKSAhPSBTWU1FU1opCisJCSAgcmV0dXJuIGZhbHNlOworCQljb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBidWYsIChQVFIpICZzeW0pOworCQlpZiAoc3ltLm5fc2NsYXNzID09IENfRklMRSkKKwkJICBjcHV0eXBlID0gc3ltLm5fdHlwZSAmIDB4ZmY7CisJCWVsc2UKKwkJICBjcHV0eXBlID0gMDsKKwkgICAgICB9CisJICB9CisKKwkvKiBGSVhNRTogV2UgZG9uJ3QgaGFuZGxlIGFsbCBjYXNlcyBoZXJlLiAgKi8KKwlzd2l0Y2ggKGNwdXR5cGUpCisJICB7CisJICBkZWZhdWx0OgorCSAgY2FzZSAwOgorI2lmZGVmIFBPV0VSTUFDCisJICAgIC8qIFBvd2VyUEMgTWFjcyB1c2UgdGhlIHNhbWUgbWFnaWMgbnVtYmVycyBhcyBSUy82MDAwCisJICAgICAgIChiZWNhdXNlIHRoYXQncyBob3cgdGhleSB3ZXJlIGJvb3RzdHJhcHBlZCBvcmlnaW5hbGx5KSwKKwkgICAgICAgYnV0IHRoZXkgYXJlIGFsd2F5cyBQb3dlclBDIGFyY2hpdGVjdHVyZS4gICovCisJICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOworCSAgICBtYWNoaW5lID0gMDsKKyNlbHNlCisJICAgIGFyY2ggPSBiZmRfYXJjaF9yczYwMDA7CisJICAgIG1hY2hpbmUgPSA2MDAwOworI2VuZGlmIC8qIFBPV0VSTUFDICovCisJICAgIGJyZWFrOworCisJICBjYXNlIDE6CisJICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOworCSAgICBtYWNoaW5lID0gNjAxOworCSAgICBicmVhazsKKwkgIGNhc2UgMjogLyogNjQgYml0IFBvd2VyUEMgKi8KKwkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7CisJICAgIG1hY2hpbmUgPSA2MjA7CisJICAgIGJyZWFrOworCSAgY2FzZSAzOgorCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKKwkgICAgbWFjaGluZSA9IDA7CisJICAgIGJyZWFrOworCSAgY2FzZSA0OgorCSAgICBhcmNoID0gYmZkX2FyY2hfcnM2MDAwOworCSAgICBtYWNoaW5lID0gNjAwMDsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgV0UzMktNQUdJQworICAgIGNhc2UgV0UzMktNQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF93ZTMyazsKKyAgICAgIG1hY2hpbmUgPSAwOworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEg4MzAwTUFHSUMKKyAgICBjYXNlIEg4MzAwTUFHSUM6CisgICAgICBhcmNoID0gYmZkX2FyY2hfaDgzMDA7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfaDgzMDA7CisgICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLworICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBIODMwMEhNQUdJQworICAgIGNhc2UgSDgzMDBITUFHSUM6CisgICAgICBhcmNoID0gYmZkX2FyY2hfaDgzMDA7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfaDgzMDBoOworICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KKyAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgSDgzMDBTTUFHSUMKKyAgICBjYXNlIEg4MzAwU01BR0lDOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOworICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwczsKKyAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCisgICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIFNIX0FSQ0hfTUFHSUNfQklHCisgICAgY2FzZSBTSF9BUkNIX01BR0lDX0JJRzoKKyAgICBjYXNlIFNIX0FSQ0hfTUFHSUNfTElUVExFOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3NoOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgSDg1MDBNQUdJQworICAgIGNhc2UgSDg1MDBNQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODUwMDsKKyAgICAgIG1hY2hpbmUgPSAwOworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIFNQQVJDTUFHSUMKKyAgICBjYXNlIFNQQVJDTUFHSUM6CisjaWZkZWYgTFlOWENPRkZNQUdJQworICAgIGNhc2UgTFlOWENPRkZNQUdJQzoKKyNlbmRpZgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgVElDMzBNQUdJQworICAgIGNhc2UgVElDMzBNQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF90aWMzMDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBUSUM4MF9BUkNIX01BR0lDCisgICAgY2FzZSBUSUM4MF9BUkNIX01BR0lDOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX3RpYzgwOworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIE1DT1JFTUFHSUMKKyAgICBjYXNlIE1DT1JFTUFHSUM6CisgICAgICBhcmNoID0gYmZkX2FyY2hfbWNvcmU7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CQkJLyogVW5yZWFkYWJsZSBpbnB1dCBmaWxlIHR5cGUgKi8KKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmZGVmIFNZTU5BTUVfSU5fREVCVUcKKworc3RhdGljIGJvb2xlYW4gc3ltbmFtZV9pbl9kZWJ1Z19ob29rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKKworc3RhdGljIGJvb2xlYW4KK3N5bW5hbWVfaW5fZGVidWdfaG9vayAoYWJmZCwgc3ltKQorICAgICBiZmQgKiBhYmZkOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Cit7CisgIHJldHVybiBTWU1OQU1FX0lOX0RFQlVHIChzeW0pID8gdHJ1ZSA6IGZhbHNlOworfQorCisjZWxzZQorCisjZGVmaW5lIHN5bW5hbWVfaW5fZGVidWdfaG9vayBcCisgIChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSkpIGJmZF9mYWxzZQorCisjZW5kaWYKKworI2lmZGVmIFJTNjAwMENPRkZfQworCisvKiBIYW5kbGUgdGhlIGNzZWN0IGF1eGVudCBvZiBhIENfRVhUIG9yIENfSElERVhUIHN5bWJvbC4gICovCisKK3N0YXRpYyBib29sZWFuIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaworICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCisJICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7CisgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKKyAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKKyAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OworeworICBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOworCisgIGlmICgoY2xhc3MgPT0gQ19FWFQgfHwgY2xhc3MgPT0gQ19ISURFWFQpCisgICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCisgICAgeworICAgICAgaWYgKFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX0xEKQorCXsKKwkgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wID0KKwkgICAgdGFibGVfYmFzZSArIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sOworCSAgYXV4LT5maXhfc2NubGVuID0gMTsKKwl9CisKKyAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgbm90IGRvIGFueQorICAgICAgICAgZnVydGhlciB3b3JrIG9uIHRoaXMgYXV4ZW50LiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF1eGVudCBzaG91bGQgYmUgaGFuZGxlZCBieQorICAgICB0aGUgY2FsbGVyLiAgKi8KKyAgcmV0dXJuIGZhbHNlOworfQorCisjZWxzZQorI2lmZGVmIEk5NjAKKworLyogV2UgZG9uJ3Qgd2FudCB0byBwb2ludGVyaXplIGJhbCBlbnRyaWVzLiAgKi8KKworc3RhdGljIGJvb2xlYW4gY29mZl9wb2ludGVyaXplX2F1eF9ob29rCisgIFBBUkFNUyAoKGJmZCAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKKwkgICB1bnNpZ25lZCBpbnQsIGNvbWJpbmVkX2VudHJ5X3R5cGUgKikpOworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKKyAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOworICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4OworICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7Cit7CisgIC8qIFJldHVybiB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSB0aGlzIGF1eCBlbnRyeSwgd2hpY2gKKyAgICAgaXMgdGhlIGNhc2UgZm9yIHRoZSBsYXN0Zmlyc3QgYXV4IGVudHJ5IGZvciBhIENfTEVBRlBST0Mgc3ltYm9sLiAgKi8KKyAgcmV0dXJuIChpbmRhdXggPT0gMQorCSAgJiYgKHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGUFJPQworCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGU1RBVAorCSAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19MRUFGRVhUKSk7Cit9CisKKyNlbHNlIC8qICEgSTk2MCAqLworCisjZGVmaW5lIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAwCisKKyNlbmRpZiAvKiAhIEk5NjAgKi8KKyNlbmRpZiAvKiAhIFJTNjAwMENPRkZfQyAqLworCisvKiBQcmludCBhbiBhdXggZW50cnkuICBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBoYXMgcHJpbnRlZCBpdC4gICovCisKK3N0YXRpYyBib29sZWFuIGNvZmZfcHJpbnRfYXV4CisgIFBBUkFNUyAoKGJmZCAqLCBGSUxFICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAorCSAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgdGFibGVfYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkKKyAgICAgYmZkICphYmZkOworICAgICBGSUxFICpmaWxlOworICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOworICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7CisgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eDsKKyAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKK3sKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgaWYgKChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRVhUCisgICAgICAgfHwgc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0hJREVYVCkKKyAgICAgICYmIGluZGF1eCArIDEgPT0gc3ltYm9sLT51LnN5bWVudC5uX251bWF1eCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgY3NlY3QgZW50cnkuICAqLworICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCAiKTsKKyAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApICE9IFhUWV9MRCkKKwl7CisJICBCRkRfQVNTRVJUICghIGF1eC0+Zml4X3Njbmxlbik7CisJICBmcHJpbnRmIChmaWxlLCAidmFsICU1bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwcmludGYgKGZpbGUsICJpbmR4ICIpOworCSAgaWYgKCEgYXV4LT5maXhfc2NubGVuKQorCSAgICBmcHJpbnRmIChmaWxlLCAiJTRsZCIsIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5sKTsKKwkgIGVsc2UKKwkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLAorCQkgICAgIChsb25nKSAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAgLSB0YWJsZV9iYXNlKSk7CisJfQorICAgICAgZnByaW50ZiAoZmlsZSwKKwkgICAgICAgIiBwcm1oc2ggJWxkIHNuaHNoICV1IHR5cCAlZCBhbGduICVkIGNsc3MgJXUgc3RiICVsZCBzbnN0YiAldSIsCisJICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Bhcm1oYXNoLAorCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbmhhc2gsCisJICAgICAgIFNNVFlQX1NNVFlQIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCisJICAgICAgIFNNVFlQX0FMSUdOIChhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbXR5cCksCisJICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtY2xhcywKKwkgICAgICAgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc3RhYiwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25zdGFiKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgorCisgIC8qIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IG5vIHNwZWNpYWwgYWN0aW9uIHdhcyB0YWtlbi4gICovCisgIHJldHVybiBmYWxzZTsKK30KKworLyoKK1NVQlNVQlNFQ1RJT04KKwlXcml0aW5nIHJlbG9jYXRpb25zCisKKwlUbyB3cml0ZSByZWxvY2F0aW9ucywgdGhlIGJhY2sgZW5kIHN0ZXBzIHRob3VnaCB0aGUKKwljYW5vbmljYWwgcmVsb2NhdGlvbiB0YWJsZSBhbmQgY3JlYXRlIGFuCisJQGNvZGV7aW50ZXJuYWxfcmVsb2N9LiBUaGUgc3ltYm9sIGluZGV4IHRvIHVzZSBpcyByZW1vdmVkIGZyb20KKwl0aGUgQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIHN1cHBsaWVkLiAgVGhlCisJYWRkcmVzcyBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdW0gb2YgdGhlIHNlY3Rpb24gYmFzZQorCWFkZHJlc3MgYW5kIHRoZSByZWxvY2F0aW9uIG9mZnNldDsgdGhlIHR5cGUgaXMgZHVnIGRpcmVjdGx5CisJZnJvbSB0aGUgaG93dG8gZmllbGQuICBUaGVuIHRoZSBAY29kZXtpbnRlcm5hbF9yZWxvY30gaXMKKwlzd2FwcGVkIGludG8gdGhlIHNoYXBlIG9mIGFuIEBjb2Rle2V4dGVybmFsX3JlbG9jfSBhbmQgd3JpdHRlbgorCW91dCB0byBkaXNrLgorCisqLworCisjaWZkZWYgVEFSR19BVVgKKworc3RhdGljIGludCBjb21wYXJlX2FyZWxlbnRfcHRyIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisKKy8qIEFVWCdzIGxkIHdhbnRzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLworc3RhdGljIGludAorY29tcGFyZV9hcmVsZW50X3B0ciAoeCwgeSkKKyAgICAgY29uc3QgUFRSIHg7CisgICAgIGNvbnN0IFBUUiB5OworeworICBjb25zdCBhcmVsZW50ICoqYSA9IChjb25zdCBhcmVsZW50ICoqKSB4OworICBjb25zdCBhcmVsZW50ICoqYiA9IChjb25zdCBhcmVsZW50ICoqKSB5OworICBiZmRfc2l6ZV90eXBlIGFhZHIgPSAoKmEpLT5hZGRyZXNzOworICBiZmRfc2l6ZV90eXBlIGJhZHIgPSAoKmIpLT5hZGRyZXNzOworCisgIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOworfQorCisjZW5kaWYgLyogVEFSR19BVVggKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfd3JpdGVfcmVsb2NzIChhYmZkLCBmaXJzdF91bmRlZikKKyAgICAgYmZkICogYWJmZDsKKyAgICAgaW50IGZpcnN0X3VuZGVmOworeworICBhc2VjdGlvbiAqczsKKworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgZHN0OworICAgICAgYXJlbGVudCAqKnA7CisKKyNpZm5kZWYgVEFSR19BVVgKKyAgICAgIHAgPSBzLT5vcmVsb2NhdGlvbjsKKyNlbHNlCisgICAgICAvKiBzb3J0IHJlbG9jYXRpb25zIGJlZm9yZSB3ZSB3cml0ZSB0aGVtIG91dCAqLworICAgICAgcCA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7CisgICAgICBpZiAocCA9PSBOVUxMICYmIHMtPnJlbG9jX2NvdW50ID4gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBtZW1jcHkgKHAsIHMtPm9yZWxvY2F0aW9uLCBzLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7CisgICAgICBxc29ydCAocCwgcy0+cmVsb2NfY291bnQsIHNpemVvZiAoYXJlbGVudCAqKSwgY29tcGFyZV9hcmVsZW50X3B0cik7CisjZW5kaWYKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJlbG9jX2NvdW50OyBpKyspCisJeworCSAgc3RydWN0IGludGVybmFsX3JlbG9jIG47CisJICBhcmVsZW50ICpxID0gcFtpXTsKKwkgIG1lbXNldCAoKFBUUikgJiBuLCAwLCBzaXplb2YgKG4pKTsKKworCSAgLyogTm93IHdlJ3ZlIHJlbnVtYmVyZWQgdGhlIHN5bWJvbHMgd2Uga25vdyB3aGVyZSB0aGUKKwkgICAgIHVuZGVmaW5lZCBzeW1ib2xzIGxpdmUgaW4gdGhlIHRhYmxlLiAgQ2hlY2sgdGhlIHJlbG9jCisJICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIHdobydzIG91dHB1dCBiZmQgaXNuJ3QgdGhlIHJpZ2h0IG9uZS4KKwkgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQgKHdoaWNoIG1lYW5zCisJICAgICB0aGF0IGFsbCB0aGUgcG9pbnRlcnMgYXJlIG5ldmVyIG1hZGUgdG8gcG9pbnQgdG8gdGhlIHNhbWUKKwkgICAgIHBsYWNlKS4gVGhpcyBpcyBhIGJhZCB0aGluZywnY2F1c2UgdGhlIHN5bWJvbHMgYXR0YWNoZWQKKwkgICAgIHRvIHRoZSBvdXRwdXQgYmZkIGFyZSBpbmRleGVkLCBzbyB0aGF0IHRoZSByZWxvY2F0aW9uCisJICAgICBlbnRyaWVzIGtub3cgd2hpY2ggc3ltYm9sIGluZGV4IHRoZXkgcG9pbnQgdG8uICBTbyB3ZQorCSAgICAgaGF2ZSB0byBsb29rIHVwIHRoZSBvdXRwdXQgc3ltYm9sIGhlcmUuICovCisKKwkgIGlmIChxLT5zeW1fcHRyX3B0clswXS0+dGhlX2JmZCAhPSBhYmZkKQorCSAgICB7CisJICAgICAgaW50IGk7CisJICAgICAgY29uc3QgY2hhciAqc25hbWUgPSBxLT5zeW1fcHRyX3B0clswXS0+bmFtZTsKKwkgICAgICBhc3ltYm9sICoqb3V0c3ltcyA9IGFiZmQtPm91dHN5bWJvbHM7CisJICAgICAgZm9yIChpID0gZmlyc3RfdW5kZWY7IG91dHN5bXNbaV07IGkrKykKKwkJeworCQkgIGNvbnN0IGNoYXIgKmludGFibGUgPSBvdXRzeW1zW2ldLT5uYW1lOworCQkgIGlmIChzdHJjbXAgKGludGFibGUsIHNuYW1lKSA9PSAwKSB7CisJCSAgICAvKiBnb3QgYSBoaXQsIHNvIHJlcG9pbnQgdGhlIHJlbG9jICovCisJCSAgICBxLT5zeW1fcHRyX3B0ciA9IG91dHN5bXMgKyBpOworCQkgICAgYnJlYWs7CisJCSAgfQorCQl9CisJICAgIH0KKworCSAgbi5yX3ZhZGRyID0gcS0+YWRkcmVzcyArIHMtPnZtYTsKKworI2lmZGVmIFJfSUhDT05TVAorCSAgLyogVGhlIDI5ayBjb25zdC9jb25zdGggcmVsb2MgcGFpciBpcyBhIHJlYWwga2x1ZGdlLiAgVGhlIGNvbnN0aAorCSAgICAgcGFydCBkb2Vzbid0IGhhdmUgYSBzeW1ib2w7IGl0IGhhcyBhbiBvZmZzZXQuICBTbyByZWJ1aWx0CisJICAgICB0aGF0IGhlcmUuICAqLworCSAgaWYgKHEtPmhvd3RvLT50eXBlID09IFJfSUhDT05TVCkKKwkgICAgbi5yX3N5bW5keCA9IHEtPmFkZGVuZDsKKwkgIGVsc2UKKyNlbmRpZgorCSAgICBpZiAocS0+c3ltX3B0cl9wdHIpCisJICAgICAgeworCQlpZiAocS0+c3ltX3B0cl9wdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHIpCisJCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGFic29sdXRlIHN5bWJvbC4gICovCisJCSAgbi5yX3N5bW5keCA9IC0xOworCQllbHNlCisJCSAgeworCQkgICAgbi5yX3N5bW5keCA9IGdldF9pbmRleCAoKCoocS0+c3ltX3B0cl9wdHIpKSk7CisJCSAgICAvKiBUYWtlIG5vdGljZSBpZiB0aGUgc3ltYm9sIHJlbG9jIHBvaW50cyB0byBhIHN5bWJvbAorCQkgICAgICAgd2UgZG9uJ3QgaGF2ZSBpbiBvdXIgc3ltYm9sIHRhYmxlLiAgV2hhdCBzaG91bGQgd2UKKwkJICAgICAgIGRvIGZvciB0aGlzPz8gICovCisJCSAgICBpZiAobi5yX3N5bW5keCA+IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQorCQkgICAgICBhYm9ydCAoKTsKKwkJICB9CisJICAgICAgfQorCisjaWZkZWYgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUCisJICBuLnJfb2Zmc2V0ID0gcS0+YWRkZW5kOworI2VuZGlmCisKKyNpZmRlZiBTRUxFQ1RfUkVMT0MKKwkgIC8qIFdvcmsgb3V0IHJlbG9jIHR5cGUgZnJvbSB3aGF0IGlzIHJlcXVpcmVkICovCisJICBTRUxFQ1RfUkVMT0MgKG4sIHEtPmhvd3RvKTsKKyNlbHNlCisJICBuLnJfdHlwZSA9IHEtPmhvd3RvLT50eXBlOworI2VuZGlmCisJICBjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmbiwgJmRzdCk7CisJICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIGRzdCwgMSwgUkVMU1osIGFiZmQpICE9IFJFTFNaKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisjaWZkZWYgVEFSR19BVVgKKyAgICAgIGlmIChwICE9IE5VTEwpCisJZnJlZSAocCk7CisjZW5kaWYKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNldCBmbGFncyBhbmQgbWFnaWMgbnVtYmVyIG9mIGEgY29mZiBmaWxlIGZyb20gYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCisgICB0eXBlLiAgUmVzdWx0IGlzIHRydWUgaWYgd2UgY2FuIHJlcHJlc2VudCB0aGUgYXJjaCZ0eXBlLCBmYWxzZSBpZiBub3QuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9zZXRfZmxhZ3MgKGFiZmQsIG1hZ2ljcCwgZmxhZ3NwKQorICAgICBiZmQgKiBhYmZkOworICAgICB1bnNpZ25lZCBpbnQgKm1hZ2ljcDsKKyAgICAgdW5zaWduZWQgc2hvcnQgKmZsYWdzcDsKK3sKKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQorICAgIHsKKyNpZmRlZiBaOEtNQUdJQworICAgIGNhc2UgYmZkX2FyY2hfejhrOgorICAgICAgKm1hZ2ljcCA9IFo4S01BR0lDOworICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorCXsKKwljYXNlIGJmZF9tYWNoX3o4MDAxOgorCSAgKmZsYWdzcCA9IEZfWjgwMDE7CisJICBicmVhazsKKwljYXNlIGJmZF9tYWNoX3o4MDAyOgorCSAgKmZsYWdzcCA9IEZfWjgwMDI7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiB0cnVlOworI2VuZGlmCisjaWZkZWYgSTk2MFJPTUFHSUMKKworICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKKworICAgICAgeworCXVuc2lnbmVkIGZsYWdzOworCSptYWdpY3AgPSBJOTYwUk9NQUdJQzsKKwkvKgorCSAgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgJiBXUF9URVhUKSA/IEk5NjBST01BR0lDIDoKKwkgIEk5NjBSV01BR0lDKTsgICBGSVhNRT8/PworCSAgKi8KKwlzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCisJICB7CisJICBjYXNlIGJmZF9tYWNoX2k5NjBfY29yZToKKwkgICAgZmxhZ3MgPSBGX0k5NjBDT1JFOworCSAgICBicmVhazsKKwkgIGNhc2UgYmZkX21hY2hfaTk2MF9rYl9zYjoKKwkgICAgZmxhZ3MgPSBGX0k5NjBLQjsKKwkgICAgYnJlYWs7CisJICBjYXNlIGJmZF9tYWNoX2k5NjBfbWM6CisJICAgIGZsYWdzID0gRl9JOTYwTUM7CisJICAgIGJyZWFrOworCSAgY2FzZSBiZmRfbWFjaF9pOTYwX3hhOgorCSAgICBmbGFncyA9IEZfSTk2MFhBOworCSAgICBicmVhazsKKwkgIGNhc2UgYmZkX21hY2hfaTk2MF9jYToKKwkgICAgZmxhZ3MgPSBGX0k5NjBDQTsKKwkgICAgYnJlYWs7CisJICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Ffc2E6CisJICAgIGZsYWdzID0gRl9JOTYwS0E7CisJICAgIGJyZWFrOworCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2p4OgorCSAgICBmbGFncyA9IEZfSTk2MEpYOworCSAgICBicmVhazsKKwkgIGNhc2UgYmZkX21hY2hfaTk2MF9oeDoKKwkgICAgZmxhZ3MgPSBGX0k5NjBIWDsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICByZXR1cm4gZmFsc2U7CisJICB9CisJKmZsYWdzcCA9IGZsYWdzOworCXJldHVybiB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIFRJQzMwTUFHSUMKKyAgICBjYXNlIGJmZF9hcmNoX3RpYzMwOgorICAgICAgKm1hZ2ljcCA9IFRJQzMwTUFHSUM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorI2lmZGVmIFRJQzgwX0FSQ0hfTUFHSUMKKyAgICBjYXNlIGJmZF9hcmNoX3RpYzgwOgorICAgICAgKm1hZ2ljcCA9IFRJQzgwX0FSQ0hfTUFHSUM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorI2lmZGVmIEFSTU1BR0lDCisgICAgY2FzZSBiZmRfYXJjaF9hcm06CisgICAgICAqIG1hZ2ljcCA9IEFSTU1BR0lDOworICAgICAgKiBmbGFnc3AgPSAwOworICAgICAgaWYgKEFQQ1NfU0VUIChhYmZkKSkKKwl7CisJICBpZiAoQVBDU18yNl9GTEFHIChhYmZkKSkKKwkgICAgKiBmbGFnc3AgfD0gRl9BUENTMjY7CisJICAKKwkgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpKQorCSAgICAqIGZsYWdzcCB8PSBGX0FQQ1NfRkxPQVQ7CisJICAKKwkgIGlmIChQSUNfRkxBRyAoYWJmZCkpCisJICAgICogZmxhZ3NwIHw9IEZfUElDX0lOVDsKKwl9CisgICAgICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQorCSogZmxhZ3NwIHw9IEZfSU5URVJXT1JLOworICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorCXsKKwljYXNlIGJmZF9tYWNoX2FybV8yOiAgKiBmbGFnc3AgfD0gRl9BUk1fMjsgIGJyZWFrOworCWNhc2UgYmZkX21hY2hfYXJtXzJhOiAqIGZsYWdzcCB8PSBGX0FSTV8yYTsgYnJlYWs7CisJY2FzZSBiZmRfbWFjaF9hcm1fMzogICogZmxhZ3NwIHw9IEZfQVJNXzM7ICBicmVhazsKKwljYXNlIGJmZF9tYWNoX2FybV8zTTogKiBmbGFnc3AgfD0gRl9BUk1fM007IGJyZWFrOworCWNhc2UgYmZkX21hY2hfYXJtXzQ6ICAqIGZsYWdzcCB8PSBGX0FSTV80OyAgYnJlYWs7CisJY2FzZSBiZmRfbWFjaF9hcm1fNFQ6ICogZmxhZ3NwIHw9IEZfQVJNXzRUOyBicmVhazsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorI2lmZGVmIFBQQ01BR0lDCisgICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgorICAgICAgKm1hZ2ljcCA9IFBQQ01BR0lDOworICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEkzODZNQUdJQworICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKKyAgICAgICptYWdpY3AgPSBJMzg2TUFHSUM7CisjaWZkZWYgTFlOWE9TCisgICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KKyAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOworI2VuZGlmCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgSTg2ME1BR0lDCisgICAgY2FzZSBiZmRfYXJjaF9pODYwOgorICAgICAgKm1hZ2ljcCA9IEk4NjBNQUdJQzsKKyAgICAgIHJldHVybiB0cnVlOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBNQzY4TUFHSUMKKyAgICBjYXNlIGJmZF9hcmNoX202OGs6CisjaWZkZWYgQVBPTExPTTY4S01BR0lDCisgICAgICAqbWFnaWNwID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7CisjZWxzZQorICAgICAgLyogTkFNRVNfSEFWRV9VTkRFUlNDT1JFIG1heSBiZSBkZWZpbmVkIGJ5IGNvZmYtdTY4ay5jLiAgKi8KKyNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKKyAgICAgICptYWdpY3AgPSBNQzY4S0JDU01BR0lDOworI2Vsc2UKKyAgICAgICptYWdpY3AgPSBNQzY4TUFHSUM7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIExZTlhPUworICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCisgICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKKyNlbmRpZgorICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgTUM4OE1BR0lDCisgICAgY2FzZSBiZmRfYXJjaF9tODhrOgorICAgICAgKm1hZ2ljcCA9IE1DODhPTUFHSUM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgSDgzMDBNQUdJQworICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6CisgICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCisJeworCWNhc2UgYmZkX21hY2hfaDgzMDA6CisJICAqbWFnaWNwID0gSDgzMDBNQUdJQzsKKwkgIHJldHVybiB0cnVlOworCWNhc2UgYmZkX21hY2hfaDgzMDBoOgorCSAgKm1hZ2ljcCA9IEg4MzAwSE1BR0lDOworCSAgcmV0dXJuIHRydWU7CisJY2FzZSBiZmRfbWFjaF9oODMwMHM6CisJICAqbWFnaWNwID0gSDgzMDBTTUFHSUM7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgU0hfQVJDSF9NQUdJQ19CSUcKKyAgICBjYXNlIGJmZF9hcmNoX3NoOgorICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKKwkqbWFnaWNwID0gU0hfQVJDSF9NQUdJQ19CSUc7CisgICAgICBlbHNlCisJKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfTElUVExFOworICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgU1BBUkNNQUdJQworICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6CisgICAgICAqbWFnaWNwID0gU1BBUkNNQUdJQzsKKyNpZmRlZiBMWU5YT1MKKyAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLworICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7CisjZW5kaWYKKyAgICAgIHJldHVybiB0cnVlOworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEg4NTAwTUFHSUMKKyAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgorICAgICAgKm1hZ2ljcCA9IEg4NTAwTUFHSUM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQTI5S19NQUdJQ19CSUcKKyAgICBjYXNlIGJmZF9hcmNoX2EyOWs6CisgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQorCSptYWdpY3AgPSBBMjlLX01BR0lDX0JJRzsKKyAgICAgIGVsc2UKKwkqbWFnaWNwID0gQTI5S19NQUdJQ19MSVRUTEU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBXRTMyS01BR0lDCisgICAgY2FzZSBiZmRfYXJjaF93ZTMyazoKKyAgICAgICptYWdpY3AgPSBXRTMyS01BR0lDOworICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgVTgwMlRPQ01BR0lDCisgICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6CisjaWZuZGVmIFBQQ01BR0lDCisgICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgorI2VuZGlmCisgICAgICAqbWFnaWNwID0gVTgwMlRPQ01BR0lDOworICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgTUNPUkVNQUdJQworICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6CisgICAgICAqIG1hZ2ljcCA9IE1DT1JFTUFHSUM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICAgICAgCisgICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGFyY2hpdGVjdHVyZSAqLworICAgICAgLyogcmV0dXJuIGZhbHNlOyAgLS0gZmFsbCB0aHJvdWdoIHRvICJyZXR1cm4gZmFsc2UiIGJlbG93LCB0byBhdm9pZAorICAgICAgICJzdGF0ZW1lbnQgbmV2ZXIgcmVhY2hlZCIgZXJyb3JzIG9uIHRoZSBvbmUgYmVsb3cuICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIHVuc2lnbmVkIGR1bW15MTsKKyAgdW5zaWduZWQgc2hvcnQgZHVtbXkyOworCisgIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duICYmCisgICAgICBjb2ZmX3NldF9mbGFncyAoYWJmZCwgJmR1bW15MSwgJmR1bW15MikgIT0gdHJ1ZSkKKyAgICByZXR1cm4gZmFsc2U7CQkvKiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB0eXBlICovCisKKyAgcmV0dXJuIHRydWU7CQkJLyogV2UncmUgZWFzeSAuLi4gKi8KK30KKworCisvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb24gZm9yIGVhY2ggc2VjdGlvbi4gKi8KKworI2lmbmRlZiBJOTYwCisjZGVmaW5lIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKKyNlbmRpZgorI2lmZGVmIFRJQzgwQ09GRgorI3VuZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKKyNlbmRpZgorCitzdGF0aWMgYm9vbGVhbgorY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCisgICAgIGJmZCAqIGFiZmQ7Cit7CisgIGFzZWN0aW9uICpjdXJyZW50OworICBhc2VjdGlvbiAqcHJldmlvdXMgPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgZmlsZV9wdHIgc29mYXIgPSBGSUxIU1o7CisgIGJvb2xlYW4gYWxpZ25fYWRqdXN0OworICB1bnNpZ25lZCBpbnQgY291bnQ7CisjaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQorICBmaWxlX3B0ciBvbGRfc29mYXI7CisjZW5kaWYKKworI2lmZGVmIFJTNjAwMENPRkZfQworICAvKiBPbiBYQ09GRiwgaWYgd2UgaGF2ZSBzeW1ib2xzLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKKyAgICB7CisgICAgICBiZmRfc2l6ZV90eXBlIHN6OworICAgICAgYmZkX3NpemVfdHlwZSBpLCBzeW1jb3VudDsKKyAgICAgIGFzeW1ib2wgKipzeW1wOworCisgICAgICBzeiA9IDA7CisgICAgICBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICAgICAgZm9yIChzeW1wID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBzeW1jb3VudDsgc3ltcCsrLCBpKyspCisJeworCSAgY29mZl9zeW1ib2xfdHlwZSAqY2Y7CisKKwkgIGNmID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnN5bXApOworCSAgaWYgKGNmICE9IE5VTEwKKwkgICAgICAmJiBjZi0+bmF0aXZlICE9IE5VTEwKKwkgICAgICAmJiBTWU1OQU1FX0lOX0RFQlVHICgmY2YtPm5hdGl2ZS0+dS5zeW1lbnQpKQorCSAgICB7CisJICAgICAgc2l6ZV90IGxlbjsKKworCSAgICAgIGxlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXApKTsKKwkgICAgICBpZiAobGVuID4gU1lNTk1MRU4pCisJCXN6ICs9IGxlbiArIDM7CisJICAgIH0KKwl9CisgICAgICBpZiAoc3ogPiAwKQorCXsKKwkgIGFzZWN0aW9uICpkc2VjOworCisJICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRlYnVnIik7CisJICBpZiAoZHNlYyA9PSBOVUxMKQorCSAgICBhYm9ydCAoKTsKKwkgIGRzZWMtPl9yYXdfc2l6ZSA9IHN6OworCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKKwl9CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKyAgaW50IHBhZ2Vfc2l6ZTsKKyAgaWYgKGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbykgCisgICAgeworICAgICAgcGFnZV9zaXplID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5GaWxlQWxpZ25tZW50OworICAgIH0KKyAgZWxzZQorICAgIHBhZ2Vfc2l6ZSA9IFBFX0RFRl9GSUxFX0FMSUdOTUVOVDsKKyNlbHNlCisjaWZkZWYgQ09GRl9QQUdFX1NJWkUKKyAgaW50IHBhZ2Vfc2l6ZSA9IENPRkZfUEFHRV9TSVpFOworI2VuZGlmCisjZW5kaWYKKworICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSkKKyAgICB7CisgICAgICAvKiAgQSBzdGFydCBhZGRyZXNzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGZpbGUuIEluIHRoaXMKKwkgIGNhc2UgaXQgd2lsbCBuZWVkIGFuIG9wdGlvbmFsIGhlYWRlciB0byByZWNvcmQgaXQuICAqLworICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOworICAgIH0KKworICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCisgICAgc29mYXIgKz0gQU9VVFNaOworI2lmZGVmIFJTNjAwMENPRkZfQworICBlbHNlIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQorICAgIHNvZmFyICs9IEFPVVRTWjsKKyAgZWxzZQorICAgIHNvZmFyICs9IFNNQUxMX0FPVVRTWjsKKyNlbmRpZgorCisgIHNvZmFyICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBTQ05IU1o7CisKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKKyAgICAgYnkgYWxsb2NhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IGNvdW50cy4gICovCisgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQorICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKKyAgICAgIHNvZmFyICs9IFNDTkhTWjsKKyNlbmRpZgorCisgIGFsaWduX2FkanVzdCA9IGZhbHNlOworICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9ucywgY291bnQgPSAxOworICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7CisgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsICsrY291bnQpCisgICAgeworI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorICAgICAgLyogVGhlIE5UIGxvYWRlciBkb2VzIG5vdCB3YW50IGVtcHR5IHNlY3Rpb24gaGVhZGVycywgc28gd2Ugb21pdAorICAgICAgICAgdGhlbS4gIFdlIGRvbid0IGFjdHVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbiBmcm9tIHRoZSBCRkQsCisgICAgICAgICBhbHRob3VnaCB3ZSBwcm9iYWJseSBzaG91bGQuICBUaGlzIG1hdGNoZXMgY29kZSBpbgorICAgICAgICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLworICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwKQorCXsKKwkgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IC0xOworCSAgLS1jb3VudDsKKwkgIGNvbnRpbnVlOworCX0KKyNlbmRpZgorCisgICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSBjb3VudDsKKworICAgICAgLyogT25seSBkZWFsIHdpdGggc2VjdGlvbnMgd2hpY2ggaGF2ZSBjb250ZW50cyAqLworICAgICAgaWYgKCEoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSkKKwljb250aW51ZTsKKworICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCisJIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICBJOTYwIGRvZXNuJ3QKKwkgZG8gdGhpcyAoRklYTUUpIHNvIHdlIGNhbiBzdGF5IGluIHN5bmMgd2l0aCBJbnRlbC4gIDk2MAorCSBkb2Vzbid0IHlldCBwYWdlIGZyb20gZmlsZXMuLi4gKi8KKyNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCisgICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQorCXsKKwkgIC8qIG1ha2Ugc3VyZSB0aGlzIHNlY3Rpb24gaXMgYWxpZ25lZCBvbiB0aGUgcmlnaHQgYm91bmRhcnkgLSBieQorCSAgICAgcGFkZGluZyB0aGUgcHJldmlvdXMgc2VjdGlvbiB1cCBpZiBuZWNlc3NhcnkgKi8KKworCSAgb2xkX3NvZmFyID0gc29mYXI7CisJICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKKwkgIGlmIChwcmV2aW91cyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKwkgICAgeworCSAgICAgIHByZXZpb3VzLT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7CisJICAgIH0KKwl9CisKKyNlbmRpZgorCisgICAgICAvKiBJbiBkZW1hbmQgcGFnZWQgZmlsZXMgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSBmaWxlIG9mZnNldAorCSBtdXN0IG1hdGNoIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzLiAgKi8KKyNpZmRlZiBDT0ZGX1BBR0VfU0laRQorICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKKwkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwlzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcGFnZV9zaXplOworI2VuZGlmCisgICAgICBjdXJyZW50LT5maWxlcG9zID0gc29mYXI7CisKKyNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKyAgICAgIC8qIFdpdGggUEUgd2UgaGF2ZSB0byBwYWQgZWFjaCBzZWN0aW9uIHRvIGJlIGEgbXVsdGlwbGUgb2YgaXRzCisJIHBhZ2Ugc2l6ZSB0b28sIGFuZCByZW1lbWJlciBib3RoIHNpemVzLiAgKi8KKworICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSA9PSBOVUxMKQorCXsKKwkgIGN1cnJlbnQtPnVzZWRfYnlfYmZkID0KKwkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7CisJICBpZiAoY3VycmVudC0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSA9PSBOVUxMKQorCXsKKwkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dGRhdGEgPQorCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOworCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dGRhdGEgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID09IDApCisJcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKKworICAgICAgY3VycmVudC0+X3Jhd19zaXplID0gKGN1cnJlbnQtPl9yYXdfc2l6ZSArIHBhZ2Vfc2l6ZSAtMSkgJiAtcGFnZV9zaXplOworI2VuZGlmCisKKyAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKKworI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKKyAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KKyAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCisJeworCSAgYmZkX3NpemVfdHlwZSBvbGRfc2l6ZTsKKworCSAgb2xkX3NpemUgPSBjdXJyZW50LT5fcmF3X3NpemU7CisJICBjdXJyZW50LT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKGN1cnJlbnQtPl9yYXdfc2l6ZSwKKwkJCQkJICAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7CisJICBhbGlnbl9hZGp1c3QgPSBjdXJyZW50LT5fcmF3X3NpemUgIT0gb2xkX3NpemU7CisJICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemUgLSBvbGRfc2l6ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgb2xkX3NvZmFyID0gc29mYXI7CisJICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKKwkgIGFsaWduX2FkanVzdCA9IHNvZmFyICE9IG9sZF9zb2ZhcjsKKwkgIGN1cnJlbnQtPl9yYXdfc2l6ZSArPSBzb2ZhciAtIG9sZF9zb2ZhcjsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorICAgICAgLyogRm9yIFBFIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHBhZCBvdXQgdG8gdGhlIGFsaWduZWQKKyAgICAgICAgIF9yYXdfc2l6ZSwgaW4gY2FzZSB0aGUgY2FsbGVyIG9ubHkgd3JpdGVzIG91dCBkYXRhIHRvIHRoZQorICAgICAgICAgdW5hbGlnbmVkIF9yYXdfc2l6ZS4gICovCisgICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA8IGN1cnJlbnQtPl9yYXdfc2l6ZSkKKwlhbGlnbl9hZGp1c3QgPSB0cnVlOworI2VuZGlmCisKKyNpZmRlZiBfTElCCisgICAgICAvKiBGb3JjZSAubGliIHNlY3Rpb25zIHRvIHN0YXJ0IGF0IHplcm8uICBUaGUgdm1hIGlzIHRoZW4KKwkgaW5jcmVtZW50ZWQgaW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cy4gIFRoaXMgaXMgcmlnaHQgZm9yCisJIFNWUjMuMi4gICovCisgICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQorCWJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQsIDApOworI2VuZGlmCisKKyAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICB9CisKKyAgLyogSXQgaXMgbm93IHNhZmUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgd2UgbmVlZGVkIGFuCisgICAgIGFsaWdubWVudCBhZGp1c3RtZW50IGZvciB0aGUgbGFzdCBzZWN0aW9uLCB0aGVuIG1ha2Ugc3VyZSB0aGF0CisgICAgIHRoZXJlIGlzIGEgYnl0ZSBhdCBvZmZzZXQgc29mYXIuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBhbmQgbm8KKyAgICAgcmVsb2NzLCB0aGVuIG5vdGhpbmcgZm9sbG93cyB0aGUgbGFzdCBzZWN0aW9uLiAgSWYgd2UgZG9uJ3QgZm9yY2UKKyAgICAgdGhlIGxhc3QgYnl0ZSBvdXQsIHRoZW4gdGhlIGZpbGUgbWF5IGFwcGVhciB0byBiZSB0cnVuY2F0ZWQuICAqLworICBpZiAoYWxpZ25fYWRqdXN0KQorICAgIHsKKyAgICAgIGJmZF9ieXRlIGI7CisKKyAgICAgIGIgPSAwOworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzb2ZhciAtIDEsIFNFRUtfU0VUKSAhPSAwCisJICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogTWFrZSBzdXJlIHRoZSByZWxvY2F0aW9ucyBhcmUgYWxpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbWFrZQorICAgICBzdXJlIHRoYXQgdGhpcyBieXRlIGV4aXN0cywgYmVjYXVzZSBpdCB3aWxsIG9ubHkgbWF0dGVyIGlmIHRoZXJlCisgICAgIHJlYWxseSBhcmUgcmVsb2NzLiAgKi8KKyAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik7CisKKyAgb2JqX3JlbG9jYmFzZSAoYWJmZCkgPSBzb2ZhcjsKKyAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiAwCisKKy8qIFRoaXMgY2FuIG5ldmVyIHdvcmssIGJlY2F1c2UgaXQgaXMgY2FsbGVkIHRvbyBsYXRlLS1hZnRlciB0aGUKKyAgIHNlY3Rpb24gcG9zaXRpb25zIGhhdmUgYmVlbiBzZXQuICBJIGNhbid0IGZpZ3VyZSBvdXQgd2hhdCBpdCBpcworICAgZm9yLCBzbyBJIGFtIGdvaW5nIHRvIGRpc2FibGUgaXQtLUlhbiBUYXlsb3IgMjAgTWFyY2ggMTk5Ni4gICovCisKKy8qIElmIC5maWxlLCAudGV4dCwgLmRhdGEsIC5ic3Mgc3ltYm9scyBhcmUgbWlzc2luZywgYWRkIHRoZW0uICAqLworLyogQEAgU2hvdWxkIHdlIG9ubHkgYmUgYWRkaW5nIG1pc3Npbmcgc3ltYm9scywgb3Igb3ZlcnJpZGluZyB0aGUgYXV4CisgICB2YWx1ZXMgZm9yIGV4aXN0aW5nIHNlY3Rpb24gc3ltYm9scz8gICovCitzdGF0aWMgYm9vbGVhbgorY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHVuc2lnbmVkIGludCBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICBhc3ltYm9sICoqc3ltcHAgPSBhYmZkLT5vdXRzeW1ib2xzOworICBhc3ltYm9sICoqc3ltcHAyOworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IG5lZWRfdGV4dCA9IDEsIG5lZWRfZGF0YSA9IDEsIG5lZWRfYnNzID0gMSwgbmVlZF9maWxlID0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKykKKyAgICB7CisgICAgICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltcHBbaV0pOworICAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgIGlmIChjc3ltKQorCXsKKwkgIC8qIG9ubHkgZG8gdGhpcyBpZiB0aGVyZSBpcyBhIGNvZmYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0CisJICAgc3ltYm9sICovCisJICBpZiAoY3N5bS0+bmF0aXZlICYmIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQorCSAgICB7CisJICAgICAgbmVlZF9maWxlID0gMDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgbmFtZSA9IGNzeW0tPnN5bWJvbC5uYW1lOworCSAgaWYgKCFuYW1lKQorCSAgICBjb250aW51ZTsKKwkgIGlmICghc3RyY21wIChuYW1lLCBfVEVYVCkpCisJICAgIG5lZWRfdGV4dCA9IDA7CisjaWZkZWYgQVBPTExPX002OAorCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgIi53dGV4dCIpKQorCSAgICBuZWVkX3RleHQgPSAwOworI2VuZGlmCisJICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfREFUQSkpCisJICAgIG5lZWRfZGF0YSA9IDA7CisJICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfQlNTKSkKKwkgICAgbmVlZF9ic3MgPSAwOworCX0KKyAgICB9CisgIC8qIE5vdyBpID09IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpLiAgKi8KKyAgLyogQEAgRm9yIG5vdywgZG9uJ3QgZGVhbCB3aXRoIC5maWxlIHN5bWJvbC4gICovCisgIG5lZWRfZmlsZSA9IDA7CisKKyAgaWYgKCFuZWVkX3RleHQgJiYgIW5lZWRfZGF0YSAmJiAhbmVlZF9ic3MgJiYgIW5lZWRfZmlsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgbnN5bXMgKz0gbmVlZF90ZXh0ICsgbmVlZF9kYXRhICsgbmVlZF9ic3MgKyBuZWVkX2ZpbGU7CisgIHN5bXBwMiA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKKyAgaWYgKCFzeW1wcDIpCisgICAgcmV0dXJuIGZhbHNlOworICBtZW1jcHkgKHN5bXBwMiwgc3ltcHAsIGkgKiBzaXplb2YgKGFzeW1ib2wgKikpOworICBpZiAobmVlZF9maWxlKQorICAgIHsKKyAgICAgIC8qIEBAIEdlbmVyYXRlIGZha2UgLmZpbGUgc3ltYm9sLCBpbiBzeW1wcDJbaV0sIGFuZCBpbmNyZW1lbnQgaS4gICovCisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIGlmIChuZWVkX3RleHQpCisgICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfVEVYVCk7CisgIGlmIChuZWVkX2RhdGEpCisgICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfREFUQSk7CisgIGlmIChuZWVkX2JzcykKKyAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9CU1MpOworICBCRkRfQVNTRVJUIChpID09IG5zeW1zKTsKKyAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXBwMiwgbnN5bXMpOworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmIC8qIDAgKi8KKworLyogU1VQUFJFU1MgNTU4ICovCisvKiBTVVBQUkVTUyA1MjkgKi8KK3N0YXRpYyBib29sZWFuCitjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICogYWJmZDsKK3sKKyAgYXNlY3Rpb24gKmN1cnJlbnQ7CisgIGJvb2xlYW4gaGFzcmVsb2NzID0gZmFsc2U7CisgIGJvb2xlYW4gaGFzbGlubm8gPSBmYWxzZTsKKyAgZmlsZV9wdHIgc2NuX2Jhc2U7CisgIGZpbGVfcHRyIHJlbG9jX2Jhc2U7CisgIGZpbGVfcHRyIGxpbmVub19iYXNlOworICBmaWxlX3B0ciBzeW1fYmFzZTsKKyAgdW5zaWduZWQgbG9uZyByZWxvY19zaXplID0gMDsKKyAgdW5zaWduZWQgbG9uZyBsbm5vX3NpemUgPSAwOworICBib29sZWFuIGxvbmdfc2VjdGlvbl9uYW1lczsKKyAgYXNlY3Rpb24gKnRleHRfc2VjID0gTlVMTDsKKyAgYXNlY3Rpb24gKmRhdGFfc2VjID0gTlVMTDsKKyAgYXNlY3Rpb24gKmJzc19zZWMgPSBOVUxMOworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOworICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOworI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCisgIHNpemVfdCBzdHJpbmdfc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7CisjZW5kaWYKKworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworCisgIC8qIE1ha2UgYSBwYXNzIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0byBjb3VudCBsaW5lIG51bWJlciBlbnRyaWVzIGFuZAorICAgICBwdXQgdGhlbSBpbnRvIHRoZSBjb3JyZWN0IGFzZWN0aW9ucyAqLworCisgIGxubm9fc2l6ZSA9IGNvZmZfY291bnRfbGluZW51bWJlcnMgKGFiZmQpICogTElORVNaOworCisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQorICAgIHsKKyAgICAgIGlmICghIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJlbG9jX2Jhc2UgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKKworICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgYW5kIGxpbm5vIGFyZWFzICovCisKKyAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9CisgICAgICAgY3VycmVudC0+bmV4dCkKKyAgICByZWxvY19zaXplICs9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogUkVMU1o7CisKKyAgbGluZW5vX2Jhc2UgPSByZWxvY19iYXNlICsgcmVsb2Nfc2l6ZTsKKyAgc3ltX2Jhc2UgPSBsaW5lbm9fYmFzZSArIGxubm9fc2l6ZTsKKworICAvKiBJbmRpY2F0ZSBpbiBlYWNoIHNlY3Rpb24tPmxpbmVfZmlsZXBvcyBpdHMgYWN0dWFsIGZpbGUgYWRkcmVzcyAqLworICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KKyAgICAgICBjdXJyZW50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50LT5saW5lbm9fY291bnQpCisJeworCSAgY3VycmVudC0+bGluZV9maWxlcG9zID0gbGluZW5vX2Jhc2U7CisJICBjdXJyZW50LT5tb3ZpbmdfbGluZV9maWxlcG9zID0gbGluZW5vX2Jhc2U7CisJICBsaW5lbm9fYmFzZSArPSBjdXJyZW50LT5saW5lbm9fY291bnQgKiBMSU5FU1o7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IDA7CisJfQorICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50KQorCXsKKwkgIGN1cnJlbnQtPnJlbF9maWxlcG9zID0gcmVsb2NfYmFzZTsKKwkgIHJlbG9jX2Jhc2UgKz0gY3VycmVudC0+cmVsb2NfY291bnQgKiBSRUxTWjsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOworCX0KKyAgICB9CisKKyAgLyogV3JpdGUgc2VjdGlvbiBoZWFkZXJzIHRvIHRoZSBmaWxlLiAgKi8KKyAgaW50ZXJuYWxfZi5mX25zY25zID0gMDsKKworICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQorICAgIHNjbl9iYXNlID0gRklMSFNaICsgQU9VVFNaOworICBlbHNlCisgICAgeworICAgICAgc2NuX2Jhc2UgPSBGSUxIU1o7CisjaWZkZWYgUlM2MDAwQ09GRl9DCisgICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKKwlzY25fYmFzZSArPSBBT1VUU1o7CisgICAgICBlbHNlCisJc2NuX2Jhc2UgKz0gU01BTExfQU9VVFNaOworI2VuZGlmCisgICAgfQorCisgIGlmIChiZmRfc2VlayAoYWJmZCwgc2NuX2Jhc2UsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBsb25nX3NlY3Rpb25fbmFtZXMgPSBmYWxzZTsKKyAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7CisgICAgICAgY3VycmVudCAhPSBOVUxMOworICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2VjdGlvbjsKKworI2lmZGVmIENPRkZfV0lUSF9QRQorICAgICAgLyogSWYgd2UndmUgZ290IGEgLnJlbG9jIHNlY3Rpb24sIHJlbWVtYmVyLiAqLworCisjaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCisgICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCAiLnJlbG9jIikgPT0gMCkKKwl7CisJICBwZV9kYXRhIChhYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24gPSAxOworCX0KKyNlbmRpZgorCisjZW5kaWYKKyAgICAgIGludGVybmFsX2YuZl9uc2NucysrOworCisgICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgU0NOTk1MRU4pOworCisjaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKKyAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICBUaGlzIG11c3QgYmUgY29tcGF0aWJsZQorICAgICAgICAgd2l0aCB0aGUgY29kZSBpbiBjb2ZmX3dyaXRlX3N5bWJvbHMuICAqLworICAgICAgeworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4gKGN1cnJlbnQtPm5hbWUpOworCWlmIChsZW4gPiBTQ05OTUxFTikKKwkgIHsKKwkgICAgbWVtc2V0IChzZWN0aW9uLnNfbmFtZSwgMCwgU0NOTk1MRU4pOworCSAgICBzcHJpbnRmIChzZWN0aW9uLnNfbmFtZSwgIi8lbHUiLCAodW5zaWduZWQgbG9uZykgc3RyaW5nX3NpemUpOworCSAgICBzdHJpbmdfc2l6ZSArPSBsZW4gKyAxOworCSAgICBsb25nX3NlY3Rpb25fbmFtZXMgPSB0cnVlOworCSAgfQorICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBfTElCCisgICAgICAvKiBBbHdheXMgc2V0IHNfdmFkZHIgb2YgLmxpYiB0byAwLiAgVGhpcyBpcyByaWdodCBmb3IgU1ZSMy4yCisJIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gICovCisgICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQorCXNlY3Rpb24uc192YWRkciA9IDA7CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHNlY3Rpb24uc192YWRkciA9IGN1cnJlbnQtPnZtYTsKKyAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKKyAgICAgIHNlY3Rpb24uc19zaXplID0gIGN1cnJlbnQtPl9yYXdfc2l6ZTsKKworI2lmZGVmIENPRkZfV0lUSF9QRQorICAgICAgc2VjdGlvbi5zX3BhZGRyID0gMDsKKyNlbmRpZgorI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorICAgICAgLyogUmVtaW5kZXI6IHNfcGFkZHIgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCisgICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpICE9IE5VTEwKKwkgICYmIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpICE9IE5VTEwpCisJc2VjdGlvbi5zX3BhZGRyID0gcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZTsKKyAgICAgIGVsc2UKKwlzZWN0aW9uLnNfcGFkZHIgPSAwOworI2VuZGlmCisKKyAgICAgIC8qCisJIElmIHRoaXMgc2VjdGlvbiBoYXMgbm8gc2l6ZSBvciBpcyB1bmxvYWRhYmxlIHRoZW4gdGhlIHNjbnB0cgorCSB3aWxsIGJlIDAgdG9vCisJICovCisgICAgICBpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDAgfHwKKwkgIChjdXJyZW50LT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpKSA9PSAwKQorCXsKKwkgIHNlY3Rpb24uc19zY25wdHIgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzZWN0aW9uLnNfc2NucHRyID0gY3VycmVudC0+ZmlsZXBvczsKKwl9CisgICAgICBzZWN0aW9uLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7CisgICAgICBzZWN0aW9uLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKKyAgICAgIHNlY3Rpb24uc19ucmVsb2MgPSBjdXJyZW50LT5yZWxvY19jb3VudDsKKyAgICAgIHNlY3Rpb24uc19ubG5ubyA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKKyAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCAhPSAwKQorCWhhc3JlbG9jcyA9IHRydWU7CisgICAgICBpZiAoY3VycmVudC0+bGluZW5vX2NvdW50ICE9IDApCisJaGFzbGlubm8gPSB0cnVlOworCisjaWZkZWYgUlM2MDAwQ09GRl9DCisgICAgICAvKiBJbmRpY2F0ZSB0aGUgdXNlIG9mIGFuIFhDT0ZGIG92ZXJmbG93IHNlY3Rpb24gaGVhZGVyLiAgKi8KKyAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKKwl7CisJICBzZWN0aW9uLnNfbnJlbG9jID0gMHhmZmZmOworCSAgc2VjdGlvbi5zX25sbm5vID0gMHhmZmZmOworCX0KKyNlbmRpZgorCisgICAgICBzZWN0aW9uLnNfZmxhZ3MgPSBzZWNfdG9fc3R5cF9mbGFncyAoY3VycmVudC0+bmFtZSwgY3VycmVudC0+ZmxhZ3MpOworCisgICAgICBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1RFWFQpKQorCXsKKwkgIHRleHRfc2VjID0gY3VycmVudDsKKwl9CisgICAgICBlbHNlIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfREFUQSkpCisJeworCSAgZGF0YV9zZWMgPSBjdXJyZW50OworCX0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9CU1MpKQorCXsKKwkgIGJzc19zZWMgPSBjdXJyZW50OworCX0KKworI2lmZGVmIEk5NjAKKyAgICAgIHNlY3Rpb24uc19hbGlnbiA9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKKwkJCSA/IDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyCisJCQkgOiAwKTsKKyNlbHNlCisjaWZkZWYgVElDODBDT0ZGCisgICAgICBzZWN0aW9uLnNfZmxhZ3MgfD0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlciAmIDB4RikgPDwgODsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKyAgICAgIC8qIHN1cHByZXNzIG91dHB1dCBvZiB0aGUgc2VjdGlvbnMgaWYgdGhleSBhcmUgbnVsbC4gIGxkIGluY2x1ZGVzCisJIHRoZSBic3MgYW5kIGRhdGEgc2VjdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBzaXplIGFzc2lnbmVkCisJIHRvIHRoZW0uICBOVCBsb2FkZXIgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXNlIHNlY3Rpb24gaGVhZGVycyBhcmUKKwkgaW5jbHVkZWQgaWYgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMgYXJlIG5vdCBuZWVkZWQgKi8KKyAgICAgIGlmIChzZWN0aW9uLnNfc2l6ZSA9PSAwKQorCWludGVybmFsX2YuZl9uc2Nucy0tOworICAgICAgZWxzZQorI2VuZGlmCisJeworCSAgU0NOSERSIGJ1ZmY7CisJICBpZiAoY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsICZzZWN0aW9uLCAmYnVmZikgPT0gMAorCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgKCZidWZmKSwgMSwgU0NOSFNaLCBhYmZkKSAhPSBTQ05IU1opCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyNpZmRlZiBDT0ZGX1dJVEhfUEUKKyAgICAgIC8qIFBFIHN0b3JlcyBDT01EQVQgc2VjdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSWYKKyAgICAgICAgIHRoaXMgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byBoYXZlIHNvbWUgQ09NREFUIGluZm8sIHRyYWNrIGRvd24KKyAgICAgICAgIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBhbmQgbW9kaWZ5IGl0LiAgKi8KKyAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAhPSAwKQorCXsKKwkgIHVuc2lnbmVkIGludCBpLCBjb3VudDsKKwkgIGFzeW1ib2wgKipwc3ltOworCSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bSA9IE5VTEw7CisJICBhc3ltYm9sICoqcHN5bXNlYzsKKworCSAgcHN5bXNlYyA9IE5VTEw7CisJICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworCSAgZm9yIChpID0gMCwgcHN5bSA9IGFiZmQtPm91dHN5bWJvbHM7IGkgPCBjb3VudDsgaSsrLCBwc3ltKyspCisJICAgIHsKKwkgICAgICBpZiAoKCpwc3ltKS0+c2VjdGlvbiAhPSBjdXJyZW50KQorCQljb250aW51ZTsKKworCSAgICAgIC8qIFJlbWVtYmVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMKKyAgICAgICAgICAgICAgICAgc2VjdGlvbi4gICovCisJICAgICAgaWYgKHBzeW1zZWMgPT0gTlVMTCkKKwkJcHN5bXNlYyA9IHBzeW07CisKKwkgICAgICAvKiBTZWUgaWYgdGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLworCSAgICAgIGlmIChzdHJjbXAgKCgqcHN5bSktPm5hbWUsIGN1cnJlbnQtPm5hbWUpID09IDApCisJCXsKKwkJICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnBzeW0pOworCQkgIGlmIChjc3ltID09IE5VTEwKKwkJICAgICAgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwKKwkJICAgICAgfHwgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA8IDEKKwkJICAgICAgfHwgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyAhPSBDX1NUQVQKKwkJICAgICAgfHwgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX3R5cGUgIT0gVF9OVUxMKQorCQkgICAgY29udGludWU7CisKKwkJICAvKiBIZXJlICpQU1lNIGlzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IgQ1VSUkVOVC4gICovCisKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIC8qIERpZCB3ZSBmaW5kIGl0PworCSAgICAgTm90ZSB0aGF0IHdlIG1pZ2h0IG5vdCBpZiB3ZSdyZSBjb252ZXJ0aW5nIHRoZSBmaWxlIGZyb20KKwkgICAgIHNvbWUgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgKi8KKwkgIGlmIChpIDwgY291bnQpCisJICAgIHsKKwkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7CisKKwkgICAgICAvKiBXZSBkb24ndCB0b3VjaCB0aGUgeF9jaGVja3N1bSBmaWVsZC4gIFRoZQorCQkgeF9hc3NvY2lhdGVkIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiAgKi8KKworCSAgICAgIGF1eCA9IGNzeW0tPm5hdGl2ZSArIDE7CisJICAgICAgc3dpdGNoIChjdXJyZW50LT5mbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCisJCXsKKwkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ6CisJCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9IElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOworCQkgIGJyZWFrOworCisJCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKKwkJICBhdXgtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ID0KKwkJICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOworCQkgIGJyZWFrOworCisJCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6CisJCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9CisJCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRTsKKwkJICBicmVhazsKKworCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKKwkJICBhdXgtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ID0KKwkJICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIFRoZSBDT01EQVQgc3ltYm9sIG11c3QgYmUgdGhlIGZpcnN0IHN5bWJvbCBmcm9tIHRoaXMKKyAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSW4gb3JkZXIgdG8gbWFrZSB0aGlzCisgICAgICAgICAgICAgICAgIHdvcmssIHdlIG1vdmUgdGhlIENPTURBVCBzeW1ib2wgYmVmb3JlIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICBzeW1ib2wgd2UgZm91bmQgaW4gdGhlIHNlYXJjaCBhYm92ZS4gIEl0J3MgT0sgdG8KKyAgICAgICAgICAgICAgICAgcmVhcnJhbmdlIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhpcyBwb2ludCwgYmVjYXVzZQorICAgICAgICAgICAgICAgICBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgaXMgZ29pbmcgdG8gcmVhcnJhbmdlIGl0CisgICAgICAgICAgICAgICAgIGZ1cnRoZXIgYW5kIGZpeCB1cCBhbGwgdGhlIGF1eCBlbnRyaWVzLiAgKi8KKwkgICAgICBpZiAocHN5bSAhPSBwc3ltc2VjKQorCQl7CisJCSAgYXN5bWJvbCAqaG9sZDsKKwkJICBhc3ltYm9sICoqcGNvcHk7CisKKwkJICBob2xkID0gKnBzeW07CisJCSAgZm9yIChwY29weSA9IHBzeW07IHBjb3B5ID4gcHN5bXNlYzsgcGNvcHktLSkKKwkJICAgIHBjb3B5WzBdID0gcGNvcHlbLTFdOworCQkgICpwc3ltc2VjID0gaG9sZDsKKwkJfQorCSAgICB9CisJfQorI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLworICAgIH0KKworI2lmZGVmIFJTNjAwMENPRkZfQworICAvKiBYQ09GRiBoYW5kbGVzIG92ZXJmbG93cyBpbiB0aGUgcmVsb2MgYW5kIGxpbmUgbnVtYmVyIGNvdW50IGZpZWxkcworICAgICBieSBjcmVhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IHZhbHVlcy4gICovCisgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKKwl7CisJICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHNjbmhkcjsKKwkgIFNDTkhEUiBidWZmOworCisJICBpbnRlcm5hbF9mLmZfbnNjbnMrKzsKKwkgIHN0cm5jcHkgKCYoc2NuaGRyLnNfbmFtZVswXSksIGN1cnJlbnQtPm5hbWUsIDgpOworCSAgc2NuaGRyLnNfcGFkZHIgPSBjdXJyZW50LT5yZWxvY19jb3VudDsKKwkgIHNjbmhkci5zX3ZhZGRyID0gY3VycmVudC0+bGluZW5vX2NvdW50OworCSAgc2NuaGRyLnNfc2l6ZSA9IDA7CisJICBzY25oZHIuc19zY25wdHIgPSAwOworCSAgc2NuaGRyLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7CisJICBzY25oZHIuc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOworCSAgc2NuaGRyLnNfbnJlbG9jID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OworCSAgc2NuaGRyLnNfbmxubm8gPSBjdXJyZW50LT50YXJnZXRfaW5kZXg7CisJICBzY25oZHIuc19mbGFncyA9IFNUWVBfT1ZSRkxPOworCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2NuaGRyLCAmYnVmZikgPT0gMAorCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgJmJ1ZmYsIDEsIFNDTkhTWiwgYWJmZCkgIT0gU0NOSFNaKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKyNlbmRpZgorCisgIC8qIE9LLCBub3cgc2V0IHVwIHRoZSBmaWxlaGRyLi4uICovCisKKyAgLyogRG9uJ3QgaW5jbHVkZSB0aGUgaW50ZXJuYWwgYWJzIHNlY3Rpb24gaW4gdGhlIHNlY3Rpb24gY291bnQgKi8KKworICAvKgorICAgICBXZSB3aWxsIE5PVCBwdXQgYSBmdWNraW5nIHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGhlcmUuIEV2ZXJ5IHRpbWUgeW91CisgICAgIHB1dCBpdCBiYWNrLCBJIHdpbGwgY29tZSBpbiBhbmQgdGFrZSBpdCBvdXQgYWdhaW4uICBJJ20gc29ycnkuICBUaGlzCisgICAgIGZpZWxkIGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgV2UgZmlsbCBpdCB3aXRoIGEgMCBzbyBpdCBjb21wYXJlcyB0aGUKKyAgICAgc2FtZSBidXQgaXMgbm90IGEgcmVhc29uYWJsZSB0aW1lLiAtLSBnbnVAY3lnbnVzLmNvbQorICAgICAqLworICBpbnRlcm5hbF9mLmZfdGltZGF0ID0gMDsKKworICBpbnRlcm5hbF9mLmZfZmxhZ3MgPSAwOworCisgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKKyAgICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gQU9VVFNaOworICBlbHNlCisgICAgeworICAgICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IDA7CisjaWZkZWYgUlM2MDAwQ09GRl9DCisgICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKKwlpbnRlcm5hbF9mLmZfb3B0aGRyID0gQU9VVFNaOworICAgICAgZWxzZQorCWludGVybmFsX2YuZl9vcHRoZHIgPSBTTUFMTF9BT1VUU1o7CisjZW5kaWYKKyAgICB9CisKKyAgaWYgKCFoYXNyZWxvY3MpCisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfUkVMRkxHOworICBpZiAoIWhhc2xpbm5vKQorICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xOTk87CisgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKKyAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOworCisgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGZvciBQUENfUEUhICovCisgIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMldSOworICBlbHNlCisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMlc7CisKKyNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKKyAgaW50ZXJuYWxfZi5mX3RhcmdldF9pZCA9IFRJQzgwX1RBUkdFVF9JRDsKKyNlbmRpZgorCisgIC8qCisgICAgIEZJWE1FLCBzaG91bGQgZG8gc29tZXRoaW5nIGFib3V0IHRoZSBvdGhlciBieXRlIG9yZGVycyBhbmQKKyAgICAgYXJjaGl0ZWN0dXJlcy4KKyAgICAgKi8KKworI2lmZGVmIFJTNjAwMENPRkZfQworICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKyAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9TSFJPQko7CisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX0xPQURFUikgIT0gTlVMTCkKKyAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9EWU5MT0FEOworI2VuZGlmCisKKyAgbWVtc2V0ICgmaW50ZXJuYWxfYSwgMCwgc2l6ZW9mIGludGVybmFsX2EpOworCisgIC8qIFNldCB1cCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHN0dWZmICovCisKKyAgeworICAgIHVuc2lnbmVkIGludCBtYWdpYyA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSAwOworICAgIGNvZmZfc2V0X2ZsYWdzIChhYmZkLCAmbWFnaWMsICZmbGFncyk7CisgICAgaW50ZXJuYWxfZi5mX21hZ2ljID0gbWFnaWM7CisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IGZsYWdzOworICAgIC8qIC4uLmFuZCB0aGUgIm9wdCJoZHIuLi4gKi8KKworI2lmZGVmIEEyOUsKKyNpZmRlZiBVTFRSQTMJCQkvKiBOWVUncyBtYWNoaW5lICovCisgICAgLyogRklYTUU6IFRoaXMgaXMgYSBib2d1cyBjaGVjay4gIEkgcmVhbGx5IHdhbnQgdG8gc2VlIGlmIHRoZXJlCisgICAgICogaXMgYSAuc2hic3Mgb3IgYSAuc2hkYXRhIHNlY3Rpb24sIGlmIHNvIHRoZW4gc2V0IHRoZSBtYWdpYworICAgICAqIG51bWJlciB0byBpbmRpY2F0ZSBhIHNoYXJlZCBkYXRhIGV4ZWN1dGFibGUuCisgICAgICovCisgICAgaWYgKGludGVybmFsX2YuZl9uc2NucyA+PSA3KQorICAgICAgaW50ZXJuYWxfYS5tYWdpYyA9IFNITUFHSUM7IC8qIFNoYXJlZCBtYWdpYyAqLworICAgIGVsc2UKKyNlbmRpZiAvKiBVTFRSQTMgKi8KKyAgICAgIGludGVybmFsX2EubWFnaWMgPSBOTUFHSUM7IC8qIEFzc3VtZSBzZXBhcmF0ZSBpL2QgKi8KKyNkZWZpbmUgX19BX01BR0lDX1NFVF9fCisjZW5kaWYgLyogQTI5SyAqLworI2lmZGVmIFRJQzgwQ09GRgorICAgIGludGVybmFsX2EubWFnaWMgPSBUSUM4MF9BUkNIX01BR0lDOworI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKyNlbmRpZiAvKiBUSUM4MCAqLworI2lmZGVmIEk4NjAKKyAgICAvKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnMgZm9yIHRoZSBpODYwPyAgKi8KKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gMDsKKyNkZWZpbmUgX19BX01BR0lDX1NFVF9fCisjZW5kaWYgLyogSTg2MCAqLworI2lmZGVmIEk5NjAKKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKG1hZ2ljID09IEk5NjBST01BR0lDID8gTk1BR0lDIDogT01BR0lDKTsKKyNkZWZpbmUgX19BX01BR0lDX1NFVF9fCisjZW5kaWYgLyogSTk2MCAqLworI2lmIE04OAorI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDQkNTOworI2VuZGlmIC8qIE04OCAqLworCisjaWYgQVBPTExPX002OAorI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTTY4KSB8fCBkZWZpbmVkKFdFMzJLKSB8fCBkZWZpbmVkKE02OEspCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworI2lmIGRlZmluZWQoTFlOWE9TKQorICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOworI2Vsc2UKKyNpZiBkZWZpbmVkKFRBUkdfQVVYKQorICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEID8gUEFHRU1BR0lDUEVYRUNQQUdFRCA6CisJCQlhYmZkLT5mbGFncyAmIFdQX1RFWFQgPyBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgOgorCQkJUEFHRU1BR0lDRVhFQ1NXQVBQRUQpOworI2Vsc2UKKyNpZiBkZWZpbmVkIChQQUdFTUFHSUNQRVhFQ1BBR0VEKQorICAgIGludGVybmFsX2EubWFnaWMgPSBQQUdFTUFHSUNQRVhFQ1BBR0VEOworI2VuZGlmCisjZW5kaWYgLyogVEFSR19BVVggKi8KKyNlbmRpZiAvKiBMWU5YT1MgKi8KKyNlbmRpZiAvKiBNNjggfHwgV0UzMksgfHwgTTY4SyAqLworCisjaWYgZGVmaW5lZChBUk0pCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworICAgIGludGVybmFsX2EubWFnaWMgPSBaTUFHSUM7CisjZW5kaWYgCisKKyNpZiBkZWZpbmVkKFBQQ19QRSkKKyNkZWZpbmUgX19BX01BR0lDX1NFVF9fCisgICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBNQ09SRV9QRQorI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDOworI2VuZGlmIAorCisjaWYgZGVmaW5lZChJMzg2KQorI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KKyNpZiBkZWZpbmVkKExZTlhPUykKKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKKyNlbHNlICAvKiBMWU5YT1MgKi8KKyAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOworI2VuZGlmIC8qIExZTlhPUyAqLworI2VuZGlmIC8qIEkzODYgKi8KKworI2lmIGRlZmluZWQoU1BBUkMpCisjZGVmaW5lIF9fQV9NQUdJQ19TRVRfXworI2lmIGRlZmluZWQoTFlOWE9TKQorICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOworI2VuZGlmIC8qIExZTlhPUyAqLworI2VuZGlmIC8qIFNQQVJDICovCisKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyNkZWZpbmUgX19BX01BR0lDX1NFVF9fCisgICAgaW50ZXJuYWxfYS5tYWdpYyA9IChhYmZkLT5mbGFncyAmIERfUEFHRUQpID8gUlM2S19BT1VUSERSX1pNQUdJQyA6CisgICAgKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkgPyBSUzZLX0FPVVRIRFJfTk1BR0lDIDoKKyAgICBSUzZLX0FPVVRIRFJfT01BR0lDOworI2VuZGlmCisKKyNpZm5kZWYgX19BX01BR0lDX1NFVF9fCisjaW5jbHVkZSAiWW91ciBhb3V0aGRyIG1hZ2ljIG51bWJlciBpcyBub3QgYmVpbmcgc2V0ISIKKyNlbHNlCisjdW5kZWYgX19BX01BR0lDX1NFVF9fCisjZW5kaWYKKyAgfQorCisgIC8qIEZJWE1FOiBEb2VzIGFueWJvZHkgZXZlciBzZXQgdGhpcyB0byBhbm90aGVyIHZhbHVlPyAgKi8KKyAgaW50ZXJuYWxfYS52c3RhbXAgPSAwOworCisgIC8qIE5vdyBzaG91bGQgd3JpdGUgcmVsb2NzLCBzdHJpbmdzLCBzeW1zICovCisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBzeW1fYmFzZTsKKworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKKyAgICB7CisgICAgICBpbnQgZmlyc3R1bmRlZjsKKyNpZiAwCisgICAgICBpZiAoIWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgICBpZiAoIWNvZmZfcmVudW1iZXJfc3ltYm9scyAoYWJmZCwgJmZpcnN0dW5kZWYpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGNvZmZfbWFuZ2xlX3N5bWJvbHMgKGFiZmQpOworICAgICAgaWYgKCEgY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoISBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoISBjb2ZmX3dyaXRlX3JlbG9jcyAoYWJmZCwgZmlyc3R1bmRlZikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworICBlbHNlIGlmIChsb25nX3NlY3Rpb25fbmFtZXMpCisgICAgeworICAgICAgLyogSWYgd2UgaGF2ZSBsb25nIHNlY3Rpb24gbmFtZXMgd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIHN0cmluZworICAgICAgICAgdGFibGUgZXZlbiBpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4gICovCisgICAgICBpZiAoISBjb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKyNpZmRlZiBQUENfUEUKKyAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9ieXRlIGI7CisKKyAgICAgIC8qIFBvd2VyUEMgUEUgYXBwZWFycyB0byByZXF1aXJlIHRoYXQgYWxsIGV4ZWN1dGFibGUgZmlsZXMgYmUKKyAgICAgICAgIHJvdW5kZWQgdXAgdG8gdGhlIHBhZ2Ugc2l6ZS4gICovCisgICAgICBiID0gMDsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKKwkJICAgIEJGRF9BTElHTiAoc3ltX2Jhc2UsIENPRkZfUEFHRV9TSVpFKSAtIDEsCisJCSAgICBTRUVLX1NFVCkgIT0gMAorCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAvKiBJZiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwLCB0aGVuIHdlIGFyZSBub3QgdXNpbmcgdGhlIENPRkYKKyAgICAgYmFja2VuZCBsaW5rZXIsIGFuZCBvYmpfcmF3X3N5bWVudF9jb3VudCBpcyBub3QgdmFsaWQgdW50aWwgYWZ0ZXIKKyAgICAgY29mZl93cml0ZV9zeW1ib2xzIGlzIGNhbGxlZC4gICovCisgIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgIT0gMCkKKyAgICB7CisgICAgICBpbnRlcm5hbF9mLmZfc3ltcHRyID0gc3ltX2Jhc2U7CisjaWZkZWYgUlM2MDAwQ09GRl9DCisgICAgICAvKiBBSVggYXBwZWFycyB0byByZXF1aXJlIHRoYXQgRl9SRUxGTEcgbm90IGJlIHNldCBpZiB0aGVyZSBhcmUKKyAgICAgICAgIGxvY2FsIHN5bWJvbHMgYnV0IG5vIHJlbG9jYXRpb25zLiAgKi8KKyAgICAgIGludGVybmFsX2YuZl9mbGFncyAmPX4gRl9SRUxGTEc7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobG9uZ19zZWN0aW9uX25hbWVzKQorCWludGVybmFsX2YuZl9zeW1wdHIgPSBzeW1fYmFzZTsKKyAgICAgIGVsc2UKKwlpbnRlcm5hbF9mLmZfc3ltcHRyID0gMDsKKyAgICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xTWU1TOworICAgIH0KKworICBpZiAodGV4dF9zZWMpCisgICAgeworICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAodGV4dF9zZWMpOworICAgICAgaW50ZXJuYWxfYS50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS50c2l6ZSA/IHRleHRfc2VjLT52bWEgOiAwOworICAgIH0KKyAgaWYgKGRhdGFfc2VjKQorICAgIHsKKyAgICAgIGludGVybmFsX2EuZHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGRhdGFfc2VjKTsKKyAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGludGVybmFsX2EuZHNpemUgPyBkYXRhX3NlYy0+dm1hIDogMDsKKyAgICB9CisgIGlmIChic3Nfc2VjKQorICAgIHsKKyAgICAgIGludGVybmFsX2EuYnNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGJzc19zZWMpOworICAgICAgaWYgKGludGVybmFsX2EuYnNpemUgJiYgYnNzX3NlYy0+dm1hIDwgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0KQorCWludGVybmFsX2EuZGF0YV9zdGFydCA9IGJzc19zZWMtPnZtYTsKKyAgICB9CisKKyAgaW50ZXJuYWxfYS5lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIGludGVybmFsX2YuZl9uc3ltcyA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKKworI2lmZGVmIFJTNjAwMENPRkZfQworICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKKyAgICB7CisgICAgICBiZmRfdm1hIHRvYzsKKyAgICAgIGFzZWN0aW9uICpsb2FkZXJfc2VjOworCisgICAgICBpbnRlcm5hbF9hLnZzdGFtcCA9IDE7CisKKyAgICAgIGludGVybmFsX2Eub19zbmVudHJ5ID0geGNvZmZfZGF0YSAoYWJmZCktPnNuZW50cnk7CisgICAgICBpZiAoaW50ZXJuYWxfYS5vX3NuZW50cnkgPT0gMCkKKwlpbnRlcm5hbF9hLmVudHJ5ID0gKGJmZF92bWEpIC0xOworCisgICAgICBpZiAodGV4dF9zZWMgIT0gTlVMTCkKKwl7CisJICBpbnRlcm5hbF9hLm9fc250ZXh0ID0gdGV4dF9zZWMtPnRhcmdldF9pbmRleDsKKwkgIGludGVybmFsX2Eub19hbGdudGV4dCA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHRleHRfc2VjKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50ZXJuYWxfYS5vX3NudGV4dCA9IDA7CisJICBpbnRlcm5hbF9hLm9fYWxnbnRleHQgPSAwOworCX0KKyAgICAgIGlmIChkYXRhX3NlYyAhPSBOVUxMKQorCXsKKwkgIGludGVybmFsX2Eub19zbmRhdGEgPSBkYXRhX3NlYy0+dGFyZ2V0X2luZGV4OworCSAgaW50ZXJuYWxfYS5vX2FsZ25kYXRhID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgZGF0YV9zZWMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnRlcm5hbF9hLm9fc25kYXRhID0gMDsKKwkgIGludGVybmFsX2Eub19hbGduZGF0YSA9IDA7CisJfQorICAgICAgbG9hZGVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOworICAgICAgaWYgKGxvYWRlcl9zZWMgIT0gTlVMTCkKKwlpbnRlcm5hbF9hLm9fc25sb2FkZXIgPSBsb2FkZXJfc2VjLT50YXJnZXRfaW5kZXg7CisgICAgICBlbHNlCisJaW50ZXJuYWxfYS5vX3NubG9hZGVyID0gMDsKKyAgICAgIGlmIChic3Nfc2VjICE9IE5VTEwpCisJaW50ZXJuYWxfYS5vX3NuYnNzID0gYnNzX3NlYy0+dGFyZ2V0X2luZGV4OworICAgICAgZWxzZQorCWludGVybmFsX2Eub19zbmJzcyA9IDA7CisKKyAgICAgIHRvYyA9IHhjb2ZmX2RhdGEgKGFiZmQpLT50b2M7CisgICAgICBpbnRlcm5hbF9hLm9fdG9jID0gdG9jOworICAgICAgaW50ZXJuYWxfYS5vX3NudG9jID0geGNvZmZfZGF0YSAoYWJmZCktPnNudG9jOworCisgICAgICBpbnRlcm5hbF9hLm9fbW9kdHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tb2R0eXBlOworICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlICE9IC0xKQorCWludGVybmFsX2Eub19jcHV0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGU7CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQorCSAgICB7CisJICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgorCSAgICAgIGludGVybmFsX2Eub19jcHV0eXBlID0gNDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgorCSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IDApCisJCWludGVybmFsX2Eub19jcHV0eXBlID0gMzsKKwkgICAgICBlbHNlCisJCWludGVybmFsX2Eub19jcHV0eXBlID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICAgIGludGVybmFsX2Eub19tYXhzdGFjayA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tYXhzdGFjazsKKyAgICAgIGludGVybmFsX2Eub19tYXhkYXRhID0geGNvZmZfZGF0YSAoYWJmZCktPm1heGRhdGE7CisgICAgfQorI2VuZGlmCisKKyAgLyogbm93IHdyaXRlIHRoZW0gKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgeworICAgIGNoYXIgYnVmZltGSUxIU1pdOworICAgIGNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9mLCAoUFRSKSBidWZmKTsKKyAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmLCAxLCBGSUxIU1osIGFiZmQpICE9IEZJTEhTWikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCisgICAgeworICAgICAgLyogTm90ZSB0aGF0IHBlaWNvZGUuaCBmaWxscyBpbiBhIFBFQU9VVEhEUiwgbm90IGFuIEFPVVRIRFIuIAorCSBpbmNsdWRlL2NvZmYvcGUuaCBzZXRzIEFPVVRTWiA9PSBzaXplb2YoUEVBT1VUSERSKSkgKi8KKyAgICAgIGNoYXIgYnVmZltBT1VUU1pdOworICAgICAgY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmIGludGVybmFsX2EsIChQVFIpIGJ1ZmYpOworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZiwgMSwgQU9VVFNaLCBhYmZkKSAhPSBBT1VUU1opCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgZWxzZQorICAgIHsKKyAgICAgIEFPVVRIRFIgYnVmZjsKKyAgICAgIHNpemVfdCBzaXplOworCisgICAgICAvKiBYQ09GRiBzZWVtcyB0byBhbHdheXMgd3JpdGUgYXQgbGVhc3QgYSBzbWFsbCBhLm91dCBoZWFkZXIuICAqLworICAgICAgY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgKFBUUikgJmJ1ZmYpOworICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCisJc2l6ZSA9IEFPVVRTWjsKKyAgICAgIGVsc2UKKwlzaXplID0gU01BTExfQU9VVFNaOworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmJ1ZmYsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgorY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQkvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLworICAgIHsKKyAgICAgIGlmICghIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgZGVmaW5lZChfTElCKSAmJiAhZGVmaW5lZChUQVJHX0FVWCkKKworICAgLyogVGhlIHBoeXNpY2FsIGFkZHJlc3MgZmllbGQgb2YgYSAubGliIHNlY3Rpb24gaXMgdXNlZCB0byBob2xkIHRoZQorICAgICAgbnVtYmVyIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW4gdGhlIHNlY3Rpb24uICBUaGlzIGNvZGUgY291bnRzIHRoZQorICAgICAgbnVtYmVyIG9mIHNlY3Rpb25zIGJlaW5nIHdyaXR0ZW4sIGFuZCBpbmNyZW1lbnRzIHRoZSBsbWEgZmllbGQKKyAgICAgIHdpdGggdGhlIG51bWJlci4KKworICAgICAgSSBoYXZlIGZvdW5kIG5vIGRvY3VtZW50YXRpb24gb24gdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4KKyAgICAgIEV4cGVyaW1lbnRhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VjdGlvbiBjb250YWlucyB6ZXJvIG9yIG1vcmUKKyAgICAgIHJlY29yZHMsIGVhY2ggb2Ygd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisgICAgICAtIGEgKGZvdXIgYnl0ZSkgd29yZCBob2xkaW5nIHRoZSBsZW5ndGggb2YgdGhpcyByZWNvcmQsIGluIHdvcmRzLAorICAgICAgLSBhIHdvcmQgdGhhdCBhbHdheXMgc2VlbXMgdG8gYmUgc2V0IHRvICIyIiwKKyAgICAgIC0gdGhlIHBhdGggdG8gYSBzaGFyZWQgbGlicmFyeSwgbnVsbC10ZXJtaW5hdGVkIGFuZCB0aGVuIHBhZGRlZAorICAgICAgICB0byBhIHdob2xlIHdvcmQgYm91bmRhcnkuCisKKyAgICAgIGJmZF9hc3NlcnQgY2FsbHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGFsZXJ0IGlmIGFuIGF0dGVtcHQgaXMgbWFkZQorICAgICAgdG8gd3JpdGUgYSBzZWN0aW9uIHdoaWNoIGRvZXNuJ3QgZm9sbG93IHRoZXNlIGFzc3VtcHRpb25zLiAgVGhlCisgICAgICBjb2RlIGhhcyBiZWVuIHRlc3RlZCBvbiBJU0MgNC4xIGJ5IG1lLCBhbmQgb24gU0NPIGJ5IFJvYmVydCBMaXBlCisgICAgICA8cm9iZXJ0bEBhcm5ldC5jb20+IChUaGFua3MhKS4KKyAgCisgICAgICBHdnJhbiBVZGRlYm9yZyA8Z3ZyYW5AdWRkZWJvcmcucHAuc2U+ICovCisKKyAgICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQorICAgICAgeworCWJmZF9ieXRlICpyZWMsICpyZWNlbmQ7CisKKwlyZWMgPSAoYmZkX2J5dGUgKikgbG9jYXRpb247CisJcmVjZW5kID0gcmVjICsgY291bnQ7CisJd2hpbGUgKHJlYyA8IHJlY2VuZCkKKwkgIHsKKwkgICAgKytzZWN0aW9uLT5sbWE7CisJICAgIHJlYyArPSBiZmRfZ2V0XzMyIChhYmZkLCByZWMpICogNDsKKwkgIH0KKworCUJGRF9BU1NFUlQgKHJlYyA9PSByZWNlbmQpOworICAgICAgfQorCisjZW5kaWYKKworICAvKiBEb24ndCB3cml0ZSBvdXQgYnNzIHNlY3Rpb25zIC0gb25lIHdheSB0byBkbyB0aGlzIGlzIHRvCisgICAgICAgc2VlIGlmIHRoZSBmaWxlcG9zIGhhcyBub3QgYmVlbiBzZXQuICovCisgIGlmIChzZWN0aW9uLT5maWxlcG9zID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChjb3VudCAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAoYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/IHRydWUgOiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorI2lmIDAKK3N0YXRpYyBib29sZWFuCitjb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmICghYmZkX3JlYWRfcCAoYWJmZCkpCisgICAgc3dpdGNoIChhYmZkLT5mb3JtYXQpCisgICAgICB7CisgICAgICBjYXNlIGJmZF9hcmNoaXZlOgorCWlmICghX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhYmZkKSkKKwkgIHJldHVybiBmYWxzZTsKKwlicmVhazsKKyAgICAgIGNhc2UgYmZkX29iamVjdDoKKwlpZiAoIWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKSkKKwkgIHJldHVybiBmYWxzZTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgLyogV2UgZGVwZW5kIG9uIGJmZF9jbG9zZSB0byBmcmVlIGFsbCB0aGUgbWVtb3J5IG9uIHRoZSBvYmphbGxvYy4gICovCisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKKworc3RhdGljIFBUUgorYnV5X2FuZF9yZWFkIChhYmZkLCB3aGVyZSwgc2Vla19kaXJlY3Rpb24sIHNpemUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZmlsZV9wdHIgd2hlcmU7CisgICAgIGludCBzZWVrX2RpcmVjdGlvbjsKKyAgICAgc2l6ZV90IHNpemU7Cit7CisgIFBUUiBhcmVhID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKKyAgaWYgKCFhcmVhKQorICAgIHJldHVybiAoTlVMTCk7CisgIGlmIChiZmRfc2VlayAoYWJmZCwgd2hlcmUsIHNlZWtfZGlyZWN0aW9uKSAhPSAwCisgICAgICB8fCBiZmRfcmVhZCAoYXJlYSwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKKyAgICByZXR1cm4gKE5VTEwpOworICByZXR1cm4gKGFyZWEpOworfQkJCQkvKiBidXlfYW5kX3JlYWQoKSAqLworCisvKgorU1VCU1VCU0VDVElPTgorCVJlYWRpbmcgbGluZW51bWJlcnMKKworCUNyZWF0aW5nIHRoZSBsaW5lbnVtYmVyIHRhYmxlIGlzIGRvbmUgYnkgcmVhZGluZyBpbiB0aGUgZW50aXJlCisJY29mZiBsaW5lbnVtYmVyIHRhYmxlLCBhbmQgY3JlYXRpbmcgYW5vdGhlciB0YWJsZSBmb3IgaW50ZXJuYWwgdXNlLgorCisJQSBjb2ZmIGxpbmVudW1iZXIgdGFibGUgaXMgc3RydWN0dXJlZCBzbyB0aGF0IGVhY2ggZnVuY3Rpb24KKwlpcyBtYXJrZWQgYXMgaGF2aW5nIGEgbGluZSBudW1iZXIgb2YgMC4gRWFjaCBsaW5lIHdpdGhpbiB0aGUKKwlmdW5jdGlvbiBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZnVuY3Rpb24uIFRoZQorCWJhc2Ugb2YgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgdGFibGUgaXMgc3RvcmVkIGluCisJdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorCisJVGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwKKwl0YWJsZSwgYW5kIGVhY2ggc3ltYm9sIHdoaWNoIG1hcmtzIGEgZnVuY3Rpb24gaXMgbWFya2VkIGJ5CisJcG9pbnRpbmcgaXRzLi4uCisKKwlIb3cgZG9lcyB0aGlzIHdvcmsgPworCisqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBhc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqYXNlY3Q7Cit7CisgIExJTkVOTyAqbmF0aXZlX2xpbmVubzsKKyAgYWxlbnQgKmxpbmVub19jYWNoZTsKKworICBCRkRfQVNTRVJUIChhc2VjdC0+bGluZW5vID09IChhbGVudCAqKSBOVUxMKTsKKworICBuYXRpdmVfbGluZW5vID0gKExJTkVOTyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCisJCQkJCSAgIGFzZWN0LT5saW5lX2ZpbGVwb3MsCisJCQkJCSAgIFNFRUtfU0VULAorCQkJCQkgICAoc2l6ZV90KSAoTElORVNaICoKKwkJCQkJCSAgICAgYXNlY3QtPmxpbmVub19jb3VudCkpOworICBsaW5lbm9fY2FjaGUgPQorICAgIChhbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpICgoYXNlY3QtPmxpbmVub19jb3VudCArIDEpICogc2l6ZW9mIChhbGVudCkpKTsKKyAgaWYgKGxpbmVub19jYWNoZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKKyAgICAgIGFsZW50ICpjYWNoZV9wdHIgPSBsaW5lbm9fY2FjaGU7CisgICAgICBMSU5FTk8gKnNyYyA9IG5hdGl2ZV9saW5lbm87CisKKyAgICAgIHdoaWxlIChjb3VudGVyIDwgYXNlY3QtPmxpbmVub19jb3VudCkKKwl7CisJICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGRzdDsKKwkgIGNvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIHNyYywgJmRzdCk7CisJICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gZHN0LmxfbG5ubzsKKworCSAgaWYgKGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPT0gMCkKKwkgICAgeworCSAgICAgIGJvb2xlYW4gd2FybmVkOworCSAgICAgIGxvbmcgc3ltbmR4OworCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bTsKKworCSAgICAgIHdhcm5lZCA9IGZhbHNlOworCSAgICAgIHN5bW5keCA9IGRzdC5sX2FkZHIubF9zeW1uZHg7CisJICAgICAgaWYgKHN5bW5keCA8IDAKKwkJICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKKwkJeworCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgICAgKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5sX2FkZHIubF9zeW1uZHgpOworCQkgIHN5bW5keCA9IDA7CisJCSAgd2FybmVkID0gdHJ1ZTsKKwkJfQorCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhc3RpbmcgYmV0d2VlbiBpbnRzIGFuZAorICAgICAgICAgICAgICAgICBwb2ludGVycyBsaWtlIHRoaXMuICAqLworCSAgICAgIHN5bSA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKQorCQkgICAgICgoc3ltbmR4ICsgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSkKKwkJICAgICAgLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcykpOworCSAgICAgIGNhY2hlX3B0ci0+dS5zeW0gPSAoYXN5bWJvbCAqKSBzeW07CisJICAgICAgaWYgKHN5bS0+bGluZW5vICE9IE5VTEwgJiYgISB3YXJuZWQpCisJCXsKKwkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJICAgIChfKCIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCisJCSAgICAgYmZkX2FzeW1ib2xfbmFtZSAoJnN5bS0+c3ltYm9sKSk7CisJCX0KKwkgICAgICBzeW0tPmxpbmVubyA9IGNhY2hlX3B0cjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY2FjaGVfcHRyLT51Lm9mZnNldCA9IGRzdC5sX2FkZHIubF9wYWRkcgorCQktIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpOworCSAgICB9CQkJLyogSWYgbm8gbGluZW51bWJlciBleHBlY3QgYSBzeW1ib2wgaW5kZXggKi8KKworCSAgY2FjaGVfcHRyKys7CisJICBzcmMrKzsKKwkgIGNvdW50ZXIrKzsKKwl9CisgICAgICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gMDsKKworICAgIH0KKyAgYXNlY3QtPmxpbmVubyA9IGxpbmVub19jYWNoZTsKKyAgLyogRklYTUUsIGZyZWUgbmF0aXZlX2xpbmVubyBoZXJlLCBvciB1c2UgYWxsb2NhIG9yIHNvbWV0aGluZy4gKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKKyAgICAgYmZkICogYWJmZDsKK3sKKyAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlX3N5bWJvbHM7CisgIGNvZmZfc3ltYm9sX3R5cGUgKmNhY2hlZF9hcmVhOworICB1bnNpZ25lZCBpbnQgKnRhYmxlX3B0cjsKKworICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX3N5bWJvbHMgPSAwOworCisgIGlmIChvYmpfc3ltYm9scyAoYWJmZCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlICovCisgIGlmICgobmF0aXZlX3N5bWJvbHMgPSBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkpID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgfQkJCQkvKiBvbiBlcnJvciAqLworCisgIC8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gY2FjaGVkIGZvcm0gKi8KKyAgY2FjaGVkX2FyZWEgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKKwkJIGJmZF9hbGxvYyAoYWJmZCwKKwkJCSAgICAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCisJCQkgICAgICogc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSkpKTsKKworICBpZiAoY2FjaGVkX2FyZWEgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHRhYmxlX3B0ciA9ICgodW5zaWduZWQgaW50ICopCisJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCSAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQorCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpKSk7CisKKyAgaWYgKHRhYmxlX3B0ciA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmRzdCA9IGNhY2hlZF9hcmVhOworICAgICAgdW5zaWduZWQgaW50IGxhc3RfbmF0aXZlX2luZGV4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOworICAgICAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSAwOworICAgICAgd2hpbGUgKHRoaXNfaW5kZXggPCBsYXN0X25hdGl2ZV9pbmRleCkKKwl7CisJICBjb21iaW5lZF9lbnRyeV90eXBlICpzcmMgPSBuYXRpdmVfc3ltYm9scyArIHRoaXNfaW5kZXg7CisJICB0YWJsZV9wdHJbdGhpc19pbmRleF0gPSBudW1iZXJfb2Zfc3ltYm9sczsKKwkgIGRzdC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworCisJICBkc3QtPnN5bWJvbC5uYW1lID0gKGNoYXIgKikgKHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOworCSAgLyogV2UgdXNlIHRoZSBuYXRpdmUgbmFtZSBmaWVsZCB0byBwb2ludCB0byB0aGUgY2FjaGVkIGZpZWxkLiAgKi8KKwkgIHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAobG9uZykgZHN0OworCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKKwkJCQkJCSAgICAgc3JjLT51LnN5bWVudC5uX3NjbnVtKTsKKwkgIGRzdC0+c3ltYm9sLmZsYWdzID0gMDsKKwkgIGRzdC0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKKworCSAgc3dpdGNoIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzKQorCSAgICB7CisjaWZkZWYgSTk2MAorCSAgICBjYXNlIENfTEVBRkVYVDoKKyNpZiAwCisJICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWE7CisJICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKKwkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKKyNlbmRpZgorCSAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UgKi8KKworI2VuZGlmCisKKwkgICAgY2FzZSBDX0VYVDoKKwkgICAgY2FzZSBDX1dFQUtFWFQ6CisjaWYgZGVmaW5lZCBBUk0KKyAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVDoKKyAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVEZVTkM6CisjZW5kaWYKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKwkgICAgY2FzZSBDX0hJREVYVDoKKyNlbmRpZgorI2lmZGVmIENfU1lTVEVNCisJICAgIGNhc2UgQ19TWVNURU06CS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCisjZW5kaWYKKyNpZmRlZiBDT0ZGX1dJVEhfUEUKKyAgICAgICAgICAgIC8qIFBFIHVzZXMgc3RvcmFnZSBjbGFzcyAweDY4IHRvIGRlbm90ZSBhIHNlY3Rpb24gc3ltYm9sICovCisgICAgICAgICAgICBjYXNlIENfU0VDVElPTjoKKwkgICAgLyogUEUgdXNlcyBzdG9yYWdlIGNsYXNzIDB4NjkgZm9yIGEgd2VhayBleHRlcm5hbCBzeW1ib2wuICAqLworCSAgICBjYXNlIENfTlRfV0VBSzoKKyNlbmRpZgorCSAgICAgIGlmICgoc3JjLT51LnN5bWVudC5uX3NjbnVtKSA9PSAwKQorCQl7CisJCSAgaWYgKChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpID09IDApCisJCSAgICB7CisJCSAgICAgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKwkJICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCisJCSAgICAgc2VjdGlvbiAqLworCisJCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKKworI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCisJCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCisJCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7CisjZWxzZQorCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQorCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7CisjZW5kaWYKKworCQkgIGlmIChJU0ZDTiAoKHNyYy0+dS5zeW1lbnQubl90eXBlKSkpCisJCSAgICB7CisJCSAgICAgIC8qIEEgZnVuY3Rpb24gZXh0IGRvZXMgbm90IGdvIGF0IHRoZSBlbmQgb2YgYQorCQkJIGZpbGUuICAqLworCQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKKwkJICAgIH0KKwkJfQorCisjaWZkZWYgUlM2MDAwQ09GRl9DCisJICAgICAgLyogQSBDX0hJREVYVCBzeW1ib2wgaXMgbm90IGdsb2JhbC4gICovCisJICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19ISURFWFQpCisJCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOworCSAgICAgIC8qIEEgc3ltYm9sIHdpdGggYSBjc2VjdCBlbnRyeSBzaG91bGQgbm90IGdvIGF0IHRoZSBlbmQuICAqLworCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKKwkJZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQ7CisjZW5kaWYKKworI2lmZGVmIENPRkZfV0lUSF9QRQorCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTlRfV0VBSykKKwkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKKyNlbmRpZgorCisJICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQorCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOworCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBDX1NUQVQ6CS8qIHN0YXRpYwkJCSAqLworI2lmZGVmIEk5NjAKKwkgICAgY2FzZSBDX0xFQUZTVEFUOgkvKiBzdGF0aWMgbGVhZiBwcm9jZWR1cmUgICAgICAgICovCisjZW5kaWYKKyNpZiBkZWZpbmVkIEFSTSAKKyAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVQ6ICAgLyogVGh1bWIgc3RhdGljICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgQ19USFVNQkxBQkVMOiAgLyogVGh1bWIgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVRGVU5DOi8qIFRodW1iIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgKi8KKyNlbmRpZgorCSAgICBjYXNlIENfTEFCRUw6CS8qIGxhYmVsCQkJICovCisJICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY251bSA9PSAtMikKKwkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworCSAgICAgIGVsc2UKKwkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7CisKKwkgICAgICAvKiBCYXNlIHRoZSB2YWx1ZSBhcyBhbiBpbmRleCBmcm9tIHRoZSBiYXNlIG9mIHRoZQorCQkgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLiAgKi8KKwkgICAgICBpZiAoZHN0LT5zeW1ib2wuc2VjdGlvbikKKwkJeworI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCisJCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCisJCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7CisjZWxzZQorCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQorCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7CisjZW5kaWYKKwkJfQorCSAgICAgIGVsc2UKKwkJZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBDX01PUzoJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkgKi8KKwkgICAgY2FzZSBDX0VPUzoJLyogZW5kIG9mIHN0cnVjdHVyZQkJICovCisjaWZkZWYgTk9UREVGCQkJLyogQ19BVVRPQVJHIGhhcyB0aGUgc2FtZSB2YWx1ZSAqLworI2lmZGVmIENfR0xCTFJFRworCSAgICBjYXNlIENfR0xCTFJFRzoJLyogQTI5ay1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzICovCisjZW5kaWYKKyNlbmRpZgorCSAgICBjYXNlIENfUkVHUEFSTToJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkgKi8KKwkgICAgY2FzZSBDX1JFRzoJLyogcmVnaXN0ZXIgdmFyaWFibGUJCSAqLworI2lmbmRlZiBUSUM4MENPRkYKKyNpZmRlZiBDX0FVVE9BUkcKKwkgICAgY2FzZSBDX0FVVE9BUkc6CS8qIDk2MC1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzICovCisjZW5kaWYKKyNlbmRpZgorCSAgICBjYXNlIENfVFBERUY6CS8qIHR5cGUgZGVmaW5pdGlvbgkJICovCisJICAgIGNhc2UgQ19BUkc6CisJICAgIGNhc2UgQ19BVVRPOgkvKiBhdXRvbWF0aWMgdmFyaWFibGUgKi8KKwkgICAgY2FzZSBDX0ZJRUxEOgkvKiBiaXQgZmllbGQgKi8KKwkgICAgY2FzZSBDX0VOVEFHOgkvKiBlbnVtZXJhdGlvbiB0YWcJCSAqLworCSAgICBjYXNlIENfTU9FOgkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24JICovCisJICAgIGNhc2UgQ19NT1U6CS8qIG1lbWJlciBvZiB1bmlvbgkJICovCisJICAgIGNhc2UgQ19VTlRBRzoJLyogdW5pb24gdGFnCQkJICovCisJICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBDX0ZJTEU6CS8qIGZpbGUgbmFtZQkJCSAqLworCSAgICBjYXNlIENfU1RSVEFHOgkvKiBzdHJ1Y3R1cmUgdGFnCQkgKi8KKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKwkgICAgY2FzZSBDX0dTWU06CisJICAgIGNhc2UgQ19MU1lNOgorCSAgICBjYXNlIENfUFNZTToKKwkgICAgY2FzZSBDX1JTWU06CisJICAgIGNhc2UgQ19SUFNZTToKKwkgICAgY2FzZSBDX1NUU1lNOgorCSAgICBjYXNlIENfQkNPTU06CisJICAgIGNhc2UgQ19FQ09NTToKKwkgICAgY2FzZSBDX0RFQ0w6CisJICAgIGNhc2UgQ19FTlRSWToKKwkgICAgY2FzZSBDX0ZVTjoKKwkgICAgY2FzZSBDX0VTVEFUOgorI2VuZGlmCisJICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7CisJICAgICAgYnJlYWs7CisKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKwkgICAgY2FzZSBDX0JJTkNMOgkvKiBiZWdpbm5pbmcgb2YgaW5jbHVkZSBmaWxlICAgICAqLworCSAgICBjYXNlIENfRUlOQ0w6CS8qIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgICAgICAgICovCisJICAgICAgLyogVGhlIHZhbHVlIGlzIGFjdHVhbGx5IGEgcG9pbnRlciBpbnRvIHRoZSBsaW5lIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSBsb2NhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5LCBhbmQKKyAgICAgICAgICAgICAgICAgc2V0IHRoZSBzZWN0aW9uIHRvIHRoZSBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIGl0LCBhbmQKKyAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRoZSBpbmRleCBpbiB0aGF0IHNlY3Rpb24uICAqLworCSAgICAgIHsKKwkJYXNlY3Rpb24gKnNlYzsKKworCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7CisJCWZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCisJCSAgaWYgKHNlYy0+bGluZV9maWxlcG9zIDw9IChmaWxlX3B0cikgc3JjLT51LnN5bWVudC5uX3ZhbHVlCisJCSAgICAgICYmICgoZmlsZV9wdHIpIChzZWMtPmxpbmVfZmlsZXBvcworCQkJCSAgICAgICsgc2VjLT5saW5lbm9fY291bnQgKiBMSU5FU1opCisJCQkgID4gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUpKQorCQkgICAgYnJlYWs7CisJCWlmIChzZWMgPT0gTlVMTCkKKwkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7CisJCWVsc2UKKwkJICB7CisJCSAgICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gc2VjOworCQkgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoKHNyYy0+dS5zeW1lbnQubl92YWx1ZQorCQkJCQkgIC0gc2VjLT5saW5lX2ZpbGVwb3MpCisJCQkJCSAvIExJTkVTWik7CisJCSAgICBzcmMtPmZpeF9saW5lID0gMTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQ19CU1RBVDoKKwkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7CisKKwkgICAgICAvKiBUaGUgdmFsdWUgaXMgYWN0dWFsbHkgYSBzeW1ib2wgaW5kZXguICBTYXZlIGEgcG9pbnRlcgorCQkgdG8gdGhlIHN5bWJvbCBpbnN0ZWFkIG9mIHRoZSBpbmRleC4gIEZJWE1FOiBUaGlzCisJCSBzaG91bGQgdXNlIGEgdW5pb24uICAqLworCSAgICAgIHNyYy0+dS5zeW1lbnQubl92YWx1ZSA9CisJCShsb25nKSAobmF0aXZlX3N5bWJvbHMgKyBzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOworCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOworCSAgICAgIHNyYy0+Zml4X3ZhbHVlID0gMTsKKwkgICAgICBicmVhazsKKyNlbmRpZgorCisJICAgIGNhc2UgQ19CTE9DSzoJLyogIi5iYiIgb3IgIi5lYiIJCSAqLworCSAgICBjYXNlIENfRkNOOgkJLyogIi5iZiIgb3IgIi5lZiIJCSAqLworCSAgICBjYXNlIENfRUZDTjoJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSAqLworCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOworI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCisJICAgICAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0CisJCSBvZiB0aGUgc2VjdGlvbi4gICovCisJICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7CisjZWxzZQorCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCisJCSBzZWN0aW9uLiAgKi8KKwkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKKwkJCQkgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7CisjZW5kaWYKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIENfTlVMTDoKKwkgICAgY2FzZSBDX0VYVERFRjoJLyogZXh0ZXJuYWwgZGVmaW5pdGlvbgkJICovCisJICAgIGNhc2UgQ19VTEFCRUw6CS8qIHVuZGVmaW5lZCBsYWJlbAkJICovCisJICAgIGNhc2UgQ19VU1RBVElDOgkvKiB1bmRlZmluZWQgc3RhdGljCQkgKi8KKyNpZm5kZWYgQ09GRl9XSVRIX1BFCisgICAgICAgICAgICAvKiBDX0xJTkUgaW4gcmVndWxhciBjb2ZmIGlzIDB4NjguICBOVCBoYXMgdGFrZW4gb3ZlciB0aGlzIHN0b3JhZ2UKKyAgICAgICAgICAgICAgIGNsYXNzIHRvIHJlcHJlc2VudCBhIHNlY3Rpb24gc3ltYm9sICovCisJICAgIGNhc2UgQ19MSU5FOgkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCisJICAgICAgLyogTlQgdXNlcyAweDY3IGZvciBhIHdlYWsgc3ltYm9sLCBub3QgQ19BTElBUy4gICovCisJICAgIGNhc2UgQ19BTElBUzoJLyogZHVwbGljYXRlIHRhZwkJICovCisjZW5kaWYKKwkgICAgICAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MCAqLworI2lmZGVmIFRJQzgwQ09GRgorCSAgICBjYXNlIENfVUVYVDoJLyogVGVudGF0aXZlIGV4dGVybmFsIGRlZmluaXRpb24gKi8KKyNlbmRpZgorCSAgICBjYXNlIENfU1RBVExBQjoJLyogU3RhdGljIGxvYWQgdGltZSBsYWJlbCAqLworCSAgICBjYXNlIENfRVhUTEFCOgkvKiBFeHRlcm5hbCBsb2FkIHRpbWUgbGFiZWwgKi8KKwkgICAgY2FzZSBDX0hJRERFTjoJLyogZXh0IHN5bWJvbCBpbiBkbWVydCBwdWJsaWMgbGliICovCisJICAgIGRlZmF1bHQ6CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCIlczogVW5yZWNvZ25pemVkIHN0b3JhZ2UgY2xhc3MgJWQgZm9yICVzIHN5bWJvbCBgJXMnIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3JjLT51LnN5bWVudC5uX3NjbGFzcywKKwkJIGRzdC0+c3ltYm9sLnNlY3Rpb24tPm5hbWUsIGRzdC0+c3ltYm9sLm5hbWUpOworCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKKwkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKy8qICAgICAgQkZEX0FTU0VSVChkc3QtPnN5bWJvbC5mbGFncyAhPSAwKTsqLworCisJICBkc3QtPm5hdGl2ZSA9IHNyYzsKKworCSAgZHN0LT5zeW1ib2wudWRhdGEuaSA9IDA7CisJICBkc3QtPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOworCSAgdGhpc19pbmRleCArPSAoc3JjLT51LnN5bWVudC5uX251bWF1eCkgKyAxOworCSAgZHN0Kys7CisJICBudW1iZXJfb2Zfc3ltYm9scysrOworCX0JCQkvKiB3YWxrIHRoZSBuYXRpdmUgc3ltdGFiICovCisgICAgfQkJCQkvKiBiZmRpemUgdGhlIG5hdGl2ZSBzeW10YWIgKi8KKworICBvYmpfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWRfYXJlYTsKKyAgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSA9IG5hdGl2ZV9zeW1ib2xzOworCisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gbnVtYmVyX29mX3N5bWJvbHM7CisgIG9ial9jb252ZXJ0IChhYmZkKSA9IHRhYmxlX3B0cjsKKyAgLyogU2x1cnAgdGhlIGxpbmUgdGFibGVzIGZvciBlYWNoIHNlY3Rpb24gdG9vICovCisgIHsKKyAgICBhc2VjdGlvbiAqcDsKKyAgICBwID0gYWJmZC0+c2VjdGlvbnM7CisgICAgd2hpbGUgKHApCisgICAgICB7CisJY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBwKTsKKwlwID0gcC0+bmV4dDsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30JCQkJLyogY29mZl9zbHVycF9zeW1ib2xfdGFibGUoKSAqLworCisvKiBDaGVjayB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbGx5IHZpc2libGUuICBUaGlzIGlzIHVzZWQgYnkgdGhlCisgICBDT0ZGIGJhY2tlbmQgbGlua2VyIGNvZGUgaW4gY29mZmxpbmsuYywgc2luY2UgYSBjb3VwbGUgb2YgdGFyZ2V0cworICAgaGF2ZSBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMgd2hpY2ggYXJlIG5vdCBjbGFzcyBDX0VYVC4gIFRoaXMKKyAgIGZ1bmN0aW9uIG5lZWQgbm90IGhhbmRsZSB0aGUgY2FzZSBvZiBuX2NsYXNzID09IENfRVhULiAgKi8KKworI3VuZGVmIE9USEVSX0dMT0JBTF9DTEFTUworCisjaWZkZWYgSTk2MAorI2RlZmluZSBPVEhFUl9HTE9CQUxfQ0xBU1MgQ19MRUFGRVhUCisjZW5kaWYKKworI2lmZGVmIENPRkZBUk0KKyNkZWZpbmUgT1RIRVJfR0xPQkFMX0NMQVNTIENfVEhVTUJFWFQgfHwgc3ltZW50LT5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQworI2Vsc2UKKyNpZmRlZiBDT0ZGX1dJVEhfUEUKKyNkZWZpbmUgT1RIRVJfR0xPQkFMX0NMQVNTIENfU0VDVElPTgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE9USEVSX0dMT0JBTF9DTEFTUworCitzdGF0aWMgYm9vbGVhbiBjb2ZmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOworCitzdGF0aWMgYm9vbGVhbgorY29mZl9zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW1lbnQpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW1lbnQ7Cit7CisgIHJldHVybiAoc3ltZW50LT5uX3NjbGFzcyA9PSBPVEhFUl9HTE9CQUxfQ0xBU1MpOworfQorCisjdW5kZWYgT1RIRVJfR0xPQkFMX0NMQVNTCisKKyNlbHNlIC8qICEgZGVmaW5lZCAoT1RIRVJfR0xPQkFMX0NMQVNTKSAqLworCisvKiBzeW1faXNfZ2xvYmFsIHNob3VsZCBub3QgYmUgZGVmaW5lZCBpZiBpdCBoYXMgbm90aGluZyB0byBkby4gICovCisKKyNkZWZpbmUgY29mZl9zeW1faXNfZ2xvYmFsIDAKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoT1RIRVJfR0xPQkFMX0NMQVNTKSAqLworCisvKgorU1VCU1VCU0VDVElPTgorCVJlYWRpbmcgcmVsb2NhdGlvbnMKKworCUNvZmYgcmVsb2NhdGlvbnMgYXJlIGVhc2lseSB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBpbnRlcm5hbCBCRkQgZm9ybQorCShAY29kZXthcmVsZW50fSkuCisKKwlSZWFkaW5nIGEgY29mZiByZWxvY2F0aW9uIHRhYmxlIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyBzdGFnZXM6CisKKwlvIFJlYWQgdGhlIGVudGlyZSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaW50byBtZW1vcnkuCisKKwlvIFByb2Nlc3MgZWFjaCByZWxvY2F0aW9uIGluIHR1cm47IGZpcnN0IHN3YXAgaXQgZnJvbSB0aGUKKwlleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwgZm9ybS4KKworCW8gVHVybiB0aGUgc3ltYm9sIHJlZmVyZW5jZWQgaW4gdGhlIHJlbG9jYXRpb24ncyBzeW1ib2wgaW5kZXgKKwlpbnRvIGEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgc3ltYm9sIHRhYmxlLgorCVRoaXMgdGFibGUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSByZXR1cm5lZCBieSBhIGNhbGwgdG8KKwlAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uIFRoZSBiYWNrIGVuZCB3aWxsIGNhbGwgdGhhdAorCXJvdXRpbmUgYW5kIHNhdmUgdGhlIHJlc3VsdCBpZiBhIGNhbm9uaWNhbGl6YXRpb24gaGFzbid0IGJlZW4gZG9uZS4KKworCW8gVGhlIHJlbG9jIGluZGV4IGlzIHR1cm5lZCBpbnRvIGEgcG9pbnRlciB0byBhIGhvd3RvCisJc3RydWN0dXJlLCBpbiBhIGJhY2sgZW5kIHNwZWNpZmljIHdheS4gRm9yIGluc3RhbmNlLCB0aGUgMzg2CisJYW5kIDk2MCB1c2UgdGhlIEBjb2Rle3JfdHlwZX0gdG8gZGlyZWN0bHkgcHJvZHVjZSBhbiBpbmRleAorCWludG8gYSBob3d0byB0YWJsZSB2ZWN0b3I7IHRoZSA4OGsgc3VidHJhY3RzIGEgbnVtYmVyIGZyb20gdGhlCisJQGNvZGV7cl90eXBlfSBmaWVsZCBhbmQgY3JlYXRlcyBhbiBhZGRlbmQgZmllbGQuCisKKworKi8KKworI2lmbmRlZiBDQUxDX0FEREVORAorI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAorICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAorICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2VuZGlmCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKKyAgICAgYmZkICogYWJmZDsKKyAgICAgc2VjX3B0ciBhc2VjdDsKKyAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOworeworICBSRUxPQyAqbmF0aXZlX3JlbG9jczsKKyAgYXJlbGVudCAqcmVsb2NfY2FjaGU7CisgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKworICB1bnNpZ25lZCBpbnQgaWR4OworCisgIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGFzZWN0LT5yZWxvY19jb3VudCA9PSAwKQorICAgIHJldHVybiB0cnVlOworICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQorICAgIHJldHVybiB0cnVlOworICBpZiAoIWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIG5hdGl2ZV9yZWxvY3MgPQorICAgIChSRUxPQyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCisJCQkgICAgYXNlY3QtPnJlbF9maWxlcG9zLAorCQkJICAgIFNFRUtfU0VULAorCQkJICAgIChzaXplX3QpIChSRUxTWiAqCisJCQkJICAgICAgYXNlY3QtPnJlbG9jX2NvdW50KSk7CisgIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikKKyAgICBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpIChhc2VjdC0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKSk7CisKKyAgaWYgKHJlbG9jX2NhY2hlID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisKKyAgZm9yIChpZHggPSAwOyBpZHggPCBhc2VjdC0+cmVsb2NfY291bnQ7IGlkeCsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBkc3Q7CisgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnNyYzsKKyNpZm5kZWYgUkVMT0NfUFJPQ0VTU0lORworICAgICAgYXN5bWJvbCAqcHRyOworI2VuZGlmCisKKyAgICAgIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlICsgaWR4OworICAgICAgc3JjID0gbmF0aXZlX3JlbG9jcyArIGlkeDsKKworICAgICAgY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsICZkc3QpOworCisjaWZkZWYgUkVMT0NfUFJPQ0VTU0lORworICAgICAgUkVMT0NfUFJPQ0VTU0lORyAoY2FjaGVfcHRyLCAmZHN0LCBzeW1ib2xzLCBhYmZkLCBhc2VjdCk7CisjZWxzZQorICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gZHN0LnJfdmFkZHI7CisKKyAgICAgIGlmIChkc3Qucl9zeW1uZHggIT0gLTEpCisJeworCSAgaWYgKGRzdC5yX3N5bW5keCA8IDAgfHwgZHN0LnJfc3ltbmR4ID49IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIpLAorCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3N5bW5keCk7CisJICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworCSAgICAgIHB0ciA9IE5VTEw7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSAoc3ltYm9scworCQkJCQkrIG9ial9jb252ZXJ0IChhYmZkKVtkc3Qucl9zeW1uZHhdKTsKKwkgICAgICBwdHIgPSAqKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKwkgIHB0ciA9IE5VTEw7CisJfQorCisgICAgICAvKiBUaGUgc3ltYm9scyBkZWZpbml0aW9ucyB0aGF0IHdlIGhhdmUgcmVhZCBpbiBoYXZlIGJlZW4KKwkgcmVsb2NhdGVkIGFzIGlmIHRoZWlyIHNlY3Rpb25zIHN0YXJ0ZWQgYXQgMC4gQnV0IHRoZSBvZmZzZXRzCisJIHJlZmVyaW5nIHRvIHRoZSBzeW1ib2xzIGluIHRoZSByYXcgZGF0YSBoYXZlIG5vdCBiZWVuCisJIG1vZGlmaWVkLCBzbyB3ZSBoYXZlIHRvIGhhdmUgYSBuZWdhdGl2ZSBhZGRlbmQgdG8gY29tcGVuc2F0ZS4KKworCSBOb3RlIHRoYXQgc3ltYm9scyB3aGljaCB1c2VkIHRvIGJlIGNvbW1vbiBtdXN0IGJlIGxlZnQgYWxvbmUgKi8KKworICAgICAgLyogQ2FsY3VsYXRlIGFueSByZWxvYyBhZGRlbmQgYnkgbG9va2luZyBhdCB0aGUgc3ltYm9sICovCisgICAgICBDQUxDX0FEREVORCAoYWJmZCwgcHRyLCBkc3QsIGNhY2hlX3B0cik7CisKKyAgICAgIGNhY2hlX3B0ci0+YWRkcmVzcyAtPSBhc2VjdC0+dm1hOworLyogISEgICAgIGNhY2hlX3B0ci0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOyovCisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGNhY2hlX3B0ci0+aG93dG8gZmllbGQgZnJvbSBkc3Qucl90eXBlICovCisgICAgICBSVFlQRTJIT1dUTyAoY2FjaGVfcHRyLCAmZHN0KTsKKyNlbmRpZgkvKiBSRUxPQ19QUk9DRVNTSU5HICovCisKKyAgICAgIGlmIChjYWNoZV9wdHItPmhvd3RvID09IE5VTEwpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3R5cGUsIChsb25nKSBkc3Qucl92YWRkcik7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7CisgIHJldHVybiB0cnVlOworfQorCisjaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KKyNpZmRlZiBSVFlQRTJIT1dUTworCisvKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSByZWxvYy4gIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBmaWxlCisgICBpbmNsdWRpbmcgdGhpcyBvbmUgZGVmaW5lcyBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gdG8gYmUKKyAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHNvIGl0IGlzIE9LIGlmIGl0IGRvZXMgbm90CisgICBhbHdheXMgd29yay4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW5jbHVkaW5nIGZpbGUgdG8KKyAgIG1ha2Ugc3VyZSBpdCBpcyByZWFzb25hYmxlIGlmIGl0IGlzIG5lZWRlZC4gICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX3J0eXBlX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKKwkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAorCSAgIGJmZF92bWEgKikpOworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2NvZmZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7CisgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOworICAgICBiZmRfdm1hICphZGRlbmRwOworeworICBhcmVsZW50IGdlbnJlbDsKKworICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKKyAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKK30KKworI2Vsc2UgLyogISBkZWZpbmVkIChSVFlQRTJIT1dUTykgKi8KKworI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIE5VTEwKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCisjZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLworCisvKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUuICAqLworc3RhdGljIGxvbmcKK2NvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgYXJlbGVudCAqKiByZWxwdHI7CisgICAgIGFzeW1ib2wgKiogc3ltYm9sczsKK3sKKyAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKyAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKworCisgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKKyAgICB7CisgICAgICAvKiB0aGlzIHNlY3Rpb24gaGFzIHJlbG9jcyBtYWRlIHVwIGJ5IHVzLCB0aGV5IGFyZSBub3QgaW4gdGhlCisgICAgICAgZmlsZSwgc28gdGFrZSB0aGVtIG91dCBvZiB0aGVpciBjaGFpbiBhbmQgcGxhY2UgdGhlbSBpbnRvCisgICAgICAgdGhlIGRhdGEgYXJlYSBwcm92aWRlZCAqLworICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKKyAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQorCXsKKwkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OworCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKKwl9CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247CisKKyAgICAgIGZvciAoOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQorCSpyZWxwdHIrKyA9IHRibHB0cisrOworCisKKyAgICB9CisgICpyZWxwdHIgPSAwOworICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Cit9CisKKyNpZmRlZiBHTlU5NjAKK2ZpbGVfcHRyCitjb2ZmX3N5bV9maWxlcG9zIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9yZWxvYzE2X2VzdGltYXRlCisjZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBkdW1teV9yZWxvYzE2X2VzdGltYXRlCisKK3N0YXRpYyBpbnQgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCB1bnNpZ25lZCBpbnQsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCitzdGF0aWMgaW50CitkdW1teV9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGFyZWxlbnQgKnJlbG9jOworICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworeworICBhYm9ydCAoKTsKK30KKworI2VuZGlmCisKKyNpZm5kZWYgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCisKKyNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKKworLyogVGhpcyB3b3JrcyBldmVuIGlmIGFib3J0IGlzIG5vdCBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGZpbGUuICAqLworCitzdGF0aWMgdm9pZCBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYXJlbGVudCAqLAorCSAgIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOworCitzdGF0aWMgdm9pZAorZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKKwkJCSAgIGRzdF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworICAgICBhcmVsZW50ICpyZWxvYzsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOworeworICBhYm9ydCAoKTsKK30KKyNlbmRpZgorCisvKiBJZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgd2UgY2FuIHVzZSB0aGUgb3B0aW1pemVkIENPRkYKKyAgIGJhY2tlbmQgbGlua2VyLiAgT3RoZXJ3aXNlIHdlIG11c3QgY29udGludWUgdG8gdXNlIHRoZSBvbGQgbGlua2VyLiAgKi8KKyNpZmRlZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KKyNpZm5kZWYgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZW5kaWYKKyNpZm5kZWYgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCisjZW5kaWYKKyNpZm5kZWYgY29mZl9iZmRfZmluYWxfbGluaworI2RlZmluZSBjb2ZmX2JmZF9maW5hbF9saW5rIF9iZmRfY29mZl9maW5hbF9saW5rCisjZW5kaWYKKyNlbHNlIC8qICEgZGVmaW5lZCAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSAqLworI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gTlVMTAorI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNlbmRpZgorI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKKyNlbmRpZgorI2RlZmluZSBjb2ZmX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pICovCisKKyNkZWZpbmUgY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCisKKyNpZm5kZWYgY29mZl9zdGFydF9maW5hbF9saW5rCisjZGVmaW5lIGNvZmZfc3RhcnRfZmluYWxfbGluayBOVUxMCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX2FkanVzdF9zeW1uZHgKKyNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4IE5VTEwKKyNlbmRpZgorCisjaWZuZGVmIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbAorI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKyNlbmRpZgorCisjaWZuZGVmIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuCisKK3N0YXRpYyBib29sZWFuIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOworCitzdGF0aWMgYm9vbGVhbgorY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gKGFiZmQsIGluZm8pCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIGluZm87Cit7CisgIHJldHVybiBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuOworfQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKKworc3RhdGljIGJvb2xlYW4gY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7CisKK3N0YXRpYyBib29sZWFuCitjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgcGZpbmZvKQorICAgICBiZmQgKiBhYmZkOworICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm87Cit7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9TV0FQX2F1eF9pbgorI2RlZmluZSBjb2ZmX1NXQVBfYXV4X2luIGNvZmZfc3dhcF9hdXhfaW4KKyNlbmRpZgorI2lmbmRlZiBjb2ZmX1NXQVBfc3ltX2luCisjZGVmaW5lIGNvZmZfU1dBUF9zeW1faW4gY29mZl9zd2FwX3N5bV9pbgorI2VuZGlmCisjaWZuZGVmIGNvZmZfU1dBUF9saW5lbm9faW4KKyNkZWZpbmUgY29mZl9TV0FQX2xpbmVub19pbiBjb2ZmX3N3YXBfbGluZW5vX2luCisjZW5kaWYKKyNpZm5kZWYgY29mZl9TV0FQX2F1eF9vdXQKKyNkZWZpbmUgY29mZl9TV0FQX2F1eF9vdXQgY29mZl9zd2FwX2F1eF9vdXQKKyNlbmRpZgorI2lmbmRlZiBjb2ZmX1NXQVBfc3ltX291dAorI2RlZmluZSBjb2ZmX1NXQVBfc3ltX291dCBjb2ZmX3N3YXBfc3ltX291dAorI2VuZGlmCisjaWZuZGVmIGNvZmZfU1dBUF9saW5lbm9fb3V0CisjZGVmaW5lIGNvZmZfU1dBUF9saW5lbm9fb3V0IGNvZmZfc3dhcF9saW5lbm9fb3V0CisjZW5kaWYKKyNpZm5kZWYgY29mZl9TV0FQX3JlbG9jX291dAorI2RlZmluZSBjb2ZmX1NXQVBfcmVsb2Nfb3V0IGNvZmZfc3dhcF9yZWxvY19vdXQKKyNlbmRpZgorI2lmbmRlZiBjb2ZmX1NXQVBfZmlsZWhkcl9vdXQKKyNkZWZpbmUgY29mZl9TV0FQX2ZpbGVoZHJfb3V0IGNvZmZfc3dhcF9maWxlaGRyX291dAorI2VuZGlmCisjaWZuZGVmIGNvZmZfU1dBUF9hb3V0aGRyX291dAorI2RlZmluZSBjb2ZmX1NXQVBfYW91dGhkcl9vdXQgY29mZl9zd2FwX2FvdXRoZHJfb3V0CisjZW5kaWYKKyNpZm5kZWYgY29mZl9TV0FQX3Njbmhkcl9vdXQKKyNkZWZpbmUgY29mZl9TV0FQX3Njbmhkcl9vdXQgY29mZl9zd2FwX3Njbmhkcl9vdXQKKyNlbmRpZgorI2lmbmRlZiBjb2ZmX1NXQVBfcmVsb2NfaW4KKyNkZWZpbmUgY29mZl9TV0FQX3JlbG9jX2luIGNvZmZfc3dhcF9yZWxvY19pbgorI2VuZGlmCisjaWZuZGVmIGNvZmZfU1dBUF9maWxlaGRyX2luCisjZGVmaW5lIGNvZmZfU1dBUF9maWxlaGRyX2luIGNvZmZfc3dhcF9maWxlaGRyX2luCisjZW5kaWYKKyNpZm5kZWYgY29mZl9TV0FQX2FvdXRoZHJfaW4KKyNkZWZpbmUgY29mZl9TV0FQX2FvdXRoZHJfaW4gY29mZl9zd2FwX2FvdXRoZHJfaW4KKyNlbmRpZgorI2lmbmRlZiBjb2ZmX1NXQVBfc2NuaGRyX2luCisjZGVmaW5lIGNvZmZfU1dBUF9zY25oZHJfaW4gY29mZl9zd2FwX3Njbmhkcl9pbgorI2VuZGlmCisKKworCitzdGF0aWMgQ09OU1QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlID0KK3sKKyAgY29mZl9TV0FQX2F1eF9pbiwgY29mZl9TV0FQX3N5bV9pbiwgY29mZl9TV0FQX2xpbmVub19pbiwKKyAgY29mZl9TV0FQX2F1eF9vdXQsIGNvZmZfU1dBUF9zeW1fb3V0LAorICBjb2ZmX1NXQVBfbGluZW5vX291dCwgY29mZl9TV0FQX3JlbG9jX291dCwKKyAgY29mZl9TV0FQX2ZpbGVoZHJfb3V0LCBjb2ZmX1NXQVBfYW91dGhkcl9vdXQsCisgIGNvZmZfU1dBUF9zY25oZHJfb3V0LAorICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCBTWU1FU1osIEFVWEVTWiwgUkVMU1osIExJTkVTWiwKKyNpZmRlZiBDT0ZGX0xPTkdfRklMRU5BTUVTCisgIHRydWUsCisjZWxzZQorICBmYWxzZSwKKyNlbmRpZgorI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCisgIHRydWUsCisjZWxzZQorICBmYWxzZSwKKyNlbmRpZgorICBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIsCisgIGNvZmZfU1dBUF9maWxlaGRyX2luLCBjb2ZmX1NXQVBfYW91dGhkcl9pbiwgY29mZl9TV0FQX3Njbmhkcl9pbiwKKyAgY29mZl9TV0FQX3JlbG9jX2luLCBjb2ZmX2JhZF9mb3JtYXRfaG9vaywgY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCisgIGNvZmZfbWtvYmplY3RfaG9vaywgc3R5cF90b19zZWNfZmxhZ3MsIGNvZmZfc2V0X2FsaWdubWVudF9ob29rLAorICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwgc3ltbmFtZV9pbl9kZWJ1Z19ob29rLCBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2ssCisgIGNvZmZfcHJpbnRfYXV4LCBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKKyAgY29mZl9zeW1faXNfZ2xvYmFsLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKKyAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCisgIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAorICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKK307CisKKyNpZm5kZWYgY29mZl9jbG9zZV9hbmRfY2xlYW51cAorI2RlZmluZQljb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwICAgICAgICAgICAgICBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKKyNlbmRpZgorCisjaWZuZGVmIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKyNkZWZpbmUgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbyAgICAgICAgICAgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgICAgICAgICAgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cworI2VuZGlmCisKKyNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCisjZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCisjZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAorI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyNlbmRpZgorCisjaWZuZGVmIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKKyNlbmRpZgorCisjaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgCisjZGVmaW5lIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgICAgIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCSAgICBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2VuZGlmCisKKyNpZm5kZWYgY29mZl9yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIGNvZmZfcmVhZF9taW5pc3ltYm9scwkJICAgIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCisjZGVmaW5lIGNvZmZfbWluaXN5bWJvbF90b19zeW1ib2wJICAgIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAorI2VuZGlmCisKKy8qIFRoZSByZWxvYyBsb29rdXAgcm91dGluZSBtdXN0IGJlIHN1cHBsaWVkIGJ5IGVhY2ggaW5kaXZpZHVhbCBDT0ZGCisgICBiYWNrZW5kLiAgKi8KKyNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCisjZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24JCSAgICBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisjZW5kaWYKKworI2lmbmRlZiBjb2ZmX2JmZF9nY19zZWN0aW9ucworI2RlZmluZSBjb2ZmX2JmZF9nY19zZWN0aW9ucwkJICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmZ2VuLmMgYi9iZmQvY29mZmdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDEzODMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZmdlbi5jCkBAIC0wLDAgKzEsMjM3OCBAQAorLyogU3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgcGFydHMgb2YgQ09GRiwgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIE1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLCBzYWNAY3lnbnVzLmNvbS4KKyAgIFNwbGl0IG91dCBvZiBjb2ZmY29kZS5oIGJ5IElhbiBUYXlsb3IsIGlhbkBjeWdudXMuY29tLiAgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIENPRkYgY29kZSB0aGF0IGlzIG5vdCBkZXBlbmRlbnQgb24gYW55CisgICBwYXJ0aWN1bGFyIENPRkYgdGFyZ2V0LiAgVGhlcmUgaXMgb25seSBvbmUgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW4KKyAgIGxpYmJmZC5hLCBzbyBubyB0YXJnZXQgc3BlY2lmaWMgY29kZSBtYXkgYmUgcHV0IGluIGhlcmUuICBPciwgdG8KKyAgIHB1dCBpdCBhbm90aGVyIHdheSwKKworICAgKioqKioqKioqKiBETyBOT1QgUFVUIFRBUkdFVCBTUEVDSUZJQyBDT0RFIElOIFRISVMgRklMRSAqKioqKioqKioqCisKKyAgIElmIHlvdSBuZWVkIHRvIGFkZCBzb21lIHRhcmdldCBzcGVjaWZpYyBiZWhhdmlvdXIsIGFkZCBhIG5ldyBob29rCisgICBmdW5jdGlvbiB0byBiZmRfY29mZl9iYWNrZW5kX2RhdGEuCisKKyAgIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBhbHNvIGNhbGxlZCBieSB0aGUgRUNPRkYgcm91dGluZXMuCisgICBUaG9zZSBmdW5jdGlvbnMgbWF5IG5vdCB1c2UgYW55IENPRkYgc3BlY2lmaWMgaW5mb3JtYXRpb24sIHN1Y2ggYXMKKyAgIGNvZmZfZGF0YSAoYWJmZCkuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworc3RhdGljIHZvaWQgY29mZl9maXhfc3ltYm9sX25hbWUKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBiZmRfc2l6ZV90eXBlICosCisJICAgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2wKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCB1bnNpZ25lZCBpbnQgKiwKKwkgICBiZmRfc2l6ZV90eXBlICosIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKK3N0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sCisgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHVuc2lnbmVkIGludCAqLCBiZmRfc2l6ZV90eXBlICosCisJICAgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sCisgIFBBUkFNUyAoKGJmZCAqLCBjb2ZmX3N5bWJvbF90eXBlICosIHVuc2lnbmVkIGludCAqLCBiZmRfc2l6ZV90eXBlICosCisJICAgYXNlY3Rpb24gKiosIGJmZF9zaXplX3R5cGUgKikpOworc3RhdGljIHZvaWQgY29mZl9wb2ludGVyaXplX2F1eAorICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCisJICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKK3N0YXRpYyBib29sZWFuIG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZQorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3NjbmhkciAqLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpjb2ZmX3JlYWxfb2JqZWN0X3AKKyAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLCAKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSk7CitzdGF0aWMgdm9pZCBmaXh1cF9zeW1ib2xfdmFsdWUKKyAgUEFSQU1TICgoYmZkICosIGNvZmZfc3ltYm9sX3R5cGUgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7CitzdGF0aWMgY2hhciAqYnVpbGRfZGVidWdfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGNoYXIgKmNvcHlfbmFtZQorICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQorCisvKiBUYWtlIGEgc2VjdGlvbiBoZWFkZXIgcmVhZCBmcm9tIGEgY29mZiBmaWxlIChpbiBIT1NUIGJ5dGUgb3JkZXIpLAorICAgYW5kIG1ha2UgYSBCRkQgInNlY3Rpb24iIG91dCBvZiBpdC4gIFRoaXMgaXMgdXNlZCBieSBFQ09GRi4gICovCitzdGF0aWMgYm9vbGVhbgorbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlIChhYmZkLCBoZHIsIHRhcmdldF9pbmRleCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpoZHI7CisgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfaW5kZXg7Cit7CisgIGFzZWN0aW9uICpyZXR1cm5fc2VjdGlvbjsKKyAgY2hhciAqbmFtZTsKKworICBuYW1lID0gTlVMTDsKKworICAvKiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGluIFBFLiAgKi8KKyAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkKKyAgICAgICYmIGhkci0+c19uYW1lWzBdID09ICcvJykKKyAgICB7CisgICAgICBjaGFyIGJ1ZltTQ05OTUxFTl07CisgICAgICBsb25nIHN0cmluZGV4OworICAgICAgY2hhciAqcDsKKyAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ3M7CisKKyAgICAgIG1lbWNweSAoYnVmLCBoZHItPnNfbmFtZSArIDEsIFNDTk5NTEVOIC0gMSk7CisgICAgICBidWZbU0NOTk1MRU4gLSAxXSA9ICdcMCc7CisgICAgICBzdHJpbmRleCA9IHN0cnRvbCAoYnVmLCAmcCwgMTApOworICAgICAgaWYgKCpwID09ICdcMCcgJiYgc3RyaW5kZXggPj0gMCkKKwl7CisJICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKKwkgIGlmIChzdHJpbmdzID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC8qIEZJWE1FOiBGb3IgZXh0cmEgc2FmZXR5LCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICBzdHJpbmRleCBkb2VzIG5vdCBydW4gdXMgcGFzdCB0aGUgZW5kLCBidXQgcmlnaHQgbm93IHdlCisgICAgICAgICAgICAgZG9uJ3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUuICAqLworCSAgc3RyaW5ncyArPSBzdHJpbmRleDsKKwkgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc3RyaW5ncykgKyAxKTsKKwkgIGlmIChuYW1lID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHN0cmNweSAobmFtZSwgc3RyaW5ncyk7CisJfQorICAgIH0KKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEFzc29ydGVkIHdhc3RhZ2UgdG8gbnVsbC10ZXJtaW5hdGUgdGhlIG5hbWUsIHRoYW5rcyBBVCZUISAqLworICAgICAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChoZHItPnNfbmFtZSkgKyAxKTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgc3RybmNweSAobmFtZSwgKGNoYXIgKikgJmhkci0+c19uYW1lWzBdLCBzaXplb2YgKGhkci0+c19uYW1lKSk7CisgICAgICBuYW1lW3NpemVvZiAoaGRyLT5zX25hbWUpXSA9IDA7CisgICAgfQorCisgIHJldHVybl9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOworICBpZiAocmV0dXJuX3NlY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuX3NlY3Rpb24tPnZtYSA9IGhkci0+c192YWRkcjsKKyAgcmV0dXJuX3NlY3Rpb24tPmxtYSA9IGhkci0+c19wYWRkcjsKKyAgcmV0dXJuX3NlY3Rpb24tPl9yYXdfc2l6ZSA9IGhkci0+c19zaXplOworICByZXR1cm5fc2VjdGlvbi0+ZmlsZXBvcyA9IGhkci0+c19zY25wdHI7CisgIHJldHVybl9zZWN0aW9uLT5yZWxfZmlsZXBvcyA9IGhkci0+c19yZWxwdHI7CisgIHJldHVybl9zZWN0aW9uLT5yZWxvY19jb3VudCA9IGhkci0+c19ucmVsb2M7CisKKyAgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCByZXR1cm5fc2VjdGlvbiwgaGRyKTsKKworICByZXR1cm5fc2VjdGlvbi0+bGluZV9maWxlcG9zID0gaGRyLT5zX2xubm9wdHI7CisKKyAgcmV0dXJuX3NlY3Rpb24tPmxpbmVub19jb3VudCA9IGhkci0+c19ubG5ubzsKKyAgcmV0dXJuX3NlY3Rpb24tPnVzZXJkYXRhID0gTlVMTDsKKyAgcmV0dXJuX3NlY3Rpb24tPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgcmV0dXJuX3NlY3Rpb24tPmZsYWdzID0gYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayAoYWJmZCwgaGRyLCBuYW1lKTsKKworICByZXR1cm5fc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdGFyZ2V0X2luZGV4OworCisgIC8qIEF0IGxlYXN0IG9uIGkzODYtY29mZiwgdGhlIGxpbmUgbnVtYmVyIGNvdW50IGZvciBhIHNoYXJlZCBsaWJyYXJ5CisgICAgIHNlY3Rpb24gbXVzdCBiZSBpZ25vcmVkLiAgKi8KKyAgaWYgKChyZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKKyAgICByZXR1cm5fc2VjdGlvbi0+bGluZW5vX2NvdW50ID0gMDsKKworICBpZiAoaGRyLT5zX25yZWxvYyAhPSAwKQorICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7CisgIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBjaGVjayAnaGRyLT5zX3NpemUgPiAwJyAqLworICBpZiAoaGRyLT5zX3NjbnB0ciAhPSAwKQorICAgIHJldHVybl9zZWN0aW9uLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBpbiBhIENPRkYgb2JqZWN0IGFuZCBtYWtlIGl0IGludG8gYSBCRkQuICBUaGlzIGlzIHVzZWQgYnkKKyAgIEVDT0ZGIGFzIHdlbGwuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitjb2ZmX3JlYWxfb2JqZWN0X3AgKGFiZmQsIG5zY25zLCBpbnRlcm5hbF9mLCBpbnRlcm5hbF9hKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIG5zY25zOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZjsKKyAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmludGVybmFsX2E7Cit7CisgIGZsYWd3b3JkIG9mbGFncyA9IGFiZmQtPmZsYWdzOworICBiZmRfdm1hIG9zdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIFBUUiB0ZGF0YTsKKyAgc2l6ZV90IHJlYWRzaXplOwkJLyogbGVuZ3RoIG9mIGZpbGVfaW5mbyAqLworICB1bnNpZ25lZCBpbnQgc2NuaHN6OworICBjaGFyICpleHRlcm5hbF9zZWN0aW9uczsKKworICBpZiAoIShpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9SRUxGTEcpKQorICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKKyAgaWYgKChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9FWEVDKSkKKyAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7CisgIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xOTk8pKQorICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk87CisgIGlmICghKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0xTWU1TKSkKKyAgICBhYmZkLT5mbGFncyB8PSBIQVNfTE9DQUxTOworCisgIC8qIEZJWE1FOiBIb3cgY2FuIHdlIHNldCBEX1BBR0VEIGNvcnJlY3RseT8gICovCisgIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRVhFQykgIT0gMCkKKyAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOworCisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gaW50ZXJuYWxfZi0+Zl9uc3ltczsKKyAgaWYgKGludGVybmFsX2YtPmZfbnN5bXMpCisgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7CisKKyAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCisgICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGludGVybmFsX2EtPmVudHJ5OworICBlbHNlCisgICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IDA7CisKKyAgLyogU2V0IHVwIHRoZSB0ZGF0YSBhcmVhLiAgRUNPRkYgdXNlcyBpdHMgb3duIHJvdXRpbmUsIGFuZCBvdmVycmlkZXMKKyAgICAgYWJmZC0+ZmxhZ3MuICAqLworICB0ZGF0YSA9IGJmZF9jb2ZmX21rb2JqZWN0X2hvb2sgKGFiZmQsIChQVFIpIGludGVybmFsX2YsIChQVFIpIGludGVybmFsX2EpOworICBpZiAodGRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBzY25oc3ogPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOworICByZWFkc2l6ZSA9IG5zY25zICogc2NuaHN6OworICBleHRlcm5hbF9zZWN0aW9ucyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgcmVhZHNpemUpOworICBpZiAoIWV4dGVybmFsX3NlY3Rpb25zKQorICAgIGdvdG8gZmFpbDsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dGVybmFsX3NlY3Rpb25zLCAxLCByZWFkc2l6ZSwgYWJmZCkgIT0gcmVhZHNpemUpCisgICAgZ290byBmYWlsOworCisgIC8qIE5vdyBjb3B5IGRhdGEgYXMgcmVxdWlyZWQ7IGNvbnN0cnVjdCBhbGwgYXNlY3Rpb25zIGV0YyAqLworICBpZiAobnNjbnMgIT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2NuczsgaSsrKQorCXsKKwkgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgdG1wOworCSAgYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsCisJCQkJICAgKFBUUikgKGV4dGVybmFsX3NlY3Rpb25zICsgaSAqIHNjbmhzeiksCisJCQkJICAgKFBUUikgJiB0bXApOworCSAgaWYgKCEgbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlIChhYmZkLCAmdG1wLCBpICsgMSkpCisJICAgIGdvdG8gZmFpbDsKKwl9CisgICAgfQorCisgIC8qICBtYWtlX2Fic19zZWN0aW9uIChhYmZkKTsgKi8KKworICBpZiAoYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rIChhYmZkLCAoUFRSKSBpbnRlcm5hbF9mKSA9PSBmYWxzZSkKKyAgICBnb3RvIGZhaWw7CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7CisKKyBmYWlsOgorICBiZmRfcmVsZWFzZSAoYWJmZCwgdGRhdGEpOworICBhYmZkLT5mbGFncyA9IG9mbGFnczsKKyAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IG9zdGFydDsKKyAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Cit9CisKKy8qIFR1cm4gYSBDT0ZGIGZpbGUgaW50byBhIEJGRCwgYnV0IGZhaWwgd2l0aCBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0IGlmIGl0IGlzCisgICBub3QgYSBDT0ZGIGZpbGUuICBUaGlzIGlzIGFsc28gdXNlZCBieSBFQ09GRi4gICovCisKK2NvbnN0IGJmZF90YXJnZXQgKgorY29mZl9vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICB1bnNpZ25lZCBpbnQgZmlsaHN6OworICB1bnNpZ25lZCBpbnQgYW91dHN6OworICBpbnQgbnNjbnM7CisgIFBUUiBmaWxlaGRyOworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOworICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOworCisgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggdG8gcmVhZCAqLworICBmaWxoc3ogPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOworICBhb3V0c3ogPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOworCisgIGZpbGVoZHIgPSBiZmRfYWxsb2MgKGFiZmQsIGZpbGhzeik7CisgIGlmIChmaWxlaGRyID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGlmIChiZmRfcmVhZCAoZmlsZWhkciwgMSwgZmlsaHN6LCBhYmZkKSAhPSBmaWxoc3opCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4gKGFiZmQsIGZpbGVoZHIsICZpbnRlcm5hbF9mKTsKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIGZpbGVoZHIpOworCisgIGlmIChiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsICZpbnRlcm5hbF9mKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgbnNjbnMgPSBpbnRlcm5hbF9mLmZfbnNjbnM7CisKKyAgaWYgKGludGVybmFsX2YuZl9vcHRoZHIpCisgICAgeworICAgICAgUFRSIG9wdGhkcjsKKworICAgICAgb3B0aGRyID0gYmZkX2FsbG9jIChhYmZkLCBhb3V0c3opOworICAgICAgaWYgKG9wdGhkciA9PSBOVUxMKQorCXJldHVybiAwOzsKKyAgICAgIGlmIChiZmRfcmVhZCAob3B0aGRyLCAxLCBpbnRlcm5hbF9mLmZfb3B0aGRyLCBhYmZkKQorCSAgIT0gaW50ZXJuYWxfZi5mX29wdGhkcikKKwl7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBiZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4gKGFiZmQsIG9wdGhkciwgKFBUUikgJmludGVybmFsX2EpOworICAgIH0KKworICByZXR1cm4gY29mZl9yZWFsX29iamVjdF9wIChhYmZkLCBuc2NucywgJmludGVybmFsX2YsCisJCQkgICAgIChpbnRlcm5hbF9mLmZfb3B0aGRyICE9IDAKKwkJCSAgICAgID8gJmludGVybmFsX2EKKwkJCSAgICAgIDogKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpKTsKK30KKworLyogR2V0IHRoZSBCRkQgc2VjdGlvbiBmcm9tIGEgQ09GRiBzeW1ib2wgc2VjdGlvbiBudW1iZXIuICAqLworCithc2VjdGlvbiAqCitjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIGluZGV4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBpbmRleDsKK3sKKyAgc3RydWN0IHNlYyAqYW5zd2VyID0gYWJmZC0+c2VjdGlvbnM7CisKKyAgaWYgKGluZGV4ID09IE5fQUJTKQorICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOworICBpZiAoaW5kZXggPT0gTl9VTkRFRikKKyAgICByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKyAgaWYgKGluZGV4ID09IE5fREVCVUcpCisgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7CisKKyAgd2hpbGUgKGFuc3dlcikKKyAgICB7CisgICAgICBpZiAoYW5zd2VyLT50YXJnZXRfaW5kZXggPT0gaW5kZXgpCisJcmV0dXJuIGFuc3dlcjsKKyAgICAgIGFuc3dlciA9IGFuc3dlci0+bmV4dDsKKyAgICB9CisKKyAgLyogV2Ugc2hvdWxkIG5vdCByZWFjaCB0aGlzIHBvaW50LCBidXQgdGhlIFNDTyAzLjJ2NCAvbGliL2xpYmNfcy5hCisgICAgIGhhcyBhIGJhZCBzeW1ib2wgdGFibGUgaW4gYmlnbGl0cG93Lm8uICAqLworICByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0cjsKK30KKworLyogR2V0IHRoZSB1cHBlciBib3VuZCBvZiBhIENPRkYgc3ltYm9sIHRhYmxlLiAgKi8KKworbG9uZworY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmICghYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSAqKSk7Cit9CisKKworLyogQ2Fub25pY2FsaXplIGEgQ09GRiBzeW1ib2wgdGFibGUuICAqLworCitsb25nCitjb2ZmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOworeworICB1bnNpZ25lZCBpbnQgY291bnRlcjsKKyAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKKyAgY29mZl9zeW1ib2xfdHlwZSAqKmxvY2F0aW9uID0gKGNvZmZfc3ltYm9sX3R5cGUgKiopIGFsb2NhdGlvbjsKKworICBpZiAoIWJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCisgICAgcmV0dXJuIC0xOworCisgIHN5bWJhc2UgPSBvYmpfc3ltYm9scyAoYWJmZCk7CisgIGNvdW50ZXIgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKKyAgd2hpbGUgKGNvdW50ZXItLSA+IDApCisgICAgKmxvY2F0aW9uKysgPSBzeW1iYXNlKys7CisKKyAgKmxvY2F0aW9uID0gTlVMTDsKKworICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Cit9CisKKy8qIEdldCB0aGUgbmFtZSBvZiBhIHN5bWJvbC4gIFRoZSBjYWxsZXIgbXVzdCBwYXNzIGluIGEgYnVmZmVyIG9mIHNpemUKKyAgID49IFNZTU5NTEVOICsgMS4gICovCisKK2NvbnN0IGNoYXIgKgorX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCBzeW0sIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07CisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgLyogRklYTUU6IEl0J3Mgbm90IGNsZWFyIHRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBpZiBzaXplb2YKKyAgICAgKF9uX3plcm9lcykgIT0gNC4gICovCisgIGlmIChzeW0tPl9uLl9uX24uX25femVyb2VzICE9IDAKKyAgICAgIHx8IHN5bS0+X24uX25fbi5fbl9vZmZzZXQgPT0gMCkKKyAgICB7CisgICAgICBtZW1jcHkgKGJ1Ziwgc3ltLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7CisgICAgICBidWZbU1lNTk1MRU5dID0gJ1wwJzsKKyAgICAgIHJldHVybiBidWY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgY2hhciAqc3RyaW5nczsKKworICAgICAgQkZEX0FTU0VSVCAoc3ltLT5fbi5fbl9uLl9uX29mZnNldCA+PSBTVFJJTkdfU0laRV9TSVpFKTsKKyAgICAgIHN0cmluZ3MgPSBvYmpfY29mZl9zdHJpbmdzIChhYmZkKTsKKyAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCisJeworCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7CisJICBpZiAoc3RyaW5ncyA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgICByZXR1cm4gc3RyaW5ncyArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7CisgICAgfQorfQorCisvKiBSZWFkIGluIGFuZCBzd2FwIHRoZSByZWxvY3MuICBUaGlzIHJldHVybnMgYSBidWZmZXIgaG9sZGluZyB0aGUKKyAgIHJlbG9jcyBmb3Igc2VjdGlvbiBTRUMgaW4gZmlsZSBBQkZELiAgSWYgQ0FDSEUgaXMgdHJ1ZSBhbmQKKyAgIElOVEVSTkFMX1JFTE9DUyBpcyBOVUxMLCB0aGUgcmVsb2NzIHJlYWQgaW4gd2lsbCBiZSBzYXZlZCBpbiBjYXNlCisgICB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGFnYWluLiAgSWYgRVhURVJOQUxfUkVMT0NTIGlzIG5vdCBOVUxMLCBpdAorICAgaXMgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHVuc3dhcHBlZCByZWxvY3MuICBJZgorICAgSU5URVJOQUxfUkVMT0NTIGlzIG5vdCBOVUxMLCBpdCBpcyBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZAorICAgdGhlIHN3YXBwZWQgcmVsb2NzLiAgSWYgUkVRVUlSRV9JTlRFUk5BTCBpcyB0cnVlLCB0aGVuIHRoZSByZXR1cm4KKyAgIHZhbHVlIG11c3QgYmUgSU5URVJOQUxfUkVMT0NTLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgTlVMTCBvbiBlcnJvci4gICovCisKK3N0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCitfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKKwkJCQlyZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYm9vbGVhbiBjYWNoZTsKKyAgICAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKKyAgICAgYm9vbGVhbiByZXF1aXJlX2ludGVybmFsOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKK3sKKyAgYmZkX3NpemVfdHlwZSByZWxzejsKKyAgYmZkX2J5dGUgKmZyZWVfZXh0ZXJuYWwgPSBOVUxMOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmZyZWVfaW50ZXJuYWwgPSBOVUxMOworICBiZmRfYnl0ZSAqZXJlbDsKKyAgYmZkX2J5dGUgKmVyZWxfZW5kOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7CisKKyAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKKyAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISByZXF1aXJlX2ludGVybmFsKQorCXJldHVybiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzOworICAgICAgbWVtY3B5IChpbnRlcm5hbF9yZWxvY3MsIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MsCisJICAgICAgc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7CisgICAgICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOworICAgIH0KKworICByZWxzeiA9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKKworICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCisgICAgeworICAgICAgZnJlZV9leHRlcm5hbCA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogcmVsc3opOworICAgICAgaWYgKGZyZWVfZXh0ZXJuYWwgPT0gTlVMTCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGV4dGVybmFsX3JlbG9jcyA9IGZyZWVfZXh0ZXJuYWw7CisgICAgfQorCisgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgc2VjLT5yZWxvY19jb3VudCwgYWJmZCkKKwkgICE9IHJlbHN6ICogc2VjLT5yZWxvY19jb3VudCkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWVfaW50ZXJuYWwgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQorCQkgICAgICAgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudAorCQkJCSAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7CisgICAgICBpZiAoZnJlZV9pbnRlcm5hbCA9PSBOVUxMICYmIHNlYy0+cmVsb2NfY291bnQgPiAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgaW50ZXJuYWxfcmVsb2NzID0gZnJlZV9pbnRlcm5hbDsKKyAgICB9CisKKyAgLyogU3dhcCBpbiB0aGUgcmVsb2NzLiAgKi8KKyAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKKyAgZXJlbF9lbmQgPSBlcmVsICsgcmVsc3ogKiBzZWMtPnJlbG9jX2NvdW50OworICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOworICBmb3IgKDsgZXJlbCA8IGVyZWxfZW5kOyBlcmVsICs9IHJlbHN6LCBpcmVsKyspCisgICAgYmZkX2NvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgZXJlbCwgKFBUUikgaXJlbCk7CisKKyAgaWYgKGZyZWVfZXh0ZXJuYWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmcmVlX2V4dGVybmFsKTsKKyAgICAgIGZyZWVfZXh0ZXJuYWwgPSBOVUxMOworICAgIH0KKworICBpZiAoY2FjaGUgJiYgZnJlZV9pbnRlcm5hbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQorCXsKKwkgIHNlYy0+dXNlZF9ieV9iZmQgPQorCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLAorCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7CisJICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IE5VTEw7CisJfQorICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGZyZWVfaW50ZXJuYWw7CisgICAgfQorCisgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChmcmVlX2V4dGVybmFsICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9leHRlcm5hbCk7CisgIGlmIChmcmVlX2ludGVybmFsICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9pbnRlcm5hbCk7CisgIHJldHVybiBOVUxMOworfQorCisvKiBTZXQgbGluZW5vX2NvdW50IGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zIG9mIGEgQ09GRiBmaWxlLiAgKi8KKworaW50Citjb2ZmX2NvdW50X2xpbmVudW1iZXJzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHVuc2lnbmVkIGludCBsaW1pdCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IHRvdGFsID0gMDsKKyAgYXN5bWJvbCAqKnA7CisgIGFzZWN0aW9uICpzOworCisgIGlmIChsaW1pdCA9PSAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgbWF5IGJlIGZyb20gdGhlIGJhY2tlbmQgbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAgICAgbGluZW5vX2NvdW50IGluIHRoZSBzZWN0aW9ucyBpcyBjb3JyZWN0LiAgKi8KKyAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXRvdGFsICs9IHMtPmxpbmVub19jb3VudDsKKyAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgQkZEX0FTU0VSVCAocy0+bGluZW5vX2NvdW50ID09IDApOworCisgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgcCsrKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnFfbWF5YmUgPSAqcDsKKworICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKHFfbWF5YmUpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorCXsKKwkgIGNvZmZfc3ltYm9sX3R5cGUgKnEgPSBjb2Zmc3ltYm9sIChxX21heWJlKTsKKworCSAgLyogVGhlIEFJWCA0LjEgY29tcGlsZXIgY2FuIHNvbWV0aW1lcyBnZW5lcmF0ZSBsaW5lIG51bWJlcnMKKyAgICAgICAgICAgICBhdHRhY2hlZCB0byBkZWJ1Z2dpbmcgc3ltYm9scy4gIFdlIHRyeSB0byBzaW1wbHkgaWdub3JlCisgICAgICAgICAgICAgdGhvc2UgaGVyZS4gICovCisJICBpZiAocS0+bGluZW5vICE9IE5VTEwKKwkgICAgICAmJiBxLT5zeW1ib2wuc2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBsaW5lIG51bWJlcnMuICBJbmNyZW1lbnQgdGhlIG93bmluZworCSAgICAgICAgIHNlY3Rpb24ncyBsaW5lbnVtYmVyIGNvdW50LiAgKi8KKwkgICAgICBhbGVudCAqbCA9IHEtPmxpbmVubzsKKworCSAgICAgICsrcS0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQ7CisJICAgICAgKyt0b3RhbDsKKwkgICAgICArK2w7CisJICAgICAgd2hpbGUgKGwtPmxpbmVfbnVtYmVyICE9IDApCisJCXsKKwkJICArK3RvdGFsOworCQkgICsrcS0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQ7CisJCSAgKytsOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0b3RhbDsKK30KKworLyogVGFrZXMgYSBiZmQgYW5kIGEgc3ltYm9sLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29mZiBzcGVjaWZpYworICAgYXJlYSBvZiB0aGUgc3ltYm9sIGlmIHRoZXJlIGlzIG9uZS4gICovCisKKy8qQVJHU1VTRUQqLworY29mZl9zeW1ib2xfdHlwZSAqCitjb2ZmX3N5bWJvbF9mcm9tIChpZ25vcmVfYWJmZCwgc3ltYm9sKQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7Cit7CisgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOworCisgIGlmIChiZmRfYXN5bWJvbF9iZmQgKHN5bWJvbCktPnRkYXRhLmNvZmZfb2JqX2RhdGEgPT0gKGNvZmZfZGF0YV90eXBlICopIE5VTEwpCisgICAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CisKKyAgcmV0dXJuIChjb2ZmX3N5bWJvbF90eXBlICopIHN5bWJvbDsKK30KKworc3RhdGljIHZvaWQKK2ZpeHVwX3N5bWJvbF92YWx1ZSAoYWJmZCwgY29mZl9zeW1ib2xfcHRyLCBzeW1lbnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1lbnQ7Cit7CisKKyAgLyogTm9ybWFsaXplIHRoZSBzeW1ib2wgZmxhZ3MgKi8KKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCisgICAgeworICAgICAgLyogYSBjb21tb24gc3ltYm9sIGlzIHVuZGVmaW5lZCB3aXRoIGEgdmFsdWUgKi8KKyAgICAgIHN5bWVudC0+bl9zY251bSA9IE5fVU5ERUY7CisgICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLmZsYWdzICYgQlNGX0RFQlVHR0lORykKKyAgICB7CisgICAgICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbikpCisgICAgeworICAgICAgc3ltZW50LT5uX3NjbnVtID0gTl9VTkRFRjsKKyAgICAgIHN5bWVudC0+bl92YWx1ZSA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24pCisJeworCSAgc3ltZW50LT5uX3NjbnVtID0KKwkgICAgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKworCSAgc3ltZW50LT5uX3ZhbHVlID0gKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnZhbHVlCisJCQkgICAgICsgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJICBpZiAoISBvYmpfcGUgKGFiZmQpKQorCSAgICBzeW1lbnQtPm5fdmFsdWUgKz0KKwkgICAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBCRkRfQVNTRVJUICgwKTsKKwkgIC8qIFRoaXMgY2FuIGhhcHBlbiwgYnV0IEkgZG9uJ3Qga25vdyB3aHkgeWV0IChzdGV2ZUBjeWdudXMuY29tKSAqLworCSAgc3ltZW50LT5uX3NjbnVtID0gTl9BQlM7CisJICBzeW1lbnQtPm5fdmFsdWUgPSBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZTsKKwl9CisgICAgfQorfQorCisvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZSBhbmQgd29yayBvdXQgd2hhdAorICAgdGhlaXIgaW5kZXhlcyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgd2lsbCBiZSB3aGVuIG91dHB1dC4KKworICAgQ29mZiByZXF1aXJlcyB0aGF0IGVhY2ggQ19GSUxFIHN5bWJvbCBwb2ludHMgdG8gdGhlIG5leHQgb25lIGluIHRoZQorICAgY2hhaW4sIGFuZCB0aGF0IHRoZSBsYXN0IG9uZSBwb2ludHMgdG8gdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbC4gV2UKKyAgIGRvIHRoYXQgaGVyZSB0b28uICAqLworCitib29sZWFuCitjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgKGJmZF9wdHIsIGZpcnN0X3VuZGVmKQorICAgICBiZmQgKmJmZF9wdHI7CisgICAgIGludCAqZmlyc3RfdW5kZWY7Cit7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChiZmRfcHRyKTsKKyAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKKyAgdW5zaWduZWQgaW50IG5hdGl2ZV9pbmRleCA9IDA7CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmxhc3RfZmlsZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopIE5VTEw7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfaW5kZXg7CisKKyAgLyogQ09GRiBkZW1hbmRzIHRoYXQgdW5kZWZpbmVkIHN5bWJvbHMgY29tZSBhZnRlciBhbGwgb3RoZXIgc3ltYm9scy4KKyAgICAgU2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBpbXBvc2UgdGhpcyBleHRyYSBrbm93bGVkZ2Ugb24gYWxsIG91cgorICAgICBjbGllbnQgcHJvZ3JhbXMsIGRlYWwgd2l0aCB0aGF0IGhlcmUuICBTb3J0IHRoZSBzeW1ib2wgdGFibGU7CisgICAgIGp1c3QgbW92ZSB0aGUgdW5kZWZpbmVkIHN5bWJvbHMgdG8gdGhlIGVuZCwgbGVhdmluZyB0aGUgcmVzdAorICAgICBhbG9uZS4gIFRoZSBPJ1JlaWxseSBib29rIHNheXMgdGhhdCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzIGNvbWUKKyAgICAgYXQgdGhlIGVuZCBiZWZvcmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzLCBzbyB3ZSBkbyB0aGF0IGhlcmUgYXMKKyAgICAgd2VsbC4gICovCisgIC8qIEBAIERvIHdlIGhhdmUgc29tZSBjb25kaXRpb24gd2UgY291bGQgdGVzdCBmb3IsIHNvIHdlIGRvbid0IGFsd2F5cworICAgICBoYXZlIHRvIGRvIHRoaXM/ICBJIGRvbid0IHRoaW5rIHJlbG9jYXRhYmlsaXR5IGlzIHF1aXRlIHJpZ2h0LCBidXQKKyAgICAgSSdtIG5vdCBjZXJ0YWluLiAgW3JhZWJ1cm46MTk5MjA1MDguMTcxMUVTVF0gICovCisgIHsKKyAgICBhc3ltYm9sICoqbmV3c3ltczsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIG5ld3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChiZmRfcHRyLAorCQkJCSAgICAgIHNpemVvZiAoYXN5bWJvbCAqKSAqIChzeW1ib2xfY291bnQgKyAxKSk7CisgICAgaWYgKCFuZXdzeW1zKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGJmZF9wdHItPm91dHN5bWJvbHMgPSBuZXdzeW1zOworICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKKyAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpICE9IDAKKwkgIHx8ICghYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKKwkgICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKKwkgICAgICAmJiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMAorCQkgIHx8ICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpCisJCSAgICAgID09IDApKSkpCisJKm5ld3N5bXMrKyA9IHN5bWJvbF9wdHJfcHRyW2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQorICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgPT0gMAorCSAgJiYgIWJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCisJICAmJiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikKKwkgICAgICB8fCAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAorCQkgICYmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpCisJCSAgICAgICE9IDApKSkpCisJKm5ld3N5bXMrKyA9IHN5bWJvbF9wdHJfcHRyW2ldOworCisgICAgKmZpcnN0X3VuZGVmID0gbmV3c3ltcyAtIGJmZF9wdHItPm91dHN5bWJvbHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCisgICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSA9PSAwCisJICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKSkKKwkqbmV3c3ltcysrID0gc3ltYm9sX3B0cl9wdHJbaV07CisgICAgKm5ld3N5bXMgPSAoYXN5bWJvbCAqKSBOVUxMOworICAgIHN5bWJvbF9wdHJfcHRyID0gYmZkX3B0ci0+b3V0c3ltYm9sczsKKyAgfQorCisgIGZvciAoc3ltYm9sX2luZGV4ID0gMDsgc3ltYm9sX2luZGV4IDwgc3ltYm9sX2NvdW50OyBzeW1ib2xfaW5kZXgrKykKKyAgICB7CisgICAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2ZmX3N5bWJvbF9wdHIgPSBjb2ZmX3N5bWJvbF9mcm9tIChiZmRfcHRyLCBzeW1ib2xfcHRyX3B0cltzeW1ib2xfaW5kZXhdKTsKKyAgICAgIHN5bWJvbF9wdHJfcHRyW3N5bWJvbF9pbmRleF0tPnVkYXRhLmkgPSBzeW1ib2xfaW5kZXg7IAorICAgICAgaWYgKGNvZmZfc3ltYm9sX3B0ciAmJiBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZSkKKwl7CisJICBjb21iaW5lZF9lbnRyeV90eXBlICpzID0gY29mZl9zeW1ib2xfcHRyLT5uYXRpdmU7CisJICBpbnQgaTsKKworCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKKwkgICAgeworCSAgICAgIGlmIChsYXN0X2ZpbGUgIT0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikgTlVMTCkKKwkJbGFzdF9maWxlLT5uX3ZhbHVlID0gbmF0aXZlX2luZGV4OworCSAgICAgIGxhc3RfZmlsZSA9ICYocy0+dS5zeW1lbnQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKworCSAgICAgIC8qIE1vZGlmeSB0aGUgc3ltYm9sIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlaXIgc2VjdGlvbiBhbmQKKwkgICAgICAgICB0eXBlICovCisKKwkgICAgICBmaXh1cF9zeW1ib2xfdmFsdWUgKGJmZF9wdHIsIGNvZmZfc3ltYm9sX3B0ciwgJihzLT51LnN5bWVudCkpOworCSAgICB9CisJICBmb3IgKGkgPSAwOyBpIDwgcy0+dS5zeW1lbnQubl9udW1hdXggKyAxOyBpKyspCisJICAgIHNbaV0ub2Zmc2V0ID0gbmF0aXZlX2luZGV4Kys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5hdGl2ZV9pbmRleCsrOworCX0KKyAgICB9CisgIG9ial9jb252X3RhYmxlX3NpemUgKGJmZF9wdHIpID0gbmF0aXZlX2luZGV4OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBSdW4gdGhvcm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhZ2FpbiwgYW5kIGZpeCBpdCBzbyB0aGF0IGFsbAorICAgcG9pbnRlcnMgdG8gZW50cmllcyBhcmUgY2hhbmdlZCB0byB0aGUgZW50cmllcycgaW5kZXggaW4gdGhlIG91dHB1dAorICAgc3ltYm9sIHRhYmxlLiAgKi8KKwordm9pZAorY29mZl9tYW5nbGVfc3ltYm9scyAoYmZkX3B0cikKKyAgICAgYmZkICpiZmRfcHRyOworeworICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYmZkX3B0cik7CisgIGFzeW1ib2wgKipzeW1ib2xfcHRyX3B0ciA9IGJmZF9wdHItPm91dHN5bWJvbHM7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfaW5kZXg7CisKKyAgZm9yIChzeW1ib2xfaW5kZXggPSAwOyBzeW1ib2xfaW5kZXggPCBzeW1ib2xfY291bnQ7IHN5bWJvbF9pbmRleCsrKQorICAgIHsKKyAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0ciA9CisgICAgICBjb2ZmX3N5bWJvbF9mcm9tIChiZmRfcHRyLCBzeW1ib2xfcHRyX3B0cltzeW1ib2xfaW5kZXhdKTsKKworICAgICAgaWYgKGNvZmZfc3ltYm9sX3B0ciAmJiBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZSkKKwl7CisJICBpbnQgaTsKKwkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmX3N5bWJvbF9wdHItPm5hdGl2ZTsKKworCSAgaWYgKHMtPmZpeF92YWx1ZSkKKwkgICAgeworCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgdXNlIGEgdW5pb24gaGVyZS4gICovCisJICAgICAgcy0+dS5zeW1lbnQubl92YWx1ZSA9CisJCSgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBzLT51LnN5bWVudC5uX3ZhbHVlKS0+b2Zmc2V0OworCSAgICAgIHMtPmZpeF92YWx1ZSA9IDA7CisJICAgIH0KKwkgIGlmIChzLT5maXhfbGluZSkKKwkgICAgeworCSAgICAgIC8qIFRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgZm9yIHRoZSBzeW1ib2wncyBzZWN0aW9uLiAgT24gb3V0cHV0LCB0aGUgc3ltYm9sJ3MKKyAgICAgICAgICAgICAgICAgc2VjdGlvbiBzaG91bGQgYmUgTl9ERUJVRy4gICovCisJICAgICAgcy0+dS5zeW1lbnQubl92YWx1ZSA9CisJCShjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCisJCSArIHMtPnUuc3ltZW50Lm5fdmFsdWUgKiBiZmRfY29mZl9saW5lc3ogKGJmZF9wdHIpKTsKKwkgICAgICBjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uID0KKwkJY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChiZmRfcHRyLCBOX0RFQlVHKTsKKwkgICAgICBCRkRfQVNTRVJUIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5mbGFncyAmIEJTRl9ERUJVR0dJTkcpOworCSAgICB9CisJICBmb3IgKGkgPSAwOyBpIDwgcy0+dS5zeW1lbnQubl9udW1hdXg7IGkrKykKKwkgICAgeworCSAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmEgPSBzICsgaSArIDE7CisJICAgICAgaWYgKGEtPmZpeF90YWcpCisJCXsKKwkJICBhLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sID0KKwkJICAgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAtPm9mZnNldDsKKwkJICBhLT5maXhfdGFnID0gMDsKKwkJfQorCSAgICAgIGlmIChhLT5maXhfZW5kKQorCQl7CisJCSAgYS0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9CisJCSAgICBhLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wLT5vZmZzZXQ7CisJCSAgYS0+Zml4X2VuZCA9IDA7CisJCX0KKwkgICAgICBpZiAoYS0+Zml4X3NjbmxlbikKKwkJeworCQkgIGEtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCA9CisJCSAgICBhLT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLnAtPm9mZnNldDsKKwkJICBhLT5maXhfc2NubGVuID0gMDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NvZmZfZml4X3N5bWJvbF9uYW1lIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgc3RyaW5nX3NpemVfcCwKKwkJICAgICAgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKKyAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKKyAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOworICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOworeworICB1bnNpZ25lZCBpbnQgbmFtZV9sZW5ndGg7CisgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4ZW50OworICBjaGFyICpuYW1lID0gKGNoYXIgKikgKHN5bWJvbC0+bmFtZSk7CisKKyAgaWYgKG5hbWUgPT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBjb2ZmIHN5bWJvbHMgYWx3YXlzIGhhdmUgbmFtZXMsIHNvIHdlJ2xsIG1ha2Ugb25lIHVwICovCisgICAgICBzeW1ib2wtPm5hbWUgPSAic3RyYW5nZSI7CisgICAgICBuYW1lID0gKGNoYXIgKikgc3ltYm9sLT5uYW1lOworICAgIH0KKyAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpOworCisgIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRQorICAgICAgJiYgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA+IDApCisgICAgeworICAgICAgc3RybmNweSAobmF0aXZlLT51LnN5bWVudC5fbi5fbl9uYW1lLCAiLmZpbGUiLCBTWU1OTUxFTik7CisgICAgICBhdXhlbnQgPSAmKG5hdGl2ZSArIDEpLT51LmF1eGVudDsKKworICAgICAgaWYgKGJmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzIChhYmZkKSkKKwl7CisJICBpZiAobmFtZV9sZW5ndGggPD0gRklMTk1MRU4pCisJICAgIHsKKwkgICAgICBzdHJuY3B5IChhdXhlbnQtPnhfZmlsZS54X2ZuYW1lLCBuYW1lLCBGSUxOTUxFTik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGF1eGVudC0+eF9maWxlLnhfbi54X29mZnNldCA9ICpzdHJpbmdfc2l6ZV9wICsgU1RSSU5HX1NJWkVfU0laRTsKKwkgICAgICBhdXhlbnQtPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOworCSAgICAgICpzdHJpbmdfc2l6ZV9wICs9IG5hbWVfbGVuZ3RoICsgMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdHJuY3B5IChhdXhlbnQtPnhfZmlsZS54X2ZuYW1lLCBuYW1lLCBGSUxOTUxFTik7CisJICBpZiAobmFtZV9sZW5ndGggPiBGSUxOTUxFTikKKwkgICAgeworCSAgICAgIG5hbWVbRklMTk1MRU5dID0gJ1wwJzsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobmFtZV9sZW5ndGggPD0gU1lNTk1MRU4pCisJeworCSAgLyogVGhpcyBuYW1lIHdpbGwgZml0IGludG8gdGhlIHN5bWJvbCBuZWF0bHkgKi8KKwkgIHN0cm5jcHkgKG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbmFtZSwgc3ltYm9sLT5uYW1lLCBTWU1OTUxFTik7CisJfQorICAgICAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZuYXRpdmUtPnUuc3ltZW50KSkKKwl7CisJICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKCpzdHJpbmdfc2l6ZV9wCisJCQkJCQkrIFNUUklOR19TSVpFX1NJWkUpOworCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7CisJICAqc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxvbmcgZmlsZXBvczsKKwkgIGJmZF9ieXRlIGJ1ZlsyXTsKKworCSAgLyogVGhpcyBuYW1lIHNob3VsZCBiZSB3cml0dGVuIGludG8gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgRm9yCisJICAgICBzb21lIHJlYXNvbiBlYWNoIG5hbWUgaXMgcHJlY2VkZWQgYnkgYSB0d28gYnl0ZSBsZW5ndGgKKwkgICAgIGFuZCBhbHNvIGZvbGxvd2VkIGJ5IGEgbnVsbCBieXRlLiAgRklYTUU6IFdlIGFzc3VtZSB0aGF0CisJICAgICB0aGUgLmRlYnVnIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBhbmQgdGhhdCBpdAorCSAgICAgaXMgbGFyZ2UgZW5vdWdoLiAgKi8KKwkgIGlmICgqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKwkgICAgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOworCSAgZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKKwkgIGJmZF9wdXRfMTYgKGFiZmQsIG5hbWVfbGVuZ3RoICsgMSwgYnVmKTsKKwkgIGlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAorCQkJCQkgKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCisJCQkJCSAoUFRSKSBidWYsCisJCQkJCSAoZmlsZV9wdHIpICpkZWJ1Z19zdHJpbmdfc2l6ZV9wLAorCQkJCQkgKGJmZF9zaXplX3R5cGUpIDIpCisJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKKwkJCQkJICAgICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAorCQkJCQkgICAgKFBUUikgc3ltYm9sLT5uYW1lLAorCQkJCQkgICAgKChmaWxlX3B0cikgKmRlYnVnX3N0cmluZ19zaXplX3AKKwkJCQkJICAgICArIDIpLAorCQkJCQkgICAgKGJmZF9zaXplX3R5cGUpIG5hbWVfbGVuZ3RoICsgMSkpCisJICAgIGFib3J0ICgpOworCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKKwkgICAgYWJvcnQgKCk7CisJICBuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKmRlYnVnX3N0cmluZ19zaXplX3AgKyAyOworCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcyA9IDA7CisJICAqZGVidWdfc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDM7CisJfQorICAgIH0KK30KKworLyogV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzeW1ib2wgaW5kZXggc28gdGhhdCB3aGVuIHdlIHdyaXRlIG91dAorICAgdGhlIHJlbG9jcyB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBmb3IgYSBzeW1ib2wuICBUaGlzIG1ldGhvZCBpcyBhCisgICBoYWNrLiAgRklYTUUuICAqLworCisjZGVmaW5lIHNldF9pbmRleChzeW1ib2wsIGlkeCkJKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCisKKy8qIFdyaXRlIGEgc3ltYm9sIG91dCB0byBhIENPRkYgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCisJCSAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7CisgICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKKyAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKKyAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOworICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOworeworICB1bnNpZ25lZCBpbnQgbnVtYXV4ID0gbmF0aXZlLT51LnN5bWVudC5uX251bWF1eDsKKyAgaW50IHR5cGUgPSBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZTsKKyAgaW50IGNsYXNzID0gbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKKyAgUFRSIGJ1ZjsKKyAgYmZkX3NpemVfdHlwZSBzeW1lc3o7CisKKyAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQorICAgIHN5bWJvbC0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKKworICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcKKyAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICB7CisgICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX0RFQlVHOworICAgIH0KKyAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fQUJTOworICAgIH0KKyAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0KKwlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgfQorCisgIGNvZmZfZml4X3N5bWJvbF9uYW1lIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgc3RyaW5nX3NpemVfcCwKKwkJCWRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisgIGJ1ZiA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltZXN6KTsKKyAgaWYgKCFidWYpCisgICAgcmV0dXJuIGZhbHNlOworICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZuYXRpdmUtPnUuc3ltZW50LCBidWYpOworICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIHN5bWVzeiwgYWJmZCkgIT0gc3ltZXN6KQorICAgIHJldHVybiBmYWxzZTsKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1Zik7CisKKyAgaWYgKG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgYXV4ZXN6OworICAgICAgdW5zaWduZWQgaW50IGo7CisKKyAgICAgIGF1eGVzeiA9IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCk7CisgICAgICBidWYgPSBiZmRfYWxsb2MgKGFiZmQsIGF1eGVzeik7CisgICAgICBpZiAoIWJ1ZikKKwlyZXR1cm4gZmFsc2U7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eDsgaisrKQorCXsKKwkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwKKwkJCQkgJigobmF0aXZlICsgaiArIDEpLT51LmF1eGVudCksCisJCQkJIHR5cGUsCisJCQkJIGNsYXNzLAorCQkJCSBqLAorCQkJCSBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4LAorCQkJCSBidWYpOworCSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCBhdXhlc3osIGFiZmQpICE9IGF1eGVzeikKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBidWYpOworICAgIH0KKworICAvKiBTdG9yZSB0aGUgaW5kZXggZm9yIHVzZSB3aGVuIHdlIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KKyAgc2V0X2luZGV4IChzeW1ib2wsICp3cml0dGVuKTsKKworICAqd3JpdHRlbiArPSBudW1hdXggKyAxOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IGEgc3ltYm9sIHRvIGEgQ09GRiBmaWxlIHRoYXQgZG9lcyBub3QgY29tZSBmcm9tIGEgQ09GRgorICAgZmlsZSBvcmlnaW5hbGx5LiAgVGhpcyBzeW1ib2wgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIsCisgICBvciB3ZSBtYXkgYmUgbGlua2luZyBhIG5vbiBDT0ZGIGZpbGUgdG8gYSBDT0ZGIGZpbGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl93cml0ZV9hbGllbl9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKKwkJCSBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOworICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOworICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7CisgICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Cit7CisgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKKyAgY29tYmluZWRfZW50cnlfdHlwZSBkdW1teTsKKworICBuYXRpdmUgPSAmZHVtbXk7CisgIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gVF9OVUxMOworICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSAwOworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7CisgICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7CisgICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCisgICAgeworICAgICAgLyogVGhlcmUgaXNuJ3QgbXVjaCBwb2ludCB0byB3cml0aW5nIG91dCBhIGRlYnVnZ2luZyBzeW1ib2wKKyAgICAgICAgIHVubGVzcyB3ZSBhcmUgcHJlcGFyZWQgdG8gY29udmVydCBpdCBpbnRvIENPRkYgZGVidWdnaW5nCisgICAgICAgICBmb3JtYXQuICBTbywgd2UganVzdCBpZ25vcmUgdGhlbS4gIFdlIG11c3QgY2xvYmJlciB0aGUgc3ltYm9sCisgICAgICAgICBuYW1lIHRvIGtlZXAgaXQgZnJvbSBiZWluZyBwdXQgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCisgICAgICBzeW1ib2wtPm5hbWUgPSAiIjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9CisJc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gKHN5bWJvbC0+dmFsdWUKKwkJCQkgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIGlmICghIG9ial9wZSAoYWJmZCkpCisJbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKworICAgICAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCisgICAgICAgICBGSVhNRTogV2h5PyAgKi8KKyAgICAgIHsKKwljb2ZmX3N5bWJvbF90eXBlICpjID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKKwlpZiAoYyAhPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQorCSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gYmZkX2FzeW1ib2xfYmZkICgmYy0+c3ltYm9sKS0+ZmxhZ3M7CisgICAgICB9CisgICAgfQorCisgIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlID0gMDsKKyAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCisgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfU1RBVDsKKyAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKQorICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBvYmpfcGUgKGFiZmQpID8gQ19OVF9XRUFLIDogQ19XRUFLRVhUOworICBlbHNlCisgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IENfRVhUOworICBuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID0gMDsKKworICByZXR1cm4gY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAorCQkJICAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApOworfQorCisvKiBXcml0ZSBhIG5hdGl2ZSBzeW1ib2wgdG8gYSBDT0ZGIGZpbGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCisJCQkgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYm9sOworICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47CisgICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7CisgICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKKyAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKK3sKKyAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlID0gc3ltYm9sLT5uYXRpdmU7CisgIGFsZW50ICpsaW5lbm8gPSBzeW1ib2wtPmxpbmVubzsKKworICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYW4gYXNzb2NpYXRlZCBsaW5lIG51bWJlciwgd2UgbXVzdCBzdG9yZSB0aGUKKyAgICAgc3ltYm9sIGluZGV4IGluIHRoZSBsaW5lIG51bWJlciBmaWVsZC4gIFdlIGFsc28gdGFnIHRoZSBhdXhlbnQgdG8KKyAgICAgcG9pbnQgdG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBsaW5lbm8gdGFibGUuICAqLworICBpZiAobGluZW5vICYmICFzeW1ib2wtPmRvbmVfbGluZW5vICYmIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKyAgICAgIGxpbmVub1tjb3VudF0udS5vZmZzZXQgPSAqd3JpdHRlbjsKKyAgICAgIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4KQorCXsKKwkgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYSA9ICYoKG5hdGl2ZSArIDEpLT51LmF1eGVudCk7CisKKwkgIGEtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9CisJICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5tb3ZpbmdfbGluZV9maWxlcG9zOworCX0KKworICAgICAgLyogQ291bnQgYW5kIHJlbG9jYXRlIGFsbCBvdGhlciBsaW5lbnVtYmVycy4gICovCisgICAgICBjb3VudCsrOworICAgICAgd2hpbGUgKGxpbmVub1tjb3VudF0ubGluZV9udW1iZXIgIT0gMCkKKwl7CisjaWYgMAorCSAgLyogMTMgYXByaWwgOTIuIHNhYyAKKwkgICAgIEkndmUgYmVlbiB0b2xkIHRoaXMsIGJ1dCBzdGlsbCBuZWVkIHByb29mOgorCSAgICAgPiBUaGUgc2Vjb25kIGJ1ZyBpcyBhbHNvIGluIGBiZmQvY29mZmNvZGUuaCcuICBUaGlzIGJ1ZworCSAgICAgPiBjYXVzZXMgdGhlIGxpbmtlciB0byBzY3JldyB1cCB0aGUgcGMtcmVsb2NhdGlvbnMgZm9yCisJICAgICA+IGFsbCB0aGUgbGluZSBudW1iZXJzIGluIENPRkYgY29kZS4gIFRoaXMgYnVnIGlzbid0IG9ubHkKKwkgICAgID4gc3BlY2lmaWMgdG8gQTI5SyBpbXBsZW1lbnRhdGlvbnMsIGJ1dCBhZmZlY3RzIGFsbAorCSAgICAgPiBzeXN0ZW1zIHVzaW5nIENPRkYgZm9ybWF0IGJpbmFyaWVzLiAgTm90ZSB0aGF0IGluIENPRkYKKwkgICAgID4gb2JqZWN0IGZpbGVzLCB0aGUgbGluZSBudW1iZXIgY29yZSBvZmZzZXRzIG91dHB1dCBieQorCSAgICAgPiB0aGUgYXNzZW1ibGVyIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgZWFjaAorCSAgICAgPiBwcm9jZWR1cmUsIG5vdCB0byB0aGUgc3RhcnQgb2YgdGhlIC50ZXh0IHNlY3Rpb24uICBUaGlzCisJICAgICA+IHBhdGNoIHJlbG9jYXRlcyB0aGUgbGluZSBudW1iZXJzIHJlbGF0aXZlIHRvIHRoZQorCSAgICAgPiBgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlJyBpbnN0ZWFkIG9mIHRoZSBzZWN0aW9uCisJICAgICA+IHZpcnR1YWwgYWRkcmVzcy4KKwkgICAgID4gbW9kdWxhciFvbHNvbkBjcy5hcml6b25hLmVkdSAoSm9uIE9sc29uKQorCSAgICovCisJICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ICs9IG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZTsKKyNlbHNlCisJICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ICs9CisJICAgIChzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJICAgICArIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworI2VuZGlmCisJICBjb3VudCsrOworCX0KKyAgICAgIHN5bWJvbC0+ZG9uZV9saW5lbm8gPSB0cnVlOworCisgICAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bW92aW5nX2xpbmVfZmlsZXBvcyArPQorCWNvdW50ICogYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKKyAgICB9CisKKyAgcmV0dXJuIGNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCAmKHN5bWJvbC0+c3ltYm9sKSwgbmF0aXZlLCB3cml0dGVuLAorCQkJICAgIHN0cmluZ19zaXplX3AsIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCisJCQkgICAgZGVidWdfc3RyaW5nX3NpemVfcCk7Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgQ09GRiBzeW1ib2xzLiAgKi8KKworYm9vbGVhbgorY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9zaXplX3R5cGUgc3RyaW5nX3NpemU7CisgIGFzZWN0aW9uICpkZWJ1Z19zdHJpbmdfc2VjdGlvbjsKKyAgYmZkX3NpemVfdHlwZSBkZWJ1Z19zdHJpbmdfc2l6ZTsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBsaW1pdCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgd3JpdHRlbiA9IDA7CisgIGFzeW1ib2wgKipwOworCisgIHN0cmluZ19zaXplID0gMDsKKyAgZGVidWdfc3RyaW5nX3NlY3Rpb24gPSBOVUxMOworICBkZWJ1Z19zdHJpbmdfc2l6ZSA9IDA7CisKKyAgLyogSWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLCB0aGV5IG11c3QgYmUgcHV0IGludG8KKyAgICAgdGhlIHN0cmluZyB0YWJsZS4gIFRoaXMgaXMgc3VwcG9ydGVkIGJ5IFBFLiAgVGhpcyBjb2RlIG11c3QKKyAgICAgaGFuZGxlIHNlY3Rpb24gbmFtZXMganVzdCBhcyB0aGV5IGFyZSBoYW5kbGVkIGluCisgICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgKi8KKyAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkpCisgICAgeworICAgICAgYXNlY3Rpb24gKm87CisKKyAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorCXsKKwkgIHNpemVfdCBsZW47CisKKwkgIGxlbiA9IHN0cmxlbiAoby0+bmFtZSk7CisJICBpZiAobGVuID4gU0NOTk1MRU4pCisJICAgIHN0cmluZ19zaXplICs9IGxlbiArIDE7CisJfQorICAgIH0KKworICAvKiBTZWVrIHRvIHRoZSByaWdodCBwbGFjZSAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBPdXRwdXQgYWxsIHRoZSBzeW1ib2xzIHdlIGhhdmUgKi8KKworICB3cml0dGVuID0gMDsKKyAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBwKyspCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltYm9sID0gKnA7CisgICAgICBjb2ZmX3N5bWJvbF90eXBlICpjX3N5bWJvbCA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7CisKKyAgICAgIGlmIChjX3N5bWJvbCA9PSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMCisJICB8fCBjX3N5bWJvbC0+bmF0aXZlID09IChjb21iaW5lZF9lbnRyeV90eXBlICopIE5VTEwpCisJeworCSAgaWYgKCFjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCAmd3JpdHRlbiwgJnN0cmluZ19zaXplLAorCQkJCQkmZGVidWdfc3RyaW5nX3NlY3Rpb24sCisJCQkJCSZkZWJ1Z19zdHJpbmdfc2l6ZSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCFjb2ZmX3dyaXRlX25hdGl2ZV9zeW1ib2wgKGFiZmQsIGNfc3ltYm9sLCAmd3JpdHRlbiwKKwkJCQkJICZzdHJpbmdfc2l6ZSwgJmRlYnVnX3N0cmluZ19zZWN0aW9uLAorCQkJCQkgJmRlYnVnX3N0cmluZ19zaXplKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gd3JpdHRlbjsKKworICAvKiBOb3cgd3JpdGUgb3V0IHN0cmluZ3MgKi8KKworICBpZiAoc3RyaW5nX3NpemUgIT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IHN0cmluZ19zaXplICsgU1RSSU5HX1NJWkVfU0laRTsKKyAgICAgIGJmZF9ieXRlIGJ1ZmZlcltTVFJJTkdfU0laRV9TSVpFXTsKKworI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAorICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzaXplLCBidWZmZXIpOworI2Vsc2UKKyAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgorI2VuZGlmCisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCkgIT0gc2l6ZW9mIChidWZmZXIpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4gIFRoaXMgY29kZSBtdXN0IGhhbmRsZSBzZWN0aW9uCisJIG5hbWVzIGp1c3QgYXMgdGhleSBhcmUgaGFuZGxlZCBpbiBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4gICovCisgICAgICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKSkKKwl7CisJICBhc2VjdGlvbiAqbzsKKworCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJICAgIHsKKwkgICAgICBzaXplX3QgbGVuOworCisJICAgICAgbGVuID0gc3RybGVuIChvLT5uYW1lKTsKKwkgICAgICBpZiAobGVuID4gU0NOTk1MRU4pCisJCXsKKwkJICBpZiAoYmZkX3dyaXRlIChvLT5uYW1lLCAxLCBsZW4gKyAxLCBhYmZkKSAhPSBsZW4gKyAxKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOworCSAgIGkgPCBsaW1pdDsKKwkgICBpKyssIHArKykKKwl7CisJICBhc3ltYm9sICpxID0gKnA7CisJICBzaXplX3QgbmFtZV9sZW5ndGggPSBzdHJsZW4gKHEtPm5hbWUpOworCSAgY29mZl9zeW1ib2xfdHlwZSAqY19zeW1ib2wgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBxKTsKKwkgIHNpemVfdCBtYXhsZW47CisKKwkgIC8qIEZpZ3VyZSBvdXQgd2hldGhlciB0aGUgc3ltYm9sIG5hbWUgc2hvdWxkIGdvIGluIHRoZSBzdHJpbmcKKwkgICAgIHRhYmxlLiAgU3ltYm9sIG5hbWVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhcmUgc3RvcmVkCisJICAgICBkaXJlY3RseSBpbiB0aGUgc3ltZW50IHN0cnVjdHVyZS4gIEZpbGUgbmFtZXMgcGVybWl0IGEKKwkgICAgIGRpZmZlcmVudCwgbG9uZ2VyLCBsZW5ndGggaW4gdGhlIHN5bWVudCBzdHJ1Y3R1cmUuICBPbgorCSAgICAgWENPRkYsIHNvbWUgc3ltYm9sIG5hbWVzIGFyZSBzdG9yZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCisJICAgICByYXRoZXIgdGhhbiBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKworCSAgaWYgKGNfc3ltYm9sID09IE5VTEwKKwkgICAgICB8fCBjX3N5bWJvbC0+bmF0aXZlID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIG5vdCBhIENPRkYgc3ltYm9sLCBzbyBpdCBjZXJ0YWlubHkgaXMgbm90IGEKKwkgICAgICAgICBmaWxlIG5hbWUsIG5vciBkb2VzIGl0IGdvIGluIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCisJICAgICAgbWF4bGVuID0gU1lNTk1MRU47CisJICAgIH0KKwkgIGVsc2UgaWYgKGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsCisJCQkJCSAgICAgICZjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudCkpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBYQ09GRiAuZGVidWcgc2VjdGlvbi4KKwkgICAgICAgICBEb24ndCB3cml0ZSBpdCBpbnRvIHRoZSBzdHJpbmcgdGFibGUuICAqLworCSAgICAgIG1heGxlbiA9IG5hbWVfbGVuZ3RoOworCSAgICB9CisJICBlbHNlIGlmIChjX3N5bWJvbC0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKKwkJICAgJiYgY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQorCSAgICBtYXhsZW4gPSBGSUxOTUxFTjsKKwkgIGVsc2UKKwkgICAgbWF4bGVuID0gU1lNTk1MRU47CisKKwkgIGlmIChuYW1lX2xlbmd0aCA+IG1heGxlbikKKwkgICAgeworCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChxLT5uYW1lKSwgMSwgbmFtZV9sZW5ndGggKyAxLCBhYmZkKQorCQkgICE9IG5hbWVfbGVuZ3RoICsgMSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG5vdCB3cml0ZSBhbnl0aGluZyBoZXJlLCBidXQgd2UnbGwgd3JpdGUKKyAgICAgICAgIG91dCA0IHNvIHRoYXQgYW55IHN0dXBpZCBjb2ZmIHJlYWRlciB3aGljaCB0cmllcyB0byByZWFkIHRoZQorICAgICAgICAgc3RyaW5nIHRhYmxlIGV2ZW4gd2hlbiB0aGVyZSBpc24ndCBvbmUgd29uJ3QgY3JvYWsuICAqLworICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBTVFJJTkdfU0laRV9TSVpFOworICAgICAgYmZkX2J5dGUgYnVmZmVyW1NUUklOR19TSVpFX1NJWkVdOworCisjaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0CisgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNpemUsIGJ1ZmZlcik7CisjZWxzZQorICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCisjZW5kaWYKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgU1RSSU5HX1NJWkVfU0laRSwgYWJmZCkKKwkgICE9IFNUUklOR19TSVpFX1NJWkUpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBNYWtlIHN1cmUgdGhlIC5kZWJ1ZyBzZWN0aW9uIHdhcyBjcmVhdGVkIHRvIGJlIHRoZSBjb3JyZWN0IHNpemUuCisgICAgIFdlIHNob3VsZCBjcmVhdGUgaXQgb3Vyc2VsdmVzIG9uIHRoZSBmbHksIGJ1dCB3ZSBkb24ndCBiZWNhdXNlCisgICAgIEJGRCB3b24ndCBsZXQgdXMgd3JpdGUgdG8gYW55IHNlY3Rpb24gdW50aWwgd2Uga25vdyBob3cgbGFyZ2UgYWxsCisgICAgIHRoZSBzZWN0aW9ucyBhcmUuICBXZSBjb3VsZCBzdGlsbCBkbyBpdCBieSBtYWtpbmcgYW5vdGhlciBwYXNzCisgICAgIG92ZXIgdGhlIHN5bWJvbHMuICBGSVhNRS4gICovCisgIEJGRF9BU1NFUlQgKGRlYnVnX3N0cmluZ19zaXplID09IDAKKwkgICAgICB8fCAoZGVidWdfc3RyaW5nX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwKKwkJICAmJiAoQkZEX0FMSUdOIChkZWJ1Z19zdHJpbmdfc2l6ZSwKKwkJCQkgMSA8PCBkZWJ1Z19zdHJpbmdfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKQorCQkgICAgICA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbikpKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2xlYW4KK2NvZmZfd3JpdGVfbGluZW51bWJlcnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKnM7CisgIGJmZF9zaXplX3R5cGUgbGluZXN6OworICBQVFIgYnVmZjsKKworICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOworICBidWZmID0gYmZkX2FsbG9jIChhYmZkLCBsaW5lc3opOworICBpZiAoIWJ1ZmYpCisgICAgcmV0dXJuIGZhbHNlOworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgaWYgKHMtPmxpbmVub19jb3VudCkKKwl7CisJICBhc3ltYm9sICoqcSA9IGFiZmQtPm91dHN5bWJvbHM7CisJICBpZiAoYmZkX3NlZWsgKGFiZmQsIHMtPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC8qIEZpbmQgYWxsIHRoZSBsaW5lbnVtYmVycyBpbiB0aGlzIHNlY3Rpb24gKi8KKwkgIHdoaWxlICgqcSkKKwkgICAgeworCSAgICAgIGFzeW1ib2wgKnAgPSAqcTsKKwkgICAgICBpZiAocC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gcykKKwkJeworCQkgIGFsZW50ICpsID0KKwkJICBCRkRfU0VORCAoYmZkX2FzeW1ib2xfYmZkIChwKSwgX2dldF9saW5lbm8sCisJCQkgICAgKGJmZF9hc3ltYm9sX2JmZCAocCksIHApKTsKKwkJICBpZiAobCkKKwkJICAgIHsKKwkJICAgICAgLyogRm91bmQgYSBsaW5lbnVtYmVyIGVudHJ5LCBvdXRwdXQgKi8KKwkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBvdXQ7CisJCSAgICAgIG1lbXNldCAoKFBUUikgJiBvdXQsIDAsIHNpemVvZiAob3V0KSk7CisJCSAgICAgIG91dC5sX2xubm8gPSAwOworCQkgICAgICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7CisJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7CisJCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgICBsKys7CisJCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKKwkJCXsKKwkJCSAgb3V0LmxfbG5ubyA9IGwtPmxpbmVfbnVtYmVyOworCQkJICBvdXQubF9hZGRyLmxfc3ltbmR4ID0gbC0+dS5vZmZzZXQ7CisJCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJm91dCwgYnVmZik7CisJCQkgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGxpbmVzeiwgYWJmZCkgIT0gbGluZXN6KQorCQkJICAgIHJldHVybiBmYWxzZTsKKwkJCSAgbCsrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgcSsrOworCSAgICB9CisJfQorICAgIH0KKyAgYmZkX3JlbGVhc2UgKGFiZmQsIGJ1ZmYpOworICByZXR1cm4gdHJ1ZTsKK30KKworLypBUkdTVVNFRCAqLworYWxlbnQgKgorY29mZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7Cit7CisgIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm87Cit9CisKKyNpZiAwCisKKy8qIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMsIHdoaWNoIGhhcyBiZWVuCisgICBkaXNhYmxlZC4gICovCisKK2FzeW1ib2wgKgorY29mZl9zZWN0aW9uX3N5bWJvbCAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpuYW1lOworeworICBhc2VjdGlvbiAqc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBuYW1lKTsKKyAgYXN5bWJvbCAqc3ltOworICBjb21iaW5lZF9lbnRyeV90eXBlICpjc3ltOworCisgIHN5bSA9IHNlYy0+c3ltYm9sOworICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltKS0+bmF0aXZlOworICAvKiBNYWtlIHN1cmUgYmFjay1lbmQgQ09GRiBzdHVmZiBpcyB0aGVyZS4gICovCisgIGlmIChjc3ltID09IDApCisgICAgeworICAgICAgc3RydWN0IGZvbworCXsKKwkgIGNvZmZfc3ltYm9sX3R5cGUgc3ltOworCSAgLyogQEBGSVhNRSBUaGlzIHNob3VsZG4ndCB1c2UgYSBmaXhlZCBzaXplISEgICovCisJICBjb21iaW5lZF9lbnRyeV90eXBlIGVbMTBdOworCX07CisgICAgICBzdHJ1Y3QgZm9vICpmOworICAgICAgZiA9IChzdHJ1Y3QgZm9vICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqZikpOworICAgICAgaWYgKCFmKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBtZW1zZXQgKChjaGFyICopIGYsIDAsIHNpemVvZiAoKmYpKTsKKyAgICAgIGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bSktPm5hdGl2ZSA9IGNzeW0gPSBmLT5lOworICAgIH0KKyAgY3N5bVswXS51LnN5bWVudC5uX3NjbGFzcyA9IENfU1RBVDsKKyAgY3N5bVswXS51LnN5bWVudC5uX251bWF1eCA9IDE7CisvKiAgU0ZfU0VUX1NUQVRJQ1MgKHN5bSk7ICAgICAgIEBAID8/PyAqLworICBjc3ltWzFdLnUuYXV4ZW50Lnhfc2NuLnhfc2NubGVuID0gc2VjLT5fcmF3X3NpemU7CisgIGNzeW1bMV0udS5hdXhlbnQueF9zY24ueF9ucmVsb2MgPSBzZWMtPnJlbG9jX2NvdW50OworICBjc3ltWzFdLnUuYXV4ZW50Lnhfc2NuLnhfbmxpbm5vID0gc2VjLT5saW5lbm9fY291bnQ7CisKKyAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gc2VjOworICAgICAgc2VjLT5vdXRwdXRfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIHN5bTsKK30KKworI2VuZGlmIC8qIDAgKi8KKworLyogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBvZmZzZXRzIGludG8gdGhlIHN5bWJvbCB0YWJsZSBpbnRvCisgICBwb2ludGVycyB0byBzeW1lbnRzLiAgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfcG9pbnRlcml6ZV9hdXggKGFiZmQsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgaW5kYXV4LCBhdXhlbnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKKyAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOworICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4OworICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXhlbnQ7Cit7CisgIHVuc2lnbmVkIGludCB0eXBlID0gc3ltYm9sLT51LnN5bWVudC5uX3R5cGU7CisgIHVuc2lnbmVkIGludCBjbGFzcyA9IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3M7CisKKyAgaWYgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spCisgICAgeworICAgICAgaWYgKCgqY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykKKwkgIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4ZW50KSkKKwlyZXR1cm47CisgICAgfQorCisgIC8qIERvbid0IGJvdGhlciBpZiB0aGlzIGlzIGEgZmlsZSBvciBhIHNlY3Rpb24gKi8KKyAgaWYgKGNsYXNzID09IENfU1RBVCAmJiB0eXBlID09IFRfTlVMTCkKKyAgICByZXR1cm47CisgIGlmIChjbGFzcyA9PSBDX0ZJTEUpCisgICAgcmV0dXJuOworCisgIC8qIE90aGVyd2lzZSBwYXRjaCB1cCAqLworI2RlZmluZSBOX1RNQVNLIGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2sKKyNkZWZpbmUgTl9CVFNIRlQgY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQKKyAgaWYgKChJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSB8fCBjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOKQorICAgICAgJiYgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID4gMCkKKyAgICB7CisgICAgICBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAgPQorCXRhYmxlX2Jhc2UgKyBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7CisgICAgICBhdXhlbnQtPmZpeF9lbmQgPSAxOworICAgIH0KKyAgLyogQSBuZWdhdGl2ZSB0YWduZHggaXMgbWVhbmluZ2xlc3MsIGJ1dCB0aGUgU0NPIDMuMnY0IGNjIGNhbgorICAgICBnZW5lcmF0ZSBvbmUsIHNvIHdlIG11c3QgYmUgY2FyZWZ1bCB0byBpZ25vcmUgaXQuICAqLworICBpZiAoYXV4ZW50LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sID4gMCkKKyAgICB7CisgICAgICBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgPQorCXRhYmxlX2Jhc2UgKyBhdXhlbnQtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4Lmw7CisgICAgICBhdXhlbnQtPmZpeF90YWcgPSAxOworICAgIH0KK30KKworLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSAiLmRlYnVnIiBzZWN0aW9uLCBhbmQgcmVhZCBpdC4KKyAgIFdlIGRpZCBub3QgcmVhZCB0aGUgZGVidWcgc2VjdGlvbiB1bnRpbCBub3csIGJlY2F1c2UKKyAgIHdlIGRpZG4ndCB3YW50IHRvIGdvIHRvIHRoZSB0cm91YmxlIHVudGlsIHNvbWVvbmUgbmVlZGVkIGl0LiAqLworCitzdGF0aWMgY2hhciAqCitidWlsZF9kZWJ1Z19zZWN0aW9uIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgKmRlYnVnX3NlY3Rpb247CisgIGxvbmcgcG9zaXRpb247CisKKyAgYXNlY3Rpb24gKnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOworCisgIGlmICghc2VjdCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZGVidWdfc2VjdGlvbik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZGVidWdfc2VjdGlvbiA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkgICBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpKTsKKyAgaWYgKGRlYnVnX3NlY3Rpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGAuZGVidWcnIHNlY3Rpb24gYW5kIHJlYWQgaXQuIAorICAgICBTYXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZpcnN0OyBpdCBpcyBuZWVkZWQgYnkgb3VyIGNhbGxlci4KKyAgICAgVGhlbiByZWFkIGRlYnVnIHNlY3Rpb24gYW5kIHJlc2V0IHRoZSBmaWxlIHBvaW50ZXIuICAqLworCisgIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3QtPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCAoYmZkX3JlYWQgKGRlYnVnX3NlY3Rpb24sCisJCSAgICBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpLCAxLCBhYmZkKQorCSAgIT0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KSkKKyAgICAgIHx8IGJmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBkZWJ1Z19zZWN0aW9uOworfQorCisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBtYWxsb2MnZCBjb3B5IG9mICduYW1lJy4gICduYW1lJyBtYXkgbm90IGJlCisgICBcMC10ZXJtaW5hdGVkLCBidXQgd2lsbCBub3QgZXhjZWVkICdtYXhsZW4nIGNoYXJhY3RlcnMuICBUaGUgY29weSAqd2lsbCoKKyAgIGJlIFwwLXRlcm1pbmF0ZWQuICAqLworc3RhdGljIGNoYXIgKgorY29weV9uYW1lIChhYmZkLCBuYW1lLCBtYXhsZW4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IG1heGxlbjsKK3sKKyAgaW50IGxlbjsKKyAgY2hhciAqbmV3bmFtZTsKKworICBmb3IgKGxlbiA9IDA7IGxlbiA8IG1heGxlbjsgKytsZW4pCisgICAgeworICAgICAgaWYgKG5hbWVbbGVuXSA9PSAnXDAnKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKChuZXduYW1lID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gKE5VTEwpOworICBzdHJuY3B5IChuZXduYW1lLCBuYW1lLCBsZW4pOworICBuZXduYW1lW2xlbl0gPSAnXDAnOworICByZXR1cm4gbmV3bmFtZTsKK30KKworLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCisKK2Jvb2xlYW4KK19iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKKyAgc2l6ZV90IHNpemU7CisgIFBUUiBzeW1zOworCisgIGlmIChvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisKKyAgc2l6ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKKworICBzeW1zID0gKFBUUikgYmZkX21hbGxvYyAoc2l6ZSk7CisgIGlmIChzeW1zID09IE5VTEwgJiYgc2l6ZSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCBiZmRfcmVhZCAoc3ltcywgc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZSkKKyAgICB7CisgICAgICBpZiAoc3ltcyAhPSBOVUxMKQorCWZyZWUgKHN5bXMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSA9IHN5bXM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN0cmluZ3MuICBUaGUgc3RyaW5ncyBhcmUgbm90IGxvYWRlZCB1bnRpbAorICAgdGhleSBhcmUgbmVlZGVkLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGhhdmUgbm8gc2ltcGxlIHdheSBvZgorICAgZGV0ZWN0aW5nIGEgbWlzc2luZyBzdHJpbmcgdGFibGUgaW4gYW4gYXJjaGl2ZS4gICovCisKK2NvbnN0IGNoYXIgKgorX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgZXh0c3Ryc2l6ZVtTVFJJTkdfU0laRV9TSVpFXTsKKyAgc2l6ZV90IHN0cnNpemU7CisgIGNoYXIgKnN0cmluZ3M7CisKKyAgaWYgKG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpICE9IE5VTEwpCisgICAgcmV0dXJuIG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpOworCisgIGlmIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChiZmRfc2VlayAoYWJmZCwKKwkJKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKKwkJICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogYmZkX2NvZmZfc3ltZXN6IChhYmZkKSksCisJCVNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBOVUxMOworICAgIAorICBpZiAoYmZkX3JlYWQgKGV4dHN0cnNpemUsIHNpemVvZiBleHRzdHJzaXplLCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0c3Ryc2l6ZSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIC8qIFRoZXJlIGlzIG5vIHN0cmluZyB0YWJsZS4gICovCisgICAgICBzdHJzaXplID0gU1RSSU5HX1NJWkVfU0laRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgU1RSSU5HX1NJWkVfU0laRSA9PSA0CisgICAgICBzdHJzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0c3Ryc2l6ZSk7CisjZWxzZQorICNlcnJvciBDaGFuZ2UgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyAgICB9CisKKyAgaWYgKHN0cnNpemUgPCBTVFJJTkdfU0laRV9TSVpFKQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkgKHVuc2lnbmVkIGxvbmcpIHN0cnNpemUpOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cnNpemUpOworICBpZiAoc3RyaW5ncyA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChiZmRfcmVhZCAoc3RyaW5ncyArIFNUUklOR19TSVpFX1NJWkUsCisJCXN0cnNpemUgLSBTVFJJTkdfU0laRV9TSVpFLCAxLCBhYmZkKQorICAgICAgIT0gc3Ryc2l6ZSAtIFNUUklOR19TSVpFX1NJWkUpCisgICAgeworICAgICAgZnJlZSAoc3RyaW5ncyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgPSBzdHJpbmdzOworCisgIHJldHVybiBzdHJpbmdzOworfQorCisvKiBGcmVlIHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHJlYWQgZnJvbSBhIENPRkYgZmlsZS4gICovCisKK2Jvb2xlYW4KK19iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IE5VTEwKKyAgICAgICYmICEgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSkKKyAgICB7CisgICAgICBmcmVlIChvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSk7CisgICAgICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7CisgICAgfQorICBpZiAob2JqX2NvZmZfc3RyaW5ncyAoYWJmZCkgIT0gTlVMTAorICAgICAgJiYgISBvYmpfY29mZl9rZWVwX3N0cmluZ3MgKGFiZmQpKQorICAgIHsKKyAgICAgIGZyZWUgKG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpKTsKKyAgICAgIG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWFkIGEgc3ltYm9sIHRhYmxlIGludG8gZnJlc2hseSBiZmRfYWxsb2NhdGVkIG1lbW9yeSwgc3dhcCBpdCwgYW5kCisgICBrbml0IHRoZSBzeW1ib2wgbmFtZXMgaW50byBhIG5vcm1hbGl6ZWQgZm9ybS4gIEJ5IG5vcm1hbGl6ZWQgaGVyZSBJCisgICBtZWFuIHRoYXQgYWxsIHN5bWJvbHMgaGF2ZSBhbiBuX29mZnNldCBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgbnVsbC0KKyAgIHRlcm1pbmF0ZWQgc3RyaW5nLiAgKi8KKworY29tYmluZWRfZW50cnlfdHlwZSAqCitjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbDsKKyAgY29tYmluZWRfZW50cnlfdHlwZSAqaW50ZXJuYWxfcHRyOworICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2xfcHRyOworICBjb21iaW5lZF9lbnRyeV90eXBlICppbnRlcm5hbF9lbmQ7CisgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworICBjaGFyICpyYXdfc3JjOworICBjaGFyICpyYXdfZW5kOworICBjb25zdCBjaGFyICpzdHJpbmdfdGFibGUgPSBOVUxMOworICBjaGFyICpkZWJ1Z19zZWN0aW9uID0gTlVMTDsKKyAgdW5zaWduZWQgbG9uZyBzaXplOworCisgIGlmIChvYmpfcmF3X3N5bWVudHMgKGFiZmQpICE9IE5VTEwpCisgICAgcmV0dXJuIG9ial9yYXdfc3ltZW50cyAoYWJmZCk7CisKKyAgc2l6ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSk7CisgIGludGVybmFsID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZSk7CisgIGlmIChpbnRlcm5hbCA9PSBOVUxMICYmIHNpemUgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaW50ZXJuYWxfZW5kID0gaW50ZXJuYWwgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7CisKKyAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByYXdfc3JjID0gKGNoYXIgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7CisKKyAgLyogbWFyayB0aGUgZW5kIG9mIHRoZSBzeW1ib2xzICovCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisgIHJhd19lbmQgPSAoY2hhciAqKSByYXdfc3JjICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OworCisgIC8qIEZJWE1FIFNPTUVEQVkuICBBIHN0cmluZyB0YWJsZSBzaXplIG9mIHplcm8gaXMgdmVyeSB3ZWlyZCwgYnV0CisgICAgIHByb2JhYmx5IHBvc3NpYmxlLiAgSWYgb25lIHNob3dzIHVwLCBpdCB3aWxsIHByb2JhYmx5IGtpbGwgdXMuICAqLworCisgIC8qIFN3YXAgYWxsIHRoZSByYXcgZW50cmllcyAqLworICBmb3IgKGludGVybmFsX3B0ciA9IGludGVybmFsOworICAgICAgIHJhd19zcmMgPCByYXdfZW5kOworICAgICAgIHJhd19zcmMgKz0gc3ltZXN6LCBpbnRlcm5hbF9wdHIrKykKKyAgICB7CisKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIHJhd19zcmMsCisJCQkgICAgKFBUUikgJiBpbnRlcm5hbF9wdHItPnUuc3ltZW50KTsKKyAgICAgIHN5bWJvbF9wdHIgPSBpbnRlcm5hbF9wdHI7CisKKyAgICAgIGZvciAoaSA9IDA7CisJICAgaSA8IHN5bWJvbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OworCSAgIGkrKykKKwl7CisJICBpbnRlcm5hbF9wdHIrKzsKKwkgIHJhd19zcmMgKz0gc3ltZXN6OworCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIChQVFIpIHJhd19zcmMsCisJCQkJc3ltYm9sX3B0ci0+dS5zeW1lbnQubl90eXBlLAorCQkJCXN5bWJvbF9wdHItPnUuc3ltZW50Lm5fc2NsYXNzLAorCQkJCWksIHN5bWJvbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4LAorCQkJCSYoaW50ZXJuYWxfcHRyLT51LmF1eGVudCkpOworCSAgY29mZl9wb2ludGVyaXplX2F1eCAoYWJmZCwgaW50ZXJuYWwsIHN5bWJvbF9wdHIsIGksCisJCQkgICAgICAgaW50ZXJuYWxfcHRyKTsKKwl9CisgICAgfQorCisgIC8qIEZyZWUgdGhlIHJhdyBzeW1ib2xzLCBidXQgbm90IHRoZSBzdHJpbmdzIChpZiB3ZSBoYXZlIHRoZW0pLiAgKi8KKyAgb2JqX2NvZmZfa2VlcF9zdHJpbmdzIChhYmZkKSA9IHRydWU7CisgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAoaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7IGludGVybmFsX3B0ciA8IGludGVybmFsX2VuZDsKKyAgICAgICBpbnRlcm5hbF9wdHIrKykKKyAgICB7CisgICAgICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKKwkgICYmIGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggPiAwKQorCXsKKwkgIC8qIG1ha2UgYSBmaWxlIHN5bWJvbCBwb2ludCB0byB0aGUgbmFtZSBpbiB0aGUgYXV4ZW50LCBzaW5jZQorCSAgICAgdGhlIHRleHQgIi5maWxlIiBpcyByZWR1bmRhbnQgKi8KKwkgIGlmICgoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIHRoZSBmaWxlbmFtZSBpcyBhIGxvbmcgb25lLCBwb2ludCBpbnRvIHRoZSBzdHJpbmcgdGFibGUgKi8KKwkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCisJCXsKKwkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOworCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisKKwkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0KKwkJKChsb25nKQorCQkgKHN0cmluZ190YWJsZQorCQkgICsgKGludGVybmFsX3B0ciArIDEpLT51LmF1eGVudC54X2ZpbGUueF9uLnhfb2Zmc2V0KSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIG9yZGluYXJ5IHNob3J0IGZpbGVuYW1lLCBwdXQgaW50byBtZW1vcnkgYW55d2F5ICovCisJICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nKQorCQljb3B5X25hbWUgKGFiZmQsIChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfZm5hbWUsCisJCQkgICBGSUxOTUxFTik7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSAic2hvcnQiIG5hbWUuICBNYWtlIGl0IGxvbmcuICAqLworCSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IDA7CisJICAgICAgY2hhciAqbmV3c3RyaW5nID0gTlVMTDsKKworCSAgICAgIC8qIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyB3aXRob3V0IHdhbGtpbmcgaW50byBtZW1vcnkKKwkgICAgICAgICB0aGF0IGlzbid0IG91cnMuICAqLworCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJCXsKKwkJICBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lW2ldID09ICdcMCcpCisJCSAgICB7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQkJLyogaWYgZW5kIG9mIHN0cmluZyAqLworCQl9CQkvKiBwb3NzaWJsZSBsZW5ndGhzIG9mIHRoaXMgc3RyaW5nLiAqLworCisJICAgICAgaWYgKChuZXdzdHJpbmcgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsICsraSkpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJICAgICAgbWVtc2V0IChuZXdzdHJpbmcsIDAsIGkpOworCSAgICAgIHN0cm5jcHkgKG5ld3N0cmluZywgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uYW1lLCBpIC0gMSk7CisJICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkgbmV3c3RyaW5nOworCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOworCSAgICB9CisJICBlbHNlIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID09IDApCisJICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpICIiOworCSAgZWxzZSBpZiAoIWJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKGFiZmQsICZpbnRlcm5hbF9wdHItPnUuc3ltZW50KSkKKwkgICAgeworCSAgICAgIC8qIExvbmcgbmFtZSBhbHJlYWR5LiAgUG9pbnQgc3ltYm9sIGF0IHRoZSBzdHJpbmcgaW4gdGhlCisgICAgICAgICAgICAgICAgIHRhYmxlLiAgKi8KKwkgICAgICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCisJCXsKKwkJICBzdHJpbmdfdGFibGUgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOworCQkgIGlmIChzdHJpbmdfdGFibGUgPT0gTlVMTCkKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9CisJCSgobG9uZyBpbnQpCisJCSAoc3RyaW5nX3RhYmxlCisJCSAgKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIExvbmcgbmFtZSBpbiBkZWJ1ZyBzZWN0aW9uLiAgVmVyeSBzaW1pbGFyLiAgKi8KKwkgICAgICBpZiAoZGVidWdfc2VjdGlvbiA9PSBOVUxMKQorCQlkZWJ1Z19zZWN0aW9uID0gYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCk7CisJICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nIGludCkKKwkJKGRlYnVnX3NlY3Rpb24gKyBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0KTsKKwkgICAgfQorCX0KKyAgICAgIGludGVybmFsX3B0ciArPSBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4OworICAgIH0KKworICBvYmpfcmF3X3N5bWVudHMgKGFiZmQpID0gaW50ZXJuYWw7CisgIEJGRF9BU1NFUlQgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQorCSAgICAgID09ICh1bnNpZ25lZCBpbnQpIChpbnRlcm5hbF9wdHIgLSBpbnRlcm5hbCkpOworCisgIHJldHVybiAoaW50ZXJuYWwpOworfQkJCQkvKiBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYigpICovCisKK2xvbmcKK2NvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworeworICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Cit9CisKK2FzeW1ib2wgKgorY29mZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOworICBpZiAobmV3ID09IE5VTEwpCisgICAgcmV0dXJuIChOVUxMKTsKKyAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAqbmV3KTsKKyAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IDA7CisgIG5ldy0+bmF0aXZlID0gMDsKKyAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKKyAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOworICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKyAgcmV0dXJuICZuZXctPnN5bWJvbDsKK30KKworLyogTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLworCithc3ltYm9sICoKK2NvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHN6KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBwdHI7CisgICAgIHVuc2lnbmVkIGxvbmcgc3o7Cit7CisgIGNvZmZfc3ltYm9sX3R5cGUgKm5ldyA9IChjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSk7CisgIGlmIChuZXcgPT0gTlVMTCkKKyAgICByZXR1cm4gKE5VTEwpOworICAvKiBAQCBUaGUgMTAgaXMgYSBndWVzcyBhdCBhIHBsYXVzaWJsZSBtYXhpbXVtIG51bWJlciBvZiBhdXggZW50cmllcworICAgICAoYnV0IHNob3VsZG4ndCBiZSBhIGNvbnN0YW50KS4gICovCisgIG5ldy0+bmF0aXZlID0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKSAqIDEwKTsKKyAgaWYgKCFuZXctPm5hdGl2ZSkKKyAgICByZXR1cm4gKE5VTEwpOworICBuZXctPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgbmV3LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworICBuZXctPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOworICBuZXctPmRvbmVfbGluZW5vID0gZmFsc2U7CisgIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gJm5ldy0+c3ltYm9sOworfQorCisvKkFSR1NVU0VEICovCit2b2lkCitjb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBzeW1ib2xfaW5mbyAqcmV0OworeworICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKKyAgaWYgKGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSAhPSBOVUxMCisgICAgICAmJiBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUtPmZpeF92YWx1ZSkKKyAgICB7CisgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpwc3ltOworCisgICAgICBwc3ltID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopCisJICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlKTsKKyAgICAgIHJldC0+dmFsdWUgPSAoYmZkX3ZtYSkgKHBzeW0gLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgQ09GRiBzeW1lbnQgZm9yIGEgc3ltYm9sLiAgKi8KKworYm9vbGVhbgorYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltYm9sLCBwc3ltZW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKK3sKKyAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKKworICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKKyAgaWYgKGNzeW0gPT0gTlVMTCB8fCBjc3ltLT5uYXRpdmUgPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAqcHN5bWVudCA9IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQ7CisKKyAgaWYgKGNzeW0tPm5hdGl2ZS0+Zml4X3ZhbHVlKQorICAgIHBzeW1lbnQtPm5fdmFsdWUgPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcHN5bWVudC0+bl92YWx1ZQorCQkJLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKKworICAvKiBGSVhNRTogV2Ugc2hvdWxkIGhhbmRsZSBmaXhfbGluZSBoZXJlLiAgKi8KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRoZSBDT0ZGIGF1eGVudCBmb3IgYSBzeW1ib2wuICAqLworCitib29sZWFuCitiZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW1ib2wsIGluZHgsIHBhdXhlbnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBpbnQgaW5keDsKKyAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4ZW50OworeworICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltOworICBjb21iaW5lZF9lbnRyeV90eXBlICplbnQ7CisKKyAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7CisKKyAgaWYgKGNzeW0gPT0gTlVMTAorICAgICAgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwKKyAgICAgIHx8IGluZHggPj0gY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBlbnQgPSBjc3ltLT5uYXRpdmUgKyBpbmR4ICsgMTsKKworICAqcGF1eGVudCA9IGVudC0+dS5hdXhlbnQ7CisKKyAgaWYgKGVudC0+Zml4X3RhZykKKyAgICBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID0KKyAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5wCisgICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKKworICBpZiAoZW50LT5maXhfZW5kKQorICAgIHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQorICAgICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAKKyAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOworCisgIGlmIChlbnQtPmZpeF9zY25sZW4pCisgICAgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5sID0KKyAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X2NzZWN0Lnhfc2NubGVuLnAKKyAgICAgICAtIG9ial9yYXdfc3ltZW50cyAoYWJmZCkpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgQ09GRiBzeW1ib2wuICAqLworCit2b2lkCitjb2ZmX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZXAsIHN5bWJvbCwgaG93KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBmaWxlcDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OworeworICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7CisKKyAgc3dpdGNoIChob3cpCisgICAgeworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgorICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6CisgICAgICBmcHJpbnRmIChmaWxlLCAiY29mZiAlcyAlcyIsCisJICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSA/ICJuIiA6ICJnIiwKKwkgICAgICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vID8gImwiIDogIiAiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKKyAgICAgIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUpCisJeworCSAgdW5zaWduZWQgbG9uZyB2YWw7CisJICB1bnNpZ25lZCBpbnQgYXV4OworCSAgY29tYmluZWRfZW50cnlfdHlwZSAqY29tYmluZWQgPSBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmU7CisJICBjb21iaW5lZF9lbnRyeV90eXBlICpyb290ID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKKwkgIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmwgPSBjb2Zmc3ltYm9sIChzeW1ib2wpLT5saW5lbm87CisKKwkgIGZwcmludGYgKGZpbGUsICJbJTNsZF0iLCAobG9uZykgKGNvbWJpbmVkIC0gcm9vdCkpOworCisJICBpZiAoISBjb21iaW5lZC0+Zml4X3ZhbHVlKQorCSAgICB2YWwgPSAodW5zaWduZWQgbG9uZykgY29tYmluZWQtPnUuc3ltZW50Lm5fdmFsdWU7CisJICBlbHNlCisJICAgIHZhbCA9ICgodW5zaWduZWQgbG9uZykKKwkJICAgKChjb21iaW5lZF9lbnRyeV90eXBlICopIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlCisJCSAgICAtIHJvb3QpKTsKKworCSAgZnByaW50ZiAoZmlsZSwKKwkJICAgIihzZWMgJTJkKShmbCAweCUwMngpKHR5ICUzeCkoc2NsICUzZCkgKG54ICVkKSAweCUwOGx4ICVzIiwKKwkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NudW0sCisJCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX2ZsYWdzLAorCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlLAorCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9zY2xhc3MsCisJCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX251bWF1eCwKKwkJICAgdmFsLAorCQkgICBzeW1ib2wtPm5hbWUpOworCisJICBmb3IgKGF1eCA9IDA7IGF1eCA8IGNvbWJpbmVkLT51LnN5bWVudC5uX251bWF1eDsgYXV4KyspCisJICAgIHsKKwkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXhwID0gY29tYmluZWQgKyBhdXggKyAxOworCSAgICAgIGxvbmcgdGFnbmR4OworCisJICAgICAgaWYgKGF1eHAtPmZpeF90YWcpCisJCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgLSByb290OworCSAgICAgIGVsc2UKKwkJdGFnbmR4ID0gYXV4cC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubDsKKworCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOworCisJICAgICAgaWYgKGJmZF9jb2ZmX3ByaW50X2F1eCAoYWJmZCwgZmlsZSwgcm9vdCwgY29tYmluZWQsIGF1eHAsIGF1eCkpCisJCWNvbnRpbnVlOworCisJICAgICAgc3dpdGNoIChjb21iaW5lZC0+dS5zeW1lbnQubl9zY2xhc3MpCisJCXsKKwkJY2FzZSBDX0ZJTEU6CisJCSAgZnByaW50ZiAoZmlsZSwgIkZpbGUgIik7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBDX1NUQVQ6CisJCSAgaWYgKGNvbWJpbmVkLT51LnN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQorCQkgICAgLyogcHJvYmFibHkgYSBzZWN0aW9uIHN5bWJvbD8gKi8KKwkJICAgIHsKKwkJICAgICAgZnByaW50ZiAoZmlsZSwgIkFVWCBzY25sZW4gMHglbHggbnJlbG9jICVkIG5sbm5vICVkIiwKKwkJCSAgICAgICAobG9uZykgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9zY25sZW4sCisJCQkgICAgICAgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9ucmVsb2MsCisJCQkgICAgICAgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9ubGlubm8pOworCQkgICAgICBpZiAoYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jaGVja3N1bSAhPSAwCisJCQkgIHx8IGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfYXNzb2NpYXRlZCAhPSAwCisJCQkgIHx8IGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ICE9IDApCisJCQlmcHJpbnRmIChmaWxlLCAiIGNoZWNrc3VtIDB4JWx4IGFzc29jICVkIGNvbWRhdCAlZCIsCisJCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0sCisJCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfYXNzb2NpYXRlZCwKKwkJCQkgYXV4cC0+dS5hdXhlbnQueF9zY24ueF9jb21kYXQpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLworCisJCWRlZmF1bHQ6CisJCSAgZnByaW50ZiAoZmlsZSwgIkFVWCBsbm5vICVkIHNpemUgMHgleCB0YWduZHggJWxkIiwKKwkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLAorCQkJICAgYXV4cC0+dS5hdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsCisJCQkgICB0YWduZHgpOworCQkgIGlmIChhdXhwLT5maXhfZW5kKQorCQkgICAgZnByaW50ZiAoZmlsZSwgIiBlbmRuZHggJWxkIiwKKwkJCSAgICAgKChsb25nKQorCQkJICAgICAgKGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAKKwkJCSAgICAgICAtIHJvb3QpKSk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICBpZiAobCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKGZpbGUsICJcbiVzIDoiLCBsLT51LnN5bS0+bmFtZSk7CisJICAgICAgbCsrOworCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlcikKKwkJeworCQkgIGZwcmludGYgKGZpbGUsICJcbiU0ZCA6IDB4JWx4IiwKKwkJCSAgIGwtPmxpbmVfbnVtYmVyLAorCQkJICAgKCh1bnNpZ25lZCBsb25nKQorCQkJICAgIChsLT51Lm9mZnNldCArIHN5bWJvbC0+c2VjdGlvbi0+dm1hKSkpOworCQkgIGwrKzsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7CisJICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMgJXMgJXMiLAorCQkgICBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsCisJCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSA/ICJuIiA6ICJnIiwKKwkJICAgY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vID8gImwiIDogIiAiLAorCQkgICBzeW1ib2wtPm5hbWUpOworCX0KKyAgICB9Cit9CisKKy8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIHN5bWJvbC4gIEluIENPRkYsCisgICBsb2NhbCBzeW1ib2xzIGdlbmVyYWxseSBzdGFydCB3aXRoIGBgLkwnJy4gIE1vc3QgdGFyZ2V0cyB1c2UgdGhpcworICAgZnVuY3Rpb24gZm9yIHRoZSBpc19sb2NhbF9sYWJlbF9uYW1lIGVudHJ5IHBvaW50LCBidXQgc29tZSBtYXkKKyAgIG92ZXJyaWRlIGl0LiAgKi8KKworYm9vbGVhbgorX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnOworfQorCisvKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCisgICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKKyAgIHdhbnRlZCBsb2NhdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCisJCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKK3sKKyAgYm9vbGVhbiBmb3VuZDsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBsaW5lX2Jhc2U7CisgIGNvZmZfZGF0YV90eXBlICpjb2YgPSBjb2ZmX2RhdGEgKGFiZmQpOworICAvKiBSdW4gdGhyb3VnaCB0aGUgcmF3IHN5bWVudHMgaWYgYXZhaWxhYmxlICovCisgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnA7CisgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnBlbmQ7CisgIGFsZW50ICpsOworICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNfZGF0YTsKKworICAvKiBCZWZvcmUgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUsIHRyeSB0byB1c2UgYSAuc3RhYgorICAgICBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKCEgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHN5bWJvbHMsIHNlY3Rpb24sIG9mZnNldCwKKwkJCQkJICAgICAmZm91bmQsIGZpbGVuYW1lX3B0ciwKKwkJCQkJICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0ciwKKwkJCQkJICAgICAmY29mZl9kYXRhIChhYmZkKS0+bGluZV9pbmZvKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChmb3VuZCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAqZmlsZW5hbWVfcHRyID0gMDsKKyAgKmZ1bmN0aW9ubmFtZV9wdHIgPSAwOworICAqbGluZV9wdHIgPSAwOworCisgIC8qIERvbid0IHRyeSBhbmQgZmluZCBsaW5lIG51bWJlcnMgaW4gYSBub24gY29mZiBmaWxlICovCisgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoY29mID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZpbmQgdGhlIGZpcnN0IENfRklMRSBzeW1ib2wuICAqLworICBwID0gY29mLT5yYXdfc3ltZW50czsKKyAgaWYgKCFwKQorICAgIHJldHVybiBmYWxzZTsKKworICBwZW5kID0gcCArIGNvZi0+cmF3X3N5bWVudF9jb3VudDsKKyAgd2hpbGUgKHAgPCBwZW5kKQorICAgIHsKKyAgICAgIGlmIChwLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCisJYnJlYWs7CisgICAgICBwICs9IDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKKyAgICB9CisKKyAgaWYgKHAgPCBwZW5kKQorICAgIHsKKyAgICAgIGJmZF92bWEgc2VjX3ZtYTsKKyAgICAgIGJmZF92bWEgbWF4ZGlmZjsKKworICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBDX0ZJTEUgc3ltYm9scyB0byBmaW5kIHRoZSBiZXN0IG9uZS4gICovCisgICAgICBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7CisgICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7CisgICAgICBtYXhkaWZmID0gKGJmZF92bWEpIDAgLSAoYmZkX3ZtYSkgMTsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnAyOworCisJICBmb3IgKHAyID0gcCArIDEgKyBwLT51LnN5bWVudC5uX251bWF1eDsKKwkgICAgICAgcDIgPCBwZW5kOworCSAgICAgICBwMiArPSAxICsgcDItPnUuc3ltZW50Lm5fbnVtYXV4KQorCSAgICB7CisJICAgICAgaWYgKHAyLT51LnN5bWVudC5uX3NjbnVtID4gMAorCQkgICYmIChzZWN0aW9uCisJCSAgICAgID09IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKKwkJCQkJCSAgICAgIHAyLT51LnN5bWVudC5uX3NjbnVtKSkpCisJCWJyZWFrOworCSAgICAgIGlmIChwMi0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQorCQl7CisJCSAgcDIgPSBwZW5kOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgaWYgKHAyIDwgcGVuZAorCSAgICAgICYmIG9mZnNldCArIHNlY192bWEgPj0gKGJmZF92bWEpIHAyLT51LnN5bWVudC5uX3ZhbHVlCisJICAgICAgJiYgb2Zmc2V0ICsgc2VjX3ZtYSAtIChiZmRfdm1hKSBwMi0+dS5zeW1lbnQubl92YWx1ZSA8IG1heGRpZmYpCisJICAgIHsKKwkgICAgICAqZmlsZW5hbWVfcHRyID0gKGNoYXIgKikgcC0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQ7CisJICAgICAgbWF4ZGlmZiA9IG9mZnNldCArIHNlY192bWEgLSBwMi0+dS5zeW1lbnQubl92YWx1ZTsKKwkgICAgfQorCisJICAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIG9uIGVycm9uZW91cyBmaWxlcyBieSBlbnN1cmluZyB0aGF0CisJICAgICB3ZSBhbHdheXMgbW92ZSBmb3J3YXJkIGluIHRoZSBmaWxlLiAgKi8KKwkgIGlmIChwIC0gY29mLT5yYXdfc3ltZW50cyA+PSBwLT51LnN5bWVudC5uX3ZhbHVlKQorCSAgICBicmVhazsKKworCSAgcCA9IGNvZi0+cmF3X3N5bWVudHMgKyBwLT51LnN5bWVudC5uX3ZhbHVlOworCSAgaWYgKHAgPiBwZW5kIHx8IHAtPnUuc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBOb3cgd2FuZGVyIHRob3VnaCB0aGUgcmF3IGxpbmVudW1iZXJzIG9mIHRoZSBzZWN0aW9uICovCisgIC8qIElmIHdlIGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyBzZWN0aW9uIGJlZm9yZSwgYW5kIHRoZSBvZmZzZXQgd2UKKyAgICAgd2FudCBpcyBmdXJ0aGVyIGRvd24gdGhlbiB3ZSBjYW4gcHJpbWUgdGhlIGxvb2t1cCBsb29wLiAgKi8KKyAgc2VjX2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbik7CisgIGlmIChzZWNfZGF0YSAhPSBOVUxMCisgICAgICAmJiBzZWNfZGF0YS0+aSA+IDAKKyAgICAgICYmIG9mZnNldCA+PSBzZWNfZGF0YS0+b2Zmc2V0KQorICAgIHsKKyAgICAgIGkgPSBzZWNfZGF0YS0+aTsKKyAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gc2VjX2RhdGEtPmZ1bmN0aW9uOworICAgICAgbGluZV9iYXNlID0gc2VjX2RhdGEtPmxpbmVfYmFzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpID0gMDsKKyAgICAgIGxpbmVfYmFzZSA9IDA7CisgICAgfQorCisgIGlmIChzZWN0aW9uLT5saW5lbm8gIT0gTlVMTCkKKyAgICB7CisgICAgICBsID0gJnNlY3Rpb24tPmxpbmVub1tpXTsKKworICAgICAgZm9yICg7IGkgPCBzZWN0aW9uLT5saW5lbm9fY291bnQ7IGkrKykKKwl7CisJICBpZiAobC0+bGluZV9udW1iZXIgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEdldCB0aGUgc3ltYm9sIHRoaXMgbGluZSBudW1iZXIgcG9pbnRzIGF0ICovCisJICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZiA9IChjb2ZmX3N5bWJvbF90eXBlICopIChsLT51LnN5bSk7CisJICAgICAgaWYgKGNvZmYtPnN5bWJvbC52YWx1ZSA+IG9mZnNldCkKKwkJYnJlYWs7CisJICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBjb2ZmLT5zeW1ib2wubmFtZTsKKwkgICAgICBpZiAoY29mZi0+bmF0aXZlKQorCQl7CisJCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmYtPm5hdGl2ZTsKKwkJICBzID0gcyArIDEgKyBzLT51LnN5bWVudC5uX251bWF1eDsKKworCQkgIC8qIEluIFhDT0ZGIGEgZGVidWdnaW5nIHN5bWJvbCBjYW4gZm9sbG93IHRoZQorCQkgICAgIGZ1bmN0aW9uIHN5bWJvbC4gICovCisJCSAgaWYgKHMtPnUuc3ltZW50Lm5fc2NudW0gPT0gTl9ERUJVRykKKwkJICAgIHMgPSBzICsgMSArIHMtPnUuc3ltZW50Lm5fbnVtYXV4OworCisJCSAgLyogUyBzaG91bGQgbm93IHBvaW50IHRvIHRoZSAuYmYgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KKwkJICBpZiAocy0+dS5zeW1lbnQubl9udW1hdXgpCisJCSAgICB7CisJCSAgICAgIC8qIFRoZSBsaW5lbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgYXV4ZW50LiAgKi8KKwkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphID0gJigocyArIDEpLT51LmF1eGVudCk7CisJCSAgICAgIGxpbmVfYmFzZSA9IGEtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOworCQkgICAgICAqbGluZV9wdHIgPSBsaW5lX2Jhc2U7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGwtPnUub2Zmc2V0ID4gb2Zmc2V0KQorCQlicmVhazsKKwkgICAgICAqbGluZV9wdHIgPSBsLT5saW5lX251bWJlciArIGxpbmVfYmFzZSAtIDE7CisJICAgIH0KKwkgIGwrKzsKKwl9CisgICAgfQorCisgIC8qIENhY2hlIHRoZSByZXN1bHRzIGZvciB0aGUgbmV4dCBjYWxsLiAgKi8KKyAgaWYgKHNlY19kYXRhID09IE5VTEwgJiYgc2VjdGlvbi0+b3duZXIgPT0gYWJmZCkKKyAgICB7CisgICAgICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9CisJKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsCisJCQkgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7CisgICAgICBzZWNfZGF0YSA9IChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOworICAgIH0KKyAgaWYgKHNlY19kYXRhICE9IE5VTEwpCisgICAgeworICAgICAgc2VjX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKKyAgICAgIHNlY19kYXRhLT5pID0gaTsKKyAgICAgIHNlY19kYXRhLT5mdW5jdGlvbiA9ICpmdW5jdGlvbm5hbWVfcHRyOworICAgICAgc2VjX2RhdGEtPmxpbmVfYmFzZSA9IGxpbmVfYmFzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludAorY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiByZWxvYzsKK3sKKyAgc2l6ZV90IHNpemU7CisKKyAgaWYgKHJlbG9jID09IGZhbHNlKQorICAgIHsKKyAgICAgIHNpemUgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKKyAgICB9CisKKyAgc2l6ZSArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qIENoYW5nZSB0aGUgY2xhc3Mgb2YgYSBjb2ZmIHN5bWJvbCBoZWxkIGJ5IEJGRC4gICovCitib29sZWFuCitiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzIChhYmZkLCBzeW1ib2wsIGNsYXNzKQorICAgICBiZmQgKiAgICAgICAgIGFiZmQ7CisgICAgIGFzeW1ib2wgKiAgICAgc3ltYm9sOworICAgICB1bnNpZ25lZCBpbnQgIGNsYXNzOworeworICBjb2ZmX3N5bWJvbF90eXBlICogY3N5bTsKKworICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltYm9sKTsKKyAgaWYgKGNzeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZSBpZiAoY3N5bS0+bmF0aXZlID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhbiBhbGllbiBzeW1ib2wgd2hpY2ggbm8gbmF0aXZlIGNvZmYgYmFja2VuZCBkYXRhLgorCSBXZSBjaGVhdCBoZXJlIGJ5IGNyZWF0aW5nIGEgZmFrZSBuYXRpdmUgZW50cnkgZm9yIGl0IGFuZAorCSB0aGVuIGZpbGxpbmcgaW4gdGhlIGNsYXNzLiAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoYXQgaW4KKwkgY29mZl93cml0ZV9hbGllbl9zeW1ib2woKS4gICovCisgICAgICAKKyAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiBuYXRpdmU7CisKKyAgICAgIG5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIG5hdGl2ZSkpOworICAgICAgaWYgKG5hdGl2ZSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgbWVtc2V0IChuYXRpdmUsIDAsIHNpemVvZiAoKiBuYXRpdmUpKTsKKyAgICAgIAorICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgICA9IFRfTlVMTDsKKyAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBjbGFzczsKKyAgICAgIAorICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKwl7CisJICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOworCSAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKKwl9CisgICAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisJeworCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKKwkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9CisJICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCisJCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKKwkgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKwkgIAorCSAgLyogQ29weSB0aGUgYW55IGZsYWdzIGZyb20gdGhlIHRoZSBmaWxlIGhlYWRlciBpbnRvIHRoZSBzeW1ib2wuCisJICAgICBGSVhNRTogV2h5PyAgKi8KKwkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJiBjc3ltLT5zeW1ib2wpLT5mbGFnczsKKwl9CisgICAgICAKKyAgICAgIGNzeW0tPm5hdGl2ZSA9IG5hdGl2ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gY2xhc3M7CisgICAgfQorICAKKyAgcmV0dXJuIHRydWU7Cit9CisKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmbGluay5jIGIvYmZkL2NvZmZsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1Njg2OQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb2ZmbGluay5jCkBAIC0wLDAgKzEsMjc1MiBAQAorLyogQ09GRiBzcGVjaWZpYyBsaW5rZXIgY29kZS4KKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIgY29kZS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBjaGFyICpkb3Jlc19jb20gUEFSQU1TICgoY2hhciAqLCBiZmQgKiwgaW50KSk7CitzdGF0aWMgY2hhciAqZ2V0X25hbWUgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7CitzdGF0aWMgaW50IHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqKSk7CitzdGF0aWMgdm9pZCBtYXJrX3JlbG9jcyBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKKworLyogQ3JlYXRlIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKKwkJCQkgdGFibGUsIHN0cmluZykpOworICBpZiAocmV0ICE9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KKyAgICAgIHJldC0+aW5keCA9IC0xOworICAgICAgcmV0LT50eXBlID0gVF9OVUxMOworICAgICAgcmV0LT5jbGFzcyA9IENfTlVMTDsKKyAgICAgIHJldC0+bnVtYXV4ID0gMDsKKyAgICAgIHJldC0+YXV4YmZkID0gTlVMTDsKKyAgICAgIHJldC0+YXV4ID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBJbml0aWFsaXplIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK2Jvb2xlYW4KK19iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCisgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCQljb25zdCBjaGFyICopKTsKK3sKKyAgdGFibGUtPnN0YWJfaW5mbyA9IE5VTEw7CisgIHJldHVybiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOworfQorCisvKiBDcmVhdGUgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikKKwkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBpZiAoISBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwKKwkJCQkJX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKKyAgICB9CisgIHJldHVybiAmcmV0LT5yb290OworfQorCisvKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKQorCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOworICBpZiAocmV0ICE9IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPnR5cGVzID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBHaXZlbiBhIENPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKKyAgIGFwcHJvcHJpYXRlLiAgKi8KKworYm9vbGVhbgorX2JmZF9jb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9vYmplY3Q6CisgICAgICByZXR1cm4gY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7CisgICAgY2FzZSBiZmRfYXJjaGl2ZToKKyAgICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworCSAgICAgIChhYmZkLCBpbmZvLCBjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KSk7CisgICAgZGVmYXVsdDoKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyogQWRkIHN5bWJvbHMgZnJvbSBhIENPRkYgb2JqZWN0IGZpbGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghIGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQorICAgIHsKKyAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBDaGVjayBhIHNpbmdsZSBhcmNoaXZlIGVsZW1lbnQgdG8gc2VlIGlmIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbgorICAgdGhlIGxpbmsuICAqUE5FRURFRCBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzCisgICBuZWVkZWQgaW4gdGhlIGxpbmsgb3Igbm90LiAgVGhpcyBpcyBjYWxsZWQgdmlhCisgICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gKnBuZWVkZWQ7Cit7CisgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCpwbmVlZGVkKQorICAgIHsKKyAgICAgIGlmICghIGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSB8fCAhICpwbmVlZGVkKQorICAgIHsKKyAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBvYmplY3QgZmlsZSBzaG91bGQgYmUKKyAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBib29sZWFuICpwbmVlZGVkOworeworICBib29sZWFuICgqc3ltX2lzX2dsb2JhbCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOworICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKKyAgYmZkX2J5dGUgKmVzeW07CisgIGJmZF9ieXRlICplc3ltX2VuZDsKKworICAqcG5lZWRlZCA9IGZhbHNlOworCisgIHN5bV9pc19nbG9iYWwgPSBjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7CisgIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKKyAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKKworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOworCisgICAgICBpZiAoKHN5bS5uX3NjbGFzcyA9PSBDX0VYVAorCSAgIHx8IHN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKKwkgICB8fCAob2JqX3BlIChhYmZkKSAmJiBzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKQorI2lmZGVmIENfU1lTVEVNCisJICAgfHwgc3ltLm5fc2NsYXNzID09IENfU1lTVEVNCisjZW5kaWYKKwkgICB8fCAoc3ltX2lzX2dsb2JhbCAmJiAoKnN5bV9pc19nbG9iYWwpIChhYmZkLCAmc3ltKSkpCisJICAmJiAoc3ltLm5fc2NudW0gIT0gMCB8fCBzeW0ubl92YWx1ZSAhPSAwKSkKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKKwkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAvKiBUaGlzIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUsIGFuZCBpcyBkZWZpbmVkIGJ5IHRoaXMKKyAgICAgICAgICAgICBvYmplY3QgZmlsZS4gICovCisKKwkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7CisJICBpZiAobmFtZSA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisKKwkgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKKwkgICAgIHVuZGVmaW5lZC4gIElmIGEgc3ltYm9sIGlzIGN1cnJlbnRseSBrbm93biB0byBiZSBjb21tb24sCisJICAgICBDT0ZGIGxpbmtlcnMgZG8gbm90IGJyaW5nIGluIGFuIG9iamVjdCBmaWxlIHdoaWNoIGRlZmluZXMKKwkgICAgIGl0LiAgKi8KKwkgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKwkgICAgeworCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICAqcG5lZWRlZCA9IHRydWU7CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisKKyAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OworICAgIH0KKworICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJvb2xlYW4gKCpzeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7CisgIGJvb2xlYW4ga2VlcF9zeW1zOworICBib29sZWFuIGRlZmF1bHRfY29weTsKKyAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7CisgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworICBiZmRfYnl0ZSAqZXN5bTsKKyAgYmZkX2J5dGUgKmVzeW1fZW5kOworCisgIC8qIEtlZXAgdGhlIHN5bWJvbHMgZHVyaW5nIHRoaXMgZnVuY3Rpb24sIGluIGNhc2UgdGhlIGxpbmtlciBuZWVkcworICAgICB0byByZWFkIHRoZSBnZW5lcmljIHN5bWJvbHMgaW4gb3JkZXIgdG8gcmVwb3J0IGFuIGVycm9yIG1lc3NhZ2UuICAqLworICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpOworICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0gdHJ1ZTsKKworICBzeW1faXNfZ2xvYmFsID0gY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltX2lzX2dsb2JhbDsKKworICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCisgICAgZGVmYXVsdF9jb3B5ID0gZmFsc2U7CisgIGVsc2UKKyAgICBkZWZhdWx0X2NvcHkgPSB0cnVlOworCisgIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOworCisgIC8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZAorICAgICB0byBwYXJ0aWN1bGFyIHN5bWJvbHMuICAqLworICBzeW1faGFzaCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQorCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCSAoKHNpemVfdCkgc3ltY291bnQKKwkJCSAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKKyAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgb2JqX2NvZmZfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKKyAgbWVtc2V0IChzeW1faGFzaCwgMCwKKwkgIChzaXplX3QpIHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisgIEJGRF9BU1NFUlQgKHN5bWVzeiA9PSBiZmRfY29mZl9hdXhlc3ogKGFiZmQpKTsKKyAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKKyAgZXN5bV9lbmQgPSBlc3ltICsgc3ltY291bnQgKiBzeW1lc3o7CisgIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07CisgICAgICBib29sZWFuIGNvcHk7CisKKyAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKKworICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVAorCSAgIHx8IHN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKKwkgICB8fCAob2JqX3BlIChhYmZkKSAmJiBzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKQorI2lmZGVmIENfU1lTVEVNCisJICB8fCBzeW0ubl9zY2xhc3MgPT0gQ19TWVNURU0KKyNlbmRpZgorCSAgfHwgKHN5bV9pc19nbG9iYWwgJiYgKCpzeW1faXNfZ2xvYmFsKSAoYWJmZCwgJnN5bSkpKQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCSAgZmxhZ3dvcmQgZmxhZ3M7CisJICBhc2VjdGlvbiAqc2VjdGlvbjsKKwkgIGJmZF92bWEgdmFsdWU7CisKKwkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZS4gICovCisKKwkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7CisJICBpZiAobmFtZSA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQorICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLworCSAgY29weSA9IGRlZmF1bHRfY29weTsKKwkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAorCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQorCSAgICBjb3B5ID0gdHJ1ZTsKKworCSAgdmFsdWUgPSBzeW0ubl92YWx1ZTsKKworCSAgaWYgKHN5bS5uX3NjbnVtID09IDApCisJICAgIHsKKwkgICAgICBpZiAodmFsdWUgPT0gMCkKKwkJeworCQkgIGZsYWdzID0gMDsKKwkJICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGZsYWdzID0gQlNGX0dMT0JBTDsKKwkJICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOworCSAgICAgIHNlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKKwkgICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQorCQl2YWx1ZSAtPSBzZWN0aW9uLT52bWE7CisJICAgIH0KKworCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQKKwkgICAgICB8fCAob2JqX3BlIChhYmZkKSAmJiBzeW0ubl9zY2xhc3MgPT0gQ19OVF9XRUFLKSkKKwkgICAgZmxhZ3MgPSBCU0ZfV0VBSzsKKworCSAgaWYgKCEgKGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkJIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCisJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgY29weSwgZmFsc2UsCisJCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKHNlY3Rpb24gPT0gYmZkX2NvbV9zZWN0aW9uX3B0cgorCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KKwkgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgorCQkgID4gYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlciAoYWJmZCkpKQorCSAgICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCisJICAgICAgPSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyIChhYmZkKTsKKworCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKKwkgICAgeworCSAgICAgIGlmICgoKCpzeW1faGFzaCktPmNsYXNzID09IENfTlVMTAorCQkgICAmJiAoKnN5bV9oYXNoKS0+dHlwZSA9PSBUX05VTEwpCisJCSAgfHwgc3ltLm5fc2NudW0gIT0gMAorCQkgIHx8IChzeW0ubl92YWx1ZSAhPSAwCisJCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwkJeworCQkgICgqc3ltX2hhc2gpLT5jbGFzcyA9IHN5bS5uX3NjbGFzczsKKwkJICBpZiAoc3ltLm5fdHlwZSAhPSBUX05VTEwpCisJCSAgICB7CisJCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+dHlwZSAhPSBUX05VTEwKKwkJCSAgJiYgKCpzeW1faGFzaCktPnR5cGUgIT0gc3ltLm5fdHlwZSkKKwkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJICAoXygiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiKSwKKwkJCSAgIG5hbWUsICgqc3ltX2hhc2gpLT50eXBlLCBzeW0ubl90eXBlLAorCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCQkgICAgICAoKnN5bV9oYXNoKS0+dHlwZSA9IHN5bS5uX3R5cGU7CisJCSAgICB9CisJCSAgKCpzeW1faGFzaCktPmF1eGJmZCA9IGFiZmQ7CisJCSAgaWYgKHN5bS5uX251bWF1eCAhPSAwKQorCQkgICAgeworCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmFsbG9jOworCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKKwkJICAgICAgYmZkX2J5dGUgKmVhdXg7CisJCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqaWF1eDsKKworCQkgICAgICAoKnN5bV9oYXNoKS0+bnVtYXV4ID0gc3ltLm5fbnVtYXV4OworCQkgICAgICBhbGxvYyA9ICgodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopCisJCQkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKKwkJCQkJCSAgKHN5bS5uX251bWF1eAorCQkJCQkJICAgKiBzaXplb2YgKCphbGxvYykpKSk7CisJCSAgICAgIGlmIChhbGxvYyA9PSBOVUxMKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCSAgICAgIGZvciAoaSA9IDAsIGVhdXggPSBlc3ltICsgc3ltZXN6LCBpYXV4ID0gYWxsb2M7CisJCQkgICBpIDwgc3ltLm5fbnVtYXV4OworCQkJICAgaSsrLCBlYXV4ICs9IHN5bWVzeiwgaWF1eCsrKQorCQkJYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIChQVFIpIGVhdXgsIHN5bS5uX3R5cGUsCisJCQkJCSAgICAgIHN5bS5uX3NjbGFzcywgaSwgc3ltLm5fbnVtYXV4LAorCQkJCQkgICAgICAoUFRSKSBpYXV4KTsKKwkJICAgICAgKCpzeW1faGFzaCktPmF1eCA9IGFsbG9jOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OworICAgICAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIG5vbi10cmFkaXRpb25hbCwgbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCB0cnkgdG8KKyAgICAgb3B0aW1pemUgdGhlIGhhbmRsaW5nIG9mIGFueSAuc3RhYi8uc3RhYnN0ciBzZWN0aW9ucy4gICovCisgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQorICAgICAgJiYgISBpbmZvLT50cmFkaXRpb25hbF9mb3JtYXQKKyAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKQorICAgICAgJiYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCAmJiBpbmZvLT5zdHJpcCAhPSBzdHJpcF9kZWJ1Z2dlcikpCisgICAgeworICAgICAgYXNlY3Rpb24gKnN0YWIsICpzdGFic3RyOworCisgICAgICBzdGFiID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYiIpOworICAgICAgaWYgKHN0YWIgIT0gTlVMTCkKKwl7CisJICBzdGFic3RyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc3RhYnN0ciIpOworCisJICBpZiAoc3RhYnN0ciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKKwkgICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhICpzZWNkYXRhOworCisJICAgICAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzdGFiKTsKKwkgICAgICBpZiAoc2VjZGF0YSA9PSBOVUxMKQorCQl7CisJCSAgc3RhYi0+dXNlZF9ieV9iZmQgPQorCQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKKwkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKKwkJICBpZiAoc3RhYi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHNlY2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc3RhYik7CisJCX0KKworCSAgICAgIHRhYmxlID0gY29mZl9oYXNoX3RhYmxlIChpbmZvKTsKKworCSAgICAgIGlmICghIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLCAmdGFibGUtPnN0YWJfaW5mbywKKwkJCQkJICAgICBzdGFiLCBzdGFic3RyLAorCQkJCQkgICAgICZzZWNkYXRhLT5zdGFiX2luZm8pKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKKyAgcmV0dXJuIGZhbHNlOworfQorDAorLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCisKK2Jvb2xlYW4KK19iZmRfY29mZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKKyAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOworICBib29sZWFuIGRlYnVnX21lcmdlX2FsbG9jYXRlZDsKKyAgYm9vbGVhbiBsb25nX3NlY3Rpb25fbmFtZXM7CisgIGFzZWN0aW9uICpvOworICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7CisgIHNpemVfdCBtYXhfc3ltX2NvdW50OworICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKKyAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKKyAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7CisgIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKKyAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7CisgIHVuc2lnbmVkIGludCByZWxzejsKKyAgZmlsZV9wdHIgbGluZV9maWxlcG9zOworICB1bnNpZ25lZCBpbnQgbGluZXN6OworICBiZmQgKnN1YjsKKyAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7CisgIGNoYXIgc3RyYnVmW1NUUklOR19TSVpFX1NJWkVdOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisKKyAgZmluZm8uaW5mbyA9IGluZm87CisgIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOworICBmaW5mby5zdHJ0YWIgPSBOVUxMOworICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOworICBmaW5mby5sYXN0X2ZpbGVfaW5kZXggPSAtMTsKKyAgZmluZm8ubGFzdF9iZl9pbmRleCA9IC0xOworICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKKyAgZmluZm8uc2VjX3B0cnMgPSBOVUxMOworICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7CisgIGZpbmZvLm91dHN5bXMgPSBOVUxMOworICBmaW5mby5saW5lbm9zID0gTlVMTDsKKyAgZmluZm8uY29udGVudHMgPSBOVUxMOworICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBmaW5mby5nbG9iYWxfdG9fc3RhdGljID0gZmFsc2U7CisgIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOworCisgIGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbyA9IGluZm87CisKKyAgZmluZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKKyAgaWYgKGZpbmZvLnN0cnRhYiA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmICghIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0ICgmZmluZm8uZGVidWdfbWVyZ2UpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSB0cnVlOworCisgIC8qIENvbXB1dGUgdGhlIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHNlY3Rpb25zLiAgKi8KKyAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKKyAgICB7CisgICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBDb3VudCB0aGUgbGluZSBudW1iZXJzIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQorICAgICBvdXRwdXQgZmlsZS4gIFNldCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSByZWxvY3MuICAqLworICByZWxfZmlsZXBvcyA9IG9ial9yZWxvY2Jhc2UgKGFiZmQpOworICByZWxzeiA9IGJmZF9jb2ZmX3JlbHN6IChhYmZkKTsKKyAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOworICBtYXhfbGluZW5vX2NvdW50ID0gMDsKKyAgbWF4X3JlbG9jX2NvdW50ID0gMDsKKworICBsb25nX3NlY3Rpb25fbmFtZXMgPSBmYWxzZTsKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgby0+cmVsb2NfY291bnQgPSAwOworICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKKyAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwl7CisJICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzZWM7CisKKwkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247CisKKwkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisJCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCisJCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAorCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCisJICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7CisKKwkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQorCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCisJCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKKworCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7CisKKwkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKKwkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKKwkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQorCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7CisJICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfcmVsb2NfY291bnQpCisJCW1heF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQorCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCisJICAgICsrby0+cmVsb2NfY291bnQ7CisJfQorICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCisJby0+cmVsX2ZpbGVwb3MgPSAwOworICAgICAgZWxzZQorCXsKKwkgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKKwkgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7CisJICByZWxfZmlsZXBvcyArPSBvLT5yZWxvY19jb3VudCAqIHJlbHN6OworCX0KKworICAgICAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkKKwkgICYmIHN0cmxlbiAoby0+bmFtZSkgPiBTQ05OTUxFTikKKwl7CisJICAvKiBUaGlzIHNlY3Rpb24gaGFzIGEgbG9uZyBuYW1lIHdoaWNoIG11c3QgZ28gaW4gdGhlIHN0cmluZworICAgICAgICAgICAgIHRhYmxlLiAgVGhpcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGNvZGUgaW4KKyAgICAgICAgICAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyB3aGljaCBwdXRzIHRoZSBzdHJpbmcgaW5kZXgKKyAgICAgICAgICAgICBpbnRvIHRoZSBzX25hbWUgZmllbGQgb2YgdGhlIHNlY3Rpb24gaGVhZGVyLiAgVGhhdCBpcyB3aHkKKyAgICAgICAgICAgICB3ZSBwYXNzIGhhc2ggYXMgZmFsc2UuICAqLworCSAgaWYgKF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8uc3RydGFiLCBvLT5uYW1lLCBmYWxzZSwgZmFsc2UpCisJICAgICAgPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGxvbmdfc2VjdGlvbl9uYW1lcyA9IHRydWU7CisJfQorICAgIH0KKworICAvKiBJZiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlCisgICAgIG5lZWQgdG8ga2VlcC4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQorICAgICAgICAgdGhlIHRhcmdldF9pbmRleCBmaWVsZHMgYXJlIDEgYmFzZWQuICAqLworICAgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KKwkoKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCisJIGJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKKwkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7CisgICAgICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBmb3IgKGkgPSAwOyBpIDw9IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKKwl7CisJICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzID0gTlVMTDsKKwkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKKwl9CisgICAgfQorCisgIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKKyAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLworICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKKyAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKKyAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IDA7CisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKKwlvLT5saW5lX2ZpbGVwb3MgPSAwOworICAgICAgZWxzZQorCXsKKwkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKKwkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7CisJfQorCisgICAgICBpZiAoby0+cmVsb2NfY291bnQgIT0gMCkKKwl7CisJICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKKyAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCisgICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKKyAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQorICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCisgICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKKyAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgorCisJICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KKwkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LAorCSAgICAgYnV0IG9ubHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGljaCBpcyBub3QgdGhlCisJICAgICBjb21tb24gY2FzZS4gICovCisJICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOworCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KKwkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKKwkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7CisJICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KKwkgICAgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCisJICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudAorCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKKwkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAorCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCisJICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKKwl9CisKKyAgICAgIC8qIFJlc2V0IHRoZSByZWxvYyBhbmQgbGluZW5vIGNvdW50cywgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8KKwkgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCisgICAgICBvLT5yZWxvY19jb3VudCA9IDA7CisgICAgICBvLT5saW5lbm9fY291bnQgPSAwOworICAgIH0KKworICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gbGluZV9maWxlcG9zOworCisgIC8qIEZpZ3VyZSBvdXQgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYW4gaW5wdXQgQkZELiAgVGFrZQorICAgICB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYXIgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGRzIG9mIGFsbCB0aGUKKyAgICAgaW5wdXQgQkZEJ3MuICAqLworICBtYXhfc3ltX2NvdW50ID0gMDsKKyAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCisgICAgeworICAgICAgc2l6ZV90IHN6OworCisgICAgICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKKyAgICAgIHN6ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7CisgICAgICBpZiAoc3ogPiBtYXhfc3ltX2NvdW50KQorCW1heF9zeW1fY291bnQgPSBzejsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgc29tZSBidWZmZXJzIHVzZWQgd2hpbGUgbGlua2luZy4gICovCisgIGZpbmZvLmludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKKwkJCSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50CisJCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3N5bWVudCkpKTsKKyAgZmluZm8uc2VjX3B0cnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKKwkJCQkJICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOworICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKKyAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKKwkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7CisgIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAorCQkJCSAgICAgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOworICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7CisgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7CisgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQorCQkJICAgICBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQKKwkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7CisgIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQorICAgICAgfHwgKGZpbmZvLnNlY19wdHJzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCisgICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKKyAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAorICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKKyAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKKyAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKQorICAgICAgfHwgKCEgaW5mby0+cmVsb2NhdGVhYmxlCisJICAmJiBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAorCSAgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogV2Ugbm93IGtub3cgdGhlIHBvc2l0aW9uIG9mIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIGV4Y2VwdCB0aGF0CisgICAgIHdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSBhbmQgdGhlcmVmb3JlIHdlIGRvbid0CisgICAgIGtub3cgd2hlcmUgdGhlIHN0cmluZyB0YWJsZSBzdGFydHMuICBXZSBqdXN0IGJ1aWxkIHRoZSBzdHJpbmcKKyAgICAgdGFibGUgaW4gbWVtb3J5IGFzIHdlIGdvIGFsb25nLiAgV2UgcHJvY2VzcyBhbGwgdGhlIHJlbG9jYXRpb25zCisgICAgIGZvciBhIHNpbmdsZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLworICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOworCisgIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJeworCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKKwkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQorCQkgID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKSkKKwkgICAgeworCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7CisJICAgICAgaWYgKCEgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuIChzdWIsICYgZmluZm8pKQorCQl7CisJCSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKKwkgICAgeworCSAgICAgIGlmICghIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCAmZmluZm8sIG8sIHApKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKCEgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCAmIGZpbmZvKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgCisgIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICAqLworCisgIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOworICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKKworICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOworICAgICAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7CisgICAgfQorICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7CisgICAgICBmaW5mby5zZWNfcHRycyA9IE5VTEw7CisgICAgfQorICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7CisgICAgICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7CisgICAgfQorICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOworICAgICAgZmluZm8ubGluZW5vcyA9IE5VTEw7CisgICAgfQorICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5jb250ZW50cyk7CisgICAgICBmaW5mby5jb250ZW50cyA9IE5VTEw7CisgICAgfQorICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKKyAgICAgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7CisgICAgfQorICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKKyAgICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzeW1ib2wKKyAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbC4gIFdyaXRlIGl0IG91dCBhZ2FpbiBpZgorICAgICBuZWNlc3NhcnkuICAqLworICBpZiAoZmluZm8ubGFzdF9maWxlX2luZGV4ICE9IC0xCisgICAgICAmJiAodW5zaWduZWQgaW50KSBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSAhPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkpCisgICAgeworICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7CisgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZmaW5mby5sYXN0X2ZpbGUsCisJCQkgICAgIChQVFIpIGZpbmZvLm91dHN5bXMpOworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKKwkJICAgICArIGZpbmZvLmxhc3RfZmlsZV9pbmRleCAqIHN5bWVzeiksCisJCSAgICBTRUVLX1NFVCkgIT0gMAorCSAgfHwgYmZkX3dyaXRlIChmaW5mby5vdXRzeW1zLCBzeW1lc3osIDEsIGFiZmQpICE9IHN5bWVzeikKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZyAobGQgLS10YXNrLWxpbmspIHRoZW4gbWFrZSBhIHBhc3MgdGhyb3VnaCB0aGUKKyAgICAgZ2xvYmFsIHN5bWJvbHMsIHdyaXRpbmcgb3V0IGFueSB0aGF0IGFyZSBkZWZpbmVkLCBhbmQgbWFraW5nIHRoZW0KKyAgICAgc3RhdGljLiAqLworICBpZiAoaW5mby0+dGFza19saW5rKQorICAgIHsKKyAgICAgIGZpbmZvLmZhaWxlZCA9IGZhbHNlOworICAgICAgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMsCisJCQkgICAgICAgKFBUUikgJmZpbmZvKTsKKyAgICAgIGlmIChmaW5mby5mYWlsZWQpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIC8qIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLworICBmaW5mby5mYWlsZWQgPSBmYWxzZTsKKyAgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLAorCQkJICAgKFBUUikgJmZpbmZvKTsKKyAgaWYgKGZpbmZvLmZhaWxlZCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgb3V0c3ltcyBidWZmZXIgaXMgdXNlZCBieSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bS4gICovCisgIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7CisgICAgICBmaW5mby5vdXRzeW1zID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSAmJiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cKKwkgdGhlIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbgorCSBmaW5hbGx5IHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KKyAgICAgIGV4dGVybmFsX3JlbG9jcyA9ICgoYmZkX2J5dGUgKikKKwkJCSBiZmRfbWFsbG9jIChtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICogcmVsc3opKTsKKyAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJeworCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOworCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOworCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7CisJICBiZmRfYnl0ZSAqZXJlbDsKKworCSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCisJICAgIGNvbnRpbnVlOworCisJICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOworCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKKwkgIHJlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlczsKKwkgIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7CisJICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKKwkgICAgeworCSAgICAgIGlmICgqcmVsX2hhc2ggIT0gTlVMTCkKKwkJeworCQkgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOworCQkgIGlyZWwtPnJfc3ltbmR4ID0gKCpyZWxfaGFzaCktPmluZHg7CisJCX0KKwkgICAgICBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgKFBUUikgaXJlbCwgKFBUUikgZXJlbCk7CisJICAgIH0KKworCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgcmVsc3osIG8tPnJlbG9jX2NvdW50LAorCQkJICAgIGFiZmQpICE9IHJlbHN6ICogby0+cmVsb2NfY291bnQpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKKyAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLworICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCisJeworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7CisJICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOworCX0KKyAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7CisgICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOworICAgIH0KKworICAvKiBJZiB3ZSBoYXZlIG9wdGltaXplZCBzdGFicyBzdHJpbmdzLCBvdXRwdXQgdGhlbS4gICovCisgIGlmIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZS4gICovCisgIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgIT0gMCB8fCBsb25nX3NlY3Rpb25fbmFtZXMpCisgICAgeworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKKwkJICAgICArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCisJCSAgICBTRUVLX1NFVCkgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKKyAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwKKwkJICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAorCQkgICAgKGJmZF9ieXRlICopIHN0cmJ1Zik7CisjZWxzZQorICNlcnJvciBDaGFuZ2UgYmZkX2hfcHV0XzMyCisjZW5kaWYKKworICAgICAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZmluZm8uc3RydGFiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7CisKKyAgLyogU2V0dGluZyBiZmRfZ2V0X3N5bWNvdW50IHRvIDAgd2lsbCBjYXVzZSB3cml0ZV9vYmplY3RfY29udGVudHMgdG8KKyAgICAgbm90IHRyeSB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLworICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQpCisgICAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7CisgIGlmIChmaW5mby5zdHJ0YWIgIT0gTlVMTCkKKyAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOworICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCisJeworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7CisJICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOworCX0KKyAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7CisgICAgfQorICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOworICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7CisgIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKKyAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKKyAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKKyAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoZmluZm8uY29udGVudHMpOworICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKKyAgaWYgKGZpbmZvLmludGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3JlbG9jcyk7CisgIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIHBhcnNlIG91dCBhIC1oZWFwIDxyZXNlcnZlZD4sPGNvbW1pdD4gbGluZSAqLworCitzdGF0aWMgY2hhciAqCitkb3Jlc19jb20gKHB0ciwgb3V0cHV0X2JmZCwgaGVhcCkKKyAgICAgY2hhciAqcHRyOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGludCBoZWFwOworeworICBpZiAoY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkgCisgICAgeworICAgICAgaW50IHZhbCA9IHN0cnRvdWwgKHB0ciwgJnB0ciwgMCk7CisgICAgICBpZiAoaGVhcCkKKwlwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mSGVhcFJlc2VydmUgPXZhbDsKKyAgICAgIGVsc2UKKwlwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuU2l6ZU9mU3RhY2tSZXNlcnZlID12YWw7CisKKyAgICAgIGlmIChwdHJbMF0gPT0gJywnKSAKKwl7CisJICBpbnQgdmFsID0gc3RydG91bCAocHRyKzEsICZwdHIsIDApOworCSAgaWYgKGhlYXApCisJICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZIZWFwQ29tbWl0ID12YWw7CisJICBlbHNlCisJICAgIHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZTdGFja0NvbW1pdCA9dmFsOworCX0KKyAgICB9CisgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfbmFtZShwdHIsIGRzdCkKK2NoYXIgKnB0cjsKK2NoYXIgKipkc3Q7Cit7CisgIHdoaWxlICgqcHRyID09ICcgJykKKyAgICBwdHIrKzsKKyAgKmRzdCA9IHB0cjsKKyAgd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCisgICAgcHRyKys7CisgICpwdHIgPSAwOworICByZXR1cm4gcHRyKzE7Cit9CisKKy8qIFByb2Nlc3MgYW55IG1hZ2ljIGVtYmVkZGVkIGNvbW1hbmRzIGluIGEgc2VjdGlvbiBjYWxsZWQgLmRyZWN0dmUgKi8KKwkJCQorc3RhdGljIGludAorcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyAob3V0cHV0X2JmZCwgaW5mbywgIGFiZmQpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRyZWN0dmUiKTsKKyAgY2hhciAqczsKKyAgY2hhciAqZTsKKyAgY2hhciAqY29weTsKKyAgaWYgKCFzZWMpIAorICAgIHJldHVybiAxOworICAKKyAgY29weSA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHNlYy0+X3Jhd19zaXplKTsKKyAgaWYgKCFjb3B5KSAKKyAgICByZXR1cm4gMDsKKyAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGFiZmQsIHNlYywgY29weSwgMCwgc2VjLT5fcmF3X3NpemUpKSAKKyAgICB7CisgICAgICBmcmVlIChjb3B5KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZSA9IGNvcHkgKyBzZWMtPl9yYXdfc2l6ZTsKKyAgZm9yIChzID0gY29weTsgIHMgPCBlIDsgKSAKKyAgICB7CisgICAgICBpZiAoc1swXSE9ICctJykgeworCXMrKzsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChzLCItYXR0ciIsIDUpID09IDApCisJeworCSAgY2hhciAqbmFtZTsKKwkgIGNoYXIgKmF0dHJpYnM7CisJICBhc2VjdGlvbiAqYXNlYzsKKworCSAgaW50IGxvb3AgPSAxOworCSAgaW50IGhhZF93cml0ZSA9IDA7CisJICBpbnQgaGFkX3JlYWQgPSAwOworCSAgaW50IGhhZF9leGVjPSAwOworCSAgaW50IGhhZF9zaGFyZWQ9IDA7CisJICBzICs9IDU7CisJICBzID0gZ2V0X25hbWUocywgJm5hbWUpOworCSAgcyA9IGdldF9uYW1lKHMsICZhdHRyaWJzKTsKKwkgIHdoaWxlIChsb29wKSB7CisJICAgIHN3aXRjaCAoKmF0dHJpYnMrKykgCisJICAgICAgeworCSAgICAgIGNhc2UgJ1cnOgorCQloYWRfd3JpdGUgPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlICdSJzoKKwkJaGFkX3JlYWQgPSAxOworCQlicmVhazsKKwkgICAgICBjYXNlICdTJzoKKwkJaGFkX3NoYXJlZCA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ1gnOgorCQloYWRfZXhlYyA9IDE7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCWxvb3AgPSAwOworCSAgICAgIH0KKwkgIH0KKwkgIGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7CisJICBpZiAoYXNlYykgeworCSAgICBpZiAoaGFkX2V4ZWMpCisJICAgICAgYXNlYy0+ZmxhZ3MgfD0gU0VDX0NPREU7CisJICAgIGlmICghaGFkX3dyaXRlKQorCSAgICAgIGFzZWMtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKKwkgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCItaGVhcCIsIDUpID09IDApCisJeworCSAgcyA9IGRvcmVzX2NvbSAocys1LCBvdXRwdXRfYmZkLCAxKTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCItc3RhY2siLCA2KSA9PSAwKQorCXsKKwkgIHMgPSBkb3Jlc19jb20gKHMrNiwgb3V0cHV0X2JmZCwgMCk7CisJfQorICAgICAgZWxzZSAKKwlzKys7CisgICAgfQorICBmcmVlIChjb3B5KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFBsYWNlIGEgbWFya2VyIGFnYWluc3QgYWxsIHN5bWJvbHMgd2hpY2ggYXJlIHVzZWQgYnkgcmVsb2NhdGlvbnMuCisgICBUaGlzIG1hcmtlciBjYW4gYmUgcGlja2VkIHVwIGJ5IHRoZSAnZG8gd2Ugc2tpcCB0aGlzIHN5bWJvbCA/JworICAgbG9vcCBpbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQoKSBhbmQgdXNlZCB0byBwcmV2ZW50IHNraXBwaW5nCisgICB0aGF0IHN5bWJvbC4gCisgICAqLworCitzdGF0aWMgdm9pZAorbWFya19yZWxvY3MgKGZpbmZvLCBpbnB1dF9iZmQpCisgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqCWZpbmZvOworICAgICBiZmQgKiAJCQkJaW5wdXRfYmZkOworeworICBhc2VjdGlvbiAqIGE7CisKKyAgaWYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGlucHV0X2JmZCkgJiBIQVNfU1lNUykgPT0gMCkKKyAgICByZXR1cm47CisgIAorICBmb3IgKGEgPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpbnRlcm5hbF9yZWxvY3M7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpcmVsOworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICoJaXJlbGVuZDsKKworICAgICAgCisgICAgICBpZiAoKGEtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwIHx8IGEtPnJlbG9jX2NvdW50ICA8IDEpCisJY29udGludWU7CisKKyAgICAgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCisgICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKKwkoaW5wdXRfYmZkLCBhLCBmYWxzZSwKKwkgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKKwkgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSwKKwkgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKKwkgID8gKGZpbmZvLT5zZWN0aW9uX2luZm9bIGEtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXggXS5yZWxvY3MgKyBhLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpCisJICA6IGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MpCisJKTsKKyAgICAgIAorICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICBpcmVsICAgICA9IGludGVybmFsX3JlbG9jczsKKyAgICAgIGlyZWxlbmQgID0gaXJlbCArIGEtPnJlbG9jX2NvdW50OworCisgICAgICAvKiBQbGFjZSBhIG1hcmsgaW4gdGhlIHN5bV9pbmRpY2VzIGFycmF5ICh3aG9zZSBlbnRyaWVzIGhhdmUKKwkgYmVlbiBpbml0aWFsaXNlZCB0byAwKSBmb3IgYWxsIG9mIHRoZSBzeW1ib2xzIHRoYXQgYXJlIHVzZWQKKwkgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUuICBUaGlzIHdpbGwgdGhlbiBiZSBwaWNrZWQgdXAgaW4gdGhlCisJIHNraXAvZG9uJ3QgcGFzcyAqLworICAgICAgCisgICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKKwl7CisJICBmaW5mby0+c3ltX2luZGljZXNbIGlyZWwtPnJfc3ltbmR4IF0gPSAtMTsKKwl9CisgICAgfQorfQorCisvKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgorICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KKworYm9vbGVhbgorX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQorICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKK3sKKyAgYm9vbGVhbiAoKnN5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKKyAgYm9vbGVhbiAoKmFkanVzdF9zeW1uZHgpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKKwkJCQkgICAgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCisJCQkJICAgIGJvb2xlYW4gKikpOworICBiZmQgKm91dHB1dF9iZmQ7CisgIGNvbnN0IGNoYXIgKnN0cmluZ3M7CisgIGJmZF9zaXplX3R5cGUgc3ltZW50X2Jhc2U7CisgIHVuc2lnbmVkIGludCBuX3RtYXNrOworICB1bnNpZ25lZCBpbnQgbl9idHNoZnQ7CisgIGJvb2xlYW4gY29weSwgaGFzaDsKKyAgYmZkX3NpemVfdHlwZSBpc3ltZXN6OworICBiZmRfc2l6ZV90eXBlIG9zeW1lc3o7CisgIGJmZF9zaXplX3R5cGUgbGluZXN6OworICBiZmRfYnl0ZSAqZXN5bTsKKyAgYmZkX2J5dGUgKmVzeW1fZW5kOworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc3ltcDsKKyAgYXNlY3Rpb24gKipzZWNwcDsKKyAgbG9uZyAqaW5kZXhwOworICB1bnNpZ25lZCBsb25nIG91dHB1dF9pbmRleDsKKyAgYmZkX2J5dGUgKm91dHN5bTsKKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7CisgIGFzZWN0aW9uICpvOworCisgIC8qIE1vdmUgYWxsIHRoZSBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisKKyAgb3V0cHV0X2JmZCA9IGZpbmZvLT5vdXRwdXRfYmZkOworICBzeW1faXNfZ2xvYmFsID0gY29mZl9iYWNrZW5kX2luZm8gKGlucHV0X2JmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsOworICBzdHJpbmdzID0gTlVMTDsKKyAgc3ltZW50X2Jhc2UgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7CisgIGlzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGlucHV0X2JmZCk7CisgIG9zeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOworICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGlucHV0X2JmZCk7CisgIEJGRF9BU1NFUlQgKGxpbmVzeiA9PSBiZmRfY29mZl9saW5lc3ogKG91dHB1dF9iZmQpKTsKKworICBuX3RtYXNrID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX3RtYXNrOworICBuX2J0c2hmdCA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl9idHNoZnQ7CisKKyAgLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IElTRkNOLCBldC4gYWwuLCBtYWNyb3Mgd29yayBjb3JyZWN0bHkuICAqLworI2RlZmluZSBOX1RNQVNLIG5fdG1hc2sKKyNkZWZpbmUgTl9CVFNIRlQgbl9idHNoZnQKKworICBjb3B5ID0gZmFsc2U7CisgIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKKyAgICBjb3B5ID0gdHJ1ZTsKKyAgaGFzaCA9IHRydWU7CisgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQorICAgIGhhc2ggPSBmYWxzZTsKKworICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGlucHV0X2JmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKKyAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OworICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOworICBzZWNwcCA9IGZpbmZvLT5zZWNfcHRyczsKKyAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOworICBvdXRwdXRfaW5kZXggPSBzeW1lbnRfYmFzZTsKKyAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7CisKKyAgaWYgKGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnBlKQorICAgIHsKKyAgICAgIGlmICghIHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBpbnB1dF9iZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIHBlcmZvcm0gcmVsb2NhdGlvbnMgYW5kIGFsc28gc3RyaXAvZGlzY2FyZCBzb21lIHN5bWJvbHMKKyAgICAgdGhlbiB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdHJpcC9kaXNjYXJkIHRob3NlIHN5bWJvbHMgdGhhdCBhcmUKKyAgICAgZ29pbmcgdG8gYmUgaW52b2x2ZWQgaW4gdGhlIHJlbG9jYXRpb25zICovCisgIGlmICgoICAgZmluZm8tPmluZm8tPnN0cmlwICAgIT0gc3RyaXBfbm9uZQorICAgICAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKKyAgICAgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgeworICAgICAgLyogbWFyayB0aGUgc3ltYm9sIGFycmF5IGFzICdub3QtdXNlZCcgKi8KKyAgICAgIG1lbXNldCAoaW5kZXhwLCAwLCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIHNpemVvZiAqIGluZGV4cCk7IAorICAgICAgIAorICAgICAgbWFya19yZWxvY3MgKGZpbmZvLCBpbnB1dF9iZmQpOworICAgIH0KKworICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKKyAgICAgIGJvb2xlYW4gc2tpcDsKKyAgICAgIGJvb2xlYW4gZ2xvYmFsOworICAgICAgYm9vbGVhbiBkb250X3NraXBfc3ltYm9sOworICAgICAgaW50IGFkZDsKKworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgKFBUUikgaXN5bXApOworCisgICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgorCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KKwkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCisJIHRoZSBzeW1ib2wuICAqLworICAgICAgaXN5bSA9ICppc3ltcDsKKworICAgICAgaWYgKGlzeW0ubl9zY251bSAhPSAwKQorCSpzZWNwcCA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLm5fc2NudW0pOworICAgICAgZWxzZQorCXsKKwkgIGlmIChpc3ltLm5fdmFsdWUgPT0gMCkKKwkgICAgKnNlY3BwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgIGVsc2UKKwkgICAgKnNlY3BwID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKwl9CisKKyAgICAgIC8qIEV4dHJhY3QgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN5bWJvbCBpcyB1c2VkIGJ5IGEKKyAgICAgICAgIHJlbG9jYXRpb24uICAqLworICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQorCSAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkICE9IGRpc2NhcmRfbm9uZSkKKwkgICYmIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCisJZG9udF9za2lwX3N5bWJvbCA9ICppbmRleHA7CisgICAgICBlbHNlCisJZG9udF9za2lwX3N5bWJvbCA9IGZhbHNlOworICAgICAgCisgICAgICAqaW5kZXhwID0gLTE7CisKKyAgICAgIHNraXAgPSBmYWxzZTsKKyAgICAgIGdsb2JhbCA9IGZhbHNlOworICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7CisKKyAgICAgIC8qIElmIHdlIGFyZSBzdHJpcHBpbmcgYWxsIHN5bWJvbHMsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIG9uZS4gICovCisgICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCisJc2tpcCA9IHRydWU7CisKKyAgICAgIGlmICghIHNraXApCisJeworCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKKwkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAorCSAgICAgIHx8IChvYmpfcGUgKGlucHV0X2JmZCkgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspCisjaWZkZWYgQ19TWVNURU0KKwkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfU1lTVEVNCisjZW5kaWYKKwkgICAgICB8fCAoc3ltX2lzX2dsb2JhbCAmJiAoKnN5bV9pc19nbG9iYWwpIChpbnB1dF9iZmQsICZpc3ltKSkpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gIEdsb2JhbCBzeW1ib2xzIGNvbWUgYXQgdGhlCisJCSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwgc28gc2tpcCB0aGVtIGZvciBub3cuCisJCSBMb2NhbGx5IGRlZmluZWQgZnVuY3Rpb24gc3ltYm9scywgaG93ZXZlciwgYXJlIGFuCisJCSBleGNlcHRpb24sIGFuZCBhcmUgbm90IG1vdmVkIHRvIHRoZSBlbmQuICAqLworCSAgICAgIGdsb2JhbCA9IHRydWU7CisJICAgICAgaWYgKCEgSVNGQ04gKGlzeW0ubl90eXBlKSB8fCBpc3ltLm5fc2NudW0gPT0gMCkKKwkJc2tpcCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICBTa2lwIGl0IGlmIHdlIGFyZSBkaXNjYXJkaW5nCisgICAgICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuICAqLworCSAgICAgIGlmIChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCAmJiAhIGRvbnRfc2tpcF9zeW1ib2wpCisJCXNraXAgPSB0cnVlOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiB3ZSBzdHJpcHBpbmcgZGVidWdnaW5nIHN5bWJvbHMsIGFuZCB0aGlzIGlzIGEgZGVidWdnaW5nCisgICAgICAgICBzeW1ib2wsIHRoZW4gc2tpcCBpdC4gIEZJWE1FOiBnYXMgc2V0cyB0aGUgc2VjdGlvbiB0byBOX0FCUworICAgICAgICAgZm9yIHNvbWUgdHlwZXMgb2YgZGVidWdnaW5nIHN5bWJvbHM7IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCisgICAgICAgICBhIGJ1ZyBvciBub3QuICBJbiBhbnkgY2FzZSwgd2UgaGFuZGxlIGl0IGhlcmUuICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCisJICAmJiAhIGRvbnRfc2tpcF9zeW1ib2wKKwkgICYmIChpc3ltLm5fc2NudW0gPT0gTl9ERUJVRworCSAgICAgIHx8IChpc3ltLm5fc2NudW0gPT0gTl9BQlMKKwkJICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0FVVE8KKwkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1JFRworCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9TCisJCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT0UKKwkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PVQorCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfQVJHCisJCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19SRUdQQVJNCisJCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19GSUVMRAorCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRU9TKSkpKQorCXNraXAgPSB0cnVlOworCisgICAgICAvKiBJZiBzb21lIHN5bWJvbHMgYXJlIHN0cmlwcGVkIGJhc2VkIG9uIHRoZSBuYW1lLCB3b3JrIG91dCB0aGUKKwkgbmFtZSBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gc2tpcCB0aGlzIHN5bWJvbC4gICovCisgICAgICBpZiAoISBza2lwCisJICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKKwkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpKQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCisJICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOworCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAoISBkb250X3NraXBfc3ltYm9sCisJICAgICAgJiYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQorCQkgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKKwkJCQkgICAgZmFsc2UpID09IE5VTEwpKQorCQkgICB8fCAoISBnbG9iYWwKKwkJICAgICAgICYmIGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAorCQkgICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKSkKKwkgICAgc2tpcCA9IHRydWU7CisJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIGVudW0sIHN0cnVjdCwgb3IgdW5pb24gdGFnLCBzZWUgaWYgd2UgaGF2ZQorICAgICAgICAgYWxyZWFkeSBvdXRwdXQgYW4gaWRlbnRpY2FsIHR5cGUuICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgKGZpbmZvLT5vdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpID09IDAKKwkgICYmIChpc3ltLm5fc2NsYXNzID09IENfRU5UQUcKKwkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfU1RSVEFHCisJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1VOVEFHKQorCSAgJiYgaXN5bS5uX251bWF1eCA9PSAxKQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqbWg7CisJICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICptdDsKKwkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7CisJICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICoqZXBwOworCSAgYmZkX2J5dGUgKmVzbCwgKmVzbGVuZDsKKwkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzbHA7CisKKwkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sIGJ1Zik7CisJICBpZiAobmFtZSA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIC8qIElnbm9yZSBmYWtlIG5hbWVzIGludmVudGVkIGJ5IGNvbXBpbGVyOyB0cmVhdCB0aGVtIGFsbCBhcworICAgICAgICAgICAgIHRoZSBzYW1lIG5hbWUuICAqLworCSAgaWYgKCpuYW1lID09ICd+JyB8fCAqbmFtZSA9PSAnLicgfHwgKm5hbWUgPT0gJyQnCisJICAgICAgfHwgKCpuYW1lID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5wdXRfYmZkKQorCQkgICYmIChuYW1lWzFdID09ICd+JyB8fCBuYW1lWzFdID09ICcuJyB8fCBuYW1lWzFdID09ICckJykpKQorCSAgICBuYW1lID0gIiI7CisKKwkgIG1oID0gY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCAoJmZpbmZvLT5kZWJ1Z19tZXJnZSwgbmFtZSwKKwkJCQkJICAgICB0cnVlLCB0cnVlKTsKKwkgIGlmIChtaCA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHR5cGUgaW5mb3JtYXRpb24uICBJZiB0aGlzIHR1cm5zCisgICAgICAgICAgICAgb3V0IHRvIGJlIGEgZHVwbGljYXRlLCB3ZSBwYXNzIHRoaXMgYWRkcmVzcyB0bworICAgICAgICAgICAgIGJmZF9yZWxlYXNlLiAgKi8KKwkgIG10ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICopCisJCWJmZF9hbGxvYyAoaW5wdXRfYmZkLAorCQkJICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlKSkpOworCSAgaWYgKG10ID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIG10LT5jbGFzcyA9IGlzeW0ubl9zY2xhc3M7CisKKwkgIC8qIFBpY2sgdXAgdGhlIGF1eCBlbnRyeSwgd2hpY2ggcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIHRhZworICAgICAgICAgICAgIGVudHJpZXMuICAqLworCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzeW0gKyBpc3ltZXN6KSwKKwkJCQlpc3ltLm5fdHlwZSwgaXN5bS5uX3NjbGFzcywgMCwgaXN5bS5uX251bWF1eCwKKwkJCQkoUFRSKSAmYXV4KTsKKworCSAgLyogR2F0aGVyIHRoZSBlbGVtZW50cy4gICovCisJICBlcHAgPSAmbXQtPmVsZW1lbnRzOworCSAgbXQtPmVsZW1lbnRzID0gTlVMTDsKKwkgIGlzbHAgPSBpc3ltcCArIDI7CisJICBlc2wgPSBlc3ltICsgMiAqIGlzeW1lc3o7CisJICBlc2xlbmQgPSAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkKKwkJICAgICsgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgKiBpc3ltZXN6KTsKKwkgIHdoaWxlIChlc2wgPCBlc2xlbmQpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICplbGVuYW1lOworCSAgICAgIGNoYXIgZWxlYnVmW1NZTU5NTEVOICsgMV07CisJICAgICAgY2hhciAqY29weTsKKworCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzbCwgKFBUUikgaXNscCk7CisKKwkgICAgICAqZXBwID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICopCisJCSAgICAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAorCQkJCSBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQpKSk7CisJICAgICAgaWYgKCplcHAgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgZWxlbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBpc2xwLAorCQkJCQkJCWVsZWJ1Zik7CisJICAgICAgaWYgKGVsZW5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgY29weSA9IChjaGFyICopIGJmZF9hbGxvYyAoaW5wdXRfYmZkLCBzdHJsZW4gKGVsZW5hbWUpICsgMSk7CisJICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIHN0cmNweSAoY29weSwgZWxlbmFtZSk7CisKKwkgICAgICAoKmVwcCktPm5hbWUgPSBjb3B5OworCSAgICAgICgqZXBwKS0+dHlwZSA9IGlzbHAtPm5fdHlwZTsKKwkgICAgICAoKmVwcCktPnRhZ25keCA9IDA7CisJICAgICAgaWYgKGlzbHAtPm5fbnVtYXV4ID49IDEKKwkJICAmJiBpc2xwLT5uX3R5cGUgIT0gVF9OVUxMCisJCSAgJiYgaXNscC0+bl9zY2xhc3MgIT0gQ19FT1MpCisJCXsKKwkJICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgZWxlYXV4OworCQkgIGxvbmcgaW5keDsKKworCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIChlc2wgKyBpc3ltZXN6KSwKKwkJCQkJaXNscC0+bl90eXBlLCBpc2xwLT5uX3NjbGFzcywgMCwKKwkJCQkJaXNscC0+bl9udW1hdXgsIChQVFIpICZlbGVhdXgpOworCQkgIGluZHggPSBlbGVhdXgueF9zeW0ueF90YWduZHgubDsKKworCQkgIC8qIEZJWE1FOiBJZiB0aGlzIHRhZ25keCBlbnRyeSByZWZlcnMgdG8gYSBzeW1ib2wKKwkJICAgICBkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZSwgd2UganVzdCBpZ25vcmUgaXQuCisJCSAgICAgSGFuZGxpbmcgdGhpcyBjb3JyZWN0bHkgd291bGQgYmUgdGVkaW91cywgYW5kIG1heQorCQkgICAgIG5vdCBiZSByZXF1aXJlZC4gICovCisKKwkJICBpZiAoaW5keCA+IDAKKwkJICAgICAgJiYgKGluZHgKKwkJCSAgPCAoKGVzeW0gLQorCQkJICAgICAgKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCisJCQkgICAgIC8gKGxvbmcpIGlzeW1lc3opKSkKKwkJICAgIHsKKwkJICAgICAgKCplcHApLT50YWduZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07CisJCSAgICAgIGlmICgoKmVwcCktPnRhZ25keCA8IDApCisJCQkoKmVwcCktPnRhZ25keCA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgICBlcHAgPSAmKCplcHApLT5uZXh0OworCSAgICAgICplcHAgPSBOVUxMOworCisJICAgICAgZXNsICs9IChpc2xwLT5uX251bWF1eCArIDEpICogaXN5bWVzejsKKwkgICAgICBpc2xwICs9IGlzbHAtPm5fbnVtYXV4ICsgMTsKKwkgICAgfQorCisJICAvKiBTZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZGVmaW5pdGlvbiB3aGljaCBtYXRjaGVzIHRoaXMKKyAgICAgICAgICAgICB0eXBlLiAgV2UgYWx3YXlzIG91dHB1dCB0aGUgdHlwZSBpZiBpdCBoYXMgbm8gZWxlbWVudHMsCisgICAgICAgICAgICAgZm9yIHNpbXBsaWNpdHkuICAqLworCSAgaWYgKG10LT5lbGVtZW50cyA9PSBOVUxMKQorCSAgICBiZmRfcmVsZWFzZSAoaW5wdXRfYmZkLCAoUFRSKSBtdCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICptdGw7CisKKwkgICAgICBmb3IgKG10bCA9IG1oLT50eXBlczsgbXRsICE9IE5VTEw7IG10bCA9IG10bC0+bmV4dCkKKwkJeworCQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKm1lLCAqbWVsOworCisJCSAgaWYgKG10bC0+Y2xhc3MgIT0gbXQtPmNsYXNzKQorCQkgICAgY29udGludWU7CisKKwkJICBmb3IgKG1lID0gbXQtPmVsZW1lbnRzLCBtZWwgPSBtdGwtPmVsZW1lbnRzOworCQkgICAgICAgbWUgIT0gTlVMTCAmJiBtZWwgIT0gTlVMTDsKKwkJICAgICAgIG1lID0gbWUtPm5leHQsIG1lbCA9IG1lbC0+bmV4dCkKKwkJICAgIHsKKwkJICAgICAgaWYgKHN0cmNtcCAobWUtPm5hbWUsIG1lbC0+bmFtZSkgIT0gMAorCQkJICB8fCBtZS0+dHlwZSAhPSBtZWwtPnR5cGUKKwkJCSAgfHwgbWUtPnRhZ25keCAhPSBtZWwtPnRhZ25keCkKKwkJCWJyZWFrOworCQkgICAgfQorCisJCSAgaWYgKG1lID09IE5VTEwgJiYgbWVsID09IE5VTEwpCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgaWYgKG10bCA9PSBOVUxMIHx8IChiZmRfc2l6ZV90eXBlKSBtdGwtPmluZHggPj0gc3ltZW50X2Jhc2UpCisJCXsKKwkJICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBkZWZpbml0aW9uIG9mIHRoaXMgdHlwZS4gICovCisJCSAgbXQtPmluZHggPSBvdXRwdXRfaW5kZXg7CisJCSAgbXQtPm5leHQgPSBtaC0+dHlwZXM7CisJCSAgbWgtPnR5cGVzID0gbXQ7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBUaGlzIGlzIGEgcmVkZWZpbml0aW9uIHdoaWNoIGNhbiBiZSBtZXJnZWQuICAqLworCQkgIGJmZF9yZWxlYXNlIChpbnB1dF9iZmQsIChQVFIpIG10KTsKKwkJICAqaW5kZXhwID0gbXRsLT5pbmR4OworCQkgIGFkZCA9IChlc2xlbmQgLSBlc3ltKSAvIGlzeW1lc3o7CisJCSAgc2tpcCA9IHRydWU7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgLyogV2Ugbm93IGtub3cgd2hldGhlciB3ZSBhcmUgdG8gc2tpcCB0aGlzIHN5bWJvbCBvciBub3QuICAqLworICAgICAgaWYgKCEgc2tpcCkKKwl7CisJICAvKiBBZGp1c3QgdGhlIHN5bWJvbCBpbiBvcmRlciB0byBvdXRwdXQgaXQuICAqLworCisJICBpZiAoaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCisJICAgICAgJiYgaXN5bS5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQorCSAgICB7CisJICAgICAgY29uc3QgY2hhciAqbmFtZTsKKwkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7CisKKwkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBsb25nIG5hbWUuICBFbnRlciBpdCBpbiB0aGUgc3RyaW5nCisJCSB0YWJsZSB3ZSBhcmUgYnVpbGRpbmcuICBOb3RlIHRoYXQgd2UgZG8gbm90IGNoZWNrCisJCSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnLiAgVGhhdCBpcyBvbmx5IHRydWUgZm9yCisJCSBYQ09GRiwgYW5kIFhDT0ZGIHJlcXVpcmVzIGRpZmZlcmVudCBsaW5raW5nIGNvZGUKKwkJIGFueWhvdy4gICovCisJICAgICAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwKKwkJCQkJCSAgICAgKGNoYXIgKikgTlVMTCk7CisJICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIG5hbWUsIGhhc2gsIGNvcHkpOworCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKKwkgICAgfQorCisJICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKKwkgICAgeworCSAgICAgIGlzeW0ubl9zY251bSA9ICgqc2VjcHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworCSAgICAgIGlzeW0ubl92YWx1ZSArPSAoKnNlY3BwKS0+b3V0cHV0X29mZnNldDsKKwkgICAgICBpZiAoISBvYmpfcGUgKGlucHV0X2JmZCkpCisJCWlzeW0ubl92YWx1ZSAtPSAoKnNlY3BwKS0+dm1hOworCSAgICAgIGlmICghIG9ial9wZSAoZmluZm8tPm91dHB1dF9iZmQpKQorCQlpc3ltLm5fdmFsdWUgKz0gKCpzZWNwcCktPm91dHB1dF9zZWN0aW9uLT52bWE7CisJICAgIH0KKworCSAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZQorCSAgICAgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wKKwkgICAgIGlzIHRoZSBzeW1ib2wgaW5kZXggdG8gdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbAorCSAgICAgKGFjdHVhbGx5LCBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgZG9lcyBub3QgZ2V0IHRoaXMKKwkgICAgIHJpZ2h0LS1pdCBqdXN0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wKKwkgICAgIHRvIHplcm8tLWFuZCBub2JvZHkgaGFzIGV2ZXIgY29tcGxhaW5lZCBhYm91dCBpdCkuICBXZQorCSAgICAgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2Ugd3JpdGUgdGhlCisJICAgICBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5IGhhdmUgdG8gd3JpdGUKKwkgICAgIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KKwkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRklMRSkKKwkgICAgeworCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCisJCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCisJCXsKKwkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBlbnRyeS4gICovCisJCSAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OworCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0IGZpbGUuICAqLworCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCisJCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCisJCQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCisJCQkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXgKKwkJCQkJCQktIHN5bWVudF9iYXNlKQorCQkJCQkJICAgICAgICogb3N5bWVzeikpKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdCBDX0ZJTEUKKwkJCSBzeW1ib2wuICBXZSBuZWVkIHRvIHdyaXRlIGl0IG91dCBhZ2Fpbi4gIFdlCisJCQkgYm9ycm93ICpvdXRzeW0gdGVtcG9yYXJpbHkuICAqLworCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCisJCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCisJCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKKwkJICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAorCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQorCQkJCSAgICAgKyBmaW5mby0+bGFzdF9maWxlX2luZGV4ICogb3N5bWVzeiksCisJCQkJICAgIFNFRUtfU0VUKSAhPSAwCisJCQkgIHx8IChiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwgb3V0cHV0X2JmZCkKKwkJCSAgICAgICE9IG9zeW1lc3opKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgfQorCQl9CisKKwkgICAgICBmaW5mby0+bGFzdF9maWxlX2luZGV4ID0gb3V0cHV0X2luZGV4OworCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUgPSBpc3ltOworCSAgICB9CisKKwkgIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydCBub3JtYWwgZ2xvYmFsIGZ1bmN0aW9uIHN5bWJvbHMgdG8KKwkgICAgIHN0YXRpYyBmdW5jdGlvbnMuICovCisKKwkgIGlmIChmaW5mby0+aW5mby0+dGFza19saW5rCisJICAgICAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKKwkJICB8fCBpc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAorCQkgIHx8IChvYmpfcGUgKGlucHV0X2JmZCkgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKSkKKwkgICAgaXN5bS5uX3NjbGFzcyA9IENfU1RBVDsKKworCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLworCisJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOworCisJICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OworCisJICBpZiAoZ2xvYmFsKQorCSAgICB7CisJICAgICAgbG9uZyBpbmR4OworCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgICAgIGluZHggPSAoKGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKKwkJICAgICAgLyBpc3ltZXN6KTsKKwkgICAgICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKKwkgICAgICBpZiAoaCA9PSBOVUxMKQorCQl7CisJCSAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzIGVhcmxpZXIgaW4KKyAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rLiAgKi8KKwkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICBoLT5pbmR4ID0gb3V0cHV0X2luZGV4OworCSAgICB9CisKKwkgIG91dHB1dF9pbmRleCArPSBhZGQ7CisJICBvdXRzeW0gKz0gYWRkICogb3N5bWVzejsKKwl9CisKKyAgICAgIGVzeW0gKz0gYWRkICogaXN5bWVzejsKKyAgICAgIGlzeW1wICs9IGFkZDsKKyAgICAgICsrc2VjcHA7CisgICAgICArK2luZGV4cDsKKyAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQorCXsKKwkgICpzZWNwcCsrID0gTlVMTDsKKwkgICppbmRleHArKyA9IC0xOworCX0KKyAgICB9CisKKyAgLyogRml4IHVwIHRoZSBhdXggZW50cmllcy4gIFRoaXMgbXVzdCBiZSBkb25lIGluIGEgc2VwYXJhdGUgcGFzcywKKyAgICAgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHN5bWJvbCBpbmRpY2VzIHVudGlsIHdlIGhhdmUKKyAgICAgYWxyZWFkeSBkZWNpZGVkIHdoaWNoIHN5bWJvbHMgd2UgYXJlIGdvaW5nIHRvIGtlZXAuICAqLworCisgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKKyAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkgKiBpc3ltZXN6OworICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOworICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7CisgIHN5bV9oYXNoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7CisgIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCisgICAgeworICAgICAgaW50IGFkZDsKKworICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKKworICAgICAgaWYgKCgqaW5kZXhwIDwgMAorCSAgIHx8IChiZmRfc2l6ZV90eXBlKSAqaW5kZXhwIDwgc3ltZW50X2Jhc2UpCisJICAmJiAoKnN5bV9oYXNoID09IE5VTEwKKwkgICAgICB8fCAoKnN5bV9oYXNoKS0+YXV4YmZkICE9IGlucHV0X2JmZCkpCisJZXN5bSArPSBhZGQgKiBpc3ltZXN6OworICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKwkgIGludCBpOworCisJICBoID0gTlVMTDsKKwkgIGlmICgqaW5kZXhwIDwgMCkKKwkgICAgeworCSAgICAgIGggPSAqc3ltX2hhc2g7CisKKwkgICAgICAvKiBUaGUgbTY4ay1tb3Rvcm9sYS1zeXN2IGFzc2VtYmxlciB3aWxsIHNvbWV0aW1lcworICAgICAgICAgICAgICAgICBnZW5lcmF0ZSB0d28gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUsIGJ1dCBvbmx5IG9uZQorICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgYXV4IGVudHJpZXMuICAqLworCSAgICAgIEJGRF9BU1NFUlQgKGlzeW1wLT5uX251bWF1eCA9PSAwCisJCQkgIHx8IGgtPm51bWF1eCA9PSBpc3ltcC0+bl9udW1hdXgpOworCSAgICB9CisKKwkgIGVzeW0gKz0gaXN5bWVzejsKKworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgb3V0c3ltICs9IG9zeW1lc3o7CisKKwkgIC8qIEhhbmRsZSB0aGUgYXV4IGVudHJpZXMuICBUaGlzIGhhbmRsaW5nIGlzIGJhc2VkIG9uCisJICAgICBjb2ZmX3BvaW50ZXJpemVfYXV4LiAgSSBkb24ndCBrbm93IGlmIGl0IGFsd2F5cyBjb3JyZWN0LiAgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCBpc3ltcC0+bl9udW1hdXggJiYgZXN5bSA8IGVzeW1fZW5kOyBpKyspCisJICAgIHsKKwkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OworCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKKworCSAgICAgIGlmIChoICE9IE5VTEwpCisJCWF1eHAgPSBoLT5hdXggKyBpOworCSAgICAgIGVsc2UKKwkJeworCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCisJCQkJCWlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAorCQkJCQkoUFRSKSAmYXV4KTsKKwkJICBhdXhwID0gJmF1eDsKKwkJfQorCisJICAgICAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZJTEUpCisJCXsKKwkJICAvKiBJZiB0aGlzIGlzIGEgbG9uZyBmaWxlbmFtZSwgd2UgbXVzdCBwdXQgaXQgaW4gdGhlCisJCSAgICAgc3RyaW5nIHRhYmxlLiAgKi8KKwkJICBpZiAoYXV4cC0+eF9maWxlLnhfbi54X3plcm9lcyA9PSAwCisJCSAgICAgICYmIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisJCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKKworCQkgICAgICBCRkRfQVNTRVJUIChhdXhwLT54X2ZpbGUueF9uLnhfb2Zmc2V0CisJCQkJICA+PSBTVFJJTkdfU0laRV9TSVpFKTsKKwkJICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKKwkJCXsKKwkJCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoaW5wdXRfYmZkKTsKKwkJCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisJCQl9CisJCSAgICAgIGZpbGVuYW1lID0gc3RyaW5ncyArIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQ7CisJCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGZpbGVuYW1lLAorCQkJCQkJIGhhc2gsIGNvcHkpOworCQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKGlzeW1wLT5uX3NjbGFzcyAhPSBDX1NUQVQgfHwgaXN5bXAtPm5fdHlwZSAhPSBUX05VTEwpCisJCXsKKwkJICB1bnNpZ25lZCBsb25nIGluZHg7CisKKwkJICBpZiAoSVNGQ04gKGlzeW1wLT5uX3R5cGUpCisJCSAgICAgIHx8IElTVEFHIChpc3ltcC0+bl9zY2xhc3MpCisJCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JMT0NLCisJCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZDTikKKwkJICAgIHsKKwkJICAgICAgaW5keCA9IGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7CisJCSAgICAgIGlmIChpbmR4ID4gMAorCQkJICAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCisJCQl7CisJCQkgIC8qIFdlIGxvb2sgZm9yd2FyZCB0aHJvdWdoIHRoZSBzeW1ib2wgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzeW1ib2wgd2UgYXJlIGdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluY2x1ZGUuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmVseSByaWdodC4gICovCisJCQkgIHdoaWxlICgoZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdIDwgMAorCQkJCSAgfHwgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+c3ltX2luZGljZXNbaW5keF0KKwkJCQkgICAgICA8IHN5bWVudF9iYXNlKSkKKwkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQorCQkJICAgICsraW5keDsKKwkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCisJCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKKwkJCSAgZWxzZQorCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07CisJCQkgIGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBpbmR4OworCQkJfQorCQkgICAgfQorCisJCSAgaW5keCA9IGF1eHAtPnhfc3ltLnhfdGFnbmR4Lmw7CisJCSAgaWYgKGluZHggPiAwICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKKwkJICAgIHsKKwkJICAgICAgbG9uZyBzeW1pbmR4OworCisJCSAgICAgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07CisJCSAgICAgIGlmIChzeW1pbmR4IDwgMCkKKwkJCWF1eHAtPnhfc3ltLnhfdGFnbmR4LmwgPSAwOworCQkgICAgICBlbHNlCisJCQlhdXhwLT54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKKwkJICAgIH0KKworCQkgIC8qIFRoZSAuYmYgc3ltYm9scyBhcmUgc3VwcG9zZWQgdG8gYmUgbGlua2VkIHRocm91Z2gKKwkJICAgICB0aGUgZW5kbmR4IGZpZWxkLiAgV2UgbmVlZCB0byBjYXJyeSB0aGlzIGxpc3QKKwkJICAgICBhY3Jvc3Mgb2JqZWN0IGZpbGVzLiAgKi8KKwkJICBpZiAoaSA9PSAwCisJCSAgICAgICYmIGggPT0gTlVMTAorCQkgICAgICAmJiBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04KKwkJICAgICAgJiYgKGlzeW1wLT5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCisJCQkgIHx8IGlzeW1wLT5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQorCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVswXSA9PSAnLicKKwkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMV0gPT0gJ2InCisJCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzJdID09ICdmJworCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVszXSA9PSAnXDAnKQorCQkgICAgeworCQkgICAgICBpZiAoZmluZm8tPmxhc3RfYmZfaW5kZXggIT0gLTEpCisJCQl7CisJCQkgIGZpbmZvLT5sYXN0X2JmLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQorCQkJICAgICppbmRleHA7CisKKwkJCSAgaWYgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9iZl9pbmRleAorCQkJICAgICAgPj0gc3ltZW50X2Jhc2UpCisJCQkgICAgeworCQkJICAgICAgUFRSIGF1eG91dDsKKworCQkJICAgICAgLyogVGhlIGxhc3QgLmJmIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0CisJCQkJIGZpbGUuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYgdGhlCisJCQkJIGFzc2VtYmxlciBkaWQgbm90IHNldCB1cCB0aGUgLmJmCisJCQkJIGVuZG5keCBzeW1ib2xzIGNvcnJlY3RseS4gICovCisJCQkgICAgICBhdXhvdXQgPSAoUFRSKSAoZmluZm8tPm91dHN5bXMKKwkJCQkJICAgICAgKyAoKGZpbmZvLT5sYXN0X2JmX2luZGV4CisJCQkJCQkgIC0gc3ltZW50X2Jhc2UpCisJCQkJCQkgKiBvc3ltZXN6KSk7CisJCQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsCisJCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9iZiwKKwkJCQkJCSAgICAgaXN5bXAtPm5fdHlwZSwKKwkJCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLAorCQkJCQkJICAgICAwLCBpc3ltcC0+bl9udW1hdXgsCisJCQkJCQkgICAgIGF1eG91dCk7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmYgYXV4IGVudHJ5LiAgV2UgbmVlZCB0byB3cml0ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IGFnYWluLiAgV2UgYm9ycm93ICpvdXRzeW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyaWx5LiAgRklYTUU6IFRoaXMgY2FzZSBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIG1hZGUgZmFzdGVyLiAgKi8KKwkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwKKwkJCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2JmLAorCQkJCQkJICAgICBpc3ltcC0+bl90eXBlLAorCQkJCQkJICAgICBpc3ltcC0+bl9zY2xhc3MsCisJCQkJCQkgICAgIDAsIGlzeW1wLT5uX251bWF1eCwKKwkJCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKKwkJCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKKwkJCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCisJCQkJCSAgICAgKyBmaW5mby0+bGFzdF9iZl9pbmRleCAqIG9zeW1lc3opLAorCQkJCQkgICAgU0VFS19TRVQpICE9IDAKKwkJCQkgIHx8IGJmZF93cml0ZSAob3V0c3ltLCBvc3ltZXN6LCAxLAorCQkJCQkJb3V0cHV0X2JmZCkgIT0gb3N5bWVzeikKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQkgICAgfQorCQkJfQorCisJCSAgICAgIGlmIChhdXhwLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sICE9IDApCisJCQlmaW5mby0+bGFzdF9iZl9pbmRleCA9IC0xOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIC8qIFRoZSBlbmRuZHggZmllbGQgb2YgdGhpcyBhdXggZW50cnkgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1cGRhdGVkIHdpdGggdGhlIHN5bWJvbCBudW1iZXIgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLmJmIHN5bWJvbC4gICovCisJCQkgIGZpbmZvLT5sYXN0X2JmID0gKmF1eHA7CisJCQkgIGZpbmZvLT5sYXN0X2JmX2luZGV4ID0gKCgob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpCisJCQkJCQkgICAvIG9zeW1lc3opCisJCQkJCQkgICsgc3ltZW50X2Jhc2UpOworCQkJfQorCQkgICAgfQorCQl9CisKKwkgICAgICBpZiAoaCA9PSBOVUxMKQorCQl7CisJCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSBhdXhwLCBpc3ltcC0+bl90eXBlLAorCQkJCQkgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCisJCQkJCSAoUFRSKSBvdXRzeW0pOworCQkgIG91dHN5bSArPSBvc3ltZXN6OworCQl9CisKKwkgICAgICBlc3ltICs9IGlzeW1lc3o7CisJICAgIH0KKwl9CisKKyAgICAgIGluZGV4cCArPSBhZGQ7CisgICAgICBpc3ltcCArPSBhZGQ7CisgICAgICBzeW1faGFzaCArPSBhZGQ7CisgICAgfQorCisgIC8qIFJlbG9jYXRlIHRoZSBsaW5lIG51bWJlcnMsIHVubGVzcyB3ZSBhcmUgc3RyaXBwaW5nIHRoZW0uICAqLworICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKKyAgICAgIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQorICAgIHsKKyAgICAgIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJeworCSAgYmZkX3ZtYSBvZmZzZXQ7CisJICBiZmRfYnl0ZSAqZWxpbmU7CisJICBiZmRfYnl0ZSAqZWxpbmVlbmQ7CisKKwkgIC8qIEZJWE1FOiBJZiBTRUNfSEFTX0NPTlRFTlRTIGlzIG5vdCBmb3IgdGhlIHNlY3Rpb24sIHRoZW4KKwkgICAgIGJ1aWxkX2xpbmtfb3JkZXIgaW4gbGR3cml0ZS5jIHdpbGwgbm90IGhhdmUgY3JlYXRlZCBhCisJICAgICBsaW5rIG9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm90IGhhdmUgc2VlbiB0aGlzCisJICAgICBpbnB1dCBzZWN0aW9uIGluIF9iZmRfY29mZl9maW5hbF9saW5rLCB3aGljaCBtZWFucyB0aGF0CisJICAgICB3ZSB3aWxsIG5vdCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIGxpbmUgbnVtYmVycyBvZgorCSAgICAgdGhpcyBzZWN0aW9uLiAgSSBkb24ndCB0aGluayBsaW5lIG51bWJlcnMgY2FuIGJlCisJICAgICBtZWFuaW5nZnVsIGZvciBhIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgaGF2ZQorCSAgICAgU0VDX0hBU19DT05URU5UUyBzZXQsIGJ1dCwgaWYgdGhleSBkbywgdGhpcyBtdXN0IGJlCisJICAgICBjaGFuZ2VkLiAgKi8KKwkgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMAorCSAgICAgIHx8IChvLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCBiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LAorCQkJICAgaW5wdXRfYmZkKSAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7CisJICBlbGluZSA9IGZpbmZvLT5saW5lbm9zOworCSAgZWxpbmVlbmQgPSBlbGluZSArIGxpbmVzeiAqIG8tPmxpbmVub19jb3VudDsKKwkgIGZvciAoOyBlbGluZSA8IGVsaW5lZW5kOyBlbGluZSArPSBsaW5lc3opCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGlsaW5lOworCisJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgZWxpbmUsIChQVFIpICZpbGluZSk7CisKKwkgICAgICBpZiAoaWxpbmUubF9sbm5vICE9IDApCisJCWlsaW5lLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKKwkgICAgICBlbHNlIGlmIChpbGluZS5sX2FkZHIubF9zeW1uZHggPj0gMAorCQkgICAgICAgJiYgKCh1bnNpZ25lZCBsb25nKSBpbGluZS5sX2FkZHIubF9zeW1uZHgKKwkJCSAgIDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpKQorCQl7CisJCSAgbG9uZyBpbmR4OworCisJCSAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbGluZS5sX2FkZHIubF9zeW1uZHhdOworCisJCSAgaWYgKGluZHggPCAwKQorCQkgICAgeworCQkgICAgICAvKiBUaGVzZSBsaW5lIG51bWJlcnMgYXJlIGF0dGFjaGVkIHRvIGEgc3ltYm9sCisJCQkgd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4gIFdlIHNob3VsZCByZWFsbHkKKwkJCSBqdXN0IGRpc2NhcmQgdGhlIGxpbmUgbnVtYmVycywgYnV0IHRoYXQgd291bGQKKwkJCSBiZSBhIHBhaW4gYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgY291bnRlZAorCQkJIHRoZW0uICAqLworCQkgICAgICBpbmR4ID0gMDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXM7CisJCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpYTsKKworCQkgICAgICAvKiBGaXggdXAgdGhlIGxubm9wdHIgZmllbGQgaW4gdGhlIGF1eCBlbnRyeSBvZgorCQkJIHRoZSBzeW1ib2wuICBJdCB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndCBkbworCQkJIHRoaXMgd2hlbiB3ZSBtb2RpZnkgdGhlIHN5bWJvbCBhdXggZW50cmllcywKKwkJCSBiZWNhdXNlIGdhcyBzb21ldGltZXMgc2NyZXdzIHVwIHRoZSBsbm5vcHRyCisJCQkgZmllbGQgYW5kIG1ha2VzIGl0IGFuIG9mZnNldCBmcm9tIHRoZSBzdGFydAorCQkJIG9mIHRoZSBsaW5lIG51bWJlcnMgcmF0aGVyIHRoYW4gYW4gYWJzb2x1dGUKKwkJCSBmaWxlIGluZGV4LiAgKi8KKwkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsCisJCQkJCSAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKKwkJCQkJCSAgICsgKChpbmR4IC0gc3ltZW50X2Jhc2UpCisJCQkJCQkgICAgICAqIG9zeW1lc3opKSwKKwkJCQkJICAgIChQVFIpICZpcyk7CisJCSAgICAgIGlmICgoSVNGQ04gKGlzLm5fdHlwZSkKKwkJCSAgIHx8IGlzLm5fc2NsYXNzID09IENfQkxPQ0spCisJCQkgICYmIGlzLm5fbnVtYXV4ID49IDEpCisJCQl7CisJCQkgIFBUUiBhdXhwdHI7CisKKwkJCSAgYXV4cHRyID0gKFBUUikgKGZpbmZvLT5vdXRzeW1zCisJCQkJCSAgKyAoKGluZHggLSBzeW1lbnRfYmFzZSArIDEpCisJCQkJCSAgICAgKiBvc3ltZXN6KSk7CisJCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChvdXRwdXRfYmZkLCBhdXhwdHIsCisJCQkJCQlpcy5uX3R5cGUsIGlzLm5fc2NsYXNzLAorCQkJCQkJMCwgaXMubl9udW1hdXgsIChQVFIpICZpYSk7CisJCQkgIGlhLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9CisJCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKKwkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6CisJCQkgICAgICsgZWxpbmUgLSBmaW5mby0+bGluZW5vcyk7CisJCQkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlhLAorCQkJCQkJIGlzLm5fdHlwZSwgaXMubl9zY2xhc3MsIDAsCisJCQkJCQkgaXMubl9udW1hdXgsIGF1eHB0cik7CisJCQl9CisJCSAgICB9CisKKwkJICBpbGluZS5sX2FkZHIubF9zeW1uZHggPSBpbmR4OworCQl9CisKKwkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpbGluZSwgKFBUUikgZWxpbmUpOworCSAgICB9CisKKwkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKKwkJCShvLT5vdXRwdXRfc2VjdGlvbi0+bGluZV9maWxlcG9zCisJCQkgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KSwKKwkJCVNFRUtfU0VUKSAhPSAwCisJICAgICAgfHwgYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcywgbGluZXN6LCBvLT5saW5lbm9fY291bnQsCisJCQkgICAgb3V0cHV0X2JmZCkgIT0gbGluZXN6ICogby0+bGluZW5vX2NvdW50KQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKz0gby0+bGluZW5vX2NvdW50OworCX0KKyAgICB9CisKKyAgLyogSWYgd2Ugc3dhcHBlZCBvdXQgYSBDX0ZJTEUgc3ltYm9sLCBndWVzcyB0aGF0IHRoZSBuZXh0IENfRklMRQorICAgICBzeW1ib2wgd2lsbCBiZSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBuZXh0IGlucHV0IGZpbGUuICBJbiB0aGUKKyAgICAgbm9ybWFsIGNhc2UsIHRoaXMgd2lsbCBzYXZlIHVzIGZyb20gd3JpdGluZyBvdXQgdGhlIENfRklMRSBzeW1ib2wKKyAgICAgYWdhaW4uICAqLworICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQorICAgICAgJiYgKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCisgICAgeworICAgICAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKKwkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCisgCQkJCSAgICArICgoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAtIHN5bWVudF9iYXNlKQorIAkJCQkgICAgICAgKiBvc3ltZXN6KSkpOworICAgIH0KKworICAvKiBXcml0ZSB0aGUgbW9kaWZpZWQgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLworICBpZiAob3V0c3ltID4gZmluZm8tPm91dHN5bXMpCisgICAgeworICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAorCQkgICAgb2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKSArIHN5bWVudF9iYXNlICogb3N5bWVzeiwKKwkJICAgIFNFRUtfU0VUKSAhPSAwCisJICB8fCAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgb3V0c3ltIC0gZmluZm8tPm91dHN5bXMsIDEsCisJCQlvdXRwdXRfYmZkKQorCSAgICAgICE9IChiZmRfc2l6ZV90eXBlKSAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIEJGRF9BU1NFUlQgKChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKKwkJICAgKyAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpIC8gb3N5bWVzeikKKwkJICA9PSBvdXRwdXRfaW5kZXgpOworCisgICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgPSBvdXRwdXRfaW5kZXg7CisgICAgfQorCisgIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLworICBhZGp1c3Rfc3ltbmR4ID0gY29mZl9iYWNrZW5kX2luZm8gKGlucHV0X2JmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4OworICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY2RhdGE7CisKKyAgICAgIGlmICghIG8tPmxpbmtlcl9tYXJrKQorCXsKKwkgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKKwkgIHx8IChvLT5fcmF3X3NpemUgPT0gMCAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApKQorCXsKKwkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKKwkgICAgICAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiKSwKKwkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgbykpKTsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHNlY2RhdGEgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKTsKKyAgICAgIGlmIChzZWNkYXRhICE9IE5VTEwgJiYgc2VjZGF0YS0+Y29udGVudHMgIT0gTlVMTCkKKwljb250ZW50cyA9IHNlY2RhdGEtPmNvbnRlbnRzOworICAgICAgZWxzZQorCXsKKwkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBmaW5mby0+Y29udGVudHMsCisJCQkJCSAgKGZpbGVfcHRyKSAwLCBvLT5fcmF3X3NpemUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKKwl9CisKKyAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisJeworCSAgaW50IHRhcmdldF9pbmRleDsKKwkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOworCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOworCisJICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLworCSAgdGFyZ2V0X2luZGV4ID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKKwkJCSAgICAgKGlucHV0X2JmZCwgbywgZmFsc2UsIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCisJCQkgICAgICBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlLAorCQkJICAgICAgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKKwkJCSAgICAgICA/IChmaW5mby0+c2VjdGlvbl9pbmZvW3RhcmdldF9pbmRleF0ucmVsb2NzCisJCQkJICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkKKwkJCSAgICAgICA6IGZpbmZvLT5pbnRlcm5hbF9yZWxvY3MpKSk7CisJICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogQ2FsbCBwcm9jZXNzb3Igc3BlY2lmaWMgY29kZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbgorICAgICAgICAgICAgIGNvbnRlbnRzLiAgKi8KKwkgIGlmICghIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAorCQkJCQkgICBpbnB1dF9iZmQsIG8sCisJCQkJCSAgIGNvbnRlbnRzLAorCQkJCQkgICBpbnRlcm5hbF9yZWxvY3MsCisJCQkJCSAgIGZpbmZvLT5pbnRlcm5hbF9zeW1zLAorCQkJCQkgICBmaW5mby0+c2VjX3B0cnMpKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBvZmZzZXQ7CisJICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOworCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOworCisJICAgICAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7CisJICAgICAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKKwkgICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OworCSAgICAgIHJlbF9oYXNoID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCisJCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKwkgICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKykKKwkJeworCQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKwkJICBib29sZWFuIGFkanVzdGVkOworCisJCSAgKnJlbF9oYXNoID0gTlVMTDsKKworCQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgc3ltYm9sIGluZGV4LiAgKi8KKworCQkgIGlyZWwtPnJfdmFkZHIgKz0gb2Zmc2V0OworCisJCSAgaWYgKGlyZWwtPnJfc3ltbmR4ID09IC0xKQorCQkgICAgY29udGludWU7CisKKwkJICBpZiAoYWRqdXN0X3N5bW5keCkKKwkJICAgIHsKKwkJICAgICAgaWYgKCEgKCphZGp1c3Rfc3ltbmR4KSAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCisJCQkJCSAgICAgIGlucHV0X2JmZCwgbywgaXJlbCwKKwkJCQkJICAgICAgJmFkanVzdGVkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgaWYgKGFkanVzdGVkKQorCQkJY29udGludWU7CisJCSAgICB9CisKKwkJICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpcmVsLT5yX3N5bW5keF07CisJCSAgaWYgKGggIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICAqLworCQkgICAgICBpZiAoaC0+aW5keCA+PSAwKQorCQkJaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyaXR0ZW4gYXQgdGhlIGVuZAorCQkJICAgICBvZiB0aGUgZmlsZSwgYW5kIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUKKwkJCSAgICAgc3ltYm9sIGluZGV4LiAgV2Ugc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUKKwkJCSAgICAgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgcmVsX2hhc2ggbGlzdC4KKwkJCSAgICAgV2Ugc2V0IHRoZSBpbmR4IGZpZWxkIHRvIC0yIHRvIGluZGljYXRlCisJCQkgICAgIHRoYXQgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgc3RyaXBwZWQuICAqLworCQkJICAqcmVsX2hhc2ggPSBoOworCQkJICBoLT5pbmR4ID0gLTI7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsb25nIGluZHg7CisKKwkJICAgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpcmVsLT5yX3N5bW5keF07CisJCSAgICAgIGlmIChpbmR4ICE9IC0xKQorCQkJaXJlbC0+cl9zeW1uZHggPSBpbmR4OworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOworCQkJICBjb25zdCBjaGFyICpuYW1lOworCQkJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCisJCQkgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBwaW5nLiAgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQKKwkJCSAgICAgYnkgdGhlICdkb250X3NraXBfc3ltYm9sJyBjb2RlIGluIHRoZSB3aGlsZQorCQkJICAgICBsb29wIGF0IHRoZSB0b3Agb2YgdGhpcyBmdW5jdGlvbi4gKi8KKwkJCSAgCisJCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyBpcmVsLT5yX3N5bW5keDsKKworCQkJICBuYW1lID0gKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQorCQkJCSAgKGlucHV0X2JmZCwgaXMsIGJ1ZikpOworCQkJICBpZiAobmFtZSA9PSBOVUxMKQorCQkJICAgIHJldHVybiBmYWxzZTsKKworCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQorCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgbywKKwkJCQkgIGlyZWwtPnJfdmFkZHIpKSkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBvLT5yZWxvY19jb3VudDsKKwkgICAgfQorCX0KKworICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIGlmIChzZWNkYXRhID09IE5VTEwgfHwgc2VjZGF0YS0+c3RhYl9pbmZvID09IE5VTEwpCisJeworCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKKwkJCQkJICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKKwkJCQkJICAoby0+X2Nvb2tlZF9zaXplICE9IDAKKwkJCQkJICAgPyBvLT5fY29va2VkX3NpemUKKwkJCQkJICAgOiBvLT5fcmF3X3NpemUpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISAoX2JmZF93cml0ZV9zZWN0aW9uX3N0YWJzCisJCSAob3V0cHV0X2JmZCwgJmNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zdGFiX2luZm8sCisJCSAgbywgJnNlY2RhdGEtPnN0YWJfaW5mbywgY29udGVudHMpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQorICAgIHsKKyAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IGEgZ2xvYmFsIHN5bWJvbC4gIENhbGxlZCB2aWEgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitib29sZWFuCitfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKKyAgYmZkICpvdXRwdXRfYmZkOworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07CisgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworICB1bnNpZ25lZCBpbnQgaTsKKworICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7CisKKyAgaWYgKGgtPmluZHggPj0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoaC0+aW5keCAhPSAtMgorICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKKwkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQorCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCisJCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQorCQkgID09IE5VTEwpKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChoLT5yb290LnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKKyAgICAgIGFib3J0ICgpOworICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgorICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKKyAgICAgIGlzeW0ubl92YWx1ZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgeworCWFzZWN0aW9uICpzZWM7CisKKwlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCisJICBpc3ltLm5fc2NudW0gPSBOX0FCUzsKKwllbHNlCisJICBpc3ltLm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKKwlpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCWlmICghIG9ial9wZSAoZmluZm8tPm91dHB1dF9iZmQpKQorCSAgaXN5bS5uX3ZhbHVlICs9IHNlYy0+dm1hOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKKyAgICAgIGlzeW0ubl92YWx1ZSA9IGgtPnJvb3QudS5jLnNpemU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKKyAgICAgIC8qIEp1c3QgaWdub3JlIHRoZXNlLiAgVGhleSBjYW4ndCBiZSBoYW5kbGVkIGFueWhvdy4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCisgICAgc3RybmNweSAoaXN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7CisgIGVsc2UKKyAgICB7CisgICAgICBib29sZWFuIGhhc2g7CisgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7CisKKyAgICAgIGhhc2ggPSB0cnVlOworICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCisJaGFzaCA9IGZhbHNlOworICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywgaGFzaCwKKwkJCQkgZmFsc2UpOworICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorCXsKKwkgIGZpbmZvLT5mYWlsZWQgPSB0cnVlOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOworICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OworICAgIH0KKworICBpc3ltLm5fc2NsYXNzID0gaC0+Y2xhc3M7CisgIGlzeW0ubl90eXBlID0gaC0+dHlwZTsKKworICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX05VTEwpCisgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOworCisgIC8qIElmIGRvaW5nIHRhc2sgbGlua2luZyBhbmQgdGhpcyBpcyB0aGUgcGFzcyB3aGVyZSB3ZSBjb252ZXJ0CisgICAgIGRlZmluZWQgZ2xvYmFscyB0byBzdGF0aWNzLCB0aGVuIGRvIHRoYXQgY29udmVyc2lvbiBub3cuICBJZiB0aGUKKyAgICAgc3ltYm9sIGlzIG5vdCBiZWluZyBjb252ZXJ0ZWQsIGp1c3QgaWdub3JlIGl0IGFuZCBpdCB3aWxsIGJlCisgICAgIG91dHB1dCBkdXJpbmcgYSBsYXRlciBwYXNzLiAqLworICBpZiAoZmluZm8tPmdsb2JhbF90b19zdGF0aWMpCisgICAgeworICAgICAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKKwkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19XRUFLRVhUCisJICAmJiAoISBvYmpfcGUgKG91dHB1dF9iZmQpIHx8IGlzeW0ubl9zY2xhc3MgIT0gQ19OVF9XRUFLKSkKKwl7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpc3ltLm5fc2NsYXNzID0gQ19TVEFUOworICAgIH0KKworICBpc3ltLm5fbnVtYXV4ID0gaC0+bnVtYXV4OworICAKKyAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZmluZm8tPm91dHN5bXMpOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7CisKKyAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAorCQkob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQorCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKiBzeW1lc3opLAorCQlTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgc3ltZXN6LCAxLCBvdXRwdXRfYmZkKSAhPSBzeW1lc3opCisgICAgeworICAgICAgZmluZm8tPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGgtPmluZHggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7CisKKyAgKytvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7CisKKyAgLyogV3JpdGUgb3V0IGFueSBhc3NvY2lhdGVkIGF1eCBlbnRyaWVzLiAgVGhlcmUgbm9ybWFsbHkgd2lsbCBiZQorICAgICBub25lLiAgSWYgdGhlcmUgYXJlIGFueSwgSSBoYXZlIG5vIGlkZWEgaG93IHRvIG1vZGlmeSB0aGVtLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGlzeW0ubl9udW1hdXg7IGkrKykKKyAgICB7CisgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpIChoLT5hdXggKyBpKSwgaXN5bS5uX3R5cGUsCisJCQkgICAgIGlzeW0ubl9zY2xhc3MsIGksIGlzeW0ubl9udW1hdXgsCisJCQkgICAgIChQVFIpIGZpbmZvLT5vdXRzeW1zKTsKKyAgICAgIGlmIChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKKwl7CisJICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCB0YXNrIGdsb2JhbCBzeW1ib2xzLCBjb252ZXJ0aW5nIHRoZW0gdG8gc3RhdGljcy4gIENhbGxlZAorICAgdmlhIGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgQ2FsbHMgYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSB0byBkbworICAgdGhlIGRpcnR5IHdvcmssIGlmIHRoZSBzeW1ib2wgd2UgYXJlIHByb2Nlc3NpbmcgbmVlZHMgY29udmVyc2lvbi4gKi8KKworYm9vbGVhbgorX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscyAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikgZGF0YTsKKyAgYm9vbGVhbiBydG52YWwgPSB0cnVlOworICBib29sZWFuIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKKworICBpZiAoaC0+aW5keCA8IDApCisgICAgeworICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCisJeworCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorCSAgc2F2ZV9nbG9iYWxfdG9fc3RhdGljID0gZmluZm8tPmdsb2JhbF90b19zdGF0aWM7CisJICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHRydWU7CisJICBydG52YWwgPSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSAoaCwgZGF0YSk7CisJICBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYyA9IHNhdmVfZ2xvYmFsX3RvX3N0YXRpYzsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gKHJ0bnZhbCk7Cit9CisKKy8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCisKK2Jvb2xlYW4KK19iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKKyAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Cit7CisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7CisgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKKworICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7CisgIGlmIChob3d0byA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAobGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgIT0gMCkKKyAgICB7CisgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7CisgICAgICBiZmRfYnl0ZSAqYnVmOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OworICAgICAgYm9vbGVhbiBvazsKKworICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOworICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKKyAgICAgIGlmIChidWYgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsCisJCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7CisgICAgICBzd2l0Y2ggKHJzdGF0KQorCXsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgIGFib3J0ICgpOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAoZmluZm8tPmluZm8sCisJCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCisJCQkJICAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uKQorCQkgICA6IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lKSwKKwkJICBob3d0by0+bmFtZSwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsCisJCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKKwkgICAgeworCSAgICAgIGZyZWUgKGJ1Zik7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKKwkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKKyAgICAgIGZyZWUgKGJ1Zik7CisgICAgICBpZiAoISBvaykKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAorICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLworCisgIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKKwkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKyAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcworCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKworICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7CisgICpyZWxfaGFzaF9wdHIgPSBOVUxMOworCisgIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OworCisgIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQorICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAorICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCisgICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLworICAgICAgYWJvcnQgKCk7CisgICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKKyAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIGggPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAorCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCisJCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKKyAgICAgIGlmIChoICE9IE5VTEwpCisJeworCSAgaWYgKGgtPmluZHggPj0gMCkKKwkgICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQKKwkJIHdyaXR0ZW4gb3V0LiAgKi8KKwkgICAgICBoLT5pbmR4ID0gLTI7CisJICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7CisJICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCisJCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCisJCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlyZWwtPnJfc3ltbmR4ID0gMDsKKwl9CisgICAgfQorCisgIC8qIEZJWE1FOiBJcyB0aGlzIGFsd2F5cyByaWdodD8gICovCisgIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOworCisgIC8qIHJfc2l6ZSBpcyBvbmx5IHVzZWQgb24gdGhlIFJTLzYwMDAsIHdoaWNoIG5lZWRzIGl0cyBvd24gbGlua2VyCisgICAgIHJvdXRpbmVzIGFueWhvdy4gIHJfZXh0ZXJuIGlzIG9ubHkgdXNlZCBmb3IgRUNPRkYuICAqLworCisgIC8qIEZJWE1FOiBXaGF0IGlzIHRoZSByaWdodCB2YWx1ZSBmb3Igcl9vZmZzZXQ/ICBJcyB6ZXJvIE9LPyAgKi8KKworICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQSBiYXNpYyByZWxvYyBoYW5kbGluZyByb3V0aW5lIHdoaWNoIG1heSBiZSB1c2VkIGJ5IHByb2Nlc3NvcnMgd2l0aAorICAgc2ltcGxlIHJlbG9jcy4gICovCisKK2Jvb2xlYW4KK19iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwKKwkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKKwkJCQkgICAgc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKKyAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKKyAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKK3sKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGxvbmcgc3ltbmR4OworICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOworICAgICAgYmZkX3ZtYSBhZGRlbmQ7CisgICAgICBiZmRfdm1hIHZhbDsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OworCisgICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OworCisgICAgICBpZiAoc3ltbmR4ID09IC0xKQorCXsKKwkgIGggPSBOVUxMOworCSAgc3ltID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeyAgICAKKwkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07CisJICBzeW0gPSBzeW1zICsgc3ltbmR4OworCX0KKworICAgICAgLyogQ09GRiB0cmVhdHMgY29tbW9uIHN5bWJvbHMgaW4gb25lIG9mIHR3byB3YXlzLiAgRWl0aGVyIHRoZQorICAgICAgICAgc2l6ZSBvZiB0aGUgc3ltYm9sIGlzIGluY2x1ZGVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBvciBpdAorICAgICAgICAgaXMgbm90LiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNpemUgaXMgbm90IGluY2x1ZGVkLCBhbmQgZm9yY2UKKyAgICAgICAgIHRoZSBydHlwZV90b19ob3d0byBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGFkZGVuZCBhcyBuZWVkZWQuICAqLworCisgICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCisJYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7CisgICAgICBlbHNlCisJYWRkZW5kID0gMDsKKworCisgICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKKwkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKKyAgICAgIGlmIChob3d0byA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZW4gd2UgY2FuIGp1c3QgaWdub3JlCisgICAgICAgICBhIFBDIHJlbGF0aXZlIHJlbG9jIHRoYXQgaXMgcGNyZWxfb2Zmc2V0LiAgSXQgd2lsbCBhbHJlYWR5CisgICAgICAgICBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlLiAgSWYgdGhpcyBpcyBub3QgYSByZWxvY2F0ZWFibGUgbGluaywKKyAgICAgICAgIHRoZW4gd2Ugc2hvdWxkIGlnbm9yZSB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KKyAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnBjcmVsX29mZnNldCkKKwl7CisJICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICBjb250aW51ZTsKKwkgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKKwkgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKKwl9CisKKyAgICAgIHZhbCA9IDA7CisKKyAgICAgIGlmIChoID09IE5VTEwpCisJeworCSAgYXNlY3Rpb24gKnNlYzsKKworCSAgaWYgKHN5bW5keCA9PSAtMSkKKwkgICAgeworCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICAgICAgdmFsID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKKyAgICAgICAgICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgKyBzeW0tPm5fdmFsdWUpOworCSAgICAgIGlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKKwkJdmFsIC09IHNlYy0+dm1hOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzZWM7CisKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgICB9CisKKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCisJeworCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KKwkgIGlmIChzeW0gJiYgcGVfZGF0YSAob3V0cHV0X2JmZCktPmluX3JlbG9jX3AgKG91dHB1dF9iZmQsIGhvd3RvKSkKKwkgICAgeworCSAgICAgIC8qIFJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoIGlzbid0CisJCSBhYnNvbHV0ZS4gIFdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIHRvIGEgZmlsZS4KKwkJIFRoaXMgZmlsZSBpcyB0aGVuIHJlYWQgYnkgZGxsdG9vbCB3aGVuIGdlbmVyYXRpbmcgdGhlCisJCSByZWxvYyBzZWN0aW9uLiAgTm90ZSB0aGF0IHRoZSBiYXNlIGZpbGUgaXMgbm90CisJCSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuICBXZSB3cml0ZSBvdXQgYSBsb25nIGhlcmUsCisJCSBhbmQgZGxsdG9vbCByZWFkcyBpbiBhIGxvbmcuICAqLworCSAgICAgIGxvbmcgYWRkciA9IChyZWwtPnJfdmFkZHIgCisJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSAKKwkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCAKKwkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisJICAgICAgaWYgKGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnBlKQorCQlhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7CisJICAgICAgaWYgKGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAobG9uZyksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSkKKwkJICAhPSBzaXplb2YgKGxvbmcpKQorCQl7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgfQorCX0KKyAgCisgICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJY29udGVudHMsCisJCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKKwkJCQkJdmFsLCBhZGRlbmQpOworCisgICAgICBzd2l0Y2ggKHJzdGF0KQorCXsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJY2FzZSBiZmRfcmVsb2Nfb2s6CisJICBicmVhazsKKwljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkciwKKwkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKKwkgIHJldHVybiBmYWxzZTsKKwljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqbmFtZTsKKwkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKKworCSAgICBpZiAoc3ltbmR4ID09IC0xKQorCSAgICAgIG5hbWUgPSAiKkFCUyoiOworCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCisJICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICAgIGVsc2UKKwkgICAgICB7CisJCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOworCQlpZiAobmFtZSA9PSBOVUxMKQorCQkgIHJldHVybiBmYWxzZTsKKwkgICAgICB9CisKKwkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAorCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCX0KKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS9iZmQvY29mZnN3YXAuaCBiL2JmZC9jb2Zmc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzBhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29mZnN3YXAuaApAQCAtMCwwICsxLDkwOCBAQAorLyogR2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBmb3IgQkZELgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIHN3YXAgQ09GRiBkYXRhLiAgSXQgaXMgYSBoZWFkZXIKKyAgIGZpbGUgYmVjYXVzZSB0aGUgZGV0YWlscyBvZiBzd2FwcGluZyBkZXBlbmQgb24gdGhlIGRldGFpbHMgb2YgdGhlCisgICBzdHJ1Y3R1cmVzIHVzZWQgYnkgZWFjaCBDT0ZGIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBpbmNsdWRlZCBieQorICAgY29mZmNvZGUuaCwgYXMgd2VsbCBhcyBieSB0aGUgRUNPRkYgYmFja2VuZC4KKworICAgQW55IGZpbGUgd2hpY2ggdXNlcyB0aGlzIG11c3QgZmlyc3QgaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIiBhbmQKKyAgICJjb2ZmL0NQVS5oIi4gIFRoZSBmdW5jdGlvbnMgd2lsbCB0aGVuIGJlIGNvcnJlY3QgZm9yIHRoYXQgQ1BVLiAgKi8KKworI2lmbmRlZiBJTUFHRV9CQVNFCisjZGVmaW5lIElNQUdFX0JBU0UgMAorI2VuZGlmCisKKyNkZWZpbmUgUFVUV09SRCBiZmRfaF9wdXRfMzIKKyNkZWZpbmUgUFVUSEFMRiBiZmRfaF9wdXRfMTYKKyNkZWZpbmUJUFVUQllURSBiZmRfaF9wdXRfOAorCisjaWZuZGVmIEdFVF9GQ05fTE5OT1BUUgorI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKKyNlbmRpZgorCisjaWZuZGVmIEdFVF9GQ05fRU5ETkRYCisjZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKKyNlbmRpZgorCisjaWZuZGVmIFBVVF9GQ05fTE5OT1BUUgorI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIFBVVFdPUkQoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCisjZW5kaWYKKyNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKKyNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgUFVUV09SRChhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCisjZW5kaWYKKyNpZm5kZWYgR0VUX0xOU1pfTE5OTworI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQorI2VuZGlmCisjaWZuZGVmIEdFVF9MTlNaX1NJWkUKKyNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKKyNlbmRpZgorI2lmbmRlZiBQVVRfTE5TWl9MTk5PCisjZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQorI2VuZGlmCisjaWZuZGVmIFBVVF9MTlNaX1NJWkUKKyNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCisjZW5kaWYKKyNpZm5kZWYgR0VUX1NDTl9TQ05MRU4KKyNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05fTlJFTE9DCisjZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsICBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05fTkxJTk5PCisjZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbmxpbm5vKQorI2VuZGlmCisjaWZuZGVmIFBVVF9TQ05fU0NOTEVOCisjZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOX05SRUxPQworI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOX05MSU5OTworI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMTYoYWJmZCxpbiwgKGJmZF9ieXRlICAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQorI2VuZGlmCisjaWZuZGVmIEdFVF9MSU5FTk9fTE5OTworI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2VuZGlmCisjaWZuZGVmIFBVVF9MSU5FTk9fTE5OTworI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2VuZGlmCisKKy8qIFRoZSBmX3N5bXB0ciBmaWVsZCBpbiB0aGUgZmlsZWhkciBpcyBzb21ldGltZXMgNjQgYml0cy4gICovCisjaWZuZGVmIEdFVF9GSUxFSERSX1NZTVBUUgorI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX0ZJTEVIRFJfU1lNUFRSCisjZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfMzIKKyNlbmRpZgorCisvKiBTb21lIGZpZWxkcyBpbiB0aGUgYW91dGhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLworI2lmbmRlZiBHRVRfQU9VVEhEUl9UU0laRQorI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9UU0laRQorI2RlZmluZSBQVVRfQU9VVEhEUl9UU0laRSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9EU0laRQorI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9EU0laRQorI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9CU0laRQorI2RlZmluZSBHRVRfQU9VVEhEUl9CU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9CU0laRQorI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9FTlRSWQorI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9FTlRSWQorI2RlZmluZSBQVVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9URVhUX1NUQVJUCisjZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVAorI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQKKyNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUCisjZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzMyCisjZW5kaWYKKworLyogU29tZSBmaWVsZHMgaW4gdGhlIHNjbmhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLworI2lmbmRlZiBHRVRfU0NOSERSX1BBRERSCisjZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX1NDTkhEUl9QQUREUgorI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfVkFERFIKKyNkZWZpbmUgR0VUX1NDTkhEUl9WQUREUiBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOSERSX1ZBRERSCisjZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzMyCisjZW5kaWYKKyNpZm5kZWYgR0VUX1NDTkhEUl9TSVpFCisjZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOSERSX1NJWkUKKyNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfU0NOUFRSCisjZGVmaW5lIEdFVF9TQ05IRFJfU0NOUFRSIGJmZF9oX2dldF8zMgorI2VuZGlmCisjaWZuZGVmIFBVVF9TQ05IRFJfU0NOUFRSCisjZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfUkVMUFRSCisjZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF8zMgorI2VuZGlmCisjaWZuZGVmIFBVVF9TQ05IRFJfUkVMUFRSCisjZGVmaW5lIFBVVF9TQ05IRFJfUkVMUFRSIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfTE5OT1BUUgorI2RlZmluZSBHRVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX1NDTkhEUl9MTk5PUFRSCisjZGVmaW5lIFBVVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfU0NOSERSX05SRUxPQworI2RlZmluZSBHRVRfU0NOSERSX05SRUxPQyBiZmRfaF9nZXRfMTYKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOSERSX05SRUxPQworI2RlZmluZSBQVVRfU0NOSERSX05SRUxPQyBiZmRfaF9wdXRfMTYKKyNlbmRpZgorI2lmbmRlZiBHRVRfU0NOSERSX05MTk5PCisjZGVmaW5lIEdFVF9TQ05IRFJfTkxOTk8gYmZkX2hfZ2V0XzE2CisjZW5kaWYKKyNpZm5kZWYgUFVUX1NDTkhEUl9OTE5OTworI2RlZmluZSBQVVRfU0NOSERSX05MTk5PIGJmZF9oX3B1dF8xNgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfRkxBR1MKKyNkZWZpbmUgR0VUX1NDTkhEUl9GTEFHUyBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOSERSX0ZMQUdTCisjZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzMyCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYW91dGhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworI2lmbmRlZiBOT19DT0ZGX1JFTE9DUworc3RhdGljIHZvaWQgY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworI2VuZGlmIC8qIE5PX0NPRkZfUkVMT0NTICovCisjaWZuZGVmIE5PX0NPRkZfU1lNQk9MUworc3RhdGljIHZvaWQgY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hdXhfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7CisjZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCisjaWZuZGVmIE5PX0NPRkZfTElORU5PUworc3RhdGljIHZvaWQgY29mZl9zd2FwX2xpbmVub19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2xpbmVub19vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CisjZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCisKKyNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKKworc3RhdGljIHZvaWQKK2NvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIHNyYzsKKyAgICAgUFRSIGRzdDsKK3sKKyAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7CisKKyAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7CisgIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKKworI2lmZGVmIFJTNjAwMENPRkZfQworICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlKTsKKyAgcmVsb2NfZHN0LT5yX3NpemUgPSBiZmRfaF9nZXRfOChhYmZkLCByZWxvY19zcmMtPnJfc2l6ZSk7CisjZWxzZQorICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOworI2VuZGlmCisKKyNpZmRlZiBTV0FQX0lOX1JFTE9DX09GRlNFVAorICByZWxvY19kc3QtPnJfb2Zmc2V0ID0gU1dBUF9JTl9SRUxPQ19PRkZTRVQoYWJmZCwKKwkJCQkJICAgICAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX29mZnNldCk7CisjZW5kaWYKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAgICAgICAqYWJmZDsKKyAgICAgUFRSCXNyYzsKKyAgICAgUFRSCWRzdDsKK3sKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOworICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7CisgIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOworCisjaWZkZWYgUlM2MDAwQ09GRl9DCisgIGJmZF9oX3B1dF84IChhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl90eXBlKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHJlbG9jX3NyYy0+cl9zaXplLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3NpemUpOworI2Vsc2UKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKKwkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOworI2VuZGlmCisKKyNpZmRlZiBTV0FQX09VVF9SRUxPQ19PRkZTRVQKKyAgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKGFiZmQsCisJCQlyZWxvY19zcmMtPnJfb2Zmc2V0LAorCQkJKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9vZmZzZXQpOworI2VuZGlmCisjaWZkZWYgU1dBUF9PVVRfUkVMT0NfRVhUUkEKKyAgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxyZWxvY19zcmMsIHJlbG9jX2RzdCk7CisjZW5kaWYKKworICByZXR1cm4gUkVMU1o7Cit9CisKKyNlbmRpZiAvKiBOT19DT0ZGX1JFTE9DUyAqLworCitzdGF0aWMgdm9pZAorY29mZl9zd2FwX2ZpbGVoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKKyAgICAgUFRSCSAgICAgc3JjOworICAgICBQVFIJICAgICBkc3Q7Cit7CisgIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKKyAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKKyNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRQorICBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRSAoYWJmZCwgc3JjLCBkc3QpOworI2VuZGlmCisgIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7CisgIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7CisgIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKKyAgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID0KKyAgICBHRVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOworICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOworICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX29wdGhkcik7CisgIGZpbGVoZHJfZHN0LT5mX2ZsYWdzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9mbGFncyk7CisjaWZkZWYgVElDODBfVEFSR0VUX0lECisgIGZpbGVoZHJfZHN0LT5mX3RhcmdldF9pZCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGFyZ2V0X2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUCisgIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCAoYWJmZCwgc3JjLCBkc3QpOworI2VuZGlmCit9CisKK3N0YXRpYyAgdW5zaWduZWQgaW50Citjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCisgICAgIGJmZCAgICAgICAqYWJmZDsKKyAgICAgUFRSCWluOworICAgICBQVFIJb3V0OworeworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOworICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKKworI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRQorICBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgKGFiZmQsIGluLCBvdXQpOworI2VuZGlmCisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKKyAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCisJCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7CisjaWZkZWYgVElDODBfVEFSR0VUX0lECisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX3RhcmdldF9pZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RhcmdldF9pZCk7CisjZW5kaWYKKworI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QKKyAgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCAoYWJmZCwgaW4sIG91dCk7CisjZW5kaWYKKyAgcmV0dXJuIEZJTEhTWjsKK30KKworCisjaWZuZGVmIE5PX0NPRkZfU1lNQk9MUworCitzdGF0aWMgdm9pZAorY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQorICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKKyAgICAgUFRSIGV4dDE7CisgICAgIFBUUiBpbjE7Cit7CisgIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKKworICBpZiggZXh0LT5lLmVfbmFtZVswXSA9PSAwKSB7CisgICAgaW4tPl9uLl9uX24uX25femVyb2VzID0gMDsKKyAgICBpbi0+X24uX25fbi5fbl9vZmZzZXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKKyAgfQorICBlbHNlIHsKKyNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCisgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOworI2Vsc2UKKyAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKKyNlbmRpZgorICB9CisgIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOyAKKyAgaW4tPm5fc2NudW0gPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7CisgIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpeworICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKKyAgfQorICBlbHNlIHsKKyAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7CisgIH0KKyAgaW4tPm5fc2NsYXNzID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX3NjbGFzcyk7CisgIGluLT5uX251bWF1eCA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9udW1hdXgpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citjb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgaW5wLCBleHRwKQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglpbnA7CisgICAgIFBUUglleHRwOworeworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW5wOworICBTWU1FTlQgKmV4dCA9KFNZTUVOVCAqKWV4dHA7CisgIGlmKGluLT5fbi5fbl9uYW1lWzBdID09IDApIHsKKyAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfemVyb2VzKTsKKyAgICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPl9uLl9uX24uX25fb2Zmc2V0LCAoYmZkX2J5dGUgKikgIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKKyAgfQorICBlbHNlIHsKKyNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCisgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIFNZTU5NTEVOITsKKyNlbHNlCisgICAgbWVtY3B5KGV4dC0+ZS5lX25hbWUsIGluLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7CisjZW5kaWYKKyAgfQorICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3ZhbHVlICwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7CisgIGJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fc2NudW0gLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKKyAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMikKKyAgICAgIHsKKwliZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOworICAgICAgfQorICBlbHNlCisgICAgICB7CisJYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKKyAgICAgIH0KKyAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOworICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7CisgIHJldHVybiBTWU1FU1o7Cit9CisKK3N0YXRpYyB2b2lkCitjb2ZmX3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCisgICAgIGJmZCAgICAgICAgICAgICphYmZkOworICAgICBQVFIgCSAgICAgIGV4dDE7CisgICAgIGludCAgICAgICAgICAgICB0eXBlOworICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7CisgICAgIGludAkgICAgICBpbmR4OworICAgICBpbnQJICAgICAgbnVtYXV4OworICAgICBQVFIgCSAgICAgIGluMTsKK3sKKyAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7CisKKyNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFCisgIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSk7CisjZW5kaWYKKyAgc3dpdGNoIChjbGFzcykgeworICAgIGNhc2UgQ19GSUxFOgorICAgICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgeworCSAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOworCSAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPSAKKwkgICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7CisJfSBlbHNlIHsKKyNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCisJICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7CisjZWxzZQorCSAgICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOworI2VuZGlmCisJICB9CisgICAgICBnb3RvIGVuZDsKKworICAgICAgLyogUlMvNjAwMCAiY3NlY3QiIGF1eGVudHMgKi8KKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgICBjYXNlIENfRVhUOgorICAgIGNhc2UgQ19ISURFWFQ6CisgICAgICBpZiAoaW5keCArIDEgPT0gbnVtYXV4KQorCXsKKwkgIGluLT54X2NzZWN0Lnhfc2NubGVuLmwgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3Njbmxlbik7CisJICBpbi0+eF9jc2VjdC54X3Bhcm1oYXNoID0gYmZkX2hfZ2V0XzMyIChhYmZkLAorCQkJCQkJIGV4dC0+eF9jc2VjdC54X3Bhcm1oYXNoKTsKKwkgIGluLT54X2NzZWN0Lnhfc25oYXNoICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3NuaGFzaCk7CisJICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhY2sgYml0ZmllbGRzIGluIHhfc210eXAgYmVjYXVzZSBpdCdzCisJICAgICBkZWZpbmVkIGJ5IHNoaWZ0cy1hbmQtYW5kcywgd2hpY2ggYXJlIGVxdWl2YWxlbnQgb24gYWxsCisJICAgICBieXRlIG9yZGVycy4gICovCisJICBpbi0+eF9jc2VjdC54X3NtdHlwICAgID0gYmZkX2hfZ2V0XzggIChhYmZkLCBleHQtPnhfY3NlY3QueF9zbXR5cCk7CisJICBpbi0+eF9jc2VjdC54X3NtY2xhcyAgID0gYmZkX2hfZ2V0XzggIChhYmZkLCBleHQtPnhfY3NlY3QueF9zbWNsYXMpOworCSAgaW4tPnhfY3NlY3QueF9zdGFiICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc3RhYik7CisJICBpbi0+eF9jc2VjdC54X3Nuc3RhYiAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPnhfY3NlY3QueF9zbnN0YWIpOworCSAgZ290byBlbmQ7CisJfQorICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGNhc2UgQ19TVEFUOgorI2lmZGVmIENfTEVBRlNUQVQKKyAgICBjYXNlIENfTEVBRlNUQVQ6CisjZW5kaWYKKyAgICBjYXNlIENfSElEREVOOgorICAgICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7CisJICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOworCSAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKKwkgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7CisKKwkgIC8qIFBFIGRlZmluZXMgc29tZSBleHRyYSBmaWVsZHM7IHdlIHplcm8gdGhlbSBvdXQgZm9yCisgICAgICAgICAgICAgc2FmZXR5LiAgKi8KKwkgIGluLT54X3Njbi54X2NoZWNrc3VtID0gMDsKKwkgIGluLT54X3Njbi54X2Fzc29jaWF0ZWQgPSAwOworCSAgaW4tPnhfc2NuLnhfY29tZGF0ID0gMDsKKworCSAgZ290byBlbmQ7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKKyNpZm5kZWYgTk9fVFZORFgKKyAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7CisjZW5kaWYKKworICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKKyAgICB7CisgICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOworICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgRElNTlVNICE9IEVfRElNTlVNCisgI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQorI2VuZGlmCisgICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9CisJYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKKyAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KKwliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOworICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQorCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7CisgICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9CisJYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKKyAgICB9CisKKyAgaWYgKElTRkNOKHR5cGUpKSB7CisgICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKKyAgfQorICBlbHNlIHsKKyAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7CisgICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOworICB9CisKK2VuZDogOworICAvKiB0aGUgc2VtaWNvbG9uIGlzIGJlY2F1c2UgTVNWQyBkb2Vzbid0IGxpa2UgbGFiZWxzIGF0CisgICAgIGVuZCBvZiBibG9jay4gKi8KKworI2lmZGVmIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUCisgIENPRkZfQURKVVNUX0FVWF9JTl9QT1NUIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NvZmZfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCisgICAgIGJmZCAgICphYmZkOworICAgICBQVFIgCWlucDsKKyAgICAgaW50ICAgdHlwZTsKKyAgICAgaW50ICAgY2xhc3M7CisgICAgIGludCAgIGluZHg7CisgICAgIGludCAgIG51bWF1eDsKKyAgICAgUFRSCWV4dHA7Cit7CisgIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOworICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOworCisjaWZkZWYgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUKKyAgQ09GRl9BREpVU1RfQVVYX09VVF9QUkUgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCk7CisjZW5kaWYKKyAgbWVtc2V0KChQVFIpZXh0LCAwLCBBVVhFU1opOworICBzd2l0Y2ggKGNsYXNzKSB7CisgIGNhc2UgQ19GSUxFOgorICAgIGlmIChpbi0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgeworICAgICAgUFVUV09SRChhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKKyAgICAgIFBVVFdPUkQoYWJmZCwKKwkgICAgICBpbi0+eF9maWxlLnhfbi54X29mZnNldCwKKwkgICAgICAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKKyAgICB9CisgICAgZWxzZSB7CisjaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgorICAgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKKyNlbHNlCisgICAgICBtZW1jcHkgKGV4dC0+eF9maWxlLnhfZm5hbWUsIGluLT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOworI2VuZGlmCisgICAgfQorICAgIGdvdG8gZW5kOworCisjaWZkZWYgUlM2MDAwQ09GRl9DCisgIC8qIFJTLzYwMDAgImNzZWN0IiBhdXhlbnRzICovCisgIGNhc2UgQ19FWFQ6CisgIGNhc2UgQ19ISURFWFQ6CisgICAgaWYgKGluZHggKyAxID09IG51bWF1eCkKKyAgICAgIHsKKwlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3Njbmxlbi5sLAlleHQtPnhfY3NlY3QueF9zY25sZW4pOworCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0LnhfcGFybWhhc2gsCWV4dC0+eF9jc2VjdC54X3Bhcm1oYXNoKTsKKwlQVVRIQUxGIChhYmZkLCBpbi0+eF9jc2VjdC54X3NuaGFzaCwJZXh0LT54X2NzZWN0Lnhfc25oYXNoKTsKKwkvKiBXZSBkb24ndCBoYXZlIHRvIGhhY2sgYml0ZmllbGRzIGluIHhfc210eXAgYmVjYXVzZSBpdCdzCisJICAgZGVmaW5lZCBieSBzaGlmdHMtYW5kLWFuZHMsIHdoaWNoIGFyZSBlcXVpdmFsZW50IG9uIGFsbAorCSAgIGJ5dGUgb3JkZXJzLiAgKi8KKwlQVVRCWVRFIChhYmZkLCBpbi0+eF9jc2VjdC54X3NtdHlwLAlleHQtPnhfY3NlY3QueF9zbXR5cCk7CisJUFVUQllURSAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbWNsYXMsCWV4dC0+eF9jc2VjdC54X3NtY2xhcyk7CisJUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9zdGFiLAlleHQtPnhfY3NlY3QueF9zdGFiKTsKKwlQVVRIQUxGIChhYmZkLCBpbi0+eF9jc2VjdC54X3Nuc3RhYiwJZXh0LT54X2NzZWN0Lnhfc25zdGFiKTsKKwlnb3RvIGVuZDsKKyAgICAgIH0KKyAgICBicmVhazsKKyNlbmRpZgorCisgIGNhc2UgQ19TVEFUOgorI2lmZGVmIENfTEVBRlNUQVQKKyAgY2FzZSBDX0xFQUZTVEFUOgorI2VuZGlmCisgIGNhc2UgQ19ISURERU46CisgICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7CisgICAgICBQVVRfU0NOX1NDTkxFTihhYmZkLCBpbi0+eF9zY24ueF9zY25sZW4sIGV4dCk7CisgICAgICBQVVRfU0NOX05SRUxPQyhhYmZkLCBpbi0+eF9zY24ueF9ucmVsb2MsIGV4dCk7CisgICAgICBQVVRfU0NOX05MSU5OTyhhYmZkLCBpbi0+eF9zY24ueF9ubGlubm8sIGV4dCk7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBQVVRXT1JEKGFiZmQsIGluLT54X3N5bS54X3RhZ25keC5sLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7CisjaWZuZGVmIE5PX1RWTkRYCisgIGJmZF9oX3B1dF8xNihhYmZkLCBpbi0+eF9zeW0ueF90dm5keCAsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOworI2VuZGlmCisKKyAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCisgICAgeworICAgICAgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBleHQpOworICAgICAgUFVUX0ZDTl9FTkRORFgoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sLCBleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZiBESU1OVU0gIT0gRV9ESU1OVU0KKyAjZXJyb3Igd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRElNTlVNCisjZW5kaWYKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKKyAgICB9CisKKyAgaWYgKElTRkNOICh0eXBlKSkKKyAgICBQVVRXT1JEIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfZnNpemUsCisJICAgICAoYmZkX2J5dGUgKikgIGV4dC0+eF9zeW0ueF9taXNjLnhfZnNpemUpOworICBlbHNlCisgICAgeworICAgICAgUFVUX0xOU1pfTE5OTyAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vLCBleHQpOworICAgICAgUFVUX0xOU1pfU0laRSAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLCBleHQpOworICAgIH0KKworZW5kOgorI2lmZGVmIENPRkZfQURKVVNUX0FVWF9PVVRfUE9TVAorICBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgKGFiZmQsIGlucCwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgZXh0cCk7CisjZW5kaWYKKyAgcmV0dXJuIEFVWEVTWjsKK30KKworI2VuZGlmIC8qIE5PX0NPRkZfU1lNQk9MUyAqLworCisjaWZuZGVmIE5PX0NPRkZfTElORU5PUworCitzdGF0aWMgdm9pZAorY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQorICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKKyAgICAgUFRSIGV4dDE7CisgICAgIFBUUiBpbjE7Cit7CisgIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7CisgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKKworICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmxfYWRkci5sX3N5bW5keCk7CisgIGluLT5sX2xubm8gPSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKKyAgICAgYmZkICAgICAgICphYmZkOworICAgICBQVFIJaW5wOworICAgICBQVFIJb3V0cDsKK3sKKyAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKKyAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOworICBQVVRXT1JEKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKQorCSAgZXh0LT5sX2FkZHIubF9zeW1uZHgpOworCisgIFBVVF9MSU5FTk9fTE5OTyAoYWJmZCwgaW4tPmxfbG5ubywgZXh0KTsKKyAgcmV0dXJuIExJTkVTWjsKK30KKworI2VuZGlmIC8qIE5PX0NPRkZfTElORU5PUyAqLworCitzdGF0aWMgdm9pZAorY29mZl9zd2FwX2FvdXRoZHJfaW4gKGFiZmQsIGFvdXRoZHJfZXh0MSwgYW91dGhkcl9pbnQxKQorICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKKyAgICAgUFRSIGFvdXRoZHJfZXh0MTsKKyAgICAgUFRSIGFvdXRoZHJfaW50MTsKK3sKKyAgQU9VVEhEUiAgICAgICAgKmFvdXRoZHJfZXh0ID0gKEFPVVRIRFIgKikgYW91dGhkcl9leHQxOworICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyX2ludDE7CisKKyAgYW91dGhkcl9pbnQtPm1hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+bWFnaWMpOworICBhb3V0aGRyX2ludC0+dnN0YW1wID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dnN0YW1wKTsKKyAgYW91dGhkcl9pbnQtPnRzaXplID0KKyAgICBHRVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50c2l6ZSk7CisgIGFvdXRoZHJfaW50LT5kc2l6ZSA9CisgICAgR0VUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZHNpemUpOworICBhb3V0aGRyX2ludC0+YnNpemUgPQorICAgIEdFVF9BT1VUSERSX0JTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmJzaXplKTsKKyAgYW91dGhkcl9pbnQtPmVudHJ5ID0KKyAgICBHRVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5lbnRyeSk7CisgIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ID0KKyAgICBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRleHRfc3RhcnQpOworICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCA9CisgICAgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kYXRhX3N0YXJ0KTsKKworI2lmZGVmIEk5NjAKKyAgYW91dGhkcl9pbnQtPnRhZ2VudHJpZXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50YWdlbnRyaWVzKTsKKyNlbmRpZgorCisjaWZkZWYgQVBPTExPX002OAorICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPm9faW5saWIsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+b19pbmxpYik7CisgIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2ludC0+b19zcmksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+b19zcmkpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPnZpZFswXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52aWQpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPnZpZFsxXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT52aWQgKyA0KTsKKyNlbmRpZgorCisKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgYW91dGhkcl9pbnQtPm9fdG9jID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX3RvYyk7CisgIGFvdXRoZHJfaW50LT5vX3NuZW50cnkgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25lbnRyeSk7CisgIGFvdXRoZHJfaW50LT5vX3NudGV4dCA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbnRleHQpOworICBhb3V0aGRyX2ludC0+b19zbmRhdGEgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25kYXRhKTsKKyAgYW91dGhkcl9pbnQtPm9fc250b2MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc250b2MpOworICBhb3V0aGRyX2ludC0+b19zbmxvYWRlciA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmxvYWRlcik7CisgIGFvdXRoZHJfaW50LT5vX3NuYnNzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NuYnNzKTsKKyAgYW91dGhkcl9pbnQtPm9fYWxnbnRleHQgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fYWxnbnRleHQpOworICBhb3V0aGRyX2ludC0+b19hbGduZGF0YSA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19hbGduZGF0YSk7CisgIGFvdXRoZHJfaW50LT5vX21vZHR5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fbW9kdHlwZSk7CisgIGFvdXRoZHJfaW50LT5vX2NwdXR5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fY3B1dHlwZSk7CisgIGFvdXRoZHJfaW50LT5vX21heHN0YWNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5vX21heHN0YWNrKTsKKyAgYW91dGhkcl9pbnQtPm9fbWF4ZGF0YSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+b19tYXhkYXRhKTsKKyNlbmRpZgorCisjaWZkZWYgTUlQU0VDT0ZGCisgIGFvdXRoZHJfaW50LT5ic3Nfc3RhcnQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmJzc19zdGFydCk7CisgIGFvdXRoZHJfaW50LT5ncF92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BfdmFsdWUpOworICBhb3V0aGRyX2ludC0+Z3BybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Z3BybWFzayk7CisgIGFvdXRoZHJfaW50LT5jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzBdKTsKKyAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMV0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMV0pOworICBhb3V0aGRyX2ludC0+Y3BybWFza1syXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1syXSk7CisgIGFvdXRoZHJfaW50LT5jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzNdKTsKKyNlbmRpZgorCisjaWZkZWYgQUxQSEFFQ09GRgorICBhb3V0aGRyX2ludC0+YnNzX3N0YXJ0ID0gYmZkX2hfZ2V0XzY0KGFiZmQsIGFvdXRoZHJfZXh0LT5ic3Nfc3RhcnQpOworICBhb3V0aGRyX2ludC0+Z3BfdmFsdWUgPSBiZmRfaF9nZXRfNjQoYWJmZCwgYW91dGhkcl9leHQtPmdwX3ZhbHVlKTsKKyAgYW91dGhkcl9pbnQtPmdwcm1hc2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmdwcm1hc2spOworICBhb3V0aGRyX2ludC0+ZnBybWFzayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+ZnBybWFzayk7CisjZW5kaWYKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglpbjsKKyAgICAgUFRSCW91dDsKK3sKKyAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilpbjsKKyAgQU9VVEhEUiAqYW91dGhkcl9vdXQgPSAoQU9VVEhEUiAqKW91dDsKKworICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+bWFnaWMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+bWFnaWMpOworICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+dnN0YW1wLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnZzdGFtcCk7CisgIFBVVF9BT1VUSERSX1RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT50c2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50c2l6ZSk7CisgIFBVVF9BT1VUSERSX0RTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5kc2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5kc2l6ZSk7CisgIFBVVF9BT1VUSERSX0JTSVpFIChhYmZkLCBhb3V0aGRyX2luLT5ic2l6ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic2l6ZSk7CisgIFBVVF9BT1VUSERSX0VOVFJZIChhYmZkLCBhb3V0aGRyX2luLT5lbnRyeSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5lbnRyeSk7CisgIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQsCisJCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dGV4dF9zdGFydCk7CisgIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCisJCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZGF0YV9zdGFydCk7CisKKyNpZmRlZiBJOTYwCisgIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT50YWdlbnRyaWVzLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRhZ2VudHJpZXMpOworI2VuZGlmCisKKyNpZmRlZiBSUzYwMDBDT0ZGX0MKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBhb3V0aGRyX2luLT5vX3RvYywgYW91dGhkcl9vdXQtPm9fdG9jKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuZW50cnksIGFvdXRoZHJfb3V0LT5vX3NuZW50cnkpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc250ZXh0LCBhb3V0aGRyX291dC0+b19zbnRleHQpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25kYXRhLCBhb3V0aGRyX291dC0+b19zbmRhdGEpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc250b2MsIGFvdXRoZHJfb3V0LT5vX3NudG9jKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NubG9hZGVyLCBhb3V0aGRyX291dC0+b19zbmxvYWRlcik7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmJzcywgYW91dGhkcl9vdXQtPm9fc25ic3MpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fYWxnbnRleHQsIGFvdXRoZHJfb3V0LT5vX2FsZ250ZXh0KTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX2FsZ25kYXRhLCBhb3V0aGRyX291dC0+b19hbGduZGF0YSk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19tb2R0eXBlLCBhb3V0aGRyX291dC0+b19tb2R0eXBlKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX2NwdXR5cGUsIGFvdXRoZHJfb3V0LT5vX2NwdXR5cGUpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbWF4c3RhY2ssIGFvdXRoZHJfb3V0LT5vX21heHN0YWNrKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBhb3V0aGRyX2luLT5vX21heGRhdGEsIGFvdXRoZHJfb3V0LT5vX21heGRhdGEpOworICBtZW1zZXQgKGFvdXRoZHJfb3V0LT5vX3Jlc3YyLCAwLCBzaXplb2YgYW91dGhkcl9vdXQtPm9fcmVzdjIpOworI2VuZGlmCisKKyNpZmRlZiBNSVBTRUNPRkYKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmJzc19zdGFydCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ic3Nfc3RhcnQpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BfdmFsdWUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BfdmFsdWUpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Z3BybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncHJtYXNrKTsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMF0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1swXSk7CisgIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzFdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMV0pOworICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1syXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzJdKTsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbM10sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1szXSk7CisjZW5kaWYKKworI2lmZGVmIEFMUEhBRUNPRkYKKyAgLyogRklYTUU6IFdoYXQgZG9lcyBibGRyZXYgbWVhbj8gICovCisgIGJmZF9oX3B1dF8xNihhYmZkLCAoYmZkX3ZtYSkgMiwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ibGRyZXYpOworICBiZmRfaF9wdXRfMTYoYWJmZCwgKGJmZF92bWEpIDAsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+cGFkZGluZyk7CisgIGJmZF9oX3B1dF82NChhYmZkLCBhb3V0aGRyX2luLT5ic3Nfc3RhcnQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+YnNzX3N0YXJ0KTsKKyAgYmZkX2hfcHV0XzY0KGFiZmQsIGFvdXRoZHJfaW4tPmdwX3ZhbHVlLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwX3ZhbHVlKTsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmdwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BybWFzayk7CisgIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5mcHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmZwcm1hc2spOworI2VuZGlmCisKKyAgcmV0dXJuIEFPVVRTWjsKK30KKworc3RhdGljIHZvaWQKK2NvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsIGV4dCwgaW4pCisgICAgIGJmZCAgICAgICAgICAgICphYmZkOworICAgICBQVFIJICAgICBleHQ7CisgICAgIFBUUgkgICAgIGluOworeworICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKKyAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOworCisjaWZkZWYgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BSRQorICBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFIChhYmZkLCBleHQsIGluKTsKKyNlbmRpZgorICBtZW1jcHkoc2NuaGRyX2ludC0+c19uYW1lLCBzY25oZHJfZXh0LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKKyAgc2NuaGRyX2ludC0+c192YWRkciA9CisgICAgR0VUX1NDTkhEUl9WQUREUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOworICBzY25oZHJfaW50LT5zX3BhZGRyID0KKyAgICBHRVRfU0NOSERSX1BBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7CisgIHNjbmhkcl9pbnQtPnNfc2l6ZSA9CisgICAgR0VUX1NDTkhEUl9TSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKKworICBzY25oZHJfaW50LT5zX3NjbnB0ciA9CisgICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7CisgIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KKyAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKKyAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KKyAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOworICBzY25oZHJfaW50LT5zX2ZsYWdzID0KKyAgICBHRVRfU0NOSERSX0ZMQUdTIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19mbGFncyk7CisgIHNjbmhkcl9pbnQtPnNfbnJlbG9jID0KKyAgICBHRVRfU0NOSERSX05SRUxPQyAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKKyAgc2NuaGRyX2ludC0+c19ubG5ubyA9CisgICAgR0VUX1NDTkhEUl9OTE5OTyAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOworI2lmZGVmIEk5NjAKKyAgc2NuaGRyX2ludC0+c19hbGlnbiA9CisgICAgR0VUX1NDTkhEUl9BTElHTiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfYWxpZ24pOworI2VuZGlmCisjaWZkZWYgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QKKyAgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BPU1QgKGFiZmQsIGV4dCwgaW4pOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCBpbiwgb3V0KQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglpbjsKKyAgICAgUFRSCW91dDsKK3sKKyAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopaW47CisgIFNDTkhEUiAqc2NuaGRyX2V4dCA9IChTQ05IRFIgKilvdXQ7CisgIHVuc2lnbmVkIGludCByZXQgPSBTQ05IU1o7CisKKyNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRQorICBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BSRSAoYWJmZCwgaW4sIG91dCk7CisjZW5kaWYKKyAgbWVtY3B5KHNjbmhkcl9leHQtPnNfbmFtZSwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7CisKKyAgUFVUX1NDTkhEUl9WQUREUiAoYWJmZCwgc2NuaGRyX2ludC0+c192YWRkciwKKwkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKKworCisgIFBVVF9TQ05IRFJfUEFERFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcGFkZHIsCisJCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7CisgIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc2NuaGRyX2ludC0+c19zaXplLAorCQkgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKKworICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCisJCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKKyAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAorCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7CisgIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAorCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKKyAgUFVUX1NDTkhEUl9GTEFHUyAoYWJmZCwgc2NuaGRyX2ludC0+c19mbGFncywKKwkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKKyNpZiBkZWZpbmVkKE04OCkKKyAgUFVUV09SRChhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7CisgIFBVVFdPUkQoYWJmZCwgc2NuaGRyX2ludC0+c19ucmVsb2MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7CisjZWxzZQorICBpZiAoc2NuaGRyX2ludC0+c19ubG5ubyA8PSAweGZmZmYpCisgICAgUFVUSEFMRihhYmZkLCBzY25oZHJfaW50LT5zX25sbm5vLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkgKyAxXTsKKworICAgICAgbWVtY3B5IChidWYsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpKTsKKyAgICAgIGJ1ZltzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSldID0gJ1wwJzsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogd2FybmluZzogJXM6IGxpbmUgbnVtYmVyIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkgYnVmLCBzY25oZHJfaW50LT5zX25sbm5vKTsKKyAgICAgIFBVVEhBTEYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOworICAgIH0KKyAgaWYgKHNjbmhkcl9pbnQtPnNfbnJlbG9jIDw9IDB4ZmZmZikKKyAgICBQVVRIQUxGKGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOworICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpICsgMV07CisKKyAgICAgIG1lbWNweSAoYnVmLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSk7CisgICAgICBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpXSA9ICdcMCc7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiAlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCisJCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkJICAgICBidWYsIHNjbmhkcl9pbnQtPnNfbnJlbG9jKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisgICAgICBQVVRIQUxGIChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7CisgICAgICByZXQgPSAwOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgSTk2MAorICBQVVRfU0NOSERSX0FMSUdOIChhYmZkLCBzY25oZHJfaW50LT5zX2FsaWduLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19hbGlnbik7CisjZW5kaWYKKyNpZmRlZiBDT0ZGX0FESlVTVF9TQ05IRFJfT1VUX1BPU1QKKyAgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUIChhYmZkLCBpbiwgb3V0KTsKKyNlbmRpZgorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZy5iZmQgYi9iZmQvY29uZmlnLmJmZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlhZTkxCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvbmZpZy5iZmQKQEAgLTAsMCArMSw3MTkgQEAKKyMgY29uZmlnLmJmZAorIyBDb252ZXJ0IGEgY2Fub25pY2FsIGhvc3QgdHlwZSBpbnRvIGEgQkZEIGhvc3QgdHlwZS4KKyMgU2V0IHNoZWxsIHZhcmlhYmxlIHRhcmcgdG8gY2Fub25pY2FsIHRhcmdldCBuYW1lLCBhbmQgcnVuCisjIHVzaW5nIGBgLiBjb25maWcuYmZkJycuCisjIFNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6CisjICB0YXJnX2RlZnZlYwkJRGVmYXVsdCB2ZWN0b3IgZm9yIHRoaXMgdGFyZ2V0CisjICB0YXJnX3NlbHZlY3MJCVZlY3RvcnMgdG8gYnVpbGQgZm9yIHRoaXMgdGFyZ2V0CisjICB0YXJnX2FyY2hzCQlBcmNoaXRlY3R1cmVzIGZvciB0aGlzIHRhcmdldAorIyAgdGFyZ19jZmxhZ3MJCSQoQ0ZMQUdTKSBmb3IgdGhpcyB0YXJnZXQgKEZJWE1FOiBwcmV0dHkgYm9ndXMpCisjICB0YXJnX3VuZGVyc2NvcmUJV2hldGhlciB1bmRlcnNjb3JlcyBhcmUgdXNlZDogeWVzIG9yIG5vCisKKyMgUGFydCBvZiB0aGlzIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRhcmdtYXRjaC5zZWQgdG8gZ2VuZXJhdGUgdGhlCisjIHRhcmdtYXRjaC5oIGZpbGUuICBUaGUgI2lmZGVmIGFuZCAjZW5kaWYgbGluZXMgdGhhdCBhcHBlYXIgYmVsb3cgYXJlCisjIGNvcGllZCBkaXJlY3RseSBpbnRvIHRhcmdtYXRjaC5oLgorCisjIFRoZSBiaW51dGlscyBjKytmaWx0IHByb2dyYW0gd2FudHMgdG8ga25vdyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZQorIyBzdHJpcHBlZCBvciBub3QuICBUaGF0IGlzIHdoeSB3ZSBzZXQgdGFyZ191bmRlcnNjb3JlLiAgYysrZmlsdCB1c2VzCisjIHRoaXMgaW5mb3JtYXRpb24gdG8gY2hvb3NlIGEgZGVmYXVsdC4gIFRoaXMgaW5mb3JtYXRpb24gaXMKKyMgZHVwbGljYXRlZCBpbiB0aGUgc3ltYm9sX2xlYWRpbmdfY2hhciBmaWVsZCBvZiB0aGUgQkZEIHRhcmdldAorIyB2ZWN0b3IsIGJ1dCBjKytmaWx0IGRvZXMgbm90IGRlYWwgd2l0aCBvYmplY3QgZmlsZXMgYW5kIGlzIG5vdAorIyBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuYS4gIEl0IGlzIG5vdCB0ZXJyaWJseSBpbXBvcnRhbnQgdGhhdCBjKytmaWx0CisjIGdldCB0aGlzIHJpZ2h0OyBpdCBpcyBqdXN0IGNvbnZlbmllbnQuCisKK3RhcmdfZGVmdmVjPQordGFyZ19zZWx2ZWNzPQordGFyZ19jZmxhZ3M9Cit0YXJnX3VuZGVyc2NvcmU9bm8KKwordGFyZ19jcHU9YGVjaG8gJHRhcmcgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorY2FzZSAiJHt0YXJnX2NwdX0iIGluCithbHBoYSopIHRhcmdfYXJjaHM9YmZkX2FscGhhX2FyY2ggOzsKK2FybSopCXRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7CitzdHJvbmdhcm0qKSB0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OwordGh1bWIqKQl0YXJnX2FyY2hzPWJmZF9hcm1fYXJjaCA7OworYzMwKikJdGFyZ19hcmNocz1iZmRfdGljMzBfYXJjaCA7OworaHBwYSopCXRhcmdfYXJjaHM9YmZkX2hwcGFfYXJjaCA7OworaVszNDU2XTg2KSB0YXJnX2FyY2hzPWJmZF9pMzg2X2FyY2ggOzsKK202OCopCXRhcmdfYXJjaHM9YmZkX202OGtfYXJjaCA7OworbTg4KikJdGFyZ19hcmNocz1iZmRfbTg4a19hcmNoIDs7CittaXBzKikJdGFyZ19hcmNocz1iZmRfbWlwc19hcmNoIDs7Citwb3dlcnBjKikgdGFyZ19hcmNocz0iYmZkX3JzNjAwMF9hcmNoIGJmZF9wb3dlcnBjX2FyY2giIDs7CityczYwMDApCXRhcmdfYXJjaHM9ImJmZF9yczYwMDBfYXJjaCBiZmRfcG93ZXJwY19hcmNoIiA7Oworc3BhcmMqKSB0YXJnX2FyY2hzPWJmZF9zcGFyY19hcmNoIDs7Cit2ODUwKikJdGFyZ19hcmNocz1iZmRfdjg1MF9hcmNoIDs7Cit6OGsqKQl0YXJnX2FyY2hzPWJmZF96OGtfYXJjaCA7OworKikJdGFyZ19hcmNocz1iZmRfJHt0YXJnX2NwdX1fYXJjaCA7OworZXNhYworCisKKyMgV0hFTiBBRERJTkcgRU5UUklFUyBUTyBUSElTIE1BVFJJWDoKKyMgIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IHNpZGUgYWx3YXlzIGhhcyB0d28gZGFzaGVzLiAgT3RoZXJ3aXNlIHlvdQorIyAgY2FuIGdldCBzcHVyaW91cyBtYXRjaGVzLiAgRXZlbiBmb3IgdW5hbWJpZ3VvdXMgY2FzZXMsIGRvIHRoaXMgYXMgYQorIyAgY29udmVudGlvbiwgZWxzZSB0aGUgdGFibGUgYmVjb21lcyBhIHJlYWwgbWVzcyB0byB1bmRlcnN0YW5kIGFuZCBtYWludGFpbi4KKworY2FzZSAiJHt0YXJnfSIgaW4KKyMgU1RBUlQgT0YgdGFyZ21hdGNoLmgKKyNpZmRlZiBCRkQ2NAorICBhbHBoYSotKi1uZXRic2QqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCisgICAgOzsKKyAgYWxwaGEqLSotbmV0d2FyZSopCisgICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPW5sbTMyX2FscGhhX3ZlYworICAgIDs7CisgIGFscGhhKi0qLWxpbnV4ZWNvZmYqKQorICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYworICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmNjRfYWxwaGFfdmVjCisgICAgOzsKKyAgYWxwaGEqLSotbGludXgtZ251KiB8IGFscGhhKi0qLWVsZiopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X2FscGhhX3ZlYworICAgIHRhcmdfc2VsdmVjcz1lY29mZmFscGhhX2xpdHRsZV92ZWMKKyAgICA7OworICBhbHBoYSotKi0qdm1zKikKKyAgICB0YXJnX2RlZnZlYz12bXNfYWxwaGFfdmVjCisgICAgOzsKKyAgYWxwaGEqLSotKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKKyAgICA7OworI2VuZGlmIC8qIEJGRDY0ICovCisKKyAgYXJjLSotZWxmKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYworICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJjX3ZlYworICAgIDs7CisKKyAgYXJtLSotcmlzY2l4KikKKyAgICB0YXJnX2RlZnZlYz1yaXNjaXhfdmVjCisgICAgOzsKKyAgYXJtLWVwb2MtcGUqKQorICAgIHRhcmdfZGVmdmVjPWFybV9lcG9jX3BlX2xpdHRsZV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImFybV9lcG9jX3BlX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVfYmlnX3ZlYyBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZWlfYmlnX3ZlYyIKKyAgICB0YXJnX3VuZGVyc2NvcmU9bm8KKyAgICA7OworICBhcm0tKi1wZSopCisgICAgdGFyZ19kZWZ2ZWM9YXJtcGVfbGl0dGxlX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYXJtcGVfbGl0dGxlX3ZlYyBhcm1wZV9iaWdfdmVjIGFybXBlaV9saXR0bGVfdmVjIGFybXBlaV9iaWdfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBhcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KQkKKyAgICB0YXJnX2RlZnZlYz1hb3V0X2FybV9saXR0bGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWFvdXRfYXJtX2JpZ192ZWMKKyAgICA7OworICBhcm1lYi0qLWFvdXQpCisgICAgdGFyZ19kZWZ2ZWM9YW91dF9hcm1fYmlnX3ZlYworICAgIHRhcmdfc2VsdmVjcz1hb3V0X2FybV9saXR0bGVfdmVjCisgICAgOzsKKyAgYXJtLSotY29mZikKKyAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGFybS0qLWVsZiB8IGFybSotKi1saW51eC1nbnUpCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV92ZWMKKyAgICA7OworICBhcm0tKi1vYWJpKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYworICAgIDs7CisKKyAgdGh1bWItKi1jb2ZmKQorICAgIHRhcmdfZGVmdmVjPWFybWNvZmZfbGl0dGxlX3ZlYworICAgIHRhcmdfc2VsdmVjcz1hcm1jb2ZmX2JpZ192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgdGh1bWItKi1vYWJpKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYworICAgIDs7CisgIHRodW1iLSotZWxmKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCisgICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCisgICAgOzsKKyAgdGh1bWItZXBvYy1wZSopCisgICAgdGFyZ19kZWZ2ZWM9YXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZV9iaWdfdmVjIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjIGFybV9lcG9jX3BlaV9iaWdfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT1ubworICAgIDs7CisgIHRodW1iLSotcGUqKQorICAgIHRhcmdfZGVmdmVjPWFybXBlX2xpdHRsZV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImFybXBlX2xpdHRsZV92ZWMgYXJtcGVfYmlnX3ZlYyBhcm1wZWlfbGl0dGxlX3ZlYyBhcm1wZWlfYmlnX3ZlYyIKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgc3Ryb25nYXJtLSotZWxmKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCisgICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCisgICAgOzsKKyAgc3Ryb25nYXJtLSotY29mZikKKyAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisKKyAgYTI5ay0qLWVibW9uKiB8IGEyOWstKi11ZGkqIHwgYTI5ay0qLWNvZmYqIHwgYTI5ay0qLXN5bTEqIHwgXAorICBhMjlrLSotdnh3b3JrcyogfCBhMjlrLSotc3lzdiopCisgICAgdGFyZ19kZWZ2ZWM9YTI5a2NvZmZfYmlnX3ZlYworICAgIHRhcmdfc2VsdmVjcz1zdW5vc19iaWdfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGEyOWstKi1hb3V0KiB8IGEyOWstKi1ic2QqIHwgYTI5ay0qLXZzdGEqKQorICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworICBjMzAtKi0qYW91dCogfCB0aWMzMC0qLSphb3V0KikKKyAgICB0YXJnX2RlZnZlYz10aWMzMF9hb3V0X3ZlYworICAgIDs7CisgIGMzMC0qLSpjb2ZmKiB8IHRpYzMwLSotKmNvZmYqKQorICAgIHRhcmdfZGVmdmVjPXRpYzMwX2NvZmZfdmVjCisgICAgOzsKKworICBkMTB2LSotKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfZDEwdl92ZWMKKyAgICA7OworCisgIGQzMHYtKi0qKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9kMzB2X3ZlYworICAgIDs7CisKKyAgZnIzMC0qLWVsZikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfZnIzMF92ZWMKKyAgICA7OworCisKKyAgaDgzMDAqLSotKikKKyAgICB0YXJnX2RlZnZlYz1oODMwMGNvZmZfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisKKyAgaDg1MDAtKi0qKQorICAgIHRhcmdfZGVmdmVjPWg4NTAwY29mZl92ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworICBocHBhKi0qLSplbGYqIHwgaHBwYSotKi1saXRlcyogfCBocHBhKi0qLXN5c3Y0KiB8IGhwcGEqLSotcnRlbXMqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9ocHBhX3ZlYworICAgIDs7CisjaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU1QRUlYKQorICBocHBhKi0qLWJzZCopCisgICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYworICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaHBwYV92ZWMKKyAgICA7OworICBocHBhKi0qLWhwdXgqIHwgaHBwYSotKi1oaXV4KiB8IGhwcGEqLSotbXBlaXgqKQorICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKKyAgICA7OworICBocHBhKi0qLW9zZiopCisgICAgdGFyZ19kZWZ2ZWM9c29tX3ZlYworICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaHBwYV92ZWMKKyAgICA7OworI2VuZGlmIC8qIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSAqLworCisgIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KmNvZmYpCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9pMzg2X3ZlYworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLXN5c3Y0KiB8IGlbMzQ1Nl04Ni0qLXVuaXh3YXJlIHwgaVszNDU2XTg2LSotc29sYXJpczIqIHwgXAorICBpWzM0NTZdODYtKi1lbGYgfCBpWzM0NTZdODYtKi1zY28zLjJ2NSogfCBpWzM0NTZdODYtKi1mcmVlYnNkZWxmKiB8IFwKKyAgaVszNDU2XTg2LSotZGd1eCogfCBpWzM0NTZdODYtKi1zeXN2NSopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWkzODZjb2ZmX3ZlYworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqIHwgaVszNDU2XSotKi1nbzMyKiB8IGlbMzQ1Nl04Ni1nbzMyLXJ0ZW1zKiApCisgICAgdGFyZ19kZWZ2ZWM9Z28zMmNvZmZfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJnbzMyc3R1YmJlZGNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKKyAgICA7OworICBpWzM0NTZdODYtKi1zeXN2KiB8IGlbMzQ1Nl04Ni0qLWlzYyogfCBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotY29mZiB8IFwKKyAgaVszNDU2XTg2LSotYWl4KiB8IGlbMzQ1Nl04NiotKi1ydGVtcyopCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCisgICAgOzsKKyAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKKyAgICB0YXJnX2RlZnZlYz1pMzg2ZHluaXhfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLWJzZCopCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmJzZF92ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgaVszNDU2XTg2LSotZnJlZWJzZCopCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmZyZWVic2RfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWkzODZic2RfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKKyAgICB0YXJnX2RlZnZlYz1pMzg2bmV0YnNkX3ZlYworICAgIHRhcmdfc2VsdmVjcz1pMzg2YnNkX3ZlYworICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBpWzM0NTZdODYtKi1uZXR3YXJlKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX2kzODZfdmVjIGkzODZjb2ZmX3ZlYyBpMzg2YW91dF92ZWMiCisgICAgOzsKKyAgaVszNDU2XTg2LSotbGludXgqYW91dCopCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmxpbnV4X3ZlYworICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgaVszNDU2XTg2LSotbGludXgtZ251KikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9aTM4NmxpbnV4X3ZlYworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLWx5bnhvcyopCisgICAgdGFyZ19kZWZ2ZWM9aTM4Nmx5bnhfY29mZl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9aTM4Nmx5bnhfYW91dF92ZWMKKyAgICA7OworICBpWzM0NTZdODYtKi1nbnUqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLW1hY2gqIHwgaVszNDU2XTg2LSotb3NmMW1rKikKKyAgICB0YXJnX2RlZnZlYz1pMzg2bWFjaDNfdmVjCisgICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGlbMzQ1Nl04Ni0qLW9zOWspCisgICAgdGFyZ19kZWZ2ZWM9aTM4Nm9zOWtfdmVjCisgICAgOzsKKyAgaVszNDU2XTg2LSotbXNkb3MqKQorICAgIHRhcmdfZGVmdmVjPWkzODZhb3V0X3ZlYworICAgIHRhcmdfc2VsdmVjcz1pMzg2bXNkb3NfdmVjCisgICAgOzsKKyAgaVszNDU2XTg2LSotbW9zcyopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJpMzg2bXNkb3NfdmVjIGkzODZhb3V0X3ZlYyIKKyAgICA7OworICBpWzM0NTZdODYtKi1iZW9zcGUqKQorICAgIHRhcmdfZGVmdmVjPWkzODZwZV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCisgICAgOzsKKyAgaVszNDU2XTg2LSotYmVvc2VsZiogfCBpWzM0NTZdODYtKi1iZW9zKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCisgICAgOzsKKyAgaVszNDU2XTg2LSotbWluZ3czMiogfCBpWzM0NTZdODYtKi1jeWd3aW4qIHwgaVszNDU2XTg2LSotd2lubnQgfCBpWzM0NTZdODYtKi1wZSkKKyAgICB0YXJnX2RlZnZlYz1pMzg2cGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIGkzODZwZWlfdmVjIgorICAgIDs7CisgIGlbMzQ1Nl04Ni1ub25lLSopCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCisgICAgOzsKKyAgaVszNDU2XTg2LSotYW91dCogfCBpWzM0NTZdODYqLSotdnN0YSopCisgICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCisgICAgOzsKKworICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqIHwgaTg2MC0qLWNvZmYqKQorICAgIHRhcmdfZGVmdmVjPWk4NjBjb2ZmX3ZlYworICAgIDs7CisgIGk4NjAtKi1zeXN2NCogfCBpODYwLSotZWxmKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTg2MF92ZWMKKyAgICA7OworCisgIGk5NjAtKi12eHdvcmtzNCogfCBpOTYwLSotdnh3b3JrczUuMCkKKyAgICB0YXJnX2RlZnZlYz1iX291dF92ZWNfbGl0dGxlX2hvc3QKKyAgICB0YXJnX3NlbHZlY3M9ImJfb3V0X3ZlY19iaWdfaG9zdCBpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMgaWVlZV92ZWMiCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGk5NjAtKi12eHdvcmtzNS4qIHwgaTk2MC0qLWNvZmYqIHwgaTk2MC0qLXN5c3YqIHwgaTk2MC0qLXJ0ZW1zKikKKyAgICB0YXJnX2RlZnZlYz1pY29mZl9saXR0bGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJpY29mZl9iaWdfdmVjIGJfb3V0X3ZlY19saXR0bGVfaG9zdCBiX291dF92ZWNfYmlnX2hvc3QgaWVlZV92ZWMiCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIGk5NjAtKi12eHdvcmtzKiB8IGk5NjAtKi1hb3V0KiB8IGk5NjAtKi1ib3V0KiB8IGk5NjAtKi1uaW5keSopCisgICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0CisgICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworCisgIG0zMnItKi0qKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tMzJyX3ZlYworICAgIDs7CisKKyAgbTY4Ki1hcG9sbG8tKikKKyAgICB0YXJnX2RlZnZlYz1hcG9sbG9jb2ZmX3ZlYworICAgIDs7CisgIG02OCotYnVsbC1zeXN2KikKKyAgICB0YXJnX2RlZnZlYz1tNjhrY29mZnVuX3ZlYworICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBtNjgqLW1vdG9yb2xhLXN5c3YqKQorICAgIHRhcmdfZGVmdmVjPW02OGtzeXN2Y29mZl92ZWMKKyAgICA7OworICBtNjgqLWhwLWJzZCopCisgICAgdGFyZ19kZWZ2ZWM9aHAzMDBic2RfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIG02OCotKi1hb3V0KikKKyAgICB0YXJnX2RlZnZlYz1hb3V0MF9iaWdfdmVjCisgICAgIyBXZSBpbmNsdWRlIGNpc2NvX2NvcmVfdmVjIGhlcmUsIHJhdGhlciB0aGFuIG1ha2luZyBhIHNlcGFyYXRlIGNpc2NvCisgICAgIyBjb25maWd1cmF0aW9uLCBzbyB0aGF0IGNpc2NvLWNvcmUuYyBnZXRzIHJvdXRpbmVseSB0ZXN0ZWQgYXQKKyAgICAjIGxlYXN0IGZvciBjb21waWxhdGlvbi4KKyAgICB0YXJnX3NlbHZlY3M9ImNpc2NvX2NvcmVfdmVjIGllZWVfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBtNjgqLSotZWxmKiB8IG02OCotKi1zeXN2NCopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgaWVlZV92ZWMiCisgICAgOzsKKyAgbTY4Ki0qLWNvZmYqIHwgbTY4Ki0qLXN5c3YqIHwgbTY4Ki0qLXJ0ZW1zKikKKyAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMiCisgICAgOzsKKyAgbTY4Ki0qLWhwdXgqKQorICAgIHRhcmdfZGVmdmVjPWhwMzAwaHB1eF92ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgbTY4Ki0qLWxpbnV4KmFvdXQqKQorICAgIHRhcmdfZGVmdmVjPW02OGtsaW51eF92ZWMKKyAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX202OGtfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIG02OCotKi1saW51eC1nbnUqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYworICAgIHRhcmdfc2VsdmVjcz1tNjhrbGludXhfdmVjCisgICAgOzsKKyAgbTY4Ki0qLWdudSopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCisgICAgIyB0YXJnX3NlbHZlY3M9bTY4a21hY2gzX3ZlYworICAgICMgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCisgICAgOzsKKyAgbTY4Ki0qLWx5bnhvcyopCisgICAgdGFyZ19kZWZ2ZWM9bTY4a2x5bnhfY29mZl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9bTY4a2x5bnhfYW91dF92ZWMKKyAgICA7OworICBtNjgqLWhwKi1uZXRic2QqKQorICAgIHRhcmdfZGVmdmVjPW02OGs0a25ldGJzZF92ZWMKKyAgICB0YXJnX3NlbHZlY3M9Im02OGtuZXRic2RfdmVjIGhwMzAwYnNkX3ZlYyBzdW5vc19iaWdfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKKyAgICB0YXJnX2RlZnZlYz1tNjhrbmV0YnNkX3ZlYworICAgIHRhcmdfc2VsdmVjcz0ibTY4azRrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgbTY4Ki0qLXN1bm9zKiB8IG02OCotKi1vczY4ayogfCBtNjgqLSotdnh3b3JrcyogfCBtNjgqLW5ldHgtKiB8IFwKKyAgbTY4Ki0qLWJzZCogfCBtNjgqLSotdnN0YSopCisgICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYworICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBtNjgqLWVyaWNzc29uLSopCisgICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYworICAgIHRhcmdfc2VsdmVjcz0ibTY4a2NvZmZfdmVjIHZlcnNhZG9zX3ZlYyB0ZWtoZXhfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBtNjgqLWNibS0qKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYworICAgIHRhcmdfc2VsdmVjcz1tNjhrY29mZl92ZWMKKyAgICA7OworICBtNjgqLWFwcGxlLWF1eCopCisgICAgdGFyZ19kZWZ2ZWM9bTY4a2F1eF9jb2ZmX3ZlYworICAgIDs7CisgIG02OCotKi1wc29zKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKKyAgICB0YXJnX3NlbHZlY3M9aWVlZV92ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworICBtODgqLWhhcnJpcy1jeHV4KiB8IG04OCotKi1kZ3V4KiB8IG04OCotKi1zeXN2NCopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX204OGtfdmVjCisgICAgdGFyZ19zZWx2ZWNzPW04OGtiY3NfdmVjCisgICAgOzsKKyAgbTg4Ki0qLW1hY2gzKikKKyAgICB0YXJnX2RlZnZlYz1tODhrbWFjaDNfdmVjCisgICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCisgICAgOzsKKyAgbTg4Ki0qLSopCisgICAgdGFyZ19kZWZ2ZWM9bTg4a2Jjc192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworICBtY29yZS0qLWVsZikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMiCisgICAgOzsKKyAgbWNvcmUtKi1wZSkKKyAgICB0YXJnX2RlZnZlYz1tY29yZV9wZV9iaWdfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJtY29yZV9wZV9iaWdfdmVjIG1jb3JlX3BlX2xpdHRsZV92ZWMgbWNvcmVfcGVpX2JpZ192ZWMgbWNvcmVfcGVpX2xpdHRsZV92ZWMiCisgICAgOzsKKworICBtaXBzKi1iaWctKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKKyAgICA7OworICBtaXBzLWRlYy1uZXRic2QqIHwgbWlwcyplbCotKi1uZXRic2QqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKKyAgICA7OworIG1pcHMqLSotbmV0YnNkKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCisgICAgOzsKKyAgbWlwcyotZGVjLWJzZCopCisgICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgbWlwcyotZGVjLW1hY2gzKikKKyAgICB0YXJnX2RlZnZlYz1hb3V0X21pcHNfbGl0dGxlX3ZlYworICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQworICAgIDs7CisgIG1pcHMqLWRlYy0qIHwgbWlwcyplbC0qLWVjb2ZmKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZl9saXR0bGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2JpZ192ZWMKKyAgICA7OworICBtaXBzKi0qLWVjb2ZmKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKKyAgICA7OworICBtaXBzKi0qLWlyaXg2KikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgorICAgIDs7CisgIG1pcHMqLSotaXJpeDUqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKKyAgICA7OworICBtaXBzKi1zZ2ktKiB8IG1pcHMqLSotYnNkKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKKyAgICA7OworICBtaXBzKi0qLWxuZXdzKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdsaXR0bGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCisgICAgOzsKKyAgbWlwcyotKi1tYWNoMyopCisgICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKKyAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKKyAgICA7OworICBtaXBzKi0qLXN5c3Y0KikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCisgICAgOzsKKyAgbWlwcyotKi1zeXN2KiB8IG1pcHMqLSotcmlzY29zKikKKyAgICB0YXJnX2RlZnZlYz1lY29mZl9iaWdfdmVjCisgICAgdGFyZ19zZWx2ZWNzPWVjb2ZmX2xpdHRsZV92ZWMKKyAgICA7OworICBtaXBzKmVsLSotZWxmKiB8IG1pcHMqZWwtKi12eHdvcmtzKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgorICAgIDs7CisgIG1pcHMqLSotZWxmKiB8IG1pcHMqLSotcnRlbXMqIHwgbWlwcyotKi12eHdvcmtzKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgorICAgIDs7CisgIG1pcHMqLSotbm9uZSkKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIgorICAgIDs7CisgIG1pcHMqZWwqLSotbGludXgtZ251KiB8IG1pcHMqZWwqLSotb3BlbmJzZCopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCisgICAgOzsKKyAgbWlwcyotKi1saW51eC1nbnUqIHwgbWlwcyotKi1vcGVuYnNkKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2JpZ192ZWMgZWNvZmZfbGl0dGxlX3ZlYyIKKyAgICA7OworCisgIG1uMTAyMDAtKi0qKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tbjEwMjAwX3ZlYworICAgIDs7CisKKyAgbW4xMDMwMC0qLSopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX21uMTAzMDBfdmVjCisgICAgOzsKKworICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikKKyAgICB0YXJnX2RlZnZlYz1wYzUzMm1hY2hhb3V0X3ZlYworICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLWxpdGVzKiB8IG5zMzJrLSotb3BlbmJzZCopCisgICAgdGFyZ19kZWZ2ZWM9cGM1MzJuZXRic2RfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisKKyAgcG93ZXJwYy0qLWFpeCogfCBwb3dlcnBjLSotYmVvcyopCisgICAgdGFyZ19kZWZ2ZWM9cnM2MDAwY29mZl92ZWMKKyAgICA7OworICBwb3dlcnBjLSotKmJzZCogfCBwb3dlcnBjLSotZWxmKiB8IHBvd2VycGMtKi1zeXN2NCogfCBwb3dlcnBjLSotZWFiaSogfCBcCisgIHBvd2VycGMtKi1zb2xhcmlzMiogfCBwb3dlcnBjLSotbGludXgtZ251KiB8IHBvd2VycGMtKi1ydGVtcyogfCBcCisgIHBvd2VycGMtKi12eHdvcmtzKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY192ZWMKKyAgICB0YXJnX3NlbHZlY3M9InJzNjAwMGNvZmZfdmVjIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjIHBwY2Jvb3RfdmVjIgorICAgIDs7CisgIHBvd2VycGMtKi1tYWNvcyogfCBwb3dlcnBjLSotbXB3KikKKyAgICB0YXJnX2RlZnZlYz1wbWFjX3hjb2ZmX3ZlYworICAgIDs7CisgIHBvd2VycGMtKi1uZXR3YXJlKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfcG93ZXJwY192ZWMKKyAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX3Bvd2VycGNfdmVjIHJzNjAwMGNvZmZfdmVjIgorICAgIDs7CisgIHBvd2VycGNsZS0qLWVsZiogfCBwb3dlcnBjbGUtKi1zeXN2NCogfCBwb3dlcnBjbGUtKi1lYWJpKiB8IFwKKyAgcG93ZXJwY2xlLSotc29sYXJpczIqIHwgcG93ZXJwY2xlLSotbGludXgtZ251KiB8IHBvd2VycGNsZS0qLXZ4d29ya3MqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJyczYwMDBjb2ZmX3ZlYyBiZmRfZWxmMzJfcG93ZXJwY192ZWMgcHBjYm9vdF92ZWMiCisgICAgOzsKKworICBwb3dlcnBjbGUtKi1wZSB8IHBvd2VycGNsZS0qLXdpbm50KiB8IHBvd2VycGNsZS0qLWN5Z3dpbiopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX3Bvd2VycGNsZV9wZV92ZWMKKyAgICB0YXJnX3NlbHZlY3M9ImJmZF9wb3dlcnBjbGVfcGVpX3ZlYyBiZmRfcG93ZXJwY19wZWlfdmVjIGJmZF9wb3dlcnBjbGVfcGVfdmVjIGJmZF9wb3dlcnBjX3BlX3ZlYyIKKyAgICA7OworCisgIHJzNjAwMC0qLSopCisgICAgdGFyZ19kZWZ2ZWM9cnM2MDAwY29mZl92ZWMKKyAgICA7OworCisgIHNoLSotZWxmKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc2hfdmVjCisgICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc2hsX3ZlYyBzaGNvZmZfdmVjIHNobGNvZmZfdmVjIHNoY29mZl9zbWFsbF92ZWMgc2hsY29mZl9zbWFsbF92ZWMiCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIHNoLSotKiB8IHNoLSotcnRlbXMqKQorICAgIHRhcmdfZGVmdmVjPXNoY29mZl92ZWMKKyAgICB0YXJnX3NlbHZlY3M9InNoY29mZl92ZWMgc2hsY29mZl92ZWMgc2hjb2ZmX3NtYWxsX3ZlYyBzaGxjb2ZmX3NtYWxsX3ZlYyIKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworICBzcGFyY2xldC0qLWFvdXQqKQorICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKKyAgICB0YXJnX3NlbHZlY3M9c3BhcmNsZV9hb3V0X3ZlYworICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBzcGFyYzg2eC0qLWFvdXQqKQorICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgc3BhcmNsaXRlLSotZWxmKiB8IHNwYXJjODZ4LSotZWxmKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCisgICAgOzsKKyAgc3BhcmMtKi1saW51eCphb3V0KikKKyAgICB0YXJnX2RlZnZlYz1zcGFyY2xpbnV4X3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgorICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworICBzcGFyYy0qLWxpbnV4LWdudSopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYworICAgIHRhcmdfc2VsdmVjcz0ic3BhcmNsaW51eF92ZWMgc3Vub3NfYmlnX3ZlYyIKKyAgICA7OworICBzcGFyYy0qLWx5bnhvcyopCisgICAgdGFyZ19kZWZ2ZWM9c3BhcmNseW54X2NvZmZfdmVjCisgICAgdGFyZ19zZWx2ZWNzPXNwYXJjbHlueF9hb3V0X3ZlYworICAgIDs7CisgIHNwYXJjLSotbmV0YnNkKiB8IHNwYXJjLSotb3BlbmJzZCopCisgICAgdGFyZ19kZWZ2ZWM9c3BhcmNuZXRic2RfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisgIHNwYXJjLSotZWxmKiB8IHNwYXJjLSotc29sYXJpczIqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKKyAgICB0YXJnX3NlbHZlY3M9c3Vub3NfYmlnX3ZlYworICAgIDs7CisgIHNwYXJjLSotc3lzdjQqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKKyAgICA7OworICBzcGFyYy0qLW5ldHdhcmUqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKKyAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX3NwYXJjX3ZlYyBzdW5vc19iaWdfdmVjIgorICAgIDs7CisjaWZkZWYgQkZENjQKKyAgc3BhcmM2NC0qLWFvdXQqKQorICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKyAgc3BhcmM2NC0qLWxpbnV4LWdudSopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYworICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX3NwYXJjX3ZlYyBzcGFyY2xpbnV4X3ZlYyBzdW5vc19iaWdfdmVjIgorICAgIDs7CisgIHNwYXJjNjQtKi1lbGYqKQorICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9zcGFyY192ZWMKKyAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX3NwYXJjX3ZlYworICAgIDs7ICAgIAorI2VuZGlmIC8qIEJGRDY0ICovCisgIHNwYXJjKi0qLWNvZmYqKQorICAgIHRhcmdfZGVmdmVjPXNwYXJjY29mZl92ZWMKKyAgICA7OworICBzcGFyYyotKi0qIHwgc3BhcmMqLSotcnRlbXMqKQorICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworI2lmIEhBVkVfaG9zdF9hb3V0X3ZlYworICB0YWhvZS0qLSopCisgICAgdGFyZ19kZWZ2ZWM9aG9zdF9hb3V0X3ZlYworICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKKyAgICA7OworI2VuZGlmCisKKyAgdGljODAqLSotKikKKyAgICB0YXJnX2RlZnZlYz10aWM4MGNvZmZfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisKKworICB2ODUwLSotKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKKyAgICA7OworICB2ODUwZS0qLSopCisgICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3Y4NTBfdmVjCisgICAgOzsKKyAgdjg1MGVhLSotKikKKyAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKKyAgICA7OworI2lmIEhBVkVfaG9zdF9hb3V0X3ZlYworICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKKyAgICB0YXJnX2RlZnZlYz1ob3N0X2FvdXRfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisjZW5kaWYKKworICB2YXgqLSotKnZtcyopCisgICAgdGFyZ19kZWZ2ZWM9dm1zX3ZheF92ZWMKKyAgICA7OworCisgIHdlMzJrLSotKikKKyAgICB0YXJnX2RlZnZlYz13ZTMya2NvZmZfdmVjCisgICAgOzsKKworICB3NjUtKi0qKQorICAgIHRhcmdfZGVmdmVjPXc2NV92ZWMKKyAgICA7OworCisgIHo4ayotKi0qKQorICAgIHRhcmdfZGVmdmVjPXo4a2NvZmZfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisKKyAgKi0qLWllZWUqKQorICAgIHRhcmdfZGVmdmVjPWllZWVfdmVjCisgICAgOzsKKworICAqLWFkb2JlLSopCisgICAgdGFyZ19kZWZ2ZWM9YV9vdXRfYWRvYmVfdmVjCisgICAgdGFyZ191bmRlcnNjb3JlPXllcworICAgIDs7CisKKyAgKi1zb255LSopCisgICAgdGFyZ19kZWZ2ZWM9bmV3c29zM192ZWMKKyAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCisgICAgOzsKKworICAqLXRhbmRlbS0qKQorICAgIHRhcmdfZGVmdmVjPW02OGtjb2ZmX3ZlYworICAgIHRhcmdfc2VsdmVjcz1pZWVlX3ZlYworICAgIDs7CisjIEVORCBPRiB0YXJnbWF0Y2guaAorICAqKQorICAgIGVjaG8gMT4mMiAiKioqIEJGRCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9LiIKKyAgICBlY2hvIDE+JjIgIioqKiBMb29rIGluIGJmZC9jb25maWcuYmZkIGZvciBzdXBwb3J0ZWQgdGFyZ2V0cy4iCisgICAgZXhpdCAxCisgICAgOzsKK2VzYWMKKworIyBJZiB3ZSBzdXBwb3J0IGFueSBFTEYgdGFyZ2V0LCB0aGVuIGF1dG9tYXRpY2FsbHkgYWRkIHN1cHBvcnQgZm9yIHRoZQorIyBnZW5lcmljIEVMRiB0YXJnZXRzLiAgVGhpcyBwZXJtaXRzIGFuIG9iamR1bXAgd2l0aCBzb21lIEVMRiBzdXBwb3J0CisjIHRvIGJlIHVzZWQgb24gYW4gYXJiaXRyYXJ5IEVMRiBmaWxlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuCisjIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCitjYXNlICIke3RhcmdfZGVmdmVjfSAke3Rhcmdfc2VsdmVjc30iIGluCisgICpiZmRfZWxmNjQqKQorICAgIHRhcmdfc2VsdmVjcz0iJHt0YXJnX3NlbHZlY3N9IGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYyBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMiCisgICAgOzsKKyAgKmJmZF9lbGYzMiopCisgICAgdGFyZ19zZWx2ZWNzPSIke3Rhcmdfc2VsdmVjc30gYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjIgorICAgIDs7Citlc2FjCmRpZmYgLS1naXQgYS9iZmQvY29uZmlnLmluIGIvYmZkL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZhNDViCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvbmZpZy5pbgpAQCAtMCwwICsxLDIzNCBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICAqLworI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9GQ05UTAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZkb3BlbiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9GRE9QRU4KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01BRFZJU0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NUFJPVEVDVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGl0aW1lciBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRJVElNRVIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNjb25mIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NZU0NPTkYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0RJUkVOVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ORElSX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1REREVGX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfRklMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19ORElSX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wcm9jZnMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BST0NGU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSAorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBQQUNLQUdFCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAqLworI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4KKworLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgorCisvKiBEZWZpbmUgaWYgbWFsbG9jIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCisKKy8qIERlZmluZSBpZiByZWFsbG9jIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQworCisvKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKKworLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgorCisvKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHByc3RhdHVzX3QuICovCisjdW5kZWYgSEFWRV9QUlNUQVRVU19UCisKKy8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJzdGF0dXNfdC5wcl93aG8uICovCisjdW5kZWYgSEFWRV9QUlNUQVRVU19UX1BSX1dITworCisvKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBzdGF0dXNfdC4gKi8KKyN1bmRlZiBIQVZFX1BTVEFUVVNfVAorCisvKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIHBycHNpbmZvX3QuICovCisjdW5kZWYgSEFWRV9QUlBTSU5GT19UCisKKy8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHNpbmZvX3QuICovCisjdW5kZWYgSEFWRV9QU0lORk9fVAorCisvKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LiAqLworI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1QKKworLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBsd3BzdGF0dXNfdC5wcl9jb250ZXh0LiAqLworI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVAorCisvKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LnByX3JlZy4gKi8KKyN1bmRlZiBIQVZFX0xXUFNUQVRVU19UX1BSX1JFRworCisvKiBOYW1lIG9mIGhvc3Qgc3BlY2lmaWMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiB0cmFkLWNvcmUuYy4gKi8KKyN1bmRlZiBUUkFEX0hFQURFUgorCisvKiBVc2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT8gKi8KKyN1bmRlZiBVU0VfTU1BUAorCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlIGIvYmZkL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNmNhNjZmCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDU5ODcgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1tbWFwICAgICAgICAgICAgIHRyeSB1c2luZyBtbWFwIGZvciBCRkQgaW5wdXQgZmlsZXMgaWYgYXZhaWxhYmxlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1saWJiZmQuYworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjE1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MzM6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY1ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njg4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NzE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDc4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjc4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MTM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MTg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjgyNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NDY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4Nzg6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkxMTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NjQ6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCisgICBmaQorICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KKyAgIGZpCisKKyAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIieWVzIiAxPiY2CitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAyMTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisKK1BBQ0tBR0U9YmZkCisKK1ZFUlNJT049Mi45LjQKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9CitmaQorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitFT0YKKworCisKK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDY3OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQUNMT0NBTD1hY2xvY2FsCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwODA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9DT05GPWF1dG9jb25mCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA5MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT01BS0U9YXV0b21ha2UKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMDY6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTExOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgTUFLRUlORk89bWFrZWluZm8KKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKKworCitpZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgorICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQorZWxzZQorICBhY190b29sX3ByZWZpeD0KK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKK2ZpCitmaQorQVI9IiRhY19jdl9wcm9nX0FSIgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIFJBTkxJQj0iOiIKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD1ubworZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCisgIHA9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfc3RhdGljPXllcyA7Oworbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyopCisgIGVuYWJsZV9zdGF0aWM9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc3RhdGljPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgorICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzI5OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQorICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCisgIGNhc2UgIiRhY19wcm9nIiBpbgorICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgLyogfCBbQS1aYS16XTpcXCopCisgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM0NzogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CitlbHNlCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzUwOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKyAgICAgICAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGFjX2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQordGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzODY6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitpZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCisgIGFjX2N2X3Byb2dfZ251X2xkPXllcworZWxzZQorICBhY19jdl9wcm9nX2dudV9sZD1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MDI6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGFjX2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gJFBBVEggL2JpbjsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCisgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgorICAgICAgZWxzZQorICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIgorICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KK2ZpCitmaQorCitOTT0iJGFjX2N2X3BhdGhfTk0iCitlY2hvICIkYWNfdCIiJE5NIiAxPiY2CisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQzNzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgcm0gLWYgY29uZnRlc3RkYXRhCitpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAordGhlbgorICBybSAtZiBjb25mdGVzdGRhdGEKKyAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19MTl9TPWxuCitmaQorZmkKK0xOX1M9IiRhY19jdl9wcm9nX0xOX1MiCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKKworIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KK2xpYnRvb2xfZmxhZ3M9Cit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgordGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgordGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgordGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgorCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAiJGhvc3QiIGluCisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lIDE0NzMgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtMzIiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICA7OworCisqLSotY3lnd2luKikKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0RMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTUzMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKK2ZpCitmaQorRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIERMTFRPT0w9ImZhbHNlIgorZmkKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTY2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0FTPSIkYWNfY3ZfcHJvZ19BUyIKK2lmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKK2ZpCitmaQorQVM9IiRhY19jdl9wcm9nX0FTIgoraWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorICBBUz0iZmFsc2UiCitmaQorZmkKKworCisgIDs7CisKK2VzYWMKKworIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KK0NDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAorTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAorRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKKyR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKKyRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCit8fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9CisKKyMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90CisjIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgorZXhlYyA1Pj4uL2NvbmZpZy5sb2cKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjQtYml0LWJmZCBvciAtLWRpc2FibGUtNjQtYml0LWJmZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV82NF9iaXRfYmZkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV82NF9iaXRfYmZkIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgIHdhbnQ2ND10cnVlICA7OworICBubykgICB3YW50NjQ9ZmFsc2UgOzsKKyAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitlbHNlCisgIHdhbnQ2ND1mYWxzZQorZmkKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQorICAgICAgICAgICAgOzsKKyAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OworICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OworZXNhYworZmkKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7CisgIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitmaQorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tbWFwIG9yIC0td2l0aG91dC1tbWFwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9tbWFwK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX21tYXAiCisgIGNhc2UgIiR7d2l0aHZhbH0iIGluCisgIHllcykgIHdhbnRfbW1hcD10cnVlIDs7CisgIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OworICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBCRkQgd2l0aC1tbWFwIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitlbHNlCisgIHdhbnRfbW1hcD1mYWxzZQorZmkKKworCisKKworCitpZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9CitmaQoraWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MTg6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKKyAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCitmaQorCisgIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgorICAKKworaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgorICBNQUlOVEFJTkVSX01PREVfVFJVRT0KKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJworZWxzZQorICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQorZmkKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisgIAorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzQxOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzQ2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKyNpZm5kZWYgX19DWUdXSU5fXworI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworI2VuZGlmCityZXR1cm4gX19DWUdXSU5fXzsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY3lnd2luPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jeWd3aW49bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKK0NZR1dJTj0KK3Rlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzc0OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE3NzkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiBfX01JTkdXMzJfXzsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfbWluZ3czMj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfbWluZ3czMj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0Kgorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKK01JTkdXMzI9Cit0ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MDU6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCisgIGFjX2N2X2V4ZWV4dD0uZXhlCitlbHNlCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3ZfZXhlZXh0PQorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KKyAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OworICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCisgIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KK2ZpCitmaQorCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2CithY19leGVleHQ9JEVYRUVYVAorCisKK2hvc3Q2ND1mYWxzZQordGFyZ2V0NjQ9ZmFsc2UKKworIyBob3N0IHN0dWZmOgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTI1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTU3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorCisjbGluZSAxOTY4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTk5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAwNDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAxMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDMyOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisKK0FMTF9MSU5HVUFTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNjY6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA4MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjEwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjExNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjEyMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0NjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE1MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjE1OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxOTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIxNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI1NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjU6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMzMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzY1OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzcwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzOTg6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQwMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0MzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0NjY6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUzMTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1MzYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYxNjogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI2MjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjY3MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjY3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzA3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzEyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NjA6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3NjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTM2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk0MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk0NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5NzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5ODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzAzMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzAzOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwOTU6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzEwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTI4OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxNDg6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE2NzogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzE3MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE5NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyMjI6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI1NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyOTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzMzYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzQ1NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmUKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWIKK2ZpCitybSAtZiBjb25mdGVzdCoKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCSAgICAgICAgCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0OTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzU2NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY1NDogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY4MjogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzY4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjkyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KKy4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0CisKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNzcwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKK0JGRF9IT1NUXzY0QklUX0xPTkc9MAorQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAorQkZEX0hPU1RfNjRfQklUPQorQkZEX0hPU1RfVV82NF9CSVQ9CitpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KKyAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCitlbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgorICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCisgIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KKyAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KK2ZpCisKKworCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KKyAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworICBlbHNlCisgICAgQ0NfRk9SX0JVSUxEPWdjYworICBmaQorZmkKKworIyBBbHNvIHNldCBFWEVFWFRfRk9SX0JVSUxELgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgRVhFRVhUX0ZPUl9CVUlMRD0nJChFWEVFWFQpJworZWxzZQorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODUzOiBjaGVja2luZyBmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfYnVpbGRfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gYWNfY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCisgICAgJHtDQ19GT1JfQlVJTER9IC1vIGFjX2NfdGVzdCBhbV9jX3Rlc3QuYyAxPiY1IDI+JjUKKyAgICBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvIGFjX2NfdGVzdC4qIHwgZ3JlcCAtdiBhY19jX3Rlc3QuYyB8IHNlZCAtZSBzL2FjX2NfdGVzdC8vYAorICAgIHJtIC1mIGFjX2NfdGVzdCoKKyAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm8KK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2J1aWxkX2V4ZWV4dCIgMT4mNgorICBFWEVFWFRfRk9SX0JVSUxEPSIiCisgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9CitmaQorCisKK2ZvciBhY19oZHIgaW4gc3RkZGVmLmggc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHRpbWUuaCB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4Nzg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzODgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODg4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIHN5cy9maWxlLmggc3lzL3RpbWUuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5MTg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzOTIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTI4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5NTU6IGNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfdGltZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM5NjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgoraW50IG1haW4oKSB7CitzdHJ1Y3QgdG0gKnRwOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5Njk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfdGltZT15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3RpbWU9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3RpbWUiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBUSU1FX1dJVEhfU1lTX1RJTUUgMQorRU9GCisKK2ZpCisKK2FjX2hlYWRlcl9kaXJlbnQ9bm8KK2ZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozOTk0OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzk5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8JGFjX2hkcj4KK2ludCBtYWluKCkgeworRElSICpkaXJwID0gMDsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDA3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisjIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCitpZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDMyOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1CithY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZGlyICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQwNDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWxkaXIiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDczOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiID4mNQorYWNfbGliX3Zhcj1gZWNobyB4J18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWx4ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQwODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWx4IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKK2ZvciBhY19mdW5jIGluIGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbgorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDExNzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDEyMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKworY2FzZSAiJHtob3N0fSIgaW4KKyotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTiAxCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTgwOiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDE4NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2CitpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDIyNzogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQyMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgbWFsbG9jCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI1MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0Mjc0OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0Mjc5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHJlYWxsb2MKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzAwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jIiAxPiY2CitpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDMyMTogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDMyNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDM2ODogY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQzNzMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZ2V0ZW52Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM5NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYgMQorRU9GCisKK2ZpCisKKworIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUsIHBpY2sgYSBjb3JlIGZpbGUgc3VwcG9ydCBmaWxlLgorQ09SRUZJTEU9CitDT1JFRkxBRz0KK1RSQURfSEVBREVSPQoraWYgdGVzdCAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IjsgdGhlbgorICBjYXNlICIke2hvc3R9IiBpbgorICBhbHBoYSotKi1saW51eC1nbnUqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvYWxwaGFsaW51eC5oIicKKwk7OworICBhbHBoYSotKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OworICBhbHBoYSotKi0qKQkJQ09SRUZJTEU9b3NmLWNvcmUubG8gOzsKKyAgYXJtLSotcmlzY2l4KQkJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7CisgIGhwcGEqLSotaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OworICBocHBhKi0qLWhpdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKKyAgaHBwYSotKi1tcGVpeCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OworICBocHBhKi0qLWJzZCopCQlDT1JFRklMRT0iaHB1eC1jb3JlLmxvIGhwcGFic2QtY29yZS5sbyIKKwkJCUNPUkVGTEFHPSItREhQVVhfQ09SRSAtREhQUEFCU0RfQ09SRSIgOzsKKyAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG87CisJVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKKwk7OworICBpWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7CisgIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCisJOzsKKyAgaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmJzZC5oIicKKwk7OworICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCisJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KKwk7OworICBpWzM0NTZdODYtZXNpeC1zeXN2MyopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9lc2l4LmgiJworCTs7CisgIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKKwlDT1JFRklMRT1zY281LWNvcmUubG8KKwk7OworICBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZzY28uaCInCisJOzsKKyAgaVszNDU2XTg2LSotbWFjaDMqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvaTM4Nm1hY2gzLmgiJworCTs7CisgIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bGludXguaCInCisJOzsKKyAgaVszNDU2XTg2LSotaXNjKikJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7CisgIGlbMzQ1Nl04Ni0qLWFpeCopCUNPUkVGSUxFPWFpeDM4Ni1jb3JlLmxvIDs7CisgIGk4NjAtKi1tYWNoMyogfCBpODYwLSotb3NmMSopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9pODYwbWFjaDMuaCInCisJOzsKKyAgbWlwcy1kZWMtYnNkKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNic2QuaCInCisJOzsKKyAgbWlwcy1kZWMtbWFjaDMqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJworCTs7CisgIG1pcHMtKi1uZXRic2QqIHwgbWlwcyotKi1vcGVuYnNkKikKKwlDT1JFRklMRT1uZXRic2QtY29yZS5sbworCTs7CisgIG1pcHMtZGVjLSopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9kZWNzdGF0aW9uLmgiJworCTs7CisgIG1pcHMtc2dpLWlyaXg0KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7CisgIG1pcHMtc2dpLWlyaXg1KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7CisgIG1pcHMtc2dpLWlyaXg2KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7CisgIG1pcHMtKi1tYWNoMyopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCisJOzsKKyAgbWlwcy0qLXN5c3Y0KikJOzsKKyAgbWlwcy0qLXN5c3YqIHwgbWlwcy0qLXJpc2NvcyopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9yaXNjb3MuaCInCisJOzsKKyAgbWlwcy1zb255LWJzZCopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLW1pcHMuaCInCisJOzsKKyAgbTY4Ki1idWxsKi1zeXN2KikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL2RweDIuaCInCisJOzsKKyAgbTY4Ki1ocC1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7CisgIG02OCotaHAtYnNkKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL2hwMzAwYnNkLmgiJworCTs7CisgIG02OCotKi1saW51eC1nbnUqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2xpbnV4LmgiJworCTs7CisgIG02OCotbW90b3JvbGEtc3lzdiopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9kZWx0YTY4LmgiJworCTs7CisgIG02OCotc29ueS0qKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy5oIicKKwk7OworICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKKwlDT1JFRklMRT1uZXRic2QtY29yZS5sbworCTs7CisgIG02OCotYXBwbGUtYXV4KikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL202OGthdXguaCInCisJOzsKKyAgbTg4Ki0qLXN5c3Y0KikJOzsKKyAgbTg4Ki1tb3Rvcm9sYS1zeXN2KikJQ09SRUZJTEU9cHRyYWNlLWNvcmUubG8gOzsKKyAgbTg4Ki0qLW1hY2gzKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL204OGttYWNoMy5oIicKKwk7OworICBuczMyay1wYzUzMi1tYWNoKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvcGM1MzJtYWNoLmgiJworCTs7CisgIG5zMzJrLSotbmV0YnNkKiB8IG5zMzJrLSotb3BlbmJzZCopCisJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KKwk7OworICByczYwMDAtKi1seW54KikJQ09SRUZJTEU9bHlueC1jb3JlLmxvIDs7CisgIHJzNjAwMC0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OworICByczYwMDAtKi0qKQkJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKKyAgcG93ZXJwYy0qLSpic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OworICBwb3dlcnBjLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7CisgIHBvd2VycGMtKi1haXgqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OworICBwb3dlcnBjLSotYmVvcyopCTs7CisgIHBvd2VycGMtKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OworICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQorCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCisJOzsKKyAgdGFob2UtKi0qKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvdGFob2UuaCInCisJOzsKKyAgdmF4LSotdWx0cml4MiopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJworCTs7CisgIHZheC0qLXVsdHJpeCopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJworCTs7CisgIHZheC0qLSopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy92YXhic2QuaCInCisJOzsKKyAgZXNhYworCisgIGNhc2UgIiRDT1JFRklMRSIgaW4KKyAgYWl4Mzg2LWNvcmUubG8pCUNPUkVGTEFHPS1EQUlYMzg2X0NPUkUgOzsKKyAgaHBwYWJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tREhQUEFCU0RfQ09SRSA7OworICBocHV4LWNvcmUubG8pCQlDT1JFRkxBRz0tREhQVVhfQ09SRSA7OworICBpcml4LWNvcmUubG8pCQlDT1JFRkxBRz0tRElSSVhfQ09SRSA7OworICBseW54LWNvcmUubG8pCQlDT1JFRkxBRz0tRExZTlhfQ09SRSA7OworICBuZXRic2QtY29yZS5sbykJQ09SRUZMQUc9LURORVRCU0RfQ09SRSA7OworICBvc2YtY29yZS5sbykJCUNPUkVGTEFHPS1ET1NGX0NPUkUgOzsKKyAgcHRyYWNlLWNvcmUubG8pCUNPUkVGTEFHPS1EUFRSQUNFX0NPUkUgOzsKKyAgcnM2MDAwLWNvcmUubG8pCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRSIgOzsKKyAgc2NvNS1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFNDTzVfQ09SRSIgOzsKKyAgdHJhZC1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFRSQURfQ09SRSIgOzsKKyAgZXNhYworCisgICMgRUxGIGNvcmVmaWxlIHN1cHBvcnQgaGFzIHNldmVyYWwgZmxhdm9ycywgYnV0IGFsbCBvZgorICAjIHRoZW0gdXNlIHNvbWV0aGluZyBjYWxsZWQgPHN5cy9wcm9jZnMuaD4KKyAgZm9yIGFjX2hkciBpbiBzeXMvcHJvY2ZzLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NTk1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDYwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NDYwNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfcHJvY2ZzX2giID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NjMzOiBjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ2MzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KK2ludCBtYWluKCkgeworcHJzdGF0dXNfdCBhdmFyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdD1ubworICAgCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCisgaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3QgPSB5ZXM7IHRoZW4KKyAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1BSU1RBVFVTX1QgMQorRU9GCisKKyBmaQorIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3QiIDE+JjYKKworICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcnN0YXR1c190LnByX3dobyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ2Njc6IGNoZWNraW5nIGZvciBwcnN0YXR1c190LnByX3dobyBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDY3MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgoraW50IG1haW4oKSB7CitwcnN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3dobworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2Nzk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvPW5vCisgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvID0geWVzOyB0aGVuCisgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9QUlNUQVRVU19UX1BSX1dITyAxCitFT0YKKworIGZpCisgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvIiAxPiY2CisKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDcwMTogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDcwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgoraW50IG1haW4oKSB7Citwc3RhdHVzX3QgYXZhcgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MTM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PW5vCisgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190ID0geWVzOyB0aGVuCisgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9QU1RBVFVTX1QgMQorRU9GCisKKyBmaQorIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdCIgMT4mNgorCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBycHNpbmZvX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NzM1OiBjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ3NDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KK2ludCBtYWluKCkgeworcHJwc2luZm9fdCBhdmFyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc0NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdD1ubworICAgCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCisgaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3QgPSB5ZXM7IHRoZW4KKyAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1BSUFNJTkZPX1QgMQorRU9GCisKKyBmaQorIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3QiIDE+JjYKKworICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ3Njk6IGNoZWNraW5nIGZvciBwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0Nzc0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CitpbnQgbWFpbigpIHsKK3BzaW5mb190IGF2YXIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzgxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9bm8KKyAgIAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCA9IHllczsgdGhlbgorICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfUFNJTkZPX1QgMQorRU9GCisKKyBmaQorIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190IiAxPiY2CisKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0ODAzOiBjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKKyBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDgwOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgoraW50IG1haW4oKSB7Citsd3BzdGF0dXNfdCBhdmFyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgxNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PW5vCisgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QgPSB5ZXM7IHRoZW4KKyAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xXUFNUQVRVU19UIDEKK0VPRgorCisgZmkKKyBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCIgMT4mNgorCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX2NvbnRleHQgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0ODM3OiBjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0ODQyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CitpbnQgbWFpbigpIHsKK2x3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX2NvbnRleHQKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9bm8KKyAgIAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCA9IHllczsgdGhlbgorICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCAxCitFT0YKKworIGZpCisgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQiIDE+JjYKKworICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0ODcxOiBjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfcmVnIGluIHN5cy9wcm9jZnMuaCIgPiY1CisgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDg3NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgoraW50IG1haW4oKSB7Citsd3BzdGF0dXNfdCBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci5wcl9yZWcKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODgzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnPW5vCisgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZyA9IHllczsgdGhlbgorICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHIDEKK0VPRgorCisgZmkKKyBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnIiAxPiY2CisKKyAgZmkKK2ZpCisKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVFJBRF9IRUFERVIgJFRSQURfSEVBREVSCitFT0YKKworCisjIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KK1dJTjMyTERGTEFHUz0KK1dJTjMyTElCQUREPQorY2FzZSAiJHtob3N0fSIgaW4KKyotKi1jeWd3aW4qKQorICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgorICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKKyAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgorICBmaQorICA7OworZXNhYworCisKKworIyB0YXJnZXQgc3R1ZmY6CisKKyMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgoraWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KKyAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAorICAgIGRvCisJcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKKwlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KKwkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKKwllbHNlCisJICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCisJICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgorCWZpCisgICAgZG9uZQorZmkKKworYWxsX3RhcmdldHM9ZmFsc2UKK2RlZnZlYz0KK3NlbHZlY3M9CitzZWxhcmNocz0KK1RERUZJTkVTPQorZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cworZG8KKyAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCisgICAgICAgIGFsbF90YXJnZXRzPXRydWUKKyAgICBlbHNlCisJLiAkc3JjZGlyL2NvbmZpZy5iZmQKKwlpZiB0ZXN0ICJ4JHRhcmciID0gIngkdGFyZ2V0IjsgdGhlbgorCSAgICBkZWZ2ZWM9JHRhcmdfZGVmdmVjCisJZmkKKwlzZWx2ZWNzPSIkc2VsdmVjcyAkdGFyZ19kZWZ2ZWMgJHRhcmdfc2VsdmVjcyIKKwlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgorCVRERUZJTkVTPSIkVERFRklORVMgJHRhcmdfY2ZsYWdzIgorICAgIGZpCitkb25lCisKKworIyBUaGlzIHByb2Nlc3Npbmcgc3RpbGwgbmVlZHMgdG8gYmUgZG9uZSBpZiB3ZSdyZSB0byBkZWNpZGUgcHJvcGVybHkgd2hldGhlcgorIyA2NC1iaXQgc3VwcG9ydCBuZWVkcyB0byBiZSBjb21waWxlZCBpbi4gIEN1cnJlbnRseSwgaXQgd2lsbCBiZSBpbmNsdWRlZCBpZgorIyB0aGUgZGVmYXVsdCBvciBhbnkgb3RoZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgdGFyZ2V0IHJlcXVpcmVzIGl0OyBpdAorIyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBvbiBhIDMyLWJpdCBob3N0IGlmIG5vIDY0LWJpdCB0YXJnZXQgaXMgcmVxdWVzdGVkLCBhbmQKKyMgbm8gIi0td2l0aC02NC1iaXQtYmZkIiBvcHRpb24gaXMgZ2l2ZW4sIGV2ZW4gaWYgIi0td2l0aC10YXJnZXRzPWFsbCIgaXMKKyMgdXNlZC4KKworIyB1bmlxIHRoZSBkZWZhdWx0IGFuZCBzZWxlY3RlZCB2ZWN0b3JzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgorZj0iIgorZm9yIGkgaW4gJHNlbHZlY3MgOyBkbworICAgIGNhc2UgIiAkZiAiIGluCisgICAgKiIgJGkgIiopIDs7CisgICAgKikgZj0iJGYgJGkiIDs7CisgICAgZXNhYworZG9uZQorc2VsdmVjcz0iJGYiCisKKworIyB1bmlxIHRoZSBhcmNoaXRlY3R1cmVzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgorZj0iIgorZm9yIGkgaW4gJHNlbGFyY2hzIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICoiICRpICIqKSA7OworICAgICopIGY9IiRmICRpIiA7OworICAgIGVzYWMKK2RvbmUKK3NlbGFyY2hzPSIkZiIKKworIyBUYXJnZXQgYmFja2VuZCAubyBmaWxlcy4KK3RiPQorCitlbGY9ImVsZi5sbyBlbGZsaW5rLmxvIGR3YXJmMi5sbyBkd2FyZjEubG8iCisKK2ZvciB2ZWMgaW4gJHNlbHZlY3MKK2RvCisgICAgY2FzZSAiJHZlYyIgaW4KKyAgICAjIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGNvbXBhcmUKKyAgICAjIHdpdGggdGhlIHR3byB2ZWN0b3IgbGlzdHMgaW4gdGFyZ2V0cy5jLgorICAgIGEyOWtjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYTI5ay5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBhX291dF9hZG9iZV92ZWMpCQl0Yj0iJHRiIGFvdXQtYWRvYmUubG8gYW91dDMyLmxvIiA7OworICAgIGFybWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFybWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFybXBlX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKKyAgICBhcm1wZWlfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFybV9lcG9jX3BlX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKKyAgICBhb3V0MF9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0MC5sbyBhb3V0MzIubG8iIDs7CisgICAgYW91dF9hcm1fYmlnX3ZlYykJCXRiPSIkdGIgYW91dC1hcm0ubG8gYW91dDMyLmxvIiA7OworICAgIGFvdXRfYXJtX2xpdHRsZV92ZWMpCXRiPSIkdGIgYW91dC1hcm0ubG8gYW91dDMyLmxvIiA7OworICAgIGFvdXRfbWlwc19iaWdfdmVjKQkJdGI9IiR0YiBtaXBzYnNkLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBhb3V0X21pcHNfbGl0dGxlX3ZlYykJdGI9IiR0YiBtaXBzYnNkLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBhcG9sbG9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hcG9sbG8ubG8iIDs7CisgICAgYl9vdXRfdmVjX2JpZ19ob3N0KQkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKKyAgICBiX291dF92ZWNfbGl0dGxlX2hvc3QpCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7CisgICAgYmZkX2VsZjY0X2FscGhhX3ZlYykJdGI9IiR0YiBlbGY2NC1hbHBoYS5sbyBlbGY2NC5sbyAkZWxmIgorCQkJCXRhcmdldDY0PXRydWUgOzsKKyAgICBiZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1hcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYykJdGI9IiR0YiBlbGZhcm0tbmFiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMpIHRiPSIkdGIgZWxmYXJtLW9hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfYmlnYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1hcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfYmlnYXJtX3ZlYykJdGI9IiR0YiBlbGZhcm0tbmFiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpCXRiPSIkdGIgZWxmYXJtLW9hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7CisgICAgYmZkX2VsZjY0X2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGJmZF9lbGYzMl9kMTB2X3ZlYykJCXRiPSIkdGIgZWxmMzItZDEwdi5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9kMzB2X3ZlYykJCXRiPSIkdGIgZWxmMzItZDMwdi5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9mcjMwX3ZlYykJCXRiPSIkdGIgZWxmMzItZnIzMC5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9ocHBhX3ZlYykJCXRiPSIkdGIgZWxmMzItaHBwYS5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9pMzg2X3ZlYykJCXRiPSIkdGIgZWxmMzItaTM4Ni5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9pODYwX3ZlYykJCXRiPSIkdGIgZWxmMzItaTg2MC5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OworICAgIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgorCQkJCXRhcmdldDY0PXRydWUgOzsKKyAgICBiZmRfZWxmMzJfbTMycl92ZWMpCQl0Yj0iJHRiIGVsZjMyLW0zMnIubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbTY4a192ZWMpCQl0Yj0iJHRiIGVsZjMyLW02OGsubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbTg4a192ZWMpCQl0Yj0iJHRiIGVsZjMyLW04OGsubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX21uMTAyMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAyMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbW4xMDMwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDMwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfc2hfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7CisgICAgYmZkX2VsZjMyX3NobF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKKyAgICBiZmRfZWxmMzJfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLXNwYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX3Y4NTBfdmVjKQkJdGI9IiR0YiBlbGYzMi12ODUwLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGJmZF9lbGY2NF9zcGFyY192ZWMpCXRiPSIkdGIgZWxmNjQtc3BhcmMubG8gZWxmNjQubG8gJGVsZiIKKwkJCQl0YXJnZXQ2ND10cnVlIDs7CisgICAgY2lzY29fY29yZV92ZWMpCQl0Yj0iJHRiIGNpc2NvLWNvcmUubG8iIDs7CisgICAgZGVtb182NF92ZWMpCQl0Yj0iJHRiIGRlbW82NC5sbyBhb3V0NjQubG8iCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGVjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7CisgICAgZWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKKyAgICBlY29mZl9iaWdsaXR0bGVfdmVjKQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7CisgICAgZWNvZmZhbHBoYV9saXR0bGVfdmVjKQl0Yj0iJHRiIGNvZmYtYWxwaGEubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIgorCQkJCXRhcmdldDY0PXRydWUgOzsKKyAgICBnbzMyY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtZ28zMi5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBnbzMyc3R1YmJlZGNvZmZfdmVjKQl0Yj0iJHRiIGNvZmYtc3RnbzMyLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGg4MzAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDgzMDAubG8gcmVsb2MxNi5sbyIgOzsKKyAgICBoODUwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4NTAwLmxvIHJlbG9jMTYubG8iIDs7CisgICAgaG9zdF9hb3V0X3ZlYykJCXRiPSIkdGIgaG9zdC1hb3V0LmxvIGFvdXQzMi5sbyIgOzsKKyAgICBocDMwMGJzZF92ZWMpCQl0Yj0iJHRiIGhwMzAwYnNkLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBocDMwMGhwdXhfdmVjKQkJdGI9IiR0YiBocDMwMGhwdXgubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZhb3V0X3ZlYykJCXRiPSIkdGIgaTM4NmFvdXQubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZic2RfdmVjKQkJdGI9IiR0YiBpMzg2YnNkLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBpMzg2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTM4Ni5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBpMzg2ZHluaXhfdmVjKQkJdGI9IiR0YiBpMzg2ZHluaXgubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZmcmVlYnNkX3ZlYykJCXRiPSIkdGIgaTM4NmZyZWVic2QubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZtc2Rvc192ZWMpCQl0Yj0iJHRiIGkzODZtc2Rvcy5sbyIgOzsKKyAgICBpMzg2cGVfdmVjKQkJCXRiPSIkdGIgcGUtaTM4Ni5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgaTM4NnBlaV92ZWMpCQl0Yj0iJHRiIHBlaS1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGkzODZsaW51eF92ZWMpCQl0Yj0iJHRiIGkzODZsaW51eC5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4Nmx5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIGkzODZseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4Nmx5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLWkzODZseW54LmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKKyAgICBpMzg2bWFjaDNfdmVjKQkJdGI9IiR0YiBpMzg2bWFjaDMubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZuZXRic2RfdmVjKQkJdGI9IiR0YiBpMzg2bmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBpMzg2b3M5a192ZWMpCQl0Yj0iJHRiIGkzODZvczlrLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBpODYwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTg2MC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBpY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7CisgICAgaWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGllZWVfdmVjKQkJCXRiPSIkdGIgaWVlZS5sbyIgOzsKKyAgICBtNjhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBtNjhrY29mZnVuX3ZlYykJCXRiPSIkdGIgY29mZi11NjhrLmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBtNjhrbGludXhfdmVjKQkJdGI9IiR0YiBtNjhrbGludXgubG8gYW91dDMyLmxvIiA7OworICAgIG02OGtseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBtNjhrbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OworICAgIG02OGtseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1tNjhrbHlueC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OworICAgIG02OGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBtNjhrNGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrNGtuZXRic2QubG8gYW91dDMyLmxvIiA7OworICAgIG02OGthdXhfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXV4LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBtNjhrc3lzdmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXN2bTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBtODhrYmNzX3ZlYykJCXRiPSIkdGIgY29mZi1tODhrLmxvIiA7OworICAgIG1jb3JlX3BlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIG1jb3JlX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7CisgICAgbWNvcmVfcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZWktbWNvcmUubG8gY29mZmxpbmsubG8iIDs7CisgICAgbmV3c29zM192ZWMpCQl0Yj0iJHRiIG5ld3NvczMubG8gYW91dDMyLmxvIiA7OworICAgIG5sbTMyX2kzODZfdmVjKQkJdGI9IiR0YiBubG0zMi1pMzg2LmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKKyAgICBubG0zMl9zcGFyY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXNwYXJjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKKyAgICBubG0zMl9hbHBoYV92ZWMpCQl0Yj0iJHRiIG5sbTMyLWFscGhhLmxvIG5sbTMyLmxvIG5sbS5sbyIKKwkJCQl0YXJnZXQ2ND10cnVlIDs7CisgICAgcmlzY2l4X3ZlYykJCQl0Yj0iJHRiIGFvdXQzMi5sbyByaXNjaXgubG8iIDs7CisgICAgbmxtMzJfcG93ZXJwY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXBwYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7CisgICAgcGM1MzJuZXRic2RfdmVjKQkJdGI9IiR0YiBuczMya25ldGJzZC5sbyBhb3V0LW5zMzJrLmxvIiA7OworICAgIHBjNTMybWFjaGFvdXRfdmVjKQkJdGI9IiR0YiBwYzUzMi1tYWNoLmxvIGFvdXQtbnMzMmsubG8iIDs7CisgICAgcG1hY194Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcG1hYy5sbyB4Y29mZmxpbmsubG8iIDs7CisgICAgcnM2MDAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcnM2MDAwLmxvIHhjb2ZmbGluay5sbyIgOzsKKyAgICBiZmRfcG93ZXJwY19wZV92ZWMpICAgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gY29mZmxpbmsubG8iIDs7ICAKKyAgICBiZmRfcG93ZXJwY2xlX3BlX3ZlYykgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gY29mZmxpbmsubG8iIDs7ICAKKyAgICBiZmRfcG93ZXJwY19wZWlfdmVjKSAgICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYykgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7CisgICAgcHBjYm9vdF92ZWMpCQl0Yj0iJHRiIHBwY2Jvb3QubG8iIDs7CisgICAgc2hjb2ZmX3ZlYykJCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7CisgICAgc2hsY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7CisgICAgc2hjb2ZmX3NtYWxsX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBzaGxjb2ZmX3NtYWxsX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBzb21fdmVjKQkJCXRiPSIkdGIgc29tLmxvIiA7OworICAgIHNwYXJjbGVfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtc3BhcmNsZS5sbyBhb3V0MzIubG8iIDs7CisgICAgc3BhcmNsaW51eF92ZWMpCQl0Yj0iJHRiIHNwYXJjbGludXgubG8gYW91dDMyLmxvIiA7OworICAgIHNwYXJjbHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7CisgICAgc3BhcmNseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1zcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIiA7OworICAgIHNwYXJjbmV0YnNkX3ZlYykJCXRiPSIkdGIgc3BhcmNuZXRic2QubG8gYW91dDMyLmxvIiA7OworICAgIHNwYXJjY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3BhcmMubG8iIDs7CisgICAgc3JlY192ZWMpCQkJdGI9IiR0YiBzcmVjLmxvIiA7OworICAgIHN1bm9zX2JpZ192ZWMpCQl0Yj0iJHRiIHN1bm9zLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBzeW1ib2xzcmVjX3ZlYykJCXRiPSIkdGIgc3JlYy5sbyIgOzsKKyAgICB0ZWtoZXhfdmVjKQkJCXRiPSIkdGIgdGVraGV4LmxvIiA7OworICAgIHRpYzMwX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXRpYzMwLmxvIiA7OworICAgIHRpYzMwX2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzMwLmxvIiA7OworICAgIHRpYzgwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljODAubG8gY29mZmxpbmsubG8iIDs7CisgICAgdmVyc2Fkb3NfdmVjKQkJdGI9IiR0YiB2ZXJzYWRvcy5sbyIgOzsKKyAgICB2bXNfYWxwaGFfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iCisgCQkJCXRhcmdldDY0PXRydWUgOzsKKyAgICB2bXNfdmF4X3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIiA7OworICAgIHc2NV92ZWMpCQkJdGI9IiR0YiBjb2ZmLXc2NS5sbyByZWxvYzE2LmxvIiA7OworICAgIHdlMzJrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtd2UzMmsubG8iIDs7CisgICAgejhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtejhrLmxvIHJlbG9jMTYubG8iIDs7CisKKyAgICAiIikJCQk7OworICAgICopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogKioqIHVua25vd24gdGFyZ2V0IHZlY3RvciAkdmVjIiAxPiYyOyBleGl0IDE7IH0gOzsKKyAgICBlc2FjCitkb25lCisKKyMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KKyMgQSBjb3VwbGUgb2YgQ1BVcyB1c2Ugc2hvcnRlciBmaWxlIG5hbWVzIHRvIGF2b2lkIHByb2JsZW1zIG9uIERPUworIyBmaWxlc3lzdGVtcy4KK3RhPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSBzL2JmZF8vY3B1LS9nIC1lIHMvX2FyY2gvLmxvL2cgLWUgcy9tbjEwMjAwL20xMDIwMC8gLWUgcy9tbjEwMzAwL20xMDMwMC9gCisKKyMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgorZj0iIgorZm9yIGkgaW4gJHRiIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICoiICRpICIqKSA7OworICAgICopIGY9IiRmICRpIiA7OworICAgIGVzYWMKK2RvbmUKK3RiPSIkZiIKKworZj0iIgorZm9yIGkgaW4gJHRhIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICoiICRpICIqKSA7OworICAgICopIGY9IiRmICRpIiA7OworICAgIGVzYWMKK2RvbmUKK3RhPSIkZiIKKworYmZkX2JhY2tlbmRzPSIkdGIiCitiZmRfbWFjaGluZXM9IiR0YSIKKworaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZSA7IHRoZW4KKyAgYmZkX2JhY2tlbmRzPSIke2JmZF9iYWNrZW5kc30iJyAkKEFMTF9CQUNLRU5EUyknCisgIGJmZF9tYWNoaW5lcz0iJHtiZmRfbWFjaGluZXN9IicgJChBTExfTUFDSElORVMpJworICBzZWx2ZWNzPQorICBoYXZldmVjcz0KKyAgc2VsYXJjaHM9CitlbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQorICAjIE9ubHkgc2V0IHRoZXNlIGlmIHRoZXkgd2lsbCBiZSBub25lbXB0eSwgZm9yIHRoZSBjbGV2ZXIgZWNoby4KKyAgaGF2ZXZlY3M9CisgIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgorICAgIGhhdmV2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vLURIQVZFXy8nIC1lICdzLyBcKC5cKS8gLURIQVZFX1wxL2cnYAorICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKKyAgICBzZWx2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCisgIHRlc3QgLW4gIiRzZWxhcmNocyIgJiYKKyAgICBzZWxhcmNocz1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKK2ZpCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQorCitjYXNlICR7aG9zdDY0fS0ke3RhcmdldDY0fS0ke3dhbnQ2NH0gaW4KKyAgKnRydWUqKQorICAgIHdvcmRzaXplPTY0CisgICAgYWxsX2JhY2tlbmRzPSckKEJGRDY0X0JBQ0tFTkRTKSAkKEJGRDMyX0JBQ0tFTkRTKScKKyAgICBpZiB0ZXN0IC16ICIkR0NDIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRCSVRfTE9ORyIgPSAiMCIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIiA9ICIwIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBZb3UgaGF2ZSByZXF1ZXN0ZWQgYSA2NCBiaXQgQkZEIGNvbmZpZ3VyYXRpb24sIGJ1dCIgMT4mMgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB5b3VyIGNvbXBpbGVyIG1heSBub3QgaGF2ZSBhIDY0IGJpdCBpbnRlZ3JhbCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICA7OworICBmYWxzZS1mYWxzZS1mYWxzZSkKKyAgICB3b3Jkc2l6ZT0zMgorICAgIGFsbF9iYWNrZW5kcz0nJChCRkQzMl9CQUNLRU5EUyknCisgICAgOzsKK2VzYWMKKworCisKKworCisKK3RkZWZhdWx0cz0iIgordGVzdCAtbiAiJHtkZWZ2ZWN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRERFRkFVTFRfVkVDVE9SPSR7ZGVmdmVjfSIKK3Rlc3QgLW4gIiR7c2VsdmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EU0VMRUNUX1ZFQ1M9JyR7c2VsdmVjc30nIgordGVzdCAtbiAiJHtzZWxhcmNoc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EU0VMRUNUX0FSQ0hJVEVDVFVSRVM9JyR7c2VsYXJjaHN9JyIKK3Rlc3QgLW4gIiR7aGF2ZXZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAke2hhdmV2ZWNzfSIKKworCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTIzOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUyNDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjUyNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTI3ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MzMxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1MzM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworZm9yIGFjX2Z1bmMgaW4gbWFkdmlzZSBtcHJvdGVjdAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTUwNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTUwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitjYXNlICR7d2FudF9tbWFwfSske2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWR9IGluCisgIHRydWUreWVzICkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBVU0VfTU1BUCAxCitFT0YKKyA7OworZXNhYworCitybSAtZiBkb2MvY29uZmlnLnN0YXR1cwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBGRkxBR1NAJSRGRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBQQUNLQUdFQCUkUEFDS0FHRSVnCitzJUBWRVJTSU9OQCUkVkVSU0lPTiVnCitzJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCitzJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKK3MlQEFVVE9NQUtFQCUkQVVUT01BS0UlZworcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZworcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQEFSQCUkQVIlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQExEQCUkTEQlZworcyVATk1AJSROTSVnCitzJUBMTl9TQCUkTE5fUyVnCitzJUBMSUJUT09MQCUkTElCVE9PTCVnCitzJUBETExUT09MQCUkRExMVE9PTCVnCitzJUBBU0AlJEFTJWcKK3MlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZworcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKK3MlQEJGRF9IT1NUXzY0QklUX0xPTkdAJSRCRkRfSE9TVF82NEJJVF9MT05HJWcKK3MlQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCUkQkZEX0hPU1RfNjRfQklUX0RFRklORUQlZworcyVAQkZEX0hPU1RfNjRfQklUQCUkQkZEX0hPU1RfNjRfQklUJWcKK3MlQEJGRF9IT1NUX1VfNjRfQklUQCUkQkZEX0hPU1RfVV82NF9CSVQlZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEVYRUVYVF9GT1JfQlVJTERAJSRFWEVFWFRfRk9SX0JVSUxEJWcKK3MlQENPUkVGSUxFQCUkQ09SRUZJTEUlZworcyVAQ09SRUZMQUdAJSRDT1JFRkxBRyVnCitzJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZworcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCitzJUBUREVGSU5FU0AlJFRERUZJTkVTJWcKK3MlQHdvcmRzaXplQCUkd29yZHNpemUlZworcyVAYWxsX2JhY2tlbmRzQCUkYWxsX2JhY2tlbmRzJWcKK3MlQGJmZF9iYWNrZW5kc0AlJGJmZF9iYWNrZW5kcyVnCitzJUBiZmRfbWFjaGluZXNAJSRiZmRfbWFjaGluZXMlZworcyVAdGRlZmF1bHRzQCUkdGRlZmF1bHRzJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCit0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAorc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5iYXQgYi9iZmQvY29uZmlndXJlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZlNzllCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NvbmZpZ3VyZS5iYXQKQEAgLTAsMCArMSwxOCBAQAorQGVjaG8gb2ZmDQoraWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQorDQorZWNobyBDb25maWd1cmluZyBiZmQgZm9yIGdvMzINCit1cGRhdGUgaG9zdHNcZ28zMi5oIHN5c2RlcC5oDQordXBkYXRlIE1ha2VmaWxlLmRvcyBNYWtlZmlsZQ0KK2VjaG8gcy9AV09SRFNJWkVALzMyL2c+Y29uZmlnLnNlZA0KK3NlZCAtZSBzL14vc1wvQFZFUlNJT05AXC8vIC1lIHMvJC9cL2cvZyB2ZXJzaW9uID4+Y29uZmlnLnNlZA0KK3NlZCAtZiBjb25maWcuc2VkIDwgYmZkLWluMi5oID4gYmZkLmgyDQordXBkYXRlIGJmZC5oMiBiZmQuaA0KK2dvdG8gZXhpdA0KKw0KKzpoODMwMA0KK2VjaG8gQ29uZmlndXJpbmcgYmZkIGZvciBIOC8zMDANCit1cGRhdGUgaG9zdHNcaC1nbzMyLmggc3lzZGVwLmgNCit1cGRhdGUgTWFrZWZpbGUuZG9zIE1ha2VmaWxlDQorDQorOmV4aXQNCmRpZmYgLS1naXQgYS9iZmQvY29uZmlndXJlLmNvbSBiL2JmZC9jb25maWd1cmUuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTk3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29uZmlndXJlLmNvbQpAQCAtMCwwICsxLDIxNSBAQAorJCEKKyQhIFRoaXMgZmlsZSBjb25maWd1cmVzIHRoZSBiZmQgbGlicmFyeSBmb3IgdXNlIHdpdGggb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKKyQhCiskISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiskISB0byBleGVjdXRlIGl0LgorJCEKKyQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKKyQhCiskYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCiskYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCiskIQorJGlmIGFyY2ggLmVxcy4gIkFscGhhIgorJHRoZW4KKyQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgZm9yIEFscGhhIHRhcmdldCIKKyQgdGFyZ2V0ID0gImFscGhhIgorJCEKKyQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKKyQhCiskIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KKyAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiskREVDSworIQorISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCishCishCisgICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKKyAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOworICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOworICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKKyAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOworICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7CisgICBFTFNFOworICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKKyAgIEVORElGOworCisgICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CisgICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CisKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOworICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKKyAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKKyAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CisgICAgICBDT1BZX1RFWFQodmVycyk7CisgICBFTkRJRjsKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CisgICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CisgICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICAgQ09QWV9URVhUKCc2NCcpOworICAgRU5ESUY7CisgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CisgICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CisgICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICAgQ09QWV9URVhUKCcwJyk7CisgICBFTkRJRjsKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CisgICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CisgICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKKyAgICAgIFNQTElUX0xJTkU7CisgICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7CisgICBFTkRJRjsKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CisgICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOworICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOworICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKKyAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKKyAgIEVORElGOworICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOworICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKKyAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKKyAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CisgICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOworICAgRU5ESUY7CisgICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOworICAgUVVJVAorJCAgRU9ECiskCiskZWxzZQorJAorJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgVmF4IHRhcmdldCIKKyQgdGFyZ2V0ID0gInZheCIKKyQhCiskISBjb3B5IGJmZC1pbjIuaCB0byBiZmQuaCwgcmVwbGFjaW5nIEAgbWFjcm9zCiskIQorJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCisgICAgICAgIFtdYmZkLWluMi5oIC9vdXRwdXQ9W11iZmQuaAorJERFQ0sKKyEKKyEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQorIQorIQorICAgdmZpbGUgOj0gQ1JFQVRFX0JVRkZFUigidmZpbGUiLCAiQ09ORklHVVJFLklOIik7CisgICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CisgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKKyAgICAgRVJBU0UobWF0Y2hfcG9zKTsKKyAgICAgdmVycyA6PSBDVVJSRU5UX0xJTkUtIikiOworICAgRUxTRTsKKyAgICAgdmVycyA6PSAidW5rbm93biI7CisgICBFTkRJRjsKKworICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOworICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOworCisgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CisgICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CisgICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICAgQ09QWV9URVhUKHZlcnMpOworICAgRU5ESUY7CisgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CisgICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOworICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOworICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKKyAgICAgIENPUFlfVEVYVCgnMzInKTsKKyAgIEVORElGOworICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CisgICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOworICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOworICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKKyAgICAgIENPUFlfVEVYVCgnMCcpOworICAgRU5ESUY7CisgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CisgICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOworICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOworICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKKyAgICAgIENPUFlfVEVYVCgnX19ERUNDJyk7CisgICAgICBTUExJVF9MSU5FOworICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOworICAgRU5ESUY7CisgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOworICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKKyAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKKyAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CisgICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7CisgICBFTkRJRjsKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CisgICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CisgICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKKyAgIEVORElGOworICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKKyAgIFFVSVQKKyQgIEVPRAorJGVuZGlmCiskCiskIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgYmZkLmgnIGZyb20gYGJmZC1pbjIuaCcuIgorJCEKKyQhCiskISBjcmVhdGUgdGFyZ21hdGNoLmgKKyQhCiskIG9wZW4vd3JpdGUgdGZpbGUgW110YXJnbWF0Y2guaAorJCB3cml0ZSB0ZmlsZSAieyAiIiIgKyB0YXJnZXQgKyAiLSotKnZtcyoiIiIgKyAiLCIKKyQgd3JpdGUgdGZpbGUgIiNpZiBkZWZpbmVkIChTRUxFQ1RfVkVDUykiCiskIHdyaXRlIHRmaWxlICJTRUxFQ1RfVkVDUyIKKyQgd3JpdGUgdGZpbGUgIiNlbHNlIgorJCB3cml0ZSB0ZmlsZSAiVU5TVVBQT1JURURfVEFSR0VUIgorJCB3cml0ZSB0ZmlsZSAiI2VuZGlmIgorJCB3cml0ZSB0ZmlsZSAifSwiCiskIGNsb3NlIHRmaWxlCiskIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgdGFyZ21hdGNoLmgnIgorJCEKKyQhCiskISBjcmVhdGUgY29uZmlnLmgKKyQhCiskIGNyZWF0ZSBbXWNvbmZpZy5oCisvKiBjb25maWcuaC12bXMuICBHZW5lcmF0ZWQgYnkgaGFuZCBieSBLbGF1cyBL5G1wZiwga2thZW1wZkBkaWR5bXVzLnJtaS5kZS4gICovCisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKy8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KKy8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAqLworLyogV2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KKy8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgKi8KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKy8qICNkZWZpbmUgSEFWRV9NTUFQIDEgKi8KKy8qIERvIHdlIG5lZWQgdG8gdXNlIHRoZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICAqLworLyogI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4gKi8KKy8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAgKi8KKy8qICN1bmRlZiBUUkFEX0hFQURFUiAqLworLyogRGVmaW5lIG9ubHkgaWYgPHN5cy9wcm9jZnMuaD4gaXMgYXZhaWxhYmxlICphbmQqIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4gICovCisvKiAjdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0ggKi8KKy8qIERvIHdlIHJlYWxseSB3YW50IHRvIHVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAgKi8KKy8qICN1bmRlZiBVU0VfTU1BUCAqLworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfRkNOVEwgMQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9NQURWSVNFIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLworI2RlZmluZSBIQVZFX01QUk9URUNUIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1REREVGX0ggMQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9USU1FX0ggMQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCiskIQorJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKKwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5ob3N0IGIvYmZkL2NvbmZpZ3VyZS5ob3N0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzA0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY29uZmlndXJlLmhvc3QKQEAgLTAsMCArMSw3MCBAQAorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgdG9vbHMgYW5kCisjIGZsYWdzIHVzZWQgb24gYSBob3N0IHNwZWNpZmljIGJhc2lzLgorCisjIFNpbmNlIHRoZSAiYmZkL2hvc3RzIiBkaXJlY3RvcnkgaXMgc2hhcmVkIGJ5IHRoZSBiZmQsIG9wY29kZXMsIGFuZAorIyBiaW51dGlscyBkaXJlY3RvcmllcyAoYXQgbGVhc3QpLCB0aGUgaW5kZXggdG8gaXQgaXMgYWxzbyBzaGFyZWQuCisjIFRoaXMgaXMgdGhhdCBpbmRleC4gIEVhY2ggY29uZmlndXJlLmluIGZpbGUgc2hvdWxkIHNvdXJjZSB0aGlzIGZpbGUKKyMgaW4gaXRzIHBlci1ob3N0IHBhcnQuCisKKyMgVGhpcyBzZXRzIHRoZSBmb2xsb3dpbmcgc2hlbGwgdmFyaWFibGVzOgorIyAgSERFRklORVMJCWhvc3Qgc3BlY2lmaWMgY29tcGlsZXIgb3B0aW9ucworIyAgaG9zdDY0CQlzZXQgdG8gdHJ1ZSBpZiA2NCBiaXQgdHlwZXMgYXJlIGFzIGZhc3QgYXMgMzIgYml0CisjICBIT1NUXzY0QklUX1RZUEUJaG9zdCA2NCBiaXQgdHlwZQorIyAgSE9TVF9VXzY0QklUX1RZUEUJdW5zaWduZWQgNjQgYml0IHR5cGUgKG5vdCBuZWVkZWQgaWYgNjRCSVRfVFlQRSBpcyBsb25nKQorCitIREVGSU5FUz0KK2hvc3Q2ND1mYWxzZQorSE9TVF82NEJJVF9UWVBFPQorSE9TVF9VXzY0QklUX1RZUEU9CisKK2Nhc2UgIiR7aG9zdH0iIGluCisKK2FscGhhKi0qLSopCQlob3N0NjQ9dHJ1ZTsgSE9TVF82NEJJVF9UWVBFPWxvbmcgOzsKKworaHBwYSotKi1ocHV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OworaHBwYSotKi1oaXV4KikJCUhERUZJTkVTPS1ESE9TVF9IUFBBSFBVWCA7OworaHBwYSotKi1tcGVpeCopCQlIREVGSU5FUz0tREhPU1RfSFBQQU1QRUlYIDs7CitocHBhKi0qLWJzZCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUJTRCA7OworaHBwYSotKi1vc2YqKQkJSERFRklORVM9LURIT1NUX0hQUEFPU0YgOzsKKworaVszNDU2XTg2LXNlcXVlbnQtYnNkKikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7CitpWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7CitpWzM0NTZdODYtc2VxdWVudC1zeXN2KikJSERFRklORVM9LURzaGFyZWQ9Z2Vuc2hhcmVkIDs7CisKK21pcHMqLWRlYy1uZXRic2QqKQk7OworbWlwcyotKi1vcGVuYnNkKikJOzsKK21pcHMqLWRlYy0qKQkJSERFRklORVM9Ii1HIDQiCTs7CittaXBzKi1zZ2ktaXJpeDMqKQlIREVGSU5FUz0iLUcgNCIgOzsKK21pcHMqLXNnaS1pcml4NCopCUhERUZJTkVTPSItRyA0IiA7OworbWlwcyotc2dpLWlyaXg2KikJaG9zdDY0PXRydWUKKwkJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIjsKKwkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBsb25nIGxvbmciOworCQkJOzsKK21pcHMqLSotc3lzdjQqKQkJOzsKK21pcHMqLSotc3lzdiopCQlIREVGSU5FUz0iLUcgNCIgOzsKK21pcHMqLSotcmlzY29zKikJSERFRklORVM9Ii1HIDQiIDs7CisKK202OCotaHAtaHB1eCopCQlIREVGSU5FUz0tREhPU1RfSFAzMDBIUFVYIDs7CisKKyotKi1zb2xhcmlzKikJCUhPU1RfNjRCSVRfVFlQRT0ibG9uZyBsb25nIgorCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIGxvbmcgbG9uZyIKKwkJCTs7CisKKyotKi13aW5kb3dzKikKKwkJCUhPU1RfNjRCSVRfVFlQRT1fX2ludDY0CisJCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgX19pbnQ2NCIKKyMgVGhlIGZvbGxvd2luZyBrcm9jayBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBjYW4ndCBydW4gdGhlIGJ1aWxkIGNvbXBpbGVyCisjIChNU1ZDKSBvbiB0aGUgY29uZmlndXJlIGhvc3QsIHNvIHdlIGhhdmUgdG8gZXhwbGljaXRseSBzZXQgdGhlIHZhbHVlcyBoZXJlLgorIyBOb3RlIHRoYXQgdGhpcyBmaWxlIGlzIG5ldmVyIHJ1biB0aHJvdWdoIGF1dG9jb25mLCBzbyB3ZSBjYW4ndCB1c2UgYW55CisjIGF1dG9jb25mIG1hY3JvcyBoZXJlLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBoYXZlIHRvIG11Y2sgd2l0aCBhdXRvY29uZgorIyB2YXJpYWJsZXMgZXhwbGljaXRseS4KKwkJCWFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KKwkJCWFjX2N2X2hlYWRlcl90aW1lPW5vCisJCQlhY19jdl9mdW5jX2dldHBhZ2VzaXplPW5vCisJCQlhY19jdl9mdW5jX21hZHZpc2U9bm8KKwkJCWFjX2N2X2Z1bmNfbXByb3RlY3Q9bm8KKwkJCWFjX2N2X2hlYWRlcl9zeXNfZmlsZV9oPW5vCisJCQlhY19jdl9oZWFkZXJfc3lzX3RpbWVfaD1ubworCQkJYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oPW5vCisJCQk7OworZXNhYwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5pbiBiL2JmZC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzZTM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw2NDggQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sCisKK0FDX1BSRVJFUSgyLjEzKQorQUNfSU5JVChsaWJiZmQuYykKKworQUNfQ0FOT05JQ0FMX1NZU1RFTQorQUNfSVNDX1BPU0lYCisKK0FNX0lOSVRfQVVUT01BS0UoYmZkLCAyLjkuNCkKKworZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKK2RubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCitBQ19DSEVDS19UT09MKEFSLCBhcikKK0FDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCisKK2RubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKK2RubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KK0FNX0RJU0FCTEVfU0hBUkVECisKK0FNX1BST0dfTElCVE9PTAorCitBQ19BUkdfRU5BQkxFKDY0LWJpdC1iZmQsCitbICAtLWVuYWJsZS02NC1iaXQtYmZkICAgICA2NC1iaXQgc3VwcG9ydCAob24gaG9zdHMgd2l0aCBuYXJyb3dlciB3b3JkIHNpemVzKV0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKKyAgbm8pICAgd2FudDY0PWZhbHNlIDs7CisgICopICAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbikgOzsKK2VzYWNdLFt3YW50NjQ9ZmFsc2VdKWRubAorQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAorWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKKyAgICAgICAgICAgIDs7CisgIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWNdKWRubAorQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCitbICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OworICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OworICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OworZXNhY10pZG5sCitBQ19BUkdfV0lUSChtbWFwLAorWyAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGVdLAorW2Nhc2UgIiR7d2l0aHZhbH0iIGluCisgIHllcykgIHdhbnRfbW1hcD10cnVlIDs7CisgIG5vKSAgIHdhbnRfbW1hcD1mYWxzZSA7OworICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEJGRCB3aXRoLW1tYXAgb3B0aW9uKSA7OworZXNhY10sW3dhbnRfbW1hcD1mYWxzZV0pZG5sCisKK0FNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQorCitpZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQorZmkKK0FDX0FSR19QUk9HUkFNCisKK0FNX01BSU5UQUlORVJfTU9ERQorQUNfRVhFRVhUCisKK2hvc3Q2ND1mYWxzZQordGFyZ2V0NjQ9ZmFsc2UKKworIyBob3N0IHN0dWZmOgorCitBQ19QUk9HX0NDCisKK0FMTF9MSU5HVUFTPQorQ1lfR05VX0dFVFRFWFQKKworIyBQZXJtaXQgaG9zdCBzcGVjaWZpYyBzZXR0aW5ncy4KKy4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0CisKK0FDX1NVQlNUKEhERUZJTkVTKQorQUNfUFJPR19JTlNUQUxMCisKK0JGRF9IT1NUXzY0QklUX0xPTkc9MAorQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MAorQkZEX0hPU1RfNjRfQklUPQorQkZEX0hPU1RfVV82NF9CSVQ9CitpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiA9ICJ4bG9uZyI7IHRoZW4KKyAgQkZEX0hPU1RfNjRCSVRfTE9ORz0xCitlbGlmIHRlc3QgIngke0hPU1RfNjRCSVRfVFlQRX0iICE9ICJ4IjsgdGhlbgorICBCRkRfSE9TVF82NF9CSVRfREVGSU5FRD0xCisgIEJGRF9IT1NUXzY0X0JJVD0ke0hPU1RfNjRCSVRfVFlQRX0KKyAgQkZEX0hPU1RfVV82NF9CSVQ9JHtIT1NUX1VfNjRCSVRfVFlQRX0KK2ZpCitBQ19TVUJTVChCRkRfSE9TVF82NEJJVF9MT05HKQorQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUX0RFRklORUQpCitBQ19TVUJTVChCRkRfSE9TVF82NF9CSVQpCitBQ19TVUJTVChCRkRfSE9TVF9VXzY0X0JJVCkKKworQkZEX0NDX0ZPUl9CVUlMRAorCitBQ19DSEVDS19IRUFERVJTKHN0ZGRlZi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgpCitBQ19DSEVDS19IRUFERVJTKGZjbnRsLmggc3lzL2ZpbGUuaCBzeXMvdGltZS5oKQorQUNfSEVBREVSX1RJTUUKK0FDX0hFQURFUl9ESVJFTlQKK0FDX0NIRUNLX0ZVTkNTKGZjbnRsIGdldHBhZ2VzaXplIHNldGl0aW1lciBzeXNjb25mIGZkb3BlbikKKworQkZEX0JJTkFSWV9GT1BFTgorCitCRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCitCRkRfTkVFRF9ERUNMQVJBVElPTihtYWxsb2MpCitCRkRfTkVFRF9ERUNMQVJBVElPTihyZWFsbG9jKQorQkZEX05FRURfREVDTEFSQVRJT04oZnJlZSkKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKKworIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUsIHBpY2sgYSBjb3JlIGZpbGUgc3VwcG9ydCBmaWxlLgorQ09SRUZJTEU9CitDT1JFRkxBRz0KK1RSQURfSEVBREVSPQoraWYgdGVzdCAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IjsgdGhlbgorICBjYXNlICIke2hvc3R9IiBpbgorICBhbHBoYSotKi1saW51eC1nbnUqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvYWxwaGFsaW51eC5oIicKKwk7OworICBhbHBoYSotKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OworICBhbHBoYSotKi0qKQkJQ09SRUZJTEU9b3NmLWNvcmUubG8gOzsKKyAgYXJtLSotcmlzY2l4KQkJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7CisgIGhwcGEqLSotaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OworICBocHBhKi0qLWhpdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKKyAgaHBwYSotKi1tcGVpeCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OworICBocHBhKi0qLWJzZCopCQlDT1JFRklMRT0iaHB1eC1jb3JlLmxvIGhwcGFic2QtY29yZS5sbyIKKwkJCUNPUkVGTEFHPSItREhQVVhfQ09SRSAtREhQUEFCU0RfQ09SRSIgOzsKK2NoYW5nZXF1b3RlKCwpZG5sCisgIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCitjaGFuZ2VxdW90ZShbLF0pZG5sCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvOworCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCisJOzsKK2NoYW5nZXF1b3RlKCwpZG5sCisgIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKKyAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCitjaGFuZ2VxdW90ZShbLF0pZG5sCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKKwk7OworY2hhbmdlcXVvdGUoLClkbmwKKyAgaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQorY2hhbmdlcXVvdGUoWyxdKWRubAorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmJzZC5oIicKKwk7OworY2hhbmdlcXVvdGUoLClkbmwKKyAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQorY2hhbmdlcXVvdGUoWyxdKWRubAorCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCisJOzsKK2NoYW5nZXF1b3RlKCwpZG5sCisgIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKK2NoYW5nZXF1b3RlKFssXSlkbmwKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCisJOzsKK2NoYW5nZXF1b3RlKCwpZG5sCisgIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKK2NoYW5nZXF1b3RlKFssXSlkbmwKKwlDT1JFRklMRT1zY281LWNvcmUubG8KKwk7OworY2hhbmdlcXVvdGUoLClkbmwKKyAgaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCitjaGFuZ2VxdW90ZShbLF0pZG5sCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2c2NvLmgiJworCTs7CitjaGFuZ2VxdW90ZSgsKWRubAorICBpWzM0NTZdODYtKi1tYWNoMyopCitjaGFuZ2VxdW90ZShbLF0pZG5sCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCisJOzsKK2NoYW5nZXF1b3RlKCwpZG5sCisgIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCitjaGFuZ2VxdW90ZShbLF0pZG5sCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bGludXguaCInCisJOzsKK2NoYW5nZXF1b3RlKCwpZG5sCisgIGlbMzQ1Nl04Ni0qLWlzYyopCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OworICBpWzM0NTZdODYtKi1haXgqKQlDT1JFRklMRT1haXgzODYtY29yZS5sbyA7OworY2hhbmdlcXVvdGUoWyxdKWRubAorICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvaTg2MG1hY2gzLmgiJworCTs7CisgIG1pcHMtZGVjLWJzZCopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9taXBzYnNkLmgiJworCTs7CisgIG1pcHMtZGVjLW1hY2gzKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKKwk7OworICBtaXBzLSotbmV0YnNkKiB8IG1pcHMqLSotb3BlbmJzZCopCisJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KKwk7OworICBtaXBzLWRlYy0qKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvZGVjc3RhdGlvbi5oIicKKwk7OworICBtaXBzLXNnaS1pcml4NCopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OworICBtaXBzLXNnaS1pcml4NSopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OworICBtaXBzLXNnaS1pcml4NiopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OworICBtaXBzLSotbWFjaDMqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJworCTs7CisgIG1pcHMtKi1zeXN2NCopCTs7CisgIG1pcHMtKi1zeXN2KiB8IG1pcHMtKi1yaXNjb3MqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvcmlzY29zLmgiJworCTs7CisgIG1pcHMtc29ueS1ic2QqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy1taXBzLmgiJworCTs7CisgIG02OCotYnVsbCotc3lzdiopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9kcHgyLmgiJworCTs7CisgIG02OCotaHAtaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OworICBtNjgqLWhwLWJzZCopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9ocDMwMGJzZC5oIicKKwk7OworICBtNjgqLSotbGludXgtZ251KikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL202OGtsaW51eC5oIicKKwk7OworICBtNjgqLW1vdG9yb2xhLXN5c3YqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvZGVsdGE2OC5oIicKKwk7OworICBtNjgqLXNvbnktKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MuaCInCisJOzsKKyAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCisJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KKwk7OworICBtNjgqLWFwcGxlLWF1eCopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrYXV4LmgiJworCTs7CisgIG04OCotKi1zeXN2NCopCTs7CisgIG04OCotbW90b3JvbGEtc3lzdiopCUNPUkVGSUxFPXB0cmFjZS1jb3JlLmxvIDs7CisgIG04OCotKi1tYWNoMyopCisJQ09SRUZJTEU9dHJhZC1jb3JlLmxvCisJVFJBRF9IRUFERVI9JyJob3N0cy9tODhrbWFjaDMuaCInCisJOzsKKyAgbnMzMmstcGM1MzItbWFjaCkKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL3BjNTMybWFjaC5oIicKKwk7OworICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLW9wZW5ic2QqKQorCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCisJOzsKKyAgcnM2MDAwLSotbHlueCopCUNPUkVGSUxFPWx5bngtY29yZS5sbyA7OworICByczYwMDAtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKKyAgcnM2MDAwLSotKikJCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7CisgIHBvd2VycGMtKi0qYnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKKyAgcG93ZXJwYy0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OworICBwb3dlcnBjLSotYWl4KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKKyAgcG93ZXJwYy0qLWJlb3MqKQk7OworICBwb3dlcnBjLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKKyAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKKwlDT1JFRklMRT1uZXRic2QtY29yZS5sbworCTs7CisgIHRhaG9lLSotKikKKwlDT1JFRklMRT10cmFkLWNvcmUubG8KKwlUUkFEX0hFQURFUj0nImhvc3RzL3RhaG9lLmgiJworCTs7CisgIHZheC0qLXVsdHJpeDIqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKKwk7OworICB2YXgtKi11bHRyaXgqKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKKwk7OworICB2YXgtKi0qKQorCUNPUkVGSUxFPXRyYWQtY29yZS5sbworCVRSQURfSEVBREVSPSciaG9zdHMvdmF4YnNkLmgiJworCTs7CisgIGVzYWMKKworICBjYXNlICIkQ09SRUZJTEUiIGluCisgIGFpeDM4Ni1jb3JlLmxvKQlDT1JFRkxBRz0tREFJWDM4Nl9DT1JFIDs7CisgIGhwcGFic2QtY29yZS5sbykJQ09SRUZMQUc9LURIUFBBQlNEX0NPUkUgOzsKKyAgaHB1eC1jb3JlLmxvKQkJQ09SRUZMQUc9LURIUFVYX0NPUkUgOzsKKyAgaXJpeC1jb3JlLmxvKQkJQ09SRUZMQUc9LURJUklYX0NPUkUgOzsKKyAgbHlueC1jb3JlLmxvKQkJQ09SRUZMQUc9LURMWU5YX0NPUkUgOzsKKyAgbmV0YnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ETkVUQlNEX0NPUkUgOzsKKyAgb3NmLWNvcmUubG8pCQlDT1JFRkxBRz0tRE9TRl9DT1JFIDs7CisgIHB0cmFjZS1jb3JlLmxvKQlDT1JFRkxBRz0tRFBUUkFDRV9DT1JFIDs7CisgIHJzNjAwMC1jb3JlLmxvKQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EQUlYX0NPUkUiIDs7CisgIHNjbzUtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURTQ081X0NPUkUiIDs7CisgIHRyYWQtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURUUkFEX0NPUkUiIDs7CisgIGVzYWMKKworICAjIEVMRiBjb3JlZmlsZSBzdXBwb3J0IGhhcyBzZXZlcmFsIGZsYXZvcnMsIGJ1dCBhbGwgb2YKKyAgIyB0aGVtIHVzZSBzb21ldGhpbmcgY2FsbGVkIDxzeXMvcHJvY2ZzLmg+CisgIEFDX0NIRUNLX0hFQURFUlMoc3lzL3Byb2Nmcy5oKQorICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KKyAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHJzdGF0dXNfdCkKKyAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKHByc3RhdHVzX3QsIHByX3dobykKKyAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHN0YXR1c190KQorICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnBzaW5mb190KQorICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc2luZm9fdCkKKyAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUobHdwc3RhdHVzX3QpCisgICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUihsd3BzdGF0dXNfdCwgcHJfY29udGV4dCkKKyAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9yZWcpCisgIGZpCitmaQorQUNfU1VCU1QoQ09SRUZJTEUpCitBQ19TVUJTVChDT1JFRkxBRykKK0FDX0RFRklORV9VTlFVT1RFRChUUkFEX0hFQURFUiwgJFRSQURfSEVBREVSLAorICBbTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuXSkKKworIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCitXSU4zMkxERkxBR1M9CitXSU4zMkxJQkFERD0KK2Nhc2UgIiR7aG9zdH0iIGluCisqLSotY3lnd2luKikKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCisgICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4gLWxrZXJuZWwzMiIKKyAgZmkKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFdJTjMyTERGTEFHUykKK0FDX1NVQlNUKFdJTjMyTElCQUREKQorCisjIHRhcmdldCBzdHVmZjoKKworIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCitpZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgorICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCisgICAgZG8KKwlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAorCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgorCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgorCWVsc2UKKwkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KKwkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCisJZmkKKyAgICBkb25lCitmaQorCithbGxfdGFyZ2V0cz1mYWxzZQorZGVmdmVjPQorc2VsdmVjcz0KK3NlbGFyY2hzPQorVERFRklORVM9Citmb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCitkbworICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KKyAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQorICAgIGVsc2UKKwkuICRzcmNkaXIvY29uZmlnLmJmZAorCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCisJICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKKwlmaQorCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgorCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCisJVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCisgICAgZmkKK2RvbmUKK0FDX1NVQlNUKFRERUZJTkVTKQorCisjIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCisjIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCisjIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0CisjIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAorIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS13aXRoLXRhcmdldHM9YWxsIiBpcworIyB1c2VkLgorCisjIHVuaXEgdGhlIGRlZmF1bHQgYW5kIHNlbGVjdGVkIHZlY3RvcnMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCitmPSIiCitmb3IgaSBpbiAkc2VsdmVjcyA7IGRvCisgICAgY2FzZSAiICRmICIgaW4KKyAgICAqIiAkaSAiKikgOzsKKyAgICAqKSBmPSIkZiAkaSIgOzsKKyAgICBlc2FjCitkb25lCitzZWx2ZWNzPSIkZiIKKworCisjIHVuaXEgdGhlIGFyY2hpdGVjdHVyZXMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCitmPSIiCitmb3IgaSBpbiAkc2VsYXJjaHMgOyBkbworICAgIGNhc2UgIiAkZiAiIGluCisgICAgKiIgJGkgIiopIDs7CisgICAgKikgZj0iJGYgJGkiIDs7CisgICAgZXNhYworZG9uZQorc2VsYXJjaHM9IiRmIgorCisjIFRhcmdldCBiYWNrZW5kIC5vIGZpbGVzLgordGI9CisKK2VsZj0iZWxmLmxvIGVsZmxpbmsubG8gZHdhcmYyLmxvIGR3YXJmMS5sbyIKKworZm9yIHZlYyBpbiAkc2VsdmVjcworZG8KKyAgICBjYXNlICIkdmVjIiBpbgorICAgICMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQorICAgICMgd2l0aCB0aGUgdHdvIHZlY3RvciBsaXN0cyBpbiB0YXJnZXRzLmMuCisgICAgYTI5a2NvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hMjlrLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGFfb3V0X2Fkb2JlX3ZlYykJCXRiPSIkdGIgYW91dC1hZG9iZS5sbyBhb3V0MzIubG8iIDs7CisgICAgYXJtY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmYtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKKyAgICBhcm1wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKKyAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7CisgICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKKyAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OworICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7CisgICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7CisgICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OworICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OworICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKKyAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OworICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKKyAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKKyAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKKwkJCQl0YXJnZXQ2ND10cnVlIDs7CisgICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7CisgICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7CisgICAgYmZkX2VsZjMyX3Bvd2VycGNfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OworICAgIGJmZF9lbGYzMl9zaF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKKyAgICBiZmRfZWxmMzJfc2hsX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OworICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmMzJfdjg1MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXY4NTAubG8gZWxmMzIubG8gJGVsZiIgOzsKKyAgICBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKKwkJCQl0YXJnZXQ2ND10cnVlIDs7CisgICAgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKKwkJCQl0YXJnZXQ2ND10cnVlIDs7CisgICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIgorCQkJCXRhcmdldDY0PXRydWUgOzsKKyAgICBjaXNjb19jb3JlX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKKyAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKKwkJCQl0YXJnZXQ2ND10cnVlIDs7CisgICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKKyAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OworICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKKyAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCisJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7CisgICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OworICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKKyAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OworICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OworICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OworICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIGNvZmZsaW5rLmxvICIgOzsKKyAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gY29mZmxpbmsubG8iIDs7CisgICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKKyAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OworICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7CisgICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OworICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OworICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7CisgICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OworICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7CisgICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7CisgICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7CisgICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OworICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7CisgICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7CisgICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7CisgICAgbWNvcmVfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBuZXdzb3MzX3ZlYykJCXRiPSIkdGIgbmV3c29zMy5sbyBhb3V0MzIubG8iIDs7CisgICAgbmxtMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIG5sbTMyLWkzODYubG8gbmxtMzIubG8gbmxtLmxvIiA7OworICAgIG5sbTMyX3NwYXJjX3ZlYykJCXRiPSIkdGIgbmxtMzItc3BhcmMubG8gbmxtMzIubG8gbmxtLmxvIiA7OworICAgIG5sbTMyX2FscGhhX3ZlYykJCXRiPSIkdGIgbmxtMzItYWxwaGEubG8gbmxtMzIubG8gbmxtLmxvIgorCQkJCXRhcmdldDY0PXRydWUgOzsKKyAgICByaXNjaXhfdmVjKQkJCXRiPSIkdGIgYW91dDMyLmxvIHJpc2NpeC5sbyIgOzsKKyAgICBubG0zMl9wb3dlcnBjX3ZlYykJCXRiPSIkdGIgbmxtMzItcHBjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKKyAgICBwYzUzMm5ldGJzZF92ZWMpCQl0Yj0iJHRiIG5zMzJrbmV0YnNkLmxvIGFvdXQtbnMzMmsubG8iIDs7CisgICAgcGM1MzJtYWNoYW91dF92ZWMpCQl0Yj0iJHRiIHBjNTMyLW1hY2gubG8gYW91dC1uczMyay5sbyIgOzsKKyAgICBwbWFjX3hjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1wbWFjLmxvIHhjb2ZmbGluay5sbyIgOzsKKyAgICByczYwMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1yczYwMDAubG8geGNvZmZsaW5rLmxvIiA7OworICAgIGJmZF9wb3dlcnBjX3BlX3ZlYykgICAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAorICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAorICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7CisgICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjKSAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKKyAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OworICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7CisgICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7CisgICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKKyAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7CisgICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7CisgICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKKyAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7CisgICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OworICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OworICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7CisgICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7CisgICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7CisgICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKKyAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OworICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKKyAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OworICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7CisgICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7CisgICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKKyAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKKworICAgICIiKQkJCTs7CisgICAgKikgQUNfTVNHX0VSUk9SKCoqKiB1bmtub3duIHRhcmdldCB2ZWN0b3IgJHZlYykgOzsKKyAgICBlc2FjCitkb25lCisKKyMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KKyMgQSBjb3VwbGUgb2YgQ1BVcyB1c2Ugc2hvcnRlciBmaWxlIG5hbWVzIHRvIGF2b2lkIHByb2JsZW1zIG9uIERPUworIyBmaWxlc3lzdGVtcy4KK3RhPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSBzL2JmZF8vY3B1LS9nIC1lIHMvX2FyY2gvLmxvL2cgLWUgcy9tbjEwMjAwL20xMDIwMC8gLWUgcy9tbjEwMzAwL20xMDMwMC9gCisKKyMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgorZj0iIgorZm9yIGkgaW4gJHRiIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICoiICRpICIqKSA7OworICAgICopIGY9IiRmICRpIiA7OworICAgIGVzYWMKK2RvbmUKK3RiPSIkZiIKKworZj0iIgorZm9yIGkgaW4gJHRhIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICoiICRpICIqKSA7OworICAgICopIGY9IiRmICRpIiA7OworICAgIGVzYWMKK2RvbmUKK3RhPSIkZiIKKworYmZkX2JhY2tlbmRzPSIkdGIiCitiZmRfbWFjaGluZXM9IiR0YSIKKworaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZSA7IHRoZW4KKyAgYmZkX2JhY2tlbmRzPSIke2JmZF9iYWNrZW5kc30iJyAkKEFMTF9CQUNLRU5EUyknCisgIGJmZF9tYWNoaW5lcz0iJHtiZmRfbWFjaGluZXN9IicgJChBTExfTUFDSElORVMpJworICBzZWx2ZWNzPQorICBoYXZldmVjcz0KKyAgc2VsYXJjaHM9CitlbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQorICAjIE9ubHkgc2V0IHRoZXNlIGlmIHRoZXkgd2lsbCBiZSBub25lbXB0eSwgZm9yIHRoZSBjbGV2ZXIgZWNoby4KKyAgaGF2ZXZlY3M9CisgIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgorICAgIGhhdmV2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vLURIQVZFXy8nIC1lICdzLyBcKC5cKS8gLURIQVZFX1wxL2cnYAorICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKKyAgICBzZWx2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCisgIHRlc3QgLW4gIiRzZWxhcmNocyIgJiYKKyAgICBzZWxhcmNocz1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKK2ZpCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQorCitjYXNlICR7aG9zdDY0fS0ke3RhcmdldDY0fS0ke3dhbnQ2NH0gaW4KKyAgKnRydWUqKQorICAgIHdvcmRzaXplPTY0CisgICAgYWxsX2JhY2tlbmRzPSckKEJGRDY0X0JBQ0tFTkRTKSAkKEJGRDMyX0JBQ0tFTkRTKScKKyAgICBpZiB0ZXN0IC16ICIkR0NDIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRCSVRfTE9ORyIgPSAiMCIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIiA9ICIwIjsgdGhlbgorICAgICAgQUNfTVNHX1dBUk4oW1lvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0XSkKKyAgICAgIEFDX01TR19XQVJOKFt5b3VyIGNvbXBpbGVyIG1heSBub3QgaGF2ZSBhIDY0IGJpdCBpbnRlZ3JhbCB0eXBlXSkKKyAgICBmaQorICAgIDs7CisgIGZhbHNlLWZhbHNlLWZhbHNlKQorICAgIHdvcmRzaXplPTMyCisgICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKKyAgICA7OworZXNhYworCitBQ19TVUJTVCh3b3Jkc2l6ZSkKK0FDX1NVQlNUKGFsbF9iYWNrZW5kcykKK0FDX1NVQlNUKGJmZF9iYWNrZW5kcykKK0FDX1NVQlNUKGJmZF9tYWNoaW5lcykKKwordGRlZmF1bHRzPSIiCit0ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgordGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCit0ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgordGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgorQUNfU1VCU1QodGRlZmF1bHRzKQorCitkbmwgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvbW1hbi5oKQorQUNfRlVOQ19NTUFQCitBQ19DSEVDS19GVU5DUyhtYWR2aXNlIG1wcm90ZWN0KQorY2FzZSAke3dhbnRfbW1hcH0rJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkfSBpbgorICB0cnVlK3llcyApICBBQ19ERUZJTkUoVVNFX01NQVAsIDEsIFtVc2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT9dKSA7OworZXNhYworCitybSAtZiBkb2MvY29uZmlnLnN0YXR1cworQUNfT1VUUFVUKE1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCitbc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2JmZC9jb3JlZmlsZS5jIGIvYmZkL2NvcmVmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyZjUxOQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jb3JlZmlsZS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBDb3JlIGZpbGUgZ2VuZXJpYyBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitTRUNUSU9OCisJQ29yZSBmaWxlcworCitERVNDUklQVElPTgorCVRoZXNlIGFyZSBmdW5jdGlvbnMgcGVydGFpbmluZyB0byBjb3JlIGZpbGVzLgorKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisKKy8qCitGVU5DVElPTgorCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCisKK1NZTk9QU0lTCisJQ09OU1QgY2hhciAqYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gYSByZWFkLW9ubHkgc3RyaW5nIGV4cGxhaW5pbmcgd2hpY2ggcHJvZ3JhbSB3YXMgcnVubmluZworCXdoZW4gaXQgZmFpbGVkIGFuZCBwcm9kdWNlZCB0aGUgY29yZSBmaWxlIEB2YXJ7YWJmZH0uCisKKyovCisKK0NPTlNUIGNoYXIgKgorYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgKGFiZmQpKTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorCitTWU5PUFNJUworCWludCBiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKGJmZCAqYWJmZCk7CisKK0RFU0NSSVBUSU9OCisJUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAorCWdlbmVyYXRlZCB0aGUgZmlsZSB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgYXR0YWNoZWQgdG8uCisqLworCitpbnQKK2JmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCAoYWJmZCkpOworfQorCisKKy8qCitGVU5DVElPTgorCWNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAorCitTWU5PUFNJUworCWJvb2xlYW4gY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisJCShiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gPDx0cnVlPj4gaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBAdmFye2NvcmVfYmZkfQorCXdhcyBnZW5lcmF0ZWQgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0bworCUB2YXJ7ZXhlY19iZmR9LCA8PGZhbHNlPj4gb3RoZXJ3aXNlLgorKi8KK2Jvb2xlYW4KK2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQorICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Cit7CisgICAgaWYgKChjb3JlX2JmZC0+Zm9ybWF0ICE9IGJmZF9jb3JlKSB8fCAoZXhlY19iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSkgeworCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgIHJldHVybiBCRkRfU0VORCAoY29yZV9iZmQsIF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AsCisJCSAgICAgKGNvcmVfYmZkLCBleGVjX2JmZCkpOworfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hMjlrLmMgYi9iZmQvY3B1LWEyOWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQyNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1hMjlrLmMKQEAgLTAsMCArMSwzOSBAQAorLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBTUQgMjkwMDAgYXJjaGl0ZWN0dXJlLgorICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2EyOWtfYXJjaCA9CisgIHsKKyAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICAgIGJmZF9hcmNoX2EyOWssCisgICAgMCwJLyogb25seSAxIG1hY2hpbmUgKi8KKyAgICAiYTI5ayIsCisgICAgImEyOWsiLAorICAgIDQsCisgICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLworICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4gLAorICAgIDAsCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWFscGhhLmMgYi9iZmQvY3B1LWFscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OTAwYgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtYWxwaGEuYwpAQCAtMCwwICsxLDUxIEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFscGhhIGFyY2hpdGVjdHVyZS4KKyAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKSBcCisgIHsJCQkJCQkJXAorICAgIEJJVFNfV09SRCwgLyogYml0cyBpbiBhIHdvcmQgKi8JCQlcCisgICAgQklUU19BRERSLCAvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCQlcCisgICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCQlcCisgICAgYmZkX2FyY2hfYWxwaGEsCQkJCQlcCisgICAgTlVNQkVSLAkJCQkJCVwKKyAgICAiYWxwaGEiLAkJCQkJCVwKKyAgICBQUklOVCwJCQkJCQlcCisgICAgMywJCQkJCQkJXAorICAgIERFRkFVTFQsCQkJCQkJXAorICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCisgICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKKyAgICBORVhULAkJCQkJCVwKKyAgfQorCisjZGVmaW5lIE5OKGluZGV4KSAoJmFyY2hfaW5mb19zdHJ1Y3RbaW5kZXhdKQorCisvKiBUaGVzZSBleGlzdCBvbmx5IHNvIHRoYXQgd2UgY2FuIHJlc29uYWJseSBkaXNhc3NlbWJsZSBQQUxjb2RlLiAgKi8KK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCit7CisgIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY0LCAiYWxwaGE6ZXY0IiwgZmFsc2UsIE5OKDEpKSwKKyAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjUsICJhbHBoYTpldjUiLCBmYWxzZSwgTk4oMikpLAorICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NiwgImFscGhhOmV2NiIsIGZhbHNlLCAwKSwKK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaCA9CisgIE4gKDY0LCA2NCwgMCwgImFscGhhIiwgdHJ1ZSwgTk4oMCkpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcmMuYyBiL2JmZC9jcHUtYXJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNTlkNAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtYXJjLmMKQEAgLTAsMCArMSw3MCBAQAorLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUkMgcHJvY2Vzc29yCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNkZWZpbmUgQVJDKG1hY2gsIHByaW50X25hbWUsIGRlZmF1bHRfcCwgbmV4dCkgXAorewkJCQkJXAorICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwkJXAorICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JXAorICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8JCVwKKyAgICBiZmRfYXJjaF9hcmMsCQkJXAorICAgIG1hY2gsCQkJCVwKKyAgICAiYXJjIiwJCQkJXAorICAgIHByaW50X25hbWUsCQkJCVwKKyAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwlcCisgICAgZGVmYXVsdF9wLAkJCQlcCisgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQlcCisgICAgYmZkX2RlZmF1bHRfc2NhbiwJCQlcCisgICAgbmV4dCwJCQkJXAorICB9CisKKyNpZiAwIC8qID8/PyBOb3QgY3VycmVudGx5IG5lZWRlZCwgYnV0IGtlZXAgaW4gZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoreworICBBUkMgKGJmZF9tYWNoX2FyY19mb28sICJhcmMtZm9vIiwgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKKyAgQVJDIChiZmRfbWFjaF9hcmNfYmFyLCAiYXJjLWJhciIsIGZhbHNlLCAwKSwKK307CisjZW5kaWYKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcmNfYXJjaCA9CisgIEFSQyAoYmZkX21hY2hfYXJjX2Jhc2UsICJhcmMtYmFzZSIsIHRydWUsIDAgLyomYXJjaF9pbmZvX3N0cnVjdFswXSovKTsKKwwKKy8qIFV0aWxpdHkgcm91dGluZXMuICAqLworCisvKiBHaXZlbiBjcHUgdHlwZSBOQU1FLCByZXR1cm4gaXRzIGJmZF9tYWNoX2FyY194eHggdmFsdWUuCisgICBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gICovCisKK2ludAorYXJjX2dldF9tYWNoIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnA7CisKKyAgZm9yIChwID0gJmJmZF9hcmNfYXJjaDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKyAgICB7CisgICAgICAvKiArNDogc2tpcCBvdmVyICJhcmMtIiAqLworICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+cHJpbnRhYmxlX25hbWUgKyA0KSA9PSAwKQorCXJldHVybiBwLT5tYWNoOworICAgIH0KKyAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcm0uYyBiL2JmZC9jcHUtYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5OWMwZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtYXJtLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQVJNIHByb2Nlc3NvcgorICAgQ29weXJpZ2h0IDE5OTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmNvbXBhdGlibGUKKyAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzY2FuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICosIGNvbnN0IGNoYXIgKikpOworCisvKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHdvcmtzIG91dCB3aGljaCBBUk0KKyAgIG1hY2hpbmUgd2hpY2ggd291bGQgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGggYW5kIHJldHVybnMgYSBwb2ludGVyCisgICB0byBpdHMgaW5mbyBzdHJ1Y3R1cmUgKi8KKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCitjb21wYXRpYmxlIChhLGIpCisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGE7CisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGI7Cit7CisgIC8qIElmIGEgJiBiIGFyZSBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZSB3ZSBjYW4gZG8gbm90aGluZyAqLworICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogSWYgYSAmIGIgYXJlIGZvciB0aGUgc2FtZSBtYWNoaW5lIHRoZW4gYWxsIGlzIHdlbGwgKi8KKyAgaWYgKGEtPm1hY2ggPT0gYi0+bWFjaCkKKyAgICByZXR1cm4gYTsKKworICAvKiBPdGhlcndpc2UgaWYgZWl0aGVyIGEgb3IgYiBpcyB0aGUgJ2RlZmF1bHQnIG1hY2hpbmUgdGhlbgorICAgICBpdCBjYW4gYmUgcG9seW1vcnBoZWQgaW50byB0aGUgb3RoZXIgKi8KKyAgaWYgKGEtPnRoZV9kZWZhdWx0KQorICAgIHJldHVybiBiOworICAKKyAgaWYgKGItPnRoZV9kZWZhdWx0KQorICAgIHJldHVybiBhOworCisgIC8qIFNvIGZhciBhbGwgbmV3ZXIgQVJNIGFyY2hpdGVjdHVyZSBjb3JlcyBhcmUgc3VwZXJzZXRzIG9mIHByZXZpb3VzIGNvcmVzICovCisgIGlmIChhLT5tYWNoIDwgYi0+bWFjaCkKKyAgICByZXR1cm4gYjsKKyAgZWxzZSBpZiAoYS0+bWFjaCA+IGItPm1hY2gpCisgICAgcmV0dXJuIGE7CisKKyAgLyogTmV2ZXIgcmVhY2hlZCEgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgIGNoYXIgKiAgICAgICAgICAgICAgICBuYW1lOworfQorcHJvY2Vzc29yc1tdID0KK3sKKyAgeyBiZmRfbWFjaF9hcm1fMiwgICJhcm0yIiAgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMmEsICJhcm0yNTAiICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMmEsICJhcm0zIiAgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm02IiAgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm02MCIgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm02MDAiICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm02MTAiICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm03IiAgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm03MTAiICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm03NTAwIiAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm03ZCIgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fMywgICJhcm03ZGkiICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fM00sICJhcm03ZG0iICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fM00sICJhcm03ZG1pIiAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fNCwgICJhcm04IiAgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fNCwgICJhcm04MTAiICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fNCwgICJzYTEiICAgICAgfSwKKyAgeyBiZmRfbWFjaF9hcm1fNFQsICJhcm03dGRtaSIgfQorfTsKKworc3RhdGljIGJvb2xlYW4gCitzY2FuIChpbmZvLCBzdHJpbmcpCisgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKKyAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKK3sKKyAgaW50ICBpOworCisgIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCisgIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIE5leHQgY2hlY2sgZm9yIGEgcHJvY2Vzc29yIG5hbWUgaW5zdGVhZCBvZiBhbiBBcmNoaXRlY3R1cmUgbmFtZSAqLworICBmb3IgKGkgPSBzaXplb2YgKHByb2Nlc3NvcnMpIC8gc2l6ZW9mIChwcm9jZXNzb3JzWzBdKTsgaS0tOykKKyAgICB7CisgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBwcm9jZXNzb3JzWyBpIF0ubmFtZSkgPT0gMCkKKwlicmVhazsKKyAgICB9CisKKyAgaWYgKGkgIT0gLTEgJiYgaW5mby0+YXJjaCA9PSBwcm9jZXNzb3JzWyBpIF0uYXJjaCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBGaW5hbGx5IGNoZWNrIGZvciB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgKi8KKyAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgImFybSIpID09IDApCisgICAgcmV0dXJuIGluZm8tPnRoZV9kZWZhdWx0OworICAKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKyNkZWZpbmUgTihudW1iZXIsIHByaW50LCBkZWZhdWx0LCBuZXh0KSAgXAoreyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9hcm0sIG51bWJlciwgImFybSIsIHByaW50LCA0LCBkZWZhdWx0LCBjb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoreyAKKyAgTiggYmZkX21hY2hfYXJtXzIsICAiYXJtdjIiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFsxXSApLAorICBOKCBiZmRfbWFjaF9hcm1fMmEsICJhcm12MmEiLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzJdICksCisgIE4oIGJmZF9tYWNoX2FybV8zLCAgImFybXYzIiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbM10gKSwKKyAgTiggYmZkX21hY2hfYXJtXzNNLCAiYXJtdjNtIiwgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFs0XSApLAorICBOKCBiZmRfbWFjaF9hcm1fNCwgICJhcm12NCIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzVdICksCisgIE4oIGJmZF9tYWNoX2FybV80VCwgImFybXY0dCIsIGZhbHNlLCBOVUxMICkKK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2ggPQorICBOKCAwLCAiYXJtIiwgdHJ1ZSwgJiBhcmNoX2luZm9fc3RydWN0WzBdICk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LWQxMHYuYyBiL2JmZC9jcHUtZDEwdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmYwODgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LWQxMHYuYwpAQCAtMCwwICsxLDQwIEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEQxMFYgcHJvY2Vzc29yCisgICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2ggPSAKK3sJCQkJCQorICAgIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCisgICAgMTYsCS8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkKKyAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKKyAgICBiZmRfYXJjaF9kMTB2LAorICAgIDAsCQkKKyAgICAiZDEwdiIsCQkJCQorICAgICJkMTB2IiwJCQkJCisgICAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCisgICAgdHJ1ZSwJCQkJCisgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQorICAgIDAsCQkJCQorfTsKKwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMzB2LmMgYi9iZmQvY3B1LWQzMHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFkZmVlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1kMzB2LmMKQEAgLTAsMCArMSwzOSBAQAorLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYgcHJvY2Vzc29yCisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2ggPQoreworICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLworICAgIGJmZF9hcmNoX2QzMHYsCisgICAgMCwKKyAgICAiZDMwdiIsCisgICAgImQzMHYiLAorICAgIDQsIC8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCisgICAgdHJ1ZSwKKyAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAorICAgIGJmZF9kZWZhdWx0X3NjYW4sCisgICAgMCwKK307CmRpZmYgLS1naXQgYS9iZmQvY3B1LWZyMzAuYyBiL2JmZC9jcHUtZnIzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjA4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LWZyMzAuYwpAQCAtMCwwICsxLDM4IEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEZSMzAgcHJvY2Vzc29yLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9mcjMwX2FyY2ggPQoreworICAzMiwJCQkJLyogYml0cyBwZXIgd29yZCAqLworICAzMiwJCQkJLyogYml0cyBwZXIgYWRkcmVzcyAqLworICA4LAkJCQkvKiBiaXRzIHBlciBieXRlICovCisgIGJmZF9hcmNoX2ZyMzAsCQkvKiBhcmNoaXRlY3R1cmUgKi8KKyAgYmZkX21hY2hfZnIzMCwJCS8qIG1hY2hpbmUgKi8KKyAgImZyMzAiLAkJCS8qIGFyY2hpdGVjdHVyZSBuYW1lICovCisgICJmcjMwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLworICA0LAkJCQkvKiBzZWN0aW9uIGFsaWduIHBvd2VyICovCisgIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0ID8gKi8KKyAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwJLyogYXJjaGl0ZWN0dXJlIGNvbXBhcmlzb24gZm4gKi8KKyAgYmZkX2RlZmF1bHRfc2NhbiwJCS8qIHN0cmluZyB0byBhcmNoaXRlY3R1cmUgY29udmVydCBmbiAqLworICBOVUxMCQkJCS8qIG5leHQgaW4gbGlzdCAqLworfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaDgzMDAuYyBiL2JmZC9jcHUtaDgzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjdiN2RmCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1oODMwMC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAgYXJjaGl0ZWN0dXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKK2ludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOworCitzdGF0aWMgYm9vbGVhbgoraDgzMDBfc2NhbiAoaW5mbywgc3RyaW5nKQorICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBpZiAoKnN0cmluZyAhPSAnaCcgJiYgKnN0cmluZyAhPSAnSCcpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0cmluZysrOworICBpZiAoKnN0cmluZyAhPSAnOCcpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0cmluZysrOworICBpZiAoKnN0cmluZyA9PSAnLycpCisgICAgc3RyaW5nKys7CisKKyAgaWYgKCpzdHJpbmcgIT0gJzMnKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3RyaW5nKys7CisgIGlmICgqc3RyaW5nICE9ICcwJykKKyAgICByZXR1cm4gZmFsc2U7CisgIHN0cmluZysrOworICBpZiAoKnN0cmluZyAhPSAnMCcpCisgICAgcmV0dXJuIGZhbHNlOworICBzdHJpbmcrKzsKKyAgaWYgKCpzdHJpbmcgPT0gJy0nKQorICAgIHN0cmluZysrOworICBpZiAoKnN0cmluZyA9PSAnaCcgfHwgKnN0cmluZyA9PSAnSCcpCisgICAgeworICAgICAgcmV0dXJuIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwaCk7CisgICAgfQorICBlbHNlIGlmICgqc3RyaW5nID09ICdzJyB8fCAqc3RyaW5nID09ICdTJykKKyAgICB7CisgICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMDsKKyAgICB9Cit9CisKKworLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgdGhlIAorICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKKyAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKK2NvbXBhdGlibGUgKGluLCBvdXQpCisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGluOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBvdXQ7Cit7CisgIC8qIEl0J3MgcmVhbGx5IG5vdCBhIGdvb2QgaWRlYSB0byBtaXggYW5kIG1hdGNoIG1vZGVzLiAgKi8KKyAgaWYgKGluLT5tYWNoICE9IG91dC0+bWFjaCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiBpbjsKK30KKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBoODMwMF9pbmZvX3N0cnVjdCA9Cit7CisgIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLworICAxNiwJCQkJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfaDgzMDAsCisgIGJmZF9tYWNoX2g4MzAwLAorICAiaDgzMDAiLAkJCS8qIGFyY2hfbmFtZSAgKi8KKyAgImg4MzAwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLworICAxLAorICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCisgIGNvbXBhdGlibGUsCisgIGg4MzAwX3NjYW4sCisvKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCisgIDAsCit9OworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwaF9pbmZvX3N0cnVjdCA9Cit7CisgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfaDgzMDAsCisgIGJmZF9tYWNoX2g4MzAwaCwKKyAgImg4MzAwaCIsCQkJLyogYXJjaF9uYW1lICAqLworICAiaDgzMDBoIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLworICAxLAorICBmYWxzZSwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCisgIGNvbXBhdGlibGUsCisgIGg4MzAwX3NjYW4sCisvKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCisgICZoODMwMF9pbmZvX3N0cnVjdCwKK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDgzMDBfYXJjaCA9Cit7CisgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfaDgzMDAsCisgIGJmZF9tYWNoX2g4MzAwcywKKyAgImg4MzAwcyIsCQkJLyogYXJjaF9uYW1lICAqLworICAiaDgzMDBzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLworICAxLAorICBmYWxzZSwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCisgIGNvbXBhdGlibGUsCisgIGg4MzAwX3NjYW4sCisvKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCisgICZoODMwMGhfaW5mb19zdHJ1Y3QsCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1oODUwMC5jIGIvYmZkL2NwdS1oODUwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWJmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LWg4NTAwLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIOC81MDAgYXJjaGl0ZWN0dXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2lmIDAKKworLyogCitSZWxvY2F0aW9ucyBmb3IgdGhlIFo4SworCisqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKK2hvd3RvMTZfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCisJCSAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICppZ25vcmVfYmZkOworeworICBsb25nIHJlbG9jYXRpb24gPSAwOworICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbG9uZyB4ID0gYmZkX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7CisKKyAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOworCisgIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKKworICBiZmRfcHV0XzE2KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAoraG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAorCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICppZ25vcmVfYmZkOworeworICBsb25nIHJlbG9jYXRpb24gPSAwOworICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbG9uZyB4ID0gYmZkX2dldF84KGFiZmQsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKKworICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7CisKKyAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOworCisgIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7CisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKK2hvd3RvOF9GRm5uX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAorCQkgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOworICAgICBiZmQgKmlnbm9yZV9iZmQ7Cit7CisgIGxvbmcgcmVsb2NhdGlvbiA9IDA7CisgIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworCisgIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7CisgIGFib3J0KCk7CisgIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKKworICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7CisKKyAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKK2hvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKKwkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247CisgICAgIGJmZCAqaWdub3JlX2JmZDsKK3sKKyAgbG9uZyByZWxvY2F0aW9uID0gMDsKKyAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisgIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7CisgIGFib3J0KCk7CisgIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKKworICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7CisKKyAgYmZkX3B1dF84KGFiZmQsIHgsIChiZmRfYnl0ZSAqKWRhdGEgKyBhZGRyKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2CisgID0gTkVXSE9XVE8oaG93dG8xNl9jYWxsYmFjaywiYWJzMTYiLDEsZmFsc2UsZmFsc2UpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAorICA9IE5FV0hPV1RPKGhvd3RvOF9jYWxsYmFjaywiYWJzOCIsMCxmYWxzZSxmYWxzZSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgorICA9IE5FV0hPV1RPKGhvd3RvOF9GRm5uX2NhbGxiYWNrLCJmZjAwK2FiczgiLDAsZmFsc2UsZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCisgID0gTkVXSE9XVE8oaG93dG84X3BjcmVsX2NhbGxiYWNrLCJwY3JlbDgiLDAsZmFsc2UsdHJ1ZSk7CisKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQorICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHN3aXRjaCAoY29kZSkgeworICBjYXNlIEJGRF9SRUxPQ18xNjoKKyAgICByZXR1cm4gJmhvd3RvXzE2OworICBjYXNlIEJGRF9SRUxPQ184X0ZGbm46CisgICAgcmV0dXJuICZob3d0b184X0ZGbm47CisgIGNhc2UgQkZEX1JFTE9DXzg6CisgICAgcmV0dXJuICZob3d0b184OworICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgorICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKKyAgfQorICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOworfQorI2VuZGlmCisKK2ludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7CisKK3N0YXRpYyBib29sZWFuIAorc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCisgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIGlmIChzdHJjbXAoc3RyaW5nLCJoOC81MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKHN0cmNtcChzdHJpbmcsIkg4LzUwMCIpID09IDApIHJldHVybiB0cnVlOworICBpZiAoc3RyY21wKHN0cmluZywiaDg1MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKHN0cmNtcChzdHJpbmcsIkg4NTAwIikgPT0gMCkgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworCisjaWYgMCAvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KKy8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgcmV0dXJucyB3aGV0aGVyCisgICB0aGV5J2QgYmUgY29tcGF0aWJsZSAqLworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKK2NvbXBhdGlibGUgKGEsYikKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Cit7CisgIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQorICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBhOworfQorI2VuZGlmCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaCA9Cit7CisgIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLworICAyNCwJCQkJLyogMjQgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfaDg1MDAsCisgIDAsCQkJCS8qIG9ubHkgMSBtYWNoaW5lICovCisgICJoODUwMCIsCQkJLyogYXJjaF9uYW1lICAqLworICAiaDg1MDAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCisgIDEsCisgIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KKyAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKKyAgc2Nhbl9tYWNoLAorICAwLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaHBwYS5jIGIvYmZkL2NwdS1ocHBhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNmE5MgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtaHBwYS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSFAgUHJlY2lzaW9uIEFyY2hpdGVjdHVyZSBhcmNoaXRlY3R1cmUuCisgICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGExMF9hcmNoID0KK3sKKyAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICBiZmRfYXJjaF9ocHBhLAorICAxMCwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMCA9IDEwICovCisgICJocHBhIiwKKyAgImhwcGExLjAiLAorICAzLAorICB0cnVlLAkJCQkvKiBVbmxlc3Mgd2UgdXNlIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyAqLworICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKKyAgYmZkX2RlZmF1bHRfc2NhbiAsCisgIDAsCit9OworCisvKiBQQTIuMCBpbiBuYXJyb3cgbW9kZSAqLworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTIwX2FyY2ggPQoreworICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgIGJmZF9hcmNoX2hwcGEsCisgIDIwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KKyAgImhwcGEiLAorICAiaHBwYTIuMCIsCisgIDMsCisgIGZhbHNlLAkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCisgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAorICBiZmRfZGVmYXVsdF9zY2FuICwKKyAgJmJmZF9ocHBhMTBfYXJjaCwKK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYV9hcmNoID0KK3sKKyAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICBiZmRfYXJjaF9ocHBhLAorICAxMSwJCQkJLyogQnkgY29udmVudGlvbiBQQTEuMSA9IDExICovCisgICJocHBhIiwKKyAgImhwcGExLjEiLAorICAzLAorICBmYWxzZSwJCQkvKiAxLjEgc3BlY2lmaWMgZmVhdHVyZXMgdXNlZCAqLworICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKKyAgYmZkX2RlZmF1bHRfc2NhbiAsCisgICZiZmRfaHBwYTIwX2FyY2gsCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pMzg2LmMgYi9iZmQvY3B1LWkzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWI5YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1pMzg2LmMKQEAgLTAsMCArMSw3MCBAQAorLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCAzODYgYXJjaGl0ZWN0dXJlLgorICAgQ29weXJpZ2h0IDE5OTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCA9Cit7CisgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfaTM4NiwKKyAgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCwKKyAgImkzODY6aW50ZWwiLAorICAiaTM4NjppbnRlbCIsCisgIDMsCisgIHRydWUsCisgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAorICBiZmRfZGVmYXVsdF9zY2FuICwKKyAgMCwKK307CitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGk4MDg2X2FyY2ggPQoreworICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAod2VsbCwgbm90IHJlYWxseSkgKi8KKyAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICBiZmRfYXJjaF9pMzg2LAorICBiZmRfbWFjaF9pMzg2X2k4MDg2LAorICAiaTgwODYiLAorICAiaTgwODYiLAorICAzLAorICBmYWxzZSwKKyAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCisgIGJmZF9kZWZhdWx0X3NjYW4gLAorICAmYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgsCit9OworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaCA9Cit7CisgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfaTM4NiwKKyAgYmZkX21hY2hfaTM4Nl9pMzg2LAorICAiaTM4NiIsCisgICJpMzg2IiwKKyAgMywKKyAgdHJ1ZSwKKyAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCisgIGJmZF9kZWZhdWx0X3NjYW4gLAorICAmaTgwODZfYXJjaCwKK307CisKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTg2MC5jIGIvYmZkL2NwdS1pODYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjODY3YwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtaTg2MC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEJGRCBzdXBwb3J0IGZvciB0aGUgSW50ZWwgODYwIGFyY2hpdGVjdHVyZS4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ3JlYXRlZCBtb3N0bHkgYnkgc3Vic3RpdHV0aW5nICI4NjAiIGZvciAiMzg2IiBpbiBjcHUtaTM4Ni5jCisgICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pODYwX2FyY2ggPQorICB7CisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9pODYwLAorICAgIDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCisgICAgImk4NjAiLAorICAgICJpODYwIiwKKyAgICAzLAorICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KKyAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuICwKKyAgICAwLAorICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1pOTYwLmMgYi9iZmQvY3B1LWk5NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIyYzdlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1pOTYwLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBpOTYwIGFyY2hpdGVjdHVyZS4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisKKy8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCBhIHN0cmluZywgYW5kIHRyaWVzIHRvIHdvcmsgb3V0IGlmIGl0CisgICBjb3VsZCBwb3NzaWJseSByZWZlciB0byB0aGUgaTk2MCBtYWNoaW5lIHBvaW50ZWQgYXQgaW4gdGhlCisgICBpbmZvX3N0cnVjdCBwb2ludGVyICovCisKK3N0YXRpYyBib29sZWFuCitzY2FuXzk2MF9tYWNoIChhcCwgc3RyaW5nKQorICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKKworICAvKiBMb29rIGZvciB0aGUgc3RyaW5nIGk5NjAsIG9yIHNvbWVzdWNoIGF0IHRoZSBmcm9udCBvZiB0aGUgc3RyaW5nICAqLworCisgIGlmIChzdHJuY21wKCJpOTYwIixzdHJpbmcsNCkgPT0gMCkgeworICAgIHN0cmluZys9NDsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBubyBtYXRjaCwgY2FuIGJlIHVzICovCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdHJpbmdbMF0gPT0gMCkgeworICAgIC8qIGk5NjAgb24gaXQncyBvd24gbWVhbnMgY29yZSB0byB1cyovCisgICAgaWYgKGFwLT5tYWNoID09IGJmZF9tYWNoX2k5NjBfY29yZSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHN0cmluZ1swXSAhPSAnOicpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RyaW5nKys7CisgIGlmIChzdHJpbmdbMF0gPT0gJ1wwJykKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnbycgJiYgc3RyaW5nWzJdID09ICdyJyAmJgorICAgICAgc3RyaW5nWzNdID09ICdlJyAmJiBzdHJpbmdbNF0gPT0gJ1wwJykKKyAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOworICBlbHNlIGlmIChzdHJjbXAgKHN0cmluZywgImthX3NhIikgPT0gMCkKKyAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKKyAgZWxzZSBpZiAoc3RyY21wIChzdHJpbmcsICJrYl9zYiIpID09IDApCisgICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7CisgIGVsc2UgaWYgKHN0cmluZ1sxXSA9PSAnXDAnIHx8IHN0cmluZ1syXSAhPSAnXDAnKSAvKiByZXN0IGFyZSAyLWNoYXIgKi8KKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaycgJiYgc3RyaW5nWzFdID09ICdiJykKKyAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKKyAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdzJyAmJiBzdHJpbmdbMV0gPT0gJ2InKQorICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOworICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ20nICYmIHN0cmluZ1sxXSA9PSAnYycpCisgICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfbWM7CisgIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAneCcgJiYgc3RyaW5nWzFdID09ICdhJykKKyAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF94YTsKKyAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdjJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQorICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NhOworICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2snICYmIHN0cmluZ1sxXSA9PSAnYScpCisgICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Ffc2E7CisgIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAncycgJiYgc3RyaW5nWzFdID09ICdhJykKKyAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKKyAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdqJyAmJiBzdHJpbmdbMV0gPT0gJ3gnKQorICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2p4OworICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2gnICYmIHN0cmluZ1sxXSA9PSAneCcpCisgICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfaHg7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChtYWNoaW5lID09IGFwLT5tYWNoKSAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKworCisvKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHdvcmtzIG91dCB0aGUgaTk2MAorICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKKyAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKK2NvbXBhdGlibGUgKGEsYikKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Cit7CisKKyAgLyogVGhlIGk5NjAgaGFzIGRpc3RpbmN0IHN1YnNwZWNpZXMgd2hpY2ggbWF5IG5vdCBpbnRlcmJyZWVkOgorCUNPUkUgQ0EgICAgICAgICAgCisJQ09SRSBLQSBLQiBNQyBYQQorCUNPUkUgSFggSlgKKyAgICAgQW55IGFyY2hpdGVjdHVyZSBvbiB0aGUgc2FtZSBsaW5lIGlzIGNvbXBhdGlibGUsIHRoZSBvbmUgb24KKyAgICAgdGhlIHJpZ2h0IGlzIHRoZSBsZWFzdCByZXN0cmljdGl2ZS4gIAorICAgICAKKyAgICAgV2UgcmVwcmVzZW50IHRoaXMgaW5mb3JtYXRpb24gaW4gYW4gYXJyYXksIGVhY2ggbWFjaGluZSB0byBhIHNpZGUgKi8KKworI2RlZmluZSBFUlJPUgkwCisjZGVmaW5lIENPUkUJYmZkX21hY2hfaTk2MF9jb3JlICAvKjEqLyAgCisjZGVmaW5lIEtBIAliZmRfbWFjaF9pOTYwX2thX3NhIC8qMiovIAorI2RlZmluZSBLQiAJYmZkX21hY2hfaTk2MF9rYl9zYiAvKjMqLworI2RlZmluZSBNQyAJYmZkX21hY2hfaTk2MF9tYyAgICAvKjQqLworI2RlZmluZSBYQSAJYmZkX21hY2hfaTk2MF94YSAgICAvKjUqLworI2RlZmluZSBDQSAJYmZkX21hY2hfaTk2MF9jYSAgICAvKjYqLworI2RlZmluZSBKWAliZmRfbWFjaF9pOTYwX2p4ICAgIC8qNyovCisjZGVmaW5lIEhYCWJmZF9tYWNoX2k5NjBfaHggICAgLyo4Ki8KKyNkZWZpbmUgTUFYX0FSQ0ggKChpbnQpSFgpCisKKyAgc3RhdGljIENPTlNUIHVuc2lnbmVkIGxvbmcgbWF0cml4W01BWF9BUkNIKzFdW01BWF9BUkNIKzFdID0gCisgICAgeworICAgICAgeyBFUlJPUiwJQ09SRSwJS0EsCUtCLAlNQywJWEEsCUNBLAlKWCwJSFggfSwKKyAgICAgIHsgQ09SRSwJQ09SRSwJS0EsCUtCLAlNQywJWEEsCUNBLAlKWCwJSFggfSwKKyAgICAgIHsgS0EsCUtBLAlLQSwJS0IsCU1DLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCisgICAgICB7IEtCLAlLQiwJS0IsCUtCLAlNQywJWEEsCUVSUk9SLCAJRVJST1IsCUVSUk9SfSwKKyAgICAgIHsgTUMsCU1DLAlNQywJTUMsCU1DLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCisgICAgICB7IFhBLAlYQSwJWEEsCVhBLAlYQSwJWEEsCUVSUk9SLAlFUlJPUiwJRVJST1J9LAorICAgICAgeyBDQSwJQ0EsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlDQSwJRVJST1IsCUVSUk9SfSwKKyAgICAgIHsgSlgsCUpYLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsICBKWCwJSFggfSwKKyAgICAgIHsgSFgsCUhYLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUhYLAlIWCB9LAorICAgIH07CisKKworICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoIHx8IG1hdHJpeFthLT5tYWNoXVtiLT5tYWNoXSA9PSBFUlJPUikgCisgICAgeworICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgcmV0dXJuIChhLT5tYWNoICA9PSAgbWF0cml4W2EtPm1hY2hdW2ItPm1hY2hdKSA/ICBhIDogYjsKKyAgICB9Cit9CisKKworCitpbnQgYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCgpOworI2RlZmluZSBOKGEsYixkLG4pIFwKK3sgMzIsIDMyLCA4LGJmZF9hcmNoX2k5NjAsYSwiaTk2MCIsYiwzLGQsY29tcGF0aWJsZSxzY2FuXzk2MF9tYWNoLG4sfQorCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAoreyAKKyAgTihiZmRfbWFjaF9pOTYwX2thX3NhLCJpOTYwOmthX3NhIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMV0pLAorICBOKGJmZF9tYWNoX2k5NjBfa2Jfc2IsImk5NjA6a2Jfc2IiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsyXSksCisgIE4oYmZkX21hY2hfaTk2MF9tYywgICAiaTk2MDptYyIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzNdKSwKKyAgTihiZmRfbWFjaF9pOTYwX3hhLCAgICJpOTYwOnhhIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNF0pLAorICBOKGJmZF9tYWNoX2k5NjBfY2EsICAgImk5NjA6Y2EiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs1XSksCisgIE4oYmZkX21hY2hfaTk2MF9qeCwgICAiaTk2MDpqeCIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzZdKSwKKyAgTihiZmRfbWFjaF9pOTYwX2h4LAkiaTk2MDpoeCIsICAgZmFsc2UsIDApLAorfTsKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9pOTYwX2FyY2ggPQorICBOKGJmZF9tYWNoX2k5NjBfY29yZSwgImk5NjA6Y29yZSIsIHRydWUsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTEwMjAwLmMgYi9iZmQvY3B1LW0xMDIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGE2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LW0xMDIwMC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMCBwcm9jZXNzb3IKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2ggPQorICB7CisgICAgMTYsIC8qIDE2IGJpdHMgaW4gYSB3b3JkICovCisgICAgMjQsIC8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfbW4xMDIwMCwKKyAgICAyMDAsCisgICAgIm1uMTAyMDAiLAorICAgICJtbjEwMjAwIiwKKyAgICAyLAorICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KKyAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAorICAgIGJmZF9kZWZhdWx0X3NjYW4gLAorICAgIDAsCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDMwMC5jIGIvYmZkL2NwdS1tMTAzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWEwYmZlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1tMTAzMDAuYwpAQCAtMCwwICsxLDQxIEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE1hdHN1c2hpdGEgMTAzMDAgcHJvY2Vzc29yCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNkZWZpbmUgTkVYVCBOVUxMCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbW4xMDMwMF9hcmNoID0KKyAgeworICAgIDMyLCAvKiAxNiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLCAvKiAxNiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LCAgLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICAgIGJmZF9hcmNoX21uMTAzMDAsCisgICAgMzAwLAorICAgICJtbjEwMzAwIiwKKyAgICAibW4xMDMwMCIsCisgICAgMiwKKyAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCisgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKKyAgICBiZmRfZGVmYXVsdF9zY2FuICwKKyAgICBORVhULAorICB9OworCmRpZmYgLS1naXQgYS9iZmQvY3B1LW0zMnIuYyBiL2JmZC9jcHUtbTMyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2NjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LW0zMnIuYwpAQCAtMCwwICsxLDMyIEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE0zMlIgcHJvY2Vzc29yLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCit7ICAzMiwgMzIsIDgsIGJmZF9hcmNoX20zMnIsIG51bWJlciwgIm0zMnIiLCBwcmludCwgNCwgZGVmYXVsdCwgXAorICAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCBiZmRfZGVmYXVsdF9zY2FuLCBuZXh0IH0KKworI2RlZmluZSBORVhUIE5VTEwKKworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaCA9CisgIE4gKGJmZF9tYWNoX20zMnIsICJtMzJyIiwgdHJ1ZSwgTkVYVCk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW02OGsuYyBiL2JmZC9jcHUtbTY4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDE4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LW02OGsuYwpAQCAtMCwwICsxLDQyIEBACisvKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBhcmNoaXRlY3R1cmVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNkZWZpbmUgTihuYW1lLCBwcmludCxkLG5leHQpICBcCit7ICAzMiwgMzIsIDgsIGJmZF9hcmNoX202OGssIG5hbWUsICJtNjhrIixwcmludCwyLGQsYmZkX2RlZmF1bHRfY29tcGF0aWJsZSxiZmRfZGVmYXVsdF9zY2FuLCBuZXh0LCB9CisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KK3sgCisgIE4oYmZkX21hY2hfbTY4MDAwLCAibTY4azo2ODAwMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCisgIE4oYmZkX21hY2hfbTY4MDA4LCAibTY4azo2ODAwOCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsyXSksCisgIE4oYmZkX21hY2hfbTY4MDEwLCAibTY4azo2ODAxMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFszXSksCisgIE4oYmZkX21hY2hfbTY4MDIwLCAibTY4azo2ODAyMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCisgIE4oYmZkX21hY2hfbTY4MDMwLCAibTY4azo2ODAzMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs1XSksCisgIE4oYmZkX21hY2hfbTY4MDQwLCAibTY4azo2ODA0MCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs2XSksCisgIE4oYmZkX21hY2hfY3B1MzIsICAibTY4azpjcHUzMiIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs3XSksCisgIE4oYmZkX21hY2hfbTY4MDYwLCAibTY4azo2ODA2MCIsIGZhbHNlLCAwKSwKK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTY4a19hcmNoID0KKyAgTigwLCAibTY4ayIsIHRydWUsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTg4ay5jIGIvYmZkL2NwdS1tODhrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3MTZjNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtbTg4ay5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIGJmZCBiYWNrLWVuZCBmb3IgbTg4ayBzdXBwb3J0CisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKworCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTg4a19hcmNoID0KKyAgeworICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfbTg4aywKKyAgICA4ODEwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KKyAgICAibTg4ayIsCisgICAgIm04OGs6ODgxMDAiLAorICAgIDMsCisgICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLworICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4gLAorICAgIDAsCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1jb3JlLmMgYi9iZmQvY3B1LW1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiZmUxYgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtbWNvcmUuYwpAQCAtMCwwICsxLDM4IEBACisvKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBNb3Rvcm9sbGEncyBNQ29yZSBhcmNoaXRlY3R1cmUKKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21jb3JlX2FyY2ggPQoreworICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAzMiwJCSAgCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgOCwJCSAgCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgIGJmZF9hcmNoX21jb3JlLCAJCS8qIEFyY2hpdGVjdHVyZSAqLworICAwLAkJICAJCS8qIE1hY2hpbmUgbnVtYmVyIC0gMCBmb3Igbm93ICovCisgICJNQ29yZSIsCSAgCQkvKiBBcmNoaXRlY3R1cmUgbmFtZSAqLworICAiTUNvcmUiLAkgIAkJLyogUHJpbnRhYmxlIG5hbWUgKi8KKyAgMywJCSAgCQkvKiBTZWN0aW9uIGFsaWduIHBvd2VyICovCisgIHRydWUsCQkgIAkJLyogSXMgdGhpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgPyAqLworICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAkvKiBBcmNoaXRlY3R1cmUgY29tcGFyaXNvbiBmdW5jdGlvbiAqLworICBiZmRfZGVmYXVsdF9zY2FuLAkgICAJLyogU3RyaW5nIHRvIGFyY2hpdGVjdHVyZSBjb252ZXJzaW9uICovCisgIE5VTEwJCQkgICAJLyogTmV4dCBpbiBsaXN0ICovCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1taXBzLmMgYi9iZmQvY3B1LW1pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTMzYjhjCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1taXBzLmMKQEAgLTAsMCArMSw4OCBAQAorLyogYmZkIGJhY2stZW5kIGZvciBtaXBzIHN1cHBvcnQKKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKQkJXAorICB7CQkJCQkJCVwKKyAgICBCSVRTX1dPUkQsIC8qICBiaXRzIGluIGEgd29yZCAqLwkJCVwKKyAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKKyAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKKyAgICBiZmRfYXJjaF9taXBzLAkJCQkJXAorICAgIE5VTUJFUiwJCQkJCQlcCisgICAgIm1pcHMiLAkJCQkJCVwKKyAgICBQUklOVCwJCQkJCQlcCisgICAgMywJCQkJCQkJXAorICAgIERFRkFVTFQsCQkJCQkJXAorICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCisgICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKKyAgICBORVhULAkJCQkJCVwKKyAgfQorCitlbnVtIHsKK0lfbWlwczMwMDAsIAorSV9taXBzMzkwMCwgCitJX21pcHM0MDAwLCAKK0lfbWlwczQwMTAsIAorSV9taXBzNDEwMCwgCitJX21pcHM0MTExLAorSV9taXBzNDMwMCwgCitJX21pcHM0NDAwLCAKK0lfbWlwczQ2MDAsIAorSV9taXBzNDY1MCwgCitJX21pcHM1MDAwLCAKK0lfbWlwczYwMDAsIAorSV9taXBzODAwMCwgCitJX21pcHMxMDAwMCwKK0lfbWlwczE2Cit9OworCisKKyNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFsoaW5kZXgpKzFdKQorCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAoreworICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHMzMDAwLCAibWlwczozMDAwIiwgZmFsc2UsIE5OKElfbWlwczMwMDApKSwKKyAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzkwMCwgIm1pcHM6MzkwMCIsIGZhbHNlLCBOTihJX21pcHMzOTAwKSksCisgIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQwMDAsICJtaXBzOjQwMDAiLCBmYWxzZSwgTk4oSV9taXBzNDAwMCkpLAorICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDEwLCAibWlwczo0MDEwIiwgZmFsc2UsIE5OKElfbWlwczQwMTApKSwKKyAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDEwMCwgIm1pcHM6NDEwMCIsIGZhbHNlLCBOTihJX21pcHM0MTAwKSksCisgIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMTEsICJtaXBzOjQxMTEiLCBmYWxzZSwgTk4oSV9taXBzNDExMSkpLAorICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MzAwLCAibWlwczo0MzAwIiwgZmFsc2UsIE5OKElfbWlwczQzMDApKSwKKyAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDQwMCwgIm1pcHM6NDQwMCIsIGZhbHNlLCBOTihJX21pcHM0NDAwKSksCisgIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ2MDAsICJtaXBzOjQ2MDAiLCBmYWxzZSwgTk4oSV9taXBzNDYwMCkpLAorICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjUwLCAibWlwczo0NjUwIiwgZmFsc2UsIE5OKElfbWlwczQ2NTApKSwKKyAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNTAwMCwgIm1pcHM6NTAwMCIsIGZhbHNlLCBOTihJX21pcHM1MDAwKSksCisgIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczYwMDAsICJtaXBzOjYwMDAiLCBmYWxzZSwgTk4oSV9taXBzNjAwMCkpLAorICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM4MDAwLCAibWlwczo4MDAwIiwgZmFsc2UsIE5OKElfbWlwczgwMDApKSwKKyAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTAwMDAsICJtaXBzOjEwMDAwIiwgZmFsc2UsIE5OKElfbWlwczEwMDAwKSksCisKKworICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHMxNiwgICAibWlwczoxNiIsICAgZmFsc2UsIDApLAorfTsKKworLyogVGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGlzIG1pcHM6MzAwMCwgYnV0IHdpdGggYSBtYWNoaW5lIG51bWJlciBvZgorICAgemVyby4gIFRoaXMgbGV0cyB0aGUgbGlua2VyIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBkZWZhdWx0IHNldHRpbmcKKyAgIG9mIG1pcHMsIGFuZCBhbiBleHBsaWNpdCBzZXR0aW5nIG9mIG1pcHM6MzAwMC4gICovCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWlwc19hcmNoID0KK04gKDMyLCAzMiwgMCwgIm1pcHMiLCB0cnVlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW5zMzJrLmMgYi9iZmQvY3B1LW5zMzJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwYTE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtbnMzMmsuYwpAQCAtMCwwICsxLDg0NiBAQAorLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBuczMyayBhcmNoaXRlY3R1cmUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQWxtb3N0IHRvdGFsbHkgcmV3cml0dGVuIGJ5IElhbiBEYWxsIGZyb20gaW5pdGlhbCB3b3JrCisgICBieSBBbmRyZXcgQ2FnbmV5LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJuczMyay5oIgorCisjZGVmaW5lIE4obWFjaGluZSwgcHJpbnRhYmxlLCBkLCBuZXh0KSAgXAoreyAgMzIsIDMyLCA4LCBiZmRfYXJjaF9uczMyaywgbWFjaGluZSwgIm5zMzJrIixwcmludGFibGUsMyxkLGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsYmZkX2RlZmF1bHRfc2NhbiwgbmV4dCwgfQorCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Cit7IAorICBOKDMyNTMyLCJuczMyazozMjUzMiIsdHJ1ZSwgMCksIC8qIHRoZSB3b3JkIG5zMzJrIHdpbGwgbWF0Y2ggdGhpcyB0b28gKi8KK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaCA9CisgIE4oMzIwMzIsIm5zMzJrOjMyMDMyIixmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOworCitzdGF0aWMgbG9uZworbnMzMmtfc2lnbl9leHRlbmQodmFsdWUsIGJpdHMpCisgICAgIGludCB2YWx1ZTsKKyAgICAgaW50IGJpdHM7Cit7CisgIHZhbHVlID0gdmFsdWUgJiAoKDEgPDwgYml0cykgLSAxKTsKKyAgcmV0dXJuICh2YWx1ZSAmICgxIDw8IChiaXRzLTEpKQorCSAgPyB2YWx1ZSB8ICh+KCgxIDw8IGJpdHMpIC0gMSkpCisJICA6IHZhbHVlKTsKK30KKworbG9uZworX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50KGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQorICAgICBiZmRfYnl0ZSAqYnVmZmVyOworICAgICBsb25nIG9mZnNldDsKKyAgICAgbG9uZyBzaXplOworeworICBsb25nIHZhbHVlOworICBidWZmZXIgKz0gb2Zmc2V0OworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQgKCpidWZmZXIsIDcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOworICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgdmFsdWUgPSBuczMya19zaWduX2V4dGVuZCgqYnVmZmVyKyssIDYpOworICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7CisgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcisrKTsKKyAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCitpbnQKK19iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCh2YWx1ZSwgYnVmZmVyLCBvZmZzZXQsIHNpemUpCisgICAgIGxvbmcgdmFsdWU7CisgICAgIGJmZF9ieXRlICpidWZmZXI7CisgICAgIGxvbmcgb2Zmc2V0OworICAgICBsb25nIHNpemU7Cit7CisgIGJ1ZmZlciArPSBvZmZzZXQ7CisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKHZhbHVlIDwgLTY0IHx8IHZhbHVlID4gNjMpCisJcmV0dXJuIC0xOworICAgICAgdmFsdWUmPTB4N2Y7CisgICAgICAqYnVmZmVyKys9dmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpZiAodmFsdWUgPCAtODE5MiB8fCB2YWx1ZSA+IDgxOTEpCisJcmV0dXJuIC0xOworICAgICAgdmFsdWUmPTB4M2ZmZjsKKyAgICAgIHZhbHVlfD0weDgwMDA7CisgICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKKyAgICAgICpidWZmZXIrKz12YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGlmICh2YWx1ZSA8IC0weDFmMDAwMDAwIHx8IHZhbHVlID49IDB4MjAwMDAwMDApCisJcmV0dXJuIC0xOworICAgICAgdmFsdWV8PTB4YzAwMDAwMDA7CisgICAgICAqYnVmZmVyKys9KHZhbHVlPj4yNCk7CisgICAgICAqYnVmZmVyKys9KHZhbHVlPj4xNik7CisgICAgICAqYnVmZmVyKys9KHZhbHVlPj44KTsKKyAgICAgICpidWZmZXIrKz12YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2xvbmcKK19iZmRfbnMzMmtfZ2V0X2ltbWVkaWF0ZSAoYnVmZmVyLCBvZmZzZXQsIHNpemUpCisgICAgIGJmZF9ieXRlICpidWZmZXI7CisgICAgIGxvbmcgb2Zmc2V0OworICAgICBsb25nIHNpemU7Cit7CisgIGxvbmcgdmFsdWUgPSAwOworICBidWZmZXIgKz0gb2Zmc2V0OworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgNDoKKyAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOworICAgIGNhc2UgMzoKKyAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOworICAgIGNhc2UgMjoKKyAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOworICAgIGNhc2UgMToKKyAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKCpidWZmZXIrKyAmIDB4ZmYpOworICAgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCitpbnQKK19iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSAodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQorICAgICBsb25nIHZhbHVlOworICAgICBiZmRfYnl0ZSAqYnVmZmVyOworICAgICBsb25nIG9mZnNldDsKKyAgICAgbG9uZyBzaXplOworeworICBidWZmZXIgKz0gb2Zmc2V0ICsgc2l6ZSAtIDE7CisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSA0OgorICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OworICAgIGNhc2UgMzoKKyAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKKyAgICBjYXNlIDI6CisgICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7CisgICAgY2FzZSAxOgorICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBwZXJmb3JtX3JlbG9jYXRpb24gZXhjZXB0IHdlCisgKiB1c2UgZ2V0X2RhdGEgYW5kIHB1dF9kYXRhIHdoaWNoIGtub3cgYWJvdXQgdGhlIG5zMzJrCisgKiBzdG9yYWdlIG1ldGhvZHMuCisgKiBUaGlzIGlzIHByb2JhYmx5IGEgbG90IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCBuZWVkcyB0byBiZSEKKyAqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCisJCWVycm9yX21lc3NhZ2UsIGdldF9kYXRhLCBwdXRfZGF0YSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7CisgICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKKyAgICAgaW50ICgqcHV0X2RhdGEpKCk7Cit7CisgIGludCBvdmVyZmxvdyA9IDA7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7CisgIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87CisgIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247CisKKyAgaWYgKChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbikKKyAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKKyAgICAgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gIEFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbCBpcworICAgICBjb25zaWRlcmVkIHRvIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvIChTVlI0IEFCSSwgcC4gNC0yNykuICAqLworICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKKyAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIGZsYWcgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisKKyAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCisgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQorICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCisKKyAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJlbG9jYXRpb24gPSAwOworICBlbHNlCisgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisKKworICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLworICBpZiAob3V0cHV0X2JmZCAmJiBob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQorICAgIG91dHB1dF9iYXNlID0gMDsKKyAgZWxzZQorICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7CisKKyAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCisgICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLworCisgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KKwkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCisJIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCisKKwkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZworCSB0aGUgbG9jYXRpb24uCisKKwkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgorCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCisJIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KKwkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgorCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKKwkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKKwkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgorCisJIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQorCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKKwkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAorCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAorCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKKwkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCisJIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KKworCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCisJIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCisJIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCisJIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLworCisgICAgICByZWxvY2F0aW9uIC09CisJaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCisJcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQorCXsKKwkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCisJICAgICB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLiBNb2RpZnkgdGhlIHJlbG9jCisJICAgICBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCisJICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKKwkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisJICByZXR1cm4gZmxhZzsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKKwkgICAgIHJlbG9jIHJlY29yZCBhIGJpdC4KKworCSAgICAgSWYgd2UndmUgcmVsb2NhdGVkIHdpdGggYSBzeW1ib2wgd2l0aCBhIHNlY3Rpb24sIGNoYW5nZQorCSAgICAgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCisKKwkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKwkgIC8qIFdURj8/ICovCisJICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgorCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgIT0gMCkKKwkgICAgeworI2lmIDEKKwkgICAgICAvKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZworCQkgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50CisJCSBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgorCitIb3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAord2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQorCitJZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgorbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKK1NDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQorcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCitjb2RlIHdvcmtzIGFzIGl0IGRvZXMuCisKK0htbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gc2hvdWxkCitub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCitlbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAoraXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZworcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5CitoYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgorCitBIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCit0aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYworcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQorbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KKworQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKK3ZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQorbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKK2RpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKK3ZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KKworU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgord2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKK3doYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKK3BhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0CityZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCithZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCit3aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCitmb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKK3RoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgorCitXaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KK2ludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKK2xpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAorZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCitzcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKK2JmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KK2NvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKK3RyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCisKK1RoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCit3b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAord2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCitzdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCitzcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6CisgICAgMSkgYnVpbGQgdGhlIGxpbmtlcgorICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKKyAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCisgICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCisgICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KKyAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYworICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgorICAgIDUpIHJlcGVhdCBzdGVwIDIKKyAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0CisgICAgICAgbWFkZSBpdCBubyB3b3JzZQorICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKKyAgICAgICByaWdodAorKi8KKwkgICAgICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisjZW5kaWYKKwkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7CisgICAgfQorCisgIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCisgICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCisgICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQorICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKKyAgICAgbWFjaGluZSB3b3JkLgorICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgorICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLworICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCisgICAgeworICAgICAgYmZkX3ZtYSBjaGVjazsKKworICAgICAgLyogR2V0IHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIHJlbG9jYXRpb24sIGJ1dAorCSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gemVyby4gICovCisgICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zKQorCWNoZWNrID0gcmVsb2NhdGlvbiA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKTsKKyAgICAgIGVsc2UKKwljaGVjayA9IHJlbG9jYXRpb24gPDwgKGhvd3RvLT5iaXRwb3MgLSBob3d0by0+cmlnaHRzaGlmdCk7CisgICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKKwl7CisJY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6CisJICB7CisJICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCisJICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOworCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7CisKKwkgICAgLyogVGhlIGFib3ZlIHJpZ2h0IHNoaWZ0IGlzIGluY29ycmVjdCBmb3IgYSBzaWduZWQgdmFsdWUuCisJICAgICAgIEZpeCBpdCB1cCBieSBmb3JjaW5nIG9uIHRoZSB1cHBlciBiaXRzLiAgKi8KKwkgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcworCQkmJiAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAwKQorCSAgICAgIGNoZWNrIHw9ICgoYmZkX3ZtYSkgLSAxCisJCQkmIH4oKGJmZF92bWEpIC0gMQorCQkJICAgID4+IChob3d0by0+cmlnaHRzaGlmdCAtIGhvd3RvLT5iaXRwb3MpKSk7CisJICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIGNoZWNrID4gcmVsb2Nfc2lnbmVkX21heAorCQl8fCAoYmZkX3NpZ25lZF92bWEpIGNoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKKwkgICAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKKwkgIHsKKwkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcworCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KKwkgICAgICAgYmZkX3ZtYS4gICovCisJICAgIGJmZF92bWEgcmVsb2NfdW5zaWduZWRfbWF4ID0KKwkgICAgKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7CisKKwkgICAgaWYgKChiZmRfdm1hKSBjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKKwkgICAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKKwkgIHsKKwkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcworCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KKwkgICAgICAgYmZkX3ZtYS4gICovCisJICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOworCisJICAgIGlmICgoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9IDAKKwkJJiYgKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAoLTEgJiB+cmVsb2NfYml0cykpCisJICAgICAgeworCQkvKiBUaGUgYWJvdmUgcmlnaHQgc2hpZnQgaXMgaW5jb3JyZWN0IGZvciBhIHNpZ25lZAorCQkgICB2YWx1ZS4gIFNlZSBpZiB0dXJuaW5nIG9uIHRoZSB1cHBlciBiaXRzIGZpeGVzIHRoZQorCQkgICBvdmVyZmxvdy4gICovCisJCWlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MKKwkJICAgICYmIChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IDApCisJCSAgeworCQkgICAgY2hlY2sgfD0gKChiZmRfdm1hKSAtIDEKKwkJCSAgICAgICYgfigoYmZkX3ZtYSkgLSAxCisJCQkJICA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKSkpOworCQkgICAgaWYgKCgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gKC0xICYgfnJlbG9jX2JpdHMpKQorCQkgICAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCQkgIH0KKwkJZWxzZQorCQkgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgLyoKKyAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKKyAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKKyAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKKyAgICAqLworCisgIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCisgICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKKyAgICAgZm9sbG93aW5nIHByb2dyYW06CisKKyAgICAgc3RydWN0IHN0cgorICAgICB7CisgICAgICAgdW5zaWduZWQgaW50IGkwOworICAgICB9IHMgPSB7IDAgfTsKKworICAgICBpbnQKKyAgICAgbWFpbiAoKQorICAgICB7CisgICAgICAgdW5zaWduZWQgbG9uZyB4OworCisgICAgICAgeCA9IDB4MTAwMDAwMDAwOworICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOworICAgICAgIGlmICh4ID09IDApCisJIHByaW50ZiAoImZhaWxlZFxuIik7CisgICAgICAgZWxzZQorCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOworICAgICB9CisgICAgICovCisKKyAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OworCisgIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCisKKyAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7CisKKyAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KKworICAvKiBXaGF0IHdlIGRvOgorICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKKyAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCisgICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKKyAgICAgUyBzcmMgbWFzaworICAgICBEIGRzdCBtYXNrCisgICAgIE4gfmRzdCBtYXNrCisgICAgIEEgcGFydCAxCisgICAgIEIgcGFydCAyCisgICAgIFIgcmVzdWx0CisKKyAgICAgRG8gdGhpczoKKyAgICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgICAgICAgZnJvbSBiZmRfZ2V0PHNpemU+CisgICAgIGFuZCAgICAgICAgICAgUyBTIFMgUyBTICAgIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAorICAgICArICAgciByIHIgciByIHIgciByIHIgciAgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQorICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIEEgQSBBIEEgQQorICAgICBBbmQgdGhpczoKKyAgICAgLi4uICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+CisgICAgIGFuZCAgIE4gTiBOIE4gTiAgICAgICAgICAgIGdldCBpbnN0cnVjdGlvbgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAuLi4gICBCIEIgQiBCIEIKKworICAgICBBbmQgdGhlbjoKKyAgICAgQiBCIEIgQiBCCisgICAgIG9yICAgICAgICAgICAgICBBIEEgQSBBIEEKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgICAgICAgcHV0IGludG8gYmZkX3B1dDxzaXplPgorICAgICAqLworCisjZGVmaW5lIERPSVQoeCkgXAorICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQorCisgIHN3aXRjaCAoaG93dG8tPnNpemUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHsKKwljaGFyIHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgMSk7CisJRE9JVCAoeCk7CisJb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhLCBhZGRyLCAxKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxOgorICAgICAgaWYgKHJlbG9jYXRpb24pCisJeworCSAgc2hvcnQgeCA9IGdldF9kYXRhIChkYXRhLCBhZGRyLCAyKTsKKwkgIERPSVQgKHgpOworCSAgb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhLCBhZGRyLCAyKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpZiAocmVsb2NhdGlvbikKKwl7CisJICBsb25nIHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgNCk7CisJICBET0lUICh4KTsKKwkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgNCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAtMjoKKyAgICAgIHsKKwlsb25nICB4ID0gZ2V0X2RhdGEoZGF0YSwgYWRkciwgNCk7CisJcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOworCURPSVQoeCk7CisJb3ZlcmZsb3cgPSBwdXRfZGF0YSh4LCBkYXRhICwgYWRkciwgNCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMzoKKyAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA0OgorI2lmZGVmIEJGRDY0CisgICAgICBpZiAocmVsb2NhdGlvbikKKwl7CisJICBiZmRfdm1hIHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgOCk7CisJICBET0lUICh4KTsKKwkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgOCk7CisJfQorI2Vsc2UKKyAgICAgIGFib3J0ICgpOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKKyAgICB9CisgIGlmICgoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpICYmIG92ZXJmbG93KQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgcmV0dXJuIGZsYWc7Cit9CisKKy8qIFJlbG9jYXRlIGEgZ2l2ZW4gbG9jYXRpb24gdXNpbmcgYSBnaXZlbiB2YWx1ZSBhbmQgaG93dG8uICAqLworCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK19iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMgKCBob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbiwKKwkJCSAgICAgIGdldF9kYXRhLCBwdXRfZGF0YSkKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisgICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKKyAgICAgbG9uZyAoKmdldF9kYXRhKSgpOworICAgICBpbnQgKCpwdXRfZGF0YSkoKTsKK3sKKyAgaW50IHNpemU7CisgIGJmZF92bWEgeDsKKyAgYm9vbGVhbiBvdmVyZmxvdzsKKworICAvKiBJZiB0aGUgc2l6ZSBpcyBuZWdhdGl2ZSwgbmVnYXRlIFJFTE9DQVRJT04uICBUaGlzIGlzbid0IHZlcnkKKyAgICAgZ2VuZXJhbC4gICovCisgIGlmIChob3d0by0+c2l6ZSA8IDApCisgICAgcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOworCisgIC8qIEdldCB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJlbG9jYXRlLiAgKi8KKyAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDQ6CisjaWZkZWYgQkZENjQKKyAgICBjYXNlIDg6CisjZW5kaWYKKyAgICAgIHggPSBnZXRfZGF0YSAobG9jYXRpb24sIDAsIHNpemUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gIEZJWE1FOiBXZSBtYXkgZHJvcCBiaXRzIGR1cmluZyB0aGUgYWRkaXRpb24KKyAgICAgd2hpY2ggd2UgZG9uJ3QgY2hlY2sgZm9yLiAgV2UgbXVzdCBlaXRoZXIgY2hlY2sgYXQgZXZlcnkgc2luZ2xlCisgICAgIG9wZXJhdGlvbiwgd2hpY2ggd291bGQgYmUgdGVkaW91cywgb3Igd2UgbXVzdCBkbyB0aGUgY29tcHV0YXRpb25zCisgICAgIGluIGEgdHlwZSBsYXJnZXIgdGhhbiBiZmRfdm1hLCB3aGljaCB3b3VsZCBiZSBpbmVmZmljaWVudC4gICovCisgIG92ZXJmbG93ID0gZmFsc2U7CisgIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKKyAgICB7CisgICAgICBiZmRfdm1hIGNoZWNrOworICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2NoZWNrOworICAgICAgYmZkX3ZtYSBhZGQ7CisgICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduZWRfYWRkOworCisgICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPT0gMCkKKwl7CisJICBjaGVjayA9IHJlbG9jYXRpb247CisJICBzaWduZWRfY2hlY2sgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCisJICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7CisKKwkgIC8qIElmIHRoaXMgaXMgYSBzaWduZWQgdmFsdWUsIHRoZSByaWdodHNoaWZ0IGp1c3QgZHJvcHBlZAorCSAgICAgbGVhZGluZyAxIGJpdHMgKGFzc3VtaW5nIHR3b3MgY29tcGxlbWVudCkuICAqLworCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQorCSAgICBzaWduZWRfY2hlY2sgPSBjaGVjazsKKwkgIGVsc2UKKwkgICAgc2lnbmVkX2NoZWNrID0gKGNoZWNrCisJCQkgICAgfCAoKGJmZF92bWEpIC0gMQorCQkJICAgICAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOworCX0KKworICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4gICovCisgICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOworCisgICAgICAvKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlIHdpdGggYW4gYXBwcm9wcmlhdGUgc2lnbi4KKwkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKKwkgYml0IG9mIHNyY19tYXNrLiAgSWYgdGhhdCBiaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSB3ZSBhcmUKKwkgYWRkaW5nLCBpdCBpcyBuZWdhdGl2ZSwgYW5kIHdlIHN1YnRyYWN0IG91dCB0aGF0IG51bWJlciB0aW1lcworCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKKwkgY2FuIG5vdCBnZXQgdGhlIHVwcGVyIGJpdCwgYnV0IHRoYXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlCisJIHNpZ25lZF9hZGQgbmVlZHMgbm8gYWRqdXN0bWVudCB0byBiZWNvbWUgbmVnYXRpdmUgaW4gdGhhdAorCSBjYXNlLiAgKi8KKyAgICAgIHNpZ25lZF9hZGQgPSBhZGQ7CisgICAgICBpZiAoKGFkZCAmICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSkgIT0gMCkKKwlzaWduZWRfYWRkIC09ICgoKH5ob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrKSA8PCAxOworCisgICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQorCSBzdHJhaWdodCBudW1iZXIuICAqLworICAgICAgaWYgKGhvd3RvLT5iaXRwb3MgPT0gMCkKKwl7CisJICBjaGVjayArPSBhZGQ7CisJICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKKwl9CisgICAgICBlbHNlCisJeworCSAgY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7CisKKwkgIC8qIEZvciB0aGUgc2lnbmVkIGNhc2Ugd2UgdXNlIEFERCwgcmF0aGVyIHRoYW4gU0lHTkVEX0FERCwKKwkgICAgIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4gIFRoaXMgaXMgT0sgc2luY2Ugd2UKKwkgICAgIGV4cGxpY3RseSBoYW5kbGUgdGhlIHNpZ24gYml0cy4gICovCisJICBpZiAoc2lnbmVkX2FkZCA+PSAwKQorCSAgICBzaWduZWRfY2hlY2sgKz0gYWRkID4+IGhvd3RvLT5iaXRwb3M7CisJICBlbHNlCisJICAgIHNpZ25lZF9jaGVjayArPSAoKGFkZCA+PiBob3d0by0+Yml0cG9zKQorCQkJICAgICB8ICgoYmZkX3ZtYSkgLSAxCisJCQkJJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKKwl9CisKKyAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQorCXsKKwljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKKwkgIHsKKwkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgKi8KKwkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7CisJICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKKworCSAgICBpZiAoc2lnbmVkX2NoZWNrID4gcmVsb2Nfc2lnbmVkX21heAorCQl8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQorCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6CisJICB7CisJICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKKwkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCisJICAgICAgIGJmZF92bWEuICAqLworCSAgICBiZmRfdm1hIHJlbG9jX3Vuc2lnbmVkX21heCA9CisJICAgICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOworCisJICAgIGlmIChjaGVjayA+IHJlbG9jX3Vuc2lnbmVkX21heCkKKwkgICAgICBvdmVyZmxvdyA9IHRydWU7CisJICB9CisJICBicmVhazsKKwljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgorCSAgeworCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCisJICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgorCSAgICAgICBiZmRfdm1hLiAgKi8KKwkgICAgYmZkX3ZtYSByZWxvY19iaXRzID0gKCgoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxKSA8PCAxKSB8IDE7CisKKwkgICAgaWYgKChjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwCisJCSYmICgoKGJmZF92bWEpIHNpZ25lZF9jaGVjayAmIH5yZWxvY19iaXRzKQorCQkgICAgIT0gKC0xICYgfnJlbG9jX2JpdHMpKSkKKwkgICAgICBvdmVyZmxvdyA9IHRydWU7CisJICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICAvKiBQdXQgUkVMT0NBVElPTiBpbiB0aGUgcmlnaHQgYml0cy4gICovCisgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKKyAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7CisKKyAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCisgIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQorICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOworCisgIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KKyAgc3dpdGNoIChzaXplKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICAgIGFib3J0ICgpOworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSA0OgorI2lmZGVmIEJGRDY0CisgICAgY2FzZSA4OgorI2VuZGlmCisgICAgICBwdXRfZGF0YSh4LCBsb2NhdGlvbiwgMCwgc2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOworfQorCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK19iZmRfbnMzMmtfcmVsb2NfZGlzcCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICByZXR1cm4gZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwKKwkJCSBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQsCisJCQkgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50KTsKK30KKworYmZkX3JlbG9jX3N0YXR1c190eXBlCitfYmZkX25zMzJrX3JlbG9jX2ltbSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIHJldHVybiBkb19uczMya19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGUsCisJCQkgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlKTsKK30KKworYmZkX3JlbG9jX3N0YXR1c190eXBlCitfYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAorCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYmZkX3ZtYSBhZGRyZXNzOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBiZmRfdm1hIGFkZGVuZDsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworCisgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCisgIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICAvKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgYmFzaWMgcmVsb2NhdGlvbgorICAgICBhZ2FpbnN0IGEgc3ltYm9sLiAgV2Ugd2FudCB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHRvCisgICAgIHJlbG9jYXRlIHRvLiAgVGhpcyBpcyBqdXN0IFZBTFVFLCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcGx1cworICAgICBBRERFTkQsIGFueSBhZGRlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxvYy4gICovCisgIHJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZDsKKworICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBQQyByZWxhdGl2ZSwgd2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTiB0bworICAgICB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIChjdXJyZW50bHkgaW4gUkVMT0NBVElPTikgYW5kIHRoZQorICAgICBsb2NhdGlvbiB3ZSBhcmUgcmVsb2NhdGluZy4gIFNvbWUgdGFyZ2V0cyAoZS5nLiwgaTM4Ni1hb3V0KQorICAgICBhcnJhbmdlIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZQorICAgICBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIHN1Y2ggdGFyZ2V0cworICAgICBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBPdGhlciB0YXJnZXRzIChlLmcuLCBtODhrYmNzIG9yIEVMRikKKyAgICAgc2ltcGx5IGxlYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcyB6ZXJvOyBmb3Igc3VjaAorICAgICB0YXJnZXRzIHBjcmVsX29mZnNldCBpcyB0cnVlLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIGRvIG5vdAorICAgICBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlCisgICAgIHNlY3Rpb24gKHdoaWNoIGlzIGp1c3QgQUREUkVTUykuICAqLworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorICAgIHsKKyAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCisJcmVsb2NhdGlvbiAtPSBhZGRyZXNzOworICAgIH0KKworICByZXR1cm4gX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKKwkJCQkgICAgICAgY29udGVudHMgKyBhZGRyZXNzKTsKK30KZGlmZiAtLWdpdCBhL2JmZC9jcHUtcG93ZXJwYy5jIGIvYmZkL2NwdS1wb3dlcnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmMGY4MAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtcG93ZXJwYy5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiBCRkQgUG93ZXJQQyBDUFUgZGVmaW5pdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisvKiBUaGUgY29tbW9uIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgUlMvNjAwMC4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnBvd2VycGNfY29tcGF0aWJsZQorICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCitwb3dlcnBjX2NvbXBhdGlibGUgKGEsYikKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Cit7CisgIEJGRF9BU1NFUlQgKGEtPmFyY2ggPT0gYmZkX2FyY2hfcG93ZXJwYyk7CisgIHN3aXRjaCAoYi0+YXJjaCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKKyAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKKyAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKKyAgICAgIGlmIChhLT5tYWNoID09IDApCisJcmV0dXJuIGE7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KK3sKKyAgeworICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfcG93ZXJwYywKKyAgICA2MDMsIC8qIGZvciB0aGUgbXBjNjAzICovCisgICAgInBvd2VycGMiLAorICAgICJwb3dlcnBjOjYwMyIsCisgICAgMywKKyAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCisgICAgcG93ZXJwY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgICZhcmNoX2luZm9fc3RydWN0WzFdCisgIH0sCisgIHsKKyAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICAgIGJmZF9hcmNoX3Bvd2VycGMsCisgICAgNjA0LCAvKiBmb3IgdGhlIG1wYzYwNCAqLworICAgICJwb3dlcnBjIiwKKyAgICAicG93ZXJwYzo2MDQiLAorICAgIDMsCisgICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLworICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCisgICAgYmZkX2RlZmF1bHRfc2NhbiwKKyAgICAmYXJjaF9pbmZvX3N0cnVjdFsyXQorICB9LAorICB7CisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9wb3dlcnBjLAorICAgIDQwMywgLyogZm9yIHRoZSA0MDMgKi8KKyAgICAicG93ZXJwYyIsCisgICAgInBvd2VycGM6NDAzIiwKKyAgICAzLAorICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KKyAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4sCisgICAgJmFyY2hfaW5mb19zdHJ1Y3RbM10KKyAgfSwKKyAgeworICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfcG93ZXJwYywKKyAgICA2MDEsIC8qIGZvciB0aGUgbXBjNjAxICovCisgICAgInBvd2VycGMiLAorICAgICJwb3dlcnBjOjYwMSIsCisgICAgMywKKyAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCisgICAgcG93ZXJwY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgIDAKKyAgfQorfTsKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9wb3dlcnBjX2FyY2ggPQorICB7CisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9wb3dlcnBjLAorICAgIDAsIC8qIGZvciB0aGUgUE9XRVIvUG93ZXJQQyBjb21tb24gYXJjaGl0ZWN0dXJlICovCisgICAgInBvd2VycGMiLAorICAgICJwb3dlcnBjOmNvbW1vbiIsCisgICAgMywKKyAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLworICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCisgICAgYmZkX2RlZmF1bHRfc2NhbiwKKyAgICAmYXJjaF9pbmZvX3N0cnVjdFswXQorICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1yczYwMDAuYyBiL2JmZC9jcHUtcnM2MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1MmFlOQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtcnM2MDAwLmMKQEAgLTAsMCArMSw3MCBAQAorLyogQkZEIGJhY2stZW5kIGZvciByczYwMDAgc3VwcG9ydAorICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/CisgICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAorICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0CisgICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgorICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQorICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKy8qIFRoZSBSUy82MDAwIGFyY2hpdGVjdHVyZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFBvd2VyUEMgY29tbW9uCisgICBhcmNoaXRlY3R1cmUuICAqLworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpyczYwMDBfY29tcGF0aWJsZQorICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCityczYwMDBfY29tcGF0aWJsZSAoYSxiKQorICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7CisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKK3sKKyAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9yczYwMDApOworICBzd2l0Y2ggKGItPmFyY2gpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKKyAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKKyAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6CisgICAgICBpZiAoYi0+bWFjaCA9PSAwKQorCXJldHVybiBiOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAvKk5PVFJFQUNIRUQqLworfQorCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoID0KKyAgeworICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfcnM2MDAwLAorICAgIDYwMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCisgICAgInJzNjAwMCIsCisgICAgInJzNjAwMDo2MDAwIiwKKyAgICAzLAorICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KKyAgICByczYwMDBfY29tcGF0aWJsZSwKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgIDAsCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNoLmMgYi9iZmQvY3B1LXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhZGY5MgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtc2guYwpAQCAtMCwwICsxLDEwMiBAQAorLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIEhpdGFjaGktU0ggYXJjaGl0ZWN0dXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworCitzdGF0aWMgYm9vbGVhbiAKK3NjYW5fbWFjaCAoaW5mbywgc3RyaW5nKQorICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBpZiAoc3RyY2FzZWNtcCAoaW5mby0+cHJpbnRhYmxlX25hbWUsIHN0cmluZykgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKyNpZiAwCisvKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHJldHVybnMgd2hldGhlcgorICAgdGhleSdkIGJlIGNvbXBhdGlibGUgKi8KKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCitjb21wYXRpYmxlIChhLGIpCisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOworeworICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoIHx8IGEtPm1hY2ggIT0gYi0+bWFjaCkKKyAgIHJldHVybiBOVUxMOworICByZXR1cm4gYTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFNIX05FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KKyNkZWZpbmUgU0gzX05FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMV0KKyNkZWZpbmUgU0gzRV9ORVhUIE5VTEwKKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKK3sKKyAgeworICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLworICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KKyAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfc2gsCisgICAgYmZkX21hY2hfc2gzLAorICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLworICAgICJzaDMiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCisgICAgMSwKKyAgICBmYWxzZSwJCQkvKiBub3QgdGhlIGRlZmF1bHQgKi8KKyAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAorICAgIHNjYW5fbWFjaCwKKyAgICBTSDNfTkVYVAorICB9LAorICB7CisgICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9zaCwKKyAgICBiZmRfbWFjaF9zaDNlLAorICAgICJzaCIsCQkJLyogYXJjaF9uYW1lICAqLworICAgICJzaDNlIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLworICAgIDEsCisgICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCisgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKKyAgICBzY2FuX21hY2gsCisgICAgU0gzRV9ORVhUCisgIH0sCit9OworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NoX2FyY2ggPQoreworICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgIGJmZF9hcmNoX3NoLAorICBiZmRfbWFjaF9zaCwKKyAgInNoIiwJCQkJLyogYXJjaF9uYW1lICAqLworICAic2giLAkJCQkvKiBwcmludGFibGUgbmFtZSAqLworICAxLAorICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCisgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCisgIHNjYW5fbWFjaCwKKyAgU0hfTkVYVAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtc3BhcmMuYyBiL2JmZC9jcHUtc3BhcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRiZDkyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS1zcGFyYy5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKy8qIERvbid0IG1peCAzMiBiaXQgYW5kIDY0IGJpdCBmaWxlcy4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKnNwYXJjX2NvbXBhdGlibGUKKyAgUEFSQU1TICgoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICosIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqKSk7CisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgorc3BhcmNfY29tcGF0aWJsZSAoYSwgYikKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Cit7CisgIGlmIChhLT5iaXRzX3Blcl93b3JkICE9IGItPmJpdHNfcGVyX3dvcmQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOworfQorCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Cit7CisgIHsKKyAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9zcGFyYywKKyAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCwKKyAgICAic3BhcmMiLAorICAgICJzcGFyYzpzcGFyY2xldCIsCisgICAgMywKKyAgICBmYWxzZSwKKyAgICBzcGFyY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgICZhcmNoX2luZm9fc3RydWN0WzFdLAorICB9LAorICB7CisgICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfc3BhcmMsCisgICAgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlLAorICAgICJzcGFyYyIsCisgICAgInNwYXJjOnNwYXJjbGl0ZSIsCisgICAgMywKKyAgICBmYWxzZSwKKyAgICBzcGFyY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgICZhcmNoX2luZm9fc3RydWN0WzJdLAorICB9LAorICB7CisgICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfc3BhcmMsCisgICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzLAorICAgICJzcGFyYyIsCisgICAgInNwYXJjOnY4cGx1cyIsCisgICAgMywKKyAgICBmYWxzZSwKKyAgICBzcGFyY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgICZhcmNoX2luZm9fc3RydWN0WzNdLAorICB9LAorICB7CisgICAgMzIsCS8qIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfc3BhcmMsCisgICAgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSwKKyAgICAic3BhcmMiLAorICAgICJzcGFyYzp2OHBsdXNhIiwKKyAgICAzLAorICAgIGZhbHNlLAorICAgIHNwYXJjX2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4sCisgICAgJmFyY2hfaW5mb19zdHJ1Y3RbNF0sCisgIH0sCisgIHsKKyAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9zcGFyYywKKyAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUsCisgICAgInNwYXJjIiwKKyAgICAic3BhcmM6c3BhcmNsaXRlX2xlIiwKKyAgICAzLAorICAgIGZhbHNlLAorICAgIHNwYXJjX2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4sCisgICAgJmFyY2hfaW5mb19zdHJ1Y3RbNV0sCisgIH0sCisgIHsKKyAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KKyAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9zcGFyYywKKyAgICBiZmRfbWFjaF9zcGFyY192OSwKKyAgICAic3BhcmMiLAorICAgICJzcGFyYzp2OSIsCisgICAgMywKKyAgICBmYWxzZSwKKyAgICBzcGFyY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgICZhcmNoX2luZm9fc3RydWN0WzZdLAorICB9LAorICB7CisgICAgNjQsCS8qIGJpdHMgaW4gYSB3b3JkICovCisgICAgNjQsCS8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIGJpdHMgaW4gYSBieXRlICovCisgICAgYmZkX2FyY2hfc3BhcmMsCisgICAgYmZkX21hY2hfc3BhcmNfdjlhLAorICAgICJzcGFyYyIsCisgICAgInNwYXJjOnY5YSIsCisgICAgMywKKyAgICBmYWxzZSwKKyAgICBzcGFyY19jb21wYXRpYmxlLCAKKyAgICBiZmRfZGVmYXVsdF9zY2FuLAorICAgIDAsCisgIH0KK307CisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc3BhcmNfYXJjaCA9CisgIHsKKyAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF9zcGFyYywKKyAgICBiZmRfbWFjaF9zcGFyYywKKyAgICAic3BhcmMiLAorICAgICJzcGFyYyIsCisgICAgMywKKyAgICB0cnVlLCAvKiB0aGUgZGVmYXVsdCAqLworICAgIHNwYXJjX2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4sCisgICAgJmFyY2hfaW5mb19zdHJ1Y3RbMF0sCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXRpYzMwLmMgYi9iZmQvY3B1LXRpYzMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3MjNmNwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9jcHUtdGljMzAuYwpAQCAtMCwwICsxLDM5IEBACisvKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCBhcmNoaXRlY3R1cmUuCisgICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzMwX2FyY2ggPQoreworICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCisgIGJmZF9hcmNoX3RpYzMwLAorICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLworICAidGljMzAiLAorICAidG1zMzIwYzMwIiwKKyAgMiwKKyAgdHJ1ZSwJCQkJLyogdGhlIG9uZSBhbmQgb25seSAqLworICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAorICBiZmRfZGVmYXVsdF9zY2FuLAorICAwLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdGljODAuYyBiL2JmZC9jcHUtdGljODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI4NjZlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS10aWM4MC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIGJmZCBiYWNrLWVuZCBmb3IgVEkgVE1TMzIwQzgwIChNVlApIHN1cHBvcnQKKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBzdXBwb3J0IChmbmZAY3lnbnVzLmNvbSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljODBfYXJjaCA9CisgIHsKKyAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICAgIGJmZF9hcmNoX3RpYzgwLAkJLyogYmZkX2FyY2hpdGVjdHVyZSBlbnVtICovCisgICAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KKyAgICAidGljODAiLAkJCS8qIGFyY2hpdGVjdHVyZSBuYW1lICovCisgICAgInRpYzgwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLworICAgIDIsCQkJCS8qIHNlY3Rpb24gYWxpZ25tZW50IHBvd2VyICovCisgICAgdHJ1ZSwJCQkvKiBkZWZhdWx0IG1hY2hpbmUgZm9yIGFyY2hpdGVjdHVyZSAqLworICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCisgICAgYmZkX2RlZmF1bHRfc2NhbiAsCisgICAgTlVMTCwJCQkJLyogUG9pbnRlciB0byBuZXh0IGluIGNoYWluICovCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXY4NTAuYyBiL2JmZC9jcHUtdjg1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTQxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LXY4NTAuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBORUMgVjg1MCBwcm9jZXNzb3IKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKK3N0YXRpYyBib29sZWFuIAorc2NhbiAoaW5mbywgc3RyaW5nKQorICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqIGluZm87CisgICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Cit7CisgIGNvbnN0IGNoYXIgKnB0cl9zcmM7CisgIGNvbnN0IGNoYXIgKnB0cl90c3Q7CisgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKworICAvKiBGaXJzdCB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLworICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBTZWUgaG93IG11Y2ggb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBtYXRjaGVzIHdpdGggdGhlCisgICAgIGFyY2hpdGVjdHVyZSwgZWcgdGhlIHN0cmluZyBtNjhrOjY4MDIwIHdvdWxkIG1hdGNoIHRoZSBtNjhrIGVudHJ5CisgICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCisKKyAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKKyAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKKyAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCisgICAgeworICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKKyAgICB9CisKKyAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQorICAgICBjb2xvbnMgKi8KKyAgaWYgKCpwdHJfc3JjID09ICc6JykKKyAgICBwdHJfc3JjKys7CisgIAorICBpZiAoKnB0cl9zcmMgPT0gMCkKKyAgICB7CisgICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0CisJIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisgICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7CisgICAgfQorCisgIG51bWJlciA9IDA7CisgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQorICAgIHsKKyAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKiBwdHJfc3JjICAtICcwJzsKKyAgICAgIHB0cl9zcmMrKzsKKyAgICB9CisKKyAgc3dpdGNoIChudW1iZXIpIAorICAgIHsKKyAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgYXJjaCA9IGJmZF9hcmNoX3Y4NTA7IGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7CisgICAgZGVmYXVsdDogIAorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCit7ICAzMiwgMzIsIDgsIGJmZF9hcmNoX3Y4NTAsIG51bWJlciwgInY4NTAiLCBwcmludCwgMiwgZGVmYXVsdCwgXAorICAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCBzY2FuLCBuZXh0IH0KKworI2RlZmluZSBORVhUIE5VTEwKKworc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPSAKK3sKKyAgTiAoYmZkX21hY2hfdjg1MGUsICAidjg1MGUiLCAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzFdKSwKKyAgTiAoYmZkX21hY2hfdjg1MGVhLCAidjg1MGVhIiwgZmFsc2UsIE5VTEwpCit9OworCisjdW5kZWYgTkVYVAorI2RlZmluZSBORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCisKK2NvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoID0KKyAgTiAoYmZkX21hY2hfdjg1MCwgInY4NTAiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdmF4LmMgYi9iZmQvY3B1LXZheC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzZkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LXZheC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIGJmZCBiYWNrLWVuZCBmb3IgdmF4IHN1cHBvcnQKKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaCA9CisgIHsKKyAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KKyAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCisgICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLworICAgIGJmZF9hcmNoX3ZheCwKKyAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLworICAgICJ2YXgiLAorICAgICJ2YXgiLAorICAgIDMsCisgICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLworICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAorICAgIGJmZF9kZWZhdWx0X3NjYW4gLAorICAgIDAsCisgIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXc2NS5jIGIvYmZkL2NwdS13NjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJiZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS13NjUuYwpAQCAtMCwwICsxLDU0IEBACisvKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgV0RDIDY1ODE2IGFyY2hpdGVjdHVyZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXc2NWVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHc2NW91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworCitpbnQgYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCgpOworCitzdGF0aWMgYm9vbGVhbiAKK3NjYW5fbWFjaCAoaW5mbywgc3RyaW5nKQorICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBpZiAoc3RyY21wKHN0cmluZywidzY1IikgPT0gMCkgcmV0dXJuIHRydWU7CisgIGlmIChzdHJjbXAoc3RyaW5nLCJ3NjU4MTYiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKworY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF93NjVfYXJjaCA9Cit7CisgIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLworICAyNCwJCQkJLyogMjQgYml0cyBpbiBhbiBhZGRyZXNzICovCisgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgYmZkX2FyY2hfdzY1LAorICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLworICAidzY1IiwJCQkvKiBhcmNoX25hbWUgICovCisgICJ3NjUiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCisgIDEsCisgIHRydWUsCQkJCS8qIHRoZSBkZWZhdWx0IG1hY2hpbmUgKi8KKyAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKKyAgc2Nhbl9tYWNoLAorICAwLAorfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtd2UzMmsuYyBiL2JmZC9jcHUtd2UzMmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzhjYmMxCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2NwdS13ZTMyay5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIGJmZCBiYWNrLWVuZCBmb3Igd2UzMmsgc3VwcG9ydAorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQnJlbmRhbiBLZWhvZSAoYnJlbmRhbkBjcy53aWRlbmVyLmVkdSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3dlMzJrX2FyY2ggPQorICB7CisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCisgICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLworICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KKyAgICBiZmRfYXJjaF93ZTMyaywKKyAgICAzMjAwMCwJLyogb25seSAxIG1hY2hpbmUgKi8KKyAgICAid2UzMmsiLAorICAgICJ3ZTMyazozMjAwMCIsCisgICAgMywKKyAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCisgICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCisgICAgYmZkX2RlZmF1bHRfc2NhbiAsCisgICAgMCwKKyAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtejhrLmMgYi9iZmQvY3B1LXo4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2U4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvY3B1LXo4ay5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworCisjaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KKy8qCitSZWxvY2F0aW9ucyBmb3IgdGhlIFo4SworCisqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQoraG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKKwkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOworICAgICBiZmQgKmlnbm9yZV9iZmQ7Cit7CisgIGxvbmcgcmVsb2NhdGlvbiA9IDA7CisgIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7CisKKyAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOworCisgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQoraG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAorCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICppZ25vcmVfYmZkOworeworICBsb25nIHJlbG9jYXRpb24gPSAwOworICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbG9uZyB4ID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7CisKKyAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOworCisgIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKKwkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICppZ25vcmVfYmZkOworeworICBsb25nIHJlbG9jYXRpb24gPSAwOworICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKworICBsb25nIHggPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisgIGFib3J0ICgpOworICBIT1dUT19QUkVQQVJFIChyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOworCisgIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKKworICBiZmRfcHV0XzggKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2hvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKKwkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247CisgICAgIGJmZCAqaWdub3JlX2JmZDsKK3sKKyAgbG9uZyByZWxvY2F0aW9uID0gMDsKKyAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisgIGxvbmcgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgYWJvcnQgKCk7CisgIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7CisKKyAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOworCisgIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Cis9IE5FV0hPV1RPIChob3d0bzE2X2NhbGxiYWNrLCAiYWJzMTYiLCAxLCBmYWxzZSwgZmFsc2UpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAorPSBORVdIT1dUTyAoaG93dG84X2NhbGxiYWNrLCAiYWJzOCIsIDAsIGZhbHNlLCBmYWxzZSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgorPSBORVdIT1dUTyAoaG93dG84X0ZGbm5fY2FsbGJhY2ssICJmZjAwK2FiczgiLCAwLCBmYWxzZSwgZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCis9IE5FV0hPV1RPIChob3d0bzhfcGNyZWxfY2FsbGJhY2ssICJwY3JlbDgiLCAwLCBmYWxzZSwgdHJ1ZSk7CisKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQorICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfMTY6CisgICAgICByZXR1cm4gJmhvd3RvXzE2OworICAgIGNhc2UgQkZEX1JFTE9DXzhfRkZubjoKKyAgICAgIHJldHVybiAmaG93dG9fOF9GRm5uOworICAgIGNhc2UgQkZEX1JFTE9DXzg6CisgICAgICByZXR1cm4gJmhvd3RvXzg7CisgICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKKyAgICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7CisgICAgfQorfQorI2VuZGlmCisKK2ludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOworCitzdGF0aWMgYm9vbGVhbgorc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCisgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIGlmIChzdHJjbXAgKHN0cmluZywgIno4MDAxIikgPT0gMCB8fCBzdHJjbXAgKHN0cmluZywgIno4ayIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAxID09IGluZm8tPm1hY2g7CisgICAgfQorICBpZiAoc3RyY21wIChzdHJpbmcsICJ6ODAwMiIpID09IDApCisgICAgeworICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAyID09IGluZm8tPm1hY2g7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKworLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKKyAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCisKK3N0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgorY29tcGF0aWJsZSAoYSwgYikKKyAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOworICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Cit7CisgIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gYTsKK30KKworCitzdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Cit7CisgIHszMiwgMzIsIDgsIGJmZF9hcmNoX3o4aywgYmZkX21hY2hfejgwMDEsICJ6OGsiLCAiejgwMDEiLCAxLCBmYWxzZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAwLH0sCit9OworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoID0KK3sKKyAgMzIsIDE2LCA4LCBiZmRfYXJjaF96OGssIGJmZF9tYWNoX3o4MDAyLCAiejhrIiwgIno4MDAyIiwgMSwgdHJ1ZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAmYXJjaF9pbmZvX3N0cnVjdFswXSwKK307CmRpZmYgLS1naXQgYS9iZmQvZGVtbzY0LmMgYi9iZmQvZGVtbzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxMzgxZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9kZW1vNjQuYwpAQCAtMCwwICsxLDI0IEBACisvKiBCRkQgYmFja2VuZCBmb3IgZGVtb25zdHJhdGlvbiA2NC1iaXQgYS5vdXQgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEFSQ0hfU0laRSA2NAorI2RlZmluZSBNWShPUCkgQ0FUKGRlbW9fNjRfLE9QKQorI2RlZmluZSBUQVJHRVROQU1FICAiZGVtbzY0IgorI2luY2x1ZGUgImFvdXRmMS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2RlcC1pbi5zZWQgYi9iZmQvZGVwLWluLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRkZGUwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2RlcC1pbi5zZWQKQEAgLTAsMCArMSwyNiBAQAorOmxvb3AKKy9cXCQvTgorcy9cXFxuICovIC9nCit0IGxvb3AKKworcyFcLm86IS5sbzohCitzISBAQkZEX0hAISFnCitzIUBJTkNESVJAISQoSU5DRElSKSFnCitzIUBTUkNESVJALyEhZworcyFob3N0cy9bXiBdKlwuaCAhICFnCitzLyBzeXNkZXAuaC8vZworcyEgXC5cLi9iZmQvc3lzZGVwLmghIWcKK3MvIGxpYmJmZC5oLy9nCitzLyBjb25maWcuaC8vZworcyEgXCQoSU5DRElSKS9mb3Blbi1bXiBdKlwuaCEhZworcyEgXCQoSU5DRElSKS9hbnNpZGVjbFwuaCEhZworCitzL1xcXG4gKi8gL2cKKworcy8gKiQvLworcy8gICovIC9nCitzLyAqOi86L2cKKy86JC9kCisKK3MvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCisgIC9nCmRpZmYgLS1naXQgYS9iZmQvZG9jL0NoYW5nZUxvZyBiL2JmZC9kb2MvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODIwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZG9jL0NoYW5nZUxvZwpAQCAtMCwwICsxLDM5MCBAQAorVGh1IEZlYiAgNCAyMzoyMTozNiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvY29uZi9hdXRvbWFrZS4KKworVGh1IEp1bCAyMyAwOTozNjo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBiZmRpbnQudGV4aSAoQkZEIEVMRiBwcm9jZXNzb3IgcmVxdWlyZWQpOiBBZGQgcGFyYWdyYXBoCisJZGVzY3JpYmluZyB0aGUgbmVjZXNzaXR5IHRvIGNyZWF0ZSAiaW5jbHVkZS9lbGYvQ1BVLmgiLgorCitUaHUgTWF5ICA3IDE0OjQ1OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGNoZXcubyk6IEFkZCAtSSBvcHRpb25zIGZvciBpbnRsIHNyY2RpciBhbmQKKwlvYmpkaXIuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEFwciAyNyAyMDoxOToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZGludC50ZXhpOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChub2luc3RfVEVYSU5GT1MpOiBOZXcgdmFyaWFibGUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEFwciAxMyAxNjo0ODo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitNb24gQXByICA2IDE0OjA2OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCisJKENMRUFORklMRVMpOiBEb24ndCByZW1vdmUgJChTVEFHRVNUVUZGKS4KKwkoRElTVENMRUFORklMRVMsIE1BSU5UQUlORVJDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlcy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitGcmkgTWFyIDI3IDE2OjI1OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY2hldy5jIChza2lwX3doaXRlX2FuZF9zdGFydHMpOiBSZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uLgorCShza2lwX3doaXRlX2FuZF9zdGFycyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KKwkoc2tpcF90cmFpbGluZ19uZXdsaW5lcywgcGFyYW1zdHVmZiwgY291cmllcml6ZSk6IExpa2V3aXNlLgorCShidWxsZXRpemUsIGRvX2ZhbmN5X3N0dWZmLCBpc2NvbW1hbmQpOiBMaWtld2lzZS4KKwkoa2lsbF9ib2d1c19saW5lcywgbmV4dHdvcmQsIG1haW4pOiBMaWtld2lzZS4KKwkobWFuZ2xlY29tbWVudHMpOiBDb21tZW50IG91dC4KKwkob3V0cHV0ZG90cywga2lsbF9ib2d1c19saW5lcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgorCShwZXJmb3JtLCBjb21waWxlKTogTGlrZXdpc2UuCisJKGNvdXJpZXJpemUpOiBGdWxseSBwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KKwkoY29weV9wYXN0X25ld2xpbmUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KKwkocHJpbnQpOiBDaGFuZ2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisJKG1haW4pOiBDYWxsIHVzYWdlIGZvciBhbiB1bnJlY29nbml6ZWQgb3B0aW9uLgorCitGcmkgRmViIDEzIDE0OjM3OjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEphbiAyNiAxNTozODozNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZG9jLnN0ciAoYm9keXRleHQpOiBEb24ndCBvdXRwdXQgQCogYXQgdGhlIGVuZC4KKwkqIGNoZXcuYyAoa2lsbF9ib2d1c19saW5lcyk6IE1ha2Ugc3VyZSB0aGF0IGEgcGVyaW9kIGF0IHRoZQorCWJlZ2lubmluZyBpcyByZWNvZ25pemVkLgorCShpbmRlbnQpOiBEb24ndCBwdXQgaW5kZW50YXRpb24gYXQgdGhlIGVuZC4KKwkoY29weV9wYXN0X25ld2xpbmUpOiBFeHBhbmQgdGFicy4KKwkqIE1ha2VmaWxlLmFtIChzLXJlbG9jLCBzLXN5bXMpOiBEZXBlbmQgb24gZG9jLnN0ci4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitXZWQgT2N0ICAxIDE0OjQxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oKTogRG9uJ3QgdXNlIGNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBvcgorCWVsZmNvZGUuaCBhcyBpbnB1dCBmaWxlczsgdGhleSBkb24ndCBjb250cmlidXRlIGFueXRoaW5nLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBBdWcgMTUgMDQ6NTU6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBJbnZva2UgJChNS0RPQykgYXMgLi8kKE1LRE9DKS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitGcmkgQXVnICAxIDEyOjU5OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9CVUlMRCk6IERvbid0IHNldCBleHBsaWNpdGx5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1RodSBKdWwgMzEgMjA6MDA6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KKwkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KKworVHVlIEp1bCAyMiAxNDo0NDowMCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+CisKKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc3RhbXAtKiBmaWxlcyB0byBzLSogZmlsZXMuICBVc2UgYmZkdC50ZXhpCisJcmF0aGVyIHRoYW4gYmZkLnRleGkuCisgCShET0NGSUxFUyk6IENoYW5nZSBiZmQudGV4aSB0byBiZmR0LnRleGkuCisJKiBiZmQudGV4aW5mbzogSW5jbHVkZSBiZmR0LnRleGksIG5vdCBiZmQudGV4aS4KKworTW9uIEp1biAxNiAxNTozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDQywgQ0ZMQUdTKTogU3Vic3RpdHV0ZSBmcm9tIGNvbmZpZ3VyZSBzY3JpcHQuCisJRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgorCitUdWUgQXByIDE1IDEyOjM3OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBta2luc3RhbGxkaXJzIHRvIGJ1aWxkCisJJChpbmZvZGlyKS4KKworVHVlIEFwciAgOCAxMjo0OTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQZXJtaXQgaW5mbyBmaWxlcyB0byBiZSBpbiBzcmNkaXIuCisJKHN0YW1wLSopOiBBZGQgYSBzdGFtcC1YIHRhcmdldCBmb3IgZWFjaCBYLnRleGkgdGFyZ2V0LgorCSgqLnRleGkpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLVguCisJKGNsZWFuKTogUmVtb3ZlIHN0YW1wLSouCisJKGRpc3RjbGVhbik6IERlcGVuZCB1cG9uIG1vc3RseWNsZWFuLiAgUmVtb3ZlIHN0YW1wLSouICBEb24ndAorCXJlbW92ZSAkKERPQ0ZJTEVTKS4KKworTW9uIEFwciAgNyAxNToyMzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgKi5pbmZvIGZpbGVzLgorCitUaHUgRmViIDEzIDIwOjUwOjAyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQorCisJKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgorCitUdWUgSnVuIDE4IDE4OjMyOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY2hldy5jIChraWxsX2JvZ3VzX2xpbmVzKTogUmVzZXQgc2wgd2hlbiBub3QgYXQgdGhlIHN0YXJ0IG9mIGEKKwlsaW5lLiAgRnJvbSBVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4uCisKK1R1ZSBKYW4gMzAgMTQ6MTA6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgorCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogRGVwZW5kIHVwb24gcHJvdG8uc3RyLgorCShsaWJjb2ZmLmgsIGJmZC5oKTogTGlrZXdpc2UuCisKK0ZyaSBOb3YgIDMgMTQ6NDY6NDggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTUkNET0MsIFNSQ1BST1QsIGNvcmUudGV4aSwgYmZkLmgpOiAgVXNlIGNvcmVmaWxlLmMsIAorCXJlbmFtZWQgZnJvbSBjb3JlLmMuCisKK1dlZCBOb3YgIDEgMTQ6Mjg6MjMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIGNoZXcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCisKK0ZyaSBPY3QgIDYgMTY6MjM6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBPbmx5IHJlbWFrZSB0aGlzIE1ha2VmaWxlLgorCitXZWQgT2N0ICA0IDE1OjUxOjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBjaGV3LmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgorCitUdWUgU2VwIDEyIDE4OjE0OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgorCitUaHUgQXVnIDMxIDEyOjE4OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogQWRkIGFkZGl0aW9uYWwgI2VuZGlmIGF0IGVuZCBvZiBiZmQuaCBpZgorCV9fY3BsdXNwbHVzIGlzIGRlZmluZWQuCisKK1R1ZSBOb3YgMjkgMTY6MTM6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2hldy5jICh3cml0ZV9idWZmZXIpOiBOZXcgYXJndW1lbnQgYGYnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgorCShzdGRvdXQsIHN0ZGVyciwgcHJpbnQsIGRyb3AsIGlkcm9wKTogTmV3IGZvcnRoIHdvcmRzLgorCSogcHJvdG8uc3RyIChDT01NRU5UKTogTmV3IGNvbW1hbmQuCisJKiBkb2Muc3RyIChDT01NRU5UKTogTGlrZXdpc2UuCisKK01vbiBTZXAgMTIgMTE6NDQ6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBSZW1vdmUgY3Rvci50ZXhpLgorCShJUFJPVE9TKTogUmVtb3ZlIGN0b3IuaXAuCisJKFNSQ0lQUk9UKTogUmVtb3ZlICQoc3JjZGlyKS8uLi9jdG9yLmMuCisJKGN0b3IudGV4aSk6IFJlbW92ZSB0YXJnZXQuCisJKGxpYmJmZC5oKTogUmVtb3ZlIGRlcGVuZGVuY3kgb24gJChzcmNkaXIpLy4uL2N0b3IuYy4gIFJlbW92ZQorCSQoTUtET0MpIHJ1biBvbiAkKHNyY2RpcikvLi4vY3Rvci5jLgorCSogYmZkLnRleGluZm8gKENvbnN0cnVjdG9ycyk6IFJlbW92ZSBzZWN0aW9uLgorCitGcmkgU2VwICAyIDEzOjMzOjQ0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNoZXcuYzogSW5jbHVkZSBhc3NlcnQuaC4gIEFkZGVkIHByb3RvdHlwZXMgZm9yIG1vc3QgZnVuY3Rpb25zLgorCUNoYW5nZWQgbW9zdCB1c2VzIG9mIGludCB0byBsb25nLiAgRG8gYm91bmRzIGNoZWNraW5nIG9uIHRoZQorCXN0YWNrcy4gIEFkZGVkIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBkb2N1bWVudGluZyBtb3N0IG9mIHRoZQorCWludHJpbnNpY3MuICBMb3RzIG9mIHdoaXRlc3BhY2UgY2hhbmdlcy4gIFJlLW9yZGVyZWQgc29tZQorCWZ1bmN0aW9ucy4KKwkoZGllLCBjaGVja19yYW5nZSwgaWNoZWNrX3JhbmdlKTogTmV3IGZ1bmN0aW9ucy4KKwkoc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMsIHByaW50X3N0YWNrX2xldmVsKTogTmV3IGZ1bmN0aW9ucy4KKwkodHJhbnNsYXRlY29tbWVudHMpOiBEb24ndCBpbnNlcnQgdGFiIGJlZm9yZSAiLyoiLgorCShpc2NvbW1hbmQpOiBNaW5pbXVtIGNvbW1hbmQgbGVuZ3RoIGlzIG5vdyA0LgorCShuZXh0d29yZCk6IEhhbmRsZSBzb21lIFwtc2VxdWVuY2VzLgorCShwdXNoX2FkZHIpOiBEZWxldGVkLgorCShtYWluKTogQWRkIG5ldyBpbnRyaW5zaWNzIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIGFuZAorCXByaW50X3N0YWNrX2xldmVsLiAgQ29tcGxhaW4gYXQgZW5kIGlmIHN0YWNrIGNvbnRhaW5zIG1vcmUgdGhhbgorCW9uZSBlbGVtZW50LCBvciBsZXNzLgorCShyZW1jaGFyKTogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IGJlZm9yZSBjaG9wcGluZyBvZmYgYQorCWNoYXJhY3Rlci4KKworCSogZG9jLnN0ciwgcHJvdG8uc3RyOiBIYW5kbGUgbmV3IGNvbW1hbmRzIFNFTlVNLCBFTlVNLCBFTlVNWCwKKwlFTlVNRVEsIEVOVU1FUVgsIEVOVU1ET0MuCisKK1dlZCBKYW4gMTIgMTg6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBiZmQudGV4aW5mbzogQWRkZWQgTGlua2VyIEZ1bmN0aW9ucyBub2RlLgorCSogZG9jL01ha2VmaWxlLmluIChET0NGSUxFUyk6IEFkZGVkIGxpbmtlci50ZXhpLgorCShTUkNET0MpOiBBZGRlZCBsaW5rZXIuYy4KKwkobGlua2VyLnRleGkpOiBOZXcgdGFyZ2V0LgorCitUdWUgSmFuICA0IDEwOjUyOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY2hldy5jOiBEb24ndCByZWx5IG9uIGEgY29ycmVjdCBkZWNsYXJhdGlvbiBvZiBleGl0LgorCShjaGV3X2V4aXQpOiBOZXcgZnVuY3Rpb24gd2hpY2gganVzdCBjYWxscyBleGl0LgorCShtYWluKTogVXNlIGl0LgorCitNb24gSmFuICAzIDExOjQwOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYmZkLnRleGluZm86IEFkZGVkIEhhc2ggVGFibGVzIG5vZGUuCisJKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBBZGRlZCBoYXNoLnRleGkuCisJKFNSQ0RPQyk6IEFkZGVkIGhhc2guYy4KKwkoaGFzaC50ZXhpKTogTmV3IHRhcmdldC4KKworVGh1IERlYyAzMCAxNjo1NzowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogRGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvIHNlY2xldC5jLCBzaW5jZSBpdCdzIGp1c3QKKwliZWVuIGRlbGV0ZWQuICBEb24ndCBtZW50aW9uIGhhc2guYywgbGlua2VyLmMsIG9yIGdlbmxpbmsuaCB5ZXQsCisJc2luY2UgdGhleSBkb24ndCBjb250YWluIGRvY3VtZW50YXRpb24geWV0IChoaW50LCBoaW50ISkuCisKK0ZyaSBOb3YgIDUgMTA6NTg6NTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQudGV4aW5mbzogU21hbGwgY2xlYW51cHMuCisKK0ZyaSBOb3YgMTkgMDM6NDY6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMudGV4aSk6IERlcGVuZHMgb24gJChNS0RPQykuCisKK1R1ZSBBdWcgMTAgMTQ6MjI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogRG9uJ3QgaW5jbHVkZSBlbGZjb2RlLnRleGksIHNpbmNlCisJaXQncyBlbXB0eSBub3cgYW5kIHRoYXQgdHJpZ2dlcnMgYSBtYWtlaW5mbyBidWcuCisKK01vbiBBdWcgIDkgMTY6Mjc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogTmV3IHNlY3Rpb24gb24gRUxGLCBpbmNsdWRlcworCWVsZi50ZXhpIGFuZCBlbGZjb2RlLnRleGkuCisJKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBJbmNsdWRlIGVsZi50ZXhpLCBlbGZjb2RlLnRleGkuCisJKFNSQ0RPQyk6IEluY2x1ZGUgZWxmY29kZS5oLCBlbGYuYy4KKwkoZWxmLnRleGksIGVsZmNvZGUudGV4aSk6IE5ldyBpbnRlcm1lZGlhdGUgdGFyZ2V0cy4KKworVGh1IEp1biAyNCAxMzo0ODoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICguYy5vLCBjaGV3Lm8pOiBQdXQgQ0ZMQUdTIGxhc3QuCisJKiBiZmRzdW1tLnRleGk6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGJmZC50ZXhpbmZvLCB0byBzaGFyZQorCXdpdGggbGQudGV4aW5mby4KKworTW9uIEp1biAxNCAxMjowNzowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIGNydWZ0LCAKKworV2VkIEp1biAgOSAxNjowMDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNoZXcuby4KKworVHVlIE1heSAyNSAxNDo0Njo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6IFVzZSBlbGZjb2RlLmgsIG5vdCBlbGYzMi5jLgorCitNb24gTWF5IDI0IDE1OjUwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjaGV3LmMgKGNvbXBpbGUpOiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBjYXN0cy4KKworV2VkIE1heSAxMiAxNDo0NToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIGRlZmluZSB0byBiZSAkKENDKS4KKwkoY2hldy5vLCAkKE1LRE9DKSk6IEJ1aWxkIHVzaW5nIENDX0ZPUl9CVUlMRCByYXRoZXIgdGhhbiBDQywgc2luY2UKKwlpdCBtdXN0IHJ1biBvbiB0aGUgYnVpbGQgbWFjaGluZS4KKworVHVlIEFwciAgNiAyMjozODoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNoZXcpOiAgRG9uJ3QgY29tcGlsZSBmcm9tIC5jIHRvIGV4ZWN1dGFibGUgaW4gYQorCXNpbmdsZSBzdGVwOyBpdCBwdXRzIGEgdGVtcG9yYXJ5IC5vIGZpbGVuYW1lIGludG8gdGhlIGV4ZWN1dGFibGUsCisJd2hpY2ggbWFrZXMgbXVsdGktc3RhZ2UgY29tcGFyaXNvbnMgZmFpbC4gIENvbXBpbGUgY2hldy5jIHRvCisJY2hldy5vLCBhbmQgbGluayB0aGF0LCB3aGljaCBtYWtlcyBpZGVudGljYWwgZXhlY3V0YWJsZXMgZXZlcnkgdGltZS4KKworV2VkIE1hciAyNCAxNzoyNjoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGZpeCB0eXBvIChiZmQudGV4aW5mbyBub3QgYmZkLnRleGlubykKKworRnJpIE1hciAxOSAwMToxMzowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogYmZkLnRleGluZm86IFNpbmNlIEJGRCB2ZXJzaW9uIG51bWJlciBoYXMgYmVlbiBidW1wZWQsIGRvIHNhbWUKKwl0byAidmVyc2lvbiBudW1iZXIiIG9uIHRpdGxlIHBhZ2UsIGFuZCBlbHNld2hlcmUuICBTaG91bGQgYmUKKwlmaXhlZCB0byBleHRyYWN0IHJlYWwgdmVyc2lvbiBudW1iZXIuCisKK1R1ZSBNYXIgMTYgMTI6MTU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZCAqY2xlYW4gcnVsZXMuCisKK01vbiBKYW4gMTEgMTg6NDM6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiBSZW1vdmVkIGR1cGxpY2F0ZSBpbml0LmMgYW5kIGxpYmJmZC5jLgorCUFkZGVkIHNlY2xldC5jLgorCShiZmQuaCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYmZkLmMgYW5kIHNlY2xldC5jLiAgQWRkZWQgc2VjbGV0LmMKKwl0byBidWlsZC4KKworVGh1IERlYyAxNyAxOTozNTo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0LCBkZWZpbmUgYW5kIHVzZSAkKFRFWEkyRFZJKQorCitUaHUgRGVjICAzIDE3OjQyOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFRFWElESVIpOiBOZXcgdmFyaWFibGUuCisJKGJmZC5kdmkpOiBMb29rIGZvciBiZmQudGV4aW5mbyBpbiAkKHNyY2RpcikuICBHZW5lcmF0ZSBpbmRleC4KKworCSogYmZkLnRleGluZm86IE1pbm9yIGRvYyBmaXhlcy4KKworVGh1IE5vdiAgNSAwMzoxMzo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCisKKyAJKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KKwkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCisJKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KKworTW9uIEF1ZyAxNyAxMjo0MDozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY2hldy5jOiB2YXJpb3VzIHBhdGNoZXMgcHJvdmlkZWQgYnkgSG93YXJkIENodS4KKworRnJpIEp1biAxOSAxODo1OTo1NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogIEFkZCBlbGYuYyBhcyBhIHNvdXJjZSBvZiBwcm90b3R5cGVzLgorCitNb24gTWF5IDExIDE4OjU1OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjaGV3LmM6ICBleGl0KCkgc2hvdWxkIGJlIGRlY2xhcmVkIGJ5IGNvbmZpZyBmaWxlcywgbm90IGJ5CisJcG9ydGFibGUgc291cmNlIGNvZGUuICBJdHMgdHlwZSBjb3VsZCBiZSBpbnQgb3Igdm9pZCBmdW5jdGlvbi4JCisKK01vbiBNYXkgIDQgMTM6NDU6NTcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYW5vdGhlciBDRkxBR1MgY29ycmVjdGlvbi4KKworVHVlIEFwciAyOCAxMDoyMTozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBEbyB0aGUgQ0ZMQUdTIHRoaW5nLgorCitGcmkgQXByIDEwIDIyOjM0OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8gYW5kIGRlZmF1bHQgdG8gLWcuCisKK0ZyaSBNYXIgIDYgMTg6NTM6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNoZXcuYzogbm93IGhhcyAtdyBzd2l0Y2ggdHVybiBvbiB3YXJuaW5ncworCitXZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAorCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCisJICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KKworVHVlIERlYyAxMCAyMjoxMTowNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBidWlsZCBjaGV3IGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQ29tcGxldGUKKwkgIHRoZSBNS0RPQyBtYWNybyB0cmFuc2l0aW9uLgorCitUdWUgRGVjIDEwIDA4OjI2OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjaGV3LmM6IGRvbid0IGNvcmUgZHVtcCB3aGVuIGNhbid0IG9wZW4gZmlsZQorCSogTWFrZWZpbGUuaW46IGdldCBwcm90by5zdHIgZnJvbSB0aGUgcmlnaHQgcGxhY2Ugd2hlbiBidWlsdCBpbgorCW9kZCBkaXJlY3RvcmllcworCitUdWUgRGVjIDEwIDA0OjA3OjI1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitTYXQgRGVjICA3IDE3OjAxOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjaGV3LmM6IE11Y2ggbW9kaWZpZWQKKwkqIHByb3RvLnN0ciwgZG9jLnN0cjogTmV3IGZpbGVzIGZvciBleHRyYWN0aW5nIHRvIHByb2R1Y3QKKwlwcm90b3R5cGVzIGFuZCBkb2N1bWVudHMgcmVzcGVjdGl2ZWx5LgorCisKK0ZyaSBEZWMgIDYgMjI6NTc6MTIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydCwgaG9zdC9zaXRlL3RhcmdldAorCSAgaW5jbHVzaW9uIGhvb2tzLCBpbnN0YWxsIHVzaW5nIElOU1RBTExfREFUQSByYXRoZXIgdGhhbiBjcCwKKwkgIGRvbid0IGVjaG8gb24gaW5zdGFsbC4KKworVGh1IERlYyAgNSAyMjo0NjoxNyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKKwkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKKwkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCisKKwwKK0xvY2FsIFZhcmlhYmxlczoKK3ZlcnNpb24tY29udHJvbDogbmV2ZXIKK0VuZDoKZGlmZiAtLWdpdCBhL2JmZC9kb2MvTWFrZWZpbGUuYW0gYi9iZmQvZG9jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTI2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZG9jL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjUwIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCisKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKKworRE9DRklMRVMgPSBhb3V0eC50ZXhpICBhcmNoaXZlLnRleGkgYXJjaHVyZXMudGV4aSBcCisJYmZkdC50ZXhpICBjYWNoZS50ZXhpIGNvZmZjb2RlLnRleGkgXAorCWNvcmUudGV4aSBlbGYudGV4aSBlbGZjb2RlLnRleGkgIGZvcm1hdC50ZXhpICBsaWJiZmQudGV4aSAgXAorCW9wbmNscy50ZXhpICByZWxvYy50ZXhpICBzZWN0aW9uLnRleGkgIFwKKwlzeW1zLnRleGkgIHRhcmdldHMudGV4aSBpbml0LnRleGkgaGFzaC50ZXhpIGxpbmtlci50ZXhpCisKK1BST1RPUyA9IGFyY2hpdmUucCBhcmNodXJlcy5wIGJmZC5wIFwKKwkgY29yZS5wIGZvcm1hdC5wIFwKKwlsaWJiZmQucCBvcG5jbHMucCByZWxvYy5wIFwKKwlzZWN0aW9uLnAgc3ltcy5wIHRhcmdldHMucCAgXAorCWZvcm1hdC5wICBjb3JlLnAgaW5pdC5wCisKK0lQUk9UT1MgPSBjYWNoZS5pcCBsaWJiZmQuaXAgcmVsb2MuaXAgaW5pdC5pcCBhcmNodXJlcy5pcCBjb2ZmY29kZS5pcAorCisjIFNSQ0RPQywgU1JDUFJPVCwgU1JDSVBST1Qgb25seSB1c2VkIHRvIHNpZGVzdGVwIFN1biBNYWtlIGJ1ZyBpbiBpbnRlcmFjdGlvbiAKKyMgYmV0d2VlbiBWUEFUSCBhbmQgc3VmZml4IHJ1bGVzLiAgSWYgeW91IHVzZSBHTlUgTWFrZSwgcGVyaGFwcyBvdGhlciBNYWtlcywKKyMgeW91IGRvbid0IG5lZWQgdGhlc2UgdGhyZWU6CitTUkNET0MgPSAkKHNyY2RpcikvLi4vYW91dHguaCAgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyBcCisJJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpLy4uL2JmZC5jIFwKKwkkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCBcCisJJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpLy4uL2VsZi5jIFwKKwkkKHNyY2RpcikvLi4vZWxmY29kZS5oICAkKHNyY2RpcikvLi4vZm9ybWF0LmMgXAorCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvLi4vb3BuY2xzLmMgXAorCSQoc3JjZGlyKS8uLi9yZWxvYy5jICAkKHNyY2RpcikvLi4vc2VjdGlvbi5jIFwKKwkkKHNyY2RpcikvLi4vc3ltcy5jICAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jIFwKKwkkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS8uLi9saW5rZXIuYworCitTUkNQUk9UID0gJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCisJJChzcmNkaXIpLy4uL2JmZC5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jIFwKKwkkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKKwkkKHNyY2RpcikvLi4vb3BuY2xzLmMgJChzcmNkaXIpLy4uL3JlbG9jLmMgXAorCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpLy4uL3N5bXMuYyBcCisJJChzcmNkaXIpLy4uL3RhcmdldHMuYyAkKHNyY2RpcikvLi4vaW5pdC5jCisKK1NSQ0lQUk9UID0gJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKKwkkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvLi4vY3B1LWg4MzAwLmMgXAorCSQoc3JjZGlyKS8uLi9jcHUtaTk2MC5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKKwkkKHNyY2RpcikvLi4vaW5pdC5jCisKK1RFWElESVIgPSAkKHNyY2RpcikvLi4vLi4vdGV4aW5mby9mc2YKKworaW5mb19URVhJTkZPUyA9IGJmZC50ZXhpbmZvCisKK01LRE9DID0gY2hldyQoRVhFRVhUX0ZPUl9CVUlMRCkKKworJChNS0RPQyk6IGNoZXcubworCSQoQ0NfRk9SX0JVSUxEKSAtbyAkKE1LRE9DKSBjaGV3Lm8gJChMT0FETElCRVMpICQoTERGTEFHUykKKworY2hldy5vOiBjaGV3LmMKKwkkKENDX0ZPUl9CVUlMRCkgLWMgLUkuLiAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uLy4uL2ludGwgLUkuLi8uLi9pbnRsICQoSF9DRkxBR1MpICQoQ0ZMQUdTKSAkKHNyY2RpcikvY2hldy5jCisKK3Byb3RvczogbGliYmZkLmggbGliY29mZi5oIGJmZC5oCisKK2JmZC5pbmZvIGJmZC5kdmk6ICQoRE9DRklMRVMpIGJmZHN1bW0udGV4aSBiZmQudGV4aW5mbworCisjIFdlIGNhbid0IHJlcGxhY2UgdGhlc2UgcnVsZXMgd2l0aCBhbiBpbXBsaWNpdCBydWxlLCBiZWNhdXNlCisjIG1ha2VzIHdpdGhvdXQgVlBBVEggc3VwcG9ydCBjb3VsZG4ndCBmaW5kIHRoZSAuaCBmaWxlcyBpbiBgLi4nLgorCisjIFdlIHVzZSBzLVhYWCB0YXJnZXRzIHNvIHRoYXQgd2UgY2FuIGRpc3RyaWJ1dGUgdGhlIGluZm8gZmlsZXMsCisjIGFuZCBwZXJtaXQgcGVvcGxlIHRvIHJlYnVpbGQgdGhlbSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIG1ha2VpbmZvCisjIHByb2dyYW0uICBJZiBzb21lYm9keSB0cmllcyB0byByZWJ1aWxkIGluZm8sIGJ1dCBub25lIG9mIHRoZSAudGV4aQorIyBmaWxlcyBoYXZlIGNoYW5nZWQsIHRoZW4gdGhpcyBNYWtlZmlsZSB3aWxsIGJ1aWxkIGNoZXcsIGFuZCB3aWxsCisjIGJ1aWxkIGFsbCBvZiB0aGUgc3RhbXAgZmlsZXMsIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBoYXZlIHRvIHJlYnVpbGQKKyMgYmZkLmluZm8uCisKK3MtYW91dHg6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hb3V0eC5oICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FvdXR4LmggPmFvdXR4LnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhb3V0eC50bXAgYW91dHgudGV4aQorCXRvdWNoIHMtYW91dHgKK2FvdXR4LnRleGk6IHMtYW91dHgKKworcy1hcmNoaXZlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+YXJjaGl2ZS50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaGl2ZS50bXAgYXJjaGl2ZS50ZXhpCisJdG91Y2ggcy1hcmNoaXZlCithcmNoaXZlLnRleGk6IHMtYXJjaGl2ZQorCitzLWFyY2h1cmVzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+YXJjaHVyZXMudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2h1cmVzLnRtcCBhcmNodXJlcy50ZXhpCisJdG91Y2ggcy1hcmNodXJlcworYXJjaHVyZXMudGV4aTogcy1hcmNodXJlcworCisjIFdlIHVzZSBiZmR0LnRleGksIHJhdGhlciB0aGFuIGJmZC50ZXhpLCB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoCisjIGJmZC50ZXhpbmZvIG9uIGFuIDguMyBmaWxlc3lzdGVtLgorcy1iZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYmZkLmMgPmJmZC50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLnRtcCBiZmR0LnRleGkKKwl0b3VjaCBzLWJmZAorYmZkdC50ZXhpOiBzLWJmZAorCitzLWNhY2hlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+Y2FjaGUudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNhY2hlLnRtcCBjYWNoZS50ZXhpCisJdG91Y2ggcy1jYWNoZQorY2FjaGUudGV4aTogcy1jYWNoZQorCitzLWNvZmZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID5jb2ZmY29kZS50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29mZmNvZGUudG1wIGNvZmZjb2RlLnRleGkKKwl0b3VjaCBzLWNvZmZjb2RlCitjb2ZmY29kZS50ZXhpOiBzLWNvZmZjb2RlCisKK3MtY29yZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+Y29yZS50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29yZS50bXAgY29yZS50ZXhpCisJdG91Y2ggcy1jb3JlCitjb3JlLnRleGk6IHMtY29yZQorCitzLWVsZjogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZi5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZi5jID5lbGYudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZi50bXAgZWxmLnRleGkKKwl0b3VjaCBzLWVsZgorZWxmLnRleGk6IHMtZWxmCisKK3MtZWxmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGZjb2RlLmggPmVsZmNvZGUudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZmNvZGUudG1wIGVsZmNvZGUudGV4aQorCXRvdWNoIHMtZWxmY29kZQorZWxmY29kZS50ZXhpOiBzLWVsZmNvZGUKKworcy1mb3JtYXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+Zm9ybWF0LnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBmb3JtYXQudG1wIGZvcm1hdC50ZXhpCisJdG91Y2ggcy1mb3JtYXQKK2Zvcm1hdC50ZXhpOiBzLWZvcm1hdAorCitzLWxpYmJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+bGliYmZkLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC50ZXhpCisJdG91Y2ggcy1saWJiZmQKK2xpYmJmZC50ZXhpOiBzLWxpYmJmZAorCitzLW9wbmNsczogJChNS0RPQykgJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciAgPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+b3BuY2xzLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBvcG5jbHMudG1wIG9wbmNscy50ZXhpCisJdG91Y2ggcy1vcG5jbHMKK29wbmNscy50ZXhpOiBzLW9wbmNscworCitzLXJlbG9jOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9yZWxvYy5jID5yZWxvYy50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgcmVsb2MudG1wIHJlbG9jLnRleGkKKwl0b3VjaCBzLXJlbG9jCityZWxvYy50ZXhpOiBzLXJlbG9jCisKK3Mtc2VjdGlvbjogJChNS0RPQykgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPnNlY3Rpb24udG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHNlY3Rpb24udG1wIHNlY3Rpb24udGV4aQorCXRvdWNoIHMtc2VjdGlvbgorc2VjdGlvbi50ZXhpOiBzLXNlY3Rpb24KKworcy1zeW1zOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc3ltcy5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3N5bXMuYyA+c3ltcy50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc3ltcy50bXAgc3ltcy50ZXhpCisJdG91Y2ggcy1zeW1zCitzeW1zLnRleGk6IHMtc3ltcworCitzLXRhcmdldHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID50YXJnZXRzLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0YXJnZXRzLnRtcCB0YXJnZXRzLnRleGkKKwl0b3VjaCBzLXRhcmdldHMKK3RhcmdldHMudGV4aTogcy10YXJnZXRzCisKK3MtaW5pdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2luaXQuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9pbml0LmMgPmluaXQudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGluaXQudG1wIGluaXQudGV4aQorCXRvdWNoIHMtaW5pdAoraW5pdC50ZXhpOiBzLWluaXQKKworcy1oYXNoOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2hhc2guYyA+aGFzaC50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaGFzaC50bXAgaGFzaC50ZXhpCisJdG91Y2ggcy1oYXNoCitoYXNoLnRleGk6IHMtaGFzaAorCitzLWxpbmtlcjogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpbmtlci5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2xpbmtlci5jID5saW5rZXIudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpbmtlci50bXAgbGlua2VyLnRleGkKKwl0b3VjaCBzLWxpbmtlcgorbGlua2VyLnRleGk6IHMtbGlua2VyCisKK2xpYmJmZC5oOiAkKHNyY2RpcikvLi4vbGliYmZkLWluLmgJXAorCSQoc3JjZGlyKS8uLi9pbml0LmMJCVwKKwkkKHNyY2RpcikvLi4vbGliYmZkLmMJCVwKKwkkKHNyY2RpcikvLi4vY2FjaGUuYwkJXAorCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCisJJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKKwkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCisJJChNS0RPQykKKwljYXQgJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oID5saWJiZmQuaCAKKwkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2luaXQuYyA+PmxpYmJmZC5oCisJLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmxpYmJmZC5oCisJLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID4+bGliYmZkLmgKKwkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL3JlbG9jLmMgPj5saWJiZmQuaAorCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmxpYmJmZC5oCisJLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9lbGYuYyA+PmxpYmJmZC5oCisKK2xpYmNvZmYuaDogJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaAlcCisJJChzcmNkaXIpLy4uL2NvZmZjb2RlLmgJCVwKKwkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCisJJChNS0RPQykKKwljYXQgJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaCA+bGliY29mZi5oCisJLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID4+bGliY29mZi5oCisKK2JmZC5oOiAkKHNyY2RpcikvLi4vYmZkLWluLmggCQlcCisJJChzcmNkaXIpLy4uL2luaXQuYyAJCVwKKwkkKHNyY2RpcikvLi4vb3BuY2xzLmMgCQlcCisJJChzcmNkaXIpLy4uL2xpYmJmZC5jIAkJXAorCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgCQlcCisJJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKKwkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAorCSQoc3JjZGlyKS8uLi9zeW1zLmMJCVwKKwkkKHNyY2RpcikvLi4vYmZkLmMJCVwKKwkkKHNyY2RpcikvLi4vYXJjaGl2ZS5jCQlcCisJJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMJCVwKKwkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jCQlcCisJJChzcmNkaXIpLy4uL2Zvcm1hdC5jCQlcCisJJChzcmNkaXIpL3Byb3RvLnN0cgkJXAorCSQoTUtET0MpCisJY2F0ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCA+YmZkLmgKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2luaXQuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9yZWxvYy5jID4+YmZkLmgKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3N5bXMuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9iZmQuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPj5iZmQuaAkKKwllY2hvICIjaWZkZWYgX19jcGx1c3BsdXMiID4+YmZkLmgKKwllY2hvICJ9IiA+PmJmZC5oCisJZWNobyAiI2VuZGlmIiA+PmJmZC5oCisJZWNobyAiI2VuZGlmIiA+PmJmZC5oCisKK25vaW5zdF9URVhJTkZPUyA9IGJmZGludC50ZXhpCisKK01PU1RMWUNMRUFORklMRVMgPSAkKE1LRE9DKSAqLm8KKworQ0xFQU5GSUxFUyA9IHMtKiAqLnAgKi5pcAorCitESVNUQ0xFQU5GSUxFUyA9IGJmZC4/PyBiZmQuPz8/IGJmZC5oIGxpYmJmZC5oIGxpYmNvZmYuaCB0ZXhwdXQubG9nCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gJChET0NGSUxFUykKZGlmZiAtLWdpdCBhL2JmZC9kb2MvTWFrZWZpbGUuaW4gYi9iZmQvZG9jL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTVjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZG9jL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjAwIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKK1NIRUxMID0gQFNIRUxMQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitiaW5kaXIgPSBAYmluZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsaWJkaXIgPSBAbGliZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKKworREVTVERJUiA9CisKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACisKK3RvcF9idWlsZGRpciA9IC4uCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACisKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQVIgPSBAQVJACitBUyA9IEBBU0AKK0JGRF9IT1NUXzY0QklUX0xPTkcgPSBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKK0JGRF9IT1NUXzY0X0JJVCA9IEBCRkRfSE9TVF82NF9CSVRACitCRkRfSE9TVF82NF9CSVRfREVGSU5FRCA9IEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKK0JGRF9IT1NUX1VfNjRfQklUID0gQEJGRF9IT1NUX1VfNjRfQklUQAorQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorQ0MgPSBAQ0NACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ09SRUZJTEUgPSBAQ09SRUZJTEVACitDT1JFRkxBRyA9IEBDT1JFRkxBR0AKK0RBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAorRExMVE9PTCA9IEBETExUT09MQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYRUVYVF9GT1JfQlVJTEQgPSBARVhFRVhUX0ZPUl9CVUlMREAKK0dNT0ZJTEVTID0gQEdNT0ZJTEVTQAorR01TR0ZNVCA9IEBHTVNHRk1UQAorR1RfTk8gPSBAR1RfTk9ACitHVF9ZRVMgPSBAR1RfWUVTQAorSERFRklORVMgPSBASERFRklORVNACitJTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACitJTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACitJTlRMREVQUyA9IEBJTlRMREVQU0AKK0lOVExMSUJTID0gQElOVExMSUJTQAorSU5UTE9CSlMgPSBASU5UTE9CSlNACitMRCA9IEBMREAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xOX1MgPSBATE5fU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitNU0dGTVQgPSBATVNHRk1UQAorTk0gPSBATk1ACitQQUNLQUdFID0gQFBBQ0tBR0VACitQT0ZJTEVTID0gQFBPRklMRVNACitQT1NVQiA9IEBQT1NVQkAKK1JBTkxJQiA9IEBSQU5MSUJACitUREVGSU5FUyA9IEBUREVGSU5FU0AKK1VTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAorVVNFX05MUyA9IEBVU0VfTkxTQAorVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACitXSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKK2FsbF9iYWNrZW5kcyA9IEBhbGxfYmFja2VuZHNACitiZmRfYmFja2VuZHMgPSBAYmZkX2JhY2tlbmRzQAorYmZkX21hY2hpbmVzID0gQGJmZF9tYWNoaW5lc0AKK2wgPSBAbEAKK3RkZWZhdWx0cyA9IEB0ZGVmYXVsdHNACit3b3Jkc2l6ZSA9IEB3b3Jkc2l6ZUAKKworQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cworCitET0NGSUxFUyA9IGFvdXR4LnRleGkgIGFyY2hpdmUudGV4aSBhcmNodXJlcy50ZXhpIFwKKwliZmR0LnRleGkgIGNhY2hlLnRleGkgY29mZmNvZGUudGV4aSBcCisJY29yZS50ZXhpIGVsZi50ZXhpIGVsZmNvZGUudGV4aSAgZm9ybWF0LnRleGkgIGxpYmJmZC50ZXhpICBcCisJb3BuY2xzLnRleGkgIHJlbG9jLnRleGkgIHNlY3Rpb24udGV4aSAgXAorCXN5bXMudGV4aSAgdGFyZ2V0cy50ZXhpIGluaXQudGV4aSBoYXNoLnRleGkgbGlua2VyLnRleGkKKworCitQUk9UT1MgPSBhcmNoaXZlLnAgYXJjaHVyZXMucCBiZmQucCBcCisJIGNvcmUucCBmb3JtYXQucCBcCisJbGliYmZkLnAgb3BuY2xzLnAgcmVsb2MucCBcCisJc2VjdGlvbi5wIHN5bXMucCB0YXJnZXRzLnAgIFwKKwlmb3JtYXQucCAgY29yZS5wIGluaXQucAorCisKK0lQUk9UT1MgPSBjYWNoZS5pcCBsaWJiZmQuaXAgcmVsb2MuaXAgaW5pdC5pcCBhcmNodXJlcy5pcCBjb2ZmY29kZS5pcAorCisjIFNSQ0RPQywgU1JDUFJPVCwgU1JDSVBST1Qgb25seSB1c2VkIHRvIHNpZGVzdGVwIFN1biBNYWtlIGJ1ZyBpbiBpbnRlcmFjdGlvbiAKKyMgYmV0d2VlbiBWUEFUSCBhbmQgc3VmZml4IHJ1bGVzLiAgSWYgeW91IHVzZSBHTlUgTWFrZSwgcGVyaGFwcyBvdGhlciBNYWtlcywKKyMgeW91IGRvbid0IG5lZWQgdGhlc2UgdGhyZWU6CitTUkNET0MgPSAkKHNyY2RpcikvLi4vYW91dHguaCAgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyBcCisJJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpLy4uL2JmZC5jIFwKKwkkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCBcCisJJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpLy4uL2VsZi5jIFwKKwkkKHNyY2RpcikvLi4vZWxmY29kZS5oICAkKHNyY2RpcikvLi4vZm9ybWF0LmMgXAorCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvLi4vb3BuY2xzLmMgXAorCSQoc3JjZGlyKS8uLi9yZWxvYy5jICAkKHNyY2RpcikvLi4vc2VjdGlvbi5jIFwKKwkkKHNyY2RpcikvLi4vc3ltcy5jICAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jIFwKKwkkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS8uLi9saW5rZXIuYworCisKK1NSQ1BST1QgPSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKKwkkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgXAorCSQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvLi4vbGliYmZkLmMgXAorCSQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvLi4vcmVsb2MuYyBcCisJJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvLi4vc3ltcy5jIFwKKwkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS8uLi9pbml0LmMKKworCitTUkNJUFJPVCA9ICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCisJJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpLy4uL2NwdS1oODMwMC5jIFwKKwkkKHNyY2RpcikvLi4vY3B1LWk5NjAuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCisJJChzcmNkaXIpLy4uL2luaXQuYworCisKK1RFWElESVIgPSAkKHNyY2RpcikvLi4vLi4vdGV4aW5mby9mc2YKKworaW5mb19URVhJTkZPUyA9IGJmZC50ZXhpbmZvCisKK01LRE9DID0gY2hldyQoRVhFRVhUX0ZPUl9CVUlMRCkKKworbm9pbnN0X1RFWElORk9TID0gYmZkaW50LnRleGkKKworTU9TVExZQ0xFQU5GSUxFUyA9ICQoTUtET0MpICoubworCitDTEVBTkZJTEVTID0gcy0qICoucCAqLmlwCisKK0RJU1RDTEVBTkZJTEVTID0gYmZkLj8/IGJmZC4/Pz8gYmZkLmggbGliYmZkLmggbGliY29mZi5oIHRleHB1dC5sb2cKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSAkKERPQ0ZJTEVTKQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IC4uL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSAKK1RFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKK1RFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4CitJTkZPX0RFUFMgPSBiZmQuaW5mbworRFZJUyA9IGJmZC5kdmkKK1RFWElORk9TID0gYmZkLnRleGluZm8KK0RJU1RfQ09NTU9OID0gIENoYW5nZUxvZyBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgorCisKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCisKK1RBUiA9IHRhcgorR1pJUF9FTlYgPSAtLWJlc3QKK2FsbDogYWxsLXJlZGlyZWN0CisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5kdmkgLmluZm8gLnBzIC50ZXhpIC50ZXhpbmZvIC50eGkKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAorCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgZG9jL01ha2VmaWxlCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisKK2JmZC5pbmZvOiBiZmQudGV4aW5mbworYmZkLmR2aTogYmZkLnRleGluZm8KKworCitEVklQUyA9IGR2aXBzCisKKy50ZXhpLmluZm86CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnRleGkuZHZpOgorCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAorCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKKworLnRleGk6CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnRleGluZm8uaW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aW5mby5kdmk6CisJVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCisJICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAorCisudHhpLmluZm86CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnR4aS5kdmk6CisJVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCisJICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAorCisudHhpOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisuZHZpLnBzOgorCSQoRFZJUFMpICQ8IC1vICRACisKK2luc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQorCUBsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAorCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAorCSAgICBlbHNlIDogOyBmaTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKwlAJChQT1NUX0lOU1RBTEwpCisJQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKKwkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAorCSAgZG9uZTsgXAorCWVsc2UgOiA7IGZpCisKK3VuaW5zdGFsbC1pbmZvOgorCSQoUFJFX1VOSU5TVEFMTCkKKwlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpaT15ZXM7IFwKKwllbHNlIGlpPTsgZmk7IFwKKwlsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0IC16ICIkaWkiIFwKKwkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCisJZG9uZQorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCisJZG9uZQorCitkaXN0LWluZm86ICQoSU5GT19ERVBTKQorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKK21vc3RseWNsZWFuLWFtaW5mbzoKKwktcm0gLWYgYmZkLmF1eCBiZmQuY3AgYmZkLmNwcyBiZmQuZHZpIGJmZC5mbiBiZmQuZm5zIGJmZC5reSBiZmQua3lzIFwKKwkgIGJmZC5wcyBiZmQubG9nIGJmZC5wZyBiZmQudG9jIGJmZC50cCBiZmQudHBzIGJmZC52ciBiZmQudnJzIFwKKwkgIGJmZC5vcCBiZmQudHIgYmZkLmN2IGJmZC5jbgorCitjbGVhbi1hbWluZm86CisKK2Rpc3RjbGVhbi1hbWluZm86CisKK21haW50YWluZXItY2xlYW4tYW1pbmZvOgorCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAorCSAgcm0gLWYgJCRpOyBcCisJICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKKwkgICAgcm0gLWYgJCRpLVswLTldKjsgXAorCSAgZmk7IFwKKwlkb25lCitjbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KK3RhZ3M6IFRBR1MKK1RBR1M6CisKKworZGlzdGRpciA9ICQodG9wX2J1aWxkZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCisKK3N1YmRpciA9IGRvYworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCisJICBmaTsgXAorCWRvbmUKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbworaW5mby1hbTogJChJTkZPX0RFUFMpCitpbmZvOiBpbmZvLWFtCitkdmktYW06ICQoRFZJUykKK2R2aTogZHZpLWFtCitjaGVjay1hbToKK2NoZWNrOiBjaGVjay1hbQoraW5zdGFsbGNoZWNrLWFtOgoraW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtaW5mby1hbTogCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQoraW5zdGFsbC1leGVjLWFtOgoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KKworaW5zdGFsbC1kYXRhLWFtOgoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KK2luc3RhbGw6IGluc3RhbGwtYW0KK3VuaW5zdGFsbC1hbToKK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCithbGwtYW06IE1ha2VmaWxlCithbGwtcmVkaXJlY3Q6IGFsbC1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAoraW5zdGFsbGRpcnM6CisKKworbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisJLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworY2xlYW4tYW06ICBjbGVhbi1hbWluZm8gY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQorCitjbGVhbjogY2xlYW4tYW0KKworZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQorCS1ybSAtZiBsaWJ0b29sCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisKK21haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCQlkaXN0Y2xlYW4tYW0KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCisuUEhPTlk6IGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBtb3N0bHljbGVhbi1hbWluZm8gXAorZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gdGFncyBkaXN0ZGlyIFwKK2luZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAoraW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKK2luc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAorYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCitkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCittb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgorCisKKyQoTUtET0MpOiBjaGV3Lm8KKwkkKENDX0ZPUl9CVUlMRCkgLW8gJChNS0RPQykgY2hldy5vICQoTE9BRExJQkVTKSAkKExERkxBR1MpCisKK2NoZXcubzogY2hldy5jCisJJChDQ19GT1JfQlVJTEQpIC1jIC1JLi4gLUkkKHNyY2RpcikvLi4gLUkkKHNyY2RpcikvLi4vLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi8uLi9pbnRsIC1JLi4vLi4vaW50bCAkKEhfQ0ZMQUdTKSAkKENGTEFHUykgJChzcmNkaXIpL2NoZXcuYworCitwcm90b3M6IGxpYmJmZC5oIGxpYmNvZmYuaCBiZmQuaAorCitiZmQuaW5mbyBiZmQuZHZpOiAkKERPQ0ZJTEVTKSBiZmRzdW1tLnRleGkgYmZkLnRleGluZm8KKworIyBXZSBjYW4ndCByZXBsYWNlIHRoZXNlIHJ1bGVzIHdpdGggYW4gaW1wbGljaXQgcnVsZSwgYmVjYXVzZQorIyBtYWtlcyB3aXRob3V0IFZQQVRIIHN1cHBvcnQgY291bGRuJ3QgZmluZCB0aGUgLmggZmlsZXMgaW4gYC4uJy4KKworIyBXZSB1c2Ugcy1YWFggdGFyZ2V0cyBzbyB0aGF0IHdlIGNhbiBkaXN0cmlidXRlIHRoZSBpbmZvIGZpbGVzLAorIyBhbmQgcGVybWl0IHBlb3BsZSB0byByZWJ1aWxkIHRoZW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBtYWtlaW5mbworIyBwcm9ncmFtLiAgSWYgc29tZWJvZHkgdHJpZXMgdG8gcmVidWlsZCBpbmZvLCBidXQgbm9uZSBvZiB0aGUgLnRleGkKKyMgZmlsZXMgaGF2ZSBjaGFuZ2VkLCB0aGVuIHRoaXMgTWFrZWZpbGUgd2lsbCBidWlsZCBjaGV3LCBhbmQgd2lsbAorIyBidWlsZCBhbGwgb2YgdGhlIHN0YW1wIGZpbGVzLCBidXQgd2lsbCBub3QgYWN0dWFsbHkgaGF2ZSB0byByZWJ1aWxkCisjIGJmZC5pbmZvLgorCitzLWFvdXR4OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYW91dHguaCAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hb3V0eC5oID5hb3V0eC50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYW91dHgudG1wIGFvdXR4LnRleGkKKwl0b3VjaCBzLWFvdXR4Cithb3V0eC50ZXhpOiBzLWFvdXR4CisKK3MtYXJjaGl2ZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPmFyY2hpdmUudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2hpdmUudG1wIGFyY2hpdmUudGV4aQorCXRvdWNoIHMtYXJjaGl2ZQorYXJjaGl2ZS50ZXhpOiBzLWFyY2hpdmUKKworcy1hcmNodXJlczogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPmFyY2h1cmVzLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNodXJlcy50bXAgYXJjaHVyZXMudGV4aQorCXRvdWNoIHMtYXJjaHVyZXMKK2FyY2h1cmVzLnRleGk6IHMtYXJjaHVyZXMKKworIyBXZSB1c2UgYmZkdC50ZXhpLCByYXRoZXIgdGhhbiBiZmQudGV4aSwgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aAorIyBiZmQudGV4aW5mbyBvbiBhbiA4LjMgZmlsZXN5c3RlbS4KK3MtYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2JmZC5jID5iZmQudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGJmZC50bXAgYmZkdC50ZXhpCisJdG91Y2ggcy1iZmQKK2JmZHQudGV4aTogcy1iZmQKKworcy1jYWNoZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPmNhY2hlLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjYWNoZS50bXAgY2FjaGUudGV4aQorCXRvdWNoIHMtY2FjaGUKK2NhY2hlLnRleGk6IHMtY2FjaGUKKworcy1jb2ZmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+Y29mZmNvZGUudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvZmZjb2RlLnRtcCBjb2ZmY29kZS50ZXhpCisJdG91Y2ggcy1jb2ZmY29kZQorY29mZmNvZGUudGV4aTogcy1jb2ZmY29kZQorCitzLWNvcmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPmNvcmUudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvcmUudG1wIGNvcmUudGV4aQorCXRvdWNoIHMtY29yZQorY29yZS50ZXhpOiBzLWNvcmUKKworcy1lbGY6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGYuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGYuYyA+ZWxmLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGYudG1wIGVsZi50ZXhpCisJdG91Y2ggcy1lbGYKK2VsZi50ZXhpOiBzLWVsZgorCitzLWVsZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmY29kZS5oID5lbGZjb2RlLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGZjb2RlLnRtcCBlbGZjb2RlLnRleGkKKwl0b3VjaCBzLWVsZmNvZGUKK2VsZmNvZGUudGV4aTogcy1lbGZjb2RlCisKK3MtZm9ybWF0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPmZvcm1hdC50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZm9ybWF0LnRtcCBmb3JtYXQudGV4aQorCXRvdWNoIHMtZm9ybWF0Citmb3JtYXQudGV4aTogcy1mb3JtYXQKKworcy1saWJiZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPmxpYmJmZC50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQudGV4aQorCXRvdWNoIHMtbGliYmZkCitsaWJiZmQudGV4aTogcy1saWJiZmQKKworcy1vcG5jbHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgIDwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPm9wbmNscy50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugb3BuY2xzLnRtcCBvcG5jbHMudGV4aQorCXRvdWNoIHMtb3BuY2xzCitvcG5jbHMudGV4aTogcy1vcG5jbHMKKworcy1yZWxvYzogJChNS0RPQykgJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vcmVsb2MuYyA+cmVsb2MudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHJlbG9jLnRtcCByZWxvYy50ZXhpCisJdG91Y2ggcy1yZWxvYworcmVsb2MudGV4aTogcy1yZWxvYworCitzLXNlY3Rpb246ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID5zZWN0aW9uLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzZWN0aW9uLnRtcCBzZWN0aW9uLnRleGkKKwl0b3VjaCBzLXNlY3Rpb24KK3NlY3Rpb24udGV4aTogcy1zZWN0aW9uCisKK3Mtc3ltczogJChNS0RPQykgJChzcmNkaXIpLy4uL3N5bXMuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zeW1zLmMgPnN5bXMudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHN5bXMudG1wIHN5bXMudGV4aQorCXRvdWNoIHMtc3ltcworc3ltcy50ZXhpOiBzLXN5bXMKKworcy10YXJnZXRzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS9kb2Muc3RyCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+dGFyZ2V0cy50bXAKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdGFyZ2V0cy50bXAgdGFyZ2V0cy50ZXhpCisJdG91Y2ggcy10YXJnZXRzCit0YXJnZXRzLnRleGk6IHMtdGFyZ2V0cworCitzLWluaXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9pbml0LmMgJChzcmNkaXIpL2RvYy5zdHIKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaW5pdC5jID5pbml0LnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBpbml0LnRtcCBpbml0LnRleGkKKwl0b3VjaCBzLWluaXQKK2luaXQudGV4aTogcy1pbml0CisKK3MtaGFzaDogJChNS0RPQykgJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9oYXNoLmMgPmhhc2gudG1wCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGhhc2gudG1wIGhhc2gudGV4aQorCXRvdWNoIHMtaGFzaAoraGFzaC50ZXhpOiBzLWhhc2gKKworcy1saW5rZXI6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saW5rZXIuYyAkKHNyY2RpcikvZG9jLnN0cgorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9saW5rZXIuYyA+bGlua2VyLnRtcAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaW5rZXIudG1wIGxpbmtlci50ZXhpCisJdG91Y2ggcy1saW5rZXIKK2xpbmtlci50ZXhpOiBzLWxpbmtlcgorCitsaWJiZmQuaDogJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oCVwKKwkkKHNyY2RpcikvLi4vaW5pdC5jCQlcCisJJChzcmNkaXIpLy4uL2xpYmJmZC5jCQlcCisJJChzcmNkaXIpLy4uL2NhY2hlLmMJCVwKKwkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAorCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCisJJChzcmNkaXIpL3Byb3RvLnN0cgkJXAorCSQoTUtET0MpCisJY2F0ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaCA+bGliYmZkLmggCisJLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9pbml0LmMgPj5saWJiZmQuaAorCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5saWJiZmQuaAorCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+PmxpYmJmZC5oCisJLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9yZWxvYy5jID4+bGliYmZkLmgKKwkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5saWJiZmQuaAorCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vZWxmLmMgPj5saWJiZmQuaAorCitsaWJjb2ZmLmg6ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmgJXAorCSQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oCQlcCisJJChzcmNkaXIpL3Byb3RvLnN0cgkJXAorCSQoTUtET0MpCisJY2F0ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmggPmxpYmNvZmYuaAorCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+PmxpYmNvZmYuaAorCitiZmQuaDogJChzcmNkaXIpLy4uL2JmZC1pbi5oIAkJXAorCSQoc3JjZGlyKS8uLi9pbml0LmMgCQlcCisJJChzcmNkaXIpLy4uL29wbmNscy5jIAkJXAorCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAJCVwKKwkkKHNyY2RpcikvLi4vc2VjdGlvbi5jIAkJXAorCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCisJJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKKwkkKHNyY2RpcikvLi4vc3ltcy5jCQlcCisJJChzcmNkaXIpLy4uL2JmZC5jCQlcCisJJChzcmNkaXIpLy4uL2FyY2hpdmUuYwkJXAorCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jCQlcCisJJChzcmNkaXIpLy4uL3RhcmdldHMuYwkJXAorCSQoc3JjZGlyKS8uLi9mb3JtYXQuYwkJXAorCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKKwkkKE1LRE9DKQorCWNhdCAkKHNyY2RpcikvLi4vYmZkLWluLmggPmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9pbml0LmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID4+YmZkLmgKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmJmZC5oCisJLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zeW1zLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYmZkLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID4+YmZkLmgKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPj5iZmQuaAorCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID4+YmZkLmgKKwkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID4+YmZkLmgJCisJZWNobyAiI2lmZGVmIF9fY3BsdXNwbHVzIiA+PmJmZC5oCisJZWNobyAifSIgPj5iZmQuaAorCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAorCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvZG9jL2JmZC50ZXhpbmZvIGIvYmZkL2RvYy9iZmQudGV4aW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRmODdjCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2RvYy9iZmQudGV4aW5mbwpAQCAtMCwwICsxLDM0OCBAQAorXGlucHV0IHRleGluZm8udGV4CitAc2V0ZmlsZW5hbWUgYmZkLmluZm8KK0BjICRJZCQKK0B0ZXgKKyUgTk9URSBMT0NBTCBLTFVHRSBUTyBBVk9JRCBUT08gTVVDSCBXSElURVNQQUNFCitcZ2xvYmFsXGxvbmdcZGVmXGV4YW1wbGV7JQorXGJlZ2luZ3JvdXAKK1xsZXRcYWJvdmVlbnZicmVhaz1ccGFyCitcbGV0XGFmdGVyZW52YnJlYWs9XHBhcgorXHBhcnNraXA9MHB0CitcbGlzcH0KK1xnbG9iYWxcbG9uZ1xkZWZcRWV4YW1wbGV7JQorXEVsaXNwCitcZW5kZ3JvdXAKK1x2c2tpcCAtXHBhcnNraXAlIHRvIGNhbmNlbCBvdXQgZWZmZWN0IG9mIGZvbGxvd2luZyBccGFyCit9CitAZW5kIHRleAorQHN5bmluZGV4IGZuIGNwCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIEJmZDogKGJmZCkuICAgICAgICAgICAgICAgICAgIFRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCitFTkQtSU5GTy1ESVItRU5UUlkKK0BlbmQgZm9ybWF0CitAZW5kIGlmaW5mbworCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBCRkQgbGlicmFyeS4KKworQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIGlmaW5mbworQGlmdGV4CitAY0BmaW5hbG91dAorQHNldGNoYXB0ZXJuZXdwYWdlIG9uCitAY0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKK0BzZXR0aXRsZSBMSUIgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBMaWJyYXJ5CitAdGl0bGVwYWdlCitAdGl0bGV7bGliYmZkfQorQHN1YnRpdGxle1RoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnl9CitAc3AgMQorQHN1YnRpdGxlIEZpcnN0IEVkaXRpb24tLS1CRkQgdmVyc2lvbiA8IDMuMAorQHN1YnRpdGxlIEFwcmlsIDE5OTEKK0BhdXRob3Ige1N0ZXZlIENoYW1iZXJsYWlufQorQGF1dGhvciB7Q3lnbnVzIFN1cHBvcnR9CitAcGFnZQorCitAdGV4CitcZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAorXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwore1xwYXJza2lwPTBwdAorXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgorXGhmaWxsIHNhY1xAY3lnbnVzLmNvbVxwYXIKK1xoZmlsbCB7XGl0IEJGRH0sIFxtYW52ZXJzXHBhcgorXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgorfQorXGdsb2JhbFxwYXJpbmRlbnQ9MHB0ICUgU3RldmUgbGlrZXMgaXQgdGhpcyB3YXkKK0BlbmQgdGV4CisKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorQGVuZCBpZnRleAorCitAbm9kZSBUb3AsIE92ZXJ2aWV3LCAoZGlyKSwgKGRpcikKK0BpZmluZm8KK1RoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGJpbmFyeSBmaWxlIGRlc2NyaXB0b3IgbGlicmFyeSBsaWJiZmQuCitAZW5kIGlmaW5mbworCitAbWVudQorKiBPdmVydmlldzo6CQkJT3ZlcnZpZXcgb2YgQkZECisqIEJGRCBmcm9udCBlbmQ6OgkJQkZEIGZyb250IGVuZAorKiBCRkQgYmFjayBlbmRzOjoJCUJGRCBiYWNrIGVuZHMKKyogSW5kZXg6OgkJCUluZGV4CitAZW5kIG1lbnUKKworQG5vZGUgT3ZlcnZpZXcsIEJGRCBmcm9udCBlbmQsIFRvcCwgVG9wCitAY2hhcHRlciBJbnRyb2R1Y3Rpb24KK0BjaW5kZXggQkZECitAY2luZGV4IHdoYXQgaXMgaXQ/CitCRkQgaXMgYSBwYWNrYWdlIHdoaWNoIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoZQorc2FtZSByb3V0aW5lcyB0byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUKK2Zvcm1hdC4gIEEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieQorY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGxpYnJhcnkuCisKK0JGRCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0czogdGhlIGZyb250IGVuZCwgYW5kIHRoZSBiYWNrIGVuZHMgKG9uZSBmb3IKK2VhY2ggb2JqZWN0IGZpbGUgZm9ybWF0KS4KK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtIFRoZSBmcm9udCBlbmQgb2YgQkZEIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHVzZXIuIEl0IG1hbmFnZXMKK21lbW9yeSBhbmQgdmFyaW91cyBjYW5vbmljYWwgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgZnJvbnQgZW5kIGFsc28KK2RlY2lkZXMgd2hpY2ggYmFjayBlbmQgdG8gdXNlIGFuZCB3aGVuIHRvIGNhbGwgYmFjayBlbmQgcm91dGluZXMuCitAaXRlbSBUaGUgYmFjayBlbmRzIHByb3ZpZGUgQkZEIGl0cyB2aWV3IG9mIHRoZSByZWFsIHdvcmxkLiBFYWNoIGJhY2sKK2VuZCBwcm92aWRlcyBhIHNldCBvZiBjYWxscyB3aGljaCB0aGUgQkZEIGZyb250IGVuZCBjYW4gdXNlIHRvIG1haW50YWluCitpdHMgY2Fub25pY2FsIGZvcm0uIFRoZSBiYWNrIGVuZHMgYWxzbyBtYXkga2VlcCBhcm91bmQgaW5mb3JtYXRpb24gZm9yCit0aGVpciBvd24gdXNlLCBmb3IgZ3JlYXRlciBlZmZpY2llbmN5LgorQGVuZCBpdGVtaXplCitAbWVudQorKiBIaXN0b3J5OjoJCQlIaXN0b3J5CisqIEhvdyBJdCBXb3Jrczo6CQlIb3cgSXQgV29ya3MKKyogV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbzo6CVdoYXQgQkZEIFZlcnNpb24gMiBDYW4gRG8KK0BlbmQgbWVudQorCitAbm9kZSBIaXN0b3J5LCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3LCBPdmVydmlldworQHNlY3Rpb24gSGlzdG9yeQorCitPbmUgc3B1ciBiZWhpbmQgQkZEIHdhcyB0aGUgZGVzaXJlLCBvbiB0aGUgcGFydCBvZiB0aGUgR05VIDk2MCB0ZWFtIGF0CitJbnRlbCBPcmVnb24sIGZvciBpbnRlcm9wZXJhYmlsaXR5IG9mIGFwcGxpY2F0aW9ucyBvbiB0aGVpciBDT0ZGIGFuZAorYi5vdXQgZmlsZSBmb3JtYXRzLiAgQ3lnbnVzIHdhcyBwcm92aWRpbmcgR05VIHN1cHBvcnQgZm9yIHRoZSB0ZWFtLCBhbmQKK3dhcyBjb250cmFjdGVkIHRvIHByb3ZpZGUgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuCisKK1RoZSBuYW1lIGNhbWUgZnJvbSBhIGNvbnZlcnNhdGlvbiBEYXZpZCBXYWxsYWNlIHdhcyBoYXZpbmcgd2l0aCBSaWNoYXJkCitTdGFsbG1hbiBhYm91dCB0aGUgbGlicmFyeTogUk1TIHNhaWQgdGhhdCBpdCB3b3VsZCBiZSBxdWl0ZSBoYXJkLS0tRGF2aWQKK3NhaWQgYGBCRkQnJy4gIFN0YWxsbWFuIHdhcyByaWdodCwgYnV0IHRoZSBuYW1lIHN0dWNrLgorCitBdCB0aGUgc2FtZSB0aW1lLCBSZWFkeSBTeXN0ZW1zIHdhbnRlZCBtdWNoIHRoZSBzYW1lIHRoaW5nLCBidXQgZm9yCitkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0czogSUVFRS02OTUsIE9hc3lzLCBTcmVjb3JkcywgYS5vdXQgYW5kIDY4aworY29mZi4KKworQkZEIHdhcyBmaXJzdCBpbXBsZW1lbnRlZCBieSBtZW1iZXJzIG9mIEN5Z251cyBTdXBwb3J0OyBTdGV2ZQorQ2hhbWJlcmxhaW4gKEBjb2Rle3NhY0BAY3lnbnVzLmNvbX0pLCBKb2huIEdpbG1vcmUKKyhAY29kZXtnbnVAQGN5Z251cy5jb219KSwgSy4gIFJpY2hhcmQgUGl4bGV5IChAY29kZXtyaWNoQEBjeWdudXMuY29tfSkKK2FuZCBEYXZpZCBIZW5rZWwtV2FsbGFjZSAoQGNvZGV7Z3VtYnlAQGN5Z251cy5jb219KS4KKworCisKK0Bub2RlIEhvdyBJdCBXb3JrcywgV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbywgSGlzdG9yeSwgT3ZlcnZpZXcKK0BzZWN0aW9uIEhvdyBUbyBVc2UgQkZECisKK1RvIHVzZSB0aGUgbGlicmFyeSwgaW5jbHVkZSBAZmlsZXtiZmQuaH0gYW5kIGxpbmsgd2l0aCBAZmlsZXtsaWJiZmQuYX0uCQorCitCRkQgcHJvdmlkZXMgYSBjb21tb24gaW50ZXJmYWNlIHRvIHRoZSBwYXJ0cyBvZiBhbiBvYmplY3QgZmlsZQorZm9yIGEgY2FsbGluZyBhcHBsaWNhdGlvbi4gCisKK1doZW4gYW4gYXBwbGljYXRpb24gc3VjZXNzZnVsbHkgb3BlbnMgYSB0YXJnZXQgZmlsZSAob2JqZWN0LCBhcmNoaXZlLCBvcgord2hhdGV2ZXIpLCBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgc3RydWN0dXJlIGlzIHJldHVybmVkLiBUaGlzIHBvaW50ZXIKK3BvaW50cyB0byBhIHN0cnVjdHVyZSBjYWxsZWQgQGNvZGV7YmZkfSwgZGVzY3JpYmVkIGluCitAZmlsZXtiZmQuaH0uICBPdXIgY29udmVudGlvbiBpcyB0byBjYWxsIHRoaXMgcG9pbnRlciBhIEJGRCwgYW5kCitpbnN0YW5jZXMgb2YgaXQgd2l0aGluIGNvZGUgQGNvZGV7YWJmZH0uICBBbGwgb3BlcmF0aW9ucyBvbgordGhlIHRhcmdldCBvYmplY3QgZmlsZSBhcmUgYXBwbGllZCBhcyBtZXRob2RzIHRvIHRoZSBCRkQuICBUaGUgbWFwcGluZyBpcworZGVmaW5lZCB3aXRoaW4gQGNvZGV7YmZkLmh9IGluIGEgc2V0IG9mIG1hY3JvcywgYWxsIGJlZ2lubmluZword2l0aCBAc2FtcHtiZmRffSB0byByZWR1Y2UgbmFtZXNwYWNlIHBvbGx1dGlvbi4KKworRm9yIGV4YW1wbGUsIHRoaXMgc2VxdWVuY2UgZG9lcyB3aGF0IHlvdSB3b3VsZCBwcm9iYWJseSBleHBlY3Q6CityZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0aW9ucyBpbiBhbiBvYmplY3QgZmlsZSBhdHRhY2hlZCB0byBhIEJGRAorQGNvZGV7YWJmZH0uIAorCitAbGlzcAorQGMgQGNhcnRvdWNoZQorI2luY2x1ZGUgImJmZC5oIgorCit1bnNpZ25lZCBpbnQgbnVtYmVyX29mX3NlY3Rpb25zKGFiZmQpCitiZmQgKmFiZmQ7CitAeworICByZXR1cm4gYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpOworQH0KK0BjIEBlbmQgY2FydG91Y2hlCitAZW5kIGxpc3AKKworVGhlIGFic3RyYWN0aW9uIHVzZWQgd2l0aGluIEJGRCBpcyB0aGF0IGFuIG9iamVjdCBmaWxlIGhhczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK2EgaGVhZGVyLAorQGl0ZW0KK2EgbnVtYmVyIG9mIHNlY3Rpb25zIGNvbnRhaW5pbmcgcmF3IGRhdGEgKEBweHJlZntTZWN0aW9uc30pLAorQGl0ZW0KK2Egc2V0IG9mIHJlbG9jYXRpb25zIChAcHhyZWZ7UmVsb2NhdGlvbnN9KSwgYW5kCitAaXRlbQorc29tZSBzeW1ib2wgaW5mb3JtYXRpb24gKEBweHJlZntTeW1ib2xzfSkuCitAZW5kIGl0ZW1pemUKK0Bub2luZGVudAorQWxzbywgQkZEcyBvcGVuZWQgZm9yIGFyY2hpdmVzIGhhdmUgdGhlIGFkZGl0aW9uYWwgYXR0cmlidXRlIG9mIGFuIGluZGV4CithbmQgY29udGFpbiBzdWJvcmRpbmF0ZSBCRkRzLiBUaGlzIGFwcHJvYWNoIGlzIGZpbmUgZm9yIGEub3V0IGFuZCBjb2ZmLAorYnV0IGxvc2VzIGVmZmljaWVuY3kgd2hlbiBhcHBsaWVkIHRvIGZvcm1hdHMgc3VjaCBhcyBTLXJlY29yZHMgYW5kCitJRUVFLTY5NS4KKworQG5vZGUgV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbywgICwgSG93IEl0IFdvcmtzLCBPdmVydmlldworQHNlY3Rpb24gV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbworQGluY2x1ZGUgYmZkc3VtbS50ZXhpCisKK0Bub2RlIEJGRCBmcm9udCBlbmQsIEJGRCBiYWNrIGVuZHMsIE92ZXJ2aWV3LCBUb3AKK0BjaGFwdGVyIEJGRCBmcm9udCBlbmQKK0BpbmNsdWRlIGJmZHQudGV4aQorCitAbWVudQorKiBNZW1vcnkgVXNhZ2U6OgorKiBJbml0aWFsaXphdGlvbjo6CisqIFNlY3Rpb25zOjoKKyogU3ltYm9sczo6CisqIEFyY2hpdmVzOjoKKyogRm9ybWF0czo6CisqIFJlbG9jYXRpb25zOjoKKyogQ29yZSBGaWxlczo6CisqIFRhcmdldHM6OgorKiBBcmNoaXRlY3R1cmVzOjoKKyogT3BlbmluZyBhbmQgQ2xvc2luZzo6CisqIEludGVybmFsOjoKKyogRmlsZSBDYWNoaW5nOjoKKyogTGlua2VyIEZ1bmN0aW9uczo6CisqIEhhc2ggVGFibGVzOjoKK0BlbmQgbWVudQorCitAbm9kZSBNZW1vcnkgVXNhZ2UsIEluaXRpYWxpemF0aW9uLCBCRkQgZnJvbnQgZW5kLCBCRkQgZnJvbnQgZW5kCitAc2VjdGlvbiBNZW1vcnkgdXNhZ2UKK0JGRCBrZWVwcyBhbGwgb2YgaXRzIGludGVybmFsIHN0cnVjdHVyZXMgaW4gb2JzdGFja3MuIFRoZXJlIGlzIG9uZSBvYnN0YWNrCitwZXIgb3BlbiBCRkQgZmlsZSwgaW50byB3aGljaCB0aGUgY3VycmVudCBzdGF0ZSBpcyBzdG9yZWQuIFdoZW4gYSBCRkQgaXMKK2Nsb3NlZCwgdGhlIG9ic3RhY2sgaXMgZGVsZXRlZCwgYW5kIHNvIGV2ZXJ5dGhpbmcgd2hpY2ggaGFzIGJlZW4KK2FsbG9jYXRlZCBieSBCRkQgZm9yIHRoZSBjbG9zaW5nIGZpbGUgaXMgdGhyb3duIGF3YXkuCisKK0JGRCBkb2VzIG5vdCBmcmVlIGFueXRoaW5nIGNyZWF0ZWQgYnkgYW4gYXBwbGljYXRpb24sIGJ1dCBwb2ludGVycyBpbnRvCitAY29kZXtiZmR9IHN0cnVjdHVyZXMgYmVjb21lIGludmFsaWQgb24gYSBAY29kZXtiZmRfY2xvc2V9OyBmb3IgZXhhbXBsZSwKK2FmdGVyIGEgQGNvZGV7YmZkX2Nsb3NlfSB0aGUgdmVjdG9yIHBhc3NlZCB0bworQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9IGlzIHN0aWxsIGFyb3VuZCwgc2luY2UgaXQgaGFzIGJlZW4KK2FsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCB0aGUgZGF0YSB0aGF0IGl0IHBvaW50ZWQgdG8gYXJlCitsb3N0LgorCitUaGUgZ2VuZXJhbCBydWxlIGlzIHRvIG5vdCBjbG9zZSBhIEJGRCB1bnRpbCBhbGwgb3BlcmF0aW9ucyBkZXBlbmRlbnQKK3Vwb24gZGF0YSBmcm9tIHRoZSBCRkQgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgb3IgYWxsIHRoZSBkYXRhIGZyb20gd2l0aGluCit0aGUgZmlsZSBoYXMgYmVlbiBjb3BpZWQuIFRvIGhlbHAgd2l0aCB0aGUgbWFuYWdlbWVudCBvZiBtZW1vcnksIHRoZXJlCitpcyBhIGZ1bmN0aW9uIChAY29kZXtiZmRfYWxsb2Nfc2l6ZX0pIHdoaWNoIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworaW4gb2JzdGFja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdXBwbGllZCBCRkQuIFRoaXMgY291bGQgYmUgdXNlZCB0bworc2VsZWN0IHRoZSBncmVlZGllc3Qgb3BlbiBCRkQsIGNsb3NlIGl0IHRvIHJlY2xhaW0gdGhlIG1lbW9yeSwgcGVyZm9ybQorc29tZSBvcGVyYXRpb24gYW5kIHJlb3BlbiB0aGUgQkZEIGFnYWluLCB0byBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhCitzdHJ1Y3R1cmVzLgorCitAbm9kZSBJbml0aWFsaXphdGlvbiwgU2VjdGlvbnMsIE1lbW9yeSBVc2FnZSwgQkZEIGZyb250IGVuZAorQGluY2x1ZGUgIGluaXQudGV4aQorCitAbm9kZSBTZWN0aW9ucywgU3ltYm9scywgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQKK0BpbmNsdWRlICBzZWN0aW9uLnRleGkKKworQG5vZGUgU3ltYm9scywgQXJjaGl2ZXMsIFNlY3Rpb25zLCBCRkQgZnJvbnQgZW5kCitAaW5jbHVkZSAgc3ltcy50ZXhpCisKK0Bub2RlIEFyY2hpdmVzLCBGb3JtYXRzLCBTeW1ib2xzLCBCRkQgZnJvbnQgZW5kCitAaW5jbHVkZSAgYXJjaGl2ZS50ZXhpCisKK0Bub2RlIEZvcm1hdHMsIFJlbG9jYXRpb25zLCBBcmNoaXZlcywgQkZEIGZyb250IGVuZAorQGluY2x1ZGUgIGZvcm1hdC50ZXhpCisKK0Bub2RlIFJlbG9jYXRpb25zLCBDb3JlIEZpbGVzLCBGb3JtYXRzLCBCRkQgZnJvbnQgZW5kCitAaW5jbHVkZSAgcmVsb2MudGV4aQorCitAbm9kZSBDb3JlIEZpbGVzLCBUYXJnZXRzLCBSZWxvY2F0aW9ucywgQkZEIGZyb250IGVuZAorQGluY2x1ZGUgIGNvcmUudGV4aQorCitAbm9kZSBUYXJnZXRzLCBBcmNoaXRlY3R1cmVzLCBDb3JlIEZpbGVzLCBCRkQgZnJvbnQgZW5kCitAaW5jbHVkZSAgdGFyZ2V0cy50ZXhpCisKK0Bub2RlIEFyY2hpdGVjdHVyZXMsIE9wZW5pbmcgYW5kIENsb3NpbmcsIFRhcmdldHMsIEJGRCBmcm9udCBlbmQKK0BpbmNsdWRlICBhcmNodXJlcy50ZXhpCisKK0Bub2RlIE9wZW5pbmcgYW5kIENsb3NpbmcsIEludGVybmFsLCBBcmNoaXRlY3R1cmVzLCBCRkQgZnJvbnQgZW5kCitAaW5jbHVkZSAgb3BuY2xzLnRleGkKKworQG5vZGUgSW50ZXJuYWwsIEZpbGUgQ2FjaGluZywgT3BlbmluZyBhbmQgQ2xvc2luZywgQkZEIGZyb250IGVuZAorQGluY2x1ZGUgIGxpYmJmZC50ZXhpCisKK0Bub2RlIEZpbGUgQ2FjaGluZywgTGlua2VyIEZ1bmN0aW9ucywgSW50ZXJuYWwsIEJGRCBmcm9udCBlbmQKK0BpbmNsdWRlICBjYWNoZS50ZXhpCisKK0Bub2RlIExpbmtlciBGdW5jdGlvbnMsIEhhc2ggVGFibGVzLCBGaWxlIENhY2hpbmcsIEJGRCBmcm9udCBlbmQKK0BpbmNsdWRlICBsaW5rZXIudGV4aQorCitAbm9kZSBIYXNoIFRhYmxlcywgLCBMaW5rZXIgRnVuY3Rpb25zLCBCRkQgZnJvbnQgZW5kCitAaW5jbHVkZSAgaGFzaC50ZXhpCisKK0Bub2RlIEJGRCBiYWNrIGVuZHMsIEluZGV4LCBCRkQgZnJvbnQgZW5kLCBUb3AKK0BjaGFwdGVyIEJGRCBiYWNrIGVuZHMKK0BtZW51CisqIFdoYXQgdG8gUHV0IFdoZXJlOjoKKyogYW91dCA6OglhLm91dCBiYWNrZW5kcworKiBjb2ZmIDo6CWNvZmYgYmFja2VuZHMKKyogZWxmICA6OgllbGYgYmFja2VuZHMKK0BpZ25vcmUKKyogb2FzeXMgOjoJb2FzeXMgYmFja2VuZHMKKyogaWVlZSA6OglpZWVlIGJhY2tlbmQKKyogc3JlY29yZCA6OglzLXJlY29yZCBiYWNrZW5kCitAZW5kIGlnbm9yZQorQGVuZCBtZW51CitAbm9kZSBXaGF0IHRvIFB1dCBXaGVyZSwgYW91dCwgQkZEIGJhY2sgZW5kcywgQkZEIGJhY2sgZW5kcworQWxsIG9mIEJGRCBsaXZlcyBpbiBvbmUgZGlyZWN0b3J5LgorCitAbm9kZSBhb3V0LCBjb2ZmLCBXaGF0IHRvIFB1dCBXaGVyZSwgQkZEIGJhY2sgZW5kcworQGluY2x1ZGUgIGFvdXR4LnRleGkKKworQG5vZGUgY29mZiwgZWxmLCBhb3V0LCBCRkQgYmFjayBlbmRzCitAaW5jbHVkZSAgY29mZmNvZGUudGV4aQorCitAbm9kZSBlbGYsICAsIGNvZmYsIEJGRCBiYWNrIGVuZHMKK0BpbmNsdWRlICBlbGYudGV4aQorQGMgTGVhdmUgdGhpcyBvdXQgdW50aWwgdGhlIGZpbGUgaGFzIHNvbWUgYWN0dWFsIGNvbnRlbnRzLi4uCitAYyBAaW5jbHVkZSAgZWxmY29kZS50ZXhpCisKK0Bub2RlIEluZGV4LCAgLCBCRkQgYmFjayBlbmRzICwgVG9wCitAdW5udW1iZXJlZCBJbmRleAorQHByaW50aW5kZXggY3AKKworQHRleAorJSBJIHRoaW5rIHNvbWV0aGluZyBsaWtlIEBjb2xvcGhvbiBzaG91bGQgYmUgaW4gdGV4aW5mby4gIEluIHRoZQorJSBtZWFudGltZToKK1xsb25nXGRlZlxjb2xvcGhvbntcaGJveCB0bzBwdHt9XHZmaWxsCitcY2VudGVybGluZXtUaGUgYm9keSBvZiB0aGlzIG1hbnVhbCBpcyBzZXQgaW59CitcY2VudGVybGluZXtcZm9udG5hbWVcdGVucm0sfQorXGNlbnRlcmxpbmV7d2l0aCBoZWFkaW5ncyBpbiB7XGJmXGZvbnRuYW1lXHRlbmJmfX0KK1xjZW50ZXJsaW5le2FuZCBleGFtcGxlcyBpbiB7XHR0XGZvbnRuYW1lXHRlbnR0fS59CitcY2VudGVybGluZXt7XGl0XGZvbnRuYW1lXHRlbml0XC99IGFuZH0KK1xjZW50ZXJsaW5le3tcc2xcZm9udG5hbWVcdGVuc2xcL319CitcY2VudGVybGluZXthcmUgdXNlZCBmb3IgZW1waGFzaXMufVx2ZmlsbH0KK1xwYWdlXGNvbG9waG9uCislIEJsYW1lOiBkb2NAY3lnbnVzLmNvbSwgMjhtYXI5MS4KK0BlbmQgdGV4CisKK0Bjb250ZW50cworQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRpbnQudGV4aSBiL2JmZC9kb2MvYmZkaW50LnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwOWIzNAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9kb2MvYmZkaW50LnRleGkKQEAgLTAsMCArMSwxODg1IEBACitcaW5wdXQgdGV4aW5mbworQHNldGZpbGVuYW1lIGJmZGludC5pbmZvCisKK0BzZXR0aXRsZSBCRkQgSW50ZXJuYWxzCitAaWZ0ZXgKK0B0aXRsZXBhZ2UKK0B0aXRsZXtCRkQgSW50ZXJuYWxzfQorQGF1dGhvcntJYW4gTGFuY2UgVGF5bG9yfQorQGF1dGhvcntDeWdudXMgU29sdXRpb25zfQorQHBhZ2UKK0BlbmQgaWZ0ZXgKKworQG5vZGUgVG9wCitAdG9wIEJGRCBJbnRlcm5hbHMKK0ByYWlzZXNlY3Rpb25zCitAY2luZGV4IGJmZCBpbnRlcm5hbHMKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc29tZSBCRkQgaW50ZXJuYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCitoZWxwZnVsIHdoZW4gd29ya2luZyBvbiBCRkQuICBJdCBpcyB2ZXJ5IGluY29tcGxldGUuCisKK1RoaXMgZG9jdW1lbnQgaXMgbm90IHVwZGF0ZWQgcmVndWxhcmx5LCBhbmQgbWF5IGJlIG91dCBvZiBkYXRlLiAgSXQgd2FzCitsYXN0IG1vZGlmaWVkIG9uICREYXRlJC4KKworVGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IKK0BlbWFpbHtpYW5AQGN5Z251cy5jb219LgorCitAbWVudQorKiBCRkQgb3ZlcnZpZXc6OgkJQkZEIG92ZXJ2aWV3CisqIEJGRCBndWlkZWxpbmVzOjoJCUJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCisqIEJGRCB0YXJnZXQgdmVjdG9yOjoJCUJGRCB0YXJnZXQgdmVjdG9yCisqIEJGRCBnZW5lcmF0ZWQgZmlsZXM6OgkJQkZEIGdlbmVyYXRlZCBmaWxlcworKiBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zOjoJRmlsZXMgY29tcGlsZWQgbXVsdGlwbGUgdGltZXMgaW4gQkZECisqIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nOjoJQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKKyogQkZEIEVMRiBzdXBwb3J0OjoJCUJGRCBFTEYgc3VwcG9ydAorKiBCRkQgZ2xvc3Nhcnk6OgkJR2xvc3NhcnkKKyogSW5kZXg6OgkJCUluZGV4CitAZW5kIG1lbnUKKworQG5vZGUgQkZEIG92ZXJ2aWV3CitAc2VjdGlvbiBCRkQgb3ZlcnZpZXcKKworQkZEIGlzIGEgbGlicmFyeSB3aGljaCBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUKK29iamVjdCBmaWxlcywgZXhlY3V0YWJsZXMsIGFyY2hpdmUgZmlsZXMsIGFuZCBjb3JlIGZpbGVzIGluIGFueSBmb3JtYXQuCisKK0BtZW51CisqIEJGRCBsaWJyYXJ5IGludGVyZmFjZXM6OglCRkQgbGlicmFyeSBpbnRlcmZhY2VzCisqIEJGRCBsaWJyYXJ5IHVzZXJzOjoJCUJGRCBsaWJyYXJ5IHVzZXJzCisqIEJGRCB2aWV3OjoJCQlUaGUgQkZEIHZpZXcgb2YgYSBmaWxlCisqIEJGRCBibGluZG5lc3M6OgkJQkZEIGxvc2VzIGluZm9ybWF0aW9uCitAZW5kIG1lbnUKKworQG5vZGUgQkZEIGxpYnJhcnkgaW50ZXJmYWNlcworQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgaW50ZXJmYWNlcworCitPbmUgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIGZvdXIgcGFydHMgYnkKK3R5cGUgb2YgaW50ZXJmYWNlLgorCitUaGUgZmlyc3QgaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgZ2VuZXJpYyBmdW5jdGlvbnMgd2hpY2ggcHJvZ3JhbXMgdXNpbmcKK3RoZSBCRkQgbGlicmFyeSB3aWxsIGNhbGwuICBUaGVzZSBnZW5lcmljIGZ1bmN0aW9uIG5vcm1hbGx5IHRyYW5zbGF0ZQorZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnRvIGNhbGxzIHRvIHJvdXRpbmVzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBhCitwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIE1hbnkgb2YgdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMgYXJlCithY3R1YWxseSBkZWZpbmVkIGFzIG1hY3JvcyBpbiBAZmlsZXtiZmQuaH0uICBUaGVzZSBmdW5jdGlvbnMgY29tcHJpc2UKK3RoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgorCitUaGUgc2Vjb25kIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIHRhcmdldAordmVjdG9ycy4gIFRoaXMgaXMgdGhlIGJ1bGsgb2YgdGhlIGNvZGUgaW4gQkZELiAgQSB0YXJnZXQgdmVjdG9yIGlzIGEgc2V0CitvZiBmdW5jdGlvbiBwb2ludGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCit0YXJnZXQgdmVjdG9yIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBnZW5lcmljIEJGRCBmdW5jdGlvbnMuICBUaGVzZQorZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2ggdGhlIHRhcmdldCB2ZWN0b3IsIGFuZCBhcmUgbmV2ZXIKK2NhbGxlZCBkaXJlY3RseS4gIFRoZSB0YXJnZXQgdmVjdG9yIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gQHJlZntCRkQKK3RhcmdldCB2ZWN0b3J9LiAgVGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhcgordGFyZ2V0IHZlY3RvciBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIEJGRCBiYWNrZW5kLgorCitUaGUgdGhpcmQgaW50ZXJmYWNlIGlzIGEgc2V0IG9mIG9kZGJhbGwgZnVuY3Rpb25zIHdoaWNoIGFyZSB0eXBpY2FsbHkKK3NwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQsIGFyZSBub3QgZ2VuZXJpYyBmdW5jdGlvbnMsCithbmQgYXJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LiAgVGhlc2UgYXJlIHVzZWQgYXMgaG9va3MKK2J5IHRoZSBsaW5rZXIgYW5kIHRoZSBhc3NlbWJsZXIgd2hlbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0CityZXF1aXJlcyBzb21lIGFjdGlvbiB3aGljaCB0aGUgQkZEIGdlbmVyaWMgaW50ZXJmYWNlIGRvZXMgbm90IHByb3ZpZGUuCitUaGVzZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBkZWNsYXJlZCBpbiBAZmlsZXtiZmQuaH0sIGJ1dCBpbiBtYW55CitjYXNlcyB0aGV5IGFyZSBvbmx5IHByb3ZpZGVkIHdoZW4gQkZEIGlzIGNvbmZpZ3VyZWQgd2l0aCBzdXBwb3J0IGZvciBhCitwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZXNlIGZ1bmN0aW9ucyBsaXZlIGluIGEgZ3JleSBhcmVhLCBhbmQKK2FyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UuCisKK1RoZSBmb3VydGggaW50ZXJmYWNlIGlzIHRoZSBzZXQgb2YgQkZEIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQorY2FsbGVkIGJ5IHRoZSBvdGhlciBCRkQgZnVuY3Rpb25zLiAgVGhlc2UgbWFuYWdlIGlzc3VlcyBsaWtlIG1lbW9yeQorYWxsb2NhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGZpbGUgYWNjZXNzLCBoYXNoIHRhYmxlcywgc3dhcHBpbmcsIGFuZCB0aGUKK2xpa2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5ldmVyIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgorCitAbm9kZSBCRkQgbGlicmFyeSB1c2VycworQHN1YnNlY3Rpb24gQkZEIGxpYnJhcnkgdXNlcnMKKworQW5vdGhlciB3YXkgdG8gbG9vayBhdCB0aGUgQkZEIGxpYnJhcnkgaXMgdG8gZGl2aWRlIGl0IGludG8gdGhyZWUgcGFydHMKK2J5IHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZC4KKworVGhlIGZpcnN0IHVzZSBpcyB0byByZWFkIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHJlYWRlcnMgYXJlCitwcm9ncmFtcyBsaWtlIEBzYW1we2dkYn0sIEBzYW1we25tfSwgQHNhbXB7b2JqZHVtcH0sIGFuZCBAc2FtcHtvYmpjb3B5fS4KK1RoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8gdmlldyBhbiBvYmplY3QgZmlsZSBpbiBhIGdlbmVyaWMgZm9ybS4gIFRoZQorb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpcyBub3JtYWxseSBmdWxseSBhZGVxdWF0ZSBmb3IgdGhlc2UgcHJvZ3JhbXMuCisKK1RoZSBzZWNvbmQgdXNlIGlzIHRvIHdyaXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9iamVjdCBmaWxlIHdyaXRlcnMgYXJlCitwcm9ncmFtcyBsaWtlIEBzYW1we2dhc30gYW5kIEBzYW1we29iamNvcHl9LiAgVGhlc2UgcHJvZ3JhbXMgdXNlIEJGRCB0bworY3JlYXRlIGFuIG9iamVjdCBmaWxlLiAgVGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgYWRlcXVhdGUKK2ZvciB0aGVzZSBwcm9ncmFtcywgYnV0IGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGFzc2VtYmxlciBuZWVkcworc29tZSBhZGRpdGlvbmFsIGhvb2tzIGluIG9yZGVyIHRvIHNldCBwYXJ0aWN1bGFyIGZsYWdzIG9yIG90aGVyCitpbmZvcm1hdGlvbi4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBjb3B5Citwcml2YXRlIGluZm9ybWF0aW9uIGZyb20gb25lIG9iamVjdCBmaWxlIHRvIGFub3RoZXIsIGFuZCB0aGVzZSBmdW5jdGlvbnMKK2FyZSB1c2VkIGJ5IEBzYW1we29iamNvcHl9IHRvIGF2b2lkIGluZm9ybWF0aW9uIGxvc3MuCisKK1RoZSB0aGlyZCB1c2UgaXMgdG8gbGluayBvYmplY3QgZmlsZXMuICBUaGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgZmlsZQorbGlua2VyLCBAc2FtcHtsZH0uICBPcmlnaW5hbGx5LCBAc2FtcHtsZH0gd2FzIGFuIG9iamVjdCBmaWxlIHJlYWRlciBhbmQKK2FuIG9iamVjdCBmaWxlIHdyaXRlciwgYW5kIGl0IGRpZCB0aGUgbGluayBvcGVyYXRpb24gdXNpbmcgdGhlIGdlbmVyaWMKK0JGRCBzdHJ1Y3R1cmVzLiAgSG93ZXZlciwgdGhpcyB0dXJuZWQgb3V0IHRvIGJlIHRvbyBzbG93IGFuZCB0b28gbWVtb3J5CitpbnRlbnNpdmUuCisKK1RoZSBvZmZpY2lhbCBCRkQgbGlua2VyIGZ1bmN0aW9ucyB3ZXJlIHdyaXR0ZW4gdG8gcGVybWl0IHNwZWNpZmljIEJGRAorYmFja2VuZHMgdG8gcGVyZm9ybSB0aGUgbGluayB3aXRob3V0IHRyYW5zbGF0aW5nIHRocm91Z2ggdGhlIGdlbmVyaWMKK3N0cnVjdHVyZXMsIGluIHRoZSBub3JtYWwgY2FzZSB3aGVyZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBvdXRwdXQgZmlsZQoraGF2ZSB0aGUgc2FtZSBvYmplY3QgZmlsZSBmb3JtYXQuICBOb3QgYWxsIG9mIHRoZSBiYWNrZW5kcyBjdXJyZW50bHkKK2ltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZSwgYW5kIHRoZXJlIGFyZSBkZWZhdWx0IGxpbmtpbmcgZnVuY3Rpb25zCit3aXRoaW4gQkZEIHdoaWNoIHVzZSB0aGUgZ2VuZXJpYyBzdHJ1Y3R1cmVzIGFuZCB3aGljaCB3b3JrIHdpdGggYWxsCitiYWNrZW5kcy4KKworRm9yIHNldmVyYWwgb2JqZWN0IGZpbGUgZm9ybWF0cyB0aGUgbGlua2VyIG5lZWRzIGFkZGl0aW9uYWwgaG9va3Mgd2hpY2gKK2FyZSBub3QgcHJvdmlkZWQgYnkgdGhlIG9mZmljaWFsIEJGRCBpbnRlcmZhY2UsIHBhcnRpY3VsYXJseSBmb3IgZHluYW1pYworbGlua2luZyBzdXBwb3J0LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGxpbmtlcgorZW11bGF0aW9uIHRlbXBsYXRlLgorCitAbm9kZSBCRkQgdmlldworQHN1YnNlY3Rpb24gVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQorCitCRkQgdXNlcyBnZW5lcmljIHN0cnVjdHVyZXMgdG8gbWFuYWdlIGluZm9ybWF0aW9uLiAgSXQgdHJhbnNsYXRlcyBkYXRhCitpbnRvIHRoZSBnZW5lcmljIGZvcm0gd2hlbiByZWFkaW5nIGZpbGVzLCBhbmQgb3V0IG9mIHRoZSBnZW5lcmljIGZvcm0KK3doZW4gd3JpdGluZyBmaWxlcy4KKworQkZEIGRlc2NyaWJlcyBhIGZpbGUgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHtiZmR9IHR5cGUuICBBIEBzYW1we2JmZH0KK2lzIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuICBUaGUgQkZEIGluZm9ybWF0aW9uIGNhbiBiZQorZGlzcGxheWVkIHVzaW5nIHRoZSBAc2FtcHtvYmpkdW1wfSBwcm9ncmFtIHdpdGggdmFyaW91cyBvcHRpb25zLgorCitAdGFibGUgQGFzaXMKK0BpdGVtIGdlbmVyYWwgaW5mb3JtYXRpb24KK1RoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGEgZmV3IGdlbmVyYWwgZmxhZ3MsIHRoZSBzdGFydCBhZGRyZXNzLgorQGl0ZW0gYXJjaGl0ZWN0dXJlCitUaGUgYXJjaGl0ZWN0dXJlLCBpbmNsdWRpbmcgYm90aCBhIGdlbmVyYWwgcHJvY2Vzc29yIHR5cGUgKG02OGssIE1JUFMKK2V0Yy4pIGFuZCBhIHNwZWNpZmljIG1hY2hpbmUgbnVtYmVyIChtNjgwMDAsIFI0MDAwLCBldGMuKS4KK0BpdGVtIHNlY3Rpb25zCitBIGxpc3Qgb2Ygc2VjdGlvbnMuCitAaXRlbSBzeW1ib2xzCitBIHN5bWJvbCB0YWJsZS4KK0BlbmQgdGFibGUKKworQkZEIHJlcHJlc2VudHMgYSBzZWN0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXNlY3Rpb259IHR5cGUuICBFYWNoCitzZWN0aW9uIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMgYWxzbyBoYXZlIGFuIGFzc29jaWF0ZWQKK2Jsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgU2VjdGlvbnMgYWxzbyBoYXZlCithc3NvY2lhdGVkIGZsYWdzLCBhIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MsIGEgbG9hZCBtZW1vcnkgYWRkcmVzcywgYQorcmVxdWlyZWQgYWxpZ25tZW50LCBhIGxpc3Qgb2YgcmVsb2NhdGlvbnMsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCitpbmZvcm1hdGlvbi4KKworQkZEIHJlcHJlc2VudHMgYSByZWxvY2F0aW9uIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXJlbGVudH0gdHlwZS4gIEEKK3JlbG9jYXRpb24gZGVzY3JpYmVzIGFuIGFjdGlvbiB3aGljaCB0aGUgbGlua2VyIG11c3QgdGFrZSB0byBtb2RpZnkgdGhlCitzZWN0aW9uIGNvbnRlbnRzLiAgUmVsb2NhdGlvbnMgaGF2ZSBhIHN5bWJvbCwgYW4gYWRkcmVzcywgYW4gYWRkZW5kLCBhbmQKK2EgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgaG93IHRvIHBlcmZvcm0gdGhlCityZWxvY2F0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KKworQkZEIHJlcHJlc2VudHMgYSBzeW1ib2wgYXMgYSBwb2ludGVyIHRvIHRoZSBAc2FtcHthc3ltYm9sfSB0eXBlLiAgQQorc3ltYm9sIGhhcyBhIG5hbWUsIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuIG9mZnNldCB3aXRoaW4gdGhhdAorc2VjdGlvbiwgYW5kIHNvbWUgZmxhZ3MuCisKK0FyY2hpdmUgZmlsZXMgZG8gbm90IGhhdmUgYW55IHNlY3Rpb25zIG9yIHN5bWJvbHMuICBJbnN0ZWFkLCBCRkQKK3JlcHJlc2VudHMgYW4gYXJjaGl2ZSBmaWxlIGFzIGEgZmlsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YKK0BzYW1we2JmZH1zLiAgQkZEIGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAsIGFzIGEKK2xpc3Qgb2Ygc3ltYm9sIG5hbWVzLiAgQkZEIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBAc2FtcHtiZmR9Cit3aXRoaW4gdGhlIGFyY2hpdmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGVudHJ5IGluIHRoZQorYXJjaGl2ZSBzeW1ib2wgbWFwLgorCitAbm9kZSBCRkQgYmxpbmRuZXNzCitAc3Vic2VjdGlvbiBCRkQgbG9zZXMgaW5mb3JtYXRpb24KKworTW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzIGhhdmUgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50IGluCitpdHMgZ2VuZXJpYyBmb3JtLCBhdCBsZWFzdCBhcyBjdXJyZW50bHkgZGVmaW5lZC4KKworVGhlcmUgaXMgb2Z0ZW4gZXhwbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QgcmVwcmVzZW50LiAgRm9yCitleGFtcGxlLCB0aGUgQ09GRiB2ZXJzaW9uIHN0YW1wLCBvciB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMuICBCRkQKK3Byb3ZpZGVzIHNwZWNpYWwgaG9va3MgdG8gaGFuZGxlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjb3B5aW5nLAorcHJpbnRpbmcsIG9yIGxpbmtpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGUgQkZEIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhcgorb2JqZWN0IGZpbGUgZm9ybWF0IHdpbGwgbm9ybWFsbHkgc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBpbiBwcml2YXRlIGRhdGEKK2FuZCBoYW5kbGUgaXQgdXNpbmcgdGhlIHNwZWNpYWwgaG9va3MuCisKK0luIHNvbWUgY2FzZXMgdGhlcmUgaXMgYWxzbyBpbXBsaWNpdCBpbmZvcm1hdGlvbiB3aGljaCBCRkQgY2FuIG5vdAorcmVwcmVzZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIHByb2Nlc3NvciBkaXN0aW5ndWlzaGVzIHNtYWxsIGFuZAorbGFyZ2Ugc3ltYm9scywgYW5kIHJlcXVpcmVzIHRoYXQgYWxsIHNtYWxsIHN5bWJscyBiZSB3aXRoaW4gMzJLIG9mIHRoZQorR1AgcmVnaXN0ZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE1JUFMgYXNzZW1ibGVyIG11c3QgYmUgYWJsZSB0byBtYXJrCit2YXJpYWJsZXMgYXMgZWl0aGVyIHNtYWxsIG9yIGxhcmdlLCBhbmQgdGhlIE1JUFMgbGlua2VyIG11c3Qga25vdyB0byBwdXQKK3NtYWxsIHN5bWJvbHMgd2l0aGluIHJhbmdlIG9mIHRoZSBHUCByZWdpc3Rlci4gIFNpbmNlIEJGRCBjYW4gbm90CityZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiwgdGhpcyBtZWFucyB0aGF0IHRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlcgorbXVzdCBoYXZlIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCitmb3JtYXQgd2hpY2ggaXMgb3V0c2lkZSBvZiB0aGUgQkZEIGxpYnJhcnkuCisKK1RoaXMgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbmRpY2F0ZXMgYXJlYXMgd2hlcmUgdGhlIEJGRCBwYXJhZGlnbSBicmVha3MKK2Rvd24uICBJdCBpcyBub3QgYWN0dWFsbHkgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSBteXJpYWQgZGlmZmVyZW5jZXMKK2Ftb25nIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNpbmcgYSBzaW5nbGUgZ2VuZXJpYyBpbnRlcmZhY2UsIGF0IGxlYXN0IG5vdAoraW4gdGhlIG1hbm5lciB3aGljaCBCRkQgZG9lcyBpdCB0b2RheS4KKworTmV2ZXJ0aGVsZXNzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGRlYWxpbmcKK3dpdGggb2JqZWN0IGZpbGVzLCBhbmQgcGFydGljdWxhciBwcm9ibGVtcyBjYXVzZWQgYnkgaW5mb3JtYXRpb24gbG9zcworY2FuIG5vcm1hbGx5IGJlIHNvbHZlZCB1c2luZyBzb21lIHNvcnQgb2YgcmVsYXRpdmVseSBjb25zdHJhaW5lZCBob29rCitpbnRvIHRoZSBsaWJyYXJ5LgorCisKKworQG5vZGUgQkZEIGd1aWRlbGluZXMKK0BzZWN0aW9uIEJGRCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCitAY2luZGV4IGJmZCBwcm9ncmFtbWluZyBndWlkZWxpbmVzCitAY2luZGV4IHByb2dyYW1taW5nIGd1aWRlbGluZXMgZm9yIGJmZAorQGNpbmRleCBndWlkZWxpbmVzLCBiZmQgcHJvZ3JhbW1pbmcKKworVGhlcmUgaXMgYSBsb3Qgb2YgcG9vcmx5IHdyaXR0ZW4gYW5kIGNvbmZ1c2luZyBjb2RlIGluIEJGRC4gIE5ldyBCRkQKK2NvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYSBoaWdoZXIgc3RhbmRhcmQuICBNZXJlbHkgYmVjYXVzZSBzb21lIEJGRAorY29kZSBpcyB3cml0dGVuIGluIGEgcGFydGljdWxhciBtYW5uZXIgZG9lcyBub3QgbWVhbiB0aGF0IHlvdSBzaG91bGQKK2VtdWxhdGUgaXQuCisKK0hlcmUgYXJlIHNvbWUgZ2VuZXJhbCBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0ZvbGxvdyB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCisKK0BpdGVtCitBdm9pZCBnbG9iYWwgdmFyaWFibGVzLiAgV2UgaWRlYWxseSB3YW50IEJGRCB0byBiZSBmdWxseSByZWVudHJhbnQsIHNvCit0aGF0IGl0IGNhbiBiZSB1c2VkIGluIG11bHRpcGxlIHRocmVhZHMuICBBbGwgdXNlcyBvZiBnbG9iYWwgb3Igc3RhdGljCit2YXJpYWJsZXMgaW50ZXJmZXJlIHdpdGggdGhhdC4gIEluaXRpYWxpemVkIGNvbnN0YW50IHZhcmlhYmxlcyBhcmUgT0ssCithbmQgdGhleSBzaG91bGQgYmUgZXhwbGljaXRseSBtYXJrZWQgd2l0aCBjb25zdC4gIEluc3RlYWQgb2YgZ2xvYmFsCit2YXJpYWJsZXMsIHVzZSBkYXRhIGF0dGFjaGVkIHRvIGEgQkZEIG9yIHRvIGEgbGlua2VyIGhhc2ggdGFibGUuCisKK0BpdGVtCitBbGwgZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBuYW1lcyB3aGljaCBzdGFydCB3aXRoCitAc2FtcHtiZmRffS4gIEFsbCBzdWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gc29tZSBoZWFkZXIgZmlsZSwKK3R5cGljYWxseSBAZmlsZXtiZmQuaH0uICBTZWUsIGZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBkZWNsYXJhdGlvbnMgbmVhcgordGhlIGVuZCBvZiBAZmlsZXtiZmQtaW4uaH0sIHdoaWNoIG1vc3RseSBkZWNsYXJlIGZ1bmN0aW9ucyByZXF1aXJlZCBieQorc3BlY2lmaWMgbGlua2VyIGVtdWxhdGlvbnMuCisKK0BpdGVtCitBbGwgZnVuY3Rpb25zIHdoaWNoIG5lZWQgdG8gYmUgdmlzaWJsZSBmcm9tIG9uZSBmaWxlIHRvIGFub3RoZXIgd2l0aGluCitCRkQsIGJ1dCBzaG91bGQgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiBCRkQsIHNob3VsZCBzdGFydCB3aXRoCitAc2FtcHtfYmZkX30uICBBbHRob3VnaCBleHRlcm5hbCBuYW1lcyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtffSBhcmUKK3Byb2hpYml0ZWQgYnkgdGhlIEFOU0kgc3RhbmRhcmQsIGluIHByYWN0aWNlIHRoaXMgdXNhZ2Ugd2lsbCBhbHdheXMKK3dvcmssIGFuZCBpdCBpcyByZXF1aXJlZCBieSB0aGUgR05VIGNvZGluZyBzdGFuZGFyZHMuCisKK0BpdGVtCitBbHdheXMgcmVtZW1iZXIgdGhhdCBwZW9wbGUgY2FuIGNvbXBpbGUgdXNpbmcgQHNhbXB7LS1lbmFibGUtdGFyZ2V0c30gdG8KK2J1aWxkIHNldmVyYWwsIG9yIGFsbCwgdGFyZ2V0cyBhdCBvbmNlLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBsaW5rCit0b2dldGhlciB0aGUgZmlsZXMgZm9yIGFsbCB0YXJnZXRzLgorCitAaXRlbQorQkZEIGNvZGUgc2hvdWxkIGNvbXBpbGUgd2l0aCBmZXcgb3Igbm8gd2FybmluZ3MgdXNpbmcgQHNhbXB7Z2NjIC1XYWxsfS4KK1NvbWUgd2FybmluZ3MgYXJlIE9LLCBsaWtlIHRoZSBhYnNlbmNlIG9mIGNlcnRhaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zCit3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgV2FybmluZ3MgYWJvdXQKK2FtYmlndW91cyBleHByZXNzaW9ucyBhbmQgdGhlIGxpa2Ugc2hvdWxkIGFsd2F5cyBiZSBmaXhlZC4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBCRkQgdGFyZ2V0IHZlY3RvcgorQHNlY3Rpb24gQkZEIHRhcmdldCB2ZWN0b3IKK0BjaW5kZXggYmZkIHRhcmdldCB2ZWN0b3IKK0BjaW5kZXggdGFyZ2V0IHZlY3RvciBpbiBiZmQKKworQkZEIHN1cHBvcnRzIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdHMgYnkgdXNpbmcgdGhlIEBkZm57dGFyZ2V0Cit2ZWN0b3J9LiAgVGhpcyBpcyBzaW1wbHkgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaW1wbGVtZW50CitiZWhhdmlvdXIgdGhhdCBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LgorCitJbiB0aGlzIHNlY3Rpb24gSSBsaXN0IGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgdGFyZ2V0IHZlY3RvciBhbmQKK2Rlc2NyaWJlIHdoYXQgdGhleSBkby4KKworQG1lbnUKKyogQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91czo6CU1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCisqIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXA6OgkJU3dhcHBpbmcgZnVuY3Rpb25zCisqIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdDo6CQlGb3JtYXQgdHlwZSBkZXBlbmRlbnQgZnVuY3Rpb25zCisqIEJGRF9KVU1QX1RBQkxFIG1hY3Jvczo6CQlCRkRfSlVNUF9UQUJMRSBtYWNyb3MKKyogQkZEIHRhcmdldCB2ZWN0b3IgZ2VuZXJpYzo6CQlHZW5lcmljIGZ1bmN0aW9ucworKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3B5OjoJCUNvcHkgZnVuY3Rpb25zCisqIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmU6OgkJQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCisqIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmU6OgkJQXJjaGl2ZSBmdW5jdGlvbnMKKyogQkZEIHRhcmdldCB2ZWN0b3Igc3ltYm9sczo6CQlTeW1ib2wgdGFibGUgZnVuY3Rpb25zCisqIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jczo6CQlSZWxvY2F0aW9uIHN1cHBvcnQKKyogQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGU6OgkJT3V0cHV0IGZ1bmN0aW9ucworKiBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rOjoJCUxpbmtlciBmdW5jdGlvbnMKKyogQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYzo6CQlEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZnVuY3Rpb25zCitAZW5kIG1lbnUKKworQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgbWlzY2VsbGFuZW91cworQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb25zdGFudHMKKworVGhlIHRhcmdldCB2ZWN0b3Igc3RhcnRzIHdpdGggYSBzZXQgb2YgY29uc3RhbnRzLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIG5hbWUKK1RoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nLiAgVGhpcyBpcworaG93IHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIGluIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0b29scyB3aGljaAordXNlIEJGRCwgc3VjaCBhcyB0aGUgQHNhbXB7LW9mb3JtYXR9IGxpbmtlciBvcHRpb24uCisKK0BpdGVtIGZsYXZvdXIKK0EgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0YXJnZXQuICBUaGUgZm9sbG93aW5nIGZsYXZvdXJzIGFyZQorY3VycmVudGx5IGRlZmluZWQ6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIKK1VuZGVmaW5lZCBvciB1bmtub3duLgorQGl0ZW0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKK2Eub3V0LgorQGl0ZW0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKK0NPRkYuCitAaXRlbSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKK0VDT0ZGLgorQGl0ZW0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorRUxGLgorQGl0ZW0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIKK0lFRUUtNjk1LgorQGl0ZW0gYmZkX3RhcmdldF9ubG1fZmxhdm91cgorTkxNLgorQGl0ZW0gYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyCitPQVNZUy4KK0BpdGVtIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIKK1Rla3Ryb25peCBoZXggZm9ybWF0LgorQGl0ZW0gYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIKK01vdG9yb2xhIFMtcmVjb3JkIGZvcm1hdC4KK0BpdGVtIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyCitJbnRlbCBoZXggZm9ybWF0LgorQGl0ZW0gYmZkX3RhcmdldF9zb21fZmxhdm91cgorU09NICh1c2VkIG9uIEhQL1VYKS4KK0BpdGVtIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyCitvczkwMDAuCitAaXRlbSBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIKK1ZFUlNBZG9zLgorQGl0ZW0gYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyCitNUy1ET1MuCitAaXRlbSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgorb3BlblZNUy4KK0BlbmQgdGFibGUKKworQGl0ZW0gYnl0ZW9yZGVyCitUaGUgYnl0ZSBvcmRlciBvZiBkYXRhIGluIHRoZSBvYmplY3QgZmlsZS4gIE9uZSBvZgorQHNhbXB7QkZEX0VORElBTl9CSUd9LCBAc2FtcHtCRkRfRU5ESUFOX0xJVFRMRX0sIG9yCitAc2FtcHtCRkRfRU5ESUFOX1VOS05PV059LiAgVGhlIGxhdHRlciB3b3VsZCBiZSB1c2VkIGZvciBhIGZvcm1hdCBzdWNoCithcyBTLXJlY29yZHMgd2hpY2ggZG8gbm90IHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhLgorCitAaXRlbSBoZWFkZXJfYnl0ZW9yZGVyCitUaGUgYnl0ZSBvcmRlciBvZiBoZWFkZXIgaW5mb3JtYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLiAgTm9ybWFsbHkgdGhlCitzYW1lIGFzIHRoZSBAc2FtcHtieXRlb3JkZXJ9IGZpZWxkLCBidXQgdGhlcmUgYXJlIGNlcnRhaW4gY2FzZXMgd2hlcmUgaXQKK21heSBiZSBkaWZmZXJlbnQuCisKK0BpdGVtIG9iamVjdF9mbGFncworRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgQkZEIHdpdGggdGhpcworZm9ybWF0LgorCitAaXRlbSBzZWN0aW9uX2ZsYWdzCitGbGFncyB3aGljaCBtYXkgYXBwZWFyIGluIHRoZSBAc2FtcHtmbGFnc30gZmllbGQgb2YgYSBzZWN0aW9uIHdpdGhpbiBhCitCRkQgd2l0aCB0aGlzIGZvcm1hdC4KKworQGl0ZW0gc3ltYm9sX2xlYWRpbmdfY2hhcgorQSBjaGFyYWN0ZXIgd2hpY2ggdGhlIEMgY29tcGlsZXIgbm9ybWFsbHkgcHV0cyBiZWZvcmUgYSBzeW1ib2wuICBGb3IKK2V4YW1wbGUsIGFuIGEub3V0IGNvbXBpbGVyIHdpbGwgdHlwaWNhbGx5IGdlbmVyYXRlIHRoZSBzeW1ib2wKK0BzYW1we19mb299IGZvciBhIGZ1bmN0aW9uIG5hbWVkIEBzYW1we2Zvb30gaW4gdGhlIEMgc291cmNlLCBpbiB3aGljaAorY2FzZSB0aGlzIGZpZWxkIHdvdWxkIGJlIEBzYW1we199LiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGFyYWN0ZXIsIHRoaXMKK2ZpZWxkIHdpbGwgYmUgQHNhbXB7MH0uCisKK0BpdGVtIGFyX3BhZF9jaGFyCitUaGUgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdXNlIGF0IHRoZSBlbmQgb2YgYW4gYXJjaGl2ZSBuYW1lLiAgTm9ybWFsbHkKK0BzYW1wey99LgorCitAaXRlbSBhcl9tYXhfbmFtZWxlbgorVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2hvcnQgbmFtZSBpbiBhbiBhcmNoaXZlLiAgTm9ybWFsbHkgQHNhbXB7MTR9LgorCitAaXRlbSBiYWNrZW5kX2RhdGEKK0EgcG9pbnRlciB0byBjb25zdGFudCBiYWNrZW5kIGRhdGEuICBUaGlzIGlzIHVzZWQgYnkgYmFja2VuZHMgdG8gc3RvcmUKK3doYXRldmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhleSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHNpbWlsYXIgdGFyZ2V0Cit2ZWN0b3JzIHdoaWNoIHVzZSB0aGUgc2FtZSBzZXRzIG9mIGZ1bmN0aW9ucy4KK0BlbmQgdGFibGUKKworQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igc3dhcAorQHN1YnNlY3Rpb24gU3dhcHBpbmcgZnVuY3Rpb25zCisKK0V2ZXJ5IHRhcmdldCB2ZWN0b3IgaGFzIGZ1Y3Rpb24gcG9pbnRlcnMgdXNlZCBmb3Igc3dhcHBpbmcgaW5mb3JtYXRpb24KK2luIGFuZCBvdXQgb2YgdGhlIHRhcmdldCByZXByZXNlbnRhdGlvbi4gIFRoZXJlIGFyZSB0d28gc2V0cyBvZgorZnVuY3Rpb25zOiBvbmUgZm9yIGRhdGEgaW5mb3JtYXRpb24sIGFuZCBvbmUgZm9yIGhlYWRlciBpbmZvcm1hdGlvbi4KK0VhY2ggc2V0IGhhcyB0aHJlZSBzaXplczogNjQtYml0LCAzMi1iaXQsIGFuZCAxNi1iaXQuICBFYWNoIHNpemUgaGFzCit0aHJlZSBhY3R1YWwgZnVuY3Rpb25zOiBwdXQsIGdldCB1bnNpZ25lZCwgYW5kIGdldCBzaWduZWQuCisKK1RoZXNlIDE4IGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0CityZXByZXNlbnRhdGlvbnMuCisKK0Bub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGZvcm1hdAorQHN1YnNlY3Rpb24gRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucworCitFdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlCitpbmRleGVkIGJ5IHRoZSBCRkQgZm9ybWF0IHR5cGUuICBUaGUgQkZEIGZvcm1hdCB0eXBlcyBhcmUgYXMgZm9sbG93czoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBiZmRfdW5rbm93bgorVW5rbm93biBmb3JtYXQuICBOb3QgdXNlZCBmb3IgYW55dGhpbmcgdXNlZnVsLgorQGl0ZW0gYmZkX29iamVjdAorT2JqZWN0IGZpbGUuCitAaXRlbSBiZmRfYXJjaGl2ZQorQXJjaGl2ZSBmaWxlLgorQGl0ZW0gYmZkX2NvcmUKK0NvcmUgZmlsZS4KK0BlbmQgdGFibGUKKworVGhlIHRocmVlIGFycmF5cyBvZiBmdW5jdGlvbiBwb2ludGVycyBhcmUgYXMgZm9sbG93czoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBiZmRfY2hlY2tfZm9ybWF0CitDaGVjayB3aGV0aGVyIHRoZSBCRkQgaXMgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCAob2JqZWN0IGZpbGUsIGFyY2hpdmUKK2ZpbGUsIG9yIGNvcmUgZmlsZSkgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhcmdldCB2ZWN0b3IuICBUaGlzIGlzIGNhbGxlZAorYnkgdGhlIEBzYW1we2JmZF9jaGVja19mb3JtYXR9IGZ1bmN0aW9uIHdoZW4gZXhhbWluaW5nIGFuIGV4aXN0aW5nIEJGRC4KK0lmIHRoZSBCRkQgbWF0Y2hlcyB0aGUgZGVzaXJlZCBmb3JtYXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFueQorZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIEBzYW1we3RkYXRhfSBmaWVsZCBvZiB0aGUgQkZELgorVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCB0YXJnZXQgdmVjdG9yIGZ1bmN0aW9uCitvbiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgorCitAaXRlbSBiZmRfc2V0X2Zvcm1hdAorU2V0IHRoZSBmb3JtYXQgb2YgYSBCRkQgd2hpY2ggd2FzIGNyZWF0ZWQgZm9yIG91dHB1dC4gIFRoaXMgaXMgY2FsbGVkIGJ5Cit0aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIGFmdGVyIGNyZWF0aW5nIHRoZSBCRkQgd2l0aCBhCitmdW5jdGlvbiBzdWNoIGFzIEBzYW1we2JmZF9vcGVud30uICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBmb3JtYXQKK3NwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHdyaXRlIG91dCBhbiBvYmplY3QgZmlsZSBvciB3aGF0ZXZlciBvZgordGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQKK3RhcmdldCB2ZWN0b3IgZnVuY3Rpb24gb24gYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KKworQGl0ZW0gYmZkX3dyaXRlX2NvbnRlbnRzCitXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBCRkQgaW4gdGhlIGdpdmVuIGZvcm1hdC4gIFRoaXMgaXMgY2FsbGVkCitieSBAc2FtcHtiZmRfY2xvc2V9IGZ1bmN0aW9uIGZvciBhIEJGRCBvcGVuZWQgZm9yIHdyaXRpbmcuICBUaGlzIHJlYWxseQorc2hvdWxkIG5vdCBiZSBhbiBhcnJheSBzZWxlY3RlZCBieSBmb3JtYXQgdHlwZSwgYXMgdGhlCitAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gZnVuY3Rpb24gcHJvdmlkZXMgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4KK0luIGZhY3QsIEJGRCB3aWxsIGZhaWwgaWYgYSBkaWZmZXJlbnQgZm9ybWF0IGlzIHVzZWQgd2hlbiBjYWxsaW5nCit0aHJvdWdoIHRoZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kIHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9CithcnJheXM7IGZvcnR1bmF0ZWx5LCBzaW5jZSBAc2FtcHtiZmRfY2xvc2V9IGdldHMgaXQgcmlnaHQsIHRoaXMgaXMgYQorZGlmZmljdWx0IGVycm9yIHRvIG1ha2UuCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRF9KVU1QX1RBQkxFIG1hY3JvcworQHN1YnNlY3Rpb24gQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvcworQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRX0KKworTW9zdCB0YXJnZXQgdmVjdG9ycyBhcmUgZGVmaW5lZCB1c2luZyBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zLgorVGhlc2UgbWFjcm9zIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIGEgcHJlZml4IGFwcGxpZWQgdG8gYSBzZXQKK29mIGZ1bmN0aW9ucy4gIFRoZSBtYWNyb3MgYXJlIHRoZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlCit0YXJnZXQgdmVjdG9yLgorCitGb3IgZXhhbXBsZSwgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gZGVmaW5lcyB0aHJlZQorZnVuY3Rpb25zOiBAc2FtcHtfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kfSwgQHNhbXB7X2Nhbm9uaWNhbGl6ZV9yZWxvY30sCithbmQgQHNhbXB7X2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBBIHJlZmVyZW5jZSBsaWtlCitAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGZvbyl9IHdpbGwgZXhwYW5kIGludG8gdGhyZWUgZnVuY3Rpb25zCitwcmVmaXhlZCB3aXRoIEBzYW1we2Zvb306IEBzYW1we2Zvb19nZXRfcmVsb2NfdXBwZXJfZm91bmR9LCBldGMuICBUaGUKK0BzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gd2lsbCBiZSBwbGFjZWQgc3VjaCB0aGF0IHRob3NlIHRocmVlCitmdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBCRkQgdGFyZ2V0IHZlY3Rvci4KKworVGhpcyBpcyBkb25lIGJlY2F1c2UgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBkaWZmZXJlbnQgdGFyZ2V0IHZlY3RvcnMgY2FuCitzaGFyZSBjZXJ0YWluIGNsYXNzZXMgb2YgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGFyY2hpdmVzIGFyZSBzaW1pbGFyCitvbiBtb3N0IHBsYXRmb3Jtcywgc28gbW9zdCB0YXJnZXQgdmVjdG9ycyBjYW4gdXNlIHRoZSBzYW1lIGFyY2hpdmUKK2Z1bmN0aW9ucy4gIFRob3NlIHRhcmdldCB2ZWN0b3JzIGFsbCB1c2UgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0KK3dpdGggdGhlIHNhbWUgYXJndW1lbnQsIGNhbGxpbmcgYSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGlzIGRlZmluZWQgaW4KK0BmaWxle2FyY2hpdmUuY30uCisKK0VhY2ggb2YgdGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MgaXMgbWVudGlvbmVkIGJlbG93IGFsb25nIHdpdGgKK3RoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaXQgZGVmaW5lcy4gIFRoZSBmdW5jdGlvbgorcG9pbnRlcnMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgdGhlIG5hbWUgd2l0aG91dCB0aGUgcHJlZml4IHdoaWNoIHRoZQorQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3JvIGRlZmluZXMuICBUaGlzIG5hbWUgaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMKK3RoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUuICBBbnkgZGlmZmVyZW5jZXMKK3dpbGwgYmUgbm90ZWQuCisKK0Bub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWMKK0BzdWJzZWN0aW9uIEdlbmVyaWMgZnVuY3Rpb25zCitAY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0dFTkVSSUN9CisKK1RoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfSBtYWNybyBpcyB1c2VkIGZvciBzb21lIGNhdGNoIGFsbAorZnVuY3Rpb25zIHdoaWNoIGRvbid0IGVhc2lseSBmaXQgaW50byBvdGhlciBjYXRlZ29yaWVzLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIF9jbG9zZV9hbmRfY2xlYW51cAorRnJlZSBhbnkgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZELiAgVGhpcyBpcworY2FsbGVkIHdoZW4gYW55IEJGRCBpcyBjbG9zZWQgKHRoZSBAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9IGZ1bmN0aW9uCittZW50aW9uZWQgZWFybGllciBpcyBvbmx5IGNhbGxlZCBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nKS4gIE1vc3QKK3RhcmdldHMgdXNlIEBzYW1we2JmZF9hbGxvY30gdG8gYWxsb2NhdGUgYWxsIHRhcmdldCBzcGVjaWZpYworaW5mb3JtYXRpb24sIGFuZCB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgorVGhpcyBmdW5jdGlvbiBwb2ludGVyIGlzIHR5cGljYWxseSBzZXQgdG8KK0BzYW1we19iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cH0sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCisKK0BpdGVtIF9iZmRfZnJlZV9jYWNoZWRfaW5mbworRnJlZSBhbnkgY2FjaGVkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIHdoaWNoIGNhbiBiZQorcmVjcmVhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeS4gIFRoaXMgaXMgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeQorY29uc3VtcHRpb24gcmVxdWlyZWQgYnkgcHJvZ3JhbXMgdXNpbmcgQkZELiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgdmlhCit0aGUgQHNhbXB7YmZkX2ZyZWVfY2FjaGVkX2luZm99IG1hY3JvLiAgSXQgaXMgdXNlZCBieSB0aGUgZGVmYXVsdAorYXJjaGl2ZSByb3V0aW5lcyB3aGVuIGNvbXB1dGluZyB0aGUgYXJjaGl2ZSBtYXAuICBNb3N0IHRhcmdldHMgZG8gbm90CitkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzIGVudHJ5IHBvaW50LCBhbmQganVzdCBzZXQgaXQgdG8KK0BzYW1we19iZmRfZ2VuZXJpY19mcmVlX2NhY2hlZF9pbmZvfSwgd2hpY2ggc2ltcGx5IHJldHVybnMgdHJ1ZS4KKworQGl0ZW0gX25ld19zZWN0aW9uX2hvb2sKK1RoaXMgaXMgY2FsbGVkIGZyb20gQHNhbXB7YmZkX21ha2Vfc2VjdGlvbl9hbnl3YXl9IHdoZW5ldmVyIGEgbmV3CitzZWN0aW9uIGlzIGNyZWF0ZWQuICBNb3N0IHRhcmdldHMgdXNlIGl0IHRvIGluaXRpYWxpemUgc2VjdGlvbiBzcGVjaWZpYworaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgc2VjdGlvbgorY29ycmVzcG9uZHMgdG8gYW4gYWN0dWFsIHNlY3Rpb24gaW4gYW4gYWN0dWFsIEJGRC4KKworQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzCitHZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGZyb20KK0BzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uICBNb3N0IHRhcmdldHMgc2V0IHRoaXMgdG8KK0BzYW1we19iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGRvZXMgYSBAc2FtcHtiZmRfc2Vla30KK2Jhc2VkIG9uIHRoZSBzZWN0aW9uJ3MgQHNhbXB7ZmlsZXBvc30gZmllbGQgYW5kIGEgQHNhbXB7YmZkX3JlYWR9LiAgVGhlCitjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCitAc2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfS4KKworQGl0ZW0gX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworU2V0IGEgQHNhbXB7YmZkX3dpbmRvd30gdG8gaG9sZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcworY2FsbGVkIGZyb20gQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uICBUaGUKK0BzYW1we2JmZF93aW5kb3d9IGlkZWEgbmV2ZXIgcmVhbGx5IGNhdWdodCBvbiwgYW5kIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcworZXZlciBjYWxsZWQuICBQcmV0dHkgbXVjaCBhbGwgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBhcworQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fSwgd2hpY2ggdXNlcworQHNhbXB7YmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzfSB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICBUaGUKK2NvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKK0BzYW1we19iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93fS4KK0BlbmQgdGFibGUKKworQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29weQorQHN1YnNlY3Rpb24gQ29weSBmdW5jdGlvbnMKK0BjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09QWX0KKworVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBhcmUKK2NhbGxlZCB3aGVuIGNvcHlpbmcgQkZEcywgYW5kIGZvciBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoCitpbnRlcm5hbCBCRkQgaW5mb3JtYXRpb24uCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKK1RoaXMgaXMgY2FsbGVkIHdoZW4gY29weWluZyBhIEJGRCwgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LgorSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgQkZEcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCwgdGhpcyB3aWxsIGNvcHkgYW55Citwcml2YXRlIGluZm9ybWF0aW9uIG92ZXIuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMKK2hhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbgordGhpcyBmdW5jdGlvbi4KKworQGl0ZW0gX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCitUaGlzIGlzIGNhbGxlZCB3aGVuIGxpbmtpbmcsIHZpYSBAc2FtcHtiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YX0uICBJdAorZ2l2ZXMgdGhlIGJhY2tlbmQgbGlua2VyIGNvZGUgYSBjaGFuY2UgdG8gc2V0IGFueSBzcGVjaWFsIGZsYWdzIGluIHRoZQorb3V0cHV0IGZpbGUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlLiAgT25seSBhIGZldyB0YXJnZXRzCitkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgorCitAaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKK1RoaXMgaXMgc2ltaWxhciB0byBAc2FtcHtfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YX0sIGJ1dCBpdCBpcyBjYWxsZWQKK2ZvciBlYWNoIHNlY3Rpb24sIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YX0uICBUaGlzCitmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGFueSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuLiAgT25seQorYSBmZXcgdGFyZ2V0cyBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgorCitAaXRlbSBfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQorVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGF9LCBidXQgSSBkb24ndAordGhpbmsgYW55dGhpbmcgYWN0dWFsbHkgY2FsbHMgaXQuICBJZiBpdCB3ZXJlIGRlZmluZWQsIGl0IGNvdWxkIGJlIHVzZWQKK3RvIGNvcHkgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBCRkQgdG8gYW5vdGhlci4gIEhvd2V2ZXIsIG1vc3QgQkZEcworc3RvcmUgZXh0cmEgc3ltYm9sIGluZm9ybWF0aW9uIGJ5IGFsbG9jYXRpbmcgc3BhY2Ugd2hpY2ggaXMgbGFyZ2VyIHRoYW4KK3RoZSBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmUgYW5kIHN0b3JpbmcgcHJpdmF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUKK2V4dHJhIHNwYWNlLiAgU2luY2UgQHNhbXB7b2JqY29weX0gYW5kIG90aGVyIHByb2dyYW1zIGNvcHkgc3ltYm9sCitpbmZvcm1hdGlvbiBieSBjb3B5aW5nIHBvaW50ZXJzIHRvIEBzYW1we2FzeW1ib2x9IHN0cnVjdHVyZXMsIHRoZQorcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBjb3BpZWQgYXMgd2VsbC4gIE1vc3QKK3RhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCisKK0BpdGVtIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKK1RoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2V0X3ByaXZhdGVfZmxhZ3N9LiAgSXQgaXMgYmFzaWNhbGx5IGEgaG9vaworZm9yIHRoZSBhc3NlbWJsZXIgdG8gc2V0IG1hZ2ljIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBQb3dlclBDCitFTEYgYXNzZW1ibGVyIHVzZXMgaXQgdG8gc2V0IGZsYWdzIHdoaWNoIGFwcGVhciBpbiB0aGUgZV9mbGFncyBmaWVsZCBvZgordGhlIEVMRiBoZWFkZXIuICBNb3N0IHRhcmdldHMgZG8gbm90IGRvIGFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCisKK0BpdGVtIF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorVGhpcyBpcyBjYWxsZWQgYnkgQHNhbXB7b2JqZHVtcH0gd2hlbiB0aGUgQHNhbXB7LXB9IG9wdGlvbiBpcyB1c2VkLiAgSXQKK2lzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3ByaW50X3ByaXZhdGVfZGF0YX0uICBJdCBwcmludHMgYW55IGludGVyZXN0aW5nCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkZEIHdoaWNoIGNhbiBub3QgYmUgb3RoZXJ3aXNlIHJlcHJlc2VudGVkIGJ5IEJGRAorYW5kIHRodXMgY2FuIG5vdCBiZSBwcmludGVkIGJ5IEBzYW1we29iamR1bXB9LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbworYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KK0BlbmQgdGFibGUKKworQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgY29yZQorQHN1YnNlY3Rpb24gQ29yZSBmaWxlIHN1cHBvcnQgZnVuY3Rpb25zCitAY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUkV9CisKK1RoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAord2l0aCBjb3JlIGZpbGVzLiAgT2J2aW91c2x5LCB0aGVzZSBmdW5jdGlvbnMgb25seSBkbyBzb21ldGhpbmcKK2ludGVyZXN0aW5nIGZvciB0YXJnZXRzIHdoaWNoIGhhdmUgY29yZSBmaWxlIHN1cHBvcnQuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKK0dpdmVuIGEgY29yZSBmaWxlLCB0aGlzIHJldHVybnMgdGhlIGNvbW1hbmQgd2hpY2ggd2FzIHJ1biB0byBwcm9kdWNlIHRoZQorY29yZSBmaWxlLgorCitAaXRlbSBfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCitHaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIHByb2R1Y2VkIHRoZQorY29yZSBmaWxlLgorCitAaXRlbSBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCitHaXZlbiBhIGNvcmUgZmlsZSBhbmQgYSBCRkQgZm9yIGFuIGV4ZWN1dGFibGUsIHRoaXMgcmV0dXJucyB3aGV0aGVyIHRoZQorY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dGFibGUuCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGFyY2hpdmUKK0BzdWJzZWN0aW9uIEFyY2hpdmUgZnVuY3Rpb25zCitAY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9CisKK1RoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAord2l0aCBhcmNoaXZlIGZpbGVzLiAgTW9zdCB0YXJnZXRzIHVzZSBDT0ZGIHN0eWxlIGFyY2hpdmUgZmlsZXMKKyhpbmNsdWRpbmcgRUxGIHRhcmdldHMpLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9jb2ZmfSBhcyB0aGUKK2FyZ3VtZW50IHRvIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9LiAgU29tZSB0YXJnZXRzIHVzZSBCU0QvYS5vdXQKK3N0eWxlIGFyY2hpdmVzLCBhbmQgdGhlc2UgdXNlIEBzYW1we19iZmRfYXJjaGl2ZV9ic2R9LiAgKFRoZSBtYWluCitkaWZmZXJlbmNlIGJldHdlZW4gQlNEIGFuZCBDT0ZGIGFyY2hpdmVzIGlzIHRoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUKK3N5bWJvbCB0YWJsZSkuICBUYXJnZXRzIHdpdGggbm8gYXJjaGl2ZSBzdXBwb3J0IHVzZQorQHNhbXB7X2JmZF9ub2FyY2hpdmV9LiAgRmluYWxseSwgYSBmZXcgdGFyZ2V0cyBoYXZlIHVudXN1YWwgYXJjaGl2ZQoraGFuZGxpbmcuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gX3NsdXJwX2FybWFwCitSZWFkIGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSwgc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcworaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIGFyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlCitjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCitAc2FtcHtfYmZkX3NsdXJwX2FybWFwfS4KKworQGl0ZW0gX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKK1JlYWQgaW4gdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUgZnJvbSB0aGUgYXJjaGl2ZSwgaWYgdGhlcmUgaXMgb25lLAorc3RvcmluZyBpdCBpbiBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUKK2FyY2hpdmUgQHNhbXB7Y2hlY2tfZm9ybWF0fSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCit0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZX0uCisKK0BpdGVtIGNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCitCdWlsZCBhbmQgcmV0dXJuIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUgaWYgb25lIGlzIG5lZWRlZCB0byB3cml0ZSBvdXQKK3RoZSBhcmNoaXZlLiAgVGhpcyBhbHNvIGFkanVzdHMgdGhlIGFyY2hpdmUgaGVhZGVycyB0byByZWZlciB0byB0aGUKK2V4dGVuZGVkIG5hbWUgdGFibGUgYXBwcm9wcmlhdGVseS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCithcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCit0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGV9LgorCitAaXRlbSBfdHJ1bmNhdGVfYXJuYW1lCitUaGlzIGNvcGllcyBhIGZpbGUgbmFtZSBpbnRvIGFuIGFyY2hpdmUgaGVhZGVyLCB0cnVuY2F0aW5nIGl0IGFzCityZXF1aXJlZC4gIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfQorcm91dGluZS4gIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBpbnRlcmVzdGluZyBpbiB0YXJnZXRzIHdoaWNoIGRvIG5vdAorc3VwcG9ydCBleHRlbmRlZCBuYW1lIHRhYmxlcywgYnV0IEkgdGhpbmsgdGhlIEdOVSBAc2FtcHthcn0gcHJvZ3JhbQorYWx3YXlzIHVzZXMgZXh0ZW5kZWQgbmFtZSB0YWJsZXMgYW55aG93LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCit0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdHJ1bmNhdGVfYXJuYW1lfS4KKworQGl0ZW0gX3dyaXRlX2FybWFwCitXcml0ZSBvdXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHVzaW5nIGNhbGxzIHRvIEBzYW1we2JmZF93cml0ZX0uCitUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLgorVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7d3JpdGVfYXJtYXB9Cisobm8gbGVhZGluZyB1bmRlcnNjb3JlKS4KKworQGl0ZW0gX3JlYWRfYXJfaGRyCitSZWFkIGFuZCBwYXJzZSBhbiBhcmNoaXZlIGhlYWRlci4gIFRoaXMgaGFuZGxlcyBleHBhbmRpbmcgdGhlIGFyY2hpdmUKK2hlYWRlciBuYW1lIGludG8gdGhlIHJlYWwgZmlsZSBuYW1lIHVzaW5nIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgVGhpcworaXMgY2FsbGVkIGJ5IHJvdXRpbmVzIHdoaWNoIHJlYWQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIG9yIHRoZSBhcmNoaXZlCitpdHNlbGYuICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAorQHNhbXB7X2JmZF9yZWFkX2FyX2hkcl9mbn0uCisKK0BpdGVtIF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKK0dpdmVuIGFuIGFyY2hpdmUgYW5kIGEgQkZEIHJlcHJlc2VudGluZyBhIGZpbGUgc3RvcmVkIHdpdGhpbiB0aGUKK2FyY2hpdmUsIHJldHVybiBhIEJGRCBmb3IgdGhlIG5leHQgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIFRoaXMgaXMgY2FsbGVkCit2aWEgQHNhbXB7YmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKK3RhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7b3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlfSAobm8gbGVhZGluZwordW5kZXJzY29yZSkuCisKK0BpdGVtIF9nZXRfZWx0X2F0X2luZGV4CitHaXZlbiBhbiBhcmNoaXZlIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgQkZEIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQorY29ycmVzcG9uZGluZyB0byB0aGF0IGVudHJ5IGluIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkCit2aWEgQHNhbXB7YmZkX2dldF9lbHRfYXRfaW5kZXh9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAordmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2VsdF9hdF9pbmRleH0uCisKK0BpdGVtIF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKK0RvIGEgc3RhdCBvbiBhbiBlbGVtZW50IG9mIGFuIGFyY2hpdmUsIHJldHVybmluZyBpbmZvcm1hdGlvbiByZWFkIGZyb20KK3RoZSBhcmNoaXZlIGhlYWRlciAobW9kaWZpY2F0aW9uIHRpbWUsIHVpZCwgZ2lkLCBmaWxlIG1vZGUsIHNpemUpLiAgVGhpcworaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc3RhdF9hcmNoX2VsdH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKK3RhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zdGF0X2FyY2hfZWx0fS4KKworQGl0ZW0gX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKK0FmdGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBoYXZlIGJlZW4gd3JpdHRlbiBvdXQsIHVwZGF0ZQordGhlIHRpbWVzdGFtcCBvZiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdG8gYmUgbmV3ZXIgdGhhbiB0aGF0IG9mIHRoZQorZmlsZS4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGEub3V0IHN0eWxlIGFyY2hpdmVzLiAgVGhpcyBpcyBub3JtYWxseQorY2FsbGVkIGJ5IHRoZSBhcmNoaXZlIEBzYW1we3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lLiAgVGhlIGNvcnJlc3BvbmRpbmcKK2ZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcH0uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHMKK0BzdWJzZWN0aW9uIFN5bWJvbCB0YWJsZSBmdW5jdGlvbnMKK0BjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfU1lNQk9MU30KKworVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCit3aXRoIHN5bWJvbHMuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gX2dldF9zeW10YWJfdXBwZXJfYm91bmQKK1JldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKK3JlcXVpcmVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cyByZXR1cm4gdGhlCithbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yIGFsbCB0aGUKK3N5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzeW1ib2wKK2luZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQordGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmR9LgorCitAaXRlbSBfZ2V0X3N5bXRhYgorUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCitAc2FtcHtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Cit2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfc3ltdGFifS4KKworQGl0ZW0gX21ha2VfZW1wdHlfc3ltYm9sCitDcmVhdGUgYW4gZW1wdHkgc3ltYm9sIGZvciB0aGUgQkZELiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBtb3N0IHRhcmdldHMKK3N0b3JlIGV4dHJhIGluZm9ybWF0aW9uIHdpdGggZWFjaCBzeW1ib2wgYnkgYWxsb2NhdGluZyBhIHN0cnVjdHVyZQorbGFyZ2VyIHRoYW4gYW4gQHNhbXB7YXN5bWJvbH0gYW5kIHN0b3JpbmcgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGF0IHRoZQorZW5kLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2YgbWVtb3J5LCBhbmQgcmV0dXJuCit3aGF0IGxvb2tzIGxpa2UgYSBwb2ludGVyIHRvIGFuIGVtcHR5IEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQKK3ZpYSBAc2FtcHtiZmRfbWFrZV9lbXB0eV9zeW1ib2x9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAordmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfbWFrZV9lbXB0eV9zeW1ib2x9LgorCitAaXRlbSBfcHJpbnRfc3ltYm9sCitQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQgdmlhCitAc2FtcHtiZmRfcHJpbnRfc3ltYm9sfS4gIE9uZSBvZiB0aGUgYXJndW1lbnRzIGluZGljYXRlcyB3aGF0IHNvcnQgb2YKK2luZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGJmZF9wcmludF9zeW1ib2xfbmFtZQorSnVzdCBwcmludCB0aGUgc3ltYm9sIG5hbWUuCitAaXRlbSBiZmRfcHJpbnRfc3ltYm9sX21vcmUKK1ByaW50IHRoZSBzeW1ib2wgbmFtZSBhbmQgc29tZSBpbnRlcmVzdGluZyBmbGFncy4gIEkgZG9uJ3QgdGhpbmsKK2FueXRoaW5nIGFjdHVhbGx5IHVzZXMgdGhpcy4KK0BpdGVtIGJmZF9wcmludF9zeW1ib2xfYWxsCitQcmludCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgdXNlZCBieSBAc2FtcHtvYmpkdW1wfQord2hlbiBydW4gd2l0aCB0aGUgQHNhbXB7LXR9IG9wdGlvbi4KK0BlbmQgdGFibGUKK1RoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCitAc2FtcHtfYmZkX3ByaW50X3N5bWJvbH0uCisKK0BpdGVtIF9nZXRfc3ltYm9sX2luZm8KK1JldHVybiBhIHN0YW5kYXJkIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3ltYm9sLiAgVGhpcyBpcyBjYWxsZWQKK3ZpYSBAc2FtcHtiZmRfc3ltYm9sX2luZm99LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAordmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X3N5bWJvbF9pbmZvfS4KKworQGl0ZW0gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCitSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIHdvdWxkIG5vcm1hbGx5IHJlcHJlc2VudCB0aGUgbmFtZSBvZiBhCitsb2NhbCBsYWJlbC4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfaXNfbG9jYWxfbGFiZWx9IGFuZAorQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsX25hbWV9LiAgTG9jYWwgbGFiZWxzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQgYnkKK3RoZSBhc3NlbWJsZXIuICBJbiB0aGUgbGlua2VyLCB0aGlzIGRlZmluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKK0BzYW1wey14fSBhbmQgQHNhbXB7LVh9IG9wdGlvbnMuCisKK0BpdGVtIF9nZXRfbGluZW5vCitSZXR1cm4gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKK2ZvciBhIENPRkYgdGFyZ2V0LiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB3cml0aW5nIG91dCBDT0ZGIGxpbmUgbnVtYmVycy4KKworQGl0ZW0gX2ZpbmRfbmVhcmVzdF9saW5lCitHaXZlbiBhbiBhZGRyZXNzIHdpdGhpbiBhIHNlY3Rpb24sIHVzZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGZpbmQKK3RoZSBtYXRjaGluZyBmaWxlIG5hbWUsIGZ1bmN0aW9uIG5hbWUsIGFuZCBsaW5lIG51bWJlciwgaWYgYW55LiAgVGhpcyBpcworY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluZF9uZWFyZXN0X2xpbmV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCit0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZmluZF9uZWFyZXN0X2xpbmV9LgorCitAaXRlbSBfYmZkX21ha2VfZGVidWdfc3ltYm9sCitNYWtlIGEgZGVidWdnaW5nIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhIENPRkYgdGFyZ2V0LAord2hlcmUgaXQgc2ltcGx5IHJldHVybnMgYSBzeW1ib2wgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW4gdGhlCitAc2FtcHtOX0RFQlVHfSBzZWN0aW9uIHdoZW4gaXQgaXMgd3JpdHRlbiBvdXQuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9tYWtlX2RlYnVnX3N5bWJvbH0uCisKK0BpdGVtIF9yZWFkX21pbmlzeW1ib2xzCitNaW5pc3ltYm9scyBhcmUgdXNlZCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgcHJvZ3JhbXMgbGlrZQorQHNhbXB7bm19LiAgQSBtaW5pc3ltYm9sIGlzIGEgY29va2llIHBvaW50aW5nIHRvIGludGVybmFsIHN5bWJvbAoraW5mb3JtYXRpb24gd2hpY2ggdGhlIGNhbGxlciBjYW4gdXNlIHRvIGV4dHJhY3QgY29tcGxldGUgc3ltYm9sCitpbmZvcm1hdGlvbi4gIFRoaXMgcGVybWl0cyBCRkQgdG8gbm90IGNvbnZlcnQgYWxsIHRoZSBzeW1ib2xzIGludG8KK2dlbmVyaWMgZm9ybSwgYnV0IHRvIGluc3RlYWQgY29udmVydCB0aGVtIG9uZSBhdCBhIHRpbWUuICBUaGlzIGlzIGNhbGxlZAordmlhIEBzYW1we2JmZF9yZWFkX21pbmlzeW1ib2xzfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgaW1wbGVtZW50IHRoaXMsCithbmQganVzdCB1c2UgZ2VuZXJpYyBzdXBwb3J0IHdoaWNoIGlzIGJhc2VkIG9uIHVzaW5nIHN0YW5kYXJkCitAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLgorCitAaXRlbSBfbWluaXN5bWJvbF90b19zeW1ib2wKK0NvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgc3RhbmRhcmQgQHNhbXB7YXN5bWJvbH0uICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9taW5pc3ltYm9sX3RvX3N5bWJvbH0uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHJlbG9jcworQHN1YnNlY3Rpb24gUmVsb2NhdGlvbiBzdXBwb3J0CitAY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30KKworVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1JFTE9DU30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKK3dpdGggcmVsb2NhdGlvbnMuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gX2dldF9yZWxvY191cHBlcl9ib3VuZAorUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQorcmVxdWlyZWQgdG8gcmVhZCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4gIEluIHByYWN0aWNlIG1vc3QKK3RhcmdldHMgcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0KK3BvaW50ZXJzIGZvciBhbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kCitzdG9yZSB0aGUgYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMKK2NhbGxlZCB2aWEgQHNhbXB7YmZkX2dldF9yZWxvY191cHBlcl9ib3VuZH0uCisKK0BpdGVtIF9jYW5vbmljYWxpemVfcmVsb2MKK1JldHVybiB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCitAc2FtcHtiZmRfY2Fub25pY2FsaXplX3JlbG9jfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKK3ZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uCisKK0BpdGVtIF9iZmRfcmVsb2NfdHlwZV9sb29rdXAKK0dpdmVuIGEgcmVsb2NhdGlvbiBjb2RlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlCisoQHB4cmVme0JGRCByZWxvY2F0aW9uIGNvZGVzfSkuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Cit2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9LgorQGVuZCB0YWJsZQorCitAbm9kZSBCRkQgdGFyZ2V0IHZlY3RvciB3cml0ZQorQHN1YnNlY3Rpb24gT3V0cHV0IGZ1bmN0aW9ucworQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0KKworVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX1dSSVRFfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAord2l0aCB3cml0aW5nIG91dCBhIEJGRC4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBfc2V0X2FyY2hfbWFjaAorU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgbnVtYmVyIGZvciBhIEJGRC4gIFRoaXMgaXMgY2FsbGVkIHZpYQorQHNhbXB7YmZkX3NldF9hcmNoX21hY2h9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCB0aGlzIGJ5IGNhbGxpbmcKK0BzYW1we2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2h9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAordmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X2FyY2hfbWFjaH0uCisKK0BpdGVtIF9zZXRfc2VjdGlvbl9jb250ZW50cworV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Cit2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9zZXRfc2VjdGlvbl9jb250ZW50c30uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGxpbmsKK0BzdWJzZWN0aW9uIExpbmtlciBmdW5jdGlvbnMKK0BjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfTElOS30KKworVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCitsaW5rZXIuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gX3NpemVvZl9oZWFkZXJzCitSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYSBCRkQuICBUaGlzIGlzCit1c2VkIHRvIGltcGxlbWVudCB0aGUgQHNhbXB7U0laRU9GX0hFQURFUlN9IGxpbmtlciBzY3JpcHQgZnVuY3Rpb24uICBJdAoraXMgbm9ybWFsbHkgdXNlZCB0byBhbGlnbiB0aGUgZmlyc3Qgc2VjdGlvbiBhdCBhbiBlZmZpY2llbnQgcG9zaXRpb24gb24KK3RoZSBwYWdlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30uICBUaGUKK2NvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKK0BzYW1we19iZmRfc2l6ZW9mX2hlYWRlcnN9LgorCitAaXRlbSBfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGFuZCBhcHBseSB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK1RoaXMgaGFuZGxlcyBib3RoIGEgZmluYWwgbGluayBhbmQgYSByZWxvY2F0ZWFibGUgbGluazsgaW4gdGhlIGxhdHRlcgorY2FzZSwgaXQgYWRqdXN0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIGltcGxlbWVudCBpdCBieQorY2FsbGluZyBAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9LgorCitAaXRlbSBfYmZkX3JlbGF4X3NlY3Rpb24KK1RyeSB0byB1c2UgcmVsYXhhdGlvbiB0byBzaHJpbmsgdGhlIHNpemUgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQKK2J5IHRoZSBsaW5rZXIgd2hlbiB0aGUgQHNhbXB7LXJlbGF4fSBvcHRpb24gaXMgdXNlZC4gIFRoaXMgaXMgY2FsbGVkIHZpYQorQHNhbXB7YmZkX3JlbGF4X3NlY3Rpb259LiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0IGFueSBzb3J0IG9mCityZWxheGF0aW9uLgorCitAaXRlbSBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKK0NyZWF0ZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgdG8gdXNlIGZvciB0aGUgbGlua2VyLiAgVGhpcyBsaW5rZXIgaG9vaworcGVybWl0cyB0aGUgYmFja2VuZCB0byBjb250cm9sIHRoZSBzaXplIGFuZCBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudHMKK2luIHRoZSBsaW5rZXIgc3ltYm9sIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlfS4KKworQGl0ZW0gX2JmZF9saW5rX2FkZF9zeW1ib2xzCitHaXZlbiBhbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlLCBhZGQgYWxsIHN5bWJvbHMgaW50byB0aGUgbGlua2VyCitzeW1ib2wgaGFzaCB0YWJsZS4gIFVzZSBjYWxsYmFja3MgdG8gdGhlIGxpbmtlciB0byBpbmNsdWRlIGFyY2hpdmUKK2VsZW1lbnRzIGluIHRoZSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9saW5rX2FkZF9zeW1ib2xzfS4KKworQGl0ZW0gX2JmZF9maW5hbF9saW5rCitGaW5pc2ggdGhlIGxpbmtpbmcgcHJvY2Vzcy4gIFRoZSBsaW5rZXIgY2FsbHMgdGhpcyBob29rIGFmdGVyIGFsbCBvZiB0aGUKK2lucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLCB3aGVuIGl0IGlzIHJlYWR5IHRvIGZpbmlzaCB0aGUgbGluayBhbmQKK2dlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfZmluYWxfbGlua30uCisKK0BpdGVtIF9iZmRfbGlua19zcGxpdF9zZWN0aW9uCitJIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIE5vdGhpbmcgc2VlbXMgdG8gY2FsbCBpdC4gIFRoZSBvbmx5Citub24tdHJpdmlhbCBkZWZpbml0aW9uIGlzIGluIEBmaWxle3NvbS5jfS4KK0BlbmQgdGFibGUKKworQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IgZHluYW1pYworQHN1YnNlY3Rpb24gRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucworQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9EWU5BTUlDfQorCitUaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIHJlYWQKK2R5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCitSZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCityZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cworcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXN5bWJvbH0gcG9pbnRlcnMgZm9yCithbGwgdGhlIHN5bWJvbHMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlIGFjdHVhbAorc3ltYm9sIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KK3RoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4KKworQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgorUmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCit0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4KKworQGl0ZW0gX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCitSZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCityZXF1aXJlZCB0byByZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgSW4gcHJhY3RpY2UgbW9zdCB0YXJnZXRzCityZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCBAc2FtcHthcmVsZW50fSBwb2ludGVycyBmb3IKK2FsbCB0aGUgcmVsb2NhdGlvbnMgcGx1cyBhIHRyYWlsaW5nIEBzYW1we05VTEx9IGVudHJ5LCBhbmQgc3RvcmUgdGhlCithY3R1YWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCitAc2FtcHtiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KK3RoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmR9LgorCitAaXRlbSBfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKK1JlYWQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuICBUaGlzIGlzIGNhbGxlZCB2aWEKK0BzYW1we2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKK3RhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvY30uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCBnZW5lcmF0ZWQgZmlsZXMKK0BzZWN0aW9uIEJGRCBnZW5lcmF0ZWQgZmlsZXMKK0BjaW5kZXggZ2VuZXJhdGVkIGZpbGVzIGluIGJmZAorQGNpbmRleCBiZmQgZ2VuZXJhdGVkIGZpbGVzCisKK0JGRCBjb250YWlucyBzZXZlcmFsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBzZWN0aW9uCitkZXNjcmliZXMgdGhlbS4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIHdoZW4geW91Citjb25maWd1cmUgQkZELiAgU29tZSBmaWxlcyBhcmUgY3JlYXRlZCBhdCBtYWtlIHRpbWUsIHdoZW4geW91IGJ1aWxkCit0aW1lLiAgU29tZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSByZWJ1aWx0IGF0IG1ha2UgdGltZSwgYnV0IG9ubHkgaWYKK3lvdSBjb25maWd1cmUgd2l0aCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBTb21lCitmaWxlcyBsaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LS0tdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHlvdSBydW4KK2NvbmZpZ3VyZS0tLWFuZCBzb21lIGxpdmUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBBbGwgZmlsZXMgdGhhdCBsaXZlCitpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY2hlY2tlZCBpbnRvIHRoZSBDVlMgcmVwb3NpdG9yeS4KKworQHRhYmxlIEBmaWxlCitAaXRlbSBiZmQuaAorQGNpbmRleCBAZmlsZXtiZmQuaH0KK0BjaW5kZXggQGZpbGV7YmZkLWluMy5ofQorTGl2ZXMgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGF0IG1ha2UgdGltZSBmcm9tCitAZmlsZXtiZmQtaW4yLmh9IHZpYSBAZmlsZXtiZmQtaW4zLmh9LiAgQGZpbGV7YmZkLWluMy5ofSBpcyBjcmVhdGVkIGF0Citjb25maWd1cmUgdGltZSBmcm9tIEBmaWxle2JmZC1pbjIuaH0uICBUaGVyZSBhcmUgYXV0b21hdGljIGRlcGVuZGVuY2llcwordG8gcmVidWlsZCBAZmlsZXtiZmQtaW4zLmh9IGFuZCBoZW5jZSBAZmlsZXtiZmQuaH0gaWYgQGZpbGV7YmZkLWluMi5ofQorY2hhbmdlcywgc28geW91IGNhbiBub3JtYWxseSBpZ25vcmUgQGZpbGV7YmZkLWluMy5ofSwgYW5kIGp1c3QgdGhpbmsKK2Fib3V0IEBmaWxle2JmZC1pbjIuaH0gYW5kIEBmaWxle2JmZC5ofS4KKworQGZpbGV7YmZkLmh9IGlzIGJ1aWx0IGJ5IHJlcGxhY2luZyBhIGZldyBzdHJpbmdzIGluIEBmaWxle2JmZC1pbjIuaH0uCitUbyBzZWUgdGhlbSwgc2VhcmNoIGZvciBAc2FtcHtAQH0gaW4gQGZpbGV7YmZkLWluMi5ofS4gIFRoZXkgbWFpbmx5Citjb250cm9sIHdoZXRoZXIgQkZEIGlzIGJ1aWx0IGZvciBhIDMyIGJpdCB0YXJnZXQgb3IgYSA2NCBiaXQgdGFyZ2V0LgorCitAaXRlbSBiZmQtaW4yLmgKK0BjaW5kZXggQGZpbGV7YmZkLWluMi5ofQorTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7YmZkLWluLmh9IGFuZCBzZXZlcmFsCitvdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQorQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2JmZC1pbjIuaH0gaXMgcmVidWlsdAorYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KKworQGl0ZW0gZWxmMzItdGFyZ2V0LmgKK0BpdGVteCBlbGY2NC10YXJnZXQuaAorQGNpbmRleCBAZmlsZXtlbGYzMi10YXJnZXQuaH0KK0BjaW5kZXggQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9CitMaXZlIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2VsZnh4LXRhcmdldC5ofS4KK1RoZXNlIGZpbGVzIGFyZSB2ZXJzaW9ucyBvZiBAZmlsZXtlbGZ4eC10YXJnZXQuaH0gY3VzdG9taXplZCBmb3IgZWl0aGVyCithIDMyIGJpdCBFTEYgdGFyZ2V0IG9yIGEgNjQgYml0IEVMRiB0YXJnZXQuCisKK0BpdGVtIGxpYmJmZC5oCitAY2luZGV4IEBmaWxle2xpYmJmZC5ofQorTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliYmZkLWluLmh9IGFuZAorc2V2ZXJhbCBvdGhlciBCRkQgc291cmNlIGZpbGVzLiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQorQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmJmZC5ofSBpcyByZWJ1aWx0CithdXRvbWF0aWNhbGx5IHdoZW4gYSBzb3VyY2UgZmlsZSBjaGFuZ2VzLgorCitAaXRlbSBsaWJjb2ZmLmgKK0BjaW5kZXggQGZpbGV7bGliY29mZi5ofQorTGl2ZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBDcmVhdGVkIGZyb20gQGZpbGV7bGliY29mZi1pbi5ofSBhbmQKK0BmaWxle2NvZmZjb2RlLmh9LiAgSWYgeW91IGNvbmZpZ3VyZSB3aXRoIHRoZQorQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIEBmaWxle2xpYmNvZmYuaH0gaXMgcmVidWlsdAorYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KKworQGl0ZW0gdGFyZ21hdGNoLmgKK0BjaW5kZXggQGZpbGV7dGFyZ21hdGNoLmh9CitMaXZlcyBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgYXQgbWFrZSB0aW1lIGZyb20KK0BmaWxle2NvbmZpZy5iZmR9LiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gbWFwIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgaW50bworQkZEIHRhcmdldCB2ZWN0b3IgdmFyaWFibGUgbmFtZXMgYXQgcnVuIHRpbWUuCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCBtdWx0aXBsZSBjb21waWxhdGlvbnMKK0BzZWN0aW9uIEZpbGVzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGluIEJGRAorU2V2ZXJhbCBmaWxlcyBpbiBCRkQgYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLiAgQnkgdGhpcyBJIG1lYW4gdGhhdAordGhlcmUgYXJlIGhlYWRlciBmaWxlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlc2UgaGVhZGVyCitmaWxlcyBhcmUgaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMsIGFuZCB0aHVzIHRoZSBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkCitvbmNlIHBlciBmaWxlIHdoaWNoIGluY2x1ZGVzIHRoZW0uCisKK1ByZXByb2Nlc3NvciBtYWNyb3MgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgY29tcGlsYXRpb24sIHNvIHRoYXQgZWFjaAordGltZSB0aGUgZmlsZXMgYXJlIGNvbXBpbGVkIHRoZSByZXN1bHRpbmcgZnVuY3Rpb25zIGFyZSBzbGlnaHRseQorZGlmZmVyZW50LiAgTmF0dXJhbGx5LCBpZiB0aGV5IHdlcmVuJ3QgZGlmZmVyZW50LCB0aGVyZSB3b3VsZCBiZSBubworcmVhc29uIHRvIGNvbXBpbGUgdGhlbSBtdWx0aXBsZSB0aW1lcy4KKworVGhpcyBpcyBhIG5vdCBhIHBhcnRpY3VsYXJseSBnb29kIHByb2dyYW1taW5nIHRlY2huaXF1ZSwgYW5kIGZ1dHVyZSBCRkQKK3dvcmsgc2hvdWxkIGF2b2lkIGl0LgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorU2luY2UgdGhpcyB0ZWNobmlxdWUgaXMgcmFyZWx5IHVzZWQsIGV2ZW4gZXhwZXJpZW5jZWQgQyBwcm9ncmFtbWVycyBmaW5kCitpdCBjb25mdXNpbmcuCisKK0BpdGVtCitJdCBpcyBkaWZmaWN1bHQgdG8gZGVidWcgcHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCwgc2luY2UgdGhlcmUgaXMgbm8gd2F5Cit0byBkZXNjcmliZSB3aGljaCB2ZXJzaW9uIG9mIGEgcGFydGljdWxhciBmdW5jdGlvbiB5b3UgYXJlIGxvb2tpbmcgYXQuCisKK0BpdGVtCitQcm9ncmFtcyB3aGljaCB1c2UgQkZEIHdpbmQgdXAgaW5jb3Jwb3JhdGluZyB0d28gb3IgbW9yZSBzbGlnaHRseQorZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLCB3aGljaCB3YXN0ZXMgc3BhY2UgaW4gdGhlCitleGVjdXRhYmxlLgorCitAaXRlbQorVGhpcyB0ZWNobmlxdWUgaXMgbmV2ZXIgcmVxdWlyZWQgbm9yIGlzIGl0IGVzcGVjaWFsbHkgZWZmaWNpZW50LiAgSXQgaXMKK2Fsd2F5cyBwb3NzaWJsZSB0byB1c2Ugc3RhdGljYWxseSBpbml0aWFsaXplZCBzdHJ1Y3R1cmVzIGhvbGRpbmcKK2Z1bmN0aW9uIHBvaW50ZXJzIGFuZCBtYWdpYyBjb25zdGFudHMgaW5zdGVhZC4KK0BlbmQgaXRlbWl6ZQorCitUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzLgorCitAdGFibGUgQGZpbGUKK0BpdGVtIGFvdXQtdGFyZ2V0LmgKK0BjaW5kZXggQGZpbGV7YW91dC10YXJnZXQuaH0KK0Rlc2NyaWJlcyBhIGZldyBmdW5jdGlvbnMgYW5kIHRoZSB0YXJnZXQgdmVjdG9yIGZvciBhLm91dCB0YXJnZXRzLiAgVGhpcworaXMgdXNlZCBieSBpbmRpdmlkdWFsIGEub3V0IHRhcmdldHMgd2l0aCBkaWZmZXJlbnQgZGVmaW5pdGlvbnMgb2YKK0BzYW1we05fVFhUQUREUn0gYW5kIHNpbWlsYXIgYS5vdXQgbWFjcm9zLgorCitAaXRlbSBhb3V0ZjEuaAorQGNpbmRleCBAZmlsZXthb3V0ZjEuaH0KK0ltcGxlbWVudHMgc3RhbmRhcmQgU3VuT1MgYS5vdXQgZmlsZXMuICBJbiBwcmluY2lwbGUgaXQgc3VwcG9ydHMgNjQgYml0CithLm91dCB0YXJnZXRzIGJhc2VkIG9uIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7QVJDSF9TSVpFfSwgYnV0CitzaW5jZSBhbGwga25vd24gYS5vdXQgdGFyZ2V0cyBhcmUgMzIgYml0cywgdGhpcyBjb2RlIG1heSBvciBtYXkgbm90Cit3b3JrLiAgVGhpcyBmaWxlIGlzIG9ubHkgaW5jbHVkZWQgYnkgYSBmZXcgb3RoZXIgZmlsZXMsIGFuZCBpdCBpcworZGlmZmljdWx0IHRvIGp1c3RpZnkgaXRzIGV4aXN0ZW5jZS4KKworQGl0ZW0gYW91dHguaAorQGNpbmRleCBAZmlsZXthb3V0eC5ofQorSW1wbGVtZW50cyBiYXNpYyBhLm91dCBzdXBwb3J0IHJvdXRpbmVzLiAgVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCBmb3IKK2VpdGhlciAzMiBvciA2NCBiaXQgc3VwcG9ydC4gIFNpbmNlIGFsbCBrbm93biBhLm91dCB0YXJnZXRzIGFyZSAzMiBiaXRzLAordGhlIDY0IGJpdCBzdXBwb3J0IG1heSBvciBtYXkgbm90IHdvcmsuICBJIGJlbGlldmUgdGhlIG9yaWdpbmFsCitpbnRlbnRpb24gd2FzIHRoYXQgdGhpcyBmaWxlIHdvdWxkIG9ubHkgYmUgaW5jbHVkZWQgYnkgQHNhbXB7YW91dDMyLmN9CithbmQgQHNhbXB7YW91dDY0LmN9LCBhbmQgdGhhdCBvdGhlciBhLm91dCB0YXJnZXRzIHdvdWxkIHNpbXBseSByZWZlciB0bwordGhlIGZ1bmN0aW9ucyBpdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgc29tZSBvdGhlciBhLm91dCB0YXJnZXRzCitzdGFydGVkIGluY2x1ZGluZyBpdCBkaXJlY3RseSwgbGVhZGluZyB0byBhIHNvbWV3aGF0IGNvbmZ1c2VkIHN0YXRlIG9mCithZmZhaXJzLgorCitAaXRlbSBjb2ZmY29kZS5oCitAY2luZGV4IEBmaWxle2NvZmZjb2RlLmh9CitJbXBsZW1lbnRzIGJhc2ljIENPRkYgc3VwcG9ydCByb3V0aW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBldmVyeQorQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIGNvZGUgd2hpY2ggaGFuZGxlcyBDT0ZGIG1hZ2ljIG51bWJlcnMgYXMKK3dlbGwgYXMgdmFyaW91cyBob29rIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMgaW4KK0BmaWxle2NvZmZnZW4uY30uICBUaGlzIGZpbGUgaXMgY29udHJvbGxlZCBieSBhIG51bWJlciBvZiBkaWZmZXJlbnQKK21hY3JvcywgYW5kIG1vcmUgYXJlIGFkZGVkIHJlZ3VsYXJseS4KKworQGl0ZW0gY29mZnN3YXAuaAorQGNpbmRleCBAZmlsZXtjb2Zmc3dhcC5ofQorSW1wbGVtZW50cyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5CitAZmlsZXtjb2ZmY29kZS5ofSwgYW5kIHRodXMgYnkgZXZlcnkgQ09GRiB0YXJnZXQuICBJdCBpbXBsZW1lbnRzIHRoZQorcm91dGluZXMgd2hpY2ggc3dhcCBDT0ZGIHN0cnVjdHVyZXMgYmV0d2VlbiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwKK2Zvcm1hdC4gIFRoZSBtYWluIGNvbnRyb2wgZm9yIHRoaXMgZmlsZSBpcyB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlCitkZWZpbml0aW9ucyBpbiB0aGUgZmlsZXMgaW4gdGhlIEBmaWxle2luY2x1ZGUvY29mZn0gZGlyZWN0b3J5LiAgQSBDT0ZGCit0YXJnZXQgZmlsZSB3aWxsIGluY2x1ZGUgb25lIG9mIHRob3NlIGZpbGVzIGJlZm9yZSBpbmNsdWRpbmcKK0BmaWxle2NvZmZjb2RlLmh9IGFuZCB0aHVzIEBmaWxle2NvZmZzd2FwLmh9LiAgVGhlcmUgYXJlIGEgZmV3IG90aGVyCittYWNyb3Mgd2hpY2ggYWZmZWN0IEBmaWxle2NvZmZzd2FwLmh9IGFzIHdlbGwsIG1vc3RseSBkZXNjcmliaW5nIHdoZXRoZXIKK2NlcnRhaW4gZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBleHRlcm5hbCBzdHJ1Y3R1cmVzLgorCitAaXRlbSBlY29mZnN3YXAuaAorQGNpbmRleCBAZmlsZXtlY29mZnN3YXAuaH0KK0ltcGxlbWVudHMgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGlzIGlzIGxpa2UgQGZpbGV7Y29mZnN3YXAuaH0sIGJ1dAorZm9yIEVDT0ZGLiAgSXQgaXMgaW5jbHVkZWQgYnkgdGhlIEVDT0ZGIHRhcmdldCBmaWxlcyAob2Ygd2hpY2ggdGhlcmUgYXJlCitvbmx5IHR3bykuICBUaGUgY29udHJvbCBpcyB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0VDT0ZGXzMyfSBvcgorQHNhbXB7RUNPRkZfNjR9LgorCitAaXRlbSBlbGZjb2RlLmgKK0BjaW5kZXggQGZpbGV7ZWxmY29kZS5ofQorSW1wbGVtZW50cyBFTEYgZnVuY3Rpb25zIHRoYXQgdXNlIGV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gIFRoaXMKK2ZpbGUgaXMgaW5jbHVkZWQgYnkgdHdvIG90aGVyIGZpbGVzOiBAZmlsZXtlbGYzMi5jfSBhbmQgQGZpbGV7ZWxmNjQuY30uCitJdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBAc2FtcHtBUkNIX1NJWkV9IG1hY3JvIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUKK0BzYW1wezMyfSBvciBAc2FtcHs2NH0gYmVmb3JlIGluY2x1ZGluZyBpdC4gIFRoZSBAc2FtcHtOQU1FfSBtYWNybyBpcwordXNlZCBpbnRlcm5hbGx5IHRvIGdpdmUgdGhlIGZ1bmN0aW9ucyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gdGFyZ2V0CitzaXplcy4KKworQGl0ZW0gZWxmY29yZS5oCitAY2luZGV4IEBmaWxle2VsZmNvcmUuaH0KK0xpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gRUxGIGNvcmUKK2ZpbGVzLiAgVGhpcyBpcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCisKK0BpdGVtIGVsZmxpbmsuaAorQGNpbmRleCBAZmlsZXtlbGZsaW5rLmh9CitMaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEVMRiBsaW5rZXIuICBUaGlzCitpcyBpbmNsdWRlZCBvbmx5IGJ5IEBmaWxle2VsZmNvZGUuaH0uCisKK0BpdGVtIGVsZnh4LXRhcmdldC5oCitAY2luZGV4IEBmaWxle2VsZnh4LXRhcmdldC5ofQorVGhpcyBmaWxlIGlzIHRoZSBzb3VyY2UgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZXMgQGZpbGV7ZWxmMzItdGFyZ2V0Lmh9CithbmQgQGZpbGV7ZWxmNjQtdGFyZ2V0Lmh9LCBvbmUgb2Ygd2hpY2ggaXMgaW5jbHVkZWQgYnkgZXZlcnkgRUxGIHRhcmdldC4KK0l0IGRlZmluZXMgdGhlIEVMRiB0YXJnZXQgdmVjdG9yLgorCitAaXRlbSBmcmVlYnNkLmgKK0BjaW5kZXggQGZpbGV7ZnJlZWJzZC5ofQorUHJlc3VtYWJseSBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhbGwgRnJlZUJTRCB0YXJnZXRzLCBidXQgaW4gZmFjdAordGhlcmUgaXMgb25seSBvbmUgc3VjaCB0YXJnZXQsIEBzYW1we2kzODYtZnJlZWJzZH0uICBUaGlzIGRlZmluZXMgYQorZnVuY3Rpb24gdXNlZCB0byBzZXQgdGhlIHJpZ2h0IG1hZ2ljIG51bWJlciBmb3IgRnJlZUJTRCwgYXMgd2VsbCBhcwordmFyaW91cyBtYWNyb3MsIGFuZCBpbmNsdWRlcyBAZmlsZXthb3V0LXRhcmdldC5ofS4KKworQGl0ZW0gbmV0YnNkLmgKK0BjaW5kZXggQGZpbGV7bmV0YnNkLmh9CitMaWtlIEBmaWxle2ZyZWVic2QuaH0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIGZpbGVzIHdoaWNoIGluY2x1ZGUKK2l0LgorCitAaXRlbSBubG0tdGFyZ2V0LmgKK0BjaW5kZXggQGZpbGV7bmxtLXRhcmdldC5ofQorRGVmaW5lcyB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgYSBzdGFuZGFyZCBOTE0gdGFyZ2V0LgorCitAaXRlbSBubG1jb2RlLmgKK0BjaW5kZXggQGZpbGV7bmxtY29kZS5ofQorTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBvbmx5IGluY2x1ZGVkIGJ5CitAZmlsZXtubG0zMi5jfSBhbmQgQGZpbGV7bmxtNjQuY30sIGJvdGggb2Ygd2hpY2ggZGVmaW5lIHRoZSBtYWNybworQHNhbXB7QVJDSF9TSVpFfSB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gIFRoZXJlIGFyZSBubyA2NCBiaXQgTkxNCit0YXJnZXRzIGFueWhvdywgc28gdGhpcyBpcyBzb3J0IG9mIHVzZWxlc3MuCisKK0BpdGVtIG5sbXN3YXAuaAorQGNpbmRleCBAZmlsZXtubG1zd2FwLmh9CitMaWtlIEBmaWxle2NvZmZzd2FwLmh9LCBidXQgZm9yIE5MTSB0YXJnZXRzLiAgVGhpcyBpcyBpbmNsdWRlZCBieSBlYWNoCitOTE0gdGFyZ2V0LCBidXQgSSB0aGluayBpdCB3aW5kcyB1cCBjb21waWxpbmcgdG8gdGhlIGV4YWN0IHNhbWUgY29kZSBmb3IKK2V2ZXJ5IHRhcmdldCwgYW5kIGFzIHN1Y2ggaXMgZmFpcmx5IHVzZWxlc3MuCisKK0BpdGVtIHBlaWNvZGUuaAorQGNpbmRleCBAZmlsZXtwZWljb2RlLmh9CitQcm92aWRlcyBzd2FwcGluZyByb3V0aW5lcyBhbmQgb3RoZXIgaG9va3MgZm9yIFBFIHRhcmdldHMuCitAZmlsZXtjb2ZmY29kZS5ofSB3aWxsIGluY2x1ZGUgdGhpcyByYXRoZXIgdGhhbiBAZmlsZXtjb2Zmc3dhcC5ofSBmb3IgYQorUEUgdGFyZ2V0LiAgVGhpcyBkZWZpbmVzIFBFIHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBDT0ZGIHN3YXBwaW5nCityb3V0aW5lcywgYW5kIGFsc28gZGVmaW5lcyBzb21lIG1hY3JvcyB3aGljaCBjb250cm9sIEBmaWxle2NvZmZjb2RlLmh9CitpdHNlbGYuCitAZW5kIHRhYmxlCisKK0Bub2RlIEJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCitAc2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZworQGNpbmRleCBiZmQgcmVsb2NhdGlvbiBoYW5kbGluZworQGNpbmRleCByZWxvY2F0aW9ucyBpbiBiZmQKKworVGhlIGhhbmRsaW5nIG9mIHJlbG9jYXRpb25zIGlzIG9uZSBvZiB0aGUgbW9yZSBjb25mdXNpbmcgYXNwZWN0cyBvZiBCRkQuCitSZWxvY2F0aW9uIGhhbmRsaW5nIGhhcyBiZWVuIGltcGxlbWVudGVkIGluIHZhcmlvdXMgZGlmZmVyZW50IHdheXMsIGFsbAorc29tZXdoYXQgaW5jb21wYXRpYmxlLCBub25lIHBlcmZlY3QuCisKK0BtZW51CisqIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzOjoJQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKKyogQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zOjoJQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCisqIEJGRCByZWxvY2F0aW9uIGNvZGVzOjoJQkZEIHJlbG9jYXRpb24gY29kZXMKKyogQkZEIHJlbG9jYXRpb24gZnV0dXJlOjoJQkZEIHJlbG9jYXRpb24gZnV0dXJlCitAZW5kIG1lbnUKKworQG5vZGUgQkZEIHJlbG9jYXRpb24gY29uY2VwdHMKK0BzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCisKK0EgcmVsb2NhdGlvbiBpcyBhbiBhY3Rpb24gd2hpY2ggdGhlIGxpbmtlciBtdXN0IHRha2Ugd2hlbiBsaW5raW5nLiAgSXQKK2Rlc2NyaWJlcyBhIGNoYW5nZSB0byB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhlIGNoYW5nZSBpcyBub3JtYWxseQorYmFzZWQgb24gdGhlIGZpbmFsIHZhbHVlIG9mIG9uZSBvciBtb3JlIHN5bWJvbHMuICBSZWxvY2F0aW9ucyBhcmUKK2NyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGNyZWF0ZXMgYW4gb2JqZWN0IGZpbGUuCisKK01vc3QgcmVsb2NhdGlvbnMgYXJlIHNpbXBsZS4gIEEgdHlwaWNhbCBzaW1wbGUgcmVsb2NhdGlvbiBpcyB0byBzZXQgMzIKK2JpdHMgYXQgYSBnaXZlbiBvZmZzZXQgaW4gYSBzZWN0aW9uIHRvIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgdHlwZQorb2YgcmVsb2NhdGlvbiB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGNvZGUgbGlrZSBAY29kZXtpbnQgKnAgPSAmaTt9IHdoZXJlCitAc2FtcHtwfSBhbmQgQHNhbXB7aX0gYXJlIGdsb2JhbCB2YXJpYWJsZXMuICBBIHJlbG9jYXRpb24gZm9yIHRoZSBzeW1ib2wKK0BzYW1we2l9IHdvdWxkIGJlIGdlbmVyYXRlZCBzdWNoIHRoYXQgdGhlIGxpbmtlciB3b3VsZCBpbml0aWFsaXplIHRoZQorYXJlYSBvZiBtZW1vcnkgd2hpY2ggaG9sZHMgdGhlIHZhbHVlIG9mIEBzYW1we3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUKK3N5bWJvbCBAc2FtcHtpfS4KKworU2xpZ2h0bHkgbW9yZSBjb21wbGV4IHJlbG9jYXRpb25zIG1heSBpbmNsdWRlIGFuIGFkZGVuZCwgd2hpY2ggaXMgYQorY29uc3RhbnQgdG8gYWRkIHRvIHRoZSBzeW1ib2wgdmFsdWUgYmVmb3JlIHVzaW5nIGl0LiAgSW4gc29tZSBjYXNlcyBhCityZWxvY2F0aW9uIHdpbGwgcmVxdWlyZSBhZGRpbmcgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUgZXhpc3RpbmcgY29udGVudHMKK29mIHRoZSBzZWN0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIG90aGVycyB0aGUgcmVsb2NhdGlvbiB3aWxsIHNpbXBseQorcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgc3ltYm9sIHZhbHVlLiAgU29tZQorcmVsb2NhdGlvbnMgYXJlIFBDIHJlbGF0aXZlLCBzbyB0aGF0IHRoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCitzZWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFuZCB0aGUgZmluYWwKK2FkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGVudHMuCisKK0luIGdlbmVyYWwsIHJlbG9jYXRpb25zIGNhbiBiZSBhcmJpdHJhcmlseSBjb21wbGV4LiAgRm9yIGV4YW1wbGUsCityZWxvY2F0aW9ucyB1c2VkIGluIGR5bmFtaWMgbGlua2luZyBzeXN0ZW1zIG9mdGVuIHJlcXVpcmUgdGhlIGxpbmtlciB0bworYWxsb2NhdGUgc3BhY2UgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiBhbmQgdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQKK3NlY3Rpb24gYXMgdGhlIHZhbHVlIHRvIHN0b3JlLiAgSW4gdGhlIElFRUUgb2JqZWN0IGZpbGUgZm9ybWF0LAorcmVsb2NhdGlvbnMgbWF5IGludm9sdmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zLgorCitXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZSBsaW5rZXIgbWF5IG9yIG1heSBub3QgaGF2ZSB0byBkbworYW55dGhpbmcgd2l0aCBhIHJlbG9jYXRpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorcmVsb2NhdGlvbi4gIFNpbXBsZSByZWxvY2F0aW9ucyBnZW5lcmFsbHkgZG8gbm90IHJlcXVpcmUgYW55IHNwZWNpYWwKK2FjdGlvbi4KKworQG5vZGUgQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCitAc3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBmdW5jdGlvbnMKKworSW4gQkZELCBlYWNoIHNlY3Rpb24gaGFzIGFuIGFycmF5IG9mIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMuICBFYWNoCitzdHJ1Y3R1cmUgaGFzIGEgcG9pbnRlciB0byBhIHN5bWJvbCwgYW4gYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24sIGFuCithZGRlbmQsIGFuZCBhIHBvaW50ZXIgdG8gYSBAc2FtcHtyZWxvY19ob3d0b19zdHJ1Y3R9IHN0cnVjdHVyZS4gIFRoZQoraG93dG8gc3RydWN0dXJlIGhhcyBhIGJ1bmNoIG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSByZWxvYywgaW5jbHVkaW5nIGEKK3R5cGUgZmllbGQuICBUaGUgdHlwZSBmaWVsZCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0CitiYWNrZW5kOyBub25lIG9mIHRoZSBnZW5lcmljIGNvZGUgaW4gQkZEIGV4YW1pbmVzIGl0LgorCitPcmlnaW5hbGx5LCB0aGUgZnVuY3Rpb24gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gd2FzIHN1cHBvc2VkIHRvCitoYW5kbGUgYWxsIHJlbG9jYXRpb25zLiAgSW4gdGhlb3J5LCBtYW55IHJlbG9jYXRpb25zIHdvdWxkIGJlIHNpbXBsZQorZW5vdWdoIHRvIGJlIGRlc2NyaWJlZCBieSB0aGUgZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUuICBGb3IgdGhvc2UKK3RoYXQgd2VyZW4ndCwgdGhlIGhvd3RvIHN0cnVjdHVyZSBpbmNsdWRlZCBhIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259CitmaWVsZCB0byB1c2UgYXMgYW4gZXNjYXBlLgorCitXaGlsZSB0aGlzIHNlZW1zIHBsYXVzaWJsZSwgYSBsb29rIGF0IEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259CitzaG93cyB0aGF0IGl0IGZhaWxlZC4gIFRoZSBmdW5jdGlvbiBoYXMgb2RkIHNwZWNpYWwgY2FzZXMuICBTb21lIG9mIHRoZQorZmllbGRzIGluIHRoZSBob3d0byBzdHJ1Y3R1cmUsIHN1Y2ggYXMgQHNhbXB7cGNyZWxfb2Zmc2V0fSwgd2VyZSBub3QKK2FkZXF1YXRlbHkgZG9jdW1lbnRlZC4KKworVGhlIGxpbmtlciB1c2VzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHRvIGRvIGFsbCByZWxvY2F0aW9ucyB3aGVuCit0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMgKGUuZy4sIHdoZW4gZ2VuZXJhdGluZworUy1yZWNvcmRzKS4gIFRoZSBnZW5lcmljIGxpbmtlciBjb2RlLCB3aGljaCBpcyB1c2VkIGJ5IGFsbCB0YXJnZXRzIHdoaWNoCitkbyBub3QgZGVmaW5lIHRoZWlyIG93biBzcGVjaWFsIHB1cnBvc2UgbGlua2VyLCB1c2VzCitAc2FtcHtiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2ggZm9yIG1vc3QgdGFyZ2V0cyB0dXJucworaW50byBhIGNhbGwgdG8gQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSwgd2hpY2gKK2NhbGxzIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LiAgU28gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KK2lzIHN0aWxsIHdpZGVseSB1c2VkLCB3aGljaCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gY2hhbmdlLCBzaW5jZSBpdCBpcworZGlmZmljdWx0IHRvIHRlc3QgYWxsIHBvc3NpYmxlIGNhc2VzLgorCitUaGUgYXNzZW1ibGVyIHVzZWQgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gZm9yIGEgd2hpbGUuICBUaGlzCit0dXJuZWQgb3V0IHRvIGJlIHRoZSB3cm9uZyB0aGluZyB0byBkbywgc2luY2UKK0BzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHdhcyB3cml0dGVuIHRvIGhhbmRsZSByZWxvY2F0aW9ucyBvbiBhbgorZXhpc3Rpbmcgb2JqZWN0IGZpbGUsIHdoaWxlIHRoZSBhc3NlbWJsZXIgbmVlZGVkIHRvIGNyZWF0ZSByZWxvY2F0aW9ucworaW4gYSBuZXcgb2JqZWN0IGZpbGUuICBUaGUgYXNzZW1ibGVyIHdhcyBjaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IGZ1bmN0aW9uCitAc2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSBpbnN0ZWFkLCBhbmQgQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0KK3dhcyBjcmVhdGVkIGFzIGEgY29weSBvZiBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4KKworVW5mb3J0dW5hdGVseSwgdGhlIHdvcmsgZGlkIG5vdCBwcm9ncmVzcyBhbnkgZmFydGhlciwgc28KK0BzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IHJlbWFpbnMgYSBzaW1wbGUgY29weSBvZgorQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0sIHdpdGggYWxsIHRoZSBvZGQgc3BlY2lhbCBjYXNlcyBhbmQKK2NvbmZ1c2luZyBjb2RlLiAgVGhpcyBhZ2FpbiBpcyBkaWZmaWN1bHQgdG8gY2hhbmdlLCBiZWNhdXNlIGFnYWluIGFueQorY2hhbmdlIGNhbiBhZmZlY3QgYW55IGFzc2VtYmxlciB0YXJnZXQsIGFuZCBzbyBpcyBkaWZmaWN1bHQgdG8gdGVzdC4KKworVGhlIG5ldyBsaW5rZXIsIHdoZW4gdXNpbmcgdGhlIHNhbWUgb2JqZWN0IGZpbGUgZm9ybWF0IGZvciBhbGwgaW5wdXQKK2ZpbGVzIGFuZCB0aGUgb3V0cHV0IGZpbGUsIGRvZXMgbm90IGNvbnZlcnQgcmVsb2NhdGlvbnMgaW50bworQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcywgc28gaXQgY2FuIG5vdCB1c2UKK0BzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGF0IGFsbC4gIEluc3RlYWQsIHVzZXJzIG9mIHRoZSBuZXcgbGlua2VyCithcmUgZXhwZWN0ZWQgdG8gd3JpdGUgYSBAc2FtcHtyZWxvY2F0ZV9zZWN0aW9ufSBmdW5jdGlvbiB3aGljaCB3aWxsCitoYW5kbGUgcmVsb2NhdGlvbnMgaW4gYSB0YXJnZXQgc3BlY2lmaWMgZmFzaGlvbi4KKworVGhlcmUgYXJlIHR3byBoZWxwZXIgZnVuY3Rpb25zIGZvciB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbjoKK0BzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0gYW5kIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LgorVGhlc2UgZnVuY3Rpb25zIHVzZSBhIGhvd3RvIHN0cnVjdHVyZSwgYnV0IHRoZXkgQGVtcGh7ZG8gbm90fSB1c2UgdGhlCitAc2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZC4gIFNpbmNlIHRoZSBmdW5jdGlvbnMgYXJlIG5vcm1hbGx5IGNhbGxlZAorZnJvbSB0YXJnZXQgc3BlY2lmaWMgY29kZSwgdGhlIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIGFkZHMKK2xpdHRsZTsgYW55IHJlbG9jYXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBjYW4gYmUgaGFuZGxlZAord2l0aG91dCBjYWxsaW5nIHRob3NlIGZ1bmN0aW9ucy4KKworU28sIGlmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyB0YXJnZXQsIG9yIGFkZCBhIG5ldyByZWxvY2F0aW9uIHRvIGFuCitleGlzdGluZyB0YXJnZXQsIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitNYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB3aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBzaG91bGQKK2xvb2sgbGlrZSBhZnRlciBhc3NlbWJseSwgYWZ0ZXIgYSByZWxvY2F0ZWFibGUgbGluaywgYW5kIGFmdGVyIGEgZmluYWwKK2xpbmsuICBNYWtlIHN1cmUgeW91IGNsZWFybHkgdW5kZXJzdGFuZCB0aGUgb3BlcmF0aW9ucyB0aGUgbGlua2VyIG11c3QKK3BlcmZvcm0gZHVyaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIGR1cmluZyBhIGZpbmFsIGxpbmsuCisKK0BpdGVtCitXcml0ZSBhIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlIHJlbG9jYXRpb24uICBUaGUgaG93dG8gc3RydWN0dXJlIGlzCitmbGV4aWJsZSBlbm91Z2ggdG8gcmVwcmVzZW50IGFueSByZWxvY2F0aW9uIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGJ5CitzZXR0aW5nIGEgY29udGlndW91cyBiaXRmaWVsZCBpbiB0aGUgZGVzdGluYXRpb24gdG8gdGhlIHZhbHVlIG9mIGEKK3N5bWJvbCwgcG9zc2libHkgd2l0aCBhbiBhZGRlbmQsIHBvc3NpYmx5IGFkZGluZyB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQordmFsdWUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkZXN0aW5hdGlvbi4KKworQGl0ZW0KK0NoYW5nZSB0aGUgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIHlvdXIgcmVsb2NhdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbAorY2FsbCBAc2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSwgc28geW91ciBob3d0byBzdHJ1Y3R1cmUgaGFzIHRvIGJlCithYmxlIHRvIGhhbmRsZSB0aGF0LiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUgQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0KK2ZpZWxkIHRvIGhhbmRsZSBhc3NlbWJseSBjb3JyZWN0bHkuICBCZSBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IGFueSBjb2RlCit5b3Ugd3JpdGUgdG8gaGFuZGxlIHRoZSBhc3NlbWJsZXIgd2lsbCBhbHNvIHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgYQorcmVsb2NhdGVhYmxlIGxpbmsuICBGb3IgZXhhbXBsZSwgc2VlIEBzYW1we2JmZF9lbGZfZ2VuZXJpY19yZWxvY30uCisKK0BpdGVtCitUZXN0IHRoZSBhc3NlbWJsZXIuICBDb25zaWRlciB0aGUgY2FzZXMgb2YgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuCit1bmRlZmluZWQgc3ltYm9sLCBhIGNvbW1vbiBzeW1ib2wsIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIG9iamVjdCBmaWxlCitpbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUgaW4gYQorZGlmZmVyZW50IHNlY3Rpb24uICBUaGVzZSBjYXNlcyBtYXkgbm90IGFsbCBiZSBhcHBsaWNhYmxlIGZvciB5b3VyCityZWxvYy4KKworQGl0ZW0KK0lmIHlvdXIgdGFyZ2V0IHVzZXMgdGhlIG5ldyBsaW5rZXIsIHdoaWNoIGlzIHJlY29tbWVuZGVkLCBhZGQgYW55CityZXF1aXJlZCBoYW5kbGluZyB0byB0aGUgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb24gZnVuY3Rpb24uICBJbiBzaW1wbGUKK2Nhc2VzIHRoaXMgd2lsbCBqdXN0IGludm9sdmUgYSBjYWxsIHRvIEBzYW1we19iZmRfZmluYWxfbGlua19yZWxvY2F0ZX0KK29yIEBzYW1we19iZmRfcmVsb2NhdGVfY29udGVudHN9LCBkZXBlbmRpbmcgdXBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKK3JlbG9jYXRpb24gYW5kIHdoZXRoZXIgdGhlIGxpbmsgaXMgcmVsb2NhdGVhYmxlIG9yIG5vdC4KKworQGl0ZW0KK1Rlc3QgdGhlIGxpbmtlci4gIFRlc3QgdGhlIGNhc2Ugb2YgYSBmaW5hbCBsaW5rLiAgSWYgdGhlIHJlbG9jYXRpb24gY2FuCitvdmVyZmxvdywgdXNlIGEgbGlua2VyIHNjcmlwdCB0byBmb3JjZSBhbiBvdmVyZmxvdyBhbmQgbWFrZSBzdXJlIHRoZQorZXJyb3IgaXMgcmVwb3J0ZWQgY29ycmVjdGx5LiAgVGVzdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCB3aGV0aGVyIHRoZQorc3ltYm9sIGlzIGRlZmluZWQgb3IgdW5kZWZpbmVkIGluIHRoZSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgRm9yIGJvdGggdGhlCitmaW5hbCBhbmQgcmVsb2NhdGVhYmxlIGxpbmssIHRlc3QgdGhlIGNhc2Ugd2hlbiB0aGUgc3ltYm9sIGlzIGEgY29tbW9uCitzeW1ib2wsIHdoZW4gdGhlIHN5bWJvbCBsb29rZWQgbGlrZSBhIGNvbW1vbiBzeW1ib2wgYnV0IGJlY2FtZSBhIGRlZmluZWQKK3N5bWJvbCwgd2hlbiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUsIGFuZCB3aGVuCit0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuCisKK0BpdGVtCitJbiBvcmRlciBmb3IgbGlua2luZyB0byBhbm90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcyBTLXJlY29yZHMsCit0byB3b3JrIGNvcnJlY3RseSwgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0gaGFzIHRvIGRvIHRoZSByaWdodAordGhpbmcgZm9yIHRoZSByZWxvY2F0aW9uLiAgWW91IG1heSBuZWVkIHRvIHNldCB0aGUKK0BzYW1we3NwZWNpYWxfZnVuY3Rpb259IGZpZWxkIHRvIGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIFRlc3QgdGhpcyBieQorZG9pbmcgYSBsaW5rIGluIHdoaWNoIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzIFMtcmVjb3Jkcy4KKworQGl0ZW0KK1VzaW5nIHRoZSBsaW5rZXIgdG8gZ2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCBpbiBhIGRpZmZlcmVudCBvYmplY3QKK2ZpbGUgZm9ybWF0IGlzIGltcG9zc2libGUgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc28geW91IGdlbmVyYWxseSBkb24ndAoraGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LiAgTGlua2luZyBpbnB1dCBmaWxlcyBvZiBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKK2Zvcm1hdHMgdG9nZXRoZXIgaXMgcXVpdGUgdW51c3VhbCwgYnV0IGlmIHlvdSdyZSByZWFsbHkgZGVkaWNhdGVkIHlvdQorbWF5IHdhbnQgdG8gY29uc2lkZXIgdGVzdGluZyB0aGlzIGNhc2UsIGJvdGggd2hlbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlCitmb3JtYXQgaXMgdGhlIHNhbWUgYXMgeW91ciBmb3JtYXQsIGFuZCB3aGVuIGl0IGlzIGRpZmZlcmVudC4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBCRkQgcmVsb2NhdGlvbiBjb2RlcworQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gY29kZXMKKworQkZEIGhhcyBhbm90aGVyIHdheSBvZiBkZXNjcmliaW5nIHJlbG9jYXRpb25zIGJlc2lkZXMgdGhlIGhvd3RvCitzdHJ1Y3R1cmVzIGRlc2NyaWJlZCBhYm92ZTogdGhlIGVudW0gQHNhbXB7YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlfS4KKworRXZlcnkga25vd24gcmVsb2NhdGlvbiB0eXBlIGNhbiBiZSBkZXNjcmliZWQgYXMgYSB2YWx1ZSBpbiB0aGlzCitlbnVtZXJhdGlvbi4gIFRoZSBlbnVtZXJhdGlvbiBjb250YWlucyBtYW55IHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9ucywKK2J1dCB3aGVyZSB0d28gb3IgbW9yZSB0YXJnZXRzIGhhdmUgdGhlIHNhbWUgcmVsb2NhdGlvbiwgYSBzaW5nbGUgY29kZSBpcwordXNlZC4gIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIHZhbHVlIEBzYW1we0JGRF9SRUxPQ18zMn0gaXMgdXNlZCBmb3IgYWxsCitzaW1wbGUgMzIgYml0IHJlbG9jYXRpb24gdHlwZXMuCisKK1RoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyByZWxvY2F0aW9uIGNvZGUgaXMgdG8gZ2l2ZSB0aGUgYXNzZW1ibGVyIHNvbWUKK21lY2hhbmlzbSB0byBjcmVhdGUgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluIG9yZGVyIGZvciB0aGUKK2Fzc2VtYmxlciB0byBjcmVhdGUgYW4gQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlLCBpdCBoYXMgdG8gYmUgYWJsZSB0bworb2J0YWluIGEgaG93dG8gc3RydWN0dXJlLiAgVGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0sCit3aGljaCBzaW1wbHkgY2FsbHMgdGhlIHRhcmdldCB2ZWN0b3IgZW50cnkgcG9pbnQKK0BzYW1we3JlbG9jX3R5cGVfbG9va3VwfSwgdGFrZXMgYSByZWxvY2F0aW9uIGNvZGUgYW5kIHJldHVybnMgYSBob3d0bworc3RydWN0dXJlLgorCitUaGUgZnVuY3Rpb24gQHNhbXB7YmZkX2dldF9yZWxvY19jb2RlX25hbWV9IHJldHVybnMgdGhlIG5hbWUgb2YgYQorcmVsb2NhdGlvbiBjb2RlLiAgVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy4KKworVXNpbmcgYm90aCBob3d0byBzdHJ1Y3R1cmVzIGFuZCByZWxvY2F0aW9uIGNvZGVzIGNhbiBiZSBzb21ld2hhdAorY29uZnVzaW5nLiAgVGhlcmUgYXJlIG1hbnkgcHJvY2Vzc29yIHNwZWNpZmljIHJlbG9jYXRpb24gY29kZXMuCitIb3dldmVyLCB0aGUgcmVsb2NhdGlvbiBpcyBvbmx5IGZ1bGx5IGRlZmluZWQgYnkgdGhlIGhvd3RvIHN0cnVjdHVyZS4KK1RoZSBzYW1lIHJlbG9jYXRpb24gY29kZSB3aWxsIG1hcCB0byBkaWZmZXJlbnQgaG93dG8gc3RydWN0dXJlcyBpbgorZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZXhhbXBsZSwgdGhlIGFkZGVuZCBoYW5kbGluZyBtYXkgYmUKK2RpZmZlcmVudC4KKworTW9zdCBvZiB0aGUgcmVsb2NhdGlvbiBjb2RlcyBhcmUgbm90IHJlYWxseSBnZW5lcmFsLiAgVGhlIGFzc2VtYmxlciBjYW4KK25vdCB1c2UgdGhlbSB3aXRob3V0IGFscmVhZHkgdW5kZXJzdGFuZGluZyB3aGF0IHNvcnRzIG9mIHJlbG9jYXRpb25zIGNhbgorYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlCityZWxvY2F0aW9uIGNvZGVzIHdpdGggc29tZXRoaW5nIHNpbXBsZXIuCisKK0Bub2RlIEJGRCByZWxvY2F0aW9uIGZ1dHVyZQorQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gZnV0dXJlCisKK0NsZWFybHkgdGhlIGN1cnJlbnQgQkZEIHJlbG9jYXRpb24gc3VwcG9ydCBpcyBpbiBiYWQgc2hhcGUuICBBCit3aG9sZXNjYWxlIHJld3JpdGUgd291bGQgYmUgdmVyeSBkaWZmaWN1bHQsIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZQordGhvcm91Z2ggdGVzdGluZyBvZiBldmVyeSBCRkQgdGFyZ2V0LiAgU28gc29tZSBzb3J0IG9mIGluY3JlbWVudGFsCitjaGFuZ2UgaXMgcmVxdWlyZWQuCisKK015IHZhZ3VlIHRob3VnaHRzIG9uIHRoaXMgd291bGQgaW52b2x2ZSBkZWZpbmluZyBhIG5ldywgY2xlYXJseSBkZWZpbmVkLAoraG93dG8gc3RydWN0dXJlLiAgU29tZSBtZWNoYW5pc20gd291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZQorb2YgaG93dG8gc3RydWN0dXJlIHdhcyBiZWluZyB1c2VkIGJ5IGEgcGFydGljdWxhciBmb3JtYXQuCisKK1RoZSBuZXcgaG93dG8gc3RydWN0dXJlIHdvdWxkIGNsZWFybHkgZGVmaW5lIHRoZSByZWxvY2F0aW9uIGJlaGF2aW91ciBpbgordGhlIGNhc2Ugb2YgYW4gYXNzZW1ibHksIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBhIGZpbmFsIGxpbmsuICBBdAorbGVhc3Qgb25lIHNwZWNpYWwgZnVuY3Rpb24gd291bGQgYmUgZGVmaW5lZCBhcyBhbiBlc2NhcGUsIGFuZCBpdCBtaWdodAorbWFrZSBzZW5zZSB0byBkZWZpbmUgbW9yZS4KKworT25lIG9yIG1vcmUgZ2VuZXJpYyBmdW5jdGlvbnMgc2ltaWxhciB0byBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQord291bGQgYmUgd3JpdHRlbiB0byBoYW5kbGUgdGhlIG5ldyBob3d0byBzdHJ1Y3R1cmUuCisKK1RoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gd3JpdGUgYSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIHJlbG9jYXRlCitzZWN0aW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBuZXcgbGlua2VyLiAgVGhlIHRhcmdldCBzcGVjaWZpYyBjb2RlCit3b3VsZCBwcm92aWRlIHNvbWUgbWVjaGFuaXNtIChhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYW4gaW5pdGlhbAorY29udmVyc2lvbikgdG8gY29udmVydCB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbnMgaW50byBob3d0bworc3RydWN0dXJlcy4KKworSWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBnZW5lcmljIHJlbG9jYXRlIHNlY3Rpb24KK2Z1bmN0aW9uIGZvciB0aGUgZ2VuZXJpYyBsaW5rZXIgYXMgd2VsbC4gIFRoYXQgaXMsIGl0IHdvdWxkIHJlcGxhY2UgdGhlCitAc2FtcHtiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHN9IGZ1bmN0aW9uIHdoaWNoIGlzCitjdXJyZW50bHkgbm9ybWFsbHkgdXNlZC4KKworRm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgRUxGIGR5bmFtaWMgbGlua2luZywgbW9yZSBjb25zaWRlcmF0aW9uIG5lZWRzIHRvCitiZSBnaXZlbiB0byB3cml0aW5nIEVMRiBzcGVjaWZpYyBidXQgRUxGIHRhcmdldCBnZW5lcmljIGNvZGUgdG8gaGFuZGxlCitzcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMgc3VjaCBhcyBHT1QgYW5kIFBMVC4KKworQG5vZGUgQkZEIEVMRiBzdXBwb3J0CitAc2VjdGlvbiBCRkQgRUxGIHN1cHBvcnQKK0BjaW5kZXggZWxmIHN1cHBvcnQgaW4gYmZkCitAY2luZGV4IGJmZCBlbGYgc3VwcG9ydAorCitUaGUgRUxGIG9iamVjdCBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIHR3byBwYXJ0czogYSBnZW5lcmljIEFCSSBhbmQgYQorcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuICBUaGUgRUxGIHN1cHBvcnQgaW4gQkZEIGlzIHNwbGl0IGluIGEKK3NpbWlsYXIgZmFzaGlvbi4gIFRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBpcyBsYXJnZWx5IGtlcHQgd2l0aGluCithIHNpbmdsZSBmaWxlLiAgVGhlIGdlbmVyaWMgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBzZXZlcmFsIG90aGVyIGZpbGVzLgorVGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZAorY29uc3RhbnRzIHVzZWQgYnkgdGhlIGdlbmVyaWMgc3VwcG9ydC4KKworQG1lbnUKKyogQkZEIEVMRiBzZWN0aW9ucyBhbmQgc2VnbWVudHM6OglFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCisqIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0OjoJCUJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0CisqIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQ6OglCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0CisqIEJGRCBFTEYgY29yZSBmaWxlczo6CQkJQkZEIEVMRiBjb3JlIGZpbGVzCisqIEJGRCBFTEYgZnV0dXJlOjoJCQlCRkQgRUxGIGZ1dHVyZQorQGVuZCBtZW51CisKK0Bub2RlIEJGRCBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCitAc3Vic2VjdGlvbiBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzCisKK1RoZSBFTEYgQUJJIHBlcm1pdHMgYSBmaWxlIHRvIGhhdmUgZWl0aGVyIHNlY3Rpb25zIG9yIHNlZ21lbnRzIG9yIGJvdGguCitSZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgb25seSBzZWN0aW9ucy4KK0V4ZWN1dGFibGVzIGNvbnZlbnRpb25hbGx5IGhhdmUgYm90aC4gIENvcmUgZmlsZXMgY29udmVudGlvbmFsbHkgaGF2ZQorb25seSBwcm9ncmFtIHNlZ21lbnRzLgorCitFTEYgc2VjdGlvbnMgYXJlIHNpbWlsYXIgdG8gc2VjdGlvbnMgaW4gb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0czogdGhleQoraGF2ZSBhIG5hbWUsIGEgVk1BLCBmaWxlIGNvbnRlbnRzLCBmbGFncywgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMKK2luZm9ybWF0aW9uLiAgRUxGIHJlbG9jYXRpb25zIGFyZSBzdG9yZWQgaW4gc2VjdGlvbnMgb2YgYSBwYXJ0aWN1bGFyCit0eXBlOyBCRkQgYXV0b21hdGljYWxseSBjb252ZXJ0cyB0aGVzZSBzZWN0aW9ucyBpbnRvIGludGVybmFsIHJlbG9jYXRpb24KK2luZm9ybWF0aW9uLgorCitFTEYgcHJvZ3JhbSBzZWdtZW50cyBhcmUgaW50ZW5kZWQgZm9yIGZhc3QgaW50ZXJwcmV0YXRpb24gYnkgYSBzeXN0ZW0KK2xvYWRlci4gIFRoZXkgaGF2ZSBhIHR5cGUsIGEgVk1BLCBhbiBMTUEsIGZpbGUgY29udGVudHMsIGFuZCBhIGNvdXBsZSBvZgorb3RoZXIgZmllbGRzLiAgV2hlbiBhbiBFTEYgZXhlY3V0YWJsZSBpcyBydW4gb24gYSBVbml4IHN5c3RlbSwgdGhlCitzeXN0ZW0gbG9hZGVyIHdpbGwgZXhhbWluZSB0aGUgcHJvZ3JhbSBzZWdtZW50cyB0byBkZWNpZGUgaG93IHRvIGxvYWQKK2l0LiAgVGhlIGxvYWRlciB3aWxsIGlnbm9yZSB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIExvYWRhYmxlIHByb2dyYW0KK3NlZ21lbnRzICh0eXBlIEBzYW1we1BUX0xPQUR9KSBhcmUgZGlyZWN0bHkgbG9hZGVkIGludG8gbWVtb3J5LiAgT3RoZXIKK3Byb2dyYW0gc2VnbWVudHMgYXJlIGludGVycHJldGVkIGJ5IHRoZSBsb2FkZXIsIGFuZCBnZW5lcmFsbHkgcHJvdmlkZQorZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLgorCitXaGVuIGFuIEVMRiBmaWxlIGhhcyBib3RoIHByb2dyYW0gc2VnbWVudHMgYW5kIHNlY3Rpb25zLCBhbiBFTEYgcHJvZ3JhbQorc2VnbWVudCBtYXkgZW5jb21wYXNzIG9uZSBvciBtb3JlIEVMRiBzZWN0aW9ucywgaW4gdGhlIHNlbnNlIHRoYXQgdGhlCitwb3J0aW9uIG9mIHRoZSBmaWxlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUKK3RoZSBwb3J0aW9ucyBvZiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvciBtb3JlIHNlY3Rpb25zLiAgV2hlbgordGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50LCB0aGUKK3JlbGF0aXZlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZmlsZSBtdXN0IGNvcnJlc3BvbmQKK3RvIHRoZSByZWxhdGl2ZSBwb3NpdGlvbnMgdGhleSBzaG91bGQgaG9sZCB3aGVuIHRoZSBwcm9ncmFtIHNlZ21lbnQgaXMKK2xvYWRlZC4gIFRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGJlIG9idmlvdXMgaWYgeW91IGNvbnNpZGVyIHRoYXQgdGhlCitzeXN0ZW0gbG9hZGVyIHdpbGwgbG9hZCBhbiBlbnRpcmUgcHJvZ3JhbSBzZWdtZW50IGF0IGEgdGltZS4KKworT24gYSBzeXN0ZW0gd2hpY2ggc3VwcG9ydHMgZHluYW1pYyBwYWdpbmcsIHN1Y2ggYXMgYW55IG5hdGl2ZSBVbml4CitzeXN0ZW0sIHRoZSBjb250ZW50cyBvZiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCBtdXN0IGJlIGF0IHRoZSBzYW1lCitvZmZzZXQgaW4gdGhlIGZpbGUgYXMgaW4gbWVtb3J5LCBtb2R1bG8gdGhlIG1lbW9yeSBwYWdlIHNpemUgdXNlZCBvbiB0aGUKK3N5c3RlbS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3lzdGVtIGxvYWRlciB3aWxsIG1hcCB0aGUgZmlsZSBpbnRvIG1lbW9yeQorc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZS4gIFRoZSBzeXN0ZW0gbG9hZGVyIGNhbiBlYXNpbHkgcmVtYXAKK2VudGlyZSBwYWdlcyB0byB0aGUgY29ycmVjdCBsb2FkIGFkZHJlc3MuICBIb3dldmVyLCBpZiB0aGUgY29udGVudHMgb2YKK3RoZSBmaWxlIHdlcmUgbm90IGNvcnJlY3RseSBhbGlnbmVkIHdpdGhpbiB0aGUgcGFnZSwgdGhlIHN5c3RlbSBsb2FkZXIKK3dvdWxkIGhhdmUgdG8gc2hpZnQgdGhlIGNvbnRlbnRzIGFyb3VuZCB3aXRoaW4gdGhlIHBhZ2UsIHdoaWNoIGlzIHRvbworZXhwZW5zaXZlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBMTUEgb2YgYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgaXMKK0BzYW1wezB4NDAwODB9IGFuZCB0aGUgcGFnZSBzaXplIGlzIEBzYW1wezB4MTAwMH0sIHRoZW4gdGhlIHBvc2l0aW9uIG9mCit0aGUgc2VnbWVudCBjb250ZW50cyB3aXRoaW4gdGhlIGZpbGUgbXVzdCBlcXVhbCBAc2FtcHsweDgwfSBtb2R1bG8KK0BzYW1wezB4MTAwMH0uCisKK0JGRCBoYXMgb25seSBhIHNpbmdsZSBzZXQgb2Ygc2VjdGlvbnMuICBJdCBkb2VzIG5vdCBwcm92aWRlIGFueSBnZW5lcmljCit3YXkgdG8gZXhhbWluZSBib3RoIHNlY3Rpb25zIGFuZCBzZWdtZW50cy4gIFdoZW4gQkZEIGlzIHVzZWQgdG8gb3BlbiBhbgorb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsIHJlcHJlc2VudCBFTEYgc2VjdGlvbnMuCitXaGVuIEJGRCBpcyB1c2VkIHRvIG9wZW4gYSBjb3JlIGZpbGUsIHRoZSBCRkQgc2VjdGlvbnMgd2lsbCByZXByZXNlbnQKK0VMRiBwcm9ncmFtIHNlZ21lbnRzLgorCitXaGVuIEJGRCBpcyB1c2VkIHRvIGV4YW1pbmUgYW4gb2JqZWN0IGZpbGUgb3IgZXhlY3V0YWJsZSwgYW55IHByb2dyYW0KK3NlZ21lbnRzIHdpbGwgYmUgcmVhZCB0byBzZXQgdGhlIExNQSBvZiB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIGJlY2F1c2UKK0VMRiBzZWN0aW9ucyBvbmx5IGhhdmUgYSBWTUEsIHdoaWxlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgYm90aCBhIFZNQQorYW5kIGFuIExNQS4gIEFueSBwcm9ncmFtIHNlZ21lbnRzIHdpbGwgYmUgY29waWVkIGJ5IHRoZQorQHNhbXB7Y29weV9wcml2YXRlfSBlbnRyeSBwb2ludHMuICBUaGV5IHdpbGwgYmUgcHJpbnRlZCBieSB0aGUKK0BzYW1we3ByaW50X3ByaXZhdGV9IGVudHJ5IHBvaW50LiAgT3RoZXJ3aXNlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyBhcmUKK2lnbm9yZWQuICBJbiBwYXJ0aWN1bGFyLCBwcm9ncmFtcyB3aGljaCB1c2UgQkZEIGN1cnJlbnRseSBoYXZlIG5vIGRpcmVjdAorYWNjZXNzIHRvIHRoZSBwcm9ncmFtIHNlZ21lbnRzLgorCitXaGVuIEJGRCBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlLCB0aGUgcHJvZ3JhbSBzZWdtZW50cyB3aWxsIGJlCitjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgaW4KK3RoZSBmdW5jdGlvbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfSBpbiBAZmlsZXtlbGYuY30uCitUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHR3ZWFrZWQgbWFueSB0aW1lcywgYW5kIHByb2JhYmx5IHN0aWxsIGhhcworcHJvYmxlbXMgdGhhdCBhcmlzZSBpbiBwYXJ0aWN1bGFyIGNhc2VzLgorCitUaGVyZSBpcyBhIGhvb2sgd2hpY2ggbWF5IGJlIHVzZWQgdG8gZXhwbGljaXRseSBkZWZpbmUgdGhlIHByb2dyYW0KK3NlZ21lbnRzIHdoZW4gY3JlYXRpbmcgYW4gZXhlY3V0YWJsZTogdGhlIEBzYW1we2JmZF9yZWNvcmRfcGhkcn0KK2Z1bmN0aW9uIGluIEBmaWxle2JmZC5jfS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBCRkQgd2lsbCBub3QKK2NyZWF0ZSBwcm9ncmFtIHNlZ21lbnRzIGl0c2VsZiwgYnV0IHdpbGwgb25seSBjcmVhdGUgdGhlIHByb2dyYW0KK3NlZ21lbnRzIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyLiAgVGhlIGxpbmtlciB1c2VzIHRoaXMgZnVuY3Rpb24gdG8KK2ltcGxlbWVudCB0aGUgQHNhbXB7UEhEUlN9IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KKworQG5vZGUgQkZEIEVMRiBnZW5lcmljIHN1cHBvcnQKK0BzdWJzZWN0aW9uIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0CisKK0luIGdlbmVyYWwsIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgcmVhZCBleHRlcm5hbCBkYXRhIGZyb20gdGhlIEVMRiBmaWxlCithcmUgZm91bmQgaW4gQGZpbGV7ZWxmLmN9LiAgVGhleSBvcGVyYXRlIG9uIHRoZSBpbnRlcm5hbCBmb3JtcyBvZiB0aGUKK0VMRiBzdHJ1Y3R1cmVzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiBAZmlsZXtpbmNsdWRlL2VsZi9pbnRlcm5hbC5ofS4gIFRoZQoraW50ZXJuYWwgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBAc2FtcHtiZmRfdm1hfSwgYW5kIHNvIG1heQorYmUgdXNlZCBmb3IgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgdGFyZ2V0cy4KKworVGhlIGZpbGUgQGZpbGV7ZWxmY29kZS5ofSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggb3BlcmF0ZSBvbiB0aGUKK2V4dGVybmFsIGRhdGEuICBAZmlsZXtlbGZjb2RlLmh9IGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIHZpYQorQGZpbGV7ZWxmMzIuY30gd2l0aCBAc2FtcHtBUkNIX1NJWkV9IGRlZmluZWQgYXMgQHNhbXB7MzJ9LCBhbmQgb25jZSB2aWEKK0BmaWxle2VsZjY0LmN9IHdpdGggQHNhbXB7QVJDSF9TSVpFfSBkZWZpbmVkIGFzIEBzYW1wezY0fS4KK0BmaWxle2VsZmNvZGUuaH0gaW5jbHVkZXMgZnVuY3Rpb25zIHRvIHN3YXAgdGhlIEVMRiBzdHJ1Y3R1cmVzIGluIGFuZAorb3V0IG9mIGV4dGVybmFsIGZvcm0sIGFzIHdlbGwgYXMgYSBmZXcgbW9yZSBjb21wbGV4IGZ1bmN0aW9ucy4KKworTGlua2VyIHN1cHBvcnQgaXMgZm91bmQgaW4gQGZpbGV7ZWxmbGluay5jfSBhbmQgQGZpbGV7ZWxmbGluay5ofS4gIFRoZQorbGF0dGVyIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIGZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZQorbGlua2VyIHN1cHBvcnQgaXMgb25seSB1c2VkIGlmIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZSBkZWZpbmVzCitAc2FtcHtlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9ufSwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gcmVsb2NhdGUgdGhlCitzZWN0aW9uIGNvbnRlbnRzLiAgSWYgdGhhdCBtYWNybyBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbmVyaWMgbGlua2VyIGNvZGUKK2lzIHVzZWQsIGFuZCByZWxvY2F0aW9ucyBhcmUgaGFuZGxlZCB2aWEgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uCisKK1RoZSBjb3JlIGZpbGUgc3VwcG9ydCBpcyBpbiBAZmlsZXtlbGZjb3JlLmh9LCB3aGljaCBpcyBjb21waWxlZCB0d2ljZSwKK2ZvciBib3RoIDMyIGFuZCA2NCBiaXQgc3VwcG9ydC4gIFRoZSBtb3JlIGludGVyZXN0aW5nIGNhc2VzIG9mIGNvcmUgZmlsZQorc3VwcG9ydCBvbmx5IHdvcmsgb24gYSBuYXRpdmUgc3lzdGVtIHdoaWNoIGhhcyB0aGUgQGZpbGV7c3lzL3Byb2Nmcy5ofQoraGVhZGVyIGZpbGUuICBXaXRob3V0IHRoYXQgZmlsZSwgdGhlIGNvcmUgZmlsZSBzdXBwb3J0IGRvZXMgbGl0dGxlIG1vcmUKK3RoYW4gcmVhZCB0aGUgRUxGIHByb2dyYW0gc2VnbWVudHMgYXMgQkZEIHNlY3Rpb25zLgorCitUaGUgQkZEIGludGVybmFsIGhlYWRlciBmaWxlIEBmaWxle2VsZi1iZmQuaH0gaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgorYW1vbmcgdGhlc2UgZmlsZXMgYW5kIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMuCisKK1RoZSBkZWZhdWx0IGVudHJpZXMgZm9yIHRoZSBCRkQgRUxGIHRhcmdldCB2ZWN0b3IgYXJlIGZvdW5kIG1haW5seSBpbgorQGZpbGV7ZWxmLmN9LiAgU29tZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGluIEBmaWxle2VsZmNvZGUuaH0uCisKK1RoZSBwcm9jZXNzb3Igc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIHBhcnRpY3VsYXIgZW50cmllcyBpbiB0aGUKK3RhcmdldCB2ZWN0b3IsIGJ1dCBtb3N0IGRvIG5vdCwgd2l0aCBvbmUgZXhjZXB0aW9uOiB0aGUKK0BzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0gZW50cnkgcG9pbnQgaXMgYWx3YXlzIHByb2Nlc3NvciBzcGVjaWZpYy4KKworQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAorQHN1YnNlY3Rpb24gQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAorCitCeSBjb252ZW50aW9uLCB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzb3IKK3dpbGwgYmUgZm91bmQgaW4gQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LCB3aGVyZSBAdmFye25ufSBpcworZWl0aGVyIDMyIG9yIDY0LCBhbmQgQHZhcntjcHV9IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzb3IuCisKK0BtZW51CisqIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkOjoJUmVxdWlyZWQgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKKyogQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyOjoJUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0CisqIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyOjoJT3RoZXIgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgb3B0aW9ucworQGVuZCBtZW51CisKK0Bub2RlIEJGRCBFTEYgcHJvY2Vzc29yIHJlcXVpcmVkCitAc3Vic3Vic2VjdGlvbiBSZXF1aXJlZCBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAorCitXaGVuIHdyaXRpbmcgYSBAZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30gZmlsZSwgeW91IG11c3QgZG8gdGhlCitmb2xsb3dpbmc6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitEZWZpbmUgZWl0aGVyIEBzYW1we1RBUkdFVF9CSUdfU1lNfSBvciBAc2FtcHtUQVJHRVRfTElUVExFX1NZTX0sIG9yCitib3RoLCB0byBhIHVuaXF1ZSBDIG5hbWUgdG8gdXNlIGZvciB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgbmFtZSBzaG91bGQKK2FwcGVhciBpbiB0aGUgbGlzdCBvZiB0YXJnZXQgdmVjdG9ycyBpbiBAZmlsZXt0YXJnZXRzLmN9LCBhbmQgd2lsbCBhbHNvCitoYXZlIHRvIGFwcGVhciBpbiBAZmlsZXtjb25maWcuYmZkfSBhbmQgQGZpbGV7Y29uZmlndXJlLmlufS4gIERlZmluZQorQHNhbXB7VEFSR0VUX0JJR19TWU19IGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLAorQHNhbXB7VEFSR0VUX0xJVFRMRV9TWU19IGZvciBhIGxpdHRsZS1lbmRpYW4gcHJvY2Vzc29yLCBhbmQgZGVmaW5lIGJvdGgKK2ZvciBhIGJpLWVuZGlhbiBwcm9jZXNzb3IuCitAaXRlbQorRGVmaW5lIGVpdGhlciBAc2FtcHtUQVJHRVRfQklHX05BTUV9IG9yIEBzYW1we1RBUkdFVF9MSVRUTEVfTkFNRX0sIG9yCitib3RoLCB0byBhIHN0cmluZyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyB0aGUKK25hbWUgd2hpY2ggYSB1c2VyIG9mIHRoZSBCRkQgdG9vbCB3b3VsZCB1c2UgdG8gc3BlY2lmeSB0aGUgb2JqZWN0IGZpbGUKK2Zvcm1hdC4gIEl0IHdvdWxkIG5vcm1hbGx5IGFwcGVhciBpbiBhIGxpbmtlciBlbXVsYXRpb24gcGFyYW1ldGVycworZmlsZS4KK0BpdGVtCitEZWZpbmUgQHNhbXB7RUxGX0FSQ0h9IHRvIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIChhbiBlbGVtZW50IG9mIHRoZQorQHNhbXB7YmZkX2FyY2hpdGVjdHVyZX0gZW51bSwgdHlwaWNhbGx5IEBzYW1we2JmZF9hcmNoX0B2YXJ7Y3B1fX0pLgorQGl0ZW0KK0RlZmluZSBAc2FtcHtFTEZfTUFDSElORV9DT0RFfSB0byB0aGUgbWFnaWMgbnVtYmVyIHdoaWNoIHNob3VsZCBhcHBlYXIKK2luIHRoZSBAc2FtcHtlX21hY2hpbmV9IGZpZWxkIG9mIHRoZSBFTEYgaGVhZGVyLiAgQXMgb2YgdGhpcyB3cml0aW5nLAordGhlc2UgbWFnaWMgbnVtYmVycyBhcmUgYXNzaWduZWQgYnkgU0NPOyBpZiB5b3Ugd2FudCB0byBnZXQgYSBtYWdpYworbnVtYmVyIGZvciBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yLCB0cnkgc2VuZGluZyBhIG5vdGUgdG8KK0BlbWFpbHtyZWdpc3RyeUBAc2NvLmNvbX0uICBJbiB0aGUgQkZEIHNvdXJjZXMsIHRoZSBtYWdpYyBudW1iZXJzIGFyZQorZm91bmQgaW4gQGZpbGV7aW5jbHVkZS9lbGYvY29tbW9uLmh9OyB0aGV5IGhhdmUgbmFtZXMgYmVnaW5uaW5nIHdpdGgKK0BzYW1we0VNX30uCitAaXRlbQorRGVmaW5lIEBzYW1we0VMRl9NQVhQQUdFU0laRX0gdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHZpcnR1YWwgcGFnZSBpbgorbWVtb3J5LiAgVGhpcyBjYW4gbm9ybWFsbHkgYmUgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIGNoYXB0ZXIgNSBpbiB0aGUKK3Byb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LiAgRm9yIGEgcHJvY2Vzc29yIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkCitpbiBhbiBlbWJlZGRlZCBzeXN0ZW0sIG9yIHdoaWNoIGhhcyBubyBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSwgdGhpcworY2FuIHNpbXBseSBiZSBAc2FtcHsxfS4KK0BpdGVtCitJZiB0aGUgZm9ybWF0IHNob3VsZCB1c2UgQHNhbXB7UmVsfSByYXRoZXIgdGhhbiBAc2FtcHtSZWxhfSByZWxvY2F0aW9ucywKK2RlZmluZSBAc2FtcHtVU0VfUkVMfS4gIFRoaXMgaXMgbm9ybWFsbHkgZGVmaW5lZCBpbiBjaGFwdGVyIDQgb2YgdGhlCitwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4KKworSW4gdGhlIGFic2VuY2Ugb2YgYSBzdXBwbGVtZW50LCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggQHNhbXB7UmVsYX0KK3JlbG9jYXRpb25zLiAgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMgd2lsbCByZXF1aXJlIG1vcmUgc3BhY2UgaW4gb2JqZWN0CitmaWxlcyAoYnV0IG5vdCBpbiBleGVjdXRhYmxlcywgZXhjZXB0IHdoZW4gdXNpbmcgZHluYW1pYyBsaW5raW5nKS4KK0hvd2V2ZXIsIHRoaXMgaXMgb3V0d2VpZ2hlZCBieSB0aGUgc2ltcGxpY2l0eSBvZiBhZGRlbmQgaGFuZGxpbmcgd2hlbgordXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMuICBXaXRoIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQKK211c3QgYmUgc3RvcmVkIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3aGljaCBtYWtlcyByZWxvY2F0ZWFibGUgbGlua3MKK21vcmUgY29tcGxleC4KKworRm9yIGV4YW1wbGUsIGNvbnNpZGVyIEMgY29kZSBsaWtlIEBjb2Rle2kgPSBhWzEwMDBdO30gd2hlcmUgQHNhbXB7YX0gaXMKK2EgZ2xvYmFsIGFycmF5LiAgVGhlIGluc3RydWN0aW9ucyB3aGljaCBsb2FkIHRoZSB2YWx1ZSBvZiBAc2FtcHthWzEwMDBdfQord2lsbCBtb3N0IGxpa2VseSB1c2UgYSByZWxvY2F0aW9uIHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sCityZXByZXNlbnRpbmcgQHNhbXB7YX0sIHdpdGggYW4gYWRkZW5kIHRoYXQgZ2l2ZXMgdGhlIG9mZnNldCBmcm9tIHRoZQorc3RhcnQgb2YgQHNhbXB7YX0gdG8gZWxlbWVudCBAc2FtcHsxMDAwfS4gIFdoZW4gdXNpbmcgQHNhbXB7UmVsfQorcmVsb2NhdGlvbnMsIHRoYXQgYWRkZW5kIG11c3QgYmUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4KK0lmIHlvdSBhcmUgYWRkaW5nIHN1cHBvcnQgZm9yIGEgUklTQyBjaGlwIHdoaWNoIHVzZXMgdHdvIG9yIG1vcmUKK2luc3RydWN0aW9ucyB0byBsb2FkIGFuIGFkZHJlc3MsIHRoZW4gdGhlIGFkZGVuZCBtYXkgbm90IGZpdCBpbiBhIHNpbmdsZQoraW5zdHJ1Y3Rpb24sIGFuZCB3aWxsIGhhdmUgdG8gYmUgc29tZWhvdyBzcGxpdCBhbW9uZyB0aGUgaW5zdHJ1Y3Rpb25zLgorVGhpcyBtYWtlcyBsaW5raW5nIGF3a3dhcmQsIHBhcnRpY3VsYXJseSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmsKK2luIHdoaWNoIHRoZSBhZGRlbmQgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZC4gIEl0IGNhbiBiZSBkb25lLS0tdGhlIE1JUFMKK0VMRiBzdXBwb3J0IGRvZXMgaXQtLS1idXQgaXQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbiBwb3NzaWJsZS4KKworSXQgaXMgcG9zc2libGUsIHRob3VnaCBzb21ld2hhdCBhd2t3YXJkLCB0byBzdXBwb3J0IGJvdGggQHNhbXB7UmVsfSBhbmQKK0BzYW1we1JlbGF9IHJlbG9jYXRpb25zIGZvciBhIHNpbmdsZSB0YXJnZXQ7IEBmaWxle2VsZjY0LW1pcHMuY30gZG9lcyBpdAorYnkgb3ZlcnJpZGluZyB0aGUgcmVsb2NhdGlvbiByZWFkaW5nIGFuZCB3cml0aW5nIHJvdXRpbmVzLgorQGl0ZW0KK0RlZmluZSBob3d0byBzdHJ1Y3R1cmVzIGZvciBhbGwgdGhlIHJlbG9jYXRpb24gdHlwZXMuCitAaXRlbQorRGVmaW5lIGEgQHNhbXB7YmZkX3JlbG9jX3R5cGVfbG9va3VwfSByb3V0aW5lLiAgVGhpcyBtdXN0IGJlIG5hbWVkCitAc2FtcHtiZmRfZWxmQHZhcntubn1fYmZkX3JlbG9jX3R5cGVfbG9va3VwfSwgYW5kIG1heSBiZSBlaXRoZXIgYQorZnVuY3Rpb24gb3IgYSBtYWNyby4gIEl0IG11c3QgdHJhbnNsYXRlIGEgQkZEIHJlbG9jYXRpb24gY29kZSBpbnRvIGEKK2hvd3RvIHN0cnVjdHVyZS4gIFRoaXMgaXMgbm9ybWFsbHkgYSB0YWJsZSBsb29rdXAgb3IgYSBzaW1wbGUgc3dpdGNoLgorQGl0ZW0KK0lmIHVzaW5nIEBzYW1we1JlbH0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b19yZWx9LgorSWYgdXNpbmcgQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMsIGRlZmluZSBAc2FtcHtlbGZfaW5mb190b19ob3d0b30uCitFaXRoZXIgd2F5LCB0aGlzIGlzIGEgbWFjcm8gZGVmaW5lZCBhcyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoCit0YWtlcyBhbiBAc2FtcHthcmVsZW50fSBhbmQgYSBAc2FtcHtSZWx9IG9yIEBzYW1we1JlbGF9IHN0cnVjdHVyZSwgYW5kCitzZXRzIHRoZSBAc2FtcHtob3d0b30gZmllbGQgb2YgdGhlIEBzYW1we2FyZWxlbnR9IGJhc2VkIG9uIHRoZQorQHNhbXB7UmVsfSBvciBAc2FtcHtSZWxhfSBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vcm1hbGx5IHVzZXMKK0BzYW1we0VMRkB2YXJ7bm59X1JfVFlQRX0gdG8gZ2V0IHRoZSBFTEYgcmVsb2NhdGlvbiB0eXBlIGFuZCB1c2VzIGl0IGFzCithbiBpbmRleCBpbnRvIGEgdGFibGUgb2YgaG93dG8gc3RydWN0dXJlcy4KK0BlbmQgaXRlbWl6ZQorCitZb3UgbXVzdCBhbHNvIGFkZCB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGlzIHByb2Nlc3NvciB0byB0aGUKK0BzYW1we3ByZXBfaGVhZGVyc30gZnVuY3Rpb24gaW4gQGZpbGV7ZWxmLmN9LgorCitZb3UgbXVzdCBhbHNvIGNyZWF0ZSBhIGhlYWRlciBmaWxlIGluIHRoZSBAZmlsZXtpbmNsdWRlL2VsZn0gZGlyZWN0b3J5CitjYWxsZWQgQGZpbGV7QHZhcntjcHV9Lmh9LiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgYW55IHRhcmdldCBzcGVjaWZpYyAKK2luZm9ybWF0aW9uIHdoaWNoIG1heSBiZSBuZWVkZWQgb3V0c2lkZSBvZiB0aGUgQkZEIGNvZGUuICBJbiBwYXJ0aWN1bGFyCitpdCBzaG91bGQgdXNlIHRoZSBAc2FtcHtTVEFSVF9SRUxPQ19OVU1CRVJTfSwgQHNhbXB7UkVMT0NfTlVNQkVSfSwKK0BzYW1we0ZBS0VfUkVMT0N9LCBAc2FtcHtFTVBUWV9SRUxPQ30gYW5kIEBzYW1we0VORF9SRUxPQ19OVU1CRVJTfQorbWFjcm9zIHRvIGNyZWF0ZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG51bWJlciB1c2VkIHRvIGluZGVudGlmeSBhCityZWxvY2F0aW9uIHRvIGEgbmFtZSBkZXNjcmliaW5nIHRoYXQgcmVsb2NhdGlvbi4KKworQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3IgbGlua2VyCitAc3Vic3Vic2VjdGlvbiBQcm9jZXNzb3Igc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQKKworVGhlIGxpbmtlciB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgaWYgeW91IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24KK2Z1bmN0aW9uLiAgVGhpcyB3aWxsIHBlcm1pdCBCRkQgdG8gdXNlIHRoZSBFTEYgc3BlY2lmaWMgbGlua2VyIHN1cHBvcnQuCisKK0lmIHlvdSBkbyBub3QgZGVmaW5lIGEgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgQkZEIG11c3QgdXNlIHRoZQorZ2VuZXJpYyBsaW5rZXIgc3VwcG9ydCwgd2hpY2ggcmVxdWlyZXMgY29udmVydGluZyBhbGwgc3ltYm9scyBhbmQKK3JlbG9jYXRpb25zIGludG8gQkZEIEBzYW1we2FzeW1ib2x9IGFuZCBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgSW4KK3RoaXMgY2FzZSwgcmVsb2NhdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNhbGxpbmcKK0BzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LCB3aGljaCB3aWxsIHVzZSB0aGUgaG93dG8gc3RydWN0dXJlcyB5b3UKK2hhdmUgZGVmaW5lZC4gIEB4cmVme0JGRCByZWxvY2F0aW9uIGhhbmRsaW5nfS4KKworSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGludG8gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0LCBzdWNoIGFzCitTLXJlY29yZHMsIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IG11c3Qgd29yayBjb3JyZWN0bHkgd2l0aCB5b3VyCitob3d0byBzdHJ1Y3R1cmVzLCBzbyB5b3UgY2FuJ3Qgc2tpcCB0aGF0IHN0ZXAuICBIb3dldmVyLCBpZiB5b3UgZGVmaW5lCit0aGUgcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiwgdGhlbiBpbiB0aGUgbm9ybWFsIGNhc2Ugb2YgbGlua2luZyBpbnRvCithbiBFTEYgZmlsZSB0aGUgbGlua2VyIHdpbGwgbm90IG5lZWQgdG8gY29udmVydCBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucywKK2FuZCB3aWxsIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQuCisKK1RvIHVzZSBhIHJlbG9jYXRpb24gc2VjdGlvbiBmdW5jdGlvbiwgZGVmaW5lIHRoZSBtYWNybworQHNhbXB7ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbn0gYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaCB3aWxsCit0YWtlIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24sIGFzIHdlbGwgYXMgcmVsb2NhdGlvbiwgc3ltYm9sLCBhbmQgb3RoZXIKK2luZm9ybWF0aW9uLCBhbmQgbW9kaWZ5IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbgoraW5mb3JtYXRpb24uICBJbiBzaW1wbGUgY2FzZXMsIHRoaXMgaXMgbGl0dGxlIG1vcmUgdGhhbiBhIGxvb3Agb3ZlciB0aGUKK3JlbG9jYXRpb25zIHdoaWNoIGNvbXB1dGVzIHRoZSB2YWx1ZSBvZiBlYWNoIHJlbG9jYXRpb24gYW5kIGNhbGxzCitAc2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9LiAgVGhlIGZ1bmN0aW9uIG11c3QgY2hlY2sgZm9yIGEKK3JlbG9jYXRlYWJsZSBsaW5rLCBhbmQgaW4gdGhhdCBjYXNlIG5vcm1hbGx5IG5lZWRzIHRvIGRvIG5vdGhpbmcgb3RoZXIKK3RoYW4gYWRqdXN0IHRoZSBhZGRlbmQgZm9yIHJlbG9jYXRpb25zIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbC4KKworVGhlIGNvbXBsZXggY2FzZXMgZ2VuZXJhbGx5IGhhdmUgdG8gZG8gd2l0aCBkeW5hbWljIGxpbmtlciBzdXBwb3J0LiAgR09UCithbmQgUExUIHJlbG9jYXRpb25zIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHksIGFuZCB0aGUgbGlua2VyIG5vcm1hbGx5CithcnJhbmdlcyB0byBzZXQgdXAgdGhlIEdPVCBhbmQgUExUIHNlY3Rpb25zIHdoaWxlIGhhbmRsaW5nIHJlbG9jYXRpb25zLgorV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHJhbmRvbSByZWxvY2F0aW9ucyBtdXN0IG5vcm1hbGx5IGJlCitjb3BpZWQgaW50byB0aGUgc2hhcmVkIGxpYnJhcnksIG9yIGNvbnZlcnRlZCB0byBSRUxBVElWRSByZWxvY2F0aW9ucword2hlbiBwb3NzaWJsZS4KKworQG5vZGUgQkZEIEVMRiBwcm9jZXNzb3Igb3RoZXIKK0BzdWJzdWJzZWN0aW9uIE90aGVyIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IG9wdGlvbnMKKworVGhlcmUgYXJlIG1hbnkgb3RoZXIgbWFjcm9zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGluCitAZmlsZXtlbGZAdmFye25ufS1AdmFye2NwdX0uY30uICBUaGVzZSBtYWNyb3MgbWF5IGJlIGZvdW5kIGluCitAZmlsZXtlbGZ4eC10YXJnZXQuaH0uCisKK01hY3JvcyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSBzb21lIG9mIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgdmVjdG9yCitmdW5jdGlvbnMuCisKK1NldmVyYWwgcHJvY2Vzc29yIHNwZWNpZmljIGhvb2sgZnVuY3Rpb25zIHdoaWNoIG1heSBiZSBkZWZpbmVkIGFzCittYWNyb3MuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGZvdW5kIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZQorQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlIGRlZmluZWQgaW4gQGZpbGV7ZWxmLWJmZC5ofS4gIEluCitnZW5lcmFsLCBhIGhvb2sgZnVuY3Rpb24gaXMgc2V0IGJ5IGRlZmluaW5nIGEgbWFjcm8KK0BzYW1we2VsZl9iYWNrZW5kX0B2YXJ7bmFtZX19LgorCitUaGVyZSBhcmUgYSBmZXcgcHJvY2Vzc29yIHNwZWNpZmljIGNvbnN0YW50cyB3aGljaCBtYXkgYWxzbyBiZSBkZWZpbmVkLgorVGhlc2UgYXJlIGFnYWluIGZvdW5kIGluIHRoZSBAc2FtcHtlbGZfYmFja2VuZF9kYXRhfSBzdHJ1Y3R1cmUuCisKK0kgd2lsbCBub3QgZGVmaW5lIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGhlcmU7IHNlZSB0aGUKK2NvbW1lbnRzIGluIEBmaWxle2VsZi1iZmQuaH0uCisKK05vcm1hbGx5IGFueSBvZGQgY2hhcmFjdGVyaXN0aWMgb2YgYSBwYXJ0aWN1bGFyIEVMRiBwcm9jZXNzb3IgaXMgaGFuZGxlZAordmlhIGEgaG9vayBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgc3BlY2lhbCBAc2FtcHtTSE5fTUlQU19TQ09NTU9OfQorc2VjdGlvbiBudW1iZXIgZm91bmQgaW4gTUlQUyBFTEYgaXMgaGFuZGxlZCB2aWEgdGhlIGhvb2tzCitAc2FtcHtzZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb259LCBAc2FtcHtzeW1ib2xfcHJvY2Vzc2luZ30sCitAc2FtcHthZGRfc3ltYm9sX2hvb2t9LCBhbmQgQHNhbXB7b3V0cHV0X3N5bWJvbF9ob29rfS4KKworRHluYW1pYyBsaW5raW5nIHN1cHBvcnQsIHdoaWNoIGludm9sdmVzIHByb2Nlc3NvciBzcGVjaWZpYyByZWxvY2F0aW9ucworcmVxdWlyaW5nIHNwZWNpYWwgaGFuZGxpbmcsIGlzIGFsc28gaW1wbGVtZW50ZWQgdmlhIGhvb2sgZnVuY3Rpb25zLgorCitAbm9kZSBCRkQgRUxGIGNvcmUgZmlsZXMKK0BzdWJzZWN0aW9uIEJGRCBFTEYgY29yZSBmaWxlcworQGNpbmRleCBlbGYgY29yZSBmaWxlcworCitPbiBuYXRpdmUgRUxGIFVuaXggc3lzdGVtcywgY29yZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYW55CitzZWN0aW9ucy4gIEluc3RlYWQsIHRoZXkgb25seSBoYXZlIHByb2dyYW0gc2VnbWVudHMuCisKK1doZW4gQkZEIGlzIHVzZWQgdG8gcmVhZCBhbiBFTEYgY29yZSBmaWxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwKK2FjdHVhbGx5IHJlcHJlc2VudCBwcm9ncmFtIHNlZ21lbnRzLiAgU2luY2UgRUxGIHByb2dyYW0gc2VnbWVudHMgZG8gbm90CitoYXZlIG5hbWVzLCBCRkQgd2lsbCBpbnZlbnQgbmFtZXMgbGlrZSBAc2FtcHtzZWdtZW50QHZhcntufX0gd2hlcmUKK0B2YXJ7bn0gaXMgYSBudW1iZXIuCisKK0Egc2luZ2xlIEVMRiBwcm9ncmFtIHNlZ21lbnQgbWF5IGluY2x1ZGUgYm90aCBhbiBpbml0aWFsaXplZCBwYXJ0IGFuZCBhbgordW5pbml0aWFsaXplZCBwYXJ0LiAgVGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVkIHBhcnQgaXMgZ2l2ZW4gYnkgdGhlCitAc2FtcHtwX2ZpbGVzen0gZmllbGQuICBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgc2VnbWVudCBpcyBnaXZlbiBieSB0aGUKK0BzYW1we3BfbWVtc3p9IGZpZWxkLiAgSWYgQHNhbXB7cF9tZW1zen0gaXMgbGFyZ2VyIHRoYW4gQHNhbXB7cF9maWxlc3p9LAordGhlbiB0aGUgZXh0cmEgc3BhY2UgaXMgdW5pbml0aWFsaXplZCwgb3IsIG1vcmUgcHJlY2lzZWx5LCBpbml0aWFsaXplZAordG8gemVyby4KKworQkZEIHdpbGwgcmVwcmVzZW50IHN1Y2ggYSBwcm9ncmFtIHNlZ21lbnQgYXMgdHdvIGRpZmZlcmVudCBzZWN0aW9ucy4KK1RoZSBmaXJzdCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1hfSwgd2lsbCByZXByZXNlbnQgdGhlIGluaXRpYWxpemVkCitwYXJ0IG9mIHRoZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgc2Vjb25kLCBuYW1lZCBAc2FtcHtzZWdtZW50QHZhcntufWJ9LAord2lsbCByZXByZXNlbnQgdGhlIHVuaW5pdGlhbGl6ZWQgcGFydC4KKworRUxGIGNvcmUgZmlsZXMgc3RvcmUgc3BlY2lhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlZ2lzdGVyIHZhbHVlcyBpbgorcHJvZ3JhbSBzZWdtZW50cyB3aXRoIHRoZSB0eXBlIEBzYW1we1BUX05PVEV9LiAgQkZEIHdpbGwgYXR0ZW1wdCB0bworaW50ZXJwcmV0IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBzZWdtZW50cywgYW5kIHdpbGwgY3JlYXRlIGFkZGl0aW9uYWwKK3NlY3Rpb25zIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uLiAgU29tZSBvZiB0aGlzIGludGVycHJldGF0aW9uIHJlcXVpcmVzCitpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgaG9zdCBoZWFkZXIgZmlsZSBAZmlsZXtzeXMvcHJvY2ZzLmh9LCBhbmQgc28KK3dpbGwgb25seSB3b3JrIHdoZW4gQkZEIGlzIGJ1aWx0IG9uIGEgbmF0aXZlIHN5c3RlbS4KKworQkZEIGRvZXMgbm90IGN1cnJlbnRseSBwcm92aWRlIGFueSB3YXkgdG8gY3JlYXRlIGFuIEVMRiBjb3JlIGZpbGUuICBJbgorZ2VuZXJhbCwgQkZEIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gY3JlYXRlIGNvcmUgZmlsZXMuICBUaGUgd2F5IHRvCitpbXBsZW1lbnQgdGhpcyB3b3VsZCBiZSB0byB3cml0ZSBAc2FtcHtiZmRfc2V0X2Zvcm1hdH0gYW5kCitAc2FtcHtiZmRfd3JpdGVfY29udGVudHN9IHJvdXRpbmVzIGZvciB0aGUgQHNhbXB7YmZkX2NvcmV9IHR5cGU7IHNlZQorQHJlZntCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXR9LgorCitAbm9kZSBCRkQgRUxGIGZ1dHVyZQorQHN1YnNlY3Rpb24gQkZEIEVMRiBmdXR1cmUKKworVGhlIGN1cnJlbnQgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQgaGFzIHRvbyBtdWNoIGNvZGUgZHVwbGljYXRpb24uCitXaGlsZSBlYWNoIHByb2Nlc3NvciBoYXMgcGFydGljdWxhciBkaWZmZXJlbmNlcywgbXVjaCBvZiB0aGUgZHluYW1pYworbGlua2luZyBzdXBwb3J0IGlzIHF1aXRlIHNpbWlsYXIgZm9yIGVhY2ggcHJvY2Vzc29yLiAgVGhlIEdPVCBhbmQgUExUCithcmUgaGFuZGxlZCBpbiBmYWlybHkgc2ltaWxhciB3YXlzLCB0aGUgZGV0YWlscyBvZiAtQnN5bWJvbGljIGxpbmtpbmcKK2FyZSBnZW5lcmFsbHkgc2ltaWxhciwgZXRjLiAgVGhpcyBjb2RlIHNob3VsZCBiZSByZXdvcmtlZCB0byB1c2UgbW9yZQorZ2VuZXJpYyBmdW5jdGlvbnMsIGVsaW1pbmF0aW5nIHRoZSBkdXBsaWNhdGlvbi4KKworU2ltaWxhcmx5LCB0aGUgcmVsb2NhdGlvbiBoYW5kbGluZyBoYXMgdG9vIG11Y2ggZHVwbGljYXRpb24uICBNYW55IG9mCit0aGUgQHNhbXB7cmVsb2NfdHlwZV9sb29rdXB9IGFuZCBAc2FtcHtpbmZvX3RvX2hvd3RvfSBmdW5jdGlvbnMgYXJlCitxdWl0ZSBzaW1pbGFyLiAgVGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb25zIGFyZSBhbHNvIG9mdGVuIHF1aXRlCitzaW1pbGFyLCBib3RoIGluIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFuZGxpbmcgYW5kIHRoZSBkeW5hbWljIGxpbmtlcgoraGFuZGxpbmcuICBNYW55IG9mIHRoZSBDT0ZGIHByb2Nlc3NvciBzcGVjaWZpYyBiYWNrZW5kcyBzaGFyZSBhIHNpbmdsZQorcmVsb2NhdGUgc2VjdGlvbiBmdW5jdGlvbiAoQHNhbXB7X2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbn0pLAorYW5kIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIGZvciB0aGUgRUxGIHRhcmdldHMKK2FzIHdlbGwuCisKK1RoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgbWFnaWMgbnVtYmVyIGluCitAc2FtcHtwcmVwX2hlYWRlcnN9IGluIEBmaWxle2VsZi5jfSBpcyBzb21ld2hhdCBib2d1cy4gIEl0IHNob3VsZCBiZQorcG9zc2libGUgdG8gYWRkIHN1cHBvcnQgZm9yIGEgbmV3IHByb2Nlc3NvciB3aXRob3V0IGNoYW5naW5nIHRoZSBnZW5lcmljCitzdXBwb3J0LgorCitUaGUgcHJvY2Vzc29yIGZ1bmN0aW9uIGhvb2tzIGFuZCBjb25zdGFudHMgYXJlIGFkIGhvYyBhbmQgbmVlZCBiZXR0ZXIKK2RvY3VtZW50YXRpb24uCisKK1doZW4gYSBsaW5rZXIgc2NyaXB0IHVzZXMgQHNhbXB7U0laRU9GX0hFQURFUlN9LCB0aGUgRUxGIGJhY2tlbmQgbXVzdAorZ3Vlc3MgYXQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzIHdoaWNoIHdpbGwgYmUgcmVxdWlyZWQsIGluCitAc2FtcHtnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZX0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIGxpbmtlciBjYWxscworQHNhbXB7YmZkX3NpemVvZl9oZWFkZXJzfSBiZWZvcmUgaXQga25vd3MgYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBhbmQKK3NpemVzLiAgVGhlIEVMRiBiYWNrZW5kIG1heSBsYXRlciBkaXNjb3Zlciwgd2hlbiBjcmVhdGluZyBwcm9ncmFtCitzZWdtZW50cywgdGhhdCBtb3JlIHByb2dyYW0gc2VnbWVudHMgYXJlIHJlcXVpcmVkLiAgVGhpcyBpcyBjdXJyZW50bHkKK3JlcG9ydGVkIGFzIGFuIGVycm9yIGluIEBzYW1we2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHN9LgorCitJbiBwcmFjdGljZSB0aGlzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byB1c2UgQHNhbXB7U0laRU9GX0hFQURFUlN9IGV4Y2VwdAord2l0aCBhIGNhcmVmdWxseSBkZWZpbmVkIGxpbmtlciBzY3JpcHQuICBVbmZvcnR1bmF0ZWx5LAorQHNhbXB7U0laRU9GX0hFQURFUlN9IGlzIHJlcXVpcmVkIGZvciBmYXN0IHByb2dyYW0gbG9hZGluZyBvbiBhIG5hdGl2ZQorc3lzdGVtLCBzaW5jZSBpdCBwZXJtaXRzIHRoZSBpbml0aWFsIGNvZGUgc2VjdGlvbiB0byBhcHBlYXIgb24gdGhlIHNhbWUKK3BhZ2UgYXMgdGhlIHByb2dyYW0gc2VnbWVudHMsIHNhdmluZyBhIHBhZ2UgcmVhZCB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cworcnVubmluZy4gIEZvcnR1bmF0ZWx5LCBuYXRpdmUgc3lzdGVtcyBwZXJtaXQgY2FyZWZ1bCBkZWZpbml0aW9uIG9mIHRoZQorbGlua2VyIHNjcmlwdC4gIFN0aWxsLCBpZGVhbGx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSByZWxheGF0aW9uIHRvCitjb21wdXRlIHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cy4KKworQG5vZGUgQkZEIGdsb3NzYXJ5CitAc2VjdGlvbiBCRkQgZ2xvc3NhcnkKK0BjaW5kZXggZ2xvc3NhcnkgZm9yIGJmZAorQGNpbmRleCBiZmQgZ2xvc3NhcnkKKworVGhpcyBpcyBhIHNob3J0IGdsb3NzYXJ5IG9mIHNvbWUgQkZEIHRlcm1zLgorCitAdGFibGUgQGFzaXMKK0BpdGVtIGEub3V0CitUaGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIG9yaWdpbmFsIFVuaXggb2JqZWN0IGZpbGUgZm9ybWF0LgorU3RpbGwgdXNlZCBvbiBTdW5PUywgdGhvdWdoIG5vdCBTb2xhcmlzLiAgU3VwcG9ydHMgb25seSB0aHJlZSBzZWN0aW9ucy4KKworQGl0ZW0gYXJjaGl2ZQorQSBjb2xsZWN0aW9uIG9mIG9iamVjdCBmaWxlcyBwcm9kdWNlZCBhbmQgbWFuaXB1bGF0ZWQgYnkgdGhlIEBzYW1we2FyfQorcHJvZ3JhbS4KKworQGl0ZW0gYmFja2VuZAorVGhlIGltcGxlbWVudGF0aW9uIHdpdGhpbiBCRkQgb2YgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQorc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBwYXJ0aWN1bGFyIHRhcmdldCB2ZWN0b3IuCisKK0BpdGVtIEJGRAorVGhlIEJGRCBsaWJyYXJ5IGl0c2VsZi4gIEFsc28sIGVhY2ggb2JqZWN0IGZpbGUsIGFyY2hpdmUsIG9yIGV4ZWN0YWJsZQorb3BlbmVkIGJ5IHRoZSBCRkQgbGlicmFyeSBoYXMgdGhlIHR5cGUgQHNhbXB7YmZkICp9LCBhbmQgaXMgc29tZXRpbWVzCityZWZlcnJlZCB0byBhcyBhIGJmZC4KKworQGl0ZW0gQ09GRgorVGhlIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIFVuaXggU1ZSMy4gIFVzZWQgYnkgc29tZQorZW1iZWRkZWQgdGFyZ2V0cywgYWx0aG91Z2ggRUxGIGlzIG5vcm1hbGx5IGJldHRlci4KKworQGl0ZW0gRExMCitBIHNoYXJlZCBsaWJyYXJ5IG9uIFdpbmRvd3MuCisKK0BpdGVtIGR5bmFtaWMgbGlua2VyCitXaGVuIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IGlzIHJ1biwgdGhlIGR5bmFtaWMKK2xpbmtlciB3aWxsIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIGxpYnJhcnkgYW5kIGFycmFuZ2UgdG8gc29tZWhvdworaW5jbHVkZSBpdCBpbiB0aGUgcnVubmluZyBpbWFnZS4KKworQGl0ZW0gZHluYW1pYyBvYmplY3QKK0Fub3RoZXIgbmFtZSBmb3IgYW4gRUxGIHNoYXJlZCBsaWJyYXJ5LgorCitAaXRlbSBFQ09GRgorVGhlIEV4dGVuZGVkIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQuICBVc2VkIG9uIEFscGhhIERpZ2l0YWwgVW5peAorKGZvcm1lcmx5IE9TRi8xKSwgYXMgd2VsbCBhcyBVbHRyaXggYW5kIElyaXggNC4gIEEgdmFyaWFudCBvZiBDT0ZGLgorCitAaXRlbSBFTEYKK1RoZSBFeGVjdXRhYmxlIGFuZCBMaW5raW5nIEZvcm1hdC4gIFRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdXNlZCBvbiBtb3N0Cittb2Rlcm4gVW5peCBzeXN0ZW1zLCBpbmNsdWRpbmcgR05VL0xpbnV4LCBTb2xhcmlzLCBJcml4LCBhbmQgU1ZSNC4gIEFsc28KK3VzZWQgb24gbWFueSBlbWJlZGRlZCBzeXN0ZW1zLgorCitAaXRlbSBleGVjdXRhYmxlCitBIHByb2dyYW0sIHdpdGggaW5zdHJ1Y3Rpb25zIGFuZCBzeW1ib2xzLCBhbmQgcGVyaGFwcyBkeW5hbWljIGxpbmtpbmcKK2luZm9ybWF0aW9uLiAgTm9ybWFsbHkgcHJvZHVjZWQgYnkgYSBsaW5rZXIuCisKK0BpdGVtIExNQQorTG9hZCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggYSBzZWN0aW9uIHdpbGwgYmUKK2xvYWRlZC4gIENvbXBhcmUgd2l0aCBWTUEsIGJlbG93LgorCitAaXRlbSBOTE0KK05ldFdhcmUgTG9hZGFibGUgTW9kdWxlLiAgVXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIGFuIG9iamVjdCB3aGljaAorYmUgbG9hZGVkIGludG8gTmV0V2FyZSwgd2hpY2ggaXMgc29tZSBraW5kIG9mIFBDIGJhc2VkIG5ldHdvcmsgc2VydmVyCitwcm9ncmFtLgorCitAaXRlbSBvYmplY3QgZmlsZQorQSBiaW5hcnkgZmlsZSBpbmNsdWRpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uCitpbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGFuIGFzc2VtYmxlci4KKworQGl0ZW0gb2JqZWN0IGZpbGUgZm9ybWF0CitUaGUgZm9ybWF0IG9mIGFuIG9iamVjdCBmaWxlLiAgVHlwaWNhbGx5IG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMKK2ZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQsIGFsdGhvdWdoIGV4ZWN1dGFibGVzCit3aWxsIG5vdCBjb250YWluIGFueSByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgorCitAaXRlbSBQRQorVGhlIFBvcnRhYmxlIEV4ZWN1dGFibGUgZm9ybWF0LiAgVGhpcyBpcyB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgZm9yCitXaW5kb3dzIChzcGVjaWZpY2FsbHksIFdpbjMyKSBvYmplY3QgZmlsZXMuICBJdCBpcyBiYXNlZCBjbG9zZWx5IG9uCitDT0ZGLCBidXQgaGFzIGEgZmV3IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzLgorCitAaXRlbSBQRUkKK1RoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIEltYWdlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdAordXNlZCBmb3IgV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgZXhlY3V0YWJsZXMuICBJdCBpcyB2ZXJ5IHNpbWlsYXIKK3RvIFBFLCBidXQgaW5jbHVkZXMgc29tZSBhZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbi4KKworQGl0ZW0gcmVsb2NhdGlvbnMKK0luZm9ybWF0aW9uIHVzZWQgYnkgdGhlIGxpbmtlciB0byBhZGp1c3Qgc2VjdGlvbiBjb250ZW50cy4gIEFsc28gY2FsbGVkCityZWxvY3MuCisKK0BpdGVtIHNlY3Rpb24KK09iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZSBhcmUgY29tcG9zZWQgb2Ygc2VjdGlvbnMuICBTZWN0aW9ucyBoYXZlCitvcHRpb25hbCBkYXRhIGFuZCBvcHRpb25hbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgorCitAaXRlbSBzaGFyZWQgbGlicmFyeQorQSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgdXNlZCBieSBtYW55IGV4ZWN1dGFibGVzIHdpdGhvdXQKK2FjdHVhbGx5IGJlaW5nIGxpbmtlZCBpbnRvIGVhY2ggZXhlY3V0YWJsZS4gIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudAoraW1wbGVtZW50YXRpb25zIG9mIHNoYXJlZCBsaWJyYXJpZXMsIGVhY2ggaGF2aW5nIHNsaWdodGx5IGRpZmZlcmVudAorZmVhdHVyZXMuCisKK0BpdGVtIHN5bWJvbAorRWFjaCBvYmplY3QgZmlsZSBhbmQgZXhlY3V0YWJsZSBtYXkgaGF2ZSBhIGxpc3Qgb2Ygc3ltYm9scywgb2Z0ZW4KK3JlZmVycmVkIHRvIGFzIHRoZSBzeW1ib2wgdGFibGUuICBBIHN5bWJvbCBpcyBiYXNpY2FsbHkgYSBuYW1lIGFuZCBhbgorYWRkcmVzcy4gIFRoZXJlIG1heSBhbHNvIGJlIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIHRoZSB0eXBlIG9mCitzeW1ib2wsIGFsdGhvdWdoIHRoZSB0eXBlIG9mIGEgc3ltYm9sIGlzIG5vcm1hbGx5IHNvbWV0aGluZyBzaW1wbGUgbGlrZQorZnVuY3Rpb24gb3Igb2JqZWN0LCBhbmQgc2hvdWxkIGJlIGNvbmZ1c2VkIHdpdGggdGhlIG1vcmUgY29tcGxleCBDCitub3Rpb24gb2YgdHlwZS4gIFR5cGljYWxseSBldmVyeSBnbG9iYWwgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIGEgQworcHJvZ3JhbSB3aWxsIGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCisKK0BpdGVtIHRhcmdldCB2ZWN0b3IKK0Egc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlCitmb3JtYXQuICBUaGUgQHNhbXB7YmZkX3RhcmdldH0gc3RydWN0dXJlLgorCitAaXRlbSBXaW4zMgorVGhlIGN1cnJlbnQgV2luZG93cyBBUEksIGltcGxlbWVudGVkIGJ5IFdpbmRvd3MgOTUgYW5kIGxhdGVyIGFuZCBXaW5kb3dzCitOVCAzLjUxIGFuZCBsYXRlciwgYnV0IG5vdCBieSBXaW5kb3dzIDMuMS4KKworQGl0ZW0gWENPRkYKK1RoZSBlWHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBSVguICBBIHZhcmlhbnQgb2YKK0NPRkYsIHdpdGggYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzeW1ib2wgdGFibGUgaW1wbGVtZW50YXRpb24uCisKK0BpdGVtIFZNQQorVmlydHVhbCBNZW1vcnkgQWRkcmVzcy4gIFRoaXMgaXMgdGhlIGFkZHJlc3MgYSBzZWN0aW9uIHdpbGwgaGF2ZSB3aGVuCithbiBleGVjdXRhYmxlIGlzIHJ1bi4gIENvbXBhcmUgd2l0aCBMTUEsIGFib3ZlLgorQGVuZCB0YWJsZQorCitAbm9kZSBJbmRleAorQHVubnVtYmVyZWRzZWMgSW5kZXgKK0BwcmludGluZGV4IGNwCisKK0Bjb250ZW50cworQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRzdW1tLnRleGkgYi9iZmQvZG9jL2JmZHN1bW0udGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQ1MzFhCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2RvYy9iZmRzdW1tLnRleGkKQEAgLTAsMCArMSwxNDggQEAKK0BjIFRoaXMgc3VtbWFyeSBvZiBCRkQgaXMgc2hhcmVkIGJ5IHRoZSBCRkQgYW5kIExEIGRvY3MuCitXaGVuIGFuIG9iamVjdCBmaWxlIGlzIG9wZW5lZCwgQkZEIHN1YnJvdXRpbmVzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lCit0aGUgZm9ybWF0IG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIFRoZXkgdGhlbiBidWlsZCBhIGRlc2NyaXB0b3IgaW4KK21lbW9yeSB3aXRoIHBvaW50ZXJzIHRvIHJvdXRpbmVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFjY2VzcyBlbGVtZW50cyBvZgordGhlIG9iamVjdCBmaWxlJ3MgZGF0YSBzdHJ1Y3R1cmVzLgorCitBcyBkaWZmZXJlbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGhlIG9iamVjdCBmaWxlcyBpcyByZXF1aXJlZCwKK0JGRCByZWFkcyBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucyBvZiB0aGUgZmlsZSBhbmQgcHJvY2Vzc2VzIHRoZW0uCitGb3IgZXhhbXBsZSwgYSB2ZXJ5IGNvbW1vbiBvcGVyYXRpb24gZm9yIHRoZSBsaW5rZXIgaXMgcHJvY2Vzc2luZyBzeW1ib2wKK3RhYmxlcy4gIEVhY2ggQkZEIGJhY2sgZW5kIHByb3ZpZGVzIGEgcm91dGluZSBmb3IgY29udmVydGluZworYmV0d2VlbiB0aGUgb2JqZWN0IGZpbGUncyByZXByZXNlbnRhdGlvbiBvZiBzeW1ib2xzIGFuZCBhbiBpbnRlcm5hbAorY2Fub25pY2FsIGZvcm1hdC4gV2hlbiB0aGUgbGlua2VyIGFza3MgZm9yIHRoZSBzeW1ib2wgdGFibGUgb2YgYW4gb2JqZWN0CitmaWxlLCBpdCBjYWxscyB0aHJvdWdoIGEgbWVtb3J5IHBvaW50ZXIgdG8gdGhlIHJvdXRpbmUgZnJvbSB0aGUKK3JlbGV2YW50IEJGRCBiYWNrIGVuZCB3aGljaCByZWFkcyBhbmQgY29udmVydHMgdGhlIHRhYmxlIGludG8gYSBjYW5vbmljYWwKK2Zvcm0uICBUaGUgbGlua2VyIHRoZW4gb3BlcmF0ZXMgdXBvbiB0aGUgY2Fub25pY2FsIGZvcm0uIFdoZW4gdGhlIGxpbmsgaXMKK2ZpbmlzaGVkIGFuZCB0aGUgbGlua2VyIHdyaXRlcyB0aGUgb3V0cHV0IGZpbGUncyBzeW1ib2wgdGFibGUsCithbm90aGVyIEJGRCBiYWNrIGVuZCByb3V0aW5lIGlzIGNhbGxlZCB0byB0YWtlIHRoZSBuZXdseQorY3JlYXRlZCBzeW1ib2wgdGFibGUgYW5kIGNvbnZlcnQgaXQgaW50byB0aGUgY2hvc2VuIG91dHB1dCBmb3JtYXQuCisKK0BtZW51CisqIEJGRCBpbmZvcm1hdGlvbiBsb3NzOjoJSW5mb3JtYXRpb24gTG9zcworKiBDYW5vbmljYWwgZm9ybWF0OjoJCVRoZSBCRkQJY2Fub25pY2FsIG9iamVjdC1maWxlIGZvcm1hdCAKK0BlbmQgbWVudQorCitAbm9kZSBCRkQgaW5mb3JtYXRpb24gbG9zcworQHN1YnNlY3Rpb24gSW5mb3JtYXRpb24gTG9zcworCitAZW1waHtJbmZvcm1hdGlvbiBjYW4gYmUgbG9zdCBkdXJpbmcgb3V0cHV0Ln0gVGhlIG91dHB1dCBmb3JtYXRzCitzdXBwb3J0ZWQgYnkgQkZEIGRvIG5vdCBwcm92aWRlIGlkZW50aWNhbCBmYWNpbGl0aWVzLCBhbmQKK2luZm9ybWF0aW9uIHdoaWNoIGNhbiBiZSBkZXNjcmliZWQgaW4gb25lIGZvcm0gaGFzIG5vd2hlcmUgdG8gZ28gaW4KK2Fub3RoZXIgZm9ybWF0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzIGFsaWdubWVudCBpbmZvcm1hdGlvbiBpbgorQGNvZGV7Yi5vdXR9LiBUaGVyZSBpcyBub3doZXJlIGluIGFuIEBjb2Rle2Eub3V0fSBmb3JtYXQgZmlsZSB0byBzdG9yZQorYWxpZ25tZW50IGluZm9ybWF0aW9uIG9uIHRoZSBjb250YWluZWQgZGF0YSwgc28gd2hlbiBhIGZpbGUgaXMgbGlua2VkCitmcm9tIEBjb2Rle2Iub3V0fSBhbmQgYW4gQGNvZGV7YS5vdXR9IGltYWdlIGlzIHByb2R1Y2VkLCBhbGlnbm1lbnQKK2luZm9ybWF0aW9uIHdpbGwgbm90IHByb3BhZ2F0ZSB0byB0aGUgb3V0cHV0IGZpbGUuIChUaGUgbGlua2VyIHdpbGwKK3N0aWxsIHVzZSB0aGUgYWxpZ25tZW50IGluZm9ybWF0aW9uIGludGVybmFsbHksIHNvIHRoZSBsaW5rIGlzIHBlcmZvcm1lZAorY29ycmVjdGx5KS4KKworQW5vdGhlciBleGFtcGxlIGlzIENPRkYgc2VjdGlvbiBuYW1lcy4gQ09GRiBmaWxlcyBtYXkgY29udGFpbiBhbgordW5saW1pdGVkIG51bWJlciBvZiBzZWN0aW9ucywgZWFjaCBvbmUgd2l0aCBhIHRleHR1YWwgc2VjdGlvbiBuYW1lLiBJZgordGhlIHRhcmdldCBvZiB0aGUgbGluayBpcyBhIGZvcm1hdCB3aGljaCBkb2VzIG5vdCBoYXZlIG1hbnkgc2VjdGlvbnMgKGUuZy4sCitAY29kZXthLm91dH0pIG9yIGhhcyBzZWN0aW9ucyB3aXRob3V0IG5hbWVzIChlLmcuLCB0aGUgT2FzeXMgZm9ybWF0KSwgdGhlCitsaW5rIGNhbm5vdCBiZSBkb25lIHNpbXBseS4gWW91IGNhbiBjaXJjdW12ZW50IHRoaXMgcHJvYmxlbSBieQorZGVzY3JpYmluZyB0aGUgZGVzaXJlZCBpbnB1dC10by1vdXRwdXQgc2VjdGlvbiBtYXBwaW5nIHdpdGggdGhlIGxpbmtlciBjb21tYW5kCitsYW5ndWFnZS4KKworQGVtcGh7SW5mb3JtYXRpb24gY2FuIGJlIGxvc3QgZHVyaW5nIGNhbm9uaWNhbGl6YXRpb24ufSBUaGUgQkZECitpbnRlcm5hbCBjYW5vbmljYWwgZm9ybSBvZiB0aGUgZXh0ZXJuYWwgZm9ybWF0cyBpcyBub3QgZXhoYXVzdGl2ZTsgdGhlcmUKK2FyZSBzdHJ1Y3R1cmVzIGluIGlucHV0IGZvcm1hdHMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIGRpcmVjdAorcmVwcmVzZW50YXRpb24gaW50ZXJuYWxseS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgQkZEIGJhY2sgZW5kcworY2Fubm90IG1haW50YWluIGFsbCBwb3NzaWJsZSBkYXRhIHJpY2huZXNzIHRocm91Z2ggdGhlIHRyYW5zZm9ybWF0aW9uCitiZXR3ZWVuIGV4dGVybmFsIHRvIGludGVybmFsIGFuZCBiYWNrIHRvIGV4dGVybmFsIGZvcm1hdHMuCisKK1RoaXMgbGltaXRhdGlvbiBpcyBvbmx5IGEgcHJvYmxlbSB3aGVuIGFuIGFwcGxpY2F0aW9uIHJlYWRzIG9uZQorZm9ybWF0IGFuZCB3cml0ZXMgYW5vdGhlci4gIEVhY2ggQkZEIGJhY2sgZW5kIGlzIHJlc3BvbnNpYmxlIGZvcgorbWFpbnRhaW5pbmcgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgdGhlIGludGVybmFsIEJGRAorY2Fub25pY2FsIGZvcm0gaGFzIHN0cnVjdHVyZXMgd2hpY2ggYXJlIG9wYXF1ZSB0byB0aGUgQkZEIGNvcmUsCithbmQgZXhwb3J0ZWQgb25seSB0byB0aGUgYmFjayBlbmRzLiBXaGVuIGEgZmlsZSBpcyByZWFkIGluIG9uZSBmb3JtYXQsCit0aGUgY2Fub25pY2FsIGZvcm0gaXMgZ2VuZXJhdGVkIGZvciBCRkQgYW5kIHRoZSBhcHBsaWNhdGlvbi4gQXQgdGhlCitzYW1lIHRpbWUsIHRoZSBiYWNrIGVuZCBzYXZlcyBhd2F5IGFueSBpbmZvcm1hdGlvbiB3aGljaCBtYXkgb3RoZXJ3aXNlCitiZSBsb3N0LiBJZiB0aGUgZGF0YSBpcyB0aGVuIHdyaXR0ZW4gYmFjayBpbiB0aGUgc2FtZSBmb3JtYXQsIHRoZSBiYWNrCitlbmQgcm91dGluZSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBjYW5vbmljYWwgZm9ybSBwcm92aWRlZCBieSB0aGUKK0JGRCBjb3JlIGFzIHdlbGwgYXMgdGhlIGluZm9ybWF0aW9uIGl0IHByZXBhcmVkIGVhcmxpZXIuICBTaW5jZQordGhlcmUgaXMgYSBncmVhdCBkZWFsIG9mIGNvbW1vbmFsaXR5IGJldHdlZW4gYmFjayBlbmRzLAordGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gbG9zdCB3aGVuCitsaW5raW5nIG9yIGNvcHlpbmcgYmlnIGVuZGlhbiBDT0ZGIHRvIGxpdHRsZSBlbmRpYW4gQ09GRiwgb3IgQGNvZGV7YS5vdXR9IHRvCitAY29kZXtiLm91dH0uICBXaGVuIGEgbWl4dHVyZSBvZiBmb3JtYXRzIGlzIGxpbmtlZCwgdGhlIGluZm9ybWF0aW9uIGlzCitvbmx5IGxvc3QgZnJvbSB0aGUgZmlsZXMgd2hvc2UgZm9ybWF0IGRpZmZlcnMgZnJvbSB0aGUgZGVzdGluYXRpb24uCisKK0Bub2RlIENhbm9uaWNhbCBmb3JtYXQKK0BzdWJzZWN0aW9uIFRoZSBCRkQgY2Fub25pY2FsIG9iamVjdC1maWxlIGZvcm1hdAorCitUaGUgZ3JlYXRlc3QgcG90ZW50aWFsIGZvciBsb3NzIG9mIGluZm9ybWF0aW9uIG9jY3VycyB3aGVuIHRoZXJlIGlzIHRoZSBsZWFzdAorb3ZlcmxhcCBiZXR3ZWVuIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgc291cmNlIGZvcm1hdCwgdGhhdAorc3RvcmVkIGJ5IHRoZSBjYW5vbmljYWwgZm9ybWF0LCBhbmQgdGhhdCBuZWVkZWQgYnkgdGhlCitkZXN0aW5hdGlvbiBmb3JtYXQuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGNhbm9uaWNhbCBmb3JtIG1heSBoZWxwCit5b3UgdW5kZXJzdGFuZCB3aGljaCBraW5kcyBvZiBkYXRhIHlvdSBjYW4gY291bnQgb24gcHJlc2VydmluZyBhY3Jvc3MKK2NvbnZlcnNpb25zLgorQGNpbmRleCBCRkQgY2Fub25pY2FsIGZvcm1hdAorQGNpbmRleCBpbnRlcm5hbCBvYmplY3QtZmlsZSBmb3JtYXQKKworQHRhYmxlIEBlbXBoCitAaXRlbSBmaWxlcworSW5mb3JtYXRpb24gc3RvcmVkIG9uIGEgcGVyLWZpbGUgYmFzaXMgaW5jbHVkZXMgdGFyZ2V0IG1hY2hpbmUKK2FyY2hpdGVjdHVyZSwgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBmb3JtYXQgdHlwZSwgYSBkZW1hbmQgcGFnZWFibGUKK2JpdCwgYW5kIGEgd3JpdGUgcHJvdGVjdGVkIGJpdC4gIEluZm9ybWF0aW9uIGxpa2UgVW5peCBtYWdpYyBudW1iZXJzIGlzCitub3Qgc3RvcmVkIGhlcmUtLS1vbmx5IHRoZSBtYWdpYyBudW1iZXJzJyBtZWFuaW5nLCBzbyBhIEBjb2Rle1pNQUdJQ30KK2ZpbGUgd291bGQgaGF2ZSBib3RoIHRoZSBkZW1hbmQgcGFnZWFibGUgYml0IGFuZCB0aGUgd3JpdGUgcHJvdGVjdGVkCit0ZXh0IGJpdCBzZXQuICBUaGUgYnl0ZSBvcmRlciBvZiB0aGUgdGFyZ2V0IGlzIHN0b3JlZCBvbiBhIHBlci1maWxlCitiYXNpcywgc28gdGhhdCBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIG9iamVjdCBmaWxlcyBtYXkgYmUgdXNlZCB3aXRoIG9uZQorYW5vdGhlci4KKworQGl0ZW0gc2VjdGlvbnMKK0VhY2ggc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiwgdGhlCitzZWN0aW9uJ3Mgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgb2JqZWN0IGZpbGUsIHNpemUgYW5kIGFsaWdubWVudAoraW5mb3JtYXRpb24sIHZhcmlvdXMgZmxhZ3MsIGFuZCBwb2ludGVycyBpbnRvIG90aGVyIEJGRCBkYXRhCitzdHJ1Y3R1cmVzLgorCitAaXRlbSBzeW1ib2xzCitFYWNoIHN5bWJvbCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgb2JqZWN0IGZpbGUKK3doaWNoIG9yaWdpbmFsbHkgZGVmaW5lZCBpdCwgaXRzIG5hbWUsIGl0cyB2YWx1ZSwgYW5kIHZhcmlvdXMgZmxhZworYml0cy4gIFdoZW4gYSBCRkQgYmFjayBlbmQgcmVhZHMgaW4gYSBzeW1ib2wgdGFibGUsIGl0IHJlbG9jYXRlcyBhbGwKK3N5bWJvbHMgdG8gbWFrZSB0aGVtIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoZSBzZWN0aW9uIHdoZXJlIHRoZXkgd2VyZQorZGVmaW5lZC4gIERvaW5nIHRoaXMgZW5zdXJlcyB0aGF0IGVhY2ggc3ltYm9sIHBvaW50cyB0byBpdHMgY29udGFpbmluZworc2VjdGlvbi4gIEVhY2ggc3ltYm9sIGFsc28gaGFzIGEgdmFyeWluZyBhbW91bnQgb2YgaGlkZGVuIHByaXZhdGUgZGF0YQorZm9yIHRoZSBCRkQgYmFjayBlbmQuICBTaW5jZSB0aGUgc3ltYm9sIHBvaW50cyB0byB0aGUgb3JpZ2luYWwgZmlsZSwgdGhlCitwcml2YXRlIGRhdGEgZm9ybWF0IGZvciB0aGF0IHN5bWJvbCBpcyBhY2Nlc3NpYmxlLiAgQGNvZGV7bGR9IGNhbgorb3BlcmF0ZSBvbiBhIGNvbGxlY3Rpb24gb2Ygc3ltYm9scyBvZiB3aWxkbHkgZGlmZmVyZW50IGZvcm1hdHMgd2l0aG91dAorcHJvYmxlbXMuCisKK05vcm1hbCBnbG9iYWwgYW5kIHNpbXBsZSBsb2NhbCBzeW1ib2xzIGFyZSBtYWludGFpbmVkIG9uIG91dHB1dCwgc28gYW4KK291dHB1dCBmaWxlIChubyBtYXR0ZXIgaXRzIGZvcm1hdCkgd2lsbCByZXRhaW4gc3ltYm9scyBwb2ludGluZyB0bworZnVuY3Rpb25zIGFuZCB0byBnbG9iYWwsIHN0YXRpYywgYW5kIGNvbW1vbiB2YXJpYWJsZXMuICBTb21lIHN5bWJvbAoraW5mb3JtYXRpb24gaXMgbm90IHdvcnRoIHJldGFpbmluZzsgaW4gQGNvZGV7YS5vdXR9LCB0eXBlIGluZm9ybWF0aW9uIGlzCitzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSBhcyBsb25nIHN5bWJvbCBuYW1lcy4gIFRoaXMgaW5mb3JtYXRpb24gd291bGQKK2JlIHVzZWxlc3MgdG8gbW9zdCBDT0ZGIGRlYnVnZ2VyczsgdGhlIGxpbmtlciBoYXMgY29tbWFuZCBsaW5lIHN3aXRjaGVzCit0byBhbGxvdyB1c2VycyB0byB0aHJvdyBpdCBhd2F5LgorCitUaGVyZSBpcyBvbmUgd29yZCBvZiB0eXBlIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgc3ltYm9sLCBzbyBpZiB0aGUKK2Zvcm1hdCBzdXBwb3J0cyBzeW1ib2wgdHlwZSBpbmZvcm1hdGlvbiB3aXRoaW4gc3ltYm9scyAoZm9yIGV4YW1wbGUsIENPRkYsCitJRUVFLCBPYXN5cykgYW5kIHRoZSB0eXBlIGlzIHNpbXBsZSBlbm91Z2ggdG8gZml0IHdpdGhpbiBvbmUgd29yZAorKG5lYXJseSBldmVyeXRoaW5nIGJ1dCBhZ2dyZWdhdGVzKSwgdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJlc2VydmVkLgorCitAaXRlbSByZWxvY2F0aW9uIGxldmVsCitFYWNoIGNhbm9uaWNhbCBCRkQgcmVsb2NhdGlvbiByZWNvcmQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wgdG8KK3JlbG9jYXRlIHRvLCB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlbG9jYXRlLCB0aGUgc2VjdGlvbiB0aGUgZGF0YQoraXMgaW4sIGFuZCBhIHBvaW50ZXIgdG8gYSByZWxvY2F0aW9uIHR5cGUgZGVzY3JpcHRvci4gUmVsb2NhdGlvbiBpcworcGVyZm9ybWVkIGJ5IHBhc3NpbmcgbWVzc2FnZXMgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbiB0eXBlCitkZXNjcmlwdG9yIGFuZCB0aGUgc3ltYm9sIHBvaW50ZXIuIFRoZXJlZm9yZSwgcmVsb2NhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZAorb24gb3V0cHV0IGRhdGEgdXNpbmcgYSByZWxvY2F0aW9uIG1ldGhvZCB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIGluIG9uZSBvZiB0aGUKK2lucHV0IGZvcm1hdHMuIEZvciBpbnN0YW5jZSwgT2FzeXMgcHJvdmlkZXMgYSBieXRlIHJlbG9jYXRpb24gZm9ybWF0LgorQSByZWxvY2F0aW9uIHJlY29yZCByZXF1ZXN0aW5nIHRoaXMgcmVsb2NhdGlvbiB0eXBlIHdvdWxkIHBvaW50CitpbmRpcmVjdGx5IHRvIGEgcm91dGluZSB0byBwZXJmb3JtIHRoaXMsIHNvIHRoZSByZWxvY2F0aW9uIG1heSBiZQorcGVyZm9ybWVkIG9uIGEgYnl0ZSBiZWluZyB3cml0dGVuIHRvIGEgNjhrIENPRkYgZmlsZSwgZXZlbiB0aG91Z2ggNjhrIENPRkYKK2hhcyBubyBzdWNoIHJlbG9jYXRpb24gdHlwZS4KKworQGl0ZW0gbGluZSBudW1iZXJzCitPYmplY3QgZm9ybWF0cyBjYW4gY29udGFpbiwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgc29tZSBmb3JtIG9mIG1hcHBpbmcKK2JldHdlZW4gc3ltYm9scywgc291cmNlIGxpbmUgbnVtYmVycywgYW5kIGFkZHJlc3NlcyBpbiB0aGUgb3V0cHV0IGZpbGUuCitUaGVzZSBhZGRyZXNzZXMgaGF2ZSB0byBiZSByZWxvY2F0ZWQgYWxvbmcgd2l0aCB0aGUgc3ltYm9sIGluZm9ybWF0aW9uLgorRWFjaCBzeW1ib2wgd2l0aCBhbiBhc3NvY2lhdGVkIGxpc3Qgb2YgbGluZSBudW1iZXIgcmVjb3JkcyBwb2ludHMgdG8gdGhlCitmaXJzdCByZWNvcmQgb2YgdGhlIGxpc3QuICBUaGUgaGVhZCBvZiBhIGxpbmUgbnVtYmVyIGxpc3QgY29uc2lzdHMgb2YgYQorcG9pbnRlciB0byB0aGUgc3ltYm9sLCB3aGljaCBhbGxvd3MgZmluZGluZyBvdXQgdGhlIGFkZHJlc3Mgb2YgdGhlCitmdW5jdGlvbiB3aG9zZSBsaW5lIG51bWJlciBpcyBiZWluZyBkZXNjcmliZWQuIFRoZSByZXN0IG9mIHRoZSBsaXN0IGlzCittYWRlIHVwIG9mIHBhaXJzOiBvZmZzZXRzIGludG8gdGhlIHNlY3Rpb24gYW5kIGxpbmUgbnVtYmVycy4gQW55IGZvcm1hdAord2hpY2ggY2FuIHNpbXBseSBkZXJpdmUgdGhpcyBpbmZvcm1hdGlvbiBjYW4gcGFzcyBpdCBzdWNjZXNzZnVsbHkKK2JldHdlZW4gZm9ybWF0cyAoQ09GRiwgSUVFRSBhbmQgT2FzeXMpLgorQGVuZCB0YWJsZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9jaGV3LmMgYi9iZmQvZG9jL2NoZXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE2OWMyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2RvYy9jaGV3LmMKQEAgLTAsMCArMSwxNTc5IEBACisvKiBjaGV3CisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgc3RldmUgY2hhbWJlcmxhaW4gQGN5Z251cworCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFlldCBhbm90aGVyIHdheSBvZiBleHRyYWN0aW5nIGRvY3VtZW50YXRpb24gZnJvbSBzb3VyY2UuCisgICBObywgSSBoYXZlbid0IGZpbmlzaGVkIGl0IHlldCwgYnV0IEkgaG9wZSB5b3UgcGVvcGxlIGxpa2UgaXQgYmV0dGVyCisgICB0aGFuIHRoZSBvbGQgd2F5CisgIAorICAgc2FjCisKKyAgIEJhc2ljYWxseSwgdGhpcyBpcyBhIHNvcnQgb2Ygc3RyaW5nIGZvcnRoLCBtYXliZSB3ZSBzaG91bGQgY2FsbCBpdAorICAgc3RydXRoPworCisgICBZb3UgZGVmaW5lIG5ldyB3b3JkcyB0aHVzOgorICAgOiA8bmV3d29yZD4gPG9sZHdvcmRzPiA7CisKKyovCisKKy8qIFByaW1pdGl2ZXMgcHJvdmlkZWQgYnkgdGhlIHByb2dyYW06CisKKyAgIFR3byBzdGFja3MgYXJlIHByb3ZpZGVkLCBhIHN0cmluZyBzdGFjayBhbmQgYW4gaW50ZWdlciBzdGFjay4KKworICAgSW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzOgorCWludGVybmFsX3dhbnRlZCAtIGluZGljYXRlcyB3aGV0aGVyIGAtaScgd2FzIHBhc3NlZAorCWludGVybmFsX21vZGUgLSB1c2VyLXNldHRhYmxlCisKKyAgIENvbW1hbmRzOgorCXB1c2hfdGV4dAorCSEgLSBwb3AgdG9wIG9mIGludGVnZXIgc3RhY2sgZm9yIGFkZHJlc3MsIHBvcCBuZXh0IGZvciB2YWx1ZTsgc3RvcmUKKwlAIC0gdHJlYXQgdmFsdWUgb24gaW50ZWdlciBzdGFjayBhcyB0aGUgYWRkcmVzcyBvZiBhbiBpbnRlZ2VyOyBwdXNoCisJCXRoYXQgaW50ZWdlciBvbiB0aGUgaW50ZWdlciBzdGFjayBhZnRlciBwb3BwaW5nIHRoZSAiYWRkcmVzcyIKKwloZWxsbyAtIHByaW50ICJoZWxsb1xuIiB0byBzdGRvdXQKKwlzdGRvdXQgLSBwdXQgc3Rkb3V0IG1hcmtlciBvbiBUT1MKKwlzdGRlcnIgLSBwdXQgc3RkZXJyIG1hcmtlciBvbiBUT1MKKwlwcmludCAtIHByaW50IFRPUy0xIG9uIFRPUyAoZWc6ICJoZWxsb1xuIiBzdGRvdXQgcHJpbnQpCisJc2tpcF9wYXN0X25ld2xpbmUKKwljYXRzdHIgLSBmbiBpY2F0c3RyCisJY29weV9wYXN0X25ld2xpbmUgLSBhcHBlbmQgaW5wdXQsIHVwIHRvIGFuZCBpbmNsdWRpbmcgbmV3bGluZSBpbnRvIFRPUworCWR1cCAtIGZuIG90aGVyX2R1cAorCWRyb3AgLSBkaXNjYXJkIFRPUworCWlkcm9wIC0gZGl0dG8KKwlyZW1jaGFyIC0gZGVsZXRlIGxhc3QgY2hhcmFjdGVyIGZyb20gVE9TCisJZ2V0X3N0dWZmX2luX2NvbW1hbmQKKwlkb19mYW5jeV9zdHVmZiAtIHRyYW5zbGF0ZSA8PGZvbz4+IHRvIEBjb2Rle2Zvb30gaW4gVE9TCisJYnVsbGV0aXplIC0gaWYgIm8iIGxpbmVzIGZvdW5kLCBwcmVwZW5kIEBpdGVtaXplIEBidWxsZXQgdG8gVE9TCisJCWFuZCBAaXRlbSB0byBlYWNoICJvIiBsaW5lOyBhcHBlbmQgQGVuZCBpdGVtaXplCisJY291cmllcml6ZSAtIHB1dCBAZXhhbXBsZSBhcm91bmQgLiBhbmQgfCBsaW5lcywgdHJhbnNsYXRlIHsqICp9IHsgfQorCWV4aXQgLSBmbiBjaGV3X2V4aXQKKwlzd2FwCisJb3V0cHV0ZG90cyAtIHN0cmlwIG91dCBsaW5lcyB3aXRob3V0IGxlYWRpbmcgZG90cworCXBhcmFtc3R1ZmYgLSBjb252ZXJ0IGZ1bGwgZGVjbGFyYXRpb24gaW50byAiUEFSQU1TIiBmb3JtIGlmIG5vdCBhbHJlYWR5CisJbWF5YmVjYXRzdHIgLSBkbyBjYXRzdHIgaWYgaW50ZXJuYWxfbW9kZSA9PSBpbnRlcm5hbF93YW50ZWQsIGRpc2NhcmQKKwkJdmFsdWUgaW4gYW55IGNhc2UKKwl0cmFuc2xhdGVjb21tZW50cyAtIHR1cm4geyogYW5kICp9IGludG8gY29tbWVudCBkZWxpbWl0ZXJzCisJa2lsbF9ib2d1c19saW5lcyAtIGdldCByaWQgb2YgZXh0cmEgbmV3bGluZXMKKwlpbmRlbnQKKwlpbnRlcm5hbG1vZGUgLSBwb3AgZnJvbSBpbnRlZ2VyIHN0YWNrLCBzZXQgYGludGVybmFsbW9kZScgdG8gdGhhdCB2YWx1ZQorCXByaW50X3N0YWNrX2xldmVsIC0gcHJpbnQgY3VycmVudCBzdGFjayBkZXB0aCB0byBzdGRlcnIKKwlzdHJpcF90cmFpbGluZ19uZXdsaW5lcyAtIGdvIGFoZWFkLCBndWVzcy4uLgorCVtxdW90ZWQgc3RyaW5nXSAtIHB1c2ggc3RyaW5nIG9udG8gc3RyaW5nIHN0YWNrCisJW3dvcmQgc3RhcnRpbmcgd2l0aCBkaWdpdF0gLSBwdXNoIGF0b2woc3RyKSBvbnRvIGludGVnZXIgc3RhY2sKKworICAgQSBjb21tYW5kIG11c3QgYmUgYWxsIHVwcGVyLWNhc2UsIGFuZCBhbG9uZSBvbiBhIGxpbmUuCisKKyAgIEZvby4gICovCisKKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIERFRl9TSVpFIDUwMDAKKyNkZWZpbmUgU1RBQ0sgNTAKKworaW50IGludGVybmFsX3dhbnRlZDsKK2ludCBpbnRlcm5hbF9tb2RlOworCitpbnQgd2FybmluZzsKKworLyogSGVyZSBpcyBhIHN0cmluZyB0eXBlIC4uLiAqLworCit0eXBlZGVmIHN0cnVjdCBidWZmZXIgCit7CisgIGNoYXIgKnB0cjsKKyAgdW5zaWduZWQgbG9uZyB3cml0ZV9pZHg7CisgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKK30gc3RyaW5nX3R5cGU7CisKKworI2lmZGVmIF9fU1REQ19fCitzdGF0aWMgdm9pZCBpbml0X3N0cmluZ193aXRoX3NpemUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBpbml0X3N0cmluZyAoc3RyaW5nX3R5cGUgKik7CitzdGF0aWMgaW50IGZpbmQgKHN0cmluZ190eXBlICosIGNoYXIgKik7CitzdGF0aWMgdm9pZCB3cml0ZV9idWZmZXIgKHN0cmluZ190eXBlICosIEZJTEUgKik7CitzdGF0aWMgdm9pZCBkZWxldGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKK3N0YXRpYyBjaGFyICphZGRyIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGNoYXIgYXQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBjYXRjaGFyIChzdHJpbmdfdHlwZSAqLCBpbnQpOworc3RhdGljIHZvaWQgb3ZlcndyaXRlX3N0cmluZyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7CitzdGF0aWMgdm9pZCBjYXRidWYgKHN0cmluZ190eXBlICosIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIGNhdHRleHQgKHN0cmluZ190eXBlICosIGNoYXIgKik7CitzdGF0aWMgdm9pZCBjYXRzdHIgKHN0cmluZ190eXBlICosIHN0cmluZ190eXBlICopOworI2VuZGlmCisKKworc3RhdGljIHZvaWQgREVGVU4oaW5pdF9zdHJpbmdfd2l0aF9zaXplLChidWZmZXIsIHNpemUpLAorCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECisJICAgdW5zaWduZWQgaW50IHNpemUgKQoreworICAgIGJ1ZmZlci0+d3JpdGVfaWR4ID0gMDsKKyAgICBidWZmZXItPnNpemUgPSBzaXplOworICAgIGJ1ZmZlci0+cHRyID0gbWFsbG9jKHNpemUpOworfQorCitzdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZywoYnVmZmVyKSwKKwkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQoreworICAgIGluaXRfc3RyaW5nX3dpdGhfc2l6ZShidWZmZXIsIERFRl9TSVpFKTsKKworfQorCitzdGF0aWMgaW50IERFRlVOKGZpbmQsIChzdHIsIHdoYXQpLAorCSAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKKwkgIGNoYXIgKndoYXQpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgY2hhciAqcDsKKyAgICBwID0gd2hhdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLT53cml0ZV9pZHggJiYgKnA7IGkrKykgCisgICAgeworCWlmICgqcCA9PSBzdHItPnB0cltpXSkKKwkgcCsrOworCWVsc2UKKwkgcCA9IHdoYXQ7CisgICAgfQorICAgIHJldHVybiAoKnAgPT0gMCk7CisgICAgCit9CisKK3N0YXRpYyB2b2lkIERFRlVOKHdyaXRlX2J1ZmZlciwoYnVmZmVyLCBmKSwKKwkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAorCSAgIEZJTEUgKmYpCit7CisgICAgZndyaXRlKGJ1ZmZlci0+cHRyLCBidWZmZXItPndyaXRlX2lkeCwgMSwgZik7Cit9CisKKworc3RhdGljIHZvaWQgREVGVU4oZGVsZXRlX3N0cmluZywoYnVmZmVyKSwKKwkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQoreworICAgIGZyZWUoYnVmZmVyLT5wdHIpOworfQorCisKK3N0YXRpYyBjaGFyICpERUZVTihhZGRyLCAoYnVmZmVyLCBpZHgpLAorCSAgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAorCSAgICB1bnNpZ25lZCBpbnQgaWR4KQoreworICAgIHJldHVybiBidWZmZXItPnB0ciArIGlkeDsKK30KKworc3RhdGljIGNoYXIgREVGVU4oYXQsKGJ1ZmZlciwgcG9zKSwKKwkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAorCSAgIHVuc2lnbmVkIGludCBwb3MpIAoreworICBpZiAocG9zID49IGJ1ZmZlci0+d3JpdGVfaWR4KSAKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGJ1ZmZlci0+cHRyW3Bvc107Cit9CisKK3N0YXRpYyB2b2lkIERFRlVOKGNhdGNoYXIsKGJ1ZmZlciwgY2gpLCAKKwkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAorCSAgIGludCBjaCkKK3sKKyAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ID09IGJ1ZmZlci0+c2l6ZSkgCisgICAgeworICAgICAgYnVmZmVyLT5zaXplICo9MjsKKyAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyhidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKKyAgICB9CisKKyAgYnVmZmVyLT5wdHJbYnVmZmVyLT53cml0ZV9pZHggKysgXSA9IGNoOworfQorCisKK3N0YXRpYyB2b2lkIERFRlVOKG92ZXJ3cml0ZV9zdHJpbmcsKGRzdCwgICBzcmMpLAorCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECisJICAgc3RyaW5nX3R5cGUgKnNyYykKK3sKKyAgICBmcmVlKGRzdC0+cHRyKTsKKyAgICBkc3QtPnNpemUgPSBzcmMtPnNpemU7CisgICAgZHN0LT53cml0ZV9pZHggPSBzcmMtPndyaXRlX2lkeDsKKyAgICBkc3QtPnB0ciA9IHNyYy0+cHRyOworfQorCitzdGF0aWMgdm9pZCBERUZVTihjYXRidWYsKGJ1ZmZlciwgYnVmLCBsZW4pLAorCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECisJICAgY2hhciAqYnVmIEFORAorCSAgIHVuc2lnbmVkIGludCBsZW4pCit7CisgIGlmIChidWZmZXItPndyaXRlX2lkeCArIGxlbiA+PSBidWZmZXItPnNpemUpCisgICAgeworICAgICAgd2hpbGUgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKKwlidWZmZXItPnNpemUgKj0gMjsKKyAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyAoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+c2l6ZSk7CisgICAgfQorICBtZW1jcHkgKGJ1ZmZlci0+cHRyICsgYnVmZmVyLT53cml0ZV9pZHgsIGJ1ZiwgbGVuKTsKKyAgYnVmZmVyLT53cml0ZV9pZHggKz0gbGVuOworfQorCitzdGF0aWMgdm9pZCBERUZVTihjYXR0ZXh0LChidWZmZXIsIHN0cmluZyksCisJICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKKwkgICBjaGFyICpzdHJpbmcpCit7CisgIGNhdGJ1ZiAoYnVmZmVyLCBzdHJpbmcsICh1bnNpZ25lZCBpbnQpIHN0cmxlbiAoc3RyaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lkIERFRlVOKGNhdHN0ciwoZHN0LCBzcmMpLAorCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECisJICAgc3RyaW5nX3R5cGUgKnNyYykKK3sKKyAgY2F0YnVmIChkc3QsIHNyYy0+cHRyLCBzcmMtPndyaXRlX2lkeCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCAKK0RFRlVOKHNraXBfd2hpdGVfYW5kX3N0YXJzLChzcmMsIGlkeCksCisgICAgICBzdHJpbmdfdHlwZSAqc3JjIEFORAorICAgICAgdW5zaWduZWQgaW50IGlkeCkKK3sKKyAgY2hhciBjOworICB3aGlsZSAoKGMgPSBhdChzcmMsaWR4KSksCisJIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKQorCSB8fCAoYyA9PSAnKicKKwkgICAgIC8qIERvbid0IHNraXAgcGFzdCBlbmQtb2YtY29tbWVudCBvciBzdGFyIGFzIGZpcnN0CisJCWNoYXJhY3RlciBvbiBpdHMgbGluZS4gICovCisJICAgICAmJiBhdChzcmMsaWR4ICsxKSAhPSAnLycKKwkgICAgICYmIGF0KHNyYyxpZHggLTEpICE9ICdcbicpKSAKKyAgICBpZHgrKzsKKyAgcmV0dXJuIGlkeDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cmluZ190eXBlIHN0YWNrW1NUQUNLXTsKK3N0cmluZ190eXBlICp0b3M7CisKK3Vuc2lnbmVkIGludCBpZHggPSAwOyAvKiBQb3MgaW4gaW5wdXQgYnVmZmVyICovCitzdHJpbmdfdHlwZSAqcHRyOyAvKiBhbmQgdGhlIGJ1ZmZlciAqLwordHlwZWRlZiB2b2lkICgqc3RpbnN0X3R5cGUpKCk7CitzdGluc3RfdHlwZSAqcGM7CitzdGluc3RfdHlwZSBzc3RhY2tbU1RBQ0tdOworc3RpbnN0X3R5cGUgKnNzcCA9ICZzc3RhY2tbMF07Citsb25nIGlzdGFja1tTVEFDS107Citsb25nICppc3AgPSAmaXN0YWNrWzBdOworCit0eXBlZGVmIGludCAqd29yZF90eXBlOworCisKKworc3RydWN0IGRpY3Rfc3RydWN0Cit7CisgICAgY2hhciAqd29yZDsKKyAgICBzdHJ1Y3QgZGljdF9zdHJ1Y3QgKm5leHQ7CisgICAgc3RpbnN0X3R5cGUgKmNvZGU7CisgICAgaW50IGNvZGVfbGVuZ3RoOworICAgIGludCBjb2RlX2VuZDsKKyAgICBpbnQgdmFyOworICAgIAorfTsKK3R5cGVkZWYgc3RydWN0IGRpY3Rfc3RydWN0IGRpY3RfdHlwZTsKKyNkZWZpbmUgV09SRCh4KSBzdGF0aWMgdm9pZCB4KCkKKworc3RhdGljIHZvaWQKK2RpZSAobXNnKQorICAgICBjaGFyICptc2c7Cit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtc2cpOworICBleGl0ICgxKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3JhbmdlICgpCit7CisgIGlmICh0b3MgPCBzdGFjaykKKyAgICBkaWUgKCJ1bmRlcmZsb3cgaW4gc3RyaW5nIHN0YWNrIik7CisgIGlmICh0b3MgPj0gc3RhY2sgKyBTVEFDSykKKyAgICBkaWUgKCJvdmVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKK30KKworc3RhdGljIHZvaWQKK2ljaGVja19yYW5nZSAoKQoreworICBpZiAoaXNwIDwgaXN0YWNrKQorICAgIGRpZSAoInVuZGVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7CisgIGlmIChpc3AgPj0gaXN0YWNrICsgU1RBQ0spCisgICAgZGllICgib3ZlcmZsb3cgaW4gaW50ZWdlciBzdGFjayIpOworfQorCisjaWZkZWYgX19TVERDX18KK3N0YXRpYyB2b2lkIGV4ZWMgKGRpY3RfdHlwZSAqKTsKK3N0YXRpYyB2b2lkIGNhbGwgKHZvaWQpOworc3RhdGljIHZvaWQgcmVtY2hhciAodm9pZCksIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICh2b2lkKSwgcHVzaF9udW1iZXIgKHZvaWQpOworc3RhdGljIHZvaWQgcHVzaF90ZXh0ICh2b2lkKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9ub25jb21tZW50cyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7CitzdGF0aWMgdm9pZCBwcmludF9zdGFja19sZXZlbCAodm9pZCk7CitzdGF0aWMgdm9pZCBwYXJhbXN0dWZmICh2b2lkKSwgdHJhbnNsYXRlY29tbWVudHMgKHZvaWQpOworc3RhdGljIHZvaWQgb3V0cHV0ZG90cyAodm9pZCksIGNvdXJpZXJpemUgKHZvaWQpLCBidWxsZXRpemUgKHZvaWQpOworc3RhdGljIHZvaWQgZG9fZmFuY3lfc3R1ZmYgKHZvaWQpOworc3RhdGljIGludCBpc2NvbW1hbmQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IGNvcHlfcGFzdF9uZXdsaW5lIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQsIHN0cmluZ190eXBlICopOworc3RhdGljIHZvaWQgaWNvcHlfcGFzdF9uZXdsaW5lICh2b2lkKSwga2lsbF9ib2d1c19saW5lcyAodm9pZCksIGluZGVudCAodm9pZCk7CitzdGF0aWMgdm9pZCBnZXRfc3R1ZmZfaW5fY29tbWFuZCAodm9pZCksIHN3YXAgKHZvaWQpLCBvdGhlcl9kdXAgKHZvaWQpOworc3RhdGljIHZvaWQgZHJvcCAodm9pZCksIGlkcm9wICh2b2lkKTsKK3N0YXRpYyB2b2lkIGljYXRzdHIgKHZvaWQpLCBza2lwX3Bhc3RfbmV3bGluZSAodm9pZCksIGludGVybmFsbW9kZSAodm9pZCk7CitzdGF0aWMgdm9pZCBtYXliZWNhdHN0ciAodm9pZCk7CitzdGF0aWMgY2hhciAqbmV4dHdvcmQgKGNoYXIgKiwgY2hhciAqKik7CitkaWN0X3R5cGUgKmxvb2t1cF93b3JkIChjaGFyICopOworc3RhdGljIHZvaWQgcGVyZm9ybSAodm9pZCk7CitkaWN0X3R5cGUgKm5ld2VudHJ5IChjaGFyICopOwordW5zaWduZWQgaW50IGFkZF90b19kZWZpbml0aW9uIChkaWN0X3R5cGUgKiwgc3RpbnN0X3R5cGUpOwordm9pZCBhZGRfaW50cmluc2ljIChjaGFyICosIHZvaWQgKCopKCkpOwordm9pZCBhZGRfdmFyIChjaGFyICopOwordm9pZCBjb21waWxlIChjaGFyICopOworc3RhdGljIHZvaWQgYmFuZyAodm9pZCk7CitzdGF0aWMgdm9pZCBhdHNpZ24gKHZvaWQpOworc3RhdGljIHZvaWQgaGVsbG8gKHZvaWQpOworc3RhdGljIHZvaWQgc3Rkb3V0XyAodm9pZCk7CitzdGF0aWMgdm9pZCBzdGRlcnJfICh2b2lkKTsKK3N0YXRpYyB2b2lkIHByaW50ICh2b2lkKTsKK3N0YXRpYyB2b2lkIHJlYWRfaW4gKHN0cmluZ190eXBlICosIEZJTEUgKik7CitzdGF0aWMgdm9pZCB1c2FnZSAodm9pZCk7CitzdGF0aWMgdm9pZCBjaGV3X2V4aXQgKHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIERFRlVOKGV4ZWMsKHdvcmQpLAorCQkgIGRpY3RfdHlwZSAqd29yZCkKK3sKKyAgcGMgPSB3b3JkLT5jb2RlOworICB3aGlsZSAoKnBjKSAKKyAgICAoKnBjKSgpOworfQorV09SRChjYWxsKQoreworICAgIHN0aW5zdF90eXBlICpvbGRwYyA9IHBjOworICAgIGRpY3RfdHlwZSAqZTsKKyAgICBlID0gIChkaWN0X3R5cGUgKikocGMgWzFdKTsKKyAgICBleGVjKGUpOworICAgIHBjID0gb2xkcGMgKyAyOworICAgIAorfQorCitXT1JEKHJlbWNoYXIpCit7CisgIGlmICh0b3MtPndyaXRlX2lkeCkKKyAgICB0b3MtPndyaXRlX2lkeC0tOyAgICAKKyAgcGMrKzsKK30KKworc3RhdGljIHZvaWQKK3N0cmlwX3RyYWlsaW5nX25ld2xpbmVzICgpCit7CisgIHdoaWxlICgoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkpCisJICB8fCBhdCAodG9zLCB0b3MtPndyaXRlX2lkeCAtIDEpID09ICdcbicpCisJICYmIHRvcy0+d3JpdGVfaWR4ID4gMCkKKyAgICB0b3MtPndyaXRlX2lkeC0tOworICBwYysrOworfQorCitXT1JEKHB1c2hfbnVtYmVyKQoreworICAgIGlzcCsrOworICAgIGljaGVja19yYW5nZSAoKTsKKyAgICBwYysrOworICAgICppc3AgPSAobG9uZykoKnBjKTsKKyAgICBwYysrOworfQorCitXT1JEKHB1c2hfdGV4dCkKK3sKKyAgICB0b3MrKzsKKyAgICBjaGVja19yYW5nZSAoKTsKKyAgICBpbml0X3N0cmluZyh0b3MpOworICAgIHBjKys7CisgICAgY2F0dGV4dCh0b3MsKigoY2hhciAqKilwYykpOworICAgIHBjKys7CisgICAgCit9CisKKworLyogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGV2ZXJ5dGhpbmcgbm90IGluc2lkZSBjb21tZW50cyBzdGFydGluZyBvbgorICAgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGxpbmUgZnJvbSB0aGUgIHN0cmluZywgYWxzbyB3aGVuIGNvcHlpbmcKKyAgIGNvbW1lbnRzLCByZW1vdmVzIGJsYW5rIHNwYWNlIGFuZCBsZWFkaW5nIConcy4KKyAgIEJsYW5rIGxpbmVzIGFyZSB0dXJuZWQgaW50byBvbmUgYmxhbmsgbGluZS4gICovCisKK3N0YXRpYyB2b2lkIAorREVGVU4ocmVtb3ZlX25vbmNvbW1lbnRzLChzcmMsZHN0KSwKKwkgICBzdHJpbmdfdHlwZSAqc3JjIEFORAorCSAgIHN0cmluZ190eXBlICpkc3QpCit7CisgICAgdW5zaWduZWQgaW50IGlkeCA9IDA7CisgICAgCisgICAgd2hpbGUgKGF0KHNyYyxpZHgpKSAKKyAgICB7CisJLyogTm93IHNlZSBpZiB3ZSBoYXZlIGEgY29tbWVudCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgKi8KKwlpZiAoYXQoc3JjLGlkeCkgPT0gJ1xuJyAKKwkgICAgJiYgYXQoc3JjLGlkeCsxKSA9PSAgJy8nIAorCSAgICAmJiBhdChzcmMsaWR4KzIpID09ICcqJykgCisJeworCSAgICBpZHgrPTM7CisJICAgIAorCSAgICBpZHggPSBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsaWR4KTsKKworCSAgICAvKiBSZW1vdmUgbGVhZGluZyBkb3QgKi8KKwkgICAgaWYgKGF0KHNyYywgaWR4KSA9PSAnLicpCisJICAgICBpZHgrKzsKKwkgICAgCisJICAgIC8qIENvcHkgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgb3IgdGlsbCB0aGUgZW5kIG9mIHRoZQorCSAgICAgICBjb21tZW50ICovCisJICAgIHdoaWxlIChhdChzcmMsIGlkeCkpCisJICAgIHsKKwkJaWYgKGF0KHNyYywgaWR4KSA9PSAnXG4nKSAKKwkJeworCQkgICAgLyogZW5kIG9mIGxpbmUsIGVjaG8gYW5kIHNjcmFwZSBvZiBsZWFkaW5nIGJsYW5rcyAgKi8KKwkJICAgIGlmIChhdChzcmMsaWR4ICsxKSA9PSAnXG4nKQorCQkgICAgIGNhdGNoYXIoZHN0LCdcbicpOworCQkgICAgY2F0Y2hhcihkc3QsJ1xuJyk7CisJCSAgICBpZHgrKzsKKwkJICAgIGlkeCA9ICAgc2tpcF93aGl0ZV9hbmRfc3RhcnMoc3JjLCBpZHgpOworCQl9CisJCWVsc2UgaWYgKGF0KHNyYywgaWR4KSA9PSAnKicgJiYgYXQoc3JjLGlkeCsxKSA9PSAnLycpIAorCQl7CisJCSAgICBpZHggKz0yIDsKKwkJICAgIGNhdHRleHQoZHN0LCJcbkVOREREXG4iKTsKKwkJICAgIGJyZWFrOworCQl9CisJCWVsc2UgCisJCXsKKwkJICAgIGNhdGNoYXIoZHN0LCBhdChzcmMsIGlkeCkpOworCQkgICAgaWR4Kys7CisJCX0KKwkgICAgfQorCX0KKwllbHNlIGlkeCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X3N0YWNrX2xldmVsICgpCit7CisgIGZwcmludGYgKHN0ZGVyciwgImN1cnJlbnQgc3RyaW5nIHN0YWNrIGRlcHRoID0gJWQsICIsIHRvcyAtIHN0YWNrKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBpbnRlZ2VyIHN0YWNrIGRlcHRoID0gJWRcbiIsIGlzcCAtIGlzdGFjayk7CisgIHBjKys7Cit9CisKKy8qIHR1cm46CisgICAgIGZvb2JhciBuYW1lKHN0dWZmKTsKKyAgIGludG86CisgICAgIGZvb2JhcgorICAgICBuYW1lIFBBUkFNUyAoKHN0dWZmKSk7CisgICBhbmQgYSBibGFuayBsaW5lLgorICovCisKK3N0YXRpYyB2b2lkCitERUZVTl9WT0lEKHBhcmFtc3R1ZmYpCit7CisgICAgdW5zaWduZWQgaW50IG9wZW5wOworICAgIHVuc2lnbmVkIGludCBmbmFtZTsKKyAgICB1bnNpZ25lZCBpbnQgaWR4OworICAgIHN0cmluZ190eXBlIG91dDsKKyAgICBpbml0X3N0cmluZygmb3V0KTsKKyAgICAKKworICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGl0J3Mgbm90IGFscmVhZHkgcGFyYW0nZCBvciBwcm90bydkICovCisgICAgaWYoZmluZCh0b3MsIlBBUkFNUyIpIHx8IGZpbmQodG9zLCJQUk9UTyIpIHx8ICFmaW5kKHRvcywiKCIpKSB7CisJICAgIGNhdHN0cigmb3V0LHRvcyk7CisJfQorICAgIGVsc2UgCisgICAgeworCS8qIEZpbmQgdGhlIG9wZW4gcGFyZW4gKi8KKwlmb3IgKG9wZW5wID0gMDsgYXQodG9zLCBvcGVucCkgIT0gJygnICAmJiBhdCh0b3Msb3BlbnApOyBvcGVucCsrKQorCSA7CisKKwlmbmFtZSA9IG9wZW5wOworCS8qIFN0ZXAgYmFjayB0byB0aGUgZm5hbWUgKi8KKwlmbmFtZS0tOworCXdoaWxlIChmbmFtZSAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGZuYW1lKSkpCisJIGZuYW1lIC0tOworCXdoaWxlIChmbmFtZQorCSAgICAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGZuYW1lKSkKKwkgICAgICAgJiYgYXQodG9zLGZuYW1lKSAhPSAnKicpCisJIGZuYW1lLS07CisKKwlmbmFtZSsrOworCQorCWZvciAoaWR4ID0gMDsgaWR4IDwgZm5hbWU7IGlkeCsrKSAJLyogT3V0cHV0IHR5cGUgKi8KKwl7CisJICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOworCX0KKyAgICAKKyAgICAgICAgY2F0dGV4dCgmb3V0LCAiXG4iKTsJLyogSW5zZXJ0IGEgbmV3bGluZSBiZXR3ZWVuIHR5cGUgYW5kIGZubmFtZSAqLworCisJZm9yIChpZHggPSBmbmFtZTsgaWR4IDwgb3BlbnA7IGlkeCsrKSAJCS8qIE91dHB1dCBmbm5hbWUgKi8KKwl7CisJICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOworCX0KKworCWNhdHRleHQoJm91dCwiIFBBUkFNUyAoIik7CisKKwl3aGlsZSAoYXQodG9zLGlkeCkgJiYgYXQodG9zLGlkeCkgIT0nOycpIAorCXsKKwkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOworCSAgICBpZHgrKzsKKwl9CisJY2F0dGV4dCgmb3V0LCIpO1xuXG4iKTsKKyAgICB9CisgICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOyAgICAKKyAgICBwYysrOworICAgIAorfQorCisKKworLyogdHVybiB7KgorICAgYW5kICp9IGludG8gY29tbWVudHMgKi8KKworV09SRCh0cmFuc2xhdGVjb21tZW50cykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKKyAgICBzdHJpbmdfdHlwZSBvdXQ7CisgICAgaW5pdF9zdHJpbmcoJm91dCk7CisgICAgCisgICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCisgICAgeworCWlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCisJeworCSAgICBjYXR0ZXh0KCZvdXQsIi8qIik7CisJICAgIGlkeCs9MjsKKwl9CisJZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAorCXsKKwkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOworCSAgICBpZHgrPTI7CisJfQorCWVsc2UgIAorCXsKKwkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOworCSAgICBpZHgrKzsKKwl9CisgICAgfQorCisKKyAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7CisgICAgCisgICAgcGMrKzsKKyAgICAKK30KKworI2lmIDAKKworLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLworCisvKiB0dXJuIGV2ZXJ5dGhpbmcgbm90IHN0YXJ0aW5nIHdpdGggYSAuIGludG8gYSBjb21tZW50ICovCisKK1dPUkQobWFuZ2xlY29tbWVudHMpCit7CisgICAgdW5zaWduZWQgaW50IGlkeCA9IDA7CisgICAgc3RyaW5nX3R5cGUgb3V0OworICAgIGluaXRfc3RyaW5nKCZvdXQpOworICAgIAorICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAorICAgIHsKKwlpZiAoYXQodG9zLGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKKwl7CisJICAgIGNhdHRleHQoJm91dCwiCS8qIik7CisJICAgIGlkeCs9MjsKKwl9CisJZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAorCXsKKwkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOworCSAgICBpZHgrPTI7CisJfQorCWVsc2UgIAorCXsKKwkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOworCSAgICBpZHgrKzsKKwl9CisgICAgfQorCisKKyAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7CisgICAgCisgICAgcGMrKzsKKyAgICAKK30KKworI2VuZGlmCisKKy8qIE1vZCB0b3Mgc28gdGhhdCBvbmx5IGxpbmVzIHdpdGggbGVhZGluZyBkb3RzIHJlbWFpbiAqLworc3RhdGljIHZvaWQKK0RFRlVOX1ZPSUQob3V0cHV0ZG90cykKK3sKKyAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKKyAgICBzdHJpbmdfdHlwZSBvdXQ7CisgICAgaW5pdF9zdHJpbmcoJm91dCk7CisgICAgCisgICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCisgICAgeworCWlmIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnLicpIAorCXsKKwkgIGNoYXIgYzsKKwkgIGlkeCArPSAyOworCSAgICAKKwkgICAgd2hpbGUgKChjID0gYXQodG9zLCBpZHgpKSAmJiBjICE9ICdcbicpCisJICAgIHsKKwkgICAgICBpZiAoYyA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCisJCXsKKwkJICAgIGNhdHRleHQoJm91dCwiIC8qIik7CisJCSAgICBpZHgrPTI7CisJCX0KKwkgICAgICBlbHNlIGlmIChjID09ICcqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKKwkJeworCQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOworCQkgICAgaWR4Kz0yOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgICBjYXRjaGFyKCZvdXQsIGMpOworCQkgICAgaWR4Kys7CisJCX0KKwkgICAgfQorCSAgICBjYXRjaGFyKCZvdXQsJ1xuJyk7CisJfQorCWVsc2UgCisJeworCSAgICBpZHgrKzsKKwl9CisgICAgfQkKKworICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKKyAgICBwYysrOworICAgIAorfQorCisvKiBGaW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggLiBhbmQgfCBhbmQgcHV0IGV4YW1wbGUgYXJvdW5kIHRoZW0gb24gdG9zICovCitXT1JEKGNvdXJpZXJpemUpCit7CisgICAgc3RyaW5nX3R5cGUgb3V0OworICAgIHVuc2lnbmVkIGludCBpZHggPSAwOworICAgIGludCBjb21tYW5kID0gMDsKKyAgICAKKyAgICBpbml0X3N0cmluZygmb3V0KTsKKyAgICAKKyAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKKyAgICB7CisJaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAorCSAgICAmJiAoYXQodG9zLCBpZHggKzEgKSA9PSAnLicKKwkJfHwgYXQodG9zLGlkeCsxKSA9PSAnfCcpKSAKKwl7CisJICAgIGNhdHRleHQoJm91dCwiXG5AZXhhbXBsZVxuIik7CisJICAgIGRvIAorCSAgICB7CisJCWlkeCArPSAyOworCQkKKwkJd2hpbGUgKGF0KHRvcywgaWR4KSAmJiBhdCh0b3MsIGlkeCkhPSdcbicpCisJCXsKKwkJICAgIGlmIChhdCh0b3MsaWR4KT09J3snICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAorCQkgICAgeworCQkJY2F0dGV4dCgmb3V0LCIgLyoiKTsKKwkJCWlkeCs9MjsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYgKGF0KHRvcyxpZHgpPT0nKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCisJCSAgICB7CisJCQljYXR0ZXh0KCZvdXQsIiovIik7CisJCQlpZHgrPTI7CisJCSAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ3snICYmICFjb21tYW5kKQorCQkgICAgeworCQkJY2F0dGV4dCgmb3V0LCJAeyIpOworCQkJaWR4Kys7CisJCSAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ30nICYmICFjb21tYW5kKQorCQkgICAgeworCQkJY2F0dGV4dCgmb3V0LCJAfSIpOworCQkJaWR4Kys7CisJCSAgICB9CisJCSAgICBlbHNlIAorCQkgICAgeworCQkJaWYgKGF0KHRvcyxpZHgpID09ICdAJykKKwkJCSAgICBjb21tYW5kID0gMTsKKwkJCWVsc2UgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHgpKQorCQkJCSB8fCBhdCh0b3MsaWR4KSA9PSAnfScpCisJCQkgICAgY29tbWFuZCA9IDA7CisJCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7CisJCQlpZHgrKzsKKwkJICAgIH0KKwkJICAgIAorCQl9CisJCWNhdGNoYXIoJm91dCwnXG4nKTsKKwkgICAgfSAgCisJICAgIHdoaWxlIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAKKwkJICAgJiYgKChhdCh0b3MsIGlkeCsxKSA9PSAnLicpCisJCSAgICAgICB8fCAoYXQodG9zLGlkeCsxKSA9PSAnfCcpKSkKKwkgICAgICA7CisJICAgIGNhdHRleHQoJm91dCwiQGVuZCBleGFtcGxlIik7CisJfQorCWVsc2UgCisJeyAgICAKKwkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOworCSAgICBpZHgrKzsKKwl9CisgICAgfSAgICAKKworICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKKyAgICBwYysrOworCisgICAgCit9CisKKy8qIEZpbmRzIGFueSBsaW5lcyBzdGFydGluZyB3aXRoICJvICIsIGlmIHRoZXJlIGFyZSBhbnksIHRoZW4gdHVybnMKKyAgIG9uIEBpdGVtaXplIEBidWxsZXQsIGFuZCBAaXRlbXMgZWFjaCBvZiB0aGVtLiBUaGVuIGVuZHMgd2l0aCBAZW5kCisgICBpdGVtaXplLCBpbnBsYWNlIGF0IFRPUyovCisKKworV09SRChidWxsZXRpemUpCit7CisgICAgdW5zaWduZWQgaW50IGlkeCA9IDA7CisgICAgaW50IG9uID0gMDsKKyAgICBzdHJpbmdfdHlwZSBvdXQ7CisgICAgaW5pdF9zdHJpbmcoJm91dCk7CisgICAgCisgICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgeworCWlmIChhdCh0b3MsIGlkeCkgPT0gJ0AnICYmCisJICAgIGF0KHRvcywgaWR4KzEpID09ICcqJykgCisJeworCSAgY2F0dGV4dCgmb3V0LCIqIik7CisJICBpZHgrPTI7CisJfQorCQorCWVsc2UKKwkgICAgaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCisJCWF0KHRvcywgaWR4KzEpID09ICdvJyAmJgorCQlpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGlkeCArMikpKQorCSAgICB7CisJCWlmICghb24pIAorCQl7CisJCSAgICBjYXR0ZXh0KCZvdXQsIlxuQGl0ZW1pemUgQGJ1bGxldFxuIik7CisJCSAgICBvbiA9IDE7CisJCSAgICAKKwkJfQorCQljYXR0ZXh0KCZvdXQsIlxuQGl0ZW1cbiIpOworCQlpZHgrPTM7CisJICAgIH0KKwkgICAgZWxzZSAKKwkgICAgeworCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7CisJCWlmIChvbiAmJiBhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJgorCQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJ1xuJyAmJgorCQkgICAgYXQodG9zLCBpZHgrMikgIT0gJ28nKQorCQl7CisJCSAgICBjYXR0ZXh0KCZvdXQsICJAZW5kIGl0ZW1pemUiKTsKKwkJICAgIG9uID0gMDsKKwkJfQorCQlpZHgrKzsKKwkJCisJICAgIH0KKwl9CisgICAgaWYgKG9uKSAKKyAgICB7CisJY2F0dGV4dCgmb3V0LCJAZW5kIGl0ZW1pemVcbiIpOworICAgIH0JCisKKyAgICBkZWxldGVfc3RyaW5nKHRvcyk7CisgICAgKnRvcyA9IG91dDsKKyAgICBwYysrOworICAgIAorfQorCisvKiBUdXJuIDw8Zm9vPj4gaW50byBAY29kZXtmb299IGluIHBsYWNlIGF0IFRPUyovCisgICAKKworV09SRChkb19mYW5jeV9zdHVmZikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKKyAgICBzdHJpbmdfdHlwZSBvdXQ7CisgICAgaW5pdF9zdHJpbmcoJm91dCk7CisgICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCisgICAgeworCWlmIChhdCh0b3MsIGlkeCkgPT0gJzwnIAorCSAgICAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnPCcKKwkgICAgJiYgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHggKyAyKSkpIAorCXsKKwkgICAgLyogVGhpcyBxdWFsaWZpZXMgYXMgYSA8PCBzdGFydHVwICovCisJICAgIGlkeCArPTI7CisJICAgIGNhdHRleHQoJm91dCwiQGNvZGV7Iik7CisJICAgIHdoaWxlKGF0KHRvcyxpZHgpICYmCisJCSAgYXQodG9zLGlkeCkgIT0gJz4nICkKKwkgICAgeworCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7CisJCWlkeCsrOworCQkKKwkgICAgfQorCSAgICBjYXR0ZXh0KCZvdXQsIn0iKTsKKwkgICAgaWR4Kz0yOworCX0KKwllbHNlIAorCXsKKwkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOworCSAgICBpZHgrKzsKKwl9CisgICAgfQorICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKKyAgICAqdG9zID0gb3V0OworICAgIHBjKys7CisgICAgCit9CisvKiBBIGNvbW1hbmQgaXMgYWxsIHVwcGVyIGNhc2UsYW5kIGFsb25lIG9uIGEgbGluZSAqLworc3RhdGljIGludCAKK0RFRlVOKCBpc2NvbW1hbmQsKHB0ciwgaWR4KSwKKyAgICAgIHN0cmluZ190eXBlICpwdHIgQU5ECisgICAgICB1bnNpZ25lZCBpbnQgaWR4KQoreworICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOworICAgIHdoaWxlIChhdChwdHIsaWR4KSkgeworCSAgICBpZiAoaXN1cHBlcigodW5zaWduZWQgY2hhcikgYXQocHRyLGlkeCkpIHx8IGF0KHB0cixpZHgpID09ICcgJyB8fAorCQlhdChwdHIsaWR4KSA9PSAnXycpIAorCSAgICB7CisJICAgICBsZW4rKzsKKwkgICAgIGlkeCsrOworCSB9CisJICAgIGVsc2UgaWYoYXQocHRyLGlkeCkgPT0gJ1xuJykKKwkgICAgeworCQlpZiAobGVuID4gMykgcmV0dXJuIDE7CisJCXJldHVybiAwOworCSAgICB9CisJICAgIGVsc2UgcmV0dXJuIDA7CisJfQorICAgIHJldHVybiAwOworCit9CisKKworc3RhdGljIGludAorREVGVU4oY29weV9wYXN0X25ld2xpbmUsKHB0ciwgaWR4LCBkc3QpLAorICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKKyAgICAgIHVuc2lnbmVkIGludCBpZHggQU5ECisgICAgICBzdHJpbmdfdHlwZSAqZHN0KQoreworICAgIGludCBjb2x1bW4gPSAwOworCisgICAgd2hpbGUgKGF0KHB0ciwgaWR4KSAmJiBhdChwdHIsIGlkeCkgIT0gJ1xuJykgCisgICAgeworCWlmIChhdCAocHRyLCBpZHgpID09ICdcdCcpCisJICB7CisJICAgIC8qIEV4cGFuZCB0YWJzLiAgTmVpdGhlciBtYWtlaW5mbyBub3IgVGVYIGNhbiBjb3BlIHdlbGwgd2l0aAorCSAgICAgICB0aGVtLiAgKi8KKwkgICAgZG8KKwkgICAgICBjYXRjaGFyIChkc3QsICcgJyk7CisJICAgIHdoaWxlICgrK2NvbHVtbiAmIDcpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7CisJICAgIGNvbHVtbisrOworCSAgfQorCWlkeCsrOworCQorICAgIH0gICAgCisgICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7CisgICAgaWR4Kys7CisgICAgcmV0dXJuIGlkeDsKKworfQorCitXT1JEKGljb3B5X3Bhc3RfbmV3bGluZSkKK3sKKyAgICB0b3MrKzsKKyAgICBjaGVja19yYW5nZSAoKTsKKyAgICBpbml0X3N0cmluZyh0b3MpOworICAgIGlkeCA9IGNvcHlfcGFzdF9uZXdsaW5lKHB0ciwgaWR4LCB0b3MpOworICAgIHBjKys7CQorfQorCisvKiBpbmRlbnQKKyAgIFRha2UgdGhlIHN0cmluZyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgZG8gc29tZSBwcmV0dHlpbmcgKi8KKworCitXT1JEKGtpbGxfYm9ndXNfbGluZXMpCit7CisgICAgaW50IHNsIDsKKyAgICAKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBpbnQgYzsKKyAgICBpbnQgZG90ID0gMCAgICA7CisgICAgCisgICAgc3RyaW5nX3R5cGUgb3V0OyAgICAKKyAgICBpbml0X3N0cmluZygmb3V0KTsKKyAgICAvKiBEcm9wIGxlYWRpbmcgbmwgKi8KKyAgICB3aGlsZSAoYXQodG9zLGlkeCkgPT0gJ1xuJykKKyAgICB7CisJaWR4Kys7CisgICAgfQorICAgIGMgPSBpZHg7CisgICAgCisgICAgLyogSWYgdGhlIGZpcnN0IGNoYXIgaXMgYSAnLicgcHJlcGVuZCBhIG5ld2xpbmUgc28gdGhhdCBpdCBpcworICAgICAgIHJlY29nbml6ZWQgcHJvcGVybHkgbGF0ZXIuICAqLworICAgIGlmIChhdCAodG9zLCBpZHgpID09ICcuJykKKyAgICAgIGNhdGNoYXIgKCZvdXQsICdcbicpOworCisgICAgLyogRmluZCB0aGUgbGFzdCBjaGFyICovCisgICAgd2hpbGUgKGF0KHRvcyxpZHgpKQorICAgIHsKKwlpZHgrKzsKKyAgICB9CisgICAgCisgICAgLyogZmluZCB0aGUgbGFzdCBub24gd2hpdGUgYmVmb3JlIHRoZSBubCAqLworICAgIGlkeC0tOworICAgIAorICAgIHdoaWxlIChpZHggJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpKQorICAgICBpZHgtLTsKKyAgICBpZHgrKzsKKyAgICAKKyAgICAvKiBDb3B5IGJ1ZmZlciB1cHRvIGxhc3QgY2hhciwgYnV0IGJsYW5rIGxpbmVzIGJlZm9yZSBhbmQgYWZ0ZXIKKyAgICAgICBkb3RzIGRvbid0IGNvdW50ICovCisgICAgc2wgPSAxOworCisgICAgd2hpbGUgKGMgPCBpZHgpCisgICAgeworCWlmIChhdCh0b3MsYykgPT0gJ1xuJyAKKwkgICAgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJworCSAgICAmJiBhdCh0b3MsYysyKSA9PSAnLicpIAorCXsKKwkgICAgLyogSWdub3JlIHR3byBuZXdsaW5lcyBiZWZvcmUgYSBkb3QqLworCSAgICBjKys7CisJfQorCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnLicgJiYgc2wpCisJeworCSAgICAvKiByZW1lbWJlciB0aGF0IHRoaXMgbGluZSBzdGFydGVkIHdpdGggYSBkb3QgKi8KKwkgICAgZG90PTI7CisJfQorCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAorCQkgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJworCQkgJiYgZG90KQorCXsKKwkgICAgYysrOworCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIHdoZW4gbGFzdCBsaW5lIHdhcyBkb3QgKi8KKwl9CisKKwljYXRjaGFyKCZvdXQsIGF0KHRvcyxjKSk7CisJaWYgKGF0KHRvcyxjKSA9PSAnXG4nKQorCXsKKwkgICAgc2wgPSAxOworCSAgICAKKwkgICAgaWYgKGRvdCA9PSAyKWRvdD0xO2Vsc2UgZG90ID0gMDsKKwl9CisJZWxzZQorCSAgc2wgPSAwOworCQorCWMrKzsJCisKKyAgICB9CisgICAgCisgICAgLyogQXBwZW5kIG5sKi8KKyAgICBjYXRjaGFyKCZvdXQsICdcbicpOworICAgIHBjKys7CisgICAgZGVsZXRlX3N0cmluZyh0b3MpOworICAgICp0b3MgPSBvdXQ7CisgICAgCisgICAgCit9CisKK1dPUkQoaW5kZW50KQoreworICAgIHN0cmluZ190eXBlIG91dDsKKyAgICBpbnQgdGFiID0gMDsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBpbnQgb2wgPTA7CisgICAgaW5pdF9zdHJpbmcoJm91dCk7CisgICAgd2hpbGUgKGF0KHRvcyxpZHgpKSB7CisJICAgIHN3aXRjaCAoYXQodG9zLGlkeCkpIAorCSAgICB7CisJICAgICAgY2FzZSAnXG4nOgorCQljYXR0ZXh0KCZvdXQsIlxuIik7CisJCWlkeCsrOworCQlpZiAodGFiICYmIGF0KHRvcyxpZHgpKQorCQl7CisJCSAgICBjYXR0ZXh0KCZvdXQsIiAgICAiKTsKKwkJfQorCQlvbCA9IDA7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJygnOgorCQl0YWIrKzsKKwkJaWYgKG9sID09IDApCisJCSAgICBjYXR0ZXh0KCZvdXQsIiAgICIpOworCQlpZHgrKzsKKwkJY2F0dGV4dCgmb3V0LCIoIik7CisJCW9sID0gMTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnKSc6CisJCXRhYi0tOworCQljYXR0ZXh0KCZvdXQsIikiKTsKKwkJaWR4Kys7CisJCW9sPTE7CisJCQorCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQljYXRjaGFyKCZvdXQsYXQodG9zLGlkeCkpOworCQlvbD0xOworCQkKKwkJaWR4Kys7CisJCWJyZWFrOworCSAgICB9CisJfQkKKworICAgIHBjKys7CisgICAgZGVsZXRlX3N0cmluZyh0b3MpOworICAgICp0b3MgPSBvdXQ7CisKK30KKworCitXT1JEKGdldF9zdHVmZl9pbl9jb21tYW5kKQoreworICAgIHRvcysrOworICAgIGNoZWNrX3JhbmdlICgpOworICAgIGluaXRfc3RyaW5nKHRvcyk7CisKKyAgICB3aGlsZSAoYXQocHRyLCBpZHgpKSB7CisJICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKSAgYnJlYWs7CisJICAgIGlkeCA9ICAgY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7CisJfQorICAgIHBjKys7ICAgIAorfQorCitXT1JEKHN3YXApCit7CisgICAgc3RyaW5nX3R5cGUgdDsKKyAgICAKKyAgICB0ID0gdG9zWzBdOworICAgIHRvc1swXSA9IHRvc1stMV07CisgICAgdG9zWy0xXSA9dDsgCisgICAgcGMrKzsKKyAgICAKK30KKworV09SRChvdGhlcl9kdXApCit7CisgICAgdG9zKys7CisgICAgY2hlY2tfcmFuZ2UgKCk7CisgICAgaW5pdF9zdHJpbmcodG9zKTsKKyAgICBjYXRzdHIodG9zLCB0b3MtMSk7CisgICAgcGMrKzsKK30KKworV09SRChkcm9wKQoreworICB0b3MtLTsKKyAgY2hlY2tfcmFuZ2UgKCk7CisgIHBjKys7Cit9CisKK1dPUkQoaWRyb3ApCit7CisgIGlzcC0tOworICBpY2hlY2tfcmFuZ2UgKCk7CisgIHBjKys7Cit9CisKK1dPUkQoaWNhdHN0cikKK3sKKyAgICB0b3MtLTsKKyAgICBjaGVja19yYW5nZSAoKTsKKyAgICBjYXRzdHIodG9zLCB0b3MrMSk7CisgICAgZGVsZXRlX3N0cmluZyh0b3MrMSk7CisgICAgcGMrKzsKK30KKworV09SRChza2lwX3Bhc3RfbmV3bGluZSkKK3sKKyAgICB3aGlsZSAoYXQocHRyLGlkeCkgCisJICAgJiYgYXQocHRyLGlkeCkgIT0gJ1xuJykKKyAgICAgaWR4Kys7CisgICAgaWR4Kys7CisgICAgcGMrKzsKK30KKworCitXT1JEKGludGVybmFsbW9kZSkKK3sKKyAgICBpbnRlcm5hbF9tb2RlID0gKihpc3ApOworICAgIGlzcC0tOworICAgIGljaGVja19yYW5nZSAoKTsKKyAgICBwYysrOworfQorCitXT1JEKG1heWJlY2F0c3RyKQoreworICAgIGlmIChpbnRlcm5hbF93YW50ZWQgPT0gaW50ZXJuYWxfbW9kZSkgCisgICAgeworCWNhdHN0cih0b3MtMSwgdG9zKTsKKyAgICB9CisgICAgZGVsZXRlX3N0cmluZyh0b3MpOworICAgIHRvcy0tOworICAgIGNoZWNrX3JhbmdlICgpOworICAgIHBjKys7Cit9CisKK2NoYXIgKgorREVGVU4obmV4dHdvcmQsKHN0cmluZywgd29yZCksCisgICAgICBjaGFyICpzdHJpbmcgQU5ECisgICAgICBjaGFyICoqd29yZCkKK3sKKyAgICBjaGFyICp3b3JkX3N0YXJ0OworICAgIGludCBpZHg7CisgICAgY2hhciAqZHN0OworICAgIGNoYXIgKnNyYzsKKyAgICAKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAKKyAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykgfHwgKnN0cmluZyA9PSAnLScpIHsKKwkgICAgaWYgKCpzdHJpbmcgPT0gJy0nKSAKKwkgICAgeworCQl3aGlsZSAoKnN0cmluZyAmJiAqc3RyaW5nICE9ICdcbicpIAorCQkgc3RyaW5nKys7CisJCQorCSAgICB9CisJICAgIGVsc2UgeworCQkgICAgc3RyaW5nKys7CisJCX0KKwl9CisgICAgaWYgKCEqc3RyaW5nKSByZXR1cm4gMDsKKyAgICAKKyAgICB3b3JkX3N0YXJ0ID0gc3RyaW5nOworICAgIGlmICgqc3RyaW5nID09ICciJykgCisgICAgICB7CisJZG8KKwkgIHsKKwkgICAgc3RyaW5nKys7CisJICAgIGxlbmd0aCsrOworCSAgICBpZiAoKnN0cmluZyA9PSAnXFwnKQorCSAgICAgIHsKKwkJc3RyaW5nICs9IDI7CisJCWxlbmd0aCArPSAyOworCSAgICAgIH0KKwkgIH0KKwl3aGlsZSAoKnN0cmluZyAhPSAnIicpOworICAgICAgfQorICAgIGVsc2UgICAgIAorICAgICAgeworCXdoaWxlICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykpIAorCXsKKwkgICAgc3RyaW5nKys7CisJICAgIGxlbmd0aCsrOworCQorCX0KKyAgICB9CisgICAgCisgICAgKndvcmQgPSBtYWxsb2MobGVuZ3RoICsgMSk7CisKKyAgICBkc3QgPSAqd29yZDsKKyAgICBzcmMgPSB3b3JkX3N0YXJ0OworCisKKyAgICBmb3IgKGlkeD0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykgCisgICAgICB7CisJaWYgKHNyY1tpZHhdID09ICdcXCcpCisJICBzd2l0Y2ggKHNyY1tpZHgrMV0pCisJICAgIHsKKwkgICAgY2FzZSAnbic6CisJICAgICAgKmRzdCsrID0gJ1xuJzsKKwkgICAgICBpZHgrKzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnIic6CisJICAgIGNhc2UgJ1xcJzoKKwkgICAgICAqZHN0KysgPSBzcmNbaWR4KzFdOworCSAgICAgIGlkeCsrOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgICpkc3QrKyA9ICdcXCc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwllbHNlCisJICAqZHN0KysgPSBzcmNbaWR4XTsKKyAgICB9CisgICAgKmRzdCsrID0gMDsKKworCisKKworCisgICAgaWYoKnN0cmluZykgICAgCisgICAgIHJldHVybiBzdHJpbmcgKyAxOworICAgIGVsc2UgCisgICAgIHJldHVybiAwOworICAgIAorfQorZGljdF90eXBlICpyb290OworZGljdF90eXBlICoKK0RFRlVOKGxvb2t1cF93b3JkLCh3b3JkKSwKKyAgICAgIGNoYXIgKndvcmQpCit7CisgIGRpY3RfdHlwZSAqcHRyID0gcm9vdDsKKyAgd2hpbGUgKHB0cikgeworICAgICAgaWYgKHN0cmNtcChwdHItPndvcmQsIHdvcmQpID09IDApIHJldHVybiBwdHI7CisgICAgICBwdHIgPSBwdHItPm5leHQ7CisJICAgIAorICAgIH0KKyAgaWYgKHdhcm5pbmcpCisgICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3QgZmluZCAlc1xuIix3b3JkKTsKKyAgcmV0dXJuIDA7CisgICAgCisgICAgCit9CisKK3N0YXRpYyB2b2lkIERFRlVOX1ZPSUQocGVyZm9ybSkKK3sKKyAgdG9zID0gc3RhY2s7CisgICAgCisgIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKKyAgICAgIC8qIEl0J3Mgd29ydGggbG9va2luZyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpc3QgKi8KKyAgICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKQorICAgICAgeworCWNoYXIgKm5leHQ7CisJZGljdF90eXBlICp3b3JkIDsKKwkJCisJKHZvaWQpCQluZXh0d29yZChhZGRyKHB0ciwgaWR4KSwgJm5leHQpOworCisKKwl3b3JkID0gbG9va3VwX3dvcmQobmV4dCk7CisKKworCQkKKworCWlmICh3b3JkKSAKKwl7CisJICBleGVjKHdvcmQpOworCX0KKwllbHNlCisJeworCSAgaWYgKHdhcm5pbmcpCisJICAgZnByaW50ZihzdGRlcnIsIndhcm5pbmcsICVzIGlzIG5vdCByZWNvZ25pc2VkXG4iLCAgbmV4dCk7CisJICBza2lwX3Bhc3RfbmV3bGluZSgpOworCX0KKwkJCisgICAgICB9CisgICAgICBlbHNlIHNraXBfcGFzdF9uZXdsaW5lKCk7CisKKyAgICB9Cit9CisKK2RpY3RfdHlwZSAqCitERUZVTihuZXdlbnRyeSwod29yZCksCisgICAgICBjaGFyICp3b3JkKQoreworICAgIGRpY3RfdHlwZSAqbmV3ID0gKGRpY3RfdHlwZSAqKW1hbGxvYyhzaXplb2YoZGljdF90eXBlKSk7CisgICAgbmV3LT53b3JkID0gd29yZDsKKyAgICBuZXctPm5leHQgPSByb290OworICAgIHJvb3QgPSBuZXc7CisgICAgbmV3LT5jb2RlID0gKHN0aW5zdF90eXBlICopbWFsbG9jKHNpemVvZihzdGluc3RfdHlwZSApKTsKKyAgICBuZXctPmNvZGVfbGVuZ3RoID0gMTsKKyAgICBuZXctPmNvZGVfZW5kID0gMDsKKyAgICByZXR1cm4gbmV3OworICAgIAorfQorCisKK3Vuc2lnbmVkIGludAorREVGVU4oYWRkX3RvX2RlZmluaXRpb24sKGVudHJ5LCB3b3JkKSwgCisgICAgICBkaWN0X3R5cGUgKmVudHJ5IEFORAorICAgICAgc3RpbnN0X3R5cGUgd29yZCkKK3sKKyAgICBpZiAoZW50cnktPmNvZGVfZW5kID09IGVudHJ5LT5jb2RlX2xlbmd0aCkgCisgICAgeworCWVudHJ5LT5jb2RlX2xlbmd0aCArPSAyOworCWVudHJ5LT5jb2RlID0KKwkgKHN0aW5zdF90eXBlICopIHJlYWxsb2MoKGNoYXIgKikoZW50cnktPmNvZGUpLAorCQkJICAgICAgIGVudHJ5LT5jb2RlX2xlbmd0aCAqc2l6ZW9mKHdvcmRfdHlwZSkpOworICAgIH0KKyAgICBlbnRyeS0+Y29kZVtlbnRyeS0+Y29kZV9lbmRdID0gd29yZDsKKyAgICAKK3JldHVybiAgICAgZW50cnktPmNvZGVfZW5kKys7ICAKK30KKworCisKKworCisKKwordm9pZAorREVGVU4oYWRkX2ludHJpbnNpYywobmFtZSwgZnVuYyksCisgICAgICBjaGFyICpuYW1lIEFORAorICAgICAgdm9pZCAoKmZ1bmMpKCkpCit7CisgICAgZGljdF90eXBlICpuZXcgPSBuZXdlbnRyeShuYW1lKTsKKyAgICBhZGRfdG9fZGVmaW5pdGlvbihuZXcsIGZ1bmMpOworICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgMCk7Cit9CisKK3ZvaWQKK0RFRlVOKGFkZF92YXIsKG5hbWUpLAorICAgICAgY2hhciAqbmFtZSkKK3sKKyAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOworICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgcHVzaF9udW1iZXIpOworICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgKHN0aW5zdF90eXBlKSgmKG5ldy0+dmFyKSkpOworICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywwKTsKK30KKworCit2b2lkIAorREVGVU4oY29tcGlsZSwgKHN0cmluZyksIAorICAgICAgY2hhciAqc3RyaW5nKQoreworICAgIC8qIGFkZCB3b3JkcyB0byB0aGUgZGljdGlvbmFyeSAqLworICAgIGNoYXIgKndvcmQ7CisgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7CisgICAgd2hpbGUgKHN0cmluZyAmJiAqc3RyaW5nICYmIHdvcmRbMF0pIAorICAgIHsKKwlpZiAoc3RyY21wKHdvcmQsInZhciIpPT0wKSAKKwl7Cisgc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOworCSAgCisJICBhZGRfdmFyKHdvcmQpOworIHN0cmluZz1uZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKKwl9CitlbHNlCQorCSAgICAKKwlpZiAod29yZFswXSA9PSAnOicpCisJeworCSAgICBkaWN0X3R5cGUgKnB0cjsKKwkgICAgLyogQ29tcGlsZSBhIHdvcmQgYW5kIGFkZCB0byBkaWN0aW9uYXJ5ICovCisJICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOworCSAgICAKKwkgICAgcHRyID0gbmV3ZW50cnkod29yZCk7CisJICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOworCSAgICB3aGlsZSAod29yZFswXSAhPSAnOycgKSAKKwkgICAgeworCQkgc3dpdGNoICh3b3JkWzBdKSAKKwkJIHsKKwkJICAgY2FzZSAnIic6CisJCSAgICAgLyogZ290IGEgc3RyaW5nLCBlbWJlZCBtYWdpYyBwdXNoIHN0cmluZworCQkJZnVuY3Rpb24gKi8KKwkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfdGV4dCk7CisJCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpKHdvcmQrMSkpOworCQkgICAgIGJyZWFrOworCQkgICBjYXNlICcwJzoKKwkJICAgY2FzZSAnMSc6CisJCSAgIGNhc2UgJzInOgorCQkgICBjYXNlICczJzoKKwkJICAgY2FzZSAnNCc6CisJCSAgIGNhc2UgJzUnOgorCQkgICBjYXNlICc2JzoKKwkJICAgY2FzZSAnNyc6CisJCSAgIGNhc2UgJzgnOgorCQkgICBjYXNlICc5JzoKKwkJICAgICAvKiBHb3QgYSBudW1iZXIsIGVtYmVkZCB0aGUgbWFnaWMgcHVzaCBudW1iZXIKKwkJCWZ1bmN0aW9uICovCisJCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBwdXNoX251bWJlcik7CisJCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpYXRvbCh3b3JkKSk7CisJCSAgICAgYnJlYWs7CisJCSAgIGRlZmF1bHQ6CisJCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBjYWxsKTsKKwkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlsb29rdXBfd29yZCh3b3JkKSk7CisJCSB9CisKKwkJc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7CQkgICAgIAorCSAgICB9CisJICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwwKTsKKwkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7CisJfQorCWVsc2UgCisJeworCSAgICBmcHJpbnRmKHN0ZGVyciwic3ludGF4IGVycm9yIGF0ICVzXG4iLHN0cmluZy0xKTsKKwl9CSAgICAKKyAgICB9CisKK30KKworIAorc3RhdGljIHZvaWQgREVGVU5fVk9JRChiYW5nKQoreworICAqKGxvbmcgKikoKGlzcFswXSkpID0gaXNwWy0xXTsKKyAgaXNwLT0yOworICBpY2hlY2tfcmFuZ2UgKCk7CisgIHBjKys7Cit9CisKK1dPUkQoYXRzaWduKQoreworICAgIGlzcFswXSA9ICoobG9uZyAqKShpc3BbMF0pOworICAgIHBjKys7Cit9CisKK1dPUkQoaGVsbG8pCit7CisgIHByaW50ZigiaGVsbG9cbiIpOworICBwYysrOyAgICAKK30KKworV09SRChzdGRvdXRfKQoreworICBpc3ArKzsKKyAgaWNoZWNrX3JhbmdlICgpOworICAqaXNwID0gMTsKKyAgcGMrKzsKK30KKworV09SRChzdGRlcnJfKQoreworICBpc3ArKzsKKyAgaWNoZWNrX3JhbmdlICgpOworICAqaXNwID0gMjsKKyAgcGMrKzsKK30KKworV09SRChwcmludCkKK3sKKyAgaWYgKCppc3AgPT0gMSkKKyAgICB3cml0ZV9idWZmZXIgKHRvcywgc3Rkb3V0KTsKKyAgZWxzZSBpZiAoKmlzcCA9PSAyKQorICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRlcnIpOworICBlbHNlCisgICAgZnByaW50ZiAoc3RkZXJyLCAicHJpbnQ6IGlsbGVnYWwgcHJpbnQgZGVzdGluYXRpb24gYCVsZCdcbiIsICppc3ApOworICBpc3AtLTsKKyAgdG9zLS07CisgIGljaGVja19yYW5nZSAoKTsKKyAgY2hlY2tfcmFuZ2UgKCk7CisgIHBjKys7Cit9CisKKworc3RhdGljIHZvaWQgREVGVU4ocmVhZF9pbiwgKHN0ciwgZmlsZSksIAorCSAgIHN0cmluZ190eXBlICpzdHIgQU5ECisJCSAgRklMRSAqZmlsZSkKK3sKKyAgICBjaGFyIGJ1ZmZbMTAwMDBdOyAgICAKKyAgICB1bnNpZ25lZCBpbnQgcjsKKyAgICBkbyAKKyAgICB7CisJciA9IGZyZWFkKGJ1ZmYsIDEsIHNpemVvZihidWZmKSwgZmlsZSk7CisJY2F0YnVmKHN0ciwgYnVmZiwgcik7CisgICAgfQorICAgIHdoaWxlIChyKTsKKyAgICBidWZmWzBdID0gMDsKKyAgICAKKyAgICBjYXRidWYoc3RyLCBidWZmLDEpOworfQorCisKK3N0YXRpYyB2b2lkIERFRlVOX1ZPSUQodXNhZ2UpCit7CisgICAgZnByaW50ZihzdGRlcnIsInVzYWdlOiAtW2R8aXxnXSA8ZmlsZSA+ZmlsZVxuIik7CisgICAgZXhpdCgzMyk7ICAgIAorfQorCisvKiBUaGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGVjbGFyZSBleGl0LiAgU29tZXRpbWVzIGl0IHJldHVybnMKKyAgIGludCwgYW5kIHNvbWV0aW1lcyBpdCByZXR1cm5zIHZvaWQuICBTb21ldGltZXMgaXQgY2hhbmdlcyBiZXR3ZWVuCisgICBPUyByZWxlYXNlcy4gIFRyeWluZyB0byBnZXQgaXQgZGVjbGFyZWQgY29ycmVjdGx5IGluIHRoZSBob3N0cyBmaWxlCisgICBpcyBhIHBvaW50bGVzcyB3YXN0ZSBvZiB0aW1lLiAgKi8KKworc3RhdGljIHZvaWQKK2NoZXdfZXhpdCAoKQoreworICBleGl0ICgwKTsKK30KKworaW50IERFRlVOKG1haW4sKGFjLGF2KSwKK2ludCBhYyBBTkQKK2NoYXIgKmF2W10pCit7CisgIHVuc2lnbmVkIGludCBpOworICBzdHJpbmdfdHlwZSBidWZmZXI7CisgIHN0cmluZ190eXBlIHBwdHI7CisKKyAgaW5pdF9zdHJpbmcoJmJ1ZmZlcik7CisgIGluaXRfc3RyaW5nKCZwcHRyKTsKKyAgaW5pdF9zdHJpbmcoc3RhY2srMCk7CisgIHRvcz1zdGFjaysxOworICBwdHIgPSAmcHB0cjsKKyAgICAKKyAgYWRkX2ludHJpbnNpYygicHVzaF90ZXh0IiwgcHVzaF90ZXh0KTsKKyAgYWRkX2ludHJpbnNpYygiISIsIGJhbmcpOworICBhZGRfaW50cmluc2ljKCJAIiwgYXRzaWduKTsKKyAgYWRkX2ludHJpbnNpYygiaGVsbG8iLGhlbGxvKTsgICAgCisgIGFkZF9pbnRyaW5zaWMoInN0ZG91dCIsc3Rkb3V0Xyk7ICAgIAorICBhZGRfaW50cmluc2ljKCJzdGRlcnIiLHN0ZGVycl8pOyAgICAKKyAgYWRkX2ludHJpbnNpYygicHJpbnQiLHByaW50KTsgICAgCisgIGFkZF9pbnRyaW5zaWMoInNraXBfcGFzdF9uZXdsaW5lIiwgc2tpcF9wYXN0X25ld2xpbmUgKTsKKyAgYWRkX2ludHJpbnNpYygiY2F0c3RyIiwgaWNhdHN0ciApOworICBhZGRfaW50cmluc2ljKCJjb3B5X3Bhc3RfbmV3bGluZSIsIGljb3B5X3Bhc3RfbmV3bGluZSApOworICBhZGRfaW50cmluc2ljKCJkdXAiLCBvdGhlcl9kdXAgKTsKKyAgYWRkX2ludHJpbnNpYygiZHJvcCIsIGRyb3ApOworICBhZGRfaW50cmluc2ljKCJpZHJvcCIsIGlkcm9wKTsKKyAgYWRkX2ludHJpbnNpYygicmVtY2hhciIsIHJlbWNoYXIgKTsKKyAgYWRkX2ludHJpbnNpYygiZ2V0X3N0dWZmX2luX2NvbW1hbmQiLCBnZXRfc3R1ZmZfaW5fY29tbWFuZCApOworICBhZGRfaW50cmluc2ljKCJkb19mYW5jeV9zdHVmZiIsIGRvX2ZhbmN5X3N0dWZmICk7CisgIGFkZF9pbnRyaW5zaWMoImJ1bGxldGl6ZSIsIGJ1bGxldGl6ZSApOworICBhZGRfaW50cmluc2ljKCJjb3VyaWVyaXplIiwgY291cmllcml6ZSApOworICAvKiBJZiB0aGUgZm9sbG93aW5nIGxpbmUgZ2l2ZXMgYW4gZXJyb3IsIGV4aXQoKSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlCisgICAgIC4uL2hvc3RzL2Zvby5oIGZpbGUgZm9yIHRoaXMgaG9zdC4gIEZpeCBpdCB0aGVyZSwgbm90IGhlcmUhICAqLworICAvKiBObywgZG9uJ3QgZml4IGl0IGFueXdoZXJlOyBzZWUgY29tbWVudCBvbiBjaGV3X2V4aXQtLUlhbiBUYXlsb3IuICAqLworICBhZGRfaW50cmluc2ljKCJleGl0IiwgY2hld19leGl0ICk7CisgIGFkZF9pbnRyaW5zaWMoInN3YXAiLCBzd2FwICk7CisgIGFkZF9pbnRyaW5zaWMoIm91dHB1dGRvdHMiLCBvdXRwdXRkb3RzICk7CisgIGFkZF9pbnRyaW5zaWMoInBhcmFtc3R1ZmYiLCBwYXJhbXN0dWZmICk7CisgIGFkZF9pbnRyaW5zaWMoIm1heWJlY2F0c3RyIiwgbWF5YmVjYXRzdHIgKTsKKyAgYWRkX2ludHJpbnNpYygidHJhbnNsYXRlY29tbWVudHMiLCB0cmFuc2xhdGVjb21tZW50cyApOworICBhZGRfaW50cmluc2ljKCJraWxsX2JvZ3VzX2xpbmVzIiwga2lsbF9ib2d1c19saW5lcyk7CisgIGFkZF9pbnRyaW5zaWMoImluZGVudCIsIGluZGVudCk7CisgIGFkZF9pbnRyaW5zaWMoImludGVybmFsbW9kZSIsIGludGVybmFsbW9kZSk7CisgIGFkZF9pbnRyaW5zaWMoInByaW50X3N0YWNrX2xldmVsIiwgcHJpbnRfc3RhY2tfbGV2ZWwpOworICBhZGRfaW50cmluc2ljKCJzdHJpcF90cmFpbGluZ19uZXdsaW5lcyIsIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzKTsKKyAgICAKKyAgLyogUHV0IGEgbmwgYXQgdGhlIHN0YXJ0ICovCisgIGNhdGNoYXIoJmJ1ZmZlciwnXG4nKTsKKworICByZWFkX2luKCZidWZmZXIsIHN0ZGluKTsgCisgIHJlbW92ZV9ub25jb21tZW50cygmYnVmZmVyLCBwdHIpOworICBmb3IgKGk9IDE7IGkgPCAodW5zaWduZWQgaW50KSBhYzsgaSsrKSAKKyAgeworICAgIGlmIChhdltpXVswXSA9PSAnLScpCisgICAgeworICAgICAgaWYgKGF2W2ldWzFdID09ICdmJykKKyAgICAgIHsKKwlzdHJpbmdfdHlwZSBiOworCUZJTEUgKmY7CisJaW5pdF9zdHJpbmcoJmIpOworCisJZiAgPSBmb3BlbihhdltpKzFdLCJyIik7CisJaWYgKCFmKSAKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3Qgb3BlbiB0aGUgaW5wdXQgZmlsZSAlc1xuIixhdltpKzFdKTsKKwkgIHJldHVybiAzMzsKKwl9CisKKwlyZWFkX2luKCZiLCBmKTsKKwljb21waWxlKGIucHRyKTsKKwlwZXJmb3JtKCk7CQorICAgICAgfQorICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ2knKSAKKyAgICAgIHsKKwlpbnRlcm5hbF93YW50ZWQgPSAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ3cnKSAKKyAgICAgIHsKKwl3YXJuaW5nID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKwl1c2FnZSAoKTsKKyAgICB9CisgIH0gICAgICAKKyAgd3JpdGVfYnVmZmVyKHN0YWNrKzAsIHN0ZG91dCk7CisgIGlmICh0b3MgIT0gc3RhY2spCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZmluaXNoaW5nIHdpdGggY3VycmVudCBzdGFjayBsZXZlbCAlZFxuIiwgdG9zIC0gc3RhY2spOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JmZC9kb2MvZG9jLnN0ciBiL2JmZC9kb2MvZG9jLnN0cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTI3NmZlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2RvYy9kb2Muc3RyCkBAIC0wLDAgKzEsMTU4IEBACis6IERPQ0RECisJc2tpcF9wYXN0X25ld2xpbmUKKwlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGNhdHN0cgorCTsKKworOiBFTkRERAorCXNraXBfcGFzdF9uZXdsaW5lCisJOworCis6IEVYQU1QTEUKKwlza2lwX3Bhc3RfbmV3bGluZQkKKwlnZXRfc3R1ZmZfaW5fY29tbWFuZCBraWxsX2JvZ3VzX2xpbmVzIGRvX2ZhbmN5X3N0dWZmIHRyYW5zbGF0ZWNvbW1lbnRzIAorCWNvdXJpZXJpemUgY2F0c3RyCisKKwk7CisKKzogSU5PREUgCisJIkBub2RlICIgY2F0c3RyIHNraXBfcGFzdF9uZXdsaW5lIGNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciAKKwk7CisKKzogQ09ERV9GUkFHTUVOVAorCUVYQU1QTEUgCisJOworCis6IENPTU1FTlQKKwlza2lwX3Bhc3RfbmV3bGluZQorCWdldF9zdHVmZl9pbl9jb21tYW5kCisJZHJvcAorCTsKKworOiBTWU5PUFNJUworCXNraXBfcGFzdF9uZXdsaW5lCisJIkBzdHJvbmd7U3lub3BzaXN9XG4iIGNhdHN0cgorCSJAZXhhbXBsZVxuIiBjYXRzdHIKKwlnZXRfc3R1ZmZfaW5fY29tbWFuZCAgCisJa2lsbF9ib2d1c19saW5lcworCWluZGVudAorCWNhdHN0cgorCSJAZW5kIGV4YW1wbGVcbiIgY2F0c3RyCisKKwk7CisKKzogZnVuYworCSJAZmluZGV4ICIJLSBhCisJc2tpcF9wYXN0X25ld2xpbmUKKwljb3B5X3Bhc3RfbmV3bGluZQorCWR1cAkJLSBhIHggeCAKKwkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCisJc3dhcAorCXJlbWNoYXIKKwkifVxuIiAtIGEgeCBiIHggYworCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAorCTsKKworOiBGVU5DVElPTgorCSJAZmluZGV4ICIJLSBhCisJc2tpcF9wYXN0X25ld2xpbmUKKwljb3B5X3Bhc3RfbmV3bGluZQorCWR1cAkJLSBhIHggeCAKKwkiQHN1YnN1YnNlY3Rpb24gQGNvZGV7IiAtIGEgeCB4IGIgCisJc3dhcAorCXJlbWNoYXIKKwkifVxuIiAtIGEgeCBiIHggYworCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAorCTsKKworOiBib2R5dGV4dAorCWdldF9zdHVmZl9pbl9jb21tYW5kIAorCWJ1bGxldGl6ZQorCWtpbGxfYm9ndXNfbGluZXMKKwlkb19mYW5jeV9zdHVmZgorCWNvdXJpZXJpemUKKwljYXRzdHIKKwkiXG4iIGNhdHN0cgorCTsKKworOiBhc2VjdGlvbgorCXNraXBfcGFzdF9uZXdsaW5lCisJY2F0c3RyCisJY29weV9wYXN0X25ld2xpbmUgCQorCWRvX2ZhbmN5X3N0dWZmIGNhdHN0ciAJCisJYm9keXRleHQJCisJOworCis6IFNFQ1RJT04gCisJIkBzZWN0aW9uICIgYXNlY3Rpb24gIDsKKworOiBTVUJTRUNUSU9OCisJIkBzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKKworOiBTVUJTVUJTRUNUSU9OCisJIkBzdWJzdWJzZWN0aW9uICIgYXNlY3Rpb24gIDsKKworOiBzdWJoZWFkCisJc2tpcF9wYXN0X25ld2xpbmUKKwlib2R5dGV4dAorCTsKKworCisKKwkKKzogREVTQ1JJUFRJT04gCisJIkBzdHJvbmd7RGVzY3JpcHRpb259QCpcbiIgY2F0c3RyIHN1YmhlYWQgOworCis6IFJFVFVSTlMKKwkiQHN0cm9uZ3tSZXR1cm5zfUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKKworOiBJTlRFUk5BTF9GVU5DVElPTgorCWZ1bmMgOworCisKKzogSU5URVJOQUxfREVGSU5JVElPTiAKKwlmdW5jIDsKKworCis6IElOVEVSTkFMCisJZnVuYyA7CisKKzogVFlQRURFRgorCUZVTkNUSU9OIDsKKworOiBTRU5VTQorCXNraXBfcGFzdF9uZXdsaW5lCisJIkhlcmUgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIEBjb2Rle2VudW0gIgorCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIgY2F0c3RyCisJIn06XG5cbiIgY2F0c3RyIGNhdHN0cgorCTsKKzogRU5VTQorCXNraXBfcGFzdF9uZXdsaW5lCisJIkBkZWZmbiB7fSAiCisJY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgorCTsKKzogRU5VTVgKKwlza2lwX3Bhc3RfbmV3bGluZQorCSJAZGVmZm54IHt9ICIKKwljb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIKKwljYXRzdHIKKwk7Cis6IEVOVU1FUQorCXNraXBfcGFzdF9uZXdsaW5lCisJIkBkZWZmbiB7fSAiCisJY29weV9wYXN0X25ld2xpbmUgY2F0c3RyIGNhdHN0cgorCXNraXBfcGFzdF9uZXdsaW5lCisJOworOiBFTlVNRVFYCisJc2tpcF9wYXN0X25ld2xpbmUKKwkiQGRlZmZueCB7fSAiCisJY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCisJY2F0c3RyCisJc2tpcF9wYXN0X25ld2xpbmUKKwk7Cis6IEVOVU1ET0MKKwlza2lwX3Bhc3RfbmV3bGluZQorCWdldF9zdHVmZl9pbl9jb21tYW5kCisJc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKKwljYXRzdHIKKwkiXG5AZW5kIGRlZmZuXG4iIGNhdHN0cgorCTsKZGlmZiAtLWdpdCBhL2JmZC9kb2MvbWFrZWZpbGUudm1zIGIvYmZkL2RvYy9tYWtlZmlsZS52bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4NTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9kb2MvbWFrZWZpbGUudm1zCkBAIC0wLDAgKzEsNSBAQAorQ0ZMQUdTID0gL25vb3B0L2luY2x1ZGU9KFtdLFstXSxbLS4tLmluY2x1ZGVdKQorTERGTEFHUyA9IC9ub21hcAorTERMSUJTID0gLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIKKworYWxsOiBjaGV3LmV4ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9wcm90by5zdHIgYi9iZmQvZG9jL3Byb3RvLnN0cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMxYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2RvYy9wcm90by5zdHIKQEAgLTAsMCArMSwxMzUgQEAKKworOiBTWU5PUFNJUworCXNraXBfcGFzdF9uZXdsaW5lCisJZ2V0X3N0dWZmX2luX2NvbW1hbmQJCisJcGFyYW1zdHVmZgorCWluZGVudAorCW1heWJlY2F0c3RyCis7CisKKzogaWdub3JlCisJc2tpcF9wYXN0X25ld2xpbmUgCisJZ2V0X3N0dWZmX2luX2NvbW1hbmQKKwlvdXRwdXRkb3RzCisJbWF5YmVjYXRzdHIKKwk7CisKKzogQ09ERV9GUkFHTUVOVAorCWlnbm9yZSA7CisKKzogZXh0ZXJuYWwKKwkwIGludGVybmFsbW9kZSBpZ25vcmUgOworCis6IGludGVybmFsIAorCTEgaW50ZXJuYWxtb2RlIGlnbm9yZSA7CisKKy0gaW5wdXQgc3RhY2sgeyBhIGIgfSBvdXRwdXQgYiBpZiBpbnRlcm5hbCwgYSBpZiBleHRlcm5hbAorOiBpZmludGVybmFsCisJIiIgc3dhcCAxIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgorCXN3YXAKKwkiIiBzd2FwIDAgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCisJY2F0c3RyCisJOworCistIFB1dCBub3RlIGluIG91dHB1dCBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuYWwgbW9kZS4KKzogQ09NTUVOVAorCXNraXBfcGFzdF9uZXdsaW5lCisJZ2V0X3N0dWZmX2luX2NvbW1hbmQKKwl0cmFuc2xhdGVjb21tZW50cworCWNhdHN0cgorCTsKKworLSBTRU5VTSAgICBlbnVtLXR5cGUtbmFtZQorLSBFTlVNICAgICBlbnVtLW5hbWUKKy0gRU5VTVggICAgYWRkbC1lbnVtLW5hbWUKKy0gRU5VTURPQyAgZG9jIGZvciBwcmVjZWRpbmcgZW51bXMKKy0gRU5EU0VOVU0gbWF4LWVudW0tbmFtZQorCis6IG1ha2VfZW51bV9oZWFkZXIKKwlkdXAKKwkiZW51bSAiIHN3YXAgY2F0c3RyCisJIiB7XG4iIGNhdHN0cgorCXN3YXAgIiAgX2R1bW15X2ZpcnN0XyIgc3dhcCBjYXRzdHIgY2F0c3RyCisJIixcbiIgY2F0c3RyCisJOworOiBtYWtlX3N0cmluZ190YWJsZV9oZWFkZXIKKwlkdXAKKwkiI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV8iIHN3YXAgY2F0c3RyIHN3YXAKKwkiXG5cbnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCAiIHN3YXAgY2F0c3RyIGNhdHN0cgorCSJfbmFtZXNbXSA9IHsgXCJAQHVuaW5pdGlhbGl6ZWRAQFwiLFxuIiBjYXRzdHIKKwk7Cis6IFNFTlVNCisJc2tpcF9wYXN0X25ld2xpbmUKKwljb3B5X3Bhc3RfbmV3bGluZQorCXJlbWNoYXIKKwlkdXAKKwltYWtlX2VudW1faGVhZGVyCisJc3dhcAorCW1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgorCWlmaW50ZXJuYWwKKwljYXRzdHIKKwlnZXRfc3R1ZmZfaW5fY29tbWFuZCBjYXRzdHIKKwl0cmFuc2xhdGVjb21tZW50cyA7Cis6IEVORFNFTlVNCisJc2tpcF9wYXN0X25ld2xpbmUKKwljb3B5X3Bhc3RfbmV3bGluZSBzdHJpcF90cmFpbGluZ19uZXdsaW5lcworCWR1cAorCSIgICIgc3dhcCBjYXRzdHIgIiB9O1xuIiBjYXRzdHIJc3dhcAorCSIgXCJAQG92ZXJmbG93OiAiIHN3YXAgY2F0c3RyICJAQFwiLFxufTtcbiNlbmRpZlxuXG4iIGNhdHN0cgorCWlmaW50ZXJuYWwKKwljYXRzdHIKKwk7Cis6IG1ha2VfZW51bWVyYXRvcgorCSIgICIgc3dhcCBjYXRzdHIKKwkiLFxuIiBjYXRzdHIKKwk7Cis6IG1ha2VfZW51bWVyYXRvcl9zdHJpbmcKKwkiICBcIiIgc3dhcCBjYXRzdHIKKwkiXCIsXG4iIGNhdHN0cgorCTsKKzogRU5VTQorCXNraXBfcGFzdF9uZXdsaW5lCisJY29weV9wYXN0X25ld2xpbmUKKwlyZW1jaGFyCisJZHVwCisJbWFrZV9lbnVtZXJhdG9yCisJc3dhcAorCW1ha2VfZW51bWVyYXRvcl9zdHJpbmcKKwlpZmludGVybmFsCisJOworOiBFTlVNWCBFTlVNIGNhdHN0ciA7Cis6IEVOVU1FUQorCXNraXBfcGFzdF9uZXdsaW5lCisJIiNkZWZpbmUgIgorCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIKKwljYXRzdHIKKwkiICIKKwljYXRzdHIKKwljb3B5X3Bhc3RfbmV3bGluZQorCWNhdHN0cgorCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKKwk7Cis6IEVOVU1FUVggRU5VTUVRIGNhdHN0ciA7Cis6IEVOVU1ET0MKKwlza2lwX3Bhc3RfbmV3bGluZQorCWdldF9zdHVmZl9pbl9jb21tYW5kCisJc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKKwkiXG57KiAiIHN3YXAgY2F0c3RyICIgKn1cbiIgY2F0c3RyCisJdHJhbnNsYXRlY29tbWVudHMKKwktIGRpc2NhcmQgaXQgaWYgd2UncmUgZG9pbmcgaW50ZXJuYWwgbW9kZQorCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKKwlzd2FwCisJY2F0c3RyIGNhdHN0cgorCTsKKzogRU5EREQgZXh0ZXJuYWwgOworOiBTRUNUSU9OIGlnbm9yZSA7Cis6IFNVQlNFQ1RJT04gaWdub3JlIDsKKzogU1VCU1VCU0VDVElPTiBpZ25vcmUgOworOiBJTlRFUk5BTF9ERUZJTklUSU9OIGludGVybmFsIDsKKzogREVTQ1JJUFRJT04gaWdub3JlIDsKKzogRlVOQ1RJT04gZXh0ZXJuYWwgOworOiBSRVRVUk5TIGlnbm9yZSA7Cis6IFRZUEVERUYgZXh0ZXJuYWwgOworOiBJTlRFUk5BTF9GVU5DVElPTiBpbnRlcm5hbCA7Cis6IElOVEVSTkFMIGludGVybmFsIDsKKzogSU5PREUgaWdub3JlIDsKZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjEuYyBiL2JmZC9kd2FyZjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNjMjZiCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2R3YXJmMS5jCkBAIC0wLDAgKzEsNTc2IEBACisvKiBEV0FSRiAxIGZpbmQgbmVhcmVzdCBsaW5lIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSkuCisgICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworV3JpdHRlbiBieSBHYXZpbiBSb21pZy1Lb2NoIG9mIEN5Z251cyBTb2x1dGlvbnMgKGdhdmluQGN5Z251cy5jb20pLiAgCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvZHdhcmYuaCIKKworLyogZHdhcmYxX2RlYnVnIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgYWxsIGR3YXJmMSBpbmZvLiAqLworCitzdHJ1Y3QgZHdhcmYxX2RlYnVnIHsKKworICAvKiBUaGUgYmZkIHdlIGFyZSB3b3JraW5nIHdpdGguICovCisgIGJmZCogYWJmZDsKKworICAvKiBMaXN0IG9mIGFscmVhZHkgcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXRzLiAqLworICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIGxhc3RVbml0OworCisgIC8qIFRoZSBidWZmZXIgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gCisgICAgIFplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIC5kZWJ1ZyBzZWN0aW9uIGZhaWxlZCB0byBsb2FkLiAqLworICBjaGFyKiBkZWJ1Z19zZWN0aW9uOworCisgIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLworICBjaGFyKiBkZWJ1Z19zZWN0aW9uX2VuZDsKKworICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KKyAgY2hhciogbGluZV9zZWN0aW9uOworCisgIC8qIEVuZCBvZiB0aGF0IGJ1ZmZlci4gKi8KKyAgY2hhciogbGluZV9zZWN0aW9uX2VuZDsKKworICAvKiBUaGUgY3VycmVudCBvciBuZXh0IHVucmVhZCBkaWUgd2l0aGluIHRoZSAuZGVidWcgc2VjdGlvbi4gKi8KKyAgY2hhciogY3VycmVudERpZTsKK307CisKKy8qIE9uZSBkd2FyZjFfdW5pdCBmb3IgZWFjaCBwYXJzZWQgY29tcGlsYXRpb24gdW5pdCBkaWUuICovCisKK3N0cnVjdCBkd2FyZjFfdW5pdCB7CisgIC8qIExpbmtlZCBzdGFydGluZyBmcm9tIHN0YXNoLT5sYXN0VW5pdC4gKi8KKyAgc3RydWN0IGR3YXJmMV91bml0KiBwcmV2OworCisgIC8qIE5hbWUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCisgIGNoYXIqIG5hbWU7CisKKyAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCisgIHVuc2lnbmVkIGxvbmcgbG93X3BjOworICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7CisKKyAgLyogRG9lcyB0aGlzIHVuaXQgaGF2ZSBhIHN0YXRlbWVudCBsaXN0PyAqLworICBpbnQgaGFzX3N0bXRfbGlzdDsKKworICAvKiBJZiBhbnksIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmUgbnVtYmVyIHRhYmxlIGluIHRoZSAubGluZSBzZWN0aW9uLiAqLworICB1bnNpZ25lZCBsb25nIHN0bXRfbGlzdF9vZmZzZXQ7CisKKyAgLyogSWYgbm9uLXplcm8sIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyB1bml0LiAqLworICBjaGFyKiBmaXJzdF9jaGlsZDsKKworICAvKiBIb3cgbWFueSBsaW5lIGVudHJpZXM/ICovCisgIHVuc2lnbmVkIGxvbmcgbGluZV9jb3VudDsKKworICAvKiBUaGUgZGVjb2RlZCBsaW5lIG51bWJlciB0YWJsZSAobGluZV9jb3VudCBlbnRyaWVzKS4gKi8KKyAgc3RydWN0IGxpbmVudW1iZXIqIGxpbmVudW1iZXJfdGFibGU7CisKKyAgLyogVGhlIGxpc3Qgb2YgZnVuY3Rpb25zIGluIHRoaXMgdW5pdC4gKi8KKyAgc3RydWN0IGR3YXJmMV9mdW5jKiBmdW5jX2xpc3Q7Cit9OworCisKKworLyogT25lIGR3YXJmMV9mdW5jIGZvciBlYWNoIHBhcnNlZCBmdW5jdGlvbiBkaWUuICAqLworCitzdHJ1Y3QgZHdhcmYxX2Z1bmMgeworICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBhVW5pdC0+ZnVuY19saXN0LiAqLworICBzdHJ1Y3QgZHdhcmYxX2Z1bmMqIHByZXY7CisgIAorICAvKiBOYW1lIG9mIGZ1bmN0aW9uLiAqLworICBjaGFyKiBuYW1lOworICAKKyAgLyogVGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBhZGRyZXNzIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCisgIHVuc2lnbmVkIGxvbmcgbG93X3BjOworICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Cit9OworCisKKy8qIFVzZWQgdG8gcmV0dXJuIGluZm8gYWJvdXQgYSBwYXJzZWQgZGllLiAqLworc3RydWN0IGRpZV9pbmZvIHsKKyAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIHVuc2lnbmVkIGxvbmcgc2libGluZzsKKyAgdW5zaWduZWQgbG9uZyBsb3dfcGM7CisgIHVuc2lnbmVkIGxvbmcgaGlnaF9wYzsKKyAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OworICAKKyAgY2hhciogbmFtZTsgCisgIAorICBpbnQgaGFzX3N0bXRfbGlzdDsKKworICB1bnNpZ25lZCBzaG9ydCB0YWc7Cit9OworCisKKy8qIFBhcnNlZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gKi8KK3N0cnVjdCBsaW5lbnVtYmVyIHsKKyAgLyogRmlyc3QgYWRkcmVzcyBpbiB0aGUgbGluZS4gKi8KKyAgdW5zaWduZWQgbG9uZyBhZGRyOworCisgIC8qIFRoZSBsaW5lIG51bWJlci4gKi8KKyAgdW5zaWduZWQgbG9uZyBsaW5lbnVtYmVyOworfTsKKworCisvKiBGaW5kIHRoZSBmb3JtIG9mIGFuIGF0dHIsIGZyb20gdGhlIGF0dHIgZmllbGQuICovCisjZGVmaW5lIEZPUk1fRlJPTV9BVFRSKGF0dHIpCSgoYXR0cikgJiAweEYpCS8qIEltcGxpY2l0bHkgc3BlY2lmaWVkICovCisKKworLyogUmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGR3YXJmMV91bml0LiAgSXQgc2hvdWxkIGJlIGNsZWFyZWQgYW5kCisgICB0aGVuIGF0dGFjaGVkIGludG8gdGhlICdzdGFzaCcgYXQgJ3N0YXNoLT5sYXN0VW5pdCcuICovCisKK3N0YXRpYyBzdHJ1Y3QgZHdhcmYxX3VuaXQqCithbGxvY19kd2FyZjFfdW5pdCAoc3Rhc2gpCisgIHN0cnVjdCBkd2FyZjFfZGVidWcqIHN0YXNoOworeworICBzdHJ1Y3QgZHdhcmYxX3VuaXQqIHggPSAKKyAgICAoc3RydWN0IGR3YXJmMV91bml0KikgYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGR3YXJmMV91bml0KSk7CisgIHgtPnByZXYgPSBzdGFzaC0+bGFzdFVuaXQ7CisgIHN0YXNoLT5sYXN0VW5pdCA9IHg7CisKKyAgcmV0dXJuIHg7Cit9CisKKy8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfZnVuYy4gIEl0IG11c3QgYmUgY2xlYXJlZCBhbmQKKyAgIGF0dGFjaGVkIGludG8gJ2FVbml0JyBhdCAnYVVuaXQtPmZ1bmNfbGlzdCcuICovCisKK3N0YXRpYyBzdHJ1Y3QgZHdhcmYxX2Z1bmMqCithbGxvY19kd2FyZjFfZnVuYyAoc3Rhc2gsIGFVbml0KQorICAgICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKKyAgICAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKK3sKKyAgc3RydWN0IGR3YXJmMV9mdW5jKiB4ID0gCisgICAgKHN0cnVjdCBkd2FyZjFfZnVuYyopIGJmZF9hbGxvYyAoc3Rhc2gtPmFiZmQsIAorCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2Z1bmMpKTsKKyAgeC0+cHJldiA9IGFVbml0LT5mdW5jX2xpc3Q7CisgIGFVbml0LT5mdW5jX2xpc3QgPSB4OworICAKKyAgcmV0dXJuIHg7Cit9CisKKy8qIHBhcnNlX2RpZSAtIHBhcnNlIGEgRHdhcmYxIGRpZS4KKyAgIFBhcnNlIHRoZSBkaWUgc3RhcnRpbmcgYXQgJ2FEaWVQdHInIGludG8gJ2FEaWVJbmZvJy4KKyAgICdhYmZkJyBtdXN0IGJlIHRoZSBiZmQgZnJvbSB3aGljaCB0aGUgc2VjdGlvbiB0aGF0ICdhRGllUHRyJworICAgcG9pbnRzIHRvIHdhcyBwdWxsZWQgZnJvbS4gCisKKyAgIFJldHVybiBmYWxzZSBpZiB0aGUgZGllIGlzIGludmFsaWRseSBmb3JtYXR0ZWQ7IHRydWUgb3RoZXJ3aXNlLiAqLworCitzdGF0aWMgYm9vbGVhbgorcGFyc2VfZGllIChhYmZkLCBhRGllSW5mbywgYURpZVB0cikKKyAgICAgYmZkKiBhYmZkOworICAgICBzdHJ1Y3QgZGllX2luZm8qIGFEaWVJbmZvOworICAgICBjaGFyKiAgICAgICAgICAgIGFEaWVQdHI7Cit7CisgIGNoYXIqIHRoaXNfZGllID0gYURpZVB0cjsKKyAgY2hhciogeHB0ciA9IHRoaXNfZGllOworCisgIG1lbXNldCAoYURpZUluZm8sMCxzaXplb2YoKmFEaWVJbmZvKSk7CisKKyAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KKyAgYURpZUluZm8tPmxlbmd0aCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOworICB4cHRyICs9IDQ7CisgIGlmIChhRGllSW5mby0+bGVuZ3RoIDwgNikKKyAgICB7CisgICAgICAvKiBKdXN0IHBhZGRpbmcgYnl0ZXMuICovCisgICAgICBhRGllSW5mby0+dGFnID0gVEFHX3BhZGRpbmc7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogVGhlbiB0aGUgdGFnLiAqLworICBhRGllSW5mby0+dGFnID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7CisgIHhwdHIgKz0gMjsKKyAgICAgIAorICAvKiBUaGVuIHRoZSBhdHRyaWJ1dGVzLiAqLworICB3aGlsZSAoeHB0ciA8ICh0aGlzX2RpZSArIGFEaWVJbmZvLT5sZW5ndGgpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGF0dHI7CisgICAgICAKKyAgICAgIC8qIFBhcnNlIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIGZvcm0uICBUaGlzIHNlY3Rpb24gCisgICAgICAgICBtdXN0IGhhbmRsZSBhbGwgZHdhcmYxIGZvcm1zLCBidXQgbmVlZCBvbmx5IGhhbmRsZSB0aGUKKwkgYWN0dWFsIGF0dHJpYnV0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0LiAqLworCisgICAgICBhdHRyID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7CisgICAgICB4cHRyICs9IDI7CisgICAgICAKKyAgICAgIHN3aXRjaCAoRk9STV9GUk9NX0FUVFIgKGF0dHIpKQorCXsKKwljYXNlIEZPUk1fREFUQTI6CisJICB4cHRyICs9IDI7CisJICBicmVhazsKKwljYXNlIEZPUk1fREFUQTQ6CisJY2FzZSBGT1JNX1JFRjoKKwkgIGlmIChhdHRyID09IEFUX3NpYmxpbmcpCisJICAgIGFEaWVJbmZvLT5zaWJsaW5nID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7CisJICBlbHNlIGlmIChhdHRyID09IEFUX3N0bXRfbGlzdCkKKwkgICAgeworCSAgICAgIGFEaWVJbmZvLT5zdG10X2xpc3Rfb2Zmc2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7CisJICAgICAgYURpZUluZm8tPmhhc19zdG10X2xpc3QgPSAxOworCSAgICB9CisJICB4cHRyICs9IDQ7CisJICBicmVhazsKKwljYXNlIEZPUk1fREFUQTg6CisJICB4cHRyICs9IDg7CisJICBicmVhazsKKwljYXNlIEZPUk1fQUREUjoKKwkgIGlmIChhdHRyID09IEFUX2xvd19wYykKKwkgICAgYURpZUluZm8tPmxvd19wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOworCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9oaWdoX3BjKQorCSAgICBhRGllSW5mby0+aGlnaF9wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOworCSAgeHB0ciArPSA0OworCSAgYnJlYWs7CisJY2FzZSBGT1JNX0JMT0NLMjoKKwkgIHhwdHIgKz0gMiArIGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOworCSAgYnJlYWs7CisJY2FzZSBGT1JNX0JMT0NLNDoKKwkgIHhwdHIgKz0gNCArIGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOworCSAgYnJlYWs7CisJY2FzZSBGT1JNX1NUUklORzoKKwkgIGlmIChhdHRyID09IEFUX25hbWUpCisJICAgIGFEaWVJbmZvLT5uYW1lID0geHB0cjsKKwkgIHhwdHIgKz0gc3RybGVuICh4cHRyKSArIDE7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBQYXJzZSBhIGR3YXJmMSBsaW5lIG51bWJlciB0YWJsZSBmb3IgJ2FVbml0LT5zdG10X2xpc3Rfb2Zmc2V0JworICAgaW50byAnYVVuaXQtPmxpbmVudW1iZXJfdGFibGUnLiAgUmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIAorICAgb2NjdXJzOyB0cnVlIG90aGVyd2lzZS4gKi8KKyAgCitzdGF0aWMgYm9vbGVhbgorcGFyc2VfbGluZV90YWJsZSAoc3Rhc2gsIGFVbml0KQorICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKKyAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKK3sKKyAgY2hhciogeHB0cjsKKworICAvKiBMb2FkIHRoZSAiLmxpbmUiIHNlY3Rpb24gZnJvbSB0aGUgYmZkIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4gKi8gCisgIGlmIChzdGFzaC0+bGluZV9zZWN0aW9uID09IDApCisgICAgeworICAgICAgYXNlY3Rpb24gKm1zZWM7CisgICAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgICAKKyAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rhc2gtPmFiZmQsICIubGluZSIpOworICAgICAgaWYgKCEgbXNlYykKKwlyZXR1cm4gZmFsc2U7CisJICAKKyAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOworICAgICAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9ICh1bnNpZ25lZCBjaGFyKikgYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgc2l6ZSk7CisgICAgICAKKyAgICAgIGlmICghIHN0YXNoLT5saW5lX3NlY3Rpb24pCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN0YXNoLT5hYmZkLCBtc2VjLCBzdGFzaC0+bGluZV9zZWN0aW9uLCAwLCBzaXplKSkKKwl7CisJICBzdGFzaC0+bGluZV9zZWN0aW9uID0gMDsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIHNpemU7CisgICAgfQorCisgIHhwdHIgPSBzdGFzaC0+bGluZV9zZWN0aW9uICsgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQ7CisgIGlmICh4cHRyIDwgc3Rhc2gtPmxpbmVfc2VjdGlvbl9lbmQpCisgICAgeworICAgICAgaW50IGVhY2hMaW5lOworCisgICAgICBjaGFyKiB0YmxlbmQ7CisgICAgICB1bnNpZ25lZCBsb25nIGJhc2U7CisKKyAgICAgIC8qIEZpcnN0IGNvbWVzIHRoZSBsZW5ndGguICovCisgICAgICB0YmxlbmQgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cikgKyB4cHRyOworICAgICAgeHB0ciArPSA0OworCisgICAgICAvKiBUaGVuIHRoZSBiYXNlIGFkZHJlc3MgZm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgdGFibGUuICovCisgICAgICBiYXNlID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOworICAgICAgeHB0ciArPSA0OworCisgICAgICAvKiBIb3cgbWFueSBsaW5lIGVudHJ5cz8KKwkgMTAgPSA0IChsaW5lIG51bWJlcikgKyAyIChwb3MgaW4gbGluZSkgKyA0IChhZGRyZXNzIGluIGxpbmUpICovCisgICAgICBhVW5pdC0+bGluZV9jb3VudCA9ICh0YmxlbmQgLSB4cHRyKSAvIDEwOworCisgICAgICAvKiBBbGxvY2F0ZSBhbiBhcnJheSBmb3IgdGhlIGVudHJpZXMuICovCisgICAgICBhVW5pdC0+bGluZW51bWJlcl90YWJsZSA9IChzdHJ1Y3QgbGluZW51bWJlciopCisJYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgCisJCSAgIHNpemVvZiAoc3RydWN0IGxpbmVudW1iZXIpICogYVVuaXQtPmxpbmVfY291bnQpOworCQorICAgICAgZm9yIChlYWNoTGluZSA9IDA7IGVhY2hMaW5lIDwgYVVuaXQtPmxpbmVfY291bnQ7IGVhY2hMaW5lKyspCisJeworCSAgLyogQSBsaW5lIG51bWJlci4gKi8KKwkgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2VhY2hMaW5lXS5saW5lbnVtYmVyCisJICAgID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOworCSAgeHB0ciArPSA0OworCisJICAvKiBTa2lwIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGxpbmUuICovCisJICB4cHRyICs9IDI7CisKKwkgIC8qIEFuZCBmaW5hbGx5IHRoZSBhZGRyZXNzLiAqLworCSAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbZWFjaExpbmVdLmFkZHIgCisJICAgID0gYmFzZSArIGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKKwkgIHhwdHIgKz0gNDsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBQYXJzZSBlYWNoIGZ1bmN0aW9uIGRpZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgJ2FVbml0Jy4KKyAgIFRoZSBmaXJzdCBjaGlsZCBkaWUgb2YgJ2FVbml0JyBzaG91bGQgYmUgaW4gJ2FVbml0LT5maXJzdF9jaGlsZCcsCisgICB0aGUgcmVzdWx0IGlzIHBsYWNlZCBpbiAnYVVuaXQtPmZ1bmNfbGlzdCcuCisgICBSZXR1cm4gZmFsc2UgaWYgZXJyb3I7IHRydWUgb3RoZXJ3aXNlLiAqLworCitzdGF0aWMgYm9vbGVhbgorcGFyc2VfZnVuY3Rpb25zX2luX3VuaXQgKHN0YXNoLCBhVW5pdCkKKyAgICAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7CisgICAgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Cit7CisgIGNoYXIqIGVhY2hEaWU7CisKKyAgaWYgKGFVbml0LT5maXJzdF9jaGlsZCkKKyAgICBmb3IgKGVhY2hEaWUgPSBhVW5pdC0+Zmlyc3RfY2hpbGQ7CisJIGVhY2hEaWUgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQ7CisJICkKKyAgICAgIHsKKwlzdHJ1Y3QgZGllX2luZm8gZWFjaERpZUluZm87CisJCisJaWYgKCEgcGFyc2VfZGllIChzdGFzaC0+YWJmZCwgJmVhY2hEaWVJbmZvLCBlYWNoRGllKSkKKwkgIHJldHVybiBmYWxzZTsKKwkKKwlpZiAoZWFjaERpZUluZm8udGFnID09IFRBR19nbG9iYWxfc3Vicm91dGluZQorCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX3N1YnJvdXRpbmUKKwkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19pbmxpbmVkX3N1YnJvdXRpbmUKKwkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19lbnRyeV9wb2ludCkKKwkgIHsKKwkgICAgc3RydWN0IGR3YXJmMV9mdW5jKiBhRnVuYyA9IGFsbG9jX2R3YXJmMV9mdW5jIChzdGFzaCxhVW5pdCk7CisJICAgIAorCSAgICBhRnVuYy0+bmFtZSA9IGVhY2hEaWVJbmZvLm5hbWU7CisJICAgIGFGdW5jLT5sb3dfcGMgPSBlYWNoRGllSW5mby5sb3dfcGM7CisJICAgIGFGdW5jLT5oaWdoX3BjID0gZWFjaERpZUluZm8uaGlnaF9wYzsKKwkgIH0KKwkKKwkvKiBNb3ZlIHRvIG5leHQgc2libGluZywgaWYgbm9uZSwgZW5kIGxvb3AgKi8KKwlpZiAoZWFjaERpZUluZm8uc2libGluZykKKwkgIGVhY2hEaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGVhY2hEaWVJbmZvLnNpYmxpbmc7CisJZWxzZQorCSAgYnJlYWs7CisgICAgICB9CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHRvICdhZGRyJyBpbiAnYVVuaXQnLgorICAgUmV0dXJuIHdoZXRoZXIgd2UgZm91bmQgdGhlIGxpbmUgKG9yIGEgZnVuY3Rpb24pIHdpdGhvdXQgZXJyb3IuICovCisKK3N0YXRpYyBib29sZWFuCitkd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGFVbml0LCBhZGRyLCAKKwkJICAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKKwkJICAgICAgIGxpbmVudW1iZXJfcHRyKQorICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKKyAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKKyAgdW5zaWduZWQgbG9uZyBhZGRyOworICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOworICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKK3sKKyAgaW50IGxpbmVfcCA9IGZhbHNlOworICBpbnQgZnVuY19wID0gZmFsc2U7CisKKyAgaWYgKGFVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgYVVuaXQtPmhpZ2hfcGMpCisgICAgeworICAgICAgaWYgKGFVbml0LT5oYXNfc3RtdF9saXN0KQorCXsKKwkgIGludCBpOworCSAgc3RydWN0IGR3YXJmMV9mdW5jKiBlYWNoRnVuYzsKKworCSAgaWYgKCEgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUpCisJICAgIHsKKwkgICAgICBpZiAoISBwYXJzZV9saW5lX3RhYmxlIChzdGFzaCwgYVVuaXQpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaWYgKCEgYVVuaXQtPmZ1bmNfbGlzdCkKKwkgICAgeworCSAgICAgIGlmICghIHBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgZm9yIChpID0gMDsgaSA8IGFVbml0LT5saW5lX2NvdW50OyBpKyspCisJICAgIHsKKwkgICAgICBpZiAoYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaV0uYWRkciA8PSBhZGRyCisJCSAgJiYgYWRkciA8IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2krMV0uYWRkcikKKwkJeworCQkgICpmaWxlbmFtZV9wdHIgPSBhVW5pdC0+bmFtZTsKKwkJICAqbGluZW51bWJlcl9wdHIgPSBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5saW5lbnVtYmVyOworCQkgIGxpbmVfcCA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICBmb3IgKGVhY2hGdW5jID0gYVVuaXQtPmZ1bmNfbGlzdDsgCisJICAgICAgIGVhY2hGdW5jOyAKKwkgICAgICAgZWFjaEZ1bmMgPSBlYWNoRnVuYy0+cHJldikKKwkgICAgeworCSAgICAgIGlmIChlYWNoRnVuYy0+bG93X3BjIDw9IGFkZHIKKwkJICAmJiBhZGRyIDwgZWFjaEZ1bmMtPmhpZ2hfcGMpCisJCXsKKwkJICAqZnVuY3Rpb25uYW1lX3B0ciA9IGVhY2hGdW5jLT5uYW1lOworCQkgIGZ1bmNfcCA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Cit9CisKKworCisKKy8qIFRoZSBEV0FSRiAxIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuCisgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAqLworCitib29sZWFuCitfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lbnVtYmVyX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKK3sKKyAgc3RydWN0IGR3YXJmMV9kZWJ1ZyAqc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjFfZmluZF9saW5lX2luZm87CisKKyAgc3RydWN0IGR3YXJmMV91bml0KiBlYWNoVW5pdDsKKworICAvKiBXaGF0IGFkZHJlc3MgYXJlIHdlIGxvb2tpbmcgZm9yPyAqLworICBiZmRfdm1hIGFkZHIgPSBvZmZzZXQgKyBzZWN0aW9uLT52bWE7CisKKyAgKmZpbGVuYW1lX3B0ciA9IE5VTEw7CisgICpmdW5jdGlvbm5hbWVfcHRyID0gTlVMTDsKKyAgKmxpbmVudW1iZXJfcHRyID0gMDsKKyAgCisKKyAgaWYgKCEgc3Rhc2gpCisgICAgeworICAgICAgYXNlY3Rpb24gKm1zZWM7CisgICAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgICAKKyAgICAgIHN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYxX2ZpbmRfbGluZV9pbmZvID0KKwkoc3RydWN0IGR3YXJmMV9kZWJ1ZyopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmMV9kZWJ1ZykpOworICAgICAgCisgICAgICBpZiAoISBzdGFzaCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOworICAgICAgaWYgKCEgbXNlYykKKwl7CisJICAvKiBObyBkd2FyZjEgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAorCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cworCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7CisgICAgICBzdGFzaC0+ZGVidWdfc2VjdGlvbiA9ICh1bnNpZ25lZCBjaGFyKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKKyAgICAgIAorICAgICAgaWYgKCEgc3Rhc2gtPmRlYnVnX3NlY3Rpb24pCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIHN0YXNoLT5kZWJ1Z19zZWN0aW9uLCAwLCBzaXplKSkKKwl7CisJICBzdGFzaC0+ZGVidWdfc2VjdGlvbiA9IDA7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIHNpemU7CisgICAgICBzdGFzaC0+Y3VycmVudERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uOworICAgICAgc3Rhc2gtPmFiZmQgPSBhYmZkOworICAgIH0KKworICAvKiBBIG51bGwgZGVidWdfc2VjdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSB3YXMgbm8gZHdhcmYxIGluZm8KKyAgICAgb3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoLiAqLworCisgIGlmICghIHN0YXNoLT5kZWJ1Z19zZWN0aW9uKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisKKyAgLyogTG9vayBhdCB0aGUgcHJldmlvdXNseSBwYXJzZWQgdW5pdHMgdG8gc2VlIGlmIGFueSBjb250YWluCisgICAgIHRoZSBhZGRyLiAqLworICBmb3IgKGVhY2hVbml0ID0gc3Rhc2gtPmxhc3RVbml0OyBlYWNoVW5pdDsgZWFjaFVuaXQgPSBlYWNoVW5pdC0+cHJldikKKyAgICB7CisgICAgICBpZiAoZWFjaFVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBlYWNoVW5pdC0+aGlnaF9wYykKKwlyZXR1cm4gZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBlYWNoVW5pdCwgYWRkciwKKwkJCQkJICAgICAgZmlsZW5hbWVfcHRyLCAKKwkJCQkJICAgICAgZnVuY3Rpb25uYW1lX3B0ciwgCisJCQkJCSAgICAgIGxpbmVudW1iZXJfcHRyKTsKKyAgICB9CisKKyAgd2hpbGUgKHN0YXNoLT5jdXJyZW50RGllIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kKQorICAgIHsKKyAgICAgIHN0cnVjdCBkaWVfaW5mbyBhRGllSW5mbzsKKworICAgICAgaWYgKCEgcGFyc2VfZGllIChzdGFzaC0+YWJmZCwgJmFEaWVJbmZvLCBzdGFzaC0+Y3VycmVudERpZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgCisgICAgICBpZiAoYURpZUluZm8udGFnID09IFRBR19jb21waWxlX3VuaXQpCisJeworCSAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdAorCSAgICA9IGFsbG9jX2R3YXJmMV91bml0IChzdGFzaCk7CisJICAKKwkgIGFVbml0LT5uYW1lID0gYURpZUluZm8ubmFtZTsKKwkgIGFVbml0LT5sb3dfcGMgPSBhRGllSW5mby5sb3dfcGM7CisJICBhVW5pdC0+aGlnaF9wYyA9IGFEaWVJbmZvLmhpZ2hfcGM7CisJICBhVW5pdC0+aGFzX3N0bXRfbGlzdCA9IGFEaWVJbmZvLmhhc19zdG10X2xpc3Q7CisJICBhVW5pdC0+c3RtdF9saXN0X29mZnNldCA9IGFEaWVJbmZvLnN0bXRfbGlzdF9vZmZzZXQ7CisJICAKKwkgIC8qIEEgZGllIGhhcyBhIGNoaWxkIGlmIGl0J3MgZm9sbG93ZWQgYnkgYSBkaWUgdGhhdCBpcworCSAgICAgbm90IGl0J3Mgc2libGluZy4gKi8KKwkgIGlmIChhRGllSW5mby5zaWJsaW5nIAorCSAgICAgICYmIHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoIAorICAgICAgICAgICAgICAgICAgICA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZAorCSAgICAgICYmIHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoIAorCSAgICAgICAgICAgICE9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgYURpZUluZm8uc2libGluZykKKwkgICAgYVVuaXQtPmZpcnN0X2NoaWxkID0gc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGg7CisJICBlbHNlCisJICAgIGFVbml0LT5maXJzdF9jaGlsZCA9IDA7CisKKwkgIGlmIChhVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGFVbml0LT5oaWdoX3BjKQorCSAgICByZXR1cm4gZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBhVW5pdCwgYWRkciwgCisJCQkJCQkgIGZpbGVuYW1lX3B0ciwgCisJCQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIsIAorCQkJCQkJICBsaW5lbnVtYmVyX3B0cik7CisJfQorICAgICAgCisgICAgICBpZiAoYURpZUluZm8uc2libGluZyAhPSAwKQorCXN0YXNoLT5jdXJyZW50RGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBhRGllSW5mby5zaWJsaW5nOworICAgICAgZWxzZQorCXN0YXNoLT5jdXJyZW50RGllICs9IGFEaWVJbmZvLmxlbmd0aDsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvYmZkL2R3YXJmMi5jIGIvYmZkL2R3YXJmMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWJmODIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZHdhcmYyLmMKQEAgLTAsMCArMSwxNDY2IEBACisvKiBEV0FSRiAyIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQWRhcHRlZCBmcm9tIGdkYi9kd2FyZjJyZWFkLmMgYnkgR2F2aW4gS29jaCBvZiBDeWdudXMgU29sdXRpb25zCisgICAoZ2F2aW5AY3lnbnVzLmNvbSkuCisKKyAgIEZyb20gdGhlIGR3YXJmMnJlYWQuYyBoZWFkZXI6CisgICBBZGFwdGVkIGJ5IEdhcnkgRnVuY2sgKGdhcnlAaW50cmVwaWQuY29tKSwgSW50cmVwaWQgVGVjaG5vbG9neSwKKyAgIEluYy4gIHdpdGggc3VwcG9ydCBmcm9tIEZsb3JpZGEgU3RhdGUgVW5pdmVyc2l0eSAodW5kZXIgY29udHJhY3QKKyAgIHdpdGggdGhlIEFkYSBKb2ludCBQcm9ncmFtIE9mZmljZSksIGFuZCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgICBJbml0aWFsIGNvbnRyaWJ1dGlvbiBieSBCcmVudCBCZW5zb24sIEhhcnJpcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuLAorICAgYmFzZWQgb24gRnJlZCBGaXNoJ3MgKEN5Z251cyBTdXBwb3J0KSBpbXBsZW1lbnRhdGlvbiBvZiBEV0FSRiAxCisgICBzdXBwb3J0IGluIGR3YXJmcmVhZC5jCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRC4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCisKKy8qIFRoZSBkYXRhIGluIHRoZSAuZGVidWdfbGluZSBzdGF0ZW1lbnQgcHJvbG9ndWUgbG9va3MgbGlrZSB0aGlzLiAgKi8KK3N0cnVjdCBsaW5lX2hlYWQKKyAgeworICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGg7CisgICAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKKyAgICB1bnNpZ25lZCBpbnQgcHJvbG9ndWVfbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgbWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciBkZWZhdWx0X2lzX3N0bXQ7CisgICAgaW50IGxpbmVfYmFzZTsKKyAgICB1bnNpZ25lZCBjaGFyIGxpbmVfcmFuZ2U7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGVfYmFzZTsKKyAgICB1bnNpZ25lZCBjaGFyICpzdGFuZGFyZF9vcGNvZGVfbGVuZ3RoczsKKyAgfTsKKworLyogQXR0cmlidXRlcyBoYXZlIGEgbmFtZSBhbmQgYSB2YWx1ZSAqLworc3RydWN0IGF0dHJpYnV0ZQorICB7CisgICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKKyAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKKyAgICB1bmlvbgorICAgICAgeworCWNoYXIgKnN0cjsKKwlzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKKwl1bnNpZ25lZCBpbnQgdW5zbmQ7CisJaW50IHNuZDsKKwliZmRfdm1hIGFkZHI7CisgICAgICB9CisgICAgdTsKKyAgfTsKKworLyogR2V0IGF0IHBhcnRzIG9mIGFuIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBEV19TVFJJTkcoYXR0cikgICAgKChhdHRyKS0+dS5zdHIpCisjZGVmaW5lIERXX1VOU05EKGF0dHIpICAgICAoKGF0dHIpLT51LnVuc25kKQorI2RlZmluZSBEV19CTE9DSyhhdHRyKSAgICAgKChhdHRyKS0+dS5ibGspCisjZGVmaW5lIERXX1NORChhdHRyKSAgICAgICAoKGF0dHIpLT51LnNuZCkKKyNkZWZpbmUgRFdfQUREUihhdHRyKQkgICAoKGF0dHIpLT51LmFkZHIpCisKKy8qIEJsb2NrcyBhcmUgYSBidW5jaCBvZiB1bnR5cGVkIGJ5dGVzLiAqLworc3RydWN0IGR3YXJmX2Jsb2NrCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBjaGFyICpkYXRhOworICB9OworCisKK3N0cnVjdCBkd2FyZjJfZGVidWcgeworCisgIC8qIEEgbGlzdCBvZiBhbGwgcHJldmlvdXNseSByZWFkIGNvbXBfdW5pdHMuICovCisgIHN0cnVjdCBjb21wX3VuaXQqIGFsbF9jb21wX3VuaXRzOworCisgIC8qIFRoZSBuZXh0IHVucmVhZCBjb21waWxhdGlvbiB1bml0IHdpdGhpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KKyAgICAgWmVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBoYXMgbm90IGJlZW4gbG9hZGVkCisgICAgIGludG8gYSBidWZmZXIgeWV0LiovCisgIGNoYXIqIGluZm9fcHRyOworCisgIC8qIFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBtZW1vcnkgYnVmZmVyLiAqLworICBjaGFyKiBpbmZvX3B0cl9lbmQ7CisKKyAgLyogUG9pbnRlciB0byB0aGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIGxvYWRlZCBpbnRvIG1lbW9yeS4gKi8KKyAgY2hhciogZHdhcmZfYWJicmV2X2J1ZmZlcjsKKworICAvKiBMZW5ndGggb2YgdGhlIGxvYWRlZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uICovCisgIHVuc2lnbmVkIGxvbmcgZHdhcmZfYWJicmV2X3NpemU7Cit9OworCisKKworLyogQSBtaW5pbWFsIGRlY29kaW5nIG9mIERXQVJGMiBjb21waWxhdGlvbiB1bml0cy4gIFdlIG9ubHkgZGVjb2RlCisgICB3aGF0J3MgbmVlZGVkIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCisKK3N0cnVjdCBjb21wX3VuaXQgeworCisgIC8qIENoYWluIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcGlsYXRpb24gdW5pdHMuICovCisgIHN0cnVjdCBjb21wX3VuaXQqIG5leHRfdW5pdDsKKworICAvKiBLZWVwIHRoZSBiZGYgY29udmVuaWVudCAoZm9yIG1lbW9yeSBhbGxvY2F0aW9uKS4gKi8KKyAgYmZkKiBhYmZkOworCisgIC8qIFRoZSBsb3dlc3QgYW5kIGhpZ2VzdCBhZGRyZXNzZXMgY29udGFpbmVkIGluIHRoaXMgY29tcGlsYXRpb24KKyAgICAgdW5pdCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLiAqLworICBiZmRfdm1hIGxvdzsKKyAgYmZkX3ZtYSBoaWdoOworCisgIC8qIFRoZSBEV19BVF9uYW1lIGF0dHJpYnV0ZSAoZm9yIGVycm9yIG1lc3NhZ2VzKS4gKi8KKyAgY2hhciogbmFtZTsKKworICAvKiBUaGUgYWJicmV2IGhhc2ggdGFibGUuICovCisgIHN0cnVjdCBhYmJyZXZfaW5mbyoqIGFiYnJldnM7CisKKyAgLyogTm90ZSB0aGF0IGFuIGVycm9yIHdhcyBmb3VuZCBieSBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUuICovCisgIGludCBlcnJvcjsKKworICAvKiBUaGUgRFdfQVRfY29tcF9kaXIgYXR0cmlidXRlICovCisgIGNoYXIqIGNvbXBfZGlyOworCisgIC8qIFRydWUgaWYgdGhlcmUgaXMgYSBsaW5lIG51bWJlciB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wLiB1bml0LiAqLworICBpbnQgc3RtdGxpc3Q7CisgIAorICAvKiBUaGUgb2Zmc2V0IGludG8gLmRlYnVnX2xpbmUgb2YgdGhlIGxpbmUgbnVtYmVyIHRhYmxlLiAqLworICB1bnNpZ25lZCBsb25nIGxpbmVfb2Zmc2V0OworCisgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoaWxkIGRpZSBmb3IgdGhlIGNvbXAgdW5pdC4gKi8KKyAgY2hhciAqZmlyc3RfY2hpbGRfZGllX3B0cjsKKworICAvKiBUaGUgZW5kIG9mIHRoZSBjb21wIHVuaXQuICovCisgIGNoYXIgKmVuZF9wdHI7CisKKyAgLyogVGhlIGRlY29kZWQgbGluZSBudW1iZXIsIE5VTEwgaWYgbm90IHlldCBkZWNvZGVkLiAqLworICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiBsaW5lX3RhYmxlOworCisgIC8qIEEgbGlzdCBvZiB0aGUgZnVuY3Rpb25zIGZvdW5kIGluIHRoaXMgY29tcC4gdW5pdC4gKi8KKyAgc3RydWN0IGZ1bmNpbmZvKiBmdW5jdGlvbl90YWJsZTsgCisKKyAgLyogQWRkcmVzcyBzaXplIGZvciB0aGlzIHVuaXQgLSBmcm9tIHVuaXQgaGVhZGVyICovCisgIHVuc2lnbmVkIGNoYXIgYWRkcl9zaXplOworfTsKKworCisKKy8qIFZFUkJBVElNIAorICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiB1cCB0byB0aGUgRU5EIFZFUkJBVElNIG1hcmsgYXJlIAorICAgY29waWVkIGRpcmVjdGx5IGZyb20gZHdhcmYycmVhZC5jLiAqLworCisvKiByZWFkIGR3YXJmIGluZm9ybWF0aW9uIGZyb20gYSBidWZmZXIgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF8xX2J5dGUgKGFiZmQsIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7Cit7CisgIHJldHVybiBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworfQorCitzdGF0aWMgaW50CityZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7Cit7CisgIHJldHVybiBiZmRfZ2V0X3NpZ25lZF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF8yX2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Cit9CisKKyNpZiAwCisKKy8qIFRoaXMgaXMgbm90IHVzZWQuICAqLworCitzdGF0aWMgaW50CityZWFkXzJfc2lnbmVkX2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworfQorCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF80X2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Cit9CisKKyNpZiAwCisKKy8qIFRoaXMgaXMgbm90IHVzZWQuICAqLworCitzdGF0aWMgaW50CityZWFkXzRfc2lnbmVkX2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworfQorCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF84X2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Cit9CisKK3N0YXRpYyBjaGFyICoKK3JlYWRfbl9ieXRlcyAoYWJmZCwgYnVmLCBzaXplKQorICAgICBiZmQgKiBhYmZkOworICAgICBjaGFyICpidWY7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICAvKiBJZiB0aGUgc2l6ZSBvZiBhIGhvc3QgY2hhciBpcyA4IGJpdHMsIHdlIGNhbiByZXR1cm4gYSBwb2ludGVyCisgICAgIHRvIHRoZSBidWZmZXIsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGNvcHkgdGhlIGRhdGEgdG8gYSBidWZmZXIKKyAgICAgYWxsb2NhdGVkIG9uIHRoZSB0ZW1wb3Jhcnkgb2JzdGFjay4gICovCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICoKK3JlYWRfc3RyaW5nIChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdW5zaWduZWQgaW50ICpieXRlc19yZWFkX3B0cjsKK3sKKyAgLyogSWYgdGhlIHNpemUgb2YgYSBob3N0IGNoYXIgaXMgOCBiaXRzLCB3ZSBjYW4gcmV0dXJuIGEgcG9pbnRlcgorICAgICB0byB0aGUgc3RyaW5nLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjb3B5IHRoZSBzdHJpbmcgdG8gYSBidWZmZXIKKyAgICAgYWxsb2NhdGVkIG9uIHRoZSB0ZW1wb3Jhcnkgb2JzdGFjay4gICovCisgIGlmICgqYnVmID09ICdcMCcpCisgICAgeworICAgICAgKmJ5dGVzX3JlYWRfcHRyID0gMTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgKmJ5dGVzX3JlYWRfcHRyID0gc3RybGVuIChidWYpICsgMTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOworeworICB1bnNpZ25lZCBpbnQgIHJlc3VsdDsKKyAgdW5zaWduZWQgaW50ICBudW1fcmVhZDsKKyAgaW50ICAgICAgICAgICBzaGlmdDsKKyAgdW5zaWduZWQgY2hhciBieXRlOworCisgIHJlc3VsdCAgID0gMDsKKyAgc2hpZnQgICAgPSAwOworICBudW1fcmVhZCA9IDA7CisgIAorICBkbworICAgIHsKKyAgICAgIGJ5dGUgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworICAgICAgYnVmICsrOworICAgICAgbnVtX3JlYWQgKys7CisgICAgICByZXN1bHQgfD0gKChieXRlICYgMHg3ZikgPDwgc2hpZnQpOworICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgIHdoaWxlIChieXRlICYgMHg4MCk7CisgIAorICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CityZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGNoYXIgKiBidWY7CisgICAgIHVuc2lnbmVkIGludCAqIGJ5dGVzX3JlYWRfcHRyOworeworICBpbnQgICAgICAgICAgIHJlc3VsdDsKKyAgaW50ICAgICAgICAgICBzaGlmdDsKKyAgaW50ICAgICAgICAgICBudW1fcmVhZDsKKyAgdW5zaWduZWQgY2hhciBieXRlOworCisgIHJlc3VsdCA9IDA7CisgIHNoaWZ0ID0gMDsKKyAgbnVtX3JlYWQgPSAwOworCisgIGRvCisgICAgeworICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7CisgICAgICBidWYgKys7CisgICAgICBudW1fcmVhZCArKzsKKyAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKKyAgCisgIGlmICgoc2hpZnQgPCAzMikgJiYgKGJ5dGUgJiAweDQwKSkKKyAgICByZXN1bHQgfD0gLSgxIDw8IHNoaWZ0KTsKKworICAqIGJ5dGVzX3JlYWRfcHRyID0gbnVtX3JlYWQ7CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBFTkQgVkVSQkFUSU0gKi8KKworc3RhdGljIGJmZF92bWEKK3JlYWRfYWRkcmVzcyAodW5pdCwgYnVmKQorICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OworICAgICBjaGFyICpidWY7Cit7CisgIGJmZF92bWEgcmV0dmFsID0gMDsKKworICBpZiAodW5pdC0+YWRkcl9zaXplID09IDQpCisgICAgeworICAgICAgcmV0dmFsID0gYmZkX2dldF8zMiAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHZhbCA9IGJmZF9nZXRfNjQgKHVuaXQtPmFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisKKworCisvKiBUaGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBvZiBhbiBhYmJyZXYuICovCitzdHJ1Y3QgYWJicmV2X2luZm8KKyAgeworICAgIHVuc2lnbmVkIGludCBudW1iZXI7CS8qIG51bWJlciBpZGVudGlmeWluZyBhYmJyZXYgKi8KKyAgICBlbnVtIGR3YXJmX3RhZyB0YWc7CQkvKiBkd2FyZiB0YWcgKi8KKyAgICBpbnQgaGFzX2NoaWxkcmVuOwkJLyogYm9vbGVhbiAqLworICAgIHVuc2lnbmVkIGludCBudW1fYXR0cnM7CS8qIG51bWJlciBvZiBhdHRyaWJ1dGVzICovCisgICAgc3RydWN0IGF0dHJfYWJicmV2ICphdHRyczsJLyogYW4gYXJyYXkgb2YgYXR0cmlidXRlIGRlc2NyaXB0aW9ucyAqLworICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqbmV4dDsJLyogbmV4dCBpbiBjaGFpbiAqLworICB9OworCitzdHJ1Y3QgYXR0cl9hYmJyZXYKKyAgeworICAgIGVudW0gZHdhcmZfYXR0cmlidXRlIG5hbWU7CisgICAgZW51bSBkd2FyZl9mb3JtIGZvcm07CisgIH07CisKKyNpZm5kZWYgQUJCUkVWX0hBU0hfU0laRQorI2RlZmluZSBBQkJSRVZfSEFTSF9TSVpFIDEyMQorI2VuZGlmCisjaWZuZGVmIEFUVFJfQUxMT0NfQ0hVTksKKyNkZWZpbmUgQVRUUl9BTExPQ19DSFVOSyA0CisjZW5kaWYKKworLyogTG9va3VwIGFuIGFiYnJldl9pbmZvIHN0cnVjdHVyZSBpbiB0aGUgYWJicmV2IGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvICoKK2xvb2t1cF9hYmJyZXYgKG51bWJlcixhYmJyZXZzKQorICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOworICAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKiphYmJyZXZzOworeworICB1bnNpZ25lZCBpbnQgaGFzaF9udW1iZXI7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OworCisgIGhhc2hfbnVtYmVyID0gbnVtYmVyICUgQUJCUkVWX0hBU0hfU0laRTsKKyAgYWJicmV2ID0gYWJicmV2c1toYXNoX251bWJlcl07CisKKyAgd2hpbGUgKGFiYnJldikKKyAgICB7CisgICAgICBpZiAoYWJicmV2LT5udW1iZXIgPT0gbnVtYmVyKQorCXJldHVybiBhYmJyZXY7CisgICAgICBlbHNlCisJYWJicmV2ID0gYWJicmV2LT5uZXh0OworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEluIERXQVJGIHZlcnNpb24gMiwgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMKKyAgIHN0b3JlZCBpbiBhIHNlcGFyYXRlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gIEJlZm9yZSB3ZSByZWFkIGFueQorICAgZGllcyBmcm9tIGEgc2VjdGlvbiB3ZSByZWFkIGluIGFsbCBhYmJyZXZpYXRpb25zIGFuZCBpbnN0YWxsIHRoZW0KKyAgIGluIGEgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8qKgorcmVhZF9hYmJyZXZzIChhYmZkLCBvZmZzZXQpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Cit7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqKmFiYnJldnM7CisgIGNoYXIgKmFiYnJldl9wdHI7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqY3VyX2FiYnJldjsKKyAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGFiYnJldl9uYW1lOworICB1bnNpZ25lZCBpbnQgYWJicmV2X2Zvcm0sIGhhc2hfbnVtYmVyOworICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaDsKKworICBzdGFzaCA9IGVsZl90ZGF0YShhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvOworCisgIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICptc2VjOworCisgICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfYWJicmV2Iik7CisgICAgICBpZiAoISBtc2VjKQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIpKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOworICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgPSAodW5zaWduZWQgY2hhciopIGJmZF9hbGxvYyAoYWJmZCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKTsKKyAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQorCSAgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgCisJCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIsIDAsCisJCQkJICAgICAgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKSkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKG9mZnNldCA+IHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSkKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBBYmJyZXYgb2Zmc2V0ICgldSkgYmlnZ2VyIHRoYW4gYWJicmV2IHNpemUgKCV1KS4iKSwgCisJCQkgICAgIG9mZnNldCwgc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplICk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBhYmJyZXZzID0gKHN0cnVjdCBhYmJyZXZfaW5mbyoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2Yoc3RydWN0IGFiYnJldl9pbmZvKikgKiBBQkJSRVZfSEFTSF9TSVpFKTsKKworICBhYmJyZXZfcHRyID0gc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIgKyBvZmZzZXQ7CisgIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOworICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7CisKKyAgLyogbG9vcCB1bnRpbCB3ZSByZWFjaCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAgKi8KKyAgd2hpbGUgKGFiYnJldl9udW1iZXIpCisgICAgeworICAgICAgY3VyX2FiYnJldiA9IChzdHJ1Y3QgYWJicmV2X2luZm8qKWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFiYnJldl9pbmZvKSk7CisKKyAgICAgIC8qIHJlYWQgaW4gYWJicmV2IGhlYWRlciAqLworICAgICAgY3VyX2FiYnJldi0+bnVtYmVyID0gYWJicmV2X251bWJlcjsKKyAgICAgIGN1cl9hYmJyZXYtPnRhZyA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7CisgICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBjdXJfYWJicmV2LT5oYXNfY2hpbGRyZW4gPSByZWFkXzFfYnl0ZSAoYWJmZCwgYWJicmV2X3B0cik7CisgICAgICBhYmJyZXZfcHRyICs9IDE7CisKKyAgICAgIC8qIG5vdyByZWFkIGluIGRlY2xhcmF0aW9ucyAqLworICAgICAgYWJicmV2X25hbWUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOworICAgICAgYWJicmV2X2Zvcm0gPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOworICAgICAgd2hpbGUgKGFiYnJldl9uYW1lKQorCXsKKwkgIGlmICgoY3VyX2FiYnJldi0+bnVtX2F0dHJzICUgQVRUUl9BTExPQ19DSFVOSykgPT0gMCkKKwkgICAgeworCSAgICAgIGN1cl9hYmJyZXYtPmF0dHJzID0gKHN0cnVjdCBhdHRyX2FiYnJldiAqKQorCQliZmRfcmVhbGxvYyAoY3VyX2FiYnJldi0+YXR0cnMsCisJCQkgICAgIChjdXJfYWJicmV2LT5udW1fYXR0cnMgKyBBVFRSX0FMTE9DX0NIVU5LKQorCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGF0dHJfYWJicmV2KSk7CisJICAgICAgaWYgKCEgY3VyX2FiYnJldi0+YXR0cnMpCisJCXJldHVybiAwOworCSAgICB9CisJICBjdXJfYWJicmV2LT5hdHRyc1tjdXJfYWJicmV2LT5udW1fYXR0cnNdLm5hbWUgPSBhYmJyZXZfbmFtZTsKKwkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRycysrXS5mb3JtID0gYWJicmV2X2Zvcm07CisJICBhYmJyZXZfbmFtZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7CisJICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7CisJICBhYmJyZXZfZm9ybSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7CisJICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7CisJfQorCisgICAgICBoYXNoX251bWJlciA9IGFiYnJldl9udW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOworICAgICAgY3VyX2FiYnJldi0+bmV4dCA9IGFiYnJldnNbaGFzaF9udW1iZXJdOworICAgICAgYWJicmV2c1toYXNoX251bWJlcl0gPSBjdXJfYWJicmV2OworCisgICAgICAvKiBHZXQgbmV4dCBhYmJyZXZpYXRpb24uCisgICAgICAgICBVbmRlciBJcml4NiB0aGUgYWJicmV2aWF0aW9ucyBmb3IgYSBjb21waWxhdGlvbiB1bml0IGFyZSBub3QKKwkgYWx3YXlzIHByb3Blcmx5IHRlcm1pbmF0ZWQgd2l0aCBhbiBhYmJyZXYgbnVtYmVyIG9mIDAuCisJIEV4aXQgbG9vcCBpZiB3ZSBlbmNvdW50ZXIgYW4gYWJicmV2aWF0aW9uIHdoaWNoIHdlIGhhdmUKKwkgYWxyZWFkeSByZWFkICh3aGljaCBtZWFucyB3ZSBhcmUgYWJvdXQgdG8gcmVhZCB0aGUgYWJicmV2aWF0aW9ucworCSBmb3IgdGhlIG5leHQgY29tcGlsZSB1bml0KSBvciBpZiB0aGUgZW5kIG9mIHRoZSBhYmJyZXZpYXRpb24KKwkgdGFibGUgaXMgcmVhY2hlZC4gICovCisgICAgICBpZiAoKHVuc2lnbmVkIGludCkgKGFiYnJldl9wdHIgLSBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlcikKKwkgICAgPj0gc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKQorCWJyZWFrOworICAgICAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7CisgICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBpZiAobG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcixhYmJyZXZzKSAhPSBOVUxMKQorCWJyZWFrOworICAgIH0KKworICByZXR1cm4gYWJicmV2czsKK30KKworLyogUmVhZCBhbiBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IGFuIGFiYnJldmlhdGVkIGF0dHJpYnV0ZS4gICovCisKK3N0YXRpYyBjaGFyICoKK3JlYWRfYXR0cmlidXRlIChhdHRyLCBhYmJyZXYsIHVuaXQsIGluZm9fcHRyKQorICAgICBzdHJ1Y3QgYXR0cmlidXRlICAgKmF0dHI7CisgICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYWJicmV2OworICAgICBzdHJ1Y3QgY29tcF91bml0ICAgKnVuaXQ7CisgICAgIGNoYXIgICAgICAgICAgICAgICAqaW5mb19wdHI7Cit7CisgIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7CisgIHVuc2lnbmVkIGludCBieXRlc19yZWFkOworICBzdHJ1Y3QgZHdhcmZfYmxvY2sgKmJsazsKKworICBhdHRyLT5uYW1lID0gYWJicmV2LT5uYW1lOworICBhdHRyLT5mb3JtID0gYWJicmV2LT5mb3JtOworICBzd2l0Y2ggKGFiYnJldi0+Zm9ybSkKKyAgICB7CisgICAgY2FzZSBEV19GT1JNX2FkZHI6CisgICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgorICAgICAgRFdfQUREUiAoYXR0cikgPSByZWFkX2FkZHJlc3MgKHVuaXQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IHVuaXQtPmFkZHJfc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9ibG9jazI6CisgICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKKyAgICAgIGJsay0+c2l6ZSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gMjsKKyAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7CisgICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7CisgICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgorICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7CisgICAgICBibGstPnNpemUgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDQ7CisgICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOworICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOworICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2RhdGEyOgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2RhdGE0OgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2RhdGE4OgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF84X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX3N0cmluZzoKKyAgICAgIERXX1NUUklORyAoYXR0cikgPSByZWFkX3N0cmluZyAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s6CisgICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKKyAgICAgIGJsay0+c2l6ZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7CisgICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7CisgICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgorICAgICAgYmxrID0gKHN0cnVjdCBkd2FyZl9ibG9jayAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmX2Jsb2NrKSk7CisgICAgICBibGstPnNpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gMTsKKyAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7CisgICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7CisgICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTE6CisgICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9mbGFnOgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fc2RhdGE6CisgICAgICBEV19TTkQgKGF0dHIpID0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV91ZGF0YToKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9yZWYxOgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fcmVmMjoKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9yZWY0OgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9zdHJwOgorICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDoKKyAgICBkZWZhdWx0OgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogSW52YWxpZCBvciB1bmhhbmRsZWQgRk9STSB2YWx1ZTogJWQuIiksCisJCQkgICAgIGFiYnJldi0+Zm9ybSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICB9CisgIHJldHVybiBpbmZvX3B0cjsKK30KKworCisvKiBTb3VyY2UgbGluZSBpbmZvcm1hdGlvbiB0YWJsZSByb3V0aW5lcy4gKi8KKworI2RlZmluZSBGSUxFX0FMTE9DX0NIVU5LIDUKKyNkZWZpbmUgRElSX0FMTE9DX0NIVU5LIDUKKworc3RydWN0IGxpbmVfaW5mbyB7CisgIHN0cnVjdCBsaW5lX2luZm8qIHByZXZfbGluZTsKKworICBiZmRfdm1hIGFkZHJlc3M7CisgIGNoYXIqIGZpbGVuYW1lOworICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgdW5zaWduZWQgaW50IGNvbHVtbjsKK307CisKK3N0cnVjdCBmaWxlaW5mbyB7CisgIGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGludCBkaXI7CisgIHVuc2lnbmVkIGludCB0aW1lOworICB1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKK3N0cnVjdCBsaW5lX2luZm9fdGFibGUgeworICBiZmQqIGFiZmQ7CisKKyAgdW5zaWduZWQgaW50IG51bV9maWxlczsKKyAgdW5zaWduZWQgaW50IG51bV9kaXJzOworCisgIGNoYXIqIGNvbXBfZGlyOworICBjaGFyKiogZGlyczsKKyAgc3RydWN0IGZpbGVpbmZvKiBmaWxlczsKKyAgc3RydWN0IGxpbmVfaW5mbyogbGFzdF9saW5lOworfTsKKworc3RhdGljIHZvaWQgCithZGRfbGluZV9pbmZvICh0YWJsZSwgYWRkcmVzcywgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbikKKyAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7CisgICAgIGJmZF92bWEgYWRkcmVzczsKKyAgICAgY2hhciogZmlsZW5hbWU7CisgICAgIHVuc2lnbmVkIGludCBsaW5lOworICAgICB1bnNpZ25lZCBpbnQgY29sdW1uOworeworICBzdHJ1Y3QgbGluZV9pbmZvKiBpbmZvID0gKHN0cnVjdCBsaW5lX2luZm8qKQorICAgIGJmZF9hbGxvYyAodGFibGUtPmFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mbykpOworCisgIGluZm8tPnByZXZfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7CisgIHRhYmxlLT5sYXN0X2xpbmUgPSBpbmZvOworCisgIGluZm8tPmFkZHJlc3MgPSBhZGRyZXNzOworICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOworICBpbmZvLT5saW5lID0gbGluZTsKKyAgaW5mby0+Y29sdW1uID0gY29sdW1uOworfQorCitzdGF0aWMgY2hhciogCitjb25jYXRfZmlsZW5hbWUgKHRhYmxlLCBmaWxlKQorICAgICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKKyAgICAgdW5zaWduZWQgaW50IGZpbGU7Cit7CisgIGNoYXIqIGZpbGVuYW1lID0gdGFibGUtPmZpbGVzW2ZpbGUgLSAxXS5uYW1lOworICBpZiAoKmZpbGVuYW1lID09ICcvJykKKyAgICByZXR1cm4gZmlsZW5hbWU7CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIqIGRpcm5hbWUgPSAodGFibGUtPmZpbGVzW2ZpbGUgLSAxXS5kaXIKKwkJICAgICAgID8gdGFibGUtPmRpcnNbdGFibGUtPmZpbGVzW2ZpbGUgLSAxXS5kaXIgLSAxXQorCQkgICAgICAgOiB0YWJsZS0+Y29tcF9kaXIpOworICAgICAgcmV0dXJuIChjaGFyKikgY29uY2F0IChkaXJuYW1lLCAiLyIsIGZpbGVuYW1lLCBOVUxMKTsKKyAgICB9Cit9CisKKy8qIERlY29kZSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIFVOSVQuICovCisKK3N0YXRpYyBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKgorZGVjb2RlX2xpbmVfaW5mbyAodW5pdCkKKyAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKK3sKKyAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKKworICBzdGF0aWMgY2hhciogZHdhcmZfbGluZV9idWZmZXIgPSAwOworCisgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOworCisgIGNoYXIgKmxpbmVfcHRyOworICBjaGFyICpsaW5lX2VuZDsKKyAgc3RydWN0IGxpbmVfaGVhZCBsaDsKKyAgdW5zaWduZWQgaW50IGksIGJ5dGVzX3JlYWQ7CisgIGNoYXIgKmN1cl9maWxlLCAqY3VyX2RpcjsKKyAgdW5zaWduZWQgY2hhciBvcF9jb2RlLCBleHRlbmRlZF9vcCwgYWRqX29wY29kZTsKKworICBpZiAoISBkd2FyZl9saW5lX2J1ZmZlcikKKyAgICB7CisgICAgICBhc2VjdGlvbiAqbXNlYzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKworICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnX2xpbmUiKTsKKyAgICAgIGlmICghIG1zZWMpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfbGluZSBzZWN0aW9uLiIpKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChtc2VjKTsKKyAgICAgIGR3YXJmX2xpbmVfYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOworICAgICAgaWYgKCEgZHdhcmZfbGluZV9idWZmZXIpCisJcmV0dXJuIDA7CisKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgCisJCQkJICAgICAgZHdhcmZfbGluZV9idWZmZXIsIDAsCisJCQkJICAgICAgc2l6ZSkpCisJcmV0dXJuIDA7CisKKyAgICAgIC8qIEZJWE1FOiBXZSBvdWdodCB0byBhcHBseSB0aGUgcmVsb2NzIGFnYWluc3QgdGhpcyBzZWN0aW9uIGJlZm9yZQorCSB3ZSBwcm9jZXNzIGl0Li4uLiAqLworICAgIH0KKworICB0YWJsZSA9IChzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKikgYmZkX2FsbG9jIChhYmZkLCAKKwkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mb190YWJsZSkpOworICB0YWJsZS0+YWJmZCA9IGFiZmQ7CisgIHRhYmxlLT5jb21wX2RpciA9IHVuaXQtPmNvbXBfZGlyOworCisgIHRhYmxlLT5udW1fZmlsZXMgPSAwOworICB0YWJsZS0+ZmlsZXMgPSBOVUxMOworCisgIHRhYmxlLT5udW1fZGlycyA9IDA7CisgIHRhYmxlLT5kaXJzID0gTlVMTDsKKworICBsaW5lX3B0ciA9IGR3YXJmX2xpbmVfYnVmZmVyICsgdW5pdC0+bGluZV9vZmZzZXQ7CisKKyAgLyogcmVhZCBpbiB0aGUgcHJvbG9ndWUgKi8KKyAgbGgudG90YWxfbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDQ7CisgIGxpbmVfZW5kID0gbGluZV9wdHIgKyBsaC50b3RhbF9sZW5ndGg7CisgIGxoLnZlcnNpb24gPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGxpbmVfcHRyKTsKKyAgbGluZV9wdHIgKz0gMjsKKyAgbGgucHJvbG9ndWVfbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDQ7CisgIGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKKyAgbGluZV9wdHIgKz0gMTsKKyAgbGguZGVmYXVsdF9pc19zdG10ID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKKyAgbGluZV9wdHIgKz0gMTsKKyAgbGgubGluZV9iYXNlID0gcmVhZF8xX3NpZ25lZF9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDE7CisgIGxoLmxpbmVfcmFuZ2UgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOworICBsaW5lX3B0ciArPSAxOworICBsaC5vcGNvZGVfYmFzZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDE7CisgIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzID0gKHVuc2lnbmVkIGNoYXIgKikKKyAgICBiZmRfYWxsb2MgKGFiZmQsIGxoLm9wY29kZV9iYXNlICogc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7CisKKyAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbMF0gPSAxOworICBmb3IgKGkgPSAxOyBpIDwgbGgub3Bjb2RlX2Jhc2U7ICsraSkKKyAgICB7CisgICAgICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3Roc1tpXSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisgICAgICBsaW5lX3B0ciArPSAxOworICAgIH0KKworICAvKiBSZWFkIGRpcmVjdG9yeSB0YWJsZSAgKi8KKyAgd2hpbGUgKChjdXJfZGlyID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCkpICE9IE5VTEwpCisgICAgeworICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGlmICgodGFibGUtPm51bV9kaXJzICUgRElSX0FMTE9DX0NIVU5LKSA9PSAwKQorCXsKKwkgIHRhYmxlLT5kaXJzID0gKGNoYXIgKiopCisJICAgIGJmZF9yZWFsbG9jICh0YWJsZS0+ZGlycywKKwkJCSAodGFibGUtPm51bV9kaXJzICsgRElSX0FMTE9DX0NIVU5LKSAqIHNpemVvZiAoY2hhciAqKSk7CisJICBpZiAoISB0YWJsZS0+ZGlycykKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICAgdGFibGUtPmRpcnNbdGFibGUtPm51bV9kaXJzKytdID0gY3VyX2RpcjsKKyAgICB9CisgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisKKyAgLyogUmVhZCBmaWxlIG5hbWUgdGFibGUgKi8KKyAgd2hpbGUgKChjdXJfZmlsZSA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBpZiAoKHRhYmxlLT5udW1fZmlsZXMgJSBGSUxFX0FMTE9DX0NIVU5LKSA9PSAwKQorCXsKKwkgIHRhYmxlLT5maWxlcyA9IChzdHJ1Y3QgZmlsZWluZm8gKikKKwkgICAgYmZkX3JlYWxsb2MgKHRhYmxlLT5maWxlcywKKwkJCSAodGFibGUtPm51bV9maWxlcyArIEZJTEVfQUxMT0NfQ0hVTkspCisJCQkgKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOworCSAgaWYgKCEgdGFibGUtPmZpbGVzKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10ubmFtZSA9IGN1cl9maWxlOworICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLmRpciA9CisJcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnRpbWUgPQorCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5zaXplID0KKwlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICB0YWJsZS0+bnVtX2ZpbGVzKys7CisgICAgfQorICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworCisgIC8qIFJlYWQgdGhlIHN0YXRlbWVudCBzZXF1ZW5jZXMgdW50aWwgdGhlcmUncyBub3RoaW5nIGxlZnQuICAqLworICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKKyAgICB7CisgICAgICAvKiBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAgKi8KKyAgICAgIGJmZF92bWEgYWRkcmVzcyA9IDA7CisgICAgICBjaGFyKiBmaWxlbmFtZSA9IGNvbmNhdF9maWxlbmFtZSAodGFibGUsIDEpOworICAgICAgdW5zaWduZWQgaW50IGxpbmUgPSAxOworICAgICAgdW5zaWduZWQgaW50IGNvbHVtbiA9IDA7CisgICAgICBpbnQgaXNfc3RtdCA9IGxoLmRlZmF1bHRfaXNfc3RtdDsKKyAgICAgIGludCBiYXNpY19ibG9jayA9IDA7CisgICAgICBpbnQgZW5kX3NlcXVlbmNlID0gMDsKKworICAgICAgLyogRGVjb2RlIHRoZSB0YWJsZS4gKi8KKyAgICAgIHdoaWxlICghIGVuZF9zZXF1ZW5jZSkKKwl7CisJICBvcF9jb2RlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKKwkgIGxpbmVfcHRyICs9IDE7CisJICBzd2l0Y2ggKG9wX2NvZGUpCisJICAgIHsKKwkgICAgY2FzZSBEV19MTlNfZXh0ZW5kZWRfb3A6CisJICAgICAgbGluZV9wdHIgKz0gMTsJLyogaWdub3JlIGxlbmd0aCAqLworCSAgICAgIGV4dGVuZGVkX29wID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKKwkgICAgICBsaW5lX3B0ciArPSAxOworCSAgICAgIHN3aXRjaCAoZXh0ZW5kZWRfb3ApCisJCXsKKwkJY2FzZSBEV19MTkVfZW5kX3NlcXVlbmNlOgorCQkgIGVuZF9zZXF1ZW5jZSA9IDE7CisJCSAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4pOworCQkgIGJyZWFrOworCQljYXNlIERXX0xORV9zZXRfYWRkcmVzczoKKwkJICBhZGRyZXNzID0gcmVhZF9hZGRyZXNzICh1bml0LCBsaW5lX3B0cik7CisJCSAgbGluZV9wdHIgKz0gdW5pdC0+YWRkcl9zaXplOworCQkgIGJyZWFrOworCQljYXNlIERXX0xORV9kZWZpbmVfZmlsZToKKwkJICBjdXJfZmlsZSA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisJCSAgaWYgKCh0YWJsZS0+bnVtX2ZpbGVzICUgRklMRV9BTExPQ19DSFVOSykgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgdGFibGUtPmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQorCQkJYmZkX3JlYWxsb2MgKHRhYmxlLT5maWxlcywKKwkJCQkgICAgICh0YWJsZS0+bnVtX2ZpbGVzICsgRklMRV9BTExPQ19DSFVOSykKKwkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKKwkJICAgICAgaWYgKCEgdGFibGUtPmZpbGVzKQorCQkJcmV0dXJuIDA7CisJCSAgICB9CisJCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLm5hbWUgPSBjdXJfZmlsZTsKKwkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uZGlyID0KKwkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisJCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnRpbWUgPQorCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkJICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uc2l6ZSA9CisJCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKKwkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworCQkgIHRhYmxlLT5udW1fZmlsZXMrKzsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBtYW5nbGVkIGxpbmUgbnVtYmVyIHNlY3Rpb24uIikpOworCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkgIHJldHVybiAwOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfTE5TX2NvcHk6CisJICAgICAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4pOworCSAgICAgIGJhc2ljX2Jsb2NrID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKKwkgICAgICBhZGRyZXNzICs9IGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoCisJCSogcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgorCSAgICAgIGxpbmUgKz0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfTE5TX3NldF9maWxlOgorCSAgICAgIHsKKwkJdW5zaWduZWQgaW50IGZpbGU7CisKKwkJLyogVGhlIGZpbGUgYW5kIGRpcmVjdG9yeSB0YWJsZXMgYXJlIDAgYmFzZWQsIHRoZSByZWZlcmVuY2VzCisJCSAgIGFyZSAxIGJhc2VkLiAgKi8KKwkJZmlsZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworCQlsaW5lX3B0ciArPSBieXRlc19yZWFkOworCQlmaWxlbmFtZSA9IGNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46CisJICAgICAgY29sdW1uID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6CisJICAgICAgaXNfc3RtdCA9ICghaXNfc3RtdCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKKwkgICAgICBiYXNpY19ibG9jayA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKKwkgICAgICBhZGRyZXNzICs9ICgyNTUgLSBsaC5vcGNvZGVfYmFzZSkgLyBsaC5saW5lX3JhbmdlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgorCSAgICAgIGFkZHJlc3MgKz0gcmVhZF8yX2J5dGVzIChhYmZkLCBsaW5lX3B0cik7CisJICAgICAgbGluZV9wdHIgKz0gMjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoJCS8qIHNwZWNpYWwgb3BlcmFuZCAqLworCSAgICAgIGFkal9vcGNvZGUgPSBvcF9jb2RlIC0gbGgub3Bjb2RlX2Jhc2U7CisJICAgICAgYWRkcmVzcyArPSAoYWRqX29wY29kZSAvIGxoLmxpbmVfcmFuZ2UpCisJCSogbGgubWluaW11bV9pbnN0cnVjdGlvbl9sZW5ndGg7CisJICAgICAgbGluZSArPSBsaC5saW5lX2Jhc2UgKyAoYWRqX29wY29kZSAlIGxoLmxpbmVfcmFuZ2UpOworCSAgICAgIC8qIGFwcGVuZCByb3cgdG8gbWF0cml4IHVzaW5nIGN1cnJlbnQgdmFsdWVzICovCisJICAgICAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4pOworCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRhYmxlOworfQorCisKKy8qIElmIEFERFIgaXMgd2l0aGluIFRBQkxFIHNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgYW5kIHJldHVybiB0cnVlLAorICAgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFRoZSBvdXRwdXQgcGFyYW1ldGVycywgRklMRU5BTUVfUFRSIGFuZAorICAgTElORU5VTUJFUl9QVFIsIGFyZSBwb2ludGVycyB0byB0aGUgb2JqZWN0cyB0byBiZSBmaWxsZWQgaW4uICovCisKK3N0YXRpYyBib29sZWFuCitsb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUgKHRhYmxlLCAKKwkJCQkgICBhZGRyLAorCQkJCSAgIGZpbGVuYW1lX3B0ciwgCisJCQkJICAgbGluZW51bWJlcl9wdHIpCisgICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOworICAgICBiZmRfdm1hIGFkZHI7CisgICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7CisgICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Cit7CisgIHN0cnVjdCBsaW5lX2luZm8qIGVhY2hfbGluZTsKKyAgc3RydWN0IGxpbmVfaW5mbyogbmV4dF9saW5lOworICAKKyAgZm9yIChuZXh0X2xpbmUgPSAwLCBlYWNoX2xpbmUgPSB0YWJsZS0+bGFzdF9saW5lOworICAgICAgIGVhY2hfbGluZTsKKyAgICAgICBuZXh0X2xpbmUgPSBlYWNoX2xpbmUsIGVhY2hfbGluZSA9IGVhY2hfbGluZS0+cHJldl9saW5lKQorICAgIHsKKyAgICAgIGlmIChhZGRyID49IGVhY2hfbGluZS0+YWRkcmVzcworCSAgJiYgKG5leHRfbGluZSA9PSAwCisJICAgICAgfHwgYWRkciA8IG5leHRfbGluZS0+YWRkcmVzcykpIAorCXsKKwkgICpmaWxlbmFtZV9wdHIgPSBlYWNoX2xpbmUtPmZpbGVuYW1lOworCSAgKmxpbmVudW1iZXJfcHRyID0gZWFjaF9saW5lLT5saW5lOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKyAgCisKKworCisvKiBGdW5jdGlvbiB0YWJsZSBmdW5jdGlvbnMuICovCisKK3N0cnVjdCBmdW5jaW5mbyB7CisgIHN0cnVjdCBmdW5jaW5mbyAqcHJldl9mdW5jOworCisgIGNoYXIqIG5hbWU7CisgIGJmZF92bWEgbG93OworICBiZmRfdm1hIGhpZ2g7Cit9OworCisKKy8qIElmIEFERFIgaXMgd2l0aGluIFRBQkxFLCBzZXQgRlVOQ1RJT05OQU1FX1BUUiwgYW5kIHJldHVybiB0cnVlLiAqLworCitzdGF0aWMgYm9vbGVhbgorbG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUgKHRhYmxlLCAKKwkJCQkgIGFkZHIsCisJCQkJICBmdW5jdGlvbm5hbWVfcHRyKQorICAgICBzdHJ1Y3QgZnVuY2luZm8qIHRhYmxlOworICAgICBiZmRfdm1hIGFkZHI7CisgICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOworeworICBzdHJ1Y3QgZnVuY2luZm8qIGVhY2hfZnVuYzsKKworICBmb3IgKGVhY2hfZnVuYyA9IHRhYmxlOworICAgICAgIGVhY2hfZnVuYzsKKyAgICAgICBlYWNoX2Z1bmMgPSBlYWNoX2Z1bmMtPnByZXZfZnVuYykKKyAgICB7CisgICAgICBpZiAoYWRkciA+PSBlYWNoX2Z1bmMtPmxvdyAmJiBhZGRyIDwgZWFjaF9mdW5jLT5oaWdoKQorCXsKKwkgICpmdW5jdGlvbm5hbWVfcHRyID0gZWFjaF9mdW5jLT5uYW1lOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH0KKyAgCisgIHJldHVybiBmYWxzZTsKK30KKworCisKKworLyogRFdBUkYyIENvbXBpbGF0aW9uIHVuaXQgZnVuY3Rpb25zLiAqLworCisKKy8qIFNjYW4gb3ZlciBlYWNoIGRpZSBpbiBhIGNvbXAuIHVuaXQgbG9va2luZyBmb3IgZnVuY3Rpb25zIHRvIGFkZAorICAgdG8gdGhlIGZ1bmN0aW9uIHRhYmxlLiAqLworCitzdGF0aWMgYm9vbGVhbgorc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMgKHVuaXQpCisgICAgIHN0cnVjdCBjb21wX3VuaXQgKnVuaXQ7Cit7CisgIGJmZCAqYWJmZCA9IHVuaXQtPmFiZmQ7CisgIGNoYXIgKmluZm9fcHRyID0gdW5pdC0+Zmlyc3RfY2hpbGRfZGllX3B0cjsKKyAgaW50IG5lc3RpbmdfbGV2ZWwgPSAxOworCisgIHdoaWxlIChuZXN0aW5nX2xldmVsKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBpOworICAgICAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7CisgICAgICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisgICAgICBzdHJ1Y3QgZnVuY2luZm8gKmZ1bmM7CisgICAgICBjaGFyKiBuYW1lID0gMDsKKworICAgICAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKKworICAgICAgaWYgKCEgYWJicmV2X251bWJlcikKKwl7CisJICBuZXN0aW5nX2xldmVsLS07CisJICBjb250aW51ZTsKKwl9CisgICAgICAKKyAgICAgIGFiYnJldiA9IGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsdW5pdC0+YWJicmV2cyk7CisgICAgICBpZiAoISBhYmJyZXYpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iKSwgCisJCQkgICAgIGFiYnJldl9udW1iZXIpOworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgCisgICAgICBpZiAoYWJicmV2LT50YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCisJeworCSAgZnVuYyA9IChzdHJ1Y3QgZnVuY2luZm8qKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBmdW5jaW5mbykpOworCSAgZnVuYy0+cHJldl9mdW5jID0gdW5pdC0+ZnVuY3Rpb25fdGFibGU7CisJICB1bml0LT5mdW5jdGlvbl90YWJsZSA9IGZ1bmM7CisJfQorICAgICAgZWxzZQorCWZ1bmMgPSBOVUxMOworICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmJyZXYtPm51bV9hdHRyczsgKytpKQorCXsKKwkgIGluZm9fcHRyID0gcmVhZF9hdHRyaWJ1dGUgKCZhdHRyLCAmYWJicmV2LT5hdHRyc1tpXSwgdW5pdCwgaW5mb19wdHIpOworCSAgCisJICBpZiAoZnVuYykKKwkgICAgeworCSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQorCQl7CisJCWNhc2UgRFdfQVRfbmFtZToKKwkJICAKKwkJICBuYW1lID0gRFdfU1RSSU5HICgmYXR0cik7CisKKwkJICAvKiBQcmVmZXIgRFdfQVRfTUlQU19saW5rYWdlX25hbWUgb3ZlciBEV19BVF9uYW1lLiAgKi8KKwkJICBpZiAoZnVuYy0+bmFtZSA9PSBOVUxMKQorCQkgICAgZnVuYy0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOworCQkgIGJyZWFrOworCQkgIAorCQljYXNlIERXX0FUX01JUFNfbGlua2FnZV9uYW1lOgorCQkgIGZ1bmMtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKKwkJICBicmVhazsKKworCQljYXNlIERXX0FUX2xvd19wYzoKKwkJICBmdW5jLT5sb3cgPSBEV19BRERSICgmYXR0cik7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBEV19BVF9oaWdoX3BjOgorCQkgIGZ1bmMtPmhpZ2ggPSBEV19BRERSICgmYXR0cik7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKKwkJeworCQljYXNlIERXX0FUX25hbWU6CisJCSAgbmFtZSA9IERXX1NUUklORyAoJmF0dHIpOworCQkgIGJyZWFrOworCQkgIAorCQlkZWZhdWx0OgorCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChhYmJyZXYtPmhhc19jaGlsZHJlbikKKwluZXN0aW5nX2xldmVsKys7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKworCisKKworLyogUGFyc2UgYSBEV0FSRjIgY29tcGlsYXRpb24gdW5pdCBzdGFydGluZyBhdCBJTkZPX1BUUi4gIFRoaXMgaW5jbHVkZXMKKyAgIHRoZSBjb21waWxhdGlvbiB1bml0IGhlYWRlciB0aGF0IHByb2NlZWRzIHRoZSBESUUncywgYnV0IGRvZXMgbm90CisgICBpbmNsdWRlIHRoZSBsZW5ndGggZmllbGQgdGhhdCBwcmVjZWVkcyBlYWNoIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLgorICAgRU5EX1BUUiBwb2ludHMgb25lIHBhc3QgdGhlIGVuZCBvZiB0aGlzIGNvbXAgdW5pdC4KKworICAgVGhpcyByb3V0aW5lIGRvZXMgbm90IHJlYWQgdGhlIHdob2xlIGNvbXBpbGF0aW9uIHVuaXQ7IG9ubHkgZW5vdWdoCisgICB0byBnZXQgdG8gdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY29tcF91bml0ICoKK3BhcnNlX2NvbXBfdW5pdCAoYWJmZCwgaW5mb19wdHIsIGVuZF9wdHIpCisgICAgIGJmZCogYWJmZDsKKyAgICAgY2hhciogaW5mb19wdHI7CisgICAgIGNoYXIqIGVuZF9wdHI7Cit7CisgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7CisKKyAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKKyAgdW5zaWduZWQgaW50IGFiYnJldl9vZmZzZXQ7CisgIHVuc2lnbmVkIGNoYXIgYWRkcl9zaXplOworICBzdHJ1Y3QgYWJicmV2X2luZm8qKiBhYmJyZXZzOworCisgIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBpOworICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKKyAgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCisgIHZlcnNpb24gPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKKyAgaW5mb19wdHIgKz0gMjsKKyAgYWJicmV2X29mZnNldCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICBpbmZvX3B0ciArPSA0OworICBhZGRyX3NpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOworICBpbmZvX3B0ciArPSAxOworCisgIGlmICh2ZXJzaW9uICE9IDIpCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogZm91bmQgZHdhcmYgdmVyc2lvbiAnJWh1JywgdGhpcyByZWFkZXIgb25seSBoYW5kbGVzIHZlcnNpb24gMiBpbmZvcm1hdGlvbi4iKSwgdmVyc2lvbiApOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGFkZHJfc2l6ZSA+IHNpemVvZiAoYmZkX3ZtYSkpCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogZm91bmQgYWRkcmVzcyBzaXplICcldScsIHRoaXMgcmVhZGVyIGNhbiBub3QgaGFuZGxlIHNpemVzIGdyZWF0ZXIgdGhhbiAnJXUnLiIpLAorCQkJIGFkZHJfc2l6ZSwKKwkJCSBzaXplb2YgKGJmZF92bWEpKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChhZGRyX3NpemUgIT0gNCAmJiBhZGRyX3NpemUgIT0gOCkKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJEd2FyZiBFcnJvcjogZm91bmQgYWRkcmVzcyBzaXplICcldScsIHRoaXMgcmVhZGVyIGNhbiBvbmx5IGhhbmRsZSBhZGRyZXNzIHNpemVzICc0JyBhbmQgJzgnLiIsIGFkZHJfc2l6ZSApOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogUmVhZCB0aGUgYWJicmV2cyBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0IGludG8gYSB0YWJsZSAqLworICBhYmJyZXZzID0gcmVhZF9hYmJyZXZzIChhYmZkLCBhYmJyZXZfb2Zmc2V0KTsKKyAgaWYgKCEgYWJicmV2cykKKyAgICAgIHJldHVybiAwOworCisgIGFiYnJldl9udW1iZXIgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKKyAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgaWYgKCEgYWJicmV2X251bWJlcikKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBCYWQgYWJicmV2IG51bWJlcjogJWQuIiksCisJCQkgYWJicmV2X251bWJlcik7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBhYmJyZXYgPSBsb29rdXBfYWJicmV2IChhYmJyZXZfbnVtYmVyLCBhYmJyZXZzKTsKKyAgaWYgKCEgYWJicmV2KQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIiksCisJCQkgYWJicmV2X251bWJlcik7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIHVuaXQgPSAoc3RydWN0IGNvbXBfdW5pdCopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvbXBfdW5pdCkpOworICB1bml0LT5hYmZkID0gYWJmZDsKKyAgdW5pdC0+YWRkcl9zaXplID0gYWRkcl9zaXplOyAKKyAgdW5pdC0+YWJicmV2cyA9IGFiYnJldnM7CisgIHVuaXQtPmVuZF9wdHIgPSBlbmRfcHRyOworCisgIGZvciAoaSA9IDA7IGkgPCBhYmJyZXYtPm51bV9hdHRyczsgKytpKQorICAgIHsKKyAgICAgIGluZm9fcHRyID0gcmVhZF9hdHRyaWJ1dGUgKCZhdHRyLCAmYWJicmV2LT5hdHRyc1tpXSwgdW5pdCwgaW5mb19wdHIpOworCisgICAgICAvKiBTdG9yZSB0aGUgZGF0YSBpZiBpdCBpcyBvZiBhbiBhdHRyaWJ1dGUgd2Ugd2FudCB0byBrZWVwIGluIGEKKwkgcGFydGlhbCBzeW1ib2wgdGFibGUuICAqLworICAgICAgc3dpdGNoIChhdHRyLm5hbWUpCisJeworCWNhc2UgRFdfQVRfc3RtdF9saXN0OgorCSAgdW5pdC0+c3RtdGxpc3QgPSAxOworCSAgdW5pdC0+bGluZV9vZmZzZXQgPSBEV19VTlNORCAoJmF0dHIpOworCSAgYnJlYWs7CisKKwljYXNlIERXX0FUX25hbWU6CisJICB1bml0LT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7CisJICBicmVhazsKKworCWNhc2UgRFdfQVRfbG93X3BjOgorCSAgdW5pdC0+bG93ID0gRFdfQUREUiAoJmF0dHIpOworCSAgYnJlYWs7CisKKwljYXNlIERXX0FUX2hpZ2hfcGM6CisJICB1bml0LT5oaWdoID0gRFdfQUREUiAoJmF0dHIpOworCSAgYnJlYWs7CisKKwljYXNlIERXX0FUX2NvbXBfZGlyOgorCSAgeworCSAgICBjaGFyKiBjb21wX2RpciA9IERXX1NUUklORyAoJmF0dHIpOworCSAgICBpZiAoY29tcF9kaXIpCisJICAgICAgeworCQkvKiBJcml4IDYuMiBuYXRpdmUgY2MgcHJlcGVuZHMgPG1hY2hpbmU+LjogdG8gdGhlIGNvbXBpbGF0aW9uCisJCSAgIGRpcmVjdG9yeSwgZ2V0IHJpZCBvZiBpdC4gICovCisJCWNoYXIgKmNwID0gKGNoYXIqKSBzdHJjaHIgKGNvbXBfZGlyLCAnOicpOworCisJCWlmIChjcCAmJiBjcCAhPSBjb21wX2RpciAmJiBjcFstMV0gPT0gJy4nICYmIGNwWzFdID09ICcvJykKKwkJICBjb21wX2RpciA9IGNwICsgMTsKKwkgICAgICB9CisJICAgIHVuaXQtPmNvbXBfZGlyID0gY29tcF9kaXI7CisJICAgIGJyZWFrOworCSAgfQorCisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgdW5pdC0+Zmlyc3RfY2hpbGRfZGllX3B0ciA9IGluZm9fcHRyOworICByZXR1cm4gdW5pdDsKK30KKworCisKKworCisvKiBSZXR1cm4gdHJ1ZSBpZiBVTklUIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGdpdmVuIGJ5IEFERFIuICovCisKK3N0YXRpYyBib29sZWFuCitjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAodW5pdCwgYWRkcikKKyAgICAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICByZXR1cm4gISB1bml0LT5lcnJvcgorICAgICYmIChhZGRyID49IHVuaXQtPmxvdyAmJiBhZGRyIDw9IHVuaXQtPmhpZ2gpOworfQorCisKKy8qIElmIFVOSVQgY29udGFpbnMgQUREUiwgc2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyB0byB0aGUgdmFsdWVzIGZvcgorICAgdGhlIGxpbmUgY29udGFpbmluZyBBRERSLiAgVGhlIG91dHB1dCBwYXJhbWV0ZXJzLCBGSUxFTkFNRV9QVFIsCisgICBGVU5DVElPTk5BTUVfUFRSLCBhbmQgTElORU5VTUJFUl9QVFIsIGFyZSBwb2ludGVycyB0byB0aGUgb2JqZWN0cworICAgdG8gYmUgZmlsbGVkIGluLiAgCisKKyAgIFJldHVybiB0cnVlIG9mIFVOSVQgY29udGFpbnMgQUREUiwgYW5kIG5vIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkOworICAgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZSAodW5pdCwgYWRkciwKKwkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lbnVtYmVyX3B0cikKKyAgICAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKK3sKKyAgYm9vbGVhbiBsaW5lX3A7CisgIGJvb2xlYW4gZnVuY19wOworICAKKyAgaWYgKHVuaXQtPmVycm9yKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISB1bml0LT5saW5lX3RhYmxlKQorICAgIHsKKyAgICAgIGlmICghIHVuaXQtPnN0bXRsaXN0KQorCXsKKwkgIHVuaXQtPmVycm9yID0gMTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgIAorICAgICAgdW5pdC0+bGluZV90YWJsZSA9IGRlY29kZV9saW5lX2luZm8gKHVuaXQpOworCisgICAgICBpZiAoISB1bml0LT5saW5lX3RhYmxlKQorCXsKKwkgIHVuaXQtPmVycm9yID0gMTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICAKKyAgICAgIGlmICghIHNjYW5fdW5pdF9mb3JfZnVuY3Rpb25zICh1bml0KSkKKwl7CisJICB1bml0LT5lcnJvciA9IDE7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICBsaW5lX3AgPSBsb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUgKHVuaXQtPmxpbmVfdGFibGUsCisJCQkJCSAgICAgIGFkZHIsCisJCQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgCisJCQkJCSAgICAgIGxpbmVudW1iZXJfcHRyKTsKKyAgZnVuY19wID0gbG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUgKHVuaXQtPmZ1bmN0aW9uX3RhYmxlLCAKKwkJCQkJICAgICBhZGRyLAorCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIpOworICByZXR1cm4gbGluZV9wIHx8IGZ1bmNfcDsKK30KKworLyogVGhlIERXQVJGMiB2ZXJzaW9uIG9mIGZpbmRfbmVhcmVzdCBsaW5lLgorICAgUmV0dXJuIHRydWUgaWYgdGhlIGxpbmUgaXMgZm91bmQgd2l0aG91dCBlcnJvci4gKi8KKworYm9vbGVhbgorX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKKwkJCSAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lbnVtYmVyX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKK3sKKyAgLyogUmVhZCBlYWNoIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSB0aGUgc2VjdGlvbiAuZGVidWdfaW5mbywgYW5kIGNoZWNrCisgICAgIHRvIHNlZSBpZiBpdCBjb250YWlucyB0aGUgYWRkcmVzcyB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIElmIHllcywKKyAgICAgbG9va3VwIHRoZSBhZGRyZXNzLCBhbmQgcmV0dXJuIHRoZSBsaW5lIG51bWJlciBpbmZvLiAgSWYgbm8sIGdvCisgICAgIG9uIHRvIHRoZSBuZXh0IGNvbXBpbGF0aW9uIHVuaXQuICAKKworICAgICBXZSBrZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHByZXZpb3VzbHkgcmVhZCBjb21waWxhdGlvbiB1bml0cywgYW5kCisgICAgIGEgcG9pbnRlciB0byB0aGUgbmV4dCB1bi1yZWFkIGNvbXBpbGF0aW9uIHVuaXQuICBDaGVjayB0aGUgCisgICAgIHByZXZpb3VzbHkgcmVhZCB1bml0cyBiZWZvcmUgcmVhZGluZyBtb3JlLgorICAgICAqLworCisgIHN0cnVjdCBkd2FyZjJfZGVidWcgKnN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYyX2ZpbmRfbGluZV9pbmZvOworCisgIC8qIFdoYXQgYWRkcmVzcyBhcmUgd2UgbG9va2luZyBmb3I/ICovCisgIGJmZF92bWEgYWRkciA9IG9mZnNldCArIHNlY3Rpb24tPnZtYTsKKworICBzdHJ1Y3QgY29tcF91bml0KiBlYWNoOworICAKKyAgKmZpbGVuYW1lX3B0ciA9IE5VTEw7CisgICpmdW5jdGlvbm5hbWVfcHRyID0gTlVMTDsKKyAgKmxpbmVudW1iZXJfcHRyID0gMDsKKworICBpZiAoISBzdGFzaCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqbXNlYzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICAgIAorICAgICAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm8gPQorCShzdHJ1Y3QgZHdhcmYyX2RlYnVnKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYyX2RlYnVnKSk7CisgICAgICAKKyAgICAgIGlmICghIHN0YXNoKQorCXJldHVybiBmYWxzZTsKKyAgICAgIAorICAgICAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnX2luZm8iKTsKKyAgICAgIGlmICghIG1zZWMpCisJeworCSAgLyogTm8gZHdhcmYyIGluZm8uICBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgc3Rhc2gKKwkgICAgIGhhcyBiZWVuIGFsbG9jYXRlZCwgYnV0IGNvbnRhaW5zIHplcm9zLCB0aGlzIGxldHMKKwkgICAgIGZ1dHVyZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGZhaWwgcXVpY2tlci4gKi8KKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOworICAgICAgaWYgKHNpemUgPT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICAKKyAgICAgIHN0YXNoLT5pbmZvX3B0ciA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CisgICAgICAKKyAgICAgIGlmICghIHN0YXNoLT5pbmZvX3B0cikKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbXNlYywgc3Rhc2gtPmluZm9fcHRyLCAwLCBzaXplKSkKKwl7CisJICBzdGFzaC0+aW5mb19wdHIgPSAwOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgc3Rhc2gtPmluZm9fcHRyX2VuZCA9IHN0YXNoLT5pbmZvX3B0ciArIHNpemU7CisKKyAgICAgIC8qIEZJWE1FOiAgVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgorCSBUaGUgJ2xvdycgYW5kICdoaWdoJyBhZGRyZXNzZXMgb2YgdGhlIGNvbXBfdW5pdHMgYXJlIGNvbXB1dGVkIGJ5IHJlbG9jcworCSBhZ2FpbnN0IHN5bWJvbHMgaW4gdGhlIC50ZXh0IHNlZ21lbnQuICBXZSBuZWVkIHRoZXNlIGFkZHJlc3NlcyBpbgorCSBvcmRlciB0byBkZXRlcm1pbmUgdGhlIG5lYXJlc3QgbGluZSBudW1iZXIsIGFuZCBzbyB3ZSBoYXZlIHRvIHJlc29sdmUKKwkgdGhlIHJlbG9jcy4gIFRoZXJlIGlzIGEgc2ltaWxhciBwcm9ibGVtIHdoZW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24gaXMKKwkgcHJvY2Vzc2VkIGFzIHdlbGwuCisJIAorCSBVbmZvcnR1bmF0ZWx5IGdldHRpbmcgaG9sZCBvZiB0aGUgcmVsb2MgaW5mb3JtYXRpb24gaXMgaGFyZC4uLiAqLworICAgIH0KKyAgCisgIC8qIEEgbnVsbCBpbmZvX3B0ciBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBubyBkd2FyZjIgaW5mbyAKKyAgICAgKG9yIHRoYXQgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBzdGFzaCkuICovCisKKyAgaWYgKCEgc3Rhc2gtPmluZm9fcHRyKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBDaGVjayB0aGUgcHJldmlvdXNseSByZWFkIGNvbXAuIHVuaXRzIGZpcnN0LiAqLworCisgIGZvciAoZWFjaCA9IHN0YXNoLT5hbGxfY29tcF91bml0czsgZWFjaDsgZWFjaCA9IGVhY2gtPm5leHRfdW5pdCkKKyAgICB7CisgICAgICBpZiAoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKGVhY2gsIGFkZHIpKQorCXJldHVybiBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKGVhY2gsIGFkZHIsCisJCQkJCSAgICBmaWxlbmFtZV9wdHIsIAorCQkJCQkgICAgZnVuY3Rpb25uYW1lX3B0ciwgCisJCQkJCSAgICBsaW5lbnVtYmVyX3B0cik7CisgICAgfQorCisgIC8qIFJlYWQgZWFjaCByZW1haW5pbmcgY29tcC4gdW5pdHMgY2hlY2tpbmcgZWFjaCBhcyB0aGV5IGFyZSByZWFkLiAqLworICB3aGlsZSAoc3Rhc2gtPmluZm9fcHRyIDwgc3Rhc2gtPmluZm9fcHRyX2VuZCkKKyAgICB7CisgICAgICBzdHJ1Y3QgY29tcF91bml0KiBlYWNoOworICAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKworICAgICAgbGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBzdGFzaC0+aW5mb19wdHIpOworICAgICAgc3Rhc2gtPmluZm9fcHRyICs9IDQ7CisKKyAgICAgIGlmIChsZW5ndGggPiAwKQorICAgICAgICB7CisJICBlYWNoID0gcGFyc2VfY29tcF91bml0IChhYmZkLCBzdGFzaC0+aW5mb19wdHIsIAorCQkJCSAgc3Rhc2gtPmluZm9fcHRyICsgbGVuZ3RoKTsKKwkgIHN0YXNoLT5pbmZvX3B0ciArPSBsZW5ndGg7CisKKwkgIGlmIChlYWNoKQorCSAgICB7CisJICAgICAgZWFjaC0+bmV4dF91bml0ID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOworCSAgICAgIHN0YXNoLT5hbGxfY29tcF91bml0cyA9IGVhY2g7CisKKwkgICAgICBpZiAoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKGVhY2gsIGFkZHIpKQorCQlyZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLAorCQkJCQkJICAgIGZpbGVuYW1lX3B0ciwgCisJCQkJCQkgICAgZnVuY3Rpb25uYW1lX3B0ciwgCisJCQkJCQkgICAgbGluZW51bWJlcl9wdHIpOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9iZmQvZWNvZmYuYyBiL2JmZC9lY29mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzZmODUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWNvZmYuYwpAQCAtMCwwICsxLDQ4MjUgQEAKKy8qIEdlbmVyaWMgRUNPRkYgKEV4dGVuZGVkLUNPRkYpIHJvdXRpbmVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCisgICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisjaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisKKy8qIEZJWE1FOiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBOX1NFVFtBRFRCXSwgYnV0IGFvdXQ2NC5oIGRlZmluZXMKKyAgIHNvbWUgb3RoZXIgc3R1ZmYgd2hpY2ggd2UgZG9uJ3Qgd2FudCBhbmQgd2hpY2ggY29uZmxpY3RzIHdpdGggc3R1ZmYKKyAgIHdlIGRvIHdhbnQuICAqLworI2luY2x1ZGUgImxpYmFvdXQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI3VuZGVmIE5fQUJTCisjdW5kZWYgZXhlY19oZHIKKyN1bmRlZiBvYmpfc3ltX2ZpbGVwb3MKKworI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjb2ZmL3N5bS5oIgorI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKKyNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorI2luY2x1ZGUgImxpYmVjb2ZmLmgiCisMCisvKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGludCBlY29mZl9nZXRfbWFnaWMgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgbG9uZyBlY29mZl9zZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgIGZsYWd3b3JkIGZsYWdzKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9zZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBTWU1SICplY29mZl9zeW0sCisJCQkJCSAgIGFzeW1ib2wgKmFzeW0sIGludCBleHQsIGludCB3ZWFrKSk7CitzdGF0aWMgdm9pZCBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAorCQkJCQkgIGNoYXIgKnN0cmluZywKKwkJCQkJICBSTkRYUiAqcm5keCwgbG9uZyBpc3ltLAorCQkJCQkgIGNvbnN0IGNoYXIgKndoaWNoKSk7CitzdGF0aWMgY2hhciAqZWNvZmZfdHlwZV90b19zdHJpbmcgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKKwkJCQkJICAgdW5zaWduZWQgaW50IGluZHgpKTsKK3N0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCisJCQkJCQlhc3ltYm9sICoqc3ltYm9scykpOworc3RhdGljIGludCBlY29mZl9zb3J0X2hkcnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBiZmRfc2l6ZV90eXBlIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOworc3RhdGljIHZvaWQgZWNvZmZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOworc3RhdGljIHVuc2lnbmVkIGludCBlY29mZl9hcm1hcF9oYXNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKnMsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGhsb2cpKTsKKwwKKy8qIFRoaXMgc3R1ZmYgaXMgc29tZXdoYXQgY29waWVkIGZyb20gY29mZmNvZGUuaC4gICovCisKK3N0YXRpYyBhc2VjdGlvbiBiZmRfZGVidWdfc2VjdGlvbiA9IHsgIipERUJVRyoiIH07CisKKy8qIENyZWF0ZSBhbiBFQ09GRiBvYmplY3QuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID0gKChzdHJ1Y3QgZWNvZmZfdGRhdGEgKikKKwkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX2RhdGFfdHlwZSkpKTsKKyAgaWYgKGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLworCitQVFIKK19iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZmlsZWhkcjsKKyAgICAgUFRSIGFvdXRoZHI7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7CisgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7CisgIGVjb2ZmX2RhdGFfdHlwZSAqZWNvZmY7CisKKyAgaWYgKF9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQorICAgIHJldHVybiBOVUxMOworCisgIGVjb2ZmID0gZWNvZmZfZGF0YSAoYWJmZCk7CisgIGVjb2ZmLT5ncF9zaXplID0gODsKKyAgZWNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7CisKKyAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGVjb2ZmLT50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydDsKKyAgICAgIGVjb2ZmLT50ZXh0X2VuZCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQgKyBpbnRlcm5hbF9hLT50c2l6ZTsKKyAgICAgIGVjb2ZmLT5ncCA9IGludGVybmFsX2EtPmdwX3ZhbHVlOworICAgICAgZWNvZmYtPmdwcm1hc2sgPSBpbnRlcm5hbF9hLT5ncHJtYXNrOworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwllY29mZi0+Y3BybWFza1tpXSA9IGludGVybmFsX2EtPmNwcm1hc2tbaV07CisgICAgICBlY29mZi0+ZnBybWFzayA9IGludGVybmFsX2EtPmZwcm1hc2s7CisgICAgICBpZiAoaW50ZXJuYWxfYS0+bWFnaWMgPT0gRUNPRkZfQU9VVF9aTUFHSUMpCisJYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKKyAgICAgIGVsc2UKKwlhYmZkLT5mbGFncyAmPX4gRF9QQUdFRDsKKyAgICB9CisKKyAgLyogSXQgdHVybnMgb3V0IHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gaXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgb3IKKyAgICAgQWxwaGEgRUNPRkYgYmFja2VuZHMuICBUaGV5IGhhdmUgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoZQorICAgICBhLm91dCBoZWFkZXIsIGJ1dCB3ZSBqdXN0IGNvcHkgaXQgYWxsIChlLmcuLCBncHJtYXNrLCBjcHJtYXNrIGFuZAorICAgICBmcHJtYXNrKSBhbmQgbGV0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBlbnN1cmUgdGhhdCBvbmx5IHJlbGV2YW50CisgICAgIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0LiAgKi8KKworICByZXR1cm4gKFBUUikgZWNvZmY7Cit9CisKKy8qIEluaXRpYWxpemUgYSBuZXcgc2VjdGlvbi4gICovCisKK2Jvb2xlYW4KK19iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gNDsKKworICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfVEVYVCkgPT0gMAorICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfSU5JVCkgPT0gMAorICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfRklOSSkgPT0gMCkKKyAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOworICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9EQVRBKSA9PSAwCisJICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfU0RBVEEpID09IDApCisgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKKyAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUkRBVEEpID09IDAKKwkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSVQ4KSA9PSAwCisJICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElUNCkgPT0gMAorCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1JDT05TVCkgPT0gMAorCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1BEQVRBKSA9PSAwKQorICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFk7CisgIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0JTUykgPT0gMAorCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1NCU1MpID09IDApCisgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOworICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSUIpID09IDApCisgICAgeworICAgICAgLyogQW4gSXJpeCA0IHNoYXJlZCBsaWJhcnkuICAqLworICAgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7CisgICAgfQorCisgIC8qIFByb2JhYmx5IGFueSBvdGhlciBzZWN0aW9uIG5hbWUgaXMgU0VDX05FVkVSX0xPQUQsIGJ1dCBJJ20KKyAgICAgdW5jZXJ0YWluIGFib3V0IC5pbml0IG9uIHNvbWUgc3lzdGVtcyBhbmQgSSBkb24ndCBrbm93IGhvdyBzaGFyZWQKKyAgICAgbGlicmFyaWVzIHdvcmsuICAqLworCisgIHJldHVybiB0cnVlOworfQorCisvKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgVGhpcyBpcyBjYWxsZWQgZnJvbQorICAgdGhlIGdlbmVyaWMgQ09GRiByb3V0aW5lcy4gIEl0IGlzIHRoZSBpbnZlcnNlIG9mIGVjb2ZmX2dldF9tYWdpYywKKyAgIGJlbG93LiAgVGhpcyBjb3VsZCBiZSBhbiBFQ09GRiBiYWNrZW5kIHJvdXRpbmUsIHdpdGggb25lIHZlcnNpb24KKyAgIGZvciBlYWNoIHRhcmdldCwgYnV0IHRoZXJlIGFyZW4ndCBhbGwgdGhhdCBtYW55IEVDT0ZGIHRhcmdldHMuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgZmlsZWhkcikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZmlsZWhkcjsKK3sKKyAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKKyAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgIHVuc2lnbmVkIGxvbmcgbWFjaDsKKworICBzd2l0Y2ggKGludGVybmFsX2YtPmZfbWFnaWMpCisgICAgeworICAgIGNhc2UgTUlQU19NQUdJQ18xOgorICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEU6CisgICAgY2FzZSBNSVBTX01BR0lDX0JJRzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOworICAgICAgbWFjaCA9IDMwMDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUyOgorICAgIGNhc2UgTUlQU19NQUdJQ19CSUcyOgorICAgICAgLyogTUlQUyBJU0EgbGV2ZWwgMjogdGhlIHI2MDAwICovCisgICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKKyAgICAgIG1hY2ggPSA2MDAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKKyAgICBjYXNlIE1JUFNfTUFHSUNfQklHMzoKKyAgICAgIC8qIE1JUFMgSVNBIGxldmVsIDM6IHRoZSByNDAwMCAqLworICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7CisgICAgICBtYWNoID0gNDAwMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9NQUdJQzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9hbHBoYTsKKyAgICAgIG1hY2ggPSAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7CisgICAgICBtYWNoID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCk7Cit9CisKKy8qIEdldCB0aGUgbWFnaWMgbnVtYmVyIHRvIHVzZSBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLgorICAgVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywgYWJvdmUuICAqLworCitzdGF0aWMgaW50CitlY29mZl9nZXRfbWFnaWMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IGJpZywgbGl0dGxlOworCisgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfYXJjaF9taXBzOgorICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorCXsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwljYXNlIDMwMDA6CisJICBiaWcgPSBNSVBTX01BR0lDX0JJRzsKKwkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFOworCSAgYnJlYWs7CisKKwljYXNlIDYwMDA6CisJICBiaWcgPSBNSVBTX01BR0lDX0JJRzI7CisJICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTI7CisJICBicmVhazsKKworCWNhc2UgNDAwMDoKKwkgIGJpZyA9IE1JUFNfTUFHSUNfQklHMzsKKwkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFMzsKKwkgIGJyZWFrOworCX0KKworICAgICAgcmV0dXJuIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IGJpZyA6IGxpdHRsZTsKKworICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6CisgICAgICByZXR1cm4gQUxQSEFfTUFHSUM7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgc2VjdGlvbiBzX2ZsYWdzIHRvIHVzZSBmb3IgYSBzZWN0aW9uLiAgKi8KKworc3RhdGljIGxvbmcKK2Vjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChuYW1lLCBmbGFncykKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7Cit7CisgIGxvbmcgc3R5cDsKKworICBzdHlwID0gMDsKKworICBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9URVhUOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EQVRBKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX0RBVEE7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX1NEQVRBOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SREFUQSkgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9SREFUQTsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUQSkgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9MSVRBOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVQ4KSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX0xJVDg7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVDQpID09IDApCisgICAgc3R5cCA9IFNUWVBfTElUNDsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX0JTUzsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9TQlNTOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9JTklUKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0lOSVQ7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0ZJTkkpID09IDApCisgICAgc3R5cCA9IFNUWVBfRUNPRkZfRklOSTsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCisgICAgc3R5cCA9IFNUWVBfUERBVEE7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1hEQVRBKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX1hEQVRBOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUIpID09IDApCisgICAgc3R5cCA9IFNUWVBfRUNPRkZfTElCOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9HT1QpID09IDApCisgICAgc3R5cCA9IFNUWVBfR09UOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9IQVNIKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX0hBU0g7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTkFNSUMpID09IDApCisgICAgc3R5cCA9IFNUWVBfRFlOQU1JQzsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCTElTVCkgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9MSUJMSVNUOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SRUxEWU4pID09IDApCisgICAgc3R5cCA9IFNUWVBfUkVMRFlOOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9DT05GTElDKSA9PSAwKQorICAgIHN0eXAgPSBTVFlQX0NPTkZMSUM7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTlNUUikgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9EWU5TVFI7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTlNZTSkgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9EWU5TWU07CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDApCisgICAgeworICAgICAgc3R5cCA9IFNUWVBfQ09NTUVOVDsKKyAgICAgIGZsYWdzICY9fiBTRUNfTkVWRVJfTE9BRDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKKyAgICBzdHlwID0gU1RZUF9SQ09OU1Q7CisgIGVsc2UgaWYgKGZsYWdzICYgU0VDX0NPREUpIAorICAgIHN0eXAgPSBTVFlQX1RFWFQ7CisgIGVsc2UgaWYgKGZsYWdzICYgU0VDX0RBVEEpIAorICAgIHN0eXAgPSBTVFlQX0RBVEE7CisgIGVsc2UgaWYgKGZsYWdzICYgU0VDX1JFQURPTkxZKQorICAgIHN0eXAgPSBTVFlQX1JEQVRBOworICBlbHNlIGlmIChmbGFncyAmIFNFQ19MT0FEKQorICAgIHN0eXAgPSBTVFlQX1JFRzsKKyAgZWxzZQorICAgIHN0eXAgPSBTVFlQX0JTUzsKKworICBpZiAoZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKKyAgICBzdHlwIHw9IFNUWVBfTk9MT0FEOworCisgIHJldHVybiBzdHlwOworfQorCisvKiBHZXQgdGhlIEJGRCBmbGFncyB0byB1c2UgZm9yIGEgc2VjdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworZmxhZ3dvcmQKK19iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgaGRyOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOworICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOworICBmbGFnd29yZCBzZWNfZmxhZ3M9MDsKKworICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQorICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKKworICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCisgICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCisgIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKKyAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKQorICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpCisgICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOQU1JQykKKyAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSUJMSVNUKQorICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JFTERZTikKKyAgICAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT05GTElDCisgICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1RSKQorICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNZTSkKKyAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9IQVNIKSkKKyAgICB7CisgICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCisJc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7CisgICAgICBlbHNlCisJc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7CisgICAgfQorICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKKwkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCisJICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NEQVRBKQorCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQorCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9YREFUQQorCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9HT1QpCisJICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKKyAgICB7CisgICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCisJc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7CisgICAgICBlbHNlCisJc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7CisgICAgICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQorCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCisJICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQorCXNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7CisgICAgfQorICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQorCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TQlNTKSkKKyAgICB7CisgICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOworICAgIH0KKyAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQorICAgIHsKKyAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKKyAgICB9CisgIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVRBKQorCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ4KQorCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ0KSkKKyAgICB7CisgICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKKyAgICB9CisgIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikKKyAgICB7CisgICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOworICAgIH0KKworICByZXR1cm4gc2VjX2ZsYWdzOworfQorDAorLyogUmVhZCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyIGZvciBhbiBFQ09GRiBvYmplY3QgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKKyAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKKyAgUFRSIHJhdyA9IE5VTEw7CisgIEhEUlIgKmludGVybmFsX3N5bWhkcjsKKworICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGl0IGluLiAgKi8KKyAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5tYWdpYyA9PSAKKyAgICAgIGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgc3ltYm9saWMgaGVhZGVyLiAgKi8KKyAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBBdCB0aGlzIHBvaW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIGhvbGRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scworICAgICBhcyByZWFkIGZyb20gdGhlIGZpbGUgaGVhZGVyLCBidXQgb24gRUNPRkYgdGhpcyBpcyBhbHdheXMgdGhlCisgICAgIHNpemUgb2YgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8KKyAgICAgaGFuZGxlIHRoaXMgd2hlbiB3ZSBmaXJzdCByZWFkIHRoZSBmaWxlIGluIGNvZmZnZW4uYy4gICovCisgIGV4dGVybmFsX2hkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZTsKKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IGV4dGVybmFsX2hkcl9zaXplKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBSZWFkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICAqLworICByYXcgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9oZHJfc2l6ZSk7CisgIGlmIChyYXcgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcywgU0VFS19TRVQpID09IC0xCisgICAgICB8fCAoYmZkX3JlYWQgKHJhdywgZXh0ZXJuYWxfaGRyX3NpemUsIDEsIGFiZmQpCisJICAhPSBleHRlcm5hbF9oZHJfc2l6ZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGludGVybmFsX3N5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7CisgICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2hkcl9pbikgKGFiZmQsIHJhdywgaW50ZXJuYWxfc3ltaGRyKTsKKworICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5tYWdpYyAhPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc3ltYm9scy4gICovCisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gKGludGVybmFsX3N5bWhkci0+aXN5bU1heAorCQkJICAgICArIGludGVybmFsX3N5bWhkci0+aWV4dE1heCk7CisKKyAgaWYgKHJhdyAhPSBOVUxMKQorICAgIGZyZWUgKHJhdyk7CisgIHJldHVybiB0cnVlOworIGVycm9yX3JldHVybjoKKyAgaWYgKHJhdyAhPSBOVUxMKQorICAgIGZyZWUgKHJhdyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgaW1wb3J0YW50IHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhbiBFQ09GRgorICAgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCBieSBnZGIgdmlhIHRoZSByZWFkX2RlYnVnX2luZm8gZW50cnkKKyAgIHBvaW50IGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gICovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCBpZ25vcmUsIGRlYnVnKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICppZ25vcmU7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKKyAgSERSUiAqaW50ZXJuYWxfc3ltaGRyOworICBiZmRfc2l6ZV90eXBlIHJhd19iYXNlOworICBiZmRfc2l6ZV90eXBlIHJhd19zaXplOworICBQVFIgcmF3OworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOworICBjaGFyICpmcmF3X3NyYzsKKyAgY2hhciAqZnJhd19lbmQ7CisgIHN0cnVjdCBmZHIgKmZkcl9wdHI7CisgIGJmZF9zaXplX3R5cGUgcmF3X2VuZDsKKyAgYmZkX3NpemVfdHlwZSBjYl9lbmQ7CisKKyAgQkZEX0FTU0VSVCAoZGVidWcgPT0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlJ3ZlIGFscmVhZHkgZ290dGVuIGl0LCBhbmQgd2hldGhlciB0aGVyZSdzIGFueSB0bworICAgICBnZXQuICAqLworICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPnJhd19zeW1lbnRzICE9IChQVFIpIE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgPT0gMCkKKyAgICB7CisgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKCEgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50ZXJuYWxfc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7CisKKyAgLyogUmVhZCBhbGwgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGF0IG9uY2UuICAqLworICByYXdfYmFzZSA9IChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MKKwkgICAgICArIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemUpOworCisgIC8qIEFscGhhIGVjb2ZmIG1ha2VzIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHJhd19zaXplIGRpZmZpY3VsdC4gSXQgaGFzCisgICAgIGFuIHVuZG9jdW1lbnRlZCBkZWJ1ZyBkYXRhIHNlY3Rpb24gYmV0d2VlbiB0aGUgc3ltaGRyIGFuZCB0aGUgZmlyc3QKKyAgICAgZG9jdW1lbnRlZCBzZWN0aW9uLiBBbmQgdGhlIG9yZGVyaW5nIG9mIHRoZSBzZWN0aW9ucyB2YXJpZXMgYmV0d2VlbgorICAgICBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuCisgICAgIElmIGJmZCBzdXBwb3J0cyBTRUVLX0VORCBzb21lZGF5LCB0aGlzIGNvZGUgY291bGQgYmUgc2ltcGxpZmllZC4gICovCisKKyAgcmF3X2VuZCA9IDA7CisKKyNkZWZpbmUgVVBEQVRFX1JBV19FTkQoc3RhcnQsIGNvdW50LCBzaXplKSBcCisgIGNiX2VuZCA9IGludGVybmFsX3N5bWhkci0+c3RhcnQgKyBpbnRlcm5hbF9zeW1oZHItPmNvdW50ICogKHNpemUpOyBcCisgIGlmIChjYl9lbmQgPiByYXdfZW5kKSBcCisgICAgcmF3X2VuZCA9IGNiX2VuZAorCisgIFVQREFURV9SQVdfRU5EIChjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7CisgIFVQREFURV9SQVdfRU5EIChjYkRuT2Zmc2V0LCBpZG5NYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZG5yX3NpemUpOworICBVUERBVEVfUkFXX0VORCAoY2JQZE9mZnNldCwgaXBkTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3Bkcl9zaXplKTsKKyAgVVBEQVRFX1JBV19FTkQgKGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3N5bV9zaXplKTsKKyAgVVBEQVRFX1JBV19FTkQgKGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX29wdF9zaXplKTsKKyAgVVBEQVRFX1JBV19FTkQgKGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKKyAgVVBEQVRFX1JBV19FTkQgKGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSk7CisgIFVQREFURV9SQVdfRU5EIChjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOworICBVUERBVEVfUkFXX0VORCAoY2JGZE9mZnNldCwgaWZkTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Zkcl9zaXplKTsKKyAgVVBEQVRFX1JBV19FTkQgKGNiUmZkT2Zmc2V0LCBjcmZkLCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3JmZF9zaXplKTsKKyAgVVBEQVRFX1JBV19FTkQgKGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplKTsKKworI3VuZGVmIFVQREFURV9SQVdfRU5ECisKKyAgcmF3X3NpemUgPSByYXdfZW5kIC0gcmF3X2Jhc2U7CisgIGlmIChyYXdfc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IDA7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJhdyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmF3X3NpemUpOworICBpZiAocmF3ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCShlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MKKwkJICsgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZSksCisJCVNFRUtfU0VUKSAhPSAwCisgICAgICB8fCBiZmRfcmVhZCAocmF3LCByYXdfc2l6ZSwgMSwgYWJmZCkgIT0gcmF3X3NpemUpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhdyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGVjb2ZmX2RhdGEgKGFiZmQpLT5yYXdfc3ltZW50cyA9IHJhdzsKKworICAvKiBHZXQgcG9pbnRlcnMgZm9yIHRoZSBudW1lcmljIG9mZnNldHMgaW4gdGhlIEhEUlIgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgRklYKG9mZjEsIG9mZjIsIHR5cGUpIFwKKyAgaWYgKGludGVybmFsX3N5bWhkci0+b2ZmMSA9PSAwKSBcCisgICAgZGVidWctPm9mZjIgPSAodHlwZSkgTlVMTDsgXAorICBlbHNlIFwKKyAgICBkZWJ1Zy0+b2ZmMiA9ICh0eXBlKSAoKGNoYXIgKikgcmF3IFwKKwkJCSAgKyAoaW50ZXJuYWxfc3ltaGRyLT5vZmYxIFwKKwkJCSAgICAgLSByYXdfYmFzZSkpCisgIEZJWCAoY2JMaW5lT2Zmc2V0LCBsaW5lLCB1bnNpZ25lZCBjaGFyICopOworICBGSVggKGNiRG5PZmZzZXQsIGV4dGVybmFsX2RuciwgUFRSKTsKKyAgRklYIChjYlBkT2Zmc2V0LCBleHRlcm5hbF9wZHIsIFBUUik7CisgIEZJWCAoY2JTeW1PZmZzZXQsIGV4dGVybmFsX3N5bSwgUFRSKTsKKyAgRklYIChjYk9wdE9mZnNldCwgZXh0ZXJuYWxfb3B0LCBQVFIpOworICBGSVggKGNiQXV4T2Zmc2V0LCBleHRlcm5hbF9hdXgsIHVuaW9uIGF1eF9leHQgKik7CisgIEZJWCAoY2JTc09mZnNldCwgc3MsIGNoYXIgKik7CisgIEZJWCAoY2JTc0V4dE9mZnNldCwgc3NleHQsIGNoYXIgKik7CisgIEZJWCAoY2JGZE9mZnNldCwgZXh0ZXJuYWxfZmRyLCBQVFIpOworICBGSVggKGNiUmZkT2Zmc2V0LCBleHRlcm5hbF9yZmQsIFBUUik7CisgIEZJWCAoY2JFeHRPZmZzZXQsIGV4dGVybmFsX2V4dCwgUFRSKTsKKyN1bmRlZiBGSVgKKworICAvKiBJIGRvbid0IHdhbnQgdG8gYWx3YXlzIHN3YXAgYWxsIHRoZSBkYXRhLCBiZWNhdXNlIGl0IHdpbGwganVzdAorICAgICB3YXN0ZSB0aW1lIGFuZCBtb3N0IHByb2dyYW1zIHdpbGwgbmV2ZXIgbG9vayBhdCBpdC4gIFRoZSBvbmx5CisgICAgIHRpbWUgdGhlIGxpbmtlciBuZWVkcyBtb3N0IG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gc3dhcHBlZAorICAgICBpcyB3aGVuIGxpbmtpbmcgYmlnLWVuZGlhbiBhbmQgbGl0dGxlLWVuZGlhbiBNSVBTIG9iamVjdCBmaWxlcworICAgICB0b2dldGhlciwgd2hpY2ggaXMgbm90IGEgY29tbW9uIG9jY3VycmVuY2UuCisKKyAgICAgV2UgbmVlZCB0byBsb29rIGF0IHRoZSBmZHIgdG8gZGVhbCB3aXRoIGEgbG90IG9mIGluZm9ybWF0aW9uIGluCisgICAgIHRoZSBzeW1ib2xzLCBzbyB3ZSBzd2FwIHRoZW0gaGVyZS4gICovCisgIGRlYnVnLT5mZHIgPSAoc3RydWN0IGZkciAqKSBiZmRfYWxsb2MgKGFiZmQsCisJCQkJCSAoaW50ZXJuYWxfc3ltaGRyLT5pZmRNYXggKgorCQkJCQkgIHNpemVvZiAoc3RydWN0IGZkcikpKTsKKyAgaWYgKGRlYnVnLT5mZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGV4dGVybmFsX2Zkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9mZHJfc2l6ZTsKKyAgZmRyX3B0ciA9IGRlYnVnLT5mZHI7CisgIGZyYXdfc3JjID0gKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2ZkcjsKKyAgZnJhd19lbmQgPSBmcmF3X3NyYyArIGludGVybmFsX3N5bWhkci0+aWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemU7CisgIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQorICAgICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEVDT0ZGIHN5bWJvbCB0YWJsZSByb3V0aW5lcy4gIFRoZSBFQ09GRiBzeW1ib2wgdGFibGUgaXMgZGVzY3JpYmVkCisgICBpbiBnY2MvbWlwcy10ZmlsZS5jLiAgKi8KKworLyogRUNPRkYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKKyAgIG90aGVyIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0CisgICB0b2dldGhlciwgYW5kIHRoZW4gcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHBvaW50ZXIsIHdoaWNoIHlpZWxkcworICAgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbgorICAgc2VjdGlvbi4gICovCitzdGF0aWMgYXNlY3Rpb24gZWNvZmZfc2NvbV9zZWN0aW9uOworc3RhdGljIGFzeW1ib2wgZWNvZmZfc2NvbV9zeW1ib2w7CitzdGF0aWMgYXN5bWJvbCAqZWNvZmZfc2NvbV9zeW1ib2xfcHRyOworCisvKiBDcmVhdGUgYW4gZW1wdHkgc3ltYm9sLiAgKi8KKworYXN5bWJvbCAqCitfYmZkX2Vjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGVjb2ZmX3N5bWJvbF90eXBlICpuZXc7CisKKyAgbmV3ID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSkpOworICBpZiAobmV3ID09IChlY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQorICAgIHJldHVybiAoYXN5bWJvbCAqKSBOVUxMOworICBtZW1zZXQgKChQVFIpIG5ldywgMCwgc2l6ZW9mICpuZXcpOworICBuZXctPnN5bWJvbC5zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7CisgIG5ldy0+ZmRyID0gKEZEUiAqKSBOVUxMOworICBuZXctPmxvY2FsID0gZmFsc2U7CisgIG5ldy0+bmF0aXZlID0gTlVMTDsKKyAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7CisgIHJldHVybiAmbmV3LT5zeW1ib2w7Cit9CisKKy8qIFNldCB0aGUgQkZEIGZsYWdzIGFuZCBzZWN0aW9uIGZvciBhbiBFQ09GRiBzeW1ib2wuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCBlY29mZl9zeW0sIGFzeW0sIGV4dCwgd2VhaykKKyAgICAgYmZkICphYmZkOworICAgICBTWU1SICplY29mZl9zeW07CisgICAgIGFzeW1ib2wgKmFzeW07CisgICAgIGludCBleHQ7CisgICAgIGludCB3ZWFrOworeworICBhc3ltLT50aGVfYmZkID0gYWJmZDsKKyAgYXN5bS0+dmFsdWUgPSBlY29mZl9zeW0tPnZhbHVlOworICBhc3ltLT5zZWN0aW9uID0gJmJmZF9kZWJ1Z19zZWN0aW9uOworICBhc3ltLT51ZGF0YS5pID0gMDsKKworICAvKiBNb3N0IHN5bWJvbCB0eXBlcyBhcmUganVzdCBmb3IgZGVidWdnaW5nLiAgKi8KKyAgc3dpdGNoIChlY29mZl9zeW0tPnN0KQorICAgIHsKKyAgICBjYXNlIHN0R2xvYmFsOgorICAgIGNhc2Ugc3RTdGF0aWM6CisgICAgY2FzZSBzdExhYmVsOgorICAgIGNhc2Ugc3RQcm9jOgorICAgIGNhc2Ugc3RTdGF0aWNQcm9jOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBzdE5pbDoKKyAgICAgIGlmIChFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQorCXsKKwkgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKHdlYWspCisgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX1dFQUs7CisgIGVsc2UgaWYgKGV4dCkKKyAgICBhc3ltLT5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOworICBlbHNlCisgICAgeworICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7CisgICAgICAvKiBOb3JtYWxseSwgYSBsb2NhbCBzdFByb2Mgc3ltYm9sIHdpbGwgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgIGV4dGVybmFsIHN5bWJvbC4gIFdlIG1hcmsgdGhlIGxvY2FsIHN5bWJvbCBhcyBhIGRlYnVnZ2luZworICAgICAgICAgc3ltYm9sLCBpbiBvcmRlciB0byBwcmV2ZW50IG5tIGZyb20gcHJpbnRpbmcgYm90aCBvdXQuCisgICAgICAgICBTaW1pbGFybHksIHdlIG1hcmsgc3RMYWJlbCBhbmQgc3RhYnMgc3ltYm9scyBhcyBkZWJ1Z2dpbmcKKyAgICAgICAgIHN5bWJvbHMuICBJbiBib3RoIGNhc2VzLCB3ZSBkbyB3YW50IHRvIHNldCB0aGUgdmFsdWUKKyAgICAgICAgIGNvcnJlY3RseSBiYXNlZCBvbiB0aGUgc3ltYm9sIGNsYXNzLiAgKi8KKyAgICAgIGlmIChlY29mZl9zeW0tPnN0ID09IHN0UHJvYworCSAgfHwgZWNvZmZfc3ltLT5zdCA9PSBzdExhYmVsCisJICB8fCBFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQorCWFzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7CisgICAgfQorICBzd2l0Y2ggKGVjb2ZmX3N5bS0+c2MpCisgICAgeworICAgIGNhc2Ugc2NOaWw6CisgICAgICAvKiBVc2VkIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbGFiZWxzLiAgTGVhdmUgdGhlbSBpbiB0aGUKKwkgZGVidWdnaW5nIHNlY3Rpb24sIGFuZCBtYXJrIHRoZW0gYXMgbG9jYWwuICBJZiBCU0ZfREVCVUdHSU5HCisJIGlzIHNldCwgdGhlbiBubSBkb2VzIG5vdCBkaXNwbGF5IHRoZW0gZm9yIHNvbWUgcmVhc29uLiAgSWYgbm8KKwkgZmxhZ3MgYXJlIHNldCB0aGVuIHRoZSBsaW5rZXIgd2hpbmVzIGFib3V0IHRoZW0uICAqLworICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNjVGV4dDoKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOworICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY0RhdGE6CisgICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKKyAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2NCc3M6CisgICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOworICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY1JlZ2lzdGVyOgorICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY0FiczoKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY1VuZGVmaW5lZDoKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICAgICAgYXN5bS0+ZmxhZ3MgPSAwOworICAgICAgYXN5bS0+dmFsdWUgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY0NkYkxvY2FsOgorICAgIGNhc2Ugc2NCaXRzOgorICAgIGNhc2Ugc2NDZGJTeXN0ZW06CisgICAgY2FzZSBzY1JlZ0ltYWdlOgorICAgIGNhc2Ugc2NJbmZvOgorICAgIGNhc2Ugc2NVc2VyU3RydWN0OgorICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY1NEYXRhOgorICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOworICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY1NCc3M6CisgICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKKyAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2NSRGF0YToKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKKyAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2NWYXI6CisgICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNjQ29tbW9uOgorICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemUpCisJeworCSAgYXN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICBhc3ltLT5mbGFncyA9IDA7CisJICBicmVhazsKKwl9CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2Ugc2NTQ29tbW9uOgorICAgICAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCisJeworCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLworCSAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOworCSAgZWNvZmZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKKwkgIGVjb2ZmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247CisJICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOworCSAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKKwkgIGVjb2ZmX3Njb21fc3ltYm9sLm5hbWUgPSBTQ09NTU9OOworCSAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07CisJICBlY29mZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKKwkgIGVjb2ZmX3Njb21fc3ltYm9sX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbDsKKwl9CisgICAgICBhc3ltLT5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKKyAgICAgIGFzeW0tPmZsYWdzID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2NWYXJSZWdpc3RlcjoKKyAgICBjYXNlIHNjVmFyaWFudDoKKyAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2NTVW5kZWZpbmVkOgorICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgICAgICBhc3ltLT5mbGFncyA9IDA7CisgICAgICBhc3ltLT52YWx1ZSA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNjSW5pdDoKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOworICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY0Jhc2VkVmFyOgorICAgIGNhc2Ugc2NYRGF0YToKKyAgICBjYXNlIHNjUERhdGE6CisgICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNjRmluaToKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZmluaSIpOworICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY1JDb25zdDoKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmNvbnN0Iik7CisgICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIExvb2sgZm9yIHNwZWNpYWwgY29uc3RydWN0b3JzIHN5bWJvbHMgYW5kIG1ha2UgcmVsb2NhdGlvbiBlbnRyaWVzCisgICAgIGluIGEgc3BlY2lhbCBjb25zdHJ1Y3Rpb24gc2VjdGlvbi4gIFRoZXNlIGFyZSBwcm9kdWNlZCBieSB0aGUKKyAgICAgLWZnbnUtbGlua2VyIGFyZ3VtZW50IHRvIGcrKy4gICovCisgIGlmIChFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQorICAgIHsKKyAgICAgIHN3aXRjaCAoRUNPRkZfVU5NQVJLX1NUQUIgKGVjb2ZmX3N5bS0+aW5kZXgpKQorCXsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisKKwljYXNlIE5fU0VUQToKKwljYXNlIE5fU0VUVDoKKwljYXNlIE5fU0VURDoKKwljYXNlIE5fU0VUQjoKKwkgIHsKKwkgICAgLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8KKwkgICAgICAgbWFrZSB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdworCSAgICAgICBoYW5kbGVkIGluIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLworI2lmIDAKKwkgICAgY29uc3QgY2hhciAqbmFtZTsKKwkgICAgYXNlY3Rpb24gKnNlY3Rpb247CisJICAgIGFyZWxlbnRfY2hhaW4gKnJlbG9jX2NoYWluOworCSAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKKworCSAgICAvKiBHZXQgYSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgc3ltYm9sICh1c3VhbGx5CisJICAgICAgIF9fQ1RPUl9MSVNUX18gb3IgX19EVE9SX0xJU1RfXykuICBGSVhNRTogZ2NjIHVzZXMgdGhlCisJICAgICAgIG5hbWUgX19fQ1RPUl9MSVNUICh0aHJlZSB1bmRlcnNjb3JlcykuICBXZSBuZWVkCisJICAgICAgIF9fQ1RPUl9MSVNUICh0d28gdW5kZXJzY29yZXMpLCBzaW5jZSBFQ09GRiBkb2Vzbid0IHVzZQorCSAgICAgICBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgZ2NjLAorCSAgICAgICBidXQgaW5zdGVhZCB3ZSBkbyBpdCBoZXJlLiAgQWN0dWFsbHksIHRoaXMgc2hvdWxkIGFsbAorCSAgICAgICBiZSBkb25lIGRpZmZlcmVudGx5IGFueWhvdy4gICovCisJICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChhc3ltKTsKKwkgICAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ18nICYmIG5hbWVbMl0gPT0gJ18nKQorCSAgICAgIHsKKwkJKytuYW1lOworCQlhc3ltLT5uYW1lID0gbmFtZTsKKwkgICAgICB9CisJICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7CisJICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQorCSAgICAgIHsKKwkJY2hhciAqY29weTsKKworCQljb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7CisJCWlmICghY29weSkKKwkJICByZXR1cm4gZmFsc2U7CisJCXN0cmNweSAoY29weSwgbmFtZSk7CisJCXNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBjb3B5KTsKKwkgICAgICB9CisKKwkgICAgLyogQnVpbGQgYSByZWxvYyBwb2ludGluZyB0byB0aGlzIGNvbnN0cnVjdG9yLiAgKi8KKwkgICAgcmVsb2NfY2hhaW4gPQorCSAgICAgIChhcmVsZW50X2NoYWluICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50X2NoYWluKSk7CisJICAgIGlmICghcmVsb2NfY2hhaW4pCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICByZWxvY19jaGFpbi0+cmVsZW50LnN5bV9wdHJfcHRyID0KKwkgICAgICBiZmRfZ2V0X3NlY3Rpb24gKGFzeW0pLT5zeW1ib2xfcHRyX3B0cjsKKwkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5hZGRyZXNzID0gc2VjdGlvbi0+X3Jhd19zaXplOworCSAgICByZWxvY19jaGFpbi0+cmVsZW50LmFkZGVuZCA9IGFzeW0tPnZhbHVlOworCSAgICByZWxvY19jaGFpbi0+cmVsZW50Lmhvd3RvID0KKwkgICAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+Y29uc3RydWN0b3JfcmVsb2M7CisKKwkgICAgLyogU2V0IHVwIHRoZSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRvIGhvbGQgdGhlIHJlbG9jLiAgKi8KKwkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQ09OU1RSVUNUT1I7CisJICAgICsrc2VjdGlvbi0+cmVsb2NfY291bnQ7CisKKwkgICAgLyogQ29uc3RydWN0b3Igc2VjdGlvbnMgbXVzdCBiZSByb3VuZGVkIHRvIGEgYm91bmRhcnkKKwkgICAgICAgYmFzZWQgb24gdGhlIGJpdHNpemUuICBUaGVzZSBhcmUgbm90IHJlYWwgc2VjdGlvbnMtLQorCSAgICAgICB0aGV5IGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSB0aGUgbGlua2VyLS1zbyB0aGUgRUNPRkYKKwkgICAgICAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkuICAqLworCSAgICBiaXRzaXplID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPmNvbnN0cnVjdG9yX2JpdHNpemU7CisJICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDE7CisJICAgIHdoaWxlICgoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpIDwgYml0c2l6ZSAvIDgpCisJICAgICAgKytzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXI7CisKKwkgICAgcmVsb2NfY2hhaW4tPm5leHQgPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKKwkgICAgc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvY19jaGFpbjsKKwkgICAgc2VjdGlvbi0+X3Jhd19zaXplICs9IGJpdHNpemUgLyA4OworCisjZW5kaWYgLyogMCAqLworCisJICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyBhIGNvbnN0cnVjdG9yLiAgKi8KKwkgICAgYXN5bS0+ZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOworCSAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgYW4gRUNPRkYgc3ltYm9sIHRhYmxlLiAgKi8KKworYm9vbGVhbgorX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZQorICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZQorICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9zeW1fc2l6ZTsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKKyAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47CisgIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpCisgICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfc3ltX2luOworICBiZmRfc2l6ZV90eXBlIGludGVybmFsX3NpemU7CisgIGVjb2ZmX3N5bWJvbF90eXBlICppbnRlcm5hbDsKKyAgZWNvZmZfc3ltYm9sX3R5cGUgKmludGVybmFsX3B0cjsKKyAgY2hhciAqZXJhd19zcmM7CisgIGNoYXIgKmVyYXdfZW5kOworICBGRFIgKmZkcl9wdHI7CisgIEZEUiAqZmRyX2VuZDsKKworICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZG8gbm90aGluZy4gICovCisgIGlmIChlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHMgIT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBHZXQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKKwkJCQkJJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGludGVybmFsX3NpemUgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUpOworICBpbnRlcm5hbCA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGludGVybmFsX3NpemUpOworICBpZiAoaW50ZXJuYWwgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7CisgIGVyYXdfc3JjID0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0OworICBlcmF3X2VuZCA9IChlcmF3X3NyYworCSAgICAgICsgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4CisJCSAqIGV4dGVybmFsX2V4dF9zaXplKSk7CisgIGZvciAoOyBlcmF3X3NyYyA8IGVyYXdfZW5kOyBlcmF3X3NyYyArPSBleHRlcm5hbF9leHRfc2l6ZSwgaW50ZXJuYWxfcHRyKyspCisgICAgeworICAgICAgRVhUUiBpbnRlcm5hbF9lc3ltOworCisgICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXJhd19zcmMsICZpbnRlcm5hbF9lc3ltKTsKKyAgICAgIGludGVybmFsX3B0ci0+c3ltYm9sLm5hbWUgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3NleHQKKwkJCQkgICArIGludGVybmFsX2VzeW0uYXN5bS5pc3MpOworICAgICAgaWYgKCFlY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsICZpbnRlcm5hbF9lc3ltLmFzeW0sCisJCQkJICAmaW50ZXJuYWxfcHRyLT5zeW1ib2wsIDEsCisJCQkJICBpbnRlcm5hbF9lc3ltLndlYWtleHQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIC8qIFRoZSBhbHBoYSB1c2VzIGEgbmVnYXRpdmUgaWZkIGZpZWxkIGZvciBzZWN0aW9uIHN5bWJvbHMuICAqLworICAgICAgaWYgKGludGVybmFsX2VzeW0uaWZkID49IDApCisJaW50ZXJuYWxfcHRyLT5mZHIgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZmRyCisJCQkgICAgICsgaW50ZXJuYWxfZXN5bS5pZmQpOworICAgICAgZWxzZQorCWludGVybmFsX3B0ci0+ZmRyID0gTlVMTDsKKyAgICAgIGludGVybmFsX3B0ci0+bG9jYWwgPSBmYWxzZTsKKyAgICAgIGludGVybmFsX3B0ci0+bmF0aXZlID0gKFBUUikgZXJhd19zcmM7CisgICAgfQorCisgIC8qIFRoZSBsb2NhbCBzeW1ib2xzIG11c3QgYmUgYWNjZXNzZWQgdmlhIHRoZSBmZHIncywgYmVjYXVzZSB0aGUKKyAgICAgc3RyaW5nIGFuZCBhdXggaW5kaWNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGZkciBpbmZvcm1hdGlvbi4gICovCisgIGZkcl9wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5mZHI7CisgIGZkcl9lbmQgPSBmZHJfcHRyICsgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlmZE1heDsKKyAgZm9yICg7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCisgICAgeworICAgICAgY2hhciAqbHJhd19zcmM7CisgICAgICBjaGFyICpscmF3X2VuZDsKKworICAgICAgbHJhd19zcmMgPSAoKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfc3ltCisJCSAgKyBmZHJfcHRyLT5pc3ltQmFzZSAqIGV4dGVybmFsX3N5bV9zaXplKTsKKyAgICAgIGxyYXdfZW5kID0gbHJhd19zcmMgKyBmZHJfcHRyLT5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7CisgICAgICBmb3IgKDsKKwkgICBscmF3X3NyYyA8IGxyYXdfZW5kOworCSAgIGxyYXdfc3JjICs9IGV4dGVybmFsX3N5bV9zaXplLCBpbnRlcm5hbF9wdHIrKykKKwl7CisJICBTWU1SIGludGVybmFsX3N5bTsKKworCSAgKCpzd2FwX3N5bV9pbikgKGFiZmQsIChQVFIpIGxyYXdfc3JjLCAmaW50ZXJuYWxfc3ltKTsKKwkgIGludGVybmFsX3B0ci0+c3ltYm9sLm5hbWUgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3MKKwkJCQkgICAgICAgKyBmZHJfcHRyLT5pc3NCYXNlCisJCQkJICAgICAgICsgaW50ZXJuYWxfc3ltLmlzcyk7CisJICBpZiAoIWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgJmludGVybmFsX3N5bSwKKwkJCQkgICAgICAmaW50ZXJuYWxfcHRyLT5zeW1ib2wsIDAsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpbnRlcm5hbF9wdHItPmZkciA9IGZkcl9wdHI7CisJICBpbnRlcm5hbF9wdHItPmxvY2FsID0gdHJ1ZTsKKwkgIGludGVybmFsX3B0ci0+bmF0aXZlID0gKFBUUikgbHJhd19zcmM7CisJfQorICAgIH0KKworICBlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHMgPSBpbnRlcm5hbDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICAqLworCitsb25nCitfYmZkX2Vjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKKwkJCQkJJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUgKikpOworfQorCisvKiBHZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgKi8KKworbG9uZworX2JmZF9lY29mZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKK3sKKyAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOworICBlY29mZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKKyAgZWNvZmZfc3ltYm9sX3R5cGUgKipsb2NhdGlvbiA9IChlY29mZl9zeW1ib2xfdHlwZSAqKikgYWxvY2F0aW9uOworCisgIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCisgICAgcmV0dXJuIC0xOworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBzeW1iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzOworICB3aGlsZSAoY291bnRlciA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKQorICAgIHsKKyAgICAgICoobG9jYXRpb24rKykgPSBzeW1iYXNlKys7CisgICAgICBjb3VudGVyKys7CisgICAgfQorICAqbG9jYXRpb24rKyA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOworICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Cit9CisKKy8qIFR1cm4gRUNPRkYgdHlwZSBpbmZvcm1hdGlvbiBpbnRvIGEgcHJpbnRhYmxlIHN0cmluZy4KKyAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIGFuZCBlY29mZl90eXBlX3RvX3N0cmluZyBhcmUgZnJvbQorICAgZ2NjL21pcHMtdGR1bXAuYywgd2l0aCBzd2FwcGluZyBhZGRlZCBhbmQgdXNlZF9wdHIgcmVtb3ZlZC4gICovCisKKy8qIFdyaXRlIGFnZ3JlZ2F0ZSBpbmZvcm1hdGlvbiB0byBhIHN0cmluZy4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBzdHJpbmcsIHJuZHgsIGlzeW0sIHdoaWNoKQorICAgICBiZmQgKmFiZmQ7CisgICAgIEZEUiAqZmRyOworICAgICBjaGFyICpzdHJpbmc7CisgICAgIFJORFhSICpybmR4OworICAgICBsb25nIGlzeW07CisgICAgIGNvbnN0IGNoYXIgKndoaWNoOworeworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAgPQorICAgICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOworICB1bnNpZ25lZCBpbnQgaWZkID0gcm5keC0+cmZkOworICB1bnNpZ25lZCBpbnQgaW5keCA9IHJuZHgtPmluZGV4OworICBjb25zdCBjaGFyICpuYW1lOworICAKKyAgaWYgKGlmZCA9PSAweGZmZikKKyAgICBpZmQgPSBpc3ltOworCisgIC8qIEFuIGlmZCBvZiAtMSBpcyBhbiBvcGFxdWUgdHlwZS4gIEFuIGVzY2FwZWQgaW5kZXggb2YgMCBpcyBhCisgICAgIHN0cnVjdCByZXR1cm4gdHlwZSBvZiBhIHByb2NlZHVyZSBjb21waWxlZCB3aXRob3V0IC1nLiAgKi8KKyAgaWYgKGlmZCA9PSAweGZmZmZmZmZmCisgICAgICB8fCAocm5keC0+cmZkID09IDB4ZmZmICYmIGluZHggPT0gMCkpCisgICAgbmFtZSA9ICI8dW5kZWZpbmVkPiI7CisgIGVsc2UgaWYgKGluZHggPT0gaW5kZXhOaWwpCisgICAgbmFtZSA9ICI8bm8gbmFtZT4iOworICBlbHNlCisgICAgeworICAgICAgU1lNUiBzeW07CisKKyAgICAgIGlmIChkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQgPT0gTlVMTCkKKwlmZHIgPSBkZWJ1Z19pbmZvLT5mZHIgKyBpZmQ7CisgICAgICBlbHNlCisJeworCSAgUkZEVCByZmQ7CisKKwkgICgqZGVidWdfc3dhcC0+c3dhcF9yZmRfaW4pIChhYmZkLAorCQkJCSAgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQKKwkJCQkgICAgICAgKyAoKGZkci0+cmZkQmFzZSArIGlmZCkKKwkJCQkJICAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3JmZF9zaXplKSksCisJCQkJICAgICAgJnJmZCk7CisJICBmZHIgPSBkZWJ1Z19pbmZvLT5mZHIgKyByZmQ7CisJfQorCisgICAgICBpbmR4ICs9IGZkci0+aXN5bUJhc2U7CisKKyAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLAorCQkJCSAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCQkJCSAgICsgaW5keCAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKSwKKwkJCQkgICZzeW0pOworCisgICAgICBuYW1lID0gZGVidWdfaW5mby0+c3MgKyBmZHItPmlzc0Jhc2UgKyBzeW0uaXNzOworICAgIH0KKworICBzcHJpbnRmIChzdHJpbmcsCisJICAgIiVzICVzIHsgaWZkID0gJXUsIGluZGV4ID0gJWx1IH0iLAorCSAgIHdoaWNoLCBuYW1lLCBpZmQsCisJICAgKChsb25nKSBpbmR4CisJICAgICsgZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKTsKK30KKworLyogQ29udmVydCB0aGUgdHlwZSBpbmZvcm1hdGlvbiB0byBzdHJpbmcgZm9ybWF0LiAgKi8KKworc3RhdGljIGNoYXIgKgorZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCkKKyAgICAgYmZkICphYmZkOworICAgICBGRFIgKmZkcjsKKyAgICAgdW5zaWduZWQgaW50IGluZHg7Cit7CisgIHVuaW9uIGF1eF9leHQgKmF1eF9wdHI7CisgIGludCBiaWdlbmRpYW47CisgIEFVWFUgdTsKKyAgc3RydWN0IHF1YWwgeworICAgIHVuc2lnbmVkIGludCAgdHlwZTsKKyAgICBpbnQgIGxvd19ib3VuZDsKKyAgICBpbnQgIGhpZ2hfYm91bmQ7CisgICAgaW50ICBzdHJpZGU7CisgIH0gcXVhbGlmaWVyc1s3XTsKKyAgdW5zaWduZWQgaW50IGJhc2ljX3R5cGU7CisgIGludCBpOworICBjaGFyIGJ1ZmZlcjFbMTAyNF07CisgIHN0YXRpYyBjaGFyIGJ1ZmZlcjJbMTAyNF07CisgIGNoYXIgKnAxID0gYnVmZmVyMTsKKyAgY2hhciAqcDIgPSBidWZmZXIyOworICBSTkRYUiBybmR4OworCisgIGF1eF9wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9hdXggKyBmZHItPmlhdXhCYXNlOworICBiaWdlbmRpYW4gPSBmZHItPmZCaWdlbmRpYW47CisKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICB7CisgICAgICBxdWFsaWZpZXJzW2ldLmxvd19ib3VuZCA9IDA7CisgICAgICBxdWFsaWZpZXJzW2ldLmhpZ2hfYm91bmQgPSAwOworICAgICAgcXVhbGlmaWVyc1tpXS5zdHJpZGUgPSAwOworICAgIH0KKworICBpZiAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdKSA9PSAoYmZkX3ZtYSkgLTEpCisgICAgcmV0dXJuICItMSAobm8gdHlwZSkiOworICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrK10uYV90aSwgJnUudGkpOworCisgIGJhc2ljX3R5cGUgPSB1LnRpLmJ0OworICBxdWFsaWZpZXJzWzBdLnR5cGUgPSB1LnRpLnRxMDsKKyAgcXVhbGlmaWVyc1sxXS50eXBlID0gdS50aS50cTE7CisgIHF1YWxpZmllcnNbMl0udHlwZSA9IHUudGkudHEyOworICBxdWFsaWZpZXJzWzNdLnR5cGUgPSB1LnRpLnRxMzsKKyAgcXVhbGlmaWVyc1s0XS50eXBlID0gdS50aS50cTQ7CisgIHF1YWxpZmllcnNbNV0udHlwZSA9IHUudGkudHE1OworICBxdWFsaWZpZXJzWzZdLnR5cGUgPSB0cU5pbDsKKworICAvKgorICAgKiBHbyBnZXQgdGhlIGJhc2ljIHR5cGUuCisgICAqLworICBzd2l0Y2ggKGJhc2ljX3R5cGUpCisgICAgeworICAgIGNhc2UgYnROaWw6CQkJLyogdW5kZWZpbmVkICovCisgICAgICBzdHJjcHkgKHAxLCAibmlsIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnRBZHI6CQkJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KKyAgICAgIHN0cmNweSAocDEsICJhZGRyZXNzIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnRDaGFyOgkJLyogY2hhcmFjdGVyICovCisgICAgICBzdHJjcHkgKHAxLCAiY2hhciIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0VUNoYXI6CQkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KKyAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBjaGFyIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnRTaG9ydDoJCS8qIHNob3J0ICovCisgICAgICBzdHJjcHkgKHAxLCAic2hvcnQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidFVTaG9ydDoJCS8qIHVuc2lnbmVkIHNob3J0ICovCisgICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgc2hvcnQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidEludDoJCQkvKiBpbnQgKi8KKyAgICAgIHN0cmNweSAocDEsICJpbnQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidFVJbnQ6CQkvKiB1bnNpZ25lZCBpbnQgKi8KKyAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBpbnQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidExvbmc6CQkvKiBsb25nICovCisgICAgICBzdHJjcHkgKHAxLCAibG9uZyIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0VUxvbmc6CQkvKiB1bnNpZ25lZCBsb25nICovCisgICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgbG9uZyIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0RmxvYXQ6CQkvKiBmbG9hdCAocmVhbCkgKi8KKyAgICAgIHN0cmNweSAocDEsICJmbG9hdCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0RG91YmxlOgkJLyogRG91YmxlIChyZWFsKSAqLworICAgICAgc3RyY3B5IChwMSwgImRvdWJsZSIpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFN0cnVjdHVyZXMgYWRkIDEtMiBhdXggd29yZHM6CisJIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byBzdHJ1Y3QgZGVmOworCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLworCisgICAgY2FzZSBidFN0cnVjdDoJCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLworICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7CisgICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCisJCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKKwkJCSAgICAic3RydWN0Iik7CisgICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBVbmlvbnMgYWRkIDEtMiBhdXggd29yZHM6CisJIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byB1bmlvbiBkZWY7CisJIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCisKKyAgICBjYXNlIGJ0VW5pb246CQkvKiBVbmlvbiAqLworICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7CisgICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCisJCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKKwkJCSAgICAidW5pb24iKTsKKyAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEVudW1lcmF0aW9ucyBhZGQgMS0yIGF1eCB3b3JkczoKKwkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIGVudW0gZGVmOworCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLworCisgICAgY2FzZSBidEVudW06CQkvKiBFbnVtZXJhdGlvbiAqLworICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7CisgICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCisJCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKKwkJCSAgICAiZW51bSIpOworICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgYnRUeXBlZGVmOgkJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLworICAgICAgc3RyY3B5IChwMSwgInR5cGVkZWYiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidFJhbmdlOgkJLyogc3VicmFuZ2Ugb2YgaW50ICovCisgICAgICBzdHJjcHkgKHAxLCAic3VicmFuZ2UiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidFNldDoJCQkvKiBwYXNjYWwgc2V0cyAqLworICAgICAgc3RyY3B5IChwMSwgInNldCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0Q29tcGxleDoJCS8qIGZvcnRyYW4gY29tcGxleCAqLworICAgICAgc3RyY3B5IChwMSwgImNvbXBsZXgiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidERDb21wbGV4OgkJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLworICAgICAgc3RyY3B5IChwMSwgImRvdWJsZSBjb21wbGV4Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnRJbmRpcmVjdDoJCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCisgICAgICBzdHJjcHkgKHAxLCAiZm9yd2FyZC91bmFtZWQgdHlwZWRlZiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0Rml4ZWREZWM6CQkvKiBGaXhlZCBEZWNpbWFsICovCisgICAgICBzdHJjcHkgKHAxLCAiZml4ZWQgZGVjaW1hbCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0RmxvYXREZWM6CQkvKiBGbG9hdCBEZWNpbWFsICovCisgICAgICBzdHJjcHkgKHAxLCAiZmxvYXQgZGVjaW1hbCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0U3RyaW5nOgkJLyogVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZyAqLworICAgICAgc3RyY3B5IChwMSwgInN0cmluZyIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0Qml0OgkJCS8qIEFsaWduZWQgQml0IFN0cmluZyAqLworICAgICAgc3RyY3B5IChwMSwgImJpdCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ0UGljdHVyZToJCS8qIFBpY3R1cmUgKi8KKyAgICAgIHN0cmNweSAocDEsICJwaWN0dXJlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnRWb2lkOgkJLyogVm9pZCAqLworICAgICAgc3RyY3B5IChwMSwgInZvaWQiKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHNwcmludGYgKHAxLCBfKCJVbmtub3duIGJhc2ljIHR5cGUgJWQiKSwgKGludCkgYmFzaWNfdHlwZSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcDEgKz0gc3RybGVuIChidWZmZXIxKTsKKworICAvKgorICAgKiBJZiB0aGlzIGlzIGEgYml0ZmllbGQsIGdldCB0aGUgYml0c2l6ZS4KKyAgICovCisgIGlmICh1LnRpLmZCaXRmaWVsZCkKKyAgICB7CisgICAgICBpbnQgYml0c2l6ZTsKKworICAgICAgYml0c2l6ZSA9IEFVWF9HRVRfV0lEVEggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsrXSk7CisgICAgICBzcHJpbnRmIChwMSwgIiA6ICVkIiwgYml0c2l6ZSk7CisgICAgICBwMSArPSBzdHJsZW4gKGJ1ZmZlcjEpOworICAgIH0KKworCisgIC8qCisgICAqIERlYWwgd2l0aCBhbnkgcXVhbGlmaWVycy4KKyAgICovCisgIGlmIChxdWFsaWZpZXJzWzBdLnR5cGUgIT0gdHFOaWwpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFNuYXJmIHVwIGFueSBhcnJheSBib3VuZHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICBBcnJheXMKKyAgICAgICAqIHN0b3JlIDUgc3VjY2Vzc2l2ZSB3b3JkcyBpbiB0aGUgYXV4LiB0YWJsZToKKyAgICAgICAqCXdvcmQgMAlSTkRYUiB0byB0eXBlIG9mIHRoZSBib3VuZHMgKGllLCBpbnQpCisgICAgICAgKgl3b3JkIDEJQ3VycmVudCBmaWxlIGRlc2NyaXB0b3IgaW5kZXgKKyAgICAgICAqCXdvcmQgMglsb3cgYm91bmQKKyAgICAgICAqCXdvcmQgMwloaWdoIGJvdW5kIChvciAtMSBpZiBbXSkKKyAgICAgICAqCXdvcmQgNAlzdHJpZGUgc2l6ZSBpbiBiaXRzCisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJeworCSAgaWYgKHF1YWxpZmllcnNbaV0udHlwZSA9PSB0cUFycmF5KQorCSAgICB7CisJICAgICAgcXVhbGlmaWVyc1tpXS5sb3dfYm91bmQgPQorCQlBVVhfR0VUX0ROTE9XIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMl0pOworCSAgICAgIHF1YWxpZmllcnNbaV0uaGlnaF9ib3VuZCA9CisJCUFVWF9HRVRfRE5ISUdIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrM10pOworCSAgICAgIHF1YWxpZmllcnNbaV0uc3RyaWRlID0KKwkJQVVYX0dFVF9XSURUSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzRdKTsKKwkgICAgICBpbmR4ICs9IDU7CisJICAgIH0KKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBOb3cgcHJpbnQgb3V0IHRoZSBxdWFsaWZpZXJzLgorICAgICAgICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIHN3aXRjaCAocXVhbGlmaWVyc1tpXS50eXBlKQorCSAgICB7CisJICAgIGNhc2UgdHFOaWw6CisJICAgIGNhc2UgdHFNYXg6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSB0cVB0cjoKKwkgICAgICBzdHJjcHkgKHAyLCAicHRyIHRvICIpOworCSAgICAgIHAyICs9IHNpemVvZiAoInB0ciB0byAiKS0xOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgdHFWb2w6CisJICAgICAgc3RyY3B5IChwMiwgInZvbGF0aWxlICIpOworCSAgICAgIHAyICs9IHNpemVvZiAoInZvbGF0aWxlICIpLTE7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSB0cUZhcjoKKwkgICAgICBzdHJjcHkgKHAyLCAiZmFyICIpOworCSAgICAgIHAyICs9IHNpemVvZiAoImZhciAiKS0xOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgdHFQcm9jOgorCSAgICAgIHN0cmNweSAocDIsICJmdW5jLiByZXQuICIpOworCSAgICAgIHAyICs9IHNpemVvZiAoImZ1bmMuIHJldC4gIik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSB0cUFycmF5OgorCSAgICAgIHsKKwkJaW50IGZpcnN0X2FycmF5ID0gaTsKKwkJaW50IGo7CisKKwkJLyogUHJpbnQgYXJyYXkgYm91bmRzIHJldmVyc2VkIChpZSwgaW4gdGhlIG9yZGVyIHRoZSBDCisJCSAgIHByb2dyYW1tZXIgd3JpdGVzIHRoZW0pLiAgQyBpcyBzdWNoIGEgZnVuIGxhbmd1YWdlLi4uLiAqLworCisJCXdoaWxlIChpIDwgNSAmJiBxdWFsaWZpZXJzW2krMV0udHlwZSA9PSB0cUFycmF5KQorCQkgIGkrKzsKKworCQlmb3IgKGogPSBpOyBqID49IGZpcnN0X2FycmF5OyBqLS0pCisJCSAgeworCQkgICAgc3RyY3B5IChwMiwgImFycmF5IFsiKTsKKwkJICAgIHAyICs9IHNpemVvZiAoImFycmF5IFsiKS0xOworCQkgICAgaWYgKHF1YWxpZmllcnNbal0ubG93X2JvdW5kICE9IDApCisJCSAgICAgIHNwcmludGYgKHAyLAorCQkJICAgICAgICIlbGQ6JWxkIHslbGQgYml0c30iLAorCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLmxvd19ib3VuZCwKKwkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kLAorCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLnN0cmlkZSk7CisKKwkJICAgIGVsc2UgaWYgKHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCAhPSAtMSkKKwkJICAgICAgc3ByaW50ZiAocDIsCisJCQkgICAgICAgIiVsZCB7JWxkIGJpdHN9IiwKKwkJCSAgICAgICAobG9uZykgKHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCArIDEpLAorCQkJICAgICAgIChsb25nKSAocXVhbGlmaWVyc1tqXS5zdHJpZGUpKTsKKworCQkgICAgZWxzZQorCQkgICAgICBzcHJpbnRmIChwMiwgIiB7JWxkIGJpdHN9IiwgKGxvbmcpIChxdWFsaWZpZXJzW2pdLnN0cmlkZSkpOworCisJCSAgICBwMiArPSBzdHJsZW4gKHAyKTsKKwkJICAgIHN0cmNweSAocDIsICJdIG9mICIpOworCQkgICAgcDIgKz0gc2l6ZW9mICgiXSBvZiAiKS0xOworCQkgIH0KKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHN0cmNweSAocDIsIGJ1ZmZlcjEpOworICByZXR1cm4gYnVmZmVyMjsKK30KKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IEVDT0ZGIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KKworLypBUkdTVVNFRCovCit2b2lkCitfYmZkX2Vjb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqYWJmZDsJCQkvKiBJZ25vcmVkLiAgKi8KKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBzeW1ib2xfaW5mbyAqcmV0OworeworICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKK30KKworLyogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGxvY2FsIGxhYmVsLiAgKi8KKworLypBUkdTVVNFRCovCitib29sZWFuCitfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiBuYW1lWzBdID09ICckJzsKK30KKworLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUNPRkYgc3ltYm9sLiAgKi8KKwordm9pZAorX2JmZF9lY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZmlsZXA7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCisgICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKWZpbGVwOworCisgIHN3aXRjaCAoaG93KQorICAgIHsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKKyAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKKyAgICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCisJeworCSAgU1lNUiBlY29mZl9zeW07CisJCisJICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKKwkJCQkgICAgICAmZWNvZmZfc3ltKTsKKwkgIGZwcmludGYgKGZpbGUsICJlY29mZiBsb2NhbCAiKTsKKwkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfc3ltLnZhbHVlKTsKKwkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX3N5bS5zdCwKKwkJICAgKHVuc2lnbmVkKSBlY29mZl9zeW0uc2MpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBFWFRSIGVjb2ZmX2V4dDsKKworCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCisJCQkJICAgICAgJmVjb2ZmX2V4dCk7CisJICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgZXh0ZXJuICIpOworCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7CisJICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKKwkJICAgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYyk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKKyAgICAgIC8qIFByaW50IG91dCB0aGUgc3ltYm9scyBpbiBhIHJlYXNvbmFibGUgd2F5ICovCisgICAgICB7CisJY2hhciB0eXBlOworCWludCBwb3M7CisJRVhUUiBlY29mZl9leHQ7CisJY2hhciBqbXB0Ymw7CisJY2hhciBjb2JvbF9tYWluOworCWNoYXIgd2Vha2V4dDsKKworCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCisJICB7CisJICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAorCQkJCQkmZWNvZmZfZXh0LmFzeW0pOworCSAgICB0eXBlID0gJ2wnOworCSAgICBwb3MgPSAoKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCisJCSAgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0pCisJCSAgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQorCQkgICArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKKwkgICAgam1wdGJsID0gJyAnOworCSAgICBjb2JvbF9tYWluID0gJyAnOworCSAgICB3ZWFrZXh0ID0gJyAnOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCisJCQkJCSZlY29mZl9leHQpOworCSAgICB0eXBlID0gJ2UnOworCSAgICBwb3MgPSAoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKKwkJICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0KQorCQkgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKKwkgICAgam1wdGJsID0gZWNvZmZfZXh0LmptcHRibCA/ICdqJyA6ICcgJzsKKwkgICAgY29ib2xfbWFpbiA9IGVjb2ZmX2V4dC5jb2JvbF9tYWluID8gJ2MnIDogJyAnOworCSAgICB3ZWFrZXh0ID0gZWNvZmZfZXh0LndlYWtleHQgPyAndycgOiAnICc7CisJICB9CisKKwlmcHJpbnRmIChmaWxlLCAiWyUzZF0gJWMgIiwKKwkJIHBvcywgdHlwZSk7CisJZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7CisJZnByaW50ZiAoZmlsZSwgIiBzdCAleCBzYyAleCBpbmR4ICV4ICVjJWMlYyAlcyIsCisJCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAorCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYywKKwkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uaW5kZXgsCisJCSBqbXB0YmwsIGNvYm9sX21haW4sIHdlYWtleHQsCisJCSBzeW1ib2wtPm5hbWUpOworCisJaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHIgIT0gTlVMTAorCSAgICAmJiBlY29mZl9leHQuYXN5bS5pbmRleCAhPSBpbmRleE5pbCkKKwkgIHsKKwkgICAgRkRSICpmZHI7CisJICAgIHVuc2lnbmVkIGludCBpbmR4OworCSAgICBpbnQgYmlnZW5kaWFuOworCSAgICBiZmRfc2l6ZV90eXBlIHN5bV9iYXNlOworCSAgICB1bmlvbiBhdXhfZXh0ICphdXhfYmFzZTsKKworCSAgICBmZHIgPSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyOworCSAgICBpbmR4ID0gZWNvZmZfZXh0LmFzeW0uaW5kZXg7CisKKwkgICAgLyogc3ltX2Jhc2UgaXMgdXNlZCB0byBtYXAgdGhlIGZkciByZWxhdGl2ZSBpbmRpY2VzIHdoaWNoCisJICAgICAgIGFwcGVhciBpbiB0aGUgZmlsZSB0byB0aGUgcG9zaXRpb24gbnVtYmVyIHdoaWNoIHdlIGFyZQorCSAgICAgICB1c2luZy4gICovCisJICAgIHN5bV9iYXNlID0gZmRyLT5pc3ltQmFzZTsKKwkgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKKwkgICAgICBzeW1fYmFzZSArPQorCQllY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKKworCSAgICAvKiBhdXhfYmFzZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGF1eCBlbnRyaWVzIGZvciB0aGlzIGZpbGU7CisJICAgICAgIGFzeW0uaW5kZXggaXMgYW4gb2Zmc2V0IGZyb20gdGhpcy4gICovCisJICAgIGF1eF9iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eAorCQkJKyBmZHItPmlhdXhCYXNlKTsKKworCSAgICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXI7IHRoZQorCSAgICAgICBvcmRlciBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlIGZkci4gICovCisJICAgIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKKworCSAgICAvKiBUaGlzIHN3aXRjaCBpcyBiYXNpY2FsbHkgZnJvbSBnY2MvbWlwcy10ZHVtcC5jICAqLworCSAgICBzd2l0Y2ggKGVjb2ZmX2V4dC5hc3ltLnN0KQorCSAgICAgIHsKKwkgICAgICBjYXNlIHN0TmlsOgorCSAgICAgIGNhc2Ugc3RMYWJlbDoKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIHN0RmlsZToKKwkgICAgICBjYXNlIHN0QmxvY2s6CisJCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiKSwKKwkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOworCQlicmVhazsKKworCSAgICAgIGNhc2Ugc3RFbmQ6CisJCWlmIChlY29mZl9leHQuYXN5bS5zYyA9PSBzY1RleHQKKwkJICAgIHx8IGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjSW5mbykKKwkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksCisJCQkgICAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOworCQllbHNlCisJCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLCAKKwkJCSAgICgobG9uZykKKwkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCisJCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCisJCQkgICAgICsgc3ltX2Jhc2UpKSk7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBzdFByb2M6CisJICAgICAgY2FzZSBzdFN0YXRpY1Byb2M6CisJCWlmIChFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQorCQkgIDsKKwkJZWxzZSBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQorCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIpLAorCQkJICAgKChsb25nKQorCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKKwkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKKwkJCSAgICAgKyBzeW1fYmFzZSkpLAorCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCArIDEpKTsKKwkJZWxzZQorCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiKSwKKwkJCSAgICgobG9uZykgaW5keAorCQkJICAgICsgKGxvbmcpIHN5bV9iYXNlCisJCQkgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCkKKwkJCSAgICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBzdFN0cnVjdDoKKwkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIiksCisJCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIHN0VW5pb246CisJCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIiksCisJCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIHN0RW51bToKKwkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAorCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7CisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJaWYgKCEgRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKKwkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIFR5cGU6ICVzIiksCisJCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KSk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KK30KKwwKKy8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2Vjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKKyAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7CisgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NzX3NpemU7CisgIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKKyAgYXJlbGVudCAqcnB0cjsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTAorICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMAorICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgICAoc2l6ZW9mIChhcmVsZW50KQorCQkJCQkgICAgKiBzZWN0aW9uLT5yZWxvY19jb3VudCkpOworICBleHRlcm5hbF9yZWxvY19zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKKyAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzX3NpemUpOworICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwKKyAgICAgIHx8IGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCisgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpID0gMCwgcnB0ciA9IGludGVybmFsX3JlbG9jczsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyssIHJwdHIrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50ZXJuOworCisgICAgICAoKmJhY2tlbmQtPnN3YXBfcmVsb2NfaW4pIChhYmZkLAorCQkJCSBleHRlcm5hbF9yZWxvY3MgKyBpICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKKwkJCQkgJmludGVybik7CisKKyAgICAgIGlmIChpbnRlcm4ucl9leHRlcm4pCisJeworCSAgLyogcl9zeW1uZHggaXMgYW4gaW5kZXggaW50byB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCisJICBCRkRfQVNTRVJUIChpbnRlcm4ucl9zeW1uZHggPj0gMAorCQkgICAgICAmJiAoaW50ZXJuLnJfc3ltbmR4CisJCQkgIDwgKGVjb2ZmX2RhdGEgKGFiZmQpCisJCQkgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKKwkgIHJwdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGludGVybi5yX3N5bW5keDsKKwkgIHJwdHItPmFkZGVuZCA9IDA7CisJfQorICAgICAgZWxzZSBpZiAoaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTk9ORQorCSAgICAgICB8fCBpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCisJeworCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKwkgIHJwdHItPmFkZGVuZCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIENPTlNUIGNoYXIgKnNlY19uYW1lOworCSAgYXNlY3Rpb24gKnNlYzsKKworCSAgLyogcl9zeW1uZHggaXMgYSBzZWN0aW9uIGtleS4gICovCisJICBzd2l0Y2ggKGludGVybi5yX3N5bW5keCkKKwkgICAgeworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fVEVYVDogIHNlY19uYW1lID0gIi50ZXh0IjsgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkRBVEE6IHNlY19uYW1lID0gIi5yZGF0YSI7IGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fREFUQTogIHNlY19uYW1lID0gIi5kYXRhIjsgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6IHNlY19uYW1lID0gIi5zZGF0YSI7IGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0JTUzogIHNlY19uYW1lID0gIi5zYnNzIjsgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fQlNTOiAgIHNlY19uYW1lID0gIi5ic3MiOyAgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fSU5JVDogIHNlY19uYW1lID0gIi5pbml0IjsgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODogIHNlY19uYW1lID0gIi5saXQ4IjsgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUNDogIHNlY19uYW1lID0gIi5saXQ0IjsgIGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fWERBVEE6IHNlY19uYW1lID0gIi54ZGF0YSI7IGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUERBVEE6IHNlY19uYW1lID0gIi5wZGF0YSI7IGJyZWFrOworCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fRklOSTogIHNlY19uYW1lID0gIi5maW5pIjsgYnJlYWs7CisJICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVRBOiAgc2VjX25hbWUgPSAiLmxpdGEiOyAgYnJlYWs7CisJICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SQ09OU1Q6IHNlY19uYW1lID0gIi5yY29uc3QiOyBicmVhazsKKwkgICAgZGVmYXVsdDogYWJvcnQgKCk7CisJICAgIH0KKworCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lKTsKKwkgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCisJICAgIGFib3J0ICgpOworCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOworCisJICBycHRyLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7CisJfQorCisgICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLnJfdmFkZHIgLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKKworICAgICAgLyogTGV0IHRoZSBiYWNrZW5kIHNlbGVjdCB0aGUgaG93dG8gZmllbGQgYW5kIGRvIGFueSBvdGhlcgorCSByZXF1aXJlZCBwcm9jZXNzaW5nLiAgKi8KKyAgICAgICgqYmFja2VuZC0+YWRqdXN0X3JlbG9jX2luKSAoYWJmZCwgJmludGVybiwgcnB0cik7CisgICAgfQorCisgIGJmZF9yZWxlYXNlIChhYmZkLCBleHRlcm5hbF9yZWxvY3MpOworCisgIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEdldCBhIGNhbm9uaWNhbCBsaXN0IG9mIHJlbG9jcy4gICovCisKK2xvbmcKK19iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICB1bnNpZ25lZCBpbnQgY291bnQ7CisKKyAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAKKyAgICB7CisgICAgICBhcmVsZW50X2NoYWluICpjaGFpbjsKKworICAgICAgLyogVGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgbm90IHRoZSBmaWxlLCBzbyB0YWtlCisJIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRhdGEgYXJlYQorCSBwcm92aWRlZC4gICovCisgICAgICBmb3IgKGNvdW50ID0gMCwgY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKKwkgICBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OworCSAgIGNvdW50KyssIGNoYWluID0gY2hhaW4tPm5leHQpCisJKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7CisgICAgfQorICBlbHNlCisgICAgeyAKKyAgICAgIGFyZWxlbnQgKnRibHB0cjsKKworICAgICAgaWYgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSA9PSBmYWxzZSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247CisKKyAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQorCSpyZWxwdHIrKyA9IHRibHB0cisrOworICAgIH0KKworICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKKworICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Cit9CisMCisvKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCisgICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKKyAgIHdhbnRlZCBsb2NhdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgaWdub3JlX3N5bWJvbHMsIG9mZnNldCwKKwkJCSAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGFzeW1ib2wgKippZ25vcmVfc3ltYm9sczsKKyAgICAgYmZkX3ZtYSBvZmZzZXQ7CisgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7CisgICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOworICAgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyOworeworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKKyAgICA9ICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOworICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIEZEUidzLiAgKi8KKyAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgZGVidWdfaW5mbykKKyAgICAgIHx8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICBlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPQorCSgoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKQorCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpKSk7CisgICAgICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgbGluZV9pbmZvID0gZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOworCisgIHJldHVybiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsIGRlYnVnX2luZm8sCisJCQkJIGRlYnVnX3N3YXAsIGxpbmVfaW5mbywgZmlsZW5hbWVfcHRyLAorCQkJCSBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cik7Cit9CisMCisvKiBDb3B5IHByaXZhdGUgQkZEIGRhdGEuICBUaGlzIGlzIGNhbGxlZCBieSBvYmpjb3B5IGFuZCBzdHJpcC4gIFdlCisgICB1c2UgaXQgdG8gY29weSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gb25lIEJGRCB0byB0aGUKKyAgIG90aGVyLiAgSXQgd291bGQgYmUgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byByZXByZXNlbnQgdGhlIEVDT0ZGCisgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGEKKyAgIGxvdCBvZiB3b3JrLCBhbmQgdGhlcmUgd291bGQgYmUgbGl0dGxlIGdhaW4gKGdhcywgZ2RiLCBhbmQgbGQKKyAgIGFscmVhZHkgYWNjZXNzIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdmlhIHRoZQorICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUsIGFuZCB0aGF0IHN0cnVjdHVyZSB3b3VsZCBoYXZlIHRvIGJlCisgICByZXRhaW5lZCBpbiBvcmRlciB0byBzdXBwb3J0IEVDT0ZGIGRlYnVnZ2luZyBpbiBNSVBTIEVMRikuCisKKyAgIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBFQ09GRiBleHRlcm5hbCBzeW1ib2xzIGNvbWVzIGZyb20KKyAgIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoaXMgZnVuY3Rpb24gb25seSBoYW5kbGVzIHRoZSBvdGhlciBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uLiAgKi8KKworYm9vbGVhbgorX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQ7CisgICAgIGJmZCAqb2JmZDsKK3sKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlpbmZvID0gJmVjb2ZmX2RhdGEgKGliZmQpLT5kZWJ1Z19pbmZvOworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb2luZm8gPSAmZWNvZmZfZGF0YSAob2JmZCktPmRlYnVnX2luZm87CisgIHJlZ2lzdGVyIGludCBpOworICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7CisgIHNpemVfdCBjOworICBib29sZWFuIGxvY2FsOworCisgIC8qIFdlIG9ubHkgd2FudCB0byBjb3B5IGluZm9ybWF0aW9uIG92ZXIgaWYgYm90aCBCRkQncyB1c2UgRUNPRkYKKyAgICAgZm9ybWF0LiAgKi8KKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBDb3B5IHRoZSBHUCB2YWx1ZSBhbmQgdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KKyAgZWNvZmZfZGF0YSAob2JmZCktPmdwID0gZWNvZmZfZGF0YSAoaWJmZCktPmdwOworICBlY29mZl9kYXRhIChvYmZkKS0+Z3BybWFzayA9IGVjb2ZmX2RhdGEgKGliZmQpLT5ncHJtYXNrOworICBlY29mZl9kYXRhIChvYmZkKS0+ZnBybWFzayA9IGVjb2ZmX2RhdGEgKGliZmQpLT5mcHJtYXNrOworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgIGVjb2ZmX2RhdGEgKG9iZmQpLT5jcHJtYXNrW2ldID0gZWNvZmZfZGF0YSAoaWJmZCktPmNwcm1hc2tbaV07CisKKyAgLyogQ29weSB0aGUgdmVyc2lvbiBzdGFtcC4gICovCisgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIudnN0YW1wID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci52c3RhbXA7CisKKyAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIGRvbid0IGNvcHkgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgIGMgPSBiZmRfZ2V0X3N5bWNvdW50IChvYmZkKTsKKyAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG9iZmQpOworICBpZiAoYyA9PSAwIHx8IHN5bV9wdHJfcHRyID09IChhc3ltYm9sICoqKSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFNlZSBpZiB0aGVyZSBhcmUgYW55IGxvY2FsIHN5bWJvbHMuICAqLworICBsb2NhbCA9IGZhbHNlOworICBmb3IgKDsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKKyAgICB7CisgICAgICBpZiAoZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPmxvY2FsKQorCXsKKwkgIGxvY2FsID0gdHJ1ZTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGxvY2FsKQorICAgIHsKKyAgICAgIC8qIFRoZXJlIGFyZSBzb21lIGxvY2FsIHN5bWJvbHMuICBXZSBqdXN0IGJyaW5nIG92ZXIgYWxsIHRoZQorCSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBGSVhNRTogVGhpcyBpcyBub3QgcXVpdGUgdGhlIHJpZ2h0CisJIHRoaW5nIHRvIGRvLiAgSWYgdGhlIHVzZXIgaGFzIGFza2VkIHVzIHRvIGRpc2NhcmQgYWxsCisJIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgZ29pbmcgdG8gd2luZCB1cAorCSBrZWVwaW5nIGl0IGJlY2F1c2UgdGhlcmUgd2lsbCBwcm9iYWJseSBiZSBzb21lIGxvY2FsIHN5bWJvbAorCSB3aGljaCBvYmpjb3B5IGRpZCBub3QgZGlzY2FyZC4gIFdlIHNob3VsZCBhY3R1YWxseSBicmVhaworCSBhcGFydCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBvbmx5IGtlZXAgdGhhdCB3aGljaAorCSBhcHBsaWVzIHRvIHRoZSBzeW1ib2xzIHdlIHdhbnQgdG8ga2VlcC4gICovCisgICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlsaW5lTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pbGluZU1heDsKKyAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuY2JMaW5lID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5jYkxpbmU7CisgICAgICBvaW5mby0+bGluZSA9IGlpbmZvLT5saW5lOworCisgICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlkbk1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWRuTWF4OworICAgICAgb2luZm8tPmV4dGVybmFsX2RuciA9IGlpbmZvLT5leHRlcm5hbF9kbnI7CisKKyAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXBkTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXg7CisgICAgICBvaW5mby0+ZXh0ZXJuYWxfcGRyID0gaWluZm8tPmV4dGVybmFsX3BkcjsKKworICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pc3ltTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pc3ltTWF4OworICAgICAgb2luZm8tPmV4dGVybmFsX3N5bSA9IGlpbmZvLT5leHRlcm5hbF9zeW07CisKKyAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaW9wdE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaW9wdE1heDsKKyAgICAgIG9pbmZvLT5leHRlcm5hbF9vcHQgPSBpaW5mby0+ZXh0ZXJuYWxfb3B0OworCisgICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlhdXhNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlhdXhNYXg7CisgICAgICBvaW5mby0+ZXh0ZXJuYWxfYXV4ID0gaWluZm8tPmV4dGVybmFsX2F1eDsKKworICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzc01heDsKKyAgICAgIG9pbmZvLT5zcyA9IGlpbmZvLT5zczsKKworICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heDsKKyAgICAgIG9pbmZvLT5leHRlcm5hbF9mZHIgPSBpaW5mby0+ZXh0ZXJuYWxfZmRyOworCisgICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmNyZmQgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmNyZmQ7CisgICAgICBvaW5mby0+ZXh0ZXJuYWxfcmZkID0gaWluZm8tPmV4dGVybmFsX3JmZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBhcmUgZGlzY2FyZGluZyBhbGwgdGhlIGxvY2FsIHN5bWJvbCBpbmZvcm1hdGlvbi4gIExvb2sKKwkgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIEZEUgorCSBvciBhdXggaW5mb3JtYXRpb24uICAqLworICAgICAgYyA9IGJmZF9nZXRfc3ltY291bnQgKG9iZmQpOworICAgICAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG9iZmQpOworICAgICAgZm9yICg7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCisJeworCSAgRVhUUiBlc3ltOworCisJICAoKihlY29mZl9iYWNrZW5kIChvYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCisJICAgIChvYmZkLCBlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bmF0aXZlLCAmZXN5bSk7CisJICBlc3ltLmlmZCA9IGlmZE5pbDsKKwkgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOworCSAgKCooZWNvZmZfYmFja2VuZCAob2JmZCktPmRlYnVnX3N3YXAuc3dhcF9leHRfb3V0KSkKKwkgICAgKG9iZmQsICZlc3ltLCBlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bmF0aXZlKTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBUaGUgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBpcyBzdG9yZWQgaW4gdGhlCisgICBiYWNrZW5kIHBvaW50ZXIuICBXZSBhbHdheXMgc2V0IHRoZSBhcmNoaXRlY3R1cmUgYW55aG93LCBzaW5jZSBtYW55CisgICBjYWxsZXJzIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KKworYm9vbGVhbgorX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOworICByZXR1cm4gYXJjaCA9PSBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJjaDsKK30KKworLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLworCisvKkFSR1NVU0VEKi8KK2ludAorX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiByZWxvYzsKK3sKKyAgYXNlY3Rpb24gKmN1cnJlbnQ7CisgIGludCBjOworICBpbnQgcmV0OworCisgIGMgPSAwOworICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKKyAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAorICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKKyAgICArK2M7CisKKyAgcmV0ID0gKGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKKwkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpCisJICsgYyAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCkpOworICByZXR1cm4gQkZEX0FMSUdOIChyZXQsIDE2KTsKK30KKworLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAorCQkJCQkgICAgb2Zmc2V0LCBjb3VudCk7Cit9CisKKy8qIFNvcnQgc2VjdGlvbnMgYnkgVk1BLCBidXQgcHV0IFNFQ19BTExPQyBzZWN0aW9ucyBmaXJzdC4gIFRoaXMgaXMKKyAgIGNhbGxlZCB2aWEgcXNvcnQuICAqLworCitzdGF0aWMgaW50CitlY29mZl9zb3J0X2hkcnMgKGFyZzEsIGFyZzIpCisgICAgIGNvbnN0IFBUUiBhcmcxOworICAgICBjb25zdCBQVFIgYXJnMjsKK3sKKyAgY29uc3QgYXNlY3Rpb24gKmhkcjEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOworICBjb25zdCBhc2VjdGlvbiAqaGRyMiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7CisKKyAgaWYgKChoZHIxLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKyAgICB7CisgICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQorCXJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCXJldHVybiAxOworICAgIH0KKyAgaWYgKGhkcjEtPnZtYSA8IGhkcjItPnZtYSkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKGhkcjEtPnZtYSA+IGhkcjItPnZtYSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb24gZm9yIGVhY2ggc2VjdGlvbiwgYW5kIHNldAorICAgcmVsb2NfZmlsZXBvcy4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgZmlsZV9wdHIgc29mYXIsIGZpbGVfc29mYXI7CisgIGFzZWN0aW9uICoqc29ydGVkX2hkcnM7CisgIGFzZWN0aW9uICpjdXJyZW50OworICB1bnNpZ25lZCBpbnQgaTsKKyAgZmlsZV9wdHIgb2xkX3NvZmFyOworICBib29sZWFuIHJkYXRhX2luX3RleHQ7CisgIGJvb2xlYW4gZmlyc3RfZGF0YSwgZmlyc3Rfbm9uYWxsb2M7CisgIGNvbnN0IGJmZF92bWEgcm91bmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQ7CisKKyAgc29mYXIgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7CisgIGZpbGVfc29mYXIgPSBzb2ZhcjsKKworICAvKiBTb3J0IHRoZSBzZWN0aW9ucyBieSBWTUEuICAqLworICBzb3J0ZWRfaGRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoYWJmZC0+c2VjdGlvbl9jb3VudAorCQkJCQkgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgIGlmIChzb3J0ZWRfaGRycyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnMsIGkgPSAwOworICAgICAgIGN1cnJlbnQgIT0gTlVMTDsKKyAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgaSsrKQorICAgIHNvcnRlZF9oZHJzW2ldID0gY3VycmVudDsKKyAgQkZEX0FTU0VSVCAoaSA9PSBhYmZkLT5zZWN0aW9uX2NvdW50KTsKKworICBxc29ydCAoc29ydGVkX2hkcnMsIGFiZmQtPnNlY3Rpb25fY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCisJIGVjb2ZmX3NvcnRfaGRycyk7CisKKyAgLyogU29tZSB2ZXJzaW9ucyBvZiB0aGUgT1NGIGxpbmtlciBwdXQgdGhlIC5yZGF0YSBzZWN0aW9uIGluIHRoZQorICAgICB0ZXh0IHNlZ21lbnQsIGFuZCBzb21lIGRvIG5vdC4gICovCisgIHJkYXRhX2luX3RleHQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cmRhdGFfaW5fdGV4dDsKKyAgaWYgKHJkYXRhX2luX3RleHQpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKKwl7CisJICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07CisJICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpID09IDApCisJICAgIGJyZWFrOworCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCisJICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKKwkgICAgICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9SQ09OU1QpICE9IDApCisJICAgIHsKKwkgICAgICByZGF0YV9pbl90ZXh0ID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCA9IHJkYXRhX2luX3RleHQ7CisKKyAgZmlyc3RfZGF0YSA9IHRydWU7CisgIGZpcnN0X25vbmFsbG9jID0gdHJ1ZTsKKyAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOworCisgICAgICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07CisKKyAgICAgIC8qIEZvciB0aGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdGhlIGxubm9wdHIgZmllbGQgaXMKKwkgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiAucGRhdGEgZW50cmllcyB0aGF0IGFyZQorCSByZWFsbHkgaW4gdGhlIHNlY3Rpb24uICBFYWNoIGVudHJ5IGlzIDggYnl0ZXMuICBXZSBzdG9yZSB0aGlzCisJIGF3YXkgaW4gbGluZV9maWxlcG9zIGJlZm9yZSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemUuICAqLworICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSA9PSAwKQorCWN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IGN1cnJlbnQtPl9yYXdfc2l6ZSAvIDg7CisKKyAgICAgIGFsaWdubWVudF9wb3dlciA9IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcjsKKworICAgICAgLyogT24gVWx0cml4LCB0aGUgZGF0YSBzZWN0aW9ucyBpbiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdCBiZQorCSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeSB3aXRoaW4gdGhlIGZpbGUuICBUaGlzIGRvZXMgbm90CisJIGFmZmVjdCB0aGUgc2VjdGlvbiBzaXplLCB0aG91Z2guICBGSVhNRTogRG9lcyB0aGlzIHdvcmsgZm9yCisJIG90aGVyIHBsYXRmb3Jtcz8gIEl0IHJlcXVpcmVzIHNvbWUgbW9kaWZpY2F0aW9uIGZvciB0aGUKKwkgQWxwaGEsIGJlY2F1c2UgLnJkYXRhIG9uIHRoZSBBbHBoYSBnb2VzIHdpdGggdGhlIHRleHQsIG5vdAorCSB0aGUgZGF0YS4gICovCisgICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCisJICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCisJICAmJiAhIGZpcnN0X2RhdGEKKwkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCisJICAmJiAoISByZGF0YV9pbl90ZXh0CisJICAgICAgfHwgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpICE9IDApCisJICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgIT0gMAorCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQorCXsKKwkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKKwkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7CisJICBmaXJzdF9kYXRhID0gZmFsc2U7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQorCXsKKwkgIC8qIE9uIElyaXggNCwgdGhlIGxvY2F0aW9uIG9mIGNvbnRlbnRzIG9mIHRoZSAubGliIHNlY3Rpb24KKwkgICAgIGZyb20gYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uIGlzIGFsc28gcm91bmRlZCB1cCB0byBhCisJICAgICBwYWdlIGJvdW5kYXJ5LiAgKi8KKworCSAgc29mYXIgPSAoc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOworCSAgZmlsZV9zb2ZhciA9IChmaWxlX3NvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKKwl9CisgICAgICBlbHNlIGlmIChmaXJzdF9ub25hbGxvYworCSAgICAgICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKKwkgICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKKwl7CisJICAvKiBTa2lwIHVwIHRvIHRoZSBuZXh0IHBhZ2UgZm9yIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24sIHN1Y2gKKyAgICAgICAgICAgICBhcyB0aGUgLmNvbW1lbnQgc2VjdGlvbiBvbiB0aGUgQWxwaGEuICBUaGlzIGxlYXZlcyByb29tCisgICAgICAgICAgICAgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLworCSAgZmlyc3Rfbm9uYWxsb2MgPSBmYWxzZTsKKwkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKKwkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7CisJfQorCisgICAgICAvKiBBbGlnbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNhbWUgYm91bmRhcnkgb24KKwkgd2hpY2ggdGhleSBhcmUgYWxpZ25lZCBpbiB2aXJ0dWFsIG1lbW9yeS4gICovCisgICAgICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKKyAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQorCWZpbGVfc29mYXIgPSBCRkRfQUxJR04gKGZpbGVfc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKKworICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKKwkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwl7CisJICBzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcm91bmQ7CisJICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKKwkgICAgZmlsZV9zb2ZhciArPSAoY3VycmVudC0+dm1hIC0gZmlsZV9zb2ZhcikgJSByb3VuZDsKKwl9CisKKyAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEKSkgIT0gMCkKKwljdXJyZW50LT5maWxlcG9zID0gZmlsZV9zb2ZhcjsKKworICAgICAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOworICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCisJZmlsZV9zb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemU7CisKKyAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KKyAgICAgIG9sZF9zb2ZhciA9IHNvZmFyOworICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7CisgICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKKwlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7CisgICAgICBjdXJyZW50LT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7CisgICAgfQorCisgIGZyZWUgKHNvcnRlZF9oZHJzKTsKKyAgc29ydGVkX2hkcnMgPSBOVUxMOworCisgIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zID0gZmlsZV9zb2ZhcjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVsb2NzIGZvciBhbGwgdGhlIHNlY3Rpb25zIGluIHRoZQorICAgb3V0cHV0IGZpbGUsIGFzIHdlbGwgYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIGJmZF9zaXplX3R5cGUKK2Vjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplID0KKyAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKKyAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKKyAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOworICBhc2VjdGlvbiAqY3VycmVudDsKKyAgZmlsZV9wdHIgc3ltX2Jhc2U7CisKKyAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKKyAgICB7CisgICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQorCWFib3J0ICgpOworICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisgICAgfQorICAKKyAgcmVsb2NfYmFzZSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zOworCisgIHJlbG9jX3NpemUgPSAwOworICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKKyAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAorICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKKyAgICB7CisgICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPT0gMCkKKwljdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7CisgICAgICBlbHNlCisJeworCSAgYmZkX3NpemVfdHlwZSByZWxzaXplOworCisJICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IHJlbG9jX2Jhc2U7CisJICByZWxzaXplID0gY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplOworCSAgcmVsb2Nfc2l6ZSArPSByZWxzaXplOworCSAgcmVsb2NfYmFzZSArPSByZWxzaXplOworCX0KKyAgICB9CisKKyAgc3ltX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyArIHJlbG9jX3NpemU7CisKKyAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIGV4ZWN1dGFibGUgZmlsZSBtdXN0CisgICAgIGJlIGFsaWduZWQgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IElzIHRoaXMgdHJ1ZSBvbiBvdGhlcgorICAgICBwbGF0Zm9ybXM/ICAqLworICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCisgICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQorICAgIHN5bV9iYXNlID0gKChzeW1fYmFzZSArIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5yb3VuZCAtIDEpCisJCSZ+IChlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKSk7CisKKyAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gc3ltX2Jhc2U7CisKKyAgcmV0dXJuIHJlbG9jX3NpemU7Cit9CisKKy8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KKworYm9vbGVhbgorX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICAvKiBUaGlzIG11c3QgYmUgZG9uZSBmaXJzdCwgYmVjYXVzZSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgaXMKKyAgICAgZ29pbmcgdG8gc2V0IG91dHB1dF9oYXNfYmVndW4gdG8gdHJ1ZS4gICovCisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQorICAgIHsKKyAgICAgIGlmICghIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBIYW5kbGUgdGhlIC5saWIgc2VjdGlvbiBzcGVjaWFsbHkgc28gdGhhdCBJcml4IDQgc2hhcmVkIGxpYnJhcmllcworICAgICB3b3JrIG91dC4gIFNlZSBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzIGluIGNvZmZjb2RlLmguICAqLworICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9ieXRlICpyZWMsICpyZWNlbmQ7CisKKyAgICAgIHJlYyA9IChiZmRfYnl0ZSAqKSBsb2NhdGlvbjsKKyAgICAgIHJlY2VuZCA9IHJlYyArIGNvdW50OworICAgICAgd2hpbGUgKHJlYyA8IHJlY2VuZCkKKwl7CisJICArK3NlY3Rpb24tPmxtYTsKKwkgIHJlYyArPSBiZmRfZ2V0XzMyIChhYmZkLCByZWMpICogNDsKKwl9CisKKyAgICAgIEJGRF9BU1NFUlQgKHJlYyA9PSByZWNlbmQpOworICAgIH0KKworICBpZiAoY291bnQgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2V0IHRoZSBHUCB2YWx1ZSBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKKyAgIG5sbWNvbnYuICAqLworCitiZmRfdm1hCitiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIHJldHVybiBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Cit9CisKKy8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5IHRoZQorICAgYXNzZW1ibGVyLiAgKi8KKworYm9vbGVhbgorYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3BfdmFsdWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3ZtYSBncF92YWx1ZTsKK3sKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBncF92YWx1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSByZWdpc3RlciBtYXNrcyBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKKyAgIHRoZSBhc3NlbWJsZXIuICAqLworCitib29sZWFuCitiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChhYmZkLCBncHJtYXNrLCBmcHJtYXNrLCBjcHJtYXNrKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsKKyAgICAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOworICAgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrOworeworICBlY29mZl9kYXRhX3R5cGUgKnRkYXRhOworCisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGRhdGEgPSBlY29mZl9kYXRhIChhYmZkKTsKKyAgdGRhdGEtPmdwcm1hc2sgPSBncHJtYXNrOworICB0ZGF0YS0+ZnBybWFzayA9IGZwcm1hc2s7CisgIGlmIChjcHJtYXNrICE9ICh1bnNpZ25lZCBsb25nICopIE5VTEwpCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJdGRhdGEtPmNwcm1hc2tbaV0gPSBjcHJtYXNrW2ldOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2V0IEVDT0ZGIEVYVFIgaW5mb3JtYXRpb24gZm9yIGFuIGV4dGVybmFsIHN5bWJvbC4gIFRoaXMgZnVuY3Rpb24KKyAgIGlzIHBhc3NlZCB0byBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2Vjb2ZmX2dldF9leHRyIChzeW0sIGVzeW0pCisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgRVhUUiAqZXN5bTsKK3sKKyAgZWNvZmZfc3ltYm9sX3R5cGUgKmVjb2ZmX3N5bV9wdHI7CisgIGJmZCAqaW5wdXRfYmZkOworCisgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW0pICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgorICAgICAgfHwgZWNvZmZzeW1ib2wgKHN5bSktPm5hdGl2ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIERvbid0IGluY2x1ZGUgZGVidWdnaW5nLCBsb2NhbCwgb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KKyAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKKwkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwCisJICB8fCAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGVzeW0tPmptcHRibCA9IDA7CisgICAgICBlc3ltLT5jb2JvbF9tYWluID0gMDsKKyAgICAgIGVzeW0tPndlYWtleHQgPSAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwOworICAgICAgZXN5bS0+cmVzZXJ2ZWQgPSAwOworICAgICAgZXN5bS0+aWZkID0gaWZkTmlsOworICAgICAgLyogRklYTUU6IHdlIGNhbiBkbyBiZXR0ZXIgdGhhbiB0aGlzIGZvciBzdCBhbmQgc2MuICAqLworICAgICAgZXN5bS0+YXN5bS5zdCA9IHN0R2xvYmFsOworICAgICAgZXN5bS0+YXN5bS5zYyA9IHNjQWJzOworICAgICAgZXN5bS0+YXN5bS5yZXNlcnZlZCA9IDA7CisgICAgICBlc3ltLT5hc3ltLmluZGV4ID0gaW5kZXhOaWw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgZWNvZmZfc3ltX3B0ciA9IGVjb2Zmc3ltYm9sIChzeW0pOworCisgIGlmIChlY29mZl9zeW1fcHRyLT5sb2NhbCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5wdXRfYmZkID0gYmZkX2FzeW1ib2xfYmZkIChzeW0pOworICAoKihlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKKyAgICAoaW5wdXRfYmZkLCBlY29mZl9zeW1fcHRyLT5uYXRpdmUsIGVzeW0pOworCisgIC8qIElmIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgdGhlIGxpbmtlciwgdGhlbiBlc3ltIHdpbGwgYmUKKyAgICAgdW5kZWZpbmVkIGJ1dCBzeW0gd2lsbCBub3QgYmUuICBHZXQgYSBiZXR0ZXIgY2xhc3MgZm9yIHN1Y2ggYQorICAgICBzeW1ib2wuICAqLworICBpZiAoKGVzeW0tPmFzeW0uc2MgPT0gc2NVbmRlZmluZWQKKyAgICAgICB8fCBlc3ltLT5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKKyAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKKworICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZSBpbnB1dAorICAgICBCRkQuICAqLworICBpZiAoZXN5bS0+aWZkICE9IC0xKQorICAgIHsKKyAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKKworICAgICAgaW5wdXRfZGVidWcgPSAmZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mbzsKKyAgICAgIEJGRF9BU1NFUlQgKGVzeW0tPmlmZCA8IGlucHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKKyAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+aWZkbWFwICE9IChSRkRUICopIE5VTEwpCisJZXN5bS0+aWZkID0gaW5wdXRfZGVidWctPmlmZG1hcFtlc3ltLT5pZmRdOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5kZXguICBUaGlzIHJvdXRpbmUgaXMgcGFzc2VkIHRvCisgICBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3NldF9pbmRleCAoc3ltLCBpbmR4KQorICAgICBhc3ltYm9sICpzeW07CisgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKK3sKKyAgZWNvZmZfc2V0X3N5bV9pbmRleCAoc3ltLCBpbmR4KTsKK30KKworLyogV3JpdGUgb3V0IGFuIEVDT0ZGIGZpbGUuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOworICBjb25zdCBiZmRfdm1hIHJvdW5kID0gYmFja2VuZC0+cm91bmQ7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBhb3V0c3ogPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOworICBjb25zdCBiZmRfc2l6ZV90eXBlIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemUKKyAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemU7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3JlbG9jX3NpemU7CisgIHZvaWQgKCogY29uc3QgYWRqdXN0X3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCisJCQkJCSAgIGNvbnN0IGFyZWxlbnQgKiwKKwkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKQorICAgID0gYmFja2VuZC0+YWRqdXN0X3JlbG9jX291dDsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCisJCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKKwkJCQkJIFBUUikpCisgICAgPSBiYWNrZW5kLT5zd2FwX3JlbG9jX291dDsKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKKyAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOworICBhc2VjdGlvbiAqY3VycmVudDsKKyAgdW5zaWduZWQgaW50IGNvdW50OworICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7CisgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOworICBiZmRfdm1hIHRleHRfc3RhcnQ7CisgIGJvb2xlYW4gc2V0X3RleHRfc3RhcnQ7CisgIGJmZF9zaXplX3R5cGUgZGF0YV9zaXplOworICBiZmRfdm1hIGRhdGFfc3RhcnQ7CisgIGJvb2xlYW4gc2V0X2RhdGFfc3RhcnQ7CisgIGJmZF9zaXplX3R5cGUgYnNzX3NpemU7CisgIFBUUiBidWZmID0gTlVMTDsKKyAgUFRSIHJlbG9jX2J1ZmYgPSBOVUxMOworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOworICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOworICBpbnQgaTsKKworICAvKiBEZXRlcm1pbmUgd2hlcmUgdGhlIHNlY3Rpb25zIGFuZCByZWxvY3Mgd2lsbCBnbyBpbiB0aGUgb3V0cHV0CisgICAgIGZpbGUuICAqLworICByZWxvY19zaXplID0gZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyAoYWJmZCk7CisKKyAgY291bnQgPSAxOworICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKKyAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAorICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKKyAgICB7CisgICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSBjb3VudDsKKyAgICAgICsrY291bnQ7CisgICAgfQorCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQorICAgIHRleHRfc2l6ZSA9IF9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGZhbHNlKTsKKyAgZWxzZQorICAgIHRleHRfc2l6ZSA9IDA7CisgIHRleHRfc3RhcnQgPSAwOworICBzZXRfdGV4dF9zdGFydCA9IGZhbHNlOworICBkYXRhX3NpemUgPSAwOworICBkYXRhX3N0YXJ0ID0gMDsKKyAgc2V0X2RhdGFfc3RhcnQgPSBmYWxzZTsKKyAgYnNzX3NpemUgPSAwOworCisgIC8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyB0byB0aGUgZmlsZS4gICovCisKKyAgLyogQWxsb2NhdGUgYnVmZiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBzZWN0aW9uIGhlYWRlciwKKyAgICAgZmlsZSBoZWFkZXIsIG9yIGEub3V0IGhlYWRlci4gICovCisgIHsKKyAgICBiZmRfc2l6ZV90eXBlIHNpejsKKyAgICBzaXogPSBzY25oc3o7CisgICAgaWYgKHNpeiA8IGZpbGhzeikKKyAgICAgIHNpeiA9IGZpbGhzejsKKyAgICBpZiAoc2l6IDwgYW91dHN6KQorICAgICAgc2l6ID0gYW91dHN6OworICAgIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzaXopOworICAgIGlmIChidWZmID09IE5VTEwpCisgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgfQorCisgIGludGVybmFsX2YuZl9uc2NucyA9IDA7CisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoZmlsaHN6ICsgYW91dHN6KSwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOworICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7CisgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOworICAgICAgYmZkX3ZtYSB2bWE7CisKKyAgICAgICsraW50ZXJuYWxfZi5mX25zY25zOworCisgICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgc2l6ZW9mIHNlY3Rpb24uc19uYW1lKTsKKworICAgICAgLyogVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvciBJcml4IDQgc2hhcmVkIGxpYnJhcmllcy4gICovCisgICAgICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjdXJyZW50KTsKKyAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9MSUIpID09IDApCisJc2VjdGlvbi5zX3ZhZGRyID0gMDsKKyAgICAgIGVsc2UKKwlzZWN0aW9uLnNfdmFkZHIgPSB2bWE7CisKKyAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKKyAgICAgIHNlY3Rpb24uc19zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKKworICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIHVubG9hZGFibGUgdGhlbiB0aGUgc2NucHRyIHdpbGwgYmUgMC4gICovCisgICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykpID09IDApCisJc2VjdGlvbi5zX3NjbnB0ciA9IDA7CisgICAgICBlbHNlCisJc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7CisgICAgICBzZWN0aW9uLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7CisKKyAgICAgIC8qIEZJWE1FOiB0aGUgbG5ub3B0ciBvZiB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24gb2YgYW4KKwkgb2JqZWN0IGZpbGUgcHJvZHVjZWQgYnkgdGhlIGFzc2VtYmxlciBpcyBzdXBwb3NlZCB0byBwb2ludCB0bworCSBpbmZvcm1hdGlvbiBhYm91dCBob3cgbXVjaCByb29tIGlzIHJlcXVpcmVkIGJ5IG9iamVjdHMgb2YKKwkgdmFyaW91cyBkaWZmZXJlbnQgc2l6ZXMuICBJIHRoaW5rIHRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCisJIHdhbnQgdGhlIGxpbmtlciB0byBjb21wdXRlIHRoZSBiZXN0IHNpemUgdG8gdXNlLCBvcgorCSBzb21ldGhpbmcuICBJIGRvbid0IGtub3cgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbmZvcm1hdGlvbiBpcworCSBub3QgcHJlc2VudC4gICovCisgICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDApCisJc2VjdGlvbi5zX2xubm9wdHIgPSAwOworICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBBbHBoYSBFQ09GRiAucGRhdGEgc2VjdGlvbiB1c2VzIHRoZSBsbm5vcHRyIGZpZWxkIHRvCisJICAgICBob2xkIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2VjdGlvbiAoZWFjaCBlbnRyeSBpcworCSAgICAgOCBieXRlcykuICBXZSBzdG9yZWQgdGhpcyBpbiB0aGUgbGluZV9maWxlcG9zIGZpZWxkIGluCisJICAgICBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICAqLworCSAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7CisJfQorCisgICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7CisgICAgICBzZWN0aW9uLnNfbmxubm8gPSAwOworICAgICAgc2VjdGlvbi5zX2ZsYWdzID0gZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKGN1cnJlbnQtPm5hbWUsCisJCQkJCQkgY3VycmVudC0+ZmxhZ3MpOworCisgICAgICBpZiAoYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAoUFRSKSAmc2VjdGlvbiwgYnVmZikgPT0gMAorCSAgfHwgYmZkX3dyaXRlIChidWZmLCAxLCBzY25oc3osIGFiZmQpICE9IHNjbmhzeikKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1RFWFQpICE9IDAKKwkgIHx8ICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAorCSAgICAgICYmIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZGF0YV9pbl90ZXh0KQorCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfUERBVEEKKwkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTkFNSUMpICE9IDAKKwkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJQkxJU1QpICE9IDAKKwkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JFTERZTikgIT0gMAorCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09ORkxJQworCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1RSKSAhPSAwCisJICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5TWU0pICE9IDAKKwkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0hBU0gpICE9IDAKKwkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0lOSVQpICE9IDAKKwkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpICE9IDAKKwkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1JDT05TVCkKKwl7CisJICB0ZXh0X3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKKwkgIGlmICghIHNldF90ZXh0X3N0YXJ0IHx8IHRleHRfc3RhcnQgPiB2bWEpCisJICAgIHsKKwkgICAgICB0ZXh0X3N0YXJ0ID0gdm1hOworCSAgICAgIHNldF90ZXh0X3N0YXJ0ID0gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JEQVRBKSAhPSAwCisJICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RBVEEpICE9IDAKKwkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUQSkgIT0gMAorCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ4KSAhPSAwCisJICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVDQpICE9IDAKKwkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfU0RBVEEpICE9IDAKKwkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfWERBVEEKKwkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfR09UKSAhPSAwKQorCXsKKwkgIGRhdGFfc2l6ZSArPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGN1cnJlbnQpOworCSAgaWYgKCEgc2V0X2RhdGFfc3RhcnQgfHwgZGF0YV9zdGFydCA+IHZtYSkKKwkgICAgeworCSAgICAgIGRhdGFfc3RhcnQgPSB2bWE7CisJICAgICAgc2V0X2RhdGFfc3RhcnQgPSB0cnVlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfQlNTKSAhPSAwCisJICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NCU1MpICE9IDApCisJYnNzX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKKyAgICAgIGVsc2UgaWYgKHNlY3Rpb24uc19mbGFncyA9PSAwCisJICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikgIT0gMAorCSAgICAgICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQorCS8qIERvIG5vdGhpbmcgKi8gOworICAgICAgZWxzZQorCWFib3J0ICgpOworICAgIH0JCisKKyAgLyogU2V0IHVwIHRoZSBmaWxlIGhlYWRlci4gICovCisKKyAgaW50ZXJuYWxfZi5mX21hZ2ljID0gZWNvZmZfZ2V0X21hZ2ljIChhYmZkKTsKKworICAvKiBXZSB3aWxsIE5PVCBwdXQgYSBmdWNraW5nIHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGhlcmUuIEV2ZXJ5CisgICAgIHRpbWUgeW91IHB1dCBpdCBiYWNrLCBJIHdpbGwgY29tZSBpbiBhbmQgdGFrZSBpdCBvdXQgYWdhaW4uICBJJ20KKyAgICAgc29ycnkuICBUaGlzIGZpZWxkIGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgV2UgZmlsbCBpdCB3aXRoIGEgMCBzbworICAgICBpdCBjb21wYXJlcyB0aGUgc2FtZSBidXQgaXMgbm90IGEgcmVhc29uYWJsZSB0aW1lLiAtLQorICAgICBnbnVAY3lnbnVzLmNvbS4gICovCisgIGludGVybmFsX2YuZl90aW1kYXQgPSAwOworCisgIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFRoZSBFQ09GRiBmX25zeW1zIGZpZWxkIGlzIG5vdCBhY3R1YWxseSB0aGUgbnVtYmVyIG9mCisJIHN5bWJvbHMsIGl0J3MgdGhlIHNpemUgb2Ygc3ltYm9saWMgaW5mb3JtYXRpb24gaGVhZGVyLiAgKi8KKyAgICAgIGludGVybmFsX2YuZl9uc3ltcyA9IGV4dGVybmFsX2hkcl9zaXplOworICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvczsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSAwOworICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7CisgICAgfQorCisgIGludGVybmFsX2YuZl9vcHRoZHIgPSBhb3V0c3o7CisKKyAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gRl9MTk5POworICBpZiAocmVsb2Nfc2l6ZSA9PSAwKQorICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTFNZTVM7CisgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKKyAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOworCisgIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMldSOworICBlbHNlCisgICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMlc7CisKKyAgLyogU2V0IHVwIHRoZSBgYG9wdGlvbmFsJycgaGVhZGVyLiAgKi8KKyAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCisgICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfWk1BR0lDOworICBlbHNlCisgICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfT01BR0lDOworCisgIC8qIEZJWE1FOiBJcyB0aGlzIHJlYWxseSBjb3JyZWN0PyAgKi8KKyAgaW50ZXJuYWxfYS52c3RhbXAgPSBzeW1oZHItPnZzdGFtcDsKKworICAvKiBBdCBsZWFzdCBvbiBVbHRyaXgsIHRoZXNlIGhhdmUgdG8gYmUgcm91bmRlZCB0byBwYWdlIGJvdW5kYXJpZXMuCisgICAgIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIgcGxhdGZvcm1zPyAgKi8KKyAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCisgICAgeworICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9ICh0ZXh0X3NpemUgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOworICAgICAgaW50ZXJuYWxfYS50ZXh0X3N0YXJ0ID0gdGV4dF9zdGFydCAmfiAocm91bmQgLSAxKTsKKyAgICAgIGludGVybmFsX2EuZHNpemUgPSAoZGF0YV9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKKyAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQgJn4gKHJvdW5kIC0gMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9IHRleHRfc2l6ZTsKKyAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQ7CisgICAgICBpbnRlcm5hbF9hLmRzaXplID0gZGF0YV9zaXplOworICAgICAgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gZGF0YV9zdGFydDsKKyAgICB9CisKKyAgLyogT24gVWx0cml4LCB0aGUgaW5pdGlhbCBwb3J0aW9ucyBvZiB0aGUgLnNic3MgYW5kIC5ic3Mgc2VnbWVudHMKKyAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSBic2l6ZSBmaWVsZCBpbiB0aGUKKyAgICAgb3B0aW9uYWwgaGVhZGVyIHJlY29yZHMgaG93IG1hbnkgYnNzIGJ5dGVzIGFyZSByZXF1aXJlZCBiZXlvbmQKKyAgICAgdGhvc2UgaW4gdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSB2YWx1ZSBpcyBub3Qgcm91bmRlZCB0byBhIHBhZ2UKKyAgICAgYm91bmRhcnkuICAqLworICBpZiAoYnNzX3NpemUgPCBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplKQorICAgIGJzc19zaXplID0gMDsKKyAgZWxzZQorICAgIGJzc19zaXplIC09IGludGVybmFsX2EuZHNpemUgLSBkYXRhX3NpemU7CisgIGludGVybmFsX2EuYnNpemUgPSBic3Nfc2l6ZTsKKyAgaW50ZXJuYWxfYS5ic3Nfc3RhcnQgPSBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgKyBpbnRlcm5hbF9hLmRzaXplOworCisgIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworCisgIGludGVybmFsX2EuZ3BfdmFsdWUgPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7CisKKyAgaW50ZXJuYWxfYS5ncHJtYXNrID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwcm1hc2s7CisgIGludGVybmFsX2EuZnBybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5mcHJtYXNrOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGludGVybmFsX2EuY3BybWFza1tpXSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrW2ldOworCisgIC8qIExldCB0aGUgYmFja2VuZCBhZGp1c3QgdGhlIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKGJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKQorICAgIHsKKyAgICAgIGlmICghICgqYmFja2VuZC0+YWRqdXN0X2hlYWRlcnMpIChhYmZkLCAmaW50ZXJuYWxfZiwgJmludGVybmFsX2EpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgKi8KKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2YsIGJ1ZmYpOworICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgYnVmZik7CisgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGFvdXRzeiwgYWJmZCkgIT0gYW91dHN6KQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgICAgd3JpdGluZyBvdXQgdGhlIHJlbG9jcyBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgV2UKKyAgICAgZG9uJ3QgZG8gdGhpcyBpZiB0aGlzIEJGRCB3YXMgY3JlYXRlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIsCisgICAgIHNpbmNlIGl0IHdpbGwgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIHN5bWJvbHMgYW5kIHJlbG9jcy4gICovCisgIGlmICghIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIpCisgICAgeworICAgICAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKKyAgICAgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKKyAgICAgIGRlYnVnLT5leHRlcm5hbF9leHQgPSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7CisgICAgICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKKyAgICAgIGlmIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCisJCQkJICAgICAoKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgPT0gMCkKKwkJCQkgICAgICA/IHRydWUgOiBmYWxzZSksCisJCQkJICAgICBlY29mZl9nZXRfZXh0ciwgZWNvZmZfc2V0X2luZGV4KQorCSAgPT0gZmFsc2UpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KKyAgICAgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOworCSAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7CisJICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCisJeworCSAgYXJlbGVudCAqKnJlbG9jX3B0cl9wdHI7CisJICBhcmVsZW50ICoqcmVsb2NfZW5kOworCSAgY2hhciAqb3V0X3B0cjsKKworCSAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCisJICAgIGNvbnRpbnVlOworCisJICByZWxvY19idWZmID0KKwkgICAgYmZkX2FsbG9jIChhYmZkLCBjdXJyZW50LT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpOworCSAgaWYgKHJlbG9jX2J1ZmYgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIHJlbG9jX3B0cl9wdHIgPSBjdXJyZW50LT5vcmVsb2NhdGlvbjsKKwkgIHJlbG9jX2VuZCA9IHJlbG9jX3B0cl9wdHIgKyBjdXJyZW50LT5yZWxvY19jb3VudDsKKwkgIG91dF9wdHIgPSAoY2hhciAqKSByZWxvY19idWZmOworCSAgZm9yICg7CisJICAgICAgIHJlbG9jX3B0cl9wdHIgPCByZWxvY19lbmQ7CisJICAgICAgIHJlbG9jX3B0cl9wdHIrKywgb3V0X3B0ciArPSBleHRlcm5hbF9yZWxvY19zaXplKQorCSAgICB7CisJICAgICAgYXJlbGVudCAqcmVsb2M7CisJICAgICAgYXN5bWJvbCAqc3ltOworCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbjsKKwkgIAorCSAgICAgIG1lbXNldCAoKFBUUikgJmluLCAwLCBzaXplb2YgaW4pOworCisJICAgICAgcmVsb2MgPSAqcmVsb2NfcHRyX3B0cjsKKwkgICAgICBzeW0gPSAqcmVsb2MtPnN5bV9wdHJfcHRyOworCisJICAgICAgaW4ucl92YWRkciA9IChyZWxvYy0+YWRkcmVzcworCQkJICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCkpOworCSAgICAgIGluLnJfdHlwZSA9IHJlbG9jLT5ob3d0by0+dHlwZTsKKworCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKKwkJeworCQkgIGluLnJfc3ltbmR4ID0gZWNvZmZfZ2V0X3N5bV9pbmRleCAoKnJlbG9jLT5zeW1fcHRyX3B0cik7CisJCSAgaW4ucl9leHRlcm4gPSAxOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgQ09OU1QgY2hhciAqbmFtZTsKKworCQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKKwkJICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKKwkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCisJCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOworCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKKwkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOworCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCisJCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCisJCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCisJCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOworCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCisJCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdGEiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKkFCUyoiKSA9PSAwKQorCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmNvbnN0IikgPT0gMCkKKwkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7CisJCSAgZWxzZQorCQkgICAgYWJvcnQgKCk7CisJCSAgaW4ucl9leHRlcm4gPSAwOworCQl9CisKKwkgICAgICAoKmFkanVzdF9yZWxvY19vdXQpIChhYmZkLCByZWxvYywgJmluKTsKKworCSAgICAgICgqc3dhcF9yZWxvY19vdXQpIChhYmZkLCAmaW4sIChQVFIpIG91dF9wdHIpOworCSAgICB9CisKKwkgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGlmIChiZmRfd3JpdGUgKHJlbG9jX2J1ZmYsCisJCQkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgY3VycmVudC0+cmVsb2NfY291bnQsIGFiZmQpCisJICAgICAgIT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGN1cnJlbnQtPnJlbG9jX2NvdW50KQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKKwkgIHJlbG9jX2J1ZmYgPSBOVUxMOworCX0KKworICAgICAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworICAgICAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKKwl7CisJICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisJICBpZiAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCisJCQkJICAgICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MpCisJICAgICAgPT0gZmFsc2UpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKyAgICB9CisKKyAgLyogVGhlIC5ic3Mgc2VjdGlvbiBvZiBhIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlIG11c3QgcmVjZWl2ZSBhbgorICAgICBlbnRpcmUgcGFnZS4gIElmIHRoZXJlIGFyZSBzeW1ib2xzLCB0aGUgc3ltYm9scyB3aWxsIHN0YXJ0IG9uIHRoZQorICAgICBuZXh0IHBhZ2UuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgd2UgbXVzdCBmaWxsIG91dCB0aGUgcGFnZSBieQorICAgICBoYW5kLiAgKi8KKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDAKKyAgICAgICYmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAorICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKKyAgICB7CisgICAgICBjaGFyIGM7CisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAorCQkgICAgU0VFS19TRVQpICE9IDApCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSA9PSAwKQorCWMgPSAwOworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyAtIDEsCisJCSAgICBTRUVLX1NFVCkgIT0gMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGlmIChiZmRfd3JpdGUgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQorICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKKyAgaWYgKGJ1ZmYgIT0gTlVMTCkKKyAgICBmcmVlIChidWZmKTsKKyAgcmV0dXJuIHRydWU7CisgZXJyb3JfcmV0dXJuOgorICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQorICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKKyAgaWYgKGJ1ZmYgIT0gTlVMTCkKKyAgICBmcmVlIChidWZmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorDAorLyogQXJjaGl2ZSBoYW5kbGluZy4gIEVDT0ZGIHVzZXMgd2hhdCBhcHBlYXJzIHRvIGJlIGEgdW5pcXVlIHR5cGUgb2YKKyAgIGFyY2hpdmUgaGVhZGVyIChhcm1hcCkuICBUaGUgYnl0ZSBvcmRlcmluZyBvZiB0aGUgYXJtYXAgYW5kIHRoZQorICAgY29udGVudHMgYXJlIGVuY29kZWQgaW4gdGhlIG5hbWUgb2YgdGhlIGFybWFwIGl0c2VsZi4gIEF0IGxlYXN0IGZvcgorICAgbm93LCB3ZSBvbmx5IHN1cHBvcnQgYXJjaGl2ZXMgd2l0aCB0aGUgc2FtZSBieXRlIG9yZGVyaW5nIGluIHRoZQorICAgYXJtYXAgYW5kIHRoZSBjb250ZW50cy4KKworICAgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgaW4gdGhlIGFybWFwIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbAorICAgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4KKworICAgVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUgc3ltYm9sIGRlZmluaXRpb25zLiAgRWFjaCBzeW1ib2wgZGVmaW5pdGlvbgorICAgb2NjdXBpZXMgOCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGFyZSB0aGUgb2Zmc2V0IGZyb20gdGhlCisgICBzdGFydCBvZiB0aGUgYXJtYXAgc3RyaW5ncyB0byB0aGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBuYW1pbmcKKyAgIHRoaXMgc3ltYm9sLiAgVGhlIHNlY29uZCBmb3VyIGJ5dGVzIGFyZSB0aGUgZmlsZSBvZmZzZXQgdG8gdGhlCisgICBhcmNoaXZlIG1lbWJlciB3aGljaCBkZWZpbmVzIHRoaXMgc3ltYm9sLiAgSWYgdGhlIHNlY29uZCBmb3VyIGJ5dGVzCisgICBhcmUgMCwgdGhlbiB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHN5bWJvbCBkZWZpbml0aW9uLCBhbmQgaXQgc2hvdWxkCisgICBiZSBpZ25vcmVkLgorCisgICBUaGUgc3ltYm9scyBhcmUgaGFzaGVkIGludG8gdGhlIGFybWFwIHdpdGggYSBjbG9zZWQgaGFzaGluZyBzY2hlbWUuCisgICBTZWUgdGhlIGZ1bmN0aW9ucyBiZWxvdyBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobS4KKworICAgQWZ0ZXIgdGhlIHN5bWJvbCBkZWZpbml0aW9ucyBjb21lcyBmb3VyIGJ5dGVzIGhvbGRpbmcgdGhlIHNpemUgb2YKKyAgIHRoZSBzdHJpbmcgdGFibGUsIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgdGFibGUgaXRzZWxmLiAgKi8KKworLyogVGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBoZWFkZXJzIGxvb2tzIGxpa2UgdGhpczoKKyAgIF9fX19fX19fX19FW0JMXUVbQkxdXyAod2l0aCBhIHRyYWlsaW5nIHNwYWNlKS4KKyAgIFRoZSB0cmFpbGluZyBzcGFjZSBpcyBjaGFuZ2VkIHRvIGFuIFggaWYgdGhlIGFyY2hpdmUgaXMgY2hhbmdlZCB0bworICAgaW5kaWNhdGUgdGhhdCB0aGUgYXJtYXAgaXMgb3V0IG9mIGRhdGUuCisKKyAgIFRoZSBBbHBoYSBzZWVtcyB0byB1c2UgX19fX19fX182NEVbQkxdRVtCTF1fLiAgKi8KKworI2RlZmluZSBBUk1BUF9CSUdfRU5ESUFOICdCJworI2RlZmluZSBBUk1BUF9MSVRUTEVfRU5ESUFOICdMJworI2RlZmluZSBBUk1BUF9NQVJLRVIgJ0UnCisjZGVmaW5lIEFSTUFQX1NUQVJUX0xFTkdUSCAxMAorI2RlZmluZSBBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYIDEwCisjZGVmaW5lIEFSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVggMTEKKyNkZWZpbmUgQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWCAxMgorI2RlZmluZSBBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYIDEzCisjZGVmaW5lIEFSTUFQX0VORF9JTkRFWCAxNAorI2RlZmluZSBBUk1BUF9FTkQgIl8gIgorCisvKiBUaGlzIGlzIGEgbWFnaWMgbnVtYmVyIHVzZWQgaW4gdGhlIGhhc2hpbmcgYWxnb3JpdGhtLiAgKi8KKyNkZWZpbmUgQVJNQVBfSEFTSF9NQUdJQyAweDlkZDY4YWI1CisKKy8qIFRoaXMgcmV0dXJucyB0aGUgaGFzaCB2YWx1ZSB0byB1c2UgZm9yIGEgc3RyaW5nLiAgSXQgYWxzbyBzZXRzCisgICAqUkVIQVNIIHRvIHRoZSByZWhhc2ggYWRqdXN0bWVudCBpZiB0aGUgZmlyc3Qgc2xvdCBpcyB0YWtlbi4gIFNJWkUKKyAgIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIEhMT0cgaXMgdGhlIGxvZworICAgYmFzZSAyIG9mIFNJWkUuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitlY29mZl9hcm1hcF9oYXNoIChzLCByZWhhc2gsIHNpemUsIGhsb2cpCisgICAgIENPTlNUIGNoYXIgKnM7CisgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgdW5zaWduZWQgaW50IGhsb2c7Cit7CisgIHVuc2lnbmVkIGludCBoYXNoOworCisgIGlmIChobG9nID09IDApCisgICAgcmV0dXJuIDA7CisgIGhhc2ggPSAqcysrOworICB3aGlsZSAoKnMgIT0gJ1wwJykKKyAgICBoYXNoID0gKChoYXNoID4+IDI3KSB8IChoYXNoIDw8IDUpKSArICpzKys7CisgIGhhc2ggKj0gQVJNQVBfSEFTSF9NQUdJQzsKKyAgKnJlaGFzaCA9IChoYXNoICYgKHNpemUgLSAxKSkgfCAxOworICByZXR1cm4gaGFzaCA+PiAoMzIgLSBobG9nKTsKK30KKworLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgbmV4dG5hbWVbMTddOworICB1bnNpZ25lZCBpbnQgaTsKKyAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKKyAgYmZkX3NpemVfdHlwZSBwYXJzZWRfc2l6ZTsKKyAgY2hhciAqcmF3X2FybWFwOworICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhOworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIGNoYXIgKnJhd19wdHI7CisgIHN0cnVjdCBzeW1kZWYgKnN5bWRlZl9wdHI7CisgIGNoYXIgKnN0cmluZ2Jhc2U7CisgIAorICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLworICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7CisgIGlmIChpID09IDApCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGkgIT0gMTYpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0xNiwgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIElyaXggNC4wLjVGIGFwcGFyZW50bHkgY2FuIHVzZSBlaXRoZXIgYW4gRUNPRkYgYXJtYXAgb3IgYQorICAgICBzdGFuZGFyZCBDT0ZGIGFybWFwLiAgV2UgY291bGQgbW92ZSB0aGUgRUNPRkYgYXJtYXAgc3R1ZmYgaW50bworICAgICBiZmRfc2x1cnBfYXJtYXAsIGJ1dCB0aGF0IHNlZW1zIGluYXBwcm9wcmlhdGUgc2luY2Ugbm8gb3RoZXIKKyAgICAgdGFyZ2V0IHVzZXMgdGhpcyBmb3JtYXQuICBJbnN0ZWFkLCB3ZSBjaGVjayBkaXJlY3RseSBmb3IgYSBDT0ZGCisgICAgIGFybWFwLiAgKi8KKyAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQorICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOworCisgIC8qIFNlZSBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBhcm1hcC4gICovCisgIGlmIChzdHJuY21wIChuZXh0bmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0LAorCSAgICAgICBBUk1BUF9TVEFSVF9MRU5HVEgpICE9IDAKKyAgICAgIHx8IG5leHRuYW1lW0FSTUFQX0hFQURFUl9NQVJLRVJfSU5ERVhdICE9IEFSTUFQX01BUktFUgorICAgICAgfHwgKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0JJR19FTkRJQU4KKwkgICYmIG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0xJVFRMRV9FTkRJQU4pCisgICAgICB8fCBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKKyAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCisJICAmJiBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQorICAgICAgfHwgc3RybmNtcCAobmV4dG5hbWUgKyBBUk1BUF9FTkRfSU5ERVgsCisJCSAgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSkgIT0gMCkKKyAgICB7CisgICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgYnl0ZSBvcmRlcmluZy4gICovCisgIGlmICgoKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCisgICAgICAgXiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkpCisgICAgICB8fCAoKG5leHRuYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCisJICBeIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpKSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLworICBhcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKKyAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOworICBpZiAobWFwZGF0YSA9PSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOworICAgIAorICByYXdfYXJtYXAgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKKyAgaWYgKHJhd19hcm1hcCA9PSAoY2hhciAqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgYXJkYXRhLT50ZGF0YSA9IChQVFIpIHJhd19hcm1hcDsKKworICBjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKKworICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IDA7CisgIGFyZGF0YS0+Y2FjaGUgPSAoc3RydWN0IGFyX2NhY2hlICopIE5VTEw7CisKKyAgLyogVGhpcyBjb2RlIHVzZWQgdG8gb3ZlcmxheSB0aGUgc3ltZGVmcyBvdmVyIHRoZSByYXcgYXJjaGl2ZSBkYXRhLAorICAgICBidXQgdGhhdCBkb2Vzbid0IHdvcmsgb24gYSA2NCBiaXQgaG9zdC4gICovCisKKyAgc3RyaW5nYmFzZSA9IHJhd19hcm1hcCArIGNvdW50ICogOCArIDg7CisKKyNpZmRlZiBDSEVDS19BUk1BUF9IQVNICisgIHsKKyAgICB1bnNpZ25lZCBpbnQgaGxvZzsKKworICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IEkgaGF2ZSB0aGUgaGFzaGluZyBhbGdvcml0aG0gcmlnaHQgYnkgbWFraW5nCisgICAgICAgc3VyZSB0aGF0IGV2ZXJ5IHN5bWJvbCBjYW4gYmUgbG9va2VkIHVwIHN1Y2Nlc3NmdWxseS4gICovCisgICAgaGxvZyA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8IGNvdW50OyBpIDw8PSAxKQorICAgICAgaGxvZysrOworICAgIEJGRF9BU1NFUlQgKGkgPT0gY291bnQpOworCisgICAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OworCXVuc2lnbmVkIGludCBoYXNoLCByZWhhc2gsIHNyY2g7CisgICAgICAKKwluYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7CisJZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOworCWlmIChmaWxlX29mZnNldCA9PSAwKQorCSAgY29udGludWU7CisJaGFzaCA9IGVjb2ZmX2FybWFwX2hhc2ggKHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldCwgJnJlaGFzaCwgY291bnQsCisJCQkJIGhsb2cpOworCWlmIChoYXNoID09IGkpCisJICBjb250aW51ZTsKKworCS8qIFNlZSBpZiB3ZSBjYW4gcmVoYXNoIHRvIHRoaXMgbG9jYXRpb24uICAqLworCWZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChjb3VudCAtIDEpOworCSAgICAgc3JjaCAhPSBoYXNoICYmIHNyY2ggIT0gaTsKKwkgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKSkKKwkgIEJGRF9BU1NFUlQgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19hcm1hcCArIDggKyBzcmNoICogOCkpCisJCSAgICAgICE9IDApOworCUJGRF9BU1NFUlQgKHNyY2ggPT0gaSk7CisgICAgICB9CisgIH0KKworI2VuZGlmIC8qIENIRUNLX0FSTUFQX0hBU0ggKi8KKworICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKKyAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKSAhPSAwKQorICAgICAgKythcmRhdGEtPnN5bWRlZl9jb3VudDsKKworICBzeW1kZWZfcHRyID0gKChzdHJ1Y3Qgc3ltZGVmICopCisJCWJmZF9hbGxvYyAoYWJmZCwKKwkJCSAgIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc3ltZGVmKSkpOworICBpZiAoIXN5bWRlZl9wdHIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgc3ltZGVmX3B0cjsKKworICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OworCisgICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSk7CisgICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIG5hbWVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSByYXdfcHRyKTsKKyAgICAgIHN5bWRlZl9wdHItPnMubmFtZSA9IHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldDsKKyAgICAgIHN5bWRlZl9wdHItPmZpbGVfb2Zmc2V0ID0gZmlsZV9vZmZzZXQ7CisgICAgICArK3N5bWRlZl9wdHI7CisgICAgfQorCisgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOworICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4gICovCisgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICUgMjsKKworICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgYW4gYXJtYXAuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOworICAgICBzdHJ1Y3Qgb3JsICptYXA7CisgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7CisgICAgIGludCBzdHJpZHg7Cit7CisgIHVuc2lnbmVkIGludCBoYXNoc2l6ZSwgaGFzaGxvZzsKKyAgdW5zaWduZWQgaW50IHN5bWRlZnNpemU7CisgIGludCBwYWRpdDsKKyAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7CisgIHVuc2lnbmVkIGludCBtYXBzaXplOworICBmaWxlX3B0ciBmaXJzdHJlYWw7CisgIHN0cnVjdCBhcl9oZHIgaGRyOworICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICB1bnNpZ25lZCBpbnQgaTsKKyAgYmZkX2J5dGUgdGVtcFs0XTsKKyAgYmZkX2J5dGUgKmhhc2h0YWJsZTsKKyAgYmZkICpjdXJyZW50OworICBiZmQgKmxhc3RfZWx0OworCisgIC8qIFVsdHJpeCBhcHBlYXJzIHRvIHVzZSBhcyBhIGhhc2ggdGFibGUgc2l6ZSB0aGUgbGVhc3QgcG93ZXIgb2YgdHdvCisgICAgIGdyZWF0ZXIgdGhhbiB0d2ljZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICAqLworICBmb3IgKGhhc2hsb2cgPSAwOyAoKHVuc2lnbmVkIGludCkgMSA8PCBoYXNobG9nKSA8PSAyICogb3JsX2NvdW50OyBoYXNobG9nKyspCisgICAgOworICBoYXNoc2l6ZSA9IDEgPDwgaGFzaGxvZzsKKworICBzeW1kZWZzaXplID0gaGFzaHNpemUgKiA4OworICBwYWRpdCA9IHN0cmlkeCAlIDI7CisgIHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKKworICAvKiBJbmNsdWRlIDggYnl0ZXMgdG8gc3RvcmUgc3ltZGVmc2l6ZSBhbmQgc3RyaW5nc2l6ZSBpbiBvdXRwdXQuICovCisgIG1hcHNpemUgPSBzeW1kZWZzaXplICsgc3RyaW5nc2l6ZSArIDg7CisKKyAgZmlyc3RyZWFsID0gU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIG1hcHNpemUgKyBlbGVuZ3RoOworCisgIG1lbXNldCAoKFBUUikgJmhkciwgMCwgc2l6ZW9mIGhkcik7CisKKyAgLyogV29yayBvdXQgdGhlIEVDT0ZGIGFybWFwIG5hbWUuICAqLworICBzdHJjcHkgKGhkci5hcl9uYW1lLCBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJtYXBfc3RhcnQpOworICBoZHIuYXJfbmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKKyAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX0VORElBTl9JTkRFWF0gPQorICAgIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpCisgICAgID8gQVJNQVBfQklHX0VORElBTgorICAgICA6IEFSTUFQX0xJVFRMRV9FTkRJQU4pOworICBoZHIuYXJfbmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKKyAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gPQorICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEFSTUFQX0JJR19FTkRJQU4gOiBBUk1BUF9MSVRUTEVfRU5ESUFOOworICBtZW1jcHkgKGhkci5hcl9uYW1lICsgQVJNQVBfRU5EX0lOREVYLCBBUk1BUF9FTkQsIHNpemVvZiBBUk1BUF9FTkQgLSAxKTsKKworICAvKiBXcml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBhcmNoaXZlIGhlYWRlciB0byBiZSBqdXN0IGEgbGl0dGxlIGJpdAorICAgICBsYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwKKyAgICAgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUuICBBY3R1YWxseSwgdGhlIFVsdHJpeAorICAgICBsaW5rZXIganVzdCBjaGVja3MgdGhlIGFyY2hpdmUgbmFtZTsgdGhlIEdOVSBsaW5rZXIgbWF5IGNoZWNrIHRoZQorICAgICBkYXRlLiAgKi8KKyAgc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKTsKKyAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgKHN0YXRidWYuc3RfbXRpbWUgKyA2MCkpOworCisgIC8qIFRoZSBERUNzdGF0aW9uIHVzZXMgemVyb2VzIGZvciB0aGUgdWlkLCBnaWQgYW5kIG1vZGUgb2YgdGhlCisgICAgIGFybWFwLiAgKi8KKyAgaGRyLmFyX3VpZFswXSA9ICcwJzsKKyAgaGRyLmFyX2dpZFswXSA9ICcwJzsKKyAgaGRyLmFyX21vZGVbMF0gPSAnMCc7CisKKyAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOworCisgIGhkci5hcl9mbWFnWzBdID0gJ2AnOworICBoZHIuYXJfZm1hZ1sxXSA9ICdcMDEyJzsKKworICAvKiBUdXJuIGFsbCBudWxsIGJ5dGVzIGluIHRoZSBoZWFkZXIgaW50byBzcGFjZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQorICAgaWYgKCgoY2hhciAqKSgmaGRyKSlbaV0gPT0gJ1wwJykKKyAgICAgKCgoY2hhciAqKSgmaGRyKSlbaV0pID0gJyAnOworCisgIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCisgICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQorICAgIHJldHVybiBmYWxzZTsKKworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBoYXNoc2l6ZSwgdGVtcCk7CisgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgaGFzaHRhYmxlID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHN5bWRlZnNpemUpOworICBpZiAoIWhhc2h0YWJsZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKKyAgbGFzdF9lbHQgPSBjdXJyZW50OworICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKKworICAgICAgLyogQWR2YW5jZSBmaXJzdHJlYWwgdG8gdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhpcyBhcmNoaXZlCisJIGVsZW1lbnQuICAqLworICAgICAgaWYgKCgoYmZkICopIG1hcFtpXS5wb3MpICE9IGxhc3RfZWx0KQorCXsKKwkgIGRvCisJICAgIHsKKwkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOworCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOworCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OworCSAgICB9CisJICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIG1hcFtpXS5wb3MpOworCX0KKworICAgICAgbGFzdF9lbHQgPSBjdXJyZW50OworCisgICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoKm1hcFtpXS5uYW1lLCAmcmVoYXNoLCBoYXNoc2l6ZSwgaGFzaGxvZyk7CisgICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKGhhc2ggKiA4KSArIDQpKSAhPSAwKQorCXsKKwkgIHVuc2lnbmVkIGludCBzcmNoOworCisJICAvKiBUaGUgZGVzaXJlZCBzbG90IGlzIGFscmVhZHkgdGFrZW4uICAqLworCSAgZm9yIChzcmNoID0gKGhhc2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSk7CisJICAgICAgIHNyY2ggIT0gaGFzaDsKKwkgICAgICAgc3JjaCA9IChzcmNoICsgcmVoYXNoKSAmIChoYXNoc2l6ZSAtIDEpKQorCSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAoaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpKSA9PSAwKQorCSAgICAgIGJyZWFrOworCisJICBCRkRfQVNTRVJUIChzcmNoICE9IGhhc2gpOworCisJICBoYXNoID0gc3JjaDsKKwl9CisJCisgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBtYXBbaV0ubmFtaWR4LAorCQkgICAgKFBUUikgKGhhc2h0YWJsZSArIGhhc2ggKiA4KSk7CisgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBmaXJzdHJlYWwsCisJCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDggKyA0KSk7CisgICAgfQorCisgIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2h0YWJsZSwgMSwgc3ltZGVmc2l6ZSwgYWJmZCkgIT0gc3ltZGVmc2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIGhhc2h0YWJsZSk7CisKKyAgLyogTm93IHdyaXRlIHRoZSBzdHJpbmdzLiAgKi8KKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3RyaW5nc2l6ZSwgdGVtcCk7CisgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRlbXAsIDEsIDQsIGFiZmQpICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworICBmb3IgKGkgPSAwOyBpIDwgb3JsX2NvdW50OyBpKyspCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBsZW47CisKKyAgICAgIGxlbiA9IHN0cmxlbiAoKm1hcFtpXS5uYW1lKSArIDE7CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoKm1hcFtpXS5uYW1lKSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBUaGUgc3BlYyBzZXogdGhpcyBzaG91bGQgYmUgYSBuZXdsaW5lLiAgQnV0IGluIG9yZGVyIHRvIGJlCisgICAgIGJ1Zy1jb21wYXRpYmxlIGZvciBERUNzdGF0aW9uIGFyIHdlIHVzZSBhIG51bGwuICAqLworICBpZiAocGFkaXQpCisgICAgeworICAgICAgaWYgKGJmZF93cml0ZSAoIiIsIDEsIDEsIGFiZmQpICE9IDEpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2VlIHdoZXRoZXIgdGhpcyBCRkQgaXMgYW4gYXJjaGl2ZS4gIElmIGl0IGlzLCByZWFkIGluIHRoZSBhcm1hcAorICAgYW5kIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KKworY29uc3QgYmZkX3RhcmdldCAqCitfYmZkX2Vjb2ZmX2FyY2hpdmVfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKKyAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKKworICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOworICAgIH0KKworICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQorICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKKyAgICAgYXNzaWdubWVudC4gICovCisgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9CisgICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKKworICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCisgICAgeworICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKKyAgICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOworICAgIH0KKworICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gU0FSTUFHOworICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKKyAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOworICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOworICAKKyAgaWYgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAgKGFiZmQpID09IGZhbHNlCisgICAgICB8fCBfYmZkX2Vjb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpID09IGZhbHNlKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7CisgICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOworICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7CisgICAgfQorICAKKyAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKKyAgICB7CisgICAgICBiZmQgKmZpcnN0OworCisgICAgICAvKiBUaGlzIGFyY2hpdmUgaGFzIGEgbWFwLCBzbyB3ZSBtYXkgcHJlc3VtZSB0aGF0IHRoZSBjb250ZW50cworCSBhcmUgb2JqZWN0IGZpbGVzLiAgTWFrZSBzdXJlIHRoYXQgaWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCisJIGFyY2hpdmUgY2FuIGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0IGZpbGUsIGl0IGlzIGZvciB0aGlzCisJIHRhcmdldC4gIElmIG5vdCwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgd3JvbmcgZm9ybWF0LiAgSWYKKwkgdGhlIGZpcnN0IGZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlLCBzb21lYm9keSBpcyBkb2luZworCSBzb21ldGhpbmcgd2VpcmQsIGFuZCB3ZSBwZXJtaXQgaXQgc28gdGhhdCBhciAtdCB3aWxsIHdvcmsuICAqLworCisgICAgICBmaXJzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7CisgICAgICBpZiAoZmlyc3QgIT0gTlVMTCkKKwl7CisJICBib29sZWFuIGZhaWw7CisKKwkgIGZpcnN0LT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7CisJICBmYWlsID0gZmFsc2U7CisJICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlyc3QsIGJmZF9vYmplY3QpCisJICAgICAgJiYgZmlyc3QtPnh2ZWMgIT0gYWJmZC0+eHZlYykKKwkgICAgeworCSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGZpcnN0KTsKKwkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOworCSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKworCSAgLyogV2Ugb3VnaHQgdG8gY2xvc2UgZmlyc3QgaGVyZSwgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHdlCisgICAgICAgICAgICAgaGF2ZSBubyB3YXkgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGFyY2hpdmUgY2FjaGUuICBGSVhNRS4gICovCisJfQorICAgIH0KKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKwwKKy8qIEVDT0ZGIGxpbmtlciBjb2RlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWNvZmZfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAorCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOworc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOworc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgUFRSLCBjaGFyICopKTsKKworLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitlY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCisJIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAorCQkJCSB0YWJsZSwgc3RyaW5nKSk7CisKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KKyAgICAgIHJldC0+aW5keCA9IC0xOworICAgICAgcmV0LT5hYmZkID0gTlVMTDsKKyAgICAgIHJldC0+d3JpdHRlbiA9IDA7CisgICAgICByZXQtPnNtYWxsID0gMDsKKyAgICB9CisgIG1lbXNldCAoKFBUUikgJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIHJldC0+ZXN5bSk7CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBDcmVhdGUgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorX2JmZF9lY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCisJCQkJICAgZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQorICAgIHsKKyAgICAgIGZyZWUgKHJldCk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorICByZXR1cm4gJnJldC0+cm9vdDsKK30KKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKKyAgKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIFwKKyAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKKworLyogVHJhdmVyc2UgYW4gRUNPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAorICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCisgICAgKGluZm8pKSkKKworLyogR2V0IHRoZSBFQ09GRiBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCisgICBqdXN0IGEgY2FzdC4gICovCisKKyNkZWZpbmUgZWNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCisKKy8qIEdpdmVuIGFuIEVDT0ZGIEJGRCwgYWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGFzCisgICBhcHByb3ByaWF0ZS4gICovCisKK2Jvb2xlYW4KK19iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9vYmplY3Q6CisgICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8pOworICAgIGNhc2UgYmZkX2FyY2hpdmU6CisgICAgICByZXR1cm4gZWNvZmZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKKyAgICBkZWZhdWx0OgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBhcmNoaXZlIGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLgorICAgVGhpcyBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgc3ltYm9scywgbG9va3MgZWFjaCBvbmUgdXAgaW4gdGhlCisgICBhcmNoaXZlIGhhc2ggdGFibGUsIGFuZCBhZGRzIGFueSBhc3NvY2lhdGVkIG9iamVjdCBmaWxlLiAgV2UgZG8gbm90CisgICB1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyBiZWNhdXNlIEVDT0ZGIGFyY2hpdmVzCisgICBhbHJlYWR5IGhhdmUgYSBoYXNoIHRhYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gY29uc3RydWN0CisgICBhbm90aGVyIG9uZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7CisgIGNvbnN0IGJmZF9ieXRlICpyYXdfYXJtYXA7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqcHVuZGVmOworICB1bnNpZ25lZCBpbnQgYXJtYXBfY291bnQ7CisgIHVuc2lnbmVkIGludCBhcm1hcF9sb2c7CisgIHVuc2lnbmVkIGludCBpOworICBjb25zdCBiZmRfYnl0ZSAqaGFzaHRhYmxlOworICBjb25zdCBjaGFyICpzdHJpbmdiYXNlOworCisgIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKKyAgICB7CisgICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KKyAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCisJcmV0dXJuIHRydWU7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSByYXcgZGF0YSBmb3IgdGhpcyBhcmNoaXZlLCBhcyBjYW4gaGFwcGVuIG9uCisgICAgIElyaXggNC4wLjVGLCB3ZSBjYWxsIHRoZSBnZW5lcmljIHJvdXRpbmUuCisgICAgIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9yZSBjbGV2ZXIgYWJvdXQgdGhpcywgc2luY2Ugc29tZWRheSB0ZGF0YQorICAgICBtYXkgZ2V0IHRvIHNvbWV0aGluZyBmb3IgYSBnZW5lcmljIGFyY2hpdmUuICAqLworICByYXdfYXJtYXAgPSAoY29uc3QgYmZkX2J5dGUgKikgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhOworICBpZiAocmF3X2FybWFwID09IChiZmRfYnl0ZSAqKSBOVUxMKQorICAgIHJldHVybiAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworCSAgICAoYWJmZCwgaW5mbywgZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKKworICBhcm1hcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3X2FybWFwKTsKKworICBhcm1hcF9sb2cgPSAwOworICBmb3IgKGkgPSAxOyBpIDwgYXJtYXBfY291bnQ7IGkgPDw9IDEpCisgICAgYXJtYXBfbG9nKys7CisgIEJGRF9BU1NFUlQgKGkgPT0gYXJtYXBfY291bnQpOworCisgIGhhc2h0YWJsZSA9IHJhd19hcm1hcCArIDQ7CisgIHN0cmluZ2Jhc2UgPSAoY29uc3QgY2hhciAqKSByYXdfYXJtYXAgKyBhcm1hcF9jb3VudCAqIDggKyA4OworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scy4gICovCisgIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7CisgIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgdW5zaWduZWQgaW50IGhhc2gsIHJlaGFzaDsKKyAgICAgIHVuc2lnbmVkIGludCBmaWxlX29mZnNldDsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBiZmQgKmVsZW1lbnQ7CisKKyAgICAgIGggPSAqcHVuZGVmOworCisgICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KKwkgdGhlIGxpc3QuICAqLworICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCisJeworCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKKwkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KKwkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCisJICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55CisJICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbi4gICovCisJICBpZiAoKnB1bmRlZiAhPSBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCkKKwkgICAgKnB1bmRlZiA9ICgqcHVuZGVmKS0+bmV4dDsKKwkgIGVsc2UKKwkgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogTmF0aXZlIEVDT0ZGIGxpbmtlcnMgZG8gbm90IHB1bGwgaW4gYXJjaGl2ZSBlbGVtZW50cyBtZXJlbHkKKwkgdG8gc2F0aXNmeSBjb21tb24gZGVmaW5pdGlvbnMsIHNvIG5laXRoZXIgZG8gd2UuICBXZSBsZWF2ZQorCSB0aGVtIG9uIHRoZSBsaXN0LCB0aG91Z2gsIGluIGNhc2Ugd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBzb21lCisJIG90aGVyIG9iamVjdCBmb3JtYXQuICAqLworICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJeworCSAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogTG9vayBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCisgICAgICBoYXNoID0gZWNvZmZfYXJtYXBfaGFzaCAoaC0+cm9vdC5zdHJpbmcsICZyZWhhc2gsIGFybWFwX2NvdW50LAorCQkJICAgICAgIGFybWFwX2xvZyk7CisKKyAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCk7CisgICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKKwl7CisJICAvKiBOb3RoaW5nIGluIHRoaXMgc2xvdC4gICovCisJICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OworCSAgY29udGludWU7CisJfQorCisgICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKGhhc2ggKiA4KSk7CisgICAgICBpZiAobmFtZVswXSAhPSBoLT5yb290LnN0cmluZ1swXQorCSAgfHwgc3RyY21wIChuYW1lLCBoLT5yb290LnN0cmluZykgIT0gMCkKKwl7CisJICB1bnNpZ25lZCBpbnQgc3JjaDsKKwkgIGJvb2xlYW4gZm91bmQ7CisKKwkgIC8qIFRoYXQgd2FzIHRoZSB3cm9uZyBzeW1ib2wuICBUcnkgcmVoYXNoaW5nLiAgKi8KKwkgIGZvdW5kID0gZmFsc2U7CisJICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKTsKKwkgICAgICAgc3JjaCAhPSBoYXNoOworCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGFybWFwX2NvdW50IC0gMSkpCisJICAgIHsKKwkgICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSArIDQpOworCSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQorCQlicmVhazsKKwkgICAgICBuYW1lID0gc3RyaW5nYmFzZSArIGJmZF9oX2dldF8zMiAoYWJmZCwgaGFzaHRhYmxlICsgKHNyY2ggKiA4KSk7CisJICAgICAgaWYgKG5hbWVbMF0gPT0gaC0+cm9vdC5zdHJpbmdbMF0KKwkJICAmJiBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSA9PSAwKQorCQl7CisJCSAgZm91bmQgPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgaWYgKCEgZm91bmQpCisJICAgIHsKKwkgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGhhc2ggPSBzcmNoOworCX0KKworICAgICAgZWxlbWVudCA9ICgqYmFja2VuZC0+Z2V0X2VsdF9hdF9maWxlcG9zKSAoYWJmZCwgZmlsZV9vZmZzZXQpOworICAgICAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBVbmxpa2UgdGhlIGdlbmVyaWMgbGlua2VyLCB3ZSBrbm93IHRoYXQgdGhpcyBlbGVtZW50IHByb3ZpZGVzCisJIGEgZGVmaW5pdGlvbiBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgd2Uga25vdyB0aGF0IHdlIHdhbnQKKwkgdG8gaW5jbHVkZSBpdC4gIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYW55dGhpbmcuICAqLworICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBlbGVtZW50LCBuYW1lKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoZWxlbWVudCwgaW5mbykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgaWYgd2UgdXNlZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCisgICBiZWNhdXNlIHdlIHdlcmUgbm90IGRlYWxpbmcgd2l0aCBhbiBFQ09GRiBhcmNoaXZlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2Vjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBib29sZWFuICpwbmVlZGVkOworeworICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOworICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQorICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKKyAgSERSUiAqc3ltaGRyOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOworICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKKyAgc2l6ZV90IGVzaXplOworICBjaGFyICpzc2V4dCA9IE5VTEw7CisgIGNoYXIgKmV4dF9wdHI7CisgIGNoYXIgKmV4dF9lbmQ7CisKKyAgKnBuZWVkZWQgPSBmYWxzZTsKKworICBpZiAoISBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCisgICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKKworICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOworCisgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLworICBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7CisgIGVzaXplID0gc3ltaGRyLT5pZXh0TWF4ICogZXh0ZXJuYWxfZXh0X3NpemU7CisgIGV4dGVybmFsX2V4dCA9IChQVFIpIGJmZF9tYWxsb2MgKGVzaXplKTsKKyAgaWYgKGV4dGVybmFsX2V4dCA9PSBOVUxMICYmIGVzaXplICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX2V4dCwgMSwgZXNpemUsIGFiZmQpICE9IGVzaXplKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIHNzZXh0ID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3ltaGRyLT5pc3NFeHRNYXgpOworICBpZiAoc3NleHQgPT0gTlVMTCAmJiBzeW1oZHItPmlzc0V4dE1heCAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYlNzRXh0T2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgKGJmZF9yZWFkIChzc2V4dCwgMSwgc3ltaGRyLT5pc3NFeHRNYXgsIGFiZmQpICE9CisJICAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pc3NFeHRNYXgpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyB0byBzZWUgaWYgdGhleSBkZWZpbmUgc29tZQorICAgICBzeW1ib2wgdGhhdCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLiAgKi8KKyAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKKyAgZXh0X2VuZCA9IGV4dF9wdHIgKyBlc2l6ZTsKKyAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplKQorICAgIHsKKyAgICAgIEVYVFIgZXN5bTsKKyAgICAgIGJvb2xlYW4gZGVmOworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOworCisgICAgICAvKiBTZWUgaWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBzb21ldGhpbmcuICAqLworICAgICAgaWYgKGVzeW0uYXN5bS5zdCAhPSBzdEdsb2JhbAorCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0TGFiZWwKKwkgICYmIGVzeW0uYXN5bS5zdCAhPSBzdFByb2MpCisJY29udGludWU7CisKKyAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnNjKQorCXsKKwljYXNlIHNjVGV4dDoKKwljYXNlIHNjRGF0YToKKwljYXNlIHNjQnNzOgorCWNhc2Ugc2NBYnM6CisJY2FzZSBzY1NEYXRhOgorCWNhc2Ugc2NTQnNzOgorCWNhc2Ugc2NSRGF0YToKKwljYXNlIHNjQ29tbW9uOgorCWNhc2Ugc2NTQ29tbW9uOgorCWNhc2Ugc2NJbml0OgorCWNhc2Ugc2NGaW5pOgorCWNhc2Ugc2NSQ29uc3Q6CisJICBkZWYgPSB0cnVlOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGRlZiA9IGZhbHNlOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoISBkZWYpCisJY29udGludWU7CisKKyAgICAgIG5hbWUgPSBzc2V4dCArIGVzeW0uYXN5bS5pc3M7CisgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisKKyAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGRvIG5vdCBwdWxsIGluIGVsZW1lbnRzIGJlY2F1c2UKKwkgb2YgY29tbW9uIHN5bWJvbHMuICAqLworICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJY29udGludWU7CisKKyAgICAgIC8qIEluY2x1ZGUgdGhpcyBlbGVtZW50LiAgKi8KKyAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAoISBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICAqcG5lZWRlZCA9IHRydWU7CisgICAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOworICAgIH0KKworIHN1Y2Nlc3NmdWxfcmV0dXJuOgorICBpZiAoZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCisgICAgZnJlZSAoZXh0ZXJuYWxfZXh0KTsKKyAgaWYgKHNzZXh0ICE9IE5VTEwpCisgICAgZnJlZSAoc3NleHQpOworICByZXR1cm4gdHJ1ZTsKKyBlcnJvcl9yZXR1cm46CisgIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9leHQpOworICBpZiAoc3NleHQgIT0gTlVMTCkKKyAgICBmcmVlIChzc2V4dCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFQ09GRiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoCisgICB0YWJsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgSERSUiAqc3ltaGRyOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOworICBQVFIgZXh0ZXJuYWxfZXh0ID0gTlVMTDsKKyAgc2l6ZV90IGVzaXplOworICBjaGFyICpzc2V4dCA9IE5VTEw7CisgIGJvb2xlYW4gcmVzdWx0OworCisgIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IGl0LiAgKi8KKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3ltaGRyID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKKworICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBleHRlcm5hbCBzdHJpbmdzLiAgKi8KKyAgZXh0ZXJuYWxfZXh0X3NpemUgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKKyAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKKyAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOworICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7CisgIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkKKwkgICE9IChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgcmVzdWx0ID0gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KTsKKworICBpZiAoc3NleHQgIT0gTlVMTCkKKyAgICBmcmVlIChzc2V4dCk7CisgIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9leHQpOworICByZXR1cm4gcmVzdWx0OworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoc3NleHQgIT0gTlVMTCkKKyAgICBmcmVlIChzc2V4dCk7CisgIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9leHQpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIEFkZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBvZiBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGxpbmtlcgorICAgaGFzaCB0YWJsZS4gIFRoZSBleHRlcm5hbCBzeW1ib2xzIGFuZCBzdHJpbmdzIHdlIGFyZSBwYXNzZWQgYXJlCisgICBqdXN0IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGFuZCB3aWxsIGJlIGRpc2NhcmRlZC4gIFdlIG11c3QKKyAgIGV4cGxpY2l0bHkgc2F2ZSBhbnkgaW5mb3JtYXRpb24gd2UgbWF5IG5lZWQgbGF0ZXIgb24gaW4gdGhlIGxpbmsuCisgICBXZSBkbyBub3Qgd2FudCB0byByZWFkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gYWdhaW4uICAqLworCitzdGF0aWMgYm9vbGVhbgorZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzIChhYmZkLCBpbmZvLCBleHRlcm5hbF9leHQsIHNzZXh0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBQVFIgZXh0ZXJuYWxfZXh0OworICAgICBjaGFyICpzc2V4dDsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKKyAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47CisgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOworICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKKyAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOworICBjaGFyICpleHRfcHRyOworICBjaGFyICpleHRfZW5kOworCisgIGV4dF9jb3VudCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4OworCisgIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQorCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCSBleHRfY291bnQgKiBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKSk7CisgIGlmICghc3ltX2hhc2gpCisgICAgcmV0dXJuIGZhbHNlOworICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IHN5bV9oYXNoOworCisgIGV4dF9wdHIgPSAoY2hhciAqKSBleHRlcm5hbF9leHQ7CisgIGV4dF9lbmQgPSBleHRfcHRyICsgZXh0X2NvdW50ICogZXh0ZXJuYWxfZXh0X3NpemU7CisgIGZvciAoOyBleHRfcHRyIDwgZXh0X2VuZDsgZXh0X3B0ciArPSBleHRlcm5hbF9leHRfc2l6ZSwgc3ltX2hhc2grKykKKyAgICB7CisgICAgICBFWFRSIGVzeW07CisgICAgICBib29sZWFuIHNraXA7CisgICAgICBiZmRfdm1hIHZhbHVlOworICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgKnN5bV9oYXNoID0gTlVMTDsKKworICAgICAgKCpzd2FwX2V4dF9pbikgKGFiZmQsIChQVFIpIGV4dF9wdHIsICZlc3ltKTsKKworICAgICAgLyogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCisgICAgICBza2lwID0gZmFsc2U7CisgICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zdCkKKwl7CisJY2FzZSBzdEdsb2JhbDoKKwljYXNlIHN0U3RhdGljOgorCWNhc2Ugc3RMYWJlbDoKKwljYXNlIHN0UHJvYzoKKwljYXNlIHN0U3RhdGljUHJvYzoKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBza2lwID0gdHJ1ZTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKHNraXApCisJY29udGludWU7CisKKyAgICAgIC8qIEdldCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sLiAgKi8KKyAgICAgIHZhbHVlID0gZXN5bS5hc3ltLnZhbHVlOworICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCisJeworCWRlZmF1bHQ6CisJY2FzZSBzY05pbDoKKwljYXNlIHNjUmVnaXN0ZXI6CisJY2FzZSBzY0NkYkxvY2FsOgorCWNhc2Ugc2NCaXRzOgorCWNhc2Ugc2NDZGJTeXN0ZW06CisJY2FzZSBzY1JlZ0ltYWdlOgorCWNhc2Ugc2NJbmZvOgorCWNhc2Ugc2NVc2VyU3RydWN0OgorCWNhc2Ugc2NWYXI6CisJY2FzZSBzY1ZhclJlZ2lzdGVyOgorCWNhc2Ugc2NWYXJpYW50OgorCWNhc2Ugc2NCYXNlZFZhcjoKKwljYXNlIHNjWERhdGE6CisJY2FzZSBzY1BEYXRhOgorCSAgc2VjdGlvbiA9IE5VTEw7CisJICBicmVhazsKKwljYXNlIHNjVGV4dDoKKwkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOworCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisJY2FzZSBzY0RhdGE6CisJICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKKwkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKKwkgIGJyZWFrOworCWNhc2Ugc2NCc3M6CisJICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOworCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisJY2FzZSBzY0FiczoKKwkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgYnJlYWs7CisJY2FzZSBzY1VuZGVmaW5lZDoKKwkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCSAgYnJlYWs7CisJY2FzZSBzY1NEYXRhOgorCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOworCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisJY2FzZSBzY1NCc3M6CisJICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKKwkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKKwkgIGJyZWFrOworCWNhc2Ugc2NSRGF0YToKKwkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKKwkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKKwkgIGJyZWFrOworCWNhc2Ugc2NDb21tb246CisJICBpZiAodmFsdWUgPiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZSkKKwkgICAgeworCSAgICAgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2Ugc2NTQ29tbW9uOgorCSAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCisJICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOworCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047CisJICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKKwkgICAgICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOworCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbF9wdHI7CisJICAgICAgZWNvZmZfc2NvbV9zeW1ib2wubmFtZSA9IFNDT01NT047CisJICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07CisJICAgICAgZWNvZmZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247CisJICAgICAgZWNvZmZfc2NvbV9zeW1ib2xfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sOworCSAgICB9CisJICBzZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKKwkgIGJyZWFrOworCWNhc2Ugc2NTVW5kZWZpbmVkOgorCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBicmVhazsKKwljYXNlIHNjSW5pdDoKKwkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOworCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisJY2FzZSBzY0Zpbmk6CisJICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmZpbmkiKTsKKwkgIHZhbHVlIC09IHNlY3Rpb24tPnZtYTsKKwkgIGJyZWFrOworCWNhc2Ugc2NSQ29uc3Q6CisJICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnJjb25zdCIpOworCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKwljb250aW51ZTsKKworICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKKworICAgICAgaCA9IE5VTEw7CisgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkgICAgIChpbmZvLCBhYmZkLCBuYW1lLAorCSAgICAgIGVzeW0ud2Vha2V4dCA/IEJTRl9XRUFLIDogQlNGX0dMT0JBTCwKKwkgICAgICBzZWN0aW9uLCB2YWx1ZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgdHJ1ZSwgdHJ1ZSwKKwkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAqc3ltX2hhc2ggPSBoOworCisgICAgICAvKiBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gRUNPRkYgaGFzaCB0YWJsZSwgc2F2ZSB0aGUgZXh0ZXJuYWwKKwkgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF9nZXRfZmxhdm91ciAoYWJmZCkpCisJeworCSAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMCisJICAgICAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQorCQkgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikKKwkJICAgICAgfHwgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpKSkKKwkgICAgeworCSAgICAgIGgtPmFiZmQgPSBhYmZkOworCSAgICAgIGgtPmVzeW0gPSBlc3ltOworCSAgICB9CisKKwkgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBzeW1ib2wgd2FzIHNtYWxsIHVuZGVmaW5lZC4gICovCisJICBpZiAoZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKKwkgICAgaC0+c21hbGwgPSAxOworCisJICAvKiBJZiB0aGlzIHN5bWJvbCB3YXMgZXZlciBzbWFsbCB1bmRlZmluZWQsIGl0IG5lZWRzIHRvIHdpbmQKKwkgICAgIHVwIGluIGEgR1AgcmVsYXRpdmUgc2VjdGlvbi4gIFdlIGNhbid0IGNvbnRyb2wgdGhlCisJICAgICBzZWN0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wsIGJ1dCB3ZSBjYW4gY29udHJvbCB0aGUKKwkgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sLiAgVGhpcyBjYXNlIGlzIGFjdHVhbGx5IG5lZWRlZAorCSAgICAgb24gVWx0cml4IDQuMiB0byBoYW5kbGUgdGhlIHN5bWJvbCBjcmVkIGluIC1sY2tyYi4gICovCisJICBpZiAoaC0+c21hbGwKKwkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KKwkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm5hbWUsIFNDT01NT04pICE9IDApCisJICAgIHsKKwkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAorCQkJCQkJCQkgU0NPTU1PTik7CisJICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7CisJICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQ29tbW9uOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEVDT0ZGIGZpbmFsIGxpbmsgcm91dGluZXMuICAqLworCitzdGF0aWMgYm9vbGVhbiBlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUKKyAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkgICBQVFIgaGFuZGxlKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsCisgIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl9yZWxvY19saW5rX29yZGVyCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gZWNvZmZfbGlua193cml0ZV9leHRlcm5hbC4gICovCisKK3N0cnVjdCBleHRzeW1faW5mbworeworICBiZmQgKmFiZmQ7CisgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworfTsKKworLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lLiAgVGhpcyBsb29rcyB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEcworICAgYW5kIGdhdGhlcnMgdG9nZXRoZXIgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCB0aGVuCisgICBwcm9jZXNzZXMgYWxsIHRoZSBsaW5rIG9yZGVyIGluZm9ybWF0aW9uLiAgVGhpcyBtYXkgY2F1c2UgaXQgdG8KKyAgIGNsb3NlIGFuZCByZW9wZW4gc29tZSBpbnB1dCBCRkRzOyBJJ2xsIHNlZSBob3cgYmFkIHRoaXMgaXMuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOworICBIRFJSICpzeW1oZHI7CisgIFBUUiBoYW5kbGU7CisgIHJlZ2lzdGVyIGJmZCAqaW5wdXRfYmZkOworICBhc2VjdGlvbiAqbzsKKyAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87CisKKyAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGNvdW50cyBpbiB0aGUgc3ltYm9saWMKKyAgICAgaGVhZGVyLiAgKi8KKyAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7CisgIHN5bWhkci0+dnN0YW1wID0gMDsKKyAgc3ltaGRyLT5pbGluZU1heCA9IDA7CisgIHN5bWhkci0+Y2JMaW5lID0gMDsKKyAgc3ltaGRyLT5pZG5NYXggPSAwOworICBzeW1oZHItPmlwZE1heCA9IDA7CisgIHN5bWhkci0+aXN5bU1heCA9IDA7CisgIHN5bWhkci0+aW9wdE1heCA9IDA7CisgIHN5bWhkci0+aWF1eE1heCA9IDA7CisgIHN5bWhkci0+aXNzTWF4ID0gMDsKKyAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOworICBzeW1oZHItPmlmZE1heCA9IDA7CisgIHN5bWhkci0+Y3JmZCA9IDA7CisgIHN5bWhkci0+aWV4dE1heCA9IDA7CisKKyAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUgZGVidWdfaW5mbworICAgICBzdHJ1Y3R1cmUuICAqLworICBkZWJ1Zy0+bGluZSA9IE5VTEw7CisgIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOworICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKKyAgZGVidWctPmV4dGVybmFsX3N5bSA9IE5VTEw7CisgIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOworICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKKyAgZGVidWctPnNzID0gTlVMTDsKKyAgZGVidWctPnNzZXh0ID0gZGVidWctPnNzZXh0X2VuZCA9IE5VTEw7CisgIGRlYnVnLT5leHRlcm5hbF9mZHIgPSBOVUxMOworICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKKyAgZGVidWctPmV4dGVybmFsX2V4dCA9IGRlYnVnLT5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKKworICBoYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKKyAgaWYgKGhhbmRsZSA9PSAoUFRSKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIGVhY2ggaW5wdXQgQkZELiAgKi8KKyAgZm9yIChpbnB1dF9iZmQgPSBpbmZvLT5pbnB1dF9iZmRzOworICAgICAgIGlucHV0X2JmZCAhPSAoYmZkICopIE5VTEw7CisgICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCisgICAgeworICAgICAgYm9vbGVhbiByZXQ7CisKKyAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQorCXsKKwkgIC8qIEFiaXRyYXJpbHkgc2V0IHRoZSBzeW1ib2xpYyBoZWFkZXIgdnN0YW1wIHRvIHRoZSB2c3RhbXAKKwkgICAgIG9mIHRoZSBmaXJzdCBvYmplY3QgZmlsZSBpbiB0aGUgbGluay4gICovCisJICBpZiAoc3ltaGRyLT52c3RhbXAgPT0gMCkKKwkgICAgc3ltaGRyLT52c3RhbXAKKwkgICAgICA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLnZzdGFtcDsKKwkgIHJldCA9IGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAoYWJmZCwgaW5wdXRfYmZkLCBpbmZvLAorCQkJCQkJICAgaGFuZGxlKTsKKwl9CisgICAgICBlbHNlCisJcmV0ID0gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIgKGhhbmRsZSwgYWJmZCwKKwkJCQkJCWRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwKKwkJCQkJCWlucHV0X2JmZCwgaW5mbyk7CisgICAgICBpZiAoISByZXQpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBDb21iaW5lIHRoZSByZWdpc3RlciBtYXNrcy4gICovCisgICAgICBlY29mZl9kYXRhIChhYmZkKS0+Z3BybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncHJtYXNrOworICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmZwcm1hc2sgfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZnBybWFzazsKKyAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzBdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMF07CisgICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1sxXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzFdOworICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMl0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1syXTsKKyAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzNdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbM107CisgICAgfQorCisgIC8qIFdyaXRlIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCisgIGVpbmZvLmFiZmQgPSBhYmZkOworICBlaW5mby5pbmZvID0gaW5mbzsKKyAgZWNvZmZfbGlua19oYXNoX3RyYXZlcnNlIChlY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLAorCQkJICAgIChQVFIpICZlaW5mbyk7CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIG1ha2UgYSBwYXNzIG92ZXIgdGhlIGxpbmtfb3JkZXJzIHRvIGNvdW50IHVwIHRoZQorCSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgd2Ugd2lsbCBuZWVkIHRvIG91dHB1dCwgc28gdGhhdCB3ZSBrbm93CisJIGhvdyBtdWNoIHNwYWNlIHRoZXkgd2lsbCB0YWtlIHVwLiAgKi8KKyAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKKwl7CisJICBvLT5yZWxvY19jb3VudCA9IDA7CisJICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7CisJICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCSAgICAgICBwID0gcC0+bmV4dCkKKwkgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJICAgICAgby0+cmVsb2NfY291bnQgKz0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5yZWxvY19jb3VudDsKKwkgICAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCisJICAgICAgKytvLT5yZWxvY19jb3VudDsKKwl9CisgICAgfQorCisgIC8qIENvbXB1dGUgdGhlIHJlbG9jIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMuICAqLworICBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zIChhYmZkKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAoaGFuZGxlLCBhYmZkLCBkZWJ1ZywKKwkJCQkJICAgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8sCisJCQkJCSAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChoYW5kbGUsIGFiZmQsIGRlYnVnLCAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbyk7CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICAvKiBOb3cgcmVzZXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0CisJIEJGRCB0byAwLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55CisJIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCB0aHVzIGZhci4gICovCisgICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCisJby0+cmVsb2NfY291bnQgPSAwOworICAgIH0KKworICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KKyAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9PSAwKQorICAgIHsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfZ3AiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQorCWVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IChoLT51LmRlZi52YWx1ZQorCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICBiZmRfdm1hIGxvOworCisJICAvKiBNYWtlIHVwIGEgdmFsdWUuICAqLworCSAgbG8gPSAoYmZkX3ZtYSkgLTE7CisJICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCisJICAgIHsKKwkgICAgICBpZiAoby0+dm1hIDwgbG8KKwkJICAmJiAoc3RyY21wIChvLT5uYW1lLCBfU0JTUykgPT0gMAorCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9TREFUQSkgPT0gMAorCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVQ0KSA9PSAwCisJCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDgpID09IDAKKwkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUQSkgPT0gMCkpCisJCWxvID0gby0+dm1hOworCSAgICB9CisJICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBsbyArIDB4ODAwMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYworCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKKwkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCisJfQorICAgIH0KKworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOworCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCSAgIHAgPSBwLT5uZXh0KQorCXsKKwkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCisJICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKKwkJICA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpKQorCSAgICB7CisJICAgICAgaWYgKCEgZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQorCSAgICB7CisJICAgICAgaWYgKCEgZWNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltaGRyLT5pZXh0TWF4ICsgc3ltaGRyLT5pc3ltTWF4OworCisgIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIgPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGFuIGlucHV0IEJGRCBpbnRvIHRoZQorICAgb3V0cHV0IEJGRC4gIFRoaXMgbXVzdCByZWFkIGluIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBvZiB0aGUKKyAgIGlucHV0IEJGRC4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgaGFuZGxlKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgUFRSIGhhbmRsZTsKK3sKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmZvOworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQorICAgICZlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwOworICBIRFJSICpzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKKyAgYm9vbGVhbiByZXQ7CisKKyNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKKyAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCisgICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAorICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCisJewkJCQkJCQkJXAorICAgICAgICAgIHJldCA9IGZhbHNlOwkJCQkJCQlcCisgICAgICAgICAgZ290byByZXR1cm5fc29tZXRoaW5nOwkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICAgIGlmICgoYmZkX3NlZWsgKGlucHV0X2JmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpCVwKKwkgICAhPSAwKQkJCQkJCQlcCisJICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCisJCQlpbnB1dF9iZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCVwKKwl7CQkJCQkJCQlcCisgICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKKyAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0KKworICAvKiBJZiByYXdfc3ltZW50cyBpcyBub3QgTlVMTCwgdGhlbiB0aGUgZGF0YSB3YXMgYWxyZWFkeSBieSByZWFkIGJ5CisgICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mby4gICovCisgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQorICAgIHsKKyAgICAgIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLAorCSAgICB1bnNpZ25lZCBjaGFyICopOworICAgICAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOworICAgICAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOworICAgICAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7CisgICAgICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKKyAgICAgIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCisJICAgIHVuaW9uIGF1eF9leHQgKik7CisgICAgICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOworICAgICAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOworICAgICAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7CisgICAgfQorI3VuZGVmIFJFQUQKKworICAvKiBXZSBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwgc3RyaW5ncyBvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCisKKyAgcmV0ID0gKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCisJIChoYW5kbGUsIG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKKwkgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwKKwkgIGlucHV0X2JmZCwgZGVidWcsIHN3YXAsIGluZm8pKTsKKworIHJldHVybl9zb21ldGhpbmc6CisgIGlmIChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5yYXdfc3ltZW50cyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQorCWZyZWUgKGRlYnVnLT5saW5lKTsKKyAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCisJZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7CisgICAgICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQorCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOworICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKKwlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKKyAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCisJZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7CisgICAgICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQorCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOworICAgICAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQorCWZyZWUgKGRlYnVnLT5zcyk7CisgICAgICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQorCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOworICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKKwlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKKworICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSBmb2xsb3cgb25lIG9mIHRoZXNlIHBvaW50ZXJzCisJIGludG8gZnJlZWQgbWVtb3J5LiAgKi8KKyAgICAgIGRlYnVnLT5saW5lID0gTlVMTDsKKyAgICAgIGRlYnVnLT5leHRlcm5hbF9kbnIgPSBOVUxMOworICAgICAgZGVidWctPmV4dGVybmFsX3BkciA9IE5VTEw7CisgICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKKyAgICAgIGRlYnVnLT5leHRlcm5hbF9vcHQgPSBOVUxMOworICAgICAgZGVidWctPmV4dGVybmFsX2F1eCA9IE5VTEw7CisgICAgICBkZWJ1Zy0+c3MgPSBOVUxMOworICAgICAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7CisgICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcmZkID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogUHV0IG91dCBpbmZvcm1hdGlvbiBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgVGhlc2UgY29tZSBvbmx5IGZyb20KKyAgIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2Vjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwgKGgsIGRhdGEpCisgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOworICBiZmQgKm91dHB1dF9iZmQgPSBlaW5mby0+YWJmZDsKKyAgYm9vbGVhbiBzdHJpcDsKKworICAvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHN0cmlwcGVkLiAqLworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisgICAgc3RyaXAgPSBmYWxzZTsKKyAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAorCSAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQorCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCisJCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKKwkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQorICAgIHN0cmlwID0gdHJ1ZTsKKyAgZWxzZQorICAgIHN0cmlwID0gZmFsc2U7CisKKyAgaWYgKHN0cmlwIHx8IGgtPndyaXR0ZW4pCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGgtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKKyAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7CisgICAgICBoLT5lc3ltLndlYWtleHQgPSAwOworICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7CisgICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKKyAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7CisgICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKKworICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7CisgICAgICBlbHNlCisJeworCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOworCSAgY29uc3QgY2hhciAqbmFtZTsKKworCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOworCQorCSAgaWYgKHN0cmNtcCAobmFtZSwgX1RFWFQpID09IDApCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQorCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NEYXRhOworCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkRBVEEpID09IDApCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9CU1MpID09IDApCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOworCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKKwkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOworCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfSU5JVCkgPT0gMCkKKwkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OworCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfRklOSSkgPT0gMCkKKwkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOworCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjUERhdGE7CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9YREFUQSkgPT0gMCkKKwkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NYRGF0YTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKKwkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSQ29uc3Q7CisJICBlbHNlCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOworCX0KKworICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKKyAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOworICAgIH0KKyAgZWxzZSBpZiAoaC0+ZXN5bS5pZmQgIT0gLTEpCisgICAgeworICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOworCisgICAgICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZQorCSBpbnB1dCBCRkQuICAqLworICAgICAgZGVidWcgPSAmZWNvZmZfZGF0YSAoaC0+YWJmZCktPmRlYnVnX2luZm87CisgICAgICBCRkRfQVNTRVJUIChoLT5lc3ltLmlmZCA+PSAwCisJCSAgJiYgaC0+ZXN5bS5pZmQgPCBkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCk7CisgICAgICBoLT5lc3ltLmlmZCA9IGRlYnVnLT5pZmRtYXBbaC0+ZXN5bS5pZmRdOworICAgIH0KKworICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgorICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyAhPSBzY1VuZGVmaW5lZAorCSAgJiYgaC0+ZXN5bS5hc3ltLnNjICE9IHNjU1VuZGVmaW5lZCkKKwloLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAorCSAgfHwgaC0+ZXN5bS5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKKwloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKKyAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKKwloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKKyAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCisJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOworICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisgICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjQ29tbW9uCisJICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTQ29tbW9uKQorCWgtPmVzeW0uYXN5bS5zYyA9IHNjQ29tbW9uOworICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKKyAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCisJIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgdXNlcyBpZXh0TWF4IHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgIHN5bWJvbCBudW1iZXIuICAqLworICBoLT5pbmR4ID0gZWNvZmZfZGF0YSAob3V0cHV0X2JmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7CisgIGgtPndyaXR0ZW4gPSAxOworCisgIHJldHVybiAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAorCSAgKG91dHB1dF9iZmQsICZlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mbywKKwkgICAmZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmRlYnVnX3N3YXAsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCisJICAgJmgtPmVzeW0pKTsKK30KKworLyogUmVsb2NhdGUgYW5kIHdyaXRlIGFuIEVDT0ZGIHNlY3Rpb24gaW50byBhbiBFQ09GRiBvdXRwdXQgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Cit7CisgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICBiZmQgKmlucHV0X2JmZDsKKyAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7CisgIGJmZF9zaXplX3R5cGUgcmF3X3NpemU7CisgIGJmZF9zaXplX3R5cGUgY29va2VkX3NpemU7CisgIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7CisgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKKyAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKKyAgUFRSIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7CisKKyAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOworCisgIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKyAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisgIHNlY3Rpb25fdGRhdGEgPSBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7CisKKyAgcmF3X3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7CisgIGNvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplOworICBpZiAoY29va2VkX3NpemUgPT0gMCkKKyAgICBjb29rZWRfc2l6ZSA9IHJhd19zaXplOworCisgIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKKyAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOworICBCRkRfQVNTRVJUIChjb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKKworICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBXZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBsYXJnZXIgb2YKKyAgICAgdGhlIHNpemUgYmVmb3JlIHJlbG9jYXRpbmcgYW5kIHRoZSBzaXplIGFmdGVyIHJlbG9jYXRpbmcuICAqLworICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChyYXdfc2l6ZSA+PSBjb29rZWRfc2l6ZQorCQkJCSAgICAgID8gKHNpemVfdCkgcmF3X3NpemUKKwkJCQkgICAgICA6IChzaXplX3QpIGNvb2tlZF9zaXplKTsKKyAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgcmF3X3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHRoZSBjb250ZW50cyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCisgICAgIG1lbW9yeSwgaW4gd2hpY2ggY2FzZSB3ZSBjb3B5IHRoZW0gaW50byBvdXIgbmV3IGJ1ZmZlci4gIFdlIGRvbid0CisgICAgIHNpbXBseSByZXVzZSB0aGUgb2xkIGJ1ZmZlciBpbiBjYXNlIGNvb2tlZF9zaXplID4gcmF3X3NpemUuICAqLworICBpZiAoc2VjdGlvbl90ZGF0YSAhPSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTAorICAgICAgJiYgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwpCisgICAgbWVtY3B5IChjb250ZW50cywgc2VjdGlvbl90ZGF0YS0+Y29udGVudHMsIChzaXplX3QpIHJhd19zaXplKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICAgIChQVFIpIGNvbnRlbnRzLAorCQkJCSAgICAgIChmaWxlX3B0cikgMCwgcmF3X3NpemUpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBHZXQgdGhlIHJlbG9jcy4gIElmIHdlIGFyZSByZWxheGluZyBNSVBTIGNvZGUsIHRoZXkgd2lsbCBhbHJlYWR5CisgICAgIGhhdmUgYmVlbiByZWFkIGluLiAgT3RoZXJ3aXNlLCB3ZSByZWFkIHRoZW0gaW4gbm93LiAgKi8KKyAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7CisgIGV4dGVybmFsX3JlbG9jc19zaXplID0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworCisgIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCisgICAgICAmJiBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKKyAgICBleHRlcm5hbF9yZWxvY3MgPSBzZWN0aW9uX3RkYXRhLT5leHRlcm5hbF9yZWxvY3M7CisgIGVsc2UKKyAgICB7CisgICAgICBleHRlcm5hbF9yZWxvY3MgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7CisgICAgICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBpbnB1dF9iZmQpCisJICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgIGlmICghICgoKmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPnJlbG9jYXRlX3NlY3Rpb24pCisJIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAorCSAgZXh0ZXJuYWxfcmVsb2NzKSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0ZWQgc2VjdGlvbi4gICovCisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwKKwkJCQkgIG91dHB1dF9zZWN0aW9uLAorCQkJCSAgKFBUUikgY29udGVudHMsCisJCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAorCQkJCSAgY29va2VkX3NpemUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCisgICAgIG1vZGlmaWVkLCBhbmQgd2Ugd3JpdGUgdGhlbSBvdXQgbm93LiAgV2UgdXNlIHRoZSByZWxvY19jb3VudAorICAgICBmaWVsZCBvZiBvdXRwdXRfc2VjdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdlCisgICAgIGhhdmUgb3V0cHV0IHNvIGZhci4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgeworICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAorCQkgICAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCisJCSAgICAgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSksCisJCSAgICBTRUVLX1NFVCkgIT0gMAorCSAgfHwgKGJmZF93cml0ZSAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSwgb3V0cHV0X2JmZCkKKwkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgICAgfQorCisgIGlmIChjb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGNvbnRlbnRzKTsKKyAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMICYmIHNlY3Rpb25fdGRhdGEgPT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoY29udGVudHMpOworICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQorICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSByZWxvYworICAgcmVxdWVzdGVkIGJ5IHRoZSBsaW5rZXIsIGFuZCBkb2VzIGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFRoaXMKKyAgIGlzIHVzZWQgdG8gYnVpbGQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIHdoZW4gbGlua2luZworICAgd2l0aCAtVXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWNvZmZfcmVsb2NfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworeworICBlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUgdHlwZTsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIGJmZF92bWEgYWRkZW5kOworICBhcmVsZW50IHJlbDsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jIGluOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7CisgIGJmZF9ieXRlICpyYnVmOworICBib29sZWFuIG9rOworCisgIHR5cGUgPSBsaW5rX29yZGVyLT50eXBlOworICBzZWN0aW9uID0gTlVMTDsKKyAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7CisKKyAgLyogV2Ugc2V0IHVwIGFuIGFyZWxlbnQgdG8gcGFzcyB0byB0aGUgYmFja2VuZCBhZGp1c3RfcmVsb2Nfb3V0CisgICAgIHJvdXRpbmUuICAqLworICByZWwuYWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKKworICByZWwuaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOworICBpZiAocmVsLmhvd3RvID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICh0eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCisgICAgeworICAgICAgc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uOworICAgICAgcmVsLnN5bV9wdHJfcHRyID0gc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIC8qIFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzIHRob3VnaCBpdCB3ZXJlCisgICAgICAgICBhY3R1YWxseSBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KKyAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAorCQkJCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKKwkJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICBpZiAoaCAhPSBOVUxMCisJICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisJeworCSAgdHlwZSA9IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI7CisJICBzZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisJICAvKiBJdCBzZWVtcyB0aGF0IHdlIG91Z2h0IHRvIGFkZCB0aGUgc3ltYm9sIHZhbHVlIHRvIHRoZQorICAgICAgICAgICAgIGFkZGVuZCBoZXJlLCBidXQgaW4gcHJhY3RpY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZAorICAgICAgICAgICAgIGJlY2F1c2UgaXQgd2FzIHBhc3NlZCB0byBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4gICovCisJICBhZGRlbmQgKz0gc2VjdGlvbi0+dm1hICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogV2UgY2FuJ3Qgc2V0IHVwIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBjb3JyZWN0bHksCisJICAgICBiZWNhdXNlIHdlIGhhdmUgbm8gYXN5bWJvbCBzdHJ1Y3R1cmUuICBDdXJyZW50bHkgbm8KKwkgICAgIGFkanVzdF9yZWxvY19vdXQgcm91dGluZSBjYXJlcy4gICovCisJICByZWwuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKKwl9CisgICAgfQorCisgIC8qIEFsbCBFQ09GRiByZWxvY3MgYXJlIGluLXBsYWNlLiAgUHV0IHRoZSBhZGRlbmQgaW50byB0aGUgb2JqZWN0CisgICAgIGZpbGUuICAqLworCisgIEJGRF9BU1NFUlQgKHJlbC5ob3d0by0+cGFydGlhbF9pbnBsYWNlKTsKKyAgaWYgKGFkZGVuZCAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKKyAgICAgIGJmZF9ieXRlICpidWY7CisgICAgICBib29sZWFuIG9rOworCisgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWwuaG93dG8pOworICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKKyAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChyZWwuaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKKyAgICAgIHN3aXRjaCAocnN0YXQpCisJeworCWNhc2UgYmZkX3JlbG9jX29rOgorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgYWJvcnQgKCk7CisJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgKGluZm8sCisJCSAgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCQkgICA/IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pCisJCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAorCQkgIHJlbC5ob3d0by0+bmFtZSwgYWRkZW5kLCAoYmZkICopIE5VTEwsCisJCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCisJICAgIHsKKwkgICAgICBmcmVlIChidWYpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLCAoUFRSKSBidWYsCisJCQkJICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwgc2l6ZSk7CisgICAgICBmcmVlIChidWYpOworICAgICAgaWYgKCEgb2spCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZWwuYWRkZW5kID0gMDsKKworICAvKiBNb3ZlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgaW50ZXJuYWxfcmVsb2Mgc3RydWN0dXJlLiAgKi8KKyAgaW4ucl92YWRkciA9IChyZWwuYWRkcmVzcworCQkrIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKSk7CisgIGluLnJfdHlwZSA9IHJlbC5ob3d0by0+dHlwZTsKKworICBpZiAodHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCisgICAgeworICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgaCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCisJCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKKwkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgaWYgKGggIT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgJiYgaC0+aW5keCAhPSAtMSkKKwlpbi5yX3N5bW5keCA9IGgtPmluZHg7CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQorCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCisJCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGluLnJfc3ltbmR4ID0gMDsKKwl9CisgICAgICBpbi5yX2V4dGVybiA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQ09OU1QgY2hhciAqbmFtZTsKKworICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzZWN0aW9uKTsKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQorCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKKwlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOworICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQorCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOworICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKKwlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKKwlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKKwlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi54ZGF0YSIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOworICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBkYXRhIikgPT0gMCkKKwlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0YSIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIqQUJTKiIpID09IDApCisJaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yY29uc3QiKSA9PSAwKQorCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisgICAgICBpbi5yX2V4dGVybiA9IDA7CisgICAgfQorCisgIC8qIExldCB0aGUgQkZEIGJhY2tlbmQgYWRqdXN0IHRoZSByZWxvYy4gICovCisgICgqZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmFkanVzdF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmcmVsLCAmaW4pOworCisgIC8qIEdldCBzb21lIG1lbW9yeSBhbmQgc3dhcCBvdXQgdGhlIHJlbG9jLiAgKi8KKyAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5leHRlcm5hbF9yZWxvY19zaXplOworICByYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jX3NpemUpOworICBpZiAocmJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+c3dhcF9yZWxvY19vdXQpIChvdXRwdXRfYmZkLCAmaW4sIChQVFIpIHJidWYpOworCisgIG9rID0gKGJmZF9zZWVrIChvdXRwdXRfYmZkLAorCQkgIChvdXRwdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MgKworCQkgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKKwkJICBTRUVLX1NFVCkgPT0gMAorCSYmIChiZmRfd3JpdGUgKChQVFIpIHJidWYsIDEsIGV4dGVybmFsX3JlbG9jX3NpemUsIG91dHB1dF9iZmQpCisJICAgID09IGV4dGVybmFsX3JlbG9jX3NpemUpKTsKKworICBpZiAob2spCisgICAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisKKyAgZnJlZSAocmJ1Zik7CisKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvYmZkL2Vjb2ZmbGluay5jIGIvYmZkL2Vjb2ZmbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjBhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWNvZmZsaW5rLmMKQEAgLTAsMCArMSwyNDk5IEBACisvKiBSb3V0aW5lcyB0byBsaW5rIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgIm9iamFsbG9jLmgiCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjb2ZmL3N5bS5oIgorI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKKyNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorI2luY2x1ZGUgImxpYmVjb2ZmLmgiCisMCitzdGF0aWMgYm9vbGVhbiBlY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKKwkJCQkJc2l6ZV90IG5lZWQpKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cmluZ19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCSAgIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgZWNvZmZfYWxpZ25fZGVidWcgUEFSQU1TICgoYmZkICphYmZkLAorCQkJCSAgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7CitzdGF0aWMgYm9vbGVhbiBlY29mZl93cml0ZV9zeW1oZHIgUEFSQU1TICgoYmZkICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICosCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICosCisJCQkJCSAgIGZpbGVfcHRyIHdoZXJlKSk7CitzdGF0aWMgaW50IGNtcF9mZHJ0YWJfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIG1rX2ZkcnRhYiBQQVJBTVMgKChiZmQgKiwKKwkJCQkgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCisJCQkJICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LAorCQkJCSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKSk7CitzdGF0aWMgbG9uZyBmZHJ0YWJfbG9va3VwIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gbG9va3VwX2xpbmUKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKSk7CisMCisvKiBSb3V0aW5lcyB0byBzd2FwIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgSSBhbSBhc3N1bWluZworICAgdGhhdCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGZvcm1hdCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGFyZ2V0CisgICBpbmRlcGVuZGVudC4gICovCisKKy8qIFN3YXAgaW4gYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZC4KKyAgIEJJR0VORCBzYXlzIHdoZXRoZXIgQVVYIHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbjsgdGhpcworICAgaW5mbyBjb21lcyBmcm9tIHRoZSBmaWxlIGhlYWRlciByZWNvcmQgKGZoLWZCaWdlbmRpYW4pLiAgKi8KKwordm9pZAorX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiAoYmlnZW5kLCBleHRfY29weSwgaW50ZXJuKQorICAgICBpbnQgYmlnZW5kOworICAgICBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqZXh0X2NvcHk7CisgICAgIFRJUiAqaW50ZXJuOworeworICBzdHJ1Y3QgdGlyX2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICpleHRfY29weTsJCS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCisgIAorICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLworICBpZiAoYmlnZW5kKSB7CisgICAgaW50ZXJuLT5mQml0ZmllbGQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9GQklURklFTERfQklHKTsKKyAgICBpbnRlcm4tPmNvbnRpbnVlZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcpOworICAgIGludGVybi0+YnQgICAgICAgICAgPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0JUX0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFMxX0JUX1NIX0JJRzsKKyAgICBpbnRlcm4tPnRxNCAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE0X0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFNfVFE0X1NIX0JJRzsKKyAgICBpbnRlcm4tPnRxNSAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE1X0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFNfVFE1X1NIX0JJRzsKKyAgICBpbnRlcm4tPnRxMCAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFEwX0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFNfVFEwX1NIX0JJRzsKKyAgICBpbnRlcm4tPnRxMSAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFExX0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFNfVFExX1NIX0JJRzsKKyAgICBpbnRlcm4tPnRxMiAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEyX0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFNfVFEyX1NIX0JJRzsKKyAgICBpbnRlcm4tPnRxMyAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEzX0JJRykKKwkJCT4+CQkgICAgVElSX0JJVFNfVFEzX1NIX0JJRzsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcm4tPmZCaXRmaWVsZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUpOworICAgIGludGVybi0+Y29udGludWVkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRSk7CisgICAgaW50ZXJuLT5idCAgICAgICAgICA9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQlRfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUUzFfQlRfU0hfTElUVExFOworICAgIGludGVybi0+dHE0ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTRfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUU19UUTRfU0hfTElUVExFOworICAgIGludGVybi0+dHE1ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTVfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUU19UUTVfU0hfTElUVExFOworICAgIGludGVybi0+dHEwICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTBfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUU19UUTBfU0hfTElUVExFOworICAgIGludGVybi0+dHExICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTFfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUU19UUTFfU0hfTElUVExFOworICAgIGludGVybi0+dHEyICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTJfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUU19UUTJfU0hfTElUVExFOworICAgIGludGVybi0+dHEzICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTNfTElUVExFKQorCQkJPj4JCSAgICBUSVJfQklUU19UUTNfU0hfTElUVExFOworICB9CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKy8qIFN3YXAgb3V0IGEgdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQuCisgICBCSUdFTkQgc2F5cyB3aGV0aGVyIEFVWCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW47IHRoaXMKKyAgIGluZm8gY29tZXMgZnJvbSB0aGUgZmlsZSBoZWFkZXIgcmVjb3JkIChmaC1mQmlnZW5kaWFuKS4gICovCisKK3ZvaWQKK19iZmRfZWNvZmZfc3dhcF90aXJfb3V0IChiaWdlbmQsIGludGVybl9jb3B5LCBleHQpCisgICAgIGludCBiaWdlbmQ7CisgICAgIGNvbnN0IFRJUiAqaW50ZXJuX2NvcHk7CisgICAgIHN0cnVjdCB0aXJfZXh0ICpleHQ7Cit7CisgIFRJUiBpbnRlcm5bMV07CisKKyAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KKyAgCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCisgIGlmIChiaWdlbmQpIHsKKyAgICBleHQtPnRfYml0czFbMF0gPSAoKGludGVybi0+ZkJpdGZpZWxkID8gVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcgOiAwKQorCQkgICAgICAgfCAoaW50ZXJuLT5jb250aW51ZWQgPyBUSVJfQklUUzFfQ09OVElOVUVEX0JJRyA6IDApCisJCSAgICAgICB8ICgoaW50ZXJuLT5idCA8PCBUSVJfQklUUzFfQlRfU0hfQklHKQorCQkJICAmIFRJUl9CSVRTMV9CVF9CSUcpKTsKKyAgICBleHQtPnRfdHE0NVswXSA9ICgoKGludGVybi0+dHE0IDw8IFRJUl9CSVRTX1RRNF9TSF9CSUcpCisJCSAgICAgICAmIFRJUl9CSVRTX1RRNF9CSUcpCisJCSAgICAgIHwgKChpbnRlcm4tPnRxNSA8PCBUSVJfQklUU19UUTVfU0hfQklHKQorCQkJICYgVElSX0JJVFNfVFE1X0JJRykpOworICAgIGV4dC0+dF90cTAxWzBdID0gKCgoaW50ZXJuLT50cTAgPDwgVElSX0JJVFNfVFEwX1NIX0JJRykKKwkJICAgICAgICYgVElSX0JJVFNfVFEwX0JJRykKKwkJICAgICAgfCAoKGludGVybi0+dHExIDw8IFRJUl9CSVRTX1RRMV9TSF9CSUcpCisJCQkgJiBUSVJfQklUU19UUTFfQklHKSk7CisgICAgZXh0LT50X3RxMjNbMF0gPSAoKChpbnRlcm4tPnRxMiA8PCBUSVJfQklUU19UUTJfU0hfQklHKQorCQkgICAgICAgJiBUSVJfQklUU19UUTJfQklHKQorCQkgICAgICB8ICgoaW50ZXJuLT50cTMgPDwgVElSX0JJVFNfVFEzX1NIX0JJRykKKwkJCSAmIFRJUl9CSVRTX1RRM19CSUcpKTsKKyAgfSBlbHNlIHsKKyAgICBleHQtPnRfYml0czFbMF0gPSAoKGludGVybi0+ZkJpdGZpZWxkID8gVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUgOiAwKQorCQkgICAgICAgfCAoaW50ZXJuLT5jb250aW51ZWQgPyBUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRSA6IDApCisJCSAgICAgICB8ICgoaW50ZXJuLT5idCA8PCBUSVJfQklUUzFfQlRfU0hfTElUVExFKQorCQkJICAmIFRJUl9CSVRTMV9CVF9MSVRUTEUpKTsKKyAgICBleHQtPnRfdHE0NVswXSA9ICgoKGludGVybi0+dHE0IDw8IFRJUl9CSVRTX1RRNF9TSF9MSVRUTEUpCisJCSAgICAgICAmIFRJUl9CSVRTX1RRNF9MSVRUTEUpCisJCSAgICAgIHwgKChpbnRlcm4tPnRxNSA8PCBUSVJfQklUU19UUTVfU0hfTElUVExFKQorCQkJICYgVElSX0JJVFNfVFE1X0xJVFRMRSkpOworICAgIGV4dC0+dF90cTAxWzBdID0gKCgoaW50ZXJuLT50cTAgPDwgVElSX0JJVFNfVFEwX1NIX0xJVFRMRSkKKwkJICAgICAgICYgVElSX0JJVFNfVFEwX0xJVFRMRSkKKwkJICAgICAgfCAoKGludGVybi0+dHExIDw8IFRJUl9CSVRTX1RRMV9TSF9MSVRUTEUpCisJCQkgJiBUSVJfQklUU19UUTFfTElUVExFKSk7CisgICAgZXh0LT50X3RxMjNbMF0gPSAoKChpbnRlcm4tPnRxMiA8PCBUSVJfQklUU19UUTJfU0hfTElUVExFKQorCQkgICAgICAgJiBUSVJfQklUU19UUTJfTElUVExFKQorCQkgICAgICB8ICgoaW50ZXJuLT50cTMgPDwgVElSX0JJVFNfVFEzX1NIX0xJVFRMRSkKKwkJCSAmIFRJUl9CSVRTX1RRM19MSVRUTEUpKTsKKyAgfQorCisjaWZkZWYgVEVTVAorICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCisgICAgYWJvcnQoKTsKKyNlbmRpZgorfQorCisvKiBTd2FwIGluIGEgcmVsYXRpdmUgc3ltYm9sIHJlY29yZC4gIEJJR0VORCBzYXlzIHdoZXRoZXIgaXQgaXMgaW4KKyAgIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXQuKi8KKwordm9pZAorX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZCwgZXh0X2NvcHksIGludGVybikKKyAgICAgaW50IGJpZ2VuZDsKKyAgICAgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICpleHRfY29weTsKKyAgICAgUk5EWFIgKmludGVybjsKK3sKKyAgc3RydWN0IHJuZHhfZXh0IGV4dFsxXTsKKworICAqZXh0ID0gKmV4dF9jb3B5OwkJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KKyAgCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCisgIGlmIChiaWdlbmQpIHsKKyAgICBpbnRlcm4tPnJmZCAgID0gKGV4dC0+cl9iaXRzWzBdIDw8IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHKQorCQkgIHwgKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfUkZEX0JJRykKKwkJICAgIAkJICAgID4+IFJORFhfQklUUzFfUkZEX1NIX0JJRyk7CisgICAgaW50ZXJuLT5pbmRleCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX0lOREVYX0JJRykKKwkJICAgIAkJICAgIDw8IFJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcpCisJCSAgfCAoZXh0LT5yX2JpdHNbMl0gPDwgUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKKwkJICB8IChleHQtPnJfYml0c1szXSA8PCBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKTsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcm4tPnJmZCAgID0gKGV4dC0+cl9iaXRzWzBdIDw8IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFKQorCQkgIHwgKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfUkZEX0xJVFRMRSkKKwkJICAgIAkJICAgIDw8IFJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFKTsKKyAgICBpbnRlcm4tPmluZGV4ID0gKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfSU5ERVhfTElUVExFKQorCQkgICAgCQkgICAgPj4gUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUpCisJCSAgfCAoZXh0LT5yX2JpdHNbMl0gPDwgUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRSkKKwkJICB8ICgodW5zaWduZWQgaW50KSBleHQtPnJfYml0c1szXQorCQkgICAgIDw8IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpOworICB9CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKy8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgc3ltYm9sIHJlY29yZC4gIEJJR0VORCBzYXlzIHdoZXRoZXIgaXQgaXMgaW4KKyAgIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXQuKi8KKwordm9pZAorX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0IChiaWdlbmQsIGludGVybl9jb3B5LCBleHQpCisgICAgIGludCBiaWdlbmQ7CisgICAgIGNvbnN0IFJORFhSICppbnRlcm5fY29weTsKKyAgICAgc3RydWN0IHJuZHhfZXh0ICpleHQ7Cit7CisgIFJORFhSIGludGVyblsxXTsKKworICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLworICAKKyAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KKyAgaWYgKGJpZ2VuZCkgeworICAgIGV4dC0+cl9iaXRzWzBdID0gaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUc7CisgICAgZXh0LT5yX2JpdHNbMV0gPSAoKChpbnRlcm4tPnJmZCA8PCBSTkRYX0JJVFMxX1JGRF9TSF9CSUcpCisJCSAgICAgICAmIFJORFhfQklUUzFfUkZEX0JJRykKKwkJICAgICAgfCAoKGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRykKKwkJCSAmIFJORFhfQklUUzFfSU5ERVhfQklHKSk7CisgICAgZXh0LT5yX2JpdHNbMl0gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUc7CisgICAgZXh0LT5yX2JpdHNbM10gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUc7CisgIH0gZWxzZSB7CisgICAgZXh0LT5yX2JpdHNbMF0gPSBpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRTsKKyAgICBleHQtPnJfYml0c1sxXSA9ICgoKGludGVybi0+cmZkID4+IFJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFKQorCQkgICAgICAgJiBSTkRYX0JJVFMxX1JGRF9MSVRUTEUpCisJCSAgICAgIHwgKChpbnRlcm4tPmluZGV4IDw8IFJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFKQorCQkJICYgUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUpKTsKKyAgICBleHQtPnJfYml0c1syXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRTsKKyAgICBleHQtPnJfYml0c1szXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRTsKKyAgfQorCisjaWZkZWYgVEVTVAorICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCisgICAgYWJvcnQoKTsKKyNlbmRpZgorfQorDAorLyogVGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgdG8gYWxsb2NhdGUuICAqLworI2RlZmluZSBBTExPQ19TSVpFICg0MDY0KQorCisvKiBBZGQgYnl0ZXMgdG8gYSBidWZmZXIuICBSZXR1cm4gc3VjY2Vzcy4gICovCisKK3N0YXRpYyBib29sZWFuCitlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBuZWVkKQorICAgICBjaGFyICoqYnVmOworICAgICBjaGFyICoqYnVmZW5kOworICAgICBzaXplX3QgbmVlZDsKK3sKKyAgc2l6ZV90IGhhdmU7CisgIHNpemVfdCB3YW50OworICBjaGFyICpuZXdidWY7CisKKyAgaGF2ZSA9ICpidWZlbmQgLSAqYnVmOworICBpZiAoaGF2ZSA+IG5lZWQpCisgICAgd2FudCA9IEFMTE9DX1NJWkU7CisgIGVsc2UKKyAgICB7CisgICAgICB3YW50ID0gbmVlZCAtIGhhdmU7CisgICAgICBpZiAod2FudCA8IEFMTE9DX1NJWkUpCisJd2FudCA9IEFMTE9DX1NJWkU7CisgICAgfQorICBuZXdidWYgPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoKmJ1ZiwgaGF2ZSArIHdhbnQpOworICBpZiAobmV3YnVmID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICAqYnVmID0gbmV3YnVmOworICAqYnVmZW5kID0gKmJ1ZiArIGhhdmUgKyB3YW50OworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgd2hpY2ggbWFwcyBzdHJpbmdzIHRvIG51bWJlcnMuICBXZSB1c2UgaXQgdG8KKyAgIG1hcCBGRFIgbmFtZXMgdG8gaW5kaWNlcyBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBtYXAgbG9jYWwKKyAgIHN0cmluZ3Mgd2hlbiBjb21iaW5pbmcgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworICAvKiBGRFIgaW5kZXggb3Igc3RyaW5nIHRhYmxlIG9mZnNldC4gICovCisgIGxvbmcgdmFsOworICAvKiBOZXh0IGVudHJ5IGluIHN0cmluZyB0YWJsZS4gICovCisgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbmV4dDsKK307CisKK3N0cnVjdCBzdHJpbmdfaGFzaF90YWJsZQoreworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Cit9OworCisvKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitzdHJpbmdfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQorCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOworCisgIGlmIChyZXQpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KKyAgICAgIHJldC0+dmFsID0gLTE7CisgICAgICByZXQtPm5leHQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gc3RyaW5nIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIHN0cmluZ19oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAorICAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBcCisgICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCisKKy8qIFdlIGNhbid0IGFmZm9yZCB0byByZWFkIGluIGFsbCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoZW4gd2UgZG8KKyAgIGEgbGluay4gIEluc3RlYWQsIHdlIGJ1aWxkIGEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIHRvIHNob3cgaG93CisgICBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGlucHV0IGZpbGUgbWFwIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisKK3N0cnVjdCBzaHVmZmxlCit7CisgIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoaXMgbGlua2VkIGxpc3QuICAqLworICBzdHJ1Y3Qgc2h1ZmZsZSAqbmV4dDsKKyAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW5mb3JtYXRpb24uICAqLworICB1bnNpZ25lZCBsb25nIHNpemU7CisgIC8qIFdoZXRoZXIgdGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIGEgZmlsZSBvciBub3QuICAqLworICBib29sZWFuIGZpbGVwOworICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdAorCXsKKwkgIC8qIFRoZSBCRkQgdGhlIGRhdGEgY29tZXMgZnJvbS4gICovCisJICBiZmQgKmlucHV0X2JmZDsKKwkgIC8qIFRoZSBvZmZzZXQgd2l0aGluIGlucHV0X2JmZC4gICovCisJICBmaWxlX3B0ciBvZmZzZXQ7CisJfSBmaWxlOworICAgICAgLyogVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBvdXQuICAqLworICAgICAgUFRSIG1lbW9yeTsKKyAgICB9IHU7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhY3Jvc3MgY2FsbHMgdG8KKyAgIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlLiAgKi8KKworc3RydWN0IGFjY3VtdWxhdGUKK3sKKyAgLyogVGhlIEZEUiBoYXNoIHRhYmxlLiAgKi8KKyAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIGZkcl9oYXNoOworICAvKiBUaGUgc3RyaW5ncyBoYXNoIHRhYmxlLiAgKi8KKyAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHN0cl9oYXNoOworICAvKiBMaW5rZWQgbGlzdHMgZGVzY3JpYmluZyBob3cgdG8gc2h1ZmZsZSB0aGUgaW5wdXQgZGVidWcKKyAgICAgaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBrZWVwIGEgcG9pbnRlciB0byBib3RoIHRoZQorICAgICBoZWFkIGFuZCB0aGUgdGFpbC4gICovCisgIHN0cnVjdCBzaHVmZmxlICpsaW5lOworICBzdHJ1Y3Qgc2h1ZmZsZSAqbGluZV9lbmQ7CisgIHN0cnVjdCBzaHVmZmxlICpwZHI7CisgIHN0cnVjdCBzaHVmZmxlICpwZHJfZW5kOworICBzdHJ1Y3Qgc2h1ZmZsZSAqc3ltOworICBzdHJ1Y3Qgc2h1ZmZsZSAqc3ltX2VuZDsKKyAgc3RydWN0IHNodWZmbGUgKm9wdDsKKyAgc3RydWN0IHNodWZmbGUgKm9wdF9lbmQ7CisgIHN0cnVjdCBzaHVmZmxlICphdXg7CisgIHN0cnVjdCBzaHVmZmxlICphdXhfZW5kOworICBzdHJ1Y3Qgc2h1ZmZsZSAqc3M7CisgIHN0cnVjdCBzaHVmZmxlICpzc19lbmQ7CisgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3NfaGFzaDsKKyAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzc19oYXNoX2VuZDsKKyAgc3RydWN0IHNodWZmbGUgKmZkcjsKKyAgc3RydWN0IHNodWZmbGUgKmZkcl9lbmQ7CisgIHN0cnVjdCBzaHVmZmxlICpyZmQ7CisgIHN0cnVjdCBzaHVmZmxlICpyZmRfZW5kOworICAvKiBUaGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBmaWxlIHNodWZmbGUuICAqLworICB1bnNpZ25lZCBsb25nIGxhcmdlc3RfZmlsZV9zaHVmZmxlOworICAvKiBBbiBvYmphbGxvYyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IG9iamFsbG9jICptZW1vcnk7Cit9OworCisvKiBBZGQgYSBmaWxlIGVudHJ5IHRvIGEgc2h1ZmZsZSBsaXN0LiAgKi8KKworc3RhdGljIGJvb2xlYW4gYWRkX2ZpbGVfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAorCQkJCSAgICAgIHN0cnVjdCBzaHVmZmxlICoqLAorCQkJCSAgICAgIHN0cnVjdCBzaHVmZmxlICoqLCBiZmQgKiwgZmlsZV9wdHIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZykpOworCitzdGF0aWMgYm9vbGVhbgorYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sIGhlYWQsIHRhaWwsIGlucHV0X2JmZCwgb2Zmc2V0LCBzaXplKQorICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87CisgICAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZDsKKyAgICAgc3RydWN0IHNodWZmbGUgKip0YWlsOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICB1bnNpZ25lZCBsb25nIHNpemU7Cit7CisgIHN0cnVjdCBzaHVmZmxlICpuOworCisgIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTAorICAgICAgJiYgKCp0YWlsKS0+ZmlsZXAKKyAgICAgICYmICgqdGFpbCktPnUuZmlsZS5pbnB1dF9iZmQgPT0gaW5wdXRfYmZkCisgICAgICAmJiAoKnRhaWwpLT51LmZpbGUub2Zmc2V0ICsgKCp0YWlsKS0+c2l6ZSA9PSAodW5zaWduZWQgbG9uZykgb2Zmc2V0KQorICAgIHsKKyAgICAgIC8qIEp1c3QgbWVyZ2UgdGhpcyBlbnRyeSBvbnRvIHRoZSBleGlzdGluZyBvbmUuICAqLworICAgICAgKCp0YWlsKS0+c2l6ZSArPSBzaXplOworICAgICAgaWYgKCgqdGFpbCktPnNpemUgPiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpCisJYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gKCp0YWlsKS0+c2l6ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBuID0gKHN0cnVjdCBzaHVmZmxlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAorCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2h1ZmZsZSkpOworICBpZiAoIW4pCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBuLT5uZXh0ID0gTlVMTDsKKyAgbi0+c2l6ZSA9IHNpemU7CisgIG4tPmZpbGVwID0gdHJ1ZTsKKyAgbi0+dS5maWxlLmlucHV0X2JmZCA9IGlucHV0X2JmZDsKKyAgbi0+dS5maWxlLm9mZnNldCA9IG9mZnNldDsKKyAgaWYgKCpoZWFkID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQorICAgICpoZWFkID0gbjsKKyAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQorICAgICgqdGFpbCktPm5leHQgPSBuOworICAqdGFpbCA9IG47CisgIGlmIChzaXplID4gYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKQorICAgIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSA9IHNpemU7CisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYSBtZW1vcnkgZW50cnkgdG8gYSBzaHVmZmxlIGxpc3QuICAqLworCitzdGF0aWMgYm9vbGVhbiBhZGRfbWVtb3J5X3NodWZmbGUgUEFSQU1TICgoc3RydWN0IGFjY3VtdWxhdGUgKiwKKwkJCQkJICAgc3RydWN0IHNodWZmbGUgKipoZWFkLAorCQkJCQkgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWwsCisJCQkJCSAgIGJmZF9ieXRlICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKKworc3RhdGljIGJvb2xlYW4KK2FkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sIGhlYWQsIHRhaWwsIGRhdGEsIHNpemUpCisgICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKKyAgICAgc3RydWN0IHNodWZmbGUgKipoZWFkOworICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWw7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIHNpemU7Cit7CisgIHN0cnVjdCBzaHVmZmxlICpuOworICAgICAKKyAgbiA9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKKwkJCQkJIHNpemVvZiAoc3RydWN0IHNodWZmbGUpKTsKKyAgaWYgKCFuKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgbi0+bmV4dCA9IE5VTEw7CisgIG4tPnNpemUgPSBzaXplOworICBuLT5maWxlcCA9IGZhbHNlOworICBuLT51Lm1lbW9yeSA9IChQVFIpIGRhdGE7CisgIGlmICgqaGVhZCA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKKyAgICAqaGVhZCA9IG47CisgIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKKyAgICAoKnRhaWwpLT5uZXh0ID0gbjsKKyAgKnRhaWwgPSBuOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgRkRSIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgYSBoYW5kbGUgd2hpY2ggaXMgdGhlbgorICAgcGFzc2VkIGluIHRvIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlLCBldC4gYWwuICAqLworCisvKkFSR1NVU0VEKi8KK1BUUgorYmZkX2Vjb2ZmX2RlYnVnX2luaXQgKG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOworCisgIGFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGFjY3VtdWxhdGUpKTsKKyAgaWYgKCFhaW5mbykKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jLAorCQkJICAgICAgIDEwMjEpKQorICAgIHJldHVybiBOVUxMOworCisgIGFpbmZvLT5saW5lID0gTlVMTDsKKyAgYWluZm8tPmxpbmVfZW5kID0gTlVMTDsKKyAgYWluZm8tPnBkciA9IE5VTEw7CisgIGFpbmZvLT5wZHJfZW5kID0gTlVMTDsKKyAgYWluZm8tPnN5bSA9IE5VTEw7CisgIGFpbmZvLT5zeW1fZW5kID0gTlVMTDsKKyAgYWluZm8tPm9wdCA9IE5VTEw7CisgIGFpbmZvLT5vcHRfZW5kID0gTlVMTDsKKyAgYWluZm8tPmF1eCA9IE5VTEw7CisgIGFpbmZvLT5hdXhfZW5kID0gTlVMTDsKKyAgYWluZm8tPnNzID0gTlVMTDsKKyAgYWluZm8tPnNzX2VuZCA9IE5VTEw7CisgIGFpbmZvLT5zc19oYXNoID0gTlVMTDsKKyAgYWluZm8tPnNzX2hhc2hfZW5kID0gTlVMTDsKKyAgYWluZm8tPmZkciA9IE5VTEw7CisgIGFpbmZvLT5mZHJfZW5kID0gTlVMTDsKKyAgYWluZm8tPnJmZCA9IE5VTEw7CisgIGFpbmZvLT5yZmRfZW5kID0gTlVMTDsKKworICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAwOworCisgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgaXMgdGhlIGVtcHR5IHN0cmluZy4gICovCisgICAgICBvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSAxOworICAgIH0KKworICBhaW5mby0+bWVtb3J5ID0gb2JqYWxsb2NfY3JlYXRlICgpOworICBpZiAoYWluZm8tPm1lbW9yeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiAoUFRSKSBhaW5mbzsKK30KKworLyogRnJlZSB0aGUgYWNjdW11bGF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworLypBUkdTVVNFRCovCit2b2lkCitiZmRfZWNvZmZfZGVidWdfZnJlZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQorICAgICBQVFIgaGFuZGxlOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7CisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7CisgIAorICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlKTsKKworICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSk7CisKKyAgb2JqYWxsb2NfZnJlZSAoYWluZm8tPm1lbW9yeSk7CisKKyAgZnJlZSAoYWluZm8pOworfQorCisvKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBJTlBVVF9CRkQgaW50bworICAgT1VUUFVUX0JGRC4gIFRoZSBJTlBVVF9ERUJVRyBhcmd1bWVudCBwb2ludHMgdG8gc29tZSBFQ09GRgorICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHdlIHdhbnQgdG8gbGluayBpbnRvIHRoZSBpbmZvcm1hdGlvbgorICAgcG9pbnRlZCB0byBieSB0aGUgT1VUUFVUX0RFQlVHIGFyZ3VtZW50LiAgT1VUUFVUX1NXQVAgYW5kCisgICBJTlBVVF9TV0FQIHBvaW50IHRvIHRoZSBzd2FwcGluZyBpbmZvcm1hdGlvbiBuZWVkZWQuICBJTkZPIGlzIHRoZQorICAgbGlua2VyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIEhBTkRMRSBpcyByZXR1cm5lZCBieQorICAgYmZkX2Vjb2ZmX2RlYnVnX2luaXQuICAqLworCisvKkFSR1NVU0VEKi8KK2Jvb2xlYW4KK2JmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsCisJCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwKKwkJCSAgICBpbmZvKQorICAgICBQVFIgaGFuZGxlOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7CisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOworICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQorICAgID0gaW5wdXRfc3dhcC0+c3dhcF9zeW1faW47CisgIHZvaWQgKCogY29uc3Qgc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpCisgICAgPSBpbnB1dF9zd2FwLT5zd2FwX3JmZF9pbjsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCisgICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9zeW1fb3V0OworICB2b2lkICgqIGNvbnN0IHN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKQorICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfZmRyX291dDsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpCisgICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9yZmRfb3V0OworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX29wdF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX29wdF9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3JmZF9zaXplOworICBIRFJSICogY29uc3Qgb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKKyAgSERSUiAqIGNvbnN0IGlucHV0X3N5bWhkciA9ICZpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOworICBiZmRfdm1hIHNlY3Rpb25fYWRqdXN0W3NjTWF4XTsKKyAgYXNlY3Rpb24gKnNlYzsKKyAgYmZkX2J5dGUgKmZkcl9zdGFydDsKKyAgYmZkX2J5dGUgKmZkcl9wdHI7CisgIGJmZF9ieXRlICpmZHJfZW5kOworICBiZmRfc2l6ZV90eXBlIGZkcl9hZGQ7CisgIHVuc2lnbmVkIGludCBjb3BpZWQ7CisgIFJGRFQgaTsKKyAgdW5zaWduZWQgbG9uZyBzejsKKyAgYmZkX2J5dGUgKnJmZF9vdXQ7CisgIGJmZF9ieXRlICpyZmRfaW47CisgIGJmZF9ieXRlICpyZmRfZW5kOworICBsb25nIG5ld3JmZGJhc2UgPSAwOworICBsb25nIG9sZHJmZGJhc2UgPSAwOworICBiZmRfYnl0ZSAqZmRyX291dDsKKworICAvKiBVc2Ugc2VjdGlvbl9hZGp1c3QgdG8gaG9sZCB0aGUgdmFsdWUgdG8gYWRkIHRvIGEgc3ltYm9sIGluIGEKKyAgICAgcGFydGljdWxhciBzZWN0aW9uLiAgKi8KKyAgbWVtc2V0ICgoUFRSKSBzZWN0aW9uX2FkanVzdCwgMCwgc2l6ZW9mIHNlY3Rpb25fYWRqdXN0KTsKKworI2RlZmluZSBTRVQobmFtZSwgaW5keCkgXAorICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKTsgXAorICBpZiAoc2VjICE9IE5VTEwpIFwKKyAgICBzZWN0aW9uX2FkanVzdFtpbmR4XSA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgXAorCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0IFwKKwkJCSAgICAtIHNlYy0+dm1hKTsKKworICBTRVQgKCIudGV4dCIsIHNjVGV4dCk7CisgIFNFVCAoIi5kYXRhIiwgc2NEYXRhKTsKKyAgU0VUICgiLmJzcyIsIHNjQnNzKTsKKyAgU0VUICgiLnNkYXRhIiwgc2NTRGF0YSk7CisgIFNFVCAoIi5zYnNzIiwgc2NTQnNzKTsKKyAgLyogc2NSZGF0YSBzZWN0aW9uIG1heSBiZSBlaXRoZXIgLnJkYXRhIG9yIC5yb2RhdGEuICAqLworICBTRVQgKCIucmRhdGEiLCBzY1JEYXRhKTsKKyAgU0VUICgiLnJvZGF0YSIsIHNjUkRhdGEpOworICBTRVQgKCIuaW5pdCIsIHNjSW5pdCk7CisgIFNFVCAoIi5maW5pIiwgc2NGaW5pKTsKKyAgU0VUICgiLnJjb25zdCIsIHNjUkNvbnN0KTsKKworI3VuZGVmIFNFVAorCisgIC8qIEZpbmQgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIEZEUidzLiAgV2UgbmVlZAorICAgICB0byBoYW5kbGUgdGhlbSB3aGV0aGVyIHRoZXkgYXJlIHN3YXBwZWQgb3Igbm90LiAgKi8KKyAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQorICAgIHsKKyAgICAgIGZkcl9zdGFydCA9IChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZmRyOworICAgICAgZmRyX2FkZCA9IHNpemVvZiAoRkRSKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmZHJfc3RhcnQgPSAoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX2ZkcjsKKyAgICAgIGZkcl9hZGQgPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKKyAgICB9CisgIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBpbnB1dF9zeW1oZHItPmlmZE1heCAqIGZkcl9hZGQ7CisKKyAgaW5wdXRfZGVidWctPmlmZG1hcCA9IChSRkRUICopIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAorCQkJCQkgICAgKGlucHV0X3N5bWhkci0+aWZkTWF4CisJCQkJCSAgICAgKiBzaXplb2YgKFJGRFQpKSk7CisKKyAgc3ogPSAoaW5wdXRfc3ltaGRyLT5jcmZkICsgaW5wdXRfc3ltaGRyLT5pZmRNYXgpICogZXh0ZXJuYWxfcmZkX3NpemU7CisgIHJmZF9vdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKKyAgaWYgKCFpbnB1dF9kZWJ1Zy0+aWZkbWFwIHx8ICFyZmRfb3V0KQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnJmZCwgJmFpbmZvLT5yZmRfZW5kLCByZmRfb3V0LCBzeikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvcGllZCA9IDA7CisKKyAgLyogTG9vayB0aHJvdWdoIHRoZSBGRFIncyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZQorICAgICBpbiB0aGUgZmluYWwgb3V0cHV0LiAgV2UgZG8gbm90IHdhbnQgZHVwbGljYXRlIEZEUiBpbmZvcm1hdGlvbgorICAgICBmb3IgaGVhZGVyIGZpbGVzLCBiZWNhdXNlIEVDT0ZGIGRlYnVnZ2luZyBpcyBvZnRlbiB2ZXJ5IGxhcmdlLgorICAgICBXaGVuIHdlIGZpbmQgYW4gRkRSIHdpdGggbm8gbGluZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgbWVyZ2VkLAorICAgICB3ZSBsb29rIGl0IHVwIGluIGEgaGFzaCB0YWJsZSB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IGluY2x1ZGUgaXQKKyAgICAgb25jZS4gIFdlIGtlZXAgYSB0YWJsZSBtYXBwaW5nIEZEUiBudW1iZXJzIHRvIHRoZSBmaW5hbCBudW1iZXIKKyAgICAgdGhleSBnZXQgd2l0aCB0aGUgQkZELCBzbyB0aGF0IHdlIGNhbiByZWZlciB0byBpdCB3aGVuIHdlIHdyaXRlCisgICAgIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCisgIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydCwgaSA9IDA7CisgICAgICAgZmRyX3B0ciA8IGZkcl9lbmQ7CisgICAgICAgZmRyX3B0ciArPSBmZHJfYWRkLCBpKyssIHJmZF9vdXQgKz0gZXh0ZXJuYWxfcmZkX3NpemUpCisgICAgeworICAgICAgRkRSIGZkcjsKKworICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQorCWZkciA9ICooRkRSICopIGZkcl9wdHI7CisgICAgICBlbHNlCisJKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7CisKKyAgICAgIC8qIFNlZSBpZiB0aGlzIEZEUiBjYW4gYmUgbWVyZ2VkIHdpdGggYW4gZXhpc3Rpbmcgb25lLiAgKi8KKyAgICAgIGlmIChmZHIuY2JMaW5lID09IDAgJiYgZmRyLnJzcyAhPSAtMSAmJiBmZHIuZk1lcmdlKQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBjaGFyICpsb29rdXA7CisJICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmZoOworCisJICAvKiBXZSBsb29rIHVwIGEgc3RyaW5nIGZvcm1lZCBmcm9tIHRoZSBmaWxlIG5hbWUgYW5kIHRoZQorCSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzLiAgU29tZXRpbWVzIGFuIGluY2x1ZGUKKwkgICAgIGZpbGUgd2lsbCBjb25kaXRpb25hbGx5IGRlZmluZSBhIHR5cGVkZWYgb3Igc29tZXRoaW5nCisJICAgICBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgaW5jbHVkZSBmaWxlcy4gIFVzaW5nIHRoZSBudW1iZXIgb2YKKwkgICAgIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzIGFzIGEgaGFzaCByZWR1Y2VzIHRoZSBjaGFuY2UgdGhhdAorCSAgICAgd2Ugd2lsbCBtZXJnZSBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgbm90IGJlCisJICAgICBtZXJnZWQuICAqLworCSAgbmFtZSA9IGlucHV0X2RlYnVnLT5zcyArIGZkci5pc3NCYXNlICsgZmRyLnJzczsKKworCSAgbG9va3VwID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKKwkgIGlmIChsb29rdXAgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgc3ByaW50ZiAobG9va3VwLCAiJXMgJWx4ICVseCIsIG5hbWUsIGZkci5jc3ltLCBmZHIuY2F1eCk7CisKKwkgIGZoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmYWluZm8tPmZkcl9oYXNoLCBsb29rdXAsIHRydWUsIHRydWUpOworCSAgZnJlZSAobG9va3VwKTsKKwkgIGlmIChmaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKGZoLT52YWwgIT0gLTEpCisJICAgIHsKKwkgICAgICBpbnB1dF9kZWJ1Zy0+aWZkbWFwW2ldID0gZmgtPnZhbDsKKwkgICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLAorCQkJICAgICAgIChQVFIpIHJmZF9vdXQpOworCisJICAgICAgLyogRG9uJ3QgY29weSB0aGlzIEZEUi4gICovCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgZmgtPnZhbCA9IG91dHB1dF9zeW1oZHItPmlmZE1heCArIGNvcGllZDsKKwl9CisKKyAgICAgIGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPSBvdXRwdXRfc3ltaGRyLT5pZmRNYXggKyBjb3BpZWQ7CisgICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLCAoUFRSKSByZmRfb3V0KTsKKyAgICAgICsrY29waWVkOworICAgIH0KKworICBuZXdyZmRiYXNlID0gb3V0cHV0X3N5bWhkci0+Y3JmZDsKKyAgb3V0cHV0X3N5bWhkci0+Y3JmZCArPSBpbnB1dF9zeW1oZHItPmlmZE1heDsKKworICAvKiBDb3B5IG92ZXIgYW55IGV4aXN0aW5nIFJGRCdzLiAgUkZEJ3MgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUKKyAgICAgbGlua2VyLCBzbyB0aGlzIHdpbGwgb25seSBoYXBwZW4gZm9yIGlucHV0IGZpbGVzIHdoaWNoIGFyZSB0aGUKKyAgICAgcmVzdWx0IG9mIGEgcGFydGlhbCBsaW5rLiAgKi8KKyAgcmZkX2luID0gKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9yZmQ7CisgIHJmZF9lbmQgPSByZmRfaW4gKyBpbnB1dF9zeW1oZHItPmNyZmQgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKKyAgZm9yICg7CisgICAgICAgcmZkX2luIDwgcmZkX2VuZDsKKyAgICAgICByZmRfaW4gKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpCisgICAgeworICAgICAgUkZEVCByZmQ7CisKKyAgICAgICgqc3dhcF9yZmRfaW4pIChpbnB1dF9iZmQsIChQVFIpIHJmZF9pbiwgJnJmZCk7CisgICAgICBCRkRfQVNTRVJUIChyZmQgPj0gMCAmJiByZmQgPCBpbnB1dF9zeW1oZHItPmlmZE1heCk7CisgICAgICByZmQgPSBpbnB1dF9kZWJ1Zy0+aWZkbWFwW3JmZF07CisgICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsICZyZmQsIChQVFIpIHJmZF9vdXQpOworICAgICAgcmZkX291dCArPSBleHRlcm5hbF9yZmRfc2l6ZTsKKyAgICB9CisKKyAgb2xkcmZkYmFzZSA9IG91dHB1dF9zeW1oZHItPmNyZmQ7CisgIG91dHB1dF9zeW1oZHItPmNyZmQgKz0gaW5wdXRfc3ltaGRyLT5jcmZkOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgRkRSJ3MgYW5kIGNvcHkgb3ZlciBhbGwgYXNzb2NpYXRlZCBkZWJ1Z2dpbmcKKyAgICAgaW5mb3JtYXRpb24uICAqLworICBzeiA9IGNvcGllZCAqIGV4dGVybmFsX2Zkcl9zaXplOworICBmZHJfb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7CisgIGlmICghZmRyX291dCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwgZmRyX291dCwgc3opKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0LCBpID0gMDsKKyAgICAgICBmZHJfcHRyIDwgZmRyX2VuZDsKKyAgICAgICBmZHJfcHRyICs9IGZkcl9hZGQsIGkrKykKKyAgICB7CisgICAgICBGRFIgZmRyOworICAgICAgYmZkX3ZtYSBmZHJfYWRyOworICAgICAgYmZkX2J5dGUgKnN5bV9vdXQ7CisgICAgICBiZmRfYnl0ZSAqbHJhd19zcmM7CisgICAgICBiZmRfYnl0ZSAqbHJhd19lbmQ7CisgICAgICBib29sZWFuIGZnb3RmaWxlbmFtZTsKKworICAgICAgaWYgKGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPCBvdXRwdXRfc3ltaGRyLT5pZmRNYXgpCisJeworCSAgLyogV2UgYXJlIG5vdCBjb3B5aW5nIHRoaXMgRkRSLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQorCWZkciA9ICooRkRSICopIGZkcl9wdHI7CisgICAgICBlbHNlCisJKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7CisKKyAgICAgIGZkcl9hZHIgPSBmZHIuYWRyOworCisgICAgICAvKiBBZGp1c3QgdGhlIEZEUiBhZGRyZXNzIGZvciBhbnkgY2hhbmdlcyB0aGF0IG1heSBoYXZlIGJlZW4KKwkgbWFkZSBieSByZWxheGluZy4gICovCisgICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQorCXsKKwkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKKworCSAgZm9yIChhZGp1c3QgPSBpbnB1dF9kZWJ1Zy0+YWRqdXN0OworCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKKwkgICAgICAgYWRqdXN0ID0gYWRqdXN0LT5uZXh0KQorCSAgICBpZiAoZmRyX2FkciA+PSBhZGp1c3QtPnN0YXJ0CisJCSYmIGZkcl9hZHIgPCBhZGp1c3QtPmVuZCkKKwkgICAgICBmZHIuYWRyICs9IGFkanVzdC0+YWRqdXN0OworCX0KKworICAgICAgLyogRklYTUU6IEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgdGhpcyBGRFIgcG9pbnRzIHRvIHRoZSAuaW5pdCBvcgorCSAuZmluaSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBub3QgZG8gdGhlIHJpZ2h0CisJIHRoaW5nLiAgKi8KKyAgICAgIGZkci5hZHIgKz0gc2VjdGlvbl9hZGp1c3Rbc2NUZXh0XTsKKworICAgICAgLyogU3dhcCBpbiB0aGUgbG9jYWwgc3ltYm9scywgYWRqdXN0IHRoZWlyIHZhbHVlcywgYW5kIHN3YXAgdGhlbQorCSBvdXQgYWdhaW4uICAqLworICAgICAgZmdvdGZpbGVuYW1lID0gZmFsc2U7CisgICAgICBzeiA9IGZkci5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7CisgICAgICBzeW1fb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7CisgICAgICBpZiAoIXN5bV9vdXQpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnN5bSwgJmFpbmZvLT5zeW1fZW5kLCBzeW1fb3V0LAorCQkJICAgICAgIHN6KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBscmF3X3NyYyA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3N5bQorCQkgICsgZmRyLmlzeW1CYXNlICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOworICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkci5jc3ltICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7CisgICAgICBmb3IgKDsgIGxyYXdfc3JjIDwgbHJhd19lbmQ7ICBscmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkKKwl7CisJICBTWU1SIGludGVybmFsX3N5bTsKKworCSAgKCpzd2FwX3N5bV9pbikgKGlucHV0X2JmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOworCisJICBCRkRfQVNTRVJUIChpbnRlcm5hbF9zeW0uc2MgIT0gc2NDb21tb24KKwkJICAgICAgJiYgaW50ZXJuYWxfc3ltLnNjICE9IHNjU0NvbW1vbik7CisKKwkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGlmIGFwcHJvcHJpYXRlLiAgKi8KKwkgIHN3aXRjaCAoaW50ZXJuYWxfc3ltLnN0KQorCSAgICB7CisJICAgIGNhc2Ugc3ROaWw6CisJICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZpbnRlcm5hbF9zeW0pKQorCQlicmVhazsKKwkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworCSAgICBjYXNlIHN0R2xvYmFsOgorCSAgICBjYXNlIHN0U3RhdGljOgorCSAgICBjYXNlIHN0TGFiZWw6CisJICAgIGNhc2Ugc3RQcm9jOgorCSAgICBjYXNlIHN0U3RhdGljUHJvYzoKKwkgICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQorCQl7CisJCSAgYmZkX3ZtYSB2YWx1ZTsKKwkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7CisKKwkJICB2YWx1ZSA9IGludGVybmFsX3N5bS52YWx1ZTsKKwkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7CisJCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKKwkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKKwkJICAgIGlmICh2YWx1ZSA+PSBhZGp1c3QtPnN0YXJ0CisJCQkmJiB2YWx1ZSA8IGFkanVzdC0+ZW5kKQorCQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gYWRqdXN0LT5hZGp1c3Q7CisJCX0KKwkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gc2VjdGlvbl9hZGp1c3RbaW50ZXJuYWxfc3ltLnNjXTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIHdlIGhhc2ggYWxsIHRoZSBzdHJpbmdzIGluCisJICAgICB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlIHRvZ2V0aGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQKKwkgICAgIG9mIHNwYWNlIHJlcXVpcmVkIGJ5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlIGRvbid0IGRvCisJICAgICB0aGlzIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rIGJlY2F1c2UgaXQgd291bGQKKwkgICAgIHByZXZlbnQgdXMgZnJvbSBlYXNpbHkgbWVyZ2luZyBkaWZmZXJlbnQgRkRSJ3MuICAqLworCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgYm9vbGVhbiBmZmlsZW5hbWU7CisJICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworCSAgICAgIGlmICghIGZnb3RmaWxlbmFtZSAmJiBpbnRlcm5hbF9zeW0uaXNzID09IGZkci5yc3MpCisJCWZmaWxlbmFtZSA9IHRydWU7CisJICAgICAgZWxzZQorCQlmZmlsZW5hbWUgPSBmYWxzZTsKKworCSAgICAgIC8qIEhhc2ggdGhlIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKwkgICAgICBuYW1lID0gaW5wdXRfZGVidWctPnNzICsgZmRyLmlzc0Jhc2UgKyBpbnRlcm5hbF9zeW0uaXNzOworCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQorCQlpbnRlcm5hbF9zeW0uaXNzID0gMDsKKwkgICAgICBlbHNlCisJCXsKKwkJICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOworCisJCSAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIG5hbWUsIHRydWUsIHRydWUpOworCQkgIGlmIChzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgaWYgKHNoLT52YWwgPT0gLTEpCisJCSAgICB7CisJCSAgICAgIHNoLT52YWwgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7CisJCSAgICAgIG91dHB1dF9zeW1oZHItPmlzc01heCArPSBzdHJsZW4gKG5hbWUpICsgMTsKKwkJICAgICAgaWYgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKKwkJCWFpbmZvLT5zc19oYXNoID0gc2g7CisJCSAgICAgIGlmIChhaW5mby0+c3NfaGFzaF9lbmQKKwkJCSAgIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQorCQkJYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7CisJCSAgICAgIGFpbmZvLT5zc19oYXNoX2VuZCA9IHNoOworCQkgICAgfQorCQkgIGludGVybmFsX3N5bS5pc3MgPSBzaC0+dmFsOworCQl9CisKKwkgICAgICBpZiAoZmZpbGVuYW1lKQorCQl7CisJCSAgZmRyLnJzcyA9IGludGVybmFsX3N5bS5pc3M7CisJCSAgZmdvdGZpbGVuYW1lID0gdHJ1ZTsKKwkJfQorCSAgICB9CisKKwkgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgc3ltX291dCk7CisJICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOworCX0KKworICAgICAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKKyAgICAgIG91dHB1dF9zeW1oZHItPmlzeW1NYXggKz0gZmRyLmNzeW07CisKKyAgICAgIC8qIENvcHkgdGhlIGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCBzd2FwcGluZy4gICovCisKKyAgICAgIC8qIEZJWE1FOiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsaW5lCisJIG51bWJlcnMuICBGcmFua2x5LCBmb3JnZXQgaXQuICBBbnlib2R5IHVzaW5nIHN0YWJzIGRlYnVnZ2luZworCSBpbmZvcm1hdGlvbiB3aWxsIG5vdCB1c2UgdGhpcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwgYW5kCisJIHN0YWJzIGFyZSBhZGp1c3RlZCBjb3JyZWN0bHkuICAqLworICAgICAgaWYgKGZkci5jYkxpbmUgPiAwKQorCXsKKwkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+bGluZSwgJmFpbmZvLT5saW5lX2VuZCwKKwkJCQkgaW5wdXRfYmZkLAorCQkJCSBpbnB1dF9zeW1oZHItPmNiTGluZU9mZnNldCArIGZkci5jYkxpbmVPZmZzZXQsCisJCQkJIGZkci5jYkxpbmUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBmZHIuaWxpbmVCYXNlID0gb3V0cHV0X3N5bWhkci0+aWxpbmVNYXg7CisJICBmZHIuY2JMaW5lT2Zmc2V0ID0gb3V0cHV0X3N5bWhkci0+Y2JMaW5lOworCSAgb3V0cHV0X3N5bWhkci0+aWxpbmVNYXggKz0gZmRyLmNsaW5lOworCSAgb3V0cHV0X3N5bWhkci0+Y2JMaW5lICs9IGZkci5jYkxpbmU7CisJfQorICAgICAgaWYgKGZkci5jYXV4ID4gMCkKKwl7CisJICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmF1eCwgJmFpbmZvLT5hdXhfZW5kLAorCQkJCSBpbnB1dF9iZmQsCisJCQkJIChpbnB1dF9zeW1oZHItPmNiQXV4T2Zmc2V0CisJCQkJICArIGZkci5pYXV4QmFzZSAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpLAorCQkJCSBmZHIuY2F1eCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBmZHIuaWF1eEJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pYXV4TWF4OworCSAgb3V0cHV0X3N5bWhkci0+aWF1eE1heCArPSBmZHIuY2F1eDsKKwl9CisgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCisJICAvKiBXaGVuIGFyZSBhcmUgaGFzaGluZyBzdHJpbmdzLCB3ZSBsaWUgYWJvdXQgdGhlIG51bWJlciBvZgorCSAgICAgc3RyaW5ncyBhdHRhY2hlZCB0byBlYWNoIEZEUi4gIFdlIG5lZWQgdG8gc2V0IGNiU3MKKwkgICAgIGJlY2F1c2Ugc29tZSB2ZXJzaW9ucyBvZiBkYnggYXBwYXJlbnRseSB1c2UgaXQgdG8gZGVjaWRlCisJICAgICBob3cgbXVjaCBvZiB0aGUgc3RyaW5nIHRhYmxlIHRvIHJlYWQgaW4uICAqLworCSAgZmRyLmlzc0Jhc2UgPSAwOworCSAgZmRyLmNiU3MgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7CisJfQorICAgICAgZWxzZSBpZiAoZmRyLmNiU3MgPiAwKQorCXsKKwkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLAorCQkJCSBpbnB1dF9iZmQsCisJCQkJIGlucHV0X3N5bWhkci0+Y2JTc09mZnNldCArIGZkci5pc3NCYXNlLAorCQkJCSBmZHIuY2JTcykpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OworCSAgb3V0cHV0X3N5bWhkci0+aXNzTWF4ICs9IGZkci5jYlNzOworCX0KKworICAgICAgaWYgKChvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCisJICAgPT0gaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKQorCSAgJiYgaW5wdXRfZGVidWctPmFkanVzdCA9PSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQorCXsKKwkgIC8qIFRoZSB0d28gQkZEJ3MgaGF2ZSB0aGUgc2FtZSBlbmRpYW5uZXNzLCBhbmQgd2UgZG9uJ3QgaGF2ZQorCSAgICAgdG8gYWRqdXN0IHRoZSBQRFIgYWRkcmVzc2VzLCBzbyBzaW1wbHkgY29weWluZyB0aGUKKwkgICAgIGluZm9ybWF0aW9uIHdpbGwgc3VmZmljZS4gICovCisJICBCRkRfQVNTRVJUIChleHRlcm5hbF9wZHJfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7CisJICBpZiAoZmRyLmNwZCA+IDApCisJICAgIHsKKwkgICAgICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLAorCQkJCSAgICAgaW5wdXRfYmZkLAorCQkJCSAgICAgKGlucHV0X3N5bWhkci0+Y2JQZE9mZnNldAorCQkJCSAgICAgICsgZmRyLmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpLAorCQkJCSAgICAgZmRyLmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBCRkRfQVNTRVJUIChleHRlcm5hbF9vcHRfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7CisJICBpZiAoZmRyLmNvcHQgPiAwKQorCSAgICB7CisJICAgICAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwKKwkJCQkgICAgIGlucHV0X2JmZCwKKwkJCQkgICAgIChpbnB1dF9zeW1oZHItPmNiT3B0T2Zmc2V0CisJCQkJICAgICAgKyBmZHIuaW9wdEJhc2UgKiBleHRlcm5hbF9vcHRfc2l6ZSksCisJCQkJICAgICBmZHIuY29wdCAqIGV4dGVybmFsX29wdF9zaXplKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF9zaXplX3R5cGUgb3V0c3osIGluc3o7CisJICBiZmRfYnl0ZSAqaW47CisJICBiZmRfYnl0ZSAqZW5kOworCSAgYmZkX2J5dGUgKm91dDsKKworCSAgLyogVGhlIHR3byBCRkQncyBoYXZlIGRpZmZlcmVudCBlbmRpYW5uZXNzLCBzbyB3ZSBtdXN0IHN3YXAKKwkgICAgIGV2ZXJ5dGhpbmcgaW4gYW5kIG91dC4gIFRoaXMgY29kZSB3b3VsZCBhbHdheXMgd29yaywgYnV0CisJICAgICBpdCB3b3VsZCBiZSB1bm5lY2Vzc2FyaWx5IHNsb3cgaW4gdGhlIG5vcm1hbCBjYXNlLiAgKi8KKwkgIG91dHN6ID0gZXh0ZXJuYWxfcGRyX3NpemU7CisJICBpbnN6ID0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7CisJICBpbiA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3BkcgorCQkrIGZkci5pcGRGaXJzdCAqIGluc3opOworCSAgZW5kID0gaW4gKyBmZHIuY3BkICogaW5zejsKKwkgIHN6ID0gZmRyLmNwZCAqIG91dHN6OworCSAgb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7CisJICBpZiAoIW91dCkKKwkgICAgeworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLCBvdXQsCisJCQkJICAgc3opKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBmb3IgKDsgaW4gPCBlbmQ7IGluICs9IGluc3osIG91dCArPSBvdXRzeikKKwkgICAgeworCSAgICAgIFBEUiBwZHI7CisKKwkgICAgICAoKmlucHV0X3N3YXAtPnN3YXBfcGRyX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBpbiwgJnBkcik7CisKKwkgICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkanVzdCB0aGUKKwkJIGFkZHJlc3MuICAqLworCSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+YWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCisJCXsKKwkJICBiZmRfdm1hIGFkcjsKKwkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7CisKKwkJICBhZHIgPSBmZHJfYWRyICsgcGRyLmFkcjsKKwkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7CisJCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKKwkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKKwkJICAgIGlmIChhZHIgPj0gYWRqdXN0LT5zdGFydAorCQkJJiYgYWRyIDwgYWRqdXN0LT5lbmQpCisJCSAgICAgIHBkci5hZHIgKz0gYWRqdXN0LT5hZGp1c3Q7CisJCX0KKworCSAgICAgICgqb3V0cHV0X3N3YXAtPnN3YXBfcGRyX291dCkgKG91dHB1dF9iZmQsICZwZHIsIChQVFIpIG91dCk7CisJICAgIH0KKworCSAgLyogU3dhcCBvdmVyIHRoZSBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24uICAqLworCSAgb3V0c3ogPSBleHRlcm5hbF9vcHRfc2l6ZTsKKwkgIGluc3ogPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZTsKKwkgIGluID0gKChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfb3B0CisJCSsgZmRyLmlvcHRCYXNlICogaW5zeik7CisJICBlbmQgPSBpbiArIGZkci5jb3B0ICogaW5zejsKKwkgIHN6ID0gZmRyLmNvcHQgKiBvdXRzejsKKwkgIG91dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOworCSAgaWYgKCFvdXQpCisJICAgIHsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwgb3V0LAorCQkJCSAgIHN6KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgZm9yICg7IGluIDwgZW5kOyBpbiArPSBpbnN6LCBvdXQgKz0gb3V0c3opCisJICAgIHsKKwkgICAgICBPUFRSIG9wdDsKKworCSAgICAgICgqaW5wdXRfc3dhcC0+c3dhcF9vcHRfaW4pIChpbnB1dF9iZmQsIChQVFIpIGluLCAmb3B0KTsKKwkgICAgICAoKm91dHB1dF9zd2FwLT5zd2FwX29wdF9vdXQpIChvdXRwdXRfYmZkLCAmb3B0LCAoUFRSKSBvdXQpOworCSAgICB9CisJfQorCisgICAgICBmZHIuaXBkRmlyc3QgPSBvdXRwdXRfc3ltaGRyLT5pcGRNYXg7CisgICAgICBvdXRwdXRfc3ltaGRyLT5pcGRNYXggKz0gZmRyLmNwZDsKKyAgICAgIGZkci5pb3B0QmFzZSA9IG91dHB1dF9zeW1oZHItPmlvcHRNYXg7CisgICAgICBvdXRwdXRfc3ltaGRyLT5pb3B0TWF4ICs9IGZkci5jb3B0OworCisgICAgICBpZiAoZmRyLmNyZmQgPD0gMCkKKwl7CisJICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgdGFibGUgb2YgUkZEJ3Mgd2UgY3JlYXRlZC4gICovCisJICBmZHIucmZkQmFzZSA9IG5ld3JmZGJhc2U7CisJICBmZHIuY3JmZCA9IGlucHV0X3N5bWhkci0+aWZkTWF4OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgcmVtYXBwZWQgUkZEJ3MuICAqLworCSAgZmRyLnJmZEJhc2UgKz0gb2xkcmZkYmFzZTsKKwl9CisKKyAgICAgICgqc3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZmRyX291dCk7CisgICAgICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOworICAgICAgKytvdXRwdXRfc3ltaGRyLT5pZmRNYXg7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYSBzdHJpbmcgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBhcmUgYWNjdW11bGF0aW5nLgorICAgUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmRyIHN0cmluZyBiYXNlLiAgKi8KKworc3RhdGljIGxvbmcgZWNvZmZfYWRkX3N0cmluZyBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAorCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKKwkJCQkgICAgICBGRFIgKmZkciwgY29uc3QgY2hhciAqc3RyaW5nKSk7CisKK3N0YXRpYyBsb25nCitlY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgZGVidWcsIGZkciwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7CisgICAgIEZEUiAqZmRyOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIEhEUlIgKnN5bWhkcjsKKyAgc2l6ZV90IGxlbjsKKyAgYmZkX3NpemVfdHlwZSByZXQ7CisKKyAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7CisgIGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLCAoUFRSKSBzdHJpbmcsCisJCQkgICAgICAgbGVuICsgMSkpCisJcmV0dXJuIC0xOworICAgICAgcmV0ID0gc3ltaGRyLT5pc3NNYXg7CisgICAgICBzeW1oZHItPmlzc01heCArPSBsZW4gKyAxOworICAgICAgZmRyLT5jYlNzICs9IGxlbiArIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKKworICAgICAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7CisgICAgICBpZiAoc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQorCXJldHVybiAtMTsKKyAgICAgIGlmIChzaC0+dmFsID09IC0xKQorCXsKKwkgIHNoLT52YWwgPSBzeW1oZHItPmlzc01heDsKKwkgIHN5bWhkci0+aXNzTWF4ICs9IGxlbiArIDE7CisJICBpZiAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQorCSAgICBhaW5mby0+c3NfaGFzaCA9IHNoOworCSAgaWYgKGFpbmZvLT5zc19oYXNoX2VuZAorCSAgICAgICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKKwkgICAgYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7CisJICBhaW5mby0+c3NfaGFzaF9lbmQgPSBzaDsKKwl9CisgICAgICByZXQgPSBzaC0+dmFsOworICAgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBub24tRUNPRkYgZmlsZS4gICovCisKK2Jvb2xlYW4KK2JmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1ZywKKwkJCQkgIG91dHB1dF9zd2FwLCBpbnB1dF9iZmQsIGluZm8pCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7CisgIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQorICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfc3ltX291dDsKKyAgSERSUiAqb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKKyAgRkRSIGZkcjsKKyAgYXNlY3Rpb24gKnNlYzsKKyAgYXN5bWJvbCAqKnN5bWJvbHM7CisgIGFzeW1ib2wgKipzeW1fcHRyOworICBhc3ltYm9sICoqc3ltX2VuZDsKKyAgbG9uZyBzeW1zaXplOworICBsb25nIHN5bWNvdW50OworICBQVFIgZXh0ZXJuYWxfZmRyOworCisgIG1lbXNldCAoKFBUUikgJmZkciwgMCwgc2l6ZW9mIGZkcik7CisKKyAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi50ZXh0Iik7CisgIGlmIChzZWMgIT0gTlVMTCkKKyAgICBmZHIuYWRyID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OworICBlbHNlCisgICAgeworICAgICAgLyogRklYTUU6IFdoYXQgYWJvdXQgLmluaXQgb3IgLmZpbmk/ICAqLworICAgICAgZmRyLmFkciA9IDA7CisgICAgfQorCisgIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OworICBmZHIuY2JTcyA9IDA7CisgIGZkci5yc3MgPSBlY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgb3V0cHV0X2RlYnVnLCAmZmRyLAorCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7CisgIGlmIChmZHIucnNzID09IC0xKQorICAgIHJldHVybiBmYWxzZTsKKyAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKKworICAvKiBHZXQgdGhlIGxvY2FsIHN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KKyAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQpOworICBpZiAoc3ltc2l6ZSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc3ltc2l6ZSk7CisgIGlmIChzeW1ib2xzID09IChhc3ltYm9sICoqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5wdXRfYmZkLCBzeW1ib2xzKTsKKyAgaWYgKHN5bWNvdW50IDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHN5bV9lbmQgPSBzeW1ib2xzICsgc3ltY291bnQ7CisKKyAgLyogSGFuZGxlIHRoZSBsb2NhbCBzeW1ib2xzLiAgQW55IGV4dGVybmFsIHN5bWJvbHMgYXJlIGhhbmRsZWQKKyAgICAgc2VwYXJhdGVseS4gICovCisgIGZkci5jc3ltID0gMDsKKyAgZm9yIChzeW1fcHRyID0gc3ltYm9sczsgc3ltX3B0ciAhPSBzeW1fZW5kOyBzeW1fcHRyKyspCisgICAgeworICAgICAgU1lNUiBpbnRlcm5hbF9zeW07CisgICAgICBQVFIgZXh0ZXJuYWxfc3ltOworCisgICAgICBpZiAoKCgqc3ltX3B0ciktPmZsYWdzICYgQlNGX0VYUE9SVCkgIT0gMCkKKwljb250aW51ZTsKKyAgICAgIG1lbXNldCAoKFBUUikgJmludGVybmFsX3N5bSwgMCwgc2l6ZW9mIGludGVybmFsX3N5bSk7CisgICAgICBpbnRlcm5hbF9zeW0uaXNzID0gZWNvZmZfYWRkX3N0cmluZyAoYWluZm8sIGluZm8sIG91dHB1dF9kZWJ1ZywgJmZkciwKKwkJCQkJICAgKCpzeW1fcHRyKS0+bmFtZSk7CisKKyAgICAgIGlmIChpbnRlcm5hbF9zeW0uaXNzID09IC0xKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pCisJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pKQorCWludGVybmFsX3N5bS52YWx1ZSA9ICgqc3ltX3B0ciktPnZhbHVlOworICAgICAgZWxzZQorCWludGVybmFsX3N5bS52YWx1ZSA9ICgoKnN5bV9wdHIpLT52YWx1ZQorCQkJICAgICAgKyAoKnN5bV9wdHIpLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgICArICgqc3ltX3B0ciktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOworICAgICAgaW50ZXJuYWxfc3ltLnN0ID0gc3ROaWw7CisgICAgICBpbnRlcm5hbF9zeW0uc2MgPSBzY1VuZGVmaW5lZDsKKyAgICAgIGludGVybmFsX3N5bS5pbmRleCA9IGluZGV4TmlsOworCisgICAgICBleHRlcm5hbF9zeW0gPSAoUFRSKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKKwkJCQkJICAgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKKyAgICAgIGlmICghZXh0ZXJuYWxfc3ltKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgZXh0ZXJuYWxfc3ltKTsKKyAgICAgIGFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3ltLCAmYWluZm8tPnN5bV9lbmQsCisJCQkgIGV4dGVybmFsX3N5bSwgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKKyAgICAgICsrZmRyLmNzeW07CisgICAgICArK291dHB1dF9zeW1oZHItPmlzeW1NYXg7CisgICAgfQorCisgIGJmZF9yZWxlYXNlIChvdXRwdXRfYmZkLCAoUFRSKSBzeW1ib2xzKTsKKworICAvKiBMZWF2ZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIEZEUiB6ZXJvZWQgb3V0LiAgVGhpcyB3aWxsIGNhdXNlCisgICAgIHRoZSBsYW5nIGZpZWxkIHRvIGJlIGxhbmdDLiAgVGhlIGZCaWdlbmRpYW4gZmllbGQgd2lsbAorICAgICBpbmRpY2F0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UKKyAgICAgaXQgb25seSBhcHBsaWVzIHRvIGF1eCBmaWVsZHMgYW5kIHRoZXJlIGFyZSBub25lLiAgKi8KKyAgZXh0ZXJuYWxfZmRyID0gKFBUUikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCisJCQkJICAgICAgIG91dHB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7CisgIGlmICghZXh0ZXJuYWxfZmRyKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgKCpvdXRwdXRfc3dhcC0+c3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZXh0ZXJuYWxfZmRyKTsKKyAgYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwKKwkJICAgICAgZXh0ZXJuYWxfZmRyLCBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOworCisgICsrb3V0cHV0X3N5bWhkci0+aWZkTWF4OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdXAgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4KKyAgIEZJWE1FOiBUaGlzIGlzIGRvbmUgdXNpbmcgYSBtZW1vcnkgYnVmZmVyLCBidXQgaXQgc2hvdWxkIGJlCisgICBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvIHVzZSBhIHNodWZmbGUgc3RydWN0dXJlLiAgVGhlIGFzc2VtYmxlciB1c2VzCisgICB0aGlzIGludGVyZmFjZSwgc28gdGhhdCBtdXN0IGJlIGNoYW5nZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UuICAqLworCitib29sZWFuCitiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1Zywgc3dhcCwgcmVsb2NhdGVhYmxlLCBnZXRfZXh0ciwKKwkJCSAgIHNldF9pbmRleCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7CisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOworICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgYm9vbGVhbiAoKmdldF9leHRyKSBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOworICAgICB2b2lkICgqc2V0X2luZGV4KSBQQVJBTVMgKChhc3ltYm9sICosIGJmZF9zaXplX3R5cGUpKTsKK3sKKyAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOworICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7CisgIHNpemVfdCBjOworCisgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKKyAgaWYgKHN5bV9wdHJfcHRyID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yIChjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltX3B0cjsKKyAgICAgIEVYVFIgZXN5bTsKKworICAgICAgc3ltX3B0ciA9ICpzeW1fcHRyX3B0cjsKKworICAgICAgLyogR2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworICAgICAgaWYgKCgqZ2V0X2V4dHIpIChzeW1fcHRyLCAmZXN5bSkgPT0gZmFsc2UpCisJY29udGludWU7CisKKyAgICAgIC8qIElmIHdlJ3JlIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlLCBtb3ZlIGNvbW1vbiBzeW1ib2xzIGludG8KKwkgYnNzLiAgKi8KKyAgICAgIGlmIChyZWxvY2F0ZWFibGUgPT0gZmFsc2UpCisJeworCSAgaWYgKGVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKKwkgICAgZXN5bS5hc3ltLnNjID0gc2NCc3M7CisJICBlbHNlIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQorCSAgICBlc3ltLmFzeW0uc2MgPSBzY1NCc3M7CisJfQorCisgICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQorCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQorCSAgfHwgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCisJeworCSAgLyogRklYTUU6IGdhcyBkb2VzIG5vdCBrZWVwIHRoZSB2YWx1ZSBvZiBhIHNtYWxsIHVuZGVmaW5lZAorCSAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgaXRzZWxmLCBiZWNhdXNlIG9mIHJlbG9jYXRpb24KKwkgICAgIHByb2JsZW1zLiAgKi8KKwkgIGlmIChlc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkCisJICAgICAgfHwgZXN5bS5hc3ltLnZhbHVlID09IDAKKwkgICAgICB8fCBzeW1fcHRyLT52YWx1ZSAhPSAwKQorCSAgICBlc3ltLmFzeW0udmFsdWUgPSBzeW1fcHRyLT52YWx1ZTsKKwl9CisgICAgICBlbHNlCisJZXN5bS5hc3ltLnZhbHVlID0gKHN5bV9wdHItPnZhbHVlCisJCQkgICArIHN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgICsgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisKKyAgICAgIGlmIChzZXRfaW5kZXgpCisJKCpzZXRfaW5kZXgpIChzeW1fcHRyLCAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pZXh0TWF4KTsKKworICAgICAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgZGVidWcsIHN3YXAsCisJCQkJCSAgc3ltX3B0ci0+bmFtZSwgJmVzeW0pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhIHNpbmdsZSBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKK2Jvb2xlYW4KK2JmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsIGRlYnVnLCBzd2FwLCBuYW1lLCBlc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEVYVFIgKmVzeW07Cit7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZTsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpCisgICAgPSBzd2FwLT5zd2FwX2V4dF9vdXQ7CisgIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKKyAgc2l6ZV90IG5hbWVsZW47CisKKyAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7CisKKyAgaWYgKChzaXplX3QpIChkZWJ1Zy0+c3NleHRfZW5kIC0gZGVidWctPnNzZXh0KQorICAgICAgPCBzeW1oZHItPmlzc0V4dE1heCArIG5hbWVsZW4gKyAxKQorICAgIHsKKyAgICAgIGlmIChlY29mZl9hZGRfYnl0ZXMgKChjaGFyICoqKSAmZGVidWctPnNzZXh0LAorCQkJICAgKGNoYXIgKiopICZkZWJ1Zy0+c3NleHRfZW5kLAorCQkJICAgc3ltaGRyLT5pc3NFeHRNYXggKyBuYW1lbGVuICsgMSkKKwkgID09IGZhbHNlKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmICgoc2l6ZV90KSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dF9lbmQKKwkJLSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KQorICAgICAgPCAoc3ltaGRyLT5pZXh0TWF4ICsgMSkgKiBleHRlcm5hbF9leHRfc2l6ZSkKKyAgICB7CisgICAgICBpZiAoZWNvZmZfYWRkX2J5dGVzICgoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHQsCisJCQkgICAoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHRfZW5kLAorCQkJICAgKHN5bWhkci0+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCisJICA9PSBmYWxzZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGVzeW0tPmFzeW0uaXNzID0gc3ltaGRyLT5pc3NFeHRNYXg7CisKKyAgKCpzd2FwX2V4dF9vdXQpIChhYmZkLCBlc3ltLAorCQkgICAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dAorCQkgICAgKyBzeW1oZHItPmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOworCisgICsrc3ltaGRyLT5pZXh0TWF4OworCisgIHN0cmNweSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgsIG5hbWUpOworICBzeW1oZHItPmlzc0V4dE1heCArPSBuYW1lbGVuICsgMTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWxpZ24gdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2Vjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7CisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOworeworICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7CisgIGJmZF9zaXplX3R5cGUgZGVidWdfYWxpZ24sIGF1eF9hbGlnbiwgcmZkX2FsaWduOworICBzaXplX3QgYWRkOworCisgIC8qIEFkanVzdCB0aGUgY291bnRzIHNvIHRoYXQgc3RydWN0dXJlcyBhcmUgYWxpZ25lZC4gICovCisgIGRlYnVnX2FsaWduID0gc3dhcC0+ZGVidWdfYWxpZ247CisgIGF1eF9hbGlnbiA9IGRlYnVnX2FsaWduIC8gc2l6ZW9mICh1bmlvbiBhdXhfZXh0KTsKKyAgcmZkX2FsaWduID0gZGVidWdfYWxpZ24gLyBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKKworICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmNiTGluZSAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKKyAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKKyAgICB7CisgICAgICBpZiAoZGVidWctPmxpbmUgIT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKKwltZW1zZXQgKChQVFIpIChkZWJ1Zy0+bGluZSArIHN5bWhkci0+Y2JMaW5lKSwgMCwgYWRkKTsKKyAgICAgIHN5bWhkci0+Y2JMaW5lICs9IGFkZDsKKyAgICB9CisKKyAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5pc3NNYXggJiAoZGVidWdfYWxpZ24gLSAxKSk7CisgIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCisgICAgeworICAgICAgaWYgKGRlYnVnLT5zcyAhPSAoY2hhciAqKSBOVUxMKQorCW1lbXNldCAoKFBUUikgKGRlYnVnLT5zcyArIHN5bWhkci0+aXNzTWF4KSwgMCwgYWRkKTsKKyAgICAgIHN5bWhkci0+aXNzTWF4ICs9IGFkZDsKKyAgICB9CisKKyAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5pc3NFeHRNYXggJiAoZGVidWdfYWxpZ24gLSAxKSk7CisgIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCisgICAgeworICAgICAgaWYgKGRlYnVnLT5zc2V4dCAhPSAoY2hhciAqKSBOVUxMKQorCW1lbXNldCAoKFBUUikgKGRlYnVnLT5zc2V4dCArIHN5bWhkci0+aXNzRXh0TWF4KSwgMCwgYWRkKTsKKyAgICAgIHN5bWhkci0+aXNzRXh0TWF4ICs9IGFkZDsKKyAgICB9CisKKyAgYWRkID0gYXV4X2FsaWduIC0gKHN5bWhkci0+aWF1eE1heCAmIChhdXhfYWxpZ24gLSAxKSk7CisgIGlmIChhZGQgIT0gYXV4X2FsaWduKQorICAgIHsKKyAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9ICh1bmlvbiBhdXhfZXh0ICopIE5VTEwpCisJbWVtc2V0ICgoUFRSKSAoZGVidWctPmV4dGVybmFsX2F1eCArIHN5bWhkci0+aWF1eE1heCksIDAsCisJCWFkZCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOworICAgICAgc3ltaGRyLT5pYXV4TWF4ICs9IGFkZDsKKyAgICB9CisKKyAgYWRkID0gcmZkX2FsaWduIC0gKHN5bWhkci0+Y3JmZCAmIChyZmRfYWxpZ24gLSAxKSk7CisgIGlmIChhZGQgIT0gcmZkX2FsaWduKQorICAgIHsKKyAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IChQVFIpIE5VTEwpCisJbWVtc2V0ICgoUFRSKSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX3JmZAorCQkgICAgICAgKyBzeW1oZHItPmNyZmQgKiBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSksCisJCTAsIChzaXplX3QpIChhZGQgKiBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSkpOworICAgICAgc3ltaGRyLT5jcmZkICs9IGFkZDsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgc2l6ZSByZXF1aXJlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworYmZkX3NpemVfdHlwZQorYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKGFiZmQsIGRlYnVnLCBzd2FwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Cit7CisgIGJmZF9zaXplX3R5cGUgdG90OworCisgIGVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCk7CisgIHRvdCA9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplOworCisjZGVmaW5lIEFERChjb3VudCwgc2l6ZSkgXAorICB0b3QgKz0gZGVidWctPnN5bWJvbGljX2hlYWRlci5jb3VudCAqIHNpemUKKworICBBREQgKGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7CisgIEFERCAoaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7CisgIEFERCAoaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7CisgIEFERCAoaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOworICBBREQgKGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKKyAgQUREIChpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKKyAgQUREIChpc3NNYXgsIHNpemVvZiAoY2hhcikpOworICBBREQgKGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7CisgIEFERCAoaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7CisgIEFERCAoY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOworICBBREQgKGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKKworI3VuZGVmIEFERAorCisgIHJldHVybiB0b3Q7Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgRUNPRkYgc3ltYm9saWMgaGVhZGVyLCBnaXZlbiB0aGUgZmlsZSBwb3NpdGlvbiBpdCBpcworICAgZ29pbmcgdG8gYmUgcGxhY2VkIGF0LiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNvdW50cyBhcmUgc2V0CisgICBjb3JyZWN0bHkuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOworICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKKyAgICAgZmlsZV9wdHIgd2hlcmU7Cit7CisgIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKKyAgY2hhciAqYnVmZiA9IE5VTEw7CisKKyAgZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKTsKKworICAvKiBHbyB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIGZpbGUuICAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgd2hlcmUgKz0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemU7CisKKyAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKKworICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldHMuICAqLworI2RlZmluZSBTRVQob2Zmc2V0LCBjb3VudCwgc2l6ZSkgXAorICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKSBcCisgICAgc3ltaGRyLT5vZmZzZXQgPSAwOyBcCisgIGVsc2UgXAorICAgIHsgXAorICAgICAgc3ltaGRyLT5vZmZzZXQgPSB3aGVyZTsgXAorICAgICAgd2hlcmUgKz0gc3ltaGRyLT5jb3VudCAqIHNpemU7IFwKKyAgICB9CisKKyAgU0VUIChjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7CisgIFNFVCAoY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7CisgIFNFVCAoY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7CisgIFNFVCAoY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKKyAgU0VUIChjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOworICBTRVQgKGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKKyAgU0VUIChjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhcikpOworICBTRVQgKGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7CisgIFNFVCAoY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7CisgIFNFVCAoY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKKyAgU0VUIChjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOworI3VuZGVmIFNFVAorCisgIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7CisgIGlmIChidWZmID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAoKnN3YXAtPnN3YXBfaGRyX291dCkgKGFiZmQsIHN5bWhkciwgYnVmZik7CisgIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplLCBhYmZkKQorICAgICAgIT0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGJ1ZmYgIT0gTlVMTCkKKyAgICBmcmVlIChidWZmKTsKKyAgcmV0dXJuIHRydWU7CisgZXJyb3JfcmV0dXJuOgorICBpZiAoYnVmZiAhPSBOVUxMKQorICAgIGZyZWUgKGJ1ZmYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzCisgICB0aGF0IHRoZSBpbmZvcm1hdGlvbiAodGhlIHBvaW50ZXJzIGFuZCBjb3VudHMpIGluICpERUJVRyBoYXZlIGJlZW4KKyAgIHNldCBjb3JyZWN0bHkuICBXSEVSRSBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gd3JpdGUgdGhlCisgICBpbmZvcm1hdGlvbiB0by4gIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZpbGUgb2Zmc2V0cyBpbiB0aGUKKyAgIHN5bWJvbGljIGhlYWRlci4gICovCisKK2Jvb2xlYW4KK2JmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgICAgIGZpbGVfcHRyIHdoZXJlOworeworICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7CisKKyAgaWYgKCEgZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpKQorICAgIHJldHVybiBmYWxzZTsKKworI2RlZmluZSBXUklURShwdHIsIGNvdW50LCBzaXplLCBvZmZzZXQpIFwKKyAgQkZEX0FTU0VSVCAoc3ltaGRyLT5vZmZzZXQgPT0gMCBcCisJICAgICAgfHwgKGJmZF92bWEpIGJmZF90ZWxsIChhYmZkKSA9PSBzeW1oZHItPm9mZnNldCk7IFwKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwgYWJmZCkgXAorICAgICAgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpIFwKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgV1JJVEUgKGxpbmUsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgY2JMaW5lT2Zmc2V0KTsKKyAgV1JJVEUgKGV4dGVybmFsX2RuciwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgY2JEbk9mZnNldCk7CisgIFdSSVRFIChleHRlcm5hbF9wZHIsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIGNiUGRPZmZzZXQpOworICBXUklURSAoZXh0ZXJuYWxfc3ltLCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgY2JTeW1PZmZzZXQpOworICBXUklURSAoZXh0ZXJuYWxfb3B0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgY2JPcHRPZmZzZXQpOworICBXUklURSAoZXh0ZXJuYWxfYXV4LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLCBjYkF1eE9mZnNldCk7CisgIFdSSVRFIChzcywgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjYlNzT2Zmc2V0KTsKKyAgV1JJVEUgKHNzZXh0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNiU3NFeHRPZmZzZXQpOworICBXUklURSAoZXh0ZXJuYWxfZmRyLCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBjYkZkT2Zmc2V0KTsKKyAgV1JJVEUgKGV4dGVybmFsX3JmZCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIGNiUmZkT2Zmc2V0KTsKKyAgV1JJVEUgKGV4dGVybmFsX2V4dCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIGNiRXh0T2Zmc2V0KTsKKyN1bmRlZiBXUklURQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgYSBzaHVmZmxlIGxpc3QuICAqLworCitzdGF0aWMgYm9vbGVhbiBlY29mZl93cml0ZV9zaHVmZmxlIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiwKKwkJCQkJICAgIHN0cnVjdCBzaHVmZmxlICosIFBUUiBzcGFjZSkpOworCitzdGF0aWMgYm9vbGVhbgorZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgc2h1ZmZsZSwgc3BhY2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgICAgIHN0cnVjdCBzaHVmZmxlICpzaHVmZmxlOworICAgICBQVFIgc3BhY2U7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzaHVmZmxlICpsOworICB1bnNpZ25lZCBsb25nIHRvdGFsOworCisgIHRvdGFsID0gMDsKKyAgZm9yIChsID0gc2h1ZmZsZTsgbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgaWYgKCEgbC0+ZmlsZXApCisJeworCSAgaWYgKGJmZF93cml0ZSAobC0+dS5tZW1vcnksIDEsIGwtPnNpemUsIGFiZmQpICE9IGwtPnNpemUpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGJmZF9zZWVrIChsLT51LmZpbGUuaW5wdXRfYmZkLCBsLT51LmZpbGUub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCSAgICAgIHx8IGJmZF9yZWFkIChzcGFjZSwgMSwgbC0+c2l6ZSwgbC0+dS5maWxlLmlucHV0X2JmZCkgIT0gbC0+c2l6ZQorCSAgICAgIHx8IGJmZF93cml0ZSAoc3BhY2UsIDEsIGwtPnNpemUsIGFiZmQpICE9IGwtPnNpemUpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICB0b3RhbCArPSBsLT5zaXplOworICAgIH0KKworICBpZiAoKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICBiZmRfYnl0ZSAqczsKKworICAgICAgaSA9IHN3YXAtPmRlYnVnX2FsaWduIC0gKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpOworICAgICAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKKyAgICAgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCisJeworCSAgZnJlZSAocyk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgZnJlZSAocyk7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHVzaW5nIGFjY3VtdWxhdGVkIGxpbmtlcgorICAgaW5mb3JtYXRpb24uICAqLworCitib29sZWFuCitiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcgKGhhbmRsZSwgYWJmZCwgZGVidWcsIHN3YXAsIGluZm8sIHdoZXJlKQorICAgICBQVFIgaGFuZGxlOworICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBmaWxlX3B0ciB3aGVyZTsKK3sKKyAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKKyAgUFRSIHNwYWNlID0gTlVMTDsKKworICBpZiAoISBlY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgc3BhY2UgPSAoUFRSKSBiZmRfbWFsbG9jIChhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpOworICBpZiAoc3BhY2UgPT0gTlVMTCAmJiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+bGluZSwgc3BhY2UpCisgICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5wZHIsIHNwYWNlKQorICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+c3ltLCBzcGFjZSkKKyAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPm9wdCwgc3BhY2UpCisgICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5hdXgsIHNwYWNlKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gb3V0IGZyb20gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhCisgICAgIGZpbmFsIGxpbmsuICAqLworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCk7CisgICAgICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+c3MsIHNwYWNlKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHRvdGFsOworICAgICAgYmZkX2J5dGUgbnVsbDsKKyAgICAgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7CisKKyAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zcyA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCk7CisgICAgICBudWxsID0gMDsKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZudWxsLCAxLCAxLCBhYmZkKSAhPSAxKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgdG90YWwgPSAxOworICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gTlVMTCB8fCBhaW5mby0+c3NfaGFzaC0+dmFsID09IDEpOworICAgICAgZm9yIChzaCA9IGFpbmZvLT5zc19oYXNoOworCSAgIHNoICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTDsKKwkgICBzaCA9IHNoLT5uZXh0KQorCXsKKwkgIHNpemVfdCBsZW47CisKKwkgIGxlbiA9IHN0cmxlbiAoc2gtPnJvb3Quc3RyaW5nKTsKKwkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNoLT5yb290LnN0cmluZywgMSwgbGVuICsgMSwgYWJmZCkgIT0gbGVuICsgMSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICB0b3RhbCArPSBsZW4gKyAxOworCX0KKworICAgICAgaWYgKCh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQorCXsKKwkgIHVuc2lnbmVkIGludCBpOworCSAgYmZkX2J5dGUgKnM7CisKKwkgIGkgPSBzd2FwLT5kZWJ1Z19hbGlnbiAtICh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKTsKKwkgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7CisJICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOworCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKKwkgICAgeworCSAgICAgIGZyZWUgKHMpOworCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB9CisJICBmcmVlIChzKTsKKwl9CisgICAgfQorCisgIC8qIFRoZSBleHRlcm5hbCBzdHJpbmdzIGFuZCBzeW1ib2wgYXJlIG5vdCBjb252ZXJ0ZWQgb3ZlciB0byB1c2luZworICAgICBzaHVmZmxlcy4gIEZJWE1FOiBUaGV5IHByb2JhYmx5IHNob3VsZCBiZS4gICovCisgIGlmIChiZmRfd3JpdGUgKGRlYnVnLT5zc2V4dCwgMSwgZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXgsIGFiZmQpCisgICAgICAhPSAoYmZkX3NpemVfdHlwZSkgZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXgpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGlmICgoZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXggJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGJmZF9ieXRlICpzOworCisgICAgICBpID0gKHN3YXAtPmRlYnVnX2FsaWduCisJICAgLSAoZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXggJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkpOworICAgICAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKKyAgICAgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCisJeworCSAgZnJlZSAocyk7CisJICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisgICAgICBmcmVlIChzKTsKKyAgICB9CisKKyAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmZkciwgc3BhY2UpCisgICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5yZmQsIHNwYWNlKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBCRkRfQVNTRVJUIChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNiRXh0T2Zmc2V0ID09IDAKKwkgICAgICB8fCAoZGVidWctPnN5bWJvbGljX2hlYWRlci5jYkV4dE9mZnNldAorCQkgID09IChiZmRfdm1hKSBiZmRfdGVsbCAoYWJmZCkpKTsKKworICBpZiAoYmZkX3dyaXRlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwKKwkJIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCwgYWJmZCkKKyAgICAgICE9IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCAqIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChzcGFjZSAhPSBOVUxMKQorICAgIGZyZWUgKHNwYWNlKTsKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChzcGFjZSAhPSBOVUxMKQorICAgIGZyZWUgKHNwYWNlKTsKKyAgcmV0dXJuIGZhbHNlOworfQorDAorLyogSGFuZGxlIHRoZSBmaW5kX25lYXJlc3RfbGluZSBmdW5jdGlvbiBmb3IgYm90aCBFQ09GRiBhbmQgTUlQUyBFTEYKKyAgIGZpbGVzLiAgKi8KKworLyogQ29tcGFyZSBGRFIgZW50cmllcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCisKK3N0YXRpYyBpbnQKK2NtcF9mZHJ0YWJfZW50cnkgKGxlZnRwLCByaWdodHApCisgICAgIGNvbnN0IFBUUiBsZWZ0cDsKKyAgICAgY29uc3QgUFRSIHJpZ2h0cDsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqbHAgPQorICAgIChjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICopIGxlZnRwOworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpycCA9CisgICAgKGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKikgcmlnaHRwOworCisgIGlmIChscC0+YmFzZV9hZGRyIDwgcnAtPmJhc2VfYWRkcikKKyAgICByZXR1cm4gLTE7CisgIGlmIChscC0+YmFzZV9hZGRyID4gcnAtPmJhc2VfYWRkcikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEVhY2ggZmlsZSBkZXNjcmlwdG9yIChGRFIpIGhhcyBhIG1lbW9yeSBhZGRyZXNzLCB0byBzaW1wbGlmeQorICAgbG9va2luZyB1cCBhbiBGRFIgYnkgYWRkcmVzcywgd2UgYnVpbGQgYSB0YWJsZSBjb3ZlcmluZyBhbGwgRkRScworICAgdGhhdCBoYXZlIGEgbGVhc3Qgb25lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGluIHRoZW0uICBUaGUgZmluYWwKKyAgIHRhYmxlIHdpbGwgYmUgc29ydGVkIGJ5IGFkZHJlc3Mgc28gd2UgY2FuIGxvb2sgaXQgdXAgdmlhIGJpbmFyeQorICAgc2VhcmNoLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21rX2ZkcnRhYiAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOworICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Cit7CisgIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKKyAgRkRSICpmZHJfcHRyOworICBGRFIgKmZkcl9zdGFydDsKKyAgRkRSICpmZHJfZW5kOworICBib29sZWFuIHN0YWJzOworICBsb25nIGxlbjsKKworICBmZHJfc3RhcnQgPSBkZWJ1Z19pbmZvLT5mZHI7CisgIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBkZWJ1Z19pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OworCisgIC8qIEZpcnN0LCBsZXQncyBzZWUgaG93IGxvbmcgdGhlIHRhYmxlIG5lZWRzIHRvIGJlOiAqLworICBmb3IgKGxlbiA9IDAsIGZkcl9wdHIgPSBmZHJfc3RhcnQ7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCisgICAgeworICAgICAgaWYgKGZkcl9wdHItPmNwZCA9PSAwKQkvKiBza2lwIEZEUnMgdGhhdCBoYXZlIG5vIFBEUnMgKi8KKwljb250aW51ZTsKKyAgICAgICsrbGVuOworICAgIH0KKworICAvKiBOb3csIGNyZWF0ZSBhbmQgZmlsbCBpbiB0aGUgdGFibGU6ICovCisKKyAgbGluZV9pbmZvLT5mZHJ0YWIgPSAoKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkqKQorCQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwKKwkJCQkgICBsZW4gKiBzaXplb2YgKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpKSk7CisgIGlmIChsaW5lX2luZm8tPmZkcnRhYiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgbGluZV9pbmZvLT5mZHJ0YWJfbGVuID0gbGVuOworCisgIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOworICBmb3IgKGZkcl9wdHIgPSBmZHJfc3RhcnQ7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCisgICAgeworICAgICAgaWYgKGZkcl9wdHItPmNwZCA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4KKwkgYSBmaWxlIHdpdGggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGUgc2Vjb25kIGxvY2FsCisJIHN5bWJvbCBpcyBuYW1lZCBAc3RhYnMuICAqLworICAgICAgc3RhYnMgPSBmYWxzZTsKKyAgICAgIGlmIChmZHJfcHRyLT5jc3ltID49IDIpCisJeworCSAgY2hhciAqc3ltX3B0cjsKKwkgIFNZTVIgc3ltOworCisJICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCQkgICAgICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMSkqZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOworCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOworCSAgaWYgKHN0cmNtcCAoZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzcywKKwkJICAgICAgU1RBQlNfU1lNQk9MKSA9PSAwKQorCSAgICBzdGFicyA9IHRydWU7CisJfQorCisgICAgICBpZiAoIXN0YWJzKQorCXsKKwkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7CisJICBjaGFyICpwZHJfcHRyOworCSAgUERSIHBkcjsKKworCSAgZXh0ZXJuYWxfcGRyX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKKworCSAgcGRyX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9wZHIKKwkJICAgICArIGZkcl9wdHItPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOworCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOworCSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IFBEUiBpcyB0aGUgb2Zmc2V0IG9mIHRoYXQKKwkgICAgIHByb2NlZHVyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgRkRSLiAgKi8KKwkgIHRhYi0+YmFzZV9hZGRyID0gZmRyX3B0ci0+YWRyIC0gcGRyLmFkcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogWFhYIEkgZG9uJ3Qga25vdyBhYm91dCBzdGFicywgc28gdGhpcyBpcyBhIGd1ZXNzCisJICAgICAoZGF2aWRtQGNzLmFyaXpvbmEuZWR1KTogKi8KKwkgIHRhYi0+YmFzZV9hZGRyID0gZmRyX3B0ci0+YWRyOworCX0KKyAgICAgIHRhYi0+ZmRyID0gZmRyX3B0cjsKKyAgICAgICsrdGFiOworICAgIH0KKworICAvKiBGaW5hbGx5LCB0aGUgdGFibGUgaXMgc29ydGVkIGluIGluY3JlYXNpbmcgbWVtb3J5LWFkZHJlc3Mgb3JkZXIuCisgICAgIFRoZSB0YWJsZSBpcyBtb3N0bHkgc29ydGVkIGFscmVhZHksIGJ1dCB0aGVyZSBhcmUgY2FzZXMgKGUuZy4sCisgICAgIHN0YXRpYyBmdW5jdGlvbnMgaW4gaW5jbHVkZSBmaWxlcyksIHdoZXJlIHRoaXMgZG9lcyBub3QgaG9sZC4KKyAgICAgVXNlICJvZHVtcCAtUEZ2IiB0byB2ZXJpZnkuLi4gICovCisgIHFzb3J0ICgoUFRSKSBsaW5lX2luZm8tPmZkcnRhYiwgbGVuLAorCSBzaXplb2YgKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpLCBjbXBfZmRydGFiX2VudHJ5KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIGluZGV4IG9mIGZpcnN0IEZEUiB0aGF0IGNvdmVycyB0byBPRkZTRVQuICAqLworCitzdGF0aWMgbG9uZworZmRydGFiX2xvb2t1cCAobGluZV9pbmZvLCBvZmZzZXQpCisgICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKKyAgICAgYmZkX3ZtYSBvZmZzZXQ7Cit7CisgIGxvbmcgbG93LCBoaWdoLCBsZW47CisgIGxvbmcgbWlkID0gLTE7CisgIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKKworICBsZW4gPSBsaW5lX2luZm8tPmZkcnRhYl9sZW47CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7CisgIGZvciAobG93ID0gMCwgaGlnaCA9IGxlbiAtIDEgOyBsb3cgIT0gaGlnaCA7KQorICAgIHsKKyAgICAgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7CisgICAgICBpZiAob2Zmc2V0ID49IHRhYlttaWRdLmJhc2VfYWRkciAmJiBvZmZzZXQgPCB0YWJbbWlkICsgMV0uYmFzZV9hZGRyKQorCWdvdG8gZmluZF9taW47CisKKyAgICAgIGlmICh0YWJbbWlkXS5iYXNlX2FkZHIgPiBvZmZzZXQpCisJaGlnaCA9IG1pZDsKKyAgICAgIGVsc2UKKwlsb3cgPSBtaWQgKyAxOworICAgIH0KKyAgKyttaWQ7CisKKyAgLyogbGFzdCBlbnRyeSBpcyBjYXRjaC1hbGwgZm9yIGFsbCBoaWdoZXIgYWRkcmVzc2VzOiAqLworICBpZiAob2Zmc2V0IDwgdGFiW21pZF0uYmFzZV9hZGRyKQorICAgIHJldHVybiAtMTsKKworIGZpbmRfbWluOgorCisgIHdoaWxlIChtaWQgPiAwICYmIHRhYlttaWQgLSAxXS5iYXNlX2FkZHIgPT0gdGFiW21pZF0uYmFzZV9hZGRyKQorICAgIC0tbWlkOworCisgIHJldHVybiBtaWQ7Cit9CisKKy8qIExvb2sgdXAgYSBsaW5lIGdpdmVuIGFuIGFkZHJlc3MsIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGluCisgICBMSU5FX0lORk8tPmNhY2hlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xvb2t1cF9saW5lIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOworICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7CisgICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKK3sKKyAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOworICBiZmRfdm1hIG9mZnNldDsKKyAgYm9vbGVhbiBzdGFiczsKKyAgRkRSICpmZHJfcHRyOworICBpbnQgaTsKKyAgCisgIG9mZnNldCA9IGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQ7CisgICAgIAorICAvKiBCdWlsZCBGRFIgdGFibGUgKHNvcnRlZCBieSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcykgaWYgd2UKKyAgICAgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5LiAgKi8KKyAgaWYgKGxpbmVfaW5mby0+ZmRydGFiID09IE5VTEwKKyAgICAgICYmICFta19mZHJ0YWIgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOworCisgIC8qIGZpbmQgZmlyc3QgRkRSIGZvciBhZGRyZXNzIE9GRlNFVCAqLworICBpID0gZmRydGFiX2xvb2t1cCAobGluZV9pbmZvLCBvZmZzZXQpOworICBpZiAoaSA8IDApCisgICAgcmV0dXJuIGZhbHNlOwkJLyogbm8gRkRSLCBubyBmdW4uLi4gKi8KKyAgZmRyX3B0ciA9IHRhYltpXS5mZHI7CisKKyAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGZpbGUgaGFzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIGEKKyAgICAgZmlsZSB3aXRoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlIHNlY29uZCBsb2NhbCBzeW1ib2wgaXMKKyAgICAgbmFtZWQgQHN0YWJzLiAgKi8KKyAgc3RhYnMgPSBmYWxzZTsKKyAgaWYgKGZkcl9wdHItPmNzeW0gPj0gMikKKyAgICB7CisgICAgICBjaGFyICpzeW1fcHRyOworICAgICAgU1lNUiBzeW07CisKKyAgICAgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCisJCSArIChmZHJfcHRyLT5pc3ltQmFzZSArIDEpICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOworICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOworICAgICAgaWYgKHN0cmNtcCAoZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzcywKKwkJICBTVEFCU19TWU1CT0wpID09IDApCisJc3RhYnMgPSB0cnVlOworICAgIH0KKworICBpZiAoIXN0YWJzKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7CisgICAgICBjaGFyICpwZHJfcHRyOworICAgICAgY2hhciAqYmVzdF9wZHIgPSBOVUxMOworICAgICAgRkRSICpiZXN0X2ZkcjsKKyAgICAgIGJmZF92bWEgYmVzdF9kaXN0ID0gfjA7CisgICAgICBQRFIgcGRyOworICAgICAgdW5zaWduZWQgY2hhciAqbGluZV9wdHI7CisgICAgICB1bnNpZ25lZCBjaGFyICpsaW5lX2VuZDsKKyAgICAgIGludCBsaW5lbm87CisgICAgICAvKiBUaGlzIGZpbGUgdXNlcyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFYWNoIEZEUiBoYXMgYQorICAgICAgICAgbGlzdCBvZiBwcm9jZWR1cmUgZGVzY3JpcHRvcnMgKFBEUikuICBUaGUgYWRkcmVzcyBpbiB0aGUgRkRSCisgICAgICAgICBpcyB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlLiAgVGhlIGFkZHJlc3MKKyAgICAgICAgIGluIHRoZSBmaXJzdCBQRFIgZ2l2ZXMgdGhlIG9mZnNldCBvZiB0aGF0IHByb2NlZHVyZSByZWxhdGl2ZQorICAgICAgICAgdG8gdGhlIG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzLiAgVGhlIGFkZHJlc3NlcyBpbgorICAgICAgICAgc3Vic2VxdWVudCBQRFJzIHNwZWNpZnkgZWFjaCBwcm9jZWR1cmUncyBhZGRyZXNzIHJlbGF0aXZlIHRvCisgICAgICAgICB0aGUgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MuICBUbyBtYWtlIHRoaW5ncyBtb3JlIGp1aWN5LAorICAgICAgICAgd2hlbmV2ZXIgdGhlIFBST0YgYml0IGluIHRoZSBQRFIgaXMgc2V0LCB0aGUgcmVhbCBlbnRyeSBwb2ludAorICAgICAgICAgb2YgdGhlIHByb2NlZHVyZSBtYXkgYmUgMTYgYnl0ZXMgYmVsb3cgd2hhdCB3b3VsZCBub3JtYWxseSBiZQorICAgICAgICAgdGhlIHByb2NlZHVyZSdzIGVudHJ5IHBvaW50LiAgSW5zdGVhZCwgREVDIGNhbWUgdXAgd2l0aCBhCisgICAgICAgICB3aWNrZWQgc2NoZW1lIHRvIGNyZWF0ZSBwcm9maWxlZCBsaWJyYXJpZXMgIm9uIHRoZSBmbHkiOgorICAgICAgICAgaW5zdGVhZCBvZiBzaGlwcGluZyBhIHJlZ3VsYXIgYW5kIGEgcHJvZmlsZWQgdmVyc2lvbiBvZiBlYWNoCisgICAgICAgICBsaWJyYXJ5LCB0aGV5IGluc2VydCAxNiBieXRlcyBvZiB1bnVzZWQgc3BhY2UgaW4gZnJvbnQgb2YKKyAgICAgICAgIGVhY2ggcHJvY2VkdXJlIGFuZCBzZXQgdGhlICJwcm9mIiBiaXQgaW4gdGhlIFBEUiB0byBpbmRpY2F0ZQorICAgICAgICAgdGhhdCB0aGVyZSBpcyBhIGdhcCB0aGVyZSAodGhpcyBpcyBkb25lIGF1dG9tYWdpY2FsbHkgYnkgImFzIgorICAgICAgICAgd2hlbiBvcHRpb24gIi1wZyIgaXMgc3BlY2lmaWVkKS4gIFRodXMsIG5vcm1hbGx5LCB5b3UgbGluaworICAgICAgICAgYWdhaW5zdCBzdWNoIGEgbGlicmFyeSBhbmQsIGV4Y2VwdCBmb3IgbG90cyBvZiAxNiBieXRlIGdhcHMKKyAgICAgICAgIGJldHdlZW4gZnVuY3Rpb25zLCB0aGluZ3Mgd2lsbCBiZWhhdmUgYXMgdXN1YWwuICBIb3dldmVyLAorICAgICAgICAgd2hlbiBpbnZva2luZyAibGQiIHdpdGggb3B0aW9uICItcGciLCBpdCB3aWxsIGZpbGwgdGhvc2UgZ2FwcworICAgICAgICAgd2l0aCBjb2RlIHRoYXQgY2FsbHMgbWNvdW50KCkuICBJdCB0aGVuIG1vdmVzIHRoZSBmdW5jdGlvbidzCisgICAgICAgICBlbnRyeSBwb2ludCBkb3duIGJ5IDE2IGJ5dGVzLCBhbmQgb3V0IHBvcHMgYSBiaW5hcnkgdGhhdCBoYXMKKyAgICAgICAgIGFsbCBmdW5jdGlvbnMgcHJvZmlsZWQuCisKKyAgICAgICAgIE5PVEU6IE5laXRoZXIgRkRScyBub3IgUERScyBhcmUgc3RyaWN0bHkgc29ydGVkIGluIG1lbW9yeQorICAgICAgICAgICAgICAgb3JkZXIuICBGb3IgZXhhbXBsZSwgd2hlbiBpbmNsdWRpbmcgaGVhZGVyLWZpbGVzIHRoYXQKKyAgICAgICAgICAgICAgIGRlZmluZSBmdW5jdGlvbnMsIHRoZSBGRFJzIGZvbGxvdyBiZWhpbmQgdGhlIGluY2x1ZGluZworICAgICAgICAgICAgICAgZmlsZSwgZXZlbiB0aG91Z2ggdGhlaXIgY29kZSBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBhdAorICAgICAgICAgICAgICAgYSBsb3dlciBhZGRyZXNzLiAgRmlsZSBjb2ZmLWFscGhhLmMgZnJvbSBsaWJiZmQKKyAgICAgICAgICAgICAgIGlsbHVzdHJhdGVzIHRoaXMgKHVzZSAib2R1bXAgLVBGdiIgdG8gbG9vayBhdCBhIGZpbGUncworICAgICAgICAgICAgICAgRkRSL1BEUikuICBTaW1pbGFybHksIFBEUnMgYXJlIHNvbWV0aW1lcyBvdXQgb2Ygb3JkZXIKKyAgICAgICAgICAgICAgIGFzIHdlbGwuICBBbiBleGFtcGxlIG9mIHRoaXMgaXMgT1NGLzEgdjMuMCBsaWJjJ3MKKyAgICAgICAgICAgICAgIG1hbGxvYy5jLiAgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGhhcHBlbnMsIGJ1dCBpdCBjb3VsZAorICAgICAgICAgICAgICAgYmUgZHVlIHRvIG9wdGltaXphdGlvbnMgdGhhdCByZW9yZGVyIGEgZnVuY3Rpb24ncworICAgICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGFuIG9iamVjdC1maWxlLgorICAgICAgICAKKyAgICAgICAgIFN0cmF0ZWd5OgorICAgICAgICAgCisgICAgICAgICBPbiB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCB3ZSBidWlsZCBhIHRhYmxlIG9mIEZEUnMKKyAgICAgICAgIHRoYXQgaXMgc29ydGVkIGJ5IHRoZSBiYXNlLWFkZHJlc3Mgb2YgdGhlIG9iamVjdC1maWxlIHRoZSBGRFIKKyAgICAgICAgIGlzIHJlZmVycmluZyB0by4gIE5vdGljZSB0aGF0IGVhY2ggb2JqZWN0LWZpbGUgbWF5IGNvbnRhaW4KKyAgICAgICAgIGNvZGUgZnJvbSBtdWx0aXBsZSBzb3VyY2UgZmlsZXMgKGUuZy4sIGR1ZSB0byBjb2RlIGRlZmluZWQgaW4KKyAgICAgICAgIGluY2x1ZGUgZmlsZXMpLiAgVGh1cywgZm9yIGFueSBnaXZlbiBiYXNlLWFkZHJlc3MsIHRoZXJlIG1heQorICAgICAgICAgYmUgbXVsdGlwbGUgRkRScyAoYnV0IHRoaXMgY2FzZSBpcywgZm9ydHVuYXRlbHksIHVuY29tbW9uKS4KKyAgICAgICAgIGxvb2t1cChhZGRyKSBndWFyYW50ZWVzIHRvIHJldHVybiB0aGUgZmlyc3QgRkRSIHRoYXQgYXBwbGllcworICAgICAgICAgdG8gYWRkcmVzcyBBRERSLiAgVGh1cywgYWZ0ZXIgaW52b2tpbmcgbG9va3VwKCksIHdlIGhhdmUgYQorICAgICAgICAgbGlzdCBvZiBGRFJzIHRoYXQgbWF5IGNvbnRhaW4gdGhlIFBEUiBmb3IgQUREUi4gIE5leHQsIHdlCisgICAgICAgICB3YWxrIHRocm91Z2ggdGhlIFBEUnMgb2YgdGhlc2UgRkRScyBhbmQgbG9jYXRlIHRoZSBvbmUgdGhhdAorICAgICAgICAgaXMgY2xvc2VzdCB0byBBRERSIChpLmUuLCBmb3Igd2hpY2ggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAgICAgQUREUiBhbmQgdGhlIFBEUidzIGVudHJ5IHBvaW50IGlzIHBvc2l0aXZlIGFuZCBtaW5pbWFsKS4KKyAgICAgICAgIE9uY2UsIHRoZSByaWdodCBGRFIgYW5kIFBEUiBhcmUgbG9jYXRlZCwgd2Ugc2ltcGx5IHdhbGsKKyAgICAgICAgIHRocm91Z2ggdGhlIGxpbmUtbnVtYmVyIHRhYmxlIHRvIGxvb2t1cCB0aGUgbGluZS1udW1iZXIgdGhhdAorICAgICAgICAgYmVzdCBtYXRjaGVzIEFERFIuICBPYnZpb3VzbHksIHRoaW5ncyBjb3VsZCBiZSBzcGVkIHVwIGJ5CisgICAgICAgICBrZWVwaW5nIGEgc29ydGVkIGxpc3Qgb2YgUERScyBpbnN0ZWFkIG9mIGEgc29ydGVkIGxpc3Qgb2YKKyAgICAgICAgIEZEUnMuICBIb3dldmVyLCB0aGlzIHdvdWxkIGluY3JlYXNlIHNwYWNlIHJlcXVpcmVtZW50cworICAgICAgICAgY29uc2lkZXJhYmx5LCB3aGljaCBpcyB1bmRlc2lyYWJsZS4gICovCisgICAgICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOworCisgICAgICAvKiBNYWtlIG9mZnNldCByZWxhdGl2ZSB0byBvYmplY3QgZmlsZSdzIHN0YXJ0LWFkZHJlc3M6ICovCisgICAgICBvZmZzZXQgLT0gdGFiW2ldLmJhc2VfYWRkcjsKKyAgICAgIC8qIFNlYXJjaCBGRFIgbGlzdCBzdGFydGluZyBhdCB0YWJbaV0gZm9yIHRoZSBQRFIgdGhhdCBiZXN0IG1hdGNoZXMKKyAgICAgICAgIE9GRlNFVC4gIE5vcm1hbGx5LCB0aGUgRkRSIGxpc3QgaXMgb25seSBvbmUgZW50cnkgbG9uZy4gICovCisgICAgICBiZXN0X2ZkciA9IE5VTEw7CisgICAgICBkbworCXsKKwkgIGJmZF92bWEgZGlzdCwgbWluX2Rpc3QgPSAwOworCSAgY2hhciAqcGRyX2hvbGQ7CisJICBjaGFyICpwZHJfZW5kOworCSAgCisJICBmZHJfcHRyID0gdGFiW2ldLmZkcjsKKwkgIAorCSAgcGRyX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9wZHIKKwkJICAgICArIGZkcl9wdHItPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOworCSAgcGRyX2VuZCA9IHBkcl9wdHIgKyBmZHJfcHRyLT5jcGQgKiBleHRlcm5hbF9wZHJfc2l6ZTsKKwkgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKKwkgIC8qIEZpbmQgUERSIHRoYXQgaXMgY2xvc2VzdCB0byBPRkZTRVQuICBJZiBwZHIucHJvZiBpcyBzZXQsCisJICAgICB0aGUgcHJvY2VkdXJlIGVudHJ5LXBvaW50ICptYXkqIGJlIDB4MTAgYmVsb3cgcGRyLmFkci4gIFdlCisJICAgICBzaW1wbHkgcHJldGVuZCB0aGF0IHBkci5wcm9mICppbXBsaWVzKiBhIGxvd2VyIGVudHJ5LXBvaW50LgorCSAgICAgVGhpcyBpcyBzYWZlIGJlY2F1c2UgaXQganVzdCBtZWFucyB0aGF0IG1heSBpZGVudGlmeSA0IE5PUHMKKwkgICAgIGluIGZyb250IG9mIHRoZSBmdW5jdGlvbiBhcyBiZWxvbmdpbmcgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KKwkgIGZvciAocGRyX2hvbGQgPSBOVUxMOworCSAgICAgICBwZHJfcHRyIDwgcGRyX2VuZDsKKwkgICAgICAgKHBkcl9wdHIgKz0gZXh0ZXJuYWxfcGRyX3NpemUsCisJCSgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKSkpCisJICAgIHsKKwkgICAgICBpZiAob2Zmc2V0ID49IChwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mKSkKKwkJeworCQkgIGRpc3QgPSBvZmZzZXQgLSAocGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZik7CisJCSAgaWYgKCFwZHJfaG9sZCB8fCBkaXN0IDwgbWluX2Rpc3QpCisJCSAgICB7CisJCSAgICAgIG1pbl9kaXN0ID0gZGlzdDsKKwkJICAgICAgcGRyX2hvbGQgPSBwZHJfcHRyOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIAorCSAgaWYgKCFiZXN0X3BkciB8fCBtaW5fZGlzdCA8IGJlc3RfZGlzdCkKKwkgICAgeworCSAgICAgIGJlc3RfZGlzdCA9IG1pbl9kaXN0OworCSAgICAgIGJlc3RfZmRyID0gZmRyX3B0cjsKKwkgICAgICBiZXN0X3BkciA9IHBkcl9ob2xkOworCSAgICB9CisJICAvKiBjb250aW51ZSBsb29waW5nIHVudGlsIGJhc2VfYWRkciBvZiBuZXh0IGVudHJ5IGlzIGRpZmZlcmVudDogKi8KKwl9CisgICAgICB3aGlsZSAoKytpIDwgbGluZV9pbmZvLT5mZHJ0YWJfbGVuCisJICAgICAmJiB0YWJbaV0uYmFzZV9hZGRyID09IHRhYltpIC0gMV0uYmFzZV9hZGRyKTsKKworICAgICAgaWYgKCFiZXN0X2ZkciB8fCAhYmVzdF9wZHIpCisJcmV0dXJuIGZhbHNlOwkJCS8qIHNob3VsZG4ndCBoYXBwZW4uLi4gKi8KKworICAgICAgLyogcGhldywgZmluYWxseSB3ZSBnb3Qgc29tZXRoaW5nIHRoYXQgd2UgY2FuIGhvbGQgb250bzogKi8KKyAgICAgIGZkcl9wdHIgPSBiZXN0X2ZkcjsKKyAgICAgIHBkcl9wdHIgPSBiZXN0X3BkcjsKKyAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKKyAgICAgIC8qIE5vdyB3ZSBjYW4gbG9vayBmb3IgdGhlIGFjdHVhbCBsaW5lIG51bWJlci4gIFRoZSBsaW5lIG51bWJlcnMKKyAgICAgICAgIGFyZSBzdG9yZWQgaW4gYSB2ZXJ5IGZ1bmt5IGZvcm1hdCwgd2hpY2ggSSB3b24ndCB0cnkgdG8KKyAgICAgICAgIGRlc2NyaWJlLiAgVGhlIHNlYXJjaCBpcyBib3VuZGVkIGJ5IHRoZSBlbmQgb2YgdGhlIEZEUnMgbGluZQorICAgICAgICAgbnVtYmVyIGVudHJpZXMuICAqLworICAgICAgbGluZV9lbmQgPSBkZWJ1Z19pbmZvLT5saW5lICsgZmRyX3B0ci0+Y2JMaW5lT2Zmc2V0ICsgZmRyX3B0ci0+Y2JMaW5lOworCisgICAgICAvKiBNYWtlIG9mZnNldCByZWxhdGl2ZSB0byBwcm9jZWR1cmUgZW50cnk6ICovCisgICAgICBvZmZzZXQgLT0gcGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZjsKKyAgICAgIGxpbmVubyA9IHBkci5sbkxvdzsKKyAgICAgIGxpbmVfcHRyID0gZGVidWdfaW5mby0+bGluZSArIGZkcl9wdHItPmNiTGluZU9mZnNldCArIHBkci5jYkxpbmVPZmZzZXQ7CisgICAgICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKKwl7CisJICBpbnQgZGVsdGE7CisJICB1bnNpZ25lZCBpbnQgY291bnQ7CisKKwkgIGRlbHRhID0gKmxpbmVfcHRyID4+IDQ7CisJICBpZiAoZGVsdGEgPj0gMHg4KQorCSAgICBkZWx0YSAtPSAweDEwOworCSAgY291bnQgPSAoKmxpbmVfcHRyICYgMHhmKSArIDE7CisJICArK2xpbmVfcHRyOworCSAgaWYgKGRlbHRhID09IC04KQorCSAgICB7CisJICAgICAgZGVsdGEgPSAoKChsaW5lX3B0clswXSkgJiAweGZmKSA8PCA4KSArICgobGluZV9wdHJbMV0pICYgMHhmZik7CisJICAgICAgaWYgKGRlbHRhID49IDB4ODAwMCkKKwkJZGVsdGEgLT0gMHgxMDAwMDsKKwkgICAgICBsaW5lX3B0ciArPSAyOworCSAgICB9CisJICBsaW5lbm8gKz0gZGVsdGE7CisJICBpZiAob2Zmc2V0IDwgY291bnQgKiA0KQorCSAgICB7CisJICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdG9wICs9IGNvdW50ICogNCAtIG9mZnNldDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgb2Zmc2V0IC09IGNvdW50ICogNDsKKwl9CisKKyAgICAgIC8qIElmIGZkcl9wdHItPnJzcyBpcyAtMSwgdGhlbiB0aGlzIGZpbGUgZG9lcyBub3QgaGF2ZSBmdWxsCisgICAgICAgICBzeW1ib2xzLCBhdCBsZWFzdCBhY2NvcmRpbmcgdG8gZ2RiL21pcHNyZWFkLmMuICAqLworICAgICAgaWYgKGZkcl9wdHItPnJzcyA9PSAtMSkKKwl7CisJICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gTlVMTDsKKwkgIGlmIChwZHIuaXN5bSA9PSAtMSkKKwkgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBOVUxMOworCSAgZWxzZQorCSAgICB7CisJICAgICAgRVhUUiBwcm9jX2V4dDsKKworCSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9leHRfaW4pCisJCShhYmZkLAorCQkgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX2V4dAorCQkgICsgcGRyLmlzeW0gKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSksCisJCSAmcHJvY19leHQpOworCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gKGRlYnVnX2luZm8tPnNzZXh0CisJCQkJCSAgICAgICArIHByb2NfZXh0LmFzeW0uaXNzKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBTWU1SIHByb2Nfc3ltOworCisJICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gKGRlYnVnX2luZm8tPnNzCisJCQkJICAgICAgICsgZmRyX3B0ci0+aXNzQmFzZQorCQkJCSAgICAgICArIGZkcl9wdHItPnJzcyk7CisJICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKQorCSAgICAoYWJmZCwKKwkgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KKwkgICAgICArICgoZmRyX3B0ci0+aXN5bUJhc2UgKyBwZHIuaXN5bSkKKwkJICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpKSwKKwkgICAgICZwcm9jX3N5bSk7CisJICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IChkZWJ1Z19pbmZvLT5zcworCQkJCQkgICArIGZkcl9wdHItPmlzc0Jhc2UKKwkJCQkJICAgKyBwcm9jX3N5bS5pc3MpOworCX0KKyAgICAgIGlmIChsaW5lbm8gPT0gaWxpbmVOaWwpCisJbGluZW5vID0gMDsKKyAgICAgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSBsaW5lbm87CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZTsKKyAgICAgIGNvbnN0IGNoYXIgKmRpcmVjdG9yeV9uYW1lOworICAgICAgY29uc3QgY2hhciAqbWFpbl9maWxlX25hbWU7CisgICAgICBjb25zdCBjaGFyICpjdXJyZW50X2ZpbGVfbmFtZTsKKyAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWU7CisgICAgICBjb25zdCBjaGFyICpsaW5lX2ZpbGVfbmFtZTsKKyAgICAgIGJmZF92bWEgbG93X2Z1bmNfdm1hOworICAgICAgYmZkX3ZtYSBsb3dfbGluZV92bWE7CisgICAgICBib29sZWFuIHBhc3RfbGluZTsKKyAgICAgIGJvb2xlYW4gcGFzdF9mbjsKKyAgICAgIGNoYXIgKnN5bV9wdHIsICpzeW1fcHRyX2VuZDsKKyAgICAgIHNpemVfdCBsZW4sIGZ1bmNsZW47CisgICAgICBjaGFyICpidWZmZXIgPSBOVUxMOworCisgICAgICAvKiBUaGlzIGZpbGUgdXNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXaGVuIGdjYyBpcyBub3QKKwkgb3B0aW1pemluZywgaXQgd2lsbCBwdXQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJlZm9yZQorCSB0aGUgZnVuY3Rpb24gbmFtZSBzdGFicyBlbnRyeS4gIFdoZW4gZ2NjIGlzIG9wdGltaXppbmcsIGl0CisJIHdpbGwgcHV0IHRoZSBzdGFicyBlbnRyeSBmb3IgYWxsIHRoZSBmdW5jdGlvbiBmaXJzdCwgZm9sbG93ZWQKKwkgYnkgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKFRoaXMgYXBwZWFycyB0byBoYXBwZW4KKwkgYmVjYXVzZSBvZiB0aGUgdHdvIG91dHB1dCBmaWxlcyB1c2VkIGJ5IHRoZSAtbWdwb3B0IHN3aXRjaCwKKwkgd2hpY2ggaXMgaW1wbGllZCBieSAtTykuICBUaGlzIG1lYW5zIHRoYXQgd2UgbXVzdCBrZWVwCisJIGxvb2tpbmcgdGhyb3VnaCB0aGUgc3ltYm9scyB1bnRpbCB3ZSBmaW5kIGJvdGggYSBsaW5lIG51bWJlcgorCSBhbmQgYSBmdW5jdGlvbiBuYW1lIHdoaWNoIGFyZSBiZXlvbmQgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gICovCisKKyAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBOVUxMOworICAgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBOVUxMOworICAgICAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IDA7CisKKyAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKKyAgICAgIG1haW5fZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIGN1cnJlbnRfZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIGZ1bmN0aW9uX25hbWUgPSBOVUxMOworICAgICAgbGluZV9maWxlX25hbWUgPSBOVUxMOworICAgICAgbG93X2Z1bmNfdm1hID0gMDsKKyAgICAgIGxvd19saW5lX3ZtYSA9IDA7CisgICAgICBwYXN0X2xpbmUgPSBmYWxzZTsKKyAgICAgIHBhc3RfZm4gPSBmYWxzZTsKKworICAgICAgZXh0ZXJuYWxfc3ltX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKKworICAgICAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KKwkJICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMikgKiBleHRlcm5hbF9zeW1fc2l6ZSk7CisgICAgICBzeW1fcHRyX2VuZCA9IHN5bV9wdHIgKyAoZmRyX3B0ci0+Y3N5bSAtIDIpICogZXh0ZXJuYWxfc3ltX3NpemU7CisgICAgICBmb3IgKDsKKwkgICBzeW1fcHRyIDwgc3ltX3B0cl9lbmQgJiYgKCEgcGFzdF9saW5lIHx8ICEgcGFzdF9mbik7CisJICAgc3ltX3B0ciArPSBleHRlcm5hbF9zeW1fc2l6ZSkKKwl7CisJICBTWU1SIHN5bTsKKworCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOworCisJICBpZiAoRUNPRkZfSVNfU1RBQiAoJnN5bSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKEVDT0ZGX1VOTUFSS19TVEFCIChzeW0uaW5kZXgpKQorCQl7CisJCWNhc2UgTl9TTzoKKwkJICBtYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0KKwkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7CisKKwkJICAvKiBDaGVjayB0aGUgbmV4dCBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGFsc28gYW4KKyAgICAgICAgICAgICAgICAgICAgIE5fU08gc3ltYm9sLiAgKi8KKwkJICBpZiAoc3ltX3B0ciArIGV4dGVybmFsX3N5bV9zaXplIDwgc3ltX3B0cl9lbmQpCisJCSAgICB7CisJCSAgICAgIFNZTVIgbmV4dHN5bTsKKworCQkgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwKKwkJCQkJCSAgc3ltX3B0ciArIGV4dGVybmFsX3N5bV9zaXplLAorCQkJCQkJICAmbmV4dHN5bSk7CisJCSAgICAgIGlmIChFQ09GRl9JU19TVEFCICgmbmV4dHN5bSkKKwkJCSAgJiYgRUNPRkZfVU5NQVJLX1NUQUIgKG5leHRzeW0uaW5kZXgpID09IE5fU08pCisJCQl7CisgCQkJICBkaXJlY3RvcnlfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOworCQkJICBtYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0KKwkJCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBuZXh0c3ltLmlzczsKKwkJCSAgc3ltX3B0ciArPSBleHRlcm5hbF9zeW1fc2l6ZTsKKwkJCX0KKwkJICAgIH0KKwkJICBicmVhazsKKworCQljYXNlIE5fU09MOgorCQkgIGN1cnJlbnRfZmlsZV9uYW1lID0KKwkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBOX0ZVTjoKKwkJICBpZiAoc3ltLnZhbHVlID4gb2Zmc2V0KQorCQkgICAgcGFzdF9mbiA9IHRydWU7CisJCSAgZWxzZSBpZiAoc3ltLnZhbHVlID49IGxvd19mdW5jX3ZtYSkKKwkJICAgIHsKKwkJICAgICAgbG93X2Z1bmNfdm1hID0gc3ltLnZhbHVlOworCQkgICAgICBmdW5jdGlvbl9uYW1lID0KKwkJCWRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7CisJCSAgICB9CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoc3ltLnN0ID09IHN0TGFiZWwgJiYgc3ltLmluZGV4ICE9IGluZGV4TmlsKQorCSAgICB7CisJICAgICAgaWYgKHN5bS52YWx1ZSA+IG9mZnNldCkKKwkJcGFzdF9saW5lID0gdHJ1ZTsKKwkgICAgICBlbHNlIGlmIChzeW0udmFsdWUgPj0gbG93X2xpbmVfdm1hKQorCQl7CisJCSAgbG93X2xpbmVfdm1hID0gc3ltLnZhbHVlOworCQkgIGxpbmVfZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7CisJCSAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IHN5bS5pbmRleDsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBpZiAobGluZV9pbmZvLT5jYWNoZS5saW5lX251bSAhPSAwKQorCW1haW5fZmlsZV9uYW1lID0gbGluZV9maWxlX25hbWU7CisKKyAgICAgIC8qIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBzdHVmZiBhZnRlciB0aGUgY29sb24gaW4gdGhlIGZ1bmN0aW9uCisgICAgICAgICBuYW1lLiAgV2UgYWxzbyBuZWVkIHRvIHB1dCB0aGUgZGlyZWN0b3J5IG5hbWUgYW5kIHRoZSBmaWxlCisgICAgICAgICBuYW1lIHRvZ2V0aGVyLiAgKi8KKyAgICAgIGlmIChmdW5jdGlvbl9uYW1lID09IE5VTEwpCisJbGVuID0gZnVuY2xlbiA9IDA7CisgICAgICBlbHNlCisJbGVuID0gZnVuY2xlbiA9IHN0cmxlbiAoZnVuY3Rpb25fbmFtZSkgKyAxOworCisgICAgICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTAorCSAgJiYgZGlyZWN0b3J5X25hbWUgIT0gTlVMTAorCSAgJiYgbWFpbl9maWxlX25hbWVbMF0gIT0gJy8nKQorCWxlbiArPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKSArIHN0cmxlbiAobWFpbl9maWxlX25hbWUpICsgMTsKKworICAgICAgaWYgKGxlbiAhPSAwKQorCXsKKwkgIGlmIChsaW5lX2luZm8tPmZpbmRfYnVmZmVyICE9IE5VTEwpCisJICAgIGZyZWUgKGxpbmVfaW5mby0+ZmluZF9idWZmZXIpOworCSAgYnVmZmVyID0gKGNoYXIgKikgYmZkX21hbGxvYyAobGVuKTsKKwkgIGlmIChidWZmZXIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgbGluZV9pbmZvLT5maW5kX2J1ZmZlciA9IGJ1ZmZlcjsKKwl9CisKKyAgICAgIGlmIChmdW5jdGlvbl9uYW1lICE9IE5VTEwpCisJeworCSAgY2hhciAqY29sb247CisKKwkgIHN0cmNweSAoYnVmZmVyLCBmdW5jdGlvbl9uYW1lKTsKKwkgIGNvbG9uID0gc3RyY2hyIChidWZmZXIsICc6Jyk7CisJICBpZiAoY29sb24gIT0gTlVMTCkKKwkgICAgKmNvbG9uID0gJ1wwJzsKKwkgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gYnVmZmVyOworCX0KKworICAgICAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwpCisJeworCSAgaWYgKGRpcmVjdG9yeV9uYW1lID09IE5VTEwgfHwgbWFpbl9maWxlX25hbWVbMF0gPT0gJy8nKQorCSAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gbWFpbl9maWxlX25hbWU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChidWZmZXIgKyBmdW5jbGVuLCAiJXMlcyIsIGRpcmVjdG9yeV9uYW1lLAorCQkgICAgICAgbWFpbl9maWxlX25hbWUpOworCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBidWZmZXIgKyBmdW5jbGVuOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRG8gdGhlIHdvcmsgb2YgZmluZF9uZWFyZXN0X2xpbmUuICAqLworCitib29sZWFuCitfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCisJCQlsaW5lX2luZm8sIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87CisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKKyAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOworICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpyZXRsaW5lX3B0cjsKK3sKKyAgb2Zmc2V0ICs9IHNlY3Rpb24tPnZtYTsKKworICBpZiAobGluZV9pbmZvLT5jYWNoZS5zZWN0ID09IE5VTEwKKyAgICAgIHx8IGxpbmVfaW5mby0+Y2FjaGUuc2VjdCAhPSBzZWN0aW9uCisgICAgICB8fCBvZmZzZXQgPCBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0CisgICAgICB8fCBvZmZzZXQgPj0gbGluZV9pbmZvLT5jYWNoZS5zdG9wKQorICAgIHsKKyAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9IHNlY3Rpb247CisgICAgICBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0ID0gb2Zmc2V0OworICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdG9wID0gb2Zmc2V0OworICAgICAgaWYgKCEgbG9va3VwX2xpbmUgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykpCisJeworCSAgbGluZV9pbmZvLT5jYWNoZS5zZWN0ID0gTlVMTDsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgICpmaWxlbmFtZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lOworICAqZnVuY3Rpb25uYW1lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lOworICAqcmV0bGluZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogVGhlc2Ugcm91dGluZXMgY29weSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4KKworICAgRklYTUU6IFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc2h1ZmZsZSBjb2RlIGlzIHRvIGF2b2lkIHN0b3JpbmcKKyAgIGV2ZXJ5dGhpbmcgaW4gbWVtb3J5LCBzaW5jZSB0aGUgbGlua2VyIGlzIHN1Y2ggYSBtZW1vcnkgaG9nLiAgVGhpcworICAgY29kZSBtYWtlcyB0aGF0IGVmZm9ydCB1c2VsZXNzLiAgSXQgaXMgb25seSBjYWxsZWQgYnkgdGhlIE1JUFMgRUxGCisgICBjb2RlIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBzbyBpdCBpcyBub3QgdGhhdCBiaWcgYQorICAgZGVhbCwgYnV0IGl0IHNob3VsZCBiZSBmaXhlZCBldmVudHVhbGx5LiAgKi8KKworLyogQ29sbGVjdCBhIHNodWZmbGUgaW50byBhIG1lbW9yeSBidWZmZXIuICAqLworCitzdGF0aWMgYm9vbGVhbiBlY29mZl9jb2xsZWN0X3NodWZmbGUgUEFSQU1TICgoc3RydWN0IHNodWZmbGUgKiwgYmZkX2J5dGUgKikpOworCitzdGF0aWMgYm9vbGVhbgorZWNvZmZfY29sbGVjdF9zaHVmZmxlIChsLCBidWZmKQorICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqbDsKKyAgICAgYmZkX2J5dGUgKmJ1ZmY7Cit7CisgIHVuc2lnbmVkIGxvbmcgdG90YWw7CisKKyAgdG90YWwgPSAwOworICBmb3IgKDsgbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgaWYgKCEgbC0+ZmlsZXApCisJbWVtY3B5IChidWZmLCBsLT51Lm1lbW9yeSwgbC0+c2l6ZSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKGJmZF9zZWVrIChsLT51LmZpbGUuaW5wdXRfYmZkLCBsLT51LmZpbGUub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCSAgICAgIHx8IGJmZF9yZWFkIChidWZmLCAxLCBsLT5zaXplLCBsLT51LmZpbGUuaW5wdXRfYmZkKSAhPSBsLT5zaXplKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgdG90YWwgKz0gbC0+c2l6ZTsKKyAgICAgIGJ1ZmYgKz0gbC0+c2l6ZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgUERSIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KKworYm9vbGVhbgorX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIChoYW5kbGUsIGJ1ZmYpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGJmZF9ieXRlICpidWZmOworeworICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOworCisgIHJldHVybiBlY29mZl9jb2xsZWN0X3NodWZmbGUgKGFpbmZvLT5wZHIsIGJ1ZmYpOworfQorCisvKiBDb3B5IHN5bWJvbCBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCisKK2Jvb2xlYW4KK19iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSAoaGFuZGxlLCBidWZmKQorICAgICBQVFIgaGFuZGxlOworICAgICBiZmRfYnl0ZSAqYnVmZjsKK3sKKyAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKKworICByZXR1cm4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIChhaW5mby0+c3ltLCBidWZmKTsKK30KKworLyogQ29weSB0aGUgc3RyaW5nIHRhYmxlIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KKworYm9vbGVhbgorX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgKGhhbmRsZSwgYnVmZikKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgYmZkX2J5dGUgKmJ1ZmY7Cit7CisgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7CisgIHVuc2lnbmVkIGxvbmcgdG90YWw7CisKKyAgLyogVGhlIHN0cmluZyB0YWJsZSBpcyB3cml0dGVuIG91dCBmcm9tIHRoZSBoYXNoIHRhYmxlIGlmIHRoaXMgaXMgYQorICAgICBmaW5hbCBsaW5rLiAgKi8KKyAgQkZEX0FTU0VSVCAoYWluZm8tPnNzID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKTsKKyAgKmJ1ZmYrKyA9ICdcMCc7CisgIHRvdGFsID0gMTsKKyAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gTlVMTCB8fCBhaW5mby0+c3NfaGFzaC0+dmFsID09IDEpOworICBmb3IgKHNoID0gYWluZm8tPnNzX2hhc2g7CisgICAgICAgc2ggIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMOworICAgICAgIHNoID0gc2gtPm5leHQpCisgICAgeworICAgICAgc2l6ZV90IGxlbjsKKworICAgICAgbGVuID0gc3RybGVuIChzaC0+cm9vdC5zdHJpbmcpOworICAgICAgbWVtY3B5IChidWZmLCAoUFRSKSBzaC0+cm9vdC5zdHJpbmcsIGxlbiArIDEpOworICAgICAgdG90YWwgKz0gbGVuICsgMTsKKyAgICAgIGJ1ZmYgKz0gbGVuICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9iZmQvZWNvZmZzd2FwLmggYi9iZmQvZWNvZmZzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyOGQxNgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lY29mZnN3YXAuaApAQCAtMCwwICsxLDg1MyBAQAorLyogR2VuZXJpYyBFQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBOT1RFOiBUaGlzIGlzIGEgaGVhZGVyIGZpbGUsIGJ1dCBpdCBjb250YWlucyBleGVjdXRhYmxlIHJvdXRpbmVzLgorICAgVGhpcyBpcyBkb25lIHRoaXMgd2F5IGJlY2F1c2UgdGhlc2Ugcm91dGluZXMgYXJlIHN1YnN0YW50aWFsbHkKKyAgIHNpbWlsYXIsIGJ1dCBhcmUgbm90IGlkZW50aWNhbCwgZm9yIGFsbCBFQ09GRiB0YXJnZXRzLgorCisgICBUaGVzZSBhcmUgcm91dGluZXMgdG8gc3dhcCB0aGUgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24gaW4gYW5kCisgICBvdXQuICBUaGUgcm91dGluZXMgYXJlIGRlZmluZWQgc3RhdGljYWxseS4gIFlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzCisgICBvbiB0aGVtIGluIGdkYiBieSBuYW1pbmcgdGhlIGluY2x1ZGluZyBzb3VyY2UgZmlsZTsgZS5nLiwKKyAgICdjb2ZmLW1pcHMuYyc6ZWNvZmZfc3dhcF9oZHJfaW4uCisKKyAgIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZSwgb25lIG9mIEVDT0ZGXzMyIG9yIEVDT0ZGXzY0IG11c3QKKyAgIGJlIGRlZmluZWQuICBUaGVzZSBhcmUgY2hlY2tlZCB3aGVuIHN3YXBwaW5nIGluZm9ybWF0aW9uIHRoYXQKKyAgIGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0IHNpemUuICBUaGlzIGNvZGUgd29ya3MgZm9yIDMyIGJpdCBhbmQgNjQKKyAgIGJpdCBFQ09GRiwgYnV0IG1heSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIGluIHRoZSBmdXR1cmUuCisKKyAgIFNvbWUgaGVhZGVyIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgZXh0ZXJuYWwgZm9ybXMgb2YgdGhlc2UKKyAgIHN0cnVjdHVyZXMgbXVzdCBhbHNvIGJlIGluY2x1ZGVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgZmlsZS4KKyAgIEN1cnJlbnRseSB0aGlzIGlzIGVpdGhlciBjb2ZmL21pcHMuaCBvciBjb2ZmL2FscGhhLmguCisKKyAgIElmIHRoZSBzeW1ib2wgVEVTVCBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCBhCisgICBjb21wYXJpc29uIGlzIG1hZGUgdG8gZW5zdXJlIHRoYXQsIGluIGZhY3QsIHRoZSBvdXRwdXQgaXMKKyAgIGJpdC1mb3ItYml0IHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIE9mIGNvdXJzZSwgdGhpcyBzeW1ib2wgc2hvdWxkCisgICBvbmx5IGJlIGRlZmluZWQgd2hlbiBkZWxpYmVyYXRlbHkgdGVzdGluZyB0aGUgY29kZSBvbiBhIG1hY2hpbmUKKyAgIHdpdGggdGhlIHByb3BlciBieXRlIHNleCBhbmQgc3VjaC4gICovCisKKyNpZmRlZiBFQ09GRl8zMgorI2RlZmluZSBlY29mZl9nZXRfb2ZmIGJmZF9oX2dldF8zMgorI2RlZmluZSBlY29mZl9wdXRfb2ZmIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZkZWYgRUNPRkZfNjQKKyNkZWZpbmUgZWNvZmZfZ2V0X29mZiBiZmRfaF9nZXRfNjQKKyNkZWZpbmUgZWNvZmZfcHV0X29mZiBiZmRfaF9wdXRfNjQKKyNlbmRpZgorCisvKiBFQ09GRiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdGhlIHNhbWUKKyAgIGZvciBhbGwgRUNPRkYgdGFyZ2V0cywgc28gdGhleSBhcmUgZGVmaW5lZCBpbiBlY29mZmxpbmsuYy4gICovCisKK2V4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4KKyAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3Rpcl9vdXQKKyAgUEFSQU1TICgoaW50LCBjb25zdCBUSVIgKiwgc3RydWN0IHRpcl9leHQgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4KKyAgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3Qgcm5keF9leHQgKiwgUk5EWFIgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0CisgIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKKworLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX2hkcl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Zkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBGRFIgKikpOworc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9mZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX3Bkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOworc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9wZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKTsKK3N0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZXh0X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpOworc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9leHRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOworc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9yZmRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JmZF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX29wdF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBPUFRSICopKTsKK3N0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfb3B0X291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZG5yX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEROUiAqKSk7CitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Rucl9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IEROUiAqLCBQVFIpKTsKKworLyogU3dhcCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfaGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBleHRfY29weTsKKyAgICAgSERSUiAqaW50ZXJuOworeworICBzdHJ1Y3QgaGRyX2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICooc3RydWN0IGhkcl9leHQgKikgZXh0X2NvcHk7CisKKyAgaW50ZXJuLT5tYWdpYyAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKKyAgaW50ZXJuLT52c3RhbXAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX3ZzdGFtcCk7CisgIGludGVybi0+aWxpbmVNYXggICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lsaW5lTWF4KTsKKyAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZSk7CisgIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOworICBpbnRlcm4tPmlkbk1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZG5NYXgpOworICBpbnRlcm4tPmNiRG5PZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7CisgIGludGVybi0+aXBkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lwZE1heCk7CisgIGludGVybi0+Y2JQZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKKyAgaW50ZXJuLT5pc3ltTWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXN5bU1heCk7CisgIGludGVybi0+Y2JTeW1PZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlN5bU9mZnNldCk7CisgIGludGVybi0+aW9wdE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lvcHRNYXgpOworICBpbnRlcm4tPmNiT3B0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JPcHRPZmZzZXQpOworICBpbnRlcm4tPmlhdXhNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKKyAgaW50ZXJuLT5jYkF1eE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKKyAgaW50ZXJuLT5pc3NNYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXNzTWF4KTsKKyAgaW50ZXJuLT5jYlNzT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOworICBpbnRlcm4tPmlzc0V4dE1heCAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NFeHRNYXgpOworICBpbnRlcm4tPmNiU3NFeHRPZmZzZXQgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7CisgIGludGVybi0+aWZkTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lmZE1heCk7CisgIGludGVybi0+Y2JGZE9mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKKyAgaW50ZXJuLT5jcmZkICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY3JmZCk7CisgIGludGVybi0+Y2JSZmRPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlJmZE9mZnNldCk7CisgIGludGVybi0+aWV4dE1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lleHRNYXgpOworICBpbnRlcm4tPmNiRXh0T2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JFeHRPZmZzZXQpOworCisjaWZkZWYgVEVTVAorICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCisgICAgYWJvcnQoKTsKKyNlbmRpZgorfQorCisvKiBTd2FwIG91dCB0aGUgc3ltYm9saWMgaGVhZGVyLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfaGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgSERSUiAqaW50ZXJuX2NvcHk7CisgICAgIFBUUiBleHRfcHRyOworeworICBzdHJ1Y3QgaGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBoZHJfZXh0ICopIGV4dF9wdHI7CisgIEhEUlIgaW50ZXJuWzFdOworCisgICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CisKKyAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT5tYWdpYywgKGJmZF9ieXRlICopZXh0LT5oX21hZ2ljKTsKKyAgYmZkX2hfcHV0X3NpZ25lZF8xNiAoYWJmZCwgaW50ZXJuLT52c3RhbXAsIChiZmRfYnl0ZSAqKWV4dC0+aF92c3RhbXApOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmVNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pbGluZU1heCk7CisgIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lKTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmVPZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWRuTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWRuTWF4KTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkRuT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JEbk9mZnNldCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pcGRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pcGRNYXgpOworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiUGRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlBkT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW1NYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3ltTWF4KTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlN5bU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3ltT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pb3B0TWF4KTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYk9wdE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiT3B0T2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlhdXhNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pYXV4TWF4KTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkF1eE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiQXV4T2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc01heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc01heCk7CisgIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTc09mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NPZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzRXh0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXNzRXh0TWF4KTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzRXh0T2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JTc0V4dE9mZnNldCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZmRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZmRNYXgpOworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiRmRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkZkT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jcmZkKTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlJmZE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiUmZkT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlleHRNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZXh0TWF4KTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkV4dE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRXh0T2Zmc2V0KTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX2Zkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZXh0X2NvcHk7CisgICAgIEZEUiAqaW50ZXJuOworeworICBzdHJ1Y3QgZmRyX2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICooc3RydWN0IGZkcl9leHQgKikgZXh0X2NvcHk7CisgIAorICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfYWRyKTsKKyAgaW50ZXJuLT5yc3MgICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKKyNpZmRlZiBFQ09GRl82NAorICBpZiAoaW50ZXJuLT5yc3MgPT0gMHhmZmZmZmZmZikKKyAgICBpbnRlcm4tPnJzcyA9IC0xOworI2VuZGlmCisgIGludGVybi0+aXNzQmFzZSAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzc0Jhc2UpOworICBpbnRlcm4tPmNiU3MgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7CisgIGludGVybi0+aXN5bUJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKKyAgaW50ZXJuLT5jc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3N5bSk7CisgIGludGVybi0+aWxpbmVCYXNlICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7CisgIGludGVybi0+Y2xpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKKyAgaW50ZXJuLT5pb3B0QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOworICBpbnRlcm4tPmNvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jb3B0KTsKKyNpZmRlZiBFQ09GRl8zMgorICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7CisgIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7CisjZW5kaWYKKyNpZmRlZiBFQ09GRl82NAorICBpbnRlcm4tPmlwZEZpcnN0ICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7CisgIGludGVybi0+Y3BkICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7CisjZW5kaWYKKyAgaW50ZXJuLT5pYXV4QmFzZSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaWF1eEJhc2UpOworICBpbnRlcm4tPmNhdXggICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKKyAgaW50ZXJuLT5yZmRCYXNlICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfcmZkQmFzZSk7CisgIGludGVybi0+Y3JmZCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NyZmQpOworCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7CisgICAgaW50ZXJuLT5sYW5nICAgICAgICA9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfTEFOR19CSUcpCisJCQkJCT4+IEZEUl9CSVRTMV9MQU5HX1NIX0JJRzsKKyAgICBpbnRlcm4tPmZNZXJnZSAgICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZNRVJHRV9CSUcpOworICAgIGludGVybi0+ZlJlYWRpbiAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRlJFQURJTl9CSUcpOworICAgIGludGVybi0+ZkJpZ2VuZGlhbiAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRkJJR0VORElBTl9CSUcpOworICAgIGludGVybi0+Z2xldmVsICAgICAgPSAoZXh0LT5mX2JpdHMyWzBdICYgRkRSX0JJVFMyX0dMRVZFTF9CSUcpCisJCQkJCT4+IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHOworICB9IGVsc2UgeworICAgIGludGVybi0+bGFuZyAgICAgICAgPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0xBTkdfTElUVExFKQorCQkJCQk+PiBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEU7CisgICAgaW50ZXJuLT5mTWVyZ2UgICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GTUVSR0VfTElUVExFKTsKKyAgICBpbnRlcm4tPmZSZWFkaW4gICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFKTsKKyAgICBpbnRlcm4tPmZCaWdlbmRpYW4gID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFKTsKKyAgICBpbnRlcm4tPmdsZXZlbCAgICAgID0gKGV4dC0+Zl9iaXRzMlswXSAmIEZEUl9CSVRTMl9HTEVWRUxfTElUVExFKQorCQkJCQk+PiBGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRTsKKyAgfQorICBpbnRlcm4tPnJlc2VydmVkID0gMDsKKworICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lT2Zmc2V0KTsKKyAgaW50ZXJuLT5jYkxpbmUgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKy8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfZmRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRkRSICppbnRlcm5fY29weTsKKyAgICAgUFRSIGV4dF9wdHI7Cit7CisgIHN0cnVjdCBmZHJfZXh0ICpleHQgPSAoc3RydWN0IGZkcl9leHQgKikgZXh0X3B0cjsKKyAgRkRSIGludGVyblsxXTsKKworICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLworICAKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+Zl9hZHIpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cnNzLCAoYmZkX2J5dGUgKilleHQtPmZfcnNzKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc0Jhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3NCYXNlKTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlNzLCAoYmZkX2J5dGUgKilleHQtPmZfY2JTcyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lzeW1CYXNlKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNzeW0sIChiZmRfYnl0ZSAqKWV4dC0+Zl9jc3ltKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lQmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lsaW5lQmFzZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jbGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NsaW5lKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHRCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaW9wdEJhc2UpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y29wdCwgKGJmZF9ieXRlICopZXh0LT5mX2NvcHQpOworI2lmZGVmIEVDT0ZGXzMyCisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5pcGRGaXJzdCwgKGJmZF9ieXRlICopZXh0LT5mX2lwZEZpcnN0KTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmNwZCwgKGJmZF9ieXRlICopZXh0LT5mX2NwZCk7CisjZW5kaWYKKyNpZmRlZiBFQ09GRl82NAorICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXBkRmlyc3QsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcGQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOworI2VuZGlmCisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pYXV4QmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lhdXhCYXNlKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNhdXgsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYXV4KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJmZEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9yZmRCYXNlKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNyZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcmZkKTsKKworICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgeworICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9CSUcpCisJCQkmIEZEUl9CSVRTMV9MQU5HX0JJRykKKwkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9CSUcgOiAwKQorCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fQklHIDogMCkKKwkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRyA6IDApKTsKKyAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfQklHKQorCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0JJRyk7CisgICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKKyAgICBleHQtPmZfYml0czJbMl0gPSAwOworICB9IGVsc2UgeworICAgIGV4dC0+Zl9iaXRzMVswXSA9ICgoKGludGVybi0+bGFuZyA8PCBGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUpCisJCQkmIEZEUl9CSVRTMV9MQU5HX0xJVFRMRSkKKwkJICAgICAgIHwgKGludGVybi0+Zk1lcmdlID8gRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUgOiAwKQorCQkgICAgICAgfCAoaW50ZXJuLT5mUmVhZGluID8gRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFIDogMCkKKwkJICAgICAgIHwgKGludGVybi0+ZkJpZ2VuZGlhbiA/IEZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRSA6IDApKTsKKyAgICBleHQtPmZfYml0czJbMF0gPSAoKGludGVybi0+Z2xldmVsIDw8IEZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFKQorCQkgICAgICAgJiBGRFJfQklUUzJfR0xFVkVMX0xJVFRMRSk7CisgICAgZXh0LT5mX2JpdHMyWzFdID0gMDsKKyAgICBleHQtPmZfYml0czJbMl0gPSAwOworICB9CisKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmVPZmZzZXQpOworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZSwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZSk7CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKyNpZm5kZWYgTVBXX0MKKworLyogU3dhcCBpbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfcGRyX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBleHRfY29weTsKKyAgICAgUERSICppbnRlcm47Cit7CisgIHN0cnVjdCBwZHJfZXh0IGV4dFsxXTsKKworICAqZXh0ID0gKihzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfY29weTsKKworICBtZW1zZXQgKChQVFIpIGludGVybiwgMCwgc2l6ZW9mICgqaW50ZXJuKSk7CisKKyAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7CisgIGludGVybi0+aXN5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOworICBpbnRlcm4tPmlsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7CisgIGludGVybi0+cmVnbWFzayAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOworICBpbnRlcm4tPnJlZ29mZnNldCAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAorCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7CisgIGludGVybi0+aW9wdCAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKKyAgaW50ZXJuLT5mcmVnbWFzayAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOworICBpbnRlcm4tPmZyZWdvZmZzZXQgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAorCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOworICBpbnRlcm4tPmZyYW1lb2Zmc2V0ICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAorCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKKyAgaW50ZXJuLT5mcmFtZXJlZyAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOworICBpbnRlcm4tPnBjcmVnICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7CisgIGludGVybi0+bG5Mb3cgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKKyAgaW50ZXJuLT5sbkhpZ2ggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKKyAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7CisKKyNpZmRlZiBFQ09GRl82NAorICBpbnRlcm4tPmdwX3Byb2xvZ3VlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKKyAgICB7CisgICAgICBpbnRlcm4tPmdwX3VzZWQgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfR1BfVVNFRF9CSUcpOworICAgICAgaW50ZXJuLT5yZWdfZnJhbWUgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyk7CisgICAgICBpbnRlcm4tPnByb2YgPSAwICE9IChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUFJPRl9CSUcpOworICAgICAgaW50ZXJuLT5yZXNlcnZlZCA9ICgoKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcpCisJCQkgICA8PCBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCisJCQkgIHwgKChleHQtPnBfYml0czJbMF0gJiBQRFJfQklUUzJfUkVTRVJWRURfQklHKQorCQkJICAgICA+PiBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50ZXJuLT5ncF91c2VkID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX0dQX1VTRURfTElUVExFKTsKKyAgICAgIGludGVybi0+cmVnX2ZyYW1lID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFR19GUkFNRV9MSVRUTEUpOworICAgICAgaW50ZXJuLT5wcm9mID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1BST0ZfTElUVExFKTsKKyAgICAgIGludGVybi0+cmVzZXJ2ZWQgPSAoKChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKQorCQkJICAgPj4gUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRSkKKwkJCSAgfCAoKGV4dC0+cF9iaXRzMlswXSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpCisJCQkgICAgIDw8IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSkpOworICAgIH0KKyAgaW50ZXJuLT5sb2NhbG9mZiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5wX2xvY2Fsb2ZmKTsKKyNlbmRpZiAgCisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKy8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLworCitzdGF0aWMgdm9pZAorZWNvZmZfc3dhcF9wZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBQRFIgKmludGVybl9jb3B5OworICAgICBQVFIgZXh0X3B0cjsKK3sKKyAgc3RydWN0IHBkcl9leHQgKmV4dCA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfcHRyOworICBQRFIgaW50ZXJuWzFdOworCisgICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCisgIAorICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZSwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0LCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5wY3JlZywgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuTG93LCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5IaWdoLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKKyAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOworCisjaWZkZWYgRUNPRkZfNjQKKyAgYmZkX2hfcHV0XzggKGFiZmQsIGludGVybi0+Z3BfcHJvbG9ndWUsIChiZmRfYnl0ZSAqKSBleHQtPnBfZ3BfcHJvbG9ndWUpOworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKKyAgICB7CisgICAgICBleHQtPnBfYml0czFbMF0gPSAoKGludGVybi0+Z3BfdXNlZCA/IFBEUl9CSVRTMV9HUF9VU0VEX0JJRyA6IDApCisJCQkgfCAoaW50ZXJuLT5yZWdfZnJhbWUgPyBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRyA6IDApCisJCQkgfCAoaW50ZXJuLT5wcm9mID8gUERSX0JJVFMxX1BST0ZfQklHIDogMCkKKwkJCSB8ICgoaW50ZXJuLT5yZXNlcnZlZAorCQkJICAgICA+PiBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcpCisJCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfQklHKSk7CisgICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPDwgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRykKKwkJCSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9CSUcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dC0+cF9iaXRzMVswXSA9ICgoaW50ZXJuLT5ncF91c2VkID8gUERSX0JJVFMxX0dQX1VTRURfTElUVExFIDogMCkKKwkJCSB8IChpbnRlcm4tPnJlZ19mcmFtZSA/IFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFIDogMCkKKwkJCSB8IChpbnRlcm4tPnByb2YgPyBQRFJfQklUUzFfUFJPRl9MSVRUTEUgOiAwKQorCQkJIHwgKChpbnRlcm4tPnJlc2VydmVkIDw8IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUpCisJCQkgICAgJiBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFKSk7CisgICAgICBleHQtPnBfYml0czJbMF0gPSAoKGludGVybi0+cmVzZXJ2ZWQgPj4KKwkJCSAgUERSX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFKQorCQkJICYgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSk7CisgICAgfQorICBiZmRfaF9wdXRfOCAoYWJmZCwgaW50ZXJuLT5sb2NhbG9mZiwgKGJmZF9ieXRlICopIGV4dC0+cF9sb2NhbG9mZik7CisjZW5kaWYgIAorCisjaWZkZWYgVEVTVAorICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCisgICAgYWJvcnQoKTsKKyNlbmRpZgorfQorCisjZWxzZSAvKiBNUFdfQyAqLworLyogU2FtZSByb3V0aW5lcywgYnV0IHdpdGggRUNPRkZfNjQgY29kZSByZW1vdmVkLCBzbyBeJiUkIyYhIE1QVyBDIGRvZXNuJ3QKKyAgIGNvcnJ1cHQgaXRzZWxmIGFuZCB0aGVuIGZyZWFrIG91dC4gKi8KKy8qIFN3YXAgaW4gdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX3Bkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZXh0X2NvcHk7CisgICAgIFBEUiAqaW50ZXJuOworeworICBzdHJ1Y3QgcGRyX2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICooc3RydWN0IHBkcl9leHQgKikgZXh0X2NvcHk7CisgIAorICBpbnRlcm4tPmFkciAgICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKKyAgaW50ZXJuLT5pc3ltICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7CisgIGludGVybi0+aWxpbmUgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKKyAgaW50ZXJuLT5yZWdtYXNrICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7CisgIGludGVybi0+cmVnb2Zmc2V0ICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCisJCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKKyAgaW50ZXJuLT5pb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOworICBpbnRlcm4tPmZyZWdtYXNrICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7CisgIGludGVybi0+ZnJlZ29mZnNldCAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCisJCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7CisgIGludGVybi0+ZnJhbWVvZmZzZXQgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsCisJCQkJCSAgICAgICAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOworICBpbnRlcm4tPmZyYW1lcmVnICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7CisgIGludGVybi0+cGNyZWcgICAgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKKyAgaW50ZXJuLT5sbkxvdyAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOworICBpbnRlcm4tPmxuSGlnaCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOworICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBvdXQgdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX3Bkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IFBEUiAqaW50ZXJuX2NvcHk7CisgICAgIFBUUiBleHRfcHRyOworeworICBzdHJ1Y3QgcGRyX2V4dCAqZXh0ID0gKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9wdHI7CisgIFBEUiBpbnRlcm5bMV07CisKKyAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KKyAgCisgIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPnBfYWRyKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzeW0sIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfcmVnb2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlvcHQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5mcmFtZXJlZywgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPnBjcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5Mb3csIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkhpZ2gsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkhpZ2gpOworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZU9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisjZW5kaWYgLyogTVBXX0MgKi8KKworLyogU3dhcCBpbiBhIHN5bWJvbCByZWNvcmQuICAqLworCitzdGF0aWMgdm9pZAorZWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGV4dF9jb3B5OworICAgICBTWU1SICppbnRlcm47Cit7CisgIHN0cnVjdCBzeW1fZXh0IGV4dFsxXTsKKworICAqZXh0ID0gKihzdHJ1Y3Qgc3ltX2V4dCAqKSBleHRfY29weTsKKyAgCisgIGludGVybi0+aXNzICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5zX2lzcyk7CisgIGludGVybi0+dmFsdWUgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+c192YWx1ZSk7CisKKyAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKKyAgICBpbnRlcm4tPnN0ICAgICAgICAgID0gIChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU1RfQklHKQorCQkJCQkgICA+PiBTWU1fQklUUzFfU1RfU0hfQklHOworICAgIGludGVybi0+c2MgICAgICAgICAgPSAoKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TQ19CSUcpCisJCQkJCSAgIDw8IFNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRykKKwkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfQklHKQorCQkJCQkgICA+PiBTWU1fQklUUzJfU0NfU0hfQklHKTsKKyAgICBpbnRlcm4tPnJlc2VydmVkICAgID0gMCAhPSAoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyk7CisgICAgaW50ZXJuLT5pbmRleCAgICAgICA9ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX0lOREVYX0JJRykKKwkJCQkJICAgPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQorCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykKKwkJCXwgKGV4dC0+c19iaXRzNFswXSA8PCBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcpOworICB9IGVsc2UgeworICAgIGludGVybi0+c3QgICAgICAgICAgPSAgKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TVF9MSVRUTEUpCisJCQkJCSAgID4+IFNZTV9CSVRTMV9TVF9TSF9MSVRUTEU7CisgICAgaW50ZXJuLT5zYyAgICAgICAgICA9ICgoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkKKwkJCQkJICAgPj4gU1lNX0JJVFMxX1NDX1NIX0xJVFRMRSkKKwkJCXwgKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfU0NfTElUVExFKQorCQkJCQkgICA8PCBTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUpOworICAgIGludGVybi0+cmVzZXJ2ZWQgICAgPSAwICE9IChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfUkVTRVJWRURfTElUVExFKTsKKyAgICBpbnRlcm4tPmluZGV4ICAgICAgID0gKChleHQtPnNfYml0czJbMF0gJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKQorCQkJCQkgICA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFKQorCQkJfCAoZXh0LT5zX2JpdHMzWzBdIDw8IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSkKKwkJCXwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+c19iaXRzNFswXQorCQkJICAgPDwgU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKTsKKyAgfQorCisjaWZkZWYgVEVTVAorICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCisgICAgYWJvcnQoKTsKKyNlbmRpZgorfQorCisvKiBTd2FwIG91dCBhIHN5bWJvbCByZWNvcmQuICAqLworCitzdGF0aWMgdm9pZAorZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBTWU1SICppbnRlcm5fY29weTsKKyAgICAgUFRSIGV4dF9wdHI7Cit7CisgIHN0cnVjdCBzeW1fZXh0ICpleHQgPSAoc3RydWN0IHN5bV9leHQgKikgZXh0X3B0cjsKKyAgU1lNUiBpbnRlcm5bMV07CisKKyAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KKyAgCisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3MsIChiZmRfYnl0ZSAqKWV4dC0+c19pc3MpOworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPnZhbHVlLCAoYmZkX2J5dGUgKilleHQtPnNfdmFsdWUpOworCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7CisgICAgZXh0LT5zX2JpdHMxWzBdID0gKCgoaW50ZXJuLT5zdCA8PCBTWU1fQklUUzFfU1RfU0hfQklHKQorCQkJJiBTWU1fQklUUzFfU1RfQklHKQorCQkgICAgICAgfCAoKGludGVybi0+c2MgPj4gU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHKQorCQkJICAmIFNZTV9CSVRTMV9TQ19CSUcpKTsKKyAgICBleHQtPnNfYml0czJbMF0gPSAoKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMl9TQ19TSF9CSUcpCisJCQkmIFNZTV9CSVRTMl9TQ19CSUcpCisJCSAgICAgICB8IChpbnRlcm4tPnJlc2VydmVkID8gU1lNX0JJVFMyX1JFU0VSVkVEX0JJRyA6IDApCisJCSAgICAgICB8ICgoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcpCisJCQkgICYgU1lNX0JJVFMyX0lOREVYX0JJRykpOworICAgIGV4dC0+c19iaXRzM1swXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOworICAgIGV4dC0+c19iaXRzNFswXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRykgJiAweGZmOworICB9IGVsc2UgeworICAgIGV4dC0+c19iaXRzMVswXSA9ICgoKGludGVybi0+c3QgPDwgU1lNX0JJVFMxX1NUX1NIX0xJVFRMRSkKKwkJCSYgU1lNX0JJVFMxX1NUX0xJVFRMRSkKKwkJICAgICAgIHwgKChpbnRlcm4tPnNjIDw8IFNZTV9CSVRTMV9TQ19TSF9MSVRUTEUpCisJCQkgICYgU1lNX0JJVFMxX1NDX0xJVFRMRSkpOworICAgIGV4dC0+c19iaXRzMlswXSA9ICgoKGludGVybi0+c2MgPj4gU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFKQorCQkJJiBTWU1fQklUUzJfU0NfTElUVExFKQorCQkgICAgICAgfCAoaW50ZXJuLT5yZXNlcnZlZCA/IFNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUgOiAwKQorCQkgICAgICAgfCAoKGludGVybi0+aW5kZXggPDwgU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRSkKKwkJCSAgJiBTWU1fQklUUzJfSU5ERVhfTElUVExFKSk7CisgICAgZXh0LT5zX2JpdHMzWzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7CisgICAgZXh0LT5zX2JpdHM0WzBdID0gKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFKSAmIDB4ZmY7CisgIH0KKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBpbiBhbiBleHRlcm5hbCBzeW1ib2wgcmVjb3JkLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfZXh0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBleHRfY29weTsKKyAgICAgRVhUUiAqaW50ZXJuOworeworICBzdHJ1Y3QgZXh0X2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICooc3RydWN0IGV4dF9leHQgKikgZXh0X2NvcHk7CisgIAorICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLworICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgeworICAgIGludGVybi0+am1wdGJsICAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0pNUFRCTF9CSUcpOworICAgIGludGVybi0+Y29ib2xfbWFpbiAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHKTsKKyAgICBpbnRlcm4tPndlYWtleHQgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9XRUFLRVhUX0JJRyk7CisgIH0gZWxzZSB7CisgICAgaW50ZXJuLT5qbXB0YmwgICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfSk1QVEJMX0xJVFRMRSk7CisgICAgaW50ZXJuLT5jb2JvbF9tYWluICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUpOworICAgIGludGVybi0+d2Vha2V4dCAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFKTsKKyAgfQorICBpbnRlcm4tPnJlc2VydmVkID0gMDsKKworI2lmZGVmIEVDT0ZGXzMyCisgIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKKyNlbmRpZgorI2lmZGVmIEVDT0ZGXzY0CisgIGludGVybi0+aWZkICAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKKyNlbmRpZgorCisgIGVjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAmZXh0LT5lc19hc3ltLCAmaW50ZXJuLT5hc3ltKTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBvdXQgYW4gZXh0ZXJuYWwgc3ltYm9sIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX2V4dF9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVYVFIgKmludGVybl9jb3B5OworICAgICBQVFIgZXh0X3B0cjsKK3sKKyAgc3RydWN0IGV4dF9leHQgKmV4dCA9IChzdHJ1Y3QgZXh0X2V4dCAqKSBleHRfcHRyOworICBFWFRSIGludGVyblsxXTsKKworICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLworICAKKyAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKKyAgICBleHQtPmVzX2JpdHMxWzBdID0gKChpbnRlcm4tPmptcHRibCA/IEVYVF9CSVRTMV9KTVBUQkxfQklHIDogMCkKKwkJCXwgKGludGVybi0+Y29ib2xfbWFpbiA/IEVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRyA6IDApCisJCQl8IChpbnRlcm4tPndlYWtleHQgPyBFWFRfQklUUzFfV0VBS0VYVF9CSUcgOiAwKSk7CisgICAgZXh0LT5lc19iaXRzMlswXSA9IDA7CisjaWZkZWYgRUNPRkZfNjQKKyAgICBleHQtPmVzX2JpdHMyWzFdID0gMDsKKyAgICBleHQtPmVzX2JpdHMyWzJdID0gMDsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGV4dC0+ZXNfYml0czFbMF0gPSAoKGludGVybi0+am1wdGJsID8gRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUgOiAwKQorCQkJfCAoaW50ZXJuLT5jb2JvbF9tYWluID8gRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFIDogMCkKKwkJCXwgKGludGVybi0+d2Vha2V4dCA/IEVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRSA6IDApKTsKKyAgICBleHQtPmVzX2JpdHMyWzBdID0gMDsKKyNpZmRlZiBFQ09GRl82NAorICAgIGV4dC0+ZXNfYml0czJbMV0gPSAwOworICAgIGV4dC0+ZXNfYml0czJbMl0gPSAwOworI2VuZGlmCisgIH0KKworI2lmZGVmIEVDT0ZGXzMyCisgIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+aWZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7CisjZW5kaWYKKyNpZmRlZiBFQ09GRl82NAorICBiZmRfaF9wdXRfc2lnbmVkXzMyIChhYmZkLCBpbnRlcm4tPmlmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOworI2VuZGlmCisKKyAgZWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmaW50ZXJuLT5hc3ltLCAmZXh0LT5lc19hc3ltKTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBpbiBhIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvci4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX3JmZF9pbiAoYWJmZCwgZXh0X3B0ciwgaW50ZXJuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBleHRfcHRyOworICAgICBSRkRUICppbnRlcm47Cit7CisgIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKKworICAqaW50ZXJuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnJmZCk7CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKy8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfcmZkX291dCAoYWJmZCwgaW50ZXJuLCBleHRfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IFJGRFQgKmludGVybjsKKyAgICAgUFRSIGV4dF9wdHI7Cit7CisgIHN0cnVjdCByZmRfZXh0ICpleHQgPSAoc3RydWN0IHJmZF9leHQgKikgZXh0X3B0cjsKKworICBiZmRfaF9wdXRfMzIgKGFiZmQsICppbnRlcm4sIChiZmRfYnl0ZSAqKWV4dC0+cmZkKTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBpbiBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfb3B0X2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBleHRfY29weTsKKyAgICAgT1BUUiAqaW50ZXJuOworeworICBzdHJ1Y3Qgb3B0X2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICooc3RydWN0IG9wdF9leHQgKikgZXh0X2NvcHk7CisKKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisgICAgeworICAgICAgaW50ZXJuLT5vdCA9IGV4dC0+b19iaXRzMVswXTsKKyAgICAgIGludGVybi0+dmFsdWUgPSAoKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzMlswXQorCQkJPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKQorCQkgICAgICAgfCAoKHVuc2lnbmVkIGludCkgZXh0LT5vX2JpdHMzWzBdCisJCQkgIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykKKwkJICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzNFswXQorCQkJICA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnRlcm4tPm90ID0gZXh0LT5vX2JpdHMxWzBdOworICAgICAgaW50ZXJuLT52YWx1ZSA9ICgoZXh0LT5vX2JpdHMyWzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkKKwkJICAgICAgIHwgKGV4dC0+b19iaXRzM1swXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpCisJCSAgICAgICB8IChleHQtPm9fYml0czRbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKSk7CisgICAgfQorCisgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpLAorCQkJICAgJmV4dC0+b19ybmR4LCAmaW50ZXJuLT5ybmR4KTsKKworICBpbnRlcm4tPm9mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+b19vZmZzZXQpOworCisjaWZkZWYgVEVTVAorICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCisgICAgYWJvcnQoKTsKKyNlbmRpZgorfQorCisvKiBTd2FwIG91dCBhbiBvcHRpbWl6YXRpb24gc3ltYm9sLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfb3B0X291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgT1BUUiAqaW50ZXJuX2NvcHk7CisgICAgIFBUUiBleHRfcHRyOworeworICBzdHJ1Y3Qgb3B0X2V4dCAqZXh0ID0gKHN0cnVjdCBvcHRfZXh0ICopIGV4dF9wdHI7CisgIE9QVFIgaW50ZXJuWzFdOworCisgICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCisKKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisgICAgeworICAgICAgZXh0LT5vX2JpdHMxWzBdID0gaW50ZXJuLT5vdDsKKyAgICAgIGV4dC0+b19iaXRzMlswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHOworICAgICAgZXh0LT5vX2JpdHMzWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUc7CisgICAgICBleHQtPm9fYml0czRbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBleHQtPm9fYml0czFbMF0gPSBpbnRlcm4tPm90OworICAgICAgZXh0LT5vX2JpdHMyWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEU7CisgICAgICBleHQtPm9fYml0czNbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRTsKKyAgICAgIGV4dC0+b19iaXRzNFswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFOworICAgIH0KKworICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCksCisJCQkgICAgJmludGVybi0+cm5keCwgJmV4dC0+b19ybmR4KTsKKworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+dmFsdWUsIChiZmRfYnl0ZSAqKSBleHQtPm9fb2Zmc2V0KTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KKworLyogU3dhcCBpbiBhIGRlbnNlIG51bWJlci4gICovCisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX2Rucl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZXh0X2NvcHk7CisgICAgIEROUiAqaW50ZXJuOworeworICBzdHJ1Y3QgZG5yX2V4dCBleHRbMV07CisKKyAgKmV4dCA9ICooc3RydWN0IGRucl9leHQgKikgZXh0X2NvcHk7CisKKyAgaW50ZXJuLT5yZmQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKKyAgaW50ZXJuLT5pbmRleCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZF9pbmRleCk7CisKKyNpZmRlZiBURVNUCisgIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKKyAgICBhYm9ydCgpOworI2VuZGlmCit9CisKKy8qIFN3YXAgb3V0IGEgZGVuc2UgbnVtYmVyLiAgKi8KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3N3YXBfZG5yX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRE5SICppbnRlcm5fY29weTsKKyAgICAgUFRSIGV4dF9wdHI7Cit7CisgIHN0cnVjdCBkbnJfZXh0ICpleHQgPSAoc3RydWN0IGRucl9leHQgKikgZXh0X3B0cjsKKyAgRE5SIGludGVyblsxXTsKKworICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLworCisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfcmZkKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmluZGV4LCAoYmZkX2J5dGUgKikgZXh0LT5kX2luZGV4KTsKKworI2lmZGVmIFRFU1QKKyAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQorICAgIGFib3J0KCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2JmZC9lbGYtYmZkLmggYi9iZmQvZWxmLWJmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmZlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmLWJmZC5oCkBAIC0wLDAgKzEsMTExNCBAQAorLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgRUxGIGZpbGVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0xJQkVMRl9IXworI2RlZmluZSBfTElCRUxGX0hfIDEKKworI2luY2x1ZGUgImVsZi9jb21tb24uaCIKKyNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisKKy8qIElmIHNpemUgaXNuJ3Qgc3BlY2lmaWVkIGFzIDY0IG9yIDMyLCBOQU1FIG1hY3JvIHNob3VsZCBmYWlsLiAgKi8KKyNpZm5kZWYgTkFNRQorI2lmIEFSQ0hfU0laRT09NjQKKyNkZWZpbmUgTkFNRSh4LHkpIENBVDQoeCw2NCxfLHkpCisjZW5kaWYKKyNpZiBBUkNIX1NJWkU9PTMyCisjZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsMzIsXyx5KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBOQU1FCisjZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsTk9TSVpFLF8seSkKKyNlbmRpZgorCisjZGVmaW5lIEVsZk5BTUUoWCkJTkFNRShFbGYsWCkKKyNkZWZpbmUgZWxmTkFNRShYKQlOQU1FKGVsZixYKQorCisvKiBJbmZvcm1hdGlvbiBoZWxkIGZvciBhbiBFTEYgc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIGlzIHRoZQorICAgY29ycmVzcG9uZGluZyBhc3ltYm9sLiAgRXZlcnkgc3ltYm9sIGlzIGFuIEVMRiBmaWxlIGlzIGFjdHVhbGx5IGEKKyAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFsdGhvdWdoIGl0IGlzIG9mdGVuIGhhbmRsZWQgYXMgYQorICAgcG9pbnRlciB0byBhbiBhc3ltYm9sLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogVGhlIEJGRCBzeW1ib2wuICAqLworICBhc3ltYm9sIHN5bWJvbDsKKyAgLyogRUxGIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisgIEVsZl9JbnRlcm5hbF9TeW0gaW50ZXJuYWxfZWxmX3N5bTsKKyAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCisgIHVuaW9uCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGhwcGFfYXJnX3JlbG9jOworICAgICAgUFRSIG1pcHNfZXh0cjsKKyAgICAgIFBUUiBhbnk7CisgICAgfQorICB0Y19kYXRhOworCisgIC8qIFZlcnNpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIGZyb20gYW4gRWxmX0ludGVybmFsX1ZlcnN5bQorICAgICBzdHJ1Y3R1cmUgaW4gYSBTSFRfR05VX3ZlcnN5bSBzZWN0aW9uLiAgSXQgaXMgemVybyBpZiB0aGVyZSBpcyBubworICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKKworfSBlbGZfc3ltYm9sX3R5cGU7CisMCisvKiBFTEYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCisKK3N0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7CisKKyAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBpbml0aWFsaXplZCB0byAtMS4gIEl0IGlzCisgICAgIHNldCB0byAtMiBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCisgIGxvbmcgaW5keDsKKworICAvKiBTeW1ib2wgc2l6ZS4gICovCisgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworICAvKiBTeW1ib2wgaW5kZXggYXMgYSBkeW5hbWljIHN5bWJvbC4gIEluaXRpYWxpemVkIHRvIC0xLCBhbmQgcmVtYWlucworICAgICAtMSBpZiB0aGlzIGlzIG5vdCBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KKyAgbG9uZyBkeW5pbmR4OworCisgIC8qIFN0cmluZyB0YWJsZSBpbmRleCBpbiAuZHluc3RyIGlmIHRoaXMgaXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisgIHVuc2lnbmVkIGxvbmcgZHluc3RyX2luZGV4OworCisgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIGRlZmluZWQgc3ltYm9sIGZyb20gYSBkeW5hbWljIG9iamVjdCwgdGhpcworICAgICBmaWVsZCBwb2ludHMgdG8gYSBkZWZpbmVkIHN5bWJvbCB3aXRoIHRoZSBzYW1lIHZhbHVlLCBpZiB0aGVyZSBpcworICAgICBvbmUuICBPdGhlcndpc2UgaXQgaXMgTlVMTC4gICovCisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrZGVmOworCisgIC8qIElmIHRoaXMgc3ltYm9sIHJlcXVpcmVzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCB0aGUKKyAgICAgcHJvY2Vzc29yIHNwZWNpZmljIGJhY2tlbmQgdXNlcyB0aGlzIGZpZWxkIHRvIHRyYWNrIHVzYWdlIGFuZAorICAgICBmaW5hbCBvZmZzZXQuICBXZSB1c2UgYSB1bmlvbiBhbmQgdHdvIG5hbWVzIHByaW1hcmlseSB0byBkb2N1bWVudAorICAgICB0aGUgaW50ZW50IG9mIGFueSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUuICBUaGUgZmllbGQgc2hvdWxkIGJlCisgICAgIHVzZWQgYXMgYSBjb3VudCB1bnRpbCBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGF0IHdoaWNoIHBvaW50IHRoZQorICAgICBjb250ZW50cyBvZiB0aGUgLmdvdCBpcyBmaXhlZC4gIEFmdGVyd2FyZCwgaWYgdGhpcyBmaWVsZCBpcyAtMSwKKyAgICAgdGhlbiB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICBiZmRfc2lnbmVkX3ZtYSByZWZjb3VudDsKKyAgICAgIGJmZF92bWEgb2Zmc2V0OworICAgIH0gZ290OworCisgIC8qIFNhbWUsIGJ1dCB0cmFja3MgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCisgIHVuaW9uCisgICAgeworICAgICAgYmZkX3NpZ25lZF92bWEgcmVmY291bnQ7CisgICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICB9IHBsdDsKKworICAvKiBJZiB0aGlzIHN5bWJvbCBpcyB1c2VkIGluIHRoZSBsaW5rZXIgY3JlYXRlZCBzZWN0aW9ucywgdGhlIHByb2Nlc3NvcgorICAgICBzcGVjaWZpYyBiYWNrZW5kIHVzZXMgdGhpcyBmaWVsZCB0byBtYXAgdGhlIGZpZWxkIGludG8gdGhlIG9mZnNldAorICAgICBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24uICAqLworICBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzICpsaW5rZXJfc2VjdGlvbl9wb2ludGVyOworCisgIC8qIFZlcnNpb24gaW5mb3JtYXRpb24uICAqLworICB1bmlvbgorICB7CisgICAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIGZvciBhIHN5bWJvbCB3aGljaCBpcyBub3QgZGVmaW5lZCBpbiBhCisgICAgICAgcmVndWxhciBvYmplY3QuICBJdCBwb2ludHMgdG8gdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gcmVhZCBpbgorICAgICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0LiAgKi8KKyAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICp2ZXJkZWY7CisgICAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIGZvciBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGEgcmVndWxhcgorICAgICAgIG9iamVjdC4gIEl0IGlzIHNldCB1cCBpbiBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICBJdCBwb2ludHMgdG8KKyAgICAgICB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiB3ZSBzaG91bGQgd3JpdGUgb3V0IGZvciB0aGlzIHN5bWJvbC4gICovCisgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJ0cmVlOworICB9IHZlcmluZm87CisKKyAgLyogVmlydHVhbCB0YWJsZSBlbnRyeSB1c2UgaW5mb3JtYXRpb24uICBUaGlzIGFycmF5IGlzIG5vbWluYWxseSBvZiBzaXplCisgICAgIHNpemUvc2l6ZW9mKHRhcmdldF92b2lkX3BvaW50ZXIpLCB0aG91Z2ggd2UgaGF2ZSB0byBiZSBhYmxlIHRvIGFzc3VtZQorICAgICBhbmQgdHJhY2sgYSBzaXplIHdoaWxlIHRoZSBzeW1ib2wgaXMgc3RpbGwgdW5kZWZpbmVkLiAgSXQgaXMgaW5kZXhlZAorICAgICB2aWEgb2Zmc2V0L3NpemVvZih0YXJnZXRfdm9pZF9wb2ludGVyKS4gICovCisgIHNpemVfdCB2dGFibGVfZW50cmllc19zaXplOworICBib29sZWFuICp2dGFibGVfZW50cmllc191c2VkOworCisgIC8qIFZpcnR1YWwgdGFibGUgZGVyaXZhdGlvbiBpbmZvLiAgKi8KKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnZ0YWJsZV9wYXJlbnQ7CisKKyAgLyogU3ltYm9sIHR5cGUgKFNUVF9OT1RZUEUsIFNUVF9PQkpFQ1QsIGV0Yy4pLiAgKi8KKyAgY2hhciB0eXBlOworCisgIC8qIFN5bWJvbCBzdF9vdGhlciB2YWx1ZS4gICovCisgIHVuc2lnbmVkIGNoYXIgb3RoZXI7CisKKyAgLyogSGFzaCB2YWx1ZSBvZiB0aGUgbmFtZSBjb21wdXRlZCB1c2luZyB0aGUgRUxGIGhhc2ggZnVuY3Rpb24uICAqLworICB1bnNpZ25lZCBsb25nIGVsZl9oYXNoX3ZhbHVlOworCisgIC8qIFNvbWUgZmxhZ3M7IGxlZ2FsIHZhbHVlcyBmb2xsb3cuICAqLworICB1bnNpZ25lZCBzaG9ydCBlbGZfbGlua19oYXNoX2ZsYWdzOworICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUiAwMQorICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiAwMgorICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIHNoYXJlZCBvYmplY3QuICAqLworI2RlZmluZSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDIDA0CisgIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgc2hhcmVkIG9iamVjdC4gICovCisjZGVmaW5lIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgMDEwCisgIC8qIFN5bWJvbCBoYXMgYSBub24td2VhayByZWZlcmVuY2UgZnJvbSBhIG5vbi1zaGFyZWQgb2JqZWN0LiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLIDAyMAorICAvKiBEeW5hbWljIHN5bWJvbCBoYXMgYmVlbiBhZGp1c3RkLiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfSEFTSF9EWU5BTUlDX0FESlVTVEVEIDA0MAorICAvKiBTeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZIDAxMDAKKyAgLyogU3ltYm9sIG5lZWRzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLworI2RlZmluZSBFTEZfTElOS19IQVNIX05FRURTX1BMVCAwMjAwCisgIC8qIFN5bWJvbCBhcHBlYXJzIGluIGEgbm9uLUVMRiBpbnB1dCBmaWxlLiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfTk9OX0VMRiAwNDAwCisgIC8qIFN5bWJvbCBzaG91bGQgYmUgbWFya2VkIGFzIGhpZGRlbiBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIEVMRl9MSU5LX0hJRERFTiAwMTAwMAorICAvKiBTeW1ib2wgd2FzIGZvcmNlZCB0byBsb2NhbCBzY29wZSBkdWUgdG8gYSB2ZXJzaW9uIHNjcmlwdCBmaWxlLiAgKi8KKyNkZWZpbmUgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMIDAyMDAwCisgIC8qIFN5bWJvbCB3YXMgbWFya2VkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLworI2RlZmluZSBFTEZfTElOS19IQVNIX01BUksgMDQwMDAKK307CisKKy8qIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlCit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisgIC8qIFdoZXRoZXIgd2UgaGF2ZSBjcmVhdGVkIHRoZSBzcGVjaWFsIGR5bmFtaWMgc2VjdGlvbnMgcmVxdWlyZWQKKyAgICAgd2hlbiBsaW5raW5nIGFnYWluc3Qgb3IgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuICAqLworICBib29sZWFuIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZDsKKyAgLyogVGhlIEJGRCB1c2VkIHRvIGhvbGQgc3BlY2lhbCBzZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIuCisgICAgIFRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgQkZEIGZvdW5kIHdoaWNoIHJlcXVpcmVzIHRoZXNlIHNlY3Rpb25zIHRvCisgICAgIGJlIGNyZWF0ZWQuICAqLworICBiZmQgKmR5bm9iajsKKyAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIGZvdW5kIGluIHRoZSBsaW5rIHdoaWNoIG11c3QgYmUgcHV0IGludG8KKyAgICAgdGhlIC5keW5zeW0gc2VjdGlvbi4gICovCisgIGJmZF9zaXplX3R5cGUgZHluc3ltY291bnQ7CisgIC8qIFRoZSBzdHJpbmcgdGFibGUgb2YgZHluYW1pYyBzeW1ib2xzLCB3aGljaCBiZWNvbWVzIHRoZSAuZHluc3RyCisgICAgIHNlY3Rpb24uICAqLworICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7CisgIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZSBpbiB0aGUgLmhhc2ggc2VjdGlvbi4KKyAgICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scy4gICovCisgIGJmZF9zaXplX3R5cGUgYnVja2V0Y291bnQ7CisgIC8qIEEgbGlua2VkIGxpc3Qgb2YgRFRfTkVFREVEIG5hbWVzIGZvdW5kIGluIGR5bmFtaWMgb2JqZWN0cworICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCisgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOworICAvKiBUaGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHN5bWJvbC4gICovCisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoZ290OworICAvKiBBIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gdXNlZCB0byBsaW5rIHN0YWJzIGluIHNlY3Rpb25zLiAgKi8KKyAgUFRSIHN0YWJfaW5mbzsKK307CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBlbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAorICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCisgICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKKwkJCSAoY29weSksIChmb2xsb3cpKSkKKworLyogVHJhdmVyc2UgYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBlbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKKyAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCisgICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisKKy8qIEdldCB0aGUgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBlbGZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQorDAorLyogQ29uc3RhbnQgaW5mb3JtYXRpb24gaGVsZCBmb3IgYW4gRUxGIGJhY2tlbmQuICAqLworCitzdHJ1Y3QgZWxmX3NpemVfaW5mbyB7CisgIHVuc2lnbmVkIGNoYXIgc2l6ZW9mX2VoZHIsIHNpemVvZl9waGRyLCBzaXplb2Zfc2hkcjsKKyAgdW5zaWduZWQgY2hhciBzaXplb2ZfcmVsLCBzaXplb2ZfcmVsYSwgc2l6ZW9mX3N5bSwgc2l6ZW9mX2R5biwgc2l6ZW9mX25vdGU7CisKKyAgdW5zaWduZWQgY2hhciBhcmNoX3NpemUsIGZpbGVfYWxpZ247CisgIHVuc2lnbmVkIGNoYXIgZWxmY2xhc3MsIGV2X2N1cnJlbnQ7CisgIGludCAoKndyaXRlX291dF9waGRycykgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICosIGludCkpOworICBib29sZWFuICgqd3JpdGVfc2hkcnNfYW5kX2VoZHIpIFBBUkFNUyAoKGJmZCAqKSk7CisgIHZvaWQgKCp3cml0ZV9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKKyAgdm9pZCAoKnN3YXBfc3ltYm9sX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7CisgIGJvb2xlYW4gKCpzbHVycF9yZWxvY190YWJsZSkKKyAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOworICBsb25nICgqc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOworICB2b2lkICgqc3dhcF9keW5faW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOworfTsKKworI2RlZmluZSBlbGZfc3ltYm9sX2Zyb20oQUJGRCxTKSBcCisJKCgoUyktPnRoZV9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91ciBcCisJICAmJiAoUyktPnRoZV9iZmQtPnRkYXRhLmVsZl9vYmpfZGF0YSAhPSAwKSBcCisJID8gKGVsZl9zeW1ib2xfdHlwZSAqKSAoUykgXAorCSA6IDApCisKK3N0cnVjdCBlbGZfYmFja2VuZF9kYXRhCit7CisgIC8qIFdoZXRoZXIgdGhlIGJhY2tlbmQgdXNlcyBSRUwgb3IgUkVMQSByZWxvY2F0aW9ucy4gIEZJWE1FOiBzb21lCisgICAgIEVMRiBiYWNrZW5kcyB1c2UgYm90aC4gIFdoZW4gd2UgbmVlZCB0byBzdXBwb3J0IG9uZSwgdGhpcyB3aG9sZQorICAgICBhcHByb2FjaCB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZC4gICovCisgIGludCB1c2VfcmVsYV9wOworCisgIC8qIFRoZSBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgYmFja2VuZC4gICovCisgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworCisgIC8qIFRoZSBFTEYgbWFjaGluZSBjb2RlIChFTV94eHh4KSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KKyAgaW50IGVsZl9tYWNoaW5lX2NvZGU7CisKKyAgLyogVGhlIG1heGltdW0gcGFnZSBzaXplIGZvciB0aGlzIGJhY2tlbmQuICAqLworICBiZmRfdm1hIG1heHBhZ2VzaXplOworCisgIC8qIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgbGlua2VyIHNob3VsZCBhY3QgbGlrZSBjb2xsZWN0IGFuZCBnYXRoZXIKKyAgICAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZS4gIFRoaXMgaXMgdHJ1ZSBmb3IKKyAgICAgTUlQUyBFTEYgYmVjYXVzZSB0aGUgSXJpeCA1IHRvb2xzIGNhbiBub3QgaGFuZGxlIHRoZSAuaW5pdAorICAgICBzZWN0aW9uLiAgKi8KKyAgYm9vbGVhbiBjb2xsZWN0OworCisgIC8qIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgbGlua2VyIHNob3VsZCBpZ25vcmUgY2hhbmdlcyB0byB0aGUgdHlwZSBvZiBhCisgICAgIHN5bWJvbC4gIFRoaXMgaXMgdHJ1ZSBmb3IgTUlQUyBFTEYgYmVjYXVzZSBzb21lIElyaXggNSBvYmplY3RzCisgICAgIHJlY29yZCB1bmRlZmluZWQgZnVuY3Rpb25zIGFzIFNUVF9PQkpFQ1QgYWx0aG91Z2ggdGhlIGRlZmluaXRpb25zCisgICAgIGFyZSBTVFRfRlVOQy4gICovCisgIGJvb2xlYW4gdHlwZV9jaGFuZ2Vfb2s7CisKKyAgLyogQSBmdW5jdGlvbiB0byB0cmFuc2xhdGUgYW4gRUxGIFJFTEEgcmVsb2NhdGlvbiB0byBhIEJGRCBhcmVsZW50CisgICAgIHN0cnVjdHVyZS4gICovCisgIHZvaWQgKCplbGZfaW5mb190b19ob3d0bykgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKKwkJCQkgICAgIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKKworICAvKiBBIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBhbiBFTEYgUkVMIHJlbG9jYXRpb24gdG8gYSBCRkQgYXJlbGVudAorICAgICBzdHJ1Y3R1cmUuICAqLworICB2b2lkICgqZWxmX2luZm9fdG9faG93dG9fcmVsKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLAorCQkJCQkgRWxmX0ludGVybmFsX1JlbCAqKSk7CisKKyAgLyogQSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN5bWJvbCBpcyBnbG9iYWwgd2hlbgorICAgICBwYXJ0aXRpb25pbmcgdGhlIHN5bWJvbCB0YWJsZSBpbnRvIGxvY2FsIGFuZCBnbG9iYWwgc3ltYm9scy4KKyAgICAgVGhpcyBzaG91bGQgYmUgTlVMTCBmb3IgbW9zdCB0YXJnZXRzLCBpbiB3aGljaCBjYXNlIHRoZSBjb3JyZWN0CisgICAgIHRoaW5nIHdpbGwgYmUgZG9uZS4gIE1JUFMgRUxGLCBhdCBsZWFzdCBvbiB0aGUgSXJpeCA1LCBoYXMKKyAgICAgc3BlY2lhbCByZXF1aXJlbWVudHMuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOworCisgIC8qIFRoZSByZW1haW5pbmcgZnVuY3Rpb25zIGFyZSBob29rcyB3aGljaCBhcmUgY2FsbGVkIG9ubHkgaWYgdGhleQorICAgICBhcmUgbm90IE5VTEwuICAqLworCisgIC8qIEEgZnVuY3Rpb24gdG8gcGVybWl0IGEgYmFja2VuZCBzcGVjaWZpYyBjaGVjayBvbiB3aGV0aGVyIGEKKyAgICAgcGFydGljdWxhciBCRkQgZm9ybWF0IGlzIHJlbGV2YW50IGZvciBhbiBvYmplY3QgZmlsZSwgYW5kIHRvCisgICAgIHBlcm1pdCB0aGUgYmFja2VuZCB0byBzZXQgYW55IGdsb2JhbCBpbmZvcm1hdGlvbiBpdCB3aXNoZXMuICBXaGVuCisgICAgIHRoaXMgaXMgY2FsbGVkIGVsZl9lbGZoZWFkZXIgaXMgc2V0LCBidXQgYW55dGhpbmcgZWxzZSBzaG91bGQgYmUKKyAgICAgdXNlZCB3aXRoIGNhdXRpb24uICBJZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSBjaGVja19mb3JtYXQKKyAgICAgcm91dGluZSB3aWxsIHJldHVybiBhIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQgZXJyb3IuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqKSk7CisKKyAgLyogQSBmdW5jdGlvbiB0byBkbyBhZGRpdGlvbmFsIHN5bWJvbCBwcm9jZXNzaW5nIHdoZW4gcmVhZGluZyB0aGUKKyAgICAgRUxGIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgd2hlcmUgYW55IHByb2Nlc3Nvci1zcGVjaWZpYyBzcGVjaWFsCisgICAgIHNlY3Rpb24gaW5kaWNlcyBhcmUgaGFuZGxlZC4gICovCisgIHZvaWQgKCplbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZykgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOworCisgIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBzeW1ib2wgcHJvY2Vzc2luZyBhZnRlciByZWFkaW5nIHRoZQorICAgICBlbnRpcmUgRUxGIHN5bWJvbCB0YWJsZS4gICovCisgIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZykgUEFSQU1TICgoYmZkICosCisJCQkJCQkJICBlbGZfc3ltYm9sX3R5cGUgKiwKKwkJCQkJCQkgIHVuc2lnbmVkIGludCkpOworCisgICAvKiBBIGZ1bmN0aW9uIHRvIHNldCB0aGUgdHlwZSBvZiB0aGUgaW5mbyBmaWVsZC4gIFByb2Nlc3Nvci1zcGVjaWZpYworICAgICB0eXBlcyBzaG91bGQgYmUgaGFuZGxlZCBoZXJlLiAqLworICBpbnQgKCplbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUpIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOyAKKyAKKyAgLyogQSBmdW5jdGlvbiB0byBkbyBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgb24gdGhlIEVMRiBzZWN0aW9uIGhlYWRlcgorICAgICBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGZsYWdzIGFuZAorICAgICB0eXBlIGZpZWxkcyBmb3Igc29tZSBzZWN0aW9ucywgb3IgdG8gYWN0dWFsbHkgd3JpdGUgb3V0IGRhdGEgZm9yCisgICAgIHVudXN1YWwgc2VjdGlvbnMuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKSBQQVJBTVMgKChiZmQgKiwKKwkJCQkJCSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqKSk7CisKKyAgLyogQSBmdW5jdGlvbiB0byBoYW5kbGUgdW51c3VhbCBzZWN0aW9uIHR5cGVzIHdoZW4gY3JlYXRpbmcgQkZECisgICAgIHNlY3Rpb25zIGZyb20gRUxGIHNlY3Rpb25zLiAgKi8KKyAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKSBQQVJBTVMgKChiZmQgKiwKKwkJCQkJCSAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICosCisJCQkJCQkgICAgY2hhciAqKSk7CisKKyAgLyogQSBmdW5jdGlvbiB0byBzZXQgdXAgdGhlIEVMRiBzZWN0aW9uIGhlYWRlciBmb3IgYSBCRkQgc2VjdGlvbiBpbgorICAgICBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZyBpdCBvdXQuICBUaGlzIGlzIHdoZXJlIHRoZSBmbGFncyBhbmQgdHlwZQorICAgICBmaWVsZHMgYXJlIHNldCBmb3IgdW51c3VhbCBzZWN0aW9ucy4gICovCisgIGJvb2xlYW4gKCplbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAorCQkJCQkJYXNlY3Rpb24gKikpOworCisgIC8qIEEgZnVuY3Rpb24gdG8gZ2V0IHRoZSBFTEYgc2VjdGlvbiBpbmRleCBmb3IgYSBCRkQgc2VjdGlvbi4gIElmCisgICAgIHRoaXMgcmV0dXJucyB0cnVlLCB0aGUgc2VjdGlvbiB3YXMgZm91bmQuICBJZiBpdCBpcyBhIG5vcm1hbCBFTEYKKyAgICAgc2VjdGlvbiwgKlJFVFZBTCBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuICBJZiBpdCBpcyBub3QgYSBub3JtYWwKKyAgICAgRUxGIHNlY3Rpb24gKlJFVFZBTCBzaG91bGQgYmUgc2V0IHRvIHRoZSBTSE5feHh4eCBpbmRleC4gICovCisgIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCisgICAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICpyZXR2YWwpKTsKKworICAvKiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCBpdCBpcyBjYWxsZWQgYnkgdGhlIGFkZF9zeW1ib2xzIHBoYXNlCisgICAgIG9mIGEgbGluayBqdXN0IGJlZm9yZSBhZGRpbmcgYSBzeW1ib2wgdG8gdGhlIGdsb2JhbCBsaW5rZXIgaGFzaAorICAgICB0YWJsZS4gIEl0IG1heSBtb2RpZnkgYW55IG9mIHRoZSBmaWVsZHMgYXMgaXQgd2lzaGVzLiAgSWYgKk5BTUUKKyAgICAgaXMgc2V0IHRvIE5VTEwsIHRoZSBzeW1ib2wgd2lsbCBiZSBza2lwcGVkIHJhdGhlciB0aGFuIGJlaW5nCisgICAgIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgaGFuZGxpbmcgYWxsIHByb2Nlc3NvciBkZXBlbmRlbnQgc3ltYm9sIGJpbmRpbmdzIGFuZCBzZWN0aW9uCisgICAgIGluZGljZXMsIGFuZCBtdXN0IHNldCBhdCBsZWFzdCAqRkxBR1MgYW5kICpTRUMgZm9yIGVhY2ggcHJvY2Vzc29yCisgICAgIGRlcGVuZGVudCBjYXNlOyBmYWlsdXJlIHRvIGRvIHNvIHdpbGwgY2F1c2UgYSBsaW5rIGVycm9yLiAgKi8KKyAgYm9vbGVhbiAoKmVsZl9hZGRfc3ltYm9sX2hvb2spCisgICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKwkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgY29uc3QgY2hhciAqKm5hbWUsCisJICAgICBmbGFnd29yZCAqZmxhZ3MsIGFzZWN0aW9uICoqc2VjLCBiZmRfdm1hICp2YWx1ZSkpOworCisgIC8qIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIGl0IGlzIGNhbGxlZCBieSB0aGUgZWxmX2xpbmtfb3V0cHV0X3N5bQorICAgICBwaGFzZSBvZiBhIGxpbmsgZm9yIGVhY2ggc3ltYm9sIHdoaWNoIHdpbGwgYXBwZWFyIGluIHRoZSBvYmplY3QgZmlsZS4gICovCisgIGJvb2xlYW4gKCplbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vaykKKyAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKiwKKwkgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOworCisgIC8qIFRoZSBDUkVBVEVfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCisgICAgIGxpbmtlciB0aGUgZmlyc3QgdGltZSBpdCBlbmNvdW50ZXJzIGEgZHluYW1pYyBvYmplY3QgaW4gdGhlIGxpbmsuCisgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBjcmVhdGUgYW55IHNlY3Rpb25zIHJlcXVpcmVkIGZvciBkeW5hbWljCisgICAgIGxpbmtpbmcuICBUaGUgQUJGRCBhcmd1bWVudCBpcyBhIGR5bmFtaWMgb2JqZWN0LiAgVGhlIC5pbnRlcnAsCisgICAgIC5keW5hbWljLCAuZHluc3ltLCAuZHluc3RyLCBhbmQgLmhhc2ggZnVuY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgIGNyZWF0ZWQsIGFuZCB0aGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIHNlY3Rpb24gZmxhZ3MgaWYKKyAgICAgZGVzaXJlZC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBub3JtYWxseSBjcmVhdGUgdGhlIC5nb3QgYW5kIC5wbHQKKyAgICAgc2VjdGlvbnMsIGJ1dCBkaWZmZXJlbnQgYmFja2VuZHMgaGF2ZSBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzLiAgKi8KKyAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKQorICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKKworICAvKiBUaGUgQ0hFQ0tfUkVMT0NTIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYWRkX3N5bWJvbHMgcGhhc2Ugb2YKKyAgICAgdGhlIEVMRiBiYWNrZW5kIGxpbmtlci4gIEl0IGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHNlY3Rpb24gd2l0aAorICAgICByZWxvY3Mgb2YgYW4gb2JqZWN0IGZpbGUsIGp1c3QgYWZ0ZXIgdGhlIHN5bWJvbHMgZm9yIHRoZSBvYmplY3QKKyAgICAgZmlsZSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZQorICAgICBmdW5jdGlvbiBtdXN0IGxvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGFuZCBkbyBhbnkgc3BlY2lhbCBoYW5kbGluZworICAgICByZXF1aXJlZC4gIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIGFsbG9jYXRpbmcgc3BhY2UgaW4gdGhlIGdsb2JhbAorICAgICBvZmZzZXQgdGFibGUsIGFuZCBwZXJoYXBzIGFsbG9jYXRpbmcgc3BhY2UgZm9yIGEgcmVsb2MuICBUaGUKKyAgICAgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KKyAgICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCisgICAgIHplcm8uICAqLworICBib29sZWFuICgqY2hlY2tfcmVsb2NzKQorICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAorCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOworCisgIC8qIFRoZSBBREpVU1RfRFlOQU1JQ19TWU1CT0wgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAorICAgICBsaW5rZXIgZm9yIGV2ZXJ5IHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kCisgICAgIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUKKyAgICAgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4sIGJ1dCBiZWZvcmUgdGhlIFNJWkVfRFlOQU1JQ19TRUNUSU9OUworICAgICBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQuICBUaGUgaGFzaCB0YWJsZSBlbnRyeSBzaG91bGQgYmUKKyAgICAgYmZkX2xpbmtfaGFzaF9kZWZpbmVkIG9yZSBiZmRfbGlua19oYXNoX2RlZndlYWssIGFuZCBpdCBzaG91bGQgYmUKKyAgICAgZGVmaW5lZCBpbiBhIHNlY3Rpb24gZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgRHluYW1pYyBvYmplY3QKKyAgICAgc2VjdGlvbnMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZmluYWwgbGluaywgYW5kIHRoaXMgZnVuY3Rpb24gaXMKKyAgICAgcmVzcG9uc2libGUgZm9yIGNoYW5naW5nIHRoZSB2YWx1ZSB0byBzb21ldGhpbmcgd2hpY2ggdGhlIHJlc3Qgb2YKKyAgICAgdGhlIGxpbmsgY2FuIGRlYWwgd2l0aC4gIFRoaXMgd2lsbCBub3JtYWxseSBpbnZvbHZlIGFkZGluZyBhbgorICAgICBlbnRyeSB0byB0aGUgLnBsdCBvciAuZ290IG9yIHNvbWUgc3VjaCBzZWN0aW9uLCBhbmQgc2V0dGluZyB0aGUKKyAgICAgc3ltYm9sIHRvIHBvaW50IHRvIHRoYXQuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKQorICAgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCkpOworCisgIC8qIFRoZSBBTFdBWVNfU0laRV9TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyCisgICAgIGFmdGVyIGFsbCB0aGUgbGlua2VyIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuIGJ1dCBiZWZvcmUgdGhlCisgICAgIHNlY3Rpb24gc2l6ZXMgaGF2ZSBiZWVuIHNldC4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyCisgICAgIEFESlVTVF9EWU5BTUlDX1NZTUJPTCwgYnV0IGJlZm9yZSBTSVpFX0RZTkFNSUNfU0VDVElPTlMuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMpCisgICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOworCisgIC8qIFRoZSBTSVpFX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAorICAgICBsaW5rZXIgYWZ0ZXIgYWxsIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4gYnV0IGJlZm9yZQorICAgICB0aGUgc2VjdGlvbnMgc2l6ZXMgaGF2ZSBiZWVuIHNldC4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyCisgICAgIEFESlVTVF9EWU5BTUlDX1NZTUJPTCBoYXMgYmVlbiBjYWxsZWQgb24gYWxsIGFwcHJvcHJpYXRlIHN5bWJvbHMuCisgICAgIEl0IGlzIG9ubHkgY2FsbGVkIHdoZW4gbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QuICBJdCBtdXN0CisgICAgIHNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIGFuZCBtYXkgZmlsbCBpbiB0aGVpcgorICAgICBjb250ZW50cyBhcyB3ZWxsLiAgVGhlIGdlbmVyaWMgRUxGIGxpbmtlciBjYW4gaGFuZGxlIHRoZSAuZHluc3ltLAorICAgICAuZHluc3RyIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUgdGhlCisgICAgIC5pbnRlcnAgc2VjdGlvbiBhbmQgYW55IHNlY3Rpb25zIGNyZWF0ZWQgYnkgdGhlCisgICAgIENSRUFURV9EWU5BTUlDX1NFQ1RJT05TIGVudHJ5IHBvaW50LiAgKi8KKyAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucykKKyAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7CisKKyAgLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKKyAgICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgorCisgICAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgorICAgICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKKyAgICAgemVyby4KKworICAgICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKKyAgICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKKyAgICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcworICAgICBuZWNlc3NhcnkuCisKKyAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCisgICAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KKworICAgICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgorCisgICAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQorICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KKworICAgICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKKyAgICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgorCisgICAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCisgICAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCisgICAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKKyAgICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKKyAgICAgYWNjb3JkaW5nbHkuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikKKyAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorCSAgICAgYmZkICppbnB1dF9iZmQsIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBiZmRfYnl0ZSAqY29udGVudHMsCisJICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLCBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLAorCSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9ucykpOworCisgIC8qIFRoZSBGSU5JU0hfRFlOQU1JQ19TWU1CT0wgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAorICAgICBsaW5rZXIganVzdCBiZWZvcmUgaXQgd3JpdGVzIGEgc3ltYm9sIG91dCB0byB0aGUgLmR5bnN5bSBzZWN0aW9uLgorICAgICBUaGUgcHJvY2Vzc29yIGJhY2tlbmQgbWF5IG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnQgdG8gdGhlCisgICAgIHN5bWJvbC4gIEl0IG1heSBhbHNvIHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIHNldCBjb250ZW50cyBvZiB0aGUKKyAgICAgZHluYW1pYyBzZWN0aW9ucy4gIE5vdGUgdGhhdCBGSU5JU0hfRFlOQU1JQ19TWU1CT0wgaXMgY2FsbGVkIG9uCisgICAgIGFsbCAuZHluc3ltIHN5bWJvbHMsIHdoaWxlIEFESlVTVF9EWU5BTUlDX1NZTUJPTCBpcyBvbmx5IGNhbGxlZAorICAgICBvbiB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sKQorICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisJICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqc3ltKSk7CisKKyAgLyogVGhlIEZJTklTSF9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKKyAgICAgbGlua2VyIGp1c3QgYmVmb3JlIGl0IHdyaXRlcyBhbGwgdGhlIGR5bmFtaWMgc2VjdGlvbnMgb3V0IHRvIHRoZQorICAgICBvdXRwdXQgZmlsZS4gIFRoZSBGSU5JU0hfRFlOQU1JQ19TWU1CT0wgd2lsbCBoYXZlIGJlZW4gY2FsbGVkIG9uCisgICAgIGFsbCBkeW5hbWljIHN5bWJvbHMuICAqLworICBib29sZWFuICgqZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpCisgICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOworCisgIC8qIEEgZnVuY3Rpb24gdG8gZG8gYW55IGJlZ2lubmluZyBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhlIEVMRiBmaWxlCisgICAgIGJlZm9yZSBidWlsZGluZyB0aGUgRUxGIGhlYWRlcnMgYW5kIGNvbXB1dGluZyBmaWxlIHBvc2l0aW9ucy4gICovCisgIHZvaWQgKCplbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKQorICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKyAgLyogQSBmdW5jdGlvbiB0byBkbyBhbnkgZmluYWwgcHJvY2Vzc2luZyBuZWVkZWQgZm9yIHRoZSBFTEYgZmlsZQorICAgICBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBUaGUgTElOS0VSIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBCRkQKKyAgICAgd2FzIGNyZWF0ZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlci4gICovCisgIHZvaWQgKCplbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKQorICAgIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuIGxpbmtlcikpOworCisgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGdldF9wcm9ncmFtX2hlYWRlcl9zaXplLiAgSXQgc2hvdWxkCisgICAgIHJldHVybiB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcHJvZ3JhbSBzZWdtZW50cyB3aGljaCB0aGlzIEJGRAorICAgICB3aWxsIG5lZWQuICBJdCBzaG91bGQgcmV0dXJuIC0xIG9uIGVycm9yLiAgKi8KKyAgaW50ICgqZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqKSk7CisKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbW9kaWZ5IGFuIGV4aXN0aW5nIHNlZ21lbnQgbWFwIGluIGEKKyAgICAgYmFja2VuZCBzcGVjaWZpYyBmYXNoaW9uLiAgKi8KKyAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCkgUEFSQU1TICgoYmZkICopKTsKKworICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc2VjdGlvbiBnYyB0byBkaXNjb3ZlciB0aGUgc2VjdGlvbiBhCisgICAgIHBhcnRpY3VsYXIgcmVsb2NhdGlvbiByZWZlcnMgdG8uICBJdCBuZWVkIG5vdCBiZSBkZWZpbmVkIGZvciBob3N0cworICAgICB0aGF0IGhhdmUgbm8gcXVlZXIgcmVsb2NhdGlvbiB0eXBlcy4gICovCisgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCisgICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAorCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIEVsZl9JbnRlcm5hbF9TeW0gKikpOworCisgIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHN3ZWVwIHBoYXNlIG9mIGdjCisgICAgIGluIG9yZGVyIHRoYXQgYSBiYWNrZW5kIG1pZ2h0IHVwZGF0ZSBhbnkgZGF0YSBzdHJ1Y3R1cmVzIGl0IG1pZ2h0CisgICAgIGJlIG1haW50YWluaW5nLiAgKi8KKyAgYm9vbGVhbiAoKmdjX3N3ZWVwX2hvb2spCisgICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCisJICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7CisKKyAgLyogVGhlIHN3YXBwaW5nIHRhYmxlIHRvIHVzZSB3aGVuIGRlYWxpbmcgd2l0aCBFQ09GRiBpbmZvcm1hdGlvbi4KKyAgICAgVXNlZCBmb3IgdGhlIE1JUFMgRUxGIC5tZGVidWcgc2VjdGlvbi4gICovCisgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICplbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOworCisgIC8qIEFsdGVybmF0ZSBFTV94eHh4IG1hY2hpbmUgY29kZXMgZm9yIHRoaXMgYmFja2VuZC4gICovCisgIGludCBlbGZfbWFjaGluZV9hbHQxOworICBpbnQgZWxmX21hY2hpbmVfYWx0MjsKKworICBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyAqczsKKworICAvKiBvZmZzZXQgb2YgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisgICAgIC5nb3Qgc2VjdGlvbiAqLworICBiZmRfdm1hIGdvdF9zeW1ib2xfb2Zmc2V0OworCisgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBoZWFkZXJzIGZvciB0aGUgR09UIGFuZCBQTFQuICBUaGlzIGluY2x1ZGVzCisgICAgIHRoZSBzby1jYWxsZWQgcmVzZXJ2ZWQgZW50cmllcyBvbiBzb21lIHN5c3RlbXMuICAqLworICBiZmRfdm1hIGdvdF9oZWFkZXJfc2l6ZTsKKyAgYmZkX3ZtYSBwbHRfaGVhZGVyX3NpemU7CisKKyAgdW5zaWduZWQgd2FudF9nb3RfcGx0IDogMTsKKyAgdW5zaWduZWQgcGx0X3JlYWRvbmx5IDogMTsKKyAgdW5zaWduZWQgd2FudF9wbHRfc3ltIDogMTsKKyAgdW5zaWduZWQgcGx0X25vdF9sb2FkZWQgOiAxOworICB1bnNpZ25lZCBwbHRfYWxpZ25tZW50IDogNDsKKyAgdW5zaWduZWQgY2FuX2djX3NlY3Rpb25zIDogMTsKK307CisKKy8qIEluZm9ybWF0aW9uIHN0b3JlZCBmb3IgZWFjaCBCRkQgc2VjdGlvbiBpbiBhbiBFTEYgZmlsZS4gIFRoaXMKKyAgIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgZWxmX25ld19zZWN0aW9uX2hvb2suICAqLworCitzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEKK3sKKyAgLyogVGhlIEVMRiBoZWFkZXIgZm9yIHRoaXMgc2VjdGlvbi4gICovCisgIEVsZl9JbnRlcm5hbF9TaGRyIHRoaXNfaGRyOworICAvKiBUaGUgRUxGIGhlYWRlciBmb3IgdGhlIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgc2VjdGlvbiwgaWYgYW55LiAgKi8KKyAgRWxmX0ludGVybmFsX1NoZHIgcmVsX2hkcjsKKyAgLyogSWYgdGhlcmUgaXMgYSBzZWNvbmQgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZWN0aW9uLAorICAgICBhcyBjYW4gaGFwcGVuIG9uIElyaXggNiwgdGhpcyBmaWVsZCBwb2ludHMgdG8gdGhlIGhlYWRlci4gICovCisgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKKyAgLyogVGhlIEVMRiBzZWN0aW9uIG51bWJlciBvZiB0aGlzIHNlY3Rpb24uICBPbmx5IHVzZWQgZm9yIGFuIG91dHB1dAorICAgICBmaWxlLiAgKi8KKyAgaW50IHRoaXNfaWR4OworICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoZSByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgIHNlY3Rpb24sIGlmIGFueS4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0IGZpbGUuICAqLworICBpbnQgcmVsX2lkeDsKKyAgLyogVXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIgdG8gc3RvcmUgdGhlIHN5bWJvbCBoYXNoIHRhYmxlIGVudHJpZXMKKyAgICAgYXNzb2NpYXRlZCB3aXRoIHJlbG9jcyBhZ2FpbnN0IGdsb2JhbCBzeW1ib2xzLiAgKi8KKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOworICAvKiBBIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgcmVsb2NzLiAgSWYgdGhlIHNlY3Rpb24gdXNlcyBSRUwgcmVsb2NzLAorICAgICByYXRoZXIgdGhhbiBSRUxBLCBhbGwgdGhlIHJfYWRkZW5kIGZpZWxkcyB3aWxsIGJlIHplcm8uICBUaGlzCisgICAgIHBvaW50ZXIgbWF5IGJlIE5VTEwuICBJdCBpcyB1c2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlci4gICovCisgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7CisgIC8qIFVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IHRvCisgICAgIHJlY29yZCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggZm9yIGEgc2VjdGlvbiBzeW1ib2wKKyAgICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHNlY3Rpb24uICAqLworICBsb25nIGR5bmluZHg7CisgIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLworICBQVFIgc3RhYl9pbmZvOworICAvKiBBIHBvaW50ZXIgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIEVMRiBiYWNrZW5kLiAgKi8KKyAgUFRSIHRkYXRhOworfTsKKworI2RlZmluZSBlbGZfc2VjdGlvbl9kYXRhKHNlYykgICgoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKilzZWMtPnVzZWRfYnlfYmZkKQorCisjZGVmaW5lIGdldF9lbGZfYmFja2VuZF9kYXRhKGFiZmQpIFwKKyAgKChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKKworLyogRW51bWVyYXRpb24gdG8gc3BlY2lmeSB0aGUgc3BlY2lhbCBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bQoreworICBMSU5LRVJfU0VDVElPTl9VTktOT1dOLAkJLyogbm90IHVzZWQgKi8KKyAgTElOS0VSX1NFQ1RJT05fR09ULAkJCS8qIC5nb3Qgc2VjdGlvbiBmb3IgZ2xvYmFsIG9mZnNldCBwb2ludGVycyAqLworICBMSU5LRVJfU0VDVElPTl9QTFQsCQkJLyogLnBsdCBzZWN0aW9uIGZvciBnZW5lcmF0ZWQgcHJvY2VkdXJlIHN0dWJzICovCisgIExJTktFUl9TRUNUSU9OX1NEQVRBLAkJCS8qIC5zZGF0YS8uc2JzcyBzZWN0aW9uIGZvciBQb3dlclBDICovCisgIExJTktFUl9TRUNUSU9OX1NEQVRBMiwJCS8qIC5zZGF0YTIvLnNic3MyIHNlY3Rpb24gZm9yIFBvd2VyUEMgKi8KKyAgTElOS0VSX1NFQ1RJT05fTUFYCQkJLyogIyBvZiBsaW5rZXIgc2VjdGlvbnMgKi8KK30gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdDsKKworLyogU2VjdGlvbnMgY3JlYXRlZCBieSB0aGUgbGlua2VyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uCit7CisgIGNoYXIgKm5hbWU7CQkJCS8qIG5hbWUgb2YgdGhlIHNlY3Rpb24gKi8KKyAgY2hhciAqcmVsX25hbWU7CQkJLyogbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCAucmVseyxhfS4gc2VjdGlvbiAqLworICBjaGFyICpic3NfbmFtZTsJCQkvKiBuYW1lIG9mIGEgcmVsYXRlZCAuYnNzIHNlY3Rpb24gKi8KKyAgY2hhciAqc3ltX25hbWU7CQkJLyogbmFtZSBvZiBzeW1ib2wgdG8gcmVmZXJlbmNlIHRoaXMgc2VjdGlvbiAqLworICBhc2VjdGlvbiAqc2VjdGlvbjsJCQkvKiBwb2ludGVyIHRvIHRoZSBzZWN0aW9uICovCisgIGFzZWN0aW9uICpic3Nfc2VjdGlvbjsJCS8qIHBvaW50ZXIgdG8gdGhlIGJzcyBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzICovCisgIGFzZWN0aW9uICpyZWxfc2VjdGlvbjsJCS8qIHBvaW50ZXIgdG8gdGhlIHJlbG9jYXRpb25zIG5lZWRlZCBmb3IgdGhpcyBzZWN0aW9uICovCisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsJLyogcG9pbnRlciB0byB0aGUgY3JlYXRlZCBzeW1ib2wgaGFzaCB2YWx1ZSAqLworICBiZmRfdm1hIGluaXRpYWxfc2l6ZTsJCQkvKiBpbml0aWFsIHNpemUgYmVmb3JlIGFueSBsaW5rZXIgZ2VuZXJhdGVkIGFsbG9jYXRpb25zICovCisgIGJmZF92bWEgc3ltX29mZnNldDsJCQkvKiBvZmZzZXQgb2Ygc3ltYm9sIGZyb20gYmVnaW5uaW5nIG9mIHNlY3Rpb24gKi8KKyAgYmZkX3ZtYSBob2xlX3NpemU7CQkJLyogc2l6ZSBvZiByZXNlcnZlZCBhZGRyZXNzIGhvbGUgaW4gYWxsb2NhdGlvbiAqLworICBiZmRfdm1hIGhvbGVfb2Zmc2V0OwkJCS8qIGN1cnJlbnQgb2Zmc2V0IGZvciB0aGUgaG9sZSAqLworICBiZmRfdm1hIG1heF9ob2xlX29mZnNldDsJCS8qIG1heGltdW0gb2Zmc2V0IGZvciB0aGUgaG9sZSAqLworICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoOwkvKiB3aGljaCBzZWN0aW9uIHRoaXMgaXMgKi8KKyAgYm9vbGVhbiBob2xlX3dyaXR0ZW5fcDsJCS8qIHdoZXRoZXIgdGhlIGhvbGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKyAgdW5zaWduZWQgaW50IGFsaWdubWVudDsJCS8qIGFsaWdubWVudCBmb3IgdGhlIHNlY3Rpb24gKi8KKyAgZmxhZ3dvcmQgZmxhZ3M7CQkJLyogZmxhZ3MgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLworfSBlbGZfbGlua2VyX3NlY3Rpb25fdDsKKworLyogTGlua2VkIGxpc3Qgb2YgYWxsb2NhdGVkIHBvaW50ZXIgZW50cmllcy4gIFRoaXMgaGFuZ3Mgb2ZmIG9mIHRoZSBzeW1ib2wgbGlzdHMsIGFuZAorICAgcHJvdmlkZXMgYWxsb3dzIHVzIHRvIHJldHVybiBkaWZmZXJlbnQgcG9pbnRlcnMsIGJhc2VkIG9uIGRpZmZlcmVudCBhZGRlbmQncy4gICovCisKK3R5cGVkZWYgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVycworeworICBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzICpuZXh0OwkvKiBuZXh0IGFsbG9jYXRlZCBwb2ludGVyIGZvciB0aGlzIHN5bWJvbCAqLworICBiZmRfdm1hIG9mZnNldDsJCQkJLyogb2Zmc2V0IG9mIHBvaW50ZXIgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLworICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7CQkJLyogYWRkZW5kIHVzZWQgKi8KKyAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaDsJCS8qIHdoaWNoIGxpbmtlciBzZWN0aW9uIHRoaXMgaXMgKi8KKyAgYm9vbGVhbiB3cml0dGVuX2FkZHJlc3NfcDsJCQkvKiB3aGV0aGVyIGFkZHJlc3Mgd2FzIHdyaXR0ZW4geWV0ICovCit9IGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190OworCisvKiBTb21lIHByaXZhdGUgZGF0YSBpcyBzdGFzaGVkIGF3YXkgZm9yIGZ1dHVyZSB1c2UgdXNpbmcgdGhlIHRkYXRhIHBvaW50ZXIKKyAgIGluIHRoZSBiZmQgc3RydWN0dXJlLiAgKi8KKworc3RydWN0IGVsZl9vYmpfdGRhdGEKK3sKKyAgRWxmX0ludGVybmFsX0VoZHIgZWxmX2hlYWRlclsxXTsJLyogQWN0dWFsIGRhdGEsIGJ1dCByZWYgbGlrZSBwdHIgKi8KKyAgRWxmX0ludGVybmFsX1NoZHIgKiplbGZfc2VjdF9wdHI7CisgIEVsZl9JbnRlcm5hbF9QaGRyICpwaGRyOworICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICpzZWdtZW50X21hcDsKKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiX3B0cjsKKyAgaW50IG51bV9sb2NhbHM7CisgIGludCBudW1fZ2xvYmFsczsKKyAgYXN5bWJvbCAqKnNlY3Rpb25fc3ltczsJCS8qIFNUVF9TRUNUSU9OIHN5bWJvbHMgZm9yIGVhY2ggc2VjdGlvbiAqLworICBFbGZfSW50ZXJuYWxfU2hkciBzeW10YWJfaGRyOworICBFbGZfSW50ZXJuYWxfU2hkciBzaHN0cnRhYl9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyIHN0cnRhYl9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyIGR5bnN5bXRhYl9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyIGR5bnN0cnRhYl9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyIGR5bnZlcnN5bV9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyIGR5bnZlcnJlZl9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyIGR5bnZlcmRlZl9oZHI7CisgIHVuc2lnbmVkIGludCBzeW10YWJfc2VjdGlvbiwgc2hzdHJ0YWJfc2VjdGlvbjsKKyAgdW5zaWduZWQgaW50IHN0cnRhYl9zZWN0aW9uLCBkeW5zeW10YWJfc2VjdGlvbjsKKyAgdW5zaWduZWQgaW50IGR5bnZlcnN5bV9zZWN0aW9uLCBkeW52ZXJkZWZfc2VjdGlvbiwgZHludmVycmVmX3NlY3Rpb247CisgIGZpbGVfcHRyIG5leHRfZmlsZV9wb3M7CisjaWYgMAorICAvKiB3ZSBkb24ndCBuZWVkIHRoZXNlIGluc2lkZSBiZmQgYW55bW9yZSwgYW5kIEkgdGhpbmsKKyAgICAgdGhlc2Ugd2VyZW4ndCB1c2VkIG91dHNpZGUgYmZkLiAqLworICB2b2lkICpwcnN0YXR1czsJCQkvKiBUaGUgcmF3IC9wcm9jIHByc3RhdHVzIHN0cnVjdHVyZSAqLworICB2b2lkICpwcnBzaW5mbzsJCQkvKiBUaGUgcmF3IC9wcm9jIHBycHNpbmZvIHN0cnVjdHVyZSAqLworI2VuZGlmCisgIGJmZF92bWEgZ3A7CQkJCS8qIFRoZSBncCB2YWx1ZSAoTUlQUyBvbmx5LCBmb3Igbm93KSAqLworICB1bnNpZ25lZCBpbnQgZ3Bfc2l6ZTsJCQkvKiBUaGUgZ3Agc2l6ZSAoTUlQUyBvbmx5LCBmb3Igbm93KSAqLworCisgIC8qIEluZm9ybWF0aW9uIGdyYWJiZWQgZnJvbSBhbiBlbGYgY29yZSBmaWxlLiAqLworICBpbnQgY29yZV9zaWduYWw7CisgIGludCBjb3JlX3BpZDsKKyAgaW50IGNvcmVfbHdwaWQ7CisgIGNoYXIqIGNvcmVfcHJvZ3JhbTsKKyAgY2hhciogY29yZV9jb21tYW5kOworCisgIC8qIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCBieSB0aGUgYmFja2VuZAorICAgICBsaW5rZXIuICAqLworICBib29sZWFuIGxpbmtlcjsKKworICAvKiBBIG1hcHBpbmcgZnJvbSBleHRlcm5hbCBzeW1ib2xzIHRvIGVudHJpZXMgaW4gdGhlIGxpbmtlciBoYXNoCisgICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sIGluZGV4CisgICAgIG1pbnVzIHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW1ib2wgdGFibGUgaGVhZGVyLiAgKi8KKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworCisgIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0CisgICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sIGluZGV4LgorICAgICBMaWtlIGZvciB0aGUgZ2xvYmFscywgd2UgdXNlIGEgdW5pb24gYW5kIHR3byBuYW1lcyBwcmltYXJpbHkgdG8KKyAgICAgZG9jdW1lbnQgdGhlIGludGVudCBvZiBhbnkgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlLiAgVGhlIGZpZWxkCisgICAgIHNob3VsZCBiZSB1c2VkIGFzIGEgY291bnQgdW50aWwgc2l6ZV9keW5hbWljX3NlY3Rpb25zLCBhdCB3aGljaAorICAgICBwb2ludCB0aGUgY29udGVudHMgb2YgdGhlIC5nb3QgaXMgZml4ZWQuICBBZnRlcndhcmQsIGlmIGFuIGVudHJ5CisgICAgIGlzIC0xLCB0aGVuIHRoZSBzeW1ib2wgZG9lcyBub3QgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICovCisgIHVuaW9uCisgICAgeworICAgICAgYmZkX3NpZ25lZF92bWEgKnJlZmNvdW50czsKKyAgICAgIGJmZF92bWEgKm9mZnNldHM7CisgICAgfSBsb2NhbF9nb3Q7CisKKyAgLyogQSBtYXBwaW5nIGZyb20gbG9jYWwgc3ltYm9scyB0byBvZmZzZXRzIGludG8gdGhlIHZhcmlvdXMgbGlua2VyCisgICAgIHNlY3Rpb25zIGFkZGVkLiAgVGhpcyBpcyBpbmRleCBieSB0aGUgc3ltYm9sIGluZGV4LiAgKi8KKyAgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKipsaW5rZXJfc2VjdGlvbl9wb2ludGVyczsKKworICAvKiBUaGUgbGlua2VyIEVMRiBlbXVsYXRpb24gY29kZSBuZWVkcyB0byBsZXQgdGhlIGJhY2tlbmQgRUxGIGxpbmtlcgorICAgICBrbm93IHdoYXQgZmlsZW5hbWUgc2hvdWxkIGJlIHVzZWQgZm9yIGEgZHluYW1pYyBvYmplY3QgaWYgdGhlCisgICAgIGR5bmFtaWMgb2JqZWN0IGlzIGZvdW5kIHVzaW5nIGEgc2VhcmNoLiAgVGhlIGVtdWxhdGlvbiBjb2RlIHRoZW4KKyAgICAgc29tZXRpbWVzIG5lZWRzIHRvIGtub3cgd2hhdCBuYW1lIHdhcyBhY3R1YWxseSB1c2VkLiAgVW50aWwgdGhlCisgICAgIGZpbGUgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGxpbmtlciBzeW1ib2wgdGFibGUsIHRoaXMgZmllbGQgaG9sZHMKKyAgICAgdGhlIG5hbWUgdGhlIGxpbmtlciB3YW50cy4gIEFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkLCBpdCBob2xkcyB0aGUKKyAgICAgbmFtZSBhY3R1YWxseSB1c2VkLCB3aGljaCB3aWxsIGJlIHRoZSBEVF9TT05BTUUgZW50cnkgaWYgdGhlcmUgaXMKKyAgICAgb25lLiAgKi8KKyAgY29uc3QgY2hhciAqZHRfbmFtZTsKKworICAvKiBJcml4IDUgb2Z0ZW4gc2NyZXdzIHVwIHRoZSBzeW1ib2wgdGFibGUsIHNvcnRpbmcgbG9jYWwgc3ltYm9scworICAgICBhZnRlciBnbG9iYWwgc3ltYm9scy4gIFRoaXMgZmxhZyBpcyBzZXQgaWYgdGhlIHN5bWJvbCB0YWJsZSBpbgorICAgICB0aGlzIEJGRCBhcHBlYXJzIHRvIGJlIHNjcmV3ZWQgdXAuICBJZiBpdCBpcywgd2UgaWdub3JlIHRoZQorICAgICBzaF9pbmZvIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgaGVhZGVyLCBhbmQgYWx3YXlzIHJlYWQgYWxsIHRoZQorICAgICBzeW1ib2xzLiAgKi8KKyAgYm9vbGVhbiBiYWRfc3ltdGFiOworCisgIC8qIFJlY29yZHMgdGhlIHJlc3VsdCBvZiBgZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUnLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBwcm9ncmFtX2hlYWRlcl9zaXplOworCisgIC8qIFVzZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICAqLworICBQVFIgbGluZV9pbmZvOworCisgIC8qIFVzZWQgYnkgTUlQUyBFTEYgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICBUaGUgc3RydWN0dXJlCisgICAgIGNvdWxkIGJlIGluY2x1ZGVkIGRpcmVjdGx5IGluIHRoaXMgb25lLCBidXQgdGhlcmUncyBubyBwb2ludCB0bworICAgICB3YXN0aW5nIHRoZSBtZW1vcnkganVzdCBmb3IgdGhlIGluZnJlcXVlbnRseSBjYWxsZWQKKyAgICAgZmluZF9uZWFyZXN0X2xpbmUuICAqLworICBzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICpmaW5kX2xpbmVfaW5mbzsKKworICAvKiBBIHBsYWNlIHRvIHN0YXNoIGR3YXJmMSBpbmZvIGZvciB0aGlzIGJmZC4gKi8KKyAgc3RydWN0IGR3YXJmMV9kZWJ1ZyAqZHdhcmYxX2ZpbmRfbGluZV9pbmZvOworCisgIC8qIEEgcGxhY2UgdG8gc3Rhc2ggZHdhcmYyIGluZm8gZm9yIHRoaXMgYmZkLiAqLworICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpkd2FyZjJfZmluZF9saW5lX2luZm87CisKKyAgLyogQW4gYXJyYXkgb2Ygc3R1YiBzZWN0aW9ucyBpbmRleGVkIGJ5IHN5bWJvbCBudW1iZXIsIHVzZWQgYnkgdGhlCisgICAgIE1JUFMgRUxGIGxpbmtlci4gIEZJWE1FOiBXZSBzaG91bGQgZmlndXJlIG91dCBzb21lIHdheSB0byBvbmx5CisgICAgIGluY2x1ZGUgdGhpcyBmaWVsZCBmb3IgYSBNSVBTIEVMRiB0YXJnZXQuICAqLworICBhc2VjdGlvbiAqKmxvY2FsX3N0dWJzOworCisgIC8qIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlX2ZsYWdzIGZpZWxkIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisgIGJvb2xlYW4gZmxhZ3NfaW5pdDsKKworICAvKiBOdW1iZXIgb2Ygc3ltYm9sIHZlcnNpb24gZGVmaW5pdGlvbnMgd2UgYXJlIGFib3V0IHRvIGVtaXQuICAqLworICB1bnNpZ25lZCBpbnQgY3ZlcmRlZnM7CisKKyAgLyogTnVtYmVyIG9mIHN5bWJvbCB2ZXJzaW9uIHJlZmVyZW5jZXMgd2UgYXJlIGFib3V0IHRvIGVtaXQuICAqLworICB1bnNpZ25lZCBpbnQgY3ZlcnJlZnM7CisKKyAgLyogU3ltYm9sIHZlcnNpb24gZGVmaW5pdGlvbnMgaW4gZXh0ZXJuYWwgb2JqZWN0cy4gICovCisgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKnZlcmRlZjsKKworICAvKiBTeW1ib2wgdmVyc2lvbiByZWZlcmVuY2VzIHRvIGV4dGVybmFsIG9iamVjdHMuICAqLworICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdmVycmVmOworCisgIC8qIExpbmtlciBzZWN0aW9ucyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgKi8KKyAgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbiAqbGlua2VyX3NlY3Rpb25bIChpbnQpTElOS0VSX1NFQ1RJT05fTUFYIF07Cit9OworCisjZGVmaW5lIGVsZl90ZGF0YShiZmQpCQkoKGJmZCkgLT4gdGRhdGEuZWxmX29ial9kYXRhKQorI2RlZmluZSBlbGZfZWxmaGVhZGVyKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGVsZl9oZWFkZXIpCisjZGVmaW5lIGVsZl9lbGZzZWN0aW9ucyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBlbGZfc2VjdF9wdHIpCisjZGVmaW5lIGVsZl9zaHN0cnRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzdHJ0YWJfcHRyKQorI2RlZmluZSBlbGZfb25lc3ltdGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN5bXRhYl9zZWN0aW9uKQorI2RlZmluZSBlbGZfZHluc3ltdGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR5bnN5bXRhYl9zZWN0aW9uKQorI2RlZmluZSBlbGZfZHludmVyc3ltKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR5bnZlcnN5bV9zZWN0aW9uKQorI2RlZmluZSBlbGZfZHludmVyZGVmKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR5bnZlcmRlZl9zZWN0aW9uKQorI2RlZmluZSBlbGZfZHludmVycmVmKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGR5bnZlcnJlZl9zZWN0aW9uKQorI2RlZmluZSBlbGZfbnVtX2xvY2FscyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBudW1fbG9jYWxzKQorI2RlZmluZSBlbGZfbnVtX2dsb2JhbHMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gbnVtX2dsb2JhbHMpCisjZGVmaW5lIGVsZl9zZWN0aW9uX3N5bXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc2VjdGlvbl9zeW1zKQorI2RlZmluZSBjb3JlX3BycHNpbmZvKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHBycHNpbmZvKQorI2RlZmluZSBjb3JlX3Byc3RhdHVzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHByc3RhdHVzKQorI2RlZmluZSBlbGZfZ3AoYmZkKQkJKGVsZl90ZGF0YShiZmQpIC0+IGdwKQorI2RlZmluZSBlbGZfZ3Bfc2l6ZShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBncF9zaXplKQorI2RlZmluZSBlbGZfc3ltX2hhc2hlcyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzeW1faGFzaGVzKQorI2RlZmluZSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyhiZmQpIChlbGZfdGRhdGEoYmZkKSAtPiBsb2NhbF9nb3QucmVmY291bnRzKQorI2RlZmluZSBlbGZfbG9jYWxfZ290X29mZnNldHMoYmZkKSAoZWxmX3RkYXRhKGJmZCkgLT4gbG9jYWxfZ290Lm9mZnNldHMpCisjZGVmaW5lIGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyhiZmQpIChlbGZfdGRhdGEoYmZkKSAtPiBsaW5rZXJfc2VjdGlvbl9wb2ludGVycykKKyNkZWZpbmUgZWxmX2R0X25hbWUoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHRfbmFtZSkKKyNkZWZpbmUgZWxmX2JhZF9zeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gYmFkX3N5bXRhYikKKyNkZWZpbmUgZWxmX2ZsYWdzX2luaXQoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZmxhZ3NfaW5pdCkKKyNkZWZpbmUgZWxmX2xpbmtlcl9zZWN0aW9uKGJmZCxuKSAoZWxmX3RkYXRhKGJmZCkgLT4gbGlua2VyX3NlY3Rpb25bKGludCluXSkKKwwKK2V4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGVmX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyZGVmICosIEVsZl9JbnRlcm5hbF9WZXJkZWYgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVyZGVmICosIEVsZl9FeHRlcm5hbF9WZXJkZWYgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqLCBFbGZfSW50ZXJuYWxfVmVyZGF1eCAqKSk7CitleHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVyZGF1eCAqLCBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSk7CitleHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJuZWVkICosIEVsZl9JbnRlcm5hbF9WZXJuZWVkICopKTsKK2V4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuZWVkICosIEVsZl9FeHRlcm5hbF9WZXJuZWVkICopKTsKK2V4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbgorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5hdXggKiwgRWxmX0ludGVybmFsX1Zlcm5hdXggKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5hdXggKiwgRWxmX0V4dGVybmFsX1Zlcm5hdXggKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gKiwgRWxmX0ludGVybmFsX1ZlcnN5bSAqKSk7CitleHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJzeW0gKiwgRWxmX0V4dGVybmFsX1ZlcnN5bSAqKSk7CisKK2V4dGVybiBpbnQgX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7CitleHRlcm4gY2hhciAqYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKSk7CitleHRlcm4gY2hhciAqYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHVuc2lnbmVkKSk7CisKK2V4dGVybiBib29sZWFuIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZl9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLAorCQkJCQkgIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOworI2RlZmluZSBlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYihhYmZkLHN0cmluZGV4KSBcCisgICAgIGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24oYWJmZCxlbGZfZWxmaGVhZGVyKGFiZmQpLT5lX3Noc3RybmR4LHN0cmluZGV4KQorCisjZGVmaW5lIGJmZF9lbGYzMl9wcmludF9zeW1ib2wJYmZkX2VsZl9wcmludF9zeW1ib2wKKyNkZWZpbmUgYmZkX2VsZjY0X3ByaW50X3N5bWJvbAliZmRfZWxmX3ByaW50X3N5bWJvbAorCitleHRlcm4gdW5zaWduZWQgbG9uZyBiZmRfZWxmX2hhc2ggUEFSQU1TICgoQ09OU1QgdW5zaWduZWQgY2hhciAqKSk7CisKK2V4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9nZW5lcmljX3JlbG9jIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkJCSAgICBhcmVsZW50ICosCisJCQkJCQkJICAgIGFzeW1ib2wgKiwKKwkJCQkJCQkgICAgUFRSLAorCQkJCQkJCSAgICBhc2VjdGlvbiAqLAorCQkJCQkJCSAgICBiZmQgKiwKKwkJCQkJCQkgICAgY2hhciAqKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9ta2NvcmVmaWxlIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gRWxmX0ludGVybmFsX1NoZHIgKmJmZF9lbGZfZmluZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIKKyAgUEFSQU1TICgoYmZkICphYmZkLCBFbGZfSW50ZXJuYWxfU2hkciAqaGRyLCBjb25zdCBjaGFyICpuYW1lKSk7CitleHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdAorICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyBQQVJBTVMgKChiZmQgKikpOworCitleHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCisJCQkJCQkgICAgICAgZmlsZV9wdHIsCisJCQkJCQkgICAgICAgYmZkX3NpemVfdHlwZSkpOworZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKK2V4dGVybiBsb25nIF9iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOworZXh0ZXJuIGxvbmcgX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAorCQkJCQkJICBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7CitleHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGxvbmcgX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosCisJCQkJCQkJIGFzeW1ib2wgKiopKTsKK2V4dGVybiBhc3ltYm9sICpfYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCisJCQkJCSAgICAgICBzeW1ib2xfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiBhbGVudCAqX2JmZF9lbGZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCisJCQkJCQl1bnNpZ25lZCBsb25nKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKKwkJCQkJCSAgICBhc3ltYm9sICoqLAorCQkJCQkJICAgIGJmZF92bWEsIENPTlNUIGNoYXIgKiosCisJCQkJCQkgICAgQ09OU1QgY2hhciAqKiwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgKikpOworI2RlZmluZSBfYmZkX2VsZl9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIF9iZmRfZWxmX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAorZXh0ZXJuIGludCBfYmZkX2VsZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworCisvKiBJZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSByZWxvYyBoYW5kbGluZyB3cml0dGVuIHlldDogICovCitleHRlcm4gdm9pZCBfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCisJCQkJCSAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CisKK2V4dGVybiBib29sZWFuIGJmZF9zZWN0aW9uX2Zyb21fc2hkciBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50IHNoaW5kZXgpKTsKK2V4dGVybiBib29sZWFuIGJmZF9zZWN0aW9uX2Zyb21fcGhkciBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7CisKK2V4dGVybiBpbnQgX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworCithc2VjdGlvbiAqYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCkpOworYm9vbGVhbiBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwKKwkJCQkJCSAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOworYm9vbGVhbgorX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Citib29sZWFuCitfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICosCisJCQkJCQkgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwordm9pZCBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyBQQVJBTVMgKChiZmQgKikpOworZmlsZV9wdHIgX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gUEFSQU1TICgoRWxmX0ludGVybmFsX1NoZHIgKiwKKwkJCQkJCQkgICAgZmlsZV9wdHIsCisJCQkJCQkJICAgIGJvb2xlYW4pKTsKKworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKikpOworCitib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Citib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKKwkJCQkJICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK2VsZl9saW5rZXJfc2VjdGlvbl90ICpfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICphYmZkLAorCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorCSAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0sCisJICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmRlZmF1bHRzKSk7CisKK2VsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24KKyAgUEFSQU1TICgoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKmxpbmtlcl9wb2ludGVycywKKwkgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQsCisJICAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaCkpOworCitib29sZWFuIGJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKmFiZmQsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisJICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAorCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAorCSAgIGNvbnN0IEVsZjMyX0ludGVybmFsX1JlbGEgKnJlbCkpOworCitiZmRfdm1hIGJmZF9lbGYzMl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKm91dHB1dF9hYmZkLAorCSAgIGJmZCAqaW5wdXRfYmZkLAorCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKKwkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKKwkgICBiZmRfdm1hIHJlbG9jYXRpb24sCisJICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfUmVsYSAqcmVsLAorCSAgIGludCByZWxhdGl2ZV9yZWxvYykpOworCitib29sZWFuIGJmZF9lbGY2NF9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKmFiZmQsCisJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisJICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAorCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAorCSAgIGNvbnN0IEVsZjY0X0ludGVybmFsX1JlbGEgKnJlbCkpOworCitiZmRfdm1hIGJmZF9lbGY2NF9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKm91dHB1dF9hYmZkLAorCSAgIGJmZCAqaW5wdXRfYmZkLAorCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKKwkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwKKwkgICBiZmRfdm1hIHJlbG9jYXRpb24sCisJICAgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVsYSAqcmVsLAorCSAgIGludCByZWxhdGl2ZV9yZWxvYykpOworCitib29sZWFuIF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYQorICBQQVJBTVMgKChiZmQgKmR5bm9iaiwKKwkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCisJICAgaW50IGFsaWdubWVudCkpOworCitib29sZWFuIF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcgorICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7CisKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZWxmMzJfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZWxmMzJfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBjaGFyICpiZmRfZWxmMzJfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGludCBiZmRfZWxmMzJfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkJCQkgYmZkICopKTsKKworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2JmZF9saW5rX2FkZF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9TeW0gKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIFBUUikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2NfaW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlbCAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKK2V4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBFbGYzMl9FeHRlcm5hbF9SZWwgKikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK2V4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZjMyX0V4dGVybmFsX1JlbGEgKikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcGhkcl9pbgorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUGhkciAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9waGRyX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgRWxmMzJfRXh0ZXJuYWxfUGhkciAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9keW5faW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9keW5fb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIEVsZjMyX0V4dGVybmFsX0R5biAqKSk7CitleHRlcm4gbG9uZyBiZmRfZWxmMzJfc2x1cnBfc3ltYm9sX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfd3JpdGVfc2hkcnNfYW5kX2VoZHIgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBpbnQgYmZkX2VsZjMyX3dyaXRlX291dF9waGRycworICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBFbGZfSW50ZXJuYWxfUmVsYSAqX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICosIGJvb2xlYW4pKTsKKworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGNoYXIgKmJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gaW50IGJmZF9lbGY2NF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBib29sZWFuIGJmZF9lbGY2NF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCisJCQkJCQkJCSBiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2JmZF9saW5rX2FkZF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9TeW0gKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIFBUUikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbCAqLCBFbGZfSW50ZXJuYWxfUmVsICopKTsKK2V4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbCAqLCBFbGY2NF9FeHRlcm5hbF9SZWwgKikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK2V4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZjY0X0V4dGVybmFsX1JlbGEgKikpOworZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcGhkcl9pbgorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUGhkciAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgRWxmNjRfRXh0ZXJuYWxfUGhkciAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5faW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7CitleHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9keW5fb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRHluICosIEVsZjY0X0V4dGVybmFsX0R5biAqKSk7CitleHRlcm4gbG9uZyBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBpbnQgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycworICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKiwgaW50KSk7CitleHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBFbGZfSW50ZXJuYWxfUmVsYSAqX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICosIGJvb2xlYW4pKTsKKworI2RlZmluZSBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCisKK2V4dGVybiBib29sZWFuIF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4KKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCBQVFIsCisgICAgICAgICAgIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CisKK2Jvb2xlYW4gX2JmZF9lbGYzMl9nY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Citib29sZWFuIF9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKK2Jvb2xlYW4gX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworYm9vbGVhbiBfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKK2Jvb2xlYW4gX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeQorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOworCitib29sZWFuIF9iZmRfZWxmNjRfZ2Nfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOworYm9vbGVhbiBfYmZkX2VsZjY0X2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Citib29sZWFuIF9iZmRfZWxmNjRfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2Jvb2xlYW4gX2JmZF9lbGY2NF9nY19yZWNvcmRfdnRpbmhlcml0CisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Citib29sZWFuIF9iZmRfZWxmNjRfZ2NfcmVjb3JkX3Z0ZW50cnkKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKKworLyogTUlQUyBFTEYgc3BlY2lmaWMgcm91dGluZXMuICAqLworCitleHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCisgIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZworICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKikpOworZXh0ZXJuIHZvaWQgX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOworZXh0ZXJuIHZvaWQgX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7CitleHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK2V4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitleHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitleHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCisJICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKworI2VuZGlmIC8qIF9MSUJFTEZfSF8gKi8KZGlmZiAtLWdpdCBhL2JmZC9lbGYtbTEwMjAwLmMgYi9iZmQvZWxmLW0xMDIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDE5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmLW0xMDIwMC5jCkBAIC0wLDAgKzEsMTUyNSBAQAorLyogTWF0c3VzaGl0YSAxMDIwMCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworc3RhdGljIHZvaWQgbW4xMDIwMF9pbmZvX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIEVsZjMyX0V4dGVybmFsX1N5bSAqLCBiZmRfdm1hKSk7CisKKy8qIFdlIGhhdmUgdG8gdXNlIFJFTEEgaW5zdHJ1Y3Rpb25zIHNpbmNlIG1kX2FwcGx5X2ZpeDMgaW4gdGhlIGFzc2VtYmxlcgorICAgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuICAqLworI2RlZmluZSBVU0VfUkVMQQorCitlbnVtIHJlbG9jX3R5cGUKK3sKKyAgUl9NTjEwMjAwX05PTkUgPSAwLAorICBSX01OMTAyMDBfMzIsCisgIFJfTU4xMDIwMF8xNiwKKyAgUl9NTjEwMjAwXzgsCisgIFJfTU4xMDIwMF8yNCwKKyAgUl9NTjEwMjAwX1BDUkVMOCwKKyAgUl9NTjEwMjAwX1BDUkVMMTYsCisgIFJfTU4xMDIwMF9QQ1JFTDI0LAorICBSX01OMTAyMDBfTUFYCit9OworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZVtdID0KK3sKKyAgLyogRHVtbXkgcmVsb2NhdGlvbi4gIERvZXMgbm90aGluZy4gICovCisgIEhPV1RPIChSX01OMTAyMDBfTk9ORSwKKwkgMCwKKwkgMiwKKwkgMTYsCisJIGZhbHNlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMjAwX05PTkUiLAorCSBmYWxzZSwKKwkgMCwKKwkgMCwKKwkgZmFsc2UpLAorICAvKiBTdGFuZGFyZCAzMiBiaXQgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMjAwXzMyLAorCSAwLAorCSAyLAorCSAzMiwKKwkgZmFsc2UsCisJIDAsCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJSX01OMTAyMDBfMzIiLAorCSBmYWxzZSwKKwkgMHhmZmZmZmZmZiwKKwkgMHhmZmZmZmZmZiwKKwkgZmFsc2UpLAorICAvKiBTdGFuZGFyZCAxNiBiaXQgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMjAwXzE2LAorCSAwLAorCSAxLAorCSAxNiwKKwkgZmFsc2UsCisJIDAsCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJSX01OMTAyMDBfMTYiLAorCSBmYWxzZSwKKwkgMHhmZmZmLAorCSAweGZmZmYsCisJIGZhbHNlKSwKKyAgLyogU3RhbmRhcmQgOCBiaXQgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMjAwXzgsCisJIDAsCisJIDAsCisJIDgsCisJIGZhbHNlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMjAwXzgiLAorCSBmYWxzZSwKKwkgMHhmZiwKKwkgMHhmZiwKKwkgZmFsc2UpLAorICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMjAwXzI0LAorCSAwLAorCSAyLAorCSAyNCwKKwkgZmFsc2UsCisJIDAsCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJSX01OMTAyMDBfMjQiLAorCSBmYWxzZSwKKwkgMHhmZmZmZmYsCisJIDB4ZmZmZmZmLAorCSBmYWxzZSksCisgIC8qIFNpbXBsZSA4IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KKyAgSE9XVE8gKFJfTU4xMDIwMF9QQ1JFTDgsCisJIDAsCisJIDAsCisJIDgsCisJIHRydWUsCisJIDAsCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJSX01OMTAyMDBfUENSRUw4IiwKKwkgZmFsc2UsCisJIDB4ZmYsCisJIDB4ZmYsCisJIHRydWUpLAorICAvKiBTaW1wbGUgMTYgcGMtcmVsYXRpdmUgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMMTYsCisJIDAsCisJIDEsCisJIDE2LAorCSB0cnVlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMjAwX1BDUkVMMTYiLAorCSBmYWxzZSwKKwkgMHhmZmZmLAorCSAweGZmZmYsCisJIHRydWUpLAorICAvKiBTaW1wbGUgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIDEgYnl0ZSBhZGp1c3RtZW50CisgICAgIHRvIGdldCB0aGUgcGMtcmVsYXRpdmUgb2Zmc2V0IGNvcnJlY3QuICAqLworICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMMjQsCisJIDAsCisJIDIsCisJIDI0LAorCSB0cnVlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMjAwX1BDUkVMMjQiLAorCSBmYWxzZSwKKwkgMHhmZmZmZmYsCisJIDB4ZmZmZmZmLAorCSB0cnVlKSwKK307CisKK3N0cnVjdCBtbjEwMjAwX3JlbG9jX21hcAoreworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCBtbjEwMjAwX3JlbG9jX21hcFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMjAwX05PTkUsIH0sCisgIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAyMDBfMzIsIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAyMDBfMTYsIH0sCisgIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDIwMF84LCB9LAorICB7IEJGRF9SRUxPQ18yNCwgUl9NTjEwMjAwXzI0LCB9LAorICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX01OMTAyMDBfUENSRUw4LCB9LAorICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NTjEwMjAwX1BDUkVMMTYsIH0sCisgIHsgQkZEX1JFTE9DXzI0X1BDUkVMLCBSX01OMTAyMDBfUENSRUwyNCwgfSwKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2JmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7CisgICAgICAgaSA8IHNpemVvZiAobW4xMDIwMF9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgbW4xMDIwMF9yZWxvY19tYXApOworICAgICAgIGkrKykKKyAgICB7CisgICAgICBpZiAobW4xMDIwMF9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQorCXJldHVybiAmZWxmX21uMTAyMDBfaG93dG9fdGFibGVbbW4xMDIwMF9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIE1OMTAyMDAgRUxGIHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK21uMTAyMDBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3Q7Cit7CisgIHVuc2lnbmVkIGludCByX3R5cGU7CisKKyAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7CisgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTU4xMDIwMF9NQVgpOworICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW3JfdHlwZV07Cit9CisKKy8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCisJCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAorCQkJCSBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQorICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYmZkX3ZtYSBvZmZzZXQ7CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGJmZF92bWEgYWRkZW5kOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnN5bV9zZWM7CisgICAgIGludCBpc19sb2NhbDsKK3sKKyAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKKyAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7CisKKyAgc3dpdGNoIChyX3R5cGUpCisgICAgeworCisgICAgY2FzZSBSX01OMTAyMDBfTk9ORToKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfTU4xMDIwMF8zMjoKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKyAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfTU4xMDIwMF8xNjoKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKworICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgY2FzZSBSX01OMTAyMDBfODoKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKworICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMjAwXzI0OgorICAgICAgdmFsdWUgKz0gYWRkZW5kOworCisgICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDAwMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgICAgICB2YWx1ZSAmPSAweGZmZmZmZjsKKyAgICAgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmYwMDAwMDApOworICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMODoKKyAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMSk7CisgICAgICB2YWx1ZSArPSBhZGRlbmQ7CisKKyAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDApCisgICAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMMTY6CisgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgdmFsdWUgLT0gKG9mZnNldCArIDIpOworICAgICAgdmFsdWUgKz0gYWRkZW5kOworCisgICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDAwMCkKKyAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMjAwX1BDUkVMMjQ6CisgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgdmFsdWUgLT0gKG9mZnNldCArIDMpOworICAgICAgdmFsdWUgKz0gYWRkZW5kOworCisgICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweGZmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwMDApCisgICAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOworICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7CisgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOworICAgIH0KK30KKworDAorLyogUmVsb2NhdGUgYW4gTU4xMDIwMCBFTEYgc2VjdGlvbi4gICovCitzdGF0aWMgYm9vbGVhbgorbW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgaW50IHJfdHlwZTsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKKyAgICAgIGhvd3RvID0gZWxmX21uMTAyMDBfaG93dG9fdGFibGUgKyByX3R5cGU7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKyAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCisgICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisgICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQl7CisJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkJfQorCSAgICB9CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLworICAgICAgaCA9IE5VTEw7CisgICAgICBzeW0gPSBOVUxMOworICAgICAgc2VjID0gTlVMTDsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIHIgPSBtbjEwMjAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAorCQkJCQkgICBpbnB1dF9zZWN0aW9uLAorCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKKwkJCQkJICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKKwkJCQkJICAgaW5mbywgc2VjLCBoID09IE5VTEwpOworCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgY29uc3QgY2hhciAqbmFtZTsKKwkgIGNvbnN0IGNoYXIgKm1zZyA9IChjb25zdCBjaGFyICopMDsKKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KKwkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7CisJICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQorCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCSAgICB9CisKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgorCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOworCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKKwkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworCSAgICBjb21tb25fZXJyb3I6CisJICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCisJCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMjAwLgorCisgICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAyMDA6CisKKwkqIGpzcjoyNCAtPiBqc3I6MTYgCQkJCQkgICAyIGJ5dGVzCisKKwkqIGptcDoyNCAtPiBqbXA6MTYJCQkJCSAgIDIgYnl0ZXMKKwkqIGptcDoxNiAtPiBicmE6OAkJCQkJICAgMSBieXRlCisKKwkJKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb25kaXRpb25hbCBicmFuY2gKKwkJYXJvdW5kIHRoZSBqdW1wL2JyYSwgd2UgbWF5IGJlIGFibGUgdG8gcmV2ZXJzZSBpdHMgY29uZGl0aW9uCisJCWFuZCBjaGFuZ2UgaXRzIHRhcmdldCB0byB0aGUganVtcCdzIHRhcmdldC4gIFRoZSBqdW1wL2JyYQorCQljYW4gdGhlbiBiZSBkZWxldGVkLgkJCQkgICAyIGJ5dGVzCisKKwkqIG1vdiBhYnMyNCAtPiBtb3YgYWJzMTYJMiBieXRlIHNhdmluZ3MKKworCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTI0IGNhbiByZWxheCB0byBpbW0xNiAgMiBieXRlcworCS0gTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGltbTE2IGNhbiByZWxheCB0byBpbW04ICAgMSBieXRlCisKKwkqIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMjQgY2FuIHJlbGF4IHRvIGQxNgkgICAyIGJ5dGVzCisJLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIGJ5dGUKKworCWFiczI0LCBpbW0yNCwgZDI0IGFsbCBsb29rIHRoZSBzYW1lIGF0IHRoZSByZWxvYyBsZXZlbC4gIEl0CisJbWlnaHQgbWFrZSB0aGUgY29kZSBzaW1wbGVyIGlmIHdlIGhhZCBkaWZmZXJlbnQgcmVsb2NzIGZvcgorCXRoZSB2YXJpb3VzIHJlbGF4YWJsZSBvcGVyYW5kIHR5cGVzLgorICAgCisJV2UgZG9uJ3QgaGFuZGxlIGltbTE2LT5pbW04IG9yIGQxNi0+ZDggYXMgdGhleSdyZSB2ZXJ5IHJhcmUKKwlhbmQgc29tZXdoYXQgbW9yZSBkaWZmaWN1bHQgdG8gc3VwcG9ydC4gICovCisKK3N0YXRpYyBib29sZWFuIAorbW4xMDIwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGJvb2xlYW4gKmFnYWluOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOworICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOworICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKKworICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KKyAgKmFnYWluID0gZmFsc2U7CisKKyAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgYSByZWxvY2F0ZWFibGUgbGluaywgaWYKKyAgICAgdGhpcyBzZWN0aW9uIGRvZXMgbm90IGhhdmUgcmVsb2NzLCBvciBpZiB0aGlzIGlzIG5vdCBhCisgICAgIGNvZGUgc2VjdGlvbi4gICovCisgIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQorICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKKyAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMAorICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKKyAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLworICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKKyAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKworICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLworICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCisJCSAgICAgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCisJCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKKyAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCisgIC8qIFdhbGsgdGhyb3VnaCB0aGVtIGxvb2tpbmcgZm9yIHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLworICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGJmZF92bWEgc3ltdmFsOworCisgICAgICAvKiBJZiB0aGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IGNhbiBiZSByZWxheGVkLCB0aGVuIGlnbm9yZQorCSB0aGlzIHJlbG9jLiAgKi8KKyAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX05PTkUKKwkgIHx8IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfOAorCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9NQVgpCisJY29udGludWU7CisKKyAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCisgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwl7CisJICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KKwkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQorCSAgICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLworCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKKwkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAorCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFJlYWQgdGhpcyBCRkQncyBzeW1ib2xzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KKyAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCisJeworCSAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCisJICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKKwkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisJICAgICAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCisJCQkgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOworCSAgICAgIGlmIChleHRzeW1zID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIGZyZWVfZXh0c3ltcyA9IGV4dHN5bXM7CisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJCSAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQorCQkgICAgICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSB0aGUgcmVsb2MuICAqLworICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwl7CisJICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07CisJICBhc2VjdGlvbiAqc3ltX3NlYzsKKworCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLworCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAorCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCisJCQkJICAgICZpc3ltKTsKKworCSAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKKwkgIHN5bXZhbCA9IChpc3ltLnN0X3ZhbHVlCisJCSAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5keDsKKwkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAvKiBBbiBleHRlcm5hbCBzeW1ib2wuICAqLworCSAgaW5keCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkgIGggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07CisJICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOworCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICBzeW1ib2wuICBKdXN0IGlnbm9yZSBpdC0taXQgd2lsbCBiZSBjYXVnaHQgYnkgdGhlCisgICAgICAgICAgICAgICAgIHJlZ3VsYXIgcmVsb2MgcHJvY2Vzc2luZy4gICovCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgc3ltdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJfQorCisgICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KKwkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKKwkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKKwkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCisJIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOworCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgorCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCisKKworICAgICAgLyogVHJ5IHRvIHR1cm4gYSAyNGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKKwkgYnJhbmNoL2NhbGwuICAqLworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwyNCkKKwl7CisJICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOworCisJICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCisJICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDMpOworCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7CisKKwkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gMTYgYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcworCSAgICAgMHg3ZmZmICsgMiBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgdHdvIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKKwkgICAgIGFibGUgdG8gcmVsYXguICAqLworCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MDAxICYmIChsb25nKXZhbHVlID4gLTB4ODAwMCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKKworCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KKwkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkgICAgICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSkKKwkJY29udGludWU7CisKKwkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLworCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisKKwkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOworCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKKwkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOworCisJICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLworCSAgICAgIGlmIChjb2RlID09IDB4ZTApCisJCWJmZF9wdXRfOCAoYWJmZCwgMHhmYywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOworCSAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHhlMSkKKwkJYmZkX3B1dF84IChhYmZkLCAweGZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7CisKKwkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KKwkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkgICBSX01OMTAyMDBfUENSRUwxNik7CisKKwkgICAgICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlIG9mZnNldC4gICovCisJICAgICAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKKworCSAgICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCisJICAgICAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCisJCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCisJICAgICAgKmFnYWluID0gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgLyogVHJ5IHRvIHR1cm4gYSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggaW50byBhIDhiaXQgcGMtcmVsYXRpdmUKKwkgYnJhbmNoLiAgKi8KKyAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMMTYpCisJeworCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKKworCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLworCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICB2YWx1ZSAtPSAoaXJlbC0+cl9vZmZzZXQgKyAyKTsKKwkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOworCisJICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDggYml0cywgbm90ZSB0aGUgaGlnaCB2YWx1ZSBpcworCSAgICAgMHg3ZiArIDEgYXMgdGhlIHRhcmdldCB3aWxsIGJlIG9uZSBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCisJICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KKwkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKKworCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KKwkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkgICAgICBpZiAoY29kZSAhPSAweGZjKQorCQljb250aW51ZTsKKworCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCisJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJICAgICAgYmZkX3B1dF84IChhYmZkLCAweGVhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkgICAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KKwkgICAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkgICBSX01OMTAyMDBfUENSRUw4KTsKKworCSAgICAgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KKwkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAxKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkgICAgICAqYWdhaW4gPSB0cnVlOworCSAgICB9CisJfQorCisgICAgICAvKiBUcnkgdG8gZWxpbWluYXRlIGFuIHVuY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoCisJIHdoaWNoIGltbWVkaWF0ZWx5IGZvbGxvd3MgYSBjb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZQorCSBicmFuY2ggYXJvdW5kIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KKworCSAgICBvcmlnaW5hbDoJCW5ldzoKKwkgICAgYkNDIGxhYjEJCWJDQycgbGFiMgorCSAgICBicmEgbGFiMgorCSAgIGxhYjE6CSAgICAgICBsYWIxOgorCisKKwkgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGJDQyBjYW4ndCByZWFjaCBsYWIyIGF0IGFzc2VtYmx5IHRpbWUsCisJIGJ1dCBkdWUgdG8gb3RoZXIgcmVsYXhhdGlvbnMgaXQgY2FuIHJlYWNoIGF0IGxpbmsgdGltZS4gICovCisgICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCisJeworCSAgRWxmX0ludGVybmFsX1JlbGEgKm5yZWw7CisJICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOworCSAgdW5zaWduZWQgY2hhciBjb2RlOworCisJICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCisJICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDEpOworCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7CisKKwkgIC8qIERvIG5vdGhpbmcgaWYgdGhpcyByZWxvYyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBzZWN0aW9uLiAgKi8KKwkgIGlmIChpcmVsLT5yX29mZnNldCA9PSBzZWMtPl9jb29rZWRfc2l6ZSkKKwkgICAgY29udGludWU7CisKKwkgIC8qIFNlZSBpZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhbiB1bmNvbmRpdGlvbmFsIHBjLXJlbGF0aXZlCisJICAgICBicmFuY2gsIG1vcmUgb2Z0ZW4gdGhhbiBub3QgdGhpcyB0ZXN0IHdpbGwgZmFpbCwgc28gd2UKKwkgICAgIHRlc3QgaXQgZmlyc3QgdG8gc3BlZWQgdGhpbmdzIHVwLiAgKi8KKwkgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAxKTsKKwkgIGlmIChjb2RlICE9IDB4ZWEpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBBbHNvIG1ha2Ugc3VyZSB0aGUgbmV4dCByZWxvY2F0aW9uIGFwcGxpZXMgdG8gdGhlIG5leHQKKwkgICAgIGluc3RydWN0aW9uIGFuZCB0aGF0IGl0J3MgYSBwYy1yZWxhdGl2ZSA4IGJpdCBicmFuY2guICAqLworCSAgbnJlbCA9IGlyZWwgKyAxOworCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAorCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgMiAhPSBucmVsLT5yX29mZnNldAorCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX01OMTAyMDBfUENSRUw4KQorCSAgICBjb250aW51ZTsKKworCSAgLyogTWFrZSBzdXJlIG91ciBkZXN0aW5hdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZQorCSAgICAgdW5jb25kaXRpb25hbCBicmFuY2guICAqLworCSAgaWYgKHN5bXZhbCAhPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkgKyBpcmVsLT5yX29mZnNldCArIDMpKQorCSAgICBjb250aW51ZTsKKworCSAgLyogTm93IG1ha2Ugc3VyZSB3ZSBhcmUgYSBjb25kaXRpb25hbCBicmFuY2guICBUaGlzIG1heSBub3QKKwkgICAgIGJlIG5lY2Vzc2FyeSwgYnV0IHdoeSB0YWtlIHRoZSBjaGFuY2UuIAorCisJICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAyMDBfUENSRUw4IHJlbG9jcworCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKKwkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgorCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLworCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCSAgaWYgKGNvZGUgIT0gMHhlMCAmJiBjb2RlICE9IDB4ZTEgJiYgY29kZSAhPSAweGUyCisJICAgICAgJiYgY29kZSAhPSAweGUzICYmIGNvZGUgIT0gMHhlNCAmJiBjb2RlICE9IDB4ZTUKKwkgICAgICAmJiBjb2RlICE9IDB4ZTYgJiYgY29kZSAhPSAweGU3ICYmIGNvZGUgIT0gMHhlOAorCSAgICAgICYmIGNvZGUgIT0gMHhlOSAmJiBjb2RlICE9IDB4ZWMgJiYgY29kZSAhPSAweGVkCisJICAgICAgJiYgY29kZSAhPSAweGVlICYmIGNvZGUgIT0gMHhlZiAmJiBjb2RlICE9IDB4ZmMKKwkgICAgICAmJiBjb2RlICE9IDB4ZmQgJiYgY29kZSAhPSAweGZlICYmIGNvZGUgIT0gMHhmZikKKwkgICAgY29udGludWU7CisKKwkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAorCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKwkgIGlmIChtbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCisJCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQorCSAgICBjb250aW51ZTsKKworCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLworCSAgc3dpdGNoIChjb2RlKQorCSAgICB7CisJICAgICAgY2FzZSAweGZjOgorCQljb2RlID0gMHhmZDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGZkOgorCQljb2RlID0gMHhmYzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGZlOgorCQljb2RlID0gMHhmZjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGZmOgorCQljb2RlID0gMHhmZTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU4OgorCQljb2RlID0gMHhlOTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU5OgorCQljb2RlID0gMHhlODsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGUwOgorCQljb2RlID0gMHhlMjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGUyOgorCQljb2RlID0gMHhlMDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGUzOgorCQljb2RlID0gMHhlMTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGUxOgorCQljb2RlID0gMHhlMzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU0OgorCQljb2RlID0gMHhlNjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU2OgorCQljb2RlID0gMHhlNDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU3OgorCQljb2RlID0gMHhlNTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU1OgorCQljb2RlID0gMHhlNzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGVjOgorCQljb2RlID0gMHhlZDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGVkOgorCQljb2RlID0gMHhlYzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGVlOgorCQljb2RlID0gMHhlZjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGVmOgorCQljb2RlID0gMHhlZTsKKwkJYnJlYWs7CisJICAgIH0KKwkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCSAgCisJICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAorCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCisJICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87CisKKwkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLworCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKKwkJCQkgICAgICAgUl9NTjEwMjAwX05PTkUpOworCisJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLworCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkgICphZ2FpbiA9IHRydWU7CisJfQorCisgICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MKKwkgaW50byBhIDE2Yml0IGltbWVkaWF0ZSwgZGlzcGxhY2VtZW50IG9yIGFic29sdXRlIGFkZHJlc3MuICAqLworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfMjQpCisJeworCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKKworCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAKKwkgICAgIFdlIGFsbG93IGFueSAxNmJpdCBtYXRjaCBoZXJlLiAgV2UgcHJ1bmUgdGhvc2Ugd2UgY2FuJ3QKKwkgICAgIGhhbmRsZSBiZWxvdy4gICovCisJICBpZiAoKGxvbmcpdmFsdWUgPCAweDdmZmYgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOworCisJICAgICAgLyogQWxsIGluc25zIHdoaWNoIGhhdmUgMjRiaXQgb3BlcmFuZHMgYXJlIDUgYnl0ZXMgbG9uZywKKwkJIHRoZSBmaXJzdCBieXRlIHdpbGwgYWx3YXlzIGJlIDB4ZjQsIGJ1dCB3ZSBkb3VibGUgY2hlY2sKKwkJIGl0IGp1c3QgaW4gY2FzZS4gICovCisKKwkgICAgICAvKiBHZXQgdGhlIGZpcnN0IG9wY29kZS4gICovCisJICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOworCisJICAgICAgaWYgKGNvZGUgIT0gMHhmNCkKKwkJY29udGludWU7CisKKwkgICAgICAvKiBHZXQgdGhlIHNlY29uZCBvcGNvZGUuICAqLworCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKKworCSAgICAgIHN3aXRjaCAoY29kZSAmIDB4ZmMpCisJCXsKKwkJLyogbW92IGltbTI0LGRuIC0+IG1vdiBpbW0xNixkbiAqLworCQljYXNlIDB4NzA6CisJCSAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQorCQkgICAgIG1vdmUgdGhlIHZhbHVlIG91dCBvZiBoaWdoIG1lbSBhbmQgdGh1cyBub3QgZml0CisJCSAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLworCQkgIGlmICh2YWx1ZSAmIDB4ODAwMCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbGRlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgYmZkX3B1dF84IChhYmZkLCAweGY4ICsgKGNvZGUgJiAweDAzKSwKKwkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOworCisJCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCisJCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7CisKKwkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCisJCSAgICAgb2Zmc2V0LiAgKi8KKwkJICBpcmVsLT5yX29mZnNldCAtPSAxOworCisJCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KKwkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgorCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkJICAqYWdhaW4gPSB0cnVlOworCQkgIGJyZWFrOworCisJCS8qIG1vdiBpbW0yNCxhbiAtPiBtb3YgaW1tMTYsYW4gCisJCSAgIGNtcCBpbW0yNCxhbiAtPiBjbXAgaW1tMTYsYW4KKwkJICAgbW92IChhYnMyNCksZG4gLT4gbW92IChhYnMxNiksZG4KKwkJICAgbW92IGRuLChhYnMyNCkgLT4gbW92IGRuLChhYnMxNikKKwkJICAgbW92YiBkbiwoYWJzMjQpIC0+IG1vdmIgZG4sKGFiczE2KQorCQkgICBtb3ZidSAoYWJzMjQpLGRuIC0+IG1vdmJ1IChhYnMxNiksZG4gKi8KKwkJY2FzZSAweDc0OgorCQljYXNlIDB4N2M6CisJCWNhc2UgMHhjMDoKKwkJY2FzZSAweDQwOgorCQljYXNlIDB4NDQ6CisJCWNhc2UgMHhjODoKKwkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisJCSAgZnJlZV9yZWxvY3MgPSBOVUxMOworCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKworCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7CisJCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzQpCisJCSAgICBjb2RlID0gMHhkYyArIChjb2RlICYgMHgwMyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDdjKQorCQkgICAgY29kZSA9IDB4ZWMgKyAoY29kZSAmIDB4MDMpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjMCkKKwkJICAgIGNvZGUgPSAweGM4ICsgKGNvZGUgJiAweDAzKTsKKwkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDApCisJCSAgICBjb2RlID0gMHhjMCArIChjb2RlICYgMHgwMyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDQ0KQorCQkgICAgY29kZSA9IDB4YzQgKyAoY29kZSAmIDB4MDMpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjOCkKKwkJICAgIGNvZGUgPSAweGNjICsgKGNvZGUgJiAweDAzKTsKKworCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KKwkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKKworCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLworCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCisJCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOworCisJCSAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQorCQkgICAgIG9mZnNldC4gICovCisJCSAgaXJlbC0+cl9vZmZzZXQgLT0gMTsKKworCQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCisJCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDEsIDIpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCisJCSAgKmFnYWluID0gdHJ1ZTsKKwkJICBicmVhazsKKworCQkvKiBjbXAgaW1tMjQsZG4gLT4gY21wIGltbTE2LGRuCisJCSAgIG1vdiAoYWJzMjQpLGFuIC0+IG1vdiAoYWJzMTYpLGFuCisJCSAgIG1vdiBhbiwoYWJzMjQpIC0+IG1vdiBhbiwoYWJzMTYpCisJCSAgIGFkZCBpbW0yNCxkbiAtPiBhZGQgaW1tMTYsZG4KKwkJICAgYWRkIGltbTI0LGFuIC0+IGFkZCBpbW0xNixhbgorCQkgICBzdWIgaW1tMjQsZG4gLT4gc3ViIGltbTE2LGRuCisJCSAgIHN1YiBpbW0yNCxhbiAtPiBzdWIgaW1tMTYsYW4gCisJCSAgIEFuZCBhbGwgZDI0LT5kMTYgaW4gbWVtb3J5IG9wcy4gICovCisJCWNhc2UgMHg3ODoKKwkJY2FzZSAweGQwOgorCQljYXNlIDB4NTA6CisJCWNhc2UgMHg2MDoKKwkJY2FzZSAweDY0OgorCQljYXNlIDB4Njg6CisJCWNhc2UgMHg2YzoKKwkJY2FzZSAweDgwOgorCQljYXNlIDB4ZjA6CisJCWNhc2UgMHgwMDoKKwkJY2FzZSAweDEwOgorCQljYXNlIDB4YjA6CisJCWNhc2UgMHgzMDoKKwkJY2FzZSAweGEwOgorCQljYXNlIDB4MjA6CisJCWNhc2UgMHg5MDoKKwkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5CisJCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKKwkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCisJCSAgaWYgKCgoY29kZSAmIDB4ZmMpID09IDB4NzgKKwkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2MAorCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDY0CisJCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjgKKwkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2YworCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDgwCisJCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ZjAKKwkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgwMAorCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDEwCisJCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YjAKKwkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgzMAorCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweGEwCisJCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MjAKKwkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg5MCkKKwkJICAgICAgICYmICh2YWx1ZSAmIDB4ODAwMCkgIT0gMCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbGRlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgYmZkX3B1dF84IChhYmZkLCAweGY3LCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7CisKKwkJICBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDc4KQorCQkgICAgY29kZSA9IDB4NDggKyAoY29kZSAmIDB4MDMpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhkMCkKKwkJICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKKwkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NTApCisJCSAgICBjb2RlID0gMHgyMCArIChjb2RlICYgMHgwMyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDYwKQorCQkgICAgY29kZSA9IDB4MTggKyAoY29kZSAmIDB4MDMpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2NCkKKwkJICAgIGNvZGUgPSAweDA4ICsgKGNvZGUgJiAweDAzKTsKKwkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjgpCisJCSAgICBjb2RlID0gMHgxYyArIChjb2RlICYgMHgwMyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDZjKQorCQkgICAgY29kZSA9IDB4MGMgKyAoY29kZSAmIDB4MDMpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg4MCkKKwkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDA3KTsKKwkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4ZjApCisJCSAgICBjb2RlID0gMHhiMCArIChjb2RlICYgMHgwNyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDAwKQorCQkgICAgY29kZSA9IDB4ODAgKyAoY29kZSAmIDB4MDcpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgxMCkKKwkJICAgIGNvZGUgPSAweGEwICsgKGNvZGUgJiAweDA3KTsKKwkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YjApCisJCSAgICBjb2RlID0gMHg3MCArIChjb2RlICYgMHgwNyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDMwKQorCQkgICAgY29kZSA9IDB4NjAgKyAoY29kZSAmIDB4MDcpOworCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhMCkKKwkJICAgIGNvZGUgPSAweGQwICsgKGNvZGUgJiAweDA3KTsKKwkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MjApCisJCSAgICBjb2RlID0gMHg5MCArIChjb2RlICYgMHgwNyk7CisJCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDkwKQorCQkgICAgY29kZSA9IDB4NTAgKyAoY29kZSAmIDB4MDcpOworCisJCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KKwkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKKworCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZXMgb2YgZGF0YS4gICovCisJCSAgaWYgKCFtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJCSAgICAgICBpcmVsLT5yX29mZnNldCArIDIsIDEpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkJICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCisJCSAgKmFnYWluID0gdHJ1ZTsKKwkJICBicmVhazsKKworCQkvKiBtb3ZiIChhYnMyNCksZG4gLT5tb3ZidSAoYWJzMTYpLGRuIGV4dHhiIGJuICovCisJCWNhc2UgMHhjNDoKKwkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisJCSAgZnJlZV9yZWxvY3MgPSBOVUxMOworCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKworCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7CisJCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYyArIChjb2RlICYgMHgwMyksCisJCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKKworCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhiOCArIChjb2RlICYgMHgwMyksCisJCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKKworCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLworCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCisJCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOworCisJCSAgLyogVGhlIHJlbG9jIHdpbGwgYmUgYXBwbGllZCBvbmUgYnl0ZSBpbiBmcm9udCBvZiBpdHMKKwkJICAgICBjdXJyZW50IGxvY2F0aW9uLiAgKi8KKwkJICBpcmVsLT5yX29mZnNldCAtPSAxOworCisJCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KKwkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgorCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkJICAqYWdhaW4gPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKKyAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCWZyZWUgKGZyZWVfY29udGVudHMpOworICAgICAgZWxzZQorCXsKKwkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwl9CisgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCisJZnJlZSAoZnJlZV9leHRzeW1zKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKKwl9CisgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9yZWxvY3MpOworICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfY29udGVudHMpOworICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCisKK3N0YXRpYyBib29sZWFuCittbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBpbnQgY291bnQ7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7CisgIGludCBzaG5keCwgaW5kZXg7CisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOworICBiZmRfdm1hIHRvYWRkcjsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisKKyAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7CisKKyAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKKworICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAorICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCisKKyAgaXJlbGFsaWduID0gTlVMTDsKKyAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7CisKKyAgaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsKKyAgaXJlbGVuZCA9IGlyZWwgKyBzZWMtPnJlbG9jX2NvdW50OworCisgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLworICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOworICBzZWMtPl9jb29rZWRfc2l6ZSAtPSBjb3VudDsKKworICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLworICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisgICAgeworICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCisgICAgICBpZiAoKGlyZWwtPnJfb2Zmc2V0ID4gYWRkcgorCSAgICYmIGlyZWwtPnJfb2Zmc2V0IDwgdG9hZGRyKSkKKwlpcmVsLT5yX29mZnNldCAtPSBjb3VudDsKKyAgICB9CisKKyAgLyogQWRqdXN0IHRoZSBsb2NhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KKyAgZXN5bSA9IGV4dHN5bXM7CisgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKKworICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKKwkgICYmIGlzeW0uc3RfdmFsdWUgPiBhZGRyCisJICAmJiBpc3ltLnN0X3ZhbHVlIDwgdG9hZGRyKQorCXsKKwkgIGlzeW0uc3RfdmFsdWUgLT0gY291bnQ7CisJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmaXN5bSwgZXN5bSk7CisJfQorICAgIH0KKworICAvKiBOb3cgYWRqdXN0IHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCisgIGVzeW0gPSBleHRzeW1zICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7CisgIGZvciAoaW5kZXggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpbmRleCsrKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKKworICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7CisgICAgICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmRleF07CisgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAorCSAgJiYgKChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCAoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYworCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+IGFkZHIKKwkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCisJeworCSAgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBhIHN5bWJvbCBleGlzdHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIGVsc2UgcmV0dXJuCisgICBmYWxzZS4gICovCitzdGF0aWMgYm9vbGVhbgorbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgc2VjLCBleHRzeW1zLCBhZGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgaW50IHNobmR4OworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOworCisgIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KKyAgZXN5bSA9IGV4dHN5bXM7CisgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKKworICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKKwkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7CisgIHN5bV9oYXNoX2VuZCA9IChzeW1faGFzaAorCQkgICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkKKwkJICAgICAtIHN5bXRhYl9oZHItPnNoX2luZm8pKTsKKyAgZm9yICg7IHN5bV9oYXNoIDwgc3ltX2hhc2hfZW5kOyBzeW1faGFzaCsrKQorICAgIHsKKyAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCisJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQorCXJldHVybiB0cnVlOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgIHdoaWNoIHVzZXMgbW4xMDIwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCisKK3N0YXRpYyBiZmRfYnl0ZSAqCittbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKKwkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKyAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKKyAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOworICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKKworICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQorICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLworICBpZiAocmVsb2NhdGVhYmxlCisgICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKKyAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCisJCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKKwkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCisJCQkJCQkgICAgICAgc3ltYm9scyk7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisKKyAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCisJICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOworCisgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKKyAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKKyAgICAgIGFzZWN0aW9uICoqc2VjcHA7CisgICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOworCisgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKKwlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKKyAgICAgIGVsc2UKKwl7CisJICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KKwkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKKwkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKKwkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCisJCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorCisgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCisJCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKKwkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7CisgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKKwkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KKwkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKKyAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOworICAgICAgc2VjcHAgPSBzZWN0aW9uczsKKyAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOworICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOworICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCisJeworCSAgYXNlY3Rpb24gKmlzZWM7CisKKwkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7CisKKwkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQorCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7CisJICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKKwkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKKwkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXaG8ga25vd3M/ICAqLworCSAgICAgIGlzZWMgPSBOVUxMOworCSAgICB9CisKKwkgICpzZWNwcCA9IGlzZWM7CisJfQorCisgICAgICBpZiAoISBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKKwkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKKwkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCisJZnJlZSAoc2VjdGlvbnMpOworICAgICAgc2VjdGlvbnMgPSBOVUxMOworICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKKwlmcmVlIChpbnRlcm5hbF9zeW1zKTsKKyAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOworICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQorCWZyZWUgKGV4dGVybmFsX3N5bXMpOworICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7CisgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCisJZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKyAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBkYXRhOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKKyAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQorICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7CisgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKKyAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKKyAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCisgICAgZnJlZSAoc2VjdGlvbnMpOworICByZXR1cm4gTlVMTDsKK30KKworCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9tbjEwMjAwX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLW1uMTAyMDAiCisjZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tbjEwMjAwCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX01OMTAyMDAKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKKworI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwltbjEwMjAwX2luZm9fdG9faG93dG8KKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCTAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbgltbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKwkJCQltbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKworI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1tMTAzMDAuYyBiL2JmZC9lbGYtbTEwMzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMDlhOAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGYtbTEwMzAwLmMKQEAgLTAsMCArMSwyODIxIEBACisvKiBNYXRzdXNoaXRhIDEwMzAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCisKK3N0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeQoreworICAvKiBUaGUgYmFzaWMgZWxmIGxpbmsgaGFzaCB0YWJsZSBlbnRyeS4gICovCisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7CisKKyAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcworICAgICBjYWxsZWQgZGlyZWN0bHkgKGllIGJ5IG5hbWUpLiAgKi8KKyAgdW5zaWduZWQgaW50IGRpcmVjdF9jYWxsczsKKworICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbidzIHN0YWNrCisgICAgIChpZiA8PSAyNTUgYnl0ZXMpLiAgV2Ugc3R1ZmYgdGhpcyBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMKKyAgICAgdG8gdGhpcyB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLgorCisgICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzdGFjayBhbGxvY2F0ZWQgYnkgbW92bSEgICovCisgIHVuc2lnbmVkIGNoYXIgc3RhY2tfc2l6ZTsKKworICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgYXJndW1lbnRzIChpZiBhbnkpIGZvciBtb3ZtIGluc3RydWN0aW9uCisgICAgIGluIHRoZSBwcm9sb2d1ZS4gIFdlIHN0dWZmIHRoaXMgdmFsdWUgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCisgICAgIHRvIHRoZSB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLiAgKi8KKyAgdW5zaWduZWQgY2hhciBtb3ZtX2FyZ3M7CisKKyAgLyogRm9yIGZ1bnRpb24gc3ltYm9scywgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZAorICAgICBieSB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbW92bV9hcmdzLCBidXQgd2UKKyAgICAgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlIHRvIGF2b2lkIGNvbXB1dGluZyBpdCBvdmVyIGFuZCBvdmVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBtb3ZtX3N0YWNrX3NpemU7CisKKy8qIFdoZW4gc2V0LCBjb252ZXJ0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgdGFyZ2V0IGludG8gImNhbGxzIgorICAgaW5zdHJ1Y3Rpb25zLiAgKi8KKyNkZWZpbmUgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMgMHgxCisKKy8qIFVzZWQgdG8gbWFyayBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBoYWQgcmVkdW5kYW50IHBhcnRzIG9mIHRoZWlyCisgICBwcm9sb2d1ZSBkZWxldGVkLiAgKi8KKyNkZWZpbmUgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTIDB4MgorICB1bnNpZ25lZCBjaGFyIGZsYWdzOworfTsKKworLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBtYWluIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBzbworICAgd2UgY2FuIHN0b3JlIHN0YXRlIHZhcmlhYmxlcyBhbmQgYSBzZWNvbmRhcnkgaGFzaCB0YWJsZSB3aXRob3V0CisgICByZXNvcnRpbmcgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gICovCitzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUKK3sKKyAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCisgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisKKyAgLyogQSBoYXNoIHRhYmxlIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgV2UgY291bGQgZGVyaXZlIGEgbmV3IGhhc2ggdGFibGUKKyAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSBpZiB3ZSB3YW50ZWQKKyAgICAgdG8gc2F2ZSBzb21lIG1lbW9yeS4gICovCisgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqc3RhdGljX2hhc2hfdGFibGU7CisKKyAgLyogUmFuZG9tIGxpbmtlciBzdGF0ZSBmbGFncy4gICovCisjZGVmaW5lIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEIDB4MQorICBjaGFyIGZsYWdzOworfTsKKworLyogRm9yIE1OMTAzMDAgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisvKiBHZXQgdGhlIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUocCkgXAorICAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKKworI2RlZmluZSBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKKyAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCisgICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUyAoKGJmZCAqKSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKK3N0YXRpYyB2b2lkIG1uMTAzMDBfaW5mb190b19ob3d0bworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKK3N0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKKwkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYXNlY3Rpb24gKm1uMTAzMDBfZWxmX2djX21hcmtfaG9vaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIEVsZl9JbnRlcm5hbF9SZWxhICosCisJICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7CitzdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOworc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIHZvaWQgY29tcHV0ZV9mdW5jdGlvbl9pbmZvCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKKworLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCisgICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCisjZGVmaW5lIFVTRV9SRUxBCisKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21uMTAzMDBfaG93dG9fdGFibGVbXSA9Cit7CisgIC8qIER1bW15IHJlbG9jYXRpb24uICBEb2VzIG5vdGhpbmcuICAqLworICBIT1dUTyAoUl9NTjEwMzAwX05PTkUsCisJIDAsCisJIDIsCisJIDE2LAorCSBmYWxzZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKKwkgIlJfTU4xMDMwMF9OT05FIiwKKwkgZmFsc2UsCisJIDAsCisJIDAsCisJIGZhbHNlKSwKKyAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jLiAgKi8KKyAgSE9XVE8gKFJfTU4xMDMwMF8zMiwKKwkgMCwKKwkgMiwKKwkgMzIsCisJIGZhbHNlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMzAwXzMyIiwKKwkgZmFsc2UsCisJIDB4ZmZmZmZmZmYsCisJIDB4ZmZmZmZmZmYsCisJIGZhbHNlKSwKKyAgLyogU3RhbmRhcmQgMTYgYml0IHJlbG9jLiAgKi8KKyAgSE9XVE8gKFJfTU4xMDMwMF8xNiwKKwkgMCwKKwkgMSwKKwkgMTYsCisJIGZhbHNlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMzAwXzE2IiwKKwkgZmFsc2UsCisJIDB4ZmZmZiwKKwkgMHhmZmZmLAorCSBmYWxzZSksCisgIC8qIFN0YW5kYXJkIDggYml0IHJlbG9jLiAgKi8KKyAgSE9XVE8gKFJfTU4xMDMwMF84LAorCSAwLAorCSAwLAorCSA4LAorCSBmYWxzZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKKwkgIlJfTU4xMDMwMF84IiwKKwkgZmFsc2UsCisJIDB4ZmYsCisJIDB4ZmYsCisJIGZhbHNlKSwKKyAgLyogU3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMMzIsCisJIDAsCisJIDIsCisJIDMyLAorCSB0cnVlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMzAwX1BDUkVMMzIiLAorCSBmYWxzZSwKKwkgMHhmZmZmZmZmZiwKKwkgMHhmZmZmZmZmZiwKKwkgdHJ1ZSksCisgIC8qIFN0YW5kYXJkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KKyAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDE2LAorCSAwLAorCSAxLAorCSAxNiwKKwkgdHJ1ZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKKwkgIlJfTU4xMDMwMF9QQ1JFTDE2IiwKKwkgZmFsc2UsCisJIDB4ZmZmZiwKKwkgMHhmZmZmLAorCSB0cnVlKSwKKyAgLyogU3RhbmRhcmQgOCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCisgIEhPV1RPIChSX01OMTAzMDBfUENSRUw4LAorCSAwLAorCSAwLAorCSA4LAorCSB0cnVlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUl9NTjEwMzAwX1BDUkVMOCIsCisJIGZhbHNlLAorCSAweGZmLAorCSAweGZmLAorCSB0cnVlKSwKKworICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLworICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCisgIEhPV1RPIChSX01OMTAzMDBfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTU4xMDMwMF9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLworICBIT1dUTyAoUl9NTjEwMzAwXzI0LAorCSAwLAorCSAyLAorCSAyNCwKKwkgZmFsc2UsCisJIDAsCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJSX01OMTAzMDBfMjQiLAorCSBmYWxzZSwKKwkgMHhmZmZmZmYsCisJIDB4ZmZmZmZmLAorCSBmYWxzZSksCisKK307CisKK3N0cnVjdCBtbjEwMzAwX3JlbG9jX21hcAoreworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCBtbjEwMzAwX3JlbG9jX21hcFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMzAwX05PTkUsIH0sCisgIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAzMDBfMzIsIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAzMDBfMTYsIH0sCisgIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDMwMF84LCB9LAorICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMzIsIH0sCisgIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAzMDBfUENSRUwxNiwgfSwKKyAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMOCwgfSwKKyAgeyBCRkRfUkVMT0NfMjQsIFJfTU4xMDMwMF8yNCwgfSwKKyAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZIH0sCit9OworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOworICAgICAgIGkgPCBzaXplb2YgKG1uMTAzMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTsKKyAgICAgICBpKyspCisgICAgeworICAgICAgaWYgKG1uMTAzMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKKwlyZXR1cm4gJmVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW21uMTAzMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMzAwIEVMRiByZWxvYy4gICovCisKK3N0YXRpYyB2b2lkCittbjEwMzAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OworeworICB1bnNpZ25lZCBpbnQgcl90eXBlOworCisgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOworICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX01OMTAzMDBfTUFYKTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbW4xMDMwMF9ob3d0b190YWJsZVtyX3R5cGVdOworfQorCisvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCisgICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQorICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOworCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOworICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKKyAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOworCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJeworCS8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKwkgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisJY2FzZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVDoKKwkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCS8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQorCSAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgorCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KKyAgIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgYXNlY3Rpb24gKgorbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgaWYgKGggIT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgorCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247CisKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKwkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKKwkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisJCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCisJeworCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKKwl9CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAorCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKKwkJCQkgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBiZmRfdm1hIGFkZGVuZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzeW1fc2VjOworICAgICBpbnQgaXNfbG9jYWw7Cit7CisgIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7CisgIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OworCisgIHN3aXRjaCAocl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfTU4xMDMwMF9OT05FOgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMzAwXzMyOgorICAgICAgdmFsdWUgKz0gYWRkZW5kOworICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMzAwXzI0OgorICAgICAgdmFsdWUgKz0gYWRkZW5kOworCisgICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDAwMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUgJiAweGZmLCBoaXRfZGF0YSk7CisgICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDgpICYgMHhmZiwgaGl0X2RhdGEgKyAxKTsKKyAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCAodmFsdWUgPj4gMTYpICYgMHhmZiwgaGl0X2RhdGEgKyAyKTsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfTU4xMDMwMF8xNjoKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKworICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgY2FzZSBSX01OMTAzMDBfODoKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKworICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMODoKKyAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICB2YWx1ZSAtPSBvZmZzZXQ7CisgICAgICB2YWx1ZSArPSBhZGRlbmQ7CisKKyAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgY2FzZSBSX01OMTAzMDBfUENSRUwxNjoKKyAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICB2YWx1ZSAtPSBvZmZzZXQ7CisgICAgICB2YWx1ZSArPSBhZGRlbmQ7CisKKyAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDMyOgorICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIHZhbHVlIC09IG9mZnNldDsKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKworICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6CisgICAgY2FzZSBSX01OMTAzMDBfR05VX1ZURU5UUlk6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOworICAgIH0KK30KKworDAorLyogUmVsb2NhdGUgYW4gTU4xMDMwMCBFTEYgc2VjdGlvbi4gICovCitzdGF0aWMgYm9vbGVhbgorbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiopCisJCSAoZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkpOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKyAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOworICAgICAgaG93dG8gPSBlbGZfbW4xMDMwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgLyogSnVzdCBza2lwIHRoZSB2dGFibGUgZ2MgcmVsb2NzLiAgKi8KKyAgICAgIGlmIChyX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQKKwkgIHx8IHJfdHlwZSA9PSBSX01OMTAzMDBfR05VX1ZURU5UUlkpCisJY29udGludWU7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKKwkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQorCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQl7CisJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkJfQorCSAgICB9CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLworICAgICAgaCA9IE5VTEw7CisgICAgICBzeW0gPSBOVUxMOworICAgICAgc2VjID0gTlVMTDsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7CisJICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKKwkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAgIHJlbG9jYXRpb24gPSAwOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIHIgPSBtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAorCQkJCQkgICBpbnB1dF9zZWN0aW9uLAorCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKKwkJCQkJICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKKwkJCQkJICAgaW5mbywgc2VjLCBoID09IE5VTEwpOworCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgY29uc3QgY2hhciAqbmFtZTsKKwkgIGNvbnN0IGNoYXIgKm1zZyA9IChjb25zdCBjaGFyICopMDsKKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKKwkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCisJCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJICAgIH0KKworCSAgc3dpdGNoIChyKQorCSAgICB7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKKwkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOworCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOworCisJICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKKwkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOworCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOworCisJICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKKwkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOworCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCisJICAgIGNvbW1vbl9lcnJvcjoKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKKwkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCBpbml0aWFsaXppbmcgb25lIGhhc2ggdGFibGUgZW50cnkuICAqLworc3RhdGljIGJvb2xlYW4KK2VsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkgKGdlbl9lbnRyeSwgaW5fYXJncykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7CisgICAgIFBUUiBpbl9hcmdzOworeworICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmVudHJ5OworICB1bnNpZ25lZCBpbnQgYnl0ZV9jb3VudCA9IDA7CisKKyAgZW50cnkgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OworCisgIC8qIElmIHdlIGFscmVhZHkga25vdyB3ZSB3YW50IHRvIGNvbnZlcnQgImNhbGwiIHRvICJjYWxscyIgZm9yIGNhbGxzCisgICAgIHRvIHRoaXMgc3ltYm9sLCB0aGVuIHJldHVybiBub3cuICAqLworICBpZiAoZW50cnktPmZsYWdzID09IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHRoZXJlIGFyZSBubyBuYW1lZCBjYWxscyB0byB0aGlzIHN5bWJvbCwgb3IgdGhlcmUncyBub3RoaW5nIHdlCisgICAgIGNhbiBtb3ZlIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4KKyAgICAgbm90ZSB0aGF0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byAiY2FsbHMiCisgICAgIGluc3RydWN0aW9ucyBhbmQgcmV0dXJuLiAgKi8KKyAgaWYgKGVudHJ5LT5kaXJlY3RfY2FsbHMgPT0gMAorICAgICAgfHwgKGVudHJ5LT5zdGFja19zaXplID09IDAgJiYgZW50cnktPm1vdm1fYXJncyA9PSAwKSkKKyAgICB7CisgICAgICAvKiBNYWtlIGEgbm90ZSB0aGF0IHdlIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgorCSBpbnN0cnVjdGlvbnMgZm9yIGNhbGxzIHRvIHRoaXMgc3ltYm9sLiAgKi8KKyAgICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBXZSBtYXkgYmUgYWJsZSB0byBtb3ZlIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvCisgICAgIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBDb3VudCBob3cgbWFueSBieXRlcyB3ZSBtaWdodCBiZSBhYmxlIHRvCisgICAgIGVsaW1pbmF0ZSBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8KKworICAvKiBBIG1vdm0gaW5zdHJ1Y3Rpb24gaXMgdHdvIGJ5dGVzLiAgKi8KKyAgaWYgKGVudHJ5LT5tb3ZtX2FyZ3MpCisgICAgYnl0ZV9jb3VudCArPSAyOworCisgIC8qIENvdW50IHRoZSBpbnNuIHRvIGFsbG9jYXRlIHN0YWNrIHNwYWNlIHRvby4gICovCisgIGlmIChlbnRyeS0+c3RhY2tfc2l6ZSA+IDAgJiYgZW50cnktPnN0YWNrX3NpemUgPD0gMTI4KQorICAgIGJ5dGVfY291bnQgKz0gMzsKKyAgZWxzZSBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDwgMjU2KQorICAgIGJ5dGVfY291bnQgKz0gNDsKKworICAvKiBJZiB1c2luZyAiY2FsbCIgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIGNvZGUsIHRoZW4gdHVybiBhbGwKKyAgICAgdGhlIGFzc29jaWF0ZWQgImNhbGwiIGluc3RydWN0aW9ucyBpbnRvICJjYWxscyIgaW5zdHJ1dGlvbnMuICAqLworICBpZiAoYnl0ZV9jb3VudCA8IGVudHJ5LT5kaXJlY3RfY2FsbHMpCisgICAgZW50cnktPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOworCisgIC8qIFRoaXMgcm91dGluZSBuZXZlciBmYWlscy4gICovCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMzAwLgorCisgICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAzMDA6CisKKwkqIGNhbGxzOjMyIC0+IGNhbGxzOjE2IAkJCQkJICAgMiBieXRlcworCSogY2FsbDozMiAgLT4gY2FsbDoxNgkJCQkJICAgMiBieXRlcworCisJKiBjYWxsOjMyIC0+IGNhbGxzOjMyCQkJCQkgICAxIGJ5dGUKKwkqIGNhbGw6MTYgLT4gY2FsbHM6MTYJCQkJCSAgIDEgYnl0ZQorCQkqIFRoZXNlIGFyZSBkb25lIGFueXRpbWUgdXNpbmcgImNhbGxzIiB3b3VsZCByZXN1bHQKKwkJaW4gc21hbGxlciBjb2RlLCBvciB3aGVuIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUKKwkJbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4KKworCSogY2FsbDozMgkJCQkJCSAgIHZhcmllcworCSogY2FsbDoxNgorCQkqIEluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBjYW4gbW92ZSBpbnN0cnVjdGlvbnMKKwkJZnJvbSBhIGZ1bmN0aW9uIHByb2xvZ3VlIGludG8gYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCisJCVRoaXMgaXMgb25seSBkb25lIGlmIHRoZSByZXN1bHRpbmcgY29kZSBpcyBubyBsYXJnZXIKKwkJdGhhbiB0aGUgb3JpZ2luYWwgY29kZS4KKworCisJKiBqbXA6MzIgLT4gam1wOjE2CQkJCQkgICAyIGJ5dGVzCisJKiBqbXA6MTYgLT4gYnJhOjgJCQkJCSAgIDEgYnl0ZQorCisJCSogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoCisJCWFyb3VuZCB0aGUganVtcC9icmEsIHdlIG1heSBiZSBhYmxlIHRvIHJldmVyc2UgaXRzIGNvbmRpdGlvbgorCQlhbmQgY2hhbmdlIGl0cyB0YXJnZXQgdG8gdGhlIGp1bXAncyB0YXJnZXQuICBUaGUganVtcC9icmEKKwkJY2FuIHRoZW4gYmUgZGVsZXRlZC4JCQkJICAgMiBieXRlcworCisJKiBtb3YgYWJzMzIgLT4gbW92IGFiczE2CQkJCSAgIDEgb3IgMiBieXRlcworCisJKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMzIgY2FuIHJlbGF4IHRvIGltbTE2ICAxIG9yIDIgYnl0ZXMKKwktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBpbW0xNiBjYW4gcmVsYXggdG8gaW1tOCAgIDEgb3IgMiBieXRlcworCisJKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDMyIGNhbiByZWxheCB0byBkMTYJICAgMSBvciAyIGJ5dGVzCisJLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIG9yIDIgYnl0ZXMKKworCVdlIGRvbid0IGhhbmRsZSBpbW0xNi0+aW1tOCBvciBkMTYtPmQ4IGFzIHRoZXkncmUgdmVyeSByYXJlCisJYW5kIHNvbWV3aGF0IG1vcmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuICAqLworCitzdGF0aWMgYm9vbGVhbgorbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGJvb2xlYW4gKmFnYWluOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKKyAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKKyAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7CisgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKKworICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KKyAgKmFnYWluID0gZmFsc2U7CisKKyAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG1uMTAzMDAgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCisgIGhhc2hfdGFibGUgPSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gZWFjaCBoYXNoIHRhYmxlIGVudHJ5IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLworICBpZiAoKGhhc2hfdGFibGUtPmZsYWdzICYgTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQpID09IDApCisgICAgeworICAgICAgYmZkICppbnB1dF9iZmQ7CisKKyAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGlucHV0IGJmZHMuICAqLworICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7CisJICAgaW5wdXRfYmZkICE9IE5VTEw7CisJICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCisJeworCSAgYXNlY3Rpb24gKnNlY3Rpb247CisKKwkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCisJICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKworICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLworICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQorICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisgICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQorICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKKyAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKKyAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKyAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQorICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgICAgICAgfQorCisJICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KKwkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7CisJICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKKwkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7CisJICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOworCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOworCSAgICAgIGNoYXIgKm5ld19uYW1lOworCSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7CisKKwkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLworCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKKwkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7CisJICAgICAgZWxzZSBpZiAoc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCisJCXsKKwkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisJCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKiliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpOworCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOworCisJCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc2VjdGlvbiwKKwkJCQkJCSBjb250ZW50cywgKGZpbGVfcHRyKSAwLAorCQkJCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbnRlbnRzID0gTlVMTDsKKwkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKwkJfQorCisJICAgICAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KKwkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCisJCSAgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKKwkJeworCisJCSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KKwkJICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCisJCQkJICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAorCQkJCSAgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAorCQkJCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKKwkJICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCQkgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisKKwkJICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLworCQkgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7CisJCSAgaXJlbGVuZCA9IGlyZWwgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKKwkJICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKKwkJICAgIHsKKwkJICAgICAgbG9uZyByX3R5cGU7CisJCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKKwkJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOworCisJCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKKwkJICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOworCisJCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfTU4xMDMwMF9NQVgpCisJCQlnb3RvIGVycm9yX3JldHVybjsKKworCQkgICAgICAvKiBXZSBuZWVkIHRoZSBuYW1lIGFuZCBoYXNoIHRhYmxlIGVudHJ5IG9mIHRoZSB0YXJnZXQKKwkJCSBzeW1ib2whICAqLworCQkgICAgICBoYXNoID0gTlVMTDsKKwkJICAgICAgc3ltID0gTlVMTDsKKwkJICAgICAgc3ltX3NlYyA9IE5VTEw7CisKKwkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCQkJeworCQkJICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCisJCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKKworCQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwKKwkJCQkJCSAgICBleHRzeW1zICsgcl9pbmRleCwgJmlzeW0pOworCisJCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKKwkJCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAKKwkJCQkgICAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwkJCSAgICBzeW1fc2VjCisJCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsCisJCQkJCQkJICAgIGlzeW0uc3Rfc2huZHgpOworCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCisJCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKKwkJCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKworCQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKKwkJCQkJCQkgICBzeW10YWJfaGRyLT5zaF9saW5rLAorCQkJCQkJCSAgIGlzeW0uc3RfbmFtZSk7CisKKwkJCSAgLyogSWYgaXQgaXNuJ3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBkb24ndCBjYXJlCisJCQkgICAgIGFib3V0IGl0LiAgKi8KKwkJCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkgICAgICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSAhPSBTVFRfRlVOQykKKwkJCSAgICBjb250aW51ZTsKKworCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCisJCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLworCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOworCQkJICBpZiAobmV3X25hbWUgPT0gMCkKKwkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKKwkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKKworCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQorCQkJCSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCisJCQkJCQkgICAgICAgICBzeW1fbmFtZSwgdHJ1ZSwKKwkJCQkJCSAgICAgICAgIHRydWUsIGZhbHNlKTsKKwkJCSAgZnJlZSAobmV3X25hbWUpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIHJfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKKwkJCQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX2luZGV4XTsKKwkJCX0KKworCQkgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBhICJjYWxsIiBpbnN0cnVjdGlvbiwgdGhlbiB3ZQorCQkJIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgorCQkJIGluc3RydWN0aW9ucy4gICovCisJCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwKKwkJCQkJY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCQkgICAgICBpZiAoY29kZSAhPSAweGRkICYmIGNvZGUgIT0gMHhjZCkKKwkJCWhhc2gtPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOworCisJCSAgICAgIC8qIElmIHRoaXMgaXMgYSBqdW1wL2NhbGwsIHRoZW4gYnVtcCB0aGUgZGlyZWN0X2NhbGxzCisJCQkgY291bnRlci4gIEVsc2UgZm9yY2UgImNhbGwiIHRvICJjYWxscyIgY29udmVyc2lvbnMuICAqLworCQkgICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9QQ1JFTDMyCisJCQkgIHx8IHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwxNikKKwkJCWhhc2gtPmRpcmVjdF9jYWxscysrOworCQkgICAgICBlbHNlCisJCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogTm93IGxvb2sgYXQgdGhlIGFjdHVhbCBjb250ZW50cyB0byBnZXQgdGhlIHN0YWNrIHNpemUsCisJCSBhbmQgYSBsaXN0IG9mIHdoYXQgcmVnaXN0ZXJzIHdlcmUgc2F2ZWQgaW4gdGhlIHByb2xvZ3VlCisJCSAoaWUgbW92bV9hcmdzKS4gICovCisJICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQorCQl7CisKKwkJICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOworCQkgIGludCBpZHgsIHNobmR4OworCisJCSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGlucHV0X2JmZCwKKwkJCQkJCQkgICAgIHNlY3Rpb24pOworCisKKwkJICAvKiBMb29rIGF0IGVhY2ggZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24gYW5kCisJCSAgICAgdXBkYXRlIGluZm8gZm9yIHRoYXQgZnVuY3Rpb24uICAqLworCQkgIGVzeW0gPSBleHRzeW1zOworCQkgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkJICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKKwkJICAgIHsKKwkJICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisJCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7CisJCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4CisJCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DKQorCQkJeworCQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCisJCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwCisJCQkJICAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCisJCQkgICAgc3ltX3NlYworCQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLAorCQkJCQkJCSAgICBpc3ltLnN0X3NobmR4KTsKKwkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQorCQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCisJCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisKKwkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCisJCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKKwkJCQkJCQlpc3ltLnN0X25hbWUpOworCisJCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKKwkJCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCisJCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7CisJCQkgIGlmIChuZXdfbmFtZSA9PSAwKQorCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOworCQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOworCisJCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCisJCQkJICAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCisJCQkJCQkgICAgICAgICAgc3ltX25hbWUsIHRydWUsCisJCQkJCQkgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworCQkJICBmcmVlIChuZXdfbmFtZSk7CisJCQkgIGNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAorCQkJCQkgICAgICAgICBpc3ltLnN0X3ZhbHVlLCBjb250ZW50cyk7CisJCQl9CisJCSAgICB9CisKKwkJICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87CisJCSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZQorCQkJCSAgICAgICAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7CisJCSAgZm9yIChpZHggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpZHgrKykKKwkJICAgIHsKKwkJICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisJCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7CisJCSAgICAgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCisJCQkgICAgICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaWR4XTsKKwkJICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKKwkJCSAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgPT0gU1RUX0ZVTkMKKwkJCSAgJiYgKGhhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWN0aW9uCisJCQkgICYmICgoaGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJICAgICAgfHwgKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQorCQkJY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChpbnB1dF9iZmQsIGhhc2gsCisJCQkJCSAgICAgICAoaGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwKKwkJCQkJICAgICAgIGNvbnRlbnRzKTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHJlbG9jcy4gICovCisJICAgICAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisJCXsKKwkJICBmcmVlIChmcmVlX3JlbG9jcyk7CisJCSAgZnJlZV9yZWxvY3MgPSBOVUxMOworCQl9CisKKwkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgY29udGVudHMuICAqLworCSAgICAgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisJCXsKKwkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCQkgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgICB9CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisJCX0KKwkgICAgfQorCisJICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgc3ltYm9scy4gICovCisJICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCQlmcmVlIChmcmVlX2V4dHN5bXMpOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLworCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKKwkJfQorCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIE5vdyBpdGVyYXRlIG9uIGVhY2ggc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIGFuZCBwZXJmb3JtCisJIHRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiBzdGVwcyBvbiBlYWNoLiAgKi8KKyAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlIChoYXNoX3RhYmxlLAorCQkJCQllbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5LAorCQkJCQlOVUxMKTsKKyAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlIChoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZSwKKwkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKKwkJCQkJTlVMTCk7CisKKyAgICAgIC8qIEFsbCBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGFyZSBmdWxseSBpbml0aWFsaXplZC4gICovCisgICAgICBoYXNoX3RhYmxlLT5mbGFncyB8PSBNTjEwMzAwX0hBU0hfRU5UUklFU19JTklUSUFMSVpFRDsKKworICAgICAgLyogTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgYmVlbiBpbml0aWFsaXplZCwgZ28gdGhyb3VnaCBlYWNoCisJIGNvZGUgc2VjdGlvbiBhbmQgZGVsZXRlIGFueSBwcm9sb2d1ZSBpbnNucyB3aGljaCB3aWxsIGJlCisJIHJlZHVuZGFudCBiZWNhdXNlIHRoZWlyIG9wZXJhdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkKKwkgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7CisJICAgaW5wdXRfYmZkICE9IE5VTEw7CisJICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCisJeworCSAgYXNlY3Rpb24gKnNlY3Rpb247CisKKwkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCisJICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKworICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLworICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQorICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisgICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQorICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKKyAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKKyAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKyAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQorICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgICAgICAgfQorCisJICAvKiBXYWxrIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KKwkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7CisJICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKKwkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCisJICAgIHsKKwkgICAgICBpbnQgc2huZHg7CisJICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKKwkgICAgICBpbnQgaWR4OworCisJICAgICAgLyogU2tpcCBub24tY29kZSBzZWN0aW9ucyBhbmQgZW1wdHkgc2VjdGlvbnMuICAqLworCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCB8fCBzZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKKwkJY29udGludWU7CisKKwkgICAgICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKKwkJeworICAgICAgICAgICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KKyAgICAgICAgICAgICAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOworICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICAgICAgICAgICAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCisgICAgICAgICAgICAgICAgICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQl9CisKKwkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLworCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKKwkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLworCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKKwkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKKworCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHNlY3Rpb24sCisJCQkJCQkgY29udGVudHMsIChmaWxlX3B0cikgMCwKKwkJCQkJCSBzZWN0aW9uLT5fcmF3X3NpemUpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCisJICAgICAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGlucHV0X2JmZCwgc2VjdGlvbik7CisKKwkgICAgICAvKiBOb3cgbG9vayBmb3IgYW55IGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiB3aGljaCBuZWVkcworCQkgaW5zbnMgZGVsZXRlZCBmcm9tIGl0cyBwcm9sb2d1ZS4gICovCisJICAgICAgZXN5bSA9IGV4dHN5bXM7CisJICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOworCSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQorCQl7CisJCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCQkgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7CisJCSAgYXNlY3Rpb24gKnN5bV9zZWM7CisJCSAgY29uc3QgY2hhciAqc3ltX25hbWU7CisJCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKwkJICBjaGFyICpuZXdfbmFtZTsKKworCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7CisKKwkJICBpZiAoaXN5bS5zdF9zaG5keCAhPSBzaG5keCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQorCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCisJCSAgICBzeW1fc2VjCisJCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bS5zdF9zaG5keCk7CisJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQorCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQorCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisKKwkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKKwkJCQkJCQlzeW10YWJfaGRyLT5zaF9saW5rLAorCQkJCQkJCWlzeW0uc3RfbmFtZSk7CisKKwkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCisJCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCisJCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKKwkJICBpZiAobmV3X25hbWUgPT0gMCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOworCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7CisKKwkJICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKKwkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAorCQkJCQkgICAgICAgICAgc3ltX25hbWUsIGZhbHNlLAorCQkJCQkgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKworCQkgIGZyZWUgKG5ld19uYW1lKTsKKwkJICBpZiAoc3ltX2hhc2ggPT0gTlVMTCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgaWYgKCEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpCisJCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTKSkKKwkJICAgIHsKKwkJICAgICAgaW50IGJ5dGVzID0gMDsKKworCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGluZ3MuICAqLworCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisKKwkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopZXh0c3ltczsKKwkJICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgICAgICAvKiBDb3VudCBob3cgbWFueSBieXRlcyB3ZSdyZSBnb2luZyB0byBkZWxldGUuICAqLworCQkgICAgICBpZiAoc3ltX2hhc2gtPm1vdm1fYXJncykKKwkJCWJ5dGVzICs9IDI7CisKKwkJICAgICAgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDw9IDEyOCkKKwkJCWJ5dGVzICs9IDM7CisJCSAgICAgIGVsc2UgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplCisJCQkgICAgICAgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPCAyNTYpCisJCQlieXRlcyArPSA0OworCisJCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBkZWxldGVkIHByb2xvZ3VlIGJ5dGVzIGZvciB0aGlzCisJCQkgZnVuY3Rpb24uICAqLworCQkgICAgICBzeW1faGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTOworCisJCSAgICAgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLworCQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoaW5wdXRfYmZkLAorCQkJCQkJCSAgIHNlY3Rpb24sCisJCQkJCQkJICAgaXN5bS5zdF92YWx1ZSwKKwkJCQkJCQkgICBieXRlcykpCisJCQlnb3RvIGVycm9yX3JldHVybjsKKworCQkgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZC4gIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dAorCQkJIG1heSBsZWFkIHRvIG1vcmUgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCisJCSAgICAgICphZ2FpbiA9IHRydWU7CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIExvb2sgZm9yIGFueSBnbG9iYWwgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiB3aGljaAorCQkgbmVlZCBpbnNucyBkZWxldGVkIGZyb20gdGhlaXIgcHJvbG9ndWVzLiAgKi8KKwkgICAgICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87CisJICAgICAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZQorCQkJCSAgIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKKwkgICAgICBmb3IgKGlkeCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGlkeCsrKQorCQl7CisJCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCQkgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7CisKKwkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOworCQkgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQorCQkJICAgICAgIChlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpZHhdKTsKKwkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAorCQkgICAgICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWN0aW9uCisJCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpCisJCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTKSkKKwkJICAgIHsKKwkJICAgICAgaW50IGJ5dGVzID0gMDsKKworCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGluZ3MuICAqLworCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisKKwkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopZXh0c3ltczsKKwkJICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgICAgICAvKiBDb3VudCBob3cgbWFueSBieXRlcyB3ZSdyZSBnb2luZyB0byBkZWxldGUuICAqLworCQkgICAgICBpZiAoc3ltX2hhc2gtPm1vdm1fYXJncykKKwkJCWJ5dGVzICs9IDI7CisKKwkJICAgICAgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDw9IDEyOCkKKwkJCWJ5dGVzICs9IDM7CisJCSAgICAgIGVsc2UgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplCisJCQkgICAgICAgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPCAyNTYpCisJCQlieXRlcyArPSA0OworCisJCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBkZWxldGVkIHByb2xvZ3VlIGJ5dGVzIGZvciB0aGlzCisJCQkgZnVuY3Rpb24uICAqLworCQkgICAgICBzeW1faGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTOworCisJCSAgICAgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLworCQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoaW5wdXRfYmZkLAorCQkJCQkJCSAgIHNlY3Rpb24sCisJCQkJCQkJICAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlLAorCQkJCQkJCSAgIGJ5dGVzKSkKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkLiAgTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0CisJCQkgbWF5IGxlYWQgdG8gbW9yZSByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KKwkJICAgICAgKmFnYWluID0gdHJ1ZTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHJlbG9jcy4gICovCisJICAgICAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisJCXsKKwkJICBmcmVlIChmcmVlX3JlbG9jcyk7CisJCSAgZnJlZV9yZWxvY3MgPSBOVUxMOworCQl9CisKKwkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgY29udGVudHMuICAqLworCSAgICAgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisJCXsKKwkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCQkgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgICB9CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisJCX0KKwkgICAgfQorCisJICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgc3ltYm9scy4gICovCisJICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCQlmcmVlIChmcmVlX2V4dHN5bXMpOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLworCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKKwkJfQorCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorCisKKyAgLyogKFJlKWluaXRpYWxpemUgZm9yIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzaG9ydGVuaW5nL3JlbGF4aW5nIHBhc3MuICAqLworICBjb250ZW50cyA9IE5VTEw7CisgIGV4dHN5bXMgPSBOVUxMOworICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBmcmVlX3JlbG9jcyA9IE5VTEw7CisgIGZyZWVfY29udGVudHMgPSBOVUxMOworICBmcmVlX2V4dHN5bXMgPSBOVUxMOworCisgIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIGEgcmVsb2NhdGVhYmxlIGxpbmssIGlmCisgICAgIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHJlbG9jcywgb3IgaWYgdGhpcyBpcyBub3QgYQorICAgICBjb2RlIHNlY3Rpb24uICAqLworICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCisgICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDAKKyAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCisgICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KKyAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCisgICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisKKyAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KKyAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcworCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAorCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKyAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKworICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KKyAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKKyAgICB7CisgICAgICBiZmRfdm1hIHN5bXZhbDsKKyAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7CisKKyAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCisJIHRoaXMgcmVsb2MuICAqLworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfTk9ORQorCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF84CisJICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX01BWCkKKwljb250aW51ZTsKKworICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KKyAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCXsKKwkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLworCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCisJICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisJICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOworCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7CisKKwkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCisJCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLworICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwl7CisJICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KKwkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQorCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KKwkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7CisJICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKKwkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCisJCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCisgICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKKwkgIGFzZWN0aW9uICpzeW1fc2VjOworCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKwkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOworCSAgY2hhciAqbmV3X25hbWU7CisKKwkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KKwkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKKwkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCSAgICAmaXN5bSk7CisKKwkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKKwkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwkgICAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKKwkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKKwkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCisJICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCisJICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQorCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQpOworCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAorCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKKwkJCQkJCSAgICAgIGlzeW0uc3RfbmFtZSk7CisKKwkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKKwkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLworCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKKwkgIGlmIChuZXdfbmFtZSA9PSAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOworCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKKworCSAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKKwkJZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKKwkJCQkgICAgICBzeW1fbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJICBmcmVlIChuZXdfbmFtZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5keDsKKworCSAgLyogQW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KKwkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87CisJICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQorCQkoZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdKTsKKwkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7CisJICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAorIAkJc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQorIAkJcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBzeW12YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCisJCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwl9CisKKyAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgorCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQorCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcworCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKKwkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7CisJIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCisJIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KKworICAgICAgLyogVHJ5IHRvIHR1cm4gYSAzMmJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKKwkgYnJhbmNoL2NhbGwsIGFsc28gZGVhbCB3aXRoICJjYWxsIiAtPiAiY2FsbHMiIGNvbnZlcnNpb25zIGFuZAorCSBpbnNlcnRpb24gb2YgcHJvbG9ndWUgZGF0YSBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMuICAqLworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwzMikKKwl7CisJICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOworCisJICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKKwkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLworCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOworCisJICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLworCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLworCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCisJCXsKKwkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAorCQkgICAgIGV0Yy4gICovCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisJCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKKworCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLworCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7CisJCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKKworCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KKwkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMywgMSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgorCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkJICAqYWdhaW4gPSB0cnVlOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGgpCisJICAgIHsKKwkgICAgICAvKiBXZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgc29tZSBkYXRhCisJCSBmcm9tIHRhcmdldCBmdW5jdGlvbiBmaWxsZWQgaW4uICAqLworCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKKworCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KKwkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkgICAgICAvKiBJbnNlcnQgZGF0YSBmcm9tIHRoZSB0YXJnZXQgZnVuY3Rpb24gaW50byB0aGUgImNhbGwiCisJCSBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICAqLworCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCisJCXsKKwkJICBiZmRfcHV0XzggKGFiZmQsIGgtPm1vdm1fYXJncywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOworCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+c3RhY2tfc2l6ZSArIGgtPm1vdm1fc3RhY2tfc2l6ZSwKKwkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDUpOworCQl9CisJICAgIH0KKworCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLworCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKKwkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOworCisJICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKKwkgICAgIDB4N2ZmZiArIDIgYXMgdGhlIHRhcmdldCB3aWxsIGJlIHR3byBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCisJICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KKwkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAwMSAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7CisKKwkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCisJICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJICAgICAgaWYgKGNvZGUgIT0gMHhkYyAmJiBjb2RlICE9IDB4ZGQgJiYgY29kZSAhPSAweGZmKQorCQljb250aW51ZTsKKworCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCisJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJICAgICAgaWYgKGNvZGUgPT0gMHhkYykKKwkJYmZkX3B1dF84IChhYmZkLCAweGNjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisJICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGRkKQorCQliZmRfcHV0XzggKGFiZmQsIDB4Y2QsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKKwkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmYpCisJCWJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOworCisJICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCisJICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkJICAgUl9NTjEwMzAwX1BDUkVMMTYpOworCisJICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KKwkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkgICAgICAqYWdhaW4gPSB0cnVlOworCSAgICB9CisJfQorCisgICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQorCSBicmFuY2guICAqLworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwxNikKKwl7CisJICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOworCisJICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKKwkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLworCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOworCisJICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLworCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLworCSAgICAgIGlmIChjb2RlID09IDB4Y2QpCisJCXsKKwkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAorCQkgICAgIGV0Yy4gICovCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisJCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKKworCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLworCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7CisJCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKKworCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KKwkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgorCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkJICAqYWdhaW4gPSB0cnVlOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGgpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7CisKKwkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCisJICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJICAgICAgLyogSW5zZXJ0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGludG8gdGhlICJjYWxsIgorCQkgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgKi8KKwkgICAgICBpZiAoY29kZSA9PSAweGNkKQorCQl7CisJCSAgYmZkX3B1dF84IChhYmZkLCBoLT5tb3ZtX2FyZ3MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAyKTsKKwkJICBiZmRfcHV0XzggKGFiZmQsIGgtPnN0YWNrX3NpemUgKyBoLT5tb3ZtX3N0YWNrX3NpemUsCisJCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAzKTsKKwkJfQorCSAgICB9CisKKwkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KKwkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7CisJICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKKworCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiA4IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKKwkgICAgIDB4N2YgKyAxIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSBvbmUgYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQorCSAgICAgYWJsZSB0byByZWxheC4gICovCisJICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwICYmIChsb25nKXZhbHVlID4gLTB4ODApCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7CisKKwkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCisJICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJICAgICAgaWYgKGNvZGUgIT0gMHhjYykKKwkJY29udGludWU7CisKKwkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLworCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisKKwkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOworCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKKwkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOworCisJICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLworCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCisJICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkJICAgUl9NTjEwMzAwX1BDUkVMOCk7CisKKwkgICAgICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCisJICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCisJCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCisJICAgICAgKmFnYWluID0gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgLyogVHJ5IHRvIGVsaW1pbmF0ZSBhbiB1bmNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlIGJyYW5jaAorCSB3aGljaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUKKwkgYnJhbmNoIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guCisKKwkgICAgb3JpZ2luYWw6CQluZXc6CisJICAgIGJDQyBsYWIxCQliQ0MnIGxhYjIKKwkgICAgYnJhIGxhYjIKKwkgICBsYWIxOgkgICAgICAgbGFiMToKKworCisJIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBiQ0MgY2FuJ3QgcmVhY2ggbGFiMiBhdCBhc3NlbWJseSB0aW1lLAorCSBidXQgZHVlIHRvIG90aGVyIHJlbGF4YXRpb25zIGl0IGNhbiByZWFjaCBhdCBsaW5rIHRpbWUuICAqLworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUw4KQorCXsKKwkgIEVsZl9JbnRlcm5hbF9SZWxhICpucmVsOworCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKKwkgIHVuc2lnbmVkIGNoYXIgY29kZTsKKworCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLworCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKKwkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOworCisJICAvKiBEbyBub3RoaW5nIGlmIHRoaXMgcmVsb2MgaXMgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgc2VjdGlvbi4gICovCisJICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gc2VjLT5fY29va2VkX3NpemUpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBTZWUgaWYgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYW4gdW5jb25kaXRpb25hbCBwYy1yZWxhdGl2ZQorCSAgICAgYnJhbmNoLCBtb3JlIG9mdGVuIHRoYW4gbm90IHRoaXMgdGVzdCB3aWxsIGZhaWwsIHNvIHdlCisJICAgICB0ZXN0IGl0IGZpcnN0IHRvIHNwZWVkIHRoaW5ncyB1cC4gICovCisJICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMSk7CisJICBpZiAoY29kZSAhPSAweGNhKQorCSAgICBjb250aW51ZTsKKworCSAgLyogQWxzbyBtYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0CisJICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIGEgcGMtcmVsYXRpdmUgOCBiaXQgYnJhbmNoLiAgKi8KKwkgIG5yZWwgPSBpcmVsICsgMTsKKwkgIGlmIChucmVsID09IGlyZWxlbmQKKwkgICAgICB8fCBpcmVsLT5yX29mZnNldCArIDIgIT0gbnJlbC0+cl9vZmZzZXQKKwkgICAgICB8fCBFTEYzMl9SX1RZUEUgKG5yZWwtPnJfaW5mbykgIT0gKGludCkgUl9NTjEwMzAwX1BDUkVMOCkKKwkgICAgY29udGludWU7CisKKwkgIC8qIE1ha2Ugc3VyZSBvdXIgZGVzdGluYXRpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUKKwkgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKwkgIGlmIChzeW12YWwgIT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldAorCQkJICsgaXJlbC0+cl9vZmZzZXQgKyAzKSkKKwkgICAgY29udGludWU7CisKKwkgIC8qIE5vdyBtYWtlIHN1cmUgd2UgYXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgVGhpcyBtYXkgbm90CisJICAgICBiZSBuZWNlc3NhcnksIGJ1dCB3aHkgdGFrZSB0aGUgY2hhbmNlLgorCisJICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAzMDBfUENSRUw4IHJlbG9jcworCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKKwkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgorCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLworCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCSAgaWYgKGNvZGUgIT0gMHhjMCAmJiBjb2RlICE9IDB4YzEgJiYgY29kZSAhPSAweGMyCisJICAgICAgJiYgY29kZSAhPSAweGMzICYmIGNvZGUgIT0gMHhjNCAmJiBjb2RlICE9IDB4YzUKKwkgICAgICAmJiBjb2RlICE9IDB4YzYgJiYgY29kZSAhPSAweGM3ICYmIGNvZGUgIT0gMHhjOAorCSAgICAgICYmIGNvZGUgIT0gMHhjOSAmJiBjb2RlICE9IDB4ZTggJiYgY29kZSAhPSAweGU5CisJICAgICAgJiYgY29kZSAhPSAweGVhICYmIGNvZGUgIT0gMHhlYikKKwkgICAgY29udGludWU7CisKKwkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAorCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKwkgIGlmIChtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCisJCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQorCSAgICBjb250aW51ZTsKKworCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLworCSAgc3dpdGNoIChjb2RlKQorCSAgICB7CisJICAgICAgY2FzZSAweGM4OgorCQljb2RlID0gMHhjOTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGM5OgorCQljb2RlID0gMHhjODsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGMwOgorCQljb2RlID0gMHhjMjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGMyOgorCQljb2RlID0gMHhjMDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGMzOgorCQljb2RlID0gMHhjMTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGMxOgorCQljb2RlID0gMHhjMzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGM0OgorCQljb2RlID0gMHhjNjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGM2OgorCQljb2RlID0gMHhjNDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGM3OgorCQljb2RlID0gMHhjNTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGM1OgorCQljb2RlID0gMHhjNzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGU4OgorCQljb2RlID0gMHhlOTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweDlkOgorCQljb2RlID0gMHhlODsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGVhOgorCQljb2RlID0gMHhlYjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAweGViOgorCQljb2RlID0gMHhlYTsKKwkJYnJlYWs7CisJICAgIH0KKwkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAorCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCisJICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87CisKKwkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLworCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKKwkJCQkgICAgICAgUl9NTjEwMzAwX05PTkUpOworCisJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLworCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkgICphZ2FpbiA9IHRydWU7CisJfQorCisKKyAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcworCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCisgICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF8zMikKKwl7CisJICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOworCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7CisKKworCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLgorCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAorCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KKwkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7CisKKwkgICAgICAvKiBNb3N0IGluc25zIHdoaWNoIGhhdmUgMzJiaXQgb3BlcmFuZHMgYXJlIDYgYnl0ZXMgbG9uZzsKKwkJIGV4Y2VwdGlvbnMgYXJlIHBjcmVsIGluc25zIGFuZCBiaXQgaW5zbnMuCisKKwkJIFdlIGhhbmRsZSBwY3JlbCBpbnNucyBhYm92ZS4gIFdlIGRvbid0IGJvdGhlciB0cnlpbmcKKwkJIHRvIGhhbmRsZSB0aGUgYml0IGluc25zIGhlcmUuCisKKwkJIFRoZSBmaXJzdCBieXRlIG9mIHRoZSByZW1haW5pbmcgaW5zbnMgd2lsbCBiZSAweGZjLiAgKi8KKworCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KKwkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7CisKKwkgICAgICBpZiAoY29kZSAhPSAweGZjKQorCQljb250aW51ZTsKKworCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCisJICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJICAgICAgaWYgKChjb2RlICYgMHhmMCkgPCAweDgwKQorCQlzd2l0Y2ggKGNvZGUgJiAweGYwKQorCQkgIHsKKwkJICAvKiBtb3YgKGQzMixhbSksZG4gICAtPiBtb3YgKGQzMixhbSksZG4KKwkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKKwkJICAgICBtb3YgKGQzMixhbSksYW4gICAtPiBtb3YgKGQzMixhbSksYW4KKwkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKKwkJICAgICBtb3ZidSAoZDMyLGFtKSxkbiAtPiBtb3ZidSAoZDMyLGFtKSxkbgorCQkgICAgIG1vdmJ1IGRtLChkMzIsYW0pIC0+IG1vdmJ1IGRuLChkMzIsYW0pCisJCSAgICAgbW92aHUgKGQzMixhbSksZG4gLT4gbW92aHUgKGQzMixhbSksZG4KKwkJICAgICBtb3ZodSBkbSwoZDMyLGFtKSAtPiBtb3ZodSBkbiwoZDMyLGFtKSAqLworCQkgIGNhc2UgMHgwMDoKKwkJICBjYXNlIDB4MTA6CisJCSAgY2FzZSAweDIwOgorCQkgIGNhc2UgMHgzMDoKKwkJICBjYXNlIDB4NDA6CisJCSAgY2FzZSAweDUwOgorCQkgIGNhc2UgMHg2MDoKKwkJICBjYXNlIDB4NzA6CisJCSAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5CisJCSAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAorCQkgICAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLworCQkgICAgaWYgKGNvZGUgPT0gMHhjYworCQkJJiYgKHZhbHVlICYgMHg4MDAwKSkKKwkJICAgICAgY29udGludWU7CisKKwkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLworCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOworCisJCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOworCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7CisJCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOworCisJCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKKwkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOworCisJCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KKwkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCisJCQkJCQkgUl9NTjEwMzAwXzE2KTsKKworCQkgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KKwkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCisJCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCisJCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkJICAgICphZ2FpbiA9IHRydWU7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYwKSA9PSAweDgwCisJCSAgICAgICB8fCAoY29kZSAmIDB4ZjApID09IDB4OTApCisJCXN3aXRjaCAoY29kZSAmIDB4ZjMpCisJCSAgeworCQkgIC8qIG1vdiBkbiwoYWJzMzIpICAgLT4gbW92IGRuLChhYnMxNikKKwkJICAgICBtb3ZidSBkbiwoYWJzMzIpIC0+IG1vdmJ1IGRuLChhYnMxNikKKwkJICAgICBtb3ZodSBkbiwoYWJzMzIpIC0+IG1vdmh1IGRuLChhYnMxNikgICovCisJCSAgY2FzZSAweDgxOgorCQkgIGNhc2UgMHg4MjoKKwkJICBjYXNlIDB4ODM6CisJCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgICAgaWYgKChjb2RlICYgMHhmMykgPT0gMHg4MSkKKwkJICAgICAgY29kZSA9IDB4MDEgKyAoY29kZSAmIDB4MGMpOworCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYzKSA9PSAweDgyKQorCQkgICAgICBjb2RlID0gMHgwMiArIChjb2RlICYgMHgwYyk7CisJCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjMpID09IDB4ODMpCisJCSAgICAgIGNvZGUgPSAweDAzICsgKGNvZGUgJiAweDBjKTsKKwkJICAgIGVsc2UKKwkJICAgICAgYWJvcnQgKCk7CisKKwkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KKwkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOworCisJCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KKwkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCisJCQkJCQkgUl9NTjEwMzAwXzE2KTsKKworCQkgICAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQorCQkgICAgICAgYWRkZW5kIGFuZCBvZmZzZXQgdG9vISAgKi8KKwkJICAgIGlyZWwtPnJfb2Zmc2V0IC09IDE7CisKKwkJICAgIC8qIERlbGV0ZSB0aHJlZSBieXRlcyBvZiBkYXRhLiAgKi8KKwkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCisJCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMykpCisJCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KKwkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKwkJICAgICphZ2FpbiA9IHRydWU7CisJCSAgICBicmVhazsKKworCQkgIC8qIG1vdiBhbSwoYWJzMzIpICAgIC0+IG1vdiBhbSwoYWJzMTYpCisJCSAgICAgbW92IGFtLChkMzIsc3ApICAgLT4gbW92IGFtLChkMTYsc3ApCisJCSAgICAgbW92IGRtLChkMzIsc3ApICAgLT4gbW92IGRtLChkMzIsc3ApCisJCSAgICAgbW92YnUgZG0sKGQzMixzcCkgLT4gbW92YnUgZG0sKGQzMixzcCkKKwkJICAgICBtb3ZodSBkbSwoZDMyLHNwKSAtPiBtb3ZodSBkbSwoZDMyLHNwKSAqLworCQkgIGNhc2UgMHg4MDoKKwkJICBjYXNlIDB4OTA6CisJCSAgY2FzZSAweDkxOgorCQkgIGNhc2UgMHg5MjoKKwkJICBjYXNlIDB4OTM6CisJCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLworCQkgICAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7CisJCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKKworCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCisJCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkJIFJfTU4xMDMwMF8xNik7CisKKwkJICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCisJCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDIsIDIpKQorCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCisJCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCisJCSAgICAqYWdhaW4gPSB0cnVlOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMCkgPCAweGYwKQorCQlzd2l0Y2ggKGNvZGUgJiAweGZjKQorCQkgIHsKKwkJICAvKiBtb3YgaW1tMzIsZG4gICAgIC0+IG1vdiBpbW0xNixkbgorCQkgICAgIG1vdiBpbW0zMixhbiAgICAgLT4gbW92IGltbTE2LGFuCisJCSAgICAgbW92IChhYnMzMiksZG4gICAtPiBtb3YgKGFiczE2KSxkbgorCQkgICAgIG1vdmJ1IChhYnMzMiksZG4gLT4gbW92YnUgKGFiczE2KSxkbgorCQkgICAgIG1vdmh1IChhYnMzMiksZG4gLT4gbW92aHUgKGFiczE2KSxkbiAgKi8KKwkJICBjYXNlIDB4Y2M6CisJCSAgY2FzZSAweGRjOgorCQkgIGNhc2UgMHhhNDoKKwkJICBjYXNlIDB4YTg6CisJCSAgY2FzZSAweGFjOgorCQkgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQorCQkgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKKwkJICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KKwkJICAgIGlmIChjb2RlID09IDB4Y2MKKwkJCSYmICh2YWx1ZSAmIDB4ODAwMCkpCisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KKwkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworCQkgICAgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjYykKKwkJICAgICAgY29kZSA9IDB4MmMgKyAoY29kZSAmIDB4MDMpOworCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGRjKQorCQkgICAgICBjb2RlID0gMHgyNCArIChjb2RlICYgMHgwMyk7CisJCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YTQpCisJCSAgICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKKwkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhOCkKKwkJICAgICAgY29kZSA9IDB4MzQgKyAoY29kZSAmIDB4MDMpOworCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGFjKQorCQkgICAgICBjb2RlID0gMHgzOCArIChjb2RlICYgMHgwMyk7CisJCSAgICBlbHNlCisJCSAgICAgIGFib3J0ICgpOworCisJCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKKworCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCisJCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkJIFJfTU4xMDMwMF8xNik7CisKKwkJICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKKwkJICAgICAgIGFkZGVuZCBhbmQgb2Zmc2V0IHRvbyEgICovCisJCSAgICBpcmVsLT5yX29mZnNldCAtPSAxOworCisJCSAgICAvKiBEZWxldGUgdGhyZWUgYnl0ZXMgb2YgZGF0YS4gICovCisJCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAorCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDEsIDMpKQorCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCisJCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCisJCSAgICAqYWdhaW4gPSB0cnVlOworCQkgICAgYnJlYWs7CisKKwkJICAvKiBtb3YgKGFiczMyKSxhbiAgICAtPiBtb3YgKGFiczE2KSxhbgorCQkgICAgIG1vdiAoZDMyLHNwKSxhbiAgIC0+IG1vdiAoZDMyLHNwKSxhbgorCQkgICAgIG1vdiAoZDMyLHNwKSxkbiAgIC0+IG1vdiAoZDMyLHNwKSxkbgorCQkgICAgIG1vdmJ1IChkMzIsc3ApLGRuIC0+IG1vdmJ1IChkMzIsc3ApLGRuCisJCSAgICAgbW92aHUgKGQzMixzcCksZG4gLT4gbW92aHUgKGQzMixzcCksZG4KKwkJICAgICBhZGQgaW1tMzIsZG4gICAgICAtPiBhZGQgaW1tMTYsZG4KKwkJICAgICBjbXAgaW1tMzIsZG4gICAgICAtPiBjbXAgaW1tMTYsZG4KKwkJICAgICBhZGQgaW1tMzIsYW4gICAgICAtPiBhZGQgaW1tMTYsYW4KKwkJICAgICBjbXAgaW1tMzIsYW4gICAgICAtPiBjbXAgaW1tMTYsYW4KKwkJICAgICBhbmQgaW1tMzIsZG4gICAgICAtPiBhbmQgaW1tMzIsZG4KKwkJICAgICBvciBpbW0zMixkbiAgICAgICAtPiBvciBpbW0zMixkbgorCQkgICAgIHhvciBpbW0zMixkbiAgICAgIC0+IHhvciBpbW0zMixkbgorCQkgICAgIGJ0c3QgaW1tMzIsZG4gICAgIC0+IGJ0c3QgaW1tMzIsZG4gKi8KKworCQkgIGNhc2UgMHhhMDoKKwkJICBjYXNlIDB4YjA6CisJCSAgY2FzZSAweGIxOgorCQkgIGNhc2UgMHhiMjoKKwkJICBjYXNlIDB4YjM6CisJCSAgY2FzZSAweGMwOgorCQkgIGNhc2UgMHhjODoKKworCQkgIGNhc2UgMHhkMDoKKwkJICBjYXNlIDB4ZDg6CisJCSAgY2FzZSAweGUwOgorCQkgIGNhc2UgMHhlMToKKwkJICBjYXNlIDB4ZTI6CisJCSAgY2FzZSAweGUzOgorCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCisJCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisJCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisKKwkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKworCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKKwkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KKwkJICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOworCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLworCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkJCSBSX01OMTAzMDBfMTYpOworCisJCSAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLworCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKKwkJICAgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgorCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLworCQkgICAgKmFnYWluID0gdHJ1ZTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmUpCisJCXsKKwkJICAvKiBhZGQgaW1tMzIsc3AgLT4gYWRkIGltbTE2LHNwICAqLworCisJCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisKKwkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCisJCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7CisJCSAgYmZkX3B1dF84IChhYmZkLCAweGZlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7CisKKwkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KKwkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkJIFJfTU4xMDMwMF8xNik7CisKKwkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLworCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCisJCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCisJCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLworCQkgICphZ2FpbiA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOworICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOworICAgIH0KKworICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCisJZnJlZSAoZnJlZV9jb250ZW50cyk7CisgICAgICBlbHNlCisJeworCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCisJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOworCX0KKyAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworICAgIH0KKworICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKwlmcmVlIChmcmVlX2V4dHN5bXMpOworICAgICAgZWxzZQorCXsKKwkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLworCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOworCX0KKyAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7CisgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX2V4dHN5bXMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIENvbXB1dGUgdGhlIHN0YWNrIHNpemUgYW5kIG1vdm0gYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KKyAgIHJlZmVycmVkIHRvIGJ5IEhBU0ggYXQgYWRkcmVzcyBBRERSIGluIHNlY3Rpb24gd2l0aAorICAgY29udGVudHMgQ09OVEVOVFMsIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCitzdGF0aWMgdm9pZAorY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChhYmZkLCBoYXNoLCBhZGRyLCBjb250ZW50cykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7CisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Cit7CisgIHVuc2lnbmVkIGNoYXIgYnl0ZTEsIGJ5dGUyOworICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgYSB2ZXJ5IHNtYWxsIHN1YnNldCBvZiB0aGUgcG9zc2libGUgcHJvbG9ndWUKKyAgICAgc2VxdWVuY2VzIGhlcmUuICBCYXNpY2FsbHkgd2UgbG9vayBmb3I6CisKKyAgICAgbW92bSBbZDIsZDMsYTIsYTNdLHNwIChvcHRpb25hbCkKKyAgICAgYWRkIDxzaXplPixzcCAob3B0aW9uYWwsIGFuZCBvbmx5IGZvciBzaXplcyB3aGljaCBmaXQgaW4gYW4gdW5zaWduZWQKKwkJICAgIDggYml0IG51bWJlcikKKworICAgICBJZiB3ZSBmaW5kIGFueXRoaW5nIGVsc2UsIHdlIHF1aXQuICAqLworCisgIC8qIExvb2sgZm9yIG1vdm0gW3JlZ3NdLHNwICovCisgIGJ5dGUxID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIpOworICBieXRlMiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMSk7CisKKyAgaWYgKGJ5dGUxID09IDB4Y2YpCisgICAgeworICAgICAgaGFzaC0+bW92bV9hcmdzID0gYnl0ZTI7CisgICAgICBhZGRyICs9IDI7CisgICAgICBieXRlMSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKKyAgICAgIGJ5dGUyID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAxKTsKKyAgICB9CisKKyAgLyogTm93IGZpZ3VyZSBvdXQgaG93IG11Y2ggc3RhY2sgc3BhY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIG1vdm0KKyAgICAgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkIHRoaXMga2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBmdW50aW9uJ3Mgbm9ybWFsCisgICAgIHN0YWNrIHNwYWNlLiAgKi8KKyAgaWYgKGhhc2gtPm1vdm1fYXJncykKKyAgICB7CisgICAgICAvKiBTcGFjZSBmb3IgZDIuICAqLworICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4ODApCisJaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7CisKKyAgICAgIC8qIFNwYWNlIGZvciBkMy4gICovCisgICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHg0MCkKKwloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKKworICAgICAgLyogU3BhY2UgZm9yIGEyLiAgKi8KKyAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDIwKQorCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OworCisgICAgICAvKiBTcGFjZSBmb3IgYTMuICAqLworICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MTApCisJaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7CisKKyAgICAgIC8qICJvdGhlciIgc3BhY2UuICBkMCwgZDEsIGEwLCBhMSwgbWRyLCBsaXIsIGxhciwgNCBieXRlIHBhZC4gICovCisgICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgwOCkKKwloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gOCAqIDQ7CisKKyAgICB9CisKKyAgLyogTm93IGxvb2sgZm9yIHRoZSB0d28gc3RhY2sgYWRqdXN0bWVudCB2YXJpYW50cy4gICovCisgIGlmIChieXRlMSA9PSAweGY4ICYmIGJ5dGUyID09IDB4ZmUpCisgICAgeworICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOworICAgICAgdGVtcCA9ICgodGVtcCAmIDB4ZmYpIF4gKH4weDdmKSkgKyAweDgwOworCisgICAgICBoYXNoLT5zdGFja19zaXplID0gLXRlbXA7CisgICAgfQorICBlbHNlIGlmIChieXRlMSA9PSAweGZhICYmIGJ5dGUyID09IDB4ZmUpCisgICAgeworICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKKyAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmZmYpIF4gKH4weDdmZmYpKSArIDB4ODAwMDsKKyAgICAgIHRlbXAgPSAtdGVtcDsKKworICAgICAgaWYgKHRlbXAgPCAyNTUpCisJaGFzaC0+c3RhY2tfc2l6ZSA9IHRlbXA7CisgICAgfQorCisgIC8qIElmIHRoZSB0b3RhbCBzdGFjayB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgbW9yZQorICAgICB0aGFuIDI1NSBieXRlcywgdGhlbiB3ZSBjYW4ndCByZW1vdmUgdGhlIHN0YWNrIGFkanVzdG1lbnQgYnkgdXNpbmcKKyAgICAgImNhbGwiICh3ZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgIm1vdm0iIGluc3RydWN0aW9uLiAgKi8KKyAgaWYgKGhhc2gtPnN0YWNrX3NpemUgKyBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgPiAyNTUpCisgICAgaGFzaC0+c3RhY2tfc2l6ZSA9IDA7CisKKyAgcmV0dXJuOworfQorCisvKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCisKK3N0YXRpYyBib29sZWFuCittbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBpbnQgY291bnQ7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7CisgIGludCBzaG5keCwgaW5kZXg7CisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOworICBiZmRfdm1hIHRvYWRkcjsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKKyAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOworCisgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOworCisgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7CisKKyAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKKyAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLworCisgIGlyZWxhbGlnbiA9IE5VTEw7CisgIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOworCisgIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7CisgIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKKworICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KKyAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKKyAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7CisKKyAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KKyAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLworICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKKwkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCisJaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7CisgICAgfQorCisgIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCisgIGVzeW0gPSBleHRzeW1zOworICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87CisgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKKworICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7CisKKyAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4CisJICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgorCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKKwl7CisJICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OworCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOworCX0KKyAgICB9CisKKyAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLworICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87CisgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOworICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07CisKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOworICAgICAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCisJCSAgIChlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdKTsKKyAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4CisJICAmJiAoKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCisJICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCisJICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCisJeworCSAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KKyAgIGZhbHNlLiAgKi8KK3N0YXRpYyBib29sZWFuCittbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOworICAgICBiZmRfdm1hIGFkZHI7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBpbnQgc2huZHg7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7CisgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOworCisgIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KKyAgZXN5bSA9IGV4dHN5bXM7CisgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKKworICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKKwkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKShlbGZfc3ltX2hhc2hlcyAoYWJmZCkpOworICBzeW1faGFzaF9lbmQgPSAoc3ltX2hhc2gKKwkJICArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pCisJCSAgICAgLSBzeW10YWJfaGRyLT5zaF9pbmZvKSk7CisgIGZvciAoOyBzeW1faGFzaCA8IHN5bV9oYXNoX2VuZDsgc3ltX2hhc2grKykKKyAgICB7CisgICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlYworCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQorCXJldHVybiB0cnVlOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgIHdoaWNoIHVzZXMgbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCisKK3N0YXRpYyBiZmRfYnl0ZSAqCittbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKKwkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKyAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKKyAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOworICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKKworICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQorICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLworICBpZiAocmVsb2NhdGVhYmxlCisgICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKKyAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCisJCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKKwkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCisJCQkJCQkgICAgICAgc3ltYm9scyk7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisKKyAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCisJICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOworCisgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKKyAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKKyAgICAgIGFzZWN0aW9uICoqc2VjcHA7CisgICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOworCisgICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKKwlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKKyAgICAgIGVsc2UKKwl7CisJICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KKwkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKKwkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKKwkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCisJCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorCisgICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCisJCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKKwkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7CisgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKKwkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KKwkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKKyAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOworICAgICAgc2VjcHAgPSBzZWN0aW9uczsKKyAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOworICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOworICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCisJeworCSAgYXNlY3Rpb24gKmlzZWM7CisKKwkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7CisKKwkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQorCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7CisJICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKKwkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKKwkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXaG8ga25vd3M/ICAqLworCSAgICAgIGlzZWMgPSBOVUxMOworCSAgICB9CisKKwkgICpzZWNwcCA9IGlzZWM7CisJfQorCisgICAgICBpZiAoISBtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKKwkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKKwkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCisJZnJlZSAoc2VjdGlvbnMpOworICAgICAgc2VjdGlvbnMgPSBOVUxMOworICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKKwlmcmVlIChpbnRlcm5hbF9zeW1zKTsKKyAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOworICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQorCWZyZWUgKGV4dGVybmFsX3N5bXMpOworICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7CisgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCisJZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKyAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiBkYXRhOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKKyAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQorICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7CisgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKKyAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKKyAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKKyAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCisgICAgZnJlZSAoc2VjdGlvbnMpOworICByZXR1cm4gTlVMTDsKK30KKworLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLworCisvKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLworCisvKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gTU4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK2VsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCisJCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHsKKyAgICAgIHJldC0+ZGlyZWN0X2NhbGxzID0gMDsKKyAgICAgIHJldC0+c3RhY2tfc2l6ZSA9IDA7CisgICAgICByZXQtPm1vdm1fc3RhY2tfc2l6ZSA9IDA7CisgICAgICByZXQtPmZsYWdzID0gMDsKKyAgICAgIHJldC0+bW92bV9hcmdzID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBDcmVhdGUgYW4gbW4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqcmV0OworCisgIHJldCA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAorCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXQtPmZsYWdzID0gMDsKKyAgcmV0LT5zdGF0aWNfaGFzaF90YWJsZQorICAgID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikKKyAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQtPnN0YXRpY19oYXNoX3RhYmxlID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LCBhYmZkLAorCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0LT5zdGF0aWNfaGFzaF90YWJsZSk7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKK30KKworc3RhdGljIGludAorZWxmX21uMTAzMDBfbWFjaCAoZmxhZ3MpCisgICAgIGZsYWd3b3JkIGZsYWdzOworeworICBzd2l0Y2ggKGZsYWdzICYgRUZfTU4xMDMwMF9NQUNIKQorICAgIHsKKyAgICAgIGNhc2UgRV9NTjEwMzAwX01BQ0hfTU4xMDMwMDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBiZmRfbWFjaF9tbjEwMzAwOworCisgICAgfQorfQorCisvKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTU4xMDMwMCBFTEYgb2JqZWN0CisgICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNTjEwMzAwIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQorICAgbnVtYmVyLiAgKi8KKworLypBUkdTVVNFRCovCit2b2lkCitfYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIGxpbmtlcjsKK3sKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisgIHVuc2lnbmVkIGludCBpOworICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOworICBjb25zdCBjaGFyICpuYW1lOworICBhc2VjdGlvbiAqc2VjOworCisgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKKyAgICB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSBiZmRfbWFjaF9tbjEwMzAwOgorCXZhbCA9IEVfTU4xMDMwMF9NQUNIX01OMTAzMDA7CisJYnJlYWs7CisKKyAgICB9CisKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTU4xMDMwMF9NQUNIKTsKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOworfQorCitib29sZWFuCitfYmZkX21uMTAzMDBfZWxmX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21uMTAzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZl9tbjEwMzAwX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0CisgICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLworCitib29sZWFuCitfYmZkX21uMTAzMDBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQorICAgICAgJiYgYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCisgICAgeworICAgICAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9tYWNoIChpYmZkKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfbW4xMDMwMF92ZWMKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1tbjEwMzAwIgorI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbW4xMDMwMAorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19NTjEwMzAwCisjZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCisKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1uMTAzMDBfaW5mb190b19ob3d0bworI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCTAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCW1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisJCQkJbW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCisJCQkJZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisKKyNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCisKKy8qIFNvIHdlIGNhbiBzZXQgYml0cyBpbiBlX2ZsYWdzLiAgKi8KKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCisjZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9vYmplY3RfcAorCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi5jIGIvYmZkL2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDEwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmLmMKQEAgLTAsMCArMSw1MjUwIEBACisvKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCisKK1NFQ1RJT04KKwlFTEYgYmFja2VuZHMKKworCUJGRCBzdXBwb3J0IGZvciBFTEYgZm9ybWF0cyBpcyBiZWluZyB3b3JrZWQgb24uCisJQ3VycmVudGx5LCB0aGUgYmVzdCBzdXBwb3J0ZWQgYmFjayBlbmRzIGFyZSBmb3Igc3BhcmMgYW5kIGkzODYKKwkocnVubmluZyBzdnI0IG9yIFNvbGFyaXMgMikuCisKKwlEb2N1bWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHN1cHBvcnQgY29kZSBzdGlsbCBuZWVkcworCXRvIGJlIHdyaXR0ZW4uICBUaGUgY29kZSBpcyBjaGFuZ2luZyBxdWlja2x5IGVub3VnaCB0aGF0IHdlCisJaGF2ZW4ndCBib3RoZXJlZCB5ZXQuCisgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNkZWZpbmUgQVJDSF9TSVpFIDAKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWFrZV9tYXBwaW5nCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBlbGZfc29ydF9zZWN0aW9ucyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOworc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gc3dhcF9vdXRfc3ltcyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKiwgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgY2hhciAqZWxmX3JlYWQgUEFSQU1TICgoYmZkICosIGxvbmcsIHVuc2lnbmVkIGludCkpOworc3RhdGljIHZvaWQgZWxmX2Zha2Vfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIElOTElORSBpbnQgc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfbWFwX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBiZmRfc2l6ZV90eXBlIGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qIFN3YXAgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgVGhlIHZlcnNpb24gaW5mb3JtYXRpb24gaXMKKyAgIGN1cnJlbnRseSBzaXplIGluZGVwZW5kZW50LiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsCisgICBuZWVkIHRvIG1vdmUgaW50byBlbGZjb2RlLmguICAqLworCisvKiBTd2FwIGluIGEgVmVyZGVmIHN0cnVjdHVyZS4gICovCisKK3ZvaWQKK19iZmRfZWxmX3N3YXBfdmVyZGVmX2luIChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyZGVmICpzcmM7CisgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgKmRzdDsKK3sKKyAgZHN0LT52ZF92ZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX3ZlcnNpb24pOworICBkc3QtPnZkX2ZsYWdzICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfZmxhZ3MpOworICBkc3QtPnZkX25keCAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dmRfbmR4KTsKKyAgZHN0LT52ZF9jbnQgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX2NudCk7CisgIGRzdC0+dmRfaGFzaCAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZF9oYXNoKTsKKyAgZHN0LT52ZF9hdXggICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkX2F1eCk7CisgIGRzdC0+dmRfbmV4dCAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZF9uZXh0KTsKK30KKworLyogU3dhcCBvdXQgYSBWZXJkZWYgc3RydWN0dXJlLiAgKi8KKwordm9pZAorX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0IChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVyZGVmICpzcmM7CisgICAgIEVsZl9FeHRlcm5hbF9WZXJkZWYgKmRzdDsKK3sKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX3ZlcnNpb24sIGRzdC0+dmRfdmVyc2lvbik7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF9mbGFncywgZHN0LT52ZF9mbGFncyk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF9uZHgsIGRzdC0+dmRfbmR4KTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZkX2NudCwgZHN0LT52ZF9jbnQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRfaGFzaCwgZHN0LT52ZF9oYXNoKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX2F1eCwgZHN0LT52ZF9hdXgpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRfbmV4dCwgZHN0LT52ZF9uZXh0KTsKK30KKworLyogU3dhcCBpbiBhIFZlcmRhdXggc3RydWN0dXJlLiAgKi8KKwordm9pZAorX2JmZF9lbGZfc3dhcF92ZXJkYXV4X2luIChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqc3JjOworICAgICBFbGZfSW50ZXJuYWxfVmVyZGF1eCAqZHN0OworeworICBkc3QtPnZkYV9uYW1lID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZkYV9uYW1lKTsKKyAgZHN0LT52ZGFfbmV4dCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZGFfbmV4dCk7Cit9CisKKy8qIFN3YXAgb3V0IGEgVmVyZGF1eCBzdHJ1Y3R1cmUuICAqLworCit2b2lkCitfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVyZGF1eCAqc3JjOworICAgICBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqZHN0OworeworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRhX25hbWUsIGRzdC0+dmRhX25hbWUpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dmRhX25leHQsIGRzdC0+dmRhX25leHQpOworfQorCisvKiBTd2FwIGluIGEgVmVybmVlZCBzdHJ1Y3R1cmUuICAqLworCit2b2lkCitfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJuZWVkICpzcmM7CisgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICpkc3Q7Cit7CisgIGRzdC0+dm5fdmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bl92ZXJzaW9uKTsKKyAgZHN0LT52bl9jbnQgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuX2NudCk7CisgIGRzdC0+dm5fZmlsZSAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bl9maWxlKTsKKyAgZHN0LT52bl9hdXggICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuX2F1eCk7CisgIGRzdC0+dm5fbmV4dCAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bl9uZXh0KTsKK30KKworLyogU3dhcCBvdXQgYSBWZXJuZWVkIHN0cnVjdHVyZS4gICovCisKK3ZvaWQKK19iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJuZWVkICpzcmM7CisgICAgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICpkc3Q7Cit7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bl92ZXJzaW9uLCBkc3QtPnZuX3ZlcnNpb24pOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5fY250LCBkc3QtPnZuX2NudCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bl9maWxlLCBkc3QtPnZuX2ZpbGUpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fYXV4LCBkc3QtPnZuX2F1eCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bl9uZXh0LCBkc3QtPnZuX25leHQpOworfQorCisvKiBTd2FwIGluIGEgVmVybmF1eCBzdHJ1Y3R1cmUuICAqLworCit2b2lkCitfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpzcmM7CisgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICpkc3Q7Cit7CisgIGRzdC0+dm5hX2hhc2ggID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9oYXNoKTsKKyAgZHN0LT52bmFfZmxhZ3MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5hX2ZsYWdzKTsKKyAgZHN0LT52bmFfb3RoZXIgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5hX290aGVyKTsKKyAgZHN0LT52bmFfbmFtZSAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX25hbWUpOworICBkc3QtPnZuYV9uZXh0ICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfbmV4dCk7Cit9CisKKy8qIFN3YXAgb3V0IGEgVmVybmF1eCBzdHJ1Y3R1cmUuICAqLworCit2b2lkCitfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0IChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqc3JjOworICAgICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqZHN0OworeworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5hX2hhc2gsIGRzdC0+dm5hX2hhc2gpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5hX2ZsYWdzLCBkc3QtPnZuYV9mbGFncyk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52bmFfb3RoZXIsIGRzdC0+dm5hX290aGVyKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuYV9uYW1lLCBkc3QtPnZuYV9uYW1lKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuYV9uZXh0LCBkc3QtPnZuYV9uZXh0KTsKK30KKworLyogU3dhcCBpbiBhIFZlcnN5bSBzdHJ1Y3R1cmUuICAqLworCit2b2lkCitfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcnN5bSAqc3JjOworICAgICBFbGZfSW50ZXJuYWxfVmVyc3ltICpkc3Q7Cit7CisgIGRzdC0+dnNfdmVycyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52c192ZXJzKTsKK30KKworLyogU3dhcCBvdXQgYSBWZXJzeW0gc3RydWN0dXJlLiAgKi8KKwordm9pZAorX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0IChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVyc3ltICpzcmM7CisgICAgIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmRzdDsKK3sKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZzX3ZlcnMsIGRzdC0+dnNfdmVycyk7Cit9CisKKy8qIFN0YW5kYXJkIEVMRiBoYXNoIGZ1bmN0aW9uLiAgRG8gbm90IGNoYW5nZSB0aGlzIGZ1bmN0aW9uOyB5b3Ugd2lsbAorICAgY2F1c2UgaW52YWxpZCBoYXNoIHRhYmxlcyB0byBiZSBnZW5lcmF0ZWQuICAqLwordW5zaWduZWQgbG9uZworYmZkX2VsZl9oYXNoIChuYW1lKQorICAgICBDT05TVCB1bnNpZ25lZCBjaGFyICpuYW1lOworeworICB1bnNpZ25lZCBsb25nIGggPSAwOworICB1bnNpZ25lZCBsb25nIGc7CisgIGludCBjaDsKKworICB3aGlsZSAoKGNoID0gKm5hbWUrKykgIT0gJ1wwJykKKyAgICB7CisgICAgICBoID0gKGggPDwgNCkgKyBjaDsKKyAgICAgIGlmICgoZyA9IChoICYgMHhmMDAwMDAwMCkpICE9IDApCisJeworCSAgaCBePSBnID4+IDI0OworCSAgLyogVGhlIEVMRiBBQkkgc2F5cyBgaCAmPSB+ZycsIGJ1dCB0aGlzIGlzIGVxdWl2YWxlbnQgaW4KKwkgICAgIHRoaXMgY2FzZSBhbmQgb24gc29tZSBtYWNoaW5lcyBvbmUgaW5zbiBpbnN0ZWFkIG9mIHR3by4gICovCisJICBoIF49IGc7CisJfQorICAgIH0KKyAgcmV0dXJuIGg7Cit9CisKKy8qIFJlYWQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGF0IGEgc3BlY2lmaWVkIG9mZnNldCBpbiBhbiBFTEYKKyAgIGZpbGUsIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUKKyAgIGJ1ZmZlci4gKi8KKworc3RhdGljIGNoYXIgKgorZWxmX3JlYWQgKGFiZmQsIG9mZnNldCwgc2l6ZSkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgbG9uZyBvZmZzZXQ7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBjaGFyICpidWY7CisKKyAgaWYgKChidWYgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQorICAgIHJldHVybiBOVUxMOworICBpZiAoYmZkX3JlYWQgKChQVFIpIGJ1Ziwgc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgcmV0dXJuIGJ1ZjsKK30KKworYm9vbGVhbgorYmZkX2VsZl9ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICogYWJmZDsKK3sKKyAgLyogdGhpcyBqdXN0IGRvZXMgaW5pdGlhbGl6YXRpb24gKi8KKyAgLyogY29mZl9ta29iamVjdCB6YWxsb2MncyBzcGFjZSBmb3IgdGRhdGEuY29mZl9vYmpfZGF0YSAuLi4gKi8KKyAgZWxmX3RkYXRhIChhYmZkKSA9IChzdHJ1Y3QgZWxmX29ial90ZGF0YSAqKQorICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKTsKKyAgaWYgKGVsZl90ZGF0YSAoYWJmZCkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8qIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgZG9uZSBhdCBjbG9zZSB0aW1lLCBkbyB3ZSBuZWVkIGFueQorICAgICBpbml0aWFsaXphdGlvbj8gKi8KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbGVhbgorYmZkX2VsZl9ta2NvcmVmaWxlIChhYmZkKQorICAgICBiZmQgKiBhYmZkOworeworICAvKiBJIHRoaW5rIHRoaXMgY2FuIGJlIGRvbmUganVzdCBsaWtlIGFuIG9iamVjdCBmaWxlLiAqLworICByZXR1cm4gYmZkX2VsZl9ta29iamVjdCAoYWJmZCk7Cit9CisKK2NoYXIgKgorYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIHNoaW5kZXgpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBzaGluZGV4OworeworICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7CisgIGNoYXIgKnNoc3RydGFiID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgdW5zaWduZWQgaW50IHNoc3RydGFic2l6ZTsKKworICBpX3NoZHJwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKKyAgaWYgKGlfc2hkcnAgPT0gMCB8fCBpX3NoZHJwW3NoaW5kZXhdID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgc2hzdHJ0YWIgPSAoY2hhciAqKSBpX3NoZHJwW3NoaW5kZXhdLT5jb250ZW50czsKKyAgaWYgKHNoc3RydGFiID09IE5VTEwpCisgICAgeworICAgICAgLyogTm8gY2FjaGVkIG9uZSwgYXR0ZW1wdCB0byByZWFkLCBhbmQgY2FjaGUgd2hhdCB3ZSByZWFkLiAqLworICAgICAgb2Zmc2V0ID0gaV9zaGRycFtzaGluZGV4XS0+c2hfb2Zmc2V0OworICAgICAgc2hzdHJ0YWJzaXplID0gaV9zaGRycFtzaGluZGV4XS0+c2hfc2l6ZTsKKyAgICAgIHNoc3RydGFiID0gZWxmX3JlYWQgKGFiZmQsIG9mZnNldCwgc2hzdHJ0YWJzaXplKTsKKyAgICAgIGlfc2hkcnBbc2hpbmRleF0tPmNvbnRlbnRzID0gKFBUUikgc2hzdHJ0YWI7CisgICAgfQorICByZXR1cm4gc2hzdHJ0YWI7Cit9CisKK2NoYXIgKgorYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgc2hpbmRleCwgc3RyaW5kZXgpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBzaGluZGV4OworICAgICB1bnNpZ25lZCBpbnQgc3RyaW5kZXg7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7CisKKyAgaWYgKHN0cmluZGV4ID09IDApCisgICAgcmV0dXJuICIiOworCisgIGhkciA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF07CisKKyAgaWYgKGhkci0+Y29udGVudHMgPT0gTlVMTAorICAgICAgJiYgYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIHNoaW5kZXgpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHN0cmluZGV4ID49IGhkci0+c2hfc2l6ZSkKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiJXM6IGludmFsaWQgc3RyaW5nIG9mZnNldCAldSA+PSAlbHUgZm9yIHNlY3Rpb24gYCVzJyIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3RyaW5kZXgsICh1bnNpZ25lZCBsb25nKSBoZHItPnNoX3NpemUsCisJICgoc2hpbmRleCA9PSBlbGZfZWxmaGVhZGVyKGFiZmQpLT5lX3Noc3RybmR4CisJICAgJiYgc3RyaW5kZXggPT0gaGRyLT5zaF9uYW1lKQorCSAgPyAiLnNoc3RydGFiIgorCSAgOiBlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYiAoYWJmZCwgaGRyLT5zaF9uYW1lKSkpOworICAgICAgcmV0dXJuICIiOworICAgIH0KKworICByZXR1cm4gKChjaGFyICopIGhkci0+Y29udGVudHMpICsgc3RyaW5kZXg7Cit9CisKKy8qIE1ha2UgYSBCRkQgc2VjdGlvbiBmcm9tIGFuIEVMRiBzZWN0aW9uLiAgV2Ugc3RvcmUgYSBwb2ludGVyIHRvIHRoZQorICAgQkZEIHNlY3Rpb24gaW4gdGhlIGJmZF9zZWN0aW9uIGZpZWxkIG9mIHRoZSBoZWFkZXIuICAqLworCitib29sZWFuCitfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgYXNlY3Rpb24gKm5ld3NlY3Q7CisgIGZsYWd3b3JkIGZsYWdzOworCisgIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAoc3RyY21wIChuYW1lLAorCQkJICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbikpID09IDApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7CisgIGlmIChuZXdzZWN0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG5ld3NlY3QtPmZpbGVwb3MgPSBoZHItPnNoX29mZnNldDsKKworICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChhYmZkLCBuZXdzZWN0LCBoZHItPnNoX2FkZHIpCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBuZXdzZWN0LCBoZHItPnNoX3NpemUpCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIG5ld3NlY3QsCisJCQkJICAgICAgYmZkX2xvZzIgKGhkci0+c2hfYWRkcmFsaWduKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZsYWdzID0gU0VDX05PX0ZMQUdTOworICBpZiAoaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCisgICAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKKyAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQorICAgIHsKKyAgICAgIGZsYWdzIHw9IFNFQ19BTExPQzsKKyAgICAgIGlmIChoZHItPnNoX3R5cGUgIT0gU0hUX05PQklUUykKKwlmbGFncyB8PSBTRUNfTE9BRDsKKyAgICB9CisgIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9XUklURSkgPT0gMCkKKyAgICBmbGFncyB8PSBTRUNfUkVBRE9OTFk7CisgIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIpICE9IDApCisgICAgZmxhZ3MgfD0gU0VDX0NPREU7CisgIGVsc2UgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwKQorICAgIGZsYWdzIHw9IFNFQ19EQVRBOworCisgIC8qIFRoZSBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXBwZWFyIHRvIGJlIHJlY29nbml6ZWQgb25seSBieSBuYW1lLCBub3QKKyAgICAgYW55IHNvcnQgb2YgZmxhZy4gICovCisgIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnIiwgc2l6ZW9mICIuZGVidWciIC0gMSkgPT0gMAorICAgICAgfHwgc3RybmNtcCAobmFtZSwgIi5saW5lIiwgc2l6ZW9mICIubGluZSIgLSAxKSA9PSAwCisgICAgICB8fCBzdHJuY21wIChuYW1lLCAiLnN0YWIiLCBzaXplb2YgIi5zdGFiIiAtIDEpID09IDApCisgICAgZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKKworICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIGlmIHRoZSBuYW1lIGJlZ2lucyB3aXRoIC5nbnUubGlua29uY2UsIHdlCisgICAgIG9ubHkgbGluayBhIHNpbmdsZSBjb3B5IG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKKyAgICAgZysrLiAgZysrIHdpbGwgZW1pdCBlYWNoIHRlbXBsYXRlIGV4cGFuc2lvbiBpbiBpdHMgb3duIHNlY3Rpb24uCisgICAgIFRoZSBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZCBhcyB3ZWFrLCBzbyB0aGF0IG11bHRpcGxlIGRlZmluaXRpb25zCisgICAgIGFyZSBwZXJtaXR0ZWQuICBUaGUgR05VIGxpbmtlciBleHRlbnNpb24gaXMgdG8gYWN0dWFsbHkgZGlzY2FyZAorICAgICBhbGwgYnV0IG9uZSBvZiB0aGUgc2VjdGlvbnMuICAqLworICBpZiAoc3RybmNtcCAobmFtZSwgIi5nbnUubGlua29uY2UiLCBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkKKyAgICBmbGFncyB8PSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOworCisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwgZmxhZ3MpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9QaGRyICpwaGRyOworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgcGhkcnMgdG8gc2VlIGlmIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsbWEuCisgICAgICAgICBJZiBhbGwgdGhlIHBfcGFkZHIgZmllbGRzIGFyZSB6ZXJvLCB3ZSBpZ25vcmUgdGhlbSwgc2luY2UKKyAgICAgICAgIHNvbWUgRUxGIGxpbmtlcnMgcHJvZHVjZSBzdWNoIG91dHB1dC4gICovCisgICAgICBwaGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsgaSsrLCBwaGRyKyspCisJeworCSAgaWYgKHBoZHItPnBfcGFkZHIgIT0gMCkKKwkgICAgYnJlYWs7CisJfQorICAgICAgaWYgKGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bSkKKwl7CisJICBwaGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKKwkgIGZvciAoaSA9IDA7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsgaSsrLCBwaGRyKyspCisJICAgIHsKKwkgICAgICBpZiAocGhkci0+cF90eXBlID09IFBUX0xPQUQKKwkJICAmJiBwaGRyLT5wX3ZhZGRyICE9IHBoZHItPnBfcGFkZHIKKwkJICAmJiBwaGRyLT5wX3ZhZGRyIDw9IGhkci0+c2hfYWRkcgorCQkgICYmIChwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zegorCQkgICAgICA+PSBoZHItPnNoX2FkZHIgKyBoZHItPnNoX3NpemUpCisJCSAgJiYgKChmbGFncyAmIFNFQ19MT0FEKSA9PSAwCisJCSAgICAgIHx8IChwaGRyLT5wX29mZnNldCA8PSAoYmZkX3ZtYSkgaGRyLT5zaF9vZmZzZXQKKwkJCSAgJiYgKHBoZHItPnBfb2Zmc2V0ICsgcGhkci0+cF9maWxlc3oKKwkJCSAgICAgID49IGhkci0+c2hfb2Zmc2V0ICsgaGRyLT5zaF9zaXplKSkpKQorCQl7CisJCSAgbmV3c2VjdC0+bG1hICs9IHBoZHItPnBfcGFkZHIgLSBwaGRyLT5wX3ZhZGRyOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIGhkci0+YmZkX3NlY3Rpb24gPSBuZXdzZWN0OworICBlbGZfc2VjdGlvbl9kYXRhIChuZXdzZWN0KS0+dGhpc19oZHIgPSAqaGRyOworCisgIHJldHVybiB0cnVlOworfQorCisvKgorSU5URVJOQUxfRlVOQ1RJT04KKwliZmRfZWxmX2ZpbmRfc2VjdGlvbgorCitTWU5PUFNJUworCXN0cnVjdCBlbGZfaW50ZXJuYWxfc2hkciAqYmZkX2VsZl9maW5kX3NlY3Rpb24gKGJmZCAqYWJmZCwgY2hhciAqbmFtZSk7CisKK0RFU0NSSVBUSU9OCisJSGVscGVyIGZ1bmN0aW9ucyBmb3IgR0RCIHRvIGxvY2F0ZSB0aGUgc3RyaW5nIHRhYmxlcy4KKwlTaW5jZSBCRkQgaGlkZXMgc3RyaW5nIHRhYmxlcyBmcm9tIGNhbGxlcnMsIEdEQiBuZWVkcyB0byB1c2UgYW4KKwlpbnRlcm5hbCBob29rIHRvIGZpbmQgdGhlbS4gIFN1bidzIC5zdGFic3RyLCBpbiBwYXJ0aWN1bGFyLAorCWlzbid0IGV2ZW4gcG9pbnRlZCB0byBieSB0aGUgLnN0YWIgc2VjdGlvbiwgc28gb3JkaW5hcnkKKwltZWNoYW5pc21zIHdvdWxkbid0IHdvcmsgdG8gZmluZCBpdCwgZXZlbiBpZiB3ZSBoYWQgc29tZS4KKyovCisKK3N0cnVjdCBlbGZfaW50ZXJuYWxfc2hkciAqCitiZmRfZWxmX2ZpbmRfc2VjdGlvbiAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOworICBjaGFyICpzaHN0cnRhYjsKKyAgdW5zaWduZWQgaW50IG1heDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7CisgIGlmIChpX3NoZHJwICE9IE5VTEwpCisgICAgeworICAgICAgc2hzdHJ0YWIgPSBiZmRfZWxmX2dldF9zdHJfc2VjdGlvbgorCShhYmZkLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCk7CisgICAgICBpZiAoc2hzdHJ0YWIgIT0gTlVMTCkKKwl7CisJICBtYXggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKKwkgIGZvciAoaSA9IDE7IGkgPCBtYXg7IGkrKykKKwkgICAgaWYgKCFzdHJjbXAgKCZzaHN0cnRhYltpX3NoZHJwW2ldLT5zaF9uYW1lXSwgbmFtZSkpCisJICAgICAgcmV0dXJuIGlfc2hkcnBbaV07CisJfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKmNvbnN0IGJmZF9lbGZfc2VjdGlvbl90eXBlX25hbWVzW10gPSB7CisgICJTSFRfTlVMTCIsICJTSFRfUFJPR0JJVFMiLCAiU0hUX1NZTVRBQiIsICJTSFRfU1RSVEFCIiwKKyAgIlNIVF9SRUxBIiwgIlNIVF9IQVNIIiwgIlNIVF9EWU5BTUlDIiwgIlNIVF9OT1RFIiwKKyAgIlNIVF9OT0JJVFMiLCAiU0hUX1JFTCIsICJTSFRfU0hMSUIiLCAiU0hUX0RZTlNZTSIsCit9OworCisvKiBFTEYgcmVsb2NzIGFyZSBhZ2FpbnN0IHN5bWJvbHMuICBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZQorICAgb3V0cHV0LCBhbmQgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCBhbmQgbm90aGluZworICAgaGFzIGdpdmVuIHVzIGFueSBhZGRpdGlvbmFsIGFkZGVuZCwgdGhlIHJlc3VsdGluZyByZWxvYyB3aWxsIGFsc28KKyAgIGJlIGFnYWluc3QgdGhlIHNhbWUgc3ltYm9sLiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8KKyAgIGNoYW5nZSBhbnl0aGluZyBhYm91dCB0aGUgd2F5IHRoZSByZWxvYyBpcyBoYW5kbGVkLCBzaW5jZSBpdCB3aWxsCisgICBhbGwgYmUgZG9uZSBhdCBmaW5hbCBsaW5rIHRpbWUuICBSYXRoZXIgdGhhbiBwdXQgc3BlY2lhbCBjYXNlIGNvZGUKKyAgIGludG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYWxsIHRoZSByZWxvYyB0eXBlcyB1c2UgdGhpcyBob3d0bworICAgZnVuY3Rpb24uICBJdCBqdXN0IHNob3J0IGNpcmN1aXRzIHRoZSByZWxvYyBpZiBwcm9kdWNpbmcKKyAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wuICAqLworCisvKkFSR1NVU0VEKi8KK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLAorCQkgICAgICAgcmVsb2NfZW50cnksCisJCSAgICAgICBzeW1ib2wsCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgIG91dHB1dF9iZmQsCisJCSAgICAgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKKwkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Cit9CisMCisvKiBQcmludCBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCisKK2Jvb2xlYW4KK19iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZhcmcpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGZhcmc7Cit7CisgIEZJTEUgKmYgPSAoRklMRSAqKSBmYXJnOworICBFbGZfSW50ZXJuYWxfUGhkciAqcDsKKyAgYXNlY3Rpb24gKnM7CisgIGJmZF9ieXRlICpkeW5idWYgPSBOVUxMOworCisgIHAgPSBlbGZfdGRhdGEgKGFiZmQpLT5waGRyOworICBpZiAocCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpLCBjOworCisgICAgICBmcHJpbnRmIChmLCBfKCJcblByb2dyYW0gSGVhZGVyOlxuIikpOworICAgICAgYyA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3BobnVtOworICAgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKywgcCsrKQorCXsKKwkgIGNvbnN0IGNoYXIgKnM7CisJICBjaGFyIGJ1ZlsyMF07CisKKwkgIHN3aXRjaCAocC0+cF90eXBlKQorCSAgICB7CisJICAgIGNhc2UgUFRfTlVMTDogcyA9ICJOVUxMIjsgYnJlYWs7CisJICAgIGNhc2UgUFRfTE9BRDogcyA9ICJMT0FEIjsgYnJlYWs7CisJICAgIGNhc2UgUFRfRFlOQU1JQzogcyA9ICJEWU5BTUlDIjsgYnJlYWs7CisJICAgIGNhc2UgUFRfSU5URVJQOiBzID0gIklOVEVSUCI7IGJyZWFrOworCSAgICBjYXNlIFBUX05PVEU6IHMgPSAiTk9URSI7IGJyZWFrOworCSAgICBjYXNlIFBUX1NITElCOiBzID0gIlNITElCIjsgYnJlYWs7CisJICAgIGNhc2UgUFRfUEhEUjogcyA9ICJQSERSIjsgYnJlYWs7CisJICAgIGRlZmF1bHQ6IHNwcmludGYgKGJ1ZiwgIjB4JWx4IiwgcC0+cF90eXBlKTsgcyA9IGJ1ZjsgYnJlYWs7CisJICAgIH0KKwkgIGZwcmludGYgKGYsICIlOHMgb2ZmICAgIDB4Iiwgcyk7CisJICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9vZmZzZXQpOworCSAgZnByaW50ZiAoZiwgIiB2YWRkciAweCIpOworCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfdmFkZHIpOworCSAgZnByaW50ZiAoZiwgIiBwYWRkciAweCIpOworCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfcGFkZHIpOworCSAgZnByaW50ZiAoZiwgIiBhbGlnbiAyKioldVxuIiwgYmZkX2xvZzIgKHAtPnBfYWxpZ24pKTsKKwkgIGZwcmludGYgKGYsICIgICAgICAgICBmaWxlc3ogMHgiKTsKKwkgIGZwcmludGZfdm1hIChmLCBwLT5wX2ZpbGVzeik7CisJICBmcHJpbnRmIChmLCAiIG1lbXN6IDB4Iik7CisJICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9tZW1zeik7CisJICBmcHJpbnRmIChmLCAiIGZsYWdzICVjJWMlYyIsCisJCSAgIChwLT5wX2ZsYWdzICYgUEZfUikgIT0gMCA/ICdyJyA6ICctJywKKwkJICAgKHAtPnBfZmxhZ3MgJiBQRl9XKSAhPSAwID8gJ3cnIDogJy0nLAorCQkgICAocC0+cF9mbGFncyAmIFBGX1gpICE9IDAgPyAneCcgOiAnLScpOworCSAgaWYgKChwLT5wX2ZsYWdzICZ+IChQRl9SIHwgUEZfVyB8IFBGX1gpKSAhPSAwKQorCSAgICBmcHJpbnRmIChmLCAiICVseCIsIHAtPnBfZmxhZ3MgJn4gKFBGX1IgfCBQRl9XIHwgUEZfWCkpOworCSAgZnByaW50ZiAoZiwgIlxuIik7CisJfQorICAgIH0KKworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOworICBpZiAocyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBlbGZzZWM7CisgICAgICB1bnNpZ25lZCBsb25nIGxpbms7CisgICAgICBiZmRfYnl0ZSAqZXh0ZHluLCAqZXh0ZHluZW5kOworICAgICAgc2l6ZV90IGV4dGR5bnNpemU7CisgICAgICB2b2lkICgqc3dhcF9keW5faW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQVFIsIEVsZl9JbnRlcm5hbF9EeW4gKikpOworCisgICAgICBmcHJpbnRmIChmLCBfKCJcbkR5bmFtaWMgU2VjdGlvbjpcbiIpKTsKKworICAgICAgZHluYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAoZHluYnVmID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwgKGZpbGVfcHRyKSAwLAorCQkJCSAgICAgIHMtPl9yYXdfc2l6ZSkpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGVsZnNlYyA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgcyk7CisgICAgICBpZiAoZWxmc2VjID09IC0xKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKKworICAgICAgZXh0ZHluc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2R5bjsKKyAgICAgIHN3YXBfZHluX2luID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zd2FwX2R5bl9pbjsKKworICAgICAgZXh0ZHluID0gZHluYnVmOworICAgICAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplOworICAgICAgZm9yICg7IGV4dGR5biA8IGV4dGR5bmVuZDsgZXh0ZHluICs9IGV4dGR5bnNpemUpCisJeworCSAgRWxmX0ludGVybmFsX0R5biBkeW47CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgY2hhciBhYlsyMF07CisJICBib29sZWFuIHN0cmluZ3A7CisKKwkgICgqc3dhcF9keW5faW4pIChhYmZkLCAoUFRSKSBleHRkeW4sICZkeW4pOworCisJICBpZiAoZHluLmRfdGFnID09IERUX05VTEwpCisJICAgIGJyZWFrOworCisJICBzdHJpbmdwID0gZmFsc2U7CisJICBzd2l0Y2ggKGR5bi5kX3RhZykKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIHNwcmludGYgKGFiLCAiMHglbHgiLCAodW5zaWduZWQgbG9uZykgZHluLmRfdGFnKTsKKwkgICAgICBuYW1lID0gYWI7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9ORUVERUQ6IG5hbWUgPSAiTkVFREVEIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOworCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIlBMVFJFTFNaIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfUExUR09UOiBuYW1lID0gIlBMVEdPVCI7IGJyZWFrOworCSAgICBjYXNlIERUX0hBU0g6IG5hbWUgPSAiSEFTSCI7IGJyZWFrOworCSAgICBjYXNlIERUX1NUUlRBQjogbmFtZSA9ICJTVFJUQUIiOyBicmVhazsKKwkgICAgY2FzZSBEVF9TWU1UQUI6IG5hbWUgPSAiU1lNVEFCIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfUkVMQTogbmFtZSA9ICJSRUxBIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfUkVMQVNaOiBuYW1lID0gIlJFTEFTWiI7IGJyZWFrOworCSAgICBjYXNlIERUX1JFTEFFTlQ6IG5hbWUgPSAiUkVMQUVOVCI7IGJyZWFrOworCSAgICBjYXNlIERUX1NUUlNaOiBuYW1lID0gIlNUUlNaIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfU1lNRU5UOiBuYW1lID0gIlNZTUVOVCI7IGJyZWFrOworCSAgICBjYXNlIERUX0lOSVQ6IG5hbWUgPSAiSU5JVCI7IGJyZWFrOworCSAgICBjYXNlIERUX0ZJTkk6IG5hbWUgPSAiRklOSSI7IGJyZWFrOworCSAgICBjYXNlIERUX1NPTkFNRTogbmFtZSA9ICJTT05BTUUiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7CisJICAgIGNhc2UgRFRfUlBBVEg6IG5hbWUgPSAiUlBBVEgiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7CisJICAgIGNhc2UgRFRfU1lNQk9MSUM6IG5hbWUgPSAiU1lNQk9MSUMiOyBicmVhazsKKwkgICAgY2FzZSBEVF9SRUw6IG5hbWUgPSAiUkVMIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfUkVMU1o6IG5hbWUgPSAiUkVMU1oiOyBicmVhazsKKwkgICAgY2FzZSBEVF9SRUxFTlQ6IG5hbWUgPSAiUkVMRU5UIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfUExUUkVMOiBuYW1lID0gIlBMVFJFTCI7IGJyZWFrOworCSAgICBjYXNlIERUX0RFQlVHOiBuYW1lID0gIkRFQlVHIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfVEVYVFJFTDogbmFtZSA9ICJURVhUUkVMIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfSk1QUkVMOiBuYW1lID0gIkpNUFJFTCI7IGJyZWFrOworCSAgICBjYXNlIERUX0FVWElMSUFSWTogbmFtZSA9ICJBVVhJTElBUlkiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7CisJICAgIGNhc2UgRFRfRklMVEVSOiBuYW1lID0gIkZJTFRFUiI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKKwkgICAgY2FzZSBEVF9WRVJTWU06IG5hbWUgPSAiVkVSU1lNIjsgYnJlYWs7CisJICAgIGNhc2UgRFRfVkVSREVGOiBuYW1lID0gIlZFUkRFRiI7IGJyZWFrOworCSAgICBjYXNlIERUX1ZFUkRFRk5VTTogbmFtZSA9ICJWRVJERUZOVU0iOyBicmVhazsKKwkgICAgY2FzZSBEVF9WRVJORUVEOiBuYW1lID0gIlZFUk5FRUQiOyBicmVhazsKKwkgICAgY2FzZSBEVF9WRVJORUVETlVNOiBuYW1lID0gIlZFUk5FRUROVU0iOyBicmVhazsKKwkgICAgfQorCisJICBmcHJpbnRmIChmLCAiICAlLTExcyAiLCBuYW1lKTsKKwkgIGlmICghIHN0cmluZ3ApCisJICAgIGZwcmludGYgKGYsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSBkeW4uZF91bi5kX3ZhbCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisKKwkgICAgICBzdHJpbmcgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAorCQkJCQkJCWR5bi5kX3VuLmRfdmFsKTsKKwkgICAgICBpZiAoc3RyaW5nID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIGZwcmludGYgKGYsICIlcyIsIHN0cmluZyk7CisJICAgIH0KKwkgIGZwcmludGYgKGYsICJcbiIpOworCX0KKworICAgICAgZnJlZSAoZHluYnVmKTsKKyAgICAgIGR5bmJ1ZiA9IE5VTEw7CisgICAgfQorCisgIGlmICgoZWxmX2R5bnZlcmRlZiAoYWJmZCkgIT0gMCAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKKyAgICAgIHx8IChlbGZfZHludmVycmVmIChhYmZkKSAhPSAwICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZiA9PSBOVUxMKSkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZWxmX2R5bnZlcmRlZiAoYWJmZCkgIT0gMCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICp0OworCisgICAgICBmcHJpbnRmIChmLCBfKCJcblZlcnNpb24gZGVmaW5pdGlvbnM6XG4iKSk7CisgICAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWY7IHQgIT0gTlVMTDsgdCA9IHQtPnZkX25leHRkZWYpCisJeworCSAgZnByaW50ZiAoZiwgIiVkIDB4JTIuMnggMHglOC44bHggJXNcbiIsIHQtPnZkX25keCwKKwkJICAgdC0+dmRfZmxhZ3MsIHQtPnZkX2hhc2gsIHQtPnZkX25vZGVuYW1lKTsKKwkgIGlmICh0LT52ZF9hdXhwdHItPnZkYV9uZXh0cHRyICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfVmVyZGF1eCAqYTsKKworCSAgICAgIGZwcmludGYgKGYsICJcdCIpOworCSAgICAgIGZvciAoYSA9IHQtPnZkX2F1eHB0ci0+dmRhX25leHRwdHI7CisJCSAgIGEgIT0gTlVMTDsKKwkJICAgYSA9IGEtPnZkYV9uZXh0cHRyKQorCQlmcHJpbnRmIChmLCAiJXMgIiwgYS0+dmRhX25vZGVuYW1lKTsKKwkgICAgICBmcHJpbnRmIChmLCAiXG4iKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDApCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7CisKKyAgICAgIGZwcmludGYgKGYsIF8oIlxuVmVyc2lvbiBSZWZlcmVuY2VzOlxuIikpOworICAgICAgZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOyB0ICE9IE5VTEw7IHQgPSB0LT52bl9uZXh0cmVmKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOworCisJICBmcHJpbnRmIChmLCBfKCIgIHJlcXVpcmVkIGZyb20gJXM6XG4iKSwgdC0+dm5fZmlsZW5hbWUpOworCSAgZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKKwkgICAgZnByaW50ZiAoZiwgIiAgICAweCU4LjhseCAweCUyLjJ4ICUyLjJkICVzXG4iLCBhLT52bmFfaGFzaCwKKwkJICAgICBhLT52bmFfZmxhZ3MsIGEtPnZuYV9vdGhlciwgYS0+dm5hX25vZGVuYW1lKTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZHluYnVmICE9IE5VTEwpCisgICAgZnJlZSAoZHluYnVmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBEaXNwbGF5IEVMRi1zcGVjaWZpYyBmaWVsZHMgb2YgYSBzeW1ib2wuICAqLworCit2b2lkCitiZmRfZWxmX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZXAsIHN5bWJvbCwgaG93KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBmaWxlcDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OworeworICBGSUxFICpmaWxlID0gKEZJTEUgKikgZmlsZXA7CisgIHN3aXRjaCAoaG93KQorICAgIHsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKKyAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKKyAgICAgIGZwcmludGYgKGZpbGUsICJlbGYgIik7CisgICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgc3ltYm9sLT52YWx1ZSk7CisgICAgICBmcHJpbnRmIChmaWxlLCAiICVseCIsIChsb25nKSBzeW1ib2wtPmZsYWdzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6CisgICAgICB7CisJQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lOworCXNlY3Rpb25fbmFtZSA9IHN5bWJvbC0+c2VjdGlvbiA/IHN5bWJvbC0+c2VjdGlvbi0+bmFtZSA6ICIoKm5vbmUqKSI7CisJYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKKwlmcHJpbnRmIChmaWxlLCAiICVzXHQiLCBzZWN0aW9uX25hbWUpOworCS8qIFByaW50IHRoZSAib3RoZXIiIHZhbHVlIGZvciBhIHN5bWJvbC4gIEZvciBjb21tb24gc3ltYm9scywKKwkgICB3ZSd2ZSBhbHJlYWR5IHByaW50ZWQgdGhlIHNpemU7IG5vdyBwcmludCB0aGUgYWxpZ25tZW50LgorCSAgIEZvciBvdGhlciBzeW1ib2xzLCB3ZSBoYXZlIG5vIHNwZWNpZmllZCBhbGlnbm1lbnQsIGFuZAorCSAgIHdlJ3ZlIHByaW50ZWQgdGhlIGFkZHJlc3M7IG5vdyBwcmludCB0aGUgc2l6ZS4gICovCisJZnByaW50Zl92bWEgKGZpbGUsCisJCSAgICAgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQorCQkgICAgICA/ICgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUKKwkJICAgICAgOiAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUpKTsKKworCS8qIElmIHdlIGhhdmUgdmVyc2lvbiBpbmZvcm1hdGlvbiwgcHJpbnQgaXQuICAqLworCWlmIChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1fc2VjdGlvbiAhPSAwCisJICAgICYmIChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfc2VjdGlvbiAhPSAwCisJCXx8IGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9zZWN0aW9uICE9IDApKQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgdmVybnVtOworCSAgICBjb25zdCBjaGFyICp2ZXJzaW9uX3N0cmluZzsKKworCSAgICB2ZXJudW0gPSAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT52ZXJzaW9uICYgVkVSU1lNX1ZFUlNJT047CisKKwkgICAgaWYgKHZlcm51bSA9PSAwKQorCSAgICAgIHZlcnNpb25fc3RyaW5nID0gIiI7CisJICAgIGVsc2UgaWYgKHZlcm51bSA9PSAxKQorCSAgICAgIHZlcnNpb25fc3RyaW5nID0gIkJhc2UiOworCSAgICBlbHNlIGlmICh2ZXJudW0gPD0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcmRlZnMpCisJICAgICAgdmVyc2lvbl9zdHJpbmcgPQorCQllbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWZbdmVybnVtIC0gMV0udmRfbm9kZW5hbWU7CisJICAgIGVsc2UKKwkgICAgICB7CisJCUVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OworCisJCXZlcnNpb25fc3RyaW5nID0gIiI7CisJCWZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKKwkJICAgICB0ICE9IE5VTEw7CisJCSAgICAgdCA9IHQtPnZuX25leHRyZWYpCisJCSAgeworCQkgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7CisKKwkJICAgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCisJCSAgICAgIHsKKwkJCWlmIChhLT52bmFfb3RoZXIgPT0gdmVybnVtKQorCQkJICB7CisJCQkgICAgdmVyc2lvbl9zdHJpbmcgPSBhLT52bmFfbm9kZW5hbWU7CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKwkJICAgICAgfQorCQkgIH0KKwkgICAgICB9CisKKwkgICAgaWYgKCgoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT52ZXJzaW9uICYgVkVSU1lNX0hJRERFTikgPT0gMCkKKwkgICAgICBmcHJpbnRmIChmaWxlLCAiICAlLTExcyIsIHZlcnNpb25fc3RyaW5nKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW50IGk7CisKKwkJZnByaW50ZiAoZmlsZSwgIiAoJXMpIiwgdmVyc2lvbl9zdHJpbmcpOworCQlmb3IgKGkgPSAxMCAtIHN0cmxlbiAodmVyc2lvbl9zdHJpbmcpOyBpID4gMDsgLS1pKQorCQkgIHB1dGMgKCcgJywgZmlsZSk7CisJICAgICAgfQorCSAgfQorCisJLyogSWYgdGhlIHN0X290aGVyIGZpZWxkIGlzIG5vdCB6ZXJvLCBwcmludCBpdC4gICovCisJaWYgKCgoZWxmX3N5bWJvbF90eXBlICopIHN5bWJvbCktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgIT0gMCkKKwkgIGZwcmludGYgKGZpbGUsICIgMHglMDJ4IiwKKwkJICAgKCh1bnNpZ25lZCBpbnQpCisJCSAgICAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyKSk7CisKKwlmcHJpbnRmIChmaWxlLCAiICVzIiwgc3ltYm9sLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KK30KKwwKKy8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCisJIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAorCQkJCSB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPmluZHggPSAtMTsKKyAgICAgIHJldC0+c2l6ZSA9IDA7CisgICAgICByZXQtPmR5bmluZHggPSAtMTsKKyAgICAgIHJldC0+ZHluc3RyX2luZGV4ID0gMDsKKyAgICAgIHJldC0+d2Vha2RlZiA9IE5VTEw7CisgICAgICByZXQtPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisgICAgICByZXQtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisgICAgICByZXQtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikwOworICAgICAgcmV0LT52ZXJpbmZvLnZlcmRlZiA9IE5VTEw7CisgICAgICByZXQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPSBOVUxMOworICAgICAgcmV0LT52dGFibGVfZW50cmllc19zaXplID0gMDsKKyAgICAgIHJldC0+dnRhYmxlX3BhcmVudCA9IE5VTEw7CisgICAgICByZXQtPnR5cGUgPSBTVFRfTk9UWVBFOworICAgICAgcmV0LT5vdGhlciA9IDA7CisgICAgICAvKiBBc3N1bWUgdGhhdCB3ZSBoYXZlIGJlZW4gY2FsbGVkIGJ5IGEgbm9uLUVMRiBzeW1ib2wgcmVhZGVyLgorICAgICAgICAgVGhpcyBmbGFnIGlzIHRoZW4gcmVzZXQgYnkgdGhlIGNvZGUgd2hpY2ggcmVhZHMgYW4gRUxGIGlucHV0CisgICAgICAgICBmaWxlLiAgVGhpcyBlbnN1cmVzIHRoYXQgYSBzeW1ib2wgY3JlYXRlZCBieSBhIG5vbi1FTEYgc3ltYm9sCisgICAgICAgICByZWFkZXIgd2lsbCBoYXZlIHRoZSBmbGFnIHNldCBjb3JyZWN0bHkuICAqLworICAgICAgcmV0LT5lbGZfbGlua19oYXNoX2ZsYWdzID0gRUxGX0xJTktfTk9OX0VMRjsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBJbml0aWFsaXplIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK2Jvb2xlYW4KK19iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCQkJY29uc3QgY2hhciAqKSk7Cit7CisgIHRhYmxlLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSBmYWxzZTsKKyAgdGFibGUtPmR5bm9iaiA9IE5VTEw7CisgIC8qIFRoZSBmaXJzdCBkeW5hbWljIHN5bWJvbCBpcyBhIGR1bW15LiAgKi8KKyAgdGFibGUtPmR5bnN5bWNvdW50ID0gMTsKKyAgdGFibGUtPmR5bnN0ciA9IE5VTEw7CisgIHRhYmxlLT5idWNrZXRjb3VudCA9IDA7CisgIHRhYmxlLT5uZWVkZWQgPSBOVUxMOworICB0YWJsZS0+aGdvdCA9IE5VTEw7CisgIHRhYmxlLT5zdGFiX2luZm8gPSBOVUxMOworICByZXR1cm4gX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBhYmZkLCBuZXdmdW5jKTsKK30KKworLyogQ3JlYXRlIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKK19iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLCBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuICZyZXQtPnJvb3Q7Cit9CisKKy8qIFRoaXMgaXMgYSBob29rIGZvciB0aGUgRUxGIGVtdWxhdGlvbiBjb2RlIGluIHRoZSBnZW5lcmljIGxpbmtlciB0bworICAgdGVsbCB0aGUgYmFja2VuZCBsaW5rZXIgd2hhdCBmaWxlIG5hbWUgdG8gdXNlIGZvciB0aGUgRFRfTkVFREVECisgICBlbnRyeSBmb3IgYSBkeW5hbWljIG9iamVjdC4gIFRoZSBnZW5lcmljIGxpbmtlciBwYXNzZXMgbmFtZSBhcyBhbgorICAgZW1wdHkgc3RyaW5nIHRvIGluZGljYXRlIHRoYXQgbm8gRFRfTkVFREVEIGVudHJ5IHNob3VsZCBiZSBtYWRlLiAgKi8KKwordm9pZAorYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCisgICAgZWxmX2R0X25hbWUgKGFiZmQpID0gbmFtZTsKK30KKworLyogR2V0IHRoZSBsaXN0IG9mIERUX05FRURFRCBlbnRyaWVzIGZvciBhIGxpbmsuICBUaGlzIGlzIGEgaG9vayBmb3IKKyAgIHRoZSBsaW5rZXIgRUxGIGVtdWxhdGlvbiBjb2RlLiAgKi8KKworc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoKK2JmZF9lbGZfZ2V0X25lZWRlZF9saXN0IChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Cit9CisKKy8qIEdldCB0aGUgbmFtZSBhY3R1YWxseSB1c2VkIGZvciBhIGR5bmFtaWMgb2JqZWN0IGZvciBhIGxpbmsuICBUaGlzCisgICBpcyB0aGUgU09OQU1FIGVudHJ5IGlmIHRoZXJlIGlzIG9uZS4gIE90aGVyd2lzZSwgaXQgaXMgdGhlIHN0cmluZworICAgcGFzc2VkIHRvIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLCBvciBpdCBpcyB0aGUgZmlsZW5hbWUuICAqLworCitjb25zdCBjaGFyICoKK2JmZF9lbGZfZ2V0X2R0X3NvbmFtZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKKyAgICByZXR1cm4gZWxmX2R0X25hbWUgKGFiZmQpOworICByZXR1cm4gTlVMTDsKK30KKworLyogR2V0IHRoZSBsaXN0IG9mIERUX05FRURFRCBlbnRyaWVzIGZyb20gYSBCRkQuICBUaGlzIGlzIGEgaG9vayBmb3IKKyAgIHRoZSBFTEYgbGlua2VyIGVtdWxhdGlvbiBjb2RlLiAgKi8KKworYm9vbGVhbgorYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCBwbmVlZGVkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKnBuZWVkZWQ7Cit7CisgIGFzZWN0aW9uICpzOworICBiZmRfYnl0ZSAqZHluYnVmID0gTlVMTDsKKyAgaW50IGVsZnNlYzsKKyAgdW5zaWduZWQgbG9uZyBsaW5rOworICBiZmRfYnl0ZSAqZXh0ZHluLCAqZXh0ZHluZW5kOworICBzaXplX3QgZXh0ZHluc2l6ZTsKKyAgdm9pZCAoKnN3YXBfZHluX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKKworICAqcG5lZWRlZCA9IE5VTEw7CisKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKKyAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBkeW5idWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAocy0+X3Jhd19zaXplKTsKKyAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKFBUUikgZHluYnVmLCAoZmlsZV9wdHIpIDAsCisJCQkJICBzLT5fcmF3X3NpemUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGVsZnNlYyA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgcyk7CisgIGlmIChlbGZzZWMgPT0gLTEpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgbGluayA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbZWxmc2VjXS0+c2hfbGluazsKKworICBleHRkeW5zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZHluOworICBzd2FwX2R5bl9pbiA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c3dhcF9keW5faW47CisKKyAgZXh0ZHluID0gZHluYnVmOworICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemU7CisgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5biArPSBleHRkeW5zaXplKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9EeW4gZHluOworCisgICAgICAoKnN3YXBfZHluX2luKSAoYWJmZCwgKFBUUikgZXh0ZHluLCAmZHluKTsKKworICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9OVUxMKQorCWJyZWFrOworCisgICAgICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRCkKKwl7CisJICBjb25zdCBjaGFyICpzdHJpbmc7CisJICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7CisKKwkgIHN0cmluZyA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGxpbmssCisJCQkJCQkgICAgZHluLmRfdW4uZF92YWwpOworCSAgaWYgKHN0cmluZyA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgbCA9IChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKmwpOworCSAgaWYgKGwgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGwtPmJ5ID0gYWJmZDsKKwkgIGwtPm5hbWUgPSBzdHJpbmc7CisJICBsLT5uZXh0ID0gKnBuZWVkZWQ7CisJICAqcG5lZWRlZCA9IGw7CisJfQorICAgIH0KKworICBmcmVlIChkeW5idWYpOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZHluYnVmICE9IE5VTEwpCisgICAgZnJlZSAoZHluYnVmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorDAorLyogQWxsb2NhdGUgYW4gRUxGIHN0cmluZyB0YWJsZS0tZm9yY2UgdGhlIGZpcnN0IGJ5dGUgdG8gYmUgemVyby4gICovCisKK3N0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgorX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQgKCkKK3sKKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqcmV0OworCisgIHJldCA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7CisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2l6ZV90eXBlIGxvYzsKKworICAgICAgbG9jID0gX2JmZF9zdHJpbmd0YWJfYWRkIChyZXQsICIiLCB0cnVlLCBmYWxzZSk7CisgICAgICBCRkRfQVNTRVJUIChsb2MgPT0gMCB8fCBsb2MgPT0gKGJmZF9zaXplX3R5cGUpIC0xKTsKKyAgICAgIGlmIChsb2MgPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorCXsKKwkgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHJldCk7CisJICByZXQgPSBOVUxMOworCX0KKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisMCisvKiBFTEYgLm8vZXhlYyBmaWxlIHJlYWRpbmcgKi8KKworLyogQ3JlYXRlIGEgbmV3IGJmZCBzZWN0aW9uIGZyb20gYW4gRUxGIHNlY3Rpb24gaGVhZGVyLiAqLworCitib29sZWFuCitiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIHNoaW5kZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IHNoaW5kZXg7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdOworICBFbGZfSW50ZXJuYWxfRWhkciAqZWhkciA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworICBjaGFyICpuYW1lOworCisgIG5hbWUgPSBlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYiAoYWJmZCwgaGRyLT5zaF9uYW1lKTsKKworICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKKyAgICB7CisgICAgY2FzZSBTSFRfTlVMTDoKKyAgICAgIC8qIEluYWN0aXZlIHNlY3Rpb24uIFRocm93IGl0IGF3YXkuICAqLworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIFNIVF9QUk9HQklUUzoJLyogTm9ybWFsIHNlY3Rpb24gd2l0aCBjb250ZW50cy4gICovCisgICAgY2FzZSBTSFRfRFlOQU1JQzoJLyogRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgICBjYXNlIFNIVF9OT0JJVFM6CS8qIC5ic3Mgc2VjdGlvbi4gICovCisgICAgY2FzZSBTSFRfSEFTSDoJLyogLmhhc2ggc2VjdGlvbi4gICovCisgICAgY2FzZSBTSFRfTk9URToJLyogLm5vdGUgc2VjdGlvbi4gICovCisgICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKKworICAgIGNhc2UgU0hUX1NZTVRBQjoJCS8qIEEgc3ltYm9sIHRhYmxlICovCisgICAgICBpZiAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gc2hpbmRleCkKKwlyZXR1cm4gdHJ1ZTsKKworICAgICAgQkZEX0FTU0VSVCAoaGRyLT5zaF9lbnRzaXplID09IGJlZC0+cy0+c2l6ZW9mX3N5bSk7CisgICAgICBCRkRfQVNTRVJUIChlbGZfb25lc3ltdGFiIChhYmZkKSA9PSAwKTsKKyAgICAgIGVsZl9vbmVzeW10YWIgKGFiZmQpID0gc2hpbmRleDsKKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIgPSAqaGRyOworICAgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7CisKKyAgICAgIC8qIFNvbWV0aW1lcyBhIHNoYXJlZCBvYmplY3Qgd2lsbCBtYXAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIElmCisgICAgICAgICBTSEZfQUxMT0MgaXMgc2V0LCBhbmQgdGhpcyBpcyBhIHNoYXJlZCBvYmplY3QsIHRoZW4gd2UgYWxzbworICAgICAgICAgdHJlYXQgdGhpcyBzZWN0aW9uIGFzIGEgQkZEIHNlY3Rpb24uICBXZSBjYW4gbm90IGJhc2UgdGhlCisgICAgICAgICBkZWNpc2lvbiBwdXJlbHkgb24gU0hGX0FMTE9DLCBiZWNhdXNlIHRoYXQgZmxhZyBpcyBzb21ldGltZXMKKyAgICAgICAgIHNldCBpbiBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSwgd2hpY2ggd291bGQgY29uZnVzZSB0aGUKKyAgICAgICAgIGxpbmtlci4gICovCisgICAgICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDAKKwkgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKKwkgICYmICEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBTSFRfRFlOU1lNOgkJLyogQSBkeW5hbWljIHN5bWJvbCB0YWJsZSAqLworICAgICAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IHNoaW5kZXgpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfZW50c2l6ZSA9PSBiZWQtPnMtPnNpemVvZl9zeW0pOworICAgICAgQkZEX0FTU0VSVCAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCk7CisgICAgICBlbGZfZHluc3ltdGFiIChhYmZkKSA9IHNoaW5kZXg7CisgICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyID0gKmhkcjsKKyAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKKyAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOworCisgICAgICAvKiBCZXNpZGVzIGJlaW5nIGEgc3ltYm9sIHRhYmxlLCB3ZSBhbHNvIHRyZWF0IHRoaXMgYXMgYSByZWd1bGFyCisJIHNlY3Rpb24sIHNvIHRoYXQgb2JqY29weSBjYW4gaGFuZGxlIGl0LiAgKi8KKyAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOworCisgICAgY2FzZSBTSFRfU1RSVEFCOgkJLyogQSBzdHJpbmcgdGFibGUgKi8KKyAgICAgIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCisJcmV0dXJuIHRydWU7CisgICAgICBpZiAoZWhkci0+ZV9zaHN0cm5keCA9PSBzaGluZGV4KQorCXsKKwkgIGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkciA9ICpoZHI7CisJICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gJmVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkcjsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBlaGRyLT5lX3NobnVtOyBpKyspCisJICB7CisJICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsKKwkgICAgaWYgKGhkcjItPnNoX2xpbmsgPT0gc2hpbmRleCkKKwkgICAgICB7CisJCWlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaSkpCisJCSAgcmV0dXJuIGZhbHNlOworCQlpZiAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gaSkKKwkJICB7CisJCSAgICBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyID0gKmhkcjsKKwkJICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPQorCQkgICAgICAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKKwkJICAgIHJldHVybiB0cnVlOworCQkgIH0KKwkJaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IGkpCisJCSAgeworCQkgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHluc3RydGFiX2hkciA9ICpoZHI7CisJCSAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0KKwkJICAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN0cnRhYl9oZHI7CisJCSAgICAvKiBXZSBhbHNvIHRyZWF0IHRoaXMgYXMgYSByZWd1bGFyIHNlY3Rpb24sIHNvCisJCSAgICAgICB0aGF0IG9iamNvcHkgY2FuIGhhbmRsZSBpdC4gICovCisJCSAgICBicmVhazsKKwkJICB9CisjaWYgMCAvKiBOb3QgaGFuZGxpbmcgb3RoZXIgc3RyaW5nIHRhYmxlcyBzcGVjaWFsbHkgcmlnaHQgbm93LiAgKi8KKwkJaGRyMiA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07CS8qIGluIGNhc2UgaXQgbW92ZWQgKi8KKwkJLyogV2UgaGF2ZSBhIHN0cnRhYiBmb3Igc29tZSByYW5kb20gb3RoZXIgc2VjdGlvbi4gICovCisJCW5ld3NlY3QgPSAoYXNlY3Rpb24gKikgaGRyMi0+YmZkX3NlY3Rpb247CisJCWlmICghbmV3c2VjdCkKKwkJICBicmVhazsKKwkJaGRyLT5iZmRfc2VjdGlvbiA9IG5ld3NlY3Q7CisJCWhkcjIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobmV3c2VjdCktPnN0cl9oZHI7CisJCSpoZHIyID0gKmhkcjsKKwkJZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7CisjZW5kaWYKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOworCisgICAgY2FzZSBTSFRfUkVMOgorICAgIGNhc2UgU0hUX1JFTEE6CisgICAgICAvKiAqVGhlc2UqIGRvIGEgbG90IG9mIHdvcmsgLS0gYnV0IGJ1aWxkIG5vIHNlY3Rpb25zISAgKi8KKyAgICAgIHsKKwlhc2VjdGlvbiAqdGFyZ2V0X3NlY3Q7CisJRWxmX0ludGVybmFsX1NoZHIgKmhkcjI7CisKKwkvKiBGb3Igc29tZSBpbmNvbXByZWhlbnNpYmxlIHJlYXNvbiBPcmFjbGUgZGlzdHJpYnV0ZXMKKwkgICBsaWJyYXJpZXMgZm9yIFNvbGFyaXMgaW4gd2hpY2ggc29tZSBvZiB0aGUgb2JqZWN0cyBoYXZlCisJICAgYm9ndXMgc2hfbGluayBmaWVsZHMuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGp1c3QKKwkgICByZWplY3QgdGhlbSwgYnV0LCB1bmZvcnR1bmF0ZWx5LCBzb21lIHBlb3BsZSBuZWVkIHRvIHVzZQorCSAgIHRoZW0uICBXZSBzY2FuIHRocm91Z2ggdGhlIHNlY3Rpb24gaGVhZGVyczsgaWYgd2UgZmluZCBvbmx5CisJICAgb25lIHN1aXRhYmxlIHN5bWJvbCB0YWJsZSwgd2UgY2xvYmJlciB0aGUgc2hfbGluayB0byBwb2ludAorCSAgIHRvIGl0LiAgSSBob3BlIHRoaXMgZG9lc24ndCBicmVhayBhbnl0aGluZy4gICovCisJaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCCisJICAgICYmIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQorCSAgeworCSAgICBpbnQgc2NhbjsKKwkgICAgaW50IGZvdW5kOworCisJICAgIGZvdW5kID0gMDsKKwkgICAgZm9yIChzY2FuID0gMTsgc2NhbiA8IGVoZHItPmVfc2hudW07IHNjYW4rKykKKwkgICAgICB7CisJCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NjYW5dLT5zaF90eXBlID09IFNIVF9TWU1UQUIKKwkJICAgIHx8IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKKwkJICB7CisJCSAgICBpZiAoZm91bmQgIT0gMCkKKwkJICAgICAgeworCQkJZm91bmQgPSAwOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICAgIGZvdW5kID0gc2NhbjsKKwkJICB9CisJICAgICAgfQorCSAgICBpZiAoZm91bmQgIT0gMCkKKwkgICAgICBoZHItPnNoX2xpbmsgPSBmb3VuZDsKKwkgIH0KKworCS8qIEdldCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKwlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlID09IFNIVF9TWU1UQUIKKwkgICAgJiYgISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfbGluaykpCisJICByZXR1cm4gZmFsc2U7CisKKwkvKiBJZiB0aGlzIHJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSB3ZQorCSAgIGRvbid0IHRyZWF0IGl0IGFzIGEgcmVsb2Mgc2VjdGlvbi4gIEJGRCBjYW4ndCBhZGVxdWF0ZWx5CisJICAgcmVwcmVzZW50IHN1Y2ggYSBzZWN0aW9uLCBzbyBhdCBsZWFzdCBmb3Igbm93LCB3ZSBkb24ndAorCSAgIHRyeS4gIFdlIGp1c3QgcHJlc2VudCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLiAgKi8KKwlpZiAoaGRyLT5zaF9saW5rICE9IGVsZl9vbmVzeW10YWIgKGFiZmQpKQorCSAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7CisKKwlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfaW5mbykpCisJICByZXR1cm4gZmFsc2U7CisJdGFyZ2V0X3NlY3QgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaGRyLT5zaF9pbmZvKTsKKwlpZiAodGFyZ2V0X3NlY3QgPT0gTlVMTCkKKwkgIHJldHVybiBmYWxzZTsKKworCWlmICgodGFyZ2V0X3NlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCisJICAgIHx8IHRhcmdldF9zZWN0LT5yZWxvY19jb3VudCA9PSAwKQorCSAgaGRyMiA9ICZlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHI7CisJZWxzZQorCSAgeworCSAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID09IE5VTEwpOworCSAgICBoZHIyID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaGRyMikpOworCSAgICBlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID0gaGRyMjsKKwkgIH0KKwkqaGRyMiA9ICpoZHI7CisJZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7CisJdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ICs9IGhkci0+c2hfc2l6ZSAvIGhkci0+c2hfZW50c2l6ZTsKKwl0YXJnZXRfc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOworCXRhcmdldF9zZWN0LT5yZWxvY2F0aW9uID0gTlVMTDsKKwl0YXJnZXRfc2VjdC0+cmVsX2ZpbGVwb3MgPSBoZHItPnNoX29mZnNldDsKKwlhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hUX0dOVV92ZXJkZWY6CisgICAgICBlbGZfZHludmVyZGVmIChhYmZkKSA9IHNoaW5kZXg7CisgICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyID0gKmhkcjsKKyAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOgorICAgICAgZWxmX2R5bnZlcnN5bSAoYWJmZCkgPSBzaGluZGV4OworICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkciA9ICpoZHI7CisgICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSFRfR05VX3Zlcm5lZWQ6CisgICAgICBlbGZfZHludmVycmVmIChhYmZkKSA9IHNoaW5kZXg7CisgICAgICBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfaGRyID0gKmhkcjsKKyAgICAgIHJldHVybiBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNIVF9TSExJQjoKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIENoZWNrIGZvciBhbnkgcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLworICAgICAgeworCWlmIChiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKQorCSAgKCpiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyKSAoYWJmZCwgaGRyLCBuYW1lKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2l2ZW4gYW4gRUxGIHNlY3Rpb24gbnVtYmVyLCByZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZyBCRkQKKyAgIHNlY3Rpb24uICAqLworCithc2VjdGlvbiAqCitiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaW5kZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IGluZGV4OworeworICBCRkRfQVNTRVJUIChpbmRleCA+IDAgJiYgaW5kZXggPCBTSE5fTE9SRVNFUlZFKTsKKyAgaWYgKGluZGV4ID49IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpbmRleF0tPmJmZF9zZWN0aW9uOworfQorCitib29sZWFuCitfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKK3sKKyAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICpzZGF0YTsKKworICBzZGF0YSA9IChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCpzZGF0YSkpOworICBpZiAoIXNkYXRhKQorICAgIHJldHVybiBmYWxzZTsKKyAgc2VjLT51c2VkX2J5X2JmZCA9IChQVFIpIHNkYXRhOworICBtZW1zZXQgKHNkYXRhLCAwLCBzaXplb2YgKCpzZGF0YSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ3JlYXRlIGEgbmV3IGJmZCBzZWN0aW9uIGZyb20gYW4gRUxGIHByb2dyYW0gaGVhZGVyLgorCisgICBTaW5jZSBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgbm8gbmFtZXMsIHdlIGdlbmVyYXRlIGEgc3ludGhldGljIG5hbWUKKyAgIG9mIHRoZSBmb3JtIHNlZ21lbnQ8TlVNPiwgd2hlcmUgTlVNIGlzIGdlbmVyYWxseSB0aGUgaW5kZXggaW4gdGhlCisgICBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIEZvciBzZWdtZW50cyB0aGF0IGFyZSBzcGxpdCAoc2VlIGJlbG93KSB3ZQorICAgZ2VuZXJhdGUgdGhlIG5hbWVzIHNlZ21lbnQ8TlVNPmEgYW5kIHNlZ21lbnQ8TlVNPmIuCisKKyAgIE5vdGUgdGhhdCBzb21lIHByb2dyYW0gc2VnbWVudHMgbWF5IGhhdmUgYSBmaWxlIHNpemUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbgorICAgKGxlc3MgdGhhbikgdGhlIG1lbW9yeSBzaXplLiAgQWxsIHRoaXMgbWVhbnMgaXMgdGhhdCBhdCBleGVjdXRpb24gdGhlCisgICBzeXN0ZW0gbXVzdCBhbGxvY2F0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSBzcGVjaWZpZWQgYnkgdGhlIG1lbW9yeSBzaXplLAorICAgYnV0IG9ubHkgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBmaXJzdCAiZmlsZSBzaXplIiBieXRlcyByZWFkIGZyb20gdGhlCisgICBmaWxlLiAgVGhpcyB3b3VsZCBvY2N1ciBmb3IgZXhhbXBsZSwgd2l0aCBwcm9ncmFtIHNlZ21lbnRzIGNvbnNpc3RpbmcKKyAgIG9mIGNvbWJpbmVkIGRhdGErYnNzLgorCisgICBUbyBoYW5kbGUgdGhlIGFib3ZlIHNpdHVhdGlvbiwgdGhpcyByb3V0aW5lIGdlbmVyYXRlcyBUV08gYmZkIHNlY3Rpb25zCisgICBmb3IgdGhlIHNpbmdsZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgZmlyc3QgaGFzIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5CisgICB0aGUgZmlsZSBzaXplIG9mIHRoZSBzZWdtZW50LCBhbmQgdGhlIHNlY29uZCBoYXMgdGhlIGxlbmd0aCBzcGVjaWZpZWQKKyAgIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzaXplcy4gIEluIGVmZmVjdCwgdGhlIHNlZ21lbnQgaXMgc3BsaXQKKyAgIGludG8gaXQncyBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBwYXJ0cy4KKworICovCisKK2Jvb2xlYW4KK2JmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCkKKyAgICAgYmZkICphYmZkOworICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaGRyOworICAgICBpbnQgaW5kZXg7Cit7CisgIGFzZWN0aW9uICpuZXdzZWN0OworICBjaGFyICpuYW1lOworICBjaGFyIG5hbWVidWZbNjRdOworICBpbnQgc3BsaXQ7CisKKyAgc3BsaXQgPSAoKGhkci0+cF9tZW1zeiA+IDApCisJICAgICYmIChoZHItPnBfZmlsZXN6ID4gMCkKKwkgICAgJiYgKGhkci0+cF9tZW1zeiA+IGhkci0+cF9maWxlc3opKTsKKyAgc3ByaW50ZiAobmFtZWJ1Ziwgc3BsaXQgPyAic2VnbWVudCVkYSIgOiAic2VnbWVudCVkIiwgaW5kZXgpOworICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7CisgIGlmICghbmFtZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHN0cmNweSAobmFtZSwgbmFtZWJ1Zik7CisgIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIG5ld3NlY3QtPnZtYSA9IGhkci0+cF92YWRkcjsKKyAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyOworICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfZmlsZXN6OworICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5wX29mZnNldDsKKyAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKKyAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCisgICAgeworICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOworICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0xPQUQ7CisgICAgICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKKwl7CisJICAvKiBGSVhNRTogYWxsIHdlIGtub3duIGlzIHRoYXQgaXQgaGFzIGV4ZWN1dGUgUEVSTUlTU0lPTiwKKwkgICAgIG1heSBiZSBkYXRhLiAqLworCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7CisJfQorICAgIH0KKyAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCisgICAgeworICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOworICAgIH0KKworICBpZiAoc3BsaXQpCisgICAgeworICAgICAgc3ByaW50ZiAobmFtZWJ1ZiwgInNlZ21lbnQlZGIiLCBpbmRleCk7CisgICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7CisgICAgICBpZiAoIW5hbWUpCisJcmV0dXJuIGZhbHNlOworICAgICAgc3RyY3B5IChuYW1lLCBuYW1lYnVmKTsKKyAgICAgIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgICAgIGlmIChuZXdzZWN0ID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgbmV3c2VjdC0+dm1hID0gaGRyLT5wX3ZhZGRyICsgaGRyLT5wX2ZpbGVzejsKKyAgICAgIG5ld3NlY3QtPmxtYSA9IGhkci0+cF9wYWRkciArIGhkci0+cF9maWxlc3o7CisgICAgICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfbWVtc3ogLSBoZHItPnBfZmlsZXN6OworICAgICAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCisJeworCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOworCSAgaWYgKGhkci0+cF9mbGFncyAmIFBGX1gpCisJICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOworCX0KKyAgICAgIGlmICghKGhkci0+cF9mbGFncyAmIFBGX1cpKQorCW5ld3NlY3QtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNldCB1cCBhbiBFTEYgaW50ZXJuYWwgc2VjdGlvbiBoZWFkZXIgZm9yIGEgc2VjdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBhc2VjdCwgZmFpbGVkcHRyYXJnKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICphc2VjdDsKKyAgICAgUFRSIGZhaWxlZHB0cmFyZzsKK3sKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKKyAgYm9vbGVhbiAqZmFpbGVkcHRyID0gKGJvb2xlYW4gKikgZmFpbGVkcHRyYXJnOworICBFbGZfSW50ZXJuYWxfU2hkciAqdGhpc19oZHI7CisKKyAgaWYgKCpmYWlsZWRwdHIpCisgICAgeworICAgICAgLyogV2UgYWxyZWFkeSBmYWlsZWQ7IGp1c3QgZ2V0IG91dCBvZiB0aGUgYmZkX21hcF9vdmVyX3NlY3Rpb25zCisgICAgICAgICBsb29wLiAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdGhpc19oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT50aGlzX2hkcjsKKworICB0aGlzX2hkci0+c2hfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9zaHN0cnRhYiAoYWJmZCksCisJCQkJCQkJICBhc2VjdC0+bmFtZSwKKwkJCQkJCQkgIHRydWUsIGZhbHNlKTsKKyAgaWYgKHRoaXNfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKKyAgICB7CisgICAgICAqZmFpbGVkcHRyID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdGhpc19oZHItPnNoX2ZsYWdzID0gMDsKKworICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorICAgICAgfHwgYXNlY3QtPnVzZXJfc2V0X3ZtYSkKKyAgICB0aGlzX2hkci0+c2hfYWRkciA9IGFzZWN0LT52bWE7CisgIGVsc2UKKyAgICB0aGlzX2hkci0+c2hfYWRkciA9IDA7CisKKyAgdGhpc19oZHItPnNoX29mZnNldCA9IDA7CisgIHRoaXNfaGRyLT5zaF9zaXplID0gYXNlY3QtPl9yYXdfc2l6ZTsKKyAgdGhpc19oZHItPnNoX2xpbmsgPSAwOworICB0aGlzX2hkci0+c2hfYWRkcmFsaWduID0gMSA8PCBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyOworICAvKiBUaGUgc2hfZW50c2l6ZSBhbmQgc2hfaW5mbyBmaWVsZHMgbWF5IGhhdmUgYmVlbiBzZXQgYWxyZWFkeSBieQorICAgICBjb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLiAgKi8KKworICB0aGlzX2hkci0+YmZkX3NlY3Rpb24gPSBhc2VjdDsKKyAgdGhpc19oZHItPmNvbnRlbnRzID0gTlVMTDsKKworICAvKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGJhc2VkIG9uIHNlY3Rpb24gbmFtZXMuICAqLworICBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5zdHIiKSA9PSAwKQorICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKKyAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5oYXNoIikgPT0gMCkKKyAgICB7CisgICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9IQVNIOworICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPmFyY2hfc2l6ZSAvIDg7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bnN5bSIpID09IDApCisgICAgeworICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfRFlOU1lNOworICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9zeW07CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bmFtaWMiKSA9PSAwKQorICAgIHsKKyAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0RZTkFNSUM7CisgICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX2R5bjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnJlbGEiLCA1KSA9PSAwCisJICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT51c2VfcmVsYV9wKQorICAgIHsKKyAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1JFTEE7CisgICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3JlbGE7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwCisJICAgJiYgISBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnVzZV9yZWxhX3ApCisgICAgeworICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUkVMOworICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9yZWw7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKKyAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9OT1RFOworICBlbHNlIGlmIChzdHJuY21wIChhc2VjdC0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMAorCSAgICYmIHN0cmNtcCAoYXNlY3QtPm5hbWUgKyBzdHJsZW4gKGFzZWN0LT5uYW1lKSAtIDMsICJzdHIiKSA9PSAwKQorICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKKyAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbiIpID09IDApCisgICAgeworICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3ZlcnN5bTsKKyAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb25fZCIpID09IDApCisgICAgeworICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3ZlcmRlZjsKKyAgICAgIHRoaXNfaGRyLT5zaF9lbnRzaXplID0gMDsKKyAgICAgIC8qIG9iamNvcHkgb3Igc3RyaXAgd2lsbCBjb3B5IG92ZXIgc2hfaW5mbywgYnV0IG1heSBub3Qgc2V0CisgICAgICAgICBjdmVyZGVmcy4gIFRoZSBsaW5rZXIgd2lsbCBzZXQgY3ZlcmRlZnMsIGJ1dCBzaF9pbmZvIHdpbGwgYmUKKyAgICAgICAgIHplcm8uICAqLworICAgICAgaWYgKHRoaXNfaGRyLT5zaF9pbmZvID09IDApCisJdGhpc19oZHItPnNoX2luZm8gPSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmczsKKyAgICAgIGVsc2UKKwlCRkRfQVNTRVJUIChlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyA9PSAwCisJCSAgICB8fCB0aGlzX2hkci0+c2hfaW5mbyA9PSBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyk7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uX3IiKSA9PSAwKQorICAgIHsKKyAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0dOVV92ZXJuZWVkOworICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSAwOworICAgICAgLyogb2JqY29weSBvciBzdHJpcCB3aWxsIGNvcHkgb3ZlciBzaF9pbmZvLCBidXQgbWF5IG5vdCBzZXQKKyAgICAgICAgIGN2ZXJyZWZzLiAgVGhlIGxpbmtlciB3aWxsIHNldCBjdmVycmVmcywgYnV0IHNoX2luZm8gd2lsbCBiZQorICAgICAgICAgemVyby4gICovCisgICAgICBpZiAodGhpc19oZHItPnNoX2luZm8gPT0gMCkKKwl0aGlzX2hkci0+c2hfaW5mbyA9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzOworICAgICAgZWxzZQorCUJGRF9BU1NFUlQgKGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzID09IDAKKwkJICAgIHx8IHRoaXNfaGRyLT5zaF9pbmZvID09IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzKTsKKyAgICB9CisgIGVsc2UgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKKwkgICAmJiAoYXNlY3QtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCisgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisgIGVsc2UgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKKwkgICAmJiAoKGFzZWN0LT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKSkKKyAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXaG8ga25vd3M/ICAqLworICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisgICAgfQorCisgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CisgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQorICAgIHRoaXNfaGRyLT5zaF9mbGFncyB8PSBTSEZfV1JJVEU7CisgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0NPREUpICE9IDApCisgICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9FWEVDSU5TVFI7CisKKyAgLyogQ2hlY2sgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KKyAgeworICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisKKyAgICBpZiAoYmVkLT5lbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKQorICAgICAgKCpiZWQtPmVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpIChhYmZkLCB0aGlzX2hkciwgYXNlY3QpOworICB9CisKKyAgLyogSWYgdGhlIHNlY3Rpb24gaGFzIHJlbG9jcywgc2V0IHVwIGEgc2VjdGlvbiBoZWFkZXIgZm9yIHRoZQorICAgICBTSFRfUkVMW0FdIHNlY3Rpb24uICAqLworICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7CisgICAgICBpbnQgdXNlX3JlbGFfcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+dXNlX3JlbGFfcDsKKyAgICAgIGNoYXIgKm5hbWU7CisKKyAgICAgIHJlbGFfaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KS0+cmVsX2hkcjsKKyAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAiLnJlbGEiICsgc3RybGVuIChhc2VjdC0+bmFtZSkpOworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwl7CisJICAqZmFpbGVkcHRyID0gdHJ1ZTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzcHJpbnRmIChuYW1lLCAiJXMlcyIsIHVzZV9yZWxhX3AgPyAiLnJlbGEiIDogIi5yZWwiLCBhc2VjdC0+bmFtZSk7CisgICAgICByZWxhX2hkci0+c2hfbmFtZSA9CisJKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfc2hzdHJ0YWIgKGFiZmQpLCBuYW1lLAorCQkJCQkgICB0cnVlLCBmYWxzZSk7CisgICAgICBpZiAocmVsYV9oZHItPnNoX25hbWUgPT0gKHVuc2lnbmVkIGludCkgLTEpCisJeworCSAgKmZhaWxlZHB0ciA9IHRydWU7CisJICByZXR1cm47CisJfQorICAgICAgcmVsYV9oZHItPnNoX3R5cGUgPSB1c2VfcmVsYV9wID8gU0hUX1JFTEEgOiBTSFRfUkVMOworICAgICAgcmVsYV9oZHItPnNoX2VudHNpemUgPSAodXNlX3JlbGFfcAorCQkJICAgICAgPyBiZWQtPnMtPnNpemVvZl9yZWxhCisJCQkgICAgICA6IGJlZC0+cy0+c2l6ZW9mX3JlbCk7CisgICAgICByZWxhX2hkci0+c2hfYWRkcmFsaWduID0gYmVkLT5zLT5maWxlX2FsaWduOworICAgICAgcmVsYV9oZHItPnNoX2ZsYWdzID0gMDsKKyAgICAgIHJlbGFfaGRyLT5zaF9hZGRyID0gMDsKKyAgICAgIHJlbGFfaGRyLT5zaF9zaXplID0gMDsKKyAgICAgIHJlbGFfaGRyLT5zaF9vZmZzZXQgPSAwOworICAgIH0KK30KKworLyogQXNzaWduIGFsbCBFTEYgc2VjdGlvbiBudW1iZXJzLiAgVGhlIGR1bW15IGZpcnN0IHNlY3Rpb24gaXMgaGFuZGxlZCBoZXJlCisgICB0b28uICBUaGUgbGluay9pbmZvIHBvaW50ZXJzIGZvciB0aGUgc3RhbmRhcmQgc2VjdGlvbiB0eXBlcyBhcmUgZmlsbGVkCisgICBpbiBoZXJlIHRvbywgd2hpbGUgd2UncmUgYXQgaXQuICAqLworCitzdGF0aWMgYm9vbGVhbgorYXNzaWduX3NlY3Rpb25fbnVtYmVycyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqdCA9IGVsZl90ZGF0YSAoYWJmZCk7CisgIGFzZWN0aW9uICpzZWM7CisgIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKKyAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworCisgIHNlY3Rpb25fbnVtYmVyID0gMTsKKworICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmQgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpOworCisgICAgICBkLT50aGlzX2lkeCA9IHNlY3Rpb25fbnVtYmVyKys7CisgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCisJZC0+cmVsX2lkeCA9IDA7CisgICAgICBlbHNlCisJZC0+cmVsX2lkeCA9IHNlY3Rpb25fbnVtYmVyKys7CisgICAgfQorCisgIHQtPnNoc3RydGFiX3NlY3Rpb24gPSBzZWN0aW9uX251bWJlcisrOworICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCA9IHQtPnNoc3RydGFiX3NlY3Rpb247CisgIHQtPnNoc3RydGFiX2hkci5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7CisKKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKKyAgICB7CisgICAgICB0LT5zeW10YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7CisgICAgICB0LT5zdHJ0YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7CisgICAgfQorCisgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtID0gc2VjdGlvbl9udW1iZXI7CisKKyAgLyogU2V0IHVwIHRoZSBsaXN0IG9mIHNlY3Rpb24gaGVhZGVyIHBvaW50ZXJzLCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUKKyAgICAgaW5kaWNlcy4gICovCisgIGlfc2hkcnAgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQorCSAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uX251bWJlciAqIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIgKikpKTsKKyAgaWYgKGlfc2hkcnAgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaV9zaGRycFswXSA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKKwkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSkpOworICBpZiAoaV9zaGRycFswXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpX3NoZHJwKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIG1lbXNldCAoaV9zaGRycFswXSwgMCwgc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpOworCisgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSBpX3NoZHJwOworCisgIGlfc2hkcnBbdC0+c2hzdHJ0YWJfc2VjdGlvbl0gPSAmdC0+c2hzdHJ0YWJfaGRyOworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQorICAgIHsKKyAgICAgIGlfc2hkcnBbdC0+c3ltdGFiX3NlY3Rpb25dID0gJnQtPnN5bXRhYl9oZHI7CisgICAgICBpX3NoZHJwW3QtPnN0cnRhYl9zZWN0aW9uXSA9ICZ0LT5zdHJ0YWJfaGRyOworICAgICAgdC0+c3ltdGFiX2hkci5zaF9saW5rID0gdC0+c3RydGFiX3NlY3Rpb247CisgICAgfQorICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKmQgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpOworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICBpX3NoZHJwW2QtPnRoaXNfaWR4XSA9ICZkLT50aGlzX2hkcjsKKyAgICAgIGlmIChkLT5yZWxfaWR4ICE9IDApCisJaV9zaGRycFtkLT5yZWxfaWR4XSA9ICZkLT5yZWxfaGRyOworCisgICAgICAvKiBGaWxsIGluIHRoZSBzaF9saW5rIGFuZCBzaF9pbmZvIGZpZWxkcyB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCisKKyAgICAgIC8qIHNoX2xpbmsgb2YgYSByZWxvYyBzZWN0aW9uIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzeW1ib2wKKwkgdGFibGUuICBzaF9pbmZvIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzZWN0aW9uIHRvIHdoaWNoCisJIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgYXBwbHkuICAqLworICAgICAgaWYgKGQtPnJlbF9pZHggIT0gMCkKKwl7CisJICBkLT5yZWxfaGRyLnNoX2xpbmsgPSB0LT5zeW10YWJfc2VjdGlvbjsKKwkgIGQtPnJlbF9oZHIuc2hfaW5mbyA9IGQtPnRoaXNfaWR4OworCX0KKworICAgICAgc3dpdGNoIChkLT50aGlzX2hkci5zaF90eXBlKQorCXsKKwljYXNlIFNIVF9SRUw6CisJY2FzZSBTSFRfUkVMQToKKwkgIC8qIEEgcmVsb2Mgc2VjdGlvbiB3aGljaCB3ZSBhcmUgdHJlYXRpbmcgYXMgYSBub3JtYWwgQkZECisJICAgICBzZWN0aW9uLiAgc2hfbGluayBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc3ltYm9sCisJICAgICB0YWJsZS4gIHNoX2luZm8gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHNlY3Rpb24gdG8KKwkgICAgIHdoaWNoIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgYXBwbHkuICBXZSBhc3N1bWUgdGhhdCBhbgorCSAgICAgYWxsb2NhdGVkIHJlbG9jIHNlY3Rpb24gdXNlcyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCisJICAgICBGSVhNRTogSG93IGNhbiB3ZSBiZSBzdXJlPyAgKi8KKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKKwkgIGlmIChzICE9IE5VTEwpCisJICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7CisKKwkgIC8qIFdlIGxvb2sgdXAgdGhlIHNlY3Rpb24gdGhlIHJlbG9jcyBhcHBseSB0byBieSBuYW1lLiAgKi8KKwkgIG5hbWUgPSBzZWMtPm5hbWU7CisJICBpZiAoZC0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMKQorCSAgICBuYW1lICs9IDQ7CisJICBlbHNlCisJICAgIG5hbWUgKz0gNTsKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7CisJICBpZiAocyAhPSBOVUxMKQorCSAgICBkLT50aGlzX2hkci5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OworCSAgYnJlYWs7CisKKwljYXNlIFNIVF9TVFJUQUI6CisJICAvKiBXZSBhc3N1bWUgdGhhdCBhIHNlY3Rpb24gbmFtZWQgLnN0YWIqc3RyIGlzIGEgc3RhYnMKKwkgICAgIHN0cmluZyBzZWN0aW9uLiAgV2UgbG9vayBmb3IgYSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQorCSAgICAgYnV0IHdpdGhvdXQgdGhlIHRyYWlsaW5nIGBgc3RyJycsIGFuZCBzZXQgaXRzIHNoX2xpbmsKKwkgICAgIGZpZWxkIHRvIHBvaW50IHRvIHRoaXMgc2VjdGlvbi4gICovCisJICBpZiAoc3RybmNtcCAoc2VjLT5uYW1lLCAiLnN0YWIiLCBzaXplb2YgIi5zdGFiIiAtIDEpID09IDAKKwkgICAgICAmJiBzdHJjbXAgKHNlYy0+bmFtZSArIHN0cmxlbiAoc2VjLT5uYW1lKSAtIDMsICJzdHIiKSA9PSAwKQorCSAgICB7CisJICAgICAgc2l6ZV90IGxlbjsKKwkgICAgICBjaGFyICphbGM7CisKKwkgICAgICBsZW4gPSBzdHJsZW4gKHNlYy0+bmFtZSk7CisJICAgICAgYWxjID0gKGNoYXIgKikgYmZkX21hbGxvYyAobGVuIC0gMik7CisJICAgICAgaWYgKGFsYyA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgc3RybmNweSAoYWxjLCBzZWMtPm5hbWUsIGxlbiAtIDMpOworCSAgICAgIGFsY1tsZW4gLSAzXSA9ICdcMCc7CisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBhbGMpOworCSAgICAgIGZyZWUgKGFsYyk7CisJICAgICAgaWYgKHMgIT0gTlVMTCkKKwkJeworCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9saW5rID0gZC0+dGhpc19pZHg7CisKKwkJICAvKiBUaGlzIGlzIGEgLnN0YWIgc2VjdGlvbi4gICovCisJCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemUgPQorCQkgICAgNCArIDIgKiAoYmVkLT5zLT5hcmNoX3NpemUgLyA4KTsKKwkJfQorCSAgICB9CisJICBicmVhazsKKworCWNhc2UgU0hUX0RZTkFNSUM6CisJY2FzZSBTSFRfRFlOU1lNOgorCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgorCWNhc2UgU0hUX0dOVV92ZXJkZWY6CisJICAvKiBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBpbmRleCBvZiB0aGUgc3RyaW5nIHRhYmxlCisJICAgICB1c2VkIGZvciB0aGUgZHluYW1pYyBlbnRyaWVzLCBvciB0aGUgc3ltYm9sIHRhYmxlLCBvciB0aGUKKwkgICAgIHZlcnNpb24gc3RyaW5ncy4gICovCisJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3RyIik7CisJICBpZiAocyAhPSBOVUxMKQorCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OworCSAgYnJlYWs7CisKKwljYXNlIFNIVF9IQVNIOgorCWNhc2UgU0hUX0dOVV92ZXJzeW06CisJICAvKiBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGhlYWRlciBpbmRleCBvZiB0aGUgc3ltYm9sIHRhYmxlCisJICAgICB0aGlzIGhhc2ggdGFibGUgb3IgdmVyc2lvbiB0YWJsZSBpcyBmb3IuICAqLworCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOworCSAgaWYgKHMgIT0gTlVMTCkKKwkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE1hcCBzeW1ib2wgZnJvbSBpdCdzIGludGVybmFsIG51bWJlciB0byB0aGUgZXh0ZXJuYWwgbnVtYmVyLCBtb3ZpbmcKKyAgIGFsbCBsb2NhbCBzeW1ib2xzIHRvIGJlIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAgKi8KKworc3RhdGljIElOTElORSBpbnQKK3N5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICpzeW07Cit7CisgIC8qIElmIHRoZSBiYWNrZW5kIGhhcyBhIHNwZWNpYWwgbWFwcGluZywgdXNlIGl0LiAgKi8KKyAgaWYgKGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCkKKyAgICByZXR1cm4gKCgqZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKQorCSAgICAoYWJmZCwgc3ltKSk7CisKKyAgcmV0dXJuICgoc3ltLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKSAhPSAwCisJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKKwkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSk7Cit9CisKK3N0YXRpYyBib29sZWFuCitlbGZfbWFwX3N5bWJvbHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisgIGFzeW1ib2wgKipzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKKyAgYXN5bWJvbCAqKnNlY3Rfc3ltczsKKyAgaW50IG51bV9sb2NhbHMgPSAwOworICBpbnQgbnVtX2dsb2JhbHMgPSAwOworICBpbnQgbnVtX2xvY2FsczIgPSAwOworICBpbnQgbnVtX2dsb2JhbHMyID0gMDsKKyAgaW50IG1heF9pbmRleCA9IDA7CisgIGludCBudW1fc2VjdGlvbnMgPSAwOworICBpbnQgaWR4OworICBhc2VjdGlvbiAqYXNlY3Q7CisgIGFzeW1ib2wgKipuZXdfc3ltczsKKyAgYXN5bWJvbCAqc3ltOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAiZWxmX21hcF9zeW1ib2xzXG4iKTsKKyAgZmZsdXNoIChzdGRlcnIpOworI2VuZGlmCisKKyAgLyogQWRkIGEgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2ggQkZEIHNlY3Rpb24uICBGSVhNRTogSXMgdGhpcyByZWFsbHkKKyAgICAgbmVjZXNzYXJ5PyAgKi8KKyAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAobWF4X2luZGV4IDwgYXNlY3QtPmluZGV4KQorCW1heF9pbmRleCA9IGFzZWN0LT5pbmRleDsKKyAgICB9CisKKyAgbWF4X2luZGV4Kys7CisgIHNlY3Rfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBtYXhfaW5kZXggKiBzaXplb2YgKGFzeW1ib2wgKikpOworICBpZiAoc2VjdF9zeW1zID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBlbGZfc2VjdGlvbl9zeW1zIChhYmZkKSA9IHNlY3Rfc3ltczsKKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKKyAgICB7CisgICAgICBzeW0gPSBzeW1zW2lkeF07CisgICAgICAKKyAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAorCSAgJiYgc3ltLT52YWx1ZSA9PSAwKQorCXsKKwkgIGFzZWN0aW9uICpzZWM7CisKKwkgIHNlYyA9IHN5bS0+c2VjdGlvbjsKKworCSAgaWYgKHNlYy0+b3duZXIgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChzZWMtPm93bmVyICE9IGFiZmQpCisJCXsKKwkJICBpZiAoc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCisJCSAgICBjb250aW51ZTsKKwkJICAKKwkJICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOworCisJCSAgLyogRW1wdHkgc2VjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzIG1heSBoYXZlIGhhZCBhIHNlY3Rpb24KKwkJICAgICBzeW1ib2wgY3JlYXRlZCBmb3IgdGhlbS4gIChTZWUgdGhlIGNvbW1lbnQgbmVhciB0aGUgZW5kIG9mCisJCSAgICAgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgaW4gbGlua2VyLmMpLiAgSWYgdGhlIGxpbmtlcgorCQkgICAgIHNjcmlwdCBkaXNjYXJkcyBzdWNoIHNlY3Rpb25zIHRoZW4gd2Ugd2lsbCByZWFjaCB0aGlzIHBvaW50LgorCQkgICAgIFNpbmNlIHdlIGtub3cgdGhhdCB3ZSBjYW5ub3QgYXZvaWQgdGhpcyBjYXNlLCB3ZSBkZXRlY3QgaXQKKwkJICAgICBhbmQgc2tpcCB0aGUgYWJvcnQgYW5kIHRoZSBhc3NpZ25tZW50IHRvIHRoZSBzZWN0X3N5bXMgYXJyYXkuCisJCSAgICAgVG8gcmVwcm9kdWNlIHRoaXMgcGFydGljdWxhciBjYXNlIHRyeSBydW5uaW5nIHRoZSBsaW5rZXIKKwkJICAgICB0ZXN0c3VpdGUgdGVzdCBsZC1zY3JpcHRzL3dlYWsuZXhwIGZvciBhbiBFTEYgcG9ydCB0aGF0IHVzZXMKKwkJICAgICB0aGUgZ2VuZXJpYyBsaW5rZXIuICAqLworCQkgIGlmIChzZWMtPm93bmVyID09IE5VTEwpCisJCSAgICBjb250aW51ZTsKKworCQkgIEJGRF9BU1NFUlQgKHNlYy0+b3duZXIgPT0gYWJmZCk7CisJCX0KKwkgICAgICBzZWN0X3N5bXNbc2VjLT5pbmRleF0gPSBzeW1zW2lkeF07CisJICAgIH0KKwl9CisgICAgfQorCisgIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCisgICAgeworICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwpCisJY29udGludWU7CisKKyAgICAgIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7CisgICAgICBpZiAoc3ltID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgc3ltLT50aGVfYmZkID0gYWJmZDsKKyAgICAgIHN5bS0+bmFtZSA9IGFzZWN0LT5uYW1lOworICAgICAgc3ltLT52YWx1ZSA9IDA7CisgICAgICAvKiBTZXQgdGhlIGZsYWdzIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIG9uZSB3YXMgbmV3bHkgYWRkZWQuICAqLworICAgICAgc3ltLT5mbGFncyA9IDA7CisgICAgICBzeW0tPnNlY3Rpb24gPSBhc2VjdDsKKyAgICAgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdID0gc3ltOworICAgICAgbnVtX3NlY3Rpb25zKys7CisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKyBfKCJjcmVhdGluZyBzZWN0aW9uIHN5bWJvbCwgbmFtZSA9ICVzLCB2YWx1ZSA9IDB4JS44bHgsIGluZGV4ID0gJWQsIHNlY3Rpb24gPSAweCUuOGx4XG4iKSwKKwkgICAgICAgYXNlY3QtPm5hbWUsIChsb25nKSBhc2VjdC0+dm1hLCBhc2VjdC0+aW5kZXgsIChsb25nKSBhc2VjdCk7CisjZW5kaWYKKyAgICB9CisKKyAgLyogQ2xhc3NpZnkgYWxsIG9mIHRoZSBzeW1ib2xzLiAgKi8KKyAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCisgICAgeworICAgICAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW1zW2lkeF0pKQorCW51bV9sb2NhbHMrKzsKKyAgICAgIGVsc2UKKwludW1fZ2xvYmFscysrOworICAgIH0KKyAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTAorCSAgJiYgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID09IDApCisJeworCSAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOworCSAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSkpCisJICAgIG51bV9sb2NhbHMrKzsKKwkgIGVsc2UKKwkgICAgbnVtX2dsb2JhbHMrKzsKKwkgIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9IDA7CisJfQorICAgIH0KKworICAvKiBOb3cgc29ydCB0aGUgc3ltYm9scyBzbyB0aGUgbG9jYWwgc3ltYm9scyBhcmUgZmlyc3QuICAqLworICBuZXdfc3ltcyA9ICgoYXN5bWJvbCAqKikKKwkgICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkgKG51bV9sb2NhbHMgKyBudW1fZ2xvYmFscykgKiBzaXplb2YgKGFzeW1ib2wgKikpKTsKKyAgaWYgKG5ld19zeW1zID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnN5bSA9IHN5bXNbaWR4XTsKKyAgICAgIGludCBpOworCisgICAgICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkpCisJaSA9IG51bV9sb2NhbHMyKys7CisgICAgICBlbHNlCisJaSA9IG51bV9sb2NhbHMgKyBudW1fZ2xvYmFsczIrKzsKKyAgICAgIG5ld19zeW1zW2ldID0gc3ltOworICAgICAgc3ltLT51ZGF0YS5pID0gaSArIDE7CisgICAgfQorICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMCisJICAmJiBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPT0gMCkKKwl7CisJICBhc3ltYm9sICpzeW0gPSBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XTsKKwkgIGludCBpOworCisJICBzeW0tPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOworCSAgaWYgKCFzeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pKQorCSAgICBpID0gbnVtX2xvY2FsczIrKzsKKwkgIGVsc2UKKwkgICAgaSA9IG51bV9sb2NhbHMgKyBudW1fZ2xvYmFsczIrKzsKKwkgIG5ld19zeW1zW2ldID0gc3ltOworCSAgc3ltLT51ZGF0YS5pID0gaSArIDE7CisJfQorICAgIH0KKworICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgbmV3X3N5bXMsIG51bV9sb2NhbHMgKyBudW1fZ2xvYmFscyk7CisKKyAgZWxmX251bV9sb2NhbHMgKGFiZmQpID0gbnVtX2xvY2FsczsKKyAgZWxmX251bV9nbG9iYWxzIChhYmZkKSA9IG51bV9nbG9iYWxzOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWxpZ24gdG8gdGhlIG1heGltdW0gZmlsZSBhbGlnbm1lbnQgdGhhdCBjb3VsZCBiZSByZXF1aXJlZCBmb3IgYW55CisgICBFTEYgZGF0YSBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgSU5MSU5FIGZpbGVfcHRyIGFsaWduX2ZpbGVfcG9zaXRpb24gUEFSQU1TICgoZmlsZV9wdHIsIGludCkpOworc3RhdGljIElOTElORSBmaWxlX3B0cgorYWxpZ25fZmlsZV9wb3NpdGlvbiAob2ZmLCBhbGlnbikKKyAgICAgZmlsZV9wdHIgb2ZmOworICAgICBpbnQgYWxpZ247Cit7CisgIHJldHVybiAob2ZmICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKK30KKworLyogQXNzaWduIGEgZmlsZSBwb3NpdGlvbiB0byBhIHNlY3Rpb24sIG9wdGlvbmFsbHkgYWxpZ25pbmcgdG8gdGhlCisgICByZXF1aXJlZCBzZWN0aW9uIGFsaWdubWVudC4gICovCisKK0lOTElORSBmaWxlX3B0cgorX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGlfc2hkcnAsIG9mZnNldCwgYWxpZ24pCisgICAgIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJvb2xlYW4gYWxpZ247Cit7CisgIGlmIChhbGlnbikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgYWw7CisKKyAgICAgIGFsID0gaV9zaGRycC0+c2hfYWRkcmFsaWduOworICAgICAgaWYgKGFsID4gMSkKKwlvZmZzZXQgPSBCRkRfQUxJR04gKG9mZnNldCwgYWwpOworICAgIH0KKyAgaV9zaGRycC0+c2hfb2Zmc2V0ID0gb2Zmc2V0OworICBpZiAoaV9zaGRycC0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKKyAgICBpX3NoZHJwLT5iZmRfc2VjdGlvbi0+ZmlsZXBvcyA9IG9mZnNldDsKKyAgaWYgKGlfc2hkcnAtPnNoX3R5cGUgIT0gU0hUX05PQklUUykKKyAgICBvZmZzZXQgKz0gaV9zaGRycC0+c2hfc2l6ZTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgd2UgYXJlIGdvaW5nIHRvIHB1dCB0aGUgc2VjdGlvbnMgYXQsIGFuZAorICAgb3RoZXJ3aXNlIHByZXBhcmUgdG8gYmVnaW4gd3JpdGluZyBvdXQgdGhlIEVMRiBmaWxlLiAgSWYgTElOS19JTkZPCisgICBpcyBub3QgTlVMTCwgdGhpcyBpcyBiZWluZyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlci4gICovCisKK2Jvb2xlYW4KK19iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCwgbGlua19pbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Cit7CisgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisgIGJvb2xlYW4gZmFpbGVkOworICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWI7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzaHN0cnRhYl9oZHI7CisKKyAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogRG8gYW55IGVsZiBiYWNrZW5kIHNwZWNpZmljIHByb2Nlc3NpbmcgZmlyc3QuICAqLworICBpZiAoYmVkLT5lbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKQorICAgICgqYmVkLT5lbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKSAoYWJmZCwgbGlua19pbmZvKTsKKworICBpZiAoISBwcmVwX2hlYWRlcnMgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmYWlsZWQgPSBmYWxzZTsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBlbGZfZmFrZV9zZWN0aW9ucywgJmZhaWxlZCk7CisgIGlmIChmYWlsZWQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghYXNzaWduX3NlY3Rpb25fbnVtYmVycyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFRoZSBiYWNrZW5kIGxpbmtlciBidWlsZHMgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGl0c2VsZi4gICovCisgIGlmIChsaW5rX2luZm8gPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCisgICAgeworICAgICAgLyogTm9uLXplcm8gaWYgZG9pbmcgYSByZWxvY2F0YWJsZSBsaW5rLiAgKi8KKyAgICAgIGludCByZWxvY2F0YWJsZV9wID0gISAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpOworCisgICAgICBpZiAoISBzd2FwX291dF9zeW1zIChhYmZkLCAmc3RydGFiLCByZWxvY2F0YWJsZV9wKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHNoc3RydGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7CisgIC8qIHNoX25hbWUgd2FzIHNldCBpbiBwcmVwX2hlYWRlcnMuICAqLworICBzaHN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOworICBzaHN0cnRhYl9oZHItPnNoX2ZsYWdzID0gMDsKKyAgc2hzdHJ0YWJfaGRyLT5zaF9hZGRyID0gMDsKKyAgc2hzdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7CisgIHNoc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7CisgIHNoc3RydGFiX2hkci0+c2hfbGluayA9IDA7CisgIHNoc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7CisgIC8qIHNoX29mZnNldCBpcyBzZXQgaW4gYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MuICAqLworICBzaHN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7CisKKyAgaWYgKCFhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChsaW5rX2luZm8gPT0gTlVMTCAmJiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCisgICAgeworICAgICAgZmlsZV9wdHIgb2ZmOworICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKworICAgICAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKKworICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgICAgICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaGRyLCBvZmYsIHRydWUpOworCisgICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKKyAgICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7CisKKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7CisKKyAgICAgIC8qIE5vdyB0aGF0IHdlIGtub3cgd2hlcmUgdGhlIC5zdHJ0YWIgc2VjdGlvbiBnb2VzLCB3cml0ZSBpdAorICAgICAgICAgb3V0LiAgKi8KKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJICB8fCAhIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIHN0cnRhYikpCisJcmV0dXJuIGZhbHNlOworICAgICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc3RydGFiKTsKKyAgICB9CisKKyAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBhIHNldCBvZiBzZWN0aW9ucyB0byBhIHByb2dyYW0gc2VnbWVudC4gICovCisKK3N0YXRpYyBJTkxJTkUgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqCittYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBmcm9tLCB0bywgcGhkcikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOworICAgICB1bnNpZ25lZCBpbnQgZnJvbTsKKyAgICAgdW5zaWduZWQgaW50IHRvOworICAgICBib29sZWFuIHBoZHI7Cit7CisgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07CisgIHVuc2lnbmVkIGludCBpOworICBhc2VjdGlvbiAqKmhkcnBwOworCisgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKKyAgICAgICBiZmRfemFsbG9jIChhYmZkLAorCQkgICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQorCQkgICAgKyAodG8gLSBmcm9tIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOworICBpZiAobSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBtLT5uZXh0ID0gTlVMTDsKKyAgbS0+cF90eXBlID0gUFRfTE9BRDsKKyAgZm9yIChpID0gZnJvbSwgaGRycHAgPSBzZWN0aW9ucyArIGZyb207IGkgPCB0bzsgaSsrLCBoZHJwcCsrKQorICAgIG0tPnNlY3Rpb25zW2kgLSBmcm9tXSA9ICpoZHJwcDsKKyAgbS0+Y291bnQgPSB0byAtIGZyb207CisKKyAgaWYgKGZyb20gPT0gMCAmJiBwaGRyKQorICAgIHsKKyAgICAgIC8qIEluY2x1ZGUgdGhlIGhlYWRlcnMgaW4gdGhlIGZpcnN0IFBUX0xPQUQgc2VnbWVudC4gICovCisgICAgICBtLT5pbmNsdWRlc19maWxlaGRyID0gMTsKKyAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKKyAgICB9CisKKyAgcmV0dXJuIG07Cit9CisKKy8qIFNldCB1cCBhIG1hcHBpbmcgZnJvbSBCRkQgc2VjdGlvbnMgdG8gcHJvZ3JhbSBzZWdtZW50cy4gICovCisKK3N0YXRpYyBib29sZWFuCittYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7CisgIGFzZWN0aW9uICpzOworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGNvdW50OworICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptZmlyc3Q7CisgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKipwbTsKKyAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKKyAgYXNlY3Rpb24gKmxhc3RfaGRyOworICB1bnNpZ25lZCBpbnQgcGhkcl9pbmRleDsKKyAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKKyAgYXNlY3Rpb24gKipoZHJwcDsKKyAgYm9vbGVhbiBwaGRyX2luX3NlZ21lbnQgPSB0cnVlOworICBib29sZWFuIHdyaXRhYmxlOworICBhc2VjdGlvbiAqZHluc2VjOworCisgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCAhPSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogU2VsZWN0IHRoZSBhbGxvY2F0ZWQgc2VjdGlvbnMsIGFuZCBzb3J0IHRoZW0uICAqLworCisgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpCisJCQkJICAgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGkgPSAwOworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCXsKKwkgIHNlY3Rpb25zW2ldID0gczsKKwkgICsraTsKKwl9CisgICAgfQorICBCRkRfQVNTRVJUIChpIDw9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkpOworICBjb3VudCA9IGk7CisKKyAgcXNvcnQgKHNlY3Rpb25zLCAoc2l6ZV90KSBjb3VudCwgc2l6ZW9mIChhc2VjdGlvbiAqKSwgZWxmX3NvcnRfc2VjdGlvbnMpOworCisgIC8qIEJ1aWxkIHRoZSBtYXBwaW5nLiAgKi8KKworICBtZmlyc3QgPSBOVUxMOworICBwbSA9ICZtZmlyc3Q7CisKKyAgLyogSWYgd2UgaGF2ZSBhIC5pbnRlcnAgc2VjdGlvbiwgdGhlbiBjcmVhdGUgYSBQVF9QSERSIHNlZ21lbnQgZm9yCisgICAgIHRoZSBwcm9ncmFtIGhlYWRlcnMgYW5kIGEgUFRfSU5URVJQIHNlZ21lbnQgZm9yIHRoZSAuaW50ZXJwCisgICAgIHNlY3Rpb24uICAqLworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7CisgIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCisgICAgeworICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQorCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKKyAgICAgIGlmIChtID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBtLT5uZXh0ID0gTlVMTDsKKyAgICAgIG0tPnBfdHlwZSA9IFBUX1BIRFI7CisgICAgICAvKiBGSVhNRTogVW5peFdhcmUgYW5kIFNvbGFyaXMgc2V0IFBGX1gsIElyaXggNSBkb2VzIG5vdC4gICovCisgICAgICBtLT5wX2ZsYWdzID0gUEZfUiB8IFBGX1g7CisgICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKKyAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMTsKKworICAgICAgKnBtID0gbTsKKyAgICAgIHBtID0gJm0tPm5leHQ7CisKKyAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKKwkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7CisgICAgICBpZiAobSA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgbS0+bmV4dCA9IE5VTEw7CisgICAgICBtLT5wX3R5cGUgPSBQVF9JTlRFUlA7CisgICAgICBtLT5jb3VudCA9IDE7CisgICAgICBtLT5zZWN0aW9uc1swXSA9IHM7CisKKyAgICAgICpwbSA9IG07CisgICAgICBwbSA9ICZtLT5uZXh0OworICAgIH0KKworICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb25zLiAgV2UgcHV0IHNlY3Rpb25zIGluIHRoZSBzYW1lIHByb2dyYW0KKyAgICAgc2VnbWVudCB3aGVuIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHNlY3Rpb24gY2FuIGJlIHBsYWNlZCB3aXRoaW4KKyAgICAgYSBmZXcgYnl0ZXMgb2YgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4gICovCisgIGxhc3RfaGRyID0gTlVMTDsKKyAgcGhkcl9pbmRleCA9IDA7CisgIG1heHBhZ2VzaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXhwYWdlc2l6ZTsKKyAgd3JpdGFibGUgPSBmYWxzZTsKKyAgZHluc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOworICBpZiAoZHluc2VjICE9IE5VTEwKKyAgICAgICYmIChkeW5zZWMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCisgICAgZHluc2VjID0gTlVMTDsKKworICAvKiBEZWFsIHdpdGggLVR0ZXh0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHN1Y2ggdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbgorICAgICBpcyBub3QgYWRqYWNlbnQgdG8gdGhlIHByb2dyYW0gaGVhZGVycy4gIFRoaXMgaXMgYW4KKyAgICAgYXBwcm94aW1hdGlvbiwgc2luY2UgYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IGV4YWN0bHkgaG93IG1hbnkKKyAgICAgcHJvZ3JhbSBoZWFkZXJzIHdlIHdpbGwgbmVlZC4gICovCisgIGlmIChjb3VudCA+IDApCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBwaGRyX3NpemU7CisKKyAgICAgIHBoZHJfc2l6ZSA9IGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7CisgICAgICBpZiAocGhkcl9zaXplID09IDApCisJcGhkcl9zaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfcGhkcjsKKyAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwCisJICB8fCBzZWN0aW9uc1swXS0+bG1hIDwgcGhkcl9zaXplCisJICB8fCBzZWN0aW9uc1swXS0+bG1hICUgbWF4cGFnZXNpemUgPCBwaGRyX3NpemUgJSBtYXhwYWdlc2l6ZSkKKwlwaGRyX2luX3NlZ21lbnQgPSBmYWxzZTsKKyAgICB9CisKKyAgZm9yIChpID0gMCwgaGRycHAgPSBzZWN0aW9uczsgaSA8IGNvdW50OyBpKyssIGhkcnBwKyspCisgICAgeworICAgICAgYXNlY3Rpb24gKmhkcjsKKyAgICAgIGJvb2xlYW4gbmV3X3NlZ21lbnQ7CisKKyAgICAgIGhkciA9ICpoZHJwcDsKKworICAgICAgLyogU2VlIGlmIHRoaXMgc2VjdGlvbiBhbmQgdGhlIGxhc3Qgb25lIHdpbGwgZml0IGluIHRoZSBzYW1lCisgICAgICAgICBzZWdtZW50LiAgKi8KKworICAgICAgaWYgKGxhc3RfaGRyID09IE5VTEwpCisJeworCSAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHNlZ21lbnQgeWV0LCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcKKwkgICAgIG9uZSAod2UgYnVpbGQgdGhlIGxhc3Qgb25lIGFmdGVyIHRoaXMgbG9vcCkuICAqLworCSAgbmV3X3NlZ21lbnQgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlIGlmIChsYXN0X2hkci0+bG1hIC0gbGFzdF9oZHItPnZtYSAhPSBoZHItPmxtYSAtIGhkci0+dm1hKQorCXsKKwkgIC8qIElmIHRoaXMgc2VjdGlvbiBoYXMgYSBkaWZmZXJlbnQgcmVsYXRpb24gYmV0d2VlbiB0aGUKKyAgICAgICAgICAgICB2aXJ0dWFsIGFkZHJlc3MgYW5kIHRoZSBsb2FkIGFkZHJlc3MsIHRoZW4gd2UgbmVlZCBhIG5ldworICAgICAgICAgICAgIHNlZ21lbnQuICAqLworCSAgbmV3X3NlZ21lbnQgPSB0cnVlOworCX0KKyAgICAgIGVsc2UgaWYgKEJGRF9BTElHTiAobGFzdF9oZHItPmxtYSArIGxhc3RfaGRyLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQorCSAgICAgICA8IEJGRF9BTElHTiAoaGRyLT5sbWEsIG1heHBhZ2VzaXplKSkKKwl7CisJICAvKiBJZiBwdXR0aW5nIHRoaXMgc2VjdGlvbiBpbiB0aGlzIHNlZ21lbnQgd291bGQgZm9yY2UgdXMgdG8KKyAgICAgICAgICAgICBza2lwIGEgcGFnZSBpbiB0aGUgc2VnbWVudCwgdGhlbiB3ZSBuZWVkIGEgbmV3IHNlZ21lbnQuICAqLworCSAgbmV3X3NlZ21lbnQgPSB0cnVlOworCX0KKyAgICAgIGVsc2UgaWYgKChsYXN0X2hkci0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAorCSAgICAgICAmJiAoaGRyLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQorCXsKKwkgIC8qIFdlIGRvbid0IHdhbnQgdG8gcHV0IGEgbG9hZGFibGUgc2VjdGlvbiBhZnRlciBhCisgICAgICAgICAgICAgbm9ubG9hZGFibGUgc2VjdGlvbiBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KKwkgIG5ld19zZWdtZW50ID0gdHJ1ZTsKKwl9CisgICAgICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwKQorCXsKKwkgIC8qIElmIHRoZSBmaWxlIGlzIG5vdCBkZW1hbmQgcGFnZWQsIHdoaWNoIG1lYW5zIHRoYXQgd2UKKyAgICAgICAgICAgICBkb24ndCByZXF1aXJlIHRoZSBzZWN0aW9ucyB0byBiZSBjb3JyZWN0bHkgYWxpZ25lZCBpbiB0aGUKKyAgICAgICAgICAgICBmaWxlLCB0aGVuIHRoZXJlIGlzIG5vIG90aGVyIHJlYXNvbiBmb3IgYSBuZXcgc2VnbWVudC4gICovCisJICBuZXdfc2VnbWVudCA9IGZhbHNlOworCX0KKyAgICAgIGVsc2UgaWYgKCEgd3JpdGFibGUKKwkgICAgICAgJiYgKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKKwkgICAgICAgJiYgKEJGRF9BTElHTiAobGFzdF9oZHItPmxtYSArIGxhc3RfaGRyLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQorCQkgICA9PSBoZHItPmxtYSkpCisJeworCSAgLyogV2UgZG9uJ3Qgd2FudCB0byBwdXQgYSB3cml0YWJsZSBzZWN0aW9uIGluIGEgcmVhZCBvbmx5CisgICAgICAgICAgICAgc2VnbWVudCwgdW5sZXNzIHRoZXkgYXJlIG9uIHRoZSBzYW1lIHBhZ2UgaW4gbWVtb3J5CisgICAgICAgICAgICAgYW55aG93LiAgV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGxhc3Qgc2VjdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgIGJyaW5nIHVzIHBhc3QgdGhlIGN1cnJlbnQgc2VjdGlvbiBvbiB0aGUgcGFnZSwgc28gdGhlCisgICAgICAgICAgICAgb25seSBjYXNlIGluIHdoaWNoIHRoZSBuZXcgc2VjdGlvbiBpcyBub3Qgb24gdGhlIHNhbWUKKyAgICAgICAgICAgICBwYWdlIGFzIHRoZSBwcmV2aW91cyBzZWN0aW9uIGlzIHdoZW4gdGhlIHByZXZpb3VzIHNlY3Rpb24KKyAgICAgICAgICAgICBlbmRzIHByZWNpc2VseSBvbiBhIHBhZ2UgYm91bmRhcnkuICAqLworCSAgbmV3X3NlZ21lbnQgPSB0cnVlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBPdGhlcndpc2UsIHdlIGNhbiB1c2UgdGhlIHNhbWUgc2VnbWVudC4gICovCisJICBuZXdfc2VnbWVudCA9IGZhbHNlOworCX0KKworICAgICAgaWYgKCEgbmV3X3NlZ21lbnQpCisJeworCSAgaWYgKChoZHItPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQorCSAgICB3cml0YWJsZSA9IHRydWU7CisJICBsYXN0X2hkciA9IGhkcjsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogV2UgbmVlZCBhIG5ldyBwcm9ncmFtIHNlZ21lbnQuICBXZSBtdXN0IGNyZWF0ZSBhIG5ldyBwcm9ncmFtCisgICAgICAgICBoZWFkZXIgaG9sZGluZyBhbGwgdGhlIHNlY3Rpb25zIGZyb20gcGhkcl9pbmRleCB1bnRpbCBoZHIuICAqLworCisgICAgICBtID0gbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgcGhkcl9pbmRleCwgaSwgcGhkcl9pbl9zZWdtZW50KTsKKyAgICAgIGlmIChtID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgICpwbSA9IG07CisgICAgICBwbSA9ICZtLT5uZXh0OworCisgICAgICBpZiAoKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCisJd3JpdGFibGUgPSB0cnVlOworICAgICAgZWxzZQorCXdyaXRhYmxlID0gZmFsc2U7CisKKyAgICAgIGxhc3RfaGRyID0gaGRyOworICAgICAgcGhkcl9pbmRleCA9IGk7CisgICAgICBwaGRyX2luX3NlZ21lbnQgPSBmYWxzZTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGEgZmluYWwgUFRfTE9BRCBwcm9ncmFtIHNlZ21lbnQuICAqLworICBpZiAobGFzdF9oZHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBtID0gbWFrZV9tYXBwaW5nIChhYmZkLCBzZWN0aW9ucywgcGhkcl9pbmRleCwgaSwgcGhkcl9pbl9zZWdtZW50KTsKKyAgICAgIGlmIChtID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgICpwbSA9IG07CisgICAgICBwbSA9ICZtLT5uZXh0OworICAgIH0KKworICAvKiBJZiB0aGVyZSBpcyBhIC5keW5hbWljIHNlY3Rpb24sIHRocm93IGluIGEgUFRfRFlOQU1JQyBzZWdtZW50LiAgKi8KKyAgaWYgKGR5bnNlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKKwkgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7CisgICAgICBpZiAobSA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgbS0+bmV4dCA9IE5VTEw7CisgICAgICBtLT5wX3R5cGUgPSBQVF9EWU5BTUlDOworICAgICAgbS0+Y291bnQgPSAxOworICAgICAgbS0+c2VjdGlvbnNbMF0gPSBkeW5zZWM7CisKKyAgICAgICpwbSA9IG07CisgICAgICBwbSA9ICZtLT5uZXh0OworICAgIH0KKworICAvKiBGb3IgZWFjaCBsb2FkYWJsZSAubm90ZSBzZWN0aW9uLCBhZGQgYSBQVF9OT1RFIHNlZ21lbnQuICBXZSBkb24ndAorICAgICB1c2UgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUsIGJlY2F1c2UgaWYgd2UgbGluayB0b2dldGhlcgorICAgICBub25sb2FkYWJsZSAubm90ZSBzZWN0aW9ucyBhbmQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMsIHdlIHdpbGwKKyAgICAgZ2VuZXJhdGUgdHdvIC5ub3RlIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZJWE1FOiBVc2luZworICAgICBuYW1lcyBmb3Igc2VjdGlvbiB0eXBlcyBpcyBib2d1cyBhbnlob3cuICAqLworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKKwkgICYmIHN0cm5jbXAgKHMtPm5hbWUsICIubm90ZSIsIDUpID09IDApCisJeworCSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQorCSAgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApKSk7CisJICBpZiAobSA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIG0tPm5leHQgPSBOVUxMOworCSAgbS0+cF90eXBlID0gUFRfTk9URTsKKwkgIG0tPmNvdW50ID0gMTsKKwkgIG0tPnNlY3Rpb25zWzBdID0gczsKKworCSAgKnBtID0gbTsKKwkgIHBtID0gJm0tPm5leHQ7CisJfQorICAgIH0KKworICBmcmVlIChzZWN0aW9ucyk7CisgIHNlY3Rpb25zID0gTlVMTDsKKworICBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCA9IG1maXJzdDsKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQorICAgIGZyZWUgKHNlY3Rpb25zKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBTb3J0IHNlY3Rpb25zIGJ5IGFkZHJlc3MuICAqLworCitzdGF0aWMgaW50CitlbGZfc29ydF9zZWN0aW9ucyAoYXJnMSwgYXJnMikKKyAgICAgY29uc3QgUFRSIGFyZzE7CisgICAgIGNvbnN0IFBUUiBhcmcyOworeworICBjb25zdCBhc2VjdGlvbiAqc2VjMSA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7CisgIGNvbnN0IGFzZWN0aW9uICpzZWMyID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKKworICAvKiBTb3J0IGJ5IExNQSBmaXJzdCwgc2luY2UgdGhpcyBpcyB0aGUgYWRkcmVzcyB1c2VkIHRvCisgICAgIHBsYWNlIHRoZSBzZWN0aW9uIGludG8gYSBzZWdtZW50LiAgKi8KKyAgaWYgKHNlYzEtPmxtYSA8IHNlYzItPmxtYSkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKHNlYzEtPmxtYSA+IHNlYzItPmxtYSkKKyAgICByZXR1cm4gMTsKKworICAvKiBUaGVuIHNvcnQgYnkgVk1BLiAgTm9ybWFsbHkgdGhlIExNQSBhbmQgdGhlIFZNQSB3aWxsIGJlCisgICAgIHRoZSBzYW1lLCBhbmQgdGhpcyB3aWxsIGRvIG5vdGhpbmcuICAqLworICBpZiAoc2VjMS0+dm1hIDwgc2VjMi0+dm1hKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoc2VjMS0+dm1hID4gc2VjMi0+dm1hKQorICAgIHJldHVybiAxOworCisgIC8qIFB1dCAhU0VDX0xPQUQgc2VjdGlvbnMgYWZ0ZXIgU0VDX0xPQUQgb25lcy4gICovCisKKyNkZWZpbmUgVE9FTkQoeCkgKCgoeCktPmZsYWdzICYgU0VDX0xPQUQpID09IDApCisKKyAgaWYgKFRPRU5EIChzZWMxKSkKKyAgICB7CisgICAgICBpZiAoVE9FTkQgKHNlYzIpKQorCXJldHVybiBzZWMxLT50YXJnZXRfaW5kZXggLSBzZWMyLT50YXJnZXRfaW5kZXg7CisgICAgICBlbHNlCisJcmV0dXJuIDE7CisgICAgfQorCisgIGlmIChUT0VORCAoc2VjMikpCisgICAgcmV0dXJuIC0xOworCisjdW5kZWYgVE9FTkQKKworICAvKiBTb3J0IGJ5IHNpemUsIHRvIHB1dCB6ZXJvIHNpemVkIHNlY3Rpb25zIGJlZm9yZSBvdGhlcnMgYXQgdGhlCisgICAgIHNhbWUgYWRkcmVzcy4gICovCisKKyAgaWYgKHNlYzEtPl9yYXdfc2l6ZSA8IHNlYzItPl9yYXdfc2l6ZSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChzZWMxLT5fcmF3X3NpemUgPiBzZWMyLT5fcmF3X3NpemUpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIHNlYzEtPnRhcmdldF9pbmRleCAtIHNlYzItPnRhcmdldF9pbmRleDsKK30KKworLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIHRvIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbWFwcGluZyBmcm9tCisgICBzZWN0aW9ucyB0byBzZWdtZW50cy4gIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzIHVwIHNvbWUgZmllbGRzIGluCisgICB0aGUgZmlsZSBoZWFkZXIsIGFuZCB3cml0ZXMgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjb25zdCBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07CisgIHVuc2lnbmVkIGludCBhbGxvYzsKKyAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHJzOworICBmaWxlX3B0ciBvZmYsIHZvZmY7CisgIGJmZF92bWEgZmlsZWhkcl92YWRkciwgZmlsZWhkcl9wYWRkcjsKKyAgYmZkX3ZtYSBwaGRyc192YWRkciwgcGhkcnNfcGFkZHI7CisgIEVsZl9JbnRlcm5hbF9QaGRyICpwOworCisgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIG1hcF9zZWN0aW9uc190b19zZWdtZW50cyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoYmVkLT5lbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApCisgICAgeworICAgICAgaWYgKCEgKCpiZWQtPmVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCkgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgY291bnQgPSAwOworICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKKyAgICArK2NvdW50OworCisgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Bob2ZmID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhlbnRzaXplID0gYmVkLT5zLT5zaXplb2ZfcGhkcjsKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0gPSBjb3VudDsKKworICBpZiAoY291bnQgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBJZiB3ZSBhbHJlYWR5IGNvdW50ZWQgdGhlIG51bWJlciBvZiBwcm9ncmFtIHNlZ21lbnRzLCBtYWtlIHN1cmUKKyAgICAgdGhhdCB3ZSBhbGxvY2F0ZWQgZW5vdWdoIHNwYWNlLiAgVGhpcyBoYXBwZW5zIHdoZW4gU0laRU9GX0hFQURFUlMKKyAgICAgaXMgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLworICBhbGxvYyA9IGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgLyBiZWQtPnMtPnNpemVvZl9waGRyOworICBpZiAoYWxsb2MgIT0gMCAmJiBjb3VudCA+IGFsbG9jKQorICAgIHsKKyAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKKyAgICAgICAoXygiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzIChhbGxvY2F0ZWQgJXUsIG5lZWQgJXUpIiksCisJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGFsbG9jLCBjb3VudCkpOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChhbGxvYyA9PSAwKQorICAgIGFsbG9jID0gY291bnQ7CisKKyAgcGhkcnMgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCisJICAgYmZkX2FsbG9jIChhYmZkLCBhbGxvYyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1BoZHIpKSk7CisgIGlmIChwaGRycyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBvZmYgPSBiZWQtPnMtPnNpemVvZl9laGRyOworICBvZmYgKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOworCisgIGZpbGVoZHJfdmFkZHIgPSAwOworICBmaWxlaGRyX3BhZGRyID0gMDsKKyAgcGhkcnNfdmFkZHIgPSAwOworICBwaGRyc19wYWRkciA9IDA7CisKKyAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAsIHAgPSBwaGRyczsKKyAgICAgICBtICE9IE5VTEw7CisgICAgICAgbSA9IG0tPm5leHQsIHArKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgIGFzZWN0aW9uICoqc2VjcHA7CisKKyAgICAgIC8qIElmIGVsZl9zZWdtZW50X21hcCBpcyBub3QgZnJvbSBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMsIHRoZQorICAgICAgICAgc2VjdGlvbnMgbWF5IG5vdCBiZSBjb3JyZWN0bHkgb3JkZXJlZC4gICovCisgICAgICBpZiAobS0+Y291bnQgPiAwKQorCXFzb3J0IChtLT5zZWN0aW9ucywgKHNpemVfdCkgbS0+Y291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCisJICAgICAgIGVsZl9zb3J0X3NlY3Rpb25zKTsKKworICAgICAgcC0+cF90eXBlID0gbS0+cF90eXBlOworCisgICAgICBpZiAobS0+cF9mbGFnc192YWxpZCkKKwlwLT5wX2ZsYWdzID0gbS0+cF9mbGFnczsKKyAgICAgIGVsc2UKKwlwLT5wX2ZsYWdzID0gMDsKKworICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FECisJICAmJiBtLT5jb3VudCA+IDAKKwkgICYmIChtLT5zZWN0aW9uc1swXS0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJeworCSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCisJICAgIG9mZiArPSAobS0+c2VjdGlvbnNbMF0tPnZtYSAtIG9mZikgJSBiZWQtPm1heHBhZ2VzaXplOworCSAgZWxzZQorCSAgICB7CisJICAgICAgYmZkX3NpemVfdHlwZSBhbGlnbjsKKworCSAgICAgIGFsaWduID0gMDsKKwkgICAgICBmb3IgKGkgPSAwLCBzZWNwcCA9IG0tPnNlY3Rpb25zOyBpIDwgbS0+Y291bnQ7IGkrKywgc2VjcHArKykKKwkJeworCQkgIGJmZF9zaXplX3R5cGUgc2VjYWxpZ247CisKKwkJICBzZWNhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsICpzZWNwcCk7CisJCSAgaWYgKHNlY2FsaWduID4gYWxpZ24pCisJCSAgICBhbGlnbiA9IHNlY2FsaWduOworCQl9CisKKwkgICAgICBvZmYgKz0gKG0tPnNlY3Rpb25zWzBdLT52bWEgLSBvZmYpICUgKDEgPDwgYWxpZ24pOworCSAgICB9CisJfQorCisgICAgICBpZiAobS0+Y291bnQgPT0gMCkKKwlwLT5wX3ZhZGRyID0gMDsKKyAgICAgIGVsc2UKKwlwLT5wX3ZhZGRyID0gbS0+c2VjdGlvbnNbMF0tPnZtYTsKKworICAgICAgaWYgKG0tPnBfcGFkZHJfdmFsaWQpCisJcC0+cF9wYWRkciA9IG0tPnBfcGFkZHI7CisgICAgICBlbHNlIGlmIChtLT5jb3VudCA9PSAwKQorCXAtPnBfcGFkZHIgPSAwOworICAgICAgZWxzZQorCXAtPnBfcGFkZHIgPSBtLT5zZWN0aW9uc1swXS0+bG1hOworCisgICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKKwkgICYmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCisJcC0+cF9hbGlnbiA9IGJlZC0+bWF4cGFnZXNpemU7CisgICAgICBlbHNlIGlmIChtLT5jb3VudCA9PSAwKQorCXAtPnBfYWxpZ24gPSBiZWQtPnMtPmZpbGVfYWxpZ247CisgICAgICBlbHNlCisJcC0+cF9hbGlnbiA9IDA7CisKKyAgICAgIHAtPnBfb2Zmc2V0ID0gMDsKKyAgICAgIHAtPnBfZmlsZXN6ID0gMDsKKyAgICAgIHAtPnBfbWVtc3ogPSAwOworCisgICAgICBpZiAobS0+aW5jbHVkZXNfZmlsZWhkcikKKwl7CisJICBpZiAoISBtLT5wX2ZsYWdzX3ZhbGlkKQorCSAgICBwLT5wX2ZsYWdzIHw9IFBGX1I7CisJICBwLT5wX29mZnNldCA9IDA7CisJICBwLT5wX2ZpbGVzeiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7CisJICBwLT5wX21lbXN6ID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKKwkgIGlmIChtLT5jb3VudCA+IDApCisJICAgIHsKKwkgICAgICBCRkRfQVNTRVJUIChwLT5wX3R5cGUgPT0gUFRfTE9BRCk7CisKKwkgICAgICBpZiAocC0+cF92YWRkciA8IChiZmRfdm1hKSBvZmYpCisJCXsKKwkJICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBOb3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycywgdHJ5IGxpbmtpbmcgd2l0aCAtTiIpLAorCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKwkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKworCSAgICAgIHAtPnBfdmFkZHIgLT0gb2ZmOworCSAgICAgIGlmICghIG0tPnBfcGFkZHJfdmFsaWQpCisJCXAtPnBfcGFkZHIgLT0gb2ZmOworCSAgICB9CisJICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQpCisJICAgIHsKKwkgICAgICBmaWxlaGRyX3ZhZGRyID0gcC0+cF92YWRkcjsKKwkgICAgICBmaWxlaGRyX3BhZGRyID0gcC0+cF9wYWRkcjsKKwkgICAgfQorCX0KKworICAgICAgaWYgKG0tPmluY2x1ZGVzX3BoZHJzKQorCXsKKwkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCisJICAgIHAtPnBfZmxhZ3MgfD0gUEZfUjsKKworCSAgaWYgKG0tPmluY2x1ZGVzX2ZpbGVoZHIpCisJICAgIHsKKwkgICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQpCisJCXsKKwkJICBwaGRyc192YWRkciA9IHAtPnBfdmFkZHIgKyBiZWQtPnMtPnNpemVvZl9laGRyOworCQkgIHBoZHJzX3BhZGRyID0gcC0+cF9wYWRkciArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcC0+cF9vZmZzZXQgPSBiZWQtPnMtPnNpemVvZl9laGRyOworCisJICAgICAgaWYgKG0tPmNvdW50ID4gMCkKKwkJeworCQkgIEJGRF9BU1NFUlQgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKTsKKwkJICBwLT5wX3ZhZGRyIC09IG9mZiAtIHAtPnBfb2Zmc2V0OworCQkgIGlmICghIG0tPnBfcGFkZHJfdmFsaWQpCisJCSAgICBwLT5wX3BhZGRyIC09IG9mZiAtIHAtPnBfb2Zmc2V0OworCQl9CisKKwkgICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQpCisJCXsKKwkJICBwaGRyc192YWRkciA9IHAtPnBfdmFkZHI7CisJCSAgcGhkcnNfcGFkZHIgPSBwLT5wX3BhZGRyOworCQl9CisJICAgICAgZWxzZQorCQlwaGRyc192YWRkciA9IGJlZC0+bWF4cGFnZXNpemUgKyBiZWQtPnMtPnNpemVvZl9laGRyOworCSAgICB9CisKKwkgIHAtPnBfZmlsZXN6ICs9IGFsbG9jICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKKwkgIHAtPnBfbWVtc3ogKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOworCX0KKworICAgICAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FECisJICB8fCAocC0+cF90eXBlID09IFBUX05PVEUgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9jb3JlKSkKKwl7CisJICBpZiAoISBtLT5pbmNsdWRlc19maWxlaGRyICYmICEgbS0+aW5jbHVkZXNfcGhkcnMpCisJICAgIHAtPnBfb2Zmc2V0ID0gb2ZmOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZmlsZV9wdHIgYWRqdXN0OworCisJICAgICAgYWRqdXN0ID0gb2ZmIC0gKHAtPnBfb2Zmc2V0ICsgcC0+cF9maWxlc3opOworCSAgICAgIHAtPnBfZmlsZXN6ICs9IGFkanVzdDsKKwkgICAgICBwLT5wX21lbXN6ICs9IGFkanVzdDsKKwkgICAgfQorCX0KKworICAgICAgdm9mZiA9IG9mZjsKKworICAgICAgZm9yIChpID0gMCwgc2VjcHAgPSBtLT5zZWN0aW9uczsgaSA8IG0tPmNvdW50OyBpKyssIHNlY3BwKyspCisJeworCSAgYXNlY3Rpb24gKnNlYzsKKwkgIGZsYWd3b3JkIGZsYWdzOworCSAgYmZkX3NpemVfdHlwZSBhbGlnbjsKKworCSAgc2VjID0gKnNlY3BwOworCSAgZmxhZ3MgPSBzZWMtPmZsYWdzOworCSAgYWxpZ24gPSAxIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYyk7CisKKwkgIC8qIFRoZSBzZWN0aW9uIG1heSBoYXZlIGFydGlmaWNpYWwgYWxpZ25tZW50IGZvcmNlZCBieSBhCisJICAgICBsaW5rIHNjcmlwdC4gIE5vdGljZSB0aGlzIGNhc2UgYnkgdGhlIGdhcCBiZXR3ZWVuIHRoZQorCSAgICAgY3VtdWxhdGl2ZSBwaGRyIHZtYSBhbmQgdGhlIHNlY3Rpb24ncyB2bWEuICAqLworCSAgaWYgKHAtPnBfdmFkZHIgKyBwLT5wX21lbXN6IDwgc2VjLT52bWEpCisJICAgIHsKKwkgICAgICBiZmRfdm1hIGFkanVzdCA9IHNlYy0+dm1hIC0gKHAtPnBfdmFkZHIgKyBwLT5wX21lbXN6KTsKKworCSAgICAgIHAtPnBfbWVtc3ogKz0gYWRqdXN0OworCSAgICAgIG9mZiArPSBhZGp1c3Q7CisJICAgICAgdm9mZiArPSBhZGp1c3Q7CisJICAgICAgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwKQorCQlwLT5wX2ZpbGVzeiArPSBhZGp1c3Q7CisJICAgIH0KKworCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQorCSAgICB7CisJICAgICAgYmZkX3NpZ25lZF92bWEgYWRqdXN0OworCisJICAgICAgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwKQorCQl7CisJCSAgYWRqdXN0ID0gc2VjLT5sbWEgLSAocC0+cF9wYWRkciArIHAtPnBfbWVtc3opOworCQkgIGlmIChhZGp1c3QgPCAwKQorCQkgICAgYWRqdXN0ID0gMDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChmbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJeworCQkgIC8qIFRoZSBzZWN0aW9uIFZNQSBtdXN0IGVxdWFsIHRoZSBmaWxlIHBvc2l0aW9uCisJCSAgICAgbW9kdWxvIHRoZSBwYWdlIHNpemUuICBGSVhNRTogSSdtIG5vdCBzdXJlIGlmCisJCSAgICAgdGhpcyBhZGp1c3RtZW50IGlzIHJlYWxseSBuZWNlc3NhcnkuICBXZSB1c2VkIHRvCisJCSAgICAgbm90IGhhdmUgdGhlIFNFQ19MT0FEIGNhc2UganVzdCBhYm92ZSwgYW5kIHRoZW4KKwkJICAgICB0aGlzIHdhcyBuZWNlc3NhcnksIGJ1dCBub3cgSSdtIG5vdCBzdXJlLiAgKi8KKwkJICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKKwkJICAgIGFkanVzdCA9IChzZWMtPnZtYSAtIHZvZmYpICUgYmVkLT5tYXhwYWdlc2l6ZTsKKwkJICBlbHNlCisJCSAgICBhZGp1c3QgPSAoc2VjLT52bWEgLSB2b2ZmKSAlIGFsaWduOworCQl9CisJICAgICAgZWxzZQorCQlhZGp1c3QgPSAwOworCisJICAgICAgaWYgKGFkanVzdCAhPSAwKQorCQl7CisJCSAgaWYgKGkgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgKCogX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJKF8oIkVycm9yOiBGaXJzdCBzZWN0aW9uIGluIHNlZ21lbnQgKCVzKSBzdGFydHMgYXQgMHgleCIpLAorCQkJIGJmZF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIHNlYy0+bG1hKTsKKwkJICAgICAgKCogX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJKF8oIiAgICAgICB3aGVyZWFzIHNlZ21lbnQgc3RhcnRzIGF0IDB4JXgiKSwKKwkJCSBwLT5wX3BhZGRyKTsKKworCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCSAgcC0+cF9tZW1zeiArPSBhZGp1c3Q7CisJCSAgb2ZmICs9IGFkanVzdDsKKwkJICB2b2ZmICs9IGFkanVzdDsKKwkJICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCisJCSAgICBwLT5wX2ZpbGVzeiArPSBhZGp1c3Q7CisJCX0KKworCSAgICAgIHNlYy0+ZmlsZXBvcyA9IG9mZjsKKworCSAgICAgIC8qIFdlIGNoZWNrIFNFQ19IQVNfQ09OVEVOVFMgaGVyZSBiZWNhdXNlIGlmIE5PTE9BRCBpcworICAgICAgICAgICAgICAgICB1c2VkIGluIGEgbGlua2VyIHNjcmlwdCB3ZSBtYXkgaGF2ZSBhIHNlY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICBTRUNfTE9BRCBjbGVhciBidXQgd2hpY2ggaXMgc3VwcG9zZWQgdG8gaGF2ZQorICAgICAgICAgICAgICAgICBjb250ZW50cy4gICovCisJICAgICAgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwCisJCSAgfHwgKGZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKKwkJb2ZmICs9IHNlYy0+X3Jhd19zaXplOworCisJICAgICAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJdm9mZiArPSBzZWMtPl9yYXdfc2l6ZTsKKwkgICAgfQorCisJICBpZiAocC0+cF90eXBlID09IFBUX05PVEUgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9jb3JlKQorCSAgICB7CisJICAgICAgaWYgKGkgPT0gMCkJLyogdGhlIGFjdHVhbCAibm90ZSIgc2VnbWVudCAqLworCQl7CQkvKiB0aGlzIG9uZSBhY3R1YWxseSBjb250YWlucyBldmVyeXRoaW5nLiAqLworCQkgIHNlYy0+ZmlsZXBvcyA9IG9mZjsKKwkJICBwLT5wX2ZpbGVzeiA9IHNlYy0+X3Jhd19zaXplOworCQkgIG9mZiArPSBzZWMtPl9yYXdfc2l6ZTsKKwkJICB2b2ZmID0gb2ZmOworCQl9CisJICAgICAgZWxzZQkvKiBmYWtlIHNlY3Rpb25zIC0tIGRvbid0IG5lZWQgdG8gYmUgd3JpdHRlbiAqLworCQl7CisJCSAgc2VjLT5maWxlcG9zID0gMDsKKwkJICBzZWMtPl9yYXdfc2l6ZSA9IDA7CisJCSAgZmxhZ3MgPSBzZWMtPmZsYWdzID0gMDsJLyogbm8gY29udGVudHMgKi8KKwkJfQorCSAgICAgIHAtPnBfbWVtc3ogPSAwOworCSAgICAgIHAtPnBfYWxpZ24gPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwLT5wX21lbXN6ICs9IHNlYy0+X3Jhd19zaXplOworCisJICAgICAgaWYgKChmbGFncyAmIFNFQ19MT0FEKSAhPSAwKQorCQlwLT5wX2ZpbGVzeiArPSBzZWMtPl9yYXdfc2l6ZTsKKworCSAgICAgIGlmIChhbGlnbiA+IHAtPnBfYWxpZ24KKwkJICAmJiAocC0+cF90eXBlICE9IFBUX0xPQUQgfHwgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgPT0gMCkpCisJCXAtPnBfYWxpZ24gPSBhbGlnbjsKKwkgICAgfQorCisJICBpZiAoISBtLT5wX2ZsYWdzX3ZhbGlkKQorCSAgICB7CisJICAgICAgcC0+cF9mbGFncyB8PSBQRl9SOworCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKKwkJcC0+cF9mbGFncyB8PSBQRl9YOworCSAgICAgIGlmICgoZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCisJCXAtPnBfZmxhZ3MgfD0gUEZfVzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogTm93IHRoYXQgd2UgaGF2ZSBzZXQgdGhlIHNlY3Rpb24gZmlsZSBwb3NpdGlvbnMsIHdlIGNhbiBzZXQgdXAKKyAgICAgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgbm9uIFBUX0xPQUQgc2VnbWVudHMuICAqLworICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCwgcCA9IHBoZHJzOworICAgICAgIG0gIT0gTlVMTDsKKyAgICAgICBtID0gbS0+bmV4dCwgcCsrKQorICAgIHsKKyAgICAgIGlmIChwLT5wX3R5cGUgIT0gUFRfTE9BRCAmJiBtLT5jb3VudCA+IDApCisJeworCSAgQkZEX0FTU0VSVCAoISBtLT5pbmNsdWRlc19maWxlaGRyICYmICEgbS0+aW5jbHVkZXNfcGhkcnMpOworCSAgcC0+cF9vZmZzZXQgPSBtLT5zZWN0aW9uc1swXS0+ZmlsZXBvczsKKwl9CisgICAgICBpZiAobS0+Y291bnQgPT0gMCkKKwl7CisJICBpZiAobS0+aW5jbHVkZXNfZmlsZWhkcikKKwkgICAgeworCSAgICAgIHAtPnBfdmFkZHIgPSBmaWxlaGRyX3ZhZGRyOworCSAgICAgIGlmICghIG0tPnBfcGFkZHJfdmFsaWQpCisJCXAtPnBfcGFkZHIgPSBmaWxlaGRyX3BhZGRyOworCSAgICB9CisJICBlbHNlIGlmIChtLT5pbmNsdWRlc19waGRycykKKwkgICAgeworCSAgICAgIHAtPnBfdmFkZHIgPSBwaGRyc192YWRkcjsKKwkgICAgICBpZiAoISBtLT5wX3BhZGRyX3ZhbGlkKQorCQlwLT5wX3BhZGRyID0gcGhkcnNfcGFkZHI7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIENsZWFyIG91dCBhbnkgcHJvZ3JhbSBoZWFkZXJzIHdlIGFsbG9jYXRlZCBidXQgZGlkIG5vdCB1c2UuICAqLworICBmb3IgKDsgY291bnQgPCBhbGxvYzsgY291bnQrKywgcCsrKQorICAgIHsKKyAgICAgIG1lbXNldCAocCwgMCwgc2l6ZW9mICpwKTsKKyAgICAgIHAtPnBfdHlwZSA9IFBUX05VTEw7CisgICAgfQorCisgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSBwaGRyczsKKworICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOworCisgIC8qIFdyaXRlIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBiZWQtPnMtPnNpemVvZl9laGRyLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmVkLT5zLT53cml0ZV9vdXRfcGhkcnMgKGFiZmQsIHBoZHJzLCBhbGxvYykgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcHJvZ3JhbSBoZWFkZXIuCisKKyAgIElmIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgYmVmb3JlIGFueSBvZiB0aGUgc2VjdGlvbiBWTUEncyBhcmUgc2V0LCBpdAorICAgY2FuJ3QgY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciBhIHN0cmFuZ2UgbWVtb3J5IGxheW91dC4gIFRoaXMgb25seQorICAgaGFwcGVucyB3aGVuIFNJWkVPRl9IRUFERVJTIGlzIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0LiAgSW4gdGhpcyBjYXNlLAorICAgU09SVEVEX0hEUlMgaXMgTlVMTCBhbmQgd2UgYXNzdW1lIHRoZSBub3JtYWwgc2NlbmFyaW8gb2Ygb25lIHRleHQgYW5kIG9uZQorICAgZGF0YSBzZWdtZW50IChleGNsdXNpdmUgb2YgLmludGVycCBhbmQgLmR5bmFtaWMpLgorCisgICA/Pz8gVXNlciB3cml0dGVuIHNjcmlwdHMgbXVzdCBlaXRoZXIgbm90IHVzZSBTSVpFT0ZfSEVBREVSUywgb3IgYXNzdW1lIHRoZXJlCisgICB3aWxsIGJlIHR3byBzZWdtZW50cy4gICovCisKK3N0YXRpYyBiZmRfc2l6ZV90eXBlCitnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzaXplX3Qgc2VnczsKKyAgYXNlY3Rpb24gKnM7CisgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisKKyAgLyogV2UgY2FuJ3QgcmV0dXJuIGEgZGlmZmVyZW50IHJlc3VsdCBlYWNoIHRpbWUgd2UncmUgY2FsbGVkLiAgKi8KKyAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgIT0gMCkKKyAgICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZTsKKworICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXAgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOworCisgICAgICBzZWdzID0gMDsKKyAgICAgIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQorCSsrc2VnczsKKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemUgPSBzZWdzICogYmVkLT5zLT5zaXplb2ZfcGhkcjsKKyAgICAgIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOworICAgIH0KKworICAvKiBBc3N1bWUgd2Ugd2lsbCBuZWVkIGV4YWN0bHkgdHdvIFBUX0xPQUQgc2VnbWVudHM6IG9uZSBmb3IgdGV4dAorICAgICBhbmQgb25lIGZvciBkYXRhLiAgKi8KKyAgc2VncyA9IDI7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOworICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIElmIHdlIGhhdmUgYSBsb2FkYWJsZSBpbnRlcnByZXRlciBzZWN0aW9uLCB3ZSBuZWVkIGEKKwkgUFRfSU5URVJQIHNlZ21lbnQuICBJbiB0aGlzIGNhc2UsIGFzc3VtZSB3ZSBhbHNvIG5lZWQgYQorCSBQVF9QSERSIHNlZ21lbnQsIGFsdGhvdWdoIHRoYXQgbWF5IG5vdCBiZSB0cnVlIGZvciBhbGwKKwkgdGFyZ2V0cy4gICovCisgICAgICBzZWdzICs9IDI7CisgICAgfQorCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIGEgUFRfRFlOQU1JQyBzZWdtZW50LiAgKi8KKyAgICAgICsrc2VnczsKKyAgICB9CisKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCisJICAmJiBzdHJuY21wIChzLT5uYW1lLCAiLm5vdGUiLCA1KSA9PSAwKQorCXsKKwkgIC8qIFdlIG5lZWQgYSBQVF9OT1RFIHNlZ21lbnQuICAqLworCSAgKytzZWdzOworCX0KKyAgICB9CisKKyAgLyogTGV0IHRoZSBiYWNrZW5kIGNvdW50IHVwIGFueSBwcm9ncmFtIGhlYWRlcnMgaXQgbWlnaHQgbmVlZC4gICovCisgIGlmIChiZWQtPmVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKQorICAgIHsKKyAgICAgIGludCBhOworCisgICAgICBhID0gKCpiZWQtPmVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKSAoYWJmZCk7CisgICAgICBpZiAoYSA9PSAtMSkKKwlhYm9ydCAoKTsKKyAgICAgIHNlZ3MgKz0gYTsKKyAgICB9CisKKyAgZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSA9IHNlZ3MgKiBiZWQtPnMtPnNpemVvZl9waGRyOworICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZTsKK30KKworLyogV29yayBvdXQgdGhlIGZpbGUgcG9zaXRpb25zIG9mIGFsbCB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIGNhbGxlZCBieQorICAgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLiAgQWxsIHRoZSBzZWN0aW9uIHNpemVzIGFuZAorICAgVk1BcyBtdXN0IGJlIGtub3duIGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4KKworICAgV2UgZG8gbm90IGNvbnNpZGVyIHJlbG9jIHNlY3Rpb25zIGF0IHRoaXMgcG9pbnQsIHVubGVzcyB0aGV5IGZvcm0KKyAgIHBhcnQgb2YgdGhlIGxvYWRhYmxlIGltYWdlLiAgUmVsb2Mgc2VjdGlvbnMgYXJlIGFzc2lnbmVkIGZpbGUKKyAgIHBvc2l0aW9ucyBpbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcywgd2hpY2ggaXMgY2FsbGVkIGJ5CisgICB3cml0ZV9vYmplY3RfY29udGVudHMgYW5kIGZpbmFsX2xpbmsuCisKKyAgIFdlIGFsc28gZG9uJ3Qgc2V0IHRoZSBwb3NpdGlvbnMgb2YgdGhlIC5zeW10YWIgYW5kIC5zdHJ0YWIgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCithc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqIGNvbnN0IHRkYXRhID0gZWxmX3RkYXRhIChhYmZkKTsKKyAgRWxmX0ludGVybmFsX0VoZHIgKiBjb25zdCBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7CisgIEVsZl9JbnRlcm5hbF9TaGRyICoqIGNvbnN0IGlfc2hkcnBwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKTsKKyAgZmlsZV9wdHIgb2ZmOworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAKKyAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfY29yZSkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIC8qIFN0YXJ0IGFmdGVyIHRoZSBFTEYgaGVhZGVyLiAgKi8KKyAgICAgIG9mZiA9IGlfZWhkcnAtPmVfZWhzaXplOworCisgICAgICAvKiBXZSBhcmUgbm90IGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgd2UgYXJlCisJIG5vdCBjcmVhdGluZyBhIHByb2dyYW0gaGVhZGVyLCBhbmQgdGhhdCB0aGUgYWN0dWFsIG9yZGVyIG9mCisJIHRoZSBzZWN0aW9ucyBpbiB0aGUgZmlsZSBpcyB1bmltcG9ydGFudC4gICovCisgICAgICBmb3IgKGkgPSAxLCBoZHJwcCA9IGlfc2hkcnBwICsgMTsgaSA8IGlfZWhkcnAtPmVfc2hudW07IGkrKywgaGRycHArKykKKwl7CisJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOworCisJICBoZHIgPSAqaGRycHA7CisJICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9SRUwgfHwgaGRyLT5zaF90eXBlID09IFNIVF9SRUxBKQorCSAgICB7CisJICAgICAgaGRyLT5zaF9vZmZzZXQgPSAtMTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgaWYgKGkgPT0gdGRhdGEtPnN5bXRhYl9zZWN0aW9uCisJICAgICAgfHwgaSA9PSB0ZGF0YS0+c3RydGFiX3NlY3Rpb24pCisJICAgIHsKKwkgICAgICBoZHItPnNoX29mZnNldCA9IC0xOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKKworICAgICAgLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgbG9hZGVkIHNlY3Rpb25zIGJhc2VkIG9uIHRoZQorICAgICAgICAgYXNzaWdubWVudCBvZiBzZWN0aW9ucyB0byBzZWdtZW50cy4gICovCisgICAgICBpZiAoISBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIG90aGVyIHNlY3Rpb25zLiAgKi8KKworICAgICAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKKyAgICAgIGZvciAoaSA9IDEsIGhkcnBwID0gaV9zaGRycHAgKyAxOyBpIDwgaV9laGRycC0+ZV9zaG51bTsgaSsrLCBoZHJwcCsrKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7CisKKwkgIGhkciA9ICpoZHJwcDsKKwkgIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKKwkgICAgICAmJiBoZHItPmJmZF9zZWN0aW9uLT5maWxlcG9zICE9IDApCisJICAgIGhkci0+c2hfb2Zmc2V0ID0gaGRyLT5iZmRfc2VjdGlvbi0+ZmlsZXBvczsKKwkgIGVsc2UgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwKQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IHdhcm5pbmc6IGFsbG9jYXRlZCBzZWN0aW9uIGAlcycgbm90IGluIHNlZ21lbnQiKSwKKwkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCisJCShoZHItPmJmZF9zZWN0aW9uID09IE5VTEwKKwkJID8gIip1bmtub3duKiIKKwkJIDogaGRyLT5iZmRfc2VjdGlvbi0+bmFtZSkpKTsKKwkgICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKKwkJb2ZmICs9IChoZHItPnNoX2FkZHIgLSBvZmYpICUgYmVkLT5tYXhwYWdlc2l6ZTsKKwkgICAgICBlbHNlCisJCW9mZiArPSAoaGRyLT5zaF9hZGRyIC0gb2ZmKSAlIGhkci0+c2hfYWRkcmFsaWduOworCSAgICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwKKwkJCQkJCQkgICAgICAgZmFsc2UpOworCSAgICB9CisJICBlbHNlIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX1JFTAorCQkgICB8fCBoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEKKwkJICAgfHwgaGRyID09IGlfc2hkcnBwW3RkYXRhLT5zeW10YWJfc2VjdGlvbl0KKwkJICAgfHwgaGRyID09IGlfc2hkcnBwW3RkYXRhLT5zdHJ0YWJfc2VjdGlvbl0pCisJICAgIGhkci0+c2hfb2Zmc2V0ID0gLTE7CisJICBlbHNlCisJICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7CisJfQorICAgIH0KKworICAvKiBQbGFjZSB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KKyAgb2ZmID0gYWxpZ25fZmlsZV9wb3NpdGlvbiAob2ZmLCBiZWQtPnMtPmZpbGVfYWxpZ24pOworICBpX2VoZHJwLT5lX3Nob2ZmID0gb2ZmOworICBvZmYgKz0gaV9laGRycC0+ZV9zaG51bSAqIGlfZWhkcnAtPmVfc2hlbnRzaXplOworCisgIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitwcmVwX2hlYWRlcnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLworICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRycCA9IDA7IC8qIFByb2dyYW0gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCisgIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KKyAgaW50IGNvdW50OworICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzaHN0cnRhYjsKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKKworICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7CisgIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOworCisgIHNoc3RydGFiID0gX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQgKCk7CisgIGlmIChzaHN0cnRhYiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBlbGZfc2hzdHJ0YWIgKGFiZmQpID0gc2hzdHJ0YWI7CisKKyAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUcwXSA9IEVMRk1BRzA7CisgIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMV0gPSBFTEZNQUcxOworICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzJdID0gRUxGTUFHMjsKKyAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUczXSA9IEVMRk1BRzM7CisKKyAgaV9laGRycC0+ZV9pZGVudFtFSV9DTEFTU10gPSBiZWQtPnMtPmVsZmNsYXNzOworICBpX2VoZHJwLT5lX2lkZW50W0VJX0RBVEFdID0KKyAgICBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyBFTEZEQVRBMk1TQiA6IEVMRkRBVEEyTFNCOworICBpX2VoZHJwLT5lX2lkZW50W0VJX1ZFUlNJT05dID0gYmVkLT5zLT5ldl9jdXJyZW50OworCisgIGZvciAoY291bnQgPSBFSV9QQUQ7IGNvdW50IDwgRUlfTklERU5UOyBjb3VudCsrKQorICAgIGlfZWhkcnAtPmVfaWRlbnRbY291bnRdID0gMDsKKworICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKyAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9EWU47CisgIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMCkKKyAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9FWEVDOworICBlbHNlIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpCisgICAgaV9laGRycC0+ZV90eXBlID0gRVRfQ09SRTsKKyAgZWxzZQorICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX1JFTDsKKworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCisgICAgeworICAgIGNhc2UgYmZkX2FyY2hfdW5rbm93bjoKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX05PTkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgorICAgICAgaWYgKGJlZC0+cy0+YXJjaF9zaXplID09IDY0KQorCWlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NQQVJDVjk7CisgICAgICBlbHNlCisJaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fU1BBUkM7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2kzODY6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV8zODY7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV82OEs7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX204OGs6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV84OEs7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2k4NjA6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV84NjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX21pcHM6CS8qIE1JUFMgUnh4eHggKi8KKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX01JUFM7CS8qIG9ubHkgTUlQUyBSMzAwMCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9ocHBhOgorICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fUEFSSVNDOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgorICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fUFBDOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FMUEhBOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9zaDoKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NIOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9kMTB2OgorICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0QxMFY7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2QzMHY6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRDMwVjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2FyY2hfZnIzMDoKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19GUjMwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9tY29yZToKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX01DT1JFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF92ODUwOgorICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorCXsKKwlkZWZhdWx0OgorCWNhc2UgMDogICAgICAgICAgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfVjg1MDsgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICBjYXNlIGJmZF9hcmNoX2FyYzoKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19BUkM7CisgICAgICBicmVhazsKKyAgIGNhc2UgYmZkX2FyY2hfYXJtOgorICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQVJNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfYXJjaF9tMzJyOgorICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX00zMlI7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX21uMTAyMDA6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDIwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2FyY2hfbW4xMDMwMDoKKyAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NTjEwMzAwOworICAgICAgYnJlYWs7CisgICAgICAvKiBhbHNvIG5vdGUgdGhhdCBFTV9NMzIsIEFUJlQgV0UzMjEwMCBpcyB1bmtub3duIHRvIGJmZCAqLworICAgIGRlZmF1bHQ6CisgICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9OT05FOworICAgIH0KKyAgaV9laGRycC0+ZV92ZXJzaW9uID0gYmVkLT5zLT5ldl9jdXJyZW50OworICBpX2VoZHJwLT5lX2Voc2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7CisKKyAgLyogbm8gcHJvZ3JhbSBoZWFkZXIsIGZvciBub3cuICovCisgIGlfZWhkcnAtPmVfcGhvZmYgPSAwOworICBpX2VoZHJwLT5lX3BoZW50c2l6ZSA9IDA7CisgIGlfZWhkcnAtPmVfcGhudW0gPSAwOworCisgIC8qIGVhY2ggYmZkIHNlY3Rpb24gaXMgc2VjdGlvbiBoZWFkZXIgZW50cnkgKi8KKyAgaV9laGRycC0+ZV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIGlfZWhkcnAtPmVfc2hlbnRzaXplID0gYmVkLT5zLT5zaXplb2Zfc2hkcjsKKworICAvKiBpZiB3ZSdyZSBidWlsZGluZyBhbiBleGVjdXRhYmxlLCB3ZSdsbCBuZWVkIGEgcHJvZ3JhbSBoZWFkZXIgdGFibGUgKi8KKyAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQorICAgIHsKKyAgICAgIC8qIGl0IGFsbCBoYXBwZW5zIGxhdGVyICovCisjaWYgMAorICAgICAgaV9laGRycC0+ZV9waGVudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKTsKKworICAgICAgLyogZWxmX2J1aWxkX3BoZHJzKCkgcmV0dXJucyBhIChOVUxMLXRlcm1pbmF0ZWQpIGFycmF5IG9mCisJIEVsZl9JbnRlcm5hbF9QaGRycyAqLworICAgICAgaV9waGRycCA9IGVsZl9idWlsZF9waGRycyAoYWJmZCwgaV9laGRycCwgaV9zaGRycCwgJmlfZWhkcnAtPmVfcGhudW0pOworICAgICAgaV9laGRycC0+ZV9waG9mZiA9IG91dGJhc2U7CisgICAgICBvdXRiYXNlICs9IGlfZWhkcnAtPmVfcGhlbnRzaXplICogaV9laGRycC0+ZV9waG51bTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlfZWhkcnAtPmVfcGhlbnRzaXplID0gMDsKKyAgICAgIGlfcGhkcnAgPSAwOworICAgICAgaV9laGRycC0+ZV9waG9mZiA9IDA7CisgICAgfQorCisgIGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfbmFtZSA9CisgICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zeW10YWIiLCB0cnVlLCBmYWxzZSk7CisgIGVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHIuc2hfbmFtZSA9CisgICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zdHJ0YWIiLCB0cnVlLCBmYWxzZSk7CisgIGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkci5zaF9uYW1lID0KKyAgICAodW5zaWduZWQgaW50KSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNoc3RydGFiLCAiLnNoc3RydGFiIiwgdHJ1ZSwgZmFsc2UpOworICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xCisgICAgICB8fCBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX25hbWUgPT0gKHVuc2lnbmVkIGludCkgLTEKKyAgICAgIHx8IGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIGZvciBhbGwgdGhlIHJlbG9jIHNlY3Rpb25zIHdoaWNoIGFyZSBub3QgcGFydAorICAgb2YgdGhlIGxvYWRhYmxlIGZpbGUgaW1hZ2UuICAqLworCit2b2lkCitfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBmaWxlX3B0ciBvZmY7CisgIHVuc2lnbmVkIGludCBpOworICBFbGZfSW50ZXJuYWxfU2hkciAqKnNoZHJwcDsKKworICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOworCisgIGZvciAoaSA9IDEsIHNoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgKyAxOworICAgICAgIGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKKyAgICAgICBpKyssIHNoZHJwcCsrKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzaGRycDsKKworICAgICAgc2hkcnAgPSAqc2hkcnBwOworICAgICAgaWYgKChzaGRycC0+c2hfdHlwZSA9PSBTSFRfUkVMIHx8IHNoZHJwLT5zaF90eXBlID09IFNIVF9SRUxBKQorCSAgJiYgc2hkcnAtPnNoX29mZnNldCA9PSAtMSkKKwlvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc2hkcnAsIG9mZiwgdHJ1ZSk7CisgICAgfQorCisgIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Cit9CisKK2Jvb2xlYW4KK19iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsKKyAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOworICBib29sZWFuIGZhaWxlZDsKKyAgdW5zaWduZWQgaW50IGNvdW50OworCisgIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4KKyAgICAgICYmICEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zCisgICAgICAgICAgICAgKGFiZmQsIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBOVUxMKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7CisgIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKKworICBmYWlsZWQgPSBmYWxzZTsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBiZWQtPnMtPndyaXRlX3JlbG9jcywgJmZhaWxlZCk7CisgIGlmIChmYWlsZWQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIChhYmZkKTsKKworICAvKiBBZnRlciB3cml0aW5nIHRoZSBoZWFkZXJzLCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBzZWN0aW9ucyB0b28uLi4gKi8KKyAgZm9yIChjb3VudCA9IDE7IGNvdW50IDwgaV9laGRycC0+ZV9zaG51bTsgY291bnQrKykKKyAgICB7CisgICAgICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpCisJKCpiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZykgKGFiZmQsIGlfc2hkcnBbY291bnRdKTsKKyAgICAgIGlmIChpX3NoZHJwW2NvdW50XS0+Y29udGVudHMpCisJeworCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpX3NoZHJwW2NvdW50XS0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCSAgICAgIHx8IChiZmRfd3JpdGUgKGlfc2hkcnBbY291bnRdLT5jb250ZW50cywgaV9zaGRycFtjb3VudF0tPnNoX3NpemUsCisJCQkgICAgIDEsIGFiZmQpCisJCSAgIT0gaV9zaGRycFtjb3VudF0tPnNoX3NpemUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVyIG5hbWVzLiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBlbGZfc2hzdHJ0YWIgKGFiZmQpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykKKyAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykgKGFiZmQsCisJCQkJCQllbGZfdGRhdGEgKGFiZmQpLT5saW5rZXIpOworCisgIHJldHVybiBiZWQtPnMtPndyaXRlX3NoZHJzX2FuZF9laGRyIChhYmZkKTsKK30KKworYm9vbGVhbgorX2JmZF9lbGZfd3JpdGVfY29yZWZpbGVfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgLyogSG9wZWZ1bGx5IHRoaXMgY2FuIGJlIGRvbmUganVzdCBsaWtlIGFuIG9iamVjdCBmaWxlLiAqLworICByZXR1cm4gX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKTsKK30KKy8qIGdpdmVuIGEgc2VjdGlvbiwgc2VhcmNoIHRoZSBoZWFkZXIgdG8gZmluZCB0aGVtLi4uICovCitpbnQKK19iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgYXNlY3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IHNlYyAqYXNlY3Q7Cit7CisgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisgIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7CisgIGludCBpbmRleDsKKyAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKyAgaW50IG1heGluZGV4ID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4aW5kZXg7IGluZGV4KyspCisgICAgeworICAgICAgaGRyID0gaV9zaGRycFtpbmRleF07CisgICAgICBpZiAoaGRyLT5iZmRfc2VjdGlvbiA9PSBhc2VjdCkKKwlyZXR1cm4gaW5kZXg7CisgICAgfQorCisgIGlmIChiZWQtPmVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbikKKyAgICB7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtYXhpbmRleDsgaW5kZXgrKykKKwl7CisJICBpbnQgcmV0dmFsOworCisJICBoZHIgPSBpX3NoZHJwW2luZGV4XTsKKwkgIHJldHZhbCA9IGluZGV4OworCSAgaWYgKCgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCisJICAgICAgKGFiZmQsIGhkciwgYXNlY3QsICZyZXR2YWwpKQorCSAgICByZXR1cm4gcmV0dmFsOworCX0KKyAgICB9CisKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoYXNlY3QpKQorICAgIHJldHVybiBTSE5fQUJTOworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChhc2VjdCkpCisgICAgcmV0dXJuIFNITl9DT01NT047CisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGFzZWN0KSkKKyAgICByZXR1cm4gU0hOX1VOREVGOworCisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOworCisgIHJldHVybiAtMTsKK30KKworLyogR2l2ZW4gYSBCRkQgc3ltYm9sLCByZXR1cm4gdGhlIGluZGV4IGluIHRoZSBFTEYgc3ltYm9sIHRhYmxlLCBvciAtMQorICAgb24gZXJyb3IuICAqLworCitpbnQKK19iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsIGFzeW1fcHRyX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqYXN5bV9wdHJfcHRyOworeworICBhc3ltYm9sICphc3ltX3B0ciA9ICphc3ltX3B0cl9wdHI7CisgIGludCBpZHg7CisgIGZsYWd3b3JkIGZsYWdzID0gYXN5bV9wdHItPmZsYWdzOworCisgIC8qIFdoZW4gZ2FzIGNyZWF0ZXMgcmVsb2NhdGlvbnMgYWdhaW5zdCBsb2NhbCBsYWJlbHMsIGl0IGNyZWF0ZXMgaXRzCisgICAgIG93biBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLCBidXQgZG9lcyBwdXQgdGhlIHN5bWJvbCBpbnRvIHRoZQorICAgICBzeW1ib2wgY2hhaW4sIHNvIHVkYXRhIGlzIDAuICBXaGVuIHRoZSBsaW5rZXIgaXMgZ2VuZXJhdGluZworICAgICByZWxvY2F0YWJsZSBvdXRwdXQsIHRoaXMgc2VjdGlvbiBzeW1ib2wgbWF5IGJlIGZvciBvbmUgb2YgdGhlCisgICAgIGlucHV0IHNlY3Rpb25zIHJhdGhlciB0aGFuIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisgIGlmIChhc3ltX3B0ci0+dWRhdGEuaSA9PSAwCisgICAgICAmJiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisgICAgICAmJiBhc3ltX3B0ci0+c2VjdGlvbikKKyAgICB7CisgICAgICBpbnQgaW5keDsKKworICAgICAgaWYgKGFzeW1fcHRyLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQorCWluZHggPSBhc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmluZGV4OworICAgICAgZWxzZQorCWluZHggPSBhc3ltX3B0ci0+c2VjdGlvbi0+aW5kZXg7CisgICAgICBpZiAoZWxmX3NlY3Rpb25fc3ltcyAoYWJmZClbaW5keF0pCisJYXN5bV9wdHItPnVkYXRhLmkgPSBlbGZfc2VjdGlvbl9zeW1zIChhYmZkKVtpbmR4XS0+dWRhdGEuaTsKKyAgICB9CisKKyAgaWR4ID0gYXN5bV9wdHItPnVkYXRhLmk7CisKKyAgaWYgKGlkeCA9PSAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgd2hlbiB1c2luZyAtLXN0cmlwLXN5bWJvbCBvbiBhIHN5bWJvbAorICAgICAgICAgd2hpY2ggaXMgdXNlZCBpbiBhIHJlbG9jYXRpb24gZW50cnkuICAqLworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIiVzOiBzeW1ib2wgYCVzJyByZXF1aXJlZCBidXQgbm90IHByZXNlbnQiKSwKKwkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJmZF9hc3ltYm9sX25hbWUgKGFzeW1fcHRyKSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjaWYgREVCVUcgJiA0CisgIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICBfKCJlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAweCUuOGx4LCBuYW1lID0gJXMsIHN5bSBudW0gPSAlZCwgZmxhZ3MgPSAweCUuOGx4JXNcbiIpLAorCSAgICAgKGxvbmcpIGFzeW1fcHRyLCBhc3ltX3B0ci0+bmFtZSwgaWR4LCBmbGFncywKKwkgICAgIGVsZl9zeW1ib2xfZmxhZ3MgKGZsYWdzKSk7CisgICAgZmZsdXNoIChzdGRlcnIpOworICB9CisjZW5kaWYKKworICByZXR1cm4gaWR4OworfQorCisvKiBDb3B5IHByaXZhdGUgQkZEIGRhdGEuICBUaGlzIGNvcGllcyBhbnkgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQ7CisgICAgIGJmZCAqb2JmZDsKK3sKKyAgRWxmX0ludGVybmFsX0VoZHIgKmllaGRyOworICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptZmlyc3Q7CisgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKipwbTsKKyAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKKyAgRWxmX0ludGVybmFsX1BoZHIgKnA7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgbnVtX3NlZ21lbnRzOworICBib29sZWFuIHBoZHJfaW5jbHVkZWQgPSBmYWxzZTsKKworICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGVsZl90ZGF0YSAoaWJmZCktPnBoZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZWhkciA9IGVsZl9lbGZoZWFkZXIgKGliZmQpOworCisgIG1maXJzdCA9IE5VTEw7CisgIHBtID0gJm1maXJzdDsKKworICBudW1fc2VnbWVudHMgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9waG51bTsKKworI2RlZmluZSBJU19DT05UQUlORURfQlkoYWRkciwgbGVuLCBib3R0b20sIHBoZHIpCQkgCVwKKwkgICgoYWRkcikgPj0gKGJvdHRvbSkJCQkJIAkgIAlcCisJICAgJiYgKCAgICgoYWRkcikgKyAobGVuKSkgPD0gKChib3R0b20pICsgKHBoZHIpLT5wX21lbXN6KQlcCisJICAgICAgIHx8ICgoYWRkcikgKyAobGVuKSkgPD0gKChib3R0b20pICsgKHBoZHIpLT5wX2ZpbGVzeikpKQorCisgIC8qIFNwZWNpYWwgY2FzZTogY29yZWZpbGUgIk5PVEUiIHNlY3Rpb24gY29udGFpbmluZyByZWdzLCBwcnBzaW5mbyBldGMuICovCisKKyNkZWZpbmUgSVNfQ09SRUZJTEVfTk9URShwLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKHAtPnBfdHlwZSA9PSBQVF9OT1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGliZmQpID09IGJmZF9jb3JlICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAmJiBzLT52bWEgPT0gMCAmJiBzLT5sbWEgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICYmIChiZmRfdm1hKSBzLT5maWxlcG9zID49IHAtPnBfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgJiYgKGJmZF92bWEpIHMtPmZpbGVwb3MgKyBzLT5fcmF3X3NpemUgICAgICAgICAgICAgICAgICAgICBcCisJICAgICA8PSBwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6KQorCisgIC8qIFRoZSBjb21wbGljYXRlZCBjYXNlIHdoZW4gcF92YWRkciBpcyAwIGlzIHRvIGhhbmRsZSB0aGUgU29sYXJpcworICAgICBsaW5rZXIsIHdoaWNoIGdlbmVyYXRlcyBhIFBUX0lOVEVSUCBzZWN0aW9uIHdpdGggcF92YWRkciBhbmQKKyAgICAgcF9tZW1zeiBzZXQgdG8gMC4gICovCisKKyNkZWZpbmUgSVNfU09MQVJJU19QVF9JTlRFUlAocCwgcykJCQkJCVwKKwkgICAgKHAtPnBfdmFkZHIgPT0gMAkJCQkJCVwKKwkgICAgICYmIHAtPnBfZmlsZXN6ID4gMAkJCQkJCVwKKwkgICAgICYmIChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAJCQlcCisJICAgICAmJiBzLT5fcmF3X3NpemUgPiAwCQkJCQlcCisJICAgICAmJiAoYmZkX3ZtYSkgcy0+ZmlsZXBvcyA+PSBwLT5wX29mZnNldAkJCVwKKwkgICAgICYmICgoYmZkX3ZtYSkgcy0+ZmlsZXBvcyArIHMtPl9yYXdfc2l6ZQkJCVwKKwkJICAgICA8PSBwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6KSkKKworICAvKiBTY2FuIHRocm91Z2ggdGhlIHNlZ21lbnRzIHNwZWNpZmllZCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIKKyAgICAgb2YgdGhlIGlucHV0IEJGRC4gICovCisgIGZvciAoaSA9IDAsIHAgPSBlbGZfdGRhdGEgKGliZmQpLT5waGRyOyBpIDwgbnVtX3NlZ21lbnRzOyBpKyssIHArKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgY3NlY3M7CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7CisgICAgICBhc2VjdGlvbiAqb3M7CisgICAgICB1bnNpZ25lZCBpbnQgaXNlYzsKKyAgICAgIGJmZF92bWEgbWF0Y2hpbmdfbG1hOworICAgICAgYmZkX3ZtYSBzdWdnZXN0ZWRfbG1hOworICAgICAgdW5zaWduZWQgaW50IGo7CisKKyAgICAgIC8qIEZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIGlucHV0IEJGRCwgZGVjaWRlIGlmIGl0IHNob3VsZCBiZQorCSBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBzZWdtZW50LiAgQSBzZWN0aW9uIHdpbGwgYmUgaW5jbHVkZWQKKwkgaWYgaXQgaXMgd2l0aGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBzZWdtZW50LCBhbmQgaXQgaXMKKwkgYW4gYWxsb2NhdGVkIHNlZ21lbnQsIGFuZCB0aGVyZSBpcyBhbiBvdXRwdXQgc2VjdGlvbgorCSBhc3NvY2lhdGVkIHdpdGggaXQuICAqLworICAgICAgY3NlY3MgPSAwOworICAgICAgZm9yIChzID0gaWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisJICB7CisJICAgIGlmICgoSVNfQ09OVEFJTkVEX0JZIChzLT52bWEsIHMtPl9yYXdfc2l6ZSwgcC0+cF92YWRkciwgcCkKKwkJIHx8IElTX1NPTEFSSVNfUFRfSU5URVJQIChwLCBzKSkKKwkJJiYgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCSAgICAgICsrY3NlY3M7CisJICAgIGVsc2UgaWYgKElTX0NPUkVGSUxFX05PVEUgKHAsIHMpKQorCSAgICAgICsrY3NlY3M7CisJICB9CisKKyAgICAgIC8qIEFsbG9jYXRlIGEgc2VnbWVudCBtYXAgYmlnIGVub3VnaCB0byBjb250YWluIGFsbCBvZiB0aGUKKwkgc2VjdGlvbnMgd2UgaGF2ZSBzZWxlY3RlZC4gICovCisgICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCisJICAgYmZkX2FsbG9jIChvYmZkLAorCQkgICAgICAoc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKQorCQkgICAgICAgKyAoKHNpemVfdCkgY3NlY3MgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7CisgICAgICBpZiAobSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmllbGRzIG9mIHRoZSBzZWdtZW50IG1hcC4gIERlZmF1bHQgdG8KKwkgdXNpbmcgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgaW4gdGhlIGlucHV0IEJGRC4gICovCisgICAgICBtLT5uZXh0ICAgICAgICAgID0gTlVMTDsKKyAgICAgIG0tPnBfdHlwZSAgICAgICAgPSBwLT5wX3R5cGU7CisgICAgICBtLT5wX2ZsYWdzICAgICAgID0gcC0+cF9mbGFnczsKKyAgICAgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOworICAgICAgbS0+cF9wYWRkciAgICAgICA9IHAtPnBfcGFkZHI7CisgICAgICBtLT5wX3BhZGRyX3ZhbGlkID0gMTsKKworICAgICAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgc2VnbWVudCBjb250YWlucyB0aGUgRUxGIGZpbGUgaGVhZGVyCisJIGFuZCBpZiBpdCBjb250YWlucyB0aGUgcHJvZ3JhbSBoZWFkZXJzIHRoZW1zZWx2ZXMuICAqLworICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IChwLT5wX29mZnNldCA9PSAwCisJCQkgICAgICYmIHAtPnBfZmlsZXN6ID49IGllaGRyLT5lX2Voc2l6ZSk7CisKKyAgICAgIG0tPmluY2x1ZGVzX3BoZHJzID0gMDsKKworICAgICAgaWYgKCEgcGhkcl9pbmNsdWRlZCB8fCBwLT5wX3R5cGUgIT0gUFRfTE9BRCkKKwl7CisJICBtLT5pbmNsdWRlc19waGRycyA9CisJICAgIChwLT5wX29mZnNldCA8PSAoYmZkX3ZtYSkgaWVoZHItPmVfcGhvZmYKKwkgICAgICYmIChwLT5wX29mZnNldCArIHAtPnBfZmlsZXN6CisJCSA+PSAoKGJmZF92bWEpIGllaGRyLT5lX3Bob2ZmCisJCSAgICAgKyBpZWhkci0+ZV9waG51bSAqIGllaGRyLT5lX3BoZW50c2l6ZSkpKTsKKwkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCAmJiBtLT5pbmNsdWRlc19waGRycykKKwkgICAgcGhkcl9pbmNsdWRlZCA9IHRydWU7CisJfQorCisgICAgICBpZiAoY3NlY3MgPT0gMCkKKwl7CisJICAvKiBTcGVjaWFsIHNlZ21lbnRzLCBzdWNoIGFzIHRoZSBQVF9QSERSIHNlZ21lbnQsIG1heSBjb250YWluCisJICAgICBubyBzZWN0aW9ucywgYnV0IG9yZGluYXJ5LCBsb2FkYWJsZSBzZWdtZW50cyBzaG91bGQgY29udGFpbgorCSAgICAgc29tZXRoaW5nLiAgKi8KKworCSAgaWYgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKQorCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgorCQkoXygiJXM6IHdhcm5pbmc6IEVtcHR5IGxvYWRhYmxlIHNlZ21lbnQgZGV0ZWN0ZWRcbiIpLAorCQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisJICBtLT5jb3VudCA9IDA7CisJICAqcG0gPSBtOworCSAgcG0gPSAmbS0+bmV4dDsKKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBOb3cgc2NhbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGlucHV0IEJGRCBhZ2FpbiBhbmQgYXR0ZW1wdAorCSB0byBhZGQgdGhlaXIgY29ycmVzcG9uZGluZyBvdXRwdXQgc2VjdGlvbnMgdG8gdGhlIHNlZ21lbnQgbWFwLgorCSBUaGUgcHJvYmxlbSBoZXJlIGlzIGhvdyB0byBoYW5kbGUgYW4gb3V0cHV0IHNlY3Rpb24gd2hpY2ggaGFzCisJIGJlZW4gbW92ZWQgKGllIGhhZCBpdHMgTE1BIGNoYW5nZWQpLiAgVGhlcmUgYXJlIGZvdXIgcG9zc2liaWxpdGllczoKKworCSAxLiBOb25lIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQuCisJICAgIEluIHRoaXMgY2FzZSB3ZSBjYW4gY29udGludWUgdG8gdXNlIHRoZSBzZWdtZW50IExNQSBmcm9tIHRoZQorCSAgICBpbnB1dCBCRkQuCisKKwkgMi4gQWxsIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQgYnkgdGhlIHNhbWUgYW1vdW50LgorCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNoYW5nZSB0aGUgc2VnbWVudCdzIExNQSB0byBtYXRjaCB0aGUgTE1BCisJICAgIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgorCisJIDMuIFNvbWUgb2YgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBtb3ZlZCwgb3RoZXJzIGhhdmUgbm90LgorCSAgICBJbiB0aGlzIGNhc2UgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiBtb3ZlZCBjYW4gYmUKKwkgICAgcGxhY2VkIGluIHRoZSBjdXJyZW50IHNlZ21lbnQgd2hpY2ggd2lsbCBoYXZlIHRvIGhhdmUgaXRzIHNpemUsCisJICAgIGFuZCBwb3NzaWJseSBpdHMgTE1BIGNoYW5nZWQsIGFuZCBhIG5ldyBzZWdtZW50IG9yIHNlZ21lbnRzIHdpbGwKKwkgICAgaGF2ZSB0byBiZSBjcmVhdGVkIHRvIGNvbnRhaW4gdGhlIG90aGVyIHNlY3Rpb25zLgorCisJIDQuIFRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsIGJ1dCBub3QgYmUgdGhlIHNhbWUgYW1vdW50LgorCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNoYW5nZSB0aGUgc2VnbWVudCdzIExNQSB0byBtYXRjaCB0aGUgTE1BCisJICAgIG9mIHRoZSBmaXJzdCBzZWN0aW9uIGFuZCB3ZSB3aWxsIGhhdmUgdG8gY3JlYXRlIGEgbmV3IHNlZ21lbnQKKwkgICAgb3Igc2VnbWVudHMgdG8gY29udGFpbiB0aGUgb3RoZXIgc2VjdGlvbnMuCisKKwkgSW4gb3JkZXIgdG8gc2F2ZSB0aW1lLCB3ZSBhbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIHRoZSBzZWN0aW9uCisJIHBvaW50ZXJzIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICBBcyB0aGVzZSBzZWN0aW9ucyBnZXQgYXNzaWduZWQKKwkgdG8gYSBzZWdtZW50LCB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhpcyBhcnJheS4gICovCisKKyAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGFzZWN0aW9uICopICogY3NlY3MpOworICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBTdGVwIE9uZTogU2NhbiBmb3Igc2VnbWVudCB2cyBzZWN0aW9uIExNQSBjb25mbGljdHMuCisJIEFsc28gYWRkIHRoZSBzZWN0aW9ucyB0byB0aGUgc2VjdGlvbiBhcnJheSBhbGxvY2F0ZWQgYWJvdmUuCisJIEFsc28gYWRkIHRoZSBzZWN0aW9ucyB0byB0aGUgY3VycmVudCBzZWdtZW50LiAgSW4gdGhlIGNvbW1vbgorCSBjYXNlLCB3aGVyZSB0aGUgc2VjdGlvbnMgaGF2ZSBub3QgYmVlbiBtb3ZlZCwgdGhpcyBtZWFucyB0aGF0CisJIHdlIGhhdmUgY29tcGxldGVseSBmaWxsZWQgdGhlIHNlZ21lbnQsIGFuZCB0aGVyZSBpcyBub3RoaW5nCisJIG1vcmUgdG8gZG8uICAqLworCisgICAgICBpc2VjID0gMDsKKyAgICAgIG1hdGNoaW5nX2xtYSA9IGZhbHNlOworICAgICAgc3VnZ2VzdGVkX2xtYSA9IDA7CisKKyAgICAgIGZvciAoaiA9IDAsIHMgPSBpYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwl7CisJICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOworCisJICBpZiAoKCgoSVNfQ09OVEFJTkVEX0JZIChzLT52bWEsIHMtPl9yYXdfc2l6ZSwgcC0+cF92YWRkciwgcCkKKwkJIHx8IElTX1NPTEFSSVNfUFRfSU5URVJQIChwLCBzKSkKKwkJJiYgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCSAgICAgICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKKwkgICAgICAmJiBvcyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgc2VjdGlvbnNbaisrXSA9IHM7CisKKwkgICAgICAvKiBUaGUgU29sYXJpcyBuYXRpdmUgbGlua2VyIGFsd2F5cyBzZXRzIHBfcGFkZHIgdG8gMC4KKwkJIFdlIHRyeSB0byBjYXRjaCB0aGF0IGNhc2UgaGVyZSwgYW5kIHNldCBpdCB0byB0aGUKKwkJIGNvcnJlY3QgdmFsdWUuICAqLworCSAgICAgIGlmIChwLT5wX3BhZGRyID09IDAKKwkJICAmJiBwLT5wX3ZhZGRyICE9IDAKKwkJICAmJiBpc2VjID09IDAKKwkJICAmJiBvcy0+bG1hICE9IDAKKwkJICAmJiAob3MtPnZtYSA9PSAocC0+cF92YWRkcgorCQkJCSAgKyAobS0+aW5jbHVkZXNfZmlsZWhkcgorCQkJCSAgICAgPyBpZWhkci0+ZV9laHNpemUKKwkJCQkgICAgIDogMCkKKwkJCQkgICsgKG0tPmluY2x1ZGVzX3BoZHJzCisJCQkJICAgICA/IGllaGRyLT5lX3BobnVtICogaWVoZHItPmVfcGhlbnRzaXplCisJCQkJICAgICA6IDApKSkpCisJCW0tPnBfcGFkZHIgPSBwLT5wX3ZhZGRyOworCisJICAgICAgLyogTWF0Y2ggdXAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgd2l0aCB0aGUKKwkJIExNQSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICAgICAgaWYgKElTX0NPTlRBSU5FRF9CWSAob3MtPmxtYSwgb3MtPl9yYXdfc2l6ZSwgbS0+cF9wYWRkciwgcCkKKwkJICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKKwkJeworCQkgIGlmIChtYXRjaGluZ19sbWEgPT0gMCkKKwkJICAgIG1hdGNoaW5nX2xtYSA9IG9zLT5sbWE7CisKKwkJICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB0aGUgc2VjdGlvbiBmaXRzIHdpdGhpbiB0aGUgc2VnbWVudAorCQkgICAgIHRoYXQgaXQgZG9lcyBub3Qgb3ZlcmxhcCBhbnkgb3RoZXIgc2VjdGlvbiB3aXRoaW4gdGhhdAorCQkgICAgIHNlZ21lbnQuICAqLworCQkgIG0tPnNlY3Rpb25zW2lzZWMrK10gPSBvczsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKKwkJc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7CisJICAgIH0KKwl9CisKKyAgICAgIEJGRF9BU1NFUlQgKGogPT0gY3NlY3MpOworCisgICAgICAvKiBTdGVwIFR3bzogQWRqdXN0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQsCisJIGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAoaXNlYyA9PSBjc2VjcykKKwl7CisJICAvKiBBbGwgb2YgdGhlIHNlY3Rpb25zIGZpdHRlZCB3aXRoaW4gdGhlIHNlZ21lbnQgYXMgY3VycmVudGx5CisJICAgICBzcGVjaWZpZWQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGNhc2UuICBBZGQgdGhlIHNlZ21lbnQgdG8KKwkgICAgIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzIGFuZCBjYXJyeSBvbiB0byBwcm9jZXNzIHRoZSBuZXh0CisJICAgICBwcm9ncmFtIGhlYWRlciBpbiB0aGUgaW5wdXQgQkZELiAgKi8KKwkgIG0tPmNvdW50ID0gY3NlY3M7CisJICAqcG0gPSBtOworCSAgcG0gPSAmbS0+bmV4dDsKKworCSAgZnJlZSAoc2VjdGlvbnMpOworCSAgY29udGludWU7CisJfQorICAgICAgZWxzZSBpZiAobWF0Y2hpbmdfbG1hICE9IDApCisJeworCSAgLyogQXQgbGVhc3Qgb25lIHNlY3Rpb24gZml0cyBpbnNpZGUgdGhlIGN1cnJlbnQgc2VnbWVudC4KKwkgICAgIEtlZXAgaXQsIGJ1dCBtb2RpZnkgaXRzIHBoeXNpY2FsIGFkZHJlc3MgdG8gbWF0Y2ggdGhlCisJICAgICBMTUEgb2YgdGhlIGZpcnN0IHNlY3Rpb24gdGhhdCBmaXR0ZWQuICAqLworCisJICBtLT5wX3BhZGRyID0gbWF0Y2hpbmdfbG1hOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBOb25lIG9mIHRoZSBzZWN0aW9ucyBmaXR0ZWQgaW5zaWRlIHRoZSBjdXJyZW50IHNlZ21lbnQuCisJICAgICBDaGFuZ2UgdGhlIGN1cnJlbnQgc2VnbWVudCdzIHBoeXNpY2FsIGFkZHJlc3MgdG8gbWF0Y2gKKwkgICAgIHRoZSBMTUEgb2YgdGhlIGZpcnN0IHNlY3Rpb24uICAqLworCisJICBtLT5wX3BhZGRyID0gc3VnZ2VzdGVkX2xtYTsKKwl9CisKKyAgICAgIC8qIFN0ZXAgVGhyZWU6IExvb3Agb3ZlciB0aGUgc2VjdGlvbnMgYWdhaW4sIHRoaXMgdGltZSBhc3NpZ25pbmcKKwkgdGhvc2UgdGhhdCBmaXQgdG8gdGhlIGN1cnJlbnQgc2VnbWVudCBhbmQgcmVtdm9pbmcgdGhlbSBmcm9tIHRoZQorCSBzZWN0aW9ucyBhcnJheTsgYnV0IG1ha2luZyBzdXJlIG5vdCB0byBsZWF2ZSBsYXJnZSBnYXBzLiAgT25jZSBhbGwKKwkgcG9zc2libGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaXQgaXMKKwkgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYnVpbHQgc2VnbWVudHMgYW5kIGlmIHNlY3Rpb25zIHN0aWxsIHJlbWFpbgorCSB0byBiZSBhc3NpZ25lZCwgYSBuZXcgc2VnbWVudCBpcyBjb25zdHJ1Y3RlZCBiZWZvcmUgcmVwZWF0aW5nCisJIHRoZSBsb29wLiAgKi8KKyAgICAgIGlzZWMgPSAwOworICAgICAgZG8KKwl7CisJICBtLT5jb3VudCA9IDA7CisJICBzdWdnZXN0ZWRfbG1hID0gMDsKKworCSAgLyogRmlsbCB0aGUgY3VycmVudCBzZWdtZW50IHdpdGggc2VjdGlvbnMgdGhhdCBmaXQuICAqLworCSAgZm9yIChqID0gMDsgaiA8IGNzZWNzOyBqKyspCisJICAgIHsKKwkgICAgICBzID0gc2VjdGlvbnNbal07CisKKwkgICAgICBpZiAocyA9PSBOVUxMKQorCQljb250aW51ZTsKKworCSAgICAgIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247CisKKwkgICAgICBpZiAoSVNfQ09OVEFJTkVEX0JZIChvcy0+bG1hLCBvcy0+X3Jhd19zaXplLCBtLT5wX3BhZGRyLCBwKQorCQkgIHx8IElTX0NPUkVGSUxFX05PVEUgKHAsIHMpKQorCQl7CisJCSAgaWYgKG0tPmNvdW50ID09IDApCisJCSAgICB7CisJCSAgICAgIC8qIElmIHRoZSBmaXJzdCBzZWN0aW9uIGluIGEgc2VnbWVudCBkb2VzIG5vdCBzdGFydCBhdAorCQkJIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQsIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nLiAgKi8KKwkJICAgICAgaWYgKG9zLT5sbWEgIT0gbS0+cF9wYWRkcikKKwkJCWFib3J0ICgpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYXNlY3Rpb24gKiBwcmV2X3NlYzsKKwkJICAgICAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKKworCQkgICAgICBwcmV2X3NlYyA9IG0tPnNlY3Rpb25zW20tPmNvdW50IC0gMV07CisJCSAgICAgIG1heHBhZ2VzaXplID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG9iZmQpLT5tYXhwYWdlc2l6ZTsKKworCQkgICAgICAvKiBJZiB0aGUgZ2FwIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgc2VjdGlvbgorCQkJIGFuZCB0aGUgc3RhcnQgb2YgdGhpcyBzZWN0aW9uIGlzIG1vcmUgdGhhbiBtYXhwYWdlc2l6ZQorCQkJIHRoZW4gd2UgbmVlZCB0byBzdGFydCBhIG5ldyBzZWdtZW50LiAgKi8KKwkJICAgICAgaWYgKEJGRF9BTElHTiAocHJldl9zZWMtPmxtYSArIHByZXZfc2VjLT5fcmF3X3NpemUsIG1heHBhZ2VzaXplKQorCQkJICA8IEJGRF9BTElHTiAob3MtPmxtYSwgbWF4cGFnZXNpemUpKQorCQkJeworCQkJICBpZiAoc3VnZ2VzdGVkX2xtYSA9PSAwKQorCQkJICAgIHN1Z2dlc3RlZF9sbWEgPSBvcy0+bG1hOworCisJCQkgIGNvbnRpbnVlOworCQkJfQorCQkgICAgfQorCisJCSAgbS0+c2VjdGlvbnNbbS0+Y291bnQrK10gPSBvczsKKwkJICArK2lzZWM7CisJCSAgc2VjdGlvbnNbal0gPSBOVUxMOworCQl9CisJICAgICAgZWxzZSBpZiAoc3VnZ2VzdGVkX2xtYSA9PSAwKQorCQlzdWdnZXN0ZWRfbG1hID0gb3MtPmxtYTsKKwkgICAgfQorCisJICBCRkRfQVNTRVJUIChtLT5jb3VudCA+IDApOworCisJICAvKiBBZGQgdGhlIGN1cnJlbnQgc2VnbWVudCB0byB0aGUgbGlzdCBvZiBidWlsdCBzZWdtZW50cy4gICovCisJICAqcG0gPSBtOworCSAgcG0gPSAmbS0+bmV4dDsKKworCSAgaWYgKGlzZWMgPCBjc2VjcykKKwkgICAgeworCSAgICAgIC8qIFdlIHN0aWxsIGhhdmUgbm90IGFsbG9jYXRlZCBhbGwgb2YgdGhlIHNlY3Rpb25zIHRvCisJCSBzZWdtZW50cy4gIENyZWF0ZSBhIG5ldyBzZWdtZW50IGhlcmUsIGluaXRpYWxpc2UgaXQKKwkJIGFuZCBjYXJyeSBvbiBsb29waW5nLiAgKi8KKworCSAgICAgIG0gPSAoKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikKKwkJICAgYmZkX2FsbG9jIChvYmZkLAorCQkJICAgICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKKwkJCSAgICAgICArICgoc2l6ZV90KSBjc2VjcyAtIDEpICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpKTsKKwkgICAgICBpZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWVsZHMgb2YgdGhlIHNlZ21lbnQgbWFwLiAgU2V0IHRoZSBwaHlzaWNhbAorCQkgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uIHRoYXQgaGFzCisJCSBub3QgeWV0IGJlZW4gYXNzaWduZWQuICAqLworCisJICAgICAgbS0+bmV4dCAgICAgICAgICAgICA9IE5VTEw7CisJICAgICAgbS0+cF90eXBlICAgICAgICAgICA9IHAtPnBfdHlwZTsKKwkgICAgICBtLT5wX2ZsYWdzICAgICAgICAgID0gcC0+cF9mbGFnczsKKwkgICAgICBtLT5wX2ZsYWdzX3ZhbGlkICAgID0gMTsKKwkgICAgICBtLT5wX3BhZGRyICAgICAgICAgID0gc3VnZ2VzdGVkX2xtYTsKKwkgICAgICBtLT5wX3BhZGRyX3ZhbGlkICAgID0gMTsKKwkgICAgICBtLT5pbmNsdWRlc19maWxlaGRyID0gMDsKKwkgICAgICBtLT5pbmNsdWRlc19waGRycyAgID0gMDsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChpc2VjIDwgY3NlY3MpOworCisgICAgICBmcmVlIChzZWN0aW9ucyk7CisgICAgfQorCisgIC8qIFRoZSBTb2xhcmlzIGxpbmtlciBjcmVhdGVzIHByb2dyYW0gaGVhZGVycyBpbiB3aGljaCBhbGwgdGhlCisgICAgIHBfcGFkZHIgZmllbGRzIGFyZSB6ZXJvLiAgV2hlbiB3ZSB0cnkgdG8gb2JqY29weSBvciBzdHJpcCBzdWNoIGEKKyAgICAgZmlsZSwgd2UgZ2V0IGNvbmZ1c2VkLiAgQ2hlY2sgZm9yIHRoaXMgY2FzZSwgYW5kIGlmIHdlIGZpbmQgaXQKKyAgICAgcmVzZXQgdGhlIHBfcGFkZHJfdmFsaWQgZmllbGRzLiAgKi8KKyAgZm9yIChtID0gbWZpcnN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQorICAgIGlmIChtLT5wX3BhZGRyICE9IDApCisgICAgICBicmVhazsKKyAgaWYgKG0gPT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKG0gPSBtZmlyc3Q7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCisJbS0+cF9wYWRkcl92YWxpZCA9IDA7CisgICAgfQorCisgIGVsZl90ZGF0YSAob2JmZCktPnNlZ21lbnRfbWFwID0gbWZpcnN0OworCisjaWYgMAorICAvKiBGaW5hbCBTdGVwOiBTb3J0IHRoZSBzZWdtZW50cyBpbnRvIGFzY2VuZGluZyBvcmRlciBvZiBwaHlzaWNhbCBhZGRyZXNzLiAqLworICBpZiAobWZpcnN0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGVsZl9zZWdtZW50X21hcCogcHJldjsKKworICAgICAgcHJldiA9IG1maXJzdDsKKyAgICAgIGZvciAobSA9IG1maXJzdC0+bmV4dDsgbSAhPSBOVUxMOyBwcmV2ID0gbSwgbSA9IG0tPm5leHQpCisJeworCSAgLyogWWVzIEkga25vdyAtIGl0cyBhIGJ1YmJsZSBzb3J0Li4uLiovCisJICBpZiAobS0+bmV4dCAhPSBOVUxMICYmIChtLT5uZXh0LT5wX3BhZGRyIDwgbS0+cF9wYWRkcikpCisJICAgIHsKKwkgICAgICAvKiBzd2FwIG0gYW5kIG0tPm5leHQgKi8KKwkgICAgICBwcmV2LT5uZXh0ID0gbS0+bmV4dDsKKwkgICAgICBtLT5uZXh0ID0gbS0+bmV4dC0+bmV4dDsKKwkgICAgICBwcmV2LT5uZXh0LT5uZXh0ID0gbTsKKworCSAgICAgIC8qIHJlc3RhcnQgbG9vcC4gKi8KKwkgICAgICBtID0gbWZpcnN0OworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisjdW5kZWYgSVNfQ09OVEFJTkVEX0JZCisjdW5kZWYgSVNfU09MQVJJU19QVF9JTlRFUlAKKyN1bmRlZiBJU19DT1JFRklMRV9OT1RFCisgIHJldHVybiB0cnVlOworfQorCisvKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgY29waWVzIG92ZXIgdGhlIGVudHNpemUKKyAgIGZpZWxkLCBhbmQgc29tZXRpbWVzIHRoZSBpbmZvIGZpZWxkLiAgKi8KKworYm9vbGVhbgorX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKKyAgICAgYmZkICppYmZkOworICAgICBhc2VjdGlvbiAqaXNlYzsKKyAgICAgYmZkICpvYmZkOworICAgICBhc2VjdGlvbiAqb3NlYzsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKmloZHIsICpvaGRyOworCisgIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBDb3B5IG92ZXIgcHJpdmF0ZSBCRkQgZGF0YSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjb3BpZWQuCisgICAgIFRoaXMgbXVzdCBiZSBkb25lIGhlcmUsIHJhdGhlciB0aGFuIGluIHRoZSBjb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyAgICAgZW50cnkgcG9pbnQsIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24KKyAgICAgY29udGVudHMgaGF2ZSBiZWVuIHNldCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcHJvZ3JhbSBoZWFkZXJzIGhhdmUKKyAgICAgYWxyZWFkeSBiZWVuIHdvcmtlZCBvdXQuICAqLworICBpZiAoZWxmX3RkYXRhIChvYmZkKS0+c2VnbWVudF9tYXAgPT0gTlVMTAorICAgICAgJiYgZWxmX3RkYXRhIChpYmZkKS0+cGhkciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzOworCisgICAgICAvKiBPbmx5IHNldCB1cCB0aGUgc2VnbWVudHMgaWYgdGhlcmUgYXJlIG5vIG1vcmUgU0VDX0FMTE9DCisgICAgICAgICBzZWN0aW9ucy4gIEZJWE1FOiBUaGlzIHdvbid0IGRvIHRoZSByaWdodCB0aGluZyBpZiBvYmpjb3B5IGlzCisgICAgICAgICB1c2VkIHRvIHJlbW92ZSB0aGUgbGFzdCBTRUNfQUxMT0Mgc2VjdGlvbiwgc2luY2Ugb2JqY29weQorICAgICAgICAgd29uJ3QgY2FsbCB0aGlzIHJvdXRpbmUgaW4gdGhhdCBjYXNlLiAgKi8KKyAgICAgIGZvciAocyA9IGlzZWMtPm5leHQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkgIGJyZWFrOworICAgICAgaWYgKHMgPT0gTlVMTCkKKwl7CisJICBpZiAoISBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICBpaGRyID0gJmVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkcjsKKyAgb2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+dGhpc19oZHI7CisKKyAgb2hkci0+c2hfZW50c2l6ZSA9IGloZHItPnNoX2VudHNpemU7CisKKyAgaWYgKGloZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQgorICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNCisgICAgICB8fCBpaGRyLT5zaF90eXBlID09IFNIVF9HTlVfdmVybmVlZAorICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfR05VX3ZlcmRlZikKKyAgICBvaGRyLT5zaF9pbmZvID0gaWhkci0+c2hfaW5mbzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ29weSBwcml2YXRlIHN5bWJvbCBpbmZvcm1hdGlvbi4gIElmIHRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbgorICAgd2hpY2ggd2UgZGlkIG5vdCBtYXAgaW50byBhIEJGRCBzZWN0aW9uLCB0cnkgdG8gbWFwIHRoZSBzZWN0aW9uCisgICBpbmRleCBjb3JyZWN0bHkuICBXZSB1c2Ugc3BlY2lhbCBtYWNybyBkZWZpbml0aW9ucyBmb3IgdGhlIG1hcHBlZAorICAgc2VjdGlvbiBpbmRpY2VzOyB0aGVzZSBkZWZpbml0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlCisgICBzd2FwX291dF9zeW1zIGZ1bmN0aW9uLiAgKi8KKworI2RlZmluZSBNQVBfT05FU1lNVEFCIChTSE5fTE9SRVNFUlZFIC0gMSkKKyNkZWZpbmUgTUFQX0RZTlNZTVRBQiAoU0hOX0xPUkVTRVJWRSAtIDIpCisjZGVmaW5lIE1BUF9TVFJUQUIgKFNITl9MT1JFU0VSVkUgLSAzKQorI2RlZmluZSBNQVBfU0hTVFJUQUIgKFNITl9MT1JFU0VSVkUgLSA0KQorCitib29sZWFuCitfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW1hcmcsIG9iZmQsIG9zeW1hcmcpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYXN5bWJvbCAqaXN5bWFyZzsKKyAgICAgYmZkICpvYmZkOworICAgICBhc3ltYm9sICpvc3ltYXJnOworeworICBlbGZfc3ltYm9sX3R5cGUgKmlzeW0sICpvc3ltOworCisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpc3ltID0gZWxmX3N5bWJvbF9mcm9tIChpYmZkLCBpc3ltYXJnKTsKKyAgb3N5bSA9IGVsZl9zeW1ib2xfZnJvbSAob2JmZCwgb3N5bWFyZyk7CisKKyAgaWYgKGlzeW0gIT0gTlVMTAorICAgICAgJiYgb3N5bSAhPSBOVUxMCisgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGlzeW0tPnN5bWJvbC5zZWN0aW9uKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgc2huZHg7CisKKyAgICAgIHNobmR4ID0gaXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keDsKKyAgICAgIGlmIChzaG5keCA9PSBlbGZfb25lc3ltdGFiIChpYmZkKSkKKwlzaG5keCA9IE1BUF9PTkVTWU1UQUI7CisgICAgICBlbHNlIGlmIChzaG5keCA9PSBlbGZfZHluc3ltdGFiIChpYmZkKSkKKwlzaG5keCA9IE1BUF9EWU5TWU1UQUI7CisgICAgICBlbHNlIGlmIChzaG5keCA9PSBlbGZfdGRhdGEgKGliZmQpLT5zdHJ0YWJfc2VjdGlvbikKKwlzaG5keCA9IE1BUF9TVFJUQUI7CisgICAgICBlbHNlIGlmIChzaG5keCA9PSBlbGZfdGRhdGEgKGliZmQpLT5zaHN0cnRhYl9zZWN0aW9uKQorCXNobmR4ID0gTUFQX1NIU1RSVEFCOworICAgICAgb3N5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCA9IHNobmR4OworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3dhcCBvdXQgdGhlIHN5bWJvbHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3dhcF9vdXRfc3ltcyAoYWJmZCwgc3R0cCwgcmVsb2NhdGFibGVfcCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoqc3R0cDsKKyAgICAgaW50IHJlbG9jYXRhYmxlX3A7Cit7CisgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisKKyAgaWYgKCFlbGZfbWFwX3N5bWJvbHMgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBEdW1wIG91dCB0aGUgc3ltdGFicy4gKi8KKyAgeworICAgIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICAgIGFzeW1ib2wgKipzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKKyAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHQ7CisgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXN0cnRhYl9oZHI7CisgICAgY2hhciAqb3V0Ym91bmRfc3ltczsKKyAgICBpbnQgaWR4OworCisgICAgc3R0ID0gX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQgKCk7CisgICAgaWYgKHN0dCA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICAgIHN5bXRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1lNVEFCOworICAgIHN5bXRhYl9oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9zeW07CisgICAgc3ltdGFiX2hkci0+c2hfc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2VudHNpemUgKiAoc3ltY291bnQgKyAxKTsKKyAgICBzeW10YWJfaGRyLT5zaF9pbmZvID0gZWxmX251bV9sb2NhbHMgKGFiZmQpICsgMTsKKyAgICBzeW10YWJfaGRyLT5zaF9hZGRyYWxpZ24gPSBiZWQtPnMtPmZpbGVfYWxpZ247CisKKyAgICBzeW1zdHJ0YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7CisgICAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7CisKKyAgICBvdXRib3VuZF9zeW1zID0gYmZkX2FsbG9jIChhYmZkLAorCQkJICAgICAgICgxICsgc3ltY291bnQpICogYmVkLT5zLT5zaXplb2Zfc3ltKTsKKyAgICBpZiAob3V0Ym91bmRfc3ltcyA9PSBOVUxMKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKFBUUikgb3V0Ym91bmRfc3ltczsKKworICAgIC8qIG5vdyBnZW5lcmF0ZSB0aGUgZGF0YSAoZm9yICJjb250ZW50cyIpICovCisgICAgeworICAgICAgLyogRmlsbCBpbiB6ZXJvdGggc3ltYm9sIGFuZCBzd2FwIGl0IG91dC4gICovCisgICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKKyAgICAgIHN5bS5zdF9uYW1lID0gMDsKKyAgICAgIHN5bS5zdF92YWx1ZSA9IDA7CisgICAgICBzeW0uc3Rfc2l6ZSA9IDA7CisgICAgICBzeW0uc3RfaW5mbyA9IDA7CisgICAgICBzeW0uc3Rfb3RoZXIgPSAwOworICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOworICAgICAgYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIChQVFIpIG91dGJvdW5kX3N5bXMpOworICAgICAgb3V0Ym91bmRfc3ltcyArPSBiZWQtPnMtPnNpemVvZl9zeW07CisgICAgfQorICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQorICAgICAgeworCUVsZl9JbnRlcm5hbF9TeW0gc3ltOworCWJmZF92bWEgdmFsdWUgPSBzeW1zW2lkeF0tPnZhbHVlOworCWVsZl9zeW1ib2xfdHlwZSAqdHlwZV9wdHI7CisJZmxhZ3dvcmQgZmxhZ3MgPSBzeW1zW2lkeF0tPmZsYWdzOworCWludCB0eXBlOworCisJaWYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQorCSAgLyogU2VjdGlvbiBzeW1ib2xzIGhhdmUgbm8gbmFtZXMuICAqLworCSAgc3ltLnN0X25hbWUgPSAwOworCWVsc2UKKwkgIHsKKwkgICAgc3ltLnN0X25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChzdHQsCisJCQkJCQkJICAgICAgc3ltc1tpZHhdLT5uYW1lLAorCQkJCQkJCSAgICAgIHRydWUsIGZhbHNlKTsKKwkgICAgaWYgKHN5bS5zdF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisKKwl0eXBlX3B0ciA9IGVsZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltc1tpZHhdKTsKKworCWlmICgoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKwkgICAgJiYgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1zW2lkeF0tPnNlY3Rpb24pKQorCSAgeworCSAgICAvKiBFTEYgY29tbW9uIHN5bWJvbHMgcHV0IHRoZSBhbGlnbm1lbnQgaW50byB0aGUgYHZhbHVlJyBmaWVsZCwKKwkgICAgICAgYW5kIHRoZSBzaXplIGludG8gdGhlIGBzaXplJyBmaWVsZC4gIFRoaXMgaXMgYmFja3dhcmRzIGZyb20KKwkgICAgICAgaG93IEJGRCBoYW5kbGVzIGl0LCBzbyByZXZlcnNlIGl0IGhlcmUuICAqLworCSAgICBzeW0uc3Rfc2l6ZSA9IHZhbHVlOworCSAgICBpZiAodHlwZV9wdHIgPT0gTlVMTAorCQl8fCB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSA9PSAwKQorCSAgICAgIHN5bS5zdF92YWx1ZSA9IHZhbHVlID49IDE2ID8gMTYgOiAoMSA8PCBiZmRfbG9nMiAodmFsdWUpKTsKKwkgICAgZWxzZQorCSAgICAgIHN5bS5zdF92YWx1ZSA9IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlOworCSAgICBzeW0uc3Rfc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KKwkgICAgICAoYWJmZCwgc3ltc1tpZHhdLT5zZWN0aW9uKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGFzZWN0aW9uICpzZWMgPSBzeW1zW2lkeF0tPnNlY3Rpb247CisJICAgIGludCBzaG5keDsKKworCSAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbikKKwkgICAgICB7CisJCXZhbHVlICs9IHNlYy0+b3V0cHV0X29mZnNldDsKKwkJc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKKwkgICAgICB9CisJICAgIC8qIERvbid0IGFkZCBpbiB0aGUgc2VjdGlvbiB2bWEgZm9yIHJlbG9jYXRhYmxlIG91dHB1dC4gICovCisJICAgIGlmICghIHJlbG9jYXRhYmxlX3ApCisJICAgICAgdmFsdWUgKz0gc2VjLT52bWE7CisJICAgIHN5bS5zdF92YWx1ZSA9IHZhbHVlOworCSAgICBzeW0uc3Rfc2l6ZSA9IHR5cGVfcHRyID8gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZSA6IDA7CisKKwkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQorCQkmJiB0eXBlX3B0ciAhPSBOVUxMCisJCSYmIHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ICE9IDApCisJICAgICAgeworCQkvKiBUaGlzIHN5bWJvbCBpcyBpbiBhIHJlYWwgRUxGIHNlY3Rpb24gd2hpY2ggd2UgZGlkCisgICAgICAgICAgICAgICAgICAgbm90IGNyZWF0ZSBhcyBhIEJGRCBzZWN0aW9uLiAgVW5kbyB0aGUgbWFwcGluZyBkb25lCisgICAgICAgICAgICAgICAgICAgYnkgY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLiAgKi8KKwkJc2huZHggPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keDsKKwkJc3dpdGNoIChzaG5keCkKKwkJICB7CisJCSAgY2FzZSBNQVBfT05FU1lNVEFCOgorCQkgICAgc2huZHggPSBlbGZfb25lc3ltdGFiIChhYmZkKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgTUFQX0RZTlNZTVRBQjoKKwkJICAgIHNobmR4ID0gZWxmX2R5bnN5bXRhYiAoYWJmZCk7CisJCSAgICBicmVhazsKKwkJICBjYXNlIE1BUF9TVFJUQUI6CisJCSAgICBzaG5keCA9IGVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9zZWN0aW9uOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBNQVBfU0hTVFJUQUI6CisJCSAgICBzaG5keCA9IGVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX3NlY3Rpb247CisJCSAgICBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7CisKKwkJaWYgKHNobmR4ID09IC0xKQorCQkgIHsKKwkJICAgIGFzZWN0aW9uICpzZWMyOworCisJCSAgICAvKiBXcml0aW5nIHRoaXMgd291bGQgYmUgYSBoZWxsIG9mIGEgbG90IGVhc2llciBpZgorCQkgICAgICAgd2UgaGFkIHNvbWUgZGVjZW50IGRvY3VtZW50YXRpb24gb24gYmZkLCBhbmQKKwkJICAgICAgIGtuZXcgd2hhdCB0byBleHBlY3Qgb2YgdGhlIGxpYnJhcnksIGFuZCB3aGF0IHRvCisJCSAgICAgICBkZW1hbmQgb2YgYXBwbGljYXRpb25zLiAgRm9yIGV4YW1wbGUsIGl0CisJCSAgICAgICBhcHBlYXJzIHRoYXQgYG9iamNvcHknIG1pZ2h0IG5vdCBzZXQgdGhlCisJCSAgICAgICBzZWN0aW9uIG9mIGEgc3ltYm9sIHRvIGJlIGEgc2VjdGlvbiB0aGF0IGlzCisJCSAgICAgICBhY3R1YWxseSBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworCQkgICAgc2VjMiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWMtPm5hbWUpOworCQkgICAgQkZEX0FTU0VSVCAoc2VjMiAhPSAwKTsKKwkJICAgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMyKTsKKwkJICAgIEJGRF9BU1NFUlQgKHNobmR4ICE9IC0xKTsKKwkJICB9CisJICAgICAgfQorCisJICAgIHN5bS5zdF9zaG5keCA9IHNobmR4OworCSAgfQorCisJaWYgKChmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKKwkgIHR5cGUgPSBTVFRfRlVOQzsKKwllbHNlIGlmICgoZmxhZ3MgJiBCU0ZfT0JKRUNUKSAhPSAwKQorCSAgdHlwZSA9IFNUVF9PQkpFQ1Q7CisJZWxzZQorCSAgdHlwZSA9IFNUVF9OT1RZUEU7CisKKyAgICAgICAgLyogUHJvY2Vzc29yLXNwZWNpZmljIHR5cGVzICovCisgICAgICAgIGlmIChiZWQtPmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkKKyAgICAgICAgICB0eXBlID0gKCpiZWQtPmVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSkgKCZ0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bSwgdHlwZSk7CisKKwlpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisJICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKKwllbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCisJICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCB0eXBlKTsKKwllbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCisJICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPICgoKGZsYWdzICYgQlNGX1dFQUspCisJCQkJICAgICAgPyBTVEJfV0VBSworCQkJCSAgICAgIDogU1RCX0dMT0JBTCksCisJCQkJICAgICB0eXBlKTsKKwllbHNlIGlmIChmbGFncyAmIEJTRl9GSUxFKQorCSAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfRklMRSk7CisJZWxzZQorCSAgeworCSAgICBpbnQgYmluZCA9IFNUQl9MT0NBTDsKKworCSAgICBpZiAoZmxhZ3MgJiBCU0ZfTE9DQUwpCisJICAgICAgYmluZCA9IFNUQl9MT0NBTDsKKwkgICAgZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfV0VBSykKKwkgICAgICBiaW5kID0gU1RCX1dFQUs7CisJICAgIGVsc2UgaWYgKGZsYWdzICYgQlNGX0dMT0JBTCkKKwkgICAgICBiaW5kID0gU1RCX0dMT0JBTDsKKworCSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChiaW5kLCB0eXBlKTsKKwkgIH0KKworCWlmICh0eXBlX3B0ciAhPSBOVUxMKQorCSAgc3ltLnN0X290aGVyID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXI7CisJZWxzZQorCSAgc3ltLnN0X290aGVyID0gMDsKKworCWJlZC0+cy0+c3dhcF9zeW1ib2xfb3V0IChhYmZkLCAmc3ltLCAoUFRSKSBvdXRib3VuZF9zeW1zKTsKKwlvdXRib3VuZF9zeW1zICs9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKKyAgICAgIH0KKworICAgICpzdHRwID0gc3R0OworICAgIHN5bXN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChzdHQpOworICAgIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOworCisgICAgc3ltc3RydGFiX2hkci0+c2hfZmxhZ3MgPSAwOworICAgIHN5bXN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOworICAgIHN5bXN0cnRhYl9oZHItPnNoX2VudHNpemUgPSAwOworICAgIHN5bXN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOworICAgIHN5bXN0cnRhYl9oZHItPnNoX2luZm8gPSAwOworICAgIHN5bXN0cnRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDE7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltdGFiIHZlY3Rvci4KKworICAgTm90ZSB0aGF0IHdlIGJhc2UgaXQgb24gdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBudWxsIHRlcm1pbmF0ZQorICAgdGhlIHZlY3RvciBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBzaXplLiAgSG93ZXZlciwgdGhlIEVMRiBzeW1ib2wgdGFibGUKKyAgIGFsd2F5cyBoYXMgYSBkdW1teSBlbnRyeSBhcyBzeW1ib2wgIzAsIHNvIGl0IGVuZHMgdXAgZXZlbi4gICovCisKK2xvbmcKK19iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgbG9uZyBzeW1jb3VudDsKKyAgbG9uZyBzeW10YWJfc2l6ZTsKKyAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworCisgIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOworICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOworCisgIHJldHVybiBzeW10YWJfc2l6ZTsKK30KKworbG9uZworX2JmZF9lbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGxvbmcgc3ltY291bnQ7CisgIGxvbmcgc3ltdGFiX3NpemU7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKKworICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX3N5bTsKKyAgc3ltdGFiX3NpemUgPSAoc3ltY291bnQgLSAxICsgMSkgKiAoc2l6ZW9mIChhc3ltYm9sICopKTsKKworICByZXR1cm4gc3ltdGFiX3NpemU7Cit9CisKK2xvbmcKK19iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBhc2VjdDsKK3sKKyAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKK30KKworLyogQ2Fub25pY2FsaXplIHRoZSByZWxvY3MuICAqLworCitsb25nCitfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBhcmVsZW50ICp0YmxwdHI7CisgIHVuc2lnbmVkIGludCBpOworCisgIGlmICghIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsCisJCQkJCQkJICAgc2VjdGlvbiwKKwkJCQkJCQkgICBzeW1ib2xzLAorCQkJCQkJCSAgIGZhbHNlKSkKKyAgICByZXR1cm4gLTE7CisKKyAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKyAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyspCisgICAgKnJlbHB0cisrID0gdGJscHRyKys7CisKKyAgKnJlbHB0ciA9IE5VTEw7CisKKyAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OworfQorCitsb25nCitfYmZkX2VsZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKK3sKKyAgbG9uZyBzeW1jb3VudCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2x1cnBfc3ltYm9sX3RhYmxlCisgICAgKGFiZmQsIGFsb2NhdGlvbiwgZmFsc2UpOworCisgIGlmIChzeW1jb3VudCA+PSAwKQorICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltY291bnQ7CisgIHJldHVybiBzeW1jb3VudDsKK30KKworbG9uZworX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKK3sKKyAgcmV0dXJuIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2x1cnBfc3ltYm9sX3RhYmxlCisgICAgKGFiZmQsIGFsb2NhdGlvbiwgdHJ1ZSk7Cit9CisKKy8qIFJldHVybiB0aGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MgZW50cmllcy4gIEFueQorICAgc2VjdGlvbiB0aGF0IHdhcyBhY3R1YWxseSBpbnN0YWxsZWQgaW4gdGhlIEJGRCwgYW5kIGhhcyB0eXBlCisgICBTSFRfUkVMIG9yIFNIVF9SRUxBLCBhbmQgdXNlcyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGlzCisgICBjb25zaWRlcmVkIHRvIGJlIGEgZHluYW1pYyByZWxvYyBzZWN0aW9uLiAgKi8KKworbG9uZworX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgbG9uZyByZXQ7CisgIGFzZWN0aW9uICpzOworCisgIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldCA9IHNpemVvZiAoYXJlbGVudCAqKTsKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9saW5rID09IGVsZl9keW5zeW10YWIgKGFiZmQpCisJJiYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwKKwkgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpKQorICAgICAgcmV0ICs9ICgocy0+X3Jhd19zaXplIC8gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2VudHNpemUpCisJICAgICAgKiBzaXplb2YgKGFyZWxlbnQgKikpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIENhbm9uaWNhbGl6ZSB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMuICBOb3RlIHRoYXQgd2UgcmV0dXJuCisgICB0aGUgZHluYW1pYyByZWxvY2F0aW9ucyBhcyBhIHNpbmdsZSBibG9jaywgYWx0aG91Z2ggdGhleSBhcmUKKyAgIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aCBwYXJ0aWN1bGFyIHNlY3Rpb25zOyB0aGUgaW50ZXJmYWNlLCB3aGljaAorICAgd2FzIGRlc2lnbmVkIGZvciBTdW5PUyBzdHlsZSBzaGFyZWQgbGlicmFyaWVzLCBleHBlY3RzIHRoYXQgdGhlcmUKKyAgIGlzIG9ubHkgb25lIHNldCBvZiBkeW5hbWljIHJlbG9jcy4gIEFueSBzZWN0aW9uIHRoYXQgd2FzIGFjdHVhbGx5CisgICBpbnN0YWxsZWQgaW4gdGhlIEJGRCwgYW5kIGhhcyB0eXBlIFNIVF9SRUwgb3IgU0hUX1JFTEEsIGFuZCB1c2VzCisgICB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBkeW5hbWljIHJlbG9jCisgICBzZWN0aW9uLiAgKi8KKworbG9uZworX2JmZF9lbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHN0b3JhZ2UsIHN5bXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqKnN0b3JhZ2U7CisgICAgIGFzeW1ib2wgKipzeW1zOworeworICBib29sZWFuICgqc2x1cnBfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOworICBhc2VjdGlvbiAqczsKKyAgbG9uZyByZXQ7CisKKyAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgc2x1cnBfcmVsb2NzID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9yZWxvY190YWJsZTsKKyAgcmV0ID0gMDsKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9saW5rID09IGVsZl9keW5zeW10YWIgKGFiZmQpCisJICAmJiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAorCSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKSkKKwl7CisJICBhcmVsZW50ICpwOworCSAgbG9uZyBjb3VudCwgaTsKKworCSAgaWYgKCEgKCpzbHVycF9yZWxvY3MpIChhYmZkLCBzLCBzeW1zLCB0cnVlKSkKKwkgICAgcmV0dXJuIC0xOworCSAgY291bnQgPSBzLT5fcmF3X3NpemUgLyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZTsKKwkgIHAgPSBzLT5yZWxvY2F0aW9uOworCSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJICAgICpzdG9yYWdlKysgPSBwKys7CisJICByZXQgKz0gY291bnQ7CisJfQorICAgIH0KKworICAqc3RvcmFnZSA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKwwKKy8qIFJlYWQgaW4gdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCitib29sZWFuCitfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOworCisgIGlmIChlbGZfZHludmVyZGVmIChhYmZkKSAhPSAwKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7CisgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICpldmVyZGVmOworICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqaXZlcmRlZjsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkcjsKKworICAgICAgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID0KKwkoKEVsZl9JbnRlcm5hbF9WZXJkZWYgKikKKwkgYmZkX3phbGxvYyAoYWJmZCwgaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVyZGVmKSkpOworICAgICAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBlbGZfdGRhdGEgKGFiZmQpLT5jdmVyZGVmcyA9IGhkci0+c2hfaW5mbzsKKworICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKKyAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkgIHx8IGJmZF9yZWFkICgoUFRSKSBjb250ZW50cywgMSwgaGRyLT5zaF9zaXplLCBhYmZkKSAhPSBoZHItPnNoX3NpemUpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGV2ZXJkZWYgPSAoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSBjb250ZW50czsKKyAgICAgIGl2ZXJkZWYgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWY7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaGRyLT5zaF9pbmZvOyBpKyssIGl2ZXJkZWYrKykKKwl7CisJICBFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqZXZlcmRhdXg7CisJICBFbGZfSW50ZXJuYWxfVmVyZGF1eCAqaXZlcmRhdXg7CisJICB1bnNpZ25lZCBpbnQgajsKKworCSAgX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4gKGFiZmQsIGV2ZXJkZWYsIGl2ZXJkZWYpOworCisJICBpdmVyZGVmLT52ZF9iZmQgPSBhYmZkOworCisJICBpdmVyZGVmLT52ZF9hdXhwdHIgPSAoKEVsZl9JbnRlcm5hbF9WZXJkYXV4ICopCisJCQkJYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgICAoaXZlcmRlZi0+dmRfY250CisJCQkJCSAgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1ZlcmRhdXgpKSkpOworCSAgaWYgKGl2ZXJkZWYtPnZkX2F1eHB0ciA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgZXZlcmRhdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopCisJCSAgICAgICgoYmZkX2J5dGUgKikgZXZlcmRlZiArIGl2ZXJkZWYtPnZkX2F1eCkpOworCSAgaXZlcmRhdXggPSBpdmVyZGVmLT52ZF9hdXhwdHI7CisJICBmb3IgKGogPSAwOyBqIDwgaXZlcmRlZi0+dmRfY250OyBqKyssIGl2ZXJkYXV4KyspCisJICAgIHsKKwkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4gKGFiZmQsIGV2ZXJkYXV4LCBpdmVyZGF1eCk7CisKKwkgICAgICBpdmVyZGF1eC0+dmRhX25vZGVuYW1lID0KKwkJYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAorCQkJCQkJIGl2ZXJkYXV4LT52ZGFfbmFtZSk7CisJICAgICAgaWYgKGl2ZXJkYXV4LT52ZGFfbm9kZW5hbWUgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkgICAgICBpZiAoaiArIDEgPCBpdmVyZGVmLT52ZF9jbnQpCisJCWl2ZXJkYXV4LT52ZGFfbmV4dHB0ciA9IGl2ZXJkYXV4ICsgMTsKKwkgICAgICBlbHNlCisJCWl2ZXJkYXV4LT52ZGFfbmV4dHB0ciA9IE5VTEw7CisKKwkgICAgICBldmVyZGF1eCA9ICgoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikKKwkJCSAgKChiZmRfYnl0ZSAqKSBldmVyZGF1eCArIGl2ZXJkYXV4LT52ZGFfbmV4dCkpOworCSAgICB9CisKKwkgIGl2ZXJkZWYtPnZkX25vZGVuYW1lID0gaXZlcmRlZi0+dmRfYXV4cHRyLT52ZGFfbm9kZW5hbWU7CisKKwkgIGlmIChpICsgMSA8IGhkci0+c2hfaW5mbykKKwkgICAgaXZlcmRlZi0+dmRfbmV4dGRlZiA9IGl2ZXJkZWYgKyAxOworCSAgZWxzZQorCSAgICBpdmVyZGVmLT52ZF9uZXh0ZGVmID0gTlVMTDsKKworCSAgZXZlcmRlZiA9ICgoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKQorCQkgICAgICgoYmZkX2J5dGUgKikgZXZlcmRlZiArIGl2ZXJkZWYtPnZkX25leHQpKTsKKwl9CisKKyAgICAgIGZyZWUgKGNvbnRlbnRzKTsKKyAgICAgIGNvbnRlbnRzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGVsZl9keW52ZXJyZWYgKGFiZmQpICE9IDApCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKyAgICAgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICpldmVybmVlZDsKKyAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICppdmVybmVlZDsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX2hkcjsKKworICAgICAgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID0KKwkoKEVsZl9JbnRlcm5hbF9WZXJuZWVkICopCisJIGJmZF96YWxsb2MgKGFiZmQsIGhkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmX0ludGVybmFsX1Zlcm5lZWQpKSk7CisgICAgICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJyZWZzID0gaGRyLT5zaF9pbmZvOworCisgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOworICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgYmZkX3JlYWQgKChQVFIpIGNvbnRlbnRzLCAxLCBoZHItPnNoX3NpemUsIGFiZmQpICE9IGhkci0+c2hfc2l6ZSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgZXZlcm5lZWQgPSAoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikgY29udGVudHM7CisgICAgICBpdmVybmVlZCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoZHItPnNoX2luZm87IGkrKywgaXZlcm5lZWQrKykKKwl7CisJICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqZXZlcm5hdXg7CisJICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqaXZlcm5hdXg7CisJICB1bnNpZ25lZCBpbnQgajsKKworCSAgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luIChhYmZkLCBldmVybmVlZCwgaXZlcm5lZWQpOworCisJICBpdmVybmVlZC0+dm5fYmZkID0gYWJmZDsKKworCSAgaXZlcm5lZWQtPnZuX2ZpbGVuYW1lID0KKwkgICAgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAorCQkJCQkgICAgIGl2ZXJuZWVkLT52bl9maWxlKTsKKwkgIGlmIChpdmVybmVlZC0+dm5fZmlsZW5hbWUgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGl2ZXJuZWVkLT52bl9hdXhwdHIgPQorCSAgICAoKEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopCisJICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQlpdmVybmVlZC0+dm5fY250ICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVybmF1eCkpKTsKKworCSAgZXZlcm5hdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopCisJCSAgICAgICgoYmZkX2J5dGUgKikgZXZlcm5lZWQgKyBpdmVybmVlZC0+dm5fYXV4KSk7CisJICBpdmVybmF1eCA9IGl2ZXJuZWVkLT52bl9hdXhwdHI7CisJICBmb3IgKGogPSAwOyBqIDwgaXZlcm5lZWQtPnZuX2NudDsgaisrLCBpdmVybmF1eCsrKQorCSAgICB7CisJICAgICAgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luIChhYmZkLCBldmVybmF1eCwgaXZlcm5hdXgpOworCisJICAgICAgaXZlcm5hdXgtPnZuYV9ub2RlbmFtZSA9CisJCWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIGhkci0+c2hfbGluaywKKwkJCQkJCSBpdmVybmF1eC0+dm5hX25hbWUpOworCSAgICAgIGlmIChpdmVybmF1eC0+dm5hX25vZGVuYW1lID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgaWYgKGogKyAxIDwgaXZlcm5lZWQtPnZuX2NudCkKKwkJaXZlcm5hdXgtPnZuYV9uZXh0cHRyID0gaXZlcm5hdXggKyAxOworCSAgICAgIGVsc2UKKwkJaXZlcm5hdXgtPnZuYV9uZXh0cHRyID0gTlVMTDsKKworCSAgICAgIGV2ZXJuYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKQorCQkJICAoKGJmZF9ieXRlICopIGV2ZXJuYXV4ICsgaXZlcm5hdXgtPnZuYV9uZXh0KSk7CisJICAgIH0KKworCSAgaWYgKGkgKyAxIDwgaGRyLT5zaF9pbmZvKQorCSAgICBpdmVybmVlZC0+dm5fbmV4dHJlZiA9IGl2ZXJuZWVkICsgMTsKKwkgIGVsc2UKKwkgICAgaXZlcm5lZWQtPnZuX25leHRyZWYgPSBOVUxMOworCisJICBldmVybmVlZCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikKKwkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVybmVlZCArIGl2ZXJuZWVkLT52bl9uZXh0KSk7CisJfQorCisgICAgICBmcmVlIChjb250ZW50cyk7CisgICAgICBjb250ZW50cyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoY29udGVudHMgPT0gTlVMTCkKKyAgICBmcmVlIChjb250ZW50cyk7CisgIHJldHVybiBmYWxzZTsKK30KKwwKK2FzeW1ib2wgKgorX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgZWxmX3N5bWJvbF90eXBlICpuZXdzeW07CisKKyAgbmV3c3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9zeW1ib2xfdHlwZSkpOworICBpZiAoIW5ld3N5bSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld3N5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworICAgICAgcmV0dXJuICZuZXdzeW0tPnN5bWJvbDsKKyAgICB9Cit9CisKK3ZvaWQKK19iZmRfZWxmX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIHN5bWJvbF9pbmZvICpyZXQ7Cit7CisgIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOworfQorCisvKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBNb3N0IHRhcmdldHMKKyAgIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUKKyAgIG92ZXJyaWRlIGl0LiAgKi8KKworYm9vbGVhbgorX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICAvKiBOb3JtYWwgbG9jYWwgc3ltYm9scyBzdGFydCB3aXRoIGBgLkwnJy4gICovCisgIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdMJykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBBdCBsZWFzdCBzb21lIFNWUjQgY29tcGlsZXJzIChlLmcuLCBVbml4V2FyZSAyLjEgY2MpIGdlbmVyYXRlCisgICAgIERXQVJGIGRlYnVnZ2luZyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggYGAuLicnLiAgKi8KKyAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJy4nKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIGdjYyB3aWxsIHNvbWV0aW1lcyBnZW5lcmF0ZSBzeW1ib2xzIGJlZ2lubmluZyB3aXRoIGBgXy5MXycnIHdoZW4KKyAgICAgZW1pdHRpbmcgRFdBUkYgZGVidWdnaW5nIG91dHB1dC4gIEkgc3VzcGVjdCB0aGlzIGlzIGFjdHVhbGx5IGEKKyAgICAgc21hbGwgYnVnIGluIGdjYyAoaXQgY2FsbHMgQVNNX09VVFBVVF9MQUJFTCB3aGVuIGl0IHNob3VsZCBjYWxsCisgICAgIEFTTV9HRU5FUkFURV9JTlRFUk5BTF9MQUJFTCwgYW5kIHRoaXMgY2F1c2VzIHRoZSBsZWFkaW5nCisgICAgIHVuZGVyc2NvcmUgdG8gYmUgZW1pdHRlZCBvbiBzb21lIEVMRiB0YXJnZXRzKS4gIEZvciBlYXNlIG9mIHVzZSwKKyAgICAgd2UgdHJlYXQgc3VjaCBzeW1ib2xzIGFzIGxvY2FsLiAgKi8KKyAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gJ0wnICYmIG5hbWVbM10gPT0gJ18nKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworYWxlbnQgKgorX2JmZF9lbGZfZ2V0X2xpbmVubyAoaWdub3JlX2FiZmQsIHN5bWJvbCkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworeworICBhYm9ydCAoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2xlYW4KK19iZmRfZWxmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKK3sKKyAgLyogSWYgdGhpcyBpc24ndCB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGJhY2tlbmQsIGFuZCB0aGlzCisgICAgIGlzbid0IHRoZSBnZW5lcmljIGJhY2tlbmQsIGZhaWwuICAqLworICBpZiAoYXJjaCAhPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmFyY2gKKyAgICAgICYmIGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bgorICAgICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5hcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKK30KKworLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHRvIGEgcGFydGljdWxhciBzZWN0aW9uIGFuZCBvZmZzZXQsIGZvciBlcnJvcgorICAgcmVwb3J0aW5nLiAgKi8KKworYm9vbGVhbgorX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsCisJCQkgICAgc2VjdGlvbiwKKwkJCSAgICBzeW1ib2xzLAorCQkJICAgIG9mZnNldCwKKwkJCSAgICBmaWxlbmFtZV9wdHIsCisJCQkgICAgZnVuY3Rpb25uYW1lX3B0ciwKKwkJCSAgICBsaW5lX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKK3sKKyAgYm9vbGVhbiBmb3VuZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGFzeW1ib2wgKmZ1bmM7CisgIGJmZF92bWEgbG93X2Z1bmM7CisgIGFzeW1ib2wgKipwOworCisgIGlmIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAorCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCAKKwkJCQkgICAgIGxpbmVfcHRyKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKKwkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKKwkJCQkgICAgIGxpbmVfcHRyKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoISBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LAorCQkJCQkgICAgICZmb3VuZCwgZmlsZW5hbWVfcHRyLAorCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyLAorCQkJCQkgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5saW5lX2luZm8pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGZvdW5kKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChzeW1ib2xzID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZpbGVuYW1lID0gTlVMTDsKKyAgZnVuYyA9IE5VTEw7CisgIGxvd19mdW5jID0gMDsKKworICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCisgICAgeworICAgICAgZWxmX3N5bWJvbF90eXBlICpxOworCisgICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKKworICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKKwljb250aW51ZTsKKworICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKKwl7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCWNhc2UgU1RUX0ZJTEU6CisJICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOworCSAgYnJlYWs7CisJY2FzZSBTVFRfTk9UWVBFOgorCWNhc2UgU1RUX0ZVTkM6CisJICBpZiAocS0+c3ltYm9sLnNlY3Rpb24gPT0gc2VjdGlvbgorCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuYworCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCisJICAgIHsKKwkgICAgICBmdW5jID0gKGFzeW1ib2wgKikgcTsKKwkgICAgICBsb3dfZnVuYyA9IHEtPnN5bWJvbC52YWx1ZTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoZnVuYyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAqZmlsZW5hbWVfcHRyID0gZmlsZW5hbWU7CisgICpmdW5jdGlvbm5hbWVfcHRyID0gYmZkX2FzeW1ib2xfbmFtZSAoZnVuYyk7CisgICpsaW5lX3B0ciA9IDA7CisgIHJldHVybiB0cnVlOworfQorCitpbnQKK19iZmRfZWxmX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIHJlbG9jOworeworICBpbnQgcmV0OworCisgIHJldCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2VoZHI7CisgIGlmICghIHJlbG9jKQorICAgIHJldCArPSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSAoYWJmZCk7CisgIHJldHVybiByZXQ7Cit9CisKK2Jvb2xlYW4KK19iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOworCisgIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4KKyAgICAgICYmICEgX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zCisgICAgICAoYWJmZCwgKHN0cnVjdCBiZmRfbGlua19pbmZvICopIE5VTEwpKQorICAgIHJldHVybiBmYWxzZTsKKworICBoZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQgKyBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkCitfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Cit7CisgIGFib3J0ICgpOworfQorCisjaWYgMAordm9pZAorX2JmZF9lbGZfbm9faW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OworeworICBhYm9ydCAoKTsKK30KKyNlbmRpZgorCisvKiBUcnkgdG8gY29udmVydCBhIG5vbi1FTEYgcmVsb2MgaW50byBhbiBFTEYgb25lLiAgKi8KKworYm9vbGVhbgorX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIGFyZWxvYykKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICphcmVsb2M7Cit7CisgIC8qIENoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IGhhdmUgYW4gRUxGIGhvd3RvLiAqLworCisgIGlmICgoKmFyZWxvYy0+c3ltX3B0cl9wdHIpLT50aGVfYmZkLT54dmVjICE9IGFiZmQtPnh2ZWMpCisgICAgeworICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKworICAgICAgLyogQWxpZW4gcmVsb2M6IFRyeSB0byBkZXRlcm1pbmUgaXRzIHR5cGUgdG8gcmVwbGFjZSBpdCB3aXRoIGFuCisJIGVxdWl2YWxlbnQgRUxGIHJlbG9jLiAqLworCisgICAgICBpZiAoYXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpCisJeworCSAgc3dpdGNoIChhcmVsb2MtPmhvd3RvLT5iaXRzaXplKQorCSAgICB7CisJICAgIGNhc2UgODoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMTI6CisJICAgICAgY29kZSA9IEJGRF9SRUxPQ18xMl9QQ1JFTDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxNjoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDI0OgorCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMjRfUENSRUw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMzI6CisJICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSA2NDoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzY0X1BDUkVMOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGdvdG8gZmFpbDsKKwkgICAgfQorCisJICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSk7CisKKwkgIGlmIChhcmVsb2MtPmhvd3RvLT5wY3JlbF9vZmZzZXQgIT0gaG93dG8tPnBjcmVsX29mZnNldCkKKwkgICAgeworCSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQorCQlhcmVsb2MtPmFkZGVuZCArPSBhcmVsb2MtPmFkZHJlc3M7CisJICAgICAgZWxzZQorCQlhcmVsb2MtPmFkZGVuZCAtPSBhcmVsb2MtPmFkZHJlc3M7IC8qIGFkZGVuZCBpcyB1bnNpZ25lZCEhICovCisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChhcmVsb2MtPmhvd3RvLT5iaXRzaXplKQorCSAgICB7CisJICAgIGNhc2UgODoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzg7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMTQ6CisJICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxNjoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE2OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDI2OgorCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMjY7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMzI6CisJICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSA2NDoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzY0OworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGdvdG8gZmFpbDsKKwkgICAgfQorCisJICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSk7CisJfQorCisgICAgICBpZiAoaG93dG8pCisJYXJlbG9jLT5ob3d0byA9IGhvd3RvOworICAgICAgZWxzZQorCWdvdG8gZmFpbDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7CisKKyBmYWlsOgorICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKyAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAlcyIpLAorICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYXJlbG9jLT5ob3d0by0+bmFtZSk7CisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2xlYW4KK19iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKKyAgICB7CisgICAgICBpZiAoZWxmX3Noc3RydGFiIChhYmZkKSAhPSBOVUxMKQorCV9iZmRfc3RyaW5ndGFiX2ZyZWUgKGVsZl9zaHN0cnRhYiAoYWJmZCkpOworICAgIH0KKworICByZXR1cm4gX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKTsKK30KKworLyogRm9yIFJlbCB0YXJnZXRzLCB3ZSBlbmNvZGUgbWVhbmluZ2Z1bCBkYXRhIGZvciBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZCisgICBpbiB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4gIFRodXMgd2UgY2Fubm90IGFsbG93IGFueSBzb3J0IG9mIHNhbml0eQorICAgcmFuZ2UtY2hlY2tpbmcgdG8gaW50ZXJmZXJlLiAgVGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvIGluIHByb2Nlc3NpbmcKKyAgIHRoaXMgcmVsb2MuICAqLworCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK19iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gKGFiZmQsIHJlLCBzeW1ib2wsIGRhdGEsIGlzLCBvYmZkLCBlcnJtc2cpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmU7CisgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppczsKKyAgICAgYmZkICpvYmZkOworICAgICBjaGFyICoqZXJybXNnOworeworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisMCisvKiBFbGYgY29yZSBmaWxlIHN1cHBvcnQuICBNdWNoIG9mIHRoaXMgb25seSB3b3JrcyBvbiBuYXRpdmUKKyAgIHRvb2xjaGFpbnMsIHNpbmNlIHdlIHJlbHkgb24ga25vd2luZyB0aGUKKyAgIG1hY2hpbmUtZGVwZW5kZW50IHByb2NmcyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gcGljaworICAgb3V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcmVmaWxlLiAqLworCisjaWZkZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKKyMgaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2VuZGlmCisKKworLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQuICovCisKKyNpZm5kZWYgb2Zmc2V0b2YKKyMgZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisKKy8qIEZJWE1FOiB0aGlzIGlzIGtpbmRhIHdyb25nLCBidXQgaXQncyB3aGF0IGdkYiB3YW50cy4gKi8KKworc3RhdGljIGludAorZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkKKyAgICAgYmZkKiBhYmZkOworeworICByZXR1cm4gKChlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkIDw8IDE2KQorCSAgKyAoZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9waWQpKTsKK30KKworCisvKiBJZiB0aGVyZSBpc24ndCBhIHNlY3Rpb24gY2FsbGVkIE5BTUUsIG1ha2Ugb25lLCB1c2luZworICAgZGF0YSBmcm9tIFNFQ1QuICBOb3RlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUgYQorICAgcmVmZXJlbmNlIHRvIE5BTUUsIHNvIHlvdSBzaG91bGRuJ3QgZGVhbGxvY2F0ZSBvcgorICAgb3ZlcndyaXRlIGl0LiAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsIG5hbWUsIHNlY3QpCisgICAgIGJmZCogYWJmZDsKKyAgICAgY2hhciogbmFtZTsKKyAgICAgYXNlY3Rpb24qIHNlY3Q7Cit7CisgIGFzZWN0aW9uKiBzZWN0MjsKKworICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpICE9IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc2VjdDIgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgaWYgKHNlY3QyID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHNlY3QyLT5fcmF3X3NpemUgPSBzZWN0LT5fcmF3X3NpemU7CisgIHNlY3QyLT5maWxlcG9zID0gc2VjdC0+ZmlsZXBvczsKKyAgc2VjdDItPmZsYWdzID0gc2VjdC0+ZmxhZ3M7CisgIHNlY3QyLT5hbGlnbm1lbnRfcG93ZXIgPSBzZWN0LT5hbGlnbm1lbnRfcG93ZXI7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qIHByc3RhdHVzX3QgZXhpc3RzIG9uOgorICAgICBzb2xhcmlzIDIuWzU2N10KKyAgICAgbGludXggMi5bMDFdICsgZ2xpYmMKKyAgICAgdW5peHdhcmUgNC4yCisqLworCisjaWYgZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UKQorc3RhdGljIGJvb2xlYW4KK2VsZmNvcmVfZ3Jva19wcnN0YXR1cyAoYWJmZCwgbm90ZSkKKyAgICAgYmZkKiBhYmZkOworICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKK3sKKyAgcHJzdGF0dXNfdCBwcnN0YXQ7CisgIGNoYXIgYnVmWzEwMF07CisgIGNoYXIqIG5hbWU7CisgIGFzZWN0aW9uKiBzZWN0OworCisgIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChwcnN0YXQpKQorICAgIHJldHVybiB0cnVlOworCisgIG1lbWNweSAoJnByc3RhdCwgbm90ZS0+ZGVzY2RhdGEsIHNpemVvZiAocHJzdGF0KSk7CisKKyAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBwcnN0YXQucHJfY3Vyc2lnOworICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCA9IHByc3RhdC5wcl9waWQ7CisKKyAgLyogcHJfd2hvIGV4aXN0cyBvbjoKKyAgICAgICBzb2xhcmlzIDIuWzU2N10KKyAgICAgICB1bml4d2FyZSA0LjIKKyAgICAgcHJfd2hvIGRvZXNuJ3QgZXhpc3Qgb246CisgICAgICAgbGludXggMi5bMDFdCisgICovCisjaWYgZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UX1BSX1dITykKKyAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9sd3BpZCA9IHByc3RhdC5wcl93aG87CisjZW5kaWYKKworICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAqLworCisgIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7CisgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3RyY3B5IChuYW1lLCBidWYpOworCisgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgaWYgKHNlY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAocHJzdGF0LnByX3JlZyk7CisgIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKHByc3RhdHVzX3QsIHByX3JlZyk7CisgIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKyAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICBpZiAoISBlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWciLCBzZWN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QUlNUQVRVU19UKSAqLworCisKKy8qIFRoZXJlIGlzbid0IGEgY29uc2lzdGVudCBwcmZwcmVnc2V0X3QgYWNyb3NzIHBsYXRmb3JtcywKKyAgIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciwgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRvIHBpY2sgdGhpcworICAgZGF0YSBzdHJ1Y3R1cmUgYXBhcnQuICovCisKK3N0YXRpYyBib29sZWFuCitlbGZjb3JlX2dyb2tfcHJmcHJlZyAoYWJmZCwgbm90ZSkKKyAgICAgYmZkKiBhYmZkOworICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKK3sKKyAgY2hhciBidWZbMTAwXTsKKyAgY2hhciogbmFtZTsKKyAgYXNlY3Rpb24qIHNlY3Q7CisKKyAgLyogTWFrZSBhICIucmVnMi85OTkiIHNlY3Rpb24uICovCisKKyAgc3ByaW50ZiAoYnVmLCAiLnJlZzIvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7CisgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3RyY3B5IChuYW1lLCBidWYpOworCisgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgaWYgKHNlY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHNlY3QtPl9yYXdfc2l6ZSA9IG5vdGUtPmRlc2NzejsKKyAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3M7CisgIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKyAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICBpZiAoISBlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWcyIiwgc2VjdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisjaWYgZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKQorIyBkZWZpbmUgZWxmY29yZV9wc2luZm9fdCBwcnBzaW5mb190CisjZW5kaWYKKworI2lmIGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCisjIGRlZmluZSBlbGZjb3JlX3BzaW5mb190IHBzaW5mb190CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKSB8fCBkZWZpbmVkIChIQVZFX1BTSU5GT19UKQorCisvKiByZXR1cm4gYSBtYWxsb2MnZWQgY29weSBvZiBhIHN0cmluZyBhdCBTVEFSVCB3aGljaCBpcyBhdAorICAgbW9zdCBNQVggYnl0ZXMgbG9uZywgcG9zc2libHkgd2l0aG91dCBhIHRlcm1pbmF0aW5nICdcMCcuCisgICB0aGUgY29weSB3aWxsIGFsd2F5cyBoYXZlIGEgdGVybWluYXRpbmcgJ1wwJy4gKi8KKworc3RhdGljIGNoYXIqCitlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHN0YXJ0LCBtYXgpCisgICAgIGJmZCogYWJmZDsKKyAgICAgY2hhciogc3RhcnQ7CisgICAgIGludCBtYXg7Cit7CisgIGNoYXIqIGR1cDsKKyAgY2hhciogZW5kID0gbWVtY2hyIChzdGFydCwgJ1wwJywgbWF4KTsKKyAgaW50IGxlbjsKKworICBpZiAoZW5kID09IE5VTEwpCisgICAgbGVuID0gbWF4OworICBlbHNlCisgICAgbGVuID0gZW5kIC0gc3RhcnQ7CisKKyAgZHVwID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKKyAgaWYgKGR1cCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG1lbWNweSAoZHVwLCBzdGFydCwgbGVuKTsKKyAgZHVwW2xlbl0gPSAnXDAnOworCisgIHJldHVybiBkdXA7Cit9CisKK3N0YXRpYyBib29sZWFuCitlbGZjb3JlX2dyb2tfcHNpbmZvIChhYmZkLCBub3RlKQorICAgICBiZmQqIGFiZmQ7CisgICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOworeworICBlbGZjb3JlX3BzaW5mb190IHBzaW5mbzsKKworICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAoZWxmY29yZV9wc2luZm9fdCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbWVtY3B5ICgmcHNpbmZvLCBub3RlLT5kZXNjZGF0YSwgbm90ZS0+ZGVzY3N6KTsKKworICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3Byb2dyYW0KKyAgICA9IGVsZmNvcmVfc3RybmR1cCAoYWJmZCwgcHNpbmZvLnByX2ZuYW1lLCBzaXplb2YgKHBzaW5mby5wcl9mbmFtZSkpOworCisgIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZAorICAgID0gZWxmY29yZV9zdHJuZHVwIChhYmZkLCBwc2luZm8ucHJfcHNhcmdzLCBzaXplb2YgKHBzaW5mby5wcl9wc2FyZ3MpKTsKKworICAvKiBOb3RlIHRoYXQgZm9yIHNvbWUgcmVhc29uLCBhIHNwdXJpb3VzIHNwYWNlIGlzIHRhY2tlZAorICAgICBvbnRvIHRoZSBlbmQgb2YgdGhlIGFyZ3MgaW4gc29tZSAoYXQgbGVhc3Qgb25lIGFueXdheSkKKyAgICAgaW1wbGVtZW50YXRpb25zLCBzbyBzdHJpcCBpdCBvZmYgaWYgaXQgZXhpc3RzLiAqLworCisgIHsKKyAgICBjaGFyKiBjb21tYW5kID0gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kOworICAgIGludCBuID0gc3RybGVuIChjb21tYW5kKTsKKworICAgIGlmICgwIDwgbiAmJiBjb21tYW5kW24gLSAxXSA9PSAnICcpCisgICAgICBjb21tYW5kW24gLSAxXSA9ICdcMCc7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpICovCisKKworI2lmIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKQorc3RhdGljIGJvb2xlYW4KK2VsZmNvcmVfZ3Jva19wc3RhdHVzIChhYmZkLCBub3RlKQorICAgICBiZmQqIGFiZmQ7CisgICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOworeworICBwc3RhdHVzX3QgcHN0YXQ7CisKKyAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKHBzdGF0KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtZW1jcHkgKCZwc3RhdCwgbm90ZS0+ZGVzY2RhdGEsIHNpemVvZiAocHN0YXQpKTsKKworICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCA9IHBzdGF0LnByX3BpZDsKKworICAvKiBDb3VsZCBncmFiIHNvbWUgbW9yZSBkZXRhaWxzIGZyb20gdGhlICJyZXByZXNlbnRhdGl2ZSIKKyAgICAgbHdwc3RhdHVzX3QgaW4gcHN0YXQucHJfbHdwLCBidXQgd2UnbGwgY2F0Y2ggaXQgYWxsIGluIGFuCisgICAgIE5UX0xXUFNUQVRVUyBub3RlLCBwcmVzdW1hYmx5LiAqLworCisgIHJldHVybiB0cnVlOworfQorI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKSAqLworCisKKyNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKQorc3RhdGljIGJvb2xlYW4KK2VsZmNvcmVfZ3Jva19sd3BzdGF0dXMgKGFiZmQsIG5vdGUpCisgICAgIGJmZCogYWJmZDsKKyAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Cit7CisgIGx3cHN0YXR1c190IGx3cHN0YXQ7CisgIGNoYXIgYnVmWzEwMF07CisgIGNoYXIqIG5hbWU7CisgIGFzZWN0aW9uKiBzZWN0OworCisgIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChsd3BzdGF0KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtZW1jcHkgKCZsd3BzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChsd3BzdGF0KSk7CisKKyAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9sd3BpZCA9IGx3cHN0YXQucHJfbHdwaWQ7CisgIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfc2lnbmFsID0gbHdwc3RhdC5wcl9jdXJzaWc7CisKKyAgLyogTWFrZSBhICIucmVnLzk5OSIgc2VjdGlvbi4gKi8KKworICBzcHJpbnRmIChidWYsICIucmVnLyVkIiwgZWxmY29yZV9tYWtlX3BpZCAoYWJmZCkpOworICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGJ1ZikgKyAxKTsKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHN0cmNweSAobmFtZSwgYnVmKTsKKworICBzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7CisgIGlmIChzZWN0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUKQorICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7CisgIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zCisgICAgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3MpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX1JFRykKKyAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX3JlZyk7CisgIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zICsgb2Zmc2V0b2YgKGx3cHN0YXR1c190LCBwcl9yZWcpOworI2VuZGlmCisKKyAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOworICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOworCisgIGlmICghZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnIiwgc2VjdCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIE1ha2UgYSAiLnJlZzIvOTk5IiBzZWN0aW9uICovCisKKyAgc3ByaW50ZiAoYnVmLCAiLnJlZzIvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7CisgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3RyY3B5IChuYW1lLCBidWYpOworCisgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgaWYgKHNlY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQpCisgIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmZwcmVncyk7CisgIHNlY3QtPmZpbGVwb3MgPSBub3RlLT5kZXNjcG9zCisgICAgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX2NvbnRleHQudWNfbWNvbnRleHQuZnByZWdzKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVF9QUl9GUFJFRykKKyAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2ZwcmVnKTsKKyAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX2ZwcmVnKTsKKyNlbmRpZgorCisgIHNlY3QtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKyAgc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICBpZiAoIWVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZzIiLCBzZWN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9MV1BTVEFUVVNfVCkgKi8KKworCisKK3N0YXRpYyBib29sZWFuCitlbGZjb3JlX2dyb2tfbm90ZSAoYWJmZCwgbm90ZSkKKyAgICAgYmZkKiBhYmZkOworICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKK3sKKyAgc3dpdGNoIChub3RlLT50eXBlKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisKKyNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpCisgICAgY2FzZSBOVF9QUlNUQVRVUzoKKyAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHJzdGF0dXMgKGFiZmQsIG5vdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChIQVZFX1BTVEFUVVNfVCkKKyAgICBjYXNlIE5UX1BTVEFUVVM6CisgICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3BzdGF0dXMgKGFiZmQsIG5vdGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKQorICAgIGNhc2UgTlRfTFdQU1RBVFVTOgorICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19sd3BzdGF0dXMgKGFiZmQsIG5vdGUpOworI2VuZGlmCisKKyAgICBjYXNlIE5UX0ZQUkVHU0VUOgkJLyogRklYTUU6IHJlbmFtZSB0byBOVF9QUkZQUkVHICovCisgICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3ByZnByZWcgKGFiZmQsIG5vdGUpOworCisjaWYgZGVmaW5lZCAoSEFWRV9QUlBTSU5GT19UKSB8fCBkZWZpbmVkIChIQVZFX1BTSU5GT19UKQorICAgIGNhc2UgTlRfUFJQU0lORk86CisgICAgY2FzZSBOVF9QU0lORk86CisgICAgICByZXR1cm4gZWxmY29yZV9ncm9rX3BzaW5mbyAoYWJmZCwgbm90ZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKworc3RhdGljIGJvb2xlYW4KK2VsZmNvcmVfcmVhZF9ub3RlcyAoYWJmZCwgb2Zmc2V0LCBzaXplKQorICAgICBiZmQqIGFiZmQ7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBiZmRfdm1hIHNpemU7Cit7CisgIGNoYXIqIGJ1ZjsKKyAgY2hhciogcDsKKworICBpZiAoc2l6ZSA8PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJ1ZiA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHNpemUpOworICBpZiAoYnVmID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiZmRfcmVhZCAoYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKQorICAgIHsKKyAgICBlcnJvcjoKKyAgICAgIGZyZWUgKGJ1Zik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHAgPSBidWY7CisgIHdoaWxlIChwIDwgYnVmICsgc2l6ZSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogYmFkIGFsaWdubWVudCBhc3N1bXB0aW9uLiAqLworICAgICAgRWxmX0V4dGVybmFsX05vdGUqIHhucCA9IChFbGZfRXh0ZXJuYWxfTm90ZSopIHA7CisgICAgICBFbGZfSW50ZXJuYWxfTm90ZSBpbjsKKworICAgICAgaW4udHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+dHlwZSk7CisKKyAgICAgIGluLm5hbWVzeiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+bmFtZXN6KTsKKyAgICAgIGluLm5hbWVkYXRhID0geG5wLT5uYW1lOworCisgICAgICBpbi5kZXNjc3ogPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4bnAtPmRlc2Nzeik7CisgICAgICBpbi5kZXNjZGF0YSA9IGluLm5hbWVkYXRhICsgQkZEX0FMSUdOIChpbi5uYW1lc3osIDQpOworICAgICAgaW4uZGVzY3BvcyA9IG9mZnNldCArIChpbi5kZXNjZGF0YSAtIGJ1Zik7CisKKyAgICAgIGlmICghIGVsZmNvcmVfZ3Jva19ub3RlIChhYmZkLCAmaW4pKQorCWdvdG8gZXJyb3I7CisKKyAgICAgIHAgPSBpbi5kZXNjZGF0YSArIEJGRF9BTElHTiAoaW4uZGVzY3N6LCA0KTsKKyAgICB9CisKKyAgZnJlZSAoYnVmKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworCitib29sZWFuCitfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIHBoZHIsIHNlY19udW0pCisgICAgIGJmZCogYWJmZDsKKyAgICAgRWxmX0ludGVybmFsX1BoZHIqIHBoZHI7CisgICAgIGludCBzZWNfbnVtOworeworICBpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIHBoZHIsIHNlY19udW0pKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAocGhkci0+cF90eXBlID09IFBUX05PVEUKKyAgICAgICYmICEgZWxmY29yZV9yZWFkX25vdGVzIChhYmZkLCBwaGRyLT5wX29mZnNldCwgcGhkci0+cF9maWxlc3opKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWFyYy5jIGIvYmZkL2VsZjMyLWFyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTBhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItYXJjLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvYXJjLmgiCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworc3RhdGljIHZvaWQgYXJjX2luZm9fdG9faG93dG9fcmVsCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7CitzdGF0aWMgYm9vbGVhbiBhcmNfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZCBhcmNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKKworLyogVHJ5IHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2Ygc3BhY2Ugb2NjdXBpZWQgYnkgcmVsb2NhdGlvbiB0YWJsZXMKKyAgIG9uIHRoZSBST00gKG5vdCB0aGF0IHRoZSBST00gd29uJ3QgYmUgc3dhbXBlZCBieSBvdGhlciBFTEYgb3ZlcmhlYWQpLiAgKi8KKyNkZWZpbmUgVVNFX1JFTAorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfYXJjX2hvd3RvX3RhYmxlW10gPQoreworICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCisgIEhPV1RPIChSX0FSQ19OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSQ19OT05FIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfQVJDXzMyLAkJLyogdHlwZSAqLworCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUkNfMzIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsICAgCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMjYgYml0IGFic29sdXRlIGJyYW5jaCwgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KKyAgSE9XVE8gKFJfQVJDX0IyNiwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUkNfQjI2IiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSAyMiBiaXQgYnJhbmNoOyBiaXRzIDIxLTIgYXJlIHN0b3JlZCBpbiBiaXRzIDI2LTcuICAqLworICBIT1dUTyAoUl9BUkNfQjIyX1BDUkVMLAkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyMiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgNywJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJDX0IyMl9QQ1JFTCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDdmZmZmODAsCQkvKiBzcmNfbWFzayAqLworCSAweDA3ZmZmZjgwLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKK307CisKKy8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gQVJDIEVMRiByZWxvYyB0eXBlcy4gICovCisKK3N0cnVjdCBhcmNfcmVsb2NfbWFwCit7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyY19yZWxvY19tYXAgYXJjX3JlbG9jX21hcFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl9BUkNfTk9ORSwgfSwKKyAgeyBCRkRfUkVMT0NfMzIsIFJfQVJDXzMyIH0sCisgIHsgQkZEX1JFTE9DX0NUT1IsIFJfQVJDXzMyIH0sCisgIHsgQkZEX1JFTE9DX0FSQ19CMjYsIFJfQVJDX0IyNiB9LAorICB7IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLCBSX0FSQ19CMjJfUENSRUwgfSwKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2JmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7CisgICAgICAgaSA8IHNpemVvZiAoYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBhcmNfcmVsb2NfbWFwKTsKKyAgICAgICBpKyspCisgICAgeworICAgICAgaWYgKGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQorCXJldHVybiAmZWxmX2FyY19ob3d0b190YWJsZVthcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBBUkMgRUxGIHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK2FyY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKK3sKKyAgdW5zaWduZWQgaW50IHJfdHlwZTsKKworICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKKyAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BUkNfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfYXJjX2hvd3RvX3RhYmxlW3JfdHlwZV07Cit9CisKKy8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFSQyBFTEYgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCithcmNfZWxmX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBtYWNoOworICB1bnNpZ25lZCBsb25nIGFyY2ggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FSQ19NQUNIOworCisgIHN3aXRjaCAoYXJjaCkKKyAgICB7CisgICAgY2FzZSBFX0FSQ19NQUNIX0JBU0U6CisgICAgICBtYWNoID0gYmZkX21hY2hfYXJjX2Jhc2U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogVW5rbm93biBjcHUgdHlwZS4gID8/PyBXaGF0IHRvIGRvPyAgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FyYywgbWFjaCk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGFuIEFSQyBFTEYgb2JqZWN0IGZpbGUuCisgICBUaGlzIGdldHMgdGhlIEFSQyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLiAgKi8KKworc3RhdGljIHZvaWQKK2FyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gbGlua2VyOworeworICBpbnQgbWFjaDsKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgc3dpdGNoIChtYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfbWFjaF9hcmNfYmFzZToKKyAgICAgIHZhbCA9IEVfQVJDX01BQ0hfQkFTRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICAgfQorCisgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9BUkNfTUFDSDsKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOworfQorCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9saXR0bGVhcmNfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbGl0dGxlYXJjIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2JpZ2FyY192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItYmlnYXJjIgorI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYXJjCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0FSQworI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAorCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCTAKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWFyY19pbmZvX3RvX2hvd3RvX3JlbAorI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAlhcmNfZWxmX29iamVjdF9wCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAorCQkJCWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZworCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJtLmggYi9iZmQvZWxmMzItYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlOTdkNgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGYzMi1hcm0uaApAQCAtMCwwICsxLDMwMTAgQEAKKy8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNCisgICBDb3B5cmlnaHQgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgaW5zbjMyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgaW5zbjE2OworCitzdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MKKyAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7CitzdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCisgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorICBQQVJBTVMgKChiZmQgKiwgUFRSKSk7CitzdGF0aWMgaW50IGVsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUgCisgIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOworc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZQorICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyKSk7CisKK3N0YXRpYyBpbnNuMzIgaW5zZXJ0X3RodW1iX2JyYW5jaAorICBQQVJBTVMgKChpbnNuMzIsIGludCkpOworc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX3RodW1iX2dsdWUKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgQ09OU1QgY2hhciAqLCBiZmQgKikpOworc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpmaW5kX2FybV9nbHVlCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKK3N0YXRpYyB2b2lkIHJlY29yZF9hcm1fdG9fdGh1bWJfZ2x1ZQorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgdm9pZCByZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOworCisvKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgorICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KKyAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQorICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCisgKi8KKworI2RlZmluZSBJTlRFUldPUktfRkxBRyggYWJmZCApICAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQorCisjZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCisjZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgorCisjZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKKyNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgorCisvKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCisgICBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgICAgICIvdXNyL2xpYi9sZC5zby4xIgorCisvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworCisjZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2CisKKy8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKKyAgIHRoaXMuICBJdCBpcyBzZXQgdXAgc28gdGhhdCBhbnkgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBpcworICAgY2FsbGVkIGJlZm9yZSB0aGUgcmVsb2NhdGlvbiBoYXMgYmVlbiBzZXQgdXAgY2FsbGVzIHRoZSBkeW5hbWljCisgICBsaW5rZXIgZmlyc3QgKi8KKworc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHQwX2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQoreworICAweDA0LCAweGUwLCAweDJkLCAweGU1LAkvKiBzdHIgICBsciwgW3NwLCAjLTRdISAgICAgKi8KKyAgMHgxMCwgMHhlMCwgMHg5ZiwgMHhlNSwJLyogbGRyICAgbHIsIFtwYywgIzE2XSAgICAgICovCisgIDB4MGUsIDB4ZTAsIDB4OGYsIDB4ZTAsCS8qIGFkciAgIGxyLCBwYywgbHIgICAgICAgICAqLworICAweDA4LCAweGYwLCAweGJlLCAweGU1CS8qIGxkciAgIHBjLCBbbHIsICMtNF0gICAgICAqLworfTsKKworLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCisgICB0aGlzLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHRfZW50cnkgW1BMVF9FTlRSWV9TSVpFXSA9Cit7CisgIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGlwLCBbcGMsICM0XSAgICAgICAqLworICAweDBjLCAweGMwLCAweDhmLCAweGUwLAkvKiBhZGQgICBpcCwgcGMsIGlwICAgICAgICAgKi8KKyAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICAgcGMsIFtpcF0gICAgICAgICAgICovCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAgICAgIC8qIG9mZnNldCB0byBzeW1ib2wgaW4gZ290ICAqLworfTsKKworCisvKiBUaGUgQVJNIGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKKyAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0CisgICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgorICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAorICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCisgICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLworCitzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQKK3sKKyAgLyogTmV4dCBzZWN0aW9uLiAgKi8KKyAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogbmV4dDsKKyAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCisgIGFzZWN0aW9uICogc2VjdGlvbjsKKyAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBjb3VudDsKK307CisKKy8qIGFybSBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLworCitzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OworCisgIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCisgIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHBjcmVsX3JlbG9jc19jb3BpZWQ7Cit9OworCisvKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLworCitzdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMKKyAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisKKy8qIFRyYXZlcnNlIGFuIGFybSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAorICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCisgICAgKGluZm8pKSkKKworLyogR2V0IHRoZSBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgZWxmMzJfYXJtX2hhc2hfdGFibGUoaW5mbykgXAorICAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQorCisvKiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlICovCitzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZQorICB7CisgICAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCisgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKKworICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCisgICAgbG9uZyBpbnQgdGh1bWJfZ2x1ZV9zaXplOworCisgICAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KKyAgICBsb25nIGludCBhcm1fZ2x1ZV9zaXplOworCisgICAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KKyAgICBiZmQgKiBiZmRfb2ZfZ2x1ZV9vd25lcjsKKyAgfTsKKworCisvKiBDcmVhdGUgYW4gQVJNIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAorCQkJCSAgICAgIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXQtPnRodW1iX2dsdWVfc2l6ZSA9IDA7CisgIHJldC0+YXJtX2dsdWVfc2l6ZSA9IDA7CisgIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOworCisgIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCitmaW5kX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgbmFtZSwgaW5wdXRfYmZkKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBiZmQgKmlucHV0X2JmZDsKK3sKKyAgY2hhciAqdG1wX25hbWU7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOworICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKKworICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgYXJtZWxmIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLworICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7CisKKworICB0bXBfbmFtZSA9ICgoY2hhciAqKQorICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSkpOworCisgIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKKworICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7CisKKyAgaGFzaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCisgICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCisgIGlmIChoYXNoID09IE5VTEwpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCisJCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7CisKKyAgZnJlZSAodG1wX25hbWUpOworCisgIHJldHVybiBoYXNoOworfQorCitzdGF0aWMgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKgorZmluZF9hcm1fZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIENPTlNUIGNoYXIgKm5hbWU7CisgICAgIGJmZCAqaW5wdXRfYmZkOworeworICBjaGFyICp0bXBfbmFtZTsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKKyAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7CisKKyAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIGVsZmFybSBzcGVjaWZpYyBoYXNoIHRhYmxlLiAgKi8KKyAgaGFzaF90YWJsZSA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOworCisgIHRtcF9uYW1lID0gKChjaGFyICopCisgICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7CisKKyAgQkZEX0FTU0VSVCAodG1wX25hbWUpOworCisgIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKKworICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAorICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKworICBpZiAobXloID09IE5VTEwpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAorCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOworCisgIGZyZWUgKHRtcF9uYW1lKTsKKworICByZXR1cm4gbXloOworfQorCisvKgorICAgQVJNLT5UaHVtYiBnbHVlOgorCisgICAuYXJtCisgICBfX2Z1bmNfZnJvbV9hcm06CisgICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgorICAgYnggIHIxMgorICAgX19mdW5jX2FkZHI6CisgICAud29yZCBmdW5jICAgIEAgYmVoYXZlIGFzIGlmIHlvdSBzYXcgYSBBUk1fMzIgcmVsb2MKKyAqLworCisjZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKK3N0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiA9IDB4ZTU5ZmMwMDA7CitzdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gPSAweGUxMmZmZjFjOworc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKKworLyoKKyAgIFRodW1iLT5BUk06ICAgICAgICAgICAgICAgICAgICAgICAgICBUaHVtYi0+KG5vbi1pbnRlcndvcmtpbmcgYXdhcmUpIEFSTQorCisgICAudGh1bWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRodW1iCisgICAuYWxpZ24gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduIDIKKyAgIF9fZnVuY19mcm9tX3RodW1iOiAgICAgICAgICAgICAgX19mdW5jX2Zyb21fdGh1bWI6CisgICBieCBwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCB7cjYsIGxyfQorICAgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkciAgcjYsIF9fZnVuY19hZGRyCisgICAuYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YgIGxyLCBwYworICAgX19mdW5jX2NoYW5nZV90b19hcm06ICAgICAgICAgICAgICAgICAgICAgICAgYnggICByNgorICAgYiBmdW5jICAgICAgICAgICAgICAgICAgICAgICAuYXJtCisgICBfX2Z1bmNfYmFja190b190aHVtYjoKKyAgIGxkbWlhIHIxMyEge3I2LCBscn0KKyAgIGJ4ICAgIGxyCisgICBfX2Z1bmNfYWRkcjoKKyAgIC53b3JkICAgICAgICBmdW5jIAorICovCisKKyNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSA4CitzdGF0aWMgY29uc3QgaW5zbjE2IHQyYTFfYnhfcGNfaW5zbiA9IDB4NDc3ODsKK3N0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9ub29wX2luc24gPSAweDQ2YzA7CitzdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuID0gMHhlYTAwMDAwMDsKKworc3RhdGljIGNvbnN0IGluc24xNiB0MmExX3B1c2hfaW5zbiA9IDB4YjU0MDsKK3N0YXRpYyBjb25zdCBpbnNuMTYgdDJhMl9sZHJfaW5zbiA9IDB4NGUwMzsKK3N0YXRpYyBjb25zdCBpbnNuMTYgdDJhM19tb3ZfaW5zbiA9IDB4NDZmZTsKK3N0YXRpYyBjb25zdCBpbnNuMTYgdDJhNF9ieF9pbnNuID0gMHg0NzMwOworc3RhdGljIGNvbnN0IGluc24zMiB0MmE1X3BvcF9pbnNuID0gMHhlOGJkNDA0MDsKK3N0YXRpYyBjb25zdCBpbnNuMzIgdDJhNl9ieF9pbnNuID0gMHhlMTJmZmYxZTsKKworYm9vbGVhbgorYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKGluZm8pCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKK3sKKyAgYXNlY3Rpb24gKiBzOworICBiZmRfYnl0ZSAqIGZvbzsKKyAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKiBnbG9iYWxzOworCisgIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7CisKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKKworICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKKwkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7CisKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKKwkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOworCisgICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplOworICAgICAgcy0+Y29udGVudHMgPSBmb287CisgICAgfQorCisgIGlmIChnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgIT0gMCkKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCisJKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworCisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCisJKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOworCisgICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7CisgICAgICBzLT5jb250ZW50cyA9IGZvbzsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCityZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKK3sKKyAgY29uc3QgY2hhciAqIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworICByZWdpc3RlciBhc2VjdGlvbiAqIHM7CisgIGNoYXIgKiB0bXBfbmFtZTsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBteWg7CisgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKKworICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7CisKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCisgICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOworCisKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICB0bXBfbmFtZSA9ICgoY2hhciAqKQorICAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOworCisgIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKKworICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7CisKKyAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKKyAgICAoJihnbG9iYWxzKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisKKyAgaWYgKG15aCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKHRtcF9uYW1lKTsKKyAgICAgIHJldHVybjsJCQkvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KKyAgICB9CisKKyAgLyogVGhlIG9ubHkgdHJpY2sgaGVyZSBpcyB1c2luZyBoYXNoX3RhYmxlLT5hcm1fZ2x1ZV9zaXplIGFzIHRoZSB2YWx1ZS4gRXZlbgorICAgICB0aG91Z2ggdGhlIHNlY3Rpb24gaXNuJ3QgYWxsb2NhdGVkIHlldCwgdGhpcyBpcyB3aGVyZSB3ZSB3aWxsIGJlIHB1dHRpbmcKKyAgICAgaXQuICAqLworCisgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChsaW5rX2luZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKKwkJCQkgICAgQlNGX0dMT0JBTCwKKwkJCQkgICAgcywgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArIDEsCisJCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAorCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOworCisgIGZyZWUgKHRtcF9uYW1lKTsKKworICBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplICs9IEFSTTJUSFVNQl9HTFVFX1NJWkU7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChsaW5rX2luZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworeworICBjb25zdCBjaGFyICpuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKyAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7CisgIGNoYXIgKnRtcF9uYW1lOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOworICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKKyAgY2hhciBiaW5kOworCisgIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKKworICBCRkRfQVNTRVJUIChoYXNoX3RhYmxlICE9IE5VTEwpOworICBCRkRfQVNTRVJUIChoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKKworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKKyAgICAoaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7CisKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICB0bXBfbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUpICsgMSk7CisKKyAgQkZEX0FTU0VSVCAodG1wX25hbWUpOworCisgIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKKworICBteWggPSBlbGZfbGlua19oYXNoX2xvb2t1cAorICAgICgmKGhhc2hfdGFibGUpLT5yb290LCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKworICBpZiAobXloICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAodG1wX25hbWUpOworICAgICAgcmV0dXJuOwkJCS8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLworICAgIH0KKworICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCisJCQkgICAgIEJTRl9HTE9CQUwsIHMsIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArIDEsCisJCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAorCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOworCisgIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCisgIGJpbmQgPSBFTEZfU1RfQklORCAobXloLT50eXBlKTsKKyAgbXloLT50eXBlID0gRUxGX1NUX0lORk8gKGJpbmQsIFNUVF9BUk1fVEZVTkMpOworCisgIGZyZWUgKHRtcF9uYW1lKTsKKworICAvKiBBbGxvY2F0ZSBhbm90aGVyIHN5bWJvbCB0byBtYXJrIHdoZXJlIHdlIHN3aXRjaCB0byBhcm0gbW9kZS4gICovCisKKyNkZWZpbmUgQ0hBTkdFX1RPX0FSTSAiX18lc19jaGFuZ2VfdG9fYXJtIgorI2RlZmluZSBCQUNLX0ZST01fQVJNICJfXyVzX2JhY2tfZnJvbV9hcm0iCisKKyAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOworCisgIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKKworICBzcHJpbnRmICh0bXBfbmFtZSwgQ0hBTkdFX1RPX0FSTSwgbmFtZSk7CisKKyAgbXloID0gTlVMTDsKKworICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBoYXNoX3RhYmxlLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCisJCQkgICAgICBCU0ZfTE9DQUwsIHMsIGhhc2hfdGFibGUtPnRodW1iX2dsdWVfc2l6ZSArIDQsCisJCQkJICAgIE5VTEwsIHRydWUsIGZhbHNlLAorCQkJCSAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZteWgpOworCisgIGZyZWUgKHRtcF9uYW1lKTsKKworICBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKz0gVEhVTUIyQVJNX0dMVUVfU0laRTsKKworICByZXR1cm47Cit9CisKKy8qIFNlbGVjdCBhIEJGRCB0byBiZSB1c2VkIHRvIGhvbGQgdGhlIHNlY3Rpb25zIHVzZWQgYnkgdGhlIGdsdWUgY29kZS4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGxpbmtlciBzY3JpcHRzIGluIGxkL2VtdWx0ZW1wbC8KKyAgIHthcm1lbGYvcGV9LmVtICAqLworYm9vbGVhbgorYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOworICBmbGFnd29yZCBmbGFnczsKKyAgYXNlY3Rpb24gKnNlYzsKKworICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKKyAgICAgZ2V0dGluZyBhIGJmZCB0byBob2xkIHRoZSBnbHVlLiAgKi8KKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOworCisgIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7CisKKyAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7CisKKyAgaWYgKHNlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKKworICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKKworICAgICAgaWYgKHNlYyA9PSBOVUxMCisJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQorCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKKworICBpZiAoc2VjID09IE5VTEwpCisgICAgeworICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOworCisgICAgICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOworCisgICAgICBpZiAoc2VjID09IE5VTEwKKwkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCisJICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFNhdmUgdGhlIGJmZCBmb3IgbGF0ZXIgdXNlLiAgKi8KKyAgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOworCisgIHJldHVybiB0cnVlOworfQorCitib29sZWFuCitiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGFiZmQsIGxpbmtfaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOworICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOworICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKKworICBhc2VjdGlvbiAqc2VjOworICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKKworICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKKyAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KKyAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKKyAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLworCisgIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKKworICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOworICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKKworICAvKiBSdW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSBnbHVlIHZlY3RvcnMuICAqLworICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKKworICBpZiAoc2VjID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yICg7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCisgICAgeworICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICAgICAgLyogTG9hZCB0aGUgcmVsb2NzLiAgKi8KKworICAgICAgaXJlbCA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYywgKFBUUikgTlVMTCwKKwkJCQkJKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7CisKKyAgICAgIEJGRF9BU1NFUlQgKGlyZWwgIT0gMCk7CisKKyAgICAgIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKKyAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorCXsKKwkgIGxvbmcgcl90eXBlOworCSAgdW5zaWduZWQgbG9uZyByX2luZGV4OworCSAgdW5zaWduZWQgY2hhciBjb2RlOworCisJICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pOworCSAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOworCisJICAvKiBUaGVzZSBhcmUgdGhlIG9ubHkgcmVsb2NhdGlvbiB0eXBlcyB3ZSBjYXJlIGFib3V0ICovCisJICBpZiAocl90eXBlICE9IFJfQVJNX1BDMjQKKwkgICAgICAmJiByX3R5cGUgIT0gUl9BUk1fVEhNX1BDMjIpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLworCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KKwkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKKwkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisJCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOworCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOworCisJCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCisJCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkgICAgfQorCisJICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCisJICBpZiAoZXh0c3ltcyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCisJICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCisJCWV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KKwkJICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCSAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfc2l6ZSkpOworCQkgIGlmIChleHRzeW1zID09IE5VTEwpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOworCQkgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCisJCQkgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkgICAgfQorCisJICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBub3QgYWdhaW5zdCBhIHN5bWJvbCBpdCBjYW5ub3QgY29uY2VybiB1cy4gKi8KKworCSAgaCA9IE5VTEw7CisKKwkgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgbG9jYWwgc3ltYm9scyAqLworCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICBjb250aW51ZTsKKworCSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgKi8KKwkgIHJfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKKwkgICAgZWxmX3N5bV9oYXNoZXMgKGFiZmQpW3JfaW5kZXhdOworCisJICAvKiBJZiB0aGUgcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGEgc3RhdGljIHN5bWJvbCBpdCBtdXN0IGJlIHdpdGhpbgorCSAgICAgdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgc28gY2Fubm90IGJlIGEgY3Jvc3MgQVJNL1RodW1iIHJlbG9jYXRpb24uICAqLworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgIHN3aXRjaCAocl90eXBlKQorCSAgICB7CisJICAgIGNhc2UgUl9BUk1fUEMyNDoKKwkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSBhcm0gY29kZS4gIFdlIG5lZWQgdG8gbG9vayB1cAorCSAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQorCSAgICAgICAgIGluc2VydCBnbHVlLiAgKi8KKworCSAgICAgIGlmIChFTEZfU1RfVFlQRShoLT50eXBlKSA9PSBTVFRfQVJNX1RGVU5DKQorCQlyZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGxpbmtfaW5mbywgaCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKKwkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSB0aHVtYiBjb2RlLiAgV2UgbG9vayAKKwkgICAgICAgICB1cCB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBub3QgYSB0aHVtYgorICAgICAgICAgICAgICAgICB0YXJnZXQsIHdlIGluc2VydCBnbHVlLiAqLyAKKworCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoaC0+dHlwZSkgIT0gU1RUX0FSTV9URlVOQykKKwkJcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlIChsaW5rX2luZm8sIGgpOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworZXJyb3JfcmV0dXJuOgorICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7CisgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX2V4dHN5bXMpOworICByZXR1cm4gZmFsc2U7CisKK30KKworLyogVGhlIHRodW1iIGZvcm0gb2YgYSBsb25nIGJyYW5jaCBpcyBhIGJpdCBmaW5pY2t5LCBiZWNhdXNlIHRoZSBvZmZzZXQKKyAgIGVuY29kaW5nIGlzIHNwbGl0IG92ZXIgdHdvIGZpZWxkcywgZWFjaCBpbiBpdCdzIG93biBpbnN0cnVjdGlvbi4gVGhleQorICAgY2FuIG9jY3VyIGluIGFueSBvcmRlci4gU28gZ2l2ZW4gYSB0aHVtYiBmb3JtIG9mIGxvbmcgYnJhbmNoLCBhbmQgYW4gCisgICBvZmZzZXQsIGluc2VydCB0aGUgb2Zmc2V0IGludG8gdGhlIHRodW1iIGJyYW5jaCBhbmQgcmV0dXJuIGZpbmlzaGVkCisgICBpbnN0cnVjdGlvbi4gCisKKyAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMgCisgICAxMSBiaXRzIHRvIGludmVzdC4gVGhlIHVwcGVyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiBvbmUgKGlkZW50aWZlZCBieQorICAgSC0wLi4gc2VlIGJlbG93KSwgdGhlIGxvd2VyIDExIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgb3RoZXIgKGlkZW50aWZpZWQgCisgICBieSBILTEpLiAKKworICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kIAorICAgdGhlcmUgeW91IGhhdmUgaXQuCisKKyAgIE9wOiAxMTExID0gRiwKKyAgIEgtMCwgdXBwZXIgYWRkcmVzcy0wID0gMDAwCisgICBPcDogMTExMSA9IEYsCisgICBILTEsIGxvd2VyIGFkZHJlc3MtMCA9IDgwMAorCisgICBUaGV5IGNhbiBiZSBvcmRlcmVkIGVpdGhlciB3YXksIGJ1dCB0aGUgYXJtIHRvb2xzIEkndmUgc2VlbiBhbHdheXMgcHV0IAorICAgdGhlIGxvd2VyIG9uZSBmaXJzdC4gSXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuIGtya0BjeWdudXMuY29tCisKKyAgIFhYWDogIEFjdHVhbGx5IHRoZSBvcmRlciBkb2VzIG1hdHRlci4gIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKEgtMSkKKyAgIG1vdmVzIHRoZSBjb21wdXRlZCBhZGRyZXNzIGludG8gdGhlIFBDLCBzbyBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgb25lCisgICBpbiB0aGUgc2VxdWVuY2UuICBUaGUgcHJvYmxlbSwgaG93ZXZlciBpcyB0aGF0IHdoaWxzdCBsaXR0bGUgZW5kaWFuIGNvZGUKKyAgIHN0b3JlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIEhJIHRoZW4gTE9XIG9yZGVyLCBiaWcgZW5kaWFuIGNvZGUgZG9lcyB0aGUKKyAgIHJldmVyc2UuICBuaWNrY0BjeWdudXMuY29tICAqLworCisjZGVmaW5lIExPV19ISV9PUkRFUiAweEY4MDBGMDAwCisjZGVmaW5lIEhJX0xPV19PUkRFUiAweEYwMDBGODAwCisKK3N0YXRpYyBpbnNuMzIKK2luc2VydF90aHVtYl9icmFuY2ggKGJyX2luc24sIHJlbF9vZmYpCisgICAgIGluc24zMiBicl9pbnNuOworICAgICBpbnQgcmVsX29mZjsKK3sKKyAgdW5zaWduZWQgaW50IGxvd19iaXRzOworICB1bnNpZ25lZCBpbnQgaGlnaF9iaXRzOworCisKKyAgQkZEX0FTU0VSVCAoKHJlbF9vZmYgJiAxKSAhPSAxKTsKKworICByZWxfb2ZmID4+PSAxOwkJLyogaGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLworICBsb3dfYml0cyA9IHJlbF9vZmYgJiAweDAwMDAwN0ZGOwkvKiB0aGUgYm90dG9tIDExIGJpdHMgKi8KKyAgaGlnaF9iaXRzID0gKHJlbF9vZmYgPj4gMTEpICYgMHgwMDAwMDdGRjsJLyogdGhlIHRvcCAxMSBiaXRzICovCisKKyAgaWYgKChicl9pbnNuICYgTE9XX0hJX09SREVSKSA9PSBMT1dfSElfT1JERVIpCisgICAgYnJfaW5zbiA9IExPV19ISV9PUkRFUiB8IChsb3dfYml0cyA8PCAxNikgfCBoaWdoX2JpdHM7CisgIGVsc2UgaWYgKChicl9pbnNuICYgSElfTE9XX09SREVSKSA9PSBISV9MT1dfT1JERVIpCisgICAgYnJfaW5zbiA9IEhJX0xPV19PUkRFUiB8IChoaWdoX2JpdHMgPDwgMTYpIHwgbG93X2JpdHM7CisgIGVsc2UKKyAgICBhYm9ydCAoKTsJCQkvKiBlcnJvciAtIG5vdCBhIHZhbGlkIGJyYW5jaCBpbnN0cnVjdGlvbiBmb3JtICovCisKKyAgLyogRklYTUU6IGFib3J0IGlzIHByb2JhYmx5IG5vdCB0aGUgcmlnaHQgY2FsbC4ga3JrQGN5Z251cy5jb20gKi8KKworICByZXR1cm4gYnJfaW5zbjsKK30KKworLyogVGh1bWIgY29kZSBjYWxsaW5nIGFuIEFSTSBmdW5jdGlvbiAqLworc3RhdGljIGludAorZWxmMzJfdGh1bWJfdG9fYXJtX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqaGl0X2RhdGE7CisgICAgIGFzZWN0aW9uICpzeW1fc2VjOworICAgICBpbnQgb2Zmc2V0OworICAgICBpbnQgYWRkZW5kOworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgYXNlY3Rpb24gKnMgPSAwOworICBsb25nIGludCBteV9vZmZzZXQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IHRtcDsKKyAgbG9uZyBpbnQgcmV0X29mZnNldDsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKKyAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmdsb2JhbHM7CisKKyAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOworICBpZiAobXloID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7CisKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKKyAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7CisKKyAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCisJCQkgICAgICAgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKKworICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKKyAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7CisKKyAgaWYgKChteV9vZmZzZXQgJiAweDAxKSA9PSAweDAxKQorICAgIHsKKyAgICAgIGlmIChzeW1fc2VjICE9IE5VTEwKKwkgICYmIHN5bV9zZWMtPm93bmVyICE9IE5VTEwKKwkgICYmICFJTlRFUldPUktfRkxBRyAoc3ltX3NlYy0+b3duZXIpKQorCXsKKwkgIF9iZmRfZXJyb3JfaGFuZGxlcgorCSAgICAoXyAoIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc3ltX3NlYy0+b3duZXIpLCBuYW1lKTsKKwkgIF9iZmRfZXJyb3JfaGFuZGxlcgorCSAgICAoXyAoIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKKworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLS1teV9vZmZzZXQ7CisgICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7CisKKyAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTFfYnhfcGNfaW5zbiwKKwkJICBzLT5jb250ZW50cyArIG15X29mZnNldCk7CisKKyAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTJfbm9vcF9pbnNuLAorCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7CisKKyAgICAgIHJldF9vZmZzZXQgPQorCSgoYmZkX3NpZ25lZF92bWEpIHZhbCkJLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBvZiB0aGUgc3R1YiAqLworCS0gKChiZmRfc2lnbmVkX3ZtYSkKKwkgICAocy0+b3V0cHV0X29mZnNldAkvKiBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KKwkgICAgKyBteV9vZmZzZXQJCS8qIE9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBzdHViIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCisJICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSkJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCisJICAgKyA0CQkJLyogVGhlIGJyYW5jaCBpbnN0cnVjdGlvbiBpcyA0IGJ5dGVzIGludG8gdGhlIHN0dWIuICAqLworCSAgICsgOCk7CQkvKiBBUk0gYnJhbmNoZXMgd29yayBmcm9tIHRoZSBwYyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKyA4LiAgKi8KKworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICB0MmEzX2JfaW5zbiB8ICgocmV0X29mZnNldCA+PiAyKSAmIDB4MDBGRkZGRkYpLAorCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7CisgICAgfQorCisgIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUpOworCisgIC8qIE5vdyBnbyBiYWNrIGFuZCBmaXggdXAgdGhlIG9yaWdpbmFsIEJMIGluc24gdG8gcG9pbnQKKyAgICAgdG8gaGVyZS4gICovCisgIHJldF9vZmZzZXQgPQorICAgIHMtPm91dHB1dF9vZmZzZXQKKyAgICArIG15X29mZnNldAorICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKyAgICAgICArIG9mZnNldCArIGFkZGVuZCkKKyAgICAtIDQ7CisKKyAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YQorCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJICAgICAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKKwkgICAgICBoaXRfZGF0YSAtIGlucHV0X3NlY3Rpb24tPnZtYSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLworc3RhdGljIGludAorZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSBoaXRfZGF0YSwgc3ltX3NlYywgb2Zmc2V0LCBhZGRlbmQsIHZhbCkKKworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpoaXRfZGF0YTsKKyAgICAgYXNlY3Rpb24gKnN5bV9zZWM7CisgICAgIGludCBvZmZzZXQ7CisgICAgIGludCBhZGRlbmQ7CisgICAgIGJmZF92bWEgdmFsOworeworICB1bnNpZ25lZCBsb25nIGludCB0bXA7CisgIGxvbmcgaW50IG15X29mZnNldDsKKyAgYXNlY3Rpb24gKnM7CisgIGxvbmcgaW50IHJldF9vZmZzZXQ7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7CisgIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOworCisgIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7CisgIGlmIChteWggPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKKworICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOworICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKKworICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7CisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsCisJCQkgICAgICAgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7CisgIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOworCisgIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKKyAgICB7CisgICAgICBpZiAoc3ltX3NlYyAhPSBOVUxMCisJICAmJiBzeW1fc2VjLT5vd25lciAhPSBOVUxMCisJICAmJiAhSU5URVJXT1JLX0ZMQUcgKHN5bV9zZWMtPm93bmVyKSkKKwl7CisJICBfYmZkX2Vycm9yX2hhbmRsZXIKKwkgICAgKF8gKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9zZWMtPm93bmVyKSwgbmFtZSk7CisJICBfYmZkX2Vycm9yX2hhbmRsZXIKKwkgICAgKF8gKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7CisJfQorICAgICAgLS1teV9vZmZzZXQ7CisgICAgICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7CisKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDFfbGRyX2luc24sCisJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOworCisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQyX2J4X3IxMl9pbnNuLAorCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNCk7CisKKyAgICAgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbCB8IGEydDNfZnVuY19hZGRyX2luc24sCisJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKKyAgICB9CisKKyAgQkZEX0FTU0VSVCAobXlfb2Zmc2V0IDw9IGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOworCisgIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOworICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOworCisgIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLworICByZXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldAorICAgICsgbXlfb2Zmc2V0CisgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisgICAgLSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAorICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorICAgICAgICsgb2Zmc2V0ICsgYWRkZW5kKQorICAgIC0gODsKKworICB0bXAgPSB0bXAgfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKTsKKworICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB0bXAsIGhpdF9kYXRhCisJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOworCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2VsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAorCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWwsIHZhbHVlLAorCQkJICAgICAgIGluZm8sIHN5bV9zZWMsIHN5bV9uYW1lLCBzeW1fZmxhZ3MpCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgaG93dG87CisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOworICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWw7CisgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgdmFsdWU7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBzeW1fc2VjOworICAgICBjb25zdCBjaGFyICogICAgICAgICAgIHN5bV9uYW1lOworICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIHN5bV9mbGFnczsKK3sKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgcl90eXBlID0gaG93dG8tPnR5cGU7CisgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIHJfc3ltbmR4OworICBiZmRfYnl0ZSAqICAgICAgICAgICAgICAgICAgICBoaXRfZGF0YSA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldDsKKyAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgZHlub2JqID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSAqICAgICAgICAgICAgICAgICAgICAgbG9jYWxfZ290X29mZnNldHM7CisgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNnb3QgPSBOVUxMOworICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzcGx0ID0gTlVMTDsKKyAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc3JlbG9jID0gTlVMTDsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiAgaCA9IE5VTEw7CisgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKKyAgICAKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIGlmIChkeW5vYmopCisgICAgeworICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICB9CisgIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOworICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKKyAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCisjaWZkZWYgVVNFX1JFTAorICBhZGRlbmQgPSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2spOworI2Vsc2UKKyAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKyNlbmRpZgorICAKKyAgc3dpdGNoIChyX3R5cGUpCisgICAgeworICAgIGNhc2UgUl9BUk1fTk9ORToKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfQVJNX1BDMjQ6CisgICAgY2FzZSBSX0FSTV9BQlMzMjoKKyAgICBjYXNlIFJfQVJNX1JFTDMyOgorICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGNvcGllZAorCSBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4gdGltZS4gKi8KKyAgICAgIAorICAgICAgaWYgKGluZm8tPnNoYXJlZAorCSAgJiYgKHJfdHlwZSAhPSBSX0FSTV9QQzI0CisgCSAgICAgIHx8IChoICE9IE5VTEwKKwkgICAgICAgICAgJiYgaC0+ZHluaW5keCAhPSAtMQorCQkgICYmICghIGluZm8tPnN5bWJvbGljCisJCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKSkKKwl7CisJICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKKwkgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7CisJICAKKwkgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lOworCSAgICAgIAorCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkgICAgICAoaW5wdXRfYmZkLAorCQkgICAgICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKKwkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKKwkgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKwkgICAgICAKKwkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKKwkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAorCQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pLAorCQkJCSAgICAgbmFtZSArIDQpID09IDApOworCSAgICAgIAorCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOworCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKKwkgICAgfQorCSAgCisJICBza2lwID0gZmFsc2U7CisJICAKKwkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCisJICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfdm1hIG9mZjsKKwkgICAgICAKKwkgICAgICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0CisJCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgJiBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAorCQkgICAgICByZWwtPnJfb2Zmc2V0KSk7CisJICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCisJCXNraXAgPSB0cnVlOworCSAgICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKKwkgICAgfQorCSAgCisJICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJICAKKwkgIGlmIChza2lwKQorCSAgICB7CisJICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKKwkgICAgICByZWxvY2F0ZSA9IGZhbHNlOworCSAgICB9CisJICBlbHNlIGlmIChyX3R5cGUgPT0gUl9BUk1fUEMyNCkKKwkgICAgeworCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKKwkgICAgICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCQlyZWxvY2F0ZSA9IGZhbHNlOworCSAgICAgIGVsc2UKKwkJcmVsb2NhdGUgPSB0cnVlOworCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfQVJNX1BDMjQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoaCA9PSBOVUxMCisJCSAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQorCQl7CisJCSAgcmVsb2NhdGUgPSB0cnVlOworCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfQVJNX1JFTEFUSVZFKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOworCQkgIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJCSAgICByZWxvY2F0ZSA9IGZhbHNlOworCQkgIGVsc2UKKwkJICAgIHJlbG9jYXRlID0gdHJ1ZTsKKwkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9BQlMzMik7CisJCX0KKwkgICAgfQorCSAgCisJICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJICAgICgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQorCQkJCSAgICAgIHNyZWxvYy0+Y29udGVudHMpCisJCQkJICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKKwkgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKKwkgIAorCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8gbm90IHdhbnQgdG8gCisJICAgICBmaWRkbGUgd2l0aCB0aGUgYWRkZW5kLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbAorCSAgICAgdmFsdWUgc28gdGhhdCBpdCBiZWNvbWVzIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICovCisJICBpZiAoISByZWxvY2F0ZSkKKwkgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKwkgIAorCSAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCisJCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKKwkJCQkJICAgKGJmZF92bWEpIDApOworCX0KKyAgICAgIGVsc2Ugc3dpdGNoIChyX3R5cGUpCisJeworCWNhc2UgUl9BUk1fUEMyNDoKKwkgIC8qIEFybSBCL0JMIGluc3RydWN0aW9uICovCisJICAKKwkgIC8qIENoZWNrIGZvciBhcm0gY2FsbGluZyB0aHVtYiBmdW5jdGlvbi4gICovCisJICBpZiAoc3ltX2ZsYWdzID09IFNUVF9BUk1fVEZVTkMpCisJICAgIHsKKwkgICAgICBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiAoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKKwkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsIGFkZGVuZCwgdmFsdWUpOworCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisJICAgIH0KKwkgIAorCSAgdmFsdWUgPSB2YWx1ZSArIGFkZGVuZDsKKwkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyA4KTsKKwkgIHZhbHVlIC09IHJlbC0+cl9vZmZzZXQ7CisJICB2YWx1ZSA9IHZhbHVlID4+IGhvd3RvLT5yaWdodHNoaWZ0OworCSAgCisJICB2YWx1ZSAmPSAweGZmZmZmZjsKKwkgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmYwMDAwMDApOworCSAgYnJlYWs7CisJICAKKwljYXNlIFJfQVJNX0FCUzMyOgorCSAgdmFsdWUgKz0gYWRkZW5kOworCSAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQorCSAgICB2YWx1ZSB8PSAxOworCSAgYnJlYWs7CisJICAKKwljYXNlIFJfQVJNX1JFTDMyOgorCSAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJICB2YWx1ZSArPSBhZGRlbmQ7CisJICBicmVhazsKKwl9CisgICAgICAKKyAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfQVJNX0FCUzg6CisgICAgICB2YWx1ZSArPSBhZGRlbmQ7CisgICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfQVJNX0FCUzE2OgorICAgICAgdmFsdWUgKz0gYWRkZW5kOworCisgICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZmZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMDApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9BUk1fQUJTMTI6CisgICAgICAvKiBTdXBwb3J0IGxkciBhbmQgc3RyIGluc3RydWN0aW9uIGZvciB0aGUgYXJtICovCisgICAgICAvKiBBbHNvIHRodW1iIGIgKHVuY29uZGl0aW9uYWwgYnJhbmNoKS4gID8/PyBSZWFsbHk/ICAqLworICAgICAgdmFsdWUgKz0gYWRkZW5kOworCisgICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHg3ZmYgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIHZhbHVlIHw9IChiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKSAmIDB4ZmZmZmYwMDApOworICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9BUk1fVEhNX0FCUzU6CisgICAgICAvKiBTdXBwb3J0IGxkciBhbmQgc3RyIGluc3RydWN0aW9ucyBmb3IgdGhlIHRodW1iLiAqLworI2lmZGVmIFVTRV9SRUwKKyAgICAgIC8qIE5lZWQgdG8gcmVmZXRjaCBhZGRlbmQuICAqLworICAgICAgYWRkZW5kID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiBob3d0by0+c3JjX21hc2s7CisgICAgICAvKiA/Pz8gTmVlZCB0byBkZXRlcm1pbmUgc2hpZnQgYW1vdW50IGZyb20gb3BlcmFuZCBzaXplLiAgKi8KKyAgICAgIGFkZGVuZCA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7CisjZW5kaWYKKyAgICAgIHZhbHVlICs9IGFkZGVuZDsKKworICAgICAgLyogPz8/IElzbid0IHZhbHVlIHVuc2lnbmVkPyAgKi8KKyAgICAgIGlmICgobG9uZykgdmFsdWUgPiAweDFmIHx8IChsb25nKSB2YWx1ZSA8IC0weDEwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisKKyAgICAgIC8qID8/PyBWYWx1ZSBuZWVkcyB0byBiZSBwcm9wZXJseSBzaGlmdGVkIGludG8gcGxhY2UgZmlyc3QuICAqLworICAgICAgdmFsdWUgfD0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGY4M2Y7CisgICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgICAgY2FzZSBSX0FSTV9USE1fUEMyMjoKKyAgICAgIC8qIFRodW1iIEJMIChicmFuY2ggbG9uZyBpbnN0cnVjdGlvbikuICovCisgICAgICB7CisJYmZkX3ZtYSByZWxvY2F0aW9uOworCWJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKKwliZmRfdm1hIHVwcGVyX2luc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKKwliZmRfdm1hIGxvd2VyX2luc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGhpdF9kYXRhICsgMik7CisJYmZkX3ZtYSBzcmNfbWFzayA9IDB4MDA3RkZGRkU7CisJYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7CisJYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OworCWJmZF92bWEgY2hlY2s7CisJYmZkX3NpZ25lZF92bWEgc2lnbmVkX2NoZWNrOworCWJmZF92bWEgYWRkOworCWJmZF9zaWduZWRfdm1hIHNpZ25lZF9hZGQ7CisKKyNpZmRlZiBVU0VfUkVMCisJLyogTmVlZCB0byByZWZldGNoIHRoZSBhZGRlbmQgYW5kIHNxdWlzaCB0aGUgdHdvIDExIGJpdCBwaWVjZXMKKwkgICB0b2dldGhlci4gICovCisJeworCSAgYmZkX3ZtYSB1cHBlciA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHg3ZmY7CisJICBiZmRfdm1hIGxvd2VyID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSArIDIpICYgMHg3ZmY7CisJICB1cHBlciA9ICh1cHBlciBeIDB4NDAwKSAtIDB4NDAwOyAvKiBzaWduIGV4dGVuZCAqLworCSAgYWRkZW5kID0gKHVwcGVyIDw8IDEyKSB8IChsb3dlciA8PCAxKTsKKwl9CisjZW5kaWYKKworICAgICAgICAvKiBJZiBpdCdzIG5vdCBhIGNhbGwgdG8gdGh1bWIsIGFzc3VtZSBjYWxsIHRvIGFybSAqLworCWlmIChzeW1fZmxhZ3MgIT0gU1RUX0FSTV9URlVOQykKKwkgIHsKKwkgICAgaWYgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViCisJCShpbmZvLCBzeW1fbmFtZSwgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgaGl0X2RhdGEsIHN5bV9zZWMsIHJlbC0+cl9vZmZzZXQsIGFkZGVuZCwgdmFsdWUpKQorCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisJICAgIGVsc2UKKwkgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKKwkgIH0KKworCS8qICs0OiBwYyBpcyBvZmZzZXQgYnkgNCAqLworCXJlbG9jYXRpb24gPSB2YWx1ZSArIGFkZGVuZCArIDQ7CisJcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwlyZWxvY2F0aW9uIC09IHJlbC0+cl9vZmZzZXQ7CisKKwljaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7CisKKwkvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKKwkgICBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCisJaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQorCSAgc2lnbmVkX2NoZWNrID0gY2hlY2s7CisJZWxzZQorCSAgc2lnbmVkX2NoZWNrID0gY2hlY2sgfCB+KChiZmRfdm1hKSAtMSA+PiBob3d0by0+cmlnaHRzaGlmdCk7CisKKwlhZGQgPSAoKHVwcGVyX2luc24gJiAweDdmZikgPDwgMTIpIHwgKChsb3dlcl9pbnNuICYgMHg3ZmYpIDw8IDEpOworCS8qIHNpZ24gZXh0ZW5kICovCisJc2lnbmVkX2FkZCA9IChhZGQgXiAweDQwMDAwMCkgLSAweDQwMDAwMDsKKworCS8qIEFkZCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLworCXNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOworCXJlbG9jYXRpb24gKz0gc2lnbmVkX2FkZDsKKworCS8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCisJaWYgKHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKKwkgICAgfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKKwkgIG92ZXJmbG93ID0gdHJ1ZTsKKworCS8qIFB1dCBSRUxPQ0FUSU9OIGJhY2sgaW50byB0aGUgaW5zbi4gICovCisJdXBwZXJfaW5zbiA9ICh1cHBlcl9pbnNuICYgfihiZmRfdm1hKSAweDdmZikgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpOworCWxvd2VyX2luc24gPSAobG93ZXJfaW5zbiAmIH4oYmZkX3ZtYSkgMHg3ZmYpIHwgKChyZWxvY2F0aW9uID4+IDEpICYgMHg3ZmYpOworCisJLyogUHV0IHRoZSByZWxvY2F0ZWQgdmFsdWUgYmFjayBpbiB0aGUgb2JqZWN0IGZpbGU6ICAqLworCWJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdXBwZXJfaW5zbiwgaGl0X2RhdGEpOworCWJmZF9wdXRfMTYgKGlucHV0X2JmZCwgbG93ZXJfaW5zbiwgaGl0X2RhdGEgKyAyKTsKKworCXJldHVybiAob3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2spOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6CisgICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICBjYXNlIFJfQVJNX0NPUFk6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGNhc2UgUl9BUk1fR0xPQl9EQVQ6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGNhc2UgUl9BUk1fSlVNUF9TTE9UOgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICBjYXNlIFJfQVJNX1JFTEFUSVZFOgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICBjYXNlIFJfQVJNX0dPVE9GRjoKKyAgICAgIC8qIFJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisKKyAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisgICAgICBpZiAoc2dvdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKyAgICAgICAgCisgICAgICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcworICAgICAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCisgICAgICAgICBkZWZpbmUgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcworICAgICAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKKyAgICAgICAgIGNhbGN1bGF0aW9uLiAqLworICAgICAgCisgICAgICB2YWx1ZSAtPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCisgICAgICAJCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKKyAgICAgIAkJCQkgICAgICAgKGJmZF92bWEpIDApOworCisgICAgY2FzZSBSX0FSTV9HT1RQQzoKKyAgICAgIC8qIFVzZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGFzIHN5bWJvbCB2YWx1ZS4gKi8KKworICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKyAgICAgIAorICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICAgIHZhbHVlID0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIAorICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCisgICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKKyAgICAgIAorICAgIGNhc2UgUl9BUk1fR09UMzI6CisgICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCisgICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLworICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKKwlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKyAgICAgIAorICAgICAgaWYgKGggIT0gTlVMTCkKKwl7CisJICBiZmRfdm1hIG9mZjsKKwkgIAorCSAgb2ZmID0gaC0+Z290Lm9mZnNldDsKKwkgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOworCSAgCisJICBpZiAoIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHx8CisJICAgICAgKGluZm8tPnNoYXJlZCAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYyBsaW5rCisJCSBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcworCQkgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKKwkJIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisJCSB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCisJCSAKKwkJIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290IHJlbG9jYXRpb24KKwkJIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lIGluIHRoZSAKKwkJIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAqLworCSAgICAgIAorCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKKwkJb2ZmICY9IH4xOworCSAgICAgIGVsc2UKKwkJeworCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBzZ290LT5jb250ZW50cyArIG9mZik7CisJCSAgaC0+Z290Lm9mZnNldCB8PSAxOworCQl9CisJICAgIH0KKwkgIAorCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZmRfdm1hIG9mZjsKKwkgIAorCSAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTCAmJgorCQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKKwkgIAorCSAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOworCSAgCisJICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZSB0aGUKKwkgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkKKwkgICAgIGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAqLworCSAgaWYgKChvZmYgJiAxKSAhPSAwKQorCSAgICBvZmYgJj0gfjE7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmYpOworCSAgICAgIAorCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCisJCXsKKwkJICBhc2VjdGlvbiAqIHNyZWxnb3Q7CisJCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7CisJCSAgCisJCSAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOworCQkgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7CisJCSAgCisJCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCAKKwkJCQkgICAgICsgb2ZmKTsKKwkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7CisJCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAorCQkJCQkgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCisJCQkJCSAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQorCQkJCQkgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKKwkJICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OworCQl9CisJICAgICAgCisJICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7CisJICAgIH0KKwkgIAorCSAgdmFsdWUgPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOworCX0KKyAgICAgIAorICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgCisgICAgICAJCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKKyAgICAgIAkJCQkgICAgICAgKGJmZF92bWEpIDApOworICAgICAgCisgICAgY2FzZSBSX0FSTV9QTFQzMjoKKyAgICAgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKKyAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKworICAgICAgLyogUmVzb2x2ZSBhIFBMVDMyIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCisgICAgICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gKi8KKyAgICAgIGlmIChoID09IE5VTEwpCisgICAgICAgIHJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisgICAgICAgIAkJCQkgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAorICAgICAgICAJCQkJIChiZmRfdm1hKSAwKTsKKworICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQorICAgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCisgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KKyAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCisJcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKKwkJCQkJIChiZmRfdm1hKSAwKTsKKworICAgICAgQkZEX0FTU0VSVChzcGx0ICE9IE5VTEwpOworICAgICAgaWYgKHNwbHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICAgIHZhbHVlID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0CisJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7CisgICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorICAgICAgICAJCQkgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHZhbHVlLAorICAgICAgICAJCQkgICAgICAgKGJmZF92bWEpIDApOworICAgICAgCisgICAgY2FzZSBSX0FSTV9TQlJFTDMyOgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICBjYXNlIFJfQVJNX0FNUF9WQ0FMTDk6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGNhc2UgUl9BUk1fUlNCUkVMMzI6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGNhc2UgUl9BUk1fVEhNX1JQQzIyOgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICBjYXNlIFJfQVJNX1JSRUwzMjoKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOworCisgICAgY2FzZSBSX0FSTV9SQUJTMzI6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGNhc2UgUl9BUk1fUlBDMjQ6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGNhc2UgUl9BUk1fUkJBU0U6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKyAgICB9Cit9CisKKworLyogUmVsb2NhdGUgYW4gQVJNIEVMRiBzZWN0aW9uLiAgKi8KK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICBpbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICBjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICByZWxvY3M7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgbG9jYWxfc3ltczsKKyAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICBsb2NhbF9zZWN0aW9uczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKKyAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsOworICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQ7CisgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgIG5hbWU7CisKKyAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgaW50IHJfdHlwZTsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOworICAgICAgYXNlY3Rpb24gKiBzZWM7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7CisgICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisKKyAgICAgIGlmIChyX3R5cGUgPT0gUl9BUk1fR05VX1ZURU5UUlkKKyAgICAgICAgICB8fCByX3R5cGUgPT0gUl9BUk1fR05VX1ZUSU5IRVJJVCApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBTY290dEI6IHJhbmdlIGNoZWNrIHJfdHlwZSBoZXJlLiAqLworICAgICAgCisgICAgICBob3d0byA9IGVsZjMyX2FybV9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAorCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisJICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgeworCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCXsKKwkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisjaWZkZWYgVVNFX1JFTAorCQkgIHsKKwkJICAgIGJmZF92bWEgdmFsOworCQkgICAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCQkgICAgdmFsICs9IChzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlKSA+PiBob3d0by0+cmlnaHRzaGlmdDsKKwkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCQkgIH0KKyNlbHNlCisJCSAgcmVsLT5yX2FkZGVuZCArPSAoc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZSkKKwkJICAgID4+IGhvd3RvLT5yaWdodHNoaWZ0OworI2VuZGlmCisJCX0KKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKyAgICAgIGggPSBOVUxMOworICAgICAgc3ltID0gTlVMTDsKKyAgICAgIHNlYyA9IE5VTEw7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkrIHNlYy0+b3V0cHV0X29mZnNldAorCQkJKyBzeW0tPnN0X3ZhbHVlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKwkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOworCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIAorICAgICAgICAgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkgIAkgICAgICAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCSAgICAgIAorCSAgICAgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgorCSAgICAgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcyAKKwkgICAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gKi8KKwkgICAgICBzd2l0Y2ggKHJfdHlwZSkKKwkJeworCSAgICAgICAgY2FzZSBSX0FSTV9QQzI0OgorCSAgICAgICAgY2FzZSBSX0FSTV9BQlMzMjoKKwkgICAgICAgICAgaWYgKGluZm8tPnNoYXJlZAorCSAgICAgICAgICAgICAgJiYgKAorCSAgICAgICAgICAgICAgCSAgKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQorCSAgICAgICAgICAgICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUiA9PSAwKQorCQkJICApCisJICAgICAgICAgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCQkgICAgICApCisJICAgICAgICAgICAgcmVsb2NhdGlvbiA9IDA7CisJCSAgYnJlYWs7CisJCSAgCisJICAgICAgICBjYXNlIFJfQVJNX0dPVFBDOgorCSAgICAgICAgICByZWxvY2F0aW9uID0gMDsKKwkJICBicmVhazsKKwkJICAKKwkgICAgICAgIGNhc2UgUl9BUk1fR09UMzI6CisJICAgICAgICAgIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJICAgICAgICAgICAgICAmJiAoIWluZm8tPnNoYXJlZAorCSAgICAgICAgICAgICAgICAgIHx8ICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkgICAgICAgICAgICAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKKwkJCSAgKQorCQkgICAgICApCisJICAgICAgICAgICAgcmVsb2NhdGlvbiA9IDA7CisJCSAgYnJlYWs7CisJCSAgCisJICAgICAgICBjYXNlIFJfQVJNX1BMVDMyOgorCSAgICAgICAgICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSktMSkKKwkgICAgICAgICAgICByZWxvY2F0aW9uID0gMDsKKwkJICBicmVhazsKKwkJICAKKwkgICAgICAgIGRlZmF1bHQ6CisJCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCQkoXygiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIiksCisJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgaC0+cm9vdC5yb290LnN0cmluZywKKwkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7CisJCSAgICAgIHJlbG9jYXRpb24gPSAwOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChoICE9IE5VTEwpCisJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisgICAgICBlbHNlCisJeworCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCSAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7CisJICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCisJICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJfQorICAgICAgCisgICAgICByID0gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCisJCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLAorCQkJCQkgcmVsb2NhdGlvbiwgaW5mbywgc2VjLCBuYW1lLAorCQkJCQkgKGggPyBFTEZfU1RfVFlQRSAoaC0+dHlwZSkgOgorCQkJCQkgIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pKSk7CisKKyAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKKwl7CisJICBjb25zdCBjaGFyICogbXNnID0gKGNvbnN0IGNoYXIgKikgMDsKKworCSAgc3dpdGNoIChyKQorCSAgICB7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCSAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6CisJICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6CisJICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgorCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKKwkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworCSAgICBjb21tb25fZXJyb3I6CisJICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCisJCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBGdW5jdGlvbiB0byBrZWVwIEFSTSBzcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlci4gKi8KK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGZsYWd3b3JkIGZsYWdzOworeworICBpZiAoZWxmX2ZsYWdzX2luaXQgKGFiZmQpCisgICAgICAmJiBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAhPSBmbGFncykKKyAgICB7CisgICAgICBpZiAoZmxhZ3MgJiBFRl9JTlRFUldPUkspCisJX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAorV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIpLAorCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIGVsc2UKKwlfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCitXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAorCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOworICAgICAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2FybV9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworeworICBmbGFnd29yZCBpbl9mbGFnczsKKyAgZmxhZ3dvcmQgb3V0X2ZsYWdzOworCisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKKworICBpZiAoZWxmX2ZsYWdzX2luaXQgKG9iZmQpICYmIGluX2ZsYWdzICE9IG91dF9mbGFncykKKyAgICB7CisgICAgICAvKiBDYW5ub3QgbWl4IFBJQyBhbmQgbm9uLVBJQyBjb2RlLiAgKi8KKyAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogQ2Fubm90IG1peCBBUENTMjYgYW5kIEFQQ1MzMiBjb2RlLiAgKi8KKyAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTXzI2KSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU18yNikpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBDYW5ub3QgbWl4IGZsb2F0IEFQQ1MgYW5kIG5vbi1mbG9hdCBBUENTIGNvZGUuICAqLworICAgICAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzCisgICAgICAgICB0aGVuIHR1cm4gb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KKyAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9JTlRFUldPUkspICE9IChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspKQorCXsKKwkgIGlmIChvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUkspCisJICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKK1dhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmsgZmxhZyBpbiAlcyBiZWNhdXNlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBsaW5rZWQgd2l0aCBpdCIpLAorCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisJICBpbl9mbGFncyAmPSB+RUZfSU5URVJXT1JLOworCX0KKyAgICB9CisKKyAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKKyAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAorICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICppYmZkOworICAgICBiZmQgKm9iZmQ7Cit7CisgIGZsYWd3b3JkIG91dF9mbGFnczsKKyAgZmxhZ3dvcmQgaW5fZmxhZ3M7CisKKyAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCisgIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCisgICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOCisgICAgICAmJiBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbiIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKKwkgYmZkX2JpZ19lbmRpYW4gKGliZmQpID8gImJpZyIgOiAibGl0dGxlIiwKKwkgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7CisKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBUaGUgaW5wdXQgQkZEIG11c3QgaGF2ZSBoYWQgaXRzIGZsYWdzIGluaXRpYWxpc2VkLiAgKi8KKyAgLyogVGhlIGZvbGxvd2luZyBzZWVtcyBib2d1cyB0byBtZSAtLSBUaGUgZmxhZ3MgYXJlIGluaXRpYWxpemVkIGluCisgICAgIHRoZSBhc3NlbWJsZXIgYnV0IEkgZG9uJ3QgdGhpbmsgYW4gZWxmX2ZsYWdzX2luaXQgZmllbGQgaXMKKyAgICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgKi8KKyAgLyogQkZEX0FTU0VSVCAoZWxmX2ZsYWdzX2luaXQgKGliZmQpKTsgKi8KKworICBpbl9mbGFncyAgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKKyAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7CisKKyAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCisgICAgeworICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAorICAgICAgICAgYm90aGVyIHNldHRpbmcgdGhlIGZsYWdzIGZvciB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSwKKyAgICAgICAgIGluc3RlYWQgYWxsb3cgZnV0dXJlIG1lcmdlcyB0byBkbyB0aGlzLiAgSWYgbm8gZnV0dXJlCisgICAgICAgICBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCisgICAgICAgICB1bml0aWFsaXNlZCB2YWx1ZXMsIHdoaWNoIHN1cnByaXNlIHN1cnByaXNlLCBjb3JyZXNwb25kCisgICAgICAgICB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuICAqLworICAgICAgaWYgKGJmZF9nZXRfYXJjaF9pbmZvIChpYmZkKS0+dGhlX2RlZmF1bHQpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7CisgICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOworCisgICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCisJICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQorCXJldHVybiBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBDaGVjayBmbGFnIGNvbXBhdGliaWxpdHkuICAqLworICBpZiAoaW5fZmxhZ3MgPT0gb3V0X2ZsYWdzKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIENvbXBsYWluIGFib3V0IHZhcmlvdXMgZmxhZyBtaXNtYXRjaGVzLiAgKi8KKworICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU18yNikgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfMjYpKQorICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKK0Vycm9yOiAlcyBjb21waWxlZCBmb3IgQVBDUy0lZCwgd2hlcmVhcyAlcyBpcyBjb21waWxlZCBmb3IgQVBDUy0lZCIpLAorCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCisJCQlpbl9mbGFncyAmIEVGX0FQQ1NfMjYgPyAyNiA6IDMyLAorCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCisJCQlvdXRfZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMik7CisKKyAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSkKKyAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCitFcnJvcjogJXMgcGFzc2VzIGZsb2F0cyBpbiAlcyByZWdpc3RlcnMsIHdoZXJlYXMgJXMgcGFzc2VzIHRoZW0gaW4gJXMgcmVnaXN0ZXJzIiksCisJCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKKwkJICAgICBpbl9mbGFncyAmIEVGX0FQQ1NfRkxPQVQgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIiksCisJCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKKwkJICAgICAgb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IF8gKCJmbG9hdCIpIDogXyAoImludGVnZXIiKSk7CisKKyAgaWYgKChpbl9mbGFncyAmIEVGX1BJQykgIT0gKG91dF9mbGFncyAmIEVGX1BJQykpCisgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAorRXJyb3I6ICVzIGlzIGNvbXBpbGVkIGFzIHBvc2l0aW9uICVzIGNvZGUsIHdoZXJlYXMgJXMgaXMgbm90IiksCisJCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKKwkJICAgIGluX2ZsYWdzICYgRUZfUElDID8gXyAoImluZGVwZW5kZW50IikgOiBfICgiZGVwZW5kZW50IiksCisJCQliZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisKKyAgLyogSW50ZXJ3b3JraW5nIG1pc21hdGNoIGlzIG9ubHkgYSB3YXJuaW5nLiAqLworICBpZiAoKGluX2ZsYWdzICYgRUZfSU5URVJXT1JLKSAhPSAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKSkKKyAgICB7CisgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCitXYXJuaW5nOiAlcyAlcyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgJXMiKSwKKwkJCSAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCisJICBpbl9mbGFncyAmIEVGX0lOVEVSV09SSyA/IF8gKCJzdXBwb3J0cyIpIDogXyAoImRvZXMgbm90IHN1cHBvcnQiKSwKKwkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCisJCSAgICBvdXRfZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgiZG9lcyBub3QiKSA6IF8gKCJkb2VzIikpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBwdHI7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBwdHI7CisKKyAgQkZEX0FTU0VSVCAoYWJmZCAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKTsKKworICAvKiBQcmludCBub3JtYWwgRUxGIHByaXZhdGUgZGF0YS4gICovCisgIF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cik7CisKKyAgLyogSWdub3JlIGluaXQgZmxhZyAtIGl0IG1heSBub3QgYmUgc2V0LCBkZXNwaXRlIHRoZSBmbGFncyBmaWVsZCBjb250YWluaW5nIHZhbGlkIGRhdGEuICAqLworCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIGZwcmludGYgKGZpbGUsIF8gKCJwcml2YXRlIGZsYWdzID0gJWx4OiIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7CisKKyAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBlbmFibGVkXSIpKTsKKyAgZWxzZQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2ludGVyd29ya2luZyBub3QgZW5hYmxlZF0iKSk7CisKKyAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQVBDU18yNikKKyAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtBUENTLTI2XSIpKTsKKyAgZWxzZQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW0FQQ1MtMzJdIikpOworCisgIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FQQ1NfRkxPQVQpCisgICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOworICBlbHNlCisgICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7CisKKyAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfUElDKQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIpKTsKKyAgZWxzZQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Fic29sdXRlIHBvc2l0aW9uXSIpKTsKKworICBmcHV0YyAoJ1xuJywgZmlsZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK2VsZjMyX2FybV9nZXRfc3ltYm9sX3R5cGUgKGVsZl9zeW0sIHR5cGUpCisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBlbGZfc3ltOworICAgICBpbnQgdHlwZTsKK3sKKyAgaWYgKEVMRl9TVF9UWVBFIChlbGZfc3ltLT5zdF9pbmZvKSA9PSBTVFRfQVJNX1RGVU5DKQorICAgIHJldHVybiBFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbyk7CisgIGVsc2UKKyAgICByZXR1cm4gdHlwZTsKK30KKyAgICAKK3N0YXRpYyBhc2VjdGlvbiAqCitlbGYzMl9hcm1fZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKKyAgICAgICBiZmQgKmFiZmQ7CisgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Cit7CisgIGlmIChoICE9IE5VTEwpCisgICAgeworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKKyAgICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisgICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6CisgICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCisgICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKyAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0KKyAgIGVsc2UKKyAgICAgeworICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQorICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisgICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKKyAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7CisgICAgICAgICAgfQorICAgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2FybV9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIGFybWVsZiAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgorICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKKyAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCisgCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87CisgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOworICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgICBkeW5vYmo7CisgIGFzZWN0aW9uICogc2dvdCwgKnNyZWxnb3QsICpzcmVsb2M7CisgIGJmZF92bWEgKiBsb2NhbF9nb3Rfb2Zmc2V0czsKKyAgIAorICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworIAorICBzZ290ID0gc3JlbGdvdCA9IHNyZWxvYyA9IE5VTEw7CisJCQkJICAgCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7CisgIAorICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7CisgIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7CisgIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQorICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87CisgCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworIAorICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKyAgICAgICAgaCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisgCisgICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgICAgICBpZiAoZHlub2JqID09IE5VTEwpCisJeworCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwkgICAgeworCSAgICBjYXNlIFJfQVJNX0dPVDMyOgorCSAgICBjYXNlIFJfQVJNX0dPVE9GRjoKKwkgICAgY2FzZSBSX0FSTV9HT1RQQzoKKwkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7CisJICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKyAgICAgICAgeworCSAgY2FzZSBSX0FSTV9HT1QzMjoKKwkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KKwkgICAgaWYgKHNnb3QgPT0gTlVMTCkKKwkgICAgICB7CisJICAgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgICAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICAgICAgfQorCisJICAgIC8qIEdldCB0aGUgZ290IHJlbG9jYXRpb24gc2VjdGlvbiBpZiBuZWNlc3NhcnkuICAqLworCSAgICBpZiAoc3JlbGdvdCA9PSBOVUxMCisJICAgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCisJICAgICAgeworCSAgICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOworCSAgICAgIAorCSAgICAgICAgLyogSWYgbm8gZ290IHJlbG9jYXRpb24gc2VjdGlvbiwgbWFrZSBvbmUgYW5kIGluaXRpYWxpemUuICAqLworCSAgICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKKwkJICB7CisJCSAgICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKKwkJICAgIGlmIChzcmVsZ290ID09IE5VTEwKKwkJICAgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAorCQkgIAkJCQkgICAgKFNFQ19BTExPQworCQkJCQkJICAgICB8IFNFQ19MT0FECisJCQkJCQkgICAgIHwgU0VDX0hBU19DT05URU5UUworCQkJCQkJICAgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgICAgfCBTRUNfUkVBRE9OTFkpKQorCQkgICAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgIH0KKwkgICAgICB9CisKKwkgICAgaWYgKGggIT0gTlVMTCkKKwkgICAgICB7CisJICAgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisJCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCisJCSAgYnJlYWs7CisJCQorCSAgICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKKworCSAgICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KKwkgICAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQorCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJCSAgICByZXR1cm4gZmFsc2U7CisKKwkgICAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworICAgICAJICAgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbAorICAgICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCisJICAgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKKwkJICB7CisJCSAgICBzaXplX3Qgc2l6ZTsKKwkJICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworCisJCSAgICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3ZtYSk7CisJCSAgICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CisJCSAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOworCQkgICAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKKwkJICAgICAgbG9jYWxfZ290X29mZnNldHNbaV0gPSAoYmZkX3ZtYSkgLTE7CisJCSAgfQorCQkKKwkgICAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQorCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLworCQkgIGJyZWFrOworCisJICAgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7CisKKwkgICAgICAgIGlmIChpbmZvLT5zaGFyZWQpCisJCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCisJCSAgICAgb3V0cHV0IGEgUl9BUk1fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYworCQkgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KKwkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOworCSAgICAgIH0KKworCSAgICBzZ290LT5fcmF3X3NpemUgKz0gNDsKKwkgICAgYnJlYWs7CisKKyAgCSAgY2FzZSBSX0FSTV9QTFQzMjoKKwkgICAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCisgICAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAorICAgICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCisgICAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKKyAgICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQorICAgICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KKworCSAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKKyAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLworCSAgICBpZiAoaCA9PSBOVUxMKQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisJICAgIGJyZWFrOworCisJICBjYXNlIFJfQVJNX0FCUzMyOgorCSAgY2FzZSBSX0FSTV9SRUwzMjoKKwkgIGNhc2UgUl9BUk1fUEMyNDoKKwkgICAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGFuZCB0aGlzIGlzIGEgcmVsb2MKKyAgICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYworICAgICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCisgICAgICAgICAgICAgICBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBsaW5raW5nIHdpdGgKKyAgICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKKyAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCisgICAgICAgICAgICAgICBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCkuICBBdAorICAgICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCisgICAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAorICAgICAgICAgICAgICAgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAorICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLworCSAgICBpZiAoaW5mby0+c2hhcmVkCisJICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfQVJNX1BDMjQKKwkgICAgICAgIHx8IChoICE9IE5VTEwKKwkJICAmJiAoISBpbmZvLT5zeW1ib2xpYworCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQorCSAgICAgIHsKKwkgICAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKKyAgICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCisgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCisJICAgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCSAgeworCQkgICAgY29uc3QgY2hhciAqIG5hbWU7CisKKwkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkJICAgIChhYmZkLAorCQkJICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKKwkJCSAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7CisJCSAgICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisKKwkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAorCQkgCSAgICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKKwkJCQkJICAgbmFtZSArIDQpID09IDApOworCisJCSAgICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKKwkJICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJICAgICAgeworCQkgICAgICAgIGZsYWd3b3JkIGZsYWdzOworCisJCSAgICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKKwkJICAgICAgICBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZCisJCQkgICAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOworCQkgICAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7CisJCSAgICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCisJCQkgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKKwkJCSAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKKwkJCSAgcmV0dXJuIGZhbHNlOworCQkgICAgICB9CisJCSAgfQorCisJICAgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7CisJICAgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCisgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwgc28gdGhhdAorICAgICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgorICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgaXMgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIGVsZl9pMzg2IGxpbmtlcgorICAgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCisgICAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KKwkgICAgICAgIGlmIChoICE9IE5VTEwgJiYgaW5mby0+c3ltYm9saWMKKwkJICAgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfQVJNX1BDMjQpCisJCSAgeworCQkgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBlaDsKKwkJICAgIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHA7CisKKwkJICAgIGVoID0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIGg7CisKKwkJICAgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCQkgICAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCisJCSAgICAgICAgYnJlYWs7CisKKwkJICAgIGlmIChwID09IE5VTEwpCisJCSAgICAgIHsKKwkJICAgICAgICBwID0gKChzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKKwkJCSAgICAgYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAqIHApKTsKKwkJCQorCQkgICAgICAgIGlmIChwID09IE5VTEwpCisJCQkgIHJldHVybiBmYWxzZTsKKwkJICAgICAgICBwLT5uZXh0ID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7CisJCSAgICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOworCQkgICAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7CisJCSAgICAgICAgcC0+Y291bnQgPSAwOworCQkgICAgICB9CisKKwkJICAgICsrcC0+Y291bnQ7CisJCSAgfQorCSAgICAgIH0KKwkgICAgYnJlYWs7CisKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgorICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisgICAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5CisgICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgorICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAKKyAgcmV0dXJuIHRydWU7Cit9CisKKyAgICAgICAKKy8qIEZpbmQgdGhlIG5lYXJlc3QgbGluZSB0byBhIHBhcnRpY3VsYXIgc2VjdGlvbiBhbmQgb2Zmc2V0LCBmb3IgZXJyb3IKKyAgIHJlcG9ydGluZy4gICBUaGlzIGNvZGUgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGNvZGUgaW4gZWxmLmMsIGV4Y2VwdAorICAgdGhhdCBpdCBhbHNvIGFjY2VwdHMgU1RUX0FSTV9URlVOQyBhcyBhIHN5bWJvbCB0aGF0IG5hbWVzIGEgZnVuY3Rpb24uICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fZmluZF9uZWFyZXN0X2xpbmUKKyAgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKKyAgICAgYmZkICogICAgICAgICAgYWJmZDsKKyAgICAgYXNlY3Rpb24gKiAgICAgc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKiAgICAgc3ltYm9sczsKKyAgICAgYmZkX3ZtYSAgICAgICAgb2Zmc2V0OworICAgICBDT05TVCBjaGFyICoqICBmaWxlbmFtZV9wdHI7CisgICAgIENPTlNUIGNoYXIgKiogIGZ1bmN0aW9ubmFtZV9wdHI7CisgICAgIHVuc2lnbmVkIGludCAqIGxpbmVfcHRyOworeworICBib29sZWFuICAgICAgZm91bmQ7CisgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsKKyAgYXN5bWJvbCAqICAgIGZ1bmM7CisgIGJmZF92bWEgICAgICBsb3dfZnVuYzsKKyAgYXN5bWJvbCAqKiAgIHA7CisKKyAgaWYgKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCisJCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIAorCQkJCSAgICAgbGluZV9wdHIpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCisJCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCisJCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCisJCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgaWYgKGZvdW5kKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChzeW1ib2xzID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZpbGVuYW1lID0gTlVMTDsKKyAgZnVuYyA9IE5VTEw7CisgIGxvd19mdW5jID0gMDsKKworICBmb3IgKHAgPSBzeW1ib2xzOyAqcCAhPSBOVUxMOyBwKyspCisgICAgeworICAgICAgZWxmX3N5bWJvbF90eXBlICpxOworCisgICAgICBxID0gKGVsZl9zeW1ib2xfdHlwZSAqKSAqcDsKKworICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoJnEtPnN5bWJvbCkgIT0gc2VjdGlvbikKKwljb250aW51ZTsKKworICAgICAgc3dpdGNoIChFTEZfU1RfVFlQRSAocS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSkKKwl7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCWNhc2UgU1RUX0ZJTEU6CisJICBmaWxlbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCZxLT5zeW1ib2wpOworCSAgYnJlYWs7CisJY2FzZSBTVFRfTk9UWVBFOgorCWNhc2UgU1RUX0ZVTkM6CisJY2FzZSBTVFRfQVJNX1RGVU5DOgorCSAgaWYgKHEtPnN5bWJvbC5zZWN0aW9uID09IHNlY3Rpb24KKwkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPj0gbG93X2Z1bmMKKwkgICAgICAmJiBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KQorCSAgICB7CisJICAgICAgZnVuYyA9IChhc3ltYm9sICopIHE7CisJICAgICAgbG93X2Z1bmMgPSBxLT5zeW1ib2wudmFsdWU7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKmZpbGVuYW1lX3B0ciA9IGZpbGVuYW1lOworICAqZnVuY3Rpb25uYW1lX3B0ciA9IGJmZF9hc3ltYm9sX25hbWUgKGZ1bmMpOworICAqbGluZV9wdHIgPSAwOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQorICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKKyAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KKyAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCisgICB1bmRlcnN0YW5kLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOworeworICBiZmQgKiBkeW5vYmo7CisgIGFzZWN0aW9uICogczsKKyAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAorCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQorCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAorCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCisJCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7CisKKyAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKKyAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCisgICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KKyAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKKyAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCisgICAgeworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMCkKKwl7CisJICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVDMyIHJlbG9jIGluIGFuIGlucHV0CisgICAgICAgICAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYworICAgICAgICAgICAgIG9iamVjdC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkCisgICAgICAgICAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEMzMgorICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLworCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKKwkgZmlyc3QgZW50cnkuICAqLworICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKKwkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCisJIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCisJIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCisJIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisgICAgICBpZiAoISBpbmZvLT5zaGFyZWQKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOworCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKKwl9CisKKyAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7CisKKyAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCisgICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7CisKKyAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAorCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OworCisgICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQorICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKKyAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KKyAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7CisgICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAorICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCisKKyAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQorICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgorICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAorICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KKyAgaWYgKGluZm8tPnNoYXJlZCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAorICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQorICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCisgICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKKyAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKKyAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCisgICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KKyAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQorICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KKworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9BUk1fQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bworICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCisgICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQorICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLworICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisgICAgeworICAgICAgYXNlY3Rpb24gKnNyZWw7CisKKyAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5ic3MiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7CisgICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOworICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKKyAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCisgIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKKyAgaWYgKHBvd2VyX29mX3R3byA+IDMpCisgICAgcG93ZXJfb2ZfdHdvID0gMzsKKworICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KKyAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCisJCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOworICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KKyAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKKyAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKKworICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLworICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKiBvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Cit7CisgIGJmZCAqIGR5bm9iajsKKyAgYXNlY3Rpb24gKiBzOworICBib29sZWFuIHBsdDsKKyAgYm9vbGVhbiByZWxvY3M7CisgIGJvb2xlYW4gcmVsdGV4dDsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KKyAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKKwl7CisJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKKwkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisJICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWwuZ290IHNlY3Rpb24uCisgICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCisgICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsLmdvdCwKKyAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCisgICAgICAgICBiZWxvdy4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7CisgICAgICBpZiAocyAhPSBOVUxMKQorCXMtPl9yYXdfc2l6ZSA9IDA7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwKKyAgICAgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCisgICAgIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZQorICAgICB3aWxsIG5vdCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCisgIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCisgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCSAgZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzLAorCQkJCSAgKFBUUikgTlVMTCk7CisKKyAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCisgICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQorICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLworICBwbHQgPSBmYWxzZTsKKyAgcmVsb2NzID0gZmFsc2U7CisgIHJlbHRleHQgPSBmYWxzZTsKKyAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICAgIGJvb2xlYW4gc3RyaXA7CisKKyAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCisJIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLworICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOworCisgICAgICBzdHJpcCA9IGZhbHNlOworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCisJeworCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCSAgICB7CisJICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCisJICAgICAgc3RyaXAgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KKwkgICAgICBwbHQgPSB0cnVlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQorCXsKKwkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQorCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbC5ic3MgYW5kCisJCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KKwkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCisJCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAorCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKKwkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0CisJCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KKwkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLworCSAgICAgIHN0cmlwID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKiB0YXJnZXQ7CisKKwkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKKyAgICAgICAgICAgICAgICAgdGhhbiAucmVsLnBsdC4gICovCisJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwucGx0IikgIT0gMCkKKwkJeworCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7CisKKwkJICByZWxvY3MgPSB0cnVlOworCisJCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQorCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKKwkJICAgICBlbnRyeS4gIFRoZSBlbnRyaWVzIGluIHRoZSAucmVsLnBsdCBzZWN0aW9uCisJCSAgICAgcmVhbGx5IGFwcGx5IHRvIHRoZSAuZ290IHNlY3Rpb24sIHdoaWNoIHdlCisJCSAgICAgY3JlYXRlZCBvdXJzZWx2ZXMgYW5kIHNvIGtub3cgaXMgbm90IHJlYWRvbmx5LiAgKi8KKwkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCisJCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKKwkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOworCQkgIGlmICh0YXJnZXQgIT0gTlVMTAorCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAorCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJICAgIHJlbHRleHQgPSB0cnVlOworCQl9CisKKwkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCisJCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICAgICAgcy0+cmVsb2NfY291bnQgPSAwOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQorCXsKKwkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmlwKQorCXsKKwkgIGFzZWN0aW9uICoqIHNwcDsKKworCSAgZm9yIChzcHAgPSAmcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uczsKKwkgICAgICAgKnNwcCAhPSBzLT5vdXRwdXRfc2VjdGlvbjsKKwkgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dCkKKwkgICAgOworCSAgKnNwcCA9IHMtPm91dHB1dF9zZWN0aW9uLT5uZXh0OworCSAgLS1zLT5vdXRwdXRfc2VjdGlvbi0+b3duZXItPnNlY3Rpb25fY291bnQ7CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKKwkgdmFsdWVzIGxhdGVyLCBpbiBlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQorCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKKwkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQorCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAocGx0KQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKKwkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUwpCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChyZWxvY3MpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTFNaLCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxFTlQsCisJCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAocmVsdGV4dCkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCisgICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCisgICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZQorICAgZGVmaW5lZCBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlCisgICBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUKKyAgIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKKyAgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBoOworICAgICBQVFIgaWdub3JlOworeworICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBzOworCisgIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KKyAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKKyAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCisgICAgIGJmZCAqIG91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOworICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOworeworICBiZmQgKiBkeW5vYmo7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICogc3BsdDsKKyAgICAgIGFzZWN0aW9uICogc2dvdDsKKyAgICAgIGFzZWN0aW9uICogc3JlbDsKKyAgICAgIGJmZF92bWEgcGx0X2luZGV4OworICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OworICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7CisKKyAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKKwkgaXQgdXAuICAqLworCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKworICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7CisgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7CisKKyAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCisJIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKKwkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCisJIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCisgICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOworCisgICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0CisJIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KKwkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCisgICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LAorICAgICAgICAgICAgICBlbGYzMl9hcm1fcGx0X2VudHJ5LAorCSAgICAgIFBMVF9FTlRSWV9TSVpFKTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgZ290X29mZnNldCAKKwkJICAgICAgIC0gc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICAtIGgtPnBsdC5vZmZzZXQgLSAxMiksCisJCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDEyKTsKKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQpLAorCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7CisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KKyAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAorCQkgICAgICArIGdvdF9vZmZzZXQpOworICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fSlVNUF9TTE9UKTsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKKwkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cworCQkJCSArIHBsdF9pbmRleCkpOworCisgICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQorCXsKKwkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KKwkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLworCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKKwl9CisgICAgfQorCisgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqIHNnb3Q7CisgICAgICBhc2VjdGlvbiAqIHNyZWw7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKKworICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0CisJIHVwLiAgKi8KKyAgICAgIAorICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7CisgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKKworICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCisJIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KKwkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgorCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCisgICAgICBpZiAoaW5mby0+c2hhcmVkCisJICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCisJcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl9BUk1fUkVMQVRJVkUpOworICAgICAgZWxzZQorCXsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOworCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fR0xPQl9EQVQpOworCX0KKworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAorCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCisJCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKKyAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7CisgICAgfQorCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqIHM7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKKworICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KKworICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQorCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAorCQkJCSAgICIucmVsLmJzcyIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgcmVsLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQ09QWSk7CisgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCisJCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgcy0+Y29udGVudHMKKwkJCQkgKyBzLT5yZWxvY19jb3VudCkpOworICAgICAgKytzLT5yZWxvY19jb3VudDsKKyAgICB9CisKKyAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KKyAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAorICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKKyAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2FybV9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICogb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworeworICBiZmQgKiBkeW5vYmo7CisgIGFzZWN0aW9uICogc2dvdDsKKyAgYXNlY3Rpb24gKiBzZHluOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKKyAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKyAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOworCisgICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOworICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOworICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCisJeworCSAgRWxmX0ludGVybmFsX0R5biBkeW47CisJICBjb25zdCBjaGFyICogbmFtZTsKKwkgIGFzZWN0aW9uICogczsKKworCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7CisKKwkgIHN3aXRjaCAoZHluLmRfdGFnKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9QTFRHT1Q6CisJICAgICAgbmFtZSA9ICIuZ290IjsKKwkgICAgICBnb3RvIGdldF92bWE7CisJICAgIGNhc2UgRFRfSk1QUkVMOgorCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOworCSAgICBnZXRfdm1hOgorCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7CisJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfUExUUkVMU1o6CisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKKwkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7CisJICAgICAgZWxzZQorCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfUkVMU1o6CisJICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCisJCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCisJCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCisJCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCisJCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQorCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKKwkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCisJCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CisJCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOworCSAgICAgIGlmIChzICE9IE5VTEwpCisJCXsKKwkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCisJCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7CisJCSAgZWxzZQorCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOworCQl9CisJICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQorCW1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZjMyX2FybV9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7CisKKyAgICAgIC8qIFVuaXhXYXJlIHNldHMgdGhlIGVudHNpemUgb2YgLnBsdCB0byA0LCBhbHRob3VnaCB0aGF0IGRvZXNuJ3QKKwkgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLworICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKKyAgICB9CisKKyAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQorICAgIHsKKyAgICAgIGlmIChzZHluID09IE5VTEwpCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAorCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCisJCSAgICBzZ290LT5jb250ZW50cyk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOworICAgIH0KKworICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OworCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfYXJtCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX0FSTQorI2RlZmluZSBFTEZfTUFYUEFHRV9TSVpFCQkweDgwMDAKKworCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQllbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAJZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZQkgICAgICAgIGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZQorCisjZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgZWxmMzJfYXJtX2NoZWNrX3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAllbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKworI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMQorI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgICAgMQorI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgICAgMQorI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gICAgMAorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDEwdi5jIGIvYmZkL2VsZjMyLWQxMHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTgwYmFlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLWQxMHYuYwpAQCAtMCwwICsxLDUzNCBAQAorLyogRDEwVi1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorLyogI2luY2x1ZGUgImVsZi9kMTB2LmgiICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKK3N0YXRpYyB2b2lkIGQxMHZfaW5mb190b19ob3d0b19yZWwKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKKworCisvKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlICovCisjZGVmaW5lIFVTRV9SRUwKKworZW51bSByZWxvY190eXBlCit7CisgIFJfRDEwVl9OT05FID0gMCwKKyAgUl9EMTBWXzEwX1BDUkVMX1IsCisgIFJfRDEwVl8xMF9QQ1JFTF9MLAorICBSX0QxMFZfMTYsCisgIFJfRDEwVl8xOCwKKyAgUl9EMTBWXzE4X1BDUkVMLAorICBSX0QxMFZfMzIsCisgIFJfRDEwVl9HTlVfVlRJTkhFUklULAorICBSX0QxMFZfR05VX1ZURU5UUlksCisgIFJfRDEwVl9tYXgKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9kMTB2X2hvd3RvX3RhYmxlW10gPQoreworICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCisgIEhPV1RPIChSX0QxMFZfTk9ORSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMTBWX05PTkUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEFuIFBDIFJlbGF0aXZlIDEwLWJpdCByZWxvY2F0aW9uLCBzaGlmdGVkIGJ5IDIgICovCisgIC8qIHJpZ2h0IGNvbnRhaW5lciAqLworICBIT1dUTyAoUl9EMTBWXzEwX1BDUkVMX1IsCS8qIHR5cGUgKi8KKwkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMTBWXzEwX1BDUkVMX1IiLAkvKiBuYW1lICovCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCisJIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBbiBQQyBSZWxhdGl2ZSAxMC1iaXQgcmVsb2NhdGlvbiwgc2hpZnRlZCBieSAyICAqLworICAvKiBsZWZ0IGNvbnRhaW5lciAqLworICBIT1dUTyAoUl9EMTBWXzEwX1BDUkVMX0wsCS8qIHR5cGUgKi8KKwkgMiwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMCwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisJIDE1LAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRDEwVl8xMF9QQ1JFTF9MIiwJLyogbmFtZSAqLworCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDA3ZjgwMDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovCisJIDB4MDdmODAwMCwgICAJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMTYgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KKyAgSE9XVE8gKFJfRDEwVl8xNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QxMFZfMTYiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQW4gMTggYml0IGFic29sdXRlIHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgMiAqLworICBIT1dUTyAoUl9EMTBWXzE4LAkJLyogdHlwZSAqLworCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTgsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRDEwVl8xOCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIgICovCisgIEhPV1RPIChSX0QxMFZfMThfUENSRUwsCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE4LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMTBWXzE4X1BDUkVMIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAzMiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLworICBIT1dUTyAoUl9EMTBWXzMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QxMFZfMzIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLworICBIT1dUTyAoUl9EMTBWX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX0QxMFZfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCisgICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCisgIEhPV1RPIChSX0QxMFZfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX0QxMFZfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCisgICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworIAorfTsKKworLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMTBWIEVMRiByZWxvYyB0eXBlcy4gICovCisKK3N0cnVjdCBkMTB2X3JlbG9jX21hcAoreworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworfTsKKworIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZDEwdl9yZWxvY19tYXAgZDEwdl9yZWxvY19tYXBbXSA9Cit7CisgIHsgQkZEX1JFTE9DX05PTkUsIFJfRDEwVl9OT05FLCB9LAorICB7IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsIFJfRDEwVl8xMF9QQ1JFTF9SIH0sCisgIHsgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTCwgUl9EMTBWXzEwX1BDUkVMX0wgfSwKKyAgeyBCRkRfUkVMT0NfMTYsIFJfRDEwVl8xNiB9LAorICB7IEJGRF9SRUxPQ19EMTBWXzE4LCBSX0QxMFZfMTggfSwKKyAgeyBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCwgUl9EMTBWXzE4X1BDUkVMIH0sCisgIHsgQkZEX1JFTE9DXzMyLCBSX0QxMFZfMzIgfSwKKyAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfRDEwVl9HTlVfVlRJTkhFUklUIH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9EMTBWX0dOVV9WVEVOVFJZIH0sCit9OworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOworICAgICAgIGkgPCBzaXplb2YgKGQxMHZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGQxMHZfcmVsb2NfbWFwKTsKKyAgICAgICBpKyspCisgICAgeworICAgICAgaWYgKGQxMHZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKKwlyZXR1cm4gJmVsZl9kMTB2X2hvd3RvX3RhYmxlW2QxMHZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBEMTBWIEVMRiByZWxvYy4gICovCisKK3N0YXRpYyB2b2lkCitkMTB2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OworeworICB1bnNpZ25lZCBpbnQgcl90eXBlOworCisgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOworICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QxMFZfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDEwdl9ob3d0b190YWJsZVtyX3R5cGVdOworfQorCitzdGF0aWMgYXNlY3Rpb24gKgorZWxmMzJfZDEwdl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQorICAgICAgIGJmZCAqYWJmZDsKKyAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgaWYgKGggIT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgeworICAgICAgY2FzZSBSX0QxMFZfR05VX1ZUSU5IRVJJVDoKKyAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVEVOVFJZOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCisgICAgICAgICAgeworICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKworICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisgICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKKyAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisgICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9kMTB2X2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworeworICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3IgZDEwdiAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgorICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKKyAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCisgCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfZDEwdl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKKyAKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOworICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKKyAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOworIAorICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisgICAgICAgIGggPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworIAorICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKyAgICAgICAgeworICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCisgICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KKyAgICAgICAgY2FzZSBSX0QxMFZfR05VX1ZUSU5IRVJJVDoKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5CisgICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfRDEwVl9HTlVfVlRFTlRSWToKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWxvY2F0ZSBhIEQxMFYgRUxGIHNlY3Rpb24uICAqLworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKKyAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisKKyAgICAgIGlmIChyX3R5cGUgPT0gUl9EMTBWX0dOVV9WVEVOVFJZCisgICAgICAgICAgfHwgcl90eXBlID09IFJfRDEwVl9HTlVfVlRJTkhFUklUICkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGhvd3RvID0gZWxmX2QxMHZfaG93dG9fdGFibGUgKyByX3R5cGU7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKKwkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQorCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQl7CisJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkJfQorCSAgICB9CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLworICAgICAgaCA9IE5VTEw7CisgICAgICBzeW0gPSBOVUxMOworICAgICAgc2VjID0gTlVMTDsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChoICE9IE5VTEwpCisJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisgICAgICBlbHNlCisJeworCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCSAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7CisJICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCisJICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJfQorICAgICAgCisgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKSAwOworCisJICBzd2l0Y2ggKHIpCisJICAgIHsKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKKwkJICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOworCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOworCisJICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKKwkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6CisJICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOworCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCisJICAgIGNvbW1vbl9lcnJvcjoKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKKwkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJICAgICByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisjZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9kMTB2CisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0QxMFYKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKKworI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZDEwdl92ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZDEwdiIKKworI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkgICAgICAgICAgICAgMAorI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJICAgICAgICAgICAgIGQxMHZfaW5mb190b19ob3d0b19yZWwKKyNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJICAgICAgICAgICAgIDAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAgIDAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICAgICAgIGVsZjMyX2QxMHZfZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICBlbGYzMl9kMTB2X2djX3N3ZWVwX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgIGVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzCisjZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gICAgICAgICBlbGYzMl9kMTB2X3JlbG9jYXRlX3NlY3Rpb24KKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zICAgICAgICAgIDEKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWQzMHYuYyBiL2JmZC9lbGYzMi1kMzB2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwZTllOQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGYzMi1kMzB2LmMKQEAgLTAsMCArMSw2MDEgQEAKKy8qIEQzMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAorICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOworc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZDMwdl9yZWxvYyBQQVJBTVMgKCgKKyAgICAgYmZkICphYmZkLAorICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKKyAgICAgYXN5bWJvbCAqc3ltYm9sLAorICAgICBQVFIgZGF0YSwKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisgICAgIGJmZCAqb3V0cHV0X2JmZCwKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jXzIxIFBBUkFNUyAoKAorICAgICBiZmQgKmFiZmQsCisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAorICAgICBhc3ltYm9sICpzeW1ib2wsCisgICAgIFBUUiBkYXRhLAorICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKKyAgICAgYmZkICpvdXRwdXRfYmZkLAorICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOworCitlbnVtIHJlbG9jX3R5cGUKK3sKKyAgUl9EMzBWX05PTkUgPSAwLAorICBSX0QzMFZfNiwKKyAgUl9EMzBWXzlfUENSRUwsCisgIFJfRDMwVl85X1BDUkVMX1IsCisgIFJfRDMwVl8xNSwKKyAgUl9EMzBWXzE1X1BDUkVMLAorICBSX0QzMFZfMTVfUENSRUxfUiwKKyAgUl9EMzBWXzIxLAorICBSX0QzMFZfMjFfUENSRUwsCisgIFJfRDMwVl8yMV9QQ1JFTF9SLAorICBSX0QzMFZfMzIsCisgIFJfRDMwVl8zMl9QQ1JFTCwKKyAgUl9EMzBWXzMyX05PUk1BTCwKKyAgUl9EMzBWX21heAorfTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QzMHZfaG93dG9fdGFibGVbXSA9Cit7CisgIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KKyAgSE9XVE8gKFJfRDMwVl9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QzMFZfTk9ORSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCisgIEhPV1RPIChSX0QzMFZfNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QzMFZfNiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDNmLAkJCS8qIHNyY19tYXNrICovCisJIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KKyAgSE9XVE8gKFJfRDMwVl85X1BDUkVMLAkvKiB0eXBlICovCisJIDMsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMzBWXzlfUENSRUwiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDNmLAkJCS8qIHNyY19tYXNrICovCisJIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KKyAgSE9XVE8gKFJfRDMwVl85X1BDUkVMX1IsCS8qIHR5cGUgKi8KKwkgMywJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QzMFZfOV9QQ1JFTF9SIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZiwJCQkvKiBzcmNfbWFzayAqLworCSAweDNmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEFuIGFic29sdXRlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KKyAgSE9XVE8gKFJfRDMwVl8xNSwJCS8qIHR5cGUgKi8KKwkgMywJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDEyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRDMwVl8xNSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KKyAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTCwJLyogdHlwZSAqLworCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QzMFZfMTVfUENSRUwiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KKyAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTF9SLAkvKiB0eXBlICovCisJIDMsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRDMwVl8xNV9QQ1JFTF9SIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQW4gYWJzb2x1dGUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLworICBIT1dUTyAoUl9EMzBWXzIxLAkJLyogdHlwZSAqLworCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTgsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMzBWXzIxIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4M2ZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCisgIEhPV1RPIChSX0QzMFZfMjFfUENSRUwsCS8qIHR5cGUgKi8KKwkgMywJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE4LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMzBWXzIxX1BDUkVMIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMsIGluIHRoZSBSaWdodCBjb250YWluZXIgKi8KKyAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTF9SLAkvKiB0eXBlICovCisJIDMsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRDMwVl8yMV9QQ1JFTF9SIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIEQzMFYgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KKyAgSE9XVE8gKFJfRDMwVl8zMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9EMzBWXzMyIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSAzMiBiaXQgcmVsb2NhdGlvbiAqLworICBIT1dUTyAoUl9EMzBWXzMyX1BDUkVMLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2QzMHZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRDMwVl8zMl9QQ1JFTCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWd1bGFyIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCisgIEhPV1RPIChSX0QzMFZfMzJfTk9STUFMLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0QzMFZfMzJfTk9STUFMIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKK307CisKKyNkZWZpbmUgTUlOMzIgKGxvbmcgbG9uZykweGZmZmZmZmZmODAwMDAwMDBMTAorI2RlZmluZSBNQVgzMiAweDdmZmZmZmZmTEwKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorYmZkX2VsZl9kMzB2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgbG9uZyBsb25nIHJlbG9jYXRpb247CisgIGJmZF92bWEgaW4xLCBpbjIsIG51bTsKKyAgYmZkX3ZtYSB0bXBfYWRkciA9IDA7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOworICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOworICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7CisgIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOworICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKKyAgaW50IG1ha2VfYWJzb2x1dGUgPSAwOworCisgIHIgPSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOworICBpZiAociAhPSBiZmRfcmVsb2NfY29udGludWUpCisgICAgcmV0dXJuIHI7IAorCisgIC8qIGEgaGFja2VkLXVwIHZlcnNpb24gb2YgYmZkX3BlcmZvcm1fcmVsb2MoKSBmb2xsb3dzICovCisgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAorICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCisgICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7CisKKyAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCisgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQorICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCisKKyAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJlbG9jYXRpb24gPSAwOworICBlbHNlCisgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisKKyAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKworICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQpCisgICAgb3V0cHV0X2Jhc2UgPSAwOworICBlbHNlCisgICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKKworICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCisgIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLworICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisKKyAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKKyAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCisKKyAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQorICAgIHsKKyAgICAgIHRtcF9hZGRyID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgCisJKyByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgICAgIHJlbG9jYXRpb24gLT0gdG1wX2FkZHI7CisgICAgfQorICAKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCisJIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKKwkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLworICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGZsYWc7CisgICAgfQorICBlbHNlCisgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7CisgIAorICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworICBpbjIgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIgKyA0KTsKKworICAvKiBleHRyYWN0IHRoZSBhZGRlbmQgKi8KKyAgbnVtID0gKChpbjIgJiAweDNGRkZGKQorCSB8ICgoaW4yICYgMHhGRjAwMDAwKSA+PiAyKQorCSB8ICgoaW4xICYgMHgzRikgPDwgMjYpKTsKKyAgaW4xICY9IDB4RkZGRkZGQzA7CisgIGluMiA9IDB4ODAwMDAwMDA7CisgIAorICByZWxvY2F0aW9uICs9IG51bTsKKworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUgJiYgaG93dG8tPmJpdHNpemUgPT0gMzIpCisgICAgeworICAgICAgLyogdGhlIEQzMFYgaGFzIGEgUEMgdGhhdCBkb2Vzbid0IHdyYXAgYW5kIFBDLXJlbGF0aXZlIGp1bXBzICovCisgICAgICAvKiBhcmUgc2lnbmVkLCBzbyBhIFBDLXJlbGF0aXZlIGp1bXAgY2FuJ3RiZSBtb3JlIHRoYW4gKy8tIDJeMzEgYnlydGVzICovCisgICAgICAvKiBpZiBvbmUgZXhjZWVkcyB0aGlzLCBjaGFuZ2UgaXQgdG8gYW4gYWJzb2x1dGUganVtcCAqLworICAgICAgaWYgKHJlbG9jYXRpb24gPiBNQVgzMikKKwl7CisJICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gKyB0bXBfYWRkcikgJiAweGZmZmZmZmZmOworCSAgbWFrZV9hYnNvbHV0ZSA9IDE7CisJfQorICAgICAgZWxzZSBpZiAocmVsb2NhdGlvbiA8IE1JTjMyKQorCXsKKwkgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiArIHRtcF9hZGRyKSAmIDB4ZmZmZmZmZmY7CisJICBtYWtlX2Fic29sdXRlID0gMTsKKwl9CisgICAgfQorICAKKyAgaW4xIHw9IChyZWxvY2F0aW9uID4+IDI2KSAmIDB4M0Y7CS8qIHRvcCA2IGJpdHMgKi8KKyAgaW4yIHw9ICgocmVsb2NhdGlvbiAmIDB4MDNGQzAwMDApIDw8IDIpOyAgLyogbmV4dCA4IGJpdHMgKi8gCisgIGluMiB8PSByZWxvY2F0aW9uICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCisgIAorICAvKiBjaGFuZ2UgYSBQQy1yZWxhdGl2ZSBpbnN0cnVjdGlvbiB0byBpdHMgYWJzb2x1dGUgZXF1aXZhbGVudCAqLworICAvKiB3aXRoIHRoaXMgc2ltcGxlIGhhY2sgKi8KKyAgaWYgKG1ha2VfYWJzb2x1dGUpCisgICAgaW4xIHw9IDB4MDAxMDAwMDA7CisKKyAgYmZkX3B1dF8zMiAoYWJmZCwgaW4xLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworICBiZmRfcHV0XzMyIChhYmZkLCBpbjIsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkciArIDQpOworICAKKyAgcmV0dXJuIGZsYWc7Cit9ICAgCisKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorYmZkX2VsZl9kMzB2X3JlbG9jXzIxIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworICBiZmRfdm1hIGluMSwgbnVtOworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKyAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKKyAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOworICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87CisgIGludCBtYXNrLCBtYXg7CisKKyAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7CisgIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKKyAgICByZXR1cm4gcjsgCisKKyAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KKyBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCisgICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKKyAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KKyAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCisgICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KKworICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmVsb2NhdGlvbiA9IDA7CisgIGVsc2UKKyAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKKworICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLworICBpZiAob3V0cHV0X2JmZCkKKyAgICBvdXRwdXRfYmFzZSA9IDA7CisgIGVsc2UKKyAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOworCisgIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKworICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQorICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KKworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCisgICAgeworICAgICAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCisJcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCisJIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKKwkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLworICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGZsYWc7CisgICAgfQorICBlbHNlCisgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7CisgIAorICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIG1hc2sgPSAgKDEgPDwgaG93dG8tPmJpdHNpemUpIC0gMTsKKyAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCisgICAgbWFzayA8PD0gMTI7CisgIG1heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSArIDIpKSAtIDE7CisKKyAgLyogZXh0cmFjdCB0aGUgYWRkZW5kICovCisgIG51bSA9IGluMSAmIG1hc2s7ICAvKiAxOCBiaXRzICovCisgIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQorICAgIG51bSA+Pj0gMTI7CisgIG51bSA8PD0gMzsgLyogc2hpZnQgbGVmdCAzICovCisgIGluMSAmPSB+bWFzazsgIC8qIG1hc2sgb3V0IGFkZGVuZCAqLworCisgIHJlbG9jYXRpb24gKz0gbnVtOworICBpZiAoaG93dG8tPnR5cGUgPT0gUl9EMzBWXzIxX1BDUkVMX1IgfHwgaG93dG8tPnR5cGUgPT0gUl9EMzBWXzE1X1BDUkVMX1IgfHwKKyAgICAgIGhvd3RvLT50eXBlID09IFJfRDMwVl85X1BDUkVMX1IgKQorICAgIHsKKyAgICAgIHJlbG9jYXRpb24gKz0gNDsKKyAgICB9CisKKyAgaWYgKChpbnQpcmVsb2NhdGlvbiA8IDAgKQorICAgIHsKKyAgICAgIGlmICh+KGludClyZWxvY2F0aW9uID4gbWF4KQorCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKChpbnQpcmVsb2NhdGlvbiA+IG1heCkKKwlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworICAgIH0KKyAgcmVsb2NhdGlvbiA+Pj0gMzsgCisgIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQorICAgIGluMSB8PSAoKHJlbG9jYXRpb24gJiAobWFzayA+PiAxMikpIDw8IDEyKTsKKyAgZWxzZQorICAgIGluMSB8PSByZWxvY2F0aW9uICYgbWFzazsKKworICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisgIAorICByZXR1cm4gZmxhZzsKK30gICAKKworLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMzBWIEVMRiByZWxvYyB0eXBlcy4gICovCisKK3N0cnVjdCBkMzB2X3JlbG9jX21hcAoreworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGQzMHZfcmVsb2NfbWFwIGQzMHZfcmVsb2NfbWFwW10gPQoreworICB7IEJGRF9SRUxPQ19OT05FLCBSX0QzMFZfTk9ORSwgfSwKKyAgeyBCRkRfUkVMT0NfRDMwVl82LCBSX0QzMFZfNiB9LAorICB7IEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsIFJfRDMwVl85X1BDUkVMIH0sCisgIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLCBSX0QzMFZfOV9QQ1JFTF9SIH0sCisgIHsgQkZEX1JFTE9DX0QzMFZfMTUsIFJfRDMwVl8xNSB9LAorICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLCBSX0QzMFZfMTVfUENSRUwgfSwKKyAgeyBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBSX0QzMFZfMTVfUENSRUxfUiB9LAorICB7IEJGRF9SRUxPQ19EMzBWXzIxLCBSX0QzMFZfMjEgfSwKKyAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwgUl9EMzBWXzIxX1BDUkVMIH0sCisgIHsgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwgUl9EMzBWXzIxX1BDUkVMX1IgfSwKKyAgeyBCRkRfUkVMT0NfRDMwVl8zMiwgUl9EMzBWXzMyIH0sCisgIHsgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsIFJfRDMwVl8zMl9QQ1JFTCB9LAorICB7IEJGRF9SRUxPQ18zMiwgUl9EMzBWXzMyX05PUk1BTCB9LAorfTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gMDsKKyAgICAgICBpIDwgc2l6ZW9mIChkMzB2X3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk7CisgICAgICAgaSsrKQorICAgIHsKKyAgICAgIGlmIChkMzB2X3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisJcmV0dXJuICZlbGZfZDMwdl9ob3d0b190YWJsZVtkMzB2X3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDMwViBFTEYgcmVsb2MgKHR5cGUgUkVMKS4gICovCisKK3N0YXRpYyB2b2lkCitkMzB2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OworeworICB1bnNpZ25lZCBpbnQgcl90eXBlOworCisgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOworICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QzMFZfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDMwdl9ob3d0b190YWJsZVtyX3R5cGVdOworfQorCisvKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQzMFYgRUxGIHJlbG9jICh0eXBlIFJFTEEpLiAgKi8KKworc3RhdGljIHZvaWQKK2QzMHZfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgdW5zaWduZWQgaW50IHJfdHlwZTsKKworICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKKyAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7CisgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKK30KKworI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDMwdgorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMzBWCisjZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCisKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QzMHZfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQzMHYiCisKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWQzMHZfaW5mb190b19ob3d0b19yZWwKKyNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJMAorI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWZyMzAuYyBiL2JmZC9lbGYzMi1mcjMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4NzI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGYzMi1mcjMwLmMKQEAgLTAsMCArMSw4MTEgQEAKKy8qIEZSMzAtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImVsZi9mcjMwLmgiCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTIwX3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2VsZl9pMzJfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGZyMzBfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworc3RhdGljIHZvaWQgZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZQorICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBmcjMwX2VsZl9nY19zd2VlcF9ob29rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYXNlY3Rpb24gKiBmcjMwX2VsZl9nY19tYXJrX2hvb2sKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmcjMwX2VsZl9ob3d0b190YWJsZSBbXSA9Cit7CisgIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KKyAgSE9XVE8gKFJfRlIzMF9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfTk9ORSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQW4gOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX0ZSMzBfOCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA0LAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfOCIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMjAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9GUjMwXzIwLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMjAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZnIzMF9lbGZfaTIwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfMjAiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMGYwZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9GUjMwXzMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfMzIiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IGludG8gNDggYml0cyBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfRlIzMF80OCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGZyMzBfZWxmX2kzMl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9GUjMwXzQ4IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDYgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9GUjMwXzZfSU5fNCwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA0LAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfNl9JTl80IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLworCSAweDAwZjAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9GUjMwXzhfSU5fOCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA0LAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfOF9JTl84IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLworCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIEEgOSBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX0ZSMzBfOV9JTl84LAkJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOSwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDQsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfRlIzMF85X0lOXzgiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogQSAxMCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX0ZSMzBfMTBfSU5fOCwJLyogdHlwZSAqLworCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA0LAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfMTBfSU5fOCIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLworICBIT1dUTyAoUl9GUjMwXzlfUENSRUwsCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDksCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0ZSMzBfOV9QQ1JFTCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4MDBmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgUEMgcmVsYXRpdmUgMTIgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMS4gICovCisgIEhPV1RPIChSX0ZSMzBfMTJfUENSRUwsCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDEyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9GUjMwXzEyX1BDUkVMIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwN2ZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCisgIEhPV1RPIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfRlIzMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KKyAgSE9XVE8gKFJfRlIzMF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfRlIzMF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgCit9OworDAorLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfRlIzMF8yMCByZWxvYy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2ZyMzBfZWxmX2kyMF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqICAgICAgYWJmZDsKKyAgICAgYXJlbGVudCAqICByZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqICBzeW1ib2w7CisgICAgIFBUUiAgICAgICAgZGF0YTsKKyAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOworICAgICBiZmQgKiAgICAgIG91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiogICAgZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3ZtYSAgICAgICByZWxvY2F0aW9uOworICB1bnNpZ25lZCBsb25nIHg7CisgIAorICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCisgICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQorCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKyAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KKyAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgIHJlbG9jYXRpb24gPQorICAgIHN5bWJvbC0+dmFsdWUKKyAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisgICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIGlmIChyZWxvY2F0aW9uID4gKCgxVSA8PCAyMCkgLSAxKSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisMCisvKiBVdGlsaXR5IHRvIGFjdHVhbGx5IHBlcmZvcm0gYSBSX0ZSMzBfNDggcmVsb2MuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitmcjMwX2VsZl9pMzJfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKiAgICAgIGFiZmQ7CisgICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKiAgc3ltYm9sOworICAgICBQVFIgICAgICAgIGRhdGE7CisgICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOworICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgICAgICAgcmVsb2NhdGlvbjsKKworICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuICAqLworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCisgICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQorCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKyAgICAvKiBGSVhNRTogU2VlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBJcyB0aGlzIHJpZ2h0PyAgKi8KKyAgICByZXR1cm4gYmZkX3JlbG9jX29rOworCisgIHJlbG9jYXRpb24gPQorICAgIHN5bWJvbC0+dmFsdWUKKyAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisgICAgKyByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jYXRpb24sIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOworCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisMCisvKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEZSMzAgRUxGIHJlbG9jIHR5cGVzLiAgKi8KKworc3RydWN0IGZyMzBfcmVsb2NfbWFwCit7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICB1bnNpZ25lZCBpbnQgZnIzMF9yZWxvY192YWw7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyMzBfcmVsb2NfbWFwIGZyMzBfcmVsb2NfbWFwIFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgIFJfRlIzMF9OT05FIH0sCisgIHsgQkZEX1JFTE9DXzgsICAgICAgICAgICAgICBSX0ZSMzBfOCB9LAorICB7IEJGRF9SRUxPQ19GUjMwXzIwLCAgICAgICAgUl9GUjMwXzIwIH0sCisgIHsgQkZEX1JFTE9DXzMyLCAgICAgICAgICAgICBSX0ZSMzBfMzIgfSwKKyAgeyBCRkRfUkVMT0NfRlIzMF80OCwgICAgICAgIFJfRlIzMF80OCB9LAorICB7IEJGRF9SRUxPQ19GUjMwXzZfSU5fNCwgICAgUl9GUjMwXzZfSU5fNCB9LAorICB7IEJGRF9SRUxPQ19GUjMwXzhfSU5fOCwgICAgUl9GUjMwXzhfSU5fOCB9LAorICB7IEJGRF9SRUxPQ19GUjMwXzlfSU5fOCwgICAgUl9GUjMwXzlfSU5fOCB9LAorICB7IEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgsICAgUl9GUjMwXzEwX0lOXzggfSwKKyAgeyBCRkRfUkVMT0NfRlIzMF85X1BDUkVMLCAgIFJfRlIzMF85X1BDUkVMIH0sCisgIHsgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwsICBSX0ZSMzBfMTJfUENSRUwgfSwKKyAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfRlIzMF9HTlVfVlRJTkhFUklUIH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgICBSX0ZSMzBfR05VX1ZURU5UUlkgfSwKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2ZyMzBfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSBzaXplb2YgKGZyMzBfcmVsb2NfbWFwKSAvIHNpemVvZiAoZnIzMF9yZWxvY19tYXBbMF0pOworICAgICAgIC0taTspCisgICAgaWYgKGZyMzBfcmVsb2NfbWFwIFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisgICAgICByZXR1cm4gJiBmcjMwX2VsZl9ob3d0b190YWJsZSBbZnIzMF9yZWxvY19tYXBbaV0uZnIzMF9yZWxvY192YWxdOworICAKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRlIzMCBFTEYgcmVsb2MuICAqLworCitzdGF0aWMgdm9pZAorZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKiBhYmZkOworICAgICBhcmVsZW50ICogY2FjaGVfcHRyOworICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OworeworICB1bnNpZ25lZCBpbnQgcl90eXBlOworCisgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOworICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0ZSMzBfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW3JfdHlwZV07Cit9CisMCisvKiBQZXJmb3JtIGEgc2luZ2xlIHJlbG9jYXRpb24uICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgc3RhbmRhcmQgQkZECisgICByb3V0aW5lcywgYnV0IGEgZmV3IHJlbG9jcywgd2UgaGF2ZSB0byBkbyB0aGVtIG91cnNlbHZlcy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2ZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwgcmVsb2NhdGlvbikKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqICBob3d0bzsKKyAgICAgYmZkICogICAgICAgICAgICAgICBpbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICogICAgICAgICAgaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKiAgICAgICAgICBjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWw7CisgICAgIGJmZF92bWEgICAgICAgICAgICAgcmVsb2NhdGlvbjsKK3sKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHIgPSBiZmRfcmVsb2Nfb2s7CisgIGJmZF92bWEgICAgICAgICAgICAgICB4OworICBiZmRfc2lnbmVkX3ZtYQlzcmVsOworICAKKyAgc3dpdGNoIChob3d0by0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBSX0ZSMzBfMjA6CisgICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7CisgICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7CisKKyAgICAgIGlmIChyZWxvY2F0aW9uID4gKCgxIDw8IDIwKSAtIDEpKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICAKKyAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKKyAgICAgIHggPSAoeCAmIDB4ZmYwZjAwMDApIHwgKHJlbG9jYXRpb24gJiAweDAwMDBmZmZmKSB8ICgocmVsb2NhdGlvbiAmIDB4MDAwZjAwMDApIDw8IDQpOworICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUl9GUjMwXzQ4OgorICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMjsKKyAgICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKKyAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgY29udGVudHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfRlIzMF85X1BDUkVMOgorICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0ICsgMTsKKyAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247CisgICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7CisgICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7CisgICAgICBzcmVsIC09IDI7ICAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLworICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCisJCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICAKKyAgICAgIGlmIChzcmVsICYgMSkKKwlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisgICAgICBpZiAoc3JlbCA+ICgoMSA8PCA4KSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCA4KSkpCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHNyZWwgPj4gMSwgY29udGVudHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfRlIzMF8xMl9QQ1JFTDoKKyAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldDsKKyAgICAgIHNyZWwgPSAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb247CisgICAgICBzcmVsICs9IHJlbC0+cl9hZGRlbmQ7CisgICAgICBzcmVsIC09IHJlbC0+cl9vZmZzZXQ7CisgICAgICBzcmVsIC09IDI7IC8qIEJyYW5jaCBpbnN0cnVjdGlvbnMgYWRkIDIgdG8gdGhlIFBDLi4uICovCisgICAgICBzcmVsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKKwkJICAgICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIAorICAgICAgaWYgKHNyZWwgJiAxKQorCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKyAgICAgIGlmIChzcmVsID4gKCgxIDw8IDExKSAtIDEpIHx8IChzcmVsIDwgLSAoMSA8PCAxMSkpKQorCSAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICAgIAorICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMpOworICAgICAgeCA9ICh4ICYgMHhmODAwKSB8ICgoc3JlbCA+PiAxKSAmIDB4N2ZmKTsKKyAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisJCQkJICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOworICAgIH0KKworICByZXR1cm4gcjsKK30KKworDAorLyogUmVsb2NhdGUgYW4gRlIzMCBFTEYgc2VjdGlvbi4KKyAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCisgICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCisgICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KKworICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCisgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCisKKyAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgorICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCisgICB6ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKKyAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZQorICAgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCisgICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCisKKyAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCisKKyAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQorICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCisKKyAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAorICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgorCisgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQorICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKKyAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKKyAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCisgICBhY2NvcmRpbmdseS4gICovCisKK3N0YXRpYyBib29sZWFuCitmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgICBjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICBsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgICBsb2NhbF9zZWN0aW9uczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKKyAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsOworICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQ7CisKKyAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisgIHJlbGVuZCAgICAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwgKyspCisgICAgeworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKKyAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOworICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOworICAgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTDsKKyAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOworICAgICAgCisgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKKyAgICAgIAorICAgICAgaWYgKCAgIHJfdHlwZSA9PSBSX0ZSMzBfR05VX1ZUSU5IRVJJVAorCSAgfHwgcl90eXBlID09IFJfRlIzMF9HTlVfVlRFTlRSWSkKKwljb250aW51ZTsKKyAgICAgIAorICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCisgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCXsKKwkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCisgICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAorICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQorICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgICAgIAorCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKKwkJeworCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07CisJCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOworCQl9CisJICAgIH0KKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCisgICAgICBob3d0byAgPSBmcjMwX2VsZl9ob3d0b190YWJsZSArIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOworICAgICAgaCAgICAgID0gTlVMTDsKKyAgICAgIHN5bSAgICA9IE5VTEw7CisgICAgICBzZWMgICAgPSBOVUxMOworICAgICAgCisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07CisJICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJCSsgc3ltLT5zdF92YWx1ZSk7CisJICAKKwkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7CisJICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYykgOiBuYW1lOworI2lmIDAKKwkgIGZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAorCQkgICBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKKwkJICAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsCisJCSAgIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOworI2VuZGlmCisJfQorICAgICAgZWxzZQorCXsKKwkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgCisJICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisJICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKKworCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICAKKwkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKyNpZiAwCisJICAgICAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAgImRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzLCB2YWx1ZTogJXggKyAleCArICV4IGdpdmVzOiAleFxuIiwKKwkJICAgICAgIHNlYy0+bmFtZSwgbmFtZSwgaC0+cm9vdC51LmRlZi52YWx1ZSwKKwkJICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKKyNlbmRpZgorCSAgICB9CisJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAgIHsKKyNpZiAwCisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5kZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlc1xuIiwKKwkJICAgICAgIHNlYy0+bmFtZSwgbmFtZSk7CisjZW5kaWYKKwkgICAgICByZWxvY2F0aW9uID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJcmV0dXJuIGZhbHNlOworI2lmIDAKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgbmFtZSk7CisjZW5kaWYKKwkgICAgICByZWxvY2F0aW9uID0gMDsKKwkgICAgfQorCX0KKyAgICAgIAorICAgICAgciA9IGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkgICAgIGNvbnRlbnRzLCByZWwsIHJlbG9jYXRpb24pOworCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIE5VTEw7CisKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICByID0gaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdworCQkoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAorCQkgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgorCSAgICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKKwkJKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKKwkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKKwkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iKTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKG1zZykKKwkgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+d2FybmluZworCSAgICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7CisKKwkgIGlmICghIHIpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCisgICByZWxvY2F0aW9uLiAgKi8KKworc3RhdGljIGFzZWN0aW9uICoKK2ZyMzBfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgICBpbmZvOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgIHJlbDsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOworICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKK3sKKyAgaWYgKGggIT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfRlIzMF9HTlVfVlRJTkhFUklUOgorCWNhc2UgUl9GUjMwX0dOVV9WVEVOVFJZOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247CisKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKwkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKKwkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisJCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCisJeworCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKKwl9CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2ZyMzBfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOworeworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgorICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKKyAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCisgCitzdGF0aWMgYm9vbGVhbgorZnIzMF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7CisgCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisgCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKKyAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCisgICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAKKyAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorICAgICAgICBoID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKyAKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgorICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisgICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVElOSEVSSVQ6CisgICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgCisgICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQorICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KKyAgICAgICAgY2FzZSBSX0ZSMzBfR05VX1ZURU5UUlk6CisgICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorIAorICByZXR1cm4gdHJ1ZTsKK30KKwwKKyNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2ZyMzAKKyNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRlIzMAorI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAorCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9mcjMwX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1mcjMwIgorCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCU5VTEwKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQlmcjMwX2luZm9fdG9faG93dG9fcmVsYQorI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJZnIzMF9lbGZfZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCWZyMzBfZWxmX2djX3N3ZWVwX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICAgICAgICAgIGZyMzBfZWxmX2NoZWNrX3JlbG9jcworCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQorCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWZyMzBfcmVsb2NfdHlwZV9sb29rdXAKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWdlbi5jIGIvYmZkL2VsZjMyLWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItZ2VuLmMKQEAgLTAsMCArMSw3MSBAQAorLyogR2VuZXJpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorCisvKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYW55IHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBzaG91bGQgYmUKKyAgIGdvb2QgZW5vdWdoIGZvciBHREIgb3Igb2JqZHVtcCB0byByZWFkIHRoZSBmaWxlLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZHVtbXkgPQorICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJVTktOT1dOIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KKworc3RhdGljIHZvaWQKK2VsZl9nZW5lcmljX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKKyAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jOworeworICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OworfQorCitzdGF0aWMgdm9pZAorZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKKyAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICplbGZfcmVsb2M7Cit7CisgIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Cit9CisKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItbGl0dGxlIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjMyLWJpZyIKKyNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF91bmtub3duCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX05PTkUKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bworI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCisKKyNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmMgYi9iZmQvZWxmMzItaHBwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDdmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItaHBwYS5jCkBAIC0wLDAgKzEsMjk4OCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBIUCBQQS1SSVNDIEVMRiBmaWxlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkKKworCUNlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQorCURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQorCVVuaXZlcnNpdHkgb2YgVXRhaAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorCisvKiBUaGUgaW50ZXJuYWwgdHlwZSBvZiBhIHN5bWJvbCB0YWJsZSBleHRlbnNpb24gZW50cnkuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWV4dF9lbnRyeVM7CisKKy8qIFRoZSBleHRlcm5hbCB0eXBlIG9mIGEgc3ltYm9sIHRhYmxlIGV4dGVuc2lvbiBlbnRyeS4gICovCisjZGVmaW5lIEVMRjMyX1BBUklTQ19TWF9TSVpFICg0KQorI2RlZmluZSBFTEYzMl9QQVJJU0NfU1hfR0VUKGJmZCwgYWRkcikgYmZkX2hfZ2V0XzMyICgoYmZkKSwgKGFkZHIpKQorI2RlZmluZSBFTEYzMl9QQVJJU0NfU1hfUFVUKGJmZCwgdmFsLCBhZGRyKSBcCisgIGJmZF9oX3B1dF8zMiAoKGJmZCksICh2YWwpLCAoYWRkcikpCisKKy8qIEhQUEEgc3ltYm9sIHRhYmxlIGV4dGVuc2lvbiBlbnRyeSB0eXBlcyAqLworZW51bSBlbGYzMl9ocHBhX3N5bWV4dG5fdHlwZXMKK3sKKyAgUEFSSVNDX1NYVF9OVUxMLAorICBQQVJJU0NfU1hUX1NZTU5EWCwKKyAgUEFSSVNDX1NYVF9BUkdfUkVMT0MsCit9OworCisvKiBUaGVzZSBtYWNyb3MgY29tcG9zZSBhbmQgZGVjb21wb3NlIHRoZSB2YWx1ZSBvZiBhIHN5bWV4dG4gZW50cnk6CisKKyAgIGVudHJ5X3R5cGUgPSBFTEYzMl9QQVJJU0NfU1hfVFlQRSh3b3JkKTsKKyAgIGVudHJ5X3ZhbHVlID0gRUxGMzJfUEFSSVNDX1NYX1ZBTCh3b3JkKTsKKyAgIHdvcmQgPSBFTEYzMl9QQVJJU0NfU1hfV09SRCh0eXBlLHZhbCk7ICAqLworCisjZGVmaW5lIEVMRjMyX1BBUklTQ19TWF9UWVBFKHApCQkoKHApID4+IDI0KQorI2RlZmluZSBFTEYzMl9QQVJJU0NfU1hfVkFMKHApCQkoKHApICYgMHhGRkZGRkYpCisjZGVmaW5lIEVMRjMyX1BBUklTQ19TWF9XT1JEKHR5cGUsdmFsKQkoKCh0eXBlKSA8PCAyNCkgKyAodmFsICYgMHhGRkZGRkYpKQorCisvKiBUaGUgZm9sbG93aW5nIHdhcyBhZGRlZCBmYWNpbGl0YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAuaHBwYV9zeW1leHRuCisgICBzZWN0aW9uLiAgVGhpcyBzZWN0aW9uIGlzIGJ1aWx0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaXMgYnVpbHQgaW4gdGhlCisgICBlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHJvdXRpbmUgKGNhbGxlZCBmcm9tIGJmZF9jbG9zZSkuICBJdCBpcyBidWlsdAorICAgc28gbGF0ZSBiZWNhdXNlIGl0IHJlcXVpcmVzIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IGtub3duIHVudGlsCisgICB0aGUgc3ltYm9sIGFuZCBzdHJpbmcgdGFibGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCwgYW5kCisgICB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIGJ1aWx0LiAqLworCisjZGVmaW5lIFNZTUVYVE5fU0VDVElPTl9OQU1FICIuUEFSSVNDLnN5bWV4dCIKKworc3RydWN0IHN5bWV4dF9jaGFpbgorICB7CisgICAgc3ltZXh0X2VudHJ5UyBlbnRyeTsKKyAgICBzdHJ1Y3Qgc3ltZXh0X2NoYWluICpuZXh0OworICB9OworCit0eXBlZGVmIHN0cnVjdCBzeW1leHRfY2hhaW4gc3ltZXh0X2NoYWluUzsKKworLyogV2UgdXNlIHRocmVlIGRpZmZlcmVudCBoYXNoIHRhYmxlcyB0byBob2xkIGluZm9ybWF0aW9uIGZvcgorICAgbGlua2luZyBQQSBFTEYgb2JqZWN0cy4KKworICAgVGhlIGZpcnN0IGlzIHRoZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSB3aGljaCBpcyBkZXJpdmVkCisgICBmcm9tIHRoZSBzdGFuZGFyZCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICBXZSB1c2UgdGhpcyBhcyBhIHBsYWNlIHRvCisgICBhdHRhY2ggb3RoZXIgaGFzaCB0YWJsZXMgYW5kIHN0YXRpYyBpbmZvcm1hdGlvbi4KKworICAgVGhlIHNlY29uZCBpcyB0aGUgc3R1YiBoYXNoIHRhYmxlIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSB0aGUKKyAgIGJhc2UgQkZEIGhhc2ggdGFibGUuICBUaGUgc3R1YiBoYXNoIHRhYmxlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbgorICAgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBsaW5rZXIgc3R1YnMgZHVyaW5nIGEgbGluay4KKworICAgVGhlIGxhc3QgaGFzaCB0YWJsZSBrZWVwcyB0cmFjayBvZiBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBuZWVkZWQKKyAgIHRvIGJ1aWxkIGhhc2ggdGFibGVzLiAgRWFjaCBmdW5jdGlvbiB3aXRoIG5vbnplcm8gYXJndW1lbnQgbG9jYXRpb24KKyAgIGJpdHMgd2lsbCBoYXZlIGFuIGVudHJ5IGluIHRoaXMgdGFibGUuICAqLworCisvKiBIYXNoIHRhYmxlIGZvciBsaW5rZXIgc3R1YnMuICAqLworCitzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkKK3sKKyAgLyogQmFzZSBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgd2UgY2FuIGdldCB0aGUgbmFtZSBvZiB0aGUgc3R1YgorICAgICAoYW5kIHRodXMga25vdyBleGFjdGx5IHdoYXQgYWN0aW9ucyBpdCBwZXJmb3JtcykgZnJvbSB0aGUgYmFzZQorICAgICBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KKyAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7CisKKyAgLyogT2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzdHViLiAgKi8KKyAgYmZkX3ZtYSBvZmZzZXQ7CisKKyAgLyogR2l2ZW4gdGhlIHN5bWJvbCdzIHZhbHVlIGFuZCBpdHMgc2VjdGlvbiB3ZSBjYW4gZGV0ZXJtaW5lIGl0cyBmaW5hbAorICAgICB2YWx1ZSB3aGVuIGJ1aWxkaW5nIHRoZSBzdHVicyAoc28gdGhlIHN0dWIga25vd3Mgd2hlcmUgdG8ganVtcC4gICovCisgIHN5bXZhbHVlIHRhcmdldF92YWx1ZTsKKyAgYXNlY3Rpb24gKnRhcmdldF9zZWN0aW9uOworfTsKKworc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlCit7CisgIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCisgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OworCisgIC8qIFRoZSBzdHViIEJGRC4gICovCisgIGJmZCAqc3R1Yl9iZmQ7CisKKyAgLyogV2hlcmUgdG8gcGxhY2UgdGhlIG5leHQgc3R1Yi4gICovCisgIGJmZF9ieXRlICpsb2NhdGlvbjsKKworICAvKiBDdXJyZW50IG9mZnNldCBpbiB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKworfTsKKworLyogSGFzaCB0YWJsZSBmb3IgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkKK3sKKyAgLyogQmFzZSBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZS4gICovCisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworCisgIC8qIFRoZSBhcmd1bWVudCBsb2NhdGlvbiBiaXRzIGZvciB0aGlzIGVudHJ5LiAgKi8KKyAgaW50IGFyZ19iaXRzOworfTsKKworc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlCit7CisgIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCisgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OworfTsKKworc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Cit9OworCitzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUKK3sKKyAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCisgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisKKyAgLyogVGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCisgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOworCisgIC8qIFRoZSBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaGFzaCB0YWJsZS4gICovCisgIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZSAqYXJnc19oYXNoX3RhYmxlOworCisgIC8qIEEgY291bnQgb2YgdGhlIG51bWJlciBvZiBvdXRwdXQgc3ltYm9scy4gICovCisgIHVuc2lnbmVkIGludCBvdXRwdXRfc3ltYm9sX2NvdW50OworCisgIC8qIFN0dWZmIHNvIHdlIGNhbiBoYW5kbGUgRFAgcmVsYXRpdmUgcmVsb2NhdGlvbnMuICAqLworICBsb25nIGdsb2JhbF92YWx1ZTsKKyAgaW50IGdsb2JhbF9zeW1fZGVmaW5lZDsKK307CisKKy8qIEZJWE1FLiAgKi8KKyNkZWZpbmUgQVJHVU1FTlRTCTAKKyNkZWZpbmUgUkVUVVJOX1ZBTFVFCTEKKworLyogVGhlIHZhcmlvdXMgYXJndW1lbnQgcmVsb2NhdGlvbnMgdGhhdCBtYXkgYmUgcGVyZm9ybWVkLiAgKi8KK3R5cGVkZWYgZW51bQoreworICAvKiBObyByZWxvY2F0aW9uLiAgKi8KKyAgTk8sCisgIC8qIFJlbG9jYXRlIDMyIGJpdHMgZnJvbSBHUiB0byBGUCByZWdpc3Rlci4gICovCisgIEdGLAorICAvKiBSZWxvY2F0ZSA2NCBiaXRzIGZyb20gYSBHUiBwYWlyIHRvIEZQIHBhaXIuICAqLworICBHRCwKKyAgLyogUmVsb2NhdGUgMzIgYml0cyBmcm9tIEZQIHRvIEdSLiAgKi8KKyAgRkcsCisgIC8qIFJlbG9jYXRlIDY0IGJpdHMgZnJvbSBGUCBwYWlyIHRvIEdSIHBhaXIuICAqLworICBERywKK30gYXJnX3JlbG9jX3R5cGU7CisKKy8qIFdoYXQgaXMgYmVpbmcgcmVsb2NhdGVkIChlZyB3aGljaCBhcmd1bWVudCBvciB0aGUgcmV0dXJuIHZhbHVlKS4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgQVJHMCwgQVJHMSwgQVJHMiwgQVJHMywgUkVULAorfSBhcmdfcmVsb2NfbG9jYXRpb247CisKKworLyogRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQKKworCVRoaXMgZmlsZSBjb250YWlucyBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydCBhcyBzcGVjaWZpZWQKKwlpbiB0aGUgU3RyYXR1cyBGVFgvR29sZiBPYmplY3QgRmlsZSBGb3JtYXQgKFNFRC0xNzYyKSBkYXRlZAorCUZlYnJ1YXJ5IDE5OTQuICAqLworCisjaW5jbHVkZSAiZWxmMzItaHBwYS5oIgorI2luY2x1ZGUgImhwcGFfc3R1YnMuaCIKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBocHBhX2VsZl9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBwYV9lbGZfcmVsb2NhdGVfaW5zbgorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgbG9uZywKKwkgICBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgaHBwYV9lbGZfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCosIGNoYXIgKiopKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CisKK3N0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKworc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOworCitzdGF0aWMgYm9vbGVhbiBlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcKKyAgUEFSQU1TICgoYmZkICosIGVsZl9zeW1ib2xfdHlwZSAqLCB1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKKyAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKKworc3RhdGljIHZvaWQgYWRkX2VudHJ5X3RvX3N5bWV4dF9jaGFpbgorICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHN5bWV4dF9jaGFpblMgKiosCisJICAgc3ltZXh0X2NoYWluUyAqKikpOworCitzdGF0aWMgdm9pZAorZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3ltZXh0X2NoYWluUyAqKSk7CisKK3N0YXRpYyBib29sZWFuIGhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworCitzdGF0aWMgYm9vbGVhbiBlbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAorCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCisgIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLAorCSAgIGJmZF9ieXRlICosIGJmZF92bWEsIGJmZF92bWEsIGJmZF92bWEsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJICAgYXNlY3Rpb24gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyAgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitlbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorZWxmMzJfaHBwYV9hcmdzX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKKwkgICBiZmRfYnl0ZSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7CisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZV9pbml0CisgIFBBUkFNUyAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqLCBiZmQgKiwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpKTsKKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOworCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvCisgIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfdGFibGUgKiwKKwkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YgorICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfYXJnX3JlbG9jX25lZWRlZAorICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYXJnX3JlbG9jX3R5cGUgW10pKTsKKworc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIKKyAgUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGJmZF92bWEsIGNoYXIgKikpOworCitzdGF0aWMgYm9vbGVhbiBlbGYzMl9ocHBhX3NpemVfc3ltZXh0IFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKKworc3RhdGljIGJvb2xlYW4gZWxmMzJfaHBwYV9saW5rX291dHB1dF9zeW1ib2xfaG9vaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAorCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOworCisvKiBFTEYvUEEgcmVsb2NhdGlvbiBob3d0byBlbnRyaWVzLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hwcGFfaG93dG9fdGFibGVbRUxGX0hPV1RPX1RBQkxFX1NJWkVdID0KK3sKKyAge1JfUEFSSVNDX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19OT05FIn0sCisgIC8qIFRoZSB2YWx1ZXMgaW4gRElSMzIgYXJlIHRvIHBsYWNhdGUgdGhlIGNoZWNrIGluCisgICAgIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KKyAge1JfUEFSSVNDX0RJUjMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RJUjMyIiwgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsIGZhbHNlfSwKKyAge1JfUEFSSVNDX0RJUjIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ESVIyMUwifSwKKyAge1JfUEFSSVNDX0RJUjE3UiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ESVIxN1IifSwKKyAge1JfUEFSSVNDX0RJUjE3RiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ESVIxN0YifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19ESVIxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRElSMTRSIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1BDUkVMMjFMLCAwLCAwLCAyMSwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwyMUwifSwKKyAge1JfUEFSSVNDX1BDUkVMMTdSLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN1IifSwKKyAge1JfUEFSSVNDX1BDUkVMMTdGLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN0YifSwKKyAge1JfUEFSSVNDX1BDUkVMMTdDLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxN0MifSwKKyAge1JfUEFSSVNDX1BDUkVMMTRSLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNFIifSwKKyAge1JfUEFSSVNDX1BDUkVMMTRGLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUENSRUwxNEYifSwKKworICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19EUFJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19EUFJFTDIxTCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfRFBSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfRFBSRUwxNFIifSwKKyAge1JfUEFSSVNDX0RQUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RQUkVMMTRGIn0sCisKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfRExUUkVMMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDIxTCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfRExUUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0UiJ9LAorICB7Ul9QQVJJU0NfRExUUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0RMVFJFTDE0RiJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX0RMVElORDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQyMUwifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX0RMVElORDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNFIifSwKKyAge1JfUEFSSVNDX0RMVElORDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19ETFRJTkQxNEYifSwKKworICB7Ul9QQVJJU0NfU0VUQkFTRSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1NFVEJBU0UifSwKKyAge1JfUEFSSVNDX0JBU0VSRUwzMiwgMCwgMCwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMzIifSwKKyAge1JfUEFSSVNDX0JBU0VSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDIxTCJ9LAorICB7Ul9QQVJJU0NfQkFTRVJFTDE3UiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19CQVNFUkVMMTdSIn0sCisgIHtSX1BBUklTQ19CQVNFUkVMMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxN0YifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19CQVNFUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0JBU0VSRUwxNFIifSwKKyAge1JfUEFSSVNDX0JBU0VSRUwxNEYsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfQkFTRVJFTDE0RiJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVEVYVFJFTDMyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1RFWFRSRUwzMiJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfREFUQVJFTDMyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKworCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfUExBQkVMMzIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUExBQkVMMzIifSwKKyAge1JfUEFSSVNDX1BMQUJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwyMUwifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1BMQUJFTDE0UiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QTEFCRUwxNFIifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorCisKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfUExUSU5EMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfUExUSU5EMjFMIn0sCisgIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGhwcGFfZWxmX3JlbG9jLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCisgIHtSX1BBUklTQ19QTFRJTkQxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19QTFRJTkQxNFIifSwKKyAge1JfUEFSSVNDX1BMVElORDE0RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1BMVElORDE0RiJ9LAorCisKKyAge1JfUEFSSVNDX0NPUFksIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgaHBwYV9lbGZfcmVsb2MsICJSX1BBUklTQ19DT1BZIn0sCisgIHtSX1BBUklTQ19HTE9CX0RBVCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0dMT0JfREFUIn0sCisgIHtSX1BBUklTQ19KTVBfU0xPVCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX0pNUF9TTE9UIn0sCisgIHtSX1BBUklTQ19SRUxBVElWRSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBocHBhX2VsZl9yZWxvYywgIlJfUEFSSVNDX1JFTEFUSVZFIn0sCisKKyAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAorfTsKKworLyogV2hlcmUgKHdoYXQgcmVnaXN0ZXIgdHlwZSkgaXMgYW4gYXJndW1lbnQgY29tbWluZyBmcm9tPyAgKi8KK3R5cGVkZWYgZW51bQoreworICBBUl9OTywKKyAgQVJfR1IsCisgIEFSX0ZSLAorICBBUl9GVSwKKyAgQVJfRlBEQkwxLAorICBBUl9GUERCTDIsCit9IGFyZ19sb2NhdGlvbjsKKworLyogSG9yaXpvbnRhbCByZXByZXNlbnRzIHRoZSBjYWxsZWUncyBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwKKyAgIHZlcnRpY2FsIHJlcHJlc2VudHMgY2FsbGVyJ3MgYXJndW1lbnQgbG9jYXRpb24gaW5mb3JtYXRpb24uICBWYWx1ZSBhdCBhCisgICBwYXJ0aWN1bGFyIFgsWSBsb2NhdGlvbiByZXByZXNlbnRzIHdoYXQgKGlmIGFueSkgYXJndW1lbnQgcmVsb2NhdGlvbgorICAgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIHRvIG1ha2UgY2FsbGVyIGFuZCBjYWxsZWUgYWdyZWUuICAqLworCitzdGF0aWMgQ09OU1QgYXJnX3JlbG9jX3R5cGUgYXJnX21pc21hdGNoZXNbNl1bNl0gPQoreworICB7Tk8sIE5PLCBOTywgTk8sIE5PLCBOT30sCisgIHtOTywgTk8sIEdGLCBOTywgR0QsIE5PfSwKKyAge05PLCBGRywgTk8sIE5PLCBOTywgTk99LAorICB7Tk8sIE5PLCBOTywgTk8sIE5PLCBOT30sCisgIHtOTywgREcsIE5PLCBOTywgTk8sIE5PfSwKKyAge05PLCBERywgTk8sIE5PLCBOTywgTk99LAorfTsKKworLyogTGlrZXdpc2UsIGJ1dCByZXZlcnNlZCBmb3IgdGhlIHJldHVybiB2YWx1ZS4gICovCitzdGF0aWMgQ09OU1QgYXJnX3JlbG9jX3R5cGUgcmV0X21pc21hdGNoZXNbNl1bNl0gPQoreworICB7Tk8sIE5PLCBOTywgTk8sIE5PLCBOT30sCisgIHtOTywgTk8sIEZHLCBOTywgREcsIE5PfSwKKyAge05PLCBHRiwgTk8sIE5PLCBOTywgTk99LAorICB7Tk8sIE5PLCBOTywgTk8sIE5PLCBOT30sCisgIHtOTywgR0QsIE5PLCBOTywgTk8sIE5PfSwKKyAge05PLCBHRCwgTk8sIE5PLCBOTywgTk99LAorfTsKKworLyogTWlzYyBzdGF0aWMgY3J1ZCBmb3Igc3ltYm9sIGV4dGVuc2lvbiByZWNvcmRzLiAgKi8KK3N0YXRpYyBzeW1leHRfY2hhaW5TICpzeW1leHRfcm9vdFA7CitzdGF0aWMgc3ltZXh0X2NoYWluUyAqc3ltZXh0X2xhc3RQOworc3RhdGljIGJmZF9zaXplX3R5cGUgc3ltZXh0X2NoYWluX3NpemU7CisKKy8qIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byB0cnkgdGhpcyBzdGF0aWMgdmFyaWFibGUhICAqLworc3RhdGljIGJmZF9ieXRlICpzeW1leHRuX2NvbnRlbnRzOworCisKKy8qIEZvciBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlcy4gICovCisjZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKKyAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgXAorICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQorCisjZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKSBcCisgIChiZmRfaGFzaF90cmF2ZXJzZSBcCisgICAoJih0YWJsZSktPnJvb3QsIFwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksIFwKKyAgICAoaW5mbykpKQorCisvKiBGb3IgbGlua2VyIGFyZ3MgaGFzaCB0YWJsZXMuICAqLworI2RlZmluZSBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCisgICgoc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX2VudHJ5ICopIFwKKyAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKKworI2RlZmluZSBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgXAorICAoYmZkX2hhc2hfdHJhdmVyc2UgXAorICAgKCYodGFibGUpLT5yb290LCBcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCisgICAgKGluZm8pKSkKKworI2RlZmluZSBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZV9pbml0KHRhYmxlLCBuZXdmdW5jKSBcCisgIChiZmRfaGFzaF90YWJsZV9pbml0IFwKKyAgICgmKHRhYmxlKS0+cm9vdCwgXAorICAgIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgXAorCQkJCQkgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIFwKKwkJCQkJIGNvbnN0IGNoYXIgKikpKSAobmV3ZnVuYykpKQorCisvKiBGb3IgSFBQQSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KVwKKyAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkgKikJCQkJXAorICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCisJCQkgKGNvcHkpLCAoZm9sbG93KSkpCisKKyNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCisgIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIFBBIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCisKKyNkZWZpbmUgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKHApIFwKKyAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCisKKworLyogRXh0cmFjdCBzcGVjaWZpYyBhcmd1bWVudCBsb2NhdGlvbiBiaXRzIGZvciBXSElDSCBmcm9tCisgICB0aGUgZnVsbCBhcmd1bWVudCBsb2NhdGlvbiBpbiBBUi4gICovCisjZGVmaW5lIEVYVFJBQ1RfQVJCSVRTKGFyLCB3aGljaCkgKChhcikgPj4gKDggLSAoKHdoaWNoKSAqIDIpKSkgJiAzCisKKy8qIEFzc29ydGVkIGhhc2ggdGFibGUgZnVuY3Rpb25zLiAgKi8KKworLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitlbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnJldDsKKworICByZXQgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCisJCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikKKwkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKKworICBpZiAocmV0KQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPm9mZnNldCA9IDA7CisgICAgICByZXQtPnRhcmdldF92YWx1ZSA9IDA7CisgICAgICByZXQtPnRhcmdldF9zZWN0aW9uID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBJbml0aWFsaXplIGEgc3R1YiBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBzdHViX2JmZCwgbmV3ZnVuYykKKyAgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgYmZkICpzdHViX2JmZDsKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCQljb25zdCBjaGFyICopKTsKK3sKKyAgdGFibGUtPm9mZnNldCA9IDA7CisgIHRhYmxlLT5sb2NhdGlvbiA9IDA7CisgIHRhYmxlLT5zdHViX2JmZCA9IHN0dWJfYmZkOworICByZXR1cm4gKGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgbmV3ZnVuYykpOworfQorCisvKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBhcmd1bWVudCBsb2NhdGlvbiBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitlbGYzMl9ocHBhX2FyZ3NfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKnJldDsKKworICByZXQgPSAoc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCisJCQkgICAgICBzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKikKKwkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLworICBpZiAocmV0KQorICAgIHJldC0+YXJnX2JpdHMgPSAwOworCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKworLyogQ3JlYXRlIHRoZSBkZXJpdmVkIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlIFBBIEVMRiBwb3J0IHVzZXMgdGhlIGRlcml2ZWQKKyAgIGhhc2ggdGFibGUgdG8ga2VlcCBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgUEEgRUxGIGxpbmtlciAod2l0aG91dAorICAgdXNpbmcgc3RhdGljIHZhcmlhYmxlcykuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqcmV0OworCisgIHJldCA9ICgoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKKwkJCQkgICAgICBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldC0+c3R1Yl9oYXNoX3RhYmxlID0gTlVMTDsKKyAgcmV0LT5hcmdzX2hhc2hfdGFibGUgPSBOVUxMOworICByZXQtPm91dHB1dF9zeW1ib2xfY291bnQgPSAwOworICByZXQtPmdsb2JhbF92YWx1ZSA9IDA7CisgIHJldC0+Z2xvYmFsX3N5bV9kZWZpbmVkID0gMDsKKworICByZXR1cm4gJnJldC0+cm9vdC5yb290OworfQorCisvKiBSZWxvY2F0ZSB0aGUgZ2l2ZW4gSU5TTiBnaXZlbiB0aGUgdmFyaW91cyBpbnB1dCBwYXJhbWV0ZXJzLgorCisgICBGSVhNRTogZW5kaWFubmVzcyBhbmQgc2l6ZW9mIChsb25nKSBpc3N1ZXMgYWJvdW5kIGhlcmUuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaHBwYV9lbGZfcmVsb2NhdGVfaW5zbiAoYWJmZCwgaW5wdXRfc2VjdCwgaW5zbiwgYWRkcmVzcywgc3ltX3ZhbHVlLAorCQkJcl9hZGRlbmQsIHJfZm9ybWF0LCByX2ZpZWxkLCBwY3JlbCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdDsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisgICAgIGxvbmcgc3ltX3ZhbHVlOworICAgICBsb25nIHJfYWRkZW5kOworICAgICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0OworICAgICB1bnNpZ25lZCBsb25nIHJfZmllbGQ7CisgICAgIHVuc2lnbmVkIGxvbmcgcGNyZWw7Cit7CisgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlID0gZ2V0X29wY29kZSAoaW5zbik7CisgIGxvbmcgY29uc3RhbnRfdmFsdWU7CisKKyAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgIGNhc2UgTERPOgorICAgIGNhc2UgTERCOgorICAgIGNhc2UgTERIOgorICAgIGNhc2UgTERXOgorICAgIGNhc2UgTERXTToKKyAgICBjYXNlIFNUQjoKKyAgICBjYXNlIFNUSDoKKyAgICBjYXNlIFNUVzoKKyAgICBjYXNlIFNUV006CisgICAgY2FzZSBDT01JQ0xSOgorICAgIGNhc2UgU1VCSToKKyAgICBjYXNlIEFERElUOgorICAgIGNhc2UgQURESToKKyAgICBjYXNlIExESUw6CisgICAgY2FzZSBBRERJTDoKKyAgICAgIGNvbnN0YW50X3ZhbHVlID0gSFBQQV9SX0NPTlNUQU5UIChyX2FkZGVuZCk7CisKKyAgICAgIGlmIChwY3JlbCkKKwlzeW1fdmFsdWUgLT0gYWRkcmVzczsKKworICAgICAgc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOworICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUsIHJfZm9ybWF0KTsKKworICAgIGNhc2UgQkw6CisgICAgY2FzZSBCRToKKyAgICBjYXNlIEJMRToKKyAgICAgIC8qIFhYWCBjb21wdXRpbmcgY29uc3RhbnRfdmFsdWUgaXMgbm90IG5lZWRlZD8/PyAqLworICAgICAgY29uc3RhbnRfdmFsdWUgPSBhc3NlbWJsZV8xNyAoKGluc24gJiAweDAwMWYwMDAwKSA+PiAxNiwKKwkJCQkgICAgKGluc24gJiAweDAwMDAxZmZjKSA+PiAyLAorCQkJCSAgICBpbnNuICYgMSk7CisKKyAgICAgIGNvbnN0YW50X3ZhbHVlID0gKGNvbnN0YW50X3ZhbHVlIDw8IDE1KSA+PiAxNTsKKyAgICAgIGlmIChwY3JlbCkKKwl7CisJICBzeW1fdmFsdWUgLT0KKwkgICAgYWRkcmVzcyArIGlucHV0X3NlY3QtPm91dHB1dF9vZmZzZXQKKwkgICAgKyBpbnB1dF9zZWN0LT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCSAgc3ltX3ZhbHVlID0gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgLTgsIHJfZmllbGQpOworCX0KKyAgICAgIGVsc2UKKwlzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7CisKKyAgICAgIHJldHVybiBocHBhX3JlYnVpbGRfaW5zbiAoYWJmZCwgaW5zbiwgc3ltX3ZhbHVlID4+IDIsIHJfZm9ybWF0KTsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAob3Bjb2RlID09IDApCisJeworCSAgY29uc3RhbnRfdmFsdWUgPSBIUFBBX1JfQ09OU1RBTlQgKHJfYWRkZW5kKTsKKworCSAgaWYgKHBjcmVsKQorCSAgICBzeW1fdmFsdWUgLT0gYWRkcmVzczsKKworCSAgcmV0dXJuIGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBSZWxvY2F0ZSBhbiBIUFBBIEVMRiBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7CisgICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIGFzZWN0aW9uICpzeW1fc2VjOworICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKKworICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBob3d0byA9IGVsZl9ocHBhX2hvd3RvX3RhYmxlICsgcl90eXBlOworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKKwkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQorCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQl7CisJCSAgc3ltX3NlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkJICByZWwtPnJfYWRkZW5kICs9IHN5bV9zZWMtPm91dHB1dF9vZmZzZXQ7CisJCX0KKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKyAgICAgIGggPSBOVUxMOworICAgICAgc3ltID0gTlVMTDsKKyAgICAgIHN5bV9zZWMgPSBOVUxMOworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwl7CisJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9ICgoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KKwkJCSAgID8gMCA6IHN5bS0+c3RfdmFsdWUpCisJCQkgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbG9uZyBpbmR4OworCisJICBpbmR4ID0gcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvOworCSAgaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzeW1fc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAorCQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChoICE9IE5VTEwpCisJc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworICAgICAgZWxzZQorCXsKKwkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAorCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKKwkJCQkJCSAgICAgIHN5bS0+c3RfbmFtZSk7CisJICBpZiAoc3ltX25hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKCpzeW1fbmFtZSA9PSAnXDAnKQorCSAgICBzeW1fbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc3ltX3NlYyk7CisJfQorCisgICAgICAvKiBJZiBhcmdzX2hhc2hfdGFibGUgaXMgTlVMTCwgdGhlbiB3ZSBoYXZlIGVuY291bnRlcmVkIHNvbWUKKwkga2luZCBvZiBsaW5rIGVycm9yIChleC4gdW5kZWZpbmVkIHN5bWJvbHMpLiAgRG8gbm90IHRyeSB0bworCSBhcHBseSBhbnkgcmVsb2NhdGlvbnMsIGNvbnRpbnVlIHRoZSBsb29wIHNvIHdlIGNhbiBub3RpZnkKKwkgdGhlIHVzZXIgb2Ygc2V2ZXJhbCBlcnJvcnMgaW4gYSBzaW5nbGUgYXR0ZW1wdGVkIGxpbmsuICAqLworICAgICAgaWYgKGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmFyZ3NfaGFzaF90YWJsZSA9PSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICByID0gZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKKwkJCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCisJCQkJCSAgICAgIHJlbC0+cl9vZmZzZXQsIHJlbG9jYXRpb24sCisJCQkJCSAgICAgIHJlbC0+cl9hZGRlbmQsIGluZm8sIHN5bV9zZWMsCisJCQkJCSAgICAgIHN5bV9uYW1lLCBoID09IE5VTEwpOworCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgc3dpdGNoIChyKQorCSAgICB7CisJICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBmb3IgRFAgcmVsYXRpdmUgcmVsb2NzIGlmICRnbG9iYWwkIGlzCisJICAgICAgIHVuZGVmaW5lZC4gIFRoaXMgaXMgYSBwYW5pYyBzaXR1YXRpb24gc28gd2UgZG9uJ3QgdHJ5CisJICAgICAgIHRvIGNvbnRpbnVlLiAgKi8KKwkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgorCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6CisJICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAoaW5mbywgIiRnbG9iYWwkIiwgaW5wdXRfYmZkLAorCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgorCSAgICAgIHsKKwkJLyogV2UgdXNlIHRoaXMgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgd2UgcGVyZm9ybWVkCisJCSAgIGEgImRhbmdlcm91cyIgcmVsb2NhdGlvbi4gIFRoaXMgZG9lc24ndCBtZWFuIHdlIGRpZAorCQkgICB0aGUgd3JvbmcgdGhpbmcsIGl0IGp1c3QgbWVhbnMgdGhlcmUgbWF5IGJlIHNvbWUgY2xlYW51cAorCQkgICB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaGVyZS4KKworCQkgICBJbiBwYXJ0aWN1bGFyIHdlIGhhZCB0byBzd2FwIHRoZSBsYXN0IGNhbGwgaW5zbiBhbmQgaXRzCisJCSAgIGRlbGF5IHNsb3QuICBJZiB0aGUgZGVsYXkgc2xvdCBpbnNuIG5lZWRlZCBhIHJlbG9jYXRpb24sCisJCSAgIHRoZW4gd2UnbGwgbmVlZCB0byBhZGp1c3QgdGhlIG5leHQgcmVsb2NhdGlvbiBlbnRyeSdzCisJCSAgIG9mZnNldCB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHRoZSBpbnNuIG1vdmVkLgorCisJCSAgIFRoaXMgaGFpciB3b3VsZG4ndCBiZSBuZWNlc3NhcnkgaWYgd2UgaW5zZXJ0ZWQgc3R1YnMKKwkJICAgYmV0d2VlbiBwcm9jZWR1cmVzIGFuZCB1c2VkIGEgImJsIiB0byBnZXQgdG8gdGhlIHN0dWIuICAqLworCQlpZiAocmVsICE9IHJlbGVuZCkKKwkJICB7CisJCSAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbmV4dF9yZWwgPSByZWwgKyAxOworCisJCSAgICBpZiAocmVsLT5yX29mZnNldCArIDQgPT0gbmV4dF9yZWwtPnJfb2Zmc2V0KQorCQkgICAgICBuZXh0X3JlbC0+cl9vZmZzZXQgLT0gNDsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgZGVmYXVsdDoKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICAgICAgeworCQlpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAgICAgIChpbmZvLCBzeW1fbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAorCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiBvbmUgKG9yIG1vcmUpIEJGRCByZWxvY2F0aW9ucyB3aGljaCBpbXBsZW1lbnQgdGhlIGJhc2UKKyAgIHJlbG9jYXRpb24gd2l0aCBtb2RpZmljYXRpb25zIGJhc2VkIG9uIGZvcm1hdCBhbmQgZmllbGQuICAqLworCitlbGYzMl9ocHBhX3JlbG9jX3R5cGUgKioKK2hwcGFfZWxmX2dlbl9yZWxvY190eXBlIChhYmZkLCBiYXNlX3R5cGUsIGZvcm1hdCwgZmllbGQsIGlnbm9yZSwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVsZjMyX2hwcGFfcmVsb2NfdHlwZSBiYXNlX3R5cGU7CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBmaWVsZDsKKyAgICAgaW50IGlnbm9yZTsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBlbGYzMl9ocHBhX3JlbG9jX3R5cGUgKmZpbmFsdHlwZTsKKyAgZWxmMzJfaHBwYV9yZWxvY190eXBlICoqZmluYWxfdHlwZXM7CisKKyAgLyogQWxsb2NhdGUgc2xvdHMgZm9yIHRoZSBCRkQgcmVsb2NhdGlvbi4gICovCisgIGZpbmFsX3R5cGVzID0gKChlbGYzMl9ocHBhX3JlbG9jX3R5cGUgKiopCisJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmMzJfaHBwYV9yZWxvY190eXBlICopICogMikpOworICBpZiAoZmluYWxfdHlwZXMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlbG9jYXRpb24gaXRzZWxmLiAgKi8KKyAgZmluYWx0eXBlID0gKChlbGYzMl9ocHBhX3JlbG9jX3R5cGUgKikKKwkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSkpKTsKKyAgaWYgKGZpbmFsdHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCisgIGZpbmFsX3R5cGVzWzBdID0gZmluYWx0eXBlOworICBmaW5hbF90eXBlc1sxXSA9IE5VTEw7CisKKyNkZWZpbmUgZmluYWxfdHlwZSBmaW5hbHR5cGVbMF0KKworICBmaW5hbF90eXBlID0gYmFzZV90eXBlOworCisgIC8qIEp1c3QgYSB0YW5nbGUgb2YgbmVzdGVkIHN3aXRjaCBzdGF0ZW1lbnRzIHRvIGRlYWwgd2l0aCB0aGUgYnJhaW5kYW1hZ2UKKyAgICAgdGhhdCBhIGRpZmZlcmVudCBmaWVsZCBzZWxlY3RvciBtZWFucyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHJlbG9jYXRpb24KKyAgICAgZm9yIFBBIEVMRi4gICovCisgIHN3aXRjaCAoYmFzZV90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfSFBQQToKKyAgICBjYXNlIFJfSFBQQV9BQlNfQ0FMTDoKKyAgICAgIHN3aXRjaCAoZm9ybWF0KQorCXsKKwljYXNlIDE0OgorCSAgc3dpdGNoIChmaWVsZCkKKwkgICAgeworCSAgICBjYXNlIGVfcnNlbDoKKwkgICAgY2FzZSBlX3Jyc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxNFI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgZV9ydHNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUUkVMMTRSOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGVfdHNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRExUUkVMMTRGOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGVfcnBzZWw6CisJICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDE0UjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIDE3OgorCSAgc3dpdGNoIChmaWVsZCkKKwkgICAgeworCSAgICBjYXNlIGVfZnNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTdGOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGVfcnNlbDoKKwkgICAgY2FzZSBlX3Jyc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIxN1I7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAyMToKKwkgIHN3aXRjaCAoZmllbGQpCisJICAgIHsKKwkgICAgY2FzZSBlX2xzZWw6CisJICAgIGNhc2UgZV9scnNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMjFMOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGVfbHRzZWw6CisJICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVFJFTDIxTDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBlX2xwc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwyMUw7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAzMjoKKwkgIHN3aXRjaCAoZmllbGQpCisJICAgIHsKKwkgICAgY2FzZSBlX2ZzZWw6CisJICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjMyOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGVfcHNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUExBQkVMMzI7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIFJfSFBQQV9HT1RPRkY6CisgICAgICBzd2l0Y2ggKGZvcm1hdCkKKwl7CisJY2FzZSAxNDoKKwkgIHN3aXRjaCAoZmllbGQpCisJICAgIHsKKwkgICAgY2FzZSBlX3JzZWw6CisJICAgIGNhc2UgZV9ycnNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRFBSRUwxNFI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgZV9mc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19EUFJFTDE0RjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIDIxOgorCSAgc3dpdGNoIChmaWVsZCkKKwkgICAgeworCSAgICBjYXNlIGVfbHJzZWw6CisJICAgIGNhc2UgZV9sc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19EUFJFTDIxTDsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6CisgICAgICBzd2l0Y2ggKGZvcm1hdCkKKwl7CisJY2FzZSAxNDoKKwkgIHN3aXRjaCAoZmllbGQpCisJICAgIHsKKwkgICAgY2FzZSBlX3JzZWw6CisJICAgIGNhc2UgZV9ycnNlbDoKKwkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxNFI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgZV9mc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE0RjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIDE3OgorCSAgc3dpdGNoIChmaWVsZCkKKwkgICAgeworCSAgICBjYXNlIGVfcnNlbDoKKwkgICAgY2FzZSBlX3Jyc2VsOgorCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE3UjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBlX2ZzZWw6CisJICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTdGOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgMjE6CisJICBzd2l0Y2ggKGZpZWxkKQorCSAgICB7CisJICAgIGNhc2UgZV9sc2VsOgorCSAgICBjYXNlIGVfbHJzZWw6CisJICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMjFMOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGZpbmFsX3R5cGVzOworfQorCisjdW5kZWYgZmluYWxfdHlwZQorCisvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgcGFydGljdWxhciBzZWN0aW9uIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9ocHBhX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICAvKiBJZ25vcmUgd3JpdGUgcmVxdWVzdHMgZm9yIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gdW50aWwgd2UndmUKKyAgICAgaGFkIHRoZSBjaGFuY2UgdG8gcmVidWlsZCBpdCBvdXJzZWx2ZXMuICAqLworICBpZiAoIXN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5QQVJJU0Muc3ltZXh0biIpICYmICFzeW1leHRfY2hhaW5fc2l6ZSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sCisJCQkJCSAgb2Zmc2V0LCBjb3VudCk7Cit9CisKKy8qIFRyYW5zbGF0ZSBmcm9tIGFuIGVsZiBpbnRvIGZpZWxkIGludG8gYSBob3d0byByZWxvY2F0aW9uIHBvaW50ZXIuICAqLworCitzdGF0aWMgdm9pZAorZWxmMzJfaHBwYV9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpOworICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKK30KKworCisvKiBBY3R1YWxseSBwZXJmb3JtIGEgcmVsb2NhdGlvbi4gIE5PVEUgdGhpcyBpcyAobW9zdGx5KSBzdXBlcmNlZWRlZAorICAgYnkgZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSB3aGljaCBpcyBjYWxsZWQgYnkgdGhlIG5ldworICAgZmFzdCBsaW5rZXIuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitocHBhX2VsZl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKKwkJZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIC8qIEl0IGlzIG5vIGxvbmdlciB2YWxpZCB0byBjYWxsIGhwcGFfZWxmX3JlbG9jIHdoZW4gY3JlYXRpbmcKKyAgICAgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICAgICAgLyogV29yayBhcm91bmQgbG9zc2FnZSBpbiBnZW5lcmljIGVsZiBjb2RlIHRvIHdyaXRlIHJlbG9jYXRpb25zLgorCSAobWFwcyBkaWZmZXJlbnQgc2VjdGlvbiBzeW1ib2xzIGludG8gdGhlIHNhbWUgc3ltYm9sIGluZGV4KS4gICovCisgICAgICBpZiAoKHN5bWJvbF9pbi0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisJICAmJiBzeW1ib2xfaW4tPnNlY3Rpb24pCisJcmVsb2NfZW50cnktPmFkZGVuZCArPSBzeW1ib2xfaW4tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgXygiVW5zdXBwb3J0ZWQgY2FsbCB0byBocHBhX2VsZl9yZWxvYyIpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisgICAgfQorfQorCisvKiBBY3R1YWxseSBwZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gIFRoaXMgY2FuIGdldAorICAgcmF0aGVyIGhhaXJ5IHdoZW4gbGlua2VyIHN0dWJzIGFyZSBuZWVkZWQuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAorCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKKwkJCQkgICAgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBzeW1fbmFtZSwgaXNfbG9jYWwpCisgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKKyAgICAgYmZkX3ZtYSBhZGRlbmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKKyAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7CisgICAgIGludCBpc19sb2NhbDsKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOworICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0ID0gaG93dG8tPmJpdHNpemU7CisgIHVuc2lnbmVkIGxvbmcgcl9maWVsZCA9IGVfZnNlbDsKKyAgYmZkX2J5dGUgKmhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7CisgIGJvb2xlYW4gcl9wY3JlbCA9IGhvd3RvLT5wY19yZWxhdGl2ZTsKKworICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWx1ZSBmb3IgJGdsb2JhbCQuICBGSVhNRSBpc24ndCB0aGlzIGVmZmVjdGl2ZWx5CisgICAgIGp1c3QgbGlrZSB0aGUgZ3AgcG9pbnRlciBvbiBNSVBTPyAgQ2FuIHdlIHVzZSB0aG9zZSByb3V0aW5lcyBmb3IgdGhpcworICAgICBwdXJwb3NlPyAgKi8KKyAgaWYgKCFlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfc3ltX2RlZmluZWQpCisgICAgeworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBhc2VjdGlvbiAqc2VjOworCisgICAgICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgIiRnbG9iYWwkIiwgZmFsc2UsCisJCQkJIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgIC8qIElmIHRoZXJlIGlzbid0IGEgJGdsb2JhbCQsIHRoZW4gd2UncmUgaW4gZGVlcCB0cm91YmxlLiAgKi8KKyAgICAgIGlmIChoID09IE5VTEwpCisJcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisKKyAgICAgIC8qIElmICRnbG9iYWwkIGlzbid0IGEgZGVmaW5lZCBzeW1ib2wsIHRoZW4gd2UncmUgc3RpbGwgaW4gZGVlcAorCSB0cm91YmxlLiAgKi8KKyAgICAgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQorCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3N5bV9kZWZpbmVkID0gMTsKKyAgICB9CisKKyAgc3dpdGNoIChyX3R5cGUpCisgICAgeworICAgIGNhc2UgUl9QQVJJU0NfTk9ORToKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX1BBUklTQ19ESVIzMjoKKyAgICBjYXNlIFJfUEFSSVNDX0RJUjE3RjoKKyAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdDOgorICAgICAgcl9maWVsZCA9IGVfZnNlbDsKKyAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOworICAgIGNhc2UgUl9QQVJJU0NfRElSMjFMOgorICAgIGNhc2UgUl9QQVJJU0NfUENSRUwyMUw6CisgICAgICByX2ZpZWxkID0gZV9scnNlbDsKKyAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOworICAgIGNhc2UgUl9QQVJJU0NfRElSMTdSOgorICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN1I6CisgICAgY2FzZSBSX1BBUklTQ19ESVIxNFI6CisgICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE0UjoKKyAgICAgIHJfZmllbGQgPSBlX3Jyc2VsOworICAgICAgZ290byBkb19iYXNpY190eXBlXzE7CisKKyAgICAvKiBGb3IgYWxsIHRoZSBEUCByZWxhdGl2ZSByZWxvY2F0aW9ucywgd2UgbmVlZCB0byBleGFtaW5lIHRoZSBzeW1ib2wncworICAgICAgIHNlY3Rpb24uICBJZiBpdCdzIGEgY29kZSBzZWN0aW9uLCB0aGVuICJkYXRhIHBvaW50ZXIgcmVsYXRpdmUiIG1ha2VzCisgICAgICAgbm8gc2Vuc2UuICBJbiB0aGF0IGNhc2Ugd2UgZG9uJ3QgYWRqdXN0IHRoZSAidmFsdWUiLCBhbmQgZm9yIDIxIGJpdAorICAgICAgIGFkZGlsIGluc3RydWN0aW9ucywgd2UgY2hhbmdlIHRoZSBzb3VyY2UgYWRkZW5kIHJlZ2lzdGVyIGZyb20gJWRwIHRvCisgICAgICAgJXIwLiAgKi8KKyAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMjFMOgorICAgICAgcl9maWVsZCA9IGVfbHJzZWw7CisgICAgICBpZiAoc3ltX3NlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKKwl7CisJICBpZiAoKGluc24gJiAweGZjMDAwMDAwKSA+PiAyNiA9PSAweGEKKwkgICAgICAgJiYgKGluc24gJiAweDAzZTAwMDAwKSA+PiAyMSA9PSAweDFiKQorCSAgICBpbnNuICY9IH4weDAzZTAwMDAwOworCX0KKyAgICAgIGVsc2UKKwl2YWx1ZSAtPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5nbG9iYWxfdmFsdWU7CisgICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKKyAgICBjYXNlIFJfUEFSSVNDX0RQUkVMMTRSOgorICAgICAgcl9maWVsZCA9IGVfcnJzZWw7CisgICAgICBpZiAoKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCisJdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOworICAgICAgZ290byBkb19iYXNpY190eXBlXzE7CisgICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0RjoKKyAgICAgIHJfZmllbGQgPSBlX2ZzZWw7CisgICAgICBpZiAoKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCisJdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOworICAgICAgZ290byBkb19iYXNpY190eXBlXzE7CisKKyAgICAvKiBUaGVzZSBjYXNlcyBhcmUgc2VwYXJhdGUgYXMgdGhleSBtYXkgaW52b2x2ZSBhIGxvdCBtb3JlIHdvcmsKKyAgICAgICB0byBkZWFsIHdpdGggbGlua2VyIHN0dWJzLiAgKi8KKyAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDMyOgorICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMjFMOgorICAgIGNhc2UgUl9QQVJJU0NfUExBQkVMMTRSOgorICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxN0Y6CisgICAgICB7CisJYmZkX3ZtYSBsb2NhdGlvbjsKKwl1bnNpZ25lZCBpbnQgbGVuLCBjYWxsZXJfYXJncywgY2FsbGVlX2FyZ3M7CisJYXJnX3JlbG9jX3R5cGUgYXJnX3JlbG9jX3R5cGVzWzVdOworCXN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZSAqYXJnc19oYXNoX3RhYmxlOworCXN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqYXJnc19oYXNoOworCWNoYXIgKm5ld19uYW1lLCAqc3R1Yl9uYW1lOworCisJLyogR2V0IHRoZSBmaWVsZCBzZWxlY3RvciByaWdodC4gIFdlJ2xsIG5lZWQgaXQgaW4gYSBtaW51dGUuICAqLworCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxN0YKKwkgICAgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDMyKQorCSAgcl9maWVsZCA9IGVfZnNlbDsKKwllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMjFMKQorCSAgcl9maWVsZCA9IGVfbHJzZWw7CisJZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDE0UikKKwkgIHJfZmllbGQgPSBlX3Jyc2VsOworCisJLyogRmluZCBvdXQgd2hlcmUgd2UgYXJlIGFuZCB3aGVyZSB3ZSdyZSBnb2luZy4gICovCisJbG9jYXRpb24gPSAob2Zmc2V0ICsKKwkJICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKworCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisKKwkvKiBOb3cgbG9vayBmb3IgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlCisJICAgdGFyZ2V0LiAgKi8KKwlsZW4gPSBzdHJsZW4gKHN5bV9uYW1lKSArIDE7CisJaWYgKGlzX2xvY2FsKQorCSAgbGVuICs9IDk7CisJbmV3X25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOworCWlmICghbmV3X25hbWUpCisJICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKwlzdHJjcHkgKG5ld19uYW1lLCBzeW1fbmFtZSk7CisKKwkvKiBMb2NhbCBzeW1ib2xzIGhhdmUgdW5pcXVlIElEcy4gICovCisJaWYgKGlzX2xvY2FsKQorCSAgc3ByaW50ZiAobmV3X25hbWUgKyBsZW4gLSAxMCwgIl8lMDh4IiwgKGludClzeW1fc2VjKTsKKworCWFyZ3NfaGFzaF90YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmFyZ3NfaGFzaF90YWJsZTsKKworCWFyZ3NfaGFzaCA9IGVsZjMyX2hwcGFfYXJnc19oYXNoX2xvb2t1cCAoYXJnc19oYXNoX3RhYmxlLAorCQkJCQkJIG5ld19uYW1lLCBmYWxzZSwgZmFsc2UpOworCWlmIChhcmdzX2hhc2ggPT0gTlVMTCkKKwkgIGNhbGxlZV9hcmdzID0gMDsKKwllbHNlCisJICBjYWxsZWVfYXJncyA9IGFyZ3NfaGFzaC0+YXJnX2JpdHM7CisKKwkvKiBJZiB0aGlzIGlzIGEgQ0FMTCByZWxvY2F0aW9uLCB0aGVuIGdldCB0aGUgY2FsbGVyJ3MgYml0cworCSAgIGZyb20gdGhlIGFkZGVuZC4gIEVsc2UgdXNlIHRoZSBtYWdpYyAweDE1NSB2YWx1ZSBmb3IgUExBQkVMUy4KKworCSAgIEFsc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZGVzdGluYXRpb24gKHZhbHVlKSBmb3IgUExBQkVMUy4gICovCisJaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RikKKwkgIGNhbGxlcl9hcmdzID0gSFBQQV9SX0FSR19SRUxPQyAoYWRkZW5kKTsKKwllbHNlCisJICB7CisJICAgIGNhbGxlcl9hcmdzID0gMHgxNTU7CisJICAgIGxvY2F0aW9uID0gdmFsdWU7CisJICB9CisKKwkvKiBBbnkga2luZCBvZiBsaW5rZXIgc3R1YiBuZWVkZWQ/ICAqLworCWlmICgoKGludCkodmFsdWUgLSBsb2NhdGlvbikgPiAweDNmZmZmKQorCSAgICB8fCAoKGludCkodmFsdWUgLSBsb2NhdGlvbikgPCAoaW50KTB4ZmZmYzAwMDApCisJICAgIHx8IGVsZjMyX2hwcGFfYXJnX3JlbG9jX25lZWRlZCAoY2FsbGVyX2FyZ3MsIGNhbGxlZV9hcmdzLAorCQkJCQkgICAgYXJnX3JlbG9jX3R5cGVzKSkKKwkgIHsKKwkgICAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGU7CisJICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqc3R1Yl9oYXNoOworCSAgICBhc2VjdGlvbiAqc3R1Yl9zZWN0aW9uOworCisJICAgIC8qIEJ1aWxkIGEgbmFtZSBmb3IgdGhlIHN0dWIuICAqLworCisJICAgIGxlbiA9IHN0cmxlbiAobmV3X25hbWUpOworCSAgICBsZW4gKz0gMjM7CisJICAgIHN0dWJfbmFtZSA9IGJmZF9tYWxsb2MgKGxlbik7CisJICAgIGlmICghc3R1Yl9uYW1lKQorCSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOworCSAgICBlbGYzMl9ocHBhX25hbWVfb2Zfc3R1YiAoY2FsbGVyX2FyZ3MsIGNhbGxlZV9hcmdzLAorCQkJCSAgICAgbG9jYXRpb24sIHZhbHVlLCBzdHViX25hbWUpOworCSAgICBzdHJjYXQgKHN0dWJfbmFtZSwgbmV3X25hbWUpOworCSAgICBmcmVlIChuZXdfbmFtZSk7CisKKwkgICAgc3R1Yl9oYXNoX3RhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+c3R1Yl9oYXNoX3RhYmxlOworCisJICAgIHN0dWJfaGFzaAorCSAgICAgID0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsIHN0dWJfbmFtZSwKKwkJCQkJICAgICBmYWxzZSwgZmFsc2UpOworCisJICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGF0IG5hbWUuICAqLworCSAgICBmcmVlIChzdHViX25hbWUpOworCisJICAgIC8qIFRoZSBzdHViIEJGRCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCisJICAgIHN0dWJfc2VjdGlvbiA9IHN0dWJfaGFzaF90YWJsZS0+c3R1Yl9iZmQtPnNlY3Rpb25zOworCisJICAgIGlmIChzdHViX2hhc2ggIT0gTlVMTCkKKwkgICAgICB7CisKKwkJaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RikKKwkJICB7CisJCSAgICB1bnNpZ25lZCBsb25nIGRlbGF5X2luc247CisJCSAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlLCBydG5fcmVnLCBsZG9fdGFyZ2V0X3JlZywgbGRvX3NyY19yZWc7CisKKwkJICAgIC8qIFdlJ2xsIG5lZWQgdG8gcGVlayBhdCB0aGUgbmV4dCBpbnNuLiAgKi8KKwkJICAgIGRlbGF5X2luc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhICsgNCk7CisJCSAgICBvcGNvZGUgPSBnZXRfb3Bjb2RlIChkZWxheV9pbnNuKTsKKworCQkgICAgLyogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIHJldHVybiByZWdpc3RlciBmb3IgdGhpcworCQkgICAgICAgY2FsbC4gICovCisJCSAgICBydG5fcmVnID0gKGluc24gJiAweDAzZTAwMDAwKSA+PiAyMTsKKworCQkgICAgbGRvX3NyY19yZWcgPSAoZGVsYXlfaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOworCQkgICAgbGRvX3RhcmdldF9yZWcgPSAoZGVsYXlfaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2OworCisJCSAgICAvKiBNdW5nZSB1cCB0aGUgdmFsdWUgYW5kIG90aGVyIHBhcmFtZXRlcnMgZm9yCisJCSAgICAgICBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuLiAgKi8KKworCQkgICAgdmFsdWUgPSAoc3R1Yl9oYXNoLT5vZmZzZXQKKwkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgICAgKyBzdHViX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOworCisJCSAgICByX2Zvcm1hdCA9IDE3OworCQkgICAgcl9maWVsZCA9IGVfZnNlbDsKKwkJICAgIHJfcGNyZWwgPSAwOworCQkgICAgYWRkZW5kID0gMDsKKworCQkgICAgLyogV2UgbmVlZCB0byBwZWVrIGF0IHRoZSBkZWxheSBpbnNuIGFuZCBkZXRlcm1pbmUgaWYKKwkJICAgICAgIHdlJ2xsIG5lZWQgdG8gc3dhcCB0aGUgYnJhbmNoIGFuZCBpdHMgZGVsYXkgaW5zbi4gICovCisJCSAgICBpZiAoKGluc24gJiAyKQorCQkJfHwgKG9wY29kZSA9PSBMRE8KKwkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQorCQkJfHwgKGRlbGF5X2luc24gPT0gMHgwODAwMDI0MCkpCisJCSAgICAgIHsKKwkJCS8qIE5vIG5lZWQgdG8gc3dhcCB0aGUgYnJhbmNoIGFuZCBpdHMgZGVsYXkgc2xvdCwgYnV0CisJCQkgICB3ZSBkbyBuZWVkIHRvIG1ha2Ugc3VyZSB0byBqdW1wIHBhc3QgdGhlIHJldHVybgorCQkJICAgcG9pbnRlciB1cGRhdGUgaW4gdGhlIHN0dWIuICAqLworCQkJdmFsdWUgKz0gNDsKKworCQkJLyogSWYgdGhlIGRlbGF5IGluc24gZG9lcyBhIHJldHVybiBwb2ludGVyIGFkanVzdG1lbnQsCisJCQkgICB0aGVuIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGl0IHN0YXlzIHZhbGlkLiAgKi8KKwkJCWlmIChvcGNvZGUgPT0gTERPCisJCQkgICAgJiYgbGRvX3RhcmdldF9yZWcgPT0gcnRuX3JlZykKKwkJCSAgeworCQkJICAgIGRlbGF5X2luc24gJj0gMHhmYzAwZmZmZjsKKwkJCSAgICBkZWxheV9pbnNuIHw9ICgoMzEgPDwgMjEpIHwgKDMxIDw8IDE2KSk7CisJCQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSArIDQpOworCQkJICB9CisJCQkvKiBVc2UgYSBCTEUgdG8gcmVhY2ggdGhlIHN0dWIuICAqLworCQkJaW5zbiA9IEJMRV9TUjRfUjA7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJLyogV29uZGVyZnVsLCB3ZSBoYXZlIHRvIHN3YXAgdGhlIGNhbGwgaW5zbiBhbmQgaXRzCisJCQkgICBkZWxheSBzbG90LiAgKi8KKwkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgZGVsYXlfaW5zbiwgaGl0X2RhdGEpOworCQkJLyogVXNlIGEgQkxFLG4gdG8gcmVhY2ggdGhlIHN0dWIuICAqLworCQkJaW5zbiA9IChCTEVfU1I0X1IwIHwgMHgyKTsKKwkJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgaGl0X2RhdGEgKyA0KTsKKwkJCWluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsCisJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiwKKwkJCQkJCSAgICAgICBpbnNuLCBvZmZzZXQgKyA0LAorCQkJCQkJICAgICAgIHZhbHVlLCBhZGRlbmQsCisJCQkJCQkgICAgICAgcl9mb3JtYXQsIHJfZmllbGQsCisJCQkJCQkgICAgICAgcl9wY3JlbCk7CisJCQkvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIHdvcmQuICAqLworCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOworCQkJcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICAvKiBQTEFCRUwgc3R1ZmYgaXMgZWFzeS4gICovCisKKwkJICAgIHZhbHVlID0gKHN0dWJfaGFzaC0+b2Zmc2V0CisJCQkgICAgICsgc3R1Yl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgICsgc3R1Yl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKKwkJICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIFJQIGFkanVzdG1lbnQgZm9yIFBMQUJFTHMuICAqLworCQkgICAgdmFsdWUgKz0gNDsKKwkJICAgIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMzIpCisJCSAgICAgIHJfZm9ybWF0ID0gMzI7CisJCSAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMjFMKQorCQkgICAgICByX2Zvcm1hdCA9IDIxOworCQkgICAgZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDE0UikKKwkJICAgICAgcl9mb3JtYXQgPSAxNDsKKworCQkgICAgcl9wY3JlbCA9IDA7CisJCSAgICBhZGRlbmQgPSAwOworCQkgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisJICB9CisJZ290byBkb19iYXNpY190eXBlXzE7CisgICAgICB9CisKK2RvX2Jhc2ljX3R5cGVfMToKKyAgICAgIGluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGluc24sCisJCQkJICAgICBvZmZzZXQsIHZhbHVlLCBhZGRlbmQsIHJfZm9ybWF0LAorCQkJCSAgICAgcl9maWVsZCwgcl9wY3JlbCk7CisgICAgICBicmVhazsKKworICAgIC8qIFNvbWV0aGluZyB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuICAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKyAgICB9CisKKyAgLyogVXBkYXRlIHRoZSBpbnN0cnVjdGlvbiB3b3JkLiAgKi8KKyAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSk7CisgIHJldHVybiAoYmZkX3JlbG9jX29rKTsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBob3d0byB0YWJsZSBlbnRyeSB0byBwZXJmb3JtIHRoZSBDT0RFCisgICByZWxvY2F0aW9uIGZvciBhbiBBUkNIIG1hY2hpbmUuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgaWYgKChpbnQpIGNvZGUgPCAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKChpbnQpIGVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdLnR5cGUgPT0gKGludCkgY29kZSk7CisgICAgICByZXR1cm4gJmVsZl9ocHBhX2hvd3RvX3RhYmxlWyhpbnQpIGNvZGVdOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIFNZTSByZXByZXNlbnRzIGEgbG9jYWwgbGFiZWwgc3ltYm9sLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2hwcGFfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICckJyk7Cit9CisKKy8qIERvIGFueSBiYWNrZW5kIHNwZWNpZmljIHByb2Nlc3Npbmcgd2hlbiBiZWdpbm5pbmcgdG8gd3JpdGUgYW4gb2JqZWN0CisgICBmaWxlLiAgRm9yIFBBIEVMRiB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGV4dGVuc2lvbgorICAgc2VjdGlvbiAqYmVmb3JlKiBhbnkgb3RoZXIgb3V0cHV0IHByb2Nlc3NpbmcgaGFwcGVucy4gICovCisKK3N0YXRpYyB2b2lkCitlbGYzMl9ocHBhX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIGFzZWN0aW9uICpzeW1leHRuX3NlYzsKKworICAvKiBTaXplIHVwIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uICAqLworICBpZiAoKGFiZmQtPm91dHN5bWJvbHMgPT0gTlVMTAorICAgICAgICYmIGluZm8gPT0gTlVMTCkKKyAgICAgIHx8IHN5bWV4dF9jaGFpbl9zaXplICE9IDApCisgICAgcmV0dXJuOworCisgIGlmIChpbmZvID09IE5VTEwpCisgICAgeworICAgICAgLyogV2Ugd2VyZSBub3QgY2FsbGVkIGZyb20gdGhlIEJGRCBFTEYgbGlua2VyIGNvZGUsIHNvIHdlIG5lZWQKKwkgdG8gZXhhbWluZSB0aGUgb3V0cHV0IEJGRCdzIG91dHN5bWJvbHMuCisKKwkgTm90ZSB3ZSBjYW4gbm90IGJ1aWxkIHRoZSBzeW1ib2wgZXh0ZW5zaW9ucyBub3cgYXMgdGhlIHN5bWJvbAorCSBtYXAgaGFzbid0IGJlZW4gc2V0IHVwLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zeW1jb3VudDsgaSsrKQorCXsKKwkgIGVsZl9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKGVsZl9zeW1ib2xfdHlwZSAqKWFiZmQtPm91dHN5bWJvbHNbaV07CisKKwkgIC8qIE9ubHkgZnVuY3Rpb25zIGV2ZXIgbmVlZCBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIGV4dGVuc2lvbgorCSAgICAgc2VjdGlvbi4gICovCisJICBpZiAoIShzeW1ib2wtPnN5bWJvbC5mbGFncyAmIEJTRl9GVU5DVElPTikpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBBbmQgb25seSBpZiB0aGV5IHNwZWNpZnkgdGhlIGxvY2F0aW9ucyBvZiB0aGVpciBhcmd1bWVudHMuICAqLworCSAgaWYgKHN5bWJvbC0+dGNfZGF0YS5ocHBhX2FyZ19yZWxvYyA9PSAwKQorCSAgICBjb250aW51ZTsKKworCSAgLyogWXVwLiAgVGhpcyBmdW5jdGlvbiBzeW1ib2wgbmVlZHMgYW4gZW50cnkuICAqLworCSAgc3ltZXh0X2NoYWluX3NpemUgKz0gMiAqIEVMRjMyX1BBUklTQ19TWF9TSVpFOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHsKKyAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZSAqdGFibGU7CisgICAgICB0YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmFyZ3NfaGFzaF90YWJsZTsKKworICAgICAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uICAqLworICAgICAgZWxmMzJfaHBwYV9hcmdzX2hhc2hfdHJhdmVyc2UgKHRhYmxlLAorCQkJCSAgICAgZWxmMzJfaHBwYV9zaXplX3N5bWV4dCwKKwkJCQkgICAgICZzeW1leHRfY2hhaW5fc2l6ZSk7CisgICAgfQorCisgIC8qIE5vdyBjcmVhdGUgdGhlIHNlY3Rpb24gYW5kIHNldCBpdHMgc2l6ZS4gIFdlJ2xsIGZpbGwgaW4gdGhlCisgICAgIGNvbnRlbnRzIGxhdGVyLiAgKi8KKyAgc3ltZXh0bl9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgU1lNRVhUTl9TRUNUSU9OX05BTUUpOworICBpZiAoc3ltZXh0bl9zZWMgPT0gTlVMTCkKKyAgICBzeW1leHRuX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIFNZTUVYVE5fU0VDVElPTl9OQU1FKTsKKworICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHN5bWV4dG5fc2VjLAorCQkJIFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19EQVRBKTsKKyAgc3ltZXh0bl9zZWMtPm91dHB1dF9zZWN0aW9uID0gc3ltZXh0bl9zZWM7CisgIHN5bWV4dG5fc2VjLT5vdXRwdXRfb2Zmc2V0ID0gMDsKKyAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc3ltZXh0bl9zZWMsIDIpOworICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3ltZXh0bl9zZWMsIHN5bWV4dF9jaGFpbl9zaXplKTsKK30KKworLyogQ2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIHRoZSBhcmdzIGxvY2F0aW9uIGhhc2ggdGFibGUuICBGb3IgZWFjaAorICAgZW50cnkgd2UgYnVtcCB0aGUgc2l6ZSBwb2ludGVyIGJ5IDIgcmVjb3JkcyAoMTYgYnl0ZXMpLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2hwcGFfc2l6ZV9zeW1leHQgKGdlbl9lbnRyeSwgaW5fYXJncykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7CisgICAgIFBUUiBpbl9hcmdzOworeworICBiZmRfc2l6ZV90eXBlICpzaXplcCA9IChiZmRfc2l6ZV90eXBlICopaW5fYXJnczsKKworICAqc2l6ZXAgKz0gMiAqIEVMRjMyX1BBUklTQ19TWF9TSVpFOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQmFja2VuZCByb3V0aW5lIGNhbGxlZCBieSB0aGUgbGlua2VyIGZvciBlYWNoIG91dHB1dCBzeW1ib2wuCisKKyAgIEZvciBQQSBFTEYgd2UgdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gYWRkIGFuIGFwcHJvcHJpYXRlIGVudHJ5CisgICB0byB0aGUgc3ltYm9sIGV4dGVuc2lvbiBjaGFpbiBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9ocHBhX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBuYW1lLCBzeW0sIHNlY3Rpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGNoYXIgKm5ld19uYW1lOworICB1bnNpZ25lZCBpbnQgbGVuLCBpbmRleDsKKyAgc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICphcmdzX2hhc2hfdGFibGU7CisgIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9lbnRyeSAqYXJnc19oYXNoOworCisgIC8qIElmIHRoZSBhcmdzIGhhc2ggdGFibGUgaXMgTlVMTCwgdGhlbiB3ZSd2ZSBlbmNvdW50ZXJlZCBhbiBlcnJvcgorICAgICBvZiBzb21lIHNvcnRzIChmb3IgZXhhbXBsZSwgYW4gdW5kZWZpbmVkIHN5bWJvbCkuICBJbiB0aGF0IGNhc2UKKyAgICAgd2UndmUgZ290IG5vdGhpbmcgZWxzZSB0byBkby4KKworICAgICBOT1RFOiBlbGZfbGlua19vdXRwdXRfc3ltYm9sIHdpbGwgYWJvcnQgaWYgd2UgcmV0dXJuIGZhbHNlIGhlcmUhICAqLworICBpZiAoZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+YXJnc19oYXNoX3RhYmxlID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW5kZXggPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5vdXRwdXRfc3ltYm9sX2NvdW50Kys7CisKKyAgLyogV2UgbmVlZCB0byBsb29rIHVwIHRoaXMgc3ltYm9sIGluIHRoZSBhcmdzIGhhc2ggdGFibGUgdG8gc2VlIGlmCisgICAgIGl0IGhhcyBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMuICAqLworICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2Uga25vdyBpdCdzIGEgZnVuY3Rpb24gc3ltYm9sIG9mIHNvbWUga2luZC4gICovCisgIGxlbiA9IHN0cmxlbiAobmFtZSkgKyAxOworICBpZiAoRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPT0gU1RCX0xPQ0FMKQorICAgIGxlbiArPSA5OworCisgIG5ld19uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKKyAgaWYgKG5ld19uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0cmNweSAobmV3X25hbWUsIG5hbWUpOworICBpZiAoRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgPT0gU1RCX0xPQ0FMKQorICAgIHNwcmludGYgKG5ld19uYW1lICsgbGVuIC0gMTAsICJfJTA4eCIsIChpbnQpc2VjdGlvbik7CisKKyAgLyogTm93IHRoYXQgd2UgaGF2ZSB0aGUgdW5pcXVlIG5hbWUsIHdlIGNhbiBsb29rIGl0IHVwIGluIHRoZQorICAgICBhcmdzIGhhc2ggdGFibGUuICAqLworICBhcmdzX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUgKGluZm8pLT5hcmdzX2hhc2hfdGFibGU7CisgIGFyZ3NfaGFzaCA9IGVsZjMyX2hwcGFfYXJnc19oYXNoX2xvb2t1cCAoYXJnc19oYXNoX3RhYmxlLCBuZXdfbmFtZSwKKwkJCQkJICAgZmFsc2UsIGZhbHNlKTsKKyAgZnJlZSAobmV3X25hbWUpOworICBpZiAoYXJnc19oYXNoID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2Uga25vdyB0aGlzIHN5bWJvbCBoYXMgYXJnIHJlbG9jIGJpdHMuICAqLworICBhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluIChhYmZkLCBhcmdzX2hhc2gtPmFyZ19iaXRzLAorCQkJICAgICBpbmRleCwgJnN5bWV4dF9yb290UCwgJnN5bWV4dF9sYXN0UCk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBQZXJmb3JtIGFueSBwcm9jZXNzaW5nIG5lZWRlZCBsYXRlIGluIHRoZSBvYmplY3QgZmlsZSB3cml0aW5nIHByb2Nlc3MuCisgICBGb3IgUEEgRUxGIHdlIGJ1aWxkIGFuZCBzZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2wgZXh0ZW5zaW9uCisgICBzZWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2VsZjMyX2hwcGFfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBsaW5rZXI7Cit7CisgIGFzZWN0aW9uICpzeW1leHRuX3NlYzsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLyogTm93IGJ1aWxkIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24uICAqLworICBpZiAoc3ltZXh0X2NoYWluX3NpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKCEgbGlua2VyKQorICAgIHsKKyAgICAgIC8qIFdlIHdlcmUgbm90IGNhbGxlZCBmcm9tIHRoZSBiYWNrZW5kIGxpbmtlciwgc28gd2Ugc3RpbGwgbmVlZAorCSB0byBidWlsZCB0aGUgc3ltYm9sIGV4dGVuc2lvbiBjaGFpbi4KKworICAgICAgICAgTG9vayBhdCBlYWNoIHN5bWJvbCwgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKwkgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIGxpc3QgYXMgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zeW1jb3VudDsgaSsrKQorCXsKKwkgIGVsZl9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhYmZkLT5vdXRzeW1ib2xzW2ldOworCisJICAvKiBPbmx5IGZ1bmN0aW9ucyBldmVyIG5lZWQgYW4gZW50cnkgaW4gdGhlIHN5bWJvbCBleHRlbnNpb24KKwkgICAgIHNlY3Rpb24uICAqLworCSAgaWYgKCEoc3ltYm9sLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKQorCSAgICBjb250aW51ZTsKKworCSAgLyogQW5kIG9ubHkgaWYgdGhleSBzcGVjaWZ5IHRoZSBsb2NhdGlvbnMgb2YgdGhlaXIgYXJndW1lbnRzLiAgKi8KKwkgIGlmIChzeW1ib2wtPnRjX2RhdGEuaHBwYV9hcmdfcmVsb2MgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIC8qIEFkZCB0aGlzIHN5bWJvbCdzIGluZm9ybWF0aW9uIHRvIHRoZSBjaGFpbi4gICovCisJICBhZGRfZW50cnlfdG9fc3ltZXh0X2NoYWluIChhYmZkLCBzeW1ib2wtPnRjX2RhdGEuaHBwYV9hcmdfcmVsb2MsCisJCQkJICAgICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5pLCAmc3ltZXh0X3Jvb3RQLAorCQkJCSAgICAgJnN5bWV4dF9sYXN0UCk7CisJfQorICAgIH0KKworICAvKiBOb3cgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4gICovCisgIGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMgKGFiZmQsIHN5bWV4dF9yb290UCk7CisKKyAgLyogQW5kIGF0dGFjaCB0aGF0IGFzIHRoZSBzZWN0aW9uJ3MgY29udGVudHMuICAqLworICBzeW1leHRuX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBTWU1FWFROX1NFQ1RJT05fTkFNRSk7CisgIGlmIChzeW1leHRuX3NlYyA9PSAoYXNlY3Rpb24gKikgMCkKKyAgICBhYm9ydCgpOworCisgIHN5bWV4dG5fc2VjLT5jb250ZW50cyA9ICh2b2lkICopc3ltZXh0bl9jb250ZW50czsKKworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN5bWV4dG5fc2VjLCBzeW1leHRuX3NlYy0+Y29udGVudHMsCisJCQkgICAgc3ltZXh0bl9zZWMtPm91dHB1dF9vZmZzZXQsIHN5bWV4dG5fc2VjLT5fcmF3X3NpemUpOworfQorCisvKiBVcGRhdGUgdGhlIHN5bWJvbCBleHRlbnRpb24gY2hhaW4gdG8gaW5jbHVkZSB0aGUgc3ltYm9sIHBvaW50ZWQgdG8KKyAgIGJ5IFNZTUJPTFAgaWYgU1lNQk9MUCBpcyBhIGZ1bmN0aW9uIHN5bWJvbC4gIFVzZWQgaW50ZXJuYWxseSBhbmQgYnkgR0FTLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF9lbnRyeV90b19zeW1leHRfY2hhaW4gKGFiZmQsIGFyZ19yZWxvYywgc3ltX2lkeCwgc3ltZXh0X3Jvb3QsIHN5bWV4dF9sYXN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7CisgICAgIHVuc2lnbmVkIGludCBzeW1faWR4OworICAgICBzeW1leHRfY2hhaW5TICoqc3ltZXh0X3Jvb3Q7CisgICAgIHN5bWV4dF9jaGFpblMgKipzeW1leHRfbGFzdDsKK3sKKyAgc3ltZXh0X2NoYWluUyAqc3ltZXh0UDsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIGluaXRpYWxpemUgdGhpcyBlbnRyeS4gICovCisgIHN5bWV4dFAgPSAoc3ltZXh0X2NoYWluUyAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3ltZXh0X2NoYWluUykgKiAyKTsKKyAgaWYgKCFzeW1leHRQKQorICAgIGFib3J0KCk7CQkJLyogRklYTUUgKi8KKworICBzeW1leHRQWzBdLmVudHJ5ID0gRUxGMzJfUEFSSVNDX1NYX1dPUkQgKFBBUklTQ19TWFRfU1lNTkRYLCBzeW1faWR4KTsKKyAgc3ltZXh0UFswXS5uZXh0ID0gJnN5bWV4dFBbMV07CisKKyAgc3ltZXh0UFsxXS5lbnRyeSA9IEVMRjMyX1BBUklTQ19TWF9XT1JEIChQQVJJU0NfU1hUX0FSR19SRUxPQywgYXJnX3JlbG9jKTsKKyAgc3ltZXh0UFsxXS5uZXh0ID0gTlVMTDsKKworICAvKiBOb3cgdXBkYXRlIHRoZSBjaGFpbiBpdHNlbGYgc28gaXQgY2FuIGJlIHdhbGtlZCBsYXRlciB0byBidWlsZAorICAgICB0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLiAgKi8KKyAgaWYgKCpzeW1leHRfcm9vdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICpzeW1leHRfcm9vdCA9ICZzeW1leHRQWzBdOworICAgICAgKnN5bWV4dF9sYXN0ID0gJnN5bWV4dFBbMV07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKCpzeW1leHRfbGFzdCktPm5leHQgPSAmc3ltZXh0UFswXTsKKyAgICAgICpzeW1leHRfbGFzdCA9ICZzeW1leHRQWzFdOworICAgIH0KK30KKworLyogQnVpbGQgdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zIChhYmZkLCBzeW1leHRfcm9vdCkKKyAgICAgYmZkICphYmZkOworICAgICBzeW1leHRfY2hhaW5TICpzeW1leHRfcm9vdDsKK3sKKyAgc3ltZXh0X2NoYWluUyAqc3ltZXh0UDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGFzZWN0aW9uICpzeW1leHRuX3NlYzsKKworICBzeW1leHRuX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBTWU1FWFROX1NFQ1RJT05fTkFNRSk7CisKKyAgLyogR3JhYiBzb21lIG1lbW9yeSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24KKyAgICAgaXRzZWxmLiAgKi8KKyAgc3ltZXh0bl9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLAorCQkJCQkgICAgICBzeW1leHRuX3NlYy0+X3Jhd19zaXplKTsKKyAgaWYgKCFzeW1leHRuX2NvbnRlbnRzKQorICAgIGFib3J0KCk7CQkJLyogRklYTUUgKi8KKworICAvKiBGaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgc3ltYm9sIGV4dGVuc2lvbiBjaGFpbi4gICovCisgIGZvciAoaSA9IDAsIHN5bWV4dFAgPSBzeW1leHRfcm9vdDsgc3ltZXh0UDsgc3ltZXh0UCA9IHN5bWV4dFAtPm5leHQsICsraSkKKyAgICBFTEYzMl9QQVJJU0NfU1hfUFVUIChhYmZkLCAoYmZkX3ZtYSkgc3ltZXh0UC0+ZW50cnksCisJCQkgc3ltZXh0bl9jb250ZW50cyArIGkgKiBFTEYzMl9QQVJJU0NfU1hfU0laRSk7CisKKyAgcmV0dXJuOworfQorCisvKiBEbyBzb21lIFBBIEVMRiBzcGVjaWZpYyB3b3JrIGFmdGVyIHJlYWRpbmcgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyAgIEluIHBhcnRpY3VsYXIgYXR0YWNoIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uIGZyb20gdGhlCisgICBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gdG8gdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nIChhYmZkLCBlc3ltcyxzeW1jbnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZWxmX3N5bWJvbF90eXBlICplc3ltczsKKyAgICAgdW5zaWduZWQgaW50IHN5bWNudDsKK3sKKyAgRWxmMzJfSW50ZXJuYWxfU2hkciAqc3ltZXh0bl9oZHIgPQorICAgIGJmZF9lbGZfZmluZF9zZWN0aW9uIChhYmZkLCBTWU1FWFROX1NFQ1RJT05fTkFNRSk7CisgIHVuc2lnbmVkIGludCBpLCBjdXJyZW50X3N5bV9pZHggPSAwOworCisgIC8qIElmIG5vIHN5bWJvbCBleHRlbnNpb24gZXhpc3RlZCwgdGhlbiBhbGwgc3ltYm9sIGV4dGVuc2lvbiBpbmZvcm1hdGlvbgorICAgICBpcyBhc3N1bWVkIHRvIGJlIHplcm8uICAqLworICBpZiAoc3ltZXh0bl9oZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltY250OyBpKyspCisJZXN5bXNbaV0udGNfZGF0YS5ocHBhX2FyZ19yZWxvYyA9IDA7CisgICAgICByZXR1cm4gKHRydWUpOworICAgIH0KKworICAvKiBGSVhNRTogIFdoeSBub3QgdXNlIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyBoZXJlPyAgQWxzbyBzaG91bGQgZ2l2ZQorICAgICBtZW1vcnkgYmFjayB3aGVuIHdlJ3JlIGRvbmUuICAqLworICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBmb3IgdGhlIHN5bWV4dG4gc2VjdGlvbi4gICovCisgIHN5bWV4dG5faGRyLT5jb250ZW50cyA9IGJmZF96YWxsb2MoYWJmZCxzeW1leHRuX2hkci0+c2hfc2l6ZSk7CisgIGlmICghc3ltZXh0bl9oZHItPmNvbnRlbnRzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBSZWFkIGluIHRoZSBzeW1leHRuIHNlY3Rpb24uICAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWV4dG5faGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgc3ltZXh0bl9oZHItPmNvbnRlbnRzLCAxLCBzeW1leHRuX2hkci0+c2hfc2l6ZSwgYWJmZCkKKyAgICAgICE9IHN5bWV4dG5faGRyLT5zaF9zaXplKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBQYXJzZSBlbnRyaWVzIGluIHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24sIHVwZGF0aW5nIHRoZSBzeW10YWIKKyAgICAgZW50cmllcyBhcyB3ZSBnbyAqLworICBmb3IgKGkgPSAwOyBpIDwgc3ltZXh0bl9oZHItPnNoX3NpemUgLyBFTEYzMl9QQVJJU0NfU1hfU0laRTsgaSsrKQorICAgIHsKKyAgICAgIHN5bWV4dF9lbnRyeVMgc2UgPQorCUVMRjMyX1BBUklTQ19TWF9HRVQgKGFiZmQsCisJCQkgICAgICgodW5zaWduZWQgY2hhciAqKXN5bWV4dG5faGRyLT5jb250ZW50cworCQkJICAgICAgKyBpICogRUxGMzJfUEFSSVNDX1NYX1NJWkUpKTsKKyAgICAgIHVuc2lnbmVkIGludCBzZV92YWx1ZSA9IEVMRjMyX1BBUklTQ19TWF9WQUwgKHNlKTsKKyAgICAgIHVuc2lnbmVkIGludCBzZV90eXBlID0gRUxGMzJfUEFSSVNDX1NYX1RZUEUgKHNlKTsKKworICAgICAgc3dpdGNoIChzZV90eXBlKQorCXsKKwljYXNlIFBBUklTQ19TWFRfTlVMTDoKKwkgIGJyZWFrOworCisJY2FzZSBQQVJJU0NfU1hUX1NZTU5EWDoKKwkgIGlmIChzZV92YWx1ZSA+PSBzeW1jbnQpCisJICAgIHsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgICAgICByZXR1cm4gKGZhbHNlKTsKKwkgICAgfQorCSAgY3VycmVudF9zeW1faWR4ID0gc2VfdmFsdWUgLSAxOworCSAgYnJlYWs7CisKKwljYXNlIFBBUklTQ19TWFRfQVJHX1JFTE9DOgorCSAgZXN5bXNbY3VycmVudF9zeW1faWR4XS50Y19kYXRhLmhwcGFfYXJnX3JlbG9jID0gc2VfdmFsdWU7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiAoZmFsc2UpOworCX0KKyAgICB9CisgIHJldHVybiAodHJ1ZSk7Cit9CisKKy8qIFJlYWQgYW5kIGF0dGFjaCB0aGUgc3ltYm9sIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHN5bWJvbHMKKyAgIGluIElOUFVUX0JGRCB0byB0aGUgYXJndW1lbnQgbG9jYXRpb24gaGFzaCB0YWJsZS4gIEhhbmRsZSBsb2NhbHMKKyAgIGlmIERPX0xPQ0FMUyBpcyB0cnVlOyBsaWtld2lzZSBmb3IgZ2xvYmFscyB3aGVuIERPX0dMT0JBTFMgaXMgdHJ1ZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8gKGlucHV0X2JmZCwgc3ltdGFiX2hkciwgYXJnc19oYXNoX3RhYmxlLCBsb2NhbF9zeW1zKQorICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgICAgIHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZSAqYXJnc19oYXNoX3RhYmxlOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworeworICBhc2VjdGlvbiAqc3ltZXh0bl9zZWM7CisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgdW5zaWduZWQgaW50IGksIG5fZW50cmllcywgY3VycmVudF9pbmRleCA9IDA7CisKKyAgLyogR2V0IHRoZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gZm9yIHRoaXMgQkZELiAgSWYgbm8gc2VjdGlvbiBleGlzdHMKKyAgICAgdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICBMaWtld2lzZSBpZiB0aGUgc2VjdGlvbiBleGlzdHMsIGJ1dAorICAgICBoYXMgbm8gY29udGVudHMuICAqLworICBzeW1leHRuX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsIFNZTUVYVE5fU0VDVElPTl9OQU1FKTsKKyAgaWYgKHN5bWV4dG5fc2VjID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogRG9uZSBzZXBhcmF0ZWx5IHNvIHdlIGNhbiB0dXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIChzZWUgYmVsb3cpLiAgKi8KKyAgaWYgKHN5bWV4dG5fc2VjLT5fcmF3X3NpemUgPT0gMCkKKyAgICB7CisgICAgICBzeW1leHRuX3NlYy0+ZmxhZ3MgJj0gflNFQ19IQVNfQ09OVEVOVFM7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3ltZXh0bl9zZWMtPl9yYXdfc2l6ZSk7CisgIGlmIChjb250ZW50cyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBIb3cgZ3Jvc3MuICBXZSB0dXJuIG9mZiBTRUNfSEFTX0NPTlRFTlRTIGZvciB0aGUgaW5wdXQgc3ltYm9sIGV4dGVuc2lvbgorICAgICBzZWN0aW9ucyB0byBrZWVwIHRoZSBnZW5lcmljIEVMRi9CRkQgY29kZSBmcm9tIHRyeWluZyB0byBkbyBhbnl0aGluZworICAgICB3aXRoIHRoZW0uICBXZSBoYXZlIHRvIHVuZG8gdGhhdCBoYWNrIHRlbXBvcmFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlYWQKKyAgICAgaW4gdGhlIGNvbnRlbnRzIHdpdGggdGhlIGdlbmVyaWMgY29kZS4gICovCisgIHN5bWV4dG5fc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOworICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHN5bWV4dG5fc2VjLCBjb250ZW50cywKKwkJCQkwLCBzeW1leHRuX3NlYy0+X3Jhd19zaXplKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBzeW1leHRuX3NlYy0+ZmxhZ3MgJj0gflNFQ19IQVNfQ09OVEVOVFM7CisgICAgICBmcmVlIChjb250ZW50cyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIEdyb3NzLiAgVHVybiBvZmYgU0VDX0hBU19DT05URU5UUyBmb3IgdGhlIGlucHV0IHN5bWJvbCBleHRlbnNpb24KKyAgICAgc2VjdGlvbnMgKHNlZSBhYm92ZSkuICAqLworICBzeW1leHRuX3NlYy0+ZmxhZ3MgJj0gflNFQ19IQVNfQ09OVEVOVFM7CisKKyAgbl9lbnRyaWVzID0gc3ltZXh0bl9zZWMtPl9yYXdfc2l6ZSAvIEVMRjMyX1BBUklTQ19TWF9TSVpFOworICBmb3IgKGkgPSAwOyBpIDwgbl9lbnRyaWVzOyBpKyspCisgICAgeworICAgICAgc3ltZXh0X2VudHJ5UyBlbnRyeSA9CisJRUxGMzJfUEFSSVNDX1NYX0dFVCAoaW5wdXRfYmZkLCBjb250ZW50cyArIGkgKiBFTEYzMl9QQVJJU0NfU1hfU0laRSk7CisgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSBFTEYzMl9QQVJJU0NfU1hfVkFMIChlbnRyeSk7CisgICAgICB1bnNpZ25lZCBpbnQgdHlwZSA9IEVMRjMyX1BBUklTQ19TWF9UWVBFIChlbnRyeSk7CisgICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKmFyZ3NfaGFzaDsKKworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIFBBUklTQ19TWFRfTlVMTDoKKwkgIGJyZWFrOworCisJY2FzZSBQQVJJU0NfU1hUX1NZTU5EWDoKKwkgIGlmICh2YWx1ZSA+PSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgZnJlZSAoY29udGVudHMpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgY3VycmVudF9pbmRleCA9IHZhbHVlOworCSAgYnJlYWs7CisKKwljYXNlIFBBUklTQ19TWFRfQVJHX1JFTE9DOgorCSAgaWYgKGN1cnJlbnRfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKwkgICAgICBjaGFyICpuZXdfbmFtZTsKKwkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKKwkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKKwkgICAgICB1bnNpZ25lZCBpbnQgbGVuOworCisJICAgICAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChpbnB1dF9iZmQpW2xvY2FsX3N5bXNbY3VycmVudF9pbmRleF0uc3Rfc2huZHhdOworCSAgICAgIHN5bV9zZWMgPSBoZHItPmJmZF9zZWN0aW9uOworCSAgICAgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAorCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKKwkgCQkJICAgICAgICBsb2NhbF9zeW1zW2N1cnJlbnRfaW5kZXhdLnN0X25hbWUpOworCSAgICAgIGxlbiA9IHN0cmxlbiAoc3ltX25hbWUpICsgMTA7CisJICAgICAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOworCSAgICAgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQorCQl7CisJCSAgZnJlZSAoY29udGVudHMpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICAgIHN0cmNweSAobmV3X25hbWUsIHN5bV9uYW1lKTsKKwkgICAgICBzcHJpbnRmIChuZXdfbmFtZSArIGxlbiAtIDEwLCAiXyUwOHgiLCAoaW50KXN5bV9zZWMpOworCisJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wgd2l0aCBhcmd1bWVudCBsb2NhdGlvbiBpbmZvLgorCQkgV2UgbmVlZCB0byBlbnRlciBpdCBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkgICAgICBhcmdzX2hhc2ggPSBlbGYzMl9ocHBhX2FyZ3NfaGFzaF9sb29rdXAgKGFyZ3NfaGFzaF90YWJsZSwKKwkJCQkJCSAgICAgICBuZXdfbmFtZSwgdHJ1ZSwKKwkJCQkJCSAgICAgICB0cnVlKTsKKwkgICAgICBmcmVlIChuZXdfbmFtZSk7CisJICAgICAgaWYgKGFyZ3NfaGFzaCA9PSBOVUxMKQorCQl7CisJCSAgZnJlZSAoY29udGVudHMpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICAgIGFyZ3NfaGFzaC0+YXJnX2JpdHMgPSB2YWx1ZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZWxzZSBpZiAoY3VycmVudF9pbmRleCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkgICAgICBjdXJyZW50X2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87CisJICAgICAgaCA9IGVsZl9zeW1faGFzaGVzKGlucHV0X2JmZClbY3VycmVudF9pbmRleF07CisJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wgd2l0aCBhcmd1bWVudCBsb2NhdGlvbgorCQkgaW5mb3JtYXRpb24uICBXZSBuZWVkIHRvIGVudGVyIGl0IGludG8gdGhlIGhhc2ggdGFibGUuICAqLworCSAgICAgIGFyZ3NfaGFzaCA9IGVsZjMyX2hwcGFfYXJnc19oYXNoX2xvb2t1cCAoYXJnc19oYXNoX3RhYmxlLAorCQkJCQkJICAgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCisJCQkJCQkgICAgICAgdHJ1ZSwgdHJ1ZSk7CisJICAgICAgaWYgKGFyZ3NfaGFzaCA9PSBOVUxMKQorCQl7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgZnJlZSAoY29udGVudHMpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICAgIGFyZ3NfaGFzaC0+YXJnX2JpdHMgPSB2YWx1ZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIGZyZWUgKGNvbnRlbnRzKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorICBmcmVlIChjb250ZW50cyk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBVbmRvIHRoZSBnZW5lcmljIEVMRiBjb2RlJ3Mgc3VidHJhY3Rpb24gb2Ygc2VjdGlvbi0+dm1hIGZyb20gdGhlCisgICB2YWx1ZSBvZiBlYWNoIGV4dGVybmFsIHN5bWJvbC4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKKyAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBiZmRfdm1hICp2YWxwOworeworICAqdmFscCArPSAoKnNlY3ApLT52bWE7CisgIHJldHVybiB0cnVlOworfQorCisvKiBEZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHN0dWIgbmVlZGVkIHRvIHBlcmZvcm0gYSBjYWxsIGFzc3VtaW5nIHRoZQorICAgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGZvciBjYWxsZXIgYW5kIGNhbGxlZSBhcmUgaW4gQ0FMTEVSIGFuZCBDQUxMRUUKKyAgIGZvciBhIGNhbGwgZnJvbSBMT0NBVElPTiB0byBERVNUSU5BVElPTi4gIENvcHkgdGhlIG5hbWUgaW50byBTVFVCX05BTUUuICAqLworCitzdGF0aWMgdm9pZAorZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGNhbGxlciwgY2FsbGVlLCBsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSkKKyAgICAgdW5zaWduZWQgaW50IGNhbGxlciwgY2FsbGVlOworICAgICBiZmRfdm1hIGxvY2F0aW9uLCBkZXN0aW5hdGlvbjsKKyAgICAgY2hhciAqc3R1Yl9uYW1lOworeworICBhcmdfcmVsb2NfdHlwZSBhcmdfcmVsb2NfdHlwZXNbNV07CisKKyAgaWYgKGVsZjMyX2hwcGFfYXJnX3JlbG9jX25lZWRlZCAoY2FsbGVyLCBjYWxsZWUsIGFyZ19yZWxvY190eXBlcykpCisgICAgeworICAgICAgYXJnX3JlbG9jX2xvY2F0aW9uIGk7CisgICAgICAvKiBGaWxsIGluIHRoZSBiYXNpYyB0ZW1wbGF0ZS4gICovCisgICAgICBzdHJjcHkgKHN0dWJfbmFtZSwgIl9fWFhfWFhfWFhfWFhfWFhfc3R1Yl8iKTsKKworICAgICAgLyogTm93IGZpeCB0aGUgc3BlY2lmaWNzLiAgKi8KKyAgICAgIGZvciAoaSA9IEFSRzA7IGkgPD0gUkVUOyBpKyspCisJc3dpdGNoIChhcmdfcmVsb2NfdHlwZXNbaV0pCisJICB7CisJICAgIGNhc2UgTk86CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgMl0gPSAnTic7CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgM10gPSAnTyc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgR0Y6CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgMl0gPSAnRyc7CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgM10gPSAnRic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRkc6CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgMl0gPSAnRic7CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgM10gPSAnRyc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgR0Q6CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgMl0gPSAnRyc7CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgM10gPSAnRCc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgREc6CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgMl0gPSAnRCc7CisJICAgICAgc3R1Yl9uYW1lWzMgKiBpICsgM10gPSAnRyc7CisJICAgICAgYnJlYWs7CisJICB9CisgICAgfQorICBlbHNlCisgICAgc3RyY3B5IChzdHViX25hbWUsICJfX19fX2xvbmdfYnJhbmNoX3N0dWJfIik7Cit9CisKKy8qIERldGVybWluZSBpZiBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWIgaXMgbmVlZGVkIHRvIHBlcmZvcm0gYQorICAgY2FsbCBhc3N1bWluZyB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGZvciBjYWxsZXIgYW5kIGNhbGxlZQorICAgYXJlIGluIENBTExFUiBhbmQgQ0FMTEVFLiAgUGxhY2UgdGhlIHR5cGUgb2YgcmVsb2NhdGlvbnMgKGlmIGFueSkKKyAgIGludG8gc3R1Yl90eXBlc19wLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2hwcGFfYXJnX3JlbG9jX25lZWRlZCAoY2FsbGVyLCBjYWxsZWUsIHN0dWJfdHlwZXMpCisgICAgIHVuc2lnbmVkIGludCBjYWxsZXIsIGNhbGxlZTsKKyAgICAgYXJnX3JlbG9jX3R5cGUgc3R1Yl90eXBlc1s1XTsKK3sKKyAgLyogU3BlY2lhbCBjYXNlIGZvciBubyByZWxvY2F0aW9ucy4gICovCisgIGlmIChjYWxsZXIgPT0gMCB8fCBjYWxsZWUgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGFyZ19sb2NhdGlvbiBjYWxsZXJfbG9jWzVdOworICAgICAgYXJnX2xvY2F0aW9uIGNhbGxlZV9sb2NbNV07CisKKyAgICAgIC8qIEV4dHJhY3QgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXJndW1lbnQgYW5kIHJldHVybgorCSB2YWx1ZSBvbiBib3RoIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBzaWRlcy4gICovCisgICAgICBjYWxsZXJfbG9jW0FSRzBdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlciwgQVJHMCk7CisgICAgICBjYWxsZWVfbG9jW0FSRzBdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlZSwgQVJHMCk7CisgICAgICBjYWxsZXJfbG9jW0FSRzFdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlciwgQVJHMSk7CisgICAgICBjYWxsZWVfbG9jW0FSRzFdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlZSwgQVJHMSk7CisgICAgICBjYWxsZXJfbG9jW0FSRzJdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlciwgQVJHMik7CisgICAgICBjYWxsZWVfbG9jW0FSRzJdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlZSwgQVJHMik7CisgICAgICBjYWxsZXJfbG9jW0FSRzNdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlciwgQVJHMyk7CisgICAgICBjYWxsZWVfbG9jW0FSRzNdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlZSwgQVJHMyk7CisgICAgICBjYWxsZXJfbG9jW1JFVF0gPSBFWFRSQUNUX0FSQklUUyAoY2FsbGVyLCBSRVQpOworICAgICAgY2FsbGVlX2xvY1tSRVRdID0gRVhUUkFDVF9BUkJJVFMgKGNhbGxlZSwgUkVUKTsKKworICAgICAgLyogQ2hlY2sgc29tZSBzcGVjaWFsIGNvbWJpbmF0aW9ucy4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCisJIGRlYWwgd2l0aCBkb3VibGUgcHJlY2lzaW9uIEZQIGFyZ3VtZW50cy4gICovCisgICAgICBpZiAoY2FsbGVyX2xvY1tBUkcwXSA9PSBBUl9GVSB8fCBjYWxsZXJfbG9jW0FSRzFdID09IEFSX0ZVKQorCXsKKwkgIGNhbGxlcl9sb2NbQVJHMF0gPSBBUl9GUERCTDE7CisJICBjYWxsZXJfbG9jW0FSRzFdID0gQVJfTk87CisJfQorICAgICAgaWYgKGNhbGxlcl9sb2NbQVJHMl0gPT0gQVJfRlUgfHwgY2FsbGVyX2xvY1tBUkczXSA9PSBBUl9GVSkKKwl7CisJICBjYWxsZXJfbG9jW0FSRzJdID0gQVJfRlBEQkwyOworCSAgY2FsbGVyX2xvY1tBUkczXSA9IEFSX05POworCX0KKyAgICAgIGlmIChjYWxsZWVfbG9jW0FSRzBdID09IEFSX0ZVIHx8IGNhbGxlZV9sb2NbQVJHMV0gPT0gQVJfRlUpCisJeworCSAgY2FsbGVlX2xvY1tBUkcwXSA9IEFSX0ZQREJMMTsKKwkgIGNhbGxlZV9sb2NbQVJHMV0gPSBBUl9OTzsKKwl9CisgICAgICBpZiAoY2FsbGVlX2xvY1tBUkcyXSA9PSBBUl9GVSB8fCBjYWxsZWVfbG9jW0FSRzNdID09IEFSX0ZVKQorCXsKKwkgIGNhbGxlZV9sb2NbQVJHMl0gPSBBUl9GUERCTDI7CisJICBjYWxsZWVfbG9jW0FSRzNdID0gQVJfTk87CisJfQorCisgICAgICAvKiBOb3cgbG9vayB1cCBhbnkgcmVsb2NhdGlvbiBuZWVkZWQgZm9yIGVhY2ggYXJndW1lbnQgYW5kIHRoZQorCSByZXR1cm4gdmFsdWUuICAqLworICAgICAgc3R1Yl90eXBlc1tBUkcwXSA9IGFyZ19taXNtYXRjaGVzW2NhbGxlcl9sb2NbQVJHMF1dW2NhbGxlZV9sb2NbQVJHMF1dOworICAgICAgc3R1Yl90eXBlc1tBUkcxXSA9IGFyZ19taXNtYXRjaGVzW2NhbGxlcl9sb2NbQVJHMV1dW2NhbGxlZV9sb2NbQVJHMV1dOworICAgICAgc3R1Yl90eXBlc1tBUkcyXSA9IGFyZ19taXNtYXRjaGVzW2NhbGxlcl9sb2NbQVJHMl1dW2NhbGxlZV9sb2NbQVJHMl1dOworICAgICAgc3R1Yl90eXBlc1tBUkczXSA9IGFyZ19taXNtYXRjaGVzW2NhbGxlcl9sb2NbQVJHM11dW2NhbGxlZV9sb2NbQVJHM11dOworICAgICAgc3R1Yl90eXBlc1tSRVRdID0gcmV0X21pc21hdGNoZXNbY2FsbGVyX2xvY1tSRVRdXVtjYWxsZWVfbG9jW1JFVF1dOworCisgICAgICByZXR1cm4gKHN0dWJfdHlwZXNbQVJHMF0gIT0gTk8KKwkgICAgICB8fCBzdHViX3R5cGVzW0FSRzFdICE9IE5PCisJICAgICAgfHwgc3R1Yl90eXBlc1tBUkcyXSAhPSBOTworCSAgICAgIHx8IHN0dWJfdHlwZXNbQVJHM10gIT0gTk8KKwkgICAgICB8fCBzdHViX3R5cGVzW1JFVF0gIT0gTk8pOworICAgIH0KK30KKworLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBuZWVkZWQgdG8gY2FsbCBmcm9tIExPQ0FUSU9OIHRvIERFU1RJTkFUSU9OCisgICAoYSBmdW5jdGlvbiBuYW1lZCBTWU1fTkFNRSksIHdpdGggYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIENBTExFUiBhbmQKKyAgIENBTExFRS4gIFJldHVybiB6ZXJvIGlmIG5vIHN0dWIgaXMgbmVlZGVkIHRvIHBlcmZvcm0gc3VjaCBhIGNhbGwuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YiAoY2FsbGVlLCBjYWxsZXIsIGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3ltX25hbWUpCisgICAgIHVuc2lnbmVkIGludCBjYWxsZWUsIGNhbGxlcjsKKyAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247CisgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOworeworICBhcmdfcmVsb2NfdHlwZSBhcmdfcmVsb2NfdHlwZXNbNV07CisKKyAgLyogRGV0ZXJtaW5lIGlmIGEgbG9uZyBicmFuY2ggb3IgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHViIGlzIG5lZWRlZC4KKyAgICAgSWYgYW4gYXJndW1lbnQgcmVsb2NhdGlvbiBzdHViIGlzIG5lZWRlZCwgdGhlIHJlbG9jYXRpb24gd2lsbCBiZQorICAgICBzdG9yZWQgaW50byBhcmdfcmVsb2NfdHlwZXMuICAqLworICBpZiAoISgoKGludCkobG9jYXRpb24gLSBkZXN0aW5hdGlvbikgPiAweDNmZmZmKQorCXx8ICgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkKKwl8fCBlbGYzMl9ocHBhX2FyZ19yZWxvY19uZWVkZWQgKGNhbGxlciwgY2FsbGVlLCBhcmdfcmVsb2NfdHlwZXMpKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBTb21lIGtpbmQgb2Ygc3R1YiBpcyBuZWVkZWQuICBEZXRlcm1pbmUgaG93IGJpZyBpdCBuZWVkcyB0byBiZS4KKyAgICAgRmlyc3QgY2hlY2sgZm9yIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMgYXMgdGhleSBhbHNvIGhhbmRsZQorICAgICBsb25nIGNhbGxzLiAgVGhlbiBjaGVjayBmb3IgbG9uZyBjYWxscyB0byBtaWxsaWNvZGUgYW5kIGZpbmFsbHkKKyAgICAgdGhlIG5vcm1hbCBsb25nIGNhbGxzLiAgKi8KKyAgaWYgKGFyZ19yZWxvY190eXBlc1tBUkcwXSAhPSBOTworICAgICAgfHwgYXJnX3JlbG9jX3R5cGVzW0FSRzFdICE9IE5PCisgICAgICB8fCBhcmdfcmVsb2NfdHlwZXNbQVJHMl0gIT0gTk8KKyAgICAgIHx8IGFyZ19yZWxvY190eXBlc1tBUkczXSAhPSBOTworICAgICAgfHwgYXJnX3JlbG9jX3R5cGVzW1JFVF0gIT0gTk8pCisgICAgeworICAgICAgLyogU29tZSBraW5kIG9mIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YiBpcyBuZWVkZWQuICAqLworICAgICAgdW5zaWduZWQgaW50IGxlbiA9IDE2OworICAgICAgYXJnX3JlbG9jX2xvY2F0aW9uIGk7CisKKyAgICAgIC8qIEVhY2ggR1Igb3IgRkcgcmVsb2NhdGlvbiB0YWtlcyAyIGluc25zLCBlYWNoIEdEIG9yIERHCisJIHJlbG9jYXRpb24gdGFrZXMgMyBpbnNucy4gIFBsdXMgNCBtb3JlIGluc25zIGZvciB0aGUKKyAgICAgICAgIFJQIGFkanVzdG1lbnQsIGxkaWwgJiAoYmUgfCBibGUpIGFuZCBjb3B5LiAgKi8KKyAgICAgIGZvciAoaSA9IEFSRzA7IGkgPD0gUkVUOyBpKyspCisJc3dpdGNoIChhcmdfcmVsb2NfdHlwZXNbaV0pCisJICB7CisJICAgIGNhc2UgR0Y6CisJICAgIGNhc2UgRkc6CisJICAgICAgbGVuICs9IDg7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBHRDoKKwkgICAgY2FzZSBERzoKKwkgICAgICBsZW4gKz0gMTI7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgIH0KKworICAgICAgLyogRXh0cmEgaW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgaWYgd2UncmUgcmVsb2NhdGluZyBhIHJldHVybiB2YWx1ZS4gICovCisgICAgICBpZiAoYXJnX3JlbG9jX3R5cGVzW1JFVF0gIT0gTk8pCisJbGVuICs9IDEyOworCisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgZWxzZSBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKQorICAgICAgJiYgc3RyY21wICgiJCRkeW5jYWxsIiwgc3ltX25hbWUpKQorICAgIHJldHVybiAxMjsKKyAgZWxzZQorICAgIHJldHVybiAxNjsKK30KKworLyogQnVpbGQgb25lIGxpbmtlciBzdHViIGFzIGRlZmluZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZSBlbnRyeSBHRU5fRU5UUlkuCisgICBJTl9BUkdTIGNvbnRhaW5zIHRoZSBzdHViIEJGRCBhbmQgbGluayBpbmZvIHBvaW50ZXJzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX2hwcGFfYnVpbGRfb25lX3N0dWIgKGdlbl9lbnRyeSwgaW5fYXJncykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7CisgICAgIFBUUiBpbl9hcmdzOworeworICB2b2lkICoqYXJncyA9ICh2b2lkICoqKWluX2FyZ3M7CisgIGJmZCAqc3R1Yl9iZmQgPSAoYmZkICopYXJnc1swXTsKKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKilhcmdzWzFdOworICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKmVudHJ5OworICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnN0dWJfaGFzaF90YWJsZTsKKyAgYmZkX2J5dGUgKmxvYzsKKyAgc3ltdmFsdWUgc3ltX3ZhbHVlOworICBjb25zdCBjaGFyICpzeW1fbmFtZTsKKworICAvKiBJbml0aWFsaXplIHBvaW50ZXJzIHRvIHRoZSBzdHViIGhhc2ggdGFibGUsIHRoZSBwYXJ0aWN1bGFyIGVudHJ5IHdlCisgICAgIGFyZSBidWlsZGluZyBhIHN0dWIgZm9yLCBhbmQgd2hlcmUgKGluIG1lbW9yeSkgd2Ugc2hvdWxkIHBsYWNlIHRoZSBzdHViCisgICAgIGluc3RydWN0aW9ucy4gICovCisgIGVudHJ5ID0gKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKWdlbl9lbnRyeTsKKyAgc3R1Yl9oYXNoX3RhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7CisgIGxvYyA9IHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb247CisKKyAgLyogTWFrZSBhIG5vdGUgb2YgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHN0dWJzIGZvciB0aGlzIGVudHJ5LiAgKi8KKyAgZW50cnktPm9mZnNldCA9IHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0OworCisgIC8qIFRoZSBzeW1ib2wncyBuYW1lIHN0YXJ0cyBhdCBvZmZzZXQgMjIuICAqLworICBzeW1fbmFtZSA9IGVudHJ5LT5yb290LnN0cmluZyArIDIyOworCisgIHN5bV92YWx1ZSA9IChlbnRyeS0+dGFyZ2V0X3ZhbHVlCisJICAgICAgICsgZW50cnktPnRhcmdldF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJICAgICAgICsgZW50cnktPnRhcmdldF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKKworICBpZiAoc3RybmNtcCAoIl9fX19fbG9uZ19icmFuY2hfc3R1Yl8iLCBlbnRyeS0+cm9vdC5zdHJpbmcsIDIyKSkKKyAgICB7CisgICAgICAvKiBUaGlzIG11c3QgYmUgYW4gYXJndW1lbnQgb3IgcmV0dXJuIHZhbHVlIHJlbG9jYXRpb24gc3R1Yi4gICovCisgICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgICBhcmdfcmVsb2NfbG9jYXRpb24gaTsKKyAgICAgIGJmZF9ieXRlICpiZWdpbl9sb2MgPSBsb2M7CisKKyAgICAgIC8qIEZpcnN0IHRoZSByZXR1cm4gcG9pbnRlciBhZGp1c3RtZW50LiAgRGVwZW5kaW5nIG9uIGV4YWN0IGNhbGxpbmcKKwkgc2VxdWVuY2UgdGhpcyBpbnN0cnVjdGlvbiBtYXkgYmUgc2tpcHBlZC4gICovCisgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERPX000X1IzMV9SMzEsIGxvYyk7CisgICAgICBsb2MgKz0gNDsKKworICAgICAgLyogSWYgd2UgYXJlIHJlbG9jYXRpbmcgYSByZXR1cm4gdmFsdWUsIHRoZW4gd2UncmUgZ29pbmcgdG8gaGF2ZQorCSB0byByZXR1cm4gaW50byB0aGUgc3R1Yi4gIFNvIHdlIGhhdmUgdG8gc2F2ZSBvZmYgdGhlIHVzZXIncworCSByZXR1cm4gcG9pbnRlciBpbnRvIHRoZSBzdGFjayBhdCBSUCcuICAqLworICAgICAgaWYgKHN0cm5jbXAgKGVudHJ5LT5yb290LnN0cmluZyArIDE0LCAiTk8iLCAyKSkKKwl7CisJICBiZmRfcHV0XzMyIChzdHViX2JmZCwgU1RXX1IzMV9NOFIzMCwgbG9jKTsKKwkgIGxvYyArPSA0OworCX0KKworICAgICAgLyogSXRlcmF0ZSBvdmVyIHRoZSBhcmd1bWVudCByZWxvY2F0aW9ucywgZW1pdHRpbmcgaW5zdHJ1Y3Rpb25zCisJIHRvIG1vdmUgdGhlbSBhcm91bmQgYXMgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGZvciAoaSA9IEFSRzA7IGkgPD0gQVJHMzsgaSsrKQorCXsKKwkgIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMyAqIGkgKyAyLCAiR0YiLCAyKSkKKwkgICAgeworCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBTVFdfQVJHX00xNlIzMCB8ICgoMjYgLSBpKSA8PCAxNiksIGxvYyk7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIEZMRFdfTTE2UjMwX0ZBUkcgfCAoNCArIGkpLCBsb2MgKyA0KTsKKwkgICAgICBsb2MgKz0gODsKKwkgICAgfQorCSAgZWxzZSBpZiAoIXN0cm5jbXAgKGVudHJ5LT5yb290LnN0cmluZyArIDMgKiBpICsgMiwgIkZHIiwgMikpCisJICAgIHsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRlNUV19GQVJHX00xNlIzMCB8ICg0ICsgaSksIGxvYyk7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExEV19NMTZSMzBfQVJHIHwgKCgyNiAtIGkpIDw8IDE2KSwgbG9jICsgNCk7CisJICAgICAgbG9jICs9IDg7CisJICAgIH0KKwkgIGVsc2UgaWYgKCFzdHJuY21wIChlbnRyeS0+cm9vdC5zdHJpbmcgKyAzICogaSArIDIsICJHRCIsIDIpKQorCSAgICB7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIFNUV19BUkdfTTEyUjMwIHwgKCgyNiAtIGkpIDw8IDE2KSwgbG9jKTsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgU1RXX0FSR19NMTZSMzAgfCAoKDI1IC0gaSkgPDwgMTYpLCBsb2MgKyA0KTsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRkxERF9NMTZSMzBfRkFSRyB8ICg1ICsgaSksIGxvYyArIDgpOworCSAgICAgIGxvYyArPSAxMjsKKwkgICAgfQorCSAgZWxzZSBpZiAoIXN0cm5jbXAgKGVudHJ5LT5yb290LnN0cmluZyArIDMgKiBpICsgMiwgIkRHIiwgMikpCisJICAgIHsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRlNURF9GQVJHX00xNlIzMCB8ICg1ICsgaSksIGxvYyk7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExEV19NMTJSMzBfQVJHIHwgKCgyNiAtIGkpIDw8IDE2KSwgbG9jICsgNCk7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExEV19NMTZSMzBfQVJHIHwgKCgyNSAtIGkpIDw8IDE2KSwgbG9jICsgOCk7CisJICAgICAgbG9jICs9IDEyOworCSAgICB9CisJfQorCisgICAgICAvKiBMb2FkIHRoZSBoaWdoIGJpdHMgb2YgdGhlIHRhcmdldCBhZGRyZXNzIGludG8gJXIxLiAgKi8KKyAgICAgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsIExESUxfUjEsCisJCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9scnNlbCksIDIxKTsKKyAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MpOworICAgICAgbG9jICs9IDQ7CisKKyAgICAgIC8qIElmIHdlIGFyZSByZWxvY2F0aW5nIGEgcmV0dXJuIHZhbHVlLCB0aGVuIHdlJ3JlIGdvaW5nIHRvIGhhdmUKKwkgdG8gcmV0dXJuIGludG8gdGhlIHN0dWIsIHRoZW4gcGVyZm9ybSB0aGUgcmV0dXJuIHZhbHVlIHJlbG9jYXRpb24uICAqLworICAgICAgaWYgKHN0cm5jbXAgKGVudHJ5LT5yb290LnN0cmluZyArIDE0LCAiTk8iLCAyKSkKKwl7CisJICAvKiBUbyByZXR1cm4gdG8gdGhlIHN0dWIgd2UgImJsZSIgdG8gdGhlIHRhcmdldCBhbmQgY29weSB0aGUgcmV0dXJuCisJICAgICBwb2ludGVyIGZyb20gJXIzMSBpbnRvICVyMi4gICovCisJICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLAorCQkJCSAgICBCTEVfU1I0X1IxLAorCQkJCSAgICBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAwLAorCQkJCQkJICAgICAgIGVfcnJzZWwpID4+IDIsCisJCQkJICAgIDE3KTsKKwkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBpbnNuLCBsb2MpOworCSAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIENPUFlfUjMxX1IyLCBsb2MgKyA0KTsKKworCSAgLyogUmVsb2FkIHRoZSByZXR1cm4gcG9pbnRlciBmb3Igb3VyIGNhbGxlciBmcm9tIHRoZSBzdGFjay4gICovCisJICBiZmRfcHV0XzMyIChzdHViX2JmZCwgTERXX004UjMwX1IzMSwgbG9jICsgOCk7CisJICBsb2MgKz0gMTI7CisKKwkgIC8qIFBlcmZvcm0gdGhlIHJldHVybiB2YWx1ZSByZWxvY2F0aW9uLiAgKi8KKwkgIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMTQsICJHRiIsIDIpKQorCSAgICB7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIFNUV19BUkdfTTE2UjMwIHwgKDI4IDw8IDE2KSwgbG9jKTsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRkxEV19NMTZSMzBfRkFSRyB8IDQsIGxvYyArIDQpOworCSAgICAgIGxvYyArPSA4OworCSAgICB9CisJICBlbHNlIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMTQsICJGRyIsIDIpKQorCSAgICB7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIEZTVFdfRkFSR19NMTZSMzAgfCA0LCBsb2MpOworCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBMRFdfTTE2UjMwX0FSRyB8ICgyOCA8PCAxNiksIGxvYyArIDQpOworCSAgICAgIGxvYyArPSA4OworCSAgICB9CisJICBlbHNlIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMiwgIkdEIiwgMikpCisJICAgIHsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgU1RXX0FSR19NMTJSMzAgfCAoMjggPDwgMTYpLCBsb2MpOworCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBTVFdfQVJHX00xNlIzMCB8ICgyOSA8PCAxNiksIGxvYyArIDQpOworCSAgICAgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBGTEREX00xNlIzMF9GQVJHIHwgNCwgbG9jICsgOCk7CisJICAgICAgbG9jICs9IDEyOworCSAgICB9CisJICBlbHNlIGlmICghc3RybmNtcCAoZW50cnktPnJvb3Quc3RyaW5nICsgMiwgIkRHIiwgMikpCisJICAgIHsKKwkgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgRlNURF9GQVJHX00xNlIzMCB8IDQsIGxvYyk7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExEV19NMTJSMzBfQVJHIHwgKDI4IDw8IDE2KSwgbG9jICsgNCk7CisJICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExEV19NMTZSMzBfQVJHIHwgKDI5IDw8IDE2KSwgbG9jICsgOCk7CisJICAgICAgbG9jICs9IDEyOworCSAgICB9CisJICAvKiBCcmFuY2ggYmFjayB0byB0aGUgdXNlcidzIGNvZGUgbm93LiAgKi8KKwkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBCVl9OXzBfUjMxLCBsb2MpOworCSAgbG9jICs9IDQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5vIHJldHVybiB2YWx1ZSByZWxvY2F0aW9uLCBzbyB3ZSBjYW4gc2ltcGx5ICJiZSIgdG8gdGhlCisJICAgICB0YXJnZXQgYW5kIGNvcHkgb3V0IHJldHVybiBwb2ludGVyIGludG8gJXIyLiAgKi8KKwkgIGluc24gPSBocHBhX3JlYnVpbGRfaW5zbiAoc3R1Yl9iZmQsIEJFX1NSNF9SMSwKKwkJCQkgICAgaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwKKwkJCQkJCSAgICAgICBlX3Jyc2VsKSA+PiAyLCAxNyk7CisJICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jKTsKKwkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBDT1BZX1IzMV9SMiwgbG9jICsgNCk7CisJICBsb2MgKz0gODsKKwl9CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgbG9jYXRpb24gYW5kIG9mZnNldHMuICAqLworICAgICAgc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbiArPSAobG9jIC0gYmVnaW5fbG9jKTsKKyAgICAgIHN0dWJfaGFzaF90YWJsZS0+b2Zmc2V0ICs9IChsb2MgLSBiZWdpbl9sb2MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSBvbmUgb2YgdHdvIHZhcmlhbnQgbG9uZyBicmFuY2ggc3R1YnMuICBPbmUgZm9yICQkZHluY2FsbCBhbmQKKwkgbm9ybWFsIGNhbGxzLCB0aGUgb3RoZXIgZm9yIGNhbGxzIHRvIG1pbGxpY29kZS4gICovCisgICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgICBpbnQgbWlsbGljb2RlX2NhbGwgPSAwOworCisgICAgICBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKSAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCisJbWlsbGljb2RlX2NhbGwgPSAxOworCisgICAgICAvKiBGaXJzdCB0aGUgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudC4gIERlcGVuZGluZyBvbiBleGFjdCBjYWxsaW5nCisJIHNlcXVlbmNlIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IGJlIHNraXBwZWQuICAqLworICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExET19NNF9SMzFfUjMxLCBsb2MpOworCisgICAgICAvKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgbG9uZyBicmFuY2ggaXRzZWxmLiAgQSBsb25nIGJyYW5jaAorCSBpcyBmb3JtZWQgd2l0aCAibGRpbCIgbG9hZGluZyB0aGUgdXBwZXIgYml0cyBvZiB0aGUgdGFyZ2V0IGFkZHJlc3MKKwkgaW50byBhIHJlZ2lzdGVyLCB0aGVuIGJyYW5jaGluZyB3aXRoICJiZSIgd2hpY2ggYWRkcyBpbiB0aGUgbG93ZXIgYml0cy4KKwkgTG9uZyBicmFuY2hlcyB0byBtaWxsaWNvZGUgbnVsbGlmeSB0aGUgZGVsYXkgc2xvdCBvZiB0aGUgImJlIi4gICovCisgICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBMRElMX1IxLAorCQkJCWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsIGVfbHJzZWwpLCAyMSk7CisgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgNCk7CisgICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBCRV9TUjRfUjEgfCAobWlsbGljb2RlX2NhbGwgPyAyIDogMCksCisJCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9ycnNlbCkgPj4gMiwKKwkJCQkxNyk7CisgICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgOCk7CisKKyAgICAgIGlmICghbWlsbGljb2RlX2NhbGwpCisJeworCSAgLyogVGhlIHNlcXVlbmNlIHRvIGNhbGwgdGhpcyBzdHViIHBsYWNlcyB0aGUgcmV0dXJuIHBvaW50ZXIgaW50byAlcjMxLAorCSAgICAgdGhlIGZpbmFsIHRhcmdldCBleHBlY3RzIHRoZSByZXR1cm4gcG9pbnRlciBpbiAlcjIsIHNvIGNvcHkgdGhlCisJICAgICAgcmV0dXJuIHBvaW50ZXIgaW50byB0aGUgcHJvcGVyIHJlZ2lzdGVyLiAgKi8KKwkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBDT1BZX1IzMV9SMiwgbG9jICsgMTIpOworCisJICAvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGFuZCBvZmZzZXRzLiAgKi8KKwkgIHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb24gKz0gMTY7CisJICBzdHViX2hhc2hfdGFibGUtPm9mZnNldCArPSAxNjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCisJICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IDEyOworCSAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gMTI7CisJfQorCisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogRXh0ZXJuYWwgZW50cnkgcG9pbnRzIGZvciBzaXppbmcgYW5kIGJ1aWxkaW5nIGxpbmtlciBzdHVicy4gICovCisKKy8qIEJ1aWxkIGFsbCB0aGUgc3R1YnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG91dHB1dCBmaWxlLiAgVGhlCisgICBzdHVicyBhcmUga2VwdCBpbiBhIGhhc2ggdGFibGUgYXR0YWNoZWQgdG8gdGhlIG1haW4gbGlua2VyIGhhc2gKKyAgIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGhwcGFlbGZfZmluaXNoIGluIHRoZSBsaW5rZXIuICAqLworCitib29sZWFuCitlbGYzMl9ocHBhX2J1aWxkX3N0dWJzIChzdHViX2JmZCwgaW5mbykKKyAgICAgYmZkICpzdHViX2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIC8qIFRoZSBzdHViIEJGRCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCisgIGFzZWN0aW9uICpzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKKyAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIHZvaWQgKmFyZ3NbMl07CisKKyAgLyogU28gd2UgY2FuIHBhc3MgYm90aCB0aGUgQkZEIGZvciB0aGUgc3R1YnMgYW5kIHRoZSBsaW5rIGluZm8KKyAgICAgc3RydWN0dXJlIHRvIHRoZSByb3V0aW5lIHdoaWNoIGFjdHVhbGx5IGJ1aWxkcyBzdHVicy4gICovCisgIGFyZ3NbMF0gPSBzdHViX2JmZDsKKyAgYXJnc1sxXSA9IGluZm87CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIGxpbmtlciBzdHVicy4gICovCisgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMpOworICBzdHViX3NlYy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChzdHViX2JmZCwgc2l6ZSk7CisgIGlmIChzdHViX3NlYy0+Y29udGVudHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHRhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7CisgIHRhYmxlLT5sb2NhdGlvbiA9IHN0dWJfc2VjLT5jb250ZW50czsKKworICAvKiBCdWlsZCB0aGUgc3R1YnMgYXMgZGlyZWN0ZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCisgIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiwgYXJncyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERldGVybWluZSBhbmQgc2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gZm9yIGEgZmluYWwgbGluay4KKworICAgVGhlIGJhc2ljIGlkZWEgaGVyZSBpcyB0byBleGFtaW5lIGFsbCB0aGUgcmVsb2NhdGlvbnMgbG9va2luZyBmb3IKKyAgIFBDLXJlbGF0aXZlIGNhbGxzIHRvIGEgdGFyZ2V0IHRoYXQgaXMgdW5yZWFjaGFibGUgd2l0aCBhICJibCIKKyAgIGluc3RydWN0aW9uIG9yIGNhbGxzIHdoZXJlIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBkaXNhZ3JlZSBvbiB0aGUKKyAgIGxvY2F0aW9uIG9mIHRoZWlyIGFyZ3VtZW50cyBvciByZXR1cm4gdmFsdWUuICAqLworCitib29sZWFuCitlbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfYmZkLCBvdXRwdXRfYmZkLCBsaW5rX2luZm8pCisgICAgIGJmZCAqc3R1Yl9iZmQ7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKK3sKKyAgYmZkICppbnB1dF9iZmQ7CisgIGFzZWN0aW9uICpzZWN0aW9uLCAqc3R1Yl9zZWMgPSAwOworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywgKmlzeW0sICoqYWxsX2xvY2FsX3N5bXM7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0X3N5bXMsICplc3ltOworICB1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIGJmZF9jb3VudCA9IDA7CisgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlID0gMDsKKyAgc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlICphcmdzX2hhc2hfdGFibGUgPSAwOworCisgIC8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KKyAgc3R1Yl9oYXNoX3RhYmxlID0gKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKikKKwkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSkpKTsKKyAgaWYgKCFzdHViX2hhc2hfdGFibGUpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKCFlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZV9pbml0IChzdHViX2hhc2hfdGFibGUsIHN0dWJfYmZkLAorCQkJCQllbGYzMl9ocHBhX3N0dWJfaGFzaF9uZXdmdW5jKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBMaWtld2lzZSBmb3IgdGhlIGFyZ3VtZW50IGxvY2F0aW9uIGhhc2ggdGFibGUuICAqLworICBhcmdzX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX2FyZ3NfaGFzaF90YWJsZSAqKQorCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlKSkpOworICBpZiAoIWFyZ3NfaGFzaF90YWJsZSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoIWVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlX2luaXQgKGFyZ3NfaGFzaF90YWJsZSwKKwkJCQkJZWxmMzJfaHBwYV9hcmdzX2hhc2hfbmV3ZnVuYykpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogQXR0YWNoIHRoZSBoYXNoIHRhYmxlcyB0byB0aGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KKyAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IHN0dWJfaGFzaF90YWJsZTsKKyAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPmFyZ3NfaGFzaF90YWJsZSA9IGFyZ3NfaGFzaF90YWJsZTsKKworICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGlucHV0IEJGRHMuICAqLworICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkczsKKyAgICAgICBpbnB1dF9iZmQgIT0gTlVMTDsKKyAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKKyAgICAgYmZkX2NvdW50Kys7CisKKyAgLyogV2Ugd2FudCB0byByZWFkIGluIHN5bWJvbCBleHRlbnNpb24gcmVjb3JkcyBvbmx5IG9uY2UuICBUbyBkbyB0aGlzCisgICAgIHdlIG5lZWQgdG8gcmVhZCBpbiB0aGUgbG9jYWwgc3ltYm9scyBpbiBwYXJhbGxlbCBhbmQgc2F2ZSB0aGVtIGZvcgorICAgICBsYXRlciB1c2U7IHNvIGhvbGQgcG9pbnRlcnMgdG8gdGhlIGxvY2FsIHN5bWJvbHMgaW4gYW4gYXJyYXkuICAqLworICBhbGxfbG9jYWxfc3ltcworICAgID0gKEVsZl9JbnRlcm5hbF9TeW0gKiopIGJmZF9tYWxsb2MgKHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSAqKQorCQkJCQkqIGJmZF9jb3VudCk7CisgIGlmIChhbGxfbG9jYWxfc3ltcyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBtZW1zZXQgKGFsbF9sb2NhbF9zeW1zLCAwLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0gKikgKiBiZmRfY291bnQpOworCisgIC8qIFdhbGsgb3ZlciBhbGwgdGhlIGlucHV0IEJGRHMgYWRkaW5nIGVudHJpZXMgdG8gdGhlIGFyZ3MgaGFzaCB0YWJsZQorICAgICBmb3IgYWxsIHRoZSBleHRlcm5hbCBmdW5jdGlvbnMuICAqLworICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkcywgaW5kZXggPSAwOworICAgICAgIGlucHV0X2JmZCAhPSBOVUxMOworICAgICAgIGlucHV0X2JmZCA9IGlucHV0X2JmZC0+bGlua19uZXh0LCBpbmRleCsrKQorICAgIHsKKyAgICAgIC8qIFdlJ2xsIG5lZWQgdGhlIHN5bWJvbCB0YWJsZSBpbiBhIHNlY29uZC4gICovCisgICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKyAgICAgIGlmIChzeW10YWJfaGRyLT5zaF9pbmZvID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIFdlIG5lZWQgYW4gYXJyYXkgb2YgdGhlIGxvY2FsIHN5bWJvbHMgYXR0YWNoZWQgdG8gdGhlIGlucHV0IGJmZC4KKwkgVW5mb3J0dW5hdGVseSwgd2UncmUgZ29pbmcgdG8gaGF2ZSB0byByZWFkICYgc3dhcCB0aGVtIGluLiAgKi8KKyAgICAgIGxvY2FsX3N5bXMKKwk9IChFbGZfSW50ZXJuYWxfU3ltICopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KKwkJCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKKyAgICAgIGlmIChsb2NhbF9zeW1zID09IE5VTEwpCisJeworCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQorCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOworCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOworCSAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgICAgYWxsX2xvY2FsX3N5bXNbaW5kZXhdID0gbG9jYWxfc3ltczsKKworICAgICAgZXh0X3N5bXMKKwk9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbworCQkJCQkgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKKyAgICAgIGlmIChleHRfc3ltcyA9PSBOVUxMKQorCXsKKwkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKKwkgICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQorCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKKwkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKKwkgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkgIHx8IGJmZF9yZWFkIChleHRfc3ltcywgMSwKKwkJICAgICAgIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSksIGlucHV0X2JmZCkKKwkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkKKwl7CisJICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCisJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKKwkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7CisJICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7CisJICBmcmVlIChleHRfc3ltcyk7CisJICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKyAgICAgIC8qIFN3YXAgdGhlIGxvY2FsIHN5bWJvbHMgaW4uICAqLworICAgICAgaXN5bSA9IGxvY2FsX3N5bXM7CisgICAgICBlc3ltID0gZXh0X3N5bXM7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltdGFiX2hkci0+c2hfaW5mbzsgaSsrLCBlc3ltKyssIGlzeW0rKykKKwkgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW0pOworCisgICAgICAvKiBOb3cgd2UgY2FuIGZyZWUgdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLworICAgICAgZnJlZSAoZXh0X3N5bXMpOworCisgICAgICBpZiAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvIChpbnB1dF9iZmQsIHN5bXRhYl9oZHIsIGFyZ3NfaGFzaF90YWJsZSwKKwkJCQkgICAgICAgbG9jYWxfc3ltcykgPT0gZmFsc2UpCisJeworCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQorCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOworCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOworCSAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICAvKiBNYWdpYyBhcyB3ZSBrbm93IHRoZSBzdHViIGJmZCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCisgIHN0dWJfc2VjID0gc3R1Yl9iZmQtPnNlY3Rpb25zOworCisgIC8qIElmIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUsIHRoZW4gd2UgZG9uJ3QKKyAgICAgaGF2ZSB0byBleGFtaW5lIHRoZSByZWxvY3MuICAqLworICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQorCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKKwkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKKyAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGFyZ3VtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBhbGwgdGhlIGdsb2JhbAorICAgICBmdW5jdGlvbnMgd2UgY2FuIHN0YXJ0IGxvb2tpbmcgZm9yIHN0dWJzLiAgKi8KKyAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHMsIGluZGV4ID0gMDsKKyAgICAgICBpbnB1dF9iZmQgIT0gTlVMTDsKKyAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCwgaW5kZXgrKykKKyAgICB7CisgICAgICAvKiBXZSdsbCBuZWVkIHRoZSBzeW1ib2wgdGFibGUgaW4gYSBzZWNvbmQuICAqLworICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgICAgICBpZiAoc3ltdGFiX2hkci0+c2hfaW5mbyA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICBsb2NhbF9zeW1zID0gYWxsX2xvY2FsX3N5bXNbaW5kZXhdOworCisgICAgICAvKiBXYWxrIG92ZXIgZWFjaCBzZWN0aW9uIGF0dGFjaGVkIHRvIHRoZSBpbnB1dCBiZmQuICAqLworICAgICAgZm9yIChzZWN0aW9uID0gaW5wdXRfYmZkLT5zZWN0aW9uczsKKwkgICBzZWN0aW9uICE9IE5VTEw7CisJICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCisJeworCSAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7CisJICBFbGYzMl9FeHRlcm5hbF9SZWxhICpleHRlcm5hbF9yZWxvY3MsICplcmVsYWVuZCwgKmVyZWxhOworCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcywgKmlyZWxhZW5kLCAqaXJlbGE7CisKKwkgIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCisJICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCisJICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuICAqLworCSAgZXh0ZXJuYWxfcmVsb2NzCisJICAgID0gKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCisJICAgICAgIGJmZF9tYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50CisJCQkgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKTsKKwkgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKKwkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQorCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKKwkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7CisJICAgICAgZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKworCSAgLyogTGlrZXdpc2UgZm9yIHRoZSBpbnRlcm5hbCByZWxvY2F0aW9ucy4gICovCisJICBpbnRlcm5hbF9yZWxvY3MKKwkgICAgPSAoKEVsZl9JbnRlcm5hbF9SZWxhICopCisJICAgICAgIGJmZF9tYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpKTsKKwkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7CisJICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQorCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOworCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCisJICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCByZWxvY3MuICAqLworCSAgaW5wdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsX2hkcjsKKwkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBpbnB1dF9yZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJICAgICAgfHwgYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSwKKwkJCSAgIGlucHV0X2JmZCkgIT0gaW5wdXRfcmVsX2hkci0+c2hfc2l6ZSkKKwkgICAgeworCSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7CisJICAgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCisJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKKwkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7CisJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOworCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB9CisKKwkgIC8qIFN3YXAgaW4gdGhlIHJlbG9jcy4gICovCisJICBlcmVsYSA9IGV4dGVybmFsX3JlbG9jczsKKwkgIGVyZWxhZW5kID0gZXJlbGEgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKKwkgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOworCSAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhKyspCisJICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbiAoaW5wdXRfYmZkLCBlcmVsYSwgaXJlbGEpOworCisJICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGV4dGVybmFsIHJlbG9jcywgZnJlZSB0aGVtLiAgKi8KKwkgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7CisKKwkgIC8qIE5vdyBleGFtaW5lIGVhY2ggcmVsb2NhdGlvbi4gICovCisJICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKKwkgIGlyZWxhZW5kID0gaXJlbGEgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKKwkgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrKQorCSAgICB7CisJICAgICAgbG9uZyByX3R5cGUsIGNhbGxlZV9hcmdzLCBjYWxsZXJfYXJncywgc2l6ZV9vZl9zdHViOworCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKKwkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGFzaDsKKwkgICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnN0dWJfaGFzaDsKKwkgICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9hcmdzX2hhc2hfZW50cnkgKmFyZ3NfaGFzaDsKKwkgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisJICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7CisJICAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7CisJICAgICAgc3ltdmFsdWUgc3ltX3ZhbHVlOworCSAgICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOworCSAgICAgIGNoYXIgKm5ld19uYW1lID0gTlVMTDsKKworCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbGEtPnJfaW5mbyk7CisJICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKKworCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQorCQl7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKwkJICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCisJCSAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisJCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKKwkJICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7CisJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCSAgICAgIC8qIE9ubHkgbG9vayBmb3Igc3R1YnMgb24gY2FsbCBpbnN0cnVjdGlvbnMgb3IgcGxhYmVsCisJCSByZWZlcmVuY2VzLiAgKi8KKwkgICAgICBpZiAocl90eXBlICE9IFJfUEFSSVNDX1BDUkVMMTdGCisJCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDMyCisJCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDIxTAorCQkgICYmIHJfdHlwZSAhPSBSX1BBUklTQ19QTEFCRUwxNFIpCisJCWNvbnRpbnVlOworCisJICAgICAgLyogTm93IGRldGVybWluZSB0aGUgY2FsbCB0YXJnZXQsIGl0cyBuYW1lLCB2YWx1ZSwgc2VjdGlvbgorCQkgYW5kIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCisJICAgICAgaGFzaCA9IE5VTEw7CisJICAgICAgc3ltID0gTlVMTDsKKwkgICAgICBzeW1fc2VjID0gTlVMTDsKKwkgICAgICBpZiAocl9pbmRleCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJCXsKKwkJICAvKiBJdCdzIGEgbG9jYWwgc3ltYm9sLiAgKi8KKwkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOworCisJCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfaW5kZXg7CisJCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChpbnB1dF9iZmQpW3N5bS0+c3Rfc2huZHhdOworCQkgIHN5bV9zZWMgPSBoZHItPmJmZF9zZWN0aW9uOworCQkgIHN5bV9uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAorCQkJCQkJCSAgICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCisJCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKKwkJICBzeW1fdmFsdWUgPSAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04KKwkJCSAgICAgICA/IDAgOiBzeW0tPnN0X3ZhbHVlKTsKKwkJICBkZXN0aW5hdGlvbiA9IChzeW1fdmFsdWUKKwkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkJICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7CisKKwkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGxvY2FsCisJCSAgICAgc3ltYm9sIGluIHRoZSBzdHViIG9yIGFyZyBpbmZvIGhhc2ggdGFibGVzLiAgKi8KKwkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOworCQkgIGlmIChuZXdfbmFtZSA9PSAwKQorCQkgICAgeworCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCisJCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisJCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKKwkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOworCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICAgIH0KKwkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKKwkJICBzeW1fbmFtZSA9IG5ld19uYW1lOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogSXQncyBhbiBleHRlcm5hbCBzeW1ib2wuICAqLworCQkgIGxvbmcgaW5kZXg7CisKKwkJICBpbmRleCA9IHJfaW5kZXggLSBzeW10YWJfaGRyLT5zaF9pbmZvOworCQkgIGhhc2ggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmRleF07CisJCSAgaWYgKGhhc2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgfHwgaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkJICAgIHsKKwkJICAgICAgc3ltX3NlYyA9IGhhc2gtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkJICAgICAgc3ltX25hbWUgPSBoYXNoLT5yb290LnJvb3Quc3RyaW5nOworCQkgICAgICBzeW1fdmFsdWUgPSBoYXNoLT5yb290LnUuZGVmLnZhbHVlOworCQkgICAgICBkZXN0aW5hdGlvbiA9IChzeW1fdmFsdWUKKwkJCQkgICAgICsgc3ltX3NlYy0+b3V0cHV0X29mZnNldAorCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkgICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCisJCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisJCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKKwkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOworCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICAgIH0KKwkJfQorCisJICAgICAgYXJnc19oYXNoID0gZWxmMzJfaHBwYV9hcmdzX2hhc2hfbG9va3VwIChhcmdzX2hhc2hfdGFibGUsCisJCQkJCQkgICAgICAgc3ltX25hbWUsIGZhbHNlLCBmYWxzZSk7CisKKwkgICAgICAvKiBHZXQgYm90aCBjYWxsZXIgYW5kIGNhbGxlZSBhcmd1bWVudCBpbmZvcm1hdGlvbi4gICovCisJICAgICAgaWYgKGFyZ3NfaGFzaCA9PSBOVUxMKQorCQljYWxsZWVfYXJncyA9IDA7CisJICAgICAgZWxzZQorCQljYWxsZWVfYXJncyA9IGFyZ3NfaGFzaC0+YXJnX2JpdHM7CisKKwkgICAgICAvKiBGb3IgY2FsbHMgZ2V0IHRoZSBjYWxsZXIncyBiaXRzIGZyb20gdGhlIGFkZGVuZCBvZgorCQkgdGhlIGNhbGwgcmVsb2NhdGlvbi4gIEZvciBQTEFCRUxTIHRoZSBjYWxsZXIncyBiaXRzCisJCSBhcmUgYXNzdW1lZCB0byBoYXZlIGFsbCBhcmdzICYgcmV0dXJuIHZhbHVlcyBpbiBnZW5lcmFsCisJCSByZWdpc3RlcnMgKDB4MTU1KS4gICovCisJICAgICAgaWYgKHJfdHlwZSA9PSBSX1BBUklTQ19QQ1JFTDE3RikKKwkJY2FsbGVyX2FyZ3MgPSBIUFBBX1JfQVJHX1JFTE9DIChpcmVsYS0+cl9hZGRlbmQpOworCSAgICAgIGVsc2UKKwkJY2FsbGVyX2FyZ3MgPSAweDE1NTsKKworCSAgICAgIC8qIE5vdyBkZXRlcm1pbmUgd2hlcmUgdGhlIGNhbGwgcG9pbnQgaXMuICAqLworCSAgICAgIGxvY2F0aW9uID0gKHNlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgKyBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICsgaXJlbGEtPnJfb2Zmc2V0KTsKKworCSAgICAgIC8qIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZGVzdGluYXRpb24gZm9yIFBDUkVMIGZ1bmN0aW9uCisJCSBjYWxscyAoZWcuIHdlIGRvbid0IGNhcmUgZm9yIFBMQUJFTFMpLiAgKi8KKwkgICAgICBpZiAocl90eXBlICE9IFJfUEFSSVNDX1BDUkVMMTdGKQorCQlsb2NhdGlvbiA9IGRlc3RpbmF0aW9uOworCisJICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgKGlmIGFueSkgbGlua2VyIHN0dWIgaXMgbmVlZGVkIGFuZCBpdHMKKwkJIHNpemUgKGluIGJ5dGVzKS4gICovCisJICAgICAgc2l6ZV9vZl9zdHViID0gZWxmMzJfaHBwYV9zaXplX29mX3N0dWIgKGNhbGxlZV9hcmdzLAorCQkJCQkJICAgICAgY2FsbGVyX2FyZ3MsCisJCQkJCQkgICAgICBsb2NhdGlvbiwKKwkJCQkJCSAgICAgIGRlc3RpbmF0aW9uLAorCQkJCQkJICAgICAgc3ltX25hbWUpOworCSAgICAgIGlmIChzaXplX29mX3N0dWIgIT0gMCkKKwkJeworCQkgIGNoYXIgKnN0dWJfbmFtZTsKKwkJICB1bnNpZ25lZCBpbnQgbGVuOworCisJCSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoaXMgc3R1Yi4gICovCisJCSAgbGVuID0gc3RybGVuIChzeW1fbmFtZSk7CisJCSAgbGVuICs9IDIzOworCisJCSAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKKwkJICBpZiAoIXN0dWJfbmFtZSkKKwkJICAgIHsKKwkJICAgICAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZCBhYm92ZSBmb3IgbG9jYWwKKwkJCSBzeW1ib2xzLiAgKi8KKwkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCQkJZnJlZSAobmV3X25hbWUpOworCisJCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7CisJCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKKwkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKKwkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOworCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7CisJCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgICAgfQorCQkgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChjYWxsZXJfYXJncywgY2FsbGVlX2FyZ3MsCisJCQkJCSAgIGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3R1Yl9uYW1lKTsKKwkJICBzdHJjYXQgKHN0dWJfbmFtZSArIDIyLCBzeW1fbmFtZSk7CisKKwkJICAvKiBCZWNhdXNlIHN5bV9uYW1lIHdhcyBtYWxsb2NlZCBhYm92ZSBmb3IgbG9jYWwgc3ltYm9scy4gICovCisJCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCQkgICAgZnJlZSAobmV3X25hbWUpOworCisJCSAgc3R1Yl9oYXNoCisJCSAgICA9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX25hbWUsCisJCQkJCQkgICBmYWxzZSwgZmFsc2UpOworCQkgIGlmIChzdHViX2hhc2ggIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIHByb3BlciBzdHViIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgbm90aGluZworCQkJIGVsc2UgdG8gZG8uICAqLworCQkgICAgICBmcmVlIChzdHViX25hbWUpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYywKKwkJCQkJICAgIChiZmRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwKKwkJCQkJCQkgICAgICAgc3R1Yl9zZWMpCisJCQkJCSAgICAgKyBzaXplX29mX3N0dWIpKTsKKworCQkgICAgICAvKiBFbnRlciB0aGlzIGVudHJ5IGludG8gdGhlIGxpbmtlciBzdHViIGhhc2ggdGFibGUuICAqLworCQkgICAgICBzdHViX2hhc2gKKwkJCT0gZWxmMzJfaHBwYV9zdHViX2hhc2hfbG9va3VwIChzdHViX2hhc2hfdGFibGUsCisJCQkJCQkgICAgICAgc3R1Yl9uYW1lLCB0cnVlLCB0cnVlKTsKKwkJICAgICAgaWYgKHN0dWJfaGFzaCA9PSBOVUxMKQorCQkJeworCQkJICBmcmVlIChzdHViX25hbWUpOworCQkJICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworCQkJICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCisJCQkgICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQorCQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOworCQkJICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7CisJCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCisJCSAgICAgIC8qIFdlJ2xsIG5lZWQgdGhlc2UgdG8gZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIHRoYXQgdGhlCisJCQkgc3R1YiB3aWxsIGJyYW5jaCB0by4gICovCisJCSAgICAgIHN0dWJfaGFzaC0+dGFyZ2V0X3ZhbHVlID0gc3ltX3ZhbHVlOworCQkgICAgICBzdHViX2hhc2gtPnRhcmdldF9zZWN0aW9uID0gc3ltX3NlYzsKKwkJICAgIH0KKwkJICBmcmVlIChzdHViX25hbWUpOworCQl9CisJICAgIH0KKwkgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgaW50ZXJuYWwgcmVsb2NzLCBmcmVlIHRoZW0uICAqLworCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKwl9CisgICAgfQorICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGxvY2FsIHN5bWJvbHMsIGZyZWUgdGhlbS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKKyAgICBpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCisgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7CisgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKKyAgcmV0dXJuIHRydWU7CisKK2Vycm9yX3JldHVybjoKKyAgLyogUmV0dXJuIGdyYWNlZnVsbHksIGF2b2lkaW5nIGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gdGhlIGhhc2ggdGFibGVzLiAgKi8KKyAgaWYgKHN0dWJfaGFzaF90YWJsZSkKKyAgICB7CisgICAgICBlbGYzMl9ocHBhX2hhc2hfdGFibGUobGlua19pbmZvKS0+c3R1Yl9oYXNoX3RhYmxlID0gTlVMTDsKKyAgICAgIGZyZWUgKHN0dWJfaGFzaF90YWJsZSk7CisgICAgfQorICBpZiAoYXJnc19oYXNoX3RhYmxlKQorICAgIHsKKyAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZShsaW5rX2luZm8pLT5hcmdzX2hhc2hfdGFibGUgPSBOVUxMOworICAgICAgZnJlZSAoYXJnc19oYXNoX3RhYmxlKTsKKyAgICB9CisgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YiBzZWN0aW9uIHRvIHplcm8gc2luY2Ugd2UncmUgbmV2ZXIgZ29pbmcKKyAgICAgdG8gY3JlYXRlIHRoZW0uICAgQXZvaWRzIGxvc2luZyB3aGVuIHdlIHRyeSB0byBnZXQgaXRzIGNvbnRlbnRzCisgICAgIHRvby4gICovCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMsIDApOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIE1pc2MgQkZEIHN1cHBvcnQgY29kZS4gICovCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCWVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQlocHBhX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCisKKy8qIFN5bWJvbCBleHRlbnNpb24gc3R1ZmYuICAqLworI2RlZmluZSBiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMJCWVsZjMyX2hwcGFfc2V0X3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCQllbGYzMl9ocHBhX2luZm9fdG9faG93dG8KKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcgXAorICBlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBcCisgIGVsZjMyX2hwcGFfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAorICBlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZworCisvKiBTdHVmZiBmb3IgdGhlIEJGRCBsaW5rZXIuICAqLworI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQllbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQllbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCisgIGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKyAgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9ocHBhX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1ocHBhIgorI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfaHBwYQorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1BBUklTQworI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaHBwYS5oIGIvYmZkL2VsZjMyLWhwcGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjMzOTIwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLWhwcGEuaApAQCAtMCwwICsxLDY2IEBACisvKiBFTEYzMi9IUFBBIHN1cHBvcnQKKworICAgVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAorICAgaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKKyAgIEZlYnJ1YXJ5IDE5OTQuCisKKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnk6CisKKyAgIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQorICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCisgICBVbml2ZXJzaXR5IG9mIFV0YWgKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FTEYzMl9IUFBBX0gKKyNkZWZpbmUgX0VMRjMyX0hQUEFfSAorCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImxpYmhwcGEuaCIKKyNpbmNsdWRlICJlbGYvaHBwYS5oIgorCisjZGVmaW5lIEVMRl9IT1dUT19UQUJMRV9TSVpFCVJfUEFSSVNDX1VOSU1QTEVNRU5URUQgKyAxCisjZGVmaW5lIE5fUEFSSVNDX1JFTE9DUwkJUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCArIDEKKworLyogRGVmaW5lIGdyb3VwcyBvZiBiYXNpYyByZWxvY2F0aW9ucy4gIEZJWE1FOiAgVGhlc2Ugc2hvdWxkCisgICBiZSB0aGUgb25seSBiYXNpYyByZWxvY2F0aW9ucyBjcmVhdGVkIGJ5IEdBUy4gIFRoZSByZXN0CisgICBzaG91bGQgYmUgaW50ZXJuYWwgdG8gdGhlIEJGRCBiYWNrZW5kLiAgCisKKyAgIFRoZSBpZGVhIGlzIGJvdGggU09NIGFuZCBFTEYgZGVmaW5lIHRoZXNlIGJhc2ljIHJlbG9jYXRpb24KKyAgIHR5cGVzIHNvIHRoZXkgbWFwIGludG8gYSBTT00gb3IgRUxGIHNwZWNpZmljIHJlbG9jYXRpb24gCisgICBhcyBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZQorICAgYmV0d2VlbiB0aGUgdHdvIHRhcmdldCBvYmplY3QgZm9ybWF0cy4gICovCisKKyNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX1BBUklTQ19OT05FCisjZGVmaW5lCVJfSFBQQQkJCQlSX1BBUklTQ19ESVIzMgorI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9QQVJJU0NfRFBSRUwyMUwKKyNkZWZpbmUJUl9IUFBBX1BDUkVMX0NBTEwJCVJfUEFSSVNDX1BDUkVMMjFMCisjZGVmaW5lIFJfSFBQQV9BQlNfQ0FMTAkJCVJfUEFSSVNDX0RJUjE3RgorI2RlZmluZSBSX0hQUEFfQ09NUExFWAkJCVJfUEFSSVNDX1VOSU1QTEVNRU5URUQKKworZWxmMzJfaHBwYV9yZWxvY190eXBlICoqIGhwcGFfZWxmX2dlbl9yZWxvY190eXBlCisgIFBBUkFNUyAoKGJmZCAqLCBlbGYzMl9ocHBhX3JlbG9jX3R5cGUsIGludCwgaW50LCBpbnQsIGFzeW1ib2wgKikpOworCitib29sZWFuIGVsZjMyX2hwcGFfc2l6ZV9zdHVicworICBQQVJBTVMgKChiZmQgKiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworYm9vbGVhbiBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKyNlbmRpZiAvKiBfRUxGMzJfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTM4Ni5jIGIvYmZkL2VsZjMyLWkzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBjNjgwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLWkzODYuYwpAQCAtMCwwICsxLDE5NDMgQEAKKy8qIEludGVsIDgwMzg2LzgwNDg2LXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKKyAgIENvcHlyaWdodCAxOTkzLTE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICplbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CitzdGF0aWMgdm9pZCBlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfY2hlY2tfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKyNkZWZpbmUgVVNFX1JFTAkxCQkvKiAzODYgdXNlcyBSRUwgcmVsb2NhdGlvbnMgaW5zdGVhZCBvZiBSRUxBICovCisKKyNpbmNsdWRlICJlbGYvaTM4Ni5oIgorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfaG93dG9fdGFibGVbXT0KK3sKKyAgSE9XVE8oUl8zODZfTk9ORSwJIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X05PTkUiLAkgICAgdHJ1ZSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsZmFsc2UpLAorICBIT1dUTyhSXzM4Nl8zMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKKyAgSE9XVE8oUl8zODZfUEMzMiwJIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDMzIiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfMzg2X0dPVDMyLAkgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfMzg2X1BMVDMyLAkgMCwyLDMyLHRydWUsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QTFQzMiIsICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAorICBIT1dUTyhSXzM4Nl9DT1BZLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0NPUFkiLAkgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAorICBIT1dUTyhSXzM4Nl9HTE9CX0RBVCwgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dMT0JfREFUIiwgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAorICBIT1dUTyhSXzM4Nl9KVU1QX1NMT1QsIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0pVTVBfU0xPVCIsdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAorICBIT1dUTyhSXzM4Nl9SRUxBVElWRSwgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1JFTEFUSVZFIiwgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAorICBIT1dUTyhSXzM4Nl9HT1RPRkYsICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVE9GRiIsICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAorICBIT1dUTyhSXzM4Nl9HT1RQQywgICAgIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfR09UUEMiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKKyAgeyAxMSB9LAorICB7IDEyIH0sCisgIHsgMTMgfSwKKyAgeyAxNCB9LAorICB7IDE1IH0sCisgIHsgMTYgfSwKKyAgeyAxNyB9LAorICB7IDE4IH0sCisgIHsgMTkgfSwKKyAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbi4gICovCisgIEhPV1RPKFJfMzg2XzE2LAkgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfMTYiLAkgICAgdHJ1ZSwweGZmZmYsMHhmZmZmLGZhbHNlKSwKKyAgSE9XVE8oUl8zODZfUEMxNiwJIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDMTYiLAkgICAgdHJ1ZSwweGZmZmYsMHhmZmZmLHRydWUpLAorICBIT1dUTyhSXzM4Nl84LAkgMCwwLDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl84IiwJICAgIHRydWUsMHhmZiwweGZmLGZhbHNlKSwKKyAgSE9XVE8oUl8zODZfUEM4LAkgMCwwLDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzgiLAkgICAgdHJ1ZSwweGZmLDB4ZmYsdHJ1ZSksCit9OworCisvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeS4gICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byA9CisgIEhPV1RPIChSXzM4Nl9HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSXzM4Nl9HTlVfVlRJTkhFUklUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKTsKKworLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UuICAqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvID0KKyAgSE9XVE8gKFJfMzg2X0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl8zODZfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpOworCisjaWZkZWYgREVCVUdfR0VOX1JFTE9DCisjZGVmaW5lIFRSQUNFKHN0cikgZnByaW50ZiAoc3RkZXJyLCAiaTM4NiBiZmQgcmVsb2MgbG9va3VwICVkICglcylcbiIsIGNvZGUsIHN0cikKKyNlbHNlCisjZGVmaW5lIFRSQUNFKHN0cikKKyNlbmRpZgorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgorICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfTk9ORSIpOworICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfTk9ORSBdOworCisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zMiIpOworICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfMzIgXTsKKworICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ19DVE9SIik7CisgICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl8zMiBdOworCisgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ19QQzMyIik7CisgICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9QQzMyIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UMzIiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVDMyIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfUExUMzI6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfUExUMzIiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1BMVDMyIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfQ09QWToKKyAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9DT1BZIik7CisgICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9DT1BZIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQ6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR0xPQl9EQVQiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dMT0JfREFUIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9UOgorICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCIpOworICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfSlVNUF9TTE9UIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfUkVMQVRJVkU6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfUkVMQVRJVkUiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1JFTEFUSVZFIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UT0ZGOgorICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0dPVE9GRiIpOworICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UT0ZGIF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6CisgICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UUEMiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0dPVFBDIF07CisKKyAgICAgIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLworICAgIGNhc2UgQkZEX1JFTE9DXzE2OgorICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMTYiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2XzE2XTsKKworICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgorICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMTZfUENSRUwiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X1BDMTZdOworCisgICAgY2FzZSBCRkRfUkVMT0NfODoKKyAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzgiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2XzhdOworCisgICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKKyAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzhfUENSRUwiKTsKKyAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIFJfMzg2X1BDOF07CisKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIik7CisgICAgICByZXR1cm4gJmVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvOworCisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfVlRBQkxFX0VOVFJZIik7CisgICAgICByZXR1cm4gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgVFJBQ0UgKCJVbmtub3duIik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZWxmX2kzODZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZAkJKmFiZmQ7CisgICAgIGFyZWxlbnQJCSpjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgYWJvcnQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKK3sKKyAgZW51bSBlbGZfaTM4Nl9yZWxvY190eXBlIHR5cGU7CisKKyAgdHlwZSA9IChlbnVtIGVsZl9pMzg2X3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOworICBpZiAodHlwZSA9PSBSXzM4Nl9HTlVfVlRJTkhFUklUKQorICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG87CisgIGVsc2UgaWYgKHR5cGUgPT0gUl8zODZfR05VX1ZURU5UUlkpCisgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG87CisgIGVsc2UKKyAgICB7CisgICAgICBCRkRfQVNTRVJUICh0eXBlIDwgUl8zODZfbWF4KTsKKyAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBGSVJTVF9JTlZBTElEX1JFTE9DIHx8IHR5cGUgPiBMQVNUX0lOVkFMSURfUkVMT0MpOworICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfaG93dG9fdGFibGVbKGludCkgdHlwZV07CisgICAgfQorfQorCisvKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBsYWJlbC4gIFRoZSBVbml4V2FyZQorICAgMi4xIGNjIGdlbmVyYXRlcyB0ZW1wb3Jhcnkgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggLlgsIHNvIHdlCisgICByZWNvZ25pemUgdGhlbSBoZXJlLiAgRklYTUU6IGRvIG90aGVyIFNWUjQgY29tcGlsZXJzIGFsc28gdXNlIC5YPy4KKyAgIElmIHNvLCB3ZSBzaG91bGQgbW92ZSB0aGUgLlggcmVjb2duaXRpb24gaW50bworICAgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGlmIChuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdYJykKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Cit9CisMCisvKiBGdW5jdGlvbnMgZm9yIHRoZSBpMzg2IEVMRiBsaW5rZXIuICAqLworCisvKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCisgICBzZWN0aW9uLiAgKi8KKworI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGliYy5zby4xIgorCisvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworCisjZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2CisKKy8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlCisgICB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBpMzg2IHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KK3sKKyAgMHhmZiwgMHgzNSwJLyogcHVzaGwgY29udGVudHMgb2YgYWRkcmVzcyAqLworICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDQuICAqLworICAweGZmLCAweDI1LAkvKiBqbXAgaW5kaXJlY3QgKi8KKyAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBhZGRyZXNzIG9mIC5nb3QgKyA4LiAgKi8KKyAgMCwgMCwgMCwgMAkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KK307CisKKy8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhbiBhYnNvbHV0ZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UKKyAgIHRoaXMuICAqLworCitzdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Cit7CisgIDB4ZmYsIDB4MjUsCS8qIGptcCBpbmRpcmVjdCAqLworICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCisgIDB4NjgsCQkvKiBwdXNobCBpbW1lZGlhdGUgKi8KKyAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KKyAgMHhlOSwJCS8qIGptcCByZWxhdGl2ZSAqLworICAwLCAwLCAwLCAwCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLworfTsKKworLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Cit7CisgIDB4ZmYsIDB4YjMsIDQsIDAsIDAsIDAsCS8qIHB1c2hsIDQoJWVieCkgKi8KKyAgMHhmZiwgMHhhMywgOCwgMCwgMCwgMCwJLyogam1wICo4KCVlYngpICovCisgIDAsIDAsIDAsIDAJCQkvKiBwYWQgb3V0IHRvIDE2IGJ5dGVzLiAgKi8KK307CisKKy8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBhIFBJQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9waWNfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Cit7CisgIDB4ZmYsIDB4YTMsCS8qIGptcCAqb2Zmc2V0KCVlYngpICovCisgIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IG9mIHRoaXMgc3ltYm9sIGluIC5nb3QuICAqLworICAweDY4LAkJLyogcHVzaGwgaW1tZWRpYXRlICovCisgIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCisgIDB4ZTksCQkvKiBqbXAgcmVsYXRpdmUgKi8KKyAgMCwgMCwgMCwgMAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KK307CisKKy8qIFRoZSBpMzg2IGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKKyAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0CisgICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgorICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAorICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCisgICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLworCitzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZAoreworICAvKiBOZXh0IHNlY3Rpb24uICAqLworICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqbmV4dDsKKyAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCisgIGFzZWN0aW9uICpzZWN0aW9uOworICAvKiBOdW1iZXIgb2YgcmVsb2NzIGNvcGllZCBpbiB0aGlzIHNlY3Rpb24uICAqLworICBiZmRfc2l6ZV90eXBlIGNvdW50OworfTsKKworLyogaTM4NiBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLworCitzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7CisKKyAgLyogTnVtYmVyIG9mIFBDIHJlbGF0aXZlIHJlbG9jcyBjb3BpZWQgZm9yIHRoaXMgc3ltYm9sLiAgKi8KKyAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnBjcmVsX3JlbG9jc19jb3BpZWQ7Cit9OworCisvKiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKK307CisKKy8qIERlY2xhcmUgdGhpcyBub3cgdGhhdCB0aGUgYWJvdmUgc3RydWN0dXJlcyBhcmUgZGVmaW5lZC4gICovCisKK3N0YXRpYyBib29sZWFuIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzCisgIFBBUkFNUyAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisKKy8qIFRyYXZlcnNlIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAorICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCisgICAgKGluZm8pKSkKKworLyogR2V0IHRoZSBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCisKKyNkZWZpbmUgZWxmX2kzODZfaGFzaF90YWJsZShwKSBcCisgICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKKworLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitlbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCisJCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICB7CisgICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIENyZWF0ZSBhbiBpMzg2IEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikKKwkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKKwkJCQkgICAgICAgZWxmX2kzODZfbGlua19oYXNoX25ld2Z1bmMpKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Cit9CisKKy8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCisgICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQorICAgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2kzODZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgYmZkICpkeW5vYmo7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7CisgIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKKyAgYXNlY3Rpb24gKnNnb3Q7CisgIGFzZWN0aW9uICpzcmVsZ290OworICBhc2VjdGlvbiAqc3JlbG9jOworCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOworCisgIHNnb3QgPSBOVUxMOworICBzcmVsZ290ID0gTlVMTDsKKyAgc3JlbG9jID0gTlVMTDsKKworICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisKKyAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKKwl7CisJICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCSAgICB7CisJICAgIGNhc2UgUl8zODZfR09UMzI6CisJICAgIGNhc2UgUl8zODZfR09UT0ZGOgorCSAgICBjYXNlIFJfMzg2X0dPVFBDOgorCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKKwkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfMzg2X0dPVDMyOgorCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KKworCSAgaWYgKHNnb3QgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICAgIH0KKworCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAorCSAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKKwkgICAgeworCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKKwkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQorCQl7CisJCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWwuZ290Iik7CisJCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAorCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAorCQkJCQkJICAoU0VDX0FMTE9DCisJCQkJCQkgICB8IFNFQ19MT0FECisJCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQorCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKKwkJeworCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLworCQkgIGJyZWFrOworCQl9CisJICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisJICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJCXsKKwkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisKKwkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyAgICAgCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCisgICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCisJICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCisJCXsKKwkJICBzaXplX3Qgc2l6ZTsKKwkJICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKworCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKKwkJICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CisJCSAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOworCQkgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCisJCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKKwkJfQorCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQorCQl7CisJCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7CisKKwkgICAgICBpZiAoaW5mby0+c2hhcmVkKQorCQl7CisJCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSXzM4Nl9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgICBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCisJCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKwkJfQorCSAgICB9CisKKwkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OworCisJICBicmVhazsKKworCWNhc2UgUl8zODZfUExUMzI6CisJICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKKyAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAorICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcworICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQorICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCisKKwkgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAorICAgICAgICAgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisKKwkgIGJyZWFrOworCisJY2FzZSBSXzM4Nl8zMjoKKwljYXNlIFJfMzg2X1BDMzI6CisJICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgaXMgYSByZWxvYworICAgICAgICAgICAgIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBvciBhIG5vbiBQQyByZWxhdGl2ZSByZWxvYworICAgICAgICAgICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIHRoZW4gd2UgbmVlZCB0byBjb3B5IHRoZSByZWxvYworICAgICAgICAgICAgIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgSG93ZXZlciwgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aAorICAgICAgICAgICAgIC1Cc3ltYm9saWMsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgYSByZWxvYyBhZ2FpbnN0IGEKKyAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZQorICAgICAgICAgICAgIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEF0CisgICAgICAgICAgICAgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIHNvIGl0IGlzCisgICAgICAgICAgICAgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQgd2lsbCBiZSBzZXQKKyAgICAgICAgICAgICBsYXRlciAoaXQgaXMgbmV2ZXIgY2xlYXJlZCkuICBXZSBhY2NvdW50IGZvciB0aGF0CisgICAgICAgICAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICAgICAgICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KKwkgIGlmIChpbmZvLT5zaGFyZWQKKwkgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorCSAgICAgICYmIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSAhPSBSXzM4Nl9QQzMyCisJCSAgfHwgKGggIT0gTlVMTAorCQkgICAgICAmJiAoISBpbmZvLT5zeW1ib2xpYworCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQorCSAgICB7CisJICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQorICAgICAgICAgICAgICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCisgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MuICAqLworCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJeworCQkgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KKwkJCSAgKGFiZmQsCisJCQkgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaHN0cm5keCwKKwkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOworCQkgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKKwkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCisJCQkJCSBuYW1lICsgNCkgPT0gMCk7CisKKwkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKKwkJICBpZiAoc3JlbG9jID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGZsYWd3b3JkIGZsYWdzOworCisJCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7CisJCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKKwkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOworCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKKwkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCisJCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCisJCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgfQorCQl9CisKKwkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7CisKKwkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGFuZCB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCwgd2UgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZQorICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB3ZSBoYXZlIGVudGVyZWQgZm9yIHRoaXMgc3ltYm9sLCBzbyB0aGF0CisgICAgICAgICAgICAgICAgIHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgorICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAgICAgICAgICAgICBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgdXNpbmcgYW4gZWxmX2kzODYgbGlua2VyCisgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgaCBpcyByZWFsbHkgYSBwb2ludGVyIHRvCisgICAgICAgICAgICAgICAgIGFuIGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeS4gICovCisJICAgICAgaWYgKGggIT0gTlVMTCAmJiBpbmZvLT5zeW1ib2xpYworCQkgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfMzg2X1BDMzIpCisJCXsKKwkJICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICplaDsKKwkJICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKKworCQkgIGVoID0gKHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKikgaDsKKworCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQorCQkgICAgICBicmVhazsKKworCQkgIGlmIChwID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICopCisJCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7CisJCSAgICAgIGlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKKwkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOworCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOworCQkgICAgICBwLT5jb3VudCA9IDA7CisJCSAgICB9CisKKwkJICArK3AtPmNvdW50OworCQl9CisJICAgIH0KKworCSAgYnJlYWs7CisKKwkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKwkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KKwljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6CisJICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQorCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisJY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKKwkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCisgICByZWxvY2F0aW9uLiAgKi8KKworc3RhdGljIGFzZWN0aW9uICoKK2VsZl9pMzg2X2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Cit7CisgIGlmIChoICE9IE5VTEwpCisgICAgeworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwl7CisJY2FzZSBSXzM4Nl9HTlVfVlRJTkhFUklUOgorCWNhc2UgUl8zODZfR05VX1ZURU5UUlk6CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKKwkgICAgeworCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6CisJICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKworCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCisJICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKKwkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQorCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQorCXsKKwkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7CisJfQorICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfaTM4Nl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgLyogPz8/IEl0IHdvdWxkIHNlZW0gdGhhdCB0aGUgZXhpc3RpbmcgaTM4NiBjb2RlIGRvZXMgbm8gc29ydAorICAgICBvZiByZWZlcmVuY2UgY291bnRpbmcgb3Igd2hhdG5vdCBvbiBpdHMgR09UIGFuZCBQTFQgZW50cmllcywKKyAgICAgc28gaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdhcmJhZ2UgY29sbGVjdCB0aGVtIGF0IHRoaXMgdGltZS4gICovCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQorICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKKyAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KKyAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCisgICB1bmRlcnN0YW5kLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KKyAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKKwkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKKwkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKKwkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKKwkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOworCisgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCisgICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAorICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCisgIGlmIChoLT50eXBlID09IFNUVF9GVU5DCisgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICghIGluZm8tPnNoYXJlZAorCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDApCisJeworCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFQzMiByZWxvYyBpbiBhbiBpbnB1dAorICAgICAgICAgICAgIGZpbGUsIGJ1dCB0aGUgc3ltYm9sIHdhcyBuZXZlciByZWZlcnJlZCB0byBieSBhIGR5bmFtaWMKKyAgICAgICAgICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAorICAgICAgICAgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDMzIKKyAgICAgICAgICAgICByZWxvYyBpbnN0ZWFkLiAgKi8KKwkgIEJGRF9BU1NFUlQgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApOworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCisJIGZpcnN0IGVudHJ5LiAgKi8KKyAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKKwlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7CisKKyAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCisJIG5vdCBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhpcworCSBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgorCSBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAorCSB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisJeworCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKKwkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7CisJfQorCisgICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOworCisgICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLworICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOworCisgICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKKwkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgKz0gNDsKKworICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKKyAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCisgICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCisgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOworICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKKyAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLworCisgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKKyAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KKyAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKKyAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKKyAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKKyAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYworICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCisgICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCisgICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bworICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCisgICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKKyAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7CisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfMzg2X0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KKyAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQorICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKKyAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KKyAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcmVsOworCisgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuYnNzIik7CisgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOworICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOworICAgIH0KKworICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCisgICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLworICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7CisgIGlmIChwb3dlcl9vZl90d28gPiAzKQorICAgIHBvd2VyX29mX3R3byA9IDM7CisKKyAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCisgIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAorCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKKyAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCisgICAgeworICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBwb3dlcl9vZl90d28pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogRGVmaW5lIHRoZSBzeW1ib2wgYXMgYmVpbmcgYXQgdGhpcyBwb2ludCBpbiB0aGUgc2VjdGlvbi4gICovCisgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7CisgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7CisKKyAgLyogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgdG8gbWFrZSByb29tIGZvciB0aGUgc3ltYm9sLiAgKi8KKyAgcy0+X3Jhd19zaXplICs9IGgtPnNpemU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIGJvb2xlYW4gcGx0OworICBib29sZWFuIHJlbG9jczsKKyAgYm9vbGVhbiByZWx0ZXh0OworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOworCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKKwkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbC5nb3Qgc2VjdGlvbi4KKyAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKKyAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWwuZ290LAorICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgIGJlbG93LiAgKi8KKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJcy0+X3Jhd19zaXplID0gMDsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgc2hhcmVkIGxpbmssIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGFsbAorICAgICBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KKyAgICAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlCisgICAgIHdpbGwgbm90IGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KKyAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKKyAgICBlbGZfaTM4Nl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9pMzg2X2hhc2hfdGFibGUgKGluZm8pLAorCQkJCSBlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcywKKwkJCQkgKFBUUikgTlVMTCk7CisKKyAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCisgICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQorICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLworICBwbHQgPSBmYWxzZTsKKyAgcmVsb2NzID0gZmFsc2U7CisgIHJlbHRleHQgPSBmYWxzZTsKKyAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgYm9vbGVhbiBzdHJpcDsKKworICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKKwkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCisgICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7CisKKyAgICAgIHN0cmlwID0gZmFsc2U7CisKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKKwl7CisJICBpZiAocy0+X3Jhd19zaXplID09IDApCisJICAgIHsKKwkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQorICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KKwkgICAgICBzdHJpcCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLworCSAgICAgIHBsdCA9IHRydWU7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDApCisJeworCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCSAgICB7CisJICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCisJCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsLmJzcyBhbmQKKwkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgorCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKKwkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0CisJCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQorCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKKwkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbworCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCisJICAgICAgc3RyaXAgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OworCisJICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCisgICAgICAgICAgICAgICAgIHRoYW4gLnJlbC5wbHQuICAqLworCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLnBsdCIpICE9IDApCisJCXsKKwkJICBjb25zdCBjaGFyICpvdXRuYW1lOworCisJCSAgcmVsb2NzID0gdHJ1ZTsKKworCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKKwkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCisJCSAgICAgZW50cnkuICBUaGUgZW50cmllcyBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbgorCQkgICAgIHJlYWxseSBhcHBseSB0byB0aGUgLmdvdCBzZWN0aW9uLCB3aGljaCB3ZQorCQkgICAgIGNyZWF0ZWQgb3Vyc2VsdmVzIGFuZCBzbyBrbm93IGlzIG5vdCByZWFkb25seS4gICovCisJCSAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAorCQkJCQkJICBzLT5vdXRwdXRfc2VjdGlvbik7CisJCSAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA0KTsKKwkJICBpZiAodGFyZ2V0ICE9IE5VTEwKKwkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKKwkJICAgICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJCSAgICByZWx0ZXh0ID0gdHJ1ZTsKKwkJfQorCisJICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAorCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLworCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgIT0gMCkKKwl7CisJICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChzdHJpcCkKKwl7CisJICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisgICAgeworICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCisJIHZhbHVlcyBsYXRlciwgaW4gZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQorCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKKwkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQorCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAocGx0KQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKKwkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUwpCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChyZWxvY3MpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTFNaLCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxFTlQsCisJCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAocmVsdGV4dCkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSBpZiB3ZSBhcmUKKyAgIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCB3aXRoIC1Cc3ltYm9saWMuICBJdCBkaXNjYXJkcyB0aGUgc3BhY2UKKyAgIGFsbG9jYXRlZCB0byBjb3B5IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgd2hpY2ggYXJlCisgICBkZWZpbmVkIGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUKKyAgIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2Ugd29uJ3QgZmlsbCB0aGVtIGluIGluIHRoZQorICAgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKKyAgICAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGlnbm9yZTsKK3sKKyAgc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKnM7CisKKyAgLyogV2Ugb25seSBkaXNjYXJkIHJlbG9jcyBmb3Igc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuICAqLworICBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yIChzID0gaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICBzLT5zZWN0aW9uLT5fcmF3X3NpemUgLT0gcy0+Y291bnQgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlbG9jYXRlIGFuIGkzODYgRUxGIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBiZmQgKmR5bm9iajsKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7CisgIGFzZWN0aW9uICpzZ290OworICBhc2VjdGlvbiAqc3BsdDsKKyAgYXNlY3Rpb24gKnNyZWxvYzsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7CisKKyAgc2dvdCA9IE5VTEw7CisgIHNwbHQgPSBOVUxMOworICBzcmVsb2MgPSBOVUxMOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl90eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQKKwkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKKwljb250aW51ZTsKKyAgICAgIGlmIChyX3R5cGUgPCAwCisJICB8fCByX3R5cGUgPj0gKGludCkgUl8zODZfbWF4CisJICB8fCAocl90eXBlID49IChpbnQpIEZJUlNUX0lOVkFMSURfUkVMT0MKKwkgICAgICAmJiByX3R5cGUgPD0gKGludCkgTEFTVF9JTlZBTElEX1JFTE9DKSkKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBob3d0byA9IGVsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCisgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCXsKKwkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCisJICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCisJICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKKwkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKKwkJeworCQkgIGJmZF92bWEgdmFsOworCisJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIHZhbCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKwkJICB2YWwgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKwkJfQorCSAgICB9CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLworICAgICAgaCA9IE5VTEw7CisgICAgICBzeW0gPSBOVUxMOworICAgICAgc2VjID0gTlVMTDsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgaWYgKHJfdHlwZSA9PSBSXzM4Nl9HT1RQQworCQkgIHx8IChyX3R5cGUgPT0gUl8zODZfUExUMzIKKwkJICAgICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisJCSAgfHwgKHJfdHlwZSA9PSBSXzM4Nl9HT1QzMgorCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAorCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKKwkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCisJCSAgfHwgKGluZm8tPnNoYXJlZAorCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwkJICAgICAgJiYgKHJfdHlwZSA9PSBSXzM4Nl8zMgorCQkJICB8fCByX3R5cGUgPT0gUl8zODZfUEMzMikKKwkJICAgICAgJiYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorCQkJICAvKiBEV0FSRiB3aWxsIGVtaXQgUl8zODZfMzIgcmVsb2NhdGlvbnMgaW4gaXRzCisJCQkgICAgIHNlY3Rpb25zIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGV4dGVybmFsbHkKKwkJCSAgICAgaW4gc2hhcmVkIGxpYnJhcmllcy4gIFdlIGNhbid0IGRvIGFueXRoaW5nCisJCQkgICAgIHdpdGggdGhlbSBoZXJlLiAgKi8KKwkJCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkpKQorCQl7CisJCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQorICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCisJCSAgcmVsb2NhdGlvbiA9IDA7CisJCX0KKwkgICAgICBlbHNlIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCisJCXsKKwkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJICAgIChfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKKwkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAorCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKKwkJICByZWxvY2F0aW9uID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCSAgICB9CisJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAgIHJlbG9jYXRpb24gPSAwOworCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAorCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICByZWxvY2F0aW9uID0gMDsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoIChyX3R5cGUpCisJeworCWNhc2UgUl8zODZfR09UMzI6CisJICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAorCSAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KKwkgIGlmIChzZ290ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworCSAgICB9CisKKwkgIGlmIChoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBiZmRfdm1hIG9mZjsKKworCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7CisJICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7CisKKwkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAorCQkgIHx8IChpbmZvLT5zaGFyZWQKKwkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCisJCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQorCQl7CisJCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCisJCSAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKKwkJICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKKwkJICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UgbXVzdCBpbml0aWFsaXplCisJCSAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZQorCQkgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKKwkJICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQorCQkgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCisKKwkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsLmdvdAorCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzCisJCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLworCQkgIGlmICgob2ZmICYgMSkgIT0gMCkKKwkJICAgIG9mZiAmPSB+MTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCisJCQkJICBzZ290LT5jb250ZW50cyArIG9mZik7CisJCSAgICAgIGgtPmdvdC5vZmZzZXQgfD0gMTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJmZF92bWEgb2ZmOworCisJICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTAorCQkJICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKKworCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKKworCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCisgICAgICAgICAgICAgICAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQorICAgICAgICAgICAgICAgICBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAgKi8KKwkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCisJCW9mZiAmPSB+MTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7CisKKwkJICBpZiAoaW5mby0+c2hhcmVkKQorCQkgICAgeworCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKKwkJICAgICAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7CisKKwkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOworCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOworCisJCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJCQkJICsgb2ZmKTsKKwkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOworCQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJCQkoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKKwkJCQkJCSAgc3JlbGdvdC0+Y29udGVudHMpCisJCQkJCQkgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOworCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OworCQkgICAgfQorCisJCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7CisJCX0KKworCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOworCSAgICB9CisKKwkgIGJyZWFrOworCisJY2FzZSBSXzM4Nl9HT1RPRkY6CisJICAvKiBSZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2xvYmFsIG9mZnNldAorCSAgICAgdGFibGUuICAqLworCisJICBpZiAoc2dvdCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisJICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKwkgICAgfQorCisJICAvKiBOb3RlIHRoYXQgc2dvdC0+b3V0cHV0X29mZnNldCBpcyBub3QgaW52b2x2ZWQgaW4gdGhpcworCSAgICAgY2FsY3VsYXRpb24uICBXZSBhbHdheXMgd2FudCB0aGUgc3RhcnQgb2YgLmdvdC4gIElmIHdlCisJICAgICBkZWZpbmVkIF9HTE9CQUxfT0ZGU0VUX1RBQkxFIGluIGEgZGlmZmVyZW50IHdheSwgYXMgaXMKKwkgICAgIHBlcm1pdHRlZCBieSB0aGUgQUJJLCB3ZSBtaWdodCBoYXZlIHRvIGNoYW5nZSB0aGlzCisJICAgICBjYWxjdWxhdGlvbi4gICovCisJICByZWxvY2F0aW9uIC09IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7CisKKwkgIGJyZWFrOworCisJY2FzZSBSXzM4Nl9HT1RQQzoKKwkgIC8qIFVzZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGFzIHN5bWJvbCB2YWx1ZS4gICovCisKKwkgIGlmIChzZ290ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworCSAgICB9CisKKwkgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCisJICBicmVhazsKKworCWNhc2UgUl8zODZfUExUMzI6CisJICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCisJICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisKKwkgIC8qIFJlc29sdmUgYSBQTFQzMiByZWxvYyBhZ2FpbiBhIGxvY2FsIHN5bWJvbCBkaXJlY3RseSwKKyAgICAgICAgICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisJICBpZiAoaCA9PSBOVUxMKQorCSAgICBicmVhazsKKworCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQorCSAgICB7CisJICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcworICAgICAgICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCisgICAgICAgICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChzcGx0ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOworCSAgICB9CisKKwkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0CisJCQkrIGgtPnBsdC5vZmZzZXQpOworCisJICBicmVhazsKKworCWNhc2UgUl8zODZfMzI6CisJY2FzZSBSXzM4Nl9QQzMyOgorCSAgaWYgKGluZm8tPnNoYXJlZAorCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorCSAgICAgICYmIChyX3R5cGUgIT0gUl8zODZfUEMzMgorCQkgIHx8IChoICE9IE5VTEwKKwkJICAgICAgJiYgaC0+ZHluaW5keCAhPSAtMQorCQkgICAgICAmJiAoISBpbmZvLT5zeW1ib2xpYworCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQorCSAgICB7CisJICAgICAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7CisJICAgICAgYm9vbGVhbiBza2lwLCByZWxvY2F0ZTsKKworCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCisJCSBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1bgorCQkgdGltZS4gICovCisKKwkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCXsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCisJCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgIChpbnB1dF9iZmQsCisJCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAorCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOworCQkgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKKwkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKKwkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCisJCQkJCSBuYW1lICsgNCkgPT0gMCk7CisKKwkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKKwkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7CisJCX0KKworCSAgICAgIHNraXAgPSBmYWxzZTsKKworCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCisJCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7CisJICAgICAgZWxzZQorCQl7CisJCSAgYmZkX3ZtYSBvZmY7CisKKwkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0CisJCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKKwkJCSAgaW5wdXRfc2VjdGlvbiwKKwkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCisJCQkgIHJlbC0+cl9vZmZzZXQpKTsKKwkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKKwkJICAgIHNraXAgPSB0cnVlOworCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKKwkJfQorCisJICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJICAgICAgaWYgKHNraXApCisJCXsKKwkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOworCQkgIHJlbG9jYXRlID0gZmFsc2U7CisJCX0KKwkgICAgICBlbHNlIGlmIChyX3R5cGUgPT0gUl8zODZfUEMzMikKKwkJeworCQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5keW5pbmR4ICE9IC0xKTsKKwkJICByZWxvY2F0ZSA9IGZhbHNlOworCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X1BDMzIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCB0bworICAgICAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KKwkJICBpZiAoaCA9PSBOVUxMCisJCSAgICAgIHx8ICgoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkJCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCisJCSAgICB7CisJCSAgICAgIHJlbG9jYXRlID0gdHJ1ZTsKKwkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisJCSAgICAgIHJlbG9jYXRlID0gZmFsc2U7CisJCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2XzMyKTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAorCQkJCQkoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKKwkJCQkJICBzcmVsb2MtPmNvbnRlbnRzKQorCQkJCQkgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7CisJICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OworCisJICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG8KKwkJIG5vdCB3YW50IHRvIGZpZGRsZSB3aXRoIHRoZSBhZGRlbmQuICBPdGhlcndpc2UsIHdlCisJCSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbCB2YWx1ZSBzbyB0aGF0IGl0IGJlY29tZXMKKwkJIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICAqLworCSAgICAgIGlmICghIHJlbG9jYXRlKQorCQljb250aW51ZTsKKwkgICAgfQorCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisKKyAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAorCQkJCSAgICByZWxvY2F0aW9uLCAoYmZkX3ZtYSkgMCk7CisKKyAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKKwl7CisJICBzd2l0Y2ggKHIpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICAgICAgeworCQljb25zdCBjaGFyICpuYW1lOworCisJCWlmIChoICE9IE5VTEwpCisJCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJCWVsc2UKKwkJICB7CisJCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAorCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAorCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOworCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCisJCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJCSAgfQorCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKKwkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQkgIHJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKKyAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgYmZkICpkeW5vYmo7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcGx0OworICAgICAgYXNlY3Rpb24gKnNnb3Q7CisgICAgICBhc2VjdGlvbiAqc3JlbDsKKyAgICAgIGJmZF92bWEgcGx0X2luZGV4OworICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OworICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7CisKKyAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKKwkgaXQgdXAuICAqLworCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKworICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7CisgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7CisKKyAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCisJIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKKwkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCisJIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCisgICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOworCisgICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0CisJIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KKwkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCisgICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKKwl7CisJICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2kzODZfcGx0X2VudHJ5LAorCQkgIFBMVF9FTlRSWV9TSVpFKTsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgZ290X29mZnNldCksCisJCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX2kzODZfcGljX3BsdF9lbnRyeSwKKwkJICBQTFRfRU5UUllfU0laRSk7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBnb3Rfb2Zmc2V0LAorCQkgICAgICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAyKTsKKwl9CisKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHBsdF9pbmRleCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSwKKwkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA3KTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIC0gKGgtPnBsdC5vZmZzZXQgKyBQTFRfRU5UUllfU0laRSksCisJCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMTIpOworCisgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAorCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAorCQkgICArIGgtPnBsdC5vZmZzZXQKKwkJICAgKyA2KSwKKwkJICBzZ290LT5jb250ZW50cyArIGdvdF9vZmZzZXQpOworCisgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCisgICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgKyBnb3Rfb2Zmc2V0KTsKKyAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0pVTVBfU0xPVCk7CisgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCisJCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKKwkJCQkgKyBwbHRfaW5kZXgpKTsKKworICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCisJICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KKwkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7CisJfQorICAgIH0KKworICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNnb3Q7CisgICAgICBhc2VjdGlvbiAqc3JlbDsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOworCisgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKKwkgdXAuICAqLworCisgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKyAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOworCisgICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKKwkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCisJIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgorCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgorCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCisgICAgICBpZiAoaW5mby0+c2hhcmVkCisJICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCisJcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl8zODZfUkVMQVRJVkUpOworICAgICAgZWxzZQorCXsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOworCSAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfR0xPQl9EQVQpOworCX0KKworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAorCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCisJCQkJICsgc3JlbC0+cmVsb2NfY291bnQpKTsKKyAgICAgICsrc3JlbC0+cmVsb2NfY291bnQ7CisgICAgfQorCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOworCisgICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLworCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCisJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCisJCQkJICAgIi5yZWwuYnNzIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgICAgICByZWwucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9DT1BZKTsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKKwkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzLT5jb250ZW50cworCQkJCSArIHMtPnJlbG9jX2NvdW50KSk7CisgICAgICArK3MtPnJlbG9jX2NvdW50OworICAgIH0KKworICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLworICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCisgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQorICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqZHlub2JqOworICBhc2VjdGlvbiAqc2dvdDsKKyAgYXNlY3Rpb24gKnNkeW47CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOworICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcGx0OworICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7CisKKyAgICAgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7CisKKyAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7CisgICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7CisgICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKKwl7CisJICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBhc2VjdGlvbiAqczsKKworCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7CisKKwkgIHN3aXRjaCAoZHluLmRfdGFnKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9QTFRHT1Q6CisJICAgICAgbmFtZSA9ICIuZ290IjsKKwkgICAgICBnb3RvIGdldF92bWE7CisJICAgIGNhc2UgRFRfSk1QUkVMOgorCSAgICAgIG5hbWUgPSAiLnJlbC5wbHQiOworCSAgICBnZXRfdm1hOgorCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7CisJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfUExUUkVMU1o6CisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbC5wbHQiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKKwkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7CisJICAgICAgZWxzZQorCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfUkVMU1o6CisJICAgICAgLyogTXkgcmVhZGluZyBvZiB0aGUgU1ZSNCBBQkkgaW5kaWNhdGVzIHRoYXQgdGhlCisJCSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkIGJlCisJCSBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCByZWxvY3MgKERUX1JFTCkuICBUaGlzIGlzCisJCSB3aGF0IFNvbGFyaXMgZG9lcy4gIEhvd2V2ZXIsIFVuaXhXYXJlIGNhbiBub3QgaGFuZGxlCisJCSB0aGF0IGNhc2UuICBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxTWiBlbnRyeQorCQkgaGVyZSB0byBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UKKwkJIHRoZSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsLnBsdCB0byBmb2xsb3cgYWxsCisJCSBvdGhlciByZWxvY2F0aW9uIHNlY3Rpb25zLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CisJCSBhYm91dCBjaGFuZ2luZyB0aGUgRFRfUkVMIGVudHJ5LiAgKi8KKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOworCSAgICAgIGlmIChzICE9IE5VTEwpCisJCXsKKwkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCisJCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7CisJCSAgZWxzZQorCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOworCQl9CisJICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgaWYgKHNwbHQgJiYgc3BsdC0+X3Jhd19zaXplID4gMCkKKwl7CisJICBpZiAoaW5mby0+c2hhcmVkKQorCSAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfaTM4Nl9waWNfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2kzODZfcGx0MF9lbnRyeSwgUExUX0VOVFJZX1NJWkUpOworCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCQkgIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNCwKKwkJCSAgc3BsdC0+Y29udGVudHMgKyAyKTsKKwkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAorCQkJICBzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgsCisJCQkgIHNwbHQtPmNvbnRlbnRzICsgOCk7CisJICAgIH0KKworCSAgLyogVW5peFdhcmUgc2V0cyB0aGUgZW50c2l6ZSBvZiAucGx0IHRvIDQsIGFsdGhvdWdoIHRoYXQgZG9lc24ndAorCSAgICAgcmVhbGx5IHNlZW0gbGlrZSB0aGUgcmlnaHQgdmFsdWUuICAqLworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKKwl9CisgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IHRocmVlIGVudHJpZXMgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKKyAgICB7CisgICAgICBpZiAoc2R5biA9PSBOVUxMKQorCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7CisgICAgICBlbHNlCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAorCQkgICAgc2dvdC0+Y29udGVudHMpOworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA4KTsKKyAgICB9CisKKyAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2kzODZfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWkzODYiCisjZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfaTM4NgorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV8zODYKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQllbGZfaTM4Nl9pbmZvX3RvX2hvd3RvCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAllbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAorCQkJCQllbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKKwkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKwkJCQkJZWxmX2kzODZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX2kzODZfY2hlY2tfcmVsb2NzCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCisJCQkJCWVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAorCQkJCQllbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCisJCQkJCWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCisJCQkJCWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfaTM4Nl9nY19tYXJrX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfaTM4Nl9nY19zd2VlcF9ob29rCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0CTEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5CTEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltCTAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfRU5UUllfU0laRQorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTg2MC5jIGIvYmZkL2VsZjMyLWk4NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUzN2E3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLWk4NjAuYwpAQCAtMCwwICsxLDMzIEBACisvKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKworI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCisKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0JYmZkX2VsZjMyX2k4NjBfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAiZWxmMzItaTg2MCIKKyNkZWZpbmUgRUxGX0FSQ0gJYmZkX2FyY2hfaTg2MAorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNXzg2MAorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbTMyci5jIGIvYmZkL2VsZjMyLW0zMnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY4NTIzCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLW0zMnIuYwpAQCAtMCwwICsxLDIwODIgQEAKKy8qIE0zMlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImVsZi9tMzJyLmgiCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICosIGFzZWN0aW9uICosCisJICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9oaTE2X3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIHZvaWQgbTMycl9lbGZfcmVsb2NhdGVfaGkxNgorICBQQVJBTVMgKChiZmQgKiwgaW50LCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAorCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKK2JmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9sbzE2X3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9zZGExNl9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKK3N0YXRpYyB2b2lkIG0zMnJfaW5mb190b19ob3d0b19yZWwKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKK2Jvb2xlYW4gX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKK3ZvaWQgX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZworICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitzdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKKwkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7CisjaWYgMCAvKiBub3QgeWV0ICovCitzdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOworI2VuZGlmCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiosIGJmZF92bWEgKikpOworc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfb2JqZWN0X3AKKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKKyAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCisgIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOworc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCisgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIFBUUikpOworCisjZGVmaW5lIE5PUF9JTlNOCQkweDcwMDAKKyNkZWZpbmUgTUFLRV9QQVJBTExFTChpbnNuKQkoKGluc24pIHwgMHg4MDAwKQorCisvKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlLgorICAgVGhpcyBvbmx5IHNhdmVzIHNwYWNlIGluIGxpYnJhcmllcyBhbmQgb2JqZWN0IGZpbGVzLCBidXQgcGVyaGFwcworICAgcmVsb2NzIHdpbGwgYmUgcHV0IGluIFJPTT8gIEFsbCBpbiBhbGwgdGhvdWdoLCBSRUwgcmVsb2NzIGFyZSBhIHBhaW4KKyAgIHRvIHdvcmsgd2l0aC4gICovCisjZGVmaW5lIFVTRV9SRUwKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbTMycl9lbGZfaG93dG9fdGFibGVbXSA9Cit7CisgIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KKyAgSE9XVE8gKFJfTTMyUl9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX00zMlJfTk9ORSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX00zMlJfMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTTMyUl8xNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9NMzJSXzMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX00zMlJfMzIiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMjQgYml0IGFkZHJlc3MuICAqLworICBIT1dUTyAoUl9NMzJSXzI0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX00zMlJfMjQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMi4KKyAgICAgVGhpcyByZWxvYyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHJlbG9jYXRpb25zIGFyZSByZWxhdGl2ZSB0byBwYyAmIC00LgorICAgICBpLmUuIGJyYW5jaGVzIGluIHRoZSByaWdodCBpbnNuIHNsb3QgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBsZWZ0IGluc24KKyAgICAgc2xvdCBmb3IgcGMuICAqLworICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgorICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKKyAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCisgICAgIGFnYWluLiAgKi8KKyAgSE9XVE8gKFJfTTMyUl8xMF9QQ1JFTCwJLyogdHlwZSAqLworCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX00zMlJfMTBfUENSRUwiLAkvKiBuYW1lICovCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCisJIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLworICBIT1dUTyAoUl9NMzJSXzE4X1BDUkVMLAkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTTMyUl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgcmVsYXRpdmUgMjYgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCisgIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCisgICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAorICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKKyAgICAgYWdhaW4uICAqLworICBIT1dUTyAoUl9NMzJSXzI2X1BDUkVMLAkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyNiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTTMyUl8yNl9QQ1JFTCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIG9yJ2QgaW4uICAqLworICBIT1dUTyAoUl9NMzJSX0hJMTZfVUxPLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX00zMlJfSEkxNl9VTE8iLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBhZGRlZCBpbi4gICovCisgIEhPV1RPIChSX00zMlJfSEkxNl9TTE8sCS8qIHR5cGUgKi8KKwkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTTMyUl9ISTE2X1NMTyIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb3dlciAxNiBiaXRzIG9mIGFkZHJlc3MuICAqLworICBIT1dUTyAoUl9NMzJSX0xPMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG0zMnJfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTTMyUl9MTzE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTbWFsbCBkYXRhIGFyZWEgMTYgYml0cyBvZmZzZXQuICAqLworICBIT1dUTyAoUl9NMzJSX1NEQTE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG0zMnJfZWxmX3NkYTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX00zMlJfU0RBMTYiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAvKiBGSVhNRTogY29ycmVjdD8gKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLworICBIT1dUTyAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX00zMlJfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCisgICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCisgIEhPV1RPIChSX00zMlJfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX00zMlJfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCisgICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCit9OworDAorLyogSGFuZGxlIHRoZSBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJCSBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKiBhYmZkOworICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKiBzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqIG91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZTsKK3sKKyAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKKwkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCisgICAgeworICAgICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCisgICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworICAgIH0KKworICByZXR1cm4gbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LT5ob3d0bywKKwkJCQkgICAgIGlucHV0X3NlY3Rpb24sCisJCQkJICAgICBkYXRhLCByZWxvY19lbnRyeS0+YWRkcmVzcywKKwkJCQkgICAgIHN5bWJvbC0+c2VjdGlvbiwKKwkJCQkgICAgIChzeW1ib2wtPnZhbHVlCisJCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCksCisJCQkJICAgICByZWxvY19lbnRyeS0+YWRkZW5kKTsKK30KKworLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfTTMyUl8xMF9QQ1JFTCByZWxvYy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK20zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChhYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LAorCQkJICAgIHN5bWJvbF9zZWN0aW9uLCBzeW1ib2xfdmFsdWUsIGFkZGVuZCkKKyAgICAgYmZkICphYmZkOworICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgYXNlY3Rpb24gKnN5bWJvbF9zZWN0aW9uOworICAgICBiZmRfdm1hIHN5bWJvbF92YWx1ZTsKKyAgICAgYmZkX3ZtYSBhZGRlbmQ7Cit7CisgIGJmZF9zaWduZWRfdm1hIHJlbG9jYXRpb247CisgIHVuc2lnbmVkIGxvbmcgeDsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKKworICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCisgIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgIHJlbG9jYXRpb24gPSBzeW1ib2xfdmFsdWUgKyBhZGRlbmQ7CisgIC8qIE1ha2UgaXQgcGMgcmVsYXRpdmUuICAqLworICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAvKiBUaGVzZSBqdW1wcyBtYXNrIG9mZiB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWRkcmVzcworICAgICBiZWZvcmUgZG9pbmcgcGNyZWwgY2FsY3VsYXRpb25zLiAgKi8KKyAgcmVsb2NhdGlvbiAtPSAob2Zmc2V0ICYgLTRMKTsKKworICBpZiAocmVsb2NhdGlvbiA8IC0weDIwMCB8fCByZWxvY2F0aW9uID4gMHgxZmYpCisgICAgc3RhdHVzID0gYmZkX3JlbG9jX292ZXJmbG93OworICBlbHNlCisgICAgc3RhdHVzID0gYmZkX3JlbG9jX29rOworCisgIHggPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgb2Zmc2V0KTsKKyAgcmVsb2NhdGlvbiA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7CisgIHJlbG9jYXRpb24gPDw9IGhvd3RvLT5iaXRwb3M7CisgIHggPSAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzayk7CisgIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGRhdGEgKyBvZmZzZXQpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIEhhbmRsZSB0aGUgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jcy4KKyAgIEhJMTZfU0xPIGlzIGZvciB0aGUgYWRkMyBhbmQgbG9hZC9zdG9yZSB3aXRoIGRpc3BsYWNlbWVudCBpbnN0cnVjdGlvbnMuCisgICBISTE2X1VMTyBpcyBmb3IgdGhlIG9yMyBpbnN0cnVjdGlvbi4KKyAgIEZvciBSX00zMlJfSEkxNl9TTE8sIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBzaWduIGV4dGVuZGVkIHdoZW4gYWRkZWQgdG8KKyAgIHRoZSBoaWdoIDE2IGJ5dGVzIHNvIGlmIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBuZWdhdGl2ZSAoYml0IDE1ID09IDEpIHRoZW4KKyAgIHdlIG11c3QgYWRkIG9uZSB0byB0aGUgaGlnaCAxNiBieXRlcyAod2hpY2ggd2lsbCBnZXQgc3VidHJhY3RlZCBvZmYgd2hlbgorICAgdGhlIGxvdyAxNiBiaXRzIGFyZSBhZGRlZCkuCisgICBUaGVzZSByZWxvY3MgaGF2ZSB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gUl9NMzJSX0xPMTYgcmVsb2MKKyAgIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBMTzE2IHRvIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUKKyAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkOyB3ZSBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuCisgICBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIGVsZjMyLW1pcHMuYy4gIFdlIGFsc28gc3VwcG9ydCBhbiBhcmJpdHJhcnkKKyAgIG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNiByZWxvYy4gIFRoZQorICAgYXNzZW1ibGVyIHNvcnRzIHRoZSByZWxvY3MgdG8gZW5zdXJlIGVhY2ggSEkxNiBpbW1lZGlhdGVseSBwcmVjZWRlcyBpdHMKKyAgIExPMTYuICBIb3dldmVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMsIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBmaW5kCisgICB0aGUgcmVhbCBMTzE2IHNvIGl0IHBpY2tzIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMuICAqLworCitzdHJ1Y3QgbTMycl9oaTE2Cit7CisgIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7CisgIGJmZF9ieXRlICphZGRyOworICBiZmRfdm1hIGFkZGVuZDsKK307CisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLworCitzdGF0aWMgc3RydWN0IG0zMnJfaGkxNiAqbTMycl9oaTE2X2xpc3Q7CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK20zMnJfZWxmX2hpMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgc3RydWN0IG0zMnJfaGkxNiAqbjsKKworICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCisgICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAorICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCisgICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KKyAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICByZXQgPSBiZmRfcmVsb2Nfb2s7CisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKKyAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZWxvY2F0aW9uID0gMDsKKyAgZWxzZQorICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworCisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KKyAgbiA9IChzdHJ1Y3QgbTMycl9oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKKyAgbi0+bmV4dCA9IG0zMnJfaGkxNl9saXN0OworICBtMzJyX2hpMTZfbGlzdCA9IG47CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogSGFuZGxlIGFuIE0zMlIgRUxGIEhJMTYgcmVsb2MuICAqLworCitzdGF0aWMgdm9pZAorbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCB0eXBlLCByZWxoaSwgcmVsbG8sIGNvbnRlbnRzLCBhZGRlbmQpCisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBpbnQgdHlwZTsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYmZkX3ZtYSBhZGRlbmQ7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgYmZkX3ZtYSBhZGRsbzsKKworICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7CisKKyAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKKyAgaWYgKHR5cGUgPT0gUl9NMzJSX0hJMTZfU0xPKQorICAgIGFkZGxvID0gKChhZGRsbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOworICBlbHNlCisgICAgYWRkbG8gJj0gMHhmZmZmOworCisgIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOworCisgIC8qIFJlYWNjb3VudCBmb3Igc2lnbiBleHRlbnNpb24gb2YgbG93IHBhcnQuICAqLworICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8KKyAgICAgICYmIChhZGRlbmQgJiAweDgwMDApICE9IDApCisgICAgYWRkZW5kICs9IDB4MTAwMDA7CisKKyAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAorCSAgICAgIChpbnNuICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpLAorCSAgICAgIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKK30KKworLyogRG8gYW4gUl9NMzJSX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0CisgICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQorICAgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KKworYmZkX3JlbG9jX3N0YXR1c190eXBlCittMzJyX2VsZl9sbzE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAorCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBpZiAobTMycl9oaTE2X2xpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbTMycl9oaTE2ICpsOworCisgICAgICBsID0gbTMycl9oaTE2X2xpc3Q7CisgICAgICB3aGlsZSAobCAhPSBOVUxMKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKwkgIHVuc2lnbmVkIGxvbmcgdmFsOworCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKKwkgIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7CisKKwkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAorCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bworCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLworCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOworCSAgdmFsbG8gPSAoKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCisJCSAgICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7CisJICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOworCSAgdmFsICs9IGwtPmFkZGVuZDsKKworCSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCisJICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKKwkgICAgdmFsICs9IDB4MTAwMDA7CisKKwkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKKwkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOworCisJICBuZXh0ID0gbC0+bmV4dDsKKwkgIGZyZWUgKGwpOworCSAgbCA9IG5leHQ7CisJfQorCisgICAgICBtMzJyX2hpMTZfbGlzdCA9IE5VTEw7CisgICAgfQorCisgIC8qIE5vdyBkbyB0aGUgTE8xNiByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KKyAgcmV0dXJuIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKK30KKworLyogSGFuZGxlIHRoZSBSX00zMlJfU0RBMTYgcmVsb2MuCisgICBUaGlzIHJlbG9jIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvYmplY3RzIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEKKyAgIGFuZCB0byBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgZnJvbSB0aGF0IGFyZWEuCisgICBUaGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAorICAgaW4gdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIF9TREFfQkFTRV8uICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittMzJyX2VsZl9zZGExNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCisgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKyAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCisJICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLworICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKyAgICB9CisKKyAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSB5ZXQuICBCdXQgdGhlbiBhZ2FpbiwgdGhlIGxpbmtlcgorICAgICBtYXkgbmV2ZXIgY2FsbCB1cy4gICovCisgIGFib3J0ICgpOworfQorDAorLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBNMzJSIEVMRiByZWxvYyB0eXBlcy4gICovCisKK3N0cnVjdCBtMzJyX3JlbG9jX21hcAoreworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtMzJyX3JlbG9jX21hcCBtMzJyX3JlbG9jX21hcFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NMzJSX05PTkUgfSwKKyAgeyBCRkRfUkVMT0NfMTYsIFJfTTMyUl8xNiB9LAorICB7IEJGRF9SRUxPQ18zMiwgUl9NMzJSXzMyIH0sCisgIHsgQkZEX1JFTE9DX00zMlJfMjQsIFJfTTMyUl8yNCB9LAorICB7IEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLCBSX00zMlJfMTBfUENSRUwgfSwKKyAgeyBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwgUl9NMzJSXzE4X1BDUkVMIH0sCisgIHsgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsIFJfTTMyUl8yNl9QQ1JFTCB9LAorICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLCBSX00zMlJfSEkxNl9VTE8gfSwKKyAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywgUl9NMzJSX0hJMTZfU0xPIH0sCisgIHsgQkZEX1JFTE9DX00zMlJfTE8xNiwgUl9NMzJSX0xPMTYgfSwKKyAgeyBCRkRfUkVMT0NfTTMyUl9TREExNiwgUl9NMzJSX1NEQTE2IH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX00zMlJfR05VX1ZUSU5IRVJJVCB9LAorICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTTMyUl9HTlVfVlRFTlRSWSB9LAorfTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gMDsKKyAgICAgICBpIDwgc2l6ZW9mIChtMzJyX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk7CisgICAgICAgaSsrKQorICAgIHsKKyAgICAgIGlmIChtMzJyX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisJcmV0dXJuICZtMzJyX2VsZl9ob3d0b190YWJsZVttMzJyX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTTMyUiBFTEYgcmVsb2MuICAqLworCitzdGF0aWMgdm9pZAorbTMycl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKK3sKKyAgdW5zaWduZWQgaW50IHJfdHlwZTsKKworICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKKyAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NMzJSX21heCk7CisgIGNhY2hlX3B0ci0+aG93dG8gPSAmbTMycl9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKK30KKwwKKy8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KKyAgIGluZGV4LiAgKi8KKworYm9vbGVhbgorX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBpbnQgKnJldHZhbDsKK3sKKyAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCisgICAgeworICAgICAgKnJldHZhbCA9IFNITl9NMzJSX1NDT01NT047CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyogTTMyUiBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUgb3RoZXIKKyAgIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgorICAgcmVmZXJlbmNlZCB2aWEgb25lIHJlZ2lzdGVyLCB3aGljaCB5aWVsZHMgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgSXQgaXMKKyAgIHVwIHRvIHRoZSBjb21waWxlciB0byBlbWl0IGFuIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIHdpdGgKKyAgIF9TREFfQkFTRS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gIFRoaXMKKyAgIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVsZjMyLW1pcHMuYy4gICovCitzdGF0aWMgYXNlY3Rpb24gbTMycl9lbGZfc2NvbV9zZWN0aW9uOworc3RhdGljIGFzeW1ib2wgbTMycl9lbGZfc2NvbV9zeW1ib2w7CitzdGF0aWMgYXN5bWJvbCAqbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOworCisvKiBIYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KKwordm9pZAorX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICphc3ltOworeworICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKKworICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07CisKKyAgc3dpdGNoIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHgpCisgICAgeworICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKKyAgICAgIGlmIChtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQorCXsKKwkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KKwkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKKwkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047CisJICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOworCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbDsKKwkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7CisJICBtMzJyX2VsZl9zY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKKwkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOworCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247CisJICBtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7CisJfQorICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247CisgICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0CisgICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgaGVyZS4KKyAgIFdlIGFsc28ga2VlcCB3YXRjaGluZyBmb3Igd2hldGhlciB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2RhdGEgc3BlY2lhbAorICAgbGlua2VyIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK20zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKKyAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBiZmRfdm1hICp2YWxwOworeworICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgICYmICgqbmFtZXApWzBdID09ICdfJyAmJiAoKm5hbWVwKVsxXSA9PSAnUycKKyAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX1NEQV9CQVNFXyIpID09IDApCisgICAgeworICAgICAgLyogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdXNpbmcgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCisJIChvdXIgbmVlZHMgYXJlIHNpbXBsZXIgdGhhbiBwcGMncyBuZWVkcykuICBBbHNvCisJIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiBjdXJyZW50bHkgaGFzIGEgYnVnIHdoZXJlIGlmIGEgLnNkYXRhCisJIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMgYSBuZXcgb25lIGlzIGNyZWF0ZWQgdGhhdCBmb2xsb3dzIGl0IHdoaWNoCisJIHNjcmV3cyBvZiBfU0RBX0JBU0VfIGFkZHJlc3MgY2FsY3MgYmVjYXVzZSBvdXRwdXRfb2Zmc2V0ICE9IDAuICAqLworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7CisKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29iYmxlZCBmcm9tIGVsZjMyLXBwYy5jIGFuZCBlbGZsaW5rLmMuICAqLworCisgICAgICBpZiAocyA9PSBOVUxMKQorCXsKKwkgIGludCBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisKKwkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zZGF0YSIpOworCSAgaWYgKHMgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyk7CisJICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKTsKKwl9CisKKyAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKKwliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgaWYgKChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCSAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKKwkJCQkJCSBhYmZkLAorCQkJCQkJICJfU0RBX0JBU0VfIiwKKwkJCQkJCSBCU0ZfR0xPQkFMLAorCQkJCQkJIHMsCisJCQkJCQkgMzI3NjgsCisJCQkJCQkgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkJCSBmYWxzZSwKKwkJCQkJCSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCisJCQkJCQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworICAgIH0KKworICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCisgICAgeworICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKKyAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKKyAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047CisgICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBTREFfQkFTRSB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQorICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfU0RBX0JBU0VfIGluIHRoZSBvdXRwdXQKKyAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgorICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgorICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK20zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRwdXRfYmZkLCBpbmZvLCBlcnJvcl9tZXNzYWdlLCBwc2IpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKiplcnJvcl9tZXNzYWdlOworICAgICBiZmRfdm1hICpwc2I7Cit7CisgIGlmIChlbGZfZ3AgKG91dHB1dF9iZmQpID09IDApCisgICAgeworICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQorCWVsZl9ncCAob3V0cHV0X2JmZCkgPSAoaC0+dS5kZWYudmFsdWUKKwkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgZWxzZQorCXsKKwkgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KKwkgICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpID0gNDsKKwkgICplcnJvcl9tZXNzYWdlID0KKwkgICAgKGNvbnN0IGNoYXIgKikgXygiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIik7CisJICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKKwl9CisgICAgfQorICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKwwKKy8qIFJlbG9jYXRlIGFuIE0zMlIvRCBFTEYgc2VjdGlvbi4KKyAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCisgICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCisgICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KKworICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCisgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCisKKyAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgorICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCisgICB6ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKKyAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCisgICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCisgICBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYworICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgorCisgICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgorCisgICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgorCisgICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKKyAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KKworICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKKyAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCisgICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0CisgICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAorICAgYWNjb3JkaW5nbHkuICAqLworCitzdGF0aWMgYm9vbGVhbgorbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOworICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOworICAvKiBBc3N1bWUgc3VjY2Vzcy4gICovCisgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKworICByZWwgPSByZWxvY3M7CisgIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICB7CisgICAgICBpbnQgcl90eXBlOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworICAgICAgLyogV2UgY2FuJ3QgbW9kaWZ5IHJfYWRkZW5kIGhlcmUgYXMgZWxmX2xpbmtfaW5wdXRfYmZkIGhhcyBhbiBhc3NlcnQgdG8KKwkgZW5zdXJlIGl0J3MgemVybyAod2UgdXNlIFJFTCByZWxvY3MsIG5vdCBSRUxBKS4gIFRoZXJlZm9yZSB0aGlzCisJIHNob3VsZCBiZSBhc3NpZ25pbmcgemVybyB0byBgYWRkZW5kJywgYnV0IGZvciBjbGFyaXR5IHdlIHVzZQorCSBgcl9hZGRlbmQnLiAgKi8KKyAgICAgIGJmZF92bWEgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKyAgICAgIGJmZF92bWEgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworICAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisgICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOworCisgICAgICBoID0gTlVMTDsKKyAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOworICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTTMyUl9tYXgpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiKSwKKwkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCQkgKGludCkgcl90eXBlKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0ID0gZmFsc2U7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChyX3R5cGUgPT0gUl9NMzJSX0dOVV9WVEVOVFJZCisgICAgICAgICAgfHwgcl90eXBlID09IFJfTTMyUl9HTlVfVlRJTkhFUklUKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaG93dG8gPSBtMzJyX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKworICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAorCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisJICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgc2VjID0gTlVMTDsKKwkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBMb2NhbCBzeW1ib2wuICAqLworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOworCSAgLyogU1RUX1NFQ1RJT046IHN5bWJvbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgKi8KKwkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKKwkgICAgeworCSAgICAgIC8qIFN5bWJvbCBpc24ndCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgTm90aGluZyB0byBkby4gICovCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7CisjaWZuZGVmIFVTRV9SRUwKKwkgIC8qIFRoaXMgY2FuJ3QgYmUgZG9uZSBmb3IgVVNFX1JFTCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWVhbiBhbnl0aGluZworCSAgICAgYW5kIGVsZl9saW5rX2lucHV0X2JmZCBhc3NlcnRzIHRoaXMgc3RheXMgemVyby4gICovCisJICByZWwtPnJfYWRkZW5kID0gYWRkZW5kOworI2VuZGlmCisKKyNpZm5kZWYgVVNFX1JFTAorCSAgLyogQWRkZW5kcyBhcmUgc3RvcmVkIHdpdGggcmVsb2NzLiAgV2UncmUgZG9uZS4gICovCisJICBjb250aW51ZTsKKyNlbHNlIC8qIFVTRV9SRUwgKi8KKwkgIC8qIElmIHBhcnRpYWxfaW5wbGFjZSwgd2UgbmVlZCB0byBzdG9yZSBhbnkgYWRkaXRpb25hbCBhZGRlbmQKKwkgICAgIGJhY2sgaW4gdGhlIHNlY3Rpb24uICAqLworCSAgaWYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKKwkgICAgY29udGludWU7CisJICAvKiA/Pz8gSGVyZSBpcyBhIG5pY2UgcGxhY2UgdG8gY2FsbCBhIHNwZWNpYWxfZnVuY3Rpb24KKwkgICAgIGxpa2UgaGFuZGxlci4gICovCisJICBpZiAocl90eXBlICE9IFJfTTMyUl9ISTE2X1NMTyAmJiByX3R5cGUgIT0gUl9NMzJSX0hJMTZfVUxPKQorCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKKwkJCQkJYWRkZW5kLCBjb250ZW50cyArIG9mZnNldCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7CisKKwkgICAgICAvKiBXZSBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIGJlZm9yZSB0aGUKKwkJIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKKwkJIGl0c2VsZi4gICovCisJICAgICAgZm9yIChsb3JlbCA9IHJlbCArIDE7CisJCSAgIChsb3JlbCA8IHJlbGVuZAorCQkgICAgJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfU0xPCisJCQl8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOworCQkgICBsb3JlbCsrKQorCQljb250aW51ZTsKKwkgICAgICBpZiAobG9yZWwgPCByZWxlbmQKKwkJICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9MTzE2KQorCQl7CisJCSAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCisJCQkJCSAgY29udGVudHMsIGFkZGVuZCk7CisJCSAgciA9IGJmZF9yZWxvY19vazsKKwkJfQorCSAgICAgIGVsc2UKKwkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCisJCQkJCSAgICBhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKKwkgICAgfQorI2VuZGlmIC8qIFVTRV9SRUwgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgYmZkX3ZtYSByZWxvY2F0aW9uOworCisJICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCisJICBzeW0gPSBOVUxMOworCSAgc2VjID0gTlVMTDsKKworCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgeworCSAgICAgIC8qIExvY2FsIHN5bWJvbC4gICovCisJICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkgICAgICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7CisJICAgICAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldAorCQkJICAgICsgc3ltLT5zdF92YWx1ZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEV4dGVybmFsIHN5bWJvbC4gICovCisJICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKwkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICAgICAgc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCisJICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCQl7CisJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCisJCSAgICByZWxvY2F0aW9uID0gMDsKKwkJICBlbHNlCisJCSAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCQkgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJCX0KKwkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJCXJlbG9jYXRpb24gPSAwOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAorCQkJICBpbnB1dF9zZWN0aW9uLCBvZmZzZXQpKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICByZWxvY2F0aW9uID0gMDsKKwkJfQorCSAgICB9CisKKwkgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCisJICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQorCSAgICB7CisJICAgICAgciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOworCSAgICAgIGdvdG8gY2hlY2tfcmVsb2M7CisJICAgIH0KKworCSAgc3dpdGNoICgoaW50KSByX3R5cGUpCisJICAgIHsKKwkgICAgY2FzZSAoaW50KSBSX00zMlJfMTBfUENSRUwgOgorCSAgICAgIHIgPSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoaW5wdXRfYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwKKwkJCQkJICAgICAgY29udGVudHMsIG9mZnNldCwKKwkJCQkJICAgICAgc2VjLCByZWxvY2F0aW9uLCBhZGRlbmQpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgKGludCkgUl9NMzJSX0hJMTZfU0xPIDoKKwkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9VTE8gOgorCSAgICAgIHsKKwkJRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOworCisJCS8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQorCQkgICBMTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0IHRoZSBISSBhbmQgTE8gcmVsb2NzCisJCSAgIGl0c2VsZi4gICovCisJCWZvciAobG9yZWwgPSByZWwgKyAxOworCQkgICAgIChsb3JlbCA8IHJlbGVuZAorCQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KKwkJCSAgfHwgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9VTE8pKTsKKwkJICAgICBsb3JlbCsrKQorCQkgIGNvbnRpbnVlOworCQlpZiAobG9yZWwgPCByZWxlbmQKKwkJICAgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCisJCSAgeworCQkgICAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCisJCQkJCSAgICBjb250ZW50cywgcmVsb2NhdGlvbiArIGFkZGVuZCk7CisJCSAgICByID0gYmZkX3JlbG9jX29rOworCQkgIH0KKwkJZWxzZQorCQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCQljb250ZW50cywgb2Zmc2V0LAorCQkJCQkJcmVsb2NhdGlvbiwgYWRkZW5kKTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAoaW50KSBSX00zMlJfU0RBMTYgOgorCSAgICAgIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7CisJCW5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKKworCQlpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAorCQkgICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCisJCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCisJCSAgeworCQkgICAgYmZkX3ZtYSBzZGFfYmFzZTsKKwkJICAgIGJmZCAqb3V0X2JmZCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOworCisJCSAgICByID0gbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UgKG91dF9iZmQsIGluZm8sCisJCQkJCQkgJmVycm1zZywKKwkJCQkJCSAmc2RhX2Jhc2UpOworCQkgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCQkgICAgICB7CisJCQlyZXQgPSBmYWxzZTsKKwkJCWdvdG8gY2hlY2tfcmVsb2M7CisJCSAgICAgIH0KKworCQkgICAgLyogQXQgdGhpcyBwb2ludCBgcmVsb2NhdGlvbicgY29udGFpbnMgdGhlIG9iamVjdCdzCisJCSAgICAgICBhZGRyZXNzLiAgKi8KKwkJICAgIHJlbG9jYXRpb24gLT0gc2RhX2Jhc2U7CisJCSAgICAvKiBOb3cgaXQgY29udGFpbnMgdGhlIG9mZnNldCBmcm9tIF9TREFfQkFTRV8uICAqLworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhbiAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBzZWN0aW9uICglcykiKSwKKwkJCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCQkJICAgc3ltX25hbWUsCisJCQkJCSAgIG0zMnJfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHJfdHlwZV0ubmFtZSwKKwkJCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOworCQkgICAgLypiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsgPz8/IHdoeT8gKi8KKwkJICAgIHJldCA9IGZhbHNlOworCQkgICAgY29udGludWU7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworCSAgICBkZWZhdWx0IDoKKwkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQkgICAgY29udGVudHMsIG9mZnNldCwKKwkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICBjaGVja19yZWxvYzoKKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIGVub3VnaCB0byBnbyBpbiBhIHV0aWxpdHkuICAqLworCSAgY29uc3QgY2hhciAqbmFtZTsKKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KKwkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7CisJICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQorCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCSAgICB9CisKKwkgIGlmIChlcnJtc2cgIT0gTlVMTCkKKwkgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIG9mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgorCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgorCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7CisJICAgICAgLyogZmFsbCB0aHJvdWdoICovCisKKwkgICAgY29tbW9uX2Vycm9yOgorCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQorCQkgICAgKGluZm8sIGVycm1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgIG9mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisMCisjaWYgMCAvKiByZWxheGluZyBub3Qgc3VwcG9ydGVkIHlldCAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtMzJyLgorICAgUmVsYXhpbmcgb24gdGhlIG0zMnIgaXMgdHJpY2t5IGJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gYWxpZ25tZW50CisgICByZXF1aXJlbWVudHMgKDQgYnl0ZSBpbnN0cnVjdGlvbnMgbXVzdCBiZSBhbGlnbmVkIG9uIDQgYnl0ZSBib3VuZGFyaWVzKS4KKworICAgVGhlIGZvbGxvd2luZyByZWxheGluZyBvcHBvcnR1bml0aWVzIGFyZSBoYW5kbGVkOgorCisgICBzZXRoL2FkZDMvamwgLT4gYmwyNCBvciBibDgKKyAgIHNldGgvYWRkMyAtPiBsZDI0CisKKyAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJsMjQgLT4gYmw4IGJ1dCBnaXZlbjoKKworICAgLSA0IGJ5dGUgaW5zbnMgbXVzdCBiZSBvbiA0IGJ5dGUgYm91bmRhcmllcworICAgLSBicmFuY2ggaW5zdHJ1Y3Rpb25zIG9ubHkgYnJhbmNoIHRvIGluc25zIG9uIDQgYnl0ZSBib3VuZGFyaWVzCisKKyAgIHRoaXMgaXNuJ3QgbXVjaCBvZiBhIHdpbiBiZWNhdXNlIHRoZSBpbnNuIGluIHRoZSAyICJkZWxldGVkIiBieXRlcworICAgbXVzdCBiZWNvbWUgYSBub3AuICBXaXRoIHNvbWUgY29tcGxleGl0eSBzb21lIHJlYWwgcmVsYXhhdGlvbiBjb3VsZCBiZQorICAgZG9uZSBidXQgdGhlIGZyZXF1ZW5jeSBqdXN0IHdvdWxkbid0IG1ha2UgaXQgd29ydGggaXQ7IGl0J3MgYmV0dGVyIHRvCisgICB0cnkgdG8gZG8gYWxsIHRoZSBjb2RlIGNvbXBhY3Rpb24gb25lIGNhbiBlbHNld2hlcmUuCisgICBXaGVuIHRoZSBjaGlwIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucywgdGhpbmdzIG1heSBjaGFuZ2UuCisqLworCitzdGF0aWMgYm9vbGVhbiAKK20zMnJfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBib29sZWFuICphZ2FpbjsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIC8qIFRoZSBSZWxhIHN0cnVjdHVyZXMgYXJlIHVzZWQgaGVyZSBiZWNhdXNlIHRoYXQncyB3aGF0CisgICAgIF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyB1c2VzIFtmb3IgY29udmVuaWVuY2UgLSBpdCBzZXRzIHRoZSBhZGRlbmQKKyAgICAgZmllbGQgdG8gMF0uICAqLworICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOworICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7CisgIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7CisgIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOworCisgIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLworICAqYWdhaW4gPSBmYWxzZTsKKworICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgorICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKKyAgICAgY29kZSBzZWN0aW9uLiAgKi8KKyAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAorICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCisgICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCisgICAgICB8fCAwIC8qIEZJWE1FOiBjaGVjayBTSEZfTTMyUl9DQU5fUkVMQVggKi8pCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCisgICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KKyAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCisgICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisKKyAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KKyAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcworCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAorCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKyAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKworICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KKyAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKKyAgICB7CisgICAgICBiZmRfdm1hIHN5bXZhbDsKKworICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKKwkgdGhpcyByZWxvYy4gICovCisgICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKKwljb250aW51ZTsKKworICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KKyAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCXsKKwkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLworCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCisJICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisJICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOworCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7CisKKwkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCisJCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLworICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwl7CisJICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KKwkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQorCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KKwkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7CisJICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKKwkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCisJCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCisgICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKKwkgIGFzZWN0aW9uICpzeW1fc2VjOworCisJICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCisJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCisJCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkgICAgJmlzeW0pOworCisJICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOworCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKKwkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgbG9uZyBpbmR4OworCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCisJICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOworCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKKwkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7CisJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCisgICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKKyAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwl9CisKKyAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgorCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQorCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcworCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKKwkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7CisJIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCisJIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KKworICAgICAgLyogVHJ5IHRvIGNoYW5nZSBhIHNldGgvYWRkMy9qbCBzdWJyb3V0aW5lIGNhbGwgdG8gYmwyNCBvciBibDguCisJIFRoaXMgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciB3aGVuIGNvbXBpbGluZyBpbgorCSAzMiBiaXQgbW9kZS4gIEFsc28gbG9vayBmb3Igc2V0aC9hZGQzIC0+IGxkMjQuICAqLworCisgICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKKwl7CisJICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKKwkgIGJmZF92bWEgcGMgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIGlyZWwtPnJfb2Zmc2V0KTsKKwkgIGJmZF9zaWduZWRfdm1hIHBjcmVsX3ZhbHVlID0gc3ltdmFsIC0gcGM7CisJICB1bnNpZ25lZCBpbnQgY29kZSxyZWc7CisJICBpbnQgYWRkZW5kLG5vcF9wLGJsOF9wLHRvX2RlbGV0ZTsKKworCSAgLyogVGhlIHRlc3RzIGFyZSBvcmRlcmVkIHNvIHRoYXQgd2UgZ2V0IG91dCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCisJICAgICBpZiB0aGlzIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gcmVsYXgsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdAorCSAgICAgd2UgYXJlIGxvb2tpbmcgZm9yIHR3byBzZXBhcmF0ZSBwb3NzaWJpbGl0aWVzIChqbC9sZDI0KS4gICovCisKKwkgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCisJICAgICBsb29raW5nIGZvci4gICovCisJICBpZiAoaXJlbC0+cl9vZmZzZXQgPiBzZWMtPl9jb29rZWRfc2l6ZSAtIDgpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0CisJICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIHRoZSBhZGQzJ3MgcmVsb2MuICAqLworCSAgbnJlbCA9IGlyZWwgKyAxOworCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAorCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgNCAhPSBucmVsLT5yX29mZnNldAorCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX00zMlJfTE8xNikKKwkgICAgY29udGludWU7CisKKwkgIC8qIFNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBzZXRoL2FkZDMuICAqLworCSAgLyogRklYTUU6IFRoaXMgaXMgd2hlcmUgbWFjcm9zIGZyb20gY2dlbiBjYW4gY29tZSBpbi4gICovCisJICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDApOworCSAgaWYgKChjb2RlICYgMHhmMGZmKSAhPSAweGQwYzApCisJICAgIGNvbnRpbnVlOyAvKiBub3Qgc2V0aCByTixmb28gKi8KKwkgIHJlZyA9IChjb2RlICYgMHgwZjAwKSA+PiA4OworCSAgY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKKwkgIGlmIChjb2RlICE9ICgweDgwYTAgfCByZWcgfCAocmVnIDw8IDgpKSkKKwkgICAgY29udGludWU7IC8qIG5vdCBhZGQzIHJOLHJOLGZvbyAqLworCisJICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbmZpcm1lZCB3ZSBoYXZlIHNldGgvYWRkMy4gIE5vdyBjaGVjaworCSAgICAgd2hldGhlciB0aGUgbmV4dCBpbnNuIGlzIGEgamwsIGluIHdoaWNoIGNhc2UgdHJ5IHRvIGNoYW5nZSB0aGlzCisJICAgICB0byBibDI0IG9yIGJsOC4gICovCisKKwkgIC8qIEVuc3VyZSB0aGUgYnJhbmNoIHRhcmdldCBpcyBpbiByYW5nZS4KKwkgICAgIFRoZSBibDI0IGluc3RydWN0aW9uIGhhcyBhIDI0IGJpdCBvcGVyYW5kIHdoaWNoIGlzIHRoZSB0YXJnZXQKKwkgICAgIGFkZHJlc3MgcmlnaHQgc2hpZnRlZCBieSAyLCBnaXZpbmcgYSBzaWduZWQgcmFuZ2Ugb2YgMjYgYml0cy4KKwkgICAgIE5vdGUgdGhhdCA0IGJ5dGVzIGFyZSBhZGRlZCB0byB0aGUgaGlnaCB2YWx1ZSBiZWNhdXNlIHRoZSB0YXJnZXQKKwkgICAgIHdpbGwgYmUgYXQgbGVhc3QgNCBieXRlcyBjbG9zZXIgaWYgd2UgY2FuIHJlbGF4LiAgSXQnbGwgYWN0dWFsbHkKKwkgICAgIGJlIDQgb3IgOCBieXRlcyBjbG9zZXIsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGp1c3QgeWV0IGFuZAorCSAgICAgdGhlIGRpZmZlcmVuY2UgaXNuJ3Qgc2lnbmlmaWNhbnQgZW5vdWdoIHRvIHdvcnJ5IGFib3V0LiAgKi8KKyNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCisJICBwY3JlbF92YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKKyNlbHNlCisJICBhZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDIpOworCSAgcGNyZWxfdmFsdWUgKz0gYWRkZW5kOworI2VuZGlmCisKKwkgIGlmIChwY3JlbF92YWx1ZSA+PSAtKDEgPDwgMjUpICYmIHBjcmVsX3ZhbHVlIDwgKDEgPDwgMjUpICsgNAorCSAgICAgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCisJCSBsb29raW5nIGZvci4gICovCisJICAgICAgJiYgKGlyZWwtPnJfb2Zmc2V0IDw9IHNlYy0+X2Nvb2tlZF9zaXplIC0gMTIpCisJICAgICAgLyogRW5zdXJlIHRoZSBuZXh0IGluc24gaXMgImpsIHJOIi4gICovCisJICAgICAgJiYgKChjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDgpKSwKKwkJICBjb2RlICE9ICgweDFlYzAgfCByZWcpKSkKKwkgICAgeworCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBibDI0L2JsOC4gICovCisKKwkgICAgICAvKiBTZWUgaWYgdGhlcmUncyBhIG5vcCBmb2xsb3dpbmcgdGhlIGpsLgorCQkgQWxzbyBzZWUgaWYgd2UgY2FuIHVzZSBhIGJsOCBpbnNuLiAgKi8KKwkgICAgICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEwKTsKKwkgICAgICBub3BfcCA9IChjb2RlICYgMHg3ZmZmKSA9PSBOT1BfSU5TTjsKKwkgICAgICBibDhfcCA9IHBjcmVsX3ZhbHVlID49IC0weDIwMCAmJiBwY3JlbF92YWx1ZSA8IDB4MjAwOworCisJICAgICAgaWYgKGJsOF9wKQorCQl7CisJCSAgLyogQ2hhbmdlICJzZXRoIHJOLGZvbyIgdG8gImJsOCBmb28gfHwgbm9wIi4KKwkJICAgICBXZSBPUiBpbiBDT0RFIGp1c3QgaW4gY2FzZSBpdCdzIG5vdCBhIG5vcCAodGVjaG5pY2FsbHksCisJCSAgICAgQ09ERSBjdXJyZW50bHkgbXVzdCBiZSBhIG5vcCwgYnV0IGZvciBjbGVhbm5lc3Mgd2UKKwkJICAgICBhbGxvdyBpdCB0byBiZSBhbnl0aGluZykuICAqLworI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KKwkJICBjb2RlID0gMHg3ZTAwMDAwMCB8IE1BS0VfUEFSQUxMRUwgKGNvZGUpOworI2Vsc2UKKwkJICBjb2RlID0gKDB4N2UwMDAwMDAgKyAoKChhZGRlbmQgPj4gMikgJiAweGZmKSA8PCAxNikpIHwgTUFLRV9QQVJBTExFTCAoY29kZSk7CisjZW5kaWYKKwkJICB0b19kZWxldGUgPSA4OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogQ2hhbmdlIHRoZSBzZXRoIHJOLGZvbyB0byBhIGJsMjQgZm9vLiAgKi8KKyNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCisJCSAgY29kZSA9IDB4ZmUwMDAwMDA7CisjZWxzZQorCQkgIGNvZGUgPSAweGZlMDAwMDAwICsgKChhZGRlbmQgPj4gMikgJiAweGZmZmZmZik7CisjZW5kaWYKKwkJICB0b19kZWxldGUgPSBub3BfcCA/IDggOiA0OworCQl9CisKKwkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKKworCSAgICAgIC8qIFNldCB0aGUgbmV3IHJlbG9jIHR5cGUuICAqLworCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCisJCQkJCSAgIGJsOF9wID8gUl9NMzJSXzEwX1BDUkVMIDogUl9NMzJSXzI2X1BDUkVMKTsKKworCSAgICAgIC8qIERlbGV0ZSB0aGUgYWRkMyByZWxvYyBieSBtYWtpbmcgaXQgYSBudWxsIHJlbG9jLiAgKi8KKwkgICAgICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAorCQkJCQkgICBSX00zMlJfTk9ORSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGFkZGVuZCA+PSAwCisJCSAgICYmIHN5bXZhbCArIGFkZGVuZCA8PSAweGZmZmZmZikKKwkgICAgeworCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBsZDI0LiAgKi8KKworCSAgICAgIGNvZGUgPSAweGUwMDAwMDAwIHwgKHJlZyA8PCAyNCkgfCAoYWRkZW5kICYgMHhmZmZmZmYpOworCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOworCSAgICAgIHRvX2RlbGV0ZSA9IDQ7CisJICAgICAgLyogVGVsbCB0aGUgZm9sbG93aW5nIGNvZGUgYSBub3AgZmlsbGVyIGlzbid0IG5lZWRlZC4gICovCisJICAgICAgbm9wX3AgPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBDYW4ndCBkbyBhbnl0aGluZyBoZXJlLiAgKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworCSAgZnJlZV9yZWxvY3MgPSBOVUxMOworCisJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOworCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisKKwkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7CisJICBmcmVlX2V4dHN5bXMgPSBOVUxMOworCisJICAvKiBEZWxldGUgVE9fREVMRVRFIGJ5dGVzIG9mIGRhdGEuICAqLworCSAgaWYgKCFtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKKwkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgNCwgdG9fZGVsZXRlKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIC8qIE5vdyB0aGF0IHRoZSBmb2xsb3dpbmcgYnl0ZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gcGxhY2UsIHNlZSBpZgorCSAgICAgd2UgbmVlZCB0byByZXBsYWNlIHRoZSBqbCB3aXRoIGEgbm9wLiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGFkCisJICAgICB0byB1c2UgYSBibDI0IGluc24gYW5kIHRoZSBpbnNuIGZvbGxvd2luZyB0aGUgamwgaXNuJ3QgYSBub3AuCisJICAgICBUZWNobmljYWxseSwgdGhpcyBzaXR1YXRpb24gY2FuJ3QgaGFwcGVuIChzaW5jZSB0aGUgaW5zbiBjYW4KKwkgICAgIG5ldmVyIGJlIGV4ZWN1dGVkKSBidXQgdG8gYmUgY2xlYW4gd2UgZG8gdGhpcy4gIFdoZW4gdGhlIGNoaXAKKwkgICAgIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucyB0aGluZ3MgbWF5IGNoYW5nZS4KKwkgICAgIFdlIGRvbid0IG5lZWQgdG8gZG8gdGhpcyBpbiB0aGUgY2FzZSBvZiByZWxheGluZyB0byBsZDI0LAorCSAgICAgYW5kIHRoZSBhYm92ZSBjb2RlIHNldHMgbm9wX3Agc28gdGhpcyBpc24ndCBkb25lLiAgKi8KKwkgIGlmICghIG5vcF9wICYmIHRvX2RlbGV0ZSA9PSA0KQorCSAgICBiZmRfcHV0XzE2IChhYmZkLCBOT1BfSU5TTiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOworCisJICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28gd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgorCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLworCSAgKmFnYWluID0gdHJ1ZTsKKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBsb29wIHRvIHRyeSB0aGUgbmV4dCByZWxvYyAqLworICAgIH0KKworICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKwlmcmVlIChmcmVlX2NvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7CisJfQorICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7CisgICAgfQorCisgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCWZyZWUgKGZyZWVfZXh0c3ltcyk7CisgICAgICBlbHNlCisJeworCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCisJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7CisJfQorICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKKyAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKKyAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLworCitzdGF0aWMgYm9vbGVhbgorbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgaW50IGNvdW50OworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOworICBpbnQgc2huZHgsIGluZGV4OworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKKyAgYmZkX3ZtYSB0b2FkZHI7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOworCisgIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOworCisgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7CisKKyAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKKyAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLworCisgIGlyZWxhbGlnbiA9IE5VTEw7CisgIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOworCisgIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7CisgIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKKworICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KKyAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKKyAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7CisKKyAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KKyAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLworICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKKwkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCisJaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7CisgICAgfQorCisgIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCisgIGVzeW0gPSBleHRzeW1zOworICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87CisgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKKworICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7CisKKyAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4CisJICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgorCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKKwl7CisJICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OworCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOworCX0KKyAgICB9CisKKyAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLworICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87CisgIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOworICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07CisKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOworICAgICAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdOworICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKKwkgICYmICgoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKKwkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCisJICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQorCXsKKwkgIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisgICB3aGljaCB1c2VzIG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLworCitzdGF0aWMgYmZkX2J5dGUgKgorbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCisJCQkJCSBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworICAgICBiZmRfYnl0ZSAqZGF0YTsKKyAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247CisgIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisgIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7CisKKyAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKKyAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KKyAgaWYgKHJlbG9jYXRlYWJsZQorICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCisgICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCisJCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAorCQkJCQkJICAgICAgIHN5bWJvbHMpOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworCisgIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAorCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKKworICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCisgICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7CisgICAgICBhc2VjdGlvbiAqKnNlY3BwOworICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKKworICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCisJZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisgICAgICBlbHNlCisJeworCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCisJCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7CisJICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCisJCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQorCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcworCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCisJCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOworICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCisJCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7CisgICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbworCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOworICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKKyAgICAgIHNlY3BwID0gc2VjdGlvbnM7CisgICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKKyAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQorCXsKKwkgIGFzZWN0aW9uICppc2VjOworCisJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOworCisJICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKKwkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCisJICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOworCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCisJICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCisJICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9NMzJSX1NDT01NT04pCisJICAgIGlzZWMgPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogV2hvIGtub3dzPyAgKi8KKwkgICAgICBpc2VjID0gTlVMTDsKKwkgICAgfQorCisJICAqc2VjcHAgPSBpc2VjOworCX0KKworICAgICAgaWYgKCEgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCisJCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKKwkJCQkgICAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKKwlmcmVlIChzZWN0aW9ucyk7CisgICAgICBzZWN0aW9ucyA9IE5VTEw7CisgICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorCWZyZWUgKGludGVybmFsX3N5bXMpOworICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7CisgICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCisJZnJlZSAoZXh0ZXJuYWxfc3ltcyk7CisgICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKKyAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKKwlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGRhdGE7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAorICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCisgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKyAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQorICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOworICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGludGVybmFsX3N5bXMpOworICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKKyAgICBmcmVlIChzZWN0aW9ucyk7CisgIHJldHVybiBOVUxMOworfQorCisjZW5kaWYgLyogI2lmIDAgKi8KKwwKKy8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLworc3RhdGljIGJvb2xlYW4KK20zMnJfZWxmX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBFX00zMlJfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTMyciwgYmZkX21hY2hfbTMycik7ICBicmVhazsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KK3N0YXRpYyB2b2lkCittMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCisgICAgIGJmZCAqICAgYWJmZDsKKyAgICAgYm9vbGVhbiBsaW5rZXI7Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworCisgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIGJmZF9tYWNoX20zMnI6ICB2YWwgPSBFX00zMlJfQVJDSDsgYnJlYWs7CisgICAgfQorCisgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9NMzJSX0FSQ0g7CisgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKK30KKworLyogRnVuY3Rpb24gdG8ga2VlcCBNMzJSIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCitzdGF0aWMgYm9vbGVhbgorbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQorICAgICBiZmQgKiAgICBhYmZkOworICAgICBmbGFnd29yZCBmbGFnczsKK3sKKyAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQorCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKKworICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOworICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCitzdGF0aWMgYm9vbGVhbgorbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKiBpYmZkOworICAgICBiZmQgKiBvYmZkOworeworICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQorCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncworCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7CisKKyAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7CisgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7CisgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7CisgIHJldHVybiB0cnVlOworfQorCisvKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0CisgICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLworc3RhdGljIGJvb2xlYW4KK20zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqIGliZmQ7CisgICAgIGJmZCAqIG9iZmQ7Cit7CisgIGZsYWd3b3JkIG91dF9mbGFnczsKKyAgZmxhZ3dvcmQgaW5fZmxhZ3M7CisKKyAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKKworICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCisgICAgeworICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAorCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAorCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQorCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCisJIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKKwkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KKyAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQorCXJldHVybiB0cnVlOworICAgICAgCisgICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOworICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKKworICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQorCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKKwl7CisJICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOworCX0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCisgIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX00zMlJfQVJDSCkpCisgICAgeworICAgICAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gRV9NMzJSX0FSQ0gpCisJeworCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAorCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLworc3RhdGljIGJvb2xlYW4KK20zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKKyAgICAgYmZkICogICBhYmZkOworICAgICBQVFIgICAgIHB0cjsKK3sKKyAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7CisgIAorICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpCisgIAorICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOworICAKKyAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseCIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7CisgIAorICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTTMyUl9BUkNIKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgRV9NMzJSX0FSQ0g6ICBmcHJpbnRmIChmaWxlLCBfKCI6IG0zMnIgaW5zdHJ1Y3Rpb25zIikpOyAgYnJlYWs7CisgICAgfQorICAKKyAgZnB1dGMgKCdcbicsIGZpbGUpOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKK2FzZWN0aW9uICoKK20zMnJfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCisgICAgICAgYmZkICphYmZkOworICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworeworICBpZiAoaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisgICAgICB7CisgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgorICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6CisgICAgICAgIGJyZWFrOworIAorICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCisgICAgICAgICAgeworICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKyAKKyAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCisgICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKKyAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQorICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKKyAgICAgICAgICB9CisgICAgICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgYm9vbGVhbgorbTMycl9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisgIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBtMzJyICovCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KKyAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCisgICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLworIAorc3RhdGljIGJvb2xlYW4KK20zMnJfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOworIAorICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworIAorICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7CisgIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7CisgIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQorICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87CisgCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworIAorICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKyAgICAgICAgaCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisgCisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgICB7CisgICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKyAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgorICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKKyAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisgICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgorICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAKKyAgcmV0dXJuIHRydWU7Cit9CisKKworDAorCisjZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tMzJyCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX00zMlIKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKKworI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfbTMycl92ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItbTMyciIKKworI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCTAKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJbTMycl9pbmZvX3RvX2hvd3RvX3JlbAorI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCV9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQltMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgbTMycl9lbGZfZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBtMzJyX2VsZl9nY19zd2VlcF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtMzJyX2VsZl9jaGVja19yZWxvY3MKKworI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgICAgMQorI2lmIDAgLyogbm90IHlldCAqLworLyogcmVsYXggc3VwcG9ydCAqLworI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JCW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorCQkJCQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNlbmRpZgorCisjZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJbTMycl9lbGZfb2JqZWN0X3AKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZworI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncworI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorCQkJCQkKKyNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tNjhrLmMgYi9iZmQvZWxmMzItbTY4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGFiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItbTY4ay5jCkBAIC0wLDAgKzEsMjEyOCBAQAorLyogTW90b3JvbGEgNjhrIHNlcmllcyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCisgICBDb3B5cmlnaHQgMTk5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisjaW5jbHVkZSAiZWxmL202OGsuaCIKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHJ0eXBlX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gZWxmX202OGtfY2hlY2tfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK3N0YXRpYyBhc2VjdGlvbiAqZWxmX202OGtfZ2NfbWFya19ob29rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAorCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOworc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZ2Nfc3dlZXBfaG9vaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKKwkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOworc3RhdGljIGJvb2xlYW4gZWxmX202OGtfYWRqdXN0X2R5bmluZHgKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSB7CisgIEhPV1RPKFJfNjhLX05PTkUsICAgICAgIDAsIDAsIDAsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19OT05FIiwgICAgICBmYWxzZSwgMCwgMHgwMDAwMDAwMCxmYWxzZSksCisgIEhPV1RPKFJfNjhLXzMyLCAgICAgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S18zMiIsICAgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLXzE2LCAgICAgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S18xNiIsICAgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLXzgsICAgICAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S184IiwgICAgICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX1BDMzIsICAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzMyIiwgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl82OEtfUEMxNiwgICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDMTYiLCAgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAorICBIT1dUTyhSXzY4S19QQzgsICAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEM4IiwgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCisgIEhPV1RPKFJfNjhLX0dPVDMyLCAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QzMiIsICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl82OEtfR09UMTYsICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAorICBIT1dUTyhSXzY4S19HT1Q4LCAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOCIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCisgIEhPV1RPKFJfNjhLX0dPVDMyTywgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QzMk8iLCAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX0dPVDE2TywgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNk8iLCAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX0dPVDhPLCAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1Q4TyIsICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX1BMVDMyLCAgICAgIDAsIDIsMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQzMiIsICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl82OEtfUExUMTYsICAgICAgMCwgMSwxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLHRydWUpLAorICBIT1dUTyhSXzY4S19QTFQ4LCAgICAgICAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOCIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsdHJ1ZSksCisgIEhPV1RPKFJfNjhLX1BMVDMyTywgICAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQzMk8iLCAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX1BMVDE2TywgICAgIDAsIDEsMTYsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNk8iLCAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX1BMVDhPLCAgICAgIDAsIDAsIDgsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQ4TyIsICAgICBmYWxzZSwgMCwgMHgwMDAwMDBmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX0NPUFksICAgICAgIDAsIDAsIDAsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19DT1BZIiwgICAgICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX0dMT0JfREFULCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HTE9CX0RBVCIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX0pNUF9TTE9ULCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19KTVBfU0xPVCIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfNjhLX1JFTEFUSVZFLCAgIDAsIDIsMzIsIGZhbHNlLDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19SRUxBVElWRSIsICBmYWxzZSwgMCwgMHhmZmZmZmZmZixmYWxzZSksCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCisgIEhPV1RPIChSXzY4S19HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSXzY4S19HTlVfVlRJTkhFUklUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KKyAgSE9XVE8gKFJfNjhLX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl82OEtfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAorfTsKKworc3RhdGljIHZvaWQKK3J0eXBlX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpkc3Q7Cit7CisgIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRShkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSXzY4S19tYXgpOworICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRShkc3QtPnJfaW5mbyldOworfQorCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIHJ0eXBlX3RvX2hvd3RvCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF92YWw7CisgIGludCBlbGZfdmFsOworfSByZWxvY19tYXBbXSA9IHsKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl82OEtfTk9ORSB9LAorICB7IEJGRF9SRUxPQ18zMiwgUl82OEtfMzIgfSwKKyAgeyBCRkRfUkVMT0NfMTYsIFJfNjhLXzE2IH0sCisgIHsgQkZEX1JFTE9DXzgsIFJfNjhLXzggfSwKKyAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfNjhLX1BDMzIgfSwKKyAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfNjhLX1BDMTYgfSwKKyAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl82OEtfUEM4IH0sCisgIHsgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTCwgUl82OEtfR09UMzIgfSwKKyAgeyBCRkRfUkVMT0NfMTZfR09UX1BDUkVMLCBSXzY4S19HT1QxNiB9LAorICB7IEJGRF9SRUxPQ184X0dPVF9QQ1JFTCwgUl82OEtfR09UOCB9LAorICB7IEJGRF9SRUxPQ18zMl9HT1RPRkYsIFJfNjhLX0dPVDMyTyB9LAorICB7IEJGRF9SRUxPQ18xNl9HT1RPRkYsIFJfNjhLX0dPVDE2TyB9LAorICB7IEJGRF9SRUxPQ184X0dPVE9GRiwgUl82OEtfR09UOE8gfSwKKyAgeyBCRkRfUkVMT0NfMzJfUExUX1BDUkVMLCBSXzY4S19QTFQzMiB9LAorICB7IEJGRF9SRUxPQ18xNl9QTFRfUENSRUwsIFJfNjhLX1BMVDE2IH0sCisgIHsgQkZEX1JFTE9DXzhfUExUX1BDUkVMLCBSXzY4S19QTFQ4IH0sCisgIHsgQkZEX1JFTE9DXzMyX1BMVE9GRiwgUl82OEtfUExUMzJPIH0sCisgIHsgQkZEX1JFTE9DXzE2X1BMVE9GRiwgUl82OEtfUExUMTZPIH0sCisgIHsgQkZEX1JFTE9DXzhfUExUT0ZGLCBSXzY4S19QTFQ4TyB9LAorICB7IEJGRF9SRUxPQ19OT05FLCBSXzY4S19DT1BZIH0sCisgIHsgQkZEX1JFTE9DXzY4S19HTE9CX0RBVCwgUl82OEtfR0xPQl9EQVQgfSwKKyAgeyBCRkRfUkVMT0NfNjhLX0pNUF9TTE9ULCBSXzY4S19KTVBfU0xPVCB9LAorICB7IEJGRF9SRUxPQ182OEtfUkVMQVRJVkUsIFJfNjhLX1JFTEFUSVZFIH0sCisgIHsgQkZEX1JFTE9DX0NUT1IsIFJfNjhLXzMyIH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSXzY4S19HTlVfVlRJTkhFUklUIH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl82OEtfR05VX1ZURU5UUlkgfSwKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocmVsb2NfbWFwKSAvIHNpemVvZiAocmVsb2NfbWFwWzBdKTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChyZWxvY19tYXBbaV0uYmZkX3ZhbCA9PSBjb2RlKQorCXJldHVybiAmaG93dG9fdGFibGVbcmVsb2NfbWFwW2ldLmVsZl92YWxdOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCByZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBFTEZfQVJDSCBiZmRfYXJjaF9tNjhrCisvKiBlbmQgY29kZSBnZW5lcmF0ZWQgYnkgZWxmLmVsICovCisKKyNkZWZpbmUgVVNFX1JFTEEKKworDAorLyogRnVuY3Rpb25zIGZvciB0aGUgbTY4ayBFTEYgbGlua2VyLiAgKi8KKworLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAorICAgc2VjdGlvbi4gICovCisKKyNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xpYmMuc28uMSIKKworLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKworI2RlZmluZSBQTFRfRU5UUllfU0laRSAyMAorCisvKiBUaGUgZmlyc3QgZW50cnkgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rcyBsaWtlIHRoaXMuICBTZWUKKyAgIHRoZSBTVlI0IEFCSSBtNjhrIHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9tNjhrX3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KK3sKKyAgMHgyZiwgMHgzYiwgMHgwMSwgMHg3MCwgLyogbW92ZS5sICglcGMsYWRkciksLSglc3ApICovCisgIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIC5nb3QgKyA0LiAgKi8KKyAgMHg0ZSwgMHhmYiwgMHgwMSwgMHg3MSwgLyogam1wIChbJXBjLGFkZHJdKSAqLworICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgOC4gICovCisgIDAsIDAsIDAsIDAJCSAgLyogcGFkIG91dCB0byAyMCBieXRlcy4gICovCit9OworCisvKiBTdWJzZXF1ZW50IGVudHJpZXMgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsb29rIGxpa2UgdGhpcy4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KK3sKKyAgMHg0ZSwgMHhmYiwgMHgwMSwgMHg3MSwgLyogam1wIChbJXBjLHN5bWJvbEBHT1RQQ10pICovCisgIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN5bWJvbCdzIC5nb3QgZW50cnkuICAqLworICAweDJmLCAweDNjLAkJICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KKyAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KKyAgMHg2MCwgMHhmZiwJCSAgLyogYnJhLmwgLnBsdCAqLworICAwLCAwLCAwLCAwCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLworfTsKKworLyogVGhlIG02OGsgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAorICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQgaXQKKyAgIGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuIGxpbmtpbmcKKyAgIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkIGV4dGVuZGluZyB0aGUKKyAgIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UgaGF2ZQorICAgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCisKK3N0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkCit7CisgIC8qIE5leHQgc2VjdGlvbi4gICovCisgIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OworICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCisgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit9OworCisvKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCisKK3N0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkKK3sKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKKworICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLworICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKK307CisKKy8qIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZQoreworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OworfTsKKworLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZGlzY2FyZF9jb3BpZXMKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKKworLyogVHJhdmVyc2UgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCisgIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBlbGZfbTY4a19oYXNoX3RhYmxlKHApIFwKKyAgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIChwKS0+aGFzaCkKKworLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitlbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCisJCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICB7CisgICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIENyZWF0ZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitlbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikKKwkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKKwkJCQkgICAgICAgZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMpKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Cit9CisKKy8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCisgICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQorICAgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX202OGtfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgYmZkICpkeW5vYmo7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7CisgIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKKyAgYXNlY3Rpb24gKnNnb3Q7CisgIGFzZWN0aW9uICpzcmVsZ290OworICBhc2VjdGlvbiAqc3JlbG9jOworCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKKworICBzZ290ID0gTlVMTDsKKyAgc3JlbGdvdCA9IE5VTEw7CisgIHNyZWxvYyA9IE5VTEw7CisKKyAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwloID0gTlVMTDsKKyAgICAgIGVsc2UKKwloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfNjhLX0dPVDg6CisJY2FzZSBSXzY4S19HT1QxNjoKKwljYXNlIFJfNjhLX0dPVDMyOgorCSAgaWYgKGggIT0gTlVMTAorCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCisJICAgIGJyZWFrOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlIFJfNjhLX0dPVDhPOgorCWNhc2UgUl82OEtfR09UMTZPOgorCWNhc2UgUl82OEtfR09UMzJPOgorCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KKworCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLworCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKKwkgICAgICBpZiAoIV9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGlmIChzZ290ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworCSAgICB9CisKKwkgIGlmIChzcmVsZ290ID09IE5VTEwKKwkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCisJICAgIHsKKwkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCisJCXsKKwkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7CisJCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAorCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCisJCQkJCQkgKFNFQ19BTExPQworCQkJCQkJICB8IFNFQ19MT0FECisJCQkJCQkgIHwgU0VDX0hBU19DT05URU5UUworCQkJCQkJICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgfCBTRUNfUkVBRE9OTFkpKQorCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisKKwkgIGlmIChoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID09IC0xKQorCQl7CisJCSAgaC0+Z290LnJlZmNvdW50ID0gMTsKKworCQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisJCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJCSAgICB7CisJCSAgICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgIH0KKworCQkgIC8qIEFsbG9jYXRlIHNwYWNlIGluIHRoZSAuZ290IHNlY3Rpb24uICAqLworCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OworCQkgIC8qIEFsbG9jYXRlIHJlbG9jYXRpb24gc3BhY2UuICAqLworCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworCQl9CisJICAgICAgZWxzZQorCQloLT5nb3QucmVmY291bnQrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQorCQl7CisJCSAgc2l6ZV90IHNpemU7CisKKwkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3NpZ25lZF92bWEpOworCQkgIGxvY2FsX2dvdF9yZWZjb3VudHMgPSAoKGJmZF9zaWduZWRfdm1hICopCisJCQkJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKTsKKwkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKSA9IGxvY2FsX2dvdF9yZWZjb3VudHM7CisJCSAgbWVtc2V0IChsb2NhbF9nb3RfcmVmY291bnRzLCAtMSwgc2l6ZSk7CisJCX0KKwkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gLTEpCisJCXsKKwkJICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9IDE7CisKKwkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKKwkJICBpZiAoaW5mby0+c2hhcmVkKQorCQkgICAgeworCQkgICAgICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KKwkJCSBvdXRwdXQgYSBSXzY4S19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCisJCQkgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLworCQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0rKzsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJfNjhLX1BMVDg6CisJY2FzZSBSXzY4S19QTFQxNjoKKwljYXNlIFJfNjhLX1BMVDMyOgorCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCisJICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAorICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aGljaCBpcworICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAgICAgIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeQorICAgICAgICAgICAgIGFmdGVyIGFsbC4gICovCisKKwkgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAorCSAgICAgY3JlYXRpbmcgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCisJICBpZiAoaCA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKKwkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCisJICAgIGgtPnBsdC5yZWZjb3VudCA9IDE7CisJICBlbHNlCisJICAgIGgtPnBsdC5yZWZjb3VudCsrOworCSAgYnJlYWs7CisKKwljYXNlIFJfNjhLX1BMVDhPOgorCWNhc2UgUl82OEtfUExUMTZPOgorCWNhc2UgUl82OEtfUExUMzJPOgorCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCisKKwkgIGlmIChoID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgdGhpcyByZWxvY2F0aW9uIGZvciBhCisJCSBsb2NhbCBzeW1ib2wuICBGSVhNRTogZG9lcyBpdD8gIEhvdyB0byBoYW5kbGUgaXQgaWYKKwkJIGl0IGRvZXMgbWFrZSBzZW5zZT8gICovCisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwkgICAgeworCSAgICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisJICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQorCSAgICBoLT5wbHQucmVmY291bnQgPSAxOworCSAgZWxzZQorCSAgICBoLT5wbHQucmVmY291bnQrKzsKKwkgIGJyZWFrOworCisJY2FzZSBSXzY4S19QQzg6CisJY2FzZSBSXzY4S19QQzE2OgorCWNhc2UgUl82OEtfUEMzMjoKKwkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IGFuZCB0aGlzIGlzIG5vdCBhIGxvY2FsCisJICAgICBzeW1ib2wsIHdlIG5lZWQgdG8gY29weSB0aGUgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuCisJICAgICBIb3dldmVyIHdoZW4gbGlua2luZyB3aXRoIC1Cc3ltYm9saWMgYW5kIHRoaXMgaXMgYSBnbG9iYWwKKwkgICAgIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGFuIG9iamVjdCB3ZSBhcmUgaW5jbHVkaW5nIGluIHRoZQorCSAgICAgbGluayAoaS5lLiwgREVGX1JFR1VMQVIgaXMgc2V0KSwgdGhlbiB3ZSBjYW4gcmVzb2x2ZSB0aGUKKwkgICAgIHJlbG9jIGRpcmVjdGx5LiAgQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdCBzZWVuIGFsbCB0aGUgaW5wdXQKKwkgICAgIGZpbGVzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dAorCSAgICAgd2lsbCBiZSBzZXQgbGF0ZXIgKGl0IGlzIG5ldmVyIGNsZWFyZWQpLiAgV2UgYWNjb3VudCBmb3IgdGhhdAorCSAgICAgcG9zc2liaWxpdHkgYmVsb3cgYnkgc3RvcmluZyBpbmZvcm1hdGlvbiBpbiB0aGUKKwkgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLworCSAgaWYgKCEoaW5mby0+c2hhcmVkCisJCSYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCisJCSYmIGggIT0gTlVMTAorCQkmJiAoIWluZm8tPnN5bWJvbGljCisJCSAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpCisJICAgIHsKKwkgICAgICBpZiAoaCAhPSBOVUxMKQorCQl7CisJCSAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmCisJCSAgICAgaXQgdHVybnMgb3V0IHRvIGJlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGR5bmFtaWMKKwkJICAgICBvYmplY3QuICAqLworCQkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCisJCSAgICBoLT5wbHQucmVmY291bnQgPSAxOworCQkgIGVsc2UKKwkJICAgIGgtPnBsdC5yZWZjb3VudCsrOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSBSXzY4S184OgorCWNhc2UgUl82OEtfMTY6CisJY2FzZSBSXzY4S18zMjoKKwkgIGlmIChoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBNYWtlIHN1cmUgYSBwbHQgZW50cnkgaXMgY3JlYXRlZCBmb3IgdGhpcyBzeW1ib2wgaWYgaXQKKwkJIHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCisJICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKKwkJaC0+cGx0LnJlZmNvdW50ID0gMTsKKwkgICAgICBlbHNlCisJCWgtPnBsdC5yZWZjb3VudCsrOworCSAgICB9CisKKwkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIGNvcHkgdGhlCisJICAgICByZWxvYyBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisJICBpZiAoaW5mby0+c2hhcmVkCisJICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJICAgIHsKKwkgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCisJCSByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCisJCSBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jLiAgKi8KKwkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCXsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCisJCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgIChhYmZkLAorCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCisJCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKKwkJICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgcmV0dXJuIGZhbHNlOworCisJCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAorCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKKwkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKKworCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOworCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKKwkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCisJCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAorCQkJCQkJICAgICAoU0VDX0FMTE9DCisJCQkJCQkgICAgICB8IFNFQ19MT0FECisJCQkJCQkgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkJCSAgICAgIHwgU0VDX0lOX01FTU9SWQorCQkJCQkJICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgICAgIHwgU0VDX1JFQURPTkxZKSkKKwkJCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLCAyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKworCSAgICAgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgd2UgY291bnQgdGhlIG51bWJlciBvZgorCQkgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2UgaGF2ZSBlbnRlcmVkIGZvciB0aGlzIHN5bWJvbCwKKwkJIHNvIHRoYXQgd2UgY2FuIGRpc2NhcmQgdGhlbSBhZ2FpbiBpZiB0aGUgc3ltYm9sIGlzIGxhdGVyCisJCSBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcworCQkgb25seSBjYWxsZWQgaWYgd2UgYXJlIHVzaW5nIGFuIG02OGtlbGYgbGlua2VyIGhhc2ggdGFibGUsCisJCSB3aGljaCBtZWFucyB0aGF0IGggaXMgcmVhbGx5IGEgcG9pbnRlciB0byBhbgorCQkgZWxmX202OGtfbGlua19oYXNoX2VudHJ5LiAgKi8KKwkgICAgICBpZiAoKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDOAorIAkJICAgfHwgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl82OEtfUEMxNgorIAkJICAgfHwgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl82OEtfUEMzMikKKwkJICAmJiBpbmZvLT5zeW1ib2xpYykKKwkJeworCQkgIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKmVoOworCQkgIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpwOworCisJCSAgZWggPSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBoOworCisJCSAgZm9yIChwID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJCSAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCisJCSAgICAgIGJyZWFrOworCisJCSAgaWYgKHAgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgcCA9ICgoc3RydWN0IGVsZl9tNjhrX3BjcmVsX3JlbG9jc19jb3BpZWQgKikKKwkJCSAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKnApKTsKKwkJICAgICAgaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOworCQkgICAgICBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IHA7CisJCSAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7CisJCSAgICAgIHAtPmNvdW50ID0gMDsKKwkJICAgIH0KKworCQkgICsrcC0+Y291bnQ7CisJCX0KKwkgICAgfQorCisJICBicmVhazsKKworCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgorCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworCWNhc2UgUl82OEtfR05VX1ZUSU5IRVJJVDoKKwkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5CisJICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KKwljYXNlIFJfNjhLX0dOVV9WVEVOVFJZOgorCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KKyAgIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgYXNlY3Rpb24gKgorZWxmX202OGtfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgaWYgKGggIT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6CisJY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247CisKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKwkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKKwkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisJCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCisJeworCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKKwl9CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9tNjhrX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKKyAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgIGJmZCAqZHlub2JqOworICBhc2VjdGlvbiAqc2dvdDsKKyAgYXNlY3Rpb24gKnNyZWxnb3Q7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBpZiAoZHlub2JqKQorICAgIHsKKyAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICB9CisKKyAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwl7CisJY2FzZSBSXzY4S19HT1Q4OgorCWNhc2UgUl82OEtfR09UMTY6CisJY2FzZSBSXzY4S19HT1QzMjoKKwljYXNlIFJfNjhLX0dPVDhPOgorCWNhc2UgUl82OEtfR09UMTZPOgorCWNhc2UgUl82OEtfR09UMzJPOgorCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQorCQl7CisJCSAgLS1oLT5nb3QucmVmY291bnQ7CisJCSAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAwKQorCQkgICAgeworCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KKwkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7CisJCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSAtPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCisJCXsKKwkJICAtLWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdOworCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAwKQorCQkgICAgeworCQkgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSAuZ290IGVudHJ5IGFueSBtb3JlLiAgKi8KKwkJICAgICAgc2dvdC0+X3Jhd19zaXplIC09IDQ7CisJCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCisJCQlzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBicmVhazsKKworCWNhc2UgUl82OEtfUExUODoKKwljYXNlIFJfNjhLX1BMVDE2OgorCWNhc2UgUl82OEtfUExUMzI6CisJY2FzZSBSXzY4S19QTFQ4TzoKKwljYXNlIFJfNjhLX1BMVDE2TzoKKwljYXNlIFJfNjhLX1BMVDMyTzoKKwljYXNlIFJfNjhLX1BDODoKKwljYXNlIFJfNjhLX1BDMTY6CisJY2FzZSBSXzY4S19QQzMyOgorCWNhc2UgUl82OEtfODoKKwljYXNlIFJfNjhLXzE2OgorCWNhc2UgUl82OEtfMzI6CisJICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisJICBpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgeworCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisJICAgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCisJCS0taC0+cGx0LnJlZmNvdW50OworCSAgICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQorICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKKyAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KKyAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCisgICB1bmRlcnN0YW5kLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KKyAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKKwkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKKwkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKKwkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKKwkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOworCisgIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCisgICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyLAorICAgICB3aGVuIHdlIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCisgIGlmIChoLT50eXBlID09IFNUVF9GVU5DCisgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICghIGluZm8tPnNoYXJlZAorCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSA9PSAwCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpID09IDAKKwkgIC8qIFdlIG11c3QgYWx3YXlzIGNyZWF0ZSB0aGUgcGx0IGVudHJ5IGlmIGl0IHdhcyByZWZlcmVuY2VkCisJICAgICBieSBhIFBMVHh4TyByZWxvY2F0aW9uLiAgSW4gdGhpcyBjYXNlIHdlIGFscmVhZHkgcmVjb3JkZWQKKwkgICAgIGl0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCSAgJiYgaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVHh4IHJlbG9jIGluIGFuIGlucHV0CisJICAgICBmaWxlLCBidXQgdGhlIHN5bWJvbCB3YXMgbmV2ZXIgcmVmZXJyZWQgdG8gYnkgYSBkeW5hbWljCisJICAgICBvYmplY3QuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZAorCSAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEN4eAorCSAgICAgcmVsb2MgaW5zdGVhZC4gICovCisJICBCRkRfQVNTRVJUICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKTsKKwkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIC8qIEdDIG1heSBoYXZlIHJlbmRlcmVkIHRoaXMgZW50cnkgdW51c2VkLiAgKi8KKyAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPD0gMCkKKwl7CisJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKKwkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKKwkgZmlyc3QgZW50cnkuICAqLworICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKKwkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCisJIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCisJIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCisJIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisgICAgICBpZiAoIWluZm8tPnNoYXJlZAorCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQorCXsKKwkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7CisJICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOworCX0KKworICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKKworICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KKyAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5nb3QucGx0IHNlY3Rpb24sIHdoaWNoCisJIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAuZ290IHNlY3Rpb24gYnkgdGhlIGxpbmtlciBzY3JpcHQuICAqLworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgcy0+X3Jhd19zaXplICs9IDQ7CisKKyAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBSZWluaXRpYWxpemUgdGhlIHBsdCBvZmZzZXQgbm93IHRoYXQgaXQgaXMgbm90IHVzZWQgYXMgYSByZWZlcmVuY2UKKyAgICAgY291bnQgYW55IG1vcmUuICAqLworICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOworCisgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKKyAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCisgICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCisgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOworICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKKyAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLworCisgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKKyAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KKyAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKKyAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKKyAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKKyAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYworICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCisgICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCisgICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bworICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCisgICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKKyAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7CisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfNjhLX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KKyAgICAgY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQorICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKKyAgICAgLnJlbGEuYnNzIHNlY3Rpb24gd2UgYXJlIGdvaW5nIHRvIHVzZS4gICovCisgIGlmICgoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3JlbDsKKworICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5ic3MiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7CisgICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZOworICAgIH0KKworICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhpcyBzeW1ib2wuICBJCisgICAgIGhhdmUgbm8gaWRlYSBob3cgRUxGIGxpbmtlcnMgaGFuZGxlIHRoaXMuICAqLworICBwb3dlcl9vZl90d28gPSBiZmRfbG9nMiAoaC0+c2l6ZSk7CisgIGlmIChwb3dlcl9vZl90d28gPiAzKQorICAgIHBvd2VyX29mX3R3byA9IDM7CisKKyAgLyogQXBwbHkgdGhlIHJlcXVpcmVkIGFsaWdubWVudC4gICovCisgIHMtPl9yYXdfc2l6ZSA9IEJGRF9BTElHTiAocy0+X3Jhd19zaXplLAorCQkJICAgIChiZmRfc2l6ZV90eXBlKSAoMSA8PCBwb3dlcl9vZl90d28pKTsKKyAgaWYgKHBvd2VyX29mX3R3byA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykpCisgICAgeworICAgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KKyAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKKyAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKKworICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLworICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqZHlub2JqOworICBhc2VjdGlvbiAqczsKKyAgYm9vbGVhbiBwbHQ7CisgIGJvb2xlYW4gcmVsb2NzOworICBib29sZWFuIHJlbHRleHQ7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKKworICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisgICAgeworICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCisgICAgICBpZiAoIWluZm8tPnNoYXJlZCkKKwl7CisJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKKwkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisJICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWxhLmdvdCBzZWN0aW9uLgorCSBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCisJIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWxhLmdvdCwKKwkgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUKKwkgYmVsb3cuICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJcy0+X3Jhd19zaXplID0gMDsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgc2hhcmVkIGxpbmssIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGFsbCBQQworICAgICByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gIFdlCisgICAgIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3aWxsIG5vdAorICAgICBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCisgIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCisgICAgZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfbTY4a19oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkgZWxmX202OGtfZGlzY2FyZF9jb3BpZXMsCisJCQkJIChQVFIpIE5VTEwpOworCisgIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQorICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKKyAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KKyAgcGx0ID0gZmFsc2U7CisgIHJlbG9jcyA9IGZhbHNlOworICByZWx0ZXh0ID0gZmFsc2U7CisgIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIGJvb2xlYW4gc3RyaXA7CisKKyAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCisJIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLworICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOworCisgICAgICBzdHJpcCA9IGZhbHNlOworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCisJeworCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCSAgICB7CisJICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCisJICAgICAgc3RyaXAgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KKwkgICAgICBwbHQgPSB0cnVlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKKwl7CisJICBpZiAocy0+X3Jhd19zaXplID09IDApCisJICAgIHsKKwkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKKwkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKKwkJIC5yZWxhLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KKwkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCisJCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAorCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKKwkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0CisJCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KKwkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLworCSAgICAgIHN0cmlwID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnRhcmdldDsKKworCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvYyBzZWN0aW9ucyBvdGhlcgorICAgICAgICAgICAgICAgICB0aGFuIC5yZWxhLnBsdC4gICovCisJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpICE9IDApCisJCXsKKwkJICBjb25zdCBjaGFyICpvdXRuYW1lOworCisJCSAgcmVsb2NzID0gdHJ1ZTsKKworCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKKwkJICAgICBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMCisJCSAgICAgZW50cnkuICAucmVsYS5wbHQgaXMgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoCisJCSAgICAgLmdvdC5wbHQsIHdoaWNoIGlzIG5ldmVyIHJlYWRvbmx5LiAgKi8KKwkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCisJCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKKwkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOworCQkgIGlmICh0YXJnZXQgIT0gTlVMTAorCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAorCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJICAgIHJlbHRleHQgPSB0cnVlOworCQl9CisKKwkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCisJCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICAgICAgcy0+cmVsb2NfY291bnQgPSAwOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQorCXsKKwkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmlwKQorCXsKKwkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLworICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKKwkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCisJIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgorCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCisJIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCisgICAgICBpZiAoIWluZm8tPnNoYXJlZCkKKwl7CisJICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAocGx0KQorCXsKKwkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCisJICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCisJICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQorCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChyZWxvY3MpCisJeworCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCisJICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQorCSAgICAgIHx8ICFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCisJCQkJCSAgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKHJlbHRleHQpCisJeworCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KKyAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uIGZvciB3aGljaCB3ZSBtaWdodCBuZWVkIHRvIGNvcHkKKyAgICAgcmVsb2NzLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUKKyAgICAgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudAorICAgICB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkgb3RoZXIgZHluYW1pYyBzeW1ib2wuICAqLworICBpZiAoaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBjID0gMDsKKyAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpICE9IDAKKwkgICAgICB8fCAocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCisJICAgIGNvbnRpbnVlOworCisJICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGMgKyAxOworCisJICAvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgICAgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCisKKwkgICsrYzsKKwl9CisKKyAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICAgIGVsZl9tNjhrX2FkanVzdF9keW5pbmR4LAorCQkJICAgICAgKFBUUikgJmMpOworICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCisgICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfbTY4a19hZGp1c3RfZHluaW5keCAoaCwgY3BhcmcpCisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgY3Bhcmc7Cit7CisgIGludCAqY3AgPSAoaW50ICopIGNwYXJnOworCisgIGlmIChoLT5keW5pbmR4ICE9IC0xKQorICAgIGgtPmR5bmluZHggKz0gKmNwOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSBpZiB3ZSBhcmUKKyAgIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCB3aXRoIC1Cc3ltYm9saWMuICBJdCBkaXNjYXJkcyB0aGUgc3BhY2UKKyAgIGFsbG9jYXRlZCB0byBjb3B5IFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKKyAgIGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzCisgICByb3V0aW5lLCBidXQgd2Ugd29uJ3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitlbGZfbTY4a19kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQorICAgICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgaWdub3JlOworeworICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKKworICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCisgIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlbG9jYXRlIGFuIE02OEsgRUxGIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBiZmQgKmR5bm9iajsKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7CisgIGFzZWN0aW9uICpzZ290OworICBhc2VjdGlvbiAqc3BsdDsKKyAgYXNlY3Rpb24gKnNyZWxvYzsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7CisKKyAgc2dvdCA9IE5VTEw7CisgIHNwbHQgPSBOVUxMOworICBzcmVsb2MgPSBOVUxMOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl82OEtfbWF4KQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGhvd3RvID0gaG93dG9fdGFibGUgKyByX3R5cGU7CisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKworICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAorCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisJICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgeworCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCXsKKwkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOworCQl9CisJICAgIH0KKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCisgICAgICBoID0gTlVMTDsKKyAgICAgIHN5bSA9IE5VTEw7CisgICAgICBzZWMgPSBOVUxMOworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwl7CisJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJCSsgc3ltLT5zdF92YWx1ZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisJICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisJICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKKwkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgICAgICBpZiAoKChyX3R5cGUgPT0gUl82OEtfUExUOAorCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2CisJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzIKKwkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQ4TworCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDE2TworCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDMyTykKKwkJICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEKKwkJICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisJCSAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOE8KKwkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KKwkJICAgICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8KKwkJICAgICAgIHx8ICgocl90eXBlID09IFJfNjhLX0dPVDgKKwkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMTYKKwkJCSAgICB8fCByX3R5cGUgPT0gUl82OEtfR09UMzIpCisJCQkgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsCisJCQkJICAgICAgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKQorCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAorCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKKwkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCisJCSAgfHwgKGluZm8tPnNoYXJlZAorCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCisJCSAgICAgICYmIChyX3R5cGUgPT0gUl82OEtfOAorCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMTYKKwkJCSAgfHwgcl90eXBlID09IFJfNjhLXzMyCisJCQkgIHx8IHJfdHlwZSA9PSBSXzY4S19QQzgKKwkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMTYKKwkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDMzIpKSkKKwkJeworCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCisJCSAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCisJCSAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCisJCSAgcmVsb2NhdGlvbiA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIShpbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wKKwkJICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCAocl90eXBlKQorCXsKKwljYXNlIFJfNjhLX0dPVDg6CisJY2FzZSBSXzY4S19HT1QxNjoKKwljYXNlIFJfNjhLX0dPVDMyOgorCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sCisJICAgICBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisJICBpZiAoaCAhPSBOVUxMCisJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKKwkgICAgYnJlYWs7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgUl82OEtfR09UOE86CisJY2FzZSBSXzY4S19HT1QxNk86CisJY2FzZSBSXzY4S19HT1QzMk86CisJICAvKiBSZWxvY2F0aW9uIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbgorCSAgICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworCisJICB7CisJICAgIGJmZF92bWEgb2ZmOworCisJICAgIGlmIChzZ290ID09IE5VTEwpCisJICAgICAgeworCQlzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkJQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKwkgICAgICB9CisKKwkgICAgaWYgKGggIT0gTlVMTCkKKwkgICAgICB7CisJCW9mZiA9IGgtPmdvdC5vZmZzZXQ7CisJCUJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOworCisJCWlmICghZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKKwkJICAgIHx8IChpbmZvLT5zaGFyZWQKKwkJCSYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQorCQkJJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCisJCSAgeworCQkgICAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCisJCSAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAorCQkgICAgICAgbG9jYWxseSwgb3IgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsCisJCSAgICAgICBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLi4gIFdlIG11c3QgaW5pdGlhbGl6ZQorCQkgICAgICAgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlCisJCSAgICAgICB0aGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UKKwkJICAgICAgIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyCisJCSAgICAgICB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCisKKwkJICAgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAorCQkgICAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKKwkJICAgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KKwkJICAgIGlmICgob2ZmICYgMSkgIT0gMCkKKwkJICAgICAgb2ZmICY9IH4xOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAorCQkJCSAgICBzZ290LT5jb250ZW50cyArIG9mZik7CisJCQloLT5nb3Qub2Zmc2V0IHw9IDE7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCisJCQkgICAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7CisKKwkJb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOworCisJCS8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCisJCSAgIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQorCQkgICBhbHJlYWR5IGdlbmVyYXRlZCB0aGUgbmVjZXNzYXJ5IHJlbG9jLiAgKi8KKwkJaWYgKChvZmYgJiAxKSAhPSAwKQorCQkgIG9mZiAmPSB+MTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKKworCQkgICAgaWYgKGluZm8tPnNoYXJlZCkKKwkJICAgICAgeworCQkJYXNlY3Rpb24gKnNyZWxnb3Q7CisJCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7CisKKwkJCXNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7CisJCQlCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOworCisJCQlvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCQkgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJCQkJICAgKyBvZmYpOworCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoMCwgUl82OEtfUkVMQVRJVkUpOworCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKKwkJCWJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJCQkgICAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCisJCQkJCQkgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQorCQkJCQkJICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKKwkJCSsrc3JlbGdvdC0+cmVsb2NfY291bnQ7CisJCSAgICAgIH0KKworCQkgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7CisJCSAgfQorCSAgICAgIH0KKworCSAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKKwkgICAgaWYgKHJfdHlwZSA9PSBSXzY4S19HT1Q4TworCQl8fCByX3R5cGUgPT0gUl82OEtfR09UMTZPCisJCXx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMk8pCisJICAgICAgeworCQkvKiBUaGlzIHJlbG9jYXRpb24gZG9lcyBub3QgdXNlIHRoZSBhZGRlbmQuICAqLworCQlyZWwtPnJfYWRkZW5kID0gMDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICByZWxvY2F0aW9uICs9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7CisJICB9CisJICBicmVhazsKKworCWNhc2UgUl82OEtfUExUODoKKwljYXNlIFJfNjhLX1BMVDE2OgorCWNhc2UgUl82OEtfUExUMzI6CisJICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCisJICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisKKwkgIC8qIFJlc29sdmUgYSBQTFR4eCByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAorCSAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgYnJlYWs7CisKKwkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQorCSAgICAgIHx8ICFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKwkgICAgeworCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKKwkJIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KKwkJIHVzaW5nIC1Cc3ltYm9saWMuICAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChzcGx0ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOworCSAgICB9CisKKwkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0CisJCQkrIGgtPnBsdC5vZmZzZXQpOworCSAgYnJlYWs7CisKKwljYXNlIFJfNjhLX1BMVDhPOgorCWNhc2UgUl82OEtfUExUMTZPOgorCWNhc2UgUl82OEtfUExUMzJPOgorCSAgLyogUmVsb2NhdGlvbiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4KKwkgICAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisJICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpOworCisJICBpZiAoc3BsdCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisJICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKKwkgICAgfQorCisJICByZWxvY2F0aW9uID0gaC0+cGx0Lm9mZnNldDsKKworCSAgLyogVGhpcyByZWxvY2F0aW9uIGRvZXMgbm90IHVzZSB0aGUgYWRkZW5kLiAgKi8KKwkgIHJlbC0+cl9hZGRlbmQgPSAwOworCisJICBicmVhazsKKworCWNhc2UgUl82OEtfUEM4OgorCWNhc2UgUl82OEtfUEMxNjoKKwljYXNlIFJfNjhLX1BDMzI6CisJICBpZiAoaCA9PSBOVUxMKQorCSAgICBicmVhazsKKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSBSXzY4S184OgorCWNhc2UgUl82OEtfMTY6CisJY2FzZSBSXzY4S18zMjoKKwkgIGlmIChpbmZvLT5zaGFyZWQKKwkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKKwkgICAgICAmJiAoKHJfdHlwZSAhPSBSXzY4S19QQzgKKwkJICAgJiYgcl90eXBlICE9IFJfNjhLX1BDMTYKKwkJICAgJiYgcl90eXBlICE9IFJfNjhLX1BDMzIpCisJCSAgfHwgKCFpbmZvLT5zeW1ib2xpYworCQkgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkKKwkgICAgeworCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKKwkgICAgICBib29sZWFuIHNraXAsIHJlbG9jYXRlOworCisJICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKKwkJIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCisJCSB0aW1lLiAgKi8KKworCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJeworCQkgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KKwkJCSAgKGlucHV0X2JmZCwKKwkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCisJCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7CisJCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKworCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKKwkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwKKwkJCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbiksCisJCQkJCSBuYW1lICsgNSkgPT0gMCk7CisKKwkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKKwkJICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7CisJCX0KKworCSAgICAgIHNraXAgPSBmYWxzZTsKKworCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCisJCW91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7CisJICAgICAgZWxzZQorCQl7CisJCSAgYmZkX3ZtYSBvZmY7CisKKwkJICBvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0CisJCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKKwkJCSAgaW5wdXRfc2VjdGlvbiwKKwkJCSAgJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCisJCQkgIHJlbC0+cl9vZmZzZXQpKTsKKwkJICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKKwkJICAgIHNraXAgPSB0cnVlOworCQkgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKKwkJfQorCisJICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJICAgICAgaWYgKHNraXApCisJCXsKKwkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOworCQkgIHJlbG9jYXRlID0gZmFsc2U7CisJCX0KKwkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KKyAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KKwkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKKwkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQorCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQorCQl7CisJCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisJCSAgcmVsb2NhdGUgPSBmYWxzZTsKKwkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOworCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKHJfdHlwZSA9PSBSXzY4S18zMikKKwkJICAgIHsKKwkJICAgICAgcmVsb2NhdGUgPSB0cnVlOworCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7CisJCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgbG9uZyBpbmR4OworCisJCSAgICAgIGlmIChoID09IE5VTEwpCisJCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKKwkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKKwkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkJfQorCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQorCQkJaW5keCA9IDA7CisJCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKKwkJCXsKKwkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCQkgIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBhc2VjdGlvbiAqb3NlYzsKKworCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKKwkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OworCQkJICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7CisJCQl9CisKKwkJICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKKwkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKKwkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7CisJCSAgICB9CisJCX0KKworCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCisJCQkJCSAgIHNyZWxvYy0+Y29udGVudHMpCisJCQkJCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7CisJICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OworCisJICAgICAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KKyAgICAgICAgICAgICAgICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIGV4Y2VwdCBmb3IgUl82OEtfMzIKKyAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdHVybmVkIGludG8KKyAgICAgICAgICAgICAgICAgUl82OEtfUkVMQVRJVkUuICAqLworCSAgICAgIGlmICghcmVsb2NhdGUpCisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgIGJyZWFrOworCisJY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgorCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6CisJICAvKiBUaGVzZSBhcmUgbm8tb3BzIGluIHRoZSBlbmQuICAqLworCSAgY29udGludWU7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorCisgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKKwkJCQkgICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7CisKKyAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKKwl7CisJICBzd2l0Y2ggKHIpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICAgICAgeworCQljb25zdCBjaGFyICpuYW1lOworCisJCWlmIChoICE9IE5VTEwpCisJCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJCWVsc2UKKwkJICB7CisJCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAorCQkJCQkJCSAgICBzeW10YWJfaGRyLT5zaF9saW5rLAorCQkJCQkJCSAgICBzeW0tPnN0X25hbWUpOworCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCisJCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJCSAgfQorCQlpZiAoIShpbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93CisJCSAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCSAgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCisgICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Cit7CisgIGJmZCAqZHlub2JqOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIGFzZWN0aW9uICpzZ290OworICAgICAgYXNlY3Rpb24gKnNyZWxhOworICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7CisgICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOworCisgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0CisJIGl0IHVwLiAgKi8KKworICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisKKyAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOworICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOworCisgICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAorCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCisJIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQorCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLworICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKKworICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAorCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCisJIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLworICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7CisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX202OGtfcGx0X2VudHJ5LAorCSAgICAgIFBMVF9FTlRSWV9TSVpFKTsKKyAgICAgIC8qIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGV4dGVuc2lvbiB3b3JkLiAgKi8KKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCSAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCSAgICsgZ290X29mZnNldAorCQkgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICsgaC0+cGx0Lm9mZnNldCArIDIpKSwKKwkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKKworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2luZGV4ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKSwKKwkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAxMCk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAtIChoLT5wbHQub2Zmc2V0ICsgMTYpLAorCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDE2KTsKKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKKwkJICAgKyBoLT5wbHQub2Zmc2V0CisJCSAgICsgOCksCisJCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KKyAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICArIGdvdF9vZmZzZXQpOworICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0pNUF9TTE9UKTsKKyAgICAgIHJlbGEucl9hZGRlbmQgPSAwOworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCisJCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKKwkJCQkgICsgcGx0X2luZGV4KSk7CisKKyAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisJeworCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgorCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCisJICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOworCX0KKyAgICB9CisKKyAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZ290OworICAgICAgYXNlY3Rpb24gKnNyZWxhOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKworICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0CisJIHVwLiAgKi8KKworICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKKworICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCisJIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgorCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KKwkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KKwkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLworICAgICAgaWYgKGluZm8tPnNoYXJlZAorCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQorCXsKKwkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7CisJICByZWxhLnJfYWRkZW5kID0gYmZkX2dldF9zaWduZWRfMzIgKG91dHB1dF9iZmQsCisJCQkJCSAgICAgKHNnb3QtPmNvbnRlbnRzCisJCQkJCSAgICAgICsgKGgtPmdvdC5vZmZzZXQgJiB+MSkpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsCisJCSAgICAgIHNnb3QtPmNvbnRlbnRzICsgKGgtPmdvdC5vZmZzZXQgJiB+MSkpOworCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0dMT0JfREFUKTsKKwkgIHJlbGEucl9hZGRlbmQgPSAwOworCX0KKworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCisJCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKKwkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7CisgICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKKyAgICB9CisKKyAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKworICAgICAgLyogVGhpcyBzeW1ib2wgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KKworICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMQorCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAorCQkJCSAgICIucmVsYS5ic3MiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzY4S19DT1BZKTsKKyAgICAgIHJlbGEucl9hZGRlbmQgPSAwOworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCisJCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cworCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOworICAgICAgKytzLT5yZWxvY19jb3VudDsKKyAgICB9CisKKyAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KKyAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAorICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKKyAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnNnb3Q7CisgIGFzZWN0aW9uICpzZHluOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKKyAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKyAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOworCisgICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOworICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOworICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCisJeworCSAgRWxmX0ludGVybmFsX0R5biBkeW47CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgYXNlY3Rpb24gKnM7CisKKwkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOworCisJICBzd2l0Y2ggKGR5bi5kX3RhZykKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfUExUR09UOgorCSAgICAgIG5hbWUgPSAiLmdvdCI7CisJICAgICAgZ290byBnZXRfdm1hOworCSAgICBjYXNlIERUX0pNUFJFTDoKKwkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7CisJICAgIGdldF92bWE6CisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKKwkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOworCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9QTFRSRUxTWjoKKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKKwkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7CisJICAgICAgZWxzZQorCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfUkVMQVNaOgorCSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSByZWxvY3MgKERUX0pNUFJFTCkgc2hvdWxkCisJCSBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG92ZXJhbGwgcmVsb2NzIChEVF9SRUxBKS4KKwkJIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTEFTWiBlbnRyeSBoZXJlIHRvCisJCSBtYWtlIGl0IG5vdCBpbmNsdWRlIHRoZSBKTVBSRUwgcmVsb2NzLiAgU2luY2UgdGhlCisJCSBsaW5rZXIgc2NyaXB0IGFycmFuZ2VzIGZvciAucmVsYS5wbHQgdG8gZm9sbG93IGFsbAorCQkgb3RoZXIgcmVsb2NhdGlvbiBzZWN0aW9ucywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQorCQkgYWJvdXQgY2hhbmdpbmcgdGhlIERUX1JFTEEgZW50cnkuICAqLworCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOworCSAgICAgIGlmIChzICE9IE5VTEwpCisJCXsKKwkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCisJCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fY29va2VkX3NpemU7CisJCSAgZWxzZQorCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X3Jhd19zaXplOworCQl9CisJICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogRmlsbCBpbiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQorCXsKKwkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9tNjhrX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0CisJCSAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMikpLAorCQkgICAgICBzcGx0LT5jb250ZW50cyArIDQpOworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgKKwkJICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxMCkpLAorCQkgICAgICBzcGx0LT5jb250ZW50cyArIDEyKTsKKwl9CisKKyAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZQorCT0gUExUX0VOVFJZX1NJWkU7CisgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IHRocmVlIGVudHJpZXMgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKKyAgICB7CisgICAgICBpZiAoc2R5biA9PSBOVUxMKQorCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7CisgICAgICBlbHNlCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAorCQkgICAgc2dvdC0+Y29udGVudHMpOworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA4KTsKKyAgICB9CisKKyAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKKworICBpZiAoaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZHluc3ltOworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKKyAgICAgIGludCBjOworCisgICAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCisKKyAgICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOworICAgICAgQkZEX0FTU0VSVCAoc2R5bnN5bSAhPSBOVUxMKTsKKworICAgICAgc3ltLnN0X3NpemUgPSAwOworICAgICAgc3ltLnN0X25hbWUgPSAwOworICAgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7CisgICAgICBzeW0uc3Rfb3RoZXIgPSAwOworCisgICAgICBjID0gMDsKKyAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGludCBpbmR4OworCisJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIHN5bS5zdF92YWx1ZSA9IHMtPnZtYTsKKworCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKKwkgIEJGRF9BU1NFUlQgKGluZHggPiAwKTsKKwkgIHN5bS5zdF9zaG5keCA9IGluZHg7CisKKwkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCisJCQkJICAgICAoUFRSKSAoKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCQkJICAgICBzZHluc3ltLT5jb250ZW50cykKKwkJCQkJICAgICsgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHgpKTsKKworCSAgKytjOworCX0KKworICAgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvIHRoZQorICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLworICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0gYyArIDE7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX202OGtfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1tNjhrIgorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV82OEsKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgyMDAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKKwkJCQkJX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKwkJCQkJZWxmX202OGtfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxfbGluaworCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGZfbTY4a19jaGVja19yZWxvY3MKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKKwkJCQkJZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCisjZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCisJCQkJCWVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24KKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKKwkJCQkJZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKKwkJCQkJZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCWVsZl9tNjhrX2djX21hcmtfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCWVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfRU5UUllfU0laRQorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbTg4ay5jIGIvYmZkL2VsZjMyLW04OGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2M1MzVlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLW04OGsuYwpAQCAtMCwwICsxLDM1IEBACisvKiBNb3Rvcm9sYSA4OGstc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKworLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9ucywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaAorICAgZm9yIEdEQi4gICovCisKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tODhrX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tODhrIgorI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTg4aworI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNXzg4SworI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCisKKyNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tY29yZS5jIGIvYmZkL2VsZjMyLW1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzYTM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGYzMi1tY29yZS5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKiBNb3Rvcm9sbGEgTUNvcmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgorICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUkNFIEVMRiBBQkkuICBUaGUKKyAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFJDRSBFTEYgQUJJLiAgICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImVsZi9tY29yZS5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lCVVTRV9SRUxBCS8qIE9ubHkgVVNFX1JFTCBpcyBhY3R1YWxseSBzaWduaWZpY2FudCwgYnV0IHRoaXMgaXMKKwkJCSAgIGhlcmUgYXJlIGEgcmVtaW5kZXIuLi4gKi8KKworc3RhdGljIHZvaWQgbWNvcmVfZWxmX2hvd3RvX2luaXQKKyAgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBtY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOworc3RhdGljIHZvaWQgbWNvcmVfZWxmX2luZm9fdG9faG93dG8KKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKKyAgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7CitzdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCisgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSBSX01DT1JFX21heF07CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIG1jb3JlX2VsZl9ob3d0b19yYXdbXSA9Cit7CisgIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KKyAgSE9XVE8gKFJfTUNPUkVfTk9ORSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDEsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01DT1JFX05PTkUiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX01DT1JFX0FERFIzMiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJBRERSMzIiLAkJLyogbmFtZSAqLy8qIEZvciBjb21wYXRhYmlsaXR5IHdpdGggY29mZi9wZSBwb3J0LiAgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgorICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCisgIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLworCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NQ09SRV9QQ1JFTElNTThCWTQiLC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBic3IvYnQvYmYvYnIgaW5zdHJ1Y3Rpb25zOyAxMSBiaXRzICsgMSB6ZXJvIGJpdCAKKyAgICAgU3BhbiAyayBpbnN0cnVjdGlvbnMgPT0gNGsgYnl0ZXMuCisgICAgIE9ubHkgdXNlZnVsIHBpZWNlcyBhdCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIHRoZSBvcGNvZGUgKDUgYml0cykgKi8KKyAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwvKiB0eXBlICovCisJIDEsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMSwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUNPUkVfUENSRUxJTU0xMUJZMiIsLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwLAkJCS8qIHNyY19tYXNrICovCisJIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDQgYml0cyArIDEgemVybyBiaXQ7ICdsb29wdCcgaW5zdHJ1Y3Rpb24gb25seTsgdW5zdXBwb3J0ZWQuICovCisgIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NNEJZMiwJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01DT1JFX1BDUkVMSU1NNEJZMiIsLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyLWJpdCBwYy1yZWxhdGl2ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgaGVscCBzdXBwb3J0IFBJQyBjb2RlLiAqLworICBIT1dUTyAoUl9NQ09SRV9QQ1JFTDMyLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NQ09SRV9QQ1JFTDMyIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMaWtlIFBDUkVMSU1NMTFCWTIsIHRoaXMgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhCisgICAgICdqc3JpJyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIFRoZXJlIGlzIGEgc2VwYXJhdGUgcmVsb2NhdGlvbgorICAgICBlbnRyeSBmb3IgdGhlIGxpdGVyYWwgcG9vbCBlbnRyeSB0aGF0IGl0IHJlZmVyZW5jZXMsIGJ1dCB3ZSAKKyAgICAgbWlnaHQgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGpzcmkgdG8gYSBic3IgaWYgdGhlIHRhcmdldCB0dXJucyBvdXQKKyAgICAgdG8gYmUgY2xvc2UgZW5vdWdoIFtldmVuIHRob3VnaCB3ZSB3b24ndCByZWNsYWltIHRoZSBsaXRlcmFsIHBvb2wKKyAgICAgZW50cnksIHdlJ2xsIGdldCBzb21lIHJ1bnRpbWUgZWZmaWNpZW5jeSBiYWNrXS4gTm90ZSB0aGF0IHRoaXMKKyAgICAgaXMgYSByZWxvY2F0aW9uIHRoYXQgd2UgYXJlIGFsbG93ZWQgdG8gc2FmZWx5IGlnbm9yZS4gICovIAorICBIT1dUTyAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwvKiB0eXBlICovCisJIDEsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMSwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIiLCAvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLworICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisgICAgICAgICAiUl9NQ09SRV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KKyAgSE9XVE8gKFJfTUNPUkVfR05VX1ZURU5UUlksICAgLyogdHlwZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX01DT1JFX0dOVV9WVEVOVFJZIiwgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCit9OworCisjaWZuZGVmIE5VTV9FTEVNCisjZGVmaW5lIE5VTV9FTEVNKGEpIChzaXplb2YgKGEpIC8gc2l6ZW9mIChhKVswXSkKKyNlbmRpZgorDAorLyogSW5pdGlhbGl6ZSB0aGUgbWNvcmVfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCitzdGF0aWMgdm9pZAorbWNvcmVfZWxmX2hvd3RvX2luaXQgKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gTlVNX0VMRU0gKG1jb3JlX2VsZl9ob3d0b19yYXcpOyBpLS07KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCB0eXBlOworICAgICAgCisgICAgICB0eXBlID0gbWNvcmVfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOworICAgICAgCisgICAgICBCRkRfQVNTRVJUICh0eXBlIDwgTlVNX0VMRU0gKG1jb3JlX2VsZl9ob3d0b190YWJsZSkpOworICAgICAgCisgICAgICBtY29yZV9lbGZfaG93dG9fdGFibGUgW3R5cGVdID0gJiBtY29yZV9lbGZfaG93dG9fcmF3IFtpXTsKKyAgICB9Cit9CisKKwwKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK21jb3JlX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUgbWNvcmVfcmVsb2MgPSBSX01DT1JFX05PTkU7CisKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfTk9ORTsgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CQkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfQUREUjMyOyBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTThCWTQ7IGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOiAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NMTFCWTI7IGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6CSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX1BDUkVMSU1NNEJZMjsgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTDMyOyBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6IG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMjsgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6ICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfR05VX1ZUSU5IRVJJVDsgYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOiAgICAgICAgICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfR05VX1ZURU5UUlk7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOworICAgIH0KKworICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KKyAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKKworICByZXR1cm4gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSBtY29yZV9yZWxvY107Cit9OworCisvKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgUkNFIEVMRiByZWxvYy4gICovCitzdGF0aWMgdm9pZAorbWNvcmVfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKiBhYmZkOworICAgICBhcmVsZW50ICogY2FjaGVfcHRyOworICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICogZHN0OworeworICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KKyAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKKworICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfTUNPUkVfbWF4KTsKKyAgCisgIGNhY2hlX3B0ci0+aG93dG8gPSBtY29yZV9lbGZfaG93dG9fdGFibGUgW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKK30KKworLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KK3N0YXRpYyBib29sZWFuCittY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQorICAgICBiZmQgKiBhYmZkOworICAgICBmbGFnd29yZCBmbGFnczsKK3sKKyAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKKwkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7CisKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKKyAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlci4gICovCitzdGF0aWMgYm9vbGVhbgorbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICogaWJmZDsKKyAgICAgYmZkICogb2JmZDsKK3sKKyAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIEJGRF9BU1NFUlQgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpCisJICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOworCisgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7CisgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7CisgIHJldHVybiB0cnVlOworfQorCisvKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0CisgICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLworc3RhdGljIGJvb2xlYW4KK21jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKiBpYmZkOworICAgICBiZmQgKiBvYmZkOworeworICBmbGFnd29yZCBvbGRfZmxhZ3M7CisgIGZsYWd3b3JkIG5ld19mbGFnczsKKyAgYm9vbGVhbiBlcnJvcjsKKworICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLworICBpZiAoICAgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgorICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4uXG4iKSwKKwkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCisgICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaWJmZCkgPyAiYmlnIiA6ICJsaXR0bGUiLAorICAgICAgICAgYmZkX2JpZ19lbmRpYW4gKG9iZmQpID8gImJpZyIgOiAibGl0dGxlIik7CisKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7CisgIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOworICAKKyAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KKyAgICB7CisgICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOworICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7CisgICAgfQorICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQkvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLworICAgIDsKKyAgCisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBEb24ndCBwcmV0ZW5kIHdlIGNhbiBkZWFsIHdpdGggdW5zdXBwb3J0ZWQgcmVsb2NzLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKiBhYmZkOworICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKiBzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqIG91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZTsKK3sKKyAgQkZEX0FTU0VSVCAocmVsb2NfZW50cnktPmhvd3RvICE9IChyZWxvY19ob3d0b190eXBlICopMCk7CisgIAorICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBSZWxvY2F0aW9uICVzICglZCkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSwKKwkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCisJCSAgICAgIHJlbG9jX2VudHJ5LT5ob3d0by0+bmFtZSwKKwkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT50eXBlKTsKKworICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKK30KKworDAorLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKKyAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KKworICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCisgICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKKyAgIHplcm8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcworICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKKyAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKKyAgIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCisgICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCisKKyAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCisKKyAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQorICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCisKKyAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAorICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgorCisgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQorICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKKyAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKKyAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCisgICBhY2NvcmRpbmdseS4gICovCisKK3N0YXRpYyBib29sZWFuCittY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKKyAgICAgYmZkICogb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworICAgICBiZmQgKiBpbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKiBjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKiByZWxvY3M7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKiBsb2NhbF9zZWN0aW9uczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbCA9IHJlbG9jczsKKyAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgbG9uZyBpbnNuOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLAorCSAgICJtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYWxsZWQgZm9yICVzIHNlY3Rpb24gJXMsICVsZCByZWxvY2F0aW9ucyVzXG4iLAorCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJICAgYmZkX3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAorCSAgIChsb25nKSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCwKKwkgICAoaW5mby0+cmVsb2NhdGVhYmxlKSA/ICIgKHJlbG9jYXRhYmxlKSIgOiAiIik7CisjZW5kaWYKKworICBpZiAoISBtY29yZV9lbGZfaG93dG9fdGFibGUgW1JfTUNPUkVfUENSRUxJTU04Qlk0XSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KKyAgICBtY29yZV9lbGZfaG93dG9faW5pdCAoKTsKKworICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICB7CisgICAgICBlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlICAgIHJfdHlwZSA9IChlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKKyAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKKyAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgciA9IGJmZF9yZWxvY19vdGhlcjsKKyAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjID0gKGFzZWN0aW9uICopIDA7CisgICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgIGhvd3RvOworICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOworICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW0gPSAoRWxmX0ludGVybmFsX1N5bSAqKSAwOworICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICByX3N5bW5keDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAwOworICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICBvbGRpbnN0OworICAgICAgCisgICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KKyAgICAgIGlmICgodW5zaWduZWQpIHJfdHlwZSA+PSAodW5zaWduZWQpIFJfTUNPUkVfbWF4CisJICB8fCAhIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludClyX3R5cGVdKQorCXsKKwkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkXG4iKSwKKwkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJCQkgICAgICAoaW50KSByX3R5cGUpOworCisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldCA9IGZhbHNlOworCSAgY29udGludWU7CisJfQorICAgICAgCisgICAgICBob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgcl90eXBlXTsKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKyAgICAgIAorICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAorCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisJICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgeworCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgICAgICAKKwkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQl7CisJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkJfQorCSAgICB9CisKKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKKwkJICAgaG93dG8tPm5hbWUsIChpbnQpIHJfdHlwZSwgcl9zeW1uZHgsIChsb25nKSBvZmZzZXQsIChsb25nKSBhZGRlbmQpOworI2VuZGlmCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKworICAgICAgLyogQ29tcGxhaW4gYWJvdXQga25vd24gcmVsb2NhdGlvbiB0aGF0IGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uID09IG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYykKKwl7CisJICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiBSZWxvY2F0aW9uICVzICglZCkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSwKKwkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJCQkgICAgICBob3d0by0+bmFtZSwKKwkJCSAgICAgIChpbnQpcl90eXBlKTsKKworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXQgPSBmYWxzZTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwl7CisJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKwkgIGlmICggICBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCkKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCQkoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAorCQkgCSBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIHJldCA9IGZhbHNlOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorCisgICAgICBzd2l0Y2ggKHJfdHlwZSkKKwl7CisJZGVmYXVsdDoKKwljYXNlIFJfTUNPUkVfUENSRUxJTU04Qlk0OgkKKwljYXNlIFJfTUNPUkVfUENSRUxJTU0xMUJZMjoKKwljYXNlIFJfTUNPUkVfUENSRUxJTU00QlkyOgorCSAgYnJlYWs7CisKKwljYXNlIFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI6CisJICBvbGRpbnN0ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7CisjZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAorCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBNQ09SRV9JTlNUX0JTUiwgY29udGVudHMgKyBvZmZzZXQpOworCSAgYnJlYWs7CisJfQorCisKKyNpZmRlZiBERUJVRworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKKwkgICAgICAgaG93dG8tPm5hbWUsIHJfdHlwZSwgcl9zeW1uZHgsIChsb25nKSBvZmZzZXQsIChsb25nKSBhZGRlbmQpOworI2VuZGlmCisKKyAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKKwkoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgcmVsb2NhdGlvbiwgYWRkZW5kKTsKKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rICYmIHJfdHlwZSA9PSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyKQorCXsKKwkgIC8qIFdhc24ndCBvaywgYmFjayBpdCBvdXQgYW5kIGdpdmUgdXAuICAqLworCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBvbGRpbnN0LCBjb250ZW50cyArIG9mZnNldCk7CisJICByID0gYmZkX3JlbG9jX29rOworCX0KKyAgICAgIAorICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIHJldCA9IGZhbHNlOworCSAgCisJICBzd2l0Y2ggKHIpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKiBuYW1lOworCisJCWlmIChoICE9IE5VTEwpCisJCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJCWVsc2UKKwkJICB7CisJCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOworCQkgICAgCisJCSAgICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgICBicmVhazsKKworCQkgICAgaWYgKCogbmFtZSA9PSAnXDAnKQorCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCQkgIH0KKworCQkoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICBvZmZzZXQpOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIHJldDsKK30KKwwKKy8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgorICAgcmVsb2NhdGlvbi4gICovCisKK3N0YXRpYyBhc2VjdGlvbiAqCittY29yZV9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICBhYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgIGluZm87CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOworeworICBpZiAoaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJeworCWNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgorCWNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQorCSAgICB7CisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKwkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIAorCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQorCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisJICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKKwkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKKwl7CisJICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOworeworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgorICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKKyAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCisgCitzdGF0aWMgYm9vbGVhbgorbWNvcmVfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKKyAgICAgYXNlY3Rpb24gKiBzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOworIAorICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworIAorICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOworICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKKyAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOworIAorICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgCisgIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworIAorICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgCisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorICAgICAgICBoID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisgCisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgICB7CisgICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKyAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKwkgIAorICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKKyAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisgICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tY29yZS1iaWciCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICAgICJlbGYzMi1tY29yZS1saXR0bGUiCisKKyNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21jb3JlCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fTUNPUkUKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAJCS8qIDRrLCBpZiB3ZSBldmVyIGhhdmUgJ2VtICovCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAlOVUxMCisKKworI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJbWNvcmVfZWxmX2djX21hcmtfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQltY29yZV9lbGZfZ2Nfc3dlZXBfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgbWNvcmVfZWxmX2NoZWNrX3JlbG9jcworCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWlwcy5jIGIvYmZkL2VsZjMyLW1pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAzMjYyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLW1pcHMuYwpAQCAtMCwwICsxLDc4MDAgQEAKKy8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgorICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQsCisgICA8aWFuQGN5Z251cy5jb20+LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBoYW5kbGVzIE1JUFMgRUxGIHRhcmdldHMuICBTR0kgSXJpeCA1IHVzZXMgYSBzbGlnaHRseQorICAgZGlmZmVyZW50IE1JUFMgRUxGIGZyb20gb3RoZXIgdGFyZ2V0cy4gIFRoaXMgbWF0dGVycyB3aGVuIGxpbmtpbmcuCisgICBUaGlzIGZpbGUgc3VwcG9ydHMgYm90aCwgc3dpdGNoaW5nIGF0IHJ1bnRpbWUuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImdlbmxpbmsuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisjaW5jbHVkZSAiZWxmL21pcHMuaCIKKworLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gICovCisjaW5jbHVkZSAiY29mZi9zeW0uaCIKKyNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKKyNpbmNsdWRlICJjb2ZmL21pcHMuaCIKKyNkZWZpbmUgRUNPRkZfMzIKKyNpbmNsdWRlICJlY29mZnN3YXAuaCIKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMzJfNjRiaXRfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CitzdGF0aWMgdm9pZCBtaXBzX2luZm9fdG9faG93dG9fcmVsCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7CitzdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqLCBFbGYzMl9ncHRhYiAqKSk7CitzdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfZ3B0YWIgKiwgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc3ltX2lzX2dsb2JhbCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjMyX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlCisgIFBBUkFNUyAoKFBUUiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCisJICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOworc3RhdGljIGludCBtaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgSU5MSU5FIGludCBlbGZfbWlwc19pc2EgUEFSQU1TICgoZmxhZ3dvcmQpKTsKK3N0YXRpYyBJTkxJTkUgaW50IGVsZl9taXBzX21hY2ggUEFSQU1TICgoZmxhZ3dvcmQpKTsKK3N0YXRpYyBJTkxJTkUgY2hhciogZWxmX21pcHNfYWJpX25hbWUgUEFSQU1TICgoZmxhZ3dvcmQpKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIKKyAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZworICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKm1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBpbnQgZ3B0YWJfY29tcGFyZSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIHZvaWQgbWlwc19lbGZfcmVsb2NhdGVfaGkxNgorICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKiwKKwkgICBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwKKyAgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAorCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICosIGJmZF92bWEpKTsKK3N0YXRpYyB2b2lkIG1pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QKKyAgIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHMxNl9qdW1wX3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfZ3ByZWxfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9hZGp1c3RfZHluaW5keAorICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKKwkgICBhc2VjdGlvbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY2hlY2tfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCisJICAgRWxmX0ludGVybmFsX1N5bSAqKSk7CitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCisJICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2VsZl9maW5hbF9ncAorICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBib29sZWFuLCBjaGFyICoqLCBiZmRfdm1hICopKTsKK3N0YXRpYyBiZmRfYnl0ZSAqZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAorCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKKworLyogVGhpcyBpcyB0cnVlIGZvciBJcml4IDUgZXhlY3V0YWJsZXMsIGZhbHNlIGZvciBub3JtYWwgTUlQUyBFTEYgQUJJCisgICBleGVjdXRhYmxlcy4gIEZJWE1FOiBBdCB0aGUgbW9tZW50LCB3ZSBkZWZhdWx0IHRvIGFsd2F5cyBnZW5lcmF0aW5nCisgICBJcml4IDUgZXhlY3V0YWJsZXMuICAqLworCisjZGVmaW5lIFNHSV9DT01QQVQoYWJmZCkgKDEpCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCAuZ290IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZy4gIEl0CisgICBpcyBzdG9yZWQgaW4gdGhlIHRkYXRhIGZpZWxkIG9mIHRoZSBiZmRfZWxmX3NlY3Rpb25fZGF0YSBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgbWlwc19nb3RfaW5mbworeworICAvKiBUaGUgc3ltYm9sIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgLmdvdCBzeW1ib2wuICAqLworICB1bnNpZ25lZCBsb25nIGdsb2JhbF9nb3RzeW07CisgIC8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgaW50IGxvY2FsX2dvdG5vOworICAvKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcyB3ZSBoYXZlIHVzZWQuICAqLworICB1bnNpZ25lZCBpbnQgYXNzaWduZWRfZ290bm87Cit9OworCisvKiBUaGUgbnVtYmVyIG9mIGxvY2FsIC5nb3QgZW50cmllcyB3ZSByZXNlcnZlLiAgKi8KKyNkZWZpbmUgTUlQU19SRVNFUlZFRF9HT1ROTyAoMikKKworLyogSW5zdHJ1Y3Rpb25zIHdoaWNoIGFwcGVhciBpbiBhIHN0dWIuICBGb3Igc29tZSByZWFzb24gdGhlIHN0dWIgaXMKKyAgIHNsaWdodGx5IGRpZmZlcmVudCBvbiBhbiBTR0kgc3lzdGVtLiAgKi8KKyNkZWZpbmUgRUxGX01JUFNfR1BfT0ZGU0VUKGFiZmQpIChTR0lfQ09NUEFUIChhYmZkKSA/IDB4N2ZmMCA6IDB4ODAwMCkKKyNkZWZpbmUgU1RVQl9MVyhhYmZkKQkJCQkJXAorICAoU0dJX0NPTVBBVCAoYWJmZCkJCQkJCVwKKyAgID8gMHg4Zjk5ODAxMAkJCS8qIGx3IHQ5LDB4ODAxMChncCkgKi8JXAorICAgOiAweDhmOTk4MDAwKQkJLyogbHcgdDksMHg4MDAwKGdwKSAqLworI2RlZmluZSBTVFVCX01PVkUgMHgwM2UwNzgyNQkvKiBtb3ZlIHQ3LHJhICovCisjZGVmaW5lIFNUVUJfSkFMUiAweDAzMjBmODA5CS8qIGphbCB0OSAqLworI2RlZmluZSBTVFVCX0xJMTYgMHgzNDE4MDAwMAkvKiBvcmkgdDgsemVybywwICovCisjZGVmaW5lIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFICgxNikKKworI2lmIDAKKy8qIFdlIG5vIGxvbmdlciB0cnkgdG8gaWRlbnRpZnkgcGFydGljdWxhciBzZWN0aW9ucyBmb3IgdGhlIC5keW5zeW0KKyAgIHNlY3Rpb24uICBXaGVuIHdlIGRvLCB3ZSB3aW5kIHVwIGNyYXNoaW5nIGlmIHRoZXJlIGFyZSBvdGhlciByYW5kb20KKyAgIHNlY3Rpb25zIHdpdGggcmVsb2NhdGlvbnMuICAqLworCisvKiBOYW1lcyBvZiBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiBpbiBhbiBJcml4IDUKKyAgIGV4ZWN1dGFibGUuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbXSA9Cit7CisgICIudGV4dCIsCisgICIuaW5pdCIsCisgICIuZmluaSIsCisgICIuZGF0YSIsCisgICIucm9kYXRhIiwKKyAgIi5zZGF0YSIsCisgICIuc2JzcyIsCisgICIuYnNzIiwKKyAgTlVMTAorfTsKKworI2RlZmluZSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMgXAorICAoc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMgLyBzaXplb2YgbWlwc19lbGZfZHluc3ltX3NlY19uYW1lc1swXSkKKworLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXMgd2hpY2ggZ28gaW4gdGhlCisgICB0ZXh0IHNlZ21lbnQuICAqLworCisjZGVmaW5lIE1JUFNfVEVYVF9EWU5TWU1fU0VDTk8gKDMpCisKKyNlbmRpZiAvKiAwICovCisKKy8qIFRoZSBuYW1lcyBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgc3ltYm9scyB1c2VkIG9uIElyaXggNS4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1tdID0KK3sKKyAgIl9wcm9jZWR1cmVfdGFibGUiLAorICAiX3Byb2NlZHVyZV9zdHJpbmdfdGFibGUiLAorICAiX3Byb2NlZHVyZV90YWJsZV9zaXplIiwKKyAgTlVMTAorfTsKKworLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gb24KKyAgIElyaXggNS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgaWQxOwkJLyogQWx3YXlzIG9uZT8gICovCisgIHVuc2lnbmVkIGxvbmcgbnVtOwkJLyogTnVtYmVyIG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBpZDI7CQkvKiBBbHdheXMgdHdvPyAgKi8KKyAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CQkvKiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHJlbG9jYXRpb24uICAqLworICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMDsJLyogWmVybz8gICovCisgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQxOwkvKiBaZXJvPyAgKi8KK30gRWxmMzJfY29tcGFjdF9yZWw7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGJmZF9ieXRlIGlkMVs0XTsKKyAgYmZkX2J5dGUgbnVtWzRdOworICBiZmRfYnl0ZSBpZDJbNF07CisgIGJmZF9ieXRlIG9mZnNldFs0XTsKKyAgYmZkX2J5dGUgcmVzZXJ2ZWQwWzRdOworICBiZmRfYnl0ZSByZXNlcnZlZDFbNF07Cit9IEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsOworCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBpbnQgY3R5cGUgOiAxOwkvKiAxOiBsb25nIDA6IHNob3J0IGZvcm1hdC4gU2VlIGJlbG93LiAgKi8KKyAgdW5zaWduZWQgaW50IHJ0eXBlIDogNDsJLyogUmVsb2NhdGlvbiB0eXBlcy4gU2VlIGJlbG93LiAqLworICB1bnNpZ25lZCBpbnQgZGlzdDJ0byA6IDg7CisgIHVuc2lnbmVkIGludCByZWx2YWRkciA6IDE5OwkvKiAoVkFERFIgLSB2YWRkciBvZiB0aGUgcHJldmlvdXMgZW50cnkpLyA0ICovCisgIHVuc2lnbmVkIGxvbmcga29uc3Q7CQkvKiBLT05TVCBmaWVsZC4gU2VlIGJlbG93LiAgKi8KKyAgdW5zaWduZWQgbG9uZyB2YWRkcjsJCS8qIFZBRERSIHRvIGJlIHJlbG9jYXRlZC4gICovCit9IEVsZjMyX2NyaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCisgIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KKyAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OworICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLworICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCit9IEVsZjMyX2NyaW5mbzI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGJmZF9ieXRlIGluZm9bNF07CisgIGJmZF9ieXRlIGtvbnN0WzRdOworICBiZmRfYnl0ZSB2YWRkcls0XTsKK30gRWxmMzJfRXh0ZXJuYWxfY3JpbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICBiZmRfYnl0ZSBpbmZvWzRdOworICBiZmRfYnl0ZSBrb25zdFs0XTsKK30gRWxmMzJfRXh0ZXJuYWxfY3JpbmZvMjsKKworLyogVGhlc2UgYXJlIHRoZSBjb25zdGFudHMgdXNlZCB0byBzd2FwIHRoZSBiaXRmaWVsZHMgaW4gYSBjcmluZm8uICAqLworCisjZGVmaW5lIENSSU5GT19DVFlQRSAoMHgxKQorI2RlZmluZSBDUklORk9fQ1RZUEVfU0ggKDMxKQorI2RlZmluZSBDUklORk9fUlRZUEUgKDB4ZikKKyNkZWZpbmUgQ1JJTkZPX1JUWVBFX1NIICgyNykKKyNkZWZpbmUgQ1JJTkZPX0RJU1QyVE8gKDB4ZmYpCisjZGVmaW5lIENSSU5GT19ESVNUMlRPX1NIICgxOSkKKyNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSICgweDdmZmZmKQorI2RlZmluZSBDUklORk9fUkVMVkFERFJfU0ggKDApCisKKy8qIEEgY29tcGFjdCByZWxvY2F0aW9uIGluZm8gaGFzIGxvbmcgKDMgd29yZHMpIG9yIHNob3J0ICgyIHdvcmRzKQorICAgZm9ybWF0cy4gIEEgc2hvcnQgZm9ybWF0IGRvZXNuJ3QgaGF2ZSBWQUREUiBmaWVsZCBhbmQgcmVsdmFkZHIKKyAgIGZpZWxkcyBjb250YWlucyAoKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KSA+PiAyKS4gICovCisjZGVmaW5lIENSRl9NSVBTX0xPTkcJCQkxCisjZGVmaW5lIENSRl9NSVBTX1NIT1JUCQkJMAorCisvKiBUaGVyZSBhcmUgNCB0eXBlcyBvZiBjb21wYWN0IHJlbG9jYXRpb24gYXQgbGVhc3QuIFRoZSB2YWx1ZSBLT05TVAorICAgaGFzIGRpZmZlcmVudCBtZWFuaW5nIGZvciBlYWNoIHR5cGU6CisKKyAgICh0eXBlKQkJKGtvbnN0KQorICAgQ1RfTUlQU19SRUwzMglBZGRyZXNzIGluIGRhdGEKKyAgIENUX01JUFNfV09SRAkJQWRkcmVzcyBpbiB3b3JkIChYWFgpCisgICBDVF9NSVBTX0dQSElfTE8JR1AgLSB2YWRkcgorICAgQ1RfTUlQU19KTVBBRAlBZGRyZXNzIHRvIGp1bXAKKyAgICovCisKKyNkZWZpbmUgQ1JUX01JUFNfUkVMMzIJCQkweGEKKyNkZWZpbmUgQ1JUX01JUFNfV09SRAkJCTB4YgorI2RlZmluZSBDUlRfTUlQU19HUEhJX0xPCQkweGMKKyNkZWZpbmUgQ1JUX01JUFNfSk1QQUQJCQkweGQKKworI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZm9ybWF0KHgsZm9ybWF0KQkoKHgpLmN0eXBlID0gKGZvcm1hdCkpCisjZGVmaW5lIG1pcHNfZWxmX3NldF9jcl90eXBlKHgsdHlwZSkJCSgoeCkucnR5cGUgPSAodHlwZSkpCisjZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvKHgsdikJCSgoeCkuZGlzdDJ0byA9ICh2KSkKKyNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX3JlbHZhZGRyKHgsZCkJCSgoeCkucmVsdmFkZHIgPSAoZCk8PDIpCisKK3N0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NvbXBhY3RfcmVsX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfY29tcGFjdF9yZWwgKiwgRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwgKikpOworc3RhdGljIHZvaWQgYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfY3JpbmZvICosIEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSk7CisKKyNkZWZpbmUgVVNFX1JFTAkxCQkvKiBNSVBTIHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19ob3d0b190YWJsZVtdID0KK3sKKyAgLyogTm8gcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfTk9ORSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19OT05FIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU18xNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfTUlQU18zMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTXzMyIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgc3ltYm9sIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9NSVBTX1JFTDMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfUkVMMzIiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMjYgYml0IGJyYW5jaCBhZGRyZXNzLiAgKi8KKyAgSE9XVE8gKFJfTUlQU18yNiwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93CisJCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCisJCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTXzI2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCisgIEhPV1RPIChSX01JUFNfSEkxNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfSEkxNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCisgIEhPV1RPIChSX01JUFNfTE8xNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfTE8xNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCisgIEhPV1RPIChSX01JUFNfR1BSRUwxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dQUkVMMTYiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFJlZmVyZW5jZSB0byBsaXRlcmFsIHNlY3Rpb24uICAqLworICBIT1dUTyAoUl9NSVBTX0xJVEVSQUwsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19MSVRFUkFMIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBSZWZlcmVuY2UgdG8gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIEhPV1RPIChSX01JUFNfR09UMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dPVDE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCisgIEhPV1RPIChSX01JUFNfR1BSRUwzMiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR1BSRUwzMiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAgIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBkZWZpbmVkIG9uIElyaXggNSwgYWx0aG91Z2ggdGhleSBhcmUKKyAgICAgICBub3QgZGVmaW5lZCBieSB0aGUgQUJJLiAgKi8KKyAgICB7IDEzIH0sCisgICAgeyAxNCB9LAorICAgIHsgMTUgfSwKKworICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA1LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgNiwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDdjMCwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KKyAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKKyAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgNiwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDdjNCwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDA3YzQsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDY0IGJpdCByZWxvY2F0aW9uLiAgVGhpcyBpcyB1c2VkIGluIDMyIGJpdCBFTEYgd2hlbiBhZGRyZXNzZXMKKyAgICAgYXJlIDY0IGJpdHMgbG9uZzsgdGhlIHVwcGVyIDMyIGJpdHMgYXJlIHNpbXBseSBhIHNpZ24gZXh0ZW5zaW9uLgorICAgICBUaGUgZmllbGRzIG9mIHRoZSBob3d0byBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZm9yIFJfTUlQU18zMiwKKyAgICAgb3RoZXIgdGhhbiB0aGUgdHlwZSwgbmFtZSwgYW5kIHNwZWNpYWxfZnVuY3Rpb24uICAqLworICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgbWlwczMyXzY0Yml0X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBEaXNwbGFjZW1lbnQgdG8gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfR09UX1BBR0UsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dPVF9QQUdFIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVF9MTzE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dPVF9MTzE2IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDY0IGJpdCBzdWJ0cmFjdGlvbi4gIFByZXN1bWFibHkgbm90IHVzZWQgaW4gMzIgYml0IEVMRi4gICovCisgIHsgUl9NSVBTX1NVQiB9LAorCisgIC8qIFVzZWQgdG8gY2F1c2UgdGhlIGxpbmtlciB0byBpbnNlcnQgYW5kIGRlbGV0ZSBpbnN0cnVjdGlvbnM/ICAqLworICB7IFJfTUlQU19JTlNFUlRfQSB9LAorICB7IFJfTUlQU19JTlNFUlRfQiB9LAorICB7IFJfTUlQU19ERUxFVEUgfSwKKworICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZXMgb2YgYSA2NCBiaXQgYWRkZW5kLiAgUHJlc3VtYWJseSBub3QgdXNlZCBpbgorICAgICAzMiBiaXQgRUxGLiAgKi8KKyAgeyBSX01JUFNfSElHSEVSIH0sCisgIHsgUl9NSVBTX0hJR0hFU1QgfSwKKworICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICB7IFJfTUlQU19TQ05fRElTUCB9LAorICB7IFJfTUlQU19SRUwxNiB9LAorICB7IFJfTUlQU19BRERfSU1NRURJQVRFIH0sCisgIHsgUl9NSVBTX1BKVU1QIH0sCisgIHsgUl9NSVBTX1JFTEdPVCB9Cit9OworCisvKiBUaGUgcmVsb2MgdXNlZCBmb3IgQkZEX1JFTE9DX0NUT1Igd2hlbiBkb2luZyBhIDY0IGJpdCBsaW5rLiAgVGhpcworICAgaXMgYSBoYWNrIHRvIG1ha2UgdGhlIGxpbmtlciB0aGluayB0aGF0IHdlIG5lZWQgNjQgYml0IHZhbHVlcy4gICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19jdG9yNjRfaG93dG8gPQorICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1pcHMzMl82NGJpdF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KKworLyogVGhlIHJlbG9jIHVzZWQgZm9yIHRoZSBtaXBzMTYganVtcCBpbnN0cnVjdGlvbi4gICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwczE2X2p1bXBfaG93dG8gPQorICBIT1dUTyAoUl9NSVBTMTZfMjYsCQkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdworCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgorCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLworCSBtaXBzMTZfanVtcF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTMTZfMjYiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KKworLyogVGhlIHJlbG9jIHVzZWQgZm9yIHRoZSBtaXBzMTYgZ3ByZWwgaW5zdHJ1Y3Rpb24uICBUaGUgc3JjX21hc2sgYW5kCisgICBkc2tfbWFzayBmb3IgdGhpcyBob3d0byBkbyBub3QgcmVmbGVjdCB0aGUgYWN0dWFsIGluc3RydWN0aW9uLCBpbgorICAgd2hpY2ggdGhlIHZhbHVlIGlzIG5vdCBjb250aWd1b3VzOyB0aGUgbWFza3MgYXJlIGZvciB0aGUKKyAgIGNvbnZlbmllbmNlIG9mIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9ncHJlbF9ob3d0byA9CisgIEhPV1RPIChSX01JUFMxNl9HUFJFTCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIG1pcHMxNl9ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTMTZfR1BSRUwiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLworCisKKy8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvID0KKyAgSE9XVE8gKFJfTUlQU19HTlVfVlRJTkhFUklULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KKworLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvID0KKyAgSE9XVE8gKFJfTUlQU19HTlVfVlRFTlRSWSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KKworLyogRG8gYSBSX01JUFNfSEkxNiByZWxvY2F0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbgorICAgd2l0aCBhIFJfTUlQU19MTzE2IHJlbG9jLCBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgTE8xNiB0bworICAgdGhlIEhJMTYuICBIZXJlIHdlIGp1c3Qgc2F2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZDsgd2UgZG8gdGhlCisgICBhY3R1YWwgcmVsb2NhdGlvbiB3aGVuIHdlIHNlZSB0aGUgTE8xNi4gIE1JUFMgRUxGIHJlcXVpcmVzIHRoYXQgdGhlCisgICBMTzE2IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgSEkxNi4gIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0IGFuCisgICBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBMTzE2CisgICByZWxvYy4gIFRoaXMgZXh0ZW5zaW9uIHBlcm1pdHMgZ2NjIHRvIG91dHB1dCB0aGUgSEkgYW5kIExPIHJlbG9jcworICAgaXRzZWxmLiAgKi8KKworc3RydWN0IG1pcHNfaGkxNgoreworICBzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OworICBiZmRfYnl0ZSAqYWRkcjsKKyAgYmZkX3ZtYSBhZGRlbmQ7Cit9OworCisvKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGEgc3RhdGljIHZhcmlhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBtaXBzX2hpMTYgKm1pcHNfaGkxNl9saXN0OworCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK19iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyAoYWJmZCwKKwkJICAgICByZWxvY19lbnRyeSwKKwkJICAgICBzeW1ib2wsCisJCSAgICAgZGF0YSwKKwkJICAgICBpbnB1dF9zZWN0aW9uLAorCQkgICAgIG91dHB1dF9iZmQsCisJCSAgICAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgc3RydWN0IG1pcHNfaGkxNiAqbjsKKworICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKKyAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICByZXQgPSBiZmRfcmVsb2Nfb2s7CisKKyAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKKyAgICB7CisgICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgIGJmZF92bWEgZ3A7CisKKyAgICAgIGlmIChyZXQgPT0gYmZkX3JlbG9jX3VuZGVmaW5lZCkKKwlhYm9ydCAoKTsKKworICAgICAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKwlyZWxvY2F0ZWFibGUgPSB0cnVlOworICAgICAgZWxzZQorCXsKKwkgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOworCSAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOworCX0KKworICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAorCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7CisgICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKKwlyZXR1cm4gcmV0OworCisgICAgICByZWxvY2F0aW9uID0gZ3AgLSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCisJICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKKwlyZXQgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisgICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorCXJlbG9jYXRpb24gPSAwOworICAgICAgZWxzZQorCXJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworICAgIH0KKworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKworICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KKyAgbiA9IChzdHJ1Y3QgbWlwc19oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKKyAgbi0+bmV4dCA9IG1pcHNfaGkxNl9saXN0OworICBtaXBzX2hpMTZfbGlzdCA9IG47CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogRG8gYSBSX01JUFNfTE8xNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQKKyAgIGlucGxhY2UgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlCisgICBSX01JUFNfSEkxNiByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jIChhYmZkLAorCQkgICAgIHJlbG9jX2VudHJ5LAorCQkgICAgIHN5bWJvbCwKKwkJICAgICBkYXRhLAorCQkgICAgIGlucHV0X3NlY3Rpb24sCisJCSAgICAgb3V0cHV0X2JmZCwKKwkJICAgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYXJlbGVudCBncF9kaXNwX3JlbGVudDsKKworICBpZiAobWlwc19oaTE2X2xpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbWlwc19oaTE2ICpsOworCisgICAgICBsID0gbWlwc19oaTE2X2xpc3Q7CisgICAgICB3aGlsZSAobCAhPSBOVUxMKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKwkgIHVuc2lnbmVkIGxvbmcgdmFsOworCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKKwkgIHN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CisKKwkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAorCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bworCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLworCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOworCSAgdmFsbG8gPSAoYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcykKKwkJICAgJiAweGZmZmYpOworCSAgdmFsID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyB2YWxsbzsKKwkgIHZhbCArPSBsLT5hZGRlbmQ7CisKKwkgIC8qIFRoZSBsb3cgb3JkZXIgMTYgYml0cyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaWduZWQKKwkgICAgIHZhbHVlLiAgVGhlcmVmb3JlLCBhIG5lZ2F0aXZlIHZhbHVlIGluIHRoZSBsb3cgb3JkZXIgYml0cworCSAgICAgcmVxdWlyZXMgYW4gYWRqdXN0bWVudCBpbiB0aGUgaGlnaCBvcmRlciBiaXRzLiAgV2UgbmVlZAorCSAgICAgdG8gbWFrZSB0aGlzIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlCisJICAgICB0b29rIGZyb20gdGhlIGRhdGEsIGFuZCBvbmNlIGZvciB0aGUgYml0cyB3ZSBhcmUgcHV0dGluZworCSAgICAgYmFjayBpbiB0byB0aGUgZGF0YS4gICovCisJICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQorCSAgICB2YWwgLT0gMHgxMDAwMDsKKwkgIGlmICgodmFsICYgMHg4MDAwKSAhPSAwKQorCSAgICB2YWwgKz0gMHgxMDAwMDsKKworCSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOworCSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgbC0+YWRkcik7CisKKwkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCisJICAgIHsKKwkgICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKKwkgICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKKwkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gbC0+YWRkZW5kOworCSAgICB9CisKKwkgIG5leHQgPSBsLT5uZXh0OworCSAgZnJlZSAobCk7CisJICBsID0gbmV4dDsKKwl9CisKKyAgICAgIG1pcHNfaGkxNl9saXN0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCkKKyAgICB7CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OworICAgICAgYmZkX3ZtYSBncCwgcmVsb2NhdGlvbjsKKworICAgICAgLyogRklYTUU6IERvZXMgdGhpcyBjYXNlIGV2ZXIgb2NjdXI/ICAqLworCisgICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCB0cnVlLCBlcnJvcl9tZXNzYWdlLCAmZ3ApOworICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCisJcmV0dXJuIHJldDsKKworICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7CisgICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworCisgICAgICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisJcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgICAgICBncF9kaXNwX3JlbGVudCA9ICpyZWxvY19lbnRyeTsKKyAgICAgIHJlbG9jX2VudHJ5ID0gJmdwX2Rpc3BfcmVsZW50OworICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb24gLSA0OworICAgIH0KKworICAvKiBOb3cgZG8gdGhlIExPMTYgcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCisgIHJldHVybiBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCQkJaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Cit9CisKKy8qIERvIGEgUl9NSVBTX0dPVDE2IHJlbG9jLiAgVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQKKyAgIHRhYmxlIHVzZWQgZm9yIFBJQyBjb2RlLiAgSWYgdGhlIHN5bWJvbCBpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHRoZQorICAgaW5zdHJ1Y3Rpb24gaXMgbW9kaWZpZWQgdG8gY29udGFpbiB0aGUgb2Zmc2V0IG9mIHRoZSBhcHByb3ByaWF0ZQorICAgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBJZiB0aGUgc3ltYm9sIGlzIGEgc2VjdGlvbgorICAgc3ltYm9sLCB0aGUgbmV4dCByZWxvYyBpcyBhIFJfTUlQU19MTzE2IHJlbG9jLiAgVGhlIHR3byAxNiBiaXQKKyAgIGFkZGVuZHMgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHJlYWwgYWRkZW5kIGFnYWluc3QgdGhlIHNlY3Rpb24KKyAgIHN5bWJvbDsgdGhlIEdPVDE2IGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiBhbiBlbnRyeSBpbgorICAgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIGFuZCB0aGUgTE8xNiBpcyBtb2RpZmllZCB0byBvZmZzZXQgaXQKKyAgIGFwcHJvcHJpYXRlbHkuICBUaHVzIGFuIG9mZnNldCBsYXJnZXIgdGhhbiAxNiBiaXRzIHJlcXVpcmVzIGEKKyAgIG1vZGlmaWVkIHZhbHVlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgorCisgICBUaGlzIGltcGxlbWVudGF0aW9uIHN1ZmZpY2VzIGZvciB0aGUgYXNzZW1ibGVyLCBidXQgdGhlIGxpbmtlciBkb2VzCisgICBub3QgeWV0IGtub3cgaG93IHRvIGNyZWF0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlcy4gICovCisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyAoYWJmZCwKKwkJICAgICAgcmVsb2NfZW50cnksCisJCSAgICAgIHN5bWJvbCwKKwkJICAgICAgZGF0YSwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwKKwkJICAgICAgb3V0cHV0X2JmZCwKKwkJICAgICAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAorICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCisgICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSBjYW4gaGFuZGxlIGl0CisgICAgIGp1c3QgbGlrZSBISTE2LiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKyAgICByZXR1cm4gX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAorCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7CisKKyAgYWJvcnQgKCk7Cit9CisKKy8qIFdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgZ3AgdmFsdWUsIHNvIHRoYXQgd2UgY2FuIGFkanVzdCB0aGUKKyAgIHN5bWJvbCB2YWx1ZSBjb3JyZWN0bHkuICBXZSBsb29rIHVwIHRoZSBzeW1ib2wgX2dwIGluIHRoZSBvdXRwdXQKKyAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgorICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgorICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwgcGdwKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworICAgICBiZmRfdm1hICpwZ3A7Cit7CisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKKyAgICAgICYmICEgcmVsb2NhdGVhYmxlKQorICAgIHsKKyAgICAgICpwZ3AgPSAwOworICAgICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7CisgICAgfQorCisgICpwZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAob3V0cHV0X2JmZCk7CisgIGlmICgqcGdwID09IDAKKyAgICAgICYmICghIHJlbG9jYXRlYWJsZQorCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQorICAgIHsKKyAgICAgIGlmIChyZWxvY2F0ZWFibGUpCisJeworCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KKwkgICpwZ3AgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyAweDQwMDA7CisJICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkIGludCBjb3VudDsKKwkgIGFzeW1ib2wgKipzeW07CisJICB1bnNpZ25lZCBpbnQgaTsKKworCSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKKwkgIHN5bSA9IGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCk7CisKKwkgIGlmIChzeW0gPT0gKGFzeW1ib2wgKiopIE5VTEwpCisJICAgIGkgPSBjb3VudDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzeW0rKykKKwkJeworCQkgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKm5hbWU7CisKKwkJICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoKnN5bSk7CisJCSAgaWYgKCpuYW1lID09ICdfJyAmJiBzdHJjbXAgKG5hbWUsICJfZ3AiKSA9PSAwKQorCQkgICAgeworCQkgICAgICAqcGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOworCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgKnBncCk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKGkgPj0gY291bnQpCisJICAgIHsKKwkgICAgICAvKiBPbmx5IGdldCB0aGUgZXJyb3Igb25jZS4gICovCisJICAgICAgKnBncCA9IDQ7CisJICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOworCSAgICAgICplcnJvcl9tZXNzYWdlID0KKwkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOworCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBEbyBhIFJfTUlQU19HUFJFTDE2IHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QKKyAgIGJlY29tZSB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBmdW5jdGlvbiBhbHNvIGhhbmRsZXMKKyAgIFJfTUlQU19MSVRFUkFMIHJlbG9jYXRpb25zLCBhbHRob3VnaCB0aG9zZSBjYW4gYmUgaGFuZGxlZCBtb3JlCisgICBjbGV2ZXJseSBiZWNhdXNlIHRoZSBlbnRyaWVzIGluIHRoZSAubGl0OCBhbmQgLmxpdDQgc2VjdGlvbnMgY2FuIGJlCisgICBtZXJnZWQuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdwcmVsMTZfd2l0aF9ncCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAorCQkJCQkJICAgICAgYXJlbGVudCAqLCBhc2VjdGlvbiAqLAorCQkJCQkJICAgICAgYm9vbGVhbiwgUFRSLCBiZmRfdm1hKSk7CisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7CisgIGJmZF92bWEgZ3A7CisKKyAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KKyAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCisgICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKKyAgICAgZmlsZS4gICovCisgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKyAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7CisgIGVsc2UKKyAgICB7CisgICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKKyAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKKyAgICB9CisKKyAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLCBlcnJvcl9tZXNzYWdlLAorCQkJICAgJmdwKTsKKyAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCisgICAgcmV0dXJuIHJldDsKKworICByZXR1cm4gZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAorCQkJICByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKK30KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLCByZWxvY2F0ZWFibGUsIGRhdGEsCisJCSBncCkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgICAgIFBUUiBkYXRhOworICAgICBiZmRfdm1hIGdwOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZWxvY2F0aW9uID0gMDsKKyAgZWxzZQorICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworCisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKworICAvKiBTZXQgdmFsIHRvIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvciBzeW1ib2wuICAqLworICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzayA9PSAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY2FzZSBvY2N1cnMgd2l0aCB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCisgICAgICB2YWwgPSByZWxvY19lbnRyeS0+YWRkZW5kOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKKyAgICAgIGlmICh2YWwgJiAweDgwMDApCisJdmFsIC09IDB4MTAwMDA7CisgICAgfQorCisgIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCisgICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgorICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLworICBpZiAoISByZWxvY2F0ZWFibGUKKyAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQorICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7CisKKyAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAodmFsICYgMHhmZmZmKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisKKyAgaWYgKHJlbG9jYXRlYWJsZSkKKyAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCisgIC8qIE1ha2Ugc3VyZSBpdCBmaXQgaW4gMTYgYml0cy4gICovCisgIGlmICh2YWwgPj0gMHg4MDAwICYmIHZhbCA8IDB4ZmZmZjgwMDApCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBEbyBhIFJfTUlQU19HUFJFTDMyIHJlbG9jYXRpb24uICBJcyB0aGlzIDMyIGJpdCB2YWx1ZSB0aGUgb2Zmc2V0CisgICBmcm9tIHRoZSBncCByZWdpc3Rlcj8gWFhYICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ3ByZWwzMl93aXRoX2dwIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCisJCQkJCQkgICAgICBhcmVsZW50ICosIGFzZWN0aW9uICosCisJCQkJCQkgICAgICBib29sZWFuLCBQVFIsIGJmZF92bWEpKTsKKworYmZkX3JlbG9jX3N0YXR1c190eXBlCitfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MgKGFiZmQsCisJCQlyZWxvY19lbnRyeSwKKwkJCXN5bWJvbCwKKwkJCWRhdGEsCisJCQlpbnB1dF9zZWN0aW9uLAorCQkJb3V0cHV0X2JmZCwKKwkJCWVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKKyAgYmZkX3ZtYSBncDsKKworICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubworICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KKyAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgorICAgICBmaWxlLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQorICAgIHsKKyAgICAgICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikKKwlfKCIzMmJpdHMgZ3AgcmVsYXRpdmUgcmVsb2NhdGlvbiBvY2N1cnMgZm9yIGFuIGV4dGVybmFsIHN5bWJvbCIpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworICAgIH0KKworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCisgICAgeworICAgICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKKyAgICAgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOworICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOworCisgICAgICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsCisJCQkgICAgICAgZXJyb3JfbWVzc2FnZSwgJmdwKTsKKyAgICAgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQorCXJldHVybiByZXQ7CisgICAgfQorCisgIHJldHVybiBncHJlbDMyX3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCisJCQkgIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOworfQorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitncHJlbDMyX3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sIHJlbG9jYXRlYWJsZSwgZGF0YSwKKwkJIGdwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKKyAgICAgUFRSIGRhdGE7CisgICAgIGJmZF92bWEgZ3A7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZWxvY2F0aW9uID0gMDsKKyAgZWxzZQorICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworCisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgIGlmIChyZWxvY19lbnRyeS0+aG93dG8tPnNyY19tYXNrID09IDApCisgICAgeworICAgICAgLyogVGhpcyBjYXNlIGFyaXNlcyB3aXRoIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KKyAgICAgIHZhbCA9IDA7CisgICAgfQorICBlbHNlCisgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisKKyAgLyogU2V0IHZhbCB0byB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb3Igc3ltYm9sLiAgKi8KKyAgdmFsICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisKKyAgLyogQWRqdXN0IHZhbCBmb3IgdGhlIGZpbmFsIHNlY3Rpb24gbG9jYXRpb24gYW5kIEdQIHZhbHVlLiAgSWYgd2UKKyAgICAgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yCisgICAgIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCisgIGlmICghIHJlbG9jYXRlYWJsZQorICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCisgICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKKworICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworCisgIGlmIChyZWxvY2F0ZWFibGUpCisgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBIYW5kbGUgYSA2NCBiaXQgcmVsb2MgaW4gYSAzMiBiaXQgTUlQUyBFTEYgZmlsZS4gIFRoZXNlIGFyZQorICAgZ2VuZXJhdGVkIHdoZW4gYWRkcmVzZXMgYXJlIDY0IGJpdHMuICBUaGUgdXBwZXIgMzIgYml0cyBhcmUgYSBzaW1sZQorICAgc2lnbiBleHRlbnNpb24uICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittaXBzMzJfNjRiaXRfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisgIGFyZWxlbnQgcmVsb2MzMjsKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisgIGJmZF9zaXplX3R5cGUgYWRkcjsKKworICByID0gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAorCQkJICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKKyAgaWYgKHIgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQorICAgIHJldHVybiByOworCisgIC8qIERvIGEgbm9ybWFsIDMyIGJpdCByZWxvY2F0aW9uIG9uIHRoZSBsb3dlciAzMiBiaXRzLiAgKi8KKyAgcmVsb2MzMiA9ICpyZWxvY19lbnRyeTsKKyAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKKyAgICByZWxvYzMyLmFkZHJlc3MgKz0gNDsKKyAgcmVsb2MzMi5ob3d0byA9ICZlbGZfbWlwc19ob3d0b190YWJsZVtSX01JUFNfMzJdOworICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgJnJlbG9jMzIsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKKworICAvKiBTaWduIGV4dGVuZCBpbnRvIHRoZSB1cHBlciAzMiBiaXRzLiAgKi8KKyAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvYzMyLmFkZHJlc3MpOworICBpZiAoKHZhbCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgdmFsID0gMHhmZmZmZmZmZjsKKyAgZWxzZQorICAgIHZhbCA9IDA7CisgIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKKyAgICBhZGRyICs9IDQ7CisgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKworICByZXR1cm4gcjsKK30KKworLyogSGFuZGxlIGEgbWlwczE2IGp1bXAuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittaXBzMTZfanVtcF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKyAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgLyogRklYTUUuICAqLworICB7CisgICAgc3RhdGljIGJvb2xlYW4gd2FybmVkOworCisgICAgaWYgKCEgd2FybmVkKQorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIkxpbmtpbmcgbWlwczE2IG9iamVjdHMgaW50byAlcyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCIpLAorCSBiZmRfZ2V0X3RhcmdldCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKSk7CisgICAgd2FybmVkID0gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworfQorCisvKiBIYW5kbGUgYSBtaXBzMTYgR1AgcmVsYXRpdmUgcmVsb2MuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCittaXBzMTZfZ3ByZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7CisgIGJmZF92bWEgZ3A7CisgIHVuc2lnbmVkIHNob3J0IGV4dGVuZCwgaW5zbjsKKyAgdW5zaWduZWQgbG9uZyBmaW5hbDsKKworICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wgd2l0aCBubworICAgICBhZGRlbmQsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGFueXRoaW5nLiAgV2Ugd2lsbCBvbmx5IGhhdmUgYW4KKyAgICAgYWRkZW5kIGlmIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIHJlbG9jLCBub3QgcmVhZCBmcm9tIGFuIEVMRgorICAgICBmaWxlLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTAorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKyAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKyAgICByZWxvY2F0ZWFibGUgPSB0cnVlOworICBlbHNlCisgICAgeworICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7CisgICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7CisgICAgfQorCisgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwKKwkJCSAgICZncCk7CisgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICAvKiBQaWNrIHVwIHRoZSBtaXBzMTYgZXh0ZW5kIGluc3RydWN0aW9uIGFuZCB0aGUgcmVhbCBpbnN0cnVjdGlvbi4gICovCisgIGV4dGVuZCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyArIDIpOworCisgIC8qIFN0dWZmIHRoZSBjdXJyZW50IGFkZGVuZCBiYWNrIGFzIGEgMzIgYml0IHZhbHVlLCBkbyB0aGUgdXN1YWwKKyAgICAgcmVsb2NhdGlvbiwgYW5kIHRoZW4gY2xlYW4gdXAuICAqLworICBiZmRfcHV0XzMyIChhYmZkLAorCSAgICAgICgoKGV4dGVuZCAmIDB4MWYpIDw8IDExKQorCSAgICAgICB8IChleHRlbmQgJiAweDdlMCkKKwkgICAgICAgfCAoaW5zbiAmIDB4MWYpKSwKKwkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKworICByZXQgPSBncHJlbDE2X3dpdGhfZ3AgKGFiZmQsIHN5bWJvbCwgcmVsb2NfZW50cnksIGlucHV0X3NlY3Rpb24sCisJCQkgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7CisKKyAgZmluYWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKyAgYmZkX3B1dF8xNiAoYWJmZCwKKwkgICAgICAoKGV4dGVuZCAmIDB4ZjgwMCkKKwkgICAgICAgfCAoKGZpbmFsID4+IDExKSAmIDB4MWYpCisJICAgICAgIHwgKGZpbmFsICYgMHg3ZTApKSwKKwkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKKyAgYmZkX3B1dF8xNiAoYWJmZCwKKwkgICAgICAoKGluc24gJiAweGZmZTApCisJICAgICAgIHwgKGZpbmFsICYgMHgxZikpLAorCSAgICAgIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBSZXR1cm4gdGhlIElTQSBmb3IgYSBNSVBTIGVfZmxhZ3MgdmFsdWUuICAqLworCitzdGF0aWMgSU5MSU5FIGludAorZWxmX21pcHNfaXNhIChmbGFncykKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7Cit7CisgIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpCisgICAgeworICAgIGNhc2UgRV9NSVBTX0FSQ0hfMToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgRV9NSVBTX0FSQ0hfMjoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2UgRV9NSVBTX0FSQ0hfMzoKKyAgICAgIHJldHVybiAzOworICAgIGNhc2UgRV9NSVBTX0FSQ0hfNDoKKyAgICAgIHJldHVybiA0OworICAgIH0KKyAgcmV0dXJuIDQ7Cit9CisKKy8qIFJldHVybiB0aGUgTUFDSCBmb3IgYSBNSVBTIGVfZmxhZ3MgdmFsdWUuICAqLworCitzdGF0aWMgSU5MSU5FIGludAorZWxmX21pcHNfbWFjaCAoZmxhZ3MpCisgICAgIGZsYWd3b3JkIGZsYWdzOworeworICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19NQUNIKQorICAgIHsKKyAgICBjYXNlIEVfTUlQU19NQUNIXzM5MDA6CisgICAgICByZXR1cm4gYmZkX21hY2hfbWlwczM5MDA7CisKKyAgICBjYXNlIEVfTUlQU19NQUNIXzQwMTA6CisgICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQwMTA7CisKKyAgICBjYXNlIEVfTUlQU19NQUNIXzQxMDA6CisgICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQxMDA7CisKKyAgICBjYXNlIEVfTUlQU19NQUNIXzQxMTE6CisgICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQxMTE7CisKKyAgICBjYXNlIEVfTUlQU19NQUNIXzQ2NTA6CisgICAgICByZXR1cm4gYmZkX21hY2hfbWlwczQ2NTA7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfQVJDSCkKKwl7CisJZGVmYXVsdDoKKwljYXNlIEVfTUlQU19BUkNIXzE6CisJICByZXR1cm4gYmZkX21hY2hfbWlwczMwMDA7CisJICBicmVhazsKKworCWNhc2UgRV9NSVBTX0FSQ0hfMjoKKwkgIHJldHVybiBiZmRfbWFjaF9taXBzNjAwMDsKKwkgIGJyZWFrOworCisJY2FzZSBFX01JUFNfQVJDSF8zOgorCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MDAwOworCSAgYnJlYWs7CisKKwljYXNlIEVfTUlQU19BUkNIXzQ6CisJICByZXR1cm4gYmZkX21hY2hfbWlwczgwMDA7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gcHJpbnRhYmxlIG5hbWUgZm9yIEFCSSBmcm9tIGZsYWd3b3JkLiAqLworCitzdGF0aWMgSU5MSU5FIGNoYXIqCitlbGZfbWlwc19hYmlfbmFtZSAoZmxhZ3MpCisgICAgIGZsYWd3b3JkIGZsYWdzOworeworICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BQkkpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAibm9uZSI7CisgICAgY2FzZSBFX01JUFNfQUJJX08zMjoKKyAgICAgIHJldHVybiAiTzMyIjsKKyAgICBjYXNlIEVfTUlQU19BQklfTzY0OgorICAgICAgcmV0dXJuICJPNjQiOworICAgIGNhc2UgRV9NSVBTX0FCSV9FQUJJMzI6CisgICAgICByZXR1cm4gIkVBQkkzMiI7CisgICAgY2FzZSBFX01JUFNfQUJJX0VBQkk2NDoKKyAgICAgIHJldHVybiAiRUFCSTY0IjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIGFiaSI7CisgICAgfQorfQorCisvKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLworCitzdHJ1Y3QgZWxmX3JlbG9jX21hcCB7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKKyAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAorICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCisgIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKKyAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAorICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAorICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAorICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCisgIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAorICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKKyAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKKyAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAorICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKKyAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCisgIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCisgIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0KK307CisKKy8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2JmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCisgICAgeworICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKKwlyZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlWyhpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOworICAgIH0KKworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKKyAgICAgIC8qIFdlIG5lZWQgdG8gaGFuZGxlIEJGRF9SRUxPQ19DVE9SIHNwZWNpYWxseS4KKwkgU2VsZWN0IHRoZSByaWdodCByZWxvY2F0aW9uIChSX01JUFNfMzIgb3IgUl9NSVBTXzY0KSBiYXNlZCBvbiB0aGUKKwkgc2l6ZSBvZiBhZGRyZXNzZXMgb24gdGhpcyBhcmNoaXRlY3R1cmUuICAqLworICAgICAgaWYgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpID09IDMyKQorCXJldHVybiAmZWxmX21pcHNfaG93dG9fdGFibGVbKGludCkgUl9NSVBTXzMyXTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gJmVsZl9taXBzX2N0b3I2NF9ob3d0bzsKKworICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6CisgICAgICByZXR1cm4gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKKyAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw6CisgICAgICByZXR1cm4gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CisgICAgICByZXR1cm4gJmVsZl9taXBzX2dudV92dGluaGVyaXRfaG93dG87CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKKyAgICB9Cit9CisKKy8qIEdpdmVuIGEgTUlQUyByZWxvYyB0eXBlLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Cit7CisgIHVuc2lnbmVkIGludCByX3R5cGU7CisKKyAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7CisgIHN3aXRjaCAocl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfTUlQUzE2XzI2OgorICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwczE2X2p1bXBfaG93dG87CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfTUlQUzE2X0dQUkVMOgorICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKKyAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgorICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19tYXgpOworICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwc19ob3d0b190YWJsZVtyX3R5cGVdOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFRoZSBhZGRlbmQgZm9yIGEgR1BSRUwxNiBvciBMSVRFUkFMIHJlbG9jYXRpb24gY29tZXMgZnJvbSB0aGUgR1AKKyAgICAgdmFsdWUgZm9yIHRoZSBvYmplY3QgZmlsZS4gIFdlIGdldCB0aGUgYWRkZW5kIG5vdywgcmF0aGVyIHRoYW4KKyAgICAgd2hlbiB3ZSBkbyB0aGUgcmVsb2NhdGlvbiwgYmVjYXVzZSB0aGUgc3ltYm9sIG1hbmlwdWxhdGlvbnMgZG9uZQorICAgICBieSB0aGUgbGlua2VyIG1heSBjYXVzZSB1cyB0byBsb3NlIHRyYWNrIG9mIHRoZSBpbnB1dCBCRkQuICAqLworICBpZiAoKCgqY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCisgICAgICAmJiAocl90eXBlID09ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19HUFJFTDE2CisJICB8fCByX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0xJVEVSQUwpKQorICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gZWxmX2dwIChhYmZkKTsKK30KKwwKKy8qIEEgLnJlZ2luZm8gc2VjdGlvbiBob2xkcyBhIHNpbmdsZSBFbGYzMl9SZWdJbmZvIHN0cnVjdHVyZS4gIFRoZXNlCisgICByb3V0aW5lcyBzd2FwIHRoaXMgc3RydWN0dXJlIGluIGFuZCBvdXQuICBUaGV5IGFyZSB1c2VkIG91dHNpZGUgb2YKKyAgIEJGRCwgc28gdGhleSBhcmUgZ2xvYmFsbHkgdmlzaWJsZS4gICovCisKK3ZvaWQKK2JmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgZXgsIGluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmV4OworICAgICBFbGYzMl9SZWdJbmZvICppbjsKK3sKKyAgaW4tPnJpX2dwcm1hc2sgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7CisgIGluLT5yaV9jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOworICBpbi0+cmlfY3BybWFza1sxXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKKyAgaW4tPnJpX2Nwcm1hc2tbMl0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7CisgIGluLT5yaV9jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOworICBpbi0+cmlfZ3BfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOworfQorCit2b2lkCitiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCBpbiwgZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmMzJfUmVnSW5mbyAqaW47CisgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmV4OworeworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BybWFzaywKKwkJKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMF0sCisJCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzFdLAorCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1syXSwKKwkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbM10sCisJCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncF92YWx1ZSwKKwkJKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Cit9CisKKy8qIEluIHRoZSA2NCBiaXQgQUJJLCB0aGUgLk1JUFMub3B0aW9ucyBzZWN0aW9uIGhvbGRzIHJlZ2lzdGVyCisgICBpbmZvcm1hdGlvbiBpbiBhbiBFbGY2NF9SZWdpbmZvIHN0cnVjdHVyZS4gIFRoZXNlIHJvdXRpbmVzIHN3YXAKKyAgIHRoZW0gaW4gYW5kIG91dC4gIFRoZXkgYXJlIGdsb2JhbGx5IHZpc2libGUgYmVjYXVzZSB0aGV5IGFyZSB1c2VkCisgICBvdXRzaWRlIG9mIEJGRC4gIFRoZXNlIHJvdXRpbmVzIGFyZSBoZXJlIHNvIHRoYXQgZ2FzIGNhbiBjYWxsIHRoZW0KKyAgIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgd2hldGhlciB0aGUgNjQgYml0IEFCSSBoYXMgYmVlbiBpbmNsdWRlZC4gICovCisKK3ZvaWQKK2JmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgZXgsIGluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKmV4OworICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICppbjsKK3sKKyAgaW4tPnJpX2dwcm1hc2sgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7CisgIGluLT5yaV9wYWQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfcGFkKTsKKyAgaW4tPnJpX2Nwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7CisgIGluLT5yaV9jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOworICBpbi0+cmlfY3BybWFza1syXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKKyAgaW4tPnJpX2Nwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7CisgIGluLT5yaV9ncF92YWx1ZSA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Cit9CisKK3ZvaWQKK2JmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsIGluLCBleCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICppbjsKKyAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Cit7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncHJtYXNrLAorCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfcGFkLAorCQkoYmZkX2J5dGUgKikgZXgtPnJpX3BhZCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzBdLAorCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1sxXSwKKwkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMl0sCisJCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzNdLAorCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOworICBiZmRfaF9wdXRfNjQgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BfdmFsdWUsCisJCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOworfQorCisvKiBTd2FwIGFuIGVudHJ5IGluIGEgLmdwdGFiIHNlY3Rpb24uICBOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgcmVseQorICAgb24gdGhlIGVxdWl2YWxlbmNlIG9mIHRoZSB0d28gZWxlbWVudHMgb2YgdGhlIHVuaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2JmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGFiZmQsIGV4LCBpbikKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqZXg7CisgICAgIEVsZjMyX2dwdGFiICppbjsKK3sKKyAgaW4tPmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5ndF9lbnRyeS5ndF9nX3ZhbHVlKTsKKyAgaW4tPmd0X2VudHJ5Lmd0X2J5dGVzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+Z3RfZW50cnkuZ3RfYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZAorYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIGluLCBleCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGYzMl9ncHRhYiAqaW47CisgICAgIEVsZjMyX0V4dGVybmFsX2dwdGFiICpleDsKK3sKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmd0X2VudHJ5Lmd0X2dfdmFsdWUsCisJCWV4LT5ndF9lbnRyeS5ndF9nX3ZhbHVlKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmd0X2VudHJ5Lmd0X2J5dGVzLAorCQlleC0+Z3RfZW50cnkuZ3RfYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZAorYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChhYmZkLCBpbiwgZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmMzJfY29tcGFjdF9yZWwgKmluOworICAgICBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqZXg7Cit7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5pZDEsIGV4LT5pZDEpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+bnVtLCBleC0+bnVtKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmlkMiwgZXgtPmlkMik7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5vZmZzZXQsIGV4LT5vZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmVzZXJ2ZWQwLCBleC0+cmVzZXJ2ZWQwKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJlc2VydmVkMSwgZXgtPnJlc2VydmVkMSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChhYmZkLCBpbiwgZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmMzJfY3JpbmZvICppbjsKKyAgICAgRWxmMzJfRXh0ZXJuYWxfY3JpbmZvICpleDsKK3sKKyAgdW5zaWduZWQgbG9uZyBsOworCisgIGwgPSAoKChpbi0+Y3R5cGUgJiBDUklORk9fQ1RZUEUpIDw8IENSSU5GT19DVFlQRV9TSCkKKyAgICAgICB8ICgoaW4tPnJ0eXBlICYgQ1JJTkZPX1JUWVBFKSA8PCBDUklORk9fUlRZUEVfU0gpCisgICAgICAgfCAoKGluLT5kaXN0MnRvICYgQ1JJTkZPX0RJU1QyVE8pIDw8IENSSU5GT19ESVNUMlRPX1NIKQorICAgICAgIHwgKChpbi0+cmVsdmFkZHIgJiBDUklORk9fUkVMVkFERFIpIDw8IENSSU5GT19SRUxWQUREUl9TSCkpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBsLCBleC0+aW5mbyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5rb25zdCwgZXgtPmtvbnN0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnZhZGRyLCBleC0+dmFkZHIpOworfQorCisvKiBTd2FwIGluIGFuIG9wdGlvbnMgaGVhZGVyLiAgKi8KKwordm9pZAorYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgZXgsIGluKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9PcHRpb25zICpleDsKKyAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgKmluOworeworICBpbi0+a2luZCA9IGJmZF9oX2dldF84IChhYmZkLCBleC0+a2luZCk7CisgIGluLT5zaXplID0gYmZkX2hfZ2V0XzggKGFiZmQsIGV4LT5zaXplKTsKKyAgaW4tPnNlY3Rpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4LT5zZWN0aW9uKTsKKyAgaW4tPmluZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5pbmZvKTsKK30KKworLyogU3dhcCBvdXQgYW4gb3B0aW9ucyBoZWFkZXIuICAqLworCit2b2lkCitiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCAoYWJmZCwgaW4sIGV4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9PcHRpb25zICppbjsKKyAgICAgRWxmX0V4dGVybmFsX09wdGlvbnMgKmV4OworeworICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPmtpbmQsIGV4LT5raW5kKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT5zaXplLCBleC0+c2l6ZSk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnNlY3Rpb24sIGV4LT5zZWN0aW9uKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+aW5mbywgZXgtPmluZm8pOworfQorDAorLyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BsaXR0aW5nCisgICB0aGUgc3ltYm9sIHRhYmxlIGludG8gZ2xvYmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMuICBBdCBsZWFzdAorICAgb24gSXJpeCA1LCB0aGlzIHNwbGl0IG11c3QgYmUgYmV0d2VlbiBzZWN0aW9uIHN5bWJvbHMgYW5kIGFsbCBvdGhlcgorICAgc3ltYm9scy4gIE9uIG1vc3QgRUxGIHRhcmdldHMgdGhlIHNwbGl0IGlzIGJldHdlZW4gc3RhdGljIHN5bWJvbHMKKyAgIGFuZCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX3N5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICpzeW07Cit7CisgIHJldHVybiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKK30KKwwKKy8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgTUlQUyBFTEYgZmlsZS4gIFRoaXMgaXMgdXNlZCBmb3IKKyAgIGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLworCitib29sZWFuCitfYmZkX21pcHNfZWxmX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21pcHMsCisJCQkgICAgIGVsZl9taXBzX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIDMyLWJpdCBNSVBTIEVMRiBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmMzJfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgLyogSXJpeCA1IGlzIGJyb2tlbi4gIE9iamVjdCBmaWxlIHN5bWJvbCB0YWJsZXMgYXJlIG5vdCBhbHdheXMKKyAgICAgc29ydGVkIGNvcnJlY3RseSBzdWNoIHRoYXQgbG9jYWwgc3ltYm9scyBwcmVjZWRlIGdsb2JhbCBzeW1ib2xzLAorICAgICBhbmQgdGhlIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBpcyBub3QgYWx3YXlzIHJpZ2h0LiAgKi8KKyAgZWxmX2JhZF9zeW10YWIgKGFiZmQpID0gdHJ1ZTsKKworICByZXR1cm4gX2JmZF9taXBzX2VsZl9vYmplY3RfcCAoYWJmZCk7Cit9CisKKy8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgYSBNSVBTIEVMRiBvYmplY3QKKyAgIGZpbGUuICBUaGlzIGdldHMgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlIHJpZ2h0IGJhc2VkIG9uIHRoZSBtYWNoaW5lCisgICBudW1iZXIuICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCisKKy8qQVJHU1VTRUQqLwordm9pZAorX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBsaW5rZXI7Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworICB1bnNpZ25lZCBpbnQgaTsKKyAgRWxmX0ludGVybmFsX1NoZHIgKipoZHJwcDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgYXNlY3Rpb24gKnNlYzsKKworICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKKyAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX21hY2hfbWlwczM5MDA6CisgICAgICB2YWwgPSBFX01JUFNfQVJDSF8xIHwgRV9NSVBTX01BQ0hfMzkwMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKKyAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6CisgICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKKyAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6CisgICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDAxMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKKyAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTExOgorICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQxMTE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6CisgICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDY1MDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKKyAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOworCisgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBmb3IgLmdwdGFiIHNlY3Rpb25zIGFuZCBvdGhlciBhcHByb3ByaWF0ZQorICAgICBpbmZvIGZvciBlYWNoIHNwZWNpYWwgc2VjdGlvbi4gICovCisgIGZvciAoaSA9IDEsIGhkcnBwID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKSArIDE7CisgICAgICAgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOworICAgICAgIGkrKywgaGRycHArKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCgqaGRycHApLT5zaF90eXBlKQorCXsKKwljYXNlIFNIVF9NSVBTX0xJQkxJU1Q6CisJICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKKwkgIGlmIChzZWMgIT0gTlVMTCkKKwkgICAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKKwkgIGJyZWFrOworCisJY2FzZSBTSFRfTUlQU19HUFRBQjoKKwkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKKwkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKKwkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTAorCQkgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSA9PSAwKTsKKwkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMSk7CisJICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7CisJICAoKmhkcnBwKS0+c2hfaW5mbyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OworCSAgYnJlYWs7CisKKwljYXNlIFNIVF9NSVBTX0NPTlRFTlQ6CisJICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7CisJICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7CisJICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwKKwkJICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLAorCQkJCSAgc2l6ZW9mICIuTUlQUy5jb250ZW50IiAtIDEpID09IDApOworCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCisJCQkJCSBuYW1lICsgc2l6ZW9mICIuTUlQUy5jb250ZW50IiAtIDEpOworCSAgQkZEX0FTU0VSVCAoc2VjICE9IE5VTEwpOworCSAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKKwkgIGJyZWFrOworCisJY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOgorCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7CisJICBpZiAoc2VjICE9IE5VTEwpCisJICAgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7CisJICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saWJsaXN0Iik7CisJICBpZiAoc2VjICE9IE5VTEwpCisJICAgICgqaGRycHApLT5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7CisJICBicmVhazsKKworCWNhc2UgU0hUX01JUFNfRVZFTlRTOgorCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOworCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOworCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMKTsKKwkgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgPT0gMCkKKwkgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsCisJCQkJCSAgIG5hbWUgKyBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCisJCQkJICAgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSA9PSAwKTsKKwkgICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKKwkJCQkJICAgICAobmFtZQorCQkJCQkgICAgICArIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkpOworCSAgICB9CisJICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7CisJICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OworCSAgYnJlYWs7CisKKwl9CisgICAgfQorfQorDAorLyogRnVuY3Rpb24gdG8ga2VlcCBNSVBTIHNwZWNpZmljIGZpbGUgZmxhZ3MgbGlrZSBhcyBFRl9NSVBTX1BJQy4gKi8KKworYm9vbGVhbgorX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7Cit7CisgIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKKwkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7CisKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKKyAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLworCitib29sZWFuCitfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICppYmZkOworICAgICBiZmQgKm9iZmQ7Cit7CisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCisJICAgICAgfHwgKGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzCisJCSAgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpKTsKKworICBlbGZfZ3AgKG9iZmQpID0gZWxmX2dwIChpYmZkKTsKKyAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKKyAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKKyAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCisKK2Jvb2xlYW4KK19iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICppYmZkOworICAgICBiZmQgKm9iZmQ7Cit7CisgIGZsYWd3b3JkIG9sZF9mbGFnczsKKyAgZmxhZ3dvcmQgbmV3X2ZsYWdzOworICBib29sZWFuIG9rOworCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCisgIGlmIChpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCisgICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm1zZzsKKworICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpYmZkKSkKKwltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgYmlnIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuIik7CisgICAgICBlbHNlCisJbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGxpdHRsZSBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgYmlnIGVuZGlhbiIpOworCisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyB8PSBuZXdfZmxhZ3MgJiBFRl9NSVBTX05PUkVPUkRFUjsKKyAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7CisKKyAgaWYgKCEgZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQorICAgIHsKKyAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7CisgICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKKworICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQorCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKKwl7CisJICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKKwkJCQkgICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCisKKyAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX05PUkVPUkRFUjsKKyAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX05PUkVPUkRFUjsKKworICBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBvayA9IHRydWU7CisKKyAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX1BJQykgIT0gKG9sZF9mbGFncyAmIEVGX01JUFNfUElDKSkKKyAgICB7CisgICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfUElDOworICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX1BJQzsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogbGlua2luZyBQSUMgZmlsZXMgd2l0aCBub24tUElDIGZpbGVzIiksCisJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKKyAgICAgIG9rID0gZmFsc2U7CisgICAgfQorCisgIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19DUElDKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19DUElDKSkKKyAgICB7CisgICAgICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfQ1BJQzsKKyAgICAgIG9sZF9mbGFncyAmPSB+RUZfTUlQU19DUElDOworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIiVzOiBsaW5raW5nIGFiaWNhbGxzIGZpbGVzIHdpdGggbm9uLWFiaWNhbGxzIGZpbGVzIiksCisJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKKyAgICAgIG9rID0gZmFsc2U7CisgICAgfQorCisgIC8qIENvbXBhcmUgdGhlIElTQSdzLiAqLworICBpZiAoKG5ld19mbGFncyAmIChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpKQorICAgICAgIT0gKG9sZF9mbGFncyAmIChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpKSkKKyAgICB7CisgICAgICBpbnQgbmV3X21hY2ggPSBuZXdfZmxhZ3MgJiBFRl9NSVBTX01BQ0g7CisgICAgICBpbnQgb2xkX21hY2ggPSBvbGRfZmxhZ3MgJiBFRl9NSVBTX01BQ0g7CisgICAgICBpbnQgbmV3X2lzYSA9IGVsZl9taXBzX2lzYSAobmV3X2ZsYWdzKTsKKyAgICAgIGludCBvbGRfaXNhID0gZWxmX21pcHNfaXNhIChvbGRfZmxhZ3MpOworCisgICAgICAvKiBJZiBlaXRoZXIgaGFzIG5vIG1hY2hpbmUgc3BlY2lmaWVkLCBqdXN0IGNvbXBhcmUgdGhlIGdlbmVyYWwgaXNhJ3MuCisJIFNvbWUgY29tYmluYXRpb25zIG9mIG1hY2hpbmVzIGFyZSBvaywgaWYgdGhlIGlzYSdzIG1hdGNoLiAqLworICAgICAgaWYgKCEgbmV3X21hY2ggCisJICB8fCAhIG9sZF9tYWNoCisJICB8fCBuZXdfbWFjaCA9PSBvbGRfbWFjaAorCSAgKQorCXsKKwkgIC8qIERvbid0IHdhcm4gYWJvdXQgbWl4aW5nIC1taXBzMSBhbmQgLW1pcHMyIGNvZGUsIG9yIG1peGluZyAtbWlwczMKKwkgICAgIGFuZCAtbWlwczQgY29kZS4gIFRoZXkgd2lsbCBub3JtYWxseSB1c2UgdGhlIHNhbWUgZGF0YSBzaXplcyBhbmQKKwkgICAgIGNhbGxpbmcgY29udmVudGlvbnMuICAqLworCisJICBpZiAoKG5ld19pc2EgPT0gMSB8fCBuZXdfaXNhID09IDIpCisJICAgICAgPyAob2xkX2lzYSAhPSAxICYmIG9sZF9pc2EgIT0gMikKKwkgICAgICA6IChvbGRfaXNhID09IDEgfHwgb2xkX2lzYSA9PSAyKSkKKwkgICAgeworCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IElTQSBtaXNtYXRjaCAoLW1pcHMlZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICgtbWlwcyVkKSIpLAorCQliZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgbmV3X2lzYSwgb2xkX2lzYSk7CisJICAgICAgb2sgPSBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgZWxzZQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiJXM6IElTQSBtaXNtYXRjaCAoJWQpIHdpdGggcHJldmlvdXMgbW9kdWxlcyAoJWQpIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKKwkgICAgIGVsZl9taXBzX21hY2ggKG5ld19mbGFncyksCisJICAgICBlbGZfbWlwc19tYWNoIChvbGRfZmxhZ3MpKTsKKwkgIG9rID0gZmFsc2U7CisJfQorCisgICAgICBuZXdfZmxhZ3MgJj0gfiAoRUZfTUlQU19BUkNIIHwgRUZfTUlQU19NQUNIKTsKKyAgICAgIG9sZF9mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOworICAgIH0KKworICAvKiBDb21wYXJlIEFCSSdzICovCisgIGlmICgobmV3X2ZsYWdzICYgRUZfTUlQU19BQkkpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX0FCSSkpCisgICAgeworICAgICAgLyogT25seSBlcnJvciBpZiBib3RoIGFyZSBzZXQgKHRvIGRpZmZlcmVudCB2YWx1ZXMpLiAqLworICAgICAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0FCSSkKKwkgICYmIChvbGRfZmxhZ3MgJiBFRl9NSVBTX0FCSSkpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogQUJJIG1pc21hdGNoOiBsaW5raW5nICVzIG1vZHVsZSB3aXRoIHByZXZpb3VzICVzIG1vZHVsZXMiKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAorCSAgICAgZWxmX21pcHNfYWJpX25hbWUgKG5ld19mbGFncyksCisJICAgICBlbGZfbWlwc19hYmlfbmFtZSAob2xkX2ZsYWdzKSk7CisJICBvayA9IGZhbHNlOworCX0KKyAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19BQkk7CisgICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfQUJJOworICAgIH0KKworICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCisgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgKHVuc2lnbmVkIGxvbmcpIG5ld19mbGFncywKKwkgKHVuc2lnbmVkIGxvbmcpIG9sZF9mbGFncyk7CisgICAgICBvayA9IGZhbHNlOworICAgIH0KKworICBpZiAoISBvaykKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCitzdGF0aWMgYm9vbGVhbgorX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIHB0cjsKK3sKKyAgRklMRSAqZmlsZSA9IChGSUxFICopIHB0cjsKKworICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOworCisgIC8qIFByaW50IG5vcm1hbCBFTEYgcHJpdmF0ZSBkYXRhLiAgKi8KKyAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKKworICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOworCisgIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9PMzIpCisgICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPU8zMl0iKSk7CisgIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX082NCkKKyAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9TzY0XSIpKTsKKyAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfRUFCSTMyKQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1FQUJJMzJdIikpOworICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9FQUJJNjQpCisgICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPUVBQkk2NF0iKSk7CisgIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSkKKyAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmkgdW5rbm93bl0iKSk7CisgIGVsc2UKKyAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtubyBhYmkgc2V0XSIpKTsKKworICBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF8xKQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW21pcHMxXSIpKTsKKyAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF8yKQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW21pcHMyXSIpKTsKKyAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF8zKQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW21pcHMzXSIpKTsKKyAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BUkNIKSA9PSBFX01JUFNfQVJDSF80KQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW21pcHM0XSIpKTsKKyAgZWxzZQorICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW3Vua25vd24gSVNBXSIpKTsKKworICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTXzMyQklUTU9ERSkKKyAgICBmcHJpbnRmIChmaWxlLCBfICgiIFszMmJpdG1vZGVdIikpOworICBlbHNlCisgICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbm90IDMyYml0bW9kZV0iKSk7CisKKyAgZnB1dGMgKCdcbicsIGZpbGUpOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogSGFuZGxlIGEgTUlQUyBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKKyAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuCisgICBUaGlzIHJvdXRpbmUgc3VwcG9ydHMgYm90aCB0aGUgMzItYml0IGFuZCA2NC1iaXQgRUxGIEFCSS4KKworICAgRklYTUU6IFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBTSEZfTUlQU19HUFJFTCBmbGFnLCBidXQgSSdtIG5vdCBzdXJlCisgICBob3cgdG8uICAqLworCitib29sZWFuCitfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgZmxhZ3dvcmQgZmxhZ3MgPSAwOworCisgIC8qIFRoZXJlIG91Z2h0IHRvIGJlIGEgcGxhY2UgdG8ga2VlcCBFTEYgYmFja2VuZCBzcGVjaWZpYyBmbGFncywgYnV0CisgICAgIGF0IHRoZSBtb21lbnQgdGhlcmUgaXNuJ3Qgb25lLiAgV2UganVzdCBrZWVwIHRyYWNrIG9mIHRoZQorICAgICBzZWN0aW9ucyBieSB0aGVpciBuYW1lLCBpbnN0ZWFkLiAgRm9ydHVuYXRlbHksIHRoZSBBQkkgZ2l2ZXMKKyAgICAgc3VnZ2VzdGVkIG5hbWVzIGZvciBhbGwgdGhlIE1JUFMgc3BlY2lmaWMgc2VjdGlvbnMsIHNvIHdlIHdpbGwKKyAgICAgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCB0aGlzLiAgKi8KKyAgc3dpdGNoIChoZHItPnNoX3R5cGUpCisgICAgeworICAgIGNhc2UgU0hUX01JUFNfTElCTElTVDoKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubGlibGlzdCIpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSFRfTUlQU19NU1lNOgorICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tc3ltIikgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIVF9NSVBTX0NPTkZMSUNUOgorICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSFRfTUlQU19HUFRBQjoKKyAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmdwdGFiLiIsIHNpemVvZiAiLmdwdGFiLiIgLSAxKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hUX01JUFNfVUNPREU6CisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIVF9NSVBTX0RFQlVHOgorICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGZsYWdzID0gU0VDX0RFQlVHR0lORzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzoKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKKwkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGZsYWdzID0gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOgorICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLmludGVyZmFjZXMiKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hUX01JUFNfQ09OVEVOVDoKKyAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsIHNpemVvZiAiLk1JUFMuY29udGVudCIgLSAxKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hUX01JUFNfT1BUSU9OUzoKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIub3B0aW9ucyIpICE9IDAKKwkgICYmIHN0cmNtcCAobmFtZSwgIi5NSVBTLm9wdGlvbnMiKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hUX01JUFNfRFdBUkY6CisgICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1Z18iLCBzaXplb2YgIi5kZWJ1Z18iIC0gMSkgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIVF9NSVBTX1NZTUJPTF9MSUI6CisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuc3ltbGliIikgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIVF9NSVBTX0VWRU5UUzoKKyAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgIT0gMAorCSAgJiYgc3RybmNtcCAobmFtZSwgIi5NSVBTLnBvc3RfcmVsIiwKKwkJICAgICAgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChmbGFncykKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sCisJCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKKwkJCQkJCQkgICBoZHItPmJmZF9zZWN0aW9uKQorCQkJCSAgICB8IGZsYWdzKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSGFuZGxlIGEgMzItYml0IE1JUFMgRUxGIHNwZWNpZmljIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGYzMl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7CisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGlmICghIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVjb3JkIHNoX2luZm8gZm9yIGEgLmdwdGFiIHNlY3Rpb24uICAqLworCisgIC8qIEZvciBhIC5yZWdpbmZvIHNlY3Rpb24sIHNldCB0aGUgZ3AgdmFsdWUgaW4gdGhlIHRkYXRhIGluZm9ybWF0aW9uCisgICAgIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4gIFdlIG5lZWQgdGhlIGdwIHZhbHVlIHdoaWxlCisgICAgIHByb2Nlc3NpbmcgcmVsb2NzLCBzbyB3ZSBqdXN0IGdldCBpdCBub3cuICBUaGUgLnJlZ2luZm8gc2VjdGlvbgorICAgICBpcyBub3QgdXNlZCBpbiB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCisgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfUkVHSU5GTykKKyAgICB7CisgICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKKyAgICAgIEVsZjMyX1JlZ0luZm8gczsKKworICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLCAoUFRSKSAmZXh0LAorCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luIChhYmZkLCAmZXh0LCAmcyk7CisgICAgICBlbGZfZ3AgKGFiZmQpID0gcy5yaV9ncF92YWx1ZTsKKyAgICB9CisKKyAgLyogRm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLCBsb29rIGZvciBhIE9ES19SRUdJTkZPIGVudHJ5LCBhbmQKKyAgICAgc2V0IHRoZSBncCB2YWx1ZSBiYXNlZCBvbiB3aGF0IHdlIGZpbmQuICBXZSBtYXkgc2VlIGJvdGgKKyAgICAgU0hUX01JUFNfUkVHSU5GTyBhbmQgU0hUX01JUFNfT1BUSU9OUy9PREtfUkVHSU5GTzsgaW4gdGhhdCBjYXNlLAorICAgICB0aGV5IHNob3VsZCBhZ3JlZS4gICovCisgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKKyAgICB7CisgICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKKworICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKKyAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwgY29udGVudHMsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBoZHItPnNoX3NpemUpKQorCXsKKwkgIGZyZWUgKGNvbnRlbnRzKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBsID0gY29udGVudHM7CisgICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7CisgICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCisJeworCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OworCisJICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKKwkJCQkJJmludG9wdCk7CisJICBpZiAoaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCisJICAgIHsKKwkgICAgICBFbGYzMl9SZWdJbmZvIGludHJlZzsKKworCSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbgorCQkoYWJmZCwKKwkJICgoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKQorCQkgIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpKSwKKwkJICZpbnRyZWcpOworCSAgICAgIGVsZl9ncCAoYWJmZCkgPSBpbnRyZWcucmlfZ3BfdmFsdWU7CisJICAgIH0KKwkgIGwgKz0gaW50b3B0LnNpemU7CisJfQorICAgICAgZnJlZSAoY29udGVudHMpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGEgTUlQUyBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCisgICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICBUaGlzIHJvdXRpbmUgaXMKKyAgIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCisKK2Jvb2xlYW4KK19iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyAoYWJmZCwgaGRyLCBzZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOworICAgICBhc2VjdGlvbiAqc2VjOworeworICByZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOworCisgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKKworICBpZiAoc3RyY21wIChuYW1lLCAiLmxpYmxpc3QiKSA9PSAwKQorICAgIHsKKyAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0xJQkxJU1Q7CisgICAgICBoZHItPnNoX2luZm8gPSBzZWMtPl9yYXdfc2l6ZSAvIHNpemVvZiAoRWxmMzJfTGliKTsKKyAgICAgIC8qIFRoZSBzaF9saW5rIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5tc3ltIikgPT0gMCkKKyAgICB7CisgICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19NU1lNOworICAgICAgaGRyLT5zaF9lbnRzaXplID0gODsKKyAgICAgIC8qIEZJWE1FOiBTZXQgdGhlIHNoX2luZm8gZmllbGQuICAqLworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmNvbmZsaWN0IikgPT0gMCkKKyAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05GTElDVDsKKyAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKKyAgICB7CisgICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19HUFRBQjsKKyAgICAgIGhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpOworICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnVjb2RlIikgPT0gMCkKKyAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19VQ09ERTsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpID09IDApCisgICAgeworICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfREVCVUc7CisgICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAubWRlYnVnIHNlY3Rpb24gaGFzIGFuCisgICAgICAgICBlbnRzaXplIG9mIDAuICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCisgICAgICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKwloZHItPnNoX2VudHNpemUgPSAwOworICAgICAgZWxzZQorCWhkci0+c2hfZW50c2l6ZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpID09IDApCisgICAgeworICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfUkVHSU5GTzsKKyAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaGFzIGFuCisgICAgICAgICBlbnRzaXplIG9mIDB4MTguICBGSVhNRTogRG9lcyB0aGlzIG1hdHRlcj8gICovCisgICAgICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKwloZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOworICAgICAgZWxzZQorCWhkci0+c2hfZW50c2l6ZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChTR0lfQ09NUEFUIChhYmZkKQorCSAgICYmIChzdHJjbXAgKG5hbWUsICIuaGFzaCIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bmFtaWMiKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5zdHIiKSA9PSAwKSkKKyAgICB7CisgICAgICBoZHItPnNoX2VudHNpemUgPSAwOworI2lmIDAKKyAgICAgIC8qIFRoaXMgaXNuJ3QgaG93IHRoZSBJcml4IDYgbGlua2VyIGJlaGF2ZXMuICAqLworICAgICAgaGRyLT5zaF9pbmZvID0gU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOworI2VuZGlmCisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgPT0gMAorCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKKwkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKKwkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKKwkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCisgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19HUFJFTDsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLk1JUFMuaW50ZXJmYWNlcyIpID09IDApCisgICAgeworICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfSUZBQ0U7CisgICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5jb250ZW50IikgPT0gMCkKKyAgICB7CisgICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19DT05URU5UOworICAgICAgLyogVGhlIHNoX2luZm8gZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLm9wdGlvbnMiKSA9PSAwCisJICAgfHwgc3RyY21wIChuYW1lLCAiLk1JUFMub3B0aW9ucyIpID09IDApCisgICAgeworICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfT1BUSU9OUzsKKyAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDE7CisgICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIHNpemVvZiAiLmRlYnVnXyIgLSAxKSA9PSAwKQorICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0RXQVJGOworICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5zeW1saWIiKSA9PSAwKQorICAgIHsKKyAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1NZTUJPTF9MSUI7CisgICAgICAvKiBUaGUgc2hfbGluayBhbmQgc2hfaW5mbyBmaWVsZHMgYXJlIHNldCBpbgorICAgICAgICAgZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLk1JUFMuZXZlbnRzIiwgc2l6ZW9mICIuTUlQUy5ldmVudHMiIC0gMSkgPT0gMAorCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuTUlQUy5wb3N0X3JlbCIsCisJCSAgICAgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApCisgICAgeworICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfRVZFTlRTOworICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfTUlQU19OT1NUUklQOworICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgorICAgaW5kZXguICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4KKyAgIEFjdHVhbGx5LCBpdCdzIG5vdCBjbGVhciB0byBtZSB0aGF0IHRoZSA2NC1iaXQgQUJJIHN1cHBvcnRzIHRoZXNlLAorICAgYnV0IGZvciBub24tUElDIG9iamVjdHMgd2Ugd2lsbCBjZXJ0YWlubHkgd2FudCBzdXBwb3J0IGZvciBhdCBsZWFzdAorICAgdGhlIC5zY29tbW9uIHNlY3Rpb24uICAqLworCitib29sZWFuCitfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKKyAgICAgYmZkICphYmZkOworICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGludCAqcmV0dmFsOworeworICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKKyAgICB7CisgICAgICAqcmV0dmFsID0gU0hOX01JUFNfU0NPTU1PTjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuYWNvbW1vbiIpID09IDApCisgICAgeworICAgICAgKnJldHZhbCA9IFNITl9NSVBTX0FDT01NT047CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyogV2hlbiBhcmUgd3JpdGluZyBvdXQgdGhlIC5vcHRpb25zIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiwKKyAgIHJlbWVtYmVyIHRoZSBieXRlcyB3ZSBhcmUgd3JpdGluZyBvdXQsIHNvIHRoYXQgd2UgY2FuIGluc3RhbGwgdGhlCisgICBHUCB2YWx1ZSBpbiB0aGUgc2VjdGlvbl9wcm9jZXNzaW5nIHJvdXRpbmUuICAqLworCitib29sZWFuCitfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLm9wdGlvbnMiKSA9PSAwCisgICAgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuTUlQUy5vcHRpb25zIikgPT0gMCkKKyAgICB7CisgICAgICBiZmRfYnl0ZSAqYzsKKworICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pID09IE5VTEwpCisJeworCSAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQorCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSkpOworCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBjID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YTsKKyAgICAgIGlmIChjID09IE5VTEwpCisJeworCSAgYmZkX3NpemVfdHlwZSBzaXplOworCisJICBpZiAoc2VjdGlvbi0+X2Nvb2tlZF9zaXplICE9IDApCisJICAgIHNpemUgPSBzZWN0aW9uLT5fY29va2VkX3NpemU7CisJICBlbHNlCisJICAgIHNpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7CisJICBjID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemUpOworCSAgaWYgKGMgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRkYXRhID0gKFBUUikgYzsKKwl9CisKKyAgICAgIG1lbWNweSAoYyArIG9mZnNldCwgbG9jYXRpb24sIGNvdW50KTsKKyAgICB9CisKKyAgcmV0dXJuIF9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LAorCQkJCQljb3VudCk7Cit9CisKKy8qIFdvcmsgb3ZlciBhIHNlY3Rpb24ganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBUaGlzIHJvdXRpbmUgaXMKKyAgIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gIEZJWE1FOiBXZSByZWNvZ25pemUKKyAgIHNlY3Rpb25zIHRoYXQgbmVlZCB0aGUgU0hGX01JUFNfR1BSRUwgZmxhZyBieSBuYW1lOyB0aGVyZSBoYXMgdG8gYmUKKyAgIGEgYmV0dGVyIHdheS4gICovCisKK2Jvb2xlYW4KK19iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKK3sKKyAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pOworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKKwl7CisJICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQyB8IFNIRl9XUklURSB8IFNIRl9NSVBTX0dQUkVMOworCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKKwl7CisJICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQyB8IFNIRl9XUklURSB8IFNIRl9NSVBTX0dQUkVMOworCSAgaGRyLT5zaF90eXBlID0gU0hUX05PQklUUzsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQorCXsKKwkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7CisJICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmNvbXBhY3RfcmVsIikgPT0gMCkKKwl7CisJICBoZHItPnNoX2ZsYWdzID0gMDsKKwkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucnRwcm9jIikgPT0gMCkKKwl7CisJICBpZiAoaGRyLT5zaF9hZGRyYWxpZ24gIT0gMCAmJiBoZHItPnNoX2VudHNpemUgPT0gMCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBhZGp1c3Q7CisKKwkgICAgICBhZGp1c3QgPSBoZHItPnNoX3NpemUgJSBoZHItPnNoX2FkZHJhbGlnbjsKKwkgICAgICBpZiAoYWRqdXN0ICE9IDApCisJCWhkci0+c2hfc2l6ZSArPSBoZHItPnNoX2FkZHJhbGlnbiAtIGFkanVzdDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdvcmsgb3ZlciBhIHNlY3Rpb24ganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBXZSB1cGRhdGUgdGhlIEdQCisgICB2YWx1ZSBpbiB0aGUgU0hUX01JUFNfUkVHSU5GTyBhbmQgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9ucyBiYXNlZAorICAgb24gdGhlIHZhbHVlIHdlIGFyZSB1c2luZy4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKK3sKKyAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19SRUdJTkZPKQorICAgIHsKKyAgICAgIGJmZF9ieXRlIGJ1Zls0XTsKKworICAgICAgQkZEX0FTU0VSVCAoaGRyLT5zaF9zaXplID09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOworICAgICAgQkZEX0FTU0VSVCAoaGRyLT5jb250ZW50cyA9PSBOVUxMKTsKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkgICAgaGRyLT5zaF9vZmZzZXQgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pIC0gNCwKKwkJICAgIFNFRUtfU0VUKSA9PSAtMSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBlbGZfZ3AgKGFiZmQpLCBidWYpOworICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCAoYmZkX3NpemVfdHlwZSkgMSwgKGJmZF9zaXplX3R5cGUpIDQsIGFiZmQpICE9IDQpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMKKyAgICAgICYmIGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTAorICAgICAgJiYgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbikgIT0gTlVMTAorICAgICAgJiYgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbiktPnRkYXRhICE9IE5VTEwpCisgICAgeworICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7CisKKyAgICAgIC8qIFdlIHN0b3JlZCB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZWxmX3NlY3Rpb25fZGF0YSB0ZGF0YQorCSBmaWVsZCBpbiB0aGUgc2V0X3NlY3Rpb25fY29udGVudHMgcm91dGluZS4gIFdlIHNhdmUgdGhlCisJIHNlY3Rpb24gY29udGVudHMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlYWQgdGhlbSBhZ2Fpbi4KKwkgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgZWxmX2dwIGlzIHNldCwgc28gd2UgY2FuIGxvb2sKKwkgdGhyb3VnaCB0aGUgc2VjdGlvbiBjb250ZW50cyB0byBzZWUgaWYgdGhlcmUgaXMgYW4KKwkgT0RLX1JFR0lORk8gc3RydWN0dXJlLiAgKi8KKworICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbiktPnRkYXRhOworICAgICAgbCA9IGNvbnRlbnRzOworICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOworICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKKworCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCisJCQkJCSZpbnRvcHQpOworCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQorCSAgICB7CisJICAgICAgYmZkX2J5dGUgYnVmWzRdOworCisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkJICAgIChoZHItPnNoX29mZnNldAorCQkJICAgICArIChsIC0gY29udGVudHMpCisJCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKKwkJCSAgICAgKyAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSAtIDQpKSwKKwkJCSAgICAgU0VFS19TRVQpID09IC0xKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOworCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBsICs9IGludG9wdC5zaXplOworCX0KKyAgICB9CisKKyAgcmV0dXJuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpOworfQorDAorLyogTUlQUyBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKKyAgIG90aGVyIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0CisgICB0b2dldGhlciwgYW5kIHRoZW4gcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHBvaW50ZXIsIHdoaWNoIHlpZWxkcworICAgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbgorICAgc2VjdGlvbi4gIFRoaXMgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWNvZmYuYy4gICovCitzdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfc2NvbV9zZWN0aW9uOworc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfc2NvbV9zeW1ib2w7CitzdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOworCisvKiBNSVBTIEVMRiBhbHNvIHVzZXMgYW4gYWNvbW1vbiBzZWN0aW9uLCB3aGljaCByZXByZXNlbnRzIGFuCisgICBhbGxvY2F0ZWQgY29tbW9uIHN5bWJvbCB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhCisgICBkZWZpbml0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnkuICAqLworc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKK3N0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX2Fjb21fc3ltYm9sOworc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cjsKKworLyogVGhlIElyaXggNSBzdXBwb3J0IHVzZXMgdHdvIHZpcnR1YWwgc2VjdGlvbnMsIHdoaWNoIHJlcHJlc2VudAorICAgdGV4dC9kYXRhIHN5bWJvbHMgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMuICAqLworc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX3RleHRfc2VjdGlvbjsKK3N0YXRpYyBhc2VjdGlvbiAqbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKK3N0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX3RleHRfc3ltYm9sOworc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX3RleHRfc3ltYm9sX3B0cjsKKworc3RhdGljIGFzZWN0aW9uIG1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKK3N0YXRpYyBhc2VjdGlvbiAqbWlwc19lbGZfZGF0YV9zZWN0aW9uX3B0cjsKK3N0YXRpYyBhc3ltYm9sIG1pcHNfZWxmX2RhdGFfc3ltYm9sOworc3RhdGljIGFzeW1ib2wgKm1pcHNfZWxmX2RhdGFfc3ltYm9sX3B0cjsKKworLyogSGFuZGxlIHRoZSBzcGVjaWFsIE1JUFMgc2VjdGlvbiBudW1iZXJzIHRoYXQgYSBzeW1ib2wgbWF5IHVzZS4KKyAgIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4gICovCisKK3ZvaWQKK19iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqYXN5bTsKK3sKKyAgZWxmX3N5bWJvbF90eXBlICplbGZzeW07CisKKyAgZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOworICBzd2l0Y2ggKGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaG5keCkKKyAgICB7CisgICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgorICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBmaWxlLgorCSBJdCBpcyBhbiBhbGxvY2F0ZWQgY29tbW9uIHNlY3Rpb24uICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuCisJIGVpdGhlciByZXNvbHZlIHRoZXNlIHN5bWJvbHMgdG8gc29tZXRoaW5nIGluIGEgc2hhcmVkCisJIGxpYnJhcnksIG9yIGl0IGNhbiBqdXN0IGxlYXZlIHRoZW0gaGVyZS4gIEZvciBvdXIgcHVycG9zZXMsCisJIHdlIGNhbiBjb25zaWRlciB0aGVzZSBzeW1ib2xzIHRvIGJlIGluIGEgbmV3IHNlY3Rpb24uICAqLworICAgICAgaWYgKG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCisJeworCSAgLyogSW5pdGlhbGl6ZSB0aGUgYWNvbW1vbiBzZWN0aW9uLiAgKi8KKwkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5uYW1lID0gIi5hY29tbW9uIjsKKwkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5mbGFncyA9IFNFQ19BTExPQzsKKwkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZtaXBzX2VsZl9hY29tX3NlY3Rpb247CisJICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOworCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0cjsKKwkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLm5hbWUgPSAiLmFjb21tb24iOworCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07CisJICBtaXBzX2VsZl9hY29tX3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKKwkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl9hY29tX3N5bWJvbDsKKwl9CisgICAgICBhc3ltLT5zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSE5fQ09NTU9OOgorICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIHRoZSBHUCBzaXplIGFyZSBhdXRvbWF0aWNhbGx5CisJIHRyZWF0ZWQgYXMgU0hOX01JUFNfU0NPTU1PTiBzeW1ib2xzLiAgKi8KKyAgICAgIGlmIChhc3ltLT52YWx1ZSA+IGVsZl9ncF9zaXplIChhYmZkKSkKKwlicmVhazsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSBTSE5fTUlQU19TQ09NTU9OOgorICAgICAgaWYgKG1pcHNfZWxmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCisJeworCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLworCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPSAiLnNjb21tb24iOworCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKKwkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZtaXBzX2VsZl9zY29tX3NlY3Rpb247CisJICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOworCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sX3B0cjsKKwkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOworCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07CisJICBtaXBzX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKKwkgIG1pcHNfZWxmX3Njb21fc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl9zY29tX3N5bWJvbDsKKwl9CisgICAgICBhc3ltLT5zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKKyAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hOX01JUFNfU1VOREVGSU5FRDoKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICAgICAgYnJlYWs7CisKKyNpZiAwIC8qIGZvciBTR0lfQ09NUEFUICovCisgICAgY2FzZSBTSE5fTUlQU19URVhUOgorICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hOX01JUFNfREFUQToKKyAgICAgIGFzeW0tPnNlY3Rpb24gPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisMCisvKiBXaGVuIGNyZWF0aW5nIGFuIElyaXggNSBleGVjdXRhYmxlLCB3ZSBuZWVkIFJFR0lORk8gYW5kIFJUUFJPQworICAgc2VnbWVudHMuICAqLworCitzdGF0aWMgaW50CittaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqczsKKyAgaW50IHJldDsKKworICByZXQgPSAwOworCisgIGlmICghIFNHSV9DT01QQVQgKGFiZmQpKQorICAgIHJldHVybiByZXQ7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKKyAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIGEgUFRfTUlQU19SRUdJTkZPIHNlZ21lbnQuICAqLworICAgICAgKytyZXQ7CisgICAgfQorCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgIT0gTlVMTAorICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIikgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIGEgUFRfTUlQU19SVFBST0Mgc2VnbWVudC4gICovCisgICAgICArK3JldDsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogTW9kaWZ5IHRoZSBzZWdtZW50IG1hcCBmb3IgYW4gSXJpeCA1IGV4ZWN1dGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzZWN0aW9uICpzOworICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptLCAqKnBtOworCisgIGlmICghIFNHSV9DT01QQVQgKGFiZmQpKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHRoZXJlIGlzIGEgLnJlZ2luZm8gc2VjdGlvbiwgd2UgbmVlZCBhIFBUX01JUFNfUkVHSU5GTworICAgICBzZWdtZW50LiAgKi8KKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlZ2luZm8iKTsKKyAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKKyAgICB7CisgICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKKwlpZiAobS0+cF90eXBlID09IFBUX01JUFNfUkVHSU5GTykKKwkgIGJyZWFrOworICAgICAgaWYgKG0gPT0gTlVMTCkKKwl7CisJICBtID0gKHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICptKTsKKwkgIGlmIChtID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgbS0+cF90eXBlID0gUFRfTUlQU19SRUdJTkZPOworCSAgbS0+Y291bnQgPSAxOworCSAgbS0+c2VjdGlvbnNbMF0gPSBzOworCisJICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgUEhEUiBhbmQgSU5URVJQIHNlZ21lbnRzLiAgKi8KKwkgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOworCSAgd2hpbGUgKCpwbSAhPSBOVUxMCisJCSAmJiAoKCpwbSktPnBfdHlwZSA9PSBQVF9QSERSCisJCSAgICAgfHwgKCpwbSktPnBfdHlwZSA9PSBQVF9JTlRFUlApKQorCSAgICBwbSA9ICYoKnBtKS0+bmV4dDsKKworCSAgbS0+bmV4dCA9ICpwbTsKKwkgICpwbSA9IG07CisJfQorICAgIH0KKworICAvKiBJZiB0aGVyZSBhcmUgLmR5bmFtaWMgYW5kIC5tZGVidWcgc2VjdGlvbnMsIHdlIG1ha2UgYSByb29tIGZvcgorICAgICB0aGUgUlRQUk9DIGhlYWRlci4gIEZJWE1FOiBSZXdyaXRlIHdpdGhvdXQgc2VjdGlvbiBuYW1lcy4gICovCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKSA9PSBOVUxMCisgICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikgIT0gTlVMTAorICAgICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIikgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKKwlpZiAobS0+cF90eXBlID09IFBUX01JUFNfUlRQUk9DKQorCSAgYnJlYWs7CisgICAgICBpZiAobSA9PSBOVUxMKQorCXsKKwkgIG0gPSAoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm0pOworCSAgaWYgKG0gPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBtLT5wX3R5cGUgPSBQVF9NSVBTX1JUUFJPQzsKKworCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOworCSAgaWYgKHMgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG0tPmNvdW50ID0gMDsKKwkgICAgICBtLT5wX2ZsYWdzID0gMDsKKwkgICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbS0+Y291bnQgPSAxOworCSAgICAgIG0tPnNlY3Rpb25zWzBdID0gczsKKwkgICAgfQorCisJICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgRFlOQU1JQyBzZWdtZW50LiAgKi8KKwkgIHBtID0gJmVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOworCSAgd2hpbGUgKCpwbSAhPSBOVUxMICYmICgqcG0pLT5wX3R5cGUgIT0gUFRfRFlOQU1JQykKKwkgICAgcG0gPSAmKCpwbSktPm5leHQ7CisJICBpZiAoKnBtICE9IE5VTEwpCisJICAgIHBtID0gJigqcG0pLT5uZXh0OworCisJICBtLT5uZXh0ID0gKnBtOworCSAgKnBtID0gbTsKKwl9CisgICAgfQorCisgIC8qIE9uIElyaXggNSwgdGhlIFBUX0RZTkFNSUMgc2VnbWVudCBpbmNsdWRlcyB0aGUgLmR5bmFtaWMsIC5keW5zdHIsCisgICAgIC5keW5zeW0sIGFuZCAuaGFzaCBzZWN0aW9ucywgYW5kIGV2ZXJ5dGhpbmcgaW4gYmV0d2Vlbi4gICovCisgIGZvciAocG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKKyAgICBpZiAoKCpwbSktPnBfdHlwZSA9PSBQVF9EWU5BTUlDKQorICAgICAgYnJlYWs7CisgIG0gPSAqcG07CisgIGlmIChtICE9IE5VTEwKKyAgICAgICYmIG0tPmNvdW50ID09IDEKKyAgICAgICYmIHN0cmNtcCAobS0+c2VjdGlvbnNbMF0tPm5hbWUsICIuZHluYW1pYyIpID09IDApCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNlY19uYW1lc1tdID0KKwl7ICIuZHluYW1pYyIsICIuZHluc3RyIiwgIi5keW5zeW0iLCAiLmhhc2giIH07CisgICAgICBiZmRfdm1hIGxvdywgaGlnaDsKKyAgICAgIHVuc2lnbmVkIGludCBpLCBjOworICAgICAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbjsKKworICAgICAgbG93ID0gMHhmZmZmZmZmZjsKKyAgICAgIGhpZ2ggPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBzZWNfbmFtZXMgLyBzaXplb2Ygc2VjX25hbWVzWzBdOyBpKyspCisJeworCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzZWNfbmFtZXNbaV0pOworCSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKKwkgICAgeworCSAgICAgIGJmZF9zaXplX3R5cGUgc3o7CisKKwkgICAgICBpZiAobG93ID4gcy0+dm1hKQorCQlsb3cgPSBzLT52bWE7CisJICAgICAgc3ogPSBzLT5fY29va2VkX3NpemU7CisJICAgICAgaWYgKHN6ID09IDApCisJCXN6ID0gcy0+X3Jhd19zaXplOworCSAgICAgIGlmIChoaWdoIDwgcy0+dm1hICsgc3opCisJCWhpZ2ggPSBzLT52bWEgKyBzejsKKwkgICAgfQorCX0KKworICAgICAgYyA9IDA7CisgICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwlpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKKwkgICAgJiYgcy0+dm1hID49IGxvdworCSAgICAmJiAoKHMtPnZtYQorCQkgKyAocy0+X2Nvb2tlZF9zaXplICE9IDAgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpKQorCQk8PSBoaWdoKSkKKwkgICsrYzsKKworICAgICAgbiA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQorCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbiArIChjIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7CisgICAgICBpZiAobiA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgICpuID0gKm07CisgICAgICBuLT5jb3VudCA9IGM7CisKKyAgICAgIGkgPSAwOworICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCisJICAgICAgJiYgcy0+dm1hID49IGxvdworCSAgICAgICYmICgocy0+dm1hCisJCSAgICsgKHMtPl9jb29rZWRfc2l6ZSAhPSAwID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKSkKKwkJICA8PSBoaWdoKSkKKwkgICAgeworCSAgICAgIG4tPnNlY3Rpb25zW2ldID0gczsKKwkgICAgICArK2k7CisJICAgIH0KKwl9CisKKyAgICAgICpwbSA9IG47CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogVGhlIHN0cnVjdHVyZSBvZiB0aGUgcnVudGltZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IHRoZQorICAgbG9hZGVyIGZvciB1c2UgYnkgdGhlIHN0YXRpYyBleGNlcHRpb24gc3lzdGVtLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcnVudGltZV9wZHIgeworCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2Ygc3RhcnQgb2YgcHJvY2VkdXJlICovCisJbG9uZwlyZWdtYXNrOwkvKiBzYXZlIHJlZ2lzdGVyIG1hc2sgKi8KKwlsb25nCXJlZ29mZnNldDsJLyogc2F2ZSByZWdpc3RlciBvZmZzZXQgKi8KKwlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KKwlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCisJbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLworCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCisJc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLworCWxvbmcJaXJwc3M7CQkvKiBpbmRleCBpbnRvIHRoZSBydW50aW1lIHN0cmluZyB0YWJsZSAqLworCWxvbmcJcmVzZXJ2ZWQ7CisJc3RydWN0IGV4Y2VwdGlvbl9pbmZvICpleGNlcHRpb25faW5mbzsvKiBwb2ludGVyIHRvIGV4Y2VwdGlvbiBhcnJheSAqLworfSBSUERSLCAqcFJQRFI7CisjZGVmaW5lIGNiUlBEUiBzaXplb2YoUlBEUikKKyNkZWZpbmUgcnBkTmlsICgocFJQRFIpIDApCisKKy8qIFN3YXAgUlBEUiAocnVudGltZSBwcm9jZWR1cmUgdGFibGUgZW50cnkpIGZvciBvdXRwdXQuICAqLworCitzdGF0aWMgdm9pZCBlY29mZl9zd2FwX3JwZHJfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSUERSICosIHN0cnVjdCBycGRyX2V4dCAqKSk7CisKK3N0YXRpYyB2b2lkCitlY29mZl9zd2FwX3JwZHJfb3V0IChhYmZkLCBpbiwgZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgUlBEUiAqaW47CisgICAgIHN0cnVjdCBycGRyX2V4dCAqZXg7Cit7CisgIC8qIGVjb2ZmX3B1dF9vZmYgd2FzIGRlZmluZWQgaW4gZWNvZmZzd2FwLmguICAqLworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbi0+YWRyLCAoYmZkX2J5dGUgKikgZXgtPnBfYWRyKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+cmVnbWFzaywgKGJmZF9ieXRlICopIGV4LT5wX3JlZ21hc2spOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5yZWdvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9yZWdvZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmVnbWFzaywgKGJmZF9ieXRlICopIGV4LT5wX2ZyZWdtYXNrKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJlZ29mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX2ZyZWdvZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5mcmFtZW9mZnNldCwgKGJmZF9ieXRlICopIGV4LT5wX2ZyYW1lb2Zmc2V0KTsKKworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT5mcmFtZXJlZywgKGJmZF9ieXRlICopIGV4LT5wX2ZyYW1lcmVnKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+cGNyZWcsIChiZmRfYnl0ZSAqKSBleC0+cF9wY3JlZyk7CisKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+aXJwc3MsIChiZmRfYnl0ZSAqKSBleC0+cF9pcnBzcyk7CisjaWYgMCAvKiBGSVhNRSAqLworICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbi0+ZXhjZXB0aW9uX2luZm8sIChiZmRfYnl0ZSAqKSBleC0+cF9leGNlcHRpb25faW5mbyk7CisjZW5kaWYKK30KKwwKKy8qIFJlYWQgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSAubWRlYnVnIHNlY3Rpb24gaW50byBhCisgICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCisKK2Jvb2xlYW4KK19iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBzZWN0aW9uLCBkZWJ1ZykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOworeworICBIRFJSICpzeW1oZHI7CisgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOworICBjaGFyICpleHRfaGRyID0gTlVMTDsKKworICBzd2FwID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOworICBtZW1zZXQgKGRlYnVnLCAwLCBzaXplb2YoKmRlYnVnKSk7CisKKyAgZXh0X2hkciA9IChjaGFyICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplKTsKKyAgaWYgKGV4dF9oZHIgPT0gTlVMTCAmJiBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGV4dF9oZHIsIChmaWxlX3B0cikgMCwKKwkJCQlzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSkKKyAgICAgID09IGZhbHNlKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOworICAoKnN3YXAtPnN3YXBfaGRyX2luKSAoYWJmZCwgZXh0X2hkciwgc3ltaGRyKTsKKworICAvKiBUaGUgc3ltYm9saWMgaGVhZGVyIGNvbnRhaW5zIGFic29sdXRlIGZpbGUgb2Zmc2V0cyBhbmQgc2l6ZXMgdG8KKyAgICAgcmVhZC4gICovCisjZGVmaW5lIFJFQUQocHRyLCBvZmZzZXQsIGNvdW50LCBzaXplLCB0eXBlKQkJCQlcCisgIGlmIChzeW1oZHItPmNvdW50ID09IDApCQkJCQkJXAorICAgIGRlYnVnLT5wdHIgPSBOVUxMOwkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGRlYnVnLT5wdHIgPSAodHlwZSkgYmZkX21hbGxvYyAoKHNpemVfdCkgKHNpemUgKiBzeW1oZHItPmNvdW50KSk7CVwKKyAgICAgIGlmIChkZWJ1Zy0+cHRyID09IE5VTEwpCQkJCQkJXAorCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBzeW1oZHItPm9mZnNldCwgU0VFS19TRVQpICE9IDAJXAorCSAgfHwgKGJmZF9yZWFkIChkZWJ1Zy0+cHRyLCBzaXplLCBzeW1oZHItPmNvdW50LAkJXAorCQkJYWJmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJCVwKKwlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCisgICAgfQorCisgIFJFQUQgKGxpbmUsIGNiTGluZU9mZnNldCwgY2JMaW5lLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpLCB1bnNpZ25lZCBjaGFyICopOworICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7CisgIFJFQUQgKGV4dGVybmFsX3BkciwgY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSwgUFRSKTsKKyAgUkVBRCAoZXh0ZXJuYWxfc3ltLCBjYlN5bU9mZnNldCwgaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUsIFBUUik7CisgIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOworICBSRUFEIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAorCXVuaW9uIGF1eF9leHQgKik7CisgIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7CisgIFJFQUQgKHNzZXh0LCBjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7CisgIFJFQUQgKGV4dGVybmFsX2ZkciwgY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSwgUFRSKTsKKyAgUkVBRCAoZXh0ZXJuYWxfcmZkLCBjYlJmZE9mZnNldCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIFBUUik7CisgIFJFQUQgKGV4dGVybmFsX2V4dCwgY2JFeHRPZmZzZXQsIGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplLCBQVFIpOworI3VuZGVmIFJFQUQKKworICBkZWJ1Zy0+ZmRyID0gTlVMTDsKKyAgZGVidWctPmFkanVzdCA9IE5VTEw7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChleHRfaGRyICE9IE5VTEwpCisgICAgZnJlZSAoZXh0X2hkcik7CisgIGlmIChkZWJ1Zy0+bGluZSAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5saW5lKTsKKyAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKKyAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKKyAgaWYgKGRlYnVnLT5leHRlcm5hbF9wZHIgIT0gTlVMTCkKKyAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyKTsKKyAgaWYgKGRlYnVnLT5leHRlcm5hbF9zeW0gIT0gTlVMTCkKKyAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltKTsKKyAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKKyAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKKyAgaWYgKGRlYnVnLT5leHRlcm5hbF9hdXggIT0gTlVMTCkKKyAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4KTsKKyAgaWYgKGRlYnVnLT5zcyAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5zcyk7CisgIGlmIChkZWJ1Zy0+c3NleHQgIT0gTlVMTCkKKyAgICBmcmVlIChkZWJ1Zy0+c3NleHQpOworICBpZiAoZGVidWctPmV4dGVybmFsX2ZkciAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9mZHIpOworICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOworICBpZiAoZGVidWctPmV4dGVybmFsX2V4dCAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9leHQpOworICByZXR1cm4gZmFsc2U7Cit9CisMCisvKiBNSVBTIEVMRiBsb2NhbCBsYWJlbHMgc3RhcnQgd2l0aCAnJCcsIG5vdCAnTCcuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCittaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGlmIChuYW1lWzBdID09ICckJykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBPbiBJcml4IDYsIHRoZSBsYWJlbHMgZ28gYmFjayB0byBzdGFydGluZyB3aXRoICcuJywgc28gd2UgYWNjZXB0CisgICAgIHRoZSBnZW5lcmljIEVMRiBsb2NhbCBsYWJlbCBzeW50YXggYXMgd2VsbC4gICovCisgIHJldHVybiBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKK30KKworLyogTUlQUyBFTEYgdXNlcyBhIHNwZWNpYWwgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZSBpbiBvcmRlciB0aGUKKyAgIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZQoreworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkOworICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lIGk7Cit9OworCitib29sZWFuCitfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKKwkJCQkgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKKyAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7CisgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Cit7CisgIGFzZWN0aW9uICptc2VjOworCisgIGlmIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAorCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAorCQkJCSAgICAgbGluZV9wdHIpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAorCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAorCQkJCSAgICAgbGluZV9wdHIpKQorICAgIHJldHVybiB0cnVlOworCisgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKTsKKyAgaWYgKG1zZWMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmbGFnd29yZCBvcmlnZmxhZ3M7CisgICAgICBzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICpmaTsKKyAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9CisJZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOworCisgICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIGR1cmluZyBhIGxpbmssIG1pcHNfZWxmX2ZpbmFsX2xpbmsgbWF5IGhhdmUKKwkgY2xlYXJlZCB0aGUgU0VDX0hBU19DT05URU5UUyBmaWVsZC4gIFdlIGZvcmNlIGl0IGJhY2sgb24gaGVyZQorCSBpZiBhcHByb3ByaWF0ZSAod2hpY2ggaXQgbm9ybWFsbHkgd2lsbCBiZSkuICAqLworICAgICAgb3JpZ2ZsYWdzID0gbXNlYy0+ZmxhZ3M7CisgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobXNlYyktPnRoaXNfaGRyLnNoX3R5cGUgIT0gU0hUX05PQklUUykKKwltc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOworCisgICAgICBmaSA9IGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOworICAgICAgaWYgKGZpID09IE5VTEwpCisJeworCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKKwkgIGNoYXIgKmZyYXdfc3JjOworCSAgY2hhciAqZnJhd19lbmQ7CisJICBzdHJ1Y3QgZmRyICpmZHJfcHRyOworCisJICBmaSA9ICgoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqKQorCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpKSk7CisJICBpZiAoZmkgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoISBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgbXNlYywgJmZpLT5kKSkKKwkgICAgeworCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICAvKiBTd2FwIGluIHRoZSBGRFIgaW5mb3JtYXRpb24uICAqLworCSAgZmktPmQuZmRyID0gKChzdHJ1Y3QgZmRyICopCisJCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkJICAoZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqCisJCQkJICAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpKTsKKwkgIGlmIChmaS0+ZC5mZHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKKwkgIGZkcl9wdHIgPSBmaS0+ZC5mZHI7CisJICBmcmF3X3NyYyA9IChjaGFyICopIGZpLT5kLmV4dGVybmFsX2ZkcjsKKwkgIGZyYXdfZW5kID0gKGZyYXdfc3JjCisJCSAgICAgICsgZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqIGV4dGVybmFsX2Zkcl9zaXplKTsKKwkgIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQorCSAgICAoKnN3YXAtPnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOworCisJICBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9IGZpOworCisJICAvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGV2ZXIgZnJlZSB0aGlzIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgIGZpbmRfbmVhcmVzdF9saW5lIGlzIGVpdGhlciBjYWxsZWQgYWxsIHRoZSB0aW1lLCBhcyBpbgorICAgICAgICAgICAgIG9iamR1bXAgLWwsIHNvIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgc2F2ZWQsIG9yIGl0IGlzCisgICAgICAgICAgICAgcmFyZWx5IGNhbGxlZCwgYXMgaW4gbGQgZXJyb3IgbWVzc2FnZXMsIHNvIHRoZSBtZW1vcnkKKyAgICAgICAgICAgICB3YXN0ZWQgaXMgdW5pbXBvcnRhbnQuICBTdGlsbCwgaXQgd291bGQgcHJvYmFibHkgYmUgYQorICAgICAgICAgICAgIGdvb2QgaWRlYSBmb3IgZnJlZV9jYWNoZWRfaW5mbyB0byB0aHJvdyBpdCBhd2F5LiAgKi8KKwl9CisKKyAgICAgIGlmIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsICZmaS0+ZCwgc3dhcCwKKwkJCQkgICZmaS0+aSwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAorCQkJCSAgbGluZV9wdHIpKQorCXsKKwkgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKKyAgICB9CisKKyAgLyogRmFsbCBiYWNrIG9uIHRoZSBnZW5lcmljIEVMRiBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lLiAgKi8KKworICByZXR1cm4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKKwkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKKwkJCQkgICAgIGxpbmVfcHRyKTsKK30KKwwKKyAgLyogVGhlIG1pcHMxNiBjb21waWxlciB1c2VzIGEgY291cGxlIG9mIHNwZWNpYWwgc2VjdGlvbnMgdG8gaGFuZGxlCisgICAgIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cy4KKworICAgICBTZWN0aW9uIG5hbWVzIHRoYXQgbG9vayBsaWtlIC5taXBzMTYuZm4uRk5OQU1FIGNvbnRhaW4gc3R1YnMgdGhhdAorICAgICBjb3B5IGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBmcm9tIHRoZSBmcCByZWdzIHRvIHRoZSBncCByZWdzIGFuZAorICAgICB0aGVuIGp1bXAgdG8gRk5OQU1FLiAgSWYgYW55IDMyIGJpdCBmdW5jdGlvbiBjYWxscyBGTk5BTUUsIHRoZQorICAgICBjYWxsIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIHRoZSBzdHViIGluc3RlYWQuICBJZiBubyAzMiBiaXQKKyAgICAgZnVuY3Rpb24gY2FsbHMgRk5OQU1FLCB0aGUgc3R1YiBzaG91bGQgYmUgZGlzY2FyZGVkLiAgV2UgbmVlZCB0bworICAgICBjb25zaWRlciBhbnkgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiwgbm90IGp1c3QgYSBjYWxsLCBiZWNhdXNlCisgICAgIGlmIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBpcyB0YWtlbiB3ZSB3aWxsIG5lZWQgdGhlIHN0dWIsCisgICAgIHNpbmNlIHRoZSBhZGRyZXNzIG1pZ2h0IGJlIHBhc3NlZCB0byBhIDMyIGJpdCBmdW5jdGlvbi4KKworICAgICBTZWN0aW9uIG5hbWVzIHRoYXQgbG9vayBsaWtlIC5taXBzMTYuY2FsbC5GTk5BTUUgY29udGFpbiBzdHVicworICAgICB0aGF0IGNvcHkgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGZyb20gdGhlIGdwIHJlZ3MgdG8gdGhlIGZwCisgICAgIHJlZ3MgYW5kIHRoZW4ganVtcCB0byBGTk5BTUUuICBJZiBGTk5BTUUgaXMgYSAzMiBiaXQgZnVuY3Rpb24sCisgICAgIHRoZW4gYW55IDE2IGJpdCBmdW5jdGlvbiB0aGF0IGNhbGxzIEZOTkFNRSBzaG91bGQgYmUgcmVkaXJlY3RlZAorICAgICB0byB0aGUgc3R1YiBpbnN0ZWFkLiAgSWYgRk5OQU1FIGlzIG5vdCBhIDMyIGJpdCBmdW5jdGlvbiwgdGhlCisgICAgIHN0dWIgc2hvdWxkIGJlIGRpc2NhcmRlZC4KKworICAgICAubWlwczE2LmNhbGwuZnAuRk5OQU1FIHNlY3Rpb25zIGFyZSBzaW1pbGFyLCBidXQgY29udGFpbiBzdHVicworICAgICB3aGljaCBjYWxsIEZOTkFNRSBhbmQgdGhlbiBjb3B5IHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnAgcmVncworICAgICB0byB0aGUgZ3AgcmVncy4gIFRoZXNlIHN0dWJzIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgaW4gJDE4IHdoaWxlCisgICAgIGNhbGxpbmcgRk5OQU1FOyBhbnkgZnVuY3Rpb24gd2hpY2ggbWlnaHQgY2FsbCBvbmUgb2YgdGhlc2Ugc3R1YnMKKyAgICAgbXVzdCBhcnJhbmdlIHRvIHNhdmUgJDE4IGFyb3VuZCB0aGUgY2FsbC4gIChUaGlzIGNhc2UgaXMgbm90CisgICAgIG5lZWRlZCBmb3IgMzIgYml0IGZ1bmN0aW9ucyB0aGF0IGNhbGwgMTYgYml0IGZ1bmN0aW9ucywgYmVjYXVzZQorICAgICAxNiBiaXQgZnVuY3Rpb25zIGFsd2F5cyByZXR1cm4gZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluIGJvdGgKKyAgICAgJGYwLyRmMSBhbmQgJDIvJDMuKQorCisgICAgIE5vdGUgdGhhdCBpbiBhbGwgY2FzZXMgRk5OQU1FIG1pZ2h0IGJlIGRlZmluZWQgc3RhdGljYWxseS4KKyAgICAgVGhlcmVmb3JlLCBGTk5BTUUgaXMgbm90IHVzZWQgbGl0ZXJhbGx5LiAgSW5zdGVhZCwgdGhlIHJlbG9jYXRpb24KKyAgICAgaW5mb3JtYXRpb24gd2lsbCBpbmRpY2F0ZSB3aGljaCBzeW1ib2wgdGhlIHNlY3Rpb24gaXMgZm9yLgorCisgICAgIFdlIHJlY29yZCBhbnkgc3R1YnMgdGhhdCB3ZSBmaW5kIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworCisjZGVmaW5lIEZOX1NUVUIgIi5taXBzMTYuZm4uIgorI2RlZmluZSBDQUxMX1NUVUIgIi5taXBzMTYuY2FsbC4iCisjZGVmaW5lIENBTExfRlBfU1RVQiAiLm1pcHMxNi5jYWxsLmZwLiIKKworLyogVGhlIE1JUFMgRUxGIGxpbmtlciBuZWVkcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBlYWNoIHN5bWJvbCBpbgorICAgdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OworCisgIC8qIEV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisgIEVYVFIgZXN5bTsKKworICAvKiBOdW1iZXIgb2YgTUlQU18zMiBvciBNSVBTX1JFTDMyIHJlbG9jcyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KKyAgdW5zaWduZWQgaW50IG1pcHNfMzJfcmVsb2NzOworCisgIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDMyIGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKKyAgICAgMTYgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KKyAgYXNlY3Rpb24gKmZuX3N0dWI7CisKKyAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSBmbl9zdHViOyB0aGlzIGlzIHNldCBpZiB0aGlzIHN5bWJvbCBhcHBlYXJzCisgICAgIGluIGFueSByZWxvY3Mgb3RoZXIgdGhhbiBhIDE2IGJpdCBjYWxsLiAgKi8KKyAgYm9vbGVhbiBuZWVkX2ZuX3N0dWI7CisKKyAgLyogSWYgdGhlcmUgaXMgYSBzdHViIHRoYXQgMTYgYml0IGZ1bmN0aW9ucyBzaG91bGQgdXNlIHRvIGNhbGwgdGhpcworICAgICAzMiBiaXQgZnVuY3Rpb24sIHRoaXMgcG9pbnRzIHRvIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHN0dWIuICAqLworICBhc2VjdGlvbiAqY2FsbF9zdHViOworCisgIC8qIFRoaXMgaXMgbGlrZSB0aGUgY2FsbF9zdHViIGZpZWxkLCBidXQgaXQgaXMgdXNlZCBpZiB0aGUgZnVuY3Rpb24KKyAgICAgYmVpbmcgY2FsbGVkIHJldHVybnMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gICovCisgIGFzZWN0aW9uICpjYWxsX2ZwX3N0dWI7Cit9OworCisvKiBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKKyNpZiAwCisgIC8qIFdlIG5vIGxvbmdlciB1c2UgdGhpcy4gICovCisgIC8qIFN0cmluZyBzZWN0aW9uIGluZGljZXMgZm9yIHRoZSBkeW5hbWljIHNlY3Rpb24gc3ltYm9scy4gICovCisgIGJmZF9zaXplX3R5cGUgZHluc3ltX3NlY19zdHJpbmRleFtTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVNdOworI2VuZGlmCisgIC8qIFRoZSBudW1iZXIgb2YgLnJ0cHJvYyBlbnRyaWVzLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBwcm9jZWR1cmVfY291bnQ7CisgIC8qIFRoZSBzaXplIG9mIHRoZSAuY29tcGFjdF9yZWwgc2VjdGlvbiAoaWYgU0dJX0NPTVBBVCkuICAqLworICBiZmRfc2l6ZV90eXBlIGNvbXBhY3RfcmVsX3NpemU7CisgIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgRFRfTUlQU19STERfTUFQIGR5bmFtaWMKKyAgICAgZW50cnkgaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIF9fcmxkX29ial9oZWFkIGFzIGluIElyaXggNS4gKi8KKyAgYm9vbGVhbiB1c2VfcmxkX29ial9oZWFkOworICAvKiBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgX19ybGRfbWFwIG9yIF9fcmxkX29ial9oZWFkIHN5bWJvbC4gICovCisgIGJmZF92bWEgcmxkX3ZhbHVlOworICAvKiBUaGlzIGlzIHNldCBpZiB3ZSBzZWUgYW55IG1pcHMxNiBzdHViIHNlY3Rpb25zLiAqLworICBib29sZWFuIG1pcHMxNl9zdHVic19zZWVuOworfTsKKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCisgICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAorICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCisJCQkgKGNvcHkpLCAoZm9sbG93KSkpCisKKy8qIFRyYXZlcnNlIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCisgIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBtaXBzX2VsZl9oYXNoX3RhYmxlKHApIFwKKyAgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQorCitzdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltCisgIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisKKy8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCittaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCisJCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KKyAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7CisgICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCisJIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KKyAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKKyAgICAgIHJldC0+bWlwc18zMl9yZWxvY3MgPSAwOworICAgICAgcmV0LT5mbl9zdHViID0gTlVMTDsKKyAgICAgIHJldC0+bmVlZF9mbl9zdHViID0gZmFsc2U7CisgICAgICByZXQtPmNhbGxfc3R1YiA9IE5VTEw7CisgICAgICByZXQtPmNhbGxfZnBfc3R1YiA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKworLyogQ3JlYXRlIGEgTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorbWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCisJCQkJICAgICAgIG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmIDAKKyAgLyogV2Ugbm8gbG9uZ2VyIHVzZSB0aGlzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsgaSsrKQorICAgIHJldC0+ZHluc3ltX3NlY19zdHJpbmRleFtpXSA9IChiZmRfc2l6ZV90eXBlKSAtMTsKKyNlbmRpZgorICByZXQtPnByb2NlZHVyZV9jb3VudCA9IDA7CisgIHJldC0+Y29tcGFjdF9yZWxfc2l6ZSA9IDA7CisgIHJldC0+dXNlX3JsZF9vYmpfaGVhZCA9IGZhbHNlOworICByZXQtPnJsZF92YWx1ZSA9IDA7CisgIHJldC0+bWlwczE2X3N0dWJzX3NlZW4gPSBmYWxzZTsKKworICByZXR1cm4gJnJldC0+cm9vdC5yb290OworfQorCisvKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0CisgICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKKyAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBiZmRfdm1hICp2YWxwOworeworICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKKyAgICAgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKKyAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX3JsZF9uZXdfaW50ZXJmYWNlIikgPT0gMCkKKyAgICB7CisgICAgICAvKiBTa2lwIElyaXggNSBybGQgZW50cnkgbmFtZS4gICovCisgICAgICAqbmFtZXAgPSBOVUxMOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHN3aXRjaCAoc3ltLT5zdF9zaG5keCkKKyAgICB7CisgICAgY2FzZSBTSE5fQ09NTU9OOgorICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIHRoZSBHUCBzaXplIGFyZSBhdXRvbWF0aWNhbGx5CisJIHRyZWF0ZWQgYXMgU0hOX01JUFNfU0NPTU1PTiBzeW1ib2xzLiAgKi8KKyAgICAgIGlmIChzeW0tPnN0X3NpemUgPiBlbGZfZ3Bfc2l6ZSAoYWJmZCkpCisJYnJlYWs7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgU0hOX01JUFNfU0NPTU1PTjoKKyAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKKyAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047CisgICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSE5fTUlQU19URVhUOgorICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgICAgIGlmIChtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyID09IE5VTEwpCisJeworCSAgLyogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4gICovCisJICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24ubmFtZSA9ICIudGV4dCI7CisJICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uZmxhZ3MgPSBTRUNfTk9fRkxBR1M7CisJICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSBOVUxMOworCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbDsKKwkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbF9wdHI7CisJICBtaXBzX2VsZl90ZXh0X3N5bWJvbC5uYW1lID0gIi50ZXh0IjsKKwkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOworCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl90ZXh0X3NlY3Rpb247CisJICBtaXBzX2VsZl90ZXh0X3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfdGV4dF9zeW1ib2w7CisJICBtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX3RleHRfc2VjdGlvbjsKKwl9CisgICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKKyAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKKyAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLworICAgICAgKnNlY3AgPSBtaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNITl9NSVBTX0FDT01NT046CisgICAgICAvKiBGYWxsIHRocm91Z2guIFhYWCBDYW4gd2UgdHJlYXQgdGhpcyBhcyBhbGxvY2F0ZWQgZGF0YT8gICovCisgICAgY2FzZSBTSE5fTUlQU19EQVRBOgorICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gYSBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgICAgIGlmIChtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID09IE5VTEwpCisJeworCSAgLyogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbi4gICovCisJICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24ubmFtZSA9ICIuZGF0YSI7CisJICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uZmxhZ3MgPSBTRUNfTk9fRkxBR1M7CisJICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSBOVUxMOworCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLnN5bWJvbCA9ICZtaXBzX2VsZl9kYXRhX3N5bWJvbDsKKwkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHI7CisJICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5uYW1lID0gIi5kYXRhIjsKKwkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOworCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuc2VjdGlvbiA9ICZtaXBzX2VsZl9kYXRhX3NlY3Rpb247CisJICBtaXBzX2VsZl9kYXRhX3N5bWJvbF9wdHIgPSAmbWlwc19lbGZfZGF0YV9zeW1ib2w7CisJICBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyID0gJm1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKKwl9CisgICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBkbyAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHIgaWYKKyAgICAgICAgIGluZm8tPnNoYXJlZC4gIEkgZG9uJ3Qga25vdyB3aHksIGFuZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSwKKyAgICAgICAgIHNvIEkgdG9vayBpdCBvdXQuICAqLworICAgICAgKnNlY3AgPSBtaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNITl9NSVBTX1NVTkRFRklORUQ6CisgICAgICAqc2VjcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKFNHSV9DT01QQVQgKGFiZmQpCisgICAgICAmJiAhIGluZm8tPnNoYXJlZAorICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCisgICAgICAmJiBzdHJjbXAgKCpuYW1lcCwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKKyAgICB7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgLyogTWFyayBfX3JsZF9vYmpfaGVhZCBhcyBkeW5hbWljLiAgKi8KKyAgICAgIGggPSBOVUxMOworICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJICAgICAoaW5mbywgYWJmZCwgKm5hbWVwLCBCU0ZfR0xPQkFMLCAqc2VjcCwKKwkgICAgICAoYmZkX3ZtYSkgKnZhbHAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAorCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKKwkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKKyAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworCisgICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnVzZV9ybGRfb2JqX2hlYWQgPSB0cnVlOworICAgIH0KKworICAvKiBJZiB0aGlzIGlzIGEgbWlwczE2IHRleHQgc3ltYm9sLCBhZGQgMSB0byB0aGUgdmFsdWUgdG8gbWFrZSBpdAorICAgICBvZGQuICBUaGlzIHdpbGwgY2F1c2Ugc29tZXRoaW5nIGxpa2UgLndvcmQgU1lNIHRvIGNvbWUgdXAgd2l0aAorICAgICB0aGUgcmlnaHQgdmFsdWUgd2hlbiBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMuICAqLworICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQorICAgICsrKnZhbHA7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gbWlwc19lbGZfb3V0cHV0X2V4dHN5bS4gICovCisKK3N0cnVjdCBleHRzeW1faW5mbworeworICBiZmQgKmFiZmQ7CisgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7CisgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOworICBib29sZWFuIGZhaWxlZDsKK307CisKKy8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHdyaXRlIG91dCBFQ09GRiBkZWJ1Z2dpbmcgZXh0ZXJuYWwgc3ltYm9sCisgICBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhbGxlZCB2aWEgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgVGhlCisgICBFQ09GRiBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gbXVzdCBtYXRjaCB0aGUgRUxGIGV4dGVybmFsCisgICBzeW1ib2wgaW5mb3JtYXRpb24uICBVbmZvcnR1bmF0ZWx5LCBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cKKyAgIHdoZXRoZXIgYSBzeW1ib2wgaXMgcmVxdWlyZWQgYnkgcmVsb2MgaW5mb3JtYXRpb24sIHNvIHRoZSB0d28KKyAgIHRhYmxlcyBtYXkgd2luZCB1cCBiZWluZyBkaWZmZXJlbnQuICBXZSBtdXN0IHNvcnQgb3V0IHRoZSBleHRlcm5hbAorICAgc3ltYm9sIGluZm9ybWF0aW9uIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubWRlYnVnCisgICBzZWN0aW9uLCBhbmQgd2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbiBiZWZvcmUgd2UKKyAgIGNhbiByZWxvY2F0ZSBhbnkgc2VjdGlvbnMsIGFuZCB3ZSBjYW4ndCBrbm93IHdoaWNoIHN5bWJvbHMgYXJlCisgICByZXF1aXJlZCBieSByZWxvY2F0aW9uIHVudGlsIHdlIHJlbG9jYXRlIHRoZSBzZWN0aW9ucy4KKyAgIEZvcnR1bmF0ZWx5LCBpdCBpcyByZWxhdGl2ZWx5IHVubGlrZWx5IHRoYXQgYW55IHN5bWJvbCB3aWxsIGJlCisgICBzdHJpcHBlZCBidXQgcmVxdWlyZWQgYnkgYSByZWxvYy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBub3QgaGFwcGVuCisgICB3aGVuIGdlbmVyYXRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX291dHB1dF9leHRzeW0gKGgsIGRhdGEpCisgICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOworICBib29sZWFuIHN0cmlwOworICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247CisKKyAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKKyAgICBzdHJpcCA9IGZhbHNlOworICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKKwkgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCisJICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKKwkgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKKyAgICBzdHJpcCA9IHRydWU7CisgIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKKwkgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKKwkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAorCQkJCSAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKKwkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQorICAgIHN0cmlwID0gdHJ1ZTsKKyAgZWxzZQorICAgIHN0cmlwID0gZmFsc2U7CisKKyAgaWYgKHN0cmlwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKKyAgICB7CisgICAgICBoLT5lc3ltLmptcHRibCA9IDA7CisgICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOworICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKKyAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOworICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7CisgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOworICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7CisKKyAgICAgIGlmIChTR0lfQ09NUEFUIChlaW5mby0+YWJmZCkKKwkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCisJICAvKiBVc2UgdW5kZWZpbmVkIGNsYXNzLiAgQWxzbywgc2V0IGNsYXNzIGFuZCB0eXBlIGZvciBzb21lCisgICAgICAgICAgICAgc3BlY2lhbCBzeW1ib2xzLiAgKi8KKwkgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7CisJICBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCisJICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQorCSAgICB7CisJICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOworCSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0TGFiZWw7CisJICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQorCSAgICB7CisJICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7CisJICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKKwkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPQorCQltaXBzX2VsZl9oYXNoX3RhYmxlIChlaW5mby0+aW5mbyktPnByb2NlZHVyZV9jb3VudDsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKQorCSAgICB7CisJICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7CisJICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKKwkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBlbGZfZ3AgKGVpbmZvLT5hYmZkKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1VuZGVmaW5lZDsKKwl9CisgICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCisJICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKKworCSAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCisJICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLworCSAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCisJICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOworCSAgZWxzZQorCSAgICB7CisJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOworCisJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCisJCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7CisJICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKKwkJICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCisJCWgtPmVzeW0uYXN5bS5zYyA9IHNjUkRhdGE7CisJICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCisJCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NJbml0OworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOworCSAgICAgIGVsc2UKKwkJaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7CisJICAgIH0KKwl9CisKKyAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7CisgICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKKyAgICB9CisKKyAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKKyAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorICAgIHsKKyAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCisJaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7CisgICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQorCWgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKKworICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisgICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKKwloLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAorCQkJICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKKyAgICAgIGVsc2UKKwloLT5lc3ltLmFzeW0udmFsdWUgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFNldCB0eXBlIGFuZCB2YWx1ZSBmb3IgYSBzeW1ib2wgd2l0aCBhIGZ1bmN0aW9uIHN0dWIuICAqLworICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RQcm9jOworICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBpZiAoc2VjID09IE5VTEwpCisJaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisJICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKKwkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAorCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7CisJICBlbHNlCisJICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7CisJfQorI2lmIDAgLyogRklYTUU/ICAqLworICAgICAgaC0+ZXN5bS5pZmQgPSAwOworI2VuZGlmCisgICAgfQorCisgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAorCQkJCSAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKKwkJCQkgICAgICAmaC0+ZXN5bSkpCisgICAgeworICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBDcmVhdGUgYSBydW50aW1lIHByb2NlZHVyZSB0YWJsZSBmcm9tIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnM7CisgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKK3sKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgIEhEUlIgKmhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOworICBSUERSICpycGRyLCAqcnA7CisgIHN0cnVjdCBycGRyX2V4dCAqZXJwOworICBQVFIgcnRwcm9jOworICBzdHJ1Y3QgcGRyX2V4dCAqZXBkcjsKKyAgc3RydWN0IHN5bV9leHQgKmVzeW07CisgIGNoYXIgKnNzLCAqKnN2OworICBjaGFyICpzdHI7CisgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY291bnQ7CisgIHVuc2lnbmVkIGxvbmcgc2luZGV4OworICB1bnNpZ25lZCBsb25nIGk7CisgIFBEUiBwZHI7CisgIFNZTVIgc3ltOworICBjb25zdCBjaGFyICpub19uYW1lX2Z1bmMgPSBfKCJzdGF0aWMgcHJvY2VkdXJlIChubyBuYW1lKSIpOworCisgIGVwZHIgPSBOVUxMOworICBycGRyID0gTlVMTDsKKyAgZXN5bSA9IE5VTEw7CisgIHNzID0gTlVMTDsKKyAgc3YgPSBOVUxMOworCisgIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7CisKKyAgc2luZGV4ID0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKKyAgY291bnQgPSBoZHItPmlwZE1heDsKKyAgaWYgKGNvdW50ID4gMCkKKyAgICB7CisgICAgICBzaXplID0gc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7CisKKyAgICAgIGVwZHIgPSAoc3RydWN0IHBkcl9leHQgKikgYmZkX21hbGxvYyAoc2l6ZSAqIGNvdW50KTsKKyAgICAgIGlmIChlcGRyID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3BkciAoaGFuZGxlLCAoUFRSKSBlcGRyKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgc2l6ZSA9IHNpemVvZiAoUlBEUik7CisgICAgICBycCA9IHJwZHIgPSAoUlBEUiAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOworICAgICAgaWYgKHJwZHIgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgc3YgPSAoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICogY291bnQpOworICAgICAgaWYgKHN2ID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGNvdW50ID0gaGRyLT5pc3ltTWF4OworICAgICAgc2l6ZSA9IHN3YXAtPmV4dGVybmFsX3N5bV9zaXplOworICAgICAgZXN5bSA9IChzdHJ1Y3Qgc3ltX2V4dCAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOworICAgICAgaWYgKGVzeW0gPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIChoYW5kbGUsIChQVFIpIGVzeW0pKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBjb3VudCA9IGhkci0+aXNzTWF4OworICAgICAgc3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChjb3VudCk7CisgICAgICBpZiAoc3MgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGlmICghIF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3NzIChoYW5kbGUsIChQVFIpIHNzKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgY291bnQgPSBoZHItPmlwZE1heDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBycCsrKQorCXsKKwkgICgqc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSAoZXBkciArIGkpLCAmcGRyKTsKKwkgICgqc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCAoUFRSKSAmZXN5bVtwZHIuaXN5bV0sICZzeW0pOworCSAgcnAtPmFkciA9IHN5bS52YWx1ZTsKKwkgIHJwLT5yZWdtYXNrID0gcGRyLnJlZ21hc2s7CisJICBycC0+cmVnb2Zmc2V0ID0gcGRyLnJlZ29mZnNldDsKKwkgIHJwLT5mcmVnbWFzayA9IHBkci5mcmVnbWFzazsKKwkgIHJwLT5mcmVnb2Zmc2V0ID0gcGRyLmZyZWdvZmZzZXQ7CisJICBycC0+ZnJhbWVvZmZzZXQgPSBwZHIuZnJhbWVvZmZzZXQ7CisJICBycC0+ZnJhbWVyZWcgPSBwZHIuZnJhbWVyZWc7CisJICBycC0+cGNyZWcgPSBwZHIucGNyZWc7CisJICBycC0+aXJwc3MgPSBzaW5kZXg7CisJICBzdltpXSA9IHNzICsgc3ltLmlzczsKKwkgIHNpbmRleCArPSBzdHJsZW4gKHN2W2ldKSArIDE7CisJfQorICAgIH0KKworICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMikgKyBzaW5kZXg7CisgIHNpemUgPSBCRkRfQUxJR04gKHNpemUsIDE2KTsKKyAgcnRwcm9jID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKKyAgaWYgKHJ0cHJvYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSAwOworICAgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5wcm9jZWR1cmVfY291bnQgPSBjb3VudCArIDI7CisKKyAgZXJwID0gKHN0cnVjdCBycGRyX2V4dCAqKSBydHByb2M7CisgIG1lbXNldCAoZXJwLCAwLCBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkpOworICBlcnArKzsKKyAgc3RyID0gKGNoYXIgKikgcnRwcm9jICsgc2l6ZW9mIChzdHJ1Y3QgcnBkcl9leHQpICogKGNvdW50ICsgMik7CisgIHN0cmNweSAoc3RyLCBub19uYW1lX2Z1bmMpOworICBzdHIgKz0gc3RybGVuIChub19uYW1lX2Z1bmMpICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgcnBkciArIGksIGVycCArIGkpOworICAgICAgc3RyY3B5IChzdHIsIHN2W2ldKTsKKyAgICAgIHN0ciArPSBzdHJsZW4gKHN2W2ldKSArIDE7CisgICAgfQorICBlY29mZl9wdXRfb2ZmIChhYmZkLCAoYmZkX3ZtYSkgLTEsIChiZmRfYnl0ZSAqKSAoZXJwICsgY291bnQpLT5wX2Fkcik7CisKKyAgLyogU2V0IHRoZSBzaXplIGFuZCBjb250ZW50cyBvZiAucnRwcm9jIHNlY3Rpb24uICAqLworICBzLT5fcmF3X3NpemUgPSBzaXplOworICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBydHByb2M7CisKKyAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKKyAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KKyAgcy0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCisgIGlmIChlcGRyICE9IE5VTEwpCisgICAgZnJlZSAoZXBkcik7CisgIGlmIChycGRyICE9IE5VTEwpCisgICAgZnJlZSAocnBkcik7CisgIGlmIChlc3ltICE9IE5VTEwpCisgICAgZnJlZSAoZXN5bSk7CisgIGlmIChzcyAhPSBOVUxMKQorICAgIGZyZWUgKHNzKTsKKyAgaWYgKHN2ICE9IE5VTEwpCisgICAgZnJlZSAoc3YpOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZXBkciAhPSBOVUxMKQorICAgIGZyZWUgKGVwZHIpOworICBpZiAocnBkciAhPSBOVUxMKQorICAgIGZyZWUgKHJwZHIpOworICBpZiAoZXN5bSAhPSBOVUxMKQorICAgIGZyZWUgKGVzeW0pOworICBpZiAoc3MgIT0gTlVMTCkKKyAgICBmcmVlIChzcyk7CisgIGlmIChzdiAhPSBOVUxMKQorICAgIGZyZWUgKHN2KTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBBIGNvbXBhcmlzb24gcm91dGluZSB1c2VkIHRvIHNvcnQgLmdwdGFiIGVudHJpZXMuICAqLworCitzdGF0aWMgaW50CitncHRhYl9jb21wYXJlIChwMSwgcDIpCisgICAgIGNvbnN0IFBUUiBwMTsKKyAgICAgY29uc3QgUFRSIHAyOworeworICBjb25zdCBFbGYzMl9ncHRhYiAqYTEgPSAoY29uc3QgRWxmMzJfZ3B0YWIgKikgcDE7CisgIGNvbnN0IEVsZjMyX2dwdGFiICphMiA9IChjb25zdCBFbGYzMl9ncHRhYiAqKSBwMjsKKworICByZXR1cm4gYTEtPmd0X2VudHJ5Lmd0X2dfdmFsdWUgLSBhMi0+Z3RfZW50cnkuZ3RfZ192YWx1ZTsKK30KKworLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAorICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKKyAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqKnNlY3BwOworICBhc2VjdGlvbiAqbzsKKyAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICBhc2VjdGlvbiAqcmVnaW5mb19zZWMsICptZGVidWdfc2VjLCAqZ3B0YWJfZGF0YV9zZWMsICpncHRhYl9ic3Nfc2VjOworICBhc2VjdGlvbiAqcnRwcm9jX3NlYzsKKyAgRWxmMzJfUmVnSW5mbyByZWdpbmZvOworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAKKyAgICA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKKyAgSERSUiAqc3ltaGRyID0gJmRlYnVnLnN5bWJvbGljX2hlYWRlcjsKKyAgUFRSIG1kZWJ1Z19oYW5kbGUgPSBOVUxMOworCisgIC8qIERyb3AgdGhlIC5vcHRpb25zIHNlY3Rpb24sIHNpbmNlIGl0IGhhcyBzcGVjaWFsIHNlbWFudGljcyB3aGljaCBJCisgICAgIGhhdmVuJ3QgYm90aGVyZWQgdG8gZmlndXJlIG91dC4gICovCisgIGZvciAoc2VjcHAgPSAmYWJmZC0+c2VjdGlvbnM7ICpzZWNwcCAhPSBOVUxMOyBzZWNwcCA9ICYoKnNlY3BwKS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wICgoKnNlY3BwKS0+bmFtZSwgIi5vcHRpb25zIikgPT0gMCkKKwl7CisJICBmb3IgKHAgPSAoKnNlY3BwKS0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCSAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKKwkgICAgICBwLT51LmluZGlyZWN0LnNlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOworCSAgKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZCA9IE5VTEw7CisJICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKKwkgIC0tYWJmZC0+c2VjdGlvbl9jb3VudDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogR2V0IGEgdmFsdWUgZm9yIHRoZSBHUCByZWdpc3Rlci4gICovCisgIGlmIChlbGZfZ3AgKGFiZmQpID09IDApCisgICAgeworICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCisJZWxmX2dwIChhYmZkKSA9IChoLT51LmRlZi52YWx1ZQorCQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICBlbHNlIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgYmZkX3ZtYSBsbzsKKworCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KKwkgIGxvID0gKGJmZF92bWEpIC0xOworCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKG8tPnZtYSA8IGxvCisJCSAgJiYgKHN0cmNtcCAoby0+bmFtZSwgIi5zYnNzIikgPT0gMAorCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsICIuc2RhdGEiKSA9PSAwCisJCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgIi5saXQ0IikgPT0gMAorCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsICIubGl0OCIpID09IDApKQorCQlsbyA9IG8tPnZtYTsKKwkgICAgfQorCSAgZWxmX2dwIChhYmZkKSA9IGxvICsgRUxGX01JUFNfR1BfT0ZGU0VUIChhYmZkKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSWYgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24gbmVlZHMgdG8gZG8gYSByZWxvYworCSAgICAgaW52b2x2aW5nIHRoZSBHUCB2YWx1ZSwgaXQgc2hvdWxkIG1ha2UgYSByZWxvY19kYW5nZXJvdXMKKwkgICAgIGNhbGxiYWNrIHRvIHdhcm4gdGhhdCBHUCBpcyBub3QgZGVmaW5lZC4gICovCisJfQorICAgIH0KKworICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKKyAgICAgaW5mb3JtYXRpb24uICAqLworICByZWdpbmZvX3NlYyA9IE5VTEw7CisgIG1kZWJ1Z19zZWMgPSBOVUxMOworICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7CisgIGdwdGFiX2Jzc19zZWMgPSBOVUxMOworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5yZWdpbmZvIikgPT0gMCkKKwl7CisJICBtZW1zZXQgKCZyZWdpbmZvLCAwLCBzaXplb2YgcmVnaW5mbyk7CisKKwkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5yZWdpbmZvIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgorCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKKwkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCisJICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7CisJICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCSAgICAgICBwID0gcC0+bmV4dCkKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworCSAgICAgIGJmZCAqaW5wdXRfYmZkOworCSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OworCSAgICAgIEVsZjMyX1JlZ0luZm8gc3ViOworCisJICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJCXsKKwkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQorCQkgICAgY29udGludWU7CisJCSAgYWJvcnQgKCk7CisJCX0KKworCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247CisJICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisKKwkgICAgICAvKiBUaGUgbGlua2VyIGVtdWxhdGlvbiBjb2RlIGhhcyBwcm9iYWJseSBjbG9iYmVyZWQgdGhlCisgICAgICAgICAgICAgICAgIHNpemUgdG8gYmUgemVybyBieXRlcy4gICovCisJICAgICAgaWYgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQorCQlpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgICAgIChQVFIpICZleHQsCisJCQkJCSAgICAgIChmaWxlX3B0cikgMCwKKwkJCQkJICAgICAgc2l6ZW9mIGV4dCkpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKKworCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKKwkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07CisJICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOworCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKKwkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107CisKKwkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCisJCSBtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyB3aGVuIHRoZSBzZWN0aW9uIGlzCisJCSBmaW5hbGx5IHdyaXR0ZW4gb3V0LiAgKi8KKworCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAorCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KKwkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKKwkgICAgfQorCisJICAvKiBTaXplIGhhcyBiZWVuIHNldCBpbiBtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAgKi8KKwkgIEJGRF9BU1NFUlQoby0+X3Jhd19zaXplID09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOworCisJICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQorCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KKwkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKworCSAgcmVnaW5mb19zZWMgPSBvOworCX0KKworICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQorCXsKKwkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKKworCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KKwkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCisJICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLworCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKKwkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCisJICBzeW1oZHItPnZzdGFtcCA9IDA7CisJICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKKwkgIHN5bWhkci0+Y2JMaW5lID0gMDsKKwkgIHN5bWhkci0+aWRuTWF4ID0gMDsKKwkgIHN5bWhkci0+aXBkTWF4ID0gMDsKKwkgIHN5bWhkci0+aXN5bU1heCA9IDA7CisJICBzeW1oZHItPmlvcHRNYXggPSAwOworCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKKwkgIHN5bWhkci0+aXNzTWF4ID0gMDsKKwkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKKwkgIHN5bWhkci0+aWZkTWF4ID0gMDsKKwkgIHN5bWhkci0+Y3JmZCA9IDA7CisJICBzeW1oZHItPmlleHRNYXggPSAwOworCisJICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQorCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLworCSAgZGVidWcubGluZSA9IE5VTEw7CisJICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOworCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKKwkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7CisJICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOworCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKKwkgIGRlYnVnLnNzID0gTlVMTDsKKwkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKKwkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7CisJICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOworCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7CisKKwkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKKwkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnM7CisJICAgICAgRVhUUiBlc3ltOworCSAgICAgIGJmZF92bWEgbGFzdDsKKwkgICAgICB1bnNpZ25lZCBpbnQgaTsKKwkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVbXSA9CisJCXsgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKKwkJICAgICIucm9kYXRhIiwgIi5zZGF0YSIsICIuc2JzcyIsICIuYnNzIiB9OworCSAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2NbXSA9IHsgc2NUZXh0LCBzY0luaXQsIHNjRmluaSwgc2NEYXRhLAorCQkJCQkgIHNjUkRhdGEsIHNjU0RhdGEsIHNjU0Jzcywgc2NCc3MgfTsKKworCSAgICAgIGVzeW0uam1wdGJsID0gMDsKKwkgICAgICBlc3ltLmNvYm9sX21haW4gPSAwOworCSAgICAgIGVzeW0ud2Vha2V4dCA9IDA7CisJICAgICAgZXN5bS5yZXNlcnZlZCA9IDA7CisJICAgICAgZXN5bS5pZmQgPSBpZmROaWw7CisJICAgICAgZXN5bS5hc3ltLmlzcyA9IGlzc05pbDsKKwkgICAgICBlc3ltLmFzeW0uc3QgPSBzdExvY2FsOworCSAgICAgIGVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7CisJICAgICAgZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7CisJICAgICAgbGFzdCA9IDA7CisJICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkgIGVzeW0uYXN5bS5zYyA9IHNjW2ldOworCQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZVtpXSk7CisJCSAgaWYgKHMgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgZXN5bS5hc3ltLnZhbHVlID0gcy0+dm1hOworCQkgICAgICBsYXN0ID0gcy0+dm1hICsgcy0+X3Jhd19zaXplOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGVzeW0uYXN5bS52YWx1ZSA9IGxhc3Q7CisKKwkJICBpZiAoISBiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsIChhYmZkLCAmZGVidWcsIHN3YXAsCisJCQkJCQkgICAgICBuYW1lW2ldLCAmZXN5bSkpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgfQorCisJICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7CisJICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCSAgICAgICBwID0gcC0+bmV4dCkKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworCSAgICAgIGJmZCAqaW5wdXRfYmZkOworCSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwOworCSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGlucHV0X2RlYnVnOworCSAgICAgIGNoYXIgKmVyYXdfc3JjOworCSAgICAgIGNoYXIgKmVyYXdfZW5kOworCisJICAgICAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJCXsKKwkJICBpZiAocC0+dHlwZSA9PSBiZmRfZmlsbF9saW5rX29yZGVyKQorCQkgICAgY29udGludWU7CisJCSAgYWJvcnQgKCk7CisJCX0KKworCSAgICAgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247CisJICAgICAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisKKwkgICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChpbnB1dF9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKwkJICB8fCAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKKwkJICAgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKSA9PSBOVUxMKQorCQl7CisJCSAgLyogSSBkb24ndCBrbm93IHdoYXQgYSBub24gTUlQUyBFTEYgYmZkIHdvdWxkIGJlCisJCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5CisJCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCisJCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKKworCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKKworCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQorCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KKwkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCisJICAgICAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJCSAgICZpbnB1dF9kZWJ1ZykpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQorCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKKwkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCisJCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgorCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KKwkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLworCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OworCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCisJCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4CisJCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKKwkgICAgICBmb3IgKDsKKwkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKKwkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCisJCXsKKwkJICBFWFRSIGV4dDsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7CisJCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCisJCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCisJCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOworCQkgIGggPSBtaXBzX2VsZl9saW5rX2hhc2hfbG9va3VwIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCisJCSAgICBjb250aW51ZTsKKworCQkgIGlmIChleHQuaWZkICE9IC0xKQorCQkgICAgeworCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCisJCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOworCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOworCQkgICAgfQorCisJCSAgaC0+ZXN5bSA9IGV4dDsKKwkJfQorCisJICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7CisJICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7CisJICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7CisJICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKKworCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAorCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KKwkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKKwkgICAgfQorCisJICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkgJiYgaW5mby0+c2hhcmVkKQorCSAgICB7CisJICAgICAgLyogQ3JlYXRlIC5ydHByb2Mgc2VjdGlvbi4gICovCisJICAgICAgcnRwcm9jX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOworCSAgICAgIGlmIChydHByb2Nfc2VjID09IE5VTEwpCisJCXsKKwkJICBmbGFnd29yZCBmbGFncyA9IChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQorCQkJCSAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7CisKKwkJICBydHByb2Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ydHByb2MiKTsKKwkJICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMCisJCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBydHByb2Nfc2VjLCBmbGFncykKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBydHByb2Nfc2VjLCA0KSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKKwkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworCSAgZWluZm8uYWJmZCA9IGFiZmQ7CisJICBlaW5mby5pbmZvID0gaW5mbzsKKwkgIGVpbmZvLmRlYnVnID0gJmRlYnVnOworCSAgZWluZm8uc3dhcCA9IHN3YXA7CisJICBlaW5mby5mYWlsZWQgPSBmYWxzZTsKKwkgIG1pcHNfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJICAgICAgIG1pcHNfZWxmX291dHB1dF9leHRzeW0sCisJCQkJICAgICAgIChQVFIpICZlaW5mbyk7CisJICBpZiAoZWluZm8uZmFpbGVkKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KKwkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOworCisJICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQorCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KKwkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKworCSAgbWRlYnVnX3NlYyA9IG87CisJfQorCisgICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKKwl7CisJICBjb25zdCBjaGFyICpzdWJuYW1lOworCSAgdW5zaWduZWQgaW50IGM7CisJICBFbGYzMl9ncHRhYiAqdGFiOworCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7CisJICB1bnNpZ25lZCBpbnQgaTsKKworCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAorCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAorCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucworCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLworCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKipzZWNwcDsKKworCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKKwkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisJCSAgIHAgPSBwLT5uZXh0KQorCQl7CisJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisKKwkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKKwkJICAgIHsKKwkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKKwkJCWNvbnRpbnVlOworCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIH0KKworCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247CisKKwkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKKwkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLworCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOworCQl9CisKKwkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCisJCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KKwkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisKKwkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KKwkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOworCQkgICAqc2VjcHAgIT0gbzsKKwkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCisJCTsKKwkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKKwkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7CisKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCisJICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLworCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCisJICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKKwkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKKwkgICAgZ3B0YWJfYnNzX3NlYyA9IG87CisJICBlbHNlCisJICAgIHsKKwkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKKwkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgorCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCisJICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCisJICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7CisJICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKKwkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7CisJICAgICAgZWxzZQorCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOworCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKKwkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7CisJICAgIH0KKworCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCisJICBjID0gMTsKKwkgIHRhYiA9IChFbGYzMl9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGYzMl9ncHRhYikpOworCSAgaWYgKHRhYiA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKKwkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKKworCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLworCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOworCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKwkgICAgICAgcCA9IHAtPm5leHQpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKwkgICAgICBiZmQgKmlucHV0X2JmZDsKKwkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7CisJICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OworCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKKworCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCQl7CisJCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKKwkJICAgIGNvbnRpbnVlOworCQkgIGFib3J0ICgpOworCQl9CisKKwkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOworCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOworCisJICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQorCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQorCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCisJICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7CisJICAgICAgbGFzdCA9IDA7CisJICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7CisJCSAgIGdwZW50cnkgPCBzaXplOworCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKQorCQl7CisJCSAgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOworCQkgIEVsZjMyX2dwdGFiIGludF9ncHRhYjsKKwkJICB1bnNpZ25lZCBsb25nIHZhbDsKKwkJICB1bnNpZ25lZCBsb25nIGFkZDsKKwkJICBib29sZWFuIGV4YWN0OworCQkgIHVuc2lnbmVkIGludCBsb29rOworCisJCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cworCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCisJCQkgIGdwZW50cnksIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSkpCisJCSAgICB7CisJCSAgICAgIGZyZWUgKHRhYik7CisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKworCQkgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGlucHV0X2JmZCwgJmV4dF9ncHRhYiwKKwkJCQkJCSZpbnRfZ3B0YWIpOworCQkgIHZhbCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9nX3ZhbHVlOworCQkgIGFkZCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlcyAtIGxhc3Q7CisKKwkJICBleGFjdCA9IGZhbHNlOworCQkgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCisJCSAgICB7CisJCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA+PSB2YWwpCisJCQl0YWJbbG9va10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0gYWRkOworCisJCSAgICAgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9PSB2YWwpCisJCQlleGFjdCA9IHRydWU7CisJCSAgICB9CisKKwkJICBpZiAoISBleGFjdCkKKwkJICAgIHsKKwkJICAgICAgRWxmMzJfZ3B0YWIgKm5ld190YWI7CisJCSAgICAgIHVuc2lnbmVkIGludCBtYXg7CisKKwkJICAgICAgLyogV2UgbmVlZCBhIG5ldyB0YWJsZSBlbnRyeS4gICovCisJCSAgICAgIG5ld190YWIgPSAoKEVsZjMyX2dwdGFiICopCisJCQkJIGJmZF9yZWFsbG9jICgoUFRSKSB0YWIsCisJCQkJCSAgICAgIChjICsgMSkgKiBzaXplb2YgKEVsZjMyX2dwdGFiKSkpOworCQkgICAgICBpZiAobmV3X3RhYiA9PSBOVUxMKQorCQkJeworCQkJICBmcmVlICh0YWIpOworCQkJICByZXR1cm4gZmFsc2U7CisJCQl9CisJCSAgICAgIHRhYiA9IG5ld190YWI7CisJCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID0gdmFsOworCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgPSBhZGQ7CisKKwkJICAgICAgLyogTWVyZ2UgaW4gdGhlIHNpemUgZm9yIHRoZSBuZXh0IHNtYWxsZXN0IC1HCisJCQkgdmFsdWUsIHNpbmNlIHRoYXQgd2lsbCBiZSBpbXBsaWVkIGJ5IHRoaXMgbmV3CisJCQkgdmFsdWUuICAqLworCQkgICAgICBtYXggPSAwOworCQkgICAgICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQorCQkJeworCQkJICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPCB2YWwKKwkJCSAgICAgICYmIChtYXggPT0gMAorCQkJCSAgfHwgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlCisJCQkJICAgICAgPiB0YWJbbWF4XS5ndF9lbnRyeS5ndF9nX3ZhbHVlKSkpCisJCQkgICAgbWF4ID0gbG9vazsKKwkJCX0KKwkJICAgICAgaWYgKG1heCAhPSAwKQorCQkJdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzICs9CisJCQkgIHRhYlttYXhdLmd0X2VudHJ5Lmd0X2J5dGVzOworCisJCSAgICAgICsrYzsKKwkJICAgIH0KKworCQkgIGxhc3QgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXM7CisJCX0KKworCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAorCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KKwkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKKwkgICAgfQorCisJICAvKiBUaGUgdGFibGUgbXVzdCBiZSBzb3J0ZWQgYnkgLUcgdmFsdWUuICAqLworCSAgaWYgKGMgPiAyKQorCSAgICBxc29ydCAodGFiICsgMSwgYyAtIDEsIHNpemVvZiAodGFiWzBdKSwgZ3B0YWJfY29tcGFyZSk7CisKKwkgIC8qIFN3YXAgb3V0IHRoZSB0YWJsZS4gICovCisJICBleHRfdGFiID0gKChFbGYzMl9FeHRlcm5hbF9ncHRhYiAqKQorCQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgYyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpKSk7CisJICBpZiAoZXh0X3RhYiA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZnJlZSAodGFiKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKKwkgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKKwkgIGZyZWUgKHRhYik7CisKKwkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKTsKKwkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7CisKKwkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5CisJICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLworCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCX0KKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLworICBpZiAoISBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOb3cgd3JpdGUgb3V0IHRoZSBjb21wdXRlZCBzZWN0aW9ucy4gICovCisKKyAgaWYgKHJlZ2luZm9fc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OworCisgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCAmcmVnaW5mbywgJmV4dCk7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJlZ2luZm9fc2VjLCAoUFRSKSAmZXh0LAorCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAobWRlYnVnX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKKyAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLAorCQkJCQkgICAgICAgc3dhcCwgaW5mbywKKwkJCQkJICAgICAgIG1kZWJ1Z19zZWMtPmZpbGVwb3MpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7CisgICAgfQorCisgIGlmIChncHRhYl9kYXRhX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2RhdGFfc2VjLAorCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5jb250ZW50cywKKwkJCQkgICAgICAoZmlsZV9wdHIpIDAsCisJCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPl9yYXdfc2l6ZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZ3B0YWJfYnNzX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2Jzc19zZWMsCisJCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+Y29udGVudHMsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLAorCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPl9yYXdfc2l6ZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkpCisgICAgeworICAgICAgcnRwcm9jX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOworICAgICAgaWYgKHJ0cHJvY19zZWMgIT0gTlVMTCkKKwl7CisJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJ0cHJvY19zZWMsCisJCQkJCSAgcnRwcm9jX3NlYy0+Y29udGVudHMsCisJCQkJCSAgKGZpbGVfcHRyKSAwLAorCQkJCQkgIHJ0cHJvY19zZWMtPl9yYXdfc2l6ZSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBIYW5kbGUgYSBNSVBTIEVMRiBISTE2IHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcmVsaGksIHJlbGxvLCBjb250ZW50cywgYWRkZW5kKQorICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYmZkX3ZtYSBhZGRlbmQ7Cit7CisgIGJmZF92bWEgaW5zbjsKKyAgYmZkX3ZtYSBhZGRsbzsKKworICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7CisKKyAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKKyAgYWRkbG8gJj0gMHhmZmZmOworCisgIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOworCisgIGlmICgoYWRkbG8gJiAweDgwMDApICE9IDApCisgICAgYWRkZW5kIC09IDB4MTAwMDA7CisgIGlmICgoYWRkZW5kICYgMHg4MDAwKSAhPSAwKQorICAgIGFkZGVuZCArPSAweDEwMDAwOworCisgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKKwkgICAgICAoaW5zbiAmIDB4ZmZmZjAwMDApIHwgKChhZGRlbmQgPj4gMTYpICYgMHhmZmZmKSwKKwkgICAgICBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Cit9CisKKy8qIEhhbmRsZSBhIE1JUFMgRUxGIGxvY2FsIEdPVDE2IHJlbG9jLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBzZ290LCByZWxoaSwgcmVsbG8sCisJCQkgICAgIGNvbnRlbnRzLCBhZGRlbmQpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICpzZ290OworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsaGk7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxsbzsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBiZmRfdm1hIGFkZGVuZDsKK3sKKyAgdW5zaWduZWQgaW50IGFzc2lnbmVkX2dvdG5vOworICB1bnNpZ25lZCBpbnQgaTsKKyAgYmZkX3ZtYSBpbnNuOworICBiZmRfdm1hIGFkZGxvOworICBiZmRfdm1hIGFkZHJlc3M7CisgIGJmZF92bWEgaGlwYWdlOworICBiZmRfYnl0ZSAqZ290X2NvbnRlbnRzOworICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKKworICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7CisKKyAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKKyAgYWRkbG8gJj0gMHhmZmZmOworCisgIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOworCisgIGlmICgoYWRkbG8gJiAweDgwMDApICE9IDApCisgICAgYWRkZW5kIC09IDB4MTAwMDA7CisgIGlmICgoYWRkZW5kICYgMHg4MDAwKSAhPSAwKQorICAgIGFkZGVuZCArPSAweDEwMDAwOworCisgIC8qIEdldCBhIGdvdCBlbnRyeSByZXByZXNlbnRpbmcgcmVxdWVzdGVkIGhpcGFnZS4gICovCisgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOworICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKKyAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKKworICBhc3NpZ25lZF9nb3RubyA9IGctPmFzc2lnbmVkX2dvdG5vOworICBnb3RfY29udGVudHMgPSBzZ290LT5jb250ZW50czsKKyAgaGlwYWdlID0gYWRkZW5kICYgMHhmZmZmMDAwMDsKKworICBmb3IgKGkgPSBNSVBTX1JFU0VSVkVEX0dPVE5POyBpIDwgYXNzaWduZWRfZ290bm87IGkrKykKKyAgICB7CisgICAgICBhZGRyZXNzID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBnb3RfY29udGVudHMgKyBpICogNCk7CisgICAgICBpZiAoaGlwYWdlID09IChhZGRyZXNzICYgMHhmZmZmMDAwMCkpCisJYnJlYWs7CisgICAgfQorCisgIGlmIChpID09IGFzc2lnbmVkX2dvdG5vKQorICAgIHsKKyAgICAgIGlmIChhc3NpZ25lZF9nb3RubyA+PSBnLT5sb2NhbF9nb3RubykKKwl7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIm1vcmUgZ290IGVudHJpZXMgYXJlIG5lZWRlZCBmb3IgaGlwYWdlIHJlbG9jYXRpb25zIikpOworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGhpcGFnZSwgZ290X2NvbnRlbnRzICsgYXNzaWduZWRfZ290bm8gKiA0KTsKKyAgICAgICsrZy0+YXNzaWduZWRfZ290bm87CisgICAgfQorCisgIGkgPSAtIEVMRl9NSVBTX0dQX09GRlNFVCAob3V0cHV0X2JmZCkgKyBpICogNDsKKyAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoaW5zbiAmIDB4ZmZmZjAwMDApIHwgKGkgJiAweGZmZmYpLAorCSAgICAgIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSGFuZGxlIE1JUFMgRUxGIENBTEwxNiByZWxvYyBhbmQgZ2xvYmFsIEdPVDE2IHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QgKGlucHV0X2JmZCwgcmVsLCBjb250ZW50cywgb2Zmc2V0KQorICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBiZmRfdm1hIG9mZnNldDsKK3sKKyAgYmZkX3ZtYSBpbnNuOworCisgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKKwkgICAgICAoaW5zbiAmIDB4ZmZmZjAwMDApIHwgKG9mZnNldCAmIDB4ZmZmZiksCisJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKK30KKworLyogUmVsb2NhdGUgYSBNSVBTIEVMRiBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKKyAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHNpemVfdCBsb2NzeW1jb3VudDsKKyAgc2l6ZV90IGV4dHN5bW9mZjsKKyAgYXNlY3Rpb24gKnNnb3QsICpzcmVsb2MsICpzY3B0OworICBiZmQgKmR5bm9iajsKKyAgYmZkX3ZtYSBncDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKKyAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworCisgIHNnb3QgPSBOVUxMOworICBzcmVsb2MgPSBOVUxMOworICBpZiAoZHlub2JqID09IE5VTEwgfHwgISBTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKKyAgICBzY3B0ID0gTlVMTDsKKyAgZWxzZQorICAgIHNjcHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbXBhY3RfcmVsIik7CisgIGcgPSBOVUxMOworCisgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKKyAgICB7CisgICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7CisgICAgICBleHRzeW1vZmYgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgICAgIGV4dHN5bW9mZiA9IHN5bXRhYl9oZHItPnNoX2luZm87CisgICAgfQorCisgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBiZmRfdm1hIGFkZGVuZDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOworICAgICAgaW50IG90aGVyOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisKKyAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOworICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfR05VX1ZUSU5IRVJJVAorCSAgfHwgcl90eXBlID09IFJfTUlQU19HTlVfVlRFTlRSWSkKKwljb250aW51ZTsKKyAgICAgIGlmICgocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9NSVBTX21heCkKKwkgICYmIHJfdHlwZSAhPSBSX01JUFMxNl8yNgorCSAgJiYgcl90eXBlICE9IFJfTUlQUzE2X0dQUkVMKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYpCisJaG93dG8gPSAmZWxmX21pcHMxNl9qdW1wX2hvd3RvOworICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2X0dQUkVMKQorCWhvd3RvID0gJmVsZl9taXBzMTZfZ3ByZWxfaG93dG87CisgICAgICBlbHNlCisJaG93dG8gPSBlbGZfbWlwc19ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgaWYgKGR5bm9iaiAhPSBOVUxMCisJICAmJiAocl90eXBlID09IFJfTUlQU19DQUxMMTYKKwkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVDE2CisJICAgICAgfHwgcl90eXBlID09IFJfTUlQU19DQUxMX0hJMTYKKwkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0NBTExfTE8xNgorCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UX0hJMTYKKwkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9MTzE2KSkKKwl7CisJICAvKiBXZSBuZWVkIHRoZSAuZ290IHNlY3Rpb24uICAqLworCSAgaWYgKHNnb3QgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7CisJICAgICAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7CisJICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKKwkgICAgfQorCX0KKworICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCisgICAgICAvKiBNaXggaW4gdGhlIGNoYW5nZSBpbiBHUCBhZGRyZXNzIGZvciBhIEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KKyAgICAgIGlmIChyX3R5cGUgIT0gUl9NSVBTX0dQUkVMMTYKKwkgICYmIHJfdHlwZSAhPSBSX01JUFNfTElURVJBTAorCSAgJiYgcl90eXBlICE9IFJfTUlQU19HUFJFTDMyCisJICAmJiByX3R5cGUgIT0gUl9NSVBTMTZfR1BSRUwpCisJYWRkZW5kID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZ3AgPT0gMCkKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQorCQkgICAgIChpbmZvLAorCQkgICAgICBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKKwkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICAvKiBPbmx5IGdpdmUgdGhlIGVycm9yIG9uY2UgcGVyIGxpbmsuICAqLworCSAgICAgIGdwID0gNDsKKwkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOworCSAgICB9CisKKwkgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgorCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQorCQkgICYmIGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XSAhPSBOVUxMKSkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhlIGN1cnJlbnQKKwkJIGFkZGVuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorCQkgSU5QVVRfU0VDVElPTi0+dm1hIGFuZCB0aGUgR1AgdmFsdWUgb2YgSU5QVVRfQkZELiAgV2UKKwkJIG11c3QgY2hhbmdlIHRoaXMgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKKwkJIGZpbmFsIGRlZmluaXRpb24gKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pCisJCSBhbmQgdGhlIEdQIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCisJICAgICAgYWRkZW5kID0gZWxmX2dwIChpbnB1dF9iZmQpIC0gZ3A7CisJICAgIH0KKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgLyogV2UgYXJlIGRvaW5nIGEgZmluYWwgbGluay4gIFRoZSBjdXJyZW50IGFkZGVuZCBpbiB0aGUKKwkJIGluc3RydWN0aW9uIGlzIHNpbXBseSB0aGUgZGVzaXJlZCBvZmZzZXQgaW50byB0aGUKKwkJIHN5bWJvbCAobm9ybWFsbHkgemVybykuICBXZSB3YW50IHRoZSBpbnN0cnVjdGlvbiB0bworCQkgaG9sZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaW5hbCBkZWZpbml0aW9uIG9mCisJCSB0aGUgc3ltYm9sICh3aGljaCB3aWxsIGVuZCB1cCBpbiBSRUxPQ0FUSU9OKSBhbmQgdGhlCisJCSBHUCB2YWx1ZSBvZiBPVVRQVVRfQkZEICh3aGljaCBpcyBpbiBHUCkuICAqLworCSAgICAgIGFkZGVuZCA9IC0gZ3A7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGFuZCB3ZSBhcmVuJ3QKKwkJIGdvaW5nIHRvIGRlZmluZSB0aGlzIHN5bWJvbCwgc28gd2UganVzdCBsZWF2ZSB0aGUKKwkJIGluc3RydWN0aW9uIGFsb25lLiAgKi8KKwkgICAgICBhZGRlbmQgPSAwOworCSAgICB9CisJfQorCisgICAgICBoID0gTlVMTDsKKyAgICAgIHN5bSA9IE5VTEw7CisgICAgICBzZWMgPSBOVUxMOworICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAorCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisJICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgaWYgKHJfc3ltbmR4ID49IGxvY3N5bWNvdW50CisJICAgICAgfHwgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpCisJCSAgJiYgbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdID09IE5VTEwpKQorCSAgICByID0gYmZkX3JlbG9jX29rOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKKwkJciA9IGJmZF9yZWxvY19vazsKKwkgICAgICBlbHNlCisJCXsKKwkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisKKwkJICAvKiBJdCB3b3VsZCBiZSBsb2dpY2FsIHRvIGFkZCBzeW0tPnN0X3ZhbHVlIGhlcmUsCisJCSAgICAgYnV0IElyaXggNSBzb21ldGltZXMgZ2VuZXJhdGVzIGEgZ2FyYmFnZSBzeW1ib2wKKwkJICAgICB2YWx1ZS4gICovCisJCSAgYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldDsKKworCQkgIC8qIElmIHRoaXMgaXMgSEkxNiBvciBHT1QxNiB3aXRoIGFuIGFzc29jaWF0ZWQgTE8xNiwKKwkJICAgICBhZGp1c3QgdGhlIGFkZGVuZCBhY2NvcmRpbmdseS4gIE90aGVyd2lzZSwganVzdAorCQkgICAgIHJlbG9jYXRlLiAgKi8KKwkJICBpZiAocl90eXBlID09IFJfTUlQU182NCAmJiBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKKwkJICAgIHIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAorCQkJCQkJYWRkZW5kLAorCQkJCQkJY29udGVudHMgKyByZWwtPnJfb2Zmc2V0ICsgNCk7CisJCSAgZWxzZSBpZiAocl90eXBlICE9IFJfTUlQU19ISTE2ICYmIHJfdHlwZSAhPSBSX01JUFNfR09UMTYpCisJCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKKwkJCQkJCWFkZGVuZCwKKwkJCQkJCWNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7CisKKwkJICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBwZXJtaXQgYW4gYXJiaXRyYXJ5CisJCQkgbnVtYmVyIG9mIFJfTUlQU19ISTE2IHJlbG9jcyBiZWZvcmUgdGhlCisJCQkgUl9NSVBTX0xPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQKKwkJCSB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLworCQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU19HT1QxNikKKwkJCWxvcmVsID0gcmVsICsgMTsKKwkJICAgICAgZWxzZQorCQkJeworCQkJICBmb3IgKGxvcmVsID0gcmVsICsgMTsKKwkJCSAgICAgICAobG9yZWwgPCByZWxlbmQKKwkJCQkmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKQorCQkJCSAgICA9PSBSX01JUFNfSEkxNikpOworCQkJICAgICAgIGxvcmVsKyspCisJCQkgICAgOworCQkJfQorCQkgICAgICBpZiAobG9yZWwgPCByZWxlbmQKKwkJCSAgJiYgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX01JUFNfTE8xNikKKwkJCXsKKwkJCSAgbWlwc19lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByZWwsIGxvcmVsLAorCQkJCQkJICBjb250ZW50cywgYWRkZW5kKTsKKwkJCSAgciA9IGJmZF9yZWxvY19vazsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCisJCQkJCQkgICAgYWRkZW5kLAorCQkJCQkJICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZmRfdm1hIHJlbG9jYXRpb247CisJICBib29sZWFuIGxvY2FsOworCSAgYm9vbGVhbiB1bmRlZmluZWRfZXJyb3I7CisKKwkgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKwkgIHVuZGVmaW5lZF9lcnJvciA9IGZhbHNlOworCSAgc3ltID0gTlVMTDsKKwkgIGlmIChyX3N5bW5keCA8IGV4dHN5bW9mZgorCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQorCQkgICYmIGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XSAhPSBOVUxMKSkKKwkgICAgeworCSAgICAgIGxvY2FsID0gdHJ1ZTsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCisJICAgICAgLyogSXQgd291bGQgYmUgbG9naWNhbCB0byBhbHdheXMgYWRkIHN5bS0+c3RfdmFsdWUgaGVyZSwKKwkJIGJ1dCBJcml4IDUgc29tZXRpbWVzIGdlbmVyYXRlcyBhIGdhcmJhZ2Ugc3ltYm9sCisJCSB2YWx1ZS4gICovCisJICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pICE9IFNUVF9TRUNUSU9OKQorCQlyZWxvY2F0aW9uICs9IHN5bS0+c3RfdmFsdWU7CisKKwkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2RkLiAgKi8KKwkgICAgICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2KQorCQkrK3JlbG9jYXRpb247CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGxvbmcgaW5keDsKKworCSAgICAgIGxvY2FsID0gZmFsc2U7CisJICAgICAgaW5keCA9IHJfc3ltbmR4IC0gZXh0c3ltb2ZmOworCSAgICAgIGggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKKwkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICAgICAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9ncF9kaXNwIikgPT0gMCkKKwkJeworCQkgIGlmIChncCA9PSAwKQorCQkgICAgeworCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKKwkJCSAgICAgKGluZm8sCisJCQkgICAgICBfKCJfZ3BfZGlzcCB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKKwkJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KKwkJICAgICAgZ3AgPSA0OworCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOworCQkgICAgICByZWxvY2F0aW9uID0gMDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHNlYyA9IGlucHV0X3NlY3Rpb247CisJCSAgICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisJCQlyZWxvY2F0aW9uID0gKGdwCisJCQkJICAgICAgLSAocmVsLT5yX29mZnNldAorCQkJCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0KSk7CisJCSAgICAgIGVsc2UKKwkJCXJlbG9jYXRpb24gPSBncCAtIHJlbC0+cl9vZmZzZXQ7CisJCSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0xPMTYpCisJCQlyZWxvY2F0aW9uICs9IDQ7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkJeworCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkJICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQorCQkgICAgcmVsb2NhdGlvbiA9IDA7CisJCSAgZWxzZQorCQkgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkJICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCQl9CisJICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCQlyZWxvY2F0aW9uID0gMDsKKwkgICAgICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCisJCXJlbG9jYXRpb24gPSAwOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDX0xJTksiKSA9PSAwKQorCQl7CisJCSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgbGluaywgd2Ugc2hvdWxkIGhhdmUgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgYSBfRFlOQU1JQ19MSU5LIHN5bWJvbCBpbgorICAgICAgICAgICAgICAgICAgICAgbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICBPdGhlcndpc2UsIHdlCisgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZGVmaW5lIHRoZSBzeW1ib2wgd2l0aCBhIHZhbHVlIG9mIDAuCisgICAgICAgICAgICAgICAgICAgICBGSVhNRTogSXQgc2hvdWxkIHByb2JhYmx5IGdldCBpbnRvIHRoZSBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgIHRhYmxlIHNvbWVob3cgYXMgd2VsbC4gICovCisJCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5zaGFyZWQpOworCQkgIEJGRF9BU1NFUlQgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLAorCQkJCQkJICAgICAgICIuZHluYW1pYyIpID09IE5VTEwpOworCQkgIHJlbG9jYXRpb24gPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCisJCQkgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICB1bmRlZmluZWRfZXJyb3IgPSB0cnVlOworCQkgIHJlbG9jYXRpb24gPSAwOworCQl9CisJICAgIH0KKworCSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgb3RoZXIgPSBoLT5vdGhlcjsKKwkgIGVsc2UgaWYgKHN5bSAhPSBOVUxMKQorCSAgICBvdGhlciA9IHN5bS0+c3Rfb3RoZXI7CisJICBlbHNlCisJICAgIG90aGVyID0gMDsKKworCSAgLyogSWYgdGhpcyBmdW5jdGlvbiBoYXMgYW4gZm5fc3R1YiwgdGhlbiBpdCBpcyBhIG1pcHMxNgorCSAgICAgZnVuY3Rpb24gd2hpY2ggbmVlZHMgYSBzdHViIGlmIGl0IGlzIGNhbGxlZCBieSBhIDMyIGJpdAorCSAgICAgZnVuY3Rpb24uICBJZiB0aGlzIHJlbG9jIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSAxNiBiaXQKKwkgICAgIGNhbGwsIHJlZGlyZWN0IHRoZSByZWxvYyB0byB0aGUgc3R1Yi4gIFdlIGRvbid0IHJlZGlyZWN0CisJICAgICByZWxvY3MgZnJvbSBvdGhlciBzdHViIGZ1bmN0aW9ucy4gICovCisJICBpZiAocl90eXBlICE9IFJfTUlQUzE2XzI2CisJICAgICAgJiYgKChtaCAhPSBOVUxMCisJCSAgICYmIG1oLT5mbl9zdHViICE9IE5VTEwpCisJCSAgfHwgKG1oID09IE5VTEwKKwkJICAgICAgJiYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9zdHVicyAhPSBOVUxMCisJCSAgICAgICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnNbcl9zeW1uZHhdICE9IE5VTEwpKQorCSAgICAgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAorCQkJICBGTl9TVFVCLCBzaXplb2YgRk5fU1RVQiAtIDEpICE9IDAKKwkgICAgICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKKwkJCSAgQ0FMTF9TVFVCLCBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgIT0gMAorCSAgICAgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAorCQkJICBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSAhPSAwKQorCSAgICB7CisJICAgICAgaWYgKG1oICE9IE5VTEwpCisJCXsKKwkJICBCRkRfQVNTRVJUIChtaC0+bmVlZF9mbl9zdHViKTsKKwkJICByZWxvY2F0aW9uID0gKG1oLT5mbl9zdHViLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJKyBtaC0+Zm5fc3R1Yi0+b3V0cHV0X29mZnNldCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhc2VjdGlvbiAqZm5fc3R1YjsKKworCQkgIGZuX3N0dWIgPSBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XTsKKwkJICByZWxvY2F0aW9uID0gKGZuX3N0dWItPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkrIGZuX3N0dWItPm91dHB1dF9vZmZzZXQpOworCQl9CisKKwkgICAgICAvKiBSRUxPQ0FUSU9OIG5vdyBwb2ludHMgdG8gMzIgYml0IGNvZGUuICAqLworCSAgICAgIG90aGVyID0gMDsKKwkgICAgfQorCisJICAvKiBJZiB0aGlzIGZ1bmN0aW9uIGhhcyBhIGNhbGxfc3R1YiwgdGhlbiBpdCBpcyBjYWxsZWQgYnkgYQorICAgICAgICAgICAgIG1pcHMxNiBmdW5jdGlvbjsgdGhlIGNhbGwgbmVlZHMgdG8gZ28gdGhyb3VnaCBhIHN0dWIgaWYKKyAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIGEgMzIgYml0IGZ1bmN0aW9uLiAgSWYgdGhpcyByZWxvYyBpcyBhCisgICAgICAgICAgICAgMTYgYml0IGNhbGwsIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBhIDE2IGJpdCBmdW5jdGlvbiwKKyAgICAgICAgICAgICB0aGVuIHJlZGlyZWN0IHRoZSByZWxvYyB0byB0aGUgc3R1Yi4gIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAgICAgIG5lZWQgdG8gd29ycnkgYWJvdXQgY2FsbGluZyB0aGUgZnVuY3Rpb24gdGhyb3VnaCBhCisgICAgICAgICAgICAgZnVuY3Rpb24gcG9pbnRlcjsgc3VjaCBjYWxscyBhcmUgaGFuZGxlZCBieSByb3V0aW5nCisgICAgICAgICAgICAgdGhyb3VnaCBhIHNwZWNpYWwgbWlwczE2IHJvdXRpbmUuICBXZSBkb24ndCBoYXZlIHRvIGNoZWNrCisgICAgICAgICAgICAgd2hldGhlciB0aGlzIGNhbGwgaXMgZnJvbSBhIHN0dWI7IGl0IGNhbid0IGJlLCBiZWNhdXNlIGEKKyAgICAgICAgICAgICBzdHViIGNvbnRhaW5zIDMyIGJpdCBjb2RlLCBhbmQgaGVuY2UgY2FuIG5vdCBoYXZlIGEgMTYKKyAgICAgICAgICAgICBiaXQgcmVsb2MuICAqLworCSAgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNgorCSAgICAgICYmIG1oICE9IE5VTEwKKwkgICAgICAmJiAobWgtPmNhbGxfc3R1YiAhPSBOVUxMIHx8IG1oLT5jYWxsX2ZwX3N0dWIgIT0gTlVMTCkKKwkgICAgICAmJiBvdGhlciAhPSBTVE9fTUlQUzE2KQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnN0dWI7CisKKwkgICAgICAvKiBJZiBib3RoIGNhbGxfc3R1YiBhbmQgY2FsbF9mcF9zdHViIGFyZSBkZWZpbmVkLCB3ZQorICAgICAgICAgICAgICAgICBjYW4gZmlndXJlIG91dCB3aGljaCBvbmUgdG8gdXNlIGJ5IHNlZWluZyB3aGljaCBvbmUKKyAgICAgICAgICAgICAgICAgYXBwZWFycyBpbiB0aGUgaW5wdXQgZmlsZS4gICovCisJICAgICAgaWYgKG1oLT5jYWxsX3N0dWIgIT0gTlVMTCAmJiBtaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwpCisJCXsKKwkJICBhc2VjdGlvbiAqbzsKKworCQkgIHN0dWIgPSBOVUxMOworCQkgIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJCSAgICB7CisJCSAgICAgIGlmIChzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBvKSwKKwkJCQkgICBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQorCQkJeworCQkJICBzdHViID0gbWgtPmNhbGxfZnBfc3R1YjsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgaWYgKHN0dWIgPT0gTlVMTCkKKwkJICAgIHN0dWIgPSBtaC0+Y2FsbF9zdHViOworCQl9CisJICAgICAgZWxzZSBpZiAobWgtPmNhbGxfc3R1YiAhPSBOVUxMKQorCQlzdHViID0gbWgtPmNhbGxfc3R1YjsKKwkgICAgICBlbHNlCisJCXN0dWIgPSBtaC0+Y2FsbF9mcF9zdHViOworCisJICAgICAgQkZEX0FTU0VSVCAoc3R1Yi0+X3Jhd19zaXplID4gMCk7CisJICAgICAgcmVsb2NhdGlvbiA9IHN0dWItPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzdHViLT5vdXRwdXRfb2Zmc2V0OworCSAgICB9CisKKwkgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0hJMTYpCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7CisKKwkgICAgICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIHBlcm1pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisJCSBSX01JUFNfSEkxNiByZWxvY3MgYmVmb3JlIHRoZSBSX01JUFNfTE8xNiByZWxvYy4KKwkJIFRoaXMgcGVybWl0cyBnY2MgdG8gZW1pdCB0aGUgSEkgYW5kIExPIHJlbG9jcyBpdHNlbGYuICAqLworCSAgICAgIGZvciAobG9yZWwgPSByZWwgKyAxOworCQkgICAobG9yZWwgPCByZWxlbmQKKwkJICAgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NSVBTX0hJMTYpOworCQkgICBsb3JlbCsrKQorCQk7CisJICAgICAgaWYgKGxvcmVsIDwgcmVsZW5kCisJCSAgJiYgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX01JUFNfTE8xNikKKwkJeworCQkgIG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcmVsLCBsb3JlbCwKKwkJCQkJICBjb250ZW50cywgcmVsb2NhdGlvbiArIGFkZGVuZCk7CisJCSAgciA9IGJmZF9yZWxvY19vazsKKwkJfQorCSAgICAgIGVsc2UKKwkJciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisJCQkJCSAgICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfR09UMTYgJiYgbG9jYWwpCisJICAgIHsKKwkgICAgICAvKiBHT1QxNiBtdXN0IGFsc28gaGF2ZSBhbiBhc3NvY2lhdGVkIExPMTYgaW4gdGhlIGxvY2FsCisJCSBjYXNlLiAgSW4gdGhpcyBjYXNlLCB0aGUgYWRkZW5kIGlzIGV4dHJhY3RlZCBhbmQgdGhlCisJCSBzZWN0aW9uIGluIHdoaWNoIHRoZSByZWZlcmVuY2VkIG9iamVjdCBpcyBkZXRlcm1pbmVkLgorCQkgVGhlbiB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IGlzIGNvbXB1dGVkIGFuZAorCQkgdGhlIEdPVCBlbnRyeSBmb3IgdGhlIGhpcGFnZSAoYW4gYWxpZ25lZCA2NGtiIGNodW5rKQorCQkgaXMgYWRkZWQgdG8gLmdvdCBzZWN0aW9uIGlmIG5lZWRlZC4gIFRoZSBvZmZzZXQgZmllbGQKKwkJIG9mIHRoZSBHT1QxNi1yZWxvY2F0ZWQgaW5zdHJ1Y3Rpb24gaXMgcmVwbGFjZWQgYnkgdGhlCisJCSBpbmRleCBvZiB0aGlzIEdPVCBlbnRyeSBmb3IgdGhlIGhpcGFnZS4gICovCisJICAgICAgaWYgKChyZWwgKyAxKSA8IHJlbGVuZAorCQkgICYmIEVMRjMyX1JfVFlQRSAoKHJlbCArIDEpLT5yX2luZm8pID09IFJfTUlQU19MTzE2KQorCQl7CisJCSAgaWYgKCEgbWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsCisJCQkJCQkgICAgIHNnb3QsIHJlbCwgcmVsICsgMSwKKwkJCQkJCSAgICAgY29udGVudHMsCisJCQkJCQkgICAgIHJlbG9jYXRpb24gKyBhZGRlbmQpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIHIgPSBiZmRfcmVsb2Nfb2s7CisJCX0KKwkgICAgICBlbHNlCisJCXIgPSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKwkgICAgfQorCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQU19DQUxMMTYKKwkJICAgfHwgcl90eXBlID09IFJfTUlQU19HT1QxNgorCQkgICB8fCByX3R5cGUgPT0gUl9NSVBTX0NBTExfTE8xNgorCQkgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9MTzE2KQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBvZmZzZXQ7CisKKwkgICAgICAvKiBUaGlzIHN5bWJvbCBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSBnbG9iYWwgc3ltYm9sCisJCSBoYXZpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZ290IGVudHJ5LiAgKi8KKwkgICAgICBCRkRfQVNTRVJUIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSk7CisKKwkgICAgICBvZmZzZXQgPSAoaC0+ZHluaW5keCAtIGctPmdsb2JhbF9nb3RzeW0gKyBnLT5sb2NhbF9nb3RubykgKiA0OworCSAgICAgIEJGRF9BU1NFUlQgKGctPmxvY2FsX2dvdG5vIDw9IG9mZnNldAorCQkJICAmJiBvZmZzZXQgPCBzZ290LT5fcmF3X3NpemUpOworCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBhZGRlbmQsCisJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2Zmc2V0KTsKKwkgICAgICBvZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJCSsgb2Zmc2V0IC0gZ3ApOworCSAgICAgIG1pcHNfZWxmX3JlbG9jYXRlX2dsb2JhbF9nb3QgKGlucHV0X2JmZCwgcmVsLCBjb250ZW50cywKKwkJCQkJICAgIG9mZnNldCk7CisJICAgICAgciA9IGJmZF9yZWxvY19vazsKKwkgICAgfQorCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQU19DQUxMX0hJMTYKKwkJICAgfHwgcl90eXBlID09IFJfTUlQU19HT1RfSEkxNikKKwkgICAgeworCSAgICAgIGJmZF92bWEgb2Zmc2V0OworCisJICAgICAgLyogVGhpcyBtdXN0IGJlIGEgZ2xvYmFsIHN5bWJvbCB3aXRoIGEgZ290IGVudHJ5LiAgVGhlCisgICAgICAgICAgICAgICAgIG5leHQgcmVsb2MgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZyBMTzE2IHJlbG9jLiAgKi8KKwkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpOworCSAgICAgIEJGRF9BU1NFUlQgKChyZWwgKyAxKSA8IHJlbGVuZCk7CisJICAgICAgQkZEX0FTU0VSVCAoKGludCkgRUxGMzJfUl9UWVBFICgocmVsICsgMSktPnJfaW5mbykKKwkJCSAgPT0gKHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9ISTE2CisJCQkgICAgICA/IChpbnQpIFJfTUlQU19DQUxMX0xPMTYKKwkJCSAgICAgIDogKGludCkgUl9NSVBTX0dPVF9MTzE2KSk7CisKKwkgICAgICBvZmZzZXQgPSAoaC0+ZHluaW5keCAtIGctPmdsb2JhbF9nb3RzeW0gKyBnLT5sb2NhbF9nb3RubykgKiA0OworCSAgICAgIEJGRF9BU1NFUlQgKGctPmxvY2FsX2dvdG5vIDw9IG9mZnNldAorCQkJICAmJiBvZmZzZXQgPCBzZ290LT5fcmF3X3NpemUpOworCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBhZGRlbmQsCisJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2Zmc2V0KTsKKwkgICAgICBvZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJCSsgb2Zmc2V0IC0gZ3ApOworCSAgICAgIG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcmVsLCByZWwgKyAxLCBjb250ZW50cywKKwkJCQkgICAgICBvZmZzZXQpOworCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7CisJICAgIH0KKwkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfUkVMMzIKKwkJICAgfHwgcl90eXBlID09IFJfTUlQU18zMikKKwkgICAgeworCSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOworCSAgICAgIEVsZjMyX2NyaW5mbyBjcHRyZWw7CisJICAgICAgYmZkX2J5dGUgKmNyOworCisJICAgICAgaWYgKChpbmZvLT5zaGFyZWQKKwkJICAgfHwgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJCSAgICAgICAmJiBoICE9IE5VTEwKKwkJICAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpCisJCQkgICA9PSAwKSkpCisJCSAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCQl7CisJCSAgYm9vbGVhbiBza2lwOworCisJCSAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UKKwkJICAgICByZWxvY2F0aW9ucyBhcmUgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlCisJCSAgICAgcmVzb2x2ZWQgYXQgcnVuIHRpbWUuICAqLworCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZHluIik7CisJCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKKwkJICAgIH0KKworCQkgIHNraXAgPSBmYWxzZTsKKworCQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvID09IE5VTEwpCisJCSAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYmZkX3ZtYSBvZmY7CisKKwkJICAgICAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAorCQkJICAgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAorCQkJICAgICAgaW5wdXRfc2VjdGlvbiwKKwkJCSAgICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAorCQkJICAgICAgcmVsLT5yX29mZnNldCkpOworCQkgICAgICBpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKKwkJCXNraXAgPSB0cnVlOworCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7CisJCSAgICB9CisKKwkJICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJCSAgYWRkZW5kID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCisJCSAgaWYgKHNraXApCisJCSAgICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOworCQkgIGVsc2UgaWYgKGggIT0gTlVMTAorCQkJICAgJiYgKCEgaW5mby0+c3ltYm9saWMKKwkJCSAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJCSAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCisJCSAgICB7CisJCSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOworCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX01JUFNfUkVMMzIpOworCQkgICAgICBzZWMgPSBpbnB1dF9zZWN0aW9uOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgbG9uZyBpbmR4OworCisJCSAgICAgIGlmIChoID09IE5VTEwpCisJCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKKwkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKKwkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkJfQorCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQorCQkJaW5keCA9IDA7CisJCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKKwkJCXsKKwkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCQkgIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBhc2VjdGlvbiAqb3NlYzsKKworCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKKwkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OworCQkJICBpZiAoaW5keCA9PSAwKQorCQkJICAgIGFib3J0ICgpOworCQkJfQorCisJCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGluZHgsIFJfTUlQU19SRUwzMik7CisJCSAgICAgIGFkZGVuZCArPSByZWxvY2F0aW9uOworCQkgICAgfQorCisJCSAgaWYgKCEgc2tpcCkKKwkJICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGFkZGVuZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKworCQkgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKKwkJCQkJICAgICAoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKKwkJCQkJICAgICAgIHNyZWxvYy0+Y29udGVudHMpCisJCQkJCSAgICAgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOworCQkgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKKworCQkgIGlmICghIHNraXAgJiYgU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCisJCSAgICB7CisJCSAgICAgIGlmIChzY3B0ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkgICAgICAvKiBNYWtlIGFuIGVudHJ5IG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvLiAgKi8KKwkJICAgICAgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCAoY3B0cmVsLCBDUkZfTUlQU19MT05HKTsKKwkJICAgICAgY3B0cmVsLnZhZGRyID0gKHJlbC0+cl9vZmZzZXQKKwkJCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU19SRUwzMikKKwkJCW1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1JFTDMyKTsKKwkJICAgICAgZWxzZQorCQkJbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfV09SRCk7CisJCSAgICAgIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvIChjcHRyZWwsIDApOworCQkgICAgICBjcHRyZWwua29uc3QgPSBhZGRlbmQ7CisKKwkJICAgICAgY3IgPSAoc2NwdC0+Y29udGVudHMKKwkJCSAgICArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpKTsKKwkJICAgICAgYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dCAob3V0cHV0X2JmZCwgJmNwdHJlbCwKKwkJCQkJCSAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgorCQkJCQkJICArIHNjcHQtPnJlbG9jX2NvdW50KSk7CisJCSAgICAgICsrc2NwdC0+cmVsb2NfY291bnQ7CisJCSAgICB9CisKKwkJICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28KKwkJICAgICB0aGVyZSdzIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LiAgKi8KKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGVsc2UKKwkJciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJICAgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisJCQkJCSAgICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQpCisJICAgIHsKKwkgICAgICBiZmRfc2l6ZV90eXBlIGFkZHI7CisJICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CisKKwkgICAgICAvKiBEbyBhIDMyIGJpdCByZWxvY2F0aW9uLCBhbmQgc2lnbiBleHRlbmQgdG8gNjQgYml0cy4gICovCisJICAgICAgYWRkciA9IHJlbC0+cl9vZmZzZXQ7CisJICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQorCQlhZGRyICs9IDQ7CisJICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJICAgIGNvbnRlbnRzLCBhZGRyLCByZWxvY2F0aW9uLAorCQkJCQkgICAgYWRkZW5kKTsKKwkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgYWRkcik7CisJICAgICAgaWYgKCh2YWwgJiAweDgwMDAwMDAwKSAhPSAwKQorCQl2YWwgPSAweGZmZmZmZmZmOworCSAgICAgIGVsc2UKKwkJdmFsID0gMDsKKwkgICAgICBhZGRyID0gcmVsLT5yX29mZnNldDsKKwkgICAgICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCisJCWFkZHIgKz0gNDsKKwkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbCwgY29udGVudHMgKyBhZGRyKTsKKwkgICAgfQorCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQU18yNiAmJiBvdGhlciA9PSBTVE9fTUlQUzE2KQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworCisJICAgICAgLyogVGhpcyBpcyBhIGp1bXAgdG8gYSBtaXBzMTYgcm91dGluZSBmcm9tIGEgbWlwczMyCisgICAgICAgICAgICAgICAgIHJvdXRpbmUuICBXZSBuZWVkIHRvIGNoYW5nZSBqYWwgaW50byBqYWx4LiAgKi8KKwkgICAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCSAgICAgIGlmICgoKGluc24gPj4gMjYpICYgMHgzZikgIT0gMHgzCisJCSAgJiYgKChpbnNuID4+IDI2KSAmIDB4M2YpICE9IDB4MWQpCisJCXsKKwkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJICAgIChfKCIlczogJXMrMHglbHg6IGp1bXAgdG8gbWlwczE2IHJvdXRpbmUgd2hpY2ggaXMgbm90IGphbCIpLAorCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJCSAgICAgaW5wdXRfc2VjdGlvbi0+bmFtZSwKKwkJICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX29mZnNldCk7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgICAgaW5zbiA9IChpbnNuICYgMHgzZmZmZmZmKSB8ICgweDFkIDw8IDI2KTsKKwkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAorCQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKKwkgICAgfQorCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2XzI2KQorCSAgICB7CisJICAgICAgLyogSXQncyBlYXNpZXN0IHRvIGRvIHRoZSBub3JtYWwgcmVsb2NhdGlvbiwgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAgZGlnIG91dCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHN3YXAgdGhlIGZpcnN0IHdvcmQgdGhlCisgICAgICAgICAgICAgICAgIHdheSB0aGUgbWlwczE2IGV4cGVjdHMgaXQuICBJZiB0aGlzIGlzIGxpdHRsZSBlbmRpYW4sCisgICAgICAgICAgICAgICAgIHRob3VnaCwgd2UgbmVlZCB0byBzd2FwIHRoZSB0d28gd29yZHMgZmlyc3QsIGFuZCB0aGVuCisgICAgICAgICAgICAgICAgIHN3YXAgdGhlbSBiYWNrIGFnYWluIGxhdGVyLCBzbyB0aGF0IHRoZSBhZGRyZXNzIGxvb2tzCisgICAgICAgICAgICAgICAgIHJpZ2h0LiAgKi8KKworCSAgICAgIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSkKKwkJeworCQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKworCQkgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJCSAgaW5zbiA9ICgoaW5zbiA+PiAxNikgJiAweGZmZmYpIHwgKChpbnNuICYgMHhmZmZmKSA8PCAxNik7CisJCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCQl9CisKKwkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisJCQkJCSAgICByZWxvY2F0aW9uLCBhZGRlbmQpOworCSAgICAgIGlmIChyID09IGJmZF9yZWxvY19vaykKKwkJeworCQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKworCQkgIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoaW5wdXRfYmZkKSkKKwkJICAgIHsKKwkJICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKwkJICAgICAgaW5zbiA9ICgoaW5zbiA+PiAxNikgJiAweGZmZmYpIHwgKChpbnNuICYgMHhmZmZmKSA8PCAxNik7CisJCSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKwkJICAgIH0KKworCQkgIGluc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJCSAgaW5zbiA9ICgoaW5zbiAmIDB4ZmMwMCkKKwkJCSAgfCAoKGluc24gJiAweDFmKSA8PCA1KQorCQkJICB8ICgoaW5zbiAmIDB4M2UwKSA+PiA1KSk7CisJCSAgLyogSWYgdGhpcyBpcyBhIGp1bXAgdG8gYSAzMiBiaXQgcm91dGluZSwgdGhlbiBtYWtlCisJCSAgICAgaXQgamFseC4gICovCisJCSAgaWYgKG90aGVyICE9IFNUT19NSVBTMTYpCisJCSAgICBpbnNuIHw9IDB4NDAwOworCQkgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfR1BSRUwpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBzaG9ydCBleHRlbmQsIGluc247CisJICAgICAgYmZkX2J5dGUgYnVmWzRdOworCSAgICAgIHVuc2lnbmVkIGxvbmcgZmluYWw7CisKKwkgICAgICAvKiBFeHRyYWN0IHRoZSBhZGRlbmQgaW50byBidWYsIHJ1biB0aGUgcmVndWxhciByZWxvYywKKyAgICAgICAgICAgICAgICAgYW5kIHN0dWZmIHRoZSByZXN1bHRpbmcgdmFsdWUgYmFjayBpbnRvIHRoZQorICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMuICAqLworCSAgICAgIGlmIChyZWwtPnJfb2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQorCQlyID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisJICAgICAgZWxzZQorCQl7CisJCSAgZXh0ZW5kID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCQkgIGluc24gPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDIpOworCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKKwkJCSAgICAgICgoKGV4dGVuZCAmIDB4MWYpIDw8IDExKQorCQkJICAgICAgIHwgKGV4dGVuZCAmIDB4N2UwKQorCQkJICAgICAgIHwgKGluc24gJiAweDFmKSksCisJCQkgICAgICBidWYpOworCQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsCisJCQkJCQlpbnB1dF9zZWN0aW9uLCBidWYsCisJCQkJCQkoYmZkX3ZtYSkgMCwgcmVsb2NhdGlvbiwKKwkJCQkJCWFkZGVuZCk7CisJCSAgZmluYWwgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGJ1Zik7CisJCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLAorCQkJICAgICAgKChleHRlbmQgJiAweGY4MDApCisJCQkgICAgICAgfCAoKGZpbmFsID4+IDExKSAmIDB4MWYpCisJCQkgICAgICAgfCAoZmluYWwgJiAweDdlMCkpLAorCQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKwkJICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsCisJCQkgICAgICAoKGluc24gJiAweGZmZTApCisJCQkgICAgICAgfCAoZmluYWwgJiAweDFmKSksCisJCQkgICAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgKyAyKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkJCSAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisJCQkJCSAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKKworCSAgLyogVGhlIGphbCBpbnN0cnVjdGlvbiBjYW4gb25seSBqdW1wIHRvIGFuIGFkZHJlc3Mgd2hpY2ggaXMKKyAgICAgICAgICAgICBkaXZpc2libGUgYnkgNCwgYW5kIGl0IGNhbiBvbmx5IGp1bXAgdG8gYW4gYWRkcmVzcyB3aXRoCisgICAgICAgICAgICAgdGhlIHNhbWUgdXBwZXIgNCBiaXRzIGFzIHRoZSBQQy4gICovCisJICBpZiAociA9PSBiZmRfcmVsb2Nfb2sKKwkgICAgICAmJiAocl90eXBlID09IFJfTUlQUzE2XzI2IHx8IHJfdHlwZSA9PSBSX01JUFNfMjYpKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBhZGRyOworICAgICAgICAgICAgICBiZmRfdm1hIHBjOworICAgICAgICAgICAgICBiZmRfdm1hIHRhcmdldDsKKworICAgICAgICAgICAgICBwYyA9ICgoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICArIHJlbC0+cl9vZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICYgMHhmMDAwMDAwMCk7CisgICAgICAgICAgICAgIHRhcmdldCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KQorCQkJJiAoaG93dG8tPmRzdF9tYXNrKTsKKyAgICAgICAgICAgICAgYWRkciA9ICh0YXJnZXQgPDwgMikgKyBwYzsKKwkgICAgICBpZiAob3RoZXIgPT0gU1RPX01JUFMxNikKKwkJYWRkciAmPSB+IChiZmRfdm1hKSAxOworCSAgICAgIGlmICgoYWRkciAmIDMpICE9IDAKKwkJICB8fCAoKGFkZHIgJiAweGYwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICE9IHBjKSkKKwkJciA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKwkgICAgfQorCisJICAvKiBEb24ndCBib3RoZXIgdG8gcmVwb3J0IGEgcmVsb2NhdGlvbiBvdmVyZmxvdyBmb3IgYSBjYWxsCisgICAgICAgICAgICAgdG8gYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wgd2l0aCBhIHZhbHVlIG9mIHplcm8uICBUaGlzCisgICAgICAgICAgICAgcGVybWl0cyB1cyB0byB1c2UKKwkgICAgICAgICBpZiAoIWYpIGYoKTsKKwkgICAgIGV2ZW4gaWYgd2UgYXJlbid0IGluIHJhbmdlIHRvIGNhbGwgYWRkcmVzcyB6ZXJvLiAgKi8KKwkgIGlmIChyID09IGJmZF9yZWxvY19vdmVyZmxvdworCSAgICAgICYmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYgfHwgcl90eXBlID09IFJfTUlQU18yNikKKwkgICAgICAmJiByZWxvY2F0aW9uICsgYWRkZW5kID09IDAKKwkgICAgICAmJiBoICE9IE5VTEwKKwkgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAgIHIgPSBiZmRfcmVsb2Nfb2s7CisKKwkgIC8qIElmIHdlJ3ZlIGFscmVhZHkgaXNzdWVkIGFuIGVycm9yIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sLAorICAgICAgICAgICAgIGRvbid0IGlzc3VlIGFub3RoZXIgdXNlbGVzcyBlcnJvci4gICovCisJICBpZiAodW5kZWZpbmVkX2Vycm9yCisJICAgICAgJiYgKHIgPT0gYmZkX3JlbG9jX3VuZGVmaW5lZCB8fCByID09IGJmZF9yZWxvY19vdmVyZmxvdykpCisJICAgIHIgPSBiZmRfcmVsb2Nfb2s7CisKKwkgIGlmIChTR0lfQ09NUEFUIChhYmZkKQorCSAgICAgICYmIHNjcHQgIT0gTlVMTAorCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkgICAgeworCSAgICAgIEVsZjMyX2NyaW5mbyBjcHRyZWw7CisJICAgICAgYmZkX2J5dGUgKmNyOworCisJICAgICAgLyogTWFrZSBhbiBlbnRyeSBvZiBjb21wYWN0IHJlbG9jYXRpb24gaW5mby4gICovCisJICAgICAgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCAoY3B0cmVsLCBDUkZfTUlQU19MT05HKTsKKwkgICAgICBjcHRyZWwudmFkZHIgPSAocmVsLT5yX29mZnNldAorCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJICAgICAgc3dpdGNoIChyX3R5cGUpCisJCXsKKwkJY2FzZSBSX01JUFNfMjY6CisJCSAgbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfSk1QQUQpOworCQkgIC8qIFhYWCBIb3cgc2hvdWxkIHdlIHNldCBkaXN0MnRvIGluIHRoaXMgY2FzZS4gKi8KKwkJICBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byAoY3B0cmVsLCA4KTsKKwkJICBjcHRyZWwua29uc3QgPSBhZGRlbmQgKyByZWxvY2F0aW9uOworCQkgIGNyID0gc2NwdC0+Y29udGVudHMgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKKwkJICBiZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChvdXRwdXRfYmZkLCAmY3B0cmVsLAorCQkJCQkgICAgICgoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvICopIGNyCisJCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKKwkJICArK3NjcHQtPnJlbG9jX2NvdW50OworCQkgIGJyZWFrOworCisJCWNhc2UgUl9NSVBTX0dQUkVMMTY6CisJCWNhc2UgUl9NSVBTX0xJVEVSQUw6CisJCWNhc2UgUl9NSVBTX0dQUkVMMzI6CisJCSAgbWlwc19lbGZfc2V0X2NyX3R5cGUgKGNwdHJlbCwgQ1JUX01JUFNfR1BISV9MTyk7CisJCSAgY3B0cmVsLmtvbnN0ID0gZ3AgLSBjcHRyZWwudmFkZHI7CisJCSAgbWlwc19lbGZfc2V0X2NyX2Rpc3QydG8gKGNwdHJlbCwgNCk7CisJCSAgY3IgPSBzY3B0LT5jb250ZW50cyArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY29tcGFjdF9yZWwpOworCQkgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCisJCQkJCSAgICAgKChFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikgY3IKKwkJCQkJICAgICAgKyBzY3B0LT5yZWxvY19jb3VudCkpOworCQkgICsrc2NwdC0+cmVsb2NfY291bnQ7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgc3dpdGNoIChyKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAgICAgYWJvcnQgKCk7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlpZiAoaCAhPSBOVUxMKQorCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCQllbHNlCisJCSAgeworCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKKwkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKKwkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKKwkJICAgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQorCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCQkgIH0KKwkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBob29rIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGxpbmtlciB3cml0ZXMgb3V0IGEgZ2xvYmFsCisgICBzeW1ib2wuICBXZSBtYXJrIHN5bWJvbHMgYXMgc21hbGwgY29tbW9uIGlmIGFwcHJvcHJpYXRlLiAgVGhpcyBpcworICAgYWxzbyB3aGVyZSB3ZSB1bmRvIHRoZSBpbmNyZW1lbnQgb2YgdGhlIHZhbHVlIGZvciBhIG1pcHMxNiBzeW1ib2wuICAqLworCisvKkFSR1NJR05PUkVEKi8KK3N0YXRpYyBib29sZWFuCittaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgbmFtZSwgc3ltLCBpbnB1dF9zZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlYzsKK3sKKyAgLyogSWYgd2Ugc2VlIGEgY29tbW9uIHN5bWJvbCwgd2hpY2ggaW1wbGllcyBhIHJlbG9jYXRhYmxlIGxpbmssIHRoZW4KKyAgICAgaWYgYSBzeW1ib2wgd2FzIHNtYWxsIGNvbW1vbiBpbiBhbiBpbnB1dCBmaWxlLCBtYXJrIGl0IGFzIHNtYWxsCisgICAgIGNvbW1vbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCisgICAgICAmJiBzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi5zY29tbW9uIikgPT0gMCkKKyAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfU0NPTU1PTjsKKworICBpZiAoc3ltLT5zdF9vdGhlciA9PSBTVE9fTUlQUzE2CisgICAgICAmJiAoc3ltLT5zdF92YWx1ZSAmIDEpICE9IDApCisgICAgLS1zeW0tPnN0X3ZhbHVlOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogRnVuY3Rpb25zIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLworCisvKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCisgICBzZWN0aW9uLiAgKi8KKworI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGliYy5zby4xIgorCisvKiBDcmVhdGUgZHluYW1pYyBzZWN0aW9ucyB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOworICBjb25zdCBjaGFyICogY29uc3QgKm5hbWVwOworCisgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKKwkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCB8IFNFQ19SRUFET05MWSk7CisKKyAgLyogTWlwcyBBQkkgcmVxdWVzdHMgdGhlIC5keW5hbWljIHNlY3Rpb24gdG8gYmUgcmVhZCBvbmx5LiAgKi8KKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKKyAgaWYgKHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5nb3Qgc2VjdGlvbi4gICovCisgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIENyZWF0ZSAuc3R1YiBzZWN0aW9uLiAgKi8KKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0dWIiKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnN0dWIiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKKyAgICAgICYmICFpbmZvLT5zaGFyZWQKKyAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJsZF9tYXAiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyAmIH5TRUNfUkVBRE9OTFkpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQorICAgIHsKKyAgICAgIGZvciAobmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzOyAqbmFtZXAgIT0gTlVMTDsgbmFtZXArKykKKwl7CisJICBoID0gTlVMTDsKKwkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAorCQkgKGluZm8sIGFiZmQsICpuYW1lcCwgQlNGX0dMT0JBTCwgYmZkX3VuZF9zZWN0aW9uX3B0ciwKKwkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCisJCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAorCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKKwkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKKwkgIGgtPnR5cGUgPSBTVFRfU0VDVElPTjsKKworCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSAuY29tcGFjdF9yZWwgc2VjdGlvbi4gICovCisgICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiAoYWJmZCwgaW5mbykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBDaGFuZ2UgYWxpZ21lbnRzIG9mIHNvbWUgc2VjdGlvbnMuICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmhhc2giKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7CisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7CisgICAgICBpZiAocyAhPSBOVUxMKQorCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOworICAgICAgaWYgKHMgIT0gTlVMTCkKKwliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7CisgICAgICBpZiAocyAhPSBOVUxMKQorCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7CisgICAgfQorCisgIGlmICghaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIGggPSBOVUxMOworICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJICAgICAoaW5mbywgYWJmZCwgIl9EWU5BTUlDX0xJTksiLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAorCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKKwkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCisJICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7CisgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisgICAgICBoLT50eXBlID0gU1RUX1NFQ1RJT047CisKKyAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZCkKKwl7CisJICAvKiBfX3JsZF9tYXAgaXMgYSBmb3VyIGJ5dGUgd29yZCBsb2NhdGVkIGluIHRoZSAuZGF0YSBzZWN0aW9uCisJICAgICBhbmQgaXMgZmlsbGVkIGluIGJ5IHRoZSBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvCisJICAgICB0aGUgX3JfZGVidWcgc3RydWN0dXJlLiBJdHMgc3ltYm9sIHZhbHVlIHdpbGwgYmUgc2V0IGluCisJICAgICBtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wuICAqLworCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKTsKKwkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKwkgIGggPSBOVUxMOworCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJCSAoaW5mbywgYWJmZCwgIl9fcmxkX21hcCIsIEJTRl9HTE9CQUwsIHMsCisJCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAorCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKKwkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7CisJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisJICBoLT50eXBlID0gU1RUX09CSkVDVDsKKworCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENyZWF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGZsYWd3b3JkIGZsYWdzOworICByZWdpc3RlciBhc2VjdGlvbiAqczsKKworICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuY29tcGFjdF9yZWwiKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVECisJICAgICAgIHwgU0VDX1JFQURPTkxZKTsKKworICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuY29tcGFjdF9yZWwiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBzLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uIHRvIGhvbGQgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGZsYWd3b3JkIGZsYWdzOworICByZWdpc3RlciBhc2VjdGlvbiAqczsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOworCisgIC8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gICovCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKSAhPSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKKwkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisKKyAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCisgICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlCisgICAgIGFyZSBub3QgY3JlYXRpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgaCA9IE5VTEw7CisgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAorCSAoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCisJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCisJICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCisJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOworICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworCisgIGlmIChpbmZvLT5zaGFyZWQKKyAgICAgICYmICEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIGZpcnN0IHNldmVyYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFyZSByZXNlcnZlZC4gICovCisgIHMtPl9yYXdfc2l6ZSA9IE1JUFNfUkVTRVJWRURfR09UTk8gKiA0OworCisgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgIHNpemVvZiAoc3RydWN0IG1pcHNfZ290X2luZm8pKTsKKyAgaWYgKGcgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGctPmdsb2JhbF9nb3RzeW0gPSAwOworICBnLT5sb2NhbF9nb3RubyA9IE1JUFNfUkVTRVJWRURfR09UTk87CisgIGctPmFzc2lnbmVkX2dvdG5vID0gTUlQU19SRVNFUlZFRF9HT1ROTzsKKyAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpID09IE5VTEwpCisgICAgeworICAgICAgcy0+dXNlZF9ieV9iZmQgPQorCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKSk7CisgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocykgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGEgPSAoUFRSKSBnOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAorICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgYmZkICpkeW5vYmo7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7CisgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOworICBzaXplX3QgZXh0c3ltb2ZmOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKKyAgYXNlY3Rpb24gKnNnb3Q7CisgIGFzZWN0aW9uICpzcmVsb2M7CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBleHRzeW1vZmYgPSAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKSA/IDAgOiBzeW10YWJfaGRyLT5zaF9pbmZvOworCisgIC8qIENoZWNrIGZvciB0aGUgbWlwczE2IHN0dWIgc2VjdGlvbnMuICAqLworCisgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKKyAgaWYgKHN0cm5jbXAgKG5hbWUsIEZOX1NUVUIsIHNpemVvZiBGTl9TVFVCIC0gMSkgPT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworCisgICAgICAvKiBMb29rIGF0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hpY2ggc3ltYm9sCisgICAgICAgICB0aGlzIGlzIGZvci4gICovCisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jcy0+cl9pbmZvKTsKKworICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmCisJICB8fCBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSA9PSBOVUxMKQorCXsKKwkgIGFzZWN0aW9uICpvOworCisJICAvKiBUaGlzIHN0dWIgaXMgZm9yIGEgbG9jYWwgc3ltYm9sLiAgVGhpcyBzdHViIHdpbGwgb25seSBiZQorICAgICAgICAgICAgIG5lZWRlZCBpZiB0aGVyZSBpcyBzb21lIHJlbG9jYXRpb24gaW4gdGhpcyBCRkQsIG90aGVyCisgICAgICAgICAgICAgdGhhbiBhIDE2IGJpdCBmdW5jdGlvbiBjYWxsLCB3aGljaCByZWZlcnMgdG8gdGhpcyBzeW1ib2wuICAqLworCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqc2VjX3JlbG9jczsKKwkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqciwgKnJlbmQ7CisKKwkgICAgICAvKiBXZSBjYW4gaWdub3JlIHN0dWIgc2VjdGlvbnMgd2hlbiBsb29raW5nIGZvciByZWxvY3MuICAqLworCSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKKwkJICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCisJCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBGTl9TVFVCLAorCQkJICAgICAgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwCisJCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBDQUxMX1NUVUIsCisJCQkgICAgICBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgPT0gMAorCQkgIHx8IHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgQ0FMTF9GUF9TVFVCLAorCQkJICAgICAgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpID09IDApCisJCWNvbnRpbnVlOworCisJICAgICAgc2VjX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKKwkJCSAgICAoYWJmZCwgbywgKFBUUikgTlVMTCwKKwkJCSAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCisJCQkgICAgIGluZm8tPmtlZXBfbWVtb3J5KSk7CisJICAgICAgaWYgKHNlY19yZWxvY3MgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgcmVuZCA9IHNlY19yZWxvY3MgKyBvLT5yZWxvY19jb3VudDsKKwkgICAgICBmb3IgKHIgPSBzZWNfcmVsb2NzOyByIDwgcmVuZDsgcisrKQorCQlpZiAoRUxGMzJfUl9TWU0gKHItPnJfaW5mbykgPT0gcl9zeW1uZHgKKwkJICAgICYmIEVMRjMyX1JfVFlQRSAoci0+cl9pbmZvKSAhPSBSX01JUFMxNl8yNikKKwkJICBicmVhazsKKworCSAgICAgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQorCQlmcmVlIChzZWNfcmVsb2NzKTsKKworCSAgICAgIGlmIChyIDwgcmVuZCkKKwkJYnJlYWs7CisJICAgIH0KKworCSAgaWYgKG8gPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoZXJlIGlzIG5vIG5vbi1jYWxsIHJlbG9jIGZvciB0aGlzIHN0dWIsIHNvIHdlIGRvCisgICAgICAgICAgICAgICAgIG5vdCBuZWVkIGl0LiAgU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMsIHdlCisgICAgICAgICAgICAgICAgIGNhbiBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZSBTRUNfRVhDTFVERQorICAgICAgICAgICAgICAgICBmbGFnLiAgKi8KKwkgICAgICBzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisKKwkgIC8qIFJlY29yZCB0aGlzIHN0dWIgaW4gYW4gYXJyYXkgb2YgbG9jYWwgc3ltYm9sIHN0dWJzIGZvcgorICAgICAgICAgICAgIHRoaXMgQkZELiAqLworCSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzID09IE5VTEwpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBsb25nIHN5bWNvdW50OworCSAgICAgIGFzZWN0aW9uICoqbjsKKworCSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCisJCXN5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKKwkgICAgICBlbHNlCisJCXN5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkgICAgICBuID0gKGFzZWN0aW9uICoqKSBiZmRfemFsbG9jIChhYmZkLAorCQkJCQkgICAgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKKwkgICAgICBpZiAobiA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnMgPSBuOworCSAgICB9CisKKwkgIGVsZl90ZGF0YSAoYWJmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XSA9IHNlYzsKKworCSAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgbWlwczE2X3N0dWJzX3NlZW4gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgIFRoYXQgZmxhZyBpcyB1c2VkIHRvIHNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gbG9vayB0aHJvdWdoCisgICAgICAgICAgICAgdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgZm9yIHN0dWJzLiAgV2UgZG9uJ3QgbmVlZCB0byBzZXQKKyAgICAgICAgICAgICBpdCBoZXJlLCBiZWNhdXNlIHdlIGp1c3QgaGF2ZSBhIGxvY2FsIHN0dWIuICAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBoID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCisJICAgICAgIHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKKworCSAgLyogSCBpcyB0aGUgc3ltYm9sIHRoaXMgc3R1YiBpcyBmb3IuICAqLworCisJICBoLT5mbl9zdHViID0gc2VjOworCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuID0gdHJ1ZTsKKwl9CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCBDQUxMX1NUVUIsIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCisJICAgfHwgc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworICAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIGFzZWN0aW9uICoqbG9jOworCisgICAgICAvKiBMb29rIGF0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hpY2ggc3ltYm9sCisgICAgICAgICB0aGlzIGlzIGZvci4gICovCisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbG9jcy0+cl9pbmZvKTsKKworICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmCisJICB8fCBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXSA9PSBOVUxMKQorCXsKKwkgIC8qIFRoaXMgc3R1YiB3YXMgYWN0dWFsbHkgYnVpbHQgZm9yIGEgc3RhdGljIHN5bWJvbCBkZWZpbmVkCisJICAgICBpbiB0aGUgc2FtZSBmaWxlLiAgV2UgYXNzdW1lIHRoYXQgYWxsIHN0YXRpYyBzeW1ib2xzIGluCisJICAgICBtaXBzMTYgY29kZSBhcmUgdGhlbXNlbHZlcyBtaXBzMTYsIHNvIHdlIGNhbiBzaW1wbHkKKwkgICAgIGRpc2NhcmQgdGhpcyBzdHViLiAgU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCisJICAgICB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZSBjYW4KKwkgICAgIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlIFNFQ19FWENMVURFIGZsYWcuICAqLworCSAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgaCA9ICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdKTsKKworICAgICAgLyogSCBpcyB0aGUgc3ltYm9sIHRoaXMgc3R1YiBpcyBmb3IuICAqLworCisgICAgICBpZiAoc3RybmNtcCAobmFtZSwgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKKwlsb2MgPSAmaC0+Y2FsbF9mcF9zdHViOworICAgICAgZWxzZQorCWxvYyA9ICZoLT5jYWxsX3N0dWI7CisKKyAgICAgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBhcHByb3ByaWF0ZSBzdHViIGZvciB0aGlzIGZ1bmN0aW9uLCB3ZQorCSBkb24ndCBuZWVkIGFub3RoZXIgb25lLCBzbyB3ZSBjYW4gZGlzY2FyZCB0aGlzIG9uZS4gIFNpbmNlCisJIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMKKwkgdG8gb3V0cHV0IHNlY3Rpb25zLCB3ZSBjYW4gZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUKKwkgU0VDX0VYQ0xVREUgZmxhZy4gIFdlIGNhbiBhbHNvIGRpc2NhcmQgdGhpcyBzZWN0aW9uIGlmIHdlCisJIGhhcHBlbiB0byBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIGlzIGEgbWlwczE2IGZ1bmN0aW9uOyBpdCBpcworCSBub3QgbmVjZXNzYXJ5IHRvIGNoZWNrIHRoaXMgaGVyZSwgYXMgaXQgaXMgY2hlY2tlZCBsYXRlciwgYnV0CisJIGl0IGlzIHNsaWdodGx5IGZhc3RlciB0byBjaGVjayBub3cuICAqLworICAgICAgaWYgKCpsb2MgIT0gTlVMTCB8fCBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCisJeworCSAgc2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgKmxvYyA9IHNlYzsKKyAgICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbiA9IHRydWU7CisgICAgfQorCisgIGlmIChkeW5vYmogPT0gTlVMTCkKKyAgICB7CisgICAgICBzZ290ID0gTlVMTDsKKyAgICAgIGcgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKKwlnID0gTlVMTDsKKyAgICAgIGVsc2UKKwl7CisJICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKKwkgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOworCSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKKwl9CisgICAgfQorCisgIHNyZWxvYyA9IE5VTEw7CisKKyAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKworICAgICAgaWYgKHJfc3ltbmR4IDwgZXh0c3ltb2ZmKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCXsKKwkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKKworCSAgLyogVGhpcyBtYXkgYmUgYW4gaW5kaXJlY3Qgc3ltYm9sIGNyZWF0ZWQgYmVjYXVzZSBvZiBhIHZlcnNpb24uICAqLworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKKwkJaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOworCSAgICB9CisJfQorCisgICAgICAvKiBTb21lIHJlbG9jcyByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgICAgICBpZiAoZHlub2JqID09IE5VTEwgfHwgc2dvdCA9PSBOVUxMKQorCXsKKwkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJICAgIHsKKwkgICAgY2FzZSBSX01JUFNfR09UMTY6CisJICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKKwkgICAgY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgorCSAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6CisJICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgorCSAgICBjYXNlIFJfTUlQU19HT1RfTE8xNjoKKwkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCisJCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKKwkgICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworCSAgICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOworCSAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOworCSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX01JUFNfMzI6CisJICAgIGNhc2UgUl9NSVBTX1JFTDMyOgorCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTAorCQkgICYmIChpbmZvLT5zaGFyZWQgfHwgaCAhPSBOVUxMKQorCQkgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwl7CisJY2FzZSBSX01JUFNfQ0FMTDE2OgorCWNhc2UgUl9NSVBTX0NBTExfSEkxNjoKKwljYXNlIFJfTUlQU19DQUxMX0xPMTY6CisJICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLworCisJICBpZiAoaCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCIlczogQ0FMTDE2IHJlbG9jIGF0IDB4JWx4IG5vdCBhZ2FpbnN0IGdsb2JhbCBzeW1ib2wiKSwKKwkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcmVsLT5yX29mZnNldCk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwkgICAgeworCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisJICAgIHsKKwkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBOb3RlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIGdvdCBzeW1ib2wgaW4gLmR5bnN5bS4gICovCisJICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSA9PSAwCisJICAgICAgfHwgZy0+Z2xvYmFsX2dvdHN5bSA+ICh1bnNpZ25lZCBsb25nKSBoLT5keW5pbmR4KQorCSAgICBnLT5nbG9iYWxfZ290c3ltID0gaC0+ZHluaW5keDsKKworCSAgLyogTWFrZSB0aGlzIHN5bWJvbCB0byBoYXZlIHRoZSBjb3JyZXNwb25kaW5nIGdvdCBlbnRyeS4gICovCisJICBoLT5nb3Qub2Zmc2V0ID0gMDsKKworCSAgLyogV2UgbmVlZCBhIHN0dWIsIG5vdCBhIHBsdCBlbnRyeSBmb3IgdGhlIHVuZGVmaW5lZAorCSAgICAgZnVuY3Rpb24uICBCdXQgd2UgcmVjb3JkIGl0IGFzIGlmIGl0IG5lZWRzIHBsdC4gIFNlZQorCSAgICAgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCBpbiBlbGZsaW5rLmguICAqLworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKKwkgIGgtPnR5cGUgPSBTVFRfRlVOQzsKKworCSAgYnJlYWs7CisKKwljYXNlIFJfTUlQU19HT1QxNjoKKwljYXNlIFJfTUlQU19HT1RfSEkxNjoKKwljYXNlIFJfTUlQU19HT1RfTE8xNjoKKwkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCisKKwkgIGlmIChoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQorCQl7CisJCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorCQl7CisJCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCisJCSAgYnJlYWs7CisJCX0KKwkgICAgICAvKiBOb3RlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIGdvdCBzeW1ib2wgaW4KKyAgICAgICAgICAgICAgICAgLmR5bnN5bS4gICovCisJICAgICAgaWYgKGctPmdsb2JhbF9nb3RzeW0gPT0gMAorCQkgIHx8IGctPmdsb2JhbF9nb3RzeW0gPiAodW5zaWduZWQgbG9uZykgaC0+ZHluaW5keCkKKwkJZy0+Z2xvYmFsX2dvdHN5bSA9IGgtPmR5bmluZHg7CisKKwkgICAgICAvKiBNYWtlIHRoaXMgc3ltYm9sIHRvIGJlIHRoZSBnbG9iYWwgZ290IHN5bWJvbC4gICovCisJICAgICAgaC0+Z290Lm9mZnNldCA9IDA7CisJICAgIH0KKworCSAgYnJlYWs7CisKKwljYXNlIFJfTUlQU18zMjoKKwljYXNlIFJfTUlQU19SRUwzMjoKKwkgIGlmICgoaW5mby0+c2hhcmVkIHx8IGggIT0gTlVMTCkKKwkgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJeworCQkgIGNvbnN0IGNoYXIgKm5hbWUgPSAiLnJlbC5keW4iOworCisJCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7CisJCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOworCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKKwkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAorCQkJCQkJICAgICAgKFNFQ19BTExPQworCQkJCQkJICAgICAgIHwgU0VDX0xPQUQKKwkJCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAorCQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZKSkKKwkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywKKwkJCQkJCQkgIDQpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKGluZm8tPnNoYXJlZCkKKwkJeworCQkgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKKwkJICAgICByZWxvYyB0eXBlcyBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhcyBSX01JUFNfUkVMMzIKKwkJICAgICByZWxvY3MuICBXZSBtYWtlIHJvb20gZm9yIHRoaXMgcmVsb2MgaW4gdGhlCisJCSAgICAgLnJlbC5keW4gcmVsb2Mgc2VjdGlvbiAqLworCQkgIGlmIChzcmVsb2MtPl9yYXdfc2l6ZSA9PSAwKQorCQkgICAgeworCQkgICAgICAvKiBBZGQgYSBudWxsIGVsZW1lbnQuICovCisJCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKwkJICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OworCQkgICAgfQorCQkgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmhtaXBzOworCisJCSAgLyogV2Ugb25seSBuZWVkIHRvIGNvcHkgdGhpcyByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCisgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QuICAqLworCQkgIGhtaXBzID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKKwkJICArK2htaXBzLT5taXBzXzMyX3JlbG9jczsKKwkJfQorCSAgICB9CisKKwkgIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKKwkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemUgKz0KKwkgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NyaW5mbyk7CisKKwkgIGJyZWFrOworCisJY2FzZSBSX01JUFNfMjY6CisJY2FzZSBSX01JUFNfR1BSRUwxNjoKKwljYXNlIFJfTUlQU19MSVRFUkFMOgorCWNhc2UgUl9NSVBTX0dQUkVMMzI6CisJICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkpCisJICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplICs9CisJICAgICAgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jcmluZm8pOworCSAgYnJlYWs7CisKKwkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKwkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KKwljYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgorCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCisJICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKKwkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworCWNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgorCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIElmIHRoaXMgcmVsb2MgaXMgbm90IGEgMTYgYml0IGNhbGwsIGFuZCBpdCBoYXMgYSBnbG9iYWwKKyAgICAgICAgIHN5bWJvbCwgdGhlbiB3ZSB3aWxsIG5lZWQgdGhlIGZuX3N0dWIgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgUmVmZXJlbmNlcyBmcm9tIGEgc3R1YiBzZWN0aW9uIGRvIG5vdCBjb3VudC4gKi8KKyAgICAgIGlmIChoICE9IE5VTEwKKwkgICYmIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfTUlQUzE2XzI2CisJICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgRk5fU1RVQiwKKwkJICAgICAgc2l6ZW9mIEZOX1NUVUIgLSAxKSAhPSAwCisJICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgQ0FMTF9TVFVCLAorCQkgICAgICBzaXplb2YgQ0FMTF9TVFVCIC0gMSkgIT0gMAorCSAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIENBTExfRlBfU1RVQiwKKwkJICAgICAgc2l6ZW9mIENBTExfRlBfU1RVQiAtIDEpICE9IDApCisJeworCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqbWg7CisKKwkgIG1oID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKKwkgIG1oLT5uZWVkX2ZuX3N0dWIgPSB0cnVlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgorICAgcmVsb2NhdGlvbi4gICovCisKK3N0YXRpYyBhc2VjdGlvbiAqCittaXBzX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworeworICAvKiA/Pz8gRG8gbWlwczE2IHN0dWIgc2VjdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWw/ICAqLworCisgIGlmIChoICE9IE5VTEwpCisgICAgeworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKwl7CisJY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKKwljYXNlIFJfTUlQU19HTlVfVlRFTlRSWToKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQorCSAgICB7CisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKwkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisJICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKKwkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisJCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCisJeworCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKKwl9CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworeworI2lmIDAKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7CisgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKKworICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgeworICAgICAgY2FzZSBSX01JUFNfR09UMTY6CisgICAgICBjYXNlIFJfTUlQU19DQUxMMTY6CisgICAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6CisgICAgICBjYXNlIFJfTUlQU19DQUxMX0xPMTY6CisgICAgICBjYXNlIFJfTUlQU19HT1RfSEkxNjoKKyAgICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgorCS8qID8/PyBJdCB3b3VsZCBzZWVtIHRoYXQgdGhlIGV4aXN0aW5nIE1JUFMgY29kZSBkb2VzIG5vIHNvcnQKKwkgICBvZiByZWZlcmVuY2UgY291bnRpbmcgb3Igd2hhdG5vdCBvbiBpdHMgR09UIGFuZCBQTFQgZW50cmllcywKKwkgICBzbyBpdCBpcyBub3QgcG9zc2libGUgdG8gZ2FyYmFnZSBjb2xsZWN0IHRoZW0gYXQgdGhpcyB0aW1lLiAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKKyAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCisgICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCisgICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgorICAgdW5kZXJzdGFuZC4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgYmZkICpkeW5vYmo7CisgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmhtaXBzOworICBhc2VjdGlvbiAqczsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAorCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQorCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAorCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCisJCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBuZWVkIHRvIGNvcHkKKyAgICAgYW55IFJfTUlQU18zMiBvciBSX01JUFNfUkVMMzIgcmVsb2NzIGFnYWluc3QgaXQgaW50byB0aGUgb3V0cHV0CisgICAgIGZpbGUuICAqLworICBobWlwcyA9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIGg7CisgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQorICAgICAgJiYgaG1pcHMtPm1pcHNfMzJfcmVsb2NzICE9IDAKKyAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKyAgICB7CisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZHluIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCisJeworCSAgLyogTWFrZSByb29tIGZvciBhIG51bGwgZWxlbWVudC4gKi8KKwkgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7CisJICArK3MtPnJlbG9jX2NvdW50OworCX0KKyAgICAgIHMtPl9yYXdfc2l6ZSArPSBobWlwcy0+bWlwc18zMl9yZWxvY3MgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7CisgICAgfQorCisgIC8qIEZvciBhIGZ1bmN0aW9uLCBjcmVhdGUgYSBzdHViLCBpZiBuZWVkZWQuICovCisgIGlmIChoLT50eXBlID09IFNUVF9GVU5DCisgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorCXJldHVybiB0cnVlOworCisgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgdGhlbiBzZXQKKwkgdGhlIHN5bWJvbCB0byB0aGUgc3R1YiBsb2NhdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZQorCSBmdW5jdGlvbiBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbAorCSBleGVjdXRhYmxlIGFuZCB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICAvKiBXZSBuZWVkIC5zdHViIHNlY3Rpb24uICAqLworCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuc3R1YiIpOworCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKKwkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7CisKKwkgIC8qIFhYWCBXcml0ZSB0aGlzIHN0dWIgYWRkcmVzcyBzb21ld2hlcmUuICAqLworCSAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKKworCSAgLyogTWFrZSByb29tIGZvciB0aGlzIHN0dWIgY29kZS4gICovCisJICBzLT5fcmF3X3NpemUgKz0gTUlQU19GVU5DVElPTl9TVFVCX1NJWkU7CisKKwkgIC8qIFRoZSBsYXN0IGhhbGYgd29yZCBvZiB0aGUgc3R1YiB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBpbmRleAorCSAgICAgb2YgdGhpcyBzeW1ib2wgaW4gLmR5bnN5bSBzZWN0aW9uLiAgKi8KKwkgIHJldHVybiB0cnVlOworCX0KKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQorICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKKyAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KKyAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7CisgICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAorICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHJlYWQsCisgICBhbmQgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYmVlbiBhc3NpZ25lZCB0byBvdXRwdXQgc2VjdGlvbnMuICBXZQorICAgY2hlY2sgZm9yIGFueSBtaXBzMTYgc3R1YiBzZWN0aW9ucyB0aGF0IHdlIGNhbiBkaXNjYXJkLiAgKi8KKworc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY2hlY2tfbWlwczE2X3N0dWJzCisgIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYXNlY3Rpb24gKnJpOworCisgIC8qIFRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhIGZpeGVkIHNpemUuICAqLworICByaSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlZ2luZm8iKTsKKyAgaWYgKHJpICE9IE5VTEwpCisgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHJpLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICB8fCAhIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5taXBzMTZfc3R1YnNfc2VlbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJICAgICAgIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicywKKwkJCSAgICAgICAoUFRSKSBOVUxMKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ2hlY2sgdGhlIG1pcHMxNiBzdHVicyBmb3IgYSBwYXJ0aWN1bGFyIHN5bWJvbCwgYW5kIHNlZSBpZiB3ZSBjYW4KKyAgIGRpc2NhcmQgdGhlbS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicyAoaCwgZGF0YSkKKyAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGRhdGE7Cit7CisgIGlmIChoLT5mbl9zdHViICE9IE5VTEwKKyAgICAgICYmICEgaC0+bmVlZF9mbl9zdHViKQorICAgIHsKKyAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGZuX3N0dWI7IHRoZSBvbmx5IHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wKKyAgICAgICAgIGFyZSAxNiBiaXQgY2FsbHMuICBDbG9iYmVyIHRoZSBzaXplIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tCisgICAgICAgICBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCisgICAgICBoLT5mbl9zdHViLT5fcmF3X3NpemUgPSAwOworICAgICAgaC0+Zm5fc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKKyAgICAgIGgtPmZuX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOworICAgICAgaC0+Zm5fc3R1Yi0+cmVsb2NfY291bnQgPSAwOworICAgICAgaC0+Zm5fc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7CisgICAgfQorCisgIGlmIChoLT5jYWxsX3N0dWIgIT0gTlVMTAorICAgICAgJiYgaC0+cm9vdC5vdGhlciA9PSBTVE9fTUlQUzE2KQorICAgIHsKKyAgICAgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNhbGxfc3R1YjsgdGhpcyBpcyBhIDE2IGJpdCBmdW5jdGlvbiwgc28KKyAgICAgICAgIGNhbGxzIGZyb20gb3RoZXIgMTYgYml0IGZ1bmN0aW9ucyBhcmUgT0suICBDbG9iYmVyIHRoZSBzaXplCisgICAgICAgICB0byAwIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCisgICAgICBoLT5jYWxsX3N0dWItPl9yYXdfc2l6ZSA9IDA7CisgICAgICBoLT5jYWxsX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7CisgICAgICBoLT5jYWxsX3N0dWItPmZsYWdzICY9IH4gU0VDX1JFTE9DOworICAgICAgaC0+Y2FsbF9zdHViLT5yZWxvY19jb3VudCA9IDA7CisgICAgICBoLT5jYWxsX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOworICAgIH0KKworICBpZiAoaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwKKyAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKKyAgICB7CisgICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCisgICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQorICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLworICAgICAgaC0+Y2FsbF9mcF9zdHViLT5fcmF3X3NpemUgPSAwOworICAgICAgaC0+Y2FsbF9mcF9zdHViLT5fY29va2VkX3NpemUgPSAwOworICAgICAgaC0+Y2FsbF9mcF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKKyAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+cmVsb2NfY291bnQgPSAwOworICAgICAgaC0+Y2FsbF9mcF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIGJvb2xlYW4gcmVsdGV4dDsKKyAgYXNlY3Rpb24gKnNnb3Q7CisgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOworCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKKwkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJfQorICAgIH0KKworICAvKiBSZWNvbXB1dGUgdGhlIHNpemUgb2YgLmdvdCBmb3IgbG9jYWwgZW50aXJlcyAocmVzZXJ2ZWQgYW5kCisgICAgIGhpcGFnZXMpIGlmIG5lZWRlZC4gIFRvIGVzdGltYXRlIGl0LCBnZXQgdGhlIHVwcGVyIGJvdW5kIG9mIHRvdGFsCisgICAgIHNpemUgb2YgbG9hZGFibGUgc2VjdGlvbnMuICAqLworICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKworICBpZiAoc2dvdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgbG9hZGFibGVfc2l6ZSA9IDA7CisgICAgICBiZmRfc2l6ZV90eXBlIGxvY2FsX2dvdG5vOworICAgICAgc3RydWN0IF9iZmQgKnN1YjsKKworICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7CisgICAgICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKKyAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7CisKKyAgICAgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKKwlmb3IgKHMgPSBzdWItPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCSAgeworCSAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQorCSAgICAgIGNvbnRpbnVlOworCSAgICBsb2FkYWJsZV9zaXplICs9IChzLT5fcmF3X3NpemUgKyAweGYpICYgfjB4ZjsKKwkgIH0KKworICAgICAgbG9hZGFibGVfc2l6ZSArPSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKKworICAgICAgLyogQXNzdW1lIHRoZXJlIGFyZSB0d28gbG9hZGFibGUgc2VnbWVudHMgY29uc2lzdGluZyBvZgorCSBjb250aWd1b3VzIHNlY3Rpb25zLiAgSXMgNSBlbm91Z2g/ICovCisgICAgICBsb2NhbF9nb3RubyA9IChsb2FkYWJsZV9zaXplID4+IDE2KSArIDUgKyBNSVBTX1JFU0VSVkVEX0dPVE5POworICAgICAgZy0+bG9jYWxfZ290bm8gPSBsb2NhbF9nb3RubzsKKyAgICAgIHNnb3QtPl9yYXdfc2l6ZSArPSBsb2NhbF9nb3RubyAqIDQ7CisgICAgfQorCisgIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQorICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKKyAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KKyAgcmVsdGV4dCA9IGZhbHNlOworICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBib29sZWFuIHN0cmlwOworCisgICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQorCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KKyAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKKworICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgc3RyaXAgPSBmYWxzZTsKKworICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKKwl7CisJICBpZiAocy0+X3Jhd19zaXplID09IDApCisJICAgIHsKKwkgICAgICAvKiBXZSBvbmx5IHN0cmlwIHRoZSBzZWN0aW9uIGlmIHRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lCisgICAgICAgICAgICAgICAgIGhhcyB0aGUgc2FtZSBuYW1lLiAgT3RoZXJ3aXNlLCB0aGVyZSBtaWdodCBiZSBzZXZlcmFsCisgICAgICAgICAgICAgICAgIGlucHV0IHNlY3Rpb25zIGZvciB0aGlzIG91dHB1dCBzZWN0aW9uLiAgRklYTUU6IFRoaXMKKyAgICAgICAgICAgICAgICAgY29kZSBpcyBwcm9iYWJseSBub3QgbmVlZGVkIHRoZXNlIGRheXMgYW55aG93LCBzaW5jZQorICAgICAgICAgICAgICAgICB0aGUgbGlua2VyIG5vdyBkb2VzIG5vdCBjcmVhdGUgZW1wdHkgb3V0cHV0IHNlY3Rpb25zLiAgKi8KKwkgICAgICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAorCQkgICYmIHN0cmNtcCAobmFtZSwKKwkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm91dHB1dF9zZWN0aW9uLT5vd25lciwKKwkJCQkJCSAgIHMtPm91dHB1dF9zZWN0aW9uKSkgPT0gMCkKKwkJc3RyaXAgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOworCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7CisKKwkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5CisgICAgICAgICAgICAgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuCisgICAgICAgICAgICAgICAgIElmIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaXMgLnJlbC5keW4sIHdlIGFsd2F5cworICAgICAgICAgICAgICAgICBhc3NlcnQgYSBEVF9URVhUUkVMIGVudHJ5IHJhdGhlciB0aGFuIHRlc3Rpbmcgd2hldGhlcgorICAgICAgICAgICAgICAgICB0aGVyZSBleGlzdHMgYSByZWxvY2F0aW9uIHRvIGEgcmVhZCBvbmx5IHNlY3Rpb24gb3IKKyAgICAgICAgICAgICAgICAgbm90LiAgKi8KKwkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCisJCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKKwkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOworCSAgICAgIGlmICgodGFyZ2V0ICE9IE5VTEwKKwkJICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKKwkJICAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJCSAgfHwgc3RyY21wIChvdXRuYW1lLCAiLnJlbC5keW4iKSA9PSAwKQorCQlyZWx0ZXh0ID0gdHJ1ZTsKKworCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKKwkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKwkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbC5keW4iKSAhPSAwKQorCQlzLT5yZWxvY19jb3VudCA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpID09IDApCisJeworCSAgaW50IGk7CisKKwkgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHMpICE9IE5VTEwpOworCSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGE7CisJICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOworCisJICAvKiBGaXggdGhlIHNpemUgb2YgLmdvdCBzZWN0aW9uIGZvciB0aGUgY29ycmVzcG9uZGVuY2Ugb2YKKwkgICAgIGdsb2JhbCBzeW1ib2xzIGFuZCBnb3QgZW50cmllcy4gVGhpcyBhZGRzIHNvbWUgdXNlbGVzcworCSAgICAgZ290IGVudHJpZXMuIElzIHRoaXMgcmVxdWlyZWQgYnkgQUJJIHJlYWxseT8gICovCisJICBpID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCAtIGctPmdsb2JhbF9nb3RzeW07CisJICBzLT5fcmF3X3NpemUgKz0gaSAqIDQ7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5zdHViIiwgNSkgPT0gMCkKKwl7CisJICAvKiBJcml4IHJsZCBhc3N1bWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHN0dWIgaXNuJ3QgYXQgdGhlIGVuZAorCSAgICAgb2YgLnRleHQgc2VjdGlvbi4gU28gcHV0IGEgZHVtbXkuIFhYWCAgKi8KKwkgIHMtPl9yYXdfc2l6ZSArPSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKKwl9CisgICAgICBlbHNlIGlmICghIGluZm8tPnNoYXJlZAorCSAgICAgICAmJiAhIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCisJICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIucmxkX21hcCIsIDgpID09IDApCisJeworCSAgLyogV2UgYWRkIGEgcm9vbSBmb3IgX19ybGRfbWFwLiBJdCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUKKwkgICAgIHJ0bGQgdG8gY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIF9yX2RlYnVnIHN0cnVjdHVyZS4gICovCisJICBzLT5fcmF3X3NpemUgKz0gNDsKKwl9CisgICAgICBlbHNlIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKQorCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmNvbXBhY3RfcmVsIiwgMTIpID09IDApCisJcy0+X3Jhd19zaXplICs9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplOworICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5pbml0IiwgNSkgIT0gMCkKKwl7CisJICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChzdHJpcCkKKwl7CisJICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgcy0+X3Jhd19zaXplKTsKKyAgICB9CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQorCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9taXBzX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKKwkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCisJIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKKwkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KKyAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKKwl7CisJICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCisJICAgIHsKKwkgICAgICAvKiBTR0kgb2JqZWN0IGhhcyB0aGUgZXF1aXZhbGVuY2Ugb2YgRFRfREVCVUcgaW4gdGhlCisJCSBEVF9NSVBTX1JMRF9NQVAgZW50cnkuICAqLworCSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19STERfTUFQLCAwKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBlbHNlCisJICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChyZWx0ZXh0KQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5keW4iKSkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxTWiwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxFTlQsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfQ09ORkxJQ1ROTywgMCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfTElCTElTVE5PLCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbmZsaWN0IikgIT0gTlVMTCkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfQ09ORkxJQ1QsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmxpYmxpc3QiKTsKKwkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19MSUJMSVNULCAwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX1JMRF9WRVJTSU9OLCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19GTEFHUywgMCkpCisJcmV0dXJuIGZhbHNlOworCisjaWYgMAorICAgICAgLyogVGltZSBzdGFtcHMgaW4gZXhlY3V0YWJsZSBmaWxlcyBhcmUgYSBiYWQgaWRlYS4gICovCisgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfVElNRV9TVEFNUCwgMCkpCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyNpZiAwIC8qIEZJWE1FICAqLworICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0lDSEVDS1NVTSwgMCkpCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyNpZiAwIC8qIEZJWE1FICAqLworICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0lWRVJTSU9OLCAwKSkKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0JBU0VfQUREUkVTUywgMCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfTE9DQUxfR09UTk8sIDApKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX1NZTVRBQk5PLCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19VTlJFRkVYVE5PLCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19HT1RTWU0sIDApKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0hJUEFHRU5PLCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyNpZiAwIC8qIChTR0lfQ09NUEFUKSAqLworICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbml0IikpCisJaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9JTklULCAwKSkKKwkgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5maW5pIikpCisJaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9GSU5JLCAwKSkKKwkgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIH0KKworICAvKiBJZiB3ZSB1c2UgZHluYW1pYyBsaW5raW5nLCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24gc3ltYm9sIGZvciBlYWNoCisgICAgIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleQorICAgICBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgorICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQorICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgYywgaTsKKyAgICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKKworICAgIGMgPSAwOworICAgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICAgIHsKKyNpZiAwCisJLyogV2Ugbm8gbG9uZ2VyIHRyeSB0byByZXN0cmljdCB0aGUgc2V0IG9mIHNlY3Rpb25zIHdoaWNoIGdldAorICAgICAgICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBzaW5jZSBpdCBmYWlscyBpZiB3ZSBoYXZlCisgICAgICAgICAgIG90aGVyIHJhbmRvbSBzZWN0aW9ucyB3aGljaCBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLworCWNvbnN0IGNoYXIgKiBjb25zdCAqbmFtZXA7CisJYmZkX3NpemVfdHlwZSBzdHJpbmRleDsKKwlzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7CisKKwlpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCisJICB7CisJICAgIGMgPSBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVMgLSAxOworCSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJICAgIG1pcHNfZWxmX2FkanVzdF9keW5pbmR4LAorCQkJCSAgICAoUFRSKSAmYyk7CisJICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKKworCSAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKKwkgICAgQkZEX0FTU0VSVCAoZHluc3RyICE9IE5VTEwpOworCisJICAgIGZvciAoaSA9IDEsIG5hbWVwID0gbWlwc19lbGZfZHluc3ltX3NlY19uYW1lczsKKwkJICpuYW1lcCAhPSBOVUxMOworCQkgaSsrLCBuYW1lcCsrKQorCSAgICAgIHsKKwkJcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAqbmFtZXApOworCQlpZiAocyAhPSBOVUxMKQorCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gaTsKKworCQlzdHJpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZHluc3RyLCAqbmFtZXAsIHRydWUsIGZhbHNlKTsKKwkJaWYgKHN0cmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkJICByZXR1cm4gZmFsc2U7CisKKwkJbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bV9zZWNfc3RyaW5kZXhbaV0gPSBzdHJpbmRleDsKKwkgICAgICB9CisJICB9CisJZWxzZQorI2VuZGlmIC8qIDAgKi8KKwkgIHsKKwkgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCk7CisJICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkgICAgbWlwc19lbGZfYWRqdXN0X2R5bmluZHgsCisJCQkJICAgIChQVFIpICZjKTsKKwkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOworCisJICAgIGZvciAoaSA9IDEsIHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCwgaSsrKQorCSAgICAgIHsKKwkJZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSBpOworCQkvKiBUaGVzZSBzeW1ib2xzIHdpbGwgaGF2ZSBubyBuYW1lcywgc28gd2UgZG9uJ3QgbmVlZCB0bworCQkgICBmaWRkbGUgd2l0aCBkeW5zdHJfaW5kZXguICAqLworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIGlmIChzZ290ICE9IE5VTEwpCisgICAgICB7CisJQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7CisJZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7CisJQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKKworCS8qIElmIHRoZXJlIGFyZSBubyBnbG9iYWwgZ290IHN5bWJvbHMsIGZha2UgdGhlIGxhc3Qgc3ltYm9sIHNvCisJICAgZm9yIHNhZmV0eS4gICovCisJaWYgKGctPmdsb2JhbF9nb3RzeW0pCisJICBnLT5nbG9iYWxfZ290c3ltICs9IGM7CisJZWxzZQorCSAgZy0+Z2xvYmFsX2dvdHN5bSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgLSAxOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEluY3JlbWVudCB0aGUgaW5kZXggb2YgYSBkeW5hbWljIHN5bWJvbCBieSBhIGdpdmVuIGFtb3VudC4gIENhbGxlZAorICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGZfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQorICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGNwYXJnOworeworICB1bnNpZ25lZCBpbnQgKmNwID0gKHVuc2lnbmVkIGludCAqKSBjcGFyZzsKKworICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKKyAgICBoLT5keW5pbmR4ICs9ICpjcDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cworICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworeworICBiZmQgKmR5bm9iajsKKyAgYmZkX3ZtYSBndmFsOworICBhc2VjdGlvbiAqc2dvdDsKKyAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIGd2YWwgPSBzeW0tPnN0X3ZhbHVlOworCisgIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIGJmZF9ieXRlICpwOworICAgICAgYmZkX2J5dGUgc3R1YltNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRV07CisKKyAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIHN0dWIuICBTZXQgaXQgdXAuICAqLworCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuc3R1YiIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgLyogRmlsbCB0aGUgc3R1Yi4gICovCisgICAgICBwID0gc3R1YjsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTFcob3V0cHV0X2JmZCksIHApOworICAgICAgcCArPSA0OworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9NT1ZFLCBwKTsKKyAgICAgIHAgKz0gNDsKKworICAgICAgLyogRklYTUU6IENhbiBoLT5keW5pbmRleCBiZSBtb3JlIHRoYW4gNjRLPyAgKi8KKyAgICAgIGlmIChoLT5keW5pbmR4ICYgMHhmZmZmMDAwMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfSkFMUiwgcCk7CisgICAgICBwICs9IDQ7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xJMTYgKyBoLT5keW5pbmR4LCBwKTsKKworICAgICAgQkZEX0FTU0VSVCAoaC0+cGx0Lm9mZnNldCA8PSBzLT5fcmF3X3NpemUpOworICAgICAgbWVtY3B5IChzLT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQsIHN0dWIsIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFKTsKKworICAgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZC4gIHBsdC5vZmZzZXQgIT0gLTEgb2NjdXJzCisJIG9ubHkgZm9yIHRoZSByZWZlcmVuY2VkIHN5bWJvbC4gICovCisgICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOworCisgICAgICAvKiBUaGUgcnVuLXRpbWUgbGlua2VyIHVzZXMgdGhlIHN0X3ZhbHVlIGZpZWxkIG9mIHRoZSBzeW1ib2wKKwkgdG8gcmVzZXQgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIHRoaXMgZXh0ZXJuYWwKKwkgdG8gaXRzIHN0dWIgYWRkcmVzcyB3aGVuIHVubGlua2luZyBhIHNoYXJlZCBvYmplY3QuICAqLworICAgICAgZ3ZhbCA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0ICsgaC0+cGx0Lm9mZnNldDsKKyAgICAgIHN5bS0+c3RfdmFsdWUgPSBndmFsOworICAgIH0KKworICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKworICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKyAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKyAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7CisgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOworICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOworCisgIGlmICgodW5zaWduZWQgbG9uZykgaC0+ZHluaW5keCA+PSBnLT5nbG9iYWxfZ290c3ltKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgb2Zmc2V0OworCisgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXRzCisJIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGdvdCBlbnRyeSwgaWYgbmVlZGVkLiAgKi8KKyAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKKwl7CisJICBvZmZzZXQgPSAoaC0+ZHluaW5keCAtIGctPmdsb2JhbF9nb3RzeW0gKyBnLT5sb2NhbF9nb3RubykgKiA0OworCSAgQkZEX0FTU0VSVCAoZy0+bG9jYWxfZ290bm8gKiA0IDw9IG9mZnNldAorCQkgICAgICAmJiBvZmZzZXQgPCBzZ290LT5fcmF3X3NpemUpOworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZ3ZhbCwgc2dvdC0+Y29udGVudHMgKyBvZmZzZXQpOworCX0KKyAgICB9CisKKyAgLyogTWFyayBfRFlOQU1JQyBhbmQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFzIGFic29sdXRlLiAgKi8KKyAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisgIGlmIChzdHJjbXAgKG5hbWUsICJfRFlOQU1JQyIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAobmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCisgICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9EWU5BTUlDX0xJTksiKSA9PSAwKQorICAgIHsKKyAgICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOworICAgICAgc3ltLT5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIFNUVF9TRUNUSU9OKTsKKyAgICAgIHN5bS0+c3RfdmFsdWUgPSAxOworICAgIH0KKyAgZWxzZSBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIl9ncF9kaXNwIikgPT0gMCkKKwl7CisJICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKKwkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7CisJICBzeW0tPnN0X3ZhbHVlID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMF0pID09IDAKKwkgICAgICAgfHwgc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzFdKSA9PSAwKQorCXsKKwkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7CisJICBzeW0tPnN0X290aGVyID0gU1RPX1BST1RFQ1RFRDsKKwkgIHN5bS0+c3RfdmFsdWUgPSAwOworCSAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX0RBVEE7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzJdKSA9PSAwKQorCXsKKwkgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7CisJICBzeW0tPnN0X290aGVyID0gU1RPX1BST1RFQ1RFRDsKKwkgIHN5bS0+c3RfdmFsdWUgPSBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cHJvY2VkdXJlX2NvdW50OworCSAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7CisJfQorICAgICAgZWxzZSBpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQUJTKQorCXsKKwkgIGlmIChoLT50eXBlID09IFNUVF9GVU5DKQorCSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX01JUFNfVEVYVDsKKwkgIGVsc2UgaWYgKGgtPnR5cGUgPT0gU1RUX09CSkVDVCkKKwkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX0RBVEE7CisJfQorICAgIH0KKworICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKKyAgICAgICYmICEgaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIGlmICghIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCisJICAmJiBzdHJjbXAgKG5hbWUsICJfX3JsZF9tYXAiKSA9PSAwKQorCXsKKwkgIGFzZWN0aW9uICpzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ybGRfbWFwIik7CisJICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCSAgc3ltLT5zdF92YWx1ZSA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHMtPmNvbnRlbnRzKTsKKwkgIGlmIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID09IDApCisJICAgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOworCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCisJICAgICAgICYmIHN0cmNtcCAobmFtZSwgIl9fcmxkX29ial9oZWFkIikgPT0gMCkKKwl7CisJICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmxkX21hcCIpOworCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOworCX0KKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIG1pcHMxNiBzeW1ib2wsIGZvcmNlIHRoZSB2YWx1ZSB0byBiZSBldmVuLiAgKi8KKyAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNgorICAgICAgJiYgKHN5bS0+c3RfdmFsdWUgJiAxKSAhPSAwKQorICAgIC0tc3ltLT5zdF92YWx1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnNkeW47CisgIGFzZWN0aW9uICpzZ290OworICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7CisKKyAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgIGlmIChzZ290ID09IE5VTEwpCisgICAgZyA9IE5VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKKyAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOworICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKKyAgICB9CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOworICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKKworICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKKyAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKKyAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOworCSAgY29uc3QgY2hhciAqbmFtZTsKKwkgIHNpemVfdCBlbGVtc2l6ZTsKKwkgIGFzZWN0aW9uICpzOworCisJICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKKworCSAgc3dpdGNoIChkeW4uZF90YWcpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERUX1JFTEVOVDoKKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZHluIik7CisJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfU1RSU1o6CisJICAgICAgLyogUmV3cml0ZSBEVF9TVFJTWi4gICovCisJICAgICAgZHluLmRfdW4uZF92YWwgPQorCQlfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7CisJICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERUX1BMVEdPVDoKKwkgICAgICBuYW1lID0gIi5nb3QiOworCSAgICAgIGdvdG8gZ2V0X3ZtYTsKKwkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOgorCSAgICAgIG5hbWUgPSAiLmNvbmZsaWN0IjsKKwkgICAgICBnb3RvIGdldF92bWE7CisJICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOgorCSAgICAgIG5hbWUgPSAiLmxpYmxpc3QiOworCSAgICBnZXRfdm1hOgorCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7CisJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19STERfVkVSU0lPTjoKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDE7IC8qIFhYWCAqLworCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9NSVBTX0ZMQUdTOgorCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gUkhGX05PVFBPVDsgLyogWFhYICovCisJICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKKwkgICAgICBuYW1lID0gIi5jb25mbGljdCI7CisJICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0NvbmZsaWN0KTsKKwkgICAgICBnb3RvIHNldF9lbGVtbm87CisKKwkgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzoKKwkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKKwkgICAgICBlbGVtc2l6ZSA9IHNpemVvZiAoRWxmMzJfTGliKTsKKwkgICAgc2V0X2VsZW1ubzoKKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOworCSAgICAgIGlmIChzICE9IE5VTEwpCisJCXsKKwkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCisJCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZSAvIGVsZW1zaXplOworCQkgIGVsc2UKKwkJICAgIGR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7CisJCX0KKwkgICAgICBlbHNlCisJCSAgICBkeW4uZF91bi5kX3ZhbCA9IDA7CisKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOgorCSAgICAgIHRpbWUgKCh0aW1lX3QgKikgJmR5bi5kX3VuLmRfdmFsKTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19JQ0hFQ0tTVU06CisJICAgICAgLyogWFhYIEZJWE1FOiAqLworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19JVkVSU0lPTjoKKwkgICAgICAvKiBYWFggRklYTUU6ICovCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9NSVBTX0JBU0VfQUREUkVTUzoKKwkgICAgICBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7CisJICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYSAmIH4oMHhmZmZmKTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vOworCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POgorCSAgICAgIG5hbWUgPSAiLmR5bnN5bSI7CisJICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7CisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKKwkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisJICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQorCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZSAvIGVsZW1zaXplOworCSAgICAgIGVsc2UKKwkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemUgLyBlbGVtc2l6ZTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POgorI2lmIDAKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsKKyNlbHNlCisJICAgICAgZHluLmRfdW4uZF92YWwgPSBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpOworI2VuZGlmCisJICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERUX01JUFNfR09UU1lNOgorCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gZy0+Z2xvYmFsX2dvdHN5bTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzoKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vIC0gTUlQU19SRVNFUlZFRF9HT1ROTzsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRFRfTUlQU19STERfTUFQOgorCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZTsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICAgIGJyZWFrOworCisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGJlIGZpbGxlZCBhdAorICAgICBydW50aW1lLiBUaGUgc2Vjb25kIGVudHJ5IHdpbGwgYmUgdXNlZCBieSBzb21lIHJ1bnRpbWUgbG9hZGVycy4KKyAgICAgVGhpcyBpc24ndCB0aGUgY2FzZSBvZiBJcml4IHJsZC4gKi8KKyAgaWYgKHNnb3QgIT0gTlVMTCAmJiBzZ290LT5fcmF3X3NpemUgPiAwKQorICAgIHsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMHg4MDAwMDAwMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKKyAgICB9CisKKyAgaWYgKHNnb3QgIT0gTlVMTCkKKyAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OworCisgIHsKKyAgICBhc2VjdGlvbiAqc2R5bnN5bTsKKyAgICBhc2VjdGlvbiAqczsKKyAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKKyAgICBFbGYzMl9jb21wYWN0X3JlbCBjcHQ7CisKKyAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gU0dJIHNldHMKKyAgICAgICB0aGUgU1RUX05PVFlQRSBhdHRyaWJ1dGUgZm9yIHRoZXNlIHN5bWJvbHMuICBTaG91bGQgd2UgZG8gc28/ICAqLworCisgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7CisgICAgaWYgKHNkeW5zeW0gIT0gTlVMTCkKKyAgICAgIHsKKyNpZiAwCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICogY29uc3QgKiBuYW1lcCA9IG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXM7CisJdW5zaWduZWQgaW50IGk7CisJYmZkX3ZtYSBsYXN0OworCWxvbmcgZGluZHg7CisKKwkvKiBXZSBubyBsb25nZXIgdHJ5IHRvIHJlc3RyaWN0IHRoZSBzZXQgb2Ygc2VjdGlvbnMgd2hpY2ggZ2V0CisgICAgICAgICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMsIHNpbmNlIGl0IGZhaWxzIGlmIHdlIGhhdmUKKyAgICAgICAgICAgb3RoZXIgcmFuZG9tIHNlY3Rpb25zIHdoaWNoIG5lZWQgZHluYW1pYyByZWxvY2F0aW9ucy4gICovCisJaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQorCSAgeworCSAgICBzeW0uc3Rfc2l6ZSA9IDA7CisJICAgIHN5bS5zdF9uYW1lID0gMDsKKwkgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfTk9UWVBFKTsKKwkgICAgc3ltLnN0X290aGVyID0gMDsKKworCSAgICBpID0gMDsKKwkgICAgbGFzdCA9IDA7CisJICAgIGRpbmR4ID0gMDsKKwkgICAgd2hpbGUgKChuYW1lID0gKm5hbWVwKyspICE9IE5VTEwpCisJICAgICAgeworCQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOworCQlpZiAocyAhPSBOVUxMKQorCQkgIHsKKwkJICAgIHN5bS5zdF92YWx1ZSA9IHMtPnZtYTsKKwkJICAgIGRpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHg7CisJCSAgICBsYXN0ID0gcy0+dm1hICsgcy0+X3Jhd19zaXplOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIHN5bS5zdF92YWx1ZSA9IGxhc3Q7CisJCSAgICBkaW5keCsrOworCQkgIH0KKworCQlzeW0uc3Rfc2huZHggPSAoaSA8IE1JUFNfVEVYVF9EWU5TWU1fU0VDTk8KKwkJCQk/IFNITl9NSVBTX1RFWFQKKwkJCQk6IFNITl9NSVBTX0RBVEEpOworCQkrK2k7CisJCXN5bS5zdF9uYW1lID0KKwkJICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltX3NlY19zdHJpbmRleFtkaW5keF07CisKKwkJYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKKwkJCQkJICAgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCisJCQkJCSAgICAgc2R5bnN5bS0+Y29udGVudHMpCisJCQkJCSAgICArIGRpbmR4KSk7CisJICAgICAgfQorCisJICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0bworCSAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLworCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPQorCSAgICAgIFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsKKwkgIH0KKwllbHNlCisjZW5kaWYgLyogMCAqLworCSAgeworCSAgICBzeW0uc3Rfc2l6ZSA9IDA7CisJICAgIHN5bS5zdF9uYW1lID0gMDsKKwkgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7CisJICAgIHN5bS5zdF9vdGhlciA9IDA7CisKKwkgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJICAgICAgeworCQlpbnQgaW5keDsKKworCQlzeW0uc3RfdmFsdWUgPSBzLT52bWE7CisKKwkJaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKKwkJQkZEX0FTU0VSVCAoaW5keCA+IDApOworCQlzeW0uc3Rfc2huZHggPSBpbmR4OworCisJCWJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCisJCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQorCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQorCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOworCSAgICAgIH0KKworCSAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8KKwkgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KKwkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KKwkgICAgICBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKKwkgIH0KKyAgICAgIH0KKworICAgIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKKyAgICAgIHsKKwkvKiBXcml0ZSAuY29tcGFjdF9yZWwgc2VjdGlvbiBvdXQuICAqLworCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbXBhY3RfcmVsIik7CisJaWYgKHMgIT0gTlVMTCkKKwkgIHsKKwkgICAgY3B0LmlkMSA9IDE7CisJICAgIGNwdC5udW0gPSBzLT5yZWxvY19jb3VudDsKKwkgICAgY3B0LmlkMiA9IDI7CisJICAgIGNwdC5vZmZzZXQgPSAocy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MKKwkJCSAgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7CisJICAgIGNwdC5yZXNlcnZlZDAgPSAwOworCSAgICBjcHQucmVzZXJ2ZWQxID0gMDsKKwkgICAgYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChvdXRwdXRfYmZkLCAmY3B0LAorCQkJCQkgICAgKChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqKQorCQkJCQkgICAgIHMtPmNvbnRlbnRzKSk7CisKKwkgICAgLyogQ2xlYW4gdXAgYSBkdW1teSBzdHViIGZ1bmN0aW9uIGVudHJ5IGluIC50ZXh0LiAgKi8KKwkgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuc3R1YiIpOworCSAgICBpZiAocyAhPSBOVUxMKQorCSAgICAgIHsKKwkJZmlsZV9wdHIgZHVtbXlfb2Zmc2V0OworCisJCUJGRF9BU1NFUlQgKHMtPl9yYXdfc2l6ZSA+PSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7CisJCWR1bW15X29mZnNldCA9IHMtPl9yYXdfc2l6ZSAtIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOworCQltZW1zZXQgKHMtPmNvbnRlbnRzICsgZHVtbXlfb2Zmc2V0LCAwLAorCQkJTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIC8qIENsZWFuIHVwIGEgZmlyc3QgcmVsb2NhdGlvbiBpbiAucmVsLmR5bi4gICovCisgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOworICAgIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplID4gMCkKKyAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBiZmRfZ2VuZXJpY19nZXRfLi4uIGV4Y2VwdCB0aGF0IHNvbWUKKyAgIE1JUFMgcmVsb2NhdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFNpZ2guICAqLworCitzdGF0aWMgYmZkX2J5dGUgKgorZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKKwkJCQkJICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KKyAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKworICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOworICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKKyAgbG9uZyByZWxvY19jb3VudDsKKworICBpZiAocmVsb2Nfc2l6ZSA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOworICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKKwkJCQkgaW5wdXRfc2VjdGlvbiwKKwkJCQkgKFBUUikgZGF0YSwKKwkJCQkgMCwKKwkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCisgIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKKyAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7CisKKyAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCisJCQkJCWlucHV0X3NlY3Rpb24sCisJCQkJCXJlbG9jX3ZlY3RvciwKKwkJCQkJc3ltYm9scyk7CisgIGlmIChyZWxvY19jb3VudCA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKHJlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBhcmVsZW50ICoqcGFyZW50OworICAgICAgLyogZm9yIG1pcHMgKi8KKyAgICAgIGludCBncF9mb3VuZDsKKyAgICAgIGJmZF92bWEgZ3AgPSAweDEyMzQ1Njc4OwkvKiBpbml0aWFsaXplIGp1c3QgdG8gc2h1dCBnY2MgdXAgKi8KKworICAgICAgeworCXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaDsKKwlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGg7CisJLyogU2tpcCBhbGwgdGhpcyBzdHVmZiBpZiB3ZSBhcmVuJ3QgbWl4aW5nIGZvcm1hdHMuICAqLworCWlmIChhYmZkICYmIGlucHV0X2JmZAorCSAgICAmJiBhYmZkLT54dmVjID09IGlucHV0X2JmZC0+eHZlYykKKwkgIGxoID0gMDsKKwllbHNlCisJICB7CisJICAgIGggPSBiZmRfaGFzaF9sb29rdXAgKCZsaW5rX2luZm8tPmhhc2gtPnRhYmxlLCAiX2dwIiwgZmFsc2UsIGZhbHNlKTsKKwkgICAgbGggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKKwkgIH0KKyAgICAgIGxvb2t1cDoKKwlpZiAobGgpCisJICB7CisJICAgIHN3aXRjaCAobGgtPnR5cGUpCisJICAgICAgeworCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6CisJICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKKwkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorCQlncF9mb3VuZCA9IDA7CisJCWJyZWFrOworCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorCQlncF9mb3VuZCA9IDE7CisJCWdwID0gbGgtPnUuZGVmLnZhbHVlOworCQlicmVhazsKKwkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6CisJICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6CisJCWxoID0gbGgtPnUuaS5saW5rOworCQkvKiBAQEZJWE1FICBpZ25vcmluZyB3YXJuaW5nIGZvciBub3cgKi8KKwkJZ290byBsb29rdXA7CisJICAgICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKKwkgICAgICBkZWZhdWx0OgorCQlhYm9ydCAoKTsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgZ3BfZm91bmQgPSAwOworICAgICAgfQorICAgICAgLyogZW5kIG1pcHMgKi8KKyAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7CisJICAgcGFyZW50KyspCisJeworCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7CisJICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworCSAgLyogU3BlY2lmaWMgdG8gTUlQUzogRGVhbCB3aXRoIHJlbG9jYXRpb24gdHlwZXMgdGhhdCByZXF1aXJlCisJICAgICBrbm93aW5nIHRoZSBncCBvZiB0aGUgb3V0cHV0IGJmZC4gICovCisJICBhc3ltYm9sICpzeW0gPSAqKCpwYXJlbnQpLT5zeW1fcHRyX3B0cjsKKwkgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgYWJmZCkKKwkgICAgeworCSAgICAgIC8qIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIHdvdWxkbid0IGdldCBjYWxsZWQgYW55d2F5cy4gICovCisJICAgIH0KKwkgIGVsc2UgaWYgKCFncF9mb3VuZCkKKwkgICAgeworCSAgICAgIC8qIFRoZSBncCBpc24ndCB0aGVyZTsgbGV0IHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGNvZGUKKwkJIGZhbGwgb3ZlciBvbiBpdHMgb3duLiAgKi8KKwkgICAgfQorCSAgZWxzZSBpZiAoKCpwYXJlbnQpLT5ob3d0by0+c3BlY2lhbF9mdW5jdGlvbgorCQkgICA9PSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpCisJICAgIHsKKwkgICAgICAvKiBieXBhc3Mgc3BlY2lhbF9mdW5jdGlvbiBjYWxsICovCisJICAgICAgciA9IGdwcmVsMTZfd2l0aF9ncCAoaW5wdXRfYmZkLCBzeW0sICpwYXJlbnQsIGlucHV0X3NlY3Rpb24sCisJCQkJICAgcmVsb2NhdGVhYmxlLCAoUFRSKSBkYXRhLCBncCk7CisJICAgICAgZ290byBza2lwX2JmZF9wZXJmb3JtX3JlbG9jYXRpb247CisJICAgIH0KKwkgIC8qIGVuZCBtaXBzIHNwZWNpZmljIHN0dWZmICovCisKKwkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCisJCQkJICAgICAgKnBhcmVudCwKKwkJCQkgICAgICAoUFRSKSBkYXRhLAorCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCisJCQkJICAgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKKwkJCQkgICAgICAmZXJyb3JfbWVzc2FnZSk7CisJc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOgorCisJICBpZiAocmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisKKwkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCisJICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OworCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOworCSAgICB9CisKKwkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKKwkgICAgeworCSAgICAgIHN3aXRjaCAocikKKwkJeworCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6CisJCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKKwkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgYnJlYWs7CisJCWNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKKwkJICBCRkRfQVNTRVJUIChlcnJvcl9tZXNzYWdlICE9IChjaGFyICopIE5VTEwpOworCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKKwkJCShsaW5rX2luZm8sIGVycm9yX21lc3NhZ2UsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAoKnBhcmVudCktPmFkZHJlc3MpKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIGJyZWFrOworCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKKwkJCSAoKnBhcmVudCktPmhvd3RvLT5uYW1lLCAoKnBhcmVudCktPmFkZGVuZCwKKwkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgYnJlYWs7CisJCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJCWRlZmF1bHQ6CisJCSAgYWJvcnQgKCk7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICB9CisJfQorICAgIH0KKyAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQorICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgIHJldHVybiBkYXRhOworCitlcnJvcl9yZXR1cm46CisgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKKyAgICBmcmVlIChyZWxvY192ZWN0b3IpOworICByZXR1cm4gTlVMTDsKK30KKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorICBlbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworDAorLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKKyAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwIG1pcHNfZWxmMzJfZWNvZmZfZGVidWdfc3dhcCA9Cit7CisgIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLworICBtYWdpY1N5bSwKKyAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLworICA0LAorICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCisgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAorICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKKyAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCisgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAorICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKKyAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCisgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAorICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKKyAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgIGVjb2ZmX3N3YXBfaGRyX2luLAorICBlY29mZl9zd2FwX2Rucl9pbiwKKyAgZWNvZmZfc3dhcF9wZHJfaW4sCisgIGVjb2ZmX3N3YXBfc3ltX2luLAorICBlY29mZl9zd2FwX29wdF9pbiwKKyAgZWNvZmZfc3dhcF9mZHJfaW4sCisgIGVjb2ZmX3N3YXBfcmZkX2luLAorICBlY29mZl9zd2FwX2V4dF9pbiwKKyAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKKyAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCisgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KKyAgZWNvZmZfc3dhcF9oZHJfb3V0LAorICBlY29mZl9zd2FwX2Rucl9vdXQsCisgIGVjb2ZmX3N3YXBfcGRyX291dCwKKyAgZWNvZmZfc3dhcF9zeW1fb3V0LAorICBlY29mZl9zd2FwX29wdF9vdXQsCisgIGVjb2ZmX3N3YXBfZmRyX291dCwKKyAgZWNvZmZfc3dhcF9yZmRfb3V0LAorICBlY29mZl9zd2FwX2V4dF9vdXQsCisgIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAorICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCisgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCisgIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCit9OworDAorI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWxpdHRsZW1pcHMiCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX2JpZ21pcHNfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1iaWdtaXBzIgorI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX21pcHMKKyNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTUlQUworCisvKiBUaGUgU1ZSNCBNSVBTIEFCSSBzYXlzIHRoYXQgdGhpcyBzaG91bGQgYmUgMHgxMDAwMCwgYnV0IElyaXggNSB1c2VzCisgICBhIHZhbHVlIG9mIDB4MTAwMCwgYW5kIHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdAkJdHJ1ZQorI2RlZmluZSBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vawl0cnVlCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwl0cnVlCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkwCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJbWlwc19pbmZvX3RvX2hvd3RvX3JlbAorI2RlZmluZSBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCW1pcHNfZWxmX3N5bV9pc19nbG9iYWwKKyNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCW1pcHNfZWxmMzJfb2JqZWN0X3AKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJbWlwc19lbGYzMl9zZWN0aW9uX2Zyb21fc2hkcgorI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCV9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gXAorCQkJCQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyBcCisJCQkJCW1pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCisjZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAltaXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXAKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCisJCQkJCV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCSZtaXBzX2VsZjMyX2Vjb2ZmX2RlYnVnX3N3YXAKKworI2RlZmluZSBiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAorCQkJCQltaXBzX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZQlfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIGJmZF9lbGYzMl9zZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCisJCQkJCW1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCW1pcHNfZWxmX2ZpbmFsX2xpbmsKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAorCQkJCQlfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAorCQkJCQlfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwlfYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCisJCQkJCV9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKKwkJCQkJbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCW1pcHNfZWxmX2NoZWNrX3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAorCQkJCQltaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAorCQkJCQltaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAorCQkJCQltaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgltaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIFwKKwkJCQkJbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKKwkJCQkJbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKKwkJCQkJbWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCW1pcHNfZWxmX2djX21hcmtfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCW1pcHNfZWxmX2djX3N3ZWVwX2hvb2sKKworI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJKDQqTUlQU19SRVNFUlZFRF9HT1ROTykKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCTAKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXBwYy5jIGIvYmZkL2VsZjMyLXBwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmIyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItcHBjLmMKQEAgLTAsMCArMSwzODQ4IEBACisvKiBQb3dlclBDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKKyAgIENvcHlyaWdodCAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGEgcHJlbGltaW5hcnkgUG93ZXJQQyBFTEYgQUJJLiAgVGhlCisgICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBQb3dlclBDIEVMRiBBQkkuICBJdCBpbmNsdWRlcworICAgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgaW4tcHJvZ3Jlc3MgRW1iZWRkZWQgUG93ZXJQQyBBQkksIGFuZCB0aGF0CisgICBpbmZvcm1hdGlvbiBtYXkgYWxzbyBub3QgbWF0Y2guICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvcHBjLmgiCisKKyNkZWZpbmUgVVNFX1JFTEEJCS8qIHdlIHdhbnQgUkVMQSByZWxvY2F0aW9ucywgbm90IFJFTCAqLworCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICpwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKK3N0YXRpYyB2b2lkIHBwY19lbGZfaW5mb190b19ob3d0bworICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKmNhY2hlX3B0ciwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0KSk7CitzdGF0aWMgdm9pZCBwcGNfZWxmX2hvd3RvX2luaXQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7CitzdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKworc3RhdGljIGludCBwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOworCitzdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgUEFSQU1TICgoYmZkICosCisJCQkJCQkgIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKKwkJCQkJCSAgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKikpOworCitzdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKwkgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfY2hlY2tfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgICAgYXNlY3Rpb24gKiwKKwkJCQkJICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CisKK3N0YXRpYyBhc2VjdGlvbiAqIHBwY19lbGZfZ2NfbWFya19ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorCQkJCQkJRWxmX0ludGVybmFsX1JlbGEgKnJlbCwKKwkJCQkJCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAorCQkJCQkJRWxmX0ludGVybmFsX1N5bSAqc3ltKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfZ2Nfc3dlZXBfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsCisJCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAorCQkJCQkgICAgICBhc2VjdGlvbiAqc2VjLAorCQkJCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfYWRqdXN0X2R5bmluZHggUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwKKwkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKwkJCQkJCSBiZmQgKiwKKwkJCQkJCSBhc2VjdGlvbiAqLAorCQkJCQkJIGJmZF9ieXRlICosCisJCQkJCQkgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywKKwkJCQkJCSBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zLAorCQkJCQkJIGFzZWN0aW9uICoqKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfYWRkX3N5bWJvbF9ob29rICBQQVJBTVMgKChiZmQgKiwKKwkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkJIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKKwkJCQkJCSBjb25zdCBjaGFyICoqLAorCQkJCQkJIGZsYWd3b3JkICosCisJCQkJCQkgYXNlY3Rpb24gKiosCisJCQkJCQkgYmZkX3ZtYSAqKSk7CisKK3N0YXRpYyBib29sZWFuIHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCisJCQkJCQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKKworc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisjZGVmaW5lIEJSQU5DSF9QUkVESUNUX0JJVCAweDIwMDAwMAkJLyogYnJhbmNoIHByZWRpY3Rpb24gYml0IGZvciBicmFuY2ggdGFrZW4gcmVsb2NzICovCisjZGVmaW5lIFJBX1JFR0lTVEVSX01BU0sgMHgwMDFmMDAwMAkJLyogbWFzayB0byBzZXQgUkEgaW4gbWVtb3J5IGluc3RydWN0aW9ucyAqLworI2RlZmluZSBSQV9SRUdJU1RFUl9TSElGVCAxNgkJCS8qIHZhbHVlIHRvIHNoaWZ0IHJlZ2lzdGVyIGJ5IHRvIGluc2VydCBSQSAqLworCisvKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCisgICBzZWN0aW9uLiAgKi8KKworI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28uMSIKKworLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKKy8qIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBsdCByZXNlcnZlZCBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KKyNkZWZpbmUgUExUX0lOSVRJQUxfRU5UUllfU0laRSA3MgorLyogVGhlIHNpemUgb2YgdGhlIGdhcCBiZXR3ZWVuIGVudHJpZXMgaW4gdGhlIFBMVC4gICovCisjZGVmaW5lIFBMVF9TTE9UX1NJWkUgOAorLyogVGhlIG51bWJlciBvZiBzaW5nbGUtc2xvdCBQTFQgZW50cmllcyAodGhlIHJlc3QgdXNlIHR3byBzbG90cykuICAqLworI2RlZmluZSBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTIDgxOTIKKworDAorc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpUl9QUENfbWF4IF07CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIHBwY19lbGZfaG93dG9fcmF3W10gPQoreworICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCisgIEhPV1RPIChSX1BQQ19OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19OT05FIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0FERFIzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfQUREUjMyIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQW4gYWJzb2x1dGUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4KKyAgICAgRklYTUU6IHdlIGRvbid0IGNoZWNrIHRoYXQsIHdlIGp1c3QgY2xlYXIgdGhlbS4gICovCisgIEhPV1RPIChSX1BQQ19BRERSMjQsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0FERFIyNCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSBzdGFuZGFyZCAxNiBiaXQgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX1BQQ19BRERSMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0FERFIxNiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAxNiBiaXQgcmVsb2NhdGlvbiB3aXRob3V0IG92ZXJmbG93LiAgKi8KKyAgSE9XVE8gKFJfUFBDX0FERFIxNl9MTywJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfQUREUjE2X0xPIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuICAqLworICBIT1dUTyAoUl9QUENfQUREUjE2X0hJLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0FERFIxNl9ISSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLCBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mCisgICAgIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsIGlzIG5lZ2F0aXZlLgkqLworICBIT1dUTyAoUl9QUENfQUREUjE2X0hBLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfQUREUjE2X0hBIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgorICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0FERFIxNCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfQUREUjE0IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBbiBhYnNvbHV0ZSAxNiBiaXQgYnJhbmNoLCBmb3Igd2hpY2ggYml0IDEwIHNob3VsZCBiZSBzZXQgdG8KKyAgICAgaW5kaWNhdGUgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuLglUaGUgbG93ZXIgdHdvCisgICAgIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KKyAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUlRBS0VOLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0FERFIxNF9CUlRBS0VOIiwvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bworICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyCisgICAgIHR3byBiaXRzIG11c3QgYmUgemVyby4gICovCisgIEhPV1RPIChSX1BQQ19BRERSMTRfQlJOVEFLRU4sIC8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfQUREUjE0X0JSTlRBS0VOIiwvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgcmVsYXRpdmUgMjYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCisgIEhPV1RPIChSX1BQQ19SRUwyNCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfUkVMMjQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCSAqLworICBIT1dUTyAoUl9QUENfUkVMMTQsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1JFTDE0IiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0CisgICAgIHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZQorICAgICB6ZXJvLiAgKi8KKyAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfUkVMMTRfQlJUQUtFTiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSByZWxhdGl2ZSAxNiBiaXQgYnJhbmNoLglCaXQgMTAgc2hvdWxkIGJlIHNldCB0byBpbmRpY2F0ZSB0aGF0CisgICAgIHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLiAgVGhlIGxvd2VyIHR3byBiaXRzIG11c3QKKyAgICAgYmUgemVyby4gICovCisgIEhPV1RPIChSX1BQQ19SRUwxNF9CUk5UQUtFTiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19SRUwxNF9CUk5UQUtFTiIsLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvciB0aGUKKyAgICAgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0dPVDE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfR09UMTYiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgorICAgICB0aGUgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0dPVDE2X0xPLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfR09UMTZfTE8iLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCisgICAgIHRoZSBzeW1ib2wuICAqLworICBIT1dUTyAoUl9QUENfR09UMTZfSEksCS8qIHR5cGUgKi8KKwkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0dPVDE2X0hJIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKKyAgICAgdGhlIHN5bWJvbC4gICovCisgIEhPV1RPIChSX1BQQ19HT1QxNl9IQSwJLyogdHlwZSAqLworCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19HT1QxNl9IQSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHJlZmVycmluZyB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKKyAgICAgZW50cnkgZm9yIHRoZSBzeW1ib2wuICAqLworICBIT1dUTyAoUl9QUENfUExUUkVMMjQsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1BMVFJFTDI0IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGlzIGlzIHVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGUgc3ltYm9sIHNob3VsZCBleGlzdAorICAgICBib3RoIGluIHRoZSBvYmplY3QgYmVpbmcgcnVuIGFuZCBpbiBzb21lIHNoYXJlZCBsaWJyYXJ5LiAgVGhlCisgICAgIGR5bmFtaWMgbGlua2VyIGNvcGllcyB0aGUgZGF0YSBhZGRyZXNzZWQgYnkgdGhlIHN5bWJvbCBmcm9tIHRoZQorICAgICBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBvYmplY3QsIGJlY2F1c2UgdGhlIG9iamVjdCBiZWluZworICAgICBydW4gaGFzIHRvIGhhdmUgdGhlIGRhdGEgYXQgc29tZSBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLworICBIT1dUTyAoUl9QUENfQ09QWSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0NPUFkiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgdXNlZCB3aGVuIHNldHRpbmcgZ2xvYmFsIG9mZnNldCB0YWJsZQorICAgICBlbnRyaWVzLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0dMT0JfREFULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19HTE9CX0RBVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIE1hcmtzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgZm9yIGEgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0pNUF9TTE9ULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCSAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19KTVBfU0xPVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBVc2VkIG9ubHkgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgV2hlbiB0aGUgb2JqZWN0IGlzIHJ1biwgdGhpcworICAgICBsb25nd29yZCBpcyBzZXQgdG8gdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LCBwbHVzIHRoZQorICAgICBhZGRlbmQuICAqLworICBIT1dUTyAoUl9QUENfUkVMQVRJVkUsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1JFTEFUSVZFIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTGlrZSBSX1BQQ19SRUwyNCwgYnV0IHVzZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aGluIHRoZQorICAgICBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIGZpbmFsIHZhbHVlLiAgTm9ybWFsbHkgdXNlZCBmb3IKKyAgICAgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0xPQ0FMMjRQQywJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMjYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19MT0NBTDI0UEMiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExpa2UgUl9QUENfQUREUjMyLCBidXQgbWF5IGJlIHVuYWxpZ25lZC4gICovCisgIEhPV1RPIChSX1BQQ19VQUREUjMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19VQUREUjMyIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTGlrZSBSX1BQQ19BRERSMTYsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KKyAgSE9XVE8gKFJfUFBDX1VBRERSMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1VBRERSMTYiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyLWJpdCBQQyByZWxhdGl2ZSAqLworICBIT1dUTyAoUl9QUENfUkVMMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfUkVMMzIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzItYml0IHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgorICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KKyAgSE9XVE8gKFJfUFBDX1BMVDMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19QTFQzMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzItYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdG8gdGhlIHN5bWJvbCdzIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgorICAgICBGSVhNRTogbm90IHN1cHBvcnRlZC4gKi8KKyAgSE9XVE8gKFJfUFBDX1BMVFJFTDMyLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfUExUUkVMMzIiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTGlrZSBSX1BQQ19BRERSMTZfTE8sIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKKyAgICAgdGhlIHN5bWJvbC4gICovCisgIEhPV1RPIChSX1BQQ19QTFQxNl9MTywJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1BMVDE2X0xPIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMaWtlIFJfUFBDX0FERFIxNl9ISSwgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgorICAgICB0aGUgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKFJfUFBDX1BMVDE2X0hJLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19QTFQxNl9ISSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExpa2UgUl9QUENfQUREUjE2X0hBLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCisgICAgIHRoZSBzeW1ib2wuICAqLworICBIT1dUTyAoUl9QUENfUExUMTZfSEEsCS8qIHR5cGUgKi8KKwkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfUExUMTZfSEEiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgc2lnbi1leHRlbmRlZCAxNiBiaXQgdmFsdWUgcmVsYXRpdmUgdG8gX1NEQV9CQVNFXywgZm9yIHVzZSB3aXRoCisgICAgIHNtYWxsIGRhdGEgaXRlbXMuICAqLworICBIT1dUTyAoUl9QUENfU0RBUkVMMTYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1NEQVJFTDE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMi1iaXQgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLworICBIT1dUTyAoUl9QUENfU0VDVE9GRiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19TRUNUT0ZGIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2LWJpdCBsb3dlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KKyAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfTE8sCSAgLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1NFQ1RPRkZfTE8iLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2LWJpdCB1cHBlciBoYWxmIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KKyAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEksCS8qIHR5cGUgKi8KKwkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1NFQ1RPRkZfSEkiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNi1iaXQgdXBwZXIgaGFsZiBhZGp1c3RlZCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCisgIEhPV1RPIChSX1BQQ19TRUNUT0ZGX0hBLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1NFQ1RPRkZfSEEiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAorICAgICBpbiB0aGUgU1ZSNCBFTEYgQUJJLiAgKi8KKworICAvKiAzMiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCisgIEhPV1RPIChSX1BQQ19FTUJfTkFERFIzMiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19FTUJfTkFERFIzMiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KKyAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0VNQl9OQUREUjE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFkZGVuZCBtaW51cyB0aGUgc3ltYm9sICovCisgIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9MTywJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfRU1CX0FERFIxNl9MTyIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhlIGhpZ2ggb3JkZXIgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KKyAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hJLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0VNQl9OQUREUjE2X0hJIiwgLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFkZGVuZCBtaW51cyB0aGUgYWRkcmVzcywKKyAgICAgcGx1cyAxIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgbG93IDE2IGJpdHMsIHRyZWF0ZWQgYXMgYSBzaWduZWQgbnVtYmVyLAorICAgICBpcyBuZWdhdGl2ZS4gICovCisgIEhPV1RPIChSX1BQQ19FTUJfTkFERFIxNl9IQSwJLyogdHlwZSAqLworCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0VNQl9OQUREUjE2X0hBIiwgLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KKyAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCisgICAgIF9TREFfQkFTRV8gZm9yIHRoYXQgcmVsb2NhdGlvbiAqLworICBIT1dUTyAoUl9QUENfRU1CX1NEQUkxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19FTUJfU0RBSTE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgdmFsdWUgcmVzdWx0aW5nIGZyb20gYWxsb2NhdGluZyBhIDQgYnl0ZSB3b3JkIHRvIGhvbGQgYW4KKyAgICAgYWRkcmVzcyBpbiB0aGUgLnNkYXRhMiBzZWN0aW9uLCBhbmQgcmV0dXJuaW5nIHRoZSBvZmZzZXQgZnJvbQorICAgICBfU0RBMl9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCisgIEhPV1RPIChSX1BQQ19FTUJfU0RBMkkxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19FTUJfU0RBMkkxNiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBMl9CQVNFXywgZm9yIHVzZSB3aXRoCisgICAgIHNtYWxsIGRhdGEgaXRlbXMuCSAqLworICBIT1dUTyAoUl9QUENfRU1CX1NEQTJSRUwsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0VNQl9TREEyUkVMIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBSZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfIG9yIF9TREEyX0JBU0VfLCBmaWxsaW5nIGluIHRoZSAxNiBiaXQKKyAgICAgc2lnbmVkIG9mZnNldCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBiYXNlLCBhbmQgZmlsbGluZyBpbiB0aGUgcmVnaXN0ZXIKKyAgICAgZmllbGQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgKDAsIDIsIG9yIDEzKS4gICovCisgIEhPV1RPIChSX1BQQ19FTUJfU0RBMjEsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0VNQl9TREEyMSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX01SS1JFRiAqLworICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU0VDMTYgKi8KKyAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0xPICovCisgIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9ISSAqLworICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfSEEgKi8KKyAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX0JJVF9GTEQgKi8KKworICAvKiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcKKyAgICAgaW4gdGhlIDE2IGJpdCBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZQorICAgICByZWdpc3RlciBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KKyAgSE9XVE8gKFJfUFBDX0VNQl9SRUxTREEsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9QUENfRU1CX1JFTFNEQSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KKyAgSE9XVE8gKFJfUFBDX0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KKyAgSE9XVE8gKFJfUFBDX0dOVV9WVEVOVFJZLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1BQQ19HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBQaG9ueSByZWxvYyB0byBoYW5kbGUgQUlYIHN0eWxlIFRPQyBlbnRyaWVzICovCisgIEhPV1RPIChSX1BQQ19UT0MxNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfUFBDX1RPQzE2IiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCit9OworCisMCisvKiBJbml0aWFsaXplIHRoZSBwcGNfZWxmX2hvd3RvX3RhYmxlLCBzbyB0aGF0IGxpbmVhciBhY2Nlc3NlcyBjYW4gYmUgZG9uZS4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfZWxmX2hvd3RvX2luaXQgKCkKK3sKKyAgdW5zaWduZWQgaW50IGksIHR5cGU7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHBjX2VsZl9ob3d0b19yYXcpIC8gc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3Jhd1swXSk7IGkrKykKKyAgICB7CisgICAgICB0eXBlID0gcHBjX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKKyAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZSkgLyBzaXplb2YocHBjX2VsZl9ob3d0b190YWJsZVswXSkpOworICAgICAgcHBjX2VsZl9ob3d0b190YWJsZVt0eXBlXSA9ICZwcGNfZWxmX2hvd3RvX3Jhd1tpXTsKKyAgICB9Cit9CisKKwwKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIFBQQyB3aXRoIG9wdGlvbiAtLW1wYzg2MGMwWz08bj5dLgorCisgICBUaGUgTVBDODYwLCByZXZpc2lvbiBDMCBvciBlYXJsaWVyIGNvbnRhaW5zIGEgYnVnIGluIHRoZSBkaWUuCisgICBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlLCB0aGUgbmV4dCBpbnN0cnVjdGlvbgorICAgdG8gYmUgZXhlY3V0ZWQgKm1heSogYmUgdHJlYXRlZCBhcyBhIG5vLW9wLgorICAgMS8gQSBmb3J3YXJkIGJyYW5jaCBpcyBleGVjdXRlZC4KKyAgIDIvIFRoZSBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdCB0YWtlbi4KKyAgIDMvIFRoZSBicmFuY2ggaXMgdGFrZW4uCisgICA0LyBUaGUgYnJhbmNoIGlzIGxvY2F0ZWQgaW4gdGhlIGxhc3QgNSB3b3JkcyBvZiBhIHBhZ2UuCisgICAgICAoVGhlIEVPUCBsaW1pdCBpcyA1IGJ5IGRlZmF1bHQgYnV0IG1heSBiZSBzcGVjaWZpZWQgYXMgYW55IHZhbHVlIGZyb20gMS0xMC4pCisgICAKKyAgIE91ciBzb2Z0d2FyZSBzb2x1dGlvbiBpcyB0byBkZXRlY3QgdGhlc2UgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gYQorICAgbGlua2VyIHBhc3MgYW5kIG1vZGlmeSB0aGVtIGFzIGZvbGxvd3M6CisgICAxLyBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIC0gU2luY2UgdGhlc2UgYXJlIGFsd2F5cyBwcmVkaWN0ZWQgdGFrZW4sCisgICAgICB0aGVyZSBpcyBubyBwcm9ibGVtIGFuZCBubyBhY3Rpb24gaXMgcmVxdWlyZWQuCisgICAyLyBDb25kaXRpb25hbCBiYWNrd2FyZCBicmFuY2hlcyAtIE5vIHByb2JsZW0sIG5vIGFjdGlvbiByZXF1aXJlZC4KKyAgIDMvIENvbmRpdGlvbmFsIGZvcndhcmQgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgImludmVyc2UgcHJlZGljdGlvbgorICAgICAgYml0IiBpcyBzZXQgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgorICAgNC8gQ29uZGl0aW9uYWwgcmVnaXN0ZXIgYnJhbmNoZXMgLSBFbnN1cmUgdGhhdCB0aGUgInkgYml0IiBpcyBzZXQKKyAgICAgIChlbnN1cmUgaXQgaXMgcHJlZGljdGVkIHRha2VuKS4KKyovCisKKy8qIFNvcnQgc2VjdGlvbnMgYnkgYWRkcmVzcy4gICovCisKK3N0YXRpYyBpbnQKK3BwY19lbGZfc29ydF9yZWxhIChhcmcxLCBhcmcyKQorICAgIGNvbnN0IHZvaWQgKmFyZzE7CisgICAgY29uc3Qgdm9pZCAqYXJnMjsKK3sKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhMSA9IChjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSoqKSBhcmcxOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGEyID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzI7CisKKyAgLyogU29ydCBieSBvZmZzZXQuICovCisgIHJldHVybiAoKCpyZWxhMSktPnJfb2Zmc2V0IC0gKCpyZWxhMiktPnJfb2Zmc2V0KTsKK30KKworc3RhdGljIGJvb2xlYW4KK3BwY19lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaXNlYywgbGlua19pbmZvLCBhZ2FpbikKKyAgICBiZmQgKmFiZmQ7CisgICAgYXNlY3Rpb24gKmlzZWM7CisgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICBib29sZWFuICphZ2FpbjsKK3sKKyNkZWZpbmUgUEFHRVNJWkUgMHgxMDAwCisKKyAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKKyAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKipyZWxhX2NvbWIgPSBOVUxMOworICBpbnQgY29tYl9jdXJyLCBjb21iX2NvdW50OworCisgIC8qIFdlIG5ldmVyIGhhdmUgdG8gZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBwZXIgaW5wdXQgc2VjdGlvbi4gKi8KKyAgKmFnYWluID0gZmFsc2U7CisKKyAgLyogSWYgbmVlZGVkLCBpbml0aWFsaXplIHRoaXMgc2VjdGlvbidzIGNvb2tlZCBzaXplLiAgKi8KKyAgaWYgKGlzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQorICAgICAgaXNlYy0+X2Nvb2tlZF9zaXplID0gaXNlYy0+X3Jhd19zaXplOworCisgIC8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0ZXh0IHNlY3Rpb25zIHdoaWNoIG92ZXJsYXAgdGhlCisgIHRyb3VibGVzb21lIGFyZWEgYXQgdGhlIGVuZCBvZiBhIHBhZ2UuICovCisgIGlmIChsaW5rX2luZm8tPm1wYzg2MGMwICYmIChpc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAmJiBpc2VjLT5fY29va2VkX3NpemUpCisgICAgeworICAgICAgYmZkX3ZtYSBkb3QsIGVuZF9wYWdlLCBlbmRfc2VjdGlvbjsKKyAgICAgIGJvb2xlYW4gc2VjdGlvbl9tb2RpZmllZDsKKworICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAqLworICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCisgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCisJICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50czsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCisJICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpc2VjLT5fcmF3X3NpemUpOworCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJICAgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7CisKKwkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaXNlYywgY29udGVudHMsCisJCQkJCSAgKGZpbGVfcHRyKSAwLCBpc2VjLT5fcmF3X3NpemUpKQorCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgY29tYl9jdXJyID0gMDsKKyAgICAgIGNvbWJfY291bnQgPSAwOworICAgICAgaWYgKGlzZWMtPnJlbG9jX2NvdW50KQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgbjsKKworICAgICAgICAgIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCisgICAgICAgICAgaW50ZXJuYWxfcmVsb2NzID0gX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzICgKKyAgICAJICAgIGFiZmQsIGlzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCAKKyAgICAJICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpOworICAgICAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKyAgICAJICAgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKyAgICAJICAgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisgICAgCisgICAgICAgICAgLyogU2V0dXAgYSBmYXN0ZXIgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHJlbG9jIGluZm8gd2UgbmVlZC4gKi8KKyAgICAgICAgICByZWxhX2NvbWIgPSAoRWxmX0ludGVybmFsX1JlbGEqKikKKwkgICAgYmZkX21hbGxvYyAoaXNlYy0+cmVsb2NfY291bnQqc2l6ZW9mKEVsZl9JbnRlcm5hbF9SZWxhKikpOworICAgICAgICAgIGlmIChyZWxhX2NvbWIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgICAgICAgZm9yIChuPTA7IG48aXNlYy0+cmVsb2NfY291bnQ7ICsrbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbG9uZyByX3R5cGU7CisgICAgCisgICAgICAgICAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaW50ZXJuYWxfcmVsb2NzW25dLnJfaW5mbyk7CisgICAgICAgICAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfUFBDX21heCkKKyAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgIAorICAgICAgICAgICAgICAvKiBQcm9sb2d1ZSBjb25zdGFudHMgYXJlIHNvbWV0aW1lcyBwcmVzZW50IGluIHRoZSAiLnRleHQiCisgICAgICAgICAgICAgIHNlY3Rpb25zIGFuZCB0aGV5IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGFzc29jaWF0ZWQgcmVsb2NhdGlvbi4KKyAgICAgICAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBwcm9jZXNzIHRob3NlIHdvcmRzIGFuZCBzb21lIG90aGVycyB3aGljaAorICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHJlbG9jYXRpb25zLiAgSG93ZXZlciwgbm90IGFsbAorICAgICAgICAgICAgICBjb25kaXRpb25hbCBicmFuY2hlcyB3aWxsIGhhdmUgYSByZWxvY2F0aW9uIHNvIHdlIHdpbGwKKyAgICAgICAgICAgICAgb25seSBpZ25vcmUgd29yZHMgdGhhdCAxKSBoYXZlIGEgcmVsb2MsIGFuZCAyKSB0aGUgcmVsb2MKKyAgICAgICAgICAgICAgaXMgbm90IGFwcGxpY2FibGUgdG8gYSBjb25kaXRpb25hbCBicmFuY2guCisgICAgICAgICAgICAgIFRoZSBhcnJheSByZWxhX2NvbWIgaXMgYnVpbHQgaGVyZSBmb3IgdXNlIGluIHRoZSBFT1Agc2NhbiBsb29wLiAqLworICAgICAgICAgICAgICBzd2l0Y2ggKHJfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19BRERSMTRfQlJOVEFLRU46ICAgICAvKiBhYnNvbHV0ZSwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLworICAgICAgICAgICAgICAgIGNhc2UgUl9QUENfUkVMMTQ6ICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgY29uZC4gYnIuICovCisgICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNF9CUk5UQUtFTjogICAgICAvKiByZWwuIGNvbmQuIGJyLiwgcHJlZGljdGVkIG5vdCB0YWtlbiAqLworICAgICAgICAgICAgICAgICAgLyogV2Ugc2hvdWxkIGNoZWNrIHRoZSBpbnN0cnVjdGlvbi4gKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAvKiBUaGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2ggLSBpZ25vcmUgaXQuICovCisgICAgICAgICAgICAgICAgICByZWxhX2NvbWJbY29tYl9jb3VudCsrXSA9ICZpbnRlcm5hbF9yZWxvY3Nbbl07CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNvbWJfY291bnQgPiAxKQorICAgICAgICAgICAgICBxc29ydCAocmVsYV9jb21iLCAoc2l6ZV90KSBjb21iX2NvdW50LCBzaXplb2YgKGludCksIHBwY19lbGZfc29ydF9yZWxhKTsKKyAgICAgICAgfQorCisgICAgICAvKiBFbnVtZXJhdGUgZWFjaCBFT1AgcmVnaW9uIHRoYXQgb3ZlcmxhcHMgdGhpcyBzZWN0aW9uLiAqLworICAgICAgZW5kX3NlY3Rpb24gPSBpc2VjLT52bWEgKyBpc2VjLT5fY29va2VkX3NpemU7CisgICAgICBkb3QgPSBlbmRfcGFnZSA9IChpc2VjLT52bWEgfCAoUEFHRVNJWkUgLSAxKSkgKyAxOworICAgICAgZG90IC09IGxpbmtfaW5mby0+bXBjODYwYzA7CisgICAgICBzZWN0aW9uX21vZGlmaWVkID0gZmFsc2U7CisgICAgICBpZiAoZG90IDwgaXNlYy0+dm1hKSAgICAgIC8qIEluY3JlbWVudCB0aGUgc3RhcnQgcG9zaXRpb24gaWYgdGhpcyBzZWN0aW9uICovCisgICAgICAgICAgZG90ID0gaXNlYy0+dm1hOyAgICAgIC8qIGJlZ2lucyBpbiB0aGUgbWlkZGxlIG9mIGl0cyBmaXJzdCBFT1AgcmVnaW9uLiAqLworICAgICAgZm9yICg7CisgICAgICAgICAgIGRvdCA8IGVuZF9zZWN0aW9uOworICAgICAgICAgICBkb3QgKz0gUEFHRVNJWkUsIGVuZF9wYWdlICs9IFBBR0VTSVpFKQorICAgICAgICB7CisKKyAgICAgICAgICAvKiBDaGVjayBlYWNoIHdvcmQgaW4gdGhpcyBFT1AgcmVnaW9uLiAqLworICAgICAgICAgIGZvciAoOyBkb3QgPCBlbmRfcGFnZTsgZG90ICs9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJmZF92bWEgaXNlY19vZmZzZXQ7CisgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgICAgICAgICAgYm9vbGVhbiBza2lwLCBtb2RpZmllZDsKKworICAgICAgICAgICAgICAvKiBEb24ndCBwcm9jZXNzIHRoaXMgd29yZCBpZiB0aGVyZSBpcyBhIHJlbG9jYXRpb24gZm9yIGl0IGFuZAorICAgICAgICAgICAgICB0aGUgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhlIHdvcmQgaXMgbm90IGEgY29uZGl0aW9uYWwgYnJhbmNoLiAqLworICAgICAgICAgICAgICBza2lwID0gZmFsc2U7CisgICAgICAgICAgICAgIGlzZWNfb2Zmc2V0ID0gZG90IC0gaXNlYy0+dm1hOworICAgICAgICAgICAgICBmb3IgKDsgY29tYl9jdXJyPGNvbWJfY291bnQ7ICsrY29tYl9jdXJyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJmZF92bWEgcl9vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgIHJfb2Zmc2V0ID0gcmVsYV9jb21iW2NvbWJfY3Vycl0tPnJfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID49IGlzZWNfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHJfb2Zmc2V0ID09IGlzZWNfb2Zmc2V0KSBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNraXApIGNvbnRpbnVlOworCisgICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBjdXJyZW50IHdvcmQgZm9yIGEgcHJvYmxlbWF0aWMgY29uZGl0aW9uYWwgYnJhbmNoLiAqLworI2RlZmluZSBCTzAoaW5zbikgKChpbnNuKSAmIDB4MDIwMDAwMDApCisjZGVmaW5lIEJPMihpbnNuKSAoKGluc24pICYgMHgwMDgwMDAwMCkKKyNkZWZpbmUgQk80KGluc24pICgoaW5zbikgJiAweDAwMjAwMDAwKQorICAgICAgICAgICAgICBpbnNuID0gKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOworICAgICAgICAgICAgICBtb2RpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgICBpZiAoKGluc24gJiAweEZjMDAwMDAwKSA9PSAweDQwMDAwMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDeCAqLworICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hIHRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgIm5vcm1hbCIuCisgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4gKi8KKworICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGluc24gJiAweDAwMDBGZmZjOyAgICAgICAgICAgICAgIC8qZXh0cmFjdCovCisgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKHRhcmdldCBeIDB4ODAwMCkgLSAweDgwMDA7ICAgICAgLypzaWduIGV4dGVuZCovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgMHgwMDAwMDAwMikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IGRvdDsgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbnZlcnQgdG8gYWJzKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gZG90KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhGYzAwRmZmZSkgPT0gMHg0YzAwMDQyMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBJbnN0cnVjdGlvbiBpcyBCQ0NUUnggKi8KKyAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQorCQkgICAgeworCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgorCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgorICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAorICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLworICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwMDIwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDTFJ4ICovCisgICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KKwkJICAgICAgSWYgdGhpcyBpcyBhIGZvcndhcmQgYnJhbmNoLCBpdCBpcyBwcm9ibGVtYXRpYy4KKyAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB3ZSBjYW4ndCB0ZWxsIHN0YXRpY2FsbHkgaWYgaXQgd2lsbCBicmFuY2ggZm9yd2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoZSBwcmVkaWN0aW9uIGJpdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnNuIHw9IDB4MDAyMDAwMDA7ICAgLyogc2V0IHRoZSBwcmVkaWN0aW9uIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9CisjdW5kZWYgQk8wCisjdW5kZWYgQk8yCisjdW5kZWYgQk80CisgICAgICAgICAgICAgIGlmIChtb2RpZmllZCkKKwkgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgaXNlY19vZmZzZXQpOworCQkgIHNlY3Rpb25fbW9kaWZpZWQgPSB0cnVlOworCSAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBpZiAoc2VjdGlvbl9tb2RpZmllZCkKKwl7CisJICBlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkgIGZyZWVfY29udGVudHMgPSBOVUxMOworCX0KKyAgICB9CisKKyAgaWYgKHJlbGFfY29tYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKHJlbGFfY29tYik7CisgICAgICByZWxhX2NvbWIgPSBOVUxMOworICAgIH0KKworICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKwlmcmVlIChmcmVlX2NvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOworCX0KKyAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKKworZXJyb3JfcmV0dXJuOgorICBpZiAocmVsYV9jb21iICE9IE5VTEwpCisgICAgZnJlZSAocmVsYV9jb21iKTsKKyAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9yZWxvY3MpOworICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfY29udGVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKwwKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK3BwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIGVudW0gZWxmX3BwY19yZWxvY190eXBlIHBwY19yZWxvYyA9IFJfUFBDX05PTkU7CisKKyAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlW1JfUFBDX0FERFIzMl0pCisgICAgLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KKyAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7CisKKyAgc3dpdGNoICgoaW50KWNvZGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKilOVUxMOworCisgICAgY2FzZSBCRkRfUkVMT0NfTk9ORToJCXBwY19yZWxvYyA9IFJfUFBDX05PTkU7CQkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CQkJcHBjX3JlbG9jID0gUl9QUENfQUREUjMyOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMjY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMjQ7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18xNjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTY7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0xPOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNl9ISTsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNl9IQTsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE0OwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTjoJcHBjX3JlbG9jID0gUl9QUENfQUREUjE0X0JSVEFLRU47CWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJOVEFLRU47CWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMjY6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwyNDsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNDsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTjoJcHBjX3JlbG9jID0gUl9QUENfUkVMMTRfQlJUQUtFTjsJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTjoJcHBjX3JlbG9jID0gUl9QUENfUkVMMTRfQlJOVEFLRU47CWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2OwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfTE8xNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9MTzsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTZfSEk7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGOglwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9IQTsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTDoJcHBjX3JlbG9jID0gUl9QUENfUExUUkVMMjQ7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19QUENfQ09QWToJCXBwY19yZWxvYyA9IFJfUFBDX0NPUFk7CQkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0dMT0JfREFUOglwcGNfcmVsb2MgPSBSX1BQQ19HTE9CX0RBVDsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEM6CXBwY19yZWxvYyA9IFJfUFBDX0xPQ0FMMjRQQzsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfUkVMMzI7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19QTFQzMjsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDoJcHBjX3JlbG9jID0gUl9QUENfUExUUkVMMzI7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0xPOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9QTFRPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19QTFQxNl9ISTsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkY6CXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hBOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1NEQVJFTDE2OwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfMzJfQkFTRVJFTDoJCXBwY19yZWxvYyA9IFJfUFBDX1NFQ1RPRkY7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUw6CXBwY19yZWxvYyA9IFJfUFBDX1NFQ1RPRkZfTE87CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUw6CXBwY19yZWxvYyA9IFJfUFBDX1NFQ1RPRkZfSEk7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9IQTsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19UT0MxNjsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMzI7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2OwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIxNl9MTzsJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIxNl9ISTsJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIxNl9IQTsJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREFJMTY7CQlicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEySTE2OwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfU0RBMlJFTDsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyMTsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTVJLUkVGOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1JFTFNFQzE2OwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTzoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1JFTFNUX0xPOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1JFTFNUX0hJOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1JFTFNUX0hBOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxEOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfQklUX0ZMRDsJCWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0RBOwkJYnJlYWs7CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dOVV9WVElOSEVSSVQ7CWJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZURU5UUlk7CQlicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcHBjX3JlbG9jIF07Cit9OworCisvKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgUG93ZXJQQyBFTEYgcmVsb2MuICAqLworCitzdGF0aWMgdm9pZAorcHBjX2VsZl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KKyAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7CisKKyAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbykgPCAodW5zaWduZWQgaW50KSBSX1BQQ19tYXgpOworICBjYWNoZV9wdHItPmhvd3RvID0gcHBjX2VsZl9ob3d0b190YWJsZVtFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKV07Cit9CisKKy8qIEhhbmRsZSB0aGUgUl9QUENfQUREUjE2X0hBIHJlbG9jLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKworICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmVsb2NhdGlvbiA9IDA7CisgIGVsc2UKKyAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKKworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKworICByZWxvY19lbnRyeS0+YWRkZW5kICs9IChyZWxvY2F0aW9uICYgMHg4MDAwKSA8PCAxOworCisgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIHNldCB3aGV0aGVyIGEgbW9kdWxlIG5lZWRzIHRoZSAtbXJlbG9jYXRhYmxlIGJpdCBzZXQuICovCisKK3N0YXRpYyBib29sZWFuCitwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKKyAgICAgYmZkICphYmZkOworICAgICBmbGFnd29yZCBmbGFnczsKK3sKKyAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQorCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKKworICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOworICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQorCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKTsKKworICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAorICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nICovCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQ7CisgICAgIGJmZCAqb2JmZDsKK3sKKyAgZmxhZ3dvcmQgb2xkX2ZsYWdzOworICBmbGFnd29yZCBuZXdfZmxhZ3M7CisgIGJvb2xlYW4gZXJyb3I7CisKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KKyAgaWYgKGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKKyAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCisgICAgeworICAgICAgY29uc3QgY2hhciAqbXNnOworCisgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGliZmQpKQorCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iKTsKKyAgICAgIGVsc2UKKwltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIik7CisKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7CisgIG9sZF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOworICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkJLyogRmlyc3QgY2FsbCwgbm8gZmxhZ3Mgc2V0ICovCisgICAgeworICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKKyAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOworICAgIH0KKworICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQkvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLworICAgIDsKKworICBlbHNlCQkJCQkvKiBJbmNvbXBhdGlibGUgZmxhZ3MgKi8KKyAgICB7CisgICAgICAvKiBXYXJuIGFib3V0IC1tcmVsb2NhdGFibGUgbWlzbWF0Y2guICBBbGxvdyAtbXJlbG9jYXRhYmxlLWxpYiB0byBiZSBsaW5rZWQKKyAgICAgICAgIHdpdGggZWl0aGVyLiAgKi8KKyAgICAgIGVycm9yID0gZmFsc2U7CisgICAgICBpZiAoKG5ld19mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkgIT0gMAorCSAgJiYgKG9sZF9mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCKSkgPT0gMCkKKwl7CisJICBlcnJvciA9IHRydWU7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgbm9ybWFsbHkiKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKKwl9CisgICAgICBlbHNlIGlmICgobmV3X2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwCisJICAgICAgICYmIChvbGRfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEUpICE9IDApCisJeworCSAgZXJyb3IgPSB0cnVlOworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogY29tcGlsZWQgbm9ybWFsbHkgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisJfQorCisgICAgICAvKiBUaGUgb3V0cHV0IGlzIC1tcmVsb2NhdGFibGUtbGliIGlmZiBib3RoIHRoZSBpbnB1dCBmaWxlcyBhcmUuICAqLworICAgICAgaWYgKCEgKG5ld19mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKQorCWVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzICY9IH5FRl9QUENfUkVMT0NBVEFCTEVfTElCOworCisgICAgICAvKiBUaGUgb3V0cHV0IGlzIC1tcmVsb2NhdGFibGUgaWZmIGl0IGNhbid0IGJlIC1tcmVsb2NhdGFibGUtbGliLAorICAgICAgICAgYnV0IGVhY2ggaW5wdXQgZmlsZSBpcyBlaXRoZXIgLW1yZWxvY2F0YWJsZSBvciAtbXJlbG9jYXRhYmxlLWxpYi4gICovCisgICAgICBpZiAoISAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQorCSAgJiYgKG5ld19mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX1JFTE9DQVRBQkxFKSkKKwkgICYmIChvbGRfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19SRUxPQ0FUQUJMRSkpKQorCWVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRTsKKworICAgICAgLyogRG8gbm90IHdhcm4gYWJvdXQgZWFiaSB2cy4gVi40IG1pc21hdGNoLCBqdXN0IG9yIGluIHRoZSBiaXQgaWYgYW55IG1vZHVsZSB1c2VzIGl0ICovCisgICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyB8PSAobmV3X2ZsYWdzICYgRUZfUFBDX0VNQik7CisKKyAgICAgIG5ld19mbGFncyAmPSB+IChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX0VNQik7CisgICAgICBvbGRfZmxhZ3MgJj0gfiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiB8IEVGX1BQQ19FTUIpOworCisgICAgICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCisgICAgICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKKwl7CisJICBlcnJvciA9IHRydWU7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgKGxvbmcpbmV3X2ZsYWdzLCAobG9uZylvbGRfZmxhZ3MpOworCX0KKworICAgICAgaWYgKGVycm9yKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKwwKKy8qIEhhbmRsZSBhIFBvd2VyUEMgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCisgICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7CisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGFzZWN0aW9uICpuZXdzZWN0OworICBmbGFnd29yZCBmbGFnczsKKworICBpZiAoISBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBuZXdzZWN0ID0gaGRyLT5iZmRfc2VjdGlvbjsKKyAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QpOworICBpZiAoaGRyLT5zaF9mbGFncyAmIFNIRl9FWENMVURFKQorICAgIGZsYWdzIHw9IFNFQ19FWENMVURFOworCisgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX09SREVSRUQpCisgICAgZmxhZ3MgfD0gU0VDX1NPUlRfRU5UUklFUzsKKworICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsIGZsYWdzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKwwKKy8qIFNldCB1cCBhbnkgb3RoZXIgc2VjdGlvbiBmbGFncyBhbmQgc3VjaCB0aGF0IG1heSBiZSBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBzaGRyLCBhc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpzaGRyOworICAgICBhc2VjdGlvbiAqYXNlY3Q7Cit7CisgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApCisgICAgc2hkci0+c2hfZmxhZ3MgfD0gU0hGX0VYQ0xVREU7CisKKyAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfU09SVF9FTlRSSUVTKSAhPSAwKQorICAgIHNoZHItPnNoX3R5cGUgPSBTSFRfT1JERVJFRDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworDAorLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiAqLworc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90ICoKK3BwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSB3aGljaDsKK3sKKyAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OworCisgIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCisgIGlmICghZHlub2JqKQorICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKKworICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KKyAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOworICBpZiAoIWxzZWN0KQorICAgIHsKKyAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90IGRlZmF1bHRzOworICAgICAgc3RhdGljIGVsZl9saW5rZXJfc2VjdGlvbl90IHplcm9fc2VjdGlvbjsKKworICAgICAgZGVmYXVsdHMgPSB6ZXJvX3NlY3Rpb247CisgICAgICBkZWZhdWx0cy53aGljaCA9IHdoaWNoOworICAgICAgZGVmYXVsdHMuaG9sZV93cml0dGVuX3AgPSBmYWxzZTsKKyAgICAgIGRlZmF1bHRzLmFsaWdubWVudCA9IDI7CisKKyAgICAgIC8qIEJvdGggb2YgdGhlc2Ugc2VjdGlvbnMgYXJlICh0ZWNobmljYWxseSkgY3JlYXRlZCBieSB0aGUgdXNlcgorCSBwdXR0aW5nIGRhdGEgaW4gdGhlbSwgc28gdGhleSBzaG91bGRuJ3QgYmUgbWFya2VkCisJIFNFQ19MSU5LRVJfQ1JFQVRFRC4KKworCSBUaGUgbGlua2VyIGNyZWF0ZXMgdGhlbSBzbyBpdCBoYXMgc29tZXdoZXJlIHRvIGF0dGFjaCB0aGVpcgorCSByZXNwZWN0aXZlIHN5bWJvbHMuIEluIGZhY3QsIGlmIHRoZXkgd2VyZSBlbXB0eSBpdCB3b3VsZAorCSBiZSBPSyB0byBsZWF2ZSB0aGUgc3ltYm9sIHNldCB0byAwIChvciBhbnkgcmFuZG9tIG51bWJlciksIGJlY2F1c2UKKwkgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIHNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KKyAgICAgIGRlZmF1bHRzLmZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUworCQkJfCBTRUNfSU5fTUVNT1JZKTsKKworICAgICAgc3dpdGNoICh3aGljaCkKKwl7CisJZGVmYXVsdDoKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFVua25vd24gc3BlY2lhbCBsaW5rZXIgdHlwZSAlZCIpLAorCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkJCQkgKGludCl3aGljaCk7CisKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7CisKKwljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBOgkvKiAuc2RhdGEvLnNic3Mgc2VjdGlvbiAqLworCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEiOworCSAgZGVmYXVsdHMucmVsX25hbWUJICA9ICIucmVsYS5zZGF0YSI7CisJICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzIjsKKwkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQV9CQVNFXyI7CisJICBkZWZhdWx0cy5zeW1fb2Zmc2V0CSAgPSAzMjc2ODsKKwkgIGJyZWFrOworCisJY2FzZSBMSU5LRVJfU0VDVElPTl9TREFUQTI6CS8qIC5zZGF0YTIvLnNic3MyIHNlY3Rpb24gKi8KKwkgIGRlZmF1bHRzLm5hbWUJCSAgPSAiLnNkYXRhMiI7CisJICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhMiI7CisJICBkZWZhdWx0cy5ic3NfbmFtZQkgID0gIi5zYnNzMiI7CisJICBkZWZhdWx0cy5zeW1fbmFtZQkgID0gIl9TREEyX0JBU0VfIjsKKwkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OworCSAgZGVmYXVsdHMuZmxhZ3MJIHw9IFNFQ19SRUFET05MWTsKKwkgIGJyZWFrOworCX0KKworICAgICAgbHNlY3QgPSBfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoLCAmZGVmYXVsdHMpOworICAgIH0KKworICByZXR1cm4gbHNlY3Q7Cit9CisKKwwKKy8qIElmIHdlIGhhdmUgYSBub24temVybyBzaXplZCAuc2JzczIgb3IgLlBQQy5FTUIuc2JzczAgc2VjdGlvbnMsIHdlIG5lZWQgdG8gYnVtcCB1cAorICAgdGhlIG51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnMuICAqLworCitzdGF0aWMgaW50CitwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzZWN0aW9uICpzOworICBpbnQgcmV0OworCisgIHJldCA9IDA7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOworICBpZiAocyAhPSBOVUxMKQorICAgICsrcmV0OworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zYnNzMiIpOworICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCisgICAgKytyZXQ7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLlBQQy5FTUIuc2JzczAiKTsKKyAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCAmJiBzLT5fcmF3X3NpemUgPiAwKQorICAgICsrcmV0OworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIE1vZGlmeSB0aGUgc2VnbWVudCBtYXAgaWYgbmVlZGVkICovCisKK3N0YXRpYyBib29sZWFuCitwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFdlIGhhdmUgdG8gY3JlYXRlIC5keW5zYnNzIGFuZCAucmVsYS5zYnNzIGhlcmUgc28gdGhhdCB0aGV5IGdldCBtYXBwZWQKKyAgIHRvIG91dHB1dCBzZWN0aW9ucyAoanVzdCBsaWtlIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIGhhcworICAgdG8gY3JlYXRlIC5keW5ic3MgYW5kIC5yZWxhLmJzcykuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7CisgIGZsYWd3b3JkIGZsYWdzOworCisgIGlmICghX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMoYWJmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKKwkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisKKyAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc2JzcyIpOworICBpZiAocyA9PSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgU0VDX0FMTE9DKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEuc2JzcyIpOworICAgICAgaWYgKHMgPT0gTlVMTAorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCisgICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQorICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bworICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KKyAgIHVuZGVyc3RhbmQuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287CisgIGJmZF92bWEgcGx0X29mZnNldDsKKworI2lmZGVmIERFQlVHCisgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGNhbGxlZCBmb3IgJXNcbiIsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOworI2VuZGlmCisKKyAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KKyAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKKwkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKKwkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKKwkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKKwkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOworCisKKyAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKKyAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCisgICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KKyAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKKyAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCisgICAgeworICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKKwkgIHx8ICgoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQorCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQorCSAgfHwgKGluZm8tPnNoYXJlZCAmJiBoLT5wbHQucmVmY291bnQgPD0gMCkpCisJeworCSAgLyogQSBQTFQgZW50cnkgaXMgbm90IHJlcXVpcmVkL2FsbG93ZWQgd2hlbjoKKworCSAgICAgMS4gV2UgYXJlIG5vdCB1c2luZyBsZC5zbzsgYmVjYXVzZSB0aGVuIHRoZSBQTFQgZW50cnkKKwkgICAgIGNhbid0IGJlIHNldCB1cCwgc28gd2UgY2FuJ3QgdXNlIG9uZS4KKworCSAgICAgMi4gV2Uga25vdyBmb3IgY2VydGFpbiB0aGF0IGEgc3ltYm9sIGlzIGRlZmluZWQgaW4KKwkgICAgIHRoaXMgb2JqZWN0LCBiZWNhdXNlIHRoaXMgb2JqZWN0IGlzIHRoZSBhcHBsaWNhdGlvbiwKKwkgICAgIGlzIGxpbmtlZCB3aXRoIC1Cc3ltYm9saWMsIG9yIGJlY2F1c2UgdGhlIHN5bWJvbCBpcyBsb2NhbC4KKworCSAgICAgMy4gR0MgaGFzIHJlbmRlcmVkIHRoZSBlbnRyeSB1bnVzZWQuCisJICAgICBOb3RlLCBob3dldmVyLCB0aGF0IGluIGFuIGV4ZWN1dGFibGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlCisJICAgICBzeW1ib2wgZ28gdG8gdGhlIFBMVCwgc28gd2UgY2FuJ3QgdHVybiBpdCBvZmYgaW4gdGhhdCBjYXNlLgorCSAgICAgPz8/IFRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGhlcmUgaXMgdG8gcmVmZXJlbmNlIGNvdW50CisJICAgICBhbGwgdXNlcyBvZiB0aGUgc3ltYm9sLCBub3QganVzdCB0aG9zZSB0byB0aGUgR09UIG9yIFBMVC4gICovCisJICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgLnBsdCBlbnRyeSwgbWFrZSByb29tIGZvciB0aGUgc3BlY2lhbAorCSBmaXJzdCBlbnRyeS4gICovCisgICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCisJcy0+X3Jhd19zaXplICs9IFBMVF9JTklUSUFMX0VOVFJZX1NJWkU7CisKKyAgICAgIC8qIFRoZSBQb3dlclBDIFBMVCBpcyBhY3R1YWxseSBjb21wb3NlZCBvZiB0d28gcGFydHMsIHRoZSBmaXJzdCBwYXJ0CisJIGlzIDIgd29yZHMgKGZvciBhIGxvYWQgYW5kIGEganVtcCksIGFuZCB0aGVuIHRoZXJlIGlzIGEgcmVtYWluaW5nCisJIHdvcmQgYXZhaWxhYmxlIGF0IHRoZSBlbmQuICAqLworICAgICAgcGx0X29mZnNldCA9IChQTFRfSU5JVElBTF9FTlRSWV9TSVpFCisJCSAgICArIChQTFRfU0xPVF9TSVpFCisJCSAgICAgICAqICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkKKwkJCSAgLyBQTFRfRU5UUllfU0laRSkpKTsKKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKKwkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCisJIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCisJIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCisJIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisgICAgICBpZiAoISBpbmZvLT5zaGFyZWQKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOworCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHBsdF9vZmZzZXQ7CisJfQorCisgICAgICBoLT5wbHQub2Zmc2V0ID0gcGx0X29mZnNldDsKKworICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgQWZ0ZXIgdGhlIDgxOTJuZCBlbnRyeSwgcm9vbQorICAgICAgICAgZm9yIHR3byBlbnRyaWVzIGlzIGFsbG9jYXRlZC4gICovCisgICAgICBpZiAoKHMtPl9yYXdfc2l6ZSAtIFBMVF9JTklUSUFMX0VOVFJZX1NJWkUpIC8gUExUX0VOVFJZX1NJWkUKKwkgID49IFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpCisJcy0+X3Jhd19zaXplICs9IDIgKiBQTFRfRU5UUllfU0laRTsKKyAgICAgIGVsc2UKKwlzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7CisKKyAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQorICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKKyAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KKyAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7CisgICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAorICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCisKKyAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQorICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgorICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAorICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KKyAgaWYgKGluZm8tPnNoYXJlZCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAorICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQorICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCisgICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKKyAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKKyAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCisgICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KKyAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQorICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLgorCisgICAgIE9mIGNvdXJzZSwgaWYgdGhlIHN5bWJvbCBpcyBzdWZmaWNpZW50bHkgc21hbGwsIHdlIG11c3QgaW5zdGVhZAorICAgICBhbGxvY2F0ZSBpdCBpbiAuc2Jzcy4gIEZJWE1FOiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZG8gdGhpcyBpZiBhbmQKKyAgICAgb25seSBpZiB0aGVyZSB3ZXJlIGFjdHVhbGx5IFNEQVJFTCByZWxvY3MgZm9yIHRoYXQgc3ltYm9sLiAgKi8KKworICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKKyAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zYnNzIik7CisgIGVsc2UKKyAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9QUENfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bworICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCisgICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQorICAgICAucmVsYS5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KKyAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcmVsOworCisgICAgICBpZiAoaC0+c2l6ZSA8PSBlbGZfZ3Bfc2l6ZSAoZHlub2JqKSkKKwlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnNic3MiKTsKKyAgICAgIGVsc2UKKwlzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOworICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKKyAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKKyAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCisgIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKKyAgaWYgKHBvd2VyX29mX3R3byA+IDQpCisgICAgcG93ZXJfb2ZfdHdvID0gNDsKKworICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KKyAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCisJCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOworICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KKyAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKKyAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKKworICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLworICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworDAorLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCisgICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcGNfZWxmX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBjcGFyZzsKK3sKKyAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2FkanVzdF9keW5pbmR4IGNhbGxlZCwgaC0+ZHluaW5keCA9ICVkLCAqY3AgPSAlZFxuIiwgaC0+ZHluaW5keCwgKmNwKTsKKyNlbmRpZgorCisgIGlmIChoLT5keW5pbmR4ICE9IC0xKQorICAgIGgtPmR5bmluZHggKz0gKmNwOworCisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIGJvb2xlYW4gcGx0OworICBib29sZWFuIHJlbG9jczsKKyAgYm9vbGVhbiByZWx0ZXh0OworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgY2FsbGVkXG4iKTsKKyNlbmRpZgorCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOworCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKKwkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290LCAucmVsYS5zZGF0YSwgYW5kCisJIC5yZWxhLnNkYXRhMiBzZWN0aW9ucy4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlCisJIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQKKwkgdGhlIHNpemUgb2YgLnJlbGEuZ290LCBldCBhbCwgd2hpY2ggd2lsbCBjYXVzZSBpdCB0byBnZXQKKwkgc3RyaXBwZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUgYmVsb3cuICAqLworICAgICAgc3RhdGljIGNoYXIgKnJlbGFfc2VjdGlvbnNbXSA9IHsgIi5yZWxhLmdvdCIsICIucmVsYS5zZGF0YSIsCisJCQkJICAgICAgICIucmVsYS5zZGF0YTIiLCAiLnJlbGEuc2JzcyIsCisJCQkJICAgICAgIChjaGFyICopMCB9OworICAgICAgY2hhciAqKnA7CisKKyAgICAgIGZvciAocCA9IHJlbGFfc2VjdGlvbnM7ICpwICE9IChjaGFyICopMDsgcCsrKQorCXsKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAqcCk7CisJICBpZiAocyAhPSBOVUxMKQorCSAgICBzLT5fcmF3X3NpemUgPSAwOworCX0KKyAgICB9CisKKyAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCisgICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQorICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLworICBwbHQgPSBmYWxzZTsKKyAgcmVsb2NzID0gZmFsc2U7CisgIHJlbHRleHQgPSBmYWxzZTsKKyAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgYm9vbGVhbiBzdHJpcDsKKworICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKKwkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCisgICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7CisKKyAgICAgIHN0cmlwID0gZmFsc2U7CisKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKKwl7CisJICBpZiAocy0+X3Jhd19zaXplID09IDApCisJICAgIHsKKwkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQorICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KKwkgICAgICBzdHJpcCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLworCSAgICAgIHBsdCA9IHRydWU7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQorCXsKKwkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQorCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAorCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgorCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKKwkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0CisJCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQorCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKKwkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbworCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCisJICAgICAgc3RyaXAgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OworCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7CisKKwkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbiBzZWN0aW9ucy4gKi8KKwkgICAgICByZWxvY3MgPSB0cnVlOworCisJICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQorCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCisJICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAorCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7CisJICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKKwkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKKwkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAorCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCQlyZWx0ZXh0ID0gdHJ1ZTsKKworCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKKwkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKwkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMAorCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCisJICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSAhPSAwKQorCXsKKwkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmlwKQorCXsKKwkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLworICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisgICAgeworICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCisJIHZhbHVlcyBsYXRlciwgaW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCisJIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgorCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCisJIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCisgICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChwbHQpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChyZWxvY3MpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBLCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCisJICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCisJCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKHJlbHRleHQpCisJeworCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCisgICAgIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbi4gIFRoZXNlIGFyZSBsb2NhbCBzeW1ib2xzLCB3aGljaAorICAgICBtZWFucyB0aGF0IHRoZXkgbXVzdCBjb21lIGZpcnN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KKyAgICAgVGhhdCBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgZHluYW1pYyBzeW1ib2wgaW5kZXggb2YgZXZlcnkKKyAgICAgb3RoZXIgZHluYW1pYyBzeW1ib2wuCisKKyAgICAgRklYTUU6IFdlIGFzc3VtZSB0aGF0IHRoZXJlIHdpbGwgbmV2ZXIgYmUgcmVsb2NhdGlvbnMgdG8KKyAgICAgbG9jYXRpb25zIGluIGxpbmtlci1jcmVhdGVkIHNlY3Rpb25zIHRoYXQgZG8gbm90IGhhdmUKKyAgICAgZXh0ZXJuYWxseS12aXNpYmxlIG5hbWVzLiBJbnN0ZWFkLCB3ZSBzaG91bGQgd29yayBvdXQgcHJlY2lzZWx5CisgICAgIHdoaWNoIHNlY3Rpb25zIHJlbG9jYXRpb25zIGFyZSB0YXJnZXR0ZWQgYXQuICAqLworICBpZiAoaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBmb3IgKGMgPSAwLCBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAorCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKKwkgICAgeworCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gLTE7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KKwkgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCisKKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7CisKKwkgIGMrKzsKKwl9CisKKyAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICAgIHBwY19lbGZfYWRqdXN0X2R5bmluZHgsCisJCQkgICAgICAoUFRSKSAmYyk7CisgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAorICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKKyAgIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BwY19lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgYmZkICpkeW5vYmo7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOworICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKKyAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhOworICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyOworICBhc2VjdGlvbiAqc3JlbG9jOworICBhc2VjdGlvbiAqc2dvdCA9IE5VTEw7CisgIGFzZWN0aW9uICpzcmVsZ290ID0gTlVMTDsKKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9jaGVja19yZWxvY3MgY2FsbGVkIGZvciBzZWN0aW9uICVzIGluICVzXG4iLAorCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAorCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyNlbmRpZgorCisgIC8qIENyZWF0ZSB0aGUgbGlua2VyIGdlbmVyYXRlZCBzZWN0aW9ucyBhbGwgdGhlIHRpbWUgc28gdGhhdCB0aGUKKyAgICAgc3BlY2lhbCBzeW1ib2xzIGFyZSBjcmVhdGVkLiAgKi8KKworICBpZiAoKHNkYXRhID0gZWxmX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBMSU5LRVJfU0VDVElPTl9TREFUQSkpID09IE5VTEwpCisgICAgeworICAgICAgc2RhdGEgPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEpOworICAgICAgaWYgKCFzZGF0YSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgaWYgKChzZGF0YTIgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGFiZmQsIExJTktFUl9TRUNUSU9OX1NEQVRBMikpID09IE5VTEwpCisgICAgeworICAgICAgc2RhdGEyID0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBMik7CisgICAgICBpZiAoIXNkYXRhMikKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7CisKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKKyAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCisgICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKworICBzcmVsb2MgPSBOVUxMOworCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisKKyAgICAgIC8qIElmIGEgcmVsb2NhdGlvbiByZWZlcnMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBjcmVhdGUgdGhlIC5nb3QuCisJIFRoaXMgc2hvd3MgdXAgaW4gcGFydGljdWxhciBpbiBhbiBSX1BQQ19BRERSMzIgaW4gdGhlIGVhYmkKKwkgc3RhcnR1cCBjb2RlLiAgKi8KKyAgICAgIGlmIChoICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCisJeworCSAgaWYgKHNnb3QgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKKwkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOworCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJeworCS8qIEdPVDE2IHJlbG9jYXRpb25zICovCisJY2FzZSBSX1BQQ19HT1QxNjoKKwljYXNlIFJfUFBDX0dPVDE2X0xPOgorCWNhc2UgUl9QUENfR09UMTZfSEk6CisJY2FzZSBSX1BQQ19HT1QxNl9IQToKKwkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCisKKwkgIGlmIChzZ290ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCisJCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKKwkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworCSAgICB9CisKKwkgIGlmIChzcmVsZ290ID09IE5VTEwKKwkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCisJICAgIHsKKwkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCisJCXsKKwkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7CisJCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAorCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAorCQkJCQkJICAoU0VDX0FMTE9DCisJCQkJCQkgICB8IFNFQ19MT0FECisJCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQorCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChoLT5nb3QucmVmY291bnQgPT0gLTEpCisJCXsKKwkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQorCQkgICAgaWYgKCFiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisKKwkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdC4gICovCisJCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7CisJCSAgLyogQWxsb2NhdGUgcmVsb2NhdGlvbiBzcGFjZS4gICovCisJCSAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKwkJICBoLT5nb3QucmVmY291bnQgPSAxOworCQl9CisJICAgICAgZWxzZQorCQloLT5nb3QucmVmY291bnQrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50cyA9PSBOVUxMKQorCQl7CisJCSAgc2l6ZV90IHNpemU7CisKKwkJICBzaXplID0gc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoYmZkX3NpZ25lZF92bWEpOworCQkgIGxvY2FsX2dvdF9yZWZjb3VudHMgPSAoYmZkX3NpZ25lZF92bWEgKikKKwkJICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CisJCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOworCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOworCQl9CisJICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQorCQl7CisJCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7CisKKwkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfUFBDX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KKwkJICBpZiAoaW5mby0+c2hhcmVkKQorCQkgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKwkJICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9IDE7CisJCX0KKwkgICAgICBlbHNlCisJCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7CisJICAgIH0KKwkgIGJyZWFrOworCisJLyogSW5kaXJlY3QgLnNkYXRhIHJlbG9jYXRpb24gKi8KKwljYXNlIFJfUFBDX0VNQl9TREFJMTY6CisJICBpZiAoaW5mby0+c2hhcmVkKQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IiksCisJCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAiUl9QUENfRU1CX1NEQUkxNiIpKTsKKwkgICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGlmIChzcmVsZ290ID09IE5VTEwgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQorCSAgICB7CisJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKwkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQorCQl7CisJCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCQkgIGlmIChzcmVsZ290ID09IE5VTEwKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKKwkJCQkJCSAgKFNFQ19BTExPQworCQkJCQkJICAgfCBTRUNfTE9BRAorCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECisJCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCisJCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisKKwkgIGlmICghYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBzZGF0YSwgaCwgcmVsKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBicmVhazsKKworCS8qIEluZGlyZWN0IC5zZGF0YTIgcmVsb2NhdGlvbiAqLworCWNhc2UgUl9QUENfRU1CX1NEQTJJMTY6CisJICBpZiAoaW5mby0+c2hhcmVkKQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IiksCisJCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAiUl9QUENfRU1CX1NEQTJJMTYiKSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGlmIChzcmVsZ290ID09IE5VTEwgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQorCSAgICB7CisJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKwkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQorCQl7CisJCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCQkgIGlmIChzcmVsZ290ID09IE5VTEwKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKKwkJCQkJCSAgKFNFQ19BTExPQworCQkJCQkJICAgfCBTRUNfTE9BRAorCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECisJCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCisJCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisKKwkgIGlmICghYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBzZGF0YTIsIGgsIHJlbCkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgYnJlYWs7CisKKwljYXNlIFJfUFBDX1NEQVJFTDE2OgorCWNhc2UgUl9QUENfRU1CX1NEQTJSRUw6CisJY2FzZSBSX1BQQ19FTUJfU0RBMjE6CisJICBpZiAoaW5mby0+c2hhcmVkKQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IiksCisJCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQlwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyldLT5uYW1lKSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgUl9QUENfUExUMzI6CisJY2FzZSBSX1BQQ19QTFRSRUwyNDoKKwljYXNlIFJfUFBDX1BMVDE2X0xPOgorCWNhc2UgUl9QUENfUExUMTZfSEk6CisJY2FzZSBSX1BQQ19QTFQxNl9IQToKKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiUmVsb2MgcmVxdWlyZXMgYSBQTFQgZW50cnlcbiIpOworI2VuZGlmCisJICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKKyAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAorICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0CisgICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0CisgICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCisKKwkgIGlmIChoID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBwcm9jZWR1cmUgbGlua2FnZQorICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJICAgIHsKKwkgICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCisJICAgIHsKKwkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOworCSAgICAgIGgtPnBsdC5yZWZjb3VudCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgaC0+cGx0LnJlZmNvdW50Kys7CisJICBicmVhazsKKworCSAgLyogVGhlIGZvbGxvd2luZyByZWxvY2F0aW9ucyBkb24ndCBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUKKwkgICAgIHJlbG9jYXRpb24gaWYgbGlua2luZyBhIHNoYXJlZCBvYmplY3Qgc2luY2UgdGhleSBhcmUKKwkgICAgIHNlY3Rpb24gcmVsYXRpdmUuICAqLworCWNhc2UgUl9QUENfU0VDVE9GRjoKKwljYXNlIFJfUFBDX1NFQ1RPRkZfTE86CisJY2FzZSBSX1BQQ19TRUNUT0ZGX0hJOgorCWNhc2UgUl9QUENfU0VDVE9GRl9IQToKKwkgIGJyZWFrOworCisJICAvKiBUaGlzIHJlZmVycyBvbmx5IHRvIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeSAqLworCWNhc2UgUl9QUENfTE9DQUwyNFBDOgorCSAgYnJlYWs7CisKKwkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKwkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KKwljYXNlIFJfUFBDX0dOVV9WVElOSEVSSVQ6CisJICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQorCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisJY2FzZSBSX1BQQ19HTlVfVlRFTlRSWToKKwkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwkgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKKwkgICAgIHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCisJICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGUgcmVsb2MuICAqLworCWNhc2UgUl9QUENfUkVMMjQ6CisJY2FzZSBSX1BQQ19SRUwxNDoKKwljYXNlIFJfUFBDX1JFTDE0X0JSVEFLRU46CisJY2FzZSBSX1BQQ19SRUwxNF9CUk5UQUtFTjoKKwljYXNlIFJfUFBDX1JFTDMyOgorCSAgaWYgKGggPT0gTlVMTAorCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCisJICAgIGJyZWFrOworCSAgLyogZmFsbCB0aHJvdWdoICovCisKKwlkZWZhdWx0OgorCSAgaWYgKGluZm8tPnNoYXJlZCkKKwkgICAgeworI2lmZGVmIERFQlVHCisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9jaGVja19yZWxvY3MgbmVlZCB0byBjcmVhdGUgcmVsb2NhdGlvbiBmb3IgJXNcbiIsCisJCSAgICAgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+Iik7CisjZW5kaWYKKwkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCXsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCisJCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgIChhYmZkLAorCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCisJCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKKwkJICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgcmV0dXJuIGZhbHNlOworCisJCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAorCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKKwkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKKworCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOworCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisKKwkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKKwkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQorCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisJCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOworCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKKwkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKKwkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCX0KKworCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKwkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIGhlcmUgZG8gd2hhdCB0aGUgbTY4ayBhbmQgaTM4NgorCQkgYmFja2VuZHMgZG86IGlmIHRoZSByZWxvYyBpcyBwYy1yZWxhdGl2ZSwgcmVjb3JkIGl0CisJCSBpbiBjYXNlIGl0IHR1cm5zIG91dCB0aGF0IHRoZSByZWxvYyBpcyB1bm5lY2Vzc2FyeQorCQkgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGZvcmNlZCBsb2NhbCBieSB2ZXJzaW9uaW5nIG9yCisJCSB3ZSBhcmUgbGlua2luZyB3aXRoIC1CZHluYW1pYy4gIEZvcnR1bmF0ZWx5IHRoaXMKKwkJIGNhc2UgaXMgbm90IGZyZXF1ZW50LiAgKi8KKwkgICAgfQorCisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KKyAgIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgYXNlY3Rpb24gKgorcHBjX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworeworICBpZiAoaCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJeworCWNhc2UgUl9QUENfR05VX1ZUSU5IRVJJVDoKKwljYXNlIFJfUFBDX0dOVV9WVEVOVFJZOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247CisKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKwkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQorCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisJICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKKwkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKKwl7CisJICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7CisgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKKworICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgeworICAgICAgY2FzZSBSX1BQQ19HT1QxNjoKKyAgICAgIGNhc2UgUl9QUENfR09UMTZfTE86CisgICAgICBjYXNlIFJfUFBDX0dPVDE2X0hJOgorICAgICAgY2FzZSBSX1BQQ19HT1QxNl9IQToKKwlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisJaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICB7CisJICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisJICAgIGlmIChoLT5nb3QucmVmY291bnQgPiAwKQorCSAgICAgIGgtPmdvdC5yZWZjb3VudC0tOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID4gMCkKKwkgICAgICBsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XS0tOworCSAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSX1BQQ19QTFQzMjoKKyAgICAgIGNhc2UgUl9QUENfUExUUkVMMjQ6CisgICAgICBjYXNlIFJfUFBDX1BMVDE2X0xPOgorICAgICAgY2FzZSBSX1BQQ19QTFQxNl9ISToKKyAgICAgIGNhc2UgUl9QUENfUExUMTZfSEE6CisJcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgeworCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgICBpZiAoaC0+cGx0LnJlZmNvdW50ID4gMCkKKwkgICAgICBoLT5wbHQucmVmY291bnQtLTsKKwkgIH0KKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKKyAgIGZpbGUuICBXZSB1c2UgaXQgdG8gcHV0IC5jb21tIGl0ZW1zIGluIC5zYnNzLCBhbmQgbm90IC5ic3MuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKKyAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBiZmRfdm1hICp2YWxwOworeworICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCisgICAgICAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICAmJiBzeW0tPnN0X3NpemUgPD0gKGJmZF92bWEpIGJmZF9nZXRfZ3Bfc2l6ZSAoYWJmZCkpCisgICAgeworICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIC1HIG5uIGJ5dGVzIGFyZSBhdXRvbWF0aWNhbGx5CisJIHB1dCBpbnRvIC5zZGF0YS4gICovCisgICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEKKwk9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQSk7CisKKyAgICAgIGlmICghc2RhdGEtPmJzc19zZWN0aW9uKQorCXsKKwkgIC8qIFdlIGRvbid0IGdvIHRocm91Z2ggYmZkX21ha2Vfc2VjdGlvbiwgYmVjYXVzZSB3ZSBkb24ndAorICAgICAgICAgICAgIHdhbnQgdG8gYXR0YWNoIHRoaXMgY29tbW9uIHNlY3Rpb24gdG8gRFlOT0JKLiAgVGhlIGxpbmtlcgorICAgICAgICAgICAgIHdpbGwgbW92ZSB0aGUgc3ltYm9scyB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IHNlY3Rpb24KKyAgICAgICAgICAgICB3aGVuIGl0IGRlZmluZXMgY29tbW9uIHN5bWJvbHMuICAqLworCSAgc2RhdGEtPmJzc19zZWN0aW9uID0gKChhc2VjdGlvbiAqKQorCQkJCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKSk7CisJICBpZiAoc2RhdGEtPmJzc19zZWN0aW9uID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+bmFtZSA9IHNkYXRhLT5ic3NfbmFtZTsKKwkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOworCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IHNkYXRhLT5ic3Nfc2VjdGlvbjsKKwkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sID0KKwkgICAgKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7CisJICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID0KKwkgICAgKGFzeW1ib2wgKiopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCAqKSk7CisJICBpZiAoc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wgPT0gTlVMTAorCSAgICAgIHx8IHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPm5hbWUgPSBzZGF0YS0+YnNzX25hbWU7CisJICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbC0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07CisJICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbC0+c2VjdGlvbiA9IHNkYXRhLT5ic3Nfc2VjdGlvbjsKKwkgICpzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID0gc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2w7CisJfQorCisgICAgICAqc2VjcCA9IHNkYXRhLT5ic3Nfc2VjdGlvbjsKKyAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworDAorLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCisgICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgYmZkICpkeW5vYmo7CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBjYWxsZWQgZm9yICVzIiwKKwkgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKKyNlbmRpZgorCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7CisKKyAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcGx0OworICAgICAgYXNlY3Rpb24gKnNyZWxhOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKyAgICAgIGJmZF92bWEgcmVsb2NfaW5kZXg7CisKKyNpZmRlZiBERUJVRworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLCBwbHRfb2Zmc2V0ID0gJWQiLCBoLT5wbHQub2Zmc2V0KTsKKyNlbmRpZgorCisgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0CisgICAgICAgICBpdCB1cC4gICovCisKKyAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOworCisgICAgICAvKiBXZSBkb24ndCBuZWVkIHRvIGZpbGwgaW4gdGhlIC5wbHQuICBUaGUgcHBjIGR5bmFtaWMgbGlua2VyCisJIHdpbGwgZmlsbCBpdCBpbi4gICovCisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCisgICAgICByZWxhLnJfb2Zmc2V0ID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAorCQkgICAgICAgKyBoLT5wbHQub2Zmc2V0KTsKKyAgICAgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1BQQ19KTVBfU0xPVCk7CisgICAgICByZWxhLnJfYWRkZW5kID0gMDsKKworICAgICAgcmVsb2NfaW5kZXggPSAoaC0+cGx0Lm9mZnNldCAtIFBMVF9JTklUSUFMX0VOVFJZX1NJWkUpIC8gUExUX1NMT1RfU0laRTsKKyAgICAgIGlmIChyZWxvY19pbmRleCA+IFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpCisJcmVsb2NfaW5kZXggLT0gKHJlbG9jX2luZGV4IC0gUExUX05VTV9TSU5HTEVfRU5UUklFUykgLyAyOworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCisJCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKKwkJCQkgICsgcmVsb2NfaW5kZXgpKTsKKworICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCisJICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KKwkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7CisJfQorICAgIH0KKworICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNnb3Q7CisgICAgICBhc2VjdGlvbiAqc3JlbGE7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOworCisgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKKyAgICAgICAgIHVwLiAgKi8KKworICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKKworICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCisJIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBUaGUgZW50cnkgaW4KKwkgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBpbgorCSB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCisgICAgICBpZiAoaW5mby0+c2hhcmVkCisJICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCisJeworCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKKwkgIHJlbGEucl9hZGRlbmQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgQkZEX0FTU0VSVCgoaC0+Z290Lm9mZnNldCAmIDEpID09IDApOworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7CisJICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfR0xPQl9EQVQpOworCSAgcmVsYS5yX2FkZGVuZCA9IDA7CisJfQorCisgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKKwkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cworCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKKyAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OworICAgIH0KKworICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOworCisgICAgICAvKiBUaGlzIHN5bWJvbHMgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KKworI2lmZGVmIERFQlVHCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIsIGNvcHkiKTsKKyNlbmRpZgorCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKworICAgICAgaWYgKGgtPnNpemUgPD0gZWxmX2dwX3NpemUgKGR5bm9iaikpCisJcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAorCQkJCSAgICAgIi5yZWxhLnNic3MiKTsKKyAgICAgIGVsc2UKKwlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCisJCQkJICAgICAiLnJlbGEuYnNzIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgICAgICByZWxhLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfQ09QWSk7CisgICAgICByZWxhLnJfYWRkZW5kID0gMDsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAorCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKKwkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKKyAgICAgICsrcy0+cmVsb2NfY291bnQ7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCisgIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KKyAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAorICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAorICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCisgICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKwwKKy8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuCitwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqc2R5bjsKKyAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgYXNlY3Rpb24gKnNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOworI2VuZGlmCisKKyAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOworCisgICAgICBkeW5jb24gPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOworICAgICAgZHluY29uZW5kID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOworICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCisJeworCSAgRWxmX0ludGVybmFsX0R5biBkeW47CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgYm9vbGVhbiBzaXplOworCisJICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKKworCSAgc3dpdGNoIChkeW4uZF90YWcpCisJICAgIHsKKwkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0IjsJICBzaXplID0gZmFsc2U7IGJyZWFrOworCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyAgYnJlYWs7CisJICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKKwkgICAgZGVmYXVsdDoJICAgICAgbmFtZSA9IE5VTEw7CSAgc2l6ZSA9IGZhbHNlOyBicmVhazsKKwkgICAgfQorCisJICBpZiAobmFtZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnM7CisKKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOworCSAgICAgIGlmIChzID09IE5VTEwpCisJCWR5bi5kX3VuLmRfdmFsID0gMDsKKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoISBzaXplKQorCQkgICAgZHluLmRfdW4uZF9wdHIgPSBzLT52bWE7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCisJCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKKwkJICAgICAgZWxzZQorCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7CisJCSAgICB9CisJCX0KKwkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBBZGQgYSBibHJsIGluc3RydWN0aW9uIGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy00IHNvIHRoYXQgYSBmdW5jdGlvbiBjYW4KKyAgICAgZWFzaWx5IGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gICovCisgIGlmIChzZ290KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzID0gc2dvdC0+Y29udGVudHM7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDRlODAwMDIxIC8qIGJscmwgKi8sIGNvbnRlbnRzKTsKKworICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKKwliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgY29udGVudHMrNCk7CisgICAgICBlbHNlCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAorCQkgICAgY29udGVudHMrNCk7CisKKyAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7CisgICAgfQorCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNkeW5zeW07CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOworICAgICAgaW50IG1heGRpbmR4ID0gMDsKKworICAgICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLworCisgICAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNkeW5zeW0gIT0gTlVMTCk7CisKKyAgICAgIHN5bS5zdF9zaXplID0gMDsKKyAgICAgIHN5bS5zdF9uYW1lID0gMDsKKyAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOworICAgICAgc3ltLnN0X290aGVyID0gMDsKKworICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgaW50IGluZHgsIGRpbmR4OworCisJICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7CisKKwkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7CisJICBkaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OworCSAgaWYgKGRpbmR4ICE9IC0xKQorCSAgICB7CisJICAgICAgQkZEX0FTU0VSVChpbmR4ID4gMCk7CisJICAgICAgQkZEX0FTU0VSVChkaW5keCA+IDApOworCisJICAgICAgaWYgKGRpbmR4ID4gbWF4ZGluZHgpCisJCW1heGRpbmR4ID0gZGluZHg7CisKKwkgICAgICBzeW0uc3Rfc2huZHggPSBpbmR4OworCisJICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKKwkJCQkJIChQVFIpICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQorCQkJCQkJIHNkeW5zeW0tPmNvbnRlbnRzKQorCQkJCQkJKyBkaW5keCkpOworCSAgICB9CisJfQorCisgICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCisgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCisgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPQorCW1heGRpbmR4ICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKwwKKy8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCisgICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCisKKyAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgorICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCisgICB6ZXJvLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKKyAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCisgICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCisgICBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYworICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgorCisgICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgorCisgICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgorCisgICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKKyAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KKworICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKKyAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCisgICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0CisgICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAorICAgYWNjb3JkaW5nbHkuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCQkgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKKyAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHIJCSAgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgYmZkICpkeW5vYmoJCQkJICA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEJCSAgPSAoZHlub2JqKSA/IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCBMSU5LRVJfU0VDVElPTl9TREFUQSkgIDogTlVMTDsKKyAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhMgkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBMikgOiBOVUxMOworICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsCQkgID0gcmVsb2NzOworICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kCQkgID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGFzZWN0aW9uICpzcmVsb2MJCQkgID0gTlVMTDsKKyAgYXNlY3Rpb24gKnNwbHQ7CisgIGFzZWN0aW9uICpzZ290OworICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKKyAgYm9vbGVhbiByZXQJCQkJICA9IHRydWU7CisgIGxvbmcgaW5zbjsKKworI2lmZGVmIERFQlVHCisgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBjYWxsZWQgZm9yICVzIHNlY3Rpb24gJXMsICVsZCByZWxvY2F0aW9ucyVzXG4iLAorCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJICAgYmZkX3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pLAorCSAgIChsb25nKWlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50LAorCSAgIChpbmZvLT5yZWxvY2F0ZWFibGUpID8gIiAocmVsb2NhdGFibGUpIiA6ICIiKTsKKyNlbmRpZgorCisgIGlmICghcHBjX2VsZl9ob3d0b190YWJsZVsgUl9QUENfQUREUjMyIF0pCS8qIEluaXRpYWxpemUgaG93dG8gdGFibGUgaWYgbmVlZGVkICovCisgICAgcHBjX2VsZl9ob3d0b19pbml0ICgpOworCisgIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOworCisgIHNwbHQgPSBzZ290ID0gTlVMTDsKKyAgaWYgKGR5bm9iaiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgfQorCisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGVudW0gZWxmX3BwY19yZWxvY190eXBlIHJfdHlwZQk9IChlbnVtIGVsZl9wcGNfcmVsb2NfdHlwZSlFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKKyAgICAgIGJmZF92bWEgb2Zmc2V0CQkJPSByZWwtPnJfb2Zmc2V0OworICAgICAgYmZkX3ZtYSBhZGRlbmQJCQk9IHJlbC0+cl9hZGRlbmQ7CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcgkJPSBiZmRfcmVsb2Nfb3RoZXI7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW0JCT0gKEVsZl9JbnRlcm5hbF9TeW0gKikwOworICAgICAgYXNlY3Rpb24gKnNlYwkJCT0gKGFzZWN0aW9uICopMDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoCT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopMDsKKyAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lCQk9IChjb25zdCBjaGFyICopMDsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKworICAgICAgLyogVW5rbm93biByZWxvY2F0aW9uIGhhbmRsaW5nICovCisgICAgICBpZiAoKHVuc2lnbmVkKXJfdHlwZSA+PSAodW5zaWduZWQpUl9QUENfbWF4IHx8ICFwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXSkKKwl7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIpLAorCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAorCQkJCSAoaW50KXJfdHlwZSk7CisKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0ID0gZmFsc2U7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGhvd3RvID0gcHBjX2VsZl9ob3d0b190YWJsZVsoaW50KXJfdHlwZV07CisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKKwkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQorCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKCh1bnNpZ25lZClFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKKwkJeworCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkJICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7CisJCX0KKwkgICAgfQorCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCisJCSAgIGhvd3RvLT5uYW1lLAorCQkgICAoaW50KXJfdHlwZSwKKwkJICAgcl9zeW1uZHgsCisJCSAgIChsb25nKW9mZnNldCwKKwkJICAgKGxvbmcpYWRkZW5kKTsKKyNlbmRpZgorCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkgIHN5bV9uYW1lID0gIjxsb2NhbCBzeW1ib2w+IjsKKworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICBzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgaWYgKChyX3R5cGUgPT0gUl9QUENfUExUMzIKKwkJICAgJiYgaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisJCSAgfHwgKHJfdHlwZSA9PSBSX1BQQ19MT0NBTDI0UEMKKwkJICAgICAgJiYgc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQorCQkgIHx8ICgocl90eXBlID09IFJfUFBDX0dPVDE2CisJCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfTE8KKwkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9ISQorCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0hBKQorCQkgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAorCQkgICAgICAmJiAoISBpbmZvLT5zaGFyZWQKKwkJCSAgfHwgKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCisJCSAgfHwgKGluZm8tPnNoYXJlZAorCQkgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCisJCSAgICAgICYmIChyX3R5cGUgPT0gUl9QUENfQUREUjMyCisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMjQKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNgorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0xPCisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfSEkKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9IQQorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE0CisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJUQUtFTgorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE0X0JSTlRBS0VOCisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19QTFRSRUwyNAorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQ09QWQorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfR0xPQl9EQVQKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0pNUF9TTE9UCisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19VQUREUjMyCisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19VQUREUjE2CisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19TREFSRUwxNgorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMzIKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2CisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9MTworCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEkKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0hBCisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBSTE2CisJCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMkkxNgorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTJSRUwKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEyMQorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX01SS1JFRgorCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX0JJVF9GTEQKKwkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9SRUxTREEKKwkJCSAgfHwgKChyX3R5cGUgPT0gUl9QUENfUkVMMjQKKwkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfUkVMMzIKKwkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfUkVMMTQKKwkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfUkVMMTRfQlJUQUtFTgorCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUk5UQUtFTgorCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUxBVElWRSkKKwkJCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKKwkJCQkJICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKSkpKQorCQl7CisJCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgV2UgY2hlY2sgc3BlY2lhbGx5IGJlY2F1c2UgaW4gc29tZQorICAgICAgICAgICAgICAgICAgICAgb2JzY3VyZSBjYXNlcyBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCisJCSAgcmVsb2NhdGlvbiA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJICAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkoaW5mbywKKwkJCQkJCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCisJCQkJCQkgICBpbnB1dF9iZmQsCisJCQkJCQkgICBpbnB1dF9zZWN0aW9uLAorCQkJCQkJICAgcmVsLT5yX29mZnNldCk7CisJICAgICAgcmV0ID0gZmFsc2U7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCisJeworCWRlZmF1bHQ6CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCBmb3Igc3ltYm9sICVzIiksCisJCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCisJCQkJIChpbnQpcl90eXBlLCBzeW1fbmFtZSk7CisKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0ID0gZmFsc2U7CisJICBjb250aW51ZTsKKworCS8qIFJlbG9jYXRpb25zIHRoYXQgbmVlZCBubyBzcGVjaWFsIHByb2Nlc3NpbmcuICAqLworCWNhc2UgKGludClSX1BQQ19MT0NBTDI0UEM6CisJICAvKiBJdCBtYWtlcyBubyBzZW5zZSB0byBwb2ludCBhIGxvY2FsIHJlbG9jYXRpb24KKwkgICAgIGF0IGEgc3ltYm9sIG5vdCBpbiB0aGlzIG9iamVjdC4gICovCisJICBpZiAoaCAhPSBOVUxMCisJICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICAgICYmIHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKKwkgICAgeworCSAgICAgICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKSAoaW5mbywKKwkJCQkJCSAgICBoLT5yb290LnJvb3Quc3RyaW5nLAorCQkJCQkJICAgIGlucHV0X2JmZCwKKwkJCQkJCSAgICBpbnB1dF9zZWN0aW9uLAorCQkJCQkJICAgIHJlbC0+cl9vZmZzZXQpOworCSAgICAgIHJldCA9IGZhbHNlOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBicmVhazsKKworCS8qIFJlbG9jYXRpb25zIHRoYXQgbWF5IG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCisgICAgICAgICAgIG9iamVjdC4gICovCisJY2FzZSAoaW50KVJfUFBDX1JFTDI0OgorCWNhc2UgKGludClSX1BQQ19SRUwzMjoKKwljYXNlIChpbnQpUl9QUENfUkVMMTQ6CisJICAvKiBJZiB0aGVzZSByZWxvY2F0aW9ucyBhcmUgbm90IHRvIGEgbmFtZWQgc3ltYm9sLCB0aGV5IGNhbiBiZQorCSAgICAgaGFuZGxlZCByaWdodCBoZXJlLCBubyBuZWVkIHRvIGJvdGhlciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLworCSAgaWYgKGggPT0gTlVMTAorCSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCisJICAgIGJyZWFrOworCS8qIGZhbGwgdGhyb3VnaCAqLworCisJLyogUmVsb2NhdGlvbnMgdGhhdCBhbHdheXMgbmVlZCB0byBiZSBwcm9wYWdhdGVkIGlmIHRoaXMgaXMgYSBzaGFyZWQKKyAgICAgICAgICAgb2JqZWN0LiAgKi8KKwljYXNlIChpbnQpUl9QUENfTk9ORToKKwljYXNlIChpbnQpUl9QUENfQUREUjMyOgorCWNhc2UgKGludClSX1BQQ19BRERSMjQ6CisJY2FzZSAoaW50KVJfUFBDX0FERFIxNjoKKwljYXNlIChpbnQpUl9QUENfQUREUjE2X0xPOgorCWNhc2UgKGludClSX1BQQ19BRERSMTZfSEk6CisJY2FzZSAoaW50KVJfUFBDX0FERFIxNl9IQToKKwljYXNlIChpbnQpUl9QUENfQUREUjE0OgorCWNhc2UgKGludClSX1BQQ19VQUREUjMyOgorCWNhc2UgKGludClSX1BQQ19VQUREUjE2OgorCSAgaWYgKGluZm8tPnNoYXJlZCkKKwkgICAgeworCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKKwkgICAgICBib29sZWFuIHNraXA7CisKKyNpZmRlZiBERUJVRworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbiBuZWVkIHRvIGNyZWF0ZSByZWxvY2F0aW9uIGZvciAlc1xuIiwKKwkJICAgICAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iKTsKKyNlbmRpZgorCisJICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKKyAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KKyAgICAgICAgICAgICAgICAgdGltZS4gICovCisKKwkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCXsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCisJCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgIChpbnB1dF9iZmQsCisJCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAorCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOworCQkgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCisJCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCisJCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAorCQkJCQkgbmFtZSArIDUpID09IDApOworCisJCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7CisJCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOworCQl9CisKKwkgICAgICBza2lwID0gZmFsc2U7CisKKwkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQorCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OworCSAgICAgIGVsc2UKKwkJeworCQkgIGJmZF92bWEgb2ZmOworCisJCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAorCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCisJCQkgIGlucHV0X3NlY3Rpb24sCisJCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAorCQkJICByZWwtPnJfb2Zmc2V0KSk7CisJCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCisJCSAgICBza2lwID0gdHJ1ZTsKKwkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7CisJCX0KKworCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKworCSAgICAgIGlmIChza2lwKQorCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOworCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgdG8KKyAgICAgICAgICAgICAgICAgYmVjb21lIGxvY2FsLiAgKi8KKwkgICAgICBlbHNlIGlmIChoICE9IE5VTEwKKwkJICAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQorCQkJICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQorCQl7CisJCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisJCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKKwkJICBvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIpCisJCSAgICB7CisJCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKKwkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsb25nIGluZHg7CisKKwkJICAgICAgaWYgKGggPT0gTlVMTCkKKwkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkJICAgICAgZWxzZQorCQkJeworCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQorCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOworCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJCQl9CisJCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCisJCQlpbmR4ID0gMDsKKwkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQorCQkJeworCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJCSAgcmV0dXJuIGZhbHNlOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGFzZWN0aW9uICpvc2VjOworCisJCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOworCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7CisJCQkgIEJGRF9BU1NFUlQoaW5keCA+IDApOworI2lmZGVmIERFQlVHCisJCQkgIGlmIChpbmR4IDw9IDApCisJCQkgICAgeworCQkJICAgICAgcHJpbnRmKCJpbmR4PSVkIHNlY3Rpb249JXMgZmxhZ3M9JTA4eCBuYW1lPSVzXG4iLAorCQkJCSAgICAgaW5keCwgb3NlYy0+bmFtZSwgb3NlYy0+ZmxhZ3MsCisJCQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKKwkJCSAgICB9CisjZW5kaWYKKwkJCX0KKworCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOworCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKKwkJICAgIH0KKwkJfQorCisJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKKwkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKKwkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKKwkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKKwkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7CisKKwkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubworICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQorICAgICAgICAgICAgICAgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KKwkgICAgICBpZiAoc2tpcAorCQkgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorCQkgIHx8IEVMRjMyX1JfVFlQRSAob3V0cmVsLnJfaW5mbykgIT0gUl9QUENfUkVMQVRJVkUpCisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIEFyaXRobWV0aWMgYWRqdXN0IHJlbG9jYXRpb25zIHRoYXQgYXJlbid0IGdvaW5nIGludG8gYQorCSAgICAgc2hhcmVkIG9iamVjdC4gICovCisJICBpZiAocl90eXBlID09IFJfUFBDX0FERFIxNl9IQQorCSAgICAgIC8qIEl0J3MganVzdCBwb3NzaWJsZSB0aGF0IHRoaXMgc3ltYm9sIGlzIGEgd2VhayBzeW1ib2wKKwkJIHRoYXQncyBub3QgYWN0dWFsbHkgZGVmaW5lZCBhbnl3aGVyZS4gSW4gdGhhdCBjYXNlLAorCQkgJ3NlYycgd291bGQgYmUgTlVMTCwgYW5kIHdlIHNob3VsZCBsZWF2ZSB0aGUgc3ltYm9sCisJCSBhbG9uZSAoaXQgd2lsbCBiZSBzZXQgdG8gemVybyBlbHNld2hlcmUgaW4gdGhlIGxpbmspLiAgKi8KKwkgICAgICAmJiBzZWMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOworCSAgICB9CisJICBicmVhazsKKworCS8qIGJyYW5jaCB0YWtlbiBwcmVkaWN0aW9uIHJlbG9jYXRpb25zICovCisJY2FzZSAoaW50KVJfUFBDX0FERFIxNF9CUlRBS0VOOgorCWNhc2UgKGludClSX1BQQ19SRUwxNF9CUlRBS0VOOgorCSAgaW5zbiA9IGJmZF9nZXRfMzIgKG91dHB1dF9iZmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKKwkgIGlmICgocmVsb2NhdGlvbiAtIG9mZnNldCkgJiAweDgwMDApCisJICAgIGluc24gJj0gfkJSQU5DSF9QUkVESUNUX0JJVDsKKwkgIGVsc2UKKwkgICAgaW5zbiB8PSBCUkFOQ0hfUFJFRElDVF9CSVQ7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7CisJICBicmVhazsKKworCS8qIGJyYW5jaCBub3QgdGFrZW4gcHJlZGljaXRpb24gcmVsb2NhdGlvbnMgKi8KKwljYXNlIChpbnQpUl9QUENfQUREUjE0X0JSTlRBS0VOOgorCWNhc2UgKGludClSX1BQQ19SRUwxNF9CUk5UQUtFTjoKKwkgIGluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7CisJICBpZiAoKHJlbG9jYXRpb24gLSBvZmZzZXQpICYgMHg4MDAwKQorCSAgICBpbnNuIHw9IEJSQU5DSF9QUkVESUNUX0JJVDsKKwkgIGVsc2UKKwkgICAgaW5zbiAmPSB+QlJBTkNIX1BSRURJQ1RfQklUOworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOworCSAgYnJlYWs7CisKKwkvKiBHT1QxNiByZWxvY2F0aW9ucyAqLworCWNhc2UgKGludClSX1BQQ19HT1QxNjoKKwljYXNlIChpbnQpUl9QUENfR09UMTZfTE86CisJY2FzZSAoaW50KVJfUFBDX0dPVDE2X0hJOgorCWNhc2UgKGludClSX1BQQ19HT1QxNl9IQToKKwkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCisgICAgICAgICAgICAgb2Zmc2V0IHRhYmxlLiAgKi8KKwkgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisKKwkgIGlmIChoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBiZmRfdm1hIG9mZjsKKworCSAgICAgIG9mZiA9IGgtPmdvdC5vZmZzZXQ7CisJICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7CisKKwkgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAorCQkgIHx8IChpbmZvLT5zaGFyZWQKKwkJICAgICAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCisJCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQorCQl7CisJCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCisgICAgICAgICAgICAgICAgICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNpbmNlIHRoZSBvZmZzZXQgbXVzdAorICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZSBsZWFzdAorICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCisKKwkJICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsYS5nb3QKKwkJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcworCQkgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KKwkJICBpZiAoKG9mZiAmIDEpICE9IDApCisJCSAgICBvZmYgJj0gfjE7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAorCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOworCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7CisJCSAgICB9CisJCX0KKworCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gNDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBvZmY7CisKKwkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCisJCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOworCisJICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOworCisJICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKKwkJIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZQorCQkgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBlbnRyeS4gICovCisJICAgICAgaWYgKChvZmYgJiAxKSAhPSAwKQorCQlvZmYgJj0gfjE7CisJICAgICAgZWxzZQorCQl7CisJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOworCisJCSAgaWYgKGluZm8tPnNoYXJlZCkKKwkJICAgIHsKKwkJICAgICAgYXNlY3Rpb24gKnNyZWxnb3Q7CisJCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKKworCQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgUl9QUENfUkVMQVRJVkUgcmVsb2MKKwkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KKwkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKwkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKKworCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCQkJCSArIG9mZik7CisJCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfUFBDX1JFTEFUSVZFKTsKKwkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbjsKKwkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKKwkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCisJCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKKwkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOworCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OworCQkgICAgfQorCisJCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7CisJCX0KKworCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gNDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwkvKiBJbmRpcmVjdCAuc2RhdGEgcmVsb2NhdGlvbiAqLworCWNhc2UgKGludClSX1BQQ19FTUJfU0RBSTE2OgorCSAgQkZEX0FTU0VSVCAoc2RhdGEgIT0gTlVMTCk7CisJICByZWxvY2F0aW9uID0gYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sCisJCQkJCQkJCXNkYXRhLCBoLCByZWxvY2F0aW9uLCByZWwsCisJCQkJCQkJCVJfUFBDX1JFTEFUSVZFKTsKKwkgIGJyZWFrOworCisJLyogSW5kaXJlY3QgLnNkYXRhMiByZWxvY2F0aW9uICovCisJY2FzZSAoaW50KVJfUFBDX0VNQl9TREEySTE2OgorCSAgQkZEX0FTU0VSVCAoc2RhdGEyICE9IE5VTEwpOworCSAgcmVsb2NhdGlvbiA9IGJmZF9lbGYzMl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLAorCQkJCQkJCQlzZGF0YTIsIGgsIHJlbG9jYXRpb24sIHJlbCwKKwkJCQkJCQkJUl9QUENfUkVMQVRJVkUpOworCSAgYnJlYWs7CisKKwkvKiBIYW5kbGUgdGhlIFRPQzE2IHJlbG9jLiAgV2Ugd2FudCB0byB1c2UgdGhlIG9mZnNldCB3aXRoaW4gdGhlIC5nb3QKKwkgICBzZWN0aW9uLCBub3QgdGhlIGFjdHVhbCBWTUEuICBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gZ2VuZXJhdGluZworCSAgIGFuIGVtYmVkZGVkIEVMRiBvYmplY3QsIGZvciB3aGljaCB0aGUgLmdvdCBzZWN0aW9uIGFjdHMgbGlrZSB0aGUKKwkgICBBSVggLnRvYyBzZWN0aW9uLiAgKi8KKwljYXNlIChpbnQpUl9QUENfVE9DMTY6CQkJLyogcGhvbnkgR09UMTYgcmVsb2NhdGlvbnMgKi8KKwkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKKwkgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKQorCQkgICAgICB8fCBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLmdvdCIpID09IDAKKwkJICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5jZ290IikgPT0gMCkKKworCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCArIDB4ODAwMDsKKwkgIGJyZWFrOworCisJY2FzZSAoaW50KVJfUFBDX1BMVFJFTDI0OgorCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQorICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKwkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7CisKKwkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMQorCSAgICAgIHx8IHNwbHQgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKKyAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgorICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAorCQkJKyBoLT5wbHQub2Zmc2V0KTsKKyAJICBicmVhazsKKworCS8qIHJlbG9jYXRlIGFnYWluc3QgX1NEQV9CQVNFXyAqLworCWNhc2UgKGludClSX1BQQ19TREFSRUwxNjoKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqbmFtZTsKKworCSAgICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7CisJICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjLT5vdXRwdXRfc2VjdGlvbik7CisJICAgIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSAhPSAwCisJCSYmIHN0cmNtcCAobmFtZSwgIi5zYnNzIikgIT0gMCkKKwkgICAgICB7CisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKKwkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCQkgICAgICAgc3ltX25hbWUsCisJCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCisJCQkJICAgICAgIG5hbWUpOworCSAgICAgIH0KKwkgICAgYWRkZW5kIC09IChzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKKwkJICAgICAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCSAgfQorCSAgYnJlYWs7CisKKworCS8qIHJlbG9jYXRlIGFnYWluc3QgX1NEQTJfQkFTRV8gKi8KKwljYXNlIChpbnQpUl9QUENfRU1CX1NEQTJSRUw6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOworCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOworCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDAgJiYgc3RyY21wIChuYW1lLCAiLnNic3MyIikgIT0gMCkKKwkgICAgICB7CisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKKwkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCQkgICAgICAgc3ltX25hbWUsCisJCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCisJCQkJICAgICAgIG5hbWUpOworCQkKKwkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCXJldCA9IGZhbHNlOworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgIGFkZGVuZCAtPSAoc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwkgIH0KKwkgIGJyZWFrOworCisKKwkvKiByZWxvY2F0ZSBhZ2FpbnN0IGVpdGhlciBfU0RBX0JBU0VfLCBfU0RBMl9CQVNFXywgb3IgMCAqLworCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMjE6CisJY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTREE6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisJICAgIGludCByZWc7CisKKwkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOworCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOworCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCisJICAgICAgeworCQlyZWcgPSAxMzsKKwkJYWRkZW5kIC09IChzZGF0YS0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKKwkJCSAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICsgc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCSAgICAgIH0KKworCSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEyIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuc2JzczIiKSA9PSAwKQorCSAgICAgIHsKKwkJcmVnID0gMjsKKwkJYWRkZW5kIC09IChzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCSAgICAgIH0KKworCSAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuUFBDLkVNQi5zZGF0YTAiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIi5QUEMuRU1CLnNic3MwIikgPT0gMCkKKwkgICAgICB7CisJCXJlZyA9IDA7CisJICAgICAgfQorCisJICAgIGVsc2UKKwkgICAgICB7CisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIG91dHB1dCBzZWN0aW9uICglcykiKSwKKwkJCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCQkgICAgICAgc3ltX25hbWUsCisJCQkJICAgICAgIHBwY19lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0tPm5hbWUsCisJCQkJICAgICAgIG5hbWUpOworCisJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQlyZXQgPSBmYWxzZTsKKwkJY29udGludWU7CisJICAgICAgfQorCisJICAgIGlmIChyX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxKQorCSAgICAgIHsJCQkvKiBmaWxsIGluIHJlZ2lzdGVyIGZpZWxkICovCisJCWluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7CisJCWluc24gPSAoaW5zbiAmIH5SQV9SRUdJU1RFUl9NQVNLKSB8IChyZWcgPDwgUkFfUkVHSVNURVJfU0hJRlQpOworCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIG9mZnNldCk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKwkvKiBSZWxvY2F0ZSBhZ2FpbnN0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gKi8KKwljYXNlIChpbnQpUl9QUENfU0VDVE9GRjoKKwljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9MTzoKKwljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9ISToKKwkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKKwkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7CisJICBicmVhazsKKworCWNhc2UgKGludClSX1BQQ19TRUNUT0ZGX0hBOgorCSAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOworCSAgYWRkZW5kIC09IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKwkgIGFkZGVuZCArPSAoKHJlbG9jYXRpb24gKyBhZGRlbmQpICYgMHg4MDAwKSA8PCAxOworCSAgYnJlYWs7CisKKwkvKiBOZWdhdGl2ZSByZWxvY2F0aW9ucyAqLworCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIzMjoKKwljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTY6CisJY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2X0xPOgorCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9ISToKKwkgIGFkZGVuZCAtPSAyKnJlbG9jYXRpb247CisJICBicmVhazsKKworCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9IQToKKwkgIGFkZGVuZCAtPSAyKnJlbG9jYXRpb247CisJICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKKwkgIGJyZWFrOworCisJLyogTk9QIHJlbG9jYXRpb24gdGhhdCBwcmV2ZW50cyBnYXJiYWdlIGNvbGxlY3RpbmcgbGlua2VycyBmcm9tIG9taXR0aW5nIGEKKwkgICByZWZlcmVuY2UuICAqLworCWNhc2UgKGludClSX1BQQ19FTUJfTVJLUkVGOgorCSAgY29udGludWU7CisKKwljYXNlIChpbnQpUl9QUENfQ09QWToKKwljYXNlIChpbnQpUl9QUENfR0xPQl9EQVQ6CisJY2FzZSAoaW50KVJfUFBDX0pNUF9TTE9UOgorCWNhc2UgKGludClSX1BQQ19SRUxBVElWRToKKwljYXNlIChpbnQpUl9QUENfUExUMzI6CisJY2FzZSAoaW50KVJfUFBDX1BMVFJFTDMyOgorCWNhc2UgKGludClSX1BQQ19QTFQxNl9MTzoKKwljYXNlIChpbnQpUl9QUENfUExUMTZfSEk6CisJY2FzZSAoaW50KVJfUFBDX1BMVDE2X0hBOgorCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU0VDMTY6CisJY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9MTzoKKwljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0hJOgorCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfSEE6CisJY2FzZSAoaW50KVJfUFBDX0VNQl9CSVRfRkxEOgorCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogUmVsb2NhdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3Igc3ltYm9sICVzLiIpLAorCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAorCQkJCSBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAorCQkJCSBzeW1fbmFtZSk7CisKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisJICByZXQgPSBmYWxzZTsKKwkgIGNvbnRpbnVlOworCisJY2FzZSAoaW50KVJfUFBDX0dOVV9WVElOSEVSSVQ6CisJY2FzZSAoaW50KVJfUFBDX0dOVV9WVEVOVFJZOgorCSAgLyogVGhlc2UgYXJlIG5vLW9wcyBpbiB0aGUgZW5kLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworCisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlx0dHlwZSA9ICVzICglZCksIG5hbWUgPSAlcywgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKKwkgICAgICAgaG93dG8tPm5hbWUsCisJICAgICAgIChpbnQpcl90eXBlLAorCSAgICAgICBzeW1fbmFtZSwKKwkgICAgICAgcl9zeW1uZHgsCisJICAgICAgIChsb25nKW9mZnNldCwKKwkgICAgICAgKGxvbmcpYWRkZW5kKTsKKyNlbmRpZgorCisgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKKwkJCQkgICAgaW5wdXRfYmZkLAorCQkJCSAgICBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICBjb250ZW50cywKKwkJCQkgICAgb2Zmc2V0LAorCQkJCSAgICByZWxvY2F0aW9uLAorCQkJCSAgICBhZGRlbmQpOworCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgcmV0ID0gZmFsc2U7CisJICBzd2l0Y2ggKHIpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJaWYgKGggIT0gTlVMTCkKKwkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkJZWxzZQorCQkgIHsKKwkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCisJCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCisJCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7CisJCSAgICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgICBicmVhazsKKworCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCisJCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJCSAgfQorCisJCSgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykoaW5mbywKKwkJCQkJCSAgIG5hbWUsCisJCQkJCQkgICBob3d0by0+bmFtZSwKKwkJCQkJCSAgIChiZmRfdm1hKSAwLAorCQkJCQkJICAgaW5wdXRfYmZkLAorCQkJCQkJICAgaW5wdXRfc2VjdGlvbiwKKwkJCQkJCSAgIG9mZnNldCk7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIH0KKwl9CisgICAgfQorCisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIHJldDsKK30KKworDAorI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXBvd2VycGNsZSIKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9wb3dlcnBjX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1wb3dlcnBjIgorI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfcG93ZXJwYworI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1BQQworI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMDAKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JcHBjX2VsZl9pbmZvX3RvX2hvd3RvCisKKyNpZmRlZiAgRU1fQ1lHTlVTX1BPV0VSUEMKKyNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMQlFTV9DWUdOVVNfUE9XRVJQQworI2VuZGlmCisKKyNpZmRlZiBFTV9QUENfT0xECisjZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIJRU1fUFBDX09MRAorI2VuZGlmCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQJMQorI2RlZmluZSBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldAk0CisjZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkxCisjZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkxMgorI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUJUExUX0lOSVRJQUxfRU5UUllfU0laRQorCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCXBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQlwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uICAgICAgICAgICAgIHBwY19lbGZfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQlwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCQlfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbF9saW5rCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCQlwcGNfZWxmX2djX21hcmtfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQlwcGNfZWxmX2djX3N3ZWVwX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJCXBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCXBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQlwcGNfZWxmX2NoZWNrX3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQlwcGNfZWxmX2FkZF9zeW1ib2xfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJcHBjX2VsZl9mYWtlX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzCXBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCQlwcGNfZWxmX21vZGlmeV9zZWdtZW50X21hcAorCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItc2guYyBiL2JmZC9lbGYzMi1zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItc2guYwpAQCAtMCwwICsxLDIwNTkgQEAKKy8qIEhpdGFjaGkgU0ggc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvc2guaCIKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9pZ25vcmVfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHNoX2VsZl9pbmZvX3RvX2hvd3RvCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK3N0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOworc3RhdGljIGJvb2xlYW4gc2hfZWxmX2FsaWduX2xvYWRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHNoX2VsZl9zd2FwX2luc25zCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7CitzdGF0aWMgYmZkX2J5dGUgKnNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAorCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfZWxmX2hvd3RvX3RhYmxlW10gPQoreworICAvKiBObyByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfU0hfTk9ORSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1NIX05PTkUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKKyAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCisgIEhPV1RPIChSX1NIX0RJUjMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9TSF9ESVIzMiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9TSF9SRUwzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfUkVMMzIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogOCBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIGRpdmlkZWQgYnkgMi4gICovCisgIEhPV1RPIChSX1NIX0RJUjhXUE4sCQkvKiB0eXBlICovCisJIDEsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfRElSOFdQTiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDEyIGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KKyAgSE9XVE8gKFJfU0hfSU5EMTJXLAkJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9TSF9JTkQxMlciLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiA4IGJpdCB1bnNpZ25lZCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICAqLworICBIT1dUTyAoUl9TSF9ESVI4V1BMLAkJLyogdHlwZSAqLworCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfRElSOFdQTCIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gICovCisgIEhPV1RPIChSX1NIX0RJUjhXUFosCQkvKiB0eXBlICovCisJIDEsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9TSF9ESVI4V1BaIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogOCBiaXQgR0JSIHJlbGF0aXZlLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB3ZSBoYXZlIHNvbWUKKyAgICAgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQgaXMgbm90CisgICAgIGltcGxlbWVudGVkLiAgKi8KKyAgSE9XVE8gKFJfU0hfRElSOEJQLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1NIX0RJUjhCUCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogOCBiaXQgR0JSIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYKKyAgICAgd2UgaGF2ZSBzb21lIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0CisgICAgIGlzIG5vdCBpbXBsZW1lbnRlZC4gICovCisgIEhPV1RPIChSX1NIX0RJUjhXLAkJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1NIX0RJUjhXIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSA0LiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgorICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKKyAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KKyAgSE9XVE8gKFJfU0hfRElSOEwsCQkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfRElSOEwiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIHsgMTAgfSwKKyAgeyAxMSB9LAorICB7IDEyIH0sCisgIHsgMTMgfSwKKyAgeyAxNCB9LAorICB7IDE1IH0sCisgIHsgMTYgfSwKKyAgeyAxNyB9LAorICB7IDE4IH0sCisgIHsgMTkgfSwKKyAgeyAyMCB9LAorICB7IDIxIH0sCisgIHsgMjIgfSwKKyAgeyAyMyB9LAorICB7IDI0IH0sCisKKyAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbiB1c2VkIGZvciByZWxheGluZy4gIFRoZQorICAgICBmaW5hbCBwYXNzIG9mIHRoZSBsaW5rZXIgbmV2ZXIgbmVlZHMgdG8gZG8gYW55dGhpbmcgd2l0aCBhbnkgb2YKKyAgICAgdGhlc2UgcmVsb2NzLiAgQW55IHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCisgICAgIHJlbGF4YXRpb24gY29kZS4gICovCisKKyAgLyogQSAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KKyAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKKyAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLworICBIT1dUTyAoUl9TSF9TV0lUQ0gxNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfU1dJVENIMTYiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KKyAgICAgc3VjaCBhcyBgYC5sb25nIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKKyAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLworICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfU1dJVENIMzIiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSW5kaWNhdGVzIGEgLnVzZXMgcHNldWRvLW9wLiAgVGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgLnVzZXMKKyAgICAgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBjYW4gYmUgcmVsYXhlZC4KKyAgICAgVGhlIG9mZnNldCBmaWVsZCBob2xkcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbgorICAgICB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCisgIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfVVNFUyIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0bworICAgICBieSB0aGUgcmVnaXN0ZXIgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIG9mZnNldAorICAgICBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCisgICAgIG9iamVjdCBmaWxlLiAgKi8KKyAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfQ09VTlQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEluZGljYXRlcyBhbiBhbGlnbm1lbnQgc3RhdGVtZW50LiAgVGhlIG9mZnNldCBmaWVsZCBpcyB0aGUgcG93ZXIKKyAgICAgb2YgMiB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCisgICAgIGFsaWduZWQuICAqLworICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9TSF9BTElHTiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBiZWZvcmUgYSBibG9jayBvZgorICAgICBpbnN0cnVjdGlvbnMuICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBhc3N1bWluaW5nIGl0CisgICAgIGNvbnRhaW5zIGRhdGEsIHVubGVzcyB0aGlzIHJlbG9jIGlzIHNlZW4uICAqLworICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1NIX0NPREUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGFmdGVyIGEgYmxvY2sgb2YKKyAgICAgaW5zdHJ1Y3Rpb25zIHdoZW4gaXQgc2VlcyBkYXRhIHRoYXQgaXMgbm90IGluc3RydWN0aW9ucy4gICovCisgIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfREFUQSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhpcyByZWxvYyBmb3IgZWFjaCBsYWJlbCB3aXRoaW4gYSBibG9jaworICAgICBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBhdm9pZCBzd2FwcGluZworICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KKyAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfU0hfTEFCRUwiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEFuIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCisgICAgIHN1Y2ggYXMgYGAud29yZCBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCisgICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KKyAgSE9XVE8gKFJfU0hfU1dJVENIOCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9TSF9TV0lUQ0g4IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCisgIEhPV1RPIChSX1NIX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX1NIX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLworICBIT1dUTyAoUl9TSF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfU0hfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCisgICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKKyAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorc2hfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAorCSAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sX2luOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgYmZkX3ZtYSBzeW1fdmFsdWU7CisgIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgcl90eXBlOworICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOworCisgIHJfdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBQYXJ0aWFsIGxpbmtpbmctLWRvIG5vdGhpbmcuICAqLworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QgYmUKKyAgICAgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KKyAgaWYgKHJfdHlwZSAhPSBSX1NIX0RJUjMyCisgICAgICAmJiAocl90eXBlICE9IFJfU0hfSU5EMTJXCisJICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICBpZiAoc3ltYm9sX2luICE9IE5VTEwKKyAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQorICAgIHN5bV92YWx1ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGVsc2UgCisgICAgc3ltX3ZhbHVlID0gKHN5bWJvbF9pbi0+dmFsdWUgKworCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKKwkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisKKyAgc3dpdGNoIChyX3R5cGUpCisgICAgeworICAgIGNhc2UgUl9TSF9ESVIzMjoKKyAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7CisgICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisgICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfU0hfSU5EMTJXOgorICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKKyAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOworICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJICAgICsgYWRkcgorCQkgICAgKyA0KTsKKyAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOworICAgICAgaWYgKGluc24gJiAweDgwMCkKKwlzeW1fdmFsdWUgLT0gMHgxMDAwOworICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7CisgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7CisgICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmVsb2NzIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLAorICAgd2hpY2ggdGhlIGxpbmtlciBzaG91bGQgb3RoZXJ3aXNlIGlnbm9yZS4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3NoX2VsZl9pZ25vcmVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCisgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLworCitzdHJ1Y3QgZWxmX3JlbG9jX21hcAoreworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKKyAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworfTsKKworLyogQW4gYXJyYXkgbWFwcGluZyBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzaF9yZWxvY19tYXBbXSA9Cit7CisgIHsgQkZEX1JFTE9DX05PTkUsIFJfU0hfTk9ORSB9LAorICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9ESVIzMiB9LAorICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NIX0RJUjMyIH0sCisgIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NIX1JFTDMyIH0sCisgIHsgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsIFJfU0hfRElSOFdQTiB9LAorICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwgUl9TSF9JTkQxMlcgfSwKKyAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLCBSX1NIX0RJUjhXUFogfSwKKyAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX0RJUjhXUEwgfSwKKyAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCisgIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCisgIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCisgIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAorICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAorICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAorICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKKyAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCisgIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCisgIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NIX0dOVV9WVElOSEVSSVQgfSwKKyAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NIX0dOVV9WVEVOVFJZIH0sCit9OworCisvKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCisgICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK3NoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc2hfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCisgICAgeworICAgICAgaWYgKHNoX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisJcmV0dXJuICZzaF9lbGZfaG93dG9fdGFibGVbKGludCkgc2hfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYW4gRUxGIHJlbG9jLCBmaWxsIGluIHRoZSBob3d0byBmaWVsZCBvZiBhIHJlbGVudC4gICovCisKK3N0YXRpYyB2b2lkCitzaF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OworeworICB1bnNpZ25lZCBpbnQgcjsKKworICByID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7CisKKyAgQkZEX0FTU0VSVCAociA8ICh1bnNpZ25lZCBpbnQpIFJfU0hfbWF4KTsKKyAgQkZEX0FTU0VSVCAociA8IFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQyB8fCByID4gUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpOworCisgIGNhY2hlX3B0ci0+aG93dG8gPSAmc2hfZWxmX2hvd3RvX3RhYmxlW3JdOworfQorDAorLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciBTSCBFTEYuICBTZWUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGZ1bmN0aW9uIGluIGNvZmYtc2guYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy4gIEZJWE1FOgorICAgVGhlcmUgaXMgYSBsb3Qgb2YgZHVwbGljYXRpb24gaGVyZSBiZXR3ZWVuIHRoaXMgY29kZSBhbmQgdGhlIENPRkYKKyAgIHNwZWNpZmljIGNvZGUuICBUaGUgZm9ybWF0IG9mIHJlbG9jcyBhbmQgc3ltYm9scyBpcyB3b3VuZCBkZWVwbHkKKyAgIGludG8gdGhpcyBjb2RlLCBidXQgaXQgd291bGQgc3RpbGwgYmUgYmV0dGVyIGlmIHRoZSBkdXBsaWNhdGlvbgorICAgY291bGQgYmUgZWxpbWluYXRlZCBzb21laG93LiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgYWx0aG91Z2ggYm90aAorICAgZnVuY3Rpb25zIHVzZSBzeW1ib2xzIGxpa2UgUl9TSF9DT0RFLCB0aG9zZSBzeW1ib2xzIGhhdmUgZGlmZmVyZW50CisgICB2YWx1ZXM7IGluIGNvZmYtc2guYyB0aGV5IGNvbWUgZnJvbSBpbmNsdWRlL2NvZmYvc2guaCwgd2hlcmVhcyBoZXJlCisgICB0aGV5IGNvbWUgZnJvbSBlbnVtIGVsZl9zaF9yZWxvY190eXBlIGluIGluY2x1ZGUvZWxmL3NoLmguICAqLworCitzdGF0aWMgYm9vbGVhbiAKK3NoX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgYm9vbGVhbiAqYWdhaW47Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOworICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOworICBib29sZWFuIGhhdmVfY29kZTsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOworICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOworICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKKworICAqYWdhaW4gPSBmYWxzZTsKKworICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCisgICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCisgICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KKyAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCisgICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKKworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisKKyAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcworCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAorCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKyAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKworICBoYXZlX2NvZGUgPSBmYWxzZTsKKworICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7CisgICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OworICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKKworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0NPREUpCisJaGF2ZV9jb2RlID0gdHJ1ZTsKKworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX1VTRVMpCisJY29udGludWU7CisKKyAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwl7CisJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKKwkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKKwkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAorCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFRoZSByX2FkZGVuZCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KKyAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9hZGRlbmQgZmllbGQgaXMKKyAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAorICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KKyAgICAgIGxhZGRyID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7CisgICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IiksCisJCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpOworCSAgY29udGludWU7CisJfQorICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOworCisgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8KKyAgICAgICAgIGRvLiAgKi8KKyAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhkMDAwKQorCXsKKwkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiKSwKKwkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCwgaW5zbikpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCisgICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKKyAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAorICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCisgICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KKyAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7CisgICAgICBwYWRkciAqPSA0OworICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKKyAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKKwl7CisJICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIpLAorCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCisgICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcworICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KKyAgICAgIGZvciAoaXJlbGZuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsZm4gPCBpcmVsZW5kOyBpcmVsZm4rKykKKwlpZiAoaXJlbGZuLT5yX29mZnNldCA9PSBwYWRkcgorCSAgICAmJiBFTEYzMl9SX1RZUEUgKGlyZWxmbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0RJUjMyKQorCSAgYnJlYWs7CisgICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCisJeworCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiksCisJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLworICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwl7CisJICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKKwkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKKwkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7CisJICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKKwkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCisJCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCisgICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisJICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCisJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCisJCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pLAorCQkJCSAgICAmaXN5bSk7CisKKwkgIGlmIChpc3ltLnN0X3NobmR4ICE9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKSkKKwkgICAgeworCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgICAgKF8oIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIpLAorCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKKwkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaW5keDsKKwkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87CisJICBoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOworCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKKwkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKKyAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQorICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCX0KKworICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIpOworCisgICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLworICAgICAgZm9mZiA9IChzeW12YWwKKwkgICAgICAtIChpcmVsLT5yX29mZnNldAorCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSArIDQpKTsKKyAgICAgIGlmIChmb2ZmIDwgLTB4MTAwMCB8fCBmb2ZmID49IDB4MTAwMCkKKwl7CisJICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCB3ZSBjYW4ndCBzaG9ydGVuIHRoaXMgZnVuY3Rpb24gY2FsbC4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFNob3J0ZW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLworCisgICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KKwkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKKwkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKKwkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCisJIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOworCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgorCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCisKKyAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKyAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKyAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKKworICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLworCisgICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfSU5EMTJXIHJlbG9jLCBhbmQKKyAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KKyAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwgUl9TSF9JTkQxMlcpOworICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKKyAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIElORDEyVworICAgICAgICAgICAgIHJlbG9jcy4gICovCisJICBiZmRfcHV0XzE2IChhYmZkLAorCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCisJCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBjYW4ndCBmdWxseSByZXNvbHZlIHRoaXMgeWV0LCBiZWNhdXNlIHRoZSBleHRlcm5hbAorICAgICAgICAgICAgIHN5bWJvbCB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBieSBmdXR1cmUgcmVsYXhpbmcuICBXZSBsZXQKKyAgICAgICAgICAgICB0aGUgZmluYWwgbGluayBwaGFzZSBoYW5kbGUgaXQuICAqLworCSAgYmZkX3B1dF8xNiAoYWJmZCwgMHhiMDAwLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKKwl9CisKKyAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKKyAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLworICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQorCWlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pID09IChpbnQpIFJfU0hfVVNFUworCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl9vZmZzZXQgKyA0ICsgaXJlbHNjYW4tPnJfYWRkZW5kKQorCSAgYnJlYWs7CisgICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQorCXsKKwkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAorCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgorCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKKwkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCisgICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQorICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCisgICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCisJaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gcGFkZHIKKwkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsY291bnQtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT1VOVCkKKwkgIGJyZWFrOworCisgICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLworICAgICAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBsYWRkciwgMikpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywganVzdCBpbiBjYXNlIGl0IHBlcm1pdHMgc29tZQorICAgICAgICAgb3RoZXIgZnVuY3Rpb24gY2FsbCB0byBjb21lIHdpdGhpbiByYW5nZSwgd2Ugc2hvdWxkIHJlbGF4CisgICAgICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KKyAgICAgICphZ2FpbiA9IHRydWU7CisKKyAgICAgIC8qIE5vdyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIENPVU5UIHJlbG9jLiAgKi8KKyAgICAgIGlmIChpcmVsY291bnQgPj0gaXJlbGVuZCkKKwl7CisJICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgKF8oIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiKSwKKwkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGUgbnVtYmVyIG9mIHVzZXMgaXMgc3RvcmVkIGluIHRoZSByX2FkZGVuZCBmaWVsZC4gIFdlJ3ZlCisgICAgICAgICBqdXN0IGRlbGV0ZWQgb25lLiAgKi8KKyAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCisJeworCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiKSwKKwkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC0taXJlbGNvdW50LT5yX2FkZGVuZDsKKworICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcywgd2UgY2FuIGRlbGV0ZSB0aGUgYWRkcmVzcy4gIFJlbG9hZAorICAgICAgICAgdGhlIGFkZHJlc3MgZnJvbSBpcmVsZm4sIGluIGNhc2UgaXQgd2FzIGNoYW5nZWQgYnkgdGhlCisgICAgICAgICBwcmV2aW91cyBjYWxsIHRvIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMuICAqLworICAgICAgaWYgKGlyZWxjb3VudC0+cl9hZGRlbmQgPT0gMCkKKwl7CisJICBpZiAoISBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGlyZWxmbi0+cl9vZmZzZXQsIDQpKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKyAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCisgICAgfQorCisgIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCisgICAgIGJ5dGUgYm91bmRhcmllcy4gICovCisgIGlmIChoYXZlX2NvZGUpCisgICAgeworICAgICAgYm9vbGVhbiBzd2FwcGVkOworCisgICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLworICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJeworCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCisJICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7CisJICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKKworCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKKwkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB9CisJfQorCisgICAgICBpZiAoISBzaF9lbGZfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywKKwkJCQkmc3dhcHBlZCkpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlmIChzd2FwcGVkKQorCXsKKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKwkgIGZyZWVfcmVsb2NzID0gTlVMTDsKKworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwkgIGZyZWVfY29udGVudHMgPSBOVUxMOworCisJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOworCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKKwl9CisgICAgfQorCisgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKKyAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCWZyZWUgKGZyZWVfY29udGVudHMpOworICAgICAgZWxzZQorCXsKKwkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKKwl9CisgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCisJZnJlZSAoZnJlZV9leHRzeW1zKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKKwl9CisgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9yZWxvY3MpOworICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfY29udGVudHMpOworICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gIEZJWE1FOiBUaGVyZSBpcyBhCisgICBsb3Qgb2YgZHVwbGljYXRpb24gYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBzaF9yZWxheF9kZWxldGVfYnl0ZXMKKyAgIGluIGNvZmYtc2guYy4gICovCisKK3N0YXRpYyBib29sZWFuCitzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgaW50IGNvdW50OworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOworICBpbnQgc2huZHgsIGluZGV4OworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKKyAgYmZkX3ZtYSB0b2FkZHI7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKKyAgYXNlY3Rpb24gKm87CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKKworICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKKworICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOworCisgIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50CisgICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KKworICBpcmVsYWxpZ24gPSBOVUxMOworICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKKworICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOworICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7CisgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9BTElHTgorCSAgJiYgaXJlbC0+cl9vZmZzZXQgPiBhZGRyCisJICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfYWRkZW5kKSkKKwl7CisJICBpcmVsYWxpZ24gPSBpcmVsOworCSAgdG9hZGRyID0gaXJlbC0+cl9vZmZzZXQ7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLworICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOworICBpZiAoaXJlbGFsaWduID09IE5VTEwpCisgICAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKworI2RlZmluZSBOT1BfT1BDT0RFICgweDAwMDkpCisKKyAgICAgIEJGRF9BU1NFUlQgKChjb3VudCAmIDEpID09IDApOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpCisJYmZkX3B1dF8xNiAoYWJmZCwgTk9QX09QQ09ERSwgY29udGVudHMgKyB0b2FkZHIgLSBjb3VudCArIGkpOworICAgIH0KKworICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLworICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisgICAgeworICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7CisgICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKKyAgICAgIGludCBpbnNuID0gMDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOworICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKKyAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOworICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKKworICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCisgICAgICBucmFkZHIgPSBpcmVsLT5yX29mZnNldDsKKyAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCisJICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpCisJICB8fCAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KKwkgICAgICAmJiBpcmVsLT5yX29mZnNldCA9PSB0b2FkZHIpKQorCW5yYWRkciAtPSBjb3VudDsKKworICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAorCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAorCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLworICAgICAgaWYgKGlyZWwtPnJfb2Zmc2V0ID49IGFkZHIKKwkgICYmIGlyZWwtPnJfb2Zmc2V0IDwgYWRkciArIGNvdW50CisJICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9BTElHTgorCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQ09ERQorCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfREFUQQorCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfTEFCRUwpCisJaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkgICAgIChpbnQpIFJfU0hfTk9ORSk7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKKyAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLworICAgICAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQorCXsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfRElSOFdQTjoKKwljYXNlIFJfU0hfSU5EMTJXOgorCWNhc2UgUl9TSF9ESVI4V1BaOgorCWNhc2UgUl9TSF9ESVI4V1BMOgorCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKKwkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7CisJICBicmVhazsKKwl9CisKKyAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKKwl7CisJZGVmYXVsdDoKKwkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7CisJICBicmVhazsKKworCWNhc2UgUl9TSF9ESVIzMjoKKwkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKKyAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKKyAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgorICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KKwkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCisJCQkJCWV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkJJnN5bSk7CisJICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAorCQkgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgorCQkgICAgICB8fCBzeW0uc3RfdmFsdWUgPj0gdG9hZGRyKSkKKwkJeworCQkgIGJmZF92bWEgdmFsOworCisJCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOworCQkgIHZhbCArPSBzeW0uc3RfdmFsdWU7CisJCSAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQorCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkJfQorCSAgICB9CisJICBzdGFydCA9IHN0b3AgPSBhZGRyOworCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfRElSOFdQTjoKKwkgIG9mZiA9IGluc24gJiAweGZmOworCSAgaWYgKG9mZiAmIDB4ODApCisJICAgIG9mZiAtPSAweDEwMDsKKwkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7CisJICBicmVhazsKKworCWNhc2UgUl9TSF9JTkQxMlc6CisJICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKKwkgICAgICBpZiAob2ZmICYgMHg4MDApCisJCW9mZiAtPSAweDEwMDA7CisJICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfRElSOFdQWjoKKwkgIG9mZiA9IGluc24gJiAweGZmOworCSAgc3RvcCA9IHN0YXJ0ICsgNCArIG9mZiAqIDI7CisJICBicmVhazsKKworCWNhc2UgUl9TSF9ESVI4V1BMOgorCSAgb2ZmID0gaW5zbiAmIDB4ZmY7CisJICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OworCSAgYnJlYWs7CisKKwljYXNlIFJfU0hfU1dJVENIODoKKwljYXNlIFJfU0hfU1dJVENIMTY6CisJY2FzZSBSX1NIX1NXSVRDSDMyOgorCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAorCSAgICAgICAud29yZCBMMi1MMQorCSAgICAgVGhlIHJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCisJICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCisJICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAorCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKworCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKKwkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgLSAobG9uZykgaXJlbC0+cl9hZGRlbmQpOworCisJICBpZiAoc3RhcnQgPiBhZGRyCisJICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKKwkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKKwkgICAgaXJlbC0+cl9hZGRlbmQgKz0gY291bnQ7CisJICBlbHNlIGlmIChzdG9wID4gYWRkcgorCQkgICAmJiBzdG9wIDwgdG9hZGRyCisJCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCisJICAgIGlyZWwtPnJfYWRkZW5kIC09IGNvdW50OworCisJICBzdGFydCA9IHN0b3A7CisKKwkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0gxNikKKwkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7CisJICBlbHNlIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0g4KQorCSAgICB2b2ZmID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7CisJICBlbHNlCisJICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOworCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOworCisJICBicmVhazsKKworCWNhc2UgUl9TSF9VU0VTOgorCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKKwkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKKwkJCSAgICArIChsb25nKSBpcmVsLT5yX2FkZGVuZAorCQkJICAgICsgNCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChzdGFydCA+IGFkZHIKKwkgICYmIHN0YXJ0IDwgdG9hZGRyCisJICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKKwlhZGp1c3QgPSBjb3VudDsKKyAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCisJICAgICAgICYmIHN0b3AgPCB0b2FkZHIKKwkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKKwlhZGp1c3QgPSAtIGNvdW50OworICAgICAgZWxzZQorCWFkanVzdCA9IDA7CisKKyAgICAgIGlmIChhZGp1c3QgIT0gMCkKKwl7CisJICBvaW5zbiA9IGluc247CisJICBvdmVyZmxvdyA9IGZhbHNlOworCSAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX1NIX0RJUjhXUE46CisJICAgIGNhc2UgUl9TSF9ESVI4V1BaOgorCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKKwkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCisJCW92ZXJmbG93ID0gdHJ1ZTsKKwkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX1NIX0lORDEyVzoKKwkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7CisJICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9ESVI4V1BMOgorCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKKwkgICAgICBpZiAoY291bnQgPj0gNCkKKwkJaW5zbiArPSBhZGp1c3QgLyA0OworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICgoaXJlbC0+cl9vZmZzZXQgJiAzKSA9PSAwKQorCQkgICAgKytpbnNuOworCQl9CisJICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKKwkgICAgICB2b2ZmICs9IGFkanVzdDsKKwkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6CisJICAgICAgdm9mZiArPSBhZGp1c3Q7CisJICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJfU0hfVVNFUzoKKwkgICAgICBpcmVsLT5yX2FkZGVuZCArPSBhZGp1c3Q7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKG92ZXJmbG93KQorCSAgICB7CisJICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAoXygiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciKSwKKwkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgaXJlbC0+cl9vZmZzZXQgPSBucmFkZHI7CisgICAgfQorCisgIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKKyAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAorICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsc2NhbiwgKmlyZWxzY2FuZW5kOworICAgICAgYmZkX2J5dGUgKm9jb250ZW50czsKKworICAgICAgaWYgKG8gPT0gc2VjCisJICB8fCAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKKwkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgcmVsb2NzLiAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMKKyAgICAgICAgIGZhbHNlLCB3ZSBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLCB3aGVuIHdlCisgICAgICAgICBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLworICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcworCQkJIChhYmZkLCBvLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKKwkJCSAgdHJ1ZSkpOworICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgb2NvbnRlbnRzID0gTlVMTDsKKyAgICAgIGlyZWxzY2FuZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7CisgICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxzY2FuZW5kOyBpcmVsc2NhbisrKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOworCisJICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsc2Nhbi0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0RJUjMyKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKEVMRjMyX1JfU1lNIChpcmVsc2Nhbi0+cl9pbmZvKSA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICBjb250aW51ZTsKKworCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLAorCQkJCSAgICBleHRzeW1zICsgRUxGMzJfUl9TWU0gKGlyZWxzY2FuLT5yX2luZm8pLAorCQkJCSAgICAmc3ltKTsKKworCSAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAorCSAgICAgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgorCQkgIHx8IHN5bS5zdF92YWx1ZSA+PSB0b2FkZHIpKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSB2YWw7CisKKwkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCisJCXsKKwkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCisJCSAgICBvY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCisJCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOworCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAorCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAorCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzID0gb2NvbnRlbnRzOworCQkgICAgfQorCQl9CisKKwkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOworCSAgICAgIHZhbCArPSBzeW0uc3RfdmFsdWU7CisJICAgICAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQorCQliZmRfcHV0XzMyIChhYmZkLCB2YWwgLSBjb3VudCwKKwkJCSAgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLworICBlc3ltID0gZXh0c3ltczsKKyAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOworICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07CisKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOworCisgICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAorCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKKwkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCisJeworCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKKwkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKKwl9CisgICAgfQorCisgIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KKyAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOworICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKKyAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOworCisgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKKyAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKKyAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4CisJICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCisJICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgorCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKKwl7CisJICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OworCX0KKyAgICB9CisKKyAgLyogU2VlIGlmIHdlIGNhbiBtb3ZlIHRoZSBBTElHTiByZWxvYyBmb3J3YXJkLiAgV2UgaGF2ZSBhZGp1c3RlZAorICAgICByX29mZnNldCBmb3IgaXQgYWxyZWFkeS4gICovCisgIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKKworICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOworICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfb2Zmc2V0LAorCQkJICAgICAxIDw8IGlyZWxhbGlnbi0+cl9hZGRlbmQpOworICAgICAgaWYgKGFsaWdudG8gIT0gYWxpZ25hZGRyKQorCXsKKwkgIC8qIFRhaWwgcmVjdXJzaW9uLiAgKi8KKwkgIHJldHVybiBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKKwkJCQkJICAgIGFsaWdudG8gLSBhbGlnbmFkZHIpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQorICAgYm91bmRhcmllcy4gIFRoaXMgaXMgbGlrZSBzaF9hbGlnbl9sb2FkcyBpbiBjb2ZmLXNoLmMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc2hfZWxmX2FsaWduX2xvYWRzIChhYmZkLCBzZWMsIGludGVybmFsX3JlbG9jcywgY29udGVudHMsIHBzd2FwcGVkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Cit7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKKyAgYmZkX3ZtYSAqbGFiZWxzID0gTlVMTDsKKyAgYmZkX3ZtYSAqbGFiZWwsICpsYWJlbF9lbmQ7CisKKyAgKnBzd2FwcGVkID0gZmFsc2U7CisKKyAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7CisKKyAgLyogR2V0IGFsbCB0aGUgYWRkcmVzc2VzIHdpdGggbGFiZWxzIG9uIHRoZW0uICAqLworICBsYWJlbHMgPSAoYmZkX3ZtYSAqKSBiZmRfbWFsbG9jIChzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChiZmRfdm1hKSk7CisgIGlmIChsYWJlbHMgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgbGFiZWxfZW5kID0gbGFiZWxzOworICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisgICAgeworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0xBQkVMKQorCXsKKwkgICpsYWJlbF9lbmQgPSBpcmVsLT5yX29mZnNldDsKKwkgICsrbGFiZWxfZW5kOworCX0KKyAgICB9CisKKyAgLyogTm90ZSB0aGF0IHRoZSBhc3NlbWJsZXIgY3VycmVudGx5IGFsd2F5cyBvdXRwdXRzIHJlbG9jcyBpbgorICAgICBhZGRyZXNzIG9yZGVyLiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gc29ydAorICAgICB0aGUgbGFiZWwgdmFsdWVzIGFuZCB0aGUgcmVsb2NzLiAgKi8KKworICBsYWJlbCA9IGxhYmVsczsKKworICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisgICAgeworICAgICAgYmZkX3ZtYSBzdGFydCwgc3RvcDsKKworICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX0NPREUpCisJY29udGludWU7CisKKyAgICAgIHN0YXJ0ID0gaXJlbC0+cl9vZmZzZXQ7CisKKyAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorCWlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9EQVRBKQorCSAgYnJlYWs7CisgICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCisJc3RvcCA9IGlyZWwtPnJfb2Zmc2V0OworICAgICAgZWxzZQorCXN0b3AgPSBzZWMtPl9jb29rZWRfc2l6ZTsKKworICAgICAgaWYgKCEgX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4gKGFiZmQsIHNlYywgY29udGVudHMsIHNoX2VsZl9zd2FwX2luc25zLAorCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCisJCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIGZyZWUgKGxhYmVscyk7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChsYWJlbHMgIT0gTlVMTCkKKyAgICBmcmVlIChsYWJlbHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gIFRoaXMgaXMgbGlrZSBzaF9zd2FwX2luc25zIGluIGNvZmYtc2guYy4gICovCisKK3N0YXRpYyBib29sZWFuCitzaF9lbGZfc3dhcF9pbnNucyAoYWJmZCwgc2VjLCByZWxvY3MsIGNvbnRlbnRzLCBhZGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiByZWxvY3M7CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbG9jczsKKyAgdW5zaWduZWQgc2hvcnQgaTEsIGkyOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7CisKKyAgLyogU3dhcCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICAqLworICBpMSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgYWRkcik7CisgIGkyID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMik7CisgIGJmZF9wdXRfMTYgKGFiZmQsIGkyLCBjb250ZW50cyArIGFkZHIpOworICBiZmRfcHV0XzE2IChhYmZkLCBpMSwgY29udGVudHMgKyBhZGRyICsgMik7CisKKyAgLyogQWRqdXN0IGFsbCByZWxvYyBhZGRyZXNzZXMuICAqLworICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQorICAgIHsKKyAgICAgIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgdHlwZTsKKyAgICAgIGludCBhZGQ7CisKKyAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHR5cGVzIG9mIHJlbG9jcyB0aGF0IHdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgIGFkanVzdC4gIFRoZXNlIHJlbG9jcyBkbyBub3QgYXBwbHkgdG8gdGhlIGluc3RydWN0aW9uIGl0c2VsZiwKKyAgICAgICAgIGJ1dCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MuICAqLworICAgICAgdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbyk7CisgICAgICBpZiAodHlwZSA9PSBSX1NIX0FMSUdOCisJICB8fCB0eXBlID09IFJfU0hfQ09ERQorCSAgfHwgdHlwZSA9PSBSX1NIX0RBVEEKKwkgIHx8IHR5cGUgPT0gUl9TSF9MQUJFTCkKKwljb250aW51ZTsKKworICAgICAgLyogSWYgYW4gUl9TSF9VU0VTIHJlbG9jIHBvaW50cyB0byBvbmUgb2YgdGhlIGFkZHJlc3NlcyBiZWluZworICAgICAgICAgc3dhcHBlZCwgd2UgbXVzdCBhZGp1c3QgaXQuICBJdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZG8gdGhpcworICAgICAgICAgZm9yIGEganVtcCwgdGhvdWdoLCBzaW5jZSB3ZSB3YW50IHRvIGV4ZWN1dGUgYm90aAorICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBqdW1wLiAgKFdlIGhhdmUgYXZvaWRlZCBzd2FwcGluZworICAgICAgICAgYXJvdW5kIGEgbGFiZWwsIHNvIHRoZSBqdW1wIHdpbGwgbm90IHdpbmQgdXAgZXhlY3V0aW5nIGFuCisgICAgICAgICBpbnN0cnVjdGlvbiBpdCBzaG91bGRuJ3QpLiAgKi8KKyAgICAgIGlmICh0eXBlID09IFJfU0hfVVNFUykKKwl7CisJICBiZmRfdm1hIG9mZjsKKworCSAgb2ZmID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7CisJICBpZiAob2ZmID09IGFkZHIpCisJICAgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7CisJICBlbHNlIGlmIChvZmYgPT0gYWRkciArIDIpCisJICAgIGlyZWwtPnJfb2Zmc2V0IC09IDI7CisJfQorCisgICAgICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkcikKKwl7CisJICBpcmVsLT5yX29mZnNldCArPSAyOworCSAgYWRkID0gLTI7CisJfQorICAgICAgZWxzZSBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gYWRkciArIDIpCisJeworCSAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKKwkgIGFkZCA9IDI7CisJfQorICAgICAgZWxzZQorCWFkZCA9IDA7CisKKyAgICAgIGlmIChhZGQgIT0gMCkKKwl7CisJICBiZmRfYnl0ZSAqbG9jOworCSAgdW5zaWduZWQgc2hvcnQgaW5zbiwgb2luc247CisJICBib29sZWFuIG92ZXJmbG93OworCisJICBsb2MgPSBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0OworCSAgb3ZlcmZsb3cgPSBmYWxzZTsKKwkgIHN3aXRjaCAodHlwZSkKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUl9TSF9ESVI4V1BOOgorCSAgICBjYXNlIFJfU0hfRElSOFdQWjoKKwkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKKwkgICAgICBvaW5zbiA9IGluc247CisJICAgICAgaW5zbiArPSBhZGQgLyAyOworCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKKwkJb3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX1NIX0lORDEyVzoKKwkgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKKwkgICAgICBvaW5zbiA9IGluc247CisJICAgICAgaW5zbiArPSBhZGQgLyAyOworCSAgICAgIGlmICgob2luc24gJiAweGYwMDApICE9IChpbnNuICYgMHhmMDAwKSkKKwkJb3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSX1NIX0RJUjhXUEw6CisJICAgICAgLyogVGhpcyByZWxvYyBpZ25vcmVzIHRoZSBsZWFzdCBzaWduaWZpY2FudCAzIGJpdHMgb2YKKyAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gY291bnRlciBiZWZvcmUgYWRkaW5nIGluIHRoZSBvZmZzZXQuCisgICAgICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiBBRERSIGlzIGF0IGFuIGV2ZW4gYWRkcmVzcywgdGhlCisgICAgICAgICAgICAgICAgIHN3YXAgd2lsbCBub3QgYWZmZWN0IHRoZSBvZmZzZXQuICBJZiBBRERSIGlzIGFuIGF0IGFuCisgICAgICAgICAgICAgICAgIG9kZCBhZGRyZXNzLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGNyb3NzaW5nIGEKKyAgICAgICAgICAgICAgICAgZm91ciBieXRlIGJvdW5kYXJ5LCBhbmQgbXVzdCBiZSBhZGp1c3RlZC4gICovCisJICAgICAgaWYgKChhZGRyICYgMykgIT0gMCkKKwkJeworCQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOworCQkgIG9pbnNuID0gaW5zbjsKKwkJICBpbnNuICs9IGFkZCAvIDI7CisJCSAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQorCQkgICAgb3ZlcmZsb3cgPSB0cnVlOworCQkgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGxvYyk7CisJCX0KKworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChvdmVyZmxvdykKKwkgICAgeworCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgICAgKF8oIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIiksCisJCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogUmVsb2NhdGUgYW4gU0ggRUxGIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7CisgICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7CisgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKworICByZWwgPSByZWxvY3M7CisgIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICB7CisgICAgICBpbnQgcl90eXBlOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworICAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICAgYmZkX3ZtYSBhZGRlbmQgPSAoYmZkX3ZtYSkwOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisKKyAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKworICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKwl7CisJICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKKyAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKKyAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgICAgeworCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCXsKKwkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOworCQl9CisJICAgIH0KKworCSAgY29udGludWU7CisJfQorCisgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKKworICAgICAgLyogTWFueSBvZiB0aGUgcmVsb2NzIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLCBhbmQgYXJlCisgICAgICAgICBoYW5kbGVkIGVudGlyZWx5IGJ5IHRoZSByZWxheGF0aW9uIGNvZGUuICAqLworICAgICAgaWYgKHJfdHlwZSA+IChpbnQpIFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DKQorCWNvbnRpbnVlOworCisgICAgICBpZiAocl90eXBlIDwgMAorCSAgfHwgcl90eXBlID49IChpbnQpIFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQykKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNlcnRhaW5seSBpbmNvcnJlY3QuICBIb3dldmVyLCBpdCBpcyBob3cgdGhlCisgICAgICAgICBDT0ZGIGxpbmtlciB3b3Jrcy4gICovCisgICAgICBpZiAocl90eXBlICE9IChpbnQpIFJfU0hfRElSMzIKKwkgICYmIHJfdHlwZSAhPSAoaW50KSBSX1NIX0lORDEyVykKKwljb250aW51ZTsKKworICAgICAgaG93dG8gPSBzaF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7CisKKyAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKyAgICAgIGggPSBOVUxMOworICAgICAgc3ltID0gTlVMTDsKKyAgICAgIHNlYyA9IE5VTEw7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYW4gaW50ZXJuYWwgSU5EMTJXCisgICAgICAgICAgICAgcmVsb2NhdGlvbi4gIEZJWE1FOiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBob3cKKyAgICAgICAgICAgICB0aGUgQ09GRiByZWxvY2F0aW9ucyB3b3JrLiAgKi8KKwkgIGlmIChyX3R5cGUgPT0gKGludCkgUl9TSF9JTkQxMlcpCisJICAgIGNvbnRpbnVlOworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGhvdyB0aGUgQ09GRiByZWxvY2F0aW9ucyB3b3JrLiAgKi8KKyAgICAgIGlmIChyX3R5cGUgPT0gKGludCkgUl9TSF9JTkQxMlcpCisJcmVsb2NhdGlvbiAtPSA0OworCisgICAgICBzd2l0Y2ggKChpbnQpcl90eXBlKQorCXsKKwljYXNlIChpbnQpUl9TSF9ESVIzMjoKKwkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIENPRkYgcmVsb2NzIGRvbid0IHVzZSB0aGUgYWRkZW5kLiBUaGUgYWRkZW5kIGlzIHVzZWQgZm9yIFJfU0hfRElSMzIgCisJIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBjb21waWxlcnMuICovCisgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKKwkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgICAgIGFib3J0ICgpOworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJaWYgKGggIT0gTlVMTCkKKwkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkJZWxzZQorCQkgIHsKKwkJICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkJICAgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOworCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgaWYgKCpuYW1lID09ICdcMCcpCisJCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJCSAgfQorCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKKwkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQkgIHJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgIHdoaWNoIHVzZXMgc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLworCitzdGF0aWMgYmZkX2J5dGUgKgorc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAorCQkJCQlkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworICAgICBiZmRfYnl0ZSAqZGF0YTsKKyAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247CisgIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisgIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOworICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKKyAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7CisKKyAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKKyAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KKyAgaWYgKHJlbG9jYXRlYWJsZQorICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCisgICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCisJCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAorCQkJCQkJICAgICAgIHN5bWJvbHMpOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworCisgIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAorCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKKworICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCisgICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7CisgICAgICBhc2VjdGlvbiAqKnNlY3BwOworICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKKworICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCisJZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisgICAgICBlbHNlCisJeworCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCisJCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7CisJICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCisJCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQorCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcworCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCisJCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOworICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCisJCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7CisgICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbworCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOworICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKKyAgICAgIHNlY3BwID0gc2VjdGlvbnM7CisgICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKKyAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQorCXsKKwkgIGFzZWN0aW9uICppc2VjOworCisJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOworCisJICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKKwkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCisJICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOworCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCisJICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCisJICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogV2hvIGtub3dzPyAgKi8KKwkgICAgICBpc2VjID0gTlVMTDsKKwkgICAgfQorCisJICAqc2VjcHAgPSBpc2VjOworCX0KKworICAgICAgaWYgKCEgc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAorCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAorCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKKwlmcmVlIChzZWN0aW9ucyk7CisgICAgICBzZWN0aW9ucyA9IE5VTEw7CisgICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorCWZyZWUgKGludGVybmFsX3N5bXMpOworICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7CisgICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCisJZnJlZSAoZXh0ZXJuYWxfc3ltcyk7CisgICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKKyAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKKwlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIGRhdGE7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAorICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCisgICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKKyAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQorICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOworICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGludGVybmFsX3N5bXMpOworICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKKyAgICBmcmVlIChzZWN0aW9ucyk7CisgIHJldHVybiBOVUxMOworfQorc3RhdGljIGFzZWN0aW9uICoKK3NoX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQorICAgICAgIGJmZCAqYWJmZDsKKyAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgaWYgKGggIT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgeworICAgICAgY2FzZSBSX1NIX0dOVV9WVElOSEVSSVQ6CisgICAgICBjYXNlIFJfU0hfR05VX1ZURU5UUlk6CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisgICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6CisgICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCisgICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKyAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOworICAgICAgICAgIH0KKyAgICAgICB9CisgICAgIH0KKyAgIGVsc2UKKyAgICAgeworICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQorICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCisgICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKKyAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7CisgICAgICAgICAgfQorICAgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2xlYW4KK3NoX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKK3sKKyAgLyogd2UgZG9uJ3QgdXNlIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHNoLiAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgorICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKKyAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCisgCitzdGF0aWMgYm9vbGVhbgorc2hfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOworIAorICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworIAorICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7CisgIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7CisgIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQorICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87CisgCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OworIAorICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKyAgICAgICAgaCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisgCisgICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgICB7CisgICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KKyAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfU0hfR05VX1ZUSU5IRVJJVDoKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5CisgICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfU0hfR05VX1ZURU5UUlk6CisgICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorIAorICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX3NoX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1zaCIKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX3NobF92ZWMKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1zaGwiCisjZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9zaAorI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX1NICisjZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxCisKKyNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCisKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAlzaF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCXNoX2VsZl9pbmZvX3RvX2hvd3RvCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbglzaF9lbGZfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCXNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKwkJCQkJc2hfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgc2hfZWxmX2djX21hcmtfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rICAgICAgIHNoX2VsZl9nY19zd2VlcF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgc2hfZWxmX2NoZWNrX3JlbG9jcworCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCisjaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItc3BhcmMuYyBiL2JmZC9lbGYzMi1zcGFyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTdjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmMzItc3BhcmMuYwpAQCAtMCwwICsxLDIwNTkgQEAKKy8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImVsZi9zcGFyYy5oIgorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOworc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfaW5mb190b19ob3d0bworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19jaGVja19yZWxvY3MKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCisJICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4CisgIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCisJICAgRWxmX0ludGVybmFsX1N5bSAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX29iamVjdF9wCisgIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCisgIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7CisMCisvKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKKworcmVsb2NfaG93dG9fdHlwZSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtdID0KK3sKKyAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAorICAvKiBUaGVzZSBhcmUgZm9yIHNwYXJjNjQgaW4gYSA2NCBiaXQgZW52aXJvbm1lbnQuCisgICAgIFZhbHVlcyBuZWVkIHRvIGJlIGhlcmUgYmVjYXVzZSB0aGUgdGFibGUgaXMgaW5kZXhlZCBieSByZWxvYyBudW1iZXIuICAqLworICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgLyogRW5kIHNwYXJjNjQgaW4gNjQgYml0IGVudmlyb25tZW50IHZhbHVlcy4KKyAgICAgVGhlIGZvbGxvd2luZyBhcmUgZm9yIHNwYXJjNjQgaW4gYSAzMiBiaXQgZW52aXJvbm1lbnQuICAqLworICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUkVWMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVWMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKK307CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG8gPQorICBIT1dUTyAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1NQQVJDX0dOVV9WVElOSEVSSVQiLCBmYWxzZSwwLCAwLCBmYWxzZSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvID0KKyAgSE9XVE8gKFJfU1BBUkNfR05VX1ZURU5UUlksIDAsMiwwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwiUl9TUEFSQ19HTlVfVlRFTlRSWSIsIGZhbHNlLDAsMCwgZmFsc2UpOworCisKK3N0cnVjdCBlbGZfcmVsb2NfbWFwIHsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7CisgIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Cit7CisgIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKKyAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCisgIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAorICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCisgIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwKKyAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKKyAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCisgIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAorICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCisgIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAorICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCisgIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KKy8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KKyAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCisgIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAorICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCisgIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKKyAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAorICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCisgIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKKyAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAorICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCisgIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAorICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCisgIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKKyAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAorICB7QkZEX1JFTE9DX1NQQVJDX1JFVjMyLCBSX1NQQVJDX1JFVjMyIH0sCisgIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfU1BBUkNfR05VX1ZUSU5IRVJJVH0sCisgIHtCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NQQVJDX0dOVV9WVEVOVFJZfSwKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2VsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CisgICAgICByZXR1cm4gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKKworICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKKyAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKKworICAgIGRlZmF1bHQ6CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQorCSAgICByZXR1cm4gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogV2UgbmVlZCB0byB1c2UgRUxGMzJfUl9UWVBFIHNvIHdlIGhhdmUgb3VyIG93biBjb3B5IG9mIHRoaXMgZnVuY3Rpb24sCisgICBhbmQgZWxmNjQtc3BhcmMuYyBoYXMgaXRzIG93biBjb3B5LiAgKi8KKworc3RhdGljIHZvaWQKK2VsZjMyX3NwYXJjX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgQkZEX0FTU0VSVCAoRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKK30KKwwKKy8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jIChhYmZkLAorCQkJICAgICByZWxvY19lbnRyeSwKKwkJCSAgICAgc3ltYm9sLAorCQkJICAgICBkYXRhLAorCQkJICAgICBpbnB1dF9zZWN0aW9uLAorCQkJICAgICBvdXRwdXRfYmZkLAorCQkJICAgICBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Cit9CisKKy8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3NwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLAorCQkJIHJlbG9jX2VudHJ5LAorCQkJIHN5bWJvbCwKKwkJCSBkYXRhLAorCQkJIGlucHV0X3NlY3Rpb24sCisJCQkgb3V0cHV0X2JmZCwKKwkJCSBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworICBiZmRfdm1hIHg7CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKKwkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorCisgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworCisgIHJlbG9jYXRpb24gPSAoc3ltYm9sLT52YWx1ZQorCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkrIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKyAgcmVsb2NhdGlvbiAtPQkoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKworICB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisgIHggfD0gKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCisJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisKKyAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAorICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4gMHgzZmZmZikKKyAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICBlbHNlCisgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKwwKKy8qIEZ1bmN0aW9ucyBmb3IgdGhlIFNQQVJDIEVMRiBsaW5rZXIuICAqLworCisvKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCisgICBzZWN0aW9uLiAgKi8KKworI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28uMSIKKworLyogVGhlIG5vcCBvcGNvZGUgd2UgdXNlLiAgKi8KKworI2RlZmluZSBTUEFSQ19OT1AgMHgwMTAwMDAwMAorCisvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworCisjZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDEyCisKKy8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhcmUgcmVzZXJ2ZWQsCisgICBhbmQgdGhlIGluaXRpYWwgY29udGVudHMgYXJlIHVuaW1wb3J0YW50ICh3ZSB6ZXJvIHRoZW0gb3V0KS4KKyAgIFN1YnNlcXVlbnQgZW50cmllcyBsb29rIGxpa2UgdGhpcy4gIFNlZSB0aGUgU1ZSNCBBQkkgU1BBUkMKKyAgIHN1cHBsZW1lbnQgdG8gc2VlIGhvdyB0aGlzIHdvcmtzLiAgKi8KKworLyogc2V0aGkgJWhpKC4tLnBsdDApLCVnMS4gIFdlIGZpbGwgaW4gdGhlIGFkZHJlc3MgbGF0ZXIuICAqLworI2RlZmluZSBQTFRfRU5UUllfV09SRDAgMHgwMzAwMDAwMAorLyogYixhIC5wbHQwLiAgV2UgZmlsbCBpbiB0aGUgb2Zmc2V0IGxhdGVyLiAgKi8KKyNkZWZpbmUgUExUX0VOVFJZX1dPUkQxIDB4MzA4MDAwMDAKKy8qIG5vcC4gICovCisjZGVmaW5lIFBMVF9FTlRSWV9XT1JEMiBTUEFSQ19OT1AKKworLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKKyAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCisgICB0YWJsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9zcGFyY19jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworeworICBiZmQgKmR5bm9iajsKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOworICBhc2VjdGlvbiAqc2dvdDsKKyAgYXNlY3Rpb24gKnNyZWxnb3Q7CisgIGFzZWN0aW9uICpzcmVsb2M7CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7CisKKyAgc2dvdCA9IE5VTEw7CisgIHNyZWxnb3QgPSBOVUxMOworICBzcmVsb2MgPSBOVUxMOworCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisKKyAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCisJeworCWNhc2UgUl9TUEFSQ19HT1QxMDoKKwljYXNlIFJfU1BBUkNfR09UMTM6CisJY2FzZSBSX1NQQVJDX0dPVDIyOgorCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KKworCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLworCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKKwkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoc2dvdCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisJICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKwkgICAgfQorCisJICBpZiAoc3JlbGdvdCA9PSBOVUxMCisJICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQorCSAgICB7CisJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKwkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQorCQl7CisJCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCQkgIGlmIChzcmVsZ290ID09IE5VTEwKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKKwkJCQkJCSAgKFNFQ19BTExPQworCQkJCQkJICAgfCBTRUNfTE9BRAorCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECisJCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCisJCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisKKwkgIGlmIChoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisJCXsKKwkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KKwkJICBicmVhazsKKwkJfQorCSAgICAgIGgtPmdvdC5vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7CisKKwkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQorCQl7CisJCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsCisgICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCisJICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCisJCXsKKwkJICBzaXplX3Qgc2l6ZTsKKwkJICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKworCQkgIHNpemUgPSBzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChiZmRfdm1hKTsKKwkJICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IChiZmRfdm1hICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7CisJCSAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKSA9IGxvY2FsX2dvdF9vZmZzZXRzOworCQkgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCisJCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tpXSA9IChiZmRfdm1hKSAtMTsKKwkJfQorCSAgICAgIGlmIChsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKQorCQl7CisJCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gPSBzZ290LT5fcmF3X3NpemU7CisKKwkgICAgICBpZiAoaW5mby0+c2hhcmVkKQorCQl7CisJCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KKwkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKwkJfQorCSAgICB9CisKKwkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OworCisJICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIGFkZAorCSAgICAgMHgxMDAwIHRvIHRoZSB2YWx1ZSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNvIHRoYXQgMTMKKwkgICAgIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCisJICBpZiAoc2dvdC0+X3Jhd19zaXplID49IDB4MTAwMAorCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9PSAwKQorCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7CisKKwkgIGJyZWFrOworCisJY2FzZSBSX1NQQVJDX1dQTFQzMDoKKwkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQorICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCisgICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdpdGhvdXQKKyAgICAgICAgICAgICBsaW5raW5nIGluIGFueSBkeW5hbWljIG9iamVjdHMsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKKyAgICAgICAgICAgICBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgYWZ0ZXIgYWxsLiAgKi8KKworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoZSBTb2xhcmlzIG5hdGl2ZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIFdQTFQzMAorICAgICAgICAgICAgICAgICByZWxvYyBmb3IgYSBsb2NhbCBzeW1ib2wgaWYgeW91IGFzc2VtYmxlIGEgY2FsbCBmcm9tCisgICAgICAgICAgICAgICAgIG9uZSBzZWN0aW9uIHRvIGFub3RoZXIgd2hlbiB1c2luZyAtSyBwaWMuICBXZSB0cmVhdAorICAgICAgICAgICAgICAgICBpdCBhcyBXRElTUDMwLiAgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJICAgIHsKKwkgICAgICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKKworCSAgYnJlYWs7CisKKwljYXNlIFJfU1BBUkNfUEMxMDoKKwljYXNlIFJfU1BBUkNfUEMyMjoKKwkgIGlmIChoICE9IE5VTEwKKwkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQorCSAgICBicmVhazsKKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSBSX1NQQVJDX0RJU1A4OgorCWNhc2UgUl9TUEFSQ19ESVNQMTY6CisJY2FzZSBSX1NQQVJDX0RJU1AzMjoKKwljYXNlIFJfU1BBUkNfV0RJU1AzMDoKKwljYXNlIFJfU1BBUkNfV0RJU1AyMjoKKwljYXNlIFJfU1BBUkNfV0RJU1AxOToKKwljYXNlIFJfU1BBUkNfV0RJU1AxNjoKKwkgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgd2UgZG8gbm90IG5lZWQgdG8gY29weQorICAgICAgICAgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMKKyAgICAgICAgICAgICBkZWZpbmVkIGluIGFuIG9iamVjdCB3ZSBhcmUgaW5jbHVkaW5nIGluIHRoZSBsaW5rIChpLmUuLAorICAgICAgICAgICAgIERFRl9SRUdVTEFSIGlzIHNldCkuICBGSVhNRTogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vdAorICAgICAgICAgICAgIHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdAorICAgICAgICAgICAgIERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldCBsYXRlciAoaXQgaXMKKyAgICAgICAgICAgICBuZXZlciBjbGVhcmVkKS4gIFRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBpbgorICAgICAgICAgICAgIGVsZjMyLWkzODYuYy4gICovCisJICBpZiAoaCA9PSBOVUxMCisJICAgICAgfHwgKGluZm8tPnN5bWJvbGljCisJCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKKwkgICAgYnJlYWs7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgUl9TUEFSQ184OgorCWNhc2UgUl9TUEFSQ18xNjoKKwljYXNlIFJfU1BBUkNfMzI6CisJY2FzZSBSX1NQQVJDX0hJMjI6CisJY2FzZSBSX1NQQVJDXzIyOgorCWNhc2UgUl9TUEFSQ18xMzoKKwljYXNlIFJfU1BBUkNfTE8xMDoKKwljYXNlIFJfU1BBUkNfVUEzMjoKKwkgIGlmIChpbmZvLT5zaGFyZWQpCisJICAgIHsKKwkgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCisgICAgICAgICAgICAgICAgIHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIGNyZWF0ZSBhIHJlbG9jCisgICAgICAgICAgICAgICAgIHNlY3Rpb24gaW4gZHlub2JqIGFuZCBtYWtlIHJvb20gZm9yIHRoZSByZWxvYy4gICovCisJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQorCQl7CisJCSAgY29uc3QgY2hhciAqbmFtZTsKKworCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkJICAoYWJmZCwKKwkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAorCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7CisJCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKworCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKKwkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCisJCQkJCSBuYW1lICsgNSkgPT0gMCk7CisKKwkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKKwkJICBpZiAoc3JlbG9jID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGZsYWd3b3JkIGZsYWdzOworCisJCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7CisJCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKKwkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOworCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKKwkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCisJCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCisJCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgfQorCQl9CisKKwkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworCSAgICB9CisKKwkgIGJyZWFrOworCisgICAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRJTkhFUklUOgorICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRFTlRSWToKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGFzZWN0aW9uICoKK2VsZjMyX3NwYXJjX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCisgICAgICAgYmZkICphYmZkOworICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworeworCisgIGlmIChoICE9IE5VTEwpCisgICAgeworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgUl9TUEFSQ19HTlVfVlRJTkhFUklUOgorICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCisgICAgICAgICAgeworICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKworICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisgICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKKyAgICAgICAgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorICAgICAgICAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCisgICAgICAgICAgICAgICAgJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOworICAgICAgICAgIH0KKyAgICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7CisgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKKworICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQorICAgICAgeworICAgICAgY2FzZSBSX1NQQVJDX0dPVDEwOgorICAgICAgY2FzZSBSX1NQQVJDX0dPVDEzOgorICAgICAgY2FzZSBSX1NQQVJDX0dPVDIyOgorCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKwlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKKwkgIHsKKwkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKwkgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCisJICAgICAgaC0+Z290LnJlZmNvdW50LS07CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQorCSAgICAgIGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdLS07CisJICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJfU1BBUkNfUExUMzI6CisgICAgICBjYXNlIFJfU1BBUkNfSElQTFQyMjoKKyAgICAgIGNhc2UgUl9TUEFSQ19MT1BMVDEwOgorICAgICAgY2FzZSBSX1NQQVJDX1BDUExUMzI6CisgICAgICBjYXNlIFJfU1BBUkNfUENQTFQxMDoKKwlyX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisJaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICB7CisJICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisJICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQorCSAgICAgIGgtPnBsdC5yZWZjb3VudC0tOworCSAgfQorCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCWJyZWFrOworICAgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKKyAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCisgICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCisgICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgorICAgdW5kZXJzdGFuZC4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzOworICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCisgIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCisJICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCisJCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCisJCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKKwkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCisJCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKKworICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQorICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgorICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQorICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKKyAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQorICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCisgICAgIFNUVF9GVU5DLiAgKi8KKyAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKKyAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKKyAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKKwkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQorICAgIHsKKyAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJICB8fCAoKCFpbmZvLT5zaGFyZWQgfHwgaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgIT0gMCkpCisJeworCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBXUExUMzAgcmVsb2MgaW4gYW4gaW5wdXQKKwkgICAgIGZpbGUsIGJ1dCBub25lIG9mIHRoZSBpbnB1dCBmaWxlcyB3ZXJlIGR5bmFtaWMgb2JqZWN0cy4KKwkgICAgIE9yLCB3aGVuIGxpbmtpbmcgdGhlIG1haW4gYXBwbGljYXRpb24gb3IgYSAtQnN5bWJvbGljCisJICAgICBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IFBJQyBjb2RlLiAgT3Igd2hlbiBhIGdsb2JhbCBzeW1ib2wKKwkgICAgIGhhcyBiZWVuIG1hZGUgcHJpdmF0ZSwgZS5nLiB2aWEgdmVyc2lvbmluZy4KKworCSAgICAgSW4gdGhlc2UgY2FzZXMgd2Uga25vdyB3aGF0IHZhbHVlIHRoZSBzeW1ib2wgd2lsbCByZXNvbHZlCisJICAgICB0bywgc28gd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBidWlsZCBhIHByb2NlZHVyZSBsaW5rYWdlCisJICAgICB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMCByZWxvYyBpbnN0ZWFkLiAgKi8KKworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiAucGx0IGFyZSByZXNlcnZlZC4gICovCisgICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCisJcy0+X3Jhd19zaXplID0gNCAqIFBMVF9FTlRSWV9TSVpFOworCisgICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaGFzIGEgbWF4aW11bSBzaXplLiAgKi8KKyAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHg0MDAwMDApCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlCisgICAgICAgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCisgICAgICAgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KKyAgICAgICBwb2ludGVycyBjb21wYXJlIGFzIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZAorICAgICAgIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisgICAgIGlmICghIGluZm8tPnNoYXJlZAorCSYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKyAgICAgIHsKKwloLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOworCWgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7CisgICAgICB9CisKKyAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7CisKKyAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCisgICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7CisKKyAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCisgICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQorICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLworICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKKyAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCisgICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KKworICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCisgICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCisgICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCisgICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLworICBpZiAoaW5mby0+c2hhcmVkKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCisgICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCisgICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKKyAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcworICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAorICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KKyAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbworICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCisgICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuICAqLworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOworICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1NQQVJDX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIKKyAgICAgdG8gY29weSB0aGUgaW5pdGlhbCB2YWx1ZSBvdXQgb2YgdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCBpbnRvIHRoZQorICAgICBydW50aW1lIHByb2Nlc3MgaW1hZ2UuICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvZmZzZXQgaW50byB0aGUKKyAgICAgLnJlbC5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KKyAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcmVsOworCisgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOworICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKKyAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOworICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKKyAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCisgIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKKyAgaWYgKHBvd2VyX29mX3R3byA+IDMpCisgICAgcG93ZXJfb2ZfdHdvID0gMzsKKworICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KKyAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCisJCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOworICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KKyAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKKyAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKKworICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLworICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqZHlub2JqOworICBhc2VjdGlvbiAqczsKKyAgYm9vbGVhbiByZWx0ZXh0OworICBib29sZWFuIHJlbHBsdDsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KKyAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKKwl7CisJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKKwkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisJICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOworCX0KKworICAgICAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIG5vcCBpbiAucGx0LiAgKi8KKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgICAgIGlmIChzLT5fcmF3X3NpemUgPiAwKQorCXMtPl9yYXdfc2l6ZSArPSA0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCisgICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCisgICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCisgICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAgYmVsb3cuICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJcy0+X3Jhd19zaXplID0gMDsKKyAgICB9CisKKyAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCisgICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQorICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLworICByZWx0ZXh0ID0gZmFsc2U7CisgIHJlbHBsdCA9IGZhbHNlOworICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBib29sZWFuIHN0cmlwOworCisgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQorCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KKyAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKKworICAgICAgc3RyaXAgPSBmYWxzZTsKKworICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCisJeworCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCSAgICB7CisJICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCisJCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKKwkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KKwkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAorCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKKwkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCisJCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAorCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCisJCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KKwkgICAgICBzdHJpcCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7CisJICAgICAgYXNlY3Rpb24gKnRhcmdldDsKKworCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKKwkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLworCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKKwkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOworCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7CisJICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCisJCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKKwkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJcmVsdGV4dCA9IHRydWU7CisKKwkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgPT0gMCkKKwkJcmVscGx0ID0gdHJ1ZTsKKworCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKKwkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKwkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgIT0gMAorCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICIuZ290IikgIT0gMCkKKwl7CisJICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIHNlY3Rpb25zLCBzbyBkb24ndCBhbGxvY2F0ZSBzcGFjZS4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChzdHJpcCkKKwl7CisJICBfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisgICAgeworICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCisJIHZhbHVlcyBsYXRlciwgaW4gZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQorCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKKwkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQorCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAocmVscGx0KQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKKwkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQorCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCisJICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQorCSAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCisJCQkJCSAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChyZWx0ZXh0KQorCXsKKwkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgorICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQorICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQorICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50CisgICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgaW50IGM7CisKKyAgICAgIGMgPSAwOworICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAorCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7CisKKwkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KKworCSAgKytjOworCX0KKworICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJICAgICAgZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmluZHgsCisJCQkgICAgICAoUFRSKSAmYyk7CisgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKKyAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBjcGFyZzsKK3sKKyAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7CisKKyAgaWYgKGgtPmR5bmluZHggIT0gLTEpCisgICAgaC0+ZHluaW5keCArPSAqY3A7CisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWxvY2F0ZSBhIFNQQVJDIEVMRiBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCSAgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKKyAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKK3sKKyAgYmZkICpkeW5vYmo7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7CisgIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOworICBiZmRfdm1hIGdvdF9iYXNlOworICBhc2VjdGlvbiAqc2dvdDsKKyAgYXNlY3Rpb24gKnNwbHQ7CisgIGFzZWN0aW9uICpzcmVsb2M7CisgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisgIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPT0gTlVMTCkKKyAgICBnb3RfYmFzZSA9IDA7CisgIGVsc2UKKyAgICBnb3RfYmFzZSA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZTsKKworICBzZ290ID0gTlVMTDsKKyAgc3BsdCA9IE5VTEw7CisgIHNyZWxvYyA9IE5VTEw7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgaW50IHJfdHlwZTsKKyAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOworICAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOworCisgICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKKworICAgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDX0dOVV9WVElOSEVSSVQgCisgICAgICAgICAgfHwgcl90eXBlID09IFJfU1BBUkNfR05VX1ZURU5UUlkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXgpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaG93dG8gPSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOworCisgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCXsKKwkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCisJICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCisJICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKKwkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKKwkJeworCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7CisJCX0KKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKyAgICAgIGggPSBOVUxMOworICAgICAgc3ltID0gTlVMTDsKKyAgICAgIHNlYyA9IE5VTEw7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkrIHNlYy0+b3V0cHV0X29mZnNldAorCQkJKyBzeW0tPnN0X3ZhbHVlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKwkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOworCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIGlmICgocl90eXBlID09IFJfU1BBUkNfV1BMVDMwCisJCSAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorCQkgIHx8ICgocl90eXBlID09IFJfU1BBUkNfR09UMTAKKwkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0dPVDEzCisJCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HT1QyMikKKwkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKKwkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCisJCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCisJCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQorCQkgIHx8IChpbmZvLT5zaGFyZWQKKwkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCisJCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisJCSAgICAgICYmIChyX3R5cGUgPT0gUl9TUEFSQ184CisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzE2CisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzMyCisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1A4CisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1AxNgorCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQMzIKKwkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AzMAorCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDIyCisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTkKKwkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AxNgorCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ISTIyCisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzIyCisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzEzCisJCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0xPMTAKKwkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfVUEzMgorCQkJICB8fCAoKHJfdHlwZSA9PSBSX1NQQVJDX1BDMTAKKwkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19QQzIyKQorCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAorCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCisJCXsKKwkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCisgICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KKwkJICByZWxvY2F0aW9uID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCSAgICB9CisJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAgIHJlbG9jYXRpb24gPSAwOworCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAorCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICByZWxvY2F0aW9uID0gMDsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoIChyX3R5cGUpCisJeworCWNhc2UgUl9TUEFSQ19HT1QxMDoKKwljYXNlIFJfU1BBUkNfR09UMTM6CisJY2FzZSBSX1NQQVJDX0dPVDIyOgorCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKKyAgICAgICAgICAgICBvZmZzZXQgdGFibGUuICAqLworCSAgaWYgKHNnb3QgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICAgIH0KKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGJmZF92bWEgb2ZmOworCisJICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKKwkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKKworCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJCSAgfHwgKGluZm8tPnNoYXJlZAorCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCisJCXsKKwkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKKyAgICAgICAgICAgICAgICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCisgICAgICAgICAgICAgICAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCisgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgorCisJCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290CisJCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKKwkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCisJCSAgaWYgKChvZmYgJiAxKSAhPSAwKQorCQkgICAgb2ZmICY9IH4xOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKKwkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKKwkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOworCQkgICAgfQorCQl9CisKKwkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfdm1hIG9mZjsKKworCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKKwkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7CisKKwkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07CisKKwkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQorCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCisJCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KKwkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCisJCW9mZiAmPSB+MTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7CisKKwkJICBpZiAoaW5mby0+c2hhcmVkKQorCQkgICAgeworCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKKwkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOworCisJCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCisJCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCisJCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7CisJCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7CisKKwkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAorCQkJCQkgKyBvZmYpOworCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKKwkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKKwkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKKwkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCisJCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKKwkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOworCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OworCQkgICAgfQorCisJCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7CisJCX0KKworCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7CisJICAgIH0KKworCSAgYnJlYWs7CisKKwljYXNlIFJfU1BBUkNfV1BMVDMwOgorCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQorICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKworCSAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwIHJlbG9jCisJICAgICBmb3IgYSBsb2NhbCBzeW1ib2wgaWYgeW91IGFzc2VtYmxlIGEgY2FsbCBmcm9tIG9uZQorCSAgICAgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQgaXQgYXMKKwkgICAgIFdESVNQMzAuICAqLworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgYnJlYWs7CisKKwkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKKwkgICAgeworCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKKyAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgorICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBpZiAoc3BsdCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisJICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKKwkgICAgfQorCisJICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAorCQkJKyBoLT5wbHQub2Zmc2V0KTsKKwkgIGJyZWFrOworCisJY2FzZSBSX1NQQVJDX1BDMTA6CisJY2FzZSBSX1NQQVJDX1BDMjI6CisJICBpZiAoaCAhPSBOVUxMCisJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKKwkgICAgYnJlYWs7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgUl9TUEFSQ19ESVNQODoKKwljYXNlIFJfU1BBUkNfRElTUDE2OgorCWNhc2UgUl9TUEFSQ19ESVNQMzI6CisJY2FzZSBSX1NQQVJDX1dESVNQMzA6CisJY2FzZSBSX1NQQVJDX1dESVNQMjI6CisJY2FzZSBSX1NQQVJDX1dESVNQMTk6CisJY2FzZSBSX1NQQVJDX1dESVNQMTY6CisJICBpZiAoaCA9PSBOVUxMCisJICAgICAgfHwgKGluZm8tPnN5bWJvbGljCisJCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKKwkgICAgYnJlYWs7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgUl9TUEFSQ184OgorCWNhc2UgUl9TUEFSQ18xNjoKKwljYXNlIFJfU1BBUkNfMzI6CisJY2FzZSBSX1NQQVJDX0hJMjI6CisJY2FzZSBSX1NQQVJDXzIyOgorCWNhc2UgUl9TUEFSQ18xMzoKKwljYXNlIFJfU1BBUkNfTE8xMDoKKwljYXNlIFJfU1BBUkNfVUEzMjoKKwkgIGlmIChpbmZvLT5zaGFyZWQpCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7CisJICAgICAgYm9vbGVhbiBza2lwOworCisJICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKKyAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KKyAgICAgICAgICAgICAgICAgdGltZS4gICovCisKKwkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCXsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCisJCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgIChpbnB1dF9iZmQsCisJCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAorCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOworCQkgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCisJCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCisJCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAorCQkJCQkgbmFtZSArIDUpID09IDApOworCisJCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7CisJCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOworCQl9CisKKwkgICAgICBza2lwID0gZmFsc2U7CisKKwkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQorCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OworCSAgICAgIGVsc2UKKwkJeworCQkgIGJmZF92bWEgb2ZmOworCisJCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAorCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCisJCQkgIGlucHV0X3NlY3Rpb24sCisJCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAorCQkJICByZWwtPnJfb2Zmc2V0KSk7CisJCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCisJCSAgICBza2lwID0gdHJ1ZTsKKwkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7CisJCX0KKworCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKworCSAgICAgIGlmIChza2lwKQorCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOworCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bworICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLworCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAorCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCisJCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCisJCXsKKwkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKwkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOworCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAocl90eXBlID09IFJfU1BBUkNfMzIpCisJCSAgICB7CisJCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOworCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGxvbmcgaW5keDsKKworCQkgICAgICBpZiAoaCA9PSBOVUxMKQorCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCisJCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7CisJCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkJCX0KKwkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKKwkJCWluZHggPSAwOworCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCisJCQl7CisJCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkJICByZXR1cm4gZmFsc2U7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgYXNlY3Rpb24gKm9zZWM7CisKKwkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisJCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKKworCQkJICAvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgbm9uLXBpYworCQkJICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKwkJCSAgaWYgKGluZHggPT0gMCkKKwkJCSAgICB7CisJCQkgICAgICBCRkRfRkFJTCAoKTsKKwkJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJCShfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKKwkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7CisJCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJCSAgICB9CisJCQl9CisKKwkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKKworCQkgICAgICAvKiBGb3Igbm9uLVJFTEFUSVZFIGR5bmFtaWMgcmVsb2NhdGlvbnMsIHdlIGtlZXAgdGhlCisJCQkgc2FtZSBzeW1ib2wsIGFuZCBzbyBnZW5lcmFsbHkgdGhlIHNhbWUgYWRkZW5kLiAgQnV0CisJCQkgd2UgZG8gbmVlZCB0byBhZGp1c3QgdGhvc2UgcmVsb2NhdGlvbnMgcmVmZXJlbmNpbmcKKwkJCSBzZWN0aW9ucy4gICovCisJCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CisJCSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8KKwkJCSAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCSAgICAgICAgb3V0cmVsLnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCtzeW0tPnN0X3ZhbHVlOworCQkgICAgfQorCQl9CisKKwkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAorCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQorCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQorCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOworCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKKworCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCisgICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCisgICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLworCSAgICAgIGlmIChza2lwCisJCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCisJCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQorCQljb250aW51ZTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfV0RJU1AxNikKKwl7CisJICBiZmRfdm1hIHg7CisKKwkgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKKwkgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCSAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OworCisJICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKKwkJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKKwkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKworCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAorCSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCisJICAgIHIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisJICBlbHNlCisJICAgIHIgPSBiZmRfcmVsb2Nfb2s7CisJfQorICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfU1BBUkNfUkVWMzIpCisJeworCSAgYmZkX3ZtYSB4OworCisJICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7CisKKwkgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJICB4ID0geCArIHJlbG9jYXRpb247CisJICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCSAgciA9IGJmZF9yZWxvY19vazsKKwl9CisgICAgICBlbHNlCisJciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKKwkJCQkgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKKworCisgICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCisJeworCSAgc3dpdGNoIChyKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICAgICAgYWJvcnQgKCk7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlpZiAoaCAhPSBOVUxMKQorCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCQllbHNlCisJCSAgeworCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKKwkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKKwkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKKwkJICAgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQorCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCQkgIH0KKwkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCisgICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Cit7CisgIGJmZCAqZHlub2JqOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIGFzZWN0aW9uICpzcmVsYTsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7CisKKyAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKKyAgICAgICAgIGl0IHVwLiAgKi8KKworICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisKKyAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7CisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAorCQkgIFBMVF9FTlRSWV9XT1JEMCArIGgtPnBsdC5vZmZzZXQsCisJCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCSAgKFBMVF9FTlRSWV9XT1JEMQorCQkgICArICgoKC0gKGgtPnBsdC5vZmZzZXQgKyA0KSkgPj4gMikgJiAweDNmZmZmZikpLAorCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0VOVFJZX1dPUkQyLAorCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOworCisgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLworICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7CisgICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19KTVBfU0xPVCk7CisgICAgICByZWxhLnJfYWRkZW5kID0gMDsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAorCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCisJCQkJICArIGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDQpKTsKKworICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCisJICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KKwkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7CisJfQorICAgIH0KKworICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNnb3Q7CisgICAgICBhc2VjdGlvbiAqc3JlbGE7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOworCisgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKKyAgICAgICAgIHVwLiAgKi8KKworICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKKworICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCisJIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgorCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KKwkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KKwkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLworICAgICAgaWYgKGluZm8tPnNoYXJlZAorCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQorCXJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKKyAgICAgIGVsc2UKKwl7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKKwkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0dMT0JfREFUKTsKKwl9CisKKyAgICAgIHJlbGEucl9hZGRlbmQgPSAwOworICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCisJCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKKwkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7CisgICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKKyAgICB9CisKKyAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKworICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCisKKyAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCisJCQkJICAgIi5yZWxhLmJzcyIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfQ09QWSk7CisgICAgICByZWxhLnJfYWRkZW5kID0gMDsKKyAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAorCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKKwkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKKyAgICAgICsrcy0+cmVsb2NfY291bnQ7CisgICAgfQorCisgIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KKyAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAorICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAorICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCisgICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzZHluOworICBhc2VjdGlvbiAqc2dvdDsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcGx0OworICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7CisKKyAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7CisKKyAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7CisgICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7CisgICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKKwl7CisJICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICBib29sZWFuIHNpemU7CisKKwkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOworCisJICBzd2l0Y2ggKGR5bi5kX3RhZykKKwkgICAgeworCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOworCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyBicmVhazsKKwkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOworCSAgICBkZWZhdWx0OgkgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOworCSAgICB9CisKKwkgIGlmIChuYW1lICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqczsKKworCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7CisJICAgICAgaWYgKHMgPT0gTlVMTCkKKwkJZHluLmRfdW4uZF92YWwgPSAwOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmICghIHNpemUpCisJCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKKwkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOworCQkgICAgICBlbHNlCisJCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIENsZWFyIHRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLAorCSBhbmQgcHV0IGEgbm9wIGluIHRoZSBsYXN0IGZvdXIgYnl0ZXMuICAqLworICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCisJeworCSAgbWVtc2V0IChzcGx0LT5jb250ZW50cywgMCwgNCAqIFBMVF9FTlRSWV9TSVpFKTsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX05PUCwKKwkJICAgICAgc3BsdC0+Y29udGVudHMgKyBzcGx0LT5fcmF3X3NpemUgLSA0KTsKKwl9CisKKyAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9CisJUExUX0VOVFJZX1NJWkU7CisgICAgfQorCisgIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKKyAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCisgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOworICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKKyAgICB7CisgICAgICBpZiAoc2R5biA9PSBOVUxMKQorCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7CisgICAgICBlbHNlCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAorCQkgICAgc2dvdC0+Y29udGVudHMpOworICAgIH0KKworICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OworCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNkeW5zeW07CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOworICAgICAgaW50IGM7CisKKyAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KKworICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7CisgICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOworCisgICAgICBzeW0uc3Rfc2l6ZSA9IDA7CisgICAgICBzeW0uc3RfbmFtZSA9IDA7CisgICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKKyAgICAgIHN5bS5zdF9vdGhlciA9IDA7CisKKyAgICAgIGMgPSAwOworICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgaW50IGluZHg7CisKKwkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9PSAwKQorCSAgICBjb250aW51ZTsKKworCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOworCisJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OworCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOworCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKKworCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKKwkJCQkgICAgIChQVFIpICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQorCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQorCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOworCisJICArK2M7CisJfQorCisgICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCisgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCisgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSBjICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4KKworICAgV2UgZG9uJ3QgZGVmaW5lIHNldF9wcml2YXRlX2ZsYWdzIG9yIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBiZWNhdXNlCisgICB0aGUgb25seSBjdXJyZW50bHkgZGVmaW5lZCB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBiZmQgbWFjaCBudW1iZXIsCisgICBzbyB3ZSB1c2UgdGhlIGxhdHRlciBpbnN0ZWFkIGFuZCBkZWZlciBzZXR0aW5nIGVfZmxhZ3MgdW50aWwgdGhlCisgICBmaWxlIGlzIHdyaXR0ZW4gb3V0LiAgKi8KKworLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAorICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworeworICBib29sZWFuIGVycm9yOworICBzdGF0aWMgaW50IHByZXZpb3VzX2liZmRfZV9mbGFncyA9IC0xOworCisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBlcnJvciA9IGZhbHNlOworCisjaWYgMAorICAvKiA/Pz8gVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCBkbyB0aGlzIHNvIHdlIGNhbid0IChvdGhlcndpc2UgZ2NjIHdvdWxkCisgICAgIGhhdmUgdG8ga25vdyB3aGljaCBsaW5rZXIgaXMgYmVpbmcgdXNlZCkuICBJbnN0ZWFkLCB0aGUgbmF0aXZlIGxpbmtlcgorICAgICBidW1wcyB1cCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIHdoZW4gaXQgaGFzIHRvLiAgSG93ZXZlciwgSSBzdGlsbCB0aGluaworICAgICB3YXJuaW5ncyBsaWtlIHRoZXNlIGFyZSBnb29kLCBzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgdGhlbSB0dXJuZWQgb24KKyAgICAgYnkgc29tZSBvcHRpb24uICAqLworCisgIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyBub3JtYWwgc3BhcmMsIHdlIGNhbid0IGFsbG93IHY5IGlucHV0IGZpbGVzLiAgKi8KKyAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmMKKyAgICAgICYmIChiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cworCSAgfHwgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKSkKKyAgICB7CisgICAgICBlcnJvciA9IHRydWU7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiJXM6IGNvbXBpbGVkIGZvciBhIHY4cGx1cyBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OCIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisgICAgfQorICAvKiBJZiB0aGUgb3V0cHV0IG1hY2hpbmUgaXMgdjksIHdlIGNhbid0IGFsbG93IHY5K3ZpcyBpbnB1dCBmaWxlcy4gICovCisgIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cworICAgICAgJiYgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKQorICAgIHsKKyAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiKSwKKwkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworICAgIH0KKyNlbHNlCisgIGlmIChiZmRfZ2V0X21hY2ggKGliZmQpID49IGJmZF9tYWNoX3NwYXJjX3Y5KQorICAgIHsKKyAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogY29tcGlsZWQgZm9yIGEgNjQgYml0IHN5c3RlbSBhbmQgdGFyZ2V0IGlzIDMyIGJpdCIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisgICAgfQorICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKKyAgICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOworI2VuZGlmCisKKyAgaWYgKCgoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCisgICAgICAgIT0gcHJldmlvdXNfaWJmZF9lX2ZsYWdzKQorICAgICAgJiYgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID49IDApCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIiksCisJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKKyAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICB9CisgIHByZXZpb3VzX2liZmRfZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBOworCisgIGlmIChlcnJvcikKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjMyX3NwYXJjX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID09IEVNX1NQQVJDMzJQTFVTKQorICAgIHsKKyAgICAgIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCisJcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAorCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpOworICAgICAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ18zMlBMVVMpCisJcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAorCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyk7CisgICAgICBlbHNlCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCisgICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOworICBlbHNlCisgICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYyk7Cit9CisKKy8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIG9iamVjdCBmaWxlLgorICAgV2UgbmVlZCB0byBzZXQgdGhlIGVfbWFjaGluZSBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KKworc3RhdGljIHZvaWQKK2VsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIGxpbmtlcjsKK3sKKyAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9tYWNoX3NwYXJjIDoKKyAgICAgIGJyZWFrOyAvKiBub3RoaW5nIHRvIGRvICovCisgICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgorICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDMzJQTFVTOworICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX1NQQVJDXzMyUExVU19NQVNLOworICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhIDoKKyAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKKyAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKKyAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUyB8IEVGX1NQQVJDX1NVTl9VUzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSA6CisgICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkM7CisgICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ19MRURBVEE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisgICAgfQorfQorDAorI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmMzJfc3BhcmNfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmMzItc3BhcmMiCisjZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgRU1fU1BBUkMKKyNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSBFTV9TUEFSQzMyUExVUworI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMHgxMDAwMAorCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8KKyNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAorCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCisJCQkJCWVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAorCQkJCQllbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCisJCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCisJCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCisJCQkJCWVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCWVsZjMyX3NwYXJjX29iamVjdF9wCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAorCQkJCQllbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vaworCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCisjZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCisjZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA0CisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSAoNCpQTFRfRU5UUllfU0laRSkKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXY4NTAuYyBiL2JmZC9lbGYzMi12ODUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxMzUzZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGYzMi12ODUwLmMKQEAgLTAsMCArMSwyMjMwIEBACisvKiBWODUwLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKworLyogWFhYIEZJWE1FOiBUaGlzIGNvZGUgaXMgbGl0dGVyZWQgd2l0aCAzMmJpdCBpbnQsIDE2Yml0IHNob3J0LCA4Yml0IGNoYXIKKyAgIGRlcGVuZGVuY2llcy4gIEFzIGlzIHRoZSBnYXMgJiBzaW11bGF0b3IgY29kZSBvciB0aGUgdjg1MC4gICovCisKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisjaW5jbHVkZSAiZWxmL3Y4NTAuaCIKKworLyogc2lnbi1leHRlbmQgYSAyNC1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQyNCh4KQkoKCgoeCkgJiAweGZmZmZmZikgXiAofiAweDdmZmZmZikpICsgMHg4MDAwMDApCisgICAgICAKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICp2ODUwX2VsZl9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7CitzdGF0aWMgdm9pZCB2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbAorICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOworc3RhdGljIHZvaWQgdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB2ODUwX2VsZl9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIHY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEsIGJmZF9ieXRlICopKTsKK3N0YXRpYyBib29sZWFuIHY4NTBfZWxmX2NoZWNrX3JlbG9jcworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOworc3RhdGljIHZvaWQgcmVtZW1iZXJfaGkxNnNfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKK3N0YXRpYyBiZmRfYnl0ZSAqIGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYworICBQQVJBTVMgKChiZmRfdm1hLCBib29sZWFuICopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZQorICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKKwkgICBiZmRfdm1hLCBiZmRfdm1hLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIHY4NTBfZWxmX29iamVjdF9wCisgIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9mYWtlX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyB2b2lkIHY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKKyAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCisgIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOworc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCisgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKKyAgUEFSQU1TICgoYmZkICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqKSk7CitzdGF0aWMgdm9pZCB2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZworICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitzdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2sKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKKwkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7CitzdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAorCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKKyAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOworCisvKiBOb3RlOiBJdCBpcyBSRVFVSVJFRCB0aGF0IHRoZSAndHlwZScgdmFsdWUgb2YgZWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5CisgICBtYXRjaCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBhcnJheS4gICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB2ODUwX2VsZl9ob3d0b190YWJsZVtdID0KK3sKKyAgLyogVGhpcyByZWxvYyBkb2VzIG5vdGhpbmcuICAqLworICBIT1dUTyAoUl9WODUwX05PTkUsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1Y4NTBfTk9ORSIsCQkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIFBDIHJlbGF0aXZlIDkgYml0IGJyYW5jaC4gKi8KKyAgSE9XVE8gKFJfVjg1MF85X1BDUkVMLAkJLyogdHlwZSAqLworCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyNiwJCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwXzlfUENSRUwiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDBmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHgwMGZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSBQQyByZWxhdGl2ZSAyMiBiaXQgYnJhbmNoLiAqLworICBIT1dUTyAoUl9WODUwXzIyX1BDUkVMLAkJLyogdHlwZSAqLworCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyMiwJCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA3LAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfVjg1MF8yMl9QQ1JFTCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwN2ZmZmY4MCwJCQkvKiBzcmNfbWFzayAqLworCSAweDA3ZmZmZjgwLAkJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9ISTE2X1MsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX0hJMTZfUyIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9ISTE2LAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfVjg1MF9ISTE2IiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLworICBIT1dUTyAoUl9WODUwX0xPMTYsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX0xPMTYiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFNpbXBsZSAzMmJpdCByZWxvYy4gICovCisgIEhPV1RPIChSX1Y4NTBfMzIsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwXzMyIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFNpbXBsZSAxNmJpdCByZWxvYy4gICovCisgIEhPV1RPIChSX1Y4NTBfMTYsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfVjg1MF8xNiIsCQkJLyogbmFtZSAqLworCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU2ltcGxlIDhiaXQgcmVsb2MuCSAqLworICBIT1dUTyAoUl9WODUwXzgsCQkJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwXzgiLAkJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmYsCQkJCS8qIHNyY19tYXNrICovCisJIDB4ZmYsCQkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VULAkvKiB0eXBlICovCisJIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAxLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmUsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZlLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLworICBIT1dUTyAoUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE1IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCisgIEhPV1RPIChSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwJLyogdHlwZSAqLworCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMSwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZlLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZSwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLworICBIT1dUTyAoUl9WODUwX1REQV82XzhfT0ZGU0VULAkJLyogdHlwZSAqLworCSAyLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAxLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1Y4NTBfVERBXzZfOF9PRkZTRVQiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHg3ZSwJCQkJLyogc3JjX21hc2sgKi8KKwkgMHg3ZSwJCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDggYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9UREFfN184X09GRlNFVCwJCS8qIHR5cGUgKi8KKwkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX1REQV83XzhfT0ZGU0VUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4N2YsCQkJCS8qIHNyY19tYXNrICovCisJIDB4N2YsCQkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9UREFfN183X09GRlNFVCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNywJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX1REQV83XzdfT0ZGU0VUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4N2YsCQkJCS8qIHNyY19tYXNrICovCisJIDB4N2YsCQkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIhICAqLworICBIT1dUTyAoUl9WODUwX1REQV8xNl8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KKwkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZiwJCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDUgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KKyAgSE9XVE8gKFJfVjg1MF9UREFfNF81X09GRlNFVCwJCS8qIHR5cGUgKi8KKwkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNSwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX1REQV80XzVfT0ZGU0VUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MGYsCQkJCS8qIHNyY19tYXNrICovCisJIDB4MGYsCQkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCisgIEhPV1RPIChSX1Y4NTBfVERBXzRfNF9PRkZTRVQsCQkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDQsCQkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfVjg1MF9UREFfNF80X09GRlNFVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDBmLAkJCQkvKiBzcmNfbWFzayAqLworCSAweDBmLAkJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCisgIEhPV1RPIChSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQiLC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmUwMDIwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZTAwMjAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4gICovCisgIEhPV1RPIChSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQiLC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmUwMDIwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZTAwMjAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gICovCisgIEhPV1RPIChSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwJLyogdHlwZSAqLworCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA3LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDNmLAkJCQkvKiBzcmNfbWFzayAqLworCSAweDNmLAkJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gICovCisgIEhPV1RPIChSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCisJIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCisgIEhPV1RPIChSX1Y4NTBfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfVjg1MF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KKyAgSE9XVE8gKFJfVjg1MF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfVjg1MF9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgCit9OworCisvKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIFY4NTAgRUxGIHJlbG9jIHR5cGVzLiAgKi8KKworc3RydWN0IHY4NTBfZWxmX3JlbG9jX21hcAoreworICAvKiBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQgaXMgMjU4LCB3aGljaCB3aWxsIG5vdCBmaXggaW4gYW4KKyAgICAgdW5zaWduZWQgY2hhci4gICovCisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY4NTBfZWxmX3JlbG9jX21hcCB2ODUwX2VsZl9yZWxvY19tYXBbXSA9Cit7CisgIHsgQkZEX1JFTE9DX05PTkUsCQlSX1Y4NTBfTk9ORSB9LAorICB7IEJGRF9SRUxPQ19WODUwXzlfUENSRUwsCVJfVjg1MF85X1BDUkVMIH0sCisgIHsgQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwsCVJfVjg1MF8yMl9QQ1JFTCB9LAorICB7IEJGRF9SRUxPQ19ISTE2X1MsCQlSX1Y4NTBfSEkxNl9TIH0sCisgIHsgQkZEX1JFTE9DX0hJMTYsCQlSX1Y4NTBfSEkxNiB9LAorICB7IEJGRF9SRUxPQ19MTzE2LAkJUl9WODUwX0xPMTYgfSwKKyAgeyBCRkRfUkVMT0NfMzIsCQlSX1Y4NTBfMzIgfSwKKyAgeyBCRkRfUkVMT0NfMTYsCQlSX1Y4NTBfMTYgfSwKKyAgeyBCRkRfUkVMT0NfOCwJCVJfVjg1MF84IH0sCisgIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQgfSwKKyAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VULCBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCB9LAorICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIH0sCisgIHsgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVCwgUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQgfSwKKyAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVCwgICBSX1Y4NTBfVERBXzZfOF9PRkZTRVQgICB9LAorICB7IEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VULCAgIFJfVjg1MF9UREFfN184X09GRlNFVCAgIH0sCisgIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQsICAgUl9WODUwX1REQV83XzdfT0ZGU0VUICAgfSwKKyAgeyBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCB9LAorICB7IEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VULCAgICAgICAgIFJfVjg1MF9UREFfNF81X09GRlNFVCAgICAgICAgIH0sCisgIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQsICAgICAgICAgUl9WODUwX1REQV80XzRfT0ZGU0VUICAgICAgICAgfSwKKyAgeyBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULCBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCB9LAorICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIH0sCisgIHsgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwgICAgICAgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgICAgICAgfSwKKyAgeyBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQsICAgICBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUICAgICB9LAorICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgICAgICAgICAgICAgICBSX1Y4NTBfR05VX1ZUSU5IRVJJVCB9LAorICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgICAgICAgICAgICAgICBSX1Y4NTBfR05VX1ZURU5UUlkgfSwKKworfTsKKworDAorLyogTWFwIGEgYmZkIHJlbG9jYXRpb24gaW50byB0aGUgYXBwcm9wcmlhdGUgaG93dG8gc3RydWN0dXJlICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCit2ODUwX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICBhYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGU7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7CisgICAgICAgaSA8IHNpemVvZiAodjg1MF9lbGZfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IHY4NTBfZWxmX3JlbG9jX21hcCk7CisgICAgICAgaSsrKQorICAgIHsKKyAgICAgIGlmICh2ODUwX2VsZl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQorCXsKKwkgIEJGRF9BU1NFUlQgKHY4NTBfZWxmX2hvd3RvX3RhYmxlW3Y4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXS50eXBlID09IHY4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsKTsKKwkgIAorCSAgcmV0dXJuICYgdjg1MF9lbGZfaG93dG9fdGFibGVbdjg1MF9lbGZfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOworCX0KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKwwKKy8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gVjg1MCBFTEYgcmVsb2MuICAqLworc3RhdGljIHZvaWQKK3Y4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKKyAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIGFyZWxlbnQgKiAgICAgICAgICAgICBjYWNoZV9wdHI7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbCAqICBkc3Q7Cit7CisgIHVuc2lnbmVkIGludCByX3R5cGU7CisKKyAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7CisgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfVjg1MF9tYXgpOworICBjYWNoZV9wdHItPmhvd3RvID0gJnY4NTBfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Cit9CisKKy8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBWODUwIEVMRiByZWxvYyAodHlwZSBSRUxBKS4gKi8KK3N0YXRpYyB2b2lkCit2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZDsKKyAgICAgYXJlbGVudCAqICAgICAgICAgICAgIGNhY2hlX3B0cjsKKyAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAgICpkc3Q7Cit7CisgIHVuc2lnbmVkIGludCByX3R5cGU7CisKKyAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7CisgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfVjg1MF9tYXgpOworICBjYWNoZV9wdHItPmhvd3RvID0gJnY4NTBfZWxmX2hvd3RvX3RhYmxlW3JfdHlwZV07Cit9CisKKwwKKy8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCisgICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBvciBwcm9jZWR1cmUgbGlua2FnZQorICAgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgICAgaW5mbzsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICByZWxvY3M7Cit7CisgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgYmZkICpkeW5vYmo7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7CisgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOworICBhc2VjdGlvbiAqc3JlbG9jOworICBlbnVtIHY4NTBfcmVsb2NfdHlwZSByX3R5cGU7CisgIGludCBvdGhlciA9IDA7CisgIGNvbnN0IGNoYXIgKmNvbW1vbiA9IChjb25zdCBjaGFyICopMDsKKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAidjg1MF9lbGZfY2hlY2tfcmVsb2NzIGNhbGxlZCBmb3Igc2VjdGlvbiAlcyBpbiAlc1xuIiwKKwkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKKwkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisjZW5kaWYKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOworICBzcmVsb2MgPSBOVUxMOworCisgIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCWggPSBOVUxMOworICAgICAgZWxzZQorCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisKKyAgICAgIHJfdHlwZSA9IChlbnVtIHY4NTBfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisgICAgICBzd2l0Y2ggKHJfdHlwZSkKKwl7CisJZGVmYXVsdDoKKwljYXNlIFJfVjg1MF9OT05FOgorCWNhc2UgUl9WODUwXzlfUENSRUw6CisJY2FzZSBSX1Y4NTBfMjJfUENSRUw6CisJY2FzZSBSX1Y4NTBfSEkxNl9TOgorCWNhc2UgUl9WODUwX0hJMTY6CisJY2FzZSBSX1Y4NTBfTE8xNjoKKwljYXNlIFJfVjg1MF8zMjoKKwljYXNlIFJfVjg1MF8xNjoKKwljYXNlIFJfVjg1MF84OgorCWNhc2UgUl9WODUwX0NBTExUXzZfN19PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOgorCSAgYnJlYWs7CisKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgorICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCisgICAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6CisgICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5CisgICAgICAgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLworICAgICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKKyAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgorCWNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDoKKwkgIG90aGVyID0gVjg1MF9PVEhFUl9TREE7CisJICBjb21tb24gPSAiLnNjb21tb24iOworCSAgZ290byBzbWFsbF9kYXRhX2NvbW1vbjsKKwkgIAorCWNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKKwljYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgorCSAgb3RoZXIgPSBWODUwX09USEVSX1pEQTsKKwkgIGNvbW1vbiA9ICIuemNvbW1vbiI7CisJICBnb3RvIHNtYWxsX2RhdGFfY29tbW9uOworCSAgCisJY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfVERBXzRfNF9PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6CisJY2FzZSBSX1Y4NTBfVERBXzE2XzE2X09GRlNFVDoKKwkgIG90aGVyID0gVjg1MF9PVEhFUl9UREE7CisJICBjb21tb24gPSAiLnRjb21tb24iOworCSAgLyogZmFsbCB0aHJvdWdoICovCisKKyNkZWZpbmUgVjg1MF9PVEhFUl9NQVNLIChWODUwX09USEVSX1REQSB8IFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9aREEpCisKKwlzbWFsbF9kYXRhX2NvbW1vbjoKKwkgIGlmIChoKQorCSAgICB7CisJICAgICAgaC0+b3RoZXIgfD0gb3RoZXI7CS8qIGZsYWcgd2hpY2ggdHlwZSBvZiByZWxvY2F0aW9uIHdhcyB1c2VkICovCisJICAgICAgaWYgKChoLT5vdGhlciAmIFY4NTBfT1RIRVJfTUFTSykgIT0gKG90aGVyICYgVjg1MF9PVEhFUl9NQVNLKQorCQkgICYmIChoLT5vdGhlciAmIFY4NTBfT1RIRVJfRVJST1IpID09IDApCisJCXsKKwkJICBjb25zdCBjaGFyICogbXNnOworCQkgIHN0YXRpYyBjaGFyICBidWZmWzIwMF07IC8qIFhYWCAqLworCisJCSAgc3dpdGNoIChoLT5vdGhlciAmIFY4NTBfT1RIRVJfTUFTSykKKwkJICAgIHsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IG9jY3VweSBpbiBtdWx0aXBsZSBzbWFsbCBkYXRhIHJlZ2lvbnMiKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9aREEgfCBWODUwX09USEVSX1REQToKKwkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW4gb25seSBiZSBpbiBvbmUgb2YgdGhlIHNtYWxsLCB6ZXJvLCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMiKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIFY4NTBfT1RIRVJfU0RBIHwgVjg1MF9PVEhFUl9aREE6CisJCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggc21hbGwgYW5kIHplcm8gZGF0YSByZWdpb25zIHNpbXVsdGFuZW91c2x5Iik7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfVERBOgorCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgVjg1MF9PVEhFUl9aREEgfCBWODUwX09USEVSX1REQToKKwkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCB6ZXJvIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKworCQkgIHNwcmludGYgKGJ1ZmYsIG1zZywgaC0+cm9vdC5yb290LnN0cmluZyk7CisJCSAgaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nIChpbmZvLCBidWZmLCBoLT5yb290LnJvb3Quc3RyaW5nLAorCQkJCQkgICAgYWJmZCwgaC0+cm9vdC51LmRlZi5zZWN0aW9uLCAwKTsKKworCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkgIGgtPm90aGVyIHw9IFY4NTBfT1RIRVJfRVJST1I7CisJCSAgcmV0ID0gZmFsc2U7CisJCX0KKwkgICAgfQorCisJICBpZiAoaCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KKwkgICAgICAmJiBoLT5yb290LnUuYy5wCisJICAgICAgJiYgIXN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24pLCAiQ09NTU9OIikpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2VjdGlvbiA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIGNvbW1vbik7CisJICAgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKKwkgICAgfQorCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgInY4NTBfZWxmX2NoZWNrX3JlbG9jcywgZm91bmQgJXMgcmVsb2NhdGlvbiBmb3IgJXMlc1xuIiwKKwkJICAgdjg1MF9lbGZfaG93dG9fdGFibGVbIChpbnQpcl90eXBlIF0ubmFtZSwKKwkJICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIsCisJCSAgIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pID8gIiwgc3ltYm9sIGlzIGNvbW1vbiIgOiAiIik7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluIHRoZSBvbGQgdmVyc2lvbiwgd2hlbiBhbiBlbnRyeSB3YXMgY2hlY2tlZCBvdXQgZnJvbSB0aGUgdGFibGUsCisgKiBpdCB3YXMgZGVsZXRlZC4gIFRoaXMgcHJvZHVjZWQgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IHdhcyBuZWVkZWQKKyAqIG1vcmUgdGhhbiBvbmNlLCBhcyB0aGUgc2Vjb25kIGF0dGVtcHRlZCByZXRyeSBmYWlsZWQuCisgKgorICogSW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgdGhlIGVudHJ5IGlzIG5vdCBkZWxldGVkLCBpbnN0ZWFkIHdlIHNldAorICogdGhlIGZpZWxkICdmb3VuZCcgdG8gdHJ1ZS4gIElmIGEgc2Vjb25kIGxvb2t1cCBtYXRjaGVzIHRoZSBzYW1lCisgKiBlbnRyeSwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlIGhpMTZzIHJlbG9jIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZAorICogYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdXBkYXRlZCBhIHNlY29uZCB0aW1lLgorICoKKyAqIFRPRE8gLSBUT0ZJWDogSWYgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIHJlc3RvcmUgMiBkaWZmZXJlbnQKKyAqIGFkZHJlc3NlcyBmcm9tIHRoZSBzYW1lIHRhYmxlIGVudHJ5LCB3aGVyZSB0aGUgZmlyc3QgZ2VuZXJhdGVzIGFuCisgKiBvdmVyZmxvdywgd2hpbHN0IHRoZSBzZWNvbmQgZG8gbm90LCB0aGVuIHRoaXMgY29kZSB3aWxsIGZhaWwuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaGkxNnNfbG9jYXRpb24KK3sKKyAgYmZkX3ZtYSAgICAgICBhZGRlbmQ7CisgIGJmZF9ieXRlICogICAgYWRkcmVzczsKKyAgdW5zaWduZWQgbG9uZyBjb3VudGVyOworICBib29sZWFuICAgICAgIGZvdW5kOworICBzdHJ1Y3QgaGkxNnNfbG9jYXRpb24gKiBuZXh0OworfQoraGkxNnNfbG9jYXRpb247CisKK3N0YXRpYyBoaTE2c19sb2NhdGlvbiAqICBwcmV2aW91c19oaTE2czsKK3N0YXRpYyBoaTE2c19sb2NhdGlvbiAqICBmcmVlX2hpMTZzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgICAgIGhpMTZzX2NvdW50ZXI7CisKK3N0YXRpYyB2b2lkCityZW1lbWJlcl9oaTE2c19yZWxvYyAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKQorICAgICBiZmQgKiAgICAgIGFiZmQ7CisgICAgIGJmZF92bWEgICAgYWRkZW5kOworICAgICBiZmRfYnl0ZSAqIGFkZHJlc3M7Cit7CisgIGhpMTZzX2xvY2F0aW9uICogZW50cnkgPSBOVUxMOworICAKKyAgLyogRmluZCBhIGZyZWUgc3RydWN0dXJlLiAgKi8KKyAgaWYgKGZyZWVfaGkxNnMgPT0gTlVMTCkKKyAgICBmcmVlX2hpMTZzID0gKGhpMTZzX2xvY2F0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKiBmcmVlX2hpMTZzKSk7CisKKyAgZW50cnkgICAgICA9IGZyZWVfaGkxNnM7CisgIGZyZWVfaGkxNnMgPSBmcmVlX2hpMTZzLT5uZXh0OworICAKKyAgZW50cnktPmFkZGVuZCAgPSBhZGRlbmQ7CisgIGVudHJ5LT5hZGRyZXNzID0gYWRkcmVzczsKKyAgZW50cnktPmNvdW50ZXIgPSBoaTE2c19jb3VudGVyICsrOworICBlbnRyeS0+Zm91bmQgICA9IGZhbHNlOworICBlbnRyeS0+bmV4dCAgICA9IHByZXZpb3VzX2hpMTZzOworICBwcmV2aW91c19oaTE2cyA9IGVudHJ5OworICAKKyAgLyogQ29wZSB3aXRoIHdyYXAgYXJvdW5kIG9mIG91ciBjb3VudGVyLiAgKi8KKyAgaWYgKGhpMTZzX2NvdW50ZXIgPT0gMCkKKyAgICB7CisgICAgICAvKiBYWFggLSBBc3N1bWUgdGhhdCBhbGwgY291bnRlciBlbnRyaWVzIGRpZmZlciBvbmx5IGluIHRoZWlyIGxvdyAxNiBiaXRzLiAgKi8KKyAgICAgIGZvciAoZW50cnkgPSBwcmV2aW91c19oaTE2czsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKwllbnRyeS0+Y291bnRlciAmPSAweGZmZmY7CisKKyAgICAgIGhpMTZzX2NvdW50ZXIgPSAweDEwMDAwOworICAgIH0KKyAgCisgIHJldHVybjsKK30KKworc3RhdGljIGJmZF9ieXRlICoKK2ZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyAoYWRkZW5kLCBhbHJlYWR5X2ZvdW5kKQorICAgICBiZmRfdm1hICAgYWRkZW5kOworICAgICBib29sZWFuICogYWxyZWFkeV9mb3VuZDsKK3sKKyAgaGkxNnNfbG9jYXRpb24gKiBtYXRjaCA9IE5VTEw7CisgIGhpMTZzX2xvY2F0aW9uICogZW50cnk7CisgIGhpMTZzX2xvY2F0aW9uICogcHJldmlvdXMgPSBOVUxMOworICBoaTE2c19sb2NhdGlvbiAqIHByZXY7CisgIGludCAgICAgICAgICAgICAgaTsKKyAgYmZkX2J5dGUgKiAgICAgICBhZGRyOworICAKKyAgLyogU2VhcmNoIHRoZSB0YWJsZS4gIFJlY29yZCB0aGUgbW9zdCByZWNlbnQgZW50cnkgdGhhdCBtYXRjaGVzLiAgKi8KKyAgZm9yIChlbnRyeSA9IHByZXZpb3VzX2hpMTZzOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoZW50cnktPmFkZGVuZCA9PSBhZGRlbmQKKwkgICYmIChtYXRjaCA9PSBOVUxMIHx8IG1hdGNoLT5jb3VudGVyIDwgZW50cnktPmNvdW50ZXIpKQorCXsKKwkgIHByZXZpb3VzID0gcHJldjsKKwkgIG1hdGNoICAgID0gZW50cnk7CisJfQorICAgICAgCisgICAgICBwcmV2ID0gZW50cnk7CisgICAgfQorCisgIGlmIChtYXRjaCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEV4dHJhY3QgdGhlIGFkZHJlc3MuICAqLworICBhZGRyID0gbWF0Y2gtPmFkZHJlc3M7CisKKyAgLyogUmVtZWJlciBpZiB0aGlzIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBiZWZvcmUuICAqLworICBpZiAoYWxyZWFkeV9mb3VuZCkKKyAgICAqIGFscmVhZHlfZm91bmQgPSBtYXRjaC0+Zm91bmQ7CisKKyAgLyogTm90ZSB0aGF0IHRoaXMgZW50cnkgaGFzIG5vdyBiZWVuIHVzZWQuICAqLworICBtYXRjaC0+Zm91bmQgPSB0cnVlOworICAKKyAgcmV0dXJuIGFkZHI7Cit9ICAgICAKKworLyogRklYTUU6ICBUaGUgY29kZSBoZXJlIHByb2JhYmx5IG91Z2h0IHRvIGJlIHJlbW92ZWQgYW5kIHRoZSBjb2RlIGluIHJlbG9jLmMKKyAgIGFsbG93ZWQgdG8gZG8gaXRzICBzdHVmZiBpbnN0ZWFkLiAgQXQgbGVhc3QgZm9yIG1vc3Qgb2YgdGhlIHJlbG9jcywgYW53eWF5LiAgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3Y4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgcl90eXBlLCBhZGRlbmQsIGFkZHJlc3MpCisgICAgIGJmZCAqICAgICAgYWJmZDsKKyAgICAgaW50ICAgICAgICByX3R5cGU7CisgICAgIGJmZF92bWEgICAgYWRkZW5kOworICAgICBiZmRfYnl0ZSAqIGFkZHJlc3M7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgYmZkX3NpZ25lZF92bWEgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOworICAKKyAgc3dpdGNoIChyX3R5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICAvKiBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyB0eXBlICVkIG5vdCBTVVBQT1JURURcbiIsIHJfdHlwZSApOyAqLworICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7CisgICAgICAKKyAgICBjYXNlIFJfVjg1MF8zMjoKKyAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfMjJfUENSRUw6CisgICAgICBpZiAoc2FkZGVuZCA+IDB4MWZmZmZmIHx8IHNhZGRlbmQgPCAtMHgyMDAwMDApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICAgIAorICAgICAgaWYgKChhZGRlbmQgJSAyKSAhPSAwKQorCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworICAgICAgCisgICAgICBpbnNuICA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOworICAgICAgaW5zbiAmPSB+MHhmZmZlMDAzZjsKKyAgICAgIGluc24gfD0gKCgoYWRkZW5kICYgMHhmZmZlKSA8PCAxNikgfCAoKGFkZGVuZCAmIDB4M2YwMDAwKSA+PiAxNikpOworICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKKyAgICAgIGlmIChzYWRkZW5kID4gMHhmZiB8fCBzYWRkZW5kIDwgLTB4MTAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICAKKyAgICAgIGlmICgoYWRkZW5kICUgMikgIT0gMCkKKwlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKKyAgICAgIAorICAgICAgaW5zbiAgPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKKyAgICAgIGluc24gJj0gfiAweGY4NzA7CisgICAgICBpbnNuIHw9ICgoYWRkZW5kICYgMHgxZjApIDw8IDcpIHwgKChhZGRlbmQgJiAweDBlKSA8PCAzKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfSEkxNjoKKyAgICAgIGFkZGVuZCArPSAoYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcykgPDwgMTYpOworICAgICAgYWRkZW5kID0gKGFkZGVuZCA+PiAxNik7CisgICAgICBpbnNuID0gYWRkZW5kOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFJfVjg1MF9ISTE2X1M6CisgICAgICAvKiBSZW1lbWJlciB3aGVyZSB0aGlzIHJlbG9jYXRpb24gdG9vayBwbGFjZS4gICovCisgICAgICByZW1lbWJlcl9oaTE2c19yZWxvYyAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKKworICAgICAgYWRkZW5kICs9IChiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKSA8PCAxNik7CisgICAgICBhZGRlbmQgPSAoYWRkZW5kID4+IDE2KSArICgoYWRkZW5kICYgMHg4MDAwKSAhPSAwKTsKKyAgICAgIAorICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGNhbm5vdCBvdmVyZmxvdy4gKi8KKyAgICAgIGlmIChhZGRlbmQgPiAweDdmZmYpCisJYWRkZW5kID0gMDsKKyAgICAgIAorICAgICAgaW5zbiA9IGFkZGVuZDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfTE8xNjoKKyAgICAgIC8qIENhbGN1bGF0ZSB0aGUgc3VtIG9mIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGFuZCB0aGUKKwkgYWRkZW5kIGFuZCBjaGVjayBmb3Igb3ZlcmZsb3cgZnJvbSB0aGUgbG93IDE2IGJpdHMgaW50byB0aGUgaGlnaAorCSAxNiBiaXRzLiAgVGhlIGFzc2VtYmxlciBoYXMgYWxyZWFkeSBkb25lIHNvbWUgb2YgdGhpczogIElmIHRoZQorCSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGhhcyBpdHMgMTV0aCBiaXQgc2V0LCAoY291bnRpbmcKKwkgZnJvbSB6ZXJvKSB0aGVuIHRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIGFkZGVkIDEgdG8gdGhlIHZhbHVlCisJIHN0b3JlZCBpbiB0aGUgYXNzb2NpYXRlZCBISTE2UyByZWxvYy4gIFNvIGZvciBleGFtcGxlLCB0aGVzZQorCSByZWxvY2F0aW9uczoKKworCSAgICAgbW92aGkgaGkoIGZyZWQgKSwgcjAsIHIxCisJICAgICBtb3ZlYSBsbyggZnJlZCApLCByMSwgcjEKKworCSB3aWxsIHN0b3JlIDAgaW4gdGhlIHZhbHVlIGZpZWxkcyBmb3IgdGhlIE1PVkhJIGFuZCBNT1ZFQSBpbnN0cnVjdGlvbnMKKwkgYW5kIGFkZGVuZCB3aWxsIGJlIHRoZSBhZGRyZXNzIG9mIGZyZWQsIGJ1dCBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zOgorCisJICAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTIzNDU2KSwgcjAsIHIxCisJICAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTIzNDU2KSwgcjEsIHIxCisKKwkgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gd2lsbCBiZSAweDEyIGFuZCB0aGUgdmFsdWUKKwkgc3RvcmVkIGluIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbiB3aWxsIGJlIDB4MzQ1Ni4gIElmIGhvd2V2ZXIgdGhlCisJIGluc3RydWN0aW9ucyB3ZXJlOgorCisJICAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTBmZmZmKSwgcjAsIHIxCisJICAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTBmZmZmKSwgcjEsIHIxCisKKwkgdGhlbiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZISSBpbnN0cnVjdGlvbiB3b3VsZCBiZSAweDExIChub3QKKwkgMHgxMCkgYW5kIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkVBIGluc3RydWN0aW9uIHdvdWxkIGJlIDB4ZmZmZi4KKwkgVGh1cyAoYXNzdW1pbmcgZm9yIHRoZSBtb21lbnQgdGhhdCB0aGUgYWRkZW5kIGlzIDApLCBhdCBydW4gdGltZSB0aGUKKwkgTU9WSEkgaW5zdHJ1Y3Rpb24gbG9hZHMgMHgxMTAwMDAgaW50byByMSwgdGhlbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24KKwkgYWRkcyAweGZmZmZmZmZmIChzaWduIGV4dGVuc2lvbiEpIHByb2R1Y2luZyAweDEwZmZmZi4gIFNpbWlsYXJseSBpZgorCSB0aGUgaW5zdHJ1Y3Rpb25zIHdlcmU6CisKKwkgICAgIG1vdmhpIGhpKCBmcmVkIC0gMSksIHIwLCByMQorCSAgICAgbW92ZWEgbG8oIGZyZWQgLSAxKSwgcjEsIHIxCisKKwkgdGhlbiAwIGlzIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gYW5kIC0xIGlzIHN0b3JlZCBpbiB0aGUKKwkgTU9WRUEgaW5zdHJ1Y3Rpb24uCisKKwkgT3ZlcmZsb3cgY2FuIG9jY3VyIGlmIHRoZSBhZGRpdGlvbiBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZQorCSBpbnN0cnVjdGlvbiBwbHVzIHRoZSBhZGRlbmQgc2V0cyB0aGUgMTV0aCBiaXQgd2hlbiBiZWZvcmUgaXQgd2FzIGNsZWFyLgorCSBUaGlzIGlzIGJlY2F1c2UgdGhlIDE1dGggYml0IHdpbGwgYmUgc2lnbiBleHRlbmRlZCBpbnRvIHRoZSBoaWdoIHBhcnQsCisJIHRodXMgcmVkdWNpbmcgaXRzIHZhbHVlIGJ5IG9uZSwgYnV0IHNpbmNlIHRoZSAxNXRoIGJpdCB3YXMgb3JpZ2luYWxseQorCSBjbGVhciwgdGhlIGFzc2VtYmxlciB3aWxsIG5vdCBoYXZlIGFkZGVkIDEgdG8gdGhlIHByZXZpb3VzIEhJMTZTIHJlbG9jCisJIHRvIGNvbXBlbnNhdGUgZm9yIHRoaXMgZWZmZWN0LiAgRm9yIGV4YW1wbGU6CisKKwkgICAgbW92aGkgaGkoIGZyZWQgKyAweDEyMzQ1NiksIHIwLCByMQorCSAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTIzNDU2KSwgcjEsIHIxCisKKwkgVGhlIHZhbHVlIHN0b3JlZCBpbiBISTE2UyByZWxvYyBpcyAweDEyLCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBMTzE2CisJIHJlbG9jIGlzIDB4MzQ1Ni4gIElmIHdlIGFzc3VtZSB0aGF0IHRoZSBhZGRyZXNzIG9mIGZyZWQgaXMgMHgwMDAwNzAwMAorCSB0aGVuIHRoZSByZWxvY2F0aW9ucyBiZWNvbWU6CisKKwkgICBISTE2UzogMHgwMDEyICsgKDB4MDAwMDcwMDAgPj4gMTYpICAgID0gMHgxMgorCSAgIExPMTY6ICAweDM0NTYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweGE0NTYKKworCSBidXQgd2hlbiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCwgdGhlIE1PVkVBIGluc3RydWN0aW9uJ3MgdmFsdWUKKwkgaXMgc2lnbmVkIGV4dGVuZGVkLCBzbyB0aGUgc3VtIGJlY29tZXM6CisKKwkgICAgICAweDAwMTIwMDAwCisJICAgICsgMHhmZmZmYTQ1NgorCSAgICAtLS0tLS0tLS0tLS0KKwkgICAgICAweDAwMTFhNDU2ICAgIGJ1dCAnZnJlZCArIDB4MTIzNDU2JyA9IDB4MDAxMmE0NTYKKworCSBOb3RlIHRoYXQgaWYgdGhlIDE1dGggYml0IHdhcyBzZXQgaW4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTE8xNgorCSByZWxvYywgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZzoKKworCSAgICBtb3ZoaSBoaSggZnJlZCArIDB4MTBmZmZmKSwgcjAsIHIxCisJICAgIG1vdmVhIGxvKCBmcmVkICsgMHgxMGZmZmYpLCByMSwgcjEKKworCSAgICBISTE2UzogIDB4MDAxMSArICgweDAwMDA3MDAwID4+IDE2KSAgICA9IDB4MTEKKwkgICAgTE8xNjogICAweGZmZmYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweDZmZmYKKworCSAgICAgIDB4MDAxMTAwMDAKKwkgICAgKyAweDAwMDA2ZmZmCisJICAgIC0tLS0tLS0tLS0tLQorCSAgICAgIDB4MDAxMTZmZmYgID0gZnJlZCArIDB4MTBmZmZmID0gMHg3MDAwICsgMHgxMGZmZmYKKworCSAKKwkgT3ZlcmZsb3cgY2FuIGFsc28gb2NjdXIgaWYgdGhlIGNvbXB1dGF0aW9uIGNhcnJpZXMgaW50byB0aGUgMTZ0aCBiaXQKKwkgYW5kIGl0IGFsc28gcmVzdWx0cyBpbiB0aGUgMTV0aCBiaXQgaGF2aW5nIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSAxNXRoCisJIGJpdCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUuICAgV2hhdCBoYXBwZW5zIGlzIHRoYXQgdGhlIEhJMTZTIHJlbG9jCisJIHdpbGwgaGF2ZSBhbHJlYWR5IGV4YW1pbmVkIHRoZSAxNXRoIGJpdCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgYW5kCisJIGFkZGVkIDEgdG8gdGhlIGhpZ2ggcGFydCBpZiB0aGUgYml0IGlzIHNldC4gIFRoaXMgY29tcGVuc2F0ZXMgZm9yIHRoZQorCSBzaWduIGV4dGVuc2lvbiBvZiAxNXRoIGJpdCBvZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wdXRhdGlvbi4gIEJ1dCBub3cKKwkgdGhlcmUgaXMgYSBjYXJyeSBpbnRvIHRoZSAxNnRoIGJpdCwgYW5kIHRoaXMgaGFzIG5vdCBiZWVuIGFsbG93ZWQgZm9yLgorCisJIFNvLCBmb3IgZXhhbXBsZSBpZiBmcmVkIGlzIGF0IGFkZHJlc3MgMHhmMDAwOgorCisJICAgbW92aGkgaGkoIGZyZWQgKyAweGZmZmYpLCByMCwgcjEgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIHNldF0KKwkgICBtb3ZlYSBsbyggZnJlZCArIDB4ZmZmZiksIHIxLCByMQorCisJICAgSEkxNlM6IDB4MDAwMSArICgweDAwMDBmMDAwID4+IDE2KSAgICA9IDB4MDAwMQorCSAgIExPMTY6ICAweGZmZmYgKyAoMHgwMDAwZjAwMCAmIDB4ZmZmZikgPSAweGVmZmYgICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKKworCSAgICAgMHgwMDAxMDAwMAorCSAgICsgMHhmZmZmZWZmZgorCSAgIC0tLS0tLS0tLS0tLQorCSAgICAgMHgwMDAwZWZmZiAgIGJ1dCAnZnJlZCArIDB4ZmZmZicgPSAweDAwMDFlZmZmCisKKwkgU2ltaWxhcmx5LCBpZiB0aGUgMTV0aCBiaXQgcmVtYWlucyBjbGVhciwgYnV0IG92ZXJmbG93IG9jY3VycyBpbnRvCisJIHRoZSAxNnRoIGJpdCB0aGVuIChhc3N1bWluZyB0aGUgYWRkcmVzcyBvZiBmcmVkIGlzIDB4ZjAwMCk6CisKKwkgICBtb3ZoaSBoaSggZnJlZCArIDB4NzAwMCksIHIwLCByMSAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgY2xlYXJdCisJICAgbW92ZWEgbG8oIGZyZWQgKyAweDcwMDApLCByMSwgcjEKKworCSAgIEhJMTZTOiAweDAwMDAgKyAoMHgwMDAwZjAwMCA+PiAxNikgICAgPSAweDAwMDAKKwkgICBMTzE2OiAgMHg3MDAwICsgKDB4MDAwMGYwMDAgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKKworCSAgICAgMHgwMDAwMDAwMAorCSAgICsgMHgwMDAwNmZmZgorCSAgIC0tLS0tLS0tLS0tLQorCSAgICAgMHgwMDAwNmZmZiAgIGJ1dCAnZnJlZCArIDB4NzAwMCcgPSAweDAwMDE2ZmZmCisJICAgCisJIE5vdGUgLSB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBpZiBhIGNhcnJ5IG9jY3VycywgYW5kIHRoZQorCSAxNXRoIGJpdCBjaGFuZ2VzIGl0cyB2YWx1ZSBmcm9tIGJlaW5nIHNldCB0byBiZWluZyBjbGVhciwgYXMgdGhlIEhJMTZTCisJIHJlbG9jIHdpbGwgaGF2ZSBhbHJlYWR5IGFkZGVkIGluIDEgdG8gdGhlIGhpZ2ggcGFydCBmb3IgdXM6CisKKwkgICBtb3ZoaSBoaSggZnJlZCArIDB4ZmZmZiksIHIwLCByMSAgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIHNldF0KKwkgICBtb3ZlYSBsbyggZnJlZCArIDB4ZmZmZiksIHIxLCByMQorCisJICAgSEkxNlM6IDB4MDAwMSArICgweDAwMDA3MDAwID4+IDE2KQorCSAgIExPMTY6ICAweGZmZmYgKyAoMHgwMDAwNzAwMCAmIDB4ZmZmZikgPSAweDZmZmYgIChjYXJyeSBpbnRvIGJpdCAxNiBpcyBsb3N0KQorCisJICAgICAweDAwMDEwMDAwCisJICAgKyAweDAwMDA2ZmZmICAgKGJpdCAxNSBub3Qgc2V0LCBzbyB0aGUgdG9wIGhhbGYgaXMgemVybykKKwkgICAtLS0tLS0tLS0tLS0KKwkgICAgIDB4MDAwMTZmZmYgICB3aGljaCBpcyByaWdodCAoYXNzdW1pbmcgdGhhdCBmcmVkIGlzIGF0IDB4NzAwMCkKKworCSBidXQgaWYgdGhlIDE1dGggYml0IGdvZXMgZnJvbSBiZWluZyBjbGVhciB0byBiZWluZyBzZXQsIHRoZW4gd2UgbXVzdAorCSBvbmNlIGFnYWluIGhhbmRsZSBvdmVyZmxvdzoKKworCSAgIG1vdmhpIGhpKCBmcmVkICsgMHg3MDAwKSwgcjAsIHIxICAgICBbYml0IDE1IG9mIHRoZSBvZmZzZXQgaXMgY2xlYXJdCisJICAgbW92ZWEgbG8oIGZyZWQgKyAweDcwMDApLCByMSwgcjEKKworCSAgIEhJMTZTOiAweDAwMDAgKyAoMHgwMDAwZmZmZiA+PiAxNikKKwkgICBMTzE2OiAgMHg3MDAwICsgKDB4MDAwMGZmZmYgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYpCisKKwkgICAgIDB4MDAwMDAwMDAKKwkgICArIDB4MDAwMDZmZmYgICAoYml0IDE1IG5vdCBzZXQsIHNvIHRoZSB0b3AgaGFsZiBpcyB6ZXJvKQorCSAgIC0tLS0tLS0tLS0tLQorCSAgICAgMHgwMDAwNmZmZiAgIHdoaWNoIGlzIHdyb25nIChhc3N1bWluZyB0aGF0IGZyZWQgaXMgYXQgMHhmZmZmKQorCSAqLworCisgICAgICB7CisJbG9uZyByZXN1bHQ7CisKKwlpbnNuICAgPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKKwlyZXN1bHQgPSBpbnNuICsgYWRkZW5kOworCisjZGVmaW5lIEJJVDE1X1NFVCh4KSAoKHgpICYgMHg4MDAwKQorI2RlZmluZSBPVkVSRkxPV1MoYSxpKSAoKCgoYSkgJiAweGZmZmYpICsgKGkpKSA+IDB4ZmZmZikKKwkKKwlpZiAoKEJJVDE1X1NFVCAocmVzdWx0KSAmJiAhIEJJVDE1X1NFVCAoYWRkZW5kKSkKKwkgICAgfHwgKE9WRVJGTE9XUyAoYWRkZW5kLCBpbnNuKQorCQkmJiAoKCEgQklUMTVfU0VUIChpbnNuKSkgfHwgKEJJVDE1X1NFVCAoYWRkZW5kKSkpKSkKKwkgIHsKKwkgICAgYm9vbGVhbiBhbHJlYWR5X3VwZGF0ZWQ7CisJICAgIGJmZF9ieXRlICogaGkxNnNfYWRkcmVzcyA9IGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYworCSAgICAgIChhZGRlbmQsICYgYWxyZWFkeV91cGRhdGVkKTsKKwkgICAgCisJICAgIC8qIEFtZW5kIHRoZSBtYXRjaGluZyBISTE2X1MgcmVsb2NhdGlvbi4gICovCisJICAgIGlmIChoaTE2c19hZGRyZXNzICE9IE5VTEwpCisJICAgICAgeworCQlpZiAoISBhbHJlYWR5X3VwZGF0ZWQpCisJCSAgeworCQkgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpMTZzX2FkZHJlc3MpOworCQkgICAgaW5zbiArPSAxOworCQkgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgaGkxNnNfYWRkcmVzcyk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZnByaW50ZiAoc3RkZXJyLCBfKCJGQUlMRUQgdG8gZmluZCBwcmV2aW91cyBISTE2IHJlbG9jXG4iKSk7CisJCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisJICAgICAgfQorCSAgfQorCQorCS8qIERvIG5vdCBjb21wbGFpbiBpZiB2YWx1ZSBoYXMgdG9wIGJpdCBzZXQsIGFzIHRoaXMgaGFzIGJlZW4gYW50aWNpcGF0ZWQuICAqLworCWluc24gPSByZXN1bHQgJiAweGZmZmY7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIFJfVjg1MF84OgorICAgICAgYWRkZW5kICs9IChjaGFyKSBiZmRfZ2V0XzggKGFiZmQsIGFkZHJlc3MpOworCisgICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7CisgICAgICAKKyAgICAgIGlmIChzYWRkZW5kID4gMHg3ZiB8fCBzYWRkZW5kIDwgLTB4ODApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgYmZkX3B1dF84IChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKKyAgICAgIGFkZGVuZCArPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKKyAgICAgIAorICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOworICAgICAgCisgICAgICBpZiAoc2FkZGVuZCA+IDB4ZmZmZiB8fCBzYWRkZW5kIDwgMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgICAgICBpbnNuID0gYWRkZW5kOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFJfVjg1MF8xNjoKKworICAgICAgLyogZHJvcCB0aHJvdWdoICovICAgICAgICAgICAgCisgICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDoKKyAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgorICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6CisgICAgICBhZGRlbmQgKz0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7CisgICAgICAKKyAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKKyAgICAgIAorICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmYgfHwgc2FkZGVuZCA8IC0weDgwMDApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAgICAgaW5zbiA9IGFkZGVuZDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDoKKyAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgorICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOworICAgICAgYWRkZW5kICs9IChpbnNuICYgMHhmZmZlKTsKKyAgICAgIAorICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOworICAgICAgCisgICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZSB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICAgICAgCisgICAgICBpZiAoYWRkZW5kICYgMSkKKyAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7CisgICAgICAKKyAgICAgIGluc24gPSAoYWRkZW5kICYgfjEpIHwgKGluc24gJiAxKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6CisgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7CisgICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHg3ZSkgPDwgMSk7CisgICAgICAKKyAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKKyAgICAgIAorICAgICAgaWYgKHNhZGRlbmQgPiAweGZjIHx8IHNhZGRlbmQgPCAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICAKKyAgICAgIGlmIChhZGRlbmQgJiAzKQorCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworICAgICAgCisgICAgICBpbnNuICY9IDB4ZmY4MTsKKyAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6CisgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7CisgICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHg3ZikgPDwgMSk7CisgICAgICAKKyAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKKyAgICAgIAorICAgICAgaWYgKHNhZGRlbmQgPiAweGZlIHx8IHNhZGRlbmQgPCAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICAKKyAgICAgIGlmIChhZGRlbmQgJiAxKQorCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworICAgICAgCisgICAgICBpbnNuICY9IDB4ZmY4MDsKKyAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6CisgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7CisgICAgICBhZGRlbmQgKz0gaW5zbiAmIDB4N2Y7CisJCisgICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7CisgICAgICAKKyAgICAgIGlmIChzYWRkZW5kID4gMHg3ZiB8fCBzYWRkZW5kIDwgMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICAgICAgCisgICAgICBpbnNuICY9IDB4ZmY4MDsKKyAgICAgIGluc24gfD0gYWRkZW5kOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFJfVjg1MF9UREFfNF81X09GRlNFVDoKKyAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKKyAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweGYpIDw8IDEpOworICAgICAgCisgICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7CisgICAgICAKKyAgICAgIGlmIChzYWRkZW5kID4gMHgxZSB8fCBzYWRkZW5kIDwgMCkKKwlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICAgICAgCisgICAgICBpZiAoYWRkZW5kICYgMSkKKwlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKKyAgICAgIAorICAgICAgaW5zbiAmPSAweGZmZjA7CisgICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgorICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOworICAgICAgYWRkZW5kICs9IGluc24gJiAweGY7CisgICAgICAKKyAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKKyAgICAgIAorICAgICAgaWYgKHNhZGRlbmQgPiAweGYgfHwgc2FkZGVuZCA8IDApCisJcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICAgIAorICAgICAgaW5zbiAmPSAweGZmZjA7CisgICAgICBpbnNuIHw9IGFkZGVuZDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVDoKKyAgICBjYXNlIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgorICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHJlc3MpOworICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4ZmZmZTAwMDApID4+IDE2KSArICgoaW5zbiAmIDB4MjApID4+IDUpOworICAgICAgCisgICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7CisgICAgICAKKyAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZmIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICAKKyAgICAgIGluc24gJj0gMHgwMDAxZmZkZjsKKyAgICAgIGluc24gfD0gKGFkZGVuZCAmIDEpIDw8IDU7CisgICAgICBpbnNuIHw9IChhZGRlbmQgJiB+MSkgPDwgMTY7CisgICAgICAKKyAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGFkZHJlc3MpOworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICAgIAorICAgIGNhc2UgUl9WODUwX0NBTExUXzZfN19PRkZTRVQ6CisgICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7CisgICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHgzZikgPDwgMSk7CisgICAgICAKKyAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKKyAgICAgIAorICAgICAgaWYgKHNhZGRlbmQgPiAweDdlIHx8IHNhZGRlbmQgPCAwKQorCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICAKKyAgICAgIGlmIChhZGRlbmQgJiAxKQorCXJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOworICAgICAgCisgICAgICBpbnNuICY9IDB4ZmY4MDsKKyAgICAgIGluc24gfD0gKGFkZGVuZCA+PiAxKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX1Y4NTBfR05VX1ZUSU5IRVJJVDoKKyAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisKKyAgICB9CisKKyAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgYWRkcmVzcyk7CisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisKKwwKKy8qIEluc2VydCB0aGUgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3Y4NTBfZWxmX3JlbG9jIChhYmZkLCByZWxvYywgc3ltYm9sLCBkYXRhLCBpc2VjdGlvbiwgb2JmZCwgZXJyKQorICAgICBiZmQgKiAgICAgICBhYmZkOworICAgICBhcmVsZW50ICogICByZWxvYzsKKyAgICAgYXN5bWJvbCAqICAgc3ltYm9sOworICAgICBQVFIgICAgICAgICBkYXRhOworICAgICBhc2VjdGlvbiAqICBpc2VjdGlvbjsKKyAgICAgYmZkICogICAgICAgb2JmZDsKKyAgICAgY2hhciAqKiAgICAgZXJyOworeworICBsb25nIHJlbG9jYXRpb247CisgIAorICAvKiBJZiB0aGVyZSBpcyBhbiBvdXRwdXQgQkZELAorICAgICBhbmQgdGhlIHN5bWJvbCBpcyBub3QgYSBzZWN0aW9uIG5hbWUgKHdoaWNoIGlzIG9ubHkgZGVmaW5lZCBhdCBmaW5hbCBsaW5rIHRpbWUpLAorICAgICBhbmQgZWl0aGVyIHdlIGFyZSBub3QgcHV0dGluZyB0aGUgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uCisgICAgICAgICBvciB0aGUgYWRkZW5kIGlzIHplcm8sIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkIGludG8gdGhlIGluc3RydWN0aW9uCisgICAgIHRoZW4ganVzdCBmaXh1cCB0aGUgYWRkcmVzcyBhbmQgcmV0dXJuLiAgKi8KKyAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAorICAgICAgJiYgKCEgcmVsb2MtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKKwkgIHx8IHJlbG9jLT5hZGRlbmQgPT0gMCkpCisgICAgeworICAgICAgcmVsb2MtPmFkZHJlc3MgKz0gaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKyNpZiAwICAKKyAgZWxzZSBpZiAob2JmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisgICAgfQorI2VuZGlmCisgIAorICAvKiBDYXRjaCByZWxvY3MgaW52b2x2aW5nIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAorICAgICAgJiYgb2JmZCA9PSBOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisgIC8qIFdlIGhhbmRsZSBmaW5hbCBsaW5raW5nIG9mIHNvbWUgcmVsb2NzIG91cnNlbHZlcy4gICovCisKKyAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCisgIGlmIChyZWxvYy0+YWRkcmVzcyA+IGlzZWN0aW9uLT5fY29va2VkX3NpemUpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOworICAKKyAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQorICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCisgIAorICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmVsb2NhdGlvbiA9IDA7CisgIGVsc2UKKyAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKKyAgCisgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUgKyBhZGRlbmQuICAqLworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgIHJlbG9jYXRpb24gKz0gcmVsb2MtPmFkZGVuZDsKKyAgCisgIGlmIChyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCisgICAgeworICAgICAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKKwkgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCisgICAgICByZWxvY2F0aW9uIC09IGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICAKKyAgICAgIC8qIERlYWwgd2l0aCBwY3JlbF9vZmZzZXQgKi8KKyAgICAgIHJlbG9jYXRpb24gLT0gcmVsb2MtPmFkZHJlc3M7CisgICAgfQorCisgIHJlbG9jLT5hZGRlbmQgPSByZWxvY2F0aW9uOwkKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworDAorLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICogICAgICAgICBhYmZkOworICAgICBjb25zdCBjaGFyICogIG5hbWU7Cit7CisgIHJldHVybiAoICAgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09ICdMJyB8fCBuYW1lWzFdID09ICcuJykpCisJICB8fCAobmFtZVswXSA9PSAnXycgJiYgIG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gJ0wnICYmIG5hbWVbM10gPT0gJ18nKSk7Cit9CisKKwwKKy8qIFBlcmZvcm0gYSByZWxvY2F0aW9uIGFzIHBhcnQgb2YgYSBmaW5hbCBsaW5rLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3Y4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCisJCQkJICAgIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBvZmZzZXQsIHZhbHVlLAorCQkJCSAgICBhZGRlbmQsIGluZm8sIHN5bV9zZWMsIGlzX2xvY2FsKQorICAgICByZWxvY19ob3d0b190eXBlICogICAgICBob3d0bzsKKyAgICAgYmZkICogICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOworICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOworICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgICBjb250ZW50czsKKyAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgYWRkZW5kOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICBpbmZvOworICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICBzeW1fc2VjOworICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpc19sb2NhbDsKK3sKKyAgdW5zaWduZWQgbG9uZyAgcl90eXBlICAgPSBob3d0by0+dHlwZTsKKyAgYmZkX2J5dGUgKiAgICAgaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKKworICAvKiBBZGp1c3QgdGhlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcmVsb2NhdGlvbi4gICovCisgIHN3aXRjaCAocl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfVjg1MF85X1BDUkVMOgorICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIHZhbHVlIC09IG9mZnNldDsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgUl9WODUwXzIyX1BDUkVMOgorICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCSsgb2Zmc2V0KTsKKworICAgICAgdmFsdWUgPSBTRVhUMjQgKHZhbHVlKTsgIC8qIE9ubHkgdGhlIGJvdHRvbSAyNCBiaXRzIG9mIHRoZSBQQyBhcmUgdmFsaWQgKi8KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgorICAgIGNhc2UgUl9WODUwX0hJMTY6CisgICAgY2FzZSBSX1Y4NTBfTE8xNjoKKyAgICBjYXNlIFJfVjg1MF8xNjoKKyAgICBjYXNlIFJfVjg1MF8zMjoKKyAgICBjYXNlIFJfVjg1MF84OgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgkKKyAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgorICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6CisgICAgICBpZiAoc3ltX3NlYyA9PSBOVUxMKQorCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCSAgCisgICAgICB2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgorICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6CisgICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGdwOworCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKKworCWlmIChzeW1fc2VjID09IE5VTEwpCisJICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKwkgIAorCS8qIEdldCB0aGUgdmFsdWUgb2YgX19ncC4gICovCisJaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCisJICByZXR1cm4gYmZkX3JlbG9jX290aGVyOworCisJZ3AgPSAoaC0+dS5kZWYudmFsdWUKKwkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKwl2YWx1ZSAtPSAoZ3AgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKKyAgICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgorICAgIGNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgorICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6CisgICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6CisgICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6CisgICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6CisgICAgICB7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBlcDsKKwlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7CisJCisJLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2VwLiAgKi8KKwloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2VwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKKwkgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fZXAgY291bGQgbm90IGJlIGZvdW5kLiAqLworCisJZXAgPSAoaC0+dS5kZWYudmFsdWUKKwkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJdmFsdWUgLT0gZXA7CisgICAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7CisJc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOworCQorCS8qIEdldCB0aGUgdmFsdWUgb2YgX19jdGJwLiAgKi8KKwloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2N0YnAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisJICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQorCSAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuICovCisKKwljdGJwID0gKGgtPnUuZGVmLnZhbHVlCisJICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwl2YWx1ZSAtPSBjdGJwOworICAgICAgfQorICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7CisJc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOworCisJaWYgKHN5bV9zZWMgPT0gTlVMTCkKKwkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCSAgCisJLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2N0YnAuICAqLworCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fY3RicCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCisJICByZXR1cm4gKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKTsKKworCWN0YnAgPSAoaC0+dS5kZWYudmFsdWUKKwkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCisJdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKwl2YWx1ZSAtPSAoY3RicCAtIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOworICAgICAgfQorICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBSX1Y4NTBfTk9ORToKKyAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgorICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgorICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKKyAgICB9CisKKyAgLyogUGVyZm9ybSB0aGUgcmVsb2NhdGlvbi4gICovCisgIHJldHVybiB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcl90eXBlLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOyAKK30KKworDAorLyogUmVsb2NhdGUgYW4gVjg1MCBFTEYgc2VjdGlvbi4gICovCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOworICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOworICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKKworICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKworICBpZiAoc3ltX2hhc2hlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZworCShpbmZvLCAibm8gaGFzaCB0YWJsZSBhdmFpbGFibGUiLCBOVUxMLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIDApOworCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAKKyAgLyogUmVzZXQgdGhlIGxpc3Qgb2YgcmVtZW1iZXJlZCBISTE2UyByZWxvY3MgdG8gZW1wdHkuICAqLworICBmcmVlX2hpMTZzICAgICA9IHByZXZpb3VzX2hpMTZzOworICBwcmV2aW91c19oaTE2cyA9IE5VTEw7CisgIGhpMTZzX2NvdW50ZXIgID0gMDsKKyAgCisgIHJlbCAgICA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKKyAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOworICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOworCisgICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOworCisgICAgICBpZiAocl90eXBlID09IFJfVjg1MF9HTlVfVlRFTlRSWQorICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX1Y4NTBfR05VX1ZUSU5IRVJJVCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGhvd3RvID0gdjg1MF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKyAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCisgICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCisgICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQl7CisJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKKwkJfQorCSAgICB9CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLworICAgICAgaCA9IE5VTEw7CisgICAgICBzeW0gPSBOVUxMOworICAgICAgc2VjID0gTlVMTDsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworI2lmIDAKKwkgIHsKKwkgICAgY2hhciAqIG5hbWU7CisJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7CisJICAgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/ICI8bm9uZT4iIDogbmFtZTsKK2ZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAorCSBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKKwkgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOworCSAgfQorI2VuZGlmCisJfQorICAgICAgZWxzZQorCXsKKwkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107CisJICAKKwkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOworCSAgCisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisjaWYgMAorZnByaW50ZiAoc3RkZXJyLCAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAorCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYudmFsdWUsIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKKyNlbmRpZgorCSAgICB9CisJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAgIHsKKyNpZiAwCitmcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAorCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOworI2VuZGlmCisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAorCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKyNpZiAwCitmcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7CisjZW5kaWYKKwkgICAgICByZWxvY2F0aW9uID0gMDsKKwkgICAgfQorCX0KKworICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgdGhlIGFkZGVuZCwgYnV0IHRoZSBDT0ZGIHJlbG9jYXRpb25zCisgICAgICAgICBkb24ndC4gICovCisgICAgICByID0gdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKKwkJCQkJaW5wdXRfc2VjdGlvbiwKKwkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCisJCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCisJCQkJCWluZm8sIHNlYywgaCA9PSBOVUxMKTsKKworICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCXsKKwkgIGNvbnN0IGNoYXIgKiBuYW1lOworCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopMDsKKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KKwkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7CisJICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQorCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCSAgICB9CisKKwkgIHN3aXRjaCAocikKKwkgICAgeworCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCisJCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgorCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb3RoZXI6CisJICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIpOworCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOworCisJICAgIGNhc2UgYmZkX3JlbG9jX2NvbnRpbnVlOgorCSAgICAgIG1zZyA9IF8oImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiKTsKKwkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKKworCSAgICBjYXNlIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk6CisJICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIik7CisJICAgICAgZ290byBjb21tb25fZXJyb3I7CisJICAgICAgCisJICAgIGRlZmF1bHQ6CisJICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKKwkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworCSAgICBjb21tb25fZXJyb3I6CisJICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCisJCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisgIC8qIE5vIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHY4NTAtZWxmICovCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYXNlY3Rpb24gKgordjg1MF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKKyAgICAgICBiZmQgKmFiZmQ7CisgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Cit7CisgIGlmIChoICE9IE5VTEwpCisgICAgeworICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6CisgICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQorICAgICAgICAgIHsKKyAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKKyAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKyAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247CisKKyAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCisgICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKKyAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQorICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKKyAgICAgICAgICB9CisgICAgICB9CisgIHJldHVybiBOVUxMOworfQorLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIEVfVjg1MF9BUkNIOiAgICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCAwKTsgYnJlYWs7CisgICAgY2FzZSBFX1Y4NTBFX0FSQ0g6ICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgYmZkX21hY2hfdjg1MGUpOyBicmVhazsKKyAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6ICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCBiZmRfbWFjaF92ODUwZWEpOyBicmVhazsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KK3N0YXRpYyB2b2lkCit2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCisgICAgIGJmZCAqICAgYWJmZDsKKyAgICAgYm9vbGVhbiBsaW5rZXI7Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworCisgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDA6IHZhbCA9IEVfVjg1MF9BUkNIOyBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgdmFsID0gRV9WODUwRV9BUkNIOyBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogdmFsID0gRV9WODUwRUFfQVJDSDsgIGJyZWFrOworICAgIH0KKworICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfVjg1MF9BUkNIOworICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGtlZXAgVjg1MCBzcGVjaWZpYyBmaWxlIGZsYWdzLiAqLworc3RhdGljIGJvb2xlYW4KK3Y4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKKyAgICAgYmZkICogICAgYWJmZDsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7Cit7CisgIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKKwkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7CisKKyAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKKyAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLworc3RhdGljIGJvb2xlYW4KK3Y4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICogaWJmZDsKKyAgICAgYmZkICogb2JmZDsKK3sKKyAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKKwkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKKwkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOworCisgIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOworICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAorICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KK3N0YXRpYyBib29sZWFuCit2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKiBpYmZkOworICAgICBiZmQgKiBvYmZkOworeworICBmbGFnd29yZCBvdXRfZmxhZ3M7CisgIGZsYWd3b3JkIGluX2ZsYWdzOworCisgIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKKworICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCisgICAgeworICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAorCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAorCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQorCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCisJIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKKwkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KKyAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQorCXJldHVybiB0cnVlOworICAgICAgCisgICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOworICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKKworICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQorCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKKwl7CisJICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOworCX0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCisgIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKKyAgICAgICYmIChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gRV9WODUwX0FSQ0gpCisgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogQXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAorCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisgIHJldHVybiB0cnVlOworfQorLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KKworc3RhdGljIGJvb2xlYW4KK3Y4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKKyAgICAgYmZkICogICBhYmZkOworICAgICBQVFIgICAgIHB0cjsKK3sKKyAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7CisgIAorICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOworICAKKyAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKKyAgCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7CisgIAorICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgRV9WODUwX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTAgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKKyAgICBjYXNlIEVfVjg1MEVfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oInY4NTBlIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7CisgICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwZWEgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKKyAgICB9CisgIAorICBmcHV0YyAoJ1xuJywgZmlsZSk7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworLyogVjg1MCBFTEYgdXNlcyBmb3VyIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCisgICBvdGhlcnMgYXJlIGZvciAoc21hbGwpIG9iamVjdHMgaW4gb25lIG9mIHRoZSBzcGVjaWFsIGRhdGEgYXJlYXM6CisgICBzbWFsbCwgdGlueSBhbmQgemVyby4gIEFsbCB0aGUgb2JqZWN0cyBhcmUga2VwdCB0b2dldGhlciwgYW5kIHRoZW4KKyAgIHJlZmVyZW5jZWQgdmlhIHRoZSBncCByZWdpc3RlciwgdGhlIGVwIHJlZ2lzdGVyIG9yIHRoZSByMCByZWdpc3RlcgorICAgcmVzcGVjdGl2ZWx5LCB3aGljaCB5aWVsZHMgc21hbGxlciwgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcworICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KKworc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl9zY29tX3NlY3Rpb247CitzdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3Njb21fc3ltYm9sOworc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7CitzdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKK3N0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfdGNvbV9zeW1ib2w7CitzdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKK3N0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfemNvbV9zZWN0aW9uOworc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl96Y29tX3N5bWJvbDsKK3N0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOworCisKKy8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KKyAgIGluZGV4LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Y4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKKyAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBoZHI7CisgICAgIGFzZWN0aW9uICogICAgICAgICAgICBzZWM7CisgICAgIGludCAqICAgICAgICAgICAgICAgICByZXR2YWw7Cit7CisgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnNjb21tb24iKSA9PSAwKQorICAgICpyZXR2YWwgPSBTSE5fVjg1MF9TQ09NTU9OOworICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRjb21tb24iKSA9PSAwKQorICAgICpyZXR2YWwgPSBTSE5fVjg1MF9UQ09NTU9OOworICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnpjb21tb24iKSA9PSAwKQorICAgICpyZXR2YWwgPSBTSE5fVjg1MF9aQ09NTU9OOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEhhbmRsZSB0aGUgc3BlY2lhbCBWODUwIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuICAqLworCitzdGF0aWMgdm9pZAordjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCisgICAgIGJmZCAqICAgICBhYmZkOworICAgICBhc3ltYm9sICogYXN5bTsKK3sKKyAgZWxmX3N5bWJvbF90eXBlICogZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOworICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKKyAgCisgIGluZGV4ID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OworCisgIC8qIElmIHRoZSBzZWN0aW9uIGluZGV4IGlzIGFuICJvcmRpbmFyeSIgaW5kZXgsIHRoZW4gaXQgbWF5CisgICAgIHJlZmVyIHRvIGEgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KKyAgICAgQ2hlY2sgdGhlIHNlY3Rpb24ncyB0eXBlIGFuZCBjaGFuZ2UgdGhlIGluZGV4IGl0IG1hdGNoZXMuCisgICAgIAorICAgICBGSVhNRTogU2hvdWxkIHdlIGFsdGVyIHRoZSBzdF9zaG5keCBmaWVsZCBhcyB3ZWxsID8gICovCisgIAorICBpZiAoaW5kZXggPCBlbGZfZWxmaGVhZGVyKGFiZmQpWzBdLmVfc2hudW0pCisgICAgc3dpdGNoIChlbGZfZWxmc2VjdGlvbnMoYWJmZClbaW5kZXhdLT5zaF90eXBlKQorICAgICAgeworICAgICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgorCWluZGV4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKKwlpbmRleCA9IFNITl9WODUwX1RDT01NT047CisJYnJlYWs7CisJCisgICAgICBjYXNlIFNIVF9WODUwX1pDT01NT046CisJaW5kZXggPSBTSE5fVjg1MF9aQ09NTU9OOworCWJyZWFrOworCQorICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICAgIH0KKyAgCisgIHN3aXRjaCAoaW5kZXgpCisgICAgeworICAgIGNhc2UgU0hOX1Y4NTBfU0NPTU1PTjoKKyAgICAgIGlmICh2ODUwX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQorCXsKKwkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KKwkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7CisJICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OIHwgU0VDX0FMTE9DIHwgU0VDX0RBVEE7CisJICB2ODUwX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKKwkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7CisJICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0cjsKKwkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuc2NvbW1vbiI7CisJICB2ODUwX2VsZl9zY29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07CisJICB2ODUwX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKKwkgIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7CisJfQorICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOworICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTSE5fVjg1MF9UQ09NTU9OOgorICAgICAgaWYgKHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCisJeworCSAgLyogSW5pdGlhbGl6ZSB0aGUgdGNvbW1vbiBzZWN0aW9uLiAgKi8KKwkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIudGNvbW1vbiI7CisJICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OOworCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247CisJICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOworCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHI7CisJICB2ODUwX2VsZl90Y29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnRjb21tb24iOworCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOworCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247CisJICB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOworCX0KKyAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKKyAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKKyAgICAgIGlmICh2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQorCXsKKwkgIC8qIEluaXRpYWxpemUgdGhlIHpjb21tb24gc2VjdGlvbi4gICovCisJICB2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnpjb21tb24iOworCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTjsKKwkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOworCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKKwkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOworCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi56Y29tbW9uIjsKKwkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKKwkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOworCSAgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKKwl9CisgICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247CisgICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0CisgICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgdjg1MCBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK3Y4NTBfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgIGluZm87CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07CisgICAgIGNvbnN0IGNoYXIgKiogICAgICAgICAgICBuYW1lcDsKKyAgICAgZmxhZ3dvcmQgKiAgICAgICAgICAgICAgIGZsYWdzcDsKKyAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICAgIHNlY3A7CisgICAgIGJmZF92bWEgKiAgICAgICAgICAgICAgICB2YWxwOworeworICBpbnQgaW5kZXggPSBzeW0tPnN0X3NobmR4OworICAKKyAgLyogSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgYW4gIm9yZGluYXJ5IiBpbmRleCwgdGhlbiBpdCBtYXkKKyAgICAgcmVmZXIgdG8gYSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyLgorICAgICBDaGVjayB0aGUgc2VjdGlvbidzIHR5cGUgYW5kIGNoYW5nZSB0aGUgaW5kZXggaXQgbWF0Y2hlcy4KKyAgICAgCisgICAgIEZJWE1FOiBTaG91bGQgd2UgYWx0ZXIgdGhlIHN0X3NobmR4IGZpZWxkIGFzIHdlbGwgPyAgKi8KKyAgCisgIGlmIChpbmRleCA8IGVsZl9lbGZoZWFkZXIoYWJmZClbMF0uZV9zaG51bSkKKyAgICBzd2l0Y2ggKGVsZl9lbGZzZWN0aW9ucyhhYmZkKVtpbmRleF0tPnNoX3R5cGUpCisgICAgICB7CisgICAgICBjYXNlIFNIVF9WODUwX1NDT01NT046CisJaW5kZXggPSBTSE5fVjg1MF9TQ09NTU9OOworCWJyZWFrOworCQorICAgICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgorCWluZGV4ID0gU0hOX1Y4NTBfVENPTU1PTjsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKKwlpbmRleCA9IFNITl9WODUwX1pDT01NT047CisJYnJlYWs7CisJCisgICAgICBkZWZhdWx0OgorCWJyZWFrOworICAgICAgfQorICAKKyAgc3dpdGNoIChpbmRleCkKKyAgICB7CisgICAgY2FzZSBTSE5fVjg1MF9TQ09NTU9OOgorICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOworICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKKyAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFNITl9WODUwX1RDT01NT046CisgICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50Y29tbW9uIik7CisgICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOworICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKKyAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnpjb21tb24iKTsKKyAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047CisgICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLypBUkdTSUdOT1JFRCovCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKKyAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBuYW1lOworICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIHN5bTsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWM7Cit7CisgIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCisgICAgIGlmIGEgc3ltYm9sIHdhcyBpbiBhIHNwZWNpYWwgY29tbW9uIHNlY3Rpb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyaworICAgICBpdCBhcyBhIHNwZWNpYWwgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIAorICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi5zY29tbW9uIikgPT0gMCkKKwlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnRjb21tb24iKSA9PSAwKQorCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9UQ09NTU9OOworICAgICAgZWxzZSBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuemNvbW1vbiIpID09IDApCisJc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1pDT01NT047CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgordjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKKyAgICAgYmZkICogICAgICAgICAgICAgICBhYmZkOworICAgICBFbGZfSW50ZXJuYWxfU2hkciAqIGhkcjsKKyAgICAgY2hhciAqICAgICAgICAgICAgICBuYW1lOworeworICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAorICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKKyAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gICovCisKKyAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChoZHItPnNoX3R5cGUpCisgICAgeworICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKKyAgICBjYXNlIFNIVF9WODUwX1RDT01NT046CisgICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgorICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAorCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCisJCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKKwkJCQkgICAgfCBTRUNfSVNfQ09NTU9OKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGEgVjg1MCBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCisgICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLworc3RhdGljIGJvb2xlYW4KK3Y4NTBfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQorICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZDsKKyAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkcjsKKyAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIG5hbWU7CisKKyAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOworCisgIGlmIChzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCisgICAgeworICAgICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfU0NPTU1PTjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi50Y29tbW9uIikgPT0gMCkKKyAgICB7CisgICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9UQ09NTU9OOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnpjb21tb24iKSA9PSAwKQorICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1pDT01NT047CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKworCisMCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQkJYmZkX2VsZjMyX3Y4NTBfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJCSJlbGYzMi12ODUwIgorI2RlZmluZSBFTEZfQVJDSAkJCQliZmRfYXJjaF92ODUwCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCQlFTV9DWUdOVVNfVjg1MAorI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkJMHgxMDAwCisJCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQl2ODUwX2VsZl9jaGVja19yZWxvY3MKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAJdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCXY4NTBfZWxmX29iamVjdF9wCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIAl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIAl2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJdjg1MF9lbGZfZmFrZV9zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgdjg1MF9lbGZfZ2NfbWFya19ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19zd2VlcF9ob29rCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKKworCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQl2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCisKKyNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIJCQknXycKKworI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLmMgYi9iZmQvZWxmMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIyOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjMyLmMKQEAgLTAsMCArMSwyMyBAQAorLyogRUxGIDMyLWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgQVJDSF9TSVpFCQkzMgorCisKKyNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmNjQtYWxwaGEuYyBiL2JmZC9lbGY2NC1hbHBoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjRmODYKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmNjQtYWxwaGEuYwpAQCAtMCwwICsxLDQ3NjggQEAKKy8qIEFscGhhIHNwZWNpZmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKKyAgIENvcHlyaWdodCAxOTk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1Pi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBXZSBuZWVkIGEgcHVibGlzaGVkIEFCSSBzcGVjIGZvciB0aGlzLiAgVW50aWwgb25lIGNvbWVzIG91dCwgZG9uJ3QKKyAgIGFzc3VtZSB0aGlzJ2xsIHJlbWFpbiB1bmNoYW5nZWQgZm9yZXZlci4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisKKyNpbmNsdWRlICJlbGYvYWxwaGEuaCIKKworI2RlZmluZSBBTFBIQUVDT0ZGCisKKyNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKKyNkZWZpbmUgTk9fQ09GRl9TWU1CT0xTCisjZGVmaW5lIE5PX0NPRkZfTElORU5PUworCisvKiBHZXQgdGhlIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgTmVlZGVkIGZvciB0aGUgZGVidWcgaW5mb3JtYXRpb24uICovCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNvZmYvc3ltLmgiCisjaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgorI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKKyNpbmNsdWRlICJjb2ZmL2FscGhhLmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKyNpbmNsdWRlICJsaWJlY29mZi5oIgorI2RlZmluZSBFQ09GRl82NAorI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgorCitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqIGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jCisgIFBBUkFNUygoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIGVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUygoYmZkICopKTsKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19uaWwKKyAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfYmFkCisgIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcAorICBQQVJBTVMoKGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqLCBiZmRfYnl0ZSAqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcAorICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKK3N0YXRpYyB2b2lkIGVsZjY0X2FscGhhX2luZm9fdG9faG93dG8KKyAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBFbGY2NF9JbnRlcm5hbF9SZWxhICopKTsKKworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfb2JqZWN0X3AKKyAgUEFSQU1TKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2VjdGlvbl9mcm9tX3NoZHIKKyAgUEFSQU1TKChiZmQgKiwgRWxmNjRfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2Zha2Vfc2VjdGlvbnMKKyAgUEFSQU1TKChiZmQgKiwgRWxmNjRfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24KKyAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8KKyAgUEFSQU1TKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZQorICBQQVJBTVMoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmRfbmVhcmVzdF9saW5lCisgIFBBUkFNUygoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCisJICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKK3N0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5OworI2VuZGlmCisKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX291dHB1dF9leHRzeW0KKyAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKKworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMKKyAgUEFSQU1TKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyB2b2lkIGVsZjY0X2FscGhhX21lcmdlX2dvdHMKKyAgUEFSQU1TKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbAorICBQQVJBTVMgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHMgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcworICBQQVJBTVMgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hZGRfc3ltYm9sX2hvb2sKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKKwkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MKKyAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKnNlYywKKwkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbAorICBQQVJBTVMoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9hZGp1c3RfZHluaW5keAorICBQQVJBTVMoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbAorICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAorCSAgRWxmX0ludGVybmFsX1N5bSAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9maW5hbF9saW5rCisgIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworDAorc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkKK3sKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKKworICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworICBFWFRSIGVzeW07CisKKyAgLyogQ3VtdWxhdGl2ZSBmbGFncyBmb3IgYWxsIHRoZSAuZ290IGVudHJpZXMuICAqLworICBpbnQgZmxhZ3M7CisKKyAgLyogQ29udGV4dHMgKExJVFVTRSkgaW4gd2hpY2ggYSBsaXRlcmFsIHdhcyByZWZlcmVuY2VkLiAgKi8KKyNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSIDB4MDEKKyNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9NRU0gIDB4MDIKKyNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9CWVRFIDB4MDQKKyNkZWZpbmUgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DIDB4MDgKKworICAvKiBVc2VkIHRvIGltcGxlbWVudCBtdWx0aXBsZSAuZ290IHN1YnNlY3Rpb25zLiAgKi8KKyAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkKKyAgeworICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpuZXh0OworCisgICAgLyogd2hpY2ggLmdvdCBzdWJzZWN0aW9uPyAgKi8KKyAgICBiZmQgKmdvdG9iajsKKworICAgIC8qIHRoZSBhZGRlbmQgaW4gZWZmZWN0IGZvciB0aGlzIGVudHJ5LiAgKi8KKyAgICBiZmRfdm1hIGFkZGVuZDsKKworICAgIC8qIHRoZSAuZ290IG9mZnNldCBmb3IgdGhpcyBlbnRyeS4gICovCisgICAgaW50IGdvdF9vZmZzZXQ7CisKKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKiBBbiBhZGRpdGlvbmFsIGZsYWcuICAqLworI2RlZmluZSBBTFBIQV9FTEZfR09UX0VOVFJZX1JFTE9DU19ET05FIDB4MTAKKworICAgIGludCB1c2VfY291bnQ7CisgIH0gKmdvdF9lbnRyaWVzOworCisgIC8qIHVzZWQgdG8gY291bnQgbm9uLWdvdCwgbm9uLXBsdCByZWxvY2F0aW9ucyBmb3IgZGVsYXllZCBzaXppbmcKKyAgICAgb2YgcmVsb2NhdGlvbiBzZWN0aW9ucy4gICovCisgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkKKyAgeworICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKm5leHQ7CisKKyAgICAvKiB3aGljaCAucmVsb2Mgc2VjdGlvbj8gKi8KKyAgICBhc2VjdGlvbiAqc3JlbDsKKworICAgIC8qIHdoYXQga2luZCBvZiByZWxvY2F0aW9uPyAqLworICAgIHVuc2lnbmVkIGxvbmcgcnR5cGU7CisKKyAgICAvKiBob3cgbWFueSBkaWQgd2UgZmluZD8gICovCisgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyAgfSAqcmVsb2NfZW50cmllczsKK307CisKKy8qIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlCit7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisKKyAgLyogVGhlIGhlYWQgb2YgYSBsaXN0IG9mIC5nb3Qgc3Vic2VjdGlvbnMgbGlua2VkIHRocm91Z2gKKyAgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3RfbGlua19uZXh0LiAgKi8KKyAgYmZkICpnb3RfbGlzdDsKK307CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGFscGhhX2VsZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCisgICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKKyAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAorCQkJIChjb3B5KSwgKGZvbGxvdykpKQorCisvKiBUcmF2ZXJzZSBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCisgIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCisKKyNkZWZpbmUgYWxwaGFfZWxmX2hhc2hfdGFibGUocCkgXAorICAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQorCisvKiBHZXQgdGhlIG9iamVjdCdzIHN5bWJvbHMgYXMgb3VyIG93biBlbnRyeSB0eXBlLiAgKi8KKworI2RlZmluZSBhbHBoYV9lbGZfc3ltX2hhc2hlcyhhYmZkKSBcCisgICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiopZWxmX3N5bV9oYXNoZXMoYWJmZCkpCisKKy8qIFNob3VsZCB3ZSBkbyBkeW5hbWljIHRoaW5ncyB0byB0aGlzIHN5bWJvbD8gICovCisKKyNkZWZpbmUgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AoaCwgaW5mbykgCQkJCVwKKyAgKCgoKGluZm8pLT5zaGFyZWQgJiYgIShpbmZvKS0+c3ltYm9saWMpCQkJCVwKKyAgICB8fCAoKChoKS0+ZWxmX2xpbmtfaGFzaF9mbGFncwkJCQkJXAorCSAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikpCVwKKyAgICAgICAgPT0gKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkJXAorICAgIHx8IChoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCQkJXAorICAgIHx8IChoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykJCQkJXAorICAgJiYgKGgpLT5keW5pbmR4ICE9IC0xKQorCisvKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK2VsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCisJCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICBtZW1zZXQgKCZyZXQtPmVzeW0sIDAsIHNpemVvZiAoRVhUUikpOworICAgICAgLyogV2UgdXNlIC0yIGFzIGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGhhcworCSBub3QgYmVlbiBzZXQuICAtMSBtZWFucyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGlmZC4gICovCisgICAgICByZXQtPmVzeW0uaWZkID0gLTI7CisgICAgICByZXQtPmZsYWdzID0gMDsKKyAgICAgIHJldC0+Z290X2VudHJpZXMgPSBOVUxMOworICAgICAgcmV0LT5yZWxvY19lbnRyaWVzID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBDcmVhdGUgYSBBbHBoYSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCisJCQkJICAgICAgIGVsZjY0X2FscGhhX2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gJnJldC0+cm9vdC5yb290OworfQorDAorLyogV2UgaGF2ZSBzb21lIHByaXZhdGUgZmllbGRzIGhhbmdpbmcgb2ZmIG9mIHRoZSBlbGZfdGRhdGEgc3RydWN0dXJlLiAgKi8KKworc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEKK3sKKyAgc3RydWN0IGVsZl9vYmpfdGRhdGEgcm9vdDsKKworICAvKiBGb3IgZXZlcnkgaW5wdXQgZmlsZSwgdGhlc2UgYXJlIHRoZSBnb3QgZW50cmllcyBmb3IgdGhhdCBvYmplY3QncworICAgICBsb2NhbCBzeW1ib2xzLiAgKi8KKyAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKiogbG9jYWxfZ290X2VudHJpZXM7CisKKyAgLyogRm9yIGV2ZXJ5IGlucHV0IGZpbGUsIHRoaXMgaXMgdGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIGdvdCB0aGF0CisgICAgIHRoaXMgaW5wdXQgZmlsZSB1c2VzLiAgKi8KKyAgYmZkICpnb3RvYmo7CisKKyAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBhIGxpbmtlZCBsaXN0IHRocm91Z2ggdGhlIG9iamVjdHMgdXNpbmcgdGhpcyBnb3QgKi8KKyAgYmZkICppbl9nb3RfbGlua19uZXh0OworCisgIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgYSBsaW5rIHRvIHRoZSBuZXh0IGdvdCBzdWJzZWdtZW50LiAgKi8KKyAgYmZkICpnb3RfbGlua19uZXh0OworCisgIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgdGhlIHNlY3Rpb24uICAqLworICBhc2VjdGlvbiAqZ290OworCisgIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgaXQncyB0b3RhbCBudW1iZXIgb2YgKmVudHJpZXMqLiAgKi8KKyAgaW50IHRvdGFsX2dvdF9lbnRyaWVzOworCisgIC8qIEZvciBldmVyeSBnb3QsIHRoaXMgaXMgdGhlIHN1bSBvZiB0aGUgbnVtYmVyIG9mICplbnRyaWVzKiByZXF1aXJlZAorICAgICB0byBob2xkIGFsbCBvZiB0aGUgbWVtYmVyIG9iamVjdCdzIGxvY2FsIGdvdC4gICovCisgIGludCBuX2xvY2FsX2dvdF9lbnRyaWVzOworfTsKKworI2RlZmluZSBhbHBoYV9lbGZfdGRhdGEoYWJmZCkgXAorICAoKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhICopIChhYmZkKS0+dGRhdGEuYW55KQorCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYWJmZC0+dGRhdGEuYW55ID0gYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSkpOworICBpZiAoYWJmZC0+dGRhdGEuYW55ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK2VsZjY0X2FscGhhX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIC8qIEFsbG9jYXRlIG91ciBzcGVjaWFsIHRhcmdldCBkYXRhLiAgKi8KKyAgc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEgKm5ld190ZGF0YTsKKyAgbmV3X3RkYXRhID0gYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSkpOworICBpZiAobmV3X3RkYXRhID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBuZXdfdGRhdGEtPnJvb3QgPSAqYWJmZC0+dGRhdGEuZWxmX29ial9kYXRhOworICBhYmZkLT50ZGF0YS5hbnkgPSBuZXdfdGRhdGE7CisKKyAgLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYW4gQWxwaGEgRUxGIGZpbGUuICAqLworICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfYWxwaGEsIDApOworfQorDAorLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQorICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLworI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjY0X2FscGhhX2hvd3RvX3RhYmxlW10gPQoreworICBIT1dUTyAoUl9BTFBIQV9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZWxmNjRfYWxwaGFfcmVsb2NfbmlsLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJOT05FIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDMyIGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLworICBIT1dUTyAoUl9BTFBIQV9SRUZMT05HLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJFRkxPTkciLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLworICBIT1dUTyAoUl9BTFBIQV9SRUZRVUFELAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA2NCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAzMiBiaXQgR1AgcmVsYXRpdmUgb2Zmc2V0LiAgVGhpcyBpcyBqdXN0IGxpa2UgUkVGTE9ORyBleGNlcHQKKyAgICAgdGhhdCB3aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIHRoZSB2YWx1ZSBvZiB0aGUgZ3AgcmVnaXN0ZXIgd2lsbCBiZQorICAgICBhZGRlZCBpbi4gICovCisgIEhPV1RPIChSX0FMUEhBX0dQUkVMMzIsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiR1BSRUwzMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfTElURVJBTCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiRUxGX0xJVEVSQUwiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhpcyByZWxvYyBvbmx5IGFwcGVhcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIEVMRl9MSVRFUkFMIHJlbG9jLgorICAgICBJdCBpZGVudGlmaWVzIGEgdXNlIG9mIHRoZSBsaXRlcmFsLiAgVGhlIHN5bWJvbCBpbmRleCBpcyBzcGVjaWFsOgorICAgICAxIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJhc2UgcmVnaXN0ZXIgb2YgYSBtZW1vcnkKKyAgICAgZm9ybWF0IGluc3RydWN0aW9uOyAyIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJ5dGUKKyAgICAgb2Zmc2V0IHJlZ2lzdGVyIG9mIGEgYnl0ZS1tYW5pcHVsYXRpb24gaW5zdHJ1Y3Rpb247IDMgbWVhbnMgdGhlCisgICAgIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgdGFyZ2V0IHJlZ2lzdGVyIG9mIGEganNyIGluc3RydWN0aW9uLgorICAgICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueSByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfTElUVVNFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGVsZjY0X2FscGhhX3JlbG9jX25pbCwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgorICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgc3ltYm9sCisgICAgIGluZGV4IG9mIHRoZSBHUERJU1AgaW5zdHJ1Y3Rpb24gaXMgYW4gb2Zmc2V0IGluIGJ5dGVzIHRvIHRoZSBsZGEKKyAgICAgaW5zdHJ1Y3Rpb24gdGhhdCBsb2FkcyB0aGUgbG93ZXIgMTYgYml0cy4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yCisgICAgIHRoZSByZWxvY2F0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUKKyAgICAgY3VycmVudCBsb2NhdGlvbjsgdGhlIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIKKyAgICAgaG9sZGluZyB0aGUgY3VycmVudCBhZGRyZXNzLgorCisgICAgIE5PVEU6IFVubGlrZSBFQ09GRiwgcGFydGlhbCBpbi1wbGFjZSByZWxvY2F0aW9uIGlzIG5vdCBkb25lLiAgSWYKKyAgICAgYW55IG9mZnNldCBpcyBwcmVzZW50IGluIHRoZSBpbnN0cnVjdGlvbnMsIGl0IGlzIGFuIG9mZnNldCBmcm9tCisgICAgIHRoZSByZWdpc3RlciB0byB0aGUgbGRhaCBpbnN0cnVjdGlvbi4gIFRoaXMgbGV0cyB1cyBhdm9pZCBhbnkKKyAgICAgc3R1cGlkIGhhY2tlcnkgbGlrZSBpbnZlbnRpbmcgYSBncCB2YWx1ZSB0byBkbyBwYXJ0aWFsIHJlbG9jYXRpb24KKyAgICAgYWdhaW5zdC4gIEFsc28gdW5saWtlIEVDT0ZGLCB3ZSBkbyB0aGUgd2hvbGUgcmVsb2NhdGlvbiBvZmYgb2YKKyAgICAgdGhlIEdQRElTUCByYXRoZXIgdGhhbiBhIEdQRElTUF9ISTE2L0dQRElTUF9MTzE2IHBhaXIuICBBbiBvZGQsCisgICAgIHNwYWNlIGNvbnN1bWluZyBiaXQsIHRoYXQsIHNpbmNlIGFsbCB0aGUgaW5mb3JtYXRpb24gd2FzIHByZXNlbnQKKyAgICAgaW4gdGhlIEdQRElTUF9ISTE2IHJlbG9jLiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfR1BESVNQLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBlbGY2NF9hbHBoYV9yZWxvY19ncGRpc3AsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkdQRElTUCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDIxIGJpdCBicmFuY2guICAqLworICBIT1dUTyAoUl9BTFBIQV9CUkFERFIsCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDIxLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MWZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfSElOVCwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkhJTlQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCisgIEhPV1RPIChSX0FMUEhBX1NSRUwxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJTUkVMMTYiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCisgIEhPV1RPIChSX0FMUEhBX1NSRUwzMiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJTUkVMMzIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLworICBIT1dUTyAoUl9BTFBIQV9TUkVMNjQsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDY0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCisJIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCisgIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLworICBIT1dUTyAoUl9BTFBIQV9PUF9QVVNILAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJPUF9QVVNIIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICBTdG9yZSBpdCBpbgorICAgICBhIGJpdGZpZWxkIG9mIHNpemUgcl9zaXplIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiByX29mZnNldC4gICovCisgIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLworICBIT1dUTyAoUl9BTFBIQV9PUF9TVE9SRSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKKyAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCisgIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLworICBIT1dUTyAoUl9BTFBIQV9PUF9QU1VCLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKKyAgICAgZ2l2ZW4gdmFsdWUuICAqLworICAvKiBOb3QgaW1wbGVtZW50ZWQgLS0gaXQncyBkdW1iLiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfT1BfUFJTSElGVCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiT1BfUFJTSElGVCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBHUCB1c2VkIGJ5ICtyX2FkZGVuZCB1bnRpbCB0aGUgbmV4dCBHUFZBTFVFIG9yIHRoZQorICAgICBlbmQgb2YgdGhlIGlucHV0IGJmZC4gICovCisgIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLworICBIT1dUTyAoUl9BTFBIQV9HUFZBTFVFLAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiR1BWQUxVRSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgZGlzcGxhY2VtZW50IGZyb20gR1AgdG8gdGhlIHRhcmdldC4gICovCisgIEhPV1RPIChSX0FMUEhBX0dQUkVMSElHSCwKKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkdQUkVMSElHSCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgdGhlIGRpc3BsYWNlbWVudCBmcm9tIEdQIHRvIHRoZSB0YXJnZXQuICAqLworICBIT1dUTyAoUl9BTFBIQV9HUFJFTExPVywKKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJHUFJFTExPVyIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDE2LWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgR1AgdG8gdGhlIHRhcmdldC4gICovCisgIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfSU1NRURfR1BfMTYsCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJJTU1FRF9HUF8xNiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBHUCB0byB0aGUgdGFyZ2V0OyB0aGUKKyAgICAgbG93IGJpdHMgYXJlIHN1cHBsaWVkIGluIHRoZSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLworICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCisgIEhPV1RPIChSX0FMUEhBX0lNTUVEX0dQX0hJMzIsCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJJTU1FRF9HUF9ISTMyIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGUgaGlnaCBiaXRzIG9mIGEgMzItYml0IGRpc3BsYWNlbWVudCB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUKKyAgICAgY3VycmVudCBzZWN0aW9uICh0aGUgcmVsb2NhdGlvbiB0YXJnZXQgaXMgaWdub3JlZCk7IHRoZSBsb3cgYml0cyBhcmUgCisgICAgIHN1cHBsaWVkIGluIHRoZSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLworICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCisgIEhPV1RPIChSX0FMUEhBX0lNTUVEX1NDTl9ISTMyLAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSU1NRURfU0NOX0hJMzIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIHByZXZpb3VzIGJyLCBic3IsIGpzcgorICAgICBvciBqbXAgaW5zbiAoYXMgdGFnZ2VkIGJ5IGEgQlJBRERSIG9yIEhJTlQgcmVsb2MpIHRvIHRoZSB0YXJnZXQ7IHRoZQorICAgICBsb3cgYml0cyBhcmUgc3VwcGxpZWQgYnkgc3Vic2VxdWVudCBSX0FMUEhBX0lNTUVEX0xPMzIgcmVsb2NzLiAgKi8KKyAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLworICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9CUl9ISTMyLAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSU1NRURfQlJfSEkzMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogVGhlIGxvdyAxNiBiaXRzIG9mIGEgZGlzcGxhY2VtZW50IGNhbGN1bGF0ZWQgaW4gYSBwcmV2aW91cyBISTMyIHJlbG9jLiAgKi8KKyAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLworICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9MTzMyLAorCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSU1NRURfTE8zMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTWlzYyBFTEYgcmVsb2NhdGlvbnMuICovCisKKyAgLyogQSBkeW5hbWljIHJlbG9jYXRpb24gdG8gY29weSB0aGUgdGFyZ2V0IGludG8gb3VyIC5keW5ic3Mgc2VjdGlvbi4gICovCisgIC8qIE5vdCBnZW5lcmF0ZWQsIGFzIGFsbCBBbHBoYSBvYmplY3RzIHVzZSBQSUMsIHNvIGl0IGlzIG5vdCBuZWVkZWQuICBJdAorICAgICBpcyBwcmVzZW50IGJlY2F1c2UgZXZlcnkgb3RoZXIgRUxGIGhhcyBvbmUsIGJ1dCBzaG91bGQgbm90IGJlIHVzZWQKKyAgICAgYmVjYXVzZSAuZHluYnNzIGlzIGFuIHVnbHkgdGhpbmcuICAqLworICBIT1dUTyAoUl9BTFBIQV9DT1BZLAorCSAwLAorCSAwLAorCSAwLAorCSBmYWxzZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiQ09QWSIsCisJIGZhbHNlLAorCSAwLAorCSAwLAorCSB0cnVlKSwKKworICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYSAuZ290IGVudHJ5LiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfR0xPQl9EQVQsCisJIDAsCisJIDAsCisJIDAsCisJIGZhbHNlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJHTE9CX0RBVCIsCisJIGZhbHNlLAorCSAwLAorCSAwLAorCSB0cnVlKSwKKworICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYSAucGx0IGVudHJ5LiAgKi8KKyAgSE9XVE8gKFJfQUxQSEFfSk1QX1NMT1QsCisJIDAsCisJIDAsCisJIDAsCisJIGZhbHNlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAorCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCisJICJKTVBfU0xPVCIsCisJIGZhbHNlLAorCSAwLAorCSAwLAorCSB0cnVlKSwKKworICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiB0byBhZGQgdGhlIGJhc2Ugb2YgdGhlIERTTyB0byBhIDY0LWJpdCBmaWVsZC4gICovCisgIEhPV1RPIChSX0FMUEhBX1JFTEFUSVZFLAorCSAwLAorCSAwLAorCSAwLAorCSBmYWxzZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAorCSAiUkVMQVRJVkUiLAorCSBmYWxzZSwKKwkgMCwKKwkgMCwKKwkgdHJ1ZSkKK307CisKKy8qIEEgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aGljaCBkb2Vzbid0IGRvIGFueXRoaW5nLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorZWxmNjRfYWxwaGFfcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGlmIChvdXRwdXRfYmZkKQorICAgIHJlbG9jLT5hZGRyZXNzICs9IHNlYy0+b3V0cHV0X29mZnNldDsKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogQSByZWxvY2F0aW9uIGZ1bmN0aW9uIHVzZWQgZm9yIGFuIHVuc3VwcG9ydGVkIHJlbG9jLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorZWxmNjRfYWxwaGFfcmVsb2NfYmFkIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGlmIChvdXRwdXRfYmZkKQorICAgIHJlbG9jLT5hZGRyZXNzICs9IHNlYy0+b3V0cHV0X29mZnNldDsKKyAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Cit9CisKKy8qIERvIHRoZSB3b3JrIG9mIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2VsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcCAoYWJmZCwgZ3BkaXNwLCBwX2xkYWgsIHBfbGRhKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF92bWEgZ3BkaXNwOworICAgICBiZmRfYnl0ZSAqcF9sZGFoOworICAgICBiZmRfYnl0ZSAqcF9sZGE7Cit7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQgPSBiZmRfcmVsb2Nfb2s7CisgIGJmZF92bWEgYWRkZW5kOworICB1bnNpZ25lZCBsb25nIGlfbGRhaCwgaV9sZGE7CisKKyAgaV9sZGFoID0gYmZkX2dldF8zMiAoYWJmZCwgcF9sZGFoKTsKKyAgaV9sZGEgPSBiZmRfZ2V0XzMyIChhYmZkLCBwX2xkYSk7CisKKyAgLyogQ29tcGxhaW4gaWYgdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IGNvcnJlY3QuICAqLworICBpZiAoKChpX2xkYWggPj4gMjYpICYgMHgzZikgIT0gMHgwOQorICAgICAgfHwgKChpX2xkYSA+PiAyNikgJiAweDNmKSAhPSAweDA4KQorICAgIHJldCA9IGJmZF9yZWxvY19kYW5nZXJvdXM7CisKKyAgLyogRXh0cmFjdCB0aGUgdXNlci1zdXBwbGllZCBvZmZzZXQsIG1pcnJvcmluZyB0aGUgc2lnbiBleHRlbnNpb25zCisgICAgIHRoYXQgdGhlIGluc3RydWN0aW9ucyBwZXJmb3JtLiAgKi8KKyAgYWRkZW5kID0gKChpX2xkYWggJiAweGZmZmYpIDw8IDE2KSB8IChpX2xkYSAmIDB4ZmZmZik7CisgIGFkZGVuZCA9IChhZGRlbmQgXiAweDgwMDA4MDAwKSAtIDB4ODAwMDgwMDA7CisKKyAgZ3BkaXNwICs9IGFkZGVuZDsKKworICBpZiAoKGJmZF9zaWduZWRfdm1hKSBncGRpc3AgPCAtKGJmZF9zaWduZWRfdm1hKSAweDgwMDAwMDAwCisgICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIGdwZGlzcCA+PSAoYmZkX3NpZ25lZF92bWEpIDB4N2ZmZjgwMDApCisgICAgcmV0ID0gYmZkX3JlbG9jX292ZXJmbG93OworCisgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBzaWduIGV4dGVuc2lvbiBhZ2Fpbi4gICovCisgIGlfbGRhaCA9ICgoaV9sZGFoICYgMHhmZmZmMDAwMCkKKwkgICAgfCAoKChncGRpc3AgPj4gMTYpICsgKChncGRpc3AgPj4gMTUpICYgMSkpICYgMHhmZmZmKSk7CisgIGlfbGRhID0gKGlfbGRhICYgMHhmZmZmMDAwMCkgfCAoZ3BkaXNwICYgMHhmZmZmKTsKKworICBiZmRfcHV0XzMyIChhYmZkLCBpX2xkYWgsIHBfbGRhaCk7CisgIGJmZF9wdXRfMzIgKGFiZmQsIGlfbGRhLCBwX2xkYSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhlIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHRoZSBHUERJU1AgcmVsb2MuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitlbGY2NF9hbHBoYV9yZWxvY19ncGRpc3AgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW0sIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkgIG91dHB1dF9iZmQsIGVycl9tc2cpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJfbXNnOworeworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OworICBiZmRfdm1hIGdwLCByZWxvY2F0aW9uOworICBiZmRfYnl0ZSAqcF9sZGFoLCAqcF9sZGE7CisKKyAgLyogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgbm90IGRvaW5nIGEgZmluYWwgbGluay4gICovCisgIGlmIChvdXRwdXRfYmZkKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgfHwKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgcmVsb2NfZW50cnktPmFkZGVuZCA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgLyogVGhlIGdwIHVzZWQgaW4gdGhlIHBvcnRpb24gb2YgdGhlIG91dHB1dCBvYmplY3QgdG8gd2hpY2ggdGhpcworICAgICBpbnB1dCBvYmplY3QgYmVsb25ncyBpcyBjYWNoZWQgb24gdGhlIGlucHV0IGJmZC4gICovCisgIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGFiZmQpOworCisgIHJlbG9jYXRpb24gPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisKKyAgcF9sZGFoID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgcF9sZGEgPSBwX2xkYWggKyByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIHJldCA9IGVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcCAoYWJmZCwgZ3AgLSByZWxvY2F0aW9uLCBwX2xkYWgsIHBfbGRhKTsKKworICAvKiBDb21wbGFpbiBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgY29ycmVjdC4gICovCisgIGlmIChyZXQgPT0gYmZkX3JlbG9jX2Rhbmdlcm91cykKKyAgICAqZXJyX21zZyA9IF8oIkdQRElTUCByZWxvY2F0aW9uIGRpZCBub3QgZmluZCBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zIik7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQSBtYXBwaW5nIGZyb20gQkZEIHJlbG9jIHR5cGVzIHRvIEFscGhhIEVMRiByZWxvYyB0eXBlcy4gICovCisKK3N0cnVjdCBlbGZfcmVsb2NfbWFwCit7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICBpbnQgZWxmX3JlbG9jX3ZhbDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBlbGY2NF9hbHBoYV9yZWxvY19tYXBbXSA9Cit7CisgIHtCRkRfUkVMT0NfTk9ORSwJCVJfQUxQSEFfTk9ORX0sCisgIHtCRkRfUkVMT0NfMzIsCQlSX0FMUEhBX1JFRkxPTkd9LAorICB7QkZEX1JFTE9DXzY0LAkJUl9BTFBIQV9SRUZRVUFEfSwKKyAge0JGRF9SRUxPQ19DVE9SLAkJUl9BTFBIQV9SRUZRVUFEfSwKKyAge0JGRF9SRUxPQ19HUFJFTDMyLAkJUl9BTFBIQV9HUFJFTDMyfSwKKyAge0JGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCwJUl9BTFBIQV9MSVRFUkFMfSwKKyAge0JGRF9SRUxPQ19BTFBIQV9MSVRVU0UsCVJfQUxQSEFfTElUVVNFfSwKKyAge0JGRF9SRUxPQ19BTFBIQV9HUERJU1AsCVJfQUxQSEFfR1BESVNQfSwKKyAge0JGRF9SRUxPQ18yM19QQ1JFTF9TMiwJUl9BTFBIQV9CUkFERFJ9LAorICB7QkZEX1JFTE9DX0FMUEhBX0hJTlQsCVJfQUxQSEFfSElOVH0sCisgIHtCRkRfUkVMT0NfMTZfUENSRUwsCQlSX0FMUEhBX1NSRUwxNn0sCisgIHtCRkRfUkVMT0NfMzJfUENSRUwsCQlSX0FMUEhBX1NSRUwzMn0sCisgIHtCRkRfUkVMT0NfNjRfUENSRUwsCQlSX0FMUEhBX1NSRUw2NH0sCit9OworCisvKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBIT1dUTyBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitlbGY2NF9hbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwICppLCAqZTsKKyAgaSA9IGUgPSBlbGY2NF9hbHBoYV9yZWxvY19tYXA7CisgIGUgKz0gc2l6ZW9mIChlbGY2NF9hbHBoYV9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7CisgIGZvciAoOyBpICE9IGU7ICsraSkKKyAgICB7CisgICAgICBpZiAoaS0+YmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQorCXJldHVybiAmZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbaS0+ZWxmX3JlbG9jX3ZhbF07CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogR2l2ZW4gYW4gQWxwaGEgRUxGIHJlbG9jIHR5cGUsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgdm9pZAorZWxmNjRfYWxwaGFfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICpkc3Q7Cit7CisgIHVuc2lnbmVkIHJfdHlwZTsKKworICByX3R5cGUgPSBFTEY2NF9SX1RZUEUoZHN0LT5yX2luZm8pOworICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0FMUEhBX21heCk7CisgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKK30KKwwKKy8qIFRoZXNlIGZ1bmN0aW9ucyBkbyByZWxheGF0aW9uIGZvciBBbHBoYSBFTEYuIAorCisgICBDdXJyZW50bHkgSSdtIG9ubHkgaGFuZGxpbmcgd2hhdCBJIGNhbiBkbyB3aXRoIGV4aXN0aW5nIGNvbXBpbGVyCisgICBhbmQgYXNzZW1ibGVyIHN1cHBvcnQsIHdoaWNoIG1lYW5zIG5vIGluc3RydWN0aW9ucyBhcmUgcmVtb3ZlZCwKKyAgIHRob3VnaCBzb21lIG1heSBiZSBub3BwZWQuICBBdCB0aGlzIHRpbWUgR0NDIGRvZXMgbm90IGVtaXQgZW5vdWdoCisgICBpbmZvcm1hdGlvbiB0byBkbyBhbGwgb2YgdGhlIHJlbGF4aW5nIHRoYXQgaXMgcG9zc2libGUuICBJdCB3aWxsCisgICB0YWtlIHNvbWUgbm90IHNtYWxsIGFtb3VudCBvZiB3b3JrIGZvciB0aGF0IHRvIGhhcHBlbi4KKworICAgVGhlcmUgYXJlIGEgY291cGxlIG9mIGludGVyZXN0aW5nIHBhcGVycyB0aGF0IEkgb25jZSByZWFkIG9uIHRoaXMKKyAgIHN1YmplY3QsIHRoYXQgSSBjYW5ub3QgZmluZCByZWZlcmVuY2VzIHRvIGF0IHRoZSBtb21lbnQsIHRoYXQKKyAgIHJlbGF0ZWQgdG8gQWxwaGEgaW4gcGFydGljdWxhci4gIFRoZXkgYXJlIGJ5IERhdmlkIFdhbGwsIHRoZW4gb2YKKyAgIERFQyBXUkwuICAqLworCisjZGVmaW5lIE9QX0xEQQkJMHgwOAorI2RlZmluZSBPUF9MREFICQkweDA5CisjZGVmaW5lIElOU05fSlNSCTB4NjgwMDQwMDAKKyNkZWZpbmUgSU5TTl9KU1JfTUFTSwkweGZjMDBjMDAwCisjZGVmaW5lIE9QX0xEUQkJMHgyOQorI2RlZmluZSBPUF9CUgkJMHgzMAorI2RlZmluZSBPUF9CU1IJCTB4MzQKKyNkZWZpbmUgSU5TTl9VTk9QCTB4MmZlMDAwMDAKKworc3RydWN0IGFscGhhX3JlbGF4X2luZm8KK3sKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqc2VjOworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MsICpyZWxlbmQ7CisgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgIGJvb2xlYW4gY2hhbmdlZF9jb250ZW50czsKKyAgYm9vbGVhbiBjaGFuZ2VkX3JlbG9jczsKKyAgYmZkX3ZtYSBncDsKKyAgYmZkICpnb3RvYmo7CisgIGFzZWN0aW9uICp0c2VjOworICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKKyAgdW5zaWduZWQgY2hhciBvdGhlcjsKK307CisKK3N0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqIGVsZjY0X2FscGhhX3JlbGF4X3dpdGhfbGl0dXNlCisgIFBBUkFNUygoc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm8sIGJmZF92bWEgc3ltdmFsLCAKKyAgICAgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxlbmQpKTsKKworc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UKKyAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwsIAorICAgICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsKSk7CisKK3N0YXRpYyBiZmRfdm1hIGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsCisgIFBBUkFNUygoc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm8sIGJmZF92bWEgc3ltdmFsKSk7CisKK3N0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24KKyAgUEFSQU1TKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCisJICBib29sZWFuICphZ2FpbikpOworCitzdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKgorZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMgKHJlbCwgcmVsZW5kLCBvZmZzZXQsIHR5cGUpCisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBpbnQgdHlwZTsKK3sKKyAgd2hpbGUgKHJlbCA8IHJlbGVuZCkKKyAgICB7CisgICAgICBpZiAocmVsLT5yX29mZnNldCA9PSBvZmZzZXQgJiYgRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gdHlwZSkKKwlyZXR1cm4gcmVsOworICAgICAgKytyZWw7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICoKK2VsZjY0X2FscGhhX3JlbGF4X3dpdGhfbGl0dXNlIChpbmZvLCBzeW12YWwsIGlyZWwsIGlyZWxlbmQpCisgICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOworICAgICBiZmRfdm1hIHN5bXZhbDsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOworeworICBFbGZfSW50ZXJuYWxfUmVsYSAqdXJlbDsKKyAgaW50IGZsYWdzLCBjb3VudCwgaTsKKyAgYmZkX3NpZ25lZF92bWEgZGlzcDsKKyAgYm9vbGVhbiBmaXRzMTY7CisgIGJvb2xlYW4gZml0czMyOworICBib29sZWFuIGxpdF9yZXVzZWQgPSBmYWxzZTsKKyAgYm9vbGVhbiBhbGxfb3B0aW1pemVkID0gdHJ1ZTsKKyAgdW5zaWduZWQgaW50IGxpdF9pbnNuOworCisgIGxpdF9pbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7CisgIGlmIChsaXRfaW5zbiA+PiAyNiAhPSBPUF9MRFEpCisgICAgeworICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQorICAgICAgICgiJXM6ICVzKzB4JWx4OiB3YXJuaW5nOiBMSVRFUkFMIHJlbG9jYXRpb24gYWdhaW5zdCB1bmV4cGVjdGVkIGluc24iLAorCWJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpLCBpbmZvLT5zZWMtPm5hbWUsCisJKHVuc2lnbmVkIGxvbmcpaXJlbC0+cl9vZmZzZXQpKTsKKyAgICAgIHJldHVybiBpcmVsOworICAgIH0KKworICAvKiBTdW1tYXJpemUgaG93IHRoaXMgcGFydGljdWxhciBMSVRFUkFMIGlzIHVzZWQuICAqLworICBmb3IgKHVyZWwgPSBpcmVsKzEsIGZsYWdzID0gY291bnQgPSAwOyB1cmVsIDwgaXJlbGVuZDsgKyt1cmVsLCArK2NvdW50KQorICAgIHsKKyAgICAgIGlmIChFTEY2NF9SX1RZUEUgKHVyZWwtPnJfaW5mbykgIT0gUl9BTFBIQV9MSVRVU0UpCisJYnJlYWs7CisgICAgICBpZiAodXJlbC0+cl9hZGRlbmQgPj0gMCAmJiB1cmVsLT5yX2FkZGVuZCA8PSAzKQorCWZsYWdzIHw9IDEgPDwgdXJlbC0+cl9hZGRlbmQ7CisgICAgfQorCisgIC8qIEEgbGl0dGxlIHByZXBhcmF0aW9uIGZvciB0aGUgbG9vcC4uLiAqLworICBkaXNwID0gc3ltdmFsIC0gaW5mby0+Z3A7CisgIGZpdHMxNiA9IChkaXNwID49IC0oYmZkX3NpZ25lZF92bWEpMHg4MDAwICYmIGRpc3AgPCAweDgwMDApOworICBmaXRzMzIgPSAoZGlzcCA+PSAtKGJmZF9zaWduZWRfdm1hKTB4ODAwMDAwMDAgJiYgZGlzcCA8IDB4N2ZmZjgwMDApOworCisgIGZvciAodXJlbCA9IGlyZWwrMSwgaSA9IDA7IGkgPCBjb3VudDsgKytpLCArK3VyZWwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGluc247CisgICAgICBpbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7CisKKyAgICAgIHN3aXRjaCAodXJlbC0+cl9hZGRlbmQpCisJeworCWRlZmF1bHQ6IC8qIDAgPSBBRERSRVNTIEZPUk1BVCAqLworCSAgLyogVGhpcyB0eXBlIGlzIHJlYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgdG8gbm90ZSB0aGF0IGFsbAorCSAgICAgdXNlcyBjYW5ub3QgYmUgb3B0aW1pemVkLCBidXQgdG8gc3RpbGwgYWxsb3cgc29tZS4gICovCisJICBhbGxfb3B0aW1pemVkID0gZmFsc2U7CisJICBicmVhazsKKworCWNhc2UgMTogLyogTUVNIEZPUk1BVCAqLworCSAgLyogV2UgY2FuIGFsd2F5cyBvcHRpbWl6ZSAxNi1iaXQgZGlzcGxhY2VtZW50cy4gICovCisJICBpZiAoZml0czE2KQorCSAgICB7CisJICAgICAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGUgaW5zbiBmb3IgbWVtIGZvcm1hdCB3aXRoCisJCSB6ZXJvIGFkZGVuZC4gICovCisKKwkgICAgICAvKiBUYWtlIHRoZSBvcCBjb2RlIGFuZCBkZXN0IGZyb20gdGhpcyBpbnNuLCB0YWtlIHRoZSBiYXNlIAorCQkgcmVnaXN0ZXIgZnJvbSB0aGUgbGl0ZXJhbCBpbnNuLiAgTGVhdmUgdGhlIG9mZnNldCBhbG9uZS4gICovCisJICAgICAgaW5zbiA9IChpbnNuICYgMHhmZmUwMDAwMCkgfCAobGl0X2luc24gJiAweDAwMWYwMDAwKTsKKwkgICAgICB1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkgICBSX0FMUEhBX0dQUkVMTE9XKTsKKwkgICAgICB1cmVsLT5yX2FkZGVuZCA9IGlyZWwtPnJfYWRkZW5kOworCSAgICAgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKKworCSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOworCSAgICAgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOworCSAgICB9CisKKwkgIC8qIElmIGFsbCBtZW0rYnl0ZSwgd2UgY2FuIG9wdGltaXplIDMyLWJpdCBtZW0gZGlzcGxhY2VtZW50cy4gICovCisJICBlbHNlIGlmIChmaXRzMzIgJiYgIShmbGFncyAmIH42KSkKKwkgICAgeworCSAgICAgIC8qIEZJWE1FOiBzYW5pdHkgY2hlY2sgdGhhdCBsaXQgaW5zbiBSYSBpcyBtZW0gaW5zbiBSYiwgYW5kCisJCSB0aGF0IG1lbV9pbnNuIGRpc3AgaXMgemVyby4gICovCisKKwkgICAgICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkgICBSX0FMUEhBX0dQUkVMSElHSCk7CisJICAgICAgbGl0X2luc24gPSAoT1BfTERBSCA8PCAyNikgfCAobGl0X2luc24gJiAweDAzZmYwMDAwKTsKKwkgICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBsaXRfaW5zbiwKKwkJCSAgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7CisJICAgICAgbGl0X3JldXNlZCA9IHRydWU7CisJICAgICAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7CisKKwkgICAgICB1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCQkgICBSX0FMUEhBX0dQUkVMTE9XKTsKKwkgICAgICB1cmVsLT5yX2FkZGVuZCA9IGlyZWwtPnJfYWRkZW5kOworCSAgICAgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhbGxfb3B0aW1pemVkID0gZmFsc2U7CisJICBicmVhazsKKworCWNhc2UgMjogLyogQllURSBPRkZTRVQgRk9STUFUICovCisJICAvKiBXZSBjYW4gYWx3YXlzIG9wdGltaXplIGJ5dGUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworCSAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGUgaW5zbiBmb3IgYnl0ZSBvcC4gIENoZWNrIHRoYXQgdGhlCisJICAgICBsaXRlcmFsIGRlc3QgcmVnIGlzIGluZGVlZCBSYiBpbiB0aGUgYnl0ZSBpbnNuLiAgKi8KKworCSAgaW5zbiA9IChpbnNuICYgfjB4MDAxZmYwMDApIHwgKChzeW12YWwgJiA3KSA8PCAxMykgfCAweDEwMDA7CisKKwkgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKKwkgIHVyZWwtPnJfYWRkZW5kID0gMDsKKwkgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKKworCSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7CisJICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSAzOiAvKiBDQUxMIEZPUk1BVCAqLworCSAgeworCSAgICAvKiBJZiBub3QgemVybywgcGxhY2UgdG8ganVtcCB3aXRob3V0IG5lZWRpbmcgcHYuICAqLworCSAgICBiZmRfdm1hIG9wdGRlc3QgPSBlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCAoaW5mbywgc3ltdmFsKTsKKwkgICAgYmZkX3ZtYSBvcmcgPSAoaW5mby0+c2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICArIGluZm8tPnNlYy0+b3V0cHV0X29mZnNldAorCQkJICAgKyB1cmVsLT5yX29mZnNldCArIDQpOworCSAgICBiZmRfc2lnbmVkX3ZtYSBvZGlzcDsKKworCSAgICBvZGlzcCA9IChvcHRkZXN0ID8gb3B0ZGVzdCA6IHN5bXZhbCkgLSBvcmc7CisJICAgIGlmIChvZGlzcCA+PSAtMHg0MDAwMDAgJiYgb2Rpc3AgPCAweDQwMDAwMCkKKwkgICAgICB7CisJCUVsZl9JbnRlcm5hbF9SZWxhICp4cmVsOworCisJCS8qIFByZXNlcnZlIGJyYW5jaCBwcmVkaWN0aW9uIGNhbGwgc3RhY2sgd2hlbiBwb3NzaWJsZS4gKi8KKwkJaWYgKChpbnNuICYgSU5TTl9KU1JfTUFTSykgPT0gSU5TTl9KU1IpCisJCSAgaW5zbiA9IChPUF9CU1IgPDwgMjYpIHwgKGluc24gJiAweDAzZTAwMDAwKTsKKwkJZWxzZQorCQkgIGluc24gPSAoT1BfQlIgPDwgMjYpIHwgKGluc24gJiAweDAzZTAwMDAwKTsKKwkJICAKKwkJdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKKwkJCQkJICAgICBSX0FMUEhBX0JSQUREUik7CisJCXVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7CisKKwkJaWYgKG9wdGRlc3QpCisJCSAgdXJlbC0+cl9hZGRlbmQgKz0gb3B0ZGVzdCAtIHN5bXZhbDsKKwkJZWxzZQorCQkgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKKworCQliZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKKworCQkvKiBLaWxsIGFueSBISU5UIHJlbG9jIHRoYXQgbWlnaHQgZXhpc3QgZm9yIHRoaXMgaW5zbi4gICovCisJCXhyZWwgPSAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMKKwkJCShpbmZvLT5yZWxvY3MsIGluZm8tPnJlbGVuZCwgdXJlbC0+cl9vZmZzZXQsIAorCQkJIFJfQUxQSEFfSElOVCkpOworCQlpZiAoeHJlbCkKKwkJICB4cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfQUxQSEFfTk9ORSk7CisKKwkJaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7CisJCWluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBhbGxfb3B0aW1pemVkID0gZmFsc2U7CisKKwkgICAgLyogPz8/IElmIHRhcmdldCBncCA9PSBjdXJyZW50IGdwIHdlIGNhbiBlbGltaW5hdGUgdGhlIGdwIHJlbG9hZC4KKwkgICAgICAgVGhpcyBkb2VzIGRlcGVuZCBvbiBldmVyeSBwbGFjZSBhIGdwIGNvdWxkIGJlIHJlbG9hZGVkIHdpbGwKKwkgICAgICAgYmUsIHdoaWNoIGN1cnJlbnRseSBoYXBwZW5zIGZvciBhbGwgY29kZSBwcm9kdWNlZCBieSBnY2MsIGJ1dAorCSAgICAgICBub3QgbmVjZXNzYXJpbHkgYnkgaGFuZC1jb2RlZCBhc3NlbWJseSwgb3IgaWYgc2libGluZyBjYWxscworCSAgICAgICBhcmUgZW5hYmxlZCBpbiBnY2MuIAorCisJICAgICAgIFBlcmhhcHMgY29uZGl0aW9uYWxpemUgdGhpcyBvbiBhIGZsYWcgYmVpbmcgc2V0IGluIHRoZSB0YXJnZXQKKwkgICAgICAgb2JqZWN0IGZpbGUncyBoZWFkZXIsIGFuZCBoYXZlIGdjYyBzZXQgaXQ/ICAqLworCSAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBJZiBhbGwgY2FzZXMgd2VyZSBvcHRpbWl6ZWQsIHdlIGNhbiByZWR1Y2UgdGhlIHVzZSBjb3VudCBvbiB0aGlzCisgICAgIGdvdCBlbnRyeSBieSBvbmUsIHBvc3NpYmx5IGVsaW1pbmF0aW5nIGl0LiAgKi8KKyAgaWYgKGFsbF9vcHRpbWl6ZWQpCisgICAgeworICAgICAgaW5mby0+Z290ZW50LT51c2VfY291bnQgLT0gMTsKKyAgICAgIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT50b3RhbF9nb3RfZW50cmllcyAtPSAxOworICAgICAgaWYgKCFpbmZvLT5oKQorCWFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT5uX2xvY2FsX2dvdF9lbnRyaWVzIC09IDE7CisKKyAgICAgIC8qIElmIHRoZSBsaXRlcmFsIGluc3RydWN0aW9uIGlzIG5vIGxvbmdlciBuZWVkZWQgKGl0IG1heSBoYXZlIGJlZW4KKwkgcmV1c2VkLiAgV2UgY2FuIGVsaW1pbmF0ZSBpdC4KKwkgPz8/IEZvciBub3csIEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggY29tcGFjdGluZyB0aGUgc2VjdGlvbiwKKwkgc28ganVzdCBub3AgaXQgb3V0LiAgKi8KKyAgICAgIGlmICghbGl0X3JldXNlZCkKKwl7CisJICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfQUxQSEFfTk9ORSk7CisJICBpbmZvLT5jaGFuZ2VkX3JlbG9jcyA9IHRydWU7CisKKwkgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIElOU05fVU5PUCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7CisJICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKKwl9CisgICAgfQorCisgIHJldHVybiBpcmVsICsgY291bnQ7Cit9CisKK3N0YXRpYyBiZmRfdm1hCitlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCAoaW5mbywgc3ltdmFsKQorICAgICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbzsKKyAgICAgYmZkX3ZtYSBzeW12YWw7Cit7CisgIC8qIElmIHRoZSBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgZ3AsIGFuZCB3ZSBjYW4gaWRlbnRpZnkgdGhhdCB0aGUKKyAgICAgZnVuY3Rpb24gZG9lcyBub3QgdXNlIGl0cyBmdW5jdGlvbiBwb2ludGVyLCB3ZSBjYW4gZWxpbWluYXRlIHRoZQorICAgICBhZGRyZXNzIGxvYWQuICAqLworCisgIC8qIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIE5PUFYsIHdlIGFyZSBiZWluZyB0b2xkIHRoZSBmdW5jdGlvbiBuZXZlcgorICAgICBuZWVkcyBpdHMgcHJvY2VkdXJlIHZhbHVlLiAgKi8KKyAgaWYgKGluZm8tPm90aGVyID09IFNUT19BTFBIQV9OT1BWKQorICAgIHJldHVybiBzeW12YWw7CisKKyAgLyogSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgU1REX0dQLCB3ZSBhcmUgYmVpbmcgdG9sZCB0aGUgZnVuY3Rpb24gZG9lcworICAgICBhIG5vcm1hbCBsZGdwIGluIHRoZSBmaXJzdCB0d28gd29yZHMuICAqLyAKKyAgZWxzZSBpZiAoaW5mby0+b3RoZXIgPT0gU1RPX0FMUEhBX1NURF9HUExPQUQpCisgICAgOworCisgIC8qIE90aGVyd2lzZSwgd2UgbWF5IGJlIGFibGUgdG8gaWRlbnRpZnkgYSBHUCBsb2FkIGluIHRoZSBmaXJzdCB0d28KKyAgICAgd29yZHMsIHdoaWNoIHdlIGNhbiB0aGVuIHNraXAuICAqLworICBlbHNlIAorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICp0c2VjX3JlbG9jcywgKnRzZWNfcmVsZW5kLCAqdHNlY19mcmVlLCAqZ3BkaXNwOworICAgICAgYmZkX3ZtYSBvZnM7CisKKyAgICAgIC8qIExvYWQgdGhlIHJlbG9jYXRpb25zIGZyb20gdGhlIHNlY3Rpb24gdGhhdCB0aGUgdGFyZ2V0IHN5bWJvbCBpcyBpbi4gKi8KKyAgICAgIGlmIChpbmZvLT5zZWMgPT0gaW5mby0+dHNlYykKKwl7CisJICB0c2VjX3JlbG9jcyA9IGluZm8tPnJlbG9jczsKKwkgIHRzZWNfcmVsZW5kID0gaW5mby0+cmVsZW5kOworCSAgdHNlY19mcmVlID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeworCSAgdHNlY19yZWxvY3MgPSAoX2JmZF9lbGY2NF9saW5rX3JlYWRfcmVsb2NzCisJCSAgICAgICAgIChpbmZvLT5hYmZkLCBpbmZvLT50c2VjLCAoUFRSKSBOVUxMLAorCQkJIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAorCQkJIGluZm8tPmxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKKwkgIGlmICh0c2VjX3JlbG9jcyA9PSBOVUxMKQorCSAgICByZXR1cm4gMDsKKwkgIHRzZWNfcmVsZW5kID0gdHNlY19yZWxvY3MgKyBpbmZvLT50c2VjLT5yZWxvY19jb3VudDsKKwkgIHRzZWNfZnJlZSA9IChpbmZvLT5saW5rX2luZm8tPmtlZXBfbWVtb3J5ID8gTlVMTCA6IHRzZWNfcmVsb2NzKTsKKwl9CisKKyAgICAgIC8qIFJlY292ZXIgdGhlIHN5bWJvbCdzIG9mZnNldCB3aXRoaW4gdGhlIHNlY3Rpb24uICAqLworICAgICAgb2ZzID0gKHN5bXZhbCAtIGluZm8tPnRzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkgICAgIC0gaW5mby0+dHNlYy0+b3V0cHV0X29mZnNldCk7CisgIAorICAgICAgLyogTG9vayBmb3IgYSBHUERJU1AgcmVsb2MuICAqLworICAgICAgZ3BkaXNwID0gKGVsZjY0X2FscGhhX2ZpbmRfcmVsb2NfYXRfb2ZzCisJCSh0c2VjX3JlbG9jcywgdHNlY19yZWxlbmQsIG9mcywgUl9BTFBIQV9HUERJU1ApKTsKKworICAgICAgaWYgKCFncGRpc3AgfHwgZ3BkaXNwLT5yX2FkZGVuZCAhPSA0KQorCXsKKwkgIGlmICh0c2VjX2ZyZWUpCisJICAgIGZyZWUgKHRzZWNfZnJlZSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBpZiAodHNlY19mcmVlKQorICAgICAgICBmcmVlICh0c2VjX2ZyZWUpOworICAgIH0KKworICAvKiBXZSd2ZSBub3cgZGV0ZXJtaW5lZCB0aGF0IHdlIGNhbiBza2lwIGFuIGluaXRpYWwgZ3AgbG9hZC4gIFZlcmlmeSAKKyAgICAgdGhhdCB0aGUgY2FsbCBhbmQgdGhlIHRhcmdldCB1c2UgdGhlIHNhbWUgZ3AuICAgKi8KKyAgaWYgKGluZm8tPmxpbmtfaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBpbmZvLT50c2VjLT5vd25lci0+eHZlYworICAgICAgfHwgaW5mby0+Z290b2JqICE9IGFscGhhX2VsZl90ZGF0YSAoaW5mby0+dHNlYy0+b3duZXIpLT5nb3RvYmopCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIHN5bXZhbCArIDg7Cit9CisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSAoaW5mbywgc3ltdmFsLCBpcmVsKQorICAgICBzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbzsKKyAgICAgYmZkX3ZtYSBzeW12YWw7CisgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsOworeworICB1bnNpZ25lZCBpbnQgaW5zbjsKKyAgYmZkX3NpZ25lZF92bWEgZGlzcDsKKworICAvKiBHZXQgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgaW5zbiA9IGJmZF9nZXRfMzIgKGluZm8tPmFiZmQsIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOworCisgIGlmIChpbnNuID4+IDI2ICE9IE9QX0xEUSkKKyAgICB7CisgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisgICAgICAgKCIlczogJXMrMHglbHg6IHdhcm5pbmc6IExJVEVSQUwgcmVsb2NhdGlvbiBhZ2FpbnN0IHVuZXhwZWN0ZWQgaW5zbiIsCisJYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIGluZm8tPnNlYy0+bmFtZSwKKwkodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBTbyB3ZSBhcmVuJ3QgdG9sZCBtdWNoLiAgRG8gd2hhdCB3ZSBjYW4gd2l0aCB0aGUgYWRkcmVzcyBsb2FkIGFuZAorICAgICBmYWtlIHRoZSByZXN0LiAgQWxsIG9mIHRoZSBvcHRpbWl6YXRpb25zIGhlcmUgcmVxdWlyZSB0aGF0IHRoZQorICAgICBvZmZzZXQgZnJvbSB0aGUgR1AgZml0IGluIDE2IGJpdHMuICAqLworCisgIGRpc3AgPSBzeW12YWwgLSBpbmZvLT5ncDsKKyAgaWYgKGRpc3AgPCAtMHg4MDAwIHx8IGRpc3AgPj0gMHg4MDAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIE9uIHRoZSBMSVRFUkFMIGluc3RydWN0aW9uIGl0c2VsZiwgY29uc2lkZXIgZXhjaGFuZ2luZworICAgICBgbGRxIFIsWChncCknIGZvciBgbGRhIFIsWShncCknLiAgKi8KKworICBpbnNuID0gKE9QX0xEQSA8PCAyNikgfCAoaW5zbiAmIDB4MDNmZjAwMDApOworICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKKyAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7CisKKyAgaXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSwgUl9BTFBIQV9HUFJFTExPVyk7CisgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKKworICAvKiBSZWR1Y2UgdGhlIHVzZSBjb3VudCBvbiB0aGlzIGdvdCBlbnRyeSBieSBvbmUsIHBvc3NpYmx5CisgICAgIGVsaW1pbmF0aW5nIGl0LiAgKi8KKyAgaW5mby0+Z290ZW50LT51c2VfY291bnQgLT0gMTsKKyAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPnRvdGFsX2dvdF9lbnRyaWVzIC09IDE7CisgIGlmICghaW5mby0+aCkKKyAgICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+bl9sb2NhbF9nb3RfZW50cmllcyAtPSAxOworCisgIC8qID8/PyBTZWFyY2ggZm9yd2FyZCB0aHJvdWdoIHRoaXMgYmFzaWMgYmxvY2sgbG9va2luZyBmb3IgaW5zbnMKKyAgICAgdGhhdCB1c2UgdGhlIHRhcmdldCByZWdpc3Rlci4gIFN0b3AgYWZ0ZXIgYW4gaW5zbiBtb2RpZnlpbmcgdGhlCisgICAgIHJlZ2lzdGVyIGlzIHNlZW4sIG9yIGFmdGVyIGEgYnJhbmNoIG9yIGNhbGwuCisKKyAgICAgQW55IHN1Y2ggbWVtb3J5IGxvYWQgaW5zbiBtYXkgYmUgc3Vic3RpdHV0ZWQgYnkgYSBsb2FkIGRpcmVjdGx5CisgICAgIG9mZiB0aGUgR1AuICBUaGlzIGFsbG93cyB0aGUgbWVtb3J5IGxvYWQgaW5zbiB0byBiZSBpc3N1ZWQgYmVmb3JlCisgICAgIHRoZSBjYWxjdWxhdGVkIEdQIHJlZ2lzdGVyIHdvdWxkIG90aGVyd2lzZSBiZSByZWFkeS4gCisKKyAgICAgQW55IHN1Y2gganNyIGluc24gY2FuIGJlIHJlcGxhY2VkIGJ5IGEgYnNyIGlmIGl0IGlzIGluIHJhbmdlLgorCisgICAgIFRoaXMgd291bGQgbWVhbiB0aGF0IHdlJ2QgaGF2ZSB0byBfYWRkXyByZWxvY2F0aW9ucywgdGhlIHBhaW4gb2YKKyAgICAgd2hpY2ggZ2l2ZXMgb25lIHBhdXNlLiAgKi8KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK2VsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworICAgICBib29sZWFuICphZ2FpbjsKK3sKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7CisgIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKKyAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOworICBFbGY2NF9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOworICBFbGY2NF9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7CisgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7CisgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvIGluZm87CisKKyAgLyogV2UgYXJlIG5vdCBjdXJyZW50bHkgY2hhbmdpbmcgYW55IHNpemVzLCBzbyBvbmx5IG9uZSBwYXNzLiAgKi8KKyAgKmFnYWluID0gZmFsc2U7CisKKyAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAorICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAorICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCisgIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQorICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bG9jYWxfZ290X2VudHJpZXM7CisKKyAgLyogTG9hZCB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoaXMgc2VjdGlvbi4gICovCisgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKKwkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKKwkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOworICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCisgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisKKyAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICBpbmZvLmFiZmQgPSBhYmZkOworICBpbmZvLnNlYyA9IHNlYzsKKyAgaW5mby5saW5rX2luZm8gPSBsaW5rX2luZm87CisgIGluZm8ucmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOworICBpbmZvLnJlbGVuZCA9IGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OworCisgIC8qIEZpbmQgdGhlIEdQIGZvciB0aGlzIG9iamVjdC4gICovCisgIGluZm8uZ290b2JqID0gYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+Z290b2JqOworICBpZiAoaW5mby5nb3RvYmopCisgICAgeworICAgICAgYXNlY3Rpb24gKnNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGluZm8uZ290b2JqKS0+Z290OworICAgICAgaW5mby5ncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChpbmZvLmdvdG9iaik7CisgICAgICBpZiAoaW5mby5ncCA9PSAwKQorCXsKKwkgIGluZm8uZ3AgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAorCQkgICAgICsgMHg4MDAwKTsKKwkgIF9iZmRfc2V0X2dwX3ZhbHVlIChpbmZvLmdvdG9iaiwgaW5mby5ncCk7CisJfQorICAgIH0KKworICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCisgICAgeworICAgICAgYmZkX3ZtYSBzeW12YWw7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07CisgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OworCisgICAgICBpZiAoRUxGNjRfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfQUxQSEFfTElURVJBTCkKKwljb250aW51ZTsKKworICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIGlmIChpbmZvLmNvbnRlbnRzID09IE5VTEwpCisJeworCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCisJICAgIGluZm8uY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOworCSAgICAgIGlmIChpbmZvLmNvbnRlbnRzID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIGZyZWVfY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGluZm8uY29udGVudHMsCisJCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLworICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwl7CisJICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKKwkgICAgZXh0c3ltcyA9IChFbGY2NF9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHRzeW1zID0gKChFbGY2NF9FeHRlcm5hbF9TeW0gKikKKwkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7CisJICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKKwkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCisJCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCisgICAgICBpZiAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KKwkgIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKKwkJCQkgICAgZXh0c3ltcyArIEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAorCQkJCSAgICAmaXN5bSk7CisJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCisJICAgIGluZm8udHNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwkgICAgaW5mby50c2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOworCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQorCSAgICBpbmZvLnRzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQorCSAgICBpbmZvLnRzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCSAgZWxzZSAKKwkgICAgY29udGludWU7CS8qIHdobyBrbm93cy4gKi8KKworCSAgaW5mby5oID0gTlVMTDsKKwkgIGluZm8ub3RoZXIgPSBpc3ltLnN0X290aGVyOworCSAgZ290ZW50ID0gbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0oaXJlbC0+cl9pbmZvKV07CisJICBzeW12YWwgPSBpc3ltLnN0X3ZhbHVlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB1bnNpZ25lZCBsb25nIGluZHg7CisJICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgaW5keCA9IEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pIC0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKwkgIGggPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5keF07CisJICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOworCisJICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCQkgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOworCisJICAvKiBXZSBjYW4ndCBkbyBhbnRoaW5nIHdpdGggdW5kZWZpbmVkIG9yIGR5bmFtaWMgc3ltYm9scy4gICovCisJICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaworCSAgICAgIHx8IGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgbGlua19pbmZvKSkKKwkgICAgY29udGludWU7CisKKwkgIGluZm8uaCA9IGg7CisJICBpbmZvLmdvdGVudCA9IGdvdGVudDsKKwkgIGluZm8udHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworCSAgaW5mby5vdGhlciA9IGgtPnJvb3Qub3RoZXI7CisJICBnb3RlbnQgPSBoLT5nb3RfZW50cmllczsKKwkgIHN5bXZhbCA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZTsKKwl9CisKKyAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIGdvdCBlbnRyeSB0byBiZSB1c2VkIGJ5IHRoaXMgcmVsb2NhdGlvbi4gICovCisgICAgICB3aGlsZSAoZ290ZW50LT5nb3RvYmogIT0gaW5mby5nb3RvYmogfHwgZ290ZW50LT5hZGRlbmQgIT0gaXJlbC0+cl9hZGRlbmQpCisJZ290ZW50ID0gZ290ZW50LT5uZXh0OworICAgICAgaW5mby5nb3RlbnQgPSBnb3RlbnQ7CisKKyAgICAgIHN5bXZhbCArPSBpbmZvLnRzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbmZvLnRzZWMtPm91dHB1dF9vZmZzZXQ7CisgICAgICBzeW12YWwgKz0gaXJlbC0+cl9hZGRlbmQ7CisKKyAgICAgIEJGRF9BU1NFUlQoaW5mby5nb3RlbnQgIT0gTlVMTCk7CisKKyAgICAgIC8qIElmIHRoZXJlIGV4aXN0IExJVFVTRSByZWxvY2F0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3dpbmcsIHRoaXMKKwkgb3BlbnMgdXAgYWxsIHNvcnRzIG9mIGludGVyZXN0aW5nIG9wdGltaXphdGlvbnMsIGJlY2F1c2Ugd2UKKwkgbm93IGtub3cgZXZlcnkgbG9jYXRpb24gdGhhdCB0aGlzIGFkZHJlc3MgbG9hZCBpcyB1c2VkLiAgKi8KKworICAgICAgaWYgKGlyZWwrMSA8IGlyZWxlbmQgJiYgRUxGNjRfUl9UWVBFIChpcmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpCisJeworCSAgaXJlbCA9IGVsZjY0X2FscGhhX3JlbGF4X3dpdGhfbGl0dXNlICgmaW5mbywgc3ltdmFsLCBpcmVsLCBpcmVsZW5kKTsKKwkgIGlmIChpcmVsID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlICgmaW5mbywgc3ltdmFsLCBpcmVsKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICBpZiAoIWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoaW5mby5jaGFuZ2VkX3JlbG9jcykKKyAgICB7CisgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7CisgICAgfQorICBlbHNlIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKKyAgICB9CisKKyAgaWYgKGluZm8uY2hhbmdlZF9jb250ZW50cykKKyAgICB7CisgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGluZm8uY29udGVudHM7CisgICAgfQorICBlbHNlIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKKwlmcmVlIChmcmVlX2NvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gaW5mby5jb250ZW50czsKKwl9CisgICAgfQorCisgIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQorCWZyZWUgKGZyZWVfZXh0c3ltcyk7CisgICAgICBlbHNlCisJeworCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCisJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7CisJfQorICAgIH0KKworICAqYWdhaW4gPSBpbmZvLmNoYW5nZWRfY29udGVudHMgfHwgaW5mby5jaGFuZ2VkX3JlbG9jczsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9yZWxvY3MpOworICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfY29udGVudHMpOworICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCisgICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKKyAgcmV0dXJuIGZhbHNlOworfQorDAorLyogUExUL0dPVCBTdHVmZiAqLworI2RlZmluZSBQTFRfSEVBREVSX1NJWkUgMzIKKyNkZWZpbmUgUExUX0hFQURFUl9XT1JEMQkweGMzNjAwMDAwCS8qIGJyICAgJDI3LC4rNCAgICAgKi8KKyNkZWZpbmUgUExUX0hFQURFUl9XT1JEMgkweGE3N2IwMDBjCS8qIGxkcSAgJDI3LDEyKCQyNykgKi8KKyNkZWZpbmUgUExUX0hFQURFUl9XT1JEMwkweDQ3ZmYwNDFmCS8qIG5vcCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUExUX0hFQURFUl9XT1JENAkweDZiN2IwMDAwCS8qIGptcCAgJDI3LCgkMjcpICAgKi8KKworI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgorI2RlZmluZSBQTFRfRU5UUllfV09SRDEJCTB4YzM4MDAwMDAJLyogYnIgICAkMjgsIHBsdDAgICAqLworI2RlZmluZSBQTFRfRU5UUllfV09SRDIJCTAKKyNkZWZpbmUgUExUX0VOVFJZX1dPUkQzCQkwCisKKyNkZWZpbmUgTUFYX0dPVF9FTlRSSUVTCQkoNjQqMTAyNCAvIDgpCisKKyNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgIi91c3IvbGliL2xkLnNvIgorDAorLyogSGFuZGxlIGFuIEFscGhhIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcworICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4KKyAgIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgU0hGX0FMUEhBX0dQUkVMIGZsYWcsIGJ1dCBJJ20gbm90IHN1cmUKKyAgIGhvdyB0by4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgYXNlY3Rpb24gKm5ld3NlY3Q7CisKKyAgLyogVGhlcmUgb3VnaHQgdG8gYmUgYSBwbGFjZSB0byBrZWVwIEVMRiBiYWNrZW5kIHNwZWNpZmljIGZsYWdzLCBidXQKKyAgICAgYXQgdGhlIG1vbWVudCB0aGVyZSBpc24ndCBvbmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCisgICAgIHNlY3Rpb25zIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQuICBGb3J0dW5hdGVseSwgdGhlIEFCSSBnaXZlcworICAgICBzdWdnZXN0ZWQgbmFtZXMgZm9yIGFsbCB0aGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucywgc28gd2Ugd2lsbAorICAgICBwcm9iYWJseSBnZXQgYXdheSB3aXRoIHRoaXMuICAqLworICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKKyAgICB7CisgICAgY2FzZSBTSFRfQUxQSEFfREVCVUc6CisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisjaWZkZWYgRVJJQ19uZXZlcmRlZgorICAgIGNhc2UgU0hUX0FMUEhBX1JFR0lORk86CisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSAhPSAwCisJICB8fCBoZHItPnNoX3NpemUgIT0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworICBuZXdzZWN0ID0gaGRyLT5iZmRfc2VjdGlvbjsKKworICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9BTFBIQV9ERUJVRykKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsCisJCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCkKKwkJCQkgICAgfCBTRUNfREVCVUdHSU5HKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmZGVmIEVSSUNfbmV2ZXJkZWYKKyAgLyogRm9yIGEgLnJlZ2luZm8gc2VjdGlvbiwgc2V0IHRoZSBncCB2YWx1ZSBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24KKyAgICAgZnJvbSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgV2UgbmVlZCB0aGUgZ3AgdmFsdWUgd2hpbGUKKyAgICAgcHJvY2Vzc2luZyByZWxvY3MsIHNvIHdlIGp1c3QgZ2V0IGl0IG5vdy4gICovCisgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX0FMUEhBX1JFR0lORk8pCisgICAgeworICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7CisgICAgICBFbGY2NF9SZWdJbmZvIHM7CisKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbmV3c2VjdCwgKFBUUikgJmV4dCwKKwkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX3JlZ2luZm9faW4gKGFiZmQsICZleHQsICZzKTsKKyAgICAgIGVsZl9ncCAoYWJmZCkgPSBzLnJpX2dwX3ZhbHVlOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYW4gQWxwaGEgRUxGIHNlY3Rpb24uICBXZSBkbyB0aGlzIGJ5IHRoZQorICAgc2VjdGlvbiBuYW1lLCB3aGljaCBpcyBhIGhhY2ssIGJ1dCBvdWdodCB0byB3b3JrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjY0X2FscGhhX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIEVsZjY0X0ludGVybmFsX1NoZHIgKmhkcjsKKyAgICAgYXNlY3Rpb24gKnNlYzsKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKKworICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyk7CisKKyAgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9BTFBIQV9ERUJVRzsKKyAgICAgIC8qIEluIGEgc2hhcmVkIG9iamVjdCBvbiBJcml4IDUuMywgdGhlIC5tZGVidWcgc2VjdGlvbiBoYXMgYW4KKyAgICAgICAgIGVudHNpemUgb2YgMC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KKyAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwICkKKwloZHItPnNoX2VudHNpemUgPSAwOworICAgICAgZWxzZQorCWhkci0+c2hfZW50c2l6ZSA9IDE7CisgICAgfQorI2lmZGVmIEVSSUNfbmV2ZXJkZWYKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQorICAgIHsKKyAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9BTFBIQV9SRUdJTkZPOworICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYW4KKyAgICAgICAgIGVudHNpemUgb2YgMHgxOC4gIEZJWE1FOiBEb2VzIHRoaXMgbWF0dGVyPyAgKi8KKyAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorCWhkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7CisgICAgICBlbHNlCisJaGRyLT5zaF9lbnRzaXplID0gMTsKKworICAgICAgLyogRm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byB0aGUgY29ycmVjdCB2YWx1ZSwgZXZlbiBpZiB0aGUKKwkgbGlua2VyIHRoaW5rcyBpdCBpcyBsYXJnZXIuICBUaGUgbGluayByb3V0aW5lIGJlbG93IHdpbGwgb25seQorCSB3cml0ZSBvdXQgdGhpcyBtdWNoIGRhdGEgZm9yIC5yZWdpbmZvLiAgKi8KKyAgICAgIGhkci0+c2hfc2l6ZSA9IHNlYy0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5oYXNoIikgPT0gMAorCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5hbWljIikgPT0gMAorCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5zdHIiKSA9PSAwKQorICAgIHsKKyAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDA7CisgICAgICBoZHItPnNoX2luZm8gPSBTSVpFT0ZfQUxQSEFfRFlOU1lNX1NFQ05BTUVTOworICAgIH0KKyNlbmRpZgorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwCisJICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCisJICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwCisJICAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQorICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMUEhBX0dQUkVMOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0CisgICBmaWxlLiAgV2UgdXNlIGl0IHRvIHB1dCAuY29tbSBpdGVtcyBpbiAuc2JzcywgYW5kIG5vdCAuYnNzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKKyAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBiZmRfdm1hICp2YWxwOworeworICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OCisgICAgICAmJiAhaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICAmJiBzeW0tPnN0X3NpemUgPD0gYmZkX2dldF9ncF9zaXplIChhYmZkKSkKKyAgICB7CisgICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gLUcgbm4gYnl0ZXMgYXJlCisJIGF1dG9tYXRpY2FsbHkgcHV0IGludG8gLnNic3MuICAqLworCisgICAgICBhc2VjdGlvbiAqc2NvbW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zY29tbW9uIik7CisKKyAgICAgIGlmIChzY29tbSA9PSBOVUxMKQorCXsKKwkgIHNjb21tID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5zY29tbW9uIik7CisJICBpZiAoc2NvbW0gPT0gTlVMTAorCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNjb21tLCAoU0VDX0FMTE9DCisJCQkJCQkgICAgICAgfCBTRUNfSVNfQ09NTU9OCisJCQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgKnNlY3AgPSBzY29tbTsKKyAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ3JlYXRlIHRoZSAuZ290IHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGFzZWN0aW9uICpzOworCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECisJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUworCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQpKQorICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5nb3QgPSBzOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBDcmVhdGUgYWxsIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqczsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgLyogV2UgbmVlZCB0byBjcmVhdGUgLnBsdCwgLnJlbGEucGx0LCAuZ290LCBhbmQgLnJlbGEuZ290IHNlY3Rpb25zLiAgKi8KKworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAorCQkJCQkgICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJCSAgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECisJCQkJCSAgICB8IFNFQ19DT0RFKSkKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIERlZmluZSB0aGUgc3ltYm9sIF9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAucGx0IHNlY3Rpb24uICAqLworICBoID0gTlVMTDsKKyAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJIChpbmZvLCBhYmZkLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCisJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCisJICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCisJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworCisgIGlmIChpbmZvLT5zaGFyZWQKKyAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWxhLnBsdCIpOworICBpZiAocyA9PSBOVUxMCisgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKKwkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQorCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAorCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBXZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGNyZWF0ZWQgYSAuZ290IHNlY3Rpb24gZm9yIHRoaXMgb2JqZWN0LCBidXQKKyAgICAgd2UgZGVmaW5pdGVseSBoYXZuJ3QgZG9uZSB0aGUgcmVzdCBvZiB0aGUgd29yay4gICovCisKKyAgaWYgKCFlbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICBzID0gYmZkX21ha2Vfc2VjdGlvbihhYmZkLCAiLnJlbGEuZ290Iik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAorCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCisJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECisJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKKyAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICAgZHlub2JqJ3MgLmdvdCBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAorICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICBoID0gTlVMTDsKKyAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsCisJIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290LCAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkgZmFsc2UsIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKKwkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOworICBoLT50eXBlID0gU1RUX09CSkVDVDsKKworICBpZiAoaW5mby0+c2hhcmVkCisgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290ID0gaDsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFJlYWQgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSAubWRlYnVnIHNlY3Rpb24gaW50byBhCisgICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIHNlY3Rpb24sIGRlYnVnKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Cit7CisgIEhEUlIgKnN5bWhkcjsKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgIGNoYXIgKmV4dF9oZHIgPSBOVUxMOworCisgIHN3YXAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7CisgIG1lbXNldCAoZGVidWcsIDAsIHNpemVvZigqZGVidWcpKTsKKworICBleHRfaGRyID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpOworICBpZiAoZXh0X2hkciA9PSBOVUxMICYmIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgZXh0X2hkciwgKGZpbGVfcHRyKSAwLAorCQkJCXN3YXAtPmV4dGVybmFsX2hkcl9zaXplKQorICAgICAgPT0gZmFsc2UpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7CisgICgqc3dhcC0+c3dhcF9oZHJfaW4pIChhYmZkLCBleHRfaGRyLCBzeW1oZHIpOworCisgIC8qIFRoZSBzeW1ib2xpYyBoZWFkZXIgY29udGFpbnMgYWJzb2x1dGUgZmlsZSBvZmZzZXRzIGFuZCBzaXplcyB0bworICAgICByZWFkLiAgKi8KKyNkZWZpbmUgUkVBRChwdHIsIG9mZnNldCwgY291bnQsIHNpemUsIHR5cGUpCQkJCVwKKyAgaWYgKHN5bWhkci0+Y291bnQgPT0gMCkJCQkJCQlcCisgICAgZGVidWctPnB0ciA9IE5VTEw7CQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgZGVidWctPnB0ciA9ICh0eXBlKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoc2l6ZSAqIHN5bWhkci0+Y291bnQpKTsJXAorICAgICAgaWYgKGRlYnVnLT5wdHIgPT0gTlVMTCkJCQkJCQlcCisJZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAorICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAlcCisJICB8fCAoYmZkX3JlYWQgKGRlYnVnLT5wdHIsIHNpemUsIHN5bWhkci0+Y291bnQsCQlcCisJCQlhYmZkKSAhPSBzaXplICogc3ltaGRyLT5jb3VudCkpCQkJXAorCWdvdG8gZXJyb3JfcmV0dXJuOwkJCQkJCVwKKyAgICB9CisKKyAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksIHVuc2lnbmVkIGNoYXIgKik7CisgIFJFQUQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgUFRSKTsKKyAgUkVBRCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBpcGRNYXgsIHN3YXAtPmV4dGVybmFsX3Bkcl9zaXplLCBQVFIpOworICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKKyAgUkVBRCAoZXh0ZXJuYWxfb3B0LCBjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUsIFBUUik7CisgIFJFQUQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIGlhdXhNYXgsIHNpemVvZiAodW5pb24gYXV4X2V4dCksCisJdW5pb24gYXV4X2V4dCAqKTsKKyAgUkVBRCAoc3MsIGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKKyAgUkVBRCAoc3NleHQsIGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSwgY2hhciAqKTsKKyAgUkVBRCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBQVFIpOworICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKKyAgUkVBRCAoZXh0ZXJuYWxfZXh0LCBjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIFBUUik7CisjdW5kZWYgUkVBRAorCisgIGRlYnVnLT5mZHIgPSBOVUxMOworICBkZWJ1Zy0+YWRqdXN0ID0gTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGV4dF9oZHIgIT0gTlVMTCkKKyAgICBmcmVlIChleHRfaGRyKTsKKyAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCisgICAgZnJlZSAoZGVidWctPmxpbmUpOworICBpZiAoZGVidWctPmV4dGVybmFsX2RuciAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9kbnIpOworICBpZiAoZGVidWctPmV4dGVybmFsX3BkciAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9wZHIpOworICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOworICBpZiAoZGVidWctPmV4dGVybmFsX29wdCAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9vcHQpOworICBpZiAoZGVidWctPmV4dGVybmFsX2F1eCAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5leHRlcm5hbF9hdXgpOworICBpZiAoZGVidWctPnNzICE9IE5VTEwpCisgICAgZnJlZSAoZGVidWctPnNzKTsKKyAgaWYgKGRlYnVnLT5zc2V4dCAhPSBOVUxMKQorICAgIGZyZWUgKGRlYnVnLT5zc2V4dCk7CisgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCisgICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7CisgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IE5VTEwpCisgICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3JmZCk7CisgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ICE9IE5VTEwpCisgICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2V4dCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogQWxwaGEgRUxGIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICckJy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiBuYW1lWzBdID09ICckJzsKK30KKworLyogQWxwaGEgRUxGIGZvbGxvd3MgTUlQUyBFTEYgaW4gdXNpbmcgYSBzcGVjaWFsIGZpbmRfbmVhcmVzdF9saW5lCisgICByb3V0aW5lIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2UKKyAgIHN0aWxsIGNhbGwgdGhpcyBtaXBzX2VsZl9maW5kX2xpbmUgYmVjYXVzZSBvZiB0aGUgc2xvdAorICAgZmluZF9saW5lX2luZm8gaW4gZWxmX29ial90ZGF0YSBpcyBkZWNsYXJlZCB0aGF0IHdheS4gICovCisKK3N0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUKK3sKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZDsKKyAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSBpOworfTsKKworc3RhdGljIGJvb2xlYW4KK2VsZjY0X2FscGhhX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGVuYW1lX3B0ciwKKwkJCSAgICAgICBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKK3sKKyAgYXNlY3Rpb24gKm1zZWM7CisKKyAgbXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpOworICBpZiAobXNlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZsYWd3b3JkIG9yaWdmbGFnczsKKyAgICAgIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpOworICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBzd2FwID0KKwlnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7CisKKyAgICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZHVyaW5nIGEgbGluaywgYWxwaGFfZWxmX2ZpbmFsX2xpbmsgbWF5IGhhdmUKKwkgY2xlYXJlZCB0aGUgU0VDX0hBU19DT05URU5UUyBmaWVsZC4gIFdlIGZvcmNlIGl0IGJhY2sgb24gaGVyZQorCSBpZiBhcHByb3ByaWF0ZSAod2hpY2ggaXQgbm9ybWFsbHkgd2lsbCBiZSkuICAqLworICAgICAgb3JpZ2ZsYWdzID0gbXNlYy0+ZmxhZ3M7CisgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobXNlYyktPnRoaXNfaGRyLnNoX3R5cGUgIT0gU0hUX05PQklUUykKKwltc2VjLT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOworCisgICAgICBmaSA9IGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOworICAgICAgaWYgKGZpID09IE5VTEwpCisJeworCSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKKwkgIGNoYXIgKmZyYXdfc3JjOworCSAgY2hhciAqZnJhd19lbmQ7CisJICBzdHJ1Y3QgZmRyICpmZHJfcHRyOworCisJICBmaSA9ICgoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqKQorCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUpKSk7CisJICBpZiAoZmkgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoIWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgbXNlYywgJmZpLT5kKSkKKwkgICAgeworCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICAvKiBTd2FwIGluIHRoZSBGRFIgaW5mb3JtYXRpb24uICAqLworCSAgZmktPmQuZmRyID0gKChzdHJ1Y3QgZmRyICopCisJCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkJICAoZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqCisJCQkJICAgc2l6ZW9mIChzdHJ1Y3QgZmRyKSkpKTsKKwkgIGlmIChmaS0+ZC5mZHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZXh0ZXJuYWxfZmRyX3NpemUgPSBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKKwkgIGZkcl9wdHIgPSBmaS0+ZC5mZHI7CisJICBmcmF3X3NyYyA9IChjaGFyICopIGZpLT5kLmV4dGVybmFsX2ZkcjsKKwkgIGZyYXdfZW5kID0gKGZyYXdfc3JjCisJCSAgICAgICsgZmktPmQuc3ltYm9saWNfaGVhZGVyLmlmZE1heCAqIGV4dGVybmFsX2Zkcl9zaXplKTsKKwkgIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQorCSAgICAoKnN3YXAtPnN3YXBfZmRyX2luKSAoYWJmZCwgKFBUUikgZnJhd19zcmMsIGZkcl9wdHIpOworCisJICBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbyA9IGZpOworCisJICAvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGV2ZXIgZnJlZSB0aGlzIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgIGZpbmRfbmVhcmVzdF9saW5lIGlzIGVpdGhlciBjYWxsZWQgYWxsIHRoZSB0aW1lLCBhcyBpbgorICAgICAgICAgICAgIG9iamR1bXAgLWwsIHNvIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgc2F2ZWQsIG9yIGl0IGlzCisgICAgICAgICAgICAgcmFyZWx5IGNhbGxlZCwgYXMgaW4gbGQgZXJyb3IgbWVzc2FnZXMsIHNvIHRoZSBtZW1vcnkKKyAgICAgICAgICAgICB3YXN0ZWQgaXMgdW5pbXBvcnRhbnQuICBTdGlsbCwgaXQgd291bGQgcHJvYmFibHkgYmUgYQorICAgICAgICAgICAgIGdvb2QgaWRlYSBmb3IgZnJlZV9jYWNoZWRfaW5mbyB0byB0aHJvdyBpdCBhd2F5LiAgKi8KKwl9CisKKyAgICAgIGlmIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsICZmaS0+ZCwgc3dhcCwKKwkJCQkgICZmaS0+aSwgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAorCQkJCSAgbGluZV9wdHIpKQorCXsKKwkgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKKyAgICB9CisKKyAgLyogRmFsbCBiYWNrIG9uIHRoZSBnZW5lcmljIEVMRiBmaW5kX25lYXJlc3RfbGluZSByb3V0aW5lLiAgKi8KKworICByZXR1cm4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKKwkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKKwkJCQkgICAgIGxpbmVfcHRyKTsKK30KKwwKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gYWxwaGFfZWxmX291dHB1dF9leHRzeW0uICAqLworCitzdHJ1Y3QgZXh0c3ltX2luZm8KK3sKKyAgYmZkICphYmZkOworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKKyAgYm9vbGVhbiBmYWlsZWQ7Cit9OworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgZXh0c3ltX2luZm8gKmVpbmZvID0gKHN0cnVjdCBleHRzeW1faW5mbyAqKSBkYXRhOworICBib29sZWFuIHN0cmlwOworICBhc2VjdGlvbiAqc2VjLCAqb3V0cHV0X3NlY3Rpb247CisKKyAgaWYgKGgtPnJvb3QuaW5keCA9PSAtMikKKyAgICBzdHJpcCA9IGZhbHNlOworICBlbHNlIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKKyAgICAgICAgICAgfHwgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCisgICAgICAgICAgJiYgKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKKyAgICAgICAgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKKyAgICBzdHJpcCA9IHRydWU7CisgIGVsc2UgaWYgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKKyAgICAgICAgICB8fCAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKKyAgICAgICAgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChlaW5mby0+aW5mby0+a2VlcF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQorICAgIHN0cmlwID0gdHJ1ZTsKKyAgZWxzZQorICAgIHN0cmlwID0gZmFsc2U7CisKKyAgaWYgKHN0cmlwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChoLT5lc3ltLmlmZCA9PSAtMikKKyAgICB7CisgICAgICBoLT5lc3ltLmptcHRibCA9IDA7CisgICAgICBoLT5lc3ltLmNvYm9sX21haW4gPSAwOworICAgICAgaC0+ZXN5bS53ZWFrZXh0ID0gMDsKKyAgICAgIGgtPmVzeW0ucmVzZXJ2ZWQgPSAwOworICAgICAgaC0+ZXN5bS5pZmQgPSBpZmROaWw7CisgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOworICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RHbG9iYWw7CisKKyAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKyAgICAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKKyAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgICAgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKKworICAgICAgICAgLyogV2hlbiBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgc3ltYm9sIGggaXMgdGhlIG9uZSBmcm9tCisgICAgICAgICAgICB0aGUgYW5vdGhlciBzaGFyZWQgbGlicmFyeSwgT1VUUFVUX1NFQ1RJT04gbWF5IGJlIG51bGwuICAqLworICAgICAgICAgaWYgKG91dHB1dF9zZWN0aW9uID09IE5VTEwpCisgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOworICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKG91dHB1dF9zZWN0aW9uLT5vd25lciwgb3V0cHV0X3NlY3Rpb24pOworCisgICAgICAgICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKKyAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVGV4dDsKKyAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCisgICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0RhdGE7CisgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKKyAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7CisgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJvZGF0YSIpID09IDAKKyAgICAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQorICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSRGF0YTsKKyAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKKyAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOworICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKKyAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKKyAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCisgICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0luaXQ7CisgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQorICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NGaW5pOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOworICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOworICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7CisgICAgfQorCisgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKyAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnJvb3QudS5jLnNpemU7CisgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICB7CisgICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQorICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOworICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKKyAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7CisKKyAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOworICAgICAgaWYgKG91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisgICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dHB1dF9zZWN0aW9uLT52bWEpOworICAgICAgZWxzZQorICAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7CisgICAgfQorICBlbHNlIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCisgICAgeworICAgICAgLyogU2V0IHR5cGUgYW5kIHZhbHVlIGZvciBhIHN5bWJvbCB3aXRoIGEgZnVuY3Rpb24gc3R1Yi4gICovCisgICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdFByb2M7CisgICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZWluZm8tPmFiZmQsICIucGx0Iik7CisgICAgICBpZiAoc2VjID09IE5VTEwpCisJaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisJICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKKwkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gKGgtPnJvb3QucGx0Lm9mZnNldAorCQkJCSAgKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJCQkgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7CisJICBlbHNlCisJICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7CisJfQorI2lmIDAgLyogRklYTUU/ICAqLworICAgICAgaC0+ZXN5bS5pZmQgPSAwOworI2VuZGlmCisgICAgfQorCisgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGVpbmZvLT5hYmZkLCBlaW5mby0+ZGVidWcsIGVpbmZvLT5zd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+ZXN5bSkpCisgICAgeworICAgICAgZWluZm8tPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBGSVhNRTogIENyZWF0ZSBhIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIGZyb20gdGhlIC5tZGVidWcgc2VjdGlvbi4KKworc3RhdGljIGJvb2xlYW4KK21pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKGhhbmRsZSwgYWJmZCwgaW5mbywgcywgZGVidWcpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzOworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7CisqLworDAorLyogSGFuZGxlIGR5bmFtaWMgcmVsb2NhdGlvbnMgd2hlbiBkb2luZyBhbiBBbHBoYSBFTEYgbGluay4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnNyZWxvYzsKKyAgY29uc3QgY2hhciAqcmVsX3NlY19uYW1lOworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzOworICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOworICBpbnQgZ290X2NyZWF0ZWQ7CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOworICBpZiAoZHlub2JqID09IE5VTEwpCisgICAgZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7CisKKyAgc3JlbG9jID0gTlVMTDsKKyAgcmVsX3NlY19uYW1lID0gTlVMTDsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEoYWJmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyhhYmZkKTsKKyAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmxvY2FsX2dvdF9lbnRyaWVzOworICBnb3RfY3JlYXRlZCA9IDA7CisKKyAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgKytyZWwpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keCwgcl90eXBlOworICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJaCA9IE5VTEw7CisgICAgICBlbHNlCisJeworCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKworCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKKworCSAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7CisJfQorICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisKKyAgICAgIHN3aXRjaCAocl90eXBlKQorCXsKKwljYXNlIFJfQUxQSEFfTElURVJBTDoKKwkgIHsKKwkgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKKwkgICAgaW50IGZsYWdzID0gMDsKKworCSAgICBpZiAoaCkKKwkgICAgICB7CisJCS8qIFNlYXJjaCBmb3IgYW5kIHBvc3NpYmx5IGNyZWF0ZSBhIGdvdCBlbnRyeS4gICovCisJCWZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudCA7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKKwkJICBpZiAoZ290ZW50LT5nb3RvYmogPT0gYWJmZCAmJgorCQkgICAgICBnb3RlbnQtPmFkZGVuZCA9PSByZWwtPnJfYWRkZW5kKQorCQkgICAgYnJlYWs7CisKKwkJaWYgKCFnb3RlbnQpCisJCSAgeworCQkgICAgZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKQorCQkJICAgICAgYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSkpKTsKKwkJICAgIGlmICghZ290ZW50KQorCQkgICAgICByZXR1cm4gZmFsc2U7CisKKwkJICAgIGdvdGVudC0+Z290b2JqID0gYWJmZDsKKwkJICAgIGdvdGVudC0+YWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKwkJICAgIGdvdGVudC0+Z290X29mZnNldCA9IC0xOworCQkgICAgZ290ZW50LT5mbGFncyA9IDA7CisJCSAgICBnb3RlbnQtPnVzZV9jb3VudCA9IDE7CisKKwkJICAgIGdvdGVudC0+bmV4dCA9IGgtPmdvdF9lbnRyaWVzOworCQkgICAgaC0+Z290X2VudHJpZXMgPSBnb3RlbnQ7CisKKwkJICAgIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPnRvdGFsX2dvdF9lbnRyaWVzKys7CisJCSAgfQorCQllbHNlCisJCSAgZ290ZW50LT51c2VfY291bnQgKz0gMTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIFRoaXMgaXMgYSBsb2NhbCAuZ290IGVudHJ5IC0tIHJlY29yZCBmb3IgbWVyZ2UuICAqLworCQlpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQorCQkgIHsKKwkJICAgIHNpemVfdCBzaXplOworCQkgICAgc2l6ZSA9IChzeW10YWJfaGRyLT5zaF9pbmZvCisJCQkgICAgKiBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopKTsKKworCQkgICAgbG9jYWxfZ290X2VudHJpZXMgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqKQorCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7CisJCSAgICBpZiAoIWxvY2FsX2dvdF9lbnRyaWVzKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisKKwkJICAgIG1lbXNldCAobG9jYWxfZ290X2VudHJpZXMsIDAsIHNpemUpOworCQkgICAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfZ290X2VudHJpZXMgPQorCQkgICAgICBsb2NhbF9nb3RfZW50cmllczsKKwkJICB9CisKKwkJZm9yIChnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldOworCQkgICAgIGdvdGVudCAhPSBOVUxMICYmIGdvdGVudC0+YWRkZW5kICE9IHJlbC0+cl9hZGRlbmQ7CisJCSAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0KQorCQkgIGNvbnRpbnVlOworCQlpZiAoIWdvdGVudCkKKwkJICB7CisJCSAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopCisJCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkJCSBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5KSkpOworCQkgICAgaWYgKCFnb3RlbnQpCisJCSAgICAgIHJldHVybiBmYWxzZTsKKworCQkgICAgZ290ZW50LT5nb3RvYmogPSBhYmZkOworCQkgICAgZ290ZW50LT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOworCQkgICAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gLTE7CisJCSAgICBnb3RlbnQtPmZsYWdzID0gMDsKKwkJICAgIGdvdGVudC0+dXNlX2NvdW50ID0gMTsKKworCQkgICAgZ290ZW50LT5uZXh0ID0gbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXTsKKwkJICAgIGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV0gPSBnb3RlbnQ7CisKKwkJICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+dG90YWxfZ290X2VudHJpZXMrKzsKKwkJICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bl9sb2NhbF9nb3RfZW50cmllcysrOworCQkgIH0KKwkJZWxzZQorCQkgIGdvdGVudC0+dXNlX2NvdW50ICs9IDE7CisJICAgICAgfQorCisJICAgIC8qIFJlbWVtYmVyIGhvdyB0aGlzIGxpdGVyYWwgaXMgdXNlZCBmcm9tIGl0cyBMSVRVU0VzLgorCSAgICAgICBUaGlzIHdpbGwgYmUgaW1wb3J0YW50IHdoZW4gaXQgY29tZXMgdG8gZGVjaWRlIGlmIHdlIGNhbgorCSAgICAgICBjcmVhdGUgYSAucGx0IGVudHJ5IGZvciBhIGZ1bmN0aW9uIHN5bWJvbC4gICovCisJICAgIGlmIChyZWwrMSA8IHJlbGVuZAorCQkmJiBFTEY2NF9SX1RZUEUgKHJlbFsxXS5yX2luZm8pID09IFJfQUxQSEFfTElUVVNFKQorCSAgICAgIHsKKwkJZG8KKwkJICB7CisJCSAgICArK3JlbDsKKwkJICAgIGlmIChyZWwtPnJfYWRkZW5kID49IDEgJiYgcmVsLT5yX2FkZGVuZCA8PSAzKQorCQkgICAgICBmbGFncyB8PSAxIDw8IHJlbC0+cl9hZGRlbmQ7CisJCSAgfQorCQl3aGlsZSAocmVsKzEgPCByZWxlbmQgJiYKKwkJICAgICAgIEVMRjY0X1JfVFlQRSAocmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLyogTm8gTElUVVNFcyAtLSBwcmVzdW1hYmx5IHRoZSBhZGRyZXNzIGlzIG5vdCBiZWluZworCQkgICBsb2FkZWQgZm9yIG5vdGhpbmcuICAqLworCQlmbGFncyA9IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUjsKKwkgICAgICB9CisKKwkgICAgZ290ZW50LT5mbGFncyB8PSBmbGFnczsKKwkgICAgaWYgKGgpCisJICAgICAgeworCQkvKiBNYWtlIGEgZ3Vlc3MgYXMgdG8gd2hldGhlciBhIC5wbHQgZW50cnkgd2lsbCBiZSBuZWVkZWQuICAqLworCQlpZiAoKGgtPmZsYWdzIHw9IGZsYWdzKSA9PSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMpCisJCSAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOworCQllbHNlCisJCSAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKKwkgICAgICB9CisJICB9CisJICAvKiBGQUxMVEhSVSAqLworCisJY2FzZSBSX0FMUEhBX0dQRElTUDoKKwljYXNlIFJfQUxQSEFfR1BSRUwzMjoKKwljYXNlIFJfQUxQSEFfR1BSRUxISUdIOgorCWNhc2UgUl9BTFBIQV9HUFJFTExPVzoKKwkgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgLmdvdCBoZXJlLCBidXQgdGhlIHNlY3Rpb25zIG11c3QKKwkgICAgIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKKwkgICAgIHNlY3Rpb25zLiAgKi8KKwkgIGlmICghZ290X2NyZWF0ZWQpCisJICAgIHsKKwkgICAgICBpZiAoIWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgb2JqZWN0J3MgZ290b2JqIGlzIHNldCB0byBpdHNlbGYgc28KKwkJIHRoYXQgd2UgZGVmYXVsdCB0byBldmVyeSBvYmplY3Qgd2l0aCBpdHMgb3duIC5nb3QuCisJCSBXZSdsbCBtZXJnZSAuZ290cyBsYXRlciBvbmNlIHdlJ3ZlIGNvbGxlY3RlZCBlYWNoCisJCSBvYmplY3QncyBpbmZvLiAgKi8KKwkgICAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdG9iaiA9IGFiZmQ7CisKKwkgICAgICBnb3RfY3JlYXRlZCA9IDE7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBSX0FMUEhBX1NSRUwxNjoKKwljYXNlIFJfQUxQSEFfU1JFTDMyOgorCWNhc2UgUl9BTFBIQV9TUkVMNjQ6CisJICBpZiAoaCA9PSBOVUxMKQorCSAgICBicmVhazsKKwkgIC8qIEZBTExUSFJVICovCisKKwljYXNlIFJfQUxQSEFfUkVGTE9ORzoKKwljYXNlIFJfQUxQSEFfUkVGUVVBRDoKKwkgIGlmIChyZWxfc2VjX25hbWUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHJlbF9zZWNfbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgICAgICAoYWJmZCwgZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keCwKKwkJCSAgICAgICBlbGZfc2VjdGlvbl9kYXRhKHNlYyktPnJlbF9oZHIuc2hfbmFtZSkpOworCSAgICAgIGlmIChyZWxfc2VjX25hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAocmVsX3NlY19uYW1lLCAiLnJlbGEiLCA1KSA9PSAwCisJCQkgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCisJCQkJICAgICByZWxfc2VjX25hbWUrNSkgPT0gMCk7CisJICAgIH0KKworCSAgLyogV2UgbmVlZCB0byBjcmVhdGUgdGhlIHNlY3Rpb24gaGVyZSBub3cgd2hldGhlciB3ZSBldmVudHVhbGx5CisJICAgICB1c2UgaXQgb3Igbm90IHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgdG8gYW4gb3V0cHV0IHNlY3Rpb24gYnkKKwkgICAgIHRoZSBsaW5rZXIuICBJZiBub3QgdXNlZCwgd2UnbGwga2lsbCBpdCBpbgorCSAgICAgc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KKwkgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIHJlbF9zZWNfbmFtZSk7CisJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQorCQl7CisJCSAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCByZWxfc2VjX25hbWUpOworCQkgIGlmIChzcmVsb2MgPT0gTlVMTAorCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKKwkJCQkJCSAoU0VDX0FMTE9DfFNFQ19MT0FECisJCQkJCQkgIHwgU0VDX0hBU19DT05URU5UUworCQkJCQkJICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkJCSAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgfCBTRUNfUkVBRE9OTFkpKQorCQkgICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDMpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKworCSAgaWYgKGgpCisJICAgIHsKKwkgICAgICAvKiBTaW5jZSB3ZSBoYXZuJ3Qgc2VlbiBhbGwgb2YgdGhlIGlucHV0IHN5bWJvbHMgeWV0LCB3ZQorCQkgZG9uJ3Qga25vdyB3aGV0aGVyIHdlJ2xsIGFjdHVhbGx5IG5lZWQgYSBkeW5hbWljIHJlbG9jYXRpb24KKwkJIGVudHJ5IGZvciB0aGlzIHJlbG9jLiAgU28gbWFrZSBhIHJlY29yZCBvZiBpdC4gIE9uY2Ugd2UKKwkJIGZpbmQgb3V0IGlmIHRoaXMgdGhpbmcgbmVlZHMgZHluYW1pYyByZWxvY2F0aW9uIHdlJ2xsCisJCSBleHBhbmQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbnMgYnkgdGhlIGFwcHJvcHJpYXRlIGFtb3VudC4gKi8KKworCSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKnJlbnQ7CisKKwkgICAgICBmb3IgKHJlbnQgPSBoLT5yZWxvY19lbnRyaWVzOyByZW50OyByZW50ID0gcmVudC0+bmV4dCkKKwkJaWYgKHJlbnQtPnJ0eXBlID09IHJfdHlwZSAmJiByZW50LT5zcmVsID09IHNyZWxvYykKKwkJICBicmVhazsKKworCSAgICAgIGlmICghcmVudCkKKwkJeworCQkgIHJlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKikKKwkJCSAgYmZkX2FsbG9jIChhYmZkLAorCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5KSkpOworCQkgIGlmICghcmVudCkKKwkJICAgIHJldHVybiBmYWxzZTsKKworCQkgIHJlbnQtPnNyZWwgPSBzcmVsb2M7CisJCSAgcmVudC0+cnR5cGUgPSByX3R5cGU7CisJCSAgcmVudC0+Y291bnQgPSAxOworCisJCSAgcmVudC0+bmV4dCA9IGgtPnJlbG9jX2VudHJpZXM7CisJCSAgaC0+cmVsb2NfZW50cmllcyA9IHJlbnQ7CisJCX0KKwkgICAgICBlbHNlCisJCXJlbnQtPmNvdW50Kys7CisJICAgIH0KKwkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCkKKwkgICAgeworCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCBhIFJFTEFUSVZFIHJlbG9jLiAgKi8KKwkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKKyAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCisgICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCisgICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgorICAgdW5kZXJzdGFuZC4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzOworICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqYWg7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKKyAgYWggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloOworCisgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNlZW4gYWxsIG9mIHRoZSBpbnB1dCBzeW1ib2xzLCBmaW5hbGl6ZSBvdXIgZGVjaXNpb24KKyAgICAgYWJvdXQgd2hldGhlciB0aGlzIHN5bWJvbCBzaG91bGQgZ2V0IGEgLnBsdCBlbnRyeS4gICovCisKKyAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaworICAgICAgJiYgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKGgsIGluZm8pCisgICAgICAmJiAoKGgtPnR5cGUgPT0gU1RUX0ZVTkMKKwkgICAmJiAhKGFoLT5mbGFncyAmIEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUikpCisJICB8fCAoaC0+dHlwZSA9PSBTVFRfTk9UWVBFCisJICAgICAgJiYgYWgtPmZsYWdzID09IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQykpCisgICAgICAvKiBEb24ndCBwcmV2ZW50IG90aGVyd2lzZSB2YWxpZCBwcm9ncmFtcyBmcm9tIGxpbmtpbmcgYnkgYXR0ZW1wdGluZworCSB0byBjcmVhdGUgYSBuZXcgLmdvdCBlbnRyeSBzb21ld2hlcmUuICBBIENvcnJlY3QgU29sdXRpb24gd291bGQgYmUKKwkgdG8gYWRkIGEgbmV3IC5nb3Qgc2VjdGlvbiB0byBhIG5ldyBvYmplY3QgZmlsZSBhbmQgbGV0IGl0IGJlIG1lcmdlZAorCSBzb21ld2hlcmUgbGF0ZXIuICBCdXQgZm9yIG5vdyBkb24ndCBib3RoZXIuICAqLworICAgICAgJiYgYWgtPmdvdF9lbnRyaWVzKQorICAgIHsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShkeW5vYmosICIucGx0Iik7CisgICAgICBpZiAoIXMgJiYgIWVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChkeW5vYmosIGluZm8pKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgLnBsdCBpcyByZXNlcnZlZC4gICovCisgICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCisJcy0+X3Jhd19zaXplID0gUExUX0hFQURFUl9TSVpFOworCisgICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOworICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOworCisgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZSBub3QKKwkgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoZSBsb2NhdGlvbgorCSBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbiBwb2ludGVycyBjb21wYXJlCisJIGVxdWFsIGJldHdlZW4gdGhlIG5vcm1hbCBleGVjdXRhYmxlIGFuZCB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCisJICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCXsKKwkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7CisJICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+cGx0Lm9mZnNldDsKKwl9CisKKyAgICAgIC8qIFdlIGFsc28gbmVlZCBhIEpNUF9TTE9UIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgICAgIHMtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIGVsc2UKKyAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKKworICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCisgICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQorICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLworICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKKyAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCisgICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgVGhlIEFscGhhLCBzaW5jZSBpdCB1c2VzIC5nb3QgZW50cmllcyBmb3IgYWxsCisgICAgIHN5bWJvbHMgZXZlbiBpbiByZWd1bGFyIG9iamVjdHMsIGRvZXMgbm90IG5lZWQgdGhlIGhhY2tlcnkgb2YgYQorICAgICAuZHluYnNzIHNlY3Rpb24gYW5kIENPUFkgZHluYW1pYyByZWxvY2F0aW9ucy4gICovCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN5bWJvbCB2ZXJzaW9uaW5nIGNhbiBjcmVhdGUgbmV3IHN5bWJvbHMsIGFuZCBtYWtlIG91ciBvbGQgc3ltYm9scworICAgaW5kaXJlY3QgdG8gdGhlIG5ldyBvbmVzLiAgQ29uc29saWRhdGUgdGhlIGdvdCBhbmQgcmVsb2MgaW5mb3JtYXRpb24KKyAgIGluIHRoZXNlIHNpdHVhdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMgKGhpLCBkdW1teSkKKyAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmhpOworICAgICBQVFIgZHVtbXk7Cit7CisgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoczsKKworICBpZiAoaGktPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCisgICAgcmV0dXJuIHRydWU7CisgIGhzID0gaGk7CisgIGRvIHsKKyAgICBocyA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWhzLT5yb290LnJvb3QudS5pLmxpbms7CisgIH0gd2hpbGUgKGhzLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KTsKKworICAvKiBNZXJnZSB0aGUgZmxhZ3MuICBXaGVlLiAgKi8KKworICBocy0+ZmxhZ3MgfD0gaGktPmZsYWdzOworCisgIC8qIE1lcmdlIHRoZSAuZ290IGVudHJpZXMuICBDYW5uaWJhbGl6ZSB0aGUgb2xkIHN5bWJvbCdzIGxpc3QgaW4KKyAgICAgZG9pbmcgc28sIHNpbmNlIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZS4gICovCisKKyAgaWYgKGhzLT5nb3RfZW50cmllcyA9PSBOVUxMKQorICAgIGhzLT5nb3RfZW50cmllcyA9IGhpLT5nb3RfZW50cmllczsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnaSwgKmdzLCAqZ2luLCAqZ3NoOworCisgICAgICBnc2ggPSBocy0+Z290X2VudHJpZXM7CisgICAgICBmb3IgKGdpID0gaGktPmdvdF9lbnRyaWVzOyBnaSA7IGdpID0gZ2luKQorCXsKKwkgIGdpbiA9IGdpLT5uZXh0OworCSAgZm9yIChncyA9IGdzaDsgZ3MgOyBncyA9IGdzLT5uZXh0KQorCSAgICBpZiAoZ2ktPmdvdG9iaiA9PSBncy0+Z290b2JqICYmIGdpLT5hZGRlbmQgPT0gZ3MtPmFkZGVuZCkKKwkgICAgICBnb3RvIGdvdF9mb3VuZDsKKwkgIGdpLT5uZXh0ID0gaHMtPmdvdF9lbnRyaWVzOworCSAgaHMtPmdvdF9lbnRyaWVzID0gZ2k7CisJZ290X2ZvdW5kOjsKKwl9CisgICAgfQorICBoaS0+Z290X2VudHJpZXMgPSBOVUxMOworCisgIC8qIEFuZCBzaW1pbGFyIGZvciB0aGUgcmVsb2MgZW50cmllcy4gICovCisKKyAgaWYgKGhzLT5yZWxvY19lbnRyaWVzID09IE5VTEwpCisgICAgaHMtPnJlbG9jX2VudHJpZXMgPSBoaS0+cmVsb2NfZW50cmllczsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKnJpLCAqcnMsICpyaW4sICpyc2g7CisKKyAgICAgIHJzaCA9IGhzLT5yZWxvY19lbnRyaWVzOworICAgICAgZm9yIChyaSA9IGhpLT5yZWxvY19lbnRyaWVzOyByaSA7IHJpID0gcmluKQorCXsKKwkgIHJpbiA9IHJpLT5uZXh0OworCSAgZm9yIChycyA9IHJzaDsgcnMgOyBycyA9IHJzLT5uZXh0KQorCSAgICBpZiAocmktPnJ0eXBlID09IHJzLT5ydHlwZSkKKwkgICAgICB7CisJCXJzLT5jb3VudCArPSByaS0+Y291bnQ7CisJCWdvdG8gZm91bmRfcmVsb2M7CisJICAgICAgfQorCSAgcmktPm5leHQgPSBocy0+cmVsb2NfZW50cmllczsKKwkgIGhzLT5yZWxvY19lbnRyaWVzID0gcmk7CisJZm91bmRfcmVsb2M6OworCX0KKyAgICB9CisgIGhpLT5yZWxvY19lbnRyaWVzID0gTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSXMgaXQgcG9zc2libGUgdG8gbWVyZ2UgdHdvIG9iamVjdCBmaWxlJ3MgLmdvdCB0YWJsZXM/ICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMgKGEsIGIpCisgICAgIGJmZCAqYSwgKmI7Cit7CisgIGludCB0b3RhbCA9IGFscGhhX2VsZl90ZGF0YSAoYSktPnRvdGFsX2dvdF9lbnRyaWVzOworICBiZmQgKmJzdWI7CisKKyAgLyogVHJpdmlhbCBxdWljayBmYWxsb3V0IHRlc3QuICAqLworICBpZiAodG90YWwgKyBhbHBoYV9lbGZfdGRhdGEgKGIpLT50b3RhbF9nb3RfZW50cmllcyA8PSBNQVhfR09UX0VOVFJJRVMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogQnkgdGhlaXIgbmF0dXJlLCBsb2NhbCAuZ290IGVudHJpZXMgY2Fubm90IGJlIG1lcmdlZC4gICovCisgIGlmICgodG90YWwgKz0gYWxwaGFfZWxmX3RkYXRhIChiKS0+bl9sb2NhbF9nb3RfZW50cmllcykgPiBNQVhfR09UX0VOVFJJRVMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZhaWxpbmcgdGhlIGNvbW1vbiB0cml2aWFsIGNvbXBhcmlzb24sIHdlIG11c3QgZWZmZWN0aXZlbHkKKyAgICAgcGVyZm9ybSB0aGUgbWVyZ2UuICBOb3QgYWN0dWFsbHkgcGVyZm9ybWluZyB0aGUgbWVyZ2UgbWVhbnMgdGhhdAorICAgICB3ZSBkb24ndCBoYXZlIHRvIHN0b3JlIHVuZG8gaW5mb3JtYXRpb24gaW4gY2FzZSB3ZSBmYWlsLiAgKi8KKyAgZm9yIChic3ViID0gYjsgYnN1YiA7IGJzdWIgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqaGFzaGVzID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGJzdWIpOworICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkcjsKKyAgICAgIGludCBpLCBuOworCisgICAgICBuID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHN5bXRhYl9oZHItPnNoX2VudHNpemUgLSBzeW10YWJfaGRyLT5zaF9pbmZvOworICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwl7CisJICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqYWUsICpiZTsKKwkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBoID0gaGFzaGVzW2ldOworCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisJICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7CisKKwkgIGZvciAoYmUgPSBoLT5nb3RfZW50cmllczsgYmUgOyBiZSA9IGJlLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKGJlLT51c2VfY291bnQgPT0gMCkKKwkgICAgICAgIGNvbnRpbnVlOworCSAgICAgIGlmIChiZS0+Z290b2JqICE9IGIpCisJICAgICAgICBjb250aW51ZTsKKworCSAgICAgIGZvciAoYWUgPSBoLT5nb3RfZW50cmllczsgYWUgOyBhZSA9IGFlLT5uZXh0KQorCSAgICAgICAgaWYgKGFlLT5nb3RvYmogPT0gYSAmJiBhZS0+YWRkZW5kID09IGJlLT5hZGRlbmQpCisJCSAgZ290byBnbG9iYWxfZm91bmQ7CisKKwkgICAgICBpZiAoKyt0b3RhbCA+IE1BWF9HT1RfRU5UUklFUykKKwkgICAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgZ2xvYmFsX2ZvdW5kOjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFjdHVhbGx5IG1lcmdlIHR3byAuZ290IHRhYmxlcy4gICovCisKK3N0YXRpYyB2b2lkCitlbGY2NF9hbHBoYV9tZXJnZV9nb3RzIChhLCBiKQorICAgICBiZmQgKmEsICpiOworeworICBpbnQgdG90YWwgPSBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllczsKKyAgYmZkICpic3ViOworCisgIC8qIFJlbWVtYmVyIGxvY2FsIGV4cGFuc2lvbi4gICovCisgIHsKKyAgICBpbnQgZSA9IGFscGhhX2VsZl90ZGF0YSAoYiktPm5fbG9jYWxfZ290X2VudHJpZXM7CisgICAgdG90YWwgKz0gZTsKKyAgICBhbHBoYV9lbGZfdGRhdGEgKGEpLT5uX2xvY2FsX2dvdF9lbnRyaWVzICs9IGU7CisgIH0KKworICBmb3IgKGJzdWIgPSBiOyBic3ViIDsgYnN1YiA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQpCisgICAgeworICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKKyAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICoqaGFzaGVzOworICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgICAgICBpbnQgaSwgbjsKKworICAgICAgLyogTGV0IHRoZSBsb2NhbCAuZ290IGVudHJpZXMga25vdyB0aGV5IGFyZSBwYXJ0IG9mIGEgbmV3IHN1YnNlZ21lbnQuICAqLworICAgICAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5sb2NhbF9nb3RfZW50cmllczsKKyAgICAgIGlmIChsb2NhbF9nb3RfZW50cmllcykKKyAgICAgICAgeworCSAgbiA9IGVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHIuc2hfaW5mbzsKKwkgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZW50OworCSAgICAgIGZvciAoZW50ID0gbG9jYWxfZ290X2VudHJpZXNbaV07IGVudDsgZW50ID0gZW50LT5uZXh0KQorCSAgICAgICAgZW50LT5nb3RvYmogPSBhOworCSAgICB9CisgICAgICAgIH0KKworICAgICAgLyogTWVyZ2UgdGhlIGdsb2JhbCAuZ290IGVudHJpZXMuICAqLworICAgICAgaGFzaGVzID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGJzdWIpOworICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyOworCisgICAgICBuID0gc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHN5bXRhYl9oZHItPnNoX2VudHNpemUgLSBzeW10YWJfaGRyLT5zaF9pbmZvOworICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgeworCSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmFlLCAqYmUsICoqcGJlLCAqKnN0YXJ0OworCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkgIGggPSBoYXNoZXNbaV07CisJICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCSAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKKworCSAgc3RhcnQgPSAmaC0+Z290X2VudHJpZXM7CisJICBmb3IgKHBiZSA9IHN0YXJ0LCBiZSA9ICpzdGFydDsgYmUgOyBwYmUgPSAmYmUtPm5leHQsIGJlID0gYmUtPm5leHQpCisJICAgIHsKKwkgICAgICBpZiAoYmUtPnVzZV9jb3VudCA9PSAwKQorCSAgICAgICAgeworCQkgICpwYmUgPSBiZS0+bmV4dDsKKwkJICBjb250aW51ZTsKKwkgICAgICAgIH0KKwkgICAgICBpZiAoYmUtPmdvdG9iaiAhPSBiKQorCSAgICAgICAgY29udGludWU7CisKKwkgICAgICBmb3IgKGFlID0gKnN0YXJ0OyBhZSA7IGFlID0gYWUtPm5leHQpCisJICAgICAgICBpZiAoYWUtPmdvdG9iaiA9PSBhICYmIGFlLT5hZGRlbmQgPT0gYmUtPmFkZGVuZCkKKwkJICB7CisJCSAgICBhZS0+ZmxhZ3MgfD0gYmUtPmZsYWdzOworCQkgICAgYWUtPnVzZV9jb3VudCArPSBiZS0+dXNlX2NvdW50OworCQkgICAgKnBiZSA9IGJlLT5uZXh0OworCQkgICAgZ290byBnbG9iYWxfZm91bmQ7CisJCSAgfQorCSAgICAgIGJlLT5nb3RvYmogPSBhOworCSAgICAgIHRvdGFsICs9IDE7CisKKwkgICAgZ2xvYmFsX2ZvdW5kOjsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgIGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmdvdG9iaiA9IGE7CisgICAgfQorICBhbHBoYV9lbGZfdGRhdGEgKGEpLT50b3RhbF9nb3RfZW50cmllcyA9IHRvdGFsOworCisgIC8qIE1lcmdlIHRoZSB0d28gaW5fZ290IGNoYWlucy4gICovCisgIHsKKyAgICBiZmQgKm5leHQ7CisKKyAgICBic3ViID0gYTsKKyAgICB3aGlsZSAoKG5leHQgPSBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0KSAhPSBOVUxMKQorICAgICAgYnN1YiA9IG5leHQ7CisKKyAgICBhbHBoYV9lbGZfdGRhdGEgKGJzdWIpLT5pbl9nb3RfbGlua19uZXh0ID0gYjsKKyAgfQorfQorCisvKiBDYWxjdWxhdGUgdGhlIG9mZnNldHMgZm9yIHRoZSBnb3QgZW50cmllcy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzX2Zvcl9zeW1ib2wgKGgsIGFyZykKKyAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBhcmc7Cit7CisgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7CisKKyAgZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50OyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCisgICAgaWYgKGdvdGVudC0+dXNlX2NvdW50ID4gMCkKKyAgICAgIHsKKwliZmRfc2l6ZV90eXBlICpwbGdlCisJICA9ICZhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290LT5fcmF3X3NpemU7CisKKwlnb3RlbnQtPmdvdF9vZmZzZXQgPSAqcGxnZTsKKwkqcGxnZSArPSA4OworICAgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyAoaW5mbykKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqaSwgKmdvdF9saXN0ID0gYWxwaGFfZWxmX2hhc2hfdGFibGUoaW5mbyktPmdvdF9saXN0OworCisgIC8qIEZpcnN0LCB6ZXJvIG91dCB0aGUgLmdvdCBzaXplcywgYXMgd2UgbWF5IGJlIHJlY2FsY3VsYXRpbmcgdGhlCisgICAgIC5nb3QgYWZ0ZXIgb3B0aW1pemluZyBpdC4gICovCisgIGZvciAoaSA9IGdvdF9saXN0OyBpIDsgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKKyAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X3Jhd19zaXplID0gMDsKKworICAvKiBOZXh0LCBmaWxsIGluIHRoZSBvZmZzZXRzIGZvciBhbGwgdGhlIGdsb2JhbCBlbnRyaWVzLiAgKi8KKyAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCwKKwkJCQlOVUxMKTsKKworICAvKiBGaW5hbGx5LCBmaWxsIGluIHRoZSBvZmZzZXRzIGZvciB0aGUgbG9jYWwgZW50cmllcy4gICovCisgIGZvciAoaSA9IGdvdF9saXN0OyBpIDsgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKKyAgICB7CisgICAgICBiZmRfc2l6ZV90eXBlIGdvdF9vZmZzZXQgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X3Jhd19zaXplOworICAgICAgYmZkICpqOworCisgICAgICBmb3IgKGogPSBpOyBqIDsgaiA9IGFscGhhX2VsZl90ZGF0YShqKS0+aW5fZ290X2xpbmtfbmV4dCkKKwl7CisJICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzLCAqZ290ZW50OworCSAgaW50IGssIG47CisKKwkgIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGopLT5sb2NhbF9nb3RfZW50cmllczsKKwkgIGlmICghbG9jYWxfZ290X2VudHJpZXMpCisJICAgIGNvbnRpbnVlOworCisJICBmb3IgKGsgPSAwLCBuID0gZWxmX3RkYXRhKGopLT5zeW10YWJfaGRyLnNoX2luZm87IGsgPCBuOyArK2spCisJICAgIGZvciAoZ290ZW50ID0gbG9jYWxfZ290X2VudHJpZXNba107IGdvdGVudDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQorCSAgICAgIGlmIChnb3RlbnQtPnVzZV9jb3VudCA+IDApCisJICAgICAgICB7CisJCSAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gZ290X29mZnNldDsKKwkJICBnb3Rfb2Zmc2V0ICs9IDg7CisJICAgICAgICB9CisJfQorCisgICAgICBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdC0+X3Jhd19zaXplID0gZ290X29mZnNldDsKKyAgICAgIGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fY29va2VkX3NpemUgPSBnb3Rfb2Zmc2V0OworICAgIH0KK30KKworLyogQ29uc3RydWN0cyB0aGUgZ290cy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYmZkICppLCAqZ290X2xpc3QsICpjdXJfZ290X29iajsKKyAgaW50IHNvbWV0aGluZ19jaGFuZ2VkID0gMDsKKworICBnb3RfbGlzdCA9IGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3Q7CisKKyAgLyogT24gdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgcHJldGVuZCB3ZSBoYXZlIGFuIGV4aXN0aW5nIGdvdCBsaXN0CisgICAgIGNvbnNpc3Rpbmcgb2YgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcy4gICovCisgIGlmIChnb3RfbGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoaSA9IGluZm8tPmlucHV0X2JmZHM7IGkgOyBpID0gaS0+bGlua19uZXh0KQorCXsKKwkgIGJmZCAqdGhpc19nb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGkpLT5nb3RvYmo7CisJICBpZiAodGhpc19nb3QgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgIC8qIFdlIGFyZSBhc3N1bWluZyBubyBtZXJnaW5nIGhhcyB5ZXQgb2N1cnJlZC4gICovCisJICBCRkRfQVNTRVJUICh0aGlzX2dvdCA9PSBpKTsKKworICAgICAgICAgIGlmIChhbHBoYV9lbGZfdGRhdGEgKHRoaXNfZ290KS0+dG90YWxfZ290X2VudHJpZXMgPiBNQVhfR09UX0VOVFJJRVMpCisJICAgIHsKKwkgICAgICAvKiBZaWtlcyEgQSBzaW5nbGUgb2JqZWN0IGZpbGUgaGFzIHRvbyBtYW55IGVudHJpZXMuICAqLworCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAgICAgKF8oIiVzOiAuZ290IHN1YnNlZ21lbnQgZXhjZWVkcyA2NEsgKHNpemUgJWQpIiksCisJICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaSksCisJICAgICAgICAgYWxwaGFfZWxmX3RkYXRhICh0aGlzX2dvdCktPnRvdGFsX2dvdF9lbnRyaWVzICogOCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGlmIChnb3RfbGlzdCA9PSBOVUxMKQorCSAgICBnb3RfbGlzdCA9IHRoaXNfZ290OworCSAgZWxzZQorCSAgICBhbHBoYV9lbGZfdGRhdGEoY3VyX2dvdF9vYmopLT5nb3RfbGlua19uZXh0ID0gdGhpc19nb3Q7CisJICBjdXJfZ290X29iaiA9IHRoaXNfZ290OworCX0KKworICAgICAgLyogU3RyYW5nZSBkZWdlbmVyYXRlIGNhc2Ugb2Ygbm8gZ290IHJlZmVyZW5jZXMuICAqLworICAgICAgaWYgKGdvdF9saXN0ID09IE5VTEwpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Z290X2xpc3QgPSBnb3RfbGlzdDsKKworICAgICAgLyogRm9yY2UgZ290IG9mZnNldHMgdG8gYmUgcmVjYWxjdWxhdGVkLiAgKi8KKyAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0gMTsKKyAgICB9CisKKyAgY3VyX2dvdF9vYmogPSBnb3RfbGlzdDsKKyAgaSA9IGFscGhhX2VsZl90ZGF0YShjdXJfZ290X29iaiktPmdvdF9saW5rX25leHQ7CisgIHdoaWxlIChpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzIChjdXJfZ290X29iaiwgaSkpCisJeworCSAgZWxmNjRfYWxwaGFfbWVyZ2VfZ290cyAoY3VyX2dvdF9vYmosIGkpOworCSAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dDsKKwkgIGFscGhhX2VsZl90ZGF0YShjdXJfZ290X29iaiktPmdvdF9saW5rX25leHQgPSBpOworCSAgc29tZXRoaW5nX2NoYW5nZWQgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjdXJfZ290X29iaiA9IGk7CisJICBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0OworCX0KKyAgICB9CisKKyAgLyogT25jZSB0aGUgZ290cyBoYXZlIGJlZW4gbWVyZ2VkLCBmaWxsIGluIHRoZSBnb3Qgb2Zmc2V0cyBmb3IKKyAgICAgZXZlcnl0aGluZyB0aGVyZWluLiAgKi8KKyAgaWYgKDEgfHwgc29tZXRoaW5nX2NoYW5nZWQpCisgICAgZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyAoaW5mbyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYmZkICppOworCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogRmlyc3QsIHRha2UgY2FyZSBvZiB0aGUgaW5kaXJlY3Qgc3ltYm9scyBjcmVhdGVkIGJ5IHZlcnNpb25pbmcuICAqLworICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMsCisJCQkJTlVMTCk7CisKKyAgaWYgKCFlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIC5nb3Qgc3Vic2VjdGlvbnMuICAqLworICBpID0gYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbGlzdDsKKyAgZm9yICggOyBpIDsgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqcyA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290OworICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+IDApCisJeworCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoaSwgcy0+X3Jhd19zaXplKTsKKwkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV29yayBvdXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyAoaCwgaW5mbykKKyAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICAvKiBJZiB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0CisgICAgIGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbiBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlCisgICAgIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgc3ltYm9sIGluIGEgY29tbW9uCisgICAgIHNlY3Rpb24gYnV0IHRoZSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSIGZsYWcgd2lsbCBub3QgaGF2ZSBiZWVuCisgICAgIHNldC4gIFRoaXMgaXMgZG9uZSBmb3IgZHluYW1pYyBzeW1ib2xzIGluCisgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgYnV0IHRoaXMgaXMgbm90IGRvbmUgZm9yIG5vbi1keW5hbWljCisgICAgIHN5bWJvbHMsIHNvbWVob3cuICAqLworICBpZiAoKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MKKyAgICAgICAmIChFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSCisJICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKKwkgIHwgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykpCisgICAgICAgPT0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikKKyAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICAgICYmICEoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpKQorICAgIHsKKyAgICAgIGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOworICAgIH0KKworICAvKiBJZiB0aGUgc3ltYm9sIGlzIGR5bmFtaWMsIHdlJ2xsIG5lZWQgYWxsIHRoZSByZWxvY2F0aW9ucyBpbiB0aGVpcgorICAgICBuYXR1cmFsIGZvcm0uICBJZiB0aGlzIGlzIGEgc2hhcmVkIG9iamVjdCwgYW5kIGl0IGhhcyBiZWVuIGZvcmNlZAorICAgICBsb2NhbCwgd2UnbGwgbmVlZCB0aGUgc2FtZSBudW1iZXIgb2YgUkVMQVRJVkUgcmVsb2NhdGlvbnMuICAqLworCisgIGlmIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pIHx8IGluZm8tPnNoYXJlZCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX3JlbG9jX2VudHJ5ICpyZWxlbnQ7CisgICAgICBiZmQgKmR5bm9iajsKKyAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7CisgICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworICAgICAgYXNlY3Rpb24gKnNyZWw7CisKKyAgICAgIGZvciAocmVsZW50ID0gaC0+cmVsb2NfZW50cmllczsgcmVsZW50OyByZWxlbnQgPSByZWxlbnQtPm5leHQpCisJaWYgKHJlbGVudC0+cnR5cGUgPT0gUl9BTFBIQV9SRUZMT05HCisJICAgIHx8IHJlbGVudC0+cnR5cGUgPT0gUl9BTFBIQV9SRUZRVUFEKQorCSAgeworCSAgICByZWxlbnQtPnNyZWwtPl9yYXdfc2l6ZSArPQorCSAgICAgIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHJlbGVudC0+Y291bnQ7CisJICB9CisKKyAgICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7CisgICAgICBjb3VudCA9IDA7CisKKyAgICAgIGZvciAoZ290ZW50ID0gaC0+Z290X2VudHJpZXM7IGdvdGVudCA7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKKwljb3VudCsrOworCisgICAgICAvKiBJZiB3ZSBhcmUgdXNpbmcgYSAucGx0IGVudHJ5LCBzdWJ0cmFjdCBvbmUsIGFzIHRoZSBmaXJzdAorCSByZWZlcmVuY2UgdXNlcyBhIC5yZWxhLnBsdCBlbnRyeSBpbnN0ZWFkLiAgKi8KKyAgICAgIGlmIChoLT5yb290LnBsdC5vZmZzZXQgIT0gTUlOVVNfT05FKQorCWNvdW50LS07CisKKyAgICAgIGlmIChjb3VudCA+IDApCisJeworCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKwkgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7CisJICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIGNvdW50OworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKnM7CisgIGJvb2xlYW4gcmVsdGV4dDsKKyAgYm9vbGVhbiByZWxwbHQ7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKKyAgQkZEX0FTU0VSVChkeW5vYmogIT0gTlVMTCk7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLworICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCisJeworCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7CisJICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOworCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKKwl9CisKKyAgICAgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNlZW4gYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgd2UgY2FuIGRlY2lkZSB3aGljaAorCSBzeW1ib2xzIG5lZWQgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMgYW5kIHdoaWNoIGRvbid0LiAgV2UndmUKKwkgY29sbGVjdGVkIGluZm9ybWF0aW9uIGluIGNoZWNrX3JlbG9jcyB0aGF0IHdlIGNhbiBub3cgYXBwbHkgdG8KKwkgc2l6ZSB0aGUgZHluYW1pYyByZWxvY2F0aW9uIHNlY3Rpb25zLiAgKi8KKyAgICAgIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkgICAgZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMsCisJCQkJICAgIGluZm8pOworCisgICAgICAvKiBXaGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGVhY2ggbG9jYWwgLmdvdCBlbnRyeSBuZWVkcyBhCisJIFJFTEFUSVZFIHJlbG9jLiAgKi8KKyAgICAgIGlmIChpbmZvLT5zaGFyZWQpCisJeworCSAgYmZkICppOworCSAgYXNlY3Rpb24gKnNyZWw7CisJICBiZmRfc2l6ZV90eXBlIGNvdW50OworCisJICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCSAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKKworCSAgZm9yIChpID0gYWxwaGFfZWxmX2hhc2hfdGFibGUoaW5mbyktPmdvdF9saXN0LCBjb3VudCA9IDA7CisJICAgICAgIGkgIT0gTlVMTDsKKwkgICAgICAgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKKwkgICAgY291bnQgKz0gYWxwaGFfZWxmX3RkYXRhKGkpLT5uX2xvY2FsX2dvdF9lbnRyaWVzOworCisJICBzcmVsLT5fcmF3X3NpemUgKz0gY291bnQgKiBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7CisJfQorICAgIH0KKyAgLyogZWxzZSB3ZSdyZSBub3QgZHluYW1pYyBhbmQgYnkgZGVmaW5pdGlvbiB3ZSBkb24ndCBuZWVkIHN1Y2ggdGhpbmdzLiAgKi8KKworICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKKyAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCisgICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCisgIHJlbHRleHQgPSBmYWxzZTsKKyAgcmVscGx0ID0gZmFsc2U7CisgIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIGJvb2xlYW4gc3RyaXA7CisKKyAgICAgIGlmICghKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSkKKwljb250aW51ZTsKKworICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKKwkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCisgICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7CisKKyAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KKwkgVGhpcyBpcyB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZCAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBpdAorCSBpbiBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSBpdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlCisJIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMuICBUaGUKKwkgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kCisJIGl0IGlzIHRoYXQgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvCisJIGdvIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLworCisgICAgICBzdHJpcCA9IGZhbHNlOworCisgICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKKwl7CisJICBzdHJpcCA9IChzLT5fcmF3X3NpemUgPT0gMCk7CisKKwkgIGlmICghc3RyaXApCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpvdXRuYW1lOworCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7CisKKwkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5CisJCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KKwkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCisJCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKKwkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOworCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAorCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCisJCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisJCXJlbHRleHQgPSB0cnVlOworCisJICAgICAgaWYgKHN0cmNtcChuYW1lLCAiLnJlbGEucGx0IikgPT0gMCkKKwkJcmVscGx0ID0gdHJ1ZTsKKworCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKKwkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKwkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgIT0gMCkKKwl7CisJICAvKiBJdCdzIG5vdCBvbmUgb2Ygb3VyIGR5bmFtaWMgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmlwKQorCV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7CisgICAgICBlbHNlCisJeworCSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisJICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKKwkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KKyAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoCisgICAgIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgorICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQorICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgbG9uZyBjWzJdLCBpOworICAgICAgYXNlY3Rpb24gKnA7CisKKyAgICAgIGNbMF0gPSAwOworICAgICAgY1sxXSA9IGJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCk7CisKKyAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gY1sxXTsKKyAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlKGluZm8pLAorCQkJICAgICAgZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmluZHgsCisJCQkgICAgICAoUFRSKSBjKTsKKworICAgICAgZm9yIChpID0gMSwgcCA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOworCSAgIHAgIT0gTlVMTDsKKwkgICBwID0gcC0+bmV4dCwgaSsrKQorCXsKKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHApLT5keW5pbmR4ID0gaTsKKwkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisJICAgICBmaWRkbGUgd2l0aCBkeW5zdHJfaW5kZXguICAqLworCX0KKyAgICB9CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQorCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKKwkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCisJIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKKwkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KKyAgICAgIGlmICghaW5mby0+c2hhcmVkKQorCXsKKwkgIGlmICghYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChyZWxwbHQpCisJeworCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKKwkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUxBKQorCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9KTVBSRUwsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCisJICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQorCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCisJCQkJCSAgICBzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKHJlbHRleHQpCisJeworCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEluY3JlbWVudCB0aGUgaW5kZXggb2YgYSBkeW5hbWljIHN5bWJvbCBieSBhIGdpdmVuIGFtb3VudC4gIENhbGxlZAorICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQorICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGNwYXJnOworeworICBsb25nICpjcCA9IChsb25nICopY3Bhcmc7CisKKyAgaWYgKGgtPmR5bmluZHggPj0gY3BbMF0pCisgICAgaC0+ZHluaW5keCArPSBjcFsxXTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVsb2NhdGUgYW4gQWxwaGEgRUxGIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKKyAgYXNlY3Rpb24gKnNlYywgKnNnb3QsICpzcmVsLCAqc3JlbGdvdDsKKyAgYmZkICpkeW5vYmosICpnb3RvYmo7CisgIGJmZF92bWEgZ3A7CisKKyAgc3JlbGdvdCA9IHNyZWwgPSBOVUxMOworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIGlmIChkeW5vYmopCisgICAgeworICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICB9CisKKyAgLyogRmluZCB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgaW5wdXQgYmZkLiAgKi8KKyAgc2dvdCA9IE5VTEw7CisgIGdwID0gMDsKKyAgZ290b2JqID0gYWxwaGFfZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5nb3RvYmo7CisgIGlmIChnb3RvYmopCisgICAgeworICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoZ290b2JqKS0+Z290OworICAgICAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoZ290b2JqKTsKKyAgICAgIGlmIChncCA9PSAwKQorCXsKKwkgIGdwID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCSsgMHg4MDAwKTsKKwkgIF9iZmRfc2V0X2dwX3ZhbHVlIChnb3RvYmosIGdwKTsKKwl9CisgICAgfQorCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgIGJmZF92bWEgYWRkZW5kOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7CisKKyAgICAgIHJfdHlwZSA9IEVMRjY0X1JfVFlQRShyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9BTFBIQV9tYXgpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaG93dG8gPSBlbGY2NF9hbHBoYV9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyk7CisKKyAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJeworCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKKwkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQorCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJICAgIHsKKwkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7CisJICAgICAgaWYgKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCXsKKwkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOworCQl9CisJICAgIH0KKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCisKKyAgICAgIGggPSBOVUxMOworICAgICAgc3ltID0gTlVMTDsKKyAgICAgIHNlYyA9IE5VTEw7CisKKyAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCisJeworCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOworCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkrIHN5bS0+c3RfdmFsdWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gYWxwaGFfZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKworCSAgd2hpbGUgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKKworCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgeworCSAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworCisjaWYgcnRoX25vdGRlZgorCSAgICAgIGlmICgocl90eXBlID09IFJfQUxQSEFfTElURVJBTAorCQkgICAmJiBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJCSAgICYmICghaW5mby0+c2hhcmVkCisJCSAgICAgICB8fCAhaW5mby0+c3ltYm9saWMKKwkJICAgICAgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCisJCSAgfHwgKGluZm8tPnNoYXJlZAorCQkgICAgICAmJiAoIWluZm8tPnN5bWJvbGljCisJCQkgIHx8ICEoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKKwkJICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQorCQkgICAgICAmJiAocl90eXBlID09IFJfQUxQSEFfUkVGTE9ORworCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9SRUZRVUFECisJCQkgIHx8IHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwpKSkKKwkJeworCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgorCQkgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcworCQkgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KKwkJICByZWxvY2F0aW9uID0gMDsKKwkJfQorI2Vsc2UKKwkgICAgICAvKiBGSVhNRTogQXJlIG5vdCB0aGVzZSBvYnNjdXJlIGNhc2VzIHNpbXBseSBidWdzPyAgTGV0J3MKKwkJIGdldCBzb21ldGhpbmcgd29ya2luZyBhbmQgY29tZSBiYWNrIHRvIHRoaXMuICAqLworCSAgICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCisJCXJlbG9jYXRpb24gPSAwOworI2VuZGlmIC8qIHJ0aF9ub3RkZWYgKi8KKwkgICAgICBlbHNlCisJCXsKKwkJICByZWxvY2F0aW9uID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQorCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKKwkJICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICByZWxvY2F0aW9uID0gMDsKKwkgICAgfQorCX0KKyAgICAgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CisKKyAgICAgIHN3aXRjaCAocl90eXBlKQorCXsKKwljYXNlIFJfQUxQSEFfR1BESVNQOgorCSAgeworCSAgICBiZmRfYnl0ZSAqcF9sZGFoLCAqcF9sZGE7CisKKwkgICAgQkZEX0FTU0VSVChncCAhPSAwKTsKKworCSAgICByZWxvY2F0aW9uID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCQkgICsgcmVsLT5yX29mZnNldCk7CisKKwkgICAgcF9sZGFoID0gY29udGVudHMgKyByZWwtPnJfb2Zmc2V0IC0gaW5wdXRfc2VjdGlvbi0+dm1hOworCSAgICBwX2xkYSA9IHBfbGRhaCArIHJlbC0+cl9hZGRlbmQ7CisKKwkgICAgciA9IGVsZjY0X2FscGhhX2RvX3JlbG9jX2dwZGlzcCAoaW5wdXRfYmZkLCBncCAtIHJlbG9jYXRpb24sCisJCQkJCSAgICAgcF9sZGFoLCBwX2xkYSk7CisJICB9CisJICBicmVhazsKKworCWNhc2UgUl9BTFBIQV9PUF9QVVNIOgorCWNhc2UgUl9BTFBIQV9PUF9TVE9SRToKKwljYXNlIFJfQUxQSEFfT1BfUFNVQjoKKwljYXNlIFJfQUxQSEFfT1BfUFJTSElGVDoKKwkgIC8qIFdlIGhhdGUgdGhlc2Ugc2lsbHkgYmVhc3RzLiAgKi8KKwkgIGFib3J0KCk7CisKKwljYXNlIFJfQUxQSEFfTElURVJBTDoKKwkgIHsKKwkgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKKwkgICAgYm9vbGVhbiBkeW5hbWljX3N5bWJvbDsKKworCSAgICBCRkRfQVNTRVJUKHNnb3QgIT0gTlVMTCk7CisJICAgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7CisKKwkgICAgaWYgKGggIT0gTlVMTCkKKwkgICAgICB7CisJCWdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOworCQlkeW5hbWljX3N5bWJvbCA9IGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbyk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlnb3RlbnQgPSAoYWxwaGFfZWxmX3RkYXRhKGlucHV0X2JmZCktPgorCQkJICBsb2NhbF9nb3RfZW50cmllc1tyX3N5bW5keF0pOworCQlkeW5hbWljX3N5bWJvbCA9IGZhbHNlOworCSAgICAgIH0KKworCSAgICBCRkRfQVNTRVJUKGdvdGVudCAhPSBOVUxMKTsKKworCSAgICB3aGlsZSAoZ290ZW50LT5nb3RvYmogIT0gZ290b2JqIHx8IGdvdGVudC0+YWRkZW5kICE9IGFkZGVuZCkKKwkgICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7CisKKwkgICAgQkZEX0FTU0VSVChnb3RlbnQtPnVzZV9jb3VudCA+PSAxKTsKKworCSAgICAvKiBJbml0aWFsaXplIHRoZSAuZ290IGVudHJ5J3MgdmFsdWUuICAqLworCSAgICBpZiAoIShnb3RlbnQtPmZsYWdzICYgQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORSkpCisJICAgICAgeworCQliZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uK2FkZGVuZCwKKwkJCSAgICBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7CisKKwkJLyogSWYgdGhlIHN5bWJvbCBoYXMgYmVlbiBmb3JjZWQgbG9jYWwsIG91dHB1dCBhCisJCSAgIFJFTEFUSVZFIHJlbG9jLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBoYW5kbGVkIGluCisJCSAgIGZpbmlzaF9keW5hbWljX3N5bWJvbC4gICovCisJCWlmIChpbmZvLT5zaGFyZWQgJiYgIWR5bmFtaWNfc3ltYm9sKQorCQkgIHsKKwkJICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKKworCQkgICAgQkZEX0FTU0VSVChzcmVsZ290ICE9IE5VTEwpOworCisJCSAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJCQkgICAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOworCQkgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKKwkJICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7CisKKwkJICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJCSAgICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKKwkJCQkJICAgICAgICBzcmVsZ290LT5jb250ZW50cykKKwkJCQkJICAgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQrKyk7CisJCSAgICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkKKwkJCQkqIHNyZWxnb3QtPnJlbG9jX2NvdW50CisJCQkJPD0gc3JlbGdvdC0+X2Nvb2tlZF9zaXplKTsKKwkJICB9CisKKwkJZ290ZW50LT5mbGFncyB8PSBBTFBIQV9FTEZfR09UX0VOVFJZX1JFTE9DU19ET05FOworCSAgICAgIH0KKworCSAgICAvKiBGaWd1cmUgdGhlIGdwcmVsIHJlbG9jYXRpb24uICAqLworCSAgICBhZGRlbmQgPSAwOworCSAgICByZWxvY2F0aW9uID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCQkgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKKwkgICAgcmVsb2NhdGlvbiAtPSBncDsKKwkgIH0KKwkgIC8qIG92ZXJmbG93IGhhbmRsZWQgYnkgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlICovCisJICBnb3RvIGRlZmF1bHRfcmVsb2M7CisKKwljYXNlIFJfQUxQSEFfR1BSRUwzMjoKKwljYXNlIFJfQUxQSEFfR1BSRUxMT1c6CisJICBCRkRfQVNTRVJUKGdwICE9IDApOworCSAgcmVsb2NhdGlvbiAtPSBncDsKKwkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKKworCWNhc2UgUl9BTFBIQV9HUFJFTEhJR0g6CisJICBCRkRfQVNTRVJUKGdwICE9IDApOworCSAgcmVsb2NhdGlvbiAtPSBncDsKKwkgIHJlbG9jYXRpb24gKz0gYWRkZW5kOworCSAgYWRkZW5kID0gMDsKKwkgIHJlbG9jYXRpb24gPSAoKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PiAxNikKKwkJCSsgKChyZWxvY2F0aW9uID4+IDE1KSAmIDEpKTsKKwkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKKworCWNhc2UgUl9BTFBIQV9CUkFERFI6CisJY2FzZSBSX0FMUEhBX0hJTlQ6CisJICAvKiBUaGUgcmVndWxhciBQQy1yZWxhdGl2ZSBzdHVmZiBtZWFzdXJlcyBmcm9tIHRoZSBzdGFydCBvZgorCSAgICAgdGhlIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHRoZSBlbmQuICAqLworCSAgYWRkZW5kIC09IDQ7CisJICBnb3RvIGRlZmF1bHRfcmVsb2M7CisKKwljYXNlIFJfQUxQSEFfUkVGTE9ORzoKKwljYXNlIFJfQUxQSEFfUkVGUVVBRDoKKwkgIHsKKwkgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOworCSAgICBib29sZWFuIHNraXA7CisKKwkgICAgLyogQ2FyZWZ1bCBoZXJlIHRvIHJlbWVtYmVyIFJFTEFUSVZFIHJlbG9jYXRpb25zIGZvciBnbG9iYWwKKwkgICAgICAgdmFyaWFibGVzIGZvciBzeW1ib2xpYyBzaGFyZWQgb2JqZWN0cy4gICovCisKKwkgICAgaWYgKGggJiYgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBpbmZvKSkKKwkgICAgICB7CisJCUJGRF9BU1NFUlQoaC0+cm9vdC5keW5pbmR4ICE9IC0xKTsKKwkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyhoLT5yb290LmR5bmluZHgsIHJfdHlwZSk7CisJCW91dHJlbC5yX2FkZGVuZCA9IGFkZGVuZDsKKwkJYWRkZW5kID0gMCwgcmVsb2NhdGlvbiA9IDA7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChpbmZvLT5zaGFyZWQpCisJICAgICAgeworCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOworCQlvdXRyZWwucl9hZGRlbmQgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIGdvdG8gZGVmYXVsdF9yZWxvYzsKKworCSAgICBpZiAoIXNyZWwpCisJICAgICAgeworCQljb25zdCBjaGFyICpuYW1lOworCisJCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgorCQkJKGlucHV0X2JmZCwgZWxmX2VsZmhlYWRlcihpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAorCQkJIGVsZl9zZWN0aW9uX2RhdGEoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOworCQlCRkRfQVNTRVJUKG5hbWUgIT0gTlVMTCk7CisKKwkJc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOworCQlCRkRfQVNTRVJUKHNyZWwgIT0gTlVMTCk7CisJICAgICAgfQorCisJICAgIHNraXAgPSBmYWxzZTsKKworCSAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQorCSAgICAgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWJmZF92bWEgb2ZmOworCisJCW9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKKwkJICAgICAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCisJCQlpbnB1dF9zZWN0aW9uLAorCQkJJmVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8sCisJCQlyZWwtPnJfb2Zmc2V0KSk7CisJCWlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQorCQkgIHNraXAgPSB0cnVlOworCQlvdXRyZWwucl9vZmZzZXQgPSBvZmY7CisJICAgICAgfQorCisJICAgIGlmICghIHNraXApCisJICAgICAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworCSAgICBlbHNlCisJICAgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKKworCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAorCQkJCSAgICAgICAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKKwkJCQkJc3JlbC0+Y29udGVudHMpCisJCQkJICAgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKyk7CisJICAgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50CisJCQk8PSBzcmVsLT5fY29va2VkX3NpemUpOworCSAgfQorCSAgZ290byBkZWZhdWx0X3JlbG9jOworCisJZGVmYXVsdDoKKwlkZWZhdWx0X3JlbG9jOgorCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKKwkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsIHJlbG9jYXRpb24sCisJCQkJCWFkZGVuZCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIHN3aXRjaCAocikKKwl7CisJY2FzZSBiZmRfcmVsb2Nfb2s6CisJICBicmVhazsKKworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCisJICAgIGlmIChoICE9IE5VTEwpCisJICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKKwkJaWYgKG5hbWUgPT0gTlVMTCkKKwkJICByZXR1cm4gZmFsc2U7CisJCWlmICgqbmFtZSA9PSAnXDAnKQorCQkgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7CisJICAgICAgfQorCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAorCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKKyAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOworCisgIGlmIChoLT5wbHQub2Zmc2V0ICE9IE1JTlVTX09ORSkKKyAgICB7CisgICAgICAvKiBGaWxsIGluIHRoZSAucGx0IGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gICovCisgICAgICBhc2VjdGlvbiAqc3BsdCwgKnNnb3QsICpzcmVsOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOworICAgICAgYmZkX3ZtYSBnb3RfYWRkciwgcGx0X2FkZHI7CisgICAgICBiZmRfdm1hIHBsdF9pbmRleDsKKyAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7CisKKyAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOworCisgICAgICAvKiBUaGUgZmlyc3QgLmdvdCBlbnRyeSB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIC5wbHQgd2l0aCB0aGUKKwkgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KKyAgICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmdvdF9lbnRyaWVzOworICAgICAgQkZEX0FTU0VSVCAoZ290ZW50ICYmIGdvdGVudC0+YWRkZW5kID09IDApOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7CisgICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKKyAgICAgIHNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290OworICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKworICAgICAgZ290X2FkZHIgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAorCQkgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKKyAgICAgIHBsdF9hZGRyID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICArIHNwbHQtPm91dHB1dF9vZmZzZXQKKwkJICArIGgtPnBsdC5vZmZzZXQpOworCisgICAgICBwbHRfaW5kZXggPSAoaC0+cGx0Lm9mZnNldCAtIFBMVF9IRUFERVJfU0laRSkgLyBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyAgICAgIHsKKwl1bnNpZ25lZCBpbnNuMSwgaW5zbjIsIGluc24zOworCisJaW5zbjEgPSBQTFRfRU5UUllfV09SRDEgfCAoKC0oaC0+cGx0Lm9mZnNldCArIDQpID4+IDIpICYgMHgxZmZmZmYpOworCWluc24yID0gUExUX0VOVFJZX1dPUkQyOworCWluc24zID0gUExUX0VOVFJZX1dPUkQzOworCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjEsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCk7CisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbjIsIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOworCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24zLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA4KTsKKyAgICAgIH0KKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KKyAgICAgIG91dHJlbC5yX29mZnNldCA9IGdvdF9hZGRyOworICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyhoLT5keW5pbmR4LCBSX0FMUEhBX0pNUF9TTE9UKTsKKyAgICAgIG91dHJlbC5yX2FkZGVuZCA9IDA7CisKKyAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKXNyZWwtPmNvbnRlbnRzCisJCQkJICArIHBsdF9pbmRleCkpOworCisgICAgICBpZiAoIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCisJeworCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbiB0aGUKKwkgICAgIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCisJICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOworCX0KKworICAgICAgLyogRmlsbCBpbiB0aGUgZW50cmllcyBpbiB0aGUgLmdvdC4gICovCisgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCBwbHRfYWRkciwgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOworCisgICAgICAvKiBTdWJzZXF1ZW50IC5nb3QgZW50cmllcyB3aWxsIGNvbnRpbnVlIHRvIGJvdW5jZSB0aHJvdWdoIHRoZSAucGx0LiAgKi8KKyAgICAgIGlmIChnb3RlbnQtPm5leHQpCisJeworCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKwkgIEJGRF9BU1NFUlQgKCEgaW5mby0+c2hhcmVkIHx8IHNyZWwgIT0gTlVMTCk7CisKKwkgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKKwkgIGRvCisJICAgIHsKKwkgICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGdvdGVudC0+Z290b2JqKS0+Z290OworCSAgICAgIEJGRF9BU1NFUlQoc2dvdCAhPSBOVUxMKTsKKwkgICAgICBCRkRfQVNTRVJUKGdvdGVudC0+YWRkZW5kID09IDApOworCisJICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcGx0X2FkZHIsCisJCSAgICAgICAgICBzZ290LT5jb250ZW50cyArIGdvdGVudC0+Z290X29mZnNldCk7CisKKwkgICAgICBpZiAoaW5mby0+c2hhcmVkKQorCQl7CisJCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAorCQkJCSAgICAgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOworCQkgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7CisJCSAgb3V0cmVsLnJfYWRkZW5kID0gMDsKKworCQkgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJCSAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCisJCQkJCSAgICAgIHNyZWwtPmNvbnRlbnRzKQorCQkJCQkgICAgICsgc3JlbC0+cmVsb2NfY291bnQrKyk7CisJCSAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogc3JlbC0+cmVsb2NfY291bnQKKwkJCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7CisJCX0KKworCSAgICAgIGdvdGVudCA9IGdvdGVudC0+bmV4dDsKKwkgICAgfQorICAgICAgICAgIHdoaWxlIChnb3RlbnQgIT0gTlVMTCk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKGgsIGluZm8pKQorICAgIHsKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgZm9yIHRoaXMgc3ltYm9sJ3MgLmdvdCBlbnRyaWVzLiAgKi8KKyAgICAgIGFzZWN0aW9uICpzcmVsOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOworICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKKworICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7CisKKyAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfQUxQSEFfR0xPQl9EQVQpOworICAgICAgZm9yIChnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5nb3RfZW50cmllczsKKwkgICBnb3RlbnQgIT0gTlVMTDsKKwkgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCisJeworCSAgYXNlY3Rpb24gKnNnb3QgPSBhbHBoYV9lbGZfdGRhdGEgKGdvdGVudC0+Z290b2JqKS0+Z290OworCSAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKKwkgIG91dHJlbC5yX2FkZGVuZCA9IGdvdGVudC0+YWRkZW5kOworCisJICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAorCQkJCSAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopc3JlbC0+Y29udGVudHMKKwkJCQkgICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspKTsKKwkgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50CisJCSAgICAgIDw9IHNyZWwtPl9jb29rZWRfc2l6ZSk7CisJfQorICAgIH0KKworICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCisgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQorICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqZHlub2JqOworICBhc2VjdGlvbiAqc2R5bjsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOworCisgICAgICBkeW5jb24gPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOworICAgICAgZHluY29uZW5kID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOworICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCisJeworCSAgRWxmX0ludGVybmFsX0R5biBkeW47CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgYXNlY3Rpb24gKnM7CisKKwkgIGJmZF9lbGY2NF9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOworCisJICBzd2l0Y2ggKGR5bi5kX3RhZykKKwkgICAgeworCSAgICBjYXNlIERUX1BMVEdPVDoKKwkgICAgICBuYW1lID0gIi5wbHQiOworCSAgICAgIGdvdG8gZ2V0X3ZtYTsKKwkgICAgY2FzZSBEVF9QTFRSRUxTWjoKKwkgICAgICBuYW1lID0gIi5yZWxhLnBsdCI7CisJICAgICAgZ290byBnZXRfc2l6ZTsKKwkgICAgY2FzZSBEVF9KTVBSRUw6CisJICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOworCSAgICAgIGdvdG8gZ2V0X3ZtYTsKKworCSAgICBjYXNlIERUX1JFTEFTWjoKKwkgICAgICAvKiBNeSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVElTIHYxLjEgRUxGIGRvY3VtZW50IGluZGljYXRlcworCQkgdGhhdCBSRUxBU1ogc2hvdWxkIG5vdCBpbmNsdWRlIEpNUFJFTC4gIFRoaXMgaXMgbm90IHdoYXQKKwkJIHRoZSByZXN0IG9mIHRoZSBCRkQgZG9lcy4gIEl0IGlzLCBob3dldmVyLCB3aGF0IHRoZQorCQkgZ2xpYmMgbGQuc28gd2FudHMuICBEbyB0aGlzIGZpeHVwIGhlcmUgdW50aWwgd2UgZm91bmQKKwkJIG91dCB3aG8gaXMgcmlnaHQuICAqLworCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWxhLnBsdCIpOworCSAgICAgIGlmIChzKQorCQl7CisJCSAgZHluLmRfdW4uZF92YWwgLT0KKwkJICAgIChzLT5fY29va2VkX3NpemUgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgZ2V0X3ZtYToKKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOworCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gKHMgPyBzLT52bWEgOiAwKTsKKwkgICAgICBicmVhazsKKworCSAgICBnZXRfc2l6ZToKKwkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOworCSAgICAgIGR5bi5kX3VuLmRfdmFsID0KKwkJKHMtPl9jb29rZWRfc2l6ZSA/IHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwl9CisKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIFBMVDAgZW50cnkgKi8KKyAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPiAwKQorCXsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDEsIHNwbHQtPmNvbnRlbnRzKTsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDIsIHNwbHQtPmNvbnRlbnRzICsgNCk7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQzLCBzcGx0LT5jb250ZW50cyArIDgpOworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JENCwgc3BsdC0+Y29udGVudHMgKyAxMik7CisKKwkgIC8qIFRoZSBuZXh0IHR3byB3b3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBieSBsZC5zbyAqLworCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgMCwgc3BsdC0+Y29udGVudHMgKyAxNik7CisJICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCAwLCBzcGx0LT5jb250ZW50cyArIDI0KTsKKworCSAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0KKwkgICAgUExUX0hFQURFUl9TSVpFOworCX0KKyAgICB9CisKKyAgaWYgKGluZm8tPnNoYXJlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2R5bnN5bTsKKyAgICAgIGFzZWN0aW9uICpzOworICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07CisKKyAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KKworICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7CisgICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOworCisgICAgICBzeW0uc3Rfc2l6ZSA9IDA7CisgICAgICBzeW0uc3RfbmFtZSA9IDA7CisgICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKKyAgICAgIHN5bS5zdF9vdGhlciA9IDA7CisKKyAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGludCBpbmR4OworCisJICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7CisKKwkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7CisJICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7CisJICBzeW0uc3Rfc2huZHggPSBpbmR4OworCisJICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAorCQkJCSAgICAgKFBUUikgKCgoRWxmNjRfRXh0ZXJuYWxfU3ltICopCisJCQkJCSAgICAgc2R5bnN5bS0+Y29udGVudHMpCisJCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4KSk7CisJfQorCisgICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCisgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCisgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPQorCWJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCkgKyAxOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGxpbmsgcm91dGluZSB0byBoYW5kbGUgdGhlIC5yZWdpbmZvIGFuZAorICAgdGhlIC5tZGVidWcgc2VjdGlvbnMuICBXZSBuZWVkIHRvIG1lcmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlc2UKKyAgIHNlY3Rpb25zIHRvZ2V0aGVyLCBub3Qgd3JpdGUgdGhlbSBhbGwgb3V0IHNlcXVlbnRpYWxseS4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGY2NF9hbHBoYV9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqbzsKKyAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICBhc2VjdGlvbiAqcmVnaW5mb19zZWMsICptZGVidWdfc2VjLCAqZ3B0YWJfZGF0YV9zZWMsICpncHRhYl9ic3Nfc2VjOworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1ZzsKKyAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAKKyAgICA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKKyAgSERSUiAqc3ltaGRyID0gJmRlYnVnLnN5bWJvbGljX2hlYWRlcjsKKyAgUFRSIG1kZWJ1Z19oYW5kbGUgPSBOVUxMOworCisjaWYgMAorCSAgICAgIGlmICgrK25nb3RzID09IDIpCisJCXsKKwkJICAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKKwkJICAgIChpbmZvLCBfKCJ1c2luZyBtdWx0aXBsZSBncCB2YWx1ZXMiKSwgKGNoYXIgKikgTlVMTCwKKwkJICAgICBvdXRwdXRfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApOworCQl9CisjZW5kaWYKKworICAvKiBHbyB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY29sbGVjdCB0aGUgLnJlZ2luZm8gYW5kIC5tZGVidWcKKyAgICAgaW5mb3JtYXRpb24uICAqLworICByZWdpbmZvX3NlYyA9IE5VTEw7CisgIG1kZWJ1Z19zZWMgPSBOVUxMOworICBncHRhYl9kYXRhX3NlYyA9IE5VTEw7CisgIGdwdGFiX2Jzc19zZWMgPSBOVUxMOworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworI2lmZGVmIEVSSUNfbmV2ZXJkZWYKKyAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucmVnaW5mbyIpID09IDApCisJeworCSAgbWVtc2V0ICgmcmVnaW5mbywgMCwgc2l6ZW9mIHJlZ2luZm8pOworCisJICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAucmVnaW5mbyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KKwkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCisJICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLworCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOworCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKwkgICAgICAgcCA9IHAtPm5leHQpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKwkgICAgICBiZmQgKmlucHV0X2JmZDsKKwkgICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKKwkgICAgICBFbGY2NF9SZWdJbmZvIHN1YjsKKworCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCQl7CisJCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKKwkJICAgIGNvbnRpbnVlOworCQkgIGFib3J0ICgpOworCQl9CisKKwkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOworCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOworCisJICAgICAgLyogVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBoYXMgcHJvYmFibHkgY2xvYmJlcmVkIHRoZQorICAgICAgICAgICAgICAgICBzaXplIHRvIGJlIHplcm8gYnl0ZXMuICAqLworCSAgICAgIGlmIChpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKKwkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKKworCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQkgICAgICAoUFRSKSAmZXh0LAorCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCisJCQkJCSAgICAgIHNpemVvZiBleHQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX2luIChpbnB1dF9iZmQsICZleHQsICZzdWIpOworCisJICAgICAgcmVnaW5mby5yaV9ncHJtYXNrIHw9IHN1Yi5yaV9ncHJtYXNrOworCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1swXSB8PSBzdWIucmlfY3BybWFza1swXTsKKwkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMV0gfD0gc3ViLnJpX2Nwcm1hc2tbMV07CisJICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzJdIHw9IHN1Yi5yaV9jcHJtYXNrWzJdOworCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1szXSB8PSBzdWIucmlfY3BybWFza1szXTsKKworCSAgICAgIC8qIHJpX2dwX3ZhbHVlIGlzIHNldCBieSB0aGUgZnVuY3Rpb24KKwkJIGFscGhhX2VsZl9zZWN0aW9uX3Byb2Nlc3Npbmcgd2hlbiB0aGUgc2VjdGlvbiBpcworCQkgZmluYWxseSB3cml0dGVuIG91dC4gICovCisKKwkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKKwkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCisJICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7CisJICAgIH0KKworCSAgLyogRm9yY2UgdGhlIHNlY3Rpb24gc2l6ZSB0byB0aGUgdmFsdWUgd2Ugd2FudC4gICovCisJICBvLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOworCisJICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQorCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KKwkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKworCSAgcmVnaW5mb19zZWMgPSBvOworCX0KKyNlbmRpZgorCisgICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLm1kZWJ1ZyIpID09IDApCisJeworCSAgc3RydWN0IGV4dHN5bV9pbmZvIGVpbmZvOworCisJICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAubWRlYnVnIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgorCSAgICAgTG9vayB0aHJvdWdoIGFsbCB0aGUgbGlua19vcmRlcnMgY29tcHJpc2luZyBpdCBhbmQgbWVyZ2UKKwkgICAgIHRoZSBpbmZvcm1hdGlvbiB0b2dldGhlci4gICovCisJICBzeW1oZHItPm1hZ2ljID0gc3dhcC0+c3ltX21hZ2ljOworCSAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHRoZSB2ZXJzaW9uIHN0YW1wIGJlPyAgKi8KKwkgIHN5bWhkci0+dnN0YW1wID0gMDsKKwkgIHN5bWhkci0+aWxpbmVNYXggPSAwOworCSAgc3ltaGRyLT5jYkxpbmUgPSAwOworCSAgc3ltaGRyLT5pZG5NYXggPSAwOworCSAgc3ltaGRyLT5pcGRNYXggPSAwOworCSAgc3ltaGRyLT5pc3ltTWF4ID0gMDsKKwkgIHN5bWhkci0+aW9wdE1heCA9IDA7CisJICBzeW1oZHItPmlhdXhNYXggPSAwOworCSAgc3ltaGRyLT5pc3NNYXggPSAwOworCSAgc3ltaGRyLT5pc3NFeHRNYXggPSAwOworCSAgc3ltaGRyLT5pZmRNYXggPSAwOworCSAgc3ltaGRyLT5jcmZkID0gMDsKKwkgIHN5bWhkci0+aWV4dE1heCA9IDA7CisKKwkgIC8qIFdlIGFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpdHNlbGYgaW4gdGhlCisJICAgICBkZWJ1Z19pbmZvIHN0cnVjdHVyZS4gICovCisJICBkZWJ1Zy5saW5lID0gTlVMTDsKKwkgIGRlYnVnLmV4dGVybmFsX2RuciA9IE5VTEw7CisJICBkZWJ1Zy5leHRlcm5hbF9wZHIgPSBOVUxMOworCSAgZGVidWcuZXh0ZXJuYWxfc3ltID0gTlVMTDsKKwkgIGRlYnVnLmV4dGVybmFsX29wdCA9IE5VTEw7CisJICBkZWJ1Zy5leHRlcm5hbF9hdXggPSBOVUxMOworCSAgZGVidWcuc3MgPSBOVUxMOworCSAgZGVidWcuc3NleHQgPSBkZWJ1Zy5zc2V4dF9lbmQgPSBOVUxMOworCSAgZGVidWcuZXh0ZXJuYWxfZmRyID0gTlVMTDsKKwkgIGRlYnVnLmV4dGVybmFsX3JmZCA9IE5VTEw7CisJICBkZWJ1Zy5leHRlcm5hbF9leHQgPSBkZWJ1Zy5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKKworCSAgbWRlYnVnX2hhbmRsZSA9IGJmZF9lY29mZl9kZWJ1Z19pbml0IChhYmZkLCAmZGVidWcsIHN3YXAsIGluZm8pOworCSAgaWYgKG1kZWJ1Z19oYW5kbGUgPT0gKFBUUikgTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAoMSkKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzOworCSAgICAgIEVYVFIgZXN5bTsKKwkgICAgICBiZmRfdm1hIGxhc3Q7CisJICAgICAgdW5zaWduZWQgaW50IGk7CisJICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPQorCQl7CisJCSAgIi50ZXh0IiwgIi5pbml0IiwgIi5maW5pIiwgIi5kYXRhIiwKKwkJICAiLnJvZGF0YSIsICIuc2RhdGEiLCAiLnNic3MiLCAiLmJzcyIKKwkJfTsKKwkgICAgICBzdGF0aWMgY29uc3QgaW50IHNjW10gPSB7IHNjVGV4dCwgc2NJbml0LCBzY0ZpbmksIHNjRGF0YSwKKwkJCQkJICBzY1JEYXRhLCBzY1NEYXRhLCBzY1NCc3MsIHNjQnNzIH07CisKKwkgICAgICBlc3ltLmptcHRibCA9IDA7CisJICAgICAgZXN5bS5jb2JvbF9tYWluID0gMDsKKwkgICAgICBlc3ltLndlYWtleHQgPSAwOworCSAgICAgIGVzeW0ucmVzZXJ2ZWQgPSAwOworCSAgICAgIGVzeW0uaWZkID0gaWZkTmlsOworCSAgICAgIGVzeW0uYXN5bS5pc3MgPSBpc3NOaWw7CisJICAgICAgZXN5bS5hc3ltLnN0ID0gc3RMb2NhbDsKKwkgICAgICBlc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOworCSAgICAgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXsKKwkJICBlc3ltLmFzeW0uc2MgPSBzY1tpXTsKKwkJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVbaV0pOworCQkgIGlmIChzICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGVzeW0uYXN5bS52YWx1ZSA9IHMtPnZtYTsKKwkJICAgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBlc3ltLmFzeW0udmFsdWUgPSBsYXN0OworCisJCSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgJmRlYnVnLCBzd2FwLAorCQkJCQkJICAgICAgbmFtZVtpXSwgJmVzeW0pKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKworCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOworCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKwkgICAgICAgcCA9IHAtPm5leHQpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKwkgICAgICBiZmQgKmlucHV0X2JmZDsKKwkgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKKwkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBpbnB1dF9kZWJ1ZzsKKwkgICAgICBjaGFyICplcmF3X3NyYzsKKwkgICAgICBjaGFyICplcmF3X2VuZDsKKworCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCQl7CisJCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKKwkJICAgIGNvbnRpbnVlOworCQkgIGFib3J0ICgpOworCQl9CisKKwkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOworCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOworCisJICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisJCSAgfHwgKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCisJCSAgICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCkgPT0gTlVMTCkKKwkJeworCQkgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGEgbm9uIEFMUEhBIEVMRiBiZmQgd291bGQgYmUKKwkJICAgICBkb2luZyB3aXRoIGEgLm1kZWJ1ZyBzZWN0aW9uLCBidXQgSSBkb24ndCByZWFsbHkKKwkJICAgICB3YW50IHRvIGRlYWwgd2l0aCBpdC4gICovCisJCSAgY29udGludWU7CisJCX0KKworCSAgICAgIGlucHV0X3N3YXAgPSAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGlucHV0X2JmZCkKKwkJCSAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApOworCisJICAgICAgQkZEX0FTU0VSVCAocC0+c2l6ZSA9PSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOworCisJICAgICAgLyogVGhlIEVDT0ZGIGxpbmtpbmcgY29kZSBleHBlY3RzIHRoYXQgd2UgaGF2ZSBhbHJlYWR5CisJCSByZWFkIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIHNldCB1cCBhbgorCQkgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUsIHNvIHdlIGRvIHRoYXQgbm93LiAgKi8KKwkgICAgICBpZiAoIWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQkJJmlucHV0X2RlYnVnKSkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgaWYgKCEgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCisJCSAgICAgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5wdXRfYmZkLAorCQkgICAgICAmaW5wdXRfZGVidWcsIGlucHV0X3N3YXAsIGluZm8pKSkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgRm9yIGVhY2ggb25lIHdpdGgKKwkJIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLCB0cnkgdG8gZmluZCB0aGUgc3ltYm9sIGluCisJCSB0aGUgbGlua2VyIGdsb2JhbCBoYXNoIHRhYmxlIGFuZCBzYXZlIHRoZSBpbmZvcm1hdGlvbgorCQkgZm9yIHRoZSBvdXRwdXQgZXh0ZXJuYWwgc3ltYm9scy4gICovCisJICAgICAgZXJhd19zcmMgPSBpbnB1dF9kZWJ1Zy5leHRlcm5hbF9leHQ7CisJICAgICAgZXJhd19lbmQgPSAoZXJhd19zcmMKKwkJCSAgKyAoaW5wdXRfZGVidWcuc3ltYm9saWNfaGVhZGVyLmlleHRNYXgKKwkJCSAgICAgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOworCSAgICAgIGZvciAoOworCQkgICBlcmF3X3NyYyA8IGVyYXdfZW5kOworCQkgICBlcmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkKKwkJeworCQkgIEVYVFIgZXh0OworCQkgIGNvbnN0IGNoYXIgKm5hbWU7CisJCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkJICAoKmlucHV0X3N3YXAtPnN3YXBfZXh0X2luKSAoaW5wdXRfYmZkLCAoUFRSKSBlcmF3X3NyYywgJmV4dCk7CisJCSAgaWYgKGV4dC5hc3ltLnNjID09IHNjTmlsCisJCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjVW5kZWZpbmVkCisJCSAgICAgIHx8IGV4dC5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgbmFtZSA9IGlucHV0X2RlYnVnLnNzZXh0ICsgZXh0LmFzeW0uaXNzOworCQkgIGggPSBhbHBoYV9lbGZfbGlua19oYXNoX2xvb2t1cCAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCQkJICBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCQkgIGlmIChoID09IE5VTEwgfHwgaC0+ZXN5bS5pZmQgIT0gLTIpCisJCSAgICBjb250aW51ZTsKKworCQkgIGlmIChleHQuaWZkICE9IC0xKQorCQkgICAgeworCQkgICAgICBCRkRfQVNTRVJUIChleHQuaWZkCisJCQkJICA8IGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZmRNYXgpOworCQkgICAgICBleHQuaWZkID0gaW5wdXRfZGVidWcuaWZkbWFwW2V4dC5pZmRdOworCQkgICAgfQorCisJCSAgaC0+ZXN5bSA9IGV4dDsKKwkJfQorCisJICAgICAgLyogRnJlZSB1cCB0aGUgaW5mb3JtYXRpb24gd2UganVzdCByZWFkLiAgKi8KKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5saW5lKTsKKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9kbnIpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3Bkcik7CisJICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfc3ltKTsKKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9vcHQpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2F1eCk7CisJICAgICAgZnJlZSAoaW5wdXRfZGVidWcuc3MpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzZXh0KTsKKwkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9mZHIpOworCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3JmZCk7CisJICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0KTsKKworCSAgICAgIC8qIEhhY2s6IHJlc2V0IHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgc28gdGhhdAorCQkgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KKwkgICAgICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKKwkgICAgfQorCisjaWZkZWYgRVJJQ19uZXZlcmRlZgorCSAgaWYgKGluZm8tPnNoYXJlZCkKKwkgICAgeworCSAgICAgIC8qIENyZWF0ZSAucnRwcm9jIHNlY3Rpb24uICAqLworCSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKKwkgICAgICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMKQorCQl7CisJCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUworCQkJCSAgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkgICAgfCBTRUNfUkVBRE9OTFkpOworCisJCSAgcnRwcm9jX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnRwcm9jIik7CisJCSAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTAorCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcnRwcm9jX3NlYywgZmxhZ3MpCisJCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcnRwcm9jX3NlYywgMTIpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisKKwkgICAgICBpZiAoISBhbHBoYV9lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwKKwkJCQkJCSAgICAgaW5mbywgcnRwcm9jX3NlYywgJmRlYnVnKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisjZW5kaWYKKworCisJICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KKwkgIGVpbmZvLmFiZmQgPSBhYmZkOworCSAgZWluZm8uaW5mbyA9IGluZm87CisJICBlaW5mby5kZWJ1ZyA9ICZkZWJ1ZzsKKwkgIGVpbmZvLnN3YXAgPSBzd2FwOworCSAgZWluZm8uZmFpbGVkID0gZmFsc2U7CisJICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJICBlbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltLAorCQkJCSAgKFBUUikgJmVpbmZvKTsKKwkgIGlmIChlaW5mby5mYWlsZWQpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAubWRlYnVnIHNlY3Rpb24uICAqLworCSAgby0+X3Jhd19zaXplID0gYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKGFiZmQsICZkZWJ1Zywgc3dhcCk7CisKKwkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5CisJICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLworCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOworCisJICBtZGVidWdfc2VjID0gbzsKKwl9CisKKyNpZmRlZiBFUklDX25ldmVyZGVmCisgICAgICBpZiAoc3RybmNtcCAoby0+bmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgPT0gMCkKKwl7CisJICBjb25zdCBjaGFyICpzdWJuYW1lOworCSAgdW5zaWduZWQgaW50IGM7CisJICBFbGY2NF9ncHRhYiAqdGFiOworCSAgRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgKmV4dF90YWI7CisJICB1bnNpZ25lZCBpbnQgaTsKKworCSAgLyogVGhlIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3Mgc2VjdGlvbnMgaG9sZAorCSAgICAgaW5mb3JtYXRpb24gZGVzY3JpYmluZyBob3cgdGhlIHNtYWxsIGRhdGEgYXJlYSB3b3VsZAorCSAgICAgY2hhbmdlIGRlcGVuZGluZyB1cG9uIHRoZSAtRyBzd2l0Y2guICBUaGVzZSBzZWN0aW9ucworCSAgICAgbm90IHVzZWQgaW4gZXhlY3V0YWJsZXMgZmlsZXMuICAqLworCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKipzZWNwcDsKKworCSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKKwkJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisJCSAgIHAgPSBwLT5uZXh0KQorCQl7CisJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisKKwkJICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKKwkJICAgIHsKKwkJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKKwkJCWNvbnRpbnVlOworCQkgICAgICBhYm9ydCAoKTsKKwkJICAgIH0KKworCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247CisKKwkJICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKKwkJICAgICBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLworCQkgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOworCQl9CisKKwkgICAgICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzCisJCSBjdXJyZW50bHkgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KKwkgICAgICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisKKwkgICAgICAvKiBSZWFsbHkgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KKwkgICAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOworCQkgICAqc2VjcHAgIT0gbzsKKwkJICAgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCisJCTsKKwkgICAgICAqc2VjcHAgPSAoKnNlY3BwKS0+bmV4dDsKKwkgICAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7CisKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBUaGVyZSBpcyBvbmUgZ3B0YWIgZm9yIGluaXRpYWxpemVkIGRhdGEsIGFuZCBvbmUgZm9yCisJICAgICB1bmluaXRpYWxpemVkIGRhdGEuICAqLworCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zZGF0YSIpID09IDApCisJICAgIGdwdGFiX2RhdGFfc2VjID0gbzsKKwkgIGVsc2UgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5ncHRhYi5zYnNzIikgPT0gMCkKKwkgICAgZ3B0YWJfYnNzX3NlYyA9IG87CisJICBlbHNlCisJICAgIHsKKwkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJKF8oIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSk7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIFRoZSBsaW5rZXIgc2NyaXB0IGFsd2F5cyBjb21iaW5lcyAuZ3B0YWIuZGF0YSBhbmQKKwkgICAgIC5ncHRhYi5zZGF0YSBpbnRvIC5ncHRhYi5zZGF0YSwgYW5kIGxpa2V3aXNlIGZvcgorCSAgICAgLmdwdGFiLmJzcyBhbmQgLmdwdGFiLnNic3MuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzCisJICAgICBubyAuc2RhdGEgb3IgLnNic3Mgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGluIHdoaWNoCisJICAgICBjYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7CisJICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpID09IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAobyA9PSBncHRhYl9kYXRhX3NlYykKKwkJby0+bmFtZSA9ICIuZ3B0YWIuZGF0YSI7CisJICAgICAgZWxzZQorCQlvLT5uYW1lID0gIi5ncHRhYi5ic3MiOworCSAgICAgIHN1Ym5hbWUgPSBvLT5uYW1lICsgc2l6ZW9mICIuZ3B0YWIiIC0gMTsKKwkgICAgICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3VibmFtZSkgIT0gTlVMTCk7CisJICAgIH0KKworCSAgLyogU2V0IHVwIHRoZSBmaXJzdCBlbnRyeS4gICovCisJICBjID0gMTsKKwkgIHRhYiA9IChFbGY2NF9ncHRhYiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChFbGY2NF9ncHRhYikpOworCSAgaWYgKHRhYiA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJICB0YWJbMF0uZ3RfaGVhZGVyLmd0X2N1cnJlbnRfZ192YWx1ZSA9IGVsZl9ncF9zaXplIChhYmZkKTsKKwkgIHRhYlswXS5ndF9oZWFkZXIuZ3RfdW51c2VkID0gMDsKKworCSAgLyogQ29tYmluZSB0aGUgaW5wdXQgc2VjdGlvbnMuICAqLworCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOworCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKKwkgICAgICAgcCA9IHAtPm5leHQpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKwkgICAgICBiZmQgKmlucHV0X2JmZDsKKwkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7CisJICAgICAgdW5zaWduZWQgbG9uZyBsYXN0OworCSAgICAgIGJmZF9zaXplX3R5cGUgZ3BlbnRyeTsKKworCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCQl7CisJCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKKwkJICAgIGNvbnRpbnVlOworCQkgIGFib3J0ICgpOworCQl9CisKKwkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOworCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOworCisJICAgICAgLyogQ29tYmluZSB0aGUgZ3B0YWIgZW50cmllcyBmb3IgdGhpcyBpbnB1dCBzZWN0aW9uIG9uZQorCQkgYnkgb25lLiAgV2Uga25vdyB0aGF0IHRoZSBpbnB1dCBncHRhYiBlbnRyaWVzIGFyZQorCQkgc29ydGVkIGJ5IGFzY2VuZGluZyAtRyB2YWx1ZS4gICovCisJICAgICAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7CisJICAgICAgbGFzdCA9IDA7CisJICAgICAgZm9yIChncGVudHJ5ID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYik7CisJCSAgIGdwZW50cnkgPCBzaXplOworCQkgICBncGVudHJ5ICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpKQorCQl7CisJCSAgRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgZXh0X2dwdGFiOworCQkgIEVsZjY0X2dwdGFiIGludF9ncHRhYjsKKwkJICB1bnNpZ25lZCBsb25nIHZhbDsKKwkJICB1bnNpZ25lZCBsb25nIGFkZDsKKwkJICBib29sZWFuIGV4YWN0OworCQkgIHVuc2lnbmVkIGludCBsb29rOworCisJCSAgaWYgKCEgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cworCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpICZleHRfZ3B0YWIsCisJCQkgIGdwZW50cnksIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpKSkpCisJCSAgICB7CisJCSAgICAgIGZyZWUgKHRhYik7CisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKworCQkgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX2dwdGFiX2luIChpbnB1dF9iZmQsICZleHRfZ3B0YWIsCisJCQkJCQkmaW50X2dwdGFiKTsKKwkJICB2YWwgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfZ192YWx1ZTsKKwkJICBhZGQgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXMgLSBsYXN0OworCisJCSAgZXhhY3QgPSBmYWxzZTsKKwkJICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQorCQkgICAgeworCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPj0gdmFsKQorCQkJdGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2J5dGVzICs9IGFkZDsKKworCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPT0gdmFsKQorCQkJZXhhY3QgPSB0cnVlOworCQkgICAgfQorCisJCSAgaWYgKCEgZXhhY3QpCisJCSAgICB7CisJCSAgICAgIEVsZjY0X2dwdGFiICpuZXdfdGFiOworCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4OworCisJCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgdGFibGUgZW50cnkuICAqLworCQkgICAgICBuZXdfdGFiID0gKChFbGY2NF9ncHRhYiAqKQorCQkJCSBiZmRfcmVhbGxvYyAoKFBUUikgdGFiLAorCQkJCQkgICAgICAoYyArIDEpICogc2l6ZW9mIChFbGY2NF9ncHRhYikpKTsKKwkJICAgICAgaWYgKG5ld190YWIgPT0gTlVMTCkKKwkJCXsKKwkJCSAgZnJlZSAodGFiKTsKKwkJCSAgcmV0dXJuIGZhbHNlOworCQkJfQorCQkgICAgICB0YWIgPSBuZXdfdGFiOworCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9IHZhbDsKKwkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzID0gYWRkOworCisJCSAgICAgIC8qIE1lcmdlIGluIHRoZSBzaXplIGZvciB0aGUgbmV4dCBzbWFsbGVzdCAtRworCQkJIHZhbHVlLCBzaW5jZSB0aGF0IHdpbGwgYmUgaW1wbGllZCBieSB0aGlzIG5ldworCQkJIHZhbHVlLiAgKi8KKwkJICAgICAgbWF4ID0gMDsKKwkJICAgICAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKKwkJCXsKKwkJCSAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlIDwgdmFsCisJCQkgICAgICAmJiAobWF4ID09IDAKKwkJCQkgIHx8ICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZQorCQkJCSAgICAgID4gdGFiW21heF0uZ3RfZW50cnkuZ3RfZ192YWx1ZSkpKQorCQkJICAgIG1heCA9IGxvb2s7CisJCQl9CisJCSAgICAgIGlmIChtYXggIT0gMCkKKwkJCXRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyArPQorCQkJICB0YWJbbWF4XS5ndF9lbnRyeS5ndF9ieXRlczsKKworCQkgICAgICArK2M7CisJCSAgICB9CisKKwkJICBsYXN0ID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzOworCQl9CisKKwkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKKwkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCisJICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7CisJICAgIH0KKworCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KKwkgIGlmIChjID4gMikKKwkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOworCisJICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLworCSAgZXh0X3RhYiA9ICgoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIgKikKKwkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpOworCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZyZWUgKHRhYik7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCisJICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX2dwdGFiX291dCAoYWJmZCwgdGFiICsgaSwgZXh0X3RhYiArIGkpOworCSAgZnJlZSAodGFiKTsKKworCSAgby0+X3Jhd19zaXplID0gYyAqIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOworCSAgby0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0X3RhYjsKKworCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKKwkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCisJICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisJfQorI2VuZGlmCisKKyAgICB9CisKKyAgLyogSW52b2tlIHRoZSByZWd1bGFyIEVMRiBiYWNrZW5kIGxpbmtlciB0byBkbyBhbGwgdGhlIHdvcmsuICAqLworICBpZiAoISBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOb3cgd3JpdGUgb3V0IHRoZSBjb21wdXRlZCBzZWN0aW9ucy4gICovCisKKyAgLyogVGhlIC5nb3Qgc3Vic2VjdGlvbnMuLi4gICovCisgIHsKKyAgICBiZmQgKmksICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOworICAgIGZvciAoaSA9IGFscGhhX2VsZl9oYXNoX3RhYmxlKGluZm8pLT5nb3RfbGlzdDsKKwkgaSAhPSBOVUxMOworCSBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQorICAgICAgeworCWFzZWN0aW9uICpzZ290OworCisJLyogZWxmX2JmZF9maW5hbF9saW5rIGFscmVhZHkgZGlkIGV2ZXJ5dGhpbmcgaW4gZHlub2JqLiAgKi8KKwlpZiAoaSA9PSBkeW5vYmopCisJICBjb250aW51ZTsKKworCXNnb3QgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdDsKKwlpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNnb3QtPm91dHB1dF9zZWN0aW9uLAorCQkJCQlzZ290LT5jb250ZW50cywgc2dvdC0+b3V0cHV0X29mZnNldCwKKwkJCQkJc2dvdC0+X3Jhd19zaXplKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgfQorCisjaWZkZWYgRVJJQ19uZXZlcmRlZgorICBpZiAocmVnaW5mb19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCisgICAgeworICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7CisKKyAgICAgIGJmZF9hbHBoYV9lbGY2NF9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCAmcmVnaW5mbywgJmV4dCk7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHJlZ2luZm9fc2VjLCAoUFRSKSAmZXh0LAorCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgIGlmIChtZGVidWdfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOworICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsCisJCQkJCSAgICAgICBzd2FwLCBpbmZvLAorCQkJCQkgICAgICAgbWRlYnVnX3NlYy0+ZmlsZXBvcykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBiZmRfZWNvZmZfZGVidWdfZnJlZSAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKKyAgICB9CisKKyAgaWYgKGdwdGFiX2RhdGFfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfZGF0YV9zZWMsCisJCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPmNvbnRlbnRzLAorCQkJCSAgICAgIChmaWxlX3B0cikgMCwKKwkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+X3Jhd19zaXplKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChncHRhYl9ic3Nfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZ3B0YWJfYnNzX3NlYywKKwkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5jb250ZW50cywKKwkJCQkgICAgICAoZmlsZV9wdHIpIDAsCisJCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+X3Jhd19zaXplKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKKyAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICBDb3BpZWQKKyAgIGZyb20gZWxmMzItbWlwcy5jLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwCitlbGY2NF9hbHBoYV9lY29mZl9kZWJ1Z19zd2FwID0KK3sKKyAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCisgIG1hZ2ljU3ltMiwKKyAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLworICA4LAorICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCisgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAorICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKKyAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCisgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAorICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKKyAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCisgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAorICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKKyAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgIGVjb2ZmX3N3YXBfaGRyX2luLAorICBlY29mZl9zd2FwX2Rucl9pbiwKKyAgZWNvZmZfc3dhcF9wZHJfaW4sCisgIGVjb2ZmX3N3YXBfc3ltX2luLAorICBlY29mZl9zd2FwX29wdF9pbiwKKyAgZWNvZmZfc3dhcF9mZHJfaW4sCisgIGVjb2ZmX3N3YXBfcmZkX2luLAorICBlY29mZl9zd2FwX2V4dF9pbiwKKyAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKKyAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCisgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KKyAgZWNvZmZfc3dhcF9oZHJfb3V0LAorICBlY29mZl9zd2FwX2Rucl9vdXQsCisgIGVjb2ZmX3N3YXBfcGRyX291dCwKKyAgZWNvZmZfc3dhcF9zeW1fb3V0LAorICBlY29mZl9zd2FwX29wdF9vdXQsCisgIGVjb2ZmX3N3YXBfZmRyX291dCwKKyAgZWNvZmZfc3dhcF9yZmRfb3V0LAorICBlY29mZl9zd2FwX2V4dF9vdXQsCisgIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAorICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCisgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCisgIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbworfTsKKwwKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjY0X2FscGhhX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjY0LWFscGhhIgorI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYWxwaGEKKyNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERSAJRU1fQUxQSEEKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIAkweDEwMDAwCisKKyNkZWZpbmUgYmZkX2VsZjY0X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKyAgZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKworI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKKyAgZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIFwKKyAgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bworCisjZGVmaW5lIGJmZF9lbGY2NF9ta29iamVjdCBcCisgIGVsZjY0X2FscGhhX21rb2JqZWN0CisjZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKKyAgZWxmNjRfYWxwaGFfb2JqZWN0X3AKKworI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkciBcCisgIGVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMgXAorICBlbGY2NF9hbHBoYV9mYWtlX3NlY3Rpb25zCisKKyNkZWZpbmUgYmZkX2VsZjY0X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKKyAgZWxmNjRfYWxwaGFfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUgXAorICBlbGY2NF9hbHBoYV9maW5kX25lYXJlc3RfbGluZQorI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbGF4X3NlY3Rpb24gXAorICBlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rIFwKKyAgZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyBcCisgIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCisgIGVsZjY0X2FscGhhX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCisgIGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucyBcCisgIGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCisgIGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIFwKKyAgZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAorICBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAorICBlbGY2NF9hbHBoYV9maW5pc2hfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmsgXAorICBlbGY2NF9hbHBoYV9maW5hbF9saW5rCisKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCBcCisgICZlbGY2NF9hbHBoYV9lY29mZl9kZWJ1Z19zd2FwCisKKy8qCisgKiBBIGZldyBjb25zdGFudHMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSAucGx0IHNlY3Rpb24gaXMgc2V0IHVwLgorICovCisjZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCisjZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKKworI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWdlbi5jIGIvYmZkL2VsZjY0LWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDcwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmNjQtZ2VuLmMKQEAgLTAsMCArMSw3MSBAQAorLyogR2VuZXJpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorCisvKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYW55IHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBzaG91bGQgYmUKKyAgIGdvb2QgZW5vdWdoIGZvciBHREIgb3Igb2JqZHVtcCB0byByZWFkIHRoZSBmaWxlLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZHVtbXkgPQorICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgTlVMTCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJVTktOT1dOIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KKworc3RhdGljIHZvaWQKK2VsZl9nZW5lcmljX2luZm9fdG9faG93dG8gKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKKyAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZWxmX3JlbG9jOworeworICBiZmRfcmVsb2MtPmhvd3RvID0gJmR1bW15OworfQorCitzdGF0aWMgdm9pZAorZWxmX2dlbmVyaWNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGJmZF9yZWxvYywgZWxmX3JlbG9jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmJmZF9yZWxvYzsKKyAgICAgRWxmNjRfSW50ZXJuYWxfUmVsICplbGZfcmVsb2M7Cit7CisgIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Cit9CisKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmNjQtbGl0dGxlIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjY0LWJpZyIKKyNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF91bmtub3duCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX05PTkUKKyNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bworI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCisKKyNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1taXBzLmMgYi9iZmQvZWxmNjQtbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjhiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmNjQtbWlwcy5jCkBAIC0wLDAgKzEsMjEyNyBAQAorLyogTUlQUy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLgorCisgICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgVGhpcyBmaWxlCisgICBvdmVycmlkZXMgdGhlIHVzdWFsIEVMRiByZWxvYyBoYW5kbGluZywgYW5kIGhhbmRsZXMgcmVhZGluZyBhbmQKKyAgIHdyaXRpbmcgdGhlIHJlbG9jYXRpb25zIGhlcmUuCisKKyAgIFRoZSBNSVBTIDY0LWJpdCBFTEYgQUJJIGFsc28gdXNlcyBhbiB1bnVzdWFsIGFyY2hpdmUgbWFwIGZvcm1hdC4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImdlbmxpbmsuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisjaW5jbHVkZSAiZWxmL21pcHMuaCIKKworLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZSA2NC1iaXQgQUJJIGlzIG5vdCBzdXBwb3NlZCB0bworICAgdXNlIEVDT0ZGLiAgSG93ZXZlciwgd2Ugc3VwcG9ydCBpdCBhbnlob3cgZm9yIGFuIGVhc2llciBjaGFuZ2VvdmVyLiAgKi8KKyNpbmNsdWRlICJjb2ZmL3N5bS5oIgorI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9lY29mZi5oIgorLyogVGhlIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgbWRlYnVnIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gYWxwaGEuaC4gICovCisjaW5jbHVkZSAiY29mZi9hbHBoYS5oIgorI2RlZmluZSBFQ09GRl82NAorI2luY2x1ZGUgImVjb2Zmc3dhcC5oIgorCitzdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICosCisJICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKikpOworc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbgorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICosCisJICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICopKTsKKyNpZiAwCitzdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqLAorCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICopKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqLAorCSAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbWlwc19lbGY2NF9yZWxvY190eXBlX2xvb2t1cAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CitzdGF0aWMgbG9uZyBtaXBzX2VsZjY0X2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKK3N0YXRpYyB2b2lkIG1pcHNfZWxmNjRfd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2VjdGlvbl9mcm9tX3NoZHIKKyAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gbWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcKKyAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfd3JpdGVfYXJtYXAKKyAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOworCisvKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCisgICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCisjZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKKworLyogVGhlIHJlbG9jYXRpb24gdGFibGUgdXNlZCBmb3IgU0hUX1JFTCBzZWN0aW9ucy4gICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW10gPQoreworICAvKiBObyByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLworICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLworCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMjYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKKwkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKKwkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLworICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgICAgeyAxMyB9LAorICAgIHsgMTQgfSwKKyAgICB7IDE1IH0sCisKKyAgLyogQSA1IGJpdCBzaGlmdCBmaWVsZC4gICovCisgIEhPV1RPIChSX01JUFNfU0hJRlQ1LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNSwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDYsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19TSElGVDUiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDA3YzAsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCisgIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCisgICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCisgIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDYsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDA3YzQsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogNjQgYml0IHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLworCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBPZmZzZXQgZnJvbSBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1RfT0ZTVCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR09UX09GU1QiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiA2NCBiaXQgc3Vic3RyYWN0aW9uLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfU1VCLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfU1VCIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0lOU0VSVF9BIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLCBhbmQgY2hhbmdlIGFsbCByZWxvY2F0aW9ucworICAgICB0byByZWZlciB0byB0aGUgb2xkIGluc3RydWN0aW9uIGF0IHRoZSBhZGRyZXNzLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfSU5TRVJUX0IsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19JTlNFUlRfQiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBEZWxldGUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19ERUxFVEUsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfREVMRVRFIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfSElHSEVTVCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19ISUdIRVNUIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcmVtYWluaW5nIHJlbG9jcyBhcmUsIGJ1dCB0aGV5IGFyZSBkZWZpbmVkCisgICAgIG9uIElyaXggNi4gICovCisKKyAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1NDTl9ESVNQIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX01JUFNfUkVMMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfUkVMMTYiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfTUlQU19BRERfSU1NRURJQVRFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQUREX0lNTUVESUFURSIsIC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9NSVBTX1BKVU1QLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1BKVU1QIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX01JUFNfUkVMR09ULAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1JFTEdPVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KK307CisKKy8qIFRoZSByZWxvY2F0aW9uIHRhYmxlIHVzZWQgZm9yIFNIVF9SRUxBIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhW10gPQoreworICAvKiBObyByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU18zMiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMjYgYml0IGJyYW5jaCBhZGRyZXNzLiAgKi8KKyAgSE9XVE8gKFJfTUlQU18yNiwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93CisJCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCisJCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTXzI2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLworICBIT1dUTyAoUl9NSVBTX0xPMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0xPMTYiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCisgIEhPV1RPIChSX01JUFNfR1BSRUwxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dQUkVMMTYiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCisgIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogUmVmZXJlbmNlIHRvIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVDE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dPVDE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAgIHsgMTMgfSwKKyAgICB7IDE0IH0sCisgICAgeyAxNSB9LAorCisgIC8qIEEgNSBiaXQgc2hpZnQgZmllbGQuICAqLworICBIT1dUTyAoUl9NSVBTX1NISUZUNSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDUsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSA2LAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfU0hJRlQ1IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDA3YzAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDYgYml0IHNoaWZ0IGZpZWxkLiAgKi8KKyAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5OyBhIHNwZWNpYWwgZnVuY3Rpb24gaXMKKyAgICAgbmVlZGVkIHRvIHB1dCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KKyAgSE9XVE8gKFJfTUlQU19TSElGVDYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgNiwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1NISUZUNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwN2M0LAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogNjQgYml0IHJlbG9jYXRpb24uICAqLworICBIT1dUTyAoUl9NSVBTXzY0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfNjQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIERpc3BsYWNlbWVudCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVF9ESVNQLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfRElTUCIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogRGlzcGxhY2VtZW50IHRvIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0dPVF9QQUdFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfUEFHRSIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1RfSEkxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfSEkxNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19HT1RfTE8xNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19HT1RfTE8xNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogNjQgYml0IHN1YnN0cmFjdGlvbi4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDY0LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSW5zZXJ0IHRoZSBhZGRlbmQgYXMgYW4gaW5zdHJ1Y3Rpb24uICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19JTlNFUlRfQSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0lOU0VSVF9BIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLCBhbmQgY2hhbmdlIGFsbCByZWxvY2F0aW9ucworICAgICB0byByZWZlciB0byB0aGUgb2xkIGluc3RydWN0aW9uIGF0IHRoZSBhZGRyZXNzLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfSU5TRVJUX0IsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfTUlQU19JTlNFUlRfQiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBEZWxldGUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19ERUxFVEUsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfREVMRVRFIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdldCB0aGUgaGlnaGVyIHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCisgIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICBIT1dUTyAoUl9NSVBTX0hJR0hFUiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfSElHSEVSIiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdldCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19ISUdIRVNULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0hJR0hFU1QiLAkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCisgIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogTG93IDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KKyAgSE9XVE8gKFJfTUlQU19DQUxMX0xPMTYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQ0FMTF9MTzE2IiwJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgcmVtYWluaW5nIHJlbG9jcyBhcmUsIGJ1dCB0aGV5IGFyZSBkZWZpbmVkCisgICAgIG9uIElyaXggNi4gICovCisKKyAgSE9XVE8gKFJfTUlQU19TQ05fRElTUCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1NDTl9ESVNQIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX01JUFNfUkVMMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfUkVMMTYiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfTUlQU19BRERfSU1NRURJQVRFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX01JUFNfQUREX0lNTUVESUFURSIsIC8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9NSVBTX1BKVU1QLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1BKVU1QIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX01JUFNfUkVMR09ULAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9NSVBTX1JFTEdPVCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KK307CisKKy8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWwgcmVsb2MuICAqLworCitzdGF0aWMgdm9pZAorbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqc3JjOworICAgICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqZHN0OworeworICBkc3QtPnJfb2Zmc2V0ID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7CisgIGRzdC0+cl9zeW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3ltKTsKKyAgZHN0LT5yX3NzeW0gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zc3ltKTsKKyAgZHN0LT5yX3R5cGUzID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTMpOworICBkc3QtPnJfdHlwZTIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMik7CisgIGRzdC0+cl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZSk7Cit9CisKKy8qIFN3YXAgaW4gYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqc3JjOworICAgICBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgZHN0LT5yX29mZnNldCA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOworICBkc3QtPnJfc3ltID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3N5bSk7CisgIGRzdC0+cl9zc3ltID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3N5bSk7CisgIGRzdC0+cl90eXBlMyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUzKTsKKyAgZHN0LT5yX3R5cGUyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTIpOworICBkc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUpOworICBkc3QtPnJfYWRkZW5kID0gYmZkX2hfZ2V0X3NpZ25lZF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9hZGRlbmQpOworfQorCisjaWYgMAorCisvKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4gICovCisKKy8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZWxmNjRfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICpzcmM7CisgICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsICpkc3Q7Cit7CisgIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOworICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7CisgIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKK30KKworI2VuZGlmIC8qIDAgKi8KKworLyogU3dhcCBvdXQgYSBNSVBTIDY0LWJpdCBSZWxhIHJlbG9jLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKnNyYzsKKyAgICAgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICpkc3Q7Cit7CisgIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX29mZnNldCwgKGJmZF9ieXRlICopIGRzdC0+cl9vZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cl9zeW0sIChiZmRfYnl0ZSAqKSBkc3QtPnJfc3ltKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl9zc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3NzeW0pOworICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUzLCAoYmZkX2J5dGUgKikgZHN0LT5yX3R5cGUzKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMiwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMik7CisgIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlKTsKKyAgYmZkX2hfcHV0XzY0IChhYmZkLCBzcmMtPnJfYWRkZW5kLCAoYmZkX2J5dGUgKikgZHN0LT5yX2FkZGVuZCk7Cit9CisKKy8qIEEgbWFwcGluZyBmcm9tIEJGRCByZWxvYyB0eXBlcyB0byBNSVBTIEVMRiByZWxvYyB0eXBlcy4gICovCisKK3N0cnVjdCBlbGZfcmVsb2NfbWFwCit7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICBlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUgZWxmX3JlbG9jX3ZhbDsKK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBtaXBzX3JlbG9jX21hcFtdID0KK3sKKyAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NSVBTX05PTkUsIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX01JUFNfMTYgfSwKKyAgeyBCRkRfUkVMT0NfMzIsIFJfTUlQU18zMiB9LAorICB7IEJGRF9SRUxPQ182NCwgUl9NSVBTXzY0IH0sCisgIHsgQkZEX1JFTE9DX0NUT1IsIFJfTUlQU182NCB9LAorICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NSVBTX1JFTDMyIH0sCisgIHsgQkZEX1JFTE9DX01JUFNfSk1QLCBSX01JUFNfMjYgfSwKKyAgeyBCRkRfUkVMT0NfSEkxNl9TLCBSX01JUFNfSEkxNiB9LAorICB7IEJGRF9SRUxPQ19MTzE2LCBSX01JUFNfTE8xNiB9LAorICB7IEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBSX01JUFNfR1BSRUwxNiB9LAorICB7IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIFJfTUlQU19MSVRFUkFMIH0sCisgIHsgQkZEX1JFTE9DX01JUFNfR09UMTYsIFJfTUlQU19HT1QxNiB9LAorICB7IEJGRF9SRUxPQ18xNl9QQ1JFTCwgUl9NSVBTX1BDMTYgfSwKKyAgeyBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIFJfTUlQU19DQUxMMTYgfSwKKyAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTDMyLCBSX01JUFNfR1BSRUwzMiB9LAorICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2LCBSX01JUFNfR09UX0hJMTYgfSwKKyAgeyBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgUl9NSVBTX0dPVF9MTzE2IH0sCisgIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBSX01JUFNfQ0FMTF9ISTE2IH0sCisgIHsgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBSX01JUFNfQ0FMTF9MTzE2IH0KK307CisKKy8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIGhvd3RvIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK21pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1pcHNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCisgICAgeworICAgICAgaWYgKG1pcHNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKKwl7CisJICBpbnQgdjsKKworCSAgdiA9IChpbnQpIG1pcHNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWw7CisJICByZXR1cm4gJm1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsW3ZdOworCX0KKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNpbmNlIGVhY2ggZW50cnkgaW4gYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGNhbiByZXByZXNlbnQgdXAKKyAgIHRvIHRocmVlIHJlbG9jcywgd2UgbXVzdCB0ZWxsIHRoZSB1c2VyIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UuICAqLworCitzdGF0aWMgbG9uZworbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworeworICByZXR1cm4gKHNlYy0+cmVsb2NfY291bnQgKiAzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Cit9CisKKy8qIFJlYWQgdGhlIHJlbG9jYXRpb25zIGZyb20gb25lIHJlbG9jIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCByZWxfaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICphc2VjdDsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOworeworICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKKyAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7CisgIGFyZWxlbnQgKnJlbGVudHM7CisgIGFyZWxlbnQgKnJlbGVudDsKKyAgdW5zaWduZWQgaW50IGNvdW50OworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IGVudHNpemU7CisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvX3RhYmxlOworCisgIGFsbG9jYXRlZCA9IChQVFIpIGJmZF9tYWxsb2MgKHJlbF9oZHItPnNoX3NpemUpOworICBpZiAoYWxsb2NhdGVkID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCAoYmZkX3JlYWQgKGFsbG9jYXRlZCwgMSwgcmVsX2hkci0+c2hfc2l6ZSwgYWJmZCkgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7CisKKyAgcmVsZW50cyA9IGFzZWN0LT5yZWxvY2F0aW9uICsgYXNlY3QtPnJlbG9jX2NvdW50OworCisgIGVudHNpemUgPSByZWxfaGRyLT5zaF9lbnRzaXplOworICBCRkRfQVNTRVJUIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpCisJICAgICAgfHwgZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSkpOworCisgIGNvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIGVudHNpemU7CisKKyAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCkpCisgICAgaG93dG9fdGFibGUgPSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbDsKKyAgZWxzZQorICAgIGhvd3RvX3RhYmxlID0gbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWxhOworCisgIHJlbGVudCA9IHJlbGVudHM7CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBuYXRpdmVfcmVsb2NzICs9IGVudHNpemUpCisgICAgeworICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIHJlbGE7CisgICAgICBib29sZWFuIHVzZWRfc3ltLCB1c2VkX3NzeW07CisgICAgICBpbnQgaXI7CisKKyAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSkKKwltaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLAorCQkJCSAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywKKwkJCQkgICAmcmVsYSk7CisgICAgICBlbHNlCisJeworCSAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgcmVsOworCisJICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NfaW4gKGFiZmQsCisJCQkJICAgIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSBuYXRpdmVfcmVsb2NzLAorCQkJCSAgICAmcmVsKTsKKwkgIHJlbGEucl9vZmZzZXQgPSByZWwucl9vZmZzZXQ7CisJICByZWxhLnJfc3ltID0gcmVsLnJfc3ltOworCSAgcmVsYS5yX3NzeW0gPSByZWwucl9zc3ltOworCSAgcmVsYS5yX3R5cGUzID0gcmVsLnJfdHlwZTM7CisJICByZWxhLnJfdHlwZTIgPSByZWwucl90eXBlMjsKKwkgIHJlbGEucl90eXBlID0gcmVsLnJfdHlwZTsKKwkgIHJlbGEucl9hZGRlbmQgPSAwOworCX0KKworICAgICAgLyogRWFjaCBlbnRyeSByZXByZXNlbnRzIHVwIHRvIHRocmVlIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCisKKyAgICAgIHVzZWRfc3ltID0gZmFsc2U7CisgICAgICB1c2VkX3NzeW0gPSBmYWxzZTsKKyAgICAgIGZvciAoaXIgPSAwOyBpciA8IDM7IGlyKyspCisJeworCSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIHR5cGU7CisKKwkgIHN3aXRjaCAoaXIpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgY2FzZSAwOgorCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIHR5cGUgPSAoZW51bSBlbGZfbWlwc19yZWxvY190eXBlKSByZWxhLnJfdHlwZTI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMjoKKwkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGUzOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmICh0eXBlID09IFJfTUlQU19OT05FKQorCSAgICB7CisJICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgcmVsb2NhdGlvbnMgaW4gdGhpcyBlbnRyeS4gIElmIHRoaXMKKyAgICAgICAgICAgICAgICAgaXMgdGhlIGZpcnN0IGVudHJ5LCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZHVtbXkKKyAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBzbyB0aGF0IHRoZSBnZW5lcmljIGxpbmtlciBrbm93cyB0aGF0CisgICAgICAgICAgICAgICAgIHRoZXJlIGhhcyBiZWVuIGEgYnJlYWsgaW4gdGhlIHNlcXVlbmNlIG9mIHJlbG9jYXRpb25zCisgICAgICAgICAgICAgICAgIGFwcGx5aW5nIHRvIGEgcGFydGljdWxhciBhZGRyZXNzLiAgKi8KKwkgICAgICBpZiAoaXIgPT0gMCkKKwkJeworCQkgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKwkJICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQorCQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKKwkJICBlbHNlCisJCSAgICByZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0IC0gYXNlY3QtPnZtYTsKKwkJICByZWxlbnQtPmFkZGVuZCA9IDA7CisJCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSBSX01JUFNfTk9ORV07CisJCSAgKytyZWxlbnQ7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBTb21lIHR5cGVzIHJlcXVpcmUgc3ltYm9scywgd2hlcmVhcyBzb21lIGRvIG5vdC4gICovCisJICBzd2l0Y2ggKHR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBSX01JUFNfTk9ORToKKwkgICAgY2FzZSBSX01JUFNfTElURVJBTDoKKwkgICAgY2FzZSBSX01JUFNfSU5TRVJUX0E6CisJICAgIGNhc2UgUl9NSVBTX0lOU0VSVF9COgorCSAgICBjYXNlIFJfTUlQU19ERUxFVEU6CisJICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgaWYgKCEgdXNlZF9zeW0pCisJCXsKKwkJICBpZiAocmVsYS5yX3N5bSA9PSAwKQorCQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYXN5bWJvbCAqKnBzLCAqczsKKworCQkgICAgICBwcyA9IHN5bWJvbHMgKyByZWxhLnJfc3ltIC0gMTsKKwkJICAgICAgcyA9ICpwczsKKwkJICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKKwkJCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKKwkJICAgICAgZWxzZQorCQkJcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOworCQkgICAgfQorCisJCSAgdXNlZF9zeW0gPSB0cnVlOworCQl9CisJICAgICAgZWxzZSBpZiAoISB1c2VkX3NzeW0pCisJCXsKKwkJICBzd2l0Y2ggKHJlbGEucl9zc3ltKQorCQkgICAgeworCQkgICAgY2FzZSBSU1NfVU5ERUY6CisJCSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPQorCQkJYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIFJTU19HUDoKKwkJICAgIGNhc2UgUlNTX0dQMDoKKwkJICAgIGNhc2UgUlNTX0xPQzoKKwkJICAgICAgLyogRklYTUU6IEkgdGhpbmsgdGhlc2UgbmVlZCB0byBiZSBoYW5kbGVkIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCBob3d0byBzdHJ1Y3R1cmVzLiAgKi8KKwkJICAgICAgQkZEX0FTU0VSVCAoMCk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBCRkRfQVNTRVJUICgwKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisKKwkJICB1c2VkX3NzeW0gPSB0cnVlOworCQl9CisJICAgICAgZWxzZQorCQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4KKwkgICAgIG9iamVjdCBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvcgorCSAgICAgc2hhcmVkIGxpYnJhcnkuICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMKKwkgICAgIHNlY3Rpb24gcmVsYXRpdmUuICAqLworCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKKwkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldDsKKwkgIGVsc2UKKwkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7CisKKwkgIHJlbGVudC0+YWRkZW5kID0gcmVsYS5yX2FkZGVuZDsKKworCSAgcmVsZW50LT5ob3d0byA9ICZob3d0b190YWJsZVsoaW50KSB0eXBlXTsKKworCSAgKytyZWxlbnQ7CisJfQorICAgIH0KKworICBhc2VjdC0+cmVsb2NfY291bnQgKz0gcmVsZW50IC0gcmVsZW50czsKKworICBpZiAoYWxsb2NhdGVkICE9IE5VTEwpCisgICAgZnJlZSAoYWxsb2NhdGVkKTsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQorICAgIGZyZWUgKGFsbG9jYXRlZCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICBPbiBJcml4IDYsIHRoZXJlIGNhbiBiZSB0d28gcmVsb2Mgc2VjdGlvbnMKKyAgIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBkYXRhIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsIGR5bmFtaWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKmFzZWN0OworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYm9vbGVhbiBkeW5hbWljOworeworICBzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEgKiBjb25zdCBkID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpOworCisgIGlmIChkeW5hbWljKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMCisgICAgICB8fCAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCisgICAgICB8fCBhc2VjdC0+cmVsb2NfY291bnQgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgMyBhcmVsZW50IHN0cnVjdHVyZXMgZm9yIGVhY2ggUmVsIHN0cnVjdHVyZS4gICovCisgIGFzZWN0LT5yZWxvY2F0aW9uID0gKChhcmVsZW50ICopCisJCSAgICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkJICBhc2VjdC0+cmVsb2NfY291bnQgKiAzICogc2l6ZW9mIChhcmVsZW50KSkpOworICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIHNsdXJwX29uZV9yZWxvY190YWJsZSByb3V0aW5lIGluY3JlbWVudHMgcmVsb2NfY291bnQuICAqLworICBhc2VjdC0+cmVsb2NfY291bnQgPSAwOworCisgIGlmICghIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgJmQtPnJlbF9oZHIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGQtPnJlbF9oZHIyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgbWlwc19lbGY2NF9zbHVycF9vbmVfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLAorCQkJCQkgICAgICBkLT5yZWxfaGRyMikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IHRoZSByZWxvY2F0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCittaXBzX2VsZjY0X3dyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBkYXRhOworeworICBib29sZWFuICpmYWlsZWRwID0gKGJvb2xlYW4gKikgZGF0YTsKKyAgdW5zaWduZWQgaW50IGNvdW50OworICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7CisgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZXh0X3JlbGE7CisgIHVuc2lnbmVkIGludCBpZHg7CisgIGFzeW1ib2wgKmxhc3Rfc3ltID0gMDsKKyAgaW50IGxhc3Rfc3ltX2lkeCA9IDA7CisKKyAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLworICBpZiAoKmZhaWxlZHApCisgICAgcmV0dXJuOworCisgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogVGhlIGxpbmtlciBiYWNrZW5kIHdyaXRlcyB0aGUgcmVsb2NzIG91dCBpdHNlbGYsIGFuZCBzZXRzIHRoZQorICAgICByZWxvY19jb3VudCBmaWVsZCB0byB6ZXJvIHRvIGluaGliaXQgd3JpdGluZyB0aGVtIGhlcmUuICBBbHNvLAorICAgICBzb21ldGltZXMgdGhlIFNFQ19SRUxPQyBmbGFnIGdldHMgc2V0IGV2ZW4gd2hlbiB0aGVyZSBhcmVuJ3QgYW55CisgICAgIHJlbG9jcy4gICovCisgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCisgICAgcmV0dXJuOworCisgIC8qIFdlIGNhbiBjb21iaW5lIHVwIHRvIHRocmVlIHJlbG9jcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGFkZHJlc3MKKyAgICAgaWYgdGhlIGxhdHRlciByZWxvY3MgaGF2ZSBubyBhc3NvY2lhdGVkIHN5bWJvbC4gICovCisgIGNvdW50ID0gMDsKKyAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKKyAgICB7CisgICAgICBiZmRfdm1hIGFkZHI7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgKytjb3VudDsKKworICAgICAgYWRkciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XS0+YWRkcmVzczsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJeworCSAgYXJlbGVudCAqcjsKKworCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKKwkgICAgYnJlYWs7CisJICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKKwkgIGlmIChyLT5hZGRyZXNzICE9IGFkZHIKKwkgICAgICB8fCAhIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCisJICAgICAgfHwgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlICE9IDApCisJICAgIGJyZWFrOworCisJICAvKiBXZSBjYW4gbWVyZ2UgdGhlIHJlbG9jIGF0IElEWCArIDEgd2l0aCB0aGUgcmVsb2MgYXQgSURYLiAgKi8KKworCSAgKytpZHg7CisJfQorICAgIH0KKworICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOworCisgIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBjb3VudDsKKyAgcmVsYV9oZHItPmNvbnRlbnRzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxhX2hkci0+c2hfc2l6ZSk7CisgIGlmIChyZWxhX2hkci0+Y29udGVudHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAqZmFpbGVkcCA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGV4dF9yZWxhID0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHM7CisgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyssIGV4dF9yZWxhKyspCisgICAgeworICAgICAgYXJlbGVudCAqcHRyOworICAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhIGludF9yZWxhOworICAgICAgYXN5bWJvbCAqc3ltOworICAgICAgaW50IG47CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOworCisgICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0CisJIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgorCSBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCisgICAgICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQorCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOworICAgICAgZWxzZQorCWludF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7CisKKyAgICAgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOworICAgICAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKKwluID0gbGFzdF9zeW1faWR4OworICAgICAgZWxzZQorCXsKKwkgIGxhc3Rfc3ltID0gc3ltOworCSAgbiA9IF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgKGFiZmQsICZzeW0pOworCSAgaWYgKG4gPCAwKQorCSAgICB7CisJICAgICAgKmZhaWxlZHAgPSB0cnVlOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgbGFzdF9zeW1faWR4ID0gbjsKKwl9CisKKyAgICAgIGludF9yZWxhLnJfc3ltID0gbjsKKworICAgICAgaW50X3JlbGEucl9hZGRlbmQgPSBwdHItPmFkZGVuZDsKKworICAgICAgaW50X3JlbGEucl9zc3ltID0gUlNTX1VOREVGOworCisgICAgICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCisJICAmJiAhIF9iZmRfZWxmX3ZhbGlkYXRlX3JlbG9jIChhYmZkLCBwdHIpKQorCXsKKwkgICpmYWlsZWRwID0gdHJ1ZTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGludF9yZWxhLnJfdHlwZSA9IHB0ci0+aG93dG8tPnR5cGU7CisgICAgICBpbnRfcmVsYS5yX3R5cGUyID0gKGludCkgUl9NSVBTX05PTkU7CisgICAgICBpbnRfcmVsYS5yX3R5cGUzID0gKGludCkgUl9NSVBTX05PTkU7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJeworCSAgYXJlbGVudCAqcjsKKworCSAgaWYgKGlkeCArIDEgPj0gc2VjLT5yZWxvY19jb3VudCkKKwkgICAgYnJlYWs7CisJICByID0gc2VjLT5vcmVsb2NhdGlvbltpZHggKyAxXTsKKwkgIGlmIChyLT5hZGRyZXNzICE9IHB0ci0+YWRkcmVzcworCSAgICAgIHx8ICEgYmZkX2lzX2Fic19zZWN0aW9uICgoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikKKwkgICAgICB8fCAoKnItPnN5bV9wdHJfcHRyKS0+dmFsdWUgIT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIC8qIFdlIGNhbiBtZXJnZSB0aGUgcmVsb2MgYXQgSURYICsgMSB3aXRoIHRoZSByZWxvYyBhdCBJRFguICAqLworCisJICBpZiAoaSA9PSAwKQorCSAgICBpbnRfcmVsYS5yX3R5cGUyID0gci0+aG93dG8tPnR5cGU7CisJICBlbHNlCisJICAgIGludF9yZWxhLnJfdHlwZTMgPSByLT5ob3d0by0+dHlwZTsKKworCSAgKytpZHg7CisJfQorCisgICAgICBtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmludF9yZWxhLCBleHRfcmVsYSk7CisgICAgfQorCisgIEJGRF9BU1NFUlQgKGV4dF9yZWxhIC0gKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqKSByZWxhX2hkci0+Y29udGVudHMKKwkgICAgICA9PSBjb3VudCk7Cit9CisMCisvKiBIYW5kbGUgYSA2NC1iaXQgTUlQUyBFTEYgc3BlY2lmaWMgc2VjdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZjY0X3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaWYgKCEgX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogRm9yIGEgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uLCBsb29rIGZvciBhIE9ES19SRUdJTkZPIGVudHJ5LCBhbmQKKyAgICAgc2V0IHRoZSBncCB2YWx1ZSBiYXNlZCBvbiB3aGF0IHdlIGZpbmQuICBXZSBtYXkgc2VlIGJvdGgKKyAgICAgU0hUX01JUFNfUkVHSU5GTyBhbmQgU0hUX01JUFNfT1BUSU9OUy9PREtfUkVHSU5GTzsgaW4gdGhhdCBjYXNlLAorICAgICB0aGV5IHNob3VsZCBhZ3JlZS4gICovCisgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUykKKyAgICB7CisgICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKKworICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKKyAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwgY29udGVudHMsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBoZHItPnNoX3NpemUpKQorCXsKKwkgIGZyZWUgKGNvbnRlbnRzKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBsID0gY29udGVudHM7CisgICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7CisgICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCisJeworCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OworCisJICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKKwkJCQkJJmludG9wdCk7CisJICBpZiAoaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCisJICAgIHsKKwkgICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIGludHJlZzsKKworCSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbgorCQkoYWJmZCwKKwkJICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQorCQkgIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpKSwKKwkJICZpbnRyZWcpOworCSAgICAgIGVsZl9ncCAoYWJmZCkgPSBpbnRyZWcucmlfZ3BfdmFsdWU7CisJICAgIH0KKwkgIGwgKz0gaW50b3B0LnNpemU7CisJfQorICAgICAgZnJlZSAoY29udGVudHMpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV29yayBvdmVyIGEgc2VjdGlvbiBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFdlIHVwZGF0ZSB0aGUgR1AKKyAgIHZhbHVlIGluIHRoZSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24gYmFzZWQgb24gdGhlIHZhbHVlIHdlIGFyZQorICAgdXNpbmcuICAqLworCitzdGF0aWMgYm9vbGVhbgorbWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcgKGFiZmQsIGhkcikKKyAgICAgYmZkICphYmZkOworICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOworeworICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMKKyAgICAgICYmIGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTAorICAgICAgJiYgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbikgIT0gTlVMTAorICAgICAgJiYgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbiktPnRkYXRhICE9IE5VTEwpCisgICAgeworICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7CisKKyAgICAgIC8qIFdlIHN0b3JlZCB0aGUgc2VjdGlvbiBjb250ZW50cyBpbiB0aGUgZWxmX3NlY3Rpb25fZGF0YSB0ZGF0YQorCSBmaWVsZCBpbiB0aGUgc2V0X3NlY3Rpb25fY29udGVudHMgcm91dGluZS4gIFdlIHNhdmUgdGhlCisJIHNlY3Rpb24gY29udGVudHMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlYWQgdGhlbSBhZ2Fpbi4KKwkgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgZWxmX2dwIGlzIHNldCwgc28gd2UgY2FuIGxvb2sKKwkgdGhyb3VnaCB0aGUgc2VjdGlvbiBjb250ZW50cyB0byBzZWUgaWYgdGhlcmUgaXMgYW4KKwkgT0RLX1JFR0lORk8gc3RydWN0dXJlLiAgKi8KKworICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgZWxmX3NlY3Rpb25fZGF0YSAoaGRyLT5iZmRfc2VjdGlvbiktPnRkYXRhOworICAgICAgbCA9IGNvbnRlbnRzOworICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOworICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKKworCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCisJCQkJCSZpbnRvcHQpOworCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQorCSAgICB7CisJICAgICAgYmZkX2J5dGUgYnVmWzhdOworCisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkJICAgIChoZHItPnNoX29mZnNldAorCQkJICAgICArIChsIC0gY29udGVudHMpCisJCQkgICAgICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKKwkJCSAgICAgKyAoc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKSAtIDgpKSwKKwkJCSAgICAgU0VFS19TRVQpID09IC0xKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYmZkX2hfcHV0XzY0IChhYmZkLCBlbGZfZ3AgKGFiZmQpLCBidWYpOworCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYWJmZCkgIT0gOCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBsICs9IGludG9wdC5zaXplOworCX0KKyAgICB9CisKKyAgcmV0dXJuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpOworfQorDAorLyogSXJpeCA2IGRlZmluZXMgYSBicmFuZCBuZXcgYXJjaGl2ZSBtYXAgZm9ybWF0LCBzbyB0aGF0IHRoZXkgY2FuCisgICBoYXZlIGFyY2hpdmVzIG1vcmUgdGhhbiA0IEdCIGluIHNpemUuICAqLworCisvKiBSZWFkIGFuIElyaXggNiBhcm1hcC4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZjY0X3NsdXJwX2FybWFwIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKKyAgY2hhciBuZXh0bmFtZVsxN107CisgIGZpbGVfcHRyIGFyaGRycG9zOworICBiZmRfc2l6ZV90eXBlIGksIHBhcnNlZF9zaXplLCBuc3lteiwgc3RyaW5nc2l6ZSwgY2Fyc3ltX3NpemUsIHB0cnNpemU7CisgIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7CisgIGJmZF9ieXRlIGludF9idWZbOF07CisgIGNoYXIgKnN0cmluZ2Jhc2U7CisgIGJmZF9ieXRlICpyYXdfYXJtYXAgPSBOVUxMOworICBjYXJzeW0gKmNhcnN5bXM7CisKKyAgYXJkYXRhLT5zeW1kZWZzID0gTlVMTDsKKworICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLworICBhcmhkcnBvcyA9IGJmZF90ZWxsIChhYmZkKTsKKyAgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOworICBpZiAoaSA9PSAwKQorICAgIHJldHVybiB0cnVlOworICBpZiAoaSAhPSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBBcmNoaXZlcyB3aXRoIHRyYWRpdGlvbmFsIGFybWFwcyBhcmUgc3RpbGwgcGVybWl0dGVkLiAgKi8KKyAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQorICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOworCisgIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi9TWU02NC8gICAgICAgICAiLCAxNikgIT0gMCkKKyAgICB7CisgICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7CisgIGlmIChtYXBkYXRhID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOworICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CisKKyAgaWYgKGJmZF9yZWFkIChpbnRfYnVmLCAxLCA4LCBhYmZkKSAhPSA4KQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBuc3lteiA9IGJmZF9nZXRiNjQgKGludF9idWYpOworICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSA4ICogbnN5bXogLSA4OworCisgIGNhcnN5bV9zaXplID0gbnN5bXogKiBzaXplb2YgKGNhcnN5bSk7CisgIHB0cnNpemUgPSA4ICogbnN5bXo7CisKKyAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfemFsbG9jIChhYmZkLCBjYXJzeW1fc2l6ZSArIHN0cmluZ3NpemUgKyAxKTsKKyAgaWYgKGFyZGF0YS0+c3ltZGVmcyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgY2Fyc3ltcyA9IGFyZGF0YS0+c3ltZGVmczsKKyAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSBhcmRhdGEtPnN5bWRlZnMpICsgY2Fyc3ltX3NpemU7CisKKyAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgcHRyc2l6ZSk7CisgIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoYmZkX3JlYWQgKHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQorICAgICAgfHwgYmZkX3JlYWQgKHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7CisgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCisgICAgeworICAgICAgY2Fyc3ltcy0+ZmlsZV9vZmZzZXQgPSBiZmRfZ2V0YjY0IChyYXdfYXJtYXAgKyBpICogOCk7CisgICAgICBjYXJzeW1zLT5uYW1lID0gc3RyaW5nYmFzZTsKKyAgICAgIHN0cmluZ2Jhc2UgKz0gc3RybGVuIChzdHJpbmdiYXNlKSArIDE7CisgICAgICArK2NhcnN5bXM7CisgICAgfQorICAqc3RyaW5nYmFzZSA9ICdcMCc7CisKKyAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBuc3ltejsKKyAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBhcmhkcnBvcyArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBwYXJzZWRfc2l6ZTsKKworICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOworICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3X2FybWFwKTsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKHJhd19hcm1hcCAhPSBOVUxMKQorICAgIGJmZF9yZWxlYXNlIChhYmZkLCByYXdfYXJtYXApOworICBpZiAoYXJkYXRhLT5zeW1kZWZzICE9IE5VTEwpCisgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGFyZGF0YS0+c3ltZGVmcyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogV3JpdGUgb3V0IGFuIElyaXggNiBhcm1hcC4gIFRoZSBJcml4IDYgdG9vbHMgYXJlIHN1cHBvc2VkIHRvIGJlCisgICBhYmxlIHRvIGhhbmRsZSBvcmRpbmFyeSBFTEYgYXJtYXBzLCBidXQgYXQgbGVhc3Qgb24gSXJpeCA2LjIgdGhlCisgICBsaW5rZXIgY3Jhc2hlcy4gICovCisKK3N0YXRpYyBib29sZWFuCittaXBzX2VsZjY0X3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIHN5bWJvbF9jb3VudCwgc3RyaWR4KQorICAgICBiZmQgKmFyY2g7CisgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOworICAgICBzdHJ1Y3Qgb3JsICptYXA7CisgICAgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7CisgICAgIGludCBzdHJpZHg7Cit7CisgIHVuc2lnbmVkIGludCByYW5saWJzaXplID0gKHN5bWJvbF9jb3VudCAqIDgpICsgODsKKyAgdW5zaWduZWQgaW50IHN0cmluZ3NpemUgPSBzdHJpZHg7CisgIHVuc2lnbmVkIGludCBtYXBzaXplID0gc3RyaW5nc2l6ZSArIHJhbmxpYnNpemU7CisgIGZpbGVfcHRyIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyOworICBiZmQgKmN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7CisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgc3RydWN0IGFyX2hkciBoZHI7CisgIHVuc2lnbmVkIGludCBpOworICBpbnQgcGFkZGluZzsKKyAgYmZkX2J5dGUgYnVmWzhdOworCisgIHBhZGRpbmcgPSBCRkRfQUxJR04gKG1hcHNpemUsIDgpIC0gbWFwc2l6ZTsKKyAgbWFwc2l6ZSArPSBwYWRkaW5nOworCisgIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBmaXJzdCBvYmplY3QgZmlsZSB3aWxsIGdvIGluIHRoZSBhcmNoaXZlICovCisgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyID0gKG1hcHNpemUKKwkJCSAgICAgKyBlbGVuZ3RoCisJCQkgICAgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKQorCQkJICAgICArIFNBUk1BRyk7CisKKyAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOworICBzdHJjcHkgKGhkci5hcl9uYW1lLCAiL1NZTTY0LyIpOworICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7CisgIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIHRpbWUgKE5VTEwpKTsKKyAgLyogVGhpcywgYXQgbGVhc3QsIGlzIHdoYXQgSW50ZWwgY29mZiBzZXRzIHRoZSB2YWx1ZXMgdG8uOiAqLworICBzcHJpbnRmICgoaGRyLmFyX3VpZCksICIlZCIsIDApOworICBzcHJpbnRmICgoaGRyLmFyX2dpZCksICIlZCIsIDApOworICBzcHJpbnRmICgoaGRyLmFyX21vZGUpLCAiJS03byIsICh1bnNpZ25lZCkgMCk7CisgIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCisgICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCisgICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOworCisgIC8qIFdyaXRlIHRoZSBhciBoZWFkZXIgZm9yIHRoaXMgaXRlbSBhbmQgdGhlIG51bWJlciBvZiBzeW1ib2xzICovCisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKKyAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF9wdXRiNjQgKHN5bWJvbF9jb3VudCwgYnVmKTsKKyAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA4LCBhcmNoKSAhPSA4KQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUd28gcGFzc2VzLCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBvZmZzZXRzIGZvciBlYWNoIHN5bWJvbCAtCisgICAgIHJlbWVtYmVyaW5nIHRoYXQgZWFjaCBvZmZzZXQgaXMgb24gYSB0d28gYnl0ZSBib3VuZGFyeS4gICovCisKKyAgLyogV3JpdGUgb3V0IHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGVhY2gKKyAgICAgc3ltYm9sLCBhbmQgcmVtZW1iZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyBwYWRkZWQgb3V0LiAgKi8KKworICBjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOworICBjb3VudCA9IDA7CisgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgTlVMTCAmJiBjb3VudCA8IHN5bWJvbF9jb3VudCkKKyAgICB7CisgICAgICAvKiBGb3IgZWFjaCBzeW1ib2wgd2hpY2ggaXMgdXNlZCBkZWZpbmVkIGluIHRoaXMgb2JqZWN0LCB3cml0ZSBvdXQKKwkgdGhlIG9iamVjdCBmaWxlJ3MgYWRkcmVzcyBpbiB0aGUgYXJjaGl2ZSAqLworCisgICAgICB3aGlsZSAoKChiZmQgKikgKG1hcFtjb3VudF0pLnBvcykgPT0gY3VycmVudCkKKwl7CisJICBiZmRfcHV0YjY0IChhcmNoaXZlX21lbWJlcl9maWxlX3B0ciwgYnVmKTsKKwkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYXJjaCkgIT0gOCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgY291bnQrKzsKKwl9CisgICAgICAvKiBBZGQgc2l6ZSBvZiB0aGlzIGFyY2hpdmUgZW50cnkgKi8KKyAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IChhcmVsdF9zaXplIChjdXJyZW50KQorCQkJCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKKyAgICAgIC8qIHJlbWVtYmVyIGFib3V0IHRoZSBldmVuIGFsaWdubWVudCAqLworICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgJSAyOworICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorCisgIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN5bWJvbF9jb3VudDsgY291bnQrKykKKyAgICB7CisgICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7CisKKyAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogVGhlIHNwZWMgc2F5cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHBhZGRlZCB0byBhbiA4IGJ5dGUgYm91bmRhcnkuCisgICAgIEhvd2V2ZXIsIHRoZSBJcml4IDYuMiB0b29scyBkbyBub3QgYXBwZWFyIHRvIGRvIHRoaXMuICAqLworICB3aGlsZSAocGFkZGluZyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQorCXJldHVybiBmYWxzZTsKKyAgICAgIC0tcGFkZGluZzsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoZXNlIGFyZSB1c2VkIHdoZW4gZGVhbGluZyB3aXRoIHRoZQorICAgLm1kZWJ1ZyBzZWN0aW9uLCB3aGljaCBpcyBpbiB0aGUgRUNPRkYgZGVidWdnaW5nIGZvcm1hdC4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgbWlwc19lbGY2NF9lY29mZl9kZWJ1Z19zd2FwID0KK3sKKyAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCisgIG1hZ2ljU3ltMiwKKyAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLworICA4LAorICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCisgIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAorICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKKyAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCisgIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAorICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKKyAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCisgIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAorICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKKyAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCisgIGVjb2ZmX3N3YXBfaGRyX2luLAorICBlY29mZl9zd2FwX2Rucl9pbiwKKyAgZWNvZmZfc3dhcF9wZHJfaW4sCisgIGVjb2ZmX3N3YXBfc3ltX2luLAorICBlY29mZl9zd2FwX29wdF9pbiwKKyAgZWNvZmZfc3dhcF9mZHJfaW4sCisgIGVjb2ZmX3N3YXBfcmZkX2luLAorICBlY29mZl9zd2FwX2V4dF9pbiwKKyAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKKyAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCisgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KKyAgZWNvZmZfc3dhcF9oZHJfb3V0LAorICBlY29mZl9zd2FwX2Rucl9vdXQsCisgIGVjb2ZmX3N3YXBfcGRyX291dCwKKyAgZWNvZmZfc3dhcF9zeW1fb3V0LAorICBlY29mZl9zd2FwX29wdF9vdXQsCisgIGVjb2ZmX3N3YXBfZmRyX291dCwKKyAgZWNvZmZfc3dhcF9yZmRfb3V0LAorICBlY29mZl9zd2FwX2V4dF9vdXQsCisgIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAorICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCisgIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCisgIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCit9OworDAorLyogUmVsb2NhdGlvbnMgaW4gdGhlIDY0IGJpdCBNSVBTIEVMRiBBQkkgYXJlIG1vcmUgY29tcGxleCB0aGFuIGluCisgICBzdGFuZGFyZCBFTEYuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlZGlyZWN0IHRoZSByZWxvY2F0aW9uCisgICBoYW5kbGluZyByb3V0aW5lcy4gICovCisKK2NvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIG1pcHNfZWxmNjRfc2l6ZV9pbmZvID0KK3sKKyAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9FaGRyKSwKKyAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9QaGRyKSwKKyAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TaGRyKSwKKyAgc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCksCisgIHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhKSwKKyAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pLAorICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX0R5biksCisgIHNpemVvZiAoRWxmX0V4dGVybmFsX05vdGUpLAorICA2NCwJCS8qIGFyY2hfc2l6ZSAqLworICA4LAkJLyogZmlsZV9hbGlnbiAqLworICBFTEZDTEFTUzY0LAorICBFVl9DVVJSRU5ULAorICBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzLAorICBiZmRfZWxmNjRfd3JpdGVfc2hkcnNfYW5kX2VoZHIsCisgIG1pcHNfZWxmNjRfd3JpdGVfcmVsb2NzLAorICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0LAorICBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlLAorICBiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlLAorICBiZmRfZWxmNjRfc3dhcF9keW5faW4KK307CisKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGVtaXBzIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGY2NF9iaWdtaXBzX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnbWlwcyIKKyNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9taXBzCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX01JUFMKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCisjZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbwkJbWlwc19lbGY2NF9zaXplX2luZm8KKyNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCV9iZmRfbWlwc19lbGZfb2JqZWN0X3AKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIJbWlwc19lbGY2NF9zZWN0aW9uX2Zyb21fc2hkcgorI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCV9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gXAorCQkJCQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJbWlwc19lbGY2NF9zZWN0aW9uX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nIFwKKwkJCQkJX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAJJm1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcAorCisjZGVmaW5lIGJmZF9lbGY2NF9maW5kX25lYXJlc3RfbGluZQlfYmZkX21pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKKyNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cAltaXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwCisjZGVmaW5lIGJmZF9lbGY2NF9zZXRfc2VjdGlvbl9jb250ZW50cwlfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIGJmZF9lbGY2NF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKKwkJCQkJX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZjY0X2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKKwkJCQkJX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIGJmZF9lbGY2NF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncworCisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2Z1bmN0aW9ucworI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9zbHVycF9hcm1hcAltaXBzX2VsZjY0X3NsdXJwX2FybWFwCisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAorCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKKyNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCisJCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZQorI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV93cml0ZV9hcm1hcAltaXBzX2VsZjY0X3dyaXRlX2FybWFwCisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX3JlYWRfYXJfaGRyCV9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyCisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCisJCQkJX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2dldF9lbHRfYXRfaW5kZXggXAorCQkJCQlfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4CisjZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBcCisJCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAorI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFwKKwkJCQlfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wCisKKyNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1zcGFyYy5jIGIvYmZkL2VsZjY0LXNwYXJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmZTk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGY2NC1zcGFyYy5jCkBAIC0wLDAgKzEsMjI3NSBAQAorLyogU1BBUkMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorCisvKiBUaGlzIGlzIGRlZmluZWQgaWYgb25lIHdhbnRzIHRvIGJ1aWxkIHVwd2FyZCBjb21wYXRpYmxlIGJpbmFyaWVzCisgICB3aXRoIHRoZSBvcmlnaW5hbCBzcGFyYzY0LWVsZiB0b29sY2hhaW4uICBUaGUgc3VwcG9ydCBpcyBrZXB0IGluIGZvcgorICAgbm93IGJ1dCBpcyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuICBkamUgOTcwOTMwICAqLworLyojZGVmaW5lIFNQQVJDNjRfT0xEX1JFTE9DUyovCisKKyNpbmNsdWRlICJlbGYvc3BhcmMuaCIKKworLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZS4gICovCisjZGVmaW5lIE1JTlVTX09ORSAofiAoYmZkX3ZtYSkgMCkKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8KKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOworCitzdGF0aWMgdm9pZCBzcGFyYzY0X2VsZl9idWlsZF9wbHQKKyAgUEFSQU1TKChiZmQgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBiZmRfdm1hIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQKKyAgUEFSQU1TKChpbnQpKTsKK3N0YXRpYyBiZmRfdm1hIHNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0CisgIFBBUkFNUygoaW50LCBpbnQpKTsKKworc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzCisgIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICpzZWMsCisJICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKKyAgUEFSQU1TKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgKKyAgUEFSQU1TKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKKworc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKworc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisJICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOworc3RhdGljIGJvb2xlYW4gc3BhcmM2NF9lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKKwwKKy8qIFRoZSByZWxvY2F0aW9uICJob3d0byIgdGFibGUuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfaGl4MjJfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9sb3gxMF9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc3BhcmM2NF9lbGZfaG93dG9fdGFibGVbXSA9Cit7CisgIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzgsICAgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfOCIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18xNiwgICAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfMzIsICAgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18zMiIsICAgICAgZmFsc2UsMCwweGZmZmZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0RJU1A4LCAgICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDgiLCAgIGZhbHNlLDAsMHgwMDAwMDBmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ESVNQMTYsICAgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AxNiIsICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfRElTUDMyLCAgICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQMzIiLCAgZmFsc2UsMCwweDAwZmZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1dESVNQMzAsICAgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AzMCIsIGZhbHNlLDAsMHgzZmZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19XRElTUDIyLCAgIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMjIiLCBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfSEkyMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ISTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzIyLCAgICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMjIiLCAgICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18xMywgICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEzIiwgICAgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTE8xMCwgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0dPVDEwLCAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19HT1QxMywgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDEzIiwgICBmYWxzZSwwLDB4MDAwMDFmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfR09UMjIsICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QyMiIsICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BDMTAsICAgICAgMCwyLDEwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMxMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQzIyLCAgICAgMTAsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfV1BMVDMwLCAgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XUExUMzAiLCAgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0NPUFksICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfQ09QWSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19HTE9CX0RBVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dMT0JfREFUIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfSk1QX1NMT1QsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19KTVBfU0xPVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1JFTEFUSVZFLCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVMQVRJVkUiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19VQTMyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisjaWZuZGVmIFNQQVJDNjRfT0xEX1JFTE9DUworICAvKiBUaGVzZSBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LiAgKi8KKyAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BMVDMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0hJUExUMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfSElQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfTE9QTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMzIiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BDUExUMjIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQyMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUENQTFQxMCwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyNlbmRpZgorICBIT1dUTyhSX1NQQVJDXzEwLCAgICAgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTAiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18xMSwgICAgICAgIDAsMiwxMSxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzExIiwgICAgICBmYWxzZSwwLDB4MDAwMDA3ZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfNjQsICAgICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ182NCIsICAgICAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAorICBIT1dUTyhSX1NQQVJDX09MTzEwLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgNDIsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hIMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfSE0xMCwgICAgIDMyLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0xNMjIsICAgICAxMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgNDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0hIMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUENfSE0xMCwgIDMyLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19ITTEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BDX0xNMjIsICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19XRElTUDE2LCAgIDIsMiwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jLCJSX1NQQVJDX1dESVNQMTYiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfV0RJU1AxOSwgICAyLDIsMTksdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDE5IiwgZmFsc2UsMCwweDAwMDdmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1VOVVNFRF80MiwgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVU5VU0VEXzQyIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfNywgICAgICAgICAwLDIsIDcsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ183IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDdmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzUsICAgICAgICAgMCwyLCA1LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNSIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAxZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ182LCAgICAgICAgIDAsMiwgNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzYiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwM2YsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfRElTUDY0LCAgICAwLDQsNjQsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQNjQiLCAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1BMVDY0LCAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUExUNjQiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCisgIEhPV1RPKFJfU1BBUkNfSElYMjIsICAgICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfaGl4MjJfcmVsb2MsICAiUl9TUEFSQ19ISVgyMiIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKKyAgSE9XVE8oUl9TUEFSQ19MT1gxMCwgICAgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9sb3gxMF9yZWxvYywgICJSX1NQQVJDX0xPWDEwIiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAorICBIT1dUTyhSX1NQQVJDX0g0NCwgICAgICAyMiwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSDQ0IiwgICAgIGZhbHNlLDAsMHgwMDNmZmZmZixmYWxzZSksCisgIEhPV1RPKFJfU1BBUkNfTTQ0LCAgICAgIDEyLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19NNDQiLCAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLGZhbHNlKSwKKyAgSE9XVE8oUl9TUEFSQ19MNDQsICAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0w0NCIsICAgICBmYWxzZSwwLDB4MDAwMDBmZmYsZmFsc2UpLAorICBIT1dUTyhSX1NQQVJDX1JFR0lTVEVSLCAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUkVHSVNURVIiLGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCisgIEhPV1RPKFJfU1BBUkNfVUE2NCwgICAgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1VBNjQiLCAgICAgIGZhbHNlLDAsTUlOVVNfT05FLCB0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19VQTE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUExNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpCit9OworCitzdHJ1Y3QgZWxmX3JlbG9jX21hcCB7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOworICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Cit9OworCitzdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgc3BhcmNfcmVsb2NfbWFwW10gPQoreworICB7IEJGRF9SRUxPQ19OT05FLCBSX1NQQVJDX05PTkUsIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX1NQQVJDXzE2LCB9LAorICB7IEJGRF9SRUxPQ184LCBSX1NQQVJDXzggfSwKKyAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TUEFSQ19ESVNQOCB9LAorICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NQQVJDXzY0IH0sCisgIHsgQkZEX1JFTE9DXzMyLCBSX1NQQVJDXzMyIH0sCisgIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NQQVJDX0RJU1AzMiB9LAorICB7IEJGRF9SRUxPQ19ISTIyLCBSX1NQQVJDX0hJMjIgfSwKKyAgeyBCRkRfUkVMT0NfTE8xMCwgUl9TUEFSQ19MTzEwLCB9LAorICB7IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwgUl9TUEFSQ19XRElTUDMwIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDMjIsIFJfU1BBUkNfMjIgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkMxMywgUl9TUEFSQ18xMyB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMCwgUl9TUEFSQ19HT1QxMCB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgUl9TUEFSQ19HT1QxMyB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19HT1QyMiwgUl9TUEFSQ19HT1QyMiB9LAorICB7IEJGRF9SRUxPQ19TUEFSQ19QQzEwLCBSX1NQQVJDX1BDMTAgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfUEMyMiwgUl9TUEFSQ19QQzIyIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCwgUl9TUEFSQ19XUExUMzAgfSwKKyAgeyBCRkRfUkVMT0NfU1BBUkNfQ09QWSwgUl9TUEFSQ19DT1BZIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFULCBSX1NQQVJDX0dMT0JfREFUIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9ULCBSX1NQQVJDX0pNUF9TTE9UIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLCBSX1NQQVJDX1JFTEFUSVZFIH0sCisgIHsgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIsIFJfU1BBUkNfV0RJU1AyMiB9LAorICAvKiA/Pz8gRG9lc24ndCBkd2FyZiB1c2UgdGhpcz8gICovCisvKnsgQkZEX1JFTE9DX1NQQVJDX1VBMzIsIFJfU1BBUkNfVUEzMiB9LCBub3QgdXNlZD8/ICovCisgIHtCRkRfUkVMT0NfU1BBUkNfMTAsIFJfU1BBUkNfMTB9LAorICB7QkZEX1JFTE9DX1NQQVJDXzExLCBSX1NQQVJDXzExfSwKKyAge0JGRF9SRUxPQ19TUEFSQ182NCwgUl9TUEFSQ182NH0sCisgIHtCRkRfUkVMT0NfU1BBUkNfT0xPMTAsIFJfU1BBUkNfT0xPMTB9LAorICB7QkZEX1JFTE9DX1NQQVJDX0hIMjIsIFJfU1BBUkNfSEgyMn0sCisgIHtCRkRfUkVMT0NfU1BBUkNfSE0xMCwgUl9TUEFSQ19ITTEwfSwKKyAge0JGRF9SRUxPQ19TUEFSQ19MTTIyLCBSX1NQQVJDX0xNMjJ9LAorICB7QkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIsIFJfU1BBUkNfUENfSEgyMn0sCisgIHtCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCwgUl9TUEFSQ19QQ19ITTEwfSwKKyAge0JGRF9SRUxPQ19TUEFSQ19QQ19MTTIyLCBSX1NQQVJDX1BDX0xNMjJ9LAorICB7QkZEX1JFTE9DX1NQQVJDX1dESVNQMTYsIFJfU1BBUkNfV0RJU1AxNn0sCisgIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSwgUl9TUEFSQ19XRElTUDE5fSwKKyAge0JGRF9SRUxPQ19TUEFSQ183LCBSX1NQQVJDXzd9LAorICB7QkZEX1JFTE9DX1NQQVJDXzUsIFJfU1BBUkNfNX0sCisgIHtCRkRfUkVMT0NfU1BBUkNfNiwgUl9TUEFSQ182fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19ESVNQNjQsIFJfU1BBUkNfRElTUDY0fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19QTFQ2NCwgUl9TUEFSQ19QTFQ2NH0sCisgIHtCRkRfUkVMT0NfU1BBUkNfSElYMjIsIFJfU1BBUkNfSElYMjJ9LAorICB7QkZEX1JFTE9DX1NQQVJDX0xPWDEwLCBSX1NQQVJDX0xPWDEwfSwKKyAge0JGRF9SRUxPQ19TUEFSQ19INDQsIFJfU1BBUkNfSDQ0fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19NNDQsIFJfU1BBUkNfTTQ0fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19MNDQsIFJfU1BBUkNfTDQ0fSwKKyAge0JGRF9SRUxPQ19TUEFSQ19SRUdJU1RFUiwgUl9TUEFSQ19SRUdJU1RFUn0KK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK3NwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3BhcmNfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCisgICAgeworICAgICAgaWYgKHNwYXJjX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisJcmV0dXJuICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVsoaW50KSBzcGFyY19yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjNjRfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgRWxmNjRfSW50ZXJuYWxfUmVsYSAqZHN0OworeworICBCRkRfQVNTRVJUIChFTEY2NF9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfU1BBUkNfbWF4KTsKKyAgY2FjaGVfcHRyLT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtFTEY2NF9SX1RZUEUgKGRzdC0+cl9pbmZvKV07Cit9CisMCisvKiBVdGlsaXR5IGZvciBwZXJmb3JtaW5nIHRoZSBzdGFuZGFyZCBpbml0aWFsIHdvcmsgb2YgYW4gaW5zdHJ1Y3Rpb24KKyAgIHJlbG9jYXRpb24uCisgICAqUFJFTE9DQVRJT04gd2lsbCBjb250YWluIHRoZSByZWxvY2F0ZWQgaXRlbS4KKyAgICpQSU5TTiB3aWxsIGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgIElmIHRoZSByZXN1bHQgaXMgYGJmZF9yZWxvY19vdGhlcicgdGhlIGNhbGxlciBjYW4gY29udGludWUgd2l0aAorICAgcGVyZm9ybWluZyB0aGUgcmVsb2NhdGlvbi4gIE90aGVyd2lzZSBpdCBtdXN0IHN0b3AgYW5kIHJldHVybiB0aGUKKyAgIHZhbHVlIHRvIGl0cyBjYWxsZXIuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitpbml0X2luc25fcmVsb2MgKGFiZmQsCisJCSByZWxvY19lbnRyeSwKKwkJIHN5bWJvbCwKKwkJIGRhdGEsCisJCSBpbnB1dF9zZWN0aW9uLAorCQkgb3V0cHV0X2JmZCwKKwkJIHByZWxvY2F0aW9uLAorCQkgcGluc24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGJmZF92bWEgKnByZWxvY2F0aW9uOworICAgICBiZmRfdm1hICpwaW5zbjsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uOworICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKKworICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKKyAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCisgICAgICAmJiAoISBob3d0by0+cGFydGlhbF9pbnBsYWNlCisJICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICAvKiBUaGlzIHdvcmtzIGJlY2F1c2UgcGFydGlhbF9pbnBsYWNlID09IGZhbHNlLiAgKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworCisgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCisJCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQorICAgIHsKKyAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgICB9CisKKyAgKnByZWxvY2F0aW9uID0gcmVsb2NhdGlvbjsKKyAgKnBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Cit9CisKKy8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCitzcGFyY19lbGZfbm90c3VwX3JlbG9jIChhYmZkLAorCQkJcmVsb2NfZW50cnksCisJCQlzeW1ib2wsCisJCQlkYXRhLAorCQkJaW5wdXRfc2VjdGlvbiwKKwkJCW91dHB1dF9iZmQsCisJCQllcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Cit9CisKKy8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3NwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisgIGJmZF92bWEgaW5zbjsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKKworICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKKyAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCisgICAgcmV0dXJuIHN0YXR1czsKKworICBpbnNuID0gKGluc24gJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCisJCQkgICAgICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisKKyAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAorICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4gMHgzZmZmZikKKyAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICBlbHNlCisgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogSGFuZGxlIHRoZSBISVgyMiByZWxvYy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3NwYXJjX2VsZl9oaXgyMl9yZWxvYyAoYWJmZCwKKwkJICAgICAgIHJlbG9jX2VudHJ5LAorCQkgICAgICAgc3ltYm9sLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIGlucHV0X3NlY3Rpb24sCisJCSAgICAgICBvdXRwdXRfYmZkLAorCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgYmZkX3ZtYSBpbnNuOworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOworCisgIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOworICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKKyAgICByZXR1cm4gc3RhdHVzOworCisgIHJlbG9jYXRpb24gXj0gTUlOVVNfT05FOworICBpbnNuID0gKGluc24gJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7CisKKyAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHhmZmZmZmZmZikgIT0gMCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworICBlbHNlCisgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogSGFuZGxlIHRoZSBMT1gxMCByZWxvYy4gICovCisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK3NwYXJjX2VsZl9sb3gxMF9yZWxvYyAoYWJmZCwKKwkJICAgICAgIHJlbG9jX2VudHJ5LAorCQkgICAgICAgc3ltYm9sLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIGlucHV0X3NlY3Rpb24sCisJCSAgICAgICBvdXRwdXRfYmZkLAorCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgYmZkX3ZtYSBpbnNuOworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOworCisgIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKKwkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOworICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKKyAgICByZXR1cm4gc3RhdHVzOworCisgIGluc24gPSAoaW5zbiAmIH4weDFmZmYpIHwgMHgxYzAwIHwgKHJlbG9jYXRpb24gJiAweDNmZik7CisgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOworCisgIHJldHVybiBiZmRfcmVsb2Nfb2s7Cit9CisMCisvKiBQTFQvR09UIHN0dWZmICovCisKKy8qIEJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBlbnRyaWVzIGFyZSBpY2FjaGUgYWxpZ25lZC4gICovCisjZGVmaW5lIFBMVF9FTlRSWV9TSVpFCQkzMgorI2RlZmluZSBQTFRfSEVBREVSX1NJWkUJCSg0ICogUExUX0VOVFJZX1NJWkUpCisjZGVmaW5lIExBUkdFX1BMVF9USFJFU0hPTEQJMzI3NjgKKyNkZWZpbmUgR09UX1JFU0VSVkVEX0VOVFJJRVMJMQorCisjZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9zcGFyY3Y5L2xkLnNvLjEiCisKKworLyogRmlsbCBpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK3NwYXJjNjRfZWxmX2J1aWxkX3BsdCAob3V0cHV0X2JmZCwgY29udGVudHMsIG5lbnRyaWVzKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOworICAgICBpbnQgbmVudHJpZXM7Cit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBub3AgPSAweDAxMDAwMDAwOworICBpbnQgaSwgajsKKyAgCisgIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgYXJlIGluaXRpYWxseSB1bmRlZmluZWQuCisgICAgIFdlIGZpbGwgdGhlbSB3aXRoIGBpbGx0cmFwIDAnIHRvIGZvcmNlIGxkLnNvIHRvIGRvIHNvbWV0aGluZy4gICovCisKKyAgZm9yIChpID0gMDsgaSA8IFBMVF9IRUFERVJfU0laRS80OyArK2kpCisgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgY29udGVudHMraSo0KTsKKworICAvKiBUaGUgZmlyc3QgMzI3NjggZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIHBsdDEgdG8gZ2V0IHRoZXJlIHZpYQorICAgICBhIHN0cmFpZ2h0IGJyYW5jaC4gICovCisKKyAgZm9yIChpID0gNDsgaSA8IExBUkdFX1BMVF9USFJFU0hPTEQgJiYgaSA8IG5lbnRyaWVzOyArK2kpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqZW50cnkgPSBjb250ZW50cyArIGkgKiBQTFRfRU5UUllfU0laRTsKKyAgICAgIHVuc2lnbmVkIGludCBzZXRoaSwgYmE7CisKKyAgICAgIC8qIHNldGhpICguIC0gcGx0MCksICVnMSAqLworICAgICAgc2V0aGkgPSAweDAzMDAwMDAwIHwgKGkgKiBQTFRfRU5UUllfU0laRSk7CisKKyAgICAgIC8qIGJhLGEscHQgJWljYywgcGx0MSAqLworICAgICAgYmEgPSAweDMwNDgwMDAwIHwgKCgoY29udGVudHMrUExUX0VOVFJZX1NJWkUpIC0gKGVudHJ5KzQpKSAvIDQgJiAweDdmZmZmKTsKKworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgc2V0aGksIGVudHJ5KTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGJhLCBlbnRyeSs0KTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzEyKTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMTYpOworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyMCk7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI0KTsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjgpOworICAgIH0KKworICAvKiBOb3cgdGhlIHRyaWNreSBiaXQuICBFbnRyaWVzIDMyNzY4IGFuZCBoaWdoZXIgYXJlIGdyb3VwZWQgaW4gYmxvY2tzIG9mCisgICAgIDE2MDogMTYwIGVudHJpZXMgYW5kIDE2MCBwb2ludGVycy4gIFRoaXMgaXMgdG8gc2VwYXJhdGUgY29kZSBmcm9tIGRhdGEsCisgICAgIHdoaWNoIGlzIG11Y2ggZnJpZW5kbGllciBvbiB0aGUgY2FjaGUuICAqLworICAKKyAgZm9yICg7IGkgPCBuZW50cmllczsgaSArPSAxNjApCisgICAgeworICAgICAgaW50IGJsb2NrID0gKGkgKyAxNjAgPD0gbmVudHJpZXMgPyAxNjAgOiBuZW50cmllcyAtIGkpOworICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrOyArK2opCisJeworCSAgdW5zaWduZWQgY2hhciAqZW50cnksICpwdHI7CisJICB1bnNpZ25lZCBpbnQgbGR4OworCisJICBlbnRyeSA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGoqNCo2OworCSAgcHRyID0gY29udGVudHMgKyBpKlBMVF9FTlRSWV9TSVpFICsgYmxvY2sqNCo2ICsgaio4OworCisJICAvKiBsZHggWyVvNyArIHB0ciAtIGVudHJ5KzRdLCAlZzEgKi8KKwkgIGxkeCA9IDB4YzI1YmUwMDAgfCAoKHB0ciAtIGVudHJ5KzQpICYgMHgxZmZmKTsKKworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4YTEwMDAwZiwgZW50cnkpOyAgICAvKiBtb3YgJW83LCVnNSAqLworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0MDAwMDAwMiwgZW50cnkrNCk7ICAvKiBjYWxsIC4rOCAqLworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSs4KTsgICAgICAgICAvKiBub3AgKi8KKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxkeCwgZW50cnkrMTIpOyAgICAgICAgLyogbGR4IFslbzcrUF0sJWcxICovCisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDgzYzNjMDAxLCBlbnRyeSsxNik7IC8qIGptcGwgJW83KyVnMSwlZzEgKi8KKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OWUxMDAwMDUsIGVudHJ5KzIwKTsgLyogbW92ICVnNSwlbzcgKi8KKworCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgY29udGVudHMgLSBlbnRyeSs0LCBwdHIpOworCX0KKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgb2Zmc2V0IG9mIGEgcGFydGljdWxhciBwbHQgZW50cnkgd2l0aGluIHRoZSAucGx0IHNlY3Rpb24uICAqLworCitzdGF0aWMgYmZkX3ZtYQorc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaW5kZXgpCisgICAgIGludCBpbmRleDsKK3sKKyAgaW50IGJsb2NrLCBvZnM7CisKKyAgaWYgKGluZGV4IDwgTEFSR0VfUExUX1RIUkVTSE9MRCkKKyAgICByZXR1cm4gaW5kZXggKiBQTFRfRU5UUllfU0laRTsKKworICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLworCisgIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7CisgIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOworCisgIHJldHVybiAoKGJmZF92bWEpKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKKwkgICsgb2ZzICogNio0KTsKK30KKworc3RhdGljIGJmZF92bWEKK3NwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IChpbmRleCwgbWF4KQorICAgICBpbnQgaW5kZXgsIG1heDsKK3sKKyAgaW50IGJsb2NrLCBvZnMsIGxhc3Q7CisKKyAgQkZEX0FTU0VSVChpbmRleCA+PSBMQVJHRV9QTFRfVEhSRVNIT0xEKTsKKworICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLworCisgIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7CisgIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOworICBsYXN0ID0gKG1heCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOworCisgIHJldHVybiAoKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKKwkgICsgbGFzdCAqIDYqNAorCSAgKyBvZnMgKiA4KTsKK30KKworCisMCisvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAorICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKKyAgIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Cit7CisgIGJmZCAqZHlub2JqOworICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7CisgIGFzZWN0aW9uICpzZ290OworICBhc2VjdGlvbiAqc3JlbGdvdDsKKyAgYXNlY3Rpb24gKnNyZWxvYzsKKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8ICEoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKKyAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKKyAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOworCisgIHNnb3QgPSBOVUxMOworICBzcmVsZ290ID0gTlVMTDsKKyAgc3JlbG9jID0gTlVMTDsKKworICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOworICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKKwloID0gTlVMTDsKKyAgICAgIGVsc2UKKwloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOworCisgICAgICBzd2l0Y2ggKEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pKQorCXsKKwljYXNlIFJfU1BBUkNfR09UMTA6CisJY2FzZSBSX1NQQVJDX0dPVDEzOgorCWNhc2UgUl9TUEFSQ19HT1QyMjoKKwkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCisKKwkgIGlmIChkeW5vYmogPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KKwkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7CisJICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaWYgKHNnb3QgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICAgIH0KKworCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCisJICAgIHsKKwkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCisJCXsKKwkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7CisJCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAorCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAorCQkJCQkJICAoU0VDX0FMTE9DCisJCQkJCQkgICB8IFNFQ19MT0FECisJCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQorCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKKwkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKKwkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDMpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKworCSAgaWYgKGggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKKwkJeworCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLworCQkgIGJyZWFrOworCQl9CisJICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisJICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJCXsKKwkJICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisKKwkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKKyAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKKwkJeworCQkgIHNpemVfdCBzaXplOworCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworCisJCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOworCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKKwkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7CisJCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKKwkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOworCQl9CisJICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCisJCXsKKwkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KKwkJICBicmVhazsKKwkJfQorCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKKworCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCisJCXsKKwkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLworCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOworCQl9CisJICAgIH0KKworCSAgc2dvdC0+X3Jhd19zaXplICs9IDg7CisKKyNpZiAwCisJICAvKiBEb2Vzbid0IHdvcmsgZm9yIDY0LWJpdCAtZlBJQywgc2luY2Ugc2V0aGkvb3IgYnVpbGRzCisJICAgICB1bnNpZ25lZCBudW1iZXJzLiAgSWYgd2UgcGVybWl0IG91cnNlbHZlcyB0byBtb2RpZnkKKwkgICAgIGNvZGUgc28gd2UgZ2V0IHNldGhpL3hvciwgdGhpcyBjb3VsZCB3b3JrLgorCSAgICAgUXVlc3Rpb246IGRvIHdlIGNvbnNpZGVyIGNvbmRpdGlvbmFsbHkgcmUtZW5hYmxpbmcKKyAgICAgICAgICAgICB0aGlzIGZvciAtZnBpYywgb25jZSB3ZSBrbm93IGFib3V0IG9iamVjdCBjb2RlIG1vZGVscz8gICovCisJICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIGFkZAorCSAgICAgMHgxMDAwIHRvIHRoZSB2YWx1ZSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNvIHRoYXQgMTMKKwkgICAgIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCisJICBpZiAoc2dvdC0+X3Jhd19zaXplID49IDB4MTAwMAorCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9PSAwKQorCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7CisjZW5kaWYKKworCSAgYnJlYWs7CisKKwljYXNlIFJfU1BBUkNfV1BMVDMwOgorCWNhc2UgUl9TUEFSQ19QTFQzMjoKKwljYXNlIFJfU1BBUkNfSElQTFQyMjoKKwljYXNlIFJfU1BBUkNfTE9QTFQxMDoKKwljYXNlIFJfU1BBUkNfUENQTFQzMjoKKwljYXNlIFJfU1BBUkNfUENQTFQyMjoKKwljYXNlIFJfU1BBUkNfUENQTFQxMDoKKwljYXNlIFJfU1BBUkNfUExUNjQ6CisJICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKKyAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAorICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0CisgICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0CisgICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCisKKwkgIGlmIChoID09IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBwcm9jZWR1cmUgbGlua2FnZQorICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLworCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCisJICAgIHsKKwkgICAgICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKKwkgIGJyZWFrOworCisJY2FzZSBSX1NQQVJDX1BDMTA6CisJY2FzZSBSX1NQQVJDX1BDMjI6CisJY2FzZSBSX1NQQVJDX1BDX0hIMjI6CisJY2FzZSBSX1NQQVJDX1BDX0hNMTA6CisJY2FzZSBSX1NQQVJDX1BDX0xNMjI6CisJICBpZiAoaCAhPSBOVUxMCisJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKKwkgICAgYnJlYWs7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgUl9TUEFSQ19ESVNQODoKKwljYXNlIFJfU1BBUkNfRElTUDE2OgorCWNhc2UgUl9TUEFSQ19ESVNQMzI6CisJY2FzZSBSX1NQQVJDX0RJU1A2NDoKKwljYXNlIFJfU1BBUkNfV0RJU1AzMDoKKwljYXNlIFJfU1BBUkNfV0RJU1AyMjoKKwljYXNlIFJfU1BBUkNfV0RJU1AxOToKKwljYXNlIFJfU1BBUkNfV0RJU1AxNjoKKwkgIGlmIChoID09IE5VTEwpCisJICAgIGJyZWFrOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlIFJfU1BBUkNfODoKKwljYXNlIFJfU1BBUkNfMTY6CisJY2FzZSBSX1NQQVJDXzMyOgorCWNhc2UgUl9TUEFSQ19ISTIyOgorCWNhc2UgUl9TUEFSQ18yMjoKKwljYXNlIFJfU1BBUkNfMTM6CisJY2FzZSBSX1NQQVJDX0xPMTA6CisJY2FzZSBSX1NQQVJDX1VBMzI6CisJY2FzZSBSX1NQQVJDXzEwOgorCWNhc2UgUl9TUEFSQ18xMToKKwljYXNlIFJfU1BBUkNfNjQ6CisJY2FzZSBSX1NQQVJDX09MTzEwOgorCWNhc2UgUl9TUEFSQ19ISDIyOgorCWNhc2UgUl9TUEFSQ19ITTEwOgorCWNhc2UgUl9TUEFSQ19MTTIyOgorCWNhc2UgUl9TUEFSQ183OgorCWNhc2UgUl9TUEFSQ181OgorCWNhc2UgUl9TUEFSQ182OgorCWNhc2UgUl9TUEFSQ19ISVgyMjoKKwljYXNlIFJfU1BBUkNfTE9YMTA6CisJY2FzZSBSX1NQQVJDX0g0NDoKKwljYXNlIFJfU1BBUkNfTTQ0OgorCWNhc2UgUl9TUEFSQ19MNDQ6CisJY2FzZSBSX1NQQVJDX1VBNjQ6CisJY2FzZSBSX1NQQVJDX1VBMTY6CisJICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlIHJlbG9jcworCSAgICAgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYyBzZWN0aW9uIGluCisJICAgICBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAKKworCSAgICAgQnV0IGRvbid0IGRvIHRoaXMgZm9yIGRlYnVnZ2luZyBzZWN0aW9ucyAtLSB0aGlzIHNob3dzIHVwCisJICAgICB3aXRoIERXQVJGMiAtLSBmaXJzdCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBsb2FkZWQsIGFuZAorCSAgICAgc2Vjb25kIGJlY2F1c2UgRFdBUkYgc2V6IHRoZSBkZWJ1ZyBpbmZvIGlzIG5vdCB0byBiZQorCSAgICAgYmlhc2VkIGJ5IHRoZSBsb2FkIGFkZHJlc3MuICAqLworCSAgaWYgKGluZm8tPnNoYXJlZCAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCisJICAgIHsKKwkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCisJCXsKKwkJICBjb25zdCBjaGFyICpuYW1lOworCisJCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkgIChhYmZkLAorCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCisJCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKKwkJICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgcmV0dXJuIGZhbHNlOworCisJCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAorCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKKwkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKKworCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOworCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisKKwkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKKwkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQorCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisJCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOworCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKKwkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKKwkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCX0KKworCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBSX1NQQVJDX1JFR0lTVEVSOgorCSAgLyogTm90aGluZyB0byBkby4gICovCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiJXM6IGNoZWNrX3JlbG9jczogdW5oYW5kbGVkIHJlbG9jIHR5cGUgJWQiKSwKKwkJCQliZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpLAorCQkJCUVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKKyAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCisgICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCisgICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgorICAgdW5kZXJzdGFuZC4gICovCisKK3N0YXRpYyBib29sZWFuCitzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzOworICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCisgIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCisJICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCisJCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCisJCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKKwkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCisJCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKKworICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQorICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgorICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQorICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKKyAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQorICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCisgICAgIFNUVF9GVU5DLiAgKi8KKyAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKKyAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKKyAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKKwkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQorICAgIHsKKyAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorCXsKKwkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0CisgICAgICAgICAgICAgZmlsZSwgYnV0IG5vbmUgb2YgdGhlIGlucHV0IGZpbGVzIHdlcmUgZHluYW1pYyBvYmplY3RzLgorICAgICAgICAgICAgIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEKKyAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMAorICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLworCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgLyogVGhlIGZpcnN0IGZvdXIgYml0IGluIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLworICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKKwkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCisJIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCisJIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCisJIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisgICAgICBpZiAoISBpbmZvLT5zaGFyZWQKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKKwl7CisJICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOworCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKKwl9CisKKyAgICAgIC8qIFRvIHNpbXBsaWZ5IG1hdHRlcnMgbGF0ZXIsIGp1c3Qgc3RvcmUgdGhlIHBsdCBpbmRleCBoZXJlLiAgKi8KKyAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KKyAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKKworICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgICAgIC8qIFRoZSBmaXJzdCBwbHQgZW50cmllcyBhcmUgcmVzZXJ2ZWQsIGFuZCB0aGUgcmVsb2NhdGlvbnMgbXVzdAorCSBwYWlyIHVwIGV4YWN0bHkuICAqLworICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCXMtPl9yYXdfc2l6ZSArPSAoUExUX0hFQURFUl9TSVpFL1BMVF9FTlRSWV9TSVpFCisJCQkgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKTsKKworICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7CisKKyAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBzaXplIGlzIGJvdW5kZWQgYnkgdGhlIG1hZ25pdHVkZQorCSBvZiB0aGUgb2Zmc2V0IHdlIGNhbiBkZXNjcmliZSBpbiB0aGUgZW50cnkuICAqLworICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAoYmZkX3ZtYSkxIDw8IDMyKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKKyAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCisgICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCisgIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOworICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKKyAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLworCisgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKKyAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KKyAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKKyAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKKyAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKKyAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYworICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCisgICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCisgICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bworICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCisgICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKKyAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7CisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfU1BBUkNfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlcgorICAgICB0byBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCisgICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQorICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLworICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCisgICAgeworICAgICAgYXNlY3Rpb24gKnNyZWw7CisKKyAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7CisgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOworICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7CisgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKKyAgICB9CisKKyAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQorICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgMTYtYnl0ZXMgaXMgdGhlIHNpemUKKyAgICAgb2YgdGhlIGxhcmdlc3QgdHlwZSB0aGF0IHJlcXVpcmVzIGhhcmQgYWxpZ25tZW50IC0tIGxvbmcgZG91YmxlLiAgKi8KKyAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOworICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKKyAgICBwb3dlcl9vZl90d28gPSA0OworCisgIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLworICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKKwkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7CisgIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLworICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOworICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOworCisgIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCisgIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzOworICBib29sZWFuIHJlbHRleHQ7CisgIGJvb2xlYW4gcmVscGx0OworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLworICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQorCXsKKwkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOworCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKwkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKKwkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCisgICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCisgICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCisgICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAgYmVsb3cuICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJcy0+X3Jhd19zaXplID0gMDsKKyAgICB9CisKKyAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCisgICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQorICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLworICByZWx0ZXh0ID0gZmFsc2U7CisgIHJlbHBsdCA9IGZhbHNlOworICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBib29sZWFuIHN0cmlwOworCisgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQorCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KKyAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKKworICAgICAgc3RyaXAgPSBmYWxzZTsKKworICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCisJeworCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQorCSAgICB7CisJICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCisJCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKKwkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KKwkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAorCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKKwkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCisJCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAorCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCisJCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KKwkgICAgICBzdHJpcCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7CisJICAgICAgYXNlY3Rpb24gKnRhcmdldDsKKworCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKKwkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLworCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKKwkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOworCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7CisJICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCisJCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCisJCXJlbHRleHQgPSB0cnVlOworCisJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCisJCXJlbHBsdCA9IHRydWU7CisKKwkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCisJCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICAgICAgcy0+cmVsb2NfY291bnQgPSAwOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKKwkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQorCXsKKwkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmlwKQorCXsKKwkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICBaZXJvIHRoZSBtZW1vcnkKKwkgZm9yIHRoZSBiZW5lZml0IG9mIC5yZWxhLnBsdCwgd2hpY2ggaGFzIDQgdW51c2VkIGVudHJpZXMKKwkgYXQgdGhlIGJlZ2lubmluZywgYW5kIHdlIGRvbid0IHdhbnQgZ2FyYmFnZS4gICovCisgICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKKwkgdmFsdWVzIGxhdGVyLCBpbiBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCisJIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgorCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCisJIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCisgICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCisJeworCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChyZWxwbHQpCisJeworCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCisJICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQorCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCisJICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkKKwkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1BBUkNfUExURk1ULAorCQkJCQkJKGluZm8tPnNoYXJlZCAhPSAwKSArIDEpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCisJICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQorCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCisJCQkJCSAgICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChyZWx0ZXh0KQorCXsKKwkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgorICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQorICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQorICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50CisgICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCisgIGlmIChpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgaW50IGM7CisKKyAgICAgIGMgPSAwOworICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAorCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7CisKKwkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KKworCSAgKytjOworCX0KKworICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJICAgICAgc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgsCisJCQkgICAgICAoUFRSKSAmYyk7CisgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKKyAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBjcGFyZzsKK3sKKyAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7CisKKyAgaWYgKGgtPmR5bmluZHggIT0gLTEpCisgICAgaC0+ZHluaW5keCArPSAqY3A7CisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBSZWxvY2F0ZSBhIFNQQVJDNjQgRUxGIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOworICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOworeworICBiZmQgKmR5bm9iajsKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7CisgIGJmZF92bWEgZ290X2Jhc2U7CisgIGFzZWN0aW9uICpzZ290OworICBhc2VjdGlvbiAqc3BsdDsKKyAgYXNlY3Rpb24gKnNyZWxvYzsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKKyAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5oZ290ID09IE5VTEwpCisgICAgZ290X2Jhc2UgPSAwOworICBlbHNlCisgICAgZ290X2Jhc2UgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWU7CisKKyAgc2dvdCA9IHNwbHQgPSBzcmVsb2MgPSBOVUxMOworCisgIHJlbCA9IHJlbG9jczsKKyAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorICAgIHsKKyAgICAgIGludCByX3R5cGU7CisgICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgIGxvbmcgcl9zeW1uZHg7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBiZmRfdm1hIHJlbG9jYXRpb247CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKKworICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbyk7CisgICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXgpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaG93dG8gPSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKKworICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOworCisgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorCXsKKwkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCisJICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCisJICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKKwkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCSAgICB7CisJICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OworCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKKwkJeworCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7CisJCX0KKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KKyAgICAgIGggPSBOVUxMOworICAgICAgc3ltID0gTlVMTDsKKyAgICAgIHNlYyA9IE5VTEw7CisgICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQorCXsKKwkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKKwkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKKwkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkrIHNlYy0+b3V0cHV0X29mZnNldAorCQkJKyBzeW0tPnN0X3ZhbHVlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKKwkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOworCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgYm9vbGVhbiBza2lwX2l0ID0gZmFsc2U7CisJICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCisJICAgICAgc3dpdGNoIChyX3R5cGUpCisJCXsKKwkJY2FzZSBSX1NQQVJDX1dQTFQzMDoKKwkJY2FzZSBSX1NQQVJDX1BMVDMyOgorCQljYXNlIFJfU1BBUkNfSElQTFQyMjoKKwkJY2FzZSBSX1NQQVJDX0xPUExUMTA6CisJCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgorCQljYXNlIFJfU1BBUkNfUENQTFQyMjoKKwkJY2FzZSBSX1NQQVJDX1BDUExUMTA6CisJCWNhc2UgUl9TUEFSQ19QTFQ2NDoKKwkJICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCisJCSAgICBza2lwX2l0ID0gdHJ1ZTsKKwkJICBicmVhazsKKworCQljYXNlIFJfU1BBUkNfR09UMTA6CisJCWNhc2UgUl9TUEFSQ19HT1QxMzoKKwkJY2FzZSBSX1NQQVJDX0dPVDIyOgorCQkgIGlmIChlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJCSAgICAgICYmICghaW5mby0+c2hhcmVkCisJCQkgIHx8ICghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKKwkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCisJCSAgICBza2lwX2l0ID0gdHJ1ZTsKKwkJICBicmVhazsKKworCQljYXNlIFJfU1BBUkNfUEMxMDoKKwkJY2FzZSBSX1NQQVJDX1BDMjI6CisJCWNhc2UgUl9TUEFSQ19QQ19ISDIyOgorCQljYXNlIFJfU1BBUkNfUENfSE0xMDoKKwkJY2FzZSBSX1NQQVJDX1BDX0xNMjI6CisJCSAgaWYgKCFzdHJjbXAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpKQorCQkgICAgYnJlYWs7CisJCSAgLyogRkFMTFRIUlUgKi8KKworCQljYXNlIFJfU1BBUkNfODoKKwkJY2FzZSBSX1NQQVJDXzE2OgorCQljYXNlIFJfU1BBUkNfMzI6CisJCWNhc2UgUl9TUEFSQ19ESVNQODoKKwkJY2FzZSBSX1NQQVJDX0RJU1AxNjoKKwkJY2FzZSBSX1NQQVJDX0RJU1AzMjoKKwkJY2FzZSBSX1NQQVJDX1dESVNQMzA6CisJCWNhc2UgUl9TUEFSQ19XRElTUDIyOgorCQljYXNlIFJfU1BBUkNfSEkyMjoKKwkJY2FzZSBSX1NQQVJDXzIyOgorCQljYXNlIFJfU1BBUkNfMTM6CisJCWNhc2UgUl9TUEFSQ19MTzEwOgorCQljYXNlIFJfU1BBUkNfVUEzMjoKKwkJY2FzZSBSX1NQQVJDXzEwOgorCQljYXNlIFJfU1BBUkNfMTE6CisJCWNhc2UgUl9TUEFSQ182NDoKKwkJY2FzZSBSX1NQQVJDX09MTzEwOgorCQljYXNlIFJfU1BBUkNfSEgyMjoKKwkJY2FzZSBSX1NQQVJDX0hNMTA6CisJCWNhc2UgUl9TUEFSQ19MTTIyOgorCQljYXNlIFJfU1BBUkNfV0RJU1AxOToKKwkJY2FzZSBSX1NQQVJDX1dESVNQMTY6CisJCWNhc2UgUl9TUEFSQ183OgorCQljYXNlIFJfU1BBUkNfNToKKwkJY2FzZSBSX1NQQVJDXzY6CisJCWNhc2UgUl9TUEFSQ19ESVNQNjQ6CisJCWNhc2UgUl9TUEFSQ19ISVgyMjoKKwkJY2FzZSBSX1NQQVJDX0xPWDEwOgorCQljYXNlIFJfU1BBUkNfSDQ0OgorCQljYXNlIFJfU1BBUkNfTTQ0OgorCQljYXNlIFJfU1BBUkNfTDQ0OgorCQljYXNlIFJfU1BBUkNfVUE2NDoKKwkJY2FzZSBSX1NQQVJDX1VBMTY6CisJCSAgaWYgKGluZm8tPnNoYXJlZAorCQkgICAgICAmJiAoKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQorCQkJICB8fCAhKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKKwkJICAgIHNraXBfaXQgPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBpZiAoc2tpcF9pdCkKKwkJeworCQkgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgIG9ic2N1cmUgY2FzZXMgc2VjLT5vdXRwdXRfc2VjdGlvbiB3aWxsIGJlIE5VTEwuICAqLworCQkgIHJlbG9jYXRpb24gPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCQkJKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCQkrIHNlYy0+b3V0cHV0X29mZnNldCk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCSAgICByZWxvY2F0aW9uID0gMDsKKwkgIGVsc2UgaWYgKGluZm8tPnNoYXJlZCAmJiAhaW5mby0+c3ltYm9saWMgJiYgIWluZm8tPm5vX3VuZGVmaW5lZCkKKwkgICAgcmVsb2NhdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKKwkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBjb3BpZWQKKwkgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWUuICAqLworICAgICAgaWYgKGluZm8tPnNoYXJlZCAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpKQorCXsKKwkgIHN3aXRjaCAocl90eXBlKQorCSAgICB7CisJICAgIGNhc2UgUl9TUEFSQ19QQzEwOgorCSAgICBjYXNlIFJfU1BBUkNfUEMyMjoKKwkgICAgY2FzZSBSX1NQQVJDX1BDX0hIMjI6CisJICAgIGNhc2UgUl9TUEFSQ19QQ19ITTEwOgorCSAgICBjYXNlIFJfU1BBUkNfUENfTE0yMjoKKwkgICAgICBpZiAoaCAhPSBOVUxMCisJCSAgJiYgIXN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpKQorCQlicmVhazsKKwkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworCSAgICBjYXNlIFJfU1BBUkNfRElTUDg6CisJICAgIGNhc2UgUl9TUEFSQ19ESVNQMTY6CisJICAgIGNhc2UgUl9TUEFSQ19ESVNQMzI6CisJICAgIGNhc2UgUl9TUEFSQ19XRElTUDMwOgorCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AyMjoKKwkgICAgY2FzZSBSX1NQQVJDX1dESVNQMTk6CisJICAgIGNhc2UgUl9TUEFSQ19XRElTUDE2OgorCSAgICBjYXNlIFJfU1BBUkNfRElTUDY0OgorCSAgICAgIGlmIChoID09IE5VTEwpCisJCWJyZWFrOworCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJICAgIGNhc2UgUl9TUEFSQ184OgorCSAgICBjYXNlIFJfU1BBUkNfMTY6CisJICAgIGNhc2UgUl9TUEFSQ18zMjoKKwkgICAgY2FzZSBSX1NQQVJDX0hJMjI6CisJICAgIGNhc2UgUl9TUEFSQ18yMjoKKwkgICAgY2FzZSBSX1NQQVJDXzEzOgorCSAgICBjYXNlIFJfU1BBUkNfTE8xMDoKKwkgICAgY2FzZSBSX1NQQVJDX1VBMzI6CisJICAgIGNhc2UgUl9TUEFSQ18xMDoKKwkgICAgY2FzZSBSX1NQQVJDXzExOgorCSAgICBjYXNlIFJfU1BBUkNfNjQ6CisJICAgIGNhc2UgUl9TUEFSQ19PTE8xMDoKKwkgICAgY2FzZSBSX1NQQVJDX0hIMjI6CisJICAgIGNhc2UgUl9TUEFSQ19ITTEwOgorCSAgICBjYXNlIFJfU1BBUkNfTE0yMjoKKwkgICAgY2FzZSBSX1NQQVJDXzc6CisJICAgIGNhc2UgUl9TUEFSQ181OgorCSAgICBjYXNlIFJfU1BBUkNfNjoKKwkgICAgY2FzZSBSX1NQQVJDX0hJWDIyOgorCSAgICBjYXNlIFJfU1BBUkNfTE9YMTA6CisJICAgIGNhc2UgUl9TUEFSQ19INDQ6CisJICAgIGNhc2UgUl9TUEFSQ19NNDQ6CisJICAgIGNhc2UgUl9TUEFSQ19MNDQ6CisJICAgIGNhc2UgUl9TUEFSQ19VQTY0OgorCSAgICBjYXNlIFJfU1BBUkNfVUExNjoKKwkgICAgICB7CisJCUVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKKwkJYm9vbGVhbiBza2lwOworCisJCWlmIChzcmVsb2MgPT0gTlVMTCkKKwkJICB7CisJCSAgICBjb25zdCBjaGFyICpuYW1lID0KKwkJICAgICAgKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KKwkJICAgICAgIChpbnB1dF9iZmQsCisJCQllbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAorCQkJZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOworCisJCSAgICBpZiAobmFtZSA9PSBOVUxMKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisKKwkJICAgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKKwkJCQkmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwKKwkJCQkJCQkJaW5wdXRfc2VjdGlvbiksCisJCQkJCSAgIG5hbWUgKyA1KSA9PSAwKTsKKworCQkgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7CisJCSAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7CisJCSAgfQorCisJCXNraXAgPSBmYWxzZTsKKworCQlpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQorCQkgIG91dHJlbC5yX29mZnNldCA9IHJlbC0+cl9vZmZzZXQ7CisJCWVsc2UKKwkJICB7CisJCSAgICBiZmRfdm1hIG9mZjsKKworCQkgICAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAorCQkJICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKKwkJCSAgICBpbnB1dF9zZWN0aW9uLAorCQkJICAgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAorCQkJICAgIHJlbC0+cl9vZmZzZXQpKTsKKwkJICAgIGlmIChvZmYgPT0gTUlOVVNfT05FKQorCQkgICAgICBza2lwID0gdHJ1ZTsKKwkJICAgIG91dHJlbC5yX29mZnNldCA9IG9mZjsKKwkJICB9CisKKwkJb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisKKwkJLyogT3B0aW1pemUgdW5hbGlnbmVkIHJlbG9jIHVzYWdlIG5vdyB0aGF0IHdlIGtub3cgd2hlcmUKKwkJICAgaXQgZmluYWxseSByZXNpZGVzLiAgKi8KKwkJc3dpdGNoIChyX3R5cGUpCisJCSAgeworCQkgIGNhc2UgUl9TUEFSQ18xNjoKKwkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiAxKSByX3R5cGUgPSBSX1NQQVJDX1VBMTY7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFJfU1BBUkNfVUExNjoKKwkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDEpKSByX3R5cGUgPSBSX1NQQVJDXzE2OworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBSX1NQQVJDXzMyOgorCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDMpIHJfdHlwZSA9IFJfU1BBUkNfVUEzMjsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgUl9TUEFSQ19VQTMyOgorCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgMykpIHJfdHlwZSA9IFJfU1BBUkNfMzI7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFJfU1BBUkNfNjQ6CisJCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgNykgcl90eXBlID0gUl9TUEFSQ19VQTY0OworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBSX1NQQVJDX1VBNjQ6CisJCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiA3KSkgcl90eXBlID0gUl9TUEFSQ182NDsKKwkJICAgIGJyZWFrOworCQkgIH0KKworCQlpZiAoc2tpcCkKKwkJICBtZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOworCQkvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGUgc3ltYm9sIHdhcyBtYXJrZWQgdG8KKwkJICAgYmVjb21lIGxvY2FsLiAgKi8KKwkJZWxzZSBpZiAoaCAhPSBOVUxMCisJCQkgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCisJCQkgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkJICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCisJCSAgeworCQkgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7CisJCSAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOworCQkgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBpZiAocl90eXBlID09IFJfU1BBUkNfNjQpCisJCSAgICAgIHsKKwkJCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOworCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJbG9uZyBpbmR4OworCisJCQlpZiAoaCA9PSBOVUxMKQorCQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCQkJCXx8IChoLT5yb290LnR5cGUKKwkJCQkJICAgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOworCQkJICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkJCSAgfQorCQkJaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKKwkJCSAgaW5keCA9IDA7CisJCQllbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCisJCQkgIHsKKwkJCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJCSAgICByZXR1cm4gZmFsc2U7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIGFzZWN0aW9uICpvc2VjOworCisJCQkgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisJCQkgICAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OworCisJCQkgICAgLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGQgYmUgYWJsZSB0byBsaW5rIG5vbi1waWMKKwkJCSAgICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKwkJCSAgICBpZiAoaW5keCA9PSAwKQorCQkJICAgICAgeworCQkJCUJGRF9GQUlMICgpOworCQkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJCSAgKF8oIiVzOiBwcm9iYWJseSBjb21waWxlZCB3aXRob3V0IC1mUElDPyIpLAorCQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOworCQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCSAgICAgIH0KKwkJCSAgfQorCisJCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChpbmR4LCByX3R5cGUpOworCisJCQkvKiBGb3Igbm9uLVJFTEFUSVZFIGR5bmFtaWMgcmVsb2NhdGlvbnMsIHdlIGtlZXAgdGhlCisJCQkgICBzYW1lIHN5bWJvbCwgYW5kIHNvIGdlbmVyYWxseSB0aGUgc2FtZSBhZGRlbmQuICBCdXQKKwkJCSAgIHdlIGRvIG5lZWQgdG8gYWRqdXN0IHRob3NlIHJlbG9jYXRpb25zIHJlZmVyZW5jaW5nCisJCQkgICBzZWN0aW9ucy4gICovCisJCQlvdXRyZWwucl9hZGRlbmQgPSByZWwtPnJfYWRkZW5kOworCQkJaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbworCQkJICAgICYmIEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQorCQkJICBvdXRyZWwucl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0K3N5bS0+c3RfdmFsdWU7CisJCSAgICAgIH0KKwkJICB9CisKKwkJYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKKwkJCQkJICAgKCgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQorCQkJCQkgICAgIHNyZWxvYy0+Y29udGVudHMpCisJCQkJCSAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKKwkJKytzcmVsb2MtPnJlbG9jX2NvdW50OworCisJCS8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCisJCSAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCisJCSAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLworCQlpZiAoc2tpcAorCQkgICAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCisJCSAgICB8fCBFTEY2NF9SX1RZUEUgKG91dHJlbC5yX2luZm8pICE9IFJfU1BBUkNfUkVMQVRJVkUpCisJCSAgY29udGludWU7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoIChyX3R5cGUpCisJeworCWNhc2UgUl9TUEFSQ19HT1QxMDoKKwljYXNlIFJfU1BBUkNfR09UMTM6CisJY2FzZSBSX1NQQVJDX0dPVDIyOgorCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKKwkgICAgIG9mZnNldCB0YWJsZS4gICovCisJICBpZiAoc2dvdCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisJICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKKwkgICAgfQorCisJICBpZiAoaCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBvZmYgPSBoLT5nb3Qub2Zmc2V0OworCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOworCisJICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKKwkJICB8fCAoaW5mby0+c2hhcmVkCisJCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQorCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKKwkJeworCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYSAtQnN5bWJvbGljCisJCSAgICAgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wKKwkJICAgICB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZQorCQkgICAgIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgorCQkgICAgIFNpbmNlIHRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA4LCB3ZQorCQkgICAgIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlCisJCSAgICAgaGF2ZSBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgorCisJCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290CisJCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMgaXMKKwkJICAgICBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCisKKwkJICBpZiAoKG9mZiAmIDEpICE9IDApCisJCSAgICBvZmYgJj0gfjE7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLAorCQkJCSAgc2dvdC0+Y29udGVudHMgKyBvZmYpOworCQkgICAgICBoLT5nb3Qub2Zmc2V0IHw9IDE7CisJCSAgICB9CisJCX0KKwkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfdm1hIG9mZjsKKworCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwpOworCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKKwkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKKworCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA4LiAgV2UgdXNlCisJCSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKKwkJIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZW50cnkuICAqLworCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKKwkJb2ZmICY9IH4xOworCSAgICAgIGVsc2UKKwkJeworCQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKKwkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKKworCQkgIGlmIChpbmZvLT5zaGFyZWQpCisJCSAgICB7CisJCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OworCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7CisKKwkJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2MKKwkJCSBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KKwkJICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworCQkgICAgICBCRkRfQVNTRVJUIChzcmVsZ290ICE9IE5VTEwpOworCisJCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJCSArIHNnb3QtPm91dHB1dF9vZmZzZXQKKwkJCQkJICsgb2ZmKTsKKwkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7CisJCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb247CisJCSAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJCQkgKCgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQorCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCisJCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKKwkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKKwkJICAgIH0KKwkJfQorCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7CisJICAgIH0KKwkgIGdvdG8gZG9fZGVmYXVsdDsKKworCWNhc2UgUl9TUEFSQ19XUExUMzA6CisJY2FzZSBSX1NQQVJDX1BMVDMyOgorCWNhc2UgUl9TUEFSQ19ISVBMVDIyOgorCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgorCWNhc2UgUl9TUEFSQ19QQ1BMVDMyOgorCWNhc2UgUl9TUEFSQ19QQ1BMVDIyOgorCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgorCWNhc2UgUl9TUEFSQ19QTFQ2NDoKKwkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKKyAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisJICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOworCisJICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCisJICAgIHsKKwkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCisJCSBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCisJCSB1c2luZyAtQnN5bWJvbGljLiAgKi8KKwkgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisJICAgIH0KKworCSAgaWYgKHNwbHQgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7CisJICAgIH0KKworCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKKwkJCSsgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaC0+cGx0Lm9mZnNldCkpOworCSAgZ290byBkb19kZWZhdWx0OworCisJY2FzZSBSX1NQQVJDX09MTzEwOgorCSAgeworCSAgICBiZmRfdm1hIHg7CisKKwkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOworCSAgICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gJiAweDNmZikgKyBFTEY2NF9SX1RZUEVfREFUQSAocmVsLT5yX2luZm8pOworCisJICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJICAgIHggPSAoeCAmIH4weDFmZmYpIHwgKHJlbG9jYXRpb24gJiAweDFmZmYpOworCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisKKwkgICAgciA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAorCQkJCSAgICBob3d0by0+Yml0c2l6ZSwgaG93dG8tPnJpZ2h0c2hpZnQsCisJCQkJICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCksCisJCQkJICAgIHJlbG9jYXRpb24pOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJfU1BBUkNfV0RJU1AxNjoKKwkgIHsKKwkgICAgYmZkX3ZtYSB4OworCisJICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKKwkgICAgLyogQWRqdXN0IGZvciBwYy1yZWxhdGl2ZS1uZXNzLiAgKi8KKwkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKwkgICAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OworCisJICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJICAgIHggPSAoeCAmIH4weDMwM2ZmZikgfCAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKKwkJCQkgICB8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOworCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisKKwkgICAgciA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAorCQkJCSAgICBob3d0by0+Yml0c2l6ZSwgaG93dG8tPnJpZ2h0c2hpZnQsCisJCQkJICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCksCisJCQkJICAgIHJlbG9jYXRpb24pOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJfU1BBUkNfSElYMjI6CisJICB7CisJICAgIGJmZF92bWEgeDsKKworCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7CisJICAgIHJlbG9jYXRpb24gPSByZWxvY2F0aW9uIF4gTUlOVVNfT05FOworCisJICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisJICAgIHggPSAoeCAmIH4weDNmZmZmZikgfCAoKHJlbG9jYXRpb24gPj4gMTApICYgMHgzZmZmZmYpOworCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisKKwkgICAgciA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAorCQkJCSAgICBob3d0by0+Yml0c2l6ZSwgaG93dG8tPnJpZ2h0c2hpZnQsCisJCQkJICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGlucHV0X2JmZCksCisJCQkJICAgIHJlbG9jYXRpb24pOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJfU1BBUkNfTE9YMTA6CisJICB7CisJICAgIGJmZF92bWEgeDsKKworCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7CisJICAgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiAmIDB4M2ZmKSB8IDB4MWMwMDsKKworCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOworCSAgICB4ID0gKHggJiB+MHgxZmZmKSB8IHJlbG9jYXRpb247CisJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKKworCSAgICByID0gYmZkX3JlbG9jX29rOworCSAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCWRvX2RlZmF1bHQ6CisJICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQljb250ZW50cywgcmVsLT5yX29mZnNldCwKKwkJCQkJcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIHN3aXRjaCAocikKKwl7CisJY2FzZSBiZmRfcmVsb2Nfb2s6CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgIGFib3J0ICgpOworCisJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkgICAgaWYgKGggIT0gTlVMTCkKKwkgICAgICB7CisJCWlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKKwkJICAgICYmIGhvd3RvLT5wY19yZWxhdGl2ZSkKKwkJICB7CisJCSAgICAvKiBBc3N1bWUgdGhpcyBpcyBhIGNhbGwgcHJvdGVjdGVkIGJ5IG90aGVyIGNvZGUgdGhhdAorCQkgICAgICAgZGV0ZWN0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwKKwkJICAgICAgIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBvdmVyZmxvdy4gIElmIG5vdCwgdGhlIAorCQkgICAgICAgcHJvZ3JhbSBpcyBob3NlZCBhbnl3YXksIGFuZCBhIGxpdHRsZSB3YXJuaW5nIGlzbid0CisJCSAgICAgICBnb2luZyB0byBoZWxwLiAgKi8KKwkJICAgIGJyZWFrOworCQkgIH0KKwkJICAKKwkgICAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCisJCQkoaW5wdXRfYmZkLAorCQkJIHN5bXRhYl9oZHItPnNoX2xpbmssCisJCQkgc3ltLT5zdF9uYW1lKSk7CisJCWlmIChuYW1lID09IE5VTEwpCisJCSAgcmV0dXJuIGZhbHNlOworCQlpZiAoKm5hbWUgPT0gJ1wwJykKKwkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOworCSAgICAgIH0KKwkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKKwkJICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwlicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKKyAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKK3sKKyAgYmZkICpkeW5vYmo7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcGx0OworICAgICAgYXNlY3Rpb24gKnNyZWxhOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKworICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBQTFQuICBTZXQgaXQgdXAuICovCisKKyAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLnBsdCIpOworICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOworCisgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLworCisgICAgICBpZiAoaC0+cGx0Lm9mZnNldCA8IExBUkdFX1BMVF9USFJFU0hPTEQpCisJeworCSAgcmVsYS5yX29mZnNldCA9IHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpOworCSAgcmVsYS5yX2FkZGVuZCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGludCBtYXggPSBzcGx0LT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKKwkgIHJlbGEucl9vZmZzZXQgPSBzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCAoaC0+cGx0Lm9mZnNldCwgbWF4KTsKKwkgIHJlbGEucl9hZGRlbmQgPSAtKHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpICsgNCk7CisJfQorICAgICAgcmVsYS5yX29mZnNldCArPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNwbHQtPm91dHB1dF9vZmZzZXQpOworICAgICAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfSk1QX1NMT1QpOworCisgICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKKwkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cworCQkJCSAgKyBoLT5wbHQub2Zmc2V0KSk7CisKKyAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisJeworCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgorCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCisJICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOworCX0KKyAgICB9CisKKyAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZ290OworICAgICAgYXNlY3Rpb24gKnNyZWxhOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKKworICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBHT1QuICBTZXQgaXQgdXAuICAqLworCisgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKyAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOworICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOworCisgICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAorCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKKwkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCisJIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgorCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgorCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCisgICAgICBpZiAoaW5mby0+c2hhcmVkCisJICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCisJeworCSAgYXNlY3Rpb24gKnNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKKwkgIHJlbGEucl9hZGRlbmQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkJICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7CisJICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19HTE9CX0RBVCk7CisJICByZWxhLnJfYWRkZW5kID0gMDsKKwl9CisKKyAgICAgIGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAorCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCisJCQkJICArIHNyZWxhLT5yZWxvY19jb3VudCkpOworICAgICAgKytzcmVsYS0+cmVsb2NfY291bnQ7CisgICAgfQorCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSkgIT0gMCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7CisKKyAgICAgIC8qIFRoaXMgc3ltYm9scyBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLworCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAorCQkJCSAgICIucmVsYS5ic3MiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisKKyAgICAgIHJlbGEucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0NPUFkpOworICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7CisgICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKKwkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCisJCQkJICArIHMtPnJlbG9jX2NvdW50KSk7CisgICAgICArK3MtPnJlbG9jX2NvdW50OworICAgIH0KKworICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCisgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQorICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqZHlub2JqOworICBhc2VjdGlvbiAqc2R5bjsKKyAgYXNlY3Rpb24gKnNnb3Q7CisKKyAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgc2R5biA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYW1pYyIpOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3BsdDsKKyAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZHluICE9IE5VTEwpOworCisgICAgICBkeW5jb24gPSAoRWxmNjRfRXh0ZXJuYWxfRHluICopIHNkeW4tPmNvbnRlbnRzOworICAgICAgZHluY29uZW5kID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSAoc2R5bi0+Y29udGVudHMgKyBzZHluLT5fcmF3X3NpemUpOworICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCisJeworCSAgRWxmX0ludGVybmFsX0R5biBkeW47CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgYm9vbGVhbiBzaXplOworCisJICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKKworCSAgc3dpdGNoIChkeW4uZF90YWcpCisJICAgIHsKKwkgICAgY2FzZSBEVF9QTFRHT1Q6ICAgbmFtZSA9ICIucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKKwkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgYnJlYWs7CisJICAgIGNhc2UgRFRfSk1QUkVMOiAgIG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IGZhbHNlOyBicmVhazsKKwkgICAgZGVmYXVsdDoJICAgICAgbmFtZSA9IE5VTEw7IHNpemUgPSBmYWxzZTsgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKG5hbWUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzOworCisJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKKwkgICAgICBpZiAocyA9PSBOVUxMKQorCQlkeW4uZF91bi5kX3ZhbCA9IDA7CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKCEgc2l6ZSkKKwkJICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQorCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7CisJCSAgICAgIGVsc2UKKwkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOworCQkgICAgfQorCQl9CisJICAgICAgYmZkX2VsZjY0X3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKKwkgICAgfQorCX0KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIC5wbHQgc2VjdGlvbi4gICovCisgICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKKwl7CisJICBzcGFyYzY0X2VsZl9idWlsZF9wbHQob3V0cHV0X2JmZCwgc3BsdC0+Y29udGVudHMsCisJCQkJc3BsdC0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkUpOworCX0KKworICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0KKwlQTFRfRU5UUllfU0laRTsKKyAgICB9CisKKyAgLyogU2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB0byB0aGUgYWRkcmVzcyBvZgorICAgICB0aGUgZHluYW1pYyBzZWN0aW9uLiAgKi8KKyAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisgIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQorICAgIHsKKyAgICAgIGlmIChzZHluID09IE5VTEwpCisJYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwliZmRfcHV0XzY0IChvdXRwdXRfYmZkLAorCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCisJCSAgICBzZ290LT5jb250ZW50cyk7CisgICAgfQorCisgIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDg7CisKKyAgaWYgKGluZm8tPnNoYXJlZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2R5bnN5bTsKKyAgICAgIGFzZWN0aW9uICpzOworICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07CisgICAgICBpbnQgYzsKKworICAgICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLworCisgICAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKKyAgICAgIEJGRF9BU1NFUlQgKHNkeW5zeW0gIT0gTlVMTCk7CisKKyAgICAgIHN5bS5zdF9zaXplID0gMDsKKyAgICAgIHN5bS5zdF9uYW1lID0gMDsKKyAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOworICAgICAgc3ltLnN0X290aGVyID0gMDsKKworICAgICAgYyA9IDA7CisgICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwl7CisJICBpbnQgaW5keDsKKworCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID09IDApCisJICAgIGNvbnRpbnVlOworCisJICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7CisKKwkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7CisJICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7CisJICBzeW0uc3Rfc2huZHggPSBpbmR4OworCisJICBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAorCQkJCSAgICAgKFBUUikgKCgoRWxmNjRfRXh0ZXJuYWxfU3ltICopCisJCQkJCSAgICAgc2R5bnN5bS0+Y29udGVudHMpCisJCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4KSk7CisKKwkgICsrYzsKKwl9CisKKyAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKKyAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KKyAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9IGMgKyAxOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHRoZSBlX2ZsYWdzIGZpZWxkLiAqLworCisvKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0CisgICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICppYmZkOworICAgICBiZmQgKm9iZmQ7Cit7CisgIGJvb2xlYW4gZXJyb3I7CisgIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOworICBpbnQgbmV3X21tLCBvbGRfbW07CisKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIG5ld19mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOworICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKKworICBpZiAoIWVsZl9mbGFnc19pbml0IChvYmZkKSkgICAvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KKyAgICB7CisgICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOworICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICBlbHNlIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKSAgICAgIC8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCisgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29tcGF0aWJsZSBmbGFncyAqLworICAgIHsKKyAgICAgIGVycm9yID0gZmFsc2U7CisgIAorICAgICAgb2xkX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKTsKKyAgICAgIG5ld19mbGFncyB8PSAob2xkX2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSk7CisgICAgICBpZiAoKG9sZF9mbGFncyAmIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpID09CisgICAgICAgICAgIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisgICAgICAgICAgICAoXygiJXM6IGxpbmtpbmcgVWx0cmFTUEFSQyBzcGVjaWZpYyB3aXRoIEhBTCBzcGVjaWZpYyBjb2RlIiksCisgICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgLyogQ2hvb3NlIHRoZSBtb3N0IHJlc3RyaWN0aXZlIG1lbW9yeSBvcmRlcmluZyAqLworICAgICAgb2xkX21tID0gKG9sZF9mbGFncyAmIEVGX1NQQVJDVjlfTU0pOworICAgICAgbmV3X21tID0gKG5ld19mbGFncyAmIEVGX1NQQVJDVjlfTU0pOworICAgICAgb2xkX2ZsYWdzICY9IH5FRl9TUEFSQ1Y5X01NOworICAgICAgbmV3X2ZsYWdzICY9IH5FRl9TUEFSQ1Y5X01NOworICAgICAgaWYgKG5ld19tbSA8IG9sZF9tbSkgb2xkX21tID0gbmV3X21tOworICAgICAgb2xkX2ZsYWdzIHw9IG9sZF9tbTsKKyAgICAgIG5ld19mbGFncyB8PSBvbGRfbW07CisKKyAgICAgIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KKyAgICAgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorICAgICAgICAgICAgKF8oIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIiksCisgICAgICAgICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIChsb25nKW5ld19mbGFncywgKGxvbmcpb2xkX2ZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG9sZF9mbGFnczsKKworICAgICAgaWYgKGVycm9yKQorICAgICAgICB7CisgICAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworDAorLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYSBTUEFSQzY0IEVMRiBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NwYXJjNjRfZWxmX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHVuc2lnbmVkIGxvbmcgbWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5OworICAKKyAgaWYgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfU1VOX1VTMSkKKyAgICBtYWNoID0gYmZkX21hY2hfc3BhcmNfdjlhOworICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfc3BhcmMsIG1hY2gpOworfQorCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNCWJmZF9lbGY2NF9zcGFyY192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCSJlbGY2NC1zcGFyYyIKKyNkZWZpbmUgRUxGX0FSQ0gJYmZkX2FyY2hfc3BhcmMKKyNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDB4MTAwMDAwCisKKy8qIFRoaXMgaXMgdGhlIG9mZmljaWFsIEFCSSB2YWx1ZS4gICovCisjZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgRU1fU1BBUkNWOQorCisvKiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdlIHVzZWQgYmVmb3JlIHRoZSBBQkkgd2FzIHJlbGVhc2VkLiAgKi8KKyNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSBFTV9PTERfU1BBUkNWOQorCisjZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIFwKKyAgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bworI2RlZmluZSBiZmRfZWxmNjRfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKKyAgc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKKworI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCisgIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyBcCisgIHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcworI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAorICBzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKKyAgc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24gXAorICBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCisgIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAorI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCisgIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCisKKyNkZWZpbmUgYmZkX2VsZjY0X2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKKyAgc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorCisjZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wIFwKKyAgc3BhcmM2NF9lbGZfb2JqZWN0X3AKKworI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAorI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAorI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQorCisvKiBTZWN0aW9uIDUuMi40IG9mIHRoZSBBQkkgc3BlY2lmaWVzIGEgMjU2LWJ5dGUgYm91bmRhcnkgZm9yIHRoZSB0YWJsZS4gICovCisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgOAorCisjZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA4CisjZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSBQTFRfSEVBREVSX1NJWkUKKworI2luY2x1ZGUgImVsZjY0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LmMgYi9iZmQvZWxmNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZiNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZjY0LmMKQEAgLTAsMCArMSwyMiBAQAorLyogRUxGIDY0LWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgQVJDSF9TSVpFCQk2NAorCisjaW5jbHVkZSAiZWxmY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZmFybS1uYWJpLmMgYi9iZmQvZWxmYXJtLW5hYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTUyZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZmFybS1uYWJpLmMKQEAgLTAsMCArMSw2NzAgQEAKKy8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG5ldyBhYmkgb3B0aW9uLgorICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImVsZi9hcm0uaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJlbGYtYmZkLmgiCisKKyNpZm5kZWYgTlVNX0VMRU0KKyNkZWZpbmUgTlVNX0VMRU0oYSkgIChzaXplb2YgKGEpIC8gKHNpemVvZiAoYSlbMF0pKQorI2VuZGlmCisKKyNkZWZpbmUgVVNFX1JFTAorCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgICAgICAgICAiZWxmMzItbGl0dGxlYXJtIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICAgICAgICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybSIKKworI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0b19yZWwgCisKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW10gPQoreworICAvKiBObyByZWxvY2F0aW9uICovCisgIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9OT05FIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9BUk1fUEMyNCwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IGFic29sdXRlICovCisgIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9BQlMzMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIHN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jICovCisgIEhPV1RPIChSX0FSTV9SRUwzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1JFTDMyIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogOCBiaXQgYWJzb2x1dGUgKi8KKyAgSE9XVE8gKFJfQVJNX1BDMTMsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9QQzEzIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLworICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fQUJTMTYiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDEyIGJpdCBhYnNvbHV0ZSAqLworICBIT1dUTyAoUl9BUk1fQUJTMTIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fQUJTMTIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDhmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDA4ZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9BUk1fVEhNX0FCUzUsCS8qIHR5cGUgKi8KKwkgNiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDUsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiA4IGJpdCBhYnNvbHV0ZSAqLworICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX0FCUzgiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9BUk1fU0JSRUwzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fU0JSRUwzMiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDIzLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9USE1fUEMyMiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1RITV9QQzgsCSAgICAgICAgLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fVEhNX1BDOCIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX0FNUF9WQ0FMTDksCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX0FNUF9WQ0FMTDkiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9TV0kyNCwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9TV0kyNCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9USE1fU1dJOCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1NXSTgiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBUaGVzZSBuZXh0IHR3byByZWxvY3MgYXJlIGRlZmluZWQsIGJ1dCBJIGRvIG5vdCBrbm93IHdoYXQgdGhleSBkby4gICovCisgIAorICBIT1dUTyAoUl9BUk1fWFBDMjUsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fWFBDMjUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9BUk1fVEhNX1hQQzIyLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fVEhNX1hQQzIyIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIFRoZXNlIG5leHQgdGhyZWUgcmVsb2NzIGFyZSBub3QgZGVmaW5lZCwgYnV0IHdlIG5lZWQgdG8gZmlsbCB0aGUgc3BhY2UuICAqLworCisgIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV91bmtub3duXzE3IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV91bmtub3duXzE4IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV91bmtub3duXzE5IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLworICAKKyAgSE9XVE8gKFJfQVJNX0NPUFksCQkvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisgICAgICAgICAiUl9BUk1fQ09QWSIsCQkvKiBuYW1lICovCisgICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisgICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX0dMT0JfREFULAkvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisgICAgICAgICAiUl9BUk1fR0xPQl9EQVQiLAkvKiBuYW1lICovCisgICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisgICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgICAgICAgICAKKyAgSE9XVE8gKFJfQVJNX0pVTVBfU0xPVCwJLyogdHlwZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfQVJNX0pVTVBfU0xPVCIsCS8qIG5hbWUgKi8KKyAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgICAgICAgIAorICBIT1dUTyAoUl9BUk1fUkVMQVRJVkUsCS8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX0FSTV9SRUxBVElWRSIsCS8qIG5hbWUgKi8KKyAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgICAgICAgIAorICBIT1dUTyAoUl9BUk1fR09UT0ZGLAkJLyogdHlwZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfQVJNX0dPVE9GRiIsCS8qIG5hbWUgKi8KKyAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgICAgICAgIAorICBIT1dUTyAoUl9BUk1fR09UUEMsCQkvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisgICAgICAgICAiUl9BUk1fR09UUEMiLAkJLyogbmFtZSAqLworICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisgICAgICAgICB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKyAgICAgICAgIAorICBIT1dUTyAoUl9BUk1fR09UMzIsCQkvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfQVJNX0dPVDMyIiwJCS8qIG5hbWUgKi8KKyAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisgICAgICAgICAKKyAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KKyAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBFbmQgb2YgcmVsb2NzIHVzZWQgaW4gQVJNIExpbnV4ICovIAorCisgIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1JSRUwzMiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICBIT1dUTyAoUl9BUk1fUkFCUzMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9SQUJTMzIiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1JQQzI0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9SQkFTRSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKK307CisKKyAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBoaWVyYXJjaHkgKi8KK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG8gPQorICBIT1dUTyAoUl9BUk1fR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCisgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLworICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKyAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfQVJNX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG8gPQorICBIT1dUTyAoUl9BUk1fR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKyAgICAgICAgICJSX0FSTV9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KKyAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG8gPQorICBIT1dUTyAoUl9BUk1fVEhNX1BDMTEsCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDExLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fVEhNX1BDMTEiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwN2ZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwMDdmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzlfaG93dG8gPQorICBIT1dUTyAoUl9BUk1fVEhNX1BDOSwJCS8qIHR5cGUgKi8KKwkgMSwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9USE1fUEM5IiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworIAorc3RhdGljIHZvaWQKK2VsZjMyX2FybV9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGFyZWxlbnQgKiBiZmRfcmVsb2M7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbCAqIGVsZl9yZWxvYzsKK3sKKyAgdW5zaWduZWQgaW50IHJfdHlwZTsKKyAgCisgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pOworCisgIHN3aXRjaCAocl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6CisgICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgorICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG87CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUl9BUk1fVEhNX1BDMTE6CisgICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG87CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUl9BUk1fVEhNX1BDOToKKyAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHJfdHlwZSA+PSBOVU1fRUxFTSAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKSkKKwliZmRfcmVsb2MtPmhvd3RvID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07CisgICAgICBicmVhazsKKyAgICB9Cit9CisgIAorc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKKyAgeworICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgYmZkX3JlbG9jX3ZhbDsKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIGVsZl9yZWxvY192YWw7CisgIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQoreworICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FfSwKKyAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNH0sCisgIHtCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzMyfSwKKyAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzJ9LAorICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4fSwKKyAge0JGRF9SRUxPQ18xNiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMTZ9LAorICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMn0sCisgIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1fSwKKyAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgUl9BUk1fVEhNX1BDMjJ9LAorICB7QkZEX1JFTE9DX0FSTV9DT1BZLCAgICAgICAgICAgICBSX0FSTV9DT1BZfSwKKyAge0JGRF9SRUxPQ19BUk1fR0xPQl9EQVQsICAgICAgICAgUl9BUk1fR0xPQl9EQVR9LAorICB7QkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsICAgICAgICBSX0FSTV9KVU1QX1NMT1R9LAorICB7QkZEX1JFTE9DX0FSTV9SRUxBVElWRSwgICAgICAgICBSX0FSTV9SRUxBVElWRX0sCisgIHtCRkRfUkVMT0NfQVJNX0dPVE9GRiwgICAgICAgICAgIFJfQVJNX0dPVE9GRn0sCisgIHtCRkRfUkVMT0NfQVJNX0dPVFBDLCAgICAgICAgICAgIFJfQVJNX0dPVFBDfSwKKyAge0JGRF9SRUxPQ19BUk1fR09UMzIsICAgICAgICAgICAgUl9BUk1fR09UMzJ9LAorICB7QkZEX1JFTE9DX0FSTV9QTFQzMiwgICAgICAgICAgICBSX0FSTV9QTFQzMn0KK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK2VsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87CisKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CisgICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKKworICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgorICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOworCisgICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKKyAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOworCisgICAgZGVmYXVsdDoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCisJaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQorCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07CisgICAgICAKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorfQorCisjaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTliOTIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmYXJtLW9hYmkuYwpAQCAtMCwwICsxLDM4MSBAQAorLyogMzItYml0IEVMRiBzdXBwb3J0IGZvciBBUk0gb2xkIGFiaSBvcHRpb24uCisgICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZWxmL2FybS1vYWJpLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorCisjZGVmaW5lIFVTRV9SRUxBCisKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgICAgICAgICAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICAgICAgICAgICAgImVsZjMyLWxpdHRsZWFybS1vYWJpIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICAgICAgICAgIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgICAgICAgICAgICAiZWxmMzItYmlnYXJtLW9hYmkiCisKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gICAgICAgICAgICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0bworI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIDAKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW10gPQoreworICAvKiBObyByZWxvY2F0aW9uICovCisgIEhPV1RPIChSX0FSTV9OT05FLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fTk9ORSIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1BDMjQsCQkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyNCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1BDMjQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgYWJzb2x1dGUgKi8KKyAgSE9XVE8gKFJfQVJNX0FCUzMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9BQlMzMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIHN0YW5kYXJkIDMyYml0IHBjLXJlbGF0aXZlIHJlbG9jICovCisgIEhPV1RPIChSX0FSTV9SRUwzMiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9SRUwzMiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDggYml0IGFic29sdXRlICovCisgIEhPV1RPIChSX0FSTV9BQlM4LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX0FCUzgiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCisJIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAgLyogMTYgYml0IGFic29sdXRlICovCisgIEhPV1RPIChSX0FSTV9BQlMxNiwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fQUJTMTYiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDEyIGJpdCBhYnNvbHV0ZSAqLworICBIT1dUTyAoUl9BUk1fQUJTMTIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX0FCUzEyIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDA4ZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwOGZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1RITV9BQlM1LAkvKiB0eXBlICovCisJIDYsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA1LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fVEhNX0FCUzUiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwN2UwLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwMDdlMCwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9USE1fUEMyMiwJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMjMsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9USE1fUEMyMiIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDdmZjA3ZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDA3ZmYwN2ZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1NCUkVMMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9TQlJFTDMyIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCisJIDEsCQkJLyogcmlnaHRzaGlmdCAqLworCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fQU1QX1ZDQUxMOSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCisgIEhPV1RPIChSX0FSTV9USE1fUEMxMSwJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTEsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9USE1fUEMxMSIsCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MDAwMDA3ZmYsCQkvKiBzcmNfbWFzayAqLworCSAweDAwMDAwN2ZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCisgIEhPV1RPIChSX0FSTV9USE1fUEM5LAkJLyogdHlwZSAqLworCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgOCwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1RITV9QQzkiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCisJIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCisgIEhPV1RPIChSX0FSTV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KKyAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCisgICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisgICAgICAgICAiUl9BUk1fR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KKyAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCisgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCisgICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCisgIEhPV1RPIChSX0FSTV9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLworICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKyAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLworICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KKyAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisgICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLworICAgICAgICAgIlJfQVJNX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCisgICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLworICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLworICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAKKworICBIT1dUTyAoUl9BUk1fUlJFTDMyLAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fUlJFTDMyIiwJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9SQUJTMzIsCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSX0FSTV9SQUJTMzIiLAkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgSE9XVE8gKFJfQVJNX1JQQzI0LAkJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUl9BUk1fUlBDMjQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIEhPV1RPIChSX0FSTV9SQkFTRSwJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJfQVJNX1JCQVNFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworfTsKKworc3RhdGljIHZvaWQKK2VsZjMyX2FybV9pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpiZmRfcmVsb2M7CisgICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmVsZl9yZWxvYzsKK3sKKyAgdW5zaWduZWQgaW50IHJfdHlwZTsKKworICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKTsKKyAgLyogZml4bWU6IG5lZWQgcmFuZ2UgdGVzdCAqLworICAvKiBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0VMRjMyX0FSTV9NQVgpOyAqLworICBiZmRfcmVsb2MtPmhvd3RvID0gJmVsZjMyX2FybV9ob3d0b190YWJsZVtyX3R5cGVdOworfQorCitzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcAorICB7CisgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7CisgICAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOworICB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAgZWxmMzJfYXJtX3JlbG9jX21hcFtdID0KK3sKKyAge0JGRF9SRUxPQ19OT05FLCBSX0FSTV9OT05FLH0sCisgIHtCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgUl9BUk1fUEMyNCx9LAorICB7QkZEX1JFTE9DXzMyLCBSX0FSTV9BQlMzMix9LAorICB7QkZEX1JFTE9DXzMyX1BDUkVMLCBSX0FSTV9SRUwzMix9LAorICB7QkZEX1JFTE9DXzgsIFJfQVJNX0FCUzgsfSwKKyAge0JGRF9SRUxPQ18xNiwgUl9BUk1fQUJTMTYsfSwKKyAge0JGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSwgUl9BUk1fQUJTMTIsfSwKKyAge0JGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VULCBSX0FSTV9USE1fQUJTNSx9LAorICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLCBSX0FSTV9USE1fUEMyMix9LAorICB7QkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX0FSTV9HTlVfVlRJTkhFUklUIH0sCisgIHtCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX0FSTV9HTlVfVlRFTlRSWSB9LAorICB7QkZEX1JFTE9DX05PTkUsIFJfQVJNX1NCUkVMMzIsfSwKKyAge0JGRF9SRUxPQ19OT05FLCBSX0FSTV9BTVBfVkNBTEw5LH0sCisgIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIsIFJfQVJNX1RITV9QQzExLH0sCisgIHtCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSwgUl9BUk1fVEhNX1BDOSx9Cit9OworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCitlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOworICAgICBpIDwgc2l6ZW9mIChlbGYzMl9hcm1fcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOworICAgICAgIGkrKykKKyAgICB7CisgICAgICBpZiAoZWxmMzJfYXJtX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCisJcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKKwliZmRfZWxmMzJfYXJtX29hYmlfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCisjZGVmaW5lIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKKwliZmRfZWxmMzJfYXJtX29hYmlfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCisjZGVmaW5lIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCisJYmZkX2VsZjMyX2FybV9vYWJpX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KKworI2luY2x1ZGUgImVsZjMyLWFybS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZmNvZGUuaCBiL2JmZC9lbGZjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmNjQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGZjb2RlLmgKQEAgLTAsMCArMSwxNDUyIEBACisvKiBFTEYgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbiBwdWJsaXNoZWQKKyAgIGluICJVTklYIFN5c3RlbSBWIFJlbGVhc2UgNCwgUHJvZ3JhbW1lcnMgR3VpZGU6IEFOU0kgQyBhbmQKKyAgIFByb2dyYW1taW5nIFN1cHBvcnQgVG9vbHMiLiAgU3VmZmljaWVudCBzdXBwb3J0IGZvciBnZGIuCisKKyAgIFJld3JpdHRlbiBieSBNYXJrIEVpY2hpbiBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uCisgICBwdWJsaXNoZWQgaW4gIlN5c3RlbSBWIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UiLCBjaGFwdGVycyA0CisgICBhbmQgNSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyAiUHJvY2Vzc29yIFN1cHBsZW1lbnQiIGRvY3VtZW50cworICAgZGVyaXZlZCBmcm9tIGl0LiBBZGRlZCBzdXBwb3J0IGZvciBhc3NlbWJsZXIgYW5kIG90aGVyIG9iamVjdCBmaWxlCisgICB1dGlsaXRpZXMuICBGdXJ0aGVyIHdvcmsgZG9uZSBieSBLZW4gUmFlYnVybiAoQ3lnbnVzIFN1cHBvcnQpLCBNaWNoYWVsCisgICBNZWlzc25lciAoT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uKSwgYW5kIFBldGVyIEhvb2dlbmJvb20gKFVuaXZlcnNpdHkKKyAgIG9mIFV0YWgpIHRvIGZpbmlzaCBhbmQgZXh0ZW5kIHRoaXMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogUHJvYmxlbXMgYW5kIG90aGVyIGlzc3VlcyB0byByZXNvbHZlLgorCisgICAoMSkJQkZEIGV4cGVjdHMgdGhlcmUgdG8gYmUgc29tZSBmaXhlZCBudW1iZXIgb2YgInNlY3Rpb25zIiBpbgorICAgICAgICB0aGUgb2JqZWN0IGZpbGUuICBJLkUuIHRoZXJlIGlzIGEgInNlY3Rpb25fY291bnQiIHZhcmlhYmxlIGluIHRoZQorCWJmZCBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgdGhlIG51bWJlciBvZiBzZWN0aW9ucy4gIEhvd2V2ZXIsIEVMRgorCXN1cHBvcnRzIG11bHRpcGxlICJ2aWV3cyIgb2YgYSBmaWxlLiAgSW4gcGFydGljdWxhciwgd2l0aCBjdXJyZW50CisJaW1wbGVtZW50YXRpb25zLCBleGVjdXRhYmxlIGZpbGVzIHR5cGljYWxseSBoYXZlIHR3byB0YWJsZXMsIGEKKwlwcm9ncmFtIGhlYWRlciB0YWJsZSBhbmQgYSBzZWN0aW9uIGhlYWRlciB0YWJsZSwgYm90aCBvZiB3aGljaAorCXBhcnRpdGlvbiB0aGUgZXhlY3V0YWJsZS4KKworCUluIEVMRi1zcGVhaywgdGhlICJsaW5raW5nIHZpZXciIG9mIHRoZSBmaWxlIHVzZXMgdGhlIHNlY3Rpb24gaGVhZGVyCisJdGFibGUgdG8gYWNjZXNzICJzZWN0aW9ucyIgd2l0aGluIHRoZSBmaWxlLCBhbmQgdGhlICJleGVjdXRpb24gdmlldyIKKwl1c2VzIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSB0byBhY2Nlc3MgInNlZ21lbnRzIiB3aXRoaW4gdGhlIGZpbGUuCisJIlNlZ21lbnRzIiB0eXBpY2FsbHkgbWF5IGNvbnRhaW4gYWxsIHRoZSBkYXRhIGZyb20gb25lIG9yIG1vcmUKKwkic2VjdGlvbnMiLgorCisJTm90ZSB0aGF0IHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBpcyBvcHRpb25hbCBpbiBFTEYgZXhlY3V0YWJsZXMsCisJYnV0IGl0IGlzIHRoaXMgaW5mb3JtYXRpb24gdGhhdCBpcyBtb3N0IHVzZWZ1bCB0byBnZGIuICBJZiB0aGUKKwlzZWN0aW9uIGhlYWRlciB0YWJsZSBpcyBtaXNzaW5nLCB0aGVuIGdkYiBzaG91bGQgcHJvYmFibHkgdHJ5CisJdG8gbWFrZSBkbyB3aXRoIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIChGSVhNRSkKKworICAgKDIpICBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgdHdpY2UsIG9uY2UgaW4gMzItYml0IG1vZGUgYW5kCisJb25jZSBpbiA2NC1iaXQgbW9kZS4gIE1vcmUgb2YgaXQgc2hvdWxkIGJlIG1hZGUgc2l6ZS1pbmRlcGVuZGVudAorCWFuZCBtb3ZlZCBpbnRvIGVsZi5jLgorCisgICAoMykJRUxGIHNlY3Rpb24gc3ltYm9scyBhcmUgaGFuZGxlZCByYXRoZXIgc2xvcHBpbHkgbm93LiAgVGhpcyBzaG91bGQKKwliZSBjbGVhbmVkIHVwLCBhbmQgRUxGIHNlY3Rpb24gc3ltYm9scyByZWNvbmNpbGVkIHdpdGggQkZEIHNlY3Rpb24KKwlzeW1ib2xzLgorCisgICAoNCkgIFdlIG5lZWQgYSBwdWJsaXNoZWQgc3BlYyBmb3IgNjQtYml0IEVMRi4gIFdlJ3ZlIGdvdCBzb21lIHN0dWZmIGhlcmUKKwl0aGF0IHdlJ3JlIHVzaW5nIGZvciBTUEFSQyBWOSA2NC1iaXQgY2hpcHMsIGJ1dCBkb24ndCBhc3N1bWUgdGhhdAorCWl0J3MgY2FzdCBpbiBzdG9uZS4KKyAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKworLyogUmVuYW1pbmcgc3RydWN0dXJlcywgdHlwZWRlZnMsIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHRvIGJlIHNpemUtc3BlY2lmaWMuICAqLworI2RlZmluZSBFbGZfRXh0ZXJuYWxfRWhkcglOQU1FKEVsZixFeHRlcm5hbF9FaGRyKQorI2RlZmluZSBFbGZfRXh0ZXJuYWxfU3ltCU5BTUUoRWxmLEV4dGVybmFsX1N5bSkKKyNkZWZpbmUgRWxmX0V4dGVybmFsX1NoZHIJTkFNRShFbGYsRXh0ZXJuYWxfU2hkcikKKyNkZWZpbmUgRWxmX0V4dGVybmFsX1BoZHIJTkFNRShFbGYsRXh0ZXJuYWxfUGhkcikKKyNkZWZpbmUgRWxmX0V4dGVybmFsX1JlbAlOQU1FKEVsZixFeHRlcm5hbF9SZWwpCisjZGVmaW5lIEVsZl9FeHRlcm5hbF9SZWxhCU5BTUUoRWxmLEV4dGVybmFsX1JlbGEpCisjZGVmaW5lIEVsZl9FeHRlcm5hbF9EeW4JTkFNRShFbGYsRXh0ZXJuYWxfRHluKQorCisjZGVmaW5lIGVsZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCU5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQorI2RlZmluZSBlbGZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCU5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpCisjZGVmaW5lIGVsZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgXAorICBOQU1FKGJmZF9lbGYsY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQorI2RlZmluZSBlbGZfb2JqZWN0X3AJCQlOQU1FKGJmZF9lbGYsb2JqZWN0X3ApCisjZGVmaW5lIGVsZl9jb3JlX2ZpbGVfcAkJCU5BTUUoYmZkX2VsZixjb3JlX2ZpbGVfcCkKKyNkZWZpbmUgZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQJTkFNRShiZmRfZWxmLGdldF9zeW10YWJfdXBwZXJfYm91bmQpCisjZGVmaW5lIGVsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAorICBOQU1FKGJmZF9lbGYsZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKQorI2RlZmluZSBlbGZfc3dhcF9yZWxvY19pbgkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2NfaW4pCisjZGVmaW5lIGVsZl9zd2FwX3JlbG9jYV9pbgkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2NhX2luKQorI2RlZmluZSBlbGZfc3dhcF9yZWxvY19vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jX291dCkKKyNkZWZpbmUgZWxmX3N3YXBfcmVsb2NhX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcmVsb2NhX291dCkKKyNkZWZpbmUgZWxmX3N3YXBfc3ltYm9sX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9zeW1ib2xfaW4pCisjZGVmaW5lIGVsZl9zd2FwX3N5bWJvbF9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3N5bWJvbF9vdXQpCisjZGVmaW5lIGVsZl9zd2FwX3BoZHJfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3BoZHJfaW4pCisjZGVmaW5lIGVsZl9zd2FwX3BoZHJfb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9waGRyX291dCkKKyNkZWZpbmUgZWxmX3N3YXBfZHluX2luCQkJTkFNRShiZmRfZWxmLHN3YXBfZHluX2luKQorI2RlZmluZSBlbGZfc3dhcF9keW5fb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9keW5fb3V0KQorI2RlZmluZSBlbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCU5BTUUoYmZkX2VsZixnZXRfcmVsb2NfdXBwZXJfYm91bmQpCisjZGVmaW5lIGVsZl9jYW5vbmljYWxpemVfcmVsb2MJCU5BTUUoYmZkX2VsZixjYW5vbmljYWxpemVfcmVsb2MpCisjZGVmaW5lIGVsZl9zbHVycF9zeW1ib2xfdGFibGUJCU5BTUUoYmZkX2VsZixzbHVycF9zeW1ib2xfdGFibGUpCisjZGVmaW5lIGVsZl9nZXRfc3ltdGFiCQkJTkFNRShiZmRfZWxmLGdldF9zeW10YWIpCisjZGVmaW5lIGVsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAorICBOQU1FKGJmZF9lbGYsY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKQorI2RlZmluZSBlbGZfbWFrZV9lbXB0eV9zeW1ib2wJCU5BTUUoYmZkX2VsZixtYWtlX2VtcHR5X3N5bWJvbCkKKyNkZWZpbmUgZWxmX2dldF9zeW1ib2xfaW5mbwkJTkFNRShiZmRfZWxmLGdldF9zeW1ib2xfaW5mbykKKyNkZWZpbmUgZWxmX2dldF9saW5lbm8JCQlOQU1FKGJmZF9lbGYsZ2V0X2xpbmVubykKKyNkZWZpbmUgZWxmX3NldF9hcmNoX21hY2gJCU5BTUUoYmZkX2VsZixzZXRfYXJjaF9tYWNoKQorI2RlZmluZSBlbGZfZmluZF9uZWFyZXN0X2xpbmUJCU5BTUUoYmZkX2VsZixmaW5kX25lYXJlc3RfbGluZSkKKyNkZWZpbmUgZWxmX3NpemVvZl9oZWFkZXJzCQlOQU1FKGJmZF9lbGYsc2l6ZW9mX2hlYWRlcnMpCisjZGVmaW5lIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cwlOQU1FKGJmZF9lbGYsc2V0X3NlY3Rpb25fY29udGVudHMpCisjZGVmaW5lIGVsZl9ub19pbmZvX3RvX2hvd3RvCQlOQU1FKGJmZF9lbGYsbm9faW5mb190b19ob3d0bykKKyNkZWZpbmUgZWxmX25vX2luZm9fdG9faG93dG9fcmVsCU5BTUUoYmZkX2VsZixub19pbmZvX3RvX2hvd3RvX3JlbCkKKyNkZWZpbmUgZWxmX2ZpbmRfc2VjdGlvbgkJTkFNRShiZmRfZWxmLGZpbmRfc2VjdGlvbikKKyNkZWZpbmUgZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzCU5BTUUoYmZkX2VsZixiZmRfbGlua19hZGRfc3ltYm9scykKKyNkZWZpbmUgZWxmX2FkZF9keW5hbWljX2VudHJ5CQlOQU1FKGJmZF9lbGYsYWRkX2R5bmFtaWNfZW50cnkpCisjZGVmaW5lIGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcglOQU1FKGJmZF9lbGYsd3JpdGVfc2hkcnNfYW5kX2VoZHIpCisjZGVmaW5lIGVsZl93cml0ZV9vdXRfcGhkcnMJCU5BTUUoYmZkX2VsZix3cml0ZV9vdXRfcGhkcnMpCisjZGVmaW5lIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFwKKyAgTkFNRShiZmRfZWxmLGxpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpCisjZGVmaW5lIGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKKyNkZWZpbmUgZWxmX2JmZF9maW5hbF9saW5rCQlOQU1FKGJmZF9lbGYsYmZkX2ZpbmFsX2xpbmspCisjZGVmaW5lIGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiBOQU1FKGJmZF9lbGYsY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pCisjZGVmaW5lIGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiBOQU1FKGJmZF9lbGYsZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pCisjZGVmaW5lIGVsZl9nY19zZWN0aW9ucwkJCU5BTUUoX2JmZF9lbGYsZ2Nfc2VjdGlvbnMpCisjZGVmaW5lIGVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgXAorICBOQU1FKF9iZmRfZWxmLGdjX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cykKKyNkZWZpbmUgZWxmX2djX2NvbW1vbl9maW5hbF9saW5rCU5BTUUoX2JmZF9lbGYsZ2NfY29tbW9uX2ZpbmFsX2xpbmspCisjZGVmaW5lIGVsZl9nY19yZWNvcmRfdnRpbmhlcml0CQlOQU1FKF9iZmRfZWxmLGdjX3JlY29yZF92dGluaGVyaXQpCisjZGVmaW5lIGVsZl9nY19yZWNvcmRfdnRlbnRyeQkJTkFNRShfYmZkX2VsZixnY19yZWNvcmRfdnRlbnRyeSkKKworI2lmIEFSQ0hfU0laRSA9PSA2NAorI2RlZmluZSBFTEZfUl9JTkZPKFgsWSkJRUxGNjRfUl9JTkZPKFgsWSkKKyNkZWZpbmUgRUxGX1JfU1lNKFgpCUVMRjY0X1JfU1lNKFgpCisjZGVmaW5lIEVMRl9SX1RZUEUoWCkJRUxGNjRfUl9UWVBFKFgpCisjZGVmaW5lIEVMRkNMQVNTCUVMRkNMQVNTNjQKKyNkZWZpbmUgRklMRV9BTElHTgk4CisjZGVmaW5lIExPR19GSUxFX0FMSUdOCTMKKyNlbmRpZgorI2lmIEFSQ0hfU0laRSA9PSAzMgorI2RlZmluZSBFTEZfUl9JTkZPKFgsWSkJRUxGMzJfUl9JTkZPKFgsWSkKKyNkZWZpbmUgRUxGX1JfU1lNKFgpCUVMRjMyX1JfU1lNKFgpCisjZGVmaW5lIEVMRl9SX1RZUEUoWCkJRUxGMzJfUl9UWVBFKFgpCisjZGVmaW5lIEVMRkNMQVNTCUVMRkNMQVNTMzIKKyNkZWZpbmUgRklMRV9BTElHTgk0CisjZGVmaW5lIExPR19GSUxFX0FMSUdOCTIKKyNlbmRpZgorCisvKiBTdGF0aWMgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGVsZl9zd2FwX2VoZHJfaW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9FaGRyICosIEVsZl9JbnRlcm5hbF9FaGRyICopKTsKK3N0YXRpYyB2b2lkIGVsZl9zd2FwX2VoZHJfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfRWhkciAqLCBFbGZfRXh0ZXJuYWxfRWhkciAqKSk7CitzdGF0aWMgdm9pZCBlbGZfc3dhcF9zaGRyX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfU2hkciAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7CitzdGF0aWMgdm9pZCBlbGZfc3dhcF9zaGRyX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKiwgRWxmX0V4dGVybmFsX1NoZHIgKikpOworCisjZGVmaW5lIGVsZl9zdHJpbmd0YWJfaW5pdCBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdAorCisjZGVmaW5lIHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXgKKworc3RhdGljIGJvb2xlYW4gZWxmX3NsdXJwX3JlbG9jX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7CisKK3N0YXRpYyB2b2lkIHdyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKK3N0YXRpYyBib29sZWFuIGVsZl9maWxlX3AgUEFSQU1TICgoRWxmX0V4dGVybmFsX0VoZHIgKikpOworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGVsZl9kZWJ1Z19zZWN0aW9uIFBBUkFNUyAoKGludCwgRWxmX0ludGVybmFsX1NoZHIgKikpOworc3RhdGljIHZvaWQgZWxmX2RlYnVnX2ZpbGUgUEFSQU1TICgoRWxmX0ludGVybmFsX0VoZHIgKikpOworc3RhdGljIGNoYXIgKmVsZl9zeW1ib2xfZmxhZ3MgUEFSQU1TICgoZmxhZ3dvcmQpKTsKKyNlbmRpZgorDAorLyogU3RydWN0dXJlIHN3YXBwaW5nIHJvdXRpbmVzICovCisKKy8qIFNob3VsZCBwZXJoYXBzIHVzZSBwdXRfb2Zmc2V0LCBwdXRfd29yZCwgZXRjLiAgRm9yIG5vdywgdGhlIHR3byB2ZXJzaW9ucworICAgY2FuIGJlIGhhbmRsZWQgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDMyIGJpdHMgb3IgInRoZSBsb25nIHR5cGUiLiAgKi8KKyNpZiBBUkNIX1NJWkUgPT0gNjQKKyNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzY0CisjZGVmaW5lIHB1dF9zaWduZWRfd29yZAliZmRfaF9wdXRfc2lnbmVkXzY0CisjZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF82NAorI2RlZmluZSBnZXRfc2lnbmVkX3dvcmQJYmZkX2hfZ2V0X3NpZ25lZF82NAorI2VuZGlmCisjaWYgQVJDSF9TSVpFID09IDMyCisjZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF8zMgorI2RlZmluZSBwdXRfc2lnbmVkX3dvcmQJYmZkX2hfcHV0X3NpZ25lZF8zMgorI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfMzIKKyNkZWZpbmUgZ2V0X3NpZ25lZF93b3JkCWJmZF9oX2dldF9zaWduZWRfMzIKKyNlbmRpZgorCisvKiBUcmFuc2xhdGUgYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgc3ltYm9sIGluIGludGVybmFsCisgICBmb3JtYXQuICovCisKK3ZvaWQKK2VsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0V4dGVybmFsX1N5bSAqc3JjOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpkc3Q7Cit7CisgIGRzdC0+c3RfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfbmFtZSk7CisgIGRzdC0+c3RfdmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfdmFsdWUpOworICBkc3QtPnN0X3NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2l6ZSk7CisgIGRzdC0+c3RfaW5mbyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9pbmZvKTsKKyAgZHN0LT5zdF9vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9vdGhlcik7CisgIGRzdC0+c3Rfc2huZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3NobmR4KTsKK30KKworLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbAorICAgZm9ybWF0LiAqLworCit2b2lkCitlbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCBzcmMsIGNkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3JjOworICAgICBQVFIgY2RzdDsKK3sKKyAgRWxmX0V4dGVybmFsX1N5bSAqZHN0ID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgY2RzdDsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnN0X25hbWUsIGRzdC0+c3RfbmFtZSk7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPnN0X3ZhbHVlLCBkc3QtPnN0X3ZhbHVlKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3Rfc2l6ZSwgZHN0LT5zdF9zaXplKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3RfaW5mbywgZHN0LT5zdF9pbmZvKTsKKyAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3Rfb3RoZXIsIGRzdC0+c3Rfb3RoZXIpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+c3Rfc2huZHgsIGRzdC0+c3Rfc2huZHgpOworfQorCisKKy8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCisgICBpbnRlcm5hbCBmb3JtYXQuICovCisKK3N0YXRpYyB2b2lkCitlbGZfc3dhcF9laGRyX2luIChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqc3JjOworICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZHN0OworeworICBtZW1jcHkgKGRzdC0+ZV9pZGVudCwgc3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOworICBkc3QtPmVfdHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV90eXBlKTsKKyAgZHN0LT5lX21hY2hpbmUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfbWFjaGluZSk7CisgIGRzdC0+ZV92ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3ZlcnNpb24pOworICBkc3QtPmVfZW50cnkgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9lbnRyeSk7CisgIGRzdC0+ZV9waG9mZiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Bob2ZmKTsKKyAgZHN0LT5lX3Nob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hvZmYpOworICBkc3QtPmVfZmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZmxhZ3MpOworICBkc3QtPmVfZWhzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2Voc2l6ZSk7CisgIGRzdC0+ZV9waGVudHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhlbnRzaXplKTsKKyAgZHN0LT5lX3BobnVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3BobnVtKTsKKyAgZHN0LT5lX3NoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaGVudHNpemUpOworICBkc3QtPmVfc2hudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hudW0pOworICBkc3QtPmVfc2hzdHJuZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hzdHJuZHgpOworfQorCisvKiBUcmFuc2xhdGUgYW4gRUxGIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBmaWxlIGhlYWRlciBpbgorICAgZXh0ZXJuYWwgZm9ybWF0LiAqLworCitzdGF0aWMgdm9pZAorZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICpzcmM7CisgICAgIEVsZl9FeHRlcm5hbF9FaGRyICpkc3Q7Cit7CisgIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7CisgIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfdHlwZSwgZHN0LT5lX3R5cGUpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9tYWNoaW5lLCBkc3QtPmVfbWFjaGluZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5lX3ZlcnNpb24sIGRzdC0+ZV92ZXJzaW9uKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9lbnRyeSwgZHN0LT5lX2VudHJ5KTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9waG9mZiwgZHN0LT5lX3Bob2ZmKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9zaG9mZiwgZHN0LT5lX3Nob2ZmKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfZmxhZ3MsIGRzdC0+ZV9mbGFncyk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX2Voc2l6ZSwgZHN0LT5lX2Voc2l6ZSk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BoZW50c2l6ZSwgZHN0LT5lX3BoZW50c2l6ZSk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BobnVtLCBkc3QtPmVfcGhudW0pOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaGVudHNpemUsIGRzdC0+ZV9zaGVudHNpemUpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaG51bSwgZHN0LT5lX3NobnVtKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hzdHJuZHgsIGRzdC0+ZV9zaHN0cm5keCk7Cit9CisKKworLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgorICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KKworc3RhdGljIHZvaWQKK2VsZl9zd2FwX3NoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICpzcmM7CisgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpkc3Q7Cit7CisgIGRzdC0+c2hfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfbmFtZSk7CisgIGRzdC0+c2hfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfdHlwZSk7CisgIGRzdC0+c2hfZmxhZ3MgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfZmxhZ3MpOworICBkc3QtPnNoX2FkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7CisgIGRzdC0+c2hfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX29mZnNldCk7CisgIGRzdC0+c2hfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9zaXplKTsKKyAgZHN0LT5zaF9saW5rID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9saW5rKTsKKyAgZHN0LT5zaF9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9pbmZvKTsKKyAgZHN0LT5zaF9hZGRyYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcmFsaWduKTsKKyAgZHN0LT5zaF9lbnRzaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2VudHNpemUpOworICBkc3QtPmJmZF9zZWN0aW9uID0gTlVMTDsKKyAgZHN0LT5jb250ZW50cyA9IE5VTEw7Cit9CisKKy8qIFRyYW5zbGF0ZSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4KKyAgIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQuICovCisKK3N0YXRpYyB2b2lkCitlbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKnNyYzsKKyAgICAgRWxmX0V4dGVybmFsX1NoZHIgKmRzdDsKK3sKKyAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfbmFtZSwgZHN0LT5zaF9uYW1lKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX3R5cGUsIGRzdC0+c2hfdHlwZSk7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2ZsYWdzLCBkc3QtPnNoX2ZsYWdzKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkciwgZHN0LT5zaF9hZGRyKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfb2Zmc2V0LCBkc3QtPnNoX29mZnNldCk7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX3NpemUsIGRzdC0+c2hfc2l6ZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9saW5rLCBkc3QtPnNoX2xpbmspOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfaW5mbywgZHN0LT5zaF9pbmZvKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkcmFsaWduLCBkc3QtPnNoX2FkZHJhbGlnbik7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2VudHNpemUsIGRzdC0+c2hfZW50c2l6ZSk7Cit9CisKKworLyogVHJhbnNsYXRlIGFuIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgorICAgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KKwordm9pZAorZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0V4dGVybmFsX1BoZHIgKnNyYzsKKyAgICAgRWxmX0ludGVybmFsX1BoZHIgKmRzdDsKK3sKKyAgZHN0LT5wX3R5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfdHlwZSk7CisgIGRzdC0+cF9mbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9mbGFncyk7CisgIGRzdC0+cF9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9vZmZzZXQpOworICBkc3QtPnBfdmFkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF92YWRkcik7CisgIGRzdC0+cF9wYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3BhZGRyKTsKKyAgZHN0LT5wX2ZpbGVzeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZpbGVzeik7CisgIGRzdC0+cF9tZW1zeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX21lbXN6KTsKKyAgZHN0LT5wX2FsaWduID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfYWxpZ24pOworfQorCit2b2lkCitlbGZfc3dhcF9waGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnNyYzsKKyAgICAgRWxmX0V4dGVybmFsX1BoZHIgKmRzdDsKK3sKKyAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF90eXBlLCBkc3QtPnBfdHlwZSk7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfb2Zmc2V0LCBkc3QtPnBfb2Zmc2V0KTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF92YWRkciwgZHN0LT5wX3ZhZGRyKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9wYWRkciwgZHN0LT5wX3BhZGRyKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9maWxlc3osIGRzdC0+cF9maWxlc3opOworICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX21lbXN6LCBkc3QtPnBfbWVtc3opOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF9mbGFncywgZHN0LT5wX2ZsYWdzKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9hbGlnbiwgZHN0LT5wX2FsaWduKTsKK30KKworLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGV4dGVybmFsIGZvcm1hdCB0byBpbnRlcm5hbCBmb3JtYXQuICovCitJTkxJTkUgdm9pZAorZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9SZWwgKnNyYzsKKyAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OworeworICBkc3QtPnJfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKKyAgZHN0LT5yX2luZm8gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9pbmZvKTsKK30KKworSU5MSU5FIHZvaWQKK2VsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0V4dGVybmFsX1JlbGEgKnNyYzsKKyAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKK3sKKyAgZHN0LT5yX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7CisgIGRzdC0+cl9pbmZvID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfaW5mbyk7CisgIGRzdC0+cl9hZGRlbmQgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfYWRkZW5kKTsKK30KKworLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGludGVybmFsIGZvcm1hdCB0byBleHRlcm5hbCBmb3JtYXQuICovCitJTkxJTkUgdm9pZAorZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7CisgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmRzdDsKK3sKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIGRzdC0+cl9vZmZzZXQpOworICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX2luZm8sIGRzdC0+cl9pbmZvKTsKK30KKworSU5MSU5FIHZvaWQKK2VsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpzcmM7CisgICAgIEVsZl9FeHRlcm5hbF9SZWxhICpkc3Q7Cit7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfb2Zmc2V0LCBkc3QtPnJfb2Zmc2V0KTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9pbmZvLCBkc3QtPnJfaW5mbyk7CisgIHB1dF9zaWduZWRfd29yZCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgZHN0LT5yX2FkZGVuZCk7Cit9CisKK0lOTElORSB2b2lkCitlbGZfc3dhcF9keW5faW4gKGFiZmQsIHAsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBQVFIgcDsKKyAgICAgRWxmX0ludGVybmFsX0R5biAqZHN0OworeworICBjb25zdCBFbGZfRXh0ZXJuYWxfRHluICpzcmMgPSAoY29uc3QgRWxmX0V4dGVybmFsX0R5biAqKSBwOworCisgIGRzdC0+ZF90YWcgPSBnZXRfd29yZCAoYWJmZCwgc3JjLT5kX3RhZyk7CisgIGRzdC0+ZF91bi5kX3ZhbCA9IGdldF93b3JkIChhYmZkLCBzcmMtPmRfdW4uZF92YWwpOworfQorCitJTkxJTkUgdm9pZAorZWxmX3N3YXBfZHluX291dCAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgRWxmX0ludGVybmFsX0R5biAqc3JjOworICAgICBFbGZfRXh0ZXJuYWxfRHluICpkc3Q7Cit7CisgIHB1dF93b3JkIChhYmZkLCBzcmMtPmRfdGFnLCBkc3QtPmRfdGFnKTsKKyAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCwgZHN0LT5kX3VuLmRfdmFsKTsKK30KKwwKKy8qIEVMRiAuby9leGVjIGZpbGUgcmVhZGluZyAqLworCisKKy8qIEJlZ2luIHByb2Nlc3NpbmcgYSBnaXZlbiBvYmplY3QuCisKKyAgIEZpcnN0IHdlIHZhbGlkYXRlIHRoZSBmaWxlIGJ5IHJlYWRpbmcgaW4gdGhlIEVMRiBoZWFkZXIgYW5kIGNoZWNraW5nCisgICB0aGUgbWFnaWMgbnVtYmVyLiAgKi8KKworc3RhdGljIElOTElORSBib29sZWFuCitlbGZfZmlsZV9wICh4X2VoZHJwKQorICAgICBFbGZfRXh0ZXJuYWxfRWhkciAqeF9laGRycDsKK3sKKyAgcmV0dXJuICgoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcwXSA9PSBFTEZNQUcwKQorCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMV0gPT0gRUxGTUFHMSkKKwkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzJdID09IEVMRk1BRzIpCisJICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUczXSA9PSBFTEZNQUczKSk7Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggQUJGRCBtYXRjaGVzIHRoZSB0YXJnZXQgdmVjdG9yCisgICB0aGF0IEFCRkQgcG9pbnRzIHRvLgorCisgICBOb3RlIHRoYXQgd2UgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlIHNhbWUgQUJGRCwgYnV0IGRpZmZlcmVudAorICAgdGFyZ2V0IHZlY3RvcnMsIG1vc3Qgb2Ygd2hpY2ggd2lsbCBub3QgbWF0Y2guICBXZSBoYXZlIHRvIGF2b2lkIGxlYXZpbmcKKyAgIGFueSBzaWRlIGVmZmVjdHMgaW4gQUJGRCwgb3IgYW55IGRhdGEgaXQgcG9pbnRzIHRvIChsaWtlIHRkYXRhKSwgaWYgdGhlCisgICBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KKworY29uc3QgYmZkX3RhcmdldCAqCitlbGZfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KKyAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLworICBFbGZfRXh0ZXJuYWxfU2hkciB4X3NoZHI7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5LCBleHRlcm5hbCBmb3JtICovCisgIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwID0gTlVMTDsgLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KKyAgdW5zaWduZWQgaW50IHNoaW5kZXg7CisgIGNoYXIgKnNoc3RydGFiOwkJLyogSW50ZXJuYWwgY29weSBvZiBzZWN0aW9uIGhlYWRlciBzdHJpbmd0YWIgKi8KKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKKyAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7CisgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOworICBhc2VjdGlvbiAqczsKKworICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKyAgICAgIGVsc2UKKwlnb3RvIGdvdF9ub19tYXRjaDsKKyAgICB9CisKKyAgLyogTm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgRUxGIGZpbGUsIGFuZCBvbmUgdGhhdCBCRkQgY2FuCisgICAgIG1ha2UgdXNlIG9mLiAgVGhlIG1hZ2ljIG51bWJlciBtdXN0IG1hdGNoLCB0aGUgYWRkcmVzcyBzaXplICgnY2xhc3MnKQorICAgICBhbmQgYnl0ZS1zd2FwcGluZyBtdXN0IG1hdGNoIG91ciBYVkVDIGVudHJ5LCBhbmQgaXQgbXVzdCBoYXZlIGEKKyAgICAgc2VjdGlvbiBoZWFkZXIgdGFibGUgKEZJWE1FOiBTZWUgY29tbWVudHMgcmUgc2VjdGlvbnMgYXQgdG9wIG9mIHRoaXMKKyAgICAgZmlsZSkuICovCisKKyAgaWYgKChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkgfHwKKyAgICAgICh4X2VoZHIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB8fAorICAgICAgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykpCisgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOworCisgIC8qIENoZWNrIHRoYXQgZmlsZSdzIGJ5dGUgb3JkZXIgbWF0Y2hlcyB4dmVjJ3MgKi8KKyAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKKyAgICB7CisgICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KKyAgICAgIGlmICghIGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisJZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KKyAgICAgIGlmICghIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCisJZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTEZEQVRBTk9ORToJCS8qIE5vIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCisgICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCisgICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlbGZfb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bworICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KKworICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCisJICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKSk7CisgIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKKyAgICBnb3RvIGdvdF9ub19tYXRjaDsKKyAgZWxmX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBieXRlIG9yZGVyLCBzd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgKi8KKyAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOworICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKKyNpZiBERUJVRyAmIDEKKyAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOworI2VuZGlmCisKKyAgLyogUmVqZWN0IEVUX0NPUkUgKGhlYWRlciBpbmRpY2F0ZXMgY29yZSBmaWxlLCBub3Qgb2JqZWN0IGZpbGUpICovCisgIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfQ09SRSkKKyAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7CisKKyAgLyogSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIgdGFibGUsIHdlJ3JlIGhvc2VkLiAqLworICBpZiAoaV9laGRycC0+ZV9zaG9mZiA9PSAwKQorICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKworICAvKiBBcyBhIHNpbXBsZSBzYW5pdHkgY2hlY2ssIHZlcmlmeSB0aGF0IHRoZSB3aGF0IEJGRCB0aGlua3MgaXMgdGhlCisgICAgIHNpemUgb2YgZWFjaCBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBhY3R1YWxseSBtYXRjaGVzIHRoZSBzaXplCisgICAgIHJlY29yZGVkIGluIHRoZSBmaWxlLiAqLworICBpZiAoaV9laGRycC0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mICh4X3NoZHIpKQorICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKworICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCisgICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCisgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCisgICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKKyAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKKyAgICB7CisgICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7CisKKyAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKKwlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7CisKKyAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAorCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KKyAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCisJeworCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7CisKKwkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisJICAgIGNvbnRpbnVlOworCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7CisJICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUKKwkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MSAhPSAwCisJCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCisJICAgICAgfHwgKGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgIT0gMAorCQkgICYmIGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgPT0gaV9laGRycC0+ZV9tYWNoaW5lKSkKKwkgICAgeworCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCisJCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLworCSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9FWEVDKQorICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKKyAgZWxzZSBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0RZTikKKyAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOworCisgIGlmIChpX2VoZHJwLT5lX3BobnVtID4gMCkKKyAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOworCisgIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCisgICAgeworICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLworICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQorCWdvdG8gZ290X25vX21hdGNoOworICAgIH0KKworICAvKiBSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3BlY2lmaWVkIGluIHRoZSBFTEYgZmlsZSBoZWFkZXIuICovCisgIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluCisgICAgIGludGVybmFsIGZvcm0sIHNlZWsgdG8gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIHRoZSBmaWxlLAorICAgICByZWFkIGl0IGluLCBhbmQgY29udmVydCBpdCB0byBpbnRlcm5hbCBmb3JtLiAgKi8KKyAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKKwkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSk7CisgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQorCQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkgICAgICAgc2l6ZW9mIChpX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKKyAgaWYgKCFpX3NoZHJwIHx8ICFlbGZfZWxmc2VjdGlvbnMgKGFiZmQpKQorICAgIGdvdG8gZ290X25vX21hdGNoOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwKQorICAgIGdvdG8gZ290X25vX21hdGNoOworICBmb3IgKHNoaW5kZXggPSAwOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQorICAgIHsKKyAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X3NoZHIsIHNpemVvZiB4X3NoZHIsIDEsIGFiZmQpICE9IHNpemVvZiAoeF9zaGRyKSkKKwlnb3RvIGdvdF9ub19tYXRjaDsKKyAgICAgIGVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsICZ4X3NoZHIsIGlfc2hkcnAgKyBzaGluZGV4KTsKKyAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBpX3NoZHJwICsgc2hpbmRleDsKKworICAgICAgLyogSWYgdGhlIHNlY3Rpb24gaXMgbG9hZGVkLCBidXQgbm90IHBhZ2UgYWxpZ25lZCwgY2xlYXIKKyAgICAgICAgIERfUEFHRUQuICAqLworICAgICAgaWYgKChpX3NoZHJwW3NoaW5kZXhdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCisJICAmJiBpX3NoZHJwW3NoaW5kZXhdLnNoX3R5cGUgIT0gU0hUX05PQklUUworCSAgJiYgKCgoaV9zaGRycFtzaGluZGV4XS5zaF9hZGRyIC0gaV9zaGRycFtzaGluZGV4XS5zaF9vZmZzZXQpCisJICAgICAgICUgZWJkLT5tYXhwYWdlc2l6ZSkKKwkgICAgICAhPSAwKSkKKwlhYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKKyAgICB9CisgIGlmIChpX2VoZHJwLT5lX3Noc3RybmR4KQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCkpCisJZ290byBnb3Rfbm9fbWF0Y2g7CisgICAgfQorCisgIC8qIFJlYWQgaW4gdGhlIHByb2dyYW0gaGVhZGVycy4gICovCisgIGlmIChpX2VoZHJwLT5lX3BobnVtID09IDApCisgICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IE5VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRyOworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCisJCQkJYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgICAoaV9laGRycC0+ZV9waG51bQorCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpKTsKKyAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5waGRyID09IE5VTEwpCisJZ290byBnb3Rfbm9fbWF0Y2g7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfcGhvZmYsIFNFRUtfU0VUKSAhPSAwKQorCWdvdG8gZ290X25vX21hdGNoOworICAgICAgaV9waGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpX2VoZHJwLT5lX3BobnVtOyBpKyssIGlfcGhkcisrKQorCXsKKwkgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKKworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgeF9waGRyLCAxLCBhYmZkKQorCSAgICAgICE9IHNpemVvZiB4X3BoZHIpCisJICAgIGdvdG8gZ290X25vX21hdGNoOworCSAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRyKTsKKwl9CisgICAgfQorCisgIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgc2VjdGlvbnMuICBXZQorICAgICB3aWxsIG5lZWQgdGhlIGJhc2UgcG9pbnRlciB0byB0aGlzIHRhYmxlIGxhdGVyLiAqLworICAvKiBXZSByZWFkIHRoaXMgaW5saW5lIG5vdywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGdvIHRocm91Z2gKKyAgICAgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIHdpdGggaXQgKHNpbmNlIHRoaXMgcGFydGljdWxhciBzdHJ0YWIgaXMKKyAgICAgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgRUxGIHNlY3Rpb24gbmFtZXMuKSAqLworCisgIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIGlfZWhkcnAtPmVfc2hzdHJuZHgpOworICBpZiAoIXNoc3RydGFiKQorICAgIGdvdG8gZ290X25vX21hdGNoOworCisgIC8qIE9uY2UgYWxsIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMgaGF2ZSBiZWVuIHJlYWQgYW5kIGNvbnZlcnRlZCwgd2UKKyAgICAgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gIE5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgaXMKKyAgICAgYSBkdW1teSBwbGFjZWhvbGRlciBlbnRyeSwgc28gd2UgaWdub3JlIGl0LiAgKi8KKworICBmb3IgKHNoaW5kZXggPSAxOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgc2hpbmRleCkpCisJZ290byBnb3Rfbm9fbWF0Y2g7CisgICAgfQorCisgIC8qIExldCB0aGUgYmFja2VuZCBkb3VibGUgY2hlY2sgdGhlIGZvcm1hdCBhbmQgb3ZlcnJpZGUgZ2xvYmFsCisgICAgIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApCisgICAgeworICAgICAgaWYgKCgqZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpID09IGZhbHNlKQorCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKyAgICB9CisKKyAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSByZWxvYyBzZWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgZGVidWdnaW5nIHNlY3Rpb25zLCBtYXJrIHRoZSByZWxvYyBzZWN0aW9ucyBhcyBkZWJ1Z2dpbmcgYXMgd2VsbC4gICovCisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAorCSAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKQorCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm8gPiAwKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgdGFyZ19pbmRleDsKKwkgIGFzZWN0aW9uICp0YXJnX3NlYzsKKworCSAgdGFyZ19pbmRleCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9pbmZvOworCSAgdGFyZ19zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgdGFyZ19pbmRleCk7CisJICBpZiAodGFyZ19zZWMgIT0gTlVMTAorCSAgICAgICYmICh0YXJnX3NlYy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQorCSAgICBzLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOworCX0KKyAgICB9CisKKyAgcmV0dXJuIChhYmZkLT54dmVjKTsKKworIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I6CisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworIGdvdF9ub19tYXRjaDoKKyAgaWYgKG5ld190ZGF0YSAhPSBOVUxMCisgICAgICAmJiBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0ciAhPSBOVUxMKQorICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0cik7CisgIGlmIChpX3NoZHJwICE9IE5VTEwpCisgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOworICBpZiAobmV3X3RkYXRhICE9IE5VTEwpCisgICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YSk7CisgIGVsZl90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7CisgIHJldHVybiAoTlVMTCk7Cit9CisMCisvKiBFTEYgLm8vZXhlYyBmaWxlIHdyaXRpbmcgKi8KKworLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIGRhdGE7Cit7CisgIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOworICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7CisgIEVsZl9FeHRlcm5hbF9SZWxhICpvdXRib3VuZF9yZWxvY2FzOworICBFbGZfRXh0ZXJuYWxfUmVsICpvdXRib3VuZF9yZWxvY3M7CisgIHVuc2lnbmVkIGludCBpZHg7CisgIGludCB1c2VfcmVsYV9wID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT51c2VfcmVsYV9wOworICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7CisgIGludCBsYXN0X3N5bV9pZHggPSAwOworCisgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KKyAgaWYgKCpmYWlsZWRwKQorICAgIHJldHVybjsKKworICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCisgICAgcmV0dXJuOworCisgIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKKyAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKKyAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQorICAgICByZWxvY3MuICAqLworICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQorICAgIHJldHVybjsKKworICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOworCisgIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBzZWMtPnJlbG9jX2NvdW50OworICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKKyAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQorICAgIHsKKyAgICAgICpmYWlsZWRwID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogb3JlbG9jYXRpb24gaGFzIHRoZSBkYXRhLCByZWxvY19jb3VudCBoYXMgdGhlIGNvdW50Li4uICovCisgIGlmICh1c2VfcmVsYV9wKQorICAgIHsKKyAgICAgIG91dGJvdW5kX3JlbG9jYXMgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzOworCisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9SZWxhIGRzdF9yZWxhOworCSAgRWxmX0V4dGVybmFsX1JlbGEgKnNyY19yZWxhOworCSAgYXJlbGVudCAqcHRyOworCSAgYXN5bWJvbCAqc3ltOworCSAgaW50IG47CisKKwkgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKKwkgIHNyY19yZWxhID0gb3V0Ym91bmRfcmVsb2NhcyArIGlkeDsKKworCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAorCSAgICAgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCisJICAgICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCisJICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQorCSAgICBkc3RfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKKwkgIGVsc2UKKwkgICAgZHN0X3JlbGEucl9vZmZzZXQgPSBwdHItPmFkZHJlc3MgKyBzZWMtPnZtYTsKKworCSAgc3ltID0gKnB0ci0+c3ltX3B0cl9wdHI7CisJICBpZiAoc3ltID09IGxhc3Rfc3ltKQorCSAgICBuID0gbGFzdF9zeW1faWR4OworCSAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pICYmIHN5bS0+dmFsdWUgPT0gMCkKKwkgICAgbiA9IFNUTl9VTkRFRjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGxhc3Rfc3ltID0gc3ltOworCSAgICAgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKKwkgICAgICBpZiAobiA8IDApCisJCXsKKwkJICAqZmFpbGVkcCA9IHRydWU7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgbGFzdF9zeW1faWR4ID0gbjsKKwkgICAgfQorCisJICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZCAhPSBOVUxMCisJICAgICAgJiYgKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCisJICAgICAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKKwkgICAgeworCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgZHN0X3JlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7CisKKwkgIGRzdF9yZWxhLnJfYWRkZW5kID0gcHRyLT5hZGRlbmQ7CisJICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmZHN0X3JlbGEsIHNyY19yZWxhKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgLyogUkVMIHJlbG9jYXRpb25zICovCisgICAgeworICAgICAgb3V0Ym91bmRfcmVsb2NzID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgcmVsYV9oZHItPmNvbnRlbnRzOworCisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9SZWwgZHN0X3JlbDsKKwkgIEVsZl9FeHRlcm5hbF9SZWwgKnNyY19yZWw7CisJICBhcmVsZW50ICpwdHI7CisJICBpbnQgbjsKKwkgIGFzeW1ib2wgKnN5bTsKKworCSAgcHRyID0gc2VjLT5vcmVsb2NhdGlvbltpZHhdOworCSAgc3ltID0gKnB0ci0+c3ltX3B0cl9wdHI7CisJICBzcmNfcmVsID0gb3V0Ym91bmRfcmVsb2NzICsgaWR4OworCisJICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0CisJICAgICBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KKwkgICAgIFRoZSBhZGRyZXNzIG9mIGEgQkZEIHJlbG9jIGlzIGFsd2F5cyBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KKwkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDApCisJICAgIGRzdF9yZWwucl9vZmZzZXQgPSBwdHItPmFkZHJlc3M7CisJICBlbHNlCisJICAgIGRzdF9yZWwucl9vZmZzZXQgPSBwdHItPmFkZHJlc3MgKyBzZWMtPnZtYTsKKworCSAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKKwkgICAgbiA9IGxhc3Rfc3ltX2lkeDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGxhc3Rfc3ltID0gc3ltOworCSAgICAgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKKwkgICAgICBpZiAobiA8IDApCisJCXsKKwkJICAqZmFpbGVkcCA9IHRydWU7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgbGFzdF9zeW1faWR4ID0gbjsKKwkgICAgfQorCisJICBpZiAoKCpwdHItPnN5bV9wdHJfcHRyKS0+dGhlX2JmZC0+eHZlYyAhPSBhYmZkLT54dmVjCisJICAgICAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKKwkgICAgeworCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgZHN0X3JlbC5yX2luZm8gPSBFTEZfUl9JTkZPIChuLCBwdHItPmhvd3RvLT50eXBlKTsKKworCSAgZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmZHN0X3JlbCwgc3JjX3JlbCk7CisJfQorICAgIH0KK30KKworLyogV3JpdGUgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLworCitpbnQKK2VsZl93cml0ZV9vdXRfcGhkcnMgKGFiZmQsIHBoZHIsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9QaGRyICpwaGRyOworICAgICBpbnQgY291bnQ7Cit7CisgIHdoaWxlIChjb3VudC0tKQorICAgIHsKKyAgICAgIEVsZl9FeHRlcm5hbF9QaGRyIGV4dHBoZHI7CisgICAgICBlbGZfc3dhcF9waGRyX291dCAoYWJmZCwgcGhkciwgJmV4dHBoZHIpOworICAgICAgaWYgKGJmZF93cml0ZSAoJmV4dHBoZHIsIHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpLCAxLCBhYmZkKQorCSAgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcikpCisJcmV0dXJuIC0xOworICAgICAgcGhkcisrOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgc2VjdGlvbiBoZWFkZXJzIGFuZCB0aGUgRUxGIGZpbGUgaGVhZGVyLiAgKi8KKworYm9vbGVhbgorZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIEVsZl9FeHRlcm5hbF9FaGRyIHhfZWhkcjsJLyogRWxmIGZpbGUgaGVhZGVyLCBleHRlcm5hbCBmb3JtICovCisgIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KKyAgRWxmX0V4dGVybmFsX1NoZHIgKnhfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBleHRlcm5hbCBmb3JtICovCisgIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KKyAgdW5zaWduZWQgaW50IGNvdW50OworCisgIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKKyAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7CisKKyAgLyogc3dhcCB0aGUgaGVhZGVyIGJlZm9yZSBzcGl0dGluZyBpdCBvdXQuLi4gKi8KKworI2lmIERFQlVHICYgMQorICBlbGZfZGVidWdfZmlsZSAoaV9laGRycCk7CisjZW5kaWYKKyAgZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIGlfZWhkcnAsICZ4X2VoZHIpOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpCisJICAhPSBzaXplb2YgKHhfZWhkcikpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBhdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbmNvY3RlZCBhbGwgdGhlIEVMRiBzZWN0aW9ucy4uLiAqLworICB4X3NoZHJwID0gKEVsZl9FeHRlcm5hbF9TaGRyICopCisgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKCp4X3NoZHJwKSAqIChpX2VoZHJwLT5lX3NobnVtKSk7CisgIGlmICgheF9zaGRycCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaV9laGRycC0+ZV9zaG51bTsgY291bnQrKykKKyAgICB7CisjaWYgREVCVUcgJiAyCisgICAgICBlbGZfZGVidWdfc2VjdGlvbiAoY291bnQsIGlfc2hkcnBbY291bnRdKTsKKyNlbmRpZgorICAgICAgZWxmX3N3YXBfc2hkcl9vdXQgKGFiZmQsIGlfc2hkcnBbY291bnRdLCB4X3NoZHJwICsgY291bnQpOworICAgIH0KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSB4X3NoZHJwLCBzaXplb2YgKCp4X3NoZHJwKSwgaV9laGRycC0+ZV9zaG51bSwgYWJmZCkKKwkgICE9IHNpemVvZiAoKnhfc2hkcnApICogaV9laGRycC0+ZV9zaG51bSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIG5lZWQgdG8gZHVtcCB0aGUgc3RyaW5nIHRhYmxlIHRvby4uLiAqLworCisgIHJldHVybiB0cnVlOworfQorCitsb25nCitlbGZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkLCBzeW1wdHJzLCBkeW5hbWljKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipzeW1wdHJzOwkJLyogQnVmZmVyIGZvciBnZW5lcmF0ZWQgYmZkIHN5bWJvbHMgKi8KKyAgICAgYm9vbGVhbiBkeW5hbWljOworeworICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOworICBFbGZfSW50ZXJuYWxfU2hkciAqdmVyaGRyOworICB1bnNpZ25lZCBsb25nIHN5bWNvdW50OwkvKiBOdW1iZXIgb2YgZXh0ZXJuYWwgRUxGIHN5bWJvbHMgKi8KKyAgZWxmX3N5bWJvbF90eXBlICpzeW07CQkvKiBQb2ludGVyIHRvIGN1cnJlbnQgYmZkIHN5bWJvbCAqLworICBlbGZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7CS8qIEJ1ZmZlciBmb3IgZ2VuZXJhdGVkIGJmZCBzeW1ib2xzICovCisgIEVsZl9JbnRlcm5hbF9TeW0gaV9zeW07CisgIEVsZl9FeHRlcm5hbF9TeW0gKnhfc3ltcCA9IE5VTEw7CisgIEVsZl9FeHRlcm5hbF9WZXJzeW0gKnhfdmVyc3ltcCA9IE5VTEw7CisKKyAgLyogUmVhZCBlYWNoIHJhdyBFTEYgc3ltYm9sLCBjb252ZXJ0aW5nIGZyb20gZXh0ZXJuYWwgRUxGIGZvcm0gdG8KKyAgICAgaW50ZXJuYWwgRUxGIGZvcm0sIGFuZCB0aGVuIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBjcmVhdGUgYQorICAgICBjYW5vbmljYWwgYmZkIHN5bWJvbCB0YWJsZSBlbnRyeS4KKworICAgICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgdGhlIGluaXRpYWwgYmZkIGNhbm9uaWNhbCBzeW1ib2wgYnVmZmVyCisgICAgIGJhc2VkIG9uIGEgb25lLXRvLW9uZSBtYXBwaW5nIG9mIHRoZSBFTEYgc3ltYm9scyB0byBjYW5vbmljYWwKKyAgICAgc3ltYm9scy4gIFdlIGFjdHVhbGx5IHVzZSBhbGwgdGhlIEVMRiBzeW1ib2xzLCBzbyB0aGVyZSB3aWxsIGJlIG5vCisgICAgIHNwYWNlIGxlZnQgb3ZlciBhdCB0aGUgZW5kLiAgV2hlbiB3ZSBoYXZlIGFsbCB0aGUgc3ltYm9scywgd2UKKyAgICAgYnVpbGQgdGhlIGNhbGxlcidzIHBvaW50ZXIgdmVjdG9yLiAqLworCisgIGlmICghIGR5bmFtaWMpCisgICAgeworICAgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgICAgICB2ZXJoZHIgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOworICAgICAgaWYgKGVsZl9keW52ZXJzeW0gKGFiZmQpID09IDApCisJdmVyaGRyID0gTlVMTDsKKyAgICAgIGVsc2UKKwl2ZXJoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX2hkcjsKKyAgICAgIGlmICgoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX3NlY3Rpb24gIT0gMAorCSAgICYmIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZiA9PSBOVUxMKQorCSAgfHwgKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnJlZl9zZWN0aW9uICE9IDAKKwkgICAgICAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkpCisJeworCSAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQorCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKKworICBpZiAoc3ltY291bnQgPT0gMCkKKyAgICBzeW0gPSBzeW1iYXNlID0gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaTsKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpID09IC0xKQorCXJldHVybiAtMTsKKworICAgICAgc3ltYmFzZSA9ICgoZWxmX3N5bWJvbF90eXBlICopCisJCSBiZmRfemFsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoZWxmX3N5bWJvbF90eXBlKSkpOworICAgICAgaWYgKHN5bWJhc2UgPT0gKGVsZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQorCXJldHVybiAtMTsKKyAgICAgIHN5bSA9IHN5bWJhc2U7CisKKyAgICAgIC8qIFRlbXBvcmFyaWx5IGFsbG9jYXRlIHJvb20gZm9yIHRoZSByYXcgRUxGIHN5bWJvbHMuICAqLworICAgICAgeF9zeW1wID0gKChFbGZfRXh0ZXJuYWxfU3ltICopCisJCWJmZF9tYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOworICAgICAgaWYgKHhfc3ltcCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgeF9zeW1wLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCBzeW1jb3VudCwgYWJmZCkKKwkgICE9IHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgLyogUmVhZCB0aGUgcmF3IEVMRiB2ZXJzaW9uIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisKKyAgICAgIGlmICh2ZXJoZHIgIT0gTlVMTAorCSAgJiYgdmVyaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyc3ltKSAhPSBzeW1jb3VudCkKKwl7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiB2ZXJzaW9uIGNvdW50ICglbGQpIGRvZXMgbm90IG1hdGNoIHN5bWJvbCBjb3VudCAoJWxkKSIpLAorCSAgICAgYWJmZC0+ZmlsZW5hbWUsCisJICAgICAobG9uZykgKHZlcmhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSkpLAorCSAgICAgc3ltY291bnQpOworCisJICAvKiBTbHVycCBpbiB0aGUgc3ltYm9scyB3aXRob3V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLAorICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbW9yZSBoZWxwZnVsIHRoYW4ganVzdCBxdWl0dGluZy4gICovCisJICB2ZXJoZHIgPSBOVUxMOworCX0KKworICAgICAgaWYgKHZlcmhkciAhPSBOVUxMKQorCXsKKwkgIGlmIChiZmRfc2VlayAoYWJmZCwgdmVyaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgeF92ZXJzeW1wID0gKEVsZl9FeHRlcm5hbF9WZXJzeW0gKikgYmZkX21hbGxvYyAodmVyaGRyLT5zaF9zaXplKTsKKwkgIGlmICh4X3ZlcnN5bXAgPT0gTlVMTCAmJiB2ZXJoZHItPnNoX3NpemUgIT0gMCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGlmIChiZmRfcmVhZCAoKFBUUikgeF92ZXJzeW1wLCAxLCB2ZXJoZHItPnNoX3NpemUsIGFiZmQpCisJICAgICAgIT0gdmVyaGRyLT5zaF9zaXplKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKyAgICAgIC8qIFNraXAgZmlyc3Qgc3ltYm9sLCB3aGljaCBpcyBhIG51bGwgZHVtbXkuICAqLworICAgICAgZm9yIChpID0gMTsgaSA8IHN5bWNvdW50OyBpKyspCisJeworCSAgZWxmX3N3YXBfc3ltYm9sX2luIChhYmZkLCB4X3N5bXAgKyBpLCAmaV9zeW0pOworCSAgbWVtY3B5ICgmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLCAmaV9zeW0sIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpOworI2lmZGVmIEVMRl9LRUVQX0VYVFNZTQorCSAgbWVtY3B5ICgmc3ltLT5uYXRpdmVfZWxmX3N5bSwgeF9zeW1wICsgaSwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7CisjZW5kaWYKKwkgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworCisJICBzeW0tPnN5bWJvbC5uYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwKKwkJCQkJCQkgICAgICBoZHItPnNoX2xpbmssCisJCQkJCQkJICAgICAgaV9zeW0uc3RfbmFtZSk7CisKKwkgIHN5bS0+c3ltYm9sLnZhbHVlID0gaV9zeW0uc3RfdmFsdWU7CisKKwkgIGlmIChpX3N5bS5zdF9zaG5keCA+IDAgJiYgaV9zeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQorCSAgICB7CisJICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IHNlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsCisJCQkJCQkJICAgIGlfc3ltLnN0X3NobmR4KTsKKwkgICAgICBpZiAoc3ltLT5zeW1ib2wuc2VjdGlvbiA9PSBOVUxMKQorCQl7CisJCSAgLyogVGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uIGZvciB3aGljaCB3ZSBkaWQgbm90CisJCSAgICAgY3JlYXRlIGEgQkZEIHNlY3Rpb24uICBKdXN0IHVzZSBiZmRfYWJzX3NlY3Rpb24sCisJCSAgICAgYWx0aG91Z2ggaXQgaXMgd3JvbmcuICBGSVhNRS4gICovCisJCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKKwkgICAgeworCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgICB9CisJICBlbHNlIGlmIChpX3N5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQorCSAgICB7CisJICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICAgICAgLyogRWxmIHB1dHMgdGhlIGFsaWdubWVudCBpbnRvIHRoZSBgdmFsdWUnIGZpZWxkLCBhbmQKKwkJIHRoZSBzaXplIGludG8gdGhlIGBzaXplJyBmaWVsZC4gIEJGRCB3YW50cyB0byBzZWUgdGhlCisJCSBzaXplIGluIHRoZSB2YWx1ZSBmaWVsZCwgYW5kIGRvZXNuJ3QgY2FyZSAoYXQgdGhlCisJCSBtb21lbnQpIGFib3V0IHRoZSBhbGlnbm1lbnQuICAqLworCSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gaV9zeW0uc3Rfc2l6ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQorCSAgICB7CisJICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisKKwkgIC8qIElmIHRoaXMgaXMgYSByZWxvY2F0ZWFibGUgZmlsZSwgdGhlbiB0aGUgc3ltYm9sIHZhbHVlIGlzCisgICAgICAgICAgICAgYWxyZWFkeSBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KKwkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpICE9IDApCisJICAgIHN5bS0+c3ltYm9sLnZhbHVlIC09IHN5bS0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKKworCSAgc3dpdGNoIChFTEZfU1RfQklORCAoaV9zeW0uc3RfaW5mbykpCisJICAgIHsKKwkgICAgY2FzZSBTVEJfTE9DQUw6CisJICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0xPQ0FMOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNUQl9HTE9CQUw6CisJICAgICAgaWYgKGlfc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRgorCQkgICYmIGlfc3ltLnN0X3NobmR4ICE9IFNITl9DT01NT04pCisJCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9HTE9CQUw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1RCX1dFQUs6CisJICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1dFQUs7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgc3dpdGNoIChFTEZfU1RfVFlQRSAoaV9zeW0uc3RfaW5mbykpCisJICAgIHsKKwkgICAgY2FzZSBTVFRfU0VDVElPTjoKKwkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU0gfCBCU0ZfREVCVUdHSU5HOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNUVF9GSUxFOgorCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GSUxFIHwgQlNGX0RFQlVHR0lORzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTVFRfRlVOQzoKKwkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1RUX09CSkVDVDoKKwkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfT0JKRUNUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChkeW5hbWljKQorCSAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRFlOQU1JQzsKKworCSAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyc3ltOworCisJICAgICAgX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIHhfdmVyc3ltcCArIGksICZpdmVyc3ltKTsKKwkgICAgICBzeW0tPnZlcnNpb24gPSBpdmVyc3ltLnZzX3ZlcnM7CisJICAgIH0KKworCSAgLyogRG8gc29tZSBiYWNrZW5kLXNwZWNpZmljIHByb2Nlc3Npbmcgb24gdGhpcyBzeW1ib2wuICAqLworCSAgeworCSAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworCSAgICBpZiAoZWJkLT5lbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZykKKwkgICAgICAoKmViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpIChhYmZkLCAmc3ltLT5zeW1ib2wpOworCSAgfQorCisJICBzeW0rKzsKKwl9CisgICAgfQorCisgIC8qIERvIHNvbWUgYmFja2VuZC1zcGVjaWZpYyBwcm9jZXNzaW5nIG9uIHRoaXMgc3ltYm9sIHRhYmxlLiAgKi8KKyAgeworICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisgICAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpCisgICAgICAoKmViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpIChhYmZkLCBzeW1iYXNlLCBzeW1jb3VudCk7CisgIH0KKworICAvKiBXZSByZWx5IG9uIHRoZSB6YWxsb2MgdG8gY2xlYXIgb3V0IHRoZSBmaW5hbCBzeW1ib2wgZW50cnkuICAqLworCisgIHN5bWNvdW50ID0gc3ltIC0gc3ltYmFzZTsKKworICAvKiBGaWxsIGluIHRoZSB1c2VyJ3Mgc3ltYm9sIHBvaW50ZXIgdmVjdG9yIGlmIG5lZWRlZC4gICovCisgIGlmIChzeW1wdHJzKQorICAgIHsKKyAgICAgIGxvbmcgbCA9IHN5bWNvdW50OworCisgICAgICBzeW0gPSBzeW1iYXNlOworICAgICAgd2hpbGUgKGwtLSA+IDApCisJeworCSAgKnN5bXB0cnMrKyA9ICZzeW0tPnN5bWJvbDsKKwkgIHN5bSsrOworCX0KKyAgICAgICpzeW1wdHJzID0gMDsJCS8qIEZpbmFsIG51bGwgcG9pbnRlciAqLworICAgIH0KKworICBpZiAoeF92ZXJzeW1wICE9IE5VTEwpCisgICAgZnJlZSAoeF92ZXJzeW1wKTsKKyAgaWYgKHhfc3ltcCAhPSBOVUxMKQorICAgIGZyZWUgKHhfc3ltcCk7CisgIHJldHVybiBzeW1jb3VudDsKK2Vycm9yX3JldHVybjoKKyAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQorICAgIGZyZWUgKHhfdmVyc3ltcCk7CisgIGlmICh4X3N5bXAgIT0gTlVMTCkKKyAgICBmcmVlICh4X3N5bXApOworICByZXR1cm4gLTE7Cit9CisKKy8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCBkeW5hbWljKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICphc2VjdDsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJvb2xlYW4gZHluYW1pYzsKK3sKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqIGNvbnN0IGQgPSBlbGZfc2VjdGlvbl9kYXRhIChhc2VjdCk7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOworICBiZmRfc2l6ZV90eXBlIHJlbG9jX2NvdW50OworICBQVFIgYWxsb2NhdGVkID0gTlVMTDsKKyAgYmZkX2J5dGUgKm5hdGl2ZV9yZWxvY3M7CisgIGFyZWxlbnQgKnJlbGVudHM7CisgIGFyZWxlbnQgKnJlbGVudDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGludCBlbnRzaXplOworCisgIGlmIChhc2VjdC0+cmVsb2NhdGlvbiAhPSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghIGR5bmFtaWMpCisgICAgeworICAgICAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKKwkgIHx8IGFzZWN0LT5yZWxvY19jb3VudCA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgICByZWxfaGRyID0gJmQtPnJlbF9oZHI7CisgICAgICByZWxvY19jb3VudCA9IGFzZWN0LT5yZWxvY19jb3VudDsKKworICAgICAgQkZEX0FTU0VSVCAoYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHItPnNoX29mZnNldAorCQkgICYmIHJlbG9jX2NvdW50ID09IHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYXNlY3QtPl9yYXdfc2l6ZSA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgICByZWxfaGRyID0gJmQtPnRoaXNfaGRyOworICAgICAgcmVsb2NfY291bnQgPSByZWxfaGRyLT5zaF9zaXplIC8gcmVsX2hkci0+c2hfZW50c2l6ZTsKKyAgICB9CisKKyAgYWxsb2NhdGVkID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7CisgIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfcmVhZCAoYWxsb2NhdGVkLCAxLCByZWxfaGRyLT5zaF9zaXplLCBhYmZkKQorCSAgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7CisKKyAgcmVsZW50cyA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKTsKKyAgaWYgKHJlbGVudHMgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBlbnRzaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZTsKKyAgQkZEX0FTU0VSVCAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpCisJICAgICAgfHwgZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7CisKKyAgZm9yIChpID0gMCwgcmVsZW50ID0gcmVsZW50czsKKyAgICAgICBpIDwgcmVsb2NfY291bnQ7CisgICAgICAgaSsrLCByZWxlbnQrKywgbmF0aXZlX3JlbG9jcyArPSBlbnRzaXplKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKKworICAgICAgaWYgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpCisJZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX1JlbGEgKikgbmF0aXZlX3JlbG9jcywgJnJlbGEpOworICAgICAgZWxzZQorCXsKKwkgIGVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX1JlbCAqKSBuYXRpdmVfcmVsb2NzLCAmcmVsKTsKKwkgIHJlbGEucl9vZmZzZXQgPSByZWwucl9vZmZzZXQ7CisJICByZWxhLnJfaW5mbyA9IHJlbC5yX2luZm87CisJICByZWxhLnJfYWRkZW5kID0gMDsKKwl9CisKKyAgICAgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKKwkgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCisJIFRoZSBhZGRyZXNzIG9mIGEgbm9ybWFsIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZSwKKwkgYW5kIHRoZSBhZGRyZXNzIG9mIGEgZHluYW1pYyByZWxvYyBpcyBhYnNvbHV0ZS4uICAqLworICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCB8fCBkeW5hbWljKQorCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7CisgICAgICBlbHNlCisJcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7CisKKyAgICAgIGlmIChFTEZfUl9TWU0gKHJlbGEucl9pbmZvKSA9PSAwKQorCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKyAgICAgIGVsc2UKKwl7CisJICBhc3ltYm9sICoqcHMsICpzOworCisJICBwcyA9IHN5bWJvbHMgKyBFTEZfUl9TWU0gKHJlbGEucl9pbmZvKSAtIDE7CisJICBzID0gKnBzOworCisJICAvKiBDYW5vbmljYWxpemUgRUxGIHNlY3Rpb24gc3ltYm9scy4gIEZJWE1FOiBXaHk/ICAqLworCSAgaWYgKChzLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKKwkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHBzOworCSAgZWxzZQorCSAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gcy0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7CisJfQorCisgICAgICByZWxlbnQtPmFkZGVuZCA9IHJlbGEucl9hZGRlbmQ7CisKKyAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKQorCSgqZWJkLT5lbGZfaW5mb190b19ob3d0bykgKGFiZmQsIHJlbGVudCwgJnJlbGEpOworICAgICAgZWxzZQorCSgqZWJkLT5lbGZfaW5mb190b19ob3d0b19yZWwpIChhYmZkLCByZWxlbnQsICZyZWwpOworICAgIH0KKworICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbGVudHM7CisKKyAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQorICAgIGZyZWUgKGFsbG9jYXRlZCk7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKKyAgICBmcmVlIChhbGxvY2F0ZWQpOworICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQKK2VsZl9kZWJ1Z19zZWN0aW9uIChudW0sIGhkcikKKyAgICAgaW50IG51bTsKKyAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG5TZWN0aW9uIyVkICclcycgMHglLjhseFxuIiwgbnVtLAorCSAgIGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTCA/IGhkci0+YmZkX3NlY3Rpb24tPm5hbWUgOiAiIiwKKwkgICAobG9uZykgaGRyKTsKKyAgZnByaW50ZiAoc3RkZXJyLAorCSAgICJzaF9uYW1lICAgICAgPSAlbGRcdHNoX3R5cGUgICAgICA9ICVsZFx0c2hfZmxhZ3MgICAgID0gJWxkXG4iLAorCSAgIChsb25nKSBoZHItPnNoX25hbWUsCisJICAgKGxvbmcpIGhkci0+c2hfdHlwZSwKKwkgICAobG9uZykgaGRyLT5zaF9mbGFncyk7CisgIGZwcmludGYgKHN0ZGVyciwKKwkgICAic2hfYWRkciAgICAgID0gJWxkXHRzaF9vZmZzZXQgICAgPSAlbGRcdHNoX3NpemUgICAgICA9ICVsZFxuIiwKKwkgICAobG9uZykgaGRyLT5zaF9hZGRyLAorCSAgIChsb25nKSBoZHItPnNoX29mZnNldCwKKwkgICAobG9uZykgaGRyLT5zaF9zaXplKTsKKyAgZnByaW50ZiAoc3RkZXJyLAorCSAgICJzaF9saW5rICAgICAgPSAlbGRcdHNoX2luZm8gICAgICA9ICVsZFx0c2hfYWRkcmFsaWduID0gJWxkXG4iLAorCSAgIChsb25nKSBoZHItPnNoX2xpbmssCisJICAgKGxvbmcpIGhkci0+c2hfaW5mbywKKwkgICAobG9uZykgaGRyLT5zaF9hZGRyYWxpZ24pOworICBmcHJpbnRmIChzdGRlcnIsICJzaF9lbnRzaXplICAgPSAlbGRcbiIsCisJICAgKGxvbmcpIGhkci0+c2hfZW50c2l6ZSk7CisgIGZmbHVzaCAoc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQKK2VsZl9kZWJ1Z19maWxlIChlaGRycCkKKyAgICAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHJwOworeworICBmcHJpbnRmIChzdGRlcnIsICJlX2VudHJ5ICAgICAgPSAweCUuOGx4XG4iLCAobG9uZykgZWhkcnAtPmVfZW50cnkpOworICBmcHJpbnRmIChzdGRlcnIsICJlX3Bob2ZmICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waG9mZik7CisgIGZwcmludGYgKHN0ZGVyciwgImVfcGhudW0gICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3BobnVtKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZV9waGVudHNpemUgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhlbnRzaXplKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaG9mZiAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hvZmYpOworICBmcHJpbnRmIChzdGRlcnIsICJlX3NobnVtICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaG51bSk7CisgIGZwcmludGYgKHN0ZGVyciwgImVfc2hlbnRzaXplICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3NoZW50c2l6ZSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2VsZl9zeW1ib2xfZmxhZ3MgKGZsYWdzKQorICAgICBmbGFnd29yZCBmbGFnczsKK3sKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOworCisgIGJ1ZmZlclswXSA9ICdcMCc7CisgIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBsb2NhbCIpOworCisgIGlmIChmbGFncyAmIEJTRl9HTE9CQUwpCisgICAgc3RyY2F0IChidWZmZXIsICIgZ2xvYmFsIik7CisKKyAgaWYgKGZsYWdzICYgQlNGX0RFQlVHR0lORykKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBkZWJ1ZyIpOworCisgIGlmIChmbGFncyAmIEJTRl9GVU5DVElPTikKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBmdW5jdGlvbiIpOworCisgIGlmIChmbGFncyAmIEJTRl9LRUVQKQorICAgIHN0cmNhdCAoYnVmZmVyLCAiIGtlZXAiKTsKKworICBpZiAoZmxhZ3MgJiBCU0ZfS0VFUF9HKQorICAgIHN0cmNhdCAoYnVmZmVyLCAiIGtlZXBfZyIpOworCisgIGlmIChmbGFncyAmIEJTRl9XRUFLKQorICAgIHN0cmNhdCAoYnVmZmVyLCAiIHdlYWsiKTsKKworICBpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisgICAgc3RyY2F0IChidWZmZXIsICIgc2VjdGlvbi1zeW0iKTsKKworICBpZiAoZmxhZ3MgJiBCU0ZfT0xEX0NPTU1PTikKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBvbGQtY29tbW9uIik7CisKKyAgaWYgKGZsYWdzICYgQlNGX05PVF9BVF9FTkQpCisgICAgc3RyY2F0IChidWZmZXIsICIgbm90LWF0LWVuZCIpOworCisgIGlmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBjb25zdHJ1Y3RvciIpOworCisgIGlmIChmbGFncyAmIEJTRl9XQVJOSU5HKQorICAgIHN0cmNhdCAoYnVmZmVyLCAiIHdhcm5pbmciKTsKKworICBpZiAoZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpCisgICAgc3RyY2F0IChidWZmZXIsICIgaW5kaXJlY3QiKTsKKworICBpZiAoZmxhZ3MgJiBCU0ZfRklMRSkKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBmaWxlIik7CisKKyAgaWYgKGZsYWdzICYgRFlOQU1JQykKKyAgICBzdHJjYXQgKGJ1ZmZlciwgIiBkeW5hbWljIik7CisKKyAgaWYgKGZsYWdzICYgfihCU0ZfTE9DQUwKKwkJfCBCU0ZfR0xPQkFMCisJCXwgQlNGX0RFQlVHR0lORworCQl8IEJTRl9GVU5DVElPTgorCQl8IEJTRl9LRUVQCisJCXwgQlNGX0tFRVBfRworCQl8IEJTRl9XRUFLCisJCXwgQlNGX1NFQ1RJT05fU1lNCisJCXwgQlNGX09MRF9DT01NT04KKwkJfCBCU0ZfTk9UX0FUX0VORAorCQl8IEJTRl9DT05TVFJVQ1RPUgorCQl8IEJTRl9XQVJOSU5HCisJCXwgQlNGX0lORElSRUNUCisJCXwgQlNGX0ZJTEUKKwkJfCBCU0ZfRFlOQU1JQykpCisgICAgc3RyY2F0IChidWZmZXIsICIgdW5rbm93bi1iaXRzIik7CisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKyNlbmRpZgorDAorI2luY2x1ZGUgImVsZmNvcmUuaCIKKyNpbmNsdWRlICJlbGZsaW5rLmgiCisMCisvKiBTaXplLWRlcGVuZGVudCBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gTkFNRShfYmZkX2VsZixzaXplX2luZm8pID0geworICBzaXplb2YgKEVsZl9FeHRlcm5hbF9FaGRyKSwKKyAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkciksCisgIHNpemVvZiAoRWxmX0V4dGVybmFsX1NoZHIpLAorICBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpLAorICBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSwKKyAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKKyAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKSwKKyAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfTm90ZSksCisKKyAgQVJDSF9TSVpFLCBGSUxFX0FMSUdOLAorICBFTEZDTEFTUywgRVZfQ1VSUkVOVCwKKyAgZWxmX3dyaXRlX291dF9waGRycywKKyAgZWxmX3dyaXRlX3NoZHJzX2FuZF9laGRyLAorICB3cml0ZV9yZWxvY3MsCisgIGVsZl9zd2FwX3N5bWJvbF9vdXQsCisgIGVsZl9zbHVycF9yZWxvY190YWJsZSwKKyAgZWxmX3NsdXJwX3N5bWJvbF90YWJsZSwKKyAgZWxmX3N3YXBfZHluX2luCit9OwpkaWZmIC0tZ2l0IGEvYmZkL2VsZmNvcmUuaCBiL2JmZC9lbGZjb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NTRhYQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lbGZjb3JlLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8qIEVMRiBjb3JlIGZpbGUgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworY2hhcioKK2VsZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Cit9CisKK2ludAorZWxmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWw7Cit9CisKKworYm9vbGVhbgorZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQorICAgICBiZmQgKmNvcmVfYmZkOworICAgICBiZmQgKmV4ZWNfYmZkOworeworICBjaGFyKiBjb3JlbmFtZTsKKworICAvKiB4dmVjcyBtdXN0IG1hdGNoIGlmIGJvdGggYXJlIEVMRiBmaWxlcyBmb3IgdGhlIHNhbWUgdGFyZ2V0LiAqLworCisgIGlmIChjb3JlX2JmZC0+eHZlYyAhPSBleGVjX2JmZC0+eHZlYykKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBTZWUgaWYgdGhlIG5hbWUgaW4gdGhlIGNvcmVmaWxlIG1hdGNoZXMgdGhlIGV4ZWN1dGFibGUgbmFtZS4gKi8KKworICBjb3JlbmFtZSA9IGVsZl90ZGF0YSAoY29yZV9iZmQpLT5jb3JlX3Byb2dyYW07CisgIGlmIChjb3JlbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqIGV4ZWNuYW1lID0gc3RycmNociAoZXhlY19iZmQtPmZpbGVuYW1lLCAnLycpOworICAgICAgZXhlY25hbWUgPSBleGVjbmFtZSA/IGV4ZWNuYW1lICsgMSA6IGV4ZWNfYmZkLT5maWxlbmFtZTsKKworICAgICAgaWYgKHN0cmNtcChleGVjbmFtZSwgY29yZW5hbWUpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiAgQ29yZSBmaWxlcyBhcmUgc2ltcGx5IHN0YW5kYXJkIEVMRiBmb3JtYXR0ZWQgZmlsZXMgdGhhdCBwYXJ0aXRpb24KKyAgICB0aGUgZmlsZSB1c2luZyB0aGUgZXhlY3V0aW9uIHZpZXcgb2YgdGhlIGZpbGUgKHByb2dyYW0gaGVhZGVyIHRhYmxlKQorICAgIHJhdGhlciB0aGFuIHRoZSBsaW5raW5nIHZpZXcuICBJbiBmYWN0LCB0aGVyZSBpcyBubyBzZWN0aW9uIGhlYWRlcgorICAgIHRhYmxlIGluIGEgY29yZSBmaWxlLgorCisgICAgVGhlIHByb2Nlc3Mgc3RhdHVzIGluZm9ybWF0aW9uIChpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnZW5lcmFsCisgICAgcmVnaXN0ZXIgc2V0KSBhbmQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBhcmUgc3RvcmVkIGluIGEKKyAgICBzZWdtZW50IG9mIHR5cGUgUFRfTk9URS4gIFdlIGhhbmRjcmFmdCBhIGNvdXBsZSBvZiBleHRyYSBiZmQgc2VjdGlvbnMKKyAgICB0aGF0IGFsbG93IHN0YW5kYXJkIGJmZCBhY2Nlc3MgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzICgucmVnKSBhbmQgdGhlCisgICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICgucmVnMikuCisKKyAqLworCitjb25zdCBiZmRfdGFyZ2V0ICoKK2VsZl9jb3JlX2ZpbGVfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLworICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCisgIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHJwOwkvKiBFbGYgcHJvZ3JhbSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KKyAgdW5zaWduZWQgaW50IHBoaW5kZXg7CisgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICplYmQ7CisKKyAgLyogUmVhZCBpbiB0aGUgRUxGIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLworICBpZiAoYmZkX3JlYWQgKChQVFIpICYgeF9laGRyLCBzaXplb2YgKHhfZWhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoeF9laGRyKSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhlIG1hZ2ljIG51bWJlci4gKi8KKyAgaWYgKGVsZl9maWxlX3AgKCZ4X2VoZHIpID09IGZhbHNlKQorICAgIHsKKyAgICB3cm9uZzoKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIEZJWE1FOiBDaGVjayBFSV9WRVJTSU9OIGhlcmUgISAqLworCisgIC8qIENoZWNrIHRoZSBhZGRyZXNzIHNpemUgKCJjbGFzcyIpLiAqLworICBpZiAoeF9laGRyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTKQorICAgIGdvdG8gd3Jvbmc7CisKKyAgLyogQ2hlY2sgdGhlIGJ5dGVvcmRlci4gKi8KKyAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKKyAgICB7CisgICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KKyAgICAgIGlmICghIGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKKwlnb3RvIHdyb25nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KKyAgICAgIGlmICghIGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKKwlnb3RvIHdyb25nOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gd3Jvbmc7CisgICAgfQorCisgIC8qIEdpdmUgYWJmZCBhbiBlbGZfb2JqX3RkYXRhLiAqLworICBlbGZfdGRhdGEgKGFiZmQpID0KKyAgICAoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX29ial90ZGF0YSkpOworICBpZiAoZWxmX3RkYXRhIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEZJWE1FOiBmcm9tIGhlcmUgb24gZG93biwgImdvdG8gd3JvbmciIHdpbGwgbGVhayBtZW1vcnkuICAqLworCisgIC8qIFN3YXAgaW4gdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgbm93IHRoYXQgd2UgaGF2ZSB0aGUgYnl0ZSBvcmRlci4gKi8KKyAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOworICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKKworI2lmIERFQlVHICYgMQorICBlbGZfZGVidWdfZmlsZSAoaV9laGRycCk7CisjZW5kaWYKKworICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCisgICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCisKKyAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBpX2VoZHJwLT5lX21hY2hpbmUKKyAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDEgPT0gMAorCSAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKKyAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMAorCSAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MikpCisgICAgeworICAgICAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXRfcHRyOworCisgICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCisJZ290byB3cm9uZzsKKworICAgICAgLyogVGhpcyBpcyB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgTGV0IGl0IG1hdGNoIGFueSBFTEYgdGFyZ2V0CisJIGZvciB3aGljaCB3ZSBkbyBub3QgaGF2ZSBhIHNwZWNpZmljIGJhY2tlbmQuICAqLworCisgICAgICBmb3IgKHRhcmdldF9wdHIgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldF9wdHIgIT0gTlVMTDsgdGFyZ2V0X3B0cisrKQorCXsKKwkgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiYWNrOworCisJICBpZiAoKCp0YXJnZXRfcHRyKS0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorCSAgICBjb250aW51ZTsKKwkgIGJhY2sgPSAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKikgKCp0YXJnZXRfcHRyKS0+YmFja2VuZF9kYXRhOworCSAgaWYgKGJhY2stPmVsZl9tYWNoaW5lX2NvZGUgPT0gaV9laGRycC0+ZV9tYWNoaW5lKQorCSAgICB7CisJICAgICAgLyogdGFyZ2V0X3B0ciBpcyBhbiBFTEYgYmFja2VuZCB3aGljaCBtYXRjaGVzIHRoaXMKKwkJIG9iamVjdCBmaWxlLCBzbyByZWplY3QgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gICovCisJICAgICAgZ290byB3cm9uZzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSWYgdGhlcmUgaXMgbm8gcHJvZ3JhbSBoZWFkZXIsIG9yIHRoZSB0eXBlIGlzIG5vdCBhIGNvcmUgZmlsZSwgdGhlbgorICAgICB3ZSBhcmUgaG9zZWQuICovCisgIGlmIChpX2VoZHJwLT5lX3Bob2ZmID09IDAgfHwgaV9laGRycC0+ZV90eXBlICE9IEVUX0NPUkUpCisgICAgZ290byB3cm9uZzsKKworICAvKiBEb2VzIEJGRCdzIGlkZWEgb2YgdGhlIHBoZHIgc2l6ZSBtYXRjaCB0aGUgc2l6ZQorICAgICByZWNvcmRlZCBpbiB0aGUgZmlsZT8gKi8KKyAgaWYgKGlfZWhkcnAtPmVfcGhlbnRzaXplICE9IHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpKQorICAgIGdvdG8gd3Jvbmc7CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwcm9ncmFtIGhlYWRlcnMuICovCisgIGlfcGhkcnAgPSAoRWxmX0ludGVybmFsX1BoZHIgKikKKyAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKmlfcGhkcnApICogaV9laGRycC0+ZV9waG51bSk7CisgIGlmICghaV9waGRycCkKKyAgICByZXR1cm4gTlVMTDsKKworICBlbGZfdGRhdGEgKGFiZmQpLT5waGRyID0gaV9waGRycDsKKworICAvKiBSZWFkIGFuZCBjb252ZXJ0IHRvIGludGVybmFsIGZvcm0uICovCisgIGZvciAocGhpbmRleCA9IDA7IHBoaW5kZXggPCBpX2VoZHJwLT5lX3BobnVtOyArK3BoaW5kZXgpCisgICAgeworICAgICAgRWxmX0V4dGVybmFsX1BoZHIgeF9waGRyOworICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgKHhfcGhkciksIDEsIGFiZmQpCisJICAhPSBzaXplb2YgKHhfcGhkcikpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIGVsZl9zd2FwX3BoZHJfaW4gKGFiZmQsICZ4X3BoZHIsIGlfcGhkcnAgKyBwaGluZGV4KTsKKyAgICB9CisKKyAgLyogUHJvY2VzcyBlYWNoIHByb2dyYW0gaGVhZGVyLiAqLworICBmb3IgKHBoaW5kZXggPSAwOyBwaGluZGV4IDwgaV9laGRycC0+ZV9waG51bTsgKytwaGluZGV4KQorICAgIHsKKyAgICAgIGlmICghX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyIChhYmZkLCBpX3BoZHJwICsgcGhpbmRleCwgcGhpbmRleCkpCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFNldCB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUuICovCisgIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCisgICAgeworICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLworICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQorCXJldHVybiBOVUxMOworICAgIH0KKworICAvKiBTYXZlIHRoZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBFTEYgaGVhZGVyLiAqLworICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gaV9laGRycC0+ZV9lbnRyeTsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KZGlmZiAtLWdpdCBhL2JmZC9lbGZsaW5rLmMgYi9iZmQvZWxmbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGIwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmbGluay5jCkBAIC0wLDAgKzEsNDMzIEBACisvKiBFTEYgbGlua2luZyBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2RlZmluZSBBUkNIX1NJWkUgMAorI2luY2x1ZGUgImVsZi1iZmQuaCIKKworYm9vbGVhbgorX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBmbGFnd29yZCBmbGFnczsKKyAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworICBpbnQgcHRyYWxpZ247CisKKyAgLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAgKi8KKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpICE9IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKKyAgICB7CisgICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKKyAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorCisgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKKwkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisKKyAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQorICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQorICAgIHsKKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdC5wbHQiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQorCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlIC5nb3QKKyAgICAgKG9yIC5nb3QucGx0KSBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAorICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICBoID0gTlVMTDsKKyAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCisJIGJlZC0+Z290X3N5bWJvbF9vZmZzZXQsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAorCSBiZWQtPmNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKKyAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7CisKKyAgaWYgKGluZm8tPnNoYXJlZAorICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7CisKKyAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBpcyB0aGUgaGVhZGVyLiAgKi8KKyAgcy0+X3Jhd19zaXplICs9IGJlZC0+Z290X2hlYWRlcl9zaXplICsgYmVkLT5nb3Rfc3ltYm9sX29mZnNldDsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKworLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCisKK2Jvb2xlYW4KK19iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBmbGFnd29yZCBmbGFncywgcGx0ZmxhZ3M7CisgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworICBpbnQgcHRyYWxpZ247CisKKyAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKKyAgICB7CisgICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKKyAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxbYV0ucGx0LCAuZ290LCAuZ290LnBsdCwgLmR5bmJzcywgYW5kCisgICAgIC5yZWxbYV0uYnNzIHNlY3Rpb25zLiAgKi8KKworICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCisJICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOworCisgIHBsdGZsYWdzID0gZmxhZ3M7CisgIHBsdGZsYWdzIHw9IFNFQ19DT0RFOworICBpZiAoYmVkLT5wbHRfbm90X2xvYWRlZCkKKyAgICBwbHRmbGFncyAmPSB+IChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOworICBpZiAoYmVkLT5wbHRfcmVhZG9ubHkpCisgICAgcGx0ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOworCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOworICBpZiAocyA9PSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgcGx0ZmxhZ3MpCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIGJlZC0+cGx0X2FsaWdubWVudCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiZWQtPndhbnRfcGx0X3N5bSkKKyAgICB7CisgICAgICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKKwkgLnBsdCBzZWN0aW9uLiAgKi8KKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKKyAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAorCSAgICAgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKKwkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCisJICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAorCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisgICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKKworICAgICAgaWYgKGluZm8tPnNoYXJlZAorCSAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgYmVkLT51c2VfcmVsYV9wID8gIi5yZWxhLnBsdCIgOiAiLnJlbC5wbHQiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBwdHJhbGlnbikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFRoZSAuZHluYnNzIHNlY3Rpb24gaXMgYSBwbGFjZSB0byBwdXQgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZAorICAgICBieSBkeW5hbWljIG9iamVjdHMsIGFyZSByZWZlcmVuY2VkIGJ5IHJlZ3VsYXIgb2JqZWN0cywgYW5kIGFyZQorICAgICBub3QgZnVuY3Rpb25zLiAgV2UgbXVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgcHJvY2VzcworICAgICBpbWFnZSBhbmQgdXNlIGEgUl8qX0NPUFkgcmVsb2MgdG8gdGVsbCB0aGUgZHluYW1pYyBsaW5rZXIgdG8KKyAgICAgaW5pdGlhbGl6ZSB0aGVtIGF0IHJ1biB0aW1lLiAgVGhlIGxpbmtlciBzY3JpcHQgcHV0cyB0aGUgLmR5bmJzcworICAgICBzZWN0aW9uIGludG8gdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZmluYWwgaW1hZ2UuICAqLworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5ic3MiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19BTExPQykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFRoZSAucmVsW2FdLmJzcyBzZWN0aW9uIGhvbGRzIGNvcHkgcmVsb2NzLiAgVGhpcyBzZWN0aW9uIGlzIG5vdAorICAgICBub3JtYWxseSBuZWVkZWQuICBXZSBuZWVkIHRvIGNyZWF0ZSBpdCBoZXJlLCB0aG91Z2gsIHNvIHRoYXQgdGhlCisgICAgIGxpbmtlciB3aWxsIG1hcCBpdCB0byBhbiBvdXRwdXQgc2VjdGlvbi4gIFdlIGNhbid0IGp1c3QgY3JlYXRlIGl0CisgICAgIG9ubHkgaWYgd2UgbmVlZCBpdCwgYmVjYXVzZSB3ZSB3aWxsIG5vdCBrbm93IHdoZXRoZXIgd2UgbmVlZCBpdAorICAgICB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcywgYW5kIHRoZSBmaXJzdCB0aW1lIHRoZQorICAgICBtYWluIGxpbmtlciBjb2RlIGNhbGxzIEJGRCBhZnRlciBleGFtaW5pbmcgYWxsIHRoZSBpbnB1dCBmaWxlcworICAgICAoc2l6ZV9keW5hbWljX3NlY3Rpb25zKSB0aGUgaW5wdXQgc2VjdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KKyAgICAgbWFwcGVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbnMuICBJZiB0aGUgc2VjdGlvbiB0dXJucyBvdXQgbm90IHRvCisgICAgIGJlIG5lZWRlZCwgd2UgY2FuIGRpc2NhcmQgaXQgbGF0ZXIuICBXZSB3aWxsIG5ldmVyIG5lZWQgdGhpcworICAgICBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHNpbmNlIHRoZXkgZG8gbm90IHVzZQorICAgICBjb3B5IHJlbG9jcy4gICovCisgIGlmICghIGluZm8tPnNoYXJlZCkKKyAgICB7CisgICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgYmVkLT51c2VfcmVsYV9wID8gIi5yZWxhLmJzcyIgOiAiLnJlbC5ic3MiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisKKy8qIFJlY29yZCBhIG5ldyBkeW5hbWljIHN5bWJvbC4gIFdlIHJlY29yZCB0aGUgZHluYW1pYyBzeW1ib2xzIGFzIHdlCisgICByZWFkIHRoZSBpbnB1dCBmaWxlcywgc2luY2Ugd2UgbmVlZCB0byBoYXZlIGEgbGlzdCBvZiBhbGwgb2YgdGhlbQorICAgYmVmb3JlIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbmFsIHNpemVzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbnMuCisgICBOb3RlIHRoYXQgd2UgbWF5IGFjdHVhbGx5IGNhbGwgdGhpcyBmdW5jdGlvbiBldmVuIHRob3VnaCB3ZSBhcmUgbm90CisgICBnb2luZyB0byBvdXRwdXQgYW55IGR5bmFtaWMgc3ltYm9sczsgaW4gc29tZSBjYXNlcyB3ZSBrbm93IHRoYXQgYQorICAgc3ltYm9sIHNob3VsZCBiZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzCisgICBvbmUuICAqLworCitib29sZWFuCitfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworeworICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkeW5zdHI7CisgICAgICBjaGFyICpwLCAqYWxjOworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIGJvb2xlYW4gY29weTsKKyAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKKworICAgICAgaC0+ZHluaW5keCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7CisgICAgICArK2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7CisKKyAgICAgIGR5bnN0ciA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyOworICAgICAgaWYgKGR5bnN0ciA9PSBOVUxMKQorCXsKKwkgIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCisJICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9IGR5bnN0ciA9IF9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpOworCSAgaWYgKGR5bnN0ciA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICAvKiBXZSBkb24ndCBwdXQgYW55IHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIGR5bmFtaWMgc3RyaW5nCisgICAgICAgICB0YWJsZS4gICovCisgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKyAgICAgIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisJeworCSAgYWxjID0gTlVMTDsKKwkgIGNvcHkgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYWxjID0gYmZkX21hbGxvYyAocCAtIG5hbWUgKyAxKTsKKwkgIGlmIChhbGMgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgc3RybmNweSAoYWxjLCBuYW1lLCBwIC0gbmFtZSk7CisJICBhbGNbcCAtIG5hbWVdID0gJ1wwJzsKKwkgIG5hbWUgPSBhbGM7CisJICBjb3B5ID0gdHJ1ZTsKKwl9CisKKyAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGR5bnN0ciwgbmFtZSwgdHJ1ZSwgY29weSk7CisKKyAgICAgIGlmIChhbGMgIT0gTlVMTCkKKwlmcmVlIChhbGMpOworCisgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJcmV0dXJuIGZhbHNlOworICAgICAgaC0+ZHluc3RyX2luZGV4ID0gaW5keDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uLCBvciByZXR1cm4gYSBwb2ludGVyIHRvIGEgbGlua2VyIHNlY3Rpb24gYWxyZWFkeSBjcmVhdGVkICAqLworCitlbGZfbGlua2VyX3NlY3Rpb25fdCAqCitfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoLCBkZWZhdWx0cykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSB3aGljaDsKKyAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmRlZmF1bHRzOworeworICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7CisKKyAgLyogUmVjb3JkIHRoZSBmaXJzdCBiZmQgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSBzcGVjaWFsIHNlY3Rpb24gKi8KKyAgaWYgKCFkeW5vYmopCisgICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOworCisgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLworICBsc2VjdCA9IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCk7CisgIGlmICghbHNlY3QpCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisKKyAgICAgIGxzZWN0ID0gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopCisJYmZkX2FsbG9jIChkeW5vYmosIHNpemVvZiAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpKTsKKworICAgICAgKmxzZWN0ID0gKmRlZmF1bHRzOworICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIHdoaWNoKSA9IGxzZWN0OworICAgICAgbHNlY3QtPndoaWNoID0gd2hpY2g7CisgICAgICBsc2VjdC0+aG9sZV93cml0dGVuX3AgPSBmYWxzZTsKKworICAgICAgLyogU2VlIGlmIHRoZSBzZWN0aW9ucyBhbHJlYWR5IGV4aXN0ICovCisgICAgICBsc2VjdC0+c2VjdGlvbiA9IHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBsc2VjdC0+bmFtZSk7CisgICAgICBpZiAoIXMgfHwgKHMtPmZsYWdzICYgZGVmYXVsdHMtPmZsYWdzKSAhPSBkZWZhdWx0cy0+ZmxhZ3MpCisJeworCSAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOworCisJICBpZiAocyA9PSBOVUxMKQorCSAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKKworCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsIGRlZmF1bHRzLT5mbGFncyk7CisJICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOworCX0KKyAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcykgPCBsc2VjdC0+YWxpZ25tZW50KQorCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgbHNlY3QtPmFsaWdubWVudCk7CisKKyAgICAgIHMtPl9yYXdfc2l6ZSA9IGFsaWduX3Bvd2VyIChzLT5fcmF3X3NpemUsIGxzZWN0LT5hbGlnbm1lbnQpOworCisgICAgICAvKiBJcyB0aGVyZSBhIGhvbGUgd2UgaGF2ZSB0byBwcm92aWRlPyAgSWYgc28gY2hlY2sgd2hldGhlciB0aGUgc2VnbWVudCBpcworCSB0b28gYmlnIGFscmVhZHkgKi8KKyAgICAgIGlmIChsc2VjdC0+aG9sZV9zaXplKQorCXsKKwkgIGxzZWN0LT5ob2xlX29mZnNldCA9IHMtPl9yYXdfc2l6ZTsKKwkgIHMtPl9yYXdfc2l6ZSArPSBsc2VjdC0+aG9sZV9zaXplOworCSAgaWYgKGxzZWN0LT5ob2xlX29mZnNldCA+IGxzZWN0LT5tYXhfaG9sZV9vZmZzZXQpCisJICAgIHsKKwkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBTZWN0aW9uICVzIGlzIGFscmVhZHkgdG8gbGFyZ2UgdG8gcHV0IGhvbGUgb2YgJWxkIGJ5dGVzIGluIiksCisJCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkJCQkgICAgIGxzZWN0LT5uYW1lLAorCQkJCSAgICAgKGxvbmcpbHNlY3QtPmhvbGVfc2l6ZSk7CisKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgICAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKKwkgICAgfQorCX0KKworI2lmZGVmIERFQlVHCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGluZyBzZWN0aW9uICVzLCBjdXJyZW50IHNpemUgPSAlbGRcbiIsCisJICAgICAgIGxzZWN0LT5uYW1lLCAobG9uZylzLT5fcmF3X3NpemUpOworI2VuZGlmCisKKyAgICAgIGlmIChsc2VjdC0+c3ltX25hbWUpCisJeworCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmIChzdGRlcnIsICJBZGRpbmcgJXMgdG8gc2VjdGlvbiAlc1xuIiwKKwkJICAgbHNlY3QtPnN5bV9uYW1lLAorCQkgICBsc2VjdC0+bmFtZSk7CisjZW5kaWYKKwkgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKKwkgICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIGxzZWN0LT5zeW1fbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisKKwkgIGlmICgoaCA9PSBOVUxMIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKwkgICAgICAmJiAhKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLAorCQkJCQkJICAgICBhYmZkLAorCQkJCQkJICAgICBsc2VjdC0+c3ltX25hbWUsCisJCQkJCQkgICAgIEJTRl9HTE9CQUwsCisJCQkJCQkgICAgIHMsCisJCQkJCQkgICAgICgobHNlY3QtPmhvbGVfc2l6ZSkKKwkJCQkJCSAgICAgID8gcy0+X3Jhd19zaXplIC0gbHNlY3QtPmhvbGVfc2l6ZSArIGxzZWN0LT5zeW1fb2Zmc2V0CisJCQkJCQkgICAgICA6IGxzZWN0LT5zeW1fb2Zmc2V0KSwKKwkJCQkJCSAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkJCSAgICAgZmFsc2UsCisJCQkJCQkgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKKwkJCQkJCSAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQorCSAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKKworCSAgaWYgKChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEpCisJICAgICAgJiYgKGRlZmF1bHRzLT53aGljaCAhPSBMSU5LRVJfU0VDVElPTl9TREFUQTIpKQorCSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUM7CisKKwkgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworCSAgbHNlY3QtPnN5bV9oYXNoID0gaDsKKworCSAgaWYgKGluZm8tPnNoYXJlZAorCSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCSAgICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKKwl9CisgICAgfQorCisjaWYgMAorICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2UuICBUaGUgc2VjdGlvbnMgd2hpY2ggbWF5IGV4aXN0IGluIHRoZQorICAgICBvYmplY3QgZmlsZSBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgc2VjdGlvbnMgd2Ugd2FudCB0bworICAgICBjcmVhdGUuICAqLworCisgIC8qIEZpbmQgdGhlIHJlbGF0ZWQgc2VjdGlvbnMgaWYgdGhleSBoYXZlIGJlZW4gY3JlYXRlZCAqLworICBpZiAobHNlY3QtPmJzc19uYW1lICYmICFsc2VjdC0+YnNzX3NlY3Rpb24pCisgICAgbHNlY3QtPmJzc19zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPmJzc19uYW1lKTsKKworICBpZiAobHNlY3QtPnJlbF9uYW1lICYmICFsc2VjdC0+cmVsX3NlY3Rpb24pCisgICAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKKyNlbmRpZgorCisgIHJldHVybiBsc2VjdDsKK30KKworDAorLyogRmluZCBhIGxpbmtlciBnZW5lcmF0ZWQgcG9pbnRlciB3aXRoIGEgZ2l2ZW4gYWRkZW5kIGFuZCB0eXBlLiAgKi8KKworZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKgorX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChsaW5rZXJfcG9pbnRlcnMsIGFkZGVuZCwgd2hpY2gpCisgICAgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfcG9pbnRlcnM7CisgICAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsKKyAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX2VudW1fdCB3aGljaDsKK3sKKyAgZm9yICggOyBsaW5rZXJfcG9pbnRlcnMgIT0gTlVMTDsgbGlua2VyX3BvaW50ZXJzID0gbGlua2VyX3BvaW50ZXJzLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICh3aGljaCA9PSBsaW5rZXJfcG9pbnRlcnMtPndoaWNoICYmIGFkZGVuZCA9PSBsaW5rZXJfcG9pbnRlcnMtPmFkZGVuZCkKKwlyZXR1cm4gbGlua2VyX3BvaW50ZXJzOworICAgIH0KKworICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopMDsKK30KKworDAorLyogTWFrZSB0aGUgLnJlbGEgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnZW5lcmF0ZWQgbGlua2VyIHNlY3Rpb24uICAqLworCitib29sZWFuCitfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEgKGR5bm9iaiwgbHNlY3QsIGFsaWdubWVudCkKKyAgICAgYmZkICpkeW5vYmo7CisgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKKyAgICAgaW50IGFsaWdubWVudDsKK3sKKyAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBsc2VjdC0+cmVsX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBsc2VjdC0+cmVsX25hbWUpOworICBpZiAobHNlY3QtPnJlbF9zZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBsc2VjdC0+cmVsX25hbWUpOworICAgICAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLAorCQkJCSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiwKKwkJCQkgICAgICAoU0VDX0FMTE9DCisJCQkJICAgICAgIHwgU0VDX0xPQUQKKwkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQorCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAorCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgbHNlY3QtPnJlbF9zZWN0aW9uLCBhbGlnbm1lbnQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9iZmQvZWxmbGluay5oIGIvYmZkL2VsZmxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJmYWIwCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2VsZmxpbmsuaApAQCAtMCwwICsxLDYxNTAgQEAKKy8qIEVMRiBsaW5rZXIgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEVMRiBsaW5rZXIgY29kZS4gICovCisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byByb3V0aW5lcyBjYWxsZWQgdmlhCisgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIHdoaWNoIG11c3QgcmV0dXJuIGZhaWx1cmUuICAqLworCitzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkCit7CisgIGJvb2xlYW4gZmFpbGVkOworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK307CisKK3N0YXRpYyBib29sZWFuIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmX21lcmdlX3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBFbGZfSW50ZXJuYWxfU3ltICosCisJICAgYXNlY3Rpb24gKiosIGJmZF92bWEgKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiosCisJICAgYm9vbGVhbiAqLCBib29sZWFuICosIGJvb2xlYW4gKikpOworc3RhdGljIGJvb2xlYW4gZWxmX2V4cG9ydF9zeW1ib2wKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfZml4X3N5bWJvbF9mbGFncworICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopKTsKK3N0YXRpYyBib29sZWFuIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCisgIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcworICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbgorICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBlbGZfY29sbGVjdF9oYXNoX2NvZGVzCisgIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworCisvKiBHaXZlbiBhbiBFTEYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKKyAgIGFwcHJvcHJpYXRlLiAgKi8KKworYm9vbGVhbgorZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfb2JqZWN0OgorICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7CisgICAgY2FzZSBiZmRfYXJjaGl2ZToKKyAgICAgIHJldHVybiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKKyAgICBkZWZhdWx0OgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorDAorCisvKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVMRiBhcmNoaXZlIGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UKKyAgIGRvbid0IHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2Ugb2YgYQorICAgcHJvYmxlbSB3aGljaCBhcmlzZXMgb24gVW5peFdhcmUuICBUaGUgVW5peFdhcmUgbGliYy5zbyBpcyBhbgorICAgYXJjaGl2ZSB3aGljaCBpbmNsdWRlcyBhbiBlbnRyeSBsaWJjLnNvLjEgd2hpY2ggZGVmaW5lcyBhIGJ1bmNoIG9mCisgICBzeW1ib2xzLiAgVGhlIGxpYmMuc28gYXJjaGl2ZSBhbHNvIGluY2x1ZGVzIGEgbnVtYmVyIG9mIG90aGVyCisgICBvYmplY3QgZmlsZXMsIHdoaWNoIGFsc28gZGVmaW5lIHN5bWJvbHMsIHNvbWUgb2Ygd2hpY2ggYXJlIHRoZSBzYW1lCisgICBhcyB0aG9zZSBkZWZpbmVkIGluIGxpYmMuc28uMS4gIENvcnJlY3QgbGlua2luZyByZXF1aXJlcyB0aGF0IHdlCisgICBjb25zaWRlciBlYWNoIG9iamVjdCBmaWxlIGluIHR1cm4sIGFuZCBpbmNsdWRlIGl0IGlmIGl0IGRlZmluZXMgYW55CisgICBzeW1ib2xzIHdlIG5lZWQuICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGRvZXMgbm90IGRvCisgICB0aGlzOyBpdCBsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgaW5jbHVkZXMKKyAgIGFueSBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzIHRoZW0uICBXaGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgb24KKyAgIFVuaXhXYXJlLCBpdCB3aW5kcyB1cCBwdWxsaW5nIGluIGxpYmMuc28uMSBlYXJseSBhbmQgZGVmaW5pbmcgYQorICAgYnVuY2ggb2Ygc3ltYm9scy4gIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBvdGhlciBvYmplY3RzIGluIHRoZQorICAgYXJjaGl2ZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aGljaCBpcyBpbmNvcnJlY3Qgc2luY2UgdGhleQorICAgcHJlY2VkZSBsaWJjLnNvLjEgaW4gdGhlIGFyY2hpdmUuCisKKyAgIEZvcnR1bmF0ZWx5LCBFTEYgYXJjaGl2ZSBoYW5kbGluZyBpcyBzaW1wbGVyIHRoYW4gdGhhdCBkb25lIGJ5CisgICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLCB3aGljaCBoYXMgdG8gYWxsb3cgZm9yIGEub3V0CisgICBvZGRpdGllcy4gIEluIEVMRiwgaWYgd2UgZmluZCBhIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBtYXAsIGFuZCB0aGUKKyAgIHN5bWJvbCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLCB3ZSBrbm93IHRoYXQgd2UgbXVzdCBwdWxsIGluIHRoYXQKKyAgIG9iamVjdCBmaWxlLgorCisgICBVbmZvcnR1bmF0ZWx5LCB3ZSBkbyBoYXZlIHRvIG1ha2UgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIHN5bWJvbAorICAgdGFibGUgdW50aWwgbm90aGluZyBmdXJ0aGVyIGlzIHJlc29sdmVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN5bWluZGV4IGM7CisgIGJvb2xlYW4gKmRlZmluZWQgPSBOVUxMOworICBib29sZWFuICppbmNsdWRlZCA9IE5VTEw7CisgIGNhcnN5bSAqc3ltZGVmczsKKyAgYm9vbGVhbiBsb29wOworCisgIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKKyAgICB7CisgICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KKyAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCisJcmV0dXJuIHRydWU7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBzeW1ib2xzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBkZWZpbmVkLCBhbmQgYWxsCisgICAgIGZpbGVzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBpbmNsdWRlZC4gIFRoaXMgaXMgdG8gc3BlZWQgdXAgdGhlCisgICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBwYXNzZXMuICAqLworICBjID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudDsKKyAgaWYgKGMgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmaW5lZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKKyAgaW5jbHVkZWQgPSAoYm9vbGVhbiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChib29sZWFuKSk7CisgIGlmIChkZWZpbmVkID09IChib29sZWFuICopIE5VTEwgfHwgaW5jbHVkZWQgPT0gKGJvb2xlYW4gKikgTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgbWVtc2V0IChkZWZpbmVkLCAwLCBjICogc2l6ZW9mIChib29sZWFuKSk7CisgIG1lbXNldCAoaW5jbHVkZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKKworICBzeW1kZWZzID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7CisKKyAgZG8KKyAgICB7CisgICAgICBmaWxlX3B0ciBsYXN0OworICAgICAgc3ltaW5kZXggaTsKKyAgICAgIGNhcnN5bSAqc3ltZGVmOworICAgICAgY2Fyc3ltICpzeW1kZWZlbmQ7CisKKyAgICAgIGxvb3AgPSBmYWxzZTsKKyAgICAgIGxhc3QgPSAtMTsKKworICAgICAgc3ltZGVmID0gc3ltZGVmczsKKyAgICAgIHN5bWRlZmVuZCA9IHN5bWRlZiArIGM7CisgICAgICBmb3IgKGkgPSAwOyBzeW1kZWYgPCBzeW1kZWZlbmQ7IHN5bWRlZisrLCBpKyspCisJeworCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisJICBiZmQgKmVsZW1lbnQ7CisJICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzX3RhaWw7CisJICBzeW1pbmRleCBtYXJrOworCisJICBpZiAoZGVmaW5lZFtpXSB8fCBpbmNsdWRlZFtpXSkKKwkgICAgY29udGludWU7CisJICBpZiAoc3ltZGVmLT5maWxlX29mZnNldCA9PSBsYXN0KQorCSAgICB7CisJICAgICAgaW5jbHVkZWRbaV0gPSB0cnVlOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBzeW1kZWYtPm5hbWUsCisJCQkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCisJICBpZiAoaCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqcCwgKmNvcHk7CisKKwkgICAgICAvKiBJZiB0aGlzIGlzIGEgZGVmYXVsdCB2ZXJzaW9uICh0aGUgbmFtZSBjb250YWlucyBAQCksCisJCSBsb29rIHVwIHRoZSBzeW1ib2wgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbi4gIFRoZQorCQkgZWZmZWN0IGlzIHRoYXQgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIHdpdGhvdXQgdGhlCisJCSB2ZXJzaW9uIHdpbGwgYmUgbWF0Y2hlZCBieSB0aGUgZGVmYXVsdCBzeW1ib2wgaW4gdGhlCisJCSBhcmNoaXZlLiAgKi8KKworCSAgICAgIHAgPSBzdHJjaHIgKHN5bWRlZi0+bmFtZSwgRUxGX1ZFUl9DSFIpOworCSAgICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSBFTEZfVkVSX0NIUikKKwkJY29udGludWU7CisKKwkgICAgICBjb3B5ID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltZGVmLT5uYW1lICsgMSk7CisJICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgICAgbWVtY3B5IChjb3B5LCBzeW1kZWYtPm5hbWUsIHAgLSBzeW1kZWYtPm5hbWUpOworCSAgICAgIGNvcHlbcCAtIHN5bWRlZi0+bmFtZV0gPSAnXDAnOworCisJICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGNvcHksCisJCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOworCisJICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcHkpOworCSAgICB9CisKKwkgIGlmIChoID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCSAgICB7CisJICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkJZGVmaW5lZFtpXSA9IHRydWU7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogV2UgbmVlZCB0byBpbmNsdWRlIHRoaXMgYXJjaGl2ZSBtZW1iZXIuICAqLworCisJICBlbGVtZW50ID0gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIHN5bWRlZi0+ZmlsZV9vZmZzZXQpOworCSAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICAvKiBEb3VibGVjaGVjayB0aGF0IHdlIGhhdmUgbm90IGluY2x1ZGVkIHRoaXMgb2JqZWN0CisJICAgICBhbHJlYWR5LS1pdCBzaG91bGQgYmUgaW1wb3NzaWJsZSwgYnV0IHRoZXJlIG1heSBiZQorCSAgICAgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGFyY2hpdmUuICAqLworCSAgaWYgKGVsZW1lbnQtPmFyY2hpdmVfcGFzcyAhPSAwKQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwkgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IDE7CisKKwkgIHVuZGVmc190YWlsID0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWw7CisKKwkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgZWxlbWVudCwKKwkJCQkJCQkgc3ltZGVmLT5uYW1lKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBpZiAoISBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGVsZW1lbnQsIGluZm8pKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgLyogSWYgdGhlcmUgYXJlIGFueSBuZXcgdW5kZWZpbmVkIHN5bWJvbHMsIHdlIG5lZWQgdG8gbWFrZQorCSAgICAgYW5vdGhlciBwYXNzIHRocm91Z2ggdGhlIGFyY2hpdmUgaW4gb3JkZXIgdG8gc2VlIHdoZXRoZXIKKwkgICAgIHRoZXkgY2FuIGJlIGRlZmluZWQuICBGSVhNRTogVGhpcyBpc24ndCBwZXJmZWN0LCBiZWNhdXNlCisJICAgICBjb21tb24gc3ltYm9scyB3aW5kIHVwIG9uIHVuZGVmc190YWlsIGFuZCBiZWNhdXNlIGFuCisJICAgICB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgbGF0ZXIgb24gaW4gdGhpcyBwYXNzCisJICAgICBkb2VzIG5vdCByZXF1aXJlIGFub3RoZXIgcGFzcy4gIFRoaXMgaXNuJ3QgYSBidWcsIGJ1dCBpdAorCSAgICAgZG9lcyBtYWtlIHRoZSBjb2RlIGxlc3MgZWZmaWNpZW50IHRoYW4gaXQgY291bGQgYmUuICAqLworCSAgaWYgKHVuZGVmc190YWlsICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQorCSAgICBsb29wID0gdHJ1ZTsKKworCSAgLyogTG9vayBiYWNrd2FyZCB0byBtYXJrIGFsbCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZQorCSAgICAgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHNlZW4gaW4gdGhpcyBwYXNzLiAgKi8KKwkgIG1hcmsgPSBpOworCSAgZG8KKwkgICAgeworCSAgICAgIGluY2x1ZGVkW21hcmtdID0gdHJ1ZTsKKwkgICAgICBpZiAobWFyayA9PSAwKQorCQlicmVhazsKKwkgICAgICAtLW1hcms7CisJICAgIH0KKwkgIHdoaWxlIChzeW1kZWZzW21hcmtdLmZpbGVfb2Zmc2V0ID09IHN5bWRlZi0+ZmlsZV9vZmZzZXQpOworCisJICAvKiBXZSBtYXJrIHN1YnNlcXVlbnQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgYXMgd2UgZ28KKwkgICAgIG9uIHRocm91Z2ggdGhlIGxvb3AuICAqLworCSAgbGFzdCA9IHN5bWRlZi0+ZmlsZV9vZmZzZXQ7CisJfQorICAgIH0KKyAgd2hpbGUgKGxvb3ApOworCisgIGZyZWUgKGRlZmluZWQpOworICBmcmVlIChpbmNsdWRlZCk7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChkZWZpbmVkICE9IChib29sZWFuICopIE5VTEwpCisgICAgZnJlZSAoZGVmaW5lZCk7CisgIGlmIChpbmNsdWRlZCAhPSAoYm9vbGVhbiAqKSBOVUxMKQorICAgIGZyZWUgKGluY2x1ZGVkKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gZGVmaW5lIGEgbmV3IHN5bWJvbC4gIEl0CisgICBoYW5kbGVzIHRoZSB2YXJpb3VzIGNhc2VzIHdoaWNoIGFyaXNlIHdoZW4gd2UgZmluZCBhIGRlZmluaXRpb24gaW4KKyAgIGEgZHluYW1pYyBvYmplY3QsIG9yIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGRlZmluaXRpb24gaW4gYQorICAgZHluYW1pYyBvYmplY3QuICBUaGUgbmV3IHN5bWJvbCBpcyBkZXNjcmliZWQgYnkgTkFNRSwgU1lNLCBQU0VDLAorICAgYW5kIFBWQUxVRS4gIFdlIHNldCBTWU1fSEFTSCB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gIFdlIHNldAorICAgT1ZFUlJJREUgaWYgdGhlIG9sZCBzeW1ib2wgaXMgb3ZlcnJpZGluZyBhIG5ldyBkZWZpbml0aW9uLiAgV2Ugc2V0CisgICBUWVBFX0NIQU5HRV9PSyBpZiBpdCBpcyBPSyBmb3IgdGhlIHR5cGUgdG8gY2hhbmdlLiAgV2Ugc2V0CisgICBTSVpFX0NIQU5HRV9PSyBpZiBpdCBpcyBPSyBmb3IgdGhlIHNpemUgdG8gY2hhbmdlLiAgQnkgT0sgdG8KKyAgIGNoYW5nZSwgd2UgbWVhbiB0aGF0IHdlIHNob3VsZG4ndCB3YXJuIGlmIHRoZSB0eXBlIG9yIHNpemUgZG9lcworICAgY2hhbmdlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgcHNlYywgcHZhbHVlLCBzeW1faGFzaCwKKwkJICBvdmVycmlkZSwgdHlwZV9jaGFuZ2Vfb2ssIHNpemVfY2hhbmdlX29rKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07CisgICAgIGFzZWN0aW9uICoqcHNlYzsKKyAgICAgYmZkX3ZtYSAqcHZhbHVlOworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOworICAgICBib29sZWFuICpvdmVycmlkZTsKKyAgICAgYm9vbGVhbiAqdHlwZV9jaGFuZ2Vfb2s7CisgICAgIGJvb2xlYW4gKnNpemVfY2hhbmdlX29rOworeworICBhc2VjdGlvbiAqc2VjOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgaW50IGJpbmQ7CisgIGJmZCAqb2xkYmZkOworICBib29sZWFuIG5ld2R5biwgb2xkZHluLCBvbGRkZWYsIG5ld2RlZiwgbmV3ZHluY29tbW9uLCBvbGRkeW5jb21tb247CisKKyAgKm92ZXJyaWRlID0gZmFsc2U7CisKKyAgc2VjID0gKnBzZWM7CisgIGJpbmQgPSBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKTsKKworICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCisgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgIGVsc2UKKyAgICBoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLCB0cnVlLCBmYWxzZSwgZmFsc2UpKTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgICpzeW1faGFzaCA9IGg7CisKKyAgLyogVGhpcyBjb2RlIGlzIGZvciBjb3Bpbmcgd2l0aCBkeW5hbWljIG9iamVjdHMsIGFuZCBpcyBvbmx5IHVzZWZ1bAorICAgICBpZiB3ZSBhcmUgZG9pbmcgYW4gRUxGIGxpbmsuICAqLworICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEZvciBtZXJnaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgcmVhbCBzeW1ib2xzLiAgKi8KKworICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKyAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisKKyAgLyogSWYgd2UganVzdCBjcmVhdGVkIHRoZSBzeW1ib2wsIG1hcmsgaXQgYXMgYmVpbmcgYW4gRUxGIHN5bWJvbC4KKyAgICAgT3RoZXIgdGhhbiB0aGF0LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLS10aGVyZSBpcyBubyBtZXJnZSBpc3N1ZQorICAgICB3aXRoIGEgbmV3bHkgZGVmaW5lZCBzeW1ib2wtLXNvIHdlIGp1c3QgcmV0dXJuLiAgKi8KKworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQorICAgIHsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogT0xEQkZEIGlzIGEgQkZEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhpc3Rpbmcgc3ltYm9sLiAgKi8KKworICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIG9sZGJmZCA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKKyAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKyAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisgICAgICBvbGRiZmQgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBORVdEWU4gYW5kIE9MRERZTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKKyAgICAgcmVzcGVjdGl2ZWx5LCBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICAqLworCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorICAgIG5ld2R5biA9IHRydWU7CisgIGVsc2UKKyAgICBuZXdkeW4gPSBmYWxzZTsKKworICBpZiAob2xkYmZkID09IE5VTEwgfHwgKG9sZGJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorICAgIG9sZGR5biA9IGZhbHNlOworICBlbHNlCisgICAgb2xkZHluID0gdHJ1ZTsKKworICAvKiBORVdERUYgYW5kIE9MRERFRiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKKyAgICAgcmVzcGVjdGl2ZWx5LCBhcHBlYXIgdG8gYmUgYSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHJlZmVyZW5jZS4gICovCisKKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCisgICAgbmV3ZGVmID0gZmFsc2U7CisgIGVsc2UKKyAgICBuZXdkZWYgPSB0cnVlOworCisgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKyAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaworICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorICAgIG9sZGRlZiA9IGZhbHNlOworICBlbHNlCisgICAgb2xkZGVmID0gdHJ1ZTsKKworICAvKiBORVdEWU5DT01NT04gYW5kIE9MRERZTkNPTU1PTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkCisgICAgIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LCBhcHBlYXJzIHRvIGJlIGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMKKyAgICAgb2JqZWN0LiAgSWYgYSBzeW1ib2wgYXBwZWFycyBpbiBhbiB1bmluaXRpYWxpemVkIHNlY3Rpb24sIGFuZCBpcworICAgICBub3Qgd2VhaywgYW5kIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGVuIGl0IG1heSBiZSBhIGNvbW1vbiBzeW1ib2wKKyAgICAgd2hpY2ggd2FzIHJlc29sdmVkIHdoZW4gdGhlIGR5bmFtaWMgb2JqZWN0IHdhcyBjcmVhdGVkLiAgV2Ugd2FudAorICAgICB0byB0cmVhdCBzdWNoIHN5bWJvbHMgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZXkgcmFpc2Ugc3BlY2lhbAorICAgICBjb25zaWRlcmF0aW9ucyB3aGVuIHNldHRpbmcgdGhlIHN5bWJvbCBzaXplOiBpZiB0aGUgc3ltYm9sCisgICAgIGFwcGVhcnMgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QsIGFuZCB0aGUgc2l6ZSBpbgorICAgICB0aGUgcmVndWxhciBvYmplY3QgaXMgbGFyZ2VyLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUKKyAgICAgbGFyZ2VyIHNpemUuICBUaGlzIHByb2JsZW1hdGljIGNhc2UgY2FuIGFsd2F5cyBiZSBhdm9pZGVkIGluIEMsCisgICAgIGJ1dCBpdCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gdXNpbmcgRm9ydHJhbiBzaGFyZWQKKyAgICAgbGlicmFyaWVzLgorCisgICAgIE5vdGUgdGhhdCBpZiBORVdEWU5DT01NT04gaXMgc2V0LCBORVdERUYgd2lsbCBiZSBzZXQsIGFuZAorICAgICBsaWtld2lzZSBmb3IgT0xERFlOQ09NTU9OIGFuZCBPTERERUYuCisKKyAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBqdXN0IGEgaGV1cmlzdGljLCBhbmQgdGhhdCBpdCBpcyBxdWl0ZQorICAgICBwb3NzaWJsZSB0byBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCB3aGljaAorICAgICBpcyByZWFsbHkgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNvdWxkCisgICAgIGxlYWQgdG8gc29tZSBtaW5vciBjb25mdXNpb24gd2hlbiB0aGUgc3ltYm9sIHJlYWxseSBpcyBhIGNvbW1vbgorICAgICBzeW1ib2wgaW4gc29tZSByZWd1bGFyIG9iamVjdC4gIEhvd2V2ZXIsIEkgdGhpbmsgaXQgd2lsbCBiZQorICAgICBoYXJtbGVzcy4gICovCisKKyAgaWYgKG5ld2R5bgorICAgICAgJiYgbmV3ZGVmCisgICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAorICAgICAgJiYgc3ltLT5zdF9zaXplID4gMAorICAgICAgJiYgYmluZCAhPSBTVEJfV0VBSworICAgICAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCisgICAgbmV3ZHluY29tbW9uID0gdHJ1ZTsKKyAgZWxzZQorICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOworCisgIGlmIChvbGRkeW4KKyAgICAgICYmIG9sZGRlZgorICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCisgICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAorICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAorICAgICAgJiYgaC0+c2l6ZSA+IDAKKyAgICAgICYmIGgtPnR5cGUgIT0gU1RUX0ZVTkMpCisgICAgb2xkZHluY29tbW9uID0gdHJ1ZTsKKyAgZWxzZQorICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOworCisgIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSB0eXBlIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQorICAgICBuZXcgc3ltYm9sIGlzIHdlYWsuICAqLworCisgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKKyAgICAgIHx8IGJpbmQgPT0gU1RCX1dFQUspCisgICAgKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKKworICAvKiBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgc2l6ZSBpZiBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBvciB0aGUKKyAgICAgbmV3IHN5bWJvbCBpcyB3ZWFrLCBvciBpZiB0aGUgb2xkIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLworCisgIGlmICgqdHlwZV9jaGFuZ2Vfb2sKKyAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKyAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOworCisgIC8qIElmIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBzeW1ib2xzIGxvb2sgbGlrZSBjb21tb24gc3ltYm9scyBpbiBhCisgICAgIGR5bmFtaWMgb2JqZWN0LCBzZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0byB0aGUgbGFyZ2VyIG9mIHRoZQorICAgICB0d28uICAqLworCisgIGlmIChvbGRkeW5jb21tb24KKyAgICAgICYmIG5ld2R5bmNvbW1vbgorICAgICAgJiYgc3ltLT5zdF9zaXplICE9IGgtPnNpemUpCisgICAgeworICAgICAgLyogU2luY2Ugd2UgdGhpbmsgd2UgaGF2ZSB0d28gY29tbW9uIHN5bWJvbHMsIGlzc3VlIGEgbXVsdGlwbGUKKyAgICAgICAgIGNvbW1vbiB3YXJuaW5nIGlmIGRlc2lyZWQuICBOb3RlIHRoYXQgd2Ugb25seSB3YXJuIGlmIHRoZQorICAgICAgICAgc2l6ZSBpcyBkaWZmZXJlbnQuICBJZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZSwgd2Ugc2ltcGx5IGxldAorICAgICAgICAgdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGUgdGhlIG5ldyBvbmUgYXMgbm9ybWFsbHkgaGFwcGVucyB3aXRoCisgICAgICAgICBzeW1ib2xzIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzLiAgKi8KKworICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCisJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKKwkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoc3ltLT5zdF9zaXplID4gaC0+c2l6ZSkKKwloLT5zaXplID0gc3ltLT5zdF9zaXplOworCisgICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOworICAgIH0KKworICAvKiBJZiB3ZSBhcmUgbG9va2luZyBhdCBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgaGF2ZSBmb3VuZCBhCisgICAgIGRlZmluaXRpb24sIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieQorICAgICBzb21lIG90aGVyIG9iamVjdC4gIElmIHNvLCB3ZSB3YW50IHRvIHVzZSB0aGUgZXhpc3RpbmcKKyAgICAgZGVmaW5pdGlvbiwgYW5kIHdlIGRvIG5vdCB3YW50IHRvIHJlcG9ydCBhIG11bHRpcGxlIHN5bWJvbAorICAgICBkZWZpbml0aW9uIGVycm9yOyB3ZSBkbyB0aGlzIGJ5IGNsb2JiZXJpbmcgKlBTRUMgdG8gYmUKKyAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4KKworICAgICBXZSB0cmVhdCBhIGNvbW1vbiBzeW1ib2wgYXMgYSBkZWZpbml0aW9uIGlmIHRoZSBzeW1ib2wgaW4gdGhlCisgICAgIHNoYXJlZCBsaWJyYXJ5IGlzIGEgZnVuY3Rpb24sIHNpbmNlIGNvbW1vbiBzeW1ib2xzIGFsd2F5cworICAgICByZXByZXNlbnQgdmFyaWFibGVzOyB0aGlzIGNhbiBjYXVzZSBjb25mdXNpb24gaW4gcHJpbmNpcGxlLCBidXQKKyAgICAgYW55IHN1Y2ggY29uZnVzaW9uIHdvdWxkIHNlZW0gdG8gaW5kaWNhdGUgYW4gZXJyb25lb3VzIHByb2dyYW0gb3IKKyAgICAgc2hhcmVkIGxpYnJhcnkuICBXZSBhbHNvIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyCisgICAgIG9iamVjdCB0byBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4gICovCisKKyAgaWYgKG5ld2R5bgorICAgICAgJiYgbmV3ZGVmCisgICAgICAmJiAob2xkZGVmCisJICB8fCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCisJICAgICAgJiYgKGJpbmQgPT0gU1RCX1dFQUsKKwkJICB8fCBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQykpKSkKKyAgICB7CisgICAgICAqb3ZlcnJpZGUgPSB0cnVlOworICAgICAgbmV3ZGVmID0gZmFsc2U7CisgICAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKKworICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKKworICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2hlbiB0aGUgb2xkIHN5bWJvbCBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4KKyAgICAgICAgIHdlIGFyZSBleHBsaWNpdGx5IGxldHRpbmcgaXQgb3ZlcnJpZGUgYSB3ZWFrIHN5bWJvbCBvcgorICAgICAgICAgZnVuY3Rpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FybiBhYm91dAorICAgICAgICAgYSB0eXBlIGNoYW5nZS4gIElmIHRoZSBvbGQgc3ltYm9sIGlzIGEgZGVmaW5lZCBzeW1ib2wsIGEgdHlwZQorICAgICAgICAgY2hhbmdlIHdhcm5pbmcgbWF5IHN0aWxsIGJlIGFwcHJvcHJpYXRlLiAgKi8KKworICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKwkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOworICAgIH0KKworICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBvbGQgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYQorICAgICBuZXcgc3ltYm9sIHdoaWNoIGxvb2tzIGxpa2UgYSBjb21tb24gc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KKyAgICAgV2UgY2hhbmdlICpQU0VDIGFuZCAqUFZBTFVFIHRvIG1ha2UgdGhlIG5ldyBzeW1ib2wgbG9vayBsaWtlIGEKKyAgICAgY29tbW9uIHN5bWJvbCwgYW5kIGxldCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aWxsIGRvCisgICAgIHRoZSByaWdodCB0aGluZy4gICovCisKKyAgaWYgKG5ld2R5bmNvbW1vbgorICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorICAgIHsKKyAgICAgICpvdmVycmlkZSA9IHRydWU7CisgICAgICBuZXdkZWYgPSBmYWxzZTsKKyAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOworICAgICAgKnB2YWx1ZSA9IHN5bS0+c3Rfc2l6ZTsKKyAgICAgICpwc2VjID0gc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKyAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7CisgICAgfQorCisgIC8qIElmIHRoZSBvbGQgc3ltYm9sIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZSBuZXcgc3ltYm9sIGlzCisgICAgIGEgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBuZXcKKyAgICAgc3ltYm9sIG92ZXJyaWRlcyB0aGUgb2xkIHN5bWJvbC4gIFN5bWJvbHMgZnJvbSByZWd1bGFyIGZpbGVzCisgICAgIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzeW1ib2xzIGZyb20gZHluYW1pYyBvYmplY3RzLCBldmVuIGlmCisgICAgIHRoZXkgYXJlIGRlZmluZWQgYWZ0ZXIgdGhlIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgorCisgICAgIEFzIGFib3ZlLCB3ZSBhZ2FpbiBwZXJtaXQgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgdG8KKyAgICAgb3ZlcnJpZGUgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCBpZiB0aGUgc2hhcmVkIG9iamVjdAorICAgICBzeW1ib2wgaXMgYSBmdW5jdGlvbiBvciBpcyB3ZWFrLiAgKi8KKworICBpZiAoISBuZXdkeW4KKyAgICAgICYmIChuZXdkZWYKKwkgIHx8IChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKKwkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaworCQkgIHx8IGgtPnR5cGUgPT0gU1RUX0ZVTkMpKSkKKyAgICAgICYmIG9sZGR5bgorICAgICAgJiYgb2xkZGVmCisgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDApCisgICAgeworICAgICAgLyogQ2hhbmdlIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIHVuZGVmaW5lZCwgYW5kIGxldAorCSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBkbyB0aGUgcmlnaHQgdGhpbmcgd2l0aCB0aGUKKwkgbmV3IGRlZmluaXRpb24uICAqLworCisgICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKKyAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKKyAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7CisKKyAgICAgIG9sZGRlZiA9IGZhbHNlOworICAgICAgb2xkZHluY29tbW9uID0gZmFsc2U7CisKKyAgICAgIC8qIFdlIGFnYWluIHBlcm1pdCBhIHR5cGUgY2hhbmdlIHdoZW4gYSBjb21tb24gc3ltYm9sIG1heSBiZQorICAgICAgICAgb3ZlcnJpZGluZyBhIGZ1bmN0aW9uLiAgKi8KKworICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKKwkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOworCisgICAgICAvKiBUaGlzIHVuaW9uIG1heSBoYXZlIGJlZW4gc2V0IHRvIGJlIG5vbi1OVUxMIHdoZW4gdGhpcyBzeW1ib2wKKwkgd2FzIHNlZW4gaW4gYSBkeW5hbWljIG9iamVjdC4gIFdlIG11c3QgZm9yY2UgdGhlIHVuaW9uIHRvIGJlCisJIE5VTEwsIHNvIHRoYXQgaXQgaXMgY29ycmVjdCBmb3IgYSByZWd1bGFyIHN5bWJvbC4gICovCisKKyAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7CisKKyAgICAgIC8qIEluIHRoaXMgc3BlY2lhbCBjYXNlLCBpZiBIIGlzIHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3Rpb24sCisgICAgICAgICB3ZSB3YW50IHRoZSBjYWxsZXIgdG8gZnJvYiB3aXRoIEggcmF0aGVyIHRoYW4gd2l0aCB0aGUKKyAgICAgICAgIGluZGlyZWN0IHN5bWJvbC4gIFRoYXQgd2lsbCBwZXJtaXQgdGhlIGNhbGxlciB0byByZWRlZmluZSB0aGUKKyAgICAgICAgIHRhcmdldCBvZiB0aGUgaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIHRoZSBpbmRpcmVjdCBzeW1ib2wKKyAgICAgICAgIGl0c2VsZi4gIEZJWE1FOiBUaGlzIHdpbGwgYnJlYWsgdGhlIC15IG9wdGlvbiBpZiB3ZSBzdG9yZSBhCisgICAgICAgICBzeW1ib2wgd2l0aCBhIGRpZmZlcmVudCBuYW1lLiAgKi8KKyAgICAgICpzeW1faGFzaCA9IGg7CisgICAgfQorCisgIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbmV3IGNvbW1vbiBzeW1ib2wgbWVyZ2luZyB3aXRoIGFuCisgICAgIG9sZCBzeW1ib2wgdGhhdCBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlIGEgY29tbW9uIHN5bWJvbCBkZWZpbmVkIGluCisgICAgIGEgc2hhcmVkIG9iamVjdC4gIE5vdGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgY2FzZSBpbgorICAgICB3aGljaCBhIG5ldyBjb21tb24gc3ltYm9sIHNob3VsZCBzaW1wbHkgb3ZlcnJpZGUgdGhlIGRlZmluaXRpb24KKyAgICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKworICBpZiAoISBuZXdkeW4KKyAgICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQorICAgICAgJiYgb2xkZHluY29tbW9uKQorICAgIHsKKyAgICAgIC8qIEl0IHdvdWxkIGJlIGJlc3QgaWYgd2UgY291bGQgc2V0IHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIGEKKwkgY29tbW9uIHN5bWJvbCwgYnV0IHdlIGRvbid0IGtub3cgd2hhdCB0byB1c2UgZm9yIHRoZSBzZWN0aW9uCisJIG9yIHRoZSBhbGlnbm1lbnQuICAqLworICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCisJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKKwkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBJZiB0aGUgcHJlZHVtZWQgY29tbW9uIHN5bWJvbCBpbiB0aGUgZHluYW1pYyBvYmplY3QgaXMKKyAgICAgICAgIGxhcmdlciwgcHJldGVuZCB0aGF0IHRoZSBuZXcgc3ltYm9sIGhhcyBpdHMgc2l6ZS4gICovCisKKyAgICAgIGlmIChoLT5zaXplID4gKnB2YWx1ZSkKKwkqcHZhbHVlID0gaC0+c2l6ZTsKKworICAgICAgLyogRklYTUU6IFdlIG5vIGxvbmdlciBrbm93IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlIHN5bWJvbAorCSBpbiB0aGUgZHluYW1pYyBvYmplY3QsIHNvIHdlIGp1c3Qgd2luZCB1cCB1c2luZyB0aGUgb25lIGZyb20KKwkgdGhlIHJlZ3VsYXIgb2JqZWN0LiAgKi8KKworICAgICAgb2xkZGVmID0gZmFsc2U7CisgICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKKworICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisgICAgICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7CisKKyAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7CisgICAgICAqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOworCisgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFTEYgb2JqZWN0IGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYm9vbGVhbiAoKmFkZF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosCisJCQkJICAgICAgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOworICBib29sZWFuICgqY2hlY2tfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkgICBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7CisgIGJvb2xlYW4gY29sbGVjdDsKKyAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKKyAgc2l6ZV90IHN5bWNvdW50OworICBzaXplX3QgZXh0c3ltY291bnQ7CisgIHNpemVfdCBleHRzeW1vZmY7CisgIEVsZl9FeHRlcm5hbF9TeW0gKmJ1ZiA9IE5VTEw7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7CisgIGJvb2xlYW4gZHluYW1pYzsKKyAgYmZkX2J5dGUgKmR5bnZlciA9IE5VTEw7CisgIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV4dHZlcnN5bSA9IE5VTEw7CisgIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV2ZXI7CisgIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmJ1ZiA9IE5VTEw7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrczsKKyAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bTsKKyAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bWVuZDsKKworICBhZGRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9hZGRfc3ltYm9sX2hvb2s7CisgIGNvbGxlY3QgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3Q7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCisgICAgZHluYW1pYyA9IGZhbHNlOworICBlbHNlCisgICAgeworICAgICAgZHluYW1pYyA9IHRydWU7CisKKyAgICAgIC8qIFlvdSBjYW4ndCB1c2UgLXIgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgQWxzbywgdGhlcmUncyBubworCSBob3BlIG9mIHVzaW5nIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggZG9lcyBub3QgZXhhY3RseSBtYXRjaAorCSB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworCSAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIGFueSBpbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgbmFtZWQKKyAgICAgLmdudS53YXJuaW5nLlNZTUJPTCBhcmUgdHJlYXRlZCBhcyB3YXJuaW5nIHN5bWJvbHMgZm9yIHRoZSBnaXZlbgorICAgICBzeW1ib2wuICBUaGlzIGRpZmZlcnMgZnJvbSAuZ251Lndhcm5pbmcgc2VjdGlvbnMsIHdoaWNoIGdlbmVyYXRlCisgICAgIHdhcm5pbmdzIHdoZW4gdGhleSBhcmUgaW5jbHVkZWQgaW4gYW4gb3V0cHV0IGZpbGUuICAqLworICBpZiAoISBpbmZvLT5zaGFyZWQpCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisKKyAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgcyk7CisJICBpZiAoc3RybmNtcCAobmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKm1zZzsKKwkgICAgICBiZmRfc2l6ZV90eXBlIHN6OworCisJICAgICAgbmFtZSArPSBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMTsKKworCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIGxvb2sgdXAgdGhlIHN5bWJvbAorCQkgaW4gdGhlIGhhc2ggdGFibGUuICBJZiBpdCBpcyB0aGVyZSwgYW5kIGl0IGlzIGFscmVhZHkKKwkJIGJlZW4gZGVmaW5lZCwgdGhlbiB3ZSB3aWxsIG5vdCBiZSB1c2luZyB0aGUgZW50cnkKKwkJIGZyb20gdGhpcyBzaGFyZWQgb2JqZWN0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhcm4uCisJCSBGSVhNRTogSWYgd2Ugc2VlIHRoZSBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QKKwkJIGxhdGVyIG9uLCB3ZSB3aWxsIHdhcm4sIGJ1dCB3ZSBzaG91bGRuJ3QuICBUaGUgb25seQorCQkgZml4IGlzIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB3YXJuaW5ncyB3ZSBhcmUgc3VwcG9zZWQKKwkJIHRvIGVtaXQsIGFuZCB0aGVuIGhhbmRsZSB0aGVtIGFsbCBhdCB0aGUgZW5kIG9mIHRoZQorCQkgbGluay4gICovCisJICAgICAgaWYgKGR5bmFtaWMgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQorCQl7CisJCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkJICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwKKwkJCQkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisKKwkJICAvKiBGSVhNRTogV2hhdCBhYm91dCBiZmRfbGlua19oYXNoX2NvbW1vbj8gICovCisJCSAgaWYgKGggIT0gTlVMTAorCQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwkJICAgIHsKKwkJICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpc3N1ZSB0aGlzIHdhcm5pbmcuICBDbG9iYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlY3Rpb24gc2l6ZSBzbyB0aGF0IHRoZSB3YXJuaW5nIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisJCSAgICAgIHMtPl9yYXdfc2l6ZSA9IDA7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQorCQl9CisKKwkgICAgICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHMpOworCSAgICAgIG1zZyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3ogKyAxKTsKKwkgICAgICBpZiAobXNnID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCSAgICAgIG1zZ1tzel0gPSAnXDAnOworCisJICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIEJTRl9XQVJOSU5HLCBzLCAoYmZkX3ZtYSkgMCwgbXNnLAorCQkgICAgICBmYWxzZSwgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBOVUxMKSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCQl7CisJCSAgLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplIHNvIHRoYXQgdGhlIHdhcm5pbmcgZG9lcworICAgICAgICAgICAgICAgICAgICAgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLworCQkgIHMtPl9yYXdfc2l6ZSA9IDA7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBhbHdheXMgbGluayBhZ2FpbnN0IHRoZSAuZHluc3ltCisgICAgIHN5bWJvbCB0YWJsZSwgbm90IHRoZSAuc3ltdGFiIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlcgorICAgICB3aWxsIG9ubHkgc2VlIHRoZSAuZHluc3ltIHN5bWJvbCB0YWJsZSwgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvCisgICAgIGxvb2sgYXQgLnN5bXRhYiBmb3IgYSBkeW5hbWljIG9iamVjdC4gICovCisKKyAgaWYgKCEgZHluYW1pYyB8fCBlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQorICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOworICBlbHNlCisgICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7CisKKyAgaWYgKGR5bmFtaWMpCisgICAgeworICAgICAgLyogUmVhZCBpbiBhbnkgdmVyc2lvbiBkZWZpbml0aW9ucy4gICovCisKKyAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHZlcnNpb25zLCBidXQgZG9uJ3QgYm90aGVyIHRvIGNvbnZlcnQgdGhlbQorICAgICAgICAgdG8gaW50ZXJuYWwgZm9ybWF0LiAgKi8KKyAgICAgIGlmIChlbGZfZHludmVyc3ltIChhYmZkKSAhPSAwKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9TaGRyICp2ZXJzeW1oZHI7CisKKwkgIHZlcnN5bWhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyOworCSAgZXh0dmVyc3ltID0gKEVsZl9FeHRlcm5hbF9WZXJzeW0gKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKKwkgIGlmIChleHR2ZXJzeW0gPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBpZiAoYmZkX3NlZWsgKGFiZmQsIHZlcnN5bWhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgZXh0dmVyc3ltLCAxLCB2ZXJzeW1oZHItPnNoX3NpemUsIGFiZmQpCisJCSAgIT0gdmVyc3ltaGRyLT5zaF9zaXplKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7CisKKyAgLyogVGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bXRhYiBoZWFkZXIgdGVsbHMgdXMgd2hlcmUgdGhlCisgICAgIGV4dGVybmFsIHN5bWJvbHMgc3RhcnQuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsb2NhbCBzeW1ib2xzIGF0CisgICAgIHRoaXMgcG9pbnQuICAqLworICBpZiAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKQorICAgIHsKKyAgICAgIGV4dHN5bWNvdW50ID0gc3ltY291bnQ7CisgICAgICBleHRzeW1vZmYgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dHN5bWNvdW50ID0gc3ltY291bnQgLSBoZHItPnNoX2luZm87CisgICAgICBleHRzeW1vZmYgPSBoZHItPnNoX2luZm87CisgICAgfQorCisgIGJ1ZiA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQorCSBiZmRfbWFsbG9jIChleHRzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKKyAgaWYgKGJ1ZiA9PSBOVUxMICYmIGV4dHN5bWNvdW50ICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogV2Ugc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGZvciBlYWNoIGV4dGVybmFsCisgICAgIHN5bWJvbC4gICovCisgIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKKwkgICAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkgZXh0c3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKSk7CisgIGlmIChzeW1faGFzaCA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBlbGZfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKKworICBpZiAoISBkeW5hbWljKQorICAgIHsKKyAgICAgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBjcmVhdGUgYWxsIHRoZSBkeW5hbWljCisgICAgICAgICBzZWN0aW9ucyBpbW1lZGlhdGVseS4gIFdlIG5lZWQgdG8gYXR0YWNoIHRoZW0gdG8gc29tZXRoaW5nLAorICAgICAgICAgc28gd2UgYXR0YWNoIHRoZW0gdG8gdGhpcyBCRkQsIHByb3ZpZGVkIGl0IGlzIHRoZSByaWdodAorICAgICAgICAgZm9ybWF0LiAgRklYTUU6IElmIHRoZXJlIGFyZSBubyBpbnB1dCBCRkQncyBvZiB0aGUgc2FtZQorICAgICAgICAgZm9ybWF0IGFzIHRoZSBvdXRwdXQsIHdlIGNhbid0IG1ha2UgYSBzaGFyZWQgbGlicmFyeS4gICovCisgICAgICBpZiAoaW5mby0+c2hhcmVkCisJICAmJiAhIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCisJICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCisJeworCSAgaWYgKCEgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBib29sZWFuIGFkZF9uZWVkZWQ7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgYmZkX3NpemVfdHlwZSBvbGRzaXplOworICAgICAgYmZkX3NpemVfdHlwZSBzdHJpbmRleDsKKworICAgICAgLyogRmluZCB0aGUgbmFtZSB0byB1c2UgaW4gYSBEVF9ORUVERUQgZW50cnkgdGhhdCByZWZlcnMgdG8gdGhpcworCSBvYmplY3QuICBJZiB0aGUgb2JqZWN0IGhhcyBhIERUX1NPTkFNRSBlbnRyeSwgd2UgdXNlIGl0LgorCSBPdGhlcndpc2UsIGlmIHRoZSBnZW5lcmljIGxpbmtlciBzdHVjayBzb21ldGhpbmcgaW4KKwkgZWxmX2R0X25hbWUsIHdlIHVzZSB0aGF0LiAgT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSB0aGUgZmlsZQorCSBuYW1lLiAgSWYgdGhlIGdlbmVyaWMgbGlua2VyIHB1dCBhIG51bGwgc3RyaW5nIGludG8KKwkgZWxmX2R0X25hbWUsIHdlIGRvbid0IG1ha2UgYSBEVF9ORUVERUQgZW50cnkgYXQgYWxsLCBldmVuIGlmCisJIHRoZXJlIGlzIGEgRFRfU09OQU1FIGVudHJ5LiAgKi8KKyAgICAgIGFkZF9uZWVkZWQgPSB0cnVlOworICAgICAgbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOworICAgICAgaWYgKGVsZl9kdF9uYW1lIChhYmZkKSAhPSBOVUxMKQorCXsKKwkgIG5hbWUgPSBlbGZfZHRfbmFtZSAoYWJmZCk7CisJICBpZiAoKm5hbWUgPT0gJ1wwJykKKwkgICAgYWRkX25lZWRlZCA9IGZhbHNlOworCX0KKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7CisgICAgICBpZiAocyAhPSBOVUxMKQorCXsKKwkgIEVsZl9FeHRlcm5hbF9EeW4gKmV4dGR5bjsKKwkgIEVsZl9FeHRlcm5hbF9EeW4gKmV4dGR5bmVuZDsKKwkgIGludCBlbGZzZWM7CisJICB1bnNpZ25lZCBsb25nIGxpbms7CisKKwkgIGR5bmJ1ZiA9IChFbGZfRXh0ZXJuYWxfRHluICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7CisJICBpZiAoZHluYnVmID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwKKwkJCQkJICAoZmlsZV9wdHIpIDAsIHMtPl9yYXdfc2l6ZSkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOworCSAgaWYgKGVsZnNlYyA9PSAtMSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOworCisJICBleHRkeW4gPSBkeW5idWY7CisJICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pOworCSAgZm9yICg7IGV4dGR5biA8IGV4dGR5bmVuZDsgZXh0ZHluKyspCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKKworCSAgICAgIGVsZl9zd2FwX2R5bl9pbiAoYWJmZCwgZXh0ZHluLCAmZHluKTsKKwkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1NPTkFNRSkKKwkJeworCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAorCQkJCQkJCSAgZHluLmRfdW4uZF92YWwpOworCQkgIGlmIChuYW1lID09IE5VTEwpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTkVFREVEKQorCQl7CisJCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuLCAqKnBuOworCQkgIGNoYXIgKmZubSwgKmFubTsKKworCQkgIG4gPSAoKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKQorCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCkpKTsKKwkJICBmbm0gPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAorCQkJCQkJCSBkeW4uZF91bi5kX3ZhbCk7CisJCSAgaWYgKG4gPT0gTlVMTCB8fCBmbm0gPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIGFubSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChmbm0pICsgMSk7CisJCSAgaWYgKGFubSA9PSBOVUxMKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgc3RyY3B5IChhbm0sIGZubSk7CisJCSAgbi0+bmFtZSA9IGFubTsKKwkJICBuLT5ieSA9IGFiZmQ7CisJCSAgbi0+bmV4dCA9IE5VTEw7CisJCSAgZm9yIChwbiA9ICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPm5lZWRlZDsKKwkJICAgICAgICpwbiAhPSBOVUxMOworCQkgICAgICAgcG4gPSAmKCpwbiktPm5leHQpCisJCSAgICA7CisJCSAgKnBuID0gbjsKKwkJfQorCSAgICB9CisKKwkgIGZyZWUgKGR5bmJ1Zik7CisJICBkeW5idWYgPSBOVUxMOworCX0KKworICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBhbnkgb2YgdGhlIHNlY3Rpb25zIGluIGEgZHluYW1pYworCSBvYmplY3QgaW4gdGhlIG91dHB1dCBmaWxlLiAgV2UgaGFjayBieSBzaW1wbHkgY2xvYmJlcmluZyB0aGUKKwkgbGlzdCBvZiBzZWN0aW9ucyBpbiB0aGUgQkZELiAgVGhpcyBjb3VsZCBiZSBoYW5kbGVkIG1vcmUKKwkgY2xlYW5seSBieSwgc2F5LCBhIG5ldyBzZWN0aW9uIGZsYWc7IHRoZSBleGlzdGluZworCSBTRUNfTkVWRVJfTE9BRCBmbGFnIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQsIGJlY2F1c2UgdGhhdCBvbmUKKwkgc3RpbGwgaW1wbGllcyB0aGF0IHRoZSBzZWN0aW9uIHRha2VzIHVwIHNwYWNlIGluIHRoZSBvdXRwdXQKKwkgZmlsZS4gICovCisgICAgICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7CisgICAgICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKKworICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gdGhlIGxpbmssIGNyZWF0ZQorCSB0aGUgc3BlY2lhbCBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorCXsKKwkgIGlmICghIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorCisgICAgICBpZiAoYWRkX25lZWRlZCkKKwl7CisJICAvKiBBZGQgYSBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZHluYW1pYyBvYmplY3QuICAqLworCSAgb2xkc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKKwkgIHN0cmluZGV4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwgbmFtZSwKKwkJCQkJIHRydWUsIGZhbHNlKTsKKwkgIGlmIChzdHJpbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBpZiAob2xkc2l6ZSA9PSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cikpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2R5bjsKKwkgICAgICBFbGZfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7CisKKwkgICAgICAvKiBUaGUgaGFzaCB0YWJsZSBzaXplIGRpZCBub3QgY2hhbmdlLCB3aGljaCBtZWFucyB0aGF0CisJCSB0aGUgZHluYW1pYyBvYmplY3QgbmFtZSB3YXMgYWxyZWFkeSBlbnRlcmVkLiAgSWYgd2UKKwkJIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCB0aGlzIGR5bmFtaWMgb2JqZWN0IGluIHRoZQorCQkgbGluaywganVzdCBpZ25vcmUgaXQuICBUaGVyZSBpcyBubyByZWFzb24gdG8gaW5jbHVkZQorCQkgYSBwYXJ0aWN1bGFyIGR5bmFtaWMgb2JqZWN0IG1vcmUgdGhhbiBvbmNlLiAgKi8KKwkgICAgICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAorCQkJCQkgICAgICAiLmR5bmFtaWMiKTsKKwkgICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOworCisJICAgICAgZHluY29uID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7CisJICAgICAgZHluY29uZW5kID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsKKwkJCQkJCXNkeW4tPl9yYXdfc2l6ZSk7CisJICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCisJCXsKKwkJICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKKworCQkgIGVsZl9zd2FwX2R5bl9pbiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIGR5bmNvbiwKKwkJCQkgICAmZHluKTsKKwkJICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRAorCQkgICAgICAmJiBkeW4uZF91bi5kX3ZhbCA9PSBzdHJpbmRleCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGJ1ZiAhPSBOVUxMKQorCQkJZnJlZSAoYnVmKTsKKwkJICAgICAgaWYgKGV4dHZlcnN5bSAhPSBOVUxMKQorCQkJZnJlZSAoZXh0dmVyc3ltKTsKKwkJICAgICAgcmV0dXJuIHRydWU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX05FRURFRCwgc3RyaW5kZXgpKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKyAgICAgIC8qIFNhdmUgdGhlIFNPTkFNRSwgaWYgdGhlcmUgaXMgb25lLCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUKKyAgICAgICAgIGxpbmtlciBlbXVsYXRpb24gY29kZSB3aWxsIG5lZWQgdG8ga25vdyBpdC4gICovCisgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKKwluYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7CisgICAgICBlbGZfZHRfbmFtZSAoYWJmZCkgPSBuYW1lOworICAgIH0KKworICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCWhkci0+c2hfb2Zmc2V0ICsgZXh0c3ltb2ZmICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKKwkJU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgYnVmLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCBleHRzeW1jb3VudCwgYWJmZCkKKwkgICE9IGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgd2Vha3MgPSBOVUxMOworCisgIGV2ZXIgPSBleHR2ZXJzeW0gIT0gTlVMTCA/IGV4dHZlcnN5bSArIGV4dHN5bW9mZiA6IE5VTEw7CisgIGVzeW1lbmQgPSBidWYgKyBleHRzeW1jb3VudDsKKyAgZm9yIChlc3ltID0gYnVmOworICAgICAgIGVzeW0gPCBlc3ltZW5kOworICAgICAgIGVzeW0rKywgc3ltX2hhc2grKywgZXZlciA9IChldmVyICE9IE5VTEwgPyBldmVyICsgMSA6IE5VTEwpKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOworICAgICAgaW50IGJpbmQ7CisgICAgICBiZmRfdm1hIHZhbHVlOworICAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgIGZsYWd3b3JkIGZsYWdzOworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgYm9vbGVhbiBkZWZpbml0aW9uOworICAgICAgYm9vbGVhbiBzaXplX2NoYW5nZV9vaywgdHlwZV9jaGFuZ2Vfb2s7CisgICAgICBib29sZWFuIG5ld193ZWFrZGVmOworICAgICAgdW5zaWduZWQgaW50IG9sZF9hbGlnbm1lbnQ7CisKKyAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJnN5bSk7CisKKyAgICAgIGZsYWdzID0gQlNGX05PX0ZMQUdTOworICAgICAgc2VjID0gTlVMTDsKKyAgICAgIHZhbHVlID0gc3ltLnN0X3ZhbHVlOworICAgICAgKnN5bV9oYXNoID0gTlVMTDsKKworICAgICAgYmluZCA9IEVMRl9TVF9CSU5EIChzeW0uc3RfaW5mbyk7CisgICAgICBpZiAoYmluZCA9PSBTVEJfTE9DQUwpCisJeworCSAgLyogVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZSwgc2luY2UgRUxGIHJlcXVpcmVzIHRoYXQgYWxsCisJICAgICBnbG9iYWwgc3ltYm9scyBmb2xsb3cgYWxsIGxvY2FsIHN5bWJvbHMsIGFuZCB0aGF0IHNoX2luZm8KKwkgICAgIHBvaW50IHRvIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgVW5mb3J0dW5hdGVhbHksIElyaXggNQorCSAgICAgc2NyZXdzIHRoaXMgdXAuICAqLworCSAgY29udGludWU7CisJfQorICAgICAgZWxzZSBpZiAoYmluZCA9PSBTVEJfR0xPQkFMKQorCXsKKwkgIGlmIChzeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGCisJICAgICAgJiYgc3ltLnN0X3NobmR4ICE9IFNITl9DT01NT04pCisJICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKKwkgIGVsc2UKKwkgICAgZmxhZ3MgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKGJpbmQgPT0gU1RCX1dFQUspCisJZmxhZ3MgPSBCU0ZfV0VBSzsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBMZWF2ZSBpdCB1cCB0byB0aGUgcHJvY2Vzc29yIGJhY2tlbmQuICAqLworCX0KKworICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCisJc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKyAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA+IDAgJiYgc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKKwl7CisJICBzZWMgPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0uc3Rfc2huZHgpOworCSAgaWYgKHNlYyA9PSBOVUxMKQorCSAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSAhPSAwKQorCSAgICB2YWx1ZSAtPSBzZWMtPnZtYTsKKwl9CisgICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKKwlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCisJeworCSAgc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKwkgIC8qIFdoYXQgRUxGIGNhbGxzIHRoZSBzaXplIHdlIGNhbGwgdGhlIHZhbHVlLiAgV2hhdCBFTEYKKwkgICAgIGNhbGxzIHRoZSB2YWx1ZSB3ZSBjYWxsIHRoZSBhbGlnbm1lbnQuICAqLworCSAgdmFsdWUgPSBzeW0uc3Rfc2l6ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTGVhdmUgaXQgdXAgdG8gdGhlIHByb2Nlc3NvciBiYWNrZW5kLiAgKi8KKwl9CisKKyAgICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssIHN5bS5zdF9uYW1lKTsKKyAgICAgIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGlmIChhZGRfc3ltYm9sX2hvb2spCisJeworCSAgaWYgKCEgKCphZGRfc3ltYm9sX2hvb2spIChhYmZkLCBpbmZvLCAmc3ltLCAmbmFtZSwgJmZsYWdzLCAmc2VjLAorCQkJCSAgICAmdmFsdWUpKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgLyogVGhlIGhvb2sgZnVuY3Rpb24gc2V0cyB0aGUgbmFtZSB0byBOVUxMIGlmIHRoaXMgc3ltYm9sCisJICAgICBzaG91bGQgYmUgc2tpcHBlZCBmb3Igc29tZSByZWFzb24uICAqLworCSAgaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKKwkgICAgY29udGludWU7CisJfQorCisgICAgICAvKiBTYW5pdHkgY2hlY2sgdGhhdCBhbGwgcG9zc2liaWxpdGllcyB3ZXJlIGhhbmRsZWQuICAqLworICAgICAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKQorCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQorCWRlZmluaXRpb24gPSBmYWxzZTsKKyAgICAgIGVsc2UKKwlkZWZpbml0aW9uID0gdHJ1ZTsKKworICAgICAgc2l6ZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKKyAgICAgIHR5cGVfY2hhbmdlX29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT50eXBlX2NoYW5nZV9vazsKKyAgICAgIG9sZF9hbGlnbm1lbnQgPSAwOworICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKwl7CisJICBFbGZfSW50ZXJuYWxfVmVyc3ltIGl2ZXI7CisJICB1bnNpZ25lZCBpbnQgdmVybnVtID0gMDsKKwkgIGJvb2xlYW4gb3ZlcnJpZGU7CisKKwkgIGlmIChldmVyICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiAoYWJmZCwgZXZlciwgJml2ZXIpOworCSAgICAgIHZlcm51bSA9IGl2ZXIudnNfdmVycyAmIFZFUlNZTV9WRVJTSU9OOworCisJICAgICAgLyogSWYgdGhpcyBpcyBhIGhpZGRlbiBzeW1ib2wsIG9yIGlmIGl0IGlzIG5vdCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgIDEsIHdlIGFwcGVuZCB0aGUgdmVyc2lvbiBuYW1lIHRvIHRoZSBzeW1ib2wgbmFtZS4KKyAgICAgICAgICAgICAgICAgSG93ZXZlciwgd2UgZG8gbm90IG1vZGlmeSBhIG5vbi1oaWRkZW4gYWJzb2x1dGUKKyAgICAgICAgICAgICAgICAgc3ltYm9sLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIHRoZSB2ZXJzaW9uIHN5bWJvbAorICAgICAgICAgICAgICAgICBpdHNlbGYuICBGSVhNRTogV2hhdCBpZiBpdCBpc24ndD8gICovCisJICAgICAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSAhPSAwCisJCSAgfHwgKHZlcm51bSA+IDEgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpKQorCQl7CisJCSAgY29uc3QgY2hhciAqdmVyc3RyOworCQkgIGludCBuYW1lbGVuLCBuZXdsZW47CisJCSAgY2hhciAqbmV3bmFtZSwgKnA7CisKKwkJICBpZiAoc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRikKKwkJICAgIHsKKwkJICAgICAgaWYgKHZlcm51bSA+IGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHIuc2hfaW5mbykKKwkJCXsKKwkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCQkgICAgKF8oIiVzOiAlczogaW52YWxpZCB2ZXJzaW9uICV1IChtYXggJWQpIiksCisJCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCB2ZXJudW0sCisJCQkgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHIuc2hfaW5mbyk7CisJCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkJICBnb3RvIGVycm9yX3JldHVybjsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAodmVybnVtID4gMSkKKwkJCXZlcnN0ciA9CisJCQkgIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXS52ZF9ub2RlbmFtZTsKKwkJICAgICAgZWxzZQorCQkJdmVyc3RyID0gIiI7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBXZSBjYW5ub3Qgc2ltcGx5IHRlc3QgZm9yIHRoZSBudW1iZXIgb2YKKwkJCSBlbnRyaWVzIGluIHRoZSBWRVJORUVEIHNlY3Rpb24gc2luY2UgdGhlCisJCQkgbnVtYmVycyBmb3IgdGhlIG5lZWRlZCB2ZXJzaW9ucyBkbyBub3Qgc3RhcnQKKwkJCSBhdCAwLiAgKi8KKwkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7CisKKwkJICAgICAgdmVyc3RyID0gTlVMTDsKKwkJICAgICAgZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOworCQkJICAgdCAhPSBOVUxMOworCQkJICAgdCA9IHQtPnZuX25leHRyZWYpCisJCQl7CisJCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOworCisJCQkgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCisJCQkgICAgeworCQkJICAgICAgaWYgKGEtPnZuYV9vdGhlciA9PSB2ZXJudW0pCisJCQkJeworCQkJCSAgdmVyc3RyID0gYS0+dm5hX25vZGVuYW1lOworCQkJCSAgYnJlYWs7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgaWYgKGEgIT0gTlVMTCkKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgICAgaWYgKHZlcnN0ciA9PSBOVUxMKQorCQkJeworCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJCSAgICAoXygiJXM6ICVzOiBpbnZhbGlkIG5lZWRlZCB2ZXJzaW9uICVkIiksCisJCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCB2ZXJudW0pOworCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCSAgICB9CisKKwkJICBuYW1lbGVuID0gc3RybGVuIChuYW1lKTsKKwkJICBuZXdsZW4gPSBuYW1lbGVuICsgc3RybGVuICh2ZXJzdHIpICsgMjsKKwkJICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pID09IDApCisJCSAgICArK25ld2xlbjsKKworCQkgIG5ld25hbWUgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIG5ld2xlbik7CisJCSAgaWYgKG5ld25hbWUgPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHN0cmNweSAobmV3bmFtZSwgbmFtZSk7CisJCSAgcCA9IG5ld25hbWUgKyBuYW1lbGVuOworCQkgICpwKysgPSBFTEZfVkVSX0NIUjsKKwkJICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pID09IDApCisJCSAgICAqcCsrID0gRUxGX1ZFUl9DSFI7CisJCSAgc3RyY3B5IChwLCB2ZXJzdHIpOworCisJCSAgbmFtZSA9IG5ld25hbWU7CisJCX0KKwkgICAgfQorCisJICBpZiAoISBlbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBuYW1lLCAmc3ltLCAmc2VjLCAmdmFsdWUsCisJCQkJICBzeW1faGFzaCwgJm92ZXJyaWRlLCAmdHlwZV9jaGFuZ2Vfb2ssCisJCQkJICAmc2l6ZV9jaGFuZ2Vfb2spKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKG92ZXJyaWRlKQorCSAgICBkZWZpbml0aW9uID0gZmFsc2U7CisKKwkgIGggPSAqc3ltX2hhc2g7CisJICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKKwkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisJICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKKworCSAgLyogUmVtZW1iZXIgdGhlIG9sZCBhbGlnbm1lbnQgaWYgdGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wsIHNvCisgICAgICAgICAgICAgdGhhdCB3ZSBkb24ndCByZWR1Y2UgdGhlIGFsaWdubWVudCBsYXRlciBvbi4gIFdlIGNhbid0CisgICAgICAgICAgICAgY2hlY2sgbGF0ZXIsIGJlY2F1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKyAgICAgICAgICAgICB3aWxsIHNldCBhIGRlZmF1bHQgZm9yIHRoZSBhbGlnbm1lbnQgd2hpY2ggd2Ugd2FudCB0bworICAgICAgICAgICAgIG92ZXJyaWRlLiAgKi8KKwkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCisJICAgIG9sZF9hbGlnbm1lbnQgPSBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7CisKKwkgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgIT0gTlVMTAorCSAgICAgICYmICEgb3ZlcnJpZGUKKwkgICAgICAmJiB2ZXJudW0gPiAxCisJICAgICAgJiYgZGVmaW5pdGlvbikKKwkgICAgaC0+dmVyaW5mby52ZXJkZWYgPSAmZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdOworCX0KKworICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlYywgdmFsdWUsIChjb25zdCBjaGFyICopIE5VTEwsCisJICAgICAgZmFsc2UsIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaCA9ICpzeW1faGFzaDsKKyAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisgICAgICAqc3ltX2hhc2ggPSBoOworCisgICAgICBuZXdfd2Vha2RlZiA9IGZhbHNlOworICAgICAgaWYgKGR5bmFtaWMKKwkgICYmIGRlZmluaXRpb24KKwkgICYmIChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCisJICAmJiBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pICE9IFNUVF9GVU5DCisJICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKwkgICYmIGgtPndlYWtkZWYgPT0gTlVMTCkKKwl7CisJICAvKiBLZWVwIGEgbGlzdCBvZiBhbGwgd2VhayBkZWZpbmVkIG5vbiBmdW5jdGlvbiBzeW1ib2xzIGZyb20KKwkgICAgIGEgZHluYW1pYyBvYmplY3QsIHVzaW5nIHRoZSB3ZWFrZGVmIGZpZWxkLiAgTGF0ZXIgaW4gdGhpcworCSAgICAgZnVuY3Rpb24gd2Ugd2lsbCBzZXQgdGhlIHdlYWtkZWYgZmllbGQgdG8gdGhlIGNvcnJlY3QKKwkgICAgIHZhbHVlLiAgV2Ugb25seSBwdXQgbm9uLWZ1bmN0aW9uIHN5bWJvbHMgZnJvbSBkeW5hbWljCisJICAgICBvYmplY3RzIG9uIHRoaXMgbGlzdCwgYmVjYXVzZSB0aGF0IGhhcHBlbnMgdG8gYmUgdGhlIG9ubHkKKwkgICAgIHRpbWUgd2UgbmVlZCB0byBrbm93IHRoZSBub3JtYWwgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gYQorCSAgICAgd2VhayBzeW1ib2wsIGFuZCB0aGUgaW5mb3JtYXRpb24gaXMgdGltZSBjb25zdW1pbmcgdG8KKwkgICAgIGZpZ3VyZSBvdXQuICBJZiB0aGUgd2Vha2RlZiBmaWVsZCBpcyBub3QgYWxyZWFkeSBOVUxMLAorCSAgICAgdGhlbiB0aGlzIHN5bWJvbCB3YXMgYWxyZWFkeSBkZWZpbmVkIGJ5IHNvbWUgcHJldmlvdXMKKwkgICAgIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2Ugd2lsbCBiZSB1c2luZyB0aGF0IHByZXZpb3VzCisJICAgICBkZWZpbml0aW9uIGFueWhvdy4gICovCisKKwkgIGgtPndlYWtkZWYgPSB3ZWFrczsKKwkgIHdlYWtzID0gaDsKKwkgIG5ld193ZWFrZGVmID0gdHJ1ZTsKKwl9CisKKyAgICAgIC8qIFNldCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbC4gICovCisgICAgICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04KKwkgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKwl7CisJICB1bnNpZ25lZCBpbnQgYWxpZ247CisKKwkgIGFsaWduID0gYmZkX2xvZzIgKHN5bS5zdF92YWx1ZSk7CisJICBpZiAoYWxpZ24gPiBvbGRfYWxpZ25tZW50KQorCSAgICBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBhbGlnbjsKKwl9CisKKyAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisJeworCSAgaW50IG9sZF9mbGFnczsKKwkgIGJvb2xlYW4gZHluc3ltOworCSAgaW50IG5ld19mbGFnOworCisJICAvKiBSZW1lbWJlciB0aGUgc3ltYm9sIHNpemUgYW5kIHR5cGUuICAqLworCSAgaWYgKHN5bS5zdF9zaXplICE9IDAKKwkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT5zaXplID09IDApKQorCSAgICB7CisJICAgICAgaWYgKGgtPnNpemUgIT0gMCAmJiBoLT5zaXplICE9IHN5bS5zdF9zaXplICYmICEgc2l6ZV9jaGFuZ2Vfb2spCisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgIChfKCJXYXJuaW5nOiBzaXplIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlbHUgdG8gJWx1IGluICVzIiksCisJCSAgIG5hbWUsICh1bnNpZ25lZCBsb25nKSBoLT5zaXplLCAodW5zaWduZWQgbG9uZykgc3ltLnN0X3NpemUsCisJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworCSAgICAgIGgtPnNpemUgPSBzeW0uc3Rfc2l6ZTsKKwkgICAgfQorCisJICAvKiBJZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbCwgdGhlbiB3ZSBhbHdheXMgd2FudCBILT5TSVpFCisgICAgICAgICAgICAgdG8gYmUgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBUaGUgY29kZSBqdXN0IGFib3ZlCisgICAgICAgICAgICAgd29uJ3QgZml4IHRoZSBzaXplIGlmIGEgY29tbW9uIHN5bWJvbCBiZWNvbWVzIGxhcmdlci4gIFdlCisgICAgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBhIHNpemUgY2hhbmdlIGhlcmUsIGJlY2F1c2UgdGhhdCBpcworICAgICAgICAgICAgIGNvdmVyZWQgYnkgLS13YXJuLWNvbW1vbi4gICovCisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorCSAgICBoLT5zaXplID0gaC0+cm9vdC51LmMuc2l6ZTsKKworCSAgaWYgKEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykgIT0gU1RUX05PVFlQRQorCSAgICAgICYmIChkZWZpbml0aW9uIHx8IGgtPnR5cGUgPT0gU1RUX05PVFlQRSkpCisJICAgIHsKKwkgICAgICBpZiAoaC0+dHlwZSAhPSBTVFRfTk9UWVBFCisJCSAgJiYgaC0+dHlwZSAhPSBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pCisJCSAgJiYgISB0eXBlX2NoYW5nZV9vaykKKwkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgKF8oIldhcm5pbmc6IHR5cGUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVkIHRvICVkIGluICVzIiksCisJCSAgIG5hbWUsIGgtPnR5cGUsIEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbyksCisJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworCSAgICAgIGgtPnR5cGUgPSBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pOworCSAgICB9CisKKwkgIGlmIChzeW0uc3Rfb3RoZXIgIT0gMAorCSAgICAgICYmIChkZWZpbml0aW9uIHx8IGgtPm90aGVyID09IDApKQorCSAgICBoLT5vdGhlciA9IHN5bS5zdF9vdGhlcjsKKworCSAgLyogU2V0IGEgZmxhZyBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mCisJICAgICByZWZlcmVuY2Ugb3IgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLiAgS2VlcCBhIGNvdW50IG9mCisJICAgICB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyB3ZSBmaW5kLiAgQSBkeW5hbWljIHN5bWJvbAorCSAgICAgaXMgb25lIHdoaWNoIGlzIHJlZmVyZW5jZWQgb3IgZGVmaW5lZCBieSBib3RoIGEgcmVndWxhcgorCSAgICAgb2JqZWN0IGFuZCBhIHNoYXJlZCBvYmplY3QuICAqLworCSAgb2xkX2ZsYWdzID0gaC0+ZWxmX2xpbmtfaGFzaF9mbGFnczsKKwkgIGR5bnN5bSA9IGZhbHNlOworCSAgaWYgKCEgZHluYW1pYykKKwkgICAgeworCSAgICAgIGlmICghIGRlZmluaXRpb24pCisJCXsKKwkJICBuZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7CisJCSAgaWYgKGJpbmQgIT0gU1RCX1dFQUspCisJCSAgICBuZXdfZmxhZyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUs7CisJCX0KKwkgICAgICBlbHNlCisJCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKKwkgICAgICBpZiAoaW5mby0+c2hhcmVkCisJCSAgfHwgKG9sZF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCisJCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSkgIT0gMCkKKwkJZHluc3ltID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgZGVmaW5pdGlvbikKKwkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOworCSAgICAgIGVsc2UKKwkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOworCSAgICAgIGlmICgob2xkX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIKKwkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSAhPSAwCisJCSAgfHwgKGgtPndlYWtkZWYgIT0gTlVMTAorCQkgICAgICAmJiAhIG5ld193ZWFrZGVmCisJCSAgICAgICYmIGgtPndlYWtkZWYtPmR5bmluZHggIT0gLTEpKQorCQlkeW5zeW0gPSB0cnVlOworCSAgICB9CisKKwkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gbmV3X2ZsYWc7CisKKwkgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhIHZlcnNpb24sIGFuZCBpdCBpcyB0aGUgZGVmYXVsdAorICAgICAgICAgICAgIHZlcnNpb24sIHdlIGNyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wgZnJvbSB0aGUgZGVmYXVsdAorICAgICAgICAgICAgIG5hbWUgdG8gdGhlIGZ1bGx5IGRlY29yYXRlZCBuYW1lLiAgVGhpcyB3aWxsIGNhdXNlCisgICAgICAgICAgICAgZXh0ZXJuYWwgcmVmZXJlbmNlcyB3aGljaCBkbyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gdG8gYmUKKyAgICAgICAgICAgICBib3VuZCB0byB0aGlzIHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gICovCisJICBpZiAoZGVmaW5pdGlvbikKKwkgICAgeworCSAgICAgIGNoYXIgKnA7CisKKwkgICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7CisJICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwWzFdID09IEVMRl9WRVJfQ0hSKQorCQl7CisJCSAgY2hhciAqc2hvcnRuYW1lOworCQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoaTsKKwkJICBib29sZWFuIG92ZXJyaWRlOworCisJCSAgc2hvcnRuYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKKwkJCQkJCSBwIC0gbmFtZSArIDEpOworCQkgIGlmIChzaG9ydG5hbWUgPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHN0cm5jcHkgKHNob3J0bmFtZSwgbmFtZSwgcCAtIG5hbWUpOworCQkgIHNob3J0bmFtZVtwIC0gbmFtZV0gPSAnXDAnOworCisJCSAgLyogV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuICBNZXJnZSBpdAorICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbnkgZXhpc3Rpbmcgc3ltYm9sIHdpdGggdGhpcyBuYW1lLiAgRm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgcHVycG9zZXMgb2YgdGhlIG1lcmdlLCBhY3QgYXMgdGhvdWdoIHdlIHdlcmUKKyAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBzeW1ib2wgd2UganVzdCBkZWZpbmVkLCBhbHRob3VnaCB3ZQorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgZ29pbmcgdG8gZGVmaW5lIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCisJCSAgdHlwZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKKwkJICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOworCQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIHNob3J0bmFtZSwgJnN5bSwgJnNlYywKKwkJCQkJICAmdmFsdWUsICZoaSwgJm92ZXJyaWRlLAorCQkJCQkgICZ0eXBlX2NoYW5nZV9vaywgJnNpemVfY2hhbmdlX29rKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgaWYgKCEgb3ZlcnJpZGUpCisJCSAgICB7CisJCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAorCQkJICAgICAoaW5mbywgYWJmZCwgc2hvcnRuYW1lLCBCU0ZfSU5ESVJFQ1QsCisJCQkgICAgICBiZmRfaW5kX3NlY3Rpb25fcHRyLCAoYmZkX3ZtYSkgMCwgbmFtZSwgZmFsc2UsCisJCQkgICAgICBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoaSkpKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBJbiB0aGlzIGNhc2UgdGhlIHN5bWJvbCBuYW1lZCBTSE9SVE5BTUUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkaW5nIHRoZSBpbmRpcmVjdCBzeW1ib2wgd2Ugd2FudCB0bworICAgICAgICAgICAgICAgICAgICAgICAgIGFkZC4gIFdlIHdlcmUgcGxhbm5pbmcgb24gbWFraW5nIFNIT1JUTkFNRSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0IHN5bWJvbCByZWZlcnJpbmcgdG8gTkFNRS4gIFNIT1JUTkFNRQorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBuYW1lIHdpdGhvdXQgYSB2ZXJzaW9uLiAgTkFNRSBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseSB2ZXJzaW9uZWQgbmFtZSwgYW5kIGl0IGlzIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KKworCQkJIE92ZXJyaWRpbmcgbWVhbnMgdGhhdCB3ZSBhbHJlYWR5IHNhdyBhCisJCQkgZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbCBTSE9SVE5BTUUgaW4gYQorCQkJIHJlZ3VsYXIgb2JqZWN0LCBhbmQgaXQgaXMgb3ZlcnJpZGluZyB0aGUKKwkJCSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgZHluYW1pYyBvYmplY3QuCisKKwkJCSBXaGVuIHRoaXMgaGFwcGVucywgd2UgYWN0dWFsbHkgd2FudCB0byBjaGFuZ2UKKwkJCSBOQU1FLCB0aGUgc3ltYm9sIHdlIGp1c3QgYWRkZWQsIHRvIHJlZmVyIHRvCisJCQkgU0hPUlROQU1FLiAgVGhpcyB3aWxsIGNhdXNlIHJlZmVyZW5jZXMgdG8KKwkJCSBOQU1FIGluIHRoZSBzaGFyZWQgb2JqZWN0IHRvIGJlY29tZQorCQkJIHJlZmVyZW5jZXMgdG8gU0hPUlROQU1FIGluIHRoZSByZWd1bGFyCisJCQkgb2JqZWN0LiAgVGhpcyBpcyB3aGF0IHdlIGV4cGVjdCB3aGVuIHdlCisJCQkgb3ZlcnJpZGUgYSBmdW5jdGlvbiBpbiBhIHNoYXJlZCBvYmplY3Q6IHRoYXQKKwkJCSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc2hhcmVkIG9iamVjdCB3aWxsIGJlCisJCQkgbWFwcGVkIHRvIHRoZSBkZWZpbml0aW9uIGluIHRoZSByZWd1bGFyCisJCQkgb2JqZWN0LiAgKi8KKworCQkgICAgICB3aGlsZSAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0CisJCQkgICAgIHx8IGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQorCQkJaGkgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaGktPnJvb3QudS5pLmxpbms7CisKKwkJICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDsKKwkJICAgICAgaC0+cm9vdC51LmkubGluayA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoaTsKKwkJICAgICAgaWYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKQorCQkJeworCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOworCQkJICBoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOworCQkJICBpZiAoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAgICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKKwkJCQkgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKKwkJCSAgICB7CisJCQkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKKwkJCQkJCQkJCSBoaSkpCisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQkgICAgfQorCQkJfQorCisJCSAgICAgIC8qIE5vdyBzZXQgSEkgdG8gSCwgc28gdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHNldCB0aGUgb3RoZXIgZmllbGRzIGNvcnJlY3RseS4gICovCisJCSAgICAgIGhpID0gaDsKKwkJICAgIH0KKworCQkgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAorCQkgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuICBXZQorCQkgICAgIHdpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciB0byB0aGUgdXNlciBpbiB0aGF0CisJCSAgICAgY2FzZS4gICovCisKKwkJICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQorCQkgICAgeworCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHQ7CisKKwkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBiZWNhbWUgaW5kaXJlY3QsIHRoZW4gd2UgYXNzdW1lCisJCQkgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbiBiZWZvcmUuICAqLworCQkgICAgICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCQkgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCisJCQkJICAgICAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKKwkJCQkgID09IDApOworCisJCSAgICAgIGh0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGhpLT5yb290LnUuaS5saW5rOworCisJCSAgICAgIC8qIENvcHkgZG93biBhbnkgcmVmZXJlbmNlcyB0aGF0IHdlIG1heSBoYXZlCisJCQkgYWxyZWFkeSBzZWVuIHRvIHRoZSBzeW1ib2wgd2hpY2gganVzdCBiZWNhbWUKKwkJCSBpbmRpcmVjdC4gICovCisJCSAgICAgIGh0LT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9CisJCQkoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCSAmIChFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDCisJCQkgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCisJCQkgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspKTsKKworCQkgICAgICAvKiBDb3B5IG92ZXIgdGhlIGdsb2JhbCBhbmQgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKKwkJCSBvZmZzZXQgZW50cmllcy4gIFRoZXNlIG1heSBoYXZlIGJlZW4gYWxyZWFkeSBzZXQKKwkJCSB1cCBieSBhIGNoZWNrX3JlbG9jcyByb3V0aW5lLiAgKi8KKwkJICAgICAgaWYgKGh0LT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKKwkJCXsKKwkJCSAgaHQtPmdvdC5vZmZzZXQgPSBoaS0+Z290Lm9mZnNldDsKKwkJCSAgaGktPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisJCQl9CisJCSAgICAgIEJGRF9BU1NFUlQgKGhpLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7CisKKwkJICAgICAgaWYgKGh0LT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKKwkJCXsKKwkJCSAgaHQtPnBsdC5vZmZzZXQgPSBoaS0+cGx0Lm9mZnNldDsKKwkJCSAgaGktPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisJCQl9CisJCSAgICAgIEJGRF9BU1NFUlQgKGhpLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7CisKKwkJICAgICAgaWYgKGh0LT5keW5pbmR4ID09IC0xKQorCQkJeworCQkJICBodC0+ZHluaW5keCA9IGhpLT5keW5pbmR4OworCQkJICBodC0+ZHluc3RyX2luZGV4ID0gaGktPmR5bnN0cl9pbmRleDsKKwkJCSAgaGktPmR5bmluZHggPSAtMTsKKwkJCSAgaGktPmR5bnN0cl9pbmRleCA9IDA7CisJCQl9CisJCSAgICAgIEJGRF9BU1NFUlQgKGhpLT5keW5pbmR4ID09IC0xKTsKKworCQkgICAgICAvKiBGSVhNRTogVGhlcmUgbWF5IGJlIG90aGVyIGluZm9ybWF0aW9uIHRvIGNvcHkKKwkJCSBvdmVyIGZvciBwYXJ0aWN1bGFyIHRhcmdldHMuICAqLworCisJCSAgICAgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZSB0aGF0CisJCQkgdGhlIHN5bWJvbCBtdXN0IGJlIGR5bmFtaWMuICAqLworCQkgICAgICBpZiAoISBkeW5zeW0pCisJCQl7CisJCQkgIGlmICghIGR5bmFtaWMpCisJCQkgICAgeworCQkJICAgICAgaWYgKGluZm8tPnNoYXJlZAorCQkJCSAgfHwgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncworCQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpCisJCQkJICAgICAgIT0gMCkpCisJCQkJZHluc3ltID0gdHJ1ZTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwKQorCQkJCWR5bnN5bSA9IHRydWU7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCisJCSAgLyogV2UgYWxzbyBuZWVkIHRvIGRlZmluZSBhbiBpbmRpcmVjdGlvbiBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgbm9uZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICAqLworCisJCSAgc2hvcnRuYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKKwkJCQkJCSBzdHJsZW4gKG5hbWUpKTsKKwkJICBpZiAoc2hvcnRuYW1lID09IE5VTEwpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBzdHJuY3B5IChzaG9ydG5hbWUsIG5hbWUsIHAgLSBuYW1lKTsKKwkJICBzdHJjcHkgKHNob3J0bmFtZSArIChwIC0gbmFtZSksIHAgKyAxKTsKKworCQkgIC8qIE9uY2UgYWdhaW4sIG1lcmdlIHdpdGggYW55IGV4aXN0aW5nIHN5bWJvbC4gICovCisJCSAgdHlwZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKKwkJICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOworCQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIHNob3J0bmFtZSwgJnN5bSwgJnNlYywKKwkJCQkJICAmdmFsdWUsICZoaSwgJm92ZXJyaWRlLAorCQkJCQkgICZ0eXBlX2NoYW5nZV9vaywgJnNpemVfY2hhbmdlX29rKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgaWYgKG92ZXJyaWRlKQorCQkgICAgeworCQkgICAgICAvKiBIZXJlIFNIT1JUTkFNRSBpcyBhIHZlcnNpb25lZCBuYW1lLCBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGV4cGVjdCB0byBzZWUgdGhlIHR5cGUgb2Ygb3ZlcnJpZGUgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICBkbyBpbiB0aGUgY2FzZSBhYm92ZS4gICovCisJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJKF8oIiVzOiB3YXJuaW5nOiB1bmV4cGVjdGVkIHJlZGVmaW5pdGlvbiBvZiBgJXMnIiksCisJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNob3J0bmFtZSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkJCSAgICAgKGluZm8sIGFiZmQsIHNob3J0bmFtZSwgQlNGX0lORElSRUNULAorCQkJICAgICAgYmZkX2luZF9zZWN0aW9uX3B0ciwgKGJmZF92bWEpIDAsIG5hbWUsIGZhbHNlLAorCQkJICAgICAgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGkpKSkKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJCSAgICAgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuCisgICAgICAgICAgICAgICAgICAgICAgICAgV2Ugd2lsbCBoYXZlIHJlcG9ydGVkIGFuIGVycm9yIHRvIHRoZSB1c2VyIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYXNlLiAgKi8KKworCQkgICAgICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQorCQkJeworCQkJICAvKiBJZiB0aGUgc3ltYm9sIGJlY2FtZSBpbmRpcmVjdCwgdGhlbiB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUuICAqLworCQkJICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCQkgICAgICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQworCQkJCQkgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCisJCQkJICAgICAgPT0gMCk7CisKKwkJCSAgLyogQ29weSBkb3duIGFueSByZWZlcmVuY2VzIHRoYXQgd2UgbWF5IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBzZWVuIHRvIHRoZSBzeW1ib2wgd2hpY2gganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhbWUgaW5kaXJlY3QuICAqLworCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9CisJCQkgICAgKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkgICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMKKwkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKKwkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykpOworCisJCQkgIC8qIENvcHkgb3ZlciB0aGUgZ2xvYmFsIGFuZCBwcm9jZWR1cmUgbGlua2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSBvZmZzZXQgZW50cmllcy4gIFRoZXNlIG1heSBoYXZlIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBzZXQgdXAgYnkgYSBjaGVja19yZWxvY3Mgcm91dGluZS4gICovCisJCQkgIGlmIChoLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKKwkJCSAgICB7CisJCQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gaGktPmdvdC5vZmZzZXQ7CisJCQkgICAgICBoaS0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKKwkJCSAgICB9CisJCQkgIEJGRF9BU1NFUlQgKGhpLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7CisKKwkJCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQorCQkJICAgIHsKKwkJCSAgICAgIGgtPnBsdC5vZmZzZXQgPSBoaS0+cGx0Lm9mZnNldDsKKwkJCSAgICAgIGhpLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOworCQkJICAgIH0KKwkJCSAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKKworCQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwkJCSAgICB7CisJCQkgICAgICBoLT5keW5pbmR4ID0gaGktPmR5bmluZHg7CisJCQkgICAgICBoLT5keW5zdHJfaW5kZXggPSBoaS0+ZHluc3RyX2luZGV4OworCQkJICAgICAgaGktPmR5bmluZHggPSAtMTsKKwkJCSAgICAgIGhpLT5keW5zdHJfaW5kZXggPSAwOworCQkJICAgIH0KKwkJCSAgQkZEX0FTU0VSVCAoaGktPmR5bmluZHggPT0gLTEpOworCisJCQkgIC8qIEZJWE1FOiBUaGVyZSBtYXkgYmUgb3RoZXIgaW5mb3JtYXRpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBvdmVyIGZvciBwYXJ0aWN1bGFyIHRhcmdldHMuICAqLworCisJCQkgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBzeW1ib2wgbXVzdCBiZSBkeW5hbWljLiAgKi8KKwkJCSAgaWYgKCEgZHluc3ltKQorCQkJICAgIHsKKwkJCSAgICAgIGlmICghIGR5bmFtaWMpCisJCQkJeworCQkJCSAgaWYgKGluZm8tPnNoYXJlZAorCQkJCSAgICAgIHx8ICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKQorCQkJCQkgICE9IDApKQorCQkJCSAgICBkeW5zeW0gPSB0cnVlOworCQkJCX0KKwkJCSAgICAgIGVsc2UKKwkJCQl7CisJCQkJICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCisJCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMCkKKwkJCQkgICAgZHluc3ltID0gdHJ1ZTsKKwkJCQl9CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKGR5bnN5bSAmJiBoLT5keW5pbmR4ID09IC0xKQorCSAgICB7CisJICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCisJCSAgJiYgISBuZXdfd2Vha2RlZgorCQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCisJCXsKKwkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKKwkJCQkJCQkgICAgIGgtPndlYWtkZWYpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogTm93IHNldCB0aGUgd2Vha2RlZnMgZmllbGQgY29ycmVjdGx5IGZvciBhbGwgdGhlIHdlYWsgZGVmaW5lZAorICAgICBzeW1ib2xzIHdlIGZvdW5kLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2VhcmNoIGFsbCB0aGUKKyAgICAgc3ltYm9scy4gIFNpbmNlIHdlIG9ubHkgbmVlZCB0aGUgaW5mb3JtYXRpb24gZm9yIG5vbiBmdW5jdGlvbnMgaW4KKyAgICAgZHluYW1pYyBvYmplY3RzLCB0aGF0J3MgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24KKyAgICAgdGhlIGxpc3QgV0VBS1MuICBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gc28gdGhhdCBpZiBhIHJlZ3VsYXIKKyAgICAgb2JqZWN0IHJlZmVycyB0byBhIHN5bWJvbCBkZWZpbmVkIHdlYWtseSBpbiBhIGR5bmFtaWMgb2JqZWN0LCB0aGUKKyAgICAgcmVhbCBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgb2JqZWN0IGlzIGFsc28gcHV0IGluIHRoZSBkeW5hbWljCisgICAgIHN5bWJvbHM7IHdlIGFsc28gbXVzdCBhcnJhbmdlIGZvciBib3RoIHN5bWJvbHMgdG8gcG9pbnQgdG8gdGhlCisgICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uLiAgV2UgY291bGQgaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2Ugb2Ygc3ltYm9sCisgICAgIGFsaWFzaW5nLCBidXQgYSBnZW5lcmFsIHN5bWJvbCBhbGlhcyBjYW4gb25seSBiZSBnZW5lcmF0ZWQgaW4KKyAgICAgYXNzZW1ibGVyIGNvZGUsIGhhbmRsaW5nIGl0IGNvcnJlY3RseSB3b3VsZCBiZSB2ZXJ5IHRpbWUKKyAgICAgY29uc3VtaW5nLCBhbmQgb3RoZXIgRUxGIGxpbmtlcnMgZG9uJ3QgaGFuZGxlIGdlbmVyYWwgYWxpYXNpbmcKKyAgICAgZWl0aGVyLiAgKi8KKyAgd2hpbGUgKHdlYWtzICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhsb29rOworICAgICAgYXNlY3Rpb24gKnNsb29rOworICAgICAgYmZkX3ZtYSB2bG9vazsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqaHBwOworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHBlbmQ7CisKKyAgICAgIGhsb29rID0gd2Vha3M7CisgICAgICB3ZWFrcyA9IGhsb29rLT53ZWFrZGVmOworICAgICAgaGxvb2stPndlYWtkZWYgPSBOVUxMOworCisgICAgICBCRkRfQVNTRVJUIChobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisJCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgorCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7CisgICAgICBzbG9vayA9IGhsb29rLT5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICB2bG9vayA9IGhsb29rLT5yb290LnUuZGVmLnZhbHVlOworCisgICAgICBocHAgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7CisgICAgICBocHBlbmQgPSBocHAgKyBleHRzeW1jb3VudDsKKyAgICAgIGZvciAoOyBocHAgPCBocHBlbmQ7IGhwcCsrKQorCXsKKwkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBoID0gKmhwcDsKKwkgIGlmIChoICE9IE5VTEwgJiYgaCAhPSBobG9vaworCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2xvb2sKKwkgICAgICAmJiBoLT5yb290LnUuZGVmLnZhbHVlID09IHZsb29rKQorCSAgICB7CisJICAgICAgaGxvb2stPndlYWtkZWYgPSBoOworCisJICAgICAgLyogSWYgdGhlIHdlYWsgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCisJCSBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBwdXQgdGhlcmUKKwkJIGFzIHdlbGwuICAqLworCSAgICAgIGlmIChobG9vay0+ZHluaW5keCAhPSAtMQorCQkgICYmIGgtPmR5bmluZHggPT0gLTEpCisJCXsKKwkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCisgICAgICAgICAgICAgICAgIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgd2VhayBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQorICAgICAgICAgICAgICAgICBhcyB3ZWxsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB0aGUgZHluYW1pYworICAgICAgICAgICAgICAgICBsb2FkZXIgbWlnaHQgbm90IG1lcmdlIHRoZSBlbnRyaWVzIGZvciB0aGUgcmVhbAorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCB0aGUgd2VhayBkZWZpbml0aW9uLiAgKi8KKwkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQorCQkgICYmIGhsb29rLT5keW5pbmR4ID09IC0xKQorCQl7CisJCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGhsb29rKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGJ1Zik7CisgICAgICBidWYgPSBOVUxMOworICAgIH0KKworICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZXh0dmVyc3ltKTsKKyAgICAgIGV4dHZlcnN5bSA9IE5VTEw7CisgICAgfQorCisgIC8qIElmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IG9iamVjdCwgYW5kIGl0IGlzCisgICAgIG5vdCBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGxldCB0aGUgYmFja2VuZCBsb29rIHRocm91Z2ggdGhlCisgICAgIHJlbG9jcy4KKworICAgICBUaGlzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhbmQgdG8KKyAgICAgYXJyYW5nZSBmb3IgZHluYW1pYyByZWxvY3MuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZQorICAgICBwYXJ0aWN1bGFyIGNvbW1vbiBjYXNlIG9mIGxpbmtpbmcgbm9uIFBJQyBjb2RlLCBldmVuIHdoZW4gbGlua2luZworICAgICBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSBvZgorICAgICBrbm93aW5nIHdoZXRoZXIgYW4gb2JqZWN0IGZpbGUgaGFzIGJlZW4gY29tcGlsZWQgUElDIG9yIG5vdC4KKyAgICAgTG9va2luZyB0aHJvdWdoIHRoZSByZWxvY3MgaXMgbm90IHBhcnRpY3VsYXJseSB0aW1lIGNvbnN1bWluZy4KKyAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBtdXN0IGVpdGhlciAoMSkga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeSwKKyAgICAgd2hpY2ggY2F1c2VzIHRoZSBsaW5rZXIgdG8gcmVxdWlyZSBhZGRpdGlvbmFsIHJ1bnRpbWUgbWVtb3J5IG9yCisgICAgICgyKSByZWFkIHRoZSByZWxvY3MgdHdpY2UgZnJvbSB0aGUgaW5wdXQgZmlsZSwgd2hpY2ggd2FzdGVzIHRpbWUuCisgICAgIFRoaXMgd291bGQgYmUgYSBnb29kIGNhc2UgZm9yIHVzaW5nIG1tYXAuCisKKyAgICAgSSBoYXZlIG5vIGlkZWEgaG93IHRvIGhhbmRsZSBsaW5raW5nIFBJQyBjb2RlIGludG8gYSBmaWxlIG9mIGEKKyAgICAgZGlmZmVyZW50IGZvcm1hdC4gIEl0IHByb2JhYmx5IGNhbid0IGJlIGRvbmUuICAqLworICBjaGVja19yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNoZWNrX3JlbG9jczsKKyAgaWYgKCEgZHluYW1pYworICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCisgICAgICAmJiBjaGVja19yZWxvY3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqbzsKKworICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJeworCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKKwkgIGJvb2xlYW4gb2s7CisKKwkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKKwkgICAgICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCisJICAgICAgfHwgKChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIpCisJCSAgJiYgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKKwkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG8tPm91dHB1dF9zZWN0aW9uKSkKKwkgICAgY29udGludWU7CisKKwkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCisJCQkgICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAorCQkJICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCisJCQkgICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOworCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgb2sgPSAoKmNoZWNrX3JlbG9jcykgKGFiZmQsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7CisKKwkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQorCSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworCisJICBpZiAoISBvaykKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bworICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgdGhlIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KKyAgaWYgKCEgZHluYW1pYworICAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgICYmICEgaW5mby0+dHJhZGl0aW9uYWxfZm9ybWF0CisgICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyAgICAgICYmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfZGVidWdnZXIpKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzdGFiLCAqc3RhYnN0cjsKKworICAgICAgc3RhYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKKyAgICAgIGlmIChzdGFiICE9IE5VTEwpCisJeworCSAgc3RhYnN0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKKworCSAgaWYgKHN0YWJzdHIgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2VjZGF0YTsKKworCSAgICAgIHNlY2RhdGEgPSBlbGZfc2VjdGlvbl9kYXRhIChzdGFiKTsKKwkgICAgICBpZiAoISBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwKKwkJCQkJICAgICAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCisJCQkJCSAgICAgc3RhYiwgc3RhYnN0ciwKKwkJCQkJICAgICAmc2VjZGF0YS0+c3RhYl9pbmZvKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoYnVmICE9IE5VTEwpCisgICAgZnJlZSAoYnVmKTsKKyAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQorICAgIGZyZWUgKGR5bmJ1Zik7CisgIGlmIChkeW52ZXIgIT0gTlVMTCkKKyAgICBmcmVlIChkeW52ZXIpOworICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCisgICAgZnJlZSAoZXh0dmVyc3ltKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBDcmVhdGUgc29tZSBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGR5bmFtaWMgbGlua2luZworICAgaW5mb3JtYXRpb24uICBBQkZEIGlzIGFuIGlucHV0IGZpbGUgd2hpY2ggcmVxdWlyZXMgZHluYW1pYyBzZWN0aW9ucworICAgdG8gYmUgY3JlYXRlZC4gIFRoZSBkeW5hbWljIHNlY3Rpb25zIHRha2UgdXAgdmlydHVhbCBtZW1vcnkgc3BhY2UKKyAgIHdoZW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUgaXMgcnVuLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZQorICAgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgV2Ugd29yayBvdXQgdGhlCisgICBhY3R1YWwgY29udGVudHMgYW5kIHNpemUgb2YgdGhlc2Ugc2VjdGlvbnMgbGF0ZXIuICAqLworCitib29sZWFuCitlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKKworICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIGR5bmFtaWMgc2VjdGlvbnMgdXNlIHRoZSBzYW1lIGlucHV0IEJGRC4gICovCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQorICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKKyAgZWxzZQorICAgIGFiZmQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgZm9yIGFsbCBvZiB0aGVzZQorICAgICBzZWN0aW9ucy4gICovCisgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUworCSAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisKKyAgLyogQSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBoYXMgYSAuaW50ZXJwIHNlY3Rpb24sIGJ1dCBhCisgICAgIHNoYXJlZCBsaWJyYXJ5IGRvZXMgbm90LiAgKi8KKyAgaWYgKCEgaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmludGVycCIpOworICAgICAgaWYgKHMgPT0gTlVMTAorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIENyZWF0ZSBzZWN0aW9ucyB0byBob2xkIHZlcnNpb24gaW5mb3JtYXRpb25zLiAgVGhlc2UgYXJlIHJlbW92ZWQKKyAgICAgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4gICovCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX2QiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uIik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX3IiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOworICBpZiAocyA9PSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID0gZWxmX3N0cmluZ3RhYl9pbml0ICgpOworICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5hbWljIik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgc3BlY2lhbCBzeW1ib2wgX0RZTkFNSUMgaXMgYWx3YXlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlCisgICAgIC5keW5hbWljIHNlY3Rpb24uICBUaGlzIGNhbGwgb2NjdXJzIGJlZm9yZSB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUKKyAgICAgc3ltYm9scyBmb3IgYW55IGR5bmFtaWMgb2JqZWN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CisgICAgIG92ZXJyaWRpbmcgYSBkeW5hbWljIGRlZmluaXRpb24uICBXZSBjb3VsZCBzZXQgX0RZTkFNSUMgaW4gYQorICAgICBsaW5rZXIgc2NyaXB0LCBidXQgd2Ugb25seSB3YW50IHRvIGRlZmluZSBpdCBpZiB3ZSBhcmUsIGluIGZhY3QsCisgICAgIGNyZWF0aW5nIGEgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHRoZXJlCisgICAgIGlzIG5vIC5keW5hbWljIHNlY3Rpb24sIHNpbmNlIG9uIHNvbWUgRUxGIHBsYXRmb3JtcyB0aGUgc3RhcnQgdXAKKyAgICAgY29kZSBleGFtaW5lcyBpdCB0byBkZWNpZGUgaG93IHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3MuICAqLworICBoID0gTlVMTDsKKyAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJIChpbmZvLCBhYmZkLCAiX0RZTkFNSUMiLCBCU0ZfR0xPQkFMLCBzLCAoYmZkX3ZtYSkgMCwKKwkgIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCisJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworCisgIGlmIChpbmZvLT5zaGFyZWQKKyAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5oYXNoIik7CisgIGlmIChzID09IE5VTEwKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKKyAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBMZXQgdGhlIGJhY2tlbmQgY3JlYXRlIHRoZSByZXN0IG9mIHRoZSBzZWN0aW9ucy4gIFRoaXMgbGV0cyB0aGUKKyAgICAgYmFja2VuZCBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgVGhlIGJhY2tlbmQgd2lsbCBub3JtYWxseSBjcmVhdGUKKyAgICAgdGhlIC5nb3QgYW5kIC5wbHQgc2VjdGlvbnMuICAqLworICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7CisgIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucykgKGFiZmQsIGluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhbiBlbnRyeSB0byB0aGUgLmR5bmFtaWMgdGFibGUuICAqLworCitib29sZWFuCitlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkX3ZtYSB0YWc7CisgICAgIGJmZF92bWEgdmFsOworeworICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzOworICBzaXplX3QgbmV3c2l6ZTsKKyAgYmZkX2J5dGUgKm5ld2NvbnRlbnRzOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICBuZXdzaXplID0gcy0+X3Jhd19zaXplICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKTsKKyAgbmV3Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLCBuZXdzaXplKTsKKyAgaWYgKG5ld2NvbnRlbnRzID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGR5bi5kX3RhZyA9IHRhZzsKKyAgZHluLmRfdW4uZF92YWwgPSB2YWw7CisgIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwKKwkJICAgIChFbGZfRXh0ZXJuYWxfRHluICopIChuZXdjb250ZW50cyArIHMtPl9yYXdfc2l6ZSkpOworCisgIHMtPl9yYXdfc2l6ZSA9IG5ld3NpemU7CisgIHMtPmNvbnRlbnRzID0gbmV3Y29udGVudHM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisKKy8qIFJlYWQgYW5kIHN3YXAgdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgVGhleSBtYXkgaGF2ZSBiZWVuIGNhY2hlZC4KKyAgIElmIHRoZSBFWFRFUk5BTF9SRUxPQ1MgYW5kIElOVEVSTkFMX1JFTE9DUyBhcmd1bWVudHMgYXJlIG5vdCBOVUxMLAorICAgdGhleSBhcmUgdXNlZCBhcyBidWZmZXJzIHRvIHJlYWQgaW50by4gIFRoZXkgYXJlIGtub3duIHRvIGJlIGxhcmdlCisgICBlbm91Z2guICBJZiB0aGUgSU5URVJOQUxfUkVMT0NTIHJlbG9jcyBhcmd1bWVudCBpcyBOVUxMLCB0aGUgcmV0dXJuCisgICB2YWx1ZSBpcyBhbGxvY2F0ZWQgdXNpbmcgZWl0aGVyIG1hbGxvYyBvciBiZmRfYWxsb2MsIGFjY29yZGluZyB0bworICAgdGhlIEtFRVBfTUVNT1JZIGFyZ3VtZW50LiAgKi8KKworRWxmX0ludGVybmFsX1JlbGEgKgorTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKSAoYWJmZCwgbywgZXh0ZXJuYWxfcmVsb2NzLCBpbnRlcm5hbF9yZWxvY3MsCisJCQkJIGtlZXBfbWVtb3J5KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpvOworICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOworICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOworICAgICBib29sZWFuIGtlZXBfbWVtb3J5OworeworICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKKyAgUFRSIGFsbG9jMSA9IE5VTEw7CisgIEVsZl9JbnRlcm5hbF9SZWxhICphbGxvYzIgPSBOVUxMOworCisgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzICE9IE5VTEwpCisgICAgcmV0dXJuIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY3M7CisKKyAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKKworICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCisgICAgeworICAgICAgc2l6ZV90IHNpemU7CisKKyAgICAgIHNpemUgPSBvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpOworICAgICAgaWYgKGtlZXBfbWVtb3J5KQorCWludGVybmFsX3JlbG9jcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOworICAgICAgZWxzZQorCWludGVybmFsX3JlbG9jcyA9IGFsbG9jMiA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSBiZmRfbWFsbG9jIChzaXplKTsKKyAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFsbG9jMSA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9oZHItPnNoX3NpemUpOworICAgICAgaWYgKGFsbG9jMSA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gYWxsb2MxOworICAgIH0KKworICBpZiAoKGJmZF9zZWVrIChhYmZkLCByZWxfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIHJlbF9oZHItPnNoX3NpemUsIGFiZmQpCisJICAhPSByZWxfaGRyLT5zaF9zaXplKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICBGb3IgY29udmVuaWVuY2UsIHdlIGFsd2F5cyBwcm9kdWNlIGFuCisgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGFycmF5OyBpZiB0aGUgcmVsb2NzIGFyZSBSZWwsIHdlIHNldCB0aGUgYWRkZW5kCisgICAgIHRvIDAuICAqLworICBpZiAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQorICAgIHsKKyAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7CisgICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsZW5kOworICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOworCisgICAgICBlcmVsID0gKEVsZl9FeHRlcm5hbF9SZWwgKikgZXh0ZXJuYWxfcmVsb2NzOworICAgICAgZXJlbGVuZCA9IGVyZWwgKyBvLT5yZWxvY19jb3VudDsKKyAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOworICAgICAgZm9yICg7IGVyZWwgPCBlcmVsZW5kOyBlcmVsKyssIGlyZWxhKyspCisJeworCSAgRWxmX0ludGVybmFsX1JlbCBpcmVsOworCisJICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOworCSAgaXJlbGEtPnJfb2Zmc2V0ID0gaXJlbC5yX29mZnNldDsKKwkgIGlyZWxhLT5yX2luZm8gPSBpcmVsLnJfaW5mbzsKKwkgIGlyZWxhLT5yX2FkZGVuZCA9IDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKKyAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYWVuZDsKKyAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYTsKKworICAgICAgQkZEX0FTU0VSVCAocmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7CisKKyAgICAgIGVyZWxhID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIGV4dGVybmFsX3JlbG9jczsKKyAgICAgIGVyZWxhZW5kID0gZXJlbGEgKyBvLT5yZWxvY19jb3VudDsKKyAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOworICAgICAgZm9yICg7IGVyZWxhIDwgZXJlbGFlbmQ7IGVyZWxhKyssIGlyZWxhKyspCisJZWxmX3N3YXBfcmVsb2NhX2luIChhYmZkLCBlcmVsYSwgaXJlbGEpOworICAgIH0KKworICAvKiBDYWNoZSB0aGUgcmVzdWx0cyBmb3IgbmV4dCB0aW1lLCBpZiB3ZSBjYW4uICAqLworICBpZiAoa2VlcF9tZW1vcnkpCisgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKKworICBpZiAoYWxsb2MxICE9IE5VTEwpCisgICAgZnJlZSAoYWxsb2MxKTsKKworICAvKiBEb24ndCBmcmVlIGFsbG9jMiwgc2luY2UgaWYgaXQgd2FzIGFsbG9jYXRlZCB3ZSBhcmUgcGFzc2luZyBpdAorICAgICBiYWNrICh1bmRlciB0aGUgbmFtZSBvZiBpbnRlcm5hbF9yZWxvY3MpLiAgKi8KKworICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoYWxsb2MxICE9IE5VTEwpCisgICAgZnJlZSAoYWxsb2MxKTsKKyAgaWYgKGFsbG9jMiAhPSBOVUxMKQorICAgIGZyZWUgKGFsbG9jMik7CisgIHJldHVybiBOVUxMOworfQorDAorCisvKiBSZWNvcmQgYW4gYXNzaWdubWVudCB0byBhIHN5bWJvbCBtYWRlIGJ5IGEgbGlua2VyIHNjcmlwdC4gIFdlIG5lZWQKKyAgIHRoaXMgaW4gY2FzZSBzb21lIGR5bmFtaWMgb2JqZWN0IHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lLCBwcm92aWRlKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBib29sZWFuIHByb3ZpZGU7Cit7CisgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIHRydWUsIGZhbHNlKTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKKyAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOworCisgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCBhbmQgaXQgaXMKKyAgICAgY3VycmVudGx5IGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYnV0IG5vdCBieSBhIHJlZ3VsYXIKKyAgICAgb2JqZWN0LCB0aGVuIG1hcmsgaXQgYXMgdW5kZWZpbmVkIHNvIHRoYXQgdGhlIGdlbmVyaWMgbGlua2VyIHdpbGwKKyAgICAgZm9yY2UgdGhlIGNvcnJlY3QgdmFsdWUuICAqLworICBpZiAocHJvdmlkZQorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCisgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCBhbmQgaXQgaXMKKyAgICAgY3VycmVudGx5IGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYnV0IG5vdCBieSBhIHJlZ3VsYXIgb2JqZWN0LAorICAgICB0aGVuIGNsZWFyIG91dCBhbnkgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWNhdXNlIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUKKyAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkeW5hbWljIG9iamVjdCBhbnkgbW9yZS4gICovCisgIGlmICghcHJvdmlkZQorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCisgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisgICAgaC0+dmVyaW5mby52ZXJkZWYgPSBOVUxMOworCisgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKKyAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7CisKKyAgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCisJCQkJICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwCisgICAgICAgfHwgaW5mby0+c2hhcmVkKQorICAgICAgJiYgaC0+ZHluaW5keCA9PSAtMSkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwgYW5kIHdlIGtub3cgYSBjb3JyZXNwb25kaW5nCisJIHJlYWwgc3ltYm9sIGZyb20gdGhlIHNhbWUgZHluYW1pYyBvYmplY3QsIG1ha2Ugc3VyZSB0aGUgcmVhbAorCSBzeW1ib2wgaXMgYWxzbyBtYWRlIGludG8gYSBkeW5hbWljIHN5bWJvbC4gICovCisgICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCisJICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQorCXsKKwkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoLT53ZWFrZGVmKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KKyAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbi4gICovCisKK3N0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8KK3sKKyAgLyogT3V0cHV0IEJGRC4gICovCisgIGJmZCAqb3V0cHV0X2JmZDsKKyAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgIC8qIFZlcnNpb24gdHJlZS4gICovCisgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyZGVmczsKKyAgLyogV2hldGhlciB3ZSBhcmUgZXhwb3J0aW5nIGFsbCBkeW5hbWljIHN5bWJvbHMuICAqLworICBib29sZWFuIGV4cG9ydF9keW5hbWljOworICAvKiBXaGV0aGVyIHdlIHJlbW92ZWQgYW55IHN5bWJvbHMgZnJvbSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLworICBib29sZWFuIHJlbW92ZWRfZHluYW1pYzsKKyAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KKyAgYm9vbGVhbiBmYWlsZWQ7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KKyAgIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMuICAqLworCitzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8KK3sKKyAgLyogT3V0cHV0IEJGRC4gICovCisgIGJmZCAqb3V0cHV0X2JmZDsKKyAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgIC8qIFRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzLiAgKi8KKyAgdW5zaWduZWQgaW50IHZlcnM7CisgIC8qIFdoZXRoZXIgd2UgaGFkIGEgZmFpbHVyZS4gICovCisgIGJvb2xlYW4gZmFpbGVkOworfTsKKworLyogQXJyYXkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBoYXNoIHRhYmxlIGJ1Y2tldHMgdG8gdXNlCisgICBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdGhlcmUgYXJlLiAgSWYgdGhlcmUgYXJlIGZld2VyIHRoYW4KKyAgIDMgc3ltYm9scyB3ZSB1c2UgMSBidWNrZXQsIGZld2VyIHRoYW4gMTcgc3ltYm9scyB3ZSB1c2UgMyBidWNrZXRzLAorICAgZmV3ZXIgdGhhbiAzNyB3ZSB1c2UgMTcgYnVja2V0cywgYW5kIHNvIGZvcnRoLiAgV2UgbmV2ZXIgdXNlIG1vcmUKKyAgIHRoYW4gMzI3NzEgYnVja2V0cy4gICovCisKK3N0YXRpYyBjb25zdCBzaXplX3QgZWxmX2J1Y2tldHNbXSA9Cit7CisgIDEsIDMsIDE3LCAzNywgNjcsIDk3LCAxMzEsIDE5NywgMjYzLCA1MjEsIDEwMzEsIDIwNTMsIDQwOTksIDgyMDksCisgIDE2NDExLCAzMjc3MSwgMAorfTsKKworLyogQ29tcHV0ZSBidWNrZXQgY291bnQgZm9yIGhhc2hpbmcgdGFibGUuICBXZSBkbyBub3QgdXNlIGEgc3RhdGljIHNldAorICAgb2YgcG9zc2libGUgdGFibGVzIHNpemVzIGFueW1vcmUuICBJbnN0ZWFkIHdlIGRldGVybWluZSBmb3IgYWxsCisgICBwb3NzaWJsZSByZWFzb25hYmxlIHNpemVzIG9mIHRoZSB0YWJsZSB0aGUgb3V0Y29tZSAoaS5lLiwgdGhlCisgICBudW1iZXIgb2YgY29sbGlzaW9ucyBldGMpIGFuZCBjaG9vc2UgdGhlIGJlc3Qgc29sdXRpb24uICBUaGUKKyAgIHdlaWdodGluZyBmdW5jdGlvbnMgYXJlIG5vdCB0b28gc2ltcGxlIHRvIGFsbG93IHRoZSB0YWJsZSB0byBncm93CisgICB3aXRob3V0IGJvdW5kcy4gIEluc3RlYWQgb25lIG9mIHRoZSB3ZWlnaHRpbmcgZmFjdG9ycyBpcyB0aGUgc2l6ZS4KKyAgIFRoZXJlZm9yZSB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGdvb2QgcGF5b2ZmIGJldHdlZW4gZmV3IGNvbGxpc2lvbnMKKyAgICg9IHNob3J0IGNoYWluIGxlbmd0aHMpIGFuZCB0YWJsZSBzaXplLiAgKi8KK3N0YXRpYyBzaXplX3QKK2NvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgc2l6ZV90IGR5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKKyAgc2l6ZV90IGJlc3Rfc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2RlczsKKyAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2Rlc3A7CisgIHVuc2lnbmVkIGxvbmcgaW50IGk7CisKKyAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCBleHBvcnRlZCBzeW1ib2xzLiAgQXQgdGhlIHNhbWUKKyAgICAgdGltZSBzdG9yZSB0aGUgdmFsdWVzIGluIGFuIGFycmF5IHNvIHRoYXQgd2UgY291bGQgdXNlIHRoZW0gZm9yCisgICAgIG9wdGltaXphdGlvbnMuICAqLworICBoYXNoY29kZXMgPSAodW5zaWduZWQgbG9uZyBpbnQgKikgYmZkX21hbGxvYyAoZHluc3ltY291bnQKKwkJCQkJCSogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOworICBpZiAoaGFzaGNvZGVzID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGhhc2hjb2Rlc3AgPSBoYXNoY29kZXM7CisKKyAgLyogUHV0IGFsbCBoYXNoIHZhbHVlcyBpbiBIQVNIQ09ERVMuICAqLworICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkgIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMsICZoYXNoY29kZXNwKTsKKworLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZS4gIFRoZSBmb2xsb3dpbmcgY29kZSB0byBvcHRpbWl6ZSB0aGUgdGFibGUKKyAgIHNpemUgcmVxdWlyZXMgYW4gaW50ZWdlciB0eXBlIHdpdGggbW9yZSB0aGUgMzIgYml0cy4gIElmCisgICBCRkRfSE9TVF9VXzY0X0JJVCBpcyBzZXQgd2Uga25vdyBhYm91dCBzdWNoIGEgdHlwZS4gICovCisjaWZkZWYgQkZEX0hPU1RfVV82NF9CSVQKKyAgaWYgKGluZm8tPm9wdGltaXplID09IHRydWUpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbnN5bXMgPSBoYXNoY29kZXNwIC0gaGFzaGNvZGVzOworICAgICAgc2l6ZV90IG1pbnNpemU7CisgICAgICBzaXplX3QgbWF4c2l6ZTsKKyAgICAgIEJGRF9IT1NUX1VfNjRfQklUIGJlc3RfY2hsZW4gPSB+KChCRkRfSE9TVF9VXzY0X0JJVCkgMCk7CisgICAgICB1bnNpZ25lZCBsb25nIGludCAqY291bnRzIDsKKworICAgICAgLyogUG9zc2libGUgb3B0aW1pemF0aW9uIHBhcmFtZXRlcnM6IGlmIHdlIGhhdmUgTlNZTVMgc3ltYm9scyB3ZSBzYXkKKwkgdGhhdCB0aGUgaGFzaGluZyB0YWJsZSBtdXN0IGF0IGxlYXN0IGhhdmUgTlNZTVMvNCBhbmQgYXQgbW9zdAorCSAyKk5TWU1TIGJ1Y2tldHMuICAqLworICAgICAgbWluc2l6ZSA9IG5zeW1zIC8gNDsKKyAgICAgIGlmIChtaW5zaXplID09IDApCisJbWluc2l6ZSA9IDE7CisgICAgICBiZXN0X3NpemUgPSBtYXhzaXplID0gbnN5bXMgKiAyOworCisgICAgICAvKiBDcmVhdGUgYXJyYXkgd2hlcmUgd2UgY291bnQgdGhlIGNvbGxpc2lvbnMgaW4uICBXZSBtdXN0IHVzZSBiZmRfbWFsbG9jCisJIHNpbmNlIHRoZSBzaXplIGNvdWxkIGJlIGxhcmdlLiAgKi8KKyAgICAgIGNvdW50cyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChtYXhzaXplCisJCQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7CisgICAgICBpZiAoY291bnRzID09IE5VTEwpCisJeworCSAgZnJlZSAoaGFzaGNvZGVzKTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogQ29tcHV0ZSB0aGUgIm9wdGltYWwiIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGNyaXRlcmlhIGlzIGEKKwkgbWluaW1hbCBjaGFpbiBsZW5ndGguICBUaGUgbWlub3IgY3JpdGVyaWEgaXMgKG9mIGNvdXJzZSkgdGhlIHNpemUKKwkgb2YgdGhlIHRhYmxlLiAgKi8KKyAgICAgIGZvciAoaSA9IG1pbnNpemU7IGkgPCBtYXhzaXplOyArK2kpCisJeworCSAgLyogV2FsayB0aHJvdWdoIHRoZSBhcnJheSBvZiBoYXNoY29kZXMgYW5kIGNvdW50IHRoZSBjb2xsaXNpb25zLiAgKi8KKwkgIEJGRF9IT1NUX1VfNjRfQklUIG1heDsKKwkgIHVuc2lnbmVkIGxvbmcgaW50IGo7CisJICB1bnNpZ25lZCBsb25nIGludCBmYWN0OworCisJICBtZW1zZXQgKGNvdW50cywgJ1wwJywgaSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKKworCSAgLyogRGV0ZXJtaW5lIGhvdyBvZnRlbiBlYWNoIGhhc2ggYnVja2V0IGlzIHVzZWQuICAqLworCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyArK2opCisJICAgICsrY291bnRzW2hhc2hjb2Rlc1tqXSAlIGldOworCisJICAvKiBGb3IgdGhlIHdlaWdodCBmdW5jdGlvbiB3ZSBuZWVkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisJICAgICBwYWdlc2l6ZSBvbiB0aGUgdGFyZ2V0LiAgVGhpcyBpcyBpbmZvcm1hdGlvbiBuZWVkIG5vdCBiZSAxMDAlCisJICAgICBhY2N1cmF0ZS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAoc28gZmFyKSB3ZQorCSAgICAgZGVmaW5lIGl0IGhlcmUgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiBpdCBpcyBjcnVjaWFsCisJICAgICB0byBoYXZlIGEgYmV0dGVyIHZhbHVlIHNvbWUgZGF5IHNpbXBseSBkZWZpbmUgdGhpcyB2YWx1ZS4gICovCisjIGlmbmRlZiBCRkRfVEFSR0VUX1BBR0VTSVpFCisjICBkZWZpbmUgQkZEX1RBUkdFVF9QQUdFU0laRQkoNDA5NikKKyMgZW5kaWYKKworCSAgLyogV2UgaW4gYW55IGNhc2UgbmVlZCAyICsgTlNZTVMgZW50cmllcyBmb3IgdGhlIHNpemUgdmFsdWVzIGFuZAorCSAgICAgdGhlIGNoYWlucy4gICovCisJICBtYXggPSAoMiArIG5zeW1zKSAqIChBUkNIX1NJWkUgLyA4KTsKKworIyBpZiAxCisJICAvKiBWYXJpYW50IDE6IG9wdGltaXplIGZvciBzaG9ydCBjaGFpbnMuICBXZSBhZGQgdGhlIHNxdWFyZXMKKwkgICAgIG9mIGFsbCB0aGUgY2hhaW4gbGVuZ3RocyAod2hpY2ggZmF2b3VzIG1hbnkgc21hbGwgY2hhaW4KKwkgICAgIG92ZXIgYSBmZXcgbG9uZyBjaGFpbnMpLiAgKi8KKwkgIGZvciAoaiA9IDA7IGogPCBpOyArK2opCisJICAgIG1heCArPSBjb3VudHNbal0gKiBjb3VudHNbal07CisKKwkgIC8qIFRoaXMgYWRkcyBwZW5hbHRpZXMgZm9yIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIHRhYmxlLiAgKi8KKwkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKKwkgIG1heCAqPSBmYWN0ICogZmFjdDsKKyMgZWxzZQorCSAgLyogVmFyaWFudCAyOiBPcHRpbWl6ZSBhIGxvdCBtb3JlIGZvciBzbWFsbCB0YWJsZS4gIEhlcmUgd2UKKwkgICAgIGFsc28gYWRkIHNxdWFyZXMgb2YgdGhlIHNpemUgYnV0IHdlIGFsc28gYWRkIHBlbmFsdGllcyBmb3IKKwkgICAgIGVtcHR5IHNsb3RzICh0aGUgKzEgdGVybSkuICAqLworCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKKwkgICAgbWF4ICs9ICgxICsgY291bnRzW2pdKSAqICgxICsgY291bnRzW2pdKTsKKworCSAgLyogVGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUgaXMgY29uc2lkZXJlZCwgYnV0IG5vdCBhcworCSAgICAgc3Ryb25nIGFzIGluIHZhcmlhbnQgMSwgd2hlcmUgaXQgaXMgc3F1YXJlZC4gICovCisJICBmYWN0ID0gaSAvIChCRkRfVEFSR0VUX1BBR0VTSVpFIC8gKEFSQ0hfU0laRSAvIDgpKSArIDE7CisJICBtYXggKj0gZmFjdDsKKyMgZW5kaWYKKworCSAgLyogQ29tcGFyZSB3aXRoIGN1cnJlbnQgYmVzdCByZXN1bHRzLiAgKi8KKwkgIGlmIChtYXggPCBiZXN0X2NobGVuKQorCSAgICB7CisJICAgICAgYmVzdF9jaGxlbiA9IG1heDsKKwkgICAgICBiZXN0X3NpemUgPSBpOworCSAgICB9CisJfQorCisgICAgICBmcmVlIChjb3VudHMpOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9IT1NUX1VfNjRfQklUKSAqLworICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNvbHV0aW9uIGlmIG5vIDY0Yml0IHR5cGUgaXMgYXZhaWxhYmxlIG9yIGlmIHdlCisJIGFyZSBub3Qgc3VwcG9zZWQgdG8gc3BlbmQgbXVjaCB0aW1lIG9uIG9wdGltaXphdGlvbnMuICBXZSBzZWxlY3QgdGhlCisJIGJ1Y2tldCBjb3VudCB1c2luZyBhIGZpeGVkIHNldCBvZiBudW1iZXJzLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGVsZl9idWNrZXRzW2ldICE9IDA7IGkrKykKKwl7CisJICBiZXN0X3NpemUgPSBlbGZfYnVja2V0c1tpXTsKKwkgIGlmIChkeW5zeW1jb3VudCA8IGVsZl9idWNrZXRzW2kgKyAxXSkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBGcmVlIHRoZSBhcnJheXMgd2UgbmVlZGVkLiAgKi8KKyAgZnJlZSAoaGFzaGNvZGVzKTsKKworICByZXR1cm4gYmVzdF9zaXplOworfQorCisvKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgRUxGIGR5bmFtaWMgc2VjdGlvbnMuICBUaGlzIGlzCisgICBjYWxsZWQgYnkgdGhlIEVMRiBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZQorICAgbXVzdCBzZXQgdGhlIHNpemVzIG9mIHRoZSBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZQorICAgYWRkcmVzc2VzIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgKi8KKworYm9vbGVhbgorTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykgKG91dHB1dF9iZmQsIHNvbmFtZSwgcnBhdGgsCisJCQkJICAgICBleHBvcnRfZHluYW1pYywgZmlsdGVyX3NobGliLAorCQkJCSAgICAgYXV4aWxpYXJ5X2ZpbHRlcnMsIGluZm8sIHNpbnRlcnBwdHIsCisJCQkJICAgICB2ZXJkZWZzKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKKyAgICAgY29uc3QgY2hhciAqcnBhdGg7CisgICAgIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7CisgICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9zaGxpYjsKKyAgICAgY29uc3QgY2hhciAqIGNvbnN0ICphdXhpbGlhcnlfZmlsdGVyczsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICoqc2ludGVycHB0cjsKKyAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOworeworICBiZmRfc2l6ZV90eXBlIHNvbmFtZV9pbmR4OworICBiZmQgKmR5bm9iajsKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKKyAgYmZkX3NpemVfdHlwZSBvbGRfZHluc3ltY291bnQ7CisgIHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gYXN2aW5mbzsKKworICAqc2ludGVycHB0ciA9IE5VTEw7CisKKyAgc29uYW1lX2luZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7CisKKyAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBUaGUgYmFja2VuZCBtYXkgaGF2ZSB0byBjcmVhdGUgc29tZSBzZWN0aW9ucyByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICAgd2UncmUgZHluYW1pYyBvciBub3QuICAqLworICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAob3V0cHV0X2JmZCk7CisgIGlmIChiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zCisgICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucykgKG91dHB1dF9iZmQsIGluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICAvKiBJZiB0aGVyZSB3ZXJlIG5vIGR5bmFtaWMgb2JqZWN0cyBpbiB0aGUgbGluaywgdGhlcmUgaXMgbm90aGluZyB0bworICAgICBkbyBoZXJlLiAgKi8KKyAgaWYgKGR5bm9iaiA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHdlIGFyZSBzdXBwb3NlZCB0byBleHBvcnQgYWxsIHN5bWJvbHMgaW50byB0aGUgZHluYW1pYyBzeW1ib2wKKyAgICAgdGFibGUgKHRoaXMgaXMgbm90IHRoZSBub3JtYWwgY2FzZSksIHRoZW4gZG8gc28uICAqLworICBpZiAoZXhwb3J0X2R5bmFtaWMpCisgICAgeworICAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCBlaWY7CisKKyAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKKyAgICAgIGVpZi5pbmZvID0gaW5mbzsKKyAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2V4cG9ydF9zeW1ib2wsCisJCQkgICAgICAoUFRSKSAmZWlmKTsKKyAgICAgIGlmIChlaWYuZmFpbGVkKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOworICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBiZmRfc2l6ZV90eXBlIHN0cnNpemU7CisKKyAgICAgICpzaW50ZXJwcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKKyAgICAgIEJGRF9BU1NFUlQgKCpzaW50ZXJwcHRyICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKTsKKworICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMKQorCXsKKwkgIHNvbmFtZV9pbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKKwkJCQkJICAgIHNvbmFtZSwgdHJ1ZSwgdHJ1ZSk7CisJICBpZiAoc29uYW1lX2luZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCisJICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NPTkFNRSwgc29uYW1lX2luZHgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoaW5mby0+c3ltYm9saWMpCisJeworCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1CT0xJQywgMCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChycGF0aCAhPSBOVUxMKQorCXsKKwkgIGJmZF9zaXplX3R5cGUgaW5keDsKKworCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIHJwYXRoLAorCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7CisJICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKKwkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUlBBVEgsIGluZHgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoZmlsdGVyX3NobGliICE9IE5VTEwpCisJeworCSAgYmZkX3NpemVfdHlwZSBpbmR4OworCisJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKKwkJCQkgICAgIGZpbHRlcl9zaGxpYiwgdHJ1ZSwgdHJ1ZSk7CisJICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKKwkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklMVEVSLCBpbmR4KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGF1eGlsaWFyeV9maWx0ZXJzICE9IE5VTEwpCisJeworCSAgY29uc3QgY2hhciAqIGNvbnN0ICpwOworCisJICBmb3IgKHAgPSBhdXhpbGlhcnlfZmlsdGVyczsgKnAgIT0gTlVMTDsgcCsrKQorCSAgICB7CisJICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OworCisJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCisJCQkJCSAqcCwgdHJ1ZSwgdHJ1ZSk7CisJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCisJCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0FVWElMSUFSWSwgaW5keCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgLyogQXR0YWNoIGFsbCB0aGUgc3ltYm9scyB0byB0aGVpciB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIGFzdmluZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7CisgICAgICBhc3ZpbmZvLmluZm8gPSBpbmZvOworICAgICAgYXN2aW5mby52ZXJkZWZzID0gdmVyZGVmczsKKyAgICAgIGFzdmluZm8uZXhwb3J0X2R5bmFtaWMgPSBleHBvcnRfZHluYW1pYzsKKyAgICAgIGFzdmluZm8ucmVtb3ZlZF9keW5hbWljID0gZmFsc2U7CisgICAgICBhc3ZpbmZvLmZhaWxlZCA9IGZhbHNlOworCisgICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkgICAgICBlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24sCisJCQkgICAgICAoUFRSKSAmYXN2aW5mbyk7CisgICAgICBpZiAoYXN2aW5mby5mYWlsZWQpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFuZCBtYWtlCisJIHRoZSBiYWNrZW5kIHBpY2sgYSByZWFzb25hYmxlIHZhbHVlIGZvciB0aGVtLiAgKi8KKyAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKKyAgICAgIGVpZi5pbmZvID0gaW5mbzsKKyAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsCisJCQkgICAgICAoUFRSKSAmZWlmKTsKKyAgICAgIGlmIChlaWYuZmFpbGVkKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gc29tZSBvZiB0aGUKKwkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfYmZkX2ZpbmFsX2xpbmssIGJ1dCB3ZSBtdXN0IGFkZCB0aGUgZW50cmllcworCSBub3cgc28gdGhhdCB3ZSBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgKi8KKyAgICAgIGggPSAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgIl9pbml0IiwgZmFsc2UsCisJCQkJZmFsc2UsIGZhbHNlKTsKKyAgICAgIGlmIChoICE9IE5VTEwKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKKwkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKKwl7CisJICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0lOSVQsIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaCA9ICBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAiX2ZpbmkiLCBmYWxzZSwKKwkJCQkgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGlmIChoICE9IE5VTEwKKwkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKKwkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKKwl7CisJICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0ZJTkksIDApKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgc3Ryc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKKyAgICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSEFTSCwgMCkKKwkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TVFJUQUIsIDApCisJICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNVEFCLCAwKQorCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlNaLCBzdHJzaXplKQorCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NZTUVOVCwKKwkJCQkgICAgICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFRoZSBiYWNrZW5kIG11c3Qgd29yayBvdXQgdGhlIHNpemVzIG9mIGFsbCB0aGUgb3RoZXIgZHluYW1pYworICAgICBzZWN0aW9ucy4gICovCisgIG9sZF9keW5zeW1jb3VudCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7CisgIGlmIChiZWQtPmVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucworICAgICAgJiYgISAoKmJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKSAob3V0cHV0X2JmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKKyAgICB7CisgICAgICBzaXplX3QgZHluc3ltY291bnQ7CisgICAgICBhc2VjdGlvbiAqczsKKyAgICAgIHNpemVfdCBidWNrZXRjb3VudCA9IDA7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07CisKKyAgICAgIC8qIFNldCB1cCB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb25fZCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBhZGRpdGlvbmFsIHZlcnNpb24gZGVmaW5pdGlvbnMgaWYgd2UgYXJlCisgICAgICAgICBqdXN0IGxpbmtpbmcgYSByZWd1bGFyIGFwcGxpY2F0aW9uLiAgKi8KKyAgICAgIHZlcmRlZnMgPSBhc3ZpbmZvLnZlcmRlZnM7CisKKyAgICAgIGlmICh2ZXJkZWZzID09IE5VTEwpCisJeworCSAgYXNlY3Rpb24gKipzcHA7CisKKwkgIC8qIERvbid0IGluY2x1ZGUgdGhpcyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisJICBmb3IgKHNwcCA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsKKwkgICAgICAgKnNwcCAhPSBzLT5vdXRwdXRfc2VjdGlvbjsKKwkgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dCkKKwkgICAgOworCSAgKnNwcCA9IHMtPm91dHB1dF9zZWN0aW9uLT5uZXh0OworCSAgLS1vdXRwdXRfYmZkLT5zZWN0aW9uX2NvdW50OworCX0KKyAgICAgIGVsc2UKKwl7CisJICB1bnNpZ25lZCBpbnQgY2RlZnM7CisJICBiZmRfc2l6ZV90eXBlIHNpemU7CisJICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7CisJICBiZmRfYnl0ZSAqcDsKKwkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgZGVmOworCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggZGVmYXV4OworCisJICBpZiAoYXN2aW5mby5yZW1vdmVkX2R5bmFtaWMpCisJICAgIHsKKwkgICAgICAvKiBTb21lIGR5bmFtaWMgc3ltYm9scyB3ZXJlIGNoYW5nZWQgdG8gYmUgbG9jYWwKKwkJIHN5bWJvbHMuICBJbiB0aGlzIGNhc2UsIHdlIHJlbnVtYmVyIGFsbCBvZiB0aGUKKwkJIGR5bmFtaWMgc3ltYm9scywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIGEgaG9sZS4gIElmCisJCSB0aGUgYmFja2VuZCBjaGFuZ2VkIGR5bnN5bWNvdW50LCB0aGVuIGFzc3VtZSB0aGF0IHRoZQorCQkgbmV3IHN5bWJvbHMgYXJlIGF0IHRoZSBzdGFydC4gIFRoaXMgaXMgdGhlIGNhc2Ugb24KKwkJIHRoZSBNSVBTLiAgRklYTUU6IFRoZSBuYW1lcyBvZiB0aGUgcmVtb3ZlZCBzeW1ib2xzCisJCSB3aWxsIHN0aWxsIGJlIGluIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZSwgd2FzdGluZworCQkgc3BhY2UuICAqLworCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPQorCQkxICsgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgLSBvbGRfZHluc3ltY291bnQpOworCSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkgICAgICBlbGZfbGlua19yZW51bWJlcl9keW5zeW1zLAorCQkJCSAgICAgIChQVFIpIGluZm8pOworCSAgICB9CisKKwkgIGNkZWZzID0gMDsKKwkgIHNpemUgPSAwOworCisJICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgYmFzZSB2ZXJzaW9uLiAgKi8KKwkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKKwkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7CisJICArK2NkZWZzOworCisJICBmb3IgKHQgPSB2ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQorCSAgICB7CisJICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpuOworCisJICAgICAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOworCSAgICAgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7CisJICAgICAgKytjZGVmczsKKworCSAgICAgIGZvciAobiA9IHQtPmRlcHM7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCisJCXNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7CisJICAgIH0KKworCSAgcy0+X3Jhd19zaXplID0gc2l6ZTsKKwkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKKwkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIC8qIEZpbGwgaW4gdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KKworCSAgcCA9IHMtPmNvbnRlbnRzOworCisJICBkZWYudmRfdmVyc2lvbiA9IFZFUl9ERUZfQ1VSUkVOVDsKKwkgIGRlZi52ZF9mbGFncyA9IFZFUl9GTEdfQkFTRTsKKwkgIGRlZi52ZF9uZHggPSAxOworCSAgZGVmLnZkX2NudCA9IDE7CisJICBkZWYudmRfYXV4ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKKwkgIGRlZi52ZF9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZikKKwkJCSArIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpKTsKKworCSAgaWYgKHNvbmFtZV9pbmR4ICE9IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkgICAgeworCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzb25hbWUpOworCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IHNvbmFtZV9pbmR4OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKKworCSAgICAgIG5hbWUgPSBvdXRwdXRfYmZkLT5maWxlbmFtZTsKKwkgICAgICBkZWYudmRfaGFzaCA9IGJmZF9lbGZfaGFzaCAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZSk7CisJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCisJCQkJCSAgICBuYW1lLCB0cnVlLCBmYWxzZSk7CisJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgZGVmYXV4LnZkYV9uYW1lID0gaW5keDsKKwkgICAgfQorCSAgZGVmYXV4LnZkYV9uZXh0ID0gMDsKKworCSAgX2JmZF9lbGZfc3dhcF92ZXJkZWZfb3V0IChvdXRwdXRfYmZkLCAmZGVmLAorCQkJCSAgICAoRWxmX0V4dGVybmFsX1ZlcmRlZiAqKXApOworCSAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOworCSAgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCAob3V0cHV0X2JmZCwgJmRlZmF1eCwKKwkJCQkgICAgIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSBwKTsKKwkgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7CisKKwkgIGZvciAodCA9IHZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBpbnQgY2RlcHM7CisJICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpuOworCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAgICAgY2RlcHMgPSAwOworCSAgICAgIGZvciAobiA9IHQtPmRlcHM7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCisJCSsrY2RlcHM7CisKKwkgICAgICAvKiBBZGQgYSBzeW1ib2wgcmVwcmVzZW50aW5nIHRoaXMgdmVyc2lvbi4gICovCisJICAgICAgaCA9IE5VTEw7CisJICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJCSAgICAgKGluZm8sIGR5bm9iaiwgdC0+bmFtZSwgQlNGX0dMT0JBTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwKKwkJICAgICAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAorCQkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZHlub2JqKS0+Y29sbGVjdCwKKwkJICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+IEVMRl9MSU5LX05PTl9FTEY7CisJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOworCSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOworCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7CisKKwkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIGRlZi52ZF92ZXJzaW9uID0gVkVSX0RFRl9DVVJSRU5UOworCSAgICAgIGRlZi52ZF9mbGFncyA9IDA7CisJICAgICAgaWYgKHQtPmdsb2JhbHMgPT0gTlVMTCAmJiB0LT5sb2NhbHMgPT0gTlVMTCAmJiAhIHQtPnVzZWQpCisJCWRlZi52ZF9mbGFncyB8PSBWRVJfRkxHX1dFQUs7CisJICAgICAgZGVmLnZkX25keCA9IHQtPnZlcm51bSArIDE7CisJICAgICAgZGVmLnZkX2NudCA9IGNkZXBzICsgMTsKKwkgICAgICBkZWYudmRfaGFzaCA9IGJmZF9lbGZfaGFzaCAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdC0+bmFtZSk7CisJICAgICAgZGVmLnZkX2F1eCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7CisJICAgICAgaWYgKHQtPm5leHQgIT0gTlVMTCkKKwkJZGVmLnZkX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKQorCQkJICAgICAgICsgKGNkZXBzICsgMSkgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KSk7CisJICAgICAgZWxzZQorCQlkZWYudmRfbmV4dCA9IDA7CisKKwkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKG91dHB1dF9iZmQsICZkZWYsCisJCQkJCShFbGZfRXh0ZXJuYWxfVmVyZGVmICopIHApOworCSAgICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKKworCSAgICAgIGRlZmF1eC52ZGFfbmFtZSA9IGgtPmR5bnN0cl9pbmRleDsKKwkgICAgICBpZiAodC0+ZGVwcyA9PSBOVUxMKQorCQlkZWZhdXgudmRhX25leHQgPSAwOworCSAgICAgIGVsc2UKKwkJZGVmYXV4LnZkYV9uZXh0ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7CisJICAgICAgdC0+bmFtZV9pbmR4ID0gZGVmYXV4LnZkYV9uYW1lOworCisJICAgICAgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCAob3V0cHV0X2JmZCwgJmRlZmF1eCwKKwkJCQkJIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSBwKTsKKwkgICAgICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOworCisJICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKKwkJeworCQkgIGlmIChuLT52ZXJzaW9uX25lZWRlZCA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZQorCQkJIHZlcnNpb24gc2NyaXB0LiAgKi8KKwkJICAgICAgZGVmYXV4LnZkYV9uYW1lID0gMDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBkZWZhdXgudmRhX25hbWUgPSBuLT52ZXJzaW9uX25lZWRlZC0+bmFtZV9pbmR4OworCQkgIGlmIChuLT5uZXh0ID09IE5VTEwpCisJCSAgICBkZWZhdXgudmRhX25leHQgPSAwOworCQkgIGVsc2UKKwkJICAgIGRlZmF1eC52ZGFfbmV4dCA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOworCisJCSAgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCAob3V0cHV0X2JmZCwgJmRlZmF1eCwKKwkJCQkJICAgICAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgcCk7CisJCSAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKKwkJfQorCSAgICB9CisKKwkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSREVGLCAwKQorCSAgICAgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJERUZOVU0sIGNkZWZzKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT5jdmVyZGVmcyA9IGNkZWZzOworCX0KKworICAgICAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHZlcnNpb24gcmVmZXJlbmNlIHNlY3Rpb24uICAqLworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nbnUudmVyc2lvbl9yIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgeworCXN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyBzaW5mbzsKKworCXNpbmZvLm91dHB1dF9iZmQgPSBvdXRwdXRfYmZkOworCXNpbmZvLmluZm8gPSBpbmZvOworCXNpbmZvLnZlcnMgPSBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT5jdmVyZGVmczsKKwlpZiAoc2luZm8udmVycyA9PSAwKQorCSAgc2luZm8udmVycyA9IDE7CisJc2luZm8uZmFpbGVkID0gZmFsc2U7CisKKwllbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJZWxmX2xpbmtfZmluZF92ZXJzaW9uX2RlcGVuZGVuY2llcywKKwkJCQkoUFRSKSAmc2luZm8pOworCisJaWYgKGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZiA9PSBOVUxMKQorCSAgeworCSAgICBhc2VjdGlvbiAqKnNwcDsKKworCSAgICAvKiBXZSBkb24ndCBoYXZlIGFueSB2ZXJzaW9uIGRlZmluaXRpb25zLCBzbyB3ZSBjYW4ganVzdAorICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBzZWN0aW9uLiAgKi8KKworCSAgICBmb3IgKHNwcCA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsKKwkJICpzcHAgIT0gcy0+b3V0cHV0X3NlY3Rpb247CisJCSBzcHAgPSAmKCpzcHApLT5uZXh0KQorCSAgICAgIDsKKwkgICAgKnNwcCA9IHMtPm91dHB1dF9zZWN0aW9uLT5uZXh0OworCSAgICAtLW91dHB1dF9iZmQtPnNlY3Rpb25fY291bnQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKKwkgICAgdW5zaWduZWQgaW50IHNpemU7CisJICAgIHVuc2lnbmVkIGludCBjcmVmczsKKwkgICAgYmZkX2J5dGUgKnA7CisKKwkgICAgLyogQnVpbGQgdGhlIHZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KKwkgICAgc2l6ZSA9IDA7CisJICAgIGNyZWZzID0gMDsKKwkgICAgZm9yICh0ID0gZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmOworCQkgdCAhPSBOVUxMOworCQkgdCA9IHQtPnZuX25leHRyZWYpCisJICAgICAgeworCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKKworCQlzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOworCQkrK2NyZWZzOworCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQorCQkgIHNpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7CisJICAgICAgfQorCisJICAgIHMtPl9yYXdfc2l6ZSA9IHNpemU7CisJICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZSk7CisJICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKworCSAgICBwID0gcy0+Y29udGVudHM7CisJICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKKwkJIHQgIT0gTlVMTDsKKwkJIHQgPSB0LT52bl9uZXh0cmVmKQorCSAgICAgIHsKKwkJdW5zaWduZWQgaW50IGNhdXg7CisJCUVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOworCQliZmRfc2l6ZV90eXBlIGluZHg7CisKKwkJY2F1eCA9IDA7CisJCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCisJCSAgKytjYXV4OworCisJCXQtPnZuX3ZlcnNpb24gPSBWRVJfTkVFRF9DVVJSRU5UOworCQl0LT52bl9jbnQgPSBjYXV4OworCQlpZiAoZWxmX2R0X25hbWUgKHQtPnZuX2JmZCkgIT0gTlVMTCkKKwkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKKwkJCQkJICAgICBlbGZfZHRfbmFtZSAodC0+dm5fYmZkKSwKKwkJCQkJICAgICB0cnVlLCBmYWxzZSk7CisJCWVsc2UKKwkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKKwkJCQkJICAgICB0LT52bl9iZmQtPmZpbGVuYW1lLCB0cnVlLCBmYWxzZSk7CisJCWlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkJICByZXR1cm4gZmFsc2U7CisJCXQtPnZuX2ZpbGUgPSBpbmR4OworCQl0LT52bl9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKKwkJaWYgKHQtPnZuX25leHRyZWYgPT0gTlVMTCkKKwkJICB0LT52bl9uZXh0ID0gMDsKKwkJZWxzZQorCQkgIHQtPnZuX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCkKKwkJCQkrIGNhdXggKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KSk7CisKKwkJX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCAob3V0cHV0X2JmZCwgdCwKKwkJCQkJICAgKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHApOworCQlwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpOworCisJCWZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCisJCSAgeworCQkgICAgYS0+dm5hX2hhc2ggPSBiZmRfZWxmX2hhc2ggKChjb25zdCB1bnNpZ25lZCBjaGFyICopCisJCQkJCQlhLT52bmFfbm9kZW5hbWUpOworCQkgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCisJCQkJCSAgICAgICBhLT52bmFfbm9kZW5hbWUsIHRydWUsIGZhbHNlKTsKKwkJICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgYS0+dm5hX25hbWUgPSBpbmR4OworCQkgICAgaWYgKGEtPnZuYV9uZXh0cHRyID09IE5VTEwpCisJCSAgICAgIGEtPnZuYV9uZXh0ID0gMDsKKwkJICAgIGVsc2UKKwkJICAgICAgYS0+dm5hX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuYXV4KTsKKworCQkgICAgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCAob3V0cHV0X2JmZCwgYSwKKwkJCQkJICAgICAgIChFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSBwKTsKKwkJICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7CisJCSAgfQorCSAgICAgIH0KKworCSAgICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUk5FRUQsIDApCisJCXx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJORUVETlVNLCBjcmVmcykpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJyZWZzID0gY3JlZnM7CisJICB9CisgICAgICB9CisKKyAgICAgIGR5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKKworICAgICAgLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB2ZXJzaW9uIHNlY3Rpb24uICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBpZiAoZHluc3ltY291bnQgPT0gMAorCSAgfHwgKHZlcmRlZnMgPT0gTlVMTCAmJiBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWYgPT0gTlVMTCkpCisJeworCSAgYXNlY3Rpb24gKipzcHA7CisKKwkgIC8qIFdlIGRvbid0IG5lZWQgYW55IHN5bWJvbCB2ZXJzaW9uczsganVzdCBkaXNjYXJkIHRoZQorICAgICAgICAgICAgIHNlY3Rpb24uICAqLworCSAgZm9yIChzcHAgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7CisJICAgICAgICpzcHAgIT0gcy0+b3V0cHV0X3NlY3Rpb247CisJICAgICAgIHNwcCA9ICYoKnNwcCktPm5leHQpCisJICAgIDsKKwkgICpzcHAgPSBzLT5vdXRwdXRfc2VjdGlvbi0+bmV4dDsKKwkgIC0tb3V0cHV0X2JmZC0+c2VjdGlvbl9jb3VudDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcy0+X3Jhd19zaXplID0gZHluc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pOworCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKKwkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSU1lNLCAwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuZHluc3ltIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFdlIGNvdW50ZWQKKwkgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLgorCSBXZSB3aWxsIGJ1aWxkIHRoZSBjb250ZW50cyBvZiAuZHluc3ltIGFuZCAuaGFzaCB3aGVuIHdlIGJ1aWxkCisJIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUKKwkgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZSBzeW1ib2xzLiAgV2UgYnVpbHQgdGhlIC5keW5zdHIKKwkgc2VjdGlvbiBhcyB3ZSB3ZW50IGFsb25nIGluIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scy4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7CisgICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiAuZHluc3ltIGlzIGEgZHVtbXkgc3ltYm9sLiAgKi8KKyAgICAgIGlzeW0uc3RfdmFsdWUgPSAwOworICAgICAgaXN5bS5zdF9zaXplID0gMDsKKyAgICAgIGlzeW0uc3RfbmFtZSA9IDA7CisgICAgICBpc3ltLnN0X2luZm8gPSAwOworICAgICAgaXN5bS5zdF9vdGhlciA9IDA7CisgICAgICBpc3ltLnN0X3NobmR4ID0gMDsKKyAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZpc3ltLAorCQkJICAgKFBUUikgKEVsZl9FeHRlcm5hbF9TeW0gKikgcy0+Y29udGVudHMpOworCisgICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBoYXNoaW5nIHRhYmxlLiAgQXMgYSBzaWRlIGVmZmVjdCB0aGlzCisJIGNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlcyBmb3IgYWxsIHRoZSBuYW1lcyB3ZSBleHBvcnQuICAqLworICAgICAgYnVja2V0Y291bnQgPSBjb21wdXRlX2J1Y2tldF9jb3VudCAoaW5mbyk7CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgPSAoMiArIGJ1Y2tldGNvdW50ICsgZHluc3ltY291bnQpICogKEFSQ0hfU0laRSAvIDgpOworICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKKworICAgICAgcHV0X3dvcmQgKG91dHB1dF9iZmQsIGJ1Y2tldGNvdW50LCBzLT5jb250ZW50cyk7CisgICAgICBwdXRfd29yZCAob3V0cHV0X2JmZCwgZHluc3ltY291bnQsIHMtPmNvbnRlbnRzICsgKEFSQ0hfU0laRSAvIDgpKTsKKworICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCA9IGJ1Y2tldGNvdW50OworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7CisKKyAgICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTlVMTCwgMCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEZpeCB1cCB0aGUgZmxhZ3MgZm9yIGEgc3ltYm9sLiAgVGhpcyBoYW5kbGVzIHZhcmlvdXMgY2FzZXMgd2hpY2gKKyAgIGNhbiBvbmx5IGJlIGZpeGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgYXJlIHNlZW4uICBUaGlzIGlzCisgICBjdXJyZW50bHkgY2FsbGVkIGJ5IGJvdGggYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGFuZAorICAgYXNzaWduX3N5bV92ZXJzaW9uLCB3aGljaCBpcyB1bm5lY2Vzc2FyeSBidXQgcGVyaGFwcyBtb3JlIHJvYnVzdCBpbgorICAgdGhlIGZhY2Ugb2YgZnV0dXJlIGNoYW5nZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsIGVpZikKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZjsKK3sKKyAgLyogSWYgdGhpcyBzeW1ib2wgd2FzIG1lbnRpb25lZCBpbiBhIG5vbi1FTEYgZmlsZSwgdHJ5IHRvIHNldAorICAgICBERUZfUkVHVUxBUiBhbmQgUkVGX1JFR1VMQVIgY29ycmVjdGx5LiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdG8KKyAgICAgcGVybWl0IGEgbm9uLUVMRiBmaWxlIHRvIGNvcnJlY3RseSByZWZlciB0byBhIHN5bWJvbCBkZWZpbmVkIGluCisgICAgIGFuIEVMRiBkeW5hbWljIG9iamVjdC4gICovCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9FTEYpICE9IDApCisgICAgeworICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgorCQkJCSAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCisJICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKKwkJICA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKSkKKwkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgorCQkJCSAgICAgICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk7CisJICBlbHNlCisJICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKKwl9CisKKyAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xCisJICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCisJICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKSkKKwl7CisJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKKwkgICAgeworCSAgICAgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVW5mb3J0dW5hdGVseSwgRUxGX0xJTktfTk9OX0VMRiBpcyBvbmx5IGNvcnJlY3QgaWYgdGhlIHN5bWJvbAorICAgICAgICAgd2FzIGZpcnN0IHNlZW4gaW4gYSBub24tRUxGIGZpbGUuICBGb3J0dW5hdGVseSwgaWYgdGhlIHN5bWJvbAorICAgICAgICAgd2FzIGZpcnN0IHNlZW4gaW4gYW4gRUxGIGZpbGUsIHdlJ3JlIHByb2JhYmx5IE9LIHVubGVzcyB0aGUKKyAgICAgICAgIHN5bWJvbCB3YXMgZGVmaW5lZCBpbiBhIG5vbi1FTEYgZmlsZS4gIENhdGNoIHRoYXQgY2FzZSBoZXJlLgorICAgICAgICAgRklYTUU6IFdlJ3JlIHN0aWxsIGluIHRyb3VibGUgaWYgdGhlIHN5bWJvbCB3YXMgZmlyc3Qgc2VlbiBpbgorICAgICAgICAgYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZW4gbGF0ZXIgaW4gYSBub24tRUxGIHJlZ3VsYXIgb2JqZWN0LiAgKi8KKyAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKKwkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKKwkgICAgICA/IChiZmRfZ2V0X2ZsYXZvdXIgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIpCisJCSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorCSAgICAgIDogKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQorCQkgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkJICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDApKSkKKwloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCBhbmQgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbgorICAgICBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4KKyAgICAgYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IKKyAgICAgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbiBzZWN0aW9uIGJ1dCB0aGUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgorICAgICBmbGFnIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCisgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKKyAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAorICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKKyAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7CisKKyAgLyogSWYgLUJzeW1ib2xpYyB3YXMgdXNlZCAod2hpY2ggbWVhbnMgdG8gYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbAorICAgICBzeW1ib2xzIHRvIHRoZSBkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIG9iamVjdCksIGFuZCB0aGlzCisgICAgIHN5bWJvbCB3YXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LCB0aGVuIGl0IGFjdHVhbGx5IGRvZXNuJ3QKKyAgICAgbmVlZCBhIFBMVCBlbnRyeS4gICovCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCisgICAgICAmJiBlaWYtPmluZm8tPnNoYXJlZAorICAgICAgJiYgZWlmLT5pbmZvLT5zeW1ib2xpYworICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQorICAgIHsKKyAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOworICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE1ha2UgdGhlIGJhY2tlbmQgcGljayBhIGdvb2QgdmFsdWUgZm9yIGEgZHluYW1pYyBzeW1ib2wuICBUaGlzIGlzCisgICBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UsIGFuZCBhbHNvIGNhbGxzIGl0c2VsZgorICAgcmVjdXJzaXZlbHkuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICplaWYgPSAoc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqKSBkYXRhOworICBiZmQgKmR5bm9iajsKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKKworICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KKyAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEZpeCB0aGUgc3ltYm9sIGZsYWdzLiAgKi8KKyAgaWYgKCEgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsIGVpZikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIElmIHRoaXMgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBQTFQgZW50cnksIGFuZCBpdCBpcyBub3QKKyAgICAgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBvciBpcyBub3QgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIKKyAgICAgb2JqZWN0LCBpZ25vcmUgaXQuICBXZSBkbyBoYXZlIHRvIGhhbmRsZSBhIHdlYWsgZGVmaW5lZCBzeW1ib2wsCisgICAgIGV2ZW4gaWYgbm8gcmVndWxhciBvYmplY3QgcmVmZXJzIHRvIGl0LCBpZiB3ZSBkZWNpZGVkIHRvIGFkZCBpdAorICAgICB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBGSVhNRTogRG8gd2Ugbm9ybWFsbHkgbmVlZCB0byB3b3JyeQorICAgICBhYm91dCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IG9uZSBkeW5hbWljIG9iamVjdCBhbmQKKyAgICAgcmVmZXJlbmNlZCBieSBhbm90aGVyIG9uZT8gICovCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSA9PSAwCisgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCisJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKKwkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDAKKwkgICAgICAmJiAoaC0+d2Vha2RlZiA9PSBOVUxMIHx8IGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpKSkpCisgICAgeworICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGFkanVzdGVkIHRoaXMgc3ltYm9sLCBkb24ndCBkbyBpdCBhZ2Fpbi4gIFRoaXMKKyAgICAgY2FuIGhhcHBlbiB2aWEgYSByZWN1cnNpdmUgY2FsbC4gICovCisgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRCkgIT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBEb24ndCBsb29rIGF0IHRoaXMgc3ltYm9sIGFnYWluLiAgTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoaXMKKyAgICAgYWZ0ZXIgY2hlY2tpbmcgdGhlIGFib3ZlIGNvbmRpdGlvbnMsIGJlY2F1c2Ugd2UgbWF5IGxvb2sgYXQgYQorICAgICBzeW1ib2wgb25jZSwgZGVjaWRlIG5vdCB0byBkbyBhbnl0aGluZywgYW5kIHRoZW4gZ2V0IGNhbGxlZAorICAgICByZWN1cnNpdmVseSBsYXRlciBhZnRlciBSRUZfUkVHVUxBUiBpcyBzZXQgYmVsb3cuICAqLworICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRDsKKworICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbml0aW9uLCBhbmQgd2Uga25vdyBhIHJlYWwgZGVmaW5pdGlvbiwgYW5kCisgICAgIHRoZSByZWFsIHN5bWJvbCBpcyBub3QgaXRzZWxmIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLAorICAgICB0aGVuIGdldCBhIGdvb2QgdmFsdWUgZm9yIHRoZSByZWFsIGRlZmluaXRpb24uICBXZSBoYW5kbGUgdGhlCisgICAgIHJlYWwgc3ltYm9sIGZpcnN0LCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBiYWNrZW5kIHJvdXRpbmUuCisKKyAgICAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uZnVzaW5nIGNhc2UgaGVyZS4gIElmIHRoZSByZWFsIGRlZmluaXRpb24KKyAgICAgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHdlIGRvbid0IGdldCB0aGUgcmVhbCBzeW1ib2wKKyAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSBkbyBnZXQgdGhlIHdlYWsgc3ltYm9sLiAgSWYgdGhlCisgICAgIHByb2Nlc3NvciBiYWNrZW5kIHVzZXMgYSBDT1BZIHJlbG9jLCB0aGVuIGlmIHNvbWUgcm91dGluZSBpbiB0aGUKKyAgICAgZHluYW1pYyBvYmplY3QgY2hhbmdlcyB0aGUgcmVhbCBzeW1ib2wsIHdlIHdpbGwgbm90IHNlZSB0aGF0CisgICAgIGNoYW5nZSBpbiB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIHN5bWJvbC4gIFRoaXMgaXMgdGhlIHdheSBvdGhlcgorICAgICBFTEYgbGlua2VycyB3b3JrIGFzIHdlbGwsIGFuZCBzZWVtcyB0byBiZSBhIHJlc3VsdCBvZiB0aGUgc2hhcmVkCisgICAgIGxpYnJhcnkgbW9kZWwuCisKKyAgICAgSSB3aWxsIGNsYXJpZnkgdGhpcyBpc3N1ZS4gIE1vc3QgU1ZSNCBzaGFyZWQgbGlicmFyaWVzIGRlZmluZSB0aGUKKyAgICAgdmFyaWFibGUgX3RpbWV6b25lIGFuZCBkZWZpbmUgdGltZXpvbmUgYXMgYSB3ZWFrIHN5bm9ueW0uICBUaGUKKyAgICAgdHpzZXQgY2FsbCBjaGFuZ2VzIF90aW1lem9uZS4gIElmIHlvdSB3cml0ZQorICAgICAgIGV4dGVybiBpbnQgdGltZXpvbmU7CisgICAgICAgaW50IF90aW1lem9uZSA9IDU7CisgICAgICAgaW50IG1haW4gKCkgeyB0enNldCAoKTsgcHJpbnRmICgiJWQgJWRcbiIsIHRpbWV6b25lLCBfdGltZXpvbmUpOyB9CisgICAgIHlvdSBtaWdodCBleHBlY3QgdGhhdCwgc2luY2UgdGltZXpvbmUgaXMgYSBzeW5vbnltIGZvciBfdGltZXpvbmUsCisgICAgIHRoZSBzYW1lIG51bWJlciB3aWxsIHByaW50IGJvdGggdGltZXMuICBIb3dldmVyLCBpZiB0aGUgcHJvY2Vzc29yCisgICAgIGJhY2tlbmQgdXNlcyBhIENPUFkgcmVsb2MsIHRoZW4gYWN0dWFsbHkgdGltZXpvbmUgd2lsbCBiZSBjb3BpZWQKKyAgICAgaW50byB5b3VyIHByb2Nlc3MgaW1hZ2UsIGFuZCwgc2luY2UgeW91IGRlZmluZSBfdGltZXpvbmUKKyAgICAgeW91cnNlbGYsIF90aW1lem9uZSB3aWxsIG5vdC4gIFRodXMgdGltZXpvbmUgYW5kIF90aW1lem9uZSB3aWxsCisgICAgIHdpbmQgdXAgYXQgZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMuICBUaGUgdHpzZXQgY2FsbCB3aWxsIHNldAorICAgICBfdGltZXpvbmUsIGxlYXZpbmcgdGltZXpvbmUgdW5jaGFuZ2VkLiAgKi8KKworICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrZGVmOworCisgICAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7CisgICAgICB3ZWFrZGVmID0gaC0+d2Vha2RlZjsKKyAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCB3ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKKyAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKTsKKyAgICAgIGlmICgod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCisJeworCSAgLyogVGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHNvIHdlCisJICAgICB3aWxsIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsLiAgQ2xlYXIgd2Vha2RlZiBmb3IgdGhlCisJICAgICBjb252ZW5pZW5jZSBvZiB0aGUgcHJvY2Vzc29yIGJhY2tlbmQuICAqLworCSAgaC0+d2Vha2RlZiA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZXJlIGlzIGFuIGltcGxpY2l0IHJlZmVyZW5jZSBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUKKwkgICAgIHZpYSB0aGUgd2VhayBzeW1ib2wuICAqLworCSAgd2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOworCSAgaWYgKGgtPndlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykKKwkgICAgd2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUs7CisJICBpZiAoISBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sICh3ZWFrZGVmLCAoUFRSKSBlaWYpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBJZiBhIHN5bWJvbCBoYXMgbm8gdHlwZSBhbmQgbm8gc2l6ZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIFBMVAorICAgICBlbnRyeSwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgYWJvdXQgdG8gZG8gdGhlIHdyb25nIHRoaW5nIGhlcmU6IHdlCisgICAgIGFyZSBwcm9iYWJseSBnb2luZyB0byBjcmVhdGUgYSBDT1BZIHJlbG9jIGZvciBhbiBlbXB0eSBvYmplY3QuCisgICAgIFRoaXMgY2FzZSBjYW4gYXJpc2Ugd2hlbiBhIHNoYXJlZCBvYmplY3QgaXMgYnVpbHQgd2l0aCBhc3NlbWJseQorICAgICBjb2RlLCBhbmQgdGhlIGFzc2VtYmx5IGNvZGUgZmFpbHMgdG8gc2V0IHRoZSBzeW1ib2wgdHlwZS4gICovCisgIGlmIChoLT5zaXplID09IDAKKyAgICAgICYmIGgtPnR5cGUgPT0gU1RUX05PVFlQRQorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgPT0gMCkKKyAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKyAgICAgIChfKCJ3YXJuaW5nOiB0eXBlIGFuZCBzaXplIG9mIGR5bmFtaWMgc3ltYm9sIGAlcycgYXJlIG5vdCBkZWZpbmVkIiksCisJIGgtPnJvb3Qucm9vdC5zdHJpbmcpOworCisgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChlaWYtPmluZm8pLT5keW5vYmo7CisgIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopOworICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKSAoZWlmLT5pbmZvLCBoKSkKKyAgICB7CisgICAgICBlaWYtPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZXhwb3J0IGFsbCBkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUgZHluYW1pYworICAgc3ltYm9sIHRhYmxlLiAgSXQgaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9leHBvcnRfc3ltYm9sIChoLCBkYXRhKQorICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGRhdGE7Cit7CisgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7CisKKyAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCisgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoaC0+ZHluaW5keCA9PSAtMQorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKKwkgICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKKwl7CisJICBlaWYtPmZhaWxlZCA9IHRydWU7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBvdGhlciBzaGFyZWQKKyAgIGxpYnJhcmllcyBhbmQgcmVmZXJlbmNlZCBoZXJlLiAgVXBkYXRlIHRoZSBsaXN0IG9mIHZlcnNpb24KKyAgIGRlcGVuZGVuY2llcy4gIFRoaXMgd2lsbCBiZSBwdXQgaW50byB0aGUgLmdudS52ZXJzaW9uX3Igc2VjdGlvbi4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMgKGgsIGRhdGEpCisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKikgZGF0YTsKKyAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7CisgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOworCisgIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBzeW1ib2xzIGRlZmluZWQgaW4gc2hhcmVkIG9iamVjdHMgd2l0aCB2ZXJzaW9uCisgICAgIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAorICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCisgICAgICB8fCBoLT5keW5pbmR4ID09IC0xCisgICAgICB8fCBoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyB2ZXJzaW9uLiAgKi8KKyAgZm9yICh0ID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKKyAgICB7CisgICAgICBpZiAodC0+dm5fYmZkICE9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQpCisJY29udGludWU7CisKKyAgICAgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCisJaWYgKGEtPnZuYV9ub2RlbmFtZSA9PSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfbm9kZW5hbWUpCisJICByZXR1cm4gdHJ1ZTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYSBuZXcgdmVyc2lvbi4gIEFkZCBpdCB0byB0cmVlIHdlIGFyZSBidWlsZGluZy4gICovCisKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICB7CisgICAgICB0ID0gKEVsZl9JbnRlcm5hbF9WZXJuZWVkICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKnQpOworICAgICAgaWYgKHQgPT0gTlVMTCkKKwl7CisJICByaW5mby0+ZmFpbGVkID0gdHJ1ZTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHQtPnZuX2JmZCA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQ7CisgICAgICB0LT52bl9uZXh0cmVmID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsKKyAgICAgIGVsZl90ZGF0YSAocmluZm8tPm91dHB1dF9iZmQpLT52ZXJyZWYgPSB0OworICAgIH0KKworICBhID0gKEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKmEpOworCisgIC8qIE5vdGUgdGhhdCB3ZSBhcmUgY29weWluZyBhIHN0cmluZyBwb2ludGVyIGhlcmUsIGFuZCB0ZXN0aW5nIGl0CisgICAgIGFib3ZlLiAgSWYgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiBpcyBldmVyIGNoYW5nZWQgdG8KKyAgICAgZGlzY2FyZCB0aGUgc3RyaW5nIGRhdGEgd2hlbiBsb3cgaW4gbWVtb3J5LCB0aGlzIHdpbGwgaGF2ZSB0byBiZQorICAgICBmaXhlZC4gICovCisgIGEtPnZuYV9ub2RlbmFtZSA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZTsKKworICBhLT52bmFfZmxhZ3MgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZmxhZ3M7CisgIGEtPnZuYV9uZXh0cHRyID0gdC0+dm5fYXV4cHRyOworCisgIGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gPSByaW5mby0+dmVyczsKKyAgKytyaW5mby0+dmVyczsKKworICBhLT52bmFfb3RoZXIgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKKworICB0LT52bl9hdXhwdHIgPSBhOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaWd1cmUgb3V0IGFwcHJvcHJpYXRlIHZlcnNpb25zIGZvciBhbGwgdGhlIHN5bWJvbHMuICBXZSBtYXkgbm90CisgICBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlciBzY3JpcHQgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCBvZiB0aGUgaW5wdXQKKyAgIGZpbGVzLCBzbyB1bnRpbCB0aGF0IHBvaW50IHdlIGRvbid0IGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQgYmUKKyAgIGxvY2FsLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIChoLCBkYXRhKQorICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGRhdGE7Cit7CisgIHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gKnNpbmZvID0KKyAgICAoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqKSBkYXRhOworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IHNpbmZvLT5pbmZvOworICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKKyAgY2hhciAqcDsKKworICAvKiBGaXggdGhlIHN5bWJvbCBmbGFncy4gICovCisgIGVpZi5mYWlsZWQgPSBmYWxzZTsKKyAgZWlmLmluZm8gPSBpbmZvOworICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgJmVpZikpCisgICAgeworICAgICAgaWYgKGVpZi5mYWlsZWQpCisJc2luZm8tPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFdlIG9ubHkgbmVlZCB2ZXJzaW9uIG51bWJlcnMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiByZWd1bGFyCisgICAgIG9iamVjdHMuICAqLworICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIHAgPSBzdHJjaHIgKGgtPnJvb3Qucm9vdC5zdHJpbmcsIEVMRl9WRVJfQ0hSKTsKKyAgaWYgKHAgIT0gTlVMTCAmJiBoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7CisgICAgICBib29sZWFuIGhpZGRlbjsKKworICAgICAgaGlkZGVuID0gdHJ1ZTsKKworICAgICAgLyogVGhlcmUgYXJlIHR3byBjb25zZWN1dGl2ZSBFTEZfVkVSX0NIUiBjaGFyYWN0ZXJzIGlmIHRoaXMgaXMKKyAgICAgICAgIG5vdCBhIGhpZGRlbiBzeW1ib2wuICAqLworICAgICAgKytwOworICAgICAgaWYgKCpwID09IEVMRl9WRVJfQ0hSKQorCXsKKwkgIGhpZGRlbiA9IGZhbHNlOworCSAgKytwOworCX0KKworICAgICAgLyogSWYgdGhlcmUgaXMgbm8gdmVyc2lvbiBzdHJpbmcsIHdlIGNhbiBqdXN0IHJldHVybiBvdXQuICAqLworICAgICAgaWYgKCpwID09ICdcMCcpCisJeworCSAgaWYgKGhpZGRlbikKKwkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIC8qIExvb2sgZm9yIHRoZSB2ZXJzaW9uLiAgSWYgd2UgZmluZCBpdCwgaXQgaXMgbm8gbG9uZ2VyIHdlYWsuICAqLworICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCisJeworCSAgaWYgKHN0cmNtcCAodC0+bmFtZSwgcCkgPT0gMCkKKwkgICAgeworCSAgICAgIGludCBsZW47CisJICAgICAgY2hhciAqYWxjOworCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZDsKKworCSAgICAgIGxlbiA9IHAgLSBoLT5yb290LnJvb3Quc3RyaW5nOworCSAgICAgIGFsYyA9IGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIGxlbik7CisJICAgICAgaWYgKGFsYyA9PSBOVUxMKQorCSAgICAgICAgcmV0dXJuIGZhbHNlOworCSAgICAgIHN0cm5jcHkgKGFsYywgaC0+cm9vdC5yb290LnN0cmluZywgbGVuIC0gMSk7CisJICAgICAgYWxjW2xlbiAtIDFdID0gJ1wwJzsKKwkgICAgICBpZiAoYWxjW2xlbiAtIDJdID09IEVMRl9WRVJfQ0hSKQorCSAgICAgICAgYWxjW2xlbiAtIDJdID0gJ1wwJzsKKworCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7CisJICAgICAgdC0+dXNlZCA9IHRydWU7CisJICAgICAgZCA9IE5VTEw7CisKKwkgICAgICBpZiAodC0+Z2xvYmFscyAhPSBOVUxMKQorCQl7CisJCSAgZm9yIChkID0gdC0+Z2xvYmFsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKwkJICAgIGlmICgoKmQtPm1hdGNoKSAoZCwgYWxjKSkKKwkJICAgICAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBmb3JjZSB0aGlzIHN5bWJvbCB0bworICAgICAgICAgICAgICAgICBsb2NhbCBzY29wZS4gICovCisJICAgICAgaWYgKGQgPT0gTlVMTCAmJiB0LT5sb2NhbHMgIT0gTlVMTCkKKwkJeworCQkgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKwkJICAgIHsKKwkJICAgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQorCQkJeworCQkJICBpZiAoaC0+ZHluaW5keCAhPSAtMQorCQkJICAgICAgJiYgaW5mby0+c2hhcmVkCisJCQkgICAgICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKKwkJCSAgICB7CisJCQkgICAgICBzaW5mby0+cmVtb3ZlZF9keW5hbWljID0gdHJ1ZTsKKwkJCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOworCQkJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4KKwkJCQlFTEZfTElOS19IQVNIX05FRURTX1BMVDsKKwkJCSAgICAgIGgtPmR5bmluZHggPSAtMTsKKwkJCSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisJCQkgICAgICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMKKwkJCQkgYWxyZWFkeSBiZWVuIHJlY29yZGVkIGluIHRoZSBkeW5hbWljCisJCQkJIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KKwkJCSAgICB9CisKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIGJmZF9yZWxlYXNlIChzaW5mby0+b3V0cHV0X2JmZCwgYWxjKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGFwcGxpY2F0aW9uLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhCisgICAgICAgICB2ZXJzaW9uIG5vZGUgZm9yIHRoaXMgdmVyc2lvbi4gICovCisgICAgICBpZiAodCA9PSBOVUxMICYmICEgaW5mby0+c2hhcmVkKQorCXsKKwkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKnBwOworCSAgaW50IHZlcnNpb25faW5kZXg7CisKKwkgIC8qIElmIHdlIGFyZW4ndCBnb2luZyB0byBleHBvcnQgdGhpcyBzeW1ib2wsIHdlIGRvbid0IG5lZWQKKyAgICAgICAgICAgICB0byB3b3JyeSBhYm91dCBpdC4gKi8KKwkgIGlmIChoLT5keW5pbmR4ID09IC0xKQorCSAgICByZXR1cm4gdHJ1ZTsKKworCSAgdCA9ICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopCisJICAgICAgIGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqdCkpOworCSAgaWYgKHQgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNpbmZvLT5mYWlsZWQgPSB0cnVlOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICB0LT5uZXh0ID0gTlVMTDsKKwkgIHQtPm5hbWUgPSBwOworCSAgdC0+Z2xvYmFscyA9IE5VTEw7CisJICB0LT5sb2NhbHMgPSBOVUxMOworCSAgdC0+ZGVwcyA9IE5VTEw7CisJICB0LT5uYW1lX2luZHggPSAodW5zaWduZWQgaW50KSAtMTsKKwkgIHQtPnVzZWQgPSB0cnVlOworCisJICB2ZXJzaW9uX2luZGV4ID0gMTsKKwkgIGZvciAocHAgPSAmc2luZm8tPnZlcmRlZnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKKwkgICAgKyt2ZXJzaW9uX2luZGV4OworCSAgdC0+dmVybnVtID0gdmVyc2lvbl9pbmRleDsKKworCSAgKnBwID0gdDsKKworCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKKwl9CisgICAgICBlbHNlIGlmICh0ID09IE5VTEwpCisJeworCSAgLyogV2UgY291bGQgbm90IGZpbmQgdGhlIHZlcnNpb24gZm9yIGEgc3ltYm9sIHdoZW4KKyAgICAgICAgICAgICBnZW5lcmF0aW5nIGEgc2hhcmVkIGFyY2hpdmUuICBSZXR1cm4gYW4gZXJyb3IuICAqLworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogdW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wgbmFtZSAlcyIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc2luZm8tPm91dHB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgc2luZm8tPmZhaWxlZCA9IHRydWU7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAoaGlkZGVuKQorCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSElEREVOOworICAgIH0KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmVyc2lvbiBmb3IgdGhpcyBzeW1ib2wsIHNlZSBpZiB3ZSBjYW4gZmluZAorICAgICBzb21ldGhpbmcuICAqLworICBpZiAoaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwgJiYgc2luZm8tPnZlcmRlZnMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7CisgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmRlZmx0OworICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpkOworCisgICAgICAvKiBTZWUgaWYgY2FuIGZpbmQgd2hhdCB2ZXJzaW9uIHRoaXMgc3ltYm9sIGlzIGluLiAgSWYgdGhlCisgICAgICAgICBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgbG9jYWwsIHRoZW4gZG9uJ3QgYWN0dWFsbHkgcmVnaXN0ZXIKKyAgICAgICAgIGl0LiAgKi8KKyAgICAgIGRlZmx0ID0gTlVMTDsKKyAgICAgIGZvciAodCA9IHNpbmZvLT52ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQorCXsKKwkgIGlmICh0LT5nbG9iYWxzICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBmb3IgKGQgPSB0LT5nbG9iYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQorCQl7CisJCSAgaWYgKCgqZC0+bWF0Y2gpIChkLCBoLT5yb290LnJvb3Quc3RyaW5nKSkKKwkJICAgIHsKKwkJICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKworCSAgICAgIGlmIChkICE9IE5VTEwpCisJCWJyZWFrOworCSAgICB9CisKKwkgIGlmICh0LT5sb2NhbHMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKwkJeworCQkgIGlmIChkLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBkLT5wYXR0ZXJuWzFdID09ICdcMCcpCisJCSAgICBkZWZsdCA9IHQ7CisJCSAgZWxzZSBpZiAoKCpkLT5tYXRjaCkgKGQsIGgtPnJvb3Qucm9vdC5zdHJpbmcpKQorCQkgICAgeworCQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OworCQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQorCQkJICAmJiBpbmZvLT5zaGFyZWQKKwkJCSAgJiYgISBzaW5mby0+ZXhwb3J0X2R5bmFtaWMpCisJCQl7CisJCQkgIHNpbmZvLT5yZW1vdmVkX2R5bmFtaWMgPSB0cnVlOworCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKKwkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisJCQkgIGgtPmR5bmluZHggPSAtMTsKKwkJCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKKwkJCSAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkKKwkJCSAgICAgYmVlbiByZWNvcmRlZCBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUKKwkJCSAgICAgc2VjdGlvbi4gICovCisJCQl9CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisKKwkgICAgICBpZiAoZCAhPSBOVUxMKQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGRlZmx0ICE9IE5VTEwgJiYgaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwpCisJeworCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gZGVmbHQ7CisJICBpZiAoaC0+ZHluaW5keCAhPSAtMQorCSAgICAgICYmIGluZm8tPnNoYXJlZAorCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQorCSAgICB7CisJICAgICAgc2luZm8tPnJlbW92ZWRfZHluYW1pYyA9IHRydWU7CisJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7CisJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7CisJICAgICAgaC0+ZHluaW5keCA9IC0xOworCSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7CisJICAgICAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbgorCQkgcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbnVtYmVyIHRoZSBkeW5hbWljIHN5bWJvbHMsIGlmIHNvbWUgb2YKKyAgIHRoZW0gYXJlIHJlbW92ZWQgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgbG9jYWwuICBUaGlzIGlzIGNhbGxlZAorICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOworCisgIGlmIChoLT5keW5pbmR4ICE9IC0xKQorICAgIHsKKyAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OworICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEZpbmFsIHBoYXNlIG9mIEVMRiBsaW5rZXIuICAqLworCisvKiBBIHN0cnVjdHVyZSB3ZSB1c2UgdG8gYXZvaWQgcGFzc2luZyBsYXJnZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4gICovCisKK3N0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvCit7CisgIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAvKiBPdXRwdXQgQkZELiAgKi8KKyAgYmZkICpvdXRwdXRfYmZkOworICAvKiBTeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3ltc3RydGFiOworICAvKiAuZHluc3ltIHNlY3Rpb24uICAqLworICBhc2VjdGlvbiAqZHluc3ltX3NlYzsKKyAgLyogLmhhc2ggc2VjdGlvbi4gICovCisgIGFzZWN0aW9uICpoYXNoX3NlYzsKKyAgLyogc3ltYm9sIHZlcnNpb24gc2VjdGlvbiAoLmdudS52ZXJzaW9uKS4gICovCisgIGFzZWN0aW9uICpzeW12ZXJfc2VjOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLworICBQVFIgZXh0ZXJuYWxfcmVsb2NzOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KKyAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxvY2FsIHN5bWJvbHMgb2YgYW55IGlucHV0CisgICAgIEJGRC4gICovCisgIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBpbnRlcm5hbCBsb2NhbCBzeW1ib2xzIG9mIGFueSBpbnB1dAorICAgICBCRkQuICAqLworICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zOworICAvKiBBcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHN5bWJvbCBpbmRleCBmb3IgZWFjaCBsb2NhbCBzeW1ib2wKKyAgICAgb2YgYW55IGlucHV0IEJGRC4gICovCisgIGxvbmcgKmluZGljZXM7CisgIC8qIEFycmF5IGxhcmdlIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBwb2ludGVyIGZvciBlYWNoIGxvY2FsCisgICAgIHN5bWJvbCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KKyAgYXNlY3Rpb24gKipzZWN0aW9uczsKKyAgLyogQnVmZmVyIHRvIGhvbGQgc3dhcHBlZCBvdXQgc3ltYm9scy4gICovCisgIEVsZl9FeHRlcm5hbF9TeW0gKnN5bWJ1ZjsKKyAgLyogTnVtYmVyIG9mIHN3YXBwZWQgb3V0IHN5bWJvbHMgaW4gYnVmZmVyLiAgKi8KKyAgc2l6ZV90IHN5bWJ1Zl9jb3VudDsKKyAgLyogTnVtYmVyIG9mIHN5bWJvbHMgd2hpY2ggZml0IGluIHN5bWJ1Zi4gICovCisgIHNpemVfdCBzeW1idWZfc2l6ZTsKK307CisKK3N0YXRpYyBib29sZWFuIGVsZl9saW5rX291dHB1dF9zeW0KKyAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAorCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQorICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIGVsZl9saW5rX2lucHV0X2JmZAorICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4gZWxmX3JlbG9jX2xpbmtfb3JkZXIKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCisJICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKKworLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGVsZl9saW5rX291dHB1dF9leHRzeW0uICAqLworCitzdHJ1Y3QgZWxmX291dGV4dF9pbmZvCit7CisgIGJvb2xlYW4gZmFpbGVkOworICBib29sZWFuIGxvY2Fsc3ltczsKKyAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOworfTsKKworLyogRG8gdGhlIGZpbmFsIHN0ZXAgb2YgYW4gRUxGIGxpbmsuICAqLworCitib29sZWFuCitlbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJvb2xlYW4gZHluYW1pYzsKKyAgYmZkICpkeW5vYmo7CisgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvIGZpbmZvOworICByZWdpc3RlciBhc2VjdGlvbiAqbzsKKyAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICByZWdpc3RlciBiZmQgKnN1YjsKKyAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOworICBzaXplX3QgbWF4X2V4dGVybmFsX3JlbG9jX3NpemU7CisgIHNpemVfdCBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQ7CisgIHNpemVfdCBtYXhfc3ltX2NvdW50OworICBmaWxlX3B0ciBvZmY7CisgIEVsZl9JbnRlcm5hbF9TeW0gZWxmc3ltOworICB1bnNpZ25lZCBpbnQgaTsKKyAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOworICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOworICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvIGVvaW5mbzsKKworICBpZiAoaW5mby0+c2hhcmVkKQorICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7CisKKyAgZHluYW1pYyA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOworICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICBmaW5mby5pbmZvID0gaW5mbzsKKyAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7CisgIGZpbmZvLnN5bXN0cnRhYiA9IGVsZl9zdHJpbmd0YWJfaW5pdCAoKTsKKyAgaWYgKGZpbmZvLnN5bXN0cnRhYiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBkeW5hbWljKQorICAgIHsKKyAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBOVUxMOworICAgICAgZmluZm8uaGFzaF9zZWMgPSBOVUxMOworICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmluZm8uZHluc3ltX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7CisgICAgICBmaW5mby5oYXNoX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOworICAgICAgQkZEX0FTU0VSVCAoZmluZm8uZHluc3ltX3NlYyAhPSBOVUxMICYmIGZpbmZvLmhhc2hfc2VjICE9IE5VTEwpOworICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKKyAgICAgIC8qIE5vdGUgdGhhdCBpdCBpcyBPSyBpZiBzeW12ZXJfc2VjIGlzIE5VTEwuICAqLworICAgIH0KKworICBmaW5mby5jb250ZW50cyA9IE5VTEw7CisgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7CisgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7CisgIGZpbmZvLmV4dGVybmFsX3N5bXMgPSBOVUxMOworICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKKyAgZmluZm8uaW5kaWNlcyA9IE5VTEw7CisgIGZpbmZvLnNlY3Rpb25zID0gTlVMTDsKKyAgZmluZm8uc3ltYnVmID0gTlVMTDsKKyAgZmluZm8uc3ltYnVmX2NvdW50ID0gMDsKKworICAvKiBDb3VudCB1cCB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHdlIHdpbGwgb3V0cHV0IGZvciBlYWNoIG91dHB1dAorICAgICBzZWN0aW9uLCBzbyB0aGF0IHdlIGtub3cgdGhlIHNpemVzIG9mIHRoZSByZWxvYyBzZWN0aW9ucy4gIFdlCisgICAgIGFsc28gZmlndXJlIG91dCBzb21lIG1heGltdW0gc2l6ZXMuICAqLworICBtYXhfY29udGVudHNfc2l6ZSA9IDA7CisgIG1heF9leHRlcm5hbF9yZWxvY19zaXplID0gMDsKKyAgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ID0gMDsKKyAgbWF4X3N5bV9jb3VudCA9IDA7CisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBvLT5yZWxvY19jb3VudCA9IDA7CisKKyAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwl7CisJICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCisJICAgICsrby0+cmVsb2NfY291bnQ7CisJICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnNlYzsKKworCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKKworCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKKwkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKKwkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCisJCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KKwkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKKworCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7CisKKwkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKKwkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKKwkgICAgICBpZiAoc2VjLT5fY29va2VkX3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKKwkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9jb29rZWRfc2l6ZTsKKworCSAgICAgIC8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIGp1c3QgbG9jYWwgc3ltYm9scywgbm90IGFsbAorCQkgc3ltYm9scy4gICovCisJICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc2VjLT5vd25lcikgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorCQkgICYmIChzZWMtPm93bmVyLT5mbGFncyAmIERZTkFNSUMpID09IDApCisJCXsKKwkJICBzaXplX3Qgc3ltX2NvdW50OworCisJCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKKwkJICAgIHN5bV9jb3VudCA9IChlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX3NpemUKKwkJCQkgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKKwkJICBlbHNlCisJCSAgICBzeW1fY291bnQgPSBlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX2luZm87CisKKwkJICBpZiAoc3ltX2NvdW50ID4gbWF4X3N5bV9jb3VudCkKKwkJICAgIG1heF9zeW1fY291bnQgPSBzeW1fY291bnQ7CisKKwkJICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisJCSAgICB7CisJCSAgICAgIHNpemVfdCBleHRfc2l6ZTsKKworCQkgICAgICBleHRfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfc2l6ZTsKKwkJICAgICAgaWYgKGV4dF9zaXplID4gbWF4X2V4dGVybmFsX3JlbG9jX3NpemUpCisJCQltYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGV4dF9zaXplOworCQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCkKKwkJCW1heF9pbnRlcm5hbF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID4gMCkKKwlvLT5mbGFncyB8PSBTRUNfUkVMT0M7CisgICAgICBlbHNlCisJeworCSAgLyogRXhwbGljaXRseSBjbGVhciB0aGUgU0VDX1JFTE9DIGZsYWcuICBUaGUgbGlua2VyIHRlbmRzIHRvCisJICAgICBzZXQgaXQgKHRoaXMgaXMgcHJvYmFibHkgYSBidWcpIGFuZCBpZiBpdCBpcyBzZXQKKwkgICAgIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgd2lsbCBjcmVhdGUgYSByZWxvYyBzZWN0aW9uLiAgKi8KKwkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7CisJfQorCisgICAgICAvKiBJZiB0aGUgU0VDX0FMTE9DIGZsYWcgaXMgbm90IHNldCwgZm9yY2UgdGhlIHNlY3Rpb24gVk1BIHRvCisJIHplcm8uICBUaGlzIGlzIGRvbmUgaW4gZWxmX2Zha2Vfc2VjdGlvbnMgYXMgd2VsbCwgYnV0IGZvcmNpbmcKKwkgdGhlIFZNQSB0byAwIGhlcmUgd2lsbCBlbnN1cmUgdGhhdCByZWxvY3MgYWdhaW5zdCB0aGVzZQorCSBzZWN0aW9ucyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMAorCSAgJiYgISBvLT51c2VyX3NldF92bWEpCisJby0+dm1hID0gMDsKKyAgICB9CisKKyAgLyogRmlndXJlIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBzeW1ib2wgdGFibGUKKyAgICAgYW5kIHRoZSByZWxvY3MuICBXZSBzZXQgc3ltY291bnQgdG8gZm9yY2UgYXNzaWduX3NlY3Rpb25fbnVtYmVycworICAgICB0byBjcmVhdGUgYSBzeW1ib2wgdGFibGUuICAqLworICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCA/IDAgOiAxOworICBCRkRfQVNTRVJUICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOworICBpZiAoISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQsIGluZm8pKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFRoYXQgY3JlYXRlZCB0aGUgcmVsb2Mgc2VjdGlvbnMuICBTZXQgdGhlaXIgc2l6ZXMsIGFuZCBhc3NpZ24KKyAgICAgdGhlbSBmaWxlIHBvc2l0aW9ucywgYW5kIGFsbG9jYXRlIHNvbWUgYnVmZmVycy4gICovCisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisJeworCSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7CisJICByZWdpc3RlciBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnAsICoqcGVuZDsKKworCSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKKworCSAgcmVsX2hkci0+c2hfc2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemUgKiBvLT5yZWxvY19jb3VudDsKKworCSAgLyogVGhlIGNvbnRlbnRzIGZpZWxkIG11c3QgbGFzdCBpbnRvIHdyaXRlX29iamVjdF9jb250ZW50cywKKwkgICAgIHNvIHdlIGFsbG9jYXRlIGl0IHdpdGggYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYy4gICovCisJICByZWxfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsX2hkci0+c2hfc2l6ZSk7CisJICBpZiAocmVsX2hkci0+Y29udGVudHMgPT0gTlVMTCAmJiByZWxfaGRyLT5zaF9zaXplICE9IDApCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBwID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKKwkgICAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOworCSAgaWYgKHAgPT0gTlVMTCAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzID0gcDsKKwkgIHBlbmQgPSBwICsgby0+cmVsb2NfY291bnQ7CisJICBmb3IgKDsgcCA8IHBlbmQ7IHArKykKKwkgICAgKnAgPSBOVUxMOworCisJICAvKiBVc2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGFuIGluZGV4IHdoZW4gb3V0cHV0dGluZyB0aGUKKwkgICAgIHJlbG9jcy4gICovCisJICBvLT5yZWxvY19jb3VudCA9IDA7CisJfQorICAgIH0KKworICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7CisKKyAgLyogV2UgaGF2ZSBub3cgYXNzaWduZWQgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMgZXhjZXB0CisgICAgIC5zeW10YWIgYW5kIC5zdHJ0YWIuICBXZSBzdGFydCB0aGUgLnN5bXRhYiBzZWN0aW9uIGF0IHRoZSBjdXJyZW50CisgICAgIGZpbGUgcG9zaXRpb24sIGFuZCB3cml0ZSBkaXJlY3RseSB0byBpdC4gIFdlIGJ1aWxkIHRoZSAuc3RydGFiCisgICAgIHNlY3Rpb24gaW4gbWVtb3J5LiAgKi8KKyAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOworICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7CisgIC8qIHNoX25hbWUgaXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCisgIHN5bXRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1lNVEFCOworICBzeW10YWJfaGRyLT5zaF9mbGFncyA9IDA7CisgIHN5bXRhYl9oZHItPnNoX2FkZHIgPSAwOworICBzeW10YWJfaGRyLT5zaF9zaXplID0gMDsKKyAgc3ltdGFiX2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7CisgIC8qIHNoX2xpbmsgaXMgc2V0IGluIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuICAqLworICAvKiBzaF9pbmZvIGlzIHNldCBiZWxvdy4gICovCisgIC8qIHNoX29mZnNldCBpcyBzZXQganVzdCBiZWxvdy4gICovCisgIHN5bXRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDQ7ICAvKiBGSVhNRTogc3lzdGVtIGRlcGVuZGVudD8gICovCisKKyAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKKyAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHN5bXRhYl9oZHIsIG9mZiwgdHJ1ZSk7CisKKyAgLyogTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyBpcworICAgICBpbmNvcnJlY3QuICBXZSBkbyBub3QgeWV0IGtub3cgdGhlIHNpemUgb2YgdGhlIC5zeW10YWIgc2VjdGlvbi4KKyAgICAgV2UgY29ycmVjdCBuZXh0X2ZpbGVfcG9zIGJlbG93LCBhZnRlciB3ZSBkbyBrbm93IHRoZSBzaXplLiAgKi8KKworICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIHN3YXBwZWQgb3V0IHN5bWJvbHMuICBUaGlzIGlzIHRvIGF2b2lkCisgICAgIGNvbnRpbnVvdXNseSBzZWVraW5nIHRvIHRoZSByaWdodCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4gICovCisgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8IG1heF9zeW1fY291bnQgPCAyMCkKKyAgICBmaW5mby5zeW1idWZfc2l6ZSA9IDIwOworICBlbHNlCisgICAgZmluZm8uc3ltYnVmX3NpemUgPSBtYXhfc3ltX2NvdW50OworICBmaW5mby5zeW1idWYgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKKwkJICBiZmRfbWFsbG9jIChmaW5mby5zeW1idWZfc2l6ZSAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKKyAgaWYgKGZpbmZvLnN5bWJ1ZiA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IHRoZSBzeW1ib2wgdGFibGUuICBUaGUgZmlyc3Qgc3ltYm9sIGlzIGFsd2F5cyBhCisgICAgIGR1bW15IHN5bWJvbC4gICovCisgIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHsKKyAgICAgIGVsZnN5bS5zdF92YWx1ZSA9IDA7CisgICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7CisgICAgICBlbGZzeW0uc3RfaW5mbyA9IDA7CisgICAgICBlbGZzeW0uc3Rfb3RoZXIgPSAwOworICAgICAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOworICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJCSAmZWxmc3ltLCBiZmRfdW5kX3NlY3Rpb25fcHRyKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyNpZiAwCisgIC8qIFNvbWUgc3RhbmRhcmQgRUxGIGxpbmtlcnMgZG8gdGhpcywgYnV0IHdlIGRvbid0IGJlY2F1c2UgaXQgY2F1c2VzCisgICAgIGJvb3RzdHJhcCBjb21wYXJpc29uIGZhaWx1cmVzLiAgKi8KKyAgLyogT3V0cHV0IGEgZmlsZSBzeW1ib2wgZm9yIHRoZSBvdXRwdXQgZmlsZSBhcyB0aGUgc2Vjb25kIHN5bWJvbC4KKyAgICAgV2Ugb3V0cHV0IHRoaXMgZXZlbiBpZiB3ZSBhcmUgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBhbHRob3VnaAorICAgICBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0LiAgKi8KKyAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKKyAgZWxmc3ltLnN0X3NpemUgPSAwOworICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKKyAgZWxmc3ltLnN0X290aGVyID0gMDsKKyAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX0FCUzsKKyAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkJCSAgICAgJmVsZnN5bSwgYmZkX2Fic19zZWN0aW9uX3B0cikpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisjZW5kaWYKKworICAvKiBPdXRwdXQgYSBzeW1ib2wgZm9yIGVhY2ggc2VjdGlvbi4gIFdlIG91dHB1dCB0aGVzZSBldmVuIGlmIHdlIGFyZQorICAgICBkaXNjYXJkaW5nIGxvY2FsIHN5bWJvbHMsIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIHJlbG9jcy4gIFRoZXNlCisgICAgIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gIFdlIHN0b3JlIHRoZSBpbmRleCBvZiBlYWNoIG9uZSBpbiB0aGUKKyAgICAgaW5kZXggZmllbGQgb2YgdGhlIHNlY3Rpb24sIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQgYWdhaW4gd2hlbgorICAgICBvdXRwdXR0aW5nIHJlbG9jcy4gICovCisgIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHsKKyAgICAgIGVsZnN5bS5zdF9zaXplID0gMDsKKyAgICAgIGVsZnN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOworICAgICAgZWxmc3ltLnN0X290aGVyID0gMDsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsgaSsrKQorCXsKKwkgIG8gPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpKTsKKwkgIGlmIChvICE9IE5VTEwpCisJICAgIG8tPnRhcmdldF9pbmRleCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworCSAgZWxmc3ltLnN0X3NobmR4ID0gaTsKKwkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgbyA9PSBOVUxMKQorCSAgICBlbGZzeW0uc3RfdmFsdWUgPSAwOworCSAgZWxzZQorCSAgICBlbGZzeW0uc3RfdmFsdWUgPSBvLT52bWE7CisJICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltICgmZmluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJICAgICAmZWxmc3ltLCBvKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJfQorICAgIH0KKworICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIGluZm9ybWF0aW9uIHJlYWQgaW4gZnJvbSB0aGUgaW5wdXQKKyAgICAgZmlsZXMuICAqLworICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7CisgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKG1heF9leHRlcm5hbF9yZWxvY19zaXplKTsKKyAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gKChFbGZfSW50ZXJuYWxfUmVsYSAqKQorCQkJICAgYmZkX21hbGxvYyAobWF4X2ludGVybmFsX3JlbG9jX2NvdW50CisJCQkJICAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpKTsKKyAgZmluZm8uZXh0ZXJuYWxfc3ltcyA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQorCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKKwkJCQkgICAgICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOworICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCisJCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAorCQkJCSAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7CisgIGZpbmZvLmluZGljZXMgPSAobG9uZyAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChsb25nKSk7CisgIGZpbmZvLnNlY3Rpb25zID0gKChhc2VjdGlvbiAqKikKKwkJICAgIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7CisgIGlmICgoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSAhPSAwKQorICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9leHRlcm5hbF9yZWxvY19zaXplICE9IDApCisgICAgICB8fCAoZmluZm8uaW50ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ICE9IDApCisgICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKKyAgICAgIHx8IChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQorICAgICAgfHwgKGZpbmZvLmluZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCisgICAgICB8fCAoZmluZm8uc2VjdGlvbnMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFNpbmNlIEVMRiBwZXJtaXRzIHJlbG9jYXRpb25zIHRvIGJlIGFnYWluc3QgbG9jYWwgc3ltYm9scywgd2UKKyAgICAgbXVzdCBoYXZlIHRoZSBsb2NhbCBzeW1ib2xzIGF2YWlsYWJsZSB3aGVuIHdlIGRvIHRoZSByZWxvY2F0aW9ucy4KKyAgICAgU2luY2Ugd2Ugd291bGQgcmF0aGVyIG9ubHkgcmVhZCB0aGUgbG9jYWwgc3ltYm9scyBvbmNlLCBhbmQgd2UKKyAgICAgd291bGQgcmF0aGVyIG5vdCBrZWVwIHRoZW0gaW4gbWVtb3J5LCB3ZSBoYW5kbGUgYWxsIHRoZQorICAgICByZWxvY2F0aW9ucyBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCB0aGUgc2FtZSB0aW1lLgorCisgICAgIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHRoZSB0b3RhbCBudW1iZXIgb2YgbG9jYWwKKyAgICAgc3ltYm9scyB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIG9mIHRoZW0sIGFuZCB0aGUgbG9jYWwgc3ltYm9sCisgICAgIGluZGljZXMgcHJlY2VkZSB0aGUgZ2xvYmFsIHN5bWJvbCBpbmRpY2VzLiAgVGhpcyBtZWFucyB0aGF0IHdoZW4KKyAgICAgd2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHdlIHNlZSBhIHJlbG9jIGFnYWluc3QKKyAgICAgYSBnbG9iYWwgc3ltYm9sLCB3ZSBjYW4gbm90IGtub3cgdGhlIHN5bWJvbCBpbmRleCB1bnRpbCB3ZSBoYXZlCisgICAgIGZpbmlzaGVkIGV4YW1pbmluZyBhbGwgdGhlIGxvY2FsIHN5bWJvbHMgdG8gc2VlIHdoaWNoIG9uZXMgd2UgYXJlCisgICAgIGdvaW5nIHRvIG91dHB1dC4gIFRvIGRlYWwgd2l0aCB0aGlzLCB3ZSBrZWVwIHRoZSByZWxvY2F0aW9ucyBpbgorICAgICBtZW1vcnksIGFuZCBkb24ndCBvdXRwdXQgdGhlbSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyBpcworICAgICBhbiB1bmZvcnR1bmF0ZSB3YXN0ZSBvZiBtZW1vcnksIGJ1dCBJIGRvbid0IHNlZSBhIGdvb2Qgd2F5IGFyb3VuZAorICAgICBpdC4gIEZvcnR1bmF0ZWx5LCBpdCBvbmx5IGhhcHBlbnMgd2hlbiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlCisgICAgIGxpbmssIHdoaWNoIGlzIG5vdCB0aGUgY29tbW9uIGNhc2UuICBGSVhNRTogSWYga2VlcF9tZW1vcnkgaXMgc2V0CisgICAgIHdlIGNvdWxkIHdyaXRlIHRoZSByZWxvY3Mgb3V0IGFuZCB0aGVuIHJlYWQgdGhlbSBhZ2FpbjsgSSBkb24ndAorICAgICBrbm93IGhvdyBiYWQgdGhlIG1lbW9yeSBsb3NzIHdpbGwgYmUuICAqLworCisgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQorICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJeworCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKKwkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQorCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQorCSAgICB7CisJICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKKwkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4pCisJCXsKKwkJICBpZiAoISBlbGZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQorCSAgICB7CisJICAgICAgaWYgKCEgZWxmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogVGhhdCB3cm90ZSBvdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLiAgRmluaXNoIHVwIHRoZSBzeW1ib2wgdGFibGUKKyAgICAgd2l0aCB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLworCisgIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c2hhcmVkKQorICAgIHsKKyAgICAgIC8qIE91dHB1dCBhbnkgZ2xvYmFsIHN5bWJvbHMgdGhhdCBnb3QgY29udmVydGVkIHRvIGxvY2FsIGluIGEKKyAgICAgICAgIHZlcnNpb24gc2NyaXB0LiAgV2UgZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHN0ZXAgc2luY2UgRUxGCisgICAgICAgICByZXF1aXJlcyBhbGwgbG9jYWwgc3ltYm9scyB0byBhcHBlYXIgcHJpb3IgdG8gYW55IGdsb2JhbAorICAgICAgICAgc3ltYm9scy4gIEZJWE1FOiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHNvbWUgZ2xvYmFsCisgICAgICAgICBzeW1ib2xzIHdlcmUsIGluIGZhY3QsIGNvbnZlcnRlZCB0byBiZWNvbWUgbG9jYWwuICBGSVhNRToKKyAgICAgICAgIFdpbGwgdGhpcyB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBJcml4IDUgbGlua2VyPyAgKi8KKyAgICAgIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKKyAgICAgIGVvaW5mby5maW5mbyA9ICZmaW5mbzsKKyAgICAgIGVvaW5mby5sb2NhbHN5bXMgPSB0cnVlOworICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfbGlua19vdXRwdXRfZXh0c3ltLAorCQkJICAgICAgKFBUUikgJmVvaW5mbyk7CisgICAgICBpZiAoZW9pbmZvLmZhaWxlZCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIHJlY29yZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gbG9jYWwKKyAgICAgc3ltYm9sLiAgKi8KKyAgc3ltdGFiX2hkci0+c2hfaW5mbyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICBpZiAoZHluYW1pYykKKyAgICBlbGZfc2VjdGlvbl9kYXRhIChmaW5mby5keW5zeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSAxOworCisgIC8qIFdlIGdldCB0aGUgZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCisgIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKKyAgZW9pbmZvLmxvY2Fsc3ltcyA9IGZhbHNlOworICBlb2luZm8uZmluZm8gPSAmZmluZm87CisgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSwKKwkJCSAgKFBUUikgJmVvaW5mbyk7CisgIGlmIChlb2luZm8uZmFpbGVkKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBGbHVzaCBhbGwgc3ltYm9scyB0byB0aGUgZmlsZS4gICovCisgIGlmICghIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zICgmZmluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOb3cgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltdGFiIHNlY3Rpb24uICAqLworICBvZmYgKz0gc3ltdGFiX2hkci0+c2hfc2l6ZTsKKworICAvKiBGaW5pc2ggdXAgYW5kIHdyaXRlIG91dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZSAoLnN0cnRhYikKKyAgICAgc2VjdGlvbi4gICovCisgIHN5bXN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKKyAgLyogc2hfbmFtZSB3YXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCisgIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOworICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7CisgIHN5bXN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOworICBzeW1zdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3ltc3RydGFiKTsKKyAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7CisgIHN5bXN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOworICBzeW1zdHJ0YWJfaGRyLT5zaF9pbmZvID0gMDsKKyAgLyogc2hfb2Zmc2V0IGlzIHNldCBqdXN0IGJlbG93LiAgKi8KKyAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKKworICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc3ltc3RydGFiX2hkciwgb2ZmLCB0cnVlKTsKKyAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKKworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQorICAgIHsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltc3RydGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zeW1zdHJ0YWIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogQWRqdXN0IHRoZSByZWxvY3MgdG8gaGF2ZSB0aGUgY29ycmVjdCBzeW1ib2wgaW5kaWNlcy4gICovCisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7CisgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKKworICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgcmVsX2hhc2ggPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlczsKKyAgICAgIHJlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsX2hhc2grKykKKwl7CisJICBpZiAoKnJlbF9oYXNoID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKKworCSAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKKwkgICAgeworCSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7CisJICAgICAgRWxmX0ludGVybmFsX1JlbCBpcmVsOworCisJICAgICAgZXJlbCA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzICsgaTsKKwkgICAgICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOworCSAgICAgIGlyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCisJCQkJCUVMRl9SX1RZUEUgKGlyZWwucl9pbmZvKSk7CisJICAgICAgZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaXJlbCwgZXJlbCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKKworCSAgICAgIEJGRF9BU1NFUlQgKHJlbF9oZHItPnNoX2VudHNpemUKKwkJCSAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOworCisJICAgICAgZXJlbGEgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgcmVsX2hkci0+Y29udGVudHMgKyBpOworCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgZXJlbGEsICZpcmVsYSk7CisJICAgICAgaXJlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCisJCQkJCSBFTEZfUl9UWVBFIChpcmVsYS5yX2luZm8pKTsKKwkgICAgICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmaXJlbGEsIGVyZWxhKTsKKwkgICAgfQorCX0KKworICAgICAgLyogU2V0IHRoZSByZWxvY19jb3VudCBmaWVsZCB0byAwIHRvIHByZXZlbnQgd3JpdGVfcmVsb2NzIGZyb20KKwkgdHJ5aW5nIHRvIHN3YXAgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLiAgKi8KKyAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKKyAgICB9CisKKyAgLyogSWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LCBvciBnZW5lcmF0aW5nIGEKKyAgICAgc2hhcmVkIGxpYnJhcnksIGZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGR5bmFtaWMpCisgICAgeworICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOworCisgICAgICAvKiBGaXggdXAgLmR5bmFtaWMgZW50cmllcy4gICovCisgICAgICBvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7CisgICAgICBCRkRfQVNTRVJUIChvICE9IE5VTEwpOworCisgICAgICBkeW5jb24gPSAoRWxmX0V4dGVybmFsX0R5biAqKSBvLT5jb250ZW50czsKKyAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChvLT5jb250ZW50cyArIG8tPl9yYXdfc2l6ZSk7CisgICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKKwl7CisJICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKKwkgIGNvbnN0IGNoYXIgKm5hbWU7CisJICB1bnNpZ25lZCBpbnQgdHlwZTsKKworCSAgZWxmX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7CisKKwkgIHN3aXRjaCAoZHluLmRfdGFnKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgICAvKiBTVlI0IGxpbmtlcnMgc2VlbSB0byBzZXQgRFRfSU5JVCBhbmQgRFRfRklOSSBiYXNlZCBvbgorICAgICAgICAgICAgICAgICBtYWdpYyBfaW5pdCBhbmQgX2Zpbmkgc3ltYm9scy4gIFRoaXMgaXMgcHJldHR5IHVnbHksCisgICAgICAgICAgICAgICAgIGJ1dCB3ZSBhcmUgY29tcGF0aWJsZS4gICovCisJICAgIGNhc2UgRFRfSU5JVDoKKwkgICAgICBuYW1lID0gIl9pbml0IjsKKwkgICAgICBnb3RvIGdldF9zeW07CisJICAgIGNhc2UgRFRfRklOSToKKwkgICAgICBuYW1lID0gIl9maW5pIjsKKwkgICAgZ2V0X3N5bToKKwkgICAgICB7CisJCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworCisJCWggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAorCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCWlmIChoICE9IE5VTEwKKwkJICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwkJICB7CisJCSAgICBkeW4uZF91bi5kX3ZhbCA9IGgtPnJvb3QudS5kZWYudmFsdWU7CisJCSAgICBvID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkgICAgaWYgKG8tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisJCSAgICAgIGR5bi5kX3VuLmRfdmFsICs9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJCSArIG8tPm91dHB1dF9vZmZzZXQpOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQkvKiBUaGUgc3ltYm9sIGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBzaGFyZWQKKwkJCSAgIGxpYnJhcnkgYW5kIGRvZXMgbm90IGFwcGx5IHRvIHRoaXMgb25lLiAgKi8KKwkJCWR5bi5kX3VuLmRfdmFsID0gMDsKKwkJICAgICAgfQorCisJCSAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIERUX0hBU0g6CisJICAgICAgbmFtZSA9ICIuaGFzaCI7CisJICAgICAgZ290byBnZXRfdm1hOworCSAgICBjYXNlIERUX1NUUlRBQjoKKwkgICAgICBuYW1lID0gIi5keW5zdHIiOworCSAgICAgIGdvdG8gZ2V0X3ZtYTsKKwkgICAgY2FzZSBEVF9TWU1UQUI6CisJICAgICAgbmFtZSA9ICIuZHluc3ltIjsKKwkgICAgICBnb3RvIGdldF92bWE7CisJICAgIGNhc2UgRFRfVkVSREVGOgorCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX2QiOworCSAgICAgIGdvdG8gZ2V0X3ZtYTsKKwkgICAgY2FzZSBEVF9WRVJORUVEOgorCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX3IiOworCSAgICAgIGdvdG8gZ2V0X3ZtYTsKKwkgICAgY2FzZSBEVF9WRVJTWU06CisJICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb24iOworCSAgICBnZXRfdm1hOgorCSAgICAgIG8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7CisJICAgICAgQkZEX0FTU0VSVCAobyAhPSBOVUxMKTsKKwkgICAgICBkeW4uZF91bi5kX3B0ciA9IG8tPnZtYTsKKwkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBEVF9SRUw6CisJICAgIGNhc2UgRFRfUkVMQToKKwkgICAgY2FzZSBEVF9SRUxTWjoKKwkgICAgY2FzZSBEVF9SRUxBU1o6CisJICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9SRUwgfHwgZHluLmRfdGFnID09IERUX1JFTFNaKQorCQl0eXBlID0gU0hUX1JFTDsKKwkgICAgICBlbHNlCisJCXR5cGUgPSBTSFRfUkVMQTsKKwkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDA7CisJICAgICAgZm9yIChpID0gMTsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOyBpKyspCisJCXsKKwkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOworCisJCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsKKwkJICBpZiAoaGRyLT5zaF90eXBlID09IHR5cGUKKwkJICAgICAgJiYgKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCisJCSAgICB7CisJCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUkVMU1ogfHwgZHluLmRfdGFnID09IERUX1JFTEFTWikKKwkJCWR5bi5kX3VuLmRfdmFsICs9IGhkci0+c2hfc2l6ZTsKKwkJICAgICAgZWxzZQorCQkJeworCQkJICBpZiAoZHluLmRfdW4uZF92YWwgPT0gMAorCQkJICAgICAgfHwgaGRyLT5zaF9hZGRyIDwgZHluLmRfdW4uZF92YWwpCisJCQkgICAgZHluLmRfdW4uZF92YWwgPSBoZHItPnNoX2FkZHI7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhbnkgZHluYW1pYyBzZWN0aW9ucywgdGhlbiBvdXRwdXQgdGhlbS4gICovCisgIGlmIChkeW5vYmogIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKwl7CisJICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAorCSAgICAgIHx8IG8tPl9yYXdfc2l6ZSA9PSAwKQorCSAgICBjb250aW51ZTsKKwkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCisJICAgIHsKKwkgICAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHNlY3Rpb25zCisgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBpZiAoKGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfdHlwZQorCSAgICAgICAhPSBTSFRfU1RSVEFCKQorCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCAiLmR5bnN0ciIpICE9IDApCisJICAgIHsKKwkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAorCQkJCQkgICAgICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKKwkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZpbGVfcHRyIG9mZjsKKworCSAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLmR5bnN0ciBzZWN0aW9uIGFyZSBhY3R1YWxseSBpbiBhCisgICAgICAgICAgICAgICAgIHN0cmluZ3RhYi4gICovCisJICAgICAgb2ZmID0gZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9vZmZzZXQ7CisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwCisJCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLAorCQkJCQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSWYgd2UgaGF2ZSBvcHRpbWl6ZWQgc3RhYnMgc3RyaW5ncywgb3V0cHV0IHRoZW0uICAqLworICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQorICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7CisgIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKKyAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7CisgIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOworICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOworICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOworICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOworICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7CisgIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5zeW1idWYpOworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCisJICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQorCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKKyAgICB9CisKKyAgZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQorICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7CisgIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKKyAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7CisgIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOworICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOworICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOworICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOworICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7CisgIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5zeW1idWYpOworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCisJICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQorCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBBZGQgYSBzeW1ib2wgdG8gdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKQorICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmVsZnN5bTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlYzsKK3sKKyAgYm9vbGVhbiAoKm91dHB1dF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosCisJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKwkJCQkJIGNvbnN0IGNoYXIgKiwKKwkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKiwKKwkJCQkJIGFzZWN0aW9uICopKTsKKworICBvdXRwdXRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT4KKyAgICBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vazsKKyAgaWYgKG91dHB1dF9zeW1ib2xfaG9vayAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghICgoKm91dHB1dF9zeW1ib2xfaG9vaykKKwkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCisgICAgZWxmc3ltLT5zdF9uYW1lID0gMDsKKyAgZWxzZSBpZiAoaW5wdXRfc2VjLT5mbGFncyAmIFNFQ19FWENMVURFKQorICAgIGVsZnN5bS0+c3RfbmFtZSA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBlbGZzeW0tPnN0X25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3ltc3RydGFiLAorCQkJCQkJCSAgICBuYW1lLCB0cnVlLAorCQkJCQkJCSAgICBmYWxzZSk7CisgICAgICBpZiAoZWxmc3ltLT5zdF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID49IGZpbmZvLT5zeW1idWZfc2l6ZSkKKyAgICB7CisgICAgICBpZiAoISBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoZmluZm8pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZWxmX3N3YXBfc3ltYm9sX291dCAoZmluZm8tPm91dHB1dF9iZmQsIGVsZnN5bSwKKwkJICAgICAgIChQVFIpIChmaW5mby0+c3ltYnVmICsgZmluZm8tPnN5bWJ1Zl9jb3VudCkpOworICArK2ZpbmZvLT5zeW1idWZfY291bnQ7CisKKyAgKysgYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGbHVzaCB0aGUgb3V0cHV0IHN5bWJvbHMgdG8gdGhlIGZpbGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKGZpbmZvKQorICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Cit7CisgIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiOworCisgICAgICBzeW10YWIgPSAmZWxmX3RkYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnN5bXRhYl9oZHI7CisKKyAgICAgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsIHN5bXRhYi0+c2hfb2Zmc2V0ICsgc3ltdGFiLT5zaF9zaXplLAorCQkgICAgU0VFS19TRVQpICE9IDAKKwkgIHx8IChiZmRfd3JpdGUgKChQVFIpIGZpbmZvLT5zeW1idWYsIGZpbmZvLT5zeW1idWZfY291bnQsCisJCQkgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZmluZm8tPm91dHB1dF9iZmQpCisJICAgICAgIT0gZmluZm8tPnN5bWJ1Zl9jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgc3ltdGFiLT5zaF9zaXplICs9IGZpbmZvLT5zeW1idWZfY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOworCisgICAgICBmaW5mby0+c3ltYnVmX2NvdW50ID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhbiBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIGZyb20KKyAgIHRoZSBoYXNoIHRhYmxlIHRyYXZlcnNhbCByb3V0aW5lLiAgV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwKKyAgIHdlIGdvIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIG91dHB1dAorICAgYW55dGhpbmcgdGhhdCBtaWdodCBoYXZlIGJlZW4gZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGluIGEgdmVyc2lvbgorICAgc2NyaXB0LiAgVGhlIHNlY29uZCB0aW1lIHdlIG91dHB1dCB0aGUgc3ltYm9scyB0aGF0IGFyZSBzdGlsbAorICAgZ2xvYmFsIHN5bWJvbHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvICplb2luZm8gPSAoc3RydWN0IGVsZl9vdXRleHRfaW5mbyAqKSBkYXRhOworICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSBlb2luZm8tPmZpbmZvOworICBib29sZWFuIHN0cmlwOworICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKKyAgYXNlY3Rpb24gKmlucHV0X3NlYzsKKworICAvKiBEZWNpZGUgd2hldGhlciB0byBvdXRwdXQgdGhpcyBzeW1ib2wgaW4gdGhpcyBwYXNzLiAgKi8KKyAgaWYgKGVvaW5mby0+bG9jYWxzeW1zKQorICAgIHsKKyAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgPT0gMCkKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCisJcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIElmIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgc3ltYm9sIGlzCisgICAgIHJlZmVyZW5jZWQgYnkgYSBzaGFyZWQgbGlicmFyeSBidXQgaXMgbm90IGRlZmluZWQgYW55d2hlcmUsIHRoZW4KKyAgICAgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4gIElmIHdlIGRvIG5vdCBkbyB0aGlzLCB0aGUgcnVudGltZQorICAgICBsaW5rZXIgd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIHdoZW4gdGhlCisgICAgIHByb2dyYW0gaXMgcnVuLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzeW1ib2xzIHRoYXQgYXJlCisgICAgIHJlZmVyZW5jZWQgYnkgcmVndWxhciBmaWxlcywgYmVjYXVzZSB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBpc3N1ZWQKKyAgICAgd2FybmluZ3MgZm9yIHRoZW0uICAqLworICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCisgICAgICAmJiAhIChmaW5mby0+aW5mby0+c2hhcmVkCisJICAgICYmICFmaW5mby0+aW5mby0+c3ltYm9saWMKKwkgICAgJiYgIWZpbmZvLT5pbmZvLT5ub191bmRlZmluZWQpCisgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKyAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMAorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJICAgICAoZmluZm8tPmluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS51bmRlZi5hYmZkLAorCSAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAwKSkpCisJeworCSAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgc3ltYm9scyB0aGF0IGhhdmUgbmV2ZXIgYmVlbiBtZW50aW9uZWQgYnkKKyAgICAgYSByZWd1bGFyIGZpbGUsIG9yIHRoYXQgd2UgaGF2ZSBiZWVuIHRvbGQgdG8gc3RyaXAuICBIb3dldmVyLCBpZgorICAgICBoLT5pbmR4IGlzIHNldCB0byAtMiwgdGhlIHN5bWJvbCBpcyB1c2VkIGJ5IGEgcmVsb2MgYW5kIHdlIG11c3QKKyAgICAgb3V0cHV0IGl0LiAgKi8KKyAgaWYgKGgtPmluZHggPT0gLTIpCisgICAgc3RyaXAgPSBmYWxzZTsKKyAgZWxzZSBpZiAoKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAorCSAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDApCisJICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCisJICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQorICAgIHN0cmlwID0gdHJ1ZTsKKyAgZWxzZSBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAorCSAgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQorCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCisJCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywKKwkJCQkgICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKQorICAgIHN0cmlwID0gdHJ1ZTsKKyAgZWxzZQorICAgIHN0cmlwID0gZmFsc2U7CisKKyAgLyogSWYgd2UncmUgc3RyaXBwaW5nIGl0LCBhbmQgaXQncyBub3QgYSBkeW5hbWljIHN5bWJvbCwgdGhlcmUncworICAgICBub3RoaW5nIGVsc2UgdG8gZG8uICAqLworICBpZiAoc3RyaXAgJiYgaC0+ZHluaW5keCA9PSAtMSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzeW0uc3RfdmFsdWUgPSAwOworICBzeW0uc3Rfc2l6ZSA9IGgtPnNpemU7CisgIHN5bS5zdF9vdGhlciA9IGgtPm90aGVyOworICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCisgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBoLT50eXBlKTsKKyAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCisJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfV0VBSywgaC0+dHlwZSk7CisgIGVsc2UKKyAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBoLT50eXBlKTsKKworICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgorICAgICAgYWJvcnQgKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgorICAgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKyAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKKyAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgeworCWlucHV0X3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwlpZiAoaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQorCSAgeworCSAgICBzeW0uc3Rfc2huZHggPQorCSAgICAgIF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoZmluZm8tPm91dHB1dF9iZmQsCisJCQkJCQkgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbik7CisJICAgIGlmIChzeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkgICAgICB7CisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgIChfKCIlczogY291bGQgbm90IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXMgZm9yIGlucHV0IHNlY3Rpb24gJXMiKSwKKwkJICAgYmZkX2dldF9maWxlbmFtZSAoZmluZm8tPm91dHB1dF9iZmQpLAorCQkgICBpbnB1dF9zZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLAorCQkgICBpbnB1dF9zZWMtPm5hbWUpOworCQllb2luZm8tPmZhaWxlZCA9IHRydWU7CisJCXJldHVybiBmYWxzZTsKKwkgICAgICB9CisKKwkgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLAorCSAgICAgICBidXQgaW4gbm9ucmVsb2NhdGVhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwKKwkgICAgICAgYWRkcmVzc2VzLiAgKi8KKwkgICAgc3ltLnN0X3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZSArIGlucHV0X3NlYy0+b3V0cHV0X29mZnNldDsKKwkgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKKwkgICAgICBzeW0uc3RfdmFsdWUgKz0gaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjLT5vd25lciA9PSBOVUxMCisJCQl8fCAoaW5wdXRfc2VjLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKTsKKwkgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOworCSAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgorICAgICAgaW5wdXRfc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKyAgICAgIHN5bS5zdF9zaG5keCA9IFNITl9DT01NT047CisgICAgICBzeW0uc3RfdmFsdWUgPSAxIDw8IGgtPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgorICAgICAgLyogVGhlc2Ugc3ltYm9scyBhcmUgY3JlYXRlZCBieSBzeW1ib2wgdmVyc2lvbmluZy4gIFRoZXkgcG9pbnQKKyAgICAgICAgIHRvIHRoZSBkZWNvcmF0ZWQgdmVyc2lvbiBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBpZiB0aGUKKyAgICAgICAgIHN5bWJvbCBmb29AQEdOVV8xLjIgaXMgdGhlIGRlZmF1bHQsIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4KKyAgICAgICAgIGZvbyBpcyB1c2VkIHdpdGggbm8gdmVyc2lvbiwgdGhlbiB3ZSBhZGQgYW4gaW5kaXJlY3Qgc3ltYm9sCisgICAgICAgICBmb28gd2hpY2ggcG9pbnRzIHRvIGZvb0BAR05VXzEuMi4gIFdlIGlnbm9yZSB0aGVzZSBzeW1ib2xzLAorICAgICAgICAgc2luY2UgdGhlIGluZGlyZWN0ZWQgc3ltYm9sIGlzIGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUuICBJZgorICAgICAgICAgdGhlIGluZGlyZWN0IHN5bWJvbCBpcyBub24tRUxGLCBmYWxsIHRocm91Z2ggYW5kIG91dHB1dCBpdC4gICovCisgICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19OT05fRUxGKSA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgorICAgICAgLyogV2UgY2FuJ3QgcmVwcmVzZW50IHRoZXNlIHN5bWJvbHMgaW4gRUxGLCBhbHRob3VnaCBhIHdhcm5pbmcKKyAgICAgICAgIHN5bWJvbCBtYXkgaGF2ZSBjb21lIGZyb20gYSAuZ251Lndhcm5pbmcuU1lNQk9MIHNlY3Rpb24uICBXZQorICAgICAgICAganVzdCBwdXQgdGhlIHRhcmdldCBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICBJZiB0aGUgdGFyZ2V0CisgICAgICAgICBzeW1ib2wgZG9lcyBub3QgcmVhbGx5IGV4aXN0LCBkb24ndCBkbyBhbnl0aGluZy4gICovCisgICAgICBpZiAoaC0+cm9vdC51LmkubGluay0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQorCSAgICAgICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluaywgZGF0YSkpOworICAgIH0KKworICAvKiBHaXZlIHRoZSBwcm9jZXNzb3IgYmFja2VuZCBhIGNoYW5jZSB0byB0d2VhayB0aGUgc3ltYm9sIHZhbHVlLAorICAgICBhbmQgYWxzbyB0byBmaW5pc2ggdXAgYW55dGhpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciB0aGlzCisgICAgIHN5bWJvbC4gICovCisgIGlmICgoaC0+ZHluaW5keCAhPSAtMQorICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQorICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQ7CisKKyAgICAgIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCk7CisgICAgICBpZiAoISAoKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCkKKwkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGgsICZzeW0pKSkKKwl7CisJICBlb2luZm8tPmZhaWxlZCA9IHRydWU7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBhcmUgbWFya2luZyB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgYW5kIHRoZXJlIGFyZSBubworICAgICBub24td2VhayByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sIGZyb20gYSByZWd1bGFyIG9iamVjdCwgdGhlbgorICAgICBtYXJrIHRoZSBzeW1ib2wgYXMgd2VhayB1bmRlZmluZWQuICBXZSBjYW4ndCBkbyB0aGlzIGVhcmxpZXIsCisgICAgIGJlY2F1c2UgaXQgbWlnaHQgbm90IGJlIG1hcmtlZCBhcyB1bmRlZmluZWQgdW50aWwgdGhlCisgICAgIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lIGdldHMgdGhyb3VnaCB3aXRoIGl0LiAgKi8KKyAgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYKKyAgICAgICYmIHN5bS5zdF9pbmZvID09IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBoLT50eXBlKQorICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCisgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykgPT0gMCkKKyAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfV0VBSywgaC0+dHlwZSk7CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIHB1dCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLCB0aGVuIHB1dCBpdAorICAgICB0aGVyZSBub3cuICBXZSBoYXZlIGFscmVhZHkga25vdyB0aGUgc3ltYm9sIGluZGV4LiAgV2UgYWxzbyBmaWxsCisgICAgIGluIHRoZSBlbnRyeSBpbiB0aGUgLmhhc2ggc2VjdGlvbi4gICovCisgIGlmIChoLT5keW5pbmR4ICE9IC0xCisgICAgICAmJiBlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCisgICAgeworICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50OworICAgICAgc2l6ZV90IGJ1Y2tldDsKKyAgICAgIGJmZF9ieXRlICpidWNrZXRwb3M7CisgICAgICBiZmRfdm1hIGNoYWluOworCisgICAgICBzeW0uc3RfbmFtZSA9IGgtPmR5bnN0cl9pbmRleDsKKworICAgICAgZWxmX3N3YXBfc3ltYm9sX291dCAoZmluZm8tPm91dHB1dF9iZmQsICZzeW0sCisJCQkgICAoUFRSKSAoKChFbGZfRXh0ZXJuYWxfU3ltICopCisJCQkJICAgZmluZm8tPmR5bnN5bV9zZWMtPmNvbnRlbnRzKQorCQkJCSAgKyBoLT5keW5pbmR4KSk7CisKKyAgICAgIGJ1Y2tldGNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+YnVja2V0Y291bnQ7CisgICAgICBidWNrZXQgPSBoLT5lbGZfaGFzaF92YWx1ZSAlIGJ1Y2tldGNvdW50OworICAgICAgYnVja2V0cG9zID0gKChiZmRfYnl0ZSAqKSBmaW5mby0+aGFzaF9zZWMtPmNvbnRlbnRzCisJCSAgICsgKGJ1Y2tldCArIDIpICogKEFSQ0hfU0laRSAvIDgpKTsKKyAgICAgIGNoYWluID0gZ2V0X3dvcmQgKGZpbmZvLT5vdXRwdXRfYmZkLCBidWNrZXRwb3MpOworICAgICAgcHV0X3dvcmQgKGZpbmZvLT5vdXRwdXRfYmZkLCBoLT5keW5pbmR4LCBidWNrZXRwb3MpOworICAgICAgcHV0X3dvcmQgKGZpbmZvLT5vdXRwdXRfYmZkLCBjaGFpbiwKKwkJKChiZmRfYnl0ZSAqKSBmaW5mby0+aGFzaF9zZWMtPmNvbnRlbnRzCisJCSArIChidWNrZXRjb3VudCArIDIgKyBoLT5keW5pbmR4KSAqIChBUkNIX1NJWkUgLyA4KSkpOworCisgICAgICBpZiAoZmluZm8tPnN5bXZlcl9zZWMgIT0gTlVMTCAmJiBmaW5mby0+c3ltdmVyX3NlYy0+Y29udGVudHMgIT0gTlVMTCkKKwl7CisJICBFbGZfSW50ZXJuYWxfVmVyc3ltIGl2ZXJzeW07CisKKwkgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoaC0+dmVyaW5mby52ZXJkZWYgPT0gTlVMTCkKKwkJaXZlcnN5bS52c192ZXJzID0gMDsKKwkgICAgICBlbHNlCisJCWl2ZXJzeW0udnNfdmVycyA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gKyAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwpCisJCWl2ZXJzeW0udnNfdmVycyA9IDE7CisJICAgICAgZWxzZQorCQlpdmVyc3ltLnZzX3ZlcnMgPSBoLT52ZXJpbmZvLnZlcnRyZWUtPnZlcm51bSArIDE7CisJICAgIH0KKworCSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSElEREVOKSAhPSAwKQorCSAgICBpdmVyc3ltLnZzX3ZlcnMgfD0gVkVSU1lNX0hJRERFTjsKKworCSAgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgJml2ZXJzeW0sCisJCQkJICAgICgoKEVsZl9FeHRlcm5hbF9WZXJzeW0gKikKKwkJCQkgICAgICBmaW5mby0+c3ltdmVyX3NlYy0+Y29udGVudHMpCisJCQkJICAgICArIGgtPmR5bmluZHgpKTsKKwl9CisgICAgfQorCisgIC8qIElmIHdlJ3JlIHN0cmlwcGluZyBpdCwgdGhlbiBpdCB3YXMganVzdCBhIGR5bmFtaWMgc3ltYm9sLCBhbmQKKyAgICAgdGhlcmUncyBub3RoaW5nIGVsc2UgdG8gZG8uICAqLworICBpZiAoc3RyaXApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaC0+aW5keCA9IGJmZF9nZXRfc3ltY291bnQgKGZpbmZvLT5vdXRwdXRfYmZkKTsKKworICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgJnN5bSwgaW5wdXRfc2VjKSkKKyAgICB7CisgICAgICBlb2luZm8tPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgorICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLgorICAgVGhpcyBpcyBzbyB0aGF0IHdlIG9ubHkgaGF2ZSB0byByZWFkIHRoZSBsb2NhbCBzeW1ib2xzIG9uY2UsIGFuZAorICAgZG9uJ3QgaGF2ZSB0byBrZWVwIHRoZW0gaW4gbWVtb3J5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKKyAgICAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOworICAgICBiZmQgKmlucHV0X2JmZDsKK3sKKyAgYm9vbGVhbiAoKnJlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkJCQkgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKiwKKwkJCQkgICAgICAgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOworICBiZmQgKm91dHB1dF9iZmQ7CisgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworICBzaXplX3QgbG9jc3ltY291bnQ7CisgIHNpemVfdCBleHRzeW1vZmY7CisgIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7CisgIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW07CisgIEVsZl9FeHRlcm5hbF9TeW0gKmVzeW1lbmQ7CisgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW07CisgIGxvbmcgKnBpbmRleDsKKyAgYXNlY3Rpb24gKipwcHNlY3Rpb247CisgIGFzZWN0aW9uICpvOworCisgIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKKyAgcmVsb2NhdGVfc2VjdGlvbiA9CisgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKG91dHB1dF9iZmQpLT5lbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uOworCisgIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBoZXJlOgorICAgICB3ZSBkb24ndCB3YW50IHRoZSBsb2NhbCBzeW1ib2xzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGUgc2VjdGlvbgorICAgICBjb250ZW50cy4gICovCisgIGlmICgoaW5wdXRfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7CisgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKKyAgICB7CisgICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOworICAgICAgZXh0c3ltb2ZmID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87CisgICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOworICAgIH0KKworICAvKiBSZWFkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KKyAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCisgICAgZXh0ZXJuYWxfc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOworICBlbHNlIGlmIChsb2NzeW1jb3VudCA9PSAwKQorICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgZXh0ZXJuYWxfc3ltcyA9IGZpbmZvLT5leHRlcm5hbF9zeW1zOworICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKKwkJCWxvY3N5bWNvdW50LCBpbnB1dF9iZmQpCisJICAgICAgIT0gbG9jc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFN3YXAgaW4gdGhlIGxvY2FsIHN5bWJvbHMgYW5kIHdyaXRlIG91dCB0aGUgb25lcyB3aGljaCB3ZSBrbm93CisgICAgIGFyZSBnb2luZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGVzeW0gPSBleHRlcm5hbF9zeW1zOworICBlc3ltZW5kID0gZXN5bSArIGxvY3N5bWNvdW50OworICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXM7CisgIHBpbmRleCA9IGZpbmZvLT5pbmRpY2VzOworICBwcHNlY3Rpb24gPSBmaW5mby0+c2VjdGlvbnM7CisgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpc3ltKyssIHBpbmRleCsrLCBwcHNlY3Rpb24rKykKKyAgICB7CisgICAgICBhc2VjdGlvbiAqaXNlYzsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBFbGZfSW50ZXJuYWxfU3ltIG9zeW07CisKKyAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltKTsKKyAgICAgICpwaW5kZXggPSAtMTsKKworICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpKQorCXsKKwkgIGlmIChFTEZfU1RfQklORCAoaXN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQorCSAgICB7CisJICAgICAgKnBwc2VjdGlvbiA9IE5VTEw7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCisJaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA+IDAgJiYgaXN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQorCWlzZWMgPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW0tPnN0X3NobmR4KTsKKyAgICAgIGVsc2UgaWYgKGlzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpCisJaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisgICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQorCWlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOworICAgICAgZWxzZQorCXsKKwkgIC8qIFdobyBrbm93cz8gICovCisJICBpc2VjID0gTlVMTDsKKwl9CisKKyAgICAgICpwcHNlY3Rpb24gPSBpc2VjOworCisgICAgICAvKiBEb24ndCBvdXRwdXQgdGhlIGZpcnN0LCB1bmRlZmluZWQsIHN5bWJvbC4gICovCisgICAgICBpZiAoZXN5bSA9PSBleHRlcm5hbF9zeW1zKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJZiB3ZSBhcmUgc3RyaXBwaW5nIGFsbCBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IHRvIG91dHB1dCB0aGlzCisJIG9uZS4gICovCisgICAgICBpZiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKKwljb250aW51ZTsKKworICAgICAgLyogV2UgbmV2ZXIgb3V0cHV0IHNlY3Rpb24gc3ltYm9scy4gIEluc3RlYWQsIHdlIHVzZSB0aGUgc2VjdGlvbgorCSBzeW1ib2wgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworICAgICAgaWYgKEVMRl9TVF9UWVBFIChpc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKKwljb250aW51ZTsKKworICAgICAgLyogSWYgd2UgYXJlIGRpc2NhcmRpbmcgYWxsIGxvY2FsIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgdG8KKwkgb3V0cHV0IHRoaXMgb25lLiAgSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0CisJIGZpbGUsIHRoZW4gc29tZSBvZiB0aGUgbG9jYWwgc3ltYm9scyBtYXkgYmUgcmVxdWlyZWQgYnkKKwkgcmVsb2NzOyB3ZSBvdXRwdXQgdGhlbSBiZWxvdyBhcyB3ZSBkaXNjb3ZlciB0aGF0IHRoZXkgYXJlCisJIG5lZWRlZC4gICovCisgICAgICBpZiAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCisJY29udGludWU7CisKKyAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdoaWNoIHdlIGFyZQorICAgICAgICAgZGlzY2FyZGluZywgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0LCBidXQgbm90ZSB0aGF0CisgICAgICAgICBsaW5rZXJfbWFyayBpcyBvbmx5IHJlbGlhYmxlIGZvciBzZWN0aW9ucyB0aGF0IGhhdmUgY29udGVudHMuCisgICAgICAgICBGb3IgdGhlIGJlbmVmaXQgb2YgdGhlIE1JUFMgRUxGIGxpbmtlciwgd2UgY2hlY2sgU0VDX0VYQ0xVREUKKyAgICAgICAgIGFzIHdlbGwgYXMgbGlua2VyX21hcmsuICAqLworICAgICAgaWYgKGlzeW0tPnN0X3NobmR4ID4gMAorCSAgJiYgaXN5bS0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFCisJICAmJiBpc2VjICE9IE5VTEwKKwkgICYmICgoISBpc2VjLT5saW5rZXJfbWFyayAmJiAoaXNlYy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQorCSAgICAgIHx8ICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUKKwkJICAmJiAoaXNlYy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkpKQorCWNvbnRpbnVlOworCisgICAgICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCisgICAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLAorCQkJCQkgICAgICBpc3ltLT5zdF9uYW1lKTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBTZWUgaWYgd2UgYXJlIGRpc2NhcmRpbmcgc3ltYm9scyB3aXRoIHRoaXMgbmFtZS4gICovCisgICAgICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCisJICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQorCSAgICAgICA9PSBOVUxMKSkKKwkgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKKwkgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkpCisJY29udGludWU7CisKKyAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBhcmUgZ29pbmcgdG8gb3V0cHV0IHRoaXMgc3ltYm9sLiAgKi8KKworICAgICAgb3N5bSA9ICppc3ltOworCisgICAgICAvKiBBZGp1c3QgdGhlIHNlY3Rpb24gaW5kZXggZm9yIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICAgICBvc3ltLnN0X3NobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChvdXRwdXRfYmZkLAorCQkJCQkJCSBpc2VjLT5vdXRwdXRfc2VjdGlvbik7CisgICAgICBpZiAob3N5bS5zdF9zaG5keCA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQorCXJldHVybiBmYWxzZTsKKworICAgICAgKnBpbmRleCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOworCisgICAgICAvKiBFTEYgc3ltYm9scyBpbiByZWxvY2F0ZWFibGUgZmlsZXMgYXJlIHNlY3Rpb24gcmVsYXRpdmUsIGJ1dAorCSBpbiBleGVjdXRhYmxlIGZpbGVzIHRoZXkgYXJlIHZpcnR1YWwgYWRkcmVzc2VzLiAgTm90ZSB0aGF0CisJIHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYWxsIEVMRiBzZWN0aW9ucyBoYXZlIGFuIGFzc29jaWF0ZWQKKwkgQkZEIHNlY3Rpb24gd2l0aCBhIHJlYXNvbmFibGUgdmFsdWUgZm9yIG91dHB1dF9vZmZzZXQ7IGJlbG93CisJIHdlIGFzc3VtZSB0aGF0IHRoZXkgYWxzbyBoYXZlIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IKKwkgb3V0cHV0X3NlY3Rpb24uICBBbnkgc3BlY2lhbCBzZWN0aW9ucyBtdXN0IGJlIHNldCB1cCB0byBtZWV0CisJIHRoZXNlIHJlcXVpcmVtZW50cy4gICovCisgICAgICBvc3ltLnN0X3ZhbHVlICs9IGlzZWMtPm91dHB1dF9vZmZzZXQ7CisgICAgICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQorCW9zeW0uc3RfdmFsdWUgKz0gaXNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKworICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsICZvc3ltLCBpc2VjKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLworICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGJmZF9ieXRlICpjb250ZW50czsKKworICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCisJeworCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAorCSAgfHwgKG8tPl9yYXdfc2l6ZSA9PSAwICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkpCisJY29udGludWU7CisKKyAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpICE9IDApCisJeworCSAgLyogU2VjdGlvbiB3YXMgY3JlYXRlZCBieSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucworCSAgICAgb3Igc29tZXN1Y2guICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhleSBoYXZlIGJlZW4gY2FjaGVkIGJ5IGEKKyAgICAgICAgIHJlbGF4YXRpb24gcm91dGluZS4gIE5vdGUgdGhhdCBvIGlzIGEgc2VjdGlvbiBpbiBhbiBpbnB1dAorICAgICAgICAgZmlsZSwgc28gdGhlIGNvbnRlbnRzIGZpZWxkIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQgYnkgYW55IG9mCisgICAgICAgICB0aGUgcm91dGluZXMgd2hpY2ggd29yayBvbiBvdXRwdXQgZmlsZXMuICAqLworICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50cyAhPSBOVUxMKQorCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzOworICAgICAgZWxzZQorCXsKKwkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOworCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGNvbnRlbnRzLAorCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKKwl7CisJICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOworCisJICAvKiBHZXQgdGhlIHN3YXBwZWQgcmVsb2NzLiAgKi8KKwkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCisJCQkgICAgIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCisJCQkgICAgICBmaW5mby0+aW50ZXJuYWxfcmVsb2NzLCBmYWxzZSkpOworCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMCisJICAgICAgJiYgby0+cmVsb2NfY291bnQgPiAwKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGJ5IGludm9raW5nIGEgYmFjayBlbmQgcm91dGluZS4KKworCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyB0aGUKKwkgICAgIHNlY3Rpb24gY29udGVudHMgYXMgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzCisJICAgICBhbmQgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZQorCSAgICAgcmVsb2MgYWRkZW5kIGFzIG5lY2Vzc2FyeS4KKworCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nCisJICAgICB0aGUgcmVsb2MgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgorCisJICAgICBUaGUgYmFjayBlbmQgcm91dGluZSBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4KKwkgICAgIGludGVybmFsIHN5bWJvbHMsIGFuZCBjYW4gYWNjZXNzIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMKKwkgICAgIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scyB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCisKKwkgICAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgYmFjayBlbmQgcm91dGluZQorCSAgICAgbXVzdCBoYW5kbGUgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlCisJICAgICBvdXRwdXQgc3ltYm9sIGlzIGdvaW5nIHRvIGJlIGEgc2VjdGlvbiBzeW1ib2wKKwkgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dCBzZWN0aW9uLCB3aGljaCB3aWxsIHJlcXVpcmUKKwkgICAgIHRoZSBhZGRlbmQgdG8gYmUgYWRqdXN0ZWQuICAqLworCisJICBpZiAoISAoKnJlbG9jYXRlX3NlY3Rpb24pIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKKwkJCQkgICAgIGlucHV0X2JmZCwgbywgY29udGVudHMsCisJCQkJICAgICBpbnRlcm5hbF9yZWxvY3MsCisJCQkJICAgICBmaW5mby0+aW50ZXJuYWxfc3ltcywKKwkJCQkgICAgIGZpbmZvLT5zZWN0aW9ucykpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7CisJICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhZW5kOworCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7CisJICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlucHV0X3JlbF9oZHI7CisJICAgICAgRWxmX0ludGVybmFsX1NoZHIgKm91dHB1dF9yZWxfaGRyOworCisJICAgICAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KKworCSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOworCSAgICAgIGlyZWxhZW5kID0gaXJlbGEgKyBvLT5yZWxvY19jb3VudDsKKwkgICAgICByZWxfaGFzaCA9IChlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnJlbF9oYXNoZXMKKwkJCSAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOworCSAgICAgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCByZWxfaGFzaCsrKQorCQl7CisJCSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKwkJICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOworCQkgIGFzZWN0aW9uICpzZWM7CisKKwkJICBpcmVsYS0+cl9vZmZzZXQgKz0gby0+b3V0cHV0X29mZnNldDsKKworCQkgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChpcmVsYS0+cl9pbmZvKTsKKworCQkgIGlmIChyX3N5bW5keCA9PSAwKQorCQkgICAgY29udGludWU7CisKKwkJICBpZiAocl9zeW1uZHggPj0gbG9jc3ltY291bnQKKwkJICAgICAgfHwgKGVsZl9iYWRfc3ltdGFiIChpbnB1dF9iZmQpCisJCQkgICYmIGZpbmZvLT5zZWN0aW9uc1tyX3N5bW5keF0gPT0gTlVMTCkpCisJCSAgICB7CisJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpyaDsKKwkJICAgICAgbG9uZyBpbmR4OworCisJCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbC4gIFdlCisJCQkgaGF2ZSBub3QgeWV0IG91dHB1dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMsIHNvCisJCQkgd2UgZG8gbm90IGtub3cgdGhlIHN5bWJvbCBpbmRleCBvZiBhbnkgZ2xvYmFsCisJCQkgc3ltYm9sLiAgV2Ugc2V0IHRoZSByZWxfaGFzaCBlbnRyeSBmb3IgdGhpcworCQkJIHJlbG9jIHRvIHBvaW50IHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeQorCQkJIGZvciB0aGlzIHN5bWJvbC4gIFRoZSBzeW1ib2wgaW5kZXggaXMgdGhlbgorCQkJIHNldCBhdCB0aGUgZW5kIG9mIGVsZl9iZmRfZmluYWxfbGluay4gICovCisJCSAgICAgIGluZHggPSByX3N5bW5keCAtIGV4dHN5bW9mZjsKKwkJICAgICAgcmggPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKKwkJICAgICAgd2hpbGUgKHJoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCQkJICAgICB8fCByaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwkJCXJoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIHJoLT5yb290LnUuaS5saW5rOworCisJCSAgICAgIC8qIFNldHRpbmcgdGhlIGluZGV4IHRvIC0yIHRlbGxzCisJCQkgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0aGF0IHRoaXMgc3ltYm9sIGlzCisJCQkgdXNlZCBieSBhIHJlbG9jLiAgKi8KKwkJICAgICAgQkZEX0FTU0VSVCAocmgtPmluZHggPCAwKTsKKwkJICAgICAgcmgtPmluZHggPSAtMjsKKworCQkgICAgICAqcmVsX2hhc2ggPSByaDsKKworCQkgICAgICBjb250aW51ZTsKKwkJICAgIH0KKworCQkgIC8qIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLiAqLworCisJCSAgKnJlbF9oYXNoID0gTlVMTDsKKwkJICBpc3ltID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKKwkJICBzZWMgPSBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdOworCQkgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCisJCSAgICB7CisJCSAgICAgIC8qIEkgc3VwcG9zZSB0aGUgYmFja2VuZCBvdWdodCB0byBmaWxsIGluIHRoZQorCQkJIHNlY3Rpb24gb2YgYW55IFNUVF9TRUNUSU9OIHN5bWJvbCBhZ2FpbnN0IGEKKwkJCSBwcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbi4gIElmIHdlIGhhdmUKKwkJCSBkaXNjYXJkZWQgYSBzZWN0aW9uLCB0aGUgb3V0cHV0X3NlY3Rpb24gd2lsbAorCQkJIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KKwkJICAgICAgaWYgKHNlYyAhPSBOVUxMCisJCQkgICYmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKKwkJCSAgICAgIHx8IChzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKKwkJCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjLT5vdXRwdXRfc2VjdGlvbikpKSkKKwkJCXJfc3ltbmR4ID0gMDsKKwkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQorCQkJeworCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJCSAgcmV0dXJuIGZhbHNlOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIHJfc3ltbmR4ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworCQkJICBCRkRfQVNTRVJUIChyX3N5bW5keCAhPSAwKTsKKwkJCX0KKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmIChmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPT0gLTEpCisJCQl7CisJCQkgIHVuc2lnbmVkIGxvbmcgbGluazsKKwkJCSAgY29uc3QgY2hhciAqbmFtZTsKKwkJCSAgYXNlY3Rpb24gKm9zZWM7CisKKwkJCSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCisJCQkgICAgeworCQkJICAgICAgLyogWW91IGNhbid0IGRvIGxkIC1yIC1zLiAgKi8KKwkJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisJCQkgICAgICByZXR1cm4gZmFsc2U7CisJCQkgICAgfQorCisJCQkgIC8qIFRoaXMgc3ltYm9sIHdhcyBza2lwcGVkIGVhcmxpZXIsIGJ1dAorCQkJICAgICBzaW5jZSBpdCBpcyBuZWVkZWQgYnkgYSByZWxvYywgd2UKKwkJCSAgICAgbXVzdCBvdXRwdXQgaXQgbm93LiAgKi8KKwkJCSAgbGluayA9IHN5bXRhYl9oZHItPnNoX2xpbms7CisJCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCisJCQkJCQkJCSAgbGluaywKKwkJCQkJCQkJICBpc3ltLT5zdF9uYW1lKTsKKwkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisJCQkgIGlzeW0tPnN0X3NobmR4ID0KKwkJCSAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKG91dHB1dF9iZmQsCisJCQkJCQkJICAgICAgIG9zZWMpOworCQkJICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJCSAgaXN5bS0+c3RfdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OworCQkJICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQorCQkJICAgIGlzeW0tPnN0X3ZhbHVlICs9IG9zZWMtPnZtYTsKKworCQkJICBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF0gPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKKworCQkJICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltIChmaW5mbywgbmFtZSwgaXN5bSwgc2VjKSkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJICAgICAgcl9zeW1uZHggPSBmaW5mby0+aW5kaWNlc1tyX3N5bW5keF07CisJCSAgICB9CisKKwkJICBpcmVsYS0+cl9pbmZvID0gRUxGX1JfSU5GTyAocl9zeW1uZHgsCisJCQkJCSAgICAgIEVMRl9SX1RZUEUgKGlyZWxhLT5yX2luZm8pKTsKKwkJfQorCisJICAgICAgLyogU3dhcCBvdXQgdGhlIHJlbG9jcy4gICovCisJICAgICAgaW5wdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKKwkgICAgICBvdXRwdXRfcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvLT5vdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7CisJICAgICAgQkZEX0FTU0VSVCAob3V0cHV0X3JlbF9oZHItPnNoX2VudHNpemUKKwkJCSAgPT0gaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSk7CisJICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7CisJICAgICAgaXJlbGFlbmQgPSBpcmVsYSArIG8tPnJlbG9jX2NvdW50OworCSAgICAgIGlmIChpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkpCisJCXsKKwkJICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOworCisJCSAgZXJlbCA9ICgoRWxmX0V4dGVybmFsX1JlbCAqKSBvdXRwdXRfcmVsX2hkci0+Y29udGVudHMKKwkJCSAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOworCQkgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCBlcmVsKyspCisJCSAgICB7CisJCSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgaXJlbDsKKworCQkgICAgICBpcmVsLnJfb2Zmc2V0ID0gaXJlbGEtPnJfb2Zmc2V0OworCQkgICAgICBpcmVsLnJfaW5mbyA9IGlyZWxhLT5yX2luZm87CisJCSAgICAgIEJGRF9BU1NFUlQgKGlyZWxhLT5yX2FkZGVuZCA9PSAwKTsKKwkJICAgICAgZWxmX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmaXJlbCwgZXJlbCk7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBFbGZfRXh0ZXJuYWxfUmVsYSAqZXJlbGE7CisKKwkJICBCRkRfQVNTRVJUIChpbnB1dF9yZWxfaGRyLT5zaF9lbnRzaXplCisJCQkgICAgICA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSk7CisJCSAgZXJlbGEgPSAoKEVsZl9FeHRlcm5hbF9SZWxhICopIG91dHB1dF9yZWxfaGRyLT5jb250ZW50cworCQkJICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOworCQkgIGZvciAoOyBpcmVsYSA8IGlyZWxhZW5kOyBpcmVsYSsrLCBlcmVsYSsrKQorCQkgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgaXJlbGEsIGVyZWxhKTsKKwkJfQorCisJICAgICAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OworCSAgICB9CisJfQorCisgICAgICAvKiBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIHNlY3Rpb24gY29udGVudHMuICAqLworICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5zdGFiX2luZm8gPT0gTlVMTCkKKwl7CisJICBpZiAoISAoby0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgJiYKKwkgICAgICAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgby0+b3V0cHV0X3NlY3Rpb24sCisJCQkJCSAgY29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCisJCQkJCSAgKG8tPl9jb29rZWRfc2l6ZSAhPSAwCisJCQkJCSAgID8gby0+X2Nvb2tlZF9zaXplCisJCQkJCSAgIDogby0+X3Jhd19zaXplKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicworCQkgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zdGFiX2luZm8sCisJCSAgbywgJmVsZl9zZWN0aW9uX2RhdGEgKG8pLT5zdGFiX2luZm8sIGNvbnRlbnRzKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBHZW5lcmF0ZSBhIHJlbG9jIHdoZW4gbGlua2luZyBhbiBFTEYgZmlsZS4gIFRoaXMgaXMgYSByZWxvYworICAgcmVxdWVzdGVkIGJ5IHRoZSBsaW5rZXIsIGFuZCBkb2VzIGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFRoaXMKKyAgIGlzIHVzZWQgdG8gYnVpbGQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzIHdoZW4gbGlua2luZworICAgd2l0aCAtVXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX3JlbG9jX2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKK3sKKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgIGxvbmcgaW5keDsKKyAgYmZkX3ZtYSBvZmZzZXQ7CisgIGJmZF92bWEgYWRkZW5kOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKKyAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7CisKKyAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOworICBpZiAoaG93dG8gPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7CisKKyAgLyogRmlndXJlIG91dCB0aGUgc3ltYm9sIGluZGV4LiAgKi8KKyAgcmVsX2hhc2hfcHRyID0gKGVsZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9zZWN0aW9uKS0+cmVsX2hhc2hlcworCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKyAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKKyAgICB7CisgICAgICBpbmR4ID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKKyAgICAgIEJGRF9BU1NFUlQgKGluZHggIT0gMCk7CisgICAgICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKKyAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLworICAgICAgaCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKKwkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAorCQkJCQkgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCisJCQkJCSBmYWxzZSwgZmFsc2UsIHRydWUpKTsKKyAgICAgIGlmIChoICE9IE5VTEwKKwkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisJeworCSAgYXNlY3Rpb24gKnNlY3Rpb247CisKKwkgIHNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJICBpbmR4ID0gc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkgICpyZWxfaGFzaF9wdHIgPSBOVUxMOworCSAgLyogSXQgc2VlbXMgdGhhdCB3ZSBvdWdodCB0byBhZGQgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUKKyAgICAgICAgICAgICBhZGRlbmQgaGVyZSwgYnV0IGluIHByYWN0aWNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKKyAgICAgICAgICAgICBiZWNhdXNlIGl0IHdhcyBwYXNzZWQgdG8gY29uc3RydWN0b3JfY2FsbGJhY2suICAqLworCSAgYWRkZW5kICs9IHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCX0KKyAgICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwl7CisJICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscyBlbGZfbGlua19vdXRwdXRfZXh0c3ltIHRoYXQKKwkgICAgIHRoaXMgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvYy4gICovCisJICBoLT5pbmR4ID0gLTI7CisJICAqcmVsX2hhc2hfcHRyID0gaDsKKwkgIGluZHggPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCisJCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKKwkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaW5keCA9IDA7CisJfQorICAgIH0KKworICAvKiBJZiB0aGlzIGlzIGFuIGlucGxhY2UgcmVsb2MsIHdlIG11c3Qgd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZQorICAgICBvYmplY3QgZmlsZS4gICovCisgIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlICYmIGFkZGVuZCAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKKyAgICAgIGJmZF9ieXRlICpidWY7CisgICAgICBib29sZWFuIG9rOworCisgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7CisgICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOworICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7CisgICAgICBzd2l0Y2ggKHJzdGF0KQorCXsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgIGFib3J0ICgpOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChpbmZvLAorCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKKwkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAorCQkJCSAgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKKwkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCisJCSAgaG93dG8tPm5hbWUsIGFkZGVuZCwgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwKKwkJICAoYmZkX3ZtYSkgMCkpKQorCSAgICB7CisJICAgICAgZnJlZSAoYnVmKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAorCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOworICAgICAgZnJlZSAoYnVmKTsKKyAgICAgIGlmICghIG9rKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogVGhlIGFkZHJlc3Mgb2YgYSByZWxvYyBpcyByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiBpbiBhCisgICAgIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYW4gZXhlY3V0YWJsZQorICAgICBmaWxlLiAgKi8KKyAgb2Zmc2V0ID0gbGlua19vcmRlci0+b2Zmc2V0OworICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgb2Zmc2V0ICs9IG91dHB1dF9zZWN0aW9uLT52bWE7CisKKyAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oZHI7CisKKyAgaWYgKHJlbF9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7CisgICAgICBFbGZfRXh0ZXJuYWxfUmVsICplcmVsOworCisgICAgICBpcmVsLnJfb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgaXJlbC5yX2luZm8gPSBFTEZfUl9JTkZPIChpbmR4LCBob3d0by0+dHlwZSk7CisgICAgICBlcmVsID0gKChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzCisJICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOworICAgICAgZWxmX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmaXJlbCwgZXJlbCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRWxmX0ludGVybmFsX1JlbGEgaXJlbGE7CisgICAgICBFbGZfRXh0ZXJuYWxfUmVsYSAqZXJlbGE7CisKKyAgICAgIGlyZWxhLnJfb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgaXJlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAoaW5keCwgaG93dG8tPnR5cGUpOworICAgICAgaXJlbGEucl9hZGRlbmQgPSBhZGRlbmQ7CisgICAgICBlcmVsYSA9ICgoRWxmX0V4dGVybmFsX1JlbGEgKikgcmVsX2hkci0+Y29udGVudHMKKwkgICAgICAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOworICAgICAgZWxmX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJmlyZWxhLCBlcmVsYSk7CisgICAgfQorCisgICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworCisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBBbGxvY2F0ZSBhIHBvaW50ZXIgdG8gbGl2ZSBpbiBhIGxpbmtlciBjcmVhdGVkIHNlY3Rpb24uICAqLworCitib29sZWFuCitlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIGxzZWN0LCBoLCByZWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Cit7CisgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyX2xpbmtlcl9zZWN0aW9uX3B0ciA9IE5VTEw7CisgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7CisgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHggPSBFTEZfUl9TWU0gKHJlbC0+cl9pbmZvKTs7CisKKyAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7CisKKyAgLyogSXMgdGhpcyBhIGdsb2JhbCBzeW1ib2w/ICovCisgIGlmIChoICE9IE5VTEwpCisgICAgeworICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCisgICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyLAorCQkJCQkJcmVsLT5yX2FkZGVuZCwKKwkJCQkJCWxzZWN0LT53aGljaCkpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlcjsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCisgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICBpZiAoISBlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBpZiAobHNlY3QtPnJlbF9zZWN0aW9uKQorCWxzZWN0LT5yZWxfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpOworICAgIH0KKworICBlbHNlICAvKiBBbGxvY2F0aW9uIG9mIGEgcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCAqLworICAgIHsKKyAgICAgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqcHRyID0gZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKTsKKworICAgICAgLyogQWxsb2NhdGUgYSB0YWJsZSB0byBob2xkIHRoZSBsb2NhbCBzeW1ib2xzIGlmIGZpcnN0IHRpbWUgKi8KKyAgICAgIGlmICghcHRyKQorCXsKKwkgIHVuc2lnbmVkIGludCBudW1fc3ltYm9scyA9IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKKwkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworCisJICBwdHIgPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKiopCisJICAgIGJmZF9hbGxvYyAoYWJmZCwgbnVtX3N5bWJvbHMgKiBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopKTsKKworCSAgaWYgKCFwdHIpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChhYmZkKSA9IHB0cjsKKwkgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgaSsrKQorCSAgICBwdHJbaV0gPSAoZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKikwOworCX0KKworICAgICAgLyogSGFzIHRoaXMgc3ltYm9sIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIGlmIHNvLCBvdXIgd29yayBpcyBkb25lICovCisgICAgICBpZiAoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChwdHJbcl9zeW1uZHhdLAorCQkJCQkJcmVsLT5yX2FkZGVuZCwKKwkJCQkJCWxzZWN0LT53aGljaCkpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSAmcHRyW3Jfc3ltbmR4XTsKKworICAgICAgaWYgKGluZm8tPnNoYXJlZCkKKwl7CisJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KKwkgICAgIG91dHB1dCBhIFJfPHh4eD5fUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKKwkgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLworCSAgQkZEX0FTU0VSVCAobHNlY3QtPnJlbF9zZWN0aW9uICE9IE5VTEwpOworCSAgbHNlY3QtPnJlbF9zZWN0aW9uLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSk7CisJfQorICAgIH0KKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb2ludGVyIGluIHRoZSBsaW5rZXIgc2VjdGlvbiwgYW5kIGFsbG9jYXRlIGEgbmV3IHBvaW50ZXIgcmVjb3JkCisgICAgIGZyb20gaW50ZXJuYWwgbWVtb3J5LiAgKi8KKyAgQkZEX0FTU0VSVCAocHRyX2xpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKKyAgbGlua2VyX3NlY3Rpb25fcHRyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopCisgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190KSk7CisKKyAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGxpbmtlcl9zZWN0aW9uX3B0ci0+bmV4dCA9ICpwdHJfbGlua2VyX3NlY3Rpb25fcHRyOworICBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CisgIGxpbmtlcl9zZWN0aW9uX3B0ci0+d2hpY2ggPSBsc2VjdC0+d2hpY2g7CisgIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSBmYWxzZTsKKyAgKnB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSBsaW5rZXJfc2VjdGlvbl9wdHI7CisKKyNpZiAwCisgIGlmIChsc2VjdC0+aG9sZV9zaXplICYmIGxzZWN0LT5ob2xlX29mZnNldCA8IGxzZWN0LT5tYXhfaG9sZV9vZmZzZXQpCisgICAgeworICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQgPSBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplIC0gbHNlY3QtPmhvbGVfc2l6ZSArIChBUkNIX1NJWkUgLyA4KTsKKyAgICAgIGxzZWN0LT5ob2xlX29mZnNldCArPSBBUkNIX1NJWkUgLyA4OworICAgICAgbHNlY3QtPnN5bV9vZmZzZXQgICs9IEFSQ0hfU0laRSAvIDg7CisgICAgICBpZiAobHNlY3QtPnN5bV9oYXNoKQkvKiBCdW1wIHVwIHN5bWJvbCB2YWx1ZSBpZiBuZWVkZWQgKi8KKwl7CisJICBsc2VjdC0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUgKz0gQVJDSF9TSVpFIC8gODsKKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiQnVtcCB1cCAlcyBieSAlbGQsIGN1cnJlbnQgdmFsdWUgPSAlbGRcbiIsCisJCSAgIGxzZWN0LT5zeW1faGFzaC0+cm9vdC5yb290LnN0cmluZywKKwkJICAgKGxvbmcpQVJDSF9TSVpFIC8gOCwKKwkJICAgKGxvbmcpbHNlY3QtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlKTsKKyNlbmRpZgorCX0KKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0ID0gbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZTsKKworICBsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplICs9IEFSQ0hfU0laRSAvIDg7CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJDcmVhdGUgcG9pbnRlciBpbiBsaW5rZXIgc2VjdGlvbiAlcywgb2Zmc2V0ID0gJWxkLCBzZWN0aW9uIHNpemUgPSAlbGRcbiIsCisJICAgbHNlY3QtPm5hbWUsIChsb25nKWxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0LCAobG9uZylsc2VjdC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKKyNlbmRpZgorCisgIHJldHVybiB0cnVlOworfQorCisMCisjaWYgQVJDSF9TSVpFPT02NAorI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfNjQgKEJGRCwgVkFMLCBBRERSKQorI2VuZGlmCisjaWYgQVJDSF9TSVpFPT0zMgorI2RlZmluZSBiZmRfcHV0X3B0cihCRkQsVkFMLEFERFIpIGJmZF9wdXRfMzIgKEJGRCwgVkFMLCBBRERSKQorI2VuZGlmCisKKy8qIEZpbGwgaW4gdGhlIGFkZHJlc3MgZm9yIGEgcG9pbnRlciBnZW5lcmF0ZWQgaW4gYWxpbmtlciBzZWN0aW9uLiAgKi8KKworYmZkX3ZtYQorZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sIGxzZWN0LCBoLCByZWxvY2F0aW9uLCByZWwsIHJlbGF0aXZlX3JlbG9jKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OworICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOworICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOworICAgICBpbnQgcmVsYXRpdmVfcmVsb2M7Cit7CisgIGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICpsaW5rZXJfc2VjdGlvbl9wdHI7CisKKyAgQkZEX0FTU0VSVCAobHNlY3QgIT0gTlVMTCk7CisKKyAgaWYgKGggIT0gTlVMTCkJCS8qIGdsb2JhbCBzeW1ib2wgKi8KKyAgICB7CisgICAgICBsaW5rZXJfc2VjdGlvbl9wdHIgPSBfYmZkX2VsZl9maW5kX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKGgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXIsCisJCQkJCQkJCSByZWwtPnJfYWRkZW5kLAorCQkJCQkJCQkgbHNlY3QtPndoaWNoKTsKKworICAgICAgQkZEX0FTU0VSVCAobGlua2VyX3NlY3Rpb25fcHRyICE9IE5VTEwpOworCisgICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAorCSAgfHwgKGluZm8tPnNoYXJlZAorCSAgICAgICYmIGluZm8tPnN5bWJvbGljCisJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCisJeworCSAgLyogVGhpcyBpcyBhY3R1YWxseSBhIHN0YXRpYyBsaW5rLCBvciBpdCBpcyBhCisJICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAorCSAgICAgbG9jYWxseS4gIFdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVudHJ5IGluIHRoZQorCSAgICAgZ2xvYmFsIHNlY3Rpb24uCisKKwkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLjx4eHg+CisJICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcworCSAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLworCSAgaWYgKCFsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wKQorCSAgICB7CisJICAgICAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IHRydWU7CisJICAgICAgYmZkX3B1dF9wdHIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24gKyBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZCwKKwkJCSAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzICsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQkJCQkvKiBsb2NhbCBzeW1ib2wgKi8KKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7CisgICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZCkgIT0gTlVMTCk7CisgICAgICBCRkRfQVNTRVJUIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdICE9IE5VTEwpOworICAgICAgbGlua2VyX3NlY3Rpb25fcHRyID0gX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChlbGZfbG9jYWxfcHRyX29mZnNldHMgKGlucHV0X2JmZClbcl9zeW1uZHhdLAorCQkJCQkJCQkgcmVsLT5yX2FkZGVuZCwKKwkJCQkJCQkJIGxzZWN0LT53aGljaCk7CisKKyAgICAgIEJGRF9BU1NFUlQgKGxpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKKworICAgICAgLyogV3JpdGUgb3V0IHBvaW50ZXIgaWYgaXQgaGFzbid0IGJlZW4gcmV3cml0dGVuIG91dCBiZWZvcmUgKi8KKyAgICAgIGlmICghbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCkKKwl7CisJICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gdHJ1ZTsKKwkgIGJmZF9wdXRfcHRyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQsCisJCSAgICAgICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7CisKKwkgIGlmIChpbmZvLT5zaGFyZWQpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc3JlbCA9IGxzZWN0LT5yZWxfc2VjdGlvbjsKKwkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7CisKKwkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVsYXRpdmUgcmVsb2MgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCisJICAgICAgaWYgKCFzcmVsKQorCQlsc2VjdC0+cmVsX3NlY3Rpb24gPSBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAorCQkJCQkJCQkgICAgIGxzZWN0LT5yZWxfbmFtZSk7CisKKwkgICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOworCisJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKGxzZWN0LT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICsgbHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCQkgKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCk7CisJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRl9SX0lORk8gKDAsIHJlbGF0aXZlX3JlbG9jKTsKKwkgICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOworCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCisJCQkJICAgKCgoRWxmX0V4dGVybmFsX1JlbGEgKikKKwkJCQkgICAgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cykKKwkJCQkgICAgKyBsc2VjdC0+c2VjdGlvbi0+cmVsb2NfY291bnQpKTsKKwkgICAgICArK2xzZWN0LT5zZWN0aW9uLT5yZWxvY19jb3VudDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmVsb2NhdGlvbiA9IChsc2VjdC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAorCQkrIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0CisJCS0gbHNlY3QtPmhvbGVfb2Zmc2V0CisJCS0gbHNlY3QtPnN5bV9vZmZzZXQpOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAiRmluaXNoIHBvaW50ZXIgaW4gbGlua2VyIHNlY3Rpb24gJXMsIG9mZnNldCA9ICVsZCAoMHglbHgpXG4iLAorCSAgIGxzZWN0LT5uYW1lLCAobG9uZylyZWxvY2F0aW9uLCAobG9uZylyZWxvY2F0aW9uKTsKKyNlbmRpZgorCisgIC8qIFN1YnRyYWN0IG91dCB0aGUgYWRkZW5kLCBiZWNhdXNlIGl0IHdpbGwgZ2V0IGFkZGVkIGJhY2sgaW4gYnkgdGhlIG5vcm1hbAorICAgICBwcm9jZXNzaW5nLiAgKi8KKyAgcmV0dXJuIHJlbG9jYXRpb24gLSBsaW5rZXJfc2VjdGlvbl9wdHItPmFkZGVuZDsKK30KKwwKKy8qIEdhcmJhZ2UgY29sbGVjdCB1bnVzZWQgc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbiBlbGZfZ2NfbWFyaworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKnNlYywKKwkgICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQorCSAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCisJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpKSk7CisKK3N0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKwkgICBib29sZWFuICgqZ2Nfc3dlZXBfaG9vaykKKwkgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAorCQkgICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSkpKTsKKworc3RhdGljIGJvb2xlYW4gZWxmX2djX3N3ZWVwX3N5bWJvbAorICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGlkeHB0cikpOworCitzdGF0aWMgYm9vbGVhbiBlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMKKyAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBvZmZhcmcpKTsKKworc3RhdGljIGJvb2xlYW4gZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkCisgIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgZHVtbXkpKTsKKworc3RhdGljIGJvb2xlYW4gZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcworICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7CisKKy8qIFRoZSBtYXJrIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBhIGdpdmVuIHNlY3Rpb24sIG1hcmsKKyAgIGl0LCBhbmQgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBkZWZpbmUgc3ltYm9scyB0byB3aGljaCBpdCByZWZlcnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2djX21hcmsgKGluZm8sIHNlYywgZ2NfbWFya19ob29rKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKKyAgICAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKKwkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Cit7CisgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKworICBzZWMtPmdjX21hcmsgPSAxOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbiByZWxvY3MuICAqLworCisgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsc3RhcnQsICpyZWwsICpyZWxlbmQ7CisgICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKKyAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgICAgIHNpemVfdCBubG9jc3ltczsKKyAgICAgIHNpemVfdCBleHRzeW1vZmY7CisgICAgICBFbGZfRXh0ZXJuYWxfU3ltICpsb2NzeW1zLCAqZnJlZXN5bXMgPSBOVUxMOworICAgICAgYmZkICppbnB1dF9iZmQgPSBzZWMtPm93bmVyOworCisgICAgICAvKiBHQ0ZJWE1FOiBob3cgdG8gYXJyYW5nZSBzbyB0aGF0IHJlbG9jcyBhbmQgc3ltYm9scyBhcmUgbm90CisJIHJlcmVhZCBjb250aW51YWxseT8gICovCisKKyAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOworICAgICAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOworCisgICAgICAvKiBSZWFkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KKyAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKKwl7CisJICBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOworICAgICAgICAgIGV4dHN5bW9mZiA9IDA7CisJfQorICAgICAgZWxzZQorCWV4dHN5bW9mZiA9IG5sb2NzeW1zID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKyAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cykKKwlsb2NzeW1zID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7CisgICAgICBlbHNlIGlmIChubG9jc3ltcyA9PSAwKQorCWxvY3N5bXMgPSBOVUxMOworICAgICAgZWxzZQorCXsKKwkgIGxvY3N5bXMgPSBmcmVlc3ltcyA9CisJICAgIGJmZF9tYWxsb2MgKG5sb2NzeW1zICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSk7CisJICBpZiAoZnJlZXN5bXMgPT0gTlVMTAorCSAgICAgIHx8IGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCAoYmZkX3JlYWQgKGxvY3N5bXMsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCisJCQkgICAgbmxvY3N5bXMsIGlucHV0X2JmZCkKKwkJICAhPSBubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQorCSAgICB7CisJICAgICAgcmV0ID0gZmFsc2U7CisJICAgICAgZ290byBvdXQxOworCSAgICB9CisJfQorCisgICAgICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCisgICAgICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCisJCSAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCisJCSAgIGluZm8tPmtlZXBfbWVtb3J5KSk7CisgICAgICBpZiAocmVsc3RhcnQgPT0gTlVMTCkKKwl7CisJICByZXQgPSBmYWxzZTsKKwkgIGdvdG8gb3V0MTsKKwl9CisgICAgICByZWxlbmQgPSByZWxzdGFydCArIHNlYy0+cmVsb2NfY291bnQ7CisKKyAgICAgIGZvciAocmVsID0gcmVsc3RhcnQ7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisJeworCSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKKwkgIGFzZWN0aW9uICpyc2VjOworCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisJICBFbGZfSW50ZXJuYWxfU3ltIHM7CisKKwkgIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7CisJICBpZiAocl9zeW1uZHggPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIGlmIChlbGZfYmFkX3N5bXRhYiAoc2VjLT5vd25lcikpCisJICAgIHsKKwkgICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgJmxvY3N5bXNbcl9zeW1uZHhdLCAmcyk7CisJICAgICAgaWYgKEVMRl9TVF9CSU5EIChzLnN0X2luZm8pID09IFNUQl9MT0NBTCkKKwkgICAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBOVUxMLCAmcyk7CisJICAgICAgZWxzZQorCQl7CisJICAgICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKKwkgICAgICAgICAgcnNlYyA9ICgqZ2NfbWFya19ob29rKShzZWMtPm93bmVyLCBpbmZvLCByZWwsIGgsIE5VTEwpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHJfc3ltbmR4ID49IG5sb2NzeW1zKQorCSAgICB7CisJICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOworCSAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBoLCBOVUxMKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsICZsb2NzeW1zW3Jfc3ltbmR4XSwgJnMpOworCSAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBOVUxMLCAmcyk7CisJICAgIH0KKworCSAgaWYgKHJzZWMgJiYgIXJzZWMtPmdjX21hcmspCisJICAgIGlmICghZWxmX2djX21hcmsgKGluZm8sIHJzZWMsIGdjX21hcmtfaG9vaykpCisJICAgICAgeworCQlyZXQgPSBmYWxzZTsKKwkJZ290byBvdXQyOworCSAgICAgIH0KKwl9CisKKyAgICBvdXQyOgorICAgICAgaWYgKCFpbmZvLT5rZWVwX21lbW9yeSkKKwlmcmVlIChyZWxzdGFydCk7CisgICAgb3V0MToKKyAgICAgIGlmIChmcmVlc3ltcykKKwlmcmVlIChmcmVlc3ltcyk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBzd2VlcCBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBSZW1vdmUgYWxsIGdhcmJhZ2Ugc2VjdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2djX3N3ZWVwIChpbmZvLCBnY19zd2VlcF9ob29rKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYm9vbGVhbiAoKmdjX3N3ZWVwX2hvb2spCisgICAgICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgYXNlY3Rpb24gKm8sCisJCWNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKK3sKKyAgYmZkICpzdWI7CisKKyAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCisgICAgeworICAgICAgYXNlY3Rpb24gKm87CisKKyAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJeworCSAgLyogS2VlcCBzcGVjaWFsIHNlY3Rpb25zLiAgS2VlcCAuZGVidWcgc2VjdGlvbnMuICAqLworCSAgaWYgKChvLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkKKwkgICAgICB8fCAoby0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSkKKwkgICAgby0+Z2NfbWFyayA9IDE7CisKKwkgIGlmIChvLT5nY19tYXJrKQorCSAgICBjb250aW51ZTsKKworCSAgLyogU2tpcCBzd2VlcGluZyBzZWN0aW9ucyBhbHJlYWR5IGV4Y2x1ZGVkLiAgKi8KKwkgIGlmIChvLT5mbGFncyAmIFNFQ19FWENMVURFKQorCSAgICBjb250aW51ZTsKKworCSAgLyogU2luY2UgdGhpcyBpcyBlYXJseSBpbiB0aGUgbGluayBwcm9jZXNzLCBpdCBpcyBzaW1wbGUKKwkgICAgIHRvIHJlbW92ZSBhIHNlY3Rpb24gZnJvbSB0aGUgb3V0cHV0LiAgKi8KKwkgIG8tPmZsYWdzIHw9IFNFQ19FWENMVURFOworCisJICAvKiBCdXQgd2UgYWxzbyBoYXZlIHRvIHVwZGF0ZSBzb21lIG9mIHRoZSByZWxvY2F0aW9uCisJICAgICBpbmZvIHdlIGNvbGxlY3RlZCBiZWZvcmUuICAqLworCSAgaWYgKGdjX3N3ZWVwX2hvb2sKKwkgICAgICAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICYmIG8tPnJlbG9jX2NvdW50ID4gMCkKKwkgICAgeworCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7CisJICAgICAgYm9vbGVhbiByOworCisJICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKKwkJCQkgKG8tPm93bmVyLCBvLCBOVUxMLCBOVUxMLCBpbmZvLT5rZWVwX21lbW9yeSkpOworCSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgciA9ICgqZ2Nfc3dlZXBfaG9vaykoby0+b3duZXIsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7CisKKwkgICAgICBpZiAoIWluZm8tPmtlZXBfbWVtb3J5KQorCQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOworCisJICAgICAgaWYgKCFyKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFJlbW92ZSB0aGUgc3ltYm9scyB0aGF0IHdlcmUgaW4gdGhlIHN3ZXB0IHNlY3Rpb25zIGZyb20gdGhlIGR5bmFtaWMKKyAgICAgc3ltYm9sIHRhYmxlLiAgR0NGSVhNRTogQW55b25lIGtub3cgaG93IHRvIGdldCB0aGVtIG91dCBvZiB0aGUKKyAgICAgc3RhdGljIHN5bWJvbCB0YWJsZSBhcyB3ZWxsPyAgKi8KKyAgeworICAgIGludCBpID0gMDsKKworICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICBlbGZfZ2Nfc3dlZXBfc3ltYm9sLAorCQkJICAgIChQVFIpICZpKTsKKworICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPSBpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN3ZWVwIHN5bWJvbHMgaW4gc3dlcHQgc2VjdGlvbnMuICBDYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2djX3N3ZWVwX3N5bWJvbCAoaCwgaWR4cHRyKQorICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIGlkeHB0cjsKK3sKKyAgaW50ICppZHggPSAoaW50ICopIGlkeHB0cjsKKworICBpZiAoaC0+ZHluaW5keCAhPSAtMQorICAgICAgJiYgKChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgIHx8IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+Z2NfbWFyaykpCisgICAgaC0+ZHluaW5keCA9ICgqaWR4KSsrOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQcm9wb2dhdGUgY29sbGVjdGVkIHZ0YWJsZSBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHRocm91Z2gKKyAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkIChoLCBva3ApCisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgb2twOworeworICAvKiBUaG9zZSB0aGF0IGFyZSBub3QgdnRhYmxlcy4gKi8KKyAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBUaG9zZSB2dGFibGVzIHRoYXQgZG8gbm90IGhhdmUgcGFyZW50cywgd2UgY2Fubm90IG1lcmdlLiAgKi8KKyAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIC0xKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHdlJ3ZlIGFscmVhZHkgYmVlbiBkb25lLCBleGl0LiAgKi8KKyAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgJiYgaC0+dnRhYmxlX2VudHJpZXNfdXNlZFstMV0pCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBwYXJlbnQncyB0YWJsZSBpcyB1cCB0byBkYXRlLiAgKi8KKyAgZWxmX2djX3Byb3BhZ2F0ZV92dGFibGVfZW50cmllc191c2VkIChoLT52dGFibGVfcGFyZW50LCBva3ApOworCisgIGlmIChoLT52dGFibGVfZW50cmllc191c2VkID09IE5VTEwpCisgICAgeworICAgICAgLyogTm9uZSBvZiB0aGlzIHRhYmxlJ3MgZW50cmllcyB3ZXJlIHJlZmVyZW5jZWQuICBSZS11c2UgdGhlCisJIHBhcmVudCdzIHRhYmxlLiAgKi8KKyAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc191c2VkOworICAgICAgaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3NpemU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IG47CisgICAgICBib29sZWFuICpjdSwgKnB1OworCisgICAgICAvKiBPciB0aGUgcGFyZW50J3MgZW50cmllcyBpbnRvIG91cnMuICAqLworICAgICAgY3UgPSBoLT52dGFibGVfZW50cmllc191c2VkOworICAgICAgY3VbLTFdID0gdHJ1ZTsKKyAgICAgIHB1ID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKKyAgICAgIGlmIChwdSAhPSBOVUxMKQorCXsKKwkgIG4gPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc19zaXplIC8gRklMRV9BTElHTjsKKwkgIHdoaWxlICgtLW4gIT0gMCkKKwkgICAgeworCSAgICAgIGlmICgqcHUpICpjdSA9IHRydWU7CisJICAgICAgcHUrKywgY3UrKzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzIChoLCBva3ApCisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgb2twOworeworICBhc2VjdGlvbiAqc2VjOworICBiZmRfdm1hIGhzdGFydCwgaGVuZDsKKyAgRWxmX0ludGVybmFsX1JlbGEgKnJlbHN0YXJ0LCAqcmVsZW5kLCAqcmVsOworCisgIC8qIFRha2UgY2FyZSBvZiBib3RoIHRob3NlIHN5bWJvbHMgdGhhdCBkbyBub3QgZGVzY3JpYmUgdnRhYmxlcyBhcworICAgICB3ZWxsIGFzIHRob3NlIHRoYXQgYXJlIG5vdCBsb2FkZWQuICAqLworICBpZiAoaC0+dnRhYmxlX3BhcmVudCA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKKworICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisgIGhzdGFydCA9IGgtPnJvb3QudS5kZWYudmFsdWU7CisgIGhlbmQgPSBoc3RhcnQgKyBoLT5zaXplOworCisgIHJlbHN0YXJ0ID0gKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykKKwkgICAgICAoc2VjLT5vd25lciwgc2VjLCBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgdHJ1ZSkpOworICBpZiAoIXJlbHN0YXJ0KQorICAgIHJldHVybiAqKGJvb2xlYW4gKilva3AgPSBmYWxzZTsKKyAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50OworCisgIGZvciAocmVsID0gcmVsc3RhcnQ7IHJlbCA8IHJlbGVuZDsgKytyZWwpCisgICAgaWYgKHJlbC0+cl9vZmZzZXQgPj0gaHN0YXJ0ICYmIHJlbC0+cl9vZmZzZXQgPCBoZW5kKQorICAgICAgeworCS8qIElmIHRoZSBlbnRyeSBpcyBpbiB1c2UsIGRvIG5vdGhpbmcuICAqLworCWlmIChoLT52dGFibGVfZW50cmllc191c2VkCisJICAgICYmIChyZWwtPnJfb2Zmc2V0IC0gaHN0YXJ0KSA8IGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUpCisJICB7CisJICAgIGJmZF92bWEgZW50cnkgPSAocmVsLT5yX29mZnNldCAtIGhzdGFydCkgLyBGSUxFX0FMSUdOOworCSAgICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZFtlbnRyeV0pCisJICAgICAgY29udGludWU7CisJICB9CisJLyogT3RoZXJ3aXNlLCBraWxsIGl0LiAgKi8KKwlyZWwtPnJfb2Zmc2V0ID0gcmVsLT5yX2luZm8gPSByZWwtPnJfYWRkZW5kID0gMDsKKyAgICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRG8gbWFyayBhbmQgc3dlZXAgb2YgdW51c2VkIHNlY3Rpb25zLiAgKi8KKworYm9vbGVhbgorZWxmX2djX3NlY3Rpb25zIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgYmZkICpzdWI7CisgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCisgICAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAorICAgICAgICAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKKworICBpZiAoIWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y2FuX2djX3NlY3Rpb25zCisgICAgICB8fCBpbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgIHx8IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEFwcGx5IHRyYW5zaXRpdmUgY2xvc3VyZSB0byB0aGUgdnRhYmxlIGVudHJ5IHVzYWdlIGluZm8uICAqLworICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkgIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCwKKwkJCSAgKFBUUikgJm9rKTsKKyAgaWYgKCFvaykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogS2lsbCB0aGUgdnRhYmxlIHJlbG9jYXRpb25zIHRoYXQgd2VyZSBub3QgdXNlZC4gICovCisgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcywKKwkJCSAgKFBUUikgJm9rKTsKKyAgaWYgKCFvaykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogR3JvdmVsIHRocm91Z2ggcmVsb2NzIHRvIGZpbmQgb3V0IHdobyBzdGF5cyAuLi4gICovCisKKyAgZ2NfbWFya19ob29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5nY19tYXJrX2hvb2s7CisgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpvOworICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKwl7CisJICBpZiAoby0+ZmxhZ3MgJiBTRUNfS0VFUCkKKyAgCSAgICBpZiAoIWVsZl9nY19tYXJrIChpbmZvLCBvLCBnY19tYXJrX2hvb2spKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIC8qIC4uLiBhbmQgbWFyayBTRUNfRVhDTFVERSBmb3IgdGhvc2UgdGhhdCBnby4gICovCisgIGlmICghZWxmX2djX3N3ZWVwKGluZm8sIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Z2Nfc3dlZXBfaG9vaykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogQ2FsbGVkIGZyb20gY2hlY2tfcmVsb2NzIHRvIHJlY29yZCB0aGUgZXhpc3RhbmNlIG9mIGEgVlRJTkhFUklUIHJlbG9jLiAgKi8KKworYm9vbGVhbgorZWxmX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgb2Zmc2V0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBiZmRfdm1hIG9mZnNldDsKK3sKKyAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOworICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnNlYXJjaCwgKmNoaWxkOworICBiZmRfc2l6ZV90eXBlIGV4dHN5bWNvdW50OworCisgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBzeW10YWIgaGVhZGVyIHRlbGxzIHVzIHdoZXJlIHRoZQorICAgICBleHRlcm5hbCBzeW1ib2xzIHN0YXJ0LiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbG9jYWwgc3ltYm9scyBhdAorICAgICB0aGlzIHBvaW50LiAgKi8KKyAgZXh0c3ltY291bnQgPSBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX3NpemUvc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKKyAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCisgICAgZXh0c3ltY291bnQgLT0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9pbmZvOworCisgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7CisgIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIGV4dHN5bWNvdW50OworCisgIC8qIEh1bnQgZG93biB0aGUgY2hpbGQgc3ltYm9sLCB3aGljaCBpcyBpbiB0aGlzIHNlY3Rpb24gYXQgdGhlIHNhbWUKKyAgICAgb2Zmc2V0IGFzIHRoZSByZWxvY2F0aW9uLiAgKi8KKyAgZm9yIChzZWFyY2ggPSBzeW1faGFzaGVzOyBzZWFyY2ggIT0gc3ltX2hhc2hlc19lbmQ7ICsrc2VhcmNoKQorICAgIHsKKyAgICAgIGlmICgoY2hpbGQgPSAqc2VhcmNoKSAhPSBOVUxMCisJICAmJiAoY2hpbGQtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBjaGlsZC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICYmIGNoaWxkLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCisJICAmJiBjaGlsZC0+cm9vdC51LmRlZi52YWx1ZSA9PSBvZmZzZXQpCisJZ290byB3aW47CisgICAgfQorCisgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIiVzOiAlcyslbHU6IE5vIHN5bWJvbCBmb3VuZCBmb3IgSU5IRVJJVCIsCisJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNlYy0+bmFtZSwKKwkJCSAodW5zaWduZWQgbG9uZylvZmZzZXQpOworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICByZXR1cm4gZmFsc2U7CisKK3dpbjoKKyAgaWYgKCFoKQorICAgIHsKKyAgICAgIC8qIFRoaXMgKnNob3VsZCogb25seSBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gIEl0IGNvdWxkIHBvdGVudGlhbGx5CisJIGJlIHRoYXQgc29tZW9uZSBoYXMgZGVmaW5lZCBhIG5vbi1nbG9iYWwgdnRhYmxlIHRob3VnaCwgd2hpY2gKKwkgd291bGQgYmUgYmFkLiAgSXQgaXNuJ3Qgd29ydGggcGFnaW5nIGluIHRoZSBsb2NhbCBzeW1ib2xzIHRvIGJlCisJIHN1cmUgdGhvdWdoOyB0aGF0IGNhc2Ugc2hvdWxkIHNpbXBseSBiZSBoYW5kbGVkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLworCisgICAgICBjaGlsZC0+dnRhYmxlX3BhcmVudCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAtMTsKKyAgICB9CisgIGVsc2UKKyAgICBjaGlsZC0+dnRhYmxlX3BhcmVudCA9IGg7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENhbGxlZCBmcm9tIGNoZWNrX3JlbG9jcyB0byByZWNvcmQgdGhlIGV4aXN0YW5jZSBvZiBhIFZURU5UUlkgcmVsb2MuICAqLworCitib29sZWFuCitlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgYWRkZW5kKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBiZmRfdm1hIGFkZGVuZDsKK3sKKyAgaWYgKGFkZGVuZCA+PSBoLT52dGFibGVfZW50cmllc19zaXplKQorICAgIHsKKyAgICAgIHNpemVfdCBzaXplLCBieXRlczsKKyAgICAgIGJvb2xlYW4gKnB0ciA9IGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7CisKKyAgICAgIC8qIFdoaWxlIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCB3ZSBoYXZlIHRvIGJlIHByZXBhcmVkIHRvIGhhbmRsZQorCSBhIHplcm8gc2l6ZS4gICovCisgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCXNpemUgPSBhZGRlbmQ7CisgICAgICBlbHNlCisJeworCSAgc2l6ZSA9IGgtPnNpemU7CisJICBpZiAoc2l6ZSA8IGFkZGVuZCkKKwkgICAgeworCSAgICAgIC8qIE9vcHMhICBXZSd2ZSBnb3QgYSByZWZlcmVuY2UgcGFzdCB0aGUgZGVmaW5lZCBlbmQgb2YKKwkJIHRoZSB0YWJsZS4gIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgLS0gc2hhbGwgd2Ugd2Fybj8gICovCisJICAgICAgc2l6ZSA9IGFkZGVuZDsKKwkgICAgfQorCX0KKworICAgICAgLyogQWxsb2NhdGUgb25lIGV4dHJhIGVudHJ5IGZvciB1c2UgYXMgYSAiZG9uZSIgZmxhZyBmb3IgdGhlCisJIGNvbnNvbGlkYXRpb24gcGFzcy4gICovCisgICAgICBieXRlcyA9IChzaXplIC8gRklMRV9BTElHTiArIDEpICogc2l6ZW9mKGJvb2xlYW4pOworCisgICAgICBpZiAocHRyKQorCXsKKwkgIHNpemVfdCBvbGRieXRlczsKKworCSAgcHRyID0gcmVhbGxvYyAocHRyLTEsIGJ5dGVzKTsKKwkgIGlmIChwdHIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBvbGRieXRlcyA9IChoLT52dGFibGVfZW50cmllc19zaXplL0ZJTEVfQUxJR04gKyAxKSAqIHNpemVvZihib29sZWFuKTsKKwkgIG1lbXNldCAocHRyICsgb2xkYnl0ZXMsIDAsIGJ5dGVzIC0gb2xkYnl0ZXMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwdHIgPSBjYWxsb2MgKDEsIGJ5dGVzKTsKKwkgIGlmIChwdHIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogQW5kIGFycmFuZ2UgZm9yIHRoYXQgZG9uZSBmbGFnIHRvIGJlIGF0IGluZGV4IC0xLiAgKi8KKyAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWQgPSBwdHIrMTsKKyAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSBzaXplOworICAgIH0KKyAgaC0+dnRhYmxlX2VudHJpZXNfdXNlZFthZGRlbmQgLyBGSUxFX0FMSUdOXSA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFuZCBhbiBhY2NvbXBhbnlpbmcgYml0IHRvIHdvcmsgb3V0IGZpbmFsIGdvdCBlbnRyeSBvZmZzZXRzIG9uY2UKKyAgIHdlJ3JlIGRvbmUuICBTaG91bGQgYmUgY2FsbGVkIGZyb20gZmluYWxfbGluay4gICovCisKK2Jvb2xlYW4KK2VsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZCAqaTsKKyAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKKyAgYmZkX3ZtYSBnb3RvZmY7CisKKyAgLyogVGhlIEdPVCBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIC5nb3Qgc2VjdGlvbiwgYnV0IHRoZSBHT1QgaGVhZGVyIGlzCisgICAgIHB1dCBpbnRvIHRoZSAuZ290LnBsdCBzZWN0aW9uLCBpZiB0aGUgYmFja2VuZCB1c2VzIGl0LiAgKi8KKyAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQorICAgIGdvdG9mZiA9IDA7CisgIGVsc2UKKyAgICBnb3RvZmYgPSBiZWQtPmdvdF9oZWFkZXJfc2l6ZTsKKworICAvKiBEbyB0aGUgbG9jYWwgLmdvdCBlbnRyaWVzIGZpcnN0LiAgKi8KKyAgZm9yIChpID0gaW5mby0+aW5wdXRfYmZkczsgaTsgaSA9IGktPmxpbmtfbmV4dCkKKyAgICB7CisgICAgICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290ID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGkpOworICAgICAgYmZkX3NpemVfdHlwZSBqLCBsb2NzeW1jb3VudDsKKyAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOworCisgICAgICBpZiAoIWxvY2FsX2dvdCkKKwljb250aW51ZTsKKworICAgICAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGkpLT5zeW10YWJfaGRyOworICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChpKSkKKwlsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOworICAgICAgZWxzZQorCWxvY3N5bWNvdW50ID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGxvY3N5bWNvdW50OyArK2opCisJeworCSAgaWYgKGxvY2FsX2dvdFtqXSA+IDApCisJICAgIHsKKwkgICAgICBsb2NhbF9nb3Rbal0gPSBnb3RvZmY7CisJICAgICAgZ290b2ZmICs9IEFSQ0hfU0laRSAvIDg7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgbG9jYWxfZ290W2pdID0gKGJmZF92bWEpIC0xOworCX0KKyAgICB9CisKKyAgLyogVGhlbiB0aGUgZ2xvYmFsIC5nb3QgYW5kIC5wbHQgZW50cmllcy4gICovCisgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzLAorCQkJICAoUFRSKSAmZ290b2ZmKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdlIG5lZWQgYSBzcGVjaWFsIHRvcC1sZXZlbCBsaW5rIHJvdXRpbmUgdG8gY29udmVydCBnb3QgcmVmZXJlbmNlIGNvdW50cworICAgdG8gcmVhbCBnb3Qgb2Zmc2V0cy4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMgKGgsIG9mZmFyZykKKyAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBvZmZhcmc7Cit7CisgIGJmZF92bWEgKm9mZiA9IChiZmRfdm1hICopIG9mZmFyZzsKKworICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKKyAgICB7CisgICAgICBoLT5nb3Qub2Zmc2V0ID0gb2ZmWzBdOworICAgICAgb2ZmWzBdICs9IEFSQ0hfU0laRSAvIDg7CisgICAgfQorICBlbHNlCisgICAgaC0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFueSBmb2xrIG5lZWQgbm8gbW9yZSBpbiB0aGUgd2F5IG9mIGZpbmFsIGxpbmsgdGhhbiB0aGlzLCBvbmNlCisgICBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50aW5nIGlzIGVuYWJsZWQuICAqLworCitib29sZWFuCitlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGlmICghZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyAoYWJmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KKyAgcmV0dXJuIGVsZl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdGhvdWdoIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgdG8gc3RvcmUKKyAgIGFsbCBoYXNoIHZhbHVlIG9mIHRoZSBleHBvcnRlZCBzeW1ib2xzIGluIGFuIGFycmF5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2VsZl9jb2xsZWN0X2hhc2hfY29kZXMgKGgsIGRhdGEpCisgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgdW5zaWduZWQgbG9uZyAqKnZhbHVlcCA9ICh1bnNpZ25lZCBsb25nICoqKSBkYXRhOworICBjb25zdCBjaGFyICpuYW1lOworICBjaGFyICpwOworICB1bnNpZ25lZCBsb25nIGhhOworICBjaGFyICphbGMgPSBOVUxMOworCisgIC8qIElnbm9yZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhlc2UgYXJlIGFkZGVkIGJ5IHRoZSB2ZXJzaW9uaW5nIGNvZGUuICAqLworICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKyAgcCA9IHN0cmNociAobmFtZSwgRUxGX1ZFUl9DSFIpOworICBpZiAocCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7CisgICAgICBtZW1jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOworICAgICAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7CisgICAgICBuYW1lID0gYWxjOworICAgIH0KKworICAvKiBDb21wdXRlIHRoZSBoYXNoIHZhbHVlLiAgKi8KKyAgaGEgPSBiZmRfZWxmX2hhc2ggKG5hbWUpOworCisgIC8qIFN0b3JlIHRoZSBmb3VuZCBoYXNoIHZhbHVlIGluIHRoZSBhcnJheSBnaXZlbiBhcyB0aGUgYXJndW1lbnQuICAqLworICAqKCp2YWx1ZXApKysgPSBoYTsKKworICAvKiBBbmQgc3RvcmUgaXQgaW4gdGhlIHN0cnVjdCBzbyB0aGF0IHdlIGNhbiBwdXQgaXQgaW4gdGhlIGhhc2ggdGFibGUKKyAgICAgbGF0ZXIuICAqLworICBoLT5lbGZfaGFzaF92YWx1ZSA9IGhhOworCisgIGlmIChhbGMgIT0gTlVMTCkKKyAgICBmcmVlIChhbGMpOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZnh4LXRhcmdldC5oIGIvYmZkL2VsZnh4LXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2FiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZWxmeHgtdGFyZ2V0LmgKQEAgLTAsMCArMSw1MzYgQEAKKy8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgTk4tYml0IEVMRgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IEJGRCBrbm93cyBhYm91dCBhIHRhcmdldC4KKyAgIEl0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGl0cyBieXRlIG9yZGVyLCBuYW1lLCB3aGF0IHJvdXRpbmVzIHRvIGNhbGwKKyAgIHRvIGRvIHZhcmlvdXMgb3BlcmF0aW9ucywgZXRjLiAgRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUKKyAgIHdpdGggaXRzICJ4dmVjIiBtZW1iZXIuCisKKyAgIFRoZXJlIGFyZSB0d28gc3VjaCBzdHJ1Y3R1cmVzIGhlcmU6ICBvbmUgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMgYW5kCisgICBvbmUgZm9yIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMuICAgKi8KKworI2RlZmluZQliZmRfZWxmTk5fY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbworI2lmbmRlZiBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cworI2VuZGlmCisKKyNkZWZpbmUgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKKyNkZWZpbmUgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9yZWxvYwlfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MKKyNpZm5kZWYgYmZkX2VsZk5OX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIGJmZF9lbGZOTl9maW5kX25lYXJlc3RfbGluZQlfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZQorI2VuZGlmCisjZGVmaW5lIGJmZF9lbGZOTl9yZWFkX21pbmlzeW1ib2xzCV9iZmRfZWxmX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgYmZkX2VsZk5OX21pbmlzeW1ib2xfdG9fc3ltYm9sCV9iZmRfZWxmX21pbmlzeW1ib2xfdG9fc3ltYm9sCisjZGVmaW5lIGJmZF9lbGZOTl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9lbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCisjZGVmaW5lIGJmZF9lbGZOTl9nZXRfbGluZW5vCQlfYmZkX2VsZl9nZXRfbGluZW5vCisjaWZuZGVmIGJmZF9lbGZOTl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKKyNkZWZpbmUgYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQKKyNlbmRpZgorI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3N5bWJvbF9pbmZvCV9iZmRfZWxmX2dldF9zeW1ib2xfaW5mbworI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3N5bXRhYgkJX2JmZF9lbGZfZ2V0X3N5bXRhYgorI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCisjaWYgMCAvKiBkb25lIGluIGVsZi1iZmQuaCAqLworI2RlZmluZSBiZmRfZWxmTk5fbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKKyNlbmRpZgorI2RlZmluZSBiZmRfZWxmTk5fbWFrZV9lbXB0eV9zeW1ib2wJX2JmZF9lbGZfbWFrZV9lbXB0eV9zeW1ib2wKKyNkZWZpbmUgYmZkX2VsZk5OX25ld19zZWN0aW9uX2hvb2sJX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vaworI2RlZmluZSBiZmRfZWxmTk5fc2V0X2FyY2hfbWFjaAkJX2JmZF9lbGZfc2V0X2FyY2hfbWFjaAorI2lmbmRlZiBiZmRfZWxmTk5fc2V0X3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgYmZkX2VsZk5OX3NldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzCisjZW5kaWYKKyNkZWZpbmUgYmZkX2VsZk5OX3NpemVvZl9oZWFkZXJzCV9iZmRfZWxmX3NpemVvZl9oZWFkZXJzCisjZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMgX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCisjZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyBfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cworCisjZGVmaW5lIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKKyNpZm5kZWYgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQgKGJmZF92bWEpIDAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQKKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0KKyNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZAorI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCAwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudAorI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50IDIKKyNlbmRpZgorCisjZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19zdGFydAliZmRfdm9pZAorI2RlZmluZSBiZmRfZWxmTk5fYmZkX2RlYnVnX2luZm9fZW5kCWJmZF92b2lkCisjZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCShQUk9UTyh2b2lkLCgqKSwoYmZkKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCisKKyNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2VuZGlmCisKKyNpZm5kZWYgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uCisjZGVmaW5lIGJmZF9lbGZOTl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisjZW5kaWYKKworI2lmbmRlZiBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCU5VTEwKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJTlVMTAorI2VuZGlmCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfZ2Nfc2VjdGlvbnMKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucyBfYmZkX2VsZk5OX2djX3NlY3Rpb25zCisjZW5kaWYKKworI2RlZmluZSBiZmRfZWxmTk5fYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKKyAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCisKKyNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAorICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKKyNlbmRpZgorCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQorI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAorICBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCisjZW5kaWYKKyNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKKyNlbmRpZgorI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKKyAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorI2VuZGlmCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBiZmRfZWxmTk5fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKKyNlbmRpZgorI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpKSBiZmRfdHJ1ZSkKKyNlbmRpZgorI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKKyNlbmRpZgorCisjaWZuZGVmIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAorI2RlZmluZSBiZmRfZWxmTk5fZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAorICBfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAorI2VuZGlmCisjaWZuZGVmIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYworI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAorICBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYworI2VuZGlmCisKKyNpZmRlZiBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2VuZGlmCisjZWxzZSAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCisvKiBJZiBubyBiYWNrZW5kIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZSwgdXNlIHRoZSBnZW5lcmljIGxpbmtlci4gICovCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAorICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2VuZGlmCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBiZmRfZWxmTk5fYmZkX2xpbmtfYWRkX3N5bWJvbHMJX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKKyNlbmRpZgorI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsKKyNkZWZpbmUgYmZkX2VsZk5OX2JmZF9maW5hbF9saW5rCV9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZW5kaWYKKyNlbmRpZiAvKiAhIGRlZmluZWQgKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pICovCisjaWZuZGVmIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCisjZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKyNlbmRpZgorCisjaWZuZGVmIGJmZF9lbGZOTl9hcmNoaXZlX3AKKyNkZWZpbmUgYmZkX2VsZk5OX2FyY2hpdmVfcCBiZmRfZ2VuZXJpY19hcmNoaXZlX3AKKyNlbmRpZgorCisjaWZuZGVmIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCisjZGVmaW5lIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cworI2VuZGlmCisKKyNpZm5kZWYgYmZkX2VsZk5OX21rb2JqZWN0CisjZGVmaW5lIGJmZF9lbGZOTl9ta29iamVjdCBiZmRfZWxmX21rb2JqZWN0CisjZW5kaWYKKworI2lmbmRlZiBiZmRfZWxmTk5fbWtjb3JlZmlsZQorI2RlZmluZSBiZmRfZWxmTk5fbWtjb3JlZmlsZSBiZmRfZWxmX21rY29yZWZpbGUKKyNlbmRpZgorCisjaWZuZGVmIGJmZF9lbGZOTl9ta2FyY2hpdmUKKyNkZWZpbmUgYmZkX2VsZk5OX21rYXJjaGl2ZSBfYmZkX2dlbmVyaWNfbWthcmNoaXZlCisjZW5kaWYKKworI2lmbmRlZiBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhcgorI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAwCisjZW5kaWYKKworI2lmbmRlZiBlbGZfaW5mb190b19ob3d0bworI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAwCisjZW5kaWYKKworI2lmbmRlZiBlbGZfaW5mb190b19ob3d0b19yZWwKKyNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsIDAKKyNlbmRpZgorCisjaWZuZGVmIEVMRl9NQVhQQUdFU0laRQorI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMQorI2VuZGlmCisKKyNpZm5kZWYgZWxmX2JhY2tlbmRfY29sbGVjdAorI2RlZmluZSBlbGZfYmFja2VuZF9jb2xsZWN0IGZhbHNlCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sKKyNkZWZpbmUgZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2sgZmFsc2UKKyNlbmRpZgorCisjaWZuZGVmIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfb2JqZWN0X3AKKyNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCTAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZwkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcJMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZQorI2RlZmluZSBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUgMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcJMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCisjZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCTAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCisjZGVmaW5lIGVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMJMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgorI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaworI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCisjZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIDAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCisjZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCisjZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCAwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucworI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KKyNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sCisjZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJMAorI2VuZGlmCisjaWZuZGVmIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcKKyNkZWZpbmUgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZwkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZworI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycworI2RlZmluZSBlbGZfYmFja2VuZF9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwCisjZGVmaW5lIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAkwCisjZW5kaWYKKyNpZm5kZWYgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAorI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCTAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUKKyNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTAKKyNlbmRpZgorI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUKKyNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCTAKKyNlbmRpZgorCisjaWZuZGVmIEVMRl9NQUNISU5FX0FMVDEKKyNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSAwCisjZW5kaWYKKworI2lmbmRlZiBFTEZfTUFDSElORV9BTFQyCisjZGVmaW5lIEVMRl9NQUNISU5FX0FMVDIgMAorI2VuZGlmCisKKyNpZm5kZWYgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvCisjZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbworI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBfYmZkX2VsZk5OX3NpemVfaW5mbzsKKworc3RhdGljIENPTlNUIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhIGVsZk5OX2JlZCA9Cit7CisjaWZkZWYgVVNFX1JFTAorICAwLAkJCQkvKiB1c2VfcmVsYV9wICovCisjZWxzZQorICAxLAkJCQkvKiB1c2VfcmVsYV9wICovCisjZW5kaWYKKyAgRUxGX0FSQ0gsCQkJLyogYXJjaCAqLworICBFTEZfTUFDSElORV9DT0RFLAkJLyogZWxmX21hY2hpbmVfY29kZSAqLworICBFTEZfTUFYUEFHRVNJWkUsCQkvKiBtYXhwYWdlc2l6ZSAqLworICBlbGZfYmFja2VuZF9jb2xsZWN0LAorICBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vaywKKyAgZWxmX2luZm9fdG9faG93dG8sCisgIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCwKKyAgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCwKKyAgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCisgIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAorICBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKKyAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLAorICBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCisgIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAorICBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAorICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sCisgIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaywKKyAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCisgIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAorICBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MsCisgIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKKyAgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMsCisgIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKKyAgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiwKKyAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAorICBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucywKKyAgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZywKKyAgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKKyAgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMsCisgIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCwKKyAgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAorICBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLAorICBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwLAorICBFTEZfTUFDSElORV9BTFQxLAorICBFTEZfTUFDSElORV9BTFQyLAorICAmZWxmX2JhY2tlbmRfc2l6ZV9pbmZvLAorICBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCwKKyAgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplLAorICBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUsCisgIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCwKKyAgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5LAorICBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0sCisgIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkLAorICBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50LAorICBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMKK307CisKKyNpZmRlZiBUQVJHRVRfQklHX1NZTQorY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfQklHX1NZTSA9Cit7CisgIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCisgIFRBUkdFVF9CSUdfTkFNRSwKKworICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLworICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAorCisgIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBiaWcgZW5kaWFuICovCisgIEJGRF9FTkRJQU5fQklHLAorCisgIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGJpZyBlbmRpYW4gKi8KKyAgQkZEX0VORElBTl9CSUcsCisKKyAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKKyAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisKKyAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKKyAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKKworICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAorICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCisgIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAorCisgIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCisgICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYworICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCisgICcvJywKKworICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgorICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKKyAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcworICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCisgIDE0LAorCisgIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCisKKyAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAorCisgIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KKyAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLworICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KKyAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KKyAgfSwKKworICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KKyAgeyBiZmRfZmFsc2UsCisgICAgYmZkX2VsZk5OX21rb2JqZWN0LAorICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCisgICAgYmZkX2VsZk5OX21rY29yZWZpbGUKKyAgfSwKKworICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCisgIHsgYmZkX2ZhbHNlLAorICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCisgICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAorICB9LAorCisgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKKyAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCisjaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCisgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCisjZWxzZQorICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorI2VuZGlmCisgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCisgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKKworICAvKiBiYWNrZW5kX2RhdGE6ICovCisgIChQVFIpICZlbGZOTl9iZWQsCit9OworI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQorY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Cit7CisgIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCisgIFRBUkdFVF9MSVRUTEVfTkFNRSwKKworICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLworICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAorCisgIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCisgIEJGRF9FTkRJQU5fTElUVExFLAorCisgIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCisKKyAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwKKyAgIERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisKKyAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKKyAgIFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfREVCVUdHSU5HIHwgU0VDX0VYQ0xVREUgfCBTRUNfU09SVF9FTlRSSUVTKSwKKworICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAorICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCisgIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyLAorCisgIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCisgICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBFTEYsIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYworICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCisgICcvJywKKworICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgorICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKKyAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcworICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCisgIDE0LAorCisgIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCisKKyAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAorCisgIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KKyAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgYmZkX2VsZk5OX29iamVjdF9wLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLworICAgIGJmZF9lbGZOTl9hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KKyAgICBiZmRfZWxmTk5fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KKyAgfSwKKworICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KKyAgeyBiZmRfZmFsc2UsCisgICAgYmZkX2VsZk5OX21rb2JqZWN0LAorICAgIGJmZF9lbGZOTl9ta2FyY2hpdmUsCisgICAgYmZkX2VsZk5OX21rY29yZWZpbGUKKyAgfSwKKworICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCisgIHsgYmZkX2ZhbHNlLAorICAgIGJmZF9lbGZOTl93cml0ZV9vYmplY3RfY29udGVudHMsCisgICAgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAorICB9LAorCisgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoYmZkX2VsZk5OKSwKKyAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGJmZF9lbGZOTiksCisjaWZkZWYgYmZkX2VsZk5OX2FyY2hpdmVfZnVuY3Rpb25zCisgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChiZmRfZWxmTk5fYXJjaGl2ZSksCisjZWxzZQorICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAorI2VuZGlmCisgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJmZF9lbGZOTiksCisgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChiZmRfZWxmTk4pLAorICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoYmZkX2VsZk5OKSwKKworICAvKiBiYWNrZW5kX2RhdGE6ICovCisgIChQVFIpICZlbGZOTl9iZWQsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvZXBvYy1wZS1hcm0uYyBiL2JmZC9lcG9jLXBlLWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODlhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZXBvYy1wZS1hcm0uYwpAQCAtMCwwICsxLDMwIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBFUE9DIFBFIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAgICAwCisjZGVmaW5lIFVTRVJfTEFCRUxfUFJFRklYICAgICIiCisKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAiZXBvYy1wZS1hcm0tbGl0dGxlIgorI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZV9iaWdfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJlcG9jLXBlLWFybS1iaWciCisKKworI2luY2x1ZGUgInBlLWFybS5jIgorCmRpZmYgLS1naXQgYS9iZmQvZXBvYy1wZWktYXJtLmMgYi9iZmQvZXBvYy1wZWktYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyNTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9lcG9jLXBlaS1hcm0uYwpAQCAtMCwwICsxLDI5IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBFUE9DIFBFIElNQUdFIENPRkYgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICAgIDAKKyNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggICAgIiIKKworI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAiZXBvYy1wZWktYXJtLWxpdHRsZSIKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgImVwb2MtcGVpLWFybS1iaWciCisKKyNpbmNsdWRlICJwZWktYXJtLmMiCisKZGlmZiAtLWdpdCBhL2JmZC9mb3JtYXQuYyBiL2JmZC9mb3JtYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWYxZjljCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2Zvcm1hdC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKiBHZW5lcmljIEJGRCBzdXBwb3J0IGZvciBmaWxlIGZvcm1hdHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKK1NFQ1RJT04KKwlGaWxlIGZvcm1hdHMKKworCUEgZm9ybWF0IGlzIGEgQkZEIGNvbmNlcHQgb2YgaGlnaCBsZXZlbCBmaWxlIGNvbnRlbnRzIHR5cGUuIFRoZQorCWZvcm1hdHMgc3VwcG9ydGVkIGJ5IEJGRCBhcmU6IAorCisJbyA8PGJmZF9vYmplY3Q+PgorCisJVGhlIEJGRCBtYXkgY29udGFpbiBkYXRhLCBzeW1ib2xzLCByZWxvY2F0aW9ucyBhbmQgZGVidWcgaW5mby4KKworCW8gPDxiZmRfYXJjaGl2ZT4+CisKKwlUaGUgQkZEIGNvbnRhaW5zIG90aGVyIEJGRHMgYW5kIGFuIG9wdGlvbmFsIGluZGV4LgorCisJbyA8PGJmZF9jb3JlPj4KKworCVRoZSBCRkQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBhbiBleGVjdXRhYmxlIGNvcmUgZHVtcC4KKworCisqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKy8qIElNUE9SVCBmcm9tIHRhcmdldHMuYy4gICovCitleHRlcm4gY29uc3Qgc2l6ZV90IF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzOworCisvKgorRlVOQ1RJT04KKwliZmRfY2hlY2tfZm9ybWF0CisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOworCitERVNDUklQVElPTgorCVZlcmlmeSBpZiB0aGUgZmlsZSBhdHRhY2hlZCB0byB0aGUgQkZEIEB2YXJ7YWJmZH0gaXMgY29tcGF0aWJsZQorCXdpdGggdGhlIGZvcm1hdCBAdmFye2Zvcm1hdH0gKGkuZS4sIG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwKKwk8PGJmZF9hcmNoaXZlPj4gb3IgPDxiZmRfY29yZT4+KS4KKworCUlmIHRoZSBCRkQgaGFzIGJlZW4gc2V0IHRvIGEgc3BlY2lmaWMgdGFyZ2V0IGJlZm9yZSB0aGUKKwljYWxsLCBvbmx5IHRoZSBuYW1lZCB0YXJnZXQgYW5kIGZvcm1hdCBjb21iaW5hdGlvbiBpcworCWNoZWNrZWQuIElmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIHNldCwgb3IgaGFzIGJlZW4gc2V0IHRvCisJPDxkZWZhdWx0Pj4sIHRoZW4gYWxsIHRoZSBrbm93biB0YXJnZXQgYmFja2VuZHMgaXMKKwlpbnRlcnJvZ2F0ZWQgdG8gZGV0ZXJtaW5lIGEgbWF0Y2guICBJZiB0aGUgZGVmYXVsdCB0YXJnZXQKKwltYXRjaGVzLCBpdCBpcyB1c2VkLiAgSWYgbm90LCBleGFjdGx5IG9uZSB0YXJnZXQgbXVzdCByZWNvZ25pemUKKwl0aGUgZmlsZSwgb3IgYW4gZXJyb3IgcmVzdWx0cy4KKworCVRoZSBmdW5jdGlvbiByZXR1cm5zIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSA8PGZhbHNlPj4KKwl3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOiAgCisKKwlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQorCWlmIDw8Zm9ybWF0Pj4gaXMgbm90IG9uZSBvZiA8PGJmZF9vYmplY3Q+PiwgPDxiZmRfYXJjaGl2ZT4+IG9yCisJPDxiZmRfY29yZT4+LgorCisJbyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+IC0KKwlpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBhIHJlYWQgLSBldmVuIHNvbWUgZmlsZSBtaXNtYXRjaGVzCisJY2FuIGNhdXNlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbHMuCisKKwlvIDw8ZmlsZV9ub3RfcmVjb2duaXNlZD4+IC0KKwlub25lIG9mIHRoZSBiYWNrZW5kcyByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KKworCW8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4gLQorCW1vcmUgdGhhbiBvbmUgYmFja2VuZCByZWNvZ25pc2VkIHRoZSBmaWxlIGZvcm1hdC4KKyovCisKK2Jvb2xlYW4KK2JmZF9jaGVja19mb3JtYXQgKGFiZmQsIGZvcm1hdCkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKK3sKKyAgcmV0dXJuIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBOVUxMKTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZyk7CisKK0RFU0NSSVBUSU9OCisJTGlrZSA8PGJmZF9jaGVja19mb3JtYXQ+PiwgZXhjZXB0IHdoZW4gaXQgcmV0dXJucyBmYWxzZSB3aXRoCisJPDxiZmRfZXJybm8+PiBzZXQgdG8gPDxiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkPj4uICBJbiB0aGF0CisJY2FzZSwgaWYgQHZhcnttYXRjaGluZ30gaXMgbm90IE5VTEwsIGl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKKwlhIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgZm9ybWF0cyB0aGF0IG1hdGNoZWQsCisJYWxsb2NhdGVkIHdpdGggPDxtYWxsb2M+Pi4KKwlUaGVuIHRoZSB1c2VyIG1heSBjaG9vc2UgYSBmb3JtYXQgYW5kIHRyeSBhZ2Fpbi4KKworCVdoZW4gZG9uZSB3aXRoIHRoZSBsaXN0IHRoYXQgQHZhcnttYXRjaGluZ30gcG9pbnRzIHRvLCB0aGUgY2FsbGVyCisJc2hvdWxkIGZyZWUgaXQuICAKKyovCisKK2Jvb2xlYW4KK2JmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgZm9ybWF0LCBtYXRjaGluZykKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKKyAgICAgY2hhciAqKiptYXRjaGluZzsKK3sKKyAgZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmluYXJ5X3ZlYzsKKyAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQsICpzYXZlX3RhcmcsICpyaWdodF90YXJnOworICBjaGFyICoqbWF0Y2hpbmdfdmVjdG9yID0gTlVMTDsKKyAgaW50IG1hdGNoX2NvdW50OworCisgIGlmICghYmZkX3JlYWRfcCAoYWJmZCkgfHwKKyAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpIDwgKGludCliZmRfdW5rbm93bikgfHwKKyAgICAgICgoaW50KShhYmZkLT5mb3JtYXQpID49IChpbnQpYmZkX3R5cGVfZW5kKSkgeworICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKKyAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpPyB0cnVlOiBmYWxzZTsKKworCisgIC8qIFNpbmNlIHRoZSB0YXJnZXQgdHlwZSB3YXMgZGVmYXVsdGVkLCBjaGVjayB0aGVtIAorICAgICBhbGwgaW4gdGhlIGhvcGUgdGhhdCBvbmUgd2lsbCBiZSB1bmlxdWVseSByZWNvZ25pemVkLiAgKi8KKworICBzYXZlX3RhcmcgPSBhYmZkLT54dmVjOworICBtYXRjaF9jb3VudCA9IDA7CisgIGlmIChtYXRjaGluZykKKyAgICB7CisgICAgICBtYXRjaGluZ192ZWN0b3IgPQorCShjaGFyICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGNoYXIgKikgKgorCQkJICAgICAgKF9iZmRfdGFyZ2V0X3ZlY3Rvcl9lbnRyaWVzICsgMSkpOworICAgICAgaWYgKCFtYXRjaGluZ192ZWN0b3IpCisJcmV0dXJuIGZhbHNlOworICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gTlVMTDsKKyAgICAgICptYXRjaGluZyA9IG1hdGNoaW5nX3ZlY3RvcjsKKyAgICB9CisgIHJpZ2h0X3RhcmcgPSAwOworCisKKyAgLyogcHJlc3VtZSB0aGUgYW5zd2VyIGlzIHllcyAqLworICBhYmZkLT5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgLyogSWYgdGhlIHRhcmdldCB0eXBlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwganVzdCBjaGVjayB0aGF0IHRhcmdldC4gICovCisKKyAgaWYgKCFhYmZkLT50YXJnZXRfZGVmYXVsdGVkKSB7CisgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCS8qIHJld2luZCEgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByaWdodF90YXJnID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKKyAgICBpZiAocmlnaHRfdGFyZykgeworICAgICAgYWJmZC0+eHZlYyA9IHJpZ2h0X3Rhcmc7CQkvKiBTZXQgdGhlIHRhcmdldCBhcyByZXR1cm5lZCAqLworICAgICAgaWYgKG1hdGNoaW5nKQorCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7CisgICAgICByZXR1cm4gdHJ1ZTsJCQkvKiBGaWxlIHBvc2l0aW9uIGhhcyBtb3ZlZCwgQlRXICovCisgICAgfQorCisgICAgLyogRm9yIGEgbG9uZyB0aW1lIHRoZSBjb2RlIGhhcyBkcm9wcGVkIHRocm91Z2ggdG8gY2hlY2sgYWxsCisgICAgICAgdGFyZ2V0cyBpZiB0aGUgc3BlY2lmaWVkIHRhcmdldCB3YXMgd3JvbmcuICBJIGRvbid0IGtub3cgd2h5LAorICAgICAgIGFuZCBJJ20gcmVsdWN0YW50IHRvIGNoYW5nZSBpdC4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGFuCisgICAgICAgYXJjaGl2ZSwgaXQgY2FuIGNhdXNlIHByb2JsZW1zLiAgSWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgZG9lcworICAgICAgIG5vdCBwZXJtaXQgYXJjaGl2ZXMgKGUuZy4sIHRoZSBiaW5hcnkgdGFyZ2V0KSwgdGhlbiB3ZSBzaG91bGQKKyAgICAgICBub3QgYWxsb3cgc29tZSBvdGhlciB0YXJnZXQgdG8gcmVjb2duaXplIGl0IGFzIGFuIGFyY2hpdmUsIGJ1dAorICAgICAgIHNob3VsZCBpbnN0ZWFkIGFsbG93IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbgorICAgICAgIG9iamVjdC4gIFdoZW4gSSBmaXJzdCBtYWRlIHRoaXMgY2hhbmdlLCBpdCBicm9rZSB0aGUgUEUgdGFyZ2V0LAorICAgICAgIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBwZWktaTM4NiB0YXJnZXQgZGlkIG5vdCByZWNvZ25pemUgdGhlCisgICAgICAgYWN0dWFsIHBlLWkzODYgYXJjaGl2ZS4gIFNpbmNlIHRoZXJlIG1heSBiZSBvdGhlciBwcm9ibGVtcyBvZgorICAgICAgIHRoaXMgc29ydCwgSSBjaGFuZ2VkIHRoaXMgdGVzdCB0byBjaGVjayBvbmx5IGZvciB0aGUgYmluYXJ5CisgICAgICAgdGFyZ2V0LiAgKi8KKworICAgIGlmIChmb3JtYXQgPT0gYmZkX2FyY2hpdmUgJiYgc2F2ZV90YXJnID09ICZiaW5hcnlfdmVjKQorICAgICAgeworCWFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7CisJYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247CisJaWYgKG1hdGNoaW5nKQorCSAgZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7CisJcmV0dXJuIGZhbHNlOworICAgICAgfQorICB9CisKKyAgZm9yICh0YXJnZXQgPSBiZmRfdGFyZ2V0X3ZlY3RvcjsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykgeworICAgIGNvbnN0IGJmZF90YXJnZXQgKnRlbXA7CisKKyAgICBpZiAoKnRhcmdldCA9PSAmYmluYXJ5X3ZlYykKKyAgICAgIGNvbnRpbnVlOworCisgICAgYWJmZC0+eHZlYyA9ICp0YXJnZXQ7CS8qIENoYW5nZSBCRkQncyB0YXJnZXQgdGVtcG9yYXJpbHkgKi8KKyAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvKiBJZiBfYmZkX2NoZWNrX2Zvcm1hdCBuZWdsZWN0cyB0byBzZXQgYmZkX2Vycm9yLCBhc3N1bWUgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdC4KKyAgICAgICBXZSBkaWRuJ3QgdXNlZCB0byBldmVuIHBheSBhbnkgYXR0ZW50aW9uIHRvIGJmZF9lcnJvciwgc28gSSBzdXNwZWN0CisgICAgICAgdGhhdCBzb21lIF9iZmRfY2hlY2tfZm9ybWF0IG1pZ2h0IGhhdmUgdGhpcyBwcm9ibGVtLiAgKi8KKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICB0ZW1wID0gQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX2NoZWNrX2Zvcm1hdCwgKGFiZmQpKTsKKyAgICBpZiAodGVtcCkgewkJCQkvKiBUaGlzIGZvcm1hdCBjaGVja3Mgb3V0IGFzIG9rISAqLworICAgICAgcmlnaHRfdGFyZyA9IHRlbXA7CisgICAgICBpZiAobWF0Y2hpbmcpCisJeworCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50XSA9IHRlbXAtPm5hbWU7CisJICBtYXRjaGluZ192ZWN0b3JbbWF0Y2hfY291bnQgKyAxXSA9IE5VTEw7CisJfQorICAgICAgbWF0Y2hfY291bnQrKzsKKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhY2NlcHQgaXQsIGV2ZW4gaWYgb3RoZXIgdGFyZ2V0cworCSBtaWdodCBtYXRjaC4gIFBlb3BsZSB3aG8gd2FudCB0aG9zZSBvdGhlciB0YXJnZXRzIGhhdmUgdG8gc2V0IAorCSB0aGUgR05VVEFSR0VUIHZhcmlhYmxlLiAgKi8KKyAgICAgIGlmICh0ZW1wID09IGJmZF9kZWZhdWx0X3ZlY3RvclswXSkKKwl7CisJICBpZiAobWF0Y2hpbmcpCisJICAgIHsKKwkgICAgICBtYXRjaGluZ192ZWN0b3JbMF0gPSB0ZW1wLT5uYW1lOworCSAgICAgIG1hdGNoaW5nX3ZlY3RvclsxXSA9IE5VTEw7CisJICAgIH0KKwkgIG1hdGNoX2NvdW50ID0gMTsKKwkgIGJyZWFrOworCX0KKyNpZmRlZiBHTlU5NjAKKyAgICAgIC8qIEJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gYi5vdXQgYXJjaGl2ZXMgbG9vayB0aGUgc2FtZSwgYnV0IGl0IGRvZXNuJ3QKKyAgICAgICAqIG1hdHRlcjogdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGVpciBoZWFkZXJzLCBhbmQgbWVtYmVyIGZpbGUgYnl0ZQorICAgICAgICogb3JkZXJzIHdpbGwgKEkgaG9wZSkgYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5IGJ5IGJmZC4gIERpdHRvIGZvciBiaWcKKyAgICAgICAqIGFuZCBsaXR0bGUgY29mZiBhcmNoaXZlcy4gIEFuZCB0aGUgNCBjb2ZmL2Iub3V0IG9iamVjdCBmb3JtYXRzIGFyZQorICAgICAgICogdW5hbWJpZ3VvdXMuICBTbyBhY2NlcHQgdGhlIGZpcnN0IG1hdGNoIHdlIGZpbmQuCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpIHsKKyAgICAgIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7CisgICAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKKyAgICAgIGlmIChtYXRjaGluZyAmJiBiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisJZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAobWF0Y2hfY291bnQgPT0gMSkgeworICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogQ2hhbmdlIEJGRCdzIHRhcmdldCBwZXJtYW5lbnRseSAqLworICAgIGlmIChtYXRjaGluZykKKyAgICAgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7CisgICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLworICB9CisKKyAgYWJmZC0+eHZlYyA9IHNhdmVfdGFyZzsJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdGFyZ2V0IHR5cGUgKi8KKyAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247CQkvKiBSZXN0b3JlIG9yaWdpbmFsIGZvcm1hdCAqLworICBpZiAobWF0Y2hfY291bnQgPT0gMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7CisgICAgICBpZiAobWF0Y2hpbmcpCisJZnJlZSAobWF0Y2hpbmdfdmVjdG9yKTsKKyAgICB9CisgIGVsc2UKKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfc2V0X2Zvcm1hdAorCitTWU5PUFNJUworCWJvb2xlYW4gYmZkX3NldF9mb3JtYXQoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCk7CisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgQkZEIEB2YXJ7YWJmZH0gdG8gdGhlCisJZm9ybWF0IEB2YXJ7Zm9ybWF0fS4gSWYgdGhlIHRhcmdldCBzZXQgaW4gdGhlIEJGRCBkb2VzIG5vdAorCXN1cHBvcnQgdGhlIGZvcm1hdCByZXF1ZXN0ZWQsIHRoZSBmb3JtYXQgaXMgaW52YWxpZCwgb3IgdGhlIEJGRAorCWlzIG5vdCBvcGVuIGZvciB3cml0aW5nLCB0aGVuIGFuIGVycm9yIG9jY3Vycy4KKworKi8KKworYm9vbGVhbgorYmZkX3NldF9mb3JtYXQgKGFiZmQsIGZvcm1hdCkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfZm9ybWF0IGZvcm1hdDsKK3sKKworICBpZiAoYmZkX3JlYWRfcCAoYWJmZCkgfHwKKyAgICAgICgoaW50KWFiZmQtPmZvcm1hdCA8IChpbnQpYmZkX3Vua25vd24pIHx8CisgICAgICAoKGludClhYmZkLT5mb3JtYXQgPj0gKGludCliZmRfdHlwZV9lbmQpKSB7CisgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoYWJmZC0+Zm9ybWF0ICE9IGJmZF91bmtub3duKQorICAgIHJldHVybiAoYWJmZC0+Zm9ybWF0ID09IGZvcm1hdCkgPyB0cnVlOmZhbHNlOworCisgIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KKyAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OworCisgIGlmICghQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3NldF9mb3JtYXQsIChhYmZkKSkpIHsKKyAgICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKgorRlVOQ1RJT04KKwliZmRfZm9ybWF0X3N0cmluZworCitTWU5PUFNJUworCUNPTlNUIGNoYXIgKmJmZF9mb3JtYXRfc3RyaW5nKGJmZF9mb3JtYXQgZm9ybWF0KTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gYSBwb2ludGVyIHRvIGEgY29uc3Qgc3RyaW5nCisJPDxpbnZhbGlkPj4sIDw8b2JqZWN0Pj4sIDw8YXJjaGl2ZT4+LCA8PGNvcmU+Piwgb3IgPDx1bmtub3duPj4sCisJZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIG9mIEB2YXJ7Zm9ybWF0fS4KKyovCisKK0NPTlNUIGNoYXIgKgorYmZkX2Zvcm1hdF9zdHJpbmcgKGZvcm1hdCkKKyAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Cit7CisgIGlmICgoKGludClmb3JtYXQgPChpbnQpIGJmZF91bmtub3duKSAKKyAgICAgIHx8ICgoaW50KWZvcm1hdCA+PShpbnQpIGJmZF90eXBlX2VuZCkpIAorICAgIHJldHVybiAiaW52YWxpZCI7CisgIAorICBzd2l0Y2ggKGZvcm1hdCkgeworICBjYXNlIGJmZF9vYmplY3Q6CisgICAgcmV0dXJuICJvYmplY3QiOwkJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLworICBjYXNlIGJmZF9hcmNoaXZlOiAKKyAgICByZXR1cm4gImFyY2hpdmUiOwkJLyogb2JqZWN0IGFyY2hpdmUgZmlsZSAqLworICBjYXNlIGJmZF9jb3JlOiAKKyAgICByZXR1cm4gImNvcmUiOwkJLyogY29yZSBkdW1wICovCisgIGRlZmF1bHQ6IAorICAgIHJldHVybiAidW5rbm93biI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2JmZC9mcmVlYnNkLmggYi9iZmQvZnJlZWJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvZnJlZWJzZC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBCRkQgYmFjay1lbmQgZGVmaW5pdGlvbnMgdXNlZCBieSBhbGwgRnJlZUJTRCB0YXJnZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKy8qIEZyZWVCU0QgWk1BR0lDIGZpbGVzIG5ldmVyIGhhdmUgdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gKi8KKyNkZWZpbmUJTl9IRUFERVJfSU5fVEVYVCh4KQkwCisKKy8qIFpNQUdJQyBmaWxlcyBzdGFydCBhdCBvZmZzZXQgMC4gIERvZXMgbm90IGFwcGx5IHRvIFFNQUdJQyBmaWxlcy4gKi8KKyNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCQkwCisKKyNkZWZpbmUgTl9HRVRNQUdJQ19ORVQoZXhlYykgXAorCSgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQorI2RlZmluZSBOX0dFVE1JRF9ORVQoZXhlYykgXAorCSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDNmZikKKyNkZWZpbmUgTl9HRVRGTEFHX05FVChleCkgXAorCSgoKGV4ZWMpLmFfaW5mbyA+PiAyNikgJiAweDNmKQorCisjZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgXAorCSgoZW51bSBtYWNoaW5lX3R5cGUpIFwKKwkgKChOX0dFVE1BR0lDX05FVCAoZXhlYykgPT0gWk1BR0lDKSA/IE5fR0VUTUlEX05FVCAoZXhlYykgOiBcCisJICAoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDNmZikpCisjZGVmaW5lIE5fRkxBR1MoZXhlYykgXAorCSgoTl9HRVRNQUdJQ19ORVQgKGV4ZWMpID09IFpNQUdJQykgPyBOX0dFVEZMQUdfTkVUIChleGVjKSA6IFwKKwkgKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKKworI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAorCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKKwkgfCAoKChpbnQpKHR5cGUpICYgMHgzZmYpIDw8IDE2KSBcCisJIHwgKCgoZmxhZ3MpICYgMHgzZikgPDwgMjYpKQorI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAorCSgoZXhlYykuYV9pbmZvID0gXAorICAgICAgICAgKChleGVjKS5hX2luZm8gJiAweGZiMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHgzZmYpIDw8IDE2KSkKKyNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9IFwKKwkgKChleGVjKS5hX2luZm8gJiAweDAzZmZmZmZmKSB8ICgoZmxhZ3MgJiAweDAzZikgPDwgMjYpKQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAibGliYW91dC5oIgorCisvKiBPbiBGcmVlQlNELCB0aGUgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBpbiBpMzg2IChsaXR0bGUtZW5kaWFuKQorICAgZm9ybWF0LiAgSSB0aGluay4gICovCisjZGVmaW5lIFNXQVBfTUFHSUMoZXh0KSBiZmRfZ2V0bDMyIChleHQpCisKKworI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQorc3RhdGljIGJvb2xlYW4gTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCisKKy8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgorICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCisgICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisKKyNpZiBDSE9PU0VfUkVMT0NfU0laRQorICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKKyNlbHNlCisgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOworI2VuZGlmCisKKyAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgeworICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgaWYgKHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImEub3V0LW02OGs0ay1uZXRic2QiKSA9PSAwKQorICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4SzRLX05FVEJTRCk7CisgICAgZWxzZQorICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4S19ORVRCU0QpOworICAgIGJyZWFrOworICBjYXNlIGJmZF9hcmNoX3NwYXJjOgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9TUEFSQ19ORVRCU0QpOworICAgIGJyZWFrOworICBjYXNlIGJmZF9hcmNoX2kzODY6CisgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzM4Nl9ORVRCU0QpOworICAgIGJyZWFrOworICBjYXNlIGJmZF9hcmNoX25zMzJrOgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV81MzJfTkVUQlNEKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7CisgICAgYnJlYWs7CisgIH0KKworICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JmZC9nZW4tYW91dC5jIGIvYmZkL2dlbi1hb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlZDkxYQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9nZW4tYW91dC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBHZW5lcmF0ZSBwYXJhbWV0ZXJzIGZvciBhbiBhLm91dCBzeXN0ZW0uCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiL3Vzci9pbmNsdWRlL2Eub3V0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsgY2hhcioqIGFyZ3Y7Cit7CisgIHN0cnVjdCBleGVjIG15X2V4ZWM7CisgIGludCBwYWdlX3NpemU7CisgIGNoYXIgKnRhcmdldCA9ICJ1bmtub3duIiwgKmFyY2ggPSAidW5rbm93biI7CisgIEZJTEUgKmZpbGUgPSBmb3BlbigiZ2VuLWFvdXQiLCAiciIpOworCisgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZ2VuLWFvdXQhXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZnJlYWQoJm15X2V4ZWMsIHNpemVvZihzdHJ1Y3QgZXhlYyksIDEsIGZpbGUpICE9IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgZ2VuLWFvdXQhXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIHRhcmdldCA9IGFyZ3ZbMV07CisgIGlmICh0YXJnZXQgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZ2VuLWFvdXQgdGFyZ2V0X25hbWVcbiIpOworICAgICAgZXhpdCAoMSk7CisgIH0KKworI2lmZGVmIE5fVFhUT0ZGCisgIHBhZ2Vfc2l6ZSA9IE5fVFhUT0ZGKG15X2V4ZWMpOworICBpZiAocGFnZV9zaXplID09IDApCisgICAgcHJpbnRmKCIjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMVxuIik7CisgIGVsc2UKKyAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwXG4iKTsKKyNlbmRpZgorCisgIHByaW50ZigiI2RlZmluZSBCWVRFU19JTl9XT1JEICVkXG4iLCBzaXplb2YgKGludCkpOworICBpZiAobXlfZXhlYy5hX2VudHJ5ID09IDApIHsKKyAgICAgIHByaW50ZigiI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVST1xuIik7CisgICAgICBwcmludGYoIiNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgKi9cbiIpOworICB9CisgIGVsc2UgeworICAgICAgcHJpbnRmKCIvKiNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8qL1xuIik7CisgICAgICBwcmludGYoIi8qI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCovXG4iKTsKKyAgfQorCisgIHByaW50ZigiI2RlZmluZSBURVhUX1NUQVJUX0FERFIgJWRcbiIsIG15X2V4ZWMuYV9lbnRyeSk7CisKKyNpZmRlZiBQQUdTSVoKKyAgaWYgKHBhZ2Vfc2l6ZSA9PSAwKQorICAgIHBhZ2Vfc2l6ZSA9IFBBR1NJWjsKKyNlbmRpZgorICBpZiAocGFnZV9zaXplICE9IDApCisgICAgcHJpbnRmKCIjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgJWRcbiIsIHBhZ2Vfc2l6ZSk7CisgIGVsc2UKKyAgICBwcmludGYoIi8qICNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA/Pz8gKi9cbiIpOworICBwcmludGYoIiNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkVcbiIpOworCisjaWZkZWYgdmF4CisgIGFyY2ggPSAidmF4IjsKKyNlbmRpZgorI2lmZGVmIG02OGsKKyAgYXJjaCA9ICJtNjhrIjsKKyNlbmRpZgorICBpZiAoYXJjaFswXSA9PSAnMScpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ3YXJuaW5nOiBwcmVwcm9jZXNzb3Igc3Vic3RpdHV0ZWQgYXJjaGl0ZWN0dXJlIG5hbWUgaW5zaWRlIHN0cmluZzsiKSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiAgICAgICAgIGZpeCBERUZBVUxUX0FSQ0ggaW4gdGhlIG91dHB1dCBmaWxlIHlvdXJzZWxmXG4iKSk7CisgICAgICBhcmNoID0gInVua25vd24iOworICAgIH0KKyAgcHJpbnRmKCIjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF8lc1xuIiwgYXJjaCk7CisKKyAgcHJpbnRmKCJcbiNkZWZpbmUgTVkoT1ApIENBVCglc18sT1ApXG4iLCB0YXJnZXQpOworICBwcmludGYoIiNkZWZpbmUgVEFSR0VUTkFNRSBcImEub3V0LSVzXCJcblxuIiwgdGFyZ2V0KTsKKworICBwcmludGYoIiNpbmNsdWRlIFwiYmZkLmhcIlxuIik7CisgIHByaW50ZigiI2luY2x1ZGUgXCJzeXNkZXAuaFwiXG4iKTsKKyAgcHJpbnRmKCIjaW5jbHVkZSBcImxpYmJmZC5oXCJcbiIpOworICBwcmludGYoIiNpbmNsdWRlIFwibGliYW91dC5oXCJcbiIpOworICBwcmludGYoIlxuI2luY2x1ZGUgXCJhb3V0LXRhcmdldC5oXCJcbiIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbmxpbmsuaCBiL2JmZC9nZW5saW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwYThkZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9nZW5saW5rLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIGdlbmxpbmsuaCAtLSBpbnRlcmZhY2UgdG8gdGhlIEJGRCBnZW5lcmljIGxpbmtlcgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgR0VOTElOS19ICisjZGVmaW5lIEdFTkxJTktfSAorCisvKiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVybmFsIHRvIEJGRC4gIEl0IGRlc2NyaWJlcyB0aGUgaW50ZXJuYWwKKyAgIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIsIGluIGNhc2UKKyAgIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBsaW5rZXJzIHdhbnQgdG8gdXNlIG9yIGNhbGwgdGhlbS4gIE5vdGUKKyAgIHRoYXQgc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsCisgICBhcmUgZGVjbGFyZWQgaW4gbGliYmZkLmgsIGJlY2F1c2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgd2lkZWx5CisgICB1c2VkLiAgVGhlIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgd2lsbCBwcm9iYWJseSBvbmx5CisgICBiZSB1c2VkIGJ5IGEgZmV3IGZpbGVzIGJlc2lkZXMgbGlua2VyLmMgaXRzZWxmLiAgSW4gZmFjdCwgdGhpcyBmaWxlCisgICBpcyBub3QgcGFydGljdWxhcmx5IGNvbXBsZXRlOyBJIGhhdmUgb25seSBwdXQgaW4gdGhlIGludGVyZmFjZXMgSQorICAgYWN0dWFsbHkgbmVlZGVkLiAgKi8KKworLyogVGhlIGdlbmVyaWMgbGlua2VyIHVzZXMgYSBoYXNoIHRhYmxlIHdoaWNoIGlzIGEgZGVyaXZlZCBjbGFzcyBvZgorICAgdGhlIHN0YW5kYXJkIGxpbmtlciBoYXNoIHRhYmxlLCBqdXN0IGFzIHRoZSBvdGhlciBiYWNrZW5kIHNwZWNpZmljCisgICBsaW5rZXJzIGRvLiAgRG8gbm90IGNvbmZ1c2UgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgd2l0aCB0aGUKKyAgIHN0YW5kYXJkIEJGRCBsaW5rZXIgaGFzaCB0YWJsZSBpdCBpcyBidWlsdCB1cG9uLiAgKi8KKworLyogR2VuZXJpYyBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KKworc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7CisgIC8qIFdoZXRoZXIgdGhpcyBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbiBvdXQuICAqLworICBib29sZWFuIHdyaXR0ZW47CisgIC8qIFN5bWJvbCBmcm9tIGlucHV0IEJGRC4gICovCisgIGFzeW1ib2wgKnN5bTsKK307CisKKy8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKK307CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCisgICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIFwKKyAgIGJmZF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksIChmb2xsb3cpKSkKKworLyogVHJhdmVyc2UgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCisgIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcworICAganVzdCBhIGNhc3QuICAqLworCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlKHApIFwKKyAgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCisKKy8qIFRoZSBnZW5lcmljIGxpbmtlciByZWFkcyBpbiB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGZvciBhbiBpbnB1dCBCRkQKKyAgIGFuZCBrZWVwcyB0aGVtIGluIHRoZSBvdXRzeW1ib2wgYW5kIHN5bWNvdW50IGZpZWxkcy4gICovCisKKyNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMoYWJmZCkgKChhYmZkKS0+b3V0c3ltYm9scykKKyNkZWZpbmUgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50KGFiZmQpICgoYWJmZCktPnN5bWNvdW50KQorCisvKiBBZGQgdGhlIHN5bWJvbHMgb2YgaW5wdXRfYmZkIHRvIHRoZSBzeW1ib2xzIGJlaW5nIGJ1aWx0IGZvcgorICAgb3V0cHV0X2JmZC4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scworICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCSAgIHNpemVfdCAqcHN5bWFsbG9jKSk7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bworICAgX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCwgd2hpY2ggbWF5IGJlIGNhbGxlZCB2aWEKKyAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8KK3sKKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgIGJmZCAqb3V0cHV0X2JmZDsKKyAgc2l6ZV90ICpwc3ltYWxsb2M7Cit9OworCisvKiBXcml0ZSBvdXQgYSBzaW5nbGUgZ2xvYmFsIHN5bWJvbC4gIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkCisgICB2aWEgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdAorICAgYWN0dWFsbHkgYmUgYSBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKi4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKKworLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgZW50cnkgY3JlYXRpb24gcm91dGluZS4gICovCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisgICAgICAgICAgIGNvbnN0IGNoYXIgKikpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9nbzMyc3R1Yi5oIGIvYmZkL2dvMzJzdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0Mzg4YwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9nbzMyc3R1Yi5oCkBAIC0wLDAgKzEsMTI4IEBACisweDRkLDB4NWEsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MjcsMHgwMCwweGZmLDB4ZmYsMHgwMCwweDAwLAorMHg2MCwweDA3LDB4MDAsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4MGQsMHgwYSwweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2OCwKKzB4MjAsMHg2NywweDY1LDB4NmUsMHg2NSwweDcyLDB4NjEsMHg3NCwweDY1LDB4NjQsMHgyMCwweDY2LDB4NzIsMHg2ZiwweDZkLDB4MjAsCisweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2MSwweDczLDB4NmQsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwweDczLAorMHg2ZCwweDJjLDB4MjAsMHg2ZiwweDZlLDB4MjAsMHg1NywweDY1LDB4NjQsMHgyMCwweDRhLDB4NzUsMHg2ZSwweDIwLDB4MzEsMHgzMSwKKzB4MjAsMHgzMSwweDM2LDB4M2EsMHgzMCwweDM5LDB4M2EsMHgzMSwweDM1LDB4MjAsMHgzMSwweDM5LDB4MzksMHgzNywweDBkLDB4MGEsCisweDU0LDB4NjgsMHg2NSwweDIwLDB4NTMsMHg1NCwweDU1LDB4NDIsMHgyZSwweDQ1LDB4NTgsMHg0NSwweDIwLDB4NzMsMHg3NCwweDc1LAorMHg2MiwweDIwLDB4NmMsMHg2ZiwweDYxLDB4NjQsMHg2NSwweDcyLDB4MjAsMHg2OSwweDczLDB4MjAsMHg0MywweDZmLDB4NzAsMHg3OSwKKzB4NzIsMHg2OSwweDY3LDB4NjgsMHg3NCwweDIwLDB4MjgsMHg0MywweDI5LDB4MjAsMHgzMSwweDM5LDB4MzksMHgzMywweDJkLDB4MzEsCisweDM5LDB4MzksMHgzNSwweDIwLDB4NDQsMHg0YSwweDIwLDB4NDQsMHg2NSwweDZjLDB4NmYsMHg3MiwweDY5LDB4NjUsMHgyZSwweDIwLAorMHgwZCwweDBhLDB4NTAsMHg2NSwweDcyLDB4NmQsMHg2OSwweDczLDB4NzMsMHg2OSwweDZmLDB4NmUsMHgyMCwweDY3LDB4NzIsMHg2MSwKKzB4NmUsMHg3NCwweDY1LDB4NjQsMHgyMCwweDc0LDB4NmYsMHgyMCwweDc1LDB4NzMsMHg2NSwweDIwLDB4NjYsMHg2ZiwweDcyLDB4MjAsCisweDYxLDB4NmUsMHg3OSwweDIwLDB4NzAsMHg3NSwweDcyLDB4NzAsMHg2ZiwweDczLDB4NjUsMHgyMCwweDcwLDB4NzIsMHg2ZiwweDc2LAorMHg2OSwweDY0LDB4NjUsMHg2NCwweDIwLDB4NzQsMHg2OCwweDY5LDB4NzMsMHgyMCwweDYzLDB4NmYsMHg3MCwweDc5LDB4NzIsMHg2OSwKKzB4NjcsMHg2OCwweDc0LDB4MjAsMHgwZCwweDBhLDB4NzIsMHg2NSwweDZkLDB4NjEsMHg2OSwweDZlLDB4NzMsMHgyMCwweDcwLDB4NzIsCisweDY1LDB4NzMsMHg2NSwweDZlLDB4NzQsMHgyMCwweDYxLDB4NmUsMHg2NCwweDIwLDB4NzUsMHg2ZSwweDZkLDB4NmYsMHg2NCwweDY5LAorMHg2NiwweDY5LDB4NjUsMHg2NCwweDJlLDB4MjAsMHgwZCwweDBhLDB4NTQsMHg2OCwweDY5LDB4NzMsMHgyMCwweDZmLDB4NmUsMHg2YywKKzB4NzksMHgyMCwweDYxLDB4NzAsMHg3MCwweDZjLDB4NjksMHg2NSwweDczLDB4MjAsMHg3NCwweDZmLDB4MjAsMHg3NCwweDY4LDB4NjUsCisweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyYywweDIwLDB4NjEsMHg2ZSwweDY0LDB4MjAsMHg2ZSwweDZmLDB4NzQsMHgyMCwweDZlLAorMHg2NSwweDYzLDB4NjMsMHg2NSwweDczLDB4NzMsMHg2MSwweDcyLDB4NjksMHg2YywweDc5LDB4MjAsMHg3NCwweDY4LDB4NjUsMHgyMCwKKzB4NzcsMHg2OCwweDZmLDB4NmMsMHg2NSwweDIwLDB4NzAsMHg3MiwweDZmLDB4NjcsMHg3MiwweDYxLDB4NmQsMHgyZSwweDBhLDB4MGQsCisweDBhLDB4MjQsMHg0OSwweDY0LDB4M2EsMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2MSwweDczLDB4NmQsMHgyMCwweDYyLAorMHg3NSwweDY5LDB4NmMsMHg3NCwweDIwLDB4MzAsMHgzNiwweDJmLDB4MzEsMHgzMSwweDJmLDB4MzksMHgzNywweDIwLDB4MzEsMHgzNiwKKzB4M2EsMHgzMCwweDM5LDB4M2EsMHgzMSwweDM1LDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsMHg3MywweDZkLDB4MjAsCisweDI0LDB4MGEsMHgwZCwweDBhLDB4NDAsMHgyOCwweDIzLDB4MjksMHgyMCwweDczLDB4NzQsMHg3NSwweDYyLDB4MmUsMHg2MSwweDczLAorMHg2ZCwweDIwLDB4NjIsMHg3NSwweDY5LDB4NmMsMHg3NCwweDIwLDB4MzAsMHgzNiwweDJmLDB4MzEsMHgzMSwweDJmLDB4MzksMHgzNywKKzB4MjAsMHgzMSwweDM2LDB4M2EsMHgzMCwweDM5LDB4M2EsMHgzMSwweDM1LDB4MjAsMHg2MiwweDc5LDB4MjAsMHg2NCwweDZhLDB4NjEsCisweDczLDB4NmQsMHgwYSwweDBkLDB4MGEsMHgxYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4NjcsMHg2ZiwweDMzLDB4MzIsMHg3MywweDc0LDB4NzUsMHg2MiwweDJjLDB4MjAsMHg3NiwweDIwLDB4MzIsMHgyZSwweDMwLDB4MzAsCisweDU0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHg1NywweDUzLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyZSwweDQ1LDB4NTgsMHg0NSwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBlLDB4MWYsMHg4YywweDFlLDB4MjQsMHgwMCwweDhjLDB4MDYsMHg2MCwweDA3LDB4ZmMsMHhiNCwKKzB4MzAsMHhjZCwweDIxLDB4M2MsMHgwMywweDczLDB4MDYsMHhiYSwweDg2LDB4MDUsMHhlOSwweGIyLDB4MDMsMHhhMiwweDY5LDB4MDgsCisweGJiLDB4NzAsMHgwOCwweGExLDB4MjAsMHgwMCwweDM5LDB4YzMsMHg3MywweDAyLDB4ODksMHhjMywweDg5LDB4MWUsMHgyMCwweDAwLAorMHhmZSwweGM3LDB4YjksMHgwNCwweGZmLDB4ZDMsMHhlYiwweGI0LDB4NGEsMHhjZCwweDIxLDB4NzMsMHgwYSwweGQzLDB4ZTMsMHhmZSwKKzB4Y2YsMHg4OSwweDFlLDB4MjAsMHgwMCwweGViLDB4ZDksMHgyNiwweDhlLDB4MDYsMHgyYywweDAwLDB4MzEsMHhmZiwweDMwLDB4YzAsCisweGE5LDB4ZjIsMHhhZSwweDI2LDB4ODEsMHgzZCwweDUwLDB4NDEsMHg3NSwweDE1LDB4YWYsMHgyNiwweDgxLDB4M2QsMHg1NCwweDQ4LAorMHg3NSwweDBkLDB4YWYsMHgyNiwweDgwLDB4M2QsMHgzZCwweDc1LDB4MDYsMHg0NywweDg5LDB4M2UsMHg2NywweDA0LDB4NGYsMHhhZSwKKzB4NzUsMHhkZiwweGFmLDB4MDYsMHg1NywweDMxLDB4YzksMHg3NCwweDEwLDB4YmEsMHg1ZCwweDA1LDB4ZTksMHg1MCwweDAzLDB4MDksCisweGM5LDB4NzUsMHhmNiwweDQxLDB4ZTgsMHg5MiwweDAzLDB4NzIsMHhmMCwweGI4LDB4ODcsMHgxNiwweGNkLDB4MmYsMHgwOSwweGMwLAorMHg3NSwweGVkLDB4ODAsMHhlMywweDAxLDB4NzQsMHhlOCwweDg5LDB4M2UsMHgwMCwweDA2LDB4OGMsMHgwNiwweDAyLDB4MDYsMHg4OSwKKzB4MzYsMHgwNCwweDA2LDB4NWYsMHgwNywweGU4LDB4ZDUsMHgwMiwweDg5LDB4M2UsMHgyYSwweDAwLDB4ODksMHgzNiwweDYyLDB4MDcsCisweDgwLDB4M2UsMHgyYywweDAwLDB4MDAsMHg3NCwweDI0LDB4YjksMHgwOCwweDAwLDB4YmYsMHgyYywweDAwLDB4OGEsMHgwNSwweDQ3LAorMHgwOCwweGMwLDB4NzQsMHgwNSwweDg4LDB4MDcsMHg0MywweGUyLDB4ZjQsMHg2NiwweGM3LDB4MDcsMHgyZSwweDQ1LDB4NTgsMHg0NSwKKzB4ODEsMHhjMywweDA0LDB4MDAsMHhjNiwweDA3LDB4MDAsMHg4OSwweDFlLDB4NjIsMHgwNywweGI4LDB4MDAsMHgzZCwweGJhLDB4NjQsCisweDA3LDB4Y2QsMHgyMSwweDBmLDB4ODIsMHhiNCwweDAyLDB4YTMsMHgwNiwweDA2LDB4ODksMHhjMywweGI5LDB4MDYsMHgwMCwweGJhLAorMHhiNSwweDA3LDB4YjQsMHgzZiwweGNkLDB4MjEsMHgzMSwweGQyLDB4MzEsMHhjOSwweGExLDB4YjUsMHgwNywweDNkLDB4NGMsMHgwMSwKKzB4NzQsMHgxYiwweDNkLDB4NGQsMHg1YSwweDBmLDB4ODUsMHg5NywweDAyLDB4OGIsMHgxNiwweGI5LDB4MDcsMHhjMSwweGUyLDB4MDksCisweDhiLDB4MWUsMHhiNywweDA3LDB4MDksMHhkYiwweDc0LDB4MDUsMHg4MCwweGVlLDB4MDIsMHgwMSwweGRhLDB4ODksMHgxNiwweGJiLAorMHgwNywweDg5LDB4MGUsMHhiZCwweDA3LDB4YjgsMHgwMCwweDQyLDB4OGIsMHgxZSwweDA2LDB4MDYsMHhjZCwweDIxLDB4YjksMHhhOCwKKzB4MDAsMHhiYSwweGJmLDB4MDcsMHhiNCwweDNmLDB4Y2QsMHgyMSwweDNkLDB4YTgsMHgwMCwweDc1LDB4MDYsMHg4MSwweDNlLDB4YmYsCisweDA3LDB4NGMsMHgwMSwweDBmLDB4ODUsMHg1ZSwweDAyLDB4NjYsMHhhMSwweGUzLDB4MDcsMHg2NiwweGEzLDB4MTAsMHgwNiwweDY2LAorMHg4YiwweDBlLDB4YmIsMHgwNywweDY2LDB4YTEsMHgwMywweDA4LDB4NjYsMHgwMSwweGM4LDB4NjYsMHhhMywweDA4LDB4MDYsMHg2NiwKKzB4YTEsMHgyYiwweDA4LDB4NjYsMHgwMSwweGM4LDB4NjYsMHhhMywweDBjLDB4MDYsMHg2NiwweDhiLDB4MWUsMHg0YiwweDA4LDB4NjYsCisweGExLDB4NGYsMHgwOCwweDY2LDB4MDEsMHhjMywweDY2LDB4YjgsMHgwMSwweDAwLDB4MDEsMHgwMCwweDY2LDB4MzksMHhjMywweDczLAorMHgwMywweDY2LDB4ODksMHhjMywweDY2LDB4ODEsMHhjMywweGZmLDB4ZmYsMHgwMCwweDAwLDB4MzEsMHhkYiwweDY2LDB4ODksMHgxZSwKKzB4MWMsMHgwMCwweGU4LDB4ZTgsMHgwMiwweDhiLDB4MWUsMHgwNCwweDA2LDB4MDksMHhkYiwweDc0LDB4MGEsMHhiNCwweDQ4LDB4Y2QsCisweDIxLDB4MGYsMHg4MiwweDEwLDB4MDIsMHg4ZSwweGMwLDB4ZTgsMHhmYiwweDAyLDB4YjgsMHgwMSwweDAwLDB4ZmYsMHgxZSwweDAwLAorMHgwNiwweDBmLDB4ODIsMHgwOCwweDAyLDB4OGMsMHgwNiwweDI2LDB4MDAsMHg4YywweDBlLDB4MjgsMHgwMCwweDhjLDB4ZDgsMHhhMywKKzB4MjIsMHgwMCwweDhlLDB4YzAsMHgzMSwweGMwLDB4YjksMHgwMSwweDAwLDB4Y2QsMHgzMSwweDcyLDB4MDcsMHhhMywweDE0LDB4MDYsCisweDMxLDB4YzAsMHhjZCwweDMxLDB4MGYsMHg4MiwweGVhLDB4MDEsMHhhMywweDE2LDB4MDYsMHg2NiwweDhiLDB4MGUsMHgxYywweDAwLAorMHhiOCwweDAxLDB4MDUsMHg4YiwweDFlLDB4MWUsMHgwMCwweGNkLDB4MzEsMHgwZiwweDgyLDB4ZGEsMHgwMSwweDg5LDB4MWUsMHgxYSwKKzB4MDYsMHg4OSwweDBlLDB4MTgsMHgwNiwweDg5LDB4MzYsMHgxYSwweDAwLDB4ODksMHgzZSwweDE4LDB4MDAsMHhiOCwweDA3LDB4MDAsCisweDhiLDB4MWUsMHgxNCwweDA2LDB4OGIsMHgwZSwweDFhLDB4MDYsMHg4YiwweDE2LDB4MTgsMHgwNiwweGNkLDB4MzEsMHhiOCwweDA5LAorMHgwMCwweDhjLDB4YzksMHg4MSwweGUxLDB4MDMsMHgwMCwweGMxLDB4ZTEsMHgwNSwweDUxLDB4ODEsMHhjOSwweDliLDB4YzAsMHhjZCwKKzB4MzEsMHhiOCwweDA4LDB4MDAsMHg4YiwweDBlLDB4MWUsMHgwMCwweDQ5LDB4YmEsMHhmZiwweGZmLDB4Y2QsMHgzMSwweGI4LDB4MDcsCisweDAwLDB4OGIsMHgxZSwweDE2LDB4MDYsMHg4YiwweDBlLDB4MWEsMHgwNiwweDhiLDB4MTYsMHgxOCwweDA2LDB4Y2QsMHgzMSwweGI4LAorMHgwOSwweDAwLDB4NTksMHg4MSwweGM5LDB4OTMsMHhjMCwweGNkLDB4MzEsMHhiOCwweDA4LDB4MDAsMHg4YiwweDBlLDB4MWUsMHgwMCwKKzB4NDksMHhiYSwweGZmLDB4ZmYsMHhjZCwweDMxLDB4YjgsMHgwMCwweDAxLDB4YmIsMHgwMCwweDBmLDB4Y2QsMHgzMSwweDczLDB4MTAsCisweDNkLDB4MDgsMHgwMCwweDBmLDB4ODUsMHg2NSwweDAxLDB4YjgsMHgwMCwweDAxLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHg1YywweDAxLAorMHhhMywweDFjLDB4MDYsMHg4OSwweDE2LDB4MWUsMHgwNiwweGMxLDB4ZTMsMHgwNCwweDg5LDB4MWUsMHgyMCwweDA2LDB4NjYsMHg4YiwKKzB4MzYsMHgwOCwweDA2LDB4NjYsMHg4YiwweDNlLDB4ZmIsMHgwNywweDY2LDB4OGIsMHgwZSwweGZmLDB4MDcsMHhlOCwweDQ5LDB4MDAsCisweDY2LDB4OGIsMHgzNiwweDBjLDB4MDYsMHg2NiwweDhiLDB4M2UsMHgyMywweDA4LDB4NjYsMHg4YiwweDBlLDB4MjcsMHgwOCwweGU4LAorMHgzNywweDAwLDB4OGUsMHgwNiwweDE2LDB4MDYsMHg2NiwweDhiLDB4M2UsMHg0YiwweDA4LDB4NjYsMHg4YiwweDBlLDB4NGYsMHgwOCwKKzB4NjYsMHgzMSwweGMwLDB4NjYsMHhjMSwweGU5LDB4MDIsMHg2NywweGYzLDB4NjYsMHhhYiwweGI0LDB4M2UsMHg4YiwweDFlLDB4MDYsCisweDA2LDB4Y2QsMHgyMSwweGI4LDB4MDEsMHgwMSwweDhiLDB4MTYsMHgxZSwweDA2LDB4Y2QsMHgzMSwweDFlLDB4MGYsMHhhMSwweDhlLAorMHgxZSwweDE2LDB4MDYsMHg2NiwweDY0LDB4ZmYsMHgyZSwweDEwLDB4MDYsMHg2NiwweDg5LDB4ZjAsMHg2NiwweDI1LDB4ZmYsMHgwMSwKKzB4MDAsMHgwMCwweDY2LDB4MDEsMHhjMSwweDI5LDB4YzYsMHg2NiwweDI5LDB4YzcsMHg2NiwweDg5LDB4MGUsMHgyNiwweDA2LDB4NjYsCisweDg5LDB4M2UsMHgyMiwweDA2LDB4ZTgsMHhmZSwweDAwLDB4ODksMHgzNiwweDNlLDB4MDYsMHg2NiwweGMxLDB4ZWUsMHgxMCwweDg5LAorMHgzNiwweDQyLDB4MDYsMHg4YiwweDFlLDB4MDYsMHgwNiwweDg5LDB4MWUsMHgzYSwweDA2LDB4YzcsMHgwNiwweDQ2LDB4MDYsMHgwMCwKKzB4NDIsMHhlOCwweGYyLDB4MDAsMHhhMSwweDFjLDB4MDYsMHhhMywweDRlLDB4MDYsMHhjNywweDA2LDB4M2UsMHgwNiwweDAwLDB4MDAsCisweGM2LDB4MDYsMHg0NywweDA2LDB4M2YsMHhhMSwweDI4LDB4MDYsMHgwOSwweGMwLDB4NzUsMHgwOSwweGExLDB4MjYsMHgwNiwweDNiLAorMHgwNiwweDIwLDB4MDYsMHg3NiwweDAzLDB4YTEsMHgyMCwweDA2LDB4YTMsMHg0MiwweDA2LDB4ZTgsMHhjOCwweDAwLDB4NjYsMHgzMSwKKzB4YzksMHg4YiwweDBlLDB4NDYsMHgwNiwweDY2LDB4OGIsMHgzZSwweDIyLDB4MDYsMHg2NiwweDAxLDB4MGUsMHgyMiwweDA2LDB4NjYsCisweDI5LDB4MGUsMHgyNiwweDA2LDB4NjYsMHgzMSwweGY2LDB4YzEsMHhlOSwweDAyLDB4MWUsMHgwNiwweDhlLDB4MDYsMHgxNiwweDA2LAorMHg4ZSwweDFlLDB4MWUsMHgwNiwweDY3LDB4ZjMsMHg2NiwweGE1LDB4MDcsMHgxZiwweDY2LDB4MDMsMHgwZSwweDI2LDB4MDYsMHg3NSwKKzB4YWYsMHhjMywweDNjLDB4M2EsMHg3NCwweDA2LDB4M2MsMHgyZiwweDc0LDB4MDIsMHgzYywweDVjLDB4YzMsMHhiZSwweDY0LDB4MDcsCisweDg5LDB4ZjMsMHgyNiwweDhhLDB4MDUsMHg0NywweDg4LDB4MDQsMHgzOCwweGUwLDB4NzQsMHgwZSwweDA4LDB4YzAsMHg3NCwweDBhLAorMHg0NiwweGU4LDB4ZGUsMHhmZiwweDc1LDB4ZWMsMHg4OSwweGYzLDB4NzQsMHhlOCwweGMzLDB4YmEsMHgyNiwweDA1LDB4ZWIsMHgwOCwKKzB4YmEsMHgzNCwweDA1LDB4ZWIsMHgwMywweGJhLDB4M2UsMHgwNSwweDUyLDB4OGIsMHgxZSwweDYyLDB4MDcsMHhjNiwweDA3LDB4MjQsCisweGJiLDB4NjQsMHgwNywweGViLDB4MWUsMHhlOCwweGVkLDB4MDAsMHhiYSwweDc4LDB4MDUsMHhlYiwweDEyLDB4YmEsMHg5MSwweDA1LAorMHhlYiwweDBkLDB4YmEsMHhhMywweDA1LDB4ZWIsMHgwOCwweGJhLDB4YjUsMHgwNSwweGViLDB4MDMsMHhiYSwweDc4LDB4MDUsMHg1MiwKKzB4YmIsMHgxOSwweDA1LDB4ZTgsMHgxNCwweDAwLDB4NWIsMHhlOCwweDEwLDB4MDAsMHhiYiwweDQyLDB4MDQsMHhlOCwweDBhLDB4MDAsCisweGI4LDB4ZmYsMHg0YywweGNkLDB4MjEsMHg0MywweGI0LDB4MDIsMHhjZCwweDIxLDB4OGEsMHgxNywweDgwLDB4ZmEsMHgyNCwweDc1LAorMHhmNCwweGMzLDB4MGQsMHgwYSwweDI0LDB4NTAsMHg1MSwweDU3LDB4MzEsMHhjMCwweGJmLDB4MmEsMHgwNiwweGI5LDB4MTksMHgwMCwKKzB4ZjMsMHhhYiwweDVmLDB4NTksMHg1OCwweGMzLDB4YjgsMHgwMCwweDAzLDB4YmIsMHgyMSwweDAwLDB4MzEsMHhjOSwweDY2LDB4YmYsCisweDJhLDB4MDYsMHgwMCwweDAwLDB4Y2QsMHgzMSwweGMzLDB4MDAsMHgwMCwweDMwLDB4ZTQsMHhlOCwweDVmLDB4ZmYsMHg4OSwweGRlLAorMHg4YiwweDNlLDB4NjcsMHgwNCwweGViLDB4MTgsMHhiNCwweDNiLDB4ZTgsMHg1MiwweGZmLDB4ODEsMHhmZSwweDY0LDB4MDcsMHg3NCwKKzB4MTMsMHg4YSwweDg0LDB4ZmYsMHhmZiwweGU4LDB4M2EsMHhmZiwweDc0LDB4MDQsMHhjNiwweDA0LDB4NWMsMHg0NiwweGU4LDB4MDMsCisweDAwLDB4NzIsMHhlMywweGMzLDB4ZTgsMHgzNiwweDAwLDB4YmIsMHg0NCwweDAwLDB4OGEsMHgwNywweDg4LDB4MDQsMHg0MywweDQ2LAorMHgwOCwweGMwLDB4NzUsMHhmNiwweDA2LDB4NTcsMHgxZSwweDA3LDB4ZTgsMHg5YSwweGZmLDB4YmIsMHgyYSwweDA2LDB4OGMsMHg5ZiwKKzB4MDQsMHgwMCwweDg5LDB4OWYsMHgwMiwweDAwLDB4YmEsMHg2NCwweDA3LDB4YjgsMHgwMCwweDRiLDB4Y2QsMHgyMSwweDVmLDB4MDcsCisweDcyLDB4MDksMHhiNCwweDRkLDB4Y2QsMHgyMSwweDJkLDB4MDAsMHgwMywweGY3LDB4ZDgsMHhlYiwweDI4LDB4ODAsMHgzZSwweDY5LAorMHgwOCwweDA1LDB4NzIsMHgyMCwweGI4LDB4MDAsMHg1OCwweGNkLDB4MjEsMHhhMiwweDY3LDB4MDgsMHhiOCwweDAyLDB4NTgsMHhjZCwKKzB4MjEsMHhhMiwweDY4LDB4MDgsMHhiOCwweDAxLDB4NTgsMHhiYiwweDgwLDB4MDAsMHhjZCwweDIxLDB4YjgsMHgwMywweDU4LDB4YmIsCisweDAxLDB4MDAsMHhjZCwweDIxLDB4YzMsMHg5YywweDgwLDB4M2UsMHg2OSwweDA4LDB4MDUsMHg3MiwweDFhLDB4NTAsMHg1MywweGI4LAorMHgwMywweDU4LDB4OGEsMHgxZSwweDY4LDB4MDgsMHgzMCwweGZmLDB4Y2QsMHgyMSwweGI4LDB4MDEsMHg1OCwweDhhLDB4MWUsMHg2NywKKzB4MDgsMHgzMCwweGZmLDB4Y2QsMHgyMSwweDViLDB4NTgsMHg5ZCwweGMzLDB4NGMsMHg2ZiwweDYxLDB4NjQsMHgyMCwweDY1LDB4NzIsCisweDcyLDB4NmYsMHg3MiwweDNhLDB4MjAsMHgyNCwweDNhLDB4MjAsMHg2MywweDYxLDB4NmUsMHg2ZSwweDZmLDB4NzQsMHgyMCwweDZmLAorMHg3MCwweDY1LDB4NmUsMHgyNCwweDNhLDB4MjAsMHg2ZSwweDZmLDB4NzQsMHgyMCwweDQ1LDB4NTgsMHg0NSwweDI0LDB4M2EsMHgyMCwKKzB4NmUsMHg2ZiwweDc0LDB4MjAsMHg0MywweDRmLDB4NDYsMHg0NiwweDIwLDB4MjgsMHg0MywweDY4LDB4NjUsMHg2MywweDZiLDB4MjAsCisweDY2LDB4NmYsMHg3MiwweDIwLDB4NzYsMHg2OSwweDcyLDB4NzUsMHg3MywweDY1LDB4NzMsMHgyOSwweDI0LDB4NmUsMHg2ZiwweDIwLAorMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4MmQsMHgyMCwweDQ3LDB4NjUsMHg3NCwweDIwLDB4NjMsMHg3MywweDY0LDB4NzAsMHg2ZCwKKzB4NjksMHgyYSwweDYyLDB4MmUsMHg3YSwweDY5LDB4NzAsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NGYsMHg1MywweDIwLDB4NmQsCisweDY1LDB4NmQsMHg2ZiwweDcyLDB4NzksMHgyNCwweDZlLDB4NjUsMHg2NSwweDY0LDB4MjAsMHg0NCwweDRmLDB4NTMsMHgyMCwweDMzLAorMHgyNCwweDYzLDB4NjEsMHg2ZSwweDI3LDB4NzQsMHgyMCwweDczLDB4NzcsMHg2OSwweDc0LDB4NjMsMHg2OCwweDIwLDB4NmQsMHg2ZiwKKzB4NjQsMHg2NSwweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg1MCwweDRkLDB4NDksMHgyMCwweDczLDB4NjUsMHg2YywweDY1LDB4NjMsCisweDc0LDB4NmYsMHg3MiwweDczLDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4NmQsMHg2NSwweDZkLAorMHg2ZiwweDcyLDB4NzksMHgyNCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKKzB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCisweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAorMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MApkaWZmIC0tZ2l0IGEvYmZkL2hhc2guYyBiL2JmZC9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2ZTk4NwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9oYXNoLmMKQEAgLTAsMCArMSw3MzQgQEAKKy8qIGhhc2guYyAtLSBoYXNoIHRhYmxlIHJvdXRpbmVzIGZvciBCRkQKKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgIm9iamFsbG9jLmgiCisKKy8qCitTRUNUSU9OCisJSGFzaCBUYWJsZXMKKworQGNpbmRleCBIYXNoIHRhYmxlcworCUJGRCBwcm92aWRlcyBhIHNpbXBsZSBzZXQgb2YgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICBSb3V0aW5lcworCWFyZSBwcm92aWRlZCB0byBpbml0aWFsaXplIGEgaGFzaCB0YWJsZSwgdG8gZnJlZSBhIGhhc2ggdGFibGUsCisJdG8gbG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUgYW5kIG9wdGlvbmFsbHkgY3JlYXRlIGFuCisJZW50cnkgZm9yIGl0LCBhbmQgdG8gdHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgVGhlcmUgaXMKKwljdXJyZW50bHkgbm8gcm91dGluZSB0byBkZWxldGUgYW4gc3RyaW5nIGZyb20gYSBoYXNoIHRhYmxlLgorCisJVGhlIGJhc2ljIGhhc2ggdGFibGUgZG9lcyBub3QgcGVybWl0IGFueSBkYXRhIHRvIGJlIHN0b3JlZAorCXdpdGggYSBzdHJpbmcuICBIb3dldmVyLCBhIGhhc2ggdGFibGUgaXMgZGVzaWduZWQgdG8gcHJlc2VudCBhCisJYmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIHR5cGVzIG9mIGhhc2ggdGFibGVzIG1heSBiZQorCWRlcml2ZWQuICBUaGVzZSBkZXJpdmVkIHR5cGVzIG1heSBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisJd2l0aCB0aGUgc3RyaW5nLiAgSGFzaCB0YWJsZXMgd2VyZSBpbXBsZW1lbnRlZCBpbiB0aGlzIHdheSwKKwlyYXRoZXIgdGhhbiBzaW1wbHkgcHJvdmlkaW5nIGEgZGF0YSBwb2ludGVyIGluIGEgaGFzaCB0YWJsZQorCWVudHJ5LCBiZWNhdXNlIHRoZXkgd2VyZSBkZXNpZ25lZCBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgYmFjaworCWVuZHMuICBUaGUgbGlua2VyIG1heSBjcmVhdGUgdGhvdXNhbmRzIG9mIGhhc2ggdGFibGUgZW50cmllcywKKwlhbmQgdGhlIG92ZXJoZWFkIG9mIGFsbG9jYXRpbmcgcHJpdmF0ZSBkYXRhIGFuZCBzdG9yaW5nIGFuZAorCWZvbGxvd2luZyBwb2ludGVycyBiZWNvbWVzIG5vdGljZWFibGUuCisKKwlUaGUgYmFzaWMgaGFzaCB0YWJsZSBjb2RlIGlzIGluIDw8aGFzaC5jPj4uCisKK0BtZW51CitAKiBDcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGU6OgorQCogTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZzo6CitAKiBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZTo6CitAKiBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGU6OgorQGVuZCBtZW51CisKK0lOT0RFCitDcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGUsIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIEhhc2ggVGFibGVzLCBIYXNoIFRhYmxlcworU1VCU0VDVElPTgorCUNyZWF0aW5nIGFuZCBmcmVlaW5nIGEgaGFzaCB0YWJsZQorCitAZmluZGV4IGJmZF9oYXNoX3RhYmxlX2luaXQKK0BmaW5kZXggYmZkX2hhc2hfdGFibGVfaW5pdF9uCisJVG8gY3JlYXRlIGEgaGFzaCB0YWJsZSwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgPDxzdHJ1Y3QKKwliZmRfaGFzaF90YWJsZT4+IChkZWZpbmVkIGluIDw8YmZkLmg+PikgYW5kIGNhbGwKKwk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiAoaWYgeW91IGtub3cgYXBwcm94aW1hdGVseSBob3cgbWFueQorCWVudHJpZXMgeW91IHdpbGwgbmVlZCwgdGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfdGFibGVfaW5pdF9uPj4sCisJd2hpY2ggdGFrZXMgYSBAdmFye3NpemV9IGFyZ3VtZW50LCBtYXkgYmUgdXNlZCkuCisJPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gcmV0dXJucyA8PGZhbHNlPj4gaWYgc29tZSBzb3J0IG9mCisJZXJyb3Igb2NjdXJzLgorCitAZmluZGV4IGJmZF9oYXNoX25ld2Z1bmMKKwlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gdGFrZSBhcyBhbiBhcmd1bWVudCBhCisJZnVuY3Rpb24gdG8gdXNlIHRvIGNyZWF0ZSBuZXcgZW50cmllcy4gIEZvciBhIGJhc2ljIGhhc2gKKwl0YWJsZSwgdXNlIHRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX25ld2Z1bmM+Pi4gIEB4cmVme0Rlcml2aW5nCisJYSBOZXcgSGFzaCBUYWJsZSBUeXBlfSBmb3Igd2h5IHlvdSB3b3VsZCB3YW50IHRvIHVzZSBhCisJZGlmZmVyZW50IHZhbHVlIGZvciB0aGlzIGFyZ3VtZW50LgorCitAZmluZGV4IGJmZF9oYXNoX2FsbG9jYXRlCisJPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gd2lsbCBjcmVhdGUgYW4gb2JqYWxsb2Mgd2hpY2ggd2lsbCBiZQorCXVzZWQgdG8gYWxsb2NhdGUgbmV3IGVudHJpZXMuICBZb3UgbWF5IGFsbG9jYXRlIG1lbW9yeSBvbiB0aGlzCisJb2JqYWxsb2MgdXNpbmcgPDxiZmRfaGFzaF9hbGxvY2F0ZT4+LgorCitAZmluZGV4IGJmZF9oYXNoX3RhYmxlX2ZyZWUKKwlVc2UgPDxiZmRfaGFzaF90YWJsZV9mcmVlPj4gdG8gZnJlZSB1cCBhbGwgdGhlIG1lbW9yeSB0aGF0IGhhcworCWJlZW4gYWxsb2NhdGVkIGZvciBhIGhhc2ggdGFibGUuICBUaGlzIHdpbGwgbm90IGZyZWUgdXAgdGhlCisJPDxzdHJ1Y3QgYmZkX2hhc2hfdGFibGU+PiBpdHNlbGYsIHdoaWNoIHlvdSBtdXN0IHByb3ZpZGUuCisKK0lOT0RFCitMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nLCBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZSwgQ3JlYXRpbmcgYW5kIEZyZWVpbmcgYSBIYXNoIFRhYmxlLCBIYXNoIFRhYmxlcworU1VCU0VDVElPTgorCUxvb2tpbmcgdXAgb3IgZW50ZXJpbmcgYSBzdHJpbmcKKworQGZpbmRleCBiZmRfaGFzaF9sb29rdXAKKwlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF9sb29rdXA+PiBpcyB1c2VkIGJvdGggdG8gbG9vayB1cCBhCisJc3RyaW5nIGluIHRoZSBoYXNoIHRhYmxlIGFuZCB0byBjcmVhdGUgYSBuZXcgZW50cnkuCisKKwlJZiB0aGUgQHZhcntjcmVhdGV9IGFyZ3VtZW50IGlzIDw8ZmFsc2U+PiwgPDxiZmRfaGFzaF9sb29rdXA+PgorCXdpbGwgbG9vayB1cCBhIHN0cmluZy4gIElmIHRoZSBzdHJpbmcgaXMgZm91bmQsIGl0IHdpbGwKKwlyZXR1cm5zIGEgcG9pbnRlciB0byBhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4uICBJZiB0aGUKKwlzdHJpbmcgaXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZSA8PGJmZF9oYXNoX2xvb2t1cD4+IHdpbGwKKwlyZXR1cm4gPDxOVUxMPj4uICBZb3Ugc2hvdWxkIG5vdCBtb2RpZnkgYW55IG9mIHRoZSBmaWVsZHMgaW4KKwl0aGUgcmV0dXJucyA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LgorCisJSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PHRydWU+PiwgdGhlIHN0cmluZyB3aWxsIGJlCisJZW50ZXJlZCBpbnRvIHRoZSBoYXNoIHRhYmxlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLgorCUVpdGhlciB3YXkgYSBwb2ludGVyIHRvIGEgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+PiB3aWxsIGJlCisJcmV0dXJuZWQsIGVpdGhlciB0byB0aGUgZXhpc3Rpbmcgc3RydWN0dXJlIG9yIHRvIGEgbmV3bHkKKwljcmVhdGVkIG9uZS4gIEluIHRoaXMgY2FzZSwgYSA8PE5VTEw+PiByZXR1cm4gbWVhbnMgdGhhdCBhbgorCWVycm9yIG9jY3VycmVkLgorCisJSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PHRydWU+PiwgYW5kIGEgbmV3IGVudHJ5IGlzCisJY3JlYXRlZCwgdGhlIEB2YXJ7Y29weX0gYXJndW1lbnQgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0bworCWNvcHkgdGhlIHN0cmluZyBvbnRvIHRoZSBoYXNoIHRhYmxlIG9iamFsbG9jIG9yIG5vdC4gIElmCisJQHZhcntjb3B5fSBpcyBwYXNzZWQgYXMgPDxmYWxzZT4+LCB5b3UgbXVzdCBiZSBjYXJlZnVsIG5vdCB0bworCWRlYWxsb2NhdGUgb3IgbW9kaWZ5IHRoZSBzdHJpbmcgYXMgbG9uZyBhcyB0aGUgaGFzaCB0YWJsZQorCWV4aXN0cy4KKworSU5PREUKK1RyYXZlcnNpbmcgYSBIYXNoIFRhYmxlLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIEhhc2ggVGFibGVzCitTVUJTRUNUSU9OCisJVHJhdmVyc2luZyBhIGhhc2ggdGFibGUKKworQGZpbmRleCBiZmRfaGFzaF90cmF2ZXJzZQorCVRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX3RyYXZlcnNlPj4gbWF5IGJlIHVzZWQgdG8gdHJhdmVyc2UgYQorCWhhc2ggdGFibGUsIGNhbGxpbmcgYSBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQuICBUaGUgdHJhdmVyc2FsCisJaXMgZG9uZSBpbiBhIHJhbmRvbSBvcmRlci4KKworCTw8YmZkX2hhc2hfdHJhdmVyc2U+PiB0YWtlcyBhcyBhcmd1bWVudHMgYSBmdW5jdGlvbiBhbmQgYQorCWdlbmVyaWMgPDx2b2lkICo+PiBwb2ludGVyLiAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEKKwloYXNoIHRhYmxlIGVudHJ5IChhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5ICo+PikgYW5kIHRoZQorCWdlbmVyaWMgcG9pbnRlciBwYXNzZWQgdG8gPDxiZmRfaGFzaF90cmF2ZXJzZT4+LiAgVGhlIGZ1bmN0aW9uCisJbXVzdCByZXR1cm4gYSA8PGJvb2xlYW4+PiB2YWx1ZSwgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdG8KKwljb250aW51ZSB0cmF2ZXJzaW5nIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKwk8PGZhbHNlPj4sIDw8YmZkX2hhc2hfdHJhdmVyc2U+PiB3aWxsIHN0b3AgdGhlIHRyYXZlcnNhbCBhbmQKKwlyZXR1cm4gaW1tZWRpYXRlbHkuCisKK0lOT0RFCitEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsICwgVHJhdmVyc2luZyBhIEhhc2ggVGFibGUsIEhhc2ggVGFibGVzCitTVUJTRUNUSU9OCisJRGVyaXZpbmcgYSBuZXcgaGFzaCB0YWJsZSB0eXBlCisKKwlNYW55IHVzZXMgb2YgaGFzaCB0YWJsZXMgd2FudCB0byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisJd2hpY2ggZWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gIFNvbWUgYWxzbyBmaW5kIGl0CisJY29udmVuaWVudCB0byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpdGggdGhlIGhhc2ggdGFibGUKKwlpdHNlbGYuICBUaGlzIG1heSBiZSBkb25lIHVzaW5nIGEgZGVyaXZlZCBoYXNoIHRhYmxlLgorCisJU2luY2UgQyBpcyBub3QgYW4gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlLCBjcmVhdGluZyBhIGRlcml2ZWQKKwloYXNoIHRhYmxlIHJlcXVpcmVzIHN0aWNraW5nIHRvZ2V0aGVyIHNvbWUgYm9pbGVycGxhdGUKKwlyb3V0aW5lcyB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGhhc2gKKwl0YWJsZSB5b3Ugd2FudCB0byBjcmVhdGUuCisKKwlBbiBleGFtcGxlIG9mIGEgZGVyaXZlZCBoYXNoIHRhYmxlIGlzIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KKwlUaGUgc3RydWN0dXJlcyBmb3IgdGhpcyBhcmUgZGVmaW5lZCBpbiA8PGJmZGxpbmsuaD4+LiAgVGhlCisJZnVuY3Rpb25zIGFyZSBpbiA8PGxpbmtlci5jPj4uCisKKwlZb3UgbWF5IGFsc28gZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIGFuIGFscmVhZHkgZGVyaXZlZCBoYXNoCisJdGFibGUuICBGb3IgZXhhbXBsZSwgdGhlIGEub3V0IGxpbmtlciBiYWNrZW5kIGNvZGUgdXNlcyBhIGhhc2gKKwl0YWJsZSBkZXJpdmVkIGZyb20gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgorCitAbWVudQorQCogRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXM6OgorQCogV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZTo6CitAKiBXcml0ZSBPdGhlciBEZXJpdmVkIFJvdXRpbmVzOjoKK0BlbmQgbWVudQorCitJTk9ERQorRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXMsIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlCitTVUJTVUJTRUNUSU9OCisJRGVmaW5lIHRoZSBkZXJpdmVkIHN0cnVjdHVyZXMKKworCVlvdSBtdXN0IGRlZmluZSBhIHN0cnVjdHVyZSBmb3IgYW4gZW50cnkgaW4gdGhlIGhhc2ggdGFibGUsCisJYW5kIGEgc3RydWN0dXJlIGZvciB0aGUgaGFzaCB0YWJsZSBpdHNlbGYuCisKKwlUaGUgZmlyc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSBmb3IgYW4gZW50cnkgaW4gdGhlIGhhc2gKKwl0YWJsZSBtdXN0IGJlIG9mIHRoZSB0eXBlIHVzZWQgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlCisJeW91IGFyZSBkZXJpdmluZyBmcm9tLiAgSWYgeW91IGFyZSBkZXJpdmluZyBmcm9tIGEgYmFzaWMgaGFzaAorCXRhYmxlIHRoaXMgaXMgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Piwgd2hpY2ggaXMgZGVmaW5lZCBpbgorCTw8YmZkLmg+Pi4gIFRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIGZvciB0aGUgaGFzaAorCXRhYmxlIGl0c2VsZiBtdXN0IGJlIG9mIHRoZSB0eXBlIG9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUKKwlkZXJpdmluZyBmcm9tIGl0c2VsZi4gIElmIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhIGJhc2ljIGhhc2gKKwl0YWJsZSwgdGhpcyBpcyA8PHN0cnVjdCBiZmRfaGFzaF90YWJsZT4+LgorCisJRm9yIGV4YW1wbGUsIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBkZWZpbmVzIDw8c3RydWN0CisJYmZkX2xpbmtfaGFzaF9lbnRyeT4+IChpbiA8PGJmZGxpbmsuaD4+KS4gIFRoZSBmaXJzdCBmaWVsZCwKKwk8PHJvb3Q+PiwgaXMgb2YgdHlwZSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LiAgU2ltaWxhcmx5LAorCXRoZSBmaXJzdCBmaWVsZCBpbiA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4sIDw8dGFibGU+PiwKKwlpcyBvZiB0eXBlIDw8c3RydWN0IGJmZF9oYXNoX3RhYmxlPj4uCisKK0lOT0RFCitXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBXcml0ZSBPdGhlciBEZXJpdmVkIFJvdXRpbmVzLCBEZWZpbmUgdGhlIERlcml2ZWQgU3RydWN0dXJlcywgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlCitTVUJTVUJTRUNUSU9OCisJV3JpdGUgdGhlIGRlcml2ZWQgY3JlYXRpb24gcm91dGluZQorCisJWW91IG11c3Qgd3JpdGUgYSByb3V0aW5lIHdoaWNoIHdpbGwgY3JlYXRlIGFuZCBpbml0aWFsaXplIGFuCisJZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBUaGlzIHJvdXRpbmUgaXMgcGFzc2VkIGFzIHRoZQorCWZ1bmN0aW9uIGFyZ3VtZW50IHRvIDw8YmZkX2hhc2hfdGFibGVfaW5pdD4+LgorCisJSW4gb3JkZXIgdG8gcGVybWl0IG90aGVyIGhhc2ggdGFibGVzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUKKwloYXNoIHRhYmxlIHlvdSBhcmUgY3JlYXRpbmcsIHRoaXMgcm91dGluZSBtdXN0IGJlIHdyaXR0ZW4gaW4gYQorCXN0YW5kYXJkIHdheS4KKworCVRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY3JlYXRpb24gcm91dGluZSBpcyBhIHBvaW50ZXIgdG8gYQorCWhhc2ggdGFibGUgZW50cnkuICBUaGlzIG1heSBiZSA8PE5VTEw+PiwgaW4gd2hpY2ggY2FzZSB0aGUKKwlyb3V0aW5lIHNob3VsZCBhbGxvY2F0ZSB0aGUgcmlnaHQgYW1vdW50IG9mIHNwYWNlLiAgT3RoZXJ3aXNlCisJdGhlIHNwYWNlIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEgaGFzaCB0YWJsZSB0eXBlCisJZGVyaXZlZCBmcm9tIHRoaXMgb25lLgorCisJQWZ0ZXIgYWxsb2NhdGluZyBzcGFjZSwgdGhlIGNyZWF0aW9uIHJvdXRpbmUgbXVzdCBjYWxsIHRoZQorCWNyZWF0aW9uIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgdHlwZSBpdCBpcyBkZXJpdmVkIGZyb20sCisJcGFzc2luZyBpbiBhIHBvaW50ZXIgdG8gdGhlIHNwYWNlIGl0IGp1c3QgYWxsb2NhdGVkLiAgVGhpcworCXdpbGwgaW5pdGlhbGl6ZSBhbnkgZmllbGRzIHVzZWQgYnkgdGhlIGJhc2UgaGFzaCB0YWJsZS4KKworCUZpbmFsbHkgdGhlIGNyZWF0aW9uIHJvdXRpbmUgbXVzdCBpbml0aWFsaXplIGFueSBsb2NhbCBmaWVsZHMKKwlmb3IgdGhlIG5ldyBoYXNoIHRhYmxlIHR5cGUuCisKKwlIZXJlIGlzIGEgYm9pbGVycGxhdGUgZXhhbXBsZSBvZiBhIGNyZWF0aW9uIHJvdXRpbmUuCisJQHZhcntmdW5jdGlvbl9uYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgcm91dGluZS4KKwlAdmFye2VudHJ5X3R5cGV9IGlzIHRoZSB0eXBlIG9mIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHlvdQorCWFyZSBjcmVhdGluZy4gIEB2YXJ7YmFzZV9uZXdmdW5jfSBpcyB0aGUgbmFtZSBvZiB0aGUgY3JlYXRpb24KKwlyb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHR5cGUgeW91ciBoYXNoIHRhYmxlIGlzIGRlcml2ZWQKKwlmcm9tLgorCitFWEFNUExFCisKKy5zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorLkB2YXJ7ZnVuY3Rpb25fbmFtZX0gKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorLiAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKy4gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisuICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisueworLiAgc3RydWN0IEB2YXJ7ZW50cnlfdHlwZX0gKnJldCA9IChAdmFye2VudHJ5X3R5cGV9ICopIGVudHJ5OworLgorLiB7KiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisuICAgIGRlcml2ZWQgY2xhc3MuICAqfQorLiAgaWYgKHJldCA9PSAoQHZhcntlbnRyeV90eXBlfSAqKSBOVUxMKQorLiAgICB7CisuICAgICAgcmV0ID0gKChAdmFye2VudHJ5X3R5cGV9ICopCisuCSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChAdmFye2VudHJ5X3R5cGV9KSkpOworLiAgICAgIGlmIChyZXQgPT0gKEB2YXJ7ZW50cnlfdHlwZX0gKikgTlVMTCkKKy4gICAgICAgIHJldHVybiBOVUxMOworLiAgICB9CisuCisuIHsqIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBiYXNlIGNsYXNzLiAgKn0KKy4gIHJldCA9ICgoQHZhcntlbnRyeV90eXBlfSAqKQorLgkgQHZhcntiYXNlX25ld2Z1bmN9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOworLgorLiB7KiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMgaGVyZS4gICp9CisuCisuICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisufQorCitERVNDUklQVElPTgorCVRoZSBjcmVhdGlvbiByb3V0aW5lIGZvciB0aGUgbGlua2VyIGhhc2ggdGFibGUsIHdoaWNoIGlzIGluCisJPDxsaW5rZXIuYz4+LCBsb29rcyBqdXN0IGxpa2UgdGhpcyBleGFtcGxlLgorCUB2YXJ7ZnVuY3Rpb25fbmFtZX0gaXMgPDxfYmZkX2xpbmtfaGFzaF9uZXdmdW5jPj4uCisJQHZhcntlbnRyeV90eXBlfSBpcyA8PHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Pj4uCisJQHZhcntiYXNlX25ld2Z1bmN9IGlzIDw8YmZkX2hhc2hfbmV3ZnVuYz4+LCB0aGUgY3JlYXRpb24KKwlyb3V0aW5lIGZvciBhIGJhc2ljIGhhc2ggdGFibGUuCisKKwk8PF9iZmRfbGlua19oYXNoX25ld2Z1bmM+PiBhbHNvIGluaXRpYWxpemVzIHRoZSBsb2NhbCBmaWVsZHMKKwlpbiBhIGxpbmtlciBoYXNoIHRhYmxlIGVudHJ5OiA8PHR5cGU+PiwgPDx3cml0dGVuPj4gYW5kCisJPDxuZXh0Pj4uCisKK0lOT0RFCitXcml0ZSBPdGhlciBEZXJpdmVkIFJvdXRpbmVzLCAsIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQorU1VCU1VCU0VDVElPTgorCVdyaXRlIG90aGVyIGRlcml2ZWQgcm91dGluZXMKKworCVlvdSB3aWxsIHdhbnQgdG8gd3JpdGUgb3RoZXIgcm91dGluZXMgZm9yIHlvdXIgbmV3IGhhc2ggdGFibGUsCisJYXMgd2VsbC4gIAorCisJWW91IHdpbGwgd2FudCBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lIHdoaWNoIGNhbGxzIHRoZQorCWluaXRpYWxpemF0aW9uIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZSBkZXJpdmluZyBmcm9tCisJYW5kIGluaXRpYWxpemVzIGFueSBvdGhlciBsb2NhbCBmaWVsZHMuICBGb3IgdGhlIGxpbmtlciBoYXNoCisJdGFibGUsIHRoaXMgaXMgPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Pj4gaW4gPDxsaW5rZXIuYz4+LgorCisJWW91IHdpbGwgd2FudCBhIGxvb2t1cCByb3V0aW5lIHdoaWNoIGNhbGxzIHRoZSBsb29rdXAgcm91dGluZQorCW9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhbmQgY2FzdHMgdGhlIHJlc3VsdC4KKwlUaGUgbGlua2VyIGhhc2ggdGFibGUgdXNlcyA8PGJmZF9saW5rX2hhc2hfbG9va3VwPj4gaW4KKwk8PGxpbmtlci5jPj4gKHRoaXMgYWN0dWFsbHkgdGFrZXMgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB3aGljaAorCWl0IHVzZXMgdG8gZGVjaWRlIGhvdyB0byByZXR1cm4gdGhlIGxvb2tlZCB1cCB2YWx1ZSkuCisKKwlZb3UgbWF5IHdhbnQgYSB0cmF2ZXJzYWwgcm91dGluZS4gIFRoaXMgc2hvdWxkIGp1c3QgY2FsbCB0aGUKKwl0cmF2ZXJzYWwgcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlIGRlcml2aW5nIGZyb20gd2l0aAorCWFwcHJvcHJpYXRlIGNhc3RzLiAgVGhlIGxpbmtlciBoYXNoIHRhYmxlIHVzZXMKKwk8PGJmZF9saW5rX2hhc2hfdHJhdmVyc2U+PiBpbiA8PGxpbmtlci5jPj4uCisKKwlUaGVzZSByb3V0aW5lcyBtYXkgc2ltcGx5IGJlIGRlZmluZWQgYXMgbWFjcm9zLiAgRm9yIGV4YW1wbGUsCisJdGhlIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUsIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSB0aGUKKwlsaW5rZXIgaGFzaCB0YWJsZSwgdXNlcyBtYWNyb3MgZm9yIHRoZSBsb29rdXAgYW5kIHRyYXZlcnNhbAorCXJvdXRpbmVzLiAgVGhlc2UgYXJlIDw8YW91dF9saW5rX2hhc2hfbG9va3VwPj4gYW5kCisJPDxhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZT4+IGluIGFvdXR4LmguCisqLworCisvKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIGhhc2ggdGFibGUuICAqLworI2RlZmluZSBERUZBVUxUX1NJWkUgKDQwNTEpCisKKy8qIENyZWF0ZSBhIG5ldyBoYXNoIHRhYmxlLCBnaXZlbiBhIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KKworYm9vbGVhbgorYmZkX2hhc2hfdGFibGVfaW5pdF9uICh0YWJsZSwgbmV3ZnVuYywgc2l6ZSkKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCQljb25zdCBjaGFyICopKTsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIHVuc2lnbmVkIGludCBhbGxvYzsKKworICBhbGxvYyA9IHNpemUgKiBzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKTsKKworICB0YWJsZS0+bWVtb3J5ID0gKFBUUikgb2JqYWxsb2NfY3JlYXRlICgpOworICBpZiAodGFibGUtPm1lbW9yeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgdGFibGUtPnRhYmxlID0gKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiopCisJCSAgb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwgYWxsb2MpKTsKKyAgaWYgKHRhYmxlLT50YWJsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgbWVtc2V0ICgoUFRSKSB0YWJsZS0+dGFibGUsIDAsIGFsbG9jKTsKKyAgdGFibGUtPnNpemUgPSBzaXplOworICB0YWJsZS0+bmV3ZnVuYyA9IG5ld2Z1bmM7CisgIHJldHVybiB0cnVlOworfQorCisvKiBDcmVhdGUgYSBuZXcgaGFzaCB0YWJsZSB3aXRoIHRoZSBkZWZhdWx0IG51bWJlciBvZiBlbnRyaWVzLiAgKi8KKworYm9vbGVhbgorYmZkX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIG5ld2Z1bmMpCisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAorCQkJCQkJY29uc3QgY2hhciAqKSk7Cit7CisgIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0X24gKHRhYmxlLCBuZXdmdW5jLCBERUZBVUxUX1NJWkUpOworfQorCisvKiBGcmVlIGEgaGFzaCB0YWJsZS4gICovCisKK3ZvaWQKK2JmZF9oYXNoX3RhYmxlX2ZyZWUgKHRhYmxlKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworeworICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnkpOworICB0YWJsZS0+bWVtb3J5ID0gTlVMTDsKK30KKworLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorYmZkX2hhc2hfbG9va3VwICh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpCisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgYm9vbGVhbiBjcmVhdGU7CisgICAgIGJvb2xlYW4gY29weTsKK3sKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBoYXNoOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKKyAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpoYXNocDsKKyAgdW5zaWduZWQgaW50IGxlbjsKKyAgdW5zaWduZWQgaW50IGluZGV4OworICAKKyAgaGFzaCA9IDA7CisgIGxlbiA9IDA7CisgIHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzdHJpbmc7CisgIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpCisgICAgeworICAgICAgaGFzaCArPSBjICsgKGMgPDwgMTcpOworICAgICAgaGFzaCBePSBoYXNoID4+IDI7CisgICAgICArK2xlbjsKKyAgICB9CisgIGhhc2ggKz0gbGVuICsgKGxlbiA8PCAxNyk7CisgIGhhc2ggXj0gaGFzaCA+PiAyOworCisgIGluZGV4ID0gaGFzaCAlIHRhYmxlLT5zaXplOworICBmb3IgKGhhc2hwID0gdGFibGUtPnRhYmxlW2luZGV4XTsKKyAgICAgICBoYXNocCAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7CisgICAgICAgaGFzaHAgPSBoYXNocC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoaGFzaHAtPmhhc2ggPT0gaGFzaAorCSAgJiYgc3RyY21wIChoYXNocC0+c3RyaW5nLCBzdHJpbmcpID09IDApCisJcmV0dXJuIGhhc2hwOworICAgIH0KKworICBpZiAoISBjcmVhdGUpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKKworICBoYXNocCA9ICgqdGFibGUtPm5ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwsIHRhYmxlLCBzdHJpbmcpOworICBpZiAoaGFzaHAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7CisgIGlmIChjb3B5KQorICAgIHsKKyAgICAgIGNoYXIgKm5ldzsKKworICAgICAgbmV3ID0gKGNoYXIgKikgb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwKKwkJCQkgICAgIGxlbiArIDEpOworICAgICAgaWYgKCFuZXcpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisJICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOworCX0KKyAgICAgIHN0cmNweSAobmV3LCBzdHJpbmcpOworICAgICAgc3RyaW5nID0gbmV3OworICAgIH0KKyAgaGFzaHAtPnN0cmluZyA9IHN0cmluZzsKKyAgaGFzaHAtPmhhc2ggPSBoYXNoOworICBoYXNocC0+bmV4dCA9IHRhYmxlLT50YWJsZVtpbmRleF07CisgIHRhYmxlLT50YWJsZVtpbmRleF0gPSBoYXNocDsKKworICByZXR1cm4gaGFzaHA7Cit9CisKKy8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KKwordm9pZAorYmZkX2hhc2hfcmVwbGFjZSAodGFibGUsIG9sZCwgbncpCisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkOworICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53OworeworICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnBwaDsKKworICBpbmRleCA9IG9sZC0+aGFzaCAlIHRhYmxlLT5zaXplOworICBmb3IgKHBwaCA9ICZ0YWJsZS0+dGFibGVbaW5kZXhdOworICAgICAgICgqcHBoKSAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7CisgICAgICAgcHBoID0gJigqcHBoKS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKnBwaCA9PSBvbGQpCisJeworCSAgKnBwaCA9IG53OworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgYWJvcnQgKCk7Cit9CisKKy8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KKworLypBUkdTVVNFRCovCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorYmZkX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgaWYgKGVudHJ5ID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICBlbnRyeSA9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopCisJICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5KSkpOworICByZXR1cm4gZW50cnk7Cit9CisKKy8qIEFsbG9jYXRlIHNwYWNlIGluIGEgaGFzaCB0YWJsZS4gICovCisKK1BUUgorYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgUFRSIHJldDsKKworICByZXQgPSBvYmphbGxvY19hbGxvYyAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5LCBzaXplKTsKKyAgaWYgKHJldCA9PSBOVUxMICYmIHNpemUgIT0gMCkKKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgKi8KKwordm9pZAorYmZkX2hhc2hfdHJhdmVyc2UgKHRhYmxlLCBmdW5jLCBpbmZvKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOworICAgICBQVFIgaW5mbzsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspCisgICAgeworICAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpwOworCisgICAgICBmb3IgKHAgPSB0YWJsZS0+dGFibGVbaV07IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisJeworCSAgaWYgKCEgKCpmdW5jKSAocCwgaW5mbykpCisJICAgIHJldHVybjsKKwl9CisgICAgfQorfQorDAorLyogQSBmZXcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgKGEub3V0LCBDT0ZGLCBFTEYpIHVzZSBhIHN0cmluZworICAgdGFibGUuICBUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBhZGRpbmcgc3RyaW5ncyB0byBhIHN0cmluZyB0YWJsZSwKKyAgIHJldHVybmluZyB0aGUgYnl0ZSBvZmZzZXQsIGFuZCB3cml0aW5nIG91dCB0aGUgdGFibGUuCisKKyAgIFBvc3NpYmxlIGltcHJvdmVtZW50czoKKyAgICsgbG9vayBmb3Igc3RyaW5ncyBtYXRjaGluZyB0cmFpbGluZyBzdWJzdHJpbmdzIG9mIG90aGVyIHN0cmluZ3MKKyAgICsgYmV0dGVyIGRhdGEgc3RydWN0dXJlcz8gIGJhbGFuY2VkIHRyZWVzPworICAgKyBsb29rIGF0IHJlZHVjaW5nIG1lbW9yeSB1c2UgZWxzZXdoZXJlIC0tIG1heWJlIGlmIHdlIGRpZG4ndCBoYXZlCisgICAgIHRvIGNvbnN0cnVjdCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBhdCBvbmNlLCB3ZSBjb3VsZCBnZXQgYnkKKyAgICAgd2l0aCBzbWFsbGVyIGFtb3VudHMgb2YgVk0/ICAoV2hhdCBlZmZlY3QgZG9lcyB0aGF0IGhhdmUgb24gdGhlCisgICAgIHN0cmluZyB0YWJsZSByZWR1Y3Rpb25zPykgICovCisKKy8qIEFuIGVudHJ5IGluIHRoZSBzdHJ0YWIgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKKyAgLyogSW5kZXggaW4gc3RyaW5nIHRhYmxlLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBpbmRleDsKKyAgLyogTmV4dCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KKyAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpuZXh0OworfTsKKworLyogVGhlIHN0cnRhYiBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGJmZF9zdHJ0YWJfaGFzaAoreworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7CisgIC8qIFNpemUgb2Ygc3RydGFiLS1hbHNvIG5leHQgYXZhaWxhYmxlIGluZGV4LiAgKi8KKyAgYmZkX3NpemVfdHlwZSBzaXplOworICAvKiBGaXJzdCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KKyAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpmaXJzdDsKKyAgLyogTGFzdCBzdHJpbmcgaW4gc3RydGFiLiAgKi8KKyAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpsYXN0OworICAvKiBXaGV0aGVyIHRvIHByZWNlZGUgc3RyaW5ncyB3aXRoIGEgdHdvIGJ5dGUgbGVuZ3RoLCBhcyBpbiB0aGUKKyAgICAgWENPRkYgLmRlYnVnIHNlY3Rpb24uICAqLworICBib29sZWFuIHhjb2ZmOworfTsKKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RydGFiX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworCisvKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cnRhYi4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorc3RydGFiX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXQgPSAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKKwkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKKworICBpZiAocmV0KQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPmluZGV4ID0gKGJmZF9zaXplX3R5cGUpIC0xOworICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHN0cnRhYi4gICovCisKKyNkZWZpbmUgc3RydGFiX2hhc2hfbG9va3VwKHQsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCisgICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIFwKKyAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKKworLyogQ3JlYXRlIGEgbmV3IHN0cnRhYi4gICovCisKK3N0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgorX2JmZF9zdHJpbmd0YWJfaW5pdCAoKQoreworICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWJsZTsKKworICB0YWJsZSA9ICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKQorCSAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCkpKTsKKyAgaWYgKHRhYmxlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgc3RydGFiX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgZnJlZSAodGFibGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHRhYmxlLT5zaXplID0gMDsKKyAgdGFibGUtPmZpcnN0ID0gTlVMTDsKKyAgdGFibGUtPmxhc3QgPSBOVUxMOworICB0YWJsZS0+eGNvZmYgPSBmYWxzZTsKKworICByZXR1cm4gdGFibGU7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBzdHJ0YWIgaW4gd2hpY2ggdGhlIHN0cmluZ3MgYXJlIG91dHB1dCBpbiB0aGUgZm9ybWF0CisgICB1c2VkIGluIHRoZSBYQ09GRiAuZGVidWcgc2VjdGlvbjogYSB0d28gYnl0ZSBsZW5ndGggcHJlY2VkZXMgZWFjaAorICAgc3RyaW5nLiAgKi8KKworc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqCitfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0ICgpCit7CisgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKKworICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0LT54Y29mZiA9IHRydWU7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIEZyZWUgYSBzdHJ0YWIuICAqLworCit2b2lkCitfYmZkX3N0cmluZ3RhYl9mcmVlICh0YWJsZSkKKyAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFibGU7Cit7CisgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZ0YWJsZS0+dGFibGUpOworICBmcmVlICh0YWJsZSk7Cit9CisKKy8qIEdldCB0aGUgaW5kZXggb2YgYSBzdHJpbmcgaW4gYSBzdHJ0YWIsIGFkZGluZyBpdCBpZiBpdCBpcyBub3QKKyAgIGFscmVhZHkgcHJlc2VudC4gIElmIEhBU0ggaXMgZmFsc2UsIHdlIGRvbid0IHJlYWxseSB1c2UgdGhlIGhhc2gKKyAgIHRhYmxlLCBhbmQgd2UgZG9uJ3QgZWxpbWluYXRlIGR1cGxpY2F0ZSBzdHJpbmdzLiAgKi8KKworYmZkX3NpemVfdHlwZQorX2JmZF9zdHJpbmd0YWJfYWRkICh0YWIsIHN0ciwgaGFzaCwgY29weSkKKyAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOworICAgICBjb25zdCBjaGFyICpzdHI7CisgICAgIGJvb2xlYW4gaGFzaDsKKyAgICAgYm9vbGVhbiBjb3B5OworeworICByZWdpc3RlciBzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKmVudHJ5OworCisgIGlmIChoYXNoKQorICAgIHsKKyAgICAgIGVudHJ5ID0gc3RydGFiX2hhc2hfbG9va3VwICh0YWIsIHN0ciwgdHJ1ZSwgY29weSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKwlyZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVudHJ5ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKKwkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZ0YWItPnRhYmxlLAorCQkJCSAgc2l6ZW9mIChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkpKSk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKwlyZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOworICAgICAgaWYgKCEgY29weSkKKwllbnRyeS0+cm9vdC5zdHJpbmcgPSBzdHI7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqbjsKKworCSAgbiA9IChjaGFyICopIGJmZF9oYXNoX2FsbG9jYXRlICgmdGFiLT50YWJsZSwgc3RybGVuIChzdHIpICsgMSk7CisJICBpZiAobiA9PSBOVUxMKQorCSAgICByZXR1cm4gKGJmZF9zaXplX3R5cGUpIC0xOworCSAgZW50cnktPnJvb3Quc3RyaW5nID0gbjsKKwl9CisgICAgICBlbnRyeS0+aW5kZXggPSAoYmZkX3NpemVfdHlwZSkgLTE7CisgICAgICBlbnRyeS0+bmV4dCA9IE5VTEw7CisgICAgfQorCisgIGlmIChlbnRyeS0+aW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorICAgIHsKKyAgICAgIGVudHJ5LT5pbmRleCA9IHRhYi0+c2l6ZTsKKyAgICAgIHRhYi0+c2l6ZSArPSBzdHJsZW4gKHN0cikgKyAxOworICAgICAgaWYgKHRhYi0+eGNvZmYpCisJeworCSAgZW50cnktPmluZGV4ICs9IDI7CisJICB0YWItPnNpemUgKz0gMjsKKwl9CisgICAgICBpZiAodGFiLT5maXJzdCA9PSBOVUxMKQorCXRhYi0+Zmlyc3QgPSBlbnRyeTsKKyAgICAgIGVsc2UKKwl0YWItPmxhc3QtPm5leHQgPSBlbnRyeTsKKyAgICAgIHRhYi0+bGFzdCA9IGVudHJ5OworICAgIH0KKworICByZXR1cm4gZW50cnktPmluZGV4OworfQorCisvKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHN0cnRhYi4gICovCisKK2JmZF9zaXplX3R5cGUKK19iZmRfc3RyaW5ndGFiX3NpemUgKHRhYikKKyAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFiOworeworICByZXR1cm4gdGFiLT5zaXplOworfQorCisvKiBXcml0ZSBvdXQgYSBzdHJ0YWIuICBBQkZEIG11c3QgYWxyZWFkeSBiZSBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4KKyAgIHRoZSBmaWxlLiAgKi8KKworYm9vbGVhbgorX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgdGFiKQorICAgICByZWdpc3RlciBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKK3sKKyAgcmVnaXN0ZXIgYm9vbGVhbiB4Y29mZjsKKyAgcmVnaXN0ZXIgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICplbnRyeTsKKworICB4Y29mZiA9IHRhYi0+eGNvZmY7CisKKyAgZm9yIChlbnRyeSA9IHRhYi0+Zmlyc3Q7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCisgICAgeworICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyOworICAgICAgcmVnaXN0ZXIgc2l6ZV90IGxlbjsKKworICAgICAgc3RyID0gZW50cnktPnJvb3Quc3RyaW5nOworICAgICAgbGVuID0gc3RybGVuIChzdHIpICsgMTsKKworICAgICAgaWYgKHhjb2ZmKQorCXsKKwkgIGJmZF9ieXRlIGJ1ZlsyXTsKKworCSAgLyogVGhlIG91dHB1dCBsZW5ndGggaW5jbHVkZXMgdGhlIG51bGwgYnl0ZS4gICovCisJICBiZmRfcHV0XzE2IChhYmZkLCBsZW4sIGJ1Zik7CisJICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWYsIDEsIDIsIGFiZmQpICE9IDIpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHN0ciwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JmZC9ob3N0LWFvdXQuYyBiL2JmZC9ob3N0LWFvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY0M2RjCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hvc3QtYW91dC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIEJGRCBiYWNrZW5kIGZvciBsb2NhbCBob3N0J3MgYS5vdXQgYmluYXJpZXMKKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgUHJvYmFibHkgSm9obiBHaWxtb3JlJ3MgZmF1bHQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjZGVmaW5lCUFSQ0hfU0laRQkzMgorCisvKiBXaGVuIHBvcnRpbmcgdG8gYSBuZXcgc3lzdGVtLCB5b3UgbXVzdCBzdXBwbHk6CisKKwlIT1NUX1BBR0VfU0laRQkJKG9wdGlvbmFsKQorCUhPU1RfU0VHTUVOVF9TSVpFCShvcHRpb25hbCAtLSBkZWZhdWx0cyB0byBwYWdlIHNpemUpCisJSE9TVF9NQUNISU5FX0FSQ0gJKG9wdGlvbmFsKQorCUhPU1RfTUFDSElORV9NQUNISU5FCShvcHRpb25hbCkKKwlIT1NUX1RFWFRfU1RBUlRfQUREUgkob3B0aW9uYWwpCisJSE9TVF9TVEFDS19FTkRfQUREUgkobm90IHVzZWQsIGV4Y2VwdCBieSB0cmFkLWNvcmUgPz8/KQorCUhPU1RfQklHX0VORElBTl9QCShyZXF1aXJlZCAtLSBkZWZpbmUgaWYgYmlnLWVuZGlhbikKKworICAgaW4gdGhlIC4vaG9zdHMvaC1zeXN0ZW1uYW1lLmggZmlsZS4gICovCisKKyNpZmRlZiBUUkFEX0hFQURFUgorI2luY2x1ZGUgVFJBRF9IRUFERVIKKyNlbmRpZgorCisjaWZkZWYJCQlIT1NUX1BBR0VfU0laRQorI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCUhPU1RfUEFHRV9TSVpFCisjZW5kaWYKKworI2lmZGVmCQkJSE9TVF9TRUdNRU5UX1NJWkUKKyNkZWZpbmUJU0VHTUVOVF9TSVpFCUhPU1RfU0VHTUVOVF9TSVpFCisjZWxzZQorI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQorI2VuZGlmCisKKyNpZmRlZgkJCUhPU1RfVEVYVF9TVEFSVF9BRERSCisjZGVmaW5lCVRFWFRfU1RBUlRfQUREUglIT1NUX1RFWFRfU1RBUlRfQUREUgorI2VuZGlmCisKKyNpZmRlZgkJCUhPU1RfU1RBQ0tfRU5EX0FERFIKKyNkZWZpbmUJU1RBQ0tfRU5EX0FERFIJSE9TVF9TVEFDS19FTkRfQUREUgorI2VuZGlmCisKKyNpZmRlZgkJCUhPU1RfQklHX0VORElBTl9QCisjZGVmaW5lCVRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKyNlbHNlCisjdW5kZWYgIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKyNlbmRpZgorCisjaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCisKKyNpZmRlZiBIT1NUX01BQ0hJTkVfQVJDSAorI2lmZGVmIEhPU1RfTUFDSElORV9NQUNISU5FCisjZGVmaW5lIFNFVF9BUkNIX01BQ0goYWJmZCwgZXhlY3ApIFwKKyAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBIT1NUX01BQ0hJTkVfQVJDSCwgSE9TVF9NQUNISU5FX01BQ0hJTkUpCisjZWxzZQorI2RlZmluZSBTRVRfQVJDSF9NQUNIKGFiZmQsIGV4ZWNwKSBcCisgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgSE9TVF9NQUNISU5FX0FSQ0gsIDApCisjZW5kaWYKKyNlbmRpZiAvKiBIT1NUX01BQ0hJTkVfQVJDSCAqLworCisjZGVmaW5lIE1ZKE9QKSBDQVQoaG9zdF9hb3V0XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQiCisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2FscGhhbGludXguaCBiL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliYTFiNwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9hbHBoYWxpbnV4LmgKQEAgLTAsMCArMSw2IEBACisvKiBMaW51eCBkdW1wcyAic3RydWN0IHRhc2tfc3RydWN0IiBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlLWZpbGUuICBUaGlzCisgICBzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IDkyMCBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gMTAyNAorICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCisjZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTEwMjQKKyNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCisgICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oIGIvYmZkL2hvc3RzL2FscGhhdm1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlMzkxYQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9hbHBoYXZtcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGFscGhhdm1zLmggLS0gQkZEIGRlZmluaXRpb25zIGZvciBhbiBvcGVuVk1TIGhvc3QKKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCisgICBvZiBwcm9HSVMgU29mdHdhcmVlbnR3aWNrbHVuZywgQWFjaGVuLCBHZXJtYW55CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXhsaWIuaD4KKyNpbmNsdWRlIDx1bml4aW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKworI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKKy8qIE1ha2UgdGhlIGJhc2ljIHR5cGVzIDY0LWJpdCBxdWFudGl0aWVzIG9uIHRoZSBob3N0LgorICAgQWxzbyBwcm92aWRlIHRoZSBzdXBwb3J0IG1hY3JvcyBCRkQgbmVlZHMuICAqLworIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lCUJGRF9IT1NUXzY0X0JJVAlsb25nIGxvbmcKKyMgZWxzZQorIyAgZGVmaW5lCUJGRF9IT1NUXzY0X0JJVAlsb25nCisjIGVuZGlmCit0eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVCB1aW50NjRfdHlwZTsKK3R5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGludDY0X3R5cGU7CisKKyMgZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwMTZseCIsIHgpIC8qIEJGRF9IT1NUXzY0X0JJVCAqLworIyBkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCisKKyMgZGVmaW5lIEJZVEVTX0lOX1BSSU5URl9JTlQgNAorCisvKiBUaGVzZSBtdXN0IGhhdmUgdHlwZSB1bnNpZ25lZCBsb25nIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBhcworICAgYXJndW1lbnRzIGluIHByaW50ZiBmdW5jdGlvbnMuICAqLworIyBkZWZpbmUgdWludDY0X3R5cGVMT1coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkgLyogQkZEX0hPU1RfNjRfQklUICovCisjIGRlZmluZSB1aW50NjRfdHlwZUhJR0goeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSA+PiAzMikgJiAweGZmZmZmZmZmKSkgLyogQkZEX0hPU1RfNjRfQklUICovCisKKyNlbmRpZiAvKiBCRkRfSE9TVF82NF9CSVQgKi8KKworI2luY2x1ZGUgImZvcGVuLXZtcy5oIgorCisjZGVmaW5lIE5PX0ZDTlRMIDEKKworI2lmbmRlZiBPX0FDQ01PREUKKyNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQorI2VuZGlmCisKK2V4dGVybiBpbnQgZ2V0cGFnZXNpemUgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2RlY3N0YXRpb24uaCBiL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwYzE0MwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9kZWNzdGF0aW9uLmgKQEAgLTAsMCArMSwxNyBAQAorLyogSG9wZWZ1bGx5IHRoaXMgc2hvdWxkIGluY2x1ZGUgZWl0aGVyIG1hY2hpbmUvcGFyYW0uaCAoVWx0cml4KSBvcgorICAgbWFjaGluZS9tYWNocGFyYW0uaCAoTWFjaCksIHdoaWNoZXZlciBpcyBpdHMgbmFtZSBvbiB0aGlzIHN5c3RlbS4gICovCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKworI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRworLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHIC0tIHdlIHVzZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAqLworI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCisvKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLworCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCisjZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCQlVU1JEQVRBCisjZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCisKKyNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAorICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVsdGE2OC5oIGIvYmZkL2hvc3RzL2RlbHRhNjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZhNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hvc3RzL2RlbHRhNjguaApAQCAtMCwwICsxLDE4IEBACisvKiBEZWZpbml0aW9ucyBmb3IgYSBNb3Rvcm9sYSBEZWx0YSAzMzAwIGJveCBydW5uaW5nIFN5c3RlbSBWIFIzLjAuCisgICBDb250cmlidXRlZCBieSBtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZS4gICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCisjZGVmaW5lCU5CUEcJCQlOQlBDCisjZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfZGF0b3JnCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCXUudV9leGRhdGEudXhfdHh0b3JnCisjaWYgMAorI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCTB4NDAwMDAwMDAKKyNlbHNlCisvKiBVc2VyJ3Mgc3RhY2ssIGNvcGllZCBmcm9tIHN5cy9wYXJhbS5oICAqLworI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCisjZW5kaWYKKyNkZWZpbmUJVVBBR0VTCQkJVVNJWkUKKyNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCisgIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfYWJvcnQKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9kcHgyLmggYi9iZmQvaG9zdHMvZHB4Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjM5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvZHB4Mi5oCkBAIC0wLDAgKzEsOCBAQAorLyogRGVmaW5pdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGZvciBjb3JlIGZpbGVzLiAgQ29yZSBzZWN0aW9uIHNpemVzIGZvcgorICAgdGhlIERQWDIgYXJlIGluIGJ5dGVzLiAgKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2RlZmluZSBOQlBHIDEKKyNkZWZpbmUgVVBBR0VTIChVU0laRSAqIE5CUFApCisjZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSICh1LnVfZXhkYXRhLnV4X2RhdG9yZykKKyNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAoVVNFUlNUQUNLKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2hwMzAwYnNkLmggYi9iZmQvaG9zdHMvaHAzMDBic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI4NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hvc3RzL2hwMzAwYnNkLmgKQEAgLTAsMCArMSwxMyBAQAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIEJTRDRfNAorI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKKyNlbmRpZgorCisjZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCisjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcJLyogRGF0YSBzZWcgc3RhcnQgYWRkciByb3VuZHMgdG8gTkJQRyAqLworI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tNjhrCisvKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLworCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQkwCisjZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCTB4ZmZmMDAwMDAKKyNkZWZpbmUJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2YnNkLmggYi9iZmQvaG9zdHMvaTM4NmJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZWUzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvaTM4NmJzZC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEludGVsIDM4NiBydW5uaW5nIGFueSBCU0QgVW5peCAqLworCisjaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorCisvKiBSZWNlbnQgdmVyc2lvbnMgb2YgRnJlZUJTRCBkb24ndCBkZWZpbmUgTkJQRy4gICovCisjaWZuZGVmIE5CUEcKKyNpZmRlZiBQQUdFX1NJWkUKKyNkZWZpbmUgTkJQRyBQQUdFX1NJWkUKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKKyNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfaTM4NgorI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkJVVNSVEVYVAorCisvKiBKb2xpdHogc3VnZ2VzdGVkIGRlZmluaW5nIEhPU1RfU1RBQ0tfRU5EX0FERFIgdG8KKyAgICh1LnVfa3Byb2Mua3BfZXByb2MuZV92bS52bV9tYXhzYWRkciArIE1BWFNTSVopLCB3aGljaCBzaG91bGQgd29yayBvbgorICAgYm90aCBCU0RJIGFuZCAzODZCU0QsIGJ1dCB0aGF0IGlzIGJlbGlldmVkIG5vdCB0byB3b3JrIGZvciBCU0QgNC40LiAgKi8KKworI2lmZGVmIF9fYnNkaV9fCisvKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyBmb3IgQlNESS4gICovCisjZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCisjZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSICgoYmZkX3ZtYSl1LnVfa3Byb2Mua3BfZXByb2MuZV92bS52bV9kYWRkcikKKyNlbHNlCisvKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSByaWdodCB0aGluZyBmb3IgMzg2QlNEIHJlbGVhc2UgMC4xLiAgKi8KKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJKFVTUlNUQUNLIC0gTUFYU1NJWikKKyNlbmRpZgorCisjZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoY29yZV9iZmQpIFwKKyAgKChjb3JlX2JmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfc2lnKQorI2RlZmluZSB1X2NvbW0gdV9rcHJvYy5rcF9wcm9jLnBfY29tbQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZsaW51eC5oIGIvYmZkL2hvc3RzL2kzODZsaW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTUxZjEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvaTM4NmxpbnV4LmgKQEAgLTAsMCArMSw4IEBACisvKiBMaW51eCB3cml0ZXMgdGhlIHRhc2sgc3RydWN0dXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUgZmlsZS4gIEN1cnJlbnRseSBpdAorICAgaXMgMjkxMiBieXRlcy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBzaG91bGQgYmUgYSBwaWNraWVyIGNoZWNrLCBidXQKKyAgIHdlIHNob3VsZCBwcm9iYWJseSBub3QgYmUgdG9vIHBpY2t5ICh0aGUgc2l6ZSBvZiB0aGUgdGFzayBzdHJ1Y3R1cmUgbWlnaHQKKyAgIHZhcnksIGFuZCBpZiBpdCdzIG5vdCB0aGUgbGVuZ3RoIHdlIGV4cGVjdCBpdCB0byBiZSwgaXQgZG9lc24ndCBhZmZlY3QKKyAgIG91ciBhYmlsaXR5IHRvIHByb2Nlc3MgdGhlIGNvcmUgZmlsZSkuICBTbyBhbGxvdyAwLTQwOTYgZXh0cmEgYnl0ZXMgYXQKKyAgIHRoZSBlbmQuICAqLworCisjZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQgNDA5NgpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2kzODZtYWNoMy5oIGIvYmZkL2hvc3RzL2kzODZtYWNoMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzYxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisvKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKKyAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCisgKgorICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKKyAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCisgKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcworICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCisgKi8KKyNpZiBVUEFHRVMgPT0gMTYKKyN1bmRlZiAgVVBBR0VTCisjZGVmaW5lIFVQQUdFUyAyCisjZW5kaWYKKworI2lmIFVQQUdFUyAhPSAyCitGSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2CisjZW5kaWYKKworI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQorI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCisjZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKKyNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAorI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NnNjby5oIGIvYmZkL2hvc3RzL2kzODZzY28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg2MDhjCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hvc3RzL2kzODZzY28uaApAQCAtMCwwICsxLDE5IEBACisvKiBDb3JlIGZpbGUgc3R1ZmYuICBBdCBsZWFzdCBzb21lLCBwZXJoYXBzIGFsbCwgb2YgdGhlIGZvbGxvd2luZworICAgZGVmaW5lcyB3b3JrIG9uIG1hbnkgbW9yZSBzeXN0ZW1zIHRoYW4ganVzdCBTQ08uICAqLworCisjZGVmaW5lIE5CUEcgTkJQQworI2RlZmluZSBVUEFHRVMgVVNJWkUKKyNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgdS51X2V4ZGF0YS51eF9kYXRvcmcKKyNkZWZpbmUgSE9TVF9TVEFDS19TVEFSVF9BRERSIHUudV9zdWIKKyNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCisgICgoY29yZV91cGFnZShhYmZkKS0+dV9zeXNhYm9ydCAhPSAwKSBcCisgICA/IGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgXAorICAgOiAtMSkKKworLyogQWNjb3JkaW5nIHRvIHRoZSBtYW5wYWdlLCBhIHZlcnNpb24gMiBTQ08gY29yZWZpbGUgY2FuIGNvbnRhaW4KKyAgIHZhcmlvdXMgYWRkaXRpb25hbCBzZWN0aW9ucyAoaXQgaXMgY2xldmVybHkgYXJyYW5nZWQgc28gdGhlIHUgYXJlYSwKKyAgIGRhdGEsIGFuZCBzdGFjayBhcmUgZmlyc3Qgd2hlcmUgd2UgY2FuIGZpbmQgdGhlbSkuICBTbyB3aXRob3V0CisgICB3cml0aW5nIGxvdHMgb2YgY29kZSB0byBwYXJzZSBhbGwgdGhlaXIgaGVhZGVycyBhbmQgc3R1ZmYsIHdlIGNhbid0CisgICBrbm93IHdoZXRoZXIgYSBjb3JlZmlsZSBpcyBiaWdnZXIgdGhhbiBpdCBzaG91bGQgYmUuICAqLworCisjZGVmaW5lIFRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRSAxCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTg2MG1hY2gzLmggYi9iZmQvaG9zdHMvaTg2MG1hY2gzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkMmFhMQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9pODYwbWFjaDMuaApAQCAtMCwwICsxLDI3IEBACisvKiBUaGlzIGZpbGUgd2FzIGhhY2tlZCBmcm9tIGkzODZtYWNoMy5oICAgW2RvbGFuQHNzZC5pbnRlbC5jb21dICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0CisgKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBpMzg2L21hY2hwYXJhbS5oLgorICoKKyAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCisgKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAorICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKKyAqIGZvciBpMzg2IGFuZCBpODYwLiBVUEFHRVMgaXMgdXNlZCBvbmx5IGluIHRyYWQtY29yZS5jLgorICovCisjaWYgVVBBR0VTID09IDE2CisjdW5kZWYgIFVQQUdFUworI2RlZmluZSBVUEFHRVMgMgorI2VuZGlmCisKKyNpZiBVUEFHRVMgIT0gMgorRklYTUUhISBVUEFHRVMgaXMgbmVpdGhlciAyIG5vciAxNgorI2VuZGlmCisKKyNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEKKyNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRworI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9pODYwCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL202OGthdXguaCBiL2JmZC9ob3N0cy9tNjhrYXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzNzc1NQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9tNjhrYXV4LmgKQEAgLTAsMCArMSwxNiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGFuIEFwcGxlIE1hY2ludG9zaCBydW5uaW5nIEEvVVggMy54LiAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3BhZ2UuaD4KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCisjZGVmaW5lCU5CUEcJCQlOQlBQCisKKyNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF9kYXRvcmcKKyNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF90eHRvcmcKKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDEwMDAwMDAwMAorCisjZGVmaW5lCVVQQUdFUwkJCVVTSVpFCisKKyNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCisgIChhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrbGludXguaCBiL2JmZC9ob3N0cy9tNjhrbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY3ZGZhCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hvc3RzL202OGtsaW51eC5oCkBAIC0wLDAgKzEsNiBAQAorLyogTGludXggZHVtcHMgInN0cnVjdCB0YXNrX3N0cnVjdCIgYXQgdGhlIGVuZCBvZiB0aGUgY29yZS1maWxlLiAgVGhpcworICAgc3RydWN0dXJlIGlzIGN1cnJlbnRseSAyNTEyIGJ5dGVzIGxvbmcsIGJ1dCB3ZSBhbGxvdyB1cCB0byA0MDk2CisgICBieXRlcyB0byBhbGxvdyBmb3Igc29tZSBmdXR1cmUgZ3Jvd3RoLiAgKi8KKyNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAkJNDA5NgorI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGFiZmQpIFwKKyAgKChhYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUuc2lnbmFsKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL204OGttYWNoMy5oIGIvYmZkL2hvc3RzL204OGttYWNoMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTU1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvbTg4a21hY2gzLmgKQEAgLTAsMCArMSwxMSBAQAorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjdW5kZWYgVVBBR0VTCisjZGVmaW5lIFVQQUdFUyAzCisKKyNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKKyNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRworI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tODhrCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL21pcHNic2QuaCBiL2JmZC9ob3N0cy9taXBzYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmYWQyMQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9taXBzYnNkLmgKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKyN1bmRlZiBBTElHTgorCisjZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCisvKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCisjZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKKy8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCisKKyNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKKyNkZWZpbmUgTk9fQ09SRV9DT01NQU5ECmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc21hY2gzLmggYi9iZmQvaG9zdHMvbWlwc21hY2gzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjNDY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9taXBzbWFjaDMuaApAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CisjaW5jbHVkZSA8bWFjaGluZS9tYWNocGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRworLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHICAqLworI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCVVTUlRFWFQKKyNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJVVNSREFUQQorI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbmV3cy1taXBzLmggYi9iZmQvaG9zdHMvbmV3cy1taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3OTliZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9uZXdzLW1pcHMuaApAQCAtMCwwICsxLDEyIEBACisvKiBTb255IE5ld3MgcnVubmluZyBOZXdzT1MgMy4yLiAgKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorCisjZGVmaW5lIEhPU1RfUEFHRV9TSVpFIE5CUEcKKworI2RlZmluZSBIT1NUX01BQ0hJTkVfQVJDSCBiZmRfYXJjaF9taXBzCisKKyNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgVVNSVEVYVAorI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiBVU1JEQVRBCisjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9uZXdzLmggYi9iZmQvaG9zdHMvbmV3cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzk0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvbmV3cy5oCkBAIC0wLDAgKzEsOSBAQAorLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCisKKyNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKworI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCisjZGVmaW5lIEhPU1RfU0VHTUVOVF9TSVpFIE5CUEcKKyNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbTY4aworI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAwCisjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oIGIvYmZkL2hvc3RzL3BjNTMybWFjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTZmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvcGM1MzJtYWNoLmgKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisvKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKKyAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIG5zNTMyL21hY2hwYXJhbS5oLgorICoKKyAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCisgKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAorICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKKyAqIGZvciBuczUzMiwgaTM4NiBhbmQgaTg2MC4gVVBBR0VTIGlzIHVzZWQgb25seSBpbiB0cmFkLWNvcmUuYy4KKyAqLworI2lmIFVQQUdFUyA9PSAxNgorI3VuZGVmICBVUEFHRVMKKyNkZWZpbmUgVVBBR0VTIDIKKyNlbmRpZgorCisjaWYgVVBBR0VTICE9IDIKKyNlcnJvciBVUEFHRVMgaXMgbmVpdGhlciAyIG5vciAxNgorI2VuZGlmCisKKyNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEKKyNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRworI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCisjZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9yaXNjb3MuaCBiL2JmZC9ob3N0cy9yaXNjb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZhODI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hvc3RzL3Jpc2Nvcy5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qIFJJU0Mvb3MgNC41MkMsIGFuZCBwcmVzdW1hYmx5IG90aGVyIHZlcnNpb25zLiAgKi8KKworI2luY2x1ZGUgPGJzZDQzL21hY2hpbmUvbWFjaHBhcmFtLmg+CisjaW5jbHVkZSA8YnNkNDMvbWFjaGluZS92bXBhcmFtLmg+CisKKyNkZWZpbmUgTkJQRyBCU0Q0M19OQlBHCisjZGVmaW5lIFVQQUdFUyBCU0Q0M19VUEFHRVMKKyNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgQlNENDNfVVNSVEVYVAorI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiBCU0Q0M19VU1JEQVRBCisjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgQlNENDNfVVNSU1RBQ0sKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9zeW1tZXRyeS5oIGIvYmZkL2hvc3RzL3N5bW1ldHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MTdiMwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy9zeW1tZXRyeS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIFN5bW1ldHJ5IHJ1bm5pbmcgZWl0aGVyIGR5bml4IDMuMSAoYnNkKSBvciBwdHggKHN5c3YpLiAgKi8KKworI2RlZmluZSBOQlBHIDQwOTYKKyNkZWZpbmUgVVBBR0VTIDEKKworI2lmZGVmIF9TRVFVRU5UXworLyogcHR4ICovCisjZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKKyNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAweDNmZmZlMDAwCisjZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCAoKFVQQUdFUyAqIE5CUEcpIC0gc2l6ZW9mIChzdHJ1Y3QgdXNlcikpCisjZWxzZQorLyogZHluaXggKi8KKyNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMHgxMDAwCisjZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIChOQlBHICogdS51X3RzaXplKQorI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmYwMDAKKyNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAorICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCisjZW5kaWYKKworI2RlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy90YWhvZS5oIGIvYmZkL2hvc3RzL3RhaG9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2Y2VlMgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy90YWhvZS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECisKKyN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCisjaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgorI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KKworI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRworI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF90YWhvZQorCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCTAKKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkoS0VSTkJBU0UgLSAoVVBBR0VTICogTkJQRykpCisjZGVmaW5lCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4YnNkLmggYi9iZmQvaG9zdHMvdmF4YnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViOWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy92YXhic2QuaApAQCAtMCwwICsxLDE5IEBACisjZGVmaW5lCU5PX0NPUkVfQ09NTUFORAkJLyogTm8gY29tbWFuZCBuYW1lIGluIGNvcmUgZmlsZSAqLworCisjaWYgMAorI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KKy8qIERvZXMgbm90IGV4aXN0IG9uIEJTRCA0LjMsIGl0IHVzZXMgbWFjaGluZS9tYWNocGFyYW0uaC4KKyAgIFdoYXRldmVyIGl0IGlzLCBpdCdzIGluY2x1ZGVkIGJ5IDxzeXMvcGFyYW0uaD4sIHdoaWNoIHRyYWQtY29yZS5jLAorICAgdGhlIG9ubHkgcGxhY2UgdGhhdCB1c2VzIHRoaXMgKEkgdGhpbmspLCBhbHJlYWR5IGluY2x1ZGVzLiAgKi8KKyNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+CisjZW5kaWYKKyN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCisKKy8qIE5vdGUgdGhhdCBIT1NUX1BBR0VfU0laRSAtLSB0aGUgcGFnZSBzaXplIGFzIGZhciBhcyBleGVjdXRhYmxlIGZpbGVzCisgICBhcmUgY29uY2VybmVkIC0tIGlzIG5vdCB0aGUgc2FtZSBhcyBOQlBHLCBiZWNhdXNlIG9mIHBhZ2UgY2x1c3RlcmluZy4gICovCisjZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxMDI0CisjZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX3ZheAorCisjZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCTAKKyNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkoMHg4MDAwMDAwMCAtIChVUEFHRVMgKiBOQlBHKSkKKyN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdC5oIGIvYmZkL2hvc3RzL3ZheHVsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzMxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaG9zdHMvdmF4dWx0LmgKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQorI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKKworI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCisjZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKKyN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdDIuaCBiL2JmZC9ob3N0cy92YXh1bHQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3MzFiNwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ob3N0cy92YXh1bHQyLmgKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQorI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKKworI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCisjZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKKyN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hwMzAwYnNkLmMgYi9iZmQvaHAzMDBic2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY3YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hwMzAwYnNkLmMKQEAgLTAsMCArMSwzOCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBIUCA5MDAwLzMwMCAoNjgwMDAtYmFzZWQpIG1hY2hpbmVzIHJ1bm5pbmcgQlNEIFVuaXguCisgICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKyNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAorI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTworI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCAvKiBBdm9pZHMgd2FybmluZyAqLworI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAorI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKKworI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwYnNkXyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBic2QiCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2hwMzAwaHB1eC5jIGIvYmZkL2hwMzAwaHB1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTIzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaHAzMDBocHV4LmMKQEAgLTAsMCArMSw4NzAgQEAKKy8qIEJGRCBiYWNrZW5kIGZvciBocC11eCA5MDAwLzMwMAorICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBHbGVubiBFbmdlbC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorCisgICAgaHB1eCBuYXRpdmUgIC0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhwMzAwaHB1eCBiZmQgfCAtLS0tLS0tLS0tPiBocHV4IHcvZ251IGV4dAorICAgIGhwdXggdy9nbnUgZXh0ZW5zaW9uIC0tLS0+IHwgICAgICAgICAgICAgICB8CisKKworICAgIFN1cHBvcnQgZm9yIHRoZSA5MDAwL1szNF0wMCBoYXMgc2V2ZXJhbCBsaW1pdGF0aW9ucy4KKyAgICAgIDEuIFNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAyLiBUaGUgb3V0cHV0IGZvcm1hdCBmcm9tIHRoaXMgYmZkIGlzIG5vdCB1c2FibGUgYnkgbmF0aXZlIHRvb2xzLgorCisgICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGlzIGJmZCB3YXMgdG8gYWxsb3cgdXNlIG9mCisgICAgZ2RiIGFuZCBnY2MgZm9yIGhvc3QgYmFzZWQgZGVidWdnaW5nIGFuZCBub3QgdG8gbWltaWMgdGhlIGhwLXV4IHRvb2xzCisgICAgaW4gZXZlcnkgZGV0YWlsLiAgVGhpcyBsZWFkcyB0byBhIHNpZ25pZmljYW50IHNpbXBsaWZpY2F0aW9uIG9mIHRoZQorICAgIGNvZGUgYW5kIGEgbGVhcCBpbiBwZXJmb3JtYW5jZS4gIFRoZSBkZWNpc2lvbiB0byBub3Qgb3V0cHV0IGhwIG5hdGl2ZQorICAgIGNvbXBhdGlibGUgb2JqZWN0cyB3YXMgZnVydGhlciBzdHJlbmd0aGVuZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmljaG5lc3MKKyAgICBvZiB0aGUgZ2NjIGNvbXBpbGVkIG9iamVjdHMgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcyBvZgorICAgIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHdoaWxlIHRoZSBocCBmb3JtYXQgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YKKyAgICBzZWNvbmRhcnkgc3ltYm9scywgaXQgZG9lcyBub3Qgc3VwcG9ydCBpbmRpcmVjdCBzeW1ib2xzLiAgQW5vdGhlcgorICAgIHJlYXNvbiBpcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGltcGxlbWVudGF0aW9ucworICAgIG9mIGdjYyBvbiBocHV4IHdoaWNoIHVzZWQgJ2hweHQnIHRvIHRyYW5zbGF0ZSAuYSBhbmQgLm8gZmlsZXMgaW50byBhCisgICAgZm9ybWF0IHdoaWNoIGNvdWxkIGJlIHJlYWRpbHkgdW5kZXJzdG9vZCBieSB0aGUgZ251IGxpbmtlciBhbmQgZ2RiLgorICAgIFRoaXMgYWxsb3dzIHJlYWRpbmcgaHAgc2Vjb25kYXJ5IHN5bWJvbHMgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvCisgICAgaW5kaXJlY3Qgc3ltYm9scyBidXQgdGhlIHJldmVyc2UgaXQgbm90IGFsd2F5cyBwb3NzaWJsZS4KKworICAgIEFub3RoZXIgZXhhbXBsZSBvZiBkaWZmZXJlbmNlcyBpcyB0aGF0IHRoZSBocCBmb3JtYXQgc3RvcmVzIHN5bWJvbCBvZmZzZXRzCisgICAgaW4gdGhlIG9iamVjdCBjb2RlIHdoaWxlIHRoZSBnbnUgdXRpbGl0aWVzIHVzZSBhIGZpZWxkIGluIHRoZQorICAgIHJlbG9jYXRpb24gcmVjb3JkIGZvciB0aGlzLiAgVG8gc3VwcG9ydCB0aGUgaHAgbmF0aXZlIGZvcm1hdCwgdGhlIG9iamVjdAorICAgIGNvZGUgd291bGQgbmVlZCB0byBiZSBwYXRjaGVkIHdpdGggdGhlIG9mZnNldHMgd2hlbiBwcm9kdWNpbmcgLm8gZmlsZXMuCisKKyAgICBUaGUgYmFzaWMgdGVjaG5pcXVlIHRha2VuIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gI2luY2x1ZGUgdGhlIGNvZGUKKyAgICBmcm9tIGFvdXR4LmggYW5kIGFvdXQtdGFyZ2V0Lmggd2l0aCBhcHByb3ByaWF0ZSAjZGVmaW5lcyB0byBvdmVycmlkZQorICAgIGNvZGUgd2hlcmUgYSB1bmlxdWUgaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkOgorCisgICAgeworICAgICAgICAjZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYKKyAgICAgICAgI2luY2x1ZGUgPGFvdXR4Lmg+CisKKyAgICAgICAgaW1wbGVtZW50IGEgYnVuY2ggb2YgZnVuY3Rpb25zCisKKyAgICAgICAgI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCisgICAgfQorCisgICAgVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAorICAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKKyAgICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQorICAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICAgbmxpc3QgZWxlbWVudCAxCisgICAgc3RyaW5nMQorICAgIG5saXN0IGVsZW1lbnQgMgorICAgIHN0cmluZzIKKyAgICAuLi4KKworICAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAorICAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKKyAgICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCisgICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgorCisgICAgc3RyaW5nMQorICAgIG51bGwKKyAgICBzdHJpbmcyCisgICAgbnVsbAorICovCisKKy8qIEBAIElzIHRoaXMgcmVhbGx5IHNvIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBhLm91dCB0aGF0IGl0IG5lZWRzIHRvIGluY2x1ZGUKKyAgIGFvdXR4Lmg/ICBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGlzIGZpbGUgc29tZXRpbWUgYW5kIHNlZSB3aGF0IGNhbiBiZSBtYWRlCisgICBtb3JlIGRlcGVuZGVudCBvbiBhb3V0MzIubyBhbmQgd2hhdCBtaWdodCBuZWVkIHRvIGJlIGJyb2tlbiBvZmYgYW5kIGFjY2Vzc2VkCisgICB0aHJvdWdoIHRoZSBiYWNrZW5kX2RhdGEgZmllbGQuICBPciwgbWF5YmUgd2UgcmVhbGx5IGRvIG5lZWQgc3VjaCBhCisgICBjb21wbGV0ZWx5IHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLiAgSSBkb24ndCBoYXZlIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhpcworICAgbXVjaCBmdXJ0aGVyIHJpZ2h0IG5vdy4gIFtyYWVidXJuOjE5OTMwNDI4LjIxMjRFU1RdICovCisvKiBAQCBBbHNvLCBub3RlIHRoYXQgdGhlcmUgd2luZCB1cCBiZWluZyB0d28gdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcywgd2l0aAorICAgZGlmZmVyZW50IG5hbWVzLCBvbmx5IG9uZSBvZiB3aGljaCBhY3R1YWxseSBnZXRzIHVzZWQuICBGb3IgZXhhbXBsZToKKwlzbHVycF9zeW1ib2xfdGFibGUKKwlzd2FwX3N0ZF9yZWxvY19pbgorCXNsdXJwX3JlbG9jX3RhYmxlCisJZ2V0X3N5bXRhYgorCWdldF9zeW10YWJfdXBwZXJfYm91bmQKKwljYW5vbmljYWxpemVfcmVsb2MKKwlta29iamVjdAorICAgVGhpcyBzaG91bGQgYWxzbyBiZSBmaXhlZC4gICovCisKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBocHV4IgorI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwaHB1eF8sT1ApCisKKyNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBocDMwMGhwdXhfZXhlY19ieXRlcworI2RlZmluZSBleHRlcm5hbF9ubGlzdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKKworI2luY2x1ZGUgImFvdXQvaHAzMDBocHV4LmgiCisKKy8qIGRlZmluZSB0aGVzZSBzbyB3ZSBjYW4gY29tcGlsZSB1bnVzZWQgcm91dGluZXMgaW4gYW91dHguaCAqLworI2RlZmluZSBlX3N0cnggIGVfc2hsaWIKKyNkZWZpbmUgZV9vdGhlciBlX2xlbmd0aAorI2RlZmluZSBlX2Rlc2MgIGVfYWxtb2QKKworI2RlZmluZSBBUl9QQURfQ0hBUiAnLycKKyNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4aworCisjZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgTVlfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm92aWRlIG92ZXJyaWRlcyBmb3Igcm91dGluZXMgaW4gdGhpcyBmaWxlICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0aGVzZSBkb24ndCB1c2UgTVkgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyB3aXRoaW4gSlVNUF9UQUJMRQorICAgKENBVCB3aW5kcyB1cCBiZWluZyBleHBhbmRlZCByZWN1cnNpdmVseSwgd2hpY2ggQU5TSSBDIGNvbXBpbGVycworICAgd2lsbCBub3QgZG8pLiAgKi8KKyNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBocDMwMGhwdXhfZ2V0X3N5bXRhYgorI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGhwMzAwaHB1eF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCisjZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBocDMwMGhwdXhfY2Fub25pY2FsaXplX3JlbG9jCisjZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBocDMwMGhwdXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCisKKyNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAorI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluaworCisvKiBVbnRpbCBhbmQgdW5sZXNzIHdlIGNvbnZlcnQgdGhlIHNsdXJwX3JlbG9jIGFuZCBzbHVycF9zeW10YWIKKyAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSwgd2UgY2FuIG5vdCB1c2UgdGhlIGRlZmF1bHQgYW91dAorICAgZnJlZV9jYWNoZWRfaW5mbyByb3V0aW5lIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUgcmVsb2NzIGFuZCBzeW10YWJzCisgICB3ZXJlIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MuICAqLworI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQorCisjZGVmaW5lIGhwMzAwaHB1eF93cml0ZV9zeW1zIGFvdXRfMzJfd3JpdGVfc3ltcworCisjZGVmaW5lIE1ZX2NhbGxiYWNrIE1ZKGNhbGxiYWNrKQorCisjZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDB4MgorCisjZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGhwMzAwaHB1eF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKKworI2RlZmluZSBIUF9TWU1UWVBFX1VOREVGSU5FRAkweDAwCisjZGVmaW5lIEhQX1NZTVRZUEVfQUJTT0xVVEUJMHgwMQorI2RlZmluZSBIUF9TWU1UWVBFX1RFWFQJCTB4MDIKKyNkZWZpbmUgSFBfU1lNVFlQRV9EQVRBCQkweDAzCisjZGVmaW5lIEhQX1NZTVRZUEVfQlNTCQkweDA0CisjZGVmaW5lIEhQX1NZTVRZUEVfQ09NTU9OCTB4MDUKKworI2RlZmluZSBIUF9TWU1UWVBFX1RZUEUJCTB4MEYKKyNkZWZpbmUgSFBfU1lNVFlQRV9GSUxFTkFNRQkweDFGCisKKyNkZWZpbmUgSFBfU1lNVFlQRV9BTElHTgkweDEwCisjZGVmaW5lIEhQX1NZTVRZUEVfRVhURVJOQUwJMHgyMAorI2RlZmluZSBIUF9TRUNPTkRBUllfU1lNQk9MICAgICAweDQwCisKKy8qIFJFTE9DQVRJT04gREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgSFBfUlNFR01FTlRfVEVYVAkweDAwCisjZGVmaW5lIEhQX1JTRUdNRU5UX0RBVEEJMHgwMQorI2RlZmluZSBIUF9SU0VHTUVOVF9CU1MJCTB4MDIKKyNkZWZpbmUgSFBfUlNFR01FTlRfRVhURVJOQUwJMHgwMworI2RlZmluZSBIUF9SU0VHTUVOVF9QQ1JFTCAgICAgICAweDA0CisjZGVmaW5lIEhQX1JTRUdNRU5UX1JETFQgICAgICAgIDB4MDUKKyNkZWZpbmUgSFBfUlNFR01FTlRfUlBMVCAgICAgICAgMHgwNgorI2RlZmluZSBIUF9SU0VHTUVOVF9OT09QCTB4M0YKKworI2RlZmluZSBIUF9STEVOR1RIX0JZVEUJCTB4MDAKKyNkZWZpbmUgSFBfUkxFTkdUSF9XT1JECQkweDAxCisjZGVmaW5lIEhQX1JMRU5HVEhfTE9ORwkJMHgwMgorI2RlZmluZSBIUF9STEVOR1RIX0FMSUdOCTB4MDMKKworI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhocDMwMGhwdXgsXzMyXyx5KQorI2RlZmluZSBBUkNIX1NJWkUgMzIKKworLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLworI2RlZmluZSBCTUFHSUMgSFBVWF9ET1RfT19NQUdJQworI2RlZmluZSBRTUFHSUMgMDMxNAorCisjaW5jbHVkZSAiYW91dHguaCIKKworLyogU2luY2UgdGhlIGhwdXggc3ltYm9sIHRhYmxlIGhhcyBubGlzdCBlbGVtZW50cyBpbnRlcnNwZXJzZWQgd2l0aAorICAgc3RyaW5ncyBhbmQgd2UgbmVlZCB0byBpbnNlcnQgc29tIHN0cmluZ3MgZm9yIHNlY29uZGFyeSBzeW1ib2xzLCB3ZQorICAgZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgZXh0cmEgcGFkZGluZyB1cCBmcm9udCB0byBhY2NvdW50IGZvcgorICAgdGhpcy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBub24tc2Vjb25kYXJ5IHN5bWJvbCB3ZSBwcm9jZXNzLCB3ZSBnYWluCisgICA5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUgZGlzY2FyZGVkIG5saXN0IGVsZW1lbnQgKG9uZSBieXRlIHVzZWQgZm9yCisgICBudWxsKS4gIFNZTV9FWFRSQV9CWVRFUyBpcyB0aGUgZXh0cmEgc3BhY2UuICAqLworI2RlZmluZSBTWU1fRVhUUkFfQllURVMgICAxMDI0CisKKy8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KKyAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitNWSAoY2FsbGJhY2spIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKworICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7CisKKyAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOworICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOworCisgIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7CisgIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOworCisgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOworICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKKworICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KKyAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKKworICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKKyAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOworCisgIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKyNpZmRlZiBTRVRfQVJDSF9NQUNICisgIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7CisjZWxzZQorICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOworI2VuZGlmCisKKworICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQorICAgIHsKKyAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLworICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX1RSRUxPRkYgKCpleGVjcCk7CisgICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9HTlVfRFJFTE9GRiAoKmV4ZWNwKTsKKworICAgICAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLworICAgICAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fR05VX1NZTU9GRiAoKmV4ZWNwKTsKKyAgICAgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAob2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNwLT5hX3N5bXMpOworCisgICAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOworICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gMTI7CisgICAgICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gMTI7CisgICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKKyAgICB9CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKK2V4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7CisKK3N0YXRpYyBib29sZWFuCitNWSAod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCisgIGZpbGVfcHRyIHRleHRfZW5kOworCisgIG1lbXNldCAoJmV4ZWNfYnl0ZXMsIDAsIHNpemVvZiAoZXhlY19ieXRlcykpOworI2lmIENIT09TRV9SRUxPQ19TSVpFCisgIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKKyNlbHNlCisgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOworI2VuZGlmCisKKyAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCisgICAgTkFNRSAoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOworICBleGVjcC0+YV9zeW1zID0gMDsKKworICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisKKyAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCisJCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKKyAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCisJCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKKworICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCAweGMpOworICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKKworICBOQU1FIChhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsKKworICAvKiB1cGRhdGUgZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgc3dhcF9leGVjX2hlYWRlcl9vdXQgKi8KKworICAvKiB0aGlzIGlzIHJlYWxseSB0aGUgc3ltIHRhYmxlIHNpemUgYnV0IHdlIHN0b3JlIGl0IGluIGRyZWxvY3MgKi8KKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIDEyLCBleGVjX2J5dGVzLmVfZHJlbG9jcyk7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpICE9IDAKKyAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQorCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xzLCBhbmQgdGhlbiB0aGUgcmVsb2NzLiAgV2UgbXVzdCB3cml0ZSBvdXQKKyAgICAgICB0aGUgc3ltYm9scyBmaXJzdCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgKi8KKworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKKyAgICB7CisgICAgICAvKiBTa2lwIHRoZSByZWxvY3MgdG8gd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIHN5bWJvbHMuICAqLworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIE5fRFJFTE9GRiAoKmV4ZWNwKSArIGV4ZWNwLT5hX2Ryc2l6ZSwKKwkJICAgIFNFRUtfU0VUKSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCFNWSAod3JpdGVfc3ltcykgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9EUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBjb252ZXJ0IHRoZSBocCBzeW1ib2wgdHlwZSB0byBiZSB0aGUgc2FtZSBhcyBhb3V0NjQuaCB1c2FnZSBzbyB3ZSAqLworLyogY2FuIHBpZ2d5YmFjayByb3V0aW5lcyBpbiBhb3V0eC5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIHZvaWQKK2NvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpCisgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7CisgICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKKyAgICAgYmZkICphYmZkOworeworICBpbnQgbmFtZV90eXBlOworICBpbnQgbmV3X3R5cGU7CisKKyAgbmFtZV90eXBlID0gKGNhY2hlX3B0ci0+dHlwZSk7CisgIG5ld190eXBlID0gMDsKKworICBpZiAoKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfQUxJR04pICE9IDApCisgICAgeworICAgICAgLyogaW91X2Vycm9yICgiYWxpZ25lZCBzeW1ib2wgZW5jb3VudGVyZWQ6ICVzIiwgbmFtZSk7Ki8KKyAgICAgIG5hbWVfdHlwZSA9IDA7CisgICAgfQorCisgIGlmIChuYW1lX3R5cGUgPT0gSFBfU1lNVFlQRV9GSUxFTkFNRSkKKyAgICBuZXdfdHlwZSA9IE5fRk47CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfVFlQRSkKKwl7CisJY2FzZSBIUF9TWU1UWVBFX1VOREVGSU5FRDoKKwkgIG5ld190eXBlID0gTl9VTkRGOworCSAgYnJlYWs7CisKKwljYXNlIEhQX1NZTVRZUEVfQUJTT0xVVEU6CisJICBuZXdfdHlwZSA9IE5fQUJTOworCSAgYnJlYWs7CisKKwljYXNlIEhQX1NZTVRZUEVfVEVYVDoKKwkgIG5ld190eXBlID0gTl9URVhUOworCSAgYnJlYWs7CisKKwljYXNlIEhQX1NZTVRZUEVfREFUQToKKwkgIG5ld190eXBlID0gTl9EQVRBOworCSAgYnJlYWs7CisKKwljYXNlIEhQX1NZTVRZUEVfQlNTOgorCSAgbmV3X3R5cGUgPSBOX0JTUzsKKwkgIGJyZWFrOworCisJY2FzZSBIUF9TWU1UWVBFX0NPTU1PTjoKKwkgIG5ld190eXBlID0gTl9DT01NOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJICBicmVhazsKKwl9CisgICAgICBpZiAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9FWFRFUk5BTCkKKwluZXdfdHlwZSB8PSBOX0VYVDsKKworICAgICAgaWYgKG5hbWVfdHlwZSAmIEhQX1NFQ09OREFSWV9TWU1CT0wpCisJeworCSAgc3dpdGNoIChuZXdfdHlwZSkKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgorCSAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBub256ZXJvLCB0aGVuIGp1c3QgdHJlYXQgdGhpcyBhcyBhCisgICAgICAgICAgICAgICAgIGNvbW1vbiBzeW1ib2wuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBjb3JyZWN0IGluCisgICAgICAgICAgICAgICAgIGFsbCBjYXNlcywgYnV0IGl0IGlzIG1vcmUgY29ycmVjdCB0aGFuIHRyZWF0aW5nIGl0IGFzCisgICAgICAgICAgICAgICAgIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPT0gMCkKKwkJbmV3X3R5cGUgPSBOX1dFQUtVOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CisJICAgICAgbmV3X3R5cGUgPSBOX1dFQUtBOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgorCSAgICAgIG5ld190eXBlID0gTl9XRUFLVDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKKwkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0Q7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKKwkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0I7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICBjYWNoZV9wdHItPnR5cGUgPSBuZXdfdHlwZTsKKworfQorCisKKy8qCitERVNDUklQVElPTgorICAgICAgICBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdworICAgICAgICBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyCisgICAgICAgIHN0cnVjdHVyZS4KKyovCisKK3ZvaWQKK05BTUUgKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKKyAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKikgcmF3X2J5dGVzOworCisgIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKKyAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCisgICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKKyAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLworICBtZW1zZXQgKGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7CisgIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCisgIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOworICBleGVjcC0+YV90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOworICBleGVjcC0+YV9kYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOworICBleGVjcC0+YV9ic3MgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKKyAgZXhlY3AtPmFfc3ltcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKKyAgZXhlY3AtPmFfZW50cnkgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOworICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKKyAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogY2hlY2sgdGhlIGhlYWRlciB0byBzZWUgaWYgaXQgd2FzIGdlbmVyYXRlZCBieSBhIGJmZCBvdXRwdXQgKi8KKyAgLyogdGhpcyBpcyBkZXRlY3RlZCByYXRoZXIgYml6YXJlbHkgYnkgcmVxdWlyaW5nIGEgYnVuY2ggb2YgICAgKi8KKyAgLyogaGVhZGVyIGZpZWxkcyB0byBiZSB6ZXJvIGFuZCBhbiBvbGQgdW51c2VkIGZpZWxkIChub3cgdXNlZCkgKi8KKyAgLyogdG8gYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgZG8KKyAgICB7CisgICAgICBsb25nIHN5bXM7CisgICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOworICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfcGFzc2l6ZSkgIT0gMCkKKwlicmVhazsKKyAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpICE9IDApCisJYnJlYWs7CisgICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9zdXBzaXplKSAhPSAwKQorCWJyZWFrOworCisgICAgICBzeW1zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9kcmVsb2NzKTsKKyAgICAgIGlmIChzeW1zID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIE9LLCB3ZSd2ZSBwYXNzZWQgdGhlIHRlc3QgYXMgYmVzdCBhcyB3ZSBjYW4gZGV0ZXJtaW5lICovCisgICAgICBleGVjcC0+YV9zeW1zID0gc3ltczsKKworICAgICAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3Igd2hlcmUgd2Ugd2lsbCBzdG9yZSB0aGlzIHJlc3VsdCAqLworICAgICAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnJhd3B0cikpOworCisgICAgICBpZiAocmF3cHRyID09IE5VTEwpCisJcmV0dXJuOworICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOworICAgICAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IGdudV9lbmNhcF9mb3JtYXQ7CisgICAgfQorICB3aGlsZSAoMCk7Cit9CisKKworLyogVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAorICAgb2YgaGF2aW5nIGFuIGFycmF5IG9mIG5saXN0IGl0ZW1zIGFuZCBhbiBhcnJheSBvZiBzdHJpbmdzLCBocCdzIGZvcm1hdAorICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKKyAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICBubGlzdCBlbGVtZW50IDEKKyAgIHN0cmluZzEKKyAgIG5saXN0IGVsZW1lbnQgMgorICAgc3RyaW5nMgorICAgLi4uCisKKyAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAorICAgYW5kIGNvbnZlcnQgaXQgdG8gY2Fub25pY2FsIGZvcm0uICBBcyB3ZSBtYXJjaCB0aHJ1IHRoZSB0YWJsZSwgd2UgY29weQorICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAorICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgorCisgICBzdHJpbmcxCisgICBudWxsCisgICBzdHJpbmcyCisgICBudWxsCisgICAuLi4KKyovCisKK2Jvb2xlYW4KK01ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9zaXplX3R5cGUgc3ltYm9sX2J5dGVzOworICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKKyAgY2hhciAqc3RyaW5nczsKKyAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOworICB1bnNpZ25lZCBudW1fc3ltcyA9IDA7CisKKyAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLworICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgc3ltYm9sX2J5dGVzID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7CisKKyAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQlzeW1ib2xfYnl0ZXMgKyBTWU1fRVhUUkFfQllURVMpOworICBpZiAoIXN0cmluZ3MpCisgICAgcmV0dXJuIGZhbHNlOworICBzeW1zID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoc3RyaW5ncyArIFNZTV9FWFRSQV9CWVRFUyk7CisgIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IGJmZF9yZWFkICgoUFRSKSBzeW1zLCBzeW1ib2xfYnl0ZXMsIDEsIGFiZmQpICE9IHN5bWJvbF9ieXRlcykKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgc3ltcyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgc3ltX2VuZCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1zKSArIHN5bWJvbF9ieXRlcyk7CisKKyAgLyogZmlyc3QsIG1hcmNoIHRocnUgdGhlIHRhYmxlIGFuZCBmaWd1cmUgb3V0IGhvdyBtYW55IHN5bWJvbHMgdGhlcmUgYXJlICovCisgIGZvciAoc3ltX3BvaW50ZXIgPSBzeW1zOyBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIG51bV9zeW1zKyspCisgICAgeworICAgICAgLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCisgICAgICBzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKworCQkJCQkgICAgICAgc3ltX3BvaW50ZXItPmVfbGVuZ3RoWzBdKTsKKyAgICB9CisKKyAgLyogbm93IHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sIGNvdW50LCB1cGRhdGUgdGhlIGJmZCBoZWFkZXIgKi8KKyAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBudW1fc3ltczsKKworICBjYWNoZWQgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikKKwkgICAgYmZkX3phbGxvYyAoYWJmZCwKKwkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSkpOworICBpZiAoY2FjaGVkID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogYXMgd2UgbWFyY2ggdGhydSB0aGUgaHAgc3ltYm9sIHRhYmxlLCBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mCisgICAgIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIHRvIGhvbGQgdGhlIHN5bWJvbCBuYW1lcy4gIE1ha2Ugc3VyZSBhbnkKKyAgICAgYXNzaWdubWVudCB0byB0aGUgc3RyaW5ncyBwb2ludGVyIGlzIGRvbmUgYWZ0ZXIgd2UncmUgdGhydSB1c2luZworICAgICB0aGUgbmxpc3Qgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGFueXRoaW5nIGltcG9ydGFudC4gKi8KKworICAvKiBPSywgbm93IHdhbGsgdGhlIG5ldyBzeW10YWJsZSwgY2FjaGVpbmcgc3ltYm9sIHByb3BlcnRpZXMgKi8KKyAgeworICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0ciA9IGNhY2hlZDsKKyAgICBhb3V0X3N5bWJvbF90eXBlIGNhY2hlX3NhdmU7CisgICAgLyogUnVuIHRocm91Z2ggdGFibGUgYW5kIGNvcHkgdmFsdWVzICovCisgICAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXMsIGNhY2hlX3B0ciA9IGNhY2hlZDsKKwkgc3ltX3BvaW50ZXIgPCBzeW1fZW5kOyBzeW1fcG9pbnRlcisrLCBjYWNoZV9wdHIrKykKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCWNhY2hlX3B0ci0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworCWNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCBzeW1fcG9pbnRlci0+ZV92YWx1ZSk7CisJY2FjaGVfcHRyLT5kZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3ltX3BvaW50ZXItPmVfYWxtb2QpOworCWNhY2hlX3B0ci0+dHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfdHlwZSk7CisJY2FjaGVfcHRyLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7CisJbGVuZ3RoID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9sZW5ndGgpOworCWNhY2hlX3B0ci0+b3RoZXIgPSBsZW5ndGg7CS8qIG90aGVyIG5vdCB1c2VkLCBzYXZlIGxlbmd0aCBoZXJlICovCisKKwljYWNoZV9zYXZlID0gKmNhY2hlX3B0cjsKKwljb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKTsKKwlpZiAoIXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikpCisJICByZXR1cm4gZmFsc2U7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogZm9yIGhwdXgsIHRoZSAnbGVuZ2h0JyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiAqLworCS8qIHRoZSBzeW1ib2wgbmFtZSB3aGljaCBmb2xsb3dzIHRoZSBubGlzdCBlbnRyeS4gICAgICAgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJaWYgKGxlbmd0aCkKKwkgIHsKKwkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSAgICAvKiB0aGUgaHAgc3RyaW5nIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQgc28gd2UgY3JlYXRlIGEgbmV3IG9uZSovCisJICAgIC8qIGJ5IGNvcHlpbmcgdGhlIHN0cmluZyB0byBvdmVybGFwIHRoZSBqdXN0IHZhY2F0ZWQgbmxpc3QgICAgKi8KKwkgICAgLyogc3RydWN0dXJlIGJlZm9yZSBpdCBpbiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJICAgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzOworCSAgICBtZW1jcHkgKHN0cmluZ3MsIHN5bV9wb2ludGVyICsgMSwgbGVuZ3RoKTsKKwkgICAgc3RyaW5nc1tsZW5ndGhdID0gJ1wwJzsKKwkgICAgc3RyaW5ncyArPSBsZW5ndGggKyAxOworCSAgfQorCWVsc2UKKwkgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBOVUxMOworCisJLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCisJc3ltX3BvaW50ZXIgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltX3BvaW50ZXIpICsKKwkJCQkJCSBsZW5ndGgpOworICAgICAgfQorICB9CisKKyAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWQ7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworCit2b2lkCitNWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpieXRlczsKKyAgICAgYXJlbGVudCAqY2FjaGVfcHRyOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKK3sKKyAgaW50IHJfaW5kZXg7CisgIGludCByX2V4dGVybiA9IDA7CisgIHVuc2lnbmVkIGludCByX2xlbmd0aDsKKyAgaW50IHJfcGNyZWwgPSAwOworICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOworCisgIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7CisgIHJfaW5kZXggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5yX2luZGV4KTsKKworICBzd2l0Y2ggKGJ5dGVzLT5yX3R5cGVbMF0pCisgICAgeworICAgIGNhc2UgSFBfUlNFR01FTlRfVEVYVDoKKyAgICAgIHJfaW5kZXggPSBOX1RFWFQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhQX1JTRUdNRU5UX0RBVEE6CisgICAgICByX2luZGV4ID0gTl9EQVRBOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIUF9SU0VHTUVOVF9CU1M6CisgICAgICByX2luZGV4ID0gTl9CU1M7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhQX1JTRUdNRU5UX0VYVEVSTkFMOgorICAgICAgcl9leHRlcm4gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIUF9SU0VHTUVOVF9QQ1JFTDoKKyAgICAgIHJfZXh0ZXJuID0gMTsKKyAgICAgIHJfcGNyZWwgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIUF9SU0VHTUVOVF9SRExUOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUF9SU0VHTUVOVF9SUExUOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBIUF9SU0VHTUVOVF9OT09QOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHN3aXRjaCAoYnl0ZXMtPnJfbGVuZ3RoWzBdKQorICAgIHsKKyAgICBjYXNlIEhQX1JMRU5HVEhfQllURToKKyAgICAgIHJfbGVuZ3RoID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSFBfUkxFTkdUSF9XT1JEOgorICAgICAgcl9sZW5ndGggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIUF9STEVOR1RIX0xPTkc6CisgICAgICByX2xlbmd0aCA9IDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIHJfbGVuZ3RoICsgNCAqIHJfcGNyZWw7CisgIC8qIEZJWE1FLXNvb246ICBSb2xsIGJhc2VyZWwsIGptcHRhYmxlLCByZWxhdGl2ZSBiaXRzIGludG8gaG93dG8gc2V0dGluZyAqLworCisgIC8qIFRoaXMgbWFjcm8gdXNlcyB0aGUgcl9pbmRleCB2YWx1ZSBjb21wdXRlZCBhYm92ZSAqLworICBpZiAocl9wY3JlbCAmJiByX2V4dGVybikKKyAgICB7CisgICAgICAvKiBUaGUgR05VIGxpbmtlciBhc3N1bWVzIGFueSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLworICAgICAgLyogaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaW1hZ2Ugd2hpbGUgdGhlIEhQIGxpbmtlciAgKi8KKyAgICAgIC8qIGFkZHMgdGhpcyBpbiBsYXRlci4gIEFkZCBpdCBpbiBub3cuLi4gICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBNT1ZFX0FERFJFU1MgKC1jYWNoZV9wdHItPmFkZHJlc3MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIE1PVkVfQUREUkVTUyAoMCk7CisgICAgfQorfQorCitib29sZWFuCitNWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgdW5zaWduZWQgaW50IGNvdW50OworICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7CisgIFBUUiByZWxvY3M7CisgIGFyZWxlbnQgKnJlbG9jX2NhY2hlOworICBzaXplX3QgZWFjaF9zaXplOworICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpycHRyOworICB1bnNpZ25lZCBpbnQgY291bnRlcjsKKyAgYXJlbGVudCAqY2FjaGVfcHRyOworCisgIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCisgICAgeworICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7CisgICAgICBnb3RvIGRvaXQ7CisgICAgfQorCisgIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCisgICAgeworICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7CisgICAgICBnb3RvIGRvaXQ7CisgICAgfQorCisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgIHJldHVybiBmYWxzZTsKKworZG9pdDoKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOworCisgIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKKworCisgIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX3phbGxvYyAoYWJmZCwgKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mCisJCQkJCQkJKGFyZWxlbnQpKSk7CisgIGlmICghcmVsb2NfY2FjaGUgJiYgY291bnQgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmVsb2NzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19zaXplKTsKKyAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jX2NhY2hlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcnB0ciA9IChzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICopIHJlbG9jczsKKyAgY291bnRlciA9IDA7CisgIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOworCisgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKKyAgICB7CisgICAgICBNWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCisJCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7CisgICAgfQorCisKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7CisgIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7CisgIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbCB0byBmdW5jdGlvbnMgaW4gYW91dHguaCBleGNlcHQgKi8KKy8qIHRoZXkgcmVmZXIgdG8gTVkoZnVuYykgcmF0aGVyIHRoYW4gTkFNRShhb3V0LGZ1bmMpIGFuZCB0aGV5IGFsc28gICAgICovCisvKiBjYWxsIGFvdXRfMzIgdmVyc2lvbnMgaWYgdGhlIGlucHV0IGZpbGUgd2FzIGdlbmVyYXRlZCBieSBnY2MgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbG9uZyBhb3V0XzMyX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICogYWJmZCwgYXN5bWJvbCAqKiBsb2NhdGlvbikpOworbG9uZyBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICogYWJmZCkpOworCitsb25nIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqIGFiZmQsIHNlY19wdHIgc2VjdGlvbiwKKwkJCQkJIGFyZWxlbnQgKiogcmVscHRyLAorCQkJCQkgYXN5bWJvbCAqKiBzeW1ib2xzKSk7CisKK2xvbmcKK01ZIChnZXRfc3ltdGFiKSAoYWJmZCwgbG9jYXRpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOworeworICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7CisgIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7CisKKyAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKKyAgICByZXR1cm4gYW91dF8zMl9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbik7CisKKyAgaWYgKCFNWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCisgICAgcmV0dXJuIC0xOworCisgIGZvciAoc3ltYmFzZSA9IG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCisgICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopIChzeW1iYXNlKyspOworICAqbG9jYXRpb24rKyA9IDA7CisgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKK30KKworbG9uZworTVkgKGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCisgICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7CisgIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKK30KKworCisKKworbG9uZworTVkgKGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCisgICAgcmV0dXJuIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpOworCisgIGlmICghKHRibHB0ciB8fCBNWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKKyAgICB7CisgICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOworICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCisJeworCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7CisJICBjaGFpbiA9IGNoYWluLT5uZXh0OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOworCisgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKKwl7CisJICAqcmVscHRyKysgPSB0YmxwdHIrKzsKKwl9CisgICAgfQorICAqcmVscHRyID0gMDsKKworICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Cit9CisKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHBwYV9zdHVicy5oIGIvYmZkL2hwcGFfc3R1YnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg5M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2hwcGFfc3R1YnMuaApAQCAtMCwwICsxLDIzIEBACisvKiBIUFBBIGxpbmtlciBzdHViIGluc3RydWN0aW9ucyAgKi8KKworLyogVGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggdGhlIGxpbmtlciBtYXkgaW5zZXJ0IGludG8gdGhlCisgICBjb2RlIHN0cmVhbSB3aGVuIGJ1aWxkaW5nIGZpbmFsIGV4ZWN1dGFibGVzIHRvIGhhbmRsZSBvdXQtb2YtcmFuZ2UKKyAgIGNhbGxzIGFuZCBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCisKKyNkZWZpbmUgTERPX000X1IzMV9SMzEJCTB4MzdmZjNmZjkJLyogbGRvIC00KCVyMzEpLCVyMzEJICAqLworI2RlZmluZSBMRElMX1IxCQkJMHgyMDIwMDAwMAkvKiBsZGlsIFhYWCwlcjEJCSAgKi8KKyNkZWZpbmUgQkVfU1I0X1IxCQkweGUwMjAyMDAwCS8qIGJlIFhYWCglc3I0LCVyMSkJICAqLworI2RlZmluZSBDT1BZX1IzMV9SMiAgICAgICAgICAJMHgwODFmMDI0MgkvKiBjb3B5ICVyMzEsJXIyCSAgKi8KKyNkZWZpbmUgQkxFX1NSNF9SMAkJMHhlNDAwMjAwMAkvKiBibGUgWFhYKCVzcjQsJXIwKQkgICovCisjZGVmaW5lIEJMRV9TUjRfUjEJCTB4ZTQyMDIwMDAJLyogYmxlIFhYWCglc3I0LCVyMSkJICAqLworI2RlZmluZSBCVl9OXzBfUjMxCQkweGViZTBjMDAyCS8qIGJ2LG4gMCglcjMxKQkJICAqLworI2RlZmluZSBTVFdfUjMxX004UjMwCQkweDZiZGYzZmYxCS8qIHN0dyAlcjMxLC04KCVyMzApCSAgKi8KKyNkZWZpbmUgTERXX004UjMwX1IzMQkJMHg0YmRmM2ZmMQkvKiBsZHcgLTgoJXIzMCksJXIzMQkgICovCisjZGVmaW5lIFNUV19BUkdfTTE2UjMwCQkweDZiYzAzZmUxCS8qIHN0dyAlYXJnWCwtMTYoJXIzMCkJICAqLworI2RlZmluZSBMRFdfTTE2UjMwX0FSRwkJMHg0YmMwM2ZlMQkvKiBsZHcgLTEyKCVyMzApLCVhcmdYCSAgKi8KKyNkZWZpbmUgU1RXX0FSR19NMTJSMzAJCTB4NmJjMDNmZTkJLyogc3R3ICVhcmdYLC0xNiglcjMwKQkgICovCisjZGVmaW5lIExEV19NMTJSMzBfQVJHCQkweDRiYzAzZmU5CS8qIGxkdyAtMTIoJXIzMCksJWFyZ1gJICAqLworI2RlZmluZSBGU1RXX0ZBUkdfTTE2UjMwCTB4MjdjMTEyMDAJLyogZnN0d3MgJWZhcmdYLC0xNiglcjMwKSAqLworI2RlZmluZSBGTERXX00xNlIzMF9GQVJHCTB4MjdjMTEwMDAJLyogZmxkd3MgLTE2KCVyMzApLCVmYXJnWCAqLworI2RlZmluZSBGU1REX0ZBUkdfTTE2UjMwCTB4MmZjMTEyMDAJLyogZnN0ZHMgJWZhcmdYLC0xNiglcjMwKSAqLworI2RlZmluZSBGTEREX00xNlIzMF9GQVJHCTB4MmZjMTEwMDAJLyogZmxkZHMgLTE2KCVyMzApLCVmYXJnWCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2hwcGFic2QtY29yZS5jIGIvYmZkL2hwcGFic2QtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzIyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaHBwYWJzZC1jb3JlLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSFBQQSBCU0QgY29yZSBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKKyAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gCisKKyAgIFRoZSBjb3JlIGZpbGUgc3RydWN0dXJlIGZvciB0aGUgVXRhaCA0LjNCU0QgYW5kIE9TRjEgcG9ydHMgb24gdGhlCisgICBQQSBpcyBhIG1peCBiZXR3ZWVuIHRyYWRpdGlvbmFsIGNvcmVzIGFuZCBocHV4IGNvcmVzIC0tIGp1c3QKKyAgIGRpZmZlcmVudCBlbm91Z2ggdGhhdCBzdXBwb3J0aW5nIHRoaXMgZm9ybWF0IHdvdWxkIHRlbmQgdG8gYWRkCisgICBncm9zcyBoYWNrcyB0byB0cmFkLWNvcmUuYyBvciBocHV4LWNvcmUuYy4gIFNvIGluc3RlYWQgd2Uga2VlcCBhbnkKKyAgIGdyb3NzIGhhY2tzIGlzb2xhdGVkIHRvIHRoaXMgZmlsZS4gICovCisgICAKKworLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIEhQUEEtQlNEIHN0eWxlCisgICBjb3JlIGZpbGVzLgorCisgICBJIHdvdWxkIG5vdCBleHBlY3QgdGhpcyB0byBiZSBvZiB1c2UgdG8gYW55IG90aGVyIGhvc3QvdGFyZ2V0LCBidXQKKyAgIHlvdSBuZXZlciBrbm93LiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaWYgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKQorCisjaW5jbHVkZSAibWFjaGluZS92bXBhcmFtLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorCitzdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosCisJCQkJCSAgICBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwKKwkJCQkJICAgIGZpbGVfcHRyLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBhc3ltYm9sICpocHBhYnNkX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpocHBhYnNkX2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjaGFyICpocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBocHBhYnNkX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhLiAgKi8KKworc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QKKyAgeworICAgIGludCBzaWc7CisgICAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07CisgICAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKKyAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKKyAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247CisgIH07CisKKyNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLmhwcGFic2RfY29yZV9kYXRhKQorI2RlZmluZSBjb3JlX3NpZ25hbChiZmQpIChjb3JlX2hkcihiZmQpLT5zaWcpCisjZGVmaW5lIGNvcmVfY29tbWFuZChiZmQpIChjb3JlX2hkcihiZmQpLT5jbWQpCisjZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5kYXRhX3NlY3Rpb24pCisjZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+c3RhY2tfc2VjdGlvbikKKyNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnX3NlY3Rpb24pCisKK3N0YXRpYyBhc2VjdGlvbiAqCittYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgb2Zmc2V0LCBhbGlnbm1lbnRfcG93ZXIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Cit7CisgIGFzZWN0aW9uICphc2VjdDsKKworICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOworICBpZiAoIWFzZWN0KQorICAgIHJldHVybiBOVUxMOworCisgIGFzZWN0LT5mbGFncyA9IGZsYWdzOworICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOworICBhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKKyAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKKworICByZXR1cm4gYXNlY3Q7Cit9CisKK3N0YXRpYyBhc3ltYm9sICoKK2hwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKKyAgaWYgKG5ldykKKyAgICBuZXctPnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitocHBhYnNkX2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHZhbDsKKyAgc3RydWN0IHVzZXIgdTsKKyAgc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QgKmNvcmVkYXRhOworICBpbnQgY2xpY2tzejsKKworICAvKiBUcnkgdG8gcmVhZCBpbiB0aGUgdS1hcmVhLiAgV2Ugd2lsbCBuZWVkIGluZm9ybWF0aW9uIGZyb20gdGhpcworICAgICB0byBrbm93IGhvdyB0byBncm9rIHRoZSByZXN0IG9mIHRoZSBjb3JlIHN0cnVjdHVyZXMuICAqLworICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikgJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKKyAgaWYgKHZhbCAhPSBzaXplb2YgdSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBwYWdlIHNpemUgb3V0IG9mIHRoZSB1IHN0cnVjdHVyZS4gIFRoaXMgd2lsbCBiZSBkaWZmZXJlbnQKKyAgICAgZm9yIFBBIDEuMCBtYWNoaW5lcyBhbmQgUEEgMS4xIG1hY2hpbmVzLiAgIFl1ayEgICovCisgIGNsaWNrc3ogPSB1LnVfcGNiLnBjYl9wZ3N6OworCisgIC8qIGNsaWNrc3ogbXVzdCBiZSBhIHBvd2VyIG9mIHR3byA+PSAyay4gICovCisgIGlmIChjbGlja3N6IDwgMHg4MDAKKyAgICAgIHx8IGNsaWNrc3ogIT0gKGNsaWNrc3ogJiAtY2xpY2tzeikpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKworICAvKiBTYW5pdHkgY2hlY2tzLiAgTWFrZSBzdXJlIHRoZSBzaXplIG9mIHRoZSBjb3JlIGZpbGUgbWF0Y2hlcyB0aGUKKyAgICAgdGhlIHNpemUgY29tcHV0ZWQgZnJvbSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGNvcmUgaXRzZWxmLiAgKi8KKyAgeworICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMIHx8IGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCisgICAgICB7CisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICBpZiAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpID4gc3RhdGJ1Zi5zdF9zaXplKQorICAgICAgeworCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgaWYgKGNsaWNrc3ogKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKSA8IHN0YXRidWYuc3Rfc2l6ZSkKKyAgICAgIHsKKwkvKiBUaGUgZmlsZSBpcyB0b28gYmlnLiAgTWF5YmUgaXQncyBub3QgYSBjb3JlIGZpbGUKKwkgICBvciB3ZSBvdGhlcndpc2UgaGF2ZSBiYWQgdmFsdWVzIGZvciB1X2RzaXplIGFuZCB1X3NzaXplKS4gICovCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisgIH0KKworICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KKworICBjb3JlZGF0YSA9IChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqKQorICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGhwcGFic2RfY29yZV9zdHJ1Y3QpKTsKKyAgaWYgKCFjb3JlZGF0YSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBNYWtlIHRoZSBjb3JlIGRhdGEgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIHRkYXRhIHBhcnQgb2YgdGhlIEJGRC4gICovCisgIGFiZmQtPnRkYXRhLmhwcGFic2RfY29yZV9kYXRhID0gY29yZWRhdGE7CisKKyAgLyogQ3JlYXRlIHRoZSBzZWN0aW9ucy4gICovCisgIGNvcmVfc3RhY2tzZWMgKGFiZmQpID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuc3RhY2siLAorCQkJCQkgICBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTLAorCQkJCQkgICBjbGlja3N6ICogdS51X3NzaXplLAorCQkJCQkgICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSAKKwkJCQkJICAgICArIGNsaWNrc3ogKiB1LnVfZHNpemUsIDIpOworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gVVNSU1RBQ0s7IAorCisgIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKKwkJCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRAorCQkJCQkgICAgKyBTRUNfSEFTX0NPTlRFTlRTLAorCQkJCQkgIGNsaWNrc3ogKiB1LnVfZHNpemUsCisJCQkJCSAgTkJQRyAqIChVU0laRSArIEtTVEFLU0laRSksIDIpOworICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBVREFUQVNFRzsKKworICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAorCQkJCQkgU0VDX0hBU19DT05URU5UUywKKwkJCQkJIEtTVEFLU0laRSAqIE5CUEcsCisJCQkJCSBOQlBHICogVVNJWkUsIDIpOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDA7CisKKyAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgdS51X2NvbW0sIE1BWENPTUxFTiArIDEpOworICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB1LnVfY29kZTsKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKK3N0YXRpYyBjaGFyICoKK2hwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGludAoraHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGJvb2xlYW4KK2hwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKKyAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOworeworICAvKiBUaGVyZSdzIG5vIHdheSB0byBrbm93IHRoaXMuLi4gICovCisgIHJldHVybiB0cnVlOworfQorCisMCisjZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFwKKyAgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAorI2RlZmluZSBocHBhYnNkX2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCisjZGVmaW5lIGhwcGFic2RfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCisjZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCisjZGVmaW5lIGhwcGFic2RfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCisgIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KKyNkZWZpbmUgaHBwYWJzZF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIGhwcGFic2RfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIGhwcGFic2RfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgaHBwYWJzZF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCisKKy8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KK3N0YXRpYyB2b2lkCitzd2FwX2Fib3J0ICgpCit7CisgIC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cC4gICovCisgIGFib3J0ICgpOwkKK30KKworI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19TSUdORURfR0VUIFwKKyAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKworY29uc3QgYmZkX3RhcmdldCBocHBhYnNkX2NvcmVfdmVjID0KKyAgeworICAgICJocHBhYnNkLWNvcmUiLAorICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAorICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKyAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCisgICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLworICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLworICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLworCisgICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KKyAgICAgaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCisgICAgfSwKKyAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCisgICAgfSwKKyAgICAKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaHBwYWJzZF9jb3JlKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaHBwYWJzZF9jb3JlKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvaHB1eC1jb3JlLmMgYi9iZmQvaHB1eC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlNzA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ocHV4LWNvcmUuYwpAQCAtMCwwICsxLDQwNCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBIUC9VWCBjb3JlIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgorICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNVcHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFAvVVggc3R5bGUKKyAgIGNvcmUgZmlsZXMuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQMzAwSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCisKKy8qIEZJWE1FOiBzeXMvY29yZS5oIGRvZXNuJ3QgZXhpc3QgZm9yIEhQVVggdmVyc2lvbiA3LiAgSFBVWCB2ZXJzaW9uCisgICA1LCA2LCBhbmQgNyBjb3JlIGZpbGVzIHNlZW0gdG8gYmUgc3RhbmRhcmQgdHJhZC1jb3JlLmMgdHlwZSBjb3JlCisgICBmaWxlczsgY2FuIHdlIGp1c3QgdXNlIHRyYWQtY29yZS5jIGluIGFkZGl0aW9uIHRvIHRoaXMgZmlsZT8gICovCisKKyNpbmNsdWRlIDxzeXMvY29yZS5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKyNlbmRpZiAvKiBIT1NUX0hQUEFIUFVYICovCisKKyNpZmRlZiBIT1NUX0hQUEFCU0QKKworLyogTm90IGEgdmVyeSBzd2lmdCBwbGFjZSB0byBwdXQgaXQsIGJ1dCB0aGF0J3Mgd2hlcmUgdGhlIEJTRCBwb3J0CisgICBwdXRzIHRoZW0uICAqLworI2luY2x1ZGUgIi9ocHV4L3Vzci9pbmNsdWRlL3N5cy9jb3JlLmgiCisKKyNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIEhBVkVfRElSRU5UX0gKKyMgaW5jbHVkZSA8ZGlyZW50Lmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKKyMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CisjIGVuZGlmCisjIGlmZGVmIEhBVkVfU1lTX0RJUl9ICisjICBpbmNsdWRlIDxzeXMvZGlyLmg+CisjIGVuZGlmCisjIGlmZGVmIEhBVkVfTkRJUl9ICisjICBpbmNsdWRlIDxuZGlyLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLworI2luY2x1ZGUgPHN5cy9maWxlLmg+CisKKy8qIEtsdWRnZTogVGhlcmUncyBubyBleHBsaWNpdCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgc3lzL2NvcmUuaCB0bworICAgY29uZGl0aW9uYWxseSBrbm93IHdoZXRoZXIgYSBwcm9jX2luZm8gaGFzIHRocmVhZCBpZCBmaWVsZHMuCisgICBIb3dldmVyLCBDT1JFX0FOT05fU0hNRU0gc2hvd3MgdXAgZmlyc3QgYXQgMTAuMzAsIHdoaWNoIGlzCisgICBoYXBwaWx5IGFsc28gd2hlbiBtZWFuaW5nZnVsIHRocmVhZCBpZCdzIHNob3cgdXAgaW4gcHJvY19pbmZvLiAqLworI2lmIGRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQorI2RlZmluZSBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCAoMSkKKyNlbmRpZgorCisvKiBUaGlzIHR5cGUgYXBwZWFycyBhdCBIUC1VWCAxMC4zMC4gIERlZmluaW5nIGl0IGlmIG5vdCBkZWZpbmVkCisgICBieSBzeXMvY29yZS5oIGFsbG93cyB1cyB0byBidWlsZCBmb3Igb2xkZXIgSFAtVVgncywgYW5kIChzaW5jZQorICAgaXQgd29uJ3QgYmUgZW5jb3VudGVyZWQgaW4gY29yZS1kdW1wcyBmcm9tIG9sZGVyIEhQLVVYJ3MpIGlzCisgICBoYXJtbGVzcy4gKi8KKyNpZiAhZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCisjZGVmaW5lIENPUkVfQU5PTl9TSE1FTSAweDAwMDAwMjAwICAgICAgICAgLyogYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgKi8KKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLworCisvKiAubHdwaWQgYW5kIC51c2VyX3RpZCBhcmUgb25seSB2YWxpZCBpZiBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCwgZWxzZSB0aGV5CisgICBhcmUgc2V0IHRvIDAuICBBbHNvLCB1bnRpbCBIUC1VWCBpbXBsZW1lbnRzIE14TiB0aHJlYWRzLCAudXNlcl90aWQgYW5kCisgICAubHdwaWQgYXJlIHN5bm9ueW1vdXMuICovCitzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAKK3sKKyAgaW50IHNpZzsKKyAgaW50IGx3cGlkOyAgICAgICAgICAgICAgIC8qIEtlcm5lbCB0aHJlYWQgSUQuICovCisgIHVuc2lnbmVkIGxvbmcgdXNlcl90aWQ7ICAvKiBVc2VyIHRocmVhZCBJRC4gKi8KKyAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Cit9OworCisjZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHV4X2NvcmVfZGF0YSkKKyNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQorI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQorI2RlZmluZSBjb3JlX2tlcm5lbF90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+bHdwaWQpCisjZGVmaW5lIGNvcmVfdXNlcl90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+dXNlcl90aWQpCisKK3N0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgYXNlY3Rpb24gKgorbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgYWxpZ25tZW50X3Bvd2VyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIENPTlNUIGNoYXIgKm5hbWU7CisgICAgIGZsYWd3b3JkIGZsYWdzOworICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKKyAgICAgYmZkX3ZtYSB2bWE7CisgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Cit7CisgIGFzZWN0aW9uICphc2VjdDsKKyAgY2hhciAqbmV3bmFtZTsKKworICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7CisgIGlmICghbmV3bmFtZSkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOworCisgIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOworICBpZiAoIWFzZWN0KQorICAgIHJldHVybiBOVUxMOworCisgIGFzZWN0LT5mbGFncyA9IGZsYWdzOworICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOworICBhc2VjdC0+dm1hID0gdm1hOworICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKKyAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKKworICByZXR1cm4gYXNlY3Q7Cit9CisKK3N0YXRpYyBhc3ltYm9sICoKK2hwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKKyAgaWYgKG5ldykKKyAgICBuZXctPnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gbmV3OworfQorCisKKy8qIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgYmZkIHRhcmdldCBpZiB0aGUgZmlsZSBpcyBhIGNvcmVmaWxlLgorICAgSXQgcmV0dXJucyBudWxsIG9yIDAgaWYgaXQgZmluZHMgb3V0IHRoYWF0IGl0IGlzIG5vdCBhIGNvcmUgZmlsZS4KKyAgIFRoZSB3YXkgaXQgY2hlY2tzIHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxsb3dlZCAndHlwZScgZmllbGQgdmFsdWVzLgorICAgVGhlc2UgYXJlIGRlY2xhcmVkIGluIHN5cy9jb3JlLmgKKyAgIFRoZXJlIGFyZSBzb21lIHZhbHVlcyB3aGljaCBhcmUgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJy4gSW4gcGFydGljdWxhcgorICAgQ09SRV9OT05FIGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgMC4gVGhpcyBtYXkgYmUgYSBjYXRjaC1hbGwgZm9yIGNhc2VzCisgICBpbiB3aGljaCB0aGUgY29yZSBmaWxlIGlzIGdlbmVyYXRlZCBieSBzb21lIG5vbi1ocHV4IGFwcGxpY2F0aW9uLgorICAgKEkgYW0ganVzdCBndWVzc2luZyBoZXJlISkKKyovCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitocHV4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50ICBnb29kX3NlY3Rpb25zID0gMDsKKyAgaW50ICB1bmtub3duX3NlY3Rpb25zID0gMDsKKworICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKikKKyAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0KSk7CisgIGlmICghY29yZV9oZHIgKGFiZmQpKQorICAgIHJldHVybiBOVUxMOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCB2YWw7CisgICAgICBzdHJ1Y3QgY29yZWhlYWQgY29yZV9oZWFkZXI7CisKKyAgICAgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7CisgICAgICBpZiAodmFsIDw9IDApCisJYnJlYWs7CisgICAgICBzd2l0Y2ggKGNvcmVfaGVhZGVyLnR5cGUpCisJeworCWNhc2UgQ09SRV9LRVJORUw6CisJY2FzZSBDT1JFX0ZPUk1BVDoKKwkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsJLyogSnVzdCBza2lwIHRoaXMgKi8KKyAgICAgICAgICBnb29kX3NlY3Rpb25zKys7CisJICBicmVhazsKKwljYXNlIENPUkVfRVhFQzoKKwkgIHsKKwkgICAgc3RydWN0IHByb2NfZXhlYyBwcm9jX2V4ZWM7CisJICAgIGlmIChiZmRfcmVhZCAoKHZvaWQgKikgJnByb2NfZXhlYywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQorCQkhPSBjb3JlX2hlYWRlci5sZW4pCisJICAgICAgYnJlYWs7CisJICAgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHByb2NfZXhlYy5jbWQsIE1BWENPTUxFTiArIDEpOworICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBDT1JFX1BST0M6CisJICB7CisJICAgIHN0cnVjdCBwcm9jX2luZm8gcHJvY19pbmZvOworCSAgICBjaGFyICBzZWNuYW1lWzEwMF07ICAvKiBPZiBhcmJpdHJhcnkgc2l6ZSwgYnV0IHBsZW50eSBsYXJnZS4gKi8KKworICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZWFkIHRoaXMgc2VjdGlvbiwgJ2NhdXNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb3JlLWR1bXBlZCBhcHAgd2FzIHRocmVhZGVkIGJlZm9yZSB3ZSBjcmVhdGUKKyAgICAgICAgICAgICAgIGFueSAucmVnIHNlY3Rpb25zLiAqLworCSAgICBpZiAoYmZkX3JlYWQgKCZwcm9jX2luZm8sIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKKwkJIT0gY29yZV9oZWFkZXIubGVuKQorCSAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBjcmVhdGUgdGhvc2Ugc2VjdGlvbnMgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgZmlsZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkLCBpdCBzZWVtcy4gKi8KKyAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgLWNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCisgICAgICAgICAgICAgIGJyZWFrOworCisjaWYgZGVmaW5lZChQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCkKKyAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8ubHdwaWQ7CisgICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby51c2VyX3RpZDsKKyNlbHNlCisgICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gMDsKKyAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gMDsKKyNlbmRpZgorICAgICAgICAgICAgLyogSWYgdGhlIHByb2dyYW0gd2FzIHVudGhyZWFkZWQsIHRoZW4gd2UnbGwganVzdCBjcmVhdGUgYQorICAgICAgICAgICAgICAgLnJlZyBzZWN0aW9uLgorCisgICAgICAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSB3YXMgdGhyZWFkZWQsIHRoZW4gd2UnbGwgY3JlYXRlIC5yZWcvWFhYWFgKKyAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIGVhY2ggdGhyZWFkLCB3aGVyZSBYWFhYWCBpcyBhIHByaW50YWJsZQorICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlcm5lbCB0aHJlYWQgaWQuICBXZSdsbCBhbHNvCisgICAgICAgICAgICAgICBjcmVhdGUgYSAucmVnIHNlY3Rpb24gZm9yIHRoZSB0aHJlYWQgdGhhdCB3YXMgcnVubmluZworICAgICAgICAgICAgICAgYW5kIHNpZ25hbGxlZCBhdCB0aGUgdGltZSBvZiB0aGUgY29yZS1kdW1wIChpLmUuLCB0aGlzCisgICAgICAgICAgICAgICBpcyBlZmZlY3RpdmVseSBhbiBhbGlhcywgbmVlZGVkIHRvIGtlZXAgR0RCIGhhcHB5LikKKworICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFhYWCcgYXMgb3Bwb3NlZCB0byAnLnJlZ1hYWFhYJworICAgICAgICAgICAgICAgYmVjYXVzZSBHREIgZXhwZWN0cyB0aGF0IC5yZWcyIHdpbGwgYmUgdGhlIGZsb2F0aW5nLQorICAgICAgICAgICAgICAgcG9pbnQgcmVnaXN0ZXJzLiAqLworICAgICAgICAgICAgaWYgKGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPT0gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgdGhyZWFkcy4gIElzIHRoaXMgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUKKyAgICAgICAgICAgICAgICAgICBjb3JlLWR1bXA/ICBXZSdsbCBjbGFpbSBpdCB3YXMgdGhlIHJ1bm5pbmcgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIGlmIChwcm9jX2luZm8uc2lnICE9IC0xKQorICAgICAgICAgICAgICAgICAgeworCQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAorCQkJCQkgICAgU0VDX0hBU19DT05URU5UUywKKwkJCQkJICAgIGNvcmVfaGVhZGVyLmxlbiwKKwkJCQkJICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAorCQkJCQkgICAgMikpCisJCSAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBtYWtlIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgZm9yIGV2ZXJ5IHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkpOworICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCisgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgfQorCSAgICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBwcm9jX2luZm8uc2lnOworICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBDT1JFX0RBVEE6CisJY2FzZSBDT1JFX1NUQUNLOgorCWNhc2UgQ09SRV9URVhUOgorCWNhc2UgQ09SRV9NTUY6CisJY2FzZSBDT1JFX1NITToKKwljYXNlIENPUkVfQU5PTl9TSE1FTToKKwkgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCisJCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCisJCQkJICBjb3JlX2hlYWRlci5sZW4sIGNvcmVfaGVhZGVyLmFkZHIsIDIpKQorCSAgICByZXR1cm4gTlVMTDsKKworCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOworICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKKwkgIGJyZWFrOworCisJY2FzZSBDT1JFX05PTkU6CisgICAgICAgICAgLyogTGV0J3Mgbm90IHB1bnQgaWYgd2UgZW5jb3VudGVyIGEgc2VjdGlvbiBvZiB1bmtub3duCisgICAgICAgICAgICAgdHlwZS4gIFJhdGhlciwgbGV0J3MgbWFrZSBhIG5vdGUgb2YgaXQuICBJZiB3ZSBsYXRlcgorICAgICAgICAgICAgIHNlZSB0aGF0IHRoZXJlIHdlcmUgYWxzbyAiZ29vZCIgc2VjdGlvbnMsIHRoZW4gd2UnbGwKKyAgICAgICAgICAgICBkZWNsYXJlIHRoYXQgdGhpcyBhIGNvcmUgZmlsZSwgYnV0IHdlJ2xsIGFsc28gd2FybiB0aGF0CisgICAgICAgICAgICAgaXQgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZ2RiLgorICAgICAgICAgICAgICovCisJICB1bmtub3duX3NlY3Rpb25zKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgCisgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyp1bnJlY29nbml6ZWQgY29yZSBmaWxlIHR5cGUgKi8KKwl9CisgICAgfQorCisgIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLworCisgIC8qIFdlcmUgdGhlcmUgc2VjdGlvbnMgb2YgdW5rbm93biB0eXBlPyAgSWYgc28sIHlldCB0aGVyZSB3ZXJlCisgICAgIGF0IGxlYXN0IHNvbWUgY29tcGxldGUgc2VjdGlvbnMgb2Yga25vd24gdHlwZSwgdGhlbiwgaXNzdWUKKyAgICAgYSB3YXJuaW5nLiAgUG9zc2libHkgdGhlIGNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIG9uIGEgdmVyc2lvbgorICAgICBvZiBIUC1VWCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgZm9yIHdoaWNoIHRoaXMgZ2RiIHdhcworICAgICBidWlsdC4KKyAgICAgKi8KKyAgaWYgKCh1bmtub3duX3NlY3Rpb25zID4gMCkgJiYgKGdvb2Rfc2VjdGlvbnMgPiAwKSkKKyAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKyAgICAgICgiJXMgYXBwZWFycyB0byBiZSBhIGNvcmUgZmlsZSxcbmJ1dCBjb250YWlucyB1bmtub3duIHNlY3Rpb25zLiAgSXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIG9uIGFuIGluY29tcGF0aWJsZVxudmVyc2lvbiBvZiBIUC1VWC4gIEFzIGEgcmVzdWx0LCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSB1bmF2YWlsYWJsZS5cbiIsCisgICAgICAgYWJmZC0+ZmlsZW5hbWUpOworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitzdGF0aWMgY2hhciAqCitocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK2hwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBib29sZWFuCitocHV4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKK3sKKyAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLworfQorDAorI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCisjZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKKyNkZWZpbmUgaHB1eF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKKyNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KKyNkZWZpbmUgaHB1eF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKKyAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKKyNkZWZpbmUgaHB1eF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubworI2RlZmluZSBocHV4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKKyNkZWZpbmUgaHB1eF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKKyNkZWZpbmUgaHB1eF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBocHV4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKKworLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLworc3RhdGljIHZvaWQKK3N3YXBfYWJvcnQoKQoreworICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KK30KKyNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKyNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKyNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCisgICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCisKK2NvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYyA9CisgIHsKKyAgICAiaHB1eC1jb3JlIiwKKyAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLworICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KKyAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KKyAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KKworICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCisgICAgIGhwdXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLworICAgIH0sCisgICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKKyAgICB9LAorICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgCisgICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwdXhfY29yZSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwdXhfY29yZSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLworfTsKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YW91dC5jIGIvYmZkL2kzODZhb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiMmNmZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2YW91dC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgaTM4NiBhLm91dCBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBUaGUgb25seSAzODYgYW91dCBzeXN0ZW0gd2UgaGF2ZSBoZXJlIGlzIEdPMzIgZnJvbSBESi4gCisgICBUaGVzZSBudW1iZXJzIG1ha2UgQkZEIHdvcmsgd2l0aCB0aGF0LiBJZiB5b3VyIGFvdXQgMzg2IHN5c3RlbQorICAgZG9lc24ndCB3b3JrIHdpdGggdGhlc2UsIHdlJ2xsIGhhdmUgdG8gc3BsaXQgdGhlbSBpbnRvIGRpZmZlcmVudAorICAgZmlsZXMuICBTZW5kIG1lIChzYWNAY3lnbnVzLmNvbSkgdGhlIHJ1bmVzIHRvIG1ha2UgaXQgd29yayBvbiB5b3VyCisgICBzeXN0ZW0sIGFuZCBJJ2xsIHN0aWNrIGl0IGluIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgKi8KKworI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CisKKyNkZWZpbmUgTl9UWFRPRkYoeCkgMHgyMAorI2RlZmluZSBOX1RYVEFERFIoeCkgKE5fTUFHSUMoeCk9PVpNQUdJQyA/IDB4MTAyMCA6IDApCisKKyNkZWZpbmUgTl9UWFRTSVpFKHgpICgoeCkuYV90ZXh0KQorI2lmIDAKKyNkZWZpbmUgTl9EQVRBRERSKHgpIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkgOiAoU0VHTUVOVF9TSVpFICsgKCgweDEwMjArKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkpCisjZGVmaW5lIE5PU1VCRVhFQ0IKKworI2VuZGlmCisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgorI2RlZmluZSBTRUdNRU5UX1NJWkUgMHg0MDAwMDAKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKKworI2RlZmluZSBNWShPUCkgQ0FUKGkzODZhb3V0XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4NiIKKyNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAxCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIKKworLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2kzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisKKyAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOworCisgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOworCisgIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmFvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCisKK3N0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykoKTsKKyNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCitzdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7CisgIDAsCQkJCS8qIHptYWdpYyBjb250aWd1b3VzICovCisgIDEsCQkJCS8qIHRleHQgaW5jbCBoZWFkZXIgKi8KKyAgMCwJCQkJLyogZW50cnkgaXMgdGV4dCBhZGRyZXNzICovCisgIDAsCQkJCS8qIGV4ZWNfaGRyX2ZsYWdzICovCisgIDAsCQkJCS8qIHRleHQgdm1hPyAqLworICBNWShzZXRfc2l6ZXMpLAorICAxLAkJCQkvKiBleGVjIGhlYWRlciBub3QgY291bnRlZCAqLworICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCisgIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCisgIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KKyAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KKyAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLworICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KK307CisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZic2QuYyBiL2JmZC9pMzg2YnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyOGZlMwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2YnNkLmMKQEAgLTAsMCArMSw0NiBAQAorLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzIHVuZGVyIEJTRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGRhdGEgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBmb3JtYXQgdXNlZCB1bmRlciBhbGwgdGhlIHZhcmlvdXMKKyAgIEJTRCBwb3J0cyBmb3IgMzg2IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZQlCWVRFU19JTl9XT1JECTQKKworLyogWk1BR0lDIGZpbGVzIG5ldmVyIGhhdmUgdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gICovCisjZGVmaW5lCU5fSEVBREVSX0lOX1RFWFQoeCkJMAorCisvKiBaTUFHSUMgZmlsZXMgc3RhcnQgYXQgYWRkcmVzcyAwLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byBRTUFHSUMuICAqLworI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAorI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAorCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgorI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQorCisjZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2CisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKKworI2RlZmluZSBNWShPUCkgQ0FUKGkzODZic2RfLE9QKQorI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWJzZCIKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmR5bml4LmMgYi9iZmQvaTM4NmR5bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1MGExNAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2ZHluaXguYwpAQCAtMCwwICsxLDgwIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgZHluaXguCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBCRkQgaXMgY3VycmVudGx5IG9ubHkgdGVzdGVkIHdpdGggZ2RiLCB3cml0aW5nIG9iamVjdCBmaWxlcworICAgbWF5IG5vdCB3b3JrLiAgKi8KKworI2RlZmluZSBCWVRFU19JTl9XT1JECTQKKworI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgorI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTQwOTYKKyNkZWZpbmUgU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKKworI2luY2x1ZGUgImFvdXQvZHluaXgzLmgiCisKKyNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKKyNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQorCisjZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmR5bml4XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1keW5peCIKKyNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaTM4NmR5bml4LF8zMl8seSkKKyNkZWZpbmUgQVJDSF9TSVpFIDMyCisjZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGkzODZkeW5peF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKKyNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cworCisvKiBhb3V0eC5oIHJlcXVpcmVzIGRlZmluaXRpb25zIGZvciBOTUFHSUMsIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDAKKyNkZWZpbmUgQk1BR0lDIE9NQUdJQworI2RlZmluZSBRTUFHSUMgWE1BR0lDCisKKyNpbmNsdWRlICJhb3V0eC5oIgorCisvKiAoQWIpdXNlIHNvbWUgZmllbGRzIGluIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciB0byBiZSBhYmxlIHRvIHJlYWQKKyAgIGV4ZWN1dGFibGVzIHRoYXQgY29udGFpbiBzaGFyZWQgZGF0YS4gICovCisKKyNkZWZpbmUgYV9zaGRhdGEgYV90bG9hZAorI2RlZmluZSBhX3NoZHJzaXplIGFfZGxvYWQKKwordm9pZAoraTM4NmR5bml4XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKKyAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7CisKKyAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcworICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKKyAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cworICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCisgIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKKyAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KKyAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKKyAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOworICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7CisgIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOworICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7CisgIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7CisgIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOworICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKKyAgZXhlY3AtPmFfc2hkYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZGF0YSk7CisgIGV4ZWNwLT5hX3NoZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZHJzaXplKTsKK30KKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmZyZWVic2QuYyBiL2JmZC9pMzg2ZnJlZWJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjM3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaTM4NmZyZWVic2QuYwpAQCAtMCwwICsxLDMzIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIEZyZWVCU0QvMzg2IGEub3V0LWlzaCBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUJQllURVNfSU5fV09SRAk0CisjdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgorI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQorCisjZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2CisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4Nl9ORVRCU0QgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCisKKyNkZWZpbmUgTVkoT1ApIENBVChpMzg2ZnJlZWJzZF8sT1ApCisvKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLworI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWZyZWVic2QiCisKKyNpbmNsdWRlICJmcmVlYnNkLmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmxpbnV4LmMgYi9iZmQvaTM4NmxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0YmRjZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2bGludXguYwpAQCAtMCwwICsxLDc2NyBAQAorLyogQkZEIGJhY2stZW5kIGZvciBsaW51eCBmbGF2b3JlZCBpMzg2IGEub3V0IGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgorI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIDEwMjQKKyNkZWZpbmUJU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MAorI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAorI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKworI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODYgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisjaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2CisjZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmxpbnV4XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1saW51eCIKKworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKKworLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0CisgICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKKyAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KKworc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjaworICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOworc3RhdGljIGJvb2xlYW4gaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7CisKK3N0YXRpYyBib29sZWFuCitpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKKyAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Cit9CisKKyNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rCisKKy8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCisKK3N0YXRpYyBib29sZWFuCitpMzg2bGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKworICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7CisKKyAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisKKyAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMKKwwKKy8qIENvZGUgdG8gbGluayBhZ2FpbnN0IExpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICAqLworCisvKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCisKKyNpZm5kZWYgR09UX1JFRl9QUkVGSVgKKyNkZWZpbmUJR09UX1JFRl9QUkVGSVgJIl9fR09UXyIKKyNlbmRpZgorCisjZGVmaW5lIElTX0dPVF9TWU0obmFtZSkgXAorICAoc3RybmNtcCAobmFtZSwgR09UX1JFRl9QUkVGSVgsIHNpemVvZiBHT1RfUkVGX1BSRUZJWCAtIDEpID09IDApCisKKy8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisKKyNpZm5kZWYgUExUX1JFRl9QUkVGSVgKKyNkZWZpbmUJUExUX1JFRl9QUkVGSVgJIl9fUExUXyIKKyNlbmRpZgorCisjZGVmaW5lIElTX1BMVF9TWU0obmFtZSkgXAorICAoc3RybmNtcCAobmFtZSwgUExUX1JFRl9QUkVGSVgsIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpID09IDApCisKKy8qIFRoaXMgc3RyaW5nIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3BlY2lhbGl6ZWQgZXJyb3IgbWVzc2FnZXMuICAqLworCisjaWZuZGVmIE5FRURTX1NIUkxJQgorI2RlZmluZSBORUVEU19TSFJMSUIgIl9fTkVFRFNfU0hSTElCXyIKKyNlbmRpZgorCisvKiBUaGlzIHNwZWNpYWwgc3ltYm9sIGlzIGEgc2V0IHZlY3RvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZgorICAgcG9pbnRlcnMgdG8gZml4dXAgdGFibGVzLiAgSXQgd2lsbCBiZSBwcmVzZW50IGluIGFueSBkeW5hbWljbHkKKyAgIGxpbmtlZCBmaWxlLiAgVGhlIGxpbmtlciBnZW5lcmF0ZWQgZml4dXAgdGFibGUgc2hvdWxkIGFsc28gYmUgYWRkZWQKKyAgIHRvIHRoZSBsaXN0LCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNlY29uZCBzbG90ICh0aGUKKyAgIGZpcnN0IG9uZSBpcyBhIGR1bW15IHdpdGggYSBtYWdpYyBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGluCisgICBjcnQwLm8pLiAgKi8KKworI2lmbmRlZiBTSEFSQUJMRV9DT05GTElDVFMKKyNkZWZpbmUgU0hBUkFCTEVfQ09ORkxJQ1RTICJfX1NIQVJBQkxFX0NPTkZMSUNUU19fIgorI2VuZGlmCisKKy8qIFdlIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFRoZSB0ZXJtaW5vbG9neSBpcyBhIGJpdCBzdHJhbmdlLCBidXQKKyAgIGVhY2ggZml4dXAgY29udGFpbnMgdHdvIDMyIGJpdCBudW1iZXJzLiAgQSByZWd1bGFyIGZpeHVwIGNvbnRhaW5zCisgICBhbiBhZGRyZXNzIGFuZCBhIHBvaW50ZXIsIGFuZCBhdCBydW50aW1lIHdlIHNob3VsZCBzdG9yZSB0aGUKKyAgIGFkZHJlc3MgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXIuICBBIGJ1aWx0aW4gZml4dXAKKyAgIGNvbnRhaW5zIHR3byBwb2ludGVycywgYW5kIHdlIHNob3VsZCByZWFkIHRoZSBhZGRyZXNzIHVzaW5nIG9uZQorICAgcG9pbnRlciBhbmQgc3RvcmUgaXQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIG90aGVyCisgICBwb2ludGVyLiAgQnVpbHRpbiBmaXh1cHMgY29tZSBpbnRvIHBsYXkgd2hlbiB3ZSBoYXZlIGR1cGxpY2F0ZQorICAgX19HT1RfXyBzeW1ib2xzIGZvciB0aGUgc2FtZSB2YXJpYWJsZS4gIFRoZSBidWlsdGluIGZpeHVwIHdpbGwgY29weQorICAgdGhlIEdPVCBwb2ludGVyIGZyb20gb25lIG92ZXIgaW50byB0aGUgb3RoZXIuICAqLworCitzdHJ1Y3QgZml4dXAKK3sKKyAgc3RydWN0IGZpeHVwICpuZXh0OworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOworICBiZmRfdm1hIHZhbHVlOworCisgIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGp1bXAgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSBmaXhlZCwKKyAgICAgemVybyBpZiB0aGlzIGlzIGp1c3QgYSBwb2ludGVyICovCisgIGNoYXIganVtcDsKKworICBjaGFyIGJ1aWx0aW47Cit9OworCisvKiBXZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZSwgYnV0IHdlIGRvIG5lZWQKKyAgIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIGxpbmtlciBwYXNzZXMsIHNvIHdlIHVzZSBhIHNwZWNpYWwKKyAgIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OworfTsKKworc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZQoreworICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgcm9vdDsKKworICAvKiBGaXJzdCBkeW5hbWljIG9iamVjdCBmb3VuZCBpbiBsaW5rLiAgKi8KKyAgYmZkICpkeW5vYmo7CisKKyAgLyogTnVtYmVyIG9mIGZpeHVwcy4gICovCisgIHNpemVfdCBmaXh1cF9jb3VudDsKKworICAvKiBOdW1iZXIgb2YgYnVpbHRpbiBmaXh1cHMuICAqLworICBzaXplX3QgbG9jYWxfYnVpbHRpbnM7CisKKyAgLyogTGlzdCBvZiBmaXh1cHMuICAqLworICBzdHJ1Y3QgZml4dXAgKmZpeHVwX2xpc3Q7Cit9OworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpsaW51eF9saW5rX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgc3RydWN0IGZpeHVwICpuZXdfZml4dXAKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLAorCSAgIGJmZF92bWEsIGludCkpOworc3RhdGljIGJvb2xlYW4gbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4gbGludXhfYWRkX29uZV9zeW1ib2wKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCisJICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAorCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7CitzdGF0aWMgYm9vbGVhbiBsaW51eF90YWxseV9zeW1ib2xzCisgIFBBUkFNUyAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKy8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorbGludXhfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKKwkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCisJCQkJICAgICAgIHRhYmxlLCBzdHJpbmcpKTsKKyAgaWYgKHJldCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHM7IHRoZXJlIGFyZW4ndCBhbnkuICAqLworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIENyZWF0ZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikKKwkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCisJCQkJCSBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgZnJlZSAocmV0KTsKKyAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKKyAgICB9CisKKyAgcmV0LT5keW5vYmogPSBOVUxMOworICByZXQtPmZpeHVwX2NvdW50ID0gMDsKKyAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7CisgIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7CisKKyAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKK30KKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAorICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAorICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAorCQkJICAoZm9sbG93KSkpCisKKy8qIFRyYXZlcnNlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAorICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCisgICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIExpbnV4IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKKyAgIGp1c3QgYSBjYXN0LiAgKi8KKworI2RlZmluZSBsaW51eF9oYXNoX3RhYmxlKHApICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKKworLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBmaXh1cC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZml4dXAgKgorbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgYnVpbHRpbikKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGludCBidWlsdGluOworeworICBzdHJ1Y3QgZml4dXAgKmY7CisKKyAgZiA9IChzdHJ1Y3QgZml4dXAgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKKwkJCQkJICBzaXplb2YgKHN0cnVjdCBmaXh1cCkpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHJldHVybiBmOworICBmLT5uZXh0ID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7CisgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0ID0gZjsKKyAgZi0+aCA9IGg7CisgIGYtPnZhbHVlID0gdmFsdWU7CisgIGYtPmJ1aWx0aW4gPSBidWlsdGluOworICBmLT5qdW1wID0gMDsKKyAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7CisgIHJldHVybiBmOworfQorCisvKiBXZSBjb21lIGhlcmUgb25jZSB3ZSByZWFsaXplIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGxpbmsgdG8gYSBzaGFyZWQKKyAgIGxpYnJhcnkuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgc2VjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQorICAgZml4dXAgdGFibGUsIGFuZCB3ZSB1bHRpbWF0ZWx5IG5lZWQgdG8gYWRkIGEgcG9pbnRlciB0byB0aGlzIGludG8KKyAgIHRoZSBzZXQgdmVjdG9yIGZvciBTSEFSQUJMRV9DT05GTElDVFMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdAorICAga25vdyB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiwgYnV0IHRoYXQncyBPSyAtIHdlIGp1c3QgbmVlZCB0bworICAgY3JlYXRlIGl0IGZvciBub3cuICAqLworCitzdGF0aWMgYm9vbGVhbgorbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOworCisgIC8qIE5vdGUgdGhhdCB3ZSBzZXQgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZy4gICovCisgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKKworICAvKiBXZSBjaG9vc2UgdG8gdXNlIHRoZSBuYW1lICIubGludXgtZHluYW1pYyIgZm9yIHRoZSBmaXh1cCB0YWJsZS4KKyAgICAgV2h5IG5vdD8gKi8KKyAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIubGludXgtZHluYW1pYyIpOworICBpZiAocyA9PSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcy0+X3Jhd19zaXplID0gMDsKKyAgcy0+Y29udGVudHMgPSAwOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGdW5jdGlvbiB0byBhZGQgYSBzaW5nbGUgc3ltYm9sIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoaXMgaXMKKyAgIGEgd3JhcHBlciBhcm91bmQgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgd2hpY2ggaGFuZGxlcyB0aGUKKyAgIHR3ZWFraW5nIG5lZWRlZCBmb3IgZHluYW1pYyBsaW5raW5nIHN1cHBvcnQuICAqLworCitzdGF0aWMgYm9vbGVhbgorbGludXhfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwgc3RyaW5nLAorCQkgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGJvb2xlYW4gY29weTsKKyAgICAgYm9vbGVhbiBjb2xsZWN0OworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOworeworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOworICBib29sZWFuIGluc2VydDsKKworICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgorICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCisgICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgorCisgICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCisgICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCisgICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCisKKyAgaW5zZXJ0ID0gZmFsc2U7CisKKyAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKKyAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCisgICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKKyAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKKyAgICB7CisgICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKKyAgICAgIGluc2VydCA9IHRydWU7CisgICAgfQorCisgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCisgICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCisgICAgeworICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKKwkJCQkgIGZhbHNlLCBmYWxzZSk7CisgICAgICBpZiAoaCAhPSBOVUxMCisJICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwl7CisJICBzdHJ1Y3QgZml4dXAgKmY7CisKKwkgIGlmIChoYXNocCAhPSBOVUxMKQorCSAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKKworCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOworCSAgaWYgKGYgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOworCisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorCisgIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCisgIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKKwkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAorCQkJCQkgIGhhc2hwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogSW5zZXJ0IGEgcG9pbnRlciB0byBvdXIgdGFibGUgaW4gdGhlIHNldCB2ZWN0b3IuICBUaGUgZHluYW1pYworICAgICBsaW5rZXIgcmVxdWlyZXMgdGhpcyBpbmZvcm1hdGlvbiAqLworICBpZiAoaW5zZXJ0KQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzOworCisgICAgICAvKiBIZXJlIHdlIGRvIG91ciBzcGVjaWFsIHRoaW5nIHRvIGFkZCB0aGUgcG9pbnRlciB0byB0aGUKKwkgZHluYW1pYyBzZWN0aW9uIGluIHRoZSBTSEFSQUJMRV9DT05GTElDVFMgc2V0IHZlY3Rvci4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCisJCQkJICAgIi5saW51eC1keW5hbWljIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworCisgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkgICAgIChpbmZvLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLCBTSEFSQUJMRV9DT05GTElDVFMsCisJICAgICAgQlNGX0dMT0JBTCB8IEJTRl9DT05TVFJVQ1RPUiwgcywgMCwgTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2Ugd2lsbCBjcmF3bCB0aGUgaGFzaCB0YWJsZSBhbmQgY29tZSBoZXJlIGZvciBldmVyeSBnbG9iYWwgc3ltYm9sLgorICAgV2Ugd2lsbCBleGFtaW5lIGVhY2ggZW50cnkgYW5kIHNlZSBpZiB0aGVyZSBhcmUgaW5kaWNhdGlvbnMgdGhhdCB3ZQorICAgbmVlZCB0byBhZGQgYSBmaXh1cC4gIFRoZXJlIGFyZSB0d28gcG9zc2libGUgY2FzZXMgLSBvbmUgaXMgd2hlcmUKKyAgIHlvdSBoYXZlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvZiBQTFQgb3IgR09UIHN5bWJvbHMgLSB0aGVzZSB3aWxsCisgICBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQgYW5kIGFkZGVkIGFzICJidWlsdGluIiBmaXh1cHMuICBJZiB3ZSBmaW5kCisgICB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIG5vbiBQTFQvR09UIHN5bWJvbCBpcyBhbHNvIHByZXNlbnQsIHdlCisgICBjb252ZXJ0IGl0IHRvIGEgcmVndWxhciBmaXh1cCBpbnN0ZWFkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgbGludXhfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xpbnV4X3RhbGx5X3N5bWJvbHMgKGgsIGRhdGEpCisgICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOworICBzdHJ1Y3QgZml4dXAgKmYsICpmMTsKKyAgaW50IGlzX3BsdDsKKyAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDEsICpoMjsKKyAgYm9vbGVhbiBleGlzdHM7CisKKyAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisgICAgICAmJiBzdHJuY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIE5FRURTX1NIUkxJQiwKKwkJICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgY2hhciAqcDsKKyAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKKworICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOworICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7CisgICAgICBpZiAocCAhPSBOVUxMKQorCWFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOworCisgICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKKwkJCSAgICAgICBuYW1lKTsKKyAgICAgIGVsc2UKKwl7CisJICBzdHJjcHkgKGFsbG9jLCBuYW1lKTsKKwkgIHAgPSBzdHJyY2hyIChhbGxvYywgJ18nKTsKKwkgICpwKysgPSAnXDAnOworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMuc28uJXMnXG4iKSwKKwkgICAgIGFsbG9jLCBwKTsKKwkgIGZyZWUgKGFsbG9jKTsKKwl9CisKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgYSBQTFQvR09ULCB3ZSBkbyBub3QgZXZlbiBuZWVkIHRvIGxvb2sgYXQgaXQgKi8KKyAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKKworICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCisgICAgeworICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAorCSBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQorCSByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KKyAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZworCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAorCQkJCSAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KKyAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAorCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKKwkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKKwkJCQkgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKKwkgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCisJIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bworCSB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKKwkgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCisJIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KKyAgICAgIGlmIChoMSAhPSBOVUxMCisJICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCXx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQorCSAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKKwl7CisJICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50CisJICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKKwkgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cworCSAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KKwkgIGV4aXN0cyA9IGZhbHNlOworCSAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OworCSAgICAgICBmMSAhPSBOVUxMOworCSAgICAgICBmMSA9IGYxLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQorCQkgIHx8ICghIGYxLT5idWlsdGluICYmICEgZjEtPmp1bXApKQorCQljb250aW51ZTsKKwkgICAgICBpZiAoZjEtPmggPT0gaDEpCisJCWV4aXN0cyA9IHRydWU7CisJICAgICAgaWYgKCEgZXhpc3RzCisJCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCisJCXsKKwkJICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7CisJCSAgZi0+anVtcCA9IGlzX3BsdDsKKwkJfQorCSAgICAgIGYxLT5oID0gaDE7CisJICAgICAgZjEtPmp1bXAgPSBpc19wbHQ7CisJICAgICAgZjEtPmJ1aWx0aW4gPSAwOworCSAgICAgIGV4aXN0cyA9IHRydWU7CisJICAgIH0KKwkgIGlmICghIGV4aXN0cworCSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQorCSAgICB7CisJICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7CisJICAgICAgaWYgKGYgPT0gTlVMTCkKKwkJeworCQkgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGYtPmp1bXAgPSBpc19wbHQ7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKKwkgc3ltdGFiLiAqLworICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQorCWgtPnJvb3Qud3JpdHRlbiA9IHRydWU7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCisgICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KKyAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdworICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcworICAgYXJlIHJlcXVpcmVkLiAgKi8KKworYm9vbGVhbgorYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN0cnVjdCBmaXh1cCAqZjsKKyAgYXNlY3Rpb24gKnM7CisKKyAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCisgIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCisJCQkgICAgbGludXhfdGFsbHlfc3ltYm9scywKKwkJCSAgICAoUFRSKSBpbmZvKTsKKworICAvKiBJZiB0aGVyZSBhcmUgYnVpbHRpbiBmaXh1cHMsIGxlYXZlIHJvb20gZm9yIGEgbWFya2VyLiAgVGhpcyBpcworICAgICB1c2VkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciBzbyB0aGF0IGl0IGtub3dzIHRoYXQgYWxsIHRoYXQgZm9sbG93CisgICAgIGFyZSBidWlsdGluIGZpeHVwcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZml4dXBzLiAgKi8KKyAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCisgICAgeworICAgICAgaWYgKGYtPmJ1aWx0aW4pCisJeworCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQ7CisJICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGluczsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gMCkKKwlhYm9ydCAoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKKwkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKKyAgaWYgKHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKKyAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCisgICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQorICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLworCitzdGF0aWMgYm9vbGVhbgorbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYXNlY3Rpb24gKnMsICpvcywgKmlzOworICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7CisgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBmaXh1cCAqZjsKKyAgdW5zaWduZWQgaW50IG5ld19hZGRyOworICBpbnQgc2VjdGlvbl9vZmZzZXQ7CisgIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKKworICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKKwkJCSAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKKyAgZml4dXBzX3dyaXR0ZW4gPSAwOworCisjaWZkZWYgTElOVVhfTElOS19ERUJVRworICBwcmludGYgKCJGaXh1cCB0YWJsZSBmaWxlIG9mZnNldDogJXggIFZNQTogJXhcbiIsIAorCSAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAorCSAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOworI2VuZGlmCisKKyAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7CisgIGZpeHVwX3RhYmxlICs9IDQ7CisKKyAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCisgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChmLT5idWlsdGluKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCisJICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OworICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKKworI2lmZGVmIExJTlVYX0xJTktfREVCVUcKKyAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKKwkgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOworI2VuZGlmCisKKyAgICAgIGlmIChmLT5qdW1wKQorCXsKKwkgIC8qIFJlbGF0aXZlIGFkZHJlc3MgKi8KKwkgIG5ld19hZGRyID0gbmV3X2FkZHIgLSAoZi0+dmFsdWUgKyA1KTsgCisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMSwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKKwkgIGZpeHVwX3RhYmxlICs9IDQ7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwl9CisgICAgICArK2ZpeHVwc193cml0dGVuOworICAgIH0KKworICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCisgICAgeworICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKyAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7CisgICAgICBmaXh1cF90YWJsZSArPSA0OworICAgICAgKytmaXh1cHNfd3JpdHRlbjsKKyAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorCXsKKwkgIGlmICghIGYtPmJ1aWx0aW4pCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCisJCSBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247CisJICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7CisJICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OworCisjaWZkZWYgTElOVVhfTElOS19ERUJVRworCSAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAorCQkgIG5ld19hZGRyLCBmLT52YWx1ZSk7CisjZW5kaWYKKworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKKwkgIGZpeHVwX3RhYmxlICs9IDQ7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwkgICsrZml4dXBzX3dyaXR0ZW47CisJfQorICB9CisKKyAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7CisgICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCisJeworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKwkgIGZpeHVwX3RhYmxlICs9IDQ7CisJICArK2ZpeHVwc193cml0dGVuOworCX0KKyAgICB9CisKKyAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKKwkJCSAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAorCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisKKyAgaWYgKGggIT0gTlVMTAorICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKyAgICB7CisgICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OworICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKKworI2lmZGVmIExJTlVYX0xJTktfREVCVUcKKyAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKKyNlbmRpZgorCisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOworICAgIH0KKyAgZWxzZQorICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKworICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCisgICAgICAhPSBzLT5fcmF3X3NpemUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKKyNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCisKKyNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQorCisjaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bHlueC5jIGIvYmZkL2kzODZseW54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2bHlueC5jCkBAIC0wLDAgKzEsNTYyIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgTHlueE9TLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKKworI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAorI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKKworI2RlZmluZSBNWShPUCkgQ0FUKGkzODZseW54X2FvdXRfLE9QKQorI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWx5bngiCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2lmbmRlZiBXUklURV9IRUFERVJTCisjZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJICAgICAgXAorCWZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCSAgICAgIFwKKwlpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCSAgICAgIFwKKwkgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOyAgICAgXAorICAgIAkJCQkJCQkJCSAgICAgIFwKKwlleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICAgICBcCisJZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgICAgIFwKKyAgICAJCQkJCQkJCQkgICAgICBcCisJZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCisJCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAorCWV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAorCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKKwlOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgICAgIFwKKwlpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkgICAgICBcCisJICAgICE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICAgICBcCisJICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgICAgIFwKKwkvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgICAgXAorICAJCQkJCQkJCQkgICAgICBcCisJaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCisJICAgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICAgXAorCQkgICE9IDApCQkJCQkJCSAgICAgIFwKKwkgICAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJICAgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKKwkJICAhPSAwKQkJCQkJCQkgICAgICBcCisJICAgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCSAgICAgIGlmICghTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICBcCisJCXJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKKwkJICAhPSAwKQkJCQkJCQkgICAgICBcCisJICAgICAgICByZXR1cm4gMDsJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJICAgICAgaWYgKCFOQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgIFwKKwkJcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKKwkgICAgfQkJCQkJCQkJICAgICAgXAorICAgICAgfQorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKworI2lmZGVmIExZTlhfQ09SRQorCitjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7CitpbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Citib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOworY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKKworI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAorI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKKyNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKKworI2VuZGlmIC8qIExZTlhfQ09SRSAqLworDAorCisjZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCisKK2V4dGVybiByZWxvY19ob3d0b190eXBlIGFvdXRfMzJfZXh0X2hvd3RvX3RhYmxlW107CitleHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhb3V0XzMyX3N0ZF9ob3d0b190YWJsZVtdOworCisvKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLworLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLworCit2b2lkCitOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKmc7CisgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKK3sKKyAgaW50IHJfaW5kZXg7CisgIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOworICBpbnQgcl9leHRlcm47CisgIHVuc2lnbmVkIGludCByX2xlbmd0aDsKKyAgaW50IHJfcGNyZWw7CisgIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7CisgIHVuc2lnbmVkIGludCByX2FkZGVuZDsKKyAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKworICBQVVRfV09SRCAoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOworCisgIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemU7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KKyAgcl9wY3JlbCA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsJLyogUmVsYXRpdmUgdG8gUEM/ICovCisgIC8qIHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZT8/PyAgRklYTUUtc29vbiAqLworICByX2Jhc2VyZWwgPSAwOworICByX2ptcHRhYmxlID0gMDsKKyAgcl9yZWxhdGl2ZSA9IDA7CisKKyAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCisgIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCisKKyAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQorICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KKworICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0CisgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgorICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCisgICAgICovCisKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKKyAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCisgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKKyAgICB7CisgICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKKwl7CisJICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0CisJICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KKwkgIHJfaW5kZXggPSAwOworCSAgcl9leHRlcm4gPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGaWxsIGluIHN5bWJvbCAqLworCSAgcl9leHRlcm4gPSAxOworCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT5LRUVQSVQ7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLworICAgICAgcl9leHRlcm4gPSAwOworICAgICAgcl9pbmRleCA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgfQorCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgIHsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OworICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQorCShyX2V4dGVybiA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQorCXwgKHJfcGNyZWwgPyBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQorCXwgKHJfYmFzZXJlbCA/IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKKwl8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKKwl8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHIDogMCkKKwl8IChyX2xlbmd0aCA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OworICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OworICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKKyAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KKwkocl9leHRlcm4gPyBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKKwl8IChyX3BjcmVsID8gUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKKwl8IChyX2Jhc2VyZWwgPyBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCisJfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCisJfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSA6IDApCisJfCAocl9sZW5ndGggPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7CisgICAgfQorfQorCisKKy8qIEV4dGVuZGVkIHN0dWZmICovCisvKiBPdXRwdXQgZXh0ZW5kZWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICovCisKK3ZvaWQKK05BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqZzsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOworeworICBpbnQgcl9pbmRleDsKKyAgaW50IHJfZXh0ZXJuOworICB1bnNpZ25lZCBpbnQgcl90eXBlOworICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7CisgIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOworICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7CisKKyAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7CisKKyAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCisKKyAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQorICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KKworICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0CisgICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgorICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCisgICAgICovCisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCisgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQorICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCisgICAgeworICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCisJeworCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAorCSBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLworCSAgcl9pbmRleCA9IDA7CisJICByX2V4dGVybiA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJfZXh0ZXJuID0gMTsKKwkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+S0VFUElUOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworICAgIH0KKworCisgIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCisgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgIHsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7CisgICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OworICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQorCShyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQorCXwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7CisgICAgICBuYXRwdHItPnJfdHlwZVswXSA9CisJKHJfZXh0ZXJuID8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCisJfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKKyAgICB9CisKKyAgUFVUX1dPUkQgKGFiZmQsIHJfYWRkZW5kLCBuYXRwdHItPnJfYWRkZW5kKTsKK30KKworLyogQkZEIGRlYWxzIGludGVybmFsbHkgd2l0aCBhbGwgdGhpbmdzIGJhc2VkIGZyb20gdGhlIHNlY3Rpb24gdGhleSdyZQorICAgaW4uIHNvLCBzb21ldGhpbmcgaW4gMTAgYnl0ZXMgaW50byBhIHRleHQgc2VjdGlvbiAgd2l0aCBhIGJhc2Ugb2YKKyAgIDUwIHdvdWxkIGhhdmUgYSBzeW1ib2wgKC50ZXh0KzEwKSBhbmQga25vdyAudGV4dCB2bWEgd2FzIDUwLgorCisgICBBb3V0IGtlZXBzIGFsbCBpdCdzIHN5bWJvbHMgYmFzZWQgZnJvbSB6ZXJvLCBzbyB0aGUgc3ltYm9sIHdvdWxkCisgICBjb250YWluIDYwLiBUaGlzIG1hY3JvIHN1YnMgdGhlIGJhc2Ugb2YgZWFjaCBzZWN0aW9uIGZyb20gdGhlIHZhbHVlCisgICB0byBnaXZlIHRoZSB0cnVlIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uICovCisKKworI2RlZmluZSBNT1ZFX0FERFJFU1MoYWQpICAgICAgIAkJCQkJCVwKKyAgaWYgKHJfZXh0ZXJuKSB7CQkJCQkJCVwKKyAgIC8qIHVuZGVmaW5lZCBzeW1ib2wgKi8JCQkJCQlcCisgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgcl9pbmRleDsJCQlcCisgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAorICAgICB9IGVsc2UgewkJCQkJCQkJXAorICAgIC8qIGRlZmluZWQsIHNlY3Rpb24gcmVsYXRpdmUuIHJlcGxhY2Ugc3ltYm9sIHdpdGggcG9pbnRlciB0byAgICAJXAorICAgICAgIHN5bWJvbCB3aGljaCBwb2ludHMgdG8gc2VjdGlvbiAgKi8JCQkJXAorICAgIHN3aXRjaCAocl9pbmRleCkgewkJCQkJCQlcCisgICAgY2FzZSBOX1RFWFQ6CQkJCQkJCVwKKyAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgkJCQkJCVwKKyAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkICAtIHN1LT50ZXh0c2VjLT52bWE7CQkJXAorICAgICAgYnJlYWs7CQkJCQkJCQlcCisgICAgY2FzZSBOX0RBVEE6CQkJCQkJCVwKKyAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgkJCQkJCVwKKyAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2RhdGFzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCisgICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmRhdGFzZWMtPnZtYTsJCQlcCisgICAgICBicmVhazsJCQkJCQkJCVwKKyAgICBjYXNlIE5fQlNTOgkJCQkJCQkJXAorICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoJCQkJCQkJXAorICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAorICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5ic3NzZWMtPnZtYTsJCQkJXAorICAgICAgYnJlYWs7CQkJCQkJCQlcCisgICAgZGVmYXVsdDoJCQkJCQkJCVwKKyAgICBjYXNlIE5fQUJTOgkJCQkJCQkJXAorICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoJCQkJCQkJXAorICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CVwKKyAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAorICAgICAgYnJlYWs7CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgfSAgICAgCQkJCQkJCQlcCisKK3ZvaWQKK05BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmJ5dGVzOworICAgICBhcmVsZW50ICpjYWNoZV9wdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OworeworICBpbnQgcl9pbmRleDsKKyAgaW50IHJfZXh0ZXJuOworICB1bnNpZ25lZCBpbnQgcl90eXBlOworICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOworCisgIGNhY2hlX3B0ci0+YWRkcmVzcyA9IChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpKTsKKworICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07CisgIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOworICByX3R5cGUgPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKKyAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKKworICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9leHRfaG93dG9fdGFibGUgKyByX3R5cGU7CisgIE1PVkVfQUREUkVTUyAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRlbmQpKTsKK30KKwordm9pZAorTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7CisgICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Cit7CisgIGludCByX2luZGV4OworICBpbnQgcl9leHRlcm47CisgIHVuc2lnbmVkIGludCByX2xlbmd0aDsKKyAgaW50IHJfcGNyZWw7CisgIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7CisgIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7CisKKyAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKKworICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07CisgIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOworICByX3BjcmVsID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7CisgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7CisgIHJfam1wdGFibGUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKKyAgcl9yZWxhdGl2ZSA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOworICByX2xlbmd0aCA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCisgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKKworICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9zdGRfaG93dG9fdGFibGUgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOworICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KKworICBNT1ZFX0FERFJFU1MgKDApOworfQorCisvKiBSZWxvYyBoYWNrZXJ5ICovCisKK2Jvb2xlYW4KK05BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKKyAgUFRSIHJlbG9jczsKKyAgYXJlbGVudCAqcmVsb2NfY2FjaGU7CisgIHNpemVfdCBlYWNoX3NpemU7CisKKyAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKKyAgICB7CisgICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZTsKKyAgICAgIGdvdG8gZG9pdDsKKyAgICB9CisKKyAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKKyAgICB7CisgICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZTsKKyAgICAgIGdvdG8gZG9pdDsKKyAgICB9CisKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgcmV0dXJuIGZhbHNlOworCitkb2l0OgorICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7CisKKyAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOworCisKKyAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jIChjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOworICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOworCisgIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7CisgIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKKyAgICB7CisgICAgICBmcmVlIChyZWxvY19jYWNoZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOworICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3M7CisgICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7CisgICAgICBhcmVsZW50ICpjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKKworICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQorCXsKKwkgIE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKKwkJCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOworICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOworICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7CisKKyAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKKwl7CisJICBOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCisJCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKKwl9CisKKyAgICB9CisKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7CisgIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7CisgIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OworICByZXR1cm4gdHJ1ZTsKK30KKworCisKKy8qIFdyaXRlIG91dCBhIHJlbG9jYXRpb24gc2VjdGlvbiBpbnRvIGFuIG9iamVjdCBmaWxlLiAgKi8KKworYm9vbGVhbgorTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgc2VjdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgYXJlbGVudCAqKmdlbmVyaWM7CisgIHVuc2lnbmVkIGNoYXIgKm5hdGl2ZSwgKm5hdHB0cjsKKyAgc2l6ZV90IGVhY2hfc2l6ZTsKKworICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgc2l6ZV90IG5hdHNpemU7CisKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOworICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7CisgIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOworICBpZiAoIW5hdGl2ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOworCisgIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCisgICAgeworICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7CisJICAgY291bnQgIT0gMDsKKwkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCisJTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBuYXRwdHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOworCSAgIGNvdW50ICE9IDA7CisJICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQorCU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKKyAgICB9CisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLworbG9uZworTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOworICB1bnNpZ25lZCBpbnQgY291bnQ7CisKKyAgaWYgKCEodGJscHRyIHx8IE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQorICAgIHsKKyAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47CisgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKKwl7CisJICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKKwkgIGNoYWluID0gY2hhaW4tPm5leHQ7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247CisKKyAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQorCXsKKwkgICpyZWxwdHIrKyA9IHRibHB0cisrOworCX0KKyAgICB9CisgICpyZWxwdHIgPSAwOworCisgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKK30KKworI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1hY2gzLmMgYi9iZmQvaTM4Nm1hY2gzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmNzU4MgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2bWFjaDMuYwpAQCAtMCwwICsxLDY2IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgaXMgZm9yIE1hY2ggMywgd2hpY2ggdXNlcyBhLm91dCwgbm90IE1hY2gtTy4gICovCisKKy8qIFRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBvciBhbnl0aGluZyB3aGljaCBsZXRzIHVzIGRpc3Rpbmd1aXNoIHRoaXMgdGFyZ2V0CisgICBmcm9tIGkzODZhb3V0IG9yIGkzODZic2QuICBTbyB0aGlzIHRhcmdldCBpcyBvbmx5IHVzZWZ1bCBpZiBpdCBpcyB0aGUKKyAgIGRlZmF1bHQgdGFyZ2V0LiAgKi8KKworI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTEKKyNkZWZpbmUJU0VHTUVOVF9TSVpFCTB4MTAwMAorI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgxMDAwMAorI2RlZmluZSBBUkNIIDMyCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAorLyogVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gTl9NQUdJQyh4KSA9PSBaTUFHSUMuICAqLworI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpCTEKKworI2RlZmluZSBOX1RYVFNJWkUoeCkJKCh4KS5hX3RleHQpCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisjaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2CisjZGVmaW5lIE1ZKE9QKSBDQVQoaTM4Nm1hY2gzXyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbWFjaDMiCisKK3N0YXRpYyBib29sZWFuIE1ZKHNldF9zaXplcykoKTsKKyNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCitzdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIE1ZKGJhY2tlbmRfZGF0YSkgPSB7CisgIDAsCQkJCS8qIHptYWdpYyBjb250aWd1b3VzICovCisgIDEsCQkJCS8qIHRleHQgaW5jbCBoZWFkZXIgKi8KKyAgMCwJCQkJLyogZW50cnkgaXMgdGV4dCBhZGRyZXNzICovCisgIDAsCQkJCS8qIGV4ZWNfaGRyX2ZsYWdzICovCisgIDAsCQkJCS8qIHRleHQgdm1hPyAqLworICBNWShzZXRfc2l6ZXMpLAorICAxLAkJCQkvKiBleGVjIGhlYWRlciBub3QgY291bnRlZCAqLworICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCisgIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCisgIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KKyAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KKyAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLworICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KK307CisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZtc2Rvcy5jIGIvYmZkL2kzODZtc2Rvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjI0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaTM4Nm1zZG9zLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTVMtRE9TIGV4ZWN1dGFibGVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEJyeWFuIEZvcmQgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4KKworICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKKyAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIKKworI2lmIDAKK3N0cnVjdCBleGVfaGVhZGVyCit7CisJdW5zaWduZWQgc2hvcnQgbWFnaWM7CisJdW5zaWduZWQgc2hvcnQgYnl0ZXNfaW5fbGFzdF9wYWdlOworCXVuc2lnbmVkIHNob3J0IG5wYWdlczsJLyogbnVtYmVyIG9mIDUxMi1ieXRlICJwYWdlcyIgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovCisJdW5zaWduZWQgc2hvcnQgbnJlbG9jczsKKwl1bnNpZ25lZCBzaG9ydCBoZWFkZXJfcGFyYXM7CS8qIG51bWJlciBvZiAxNi1ieXRlIHBhcmFncmFwaHMgaW4gaGVhZGVyICovCisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ7CisJdW5zaWduZWQgc2hvcnQgbG9hZF9zd2l0Y2g7CisJdW5zaWduZWQgc2hvcnQgc3Nfb2ZzOworCXVuc2lnbmVkIHNob3J0IHNwOworCXVuc2lnbmVkIHNob3J0IGNoZWNrc3VtOworCXVuc2lnbmVkIHNob3J0IGlwOworCXVuc2lnbmVkIHNob3J0IGNzX29mczsKKwl1bnNpZ25lZCBzaG9ydCByZWxvY19vZnM7CisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQyOworCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzE7CisJdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMjsKKwl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmczOworfTsKKyNlbmRpZgorCisjZGVmaW5lIEVYRV9NQUdJQwkweDVhNGQKKyNkZWZpbmUgRVhFX0xPQURfSElHSAkweDAwMDAKKyNkZWZpbmUgRVhFX0xPQURfTE9XCTB4ZmZmZgorI2RlZmluZSBFWEVfUEFHRV9TSVpFCTUxMgorCisKK3N0YXRpYyBpbnQKK21zZG9zX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlYzsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sZWFuCittc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RhdGljIGNoYXIgaGRyW0VYRV9QQUdFX1NJWkVdOworICBmaWxlX3B0ciBvdXRmaWxlX3NpemUgPSBzaXplb2YoaGRyKTsKKyAgYmZkX3ZtYSBoaWdoX3ZtYSA9IDA7CisgIGFzZWN0aW9uICpzZWM7CisKKyAgLyogRmluZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcHJvZ3JhbSBvbiBkaXNrIGFuZCBpbiBtZW1vcnkuICAqLworICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpID09IDApCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19BTExPQykKKyAgICAgICAgeworCSAgYmZkX3ZtYSBzZWNfdm1hID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQorCSAgCQkgICAgKyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7CisJICBpZiAoc2VjX3ZtYSA+IGhpZ2hfdm1hKQorCSAgICBoaWdoX3ZtYSA9IHNlY192bWE7CisJfQorICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19MT0FEKQorICAgICAgICB7CisJICBmaWxlX3B0ciBzZWNfZW5kID0gc2l6ZW9mKGhkcikKKwkgIAkJICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKKwkJCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7CisJICBpZiAoc2VjX2VuZCA+IG91dGZpbGVfc2l6ZSkKKwkgICAgb3V0ZmlsZV9zaXplID0gc2VjX2VuZDsKKwl9CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSB0aGUgcHJvZ3JhbSBpc24ndCB0b28gYmlnLiAgKi8KKyAgaWYgKGhpZ2hfdm1hID4gKGJmZF92bWEpMHhmZmZmKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIGNvbnN0YW50cyAqLworICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX01BR0lDLCAmaGRyWzBdKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9QQUdFX1NJWkUgLyAxNiwgJmhkcls4XSk7CisgIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfTE9BRF9MT1csICZoZHJbMTJdKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4M2UsICZoZHJbMjRdKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4MDAwMSwgJmhkclsyOF0pOyAvKiBYWFg/Pz8gKi8KKyAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4MzBmYiwgJmhkclszMF0pOyAvKiBYWFg/Pz8gKi8KKyAgYmZkX2hfcHV0XzE2KGFiZmQsIDB4NzI2YSwgJmhkclszMl0pOyAvKiBYWFg/Pz8gKi8KKworICAvKiBieXRlcyBpbiBsYXN0IHBhZ2UgKDAgPSBmdWxsIHBhZ2UpICovCisgIGJmZF9oX3B1dF8xNihhYmZkLCBvdXRmaWxlX3NpemUgJiAoRVhFX1BBR0VfU0laRSAtIDEpLCAmaGRyWzJdKTsKKworICAvKiBudW1iZXIgb2YgcGFnZXMgKi8KKyAgYmZkX2hfcHV0XzE2KGFiZmQsIChvdXRmaWxlX3NpemUgKyBFWEVfUEFHRV9TSVpFIC0gMSkgLyBFWEVfUEFHRV9TSVpFLAorICAJICAgICAgICZoZHJbNF0pOworCisgIC8qIFNldCB0aGUgaW5pdGlhbCBzdGFjayBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJzcy4KKyAgICAgVGhlIHByb2dyYW0ncyBjcnQwIGNvZGUgbXVzdCByZWxvY2F0ZSBpdCB0byBhIHJlYWwgc3RhY2suICAqLworICBiZmRfaF9wdXRfMTYoYWJmZCwgaGlnaF92bWEsICZoZHJbMTZdKTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IGJmZF93cml0ZSAoaGRyLCAxLCBzaXplb2YoaGRyKSwgYWJmZCkgIT0gc2l6ZW9mKGhkcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgorbXNkb3Nfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc2VjdGlvbi0+ZmlsZXBvcyA9IEVYRV9QQUdFX1NJWkUgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKKworICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uKSAmIFNFQ19MT0FEKQorICAgIHsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSAhPSAwCisgICAgICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKworI2RlZmluZSBtc2Rvc19ta29iamVjdCBhb3V0XzMyX21rb2JqZWN0CisjZGVmaW5lIG1zZG9zX21ha2VfZW1wdHlfc3ltYm9sIGFvdXRfMzJfbWFrZV9lbXB0eV9zeW1ib2wKKyNkZWZpbmUgbXNkb3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFvdXRfMzJfcmVsb2NfdHlwZV9sb29rdXAKKworI2RlZmluZQltc2Rvc19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKKyNkZWZpbmUgbXNkb3NfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCisjZGVmaW5lIG1zZG9zX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKKyNkZWZpbmUgbXNkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIG1zZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCisgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKKyNkZWZpbmUgbXNkb3NfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBtc2Rvc19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisjZGVmaW5lIG1zZG9zX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucworI2RlZmluZSBtc2Rvc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBtc2Rvc19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBtc2Rvc19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluaworI2RlZmluZSBtc2Rvc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKyNkZWZpbmUgbXNkb3Nfc2V0X2FyY2hfbWFjaCBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaAorCisjZGVmaW5lIG1zZG9zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAorI2RlZmluZSBtc2Rvc19nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKKyNkZWZpbmUgbXNkb3NfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAorI2RlZmluZSBtc2Rvc19nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCisjZGVmaW5lIG1zZG9zX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIG1zZG9zX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubworI2RlZmluZSBtc2Rvc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBtc2Rvc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIG1zZG9zX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBtc2Rvc19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAorCisjZGVmaW5lIG1zZG9zX2Nhbm9uaWNhbGl6ZV9yZWxvYyBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYworI2RlZmluZSBtc2Rvc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgX2JmZF9ub3JlbG9jc19nZXRfcmVsb2NfdXBwZXJfYm91bmQKKyNkZWZpbmUgbXNkb3NfMzJfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorCitjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWMgPQoreworICAibXNkb3MiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLworICAoRVhFQ19QKSwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTCisgICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLworICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCisKKyAgeworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICB9LAorICB7CisgICAgYmZkX2ZhbHNlLAorICAgIG1zZG9zX21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCisgICAgYmZkX2ZhbHNlLAorICB9LAorICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgIGJmZF9mYWxzZSwKKyAgICBtc2Rvc193cml0ZV9vYmplY3RfY29udGVudHMsCisgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAorICAgIGJmZF9mYWxzZSwKKyAgfSwKKworICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChtc2RvcyksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChtc2RvcyksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobXNkb3MpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAobXNkb3MpLAorICBCRkRfSlVNUF9UQUJMRV9MSU5LIChtc2RvcyksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSAwCit9OworCisKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bmV0YnNkLmMgYi9iZmQvaTM4Nm5ldGJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2I2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaTM4Nm5ldGJzZC5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUJQllURVNfSU5fV09SRAk0CisjdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgorI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQorCisjZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2CisjZGVmaW5lCURFRkFVTFRfTUlEIAlNXzM4Nl9ORVRCU0QKKworI2RlZmluZSBNWShPUCkgQ0FUKGkzODZuZXRic2RfLE9QKQorLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1uZXRic2QiCisKKyNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2b3M5ay5jIGIvYmZkL2kzODZvczlrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwMWY1YgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9pMzg2b3M5ay5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIG9zOTAwMCBpMzg2IGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisjaW5jbHVkZSAib3M5ay5oIgorCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqb3M5a19jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOworCisvKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCisgICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLworYm9vbGVhbgorb3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCByYXdfYnl0ZXMsIGV4ZWNwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIG1oX2NvbSAqcmF3X2J5dGVzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Cit7CisgIG1oX2NvbSAqYnl0ZXMgPSAobWhfY29tICopIHJhd19ieXRlczsKKyAgdW5zaWduZWQgaW50IGRsb2FkLCBkbWVtc2l6ZSwgZG1lbXN0YXJ0OworCisgIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCisgIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5tX3N5bmMpOworICBleGVjcC0+YV9zeW1zID0gMDsKKyAgZXhlY3AtPmFfZW50cnkgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5tX2V4ZWMpOworICBleGVjcC0+YV90YWxpZ24gPSAyOworICBleGVjcC0+YV9kYWxpZ24gPSAyOworICBleGVjcC0+YV9iYWxpZ24gPSAyOworCisgIGRsb2FkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9pZGF0YSk7CisgIGV4ZWNwLT5hX2RhdGEgPSBkbG9hZCArIDg7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGRsb2FkLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgKGJmZF9yZWFkICgmZG1lbXN0YXJ0LCBzaXplb2YgKGRtZW1zdGFydCksIDEsIGFiZmQpCisJICAhPSBzaXplb2YgKGRtZW1zdGFydCkpCisgICAgICB8fCAoYmZkX3JlYWQgKCZkbWVtc2l6ZSwgc2l6ZW9mIChkbWVtc2l6ZSksIDEsIGFiZmQpCisJICAhPSBzaXplb2YgKGRtZW1zaXplKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGV4ZWNwLT5hX3Rsb2FkID0gMDsKKyAgZXhlY3AtPmFfZGxvYWQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZkbWVtc3RhcnQpOworICBleGVjcC0+YV90ZXh0ID0gZGxvYWQgLSBleGVjcC0+YV90bG9hZDsKKyAgZXhlY3AtPmFfZGF0YSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmRtZW1zaXplKTsKKyAgZXhlY3AtPmFfYnNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9kYXRhKSAtIGV4ZWNwLT5hX2RhdGE7CisKKyAgZXhlY3AtPmFfdHJzaXplID0gMDsKKyAgZXhlY3AtPmFfZHJzaXplID0gMDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIDAKKy8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUgaW50byB0aGUKKyAgIHN1cHBsaWVkIGJ1ZmZlciByZWFkeSBmb3Igd3JpdGluZyB0byBkaXNrLiAgKi8KKworUFJPVE8gKHZvaWQsIG9zOWtfc3dhcF9leGVjX2hlYWRlcl9vdXQsCisgICAgICAgICAoYmZkICogYWJmZCwKKwkgIHN0cnVjdCBpbnRlcm5hbF9leGVjICogZXhlY3AsCisJICBzdHJ1Y3QgbWhfY29tICogcmF3X2J5dGVzKSk7Cit2b2lkCitvczlrX3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKKyAgICAgbWhfY29tICpyYXdfYnl0ZXM7Cit7CisgIG1oX2NvbSAqYnl0ZXMgPSAobWhfY29tICopIHJhd19ieXRlczsKKworICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8sIGJ5dGVzLT5lX2luZm8pOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3RleHQsIGJ5dGVzLT5lX3RleHQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2RhdGEsIGJ5dGVzLT5lX2RhdGEpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2JzcywgYnl0ZXMtPmVfYnNzKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9zeW1zLCBieXRlcy0+ZV9zeW1zKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9lbnRyeSwgYnl0ZXMtPmVfZW50cnkpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kcnNpemUsIGJ5dGVzLT5lX2Ryc2l6ZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfdGxvYWQsIGJ5dGVzLT5lX3Rsb2FkKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kbG9hZCwgYnl0ZXMtPmVfZGxvYWQpOworICBieXRlcy0+ZV90YWxpZ25bMF0gPSBleGVjcC0+YV90YWxpZ247CisgIGJ5dGVzLT5lX2RhbGlnblswXSA9IGV4ZWNwLT5hX2RhbGlnbjsKKyAgYnl0ZXMtPmVfYmFsaWduWzBdID0gZXhlY3AtPmFfYmFsaWduOworICBieXRlcy0+ZV9yZWxheGFibGVbMF0gPSBleGVjcC0+YV9yZWxheGFibGU7Cit9CisKKyNlbmRpZgkvKiAwICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK29zOWtfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgYW5leGVjOworICBtaF9jb20gZXhlY19ieXRlczsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICYgZXhlY19ieXRlcywgTUhDT01fQllURVNfU0laRSwgMSwgYWJmZCkKKyAgICAgICE9IE1IQ09NX0JZVEVTX1NJWkUpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4ZWNfYnl0ZXMubV9zeW5jKTsKKyAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICghIG9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZhbmV4ZWMpKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgcmV0dXJuIGFvdXRfMzJfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCAmYW5leGVjLCBvczlrX2NhbGxiYWNrKTsKK30KKworCisvKiBGaW5pc2ggdXAgdGhlIG9wZW5pbmcgb2YgYSBiLm91dCBmaWxlIGZvciByZWFkaW5nLiAgRmlsbCBpbiBhbGwgdGhlCisgICBmaWVsZHMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgY29tbW9uIGNvZGUuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitvczlrX2NhbGxiYWNrIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKyAgdW5zaWduZWQgbG9uZyBic3Nfc3RhcnQ7CisKKyAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgKi8KKyAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2kzODYsIDApOworCisgIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KKyAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IDA7CisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSAwOworCisgIC8qIFRoZSBhbGlnbm1lbnRzIG9mIHRoZSBzZWN0aW9ucyAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX3RhbGlnbjsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9kYWxpZ247CisgIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV9iYWxpZ247CisKKyAgLyogVGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMuICAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSA9IGV4ZWNwLT5hX3Rsb2FkOworICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGV4ZWNwLT5hX2Rsb2FkOworCisgIC8qIEFuZCByZWxvYWQgdGhlIHNpemVzLCBzaW5jZSB0aGUgYW91dCBtb2R1bGUgemFwcyB0aGVtICovCisgIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfdGV4dDsKKworICBic3Nfc3RhcnQgPSBleGVjcC0+YV9kbG9hZCArIGV4ZWNwLT5hX2RhdGE7CS8qIEJTUyA9IGVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KKyAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSA9IGFsaWduX3Bvd2VyIChic3Nfc3RhcnQsIGV4ZWNwLT5hX2JhbGlnbik7CisKKyAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyAqLworICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBleGVjcC0+YV9lbnRyeTsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gZXhlY3AtPmFfZGxvYWQ7CisKKyAgLyogVGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKioqCisgIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX1RST0ZGKCpleGVjcCk7CisgIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSAgTl9EUk9GRigqZXhlY3ApOworICAqLworCisgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAxOwkvKiBOb3QgYXBwbGljYWJsZS4gKi8KKyAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDE7LyogTm90IGFwcGxpY2FibGUuICovCisgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBNSENPTV9CWVRFU19TSVpFOworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCisjaWYgMAorc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QKK3sKKyAgc3RydWN0IGFvdXRkYXRhIGE7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Cit9OworCitzdGF0aWMgYm9vbGVhbgorb3M5a19ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOworCisgIHJhd3B0ciA9IChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0KSk7CisgIGlmIChyYXdwdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYWJmZC0+dGRhdGEuYm91dF9kYXRhID0gcmF3cHRyOworICBleGVjX2hkciAoYWJmZCkgPSAmcmF3cHRyLT5lOworCisgIG9ial90ZXh0c2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBOVUxMOworICBvYmpfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK29zOWtfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIHN3YXBwZWRfaGRyOworCisgIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gQk1BR0lDOworCisgIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgPSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplOworICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChzdHJ1Y3Qgbmxpc3QpOworICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworICBleGVjX2hkciAoYWJmZCktPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCisJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoKKwkJCSAgICAgICBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pKTsKKworICBleGVjX2hkciAoYWJmZCktPmFfdGFsaWduID0gb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kYWxpZ24gPSBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlcjsKKyAgZXhlY19oZHIgKGFiZmQpLT5hX2JhbGlnbiA9IG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7CisKKyAgZXhlY19oZHIgKGFiZmQpLT5hX3Rsb2FkID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7CisgIGV4ZWNfaGRyIChhYmZkKS0+YV9kbG9hZCA9IG9ial9kYXRhc2VjIChhYmZkKS0+dm1hOworCisgIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgc3dhcHBlZF9oZHIsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKKwkgICE9IEVYRUNfQllURVNfU0laRSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLworICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fU1lNT0ZGICgqZXhlY19oZHIgKGFiZmQpKSksIFNFRUtfU0VUKQorCSAgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9UUk9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKKwkgICE9IDApCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9EUk9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKKwkgICE9IDApCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorDAorc3RhdGljIGJvb2xlYW4KK29zOWtfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgdW5zaWduZWQgY2hhciAqbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgaW50IGNvdW50OworeworCisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQorICAgIHsJCQkJLyogc2V0IGJ5IGJmZC5jIGhhbmRsZXIgKi8KKyAgICAgIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKKyAgICAgIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcworCSsgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7CisKKyAgICB9CisgIC8qIHJlZ2FyZGxlc3MsIG9uY2Ugd2Uga25vdyB3aGF0IHdlJ3JlIGRvaW5nLCB3ZSBtaWdodCBhcyB3ZWxsIGdldCBnb2luZyAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoY291bnQgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUikgbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgPyB0cnVlIDogZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgkvKiAwICovCisKK3N0YXRpYyBpbnQKK29zOWtfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGJvb2xlYW4gaWdub3JlOworeworICByZXR1cm4gc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXAgYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbworCisjZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorCisjZGVmaW5lIGFvdXRfMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisKKyNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKKyNkZWZpbmUgb3M5a19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIG9zOWtfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBvczlrX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucworI2RlZmluZSBvczlrX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIG9zOWtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKKyNkZWZpbmUgb3M5a19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluaworI2RlZmluZSBvczlrX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKworY29uc3QgYmZkX3RhcmdldCBpMzg2b3M5a192ZWMgPQoreworICAiaTM4Nm9zOWsiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhkciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgV1BfVEVYVCksCS8qIG9iamVjdCBmbGFncyAqLworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLworICAwLAkJCQkvKiBzeW1ib2wgbGVhZGluZyBjaGFyICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisKKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCisgIHtfYmZkX2R1bW15X3RhcmdldCwgb3M5a19vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisgIHtiZmRfZmFsc2UsIGJmZF9mYWxzZSwJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAorICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGFvdXRfMzIpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoYW91dF8zMiksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKG9zOWspLAorICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgMCwKK307CmRpZmYgLS1naXQgYS9iZmQvaWVlZS5jIGIvYmZkL2llZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZiMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL2llZWUuYwpAQCAtMCwwICsxLDM5NzAgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgaWVlZS02OTUgb2JqZWN0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgS0VFUE1JTlVTUENJTklOU1QgMAorCisvKiBJRUVFIDY5NSBmb3JtYXQgaXMgYSBzdHJlYW0gb2YgcmVjb3Jkcywgd2hpY2ggd2UgcGFyc2UgdXNpbmcgYSBzaW1wbGUgb25lLQorICAgdG9rZW4gKHdoaWNoIGlzIG9uZSBieXRlIGluIHRoaXMgbGV4aWNvbikgbG9va2FoZWFkIHJlY3Vyc2l2ZSBkZWNlbnQKKyAgIHBhcnNlci4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJpZWVlLmgiCisjaW5jbHVkZSAibGliaWVlZS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9ieXRlIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfMmJ5dGVzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50IFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2lkIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZXhwcmVzc2lvbgorICBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSwgYXN5bWJvbCAqLCBib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyB2b2lkIGllZWVfd3JpdGVfaW50NSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2ludDVfb3V0IFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gZG9fd2l0aF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyBib29sZWFuIGRvX2FzX3JlcGVhdCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gZG9fd2l0aG91dF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kYXRhX3BhcnQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfZGVidWdfcGFydCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9tZV9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX3Byb2Nlc3NvciBQQVJBTVMgKChiZmQgKikpOworCitzdGF0aWMgYm9vbGVhbiBpZWVlX3NsdXJwX2RlYnVnIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSBQQVJBTVMgKChiZmQgKikpOworCisvKiBGdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKKyAgIHN0YW5kYXJkIHJlcXVpcmVzLiAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV9ieXRlIChhYmZkLCBiYXJnKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBiYXJnOworeworICBiZmRfYnl0ZSBieXRlOworCisgIGJ5dGUgPSBiYXJnOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYnl0ZSwgMSwgMSwgYWJmZCkgIT0gMSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGJ5dGVzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBieXRlczsKK3sKKyAgYmZkX2J5dGUgYnVmZmVyWzJdOworCisgIGJ1ZmZlclswXSA9IGJ5dGVzID4+IDg7CisgIGJ1ZmZlclsxXSA9IGJ5dGVzICYgMHhmZjsKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCAyLCBhYmZkKSAhPSAyKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2ludCAoYWJmZCwgdmFsdWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgaWYgKHZhbHVlIDw9IDEyNykKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgdmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgICAgICAvKiBIb3cgbWFueSBzaWduaWZpY2FudCBieXRlcyA/ICovCisgICAgICAvKiBGSVhNRSBGT1IgTE9OR0VSIElOVFMgKi8KKyAgICAgIGlmICh2YWx1ZSAmIDB4ZmYwMDAwMDApCisJbGVuZ3RoID0gNDsKKyAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMGZmMDAwMCkKKwlsZW5ndGggPSAzOworICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwMDBmZjAwKQorCWxlbmd0aCA9IDI7CisgICAgICBlbHNlCisJbGVuZ3RoID0gMTsKKworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAorCQkJICAgICAoYmZkX2J5dGUpICgoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bQorCQkJCQkgKyBsZW5ndGgpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBzd2l0Y2ggKGxlbmd0aCkKKwl7CisJY2FzZSA0OgorCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAyNCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgMzoKKwkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gMTYpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlIDI6CisJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDgpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlIDE6CisJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV9pZCAoYWJmZCwgaWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqaWQ7Cit7CisgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4gKGlkKTsKKworICBpZiAobGVuZ3RoIDw9IDEyNykKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgbGVuZ3RoKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsZW5ndGggPCAyNTUpCisgICAgeworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgbGVuZ3RoKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsZW5ndGggPCA2NTUzNSkKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCAoaW50KSBsZW5ndGgpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiJXM6IHN0cmluZyB0b28gbG9uZyAoJWQgY2hhcnMsIG1heCA2NTUzNSkiKSwKKwkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxlbmd0aCk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBpZCwgMSwgbGVuZ3RoLCBhYmZkKSAhPSBsZW5ndGgpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0Z1bmN0aW9ucyBmb3IgcmVhZGluZyBmcm9tIGllZWUgZmlsZXMgaW4gdGhlIHN0cmFuZ2Ugd2F5IHRoYXQgdGhlCitzdGFuZGFyZCByZXF1aXJlczoKKyovCisKKyNkZWZpbmUgdGhpc19ieXRlKGllZWUpICooKGllZWUpLT5pbnB1dF9wKQorI2RlZmluZSBuZXh0X2J5dGUoaWVlZSkgKChpZWVlKS0+aW5wdXRfcCsrKQorI2RlZmluZSB0aGlzX2J5dGVfYW5kX25leHQoaWVlZSkgKCooKGllZWUpLT5pbnB1dF9wKyspKQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK3JlYWRfMmJ5dGVzIChpZWVlKQorICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Cit7CisgIHVuc2lnbmVkIGNoYXIgYzEgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOworICB1bnNpZ25lZCBjaGFyIGMyID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKKyAgcmV0dXJuIChjMSA8PCA4KSB8IGMyOworfQorCitzdGF0aWMgdm9pZAorYmZkX2dldF9zdHJpbmcgKGllZWUsIHN0cmluZywgbGVuZ3RoKQorICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7CisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgc2l6ZV90IGxlbmd0aDsKK3sKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICBzdHJpbmdbaV0gPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorcmVhZF9pZCAoaWVlZSkKKyAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOworeworICBzaXplX3QgbGVuZ3RoOworICBjaGFyICpzdHJpbmc7CisgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7CisgIGlmIChsZW5ndGggPD0gMHg3ZikKKyAgICB7CisgICAgICAvKiBTaW1wbGUgc3RyaW5nIG9mIGxlbmd0aCAwIHRvIDEyNyAqLworICAgIH0KKyAgZWxzZSBpZiAobGVuZ3RoID09IDB4ZGUpCisgICAgeworICAgICAgLyogTGVuZ3RoIGlzIG5leHQgYnl0ZSwgYWxsb3dpbmcgMC4uMjU1ICovCisgICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOworICAgIH0KKyAgZWxzZSBpZiAobGVuZ3RoID09IDB4ZGYpCisgICAgeworICAgICAgLyogTGVuZ3RoIGlzIG5leHQgdHdvIGJ5dGVzLCBhbGxvd2luZyAwLi42NTUzNSAqLworICAgICAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKKyAgICAgIGxlbmd0aCA9IChsZW5ndGggKiAyNTYpICsgdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKKyAgICB9CisgIC8qIEJ1eSBtZW1vcnkgYW5kIHJlYWQgc3RyaW5nICovCisgIHN0cmluZyA9IGJmZF9hbGxvYyAoaWVlZS0+YWJmZCwgbGVuZ3RoICsgMSk7CisgIGlmICghc3RyaW5nKQorICAgIHJldHVybiBOVUxMOworICBiZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpOworICBzdHJpbmdbbGVuZ3RoXSA9IDA7CisgIHJldHVybiBzdHJpbmc7Cit9CisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIHZhbHVlLCBzeW1ib2wsIHBjcmVsLCBpbmRleCkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGJvb2xlYW4gcGNyZWw7CisgICAgIHVuc2lnbmVkIGludCBpbmRleDsKK3sKKyAgdW5zaWduZWQgaW50IHRlcm1fY291bnQgPSAwOworCisgIGlmICh2YWx1ZSAhPSAwKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgdGVybV9jb3VudCsrOworICAgIH0KKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCisgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgeworICAgICAgLyogRGVmIG9mIGEgY29tbW9uIHN5bWJvbCAqLworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1hfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHRlcm1fY291bnQrKzsKKyAgICB9CisgIGVsc2UgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHsKKyAgICAgIC8qIFJlZiB0byBkZWZpbmVkIHN5bWJvbCAtICovCisKKyAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0dMT0JBTCkKKwl7CisJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfSV9lbnVtKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICB0ZXJtX2NvdW50Kys7CisJfQorICAgICAgZWxzZSBpZiAoc3ltYm9sLT5mbGFncyAmIChCU0ZfTE9DQUwgfCBCU0ZfU0VDVElPTl9TWU0pKQorCXsKKwkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIGxvY2FsIHN5bWJvbC4gIFdlIGNhbgorCSAgICAgZWFzaWx5IGRvIGEgbG9jYWwgYXMgYSBzZWN0aW9uK29mZnNldC4gICovCisJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUl9lbnVtKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAorCQkJCSAgICAoYmZkX2J5dGUpIChzeW1ib2wtPnNlY3Rpb24tPmluZGV4CisJCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICB0ZXJtX2NvdW50Kys7CisJICBpZiAoc3ltYm9sLT52YWx1ZSAhPSAwKQorCSAgICB7CisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHN5bWJvbC0+dmFsdWUpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgdGVybV9jb3VudCsrOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiJXM6IHVucmVjb2duaXplZCBzeW1ib2wgYCVzJyBmbGFncyAweCV4IiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltYm9sKSwKKwkgICAgIHN5bWJvbC0+ZmxhZ3MpOworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGlmIChwY3JlbCkKKyAgICB7CisgICAgICAvKiBzdWJ0cmFjdCB0aGUgcGMgZnJvbSBoZXJlIGJ5IGFza2luZyBmb3IgUEMgb2YgdGhpcyBzZWN0aW9uKi8KKyAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9QX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKKwkJCQkoYmZkX2J5dGUpIChpbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9taW51c19lbnVtKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIEhhbmRsZSB0aGUgZGVnZW5lcmF0ZSBjYXNlIG9mIGEgMCBhZGRyZXNzLiAgKi8KKyAgaWYgKHRlcm1fY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICB3aGlsZSAodGVybV9jb3VudCA+IDEpCisgICAgeworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgdGVybV9jb3VudC0tOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKK3dyaXRlcyBhbnkgaW50ZWdlciBpbnRvIHRoZSBidWZmZXIgc3VwcGxpZWQgYW5kIGFsd2F5cyB0YWtlcyA1IGJ5dGVzCisqLworc3RhdGljIHZvaWQKK2llZWVfd3JpdGVfaW50NSAoYnVmZmVyLCB2YWx1ZSkKKyAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgYnVmZmVyWzBdID0gKGJmZF9ieXRlKSBpZWVlX251bWJlcl9yZXBlYXRfNF9lbnVtOworICBidWZmZXJbMV0gPSAodmFsdWUgPj4gMjQpICYgMHhmZjsKKyAgYnVmZmVyWzJdID0gKHZhbHVlID4+IDE2KSAmIDB4ZmY7CisgIGJ1ZmZlclszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7CisgIGJ1ZmZlcls0XSA9ICh2YWx1ZSA+PiAwKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2ludDVfb3V0IChhYmZkLCB2YWx1ZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfdm1hIHZhbHVlOworeworICBiZmRfYnl0ZSBiWzVdOworCisgIGllZWVfd3JpdGVfaW50NSAoYiwgdmFsdWUpOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBiLCAxLCA1LCBhYmZkKSAhPSA1KQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9pbnQgKGllZWUsIHZhbHVlX3B0cikKKyAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOworICAgICBiZmRfdm1hICp2YWx1ZV9wdHI7Cit7CisgIGludCB2YWx1ZSA9IHRoaXNfYnl0ZSAoaWVlZSk7CisgIGludCByZXN1bHQ7CisgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEyNykKKyAgICB7CisgICAgICAqdmFsdWVfcHRyID0gdmFsdWU7CisgICAgICBuZXh0X2J5dGUgKGllZWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlIGlmICh2YWx1ZSA+PSAweDgwICYmIHZhbHVlIDw9IDB4ODgpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gdmFsdWUgJiAweGY7CisgICAgICByZXN1bHQgPSAwOworICAgICAgbmV4dF9ieXRlIChpZWVlKTsKKyAgICAgIHdoaWxlIChjb3VudCkKKwl7CisJICByZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKKwkgIGNvdW50LS07CisJfQorICAgICAgKnZhbHVlX3B0ciA9IHJlc3VsdDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CitwYXJzZV9pIChpZWVlLCBvaykKKyAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOworICAgICBib29sZWFuICpvazsKK3sKKyAgYmZkX3ZtYSB4OworICAqb2sgPSBwYXJzZV9pbnQgKGllZWUsICZ4KTsKKyAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBiZmRfdm1hCittdXN0X3BhcnNlX2ludCAoaWVlZSkKKyAgICAgY29tbW9uX2hlYWRlcl90eXBlICppZWVlOworeworICBiZmRfdm1hIHJlc3VsdDsKKyAgQkZEX0FTU0VSVCAocGFyc2VfaW50IChpZWVlLCAmcmVzdWx0KSA9PSB0cnVlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgYmZkX3ZtYSB2YWx1ZTsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sOworfSBpZWVlX3ZhbHVlX3R5cGU7CisKKworI2lmIEtFRVBNSU5VU1BDSU5JTlNUCisKKyNkZWZpbmUgU1JDX01BU0soYXJnKSBhcmcKKyNkZWZpbmUgUENSRUxfT0ZGU0VUIGZhbHNlCisKKyNlbHNlCisKKyNkZWZpbmUgU1JDX01BU0soYXJnKSAwCisjZGVmaW5lIFBDUkVMX09GRlNFVCB0cnVlCisKKyNlbmRpZgorCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnMzMl9ob3d0byA9CisgIEhPV1RPICgxLAorCSAwLAorCSAyLAorCSAzMiwKKwkgZmFsc2UsCisJIDAsCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAorCSAwLAorCSAiYWJzMzIiLAorCSB0cnVlLAorCSAweGZmZmZmZmZmLAorCSAweGZmZmZmZmZmLAorCSBmYWxzZSk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczE2X2hvd3RvID0KKyAgSE9XVE8gKDEsCisJIDAsCisJIDEsCisJIDE2LAorCSBmYWxzZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJIDAsCisJICJhYnMxNiIsCisJIHRydWUsCisJIDB4MDAwMGZmZmYsCisJIDB4MDAwMGZmZmYsCisJIGZhbHNlKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzOF9ob3d0byA9CisgIEhPV1RPICgxLAorCSAwLAorCSAwLAorCSA4LAorCSBmYWxzZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCisJIDAsCisJICJhYnM4IiwKKwkgdHJ1ZSwKKwkgMHgwMDAwMDBmZiwKKwkgMHgwMDAwMDBmZiwKKwkgZmFsc2UpOworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWwzMl9ob3d0byA9CisgIEhPV1RPICgxLAorCSAwLAorCSAyLAorCSAzMiwKKwkgdHJ1ZSwKKwkgMCwKKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAorCSAwLAorCSAicmVsMzIiLAorCSB0cnVlLAorCSBTUkNfTUFTSyAoMHhmZmZmZmZmZiksCisJIDB4ZmZmZmZmZmYsCisJIFBDUkVMX09GRlNFVCk7CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDE2X2hvd3RvID0KKyAgSE9XVE8gKDEsCisJIDAsCisJIDEsCisJIDE2LAorCSB0cnVlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCisJIDAsCisJICJyZWwxNiIsCisJIHRydWUsCisJIFNSQ19NQVNLICgweDAwMDBmZmZmKSwKKwkgMHgwMDAwZmZmZiwKKwkgUENSRUxfT0ZGU0VUKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsOF9ob3d0byA9CisgIEhPV1RPICgxLAorCSAwLAorCSAwLAorCSA4LAorCSB0cnVlLAorCSAwLAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCisJIDAsCisJICJyZWw4IiwKKwkgdHJ1ZSwKKwkgU1JDX01BU0sgKDB4MDAwMDAwZmYpLAorCSAweDAwMDAwMGZmLAorCSBQQ1JFTF9PRkZTRVQpOworCitzdGF0aWMgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBOT1NZTUJPTCA9IHswLCAwfTsKKworc3RhdGljIHZvaWQKK3BhcnNlX2V4cHJlc3Npb24gKGllZWUsIHZhbHVlLCBzeW1ib2wsIHBjcmVsLCBleHRyYSwgc2VjdGlvbikKKyAgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7CisgICAgIGJmZF92bWEgKnZhbHVlOworICAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlICpzeW1ib2w7CisgICAgIGJvb2xlYW4gKnBjcmVsOworICAgICB1bnNpZ25lZCBpbnQgKmV4dHJhOworICAgICBhc2VjdGlvbiAqKnNlY3Rpb247CisKK3sKKyNkZWZpbmUgUE9TIHNwWzFdCisjZGVmaW5lIFRPUyBzcFswXQorI2RlZmluZSBOT1Mgc3BbLTFdCisjZGVmaW5lIElOQyBzcCsrOworI2RlZmluZSBERUMgc3AtLTsKKworICBib29sZWFuIGxvb3AgPSB0cnVlOworICBpZWVlX3ZhbHVlX3R5cGUgc3RhY2tbMTBdOworCisgIC8qIFRoZSBzdGFjayBwb2ludGVyIGFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgdW51c2VkIGxvY2F0aW9uICovCisjZGVmaW5lIFBVU0goeCx5LHopIFRPUy5zeW1ib2w9eDtUT1Muc2VjdGlvbj15O1RPUy52YWx1ZT16O0lOQzsKKyNkZWZpbmUgUE9QKHgseSx6KSBERUM7eD1UT1Muc3ltYm9sO3k9VE9TLnNlY3Rpb247ej1UT1MudmFsdWU7CisgIGllZWVfdmFsdWVfdHlwZSAqc3AgPSBzdGFjazsKKworICB3aGlsZSAobG9vcCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCisJeworCWNhc2UgaWVlZV92YXJpYWJsZV9QX2VudW06CisJICAvKiBQIHZhcmlhYmxlLCBjdXJyZW50IHByb2dyYW0gY291bnRlciBmb3Igc2VjdGlvbiBuICovCisJICB7CisJICAgIGludCBzZWN0aW9uX247CisJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJICAgICpwY3JlbCA9IHRydWU7CisJICAgIHNlY3Rpb25fbiA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkgICAgUFVTSCAoTk9TWU1CT0wsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIDApOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIGllZWVfdmFyaWFibGVfTF9lbnVtOgorCSAgLyogTCB2YXJpYWJsZSAgYWRkcmVzcyBvZiBzZWN0aW9uIE4gKi8KKwkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJICBQVVNIIChOT1NZTUJPTCwgaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldLCAwKTsKKwkgIGJyZWFrOworCWNhc2UgaWVlZV92YXJpYWJsZV9SX2VudW06CisJICAvKiBSIHZhcmlhYmxlLCBsb2dpY2FsIGFkZHJlc3Mgb2Ygc2VjdGlvbiBtb2R1bGUgKi8KKwkgIC8qIEZJWE1FLCB0aGlzIHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gTCAqLworCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOworCSAgYnJlYWs7CisJY2FzZSBpZWVlX3ZhcmlhYmxlX1NfZW51bToKKwkgIC8qIFMgdmFyaWFibGUsIHNpemUgaW4gTUFVUyBvZiBzZWN0aW9uIG1vZHVsZSAqLworCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkgIFBVU0ggKE5PU1lNQk9MLAorCQkwLAorCQlpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0tPl9yYXdfc2l6ZSk7CisJICBicmVhazsKKwljYXNlIGllZWVfdmFyaWFibGVfSV9lbnVtOgorCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiB2YXJpYWJsZSBuICovCisJICB7CisJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7CisJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJICAgIHN5LmluZGV4ID0gKGludCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCSAgICBzeS5sZXR0ZXIgPSAnSSc7CisKKwkgICAgUFVTSCAoc3ksIGJmZF9hYnNfc2VjdGlvbl9wdHIsIDApOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBpZWVlX3ZhcmlhYmxlX1hfZW51bToKKwkgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgZXh0ZXJuYWwgdmFyaWFibGUgbiAqLworCSAgeworCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5OworCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCSAgICBzeS5pbmRleCA9IChpbnQpIChtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSkpOworCSAgICBzeS5sZXR0ZXIgPSAnWCc7CisKKwkgICAgUFVTSCAoc3ksIGJmZF91bmRfc2VjdGlvbl9wdHIsIDApOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW06CisJICB7CisJICAgIGJmZF92bWEgdmFsdWUxLCB2YWx1ZTI7CisJICAgIGFzZWN0aW9uICpzZWN0aW9uMSwgKnNlY3Rpb25fZHVtbXk7CisJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7CisJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisKKwkgICAgUE9QIChzeSwgc2VjdGlvbjEsIHZhbHVlMSk7CisJICAgIFBPUCAoc3ksIHNlY3Rpb25fZHVtbXksIHZhbHVlMik7CisJICAgIFBVU0ggKHN5LCBzZWN0aW9uMSA/IHNlY3Rpb24xIDogc2VjdGlvbl9kdW1teSwgdmFsdWUyIC0gdmFsdWUxKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgaWVlZV9mdW5jdGlvbl9wbHVzX2VudW06CisJICB7CisJICAgIGJmZF92bWEgdmFsdWUxLCB2YWx1ZTI7CisJICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKKwkgICAgYXNlY3Rpb24gKnNlY3Rpb24yOworCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MTsKKwkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTI7CisJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisKKwkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCB2YWx1ZTEpOworCSAgICBQT1AgKHN5Miwgc2VjdGlvbjIsIHZhbHVlMik7CisJICAgIFBVU0ggKHN5MS5sZXR0ZXIgPyBzeTEgOiBzeTIsCisJCSAgYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uMSkgPyBzZWN0aW9uMiA6IHNlY3Rpb24xLAorCQkgIHZhbHVlMSArIHZhbHVlMik7CisJICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgeworCSAgICBiZmRfdm1hIHZhOworCSAgICBCRkRfQVNTRVJUICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpIDwgKGludCkgaWVlZV92YXJpYWJsZV9BX2VudW0KKwkJICAgIHx8IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPiAoaW50KSBpZWVlX3ZhcmlhYmxlX1pfZW51bSk7CisJICAgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YSkpCisJICAgICAgeworCQlQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgdmEpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLyoKKwkJICBUaGF0cyBhbGwgdGhhdCB3ZSBjYW4gdW5kZXJzdGFuZC4gQXMgZmFyIGFzIEkgY2FuIHNlZQorCQkgIHRoZXJlIGlzIGEgYnVnIGluIHRoZSBNaWNyb3RlYyBJRUVFIG91dHB1dCB3aGljaCBJJ20KKwkJICB1c2luZyB0byBzY2FuLCB3aGVyZWJ5IHRoZSBjb21tYSBvcGVyYXRvciBpcyBvbWl0dGVkCisJCSAgc29tZXRpbWVzIGluIGFuIGV4cHJlc3Npb24sIGdpdmluZyBleHByZXNzaW9ucyB3aXRoIHRvbworCQkgIG1hbnkgdGVybXMuIFdlIGNhbiB0ZWxsIGlmIHRoYXQncyB0aGUgY2FzZSBieSBlbnN1cmluZworCQkgIHRoYXQgc3AgPT0gc3RhY2sgaGVyZS4gSWYgbm90LCB0aGVuIHdlJ3ZlIHB1c2hlZAorCQkgIHNvbWV0aGluZyB0b28gZmFyLCBzbyB3ZSBrZWVwIGFkZGluZy4gICovCisKKwkJd2hpbGUgKHNwICE9IHN0YWNrICsgMSkKKwkJICB7CisJCSAgICBhc2VjdGlvbiAqc2VjdGlvbjE7CisJCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MTsKKwkJICAgIFBPUCAoc3kxLCBzZWN0aW9uMSwgKmV4dHJhKTsKKwkJICB9CisJCXsKKwkJICBhc2VjdGlvbiAqZHVtbXk7CisKKwkJICBQT1AgKCpzeW1ib2wsIGR1bW15LCAqdmFsdWUpOworCQkgIGlmIChzZWN0aW9uKQorCQkgICAgKnNlY3Rpb24gPSBkdW1teTsKKwkJfQorCisJCWxvb3AgPSBmYWxzZTsKKwkgICAgICB9CisJICB9CisJfQorICAgIH0KK30KKworCisjZGVmaW5lIGllZWVfc2VlayhhYmZkLCBvZmZzZXQpIFwKKyAgSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgPSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSArIG9mZnNldAorCisjZGVmaW5lIGllZWVfcG9zKGFiZmQpIFwKKyAgKElFRUVfREFUQShhYmZkKS0+aC5pbnB1dF9wIC0gSUVFRV9EQVRBKGFiZmQpLT5oLmZpcnN0X2J5dGUpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9pbmRleDsKK3N0YXRpYyBjaGFyIGxhc3RfdHlwZTsJCS8qIGlzIHRoZSBpbmRleCBmb3IgYW4gWCBvciBhIEQgKi8KKworc3RhdGljIGllZWVfc3ltYm9sX3R5cGUgKgorZ2V0X3N5bWJvbCAoYWJmZCwKKwkgICAgaWVlZSwKKwkgICAgbGFzdF9zeW1ib2wsCisJICAgIHN5bWJvbF9jb3VudCwKKwkgICAgcHB0ciwKKwkgICAgbWF4X2luZGV4LAorCSAgICB0aGlzX3R5cGUKKykKKyAgICAgYmZkICphYmZkOworICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKKyAgICAgaWVlZV9zeW1ib2xfdHlwZSAqbGFzdF9zeW1ib2w7CisgICAgIHVuc2lnbmVkIGludCAqc3ltYm9sX2NvdW50OworICAgICBpZWVlX3N5bWJvbF90eXBlICoqKnBwdHI7CisgICAgIHVuc2lnbmVkIGludCAqbWF4X2luZGV4OworICAgICBjaGFyIHRoaXNfdHlwZQorICAgICAgOworeworICAvKiBOZWVkIGEgbmV3IHN5bWJvbCAqLworICB1bnNpZ25lZCBpbnQgbmV3X2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworICBpZiAobmV3X2luZGV4ICE9IGxhc3RfaW5kZXggfHwgdGhpc190eXBlICE9IGxhc3RfdHlwZSkKKyAgICB7CisgICAgICBpZWVlX3N5bWJvbF90eXBlICpuZXdfc3ltYm9sID0gKGllZWVfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsCisJCQkJCQkgc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlKSk7CisgICAgICBpZiAoIW5ld19zeW1ib2wpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIG5ld19zeW1ib2wtPmluZGV4ID0gbmV3X2luZGV4OworICAgICAgbGFzdF9pbmRleCA9IG5ld19pbmRleDsKKyAgICAgICgqc3ltYm9sX2NvdW50KSsrOworICAgICAgKipwcHRyID0gbmV3X3N5bWJvbDsKKyAgICAgICpwcHRyID0gJm5ld19zeW1ib2wtPm5leHQ7CisgICAgICBpZiAobmV3X2luZGV4ID4gKm1heF9pbmRleCkKKwl7CisJICAqbWF4X2luZGV4ID0gbmV3X2luZGV4OworCX0KKyAgICAgIGxhc3RfdHlwZSA9IHRoaXNfdHlwZTsKKyAgICAgIG5ld19zeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgICAgIHJldHVybiBuZXdfc3ltYm9sOworICAgIH0KKyAgcmV0dXJuIGxhc3Rfc3ltYm9sOworfQorCitzdGF0aWMgYm9vbGVhbgoraWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKKyAgZmlsZV9wdHIgb2Zmc2V0ID0gaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQ7CisKKyAgaWVlZV9zeW1ib2xfdHlwZSAqKnByZXZfc3ltYm9sc19wdHIgPSAmaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sczsKKyAgaWVlZV9zeW1ib2xfdHlwZSAqKnByZXZfcmVmZXJlbmNlX3B0ciA9ICZpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2U7CisgIGllZWVfc3ltYm9sX3R5cGUgKnN5bWJvbCA9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQgPSAwOworICBib29sZWFuIGxvb3AgPSB0cnVlOworICBsYXN0X2luZGV4ID0gMHhmZmZmZmY7CisgIGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID0gdHJ1ZTsKKworICBpZWVlX3NlZWsgKGFiZmQsIG9mZnNldCk7CisKKyAgd2hpbGUgKGxvb3ApCisgICAgeworICAgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQorCXsKKwljYXNlIGllZWVfbm5fcmVjb3JkOgorCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKworCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAorCQkJICAgICAgICZwcmV2X3N5bWJvbHNfcHRyLAorCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4LCAnSScpOworCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOworCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7CisJICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKKwkgIGJyZWFrOworCWNhc2UgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bToKKwkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisKKwkgIHN5bWJvbCA9IGdldF9zeW1ib2wgKGFiZmQsIGllZWUsIHN5bWJvbCwgJnN5bWJvbF9jb3VudCwKKwkJCSAgICAgICAmcHJldl9zeW1ib2xzX3B0ciwKKwkJCSAgICAgICAmaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCwgJ0QnKTsKKwkgIGlmIChzeW1ib2wgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBCRkRfQVNTRVJUIChzeW1ib2wtPmluZGV4ID49IGllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXgpOworCisJICBzeW1ib2wtPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKwkgIHN5bWJvbC0+c3ltYm9sLm5hbWUgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKKwkgIHN5bWJvbC0+c3ltYm9sLnVkYXRhLnAgPSAoUFRSKSBOVUxMOworCSAgc3ltYm9sLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7CisJICBicmVhazsKKwljYXNlIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtID4+IDg6CisJICB7CisJICAgIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9pbmRleDsKKwkgICAgdW5zaWduZWQgaW50IHN5bWJvbF90eXBlX2luZGV4OworCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2F0dHJpYnV0ZV9kZWY7CisJICAgIGJmZF92bWEgdmFsdWU7CisJICAgIHN3aXRjaCAocmVhZF8yYnl0ZXMgKGllZWUpKQorCSAgICAgIHsKKwkgICAgICBjYXNlIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtOgorCQlzeW1ib2xfbmFtZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkJc3ltYm9sX3R5cGVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCXN5bWJvbF9hdHRyaWJ1dGVfZGVmID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCQlzd2l0Y2ggKHN5bWJvbF9hdHRyaWJ1dGVfZGVmKQorCQkgIHsKKwkJICBjYXNlIDg6CisJCSAgY2FzZSAxOToKKwkJICAgIHBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7CisJCSAgICBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAgIChfKCIlczogdW5pbXBsZW1lbnRlZCBBVEkgcmVjb3JkICAldSBmb3Igc3ltYm9sICV1IiksCisJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3ltYm9sX2F0dHJpYnV0ZV9kZWYsCisJCSAgICAgICBzeW1ib2xfbmFtZV9pbmRleCk7CisJCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkJYnJlYWs7CisJICAgICAgY2FzZSBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX3JlY29yZF9lbnVtOgorCQkvKiBTa2lwIG92ZXIgQVRYIHJlY29yZC4gKi8KKwkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOworCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7CisJCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKKwkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOworCQlicmVhazsKKwkgICAgICBjYXNlIGllZWVfYXRuX3JlY29yZF9lbnVtOgorCQkvKiBXZSBtYXkgZ2V0IGNhbGwgb3B0aW1pemF0aW9uIGluZm9ybWF0aW9uIGhlcmUsCisJCSAgIHdoaWNoIHdlIGp1c3QgaWdub3JlLiAgVGhlIGZvcm1hdCBpcworCQkgICB7JEYxfSR7Q0V9e2luZGV4fXskMDB9eyQzRn17JDNGfXsjX29mX0FTTnN9ICovCisJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7CisJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7CisJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7CisJCWlmICh2YWx1ZSAhPSAweDNmKQorCQkgIHsKKwkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgICAgICAoXygiJXM6IHVuZXhwZWN0ZWQgQVROIHR5cGUgJWQgaW4gZXh0ZXJuYWwgcGFydCIpLAorCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAoaW50KSB2YWx1ZSk7CisJCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICB9CisJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7CisJCXBhcnNlX2ludCAoJmllZWUtPmgsICZ2YWx1ZSk7CisJCXdoaWxlICh2YWx1ZSA+IDApCisJCSAgeworCQkgICAgYmZkX3ZtYSB2YWwxOworCisJCSAgICAtLXZhbHVlOworCisJCSAgICBzd2l0Y2ggKHJlYWRfMmJ5dGVzIChpZWVlKSkKKwkJICAgICAgeworCQkgICAgICBjYXNlIGllZWVfYXNuX3JlY29yZF9lbnVtOgorCQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbDEpOworCQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbDEpOworCQkJYnJlYWs7CisKKwkJICAgICAgZGVmYXVsdDoKKwkJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkJICAoXygiJXM6IHVuZXhwZWN0ZWQgdHlwZSBhZnRlciBBVE4iKSwKKwkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtID4+IDg6CisJICB7CisJICAgIHVuc2lnbmVkIGludCBzeW1ib2xfbmFtZV9pbmRleDsKKwkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2xfaWdub3JlOworCSAgICBib29sZWFuIHBjcmVsX2lnbm9yZTsKKwkgICAgdW5zaWduZWQgaW50IGV4dHJhOworCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCisJICAgIHN5bWJvbF9uYW1lX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCSAgICBwYXJzZV9leHByZXNzaW9uIChpZWVlLAorCQkJICAgICAgJnN5bWJvbC0+c3ltYm9sLnZhbHVlLAorCQkJICAgICAgJnN5bWJvbF9pZ25vcmUsCisJCQkgICAgICAmcGNyZWxfaWdub3JlLAorCQkJICAgICAgJmV4dHJhLAorCQkJICAgICAgJnN5bWJvbC0+c3ltYm9sLnNlY3Rpb24pOworCisJICAgIC8qIEZ1bGx5IGxpbmtlZCBJRUVFLTY5NSBmaWxlcyB0ZW5kIHRvIGdpdmUgZXZlcnkgc3ltYm9sCisgICAgICAgICAgICAgICBhbiBhYnNvbHV0ZSB2YWx1ZS4gIFRyeSB0byBjb252ZXJ0IHRoYXQgYmFjayBpbnRvIGEKKyAgICAgICAgICAgICAgIHNlY3Rpb24gcmVsYXRpdmUgdmFsdWUuICBGSVhNRTogVGhpcyB3b24ndCBhbHdheXMgdG8KKyAgICAgICAgICAgICAgIHRoZSByaWdodCB0aGluZy4gICovCisJICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24pCisJCSYmIChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykgPT0gMCkKKwkgICAgICB7CisJCWJmZF92bWEgdmFsOworCQlhc2VjdGlvbiAqczsKKworCQl2YWwgPSBzeW1ib2wtPnN5bWJvbC52YWx1ZTsKKwkJZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJCSAgeworCQkgICAgaWYgKHZhbCA+PSBzLT52bWEgJiYgdmFsIDwgcy0+dm1hICsgcy0+X3Jhd19zaXplKQorCQkgICAgICB7CisJCQlzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gczsKKwkJCXN5bWJvbC0+c3ltYm9sLnZhbHVlIC09IHMtPnZtYTsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKworCSAgICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOworCisJICB9CisJICBicmVhazsKKwljYXNlIGllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bToKKwkgIHsKKwkgICAgYmZkX3ZtYSBzaXplOworCSAgICBiZmRfdm1hIHZhbHVlOworCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCSAgICAvKiBUaHJvdyBhd2F5IHRoZSBleHRlcm5hbCByZWZlcmVuY2UgaW5kZXggKi8KKwkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkgICAgLyogRmV0Y2ggdGhlIGRlZmF1bHQgc2l6ZSBpZiBub3QgcmVzb2x2ZWQgKi8KKwkgICAgc2l6ZSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkgICAgLyogRmV0Y2ggdGhlIGRlZmF1dGx0IHZhbHVlIGlmIGF2YWlsYWJsZSAqLworCSAgICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpID09IGZhbHNlKQorCSAgICAgIHsKKwkJdmFsdWUgPSAwOworCSAgICAgIH0KKwkgICAgLyogVGhpcyB0dXJucyBpbnRvIGEgY29tbW9uICovCisJICAgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCSAgICBzeW1ib2wtPnN5bWJvbC52YWx1ZSA9IHNpemU7CisJICB9CisJICBicmVhazsKKworCWNhc2UgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bToKKwkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisKKwkgIHN5bWJvbCA9IGdldF9zeW1ib2wgKGFiZmQsIGllZWUsIHN5bWJvbCwgJnN5bWJvbF9jb3VudCwKKwkJCSAgICAgICAmcHJldl9yZWZlcmVuY2VfcHRyLAorCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWF4X2luZGV4LCAnWCcpOworCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOworCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7CisJICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgIHN5bWJvbC0+c3ltYm9sLnZhbHVlID0gKGJmZF92bWEpIDA7CisJICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IDA7CisKKwkgIEJGRF9BU1NFUlQgKHN5bWJvbC0+aW5kZXggPj0gaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBsb29wID0gZmFsc2U7CisJfQorICAgIH0KKworICBpZiAoaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCAhPSAwKQorICAgIHsKKyAgICAgIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudCA9CisJaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCAtCisJaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCArIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50ID0gMDsKKyAgICB9CisKKyAgaWYgKGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggIT0gMCkKKyAgICB7CisgICAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfY291bnQgPQorCWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggLQorCWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggKyAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCA9IDA7CisgICAgfQorCisgIGFiZmQtPnN5bWNvdW50ID0KKyAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfY291bnQgKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQ7CisKKyAgaWYgKHN5bWJvbF9jb3VudCAhPSBhYmZkLT5zeW1jb3VudCkKKyAgICB7CisgICAgICAvKiBUaGVyZSBhcmUgZ2FwcyBpbiB0aGUgdGFibGUgLS0gKi8KKyAgICAgIGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID0gZmFsc2U7CisgICAgfQorCisgICpwcmV2X3N5bWJvbHNfcHRyID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKKyAgKnByZXZfcmVmZXJlbmNlX3B0ciA9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoSUVFRV9EQVRBIChhYmZkKS0+cmVhZF9zeW1ib2xzID09IGZhbHNlKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgSUVFRV9EQVRBIChhYmZkKS0+cmVhZF9zeW1ib2xzID0gdHJ1ZTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCitsb25nCitpZWVlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICE9IDApID8KKyAgICAoYWJmZC0+c3ltY291bnQgKyAxKSAqIChzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUgKikpIDogMDsKK30KKworLyoKK01vdmUgZnJvbSBvdXIgaW50ZXJuYWwgbGlzdHMgdG8gdGhlIGNhbm9uIHRhYmxlLCBhbmQgaW5zZXJ0IGluCitzeW1ib2wgaW5kZXggb3JkZXIKKyovCisKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjOworCitsb25nCitpZWVlX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKK3sKKyAgaWVlZV9zeW1ib2xfdHlwZSAqc3ltcDsKKyAgc3RhdGljIGJmZCBkdW1teV9iZmQ7CisgIHN0YXRpYyBhc3ltYm9sIGVtcHR5X3N5bWJvbCA9CisgIC8qIHRoZV9iZmQsIG5hbWUsIHZhbHVlLCBhdHRyLCBzZWN0aW9uICovCisgIHsmZHVtbXlfYmZkLCAiIGllZWUgZW1wdHkiLCAoc3ltdmFsdWUpIDAsIEJTRl9ERUJVR0dJTkcsIGJmZF9hYnNfc2VjdGlvbl9wdHJ9OworCisgIGlmIChhYmZkLT5zeW1jb3VudCkKKyAgICB7CisgICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7CisgICAgICBkdW1teV9iZmQueHZlYyA9ICZpZWVlX3ZlYzsKKyAgICAgIGlmICghIGllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIGlmIChpZWVlLT5zeW1ib2xfdGFibGVfZnVsbCA9PSBmYWxzZSkKKwl7CisJICAvKiBBcnJnaCAtIHRoZXJlIGFyZSBnYXBzIGluIHRoZSB0YWJsZSwgcnVuIHRocm91Z2ggYW5kIGZpbGwgdGhlbSAqLworCSAgLyogdXAgd2l0aCBwb2ludGVycyB0byBhIG51bGwgcGxhY2UgKi8KKwkgIHVuc2lnbmVkIGludCBpOworCSAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnN5bWNvdW50OyBpKyspCisJICAgIHsKKwkgICAgICBsb2NhdGlvbltpXSA9ICZlbXB0eV9zeW1ib2w7CisJICAgIH0KKwl9CisKKyAgICAgIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldCA9IC1pZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4OworICAgICAgZm9yIChzeW1wID0gSUVFRV9EQVRBIChhYmZkKS0+ZXh0ZXJuYWxfc3ltYm9sczsKKwkgICBzeW1wICE9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7CisJICAgc3ltcCA9IHN5bXAtPm5leHQpCisJeworCSAgLyogUGxhY2UgaW50byB0YWJsZSBhdCBjb3JyZWN0IGluZGV4IGxvY2F0aW9ucyAqLworCSAgbG9jYXRpb25bc3ltcC0+aW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXRdID0gJnN5bXAtPnN5bWJvbDsKKwl9CisKKyAgICAgIC8qIFRoZSBleHRlcm5hbCByZWZzIGFyZSBpbmRleGVkIGluIGEgYml0ICovCisgICAgICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXQgPQorCS1pZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50OworCisgICAgICBmb3IgKHN5bXAgPSBJRUVFX0RBVEEgKGFiZmQpLT5leHRlcm5hbF9yZWZlcmVuY2U7CisJICAgc3ltcCAhPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOworCSAgIHN5bXAgPSBzeW1wLT5uZXh0KQorCXsKKwkgIGxvY2F0aW9uW3N5bXAtPmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0XSA9CisJICAgICZzeW1wLT5zeW1ib2w7CisKKwl9CisgICAgfQorICBpZiAoYWJmZC0+c3ltY291bnQpCisgICAgeworICAgICAgbG9jYXRpb25bYWJmZC0+c3ltY291bnRdID0gKGFzeW1ib2wgKikgTlVMTDsKKyAgICB9CisgIHJldHVybiBhYmZkLT5zeW1jb3VudDsKK30KKworc3RhdGljIGFzZWN0aW9uICoKK2dldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBpbmRleCkKKyAgICAgYmZkICphYmZkOworICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKKyAgICAgdW5zaWduZWQgaW50IGluZGV4OworeworICBpZiAoaW5kZXggPj0gaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBjLCBpOworICAgICAgYXNlY3Rpb24gKipuOworCisgICAgICBjID0gaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplOworICAgICAgaWYgKGMgPT0gMCkKKwljID0gMjA7CisgICAgICB3aGlsZSAoYyA8PSBpbmRleCkKKwljICo9IDI7CisKKyAgICAgIG4gPSAoKGFzZWN0aW9uICoqKQorCSAgIGJmZF9yZWFsbG9jIChpZWVlLT5zZWN0aW9uX3RhYmxlLCBjICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOworICAgICAgaWYgKG4gPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgZm9yIChpID0gaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplOyBpIDwgYzsgaSsrKQorCW5baV0gPSBOVUxMOworCisgICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlID0gbjsKKyAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVfc2l6ZSA9IGM7CisgICAgfQorCisgIGlmIChpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKyAgICB7CisgICAgICBjaGFyICp0bXAgPSBiZmRfYWxsb2MgKGFiZmQsIDExKTsKKyAgICAgIGFzZWN0aW9uICpzZWN0aW9uOworCisgICAgICBpZiAoIXRtcCkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIHNwcmludGYgKHRtcCwgIiBmc2VjJTRkIiwgaW5kZXgpOworICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHRtcCk7CisgICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XSA9IHNlY3Rpb247CisgICAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19OT19GTEFHUzsKKyAgICAgIHNlY3Rpb24tPnRhcmdldF9pbmRleCA9IGluZGV4OworICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF0gPSBzZWN0aW9uOworICAgIH0KKyAgcmV0dXJuIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdOworfQorCitzdGF0aWMgdm9pZAoraWVlZV9zbHVycF9zZWN0aW9ucyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7CisgIGZpbGVfcHRyIG9mZnNldCA9IGllZWUtPncuci5zZWN0aW9uX3BhcnQ7CisgIGFzZWN0aW9uICpzZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7CisgIGNoYXIgKm5hbWU7CisKKyAgaWYgKG9mZnNldCAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9ieXRlIHNlY3Rpb25fdHlwZVszXTsKKyAgICAgIGllZWVfc2VlayAoYWJmZCwgb2Zmc2V0KTsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKKwkgICAgeworCSAgICBjYXNlIGllZWVfc2VjdGlvbl90eXBlX2VudW06CisJICAgICAgeworCQl1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleDsKKwkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJc2VjdGlvbl9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKworCQlzZWN0aW9uID0gZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIHNlY3Rpb25faW5kZXgpOworCisJCXNlY3Rpb25fdHlwZVswXSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSk7CisKKwkJLyogU2V0IG1pbmltYWwgc2VjdGlvbiBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIGFyZQorCQkgICBleHRlbmRlZCBsYXRlciwgYmFzZWQgb24gc2VjdGlvbiBjb250ZW50cy4gKi8KKworCQlzd2l0Y2ggKHNlY3Rpb25fdHlwZVswXSkKKwkJICB7CisJCSAgY2FzZSAweEMxOgorCQkgICAgLyogTm9ybWFsIGF0dHJpYnV0ZXMgZm9yIGFic29sdXRlIHNlY3Rpb25zCSovCisJCSAgICBzZWN0aW9uX3R5cGVbMV0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOworCQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7CisJCSAgICBzd2l0Y2ggKHNlY3Rpb25fdHlwZVsxXSkKKwkJICAgICAgeworCQkgICAgICBjYXNlIDB4RDM6CS8qIEFTIEFic29sdXRlIHNlY3Rpb24gYXR0cmlidXRlcyAqLworCQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJCXNlY3Rpb25fdHlwZVsyXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7CisJCQlzd2l0Y2ggKHNlY3Rpb25fdHlwZVsyXSkKKwkJCSAgeworCQkJICBjYXNlIDB4RDA6CisJCQkgICAgLyogTm9ybWFsIGNvZGUgKi8KKwkJCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCQkJICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19DT0RFOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlIDB4QzQ6CisJCQkgICAgLyogTm9ybWFsIGRhdGEgKi8KKwkJCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCQkJICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlIDB4RDI6CisJCQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJCSAgICAvKiBOb3JtYWwgcm9tIGRhdGEgKi8KKwkJCSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfUk9NIHwgU0VDX0RBVEE7CisJCQkgICAgYnJlYWs7CisJCQkgIGRlZmF1bHQ6CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgYnJlYWs7CisJCSAgY2FzZSAweEMzOgkvKiBOYW1lZCByZWxvY2F0YWJsZSBzZWN0aW9ucyAodHlwZSBDKSAqLworCQkgICAgc2VjdGlvbl90eXBlWzFdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKKwkJICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOworCQkgICAgc3dpdGNoIChzZWN0aW9uX3R5cGVbMV0pCisJCSAgICAgIHsKKwkJICAgICAgY2FzZSAweEQwOgkvKiBOb3JtYWwgY29kZSAoQ1ApICovCisJCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREU7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSAweEM0OgkvKiBOb3JtYWwgZGF0YSAoQ0QpICovCisJCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEE7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSAweEQyOgkvKiBOb3JtYWwgcm9tIGRhdGEgKENSKSAqLworCQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19ST00gfCBTRUNfREFUQTsKKwkJCWJyZWFrOworCQkgICAgICBkZWZhdWx0OgorCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICB9CisKKwkJLyogUmVhZCBzZWN0aW9uIG5hbWUsIHVzZSBpdCBpZiBub24gZW1wdHkuICovCisJCW5hbWUgPSByZWFkX2lkICgmaWVlZS0+aCk7CisJCWlmIChuYW1lWzBdKQorCQkgIHNlY3Rpb24tPm5hbWUgPSBuYW1lOworCisJCS8qIFNraXAgdGhlc2UgZmllbGRzLCB3aGljaCB3ZSBkb24ndCBjYXJlIGFib3V0ICovCisJCXsKKwkJICBiZmRfdm1hIHBhcmVudCwgYnJvdGhlciwgY29udGV4dDsKKwkJICBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZwYXJlbnQpOworCQkgIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmJyb3RoZXIpOworCQkgIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmNvbnRleHQpOworCQl9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGllZWVfc2VjdGlvbl9hbGlnbm1lbnRfZW51bToKKwkgICAgICB7CisJCXVuc2lnbmVkIGludCBzZWN0aW9uX2luZGV4OworCQliZmRfdm1hIHZhbHVlOworCQlhc2VjdGlvbiAqc2VjdGlvbjsKKwkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJc2VjdGlvbl9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmaWVlZS0+aCk7CisJCXNlY3Rpb24gPSBnZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgc2VjdGlvbl9pbmRleCk7CisJCWlmIChzZWN0aW9uX2luZGV4ID4gaWVlZS0+c2VjdGlvbl9jb3VudCkKKwkJICB7CisJCSAgICBpZWVlLT5zZWN0aW9uX2NvdW50ID0gc2VjdGlvbl9pbmRleDsKKwkJICB9CisJCXNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9CisJCSAgYmZkX2xvZzIgKG11c3RfcGFyc2VfaW50ICgmaWVlZS0+aCkpOworCQkodm9pZCkgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKKwkgICAgICB7CisJCWllZWVfcmVjb3JkX2VudW1fdHlwZSB0ID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKHJlYWRfMmJ5dGVzICgmKGllZWUtPmgpKSk7CisKKwkJc3dpdGNoICh0KQorCQkgIHsKKwkJICBjYXNlIGllZWVfc2VjdGlvbl9zaXplX2VudW06CisJCSAgICBzZWN0aW9uID0gaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldOworCQkgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBpZWVlX3BoeXNpY2FsX3JlZ2lvbl9zaXplX2VudW06CisJCSAgICBzZWN0aW9uID0gaWVlZS0+c2VjdGlvbl90YWJsZVttdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSldOworCQkgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBpZWVlX3JlZ2lvbl9iYXNlX2FkZHJlc3NfZW51bToKKwkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07CisJCSAgICBzZWN0aW9uLT52bWEgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCSAgICBzZWN0aW9uLT5sbWEgPSBzZWN0aW9uLT52bWE7CisJCSAgICBicmVhazsKKwkJICBjYXNlIGllZWVfbWF1X3NpemVfZW51bToKKwkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgaWVlZV9tX3ZhbHVlX2VudW06CisJCSAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCSAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCSAgICBicmVhazsKKwkJICBjYXNlIGllZWVfc2VjdGlvbl9iYXNlX2FkZHJlc3NfZW51bToKKwkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07CisJCSAgICBzZWN0aW9uLT52bWEgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCSAgICBzZWN0aW9uLT5sbWEgPSBzZWN0aW9uLT52bWE7CisJCSAgICBicmVhazsKKwkJICBjYXNlIGllZWVfc2VjdGlvbl9vZmZzZXRfZW51bToKKwkJICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCQkgICAgYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJICAgIHJldHVybjsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIE1ha2UgYSBzZWN0aW9uIGZvciB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBhbnkuICBXZSBkb24ndCB0cnkKKyAgIHRvIGludGVycHJldCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uOyB3ZSBqdXN0IHBvaW50IHRoZSBzZWN0aW9uCisgICBhdCB0aGUgYXJlYSBpbiB0aGUgZmlsZSBzbyB0aGF0IHByb2dyYW0gd2hpY2ggdW5kZXJzdGFuZCBjYW4gZGlnIGl0CisgICBvdXQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9zbHVycF9kZWJ1ZyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7CisgIGFzZWN0aW9uICpzZWM7CisKKyAgaWYgKGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kZWJ1ZyIpOworICBpZiAoc2VjID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBzZWMtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkcgfCBTRUNfSEFTX0NPTlRFTlRTOworICBzZWMtPmZpbGVwb3MgPSBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydDsKKyAgc2VjLT5fcmF3X3NpemUgPSBpZWVlLT53LnIuZGF0YV9wYXJ0IC0gaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQ7CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIGFyY2hpdmUgc3R1ZmYKKyovCisKK2NvbnN0IGJmZF90YXJnZXQgKgoraWVlZV9hcmNoaXZlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciAqbGlicmFyeTsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzUxMl07CisgIGZpbGVfcHRyIGJ1ZmZlcl9vZmZzZXQgPSAwOworICBpZWVlX2FyX2RhdGFfdHlwZSAqc2F2ZSA9IGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YTsKKyAgaWVlZV9hcl9kYXRhX3R5cGUgKmllZWU7CisgIHVuc2lnbmVkIGludCBhbGNfZWx0czsKKyAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKmVsdHMgPSBOVUxMOworCisgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9CisgICAgKGllZWVfYXJfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2FyX2RhdGFfdHlwZSkpOworICBpZiAoIWFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgaWVlZSA9IElFRUVfQVJfREFUQSAoYWJmZCk7CisKKyAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKKyAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KKyAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKKworICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7CisgIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKKworICBpZWVlLT5oLmFiZmQgPSBhYmZkOworCisgIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IE1vZHVsZV9CZWdpbm5pbmcpCisgICAgeworICAgICAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0gc2F2ZTsKKyAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworICBsaWJyYXJ5ID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7CisgIGlmIChzdHJjbXAgKGxpYnJhcnksICJMSUJSQVJZIikgIT0gMCkKKyAgICB7CisgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaWVlZSk7CisgICAgICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPSBzYXZlOworICAgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorICAvKiBUaHJvdyBhd2F5IHRoZSBmaWxlbmFtZSAqLworICByZWFkX2lkICgmKGllZWUtPmgpKTsKKworICBpZWVlLT5lbGVtZW50X2NvdW50ID0gMDsKKyAgaWVlZS0+ZWxlbWVudF9pbmRleCA9IDA7CisKKyAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCB0aGUgYWQgcGFydCAqLworICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIEFuZCB0aGUgdHdvIGR1bW15IG51bWJlcnMgKi8KKyAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCisgIGFsY19lbHRzID0gMTA7CisgIGVsdHMgPSAoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikgYmZkX21hbGxvYyAoYWxjX2VsdHMgKiBzaXplb2YgKmVsdHMpOworICBpZiAoZWx0cyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFJlYWQgdGhlIGluZGV4IG9mIHRoZSBCQiB0YWJsZSAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgcmVjOworICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnQ7CisKKyAgICAgIHJlYyA9IHJlYWRfMmJ5dGVzICgmKGllZWUtPmgpKTsKKyAgICAgIGlmIChyZWMgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKKwlicmVhazsKKworICAgICAgaWYgKGllZWUtPmVsZW1lbnRfY291bnQgPj0gYWxjX2VsdHMpCisJeworCSAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKm47CisKKwkgIGFsY19lbHRzICo9IDI7CisJICBuID0gKChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKQorCSAgICAgICBiZmRfcmVhbGxvYyAoZWx0cywgYWxjX2VsdHMgKiBzaXplb2YgKmVsdHMpKTsKKwkgIGlmIChuID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgZWx0cyA9IG47CisJfQorCisgICAgICB0ID0gJmVsdHNbaWVlZS0+ZWxlbWVudF9jb3VudF07CisgICAgICBpZWVlLT5lbGVtZW50X2NvdW50Kys7CisKKyAgICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKyAgICAgIHQtPmZpbGVfb2Zmc2V0ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworICAgICAgdC0+YWJmZCA9IChiZmQgKikgTlVMTDsKKworICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgZ28gb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKworICAgICAgaWYgKChzaXplX3QpIGllZWVfcG9zIChhYmZkKSA+IHNpemVvZiAoYnVmZmVyKSAvIDIpCisJeworCSAgLyogUGFzdCBoYWxmIHdheSwgcmVzZWVrIGFuZCByZXByaW1lICovCisJICBidWZmZXJfb2Zmc2V0ICs9IGllZWVfcG9zIChhYmZkKTsKKwkgIGlmIChiZmRfc2VlayAoYWJmZCwgYnVmZmVyX29mZnNldCwgU0VFS19TRVQpICE9IDApCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzCisJICAgICB0byByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCisJICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOworCSAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOworCSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOworCX0KKyAgICB9CisKKyAgaWVlZS0+ZWxlbWVudHMgPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCisJCSAgICBiZmRfYWxsb2MgKGFiZmQsCisJCQkgICAgICAgaWVlZS0+ZWxlbWVudF9jb3VudCAqIHNpemVvZiAqaWVlZS0+ZWxlbWVudHMpKTsKKyAgaWYgKGllZWUtPmVsZW1lbnRzID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIG1lbWNweSAoaWVlZS0+ZWxlbWVudHMsIGVsdHMsCisJICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cyk7CisgIGZyZWUgKGVsdHMpOworICBlbHRzID0gTlVMTDsKKworICAvKiBOb3cgc2NhbiB0aGUgYXJlYSBhZ2FpbiwgYW5kIHJlcGxhY2UgQkIgb2Zmc2V0cyB3aXRoIGZpbGUgKi8KKyAgLyogb2Zmc2V0cyAqLworCisgIGZvciAoaSA9IDI7IGkgPCBpZWVlLT5lbGVtZW50X2NvdW50OyBpKyspCisgICAgeworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCwgU0VFS19TRVQpICE9IDApCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8KKwkgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLworICAgICAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKKyAgICAgIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKKyAgICAgIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKKworICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCBGOCAqLworICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsJLyogRHJvcCAxNCAqLworICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHNpemUgb2YgYmxvY2sgKi8KKyAgICAgIGlmIChtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSkgIT0gMCkKKwl7CisJICAvKiBUaGlzIG9iamVjdCBoYXMgYmVlbiBkZWxldGVkICovCisJICBpZWVlLT5lbGVtZW50c1tpXS5maWxlX29mZnNldCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCX0KKyAgICB9CisKKyAgLyogIGFiZmQtPmhhc19hcm1hcCA9IDsqLworCisgIHJldHVybiBhYmZkLT54dmVjOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZWx0cyAhPSBOVUxMKQorICAgIGZyZWUgKGVsdHMpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2xlYW4KK2llZWVfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gKGllZWVfZGF0YV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9kYXRhX3R5cGUpKTsKKyAgcmV0dXJuIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA/IHRydWUgOiBmYWxzZTsKK30KKworY29uc3QgYmZkX3RhcmdldCAqCitpZWVlX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgKnByb2Nlc3NvcjsKKyAgdW5zaWduZWQgaW50IHBhcnQ7CisgIGllZWVfZGF0YV90eXBlICppZWVlOworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclszMDBdOworICBpZWVlX2RhdGFfdHlwZSAqc2F2ZSA9IElFRUVfREFUQSAoYWJmZCk7CisKKyAgYWJmZC0+dGRhdGEuaWVlZV9kYXRhID0gMDsKKyAgaWVlZV9ta29iamVjdCAoYWJmZCk7CisKKyAgaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7CisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICBnb3RvIGZhaWw7CisgIC8qIFJlYWQgdGhlIGZpcnN0IGZldyBieXRlcyBpbiB0byBzZWUgaWYgaXQgbWFrZXMgc2Vuc2UgKi8KKyAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKKyAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KKyAgYmZkX3JlYWQgKChQVFIpIGJ1ZmZlciwgMSwgc2l6ZW9mIChidWZmZXIpLCBhYmZkKTsKKworICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7CisgIGlmICh0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpICE9IE1vZHVsZV9CZWdpbm5pbmcpCisgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OworCisgIGllZWUtPnJlYWRfc3ltYm9scyA9IGZhbHNlOworICBpZWVlLT5yZWFkX2RhdGEgPSBmYWxzZTsKKyAgaWVlZS0+c2VjdGlvbl9jb3VudCA9IDA7CisgIGllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXggPSAwOworICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRTsKKyAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCA9IElFRUVfUkVGRVJFTkNFX0JBU0U7CisgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXggPSAwOworICBpZWVlLT5oLmFiZmQgPSBhYmZkOworICBpZWVlLT5zZWN0aW9uX3RhYmxlID0gTlVMTDsKKyAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gMDsKKworICBwcm9jZXNzb3IgPSBpZWVlLT5tYi5wcm9jZXNzb3IgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKKyAgaWYgKHN0cmNtcCAocHJvY2Vzc29yLCAiTElCUkFSWSIpID09IDApCisgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OworICBpZWVlLT5tYi5tb2R1bGVfbmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOworICBpZiAoYWJmZC0+ZmlsZW5hbWUgPT0gKENPTlNUIGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBhYmZkLT5maWxlbmFtZSA9IGllZWUtPm1iLm1vZHVsZV9uYW1lOworICAgIH0KKyAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuCisgICAgICovCisgIHsKKyAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7CisgICAgY2hhciBmYW1pbHlbMTBdOworCisgICAgLyogSUVFRSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBmb3JtYXQgb2YgdGhlIHByb2Nlc3NvciBpZGVudGlmaWNhdG9uCisgICAgICAgc3RyaW5nLCBzbyB0aGUgY29tcGlsZXIgaXMgZnJlZSB0byBwdXQgaW4gaXQgd2hhdGV2ZXIgaXQgd2FudHMuCisgICAgICAgV2UgdHJ5IGhlcmUgdG8gcmVjb2duaXplIGRpZmZlcmVudCBwcm9jZXNzb3JzIGJlbG9uZ2luZyB0byB0aGUKKyAgICAgICBtNjhrIGZhbWlseS4gIENvZGUgZm9yIG90aGVyIHByb2Nlc3NvcnMgY2FuIGJlIGFkZGVkIGhlcmUuICAqLworICAgIGlmICgocHJvY2Vzc29yWzBdID09ICc2JykgJiYgKHByb2Nlc3NvclsxXSA9PSAnOCcpKQorICAgICAgeworCWlmIChwcm9jZXNzb3JbMl0gPT0gJzMnKQkgICAgLyogNjgzeHggaW50ZWdyYXRlZCBwcm9jZXNzb3JzICovCisJICB7CisJICAgIHN3aXRjaCAocHJvY2Vzc29yWzNdKQorCSAgICAgIHsKKwkgICAgICBjYXNlICcwJzoJCQkgICAgLyogNjgzMDIsIDY4MzA2LCA2ODMwNyAqLworCSAgICAgIGNhc2UgJzInOgkJCSAgICAvKiA2ODMyMiwgNjgzMjggKi8KKwkgICAgICBjYXNlICc1JzoJCQkgICAgLyogNjgzNTYgKi8KKwkJc3RyY3B5IChmYW1pbHksICI2ODAwMCIpOyAgIC8qIE1DNjgwMDAtYmFzZWQgY29udHJvbGxlcnMgKi8KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICczJzoJCQkgICAgLyogNjgzMzAsIDY4MzMxLCA2ODMzMiwgNjgzMzMsCisJCQkJCSAgICAgICA2ODMzNCwgNjgzMzUsIDY4MzM2LCA2ODMzOCAqLworCSAgICAgIGNhc2UgJzYnOgkJCSAgICAvKiA2ODM2MCAqLworCSAgICAgIGNhc2UgJzcnOgkJCSAgICAvKiA2ODM3NiAqLworCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogQ1BVMzIgYW5kIENQVTMyKyAqLworCQlicmVhazsKKworCSAgICAgIGNhc2UgJzQnOgorCQlpZiAocHJvY2Vzc29yWzRdID09ICc5JykgICAgLyogNjgzNDkgKi8KKwkJICBzdHJjcHkgKGZhbWlseSwgIjY4MDMwIik7IC8qIENQVTAzMCAqLworCQllbHNlCQkgICAgICAgICAgICAvKiA2ODM0MCwgNjgzNDEgKi8KKwkJICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7IC8qIENQVTMyIGFuZCBDUFUzMisgKi8KKwkJYnJlYWs7CisKKwkgICAgICBkZWZhdWx0OgkJCSAgICAvKiBEb2VzIG5vdCBleGlzdCB5ZXQgKi8KKwkJc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOyAgIC8qIEd1ZXNzIGl0IHdpbGwgYmUgQ1BVMzIgKi8KKwkgICAgICB9CisJICB9CisJZWxzZSBpZiAodG91cHBlciAocHJvY2Vzc29yWzNdKSA9PSAnRicpICAgLyogNjhGMzMzICovCisJICBzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7CSAgICAgICAgICAvKiBDUFUzMiAqLworCWVsc2UgaWYgKCh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdDJykgIC8qIEVtYmVkZGVkIGNvbnRyb2xsZXJzICovCisJCSAmJiAoKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0UnKQorCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdIJykKKwkJICAgICB8fCAodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnTCcpKSkKKwkgIHsKKwkgICAgc3RyY3B5IChmYW1pbHksICI2OCIpOworCSAgICBzdHJuY2F0IChmYW1pbHksIHByb2Nlc3NvciArIDQsIDcpOworCSAgICBmYW1pbHlbOV0gPSAnXDAnOworCSAgfQorCWVsc2UJCQkJIC8qICJSZWd1bGFyIiBwcm9jZXNzb3JzICovCisJICB7CisJICAgIHN0cm5jcHkgKGZhbWlseSwgcHJvY2Vzc29yLCA5KTsKKwkgICAgZmFtaWx5WzldID0gJ1wwJzsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlIGlmICgoc3RybmNtcCAocHJvY2Vzc29yLCAiY3B1MzIiLCA1KSA9PSAwKSAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCisJICAgICB8fCAoc3RybmNtcCAocHJvY2Vzc29yLCAiQ1BVMzIiLCA1KSA9PSAwKSkKKyAgICAgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsKKyAgICBlbHNlCisgICAgICB7CisJc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOworCWZhbWlseVs5XSA9ICdcMCc7CisgICAgICB9CisKKyAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoZmFtaWx5KTsKKyAgICBpZiAoYXJjaCA9PSAwKQorICAgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0OworICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7CisgIH0KKworICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSAhPSAoaW50KSBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKQorICAgIHsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisKKyAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmllZWUtPmFkLm51bWJlcl9vZl9iaXRzX21hdSkgPT0gZmFsc2UpCisgICAgeworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJmllZWUtPmFkLm51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MpID09IGZhbHNlKQorICAgIHsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgLyogSWYgdGhlcmUgaXMgYSBieXRlIG9yZGVyIGluZm8sIHRha2UgaXQgKi8KKyAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV92YXJpYWJsZV9MX2VudW0gfHwKKyAgICAgIHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV92YXJpYWJsZV9NX2VudW0pCisgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKworICBmb3IgKHBhcnQgPSAwOyBwYXJ0IDwgTl9XX1ZBUklBQkxFUzsgcGFydCsrKQorICAgIHsKKyAgICAgIGJvb2xlYW4gb2s7CisgICAgICBpZiAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYXNzaWduX3ZhbHVlX3RvX3ZhcmlhYmxlX2VudW0pCisJeworCSAgZ290byBmYWlsOworCX0KKyAgICAgIGlmICh0aGlzX2J5dGVfYW5kX25leHQgKCYoaWVlZS0+aCkpICE9IHBhcnQpCisJeworCSAgZ290byBmYWlsOworCX0KKworICAgICAgaWVlZS0+dy5vZmZzZXRbcGFydF0gPSBwYXJzZV9pICgmKGllZWUtPmgpLCAmb2spOworICAgICAgaWYgKG9rID09IGZhbHNlKQorCXsKKwkgIGdvdG8gZmFpbDsKKwl9CisKKyAgICB9CisKKyAgaWYgKGllZWUtPncuci5leHRlcm5hbF9wYXJ0ICE9IDApCisgICAgYWJmZC0+ZmxhZ3MgPSBIQVNfU1lNUzsKKworICAvKiBCeSBub3cgd2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIElFRUUgZmlsZSwgd2UncmUgZ29pbmcgdG8gcmVhZAorICAgICB0aGUgd2hvbGUgdGhpbmcgaW50byBtZW1vcnkgc28gdGhhdCB3ZSBjYW4gcnVuIHVwIGFuZCBkb3duIGl0CisgICAgIHF1aWNrbHkuICBXZSBjYW4gd29yayBvdXQgaG93IGJpZyB0aGUgZmlsZSBpcyBmcm9tIHRoZSB0cmFpbGVyCisgICAgIHJlY29yZCAqLworCisgIElFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSA9CisgICAgKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsIGllZWUtPncuci5tZV9yZWNvcmQgKyAxKTsKKyAgaWYgKCFJRUVFX0RBVEEgKGFiZmQpLT5oLmZpcnN0X2J5dGUpCisgICAgZ290byBmYWlsOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmYWlsOworICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAorICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLworICBiZmRfcmVhZCAoKFBUUikgKElFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSksIDEsCisJICAgIGllZWUtPncuci5tZV9yZWNvcmQgKyAxLCBhYmZkKTsKKworICBpZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKTsKKworICBpZiAoISBpZWVlX3NsdXJwX2RlYnVnIChhYmZkKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgLyogUGFyc2Ugc2VjdGlvbiBkYXRhIHRvIGFjdGl2YXRlIGZpbGUgYW5kIHNlY3Rpb24gZmxhZ3MgaW1wbGllZCBieQorICAgICBzZWN0aW9uIGNvbnRlbnRzLiAqLworCisgIGlmICghIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKKyAgICBnb3RvIGZhaWw7CisgICAgCisgIHJldHVybiBhYmZkLT54dmVjOworZ290X3dyb25nX2Zvcm1hdDoKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CitmYWlsOgorICAodm9pZCkgYmZkX3JlbGVhc2UgKGFiZmQsIGllZWUpOworICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSBzYXZlOworICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKK30KKwordm9pZAoraWVlZV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworICAgICBzeW1ib2xfaW5mbyAqcmV0OworeworICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKKyAgaWYgKHN5bWJvbC0+bmFtZVswXSA9PSAnICcpCisgICAgcmV0LT5uYW1lID0gIiogZW1wdHkgdGFibGUgZW50cnkgIjsKKyAgaWYgKCFzeW1ib2wtPnNlY3Rpb24pCisgICAgcmV0LT50eXBlID0gKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpID8gJ2EnIDogJ0EnOworfQorCit2b2lkCitpZWVlX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgUFRSIGFmaWxlOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKKworICBzd2l0Y2ggKGhvdykKKyAgICB7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6CisgICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6CisjaWYgMAorICAgICAgZnByaW50ZiAoZmlsZSwgIiU0eCAlMngiLCBhb3V0X3N5bWJvbCAoc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiwKKwkgICAgICAgYW91dF9zeW1ib2wgKHN5bWJvbCktPm90aGVyICYgMHhmZik7CisjZW5kaWYKKyAgICAgIEJGRF9GQUlMICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKKyAgICAgIHsKKwljb25zdCBjaGFyICpzZWN0aW9uX25hbWUgPQorCSAgKHN5bWJvbC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTAorCSAgID8gIiphYnMiCisJICAgOiBzeW1ib2wtPnNlY3Rpb24tPm5hbWUpOworCWlmIChzeW1ib2wtPm5hbWVbMF0gPT0gJyAnKQorCSAgeworCSAgICBmcHJpbnRmIChmaWxlLCAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7CisKKwkgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICUwNHggJTAyeCAlcyIsCisJCSAgICAgc2VjdGlvbl9uYW1lLAorCQkgICAgICh1bnNpZ25lZCkgaWVlZV9zeW1ib2wgKHN5bWJvbCktPmluZGV4LAorCQkgICAgICh1bnNpZ25lZCkgMCwKKwkJICAgICBzeW1ib2wtPm5hbWUpOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgYm9vbGVhbgorZG9fb25lIChpZWVlLCBjdXJyZW50X21hcCwgbG9jYXRpb25fcHRyLCBzLCBpdGVyYXRpb25zKQorICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKKyAgICAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpjdXJyZW50X21hcDsKKyAgICAgdW5zaWduZWQgY2hhciAqbG9jYXRpb25fcHRyOworICAgICBhc2VjdGlvbiAqczsKKyAgICAgaW50IGl0ZXJhdGlvbnM7Cit7CisgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKKyAgICB7CisgICAgY2FzZSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bToKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgbnVtYmVyX29mX21hdXM7CisJdW5zaWduZWQgaW50IGk7CisJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwludW1iZXJfb2ZfbWF1cyA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfbWF1czsgaSsrKQorCSAgeworCSAgICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKKwkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW06CisgICAgICB7CisJYm9vbGVhbiBsb29wID0gdHJ1ZTsKKwluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCXdoaWxlIChsb29wKQorCSAgeworCSAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCisJICAgICAgeworCSAgICAgIGNhc2UgaWVlZV92YXJpYWJsZV9SX2VudW06CisKKwkgICAgICBjYXNlIGllZWVfZnVuY3Rpb25fc2lnbmVkX29wZW5fYl9lbnVtOgorCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9vcGVuX2JfZW51bToKKwkgICAgICBjYXNlIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtOgorCQl7CisJCSAgdW5zaWduZWQgaW50IGV4dHJhID0gNDsKKwkJICBib29sZWFuIHBjcmVsID0gZmFsc2U7CisJCSAgYXNlY3Rpb24gKnNlY3Rpb247CisJCSAgaWVlZV9yZWxvY190eXBlICpyID0KKwkJICAoaWVlZV9yZWxvY190eXBlICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLAorCQkJCQkJIHNpemVvZiAoaWVlZV9yZWxvY190eXBlKSk7CisJCSAgaWYgKCFyKQorCQkgICAgcmV0dXJuIGZhbHNlOworCisJCSAgKihjdXJyZW50X21hcC0+cmVsb2NfdGFpbF9wdHIpID0gcjsKKwkJICBjdXJyZW50X21hcC0+cmVsb2NfdGFpbF9wdHIgPSAmci0+bmV4dDsKKwkJICByLT5uZXh0ID0gKGllZWVfcmVsb2NfdHlwZSAqKSBOVUxMOworCQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisvKgkJCSAgICBhYm9ydCgpOyovCisJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gMDsKKwkJICBwYXJzZV9leHByZXNzaW9uIChpZWVlLAorCQkJCSAgICAmci0+cmVsZW50LmFkZGVuZCwKKwkJCQkgICAgJnItPnN5bWJvbCwKKwkJCQkgICAgJnBjcmVsLCAmZXh0cmEsICZzZWN0aW9uKTsKKwkJICByLT5yZWxlbnQuYWRkcmVzcyA9IGN1cnJlbnRfbWFwLT5wYzsKKwkJICBzLT5mbGFncyB8PSBTRUNfUkVMT0M7CisJCSAgcy0+b3duZXItPmZsYWdzIHw9IEhBU19SRUxPQzsKKwkJICBzLT5yZWxvY19jb3VudCsrOworCQkgIGlmIChyLT5yZWxlbnQuc3ltX3B0cl9wdHIgPT0gTlVMTCAmJiBzZWN0aW9uICE9IE5VTEwpCisJCSAgICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBzZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKKworCQkgIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpID09IChpbnQpIGllZWVfY29tbWEpCisJCSAgICB7CisJCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJCSAgICAgIC8qIEZldGNoIG51bWJlciBvZiBieXRlcyB0byBwYWQgKi8KKwkJICAgICAgZXh0cmEgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJCSAgICB9OworCisJCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQorCQkgICAgeworCQkgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3NpZ25lZF9jbG9zZV9iX2VudW06CisJCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX2Nsb3NlX2JfZW51bToKKwkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bToKKwkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICAvKiBCdWlsZCBhIHJlbG9jYXRpb24gZW50cnkgZm9yIHRoaXMgdHlwZSAqLworCQkgIC8qIElmIHBjIHJlbCB0aGVuIHN0aWNrIC12ZSBwYyBpbnRvIGluc3RydWN0aW9uCisJCSAgICAgYW5kIHRha2Ugb3V0IG9mIHJlbG9jIC4uCisKKwkJICAgICBJJ3ZlIGNoYW5nZWQgdGhpcy4gSXQncyBhbGwgdG9vIGNvbXBsaWNhdGVkLiBJCisJCSAgICAga2VlcCAwIGluIHRoZSBpbnN0cnVjdGlvbiBub3cuICAqLworCisJCSAgc3dpdGNoIChleHRyYSkKKwkJICAgIHsKKwkJICAgIGNhc2UgMDoKKwkJICAgIGNhc2UgNDoKKworCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKKwkJCXsKKyNpZiBLRUVQTUlOVVNQQ0lOSU5TVAorCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIC1jdXJyZW50X21hcC0+cGMsIGxvY2F0aW9uX3B0ciArCisJCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKKwkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDMyX2hvd3RvOworCQkJICByLT5yZWxlbnQuYWRkZW5kIC09CisJCQkgICAgY3VycmVudF9tYXAtPnBjOworI2Vsc2UKKwkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKworCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7CisJCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwzMl9ob3d0bzsKKyNlbmRpZgorCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsKKwkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOworCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzMzJfaG93dG87CisJCQl9CisJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyArPSA0OworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgMjoKKwkJICAgICAgaWYgKHBjcmVsID09IHRydWUpCisJCQl7CisjaWYgS0VFUE1JTlVTUENJTklOU1QKKwkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAoaW50KSAoLWN1cnJlbnRfbWFwLT5wYyksIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7CisJCQkgIHItPnJlbGVudC5hZGRlbmQgLT0gY3VycmVudF9tYXAtPnBjOworCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMTZfaG93dG87CisjZWxzZQorCisJCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKKwkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDE2X2hvd3RvOworI2VuZGlmCisJCQl9CisKKwkJICAgICAgZWxzZQorCQkJeworCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7CisJCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnMxNl9ob3d0bzsKKwkJCX0KKwkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDI7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAxOgorCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKKwkJCXsKKyNpZiBLRUVQTUlOVVNQQ0lOSU5TVAorCQkJICBiZmRfcHV0XzggKGllZWUtPmguYWJmZCwgKGludCkgKC1jdXJyZW50X21hcC0+cGMpLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOworCQkJICByLT5yZWxlbnQuYWRkZW5kIC09IGN1cnJlbnRfbWFwLT5wYzsKKwkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDhfaG93dG87CisjZWxzZQorCQkJICBiZmRfcHV0XzggKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKKwkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDhfaG93dG87CisjZW5kaWYKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBiZmRfcHV0XzggKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKKwkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczhfaG93dG87CisJCQl9CisJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyArPSAxOworCQkgICAgICBicmVhazsKKworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgQkZEX0ZBSUwgKCk7CisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQl7CisJCSAgYmZkX3ZtYSB0aGlzX3NpemU7CisJCSAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnRoaXNfc2l6ZSkgPT0gdHJ1ZSkKKwkJICAgIHsKKwkJICAgICAgdW5zaWduZWQgaW50IGk7CisJCSAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzX3NpemU7IGkrKykKKwkJCXsKKwkJCSAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7CisJCQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsb29wID0gZmFsc2U7CisJCSAgICB9CisJCX0KKwkgICAgICB9CisKKwkgICAgLyogUHJldmVudCBtb3JlIHRoYW4gdGhlIGZpcnN0IGxvYWQtaXRlbSBvZiBhbiBMUiByZWNvcmQKKwkgICAgICAgZnJvbSBiZWluZyByZXBlYXRlZCAoTVJJIGNvbnZlbnRpb24pLiAqLworCSAgICBpZiAoaXRlcmF0aW9ucyAhPSAxKQorCSAgICAgIGxvb3AgPSBmYWxzZTsKKwkgIH0KKyAgICAgIH0KKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWFkIGluIGFsbCB0aGUgc2VjdGlvbiBkYXRhIGFuZCByZWxvY2F0aW9uIHN0dWZmIHRvbyAqLworc3RhdGljIGJvb2xlYW4KK2llZWVfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9ieXRlICpsb2NhdGlvbl9wdHIgPSAoYmZkX2J5dGUgKikgTlVMTDsKKyAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7CisKKyAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpjdXJyZW50X21hcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgTlVMTDsKKyAgYXNlY3Rpb24gKnM7CisgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIGFyZWEgKi8KKyAgaWYgKGllZWUtPnJlYWRfZGF0YSA9PSB0cnVlKQorICAgIHJldHVybiB0cnVlOworICBpZWVlLT5yZWFkX2RhdGEgPSB0cnVlOworICBpZWVlX3NlZWsgKGFiZmQsIGllZWUtPncuci5kYXRhX3BhcnQpOworCisgIC8qIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgYWxsIHRoZSBzZWN0aW9uIGNvbnRlbnRzICovCisKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcGVyID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzLT51c2VkX2J5X2JmZDsKKyAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQorCWNvbnRpbnVlOworICAgICAgcGVyLT5kYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoaWVlZS0+aC5hYmZkLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKCFwZXItPmRhdGEpCisJcmV0dXJuIGZhbHNlOworICAgICAgLypTVVBQUkVTUyA2OCovCisgICAgICBwZXItPnJlbG9jX3RhaWxfcHRyID0KKwkoaWVlZV9yZWxvY190eXBlICoqKSAmIChzLT5yZWxvY2F0aW9uKTsKKyAgICB9CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQorCXsKKwkgIC8qIElGIHdlIHNlZSBhbnl0aGluZyBzdHJhbmdlIHRoZW4gcXVpdCAqLworCWRlZmF1bHQ6CisJICByZXR1cm4gdHJ1ZTsKKworCWNhc2UgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW06CisJICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCSAgc2VjdGlvbl9udW1iZXIgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CisJICBzID0gaWVlZS0+c2VjdGlvbl90YWJsZVtzZWN0aW9uX251bWJlcl07CisJICBzLT5mbGFncyB8PSBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7CisJICBjdXJyZW50X21hcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgcy0+dXNlZF9ieV9iZmQ7CisJICBsb2NhdGlvbl9wdHIgPSBjdXJyZW50X21hcC0+ZGF0YSAtIHMtPnZtYTsKKwkgIC8qIFRoZSBkb2N1bWVudCBJIGhhdmUgc2F5cyB0aGF0IE1pY3JvdGVjJ3MgY29tcGlsZXJzIHJlc2V0ICovCisJICAvKiB0aGlzIGFmdGVyIGEgc2VjIHNlY3Rpb24sIGV2ZW4gdGhvdWdoIHRoZSBzdGFuZGFyZCBzYXlzIG5vdCAqLworCSAgLyogdG8uIFNPIC4uICovCisJICBjdXJyZW50X21hcC0+cGMgPSBzLT52bWE7CisJICBicmVhazsKKworCWNhc2UgaWVlZV9lMl9maXJzdF9ieXRlX2VudW06CisJICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQorCSAgICB7CisJICAgIGNhc2UgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtICYgMHhmZjoKKwkgICAgICB7CisJCWJmZF92bWEgdmFsdWU7CisJCWllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3ltYm9sOworCQl1bnNpZ25lZCBpbnQgZXh0cmE7CisJCWJvb2xlYW4gcGNyZWw7CisJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJCW11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogVGhvdyBhd2F5IHNlY3Rpb24gIyovCisJCXBhcnNlX2V4cHJlc3Npb24gKGllZWUsICZ2YWx1ZSwKKwkJCQkgICZzeW1ib2wsCisJCQkJICAmcGNyZWwsICZleHRyYSwKKwkJCQkgIDApOworCQljdXJyZW50X21hcC0+cGMgPSB2YWx1ZTsKKwkJQkZEX0FTU0VSVCAoKHVuc2lnbmVkKSAodmFsdWUgLSBzLT52bWEpIDw9IHMtPl9yYXdfc2l6ZSk7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgaWVlZV92YWx1ZV9zdGFydGluZ19hZGRyZXNzX2VudW0gJiAweGZmOgorCSAgICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJICAgICAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pCisJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJICAgICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKKwkgICAgICAvKiBXZSd2ZSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSBub3cgLSAqLworCSAgICAgIHJldHVybiB0cnVlOworCSAgICBkZWZhdWx0OgorCSAgICAgIEJGRF9GQUlMICgpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBpZWVlX3JlcGVhdF9kYXRhX2VudW06CisJICB7CisJICAgIC8qIFJlcGVhdCB0aGUgZm9sbG93aW5nIExEIG9yIExSIG4gdGltZXMgLSB3ZSBkbyB0aGlzIGJ5CisJCSByZW1lbWJlcmluZyB0aGUgc3RyZWFtIHBvaW50ZXIgYmVmb3JlIHJ1bm5pbmcgaXQgYW5kCisJCSByZXNldHRpbmcgaXQgYW5kIHJ1bm5pbmcgaXQgbiB0aW1lcy4gV2Ugc3BlY2lhbCBjYXNlCisJCSB0aGUgcmVwZXRpdGlvbiBvZiBhIHJlcGVhdF9kYXRhL2xvYWRfY29uc3RhbnQKKwkJICovCisKKwkgICAgdW5zaWduZWQgaW50IGl0ZXJhdGlvbnM7CisJICAgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0OworCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOworCSAgICBpdGVyYXRpb25zID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOworCSAgICBzdGFydCA9IGllZWUtPmguaW5wdXRfcDsKKwkgICAgaWYgKHN0YXJ0WzBdID09IChpbnQpIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtICYmCisJCXN0YXJ0WzFdID09IDEpCisJICAgICAgeworCQl3aGlsZSAoaXRlcmF0aW9ucyAhPSAwKQorCQkgIHsKKwkJICAgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSBzdGFydFsyXTsKKwkJICAgIGl0ZXJhdGlvbnMtLTsKKwkJICB9CisJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQl3aGlsZSAoaXRlcmF0aW9ucyAhPSAwKQorCQkgIHsKKwkJICAgIGllZWUtPmguaW5wdXRfcCA9IHN0YXJ0OworCQkgICAgaWYgKCFkb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsCisJCQkJIGl0ZXJhdGlvbnMpKQorCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICBpdGVyYXRpb25zLS07CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW06CisJY2FzZSBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW06CisJICB7CisJICAgIGlmICghZG9fb25lIChpZWVlLCBjdXJyZW50X21hcCwgbG9jYXRpb25fcHRyLCBzLCAxKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisJfQorICAgIH0KK30KKworYm9vbGVhbgoraWVlZV9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpuZXdzZWN0OworeworICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9IChQVFIpCisgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGllZWVfcGVyX3NlY3Rpb25fdHlwZSkpOworICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWVlZV9wZXJfc2VjdGlvbiAobmV3c2VjdCktPmRhdGEgPSAoYmZkX2J5dGUgKikgTlVMTDsKKyAgaWVlZV9wZXJfc2VjdGlvbiAobmV3c2VjdCktPnNlY3Rpb24gPSBuZXdzZWN0OworICByZXR1cm4gdHJ1ZTsKK30KKworbG9uZworaWVlZV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7Cit7CisgIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCEgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKK30KKworc3RhdGljIGJvb2xlYW4KK2llZWVfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7CisgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQorICAgIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAorCQkJCQkgICAgICBvZmZzZXQsIGNvdW50KTsKKyAgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOworICAodm9pZCkgbWVtY3B5ICgoUFRSKSBsb2NhdGlvbiwgKFBUUikgKHAtPmRhdGEgKyBvZmZzZXQpLCAodW5zaWduZWQpIGNvdW50KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2xvbmcKK2llZWVfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBhcmVsZW50ICoqcmVscHRyOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKy8qICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKnAgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOyovCisgIGllZWVfcmVsb2NfdHlwZSAqc3JjID0gKGllZWVfcmVsb2NfdHlwZSAqKSAoc2VjdGlvbi0+cmVsb2NhdGlvbik7CisgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKKworICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKKyAgICByZXR1cm4gMDsKKworICB3aGlsZSAoc3JjICE9IChpZWVlX3JlbG9jX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBXb3JrIG91dCB3aGljaCBzeW1ib2wgdG8gYXR0YWNoIGl0IHRoaXMgcmVsb2MgdG8gKi8KKyAgICAgIHN3aXRjaCAoc3JjLT5zeW1ib2wubGV0dGVyKQorCXsKKwljYXNlICdJJzoKKwkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KKwkgICAgc3ltYm9scyArIHNyYy0+c3ltYm9sLmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0OworCSAgYnJlYWs7CisJY2FzZSAnWCc6CisJICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9CisJICAgIHN5bWJvbHMgKyBzcmMtPnN5bWJvbC5pbmRleCArIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldDsKKwkgIGJyZWFrOworCWNhc2UgMDoKKwkgIGlmIChzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciAhPSBOVUxMKQorCSAgICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9CisJICAgICAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHJbMF0tPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKworCSAgQkZEX0ZBSUwgKCk7CisJfQorICAgICAgKnJlbHB0cisrID0gJnNyYy0+cmVsZW50OworICAgICAgc3JjID0gc3JjLT5uZXh0OworICAgIH0KKyAgKnJlbHB0ciA9IChhcmVsZW50ICopIE5VTEw7CisgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKK30KKworc3RhdGljIGludAorY29tcCAoYXAsIGJwKQorICAgICBDT05TVCBQVFIgYXA7CisgICAgIENPTlNUIFBUUiBicDsKK3sKKyAgYXJlbGVudCAqYSA9ICooKGFyZWxlbnQgKiopIGFwKTsKKyAgYXJlbGVudCAqYiA9ICooKGFyZWxlbnQgKiopIGJwKTsKKyAgcmV0dXJuIGEtPmFkZHJlc3MgLSBiLT5hZGRyZXNzOworfQorCisvKiBXcml0ZSB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKKyAgYXNlY3Rpb24gKnM7CisgIGllZWUtPncuci5zZWN0aW9uX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7CisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHMpCisJICAmJiAocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSA9PSAwKQorCXsKKwkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZWN0aW9uX3R5cGVfZW51bSkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKKwkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKKwkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpbWFnZSBpcyBleGVjdXRhYmxlLCBzbyBvdXRwdXQgYWJzb2x1dGUgc2VjdGlvbnMgKi8KKwkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfQV9lbnVtKQorCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1NfZW51bSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX0NfZW51bSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBzd2l0Y2ggKHMtPmZsYWdzICYgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NKSkKKwkgICAgeworCSAgICBjYXNlIFNFQ19DT0RFIHwgU0VDX0xPQUQ6CisJICAgIGNhc2UgU0VDX0NPREU6CisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTRUNfREFUQToKKwkgICAgZGVmYXVsdDoKKwkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfRF9lbnVtKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNFQ19ST006CisJICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19EQVRBOgorCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfTE9BRDoKKwkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0RBVEEgfCBTRUNfTE9BRDoKKwkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUl9lbnVtKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKworCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcy0+bmFtZSkpCisJICAgIHJldHVybiBmYWxzZTsKKyNpZiAwCisJICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIFBhcmVudCAqLworCSAgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDApOwkvKiBCcm90aGVyICovCisJICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIENvbnRleHQgKi8KKyNlbmRpZgorCSAgLyogQWxpZ25tZW50ICovCisJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2VjdGlvbl9hbGlnbm1lbnRfZW51bSkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKKwkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKKwkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCAxIDw8IHMtPmFsaWdubWVudF9wb3dlcikpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogU2l6ZSAqLworCSAgaWYgKCEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfc2VjdGlvbl9zaXplX2VudW0pCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCisJCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4CisJCQkJCQkrIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+X3Jhd19zaXplKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQorCSAgICB7CisJICAgICAgLyogUmVsb2NhdGVhYmxlIHNlY3Rpb25zIGRvbid0IGhhdmUgYXNsIHJlY29yZHMgKi8KKwkgICAgICAvKiBWbWEgKi8KKwkgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtKQorCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAorCQkJCQkoKGJmZF9ieXRlKQorCQkJCQkgKHMtPmluZGV4CisJCQkJCSAgKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKKwkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBib29sZWFuCitkb193aXRoX3JlbG9jcyAoYWJmZCwgcykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqczsKK3sKKyAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MgPQorICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpIC8gYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCk7CisgIHVuc2lnbmVkIGludCByZWxvY3NfdG9fZ28gPSBzLT5yZWxvY19jb3VudDsKKyAgYmZkX2J5dGUgKnN0cmVhbSA9IGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhOworICBhcmVsZW50ICoqcCA9IHMtPm9yZWxvY2F0aW9uOworICBiZmRfc2l6ZV90eXBlIGN1cnJlbnRfYnl0ZV9pbmRleCA9IDA7CisKKyAgcXNvcnQgKHMtPm9yZWxvY2F0aW9uLAorCSByZWxvY3NfdG9fZ28sCisJIHNpemVvZiAoYXJlbGVudCAqKiksCisJIGNvbXApOworCisgIC8qIE91dHB1dCB0aGUgc2VjdGlvbiBwcmVoZWFkZXIgKi8KKyAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAorCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAorCQkJICAgIChiZmRfYnl0ZSkgKHMtPmluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwICYmIHJlbG9jc190b19nbyA9PSAwKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIDAsIHMtPnN5bWJvbCwgMCwgMCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAocmVsb2NzX3RvX2dvID09IDApCisgICAgeworICAgICAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY2F0aW9ucyB0aGVuIG91dHB1dCB0aGUgbG9hZCBjb25zdGFudAorCSBieXRlIG9wY29kZSByYXRoZXIgdGhhbiB0aGUgbG9hZCB3aXRoIHJlbG9jYXRpb24gb3Bjb2RlICovCisKKyAgICAgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fcmF3X3NpemUpCisJeworCSAgYmZkX3NpemVfdHlwZSBydW47CisJICB1bnNpZ25lZCBpbnQgTUFYUlVOID0gMTI3OworCSAgcnVuID0gTUFYUlVOOworCSAgaWYgKHJ1biA+IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleCkKKwkgICAgeworCSAgICAgIHJ1biA9IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKKwkgICAgfQorCisJICBpZiAocnVuICE9IDApCisJICAgIHsKKwkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIC8qIE91dHB1dCBhIHN0cmVhbSBvZiBieXRlcyAqLworCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCBydW4pKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgKHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCksCisJCQkgICAgIDEsCisJCQkgICAgIHJ1biwKKwkJCSAgICAgYWJmZCkKKwkJICAhPSBydW4pCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gcnVuOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX3dpdGhfcmVsb2NhdGlvbl9lbnVtKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIE91dHB1dCB0aGUgZGF0YSBzdHJlYW0gYXMgdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugb2YgYnl0ZXMKKwkgcG9zc2libGUsIGFsbG93aW5nIGZvciB0aGUgYSByZWFzb25hYmxlIHBhY2tldCBzaXplIGFuZAorCSByZWxvY2F0aW9uIHN0dWZmcy4gICovCisKKyAgICAgIGlmICgoUFRSKSBzdHJlYW0gPT0gKFBUUikgTlVMTCkKKwl7CisJICAvKiBPdXRwdXR0aW5nIGEgc2VjdGlvbiB3aXRob3V0IGRhdGEsIGZpbGwgaXQgdXAgKi8KKwkgIHN0cmVhbSA9ICh1bnNpZ25lZCBjaGFyICopIChiZmRfYWxsb2MgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpOworCSAgaWYgKCFzdHJlYW0pCisJICAgIHJldHVybiBmYWxzZTsKKwkgIG1lbXNldCAoKFBUUikgc3RyZWFtLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOworCX0KKyAgICAgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fcmF3X3NpemUpCisJeworCSAgYmZkX3NpemVfdHlwZSBydW47CisJICB1bnNpZ25lZCBpbnQgTUFYUlVOID0gMTI3OworCSAgaWYgKHJlbG9jc190b19nbykKKwkgICAgeworCSAgICAgIHJ1biA9ICgqcCktPmFkZHJlc3MgLSBjdXJyZW50X2J5dGVfaW5kZXg7CisJICAgICAgaWYgKHJ1biA+IE1BWFJVTikKKwkJcnVuID0gTUFYUlVOOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBydW4gPSBNQVhSVU47CisJICAgIH0KKwkgIGlmIChydW4gPiBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXgpCisJICAgIHsKKwkgICAgICBydW4gPSBzLT5fcmF3X3NpemUgLSBjdXJyZW50X2J5dGVfaW5kZXg7CisJICAgIH0KKworCSAgaWYgKHJ1biAhPSAwKQorCSAgICB7CisJICAgICAgLyogT3V0cHV0IGEgc3RyZWFtIG9mIGJ5dGVzICovCisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJ1bikpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KSwKKwkJCSAgICAgMSwKKwkJCSAgICAgcnVuLAorCQkJICAgICBhYmZkKQorCQkgICE9IHJ1bikKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSBydW47CisJICAgIH0KKwkgIC8qIE91dHB1dCBhbnkgcmVsb2NhdGlvbnMgaGVyZSAqLworCSAgaWYgKHJlbG9jc190b19nbyAmJiAoKnApICYmICgqcCktPmFkZHJlc3MgPT0gY3VycmVudF9ieXRlX2luZGV4KQorCSAgICB7CisJICAgICAgd2hpbGUgKHJlbG9jc190b19nbworCQkgICAgICYmICgqcCkgJiYgKCpwKS0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCisJCXsKKwkJICBhcmVsZW50ICpyID0gKnA7CisJCSAgYmZkX3NpZ25lZF92bWEgb3Y7CisKKyNpZiAwCisJCSAgaWYgKHItPmhvd3RvLT5wY19yZWxhdGl2ZSkKKwkJICAgIHsKKwkJICAgICAgci0+YWRkZW5kICs9IGN1cnJlbnRfYnl0ZV9pbmRleDsKKwkJICAgIH0KKyNlbmRpZgorCisJCSAgc3dpdGNoIChyLT5ob3d0by0+c2l6ZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgMjoKKworCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzMyIChhYmZkLAorCQkJCQkgICAgICBzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpOworCQkgICAgICBjdXJyZW50X2J5dGVfaW5kZXggKz0gNDsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDE6CisJCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfMTYgKGFiZmQsCisJCQkJCSAgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7CisJCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSAyOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgMDoKKwkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF84IChhYmZkLAorCQkJCQkgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7CisJCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCsrOworCQkgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIG92ID0gMDsKKwkJICAgICAgQkZEX0ZBSUwgKCk7CisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKworCQkgIG92ICY9IHItPmhvd3RvLT5zcmNfbWFzazsKKworCQkgIGlmIChyLT5ob3d0by0+cGNfcmVsYXRpdmUKKwkJICAgICAgJiYgISByLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQorCQkgICAgb3YgKz0gci0+YWRkcmVzczsKKworCQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKKwkJCQkJIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKworLyoJCSAgYWJvcnQoKTsqLworCisJCSAgaWYgKHItPnN5bV9wdHJfcHRyICE9IChhc3ltYm9sICoqKSBOVUxMKQorCQkgICAgeworCQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIHItPmFkZGVuZCArIG92LAorCQkJCQkJICAgKihyLT5zeW1fcHRyX3B0ciksCisJCQkJCQkgICByLT5ob3d0by0+cGNfcmVsYXRpdmUsCisJCQkJCQkgICBzLT5pbmRleCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsIHItPmFkZGVuZCArIG92LAorCQkJCQkJICAgKGFzeW1ib2wgKikgTlVMTCwKKwkJCQkJCSAgIHItPmhvd3RvLT5wY19yZWxhdGl2ZSwKKwkJCQkJCSAgIHMtPmluZGV4KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgIH0KKworCQkgIGlmIChudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzCisJCSAgICAgICE9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoci0+aG93dG8pKQorCQkgICAgeworCQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwKKwkJCQkJICAgIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoci0+aG93dG8pKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCisJCQkJCSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW0pKQorCQkgICAgcmV0dXJuIGZhbHNlOworCisJCSAgcmVsb2NzX3RvX2dvLS07CisJCSAgcCsrOworCQl9CisKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIElmIHRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gdGhlbiB3ZSBjYW4gYmUKKyAgIGNsZXZlciBhYm91dCBob3cgd2Ugd3JpdGUuICBXZSBibG9jayBpdGVtcyB1cCBpbnRvIGEgbWF4IG9mIDEyNworICAgYnl0ZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorZG9fYXNfcmVwZWF0IChhYmZkLCBzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzOworeworICBpZiAocy0+X3Jhd19zaXplKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKKwkJCQkoYmZkX2J5dGUpIChzLT5pbmRleAorCQkJCQkgICAgKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSA+PiA4KQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfcGNfZW51bSAmIDB4ZmYpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKKwkJCQkoYmZkX2J5dGUpIChzLT5pbmRleAorCQkJCQkgICAgKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQorCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+bG1hKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfcmVwZWF0X2RhdGFfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPl9yYXdfc2l6ZSkKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDApKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitkb193aXRob3V0X3JlbG9jcyAoYWJmZCwgcykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqczsKK3sKKyAgYmZkX2J5dGUgKnN0cmVhbSA9IGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhOworCisgIGlmIChzdHJlYW0gPT0gMCB8fCAoKHMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApKQorICAgIHsKKyAgICAgIGlmICghIGRvX2FzX3JlcGVhdCAoYWJmZCwgcykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHMtPl9yYXdfc2l6ZTsgaSsrKQorCXsKKwkgIGlmIChzdHJlYW1baV0gIT0gMCkKKwkgICAgeworCSAgICAgIGlmICghIGRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJfQorICAgICAgaWYgKCEgZG9fYXNfcmVwZWF0IChhYmZkLCBzKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHI7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cl9lbmQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHJfZW5kOworc3RhdGljIGJmZCAqaW5wdXRfYmZkOworc3RhdGljIGJmZCAqb3V0cHV0X2JmZDsKK3N0YXRpYyBpbnQgb3V0cHV0X2J1ZmZlcjsKKworc3RhdGljIHZvaWQKK2ZpbGwgKCkKK3sKKyAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKKyAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KKyAgYmZkX3JlYWQgKChQVFIpIGlucHV0X3B0cl9zdGFydCwgMSwgaW5wdXRfcHRyX2VuZCAtIGlucHV0X3B0cl9zdGFydCwgaW5wdXRfYmZkKTsKKyAgaW5wdXRfcHRyID0gaW5wdXRfcHRyX3N0YXJ0OworfQorc3RhdGljIHZvaWQKK2ZsdXNoICgpCit7CisgIGlmIChiZmRfd3JpdGUgKChQVFIpIChvdXRwdXRfcHRyX3N0YXJ0KSwgMSwgb3V0cHV0X3B0ciAtIG91dHB1dF9wdHJfc3RhcnQsCisJCSBvdXRwdXRfYmZkKQorICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRwdXRfcHRyIC0gb3V0cHV0X3B0cl9zdGFydCkpCisgICAgYWJvcnQgKCk7CisgIG91dHB1dF9wdHIgPSBvdXRwdXRfcHRyX3N0YXJ0OworICBvdXRwdXRfYnVmZmVyKys7Cit9CisKKyNkZWZpbmUgVEhJUygpICggKmlucHV0X3B0ciApCisjZGVmaW5lIE5FWFQoKSB7IGlucHV0X3B0cisrOyBpZiAoaW5wdXRfcHRyID09IGlucHV0X3B0cl9lbmQpIGZpbGwoKTsgfQorI2RlZmluZSBPVVQoeCkgeyAqb3V0cHV0X3B0cisrID0gKHgpOyBpZihvdXRwdXRfcHRyID09IG91dHB1dF9wdHJfZW5kKSAgZmx1c2goKTsgfQorCitzdGF0aWMgdm9pZAord3JpdGVfaW50ICh2YWx1ZSkKKyAgICAgaW50IHZhbHVlOworeworICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMjcpCisgICAgeworICAgICAgT1VUICh2YWx1ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KKyAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLworICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKKwl7CisJICBsZW5ndGggPSA0OworCX0KKyAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMGZmMDAwMCkKKwl7CisJICBsZW5ndGggPSAzOworCX0KKyAgICAgIGVsc2UgaWYgKHZhbHVlICYgMHgwMDAwZmYwMCkKKwl7CisJICBsZW5ndGggPSAyOworCX0KKyAgICAgIGVsc2UKKwlsZW5ndGggPSAxOworCisgICAgICBPVVQgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtICsgbGVuZ3RoKTsKKyAgICAgIHN3aXRjaCAobGVuZ3RoKQorCXsKKwljYXNlIDQ6CisJICBPVVQgKHZhbHVlID4+IDI0KTsKKwljYXNlIDM6CisJICBPVVQgKHZhbHVlID4+IDE2KTsKKwljYXNlIDI6CisJICBPVVQgKHZhbHVlID4+IDgpOworCWNhc2UgMToKKwkgIE9VVCAodmFsdWUpOworCX0KKworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfaWQgKCkKK3sKKyAgaW50IGxlbmd0aCA9IFRISVMgKCk7CisgIGNoYXIgY2g7CisgIE9VVCAobGVuZ3RoKTsKKyAgTkVYVCAoKTsKKyAgd2hpbGUgKGxlbmd0aC0tKQorICAgIHsKKyAgICAgIGNoID0gVEhJUyAoKTsKKyAgICAgIE9VVCAoY2gpOworICAgICAgTkVYVCAoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVkFSKHgpICgoeCB8IDB4ODApKQorc3RhdGljIHZvaWQKK2NvcHlfZXhwcmVzc2lvbiAoKQoreworICBpbnQgc3RhY2tbMTBdOworICBpbnQgKnRvcyA9IHN0YWNrOworICBpbnQgdmFsdWUgPSAwOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBzd2l0Y2ggKFRISVMgKCkpCisJeworCWNhc2UgMHg4NDoKKwkgIE5FWFQgKCk7CisJICB2YWx1ZSA9IFRISVMgKCk7CisJICBORVhUICgpOworCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOworCSAgTkVYVCAoKTsKKwkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKKwkgIE5FWFQgKCk7CisJICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7CisJICBORVhUICgpOworCSAgKnRvcysrID0gdmFsdWU7CisJICBicmVhazsKKwljYXNlIDB4ODM6CisJICBORVhUICgpOworCSAgdmFsdWUgPSBUSElTICgpOworCSAgTkVYVCAoKTsKKwkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKKwkgIE5FWFQgKCk7CisJICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7CisJICBORVhUICgpOworCSAgKnRvcysrID0gdmFsdWU7CisJICBicmVhazsKKwljYXNlIDB4ODI6CisJICBORVhUICgpOworCSAgdmFsdWUgPSBUSElTICgpOworCSAgTkVYVCAoKTsKKwkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKKwkgIE5FWFQgKCk7CisJICAqdG9zKysgPSB2YWx1ZTsKKwkgIGJyZWFrOworCWNhc2UgMHg4MToKKwkgIE5FWFQgKCk7CisJICB2YWx1ZSA9IFRISVMgKCk7CisJICBORVhUICgpOworCSAgKnRvcysrID0gdmFsdWU7CisJICBicmVhazsKKwljYXNlIDB4ODA6CisJICBORVhUICgpOworCSAgKnRvcysrID0gMDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBpZiAoVEhJUyAoKSA+IDB4ODQpCisJICAgIHsKKwkgICAgICAvKiBOb3QgYSBudW1iZXIsIGp1c3QgYnVnIG91dCB3aXRoIHRoZSBhbnN3ZXIgKi8KKwkgICAgICB3cml0ZV9pbnQgKCooLS10b3MpKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgICp0b3MrKyA9IFRISVMgKCk7CisJICBORVhUICgpOworCSAgdmFsdWUgPSAwOworCSAgYnJlYWs7CisJY2FzZSAweGE1OgorCSAgLyogUExVUyBhbnl0aGluZyAqLworCSAgeworCSAgICBpbnQgdmFsdWUgPSAqKC0tdG9zKTsKKwkgICAgdmFsdWUgKz0gKigtLXRvcyk7CisJICAgICp0b3MrKyA9IHZhbHVlOworCSAgICBORVhUICgpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBWQVIgKCdSJyk6CisJICB7CisJICAgIGludCBzZWN0aW9uX251bWJlcjsKKwkgICAgaWVlZV9kYXRhX3R5cGUgKmllZWU7CisJICAgIGFzZWN0aW9uICpzOworCSAgICBORVhUICgpOworCSAgICBzZWN0aW9uX251bWJlciA9IFRISVMgKCk7CisKKwkgICAgTkVYVCAoKTsKKwkgICAgaWVlZSA9IElFRUVfREFUQSAoaW5wdXRfYmZkKTsKKwkgICAgcyA9IGllZWUtPnNlY3Rpb25fdGFibGVbc2VjdGlvbl9udW1iZXJdOworCSAgICBpZiAocy0+b3V0cHV0X3NlY3Rpb24pCisJICAgICAgeworCQl2YWx1ZSA9IHMtPm91dHB1dF9zZWN0aW9uLT5sbWE7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQl2YWx1ZSA9IDA7CisJICAgICAgfQorCSAgICB2YWx1ZSArPSBzLT5vdXRwdXRfb2Zmc2V0OworCSAgICAqdG9zKysgPSB2YWx1ZTsKKwkgICAgdmFsdWUgPSAwOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDkwOgorCSAgeworCSAgICBORVhUICgpOworCSAgICB3cml0ZV9pbnQgKCooLS10b3MpKTsKKwkgICAgT1VUICgweDkwKTsKKwkgICAgcmV0dXJuOworCisJICB9CisJfQorICAgIH0KKworfQorCisvKiBEcm9wIHRoZSBpbnQgaW4gdGhlIGJ1ZmZlciwgYW5kIGNvcHkgYSBudWxsIGludG8gdGhlIGdhcCwgd2hpY2ggd2UKKyAgIHdpbGwgb3ZlcndyaXRlIGxhdGVyICovCisKK3N0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICpwdHJwOworICBpbnQgYnVmZmVyOworfTsKKworc3RhdGljIHZvaWQKK2ZpbGxfaW50IChidWYpCisgICAgIHN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCAqYnVmOworeworICBpZiAoYnVmLT5idWZmZXIgPT0gb3V0cHV0X2J1ZmZlcikKKyAgICB7CisgICAgICAvKiBTdGlsbCBhIGNoYW5jZSB0byBvdXRwdXQgdGhlIHNpemUgKi8KKyAgICAgIGludCB2YWx1ZSA9IG91dHB1dF9wdHIgLSBidWYtPnB0cnAgKyAzOworICAgICAgYnVmLT5wdHJwWzBdID0gdmFsdWUgPj4gMjQ7CisgICAgICBidWYtPnB0cnBbMV0gPSB2YWx1ZSA+PiAxNjsKKyAgICAgIGJ1Zi0+cHRycFsyXSA9IHZhbHVlID4+IDg7CisgICAgICBidWYtPnB0cnBbM10gPSB2YWx1ZSA+PiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2Ryb3BfaW50IChidWYpCisgICAgIHN0cnVjdCBvdXRwdXRfYnVmZmVyX3N0cnVjdCAqYnVmOworeworICBpbnQgdHlwZSA9IFRISVMgKCk7CisgIGludCBjaDsKKyAgaWYgKHR5cGUgPD0gMHg4NCkKKyAgICB7CisgICAgICBORVhUICgpOworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIDB4ODQ6CisJICBjaCA9IFRISVMgKCk7CisJICBORVhUICgpOworCWNhc2UgMHg4MzoKKwkgIGNoID0gVEhJUyAoKTsKKwkgIE5FWFQgKCk7CisJY2FzZSAweDgyOgorCSAgY2ggPSBUSElTICgpOworCSAgTkVYVCAoKTsKKwljYXNlIDB4ODE6CisJICBjaCA9IFRISVMgKCk7CisJICBORVhUICgpOworCWNhc2UgMHg4MDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIE9VVCAoMHg4NCk7CisgIGJ1Zi0+cHRycCA9IG91dHB1dF9wdHI7CisgIGJ1Zi0+YnVmZmVyID0gb3V0cHV0X2J1ZmZlcjsKKyAgT1VUICgwKTsKKyAgT1VUICgwKTsKKyAgT1VUICgwKTsKKyAgT1VUICgwKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfaW50ICgpCit7CisgIGludCB0eXBlID0gVEhJUyAoKTsKKyAgaW50IGNoOworICBpZiAodHlwZSA8PSAweDg0KQorICAgIHsKKyAgICAgIE9VVCAodHlwZSk7CisgICAgICBORVhUICgpOworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIDB4ODQ6CisJICBjaCA9IFRISVMgKCk7CisJICBORVhUICgpOworCSAgT1VUIChjaCk7CisJY2FzZSAweDgzOgorCSAgY2ggPSBUSElTICgpOworCSAgTkVYVCAoKTsKKwkgIE9VVCAoY2gpOworCWNhc2UgMHg4MjoKKwkgIGNoID0gVEhJUyAoKTsKKwkgIE5FWFQgKCk7CisJICBPVVQgKGNoKTsKKwljYXNlIDB4ODE6CisJICBjaCA9IFRISVMgKCk7CisJICBORVhUICgpOworCSAgT1VUIChjaCk7CisJY2FzZSAweDgwOgorCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworI2RlZmluZSBJRCBjb3B5X2lkKCkKKyNkZWZpbmUgSU5UIGNvcHlfaW50KCkKKyNkZWZpbmUgRVhQIGNvcHlfZXhwcmVzc2lvbigpCitzdGF0aWMgdm9pZCBjb3B5X3RpbGxfZW5kICgpOworI2RlZmluZSBJTlRuKHEpIGNvcHlfaW50KCkKKyNkZWZpbmUgRVhQbihxKSBjb3B5X2V4cHJlc3Npb24oKQorCitzdGF0aWMgdm9pZAorZjFfcmVjb3JkICgpCit7CisgIGludCBjaDsKKyAgLyogQVROIHJlY29yZCAqLworICBORVhUICgpOworICBjaCA9IFRISVMgKCk7CisgIHN3aXRjaCAoY2gpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBPVVQgKDB4ZjEpOworICAgICAgT1VUIChjaCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4Yzk6CisgICAgICBORVhUICgpOworICAgICAgT1VUICgweGYxKTsKKyAgICAgIE9VVCAoMHhjOSk7CisgICAgICBJTlQ7CisgICAgICBJTlQ7CisgICAgICBjaCA9IFRISVMgKCk7CisgICAgICBzd2l0Y2ggKGNoKQorCXsKKwljYXNlIDB4MTY6CisJICBORVhUICgpOworCSAgYnJlYWs7CisJY2FzZSAweDAxOgorCSAgTkVYVCAoKTsKKwkgIGJyZWFrOworCWNhc2UgMHgwMDoKKwkgIE5FWFQgKCk7CisJICBJTlQ7CisJICBicmVhazsKKwljYXNlIDB4MDM6CisJICBORVhUICgpOworCSAgSU5UOworCSAgYnJlYWs7CisJY2FzZSAweDEzOgorCSAgRVhQbiAoaW5zdHJ1Y3Rpb24gYWRkcmVzcyk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQ4OgorICAgICAgLyogRVh0ZXJuYWwgcmVmICovCisgICAgICBORVhUICgpOworICAgICAgT1VUICgweGYxKTsKKyAgICAgIE9VVCAoMHhkOCk7CisgICAgICBFWFA7CisgICAgICBFWFA7CisgICAgICBFWFA7CisgICAgICBFWFA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4Y2U6CisgICAgICBORVhUICgpOworICAgICAgT1VUICgweGYxKTsKKyAgICAgIE9VVCAoMHhjZSk7CisgICAgICBJTlQ7CisgICAgICBJTlQ7CisgICAgICBjaCA9IFRISVMgKCk7CisgICAgICBJTlQ7CisgICAgICBzd2l0Y2ggKGNoKQorCXsKKwljYXNlIDB4MDE6CisJICBJTlQ7CisJICBJTlQ7CisJICBicmVhazsKKwljYXNlIDB4MDI6CisJICBJTlQ7CisJICBicmVhazsKKwljYXNlIDB4MDQ6CisJICBFWFBuIChleHRlcm5hbCBmdW5jdGlvbik7CisJICBicmVhazsKKwljYXNlIDB4MDU6CisJICBicmVhazsKKwljYXNlIDB4MDc6CisJICBJTlRuIChsaW5lIG51bWJlcik7CisJICBJTlQ7CisJY2FzZSAweDA4OgorCSAgYnJlYWs7CisJY2FzZSAweDBhOgorCSAgSU5UbiAobG9ja2VkIHJlZ2lzdGVyKTsKKwkgIElOVDsKKwkgIGJyZWFrOworCWNhc2UgMHgzZjoKKwkgIGNvcHlfdGlsbF9lbmQgKCk7CisJICBicmVhazsKKwljYXNlIDB4M2U6CisJICBjb3B5X3RpbGxfZW5kICgpOworCSAgYnJlYWs7CisJY2FzZSAweDQwOgorCSAgY29weV90aWxsX2VuZCAoKTsKKwkgIGJyZWFrOworCWNhc2UgMHg0MToKKwkgIElEOworCSAgYnJlYWs7CisJfQorICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorZjBfcmVjb3JkICgpCit7CisgIC8qIEF0dHJpYnV0ZSByZWNvcmQgKi8KKyAgTkVYVCAoKTsKKyAgT1VUICgweGYwKTsKKyAgSU5UbiAoU3ltYm9sIG5hbWUpOworICBJRDsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfdGlsbF9lbmQgKCkKK3sKKyAgaW50IGNoID0gVEhJUyAoKTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgd2hpbGUgKGNoIDw9IDB4ODApCisJeworCSAgT1VUIChjaCk7CisJICBORVhUICgpOworCSAgY2ggPSBUSElTICgpOworCX0KKyAgICAgIHN3aXRjaCAoY2gpCisJeworCWNhc2UgMHg4NDoKKwkgIE9VVCAoVEhJUyAoKSk7CisJICBORVhUICgpOworCWNhc2UgMHg4MzoKKwkgIE9VVCAoVEhJUyAoKSk7CisJICBORVhUICgpOworCWNhc2UgMHg4MjoKKwkgIE9VVCAoVEhJUyAoKSk7CisJICBORVhUICgpOworCWNhc2UgMHg4MToKKwkgIE9VVCAoVEhJUyAoKSk7CisJICBORVhUICgpOworCSAgT1VUIChUSElTICgpKTsKKwkgIE5FWFQgKCk7CisKKwkgIGNoID0gVEhJUyAoKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICByZXR1cm47CisJfQorICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorZjJfcmVjb3JkICgpCit7CisgIE5FWFQgKCk7CisgIE9VVCAoMHhmMik7CisgIElOVDsKKyAgTkVYVCAoKTsKKyAgT1VUICgweGNlKTsKKyAgSU5UOworICBjb3B5X3RpbGxfZW5kICgpOworfQorCisKK3N0YXRpYyB2b2lkIGJsb2NrICgpOworc3RhdGljIHZvaWQKK2Y4X3JlY29yZCAoKQoreworICBpbnQgY2g7CisgIE5FWFQgKCk7CisgIGNoID0gVEhJUyAoKTsKKyAgc3dpdGNoIChjaCkKKyAgICB7CisgICAgY2FzZSAweDAxOgorICAgIGNhc2UgMHgwMjoKKyAgICBjYXNlIDB4MDM6CisgICAgICAvKiBVbmlxdWUgdHlwZWRlZnMgZm9yIG1vZHVsZSAqLworICAgICAgLyogR0xvYmFsIHR5cGVkZWZzICAqLworICAgICAgLyogSGlnaCBsZXZlbCBtb2R1bGUgc2NvcGUgYmVnaW5uaW5nICovCisgICAgICB7CisJc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOworCU5FWFQgKCk7CisJT1VUICgweGY4KTsKKwlPVVQgKGNoKTsKKwlkcm9wX2ludCAoJm9iKTsKKwlJRDsKKworCWJsb2NrICgpOworCisJTkVYVCAoKTsKKwlmaWxsX2ludCAoJm9iKTsKKwlPVVQgKDB4ZjkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA0OgorICAgICAgLyogR2xvYmFsIGZ1bmN0aW9uICovCisgICAgICB7CisJc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOworCU5FWFQgKCk7CisJT1VUICgweGY4KTsKKwlPVVQgKDB4MDQpOworCWRyb3BfaW50ICgmb2IpOworCUlEOworCUlOVG4gKHN0YWNrIHNpemUpOworCUlOVG4gKHJldCB2YWwpOworCUVYUG4gKG9mZnNldCk7CisKKwlibG9jayAoKTsKKworCU5FWFQgKCk7CisJT1VUICgweGY5KTsKKwlFWFBuIChzaXplIG9mIGJsb2NrKTsKKwlmaWxsX2ludCAoJm9iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDA1OgorICAgICAgLyogRmlsZSBuYW1lIGZvciBzb3VyY2UgbGluZSBudW1iZXJzICovCisgICAgICB7CisJc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOworCU5FWFQgKCk7CisJT1VUICgweGY4KTsKKwlPVVQgKDB4MDUpOworCWRyb3BfaW50ICgmb2IpOworCUlEOworCUlOVG4gKHllYXIpOworCUlOVG4gKG1vbnRoKTsKKwlJTlRuIChkYXkpOworCUlOVG4gKGhvdXIpOworCUlOVG4gKG1vbnV0ZSk7CisJSU5UbiAoc2Vjb25kKTsKKwlibG9jayAoKTsKKwlORVhUICgpOworCU9VVCAoMHhmOSk7CisJZmlsbF9pbnQgKCZvYik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwNjoKKyAgICAgIC8qIExvY2FsIGZ1bmN0aW9uICovCisgICAgICB7CisJc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOworCU5FWFQgKCk7CisJT1VUICgweGY4KTsKKwlPVVQgKDB4MDYpOworCWRyb3BfaW50ICgmb2IpOworCUlEOworCUlOVG4gKHN0YWNrIHNpemUpOworCUlOVG4gKHR5cGUgcmV0dXJuKTsKKwlFWFBuIChvZmZzZXQpOworCWJsb2NrICgpOworCU5FWFQgKCk7CisJT1VUICgweGY5KTsKKwlFWFBuIChzaXplKTsKKwlmaWxsX2ludCAoJm9iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDBhOgorICAgICAgLyogQXNzZW1ibGVyIG1vZHVsZSBzY29wZSBiZWdpbm5pbmcgLSovCisgICAgICB7CisJc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOworCisJTkVYVCAoKTsKKwlPVVQgKDB4ZjgpOworCU9VVCAoMHgwYSk7CisJZHJvcF9pbnQgKCZvYik7CisJSUQ7CisJSUQ7CisJSU5UOworCUlEOworCUlOVDsKKwlJTlQ7CisJSU5UOworCUlOVDsKKwlJTlQ7CisJSU5UOworCisJYmxvY2sgKCk7CisKKwlORVhUICgpOworCU9VVCAoMHhmOSk7CisJZmlsbF9pbnQgKCZvYik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGI6CisgICAgICB7CisJc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0IG9iOworCU5FWFQgKCk7CisJT1VUICgweGY4KTsKKwlPVVQgKDB4MGIpOworCWRyb3BfaW50ICgmb2IpOworCUlEOworCUlOVDsKKwlJTlRuIChzZWN0aW9uIGluZGV4KTsKKwlFWFBuIChvZmZzZXQpOworCUlOVG4gKHN0dWZmKTsKKworCWJsb2NrICgpOworCisJT1VUICgweGY5KTsKKwlORVhUICgpOworCUVYUG4gKFNpemUgaW4gTWF1cyk7CisJZmlsbF9pbnQgKCZvYik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitlMl9yZWNvcmQgKCkKK3sKKyAgT1VUICgweGUyKTsKKyAgTkVYVCAoKTsKKyAgT1VUICgweGNlKTsKKyAgTkVYVCAoKTsKKyAgSU5UOworICBFWFA7Cit9CisKK3N0YXRpYyB2b2lkCitibG9jayAoKQoreworICBpbnQgY2g7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoID0gVEhJUyAoKTsKKyAgICAgIHN3aXRjaCAoY2gpCisJeworCWNhc2UgMHhlMToKKwljYXNlIDB4ZTU6CisJICByZXR1cm47CisJY2FzZSAweGY5OgorCSAgcmV0dXJuOworCWNhc2UgMHhmMDoKKwkgIGYwX3JlY29yZCAoKTsKKwkgIGJyZWFrOworCWNhc2UgMHhmMToKKwkgIGYxX3JlY29yZCAoKTsKKwkgIGJyZWFrOworCWNhc2UgMHhmMjoKKwkgIGYyX3JlY29yZCAoKTsKKwkgIGJyZWFrOworCWNhc2UgMHhmODoKKwkgIGY4X3JlY29yZCAoKTsKKwkgIGJyZWFrOworCWNhc2UgMHhlMjoKKwkgIGUyX3JlY29yZCAoKTsKKwkgIGJyZWFrOworCisJfQorICAgIH0KK30KKworCisKKy8qIHJlbG9jYXRlX2RlYnVnLAorICAgbW92ZXMgYWxsIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgYmZkIHRvIHRoZSBvdXRwdXQKKyAgIGJmZCwgYW5kIHJlbG9jYXRlcyBhbnkgZXhwcmVzc2lvbnMgaXQgZmluZHMKKyovCisKK3N0YXRpYyB2b2lkCityZWxvY2F0ZV9kZWJ1ZyAob3V0cHV0LCBpbnB1dCkKKyAgICAgYmZkICpvdXRwdXQ7CisgICAgIGJmZCAqaW5wdXQ7Cit7CisjZGVmaW5lIElCUyA0MDAKKyNkZWZpbmUgT0JTIDQwMAorICB1bnNpZ25lZCBjaGFyIGlucHV0X2J1ZmZlcltJQlNdOworCisgIGlucHV0X3B0cl9zdGFydCA9IGlucHV0X3B0ciA9IGlucHV0X2J1ZmZlcjsKKyAgaW5wdXRfcHRyX2VuZCA9IGlucHV0X2J1ZmZlciArIElCUzsKKyAgaW5wdXRfYmZkID0gaW5wdXQ7CisgIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCisgICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCisgIGJmZF9yZWFkICgoUFRSKSBpbnB1dF9wdHJfc3RhcnQsIDEsIElCUywgaW5wdXQpOworICBibG9jayAoKTsKK30KKworLyoKKyAgRHVyaW5nIGxpbmtpbmcsIHdlIHdlIHRvbGQgYWJvdXQgdGhlIGJmZHMgd2hpY2ggbWFkZSB1cCBvdXIKKyAgY29udGVudHMsIHdlIGhhdmUgYSBsaXN0IG9mIHRoZW0uIFRoZXkgd2lsbCBzdGlsbCBiZSBvcGVuLCBzbyBnbyB0bworICB0aGUgZGVidWcgaW5mbyBpbiBlYWNoLCBhbmQgY29weSBpdCBvdXQsIHJlbG9jYXRpbmcgaXQgYXMgd2UgZ28uCisqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV9kZWJ1Z19wYXJ0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKKyAgYmZkX2NoYWluX3R5cGUgKmNoYWluID0gaWVlZS0+Y2hhaW5fcm9vdDsKKyAgdW5zaWduZWQgY2hhciBvdXRwdXRfYnVmZmVyW09CU107CisgIGJvb2xlYW4gc29tZV9kZWJ1ZyA9IGZhbHNlOworICBmaWxlX3B0ciBoZXJlID0gYmZkX3RlbGwgKGFiZmQpOworCisgIG91dHB1dF9wdHJfc3RhcnQgPSBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZmZlcjsKKyAgb3V0cHV0X3B0cl9lbmQgPSBvdXRwdXRfYnVmZmVyICsgT0JTOworICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZmZlcjsKKyAgb3V0cHV0X2JmZCA9IGFiZmQ7CisKKyAgaWYgKGNoYWluID09IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzOworCisgICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwlpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKKwkgIGJyZWFrOworICAgICAgaWYgKHMgPT0gTlVMTCkKKwl7CisJICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gaGVyZTsKKyAgICAgIGlmIChiZmRfd3JpdGUgKHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIGFiZmQpICE9IHMtPl9yYXdfc2l6ZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKGNoYWluICE9IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMKQorCXsKKwkgIGJmZCAqZW50cnkgPSBjaGFpbi0+dGhpczsKKwkgIGllZWVfZGF0YV90eXBlICplbnRyeV9pZWVlID0gSUVFRV9EQVRBIChlbnRyeSk7CisJICBpZiAoZW50cnlfaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQpCisJICAgIHsKKwkgICAgICBpZiAoYmZkX3NlZWsgKGVudHJ5LCBlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCwKKwkJCSAgICBTRUVLX1NFVCkKKwkJICAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcmVsb2NhdGVfZGVidWcgKGFiZmQsIGVudHJ5KTsKKwkgICAgfQorCisJICBjaGFpbiA9IGNoYWluLT5uZXh0OworCX0KKyAgICAgIGlmIChzb21lX2RlYnVnKQorCXsKKwkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gaGVyZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSAwOworCX0KKworICAgICAgZmx1c2ggKCk7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSB0aGUgZGF0YSBpbiBhbiBpZWVlIHdheS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2RhdGFfcGFydCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqczsKKyAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOworICBpZWVlLT53LnIuZGF0YV9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgLyogU2tpcCBzZWN0aW9ucyB0aGF0IGhhdmUgbm8gbG9hZGFibGUgY29udGVudHMgKC5ic3MsCisgICAgICAgICBkZWJ1Z2dpbmcsIGV0Yy4pICAqLworICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBTb3J0IHRoZSByZWxvYyByZWNvcmRzIHNvIHdlIGNhbiBpbnNlcnQgdGhlbSBpbiB0aGUgY29ycmVjdAorCSBwbGFjZXMgKi8KKyAgICAgIGlmIChzLT5yZWxvY19jb3VudCAhPSAwKQorCXsKKwkgIGlmICghIGRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBkb193aXRob3V0X3JlbG9jcyAoYWJmZCwgcykpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBib29sZWFuCitpbml0X2Zvcl9vdXRwdXQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKnM7CisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKKwljb250aW51ZTsKKyAgICAgIGlmIChzLT5fcmF3X3NpemUgIT0gMCkKKwl7CisJICBpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSAoYmZkX2FsbG9jIChhYmZkLCBzLT5fcmF3X3NpemUpKTsKKwkgIGlmICghaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGEpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qKiBleGVjIGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KKworLyogc2V0IHNlY3Rpb24gY29udGVudHMgaXMgY29tcGxpY2F0ZWQgd2l0aCBJRUVFIHNpbmNlIHRoZSBmb3JtYXQgaXMKKyogbm90IGEgYnl0ZSBpbWFnZSwgYnV0IGEgcmVjb3JkIHN0cmVhbS4KKyovCitib29sZWFuCitpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKKyAgICB7CisgICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKKwl7CisJICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQorCQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKSk7CisJICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIC8qIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgZXZlcnl0aGluZworICAgICAgICAgaXMgd2l0aGluIHJhbmdlLiAgKi8KKyAgICAgIG1lbWNweSAoc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID09IChiZmRfYnl0ZSAqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghaW5pdF9mb3Jfb3V0cHV0IChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBtZW1jcHkgKChQVFIpIChpZWVlX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArIG9mZnNldCksCisJICAoUFRSKSBsb2NhdGlvbiwKKwkgICh1bnNpZ25lZCBpbnQpIGNvdW50KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIHRoZSBleHRlcm5hbCBzeW1ib2xzIG9mIGEgZmlsZS4gIElFRUUgY29uc2lkZXJzIHR3byBzb3J0cyBvZgorICAgZXh0ZXJuYWwgc3ltYm9scywgcHVibGljLCBhbmQgcmVmZXJlbmNlZC4gIEl0IHVzZXMgdG8gaW50ZXJuYWwKKyAgIGZvcm1zIHRvIGluZGV4IHRoZW0gYXMgd2VsbC4gIFdoZW4gd2Ugd3JpdGUgdGhlbSBvdXQgd2UgdHVybiB0aGVpcgorICAgc3ltYm9sIHZhbHVlcyBpbnRvIGluZGV4ZXMgZnJvbSB0aGUgcmlnaHQgYmFzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXN5bWJvbCAqKnE7CisgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKKworICB1bnNpZ25lZCBpbnQgcmVmZXJlbmNlX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKKyAgdW5zaWduZWQgaW50IHB1YmxpY19pbmRleCA9IElFRUVfUFVCTElDX0JBU0UgKyAyOworICBmaWxlX3B0ciBoZXJlID0gYmZkX3RlbGwgKGFiZmQpOworICBib29sZWFuIGhhZG9uZSA9IGZhbHNlOworICBpZiAoYWJmZC0+b3V0c3ltYm9scyAhPSAoYXN5bWJvbCAqKikgTlVMTCkKKyAgICB7CisKKyAgICAgIGZvciAocSA9IGFiZmQtPm91dHN5bWJvbHM7ICpxICE9IChhc3ltYm9sICopIE5VTEw7IHErKykKKwl7CisJICBhc3ltYm9sICpwID0gKnE7CisJICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChwLT5zZWN0aW9uKSkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIHN5bWJvbCByZWZlcmVuY2UgLi4gKi8KKwkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCisJCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQorCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKKwkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKKwkgICAgICBoYWRvbmUgPSB0cnVlOworCSAgICB9CisJICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIHdlYWsgcmVmZXJlbmNlICovCisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQorCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKKwkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCisJCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCisJCQkJCWllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKKwkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCisJCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcC0+dmFsdWUpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgcC0+dmFsdWUgPSByZWZlcmVuY2VfaW5kZXg7CisJICAgICAgcmVmZXJlbmNlX2luZGV4Kys7CisJICAgICAgaGFkb25lID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAocC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQorCSAgICB7CisJICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIGRlZmluaXRpb24gKi8KKworCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSkKKwkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpCisJCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKQorCQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIGllZWVfYXR0cmlidXRlX3JlY29yZF9lbnVtKQorCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKKwkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMTUpIC8qIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKwkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMTkpIC8qIHN0YXRpYyBzeW1ib2wgKi8KKwkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMSkpIC8qIG9uZSBvZiB0aGVtICovCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgdmFsdWUgKi8KKwkgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV92YWx1ZV9yZWNvcmRfZW51bSkKKwkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwdWJsaWNfaW5kZXgpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChwLT5zZWN0aW9uKSkKKwkJeworCQkgIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKKwkJICAgIHsKKwkJICAgICAgLyogSWYgZnVsbHkgbGlua2VkLCB0aGVuIG91dHB1dCBhbGwgc3ltYm9scworCQkJIHJlbG9jYXRlZCAqLworCQkgICAgICBpZiAoISAoaWVlZV93cml0ZV9pbnQKKwkJCSAgICAgKGFiZmQsCisJCQkgICAgICAocC0+dmFsdWUKKwkJCSAgICAgICArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCSAgICAgICArIHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpZiAoISAoaWVlZV93cml0ZV9leHByZXNzaW9uCisJCQkgICAgIChhYmZkLAorCQkJICAgICAgcC0+dmFsdWUgKyBwLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAorCQkJICAgICAgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnN5bWJvbCwKKwkJCSAgICAgIGZhbHNlLCAwKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoISBpZWVlX3dyaXRlX2V4cHJlc3Npb24gKGFiZmQsCisJCQkJCSAgICAgICBwLT52YWx1ZSwKKwkJCQkJICAgICAgIGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCwKKwkJCQkJICAgICAgIGZhbHNlLCAwKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICAgIHAtPnZhbHVlID0gcHVibGljX2luZGV4OworCSAgICAgIHB1YmxpY19pbmRleCsrOworCSAgICAgIGhhZG9uZSA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiAtIHdoZW4gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHN5bWJvbHMgcmVhZCAqLworCSAgICAgIC8qIGZyb20gYW4gaW5wdXQgaWVlZSBmaWxlICovCisJICAgIH0KKwl9CisgICAgfQorICBpZiAoaGFkb25lKQorICAgIGllZWUtPncuci5leHRlcm5hbF9wYXJ0ID0gaGVyZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBleHRlbltdID0KK3sKKyAgMHhmMCwgMHgyMCwgMHgwMCwKKyAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzcsIDMsIDMsCS8qIFNldCB2ZXJzaW9uIDMgcmV2IDMgICAJKi8KKyAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzksIDIsLyoga2VlcCBzeW1ib2wgaW4gIG9yaWdpbmFsIGNhc2UgKi8KKyAgMHhmMSwgMHhjZSwgMHgyMCwgMHgwMCwgMzgJLyogc2V0IG9iamVjdCB0eXBlIHJlbG9jYXRlYWJsZSB0byB4ICovCit9OworCitzdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBlbnZpW10gPQoreworICAweGYwLCAweDIxLCAweDAwLAorCisvKiAgICAweGYxLCAweGNlLCAweDIxLCAwMCwgNTAsIDB4ODIsIDB4MDcsIDB4YzcsIDB4MDksIDB4MTEsIDB4MTEsCisgICAgMHgxOSwgMHgyYywKKyovCisgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MiwgMHgwMCwJLyogZXhlYyBvayAqLworCisgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAsIDUzLCAweDAzLC8qIGhvc3QgdW5peCAqLworLyogICAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTQsIDIsMSwxCXRvb2wgJiB2ZXJzaW9uICMgKi8KK307CisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX21lX3BhcnQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOworICBpZWVlLT53LnIudHJhaWxlcl9wYXJ0ID0gYmZkX3RlbGwgKGFiZmQpOworICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcykKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV92YWx1ZV9zdGFydGluZ19hZGRyZXNzX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBhYmZkLT5zdGFydF9hZGRyZXNzKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgaWVlZS0+dy5yLm1lX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKKyAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9lbmRfZW51bSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IHRoZSBJRUVFIHByb2Nlc3NvciBJRC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX3Byb2Nlc3NvciAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7CisKKyAgYXJjaCA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKTsKKyAgc3dpdGNoIChhcmNoLT5hcmNoKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgYmZkX3ByaW50YWJsZV9uYW1lIChhYmZkKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9hcmNoX2EyOWs6CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiMjkwMDAiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvMzAwIikpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgorICAgICAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIkg4LzUwMCIpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfYXJjaF9pOTYwOgorICAgICAgc3dpdGNoIChhcmNoLT5tYWNoKQorCXsKKwlkZWZhdWx0OgorCWNhc2UgYmZkX21hY2hfaTk2MF9jb3JlOgorCWNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYToKKwkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MEtBIikpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSBiZmRfbWFjaF9pOTYwX2tiX3NiOgorCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0IiKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwljYXNlIGJmZF9tYWNoX2k5NjBfY2E6CisJICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBDQSIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCWNhc2UgYmZkX21hY2hfaTk2MF9tYzoKKwljYXNlIGJmZF9tYWNoX2k5NjBfeGE6CisJICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBNQyIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKKyAgICAgIHsKKwljb25zdCBjaGFyICppZDsKKworCXN3aXRjaCAoYXJjaC0+bWFjaCkKKwkgIHsKKwkgIGRlZmF1bHQ6CQlpZCA9ICI2ODAyMCI7IGJyZWFrOworCSAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6IGlkID0gIjY4MDAwIjsgYnJlYWs7CisJICBjYXNlIGJmZF9tYWNoX202ODAwODogaWQgPSAiNjgwMDgiOyBicmVhazsKKwkgIGNhc2UgYmZkX21hY2hfbTY4MDEwOiBpZCA9ICI2ODAxMCI7IGJyZWFrOworCSAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6IGlkID0gIjY4MDIwIjsgYnJlYWs7CisJICBjYXNlIGJmZF9tYWNoX202ODAzMDogaWQgPSAiNjgwMzAiOyBicmVhazsKKwkgIGNhc2UgYmZkX21hY2hfbTY4MDQwOiBpZCA9ICI2ODA0MCI7IGJyZWFrOworCSAgY2FzZSBiZmRfbWFjaF9tNjgwNjA6IGlkID0gIjY4MDYwIjsgYnJlYWs7CisJICBjYXNlIGJmZF9tYWNoX2NwdTMyOiAgaWQgPSAiY3B1MzIiOyBicmVhazsKKwkgIH0KKworCWlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsIGlkKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbGVhbgoraWVlZV93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgaTsKKyAgZmlsZV9wdHIgb2xkOworCisgIC8qIEZhc3QgZm9yd2FyZCBvdmVyIHRoZSBoZWFkZXIgYXJlYSAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9tb2R1bGVfYmVnaW5uaW5nX2VudW0pCisgICAgICB8fCAhIGllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBhYmZkLT5maWxlbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZhc3QgZm9yd2FyZCBvdmVyIHRoZSB2YXJpYWJsZSBiaXRzICovCisgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfZW51bSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEJpdHMgcGVyIE1BVSAqLworICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUgKGFiZmQpKSkpCisgICAgcmV0dXJuIGZhbHNlOworICAvKiBNQVUncyBwZXIgYWRkcmVzcyAqLworICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCisJCQkgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkKKwkJCQkgICAgIC8gYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgb2xkID0gYmZkX3RlbGwgKGFiZmQpOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKDggKiBOX1dfVkFSSUFCTEVTKSwgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGllZWUtPncuci5leHRlbnNpb25fcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOworICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBleHRlbiwgMSwgc2l6ZW9mIChleHRlbiksIGFiZmQpICE9IHNpemVvZiAoZXh0ZW4pKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgxKSkgLyogQWJzb2x1dGUgKi8KKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDIpKSAvKiBSZWxvY2F0ZWFibGUgKi8KKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGllZWUtPncuci5lbnZpcm9ubWVudGFsX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKTsKKyAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgZW52aSwgMSwgc2l6ZW9mIChlbnZpKSwgYWJmZCkgIT0gc2l6ZW9mIChlbnZpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIEhQIGVtdWxhdG9yIGRhdGFiYXNlIHJlcXVpcmVzIGEgdGltZXN0YW1wIGluIHRoZSBmaWxlLiAgKi8KKyAgeworICAgIHRpbWVfdCBub3c7CisgICAgY29uc3Qgc3RydWN0IHRtICp0OworCisgICAgdGltZSAoJm5vdyk7CisgICAgdCA9IChzdHJ1Y3QgdG0gKikgbG9jYWx0aW1lICgmbm93KTsKKyAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCisJfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MjEpCisJfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDApCisJfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDUwKQorCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3llYXIgKyAxOTAwKQorCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21vbiArIDEpCisJfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWRheSkKKwl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9ob3VyKQorCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX21pbikKKwl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9zZWMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgb3V0cHV0X2JmZCA9IGFiZmQ7CisKKyAgZmx1c2ggKCk7CisKKyAgaWYgKCEgaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLyogRmlyc3Qgd3JpdGUgdGhlIHN5bWJvbHMuICBUaGlzIGNoYW5nZXMgdGhlaXIgdmFsdWVzIGludG8gdGFibGUKKyAgICBpbmRlY2VzIHNvIHdlIGNhbnQgdXNlIGl0IGFmdGVyIHRoaXMgcG9pbnQuICAqLworICBpZiAoISBpZWVlX3dyaXRlX2V4dGVybmFsX3BhcnQgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiAgaWVlZV93cml0ZV9ieXRlKGFiZmQsIGllZWVfcmVjb3JkX3NlcGVyYXRvcl9lbnVtKTsqLworCisgIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCisKKworICAvKiBXcml0ZSBhbnkgZGVidWdzIHdlIGhhdmUgYmVlbiB0b2xkIGFib3V0LiAgKi8KKyAgaWYgKCEgaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogQ2FuIG9ubHkgd3JpdGUgdGhlIGRhdGEgb25jZSB0aGUgc3ltYm9scyBoYXZlIGJlZW4gd3JpdHRlbiwgc2luY2UKKyAgICAgdGhlIGRhdGEgY29udGFpbnMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aGljaCBwb2ludHMgdG8gdGhlCisgICAgIHN5bWJvbHMuICAqLworICBpZiAoISBpZWVlX3dyaXRlX2RhdGFfcGFydCAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEF0IHRoZSBlbmQgd2UgcHV0IHRoZSBlbmQhICAqLworICBpZiAoISBpZWVlX3dyaXRlX21lX3BhcnQgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBHZW5lcmF0ZSB0aGUgaGVhZGVyICovCisgIGlmIChiZmRfc2VlayAoYWJmZCwgb2xkLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fV19WQVJJQUJMRVM7IGkrKykKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpIGkpCisJICB8fCAhIGllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIGllZWUtPncub2Zmc2V0W2ldKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLworCisvKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKKyAgIGZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bworICAgaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLworCithc3ltYm9sICoKK2llZWVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWVlZV9zeW1ib2xfdHlwZSAqbmV3ID0KKyAgICAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChpZWVlX3N5bWJvbF90eXBlKSk7CisgIGlmICghbmV3KQorICAgIHJldHVybiBOVUxMOworICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKyAgcmV0dXJuICZuZXctPnN5bWJvbDsKK30KKworc3RhdGljIGJmZCAqCitpZWVlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKKyAgICAgYmZkICphcmNoOworICAgICBiZmQgKnByZXY7Cit7CisgIGllZWVfYXJfZGF0YV90eXBlICphciA9IElFRUVfQVJfREFUQSAoYXJjaCk7CisgIC8qIHRha2UgdGhlIG5leHQgb25lIGZyb20gdGhlIGFyY2ggc3RhdGUsIG9yIHJlc2V0ICovCisgIGlmIChwcmV2ID09IChiZmQgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBSZXNldCB0aGUgaW5kZXggLSB0aGUgZmlyc3QgdHdvIGVudHJpZXMgYXJlIGJvZ3VzKi8KKyAgICAgIGFyLT5lbGVtZW50X2luZGV4ID0gMjsKKyAgICB9CisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGllZWVfYXJfb2JzdGFja190eXBlICpwID0gYXItPmVsZW1lbnRzICsgYXItPmVsZW1lbnRfaW5kZXg7CisgICAgICBhci0+ZWxlbWVudF9pbmRleCsrOworICAgICAgaWYgKGFyLT5lbGVtZW50X2luZGV4IDw9IGFyLT5lbGVtZW50X2NvdW50KQorCXsKKwkgIGlmIChwLT5maWxlX29mZnNldCAhPSAoZmlsZV9wdHIpIDApCisJICAgIHsKKwkgICAgICBpZiAocC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCisJCXsKKwkJICBwLT5hYmZkID0gX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIChhcmNoKTsKKwkJICBwLT5hYmZkLT5vcmlnaW4gPSBwLT5maWxlX29mZnNldDsKKwkJfQorCSAgICAgIHJldHVybiBwLT5hYmZkOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKKwkgIHJldHVybiAoYmZkICopIE5VTEw7CisJfQorCisgICAgfQorfQorCitzdGF0aWMgYm9vbGVhbgoraWVlZV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKKwkJCXNlY3Rpb24sCisJCQlzeW1ib2xzLAorCQkJb2Zmc2V0LAorCQkJZmlsZW5hbWVfcHRyLAorCQkJZnVuY3Rpb25uYW1lX3B0ciwKKwkJCWxpbmVfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYmZkX3ZtYSBvZmZzZXQ7CisgICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7CisgICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOworICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOworeworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK2llZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IHN0YXQgKmJ1ZjsKK3sKKyAgaWVlZV9hcl9kYXRhX3R5cGUgKmFyID0gKGllZWVfYXJfZGF0YV90eXBlICopIE5VTEw7CisgIGllZWVfZGF0YV90eXBlICppZWVlOworCisgIGlmIChhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCisgICAgYXIgPSBhYmZkLT5teV9hcmNoaXZlLT50ZGF0YS5pZWVlX2FyX2RhdGE7CisgIGlmIChhciA9PSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoSUVFRV9EQVRBIChhYmZkKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChpZWVlX29iamVjdF9wIChhYmZkKSA9PSBOVUxMKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7CisKKyAgYnVmLT5zdF9zaXplID0gaWVlZS0+dy5yLm1lX3JlY29yZCArIDE7CisgIGJ1Zi0+c3RfbW9kZSA9IDA2NDQ7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpZWVlX3NpemVvZl9oZWFkZXJzIChhYmZkLCB4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4geDsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGRlYnVnIGluZm8gcm91dGluZXMgYXJlIG5ldmVyIHVzZWQuICAqLworI2lmIDAKKworc3RhdGljIHZvaWQKK2llZWVfYmZkX2RlYnVnX2luZm9fc3RhcnQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKworfQorCitzdGF0aWMgdm9pZAoraWVlZV9iZmRfZGVidWdfaW5mb19lbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKworfQorCisKKy8qIEFkZCB0aGlzIHNlY3Rpb24gdG8gdGhlIGxpc3Qgb2Ygc2VjdGlvbnMgd2UgaGF2ZSBkZWJ1ZyBpbmZvIGZvciwgdG8KKyAgIGJlIHJlYWR5IHRvIG91dHB1dCBpdCBhdCBjbG9zZSB0aW1lCisgICAqLworc3RhdGljIHZvaWQKK2llZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSAoYWJmZCwgc2VjdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKHNlY3Rpb24tPm93bmVyKTsKKyAgaWVlZV9kYXRhX3R5cGUgKm91dHB1dF9pZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKKyAgLyogY2FuIG9ubHkgYWNjdW11bGF0ZSBkYXRhIGZyb20gb3RoZXIgaWVlZSBiZmRzICovCisgIGlmIChzZWN0aW9uLT5vd25lci0+eHZlYyAhPSBhYmZkLT54dmVjKQorICAgIHJldHVybjsKKyAgLyogT25seSBib3RoZXIgb25jZSBwZXIgYmZkICovCisgIGlmIChpZWVlLT5kb25lX2RlYnVnID09IHRydWUpCisgICAgcmV0dXJuOworICBpZWVlLT5kb25lX2RlYnVnID0gdHJ1ZTsKKworICAvKiBEb24ndCBib3RoZXIgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mbyAqLworICBpZiAoaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPT0gMCkKKyAgICByZXR1cm47CisKKworICAvKiBBZGQgdG8gY2hhaW4gKi8KKyAgeworICAgIGJmZF9jaGFpbl90eXBlICpuID0gKGJmZF9jaGFpbl90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChiZmRfY2hhaW5fdHlwZSkpOworICAgIGlmICghbikKKyAgICAgIGFib3J0ICgpOwkJLyogRklYTUUgKi8KKyAgICBuLT50aGlzID0gc2VjdGlvbi0+b3duZXI7CisgICAgbi0+bmV4dCA9IChiZmRfY2hhaW5fdHlwZSAqKSBOVUxMOworCisgICAgaWYgKG91dHB1dF9pZWVlLT5jaGFpbl9oZWFkKQorICAgICAgeworCW91dHB1dF9pZWVlLT5jaGFpbl9oZWFkLT5uZXh0ID0gbjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJb3V0cHV0X2llZWUtPmNoYWluX3Jvb3QgPSBuOworCisgICAgICB9CisgICAgb3V0cHV0X2llZWUtPmNoYWluX2hlYWQgPSBuOworICB9Cit9CisKKyNlbmRpZgorCisjZGVmaW5lCWllZWVfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCisjZGVmaW5lIGllZWVfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCisKKyNkZWZpbmUgaWVlZV9zbHVycF9hcm1hcCBiZmRfdHJ1ZQorI2RlZmluZSBpZWVlX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX3RydWUKKyNkZWZpbmUgaWVlZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCisgICBiZmRfdHJ1ZSkKKyNkZWZpbmUgaWVlZV90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCisjZGVmaW5lIGllZWVfd3JpdGVfYXJtYXAgXAorICAoKGJvb2xlYW4gKCopIFwKKyAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKKyAgIGJmZF90cnVlKQorI2RlZmluZSBpZWVlX3JlYWRfYXJfaGRyIGJmZF9udWxsdm9pZHB0cgorI2RlZmluZSBpZWVlX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKKyNkZWZpbmUgaWVlZV9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4CisKKyNkZWZpbmUgaWVlZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGllZWVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCisjZGVmaW5lIGllZWVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBpZWVlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgaWVlZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSBpZWVlX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAorCisjZGVmaW5lIGllZWVfc2V0X2FyY2hfbWFjaCBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaAorCisjZGVmaW5lIGllZWVfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworI2RlZmluZSBpZWVlX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAorICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgaWVlZV9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisjZGVmaW5lIGllZWVfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZGVmaW5lIGllZWVfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgaWVlZV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBpZWVlX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZGVmaW5lIGllZWVfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorCisvKlNVUFBSRVNTIDQ2MCAqLworY29uc3QgYmZkX3RhcmdldCBpZWVlX3ZlYyA9Cit7CisgICJpZWVlIiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyLAorICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUworICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgJ18nLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCisKKyAge19iZmRfZHVtbXlfdGFyZ2V0LAorICAgaWVlZV9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIGllZWVfYXJjaGl2ZV9wLAorICAgX2JmZF9kdW1teV90YXJnZXQsCisgIH0sCisgIHsKKyAgICBiZmRfZmFsc2UsCisgICAgaWVlZV9ta29iamVjdCwKKyAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAorICAgIGJmZF9mYWxzZQorICB9LAorICB7CisgICAgYmZkX2ZhbHNlLAorICAgIGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAorICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKKyAgICBiZmRfZmFsc2UsCisgIH0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoaWVlZSksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoaWVlZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGllZWUpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGllZWUpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWVlZSksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGllZWUpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgMAorfTsKZGlmZiAtLWdpdCBhL2JmZC9paGV4LmMgYi9iZmQvaWhleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTUzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaWhleC5jCkBAIC0wLDAgKzEsMTA0MSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCBIZXggb2JqZWN0cy4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IDxpYW5AY3lnbnVzLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyB3aGF0IEludGVsIEhleCBmaWxlcyBsb29rIGxpa2U6CisKKzEuIElOVEVMIEZPUk1BVFMKKworQS4gSW50ZWwgMQorCisgICAxNi1iaXQgYWRkcmVzcy1maWVsZCBmb3JtYXQsIGZvciBmaWxlcyA2NGsgYnl0ZXMgaW4gbGVuZ3RoIG9yIGxlc3MuCisKKyAgIERBVEEgUkVDT1JECisgICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKKyAgIDIuLjMJCVRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb24KKyAgIDQuLjUJCUhpZ2ggYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcworICAgNi4uNwkJTG93IGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKKyAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMCIKKyAgIDEwLi54CURhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgorCXggPSAobnVtYmVyIG9mIGJ5dGVzIC0gMSkgKiAyICsgMTEKKyAgIHgrMS4ueCsyCUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgorICAgeCszLi54KzQJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKKworICAgRU5EIFJFQ09SRAorICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQorICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAwIgorICAgNC4uNwkJVHJhbnNmZXItYWRkcmVzcyAodXN1YWxseSAiMDAwMCIpCisJCXRoZSBqdW1wLXRvIGFkZHJlc3MsIGV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzCisgICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDEiCisgICAxMC4uMTEJQ2hlY2tzdW0sIGluIGhleCBub3RhdGlvbgorICAgMTIuLjEzCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCisKK0IuIElOVEVMIDIKKworICAgTUNTLTg2IGZvcm1hdCwgdXNpbmcgYSAyMC1iaXQgYWRkcmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNjRLIGJ5dGVzLgorCisgICBEQVRBIFJFQ09SRAorICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQorICAgMi4uMwkJVGhlIGJ5dGUgY291bnQgb2YgdGhpcyByZWNvcmQsIGhleCBub3RhdGlvbgorICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCisgICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcworICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgorICAgMTAuLngJVGhlIGRhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgorCXggPSAobnVtYmVyIG9mIGRhdGEgYnl0ZXMgLSAxKSAqIDIgKyAxMQorICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCisgICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAorCisgICBFWFRFTkRFRCBBRERSRVNTIFJFQ09SRAorICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uKDopCisgICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCisgICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCisgICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDIiCisgICAxMC4uMTEJSGlnaCBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcworICAgMTIuLjEzCUxvdyBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcworICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgorICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCisKKyAgIFRoZSBjaGVja3N1bXMgYXJlIHRoZSB0d28ncyBjb21wbGVtZW50IG9mIHRoZSA4LWJpdCBzdW0KKyAgIHdpdGhvdXQgY2Fycnkgb2YgdGhlIGJ5dGUgY291bnQsIG9mZnNldCBhZGRyZXNzLCBhbmQgdGhlCisgICByZWNvcmQgdHlwZS4KKworICAgU1RBUlQgQUREUkVTUyBSRUNPUkQKKyAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKKyAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKKyAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKKyAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMyIKKyAgIDEwLi4xMwk4MDg2IENTIHZhbHVlCisgICAxNC4uMTcJODA4NiBJUCB2YWx1ZQorICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgorICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCisKK0Fub3RoZXIgZG9jdW1lbnQgcmVwb3J0cyB0aGVzZSBhZGRpdGlvbmFsIHR5cGVzOgorCisgICBFWFRFTkRFRCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKKyAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKKyAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKKyAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKKyAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNCIKKyAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIGFkZHJlc3Mgb2Ygc3Vic2VxdWVudCByZWNvcmRzCisgICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCisgICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKKworICAgU1RBUlQgTElORUFSIEFERFJFU1MgUkVDT1JECisgICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCisgICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCisgICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCisgICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDUiCisgICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCisgICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCisgICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKKworVGhlIE1SSSBjb21waWxlciB1c2VzIHRoaXMsIHdoaWNoIGlzIGEgcmVwZWF0IG9mIHR5cGUgNToKKworICBFWFRFTkRFRCBTVEFSVCBSRUNPUkQKKyAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKKyAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKKyAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKKyAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKKyAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKKyAgIDE0Li4xNwlMb3dlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKKyAgIDE4Li4xOQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KKyAgIDIwLi4yMQlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAorKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIHZvaWQgaWhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBib29sZWFuIGloZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBJTkxJTkUgaW50IGloZXhfZ2V0X2J5dGUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gKikpOworc3RhdGljIHZvaWQgaWhleF9iYWRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBpbnQsIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIGloZXhfc2NhbiBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmloZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGloZXhfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBpaGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CitzdGF0aWMgYm9vbGVhbiBpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CitzdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX3JlY29yZAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfYnl0ZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGFzeW1ib2wgKmloZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGloZXhfc2V0X2FyY2hfbWFjaAorICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgaW50IGloZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKKworLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBwdXQgb24gb25lIGxpbmUgZHVyaW5nIG91dHB1dC4gICovCisKKyNkZWZpbmUgQ0hVTksgKDIxKQorCisvKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KKworI2RlZmluZSBOSUJCTEUoeCkgKGhleF92YWx1ZSAoeCkpCisjZGVmaW5lIEhFWDIoYnVmZmVyKSAoKE5JQkJMRSAoKGJ1ZmZlcilbMF0pIDw8IDQpICsgTklCQkxFICgoYnVmZmVyKVsxXSkpCisjZGVmaW5lIEhFWDQoYnVmZmVyKSAoKEhFWDIgKGJ1ZmZlcikgPDwgOCkgKyBIRVgyICgoYnVmZmVyKSArIDIpKQorI2RlZmluZSBJU0hFWCh4KSAoaGV4X3AgKHgpKQorCisvKiBXaGVuIHdlIHdyaXRlIG91dCBhbiBpaGV4IHZhbHVlLCB0aGUgdmFsdWVzIGNhbiBub3QgYmUgb3V0cHV0IGFzCisgICB0aGV5IGFyZSBzZWVuLiAgSW5zdGVhZCwgd2UgaG9sZCB0aGVtIGluIG1lbW9yeSBpbiB0aGlzIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBpaGV4X2RhdGFfbGlzdAoreworICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKm5leHQ7CisgIGJmZF9ieXRlICpkYXRhOworICBiZmRfdm1hIHdoZXJlOworICBiZmRfc2l6ZV90eXBlIHNpemU7Cit9OworCisvKiBUaGUgaWhleCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCisKK3N0cnVjdCBpaGV4X2RhdGFfc3RydWN0Cit7CisgIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqaGVhZDsKKyAgc3RydWN0IGloZXhfZGF0YV9saXN0ICp0YWlsOworfTsKKworLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gICovCisKK3N0YXRpYyB2b2lkCitpaGV4X2luaXQgKCkKK3sKKyAgc3RhdGljIGJvb2xlYW4gaW5pdGVkOworCisgIGlmICghIGluaXRlZCkKKyAgICB7CisgICAgICBpbml0ZWQgPSB0cnVlOworICAgICAgaGV4X2luaXQgKCk7CisgICAgfQorfQorCisvKiBDcmVhdGUgYW4gaWhleCBvYmplY3QuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWhleF9ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoYWJmZC0+dGRhdGEuaWhleF9kYXRhID09IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOworCisgICAgICB0ZGF0YSA9ICgoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKikKKwkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0KSkpOworICAgICAgaWYgKHRkYXRhID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgYWJmZC0+dGRhdGEuaWhleF9kYXRhID0gdGRhdGE7CisgICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7CisgICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWFkIGEgYnl0ZSBmcm9tIGEgQkZELiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLworCitzdGF0aWMgSU5MSU5FIGludAoraWhleF9nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Cit7CisgIGJmZF9ieXRlIGM7CisKKyAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCisJKmVycm9ycHRyID0gdHJ1ZTsKKyAgICAgIHJldHVybiBFT0Y7CisgICAgfQorCisgIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOworfQorCisvKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK2loZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKKyAgICAgaW50IGM7CisgICAgIGJvb2xlYW4gZXJyb3I7Cit7CisgIGlmIChjID09IEVPRikKKyAgICB7CisgICAgICBpZiAoISBlcnJvcikKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzEwXTsKKworICAgICAgaWYgKCEgaXNwcmludCAoYykpCisJc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7CisgICAgICBlbHNlCisJeworCSAgYnVmWzBdID0gYzsKKwkgIGJ1ZlsxXSA9ICdcMCc7CisJfQorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iKSwKKwkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywgYnVmKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgIH0KK30KKworLyogUmVhZCBhbiBJbnRlbCBoZXggZmlsZSBhbmQgdHVybiBpdCBpbnRvIHNlY3Rpb25zLiAgV2UgY3JlYXRlIGEgbmV3CisgICBzZWN0aW9uIGZvciBlYWNoIGNvbnRpZ3VvdXMgc2V0IG9mIGJ5dGVzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2loZXhfc2NhbiAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBiZmRfdm1hIHNlZ2Jhc2U7CisgIGJmZF92bWEgZXh0YmFzZTsKKyAgYXNlY3Rpb24gKnNlYzsKKyAgaW50IGxpbmVubzsKKyAgYm9vbGVhbiBlcnJvcjsKKyAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7CisgIHNpemVfdCBidWZzaXplOworICBpbnQgYzsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IDA7CisKKyAgc2VnYmFzZSA9IDA7CisgIGV4dGJhc2UgPSAwOworICBzZWMgPSBOVUxMOworICBsaW5lbm8gPSAxOworICBlcnJvciA9IGZhbHNlOworICBidWZzaXplID0gMDsKKyAgd2hpbGUgKChjID0gaWhleF9nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIGlmIChjID09ICdccicpCisJY29udGludWU7CisgICAgICBlbHNlIGlmIChjID09ICdcbicpCisJeworCSAgKytsaW5lbm87CisJICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlIGlmIChjICE9ICc6JykKKwl7CisJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKKwkgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmaWxlX3B0ciBwb3M7CisJICBjaGFyIGhkcls4XTsKKwkgIHVuc2lnbmVkIGludCBpOworCSAgdW5zaWduZWQgaW50IGxlbjsKKwkgIGJmZF92bWEgYWRkcjsKKwkgIHVuc2lnbmVkIGludCB0eXBlOworCSAgdW5zaWduZWQgaW50IGNoYXJzOworCSAgdW5zaWduZWQgaW50IGNoa3N1bTsKKworCSAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KKworCSAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKKworCSAgLyogUmVhZCB0aGUgaGVhZGVyIGJ5dGVzLiAgKi8KKworCSAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKCEgSVNIRVggKGhkcltpXSkpCisJCXsKKwkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOworCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJICAgIH0KKworCSAgbGVuID0gSEVYMiAoaGRyKTsKKwkgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKKwkgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKKworCSAgLyogUmVhZCB0aGUgZGF0YSBieXRlcy4gICovCisKKwkgIGNoYXJzID0gbGVuICogMiArIDI7CisJICBpZiAoY2hhcnMgPj0gYnVmc2l6ZSkKKwkgICAgeworCSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAoYnVmLCBjaGFycyk7CisJICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBidWZzaXplID0gY2hhcnM7CisJICAgIH0KKworCSAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGNoYXJzLCBhYmZkKSAhPSBjaGFycykKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGZvciAoaSA9IDA7IGkgPCBjaGFyczsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKCEgSVNIRVggKGJ1ZltpXSkpCisJCXsKKwkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOworCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJICAgIH0KKworCSAgLyogQ2hlY2sgdGhlIGNoZWNrc3VtLiAgKi8KKwkgIGNoa3N1bSA9IGxlbiArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7CisJICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICAgIGNoa3N1bSArPSBIRVgyIChidWYgKyAyICogaSk7CisJICBpZiAoKCgtIGNoa3N1bSkgJiAweGZmKSAhPSAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpCisJICAgIHsKKwkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJKF8oIiVzOiVkOiBiYWQgY2hlY2tzdW0gaW4gSW50ZWwgSGV4IGZpbGUgKGV4cGVjdGVkICV1LCBmb3VuZCAldSkiKSwKKwkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sCisJCSAoLSBjaGtzdW0pICYgMHhmZiwgKHVuc2lnbmVkIGludCkgSEVYMiAoYnVmICsgMiAqIGkpKTsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCisJICBzd2l0Y2ggKHR5cGUpCisJICAgIHsKKwkgICAgY2FzZSAwOgorCSAgICAgIC8qIFRoaXMgaXMgYSBkYXRhIHJlY29yZC4gICovCisJICAgICAgaWYgKHNlYyAhPSBOVUxMCisJCSAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHIpCisJCXsKKwkJICAvKiBUaGlzIGRhdGEgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdlIGFyZQorICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KKwkJICBzZWMtPl9yYXdfc2l6ZSArPSBsZW47CisJCX0KKwkgICAgICBlbHNlIGlmIChsZW4gPiAwKQorCQl7CisJCSAgY2hhciBzZWNidWZbMjBdOworCQkgIGNoYXIgKnNlY25hbWU7CisKKwkJICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7CisJCSAgc2VjbmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzZWNidWYpICsgMSk7CisJCSAgaWYgKHNlY25hbWUgPT0gTlVMTCkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKKwkJICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWNuYW1lKTsKKwkJICBpZiAoc2VjID09IE5VTEwpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOworCQkgIHNlYy0+dm1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOworCQkgIHNlYy0+bG1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOworCQkgIHNlYy0+X3Jhd19zaXplID0gbGVuOworCQkgIHNlYy0+ZmlsZXBvcyA9IHBvczsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgMToKKwkgICAgICAvKiBBbiBlbmQgcmVjb3JkLiAgKi8KKwkgICAgICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcyA9PSAwKQorCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcjsKKwkgICAgICBpZiAoYnVmICE9IE5VTEwpCisJCWZyZWUgKGJ1Zik7CisJICAgICAgcmV0dXJuIHRydWU7CisKKwkgICAgY2FzZSAyOgorCSAgICAgIC8qIEFuIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLiAgKi8KKwkgICAgICBpZiAobGVuICE9IDIpCisJCXsKKwkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAorCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOworCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkgICAgICBzZWdiYXNlID0gSEVYNCAoYnVmKSA8PCA0OworCisJICAgICAgc2VjID0gTlVMTDsKKworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgMzoKKwkgICAgICAvKiBBbiBleHRlbmRlZCBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCisJICAgICAgaWYgKGxlbiAhPSA0KQorCQl7CisJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAorCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOworCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzICs9IChIRVg0IChidWYpIDw8IDQpICsgSEVYNCAoYnVmICsgNCk7CisKKwkgICAgICBzZWMgPSBOVUxMOworCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSA0OgorCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZC4gICovCisJICAgICAgaWYgKGxlbiAhPSAyKQorCQl7CisJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCSAgICAgIGV4dGJhc2UgPSBIRVg0IChidWYpIDw8IDE2OworCisJICAgICAgc2VjID0gTlVMTDsKKworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgNToKKwkgICAgICAvKiBBbiBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyByZWNvcmQuICAqLworCSAgICAgIGlmIChsZW4gIT0gMiAmJiBsZW4gIT0gNCkKKwkJeworCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCSAgICAgIGlmIChsZW4gPT0gMikKKwkJYWJmZC0+c3RhcnRfYWRkcmVzcyArPSBIRVg0IChidWYpIDw8IDE2OworCSAgICAgIGVsc2UKKwkJYWJmZC0+c3RhcnRfYWRkcmVzcyA9IChIRVg0IChidWYpIDw8IDE2KSArIEhFWDQgKGJ1ZiArIDQpOworCisJICAgICAgc2VjID0gTlVMTDsKKworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCB0eXBlKTsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGVycm9yKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChidWYgIT0gTlVMTCkKKyAgICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoYnVmICE9IE5VTEwpCisgICAgZnJlZSAoYnVmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBUcnkgdG8gcmVjb2duaXplIGFuIEludGVsIEhleCBmaWxlLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgoraWhleF9vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBiZmRfYnl0ZSBiWzldOworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IHR5cGU7CisKKyAgaWhleF9pbml0ICgpOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGJmZF9yZWFkIChiLCAxLCA5LCBhYmZkKSAhPSA5KQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoYlswXSAhPSAnOicpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZm9yIChpID0gMTsgaSA8IDk7IGkrKykKKyAgICB7CisgICAgICBpZiAoISBJU0hFWCAoYltpXSkpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgIHR5cGUgPSBIRVgyIChiICsgNyk7CisgIGlmICh0eXBlID4gNSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBPSywgaXQgbG9va3MgbGlrZSBpdCByZWFsbHkgaXMgYW4gSW50ZWwgSGV4IGZpbGUuICAqLworCisgIGlmICghIGloZXhfbWtvYmplY3QgKGFiZmQpCisgICAgICB8fCAhIGloZXhfc2NhbiAoYWJmZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKKy8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpaGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgY29udGVudHMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKK3sKKyAgaW50IGM7CisgIGJmZF9ieXRlICpwOworICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKKyAgc2l6ZV90IGJ1ZnNpemU7CisgIGJvb2xlYW4gZXJyb3I7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBwID0gY29udGVudHM7CisgIGJ1ZnNpemUgPSAwOworICBlcnJvciA9IGZhbHNlOworICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCisgICAgeworICAgICAgY2hhciBoZHJbOF07CisgICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICAgYmZkX3ZtYSBhZGRyOworICAgICAgdW5zaWduZWQgaW50IHR5cGU7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisJY29udGludWU7CisKKyAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGloZXhfc2NhbiBoYXMgc3VjY2VlZGVkLCBzbyB3ZSBvdWdodCB0bworICAgICAgICAga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KKyAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJzonKTsKKworICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGxlbiA9IEhFWDIgKGhkcik7CisgICAgICBhZGRyID0gSEVYNCAoaGRyICsgMik7CisgICAgICB0eXBlID0gSEVYMiAoaGRyICsgNik7CisKKyAgICAgIC8qIFdlIHNob3VsZCBvbmx5IHNlZSB0eXBlIDAgcmVjb3JkcyBoZXJlLiAgKi8KKyAgICAgIGlmICh0eXBlICE9IDApCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogaW50ZXJuYWwgZXJyb3IgaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgZ290byBlcnJvcl9yZXR1cm47CisJfQorCisgICAgICBpZiAobGVuICogMiA+IGJ1ZnNpemUpCisJeworCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGxlbiAqIDIpOworCSAgaWYgKGJ1ZiA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGJ1ZnNpemUgPSBsZW4gKiAyOworCX0KKworICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGxlbiAqIDIsIGFiZmQpICE9IGxlbiAqIDIpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkqcCsrID0gSEVYMiAoYnVmICsgMiAqIGkpOworICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA+PSBzZWN0aW9uLT5fcmF3X3NpemUpCisJeworCSAgLyogV2UndmUgcmVhZCBldmVyeXRoaW5nIGluIHRoZSBzZWN0aW9uLiAgKi8KKwkgIGlmIChidWYgIT0gTlVMTCkKKwkgICAgZnJlZSAoYnVmKTsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgLyogU2tpcCB0aGUgY2hlY2tzdW0uICAqLworICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIDIsIGFiZmQpICE9IDIpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIGlmICgoYmZkX3NpemVfdHlwZSkgKHAgLSBjb250ZW50cykgPCBzZWN0aW9uLT5fcmF3X3NpemUpCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKKwkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIGZyZWUgKGJ1Zik7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChidWYgIT0gTlVMTCkKKyAgICBmcmVlIChidWYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2loZXhfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCisgICAgeworICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisgICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoISBpaGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAorCSAgKHNpemVfdCkgY291bnQpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbjsKKyAgYmZkX2J5dGUgKmRhdGE7CisgIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICp0ZGF0YTsKKworICBpZiAoY291bnQgPT0gMAorICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCisgICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBuID0gKChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKikKKyAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9saXN0KSkpOworICBpZiAobiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQpOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgbWVtY3B5IChkYXRhLCBsb2NhdGlvbiwgKHNpemVfdCkgY291bnQpOworCisgIG4tPmRhdGEgPSBkYXRhOworICBuLT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKKyAgbi0+c2l6ZSA9IGNvdW50OworCisgIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKKyAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLworICB0ZGF0YSA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YTsKKyAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKKyAgICAgICYmIG4tPndoZXJlID49IHRkYXRhLT50YWlsLT53aGVyZSkKKyAgICB7CisgICAgICB0ZGF0YS0+dGFpbC0+bmV4dCA9IG47CisgICAgICBuLT5uZXh0ID0gTlVMTDsKKyAgICAgIHRkYXRhLT50YWlsID0gbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWdpc3RlciBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKipwcDsKKworICAgICAgZm9yIChwcCA9ICZ0ZGF0YS0+aGVhZDsKKwkgICAqcHAgIT0gTlVMTCAmJiAoKnBwKS0+d2hlcmUgPCBuLT53aGVyZTsKKwkgICBwcCA9ICYoKnBwKS0+bmV4dCkKKwk7CisgICAgICBuLT5uZXh0ID0gKnBwOworICAgICAgKnBwID0gbjsKKyAgICAgIGlmIChuLT5uZXh0ID09IE5VTEwpCisJdGRhdGEtPnRhaWwgPSBuOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgYSByZWNvcmQgb3V0IHRvIGFuIEludGVsIEhleCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2loZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBjb3VudCwgYWRkciwgdHlwZSwgZGF0YSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworICAgICBiZmRfdm1hIGFkZHI7CisgICAgIHVuc2lnbmVkIGludCB0eXBlOworICAgICBiZmRfYnl0ZSAqZGF0YTsKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworICBjaGFyIGJ1Zls5ICsgQ0hVTksgKiAyICsgNF07CisgIGNoYXIgKnA7CisgIHVuc2lnbmVkIGludCBjaGtzdW07CisgIHVuc2lnbmVkIGludCBpOworCisjZGVmaW5lIFRPSEVYKGJ1ZiwgdikgXAorICAoKGJ1ZilbMF0gPSBkaWdzWygodikgPj4gNCkgJiAweGZdLCAoYnVmKVsxXSA9IGRpZ3NbKHYpICYgMHhmXSkKKworICBidWZbMF0gPSAnOic7CisgIFRPSEVYIChidWYgKyAxLCBjb3VudCk7CisgIFRPSEVYIChidWYgKyAzLCAoYWRkciA+PiA4KSAmIDB4ZmYpOworICBUT0hFWCAoYnVmICsgNSwgYWRkciAmIDB4ZmYpOworICBUT0hFWCAoYnVmICsgNywgdHlwZSk7CisKKyAgY2hrc3VtID0gY291bnQgKyBhZGRyICsgKGFkZHIgPj4gOCkgKyB0eXBlOworCisgIGZvciAoaSA9IDAsIHAgPSBidWYgKyA5OyBpIDwgY291bnQ7IGkrKywgcCArPSAyLCBkYXRhKyspCisgICAgeworICAgICAgVE9IRVggKHAsICpkYXRhKTsKKyAgICAgIGNoa3N1bSArPSAqZGF0YTsKKyAgICB9CisKKyAgVE9IRVggKHAsICgtIGNoa3N1bSkgJiAweGZmKTsKKyAgcFsyXSA9ICdccic7CisgIHBbM10gPSAnXG4nOworCisgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOSArIGNvdW50ICogMiArIDQsIGFiZmQpICE9IDkgKyBjb3VudCAqIDIgKyA0KQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IGFuIEludGVsIEhleCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2loZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF92bWEgc2VnYmFzZTsKKyAgYmZkX3ZtYSBleHRiYXNlOworICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKmw7CisKKyAgc2VnYmFzZSA9IDA7CisgIGV4dGJhc2UgPSAwOworICBmb3IgKGwgPSBhYmZkLT50ZGF0YS5paGV4X2RhdGEtPmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgYmZkX3ZtYSB3aGVyZTsKKyAgICAgIGJmZF9ieXRlICpwOworICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKKworICAgICAgd2hlcmUgPSBsLT53aGVyZTsKKyAgICAgIHAgPSBsLT5kYXRhOworICAgICAgY291bnQgPSBsLT5zaXplOworICAgICAgd2hpbGUgKGNvdW50ID4gMCkKKwl7CisJICBiZmRfc2l6ZV90eXBlIG5vdzsKKworCSAgbm93ID0gY291bnQ7CisJICBpZiAobm93ID4gQ0hVTkspCisJICAgIG5vdyA9IENIVU5LOworCisJICBpZiAod2hlcmUgPiBzZWdiYXNlICsgZXh0YmFzZSArIDB4ZmZmZikKKwkgICAgeworCSAgICAgIGJmZF9ieXRlIGFkZHJbMl07CisKKwkgICAgICAvKiBXZSBuZWVkIGEgbmV3IGJhc2UgYWRkcmVzcy4gICovCisJICAgICAgaWYgKHdoZXJlIDw9IDB4ZmZmZmYpCisJCXsKKwkJICAvKiBUaGUgYWRkcmVzc2VzIHNob3VsZCBiZSBzb3J0ZWQuICAqLworCQkgIEJGRF9BU1NFUlQgKGV4dGJhc2UgPT0gMCk7CisKKwkJICBzZWdiYXNlID0gd2hlcmUgJiAweGYwMDAwOworCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gMTIpICYgMHhmZjsKKwkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShzZWdiYXNlID4+IDQpICYgMHhmZjsKKwkJICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBUaGUgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgYW5kIHRoZSBleHRlbmRlZAorICAgICAgICAgICAgICAgICAgICAgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGFyZSBjb21iaW5lZCwgYXQgbGVhc3QgYnkKKyAgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhZGVycy4gIFdlIG5lZWQgYW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgIHJlY29yZCBoZXJlLCBzbyBpZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGFuCisgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCwgemVybyBpdCBvdXQgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2lvbi4gICovCisJCSAgaWYgKHNlZ2Jhc2UgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgYWRkclswXSA9IDA7CisJCSAgICAgIGFkZHJbMV0gPSAwOworCQkgICAgICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIHNlZ2Jhc2UgPSAwOworCQkgICAgfQorCisJCSAgZXh0YmFzZSA9IHdoZXJlICYgMHhmZmZmMDAwMDsKKwkJICBpZiAod2hlcmUgPiBleHRiYXNlICsgMHhmZmZmKQorCQkgICAgeworCQkgICAgICBjaGFyIGJ1ZlsyMF07CisKKwkJICAgICAgc3ByaW50Zl92bWEgKGJ1Ziwgd2hlcmUpOworCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJCShfKCIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiKSwKKwkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmKTsKKwkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkJICBhZGRyWzBdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDI0KSAmIDB4ZmY7CisJCSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZXh0YmFzZSA+PiAxNikgJiAweGZmOworCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCA0LCBhZGRyKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisKKwkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBub3csIHdoZXJlIC0gKGV4dGJhc2UgKyBzZWdiYXNlKSwKKwkJCQkgICAwLCBwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICB3aGVyZSArPSBub3c7CisJICBwICs9IG5vdzsKKwkgIGNvdW50IC09IG5vdzsKKwl9CisgICAgfQorCisgIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzICE9IDApCisgICAgeworICAgICAgYmZkX3ZtYSBzdGFydDsKKyAgICAgIGJmZF9ieXRlIHN0YXJ0YnVmWzRdOworCisgICAgICBzdGFydCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3M7CisKKyAgICAgIGlmIChzdGFydCA8PSAweGZmZmZmKQorCXsKKwkgIHN0YXJ0YnVmWzBdID0gKGJmZF9ieXRlKSgoc3RhcnQgJiAweGYwMDAwKSA+PiAxMikgJiAweGZmOworCSAgc3RhcnRidWZbMV0gPSAwOworCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKKwkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKKwkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCAzLCBzdGFydGJ1ZikpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDI0KSAmIDB4ZmY7CisJICBzdGFydGJ1ZlsxXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMTYpICYgMHhmZjsKKwkgIHN0YXJ0YnVmWzJdID0gKGJmZF9ieXRlKShzdGFydCA+PiA4KSAmIDB4ZmY7CisJICBzdGFydGJ1ZlszXSA9IChiZmRfYnl0ZSlzdGFydCAmIDB4ZmY7CisJICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgNCwgMCwgNSwgc3RhcnRidWYpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgMSwgTlVMTCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gIFRoaXMgaXMgcmVxdWlyZWQgb25seSBiZWNhdXNlCisgICBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSB3YW50cyB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLiAgKi8KKworc3RhdGljIGFzeW1ib2wgKgoraWhleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICpuZXc7CisKKyAgbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7CisgIGlmIChuZXcgIT0gTlVMTCkKKyAgICBuZXctPnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gbmV3OworfQorCisvKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgVGhlIGFyY2hpdGVjdHVyZSBpcworICAgaXJyZWxldmFudCwgc28gd2UgaWdub3JlIGVycm9ycyBhYm91dCB1bmtub3duIGFyY2hpdGVjdHVyZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWhleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Cit7CisgIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpKQorICAgIHsKKyAgICAgIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycywgZm9yIHRoZSBsaW5rZXIuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBpbnQKK2loZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBleGVjOworeworICByZXR1cm4gMDsKK30KKworLyogU29tZSByYW5kb20gZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KKworI2RlZmluZQlpaGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAorI2RlZmluZSBpaGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbworI2RlZmluZSBpaGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKKyNkZWZpbmUgaWhleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKKyNkZWZpbmUgaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGJmZF8wbAorI2RlZmluZSBpaGV4X2dldF9zeW10YWIgXAorICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKKyNkZWZpbmUgaWhleF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCisjZGVmaW5lIGloZXhfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbworI2RlZmluZSBpaGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGloZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCisjZGVmaW5lIGloZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKKyNkZWZpbmUgaWhleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIGloZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIGloZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSBpaGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQorI2RlZmluZSBpaGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQorI2RlZmluZSBpaGV4X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAorCisjZGVmaW5lIGloZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBpaGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgaWhleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKKyNkZWZpbmUgaWhleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBpaGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIGloZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKKyNkZWZpbmUgaWhleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKworLyogVGhlIEludGVsIEhleCB0YXJnZXQgdmVjdG9yLiAgKi8KKworY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYyA9Cit7CisgICJpaGV4IiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAorICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgIDAsCQkJCS8qIG9iamVjdCBmbGFncyAqLworICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLworICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCisKKyAgeworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIGloZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgIH0sCisgIHsKKyAgICBiZmRfZmFsc2UsCisgICAgaWhleF9ta29iamVjdCwKKyAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAorICAgIGJmZF9mYWxzZSwKKyAgfSwKKyAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICBiZmRfZmFsc2UsCisgICAgaWhleF93cml0ZV9vYmplY3RfY29udGVudHMsCisgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAorICAgIGJmZF9mYWxzZSwKKyAgfSwKKworICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpaGV4KSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGloZXgpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGloZXgpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWhleCksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGloZXgpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgMAorfTsKZGlmZiAtLWdpdCBhL2JmZC9pbml0LmMgYi9iZmQvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTFkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaW5pdC5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIGJmZCBpbml0aWFsaXphdGlvbiBzdHVmZgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisvKgorU0VDVElPTgorCUluaXRpYWxpemF0aW9uCisKKwlUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBpbml0aWFsaXppbmcgYSBCRkQuCisqLworCisvKgorRlVOQ1RJT04KKwliZmRfaW5pdAorCitTWU5PUFNJUworCXZvaWQgYmZkX2luaXQodm9pZCk7CisKK0RFU0NSSVBUSU9OCisJVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgQkZEIGZ1bmN0aW9uIHRvCisJaW5pdGlhbGl6ZSBtYWdpY2FsIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKyovCisKKy8qIEFjdHVhbGx5LCB0aGVyZSBpcyBjdXJyZW50bHkgbm90aGluZyBmb3IgdGhpcyBmdW5jdGlvbiB0byBkby4KKyAgIEhvd2V2ZXIsIHNvbWVkYXkgaXQgbWF5IGJlIG5lZWRlZCwgc28ga2VlcCBpdCBhcm91bmQuICAqLworCit2b2lkCitiZmRfaW5pdCAoKQoreworfQpkaWZmIC0tZ2l0IGEvYmZkL2lyaXgtY29yZS5jIGIvYmZkL2lyaXgtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NGNhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvaXJpeC1jb3JlLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSXJpeCBjb3JlIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0dSBHcm9zc21hbiwgQ3lnbnVzIFN1cHBvcnQuCisgICBDb252ZXJ0ZWQgdG8gYmFjay1lbmQgZm9ybSBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBJcml4IHN0eWxlIGNvcmUKKyAgIGZpbGVzIChuYW1lbHksIElyaXggNCBhbmQgSXJpeCA1LCBzbyBmYXIpLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaWZkZWYgSVJJWF9DT1JFCisKKyNpbmNsdWRlIDxjb3JlLm91dC5oPgorCitzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0IAoreworICBpbnQgc2lnOworICBjaGFyIGNtZFtDT1JFX05BTUVTSVpFXTsKK307CisKKyNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLnNnaV9jb3JlX2RhdGEpCisjZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKKyNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKKworc3RhdGljIGFzZWN0aW9uICptYWtlX2JmZF9hc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICppcml4X2NvcmVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjaGFyICppcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBpcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIAorICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKK3N0YXRpYyBhc3ltYm9sICppcml4X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgYXNlY3Rpb24gKgorbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKKyAgICAgYmZkICphYmZkOworICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBmbGFnd29yZCBmbGFnczsKKyAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7CisgICAgIGJmZF92bWEgdm1hOworICAgICBmaWxlX3B0ciBmaWxlcG9zOworeworICBhc2VjdGlvbiAqYXNlY3Q7CisKKyAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7CisgIGlmICghYXNlY3QpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7CisgIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7CisgIGFzZWN0LT52bWEgPSB2bWE7CisgIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKKyAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDQ7CisKKyAgcmV0dXJuIGFzZWN0OworfQorCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitpcml4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHZhbDsKKyAgaW50IGk7CisgIGNoYXIgKnNlY25hbWU7CisgIHN0cnVjdCBjb3Jlb3V0IGNvcmVvdXQ7CisgIHN0cnVjdCBpZGVzYyAqaWRnLCAqaWRmLCAqaWRzOworCisgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3Jlb3V0LCAxLCBzaXplb2YgY29yZW91dCwgYWJmZCk7CisgIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVvdXQpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZuZGVmIENPUkVfTUFHSUNOMzIKKyNkZWZpbmUgQ09SRV9NQUdJQ04zMiBDT1JFX01BR0lDCisjZW5kaWYKKyAgaWYgKChjb3Jlb3V0LmNfbWFnaWMgIT0gQ09SRV9NQUdJQyAmJiBjb3Jlb3V0LmNfbWFnaWMgIT0gQ09SRV9NQUdJQ04zMikKKyAgICAgIHx8IGNvcmVvdXQuY192ZXJzaW9uICE9IENPUkVfVkVSU0lPTjEpCisgICAgcmV0dXJuIDA7CisKKyAgY29yZV9oZHIgKGFiZmQpID0gKHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0KSk7CisgIGlmICghY29yZV9oZHIgKGFiZmQpKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIGNvcmVvdXQuY19uYW1lLCBDT1JFX05BTUVTSVpFKTsKKyAgY29yZV9zaWduYWwgKGFiZmQpID0gY29yZW91dC5jX3NpZ2NhdXNlOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgY29yZW91dC5jX3ZtYXBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3Jlb3V0LmNfbnZtYXA7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3Qgdm1hcCB2bWFwOworCisgICAgICB2YWwgPSBiZmRfcmVhZCAoKFBUUikmdm1hcCwgMSwgc2l6ZW9mIHZtYXAsIGFiZmQpOworICAgICAgaWYgKHZhbCAhPSBzaXplb2Ygdm1hcCkKKwlicmVhazsKKworICAgICAgc3dpdGNoICh2bWFwLnZfdHlwZSkKKwl7CisJY2FzZSBWREFUQToKKwkgIHNlY25hbWUgPSAiLmRhdGEiOworCSAgYnJlYWs7CisJY2FzZSBWU1RBQ0s6CisJICBzZWNuYW1lID0gIi5zdGFjayI7CisJICBicmVhazsKKyNpZmRlZiBWTUFQRklMRQorCWNhc2UgVk1BUEZJTEU6CisJICBzZWNuYW1lID0gIi5tYXBmaWxlIjsKKwkgIGJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogQSBmaWxlIG9mZnNldCBvZiB6ZXJvIG1lYW5zIHRoYXQgdGhlIHNlY3Rpb24gaXMgbm90IGNvbnRhaW5lZAorCSBpbiB0aGUgY29yZWZpbGUuICAqLworICAgICAgaWYgKHZtYXAudl9vZmZzZXQgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwKKwkJCSAgICAgIFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTLAorCQkJICAgICAgdm1hcC52X2xlbiwKKwkJCSAgICAgIHZtYXAudl92YWRkciwKKwkJCSAgICAgIHZtYXAudl9vZmZzZXQpKQorCXJldHVybiBOVUxMOworICAgIH0KKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVncyBhcmUgY29udGlndW91cyB3aXRoaW4gdGhlIGNvcmUgZmlsZS4gKi8KKworICBpZGcgPSAmY29yZW91dC5jX2lkZXNjW0lfR1BSRUdTXTsKKyAgaWRmID0gJmNvcmVvdXQuY19pZGVzY1tJX0ZQUkVHU107CisgIGlkcyA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9TUEVDUkVHU107CisKKyAgaWYgKGlkZy0+aV9vZmZzZXQgKyBpZGctPmlfbGVuICE9IGlkZi0+aV9vZmZzZXQKKyAgICAgIHx8IGlkZi0+aV9vZmZzZXQgKyBpZGYtPmlfbGVuICE9IGlkcy0+aV9vZmZzZXQpCisgICAgcmV0dXJuIDA7CQkJLyogQ2FuJ3QgZGVhbCB3aXRoIG5vbi1jb250aWcgcmVncyAqLworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgaWRnLT5pX29mZnNldCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKKwkJICAgICBTRUNfSEFTX0NPTlRFTlRTLAorCQkgICAgIGlkZy0+aV9sZW4gKyBpZGYtPmlfbGVuICsgaWRzLT5pX2xlbiwKKwkJICAgICAwLAorCQkgICAgIGlkZy0+aV9vZmZzZXQpOworCisgIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitzdGF0aWMgY2hhciAqCitpcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKK30KKworc3RhdGljIGludAoraXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gY29yZV9zaWduYWwgKGFiZmQpOworfQorCitzdGF0aWMgYm9vbGVhbgoraXJpeF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQorICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Cit7CisgIHJldHVybiB0cnVlOwkJCS8qIFhYWCAtIEZJWE1FICovCit9CisKK3N0YXRpYyBhc3ltYm9sICoKK2lyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKKyAgaWYgKG5ldykKKyAgICBuZXctPnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gbmV3OworfQorCisjZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKKyNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgorI2RlZmluZSBpcml4X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAorI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbworI2RlZmluZSBpcml4X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAorICBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBpcml4X2NvcmVfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCisjZGVmaW5lIGlyaXhfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQorI2RlZmluZSBpcml4X2NvcmVfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBpcml4X2NvcmVfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIGlyaXhfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAorCisvKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCitzdGF0aWMgdm9pZAorc3dhcF9hYm9ydCgpCit7CisgIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLworfQorI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19TSUdORURfR0VUIFwKKyAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKworY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjID0KKyAgeworICAgICJpcml4LWNvcmUiLAorICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAorICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKyAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCisgICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLworICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLworICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLworCisgICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KKyAgICAgaXJpeF9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCisgICAgfSwKKyAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCisgICAgfSwKKyAgICAKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoaXJpeF9jb3JlKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaXJpeF9jb3JlKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCit9OworCisjZW5kaWYgLyogSVJJWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbGliYW91dC5oIGIvYmZkL2xpYmFvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDAxZDNkCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2xpYmFvdXQuaApAQCAtMCwwICsxLDYyNCBAQAorLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgYS5vdXQgKGFuZCBzaW1pbGFyKSBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgTElCQU9VVF9ICisjZGVmaW5lIExJQkFPVVRfSAorCisvKiBXZSB0cnkgdG8gZW5jYXBzdWxhdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIGEub3V0IGZpbGUKKyAgIHZhcmlhbnRzIGluIGEgZmV3IHJvdXRpbmVzLCBhbmQgb3RoZXJ3aXNlIHNoYXJlIGxhcmdlIG1hc3NlcyBvZiBjb2RlLgorICAgVGhpcyBtZWFucyB3ZSBvbmx5IGhhdmUgdG8gZml4IGJ1Z3MgaW4gb25lIHBsYWNlLCBtb3N0IG9mIHRoZSB0aW1lLiAgKi8KKworI2luY2x1ZGUgImJmZGxpbmsuaCIKKworLyogUGFyYW1ldGVyaXplIHRoZSBhLm91dCBjb2RlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYmVpbmcgYnVpbHQKKyAgIGZvciBhIDMyLWJpdCBhcmNoaXRlY3R1cmUgb3IgYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLiAgKi8KKyNpZiBBUkNIX1NJWkU9PTY0CisjZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF82NAorI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF82NAorI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfNjQKKyNpZm5kZWYgTkFNRQorI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF82NF8seSkKKyNlbmRpZgorI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfNjQpCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQgOAorI2Vsc2UgLyogQVJDSF9TSVpFID09IDMyICovCisjZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF8zMgorI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF8zMgorI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfMzIKKyNpZm5kZWYgTkFNRQorI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF8zMl8seSkKKyNlbmRpZgorI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfMzIpCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAorI2VuZGlmIC8qIEFSQ0hfU0laRT09MzIgKi8KKworLyogRGVjbGFyZSBhdCBmaWxlIGxldmVsLCBzaW5jZSB1c2VkIGluIHBhcmFtZXRlciBsaXN0cywgd2hpY2ggaGF2ZQorICAgd2VpcmQgc2NvcGUuICAqLworc3RydWN0IGV4dGVybmFsX2V4ZWM7CitzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Q7CitzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsOworc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbDsKKwwKKy8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCisKK3N0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OworICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KKyAgYm9vbGVhbiB3cml0dGVuOworICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLworICBpbnQgaW5keDsKK307CisKKy8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKK307CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBhb3V0X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKKyAgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgXAorICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQorCisvKiBUcmF2ZXJzZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKKyAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCisgICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisKKy8qIEdldCB0aGUgYS5vdXQgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcworICAganVzdCBhIGNhc3QuICAqLworCisjZGVmaW5lIGFvdXRfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKKwwKKy8qIEJhY2stZW5kIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIGEub3V0IHRhcmdldHMuICAqLworc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhCit7CisgIC8qIEFyZSBaTUFHSUMgZmlsZXMgbWFwcGVkIGNvbnRpZ3VvdXNseT8gIElmIHNvLCB0aGUgdGV4dCBzZWN0aW9uIG1heQorICAgICBuZWVkIG1vcmUgcGFkZGluZywgaWYgdGhlIHNlZ21lbnQgc2l6ZSAoZ3JhbnVsYXJpdHkgZm9yIG1lbW9yeSBhY2Nlc3MKKyAgICAgY29udHJvbCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4gICovCisgIHVuc2lnbmVkIGNoYXIgem1hZ2ljX21hcHBlZF9jb250aWd1b3VzOworICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBaTUFHSUMvTk1BR0lDIGZpbGUgaGVhZGVycyBnZXQgbWFwcGVkIGluIHdpdGggdGhlCisgICAgIHRleHQgc2VjdGlvbiwgd2hpY2ggc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlci4KKyAgICAgSWYgbm90LCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBvbiB0aGUgbmV4dCBwYWdlLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0ZXh0X2luY2x1ZGVzX2hlYWRlcjsKKworICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGlmIHRoZSBlbnRyeSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUKKyAgICAgZmlyc3QgU0VHTUVOVF9TSVpFIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24sIGl0IGlzIHRha2VuIHRvIGJlCisgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsCisgICAgIGZvciBrZXJuZWxzLiAgKi8KKyAgdW5zaWduZWQgY2hhciBlbnRyeV9pc190ZXh0X2FkZHJlc3M7CisKKyAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gTl9TRVRfRkxBR1MuICAqLworICB1bnNpZ25lZCBjaGFyIGV4ZWNfaGRyX2ZsYWdzOworCisgIC8qIElmIHRoZSB0ZXh0IHNlY3Rpb24gVk1BIGlzbid0IHNwZWNpZmllZCwgYW5kIHdlIG5lZWQgYW4gYWJzb2x1dGUKKyAgICAgYWRkcmVzcywgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICBJZiB3ZSdyZSBwcm9kdWNpbmcgYSByZWxvY2F0YWJsZQorICAgICBmaWxlLCB6ZXJvIGlzIGFsd2F5cyB1c2VkLiAgKi8KKyAgLyogPz8gUGVyaGFwcyBhIGNhbGxiYWNrIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZT8gIFdpbGwgdGhpcyBkbyBhbnl0aGluZworICAgICByZWFzb25hYmxlIGZvciBhIGZvcm1hdCB0aGF0IGhhbmRsZXMgbXVsdGlwbGUgQ1BVcyB3aXRoIGRpZmZlcmVudAorICAgICBsb2FkIGFkZHJlc3NlcyBmb3IgZWFjaD8gICovCisgIGJmZF92bWEgZGVmYXVsdF90ZXh0X3ZtYTsKKworICAvKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGFnZSBhbmQgc2VnbWVudCBzaXplcywgaWYgdGhleSBjYW4ndCBiZQorICAgICB0cml2aWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUuICAqLworICBib29sZWFuICgqc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOworCisgIC8qIHptYWdpYyBmaWxlcyBvbmx5LiBGb3IgZ28zMiwgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgY29udHJpYnV0ZXMKKyAgICAgdG8gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbiBpbiB0aGUgZmlsZSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzIGJ1dAorICAgICBkb2VzICpub3QqIGdldCBjb3VudGVkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KKyAgdW5zaWduZWQgY2hhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZDsKKworICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCisgICAgIGEgZHluYW1pYyBvYmplY3QuICAqLworICBib29sZWFuICgqYWRkX2R5bmFtaWNfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAorCQkJCQkgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOworCisgIC8qIENhbGxiYWNrIGZyb20gdGhlIGFkZCBzeW1ib2xzIHBoYXNlIG9mIHRoZSBsaW5rZXIgY29kZSB0byBoYW5kbGUKKyAgICAgYWRkaW5nIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKyAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCisJCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCisJCQkJICAgICBib29sZWFuLAorCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKKworICAvKiBDYWxsZWQgdG8gaGFuZGxlIGxpbmtpbmcgYSBkeW5hbWljIG9iamVjdC4gICovCisgIGJvb2xlYW4gKCpsaW5rX2R5bmFtaWNfb2JqZWN0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOworCisgIC8qIENhbGxlZCBmb3IgZWFjaCBnbG9iYWwgc3ltYm9sIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IHRoZSBsaW5rZXIuCisgICAgIFRoaXMgc2hvdWxkIHdyaXRlIG91dCB0aGUgZHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworICBib29sZWFuICgqd3JpdGVfZHluYW1pY19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOworCisgIC8qIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IE5VTEwsIHRoZSBsaW5rZXIgY2FsbHMgaXQgZm9yIGVhY2ggcmVsb2MuCisgICAgIFJFTE9DIGlzIGEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIHJlbG9jLiAgSWYgKlNLSVAgaXMgc2V0IHRvCisgICAgIHRydWUsIHRoZSByZWxvYyB3aWxsIGJlIHNraXBwZWQuICAqUkVMT0NBVElPTiBtYXkgYmUgY2hhbmdlZCB0bworICAgICBjaGFuZ2UgdGhlIGVmZmVjdHMgb2YgdGhlIHJlbG9jYXRpb24uICAqLworICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisJCQkJCSAgYmZkICppbnB1dF9iZmQsCisJCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisJCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoLAorCQkJCQkgIFBUUiByZWxvYywgYmZkX2J5dGUgKmNvbnRlbnRzLAorCQkJCQkgIGJvb2xlYW4gKnNraXAsCisJCQkJCSAgYmZkX3ZtYSAqcmVsb2NhdGlvbikpOworCisgIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgbGluayB0byBmaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZworICAgICBpbmZvcm1hdGlvbi4gICovCisgIGJvb2xlYW4gKCpmaW5pc2hfZHluYW1pY19saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworfTsKKyNkZWZpbmUgYW91dF9iYWNrZW5kX2luZm8oYWJmZCkgXAorCSgoQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICopKChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKSkKKworLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4KKyAgIEFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgorICAgQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgorCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCisJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLiAgKi8KKworc3RydWN0IGludGVybmFsX2V4ZWMKK3sKKyAgICBsb25nIGFfaW5mbzsJCS8qIE1hZ2ljIG51bWJlciBhbmQgZmxhZ3MsIHBhY2tlZCAqLworICAgIGJmZF92bWEgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICAqLworICAgIGJmZF92bWEgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICAqLworICAgIGJmZF92bWEgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgaW4gbWVtICovCisgICAgYmZkX3ZtYSBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSAqLworICAgIGJmZF92bWEgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KKyAgICBiZmRfdm1hIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHRleHQncyByZWxvY2F0aW9uIGluZm8sIGluIGJ5dGVzICovCisgICAgYmZkX3ZtYSBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiBkYXRhJ3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLworICAgIC8qIEFkZGVkIGZvciBpOTYwICovCisgICAgYmZkX3ZtYSBhX3Rsb2FkOwkJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLworICAgIGJmZF92bWEgYV9kbG9hZDsJCS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCisgICAgdW5zaWduZWQgY2hhciBhX2RhbGlnbjsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLworICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLworICAgIGNoYXIgYV9yZWxheGFibGU7ICAgICAgICAgICAvKiBFbm91Z2ggaW5mbyBmb3IgbGlua2VyIHJlbGF4ICovCit9OworCisvKiBNYWdpYyBudW1iZXIgaXMgd3JpdHRlbiAKKzwgTVNCICAgICAgICAgID4KKzMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKKzwgRkxBR1MgICAgICAgID48IE1BQ0hJTkUgVFlQRSA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KKyovCisvKiBNYWdpYyBudW1iZXIgZm9yIE5ldEJTRCBpcworPE1TQiAgICAgICAgICAgPgorMzEzMDI5MjgyNzI2MjUyNDIzMjIyMTIwMTkxODE3MTYxNTE0MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEwMAorPCBGTEFHUyAgICA+PCBNQUNISU5FIFRZUEUgICAgID48ICBNQUdJQyBOVU1CRVIgICAgICAgICAgICAgICAgPgorKi8KKworZW51bSBtYWNoaW5lX3R5cGUgeworICBNX1VOS05PV04gPSAwLAorICBNXzY4MDEwID0gMSwKKyAgTV82ODAyMCA9IDIsCisgIE1fU1BBUkMgPSAzLAorICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bnMgbnVtYmVycyAqLworICAvKiBtYWtlIHRoZXNlIHVwIGZvciB0aGUgbnMzMmsqLworICBNX05TMzIwMzIgPSAoNjQpLAkJLyogbnMzMjAzMiBydW5uaW5nID8gKi8KKyAgTV9OUzMyNTMyID0gKDY0ICsgNSksCQkvKiBuczMyNTMyIHJ1bm5pbmcgbWFjaCAqLworCisgIE1fMzg2ID0gMTAwLAorICBNXzI5SyA9IDEwMSwgICAgICAgICAgLyogQU1EIDI5MDAwICovCisgIE1fMzg2X0RZTklYID0gMTAyLAkvKiBTZXF1ZW50IHJ1bm5pbmcgZHluaXggKi8KKyAgTV9BUk0gPSAxMDMsCQkvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLworICBNX1NQQVJDTEVUID0gMTMxLAkvKiBTUEFSQ2xldCA9IE1fU1BBUkMgKyAxMjggKi8KKyAgTV8zODZfTkVUQlNEID0gMTM0LAkvKiBOZXRCU0QvaTM4NiBiaW5hcnkgKi8KKyAgTV82OEtfTkVUQlNEID0gMTM1LAkvKiBOZXRCU0QvbTY4ayBiaW5hcnkgKi8KKyAgTV82OEs0S19ORVRCU0QgPSAxMzYsCS8qIE5ldEJTRC9tNjhrNGsgYmluYXJ5ICovCisgIE1fNTMyX05FVEJTRCA9IDEzNywJLyogTmV0QlNEL25zMzJrIGJpbmFyeSAqLworICBNX1NQQVJDX05FVEJTRCA9IDEzOCwJLyogTmV0QlNEL3NwYXJjIGJpbmFyeSAqLworICBNX1BNQVhfTkVUQlNEID0gMTM5LAkvKiBOZXRCU0QvcG1heCAoTUlQUyBsaXR0bGUtZW5kaWFuKSBiaW5hcnkgKi8KKyAgTV9WQVhfTkVUQlNEID0gMTQwLAkvKiBOZXRCU0QvdmF4IGJpbmFyeSAqLworICBNX0FMUEhBX05FVEJTRCA9IDE0MSwJLyogTmV0QlNEL2FscGhhIGJpbmFyeSAqLworICBNX0FSTTZfTkVUQlNEID0gMTQzLAkvKiBOZXRCU0QvYXJtMzIgYmluYXJ5ICovCisgIE1fU1BBUkNMRVRfMSA9IDE0NywJLyogMHg5MywgcmVzZXJ2ZWQgKi8KKyAgTV9NSVBTMSA9IDE1MSwgICAgICAgIC8qIE1JUFMgUjIwMDAvUjMwMDAgYmluYXJ5ICovCisgIE1fTUlQUzIgPSAxNTIsICAgICAgICAvKiBNSVBTIFI0MDAwL1I2MDAwIGJpbmFyeSAqLworICBNX1NQQVJDTEVUXzIgPSAxNjMsCS8qIDB4YTMsIHJlc2VydmVkICovCisgIE1fU1BBUkNMRVRfMyA9IDE3OSwJLyogMHhiMywgcmVzZXJ2ZWQgKi8KKyAgTV9TUEFSQ0xFVF80ID0gMTk1LAkvKiAweGMzLCByZXNlcnZlZCAqLworICBNX0hQMjAwID0gMjAwLAkvKiBIUCAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCisgIE1fSFAzMDAgPSAoMzAwICUgMjU2KSwgLyogSFAgMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLworICBNX0hQVVggPSAoMHgyMGMgJSAyNTYpLCAvKiBIUCAyMDAvMzAwIEhQVVggYmluYXJ5ICovCisgIE1fU1BBUkNMRVRfNSA9IDIxMSwJLyogMHhkMywgcmVzZXJ2ZWQgKi8KKyAgTV9TUEFSQ0xFVF82ID0gMjI3LAkvKiAweGUzLCByZXNlcnZlZCAqLworICAvKiAgTV9TUEFSQ0xFVF83ID0gMjQzCS8gKiAweGYzLCByZXNlcnZlZCAqLworICBNX1NQQVJDTElURV9MRSA9IDI0MworfTsKKworI2RlZmluZSBOX0RZTkFNSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweDgwMDAwMDAwKQorCisjaWZuZGVmIE5fTUFHSUMKKyMgZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCisjZW5kaWYKKworI2lmbmRlZiBOX01BQ0hUWVBFCisjIGRlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQorI2VuZGlmCisKKyNpZm5kZWYgTl9GTEFHUworIyBkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKKyNlbmRpZgorCisjaWZuZGVmIE5fU0VUX0lORk8KKyMgZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCisoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCisgfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKKyB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKKyNlbmRpZgorCisjaWZuZGVmIE5fU0VUX0RZTkFNSUMKKyMgZGVmaW5lIE5fU0VUX0RZTkFNSUMoZXhlYywgZHluYW1pYykgXAorKChleGVjKS5hX2luZm8gPSAoZHluYW1pYykgPyAoKGV4ZWMpLmFfaW5mbyB8IDB4ODAwMDAwMDApIDogXAorKChleGVjKS5hX2luZm8gJiAweDdmZmZmZmZmKSkKKyNlbmRpZgorCisjaWZuZGVmIE5fU0VUX01BR0lDCisjIGRlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAorKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCisjZW5kaWYKKworI2lmbmRlZiBOX1NFVF9NQUNIVFlQRQorIyBkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKKygoZXhlYykuYV9pbmZvID0gXAorICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCisjZW5kaWYKKworI2lmbmRlZiBOX1NFVF9GTEFHUworIyBkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKKygoZXhlYykuYV9pbmZvID0gXAorICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sIHsKKyAgYXN5bWJvbCBzeW1ib2w7CisgIHNob3J0IGRlc2M7CisgIGNoYXIgb3RoZXI7CisgIHVuc2lnbmVkIGNoYXIgdHlwZTsKK30gYW91dF9zeW1ib2xfdHlwZTsKKworLyogVGhlIGB0ZGF0YScgc3RydWN0IGZvciBhbGwgYS5vdXQtbGlrZSBvYmplY3QgZmlsZSBmb3JtYXRzLgorICAgVmFyaW91cyB0aGluZ3MgZGVwZW5kIG9uIHRoaXMgc3RydWN0IGJlaW5nIGFyb3VuZCBhbnkgdGltZSBhbiBhLm91dAorICAgZmlsZSBpcyBiZWluZyBoYW5kbGVkLiAgQW4gZXhhbXBsZSBpcyBkYnhyZWFkLmMgaW4gR0RCLiAgKi8KKworc3RydWN0IGFvdXRkYXRhIHsKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmhkcjsJCS8qIGV4ZWMgZmlsZSBoZWFkZXIgKi8KKyAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sczsJCS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCisgIAorICAvKiBGb3IgZWFzZSwgd2UgZG8gdGhpcyAqLworICBhc2VjdGlvbiAqdGV4dHNlYzsKKyAgYXNlY3Rpb24gKmRhdGFzZWM7CisgIGFzZWN0aW9uICpic3NzZWM7CisKKyAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCisgICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLiAgKi8KKyAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7CisgIGZpbGVfcHRyIHN0cl9maWxlcG9zOworCisgIC8qIFNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KKyAgdW5zaWduZWQgcmVsb2NfZW50cnlfc2l6ZTsKKworICAvKiBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KKyAgdW5zaWduZWQgc3ltYm9sX2VudHJ5X3NpemU7CisKKyAgLyogUGFnZSBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLworICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKKworICAvKiBTZWdtZW50IHNpemUgLSBuZWVkZWQgZm9yIGFsaWdubWVudCBvZiBkZW1hbmQgcGFnZWQgZmlsZXMuICovCisgIHVuc2lnbmVkIGxvbmcgc2VnbWVudF9zaXplOworCisgIC8qIFptYWdpYyBkaXNrIGJsb2NrIHNpemUgLSBuZWVkIHRvIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgdGV4dAorICAgICBzZWN0aW9uIGluIFpNQUdJQyBiaW5hcmllcy4gIE5vcm1hbGx5IHRoZSBzYW1lIGFzIHBhZ2Vfc2l6ZS4gICovCisgIHVuc2lnbmVkIGxvbmcgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZTsKKworICB1bnNpZ25lZCBleGVjX2J5dGVzX3NpemU7CisgIHVuc2lnbmVkIHZtYV9hZGp1c3RlZCA6IDE7CisKKyAgLyogdXNlZCB3aGVuIGEgYmZkIHN1cHBvcnRzIHNldmVyYWwgaGlnaGx5IHNpbWlsYXIgZm9ybWF0cyAqLworICBlbnVtCisgICAgeworICAgICAgZGVmYXVsdF9mb3JtYXQgPSAwLAorICAgICAgLyogVXNlZCBvbiBIUCA5MDAwLzMwMCBydW5uaW5nIEhQL1VYLiAgU2VlIGhwMzAwaHB1eC5jLiAgKi8KKyAgICAgIGdudV9lbmNhcF9mb3JtYXQsCisgICAgICAvKiBVc2VkIG9uIExpbnV4LCAzODZCU0QsIGV0Yy4gIFNlZSBpbmNsdWRlL2FvdXQvYW91dDY0LmguICAqLworICAgICAgcV9tYWdpY19mb3JtYXQKKyAgICB9IHN1YmZvcm1hdDsKKworICBlbnVtCisgICAgeworICAgICAgdW5kZWNpZGVkX21hZ2ljID0gMCwKKyAgICAgIHpfbWFnaWMsCisgICAgICBvX21hZ2ljLAorICAgICAgbl9tYWdpYworICAgIH0gbWFnaWM7CisKKyAgLyogQSBidWZmZXIgZm9yIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KKyAgY2hhciAqbGluZV9idWY7CisKKyAgLyogVGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0ZXJuYWxfc3ltczsKKyAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fY291bnQ7CisgIGJmZF93aW5kb3cgc3ltX3dpbmRvdzsKKyAgY2hhciAqZXh0ZXJuYWxfc3RyaW5nczsKKyAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zdHJpbmdfc2l6ZTsKKyAgYmZkX3dpbmRvdyBzdHJpbmdfd2luZG93OworICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworCisgIC8qIEEgcG9pbnRlciBmb3Igc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24uICAqLworICBQVFIgZHluYW1pY19pbmZvOworCisgIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0CisgICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZyBvbiBTdW5PUy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sCisgICAgIGluZGV4LiAgKi8KKyAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Cit9OworCitzdHJ1Y3QgIGFvdXRfZGF0YV9zdHJ1Y3QgeworICAgIHN0cnVjdCBhb3V0ZGF0YSBhOworICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Cit9OworCisjZGVmaW5lCWFkYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuYW91dF9kYXRhLT5hKQorI2RlZmluZQlleGVjX2hkcihiZmQpCQkoYWRhdGEoYmZkKS5oZHIpCisjZGVmaW5lCW9ial9hb3V0X3N5bWJvbHMoYmZkKQkoYWRhdGEoYmZkKS5zeW1ib2xzKQorI2RlZmluZQlvYmpfdGV4dHNlYyhiZmQpCShhZGF0YShiZmQpLnRleHRzZWMpCisjZGVmaW5lCW9ial9kYXRhc2VjKGJmZCkJKGFkYXRhKGJmZCkuZGF0YXNlYykKKyNkZWZpbmUJb2JqX2Jzc3NlYyhiZmQpCQkoYWRhdGEoYmZkKS5ic3NzZWMpCisjZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShhZGF0YShiZmQpLnN5bV9maWxlcG9zKQorI2RlZmluZQlvYmpfc3RyX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zdHJfZmlsZXBvcykKKyNkZWZpbmUJb2JqX3JlbG9jX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5yZWxvY19lbnRyeV9zaXplKQorI2RlZmluZQlvYmpfc3ltYm9sX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSkKKyNkZWZpbmUgb2JqX2FvdXRfc3ViZm9ybWF0KGJmZCkJKGFkYXRhKGJmZCkuc3ViZm9ybWF0KQorI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zeW1zKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltcykKKyNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50KGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltX2NvdW50KQorI2RlZmluZSBvYmpfYW91dF9zeW1fd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3ltX3dpbmRvdykKKyNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ3MpCisjZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3RyaW5nX3NpemUpCisjZGVmaW5lIG9ial9hb3V0X3N0cmluZ193aW5kb3coYmZkKSAoYWRhdGEoYmZkKS5zdHJpbmdfd2luZG93KQorI2RlZmluZSBvYmpfYW91dF9zeW1faGFzaGVzKGJmZCkgKGFkYXRhKGJmZCkuc3ltX2hhc2hlcykKKyNkZWZpbmUgb2JqX2FvdXRfZHluYW1pY19pbmZvKGJmZCkgKGFkYXRhKGJmZCkuZHluYW1pY19pbmZvKQorCisvKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCisgICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sICovCisjZGVmaW5lIGFvdXRfc3ltYm9sKGFzeW1ib2wpICgoYW91dF9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKKworLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBhLm91dCBzZWN0aW9uLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seQorICAgdXNlZCBieSB0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIuICAqLworCitzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0Cit7CisgIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLworICBQVFIgcmVsb2NzOworfTsKKworI2RlZmluZSBhb3V0X3NlY3Rpb25fZGF0YShzKSBcCisgICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKSAocyktPnVzZWRfYnlfYmZkKQorCisjZGVmaW5lIHNldF9hb3V0X3NlY3Rpb25fZGF0YShzLHYpIFwKKyAgKChzKS0+dXNlZF9ieV9iZmQgPSAoUFRSKSYodiktPnJlbG9jcykKKworLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gYW91dHguaCAgKi8KKworYm9vbGVhbgorTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7CisKK2Jvb2xlYW4KK05BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKikpOworCitjb25zdCBiZmRfdGFyZ2V0ICoKK05BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAorCQkJCSAgICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrKShiZmQgKikpKTsKKworYm9vbGVhbgorTkFNRShhb3V0LG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworZW51bSBtYWNoaW5lX3R5cGUKK05BTUUoYW91dCxtYWNoaW5lX3R5cGUpIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAorCQkJCSB1bnNpZ25lZCBsb25nIG1hY2hpbmUsCisJCQkJIGJvb2xlYW4gKnVua25vd24pKTsKKworYm9vbGVhbgorTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCisJCSAJCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7CisKK2Jvb2xlYW4KK05BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpuZXdzZWN0KSk7CisKK2Jvb2xlYW4KK05BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCisJCQkgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpKTsKKworYXN5bWJvbCAqCitOQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitib29sZWFuCitOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKiwKKwkJCQkJICAgc3RydWN0IGV4dGVybmFsX25saXN0ICosCisJCQkJCSAgIGJmZF9zaXplX3R5cGUsIGNoYXIgKiwKKwkJCQkJICAgYmZkX3NpemVfdHlwZSwKKwkJCQkJICAgYm9vbGVhbiBkeW5hbWljKSk7CisKK2Jvb2xlYW4KK05BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitib29sZWFuCitOQU1FKGFvdXQsd3JpdGVfc3ltcykgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK3ZvaWQKK05BTUUoYW91dCxyZWNsYWltX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2xvbmcKK05BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworbG9uZworTkFNRShhb3V0LGdldF9zeW10YWIpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uKSk7CisKK3ZvaWQKK05BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKKwkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKK3ZvaWQKK05BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKKwkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKKworcmVsb2NfaG93dG9fdHlwZSAqCitOQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKKwkJCQkgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworCitib29sZWFuCitOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCwKKwkJCQkgICAgICBhc3ltYm9sICoqc3ltYm9scykpOworCitsb25nCitOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdGlvbiwKKwkJCQkgICAgICAgYXJlbGVudCAqKnJlbHB0ciwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKKworbG9uZworTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIGFzZWN0KSk7CisKK3ZvaWQKK05BTUUoYW91dCxyZWNsYWltX3JlbG9jKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBzZWNfcHRyIGlnbm9yZSkpOworCithbGVudCAqCitOQU1FKGFvdXQsZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCkpOworCit2b2lkCitOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBQVFIgZmlsZSwKKwkJCSAgICBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKKwordm9pZAorTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOworCitib29sZWFuCitOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCisgICAgICBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCisgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOworCitsb25nCitOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOworCithc3ltYm9sICoKK05BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKKwkJCQkJIGFzeW1ib2wgKikpOworCitpbnQKK05BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGV4ZWMpKTsKKworYm9vbGVhbgorTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgUEFSQU1TICgoYmZkICphYmZkLAorICAgICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZSwgZmlsZV9wdHIgKnRleHRfZW5kKSk7CisKK3ZvaWQKK05BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSBQQVJBTVMgKChiZmQgKmFiZmQsCisgICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7CisKK3ZvaWQKK05BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgUEFSQU1TICgoYmZkICphYmZkLAorICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOworCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKQorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworCitib29sZWFuCitOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpCisgICAgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKKwkgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJCSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCSAgY29uc3QgY2hhciAqKSkpOworCitzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKKworYm9vbGVhbgorTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK2Jvb2xlYW4KK05BTUUoYW91dCxmaW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCSAgICAgICB2b2lkICgqKSAoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosCisJCQkJCSBmaWxlX3B0ciAqKSkpOworCitib29sZWFuCitOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qIEEub3V0IHVzZXMgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMuLi4gKi8KKworI2RlZmluZQlhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cworCisjZGVmaW5lCWFvdXRfNjRfZ2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCisjaWZuZGVmIE5PX1dSSVRFX0hFQURFUl9LTFVER0UKKyNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAwCisjZW5kaWYKKworI2lmbmRlZiBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIGFvdXRfMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2VuZGlmCisKKyNpZm5kZWYgV1JJVEVfSEVBREVSUworI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKKwlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCisJaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCisJICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKKyAgICAJCQkJCQkJCQkgICAgICBcCisJZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAorCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCisgICAgCQkJCQkJCQkJICAgICAgXAorCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAorCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKKwlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKKwkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCisJTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCisJaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAorCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAorCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCisJLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKKyAgCQkJCQkJCQkJICAgICAgXAorCWlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkgICAgICBcCisJICAgICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCisJICB7CQkJCQkJCQkgICAgICBcCisJICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKKwkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCSAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKKwkgIH0JCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKwlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAorCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCisJaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgICAgICAgIFwKKwkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgICBcCisJICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKKwlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgICAgICAgXAorCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgCisjZW5kaWYKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCQU9VVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC1pbi5oIGIvYmZkL2xpYmJmZC1pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNGE0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbGliYmZkLWluLmgKQEAgLTAsMCArMSw1MzggQEAKKy8qIGxpYmJmZC5oIC0tIERlY2xhcmF0aW9ucyB1c2VkIGJ5IGJmZCBsaWJyYXJ5ICppbXBsZW1lbnRhdGlvbiouCisgICAoVGhpcyBpbmNsdWRlIGZpbGUgaXMgbm90IGZvciB1c2VycyBvZiB0aGUgbGlicmFyeS4pCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCisqKiBOT1RFOiBsaWJiZmQuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAorKiogY2hhbmdlIGxpYmJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bworKiogZ2VuZXJhdGUgdGhpcyBmaWxlLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFsaWduIGFuIGFkZHJlc3MgdXB3YXJkIHRvIGEgYm91bmRhcnksIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcy4KKyAgIEUuZy4gYWxpZ24gdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHdpdGggYXJndW1lbnQgb2YgOC4gIFRha2UgY2FyZSBuZXZlcgorICAgdG8gd3JhcCBhcm91bmQgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIGJvdW5kYXJ5LTEgb2YgdGhlIGVuZCBvZiB0aGUKKyAgIGFkZHJlc3Mgc3BhY2UuICAqLworI2RlZmluZSBCRkRfQUxJR04odGhpcywgYm91bmRhcnkpCQkJCQlcCisgICgoKChiZmRfdm1hKSAodGhpcykgKyAoYm91bmRhcnkpIC0gMSkgPj0gKGJmZF92bWEpICh0aGlzKSkJCVwKKyAgID8gKCgoYmZkX3ZtYSkgKHRoaXMpICsgKChib3VuZGFyeSkgLSAxKSkgJiAofigoYm91bmRhcnkpLTEpKSkJXAorICAgOiB+IChiZmRfdm1hKSAwKQorCisvKiBJZiB5b3Ugd2FudCB0byByZWFkIGFuZCB3cml0ZSBsYXJnZSBibG9ja3MsIHlvdSBtaWdodCB3YW50IHRvIGRvIGl0CisgICBpbiBxdWFudGEgb2YgdGhpcyBhbW91bnQgKi8KKyNkZWZpbmUgREVGQVVMVF9CVUZGRVJTSVpFIDgxOTIKKworLyogU2V0IGEgdGRhdGEgZmllbGQuICBDYW4ndCB1c2UgdGhlIG90aGVyIG1hY3JvcyBmb3IgdGhpcywgc2luY2UgdGhleQorICAgZG8gY2FzdHMsIGFuZCBjYXN0aW5nIHRvIHRoZSBsZWZ0IG9mIGFzc2lnbm1lbnQgaXNuJ3QgcG9ydGFibGUuICAqLworI2RlZmluZSBzZXRfdGRhdGEoYmZkLCB2KSAoKGJmZCktPnRkYXRhLmFueSA9IChQVFIpICh2KSkKKworLyogSWYgQkZEX0lOX01FTU9SWSBpcyBzZXQgZm9yIGEgQkZELCB0aGVuIHRoZSBpb3N0cmVhbSBmaWVsZHMgcG9pbnRzCisgICB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBiZmRfaW5fbWVtb3J5Cit7CisgIC8qIFNpemUgb2YgYnVmZmVyLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBzaXplOworICAvKiBCdWZmZXIgaG9sZGluZyBjb250ZW50cyBvZiBCRkQuICAqLworICBiZmRfYnl0ZSAqYnVmZmVyOworfTsKKworLyogdGRhdGEgZm9yIGFuIGFyY2hpdmUuICBGb3IgYW4gaW5wdXQgYXJjaGl2ZSwgY2FjaGUKKyAgIG5lZWRzIHRvIGJlIGZyZWUoKSdkLiAgRm9yIGFuIG91dHB1dCBhcmNoaXZlLCBzeW1kZWZzIGRvLiAgKi8KKworc3RydWN0IGFydGRhdGEgeworICBmaWxlX3B0ciBmaXJzdF9maWxlX2ZpbGVwb3M7CisgIC8qIFNwZWVkIHVwIHNlYXJjaGluZyB0aGUgYXJtYXAgKi8KKyAgc3RydWN0IGFyX2NhY2hlICpjYWNoZTsKKyAgYmZkICphcmNoaXZlX2hlYWQ7ICAgICAgICAgICAgLyogT25seSBpbnRlcmVzdGluZyBpbiBvdXRwdXQgcm91dGluZXMgKi8KKyAgY2Fyc3ltICpzeW1kZWZzOwkJLyogdGhlIHN5bWRlZiBlbnRyaWVzICovCisgIHN5bWluZGV4IHN5bWRlZl9jb3VudDsgICAgICAgICAgICAgLyogaG93IG1hbnkgdGhlcmUgYXJlICovCisgIGNoYXIgKmV4dGVuZGVkX25hbWVzOwkJLyogY2xldmVyIGludGVsIGV4dGVuc2lvbiAqLworICAvKiB3aGVuIG1vcmUgY29tcGlsZXJzIGFyZSBzdGFuZGFyZCBDLCB0aGlzIGNhbiBiZSBhIHRpbWVfdCAqLworICBsb25nICBhcm1hcF90aW1lc3RhbXA7CS8qIFRpbWVzdGFtcCB2YWx1ZSB3cml0dGVuIGludG8gYXJtYXAuCisJCQkJICAgVGhpcyBpcyB1c2VkIGZvciBCU0QgYXJjaGl2ZXMgdG8gY2hlY2sKKwkJCQkgICB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgcmVjZW50IGVub3VnaAorCQkJCSAgIGZvciB0aGUgQlNEIGxpbmtlciB0byBub3QgY29tcGxhaW4sCisJCQkJICAganVzdCBiZWZvcmUgd2UgZmluaXNoIHdyaXRpbmcgYW4KKwkJCQkgICBhcmNoaXZlLiAgKi8KKyAgZmlsZV9wdHIgYXJtYXBfZGF0ZXBvczsJLyogUG9zaXRpb24gd2l0aGluIGFyY2hpdmUgdG8gc2VlayB0bworCQkJCSAgIHJld3JpdGUgdGhlIGRhdGUgZmllbGQuICAqLworICBQVFIgdGRhdGE7CQkJLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCit9OworCisjZGVmaW5lIGJmZF9hcmRhdGEoYmZkKSAoKGJmZCktPnRkYXRhLmFvdXRfYXJfZGF0YSkKKworLyogR29lcyBpbiBiZmQncyBhcmVsdF9kYXRhIHNsb3QgKi8KK3N0cnVjdCBhcmVsdGRhdGEgeworICBjaGFyICogYXJjaF9oZWFkZXI7CQkJICAgICAvKiBpdCdzIGFjdHVhbGx5IGEgc3RyaW5nICovCisgIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsgICAgIC8qIG9jdGV0cyBvZiBmaWxlc2l6ZSBub3QgaW5jbHVkaW5nIGFyX2hkciAqLworICBjaGFyICpmaWxlbmFtZTsJCQkgICAgIC8qIG51bGwtdGVybWluYXRlZCAqLworfTsKKworI2RlZmluZSBhcmVsdF9zaXplKGJmZCkgKCgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpLT5wYXJzZWRfc2l6ZSkKKworZXh0ZXJuIFBUUiBiZmRfbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworZXh0ZXJuIFBUUiBiZmRfcmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworZXh0ZXJuIFBUUiBiZmRfem1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKKworZXh0ZXJuIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyOworCisvKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBhbmQgZnJlZSB0aGluZ3Mgb24gdGhlIEJGRCdzIG9iamFsbG9jLiAgKi8KKworZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOworZXh0ZXJuIFBUUiBiZmRfemFsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKK2V4dGVybiB2b2lkIGJmZF9yZWxlYXNlIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKKworYmZkICoJX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIFBBUkFNUyAoKGJmZCAqb2JmZCkpOworYmZkICoJX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUgUEFSQU1TICgoYmZkICphcmNoX2JmZCwgZmlsZV9wdHIgaW5kZXgpKTsKK2Jvb2xlYW4gX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmQgKikpOworYm9vbGVhbglfYmZkX2dlbmVyaWNfbWthcmNoaXZlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworY29uc3QgYmZkX3RhcmdldCAqYmZkX2dlbmVyaWNfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworYm9vbGVhbgliZmRfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Citib29sZWFuIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIgUEFSQU1TICgoYmZkICphYmZkKSk7CisjZGVmaW5lIGJmZF9zbHVycF9ic2RfYXJtYXAgYmZkX3NsdXJwX2FybWFwCisjZGVmaW5lIGJmZF9zbHVycF9jb2ZmX2FybWFwIGJmZF9zbHVycF9hcm1hcAorYm9vbGVhbglfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICopKTsKK2Jvb2xlYW4JX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworYm9vbGVhbiBfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCkpOworYmZkICpfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyBQQVJBTVMgKChiZmQgKmFyY2hpdmUsIGZpbGVfcHRyIGZpbGVwb3MpKTsKK2V4dGVybiBiZmQgKl9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOworYmZkICogX2JmZF9uZXdfYmZkIFBBUkFNUyAoKHZvaWQpKTsKKworYm9vbGVhbgliZmRfZmFsc2UgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKK2Jvb2xlYW4JYmZkX3RydWUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKK1BUUgliZmRfbnVsbHZvaWRwdHIgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKK2ludAliZmRfMCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwordW5zaWduZWQgaW50CWJmZF8wdSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOworbG9uZwliZmRfMGwgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKK2xvbmcJX2JmZF9uMSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwordm9pZAliZmRfdm9pZCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOworCitiZmQgKl9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gUEFSQU1TICgoYmZkICopKTsKK2NvbnN0IGJmZF90YXJnZXQgKl9iZmRfZHVtbXlfdGFyZ2V0IFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCit2b2lkCWJmZF9kb250X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAorCQkJCQljaGFyICpoZHIpKTsKK3ZvaWQJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKKwkJCQkJY2hhciAqaGRyKSk7Cit2b2lkCWJmZF9nbnVfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCisJCQkJCWNoYXIgKmhkcikpOworCitib29sZWFuCWJzZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAorCQkJCSAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7CisKK2Jvb2xlYW4JY29mZl93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAorCQkJCSAgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOworCitleHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciBQQVJBTVMgKChiZmQgKikpOworCitleHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworCitiZmQgKgliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLAorCQkJCQkJICAgICBiZmQgKmxhc3RfZmlsZSkpOworCitpbnQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOworCisjZGVmaW5lIF9iZmRfcmVhZF9hcl9oZHIoYWJmZCkgXAorICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWFkX2FyX2hkcl9mbiwgKGFiZmQpKQorDAorLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMuICBVc2UKKyAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYykuICAqLworCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cCBiZmRfdHJ1ZQorI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gYmZkX3RydWUKKyNkZWZpbmUgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQorZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKKwkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfd2luZG93ICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisKKy8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1BZLiAgVXNlCisgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLiAgKi8KKworI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQorI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKKyNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQorI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKKyNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX3RydWUpCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIFBUUikpKSBiZmRfdHJ1ZSkKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1JFIHdoZW4gdGhlcmUgaXMgbm8gY29yZSBmaWxlCisgICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKS4gICovCisKK2V4dGVybiBjaGFyICpfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gaW50IF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworCisvKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgd2hlbiB0aGVyZSBpcyBubyBhcmNoaXZlCisgICBmaWxlIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLiAgKi8KKworI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9hcm1hcCBiZmRfZmFsc2UKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAorICAgYmZkX2ZhbHNlKQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV90cnVuY2F0ZV9hcm5hbWUgXAorICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNoYXIgKikpKSBiZmRfdm9pZCkKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfd3JpdGVfYXJtYXAgXAorICAoKGJvb2xlYW4gKCopIFwKKyAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKKyAgIGJmZF9mYWxzZSkKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCisjZGVmaW5lIF9iZmRfbm9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCisgICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCisgICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSkpIGJmZF9udWxsdm9pZHB0cikKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfZmFsc2UKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBCU0Qgc3R5bGUKKyAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLiAgKi8KKworI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2FybWFwIGJmZF9zbHVycF9ic2RfYXJtYXAKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKKyAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCitleHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF90cnVuY2F0ZV9hcm5hbWUgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF93cml0ZV9hcm1hcCBic2Rfd3JpdGVfYXJtYXAKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAorICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4CisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKKyAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAorZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQ09GRiBzdHlsZQorICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLiAgKi8KKworI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9hcm1hcCBiZmRfc2x1cnBfY29mZl9hcm1hcAorI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKKyAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCitleHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQorICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7CisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfd3JpdGVfYXJtYXAgY29mZl93cml0ZV9hcm1hcAorI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKKyAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKKyAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAorI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCisKKy8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyB3aGVyZSB0aGVyZSBpcyBubyBzeW1ib2wKKyAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLiAgKi8KKworI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYiBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWFrZV9lbXB0eV9zeW1ib2wgXAorICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbCBcCisgICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKSkgYmZkX3ZvaWQpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbyBcCisgICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpKSBiZmRfdm9pZCkKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKSkgYmZkX2ZhbHNlKQorI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vIFwKKyAgKChhbGVudCAqKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX251bGx2b2lkcHRyKQorI2RlZmluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZSBcCisgICgoYm9vbGVhbiAoKikgXAorICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLCBcCisJICAgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpKSBcCisgICBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBcCisgICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHVuc2lnbmVkIGxvbmcpKSkgYmZkX251bGx2b2lkcHRyKQorI2RlZmluZSBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzIFwKKyAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSkpIF9iZmRfbjEpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sIFwKKyAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSkpIFwKKyAgIGJmZF9udWxsdm9pZHB0cikKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9SRUxPQ1Mgd2hlbiB0aGVyZSBpcyBubyByZWxvYworICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLiAgKi8KKworI2RlZmluZSBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgX2JmZF9uMSkKKyNkZWZpbmUgX2JmZF9ub3JlbG9jc19jYW5vbmljYWxpemVfcmVsb2MgXAorICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCisjZGVmaW5lIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKKyAgKChyZWxvY19ob3d0b190eXBlICooKikgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBcCisgICBiZmRfbnVsbHZvaWRwdHIpCisKKy8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUgZm9yIHRhcmdldHMgd2hpY2ggbWF5IG5vdAorICAgYmUgd3JpdHRlbi4gIFVzZSBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9ub3dyaXRlKS4gICovCisKKyNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9hcmNoX21hY2ggXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKSkgXAorICAgYmZkX2ZhbHNlKQorI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X3NlY3Rpb25fY29udGVudHMgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSkpIFwKKyAgIGJmZF9mYWxzZSkKKworLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFLiAgVXNlCisgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKS4gICovCisKKyNkZWZpbmUgX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAorZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisKKy8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfTElOSyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKKyAgIHN1cHBvcnQgbGlua2luZy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluaykuICAqLworCisjZGVmaW5lIF9iZmRfbm9saW5rX3NpemVvZl9oZWFkZXJzICgoaW50ICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpKSBiZmRfMCkKKyNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgICgoYmZkX2J5dGUgKigqKSBcCisgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBcCisJICAgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSkpIFwKKyAgIGJmZF9udWxsdm9pZHB0cikKKyNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX3JlbGF4X3NlY3Rpb24gXAorICAoKGJvb2xlYW4gKCopIFwKKyAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpIFwKKyAgIGJmZF9mYWxzZSkKKyNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zIFwKKyAgKChib29sZWFuICgqKSBcCisgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgXAorICAgYmZkX2ZhbHNlKQorI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCisgICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCisjZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2FkZF9zeW1ib2xzIFwKKyAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9maW5hbF9saW5rIFwKKyAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX2ZhbHNlKQorCisvKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90CisgICBoYXZlIGR5bmFtaWMgc3ltYm9scyBvciByZWxvY3MuICBVc2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQworICAgKF9iZmRfbm9keW5hbWljKS4gICovCisKKyNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKKyNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKKyAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQorI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBfYmZkX24xCisjZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKKyAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQorDAorLyogR2VuZXJpYyByb3V0aW5lIHRvIGRldGVybWluZSBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGlzIGEgbG9jYWwKKyAgIGxhYmVsLiAgKi8KK2V4dGVybiBib29sZWFuIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworCisvKiBHZW5lcmljIG1pbmlzeW1ib2wgcm91dGluZXMuICAqLworZXh0ZXJuIGxvbmcgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOworZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKTsKKworLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lCisgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuICosIGNvbnN0IGNoYXIgKiosCisJICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIFBUUiAqKSk7CisKKy8qIEZpbmQgdGhlIG5lYWRlcnN0IGxpbmUgdXNpbmcgRFdBUkYgMSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCisJICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKKworLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIERXQVJGIDIgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAorCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7CisKKy8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKKwkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAorCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOworCisvKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0CisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAorCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKKworLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCitleHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKy8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKKyAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKKyAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOworCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KK3R5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7CisKKy8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKKwkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKKwkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOworCisvKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKKworLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOworCisvKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CisKKy8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCitleHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKKworLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLworZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKKyAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7CisKKy8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KK2V4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cworICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisKKy8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLworCitleHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicworICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7CisKKy8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLworCitleHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKKyAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOworCisvKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLworCitleHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKKworLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KKyAgIHNlY3Rpb25zLiAgKi8KKworZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0CisgIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKKworLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKKworLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCitleHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLworZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKKworLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KK2V4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7CisKKy8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCitleHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKKwkgICBib29sZWFuIGNvcHkpKTsKKworLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOworDAorLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgorCisgICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCisgICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCisgICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCisgICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCisgICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgorKi8KKworI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKKyNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKKwordm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOworCisjZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoreyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KKworI2RlZmluZSBCRkRfRkFJTCgpIFwKK3sgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KKworRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7CisKK2V4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOworCisvKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKKyAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107CisKKy8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubworICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQorc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKKyNlbmRpZgorCitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAorCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKKwkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7CisKK2V4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOworCisvKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubworICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCisKK2V4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKKwkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7CisKKy8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KKwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC5jIGIvYmZkL2xpYmJmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmQxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbGliYmZkLmMKQEAgLTAsMCArMSwxMjYzIEBACisvKiBBc3NvcnRlZCBCRkQgc3VwcG9ydCByb3V0aW5lcywgb25seSB1c2VkIGludGVybmFsbHkuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorI2RlZmluZSBnZXRwYWdlc2l6ZSgpIDIwNDgKKyNlbmRpZgorCitzdGF0aWMgaW50IHJlYWxfcmVhZCBQQVJBTVMgKChQVFIsIHNpemVfdCwgc2l6ZV90LCBGSUxFICopKTsKKworLyoKK1NFQ1RJT04KKwlJbnRlcm5hbCBmdW5jdGlvbnMKKworREVTQ1JJUFRJT04KKwlUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCB3aXRoaW4gQkZELgorCVRoZXkgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZXhwb3J0LCBidXQgYXJlIGRvY3VtZW50ZWQgaGVyZSBmb3IKKwljb21wbGV0ZW5lc3MuCisqLworCisvKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKKyAgIG9wZXJhdGlvbnMuICAqLworCisvKkFSR1NVU0VEKi8KK2Jvb2xlYW4KK2JmZF9mYWxzZSAoaWdub3JlKQorICAgICBiZmQgKmlnbm9yZTsKK3sKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3Igc3VwcG9ydGVkIG9wZXJhdGlvbnMKKyAgIHdoaWNoIGRvIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZy4gICovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorYmZkX3RydWUgKGlnbm9yZSkKKyAgICAgYmZkICppZ25vcmU7Cit7CisgIHJldHVybiB0cnVlOworfQorCisvKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKKyAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB2YWx1ZS4gICovCisKKy8qQVJHU1VTRUQqLworUFRSCitiZmRfbnVsbHZvaWRwdHIgKGlnbm9yZSkKKyAgICAgYmZkICppZ25vcmU7Cit7CisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgIHJldHVybiBOVUxMOworfQorCisvKkFSR1NVU0VEKi8KK2ludCAKK2JmZF8wIChpZ25vcmUpCisgICAgIGJmZCAqaWdub3JlOworeworICByZXR1cm4gMDsKK30KKworLypBUkdTVVNFRCovCit1bnNpZ25lZCBpbnQgCitiZmRfMHUgKGlnbm9yZSkKKyAgICAgYmZkICppZ25vcmU7Cit7CisgICByZXR1cm4gMDsKK30KKworLypBUkdVU0VEKi8KK2xvbmcKK2JmZF8wbCAoaWdub3JlKQorICAgICBiZmQgKmlnbm9yZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEEgcm91dGluZSB3aGljaCBpcyB1c2VkIGluIHRhcmdldCB2ZWN0b3JzIGZvciB1bnN1cHBvcnRlZAorICAgb3BlcmF0aW9ucyB3aGljaCByZXR1cm4gLTEgb24gZXJyb3IuICAqLworCisvKkFSR1NVU0VEKi8KK2xvbmcKK19iZmRfbjEgKGlnbm9yZV9hYmZkKQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworeworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICByZXR1cm4gLTE7Cit9CisKKy8qQVJHU1VTRUQqLwordm9pZCAKK2JmZF92b2lkIChpZ25vcmUpCisgICAgIGJmZCAqaWdub3JlOworeworfQorCisvKkFSR1NVU0VEKi8KK2Jvb2xlYW4KK19iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoaWdub3JlX2NvcmVfYmZkLCBpZ25vcmVfZXhlY19iZmQpCisgICAgIGJmZCAqaWdub3JlX2NvcmVfYmZkOworICAgICBiZmQgKmlnbm9yZV9leGVjX2JmZDsKK3sKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGVudHJ5IHBvaW50IGZvciB0YXJnZXRzCisgICB3aXRob3V0IGNvcmUgZmlsZSBzdXBwb3J0LiAgKi8KKworLypBUkdTVVNFRCovCitjaGFyICoKK19iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGlnbm9yZV9hYmZkKQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworeworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICByZXR1cm4gKGNoYXIgKilOVUxMOworfQorCisvKiBSb3V0aW5lIHRvIGhhbmRsZSBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgZW50cnkgcG9pbnQgZm9yIHRhcmdldHMKKyAgIHdpdGhvdXQgY29yZSBmaWxlIHN1cHBvcnQuICAqLworCisvKkFSR1NVU0VEKi8KK2ludAorX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKK3sKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qQVJHU1VTRUQqLworY29uc3QgYmZkX3RhcmdldCAqCitfYmZkX2R1bW15X3RhcmdldCAoaWdub3JlX2FiZmQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7Cit7CisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICByZXR1cm4gMDsKK30KKwwKKy8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MuICAqLworCitQVFIKK2JmZF9tYWxsb2MgKHNpemUpCisgICAgIHNpemVfdCBzaXplOworeworICBQVFIgcHRyOworCisgIHB0ciA9IChQVFIpIG1hbGxvYyAoc2l6ZSk7CisgIGlmIChwdHIgPT0gTlVMTCAmJiBzaXplICE9IDApCisgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgIHJldHVybiBwdHI7Cit9CisKKy8qIFJlYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHJlYWxsb2MuICAqLworCitQVFIKK2JmZF9yZWFsbG9jIChwdHIsIHNpemUpCisgICAgIFBUUiBwdHI7CisgICAgIHNpemVfdCBzaXplOworeworICBQVFIgcmV0OworCisgIGlmIChwdHIgPT0gTlVMTCkKKyAgICByZXQgPSBtYWxsb2MgKHNpemUpOworICBlbHNlCisgICAgcmV0ID0gcmVhbGxvYyAocHRyLCBzaXplKTsKKworICBpZiAocmV0ID09IE5VTEwpCisgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQWxsb2NhdGUgbWVtb3J5IHVzaW5nIG1hbGxvYyBhbmQgY2xlYXIgaXQuICAqLworCitQVFIKK2JmZF96bWFsbG9jIChzaXplKQorICAgICBzaXplX3Qgc2l6ZTsKK3sKKyAgUFRSIHB0cjsKKworICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOworCisgIGlmIChzaXplICE9IDApCisgICAgeworICAgICAgaWYgKHB0ciA9PSBOVUxMKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgZWxzZQorCW1lbXNldCAocHRyLCAwLCBzaXplKTsKKyAgICB9CisKKyAgcmV0dXJuIHB0cjsKK30KKwwKKy8qIFNvbWUgSU8gY29kZSAqLworCisKKy8qIE5vdGUgdGhhdCBhcmNoaXZlIGVudHJpZXMgZG9uJ3QgaGF2ZSBzdHJlYW1zOyB0aGV5IHNoYXJlIHRoZWlyIHBhcmVudCdzLgorICAgVGhpcyBhbGxvd3Mgc29tZW9uZSB0byBwbGF5IHdpdGggdGhlIGlvc3RyZWFtIGJlaGluZCBCRkQncyBiYWNrLgorCisgICBBbHNvLCBub3RlIHRoYXQgdGhlIG9yaWdpbiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZSdzCisgICBjb250ZW50cyAoMCBmb3Igbm9uLWFyY2hpdmUgZWxlbWVudHMpLiAgRm9yIGFyY2hpdmUgZW50cmllcyB0aGlzIGlzIHRoZQorICAgZmlyc3Qgb2N0ZXQgaW4gdGhlIGZpbGUsIE5PVCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcmNoaXZlIGhlYWRlci4gKi8KKworc3RhdGljIGludAorcmVhbF9yZWFkICh3aGVyZSwgYSxiLCBmaWxlKQorICAgICBQVFIgd2hlcmU7CisgICAgIHNpemVfdCBhOworICAgICBzaXplX3QgYjsKKyAgICAgRklMRSAqZmlsZTsKK3sKKyAgLyogRklYTUUgLSB0aGlzIGxvb2tzIGxpa2UgYW4gb3B0aW1pemF0aW9uLCBidXQgaXQncyByZWFsbHkgdG8gY292ZXIKKyAgICAgdXAgZm9yIGEgZmVhdHVyZSBvZiBzb21lIE9TcyAobm90IHNvbGFyaXMgLSBzaWdoKSB0aGF0CisgICAgIGxkL3BlLWRsbC5jIHRha2VzIGFkdmFudGFnZSBvZiAoYXBwYXJlbnRseSkgd2hlbiBpdCBjcmVhdGVzIEJGRHMKKyAgICAgaW50ZXJuYWxseSBhbmQgdHJpZXMgdG8gbGluayBhZ2FpbnN0IHRoZW0uICBCRkQgc2VlbXMgdG8gYmUgc21hcnQKKyAgICAgZW5vdWdoIHRvIHJlYWxpemUgdGhlcmUgYXJlIG5vIHN5bWJvbCByZWNvcmRzIGluIHRoZSAiZmlsZSIgdGhhdAorICAgICBkb2Vzbid0IGV4aXN0IGJ1dCBhdHRlbXB0cyB0byByZWFkIHRoZW0gYW55d2F5LiAgT24gU29sYXJpcywKKyAgICAgYXR0ZW1wdGluZyB0byByZWFkIHplcm8gYnl0ZXMgZnJvbSBhIE5VTEwgZmlsZSByZXN1bHRzIGluIGEgY29yZQorICAgICBkdW1wLCBidXQgb24gb3RoZXIgcGxhdGZvcm1zIGl0IGp1c3QgcmV0dXJucyB6ZXJvIGJ5dGVzIHJlYWQuCisgICAgIFRoaXMgbWFrZXMgaXQgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuIC0gREogKi8KKyAgaWYgKGEgPT0gMCB8fCBiID09IDApCisgICAgcmV0dXJuIDA7CisKKyNpZiBkZWZpbmVkIChfX1ZBWCkgJiYgZGVmaW5lZCAoVk1TKQorICAvKiBBcHBhcmVudGx5IGZyZWFkIG9uIFZheCBWTVMgZG9lcyBub3Qga2VlcCB0aGUgcmVjb3JkIGxlbmd0aAorICAgICBpbmZvcm1hdGlvbi4gICovCisgIHJldHVybiByZWFkIChmaWxlbm8gKGZpbGUpLCB3aGVyZSwgYSAqIGIpOworI2Vsc2UKKyAgcmV0dXJuIGZyZWFkICh3aGVyZSwgYSwgYiwgZmlsZSk7CisjZW5kaWYKK30KKworLyogUmV0dXJuIHZhbHVlIGlzIGFtb3VudCByZWFkIChGSVhNRTogaG93IGFyZSBlcnJvcnMgYW5kIGVuZCBvZiBmaWxlIGRlYWx0CisgICB3aXRoPyAgV2UgbmV2ZXIgY2FsbCBiZmRfc2V0X2Vycm9yLCB3aGljaCBpcyBwcm9iYWJseSBhIG1pc3Rha2UpLiAgKi8KKworYmZkX3NpemVfdHlwZQorYmZkX3JlYWQgKHB0ciwgc2l6ZSwgbml0ZW1zLCBhYmZkKQorICAgICBQVFIgcHRyOworICAgICBiZmRfc2l6ZV90eXBlIHNpemU7CisgICAgIGJmZF9zaXplX3R5cGUgbml0ZW1zOworICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBucmVhZDsKKworICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2luX21lbW9yeSAqYmltOworICAgICAgYmZkX3NpemVfdHlwZSBnZXQ7CisKKyAgICAgIGJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBhYmZkLT5pb3N0cmVhbTsKKyAgICAgIGdldCA9IHNpemUgKiBuaXRlbXM7CisgICAgICBpZiAoYWJmZC0+d2hlcmUgKyBnZXQgPiBiaW0tPnNpemUpCisJeworCSAgZ2V0ID0gYmltLT5zaXplIC0gYWJmZC0+d2hlcmU7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOworCX0KKyAgICAgIG1lbWNweSAocHRyLCBiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBnZXQpOworICAgICAgYWJmZC0+d2hlcmUgKz0gZ2V0OworICAgICAgcmV0dXJuIGdldDsKKyAgICB9CisKKyAgbnJlYWQgPSByZWFsX3JlYWQgKHB0ciwgMSwgKHNpemVfdCkoc2l6ZSpuaXRlbXMpLCBiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKKyAgaWYgKG5yZWFkID4gMCkKKyAgICBhYmZkLT53aGVyZSArPSBucmVhZDsKKworICAvKiBTZXQgYmZkX2Vycm9yIGlmIHdlIGRpZCBub3QgcmVhZCBhcyBtdWNoIGRhdGEgYXMgd2UgZXhwZWN0ZWQuCisKKyAgICAgSWYgdGhlIHJlYWQgZmFpbGVkIGR1ZSB0byBhbiBlcnJvciBzZXQgdGhlIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKKyAgICAgZWxzZSBzZXQgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLgorCisgICAgIEEgQkZEIGJhY2tlbmQgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkIHRvCisgICAgIHByb3ZpZGUgc29tZXRoaW5nIG1vcmUgdXNlZnVsIChlZy4gbm9fc3ltYm9scyBvciB3cm9uZ19mb3JtYXQpLiAgKi8KKyAgaWYgKG5yZWFkIDwgKGludCkoc2l6ZSAqIG5pdGVtcykpCisgICAgeworICAgICAgaWYgKGZlcnJvciAoYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICBlbHNlCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKKyAgICB9CisKKyAgcmV0dXJuIG5yZWFkOworfQorCisvKiBUaGUgd2luZG93IHN1cHBvcnQgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGJlIGJyb2tlbiBvdXQgaW50bworICAgYW5vdGhlciBmaWxlLi4uLiAgKi8KKy8qIFRoZSBpZGVhIGJlaGluZCB0aGUgbmV4dCBhbmQgcmVmY291bnQgZmllbGRzIGlzIHRoYXQgb25lIG1hcHBlZAorICAgcmVnaW9uIGNhbiBzdWZmaWNlIGZvciBtdWx0aXBsZSByZWFkLW9ubHkgd2luZG93cyBvciBtdWx0aXBsZQorICAgbm9uLW92ZXJsYXBwaW5nIHJlYWQtd3JpdGUgd2luZG93cy4gIEl0J3Mgbm90IGltcGxlbWVudGVkIHlldAorICAgdGhvdWdoLiAgKi8KK3N0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCB7CisgIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqbmV4dDsKKyAgUFRSIGRhdGE7CisgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgaW50IHJlZmNvdW50IDogMzE7CQkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCisgIHVuc2lnbmVkIG1hcHBlZCA6IDE7CQkvKiAxID0gbW1hcCwgMCA9IG1hbGxvYyAqLworfTsKKwordm9pZAorYmZkX2luaXRfd2luZG93ICh3aW5kb3dwKQorICAgICBiZmRfd2luZG93ICp3aW5kb3dwOworeworICB3aW5kb3dwLT5kYXRhID0gMDsKKyAgd2luZG93cC0+aSA9IDA7CisgIHdpbmRvd3AtPnNpemUgPSAwOworfQorDAorLyogQ3VycmVudGx5LCBpZiBVU0VfTU1BUCBpcyB1bmRlZmluZWQsIG5vbmUgaWYgdGhlIHdpbmRvdyBzdHVmZiBpcworICAgdXNlZC4gIE9rYXksIHNvIGl0J3MgbWlzLW5hbWVkLiAgQXQgbGVhc3QgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KKyAgICItLXdpdGhvdXQtbW1hcCIgaXMgbW9yZSBvYnZpb3VzIHRoYW4gIi0td2l0aG91dC13aW5kb3dzIiBvciBzb21lCisgICBzdWNoLiAgKi8KKyNpZmRlZiBVU0VfTU1BUAorCisjdW5kZWYgSEFWRV9NUFJPVEVDVCAvKiBjb2RlJ3Mgbm90IHRlc3RlZCB5ZXQgKi8KKworI2lmIEhBVkVfTU1BUCB8fCBIQVZFX01QUk9URUNUIHx8IEhBVkVfTUFEVklTRQorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKworI2lmbmRlZiBNQVBfRklMRQorI2RlZmluZSBNQVBfRklMRSAwCisjZW5kaWYKKworc3RhdGljIGludCBkZWJ1Z193aW5kb3dzOworCit2b2lkCitiZmRfZnJlZV93aW5kb3cgKHdpbmRvd3ApCisgICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Cit7CisgIGJmZF93aW5kb3dfaW50ZXJuYWwgKmkgPSB3aW5kb3dwLT5pOworICB3aW5kb3dwLT5pID0gMDsKKyAgd2luZG93cC0+ZGF0YSA9IDA7CisgIGlmIChpID09IDApCisgICAgcmV0dXJuOworICBpLT5yZWZjb3VudC0tOworICBpZiAoZGVidWdfd2luZG93cykKKyAgICBmcHJpbnRmIChzdGRlcnIsICJmcmVlaW5nIHdpbmRvdyBAJXA8JXAsJWx4LCVwPlxuIiwKKwkgICAgIHdpbmRvd3AsIHdpbmRvd3AtPmRhdGEsIHdpbmRvd3AtPnNpemUsIHdpbmRvd3AtPmkpOworICBpZiAoaS0+cmVmY291bnQgIT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGktPm1hcHBlZCkKKyAgICB7CisjaWZkZWYgSEFWRV9NTUFQCisgICAgICBtdW5tYXAgKGktPmRhdGEsIGktPnNpemUpOworICAgICAgZ290byBub19mcmVlOworI2Vsc2UKKyAgICAgIGFib3J0ICgpOworI2VuZGlmCisgICAgfQorI2lmZGVmIEhBVkVfTVBST1RFQ1QKKyAgbXByb3RlY3QgKGktPmRhdGEsIGktPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworI2VuZGlmCisgIGZyZWUgKGktPmRhdGEpOworI2lmZGVmIEhBVkVfTU1BUAorIG5vX2ZyZWU6CisjZW5kaWYKKyAgaS0+ZGF0YSA9IDA7CisgIC8qIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaSBhdCB0aGlzIHBvaW50LiAgKi8KKyAgZnJlZSAoaSk7Cit9CisKK3N0YXRpYyBpbnQgb2tfdG9fbWFwID0gMTsKKworYm9vbGVhbgorYmZkX2dldF9maWxlX3dpbmRvdyAoYWJmZCwgb2Zmc2V0LCBzaXplLCB3aW5kb3dwLCB3cml0YWJsZSkKKyAgICAgYmZkICphYmZkOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKKyAgICAgYm9vbGVhbiB3cml0YWJsZTsKK3sKKyAgc3RhdGljIHNpemVfdCBwYWdlc2l6ZTsKKyAgYmZkX3dpbmRvd19pbnRlcm5hbCAqaSA9IHdpbmRvd3AtPmk7CisgIHNpemVfdCBzaXplX3RvX2FsbG9jID0gc2l6ZTsKKworICBpZiAoZGVidWdfd2luZG93cykKKyAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfZ2V0X2ZpbGVfd2luZG93ICglcCwgJTZsZCwgJTZsZCwgJXA8JXAsJWx4LCVwPiwgJWQpIiwKKwkgICAgIGFiZmQsIChsb25nKSBvZmZzZXQsIChsb25nKSBzaXplLAorCSAgICAgd2luZG93cCwgd2luZG93cC0+ZGF0YSwgKHVuc2lnbmVkIGxvbmcpIHdpbmRvd3AtPnNpemUsCisJICAgICB3aW5kb3dwLT5pLCB3cml0YWJsZSk7CisKKyAgLyogTWFrZSBzdXJlIHdlIGtub3cgdGhlIHBhZ2Ugc2l6ZSwgc28gd2UgY2FuIGJlIGZyaWVuZGx5IHRvIG1tYXAuICAqLworICBpZiAocGFnZXNpemUgPT0gMCkKKyAgICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOworICBpZiAocGFnZXNpemUgPT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoaSA9PSAwKQorICAgIHsKKyAgICAgIHdpbmRvd3AtPmkgPSBpID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOworICAgICAgaWYgKGkgPT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpLT5kYXRhID0gMDsKKyAgICB9CisjaWZkZWYgSEFWRV9NTUFQCisgIGlmIChva190b19tYXAKKyAgICAgICYmIChpLT5kYXRhID09IDAgfHwgaS0+bWFwcGVkID09IDEpCisgICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwKQorICAgIHsKKyAgICAgIGZpbGVfcHRyIGZpbGVfb2Zmc2V0LCBvZmZzZXQyOworICAgICAgc2l6ZV90IHJlYWxfc2l6ZTsKKyAgICAgIGludCBmZDsKKyAgICAgIEZJTEUgKmY7CisKKyAgICAgIC8qIEZpbmQgdGhlIHJlYWwgZmlsZSBhbmQgdGhlIHJlYWwgb2Zmc2V0IGludG8gaXQuICAqLworICAgICAgd2hpbGUgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKKwl7CisJICBvZmZzZXQgKz0gYWJmZC0+b3JpZ2luOworCSAgYWJmZCA9IGFiZmQtPm15X2FyY2hpdmU7CisJfQorICAgICAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOworICAgICAgZmQgPSBmaWxlbm8gKGYpOworCisgICAgICAvKiBDb21wdXRlIG9mZnNldHMgYW5kIHNpemUgZm9yIG1tYXAgYW5kIGZvciB0aGUgdXNlcidzIGRhdGEuICAqLworICAgICAgb2Zmc2V0MiA9IG9mZnNldCAlIHBhZ2VzaXplOworICAgICAgaWYgKG9mZnNldDIgPCAwKQorCWFib3J0ICgpOworICAgICAgZmlsZV9vZmZzZXQgPSBvZmZzZXQgLSBvZmZzZXQyOworICAgICAgcmVhbF9zaXplID0gb2Zmc2V0ICsgc2l6ZSAtIGZpbGVfb2Zmc2V0OworICAgICAgcmVhbF9zaXplID0gcmVhbF9zaXplICsgcGFnZXNpemUgLSAxOworICAgICAgcmVhbF9zaXplIC09IHJlYWxfc2l6ZSAlIHBhZ2VzaXplOworCisgICAgICAvKiBJZiB3ZSdyZSByZS11c2luZyBhIG1lbW9yeSByZWdpb24sIG1ha2Ugc3VyZSBpdCdzIGJpZyBlbm91Z2guICAqLworICAgICAgaWYgKGktPmRhdGEgJiYgaS0+c2l6ZSA8IHNpemUpCisJeworCSAgbXVubWFwIChpLT5kYXRhLCBpLT5zaXplKTsKKwkgIGktPmRhdGEgPSAwOworCX0KKyAgICAgIGktPmRhdGEgPSBtbWFwIChpLT5kYXRhLCByZWFsX3NpemUsCisJCSAgICAgIHdyaXRhYmxlID8gUFJPVF9XUklURSB8IFBST1RfUkVBRCA6IFBST1RfUkVBRCwKKwkJICAgICAgKHdyaXRhYmxlCisJCSAgICAgICA/IE1BUF9GSUxFIHwgTUFQX1BSSVZBVEUKKwkJICAgICAgIDogTUFQX0ZJTEUgfCBNQVBfU0hBUkVEKSwKKwkJICAgICAgZmQsIGZpbGVfb2Zmc2V0KTsKKyAgICAgIGlmIChpLT5kYXRhID09IChQVFIpIC0xKQorCXsKKwkgIC8qIEFuIGVycm9yIGhhcHBlbmVkLiAgUmVwb3J0IGl0LCBvciB0cnkgdXNpbmcgbWFsbG9jLCBvcgorCSAgICAgc29tZXRoaW5nLiAgKi8KKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisJICBpLT5kYXRhID0gMDsKKwkgIHdpbmRvd3AtPmRhdGEgPSAwOworCSAgaWYgKGRlYnVnX3dpbmRvd3MpCisJICAgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRtbWFwIGZhaWxlZCFcbiIpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmIChkZWJ1Z193aW5kb3dzKQorCWZwcmludGYgKHN0ZGVyciwgIlxuXHRtYXBwZWQgJWxkIGF0ICVwLCBvZmZzZXQgaXMgJWxkXG4iLAorCQkgKGxvbmcpIHJlYWxfc2l6ZSwgaS0+ZGF0YSwgKGxvbmcpIG9mZnNldDIpOworICAgICAgaS0+c2l6ZSA9IHJlYWxfc2l6ZTsKKyAgICAgIHdpbmRvd3AtPmRhdGEgPSAoUFRSKSAoKGJmZF9ieXRlICopIGktPmRhdGEgKyBvZmZzZXQyKTsKKyAgICAgIHdpbmRvd3AtPnNpemUgPSBzaXplOworICAgICAgaS0+bWFwcGVkID0gMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZSBpZiAoZGVidWdfd2luZG93cykKKyAgICB7CisgICAgICBpZiAob2tfdG9fbWFwKQorCWZwcmludGYgKHN0ZGVyciwgXygibm90IG1hcHBpbmc6IGRhdGE9JWx4IG1hcHBlZD0lZFxuIiksCisJCSAodW5zaWduZWQgbG9uZykgaS0+ZGF0YSwgKGludCkgaS0+bWFwcGVkKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmIChzdGRlcnIsIF8oIm5vdCBtYXBwaW5nOiBlbnYgdmFyIG5vdCBzZXRcbiIpKTsKKyAgICB9CisjZWxzZQorICBva190b19tYXAgPSAwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX01QUk9URUNUCisgIGlmICghd3JpdGFibGUpCisgICAgeworICAgICAgc2l6ZV90b19hbGxvYyArPSBwYWdlc2l6ZSAtIDE7CisgICAgICBzaXplX3RvX2FsbG9jIC09IHNpemVfdG9fYWxsb2MgJSBwYWdlc2l6ZTsKKyAgICB9CisjZW5kaWYKKyAgaWYgKGRlYnVnX3dpbmRvd3MpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5cdCVzKCU2bGQpIiwKKwkgICAgIGktPmRhdGEgPyAicmVhbGxvYyIgOiAiIG1hbGxvYyIsIChsb25nKSBzaXplX3RvX2FsbG9jKTsKKyAgaS0+ZGF0YSA9IChQVFIpIGJmZF9yZWFsbG9jIChpLT5kYXRhLCBzaXplX3RvX2FsbG9jKTsKKyAgaWYgKGRlYnVnX3dpbmRvd3MpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiXHQtPiAlcFxuIiwgaS0+ZGF0YSk7CisgIGktPnJlZmNvdW50ID0gMTsKKyAgaWYgKGktPmRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc2l6ZV90b19hbGxvYyA9PSAwKQorCXJldHVybiB0cnVlOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICBpLT5zaXplID0gYmZkX3JlYWQgKGktPmRhdGEsIHNpemUsIDEsIGFiZmQpOworICBpZiAoaS0+c2l6ZSAhPSBzaXplKQorICAgIHJldHVybiBmYWxzZTsKKyAgaS0+bWFwcGVkID0gMDsKKyNpZmRlZiBIQVZFX01QUk9URUNUCisgIGlmICghd3JpdGFibGUpCisgICAgeworICAgICAgaWYgKGRlYnVnX3dpbmRvd3MpCisJZnByaW50ZiAoc3RkZXJyLCAiXHRtcHJvdGVjdCAoJXAsICVsZCwgUFJPVF9SRUFEKVxuIiwgaS0+ZGF0YSwKKwkJIChsb25nKSBpLT5zaXplKTsKKyAgICAgIG1wcm90ZWN0IChpLT5kYXRhLCBpLT5zaXplLCBQUk9UX1JFQUQpOworICAgIH0KKyNlbmRpZgorICB3aW5kb3dwLT5kYXRhID0gaS0+ZGF0YTsKKyAgd2luZG93cC0+c2l6ZSA9IGktPnNpemU7CisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYgLyogVVNFX01NQVAgKi8KKwwKK2JmZF9zaXplX3R5cGUKK2JmZF93cml0ZSAocHRyLCBzaXplLCBuaXRlbXMsIGFiZmQpCisgICAgIENPTlNUIFBUUiBwdHI7CisgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgICAgYmZkX3NpemVfdHlwZSBuaXRlbXM7CisgICAgIGJmZCAqYWJmZDsKK3sKKyAgbG9uZyBud3JvdGU7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCisgICAgeworICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbSA9IChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSAoYWJmZC0+aW9zdHJlYW0pOworICAgICAgc2l6ZSAqPSBuaXRlbXM7CisgICAgICBpZiAoYWJmZC0+d2hlcmUgKyBzaXplID4gYmltLT5zaXplKQorCXsKKwkgIGxvbmcgbmV3c2l6ZSwgb2xkc2l6ZSA9IChiaW0tPnNpemUgKyAxMjcpICYgfjEyNzsKKwkgIGJpbS0+c2l6ZSA9IGFiZmQtPndoZXJlICsgc2l6ZTsKKwkgIC8qIFJvdW5kIHVwIHRvIGN1dCBkb3duIG9uIG1lbW9yeSBmcmFnbWVudGF0aW9uICovCisJICBuZXdzaXplID0gKGJpbS0+c2l6ZSArIDEyNykgJiB+MTI3OworCSAgaWYgKG5ld3NpemUgPiBvbGRzaXplKQorCSAgICB7CisJICAgICAgYmltLT5idWZmZXIgPSBiZmRfcmVhbGxvYyAoYmltLT5idWZmZXIsIG5ld3NpemUpOworCSAgICAgIGlmIChiaW0tPmJ1ZmZlciA9PSAwKQorCQl7CisJCSAgYmltLT5zaXplID0gMDsKKwkJICByZXR1cm4gMDsKKwkJfQorCSAgICB9CisJfQorICAgICAgbWVtY3B5IChiaW0tPmJ1ZmZlciArIGFiZmQtPndoZXJlLCBwdHIsIHNpemUpOworICAgICAgYWJmZC0+d2hlcmUgKz0gc2l6ZTsKKyAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICBud3JvdGUgPSBmd3JpdGUgKHB0ciwgMSwgKHNpemVfdCkgKHNpemUgKiBuaXRlbXMpLAorCQkgICBiZmRfY2FjaGVfbG9va3VwIChhYmZkKSk7CisgIGlmIChud3JvdGUgPiAwKQorICAgIGFiZmQtPndoZXJlICs9IG53cm90ZTsKKyAgaWYgKChiZmRfc2l6ZV90eXBlKSBud3JvdGUgIT0gc2l6ZSAqIG5pdGVtcykKKyAgICB7CisjaWZkZWYgRU5PU1BDCisgICAgICBpZiAobndyb3RlID49IDApCisJZXJybm8gPSBFTk9TUEM7CisjZW5kaWYKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgfQorICByZXR1cm4gbndyb3RlOworfQorCisvKgorSU5URVJOQUxfRlVOQ1RJT04KKwliZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludAorCitTWU5PUFNJUworCXZvaWQgYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQoYmZkICphYmZkLCAgaW50IGkpOworCitERVNDUklQVElPTgorCVdyaXRlIGEgNCBieXRlIGludGVnZXIgQHZhcntpfSB0byB0aGUgb3V0cHV0IEJGRCBAdmFye2FiZmR9LCBpbiBiaWcKKwllbmRpYW4gb3JkZXIgcmVnYXJkbGVzcyBvZiB3aGF0IGVsc2UgaXMgZ29pbmcgb24uICBUaGlzIGlzIHVzZWZ1bCBpbgorCWFyY2hpdmVzLgorCisqLwordm9pZAorYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgKGFiZmQsIGkpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IGk7Cit7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgYmZkX3B1dGIzMihpLCBidWZmZXIpOworICBpZiAoYmZkX3dyaXRlKChQVFIpYnVmZmVyLCA0LCAxLCBhYmZkKSAhPSA0KQorICAgIGFib3J0ICgpOworfQorCitsb25nCitiZmRfdGVsbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBmaWxlX3B0ciBwdHI7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCisgICAgcmV0dXJuIGFiZmQtPndoZXJlOworCisgIHB0ciA9IGZ0ZWxsIChiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKKworICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKKyAgICBwdHIgLT0gYWJmZC0+b3JpZ2luOworICBhYmZkLT53aGVyZSA9IHB0cjsKKyAgcmV0dXJuIHB0cjsKK30KKworaW50CitiZmRfZmx1c2ggKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBmZmx1c2ggKGJmZF9jYWNoZV9sb29rdXAoYWJmZCkpOworfQorCisvKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlCisgICBiZmRfZ2V0X2Vycm9yIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLworaW50CitiZmRfc3RhdCAoYWJmZCwgc3RhdGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKK3sKKyAgRklMRSAqZjsKKyAgaW50IHJlc3VsdDsKKworICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7CisgIGlmIChmID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHJlc3VsdCA9IGZzdGF0IChmaWxlbm8gKGYpLCBzdGF0YnVmKTsKKyAgaWYgKHJlc3VsdCA8IDApCisgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlIChpbiB3aGljaCBjYXNlIGJmZF9nZXRfZXJyb3IKKyAgIGNhbiByZXRyaWV2ZSB0aGUgZXJyb3IgY29kZSkuICAqLworCitpbnQKK2JmZF9zZWVrIChhYmZkLCBwb3NpdGlvbiwgZGlyZWN0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGZpbGVfcHRyIHBvc2l0aW9uOworICAgICBpbnQgZGlyZWN0aW9uOworeworICBpbnQgcmVzdWx0OworICBGSUxFICpmOworICBmaWxlX3B0ciBmaWxlX3Bvc2l0aW9uOworICAvKiBGb3IgdGhlIHRpbWUgYmVpbmcsIGEgQkZEIG1heSBub3Qgc2VlayB0byBpdCdzIGVuZC4gIFRoZSBwcm9ibGVtCisgICAgIGlzIHRoYXQgd2UgZG9uJ3QgZWFzaWx5IGhhdmUgYSB3YXkgdG8gcmVjb2duaXplIHRoZSBlbmQgb2YgYW4KKyAgICAgZWxlbWVudCBpbiBhbiBhcmNoaXZlLiAqLworCisgIEJGRF9BU1NFUlQgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCB8fCBkaXJlY3Rpb24gPT0gU0VFS19DVVIpOworCisgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19DVVIgJiYgcG9zaXRpb24gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUKQorCWFiZmQtPndoZXJlID0gcG9zaXRpb247CisgICAgICBlbHNlCisJYWJmZC0+d2hlcmUgKz0gcG9zaXRpb247CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfYXJjaGl2ZSAmJiBhYmZkLT5teV9hcmNoaXZlID09IDApCisgICAgeworI2lmIDAKKyAgICAgIC8qIEV4cGxhbmF0aW9uIGZvciB0aGlzIGNvZGU6IEknbSBvbmx5IGFib3V0IDk1KyUgc3VyZSB0aGF0IHRoZSBhYm92ZQorCSBjb25kaXRpb25zIGFyZSBzdWZmaWNpZW50IGFuZCB0aGF0IGFsbCBpL28gY2FsbHMgYXJlIHByb3Blcmx5CisJIGFkanVzdGluZyB0aGUgYHdoZXJlJyBmaWVsZC4gIFNvIHRoaXMgaXMgc29ydCBvZiBhbiBgYXNzZXJ0JworCSB0aGF0IHRoZSBgd2hlcmUnIGZpZWxkIGlzIGNvcnJlY3QuICBJZiB3ZSBjYW4gZ28gYSB3aGlsZSB3aXRob3V0CisJIHRyaXBwaW5nIHRoZSBhYm9ydCwgd2UgY2FuIHByb2JhYmx5IHNhZmVseSBkaXNhYmxlIHRoaXMgY29kZSwKKwkgc28gdGhhdCB0aGUgcmVhbCBvcHRpbWl6YXRpb25zIGhhcHBlbi4gICovCisgICAgICBmaWxlX3B0ciB3aGVyZV9hbV9pX25vdzsKKyAgICAgIHdoZXJlX2FtX2lfbm93ID0gZnRlbGwgKGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKTsKKyAgICAgIGlmIChhYmZkLT5teV9hcmNoaXZlKQorCXdoZXJlX2FtX2lfbm93IC09IGFiZmQtPm9yaWdpbjsKKyAgICAgIGlmICh3aGVyZV9hbV9pX25vdyAhPSBhYmZkLT53aGVyZSkKKwlhYm9ydCAoKTsKKyNlbmRpZgorICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBwb3NpdGlvbiA9PSBhYmZkLT53aGVyZSkKKwlyZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHNvbWV0aGluZyBzbWFydGVyIHRvIG9wdGltaXplIGFjY2VzcyB0byBhcmNoaXZlcy4KKwkgQ3VycmVudGx5LCBhbnl0aGluZyBpbnNpZGUgYW4gYXJjaGl2ZSBpcyByZWFkIHZpYSB0aGUgZmlsZQorCSBoYW5kbGUgZm9yIHRoZSBhcmNoaXZlLiAgV2hpY2ggbWVhbnMgdGhhdCBhIGJmZF9zZWVrIG9uIG9uZQorCSBjb21wb25lbnQgYWZmZWN0cyB0aGUgYGN1cnJlbnQgcG9zaXRpb24nIGluIHRoZSBhcmNoaXZlLCBhcworCSB3ZWxsIGFzIGluIGFueSBvdGhlciBjb21wb25lbnQuCisKKwkgSXQgbWlnaHQgYmUgc3VmZmljaWVudCB0byBwdXQgYSBzcGlrZSB0aHJvdWdoIHRoZSBjYWNoZQorCSBhYnN0cmFjdGlvbiwgYW5kIGxvb2sgdG8gdGhlIGFyY2hpdmUgZm9yIHRoZSBmaWxlIHBvc2l0aW9uLAorCSBidXQgSSB0aGluayB3ZSBzaG91bGQgdHJ5IGZvciBzb21ldGhpbmcgY2xlYW5lci4KKworCSBJbiB0aGUgbWVhbnRpbWUsIG5vIG9wdGltaXphdGlvbiBmb3IgYXJjaGl2ZXMuICAqLworICAgIH0KKworICBmID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7CisgIGZpbGVfcG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCAmJiBhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCisgICAgZmlsZV9wb3NpdGlvbiArPSBhYmZkLT5vcmlnaW47CisKKyAgcmVzdWx0ID0gZnNlZWsgKGYsIGZpbGVfcG9zaXRpb24sIGRpcmVjdGlvbik7CisKKyAgaWYgKHJlc3VsdCAhPSAwKQorICAgIHsKKyAgICAgIGludCBob2xkX2Vycm5vID0gZXJybm87CisKKyAgICAgIC8qIEZvcmNlIHJlZGV0ZXJtaW5hdGlvbiBvZiBgd2hlcmUnIGZpZWxkLiAgKi8KKyAgICAgIGJmZF90ZWxsIChhYmZkKTsKKworICAgICAgLyogQW4gRUlOVkFMIGVycm9yIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGZpbGUgb2Zmc2V0IHdhcworICAgICAgICAgYWJzdXJkLiAgKi8KKyAgICAgIGlmIChob2xkX2Vycm5vID09IEVJTlZBTCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOworICAgICAgZWxzZQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisJICBlcnJubyA9IGhvbGRfZXJybm87CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFkanVzdCBgd2hlcmUnIGZpZWxkLiAgKi8KKyAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQpCisJYWJmZC0+d2hlcmUgPSBwb3NpdGlvbjsKKyAgICAgIGVsc2UKKwlhYmZkLT53aGVyZSArPSBwb3NpdGlvbjsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisMCisvKiogVGhlIGRvLWl0LXlvdXJzZWxmIChieXRlKSBzZXgtY2hhbmdlIGtpdCAqLworCisvKiBUaGUgbWlkZGxlIGxldHRlciBlLmcuIGdldDxiPnNob3J0IGluZGljYXRlcyBCaWcgb3IgTGl0dGxlIGVuZGlhbgorICAgdGFyZ2V0IG1hY2hpbmUuICBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0CisgICBtYWNoaW5lIGlzOyB0aGVzZSByb3V0aW5lcyB3b3JrIGZvciBlaXRoZXIuICAqLworCisvKiBGSVhNRTogU2hvdWxkIHRoZXNlIHRha2UgYSBjb3VudCBhcmd1bWVudD8KKyAgIEFuc3dlciAoZ251QGN5Z251cy5jb20pOiAgTm8sIGJ1dCBwZXJoYXBzIHRoZXkgc2hvdWxkIGJlIGlubGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgaW4gc3dhcC5oICNpZmRlZiBfX0dOVUNfXy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwcm9mIHRoZW0gbGF0ZXIgYW5kIGZpbmQgb3V0LiAgKi8KKworLyoKK0ZVTkNUSU9OCisJYmZkX3B1dF9zaXplCitGVU5DVElPTgorCWJmZF9nZXRfc2l6ZQorCitERVNDUklQVElPTgorCVRoZXNlIG1hY3JvcyBhcyB1c2VkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJhdyBkYXRhIGluCisJc2VjdGlvbnM7IGVhY2ggYWNjZXNzIChleGNlcHQgZm9yIGJ5dGVzKSBpcyB2ZWN0b3JlZCB0aHJvdWdoCisJdGhlIHRhcmdldCBmb3JtYXQgb2YgdGhlIEJGRCBhbmQgbWFuZ2xlZCBhY2NvcmRpbmdseS4gVGhlCisJbWFuZ2xpbmcgcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBlbmRpYW4gdHJhbnNsYXRpb25zIGFuZAorCXJlbW92ZXMgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gIE5vdGUgdGhhdCB0eXBlcyBhY2NlcHRlZCBhbmQKKwlyZXR1cm5lZCBieSB0aGVzZSBtYWNyb3MgYXJlIGlkZW50aWNhbCBzbyB0aGV5IGNhbiBiZSBzd2FwcGVkCisJYXJvdW5kIGluIG1hY3Jvcy0tLWZvciBleGFtcGxlLCBAZmlsZXtsaWJhb3V0Lmh9IGRlZmluZXMgPDxHRVRfV09SRD4+CisJdG8gZWl0aGVyIDw8YmZkX2dldF8zMj4+IG9yIDw8YmZkX2dldF82ND4+LgorCisJSW4gdGhlIHB1dCByb3V0aW5lcywgQHZhcnt2YWx9IG11c3QgYmUgYSA8PGJmZF92bWE+Pi4gIElmIHdlIGFyZSBvbiBhCisJc3lzdGVtIHdpdGhvdXQgcHJvdG90eXBlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCisJc3VyZSB0aGF0IGlzIHRydWUsIHdpdGggYSBjYXN0IGlmIG5lY2Vzc2FyeS4gIFdlIGRvbid0IGNhc3QKKwl0aGVtIGluIHRoZSBtYWNybyBkZWZpbml0aW9ucyBiZWNhdXNlIHRoYXQgd291bGQgcHJldmVudCA8PGxpbnQ+PgorCW9yIDw8Z2NjIC1XYWxsPj4gZnJvbSBkZXRlY3Rpbmcgc2lucyBzdWNoIGFzIHBhc3NpbmcgYSBwb2ludGVyLgorCVRvIGRldGVjdCBjYWxsaW5nIHRoZXNlIHdpdGggbGVzcyB0aGFuIGEgPDxiZmRfdm1hPj4sIHVzZQorCTw8Z2NjIC1XY29udmVyc2lvbj4+IG9uIGEgaG9zdCB3aXRoIDY0IGJpdCA8PGJmZF92bWE+PidzLgorCisuCisueyogQnl0ZSBzd2FwcGluZyBtYWNyb3MgZm9yIHVzZXIgc2VjdGlvbiBkYXRhLiAgKn0KKy4KKy4jZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAorLiAgICAgICAgICAgICAgICAoKigodW5zaWduZWQgY2hhciAqKShwdHIpKSA9ICh1bnNpZ25lZCBjaGFyKSh2YWwpKQorLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfOCBcCisuCQliZmRfcHV0XzgKKy4jZGVmaW5lIGJmZF9nZXRfOChhYmZkLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgKCoodW5zaWduZWQgY2hhciAqKShwdHIpKQorLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKKy4JCSgoKih1bnNpZ25lZCBjaGFyICopKHB0cikgXiAweDgwKSAtIDB4ODApCisuCisuI2RlZmluZSBiZmRfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCisuICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICgodmFsKSwocHRyKSkpCisuI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8xNiBcCisuCQkgYmZkX3B1dF8xNgorLiNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHgxNiwgKHB0cikpCisuI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKKy4gICAgICAgICAJIEJGRF9TRU5EIChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQorLgorLiNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAorLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDMyLCAoKHZhbCksKHB0cikpKQorLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMzIgXAorLgkJIGJmZF9wdXRfMzIKKy4jZGVmaW5lIGJmZF9nZXRfMzIoYWJmZCwgcHRyKSBcCisuICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MzIsIChwdHIpKQorLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCisuCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKKy4KKy4jZGVmaW5lIGJmZF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHg2NCwgKCh2YWwpLCAocHRyKSkpCisuI2RlZmluZSBiZmRfcHV0X3NpZ25lZF82NCBcCisuCQkgYmZkX3B1dF82NAorLiNkZWZpbmUgYmZkX2dldF82NChhYmZkLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCisuI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKKy4JCSBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQorLgorKi8gCisKKy8qCitGVU5DVElPTgorCWJmZF9oX3B1dF9zaXplCisJYmZkX2hfZ2V0X3NpemUKKworREVTQ1JJUFRJT04KKwlUaGVzZSBtYWNyb3MgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGVpciA8PGJmZF9nZXRfeD4+CisJYnJldGhlcmVuLCBleGNlcHQgdGhhdCB0aGV5IGFyZSB1c2VkIGZvciByZW1vdmluZyBpbmZvcm1hdGlvbgorCWZvciB0aGUgaGVhZGVyIHJlY29yZHMgb2Ygb2JqZWN0IGZpbGVzLiBCZWxpZXZlIGl0IG9yIG5vdCwKKwlzb21lIG9iamVjdCBmaWxlcyBrZWVwIHRoZWlyIGhlYWRlciByZWNvcmRzIGluIGJpZyBlbmRpYW4KKwlvcmRlciBhbmQgdGhlaXIgZGF0YSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgorLgorLnsqIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciBmaWxlIGhlYWRlciBkYXRhLiAgKn0KKy4KKy4jZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCisuCQliZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQorLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF84KGFiZmQsIHZhbCwgcHRyKSBcCisuCQliZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQorLiNkZWZpbmUgYmZkX2hfZ2V0XzgoYWJmZCwgcHRyKSBcCisuCQliZmRfZ2V0XzggKGFiZmQsIHB0cikKKy4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfOChhYmZkLCBwdHIpIFwKKy4JCWJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIHB0cikKKy4KKy4jZGVmaW5lIGJmZF9oX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAorLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MTYsKHZhbCxwdHIpKQorLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8xNiBcCisuCQkgYmZkX2hfcHV0XzE2CisuI2RlZmluZSBiZmRfaF9nZXRfMTYoYWJmZCwgcHRyKSBcCisuICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgxNiwocHRyKSkKKy4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCisuCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQorLgorLiNkZWZpbmUgYmZkX2hfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCisuICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgzMiwodmFsLHB0cikpCisuI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzMyIFwKKy4JCSBiZmRfaF9wdXRfMzIKKy4jZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDMyLChwdHIpKQorLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCBwdHIpIFwKKy4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCisuCisuI2RlZmluZSBiZmRfaF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDY0LCh2YWwsIHB0cikpCisuI2RlZmluZSBiZmRfaF9wdXRfc2lnbmVkXzY0IFwKKy4JCSBiZmRfaF9wdXRfNjQKKy4jZGVmaW5lIGJmZF9oX2dldF82NChhYmZkLCBwdHIpIFwKKy4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDY0LChwdHIpKQorLiNkZWZpbmUgYmZkX2hfZ2V0X3NpZ25lZF82NChhYmZkLCBwdHIpIFwKKy4JCSBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCisuCisqLyAKKworLyogU2lnbiBleHRlbnNpb24gdG8gYmZkX3NpZ25lZF92bWEuICAqLworI2RlZmluZSBDT0VSQ0UxNih4KSAoKChiZmRfc2lnbmVkX3ZtYSkgKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkKKyNkZWZpbmUgQ09FUkNFMzIoeCkgXAorICAoKGJmZF9zaWduZWRfdm1hKSAobG9uZykgKCgodW5zaWduZWQgbG9uZykgKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKSkKKyNkZWZpbmUgRUlHSFRfR0FaSUxMSU9OICgoKEJGRF9IT1NUXzY0X0JJVCkweDgwMDAwMDAwKSA8PCAzMikKKyNkZWZpbmUgQ09FUkNFNjQoeCkgXAorICAoKChiZmRfc2lnbmVkX3ZtYSkgKHgpIF4gRUlHSFRfR0FaSUxMSU9OKSAtIEVJR0hUX0dBWklMTElPTikKKworYmZkX3ZtYQorYmZkX2dldGIxNiAoYWRkcikKKyAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Cit7CisgIHJldHVybiAoYWRkclswXSA8PCA4KSB8IGFkZHJbMV07Cit9CisKK2JmZF92bWEKK2JmZF9nZXRsMTYgKGFkZHIpCisgICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOworeworICByZXR1cm4gKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdOworfQorCitiZmRfc2lnbmVkX3ZtYQorYmZkX2dldGJfc2lnbmVkXzE2IChhZGRyKQorICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXSk7Cit9CisKK2JmZF9zaWduZWRfdm1hCitiZmRfZ2V0bF9zaWduZWRfMTYgKGFkZHIpCisgICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOworeworICByZXR1cm4gQ09FUkNFMTYoKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdKTsKK30KKwordm9pZAorYmZkX3B1dGIxNiAoZGF0YSwgYWRkcikKKyAgICAgYmZkX3ZtYSBkYXRhOworICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiA4KTsKKyAgYWRkclsxXSA9IChiZmRfYnl0ZSApZGF0YTsKK30KKwordm9pZAorYmZkX3B1dGwxNiAoZGF0YSwgYWRkcikKKyAgICAgYmZkX3ZtYSBkYXRhOyAgICAgICAgICAgICAKKyAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Cit7CisgIGFkZHJbMF0gPSAoYmZkX2J5dGUgKWRhdGE7CisgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Cit9CisKK2JmZF92bWEKK2JmZF9nZXRiMzIgKGFkZHIpCisgICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOworeworICB1bnNpZ25lZCBsb25nIHY7CisKKyAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdIDw8IDI0OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDE2OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDg7CisgIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM107CisgIHJldHVybiAoYmZkX3ZtYSkgdjsKK30KKworYmZkX3ZtYQorYmZkX2dldGwzMiAoYWRkcikKKyAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Cit7CisgIHVuc2lnbmVkIGxvbmcgdjsKKworICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07CisgIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKKyAgcmV0dXJuIChiZmRfdm1hKSB2OworfQorCitiZmRfc2lnbmVkX3ZtYQorYmZkX2dldGJfc2lnbmVkXzMyIChhZGRyKQorICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworCisgIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOworICByZXR1cm4gQ09FUkNFMzIgKHYpOworfQorCitiZmRfc2lnbmVkX3ZtYQorYmZkX2dldGxfc2lnbmVkXzMyIChhZGRyKQorICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworCisgIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXTsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCA4OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDE2OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdIDw8IDI0OworICByZXR1cm4gQ09FUkNFMzIgKHYpOworfQorCitiZmRfdm1hCitiZmRfZ2V0YjY0IChhZGRyKQorICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKK3sKKyNpZmRlZiBCRkQ2NAorICBiZmRfdm1hIGxvdywgaGlnaDsKKworICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKKyAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAorICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAorICAgICAgICAgIGFkZHJbM10pICk7CisKKyAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8CisgICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKKyAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKKyAgICAgICAgICBhZGRyWzddKSk7CisKKyAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7CisjZWxzZQorICBCRkRfRkFJTCgpOworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitiZmRfdm1hCitiZmRfZ2V0bDY0IChhZGRyKQorICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKK3sKKyNpZmRlZiBCRkQ2NAorICBiZmRfdm1hIGxvdywgaGlnaDsKKyAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAorICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8CisgICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8CisgICAgICAgICAgYWRkcls0XSkpOworCisgIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKKyAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAorICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAorICAgICAgICAgIGFkZHJbMF0pICk7CisKKyAgcmV0dXJuIGhpZ2ggPDwgMzIgfCBsb3c7CisjZWxzZQorICBCRkRfRkFJTCgpOworICByZXR1cm4gMDsKKyNlbmRpZgorCit9CisKK2JmZF9zaWduZWRfdm1hCitiZmRfZ2V0Yl9zaWduZWRfNjQgKGFkZHIpCisgICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOworeworI2lmZGVmIEJGRDY0CisgIGJmZF92bWEgbG93LCBoaWdoOworCisgIGhpZ2g9ICgoKCgoKCgoYWRkclswXSkgPDwgOCkgfAorICAgICAgICAgICAgICBhZGRyWzFdKSA8PCA4KSB8CisgICAgICAgICAgICBhZGRyWzJdKSA8PCA4KSB8CisgICAgICAgICAgYWRkclszXSkgKTsKKworICBsb3cgPSAoKCgoKCgoKChiZmRfdm1hKWFkZHJbNF0pIDw8IDgpIHwKKyAgICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAorICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAorICAgICAgICAgIGFkZHJbN10pKTsKKworICByZXR1cm4gQ09FUkNFNjQoaGlnaCA8PCAzMiB8IGxvdyk7CisjZWxzZQorICBCRkRfRkFJTCgpOworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitiZmRfc2lnbmVkX3ZtYQorYmZkX2dldGxfc2lnbmVkXzY0IChhZGRyKQorICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKK3sKKyNpZmRlZiBCRkQ2NAorICBiZmRfdm1hIGxvdywgaGlnaDsKKyAgaGlnaD0gKCgoKCgoKGFkZHJbN10gPDwgOCkgfAorICAgICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8CisgICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8CisgICAgICAgICAgYWRkcls0XSkpOworCisgIGxvdyA9ICgoKCgoKCgoYmZkX3ZtYSlhZGRyWzNdIDw8IDgpIHwKKyAgICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAorICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAorICAgICAgICAgIGFkZHJbMF0pICk7CisKKyAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOworI2Vsc2UKKyAgQkZEX0ZBSUwoKTsKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKwordm9pZAorYmZkX3B1dGIzMiAoZGF0YSwgYWRkcikKKyAgICAgYmZkX3ZtYSBkYXRhOworICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgICAgICAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7CisgICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMTYpOworICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICA4KTsKKyAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSlkYXRhOworfQorCit2b2lkCitiZmRfcHV0bDMyIChkYXRhLCBhZGRyKQorICAgICBiZmRfdm1hIGRhdGE7CisgICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOworeworICAgICAgICBhZGRyWzBdID0gKGJmZF9ieXRlKWRhdGE7CisgICAgICAgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gIDgpOworICAgICAgICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKKyAgICAgICAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAyNCk7Cit9CisKK3ZvaWQKK2JmZF9wdXRiNjQgKGRhdGEsIGFkZHIpCisgICAgIGJmZF92bWEgZGF0YTsKKyAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Cit7CisjaWZkZWYgQkZENjQKKyAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNyo4KSk7CisgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDYqOCkpOworICBhZGRyWzJdID0gKGJmZF9ieXRlKShkYXRhID4+ICg1KjgpKTsKKyAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNCo4KSk7CisgIGFkZHJbNF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDMqOCkpOworICBhZGRyWzVdID0gKGJmZF9ieXRlKShkYXRhID4+ICgyKjgpKTsKKyAgYWRkcls2XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMSo4KSk7CisgIGFkZHJbN10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDAqOCkpOworI2Vsc2UKKyAgQkZEX0ZBSUwoKTsKKyNlbmRpZgorfQorCit2b2lkCitiZmRfcHV0bDY0IChkYXRhLCBhZGRyKQorICAgICBiZmRfdm1hIGRhdGE7CisgICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOworeworI2lmZGVmIEJGRDY0CisgIGFkZHJbN10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDcqOCkpOworICBhZGRyWzZdID0gKGJmZF9ieXRlKShkYXRhID4+ICg2KjgpKTsKKyAgYWRkcls1XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNSo4KSk7CisgIGFkZHJbNF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDQqOCkpOworICBhZGRyWzNdID0gKGJmZF9ieXRlKShkYXRhID4+ICgzKjgpKTsKKyAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMio4KSk7CisgIGFkZHJbMV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDEqOCkpOworICBhZGRyWzBdID0gKGJmZF9ieXRlKShkYXRhID4+ICgwKjgpKTsKKyNlbHNlCisgIEJGRF9GQUlMKCk7CisjZW5kaWYKK30KKwwKKy8qIERlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KKworYm9vbGVhbgorX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoKGJmZF9zaXplX3R5cGUpKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKKyAgICAgICAgfHwgYmZkX3NlZWsoYWJmZCwgKGZpbGVfcHRyKShzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCisgICAgICAgIHx8IGJmZF9yZWFkKGxvY2F0aW9uLCAoYmZkX3NpemVfdHlwZSkxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCisgICAgICAgIHJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLworICAgIHJldHVybiAodHJ1ZSk7Cit9CisKK2Jvb2xlYW4KK19iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgKGFiZmQsIHNlY3Rpb24sIHcsIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBiZmRfd2luZG93ICp3OworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisjaWZkZWYgVVNFX01NQVAKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChhYmZkLT54dmVjLT5fYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICE9IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cykKKyAgICB7CisgICAgICAvKiBXZSBkb24ndCBrbm93IHdoYXQgY2hhbmdlcyB0aGUgYmZkJ3MgZ2V0X3NlY3Rpb25fY29udGVudHMKKwkgbWV0aG9kIG1heSBoYXZlIHRvIG1ha2UuICBTbyBwdW50IHRyeWluZyB0byBtYXAgdGhlIGZpbGUKKwkgd2luZG93LCBhbmQgbGV0IGdldF9zZWN0aW9uX2NvbnRlbnRzIGRvIGl0cyB0aGluZy4gICovCisgICAgICAvKiBAQCBGSVhNRSA6IElmIHRoZSBpbnRlcm5hbCB3aW5kb3cgaGFzIGEgcmVmY291bnQgb2YgMSBhbmQgd2FzCisJIGFsbG9jYXRlZCB3aXRoIG1hbGxvYyBpbnN0ZWFkIG9mIG1tYXAsIGp1c3QgcmV1c2UgaXQuICAqLworICAgICAgYmZkX2ZyZWVfd2luZG93ICh3KTsKKyAgICAgIHctPmkgPSAoYmZkX3dpbmRvd19pbnRlcm5hbCAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChiZmRfd2luZG93X2ludGVybmFsKSk7CisgICAgICBpZiAody0+aSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHctPmktPmRhdGEgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBjb3VudCk7CisgICAgICBpZiAody0+aS0+ZGF0YSA9PSBOVUxMKQorCXsKKwkgIGZyZWUgKHctPmkpOworCSAgdy0+aSA9IE5VTEw7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgdy0+aS0+bWFwcGVkID0gMDsKKyAgICAgIHctPmktPnJlZmNvdW50ID0gMTsKKyAgICAgIHctPnNpemUgPSB3LT5pLT5zaXplID0gY291bnQ7CisgICAgICB3LT5kYXRhID0gdy0+aS0+ZGF0YTsKKyAgICAgIHJldHVybiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIHctPmRhdGEsIG9mZnNldCwgY291bnQpOworICAgIH0KKyAgaWYgKChiZmRfc2l6ZV90eXBlKSAob2Zmc2V0K2NvdW50KSA+IHNlY3Rpb24tPl9yYXdfc2l6ZQorICAgICAgfHwgKGJmZF9nZXRfZmlsZV93aW5kb3cgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQsIGNvdW50LCB3LCB0cnVlKQorCSAgPT0gZmFsc2UpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7CisjZWxzZQorICBhYm9ydCAoKTsKKyNlbmRpZgorfQorCisvKiBUaGlzIGdlbmVyaWMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgY3JlYXRpbmcKKyAgIE5FVyBzZWN0aW9ucyBpcyBkaXNhbGxvd2VkLiAgSXQgaXMgdXNlZnVsIGluIHBhdGNoaW5nIGV4aXN0aW5nIHNlY3Rpb25zCisgICBpbiByZWFkLXdyaXRlIGZpbGVzLCB0aG91Z2guICBTZWUgb3RoZXIgc2V0X3NlY3Rpb25fY29udGVudHMgZnVuY3Rpb25zCisgICB0byBzZWUgd2h5IGl0IGRvZXNuJ3Qgd29yayBmb3IgbmV3IHNlY3Rpb25zLiAgKi8KK2Jvb2xlYW4KK19iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCisgICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAoYmZkX3NpemVfdHlwZSkgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2xvZzIKKworU1lOT1BTSVMKKwl1bnNpZ25lZCBpbnQgYmZkX2xvZzIoYmZkX3ZtYSB4KTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIGxvZyBiYXNlIDIgb2YgdGhlIHZhbHVlIHN1cHBsaWVkLCByb3VuZGVkIHVwLiAgRS5nLiwgYW4KKwlAdmFye3h9IG9mIDEwMjUgcmV0dXJucyAxMS4KKyovCisKK3Vuc2lnbmVkIGludAorYmZkX2xvZzIgKHgpCisgICAgIGJmZF92bWEgeDsKK3sKKyAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKyAgd2hpbGUgKCgoKGJmZF92bWEpIDEpIDw8IHJlc3VsdCkgPCB4KQorICAgICsrcmVzdWx0OworICByZXR1cm4gcmVzdWx0OworfQorCitib29sZWFuCitiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGNoYXIgbG9jYWxzX3ByZWZpeCA9IChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdfJykgPyAnTCcgOiAnLic7CisKKyAgcmV0dXJuIChuYW1lWzBdID09IGxvY2Fsc19wcmVmaXgpOworfQorCmRpZmYgLS1naXQgYS9iZmQvbGliYmZkLmggYi9iZmQvbGliYmZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwNGJkZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9saWJiZmQuaApAQCAtMCwwICsxLDg4NSBAQAorLyogbGliYmZkLmggLS0gRGVjbGFyYXRpb25zIHVzZWQgYnkgYmZkIGxpYnJhcnkgKmltcGxlbWVudGF0aW9uKi4KKyAgIChUaGlzIGluY2x1ZGUgZmlsZSBpcyBub3QgZm9yIHVzZXJzIG9mIHRoZSBsaWJyYXJ5LikKKyAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKKyoqIE5PVEU6IGxpYmJmZC5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCisqKiBjaGFuZ2UgbGliYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCisqKiBnZW5lcmF0ZSB0aGlzIGZpbGUuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQWxpZ24gYW4gYWRkcmVzcyB1cHdhcmQgdG8gYSBib3VuZGFyeSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgorICAgRS5nLiBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkgd2l0aCBhcmd1bWVudCBvZiA4LiAgVGFrZSBjYXJlIG5ldmVyCisgICB0byB3cmFwIGFyb3VuZCBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYm91bmRhcnktMSBvZiB0aGUgZW5kIG9mIHRoZQorICAgYWRkcmVzcyBzcGFjZS4gICovCisjZGVmaW5lIEJGRF9BTElHTih0aGlzLCBib3VuZGFyeSkJCQkJCVwKKyAgKCgoKGJmZF92bWEpICh0aGlzKSArIChib3VuZGFyeSkgLSAxKSA+PSAoYmZkX3ZtYSkgKHRoaXMpKQkJXAorICAgPyAoKChiZmRfdm1hKSAodGhpcykgKyAoKGJvdW5kYXJ5KSAtIDEpKSAmICh+KChib3VuZGFyeSktMSkpKQlcCisgICA6IH4gKGJmZF92bWEpIDApCisKKy8qIElmIHlvdSB3YW50IHRvIHJlYWQgYW5kIHdyaXRlIGxhcmdlIGJsb2NrcywgeW91IG1pZ2h0IHdhbnQgdG8gZG8gaXQKKyAgIGluIHF1YW50YSBvZiB0aGlzIGFtb3VudCAqLworI2RlZmluZSBERUZBVUxUX0JVRkZFUlNJWkUgODE5MgorCisvKiBTZXQgYSB0ZGF0YSBmaWVsZC4gIENhbid0IHVzZSB0aGUgb3RoZXIgbWFjcm9zIGZvciB0aGlzLCBzaW5jZSB0aGV5CisgICBkbyBjYXN0cywgYW5kIGNhc3RpbmcgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBpc24ndCBwb3J0YWJsZS4gICovCisjZGVmaW5lIHNldF90ZGF0YShiZmQsIHYpICgoYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHYpKQorCisvKiBJZiBCRkRfSU5fTUVNT1JZIGlzIHNldCBmb3IgYSBCRkQsIHRoZW4gdGhlIGlvc3RyZWFtIGZpZWxkcyBwb2ludHMKKyAgIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KKworc3RydWN0IGJmZF9pbl9tZW1vcnkKK3sKKyAgLyogU2l6ZSBvZiBidWZmZXIuICAqLworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIC8qIEJ1ZmZlciBob2xkaW5nIGNvbnRlbnRzIG9mIEJGRC4gICovCisgIGJmZF9ieXRlICpidWZmZXI7Cit9OworCisvKiB0ZGF0YSBmb3IgYW4gYXJjaGl2ZS4gIEZvciBhbiBpbnB1dCBhcmNoaXZlLCBjYWNoZQorICAgbmVlZHMgdG8gYmUgZnJlZSgpJ2QuICBGb3IgYW4gb3V0cHV0IGFyY2hpdmUsIHN5bWRlZnMgZG8uICAqLworCitzdHJ1Y3QgYXJ0ZGF0YSB7CisgIGZpbGVfcHRyIGZpcnN0X2ZpbGVfZmlsZXBvczsKKyAgLyogU3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcm1hcCAqLworICBzdHJ1Y3QgYXJfY2FjaGUgKmNhY2hlOworICBiZmQgKmFyY2hpdmVfaGVhZDsgICAgICAgICAgICAvKiBPbmx5IGludGVyZXN0aW5nIGluIG91dHB1dCByb3V0aW5lcyAqLworICBjYXJzeW0gKnN5bWRlZnM7CQkvKiB0aGUgc3ltZGVmIGVudHJpZXMgKi8KKyAgc3ltaW5kZXggc3ltZGVmX2NvdW50OyAgICAgICAgICAgICAvKiBob3cgbWFueSB0aGVyZSBhcmUgKi8KKyAgY2hhciAqZXh0ZW5kZWRfbmFtZXM7CQkvKiBjbGV2ZXIgaW50ZWwgZXh0ZW5zaW9uICovCisgIC8qIHdoZW4gbW9yZSBjb21waWxlcnMgYXJlIHN0YW5kYXJkIEMsIHRoaXMgY2FuIGJlIGEgdGltZV90ICovCisgIGxvbmcgIGFybWFwX3RpbWVzdGFtcDsJLyogVGltZXN0YW1wIHZhbHVlIHdyaXR0ZW4gaW50byBhcm1hcC4KKwkJCQkgICBUaGlzIGlzIHVzZWQgZm9yIEJTRCBhcmNoaXZlcyB0byBjaGVjaworCQkJCSAgIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNlbnQgZW5vdWdoCisJCQkJICAgZm9yIHRoZSBCU0QgbGlua2VyIHRvIG5vdCBjb21wbGFpbiwKKwkJCQkgICBqdXN0IGJlZm9yZSB3ZSBmaW5pc2ggd3JpdGluZyBhbgorCQkJCSAgIGFyY2hpdmUuICAqLworICBmaWxlX3B0ciBhcm1hcF9kYXRlcG9zOwkvKiBQb3NpdGlvbiB3aXRoaW4gYXJjaGl2ZSB0byBzZWVrIHRvCisJCQkJICAgcmV3cml0ZSB0aGUgZGF0ZSBmaWVsZC4gICovCisgIFBUUiB0ZGF0YTsJCQkvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KK307CisKKyNkZWZpbmUgYmZkX2FyZGF0YShiZmQpICgoYmZkKS0+dGRhdGEuYW91dF9hcl9kYXRhKQorCisvKiBHb2VzIGluIGJmZCdzIGFyZWx0X2RhdGEgc2xvdCAqLworc3RydWN0IGFyZWx0ZGF0YSB7CisgIGNoYXIgKiBhcmNoX2hlYWRlcjsJCQkgICAgIC8qIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcgKi8KKyAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOyAgICAgLyogb2N0ZXRzIG9mIGZpbGVzaXplIG5vdCBpbmNsdWRpbmcgYXJfaGRyICovCisgIGNoYXIgKmZpbGVuYW1lOwkJCSAgICAgLyogbnVsbC10ZXJtaW5hdGVkICovCit9OworCisjZGVmaW5lIGFyZWx0X3NpemUoYmZkKSAoKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSktPnBhcnNlZF9zaXplKQorCitleHRlcm4gUFRSIGJmZF9tYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CitleHRlcm4gUFRSIGJmZF9yZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7CitleHRlcm4gUFRSIGJmZF96bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworCitleHRlcm4gYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXI7CisKKy8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIGFuZCBmcmVlIHRoaW5ncyBvbiB0aGUgQkZEJ3Mgb2JqYWxsb2MuICAqLworCitleHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7CitleHRlcm4gUFRSIGJmZF96YWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOworZXh0ZXJuIHZvaWQgYmZkX3JlbGVhc2UgUEFSQU1TICgoYmZkICosIFBUUikpOworCitiZmQgKglfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgUEFSQU1TICgoYmZkICpvYmZkKSk7CitiZmQgKglfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSBQQVJBTVMgKChiZmQgKmFyY2hfYmZkLCBmaWxlX3B0ciBpbmRleCkpOworYm9vbGVhbiBfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZCAqKSk7Citib29sZWFuCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgUEFSQU1TICgoYmZkICphYmZkKSk7Citjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZ2VuZXJpY19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Citib29sZWFuCWJmZF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2Jvb2xlYW4gYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKyNkZWZpbmUgYmZkX3NsdXJwX2JzZF9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKKyNkZWZpbmUgYmZkX3NsdXJwX2NvZmZfYXJtYXAgYmZkX3NsdXJwX2FybWFwCitib29sZWFuCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKKyAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKikpOworYm9vbGVhbglfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Citib29sZWFuIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBlbGVuZ3RoKSk7CitiZmQgKl9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgZmlsZV9wdHIgZmlsZXBvcykpOworZXh0ZXJuIGJmZCAqX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7CitiZmQgKiBfYmZkX25ld19iZmQgUEFSQU1TICgodm9pZCkpOworCitib29sZWFuCWJmZF9mYWxzZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOworYm9vbGVhbgliZmRfdHJ1ZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOworUFRSCWJmZF9udWxsdm9pZHB0ciBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOworaW50CWJmZF8wIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Cit1bnNpZ25lZCBpbnQJYmZkXzB1IFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Citsb25nCWJmZF8wbCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOworbG9uZwlfYmZkX24xIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Cit2b2lkCWJmZF92b2lkIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7CisKK2JmZCAqX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiBQQVJBTVMgKChiZmQgKikpOworY29uc3QgYmZkX3RhcmdldCAqX2JmZF9kdW1teV90YXJnZXQgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK3ZvaWQJYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCisJCQkJCWNoYXIgKmhkcikpOwordm9pZAliZmRfYnNkX3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAorCQkJCQljaGFyICpoZHIpKTsKK3ZvaWQJYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKKwkJCQkJY2hhciAqaGRyKSk7CisKK2Jvb2xlYW4JYnNkX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCisJCQkJICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKKworYm9vbGVhbgljb2ZmX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCisJCQkJICAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7CisKK2V4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7CisKK2V4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CisKK2JmZCAqCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsCisJCQkJCQkgICAgIGJmZCAqbGFzdF9maWxlKSk7CisKK2ludAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7CisKKyNkZWZpbmUgX2JmZF9yZWFkX2FyX2hkcihhYmZkKSBcCisgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlYWRfYXJfaGRyX2ZuLCAoYWJmZCkpCisMCisvKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfR0VORVJJQy4gIFVzZQorICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKS4gICovCisKKyNkZWZpbmUgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIGJmZF90cnVlCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQorI2RlZmluZSBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vayBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAorCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF93aW5kb3cgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKworLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUFkuICBVc2UKKyAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYykuICAqLworCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKKyAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQorI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKKyAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKSkgYmZkX3RydWUpCisjZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQorI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpKSBiZmRfdHJ1ZSkKKyNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKKyAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSKSkpIGJmZF90cnVlKQorCisvKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUkUgd2hlbiB0aGVyZSBpcyBubyBjb3JlIGZpbGUKKyAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLiAgKi8KKworZXh0ZXJuIGNoYXIgKl9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBpbnQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CisKKy8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB3aGVuIHRoZXJlIGlzIG5vIGFyY2hpdmUKKyAgIGZpbGUgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSkuICAqLworCisjZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2FybWFwIGJmZF9mYWxzZQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCisgICBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCisgICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKSkpIGJmZF92b2lkKQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV93cml0ZV9hcm1hcCBcCisgICgoYm9vbGVhbiAoKikgXAorICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAorICAgYmZkX2ZhbHNlKQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKKyNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKKyAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKKyAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKSkgYmZkX251bGx2b2lkcHRyKQorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAorI2RlZmluZSBfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF9mYWxzZQorCisvKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IEJTRCBzdHlsZQorICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCkuICAqLworCisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcAorI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAorICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKK2V4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKKyAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOworI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3RydW5jYXRlX2FybmFtZSBiZmRfYnNkX3RydW5jYXRlX2FybmFtZQorI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAorI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgorI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCisgIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQorI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAorICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CitleHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICopKTsKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBDT0ZGIHN0eWxlCisgICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZikuICAqLworCisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2FybWFwIGJmZF9zbHVycF9jb2ZmX2FybWFwCisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAorICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKK2V4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQorI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl93cml0ZV9hcm1hcCBjb2ZmX3dyaXRlX2FybWFwCisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgorI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAorICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKKyNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAorI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAorICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CisjZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIHdoZXJlIHRoZXJlIGlzIG5vIHN5bWJvbAorICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scykuICAqLworCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQorI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiIFwKKyAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQorI2RlZmluZSBfYmZkX25vc3ltYm9sc19tYWtlX2VtcHR5X3N5bWJvbCBcCisgICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sIFwKKyAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpKSBiZmRfdm9pZCkKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvIFwKKyAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSkpIGJmZF92b2lkKQorI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpKSBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8gXAorICAoKGFsZW50ICooKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpKSBiZmRfbnVsbHZvaWRwdHIpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lIFwKKyAgKChib29sZWFuICgqKSBcCisgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosIFwKKwkgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSkpIFwKKyAgIGJmZF9mYWxzZSkKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKKyAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIFBUUiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCisjZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMgXAorICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKSkgX2JmZF9uMSkKKyNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wgXAorICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKSkgXAorICAgYmZkX251bGx2b2lkcHRyKQorCisvKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyB3aGVuIHRoZXJlIGlzIG5vIHJlbG9jCisgICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcykuICAqLworCisjZGVmaW5lIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKKyAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBfYmZkX24xKQorI2RlZmluZSBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKKyNkZWZpbmUgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAorICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIFwKKyAgIGJmZF9udWxsdm9pZHB0cikKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURSBmb3IgdGFyZ2V0cyB3aGljaCBtYXkgbm90CisgICBiZSB3cml0dGVuLiAgVXNlIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX25vd3JpdGUpLiAgKi8KKworI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X2FyY2hfbWFjaCBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpKSBcCisgICBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfc2VjdGlvbl9jb250ZW50cyBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKSkgXAorICAgYmZkX2ZhbHNlKQorCisvKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUuICBVc2UKKyAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLiAgKi8KKworI2RlZmluZSBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKworLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9MSU5LIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAorICAgc3VwcG9ydCBsaW5raW5nLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKS4gICovCisKKyNkZWZpbmUgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMgKChpbnQgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSkpIGJmZF8wKQorI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgKChiZmRfYnl0ZSAqKCopIFwKKyAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIFwKKwkgICAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKSkgXAorICAgYmZkX251bGx2b2lkcHRyKQorI2RlZmluZSBfYmZkX25vbGlua19iZmRfcmVsYXhfc2VjdGlvbiBcCisgICgoYm9vbGVhbiAoKikgXAorICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSkgXAorICAgYmZkX2ZhbHNlKQorI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMgXAorICAoKGJvb2xlYW4gKCopIFwKKyAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBcCisgICBiZmRfZmFsc2UpCisjZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKKyAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKKyNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKKyNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2ZpbmFsX2xpbmsgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKKyNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBcCisgICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfZmFsc2UpCisKKy8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKKyAgIGhhdmUgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCisgICAoX2JmZF9ub2R5bmFtaWMpLiAgKi8KKworI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQorI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAorICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCisjZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbjEKKyNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAorICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCisMCisvKiBHZW5lcmljIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBzeW1ib2wgaXMgYSBsb2NhbAorICAgbGFiZWwuICAqLworZXh0ZXJuIGJvb2xlYW4gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CisKKy8qIEdlbmVyaWMgbWluaXN5bWJvbCByb3V0aW5lcy4gICovCitleHRlcm4gbG9uZyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSk7CitleHRlcm4gYXN5bWJvbCAqX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCisgIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpOworCisvKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4gKiwgY29uc3QgY2hhciAqKiwKKwkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgUFRSICopKTsKKworLyogRmluZCB0aGUgbmVhZGVyc3QgbGluZSB1c2luZyBEV0FSRiAxIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZQorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKKwkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOworCisvKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCisJICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKKworLyogQSByb3V0aW5lIHRvIGNyZWF0ZSBlbnRyaWVzIGZvciBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLworZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9saW5rX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAorCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCisJICAgY29uc3QgY2hhciAqc3RyaW5nKSk7CisKKy8qIEluaXRpYWxpemUgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCisJICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOworCisvKiBHZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBjcmVhdGlvbiByb3V0aW5lLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyAgUEFSQU1TICgoYmZkICopKTsKKworLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICBUaGlzIHZlcnNpb24gaXMgdXNlZCBieSB0YXJnZXRzIGZvcgorICAgd2hpY2ggdGhlIGxpbmtlciBtdXN0IGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLAorICAgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gICovCitleHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKy8qIEdlbmVyaWMgYXJjaGl2ZSBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkgICBib29sZWFuICgqY2hlY2tmbikgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSk7CisKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIHByb3RvdHlwZSBlcnJvcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSBfYmZkX2xpbmtfaGFzaF9lbnRyeTsKKworLyogR2VuZXJpYyByb3V0aW5lIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKm5hbWUsIGZsYWd3b3JkLAorCSAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjb3B5LAorCSAgIGJvb2xlYW4gY29uc3RydWN0b3IsIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7CisKKy8qIEdlbmVyaWMgbGluayByb3V0aW5lLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOworCisvKiBHZW5lcmljIHJlbG9jX2xpbmtfb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KK2V4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CisKKy8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCisJICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKKworLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxvYyBlbnRyaWVzIGluIGEgbGluayBvcmRlciBsaXN0LiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOworCisvKiBGaW5hbCBsaW5rIHJlbG9jYXRpb24gcm91dGluZS4gICovCitleHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQorICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAorCSAgIGJmZF92bWEgYWRkcmVzcywgYmZkX3ZtYSB2YWx1ZSwgYmZkX3ZtYSBhZGRlbmQpKTsKKworLyogUmVsb2NhdGUgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGJ5IGEgaG93dG8gYW5kIGEgdmFsdWUuICAqLworZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCisgIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKKworLyogTGluayBzdGFicyBpbiBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGFzcy4gICovCisKK2V4dGVybiBib29sZWFuIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzCisgIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwgUFRSICopKTsKKworLyogV3JpdGUgb3V0IHRoZSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCisKK2V4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicworICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfYnl0ZSAqKSk7CisKKy8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc3RyaW5nIHRhYmxlIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCisKK2V4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCBQVFIgKikpOworCisvKiBGaW5kIGFuIG9mZnNldCB3aXRoaW4gYSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbgorICAgc2VjdGlvbnMuICAqLworCitleHRlcm4gYmZkX3ZtYSBfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKKyAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX3ZtYSkpOworCisvKiBDcmVhdGUgYSBzdHJpbmcgdGFibGUuICAqLworZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOworCisvKiBDcmVhdGUgYW4gWENPRkYgLmRlYnVnIHNlY3Rpb24gc3R5bGUgc3RyaW5nIHRhYmxlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKKworLyogRnJlZSBhIHN0cmluZyB0YWJsZS4gICovCitleHRlcm4gdm9pZCBfYmZkX3N0cmluZ3RhYl9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOworCisvKiBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgdGFibGUuICAqLworZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfc2l6ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKKworLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIHRhYmxlLiAgKi8KK2V4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX2FkZAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBoYXNoLAorCSAgIGJvb2xlYW4gY29weSkpOworCisvKiBXcml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdHJpbmd0YWJfZW1pdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7CisMCisvKiBNYWNyb3MgdG8gdGVsbCBpZiBiZmRzIGFyZSByZWFkIG9yIHdyaXRlIGVuYWJsZWQuCisKKyAgIE5vdGUgdGhhdCBiZmRzIG9wZW4gZm9yIHJlYWQgbWF5IGJlIHNjcmliYmxlZCBpbnRvIGlmIHRoZSBmZCBwYXNzZWQKKyAgIHRvIGJmZF9mZG9wZW5yIGlzIGFjdHVhbGx5IG9wZW4gYm90aCBmb3IgcmVhZCBhbmQgd3JpdGUKKyAgIHNpbXVsdGFuZW91c2x5LiAgSG93ZXZlciBhbiBvdXRwdXQgYmZkIHdpbGwgbmV2ZXIgYmUgb3BlbiBmb3IKKyAgIHJlYWQuICBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSB3YW50IHRvIGNoZWNrIGJmZF9yZWFkX3Agb3IKKyAgICFiZmRfcmVhZF9wLCBhbmQgb25seSBzb21ldGltZXMgYmZkX3dyaXRlX3AuCisqLworCisjZGVmaW5lCWJmZF9yZWFkX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHJlYWRfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQorI2RlZmluZQliZmRfd3JpdGVfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQorCit2b2lkCWJmZF9hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciosaW50KSk7CisKKyNkZWZpbmUgQkZEX0FTU0VSVCh4KSBcCit7IGlmICghKHgpKSBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQorCisjZGVmaW5lIEJGRF9GQUlMKCkgXAoreyBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQorCitGSUxFICoJYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICopKTsKKworZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7CisKKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldCB2ZWN0b3JzLCBhbmQgdGhlIGRlZmF1bHQgdmVjdG9yIChpZgorICAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGRlZmF1bHQpLiAgKi8KK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgYmZkX3RhcmdldF92ZWN0b3JbXTsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXTsKKworLyogRnVuY3Rpb25zIHNoYXJlZCBieSB0aGUgRUNPRkYgYW5kIE1JUFMgRUxGIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCisgICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCitzdHJ1Y3QgZWNvZmZfZmluZF9saW5lOworI2VuZGlmCisKK2V4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCisJICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLAorCSAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKKworZXh0ZXJuIGJmZF92bWEgX2JmZF9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiB2b2lkIF9iZmRfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7CisKKy8qIEZ1bmN0aW9uIHNoYXJlZCBieSB0aGUgQ09GRiBhbmQgRUxGIFNIIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCisgICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4KKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisJICAgYm9vbGVhbiAoKikgKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpLAorCSAgIFBUUiwgYmZkX3ZtYSAqKiwgYmZkX3ZtYSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBib29sZWFuICopKTsKKworLyogQW5kIG1vcmUgZm9sbG93cyAqLworCit2b2lkIAorYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgUEFSQU1TICgoYmZkICphYmZkLCAgaW50IGkpKTsKKwordW5zaWduZWQgaW50IAorYmZkX2xvZzIgUEFSQU1TICgoYmZkX3ZtYSB4KSk7CisKKyNkZWZpbmUgQkZEX0NBQ0hFX01BWF9PUEVOIDEwCitleHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKKworI2RlZmluZSBiZmRfY2FjaGVfbG9va3VwKHgpIFwKKyAgICAoKHgpPT1iZmRfbGFzdF9jYWNoZT8gXAorICAgICAgKEZJTEUqKShiZmRfbGFzdF9jYWNoZS0+aW9zdHJlYW0pOiBcCisgICAgICAgYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoeCkpCitib29sZWFuIAorYmZkX2NhY2hlX2luaXQgIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitib29sZWFuIAorYmZkX2NhY2hlX2Nsb3NlICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworRklMRSogCitiZmRfb3Blbl9maWxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitGSUxFICoKK2JmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCisjaWZkZWYgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbXSA9IHsgIkBAdW5pbml0aWFsaXplZEBAIiwKKworICAiQkZEX1JFTE9DXzY0IiwKKyAgIkJGRF9SRUxPQ18zMiIsCisgICJCRkRfUkVMT0NfMjYiLAorICAiQkZEX1JFTE9DXzI0IiwKKyAgIkJGRF9SRUxPQ18xNiIsCisgICJCRkRfUkVMT0NfMTQiLAorICAiQkZEX1JFTE9DXzgiLAorICAiQkZEX1JFTE9DXzY0X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ18zMl9QQ1JFTCIsCisgICJCRkRfUkVMT0NfMjRfUENSRUwiLAorICAiQkZEX1JFTE9DXzE2X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ18xMl9QQ1JFTCIsCisgICJCRkRfUkVMT0NfOF9QQ1JFTCIsCisgICJCRkRfUkVMT0NfMzJfR09UX1BDUkVMIiwKKyAgIkJGRF9SRUxPQ18xNl9HT1RfUENSRUwiLAorICAiQkZEX1JFTE9DXzhfR09UX1BDUkVMIiwKKyAgIkJGRF9SRUxPQ18zMl9HT1RPRkYiLAorICAiQkZEX1JFTE9DXzE2X0dPVE9GRiIsCisgICJCRkRfUkVMT0NfTE8xNl9HT1RPRkYiLAorICAiQkZEX1JFTE9DX0hJMTZfR09UT0ZGIiwKKyAgIkJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGIiwKKyAgIkJGRF9SRUxPQ184X0dPVE9GRiIsCisgICJCRkRfUkVMT0NfMzJfUExUX1BDUkVMIiwKKyAgIkJGRF9SRUxPQ18yNF9QTFRfUENSRUwiLAorICAiQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCIsCisgICJCRkRfUkVMT0NfOF9QTFRfUENSRUwiLAorICAiQkZEX1JFTE9DXzMyX1BMVE9GRiIsCisgICJCRkRfUkVMT0NfMTZfUExUT0ZGIiwKKyAgIkJGRF9SRUxPQ19MTzE2X1BMVE9GRiIsCisgICJCRkRfUkVMT0NfSEkxNl9QTFRPRkYiLAorICAiQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYiLAorICAiQkZEX1JFTE9DXzhfUExUT0ZGIiwKKyAgIkJGRF9SRUxPQ182OEtfR0xPQl9EQVQiLAorICAiQkZEX1JFTE9DXzY4S19KTVBfU0xPVCIsCisgICJCRkRfUkVMT0NfNjhLX1JFTEFUSVZFIiwKKyAgIkJGRF9SRUxPQ18zMl9CQVNFUkVMIiwKKyAgIkJGRF9SRUxPQ18xNl9CQVNFUkVMIiwKKyAgIkJGRF9SRUxPQ19MTzE2X0JBU0VSRUwiLAorICAiQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCIsCisgICJCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwiLAorICAiQkZEX1JFTE9DXzhfQkFTRVJFTCIsCisgICJCRkRfUkVMT0NfUlZBIiwKKyAgIkJGRF9SRUxPQ184X0ZGbm4iLAorICAiQkZEX1JFTE9DXzMyX1BDUkVMX1MyIiwKKyAgIkJGRF9SRUxPQ18xNl9QQ1JFTF9TMiIsCisgICJCRkRfUkVMT0NfMjNfUENSRUxfUzIiLAorICAiQkZEX1JFTE9DX0hJMjIiLAorICAiQkZEX1JFTE9DX0xPMTAiLAorICAiQkZEX1JFTE9DX0dQUkVMMTYiLAorICAiQkZEX1JFTE9DX0dQUkVMMzIiLAorICAiQkZEX1JFTE9DX0k5NjBfQ0FMTEoiLAorICAiQkZEX1JFTE9DX05PTkUiLAorICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDMTMiLAorICAiQkZEX1JFTE9DX1NQQVJDX0dPVDEwIiwKKyAgIkJGRF9SRUxPQ19TUEFSQ19HT1QxMyIsCisgICJCRkRfUkVMT0NfU1BBUkNfR09UMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDX1BDMTAiLAorICAiQkZEX1JFTE9DX1NQQVJDX1BDMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCIsCisgICJCRkRfUkVMT0NfU1BBUkNfQ09QWSIsCisgICJCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQiLAorICAiQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9UIiwKKyAgIkJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSIsCisgICJCRkRfUkVMT0NfU1BBUkNfVUEzMiIsCisgICJCRkRfUkVMT0NfU1BBUkNfQkFTRTEzIiwKKyAgIkJGRF9SRUxPQ19TUEFSQ19CQVNFMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDXzEwIiwKKyAgIkJGRF9SRUxPQ19TUEFSQ18xMSIsCisgICJCRkRfUkVMT0NfU1BBUkNfT0xPMTAiLAorICAiQkZEX1JFTE9DX1NQQVJDX0hIMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDX0hNMTAiLAorICAiQkZEX1JFTE9DX1NQQVJDX0xNMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAiLAorICAiQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIiLAorICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYiLAorICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMTkiLAorICAiQkZEX1JFTE9DX1NQQVJDXzciLAorICAiQkZEX1JFTE9DX1NQQVJDXzYiLAorICAiQkZEX1JFTE9DX1NQQVJDXzUiLAorICAiQkZEX1JFTE9DX1NQQVJDX1BMVDY0IiwKKyAgIkJGRF9SRUxPQ19TUEFSQ19ISVgyMiIsCisgICJCRkRfUkVMT0NfU1BBUkNfTE9YMTAiLAorICAiQkZEX1JFTE9DX1NQQVJDX0g0NCIsCisgICJCRkRfUkVMT0NfU1BBUkNfTTQ0IiwKKyAgIkJGRF9SRUxPQ19TUEFSQ19MNDQiLAorICAiQkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSIiwKKyAgIkJGRF9SRUxPQ19TUEFSQ19SRVYzMiIsCisgICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYiLAorICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2IiwKKyAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1AiLAorICAiQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwiLAorICAiQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMIiwKKyAgIkJGRF9SRUxPQ19BTFBIQV9MSVRVU0UiLAorICAiQkZEX1JFTE9DX0FMUEhBX0hJTlQiLAorICAiQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UiLAorICAiQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSIiwKKyAgIkJGRF9SRUxPQ19NSVBTX0pNUCIsCisgICJCRkRfUkVMT0NfTUlQUzE2X0pNUCIsCisgICJCRkRfUkVMT0NfTUlQUzE2X0dQUkVMIiwKKyAgIkJGRF9SRUxPQ19ISTE2IiwKKyAgIkJGRF9SRUxPQ19ISTE2X1MiLAorICAiQkZEX1JFTE9DX0xPMTYiLAorICAiQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyIsCisgICJCRkRfUkVMT0NfUENSRUxfTE8xNiIsCisgICJCRkRfUkVMT0NfTUlQU19MSVRFUkFMIiwKKyAgIkJGRF9SRUxPQ19NSVBTX0dPVDE2IiwKKyAgIkJGRF9SRUxPQ19NSVBTX0NBTEwxNiIsCisgICJCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiIsCisgICJCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiIsCisgICJCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYiLAorICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2IiwKKworICAiQkZEX1JFTE9DXzM4Nl9HT1QzMiIsCisgICJCRkRfUkVMT0NfMzg2X1BMVDMyIiwKKyAgIkJGRF9SRUxPQ18zODZfQ09QWSIsCisgICJCRkRfUkVMT0NfMzg2X0dMT0JfREFUIiwKKyAgIkJGRF9SRUxPQ18zODZfSlVNUF9TTE9UIiwKKyAgIkJGRF9SRUxPQ18zODZfUkVMQVRJVkUiLAorICAiQkZEX1JFTE9DXzM4Nl9HT1RPRkYiLAorICAiQkZEX1JFTE9DXzM4Nl9HT1RQQyIsCisgICJCRkRfUkVMT0NfTlMzMktfSU1NXzgiLAorICAiQkZEX1JFTE9DX05TMzJLX0lNTV8xNiIsCisgICJCRkRfUkVMT0NfTlMzMktfSU1NXzMyIiwKKyAgIkJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCIsCisgICJCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwiLAorICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfOCIsCisgICJCRkRfUkVMT0NfTlMzMktfRElTUF8xNiIsCisgICJCRkRfUkVMT0NfTlMzMktfRElTUF8zMiIsCisgICJCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19QUENfQjI2IiwKKyAgIkJGRF9SRUxPQ19QUENfQkEyNiIsCisgICJCRkRfUkVMT0NfUFBDX1RPQzE2IiwKKyAgIkJGRF9SRUxPQ19QUENfQjE2IiwKKyAgIkJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4iLAorICAiQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4iLAorICAiQkZEX1JFTE9DX1BQQ19CQTE2IiwKKyAgIkJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOIiwKKyAgIkJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTiIsCisgICJCRkRfUkVMT0NfUFBDX0NPUFkiLAorICAiQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCIsCisgICJCRkRfUkVMT0NfUFBDX0pNUF9TTE9UIiwKKyAgIkJGRF9SRUxPQ19QUENfUkVMQVRJVkUiLAorICAiQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMiLAorICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMiIsCisgICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2IiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8iLAorICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISSIsCisgICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBIiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiIsCisgICJCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2IiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwiLAorICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEiLAorICAiQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGIiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2IiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPIiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJIiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBIiwKKyAgIkJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQiLAorICAiQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBIiwKKyAgIkJGRF9SRUxPQ19DVE9SIiwKKyAgIkJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIIiwKKyAgIkJGRF9SRUxPQ19BUk1fSU1NRURJQVRFIiwKKyAgIkJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSIsCisgICJCRkRfUkVMT0NfQVJNX1NISUZUX0lNTSIsCisgICJCRkRfUkVMT0NfQVJNX1NXSSIsCisgICJCRkRfUkVMT0NfQVJNX01VTFRJIiwKKyAgIkJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTSIsCisgICJCRkRfUkVMT0NfQVJNX0FEUl9JTU0iLAorICAiQkZEX1JFTE9DX0FSTV9MRFJfSU1NIiwKKyAgIkJGRF9SRUxPQ19BUk1fTElURVJBTCIsCisgICJCRkRfUkVMT0NfQVJNX0lOX1BPT0wiLAorICAiQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCIsCisgICJCRkRfUkVMT0NfQVJNX0hXTElURVJBTCIsCisgICJCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCIsCisgICJCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSIsCisgICJCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUIiwKKyAgIkJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUIiwKKyAgIkJGRF9SRUxPQ19BUk1fR09UMTIiLAorICAiQkZEX1JFTE9DX0FSTV9HT1QzMiIsCisgICJCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCIsCisgICJCRkRfUkVMT0NfQVJNX0NPUFkiLAorICAiQkZEX1JFTE9DX0FSTV9HTE9CX0RBVCIsCisgICJCRkRfUkVMT0NfQVJNX1BMVDMyIiwKKyAgIkJGRF9SRUxPQ19BUk1fUkVMQVRJVkUiLAorICAiQkZEX1JFTE9DX0FSTV9HT1RPRkYiLAorICAiQkZEX1JFTE9DX0FSTV9HT1RQQyIsCisgICJCRkRfUkVMT0NfU0hfUENESVNQOEJZMiIsCisgICJCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIiLAorICAiQkZEX1JFTE9DX1NIX0lNTTQiLAorICAiQkZEX1JFTE9DX1NIX0lNTTRCWTIiLAorICAiQkZEX1JFTE9DX1NIX0lNTTRCWTQiLAorICAiQkZEX1JFTE9DX1NIX0lNTTgiLAorICAiQkZEX1JFTE9DX1NIX0lNTThCWTIiLAorICAiQkZEX1JFTE9DX1NIX0lNTThCWTQiLAorICAiQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiIsCisgICJCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0IiwKKyAgIkJGRF9SRUxPQ19TSF9TV0lUQ0gxNiIsCisgICJCRkRfUkVMT0NfU0hfU1dJVENIMzIiLAorICAiQkZEX1JFTE9DX1NIX1VTRVMiLAorICAiQkZEX1JFTE9DX1NIX0NPVU5UIiwKKyAgIkJGRF9SRUxPQ19TSF9BTElHTiIsCisgICJCRkRfUkVMT0NfU0hfQ09ERSIsCisgICJCRkRfUkVMT0NfU0hfREFUQSIsCisgICJCRkRfUkVMT0NfU0hfTEFCRUwiLAorICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDkiLAorICAiQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyIiwKKyAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMyIsCisgICJCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTCIsCisgICJCRkRfUkVMT0NfQVJDX0IyNiIsCisgICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SIiwKKyAgIkJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wiLAorICAiQkZEX1JFTE9DX0QxMFZfMTgiLAorICAiQkZEX1JFTE9DX0QxMFZfMThfUENSRUwiLAorICAiQkZEX1JFTE9DX0QzMFZfNiIsCisgICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUiIsCisgICJCRkRfUkVMT0NfRDMwVl8xNSIsCisgICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTCIsCisgICJCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SIiwKKyAgIkJGRF9SRUxPQ19EMzBWXzIxIiwKKyAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IiLAorICAiQkZEX1JFTE9DX0QzMFZfMzIiLAorICAiQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwiLAorICAiQkZEX1JFTE9DX00zMlJfMjQiLAorICAiQkZEX1JFTE9DX00zMlJfMTBfUENSRUwiLAorICAiQkZEX1JFTE9DX00zMlJfMThfUENSRUwiLAorICAiQkZEX1JFTE9DX00zMlJfMjZfUENSRUwiLAorICAiQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8iLAorICAiQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8iLAorICAiQkZEX1JFTE9DX00zMlJfTE8xNiIsCisgICJCRkRfUkVMT0NfTTMyUl9TREExNiIsCisgICJCRkRfUkVMT0NfVjg1MF85X1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19WODUwXzIyX1BDUkVMIiwKKyAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAorICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCIsCisgICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUIiwKKyAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQiLAorICAiQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQiLAorICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQiLAorICAiQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQiLAorICAiQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCisgICJCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCIsCisgICJCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCIsCisgICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKKyAgIkJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQiLAorICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCIsCisgICJCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQiLAorCisgICJCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTCIsCisgICJCRkRfUkVMT0NfTU4xMDMwMF8xNl9QQ1JFTCIsCisgICJCRkRfUkVMT0NfVElDMzBfTERQIiwKKyAgIkJGRF9SRUxPQ19GUjMwXzQ4IiwKKyAgIkJGRF9SRUxPQ19GUjMwXzIwIiwKKyAgIkJGRF9SRUxPQ19GUjMwXzZfSU5fNCIsCisgICJCRkRfUkVMT0NfRlIzMF84X0lOXzgiLAorICAiQkZEX1JFTE9DX0ZSMzBfOV9JTl84IiwKKyAgIkJGRF9SRUxPQ19GUjMwXzEwX0lOXzgiLAorICAiQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCIsCisgICJCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTCIsCisgICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCIsCisgICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIiLAorICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIiLAorICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMXzMyIiwKKyAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIiLAorICAiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIiwKKyAgIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiLAorICJAQG92ZXJmbG93OiBCRkRfUkVMT0NfVU5VU0VEQEAiLAorfTsKKyNlbmRpZgorCityZWxvY19ob3d0b190eXBlICoKK2JmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCisgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpKTsKKworYm9vbGVhbiAKK2JmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyBQQVJBTVMgKChiZmQgKmFiZmQsCisgICAgYXNlY3Rpb24gKnNlY3Rpb24sCisgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKyAgICBib29sZWFuICopKTsKKworYm9vbGVhbiAKK2JmZF9nZW5lcmljX2djX3NlY3Rpb25zCisgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworYmZkX2J5dGUgKgorCitiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgIFBBUkFNUyAoKGJmZCAqYWJmZCwKKyAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAorICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKKyAgICBiZmRfYnl0ZSAqZGF0YSwKKyAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKKyAgICBhc3ltYm9sICoqc3ltYm9scykpOworCitleHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OworYm9vbGVhbiAKK2JmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICphYmZkLAorICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAorICAgIHVuc2lnbmVkIGxvbmcgbWFjaCkpOworCitjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgorYmZkX2RlZmF1bHRfY29tcGF0aWJsZQorIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKKyAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpKTsKKworYm9vbGVhbiAKK2JmZF9kZWZhdWx0X3NjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZykpOworCitzdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgorYmZkX2VsZl9maW5kX3NlY3Rpb24gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqbmFtZSkpOworCmRpZmYgLS1naXQgYS9iZmQvbGliY29mZi1pbi5oIGIvYmZkL2xpYmNvZmYtaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGMyMTIxCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2xpYmNvZmYtaW4uaApAQCAtMCwwICsxLDUyOSBAQAorLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKKyoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAorKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisKKy8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCisKKyNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKKyNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCisjZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCisjZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQorI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQorCisjZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKKyNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKKyNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCisjZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQorI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCisKKyNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCisjZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKKyNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCisjZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKKyNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCisKKyNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKKworLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQoreworICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCisgIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKKyAgaW50IGNvbnZfdGFibGVfc2l6ZTsKKyAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7CisKKyAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7CisgIHVuc2lnbmVkIGludCByYXdfc3ltZW50X2NvdW50OworCisgIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIG9uY2Ugd3JpdGluZyBoYXMgYmVndW4gKi8KKyAgbG9uZyBpbnQgcmVsb2NiYXNlOworCisgIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sIHRhYmxlCisgICAgIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJyB1bmZvcnR1bmF0ZWx5IHZhcnkKKyAgICAgZnJvbSBjb2ZmIGltcGxlbWVudGF0aW9uIHRvIGltcGxlbWVudGF0aW9uLi4uICAqLworICB1bnNpZ25lZCBsb2NhbF9uX2J0bWFzazsKKyAgdW5zaWduZWQgbG9jYWxfbl9idHNoZnQ7CisgIHVuc2lnbmVkIGxvY2FsX25fdG1hc2s7CisgIHVuc2lnbmVkIGxvY2FsX25fdHNoaWZ0OworICB1bnNpZ25lZCBsb2NhbF9zeW1lc3o7CisgIHVuc2lnbmVkIGxvY2FsX2F1eGVzejsKKyAgdW5zaWduZWQgbG9jYWxfbGluZXN6OworCisgIC8qIFRoZSB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9scy4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQorICAgICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMuICAqLworICBQVFIgZXh0ZXJuYWxfc3ltczsKKyAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgZXh0ZXJuYWxfc3ltcyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KKyAgYm9vbGVhbiBrZWVwX3N5bXM7CisKKyAgLyogVGhlIHN0cmluZyB0YWJsZS4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQorICAgICBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuICAqLworICBjaGFyICpzdHJpbmdzOworICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBzdHJpbmdzIG1heSBub3QgYmUgZnJlZWQuICAqLworICBib29sZWFuIGtlZXBfc3RyaW5nczsKKworICAvKiBpcyB0aGlzIGEgUEUgZm9ybWF0IGNvZmYgZmlsZSAqLworICBpbnQgcGU7CisgIC8qIFVzZWQgYnkgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLworICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworCisgIC8qIHVzZWQgYnkgdGhlIHBlIGxpbmtlciBmb3IgUG93ZXJQQyAqLworICBpbnQgKmxvY2FsX3RvY19zeW1fbWFwOworCisgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisKKyAgLyogVXNlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KKyAgUFRSIGxpbmVfaW5mbzsKKworICAvKiBDb3B5IG9mIHNvbWUgb2YgdGhlIGZfZmxhZ3MgYml0cyBpbiB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwKKyAgICAgdXNlZCBieSBBUk0gY29kZS4gICovCisgIGZsYWd3b3JkIGZsYWdzOworCit9IGNvZmZfZGF0YV90eXBlOworCisvKiBUZGF0YSBmb3IgcGUgaW1hZ2UgZmlsZXMuICovCit0eXBlZGVmIHN0cnVjdCBwZV90ZGF0YQoreworICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOworICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZV9vcHRoZHI7CisgIGludCBkbGw7CisgIGludCBoYXNfcmVsb2Nfc2VjdGlvbjsKKyAgYm9vbGVhbiAoKmluX3JlbG9jX3ApIFBBUkFNUygoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOworICBmbGFnd29yZCByZWFsX2ZsYWdzOworfSBwZV9kYXRhX3R5cGU7CisKKyNkZWZpbmUgcGVfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLnBlX29ial9kYXRhKQorCisvKiBUZGF0YSBmb3IgWENPRkYgZmlsZXMuICAqLworCitzdHJ1Y3QgeGNvZmZfdGRhdGEKK3sKKyAgLyogQmFzaWMgQ09GRiBpbmZvcm1hdGlvbi4gICovCisgIGNvZmZfZGF0YV90eXBlIGNvZmY7CisKKyAgLyogVHJ1ZSBpZiBhIGxhcmdlIGEub3V0IGhlYWRlciBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KKyAgYm9vbGVhbiBmdWxsX2FvdXRoZHI7CisKKyAgLyogVE9DIHZhbHVlLiAgKi8KKyAgYmZkX3ZtYSB0b2M7CisKKyAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIFRPQy4gICovCisgIGludCBzbnRvYzsKKworICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgZW50cnkgcG9pbnQuICAqLworICBpbnQgc25lbnRyeTsKKworICAvKiAudGV4dCBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLworICBpbnQgdGV4dF9hbGlnbl9wb3dlcjsKKworICAvKiAuZGF0YSBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLworICBpbnQgZGF0YV9hbGlnbl9wb3dlcjsKKworICAvKiBtb2R0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KKyAgc2hvcnQgbW9kdHlwZTsKKworICAvKiBjcHV0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KKyAgc2hvcnQgY3B1dHlwZTsKKworICAvKiBtYXhkYXRhIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBtYXhkYXRhOworCisgIC8qIG1heHN0YWNrIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBtYXhzdGFjazsKKworICAvKiBVc2VkIGJ5IHRoZSBYQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCisgIGFzZWN0aW9uICoqY3NlY3RzOworICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRpY2VzOworICB1bnNpZ25lZCBpbnQgaW1wb3J0X2ZpbGVfaWQ7Cit9OworCisjZGVmaW5lIHhjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEueGNvZmZfb2JqX2RhdGEpCisKKy8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQorICogbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCisjZGVmaW5lIGNvZmZzeW1ib2woYXN5bWJvbCkgKChjb2ZmX3N5bWJvbF90eXBlICopKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCisKKy8qIFRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiBhIHNlY3Rpb24gbWF5IGJlIHNldCB0byBhIHBvaW50ZXIgdG8gdGhpcworICAgc3RydWN0dXJlLiAgKi8KKworc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YQoreworICAvKiBUaGUgcmVsb2NzLCBzd2FwcGVkIGludG8gQ09GRiBpbnRlcm5hbCBmb3JtLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSByZWxvY3MgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCisgIGJvb2xlYW4ga2VlcF9yZWxvY3M7CisgIC8qIFRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgY29udGVudHMgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCisgIGJvb2xlYW4ga2VlcF9jb250ZW50czsKKyAgLyogSW5mb3JtYXRpb24gY2FjaGVkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLworICBiZmRfdm1hIG9mZnNldDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uOworICBpbnQgbGluZV9iYXNlOworICAvKiBBIHBvaW50ZXIgdXNlZCBmb3IgLnN0YWIgbGlua2luZyBvcHRpbWl6YXRpb25zLiAgKi8KKyAgUFRSIHN0YWJfaW5mbzsKKyAgLyogQXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGJhY2tlbmRzLiAgKi8KKyAgUFRSIHRkYXRhOworfTsKKworLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCisgICgoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCisKKy8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KKworc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEKK3sKKyAgLyogVXNlZCBmb3IgWENPRkYgY3NlY3RzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlcjsgcG9pbnRzIHRvIHRoZSByZWFsCisgICAgIFhDT0ZGIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhpcyBjc2VjdC4gICovCisgIGFzZWN0aW9uICplbmNsb3Npbmc7CisgIC8qIFRoZSBsaW5lbm9fY291bnQgZmllbGQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiwgYmVjYXVzZSB3ZSBhcmUKKyAgICAgZ29pbmcgdG8gY2xvYmJlciBpdCB0aGVyZS4gICovCisgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7CisgIC8qIFRoZSBmaXJzdCBhbmQgb25lIHBhc3QgdGhlIGxhc3Qgc3ltYm9sIGluZGljZXMgZm9yIHN5bWJvbHMgdXNlZAorICAgICBieSB0aGlzIGNzZWN0LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmaXJzdF9zeW1uZHg7CisgIHVuc2lnbmVkIGxvbmcgbGFzdF9zeW1uZHg7Cit9OworCisvKiBBbiBhY2Nlc3NvciBtYWNybyB0aGUgeGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSB4Y29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCisgICgoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKKworLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFBFSSBpbWFnZSBmaWxlcy4gICovCisKK3N0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQoreworICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KKyAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Cit9OworCisvKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCisgICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCisKKy8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCisKK3N0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OworCisgIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKKyAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KKyAgbG9uZyBpbmR4OworCisgIC8qIFN5bWJvbCB0eXBlLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdHlwZTsKKworICAvKiBTeW1ib2wgY2xhc3MuICAqLworICB1bnNpZ25lZCBjaGFyIGNsYXNzOworCisgIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCisgIGNoYXIgbnVtYXV4OworCisgIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLworICBiZmQgKmF1eGJmZDsKKworICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLworICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKK307CisKKy8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKKyAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCisgIFBUUiBzdGFiX2luZm87Cit9OworCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCisgICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCisgICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKKwkJCSAoY29weSksIChmb2xsb3cpKSkKKworLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCisgIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLworCisjZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKKworLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7CitleHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitleHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7CitleHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKK2V4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOworZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKKwkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOworZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKKwkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKKwkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7CitleHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKKwkJCQkJICAgICAgIGFzeW1ib2wgKiosCisJCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKKwkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCisJCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKK2V4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOworZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKK2V4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAorCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7CitleHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCisJCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkJICAgYXNlY3Rpb24gKikpOworZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAorCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7CisKKy8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCisKKyNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKKworLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KKyAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLworCisvKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCisgICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAoreworICAvKiBOZXh0IGVsZW1lbnQuICAqLworICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OworCisgIC8qIE5hbWUuICAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFR5cGUuICAqLworICB1bnNpZ25lZCBpbnQgdHlwZTsKKworICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCisgIGxvbmcgdGFnbmR4OworfTsKKworLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLworCitzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCit7CisgIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLworICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OworCisgIC8qIENsYXNzIG9mIHR5cGUuICAqLworICBpbnQgY2xhc3M7CisKKyAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KKyAgbG9uZyBpbmR4OworCisgIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLworICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKK307CisKKy8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKKworICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLworICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKK307CisKKy8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQoreworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKK307CisKKy8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCisgIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCisKKy8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCisgIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCisgICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCisgICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCisKKy8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZworICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCisKK3N0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCit7CisgIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7CisgIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KKyAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCisgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Cit9OworCisvKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLworCitzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KK3sKKyAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgIC8qIE91dHB1dCBCRkQuICAqLworICBiZmQgKm91dHB1dF9iZmQ7CisgIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCisgIGJvb2xlYW4gZmFpbGVkOworICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQorICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCisgICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLworICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7CisgIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOworICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCisgICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCisgIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87CisgIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KKyAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7CisgIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOworICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5CisgICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLworICBsb25nIGxhc3RfYmZfaW5kZXg7CisgIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7CisgIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCisgIGFzZWN0aW9uICoqc2VjX3B0cnM7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQorICAgICBpbnB1dCBmaWxlLiAgKi8KKyAgbG9uZyAqc3ltX2luZGljZXM7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLworICBiZmRfYnl0ZSAqb3V0c3ltczsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0CisgICAgIHNlY3Rpb24uICAqLworICBiZmRfYnl0ZSAqbGluZW5vczsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KKyAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KKyAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KKyAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Cit9OworCitleHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAorICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCisJICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQorICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBjaGFyICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOworCitleHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bQorICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzCisgIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZAorICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOworCisKKyNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKKy8qIEZ1bmN0aW9ucyBpbiB4Y29mZmxpbmsuYy4gICovCisKK2V4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgorICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisgIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOworCisvKiBGdW5jdGlvbnMgaW4gY29mZi1wcGMuYy4gIEZJWE1FOiBUaGVzZSBhcmUgY2FsbGVkIGJlIHBlLmVtIGluIHRoZQorICAgbGlua2VyLCBhbmQgc28gc2hvdWxkIHN0YXJ0IHdpdGggYmZkIGFuZCBiZSBkZWNsYXJlZCBpbiBiZmQuaC4gICovCisKK2V4dGVybiBib29sZWFuIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CitleHRlcm4gYm9vbGVhbiBwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBBbmQgbW9yZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgLi4gKi8KKwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmNvZmYuaCBiL2JmZC9saWJjb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxOGE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9saWJjb2ZmLmgKQEAgLTAsMCArMSw4ODggQEAKKy8qIEJGRCBDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCisqKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKKyoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisvKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLworCisjZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCisjZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQorI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQorI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKKyNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKKworI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCisjZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCisjZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQorI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKKyNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQorCisjZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQorI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCisjZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQorI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCisjZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQorCisjZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCisKKy8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCisKK3R5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKK3sKKyAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLworICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7CisgIGludCBjb252X3RhYmxlX3NpemU7CisgIGZpbGVfcHRyIHN5bV9maWxlcG9zOworCisgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOworICB1bnNpZ25lZCBpbnQgcmF3X3N5bWVudF9jb3VudDsKKworICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCisgIGxvbmcgaW50IHJlbG9jYmFzZTsKKworICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQorICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5CisgICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KKyAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7CisgIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OworICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOworICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKKyAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OworICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7CisgIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKKworICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKKyAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KKyAgUFRSIGV4dGVybmFsX3N5bXM7CisgIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCisgIGJvb2xlYW4ga2VlcF9zeW1zOworCisgIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKKyAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KKyAgY2hhciAqc3RyaW5nczsKKyAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KKyAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7CisKKyAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KKyAgaW50IHBlOworICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KKyAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKworICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KKyAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKKworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworCisgIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCisgIFBUUiBsaW5lX2luZm87CisKKyAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCisgICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLworICBmbGFnd29yZCBmbGFnczsKKworfSBjb2ZmX2RhdGFfdHlwZTsKKworLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKK3sKKyAgY29mZl9kYXRhX3R5cGUgY29mZjsKKyAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOworICBpbnQgZGxsOworICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247CisgIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKKyAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKK30gcGVfZGF0YV90eXBlOworCisjZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKKworLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KKworc3RydWN0IHhjb2ZmX3RkYXRhCit7CisgIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLworICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOworCisgIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCisgIGJvb2xlYW4gZnVsbF9hb3V0aGRyOworCisgIC8qIFRPQyB2YWx1ZS4gICovCisgIGJmZF92bWEgdG9jOworCisgIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLworICBpbnQgc250b2M7CisKKyAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KKyAgaW50IHNuZW50cnk7CisKKyAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KKyAgaW50IHRleHRfYWxpZ25fcG93ZXI7CisKKyAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KKyAgaW50IGRhdGFfYWxpZ25fcG93ZXI7CisKKyAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCisgIHNob3J0IG1vZHR5cGU7CisKKyAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCisgIHNob3J0IGNwdXR5cGU7CisKKyAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCisgIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKKworICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCisgIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7CisKKyAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLworICBhc2VjdGlvbiAqKmNzZWN0czsKKyAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKKyAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOworfTsKKworI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQorCisvKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKKyAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLworI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQorCisvKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKKyAgIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKK3sKKyAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKKyAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLworICBib29sZWFuIGtlZXBfcmVsb2NzOworICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLworICBib29sZWFuIGtlZXBfY29udGVudHM7CisgIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KKyAgYmZkX3ZtYSBvZmZzZXQ7CisgIHVuc2lnbmVkIGludCBpOworICBjb25zdCBjaGFyICpmdW5jdGlvbjsKKyAgaW50IGxpbmVfYmFzZTsKKyAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCisgIFBUUiBzdGFiX2luZm87CisgIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCisgIFBUUiB0ZGF0YTsKK307CisKKy8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAorICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQorCisvKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCisKK3N0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCit7CisgIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAorICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLworICBhc2VjdGlvbiAqZW5jbG9zaW5nOworICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCisgICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLworICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OworICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKKyAgICAgYnkgdGhpcyBjc2VjdC4gICovCisgIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OworICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OworfTsKKworLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAorICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCisKKy8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRUkgaW1hZ2UgZmlsZXMuICAqLworCitzdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKK3sKKyAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCisgIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOworfTsKKworLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBwZWlfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAorICAoKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQorCisvKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLworCitzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKKworICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBTZXQgdG8gLTEgaW5pdGlhbGx5LiAgU2V0IHRvIC0yIGlmCisgICAgIHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCisgIGxvbmcgaW5keDsKKworICAvKiBTeW1ib2wgdHlwZS4gICovCisgIHVuc2lnbmVkIHNob3J0IHR5cGU7CisKKyAgLyogU3ltYm9sIGNsYXNzLiAgKi8KKyAgdW5zaWduZWQgY2hhciBjbGFzczsKKworICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLworICBjaGFyIG51bWF1eDsKKworICAvKiBCRkQgdG8gdGFrZSBhdXhpbGlhcnkgZW50cmllcyBmcm9tLiAgKi8KKyAgYmZkICphdXhiZmQ7CisKKyAgLyogUG9pbnRlciB0byBhcnJheSBvZiBhdXhpbGlhcnkgZW50cmllcywgaWYgYW55LiAgKi8KKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXg7Cit9OworCisvKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisgIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLworICBQVFIgc3RhYl9pbmZvOworfTsKKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAorICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAorICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCisJCQkgKGNvcHkpLCAoZm9sbG93KSkpCisKKy8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAorICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCisgICAgKGluZm8pKSkKKworLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCisKKy8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOworZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKK2V4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOworZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOworZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitleHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKK2V4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCisJCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKK2V4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCisJCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCisJCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOworZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKKwkJCQkJICAgICAgIGFzZWN0aW9uICosCisJCQkJCSAgICAgICBhc3ltYm9sICoqLAorCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCisJCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAorCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7CitleHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKK2V4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7CitleHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKKwkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOworZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAorCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJCSAgIGFzZWN0aW9uICopKTsKK2V4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKKwkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKKwkJCQkgICAgICBiZmRfdm1hIHZhbCkpOworCisvKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLworCisjZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCisKKy8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCisgICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KKworLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQorICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKK3sKKyAgLyogTmV4dCBlbGVtZW50LiAgKi8KKyAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKKworICAvKiBOYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBUeXBlLiAgKi8KKyAgdW5zaWduZWQgaW50IHR5cGU7CisKKyAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLworICBsb25nIHRhZ25keDsKK307CisKKy8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KKworc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQoreworICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KKyAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKKworICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KKyAgaW50IGNsYXNzOworCisgIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCisgIGxvbmcgaW5keDsKKworICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KKyAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Cit9OworCisvKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKK3sKKyAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7CisKKyAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KKyAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Cit9OworCisvKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Cit9OworCisvKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAorICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQorCisvKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAorICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQorCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAorICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAorICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQorCisvKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKKyAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLworCitzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbworeworICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCisgICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLworICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOworfTsKKworLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KKworc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCit7CisgIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAvKiBPdXRwdXQgQkZELiAgKi8KKyAgYmZkICpvdXRwdXRfYmZkOworICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLworICBib29sZWFuIGZhaWxlZDsKKyAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKKyAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAorICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KKyAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOworICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCisgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKKyAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgorICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLworICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOworICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCisgIGxvbmcgbGFzdF9maWxlX2luZGV4OworICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKKyAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQorICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KKyAgbG9uZyBsYXN0X2JmX2luZGV4OworICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCisgIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOworICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KKyAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLworICBhc2VjdGlvbiAqKnNlY19wdHJzOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKKyAgICAgaW5wdXQgZmlsZS4gICovCisgIGxvbmcgKnN5bV9pbmRpY2VzOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KKyAgYmZkX2J5dGUgKm91dHN5bXM7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAorICAgICBzZWN0aW9uLiAgKi8KKyAgYmZkX2J5dGUgKmxpbmVub3M7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCisgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOworfTsKKworZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKKyAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAorCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKKwkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKK2V4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyAgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKKwkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisJICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKKworZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KKyAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscworICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKKyAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCisJICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKKworCisjZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworCisvKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLworCitleHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKK2V4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKK2V4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCisJICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKKworLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKKyAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLworCitleHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCisKK3R5cGVkZWYgc3RydWN0IGNvZmZfcHRyX3N0cnVjdAoreworCisgICAgICAgIC8qIFJlbWVtYmVycyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgZmlsZSBmb3IKKyAgICAgICAgICB0aGlzIHN5bWJvbC4gR2VuZXJhdGVkIGJ5IGNvZmZfcmVudW1iZXJfc3ltYm9scy4gKi8KK3Vuc2lnbmVkIGludCBvZmZzZXQ7CisKKyAgICAgICAgLyogU2hvdWxkIHRoZSB2YWx1ZSBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLiAgVXNlZCBmb3IKKyAgICAgICAgICBYQ09GRiBDX0JTVEFUIHN5bWJvbHMuICBTZXQgYnkgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqLwordW5zaWduZWQgaW50IGZpeF92YWx1ZSA6IDE7CisKKyAgICAgICAgLyogU2hvdWxkIHRoZSB0YWcgZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KKyAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCit1bnNpZ25lZCBpbnQgZml4X3RhZyA6IDE7CisKKyAgICAgICAgLyogU2hvdWxkIHRoZSBlbmRpZHggZmllbGQgb2YgdGhpcyBzeW1ib2wgYmUgcmVudW1iZXJlZC4KKyAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCit1bnNpZ25lZCBpbnQgZml4X2VuZCA6IDE7CisKKyAgICAgICAgLyogU2hvdWxkIHRoZSB4X2NzZWN0Lnhfc2NubGVuIGZpZWxkIGJlIHJlbnVtYmVyZWQuCisgICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqLwordW5zaWduZWQgaW50IGZpeF9zY25sZW4gOiAxOworCisgICAgICAgIC8qIEZpeCB1cCBhbiBYQ09GRiBDX0JJTkNML0NfRUlOQ0wgc3ltYm9sLiAgVGhlIHZhbHVlIGlzIHRoZQorICAgICAgICAgIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBTZXQgYnkKKyAgICAgICAgICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCit1bnNpZ25lZCBpbnQgZml4X2xpbmUgOiAxOworCisgICAgICAgIC8qIFRoZSBjb250YWluZXIgZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlIGFzIHJlYWQgYW5kIHRyYW5zbGF0ZWQKKyAgICAgICAgICAgZnJvbSB0aGUgZmlsZS4gKi8KKwordW5pb24geworICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKKyAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OworIH0gdTsKK30gY29tYmluZWRfZW50cnlfdHlwZTsKKworCisgLyogRWFjaCBjYW5vbmljYWwgYXN5bWJvbCByZWFsbHkgbG9va3MgbGlrZSB0aGlzOiAqLworCit0eXBlZGVmIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QKK3sKKyAgICAvKiBUaGUgYWN0dWFsIHN5bWJvbCB3aGljaCB0aGUgcmVzdCBvZiBCRkQgd29ya3Mgd2l0aCAqLworYXN5bWJvbCBzeW1ib2w7CisKKyAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKi8KK2NvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKKworICAgIC8qIEEgcG9pbnRlciB0byB0aGUgbGluZW51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wgKi8KK3N0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgKmxpbmVubzsKKworICAgIC8qIEhhdmUgdGhlIGxpbmUgbnVtYmVycyBiZWVuIHJlbG9jYXRlZCB5ZXQgPyAqLworYm9vbGVhbiBkb25lX2xpbmVubzsKK30gY29mZl9zeW1ib2xfdHlwZTsKK3R5cGVkZWYgc3RydWN0Cit7CisgIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAorICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCisgICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCisgICAgICAgaW50ICAgICAgICAgICAgIGNsYXNzLAorICAgICAgIGludCAgICAgICAgICAgICBpbmRhdXgsCisgICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKKyAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKKworICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCAsCisgICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKKyAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKKworICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKKyAgICAgICBQVFIgICAgICAgICAgICBleHQsCisgICAgICAgUFRSICAgICAgICAgICAgIGluKSk7CisKKyB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfb3V0KSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkLAorICAgICAgIFBUUiAgICAgaW4sCisgICAgICAgaW50ICAgICB0eXBlLAorICAgICAgIGludCAgICAgY2xhc3MsCisgICAgICAgaW50ICAgICBpbmRhdXgsCisgICAgICAgaW50ICAgICBudW1hdXgsCisgICAgICAgUFRSICAgICBleHQpKTsKKworIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAorICAgICAgYmZkICAgICAgKmFiZmQsCisgICAgICBQVFIgICAgICBpbiwKKyAgICAgIFBUUiAgICAgIGV4dCkpOworCisgdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgUEFSQU1TICgoCisgICAgICAgYmZkICAgICAqYWJmZCwKKyAgICAgICBQVFIgICAgIGluLAorICAgICAgIFBUUiAgICAgZXh0KSk7CisKKyB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBzcmMsCisgICAgICAgUFRSICAgICBkc3QpKTsKKworIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkLAorICAgICAgIFBUUiAgICAgaW4sCisgICAgICAgUFRSICAgICBvdXQpKTsKKworIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkLAorICAgICAgIFBUUiAgICAgaW4sCisgICAgICAgUFRSICAgICBvdXQpKTsKKworIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBpbiwKKyAgICAgICBQVFIgICAgIG91dCkpOworCisgdW5zaWduZWQgaW50IF9iZmRfZmlsaHN6OworIHVuc2lnbmVkIGludCBfYmZkX2FvdXRzejsKKyB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7CisgdW5zaWduZWQgaW50IF9iZmRfc3ltZXN6OworIHVuc2lnbmVkIGludCBfYmZkX2F1eGVzejsKKyB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKKyB1bnNpZ25lZCBpbnQgX2JmZF9saW5lc3o7CisgYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19maWxlbmFtZXM7CisgYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzOworIHVuc2lnbmVkIGludCBfYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcjsKKyB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgUEFSQU1TICgoCisgICAgICAgYmZkICAgICAqYWJmZCwKKyAgICAgICBQVFIgICAgIGV4dCwKKyAgICAgICBQVFIgICAgIGluKSk7Cisgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBleHQsCisgICAgICAgUFRSICAgICBpbikpOworIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBleHQsCisgICAgICAgUFRSICAgICBpbikpOworIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19pbikgUEFSQU1TICgoCisgICAgICAgYmZkICAgICAqYWJmZCwKKyAgICAgICBQVFIgICAgIGV4dCwKKyAgICAgICBQVFIgICAgIGluKSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyKSk7CisgUFRSICgqX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICBpbnRlcm5hbF9maWxlaGRyLAorICAgICAgIFBUUiAgICAgaW50ZXJuYWxfYW91dGhkcikpOworIGZsYWd3b3JkICgqX2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkLAorICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyLAorICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpKTsKKyB2b2lkICgqX2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIFBBUkFNUyAoKAorICAgICAgIGJmZCAgICAgKmFiZmQsCisgICAgICAgYXNlY3Rpb24gKnNlYywKKyAgICAgICBQVFIgICAgIGludGVybmFsX3NjbmhkcikpOworIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkKSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkLAorICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSkpOworIGJvb2xlYW4gKCpfYmZkX2NvZmZfcG9pbnRlcml6ZV9hdXhfaG9vaykgUEFSQU1TICgoCisgICAgICAgYmZkICphYmZkLAorICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCisgICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAorICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgsCisgICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4KSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9wcmludF9hdXgpIFBBUkFNUyAoKAorICAgICAgIGJmZCAqYWJmZCwKKyAgICAgICBGSUxFICpmaWxlLAorICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2UsCisgICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAorICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaW5kYXV4KSk7Cisgdm9pZCAoKl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgICAgICphYmZkLAorICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCisgICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAorICAgICAgIGFyZWxlbnQgKnJlbG9jLAorICAgICAgIGJmZF9ieXRlICpkYXRhLAorICAgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciwKKyAgICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHIpKTsKKyBpbnQgKCpfYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSkgUEFSQU1TICgoCisgICAgICAgYmZkICphYmZkLAorICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorICAgICAgIGFyZWxlbnQgKnIsCisgICAgICAgdW5zaWduZWQgaW50IHNocmluaywKKyAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgKmFiZmQsCisgICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpIFBBUkFNUyAoKAorICAgICAgIGJmZCAqYWJmZCkpOworIGJvb2xlYW4gKCpfYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykgUEFSQU1TICgoCisgICAgICAgYmZkICpvdXRwdXRfYmZkLAorICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7CisgYm9vbGVhbiAoKl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgKm91dHB1dF9iZmQsCisgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisgICAgICAgYmZkICppbnB1dF9iZmQsCisgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisgICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAorICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzLAorICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXMsCisgICAgICAgYXNlY3Rpb24gKipzZWN0aW9ucykpOworIHJlbG9jX2hvd3RvX3R5cGUgKigqX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgKmFiZmQsCisgICAgICAgYXNlY3Rpb24gKnNlYywKKyAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwKKyAgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmgsCisgICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltLAorICAgICAgIGJmZF92bWEgKmFkZGVuZHApKTsKKyBib29sZWFuICgqX2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpIFBBUkFNUyAoKAorICAgICAgIGJmZCAqb2JmZCwKKyAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKKyAgICAgICBiZmQgKmliZmQsCisgICAgICAgYXNlY3Rpb24gKnNlYywKKyAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jLAorICAgICAgIGJvb2xlYW4gKmFkanVzdGVkcCkpOworIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoCisgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCisgICAgICAgYmZkICphYmZkLAorICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgZmxhZ3dvcmQgZmxhZ3MsIAorICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAorICAgICAgIGJmZF92bWEgdmFsdWUsCisgICAgICAgY29uc3QgY2hhciAqc3RyaW5nLAorICAgICAgIGJvb2xlYW4gY29weSwKKyAgICAgICBib29sZWFuIGNvbGxlY3QsIAorICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHApKTsKKworIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSBQQVJBTVMgKCgKKyAgICAgICBiZmQgKiBhYmZkLAorICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOworIGJvb2xlYW4gKCpfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSBQQVJBTVMgKCgKKyAgICAgICBiZmQgKiBhYmZkLAorICAgICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbykpOworCit9IGJmZF9jb2ZmX2JhY2tlbmRfZGF0YTsKKworI2RlZmluZSBjb2ZmX2JhY2tlbmRfaW5mbyhhYmZkKSAoKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9pbihhLGUsdCxjLGluZCxudW0saSkgXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X2luKSAoYSxlLHQsYyxpbmQsbnVtLGkpKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX2luKGEsZSxpKSBcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9zeW1faW4pIChhLGUsaSkpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4oYSxlLGkpIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoIGEpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIChhLGUsaSkpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQoYWJmZCwgaSwgbykgXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KGFiZmQsIGksIG8pIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX2F1eF9vdXQoYSxpLHQsYyxpbmQsbnVtLG8pIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIChhLGksdCxjLGluZCxudW0sbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1fb3V0KGFiZmQsIGksbykgXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgKGFiZmQsIGksIG8pKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dChhYmZkLCBpLG8pIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0KGFiZmQsIGksbykgXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0KGFiZmQsIGksbykgXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9maWxoc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9maWxoc3opCisjZGVmaW5lIGJmZF9jb2ZmX2FvdXRzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2FvdXRzeikKKyNkZWZpbmUgYmZkX2NvZmZfc2NuaHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2NuaHN6KQorI2RlZmluZSBiZmRfY29mZl9zeW1lc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zeW1lc3opCisjZGVmaW5lIGJmZF9jb2ZmX2F1eGVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2F1eGVzeikKKyNkZWZpbmUgYmZkX2NvZmZfcmVsc3ooYWJmZCkgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfcmVsc3opCisjZGVmaW5lIGJmZF9jb2ZmX2xpbmVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2xpbmVzeikKKyNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQorI2RlZmluZSBiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMoYWJmZCkgXAorICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKQorI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKKyAgICAgICAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIpCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbihhYmZkLCBpLG8pIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4oYWJmZCwgaSxvKSBcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4oYWJmZCwgaSxvKSBcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX2luKGFiZmQsIGksIG8pIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rKGFiZmQsIGZpbGVoZHIpIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKKworI2RlZmluZSBiZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2soYWJmZCwgZmlsZWhkcilcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCisjZGVmaW5lIGJmZF9jb2ZmX21rb2JqZWN0X2hvb2soYWJmZCwgZmlsZWhkciwgYW91dGhkcilcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2soYWJmZCwgc2NuaGRyLCBuYW1lKVwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaykgKGFiZmQsIHNjbmhkciwgbmFtZSkpCisKKyNkZWZpbmUgYmZkX2NvZmZfc2V0X2FsaWdubWVudF9ob29rKGFiZmQsIHNlYywgc2NuaGRyKVwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfc2V0X2FsaWdubWVudF9ob29rKSAoYWJmZCwgc2VjLCBzY25oZHIpKQorCisjZGVmaW5lIGJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZShhYmZkKVwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKSkKKworI2RlZmluZSBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKGFiZmQsIHN5bSlcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZykgKGFiZmQsIHN5bSkpCisKKyNkZWZpbmUgYmZkX2NvZmZfcHJpbnRfYXV4KGFiZmQsIGZpbGUsIGJhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3ByaW50X2F1eClcCisgICAgICAgICAoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkpCisKKyNkZWZpbmUgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyhhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKVwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKVwKKyAgICAgICAgIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIHJlbG9jLCBkYXRhLCBzcmNfcHRyLCBkc3RfcHRyKSkKKworI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbylcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSlcCisgICAgICAgICAoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKSkKKworI2RlZmluZSBiZmRfY29mZl9zeW1faXNfZ2xvYmFsKGFiZmQsIHN5bSlcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3ltX2lzX2dsb2JhbClcCisgICAgICAgICAoYWJmZCwgc3ltKSkKKworI2RlZmluZSBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMoYWJmZClcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKVwKKyAgICAgICAgIChhYmZkKSkKKworI2RlZmluZSBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKG9iZmQsIGluZm8pXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChvYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspXAorICAgICAgICAgKG9iZmQsIGluZm8pKQorI2RlZmluZSBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKG9iZmQsaW5mbyxpYmZkLG8sY29uLHJlbCxpc3ltcyxzZWNzKVwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoaWJmZCktPl9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKVwKKyAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBvLCBjb24sIHJlbCwgaXN5bXMsIHNlY3MpKQorI2RlZmluZSBiZmRfY29mZl9ydHlwZV90b19ob3d0byhhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKVwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ydHlwZV90b19ob3d0bylcCisgICAgICAgICAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkpCisjZGVmaW5lIGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcClcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfYWRqdXN0X3N5bW5keClcCisgICAgICAgICAob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcCkpCisjZGVmaW5lIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2woaW5mbyxhYmZkLG5hbWUsZmxhZ3Msc2VjdGlvbix2YWx1ZSxzdHJpbmcsY3AsY29sbCxoYXNocClcCisgICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbClcCisgICAgICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsIGNwLCBjb2xsLCBoYXNocCkpCisKKyNkZWZpbmUgYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKGEscCkgXAorICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bikgKGEscCkpCisjZGVmaW5lIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdChhLHApIFwKKyAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIChhLHApKQorCmRpZmYgLS1naXQgYS9iZmQvbGliZWNvZmYuaCBiL2JmZC9saWJlY29mZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjY5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbGliZWNvZmYuaApAQCAtMCwwICsxLDM1NyBAQAorLyogQkZEIEVDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaWZuZGVmIEVDT0ZGX0gKKyNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCisjZW5kaWYKKworLyogVGhpcyBpcyB0aGUgYmFja2VuZCBpbmZvcm1hdGlvbiBrZXB0IGZvciBFQ09GRiBmaWxlcy4gIFRoaXMKKyAgIHN0cnVjdHVyZSBpcyBjb25zdGFudCBmb3IgYSBwYXJ0aWN1bGFyIGJhY2tlbmQuICBUaGUgZmlyc3QgZWxlbWVudAorICAgaXMgdGhlIENPRkYgYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgc28gdGhhdCBFQ09GRiB0YXJnZXRzIGNhbiB1c2UKKyAgIHRoZSBnZW5lcmljIENPRkYgY29kZS4gICovCisKKyNkZWZpbmUgZWNvZmZfYmFja2VuZChhYmZkKSBcCisgICgoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKKworc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YQoreworICAvKiBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KKyAgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGNvZmY7CisgIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCisgIGNvbnN0IGNoYXIgKmFybWFwX3N0YXJ0OworICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCisgICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCisgIGJmZF92bWEgcm91bmQ7CisgIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCisgICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCisgICAgIE1JUFMuICAqLworICBib29sZWFuIHJkYXRhX2luX3RleHQ7CisgIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCisgIHVuc2lnbmVkIGludCBjb25zdHJ1Y3Rvcl9iaXRzaXplOworICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLworICByZWxvY19ob3d0b190eXBlICpjb25zdHJ1Y3Rvcl9yZWxvYzsKKyAgLyogSG93IHRvIHN3YXAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgZGVidWdfc3dhcDsKKyAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCisgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKKyAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KKyAgdm9pZCAoKnN3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7CisgIHZvaWQgKCpzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBQVFIpKTsKKyAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCisgIHZvaWQgKCphZGp1c3RfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKKwkJCQkgICBhcmVsZW50ICopKTsKKyAgdm9pZCAoKmFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCisJCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7CisgIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCisgIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJICAgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKKwkJCQkgICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAorCQkJCSAgICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzKSk7CisgIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLworICBib29sZWFuICgqYWRqdXN0X2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLAorCQkJCSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOworICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gIFRoaXMKKyAgICAgaXMgbmVlZGVkIGJlY2F1c2UgT1NGLzEgMy4yIHVzZXMgYSB3ZWlyZCBhcmNoaXZlIGZvcm1hdC4gICovCisgIGJmZCAqKCpnZXRfZWx0X2F0X2ZpbGVwb3MpIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0cikpOworfTsKKworLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgKi8KKworI2RlZmluZSBlY29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLmVjb2ZmX29ial9kYXRhKQorCit0eXBlZGVmIHN0cnVjdCBlY29mZl90ZGF0YQoreworICAvKiBUaGUgcmVsb2MgZmlsZSBwb3NpdGlvbiwgc2V0IGJ5CisgICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCisgIGZpbGVfcHRyIHJlbG9jX2ZpbGVwb3M7CisKKyAgLyogVGhlIHN5bWJvbCB0YWJsZSBmaWxlIHBvc2l0aW9uLCBzZXQgYnkgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLiAgKi8KKyAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7CisKKyAgLyogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHRleHQgc2VnbWVudC4gIE9ubHkgdmFsaWQgZm9yIGFuCisgICAgIGV4aXN0aW5nIGZpbGUsIG5vdCBmb3Igb25lIHdlIGFyZSBjcmVhdGluZy4gICovCisgIHVuc2lnbmVkIGxvbmcgdGV4dF9zdGFydDsKKyAgdW5zaWduZWQgbG9uZyB0ZXh0X2VuZDsKKworICAvKiBUaGUgY2FjaGVkIGdwIHZhbHVlLiAgVGhpcyBpcyB1c2VkIHdoZW4gcmVsb2NhdGluZy4gICovCisgIGJmZF92bWEgZ3A7CisKKyAgLyogVGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIG9wdGltaXplIHVzaW5nIGdwLiAgVGhpcyBpcworICAgICB0eXBpY2FsbHkgc2V0IGJ5IHRoZSAtRyBvcHRpb24gdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IKKyAgICAgbGlua2VyLiAgKi8KKyAgdW5zaWduZWQgaW50IGdwX3NpemU7CisKKyAgLyogVGhlIHJlZ2lzdGVyIG1hc2tzLiAgV2hlbiBsaW5raW5nLCBhbGwgdGhlIG1hc2tzIGZvdW5kIGluIHRoZQorICAgICBpbnB1dCBmaWxlcyBhcmUgY29tYmluZWQgaW50byB0aGUgbWFza3Mgb2YgdGhlIG91dHB1dCBmaWxlLgorICAgICBUaGVzZSBhcmUgbm90IGFsbCB1c2VkIGZvciBhbGwgdGFyZ2V0cywgYnV0IHRoYXQncyBPSywgYmVjYXVzZQorICAgICB0aGUgcmVsZXZhbnQgb25lcyBhcmUgdGhlIG9ubHkgb25lcyBzd2FwcGVkIGluIGFuZCBvdXQuICAqLworICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7CisgIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKKyAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOworCisgIC8qIFRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1Z19pbmZvOworCisgIC8qIFRoZSB1bnN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLworICBQVFIgcmF3X3N5bWVudHM7CisKKyAgLyogVGhlIGNhbm9uaWNhbCBCRkQgc3ltYm9scy4gICovCisgIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0ICpjYW5vbmljYWxfc3ltYm9sczsKKworICAvKiBBIG1hcHBpbmcgZnJvbSBleHRlcm5hbCBzeW1ib2wgbnVtYmVycyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIKKyAgICAgaGFzaCB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICAqLworICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKworICAvKiBBIG1hcHBpbmcgZnJvbSByZWxvYyBzeW1ib2wgaW5kaWNlcyB0byBzZWN0aW9ucywgdXNlZCB3aGVuCisgICAgIGxpbmtpbmcuICAqLworICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOworCisgIC8qIFRydWUgaWYgdGhpcyBCRkQgd2FzIHdyaXR0ZW4gYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KKyAgYm9vbGVhbiBsaW5rZXI7CisKKyAgLyogVHJ1ZSBpZiBhIHdhcm5pbmcgdGhhdCBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMgYXJlCisgICAgIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGJpbmFyeSB3YXMgaXNzdWVkIGFscmVhZHkuICAqLworICBib29sZWFuIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nOworCisgIC8qIFVzZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICBUaGUgc3RydWN0dXJlIGNvdWxkIGJlCisgICAgIGluY2x1ZGVkIGRpcmVjdGx5IGluIHRoaXMgb25lLCBidXQgdGhlcmUncyBubyBwb2ludCB0byB3YXN0aW5nCisgICAgIHRoZSBtZW1vcnkganVzdCBmb3IgdGhlIGluZnJlcXVlbnRseSBjYWxsZWQgZmluZF9uZWFyZXN0X2xpbmUuICAqLworICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpmaW5kX2xpbmVfaW5mbzsKKworICAvKiBXaGV0aGVyIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgdGV4dCBzZWdtZW50IGZvciB0aGlzCisgICAgIHBhcnRpY3VsYXIgRUNPRkYgZmlsZS4gIFRoaXMgaXMgbm90IHZhbGlkIHVudGlsCisgICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBjYWxsZWQuICAqLworICBib29sZWFuIHJkYXRhX2luX3RleHQ7CisKK30gZWNvZmZfZGF0YV90eXBlOworCisvKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXMuICAqLworCit0eXBlZGVmIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0Cit7CisgIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCisgIGFzeW1ib2wgc3ltYm9sOworCisgIC8qIFRoZSBmZHIgZm9yIHRoaXMgc3ltYm9sLiAgKi8KKyAgRkRSICpmZHI7CisKKyAgLyogdHJ1ZSBpZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHJhdGhlciB0aGFuIGFuIGV4dGVybmFsIG9uZS4gICovCisgIGJvb2xlYW4gbG9jYWw7CisKKyAgLyogQSBwb2ludGVyIHRvIHRoZSB1bnN3YXBwZWQgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbC4KKyAgICAgVGhpcyBpcyBlaXRoZXIgYSBzdHJ1Y3Qgc3ltX2V4dCBvciBhIHN0cnVjdCBleHRfZXh0LCBkZXBlbmRpbmcgb24KKyAgICAgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBmaWVsZCBhYm92ZS4gICovCisgIFBUUiBuYXRpdmU7Cit9IGVjb2ZmX3N5bWJvbF90eXBlOworCisvKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKKyAgIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLworI2RlZmluZSBlY29mZnN5bWJvbChhc3ltYm9sKSAoKGVjb2ZmX3N5bWJvbF90eXBlICopICgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQorCisvKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN5bWJvbCB3aGVuIHdlIHdyaXRlIGl0CisgICBvdXQgc28gdGhhdCBjYW4gc2V0IHRoZSBzeW1ib2wgaW5kZXggY29ycmVjdGx5IHdoZW4gd2Ugd3JpdGUgb3V0CisgICB0aGUgcmVsb2NzLiAgKi8KKyNkZWZpbmUgZWNvZmZfZ2V0X3N5bV9pbmRleChzeW1ib2wpICgoc3ltYm9sKS0+dWRhdGEuaSkKKyNkZWZpbmUgZWNvZmZfc2V0X3N5bV9pbmRleChzeW1ib2wsIGlkeCkgKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCisKKy8qIFdoZW4gZ2VuZXJhdGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgbGlua2VyIHJlbGF4ZXMgdGhlIGNvZGUKKyAgIHRvIHR1cm4gUEMgcmVsYXRpdmUgYnJhbmNoZXMgaW50byBsb25nZXIgY29kZSBzZXF1ZW5jZXMgd2hlbiB0aGUgUEMKKyAgIHJlbGF0aXZlIGJyYW5jaCBpcyBvdXQgb2YgcmFuZ2UuICBUaGlzIGludm9sdmVzIHJlYWRpbmcgdGhlIHJlbG9jcworICAgaW4gYmZkX3JlbGF4X3NlY3Rpb24gYXMgd2VsbCBhcyBpbiBiZmRfZmluYWxfbGluaywgYW5kIHJlcXVpcmVzIHRoZQorICAgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHJlbG9jcyBoYXZlIGJlZW4gZXhwYW5kZWQuICBBIHBvaW50ZXIKKyAgIHRvIHRoaXMgc3RydWN0dXJlIGlzIHB1dCBpbiB0aGUgdXNlZF9ieV9iZmQgcG9pbnRlciBvZiBhIHNlY3Rpb24gdG8KKyAgIGtlZXAgdHJhY2sgb2YgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSB1c2VyX2J5X2JmZCBwb2ludGVyIHdpbGwgYmUKKyAgIE5VTEwgaWYgdGhlIGluZm9ybWF0aW9uIHdhcyBub3QgbmVlZGVkLiAgKi8KKworc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEKK3sKKyAgLyogVGhlIHVuc3dhcHBlZCByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4gIFRoZXNlIGFyZSBzdG9yZWQgaW4KKyAgICAgbWVtb3J5IHNvIHRoZSBpbnB1dCBmaWxlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVhZCB0d2ljZS4gICovCisgIFBUUiBleHRlcm5hbF9yZWxvY3M7CisKKyAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhlc2UgYnl0ZXMgbWF5IG9yIG1heSBub3QgYmUgc2F2ZWQKKyAgICAgaW4gbWVtb3J5LCBidXQgaWYgaXQgaXMgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlbS4gICovCisgIGJmZF9ieXRlICpjb250ZW50czsKKworICAvKiBPZmZzZXQgYWRqdXN0bWVudHMgZm9yIFBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgQSBudW1iZXIgb3RoZXIgdGhhbgorICAgICAxIGlzIGFuIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5CisgICAgIHdoaWNoIGlzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAudGV4dCBsb2NhdGlvbnM7IHRoaXMgYWRkZW5kCisgICAgIGFyaXNlcyBiZWNhdXNlIHRoZSBicmFuY2ggb3IgZGlmZmVyZW5jZSBjcm9zc2VzIG9uZSBvciBtb3JlCisgICAgIGJyYW5jaGVzIHdoaWNoIHdlcmUgZXhwYW5kZWQgaW50byBhIGxhcmdlciBjb2RlIHNlcXVlbmNlLiAgQSAxCisgICAgIG1lYW5zIHRoYXQgdGhpcyBicmFuY2ggd2FzIGl0c2VsZiBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUKKyAgICAgc2VxdWVuY2UuICAxIGlzIG5vdCBhIHBvc3NpYmxlIG9mZnNldCwgc2luY2UgYWxsIG9mZnNldHMgbXVzdCBiZQorICAgICBtdWx0aXBsZXMgb2YgdGhlIGluc3RydWN0aW9uIHNpemUsIHdoaWNoIGlzIDQ7IGFsc28sIHRoZSBvbmx5CisgICAgIHJlbG9jcyB3aXRoIG5vbi16ZXJvIG9mZnNldHMgd2lsbCBiZSBQQyByZWxhdGl2ZSBicmFuY2hlcyBvcgorICAgICBzd2l0Y2ggdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuICBJZiB0aGlzIGZpZWxkCisgICAgIGlzIE5VTEwsIG5vIGJyYW5jaGVzIHdlcmUgZXhwYW5kZWQgYW5kIG5vIG9mZnNldHMgYXJlIHJlcXVpcmVkLgorICAgICBPdGhlcndpc2UgdGhlcmUgYXJlIGFzIG1hbnkgZW50cmllcyBhcyB0aGVyZSBhcmUgcmVsb2NzIGluIHRoZQorICAgICBzZWN0aW9uLCBhbmQgdGhlIGVudHJ5IGZvciBhbnkgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgaXMKKyAgICAgemVyby4gICovCisgIGxvbmcgKm9mZnNldHM7CisKKyAgLyogV2hlbiBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAoaS5lLiwgZmluYWwsIG5vbi1yZWxvY2F0YWJsZSBsaW5rKQorICAgICBvbiB0aGUgQWxwaGEsIHdlIG1heSBuZWVkIHRvIHVzZSBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMKKyAgICAgdG8gc3BhbiB0aGUgZW50aXJlIC5saXRhIHNlY3Rpb24uICBJbiBlc3NlbmNlLCB3ZSBhbGxvdyBlYWNoCisgICAgIGlucHV0IC5saXRhIHNlY3Rpb24gdG8gaGF2ZSBpdHMgb3duIGdwIHZhbHVlLiAgVG8gc3VwcG9ydCB0aGlzLAorICAgICB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGdwIHZhbHVlcyB0aGF0IHdlIHBpY2tlZCBmb3IgZWFjaAorICAgICBpbnB1dCAubGl0YSBzZWN0aW9uIC4gKi8KKyAgYmZkX3ZtYSBncDsKK307CisKKy8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSBlY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCisgICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQorCisvKiBFQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KKworc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OworICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLworICBsb25nIGluZHg7CisgIC8qIEJGRCB0aGF0IGV4dCBmaWVsZCB2YWx1ZSBjYW1lIGZyb20uICAqLworICBiZmQgKmFiZmQ7CisgIC8qIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisgIEVYVFIgZXN5bTsKKyAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCisgIGNoYXIgd3JpdHRlbjsKKyAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCB3YXMgcmVmZXJyZWQgdG8gYXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KKyAgY2hhciBzbWFsbDsKK307CisKKy8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OworfTsKKworLyogTWFrZSBhbiBFQ09GRiBvYmplY3QuICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworCisvKiBSZWFkIGluIHRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7CisKKy8qIEdlbmVyaWMgRUNPRkYgQkZEIGJhY2tlbmQgdmVjdG9ycy4gICovCisKK2V4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZWNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCisjZGVmaW5lCV9iZmRfZWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2sKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKworI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorCitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAorICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKKworI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAorICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQorCisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAorICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKKworI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKKyAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisKKyNkZWZpbmUgX2JmZF9lY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKyNkZWZpbmUgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2RlZmluZSBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKKyAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2RlZmluZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKK2V4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfYXJtYXAKKyAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOworI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgorI2RlZmluZSBfYmZkX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCisgIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQorI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKKyNkZWZpbmUgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAorI2RlZmluZSBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKKworZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmFsb2NhdGlvbikpOworZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkKSk7CitleHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3ByaW50X3N5bWJvbAorICBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOworZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8KKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOworZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CisjZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hIG9mZnNldCwKKwkgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyLCBjb25zdCBjaGFyICoqZm5uYW1lX3B0ciwKKwkgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyKSk7CisjZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgX2JmZF9lY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZAorZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9jYW5vbmljYWxpemVfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKipzeW1ib2xzKSk7CisvKiBlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgZGVmaW5lZCBieSBiYWNrZW5kLiAqLworCitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2gKKyAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisKK2V4dGVybiBpbnQgX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKKy8qIGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KKy8qIGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGRlZmluZWQgYnkgYmFja2VuZC4gICovCitleHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyAgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK2V4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKworLyogSG9vayBmdW5jdGlvbnMgZm9yIHRoZSBnZW5lcmljIENPRkYgc2VjdGlvbiByZWFkaW5nIGNvZGUuICAqLworCitleHRlcm4gUFRSIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7CisjZGVmaW5lIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKKyAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQorZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOworZXh0ZXJuIGZsYWd3b3JkIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MKKyAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgaGRyLCBjb25zdCBjaGFyICpuYW1lKSk7CitleHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCisgICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLworCitleHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCisgIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKK2V4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0CisgIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKK2V4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCisgIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKK2V4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAorICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGliaHBwYS5oIGIvYmZkL2xpYmhwcGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI0MGVmCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2xpYmhwcGEuaApAQCAtMCwwICsxLDcwMCBAQAorLyogSFAgUEEtUklTQyBTT00gb2JqZWN0IGZpbGUgZm9ybWF0OiAgZGVmaW5pdGlvbnMgaW50ZXJuYWwgdG8gQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCAsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQorICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfSFBQQV9ICisjZGVmaW5lIF9IUFBBX0gKKworI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKyNkZWZpbmUgUEFfUEFHRVNJWkUgMHgxMDAwCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgSU5MSU5FCisjZW5kaWYgLyogR05VIEM/ICovCisjZW5kaWYgLyogSU5MSU5FICovCisKKyNpZiBfX0dOVUNfXyA+PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKKy8qIERlY2xhcmUgdGhlIGZ1bmN0aW9ucyB3aXRoIHRoZSB1bnVzZWQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzLiAgKi8KK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IGFzc2VtYmxlXzMgKHVuc2lnbmVkIGludCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IGFzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMTIgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICosCisJCQkJICAgIHVuc2lnbmVkIGludCAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOworc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGFzc2VtYmxlXzE3ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKKwkJCQkJIHVuc2lnbmVkIGludCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMTcgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICosCisJCQkJICAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBhc3NlbWJsZV8yMSAodW5zaWduZWQgaW50KQorICAgICBfX2F0dHJpYnV0ZSAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdm9pZCBkaXNfYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCisgICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7CitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgc2lnbl9leHRlbmQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQorICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOworc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQgb25lcyAoaW50KSBfX2F0dHJpYnV0ZSAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdm9pZCBzaWduX3VuZXh0ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCisgICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7CitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgbG93X3NpZ25fZXh0ZW5kICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKK3N0YXRpYyBJTkxJTkUgdm9pZCBsb3dfc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOworc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGhwcGFfZmllbGRfYWRqdXN0ICh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQpCisgICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7CitzdGF0aWMgSU5MSU5FIGNoYXIgYmZkX2hwcGFfaW5zbjJmbXQgKHVuc2lnbmVkIGxvbmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7CitzdGF0aWMgSU5MSU5FICB1bnNpZ25lZCBsb25nIGhwcGFfcmVidWlsZF9pbnNuIChiZmQgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkJCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpCisgICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7CisjZW5kaWYgLyogZ2NjIDIuNyBvciBoaWdoZXIgKi8KKworCisvKiBUaGUgUEEgaW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KK2VudW0gcGFfYXJjaCB7cGExMCA9IDEwLCBwYTExID0gMTEsIHBhMjAgPSAyMH07CisKKy8qIEhQIFBBLVJJU0MgcmVsb2NhdGlvbiB0eXBlcyAqLworCitlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZQorICB7CisgICAgUl9IUFBBX0ZTRUwgPSAweDAsCisgICAgUl9IUFBBX0xTU0VMID0gMHgxLAorICAgIFJfSFBQQV9SU1NFTCA9IDB4MiwKKyAgICBSX0hQUEFfTFNFTCA9IDB4MywKKyAgICBSX0hQUEFfUlNFTCA9IDB4NCwKKyAgICBSX0hQUEFfTERTRUwgPSAweDUsCisgICAgUl9IUFBBX1JEU0VMID0gMHg2LAorICAgIFJfSFBQQV9MUlNFTCA9IDB4NywKKyAgICBSX0hQUEFfUlJTRUwgPSAweDgsCisgICAgUl9IUFBBX05TRUwgID0gMHg5LAorICAgIFJfSFBQQV9OTFNFTCAgPSAweGEsCisgICAgUl9IUFBBX05MUlNFTCAgPSAweGIsCisgICAgUl9IUFBBX1BTRUwgPSAweGMsCisgICAgUl9IUFBBX0xQU0VMID0gMHhkLAorICAgIFJfSFBQQV9SUFNFTCA9IDB4ZSwKKyAgICBSX0hQUEFfVFNFTCA9IDB4ZiwKKyAgICBSX0hQUEFfTFRTRUwgPSAweDEwLAorICAgIFJfSFBQQV9SVFNFTCA9IDB4MTEKKyAgfTsKKworLyogL3Vzci9pbmNsdWRlL3JlbG9jLmggZGVmaW5lcyB0aGVzZSB0byBjb25zdGFudHMuICBXZSB3YW50IHRvIHVzZQorICAgdGhlbSBpbiBlbnVtcywgc28gI3VuZGVmIHRoZW0gYmVmb3JlIHdlIHN0YXJ0IHVzaW5nIHRoZW0uICBXZSBtaWdodAorICAgYmUgYWJsZSB0byBmaXggdGhpcyBhbm90aGVyIHdheSBieSBzaW1wbHkgbWFuYWdpbmcgbm90IHRvIGluY2x1ZGUKKyAgIC91c3IvaW5jbHVkZS9yZWxvYy5oLCBidXQgY3VycmVudGx5IEdEQiBwaWNrcyB1cCB0aGVzZSBkZWZpbmVzCisgICBzb21ld2hlcmUuICAqLworI3VuZGVmIGVfZnNlbAorI3VuZGVmIGVfbHNzZWwKKyN1bmRlZiBlX3Jzc2VsCisjdW5kZWYgZV9sc2VsCisjdW5kZWYgZV9yc2VsCisjdW5kZWYgZV9sZHNlbAorI3VuZGVmIGVfcmRzZWwKKyN1bmRlZiBlX2xyc2VsCisjdW5kZWYgZV9ycnNlbAorI3VuZGVmIGVfbnNlbAorI3VuZGVmIGVfbmxzZWwKKyN1bmRlZiBlX25scnNlbAorI3VuZGVmIGVfcHNlbAorI3VuZGVmIGVfbHBzZWwKKyN1bmRlZiBlX3Jwc2VsCisjdW5kZWYgZV90c2VsCisjdW5kZWYgZV9sdHNlbAorI3VuZGVmIGVfcnRzZWwKKyN1bmRlZiBlX29uZQorI3VuZGVmIGVfdHdvCisjdW5kZWYgZV9wY3JlbAorI3VuZGVmIGVfY29uCisjdW5kZWYgZV9wbGFiZWwKKyN1bmRlZiBlX2FicworCisvKiBmb3IgY29tcGF0aWJpbGl0eSAqLworZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0CisgIHsKKyAgICBlX2ZzZWwgPSBSX0hQUEFfRlNFTCwKKyAgICBlX2xzc2VsID0gUl9IUFBBX0xTU0VMLAorICAgIGVfcnNzZWwgPSBSX0hQUEFfUlNTRUwsCisgICAgZV9sc2VsID0gUl9IUFBBX0xTRUwsCisgICAgZV9yc2VsID0gUl9IUFBBX1JTRUwsCisgICAgZV9sZHNlbCA9IFJfSFBQQV9MRFNFTCwKKyAgICBlX3Jkc2VsID0gUl9IUFBBX1JEU0VMLAorICAgIGVfbHJzZWwgPSBSX0hQUEFfTFJTRUwsCisgICAgZV9ycnNlbCA9IFJfSFBQQV9SUlNFTCwKKyAgICBlX25zZWwgPSBSX0hQUEFfTlNFTCwKKyAgICBlX25sc2VsID0gUl9IUFBBX05MU0VMLAorICAgIGVfbmxyc2VsID0gUl9IUFBBX05MUlNFTCwKKyAgICBlX3BzZWwgPSBSX0hQUEFfUFNFTCwKKyAgICBlX2xwc2VsID0gUl9IUFBBX0xQU0VMLAorICAgIGVfcnBzZWwgPSBSX0hQUEFfUlBTRUwsCisgICAgZV90c2VsID0gUl9IUFBBX1RTRUwsCisgICAgZV9sdHNlbCA9IFJfSFBQQV9MVFNFTCwKKyAgICBlX3J0c2VsID0gUl9IUFBBX1JUU0VMCisgIH07CisKK2VudW0gaHBwYV9yZWxvY19leHByX3R5cGUKKyAgeworICAgIFJfSFBQQV9FX09ORSA9IDAsCisgICAgUl9IUFBBX0VfVFdPID0gMSwKKyAgICBSX0hQUEFfRV9QQ1JFTCA9IDIsCisgICAgUl9IUFBBX0VfQ09OID0gMywKKyAgICBSX0hQUEFfRV9QTEFCRUwgPSA3LAorICAgIFJfSFBQQV9FX0FCUyA9IDE4CisgIH07CisKKy8qIGZvciBjb21wYXRpYmlsaXR5ICovCitlbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlX2FsdAorICB7CisgICAgZV9vbmUgPSBSX0hQUEFfRV9PTkUsCisgICAgZV90d28gPSBSX0hQUEFfRV9UV08sCisgICAgZV9wY3JlbCA9IFJfSFBQQV9FX1BDUkVMLAorICAgIGVfY29uID0gUl9IUFBBX0VfQ09OLAorICAgIGVfcGxhYmVsID0gUl9IUFBBX0VfUExBQkVMLAorICAgIGVfYWJzID0gUl9IUFBBX0VfQUJTCisgIH07CisKKworLyogUmVsb2NhdGlvbnMgZm9yIGZ1bmN0aW9uIGNhbGxzIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgcGFyYW1ldGVyCisgICByZWxvY2F0aW9uIGJpdHMuICBUaGVzZSBiaXRzIGRlc2NyaWJlIGV4YWN0bHkgd2hlcmUgdGhlIGNhbGxlciBoYXMKKyAgIHBsYWNlZCB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgYW5kIHdoZXJlIGl0IGV4cGVjdHMgdG8gZmluZCBhIHJldHVybgorICAgdmFsdWUuCisKKyAgIEJvdGggRUxGIGFuZCBTT00gZW5jb2RlIHRoaXMgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBhZGRlbmQgZmllbGQKKyAgIG9mIHRoZSBjYWxsIHJlbG9jYXRpb24uICAoTm90ZSB0aGlzIGNvdWxkIGJyZWFrIHZlcnkgYmFkbHkgaWYgb25lCisgICB3YXMgdG8gbWFrZSBhIGNhbGwgbGlrZSBibCBmb28gKyAweDEyMzQ1Njc4KS4KKworICAgVGhlIGhpZ2ggb3JkZXIgMTAgYml0cyBjb250YWluIHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLAorICAgdGhlIGxvdyBvcmRlciAyMiBiaXRzIGNvbnRhaW4gdGhlIGNvbnN0YW50IG9mZnNldC4gICovCisgICAKKyNkZWZpbmUgSFBQQV9SX0FSR19SRUxPQyhhKQkoKChhKSA+PiAyMikgJiAweDNGRikKKyNkZWZpbmUgSFBQQV9SX0NPTlNUQU5UKGEpCSgoKChpbnQpKGEpKSA8PCAxMCkgPj4gMTApCisjZGVmaW5lIEhQUEFfUl9BRERFTkQocixjKQkoKChyKSA8PCAyMikgKyAoKGMpICYgMHgzRkZGRkYpKQorI2RlZmluZSBIUFBBX1dJREUgICAgICAgICAgICAgICAoMCkgLyogUFNXIFctYml0LCBuZWVkIHRvIGNoZWNrISBGSVhNRSAqLworCisvKiBUaGVzZSBtYWNyb3MgZ2V0IGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApLAorICogYnV0IG5vdGUgdGhhdCAiTUFTSyIgYXNzdW1lcyB0aGF0IHRoZSBMU0IgYml0cyBhcmUgd2hhdCdzCisgKiB3YW50ZWQuCisgKi8KKyNpZm5kZWYgR0VUX0ZJRUxECisjZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAorICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCisjZW5kaWYgIAorI2RlZmluZSBHRVRfQklUKCBYLCBXSElDSCApIFwKKyAgR0VUX0ZJRUxEKCBYLCBXSElDSCwgV0hJQ0ggKQorCisjZGVmaW5lIE1BU0soIFNJWkUgKSBcCisgICh+KCgtMSkgPDwgU0laRSkpCisgIAorI2RlZmluZSBDQVRFTkFURSggWCwgWFNJWkUsIFksIFlTSVpFICkgXAorICAoKChYICYgTUFTSyggWFNJWkUgKSkgPDwgWVNJWkUpIHwgKFkgJiBNQVNLKCBZU0laRSApKSkKKworI2RlZmluZSBFTEVWRU4oIFggKSBcCisgIENBVEVOQVRFKCBHRVRfQklUKCBYLCAxMCApLCAxLCBHRVRfRklFTEQoIFgsIDAsIDkgKSwgMTApCisgIAorLyogU29tZSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBQQSBpbnN0cnVjdGlvbnMuICAqLworCisvKiBOT1RFOiB0aGVzZSB1c2UgdGhlIEhQIGNvbnZlbnRpb24gdGhhdCBmezF9IGlzIHRoZSBfbGVmdF8gbW9zdAorICogICAgICAgYml0IChNU0IpIG9mIGY7IHRoZXkgc29tZXRpbWVzIGhhdmUgdG8gaW1wb3NlIGFuIGFzc3VtcHRpb24KKyAqICAgICAgIGFib3V0IHRoZSBzaXplIG9mIGEgZmllbGQ7IGFuZCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgbW9zdAorICogICAgICAgYXJlbid0IHVzZWQuCisgKi8KKworc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCitzaWduX2V4dGVuZCAoeCwgbGVuKQorICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOworeworICByZXR1cm4gKGludCkoeCA+PiAobGVuIC0gMSkgPyAoLTEgPDwgbGVuKSB8IHggOiB4KTsKK30KKworc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKK2Fzc2VtYmxlXzMgKHgpCisgICAgIHVuc2lnbmVkIGludCB4OworeworICByZXR1cm4gKCgoeCAmIDEpIDw8IDIpIHwgKCh4ICYgNikgPj4gMSkpICYgNzsKK30KKworc3RhdGljIElOTElORSB2b2lkCitkaXNfYXNzZW1ibGVfMyAoeCwgcikKKyAgICAgdW5zaWduZWQgaW50IHg7CisgICAgIHVuc2lnbmVkIGludCAqcjsKK3sKKyAgKnIgPSAoKCh4ICYgNCkgPj4gMikgfCAoKHggJiAzKSA8PCAxKSkgJiA3OworfQorCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCAgICAgIC8qIFBBIDIuMCAqLworYXNzZW1ibGVfNiAoeCwgeSkKKyAgICAgdW5zaWduZWQgaW50IHgsIHk7Cit7CisgIHJldHVybiAoKCh4ICYgMHgxKSA8PCA1KSArICgzMiAtICh5ICYgMHgxZikpKTsKK30KKworc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKK2Fzc2VtYmxlXzEyICh4LCB5KQorICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKK3sKKyAgcmV0dXJuIENBVEVOQVRFKCBDQVRFTkFURSggeSwgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0JJVCggeCwgMTAgKSwgMSksIDIsCisgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEKCB4LCAwLCA5ICksICAgICAgICAgICA5KTsKK30KKworc3RhdGljIElOTElORSB2b2lkCitkaXNfYXNzZW1ibGVfMTIgKGFzMTIsIHgsIHkpCisgICAgIHVuc2lnbmVkIGludCBhczEyOworICAgICB1bnNpZ25lZCBpbnQgKngsICp5OworeworICAqeSA9IChhczEyICYgMHg4MDApID4+IDExOworICAqeCA9ICgoYXMxMiAmIDB4M2ZmKSA8PCAxKSB8ICgoYXMxMiAmIDB4NDAwKSA+PiAxMCk7Cit9CisKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyAgICAgLyogUEEgMi4wICovCithc3NlbWJsZV8xNiAoeCwgeSkKKyAgICAgdW5zaWduZWQgaW50IHgsIHk7Cit7CisgIC8qIERlcGVuZHMgb24gUFNXIFctYml0ICEqLworICB1bnNpZ25lZCBpbnQgdGVtcDsKKworICBpZiggSFBQQV9XSURFICkgeworICAgICAgdGVtcCA9IENBVEVOQVRFKCBDQVRFTkFURSggR0VUX0JJVCggeSwgMTMgKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRVRfQklUKCB5LCAxMyApXkdFVF9CSVQoIHgsIDApKSwgMSApLCAyLAorICAgICAgICAgICAgICAgICAgICAgICBDQVRFTkFURSggKEdFVF9CSVQoIHksIDEzICleR0VUX0JJVCggeCwgMSkpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEKCB5LCAwLCAxMiApLCAxMyApLCAxNCApOworICB9CisgIGVsc2UgeyAKKyAgICAgIHRlbXAgPSBDQVRFTkFURSggQ0FURU5BVEUoIEdFVF9CSVQoIHksIDEzICksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfQklUKCB5LCAxMyApLCAxICksIDIsCisgICAgICAgICAgICAgICAgICAgICAgIENBVEVOQVRFKCBHRVRfQklUKCB5LCAxMyApLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEKCB5LCAwLCAxMiApLCAxMyApLCAxNCApOworICB9CisKKyAgcmV0dXJuIHNpZ25fZXh0ZW5kKCB0ZW1wLCAxNiApOworfQorCisKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyAgICAgLyogUEEgMi4wICovCithc3NlbWJsZV8xNmEgKHgsIHksIHopCisgICAgIHVuc2lnbmVkIGludCB4LCB5LCB6OworeworICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KKyAgdW5zaWduZWQgaW50IHRlbXA7CisKKyAgaWYoIEhQUEFfV0lERSApIHsKKyAgICAgIHRlbXAgPSBDQVRFTkFURSggQ0FURU5BVEUoIHosICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoel5HRVRfQklUKCB4LCAwICkpLCAxKSwgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgQ0FURU5BVEUoICh6XkdFVF9CSVQoIHgsIDEgKSksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCAgICAgICAgICAgICAgICAgICAxMSksIDEyKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHRlbXAgPSBDQVRFTkFURSggQ0FURU5BVEUoIHosIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LCAxKSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0FURU5BVEUoIHosIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCAxMSksIDEyKTsKKworICB9CisKKyAgcmV0dXJuIHNpZ25fZXh0ZW5kKCAodGVtcCA8PCAyKSwgMTYgKTsKK30KKworc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCithc3NlbWJsZV8xNyAoeCwgeSwgeikKKyAgICAgdW5zaWduZWQgaW50IHgsIHksIHo7Cit7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50ICAgICAgICAgICBxOworCisgIHRlbXAgPSBDQVRFTkFURSggQ0FURU5BVEUoIHosIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHEpLCBxLAorICAgICAgICAgICAgICAgICAgIENBVEVOQVRFKCBHRVRfQklUKCB5LCAxICksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCggeSwgMCwgOSApLCAxMCksIDExKTsKKyAgCisgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK2Rpc19hc3NlbWJsZV8xNyAoYXMxNywgeCwgeSwgeikKKyAgICAgdW5zaWduZWQgaW50IGFzMTc7CisgICAgIHVuc2lnbmVkIGludCAqeCwgKnksICp6OworeworCisgICp6ID0gKGFzMTcgJiAweDEwMDAwKSA+PiAxNjsKKyAgKnggPSAoYXMxNyAmIDB4MGY4MDApID4+IDExOworICAqeSA9ICgoKGFzMTcgJiAweDAwNDAwKSA+PiAxMCkgfCAoKGFzMTcgJiAweDNmZikgPDwgMSkpICYgMHg3ZmY7Cit9CisKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZworYXNzZW1ibGVfMjEgKHgpCisgICAgIHVuc2lnbmVkIGludCB4OworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisKKyAgdGVtcCA9ICgoeCAmIDEpIDw8IDIwKSB8CisgICAgKCh4ICYgMHhmZmUpIDw8IDgpIHwKKyAgICAoKHggJiAweGMwMDApID4+IDcpIHwKKyAgICAoKHggJiAweDFmMDAwMCkgPj4gMTQpIHwKKyAgICAoKHggJiAweDAwMzAwMCkgPj4gMTIpOworICByZXR1cm4gdGVtcCAmIDB4MWZmZmZmOworfQorCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgICAgIC8qIFBBIDIuMCAqLworYXNzZW1ibGVfMjIgKGEsYixjLGQpCisgICAgIHVuc2lnbmVkIGludCBhLGIsYyxkOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIAorICB0ZW1wID0gQ0FURU5BVEUoIENBVEVOQVRFKCBkLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCA1ICksIDYsCisgICAgICAgICAgICAgICAgICAgQ0FURU5BVEUoIGIsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRVZFTiggYyApLCAxMSApLCAxNiApOworCisgIHJldHVybiBzaWduX2V4dGVuZCggdGVtcCwgMjIgKTsKK30KKworc3RhdGljIElOTElORSB2b2lkCitkaXNfYXNzZW1ibGVfMjEgKGFzMjEsIHgpCisgICAgIHVuc2lnbmVkIGludCBhczIxLCAqeDsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworCisKKyAgdGVtcCA9IChhczIxICYgMHgxMDAwMDApID4+IDIwOworICB0ZW1wIHw9IChhczIxICYgMHgwZmZlMDApID4+IDg7CisgIHRlbXAgfD0gKGFzMjEgJiAweDAwMDE4MCkgPDwgNzsKKyAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDdjKSA8PCAxNDsKKyAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDAzKSA8PCAxMjsKKyAgKnggPSB0ZW1wOworfQorCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAorb25lcyAobikKKyAgICAgaW50IG47Cit7CisgIHVuc2lnbmVkIGludCBsZW5fb25lczsKKyAgaW50IGk7CisKKyAgaSA9IDA7CisgIGxlbl9vbmVzID0gMDsKKyAgd2hpbGUgKGkgPCBuKQorICAgIHsKKyAgICAgIGxlbl9vbmVzID0gKGxlbl9vbmVzIDw8IDEpIHwgMTsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgcmV0dXJuIGxlbl9vbmVzOworfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK3NpZ25fdW5leHQgKHgsIGxlbiwgcmVzdWx0KQorICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOworICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdDsKK3sKKyAgdW5zaWduZWQgaW50IGxlbl9vbmVzOworCisgIGxlbl9vbmVzID0gb25lcyAobGVuKTsKKworICAqcmVzdWx0ID0geCAmIGxlbl9vbmVzOworfQorCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKK2xvd19zaWduX2V4dGVuZCAoeCwgbGVuKQorICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOworeworICByZXR1cm4gKGludCkoKHggJiAweDEgPyAoLTEgPDwgKGxlbiAtIDEpKSA6IDApIHwgeCA+PiAxKTsKK30KKworc3RhdGljIElOTElORSB2b2lkCitsb3dfc2lnbl91bmV4dCAoeCwgbGVuLCByZXN1bHQpCisgICAgIHVuc2lnbmVkIGludCB4LCBsZW47CisgICAgIHVuc2lnbmVkIGludCAqcmVzdWx0OworeworICB1bnNpZ25lZCBpbnQgdGVtcDsKKyAgdW5zaWduZWQgaW50IHNpZ247CisgIHVuc2lnbmVkIGludCByZXN0OworICB1bnNpZ25lZCBpbnQgb25lX2JpdF9hdF9sZW47CisgIHVuc2lnbmVkIGludCBsZW5fb25lczsKKworICBsZW5fb25lcyA9IG9uZXMgKGxlbik7CisgIG9uZV9iaXRfYXRfbGVuID0gMSA8PCAobGVuIC0gMSk7CisKKyAgc2lnbl91bmV4dCAoeCwgbGVuLCAmdGVtcCk7CisgIHNpZ24gPSB0ZW1wICYgb25lX2JpdF9hdF9sZW47CisgIHNpZ24gPj49IChsZW4gLSAxKTsKKworICByZXN0ID0gdGVtcCAmIChsZW5fb25lcyBeIG9uZV9iaXRfYXRfbGVuKTsKKyAgcmVzdCA8PD0gMTsKKworICAqcmVzdWx0ID0gcmVzdCB8IHNpZ247Cit9CisKKy8qIEhhbmRsZSBmaWVsZCBzZWxlY3RvcnMgZm9yIFBBIGluc3RydWN0aW9ucy4gICovCisKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZworaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCkKKyAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgICAgdW5zaWduZWQgbG9uZyBjb25zdGFudF92YWx1ZTsKKyAgICAgdW5zaWduZWQgc2hvcnQgcl9maWVsZDsKK3sKKyAgc3dpdGNoIChyX2ZpZWxkKQorICAgIHsKKyAgICBjYXNlIGVfZnNlbDoJCS8qIEYgIDogbm8gY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisgICAgY2FzZSBlX25zZWw6CQkvKiBOICA6IG5vIGNoYW5nZQkJICAgICAgICovCisgICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlX2xzc2VsOgkJLyogTFMgOiBpZiAoYml0IDIxKSB0aGVuIGFkZCAweDgwMAorCQkJCSAgIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cyAqLworICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7CisgICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQorCXZhbHVlICs9IDB4ODAwOworICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlX3Jzc2VsOgkJLyogUlMgOiBTaWduIGV4dGVuZCBmcm9tIGJpdCAyMSAgICAgICAgKi8KKyAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOworICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKKwl2YWx1ZSB8PSAweGZmZmZmODAwOworICAgICAgZWxzZQorCXZhbHVlICY9IDB4N2ZmOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVfbHNlbDoJCS8qIEwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCisgICAgY2FzZSBlX25sc2VsOgkJLyogTkwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCisgICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKKyAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZV9yc2VsOgkJLyogUiAgOiBTZXQgYml0cyAwLTIwIHRvIHplcm8gICAgICAgICAgKi8KKyAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOworICAgICAgdmFsdWUgPSB2YWx1ZSAmIDB4N2ZmOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGVfbGRzZWw6CQkvKiBMRCA6IEFkZCAweDgwMCwgYXJpdGhtZXRpYyBzaGlmdAorCQkJCSAgIHJpZ2h0IDExIGJpdHMgICAgICAgICAgICAgICAgICAqLworICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7CisgICAgICB2YWx1ZSArPSAweDgwMDsKKyAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZV9yZHNlbDoJCS8qIFJEIDogU2V0IGJpdHMgMC0yMCB0byBvbmUgICAgICAgICAgICovCisgICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKKyAgICAgIHZhbHVlIHw9IDB4ZmZmZmY4MDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZV9scnNlbDoJCS8qIExSIDogTCB3aXRoICJyb3VuZGVkIiBjb25zdGFudCAgICAgICovCisgICAgY2FzZSBlX25scnNlbDoJCS8qIE5MUiA6IE5MIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KKyAgICAgIHZhbHVlID0gdmFsdWUgKyAoKGNvbnN0YW50X3ZhbHVlICsgMHgxMDAwKSAmIDB4ZmZmZmUwMDApOworICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBlX3Jyc2VsOgkJLyogUlIgOiBSIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KKyAgICAgIHZhbHVlID0gdmFsdWUgKyAoKGNvbnN0YW50X3ZhbHVlICsgMHgxMDAwKSAmIDB4ZmZmZmUwMDApOworICAgICAgdmFsdWUgPSAodmFsdWUgJiAweDdmZikgKyBjb25zdGFudF92YWx1ZSAtICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIHJldHVybiB2YWx1ZTsKKworfQorCisvKiBQQS1SSVNDIE9QQ09ERVMgKi8KKyNkZWZpbmUgZ2V0X29wY29kZShpbnNuKQkoKGluc24pICYgMHhmYzAwMDAwMCkgPj4gMjYKKworLyogRklYTUU6IHRoaXMgbGlzdCBpcyBpbmNvbXBsZXRlLiAgSXQgc2hvdWxkIGFsc28gYmUgYW4gZW51bWVyYXRlZAorICAgdHlwZSByYXRoZXIgdGhhbiAjZGVmaW5lcy4gICovCisKKyNkZWZpbmUgTERPCTB4MGQKKyNkZWZpbmUgTERCCTB4MTAKKyNkZWZpbmUgTERICTB4MTEKKyNkZWZpbmUgTERXCTB4MTIKKyNkZWZpbmUgTERXTQkweDEzCisjZGVmaW5lIFNUQgkweDE4CisjZGVmaW5lIFNUSAkweDE5CisjZGVmaW5lIFNUVwkweDFhCisjZGVmaW5lIFNUV00JMHgxYgorI2RlZmluZSBDT01JQ0xSCTB4MjQKKyNkZWZpbmUgU1VCSQkweDI1CisjZGVmaW5lIFNVQklPCTB4MjUKKyNkZWZpbmUgQURESVQJMHgyYworI2RlZmluZSBBRERJVE8JMHgyYworI2RlZmluZSBBRERJCTB4MmQKKyNkZWZpbmUgQURESU8JMHgyZAorI2RlZmluZSBMRElMCTB4MDgKKyNkZWZpbmUgQURESUwJMHgwYQorCisjZGVmaW5lIE1PVkIJMHgzMgorI2RlZmluZSBNT1ZJQgkweDMzCisjZGVmaW5lIENPTUJUCTB4MjAKKyNkZWZpbmUgQ09NQkYJMHgyMgorI2RlZmluZSBDT01JQlQJMHgyMQorI2RlZmluZSBDT01JQkYJMHgyMworI2RlZmluZSBBRERCVAkweDI4CisjZGVmaW5lIEFEREJGCTB4MmEKKyNkZWZpbmUgQURESUJUCTB4MjkKKyNkZWZpbmUgQURESUJGCTB4MmIKKyNkZWZpbmUgQlZCCTB4MzAKKyNkZWZpbmUgQkIJMHgzMQorCisjZGVmaW5lIEJMCTB4M2EKKyNkZWZpbmUgQkxFCTB4MzkKKyNkZWZpbmUgQkUJMHgzOAorCisgIAorLyogR2l2ZW4gYSBtYWNoaW5lIGluc3RydWN0aW9uLCByZXR1cm4gaXRzIGZvcm1hdC4KKworICAgRklYTUU6ICBvcGNvZGVzIHdoaWNoIGRvIG5vdCBtYXAgdG8gYSBrbm93biBmb3JtYXQKKyAgIHNob3VsZCByZXR1cm4gYW4gZXJyb3Igb2Ygc29tZSBzb3J0LiAgKi8KKworc3RhdGljIElOTElORSBjaGFyCitiZmRfaHBwYV9pbnNuMmZtdCAoaW5zbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworeworICBjaGFyIGZtdCA9IC0xOworICB1bnNpZ25lZCBjaGFyIG9wID0gZ2V0X29wY29kZSAoaW5zbik7CisgIAorICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICBjYXNlIEFEREk6CisgICAgY2FzZSBBRERJVDoKKyAgICBjYXNlIFNVQkk6CisgICAgICBmbXQgPSAxMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9WQjoKKyAgICBjYXNlIE1PVklCOgorICAgIGNhc2UgQ09NQlQ6CisgICAgY2FzZSBDT01CRjoKKyAgICBjYXNlIENPTUlCVDoKKyAgICBjYXNlIENPTUlCRjoKKyAgICBjYXNlIEFEREJUOgorICAgIGNhc2UgQUREQkY6CisgICAgY2FzZSBBRERJQlQ6CisgICAgY2FzZSBBRERJQkY6CisgICAgY2FzZSBCVkI6CisgICAgY2FzZSBCQjoKKyAgICAgIGZtdCA9IDEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMRE86CisgICAgY2FzZSBMREI6CisgICAgY2FzZSBMREg6CisgICAgY2FzZSBMRFc6CisgICAgY2FzZSBMRFdNOgorICAgIGNhc2UgU1RCOgorICAgIGNhc2UgU1RIOgorICAgIGNhc2UgU1RXOgorICAgIGNhc2UgU1RXTToKKyAgICAgIGZtdCA9IDE0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBCTDoKKyAgICBjYXNlIEJFOgorICAgIGNhc2UgQkxFOgorICAgICAgZm10ID0gMTc7CisgICAgICBicmVhazsKKyAgICBjYXNlIExESUw6CisgICAgY2FzZSBBRERJTDoKKyAgICAgIGZtdCA9IDIxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZtdCA9IDMyOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gZm10OworfQorCisKKy8qIEluc2VydCBWQUxVRSBpbnRvIElOU04gdXNpbmcgUl9GT1JNQVQgdG8gZGV0ZXJtaW5lIGV4YWN0bHkgd2hhdAorICAgYml0cyB0byBjaGFuZ2UuICAqLworICAgCitzdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKK2hwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCB2YWx1ZSwgcl9mb3JtYXQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBsb25nIHJfZm9ybWF0OworeworICB1bnNpZ25lZCBsb25nIGNvbnN0X3BhcnQ7CisgIHVuc2lnbmVkIGxvbmcgcmVidWlsdF9wYXJ0OworCisgIHN3aXRjaCAocl9mb3JtYXQpCisgICAgeworICAgIGNhc2UgMTE6CisgICAgICB7CisJdW5zaWduZWQgdzEsIHc7CisKKwljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZmZmUwMDI7CisJZGlzX2Fzc2VtYmxlXzEyICh2YWx1ZSwgJncxLCAmdyk7CisJcmVidWlsdF9wYXJ0ID0gKHcxIDw8IDIpIHwgdzsKKwlyZXR1cm4gY29uc3RfcGFydCB8IHJlYnVpbHRfcGFydDsKKyAgICAgIH0KKworICAgIGNhc2UgMTI6CisgICAgICB7CisJdW5zaWduZWQgdzEsIHc7CisKKwljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZmZmUwMDI7CisJZGlzX2Fzc2VtYmxlXzEyICh2YWx1ZSwgJncxLCAmdyk7CisJcmVidWlsdF9wYXJ0ID0gKHcxIDw8IDIpIHwgdzsKKwlyZXR1cm4gY29uc3RfcGFydCB8IHJlYnVpbHRfcGFydDsKKyAgICAgIH0KKworICAgIGNhc2UgMTQ6CisgICAgICB7CisJdW5zaWduZWQgaW50IGV4dDsKKwkKKwljb25zdF9wYXJ0ID0gaW5zbiAmIDB4ZmZmZmMwMDA7CisJbG93X3NpZ25fdW5leHQgKHZhbHVlLCAxNCwgJmV4dCk7CisJcmV0dXJuIGNvbnN0X3BhcnQgfCBleHQ7CisgICAgICB9CisKKyAgICBjYXNlIDE3OgorICAgICAgeworCXVuc2lnbmVkIHcxLCB3MiwgdzsKKworCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmUwZTAwMjsKKwlkaXNfYXNzZW1ibGVfMTcgKHZhbHVlLCAmdzEsICZ3MiwgJncpOworCXJlYnVpbHRfcGFydCA9ICh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3OworCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OworICAgICAgfQorCisgICAgY2FzZSAyMToKKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgdzsKKworCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmUwMDAwMDsKKwlkaXNfYXNzZW1ibGVfMjEgKHZhbHVlLCAmdyk7CisJcmV0dXJuIGNvbnN0X3BhcnQgfCB3OworICAgICAgfQorCisgICAgY2FzZSAzMjoKKyAgICAgIGNvbnN0X3BhcnQgPSAwOworICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgcmV0dXJuIGluc247Cit9CisKKyNlbmRpZiAvKiBfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvbGliaWVlZS5oIGIvYmZkL2xpYmllZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGU4MDZlCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL2xpYmllZWUuaApAQCAtMCwwICsxLDEzMyBAQAorLyogSUVFRS02OTUgb2JqZWN0IGZpbGUgZm9ybWF0czogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIE1vc3RseSBTdGV2ZSBDaGFtYmVybGFpbidzIGZhdWx0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGluZGV4OjI0OworICBjaGFyIGxldHRlcjsKK30gaWVlZV9zeW1ib2xfaW5kZXhfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgY3QgeworICBiZmQgKnRoaXM7CisgIHN0cnVjdCBjdCAqbmV4dDsKK30gYmZkX2NoYWluX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IGllZWVfc3ltYm9sIAoreworICBhc3ltYm9sIHN5bWJvbDsKKyAgc3RydWN0IGllZWVfc3ltYm9sICpuZXh0OworCisgIHVuc2lnbmVkIGludCBpbmRleDsKK30gaWVlZV9zeW1ib2xfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBpZWVlX3JlbG9jIHsKKyAgYXJlbGVudCByZWxlbnQ7CisgIHN0cnVjdCBpZWVlX3JlbG9jICpuZXh0OworICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKKworfSBpZWVlX3JlbG9jX3R5cGU7CisKKyNkZWZpbmUgaWVlZV9zeW1ib2woeCkgKChpZWVlX3N5bWJvbF90eXBlICopKHgpKQorCit0eXBlZGVmIHN0cnVjdCBpZWVlX3Blcl9zZWN0aW9uCit7CisgIGFzZWN0aW9uICpzZWN0aW9uOworICBiZmRfYnl0ZSAqZGF0YTsKKyAgYmZkX3ZtYSBvZmZzZXQ7CisgIGJmZF92bWEgcGM7CisgIC8qIEZvciBvdXRwdXQgKi8KKyAgZmlsZV9wdHIgY3VycmVudF9wb3M7CisgIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7CisgIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7CisgIGllZWVfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOworfSBpZWVlX3Blcl9zZWN0aW9uX3R5cGU7CisKKyNkZWZpbmUgaWVlZV9wZXJfc2VjdGlvbih4KSAoKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSgoeCktPnVzZWRfYnlfYmZkKSkKKyAgCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkICBjaGFyICppbnB1dF9wOworICB1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlOworICBiZmQgKmFiZmQ7Cit9IGNvbW1vbl9oZWFkZXJfdHlwZSA7CisKK3R5cGVkZWYgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QKK3sKKyAgY29tbW9uX2hlYWRlcl90eXBlIGg7CisgIGJvb2xlYW4gcmVhZF9zeW1ib2xzOworICBib29sZWFuIHJlYWRfZGF0YTsJCisgIGZpbGVfcHRyIG91dHB1dF9jdXJzb3I7CisgIC8qIE1hcCBvZiBzZWN0aW9uIGluZGV4ZXMgdG8gc2VjdGlvbiBwdHJzICovCisgIGFzZWN0aW9uICoqc2VjdGlvbl90YWJsZTsKKyAgdW5zaWduZWQgaW50IHNlY3Rpb25fdGFibGVfc2l6ZTsKKyAgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfdHlwZSBhZDsKKyAgaWVlZV9tb2R1bGVfYmVnaW5fdHlwZSBtYjsKKyAgaWVlZV93X3ZhcmlhYmxlX3R5cGUgdzsKKyAgCisgIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OworICAKKyAgdW5zaWduZWQgaW50IG1hcF9pZHg7CisgIC8qIExpc3Qgb2YgR0xPQkFMIEVYUE9SVCBzeW1ib2xzICovCisgIGllZWVfc3ltYm9sX3R5cGUgKmV4dGVybmFsX3N5bWJvbHM7CisgIC8qIExpc3Qgb2YgVU5ERUZJTkVEIHN5bWJvbHMgKi8KKyAgaWVlZV9zeW1ib2xfdHlwZSAqZXh0ZXJuYWxfcmVmZXJlbmNlOworICAKKyAgLyogV2hlbiB0aGUgc3ltYm9scyBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCwgdGhleSBhcmUgaW4gYQorICAgICogc3BlY2lhbCBvcmRlciwgd2UgcmVtZW1iZXIgdmFyaW91cyBiYXNlcyBoZXJlLi4gKi8KKyAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXg7CisgIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfbWluX2luZGV4OworICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX2NvdW50OworICBpbnQgZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0OworICAKKyAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXg7CisgIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4OworICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50OworICBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OworICAKKworICBib29sZWFuIHN5bWJvbF90YWJsZV9mdWxsOworCisgIAorYm9vbGVhbiBkb25lX2RlYnVnOworCisKK2JmZF9jaGFpbl90eXBlICpjaGFpbl9oZWFkOworYmZkX2NoYWluX3R5cGUgKmNoYWluX3Jvb3Q7CisKK30gaWVlZV9kYXRhX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CisgIGJmZCAqYWJmZDsKK30gaWVlZV9hcl9vYnN0YWNrX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgCit7CisgIGNvbW1vbl9oZWFkZXJfdHlwZSBoOworICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWxlbWVudHM7CisgIAorICB1bnNpZ25lZCAgaW50IGVsZW1lbnRfaW5kZXggOworICB1bnNpZ25lZCBpbnQgZWxlbWVudF9jb3VudDsKKworfSBpZWVlX2FyX2RhdGFfdHlwZTsKKworI2RlZmluZSBJRUVFX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9kYXRhKQorI2RlZmluZSBJRUVFX0FSX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9hcl9kYXRhKQorCisjZGVmaW5lIHB0cihhYmZkKSAoaWVlZV9kYXRhKGFiZmQpLT5pbnB1dF9wKQpkaWZmIC0tZ2l0IGEvYmZkL2xpYm5sbS5oIGIvYmZkL2xpYm5sbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDJlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbGlibmxtLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qIEJGRCBiYWNrLWVuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVzKSBmaWxlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCTkxNX0hfCisjZGVmaW5lIF9MSUJOTE1fSF8gMQorCisjaWZkZWYgQVJDSF9TSVpFCisjICBkZWZpbmUgTkxNX0FSQ0hfU0laRSBBUkNIX1NJWkUKKyNlbmRpZgorI2luY2x1ZGUgIm5sbS9jb21tb24uaCIKKyNpbmNsdWRlICJubG0vaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJubG0vZXh0ZXJuYWwuaCIKKworLyogQSByZWxvYyBmb3IgYW4gaW1wb3J0ZWQgTkxNIHN5bWJvbC4gIE5vcm1hbCByZWxvY3MgYXJlIGFzc29jaWF0ZWQKKyAgIHdpdGggc2VjdGlvbnMsIGFuZCBpbmNsdWRlIGEgc3ltYm9sLiAgVGhlc2UgcmVsb2NzIGFyZSBhc3NvY2lhdGVkCisgICB3aXRoICh1bmRlZmluZWQpIHN5bWJvbHMsIGFuZCBpbmNsdWRlIGEgc2VjdGlvbi4gICovCisKK3N0cnVjdCBubG1fcmVsZW50Cit7CisgIC8qIFNlY3Rpb24gb2YgcmVsb2MuICAqLworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgLyogUmVsb2MgaW5mbyAoc3ltX3B0cl9wdHIgZmllbGQgc2V0IG9ubHkgd2hlbiBjYW5vbmljYWxpemVkKS4gICovCisgIGFyZWxlbnQgcmVsb2M7Cit9OworCisvKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhbiBOTE0gc3ltYm9sLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogQkZEIHN5bWJvbC4gICovCisgIGFzeW1ib2wgc3ltYm9sOworICAvKiBOdW1iZXIgb2YgcmVsb2MgZW50cmllcyBmb3IgaW1wb3J0ZWQgc3ltYm9sLiAgKi8KKyAgYmZkX3NpemVfdHlwZSByY250OworICAvKiBBcnJheSBvZiByZWxvYyBpbmZvcm1hdGlvbiBmb3IgaW1wb3J0ZWQgc3ltYm9sLiAgKi8KKyAgc3RydWN0IG5sbV9yZWxlbnQgKnJlbG9jczsKK30gbmxtTkFNRShzeW1ib2xfdHlwZSk7CisKK2V4dGVybiBib29sZWFuIG5sbV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gbmxtX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKKwkJCQkJICB1bnNpZ25lZCBsb25nKSk7CisKK2V4dGVybiB2b2lkIG5sbU5BTUUoZ2V0X3N5bWJvbF9pbmZvKQorICAgICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7CitleHRlcm4gbG9uZyBubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCisgICAgIFBBUkFNUyAoKGJmZCAqKSk7CitleHRlcm4gbG9uZyBubG1OQU1FKGdldF9zeW10YWIpCisgICAgIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7CitleHRlcm4gYXN5bWJvbCAqbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKKyAgICAgUEFSQU1TICgoYmZkICopKTsKK2V4dGVybiB2b2lkIG5sbU5BTUUocHJpbnRfc3ltYm9sKQorICAgICBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOworZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCisgICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7CitleHRlcm4gbG9uZyBubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykKKyAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpubG1OQU1FKG9iamVjdF9wKQorICAgICBQQVJBTVMgKChiZmQgKikpOworZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRShzZXRfYXJjaF9tYWNoKQorICAgICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7CitleHRlcm4gYm9vbGVhbiBubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQorICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOworZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpCisgICAgIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgorICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgbmxtX29ial90ZGF0YQoreworICAvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLworICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyCW5sbV9maXhlZF9oZHJbMV07CisgIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIJbmxtX3ZhcmlhYmxlX2hkclsxXTsKKyAgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyCW5sbV92ZXJzaW9uX2hkclsxXTsKKyAgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIJbmxtX2NvcHlyaWdodF9oZHJbMV07CisgIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIJbmxtX2V4dGVuZGVkX2hkclsxXTsKKyAgTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIJbmxtX2N1c3RvbV9oZHJbMV07CisgIE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlciBubG1fY3lnbnVzX2V4dF9oZHJbMV07CisgIC8qIEJGRCBOTE0gc3ltYm9scy4gICovCisgIG5sbU5BTUUoc3ltYm9sX3R5cGUpCQkqbmxtX3N5bWJvbHM7CisgIC8qIExvd2VzdCB0ZXh0IGFuZCBkYXRhIFZNQSB2YWx1ZXMuICAqLworICBiZmRfdm1hCQkJbmxtX3RleHRfbG93OworICBiZmRfdm1hCQkJbmxtX2RhdGFfbG93OworICAvKiBDYWNoZXMgZm9yIGRhdGEgcmVhZCBmcm9tIG9iamVjdCBmaWxlLiAgKi8KKyAgYXJlbGVudCAqCQkJbmxtX3JlbG9jX2ZpeHVwczsKKyAgYXNlY3Rpb24gKioJCQlubG1fcmVsb2NfZml4dXBfc2VjczsKKyAgLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgcG9pbnRlciwKKyAgICAgYnV0IHRoYXQgd291bGQgcmVxdWlyZSB5ZXQgYW5vdGhlciBlbnRyeSBwb2ludCB0byBpbml0aWFsaXplIHRoZQorICAgICBzdHJ1Y3R1cmUuICAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdAkvKiBBbHBoYSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KKwl7CisJICBiZmRfdm1hIGdwOwkJCS8qIEdQIHZhbHVlLiAgKi8KKwkgIGJmZF92bWEgbGl0YV9hZGRyZXNzOwkJLyogLmxpdGEgc2VjdGlvbiBhZGRyZXNzLiAgKi8KKwkgIGJmZF9zaXplX3R5cGUgbGl0YV9zaXplOwkvKiAubGl0YSBzZWN0aW9uIHNpemUuICAqLworCX0KKyAgICAgIGFscGhhX2JhY2tlbmRfZGF0YTsKKyAgICB9CisgIGJhY2tlbmRfZGF0YTsKK307CisKKyNkZWZpbmUgbmxtX3RkYXRhKGJmZCkJCQkoKGJmZCkgLT4gdGRhdGEubmxtX29ial9kYXRhKQorI2RlZmluZSBubG1fZml4ZWRfaGVhZGVyKGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZml4ZWRfaGRyKQorI2RlZmluZSBubG1fdmFyaWFibGVfaGVhZGVyKGJmZCkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV92YXJpYWJsZV9oZHIpCisjZGVmaW5lIG5sbV92ZXJzaW9uX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3ZlcnNpb25faGRyKQorI2RlZmluZSBubG1fY29weXJpZ2h0X2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY29weXJpZ2h0X2hkcikKKyNkZWZpbmUgbmxtX2V4dGVuZGVkX2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZXh0ZW5kZWRfaGRyKQorI2RlZmluZSBubG1fY3VzdG9tX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2N1c3RvbV9oZHIpCisjZGVmaW5lIG5sbV9jeWdudXNfZXh0X2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fY3lnbnVzX2V4dF9oZHIpCisjZGVmaW5lIG5sbV9nZXRfc3ltYm9scyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3N5bWJvbHMpCisjZGVmaW5lIG5sbV9zZXRfc3ltYm9scyhiZmQsIHApCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3N5bWJvbHMgPSAocCkpCisjZGVmaW5lIG5sbV9zZXRfdGV4dF9sb3coYmZkLCBpKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3RleHRfbG93ID0gKGkpKQorI2RlZmluZSBubG1fZ2V0X3RleHRfbG93KGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdGV4dF9sb3cpCisjZGVmaW5lIG5sbV9zZXRfZGF0YV9sb3coYmZkLCBpKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2RhdGFfbG93ID0gKGkpKQorI2RlZmluZSBubG1fZ2V0X2RhdGFfbG93KGJmZCkJCShubG1fdGRhdGEoYmZkKSAtPiBubG1fZGF0YV9sb3cpCisjZGVmaW5lIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyhiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fcmVsb2NfZml4dXBzKQorI2RlZmluZSBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzKGJmZCkJKG5sbV90ZGF0YShiZmQpLT5ubG1fcmVsb2NfZml4dXBfc2VjcykKKworI2RlZmluZSBubG1fYWxwaGFfYmFja2VuZF9kYXRhKGJmZCkgXAorICAoJm5sbV90ZGF0YSAoYmZkKS0+YmFja2VuZF9kYXRhLmFscGhhX2JhY2tlbmRfZGF0YSkKKworLyogVGhpcyBpcyB1c2VkIHdoZW4gd3JpdGluZyBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gKi8KKworc3RydWN0IHJlbG9jX2FuZF9zZWMKK3sKKyAgYXJlbGVudCAqcmVsOworICBhc2VjdGlvbiAqc2VjOworfTsKKworLyogV2Ugc3RvcmUgc29tZSBmdW5jdGlvbiBwb2ludGVyIGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gIFRoaXMgbGV0cworICAgZGlmZmVyZW50IE5MTSB0YXJnZXRzIHNoYXJlIG1vc3Qgb2YgdGhlIHNhbWUgY29kZSwgd2hpbGUgcHJvdmlkaW5nCisgICBzbGlnaHRseSBkaWZmZXJlbnQgY29kZSB3aGVyZSBuZWNlc3NhcnkuICAqLworCitzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YQoreworICAvKiBTaWduYXR1cmUgZm9yIHRoaXMgYmFja2VuZC4gICovCisgIGNoYXIgc2lnbmF0dXJlW05MTV9TSUdOQVRVUkVfU0laRV07CisgIC8qIFNpemUgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCisgIGJmZF9zaXplX3R5cGUgZml4ZWRfaGVhZGVyX3NpemU7CisgIC8qIFNpemUgb2Ygb3B0aW9uYWwgcHJlZml4IGZvciB0aGlzIGJhY2tlbmQuICBTb21lIGJhY2tlbmQgbWF5CisgICAgIHJlcXVpcmUgdGhpcyB0byBiZSBhIGZ1bmN0aW9uLCBidXQgc28gZmFyIGEgY29uc3RhbnQgaXMgT0suICBUaGlzCisgICAgIGlzIGZvciBhIHByZWZpeCB3aGljaCBwcmVjZWRlcyB0aGUgc3RhbmRhcmQgTkxNIGZpeGVkIGhlYWRlci4gICovCisgIGJmZF9zaXplX3R5cGUgb3B0aW9uYWxfcHJlZml4X3NpemU7CisgIC8qIEFyY2hpdGVjdHVyZS4gICovCisgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAvKiBNYWNoaW5lLiAgKi8KKyAgbG9uZyBtYWNoOworICAvKiBTb21lIE5MTSBmb3JtYXRzIGRvIG5vdCB1c2UgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLCBzbworICAgICBhbGwgdW5pbml0aWFsaXplZCBkYXRhIG11c3QgYmUgcHV0IGludG8gdGhlIHJlZ3VsYXIgZGF0YSBzZWN0aW9uCisgICAgIGluc3RlYWQuICAqLworICBib29sZWFuIG5vX3VuaW5pdGlhbGl6ZWRfZGF0YTsKKyAgLyogU29tZSBOTE0gZm9ybWF0cyBoYXZlIGEgcHJlZml4IG9uIHRoZSBmaWxlLiAgSWYgdGhpcyBmdW5jdGlvbiBpcworICAgICBub3QgTlVMTCwgaXQgd2lsbCBiZSBjYWxsZWQgYnkgbmxtX29iamVjdF9wLiAgSXQgc2hvdWxkIHJldHVybgorICAgICB0cnVlIGlmIHRoaXMgZmlsZSBjb3VsZCBtYXRjaCB0aGlzIGZvcm1hdCwgYW5kIGl0IHNob3VsZCBsZWF2ZQorICAgICB0aGUgQkZEIHN1Y2ggdGhhdCBhIGJmZF9yZWFkIHdpbGwgcGljayB1cCB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KKyAgYm9vbGVhbiAoKm5sbV9iYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOworICAvKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIE5VTEwuICBUaGlzIG11c3QKKyAgICAgd3JpdGUgb3V0IHRoZSBzYW1lIG51bWJlciBvZiBieXRlcyBhcyBpcyBpbiB0aGUgZmllbGQKKyAgICAgb3B0aW9uYWxfcHJlZml4X3NpemUuICAqLworICBib29sZWFuICgqbmxtX3dyaXRlX3ByZWZpeCkgUEFSQU1TICgoYmZkICopKTsKKyAgLyogUmVhZCBhIHJlbG9jYXRpb24gZml4dXAgZnJvbSBhYmZkLiAgVGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzCisgICAgIG1hY2hpbmUgc3BlY2lmaWMuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBzeW1ib2wgaWYgdGhpcyBpcworICAgICBhbiBpbXBvcnQsIG9yIE5VTEwgaWYgdGhpcyBpcyBhIHJlbG9jIGZpeHVwLiAgVGhpcyBmdW5jdGlvbgorICAgICBzaG91bGQgc2V0IHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgc2VjdGlvbiB3aGljaCB0aGUgcmVsb2MKKyAgICAgYmVsb25ncyBpbiwgYW5kIHRoZSBmb3VydGggYXJndW1lbnQgdG8gdGhlIHJlbG9jIGl0c2VsZjsgaXQgZG9lcworICAgICBub3QgbmVlZCB0byBmaWxsIGluIHRoZSBzeW1fcHRyX3B0ciBmaWVsZCBmb3IgYSByZWxvYyBhZ2FpbnN0IGFuCisgICAgIGltcG9ydCBzeW1ib2wuICAqLworICBib29sZWFuICgqbmxtX3JlYWRfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLAorCQkJCSAgICAgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOworICAvKiBUbyBtYWtlIG9iamNvcHkgdG8gYW4gaTM4NiBOTE0gd29yaywgdGhlIGkzODYgYmFja2VuZCBuZWVkcyBhCisgICAgIGNoYW5jZSB0byB3b3JrIG92ZXIgdGhlIHJlbG9jcy4gIFRoaXMgaXMgYSBiaXQgaWNreS4gICovCisgIGJvb2xlYW4gKCpubG1fbWFuZ2xlX3JlbG9jcykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBkYXRhLAorCQkJCQliZmRfdm1hIG9mZnNldCwKKwkJCQkJYmZkX3NpemVfdHlwZSBjb3VudCkpOworICAvKiBSZWFkIGFuIGltcG9ydCByZWNvcmQgZnJvbSBhYmZkLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGlzCisgICAgIHdlcmUgaW4gYSBtYWNoaW5lLWRlcGVuZGVudCBmb3JtYXQsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUuICovCisgIGJvb2xlYW4gKCpubG1fcmVhZF9pbXBvcnQpIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7CisgIC8qIFdyaXRlIGFuIGltcG9ydCByZWNvcmQgdG8gYWJmZC4gKi8KKyAgYm9vbGVhbiAoKm5sbV93cml0ZV9pbXBvcnQpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKKyAgLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICBUaGlzIG1heSBiZSBOVUxMLCBpbiB3aGljaAorICAgICBjYXNlIGEgZGVmYXVsdCBtZXRob2Qgd2lsbCBiZSB1c2VkLiAgKi8KKyAgYm9vbGVhbiAoKm5sbV9zZXRfcHVibGljX3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7CisgIC8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgVGhpcyBtYXkgYmUKKyAgICAgTlVMTCwgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgbWV0aG9kIHdpbGwgYmUgdXNlZC4gICovCisgIGJmZF92bWEgKCpubG1fZ2V0X3B1YmxpY19vZmZzZXQpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKKyAgLyogU3dhcCB0aGUgZml4ZWQgaGVhZGVyIGluIGFuZCBvdXQgKi8KKyAgdm9pZCAoKm5sbV9zd2FwX2ZoZHJfaW4pIFBBUkFNUyAoKGJmZCAqLAorCQkJCSAgICBQVFIsCisJCQkJICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKikpOworICB2b2lkICgqbmxtX3N3YXBfZmhkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLAorCQkJCSAgICAgc3RydWN0IG5sbV9pbnRlcm5hbF9maXhlZF9oZWFkZXIgKiwKKwkJCQkgICAgIFBUUikpOworICAvKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KKyAgYm9vbGVhbiAoKm5sbV93cml0ZV9leHRlcm5hbCkgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsCisJCQkJCSBhc3ltYm9sICosCisJCQkJCSBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7CisgIGJvb2xlYW4gKCpubG1fd3JpdGVfZXhwb3J0KSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmRfdm1hKSk7Cit9OworCisjZGVmaW5lIG5sbV9iYWNrZW5kKGJmZCkgXAorICAoKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhICopKChiZmQpIC0+IHh2ZWMgLT4gYmFja2VuZF9kYXRhKSkKKyNkZWZpbmUgbmxtX3NpZ25hdHVyZShiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gc2lnbmF0dXJlKQorI2RlZmluZSBubG1fZml4ZWRfaGVhZGVyX3NpemUoYmZkKSBcCisgIChubG1fYmFja2VuZChiZmQpIC0+IGZpeGVkX2hlYWRlcl9zaXplKQorI2RlZmluZSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUoYmZkKSBcCisgIChubG1fYmFja2VuZChiZmQpIC0+IG9wdGlvbmFsX3ByZWZpeF9zaXplKQorI2RlZmluZSBubG1fYXJjaGl0ZWN0dXJlKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBhcmNoKQorI2RlZmluZSBubG1fbWFjaGluZShiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbWFjaCkKKyNkZWZpbmUgbmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YShiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbm9fdW5pbml0aWFsaXplZF9kYXRhKQorI2RlZmluZSBubG1fYmFja2VuZF9vYmplY3RfcF9mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fYmFja2VuZF9vYmplY3RfcCkKKyNkZWZpbmUgbmxtX3dyaXRlX3ByZWZpeF9mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfcHJlZml4KQorI2RlZmluZSBubG1fcmVhZF9yZWxvY19mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fcmVhZF9yZWxvYykKKyNkZWZpbmUgbmxtX21hbmdsZV9yZWxvY3NfZnVuYyhiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX21hbmdsZV9yZWxvY3MpCisjZGVmaW5lIG5sbV9yZWFkX2ltcG9ydF9mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fcmVhZF9pbXBvcnQpCisjZGVmaW5lIG5sbV93cml0ZV9pbXBvcnRfZnVuYyhiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2ltcG9ydCkKKyNkZWZpbmUgbmxtX3NldF9wdWJsaWNfc2VjdGlvbl9mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc2V0X3B1YmxpY19zZWN0aW9uKQorI2RlZmluZSBubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyhiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX2dldF9wdWJsaWNfb2Zmc2V0KQorI2RlZmluZSBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW5fZnVuYyhiZmQpIFwKKyAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3N3YXBfZmhkcl9pbikKKyNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dF9mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fc3dhcF9maGRyX291dCkKKyNkZWZpbmUgbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMoYmZkKSBcCisgIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9leHRlcm5hbCkKKyNkZWZpbmUgbmxtX3dyaXRlX2V4cG9ydF9mdW5jKGJmZCkgXAorICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfZXhwb3J0KQorCisvKiBUaGUgTkxNIGNvZGUsIGRhdGEsIGFuZCB1bmluaXRpYWxpemVkIHNlY3Rpb25zIGhhdmUgbm8gbmFtZXMgZGVmaW5lZAorICAgaW4gdGhlIE5MTSwgYnV0IGJmZCB3YW50cyB0byBnaXZlIHRoZW0gbmFtZXMsIHNvIHVzZSB0aGUgdHJhZGl0aW9uYWwKKyAgIFVOSVggbmFtZXMuICAqLworCisjZGVmaW5lIE5MTV9DT0RFX05BTUUJCQkiLnRleHQiCisjZGVmaW5lIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUJIi5kYXRhIgorI2RlZmluZSBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUJIi5ic3MiCisKKyNlbmRpZiAvKiBfTElCTkxNX0hfICovCmRpZmYgLS1naXQgYS9iZmQvbGlib2FzeXMuaCBiL2JmZC9saWJvYXN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2VhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbGlib2FzeXMuaApAQCAtMCwwICsxLDgyIEBACisvKiBCRkQgaW50ZXJuYWwgZGVjbGFyYXRpb25zIGZvciBPYXN5cyBmaWxlIGZvcm1hdCBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgU2NyYXdsZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3N5bWJvbAoreworICBhc3ltYm9sIHN5bWJvbDsKK30gb2FzeXNfc3ltYm9sX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9vYXN5c19yZWxvYyB7CisgIGFyZWxlbnQgcmVsZW50OworICBzdHJ1Y3QgX29hc3lzX3JlbG9jICpuZXh0OworICB1bnNpZ25lZCBpbnQgc3ltYm9sOworfSBvYXN5c19yZWxvY190eXBlOworCisKKyNkZWZpbmUgb2FzeXNfc3ltYm9sKHgpICgob2FzeXNfc3ltYm9sX3R5cGUgKikoeCkpCisjZGVmaW5lIG9hc3lzX3Blcl9zZWN0aW9uKHgpICgob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqKSh4LT51c2VkX2J5X2JmZCkpCisKK3R5cGVkZWYgc3RydWN0IF9vYXN5c19wZXJfc2VjdGlvbgoreworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgYmZkX2J5dGUgKmRhdGE7CisgIGJmZF92bWEgb2Zmc2V0OworICBib29sZWFuIGhhZF92bWE7CisgIG9hc3lzX3JlbG9jX3R5cGUgKipyZWxvY190YWlsX3B0cjsKKyAgYmZkX3ZtYSBwYzsKKworCisgIGZpbGVfcHRyIGN1cnJlbnRfcG9zOworICB1bnNpZ25lZCBpbnQgY3VycmVudF9ieXRlOworICBib29sZWFuIGluaXRpYWxpemVkOworfSBvYXN5c19wZXJfc2VjdGlvbl90eXBlOworCisjZGVmaW5lIE5TRUNUSU9OUyAxMAorCit0eXBlZGVmIHN0cnVjdCBfb2FzeXNfYXJfb2JzdGFjayB7CisgIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OworICBiZmQgKmFiZmQ7Cit9IG9hc3lzX2FyX29ic3RhY2tfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBfb2FzeXNfbW9kdWxlX2luZm8geworICBmaWxlX3B0ciBwb3M7CisgIHVuc2lnbmVkIGludCBzaXplOworICBiZmQgKmFiZmQ7CisgIGNoYXIgKm5hbWU7Cit9IG9hc3lzX21vZHVsZV9pbmZvX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9vYXN5c19hcl9kYXRhIHsKKyAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kdWxlOworICB1bnNpZ25lZCBpbnQgbW9kdWxlX2NvdW50OworICB1bnNpZ25lZCBpbnQgbW9kdWxlX2luZGV4OworfSBvYXN5c19hcl9kYXRhX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9vYXN5c19kYXRhIHsKKyAgY2hhciAqc3RyaW5nczsKKyAgYXN5bWJvbCAqc3ltYm9sczsKKyAgdW5zaWduZWQgaW50IHN5bWJvbF9zdHJpbmdfbGVuZ3RoOworICBhc2VjdGlvbiAqc2VjdGlvbnNbT0FTWVNfTUFYX1NFQ19DT1VOVF07CisgIGZpbGVfcHRyIGZpcnN0X2RhdGFfcmVjb3JkOworfSBvYXN5c19kYXRhX3R5cGU7CisKKyNkZWZpbmUgT0FTWVNfREFUQShhYmZkKQkoKGFiZmQpLT50ZGF0YS5vYXN5c19vYmpfZGF0YSkKKyNkZWZpbmUgT0FTWVNfQVJfREFUQShhYmZkKQkoKGFiZmQpLT50ZGF0YS5vYXN5c19hcl9kYXRhKQorCmRpZmYgLS1naXQgYS9iZmQvbGlua2VyLmMgYi9iZmQvbGlua2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3NTE0YwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9saW5rZXIuYwpAQCAtMCwwICsxLDI4MDQgQEAKKy8qIGxpbmtlci5jIC0tIEJGRCBsaW5rZXIgcm91dGluZXMKKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAiZ2VubGluay5oIgorCisvKgorU0VDVElPTgorCUxpbmtlciBGdW5jdGlvbnMKKworQGNpbmRleCBMaW5rZXIKKwlUaGUgbGlua2VyIHVzZXMgdGhyZWUgc3BlY2lhbCBlbnRyeSBwb2ludHMgaW4gdGhlIEJGRCB0YXJnZXQKKwl2ZWN0b3IuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHdyaXRlIHNwZWNpYWwgcm91dGluZXMgZm9yCisJdGhlc2UgZW50cnkgcG9pbnRzIHdoZW4gY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kLCBzaW5jZQorCWdlbmVyaWMgdmVyc2lvbnMgYXJlIHByb3ZpZGVkLiAgSG93ZXZlciwgd3JpdGluZyB0aGVtIGNhbgorCXNwZWVkIHVwIGxpbmtpbmcgYW5kIG1ha2UgaXQgdXNlIHNpZ25pZmljYW50bHkgbGVzcyBydW50aW1lCisJbWVtb3J5LgorCisJVGhlIGZpcnN0IHJvdXRpbmUgY3JlYXRlcyBhIGhhc2ggdGFibGUgdXNlZCBieSB0aGUgb3RoZXIKKwlyb3V0aW5lcy4gIFRoZSBzZWNvbmQgcm91dGluZSBhZGRzIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0CisJZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gIFRoZSB0aGlyZCByb3V0aW5lIHRha2VzIGFsbCB0aGUKKwlvYmplY3QgZmlsZXMgYW5kIGxpbmtzIHRoZW0gdG9nZXRoZXIgdG8gY3JlYXRlIHRoZSBvdXRwdXQKKwlmaWxlLiAgVGhlc2Ugcm91dGluZXMgYXJlIGRlc2lnbmVkIHNvIHRoYXQgdGhlIGxpbmtlciBwcm9wZXIKKwlkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIHN5bWJvbHMgaW4gdGhlIG9iamVjdAorCWZpbGVzIHRoYXQgaXQgaXMgbGlua2luZy4gIFRoZSBsaW5rZXIgbWVyZWx5IGFycmFuZ2VzIHRoZQorCXNlY3Rpb25zIGFzIGRpcmVjdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBsZXRzIEJGRCBoYW5kbGUKKwl0aGUgZGV0YWlscyBvZiBzeW1ib2xzIGFuZCByZWxvY3MuCisKKwlUaGUgc2Vjb25kIHJvdXRpbmUgYW5kIHRoaXJkIHJvdXRpbmVzIGFyZSBwYXNzZWQgYSBwb2ludGVyIHRvCisJYSA8PHN0cnVjdCBiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlIChkZWZpbmVkIGluCisJPDxiZmRsaW5rLmg+Pikgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGxpbmssCisJaW5jbHVkaW5nIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAod2hpY2ggd2FzIGNyZWF0ZWQgYnkgdGhlCisJZmlyc3Qgcm91dGluZSkgYW5kIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUgbGlua2VyCisJcHJvcGVyLgorCisJVGhlIGdlbmVyaWMgbGlua2VyIHJvdXRpbmVzIGFyZSBpbiA8PGxpbmtlci5jPj4sIGFuZCB1c2UgdGhlCisJaGVhZGVyIGZpbGUgPDxnZW5saW5rLmg+Pi4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgYmFjaworCWVuZHMgd2hpY2ggaGF2ZSBpbXBsZW1lbnRlZCB2ZXJzaW9ucyBvZiB0aGVzZSByb3V0aW5lcyBhcmUKKwlhLm91dCAoaW4gPDxhb3V0eC5oPj4pIGFuZCBFQ09GRiAoaW4gPDxlY29mZi5jPj4pLiAgVGhlIGEub3V0CisJcm91dGluZXMgYXJlIHVzZWQgYXMgZXhhbXBsZXMgdGhyb3VnaG91dCB0aGlzIHNlY3Rpb24uCisKK0BtZW51CQorQCogQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZTo6CitAKiBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZTo6CitAKiBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rOjoKK0BlbmQgbWVudQorCitJTk9ERQorQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMsIExpbmtlciBGdW5jdGlvbnMKK1NVQlNFQ1RJT04KKwlDcmVhdGluZyBhIGxpbmtlciBoYXNoIHRhYmxlCisKK0BjaW5kZXggX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGluIHRhcmdldCB2ZWN0b3IKK0BjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKQorCVRoZSBsaW5rZXIgcm91dGluZXMgbXVzdCBjcmVhdGUgYSBoYXNoIHRhYmxlLCB3aGljaCBtdXN0IGJlCisJZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+PiBkZXNjcmliZWQgaW4KKwk8PGJmZGxpbmsuYz4+LiAgQHhyZWZ7SGFzaCBUYWJsZXN9IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKwljcmVhdGUgYSBkZXJpdmVkIGhhc2ggdGFibGUuICBUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB1c2luZworCXRoZSB0YXJnZXQgdmVjdG9yIG9mIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCisKKwlUaGUgPDxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGU+PiBlbnRyeSBwb2ludCBtdXN0IGFsbG9jYXRlCisJYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlc2lyZWQgaGFzaCB0YWJsZS4gIElmIHRoZQorCWJhY2sgZW5kIGRvZXMgbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUKKwlzdG9yZWQgd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgdGhlIGVudHJ5IHBvaW50IG1heQorCXNpbXBseSBjcmVhdGUgYSA8PHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlPj4uICBNb3N0IGxpa2VseSwKKwlob3dldmVyLCBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBuZWVkZWQuCisKKwlGb3IgZXhhbXBsZSwgd2l0aCBlYWNoIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHRoZSBhLm91dAorCWxpbmtlciBrZWVwcyB0aGUgaW5kZXggdGhlIHN5bWJvbCBoYXMgaW4gdGhlIGZpbmFsIG91dHB1dCBmaWxlCisJKHRoaXMgaW5kZXggbnVtYmVyIGlzIHVzZWQgc28gdGhhdCB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCisJbGluayB0aGUgc3ltYm9sIGluZGV4IHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlIGNhbiBiZSBxdWlja2x5CisJZmlsbGVkIGluIHdoZW4gY29weWluZyBvdmVyIGEgcmVsb2MpLiAgVGhlIGEub3V0IGxpbmtlciBjb2RlCisJZGVmaW5lcyB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBhIGhhc2ggdGFibGUKKwlkZXJpdmVkIGZyb20gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LiAgVGhlIGEub3V0IGxpbmtlcgorCWhhc2ggdGFibGUgaXMgY3JlYXRlZCBieSB0aGUgZnVuY3Rpb24KKwk8PE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKT4+OyBpdCBzaW1wbHkgYWxsb2NhdGVzCisJc3BhY2UgZm9yIHRoZSBoYXNoIHRhYmxlLCBpbml0aWFsaXplcyBpdCwgYW5kIHJldHVybnMgYQorCXBvaW50ZXIgdG8gaXQuCisKKwlXaGVuIHdyaXRpbmcgdGhlIGxpbmtlciByb3V0aW5lcyBmb3IgYSBuZXcgYmFjayBlbmQsIHlvdSB3aWxsCisJZ2VuZXJhbGx5IG5vdCBrbm93IGV4YWN0bHkgd2hpY2ggZmllbGRzIHdpbGwgYmUgcmVxdWlyZWQgdW50aWwKKwl5b3UgaGF2ZSBmaW5pc2hlZC4gIFlvdSBzaG91bGQgc2ltcGx5IGNyZWF0ZSBhIG5ldyBoYXNoIHRhYmxlCisJd2hpY2ggZGVmaW5lcyBubyBhZGRpdGlvbmFsIGZpZWxkcywgYW5kIHRoZW4gc2ltcGx5IGFkZCBmaWVsZHMKKwlhcyB0aGV5IGJlY29tZSBuZWNlc3NhcnkuCisKK0lOT0RFCitBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucworU1VCU0VDVElPTgorCUFkZGluZyBzeW1ib2xzIHRvIHRoZSBoYXNoIHRhYmxlCisKK0BjaW5kZXggX2JmZF9saW5rX2FkZF9zeW1ib2xzIGluIHRhcmdldCB2ZWN0b3IKK0BjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2FkZF9zeW1ib2xzKQorCVRoZSBsaW5rZXIgcHJvcGVyIHdpbGwgY2FsbCB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PgorCWVudHJ5IHBvaW50IGZvciBlYWNoIG9iamVjdCBmaWxlIG9yIGFyY2hpdmUgd2hpY2ggaXMgdG8gYmUKKwlsaW5rZWQgKHR5cGljYWxseSB0aGVzZSBhcmUgdGhlIGZpbGVzIG5hbWVkIG9uIHRoZSBjb21tYW5kCisJbGluZSwgYnV0IHNvbWUgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0KS4gIFRoZQorCWVudHJ5IHBvaW50IGlzIHJlc3BvbnNpYmxlIGZvciBleGFtaW5pbmcgdGhlIGZpbGUuICBGb3IgYW4KKwlvYmplY3QgZmlsZSwgQkZEIG11c3QgYWRkIGFueSByZWxldmFudCBzeW1ib2wgaW5mb3JtYXRpb24gdG8KKwl0aGUgaGFzaCB0YWJsZS4gIEZvciBhbiBhcmNoaXZlLCBCRkQgbXVzdCBkZXRlcm1pbmUgd2hpY2gKKwllbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgdXNlZCBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlCisJbGluay4KKworCVRoZSBhLm91dCB2ZXJzaW9uIG9mIHRoaXMgZW50cnkgcG9pbnQgaXMKKwk8PE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKT4+LgorCitAbWVudQorQCogRGlmZmVyaW5nIGZpbGUgZm9ybWF0czo6CitAKiBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlOjoKK0AqIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZTo6CitAZW5kIG1lbnUKKworSU5PREUKK0RpZmZlcmluZyBmaWxlIGZvcm1hdHMsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQorU1VCU1VCU0VDVElPTgorCURpZmZlcmluZyBmaWxlIGZvcm1hdHMKKworCU5vcm1hbGx5IGFsbCB0aGUgZmlsZXMgaW52b2x2ZWQgaW4gYSBsaW5rIHdpbGwgYmUgb2YgdGhlIHNhbWUKKwlmb3JtYXQsIGJ1dCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50CisJZm9ybWF0IG9iamVjdCBmaWxlcywgYW5kIHRoZSBiYWNrIGVuZCBtdXN0IHN1cHBvcnQgdGhhdC4gIFRoZQorCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHZpYSB0aGUgdGFyZ2V0CisJdmVjdG9yIG9mIHRoZSBmaWxlIHRvIGJlIGFkZGVkLiAgVGhpcyBoYXMgYW4gaW1wb3J0YW50CisJY29uc2VxdWVuY2U6IHRoZSBmdW5jdGlvbiBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSBoYXNoIHRhYmxlCisJaXMgdGhlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29ycmVzcG9uZGluZworCTw8X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlPj4gdmVjdG9yLiAgQWxsIHRoZQorCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gY2FuIGFzc3VtZSBhYm91dCB0aGUgaGFzaAorCXRhYmxlIGlzIHRoYXQgaXQgaXMgZGVyaXZlZCBmcm9tIDw8c3RydWN0CisJYmZkX2xpbmtfaGFzaF90YWJsZT4+LgorCisJU29tZXRpbWVzIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIG11c3Qgc3RvcmUKKwlzb21lIGluZm9ybWF0aW9uIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIGJlIHVzZWQgYnkgdGhlCisJPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbi4gIEluIHN1Y2ggYSBjYXNlIHRoZSA8PGNyZWF0b3I+PgorCWZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIG11c3QgYmUgY2hlY2tlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKwloYXNoIHRhYmxlIHdhcyBjcmVhdGVkIGJ5IGFuIG9iamVjdCBmaWxlIG9mIHRoZSBzYW1lIGZvcm1hdC4KKworCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgbXVzdCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgYQorCWhhc2ggZW50cnkgd2l0aG91dCBhbnkgZXh0cmEgaW5mb3JtYXRpb24gYWRkZWQgYnkgdGhlCisJPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbi4gIEEgaGFzaCBlbnRyeSB3aXRob3V0CisJZXh0cmEgaW5mb3JtYXRpb24gd2lsbCBhbHNvIG9jY3VyIHdoZW4gdGhlIGxpbmtlciBzY3JpcHQKKwlkaXJlY3RzIHRoZSBsaW5rZXIgdG8gY3JlYXRlIGEgc3ltYm9sLiAgTm90ZSB0aGF0LCByZWdhcmRsZXNzCisJb2YgaG93IGEgaGFzaCB0YWJsZSBlbnRyeSBpcyBhZGRlZCwgYWxsIHRoZSBmaWVsZHMgd2lsbCBiZQorCWluaXRpYWxpemVkIHRvIHNvbWUgc29ydCBvZiBudWxsIHZhbHVlIGJ5IHRoZSBoYXNoIHRhYmxlIGVudHJ5CisJaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCisKKwlTZWUgPDxlY29mZl9saW5rX2FkZF9leHRlcm5hbHM+PiBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdG8KKwljaGVjayB0aGUgPDxjcmVhdG9yPj4gZmllbGQgYmVmb3JlIHNhdmluZyBpbmZvcm1hdGlvbiAoaW4gdGhpcworCWNhc2UsIHRoZSBFQ09GRiBleHRlcm5hbCBzeW1ib2wgZGVidWdnaW5nIGluZm9ybWF0aW9uKSBpbiBhCisJaGFzaCB0YWJsZSBlbnRyeS4KKworSU5PREUKK0FkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUsIEFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSwgRGlmZmVyaW5nIGZpbGUgZm9ybWF0cywgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKK1NVQlNVQlNFQ1RJT04KKwlBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlCisKKwlXaGVuIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcGFzc2VkIGFuIG9iamVjdAorCWZpbGUsIGl0IG11c3QgYWRkIGFsbCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scyBpbiB0aGF0CisJb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICBUaGUgYWN0dWFsIHdvcmsgb2YgYWRkaW5nIHRoZQorCXN5bWJvbCB0byB0aGUgaGFzaCB0YWJsZSBpcyBub3JtYWxseSBoYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgorCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+Pi4gIFRoZQorCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZworCWFsbCB0aGUgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZSBhbmQgcGFzc2luZyB0aGUgY29ycmVjdAorCWluZm9ybWF0aW9uIHRvIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+Pi4KKworCVRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgc2hvdWxkIG5vdCB1c2UKKwk8PGJmZF9jYW5vbmljYWxpemVfc3ltdGFiPj4gdG8gcmVhZCB0aGUgc3ltYm9scy4gIFRoZSBwb2ludCBvZgorCXByb3ZpZGluZyB0aGlzIHJvdXRpbmUgaXMgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvbnZlcnRpbmcKKwl0aGUgc3ltYm9scyBpbnRvIGdlbmVyaWMgPDxhc3ltYm9sPj4gc3RydWN0dXJlcy4KKworQGZpbmRleCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAorCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+PiBoYW5kbGVzIHRoZSBkZXRhaWxzIG9mCisJY29tYmluaW5nIGNvbW1vbiBzeW1ib2xzLCB3YXJuaW5nIGFib3V0IG11bHRpcGxlIGRlZmluaXRpb25zLAorCWFuZCBzbyBmb3J0aC4gIEl0IHRha2VzIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUgc3ltYm9sIHRvCisJYWRkLCBub3RhYmx5IHN5bWJvbCBmbGFncywgYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0LiAgVGhlCisJc3ltYm9sIGZsYWdzIGluY2x1ZGUgc3VjaCB0aGluZ3MgYXMgPDxCU0ZfV0VBSz4+IG9yCisJPDxCU0ZfSU5ESVJFQ1Q+Pi4gIFRoZSBzZWN0aW9uIGlzIGEgc2VjdGlvbiBpbiB0aGUgb2JqZWN0CisJZmlsZSwgb3Igc29tZXRoaW5nIGxpa2UgPDxiZmRfdW5kX3NlY3Rpb25fcHRyPj4gZm9yIGFuIHVuZGVmaW5lZAorCXN5bWJvbCBvciA8PGJmZF9jb21fc2VjdGlvbl9wdHI+PiBmb3IgYSBjb21tb24gc3ltYm9sLgorCisJSWYgdGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBpcyBhbHNvIGdvaW5nIHRvIG5lZWQgdG8KKwlyZWFkIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24sIHRoZSA8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+CisJcm91dGluZSBzaG91bGQgc2F2ZSBpdCBzb21ld2hlcmUgYXR0YWNoZWQgdG8gdGhlIG9iamVjdCBmaWxlCisJQkZELiAgSG93ZXZlciwgdGhlIGluZm9ybWF0aW9uIHNob3VsZCBvbmx5IGJlIHNhdmVkIGlmIHRoZQorCTw8a2VlcF9tZW1vcnk+PiBmaWVsZCBvZiB0aGUgPDxpbmZvPj4gYXJndW1lbnQgaXMgdHJ1ZSwgc28KKwl0aGF0IHRoZSA8PC1uby1rZWVwLW1lbW9yeT4+IGxpbmtlciBzd2l0Y2ggaXMgZWZmZWN0aXZlLgorCisJVGhlIGEub3V0IGZ1bmN0aW9uIHdoaWNoIGFkZHMgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIGlzCisJPDxhb3V0X2xpbmtfYWRkX29iamVjdF9zeW1ib2xzPj4sIGFuZCBtb3N0IG9mIHRoZSBpbnRlcmVzdGluZworCXdvcmsgaXMgaW4gPDxhb3V0X2xpbmtfYWRkX3N5bWJvbHM+Pi4gIFRoZSBsYXR0ZXIgc2F2ZXMKKwlwb2ludGVycyB0byB0aGUgaGFzaCB0YWJsZXMgZW50cmllcyBjcmVhdGVkIGJ5CisJPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbD4+IGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwKKwlzbyB0aGF0IHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0byBjYWxsCisJdGhlIGhhc2ggdGFibGUgbG9va3VwIHJvdXRpbmUgdG8gbG9jYXRlIHRoZSBlbnRyeS4KKworSU5PREUKK0FkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSwgLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZQorU1VCU1VCU0VDVElPTgorCUFkZGluZyBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZQorCisJV2hlbiB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHBhc3NlZCBhbgorCWFyY2hpdmUsIGl0IG11c3QgbG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlCisJYXJjaGl2ZSBhbmQgZGVjaWRlIHdoaWNoIGVsZW1lbnRzIG9mIHRoZSBhcmNoaXZlIHNob3VsZCBiZQorCWluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBlbGVtZW50IGl0IG11c3QgY2FsbCB0aGUKKwk8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBsaW5rZXIgY2FsbGJhY2ssIGFuZCBpdCBtdXN0IGFkZCB0aGUKKwlzeW1ib2xzIGZyb20gdGhlIG9iamVjdCBmaWxlIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KKworQGZpbmRleCBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCisJSW4gbW9zdCBjYXNlcyB0aGUgd29yayBvZiBsb29raW5nIHRocm91Z2ggdGhlIHN5bWJvbHMgaW4gdGhlCisJYXJjaGl2ZSBzaG91bGQgYmUgZG9uZSBieSB0aGUKKwk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBmdW5jdGlvbi4gIFRoaXMKKwlmdW5jdGlvbiBidWlsZHMgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGFuZAorCWxvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgdG8gc2VlIHdoaWNoCisJZWxlbWVudHMgc2hvdWxkIGJlIGluY2x1ZGVkLgorCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IGlzIHBhc3NlZCBhIGZ1bmN0aW9uCisJdG8gY2FsbCB0byBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbiBhYm91dCBhZGRpbmcgYW4gYXJjaGl2ZQorCWVsZW1lbnQgdG8gdGhlIGxpbmsgYW5kIHRvIGRvIHRoZSBhY3R1YWwgd29yayBvZiBhZGRpbmcgdGhlCisJc3ltYm9scyB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuCisKKwlUaGUgZnVuY3Rpb24gcGFzc2VkIHRvCisJPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gbXVzdCByZWFkIHRoZQorCXN5bWJvbHMgb2YgdGhlIGFyY2hpdmUgZWxlbWVudCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIGFyY2hpdmUKKwllbGVtZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIHRoZSBlbGVtZW50IGlzIHRvCisJYmUgaW5jbHVkZWQsIHRoZSA8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBsaW5rZXIgY2FsbGJhY2sKKwlyb3V0aW5lIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGVsZW1lbnQgYXMgYW4gYXJndW1lbnQsIGFuZAorCXRoZSBlbGVtZW50cyBzeW1ib2xzIG11c3QgYmUgYWRkZWQgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlCisJanVzdCBhcyB0aG91Z2ggdGhlIGVsZW1lbnQgaGFkIGl0c2VsZiBiZWVuIHBhc3NlZCB0byB0aGUKKwk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uLgorCisJV2hlbiB0aGUgYS5vdXQgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiByZWNlaXZlcyBhbgorCWFyY2hpdmUsIGl0IGNhbGxzIDw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+CisJcGFzc2luZyA8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBhcyB0aGUgZnVuY3Rpb24KKwlhcmd1bWVudC4gPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbHMKKwk8PGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzPj4uICBJZiB0aGUgbGF0dGVyIGRlY2lkZXMgdG8gYWRkCisJdGhlIGVsZW1lbnQgKGFuIGVsZW1lbnQgaXMgb25seSBhZGRlZCBpZiBpdCBwcm92aWRlcyBhIHJlYWwsCisJbm9uLWNvbW1vbiwgZGVmaW5pdGlvbiBmb3IgYSBwcmV2aW91c2x5IHVuZGVmaW5lZCBvciBjb21tb24KKwlzeW1ib2wpIGl0IGNhbGxzIHRoZSA8PGFkZF9hcmNoaXZlX2VsZW1lbnQ+PiBjYWxsYmFjayBhbmQgdGhlbgorCTw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxzCisJPDxhb3V0X2xpbmtfYWRkX3N5bWJvbHM+PiB0byBhY3R1YWxseSBhZGQgdGhlIHN5bWJvbHMgdG8gdGhlCisJbGlua2VyIGhhc2ggdGFibGUuCisKKwlUaGUgRUNPRkYgYmFjayBlbmQgaXMgdW51c3VhbCBpbiB0aGF0IGl0IGRvZXMgbm90IG5vcm1hbGx5CisJY2FsbCA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiwgYmVjYXVzZSBFQ09GRgorCWFyY2hpdmVzIGFscmVhZHkgY29udGFpbiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBFQ09GRgorCWJhY2sgZW5kIHNlYXJjaGVzIHRoZSBhcmNoaXZlIGl0c2VsZiB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YKKwljcmVhdGluZyBhIG5ldyBoYXNoIHRhYmxlLgorCitJTk9ERQorUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgTGlua2VyIEZ1bmN0aW9ucworU1VCU0VDVElPTgorCVBlcmZvcm1pbmcgdGhlIGZpbmFsIGxpbmsKKworQGNpbmRleCBfYmZkX2xpbmtfZmluYWxfbGluayBpbiB0YXJnZXQgdmVjdG9yCitAY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfZmluYWxfbGluaykKKwlXaGVuIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlIGxpbmtlciBjYWxscworCXRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGVudHJ5IHBvaW50IG9mIHRoZSBvdXRwdXQgQkZELiAgVGhpcworCXJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZyB0aGUgZmluYWwgb3V0cHV0IGZpbGUsCisJd2hpY2ggaGFzIHNldmVyYWwgYXNwZWN0cy4gIEl0IG11c3QgcmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mCisJdGhlIGlucHV0IHNlY3Rpb25zIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBzZWN0aW9ucy4KKwlJdCBtdXN0IGJ1aWxkIGFuIG91dHB1dCBzeW1ib2wgdGFibGUgaW5jbHVkaW5nIGFueSBsb2NhbAorCXN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgZmlsZXMgYW5kIHRoZSBnbG9iYWwgc3ltYm9scyBmcm9tIHRoZQorCWhhc2ggdGFibGUuICBXaGVuIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBpdCBtdXN0CisJbW9kaWZ5IHRoZSBpbnB1dCByZWxvY3MgYW5kIHdyaXRlIHRoZW0gaW50byB0aGUgb3V0cHV0IGZpbGUuCisJVGhlcmUgbWF5IGFsc28gYmUgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbnQgd29yayB0byBiZSBkb25lLgorCisJVGhlIGxpbmtlciB3aWxsIGFsc28gY2FsbCB0aGUgPDx3cml0ZV9vYmplY3RfY29udGVudHM+PiBlbnRyeQorCXBvaW50IHdoZW4gdGhlIEJGRCBpcyBjbG9zZWQuICBUaGUgdHdvIGVudHJ5IHBvaW50cyBtdXN0IHdvcmsKKwl0b2dldGhlciBpbiBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dCBmaWxlLgorCisJVGhlIGRldGFpbHMgb2YgaG93IHRoaXMgd29ya3MgYXJlIGluZXZpdGFibHkgZGVwZW5kZW50IHVwb24KKwl0aGUgc3BlY2lmaWMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlIGEub3V0CisJPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGlzIDw8TkFNRShhb3V0LGZpbmFsX2xpbmspPj4uCisKK0BtZW51CitAKiBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyOjoKK0AqIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHM6OgorQCogV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlOjoKK0BlbmQgbWVudQorCitJTk9ERQorSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlciwgUmVsb2NhdGluZyB0aGUgc2VjdGlvbiBjb250ZW50cywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaywgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaworU1VCU1VCU0VDVElPTgorCUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIKKworCUJlZm9yZSB0aGUgbGlua2VyIGNhbGxzIHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGVudHJ5IHBvaW50LAorCWl0IHNldHMgdXAgc29tZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBmdW5jdGlvbiB0byB1c2UuCisKKwlUaGUgPDxpbnB1dF9iZmRzPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQorCXdpbGwgcG9pbnQgdG8gYSBsaXN0IG9mIGFsbCB0aGUgaW5wdXQgZmlsZXMgaW5jbHVkZWQgaW4gdGhlCisJbGluay4gIFRoZXNlIGZpbGVzIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUgPDxsaW5rX25leHQ+PiBmaWVsZAorCW9mIHRoZSA8PGJmZD4+IHN0cnVjdHVyZS4KKworCUVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBoYXZlIGEgbGlzdCBvZgorCTw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gdGhlIDw8bGlua19vcmRlcl9oZWFkPj4KKwlmaWVsZCAodGhlIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluCisJPDxiZmRsaW5rLmg+PikuICBUaGVzZSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGhvdyB0byBjcmVhdGUgdGhlCisJY29udGVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGluIHRlcm1zIG9mIHRoZSBjb250ZW50cyBvZgorCXZhcmlvdXMgaW5wdXQgc2VjdGlvbnMsIGZpbGwgY29uc3RhbnRzLCBhbmQsIGV2ZW50dWFsbHksIG90aGVyCisJdHlwZXMgb2YgaW5mb3JtYXRpb24uICBUaGV5IGFsc28gZGVzY3JpYmUgcmVsb2NzIHRoYXQgbXVzdCBiZQorCWNyZWF0ZWQgYnkgdGhlIEJGRCBiYWNrZW5kLCBidXQgZG8gbm90IGNvcnJlc3BvbmQgdG8gYW55IGlucHV0CisJZmlsZTsgdGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgLVVyLCB3aGljaCBidWlsZHMgY29uc3RydWN0b3JzCisJd2hpbGUgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZS4KKworSU5PREUKK1JlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZSwgSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlciwgUGVyZm9ybWluZyB0aGUgRmluYWwgTGluaworU1VCU1VCU0VDVElPTgorCVJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMKKworCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIHNob3VsZCBsb29rIHRocm91Z2ggdGhlCisJPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoIHNlY3Rpb24gb2YgdGhlCisJb3V0cHV0IGZpbGUuICBFYWNoIDw8bGlua19vcmRlcj4+IHN0cnVjdHVyZSBzaG91bGQgZWl0aGVyIGJlCisJaGFuZGxlZCBzcGVjaWFsbHksIG9yIGl0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uCisJPDxfYmZkX2RlZmF1bHRfbGlua19vcmRlcj4+IHdoaWNoIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nCisJKDw8X2JmZF9kZWZhdWx0X2xpbmtfb3JkZXI+PiBpcyBkZWZpbmVkIGluIDw8bGlua2VyLmM+PikuCisKKwlGb3IgZWZmaWNpZW5jeSwgYSA8PGxpbmtfb3JkZXI+PiBvZiB0eXBlCisJPDxiZmRfaW5kaXJlY3RfbGlua19vcmRlcj4+IHdob3NlIGFzc29jaWF0ZWQgc2VjdGlvbiBiZWxvbmdzCisJdG8gYSBCRkQgb2YgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvdXRwdXQgQkZEIG11c3QgYmUgaGFuZGxlZAorCXNwZWNpYWxseS4gIFRoaXMgdHlwZSBvZiA8PGxpbmtfb3JkZXI+PiBkZXNjcmliZXMgcGFydCBvZiBhbgorCW91dHB1dCBzZWN0aW9uIGluIHRlcm1zIG9mIGEgc2VjdGlvbiBiZWxvbmdpbmcgdG8gb25lIG9mIHRoZQorCWlucHV0IGZpbGVzLiAgVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24gc2hvdWxkIHJlYWQgdGhlCisJY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYW5kIGFueSBhc3NvY2lhdGVkIHJlbG9jcywgYXBwbHkgdGhlCisJcmVsb2NzIHRvIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBhbmQgd3JpdGUgb3V0IHRoZSBtb2RpZmllZAorCXNlY3Rpb24gY29udGVudHMuICBJZiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHRoZQorCXJlbG9jcyB0aGVtc2VsdmVzIG11c3QgYWxzbyBiZSBtb2RpZmllZCBhbmQgd3JpdHRlbiBvdXQuCisKK0BmaW5kZXggX2JmZF9yZWxvY2F0ZV9jb250ZW50cworQGZpbmRleCBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKKwlUaGUgZnVuY3Rpb25zIDw8X2JmZF9yZWxvY2F0ZV9jb250ZW50cz4+IGFuZAorCTw8X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlPj4gcHJvdmlkZSBzb21lIGdlbmVyYWwgc3VwcG9ydCBmb3IKKwlwZXJmb3JtaW5nIHRoZSBhY3R1YWwgcmVsb2NhdGlvbnMsIG5vdGFibHkgb3ZlcmZsb3cgY2hlY2tpbmcuCisJVGhlaXIgYXJndW1lbnRzIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbCB0aGUKKwlyZWxvY2F0aW9uIGlzIGFnYWluc3QgYW5kIGEgPDxyZWxvY19ob3d0b190eXBlPj4gYXJndW1lbnQKKwl3aGljaCBkZXNjcmliZXMgdGhlIHJlbG9jYXRpb24gdG8gcGVyZm9ybS4gIFRoZXNlIGZ1bmN0aW9ucworCWFyZSBkZWZpbmVkIGluIDw8cmVsb2MuYz4+LgorCisJVGhlIGEub3V0IGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgcmVhZGluZywgcmVsb2NhdGluZywgYW5kCisJd3JpdGluZyBzZWN0aW9uIGNvbnRlbnRzIGlzIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb24+Pi4gIFRoZQorCWFjdHVhbCByZWxvY2F0aW9uIGlzIGRvbmUgaW4gPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQ+PgorCWFuZCA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dD4+LgorCitJTk9ERQorV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlLCAsIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKK1NVQlNVQlNFQ1RJT04KKwlXcml0aW5nIHRoZSBzeW1ib2wgdGFibGUKKworCVRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIG11c3QgZ2F0aGVyIGFsbCB0aGUgc3ltYm9scworCWluIHRoZSBpbnB1dCBmaWxlcyBhbmQgd3JpdGUgdGhlbSBvdXQuICBJdCBtdXN0IGFsc28gd3JpdGUgb3V0CisJYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIFRoaXMgbXVzdCBiZQorCWNvbnRyb2xsZWQgYnkgdGhlIDw8c3RyaXA+PiBhbmQgPDxkaXNjYXJkPj4gZmllbGRzIG9mIHRoZQorCTw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZS4KKworCVRoZSBsb2NhbCBzeW1ib2xzIG9mIHRoZSBpbnB1dCBmaWxlcyB3aWxsIG5vdCBoYXZlIGJlZW4KKwllbnRlcmVkIGludG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhlIDw8X2JmZF9maW5hbF9saW5rPj4KKwlyb3V0aW5lIG11c3QgY29uc2lkZXIgZWFjaCBpbnB1dCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2xzCisJaW4gdGhlIG91dHB1dCBmaWxlLiAgSXQgbWF5IGJlIGNvbnZlbmllbnQgdG8gZG8gdGhpcyB3aGVuCisJbG9va2luZyB0aHJvdWdoIHRoZSA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzLCBvciBpdCBtYXkgYmUKKwlkb25lIGJ5IHN0ZXBwaW5nIHRocm91Z2ggdGhlIDw8aW5wdXRfYmZkcz4+IGxpc3QuCisKKwlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIG11c3QgYWxzbyB0cmF2ZXJzZSB0aGUgZ2xvYmFsCisJaGFzaCB0YWJsZSB0byBnYXRoZXIgYWxsIHRoZSBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gIEl0CisJaXMgcG9zc2libGUgdGhhdCBtb3N0IG9mIHRoZSBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scyBtYXkgYmUKKwl3cml0dGVuIG91dCB3aGVuIGNvbnNpZGVyaW5nIHRoZSBzeW1ib2xzIG9mIGVhY2ggaW5wdXQgZmlsZSwKKwlidXQgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IHRvIHRyYXZlcnNlIHRoZSBoYXNoIHRhYmxlIHNpbmNlIHRoZQorCWxpbmtlciBzY3JpcHQgbWF5IGhhdmUgZGVmaW5lZCBzb21lIHN5bWJvbHMgdGhhdCBhcmUgbm90IGluCisJYW55IG9mIHRoZSBpbnB1dCBmaWxlcy4KKworCVRoZSA8PHN0cmlwPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQorCWNvbnRyb2xzIHdoaWNoIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0LiAgVGhlIHBvc3NpYmxlIHZhbHVlcworCWFyZSBsaXN0ZWQgaW4gPDxiZmRsaW5rLmg+Pi4gIElmIHRoZSB2YWx1ZSBpcyA8PHN0cmlwX3NvbWU+PiwKKwl0aGVuIHRoZSA8PGtlZXBfaGFzaD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PgorCXN0cnVjdHVyZSBpcyBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byBrZWVwOyBlYWNoIHN5bWJvbAorCXNob3VsZCBiZSBsb29rZWQgdXAgaW4gdGhpcyBoYXNoIHRhYmxlLCBhbmQgb25seSBzeW1ib2xzIHdoaWNoCisJYXJlIHByZXNlbnQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4KKworCUlmIHRoZSA8PHN0cmlwPj4gZmllbGQgb2YgdGhlIDw8YmZkX2xpbmtfaW5mbz4+IHN0cnVjdHVyZQorCXBlcm1pdHMgbG9jYWwgc3ltYm9scyB0byBiZSB3cml0dGVuIG91dCwgdGhlIDw8ZGlzY2FyZD4+IGZpZWxkCisJaXMgdXNlZCB0byBmdXJ0aGVyIGNvbnRyb2xzIHdoaWNoIGxvY2FsIHN5bWJvbHMgYXJlIGluY2x1ZGVkCisJaW4gdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhlIHZhbHVlIGlzIDw8ZGlzY2FyZF9sPj4sIHRoZW4gYWxsCisJbG9jYWwgc3ltYm9scyB3aGljaCBiZWdpbiB3aXRoIGEgY2VydGFpbiBwcmVmaXggYXJlIGRpc2NhcmRlZDsKKwl0aGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDw8YmZkX2lzX2xvY2FsX2xhYmVsX25hbWU+PiBlbnRyeSBwb2ludC4KKworCVRoZSBhLm91dCBiYWNrZW5kIGhhbmRsZXMgc3ltYm9scyBieSBjYWxsaW5nCisJPDxhb3V0X2xpbmtfd3JpdGVfc3ltYm9scz4+IG9uIGVhY2ggaW5wdXQgQkZEIGFuZCB0aGVuCisJdHJhdmVyc2luZyB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgd2l0aCB0aGUgZnVuY3Rpb24KKwk8PGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2w+Pi4gIEl0IGJ1aWxkcyBhIHN0cmluZyB0YWJsZQorCXdoaWxlIHdyaXRpbmcgb3V0IHRoZSBzeW1ib2xzLCB3aGljaCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQKKwlmaWxlIGF0IHRoZSBlbmQgb2YgPDxOQU1FKGFvdXQsZmluYWxfbGluayk+Pi4KKyovCisKK3N0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiBjb2xsZWN0KSk7CitzdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuIGNvbGxlY3QpKTsKK3N0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfbm9fY29sbGVjdAorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOworc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7CitzdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50CisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkLCBib29sZWFuIGNvbGxlY3QpKTsKK3N0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZF9zaXplX3R5cGUgY291bnQsIGFzeW1ib2wgKiosCisJICAgYm9vbGVhbiBjb2xsZWN0KSk7CitzdGF0aWMgYmZkICpoYXNoX2VudHJ5X2JmZCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgdm9pZCBzZXRfc3ltYm9sX2Zyb21faGFzaAorICBQQVJBTVMgKChhc3ltYm9sICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKK3N0YXRpYyBib29sZWFuIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wKKyAgUEFSQU1TICgoYmZkICosIHNpemVfdCAqcHN5bWFsbG9jLCBhc3ltYm9sICopKTsKK3N0YXRpYyBib29sZWFuIGRlZmF1bHRfZmlsbF9saW5rX29yZGVyCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CitzdGF0aWMgYm9vbGVhbiBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCisJICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJvb2xlYW4pKTsKKworLyogVGhlIGxpbmsgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBiZmRsaW5rLmguICBJdCBwcm92aWRlcworICAgYSBiYXNlIGhhc2ggdGFibGUgd2hpY2ggdGhlIGJhY2tlbmQgc3BlY2lmaWMgaGFzaCB0YWJsZXMgYXJlIGJ1aWx0CisgICB1cG9uLiAgKi8KKworLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIGxpbmsgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitfYmZkX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCisJIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7CisKKyAgaWYgKHJldCkKKyAgICB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLworICAgICAgcmV0LT50eXBlID0gYmZkX2xpbmtfaGFzaF9uZXc7CisgICAgICByZXQtPm5leHQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIEluaXRpYWxpemUgYSBsaW5rIGhhc2ggdGFibGUuICBUaGUgQkZEIGFyZ3VtZW50IGlzIHRoZSBvbmUKKyAgIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIHRhYmxlLiAgKi8KKworYm9vbGVhbgorX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCisJCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkJCWNvbnN0IGNoYXIgKikpOworeworICB0YWJsZS0+Y3JlYXRvciA9IGFiZmQtPnh2ZWM7CisgIHRhYmxlLT51bmRlZnMgPSBOVUxMOworICB0YWJsZS0+dW5kZWZzX3RhaWwgPSBOVUxMOworICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT50YWJsZSwgbmV3ZnVuYyk7Cit9CisKKy8qIExvb2sgdXAgYSBzeW1ib2wgaW4gYSBsaW5rIGhhc2ggdGFibGUuICBJZiBmb2xsb3cgaXMgdHJ1ZSwgd2UKKyAgIGZvbGxvdyBiZmRfbGlua19oYXNoX2luZGlyZWN0IGFuZCBiZmRfbGlua19oYXNoX3dhcm5pbmcgbGlua3MgdG8KKyAgIHRoZSByZWFsIHN5bWJvbC4gICovCisKK3N0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoKK2JmZF9saW5rX2hhc2hfbG9va3VwICh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykKKyAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGJvb2xlYW4gY3JlYXRlOworICAgICBib29sZWFuIGNvcHk7CisgICAgIGJvb2xlYW4gZm9sbG93OworeworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqcmV0OworCisgIHJldCA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKKwkgYmZkX2hhc2hfbG9va3VwICgmdGFibGUtPnRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkpOworCisgIGlmIChmb2xsb3cgJiYgcmV0ICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHsKKyAgICAgIHdoaWxlIChyZXQtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAorCSAgICAgfHwgcmV0LT50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKKwlyZXQgPSByZXQtPnUuaS5saW5rOworICAgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBMb29rIHVwIGEgc3ltYm9sIGluIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIGlmIHRoZSBzeW1ib2wgbWlnaHQKKyAgIGJlIHdyYXBwZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHJlZmVyZW5jZXMgdG8gYW4KKyAgIHVuZGVmaW5lZCBzeW1ib2wsIG5vdCBmb3IgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wuICAqLworCitzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqCitiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGJvb2xlYW4gY3JlYXRlOworICAgICBib29sZWFuIGNvcHk7CisgICAgIGJvb2xlYW4gZm9sbG93OworeworICBpZiAoaW5mby0+d3JhcF9oYXNoICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbDsKKworICAgICAgbCA9IHN0cmluZzsKKyAgICAgIGlmICgqbCA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKQorCSsrbDsKKworI3VuZGVmIFdSQVAKKyNkZWZpbmUgV1JBUCAiX193cmFwXyIKKworICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+d3JhcF9oYXNoLCBsLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCisJeworCSAgY2hhciAqbjsKKwkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAvKiBUaGlzIHN5bWJvbCBpcyBiZWluZyB3cmFwcGVkLiAgV2Ugd2FudCB0byByZXBsYWNlIGFsbAorICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gU1lNIHdpdGggcmVmZXJlbmNlcyB0byBfX3dyYXBfU1lNLiAgKi8KKworCSAgbiA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobCkgKyBzaXplb2YgV1JBUCArIDEpOworCSAgaWYgKG4gPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwkgIC8qIE5vdGUgdGhhdCBzeW1ib2xfbGVhZGluZ19jaGFyIG1heSBiZSAnXDAnLiAgKi8KKwkgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOworCSAgblsxXSA9ICdcMCc7CisJICBzdHJjYXQgKG4sIFdSQVApOworCSAgc3RyY2F0IChuLCBsKTsKKwkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbiwgY3JlYXRlLCB0cnVlLCBmb2xsb3cpOworCSAgZnJlZSAobik7CisJICByZXR1cm4gaDsKKwl9CisKKyN1bmRlZiBXUkFQCisKKyN1bmRlZiBSRUFMCisjZGVmaW5lIFJFQUwgIl9fcmVhbF8iCisKKyAgICAgIGlmICgqbCA9PSAnXycKKwkgICYmIHN0cm5jbXAgKGwsIFJFQUwsIHNpemVvZiBSRUFMIC0gMSkgPT0gMAorCSAgJiYgYmZkX2hhc2hfbG9va3VwIChpbmZvLT53cmFwX2hhc2gsIGwgKyBzaXplb2YgUkVBTCAtIDEsCisJCQkgICAgICBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCisJeworCSAgY2hhciAqbjsKKwkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIF9fcmVhbF9TWU0sIHdoZXJlIFNZTSBpcyBiZWluZworICAgICAgICAgICAgIHdyYXBwZWQuICBXZSB3YW50IHRvIHJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gX19yZWFsX1NZTQorICAgICAgICAgICAgIHdpdGggcmVmZXJlbmNlcyB0byBTWU0uICAqLworCisJICBuID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChsICsgc2l6ZW9mIFJFQUwgLSAxKSArIDIpOworCSAgaWYgKG4gPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwkgIC8qIE5vdGUgdGhhdCBzeW1ib2xfbGVhZGluZ19jaGFyIG1heSBiZSAnXDAnLiAgKi8KKwkgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOworCSAgblsxXSA9ICdcMCc7CisJICBzdHJjYXQgKG4sIGwgKyBzaXplb2YgUkVBTCAtIDEpOworCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuLCBjcmVhdGUsIHRydWUsIGZvbGxvdyk7CisJICBmcmVlIChuKTsKKwkgIHJldHVybiBoOworCX0KKworI3VuZGVmIFJFQUwKKyAgICB9CisKKyAgcmV0dXJuIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KTsKK30KKworLyogVHJhdmVyc2UgYSBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5vdCBhCisgICBtYWNybyBpcyB0byBkbyBiZXR0ZXIgdHlwZSBjaGVja2luZy4gIFRoaXMgY29kZSBwcmVzdW1lcyB0aGF0IGFuCisgICBhcmd1bWVudCBwYXNzZWQgYXMgYSBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBtYXkgYmUgY2F1Z2h0IGFzIGEKKyAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogd2l0aCBubyBleHBsaWNpdCBjYXN0IHJlcXVpcmVkIG9uIHRoZQorICAgY2FsbC4gICovCisKK3ZvaWQgCitiZmRfbGlua19oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKKyAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBib29sZWFuICgqZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisgICAgIFBUUiBpbmZvOworeworICBiZmRfaGFzaF90cmF2ZXJzZSAoJnRhYmxlLT50YWJsZSwKKwkJICAgICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKSkKKwkJICAgICAgZnVuYyksCisJCSAgICAgaW5mbyk7Cit9CisKKy8qIEFkZCBhIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUgdW5kZWZzIGxpc3QuICAqLworCitJTkxJTkUgdm9pZAorYmZkX2xpbmtfYWRkX3VuZGVmICh0YWJsZSwgaCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgQkZEX0FTU0VSVCAoaC0+bmV4dCA9PSBOVUxMKTsKKyAgaWYgKHRhYmxlLT51bmRlZnNfdGFpbCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICB0YWJsZS0+dW5kZWZzX3RhaWwtPm5leHQgPSBoOworICBpZiAodGFibGUtPnVuZGVmcyA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICB0YWJsZS0+dW5kZWZzID0gaDsKKyAgdGFibGUtPnVuZGVmc190YWlsID0gaDsKK30KKwwKKy8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK19iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpyZXQgPQorICAgIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKKwkJCQkgdGFibGUsIHN0cmluZykpOworCisgIGlmIChyZXQpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPndyaXR0ZW4gPSBmYWxzZTsKKyAgICAgIHJldC0+c3ltID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBDcmVhdGUgYW4gZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSAqKQorCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOworICBpZiAoISBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAorCQkJCSAgIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgZnJlZSAocmV0KTsKKyAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKKyAgICB9CisgIHJldHVybiAmcmV0LT5yb290OworfQorCisvKiBHcmFiIHRoZSBzeW1ib2xzIGZvciBhbiBvYmplY3QgZmlsZSB3aGVuIGRvaW5nIGEgZ2VuZXJpYyBsaW5rLiAgV2UKKyAgIHN0b3JlIHRoZSBzeW1ib2xzIGluIHRoZSBvdXRzeW1ib2xzIGZpZWxkLiAgV2UgbmVlZCB0byBrZWVwIHRoZW0KKyAgIGFyb3VuZCBmb3IgdGhlIGVudGlyZSBsaW5rIHRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgcmVhZCB0aGVtIG9uY2UuCisgICBJZiB3ZSByZWFkIHRoZW0gbXVsdGlwbGUgdGltZXMsIHdlIG1pZ2h0IHdpbmQgdXAgd2l0aCByZWxvY3MgYW5kCisgICB0aGUgaGFzaCB0YWJsZSBwb2ludGluZyB0byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzeW1ib2wKKyAgIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID09IChhc3ltYm9sICoqKSBOVUxMKQorICAgIHsKKyAgICAgIGxvbmcgc3ltc2l6ZTsKKyAgICAgIGxvbmcgc3ltY291bnQ7CisKKyAgICAgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7CisgICAgICBpZiAoc3ltc2l6ZSA8IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIHN5bXNpemUpOworICAgICAgaWYgKGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPT0gTlVMTCAmJiBzeW1zaXplICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSk7CisgICAgICBpZiAoc3ltY291bnQgPCAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gc3ltY291bnQ7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyB0byBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZQorICAgZ2xvYmFsIGhhc2ggdGFibGUuICBUaGlzIHZlcnNpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBjb2xsZWN0CisgICBjb25zdHJ1Y3RvcnMgYnkgbmFtZS4gICovCisKK2Jvb2xlYW4KK19iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCBmYWxzZSk7Cit9CisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsCisgICBoYXNoIHRhYmxlLiAgVGhpcyB2ZXJzaW9uIGF1dG9tYXRpY2FsbHkgY29sbGVjdHMgY29uc3RydWN0b3JzIGJ5CisgICBuYW1lLCBhcyB0aGUgY29sbGVjdDIgcHJvZ3JhbSBkb2VzLiAgSXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFueQorICAgdGFyZ2V0IHdoaWNoIGRvZXMgbm90IHByb3ZpZGUgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIHNldHRpbmcgdXAKKyAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM7IHRoZXNlIGFyZSBhcHByb3hpbWF0ZWx5IHRob3NlIHRhcmdldHMKKyAgIGZvciB3aGljaCBnY2MgdXNlcyBjb2xsZWN0MiBhbmQgZG8gbm90IHN1cHBvcnQgc3RhYnMuICAqLworCitib29sZWFuCitfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0IChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCB0cnVlKTsKK30KKworLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBib29sZWFuIGNvbGxlY3Q7Cit7CisgIGJvb2xlYW4gcmV0OworCisgIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9vYmplY3Q6CisgICAgICByZXQgPSBnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvLCBjb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2FyY2hpdmU6CisgICAgICByZXQgPSAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworCSAgICAgKGFiZmQsIGluZm8sCisJICAgICAgKGNvbGxlY3QKKwkgICAgICAgPyBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QKKwkgICAgICAgOiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QpKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXQgPSBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYm9vbGVhbiBjb2xsZWN0OworeworICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLAorCQkJCSAgICAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpLAorCQkJCSAgICAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCksCisJCQkJICAgICAgIGNvbGxlY3QpOworfQorDAorLyogV2UgYnVpbGQgYSBoYXNoIHRhYmxlIG9mIGFsbCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gYXJjaGl2ZS4gICovCisKKy8qIEFuIGFyY2hpdmUgc3ltYm9sIG1heSBiZSBkZWZpbmVkIGJ5IG11bHRpcGxlIGFyY2hpdmUgZWxlbWVudHMuCisgICBUaGlzIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gaG9sZCB0aGUgZWxlbWVudHMuICAqLworCitzdHJ1Y3QgYXJjaGl2ZV9saXN0Cit7CisgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKm5leHQ7CisgIGludCBpbmR4OworfTsKKworLyogQW4gZW50cnkgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKKyAgLyogV2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KKyAgc3RydWN0IGFyY2hpdmVfbGlzdCAqZGVmczsKK307CisKKy8qIEFuIGFyY2hpdmUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLworCitzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlCit7CisgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmFyY2hpdmVfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBhcmNoaXZlX2hhc2hfdGFibGVfaW5pdAorICBQQVJBTVMgKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlICosCisJICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOworCisvKiBDcmVhdGUgYSBuZXcgZW50cnkgZm9yIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorYXJjaGl2ZV9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKQorCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOworCisgIGlmIChyZXQpCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KKyAgICAgIHJldC0+ZGVmcyA9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7CisgICAgfQorCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKworLyogSW5pdGlhbGl6ZSBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBuZXdmdW5jKQorICAgICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAorCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCisJCQkJCQljb25zdCBjaGFyICopKTsKK3sKKyAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIG5ld2Z1bmMpOworfQorCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgYXJjaGl2ZV9oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAorICAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgXAorICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQorCisvKiBBbGxvY2F0ZSBzcGFjZSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSh0LCBzaXplKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJih0KS0+dGFibGUsIChzaXplKSkKKworLyogRnJlZSBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGFyY2hpdmVfaGFzaF90YWJsZV9mcmVlKHQpIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCYodCktPnRhYmxlKQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIGZyb20gYW4gYXJjaGl2ZSBmaWxlIHRvIHRoZSBnbG9iYWwKKyAgIGhhc2ggZmlsZS4gIFRoaXMgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUKKyAgIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbiAodGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZQorICAgYmZkX2NoZWNrX2Zvcm1hdCBlbnRyeSBwb2ludCkuICBJdCBsb29rcyB0aHJvdWdoIHRoZSB1bmRlZmluZWQgYW5kCisgICBjb21tb24gc3ltYm9scyBhbmQgc2VhcmNoZXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGZvciB0aGVtLiAgSWYKKyAgIGl0IGZpbmRzIGFuIGVudHJ5LCBpdCBpbmNsdWRlcyB0aGUgYXNzb2NpYXRlZCBvYmplY3QgZmlsZSBpbiB0aGUKKyAgIGxpbmsuCisKKyAgIFRoZSBvbGQgbGlua2VyIGxvb2tlZCB0aHJvdWdoIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBmb3IKKyAgIHVuZGVmaW5lZCBzeW1ib2xzLiAgV2UgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQsIGxvb2tpbmcgdGhyb3VnaAorICAgdW5kZWZpbmVkIHN5bWJvbHMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGUgYXJjaGl2ZS4gIFRoZQorICAgYWR2YW50YWdlIG9mIHRoZSBuZXdlciBzY2hlbWUgaXMgdGhhdCB3ZSBvbmx5IGhhdmUgdG8gbG9vayB0aHJvdWdoCisgICB0aGUgbGlzdCBvZiB1bmRlZmluZWQgc3ltYm9scyBvbmNlLCB3aGVyZWFzIHRoZSBvbGQgbWV0aG9kIGhhZCB0bworICAgcmUtc2VhcmNoIHRoZSBzeW1ib2wgdGFibGUgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBmaWxlIHdhcyBhZGRlZC4KKworICAgVGhlIENIRUNLRk4gYXJndW1lbnQgaXMgdXNlZCB0byBzZWUgaWYgYW4gb2JqZWN0IGZpbGUgc2hvdWxkIGJlCisgICBpbmNsdWRlZC4gIENIRUNLRk4gc2hvdWxkIHNldCAqUE5FRURFRCB0byB0cnVlIGlmIHRoZSBvYmplY3QgZmlsZQorICAgc2hvdWxkIGJlIGluY2x1ZGVkLCBhbmQgbXVzdCBhbHNvIGNhbGwgdGhlIGJmZF9saW5rX2luZm8KKyAgIGFkZF9hcmNoaXZlX2VsZW1lbnQgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGhhbmRsZSBhZGRpbmcgdGhlIHN5bWJvbHMKKyAgIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIENIRUNLRk4gc2hvdWxkIG9ubHkgcmV0dXJuIGZhbHNlIGlmIHNvbWUKKyAgIHNvcnQgb2YgZXJyb3Igb2NjdXJzLgorCisgICBGb3Igc29tZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBpdCBpcyBwb3NzaWJsZSB0byBsb29rIHRocm91Z2ggYW4KKyAgIG9iamVjdCBmaWxlIGJ1dCBub3QgYWN0dWFsbHkgaW5jbHVkZSBpdCBpbiB0aGUgbGluay4gIFRoZQorICAgYXJjaGl2ZV9wYXNzIGZpZWxkIGluIGEgQkZEIGlzIHVzZWQgdG8gYXZvaWQgY2hlY2tpbmcgdGhlIHN5bWJvbHMKKyAgIG9mIGFuIG9iamVjdCBmaWxlcyB0b28gbWFueSB0aW1lcy4gIFdoZW4gYW4gb2JqZWN0IGlzIGluY2x1ZGVkIGluCisgICB0aGUgbGluaywgYXJjaGl2ZV9wYXNzIGlzIHNldCB0byAtMS4gIElmIGFuIG9iamVjdCBpcyBzY2FubmVkIGJ1dAorICAgbm90IGluY2x1ZGVkLCBhcmNoaXZlX3Bhc3MgaXMgc2V0IHRvIHRoZSBwYXNzIG51bWJlci4gIFRoZSBwYXNzCisgICBudW1iZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBmaWxlIGlzIGluY2x1ZGVkLiAgVGhlCisgICBwYXNzIG51bWJlciBpcyB1c2VkIGJlY2F1c2Ugd2hlbiBhIG5ldyBvYmplY3QgZmlsZSBpcyBpbmNsdWRlZCBpdAorICAgbWF5IGNyZWF0ZSBuZXcgdW5kZWZpbmVkIHN5bWJvbHMgd2hpY2ggY2F1c2UgYSBwcmV2aW91c2x5IGV4YW1pbmVkCisgICBvYmplY3QgZmlsZSB0byBiZSBpbmNsdWRlZC4gICovCisKK2Jvb2xlYW4KK19iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8sIGNoZWNrZm4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gKCpjaGVja2ZuKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkgYm9vbGVhbiAqcG5lZWRlZCkpOworeworICBjYXJzeW0gKmFyc3ltczsKKyAgY2Fyc3ltICphcnN5bV9lbmQ7CisgIHJlZ2lzdGVyIGNhcnN5bSAqYXJzeW07CisgIGludCBwYXNzOworICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX3RhYmxlIGFyc3ltX2hhc2g7CisgIGludCBpbmR4OworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKnB1bmRlZjsKKworICBpZiAoISBiZmRfaGFzX21hcCAoYWJmZCkpCisgICAgeworICAgICAgLyogQW4gZW1wdHkgYXJjaGl2ZSBpcyBhIHNwZWNpYWwgY2FzZS4gICovCisgICAgICBpZiAoYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKSA9PSBOVUxMKQorCXJldHVybiB0cnVlOworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2FybWFwKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYXJzeW1zID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7CisgIGFyc3ltX2VuZCA9IGFyc3ltcyArIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZfY291bnQ7CisKKyAgLyogSW4gb3JkZXIgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBhbiBzeW1ib2wgaXMgZGVmaW5lZCBpbgorICAgICB0aGlzIGFyY2hpdmUsIHdlIGJ1aWxkIGEgaGFzaCB0YWJsZSBvZiB0aGUgc3ltYm9scy4gICovCisgIGlmICghIGFyY2hpdmVfaGFzaF90YWJsZV9pbml0ICgmYXJzeW1faGFzaCwgYXJjaGl2ZV9oYXNoX25ld2Z1bmMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yIChhcnN5bSA9IGFyc3ltcywgaW5keCA9IDA7IGFyc3ltIDwgYXJzeW1fZW5kOyBhcnN5bSsrLCBpbmR4KyspCisgICAgeworICAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqYXJoOworICAgICAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbCwgKipwcDsKKworICAgICAgYXJoID0gYXJjaGl2ZV9oYXNoX2xvb2t1cCAoJmFyc3ltX2hhc2gsIGFyc3ltLT5uYW1lLCB0cnVlLCBmYWxzZSk7CisgICAgICBpZiAoYXJoID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBsID0gKChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopCisJICAgYXJjaGl2ZV9oYXNoX2FsbG9jYXRlICgmYXJzeW1faGFzaCwgc2l6ZW9mIChzdHJ1Y3QgYXJjaGl2ZV9saXN0KSkpOworICAgICAgaWYgKGwgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGwtPmluZHggPSBpbmR4OworICAgICAgZm9yIChwcCA9ICZhcmgtPmRlZnM7CisJICAgKnBwICE9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7CisJICAgcHAgPSAmKCpwcCktPm5leHQpCisJOworICAgICAgKnBwID0gbDsKKyAgICAgIGwtPm5leHQgPSBOVUxMOworICAgIH0KKworICAvKiBUaGUgYXJjaGl2ZV9wYXNzIGZpZWxkIGluIHRoZSBhcmNoaXZlIGl0c2VsZiBpcyB1c2VkIHRvCisgICAgIGluaXRpYWxpemUgUEFTUywgc2luZSB3ZSBtYXkgc2VhcmNoIHRoZSBzYW1lIGFyY2hpdmUgbXVsdGlwbGUKKyAgICAgdGltZXMuICAqLworICBwYXNzID0gYWJmZC0+YXJjaGl2ZV9wYXNzICsgMTsKKworICAvKiBOZXcgdW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIHdlCisgICAgIG9ubHkgbmVlZCB0byBsb29rIHRocm91Z2ggaXQgb25jZS4gICovCisgIHB1bmRlZiA9ICZpbmZvLT5oYXNoLT51bmRlZnM7CisgIHdoaWxlICgqcHVuZGVmICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqYXJoOworICAgICAgc3RydWN0IGFyY2hpdmVfbGlzdCAqbDsKKworICAgICAgaCA9ICpwdW5kZWY7CisKKyAgICAgIC8qIFdoZW4gYSBzeW1ib2wgaXMgZGVmaW5lZCwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbQorCSB0aGUgbGlzdC4gICovCisgICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorCSAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKKwl7CisJICAvKiBSZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LCBmb3IgZ2VuZXJhbCBjbGVhbmxpbmVzcworCSAgICAgYW5kIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBhZ2FpbgorCSAgICAgaWYgd2Ugc2VhcmNoIGFueSBtb3JlIGxpYnJhcmllcy4gIFdlIGNhbid0IHJlbW92ZSB0aGUKKwkgICAgIGVudHJ5IGlmIGl0IGlzIHRoZSB0YWlsLCBiZWNhdXNlIHRoYXQgd291bGQgbG9zZSBhbnkKKwkgICAgIGVudHJpZXMgd2UgYWRkIHRvIHRoZSBsaXN0IGxhdGVyIG9uIChpdCB3b3VsZCBhbHNvIGNhdXNlCisJICAgICB1cyB0byBsb3NlIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHN5bWJvbCBoYXMgYmVlbgorCSAgICAgcmVmZXJlbmNlZCkuICAqLworCSAgaWYgKCpwdW5kZWYgIT0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwpCisJICAgICpwdW5kZWYgPSAoKnB1bmRlZiktPm5leHQ7CisJICBlbHNlCisJICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIExvb2sgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBhcmNoaXZlIHN5bWJvbCBtYXAuICAqLworICAgICAgYXJoID0gYXJjaGl2ZV9oYXNoX2xvb2t1cCAoJmFyc3ltX2hhc2gsIGgtPnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpOworICAgICAgaWYgKGFyaCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQorCXsKKwkgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIExvb2sgYXQgYWxsIHRoZSBvYmplY3RzIHdoaWNoIGRlZmluZSB0aGlzIHN5bWJvbC4gICovCisgICAgICBmb3IgKGwgPSBhcmgtPmRlZnM7IGwgIT0gKHN0cnVjdCBhcmNoaXZlX2xpc3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCisJeworCSAgYmZkICplbGVtZW50OworCSAgYm9vbGVhbiBuZWVkZWQ7CisKKwkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGdvdHRlbiBkZWZpbmVkIGFsb25nIHRoZSB3YXksIHF1aXQuICAqLworCSAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQorCSAgICBicmVhazsKKworCSAgZWxlbWVudCA9IGJmZF9nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBsLT5pbmR4KTsKKwkgIGlmIChlbGVtZW50ID09IChiZmQgKikgTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIC8qIElmIHdlJ3ZlIGFscmVhZHkgaW5jbHVkZWQgdGhpcyBlbGVtZW50LCBvciBpZiB3ZSd2ZQorCSAgICAgYWxyZWFkeSBjaGVja2VkIGl0IG9uIHRoaXMgcGFzcywgY29udGludWUuICAqLworCSAgaWYgKGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9PSAtMQorCSAgICAgIHx8IGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9PSBwYXNzKQorCSAgICBjb250aW51ZTsKKworCSAgLyogSWYgd2UgY2FuJ3QgZmlndXJlIHRoaXMgZWxlbWVudCBvdXQsIGp1c3QgaWdub3JlIGl0LiAgKi8KKwkgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVsZW1lbnQsIGJmZF9vYmplY3QpKQorCSAgICB7CisJICAgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gLTE7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogQ0hFQ0tGTiB3aWxsIHNlZSBpZiB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIGluY2x1ZGVkLCBhbmQKKwkgICAgIGdvIGFoZWFkIGFuZCBpbmNsdWRlIGl0IGlmIGFwcHJvcHJpYXRlLiAgKi8KKwkgIGlmICghICgqY2hlY2tmbikgKGVsZW1lbnQsIGluZm8sICZuZWVkZWQpKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKCEgbmVlZGVkKQorCSAgICBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPSBwYXNzOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gLTE7CisKKwkgICAgICAvKiBJbmNyZW1lbnQgdGhlIHBhc3MgY291bnQgdG8gc2hvdyB0aGF0IHdlIG1heSBuZWVkIHRvCisJCSByZWNoZWNrIG9iamVjdCBmaWxlcyB3aGljaCB3ZXJlIGFscmVhZHkgY2hlY2tlZC4gICovCisJICAgICAgKytwYXNzOworCSAgICB9CisJfQorCisgICAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OworICAgIH0KKworICBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSAoJmFyc3ltX2hhc2gpOworCisgIC8qIFNhdmUgUEFTUyBpbiBjYXNlIHdlIGFyZSBjYWxsZWQgYWdhaW4uICAqLworICBhYmZkLT5hcmNoaXZlX3Bhc3MgPSBwYXNzOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSAoJmFyc3ltX2hhc2gpOworICByZXR1cm4gZmFsc2U7Cit9CisMCisvKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQKKyAgIHdoZW4gd2UgZG8gbm90IHdhbnQgdG8gYXV0b21hdGljYWxseSBjb2xsZWN0IGNvbnN0cnVjdG9ycyBiYXNlZCBvbgorICAgdGhlIHN5bWJvbCBuYW1lLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgaGF2ZSBzb21lIG90aGVyIG1lY2hhbmlzbQorICAgZm9yIGZpbmRpbmcgdGhlbS4gICovCisKK3N0YXRpYyBib29sZWFuCitnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QgKGFiZmQsIGluZm8sIHBuZWVkZWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gKnBuZWVkZWQ7Cit7CisgIHJldHVybiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCBmYWxzZSk7Cit9CisKKy8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBUaGlzIHZlcnNpb24gaXMgdXNlZAorICAgd2hlbiB3ZSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYmFzZWQgb24gdGhlCisgICBzeW1ib2wgbmFtZSwgYXMgY29sbGVjdDIgZG9lcy4gICovCisKK3N0YXRpYyBib29sZWFuCitnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X2NvbGxlY3QgKGFiZmQsIGluZm8sIHBuZWVkZWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gKnBuZWVkZWQ7Cit7CisgIHJldHVybiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCB0cnVlKTsKK30KKworLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIE9wdGlvbmFsbHkgY29sbGVjdAorICAgY29uc3RydWN0b3JzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2dlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQsIGNvbGxlY3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gKnBuZWVkZWQ7CisgICAgIGJvb2xlYW4gY29sbGVjdDsKK3sKKyAgYXN5bWJvbCAqKnBwLCAqKnBwZW5kOworCisgICpwbmVlZGVkID0gZmFsc2U7CisKKyAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBwID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOworICBwcGVuZCA9IHBwICsgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKTsKKyAgZm9yICg7IHBwIDwgcHBlbmQ7IHBwKyspCisgICAgeworICAgICAgYXN5bWJvbCAqcDsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICBwID0gKnBwOworCisgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4gICovCisgICAgICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHAtPnNlY3Rpb24pCisJICAmJiAocC0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9JTkRJUkVDVCB8IEJTRl9XRUFLKSkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpZiB3ZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzCisJIHN5bWJvbCwgYW5kIGl0IGlzIHVuZGVmaW5lZCBvciBjb21tb24uICBBbiB1bmRlZmluZWQgd2VhaworCSBzeW1ib2wgKHR5cGUgYmZkX2xpbmtfaGFzaF91bmRlZndlYWspIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlCisJIGEgcmVmZXJlbmNlIHdoZW4gcHVsbGluZyBmaWxlcyBvdXQgb2YgYW4gYXJjaGl2ZS4gIFNlZSB0aGUKKwkgU1ZSNCBBQkksIHAuIDQtMjcuICAqLworICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBiZmRfYXN5bWJvbF9uYW1lIChwKSwgZmFsc2UsCisJCQkJZmFsc2UsIHRydWUpOworICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgIHx8IChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikpCisJY29udGludWU7CisKKyAgICAgIC8qIFAgaXMgYSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KKworICAgICAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKSkKKwl7CisJICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OworCSAgYXN5bWJvbCAqKnN5bWJvbHM7CisKKwkgIC8qIFRoaXMgb2JqZWN0IGZpbGUgZGVmaW5lcyB0aGlzIHN5bWJvbCwgc28gcHVsbCBpdCBpbi4gICovCisJICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsCisJCQkJCQkJIGJmZF9hc3ltYm9sX25hbWUgKHApKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgc3ltY291bnQgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGFiZmQpOworCSAgc3ltYm9scyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKKwkgIGlmICghIGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sIHN5bWNvdW50LAorCQkJCQkgICAgICBzeW1ib2xzLCBjb2xsZWN0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgKnBuZWVkZWQgPSB0cnVlOworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICAvKiBQIGlzIGEgY29tbW9uIHN5bWJvbC4gICovCisKKyAgICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCXsKKwkgIGJmZCAqc3ltYmZkOworCSAgYmZkX3ZtYSBzaXplOworCSAgdW5zaWduZWQgaW50IHBvd2VyOworCisJICBzeW1iZmQgPSBoLT51LnVuZGVmLmFiZmQ7CisJICBpZiAoc3ltYmZkID09IChiZmQgKikgTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBjcmVhdGVkIGFzIHVuZGVmaW5lZCBmcm9tIG91dHNpZGUKKwkJIEJGRC4gIFdlIGFzc3VtZSB0aGF0IHdlIHNob3VsZCBsaW5rIGluIHRoZSBvYmplY3QKKwkJIGZpbGUuICBUaGlzIGlzIGZvciB0aGUgLXUgb3B0aW9uIGluIHRoZSBsaW5rZXIuICAqLworCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KQorCQkgIChpbmZvLCBhYmZkLCBiZmRfYXN5bWJvbF9uYW1lIChwKSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICAqcG5lZWRlZCA9IHRydWU7CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKworCSAgLyogVHVybiB0aGUgc3ltYm9sIGludG8gYSBjb21tb24gc3ltYm9sIGJ1dCBkbyBub3QgbGluayBpbgorCSAgICAgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyBob3cgYS5vdXQgd29ya3MuICBPYmplY3QKKwkgICAgIGZvcm1hdHMgdGhhdCByZXF1aXJlIGRpZmZlcmVudCBzZW1hbnRpY3MgbXVzdCBpbXBsZW1lbnQKKwkgICAgIHRoaXMgZnVuY3Rpb24gZGlmZmVyZW50bHkuICBUaGlzIHN5bWJvbCBpcyBhbHJlYWR5IG9uIHRoZQorCSAgICAgdW5kZWZzIGxpc3QuICBXZSBhZGQgdGhlIHNlY3Rpb24gdG8gYSBjb21tb24gc2VjdGlvbgorCSAgICAgYXR0YWNoZWQgdG8gc3ltYmZkIHRvIGVuc3VyZSB0aGF0IGl0IGlzIGluIGEgQkZEIHdoaWNoCisJICAgICB3aWxsIGJlIGxpbmtlZCBpbi4gICovCisJICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247CisJICBoLT51LmMucCA9CisJICAgICgoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5ICopCisJICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAorCQkJCXNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOworCSAgaWYgKGgtPnUuYy5wID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgc2l6ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChwKTsKKwkgIGgtPnUuYy5zaXplID0gc2l6ZTsKKworCSAgcG93ZXIgPSBiZmRfbG9nMiAoc2l6ZSk7CisJICBpZiAocG93ZXIgPiA0KQorCSAgICBwb3dlciA9IDQ7CisJICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7CisKKwkgIGlmIChwLT5zZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIpCisJICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsICJDT01NT04iKTsKKwkgIGVsc2UKKwkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN5bWJmZCwKKwkJCQkJCQkgIHAtPnNlY3Rpb24tPm5hbWUpOworCSAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wgaWYgbmVjZXNzYXJ5LiAgVGhpcworCSAgICAgaXMgaG93IGEub3V0IHdvcmtzLiAgT2JqZWN0IGZvcm1hdHMgdGhhdCByZXF1aXJlCisJICAgICBkaWZmZXJlbnQgc2VtYW50aWNzIG11c3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24KKwkgICAgIGRpZmZlcmVudGx5LiAgKi8KKwkgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAocCkgPiBoLT51LmMuc2l6ZSkKKwkgICAgaC0+dS5jLnNpemUgPSBiZmRfYXN5bWJvbF92YWx1ZSAocCk7CisJfQorICAgIH0KKworICAvKiBUaGlzIGFyY2hpdmUgZWxlbWVudCBpcyBub3QgbmVlZGVkLiAgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCB0aGUgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gIEFCRkQKKyAgIGlzIHRoZSBvYmplY3QgZmlsZS4gIElORk8gaXMgdGhlIGxpbmtlciBpbmZvcm1hdGlvbi4gIFNZTUJPTF9DT1VOVAorICAgaXMgdGhlIG51bWJlciBvZiBzeW1ib2xzLiAgU1lNQk9MUyBpcyB0aGUgbGlzdCBvZiBzeW1ib2xzLiAgQ09MTEVDVAorICAgaXMgdHJ1ZSBpZiBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY29sbGVjdGVkIGJ5IG5hbWUKKyAgIGFzIGlzIGRvbmUgYnkgY29sbGVjdDIuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywgc3ltYm9sX2NvdW50LCBzeW1ib2xzLCBjb2xsZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmRfc2l6ZV90eXBlIHN5bWJvbF9jb3VudDsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJvb2xlYW4gY29sbGVjdDsKK3sKKyAgYXN5bWJvbCAqKnBwLCAqKnBwZW5kOworCisgIHBwID0gc3ltYm9sczsKKyAgcHBlbmQgPSBzeW1ib2xzICsgc3ltYm9sX2NvdW50OworICBmb3IgKDsgcHAgPCBwcGVuZDsgcHArKykKKyAgICB7CisgICAgICBhc3ltYm9sICpwOworCisgICAgICBwID0gKnBwOworCisgICAgICBpZiAoKHAtPmZsYWdzICYgKEJTRl9JTkRJUkVDVAorCQkgICAgICAgfCBCU0ZfV0FSTklORworCQkgICAgICAgfCBCU0ZfR0xPQkFMCisJCSAgICAgICB8IEJTRl9DT05TVFJVQ1RPUgorCQkgICAgICAgfCBCU0ZfV0VBSykpICE9IDAKKwkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKKwkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKKwkgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkpCisJeworCSAgY29uc3QgY2hhciAqbmFtZTsKKwkgIGNvbnN0IGNoYXIgKnN0cmluZzsKKwkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHApOworCSAgaWYgKCgocC0+ZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpICE9IDAKKwkgICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChwLT5zZWN0aW9uKSkKKwkgICAgICAmJiBwcCArIDEgPCBwcGVuZCkKKwkgICAgeworCSAgICAgIHBwKys7CisJICAgICAgc3RyaW5nID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBwKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKHAtPmZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDAKKwkJICAgJiYgcHAgKyAxIDwgcHBlbmQpCisJICAgIHsKKwkgICAgICAvKiBUaGUgbmFtZSBvZiBQIGlzIGFjdHVhbGx5IHRoZSB3YXJuaW5nIHN0cmluZywgYW5kIHRoZQorCQkgbmV4dCBzeW1ib2wgaXMgdGhlIG9uZSB0byB3YXJuIGFib3V0LiAgKi8KKwkgICAgICBzdHJpbmcgPSBuYW1lOworCSAgICAgIHBwKys7CisJICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RyaW5nID0gTlVMTDsKKworCSAgaCA9IE5VTEw7CisJICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkJIChpbmZvLCBhYmZkLCBuYW1lLCBwLT5mbGFncywgYmZkX2dldF9zZWN0aW9uIChwKSwKKwkJICBwLT52YWx1ZSwgc3RyaW5nLCBmYWxzZSwgY29sbGVjdCwKKwkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogSWYgdGhpcyBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCwgYW5kIHRoZSBsaW5rZXIgZGlkbid0IGRvCisgICAgICAgICAgICAgYW55dGhpbmcgd2l0aCBpdCwgdGhlbiB3ZSB3YW50IHRvIGp1c3QgcGFzcyB0aGUgc3ltYm9sCisgICAgICAgICAgICAgdGhyb3VnaCB0byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIHdpbGwgaGFwcGVuIHdoZW4KKyAgICAgICAgICAgICBsaW5raW5nIHdpdGggLXIuICAqLworCSAgaWYgKChwLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAorCSAgICAgICYmIChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KSkKKwkgICAgeworCSAgICAgIHAtPnVkYXRhLnAgPSBOVUxMOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFNhdmUgdGhlIEJGRCBzeW1ib2wgc28gdGhhdCB3ZSBkb24ndCBsb3NlIGFueSBiYWNrZW5kCisJICAgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhdHRhY2hlZCB0byBpdC4gIFdlIG9ubHkKKwkgICAgIHdhbnQgdGhpcyBvbmUgaWYgaXQgZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZQorCSAgICAgZXhpc3Rpbmcgb25lOyB3ZSBkb24ndCB3YW50IHRvIHJlcGxhY2UgYSBkZWZpbmVkIHN5bWJvbAorCSAgICAgd2l0aCBhbiB1bmRlZmluZWQgb25lLiAgVGhpcyByb3V0aW5lIG1heSBiZSBjYWxsZWQgd2l0aCBhCisJICAgICBoYXNoIHRhYmxlIG90aGVyIHRoYW4gdGhlIGdlbmVyaWMgaGFzaCB0YWJsZSwgc28gd2Ugb25seQorCSAgICAgZG8gdGhpcyBpZiB3ZSBhcmUgY2VydGFpbiB0aGF0IHRoZSBoYXNoIHRhYmxlIGlzIGEKKwkgICAgIGdlbmVyaWMgb25lLiAgKi8KKwkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCisJICAgIHsKKwkgICAgICBpZiAoaC0+c3ltID09IChhc3ltYm9sICopIE5VTEwKKwkJICB8fCAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCisJCSAgICAgICYmICghIGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChwKSkKKwkJCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKGgtPnN5bSkpKSkpCisJCXsKKwkJICBoLT5zeW0gPSBwOworCQkgIC8qIEJTRl9PTERfQ09NTU9OIGlzIGEgaGFjayB0byBzdXBwb3J0IENPRkYgcmVsb2MKKwkJICAgICByZWFkaW5nLCBhbmQgaXQgc2hvdWxkIGdvIGF3YXkgd2hlbiB0aGUgQ09GRgorCQkgICAgIGxpbmtlciBpcyBzd2l0Y2hlZCB0byB0aGUgbmV3IHZlcnNpb24uICAqLworCQkgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpKQorCQkgICAgcC0+ZmxhZ3MgfD0gQlNGX09MRF9DT01NT047CisJCX0KKwkgICAgfQorCisJICAvKiBTdG9yZSBhIGJhY2sgcG9pbnRlciBmcm9tIHRoZSBzeW1ib2wgdG8gdGhlIGhhc2gKKwkgICAgIHRhYmxlIGVudHJ5IGZvciB0aGUgYmVuZWZpdCBvZiByZWxheGF0aW9uIGNvZGUgdW50aWwKKwkgICAgIGl0IGdldHMgcmV3cml0dGVuIHRvIG5vdCB1c2UgYXN5bWJvbCBzdHJ1Y3R1cmVzLgorCSAgICAgU2V0dGluZyB0aGlzIGlzIGFsc28gdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXNlCisJICAgICBzeW1ib2xzIHdlcmUgc2V0IHVwIGJ5IHRoZSBnZW5lcmljIGxpbmtlci4gICovCisJICBwLT51ZGF0YS5wID0gKFBUUikgaDsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorDAorLyogV2UgdXNlIGEgc3RhdGUgdGFibGUgdG8gZGVhbCB3aXRoIGFkZGluZyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0CisgICBmaWxlLiAgVGhlIGZpcnN0IGluZGV4IGludG8gdGhlIHN0YXRlIHRhYmxlIGRlc2NyaWJlcyB0aGUgc3ltYm9sCisgICBmcm9tIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBzZWNvbmQgaW5kZXggaW50byB0aGUgc3RhdGUgdGFibGUgaXMgdGhlCisgICB0eXBlIG9mIHRoZSBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICAqLworCisvKiBUaGUgc3ltYm9sIGZyb20gdGhlIG9iamVjdCBmaWxlIGlzIHR1cm5lZCBpbnRvIG9uZSBvZiB0aGVzZSByb3cKKyAgIHZhbHVlcy4gICovCisKK2VudW0gbGlua19yb3cKK3sKKyAgVU5ERUZfUk9XLAkJLyogVW5kZWZpbmVkLiAgKi8KKyAgVU5ERUZXX1JPVywJCS8qIFdlYWsgdW5kZWZpbmVkLiAgKi8KKyAgREVGX1JPVywJCS8qIERlZmluZWQuICAqLworICBERUZXX1JPVywJCS8qIFdlYWsgZGVmaW5lZC4gICovCisgIENPTU1PTl9ST1csCQkvKiBDb21tb24uICAqLworICBJTkRSX1JPVywJCS8qIEluZGlyZWN0LiAgKi8KKyAgV0FSTl9ST1csCQkvKiBXYXJuaW5nLiAgKi8KKyAgU0VUX1JPVwkJLyogTWVtYmVyIG9mIHNldC4gICovCit9OworCisvKiBhcHBhcmVudGx5IG5lZWRlZCBmb3IgSGl0YWNoaSAzMDUwUihISS1VWC9XRTIpPyAqLworI3VuZGVmIEZBSUwKKworLyogVGhlIGFjdGlvbnMgdG8gdGFrZSBpbiB0aGUgc3RhdGUgdGFibGUuICAqLworCitlbnVtIGxpbmtfYWN0aW9uCit7CisgIEZBSUwsCQkvKiBBYm9ydC4gKi8KKyAgVU5ELAkJLyogTWFyayBzeW1ib2wgdW5kZWZpbmVkLiAgKi8KKyAgV0VBSywJCS8qIE1hcmsgc3ltYm9sIHdlYWsgdW5kZWZpbmVkLiAgKi8KKyAgREVGLAkJLyogTWFyayBzeW1ib2wgZGVmaW5lZC4gICovCisgIERFRlcsCQkvKiBNYXJrIHN5bWJvbCB3ZWFrIGRlZmluZWQuICAqLworICBDT00sCQkvKiBNYXJrIHN5bWJvbCBjb21tb24uICAqLworICBSRUYsCQkvKiBNYXJrIGRlZmluZWQgc3ltYm9sIHJlZmVyZW5jZWQuICAqLworICBDUkVGLAkJLyogUG9zc2libHkgd2FybiBhYm91dCBjb21tb24gcmVmZXJlbmNlIHRvIGRlZmluZWQgc3ltYm9sLiAgKi8KKyAgQ0RFRiwJCS8qIERlZmluZSBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KKyAgTk9BQ1QsCS8qIE5vIGFjdGlvbi4gICovCisgIEJJRywJCS8qIE1hcmsgc3ltYm9sIGNvbW1vbiB1c2luZyBsYXJnZXN0IHNpemUuICAqLworICBNREVGLAkJLyogTXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gICovCisgIE1JTkQsCQkvKiBNdWx0aXBsZSBpbmRpcmVjdCBzeW1ib2xzLiAgKi8KKyAgSU5ELAkJLyogTWFrZSBpbmRpcmVjdCBzeW1ib2wuICAqLworICBDSU5ELAkJLyogTWFrZSBpbmRpcmVjdCBzeW1ib2wgZnJvbSBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KKyAgU0VULAkJLyogQWRkIHZhbHVlIHRvIHNldC4gICovCisgIE1XQVJOLAkvKiBNYWtlIHdhcm5pbmcgc3ltYm9sLiAgKi8KKyAgV0FSTiwJCS8qIElzc3VlIHdhcm5pbmcuICAqLworICBDV0FSTiwJLyogV2FybiBpZiByZWZlcmVuY2VkLCBlbHNlIE1XQVJOLiAgKi8KKyAgQ1lDTEUsCS8qIFJlcGVhdCB3aXRoIHN5bWJvbCBwb2ludGVkIHRvLiAgKi8KKyAgUkVGQywJCS8qIE1hcmsgaW5kaXJlY3Qgc3ltYm9sIHJlZmVyZW5jZWQgYW5kIHRoZW4gQ1lDTEUuICAqLworICBXQVJOQwkJLyogSXNzdWUgd2FybmluZyBhbmQgdGhlbiBDWUNMRS4gICovCit9OworCisvKiBUaGUgc3RhdGUgdGFibGUgaXRzZWxmLiAgVGhlIGZpcnN0IGluZGV4IGlzIGEgbGlua19yb3cgYW5kIHRoZQorICAgc2Vjb25kIGluZGV4IGlzIGEgYmZkX2xpbmtfaGFzaF90eXBlLiAgKi8KKworc3RhdGljIGNvbnN0IGVudW0gbGlua19hY3Rpb24gbGlua19hY3Rpb25bOF1bOF0gPQoreworICAvKiBjdXJyZW50XHByZXYgICAgbmV3ICAgIHVuZGVmICB1bmRlZncgZGVmICAgIGRlZncgICBjb20gICAgaW5kciAgIHdhcm4gICovCisgIC8qIFVOREVGX1JPVyAJKi8gIHtVTkQsICAgTk9BQ1QsIFVORCwgICBSRUYsICAgUkVGLCAgIE5PQUNULCBSRUZDLCAgV0FSTkMgfSwKKyAgLyogVU5ERUZXX1JPVwkqLyAge1dFQUssICBOT0FDVCwgTk9BQ1QsIFJFRiwgICBSRUYsICAgTk9BQ1QsIFJFRkMsICBXQVJOQyB9LAorICAvKiBERUZfUk9XIAkqLyAge0RFRiwgICBERUYsICAgREVGLCAgIE1ERUYsICBERUYsICAgQ0RFRiwgIE1ERUYsICBDWUNMRSB9LAorICAvKiBERUZXX1JPVyAJKi8gIHtERUZXLCAgREVGVywgIERFRlcsICBOT0FDVCwgTk9BQ1QsIE5PQUNULCBOT0FDVCwgQ1lDTEUgfSwKKyAgLyogQ09NTU9OX1JPVwkqLyAge0NPTSwgICBDT00sICAgQ09NLCAgIENSRUYsICBDUkVGLCAgQklHLCAgIFJFRkMsICBXQVJOQyB9LAorICAvKiBJTkRSX1JPVwkqLyAge0lORCwgICBJTkQsICAgSU5ELCAgIE1ERUYsICBJTkQsICAgQ0lORCwgIE1JTkQsICBDWUNMRSB9LAorICAvKiBXQVJOX1JPVyAgICovICB7TVdBUk4sIFdBUk4sICBXQVJOLCAgQ1dBUk4sIENXQVJOLCBXQVJOLCAgQ1dBUk4sIE1XQVJOIH0sCisgIC8qIFNFVF9ST1cJKi8gIHtTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBDWUNMRSwgQ1lDTEUgfQorfTsKKworLyogTW9zdCBvZiB0aGUgZW50cmllcyBpbiB0aGUgTElOS19BQ1RJT04gdGFibGUgYXJlIHN0cmFpZ2h0Zm9yd2FyZCwKKyAgIGJ1dCBhIGZldyBhcmUgc29tZXdoYXQgc3VidGxlLgorCisgICBBIHJlZmVyZW5jZSB0byBhbiBpbmRpcmVjdCBzeW1ib2wgKFVOREVGX1JPVy9pbmRyIG9yCisgICBVTkRFRldfUk9XL2luZHIpIGlzIGNvdW50ZWQgYXMgYSByZWZlcmVuY2UgYm90aCB0byB0aGUgaW5kaXJlY3QKKyAgIHN5bWJvbCBhbmQgdG8gdGhlIHN5bWJvbCB0aGUgaW5kaXJlY3Qgc3ltYm9sIHBvaW50cyB0by4KKworICAgQSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nIHN5bWJvbCAoVU5ERUZfUk9XL3dhcm4gb3IgVU5ERUZXX1JPVy93YXJuKQorICAgY2F1c2VzIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4KKworICAgQSBjb21tb24gZGVmaW5pdGlvbiBvZiBhbiBpbmRpcmVjdCBzeW1ib2wgKENPTU1PTl9ST1cvaW5kcikgaXMKKyAgIHRyZWF0ZWQgYXMgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgTGlrZXdpc2UgZm9yIGFuIGluZGlyZWN0CisgICBkZWZpbml0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCAoSU5EUl9ST1cvY29tKS4KKworICAgQW4gaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBhIHdhcm5pbmcgKElORFJfUk9XL3dhcm4pIGRvZXMgbm90IGNhdXNlCisgICB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuCisKKyAgIElmIGEgd2FybmluZyBpcyBjcmVhdGVkIGZvciBhbiBpbmRpcmVjdCBzeW1ib2wgKFdBUk5fUk9XL2luZHIpIG5vCisgICB3YXJuaW5nIGlzIGNyZWF0ZWQgZm9yIHRoZSBzeW1ib2wgdGhlIGluZGlyZWN0IHN5bWJvbCBwb2ludHMgdG8uCisKKyAgIEFkZGluZyBhbiBlbnRyeSB0byBhIHNldCBkb2VzIG5vdCBjb3VudCBhcyBhIHJlZmVyZW5jZSB0byBhIHNldCwKKyAgIGFuZCBubyB3YXJuaW5nIGlzIGlzc3VlZCAoU0VUX1JPVy93YXJuKS4gICovCisKKy8qIFJldHVybiB0aGUgQkZEIGluIHdoaWNoIGEgaGFzaCBlbnRyeSBoYXMgYmVlbiBkZWZpbmVkLCBpZiBrbm93bi4gICovCisKK3N0YXRpYyBiZmQgKgoraGFzaF9lbnRyeV9iZmQgKGgpCisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworeworICB3aGlsZSAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCisgICAgaCA9IGgtPnUuaS5saW5rOworICBzd2l0Y2ggKGgtPnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgorICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6CisgICAgICByZXR1cm4gaC0+dS51bmRlZi5hYmZkOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgorICAgICAgcmV0dXJuIGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisgICAgICByZXR1cm4gaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKworLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4KKyAgIEFCRkQgaXMgdGhlIEJGRCB0aGUgc3ltYm9sIGNvbWVzIGZyb20uCisgICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCisgICBGTEFHUyBpcyB0aGUgQlNGXyogYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbC4KKyAgIFNFQ1RJT04gaXMgdGhlIHNlY3Rpb24gaW4gd2hpY2ggdGhlIHN5bWJvbCBpcyBkZWZpbmVkOyB0aGlzIG1heSBiZQorICAgICBiZmRfdW5kX3NlY3Rpb25fcHRyIG9yIGJmZF9jb21fc2VjdGlvbl9wdHIuCisgICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24uCisgICBTVFJJTkcgaXMgdXNlZCBmb3IgZWl0aGVyIGFuIGluZGlyZWN0IHN5bWJvbCwgaW4gd2hpY2ggY2FzZSBpdCBpcworICAgICB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIGluZGlyZWN0IHRvLCBvciBhIHdhcm5pbmcgc3ltYm9sLCBpbgorICAgICB3aGljaCBjYXNlIGl0IGlzIHRoZSB3YXJuaW5nIHN0cmluZy4KKyAgIENPUFkgaXMgdHJ1ZSBpZiBOQU1FIG9yIFNUUklORyBtdXN0IGJlIGNvcGllZCBpbnRvIGxvY2FsbHkKKyAgICAgYWxsb2NhdGVkIG1lbW9yeSBpZiB0aGV5IG5lZWQgdG8gYmUgc2F2ZWQuCisgICBDT0xMRUNUIGlzIHRydWUgaWYgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBnY2MgY29uc3RydWN0b3IKKyAgICAgb3IgZGVzdHJ1Y3RvciBuYW1lcyBhcyBjb2xsZWN0MiBkb2VzLgorICAgSEFTSFAsIGlmIG5vdCBOVUxMLCBpcyBhIHBsYWNlIHRvIHN0b3JlIHRoZSBjcmVhdGVkIGhhc2ggdGFibGUKKyAgICAgZW50cnk7IGlmICpIQVNIUCBpcyBub3QgTlVMTCwgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBsb29rZWQgdXAKKyAgICAgdGhlIGhhc2ggdGFibGUgZW50cnksIGFuZCBzdG9yZWQgaXQgaW4gKkhBU0hQLiAqLworCitib29sZWFuCitfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAorCQkJCSAgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LCBoYXNocCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGJvb2xlYW4gY29weTsKKyAgICAgYm9vbGVhbiBjb2xsZWN0OworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOworeworICBlbnVtIGxpbmtfcm93IHJvdzsKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisgIGJvb2xlYW4gY3ljbGU7CisKKyAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjdGlvbikKKyAgICAgIHx8IChmbGFncyAmIEJTRl9JTkRJUkVDVCkgIT0gMCkKKyAgICByb3cgPSBJTkRSX1JPVzsKKyAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX1dBUk5JTkcpICE9IDApCisgICAgcm93ID0gV0FSTl9ST1c7CisgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCkKKyAgICByb3cgPSBTRVRfUk9XOworICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQorICAgIHsKKyAgICAgIGlmICgoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKKwlyb3cgPSBVTkRFRldfUk9XOworICAgICAgZWxzZQorCXJvdyA9IFVOREVGX1JPVzsKKyAgICB9CisgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9XRUFLKSAhPSAwKQorICAgIHJvdyA9IERFRldfUk9XOworICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQorICAgIHJvdyA9IENPTU1PTl9ST1c7CisgIGVsc2UKKyAgICByb3cgPSBERUZfUk9XOworCisgIGlmIChoYXNocCAhPSBOVUxMICYmICpoYXNocCAhPSBOVUxMKQorICAgIGggPSAqaGFzaHA7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocm93ID09IFVOREVGX1JPVyB8fCByb3cgPT0gVU5ERUZXX1JPVykKKwloID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOworICAgICAgZWxzZQorCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOworICAgICAgaWYgKGggPT0gTlVMTCkKKwl7CisJICBpZiAoaGFzaHAgIT0gTlVMTCkKKwkgICAgKmhhc2hwID0gTlVMTDsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGlmIChpbmZvLT5ub3RpY2VfYWxsCisgICAgICB8fCAoaW5mby0+bm90aWNlX2hhc2ggIT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMCisJICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQorCSAgICAgICE9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpKQorICAgIHsKKyAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5ub3RpY2UpIChpbmZvLCBoLT5yb290LnN0cmluZywgYWJmZCwgc2VjdGlvbiwKKwkJCQkJdmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGhhc2hwICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgTlVMTCkKKyAgICAqaGFzaHAgPSBoOworCisgIGRvCisgICAgeworICAgICAgZW51bSBsaW5rX2FjdGlvbiBhY3Rpb247CisKKyAgICAgIGN5Y2xlID0gZmFsc2U7CisgICAgICBhY3Rpb24gPSBsaW5rX2FjdGlvblsoaW50KSByb3ddWyhpbnQpIGgtPnR5cGVdOworICAgICAgc3dpdGNoIChhY3Rpb24pCisJeworCWNhc2UgRkFJTDoKKwkgIGFib3J0ICgpOworCisJY2FzZSBOT0FDVDoKKwkgIC8qIERvIG5vdGhpbmcuICAqLworCSAgYnJlYWs7CisKKwljYXNlIFVORDoKKwkgIC8qIE1ha2UgYSBuZXcgdW5kZWZpbmVkIHN5bWJvbC4gICovCisJICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisJICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOworCSAgYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBoKTsKKwkgIGJyZWFrOworCisJY2FzZSBXRUFLOgorCSAgLyogTWFrZSBhIG5ldyB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLworCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOworCSAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKKwkgIGJyZWFrOworCisJY2FzZSBDREVGOgorCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoIHdhcworCSAgICAgcHJldmlvdXNseSBjb21tb24uICAqLworCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7CisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKKwkJIChpbmZvLCBoLT5yb290LnN0cmluZywKKwkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKKwkJICBhYmZkLCBiZmRfbGlua19oYXNoX2RlZmluZWQsIChiZmRfdm1hKSAwKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSBERUY6CisJY2FzZSBERUZXOgorCSAgeworCSAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBvbGR0eXBlOworCisJICAgIC8qIERlZmluZSBhIHN5bWJvbC4gICovCisJICAgIG9sZHR5cGUgPSBoLT50eXBlOworCSAgICBpZiAoYWN0aW9uID09IERFRlcpCisJICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmd2VhazsKKwkgICAgZWxzZQorCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisJICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBzZWN0aW9uOworCSAgICBoLT51LmRlZi52YWx1ZSA9IHZhbHVlOworCisJICAgIC8qIElmIHdlIGhhdmUgYmVlbiBhc2tlZCB0bywgd2UgYWN0IGxpa2UgY29sbGVjdDIgYW5kCisJICAgICAgIGlkZW50aWZ5IGFsbCBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSBnbG9iYWwKKwkgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgcGFzcyB0aGVtIHVwIGluIGEKKwkgICAgICAgY2FsbGJhY2suICBXZSBvbmx5IGRvIHRoaXMgZm9yIGNlcnRhaW4gb2JqZWN0IGZpbGUKKwkgICAgICAgdHlwZXMsIHNpbmNlIG1hbnkgb2JqZWN0IGZpbGUgdHlwZXMgY2FuIGhhbmRsZSB0aGlzCisJICAgICAgIGF1dG9tYXRpY2FsbHkuICAqLworCSAgICBpZiAoY29sbGVjdCAmJiBuYW1lWzBdID09ICdfJykKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKnM7CisKKwkJLyogQSBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUgc3RhcnRzIGxpa2UgdGhpczoKKwkJICAgXytHTE9CQUxfW18uJF1bSURdW18uJF0gd2hlcmUgdGhlIGZpcnN0IFtfLiRdIGFuZAorCQkgICB0aGUgc2Vjb25kIGFyZSB0aGUgc2FtZSBjaGFyYWN0ZXIgKHdlIGFjY2VwdCBhbnkKKwkJICAgY2hhcmFjdGVyIHRoZXJlLCBpbiBjYXNlIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdAorCQkgICBjb21lcyBhbG9uZyB3aXRoIGV2ZW4gd29yc2UgbmFtaW5nIHJlc3RyaWN0aW9ucykuICAqLworCisjZGVmaW5lIENPTlNfUFJFRklYICJHTE9CQUxfIgorI2RlZmluZSBDT05TX1BSRUZJWF9MRU4gKHNpemVvZiBDT05TX1BSRUZJWCAtIDEpCisKKwkJcyA9IG5hbWUgKyAxOworCQl3aGlsZSAoKnMgPT0gJ18nKQorCQkgICsrczsKKwkJaWYgKHNbMF0gPT0gJ0cnCisJCSAgICAmJiBzdHJuY21wIChzLCBDT05TX1BSRUZJWCwgQ09OU19QUkVGSVhfTEVOIC0gMSkgPT0gMCkKKwkJICB7CisJCSAgICBjaGFyIGM7CisKKwkJICAgIGMgPSBzW0NPTlNfUFJFRklYX0xFTiArIDFdOworCQkgICAgaWYgKChjID09ICdJJyB8fCBjID09ICdEJykKKwkJCSYmIHNbQ09OU19QUkVGSVhfTEVOXSA9PSBzW0NPTlNfUFJFRklYX0xFTiArIDJdKQorCQkgICAgICB7CisJCQkvKiBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHByZXZpb3VzbHkgd2Vha2x5IGRlZmluZWQsIHdlIGFyZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJvdWJsZS4gIFdlIGhhdmUgYWxyZWFkeSBhZGRlZCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciBlbnRyeSBmb3IgdGhlIHdlYWsgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCBhbmQgbm93IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBuZXcgc3ltYm9sLiAgRm9ydHVuYXRlbHksIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG5ldmVyIGFyaXNlIGluIHByYWN0aWNlLiAgKi8KKwkJCWlmIChvbGR0eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkJCSAgYWJvcnQgKCk7CisKKwkJCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+Y29uc3RydWN0b3IpCisJCQkgICAgICAgKGluZm8sCisJCQkJYyA9PSAnSScgPyB0cnVlIDogZmFsc2UsCisJCQkJaC0+cm9vdC5zdHJpbmcsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKSkpCisJCQkgIHJldHVybiBmYWxzZTsKKwkJICAgICAgfQorCQkgIH0KKwkgICAgICB9CisJICB9CisKKwkgIGJyZWFrOworCisJY2FzZSBDT006CisJICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KKwkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQorCSAgICBiZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGgpOworCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOworCSAgaC0+dS5jLnAgPQorCSAgICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQorCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKKwkJCQlzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKKwkgIGlmIChoLT51LmMucCA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGgtPnUuYy5zaXplID0gdmFsdWU7CisKKwkgIC8qIFNlbGVjdCBhIGRlZmF1bHQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBzaXplLiAgVGhpcyBtYXkKKyAgICAgICAgICAgICBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIuICAqLworCSAgeworCSAgICB1bnNpZ25lZCBpbnQgcG93ZXI7CisKKwkgICAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOworCSAgICBpZiAocG93ZXIgPiA0KQorCSAgICAgIHBvd2VyID0gNDsKKwkgICAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOworCSAgfQorCisJICAvKiBUaGUgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgb25seSB1c2VkIGlmIHRoZSBjb21tb24KKyAgICAgICAgICAgICBzeW1ib2wgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAgSXQgYmFzaWNhbGx5IHByb3ZpZGVzIGEKKyAgICAgICAgICAgICBob29rIGZvciB0aGUgbGlua2VyIHNjcmlwdCB0byBkZWNpZGUgd2hpY2ggb3V0cHV0IHNlY3Rpb24KKyAgICAgICAgICAgICB0aGUgY29tbW9uIHN5bWJvbHMgc2hvdWxkIGJlIHB1dCBpbi4gIEluIG1vc3QgY2FzZXMsIHRoZQorICAgICAgICAgICAgIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIHdpbGwgYmUgYmZkX2NvbV9zZWN0aW9uX3B0ciwKKyAgICAgICAgICAgICB0aGUgY29kZSBoZXJlIHdpbGwgY2hvb3NlIGEgY29tbW9uIHN5bWJvbCBzZWN0aW9uIG5hbWVkCisgICAgICAgICAgICAgIkNPTU1PTiIsIGFuZCB0aGUgbGlua2VyIHNjcmlwdCB3aWxsIGNvbnRhaW4gKihDT01NT04pIGluCisgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiAgQSBmZXcgdGFyZ2V0cyB1c2Ugc2VwYXJhdGUgY29tbW9uCisgICAgICAgICAgICAgc2VjdGlvbnMgZm9yIHNtYWxsIHN5bWJvbHMsIGFuZCB0aGV5IHJlcXVpcmUgc3BlY2lhbAorICAgICAgICAgICAgIGhhbmRsaW5nLiAgKi8KKwkgIGlmIChzZWN0aW9uID09IGJmZF9jb21fc2VjdGlvbl9wdHIpCisJICAgIHsKKwkgICAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIkNPTU1PTiIpOworCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKKwkgICAgfQorCSAgZWxzZSBpZiAoc2VjdGlvbi0+b3duZXIgIT0gYWJmZCkKKwkgICAgeworCSAgICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLAorCQkJCQkJCSAgICBzZWN0aW9uLT5uYW1lKTsKKwkgICAgICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBzZWN0aW9uOworCSAgYnJlYWs7CisKKwljYXNlIFJFRjoKKwkgIC8qIEEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzeW1ib2wuICAqLworCSAgaWYgKGgtPm5leHQgPT0gTlVMTCAmJiBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCAhPSBoKQorCSAgICBoLT5uZXh0ID0gaDsKKwkgIGJyZWFrOworCisJY2FzZSBCSUc6CisJICAvKiBXZSBoYXZlIGZvdW5kIGEgY29tbW9uIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIHdoaWNoCisJICAgICBhbHJlYWR5IGhhZCBhIGNvbW1vbiBkZWZpbml0aW9uLiAgVXNlIHRoZSBtYXhpbXVtIG9mIHRoZQorCSAgICAgdHdvIHNpemVzLiAgKi8KKwkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOworCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCisJCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCisJCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCisJCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHZhbHVlKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmICh2YWx1ZSA+IGgtPnUuYy5zaXplKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IHBvd2VyOworCisJICAgICAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKKworCSAgICAgIC8qIFNlbGVjdCBhIGRlZmF1bHQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBzaXplLiAgVGhpcyBtYXkKKwkJIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNhbGxlci4gICovCisJICAgICAgcG93ZXIgPSBiZmRfbG9nMiAodmFsdWUpOworCSAgICAgIGlmIChwb3dlciA+IDQpCisJCXBvd2VyID0gNDsKKwkgICAgICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBDUkVGOgorCSAgeworCSAgICBiZmQgKm9iZmQ7CisKKwkgICAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaAorCSAgICAgICB3YXMgYWxyZWFkeSBkZWZpbmVkLiAgRklYTUU6IEl0IHdvdWxkIG5pY2UgaWYgd2UgY291bGQKKwkgICAgICAgcmVwb3J0IHRoZSBCRkQgd2hpY2ggZGVmaW5lZCBhbiBpbmRpcmVjdCBzeW1ib2wsIGJ1dCB3ZQorCSAgICAgICBkb24ndCBoYXZlIGFueXdoZXJlIHRvIHN0b3JlIHRoZSBpbmZvcm1hdGlvbi4gICovCisJICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQl8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwkgICAgICBvYmZkID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7CisJICAgIGVsc2UKKwkgICAgICBvYmZkID0gTlVMTDsKKwkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCisJCSAgIChpbmZvLCBoLT5yb290LnN0cmluZywgb2JmZCwgaC0+dHlwZSwgKGJmZF92bWEpIDAsCisJCSAgICBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgdmFsdWUpKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisJICBicmVhazsKKworCWNhc2UgTUlORDoKKwkgIC8qIE11bHRpcGxlIGluZGlyZWN0IHN5bWJvbHMuICBUaGlzIGlzIE9LIGlmIHRoZXkgYm90aCBwb2ludAorCSAgICAgdG8gdGhlIHNhbWUgc3ltYm9sLiAgKi8KKwkgIGlmIChzdHJjbXAgKGgtPnUuaS5saW5rLT5yb290LnN0cmluZywgc3RyaW5nKSA9PSAwKQorCSAgICBicmVhazsKKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSBNREVGOgorCSAgLyogSGFuZGxlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbi4gICovCisJICB7CisJICAgIGFzZWN0aW9uICptc2VjOworCSAgICBiZmRfdm1hIG12YWw7CisKKwkgICAgc3dpdGNoIChoLT50eXBlKQorCSAgICAgIHsKKwkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKKwkJbXNlYyA9IGgtPnUuZGVmLnNlY3Rpb247CisJCW12YWwgPSBoLT51LmRlZi52YWx1ZTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgorCQltc2VjID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKKwkJbXZhbCA9IDA7CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCWFib3J0ICgpOworCSAgICAgIH0KKworCSAgICAvKiBJZ25vcmUgYSByZWRlZmluaXRpb24gb2YgYW4gYWJzb2x1dGUgc3ltYm9sIHRvIHRoZSBzYW1lCisgICAgICAgICAgICAgICB2YWx1ZTsgaXQncyBoYXJtbGVzcy4gICovCisJICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKG1zZWMpCisJCSYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKKwkJJiYgdmFsdWUgPT0gbXZhbCkKKwkgICAgICBicmVhazsKKworCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2RlZmluaXRpb24pCisJCSAgIChpbmZvLCBoLT5yb290LnN0cmluZywgbXNlYy0+b3duZXIsIG1zZWMsIG12YWwsIGFiZmQsCisJCSAgICBzZWN0aW9uLCB2YWx1ZSkpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBDSU5EOgorCSAgLyogQ3JlYXRlIGFuIGluZGlyZWN0IHN5bWJvbCBmcm9tIGFuIGV4aXN0aW5nIGNvbW1vbiBzeW1ib2wuICAqLworCSAgQkZEX0FTU0VSVCAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7CisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2NvbW1vbikKKwkJIChpbmZvLCBoLT5yb290LnN0cmluZywKKwkJICBoLT51LmMucC0+c2VjdGlvbi0+b3duZXIsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBoLT51LmMuc2l6ZSwKKwkJICBhYmZkLCBiZmRfbGlua19oYXNoX2luZGlyZWN0LCAoYmZkX3ZtYSkgMCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgSU5EOgorCSAgLyogQ3JlYXRlIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCisJICB7CisJICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICppbmg7CisKKwkgICAgLyogU1RSSU5HIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgd2Ugd2FudCB0byBpbmRpcmVjdAorCSAgICAgICB0by4gICovCisJICAgIGluaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIHN0cmluZywgdHJ1ZSwKKwkJCQkJCWNvcHksIGZhbHNlKTsKKwkgICAgaWYgKGluaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIGlmIChpbmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCisJICAgICAgeworCQlpbmgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKKwkJaW5oLT51LnVuZGVmLmFiZmQgPSBhYmZkOworCQliZmRfbGlua19hZGRfdW5kZWYgKGluZm8tPmhhc2gsIGluaCk7CisJICAgICAgfQorCisJICAgIC8qIElmIHRoZSBpbmRpcmVjdCBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCwgd2UgbmVlZCB0bworCSAgICAgICBwdXNoIHRoZSByZWZlcmVuY2UgZG93biB0byB0aGUgc3ltYm9sIHdlIGFyZQorCSAgICAgICByZWZlcmVuY2luZy4gICovCisJICAgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfbmV3KQorCSAgICAgIHsKKwkJcm93ID0gVU5ERUZfUk9XOworCQljeWNsZSA9IHRydWU7CisJICAgICAgfQorCisJICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2luZGlyZWN0OworCSAgICBoLT51LmkubGluayA9IGluaDsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBTRVQ6CisJICAvKiBBZGQgYW4gZW50cnkgdG8gYSBzZXQuICAqLworCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF90b19zZXQpIChpbmZvLCBoLCBCRkRfUkVMT0NfQ1RPUiwKKwkJCQkJCWFiZmQsIHNlY3Rpb24sIHZhbHVlKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwljYXNlIFdBUk5DOgorCSAgLyogSXNzdWUgYSB3YXJuaW5nIGFuZCBjeWNsZS4gICovCisJICBpZiAoaC0+dS5pLndhcm5pbmcgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywgaC0+dS5pLndhcm5pbmcsCisJCQkJCQkgaC0+cm9vdC5zdHJpbmcsIGFiZmQsCisJCQkJCQkgKGFzZWN0aW9uICopIE5VTEwsCisJCQkJCQkgKGJmZF92bWEpIDApKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgLyogT25seSBpc3N1ZSBhIHdhcm5pbmcgb25jZS4gICovCisJICAgICAgaC0+dS5pLndhcm5pbmcgPSBOVUxMOworCSAgICB9CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgQ1lDTEU6CisJICAvKiBUcnkgYWdhaW4gd2l0aCB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLworCSAgaCA9IGgtPnUuaS5saW5rOworCSAgY3ljbGUgPSB0cnVlOworCSAgYnJlYWs7CisKKwljYXNlIFJFRkM6CisJICAvKiBBIHJlZmVyZW5jZSB0byBhbiBpbmRpcmVjdCBzeW1ib2wuICAqLworCSAgaWYgKGgtPm5leHQgPT0gTlVMTCAmJiBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCAhPSBoKQorCSAgICBoLT5uZXh0ID0gaDsKKwkgIGggPSBoLT51LmkubGluazsKKwkgIGN5Y2xlID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBXQVJOOgorCSAgLyogSXNzdWUgYSB3YXJuaW5nLiAgKi8KKwkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywgc3RyaW5nLCBoLT5yb290LnN0cmluZywKKwkJCQkJICAgICBoYXNoX2VudHJ5X2JmZCAoaCksCisJCQkJCSAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwljYXNlIENXQVJOOgorCSAgLyogV2FybiBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkIGFscmVhZHksCisJICAgICBvdGhlcndpc2UgYWRkIGEgd2FybmluZy4gIEEgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQgaWYKKwkgICAgIHRoZSBuZXh0IGZpZWxkIGlzIG5vdCBOVUxMLCBvciBpdCBpcyB0aGUgdGFpbCBvZiB0aGUKKwkgICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gIFRoZSBSRUYgY2FzZSBhYm92ZSBoZWxwcyB0bworCSAgICAgZW5zdXJlIHRoaXMuICAqLworCSAgaWYgKGgtPm5leHQgIT0gTlVMTCB8fCBpbmZvLT5oYXNoLT51bmRlZnNfdGFpbCA9PSBoKQorCSAgICB7CisJICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpIChpbmZvLCBzdHJpbmcsIGgtPnJvb3Quc3RyaW5nLAorCQkJCQkJIGhhc2hfZW50cnlfYmZkIChoKSwKKwkJCQkJCSAoYXNlY3Rpb24gKikgTlVMTCwKKwkJCQkJCSAoYmZkX3ZtYSkgMCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlIE1XQVJOOgorCSAgLyogTWFrZSBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KKwkgIHsKKwkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnN1YjsKKworCSAgICAvKiBTVFJJTkcgaXMgdGhlIHdhcm5pbmcgdG8gZ2l2ZS4gICovCisJICAgIHN1YiA9ICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikKKwkJICAgKCgqaW5mby0+aGFzaC0+dGFibGUubmV3ZnVuYykKKwkJICAgICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwsICZpbmZvLT5oYXNoLT50YWJsZSwKKwkJICAgICBoLT5yb290LnN0cmluZykpKTsKKwkgICAgaWYgKHN1YiA9PSBOVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgKnN1YiA9ICpoOworCSAgICBzdWItPnR5cGUgPSBiZmRfbGlua19oYXNoX3dhcm5pbmc7CisJICAgIHN1Yi0+dS5pLmxpbmsgPSBoOworCSAgICBpZiAoISBjb3B5KQorCSAgICAgIHN1Yi0+dS5pLndhcm5pbmcgPSBzdHJpbmc7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNoYXIgKnc7CisKKwkJdyA9IGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCisJCQkJICAgICAgIHN0cmxlbiAoc3RyaW5nKSArIDEpOworCQlpZiAodyA9PSBOVUxMKQorCQkgIHJldHVybiBmYWxzZTsKKwkJc3RyY3B5ICh3LCBzdHJpbmcpOworCQlzdWItPnUuaS53YXJuaW5nID0gdzsKKwkgICAgICB9CisKKwkgICAgYmZkX2hhc2hfcmVwbGFjZSAoJmluZm8tPmhhc2gtPnRhYmxlLAorCQkJICAgICAgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBoLAorCQkJICAgICAgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBzdWIpOworCSAgICBpZiAoaGFzaHAgIT0gTlVMTCkKKwkgICAgICAqaGFzaHAgPSBzdWI7CisJICB9CisJICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSAoY3ljbGUpOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogR2VuZXJpYyBmaW5hbCBsaW5rIHJvdXRpbmUuICAqLworCitib29sZWFuCitfYmZkX2dlbmVyaWNfZmluYWxfbGluayAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgYmZkICpzdWI7CisgIGFzZWN0aW9uICpvOworICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7CisgIHNpemVfdCBvdXRzeW1hbGxvYzsKKyAgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvIHdnaW5mbzsKKworICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID0gKGFzeW1ib2wgKiopIE5VTEw7CisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKKyAgb3V0c3ltYWxsb2MgPSAwOworCisgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5saW5rZXJfbWFyayA9IHRydWU7CisKKyAgLyogQnVpbGQgdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLworICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSAoYmZkICopIE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQorICAgIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzIChhYmZkLCBzdWIsIGluZm8sICZvdXRzeW1hbGxvYykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogQWNjdW11bGF0ZSB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLworICB3Z2luZm8uaW5mbyA9IGluZm87CisgIHdnaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKKyAgd2dpbmZvLnBzeW1hbGxvYyA9ICZvdXRzeW1hbGxvYzsKKyAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90cmF2ZXJzZSAoX2JmZF9nZW5lcmljX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCSAgIF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wsCisJCQkJICAgKFBUUikgJndnaW5mbyk7CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBOVUxMIHBvaW50ZXIgb24gT1VUU1lNQk9MUy4gIFdlCisgICAgIHNob3VsZG4ndCByZWFsbHkgbmVlZCBvbmUsIHNpbmNlIHdlIGhhdmUgU1lNQ09VTlQsIGJ1dCBzb21lIG9sZAorICAgICBjb2RlIHN0aWxsIGV4cGVjdHMgb25lLiAgKi8KKyAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAoYWJmZCwgJm91dHN5bWFsbG9jLCBOVUxMKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG91dHB1dCByZWxvY3MgZm9yIGVhY2ggc2VjdGlvbi4gICovCisgICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsKKwkgICBvICE9IChhc2VjdGlvbiAqKSBOVUxMOworCSAgIG8gPSBvLT5uZXh0KQorCXsKKwkgIG8tPnJlbG9jX2NvdW50ID0gMDsKKwkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKKwkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisJICAgICAgIHAgPSBwLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCQkgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQorCQkrK28tPnJlbG9jX2NvdW50OworCSAgICAgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJCXsKKwkJICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKwkJICBiZmQgKmlucHV0X2JmZDsKKwkJICBsb25nIHJlbHNpemU7CisJCSAgYXJlbGVudCAqKnJlbG9jczsKKwkJICBhc3ltYm9sICoqc3ltYm9sczsKKwkJICBsb25nIHJlbG9jX2NvdW50OworCisJCSAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKKwkJICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKKwkJICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLAorCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOworCQkgIGlmIChyZWxzaXplIDwgMCkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICByZWxvY3MgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsc2l6ZSk7CisJCSAgaWYgKCFyZWxvY3MgJiYgcmVsc2l6ZSAhPSAwKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKKwkJICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwKKwkJCQkJCQlpbnB1dF9zZWN0aW9uLAorCQkJCQkJCXJlbG9jcywKKwkJCQkJCQlzeW1ib2xzKTsKKwkJICBpZiAocmVsb2NfY291bnQgPCAwKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIEJGRF9BU1NFUlQgKCh1bnNpZ25lZCBsb25nKSByZWxvY19jb3VudAorCQkJICAgICAgPT0gaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOworCQkgIG8tPnJlbG9jX2NvdW50ICs9IHJlbG9jX2NvdW50OworCQkgIGZyZWUgKHJlbG9jcyk7CisJCX0KKwkgICAgfQorCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gMCkKKwkgICAgeworCSAgICAgIG8tPm9yZWxvY2F0aW9uID0gKChhcmVsZW50ICoqKQorCQkJCWJmZF9hbGxvYyAoYWJmZCwKKwkJCQkJICAgKG8tPnJlbG9jX2NvdW50CisJCQkJCSAgICAqIHNpemVvZiAoYXJlbGVudCAqKSkpKTsKKwkgICAgICBpZiAoIW8tPm9yZWxvY2F0aW9uKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOworCSAgICAgIC8qIFJlc2V0IHRoZSBjb3VudCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4CisJCSB3aGVuIHB1dHRpbmcgaW4gdGhlIG91dHB1dCByZWxvY3MuICAqLworCSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSGFuZGxlIGFsbCB0aGUgbGluayBvcmRlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlY3Rpb25zLiAgKi8KKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7CisgICAgICAgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgICAgICBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7CisJICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisJICAgcCA9IHAtPm5leHQpCisJeworCSAgc3dpdGNoIChwLT50eXBlKQorCSAgICB7CisJICAgIGNhc2UgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjoKKwkgICAgY2FzZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI6CisJICAgICAgaWYgKCEgX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXI6CisJICAgICAgaWYgKCEgZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwLCB0cnVlKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYW4gb3V0cHV0IHN5bWJvbCB0byB0aGUgb3V0cHV0IEJGRC4gICovCisKK3N0YXRpYyBib29sZWFuCitnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChvdXRwdXRfYmZkLCBwc3ltYWxsb2MsIHN5bSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzaXplX3QgKnBzeW1hbGxvYzsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBpZiAoYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCkgPj0gKnBzeW1hbGxvYykKKyAgICB7CisgICAgICBhc3ltYm9sICoqbmV3c3ltczsKKworICAgICAgaWYgKCpwc3ltYWxsb2MgPT0gMCkKKwkqcHN5bWFsbG9jID0gMTI0OworICAgICAgZWxzZQorCSpwc3ltYWxsb2MgKj0gMjsKKyAgICAgIG5ld3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX3JlYWxsb2MgKGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCksCisJCQkJCSAgKnBzeW1hbGxvYyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgICAgICBpZiAobmV3c3ltcyA9PSAoYXN5bWJvbCAqKikgTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpID0gbmV3c3ltczsKKyAgICB9CisKKyAgYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKSBbYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCldID0gc3ltOworICBpZiAoc3ltICE9IE5VTEwpCisgICAgKysgYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEhhbmRsZSB0aGUgc3ltYm9scyBmb3IgYW4gaW5wdXQgQkZELiAgKi8KKworYm9vbGVhbgorX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywgcHN5bWFsbG9jKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc2l6ZV90ICpwc3ltYWxsb2M7Cit7CisgIGFzeW1ib2wgKipzeW1fcHRyOworICBhc3ltYm9sICoqc3ltX2VuZDsKKworICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChpbnB1dF9iZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBDcmVhdGUgYSBmaWxlbmFtZSBzeW1ib2wgaWYgd2UgYXJlIHN1cHBvc2VkIHRvLiAgKi8KKyAgaWYgKGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisKKyAgICAgIGZvciAoc2VjID0gaW5wdXRfYmZkLT5zZWN0aW9uczsKKwkgICBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7CisJICAgc2VjID0gc2VjLT5uZXh0KQorCXsKKwkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uKQorCSAgICB7CisJICAgICAgYXN5bWJvbCAqbmV3c3ltOworCisJICAgICAgbmV3c3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChpbnB1dF9iZmQpOworCSAgICAgIGlmICghbmV3c3ltKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgbmV3c3ltLT5uYW1lID0gaW5wdXRfYmZkLT5maWxlbmFtZTsKKwkgICAgICBuZXdzeW0tPnZhbHVlID0gMDsKKwkgICAgICBuZXdzeW0tPmZsYWdzID0gQlNGX0xPQ0FMIHwgQlNGX0ZJTEU7CisJICAgICAgbmV3c3ltLT5zZWN0aW9uID0gc2VjOworCisJICAgICAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAob3V0cHV0X2JmZCwgcHN5bWFsbG9jLAorCQkJCQkgICAgICAgbmV3c3ltKSkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEFkanVzdCB0aGUgdmFsdWVzIG9mIHRoZSBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMsIGFuZCB3cml0ZSBvdXQKKyAgICAgbG9jYWwgc3ltYm9scy4gICovCisgIHN5bV9wdHIgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKKyAgc3ltX2VuZCA9IHN5bV9wdHIgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGlucHV0X2JmZCk7CisgIGZvciAoOyBzeW1fcHRyIDwgc3ltX2VuZDsgc3ltX3B0cisrKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgIGJvb2xlYW4gb3V0cHV0OworCisgICAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMOworICAgICAgc3ltID0gKnN5bV9wdHI7CisgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCisJCQkgfCBCU0ZfV0FSTklORworCQkJIHwgQlNGX0dMT0JBTAorCQkJIHwgQlNGX0NPTlNUUlVDVE9SCisJCQkgfCBCU0ZfV0VBSykpICE9IDAKKwkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQorCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCisJICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJeworCSAgaWYgKHN5bS0+dWRhdGEucCAhPSBOVUxMKQorCSAgICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBzeW0tPnVkYXRhLnA7CisJICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgY2FzZSBub3JtYWxseSBtZWFucyB0aGF0IHRoZSBtYWluIGxpbmtlciBjb2RlCisgICAgICAgICAgICAgICAgIGRlbGliZXJhdGVseSBpZ25vcmVkIHRoaXMgY29uc3RydWN0b3Igc3ltYm9sLiAgV2UKKyAgICAgICAgICAgICAgICAgc2hvdWxkIGp1c3QgcGFzcyBpdCB0aHJvdWdoLiAgVGhpcyB3aWxsIHNjcmV3IHVwIGlmCisgICAgICAgICAgICAgICAgIHRoZSBjb25zdHJ1Y3RvciBzeW1ib2wgaXMgZnJvbSBhIGRpZmZlcmVudCwKKyAgICAgICAgICAgICAgICAgbm9uLWdlbmVyaWMsIG9iamVjdCBmaWxlIGZvcm1hdCwgYnV0IHRoZSBjYXNlIHdpbGwKKyAgICAgICAgICAgICAgICAgb25seSBhcmlzZSB3aGVuIGxpbmtpbmcgd2l0aCAtciwgd2hpY2ggd2lsbCBwcm9iYWJseQorICAgICAgICAgICAgICAgICBmYWlsIGFueWhvdywgc2luY2UgdGhlcmUgd2lsbCBiZSBubyB3YXkgdG8gcmVwcmVzZW50CisgICAgICAgICAgICAgICAgIHRoZSByZWxvY3MgaW4gdGhlIG91dHB1dCBmb3JtYXQgYmVpbmcgdXNlZC4gICovCisJICAgICAgaCA9IE5VTEw7CisJICAgIH0KKwkgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKKwkgICAgaCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCisJCSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAorCQkJCQkgICAgICAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKKwkJCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOworCSAgZWxzZQorCSAgICBoID0gX2JmZF9nZW5lcmljX2xpbmtfaGFzaF9sb29rdXAgKF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkJICAgICAgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCisJCQkJCSAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOworCisJICBpZiAoaCAhPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBGb3JjZSBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCB0byBwb2ludCB0bworCQkgdGhlIHNhbWUgYXJlYSBpbiBtZW1vcnkuICBJdCBpcyBwb3NzaWJsZSB0aGF0CisJCSB0aGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIGhhc2ggdGFibGUKKwkJIG90aGVyIHRoYW4gYSBnZW5lcmljIGhhc2ggdGFibGUsIHNvIHdlIGRvdWJsZQorCQkgY2hlY2sgdGhhdC4gICovCisJICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gaW5wdXRfYmZkLT54dmVjKQorCQl7CisJCSAgaWYgKGgtPnN5bSAhPSAoYXN5bWJvbCAqKSBOVUxMKQorCQkgICAgKnN5bV9wdHIgPSBzeW0gPSBoLT5zeW07CisJCX0KKworCSAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQorCQl7CisJCWRlZmF1bHQ6CisJCWNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6CisJCSAgYWJvcnQgKCk7CisJCWNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6CisJCSAgYnJlYWs7CisJCWNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6CisJCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKKwkJICBicmVhazsKKwkJY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgorCQkgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7CisJCSAgLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKKwkJICBzeW0tPmZsYWdzICY9fiBCU0ZfQ09OU1RSVUNUT1I7CisJCSAgc3ltLT52YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWU7CisJCSAgc3ltLT5zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkgIGJyZWFrOworCQljYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKwkJICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOworCQkgIHN5bS0+ZmxhZ3MgJj1+IEJTRl9DT05TVFJVQ1RPUjsKKwkJICBzeW0tPnZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKKwkJICBzeW0tPnNlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisJCSAgYnJlYWs7CisJCWNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisJCSAgc3ltLT52YWx1ZSA9IGgtPnJvb3QudS5jLnNpemU7CisJCSAgc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOworCQkgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKKwkJICAgIHsKKwkJICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKKwkJICAgICAgc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKwkJICAgIH0KKwkJICAvKiBXZSBkbyBub3Qgc2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBzeW1ib2wgdG8KKwkJICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLiAgVGhhdCB2YWx1ZSB3YXMgc2F2ZWQgc28KKwkJICAgICB0aGF0IHdlIHdvdWxkIGtub3cgd2hlcmUgdG8gYWxsb2NhdGUgdGhlIHN5bWJvbAorCQkgICAgIGlmIGl0IHdhcyBkZWZpbmVkLiAgSW4gdGhpcyBjYXNlIHRoZSB0eXBlIGlzCisJCSAgICAgc3RpbGwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHNvIHdlIGRpZCBub3QgZGVmaW5lCisJCSAgICAgaXQsIHNvIHdlIGRvIG5vdCB3YW50IHRvIHVzZSB0aGF0IHNlY3Rpb24uICAqLworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFRoaXMgc3dpdGNoIGlzIHN0cmFpZ2h0IGZyb20gdGhlIG9sZCBjb2RlIGluCisJIHdyaXRlX2ZpbGVfbG9jYWxzIGluIGxkc3ltLmMuICAqLworICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbAorCSAgfHwgKGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKKwkgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChpbmZvLT5rZWVwX2hhc2gsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCisJCQkJICAgZmFsc2UsIGZhbHNlKQorCQkgID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkpKQorCW91dHB1dCA9IGZhbHNlOworICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKKwl7CisJICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBtYXJrZWQgYXMgb2NjdXJyaW5nIG5vdywgcmF0aGVyCisJICAgICB0aGFuIGF0IHRoZSBlbmQsIG91dHB1dCBpdCBub3cuICBUaGlzIGlzIHVzZWQgZm9yCisJICAgICBDT0ZGIENfRVhUIEZDTiBzeW1ib2xzLiAgRklYTUU6IFRoZXJlIG11c3QgYmUgYQorCSAgICAgYmV0dGVyIHdheS4gICovCisJICBpZiAoYmZkX2FzeW1ib2xfYmZkIChzeW0pID09IGlucHV0X2JmZAorCSAgICAgICYmIChzeW0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpICE9IDApCisJICAgIG91dHB1dCA9IHRydWU7CisJICBlbHNlCisJICAgIG91dHB1dCA9IGZhbHNlOworCX0KKyAgICAgIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKKwlvdXRwdXQgPSBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkKKwl7CisJICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSkKKwkgICAgb3V0cHV0ID0gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgb3V0cHV0ID0gZmFsc2U7CisJfQorICAgICAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCisJICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKKwlvdXRwdXQgPSBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwKQorCXsKKwkgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwKQorCSAgICBvdXRwdXQgPSBmYWxzZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN3aXRjaCAoaW5mby0+ZGlzY2FyZCkKKwkJeworCQlkZWZhdWx0OgorCQljYXNlIGRpc2NhcmRfYWxsOgorCQkgIG91dHB1dCA9IGZhbHNlOworCQkgIGJyZWFrOworCQljYXNlIGRpc2NhcmRfbDoKKwkJICBpZiAoYmZkX2lzX2xvY2FsX2xhYmVsIChpbnB1dF9iZmQsIHN5bSkpCisJCSAgICBvdXRwdXQgPSBmYWxzZTsKKwkJICBlbHNlCisJCSAgICBvdXRwdXQgPSB0cnVlOworCQkgIGJyZWFrOworCQljYXNlIGRpc2NhcmRfbm9uZToKKwkJICBvdXRwdXQgPSB0cnVlOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikpCisJeworCSAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKKwkgICAgb3V0cHV0ID0gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgb3V0cHV0ID0gZmFsc2U7CisJfQorICAgICAgZWxzZQorCWFib3J0ICgpOworCisgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIHNlY3Rpb24gd2hpY2ggaXMgbm90IGJlaW5nIGluY2x1ZGVkCisJIGluIHRoZSBvdXRwdXQgZmlsZSwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIG91dHB1dCB0aGUgc3ltYm9sLgorCisJIEdyb3NzLiAgLmJzcyBhbmQgc2ltaWxhciBzZWN0aW9ucyB3b24ndCBoYXZlIHRoZSBsaW5rZXJfbWFyaworCSBmaWVsZCBzZXQuICAqLworICAgICAgaWYgKChzeW0tPnNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMAorCSAgJiYgc3ltLT5zZWN0aW9uLT5saW5rZXJfbWFyayA9PSBmYWxzZSkKKwlvdXRwdXQgPSBmYWxzZTsKKworICAgICAgaWYgKG91dHB1dCkKKwl7CisJICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sIChvdXRwdXRfYmZkLCBwc3ltYWxsb2MsIHN5bSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmIChoICE9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkgICAgaC0+d3JpdHRlbiA9IHRydWU7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBzZWN0aW9uIGFuZCB2YWx1ZSBvZiBhIGdlbmVyaWMgQkZEIHN5bWJvbCBiYXNlZCBvbiBhIGxpbmtlcgorICAgaGFzaCB0YWJsZSBlbnRyeS4gICovCisKK3N0YXRpYyB2b2lkCitzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCBoKQorICAgICBhc3ltYm9sICpzeW07CisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworeworICBzd2l0Y2ggKGgtPnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6CisgICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBzZWVuIGJ1dCB3ZSBhcmUKKyAgICAgICAgIG5vdCBidWlsZGluZyBjb25zdHJ1Y3RvcnMuICAqLworICAgICAgaWYgKHN5bS0+c2VjdGlvbiAhPSBOVUxMKQorCXsKKwkgIEJGRF9BU1NFUlQgKChzeW0tPmZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3ltLT5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7CisJICBzeW0tPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgc3ltLT52YWx1ZSA9IDA7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKKyAgICAgIHN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgICAgICBzeW0tPnZhbHVlID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6CisgICAgICBzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICAgICAgc3ltLT52YWx1ZSA9IDA7CisgICAgICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6CisgICAgICBzeW0tPnNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uOworICAgICAgc3ltLT52YWx1ZSA9IGgtPnUuZGVmLnZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6CisgICAgICBzeW0tPmZsYWdzIHw9IEJTRl9XRUFLOworICAgICAgc3ltLT5zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbjsKKyAgICAgIHN5bS0+dmFsdWUgPSBoLT51LmRlZi52YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisgICAgICBzeW0tPnZhbHVlID0gaC0+dS5jLnNpemU7CisgICAgICBpZiAoc3ltLT5zZWN0aW9uID09IE5VTEwpCisJc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKyAgICAgIGVsc2UgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQorCXsKKwkgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7CisJICBzeW0tPnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCX0KKyAgICAgIC8qIERvIG5vdCBzZXQgdGhlIHNlY3Rpb247IHNlZSBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scy4gICovCisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6CisgICAgICAvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8gICovCisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFdyaXRlIG91dCBhIGdsb2JhbCBzeW1ib2wsIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gd3JpdHRlbiBvdXQuCisgICBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICAqLworCitib29sZWFuCitfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sIChoLCBkYXRhKQorICAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKndnaW5mbyA9CisgICAgKHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyAqKSBkYXRhOworICBhc3ltYm9sICpzeW07CisKKyAgaWYgKGgtPndyaXR0ZW4pCisgICAgcmV0dXJuIHRydWU7CisKKyAgaC0+d3JpdHRlbiA9IHRydWU7CisKKyAgaWYgKHdnaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCisgICAgICB8fCAod2dpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCisJICAmJiBiZmRfaGFzaF9sb29rdXAgKHdnaW5mby0+aW5mby0+a2VlcF9oYXNoLCBoLT5yb290LnJvb3Quc3RyaW5nLAorCQkJICAgICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoaC0+c3ltICE9IChhc3ltYm9sICopIE5VTEwpCisgICAgc3ltID0gaC0+c3ltOworICBlbHNlCisgICAgeworICAgICAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sICh3Z2luZm8tPm91dHB1dF9iZmQpOworICAgICAgaWYgKCFzeW0pCisJcmV0dXJuIGZhbHNlOworICAgICAgc3ltLT5uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKyAgICAgIHN5bS0+ZmxhZ3MgPSAwOworICAgIH0KKworICBzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCAmaC0+cm9vdCk7CisKKyAgc3ltLT5mbGFncyB8PSBCU0ZfR0xPQkFMOworCisgIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKHdnaW5mby0+b3V0cHV0X2JmZCwgd2dpbmZvLT5wc3ltYWxsb2MsCisJCQkJICAgc3ltKSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBmYWlsdXJlLiAgKi8KKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ3JlYXRlIGEgcmVsb2NhdGlvbi4gICovCisKK2Jvb2xlYW4KK19iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKK3sKKyAgYXJlbGVudCAqcjsKKworICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCisgICAgYWJvcnQgKCk7CisgIGlmIChzZWMtPm9yZWxvY2F0aW9uID09IChhcmVsZW50ICoqKSBOVUxMKQorICAgIGFib3J0ICgpOworCisgIHIgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudCkpOworICBpZiAociA9PSAoYXJlbGVudCAqKSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgICAgIAorICByLT5hZGRyZXNzID0gbGlua19vcmRlci0+b2Zmc2V0OworICByLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7CisgIGlmIChyLT5ob3d0byA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBHZXQgdGhlIHN5bWJvbCB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uLiAgKi8KKyAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKKyAgICByLT5zeW1fcHRyX3B0ciA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgaCA9ICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopCisJICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywKKwkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAorCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7CisgICAgICBpZiAoaCA9PSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgIHx8ICEgaC0+d3JpdHRlbikKKwl7CisJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCisJCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCisJCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgci0+c3ltX3B0cl9wdHIgPSAmaC0+c3ltOworICAgIH0KKworICAvKiBJZiB0aGlzIGlzIGFuIGlucGxhY2UgcmVsb2MsIHdyaXRlIHRoZSBhZGRlbmQgdG8gdGhlIG9iamVjdCBmaWxlLgorICAgICBPdGhlcndpc2UsIHN0b3JlIGl0IGluIHRoZSByZWxvYyBhZGRlbmQuICAqLworICBpZiAoISByLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlKQorICAgIHItPmFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOworICBlbHNlCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBzaXplOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OworICAgICAgYmZkX2J5dGUgKmJ1ZjsKKyAgICAgIGJvb2xlYW4gb2s7CisKKyAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHItPmhvd3RvKTsKKyAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7CisgICAgICBpZiAoYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoci0+aG93dG8sIGFiZmQsCisJCQkJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQsIGJ1Zik7CisgICAgICBzd2l0Y2ggKHJzdGF0KQorCXsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgIGFib3J0ICgpOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKKwkJIChpbmZvLAorCQkgIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKKwkJICAgPyBiZmRfc2VjdGlvbl9uYW1lIChhYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbikKKwkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCisJCSAgci0+aG93dG8tPm5hbWUsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLAorCQkgIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCisJICAgIHsKKwkgICAgICBmcmVlIChidWYpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgICAgb2sgPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgKFBUUikgYnVmLAorCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOworICAgICAgZnJlZSAoYnVmKTsKKyAgICAgIGlmICghIG9rKQorCXJldHVybiBmYWxzZTsKKworICAgICAgci0+YWRkZW5kID0gMDsKKyAgICB9CisKKyAgc2VjLT5vcmVsb2NhdGlvbltzZWMtPnJlbG9jX2NvdW50XSA9IHI7CisgICsrc2VjLT5yZWxvY19jb3VudDsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEFsbG9jYXRlIGEgbmV3IGxpbmtfb3JkZXIgZm9yIGEgc2VjdGlvbi4gICovCisKK3N0cnVjdCBiZmRfbGlua19vcmRlciAqCitiZmRfbmV3X2xpbmtfb3JkZXIgKGFiZmQsIHNlY3Rpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbmV3OworCisgIG5ldyA9ICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIpKSk7CisgIGlmICghbmV3KQorICAgIHJldHVybiBOVUxMOworCisgIG5ldy0+dHlwZSA9IGJmZF91bmRlZmluZWRfbGlua19vcmRlcjsKKyAgbmV3LT5vZmZzZXQgPSAwOworICBuZXctPnNpemUgPSAwOworICBuZXctPm5leHQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7CisKKyAgaWYgKHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEwpCisgICAgc2VjdGlvbi0+bGlua19vcmRlcl90YWlsLT5uZXh0ID0gbmV3OworICBlbHNlCisgICAgc2VjdGlvbi0+bGlua19vcmRlcl9oZWFkID0gbmV3OworICBzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwgPSBuZXc7CisKKyAgcmV0dXJuIG5ldzsKK30KKworLyogRGVmYXVsdCBsaW5rIG9yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gIE5vdGUgdGhhdCB3ZSBjYW4gbm90IGhhbmRsZQorICAgdGhlIHJlbG9jX2xpbmtfb3JkZXIgdHlwZXMgaGVyZSwgc2luY2UgdGhleSBkZXBlbmQgdXBvbiB0aGUgZGV0YWlscworICAgb2YgaG93IHRoZSBwYXJ0aWN1bGFyIGJhY2tlbmRzIGdlbmVyYXRlcyByZWxvY3MuICAqLworCitib29sZWFuCitfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Cit7CisgIHN3aXRjaCAobGlua19vcmRlci0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXI6CisgICAgY2FzZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOgorICAgIGNhc2UgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyOgorICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICBjYXNlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyOgorICAgICAgcmV0dXJuIGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyLAorCQkJCQkgIGZhbHNlKTsKKyAgICBjYXNlIGJmZF9maWxsX2xpbmtfb3JkZXI6CisgICAgICByZXR1cm4gZGVmYXVsdF9maWxsX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcik7CisgICAgY2FzZSBiZmRfZGF0YV9saW5rX29yZGVyOgorICAgICAgcmV0dXJuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLAorCQkJCSAgICAgICAoUFRSKSBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMsCisJCQkJICAgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LAorCQkJCSAgICAgICBsaW5rX29yZGVyLT5zaXplKTsKKyAgICB9Cit9CisKKy8qIERlZmF1bHQgcm91dGluZSB0byBoYW5kbGUgYSBiZmRfZmlsbF9saW5rX29yZGVyLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorZGVmYXVsdF9maWxsX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworeworICBzaXplX3Qgc2l6ZTsKKyAgY2hhciAqc3BhY2U7CisgIHNpemVfdCBpOworICBpbnQgZmlsbDsKKyAgYm9vbGVhbiByZXN1bHQ7CisKKyAgQkZEX0FTU0VSVCAoKHNlYy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKTsKKworICBzaXplID0gKHNpemVfdCkgbGlua19vcmRlci0+c2l6ZTsKKyAgc3BhY2UgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzaXplKTsKKyAgaWYgKHNwYWNlID09IE5VTEwgJiYgc2l6ZSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBmaWxsID0gbGlua19vcmRlci0+dS5maWxsLnZhbHVlOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAyKQorICAgIHNwYWNlW2ldID0gZmlsbCA+PiA4OworICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSArPSAyKQorICAgIHNwYWNlW2ldID0gZmlsbDsKKyAgcmVzdWx0ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIHNwYWNlLAorCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsCisJCQkJICAgICBsaW5rX29yZGVyLT5zaXplKTsKKyAgZnJlZSAoc3BhY2UpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBEZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIGEgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlciwKKwkJCSAgICAgZ2VuZXJpY19saW5rZXIpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworICAgICBib29sZWFuIGdlbmVyaWNfbGlua2VyOworeworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgYmZkICppbnB1dF9iZmQ7CisgIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7CisgIGJmZF9ieXRlICpuZXdfY29udGVudHM7CisKKyAgQkZEX0FTU0VSVCAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApOworCisgIGlmIChsaW5rX29yZGVyLT5zaXplID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKyAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7CisKKyAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOworICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID09IGxpbmtfb3JkZXItPm9mZnNldCk7CisgIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9PSBsaW5rX29yZGVyLT5zaXplKTsKKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCisgICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDAKKyAgICAgICYmIG91dHB1dF9zZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBTcGFjZSBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgb3V0cHV0IHJlbG9jYXRpb25zLgorCSBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgY2FsbGVkIGJ5IGEgc3BlY2lmaWMgYmFja2VuZAorCSBiZWNhdXNlIHNvbWVib2R5IGlzIGF0dGVtcHRpbmcgdG8gbGluayB0b2dldGhlciBkaWZmZXJlbnQKKwkgdHlwZXMgb2Ygb2JqZWN0IGZpbGVzLiAgSGFuZGxpbmcgdGhpcyBjYXNlIGNvcnJlY3RseSBpcworCSBkaWZmaWN1bHQsIGFuZCBzb21ldGltZXMgaW1wb3NzaWJsZS4gICovCisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiQXR0ZW1wdCB0byBkbyByZWxvY2F0ZWFibGUgbGluayB3aXRoICVzIGlucHV0IGFuZCAlcyBvdXRwdXQiKSwKKwkgYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgZ2VuZXJpY19saW5rZXIpCisgICAgeworICAgICAgYXN5bWJvbCAqKnN5bXBwOworICAgICAgYXN5bWJvbCAqKnN5bXBwZW5kOworCisgICAgICAvKiBHZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgVGhlIGdlbmVyaWMgbGlua2VyIHdpbGwgYWx3YXlzCisJIGhhdmUgcmV0cmlldmVkIHRoZW0gYnkgdGhpcyBwb2ludCwgYnV0IHdlIGFyZSBiZWluZyBjYWxsZWQgYnkKKwkgYSBzcGVjaWZpYyBsaW5rZXIsIHByZXN1bWFibHkgYmVjYXVzZSB3ZSBhcmUgbGlua2luZworCSBkaWZmZXJlbnQgdHlwZXMgb2Ygb2JqZWN0IGZpbGVzIHRvZ2V0aGVyLiAgKi8KKyAgICAgIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGlucHV0X2JmZCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBTaW5jZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGJ5IGEgc3BlY2lmaWMgbGlua2VyLCByYXRoZXIgdGhhbgorCSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHRoZSB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMgd2lsbCBub3QgYmUKKwkgcmlnaHQuICBUaGV5IHdpbGwgYmUgdGhlIHZhbHVlcyBhcyBzZWVuIGluIHRoZSBpbnB1dCBmaWxlLAorCSBub3QgdGhlIHZhbHVlcyBvZiB0aGUgZmluYWwgbGluay4gIFdlIG5lZWQgdG8gZml4IHRoZW0gdXAKKwkgYmVmb3JlIHdlIGNhbiByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gICovCisgICAgICBzeW1wcCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpOworICAgICAgc3ltcHBlbmQgPSBzeW1wcCArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoaW5wdXRfYmZkKTsKKyAgICAgIGZvciAoOyBzeW1wcCA8IHN5bXBwZW5kOyBzeW1wcCsrKQorCXsKKwkgIGFzeW1ib2wgKnN5bTsKKwkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisJICBzeW0gPSAqc3ltcHA7CisKKwkgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKKwkJCSAgICAgfCBCU0ZfV0FSTklORworCQkJICAgICB8IEJTRl9HTE9CQUwKKwkJCSAgICAgfCBCU0ZfQ09OU1RSVUNUT1IKKwkJCSAgICAgfCBCU0ZfV0VBSykpICE9IDAKKwkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKKwkgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKKwkgICAgICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJICAgIHsKKwkgICAgICAvKiBzeW0tPnVkYXRhIG1heSBoYXZlIGJlZW4gc2V0IGJ5CisJCSBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0LiAgKi8KKwkgICAgICBpZiAoc3ltLT51ZGF0YS5wICE9IE5VTEwpCisJCWggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgc3ltLT51ZGF0YS5wOworCSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKKwkJaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCisJCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCisJCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJICAgICAgZWxzZQorCQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCisJCQkJCSAgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwKKwkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOworCSAgICAgIGlmIChoICE9IE5VTEwpCisJCXNldF9zeW1ib2xfZnJvbV9oYXNoIChzeW0sIGgpOworCSAgICB9CisJfQkgIAorICAgIH0KKworICAvKiBHZXQgYW5kIHJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgY29udGVudHMgPSAoKGJmZF9ieXRlICopCisJICAgICAgYmZkX21hbGxvYyAoYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSkpOworICBpZiAoY29udGVudHMgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIG5ld19jb250ZW50cyA9IChiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisJCSAgKG91dHB1dF9iZmQsIGluZm8sIGxpbmtfb3JkZXIsIGNvbnRlbnRzLCBpbmZvLT5yZWxvY2F0ZWFibGUsCisJCSAgIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChpbnB1dF9iZmQpKSk7CisgIGlmICghbmV3X2NvbnRlbnRzKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIE91dHB1dCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sCisJCQkJICAoUFRSKSBuZXdfY29udGVudHMsCisJCQkJICBsaW5rX29yZGVyLT5vZmZzZXQsIGxpbmtfb3JkZXItPnNpemUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChjb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGNvbnRlbnRzKTsKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChjb250ZW50cyAhPSBOVUxMKQorICAgIGZyZWUgKGNvbnRlbnRzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBBIGxpdHRsZSByb3V0aW5lIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVsb2NzIGluIGEgbGlua19vcmRlcgorICAgbGlzdC4gICovCisKK3Vuc2lnbmVkIGludAorX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyAobGlua19vcmRlcikKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKKyAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpsOworCisgIGMgPSAwOworICBmb3IgKGwgPSBsaW5rX29yZGVyOyBsICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgaWYgKGwtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgorCSAgfHwgbC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCisJKytjOworICAgIH0KKworICByZXR1cm4gYzsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgorCitTWU5PUFNJUworICAgICAgICBib29sZWFuIGJmZF9saW5rX3NwbGl0X3NlY3Rpb24oYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gbm9uemVybyBpZiBAdmFye3NlY30gc2hvdWxkIGJlIHNwbGl0IGR1cmluZyBhCisJcmVsb2NlYXRhYmxlIG9yIGZpbmFsIGxpbmsuCisKKy4jZGVmaW5lIGJmZF9saW5rX3NwbGl0X3NlY3Rpb24oYWJmZCwgc2VjKSBcCisuICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiwgKGFiZmQsIHNlYykpCisuCisKKyovCisKKworCitib29sZWFuCitfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKK3sKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYmZkL2x5bngtY29yZS5jIGIvYmZkL2x5bngtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTgxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbHlueC1jb3JlLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qIEJGRCBiYWNrIGVuZCBmb3IgTHlueCBjb3JlIGZpbGVzCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2lmZGVmIExZTlhfQ09SRQorCisjaW5jbHVkZSA8c3lzL2NvbmYuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisvKiBzeXMva2VybmVsLmggc2hvdWxkIGRlZmluZSB0aGlzLCBidXQgZG9lc24ndCBhbHdheXMsIHNpZ2guICovCisjaWZuZGVmIF9fTFlOWE9TCisjZGVmaW5lIF9fTFlOWE9TCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvbWVtLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL2l0aW1lci5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKworLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KKworc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgCit7CisgIGludCBzaWc7CisgIGNoYXIgY21kW1BOTUxFTiArIDFdOworfTsKKworI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEubHlueF9jb3JlX2RhdGEpCisjZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKKyNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKKworLyogSGFuZGxlIEx5bnggY29yZSBkdW1wIGZpbGUuICAqLworCitzdGF0aWMgYXNlY3Rpb24gKgorbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKKyAgICAgYmZkICphYmZkOworICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBmbGFnd29yZCBmbGFnczsKKyAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7CisgICAgIGJmZF92bWEgdm1hOworICAgICBmaWxlX3B0ciBmaWxlcG9zOworeworICBhc2VjdGlvbiAqYXNlY3Q7CisgIGNoYXIgKm5ld25hbWU7CisKKyAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lKSArIDEpOworICBpZiAoIW5ld25hbWUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc3RyY3B5IChuZXduYW1lLCBuYW1lKTsKKworICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5ld25hbWUpOworICBpZiAoIWFzZWN0KQorICAgIHJldHVybiBOVUxMOworCisgIGFzZWN0LT5mbGFncyA9IGZsYWdzOworICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOworICBhc2VjdC0+dm1hID0gdm1hOworICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7CisgIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOworCisgIHJldHVybiBhc2VjdDsKK30KKworLyogQVJHU1VTRUQgKi8KK2NvbnN0IGJmZF90YXJnZXQgKgorbHlueF9jb3JlX2ZpbGVfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpbnQgdmFsOworICBpbnQgc2VjbnVtOworICBzdHJ1Y3QgcHNzZW50cnkgcHNzOworICBzaXplX3QgdGNvbnRleHRfc2l6ZTsKKyAgY29yZV9zdF90ICp0aHJlYWRwOworICBpbnQgcGFnZXNpemU7CisgIGFzZWN0aW9uICpuZXdzZWN0OworCisgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CS8qIFNlcmlvdXMgY3Jvc3MtdGFyZ2V0IGlzc3VlIGhlcmUuLi4gIFRoaXMKKwkJCQkgICByZWFsbHkgbmVlZHMgdG8gY29tZSBmcm9tIGEgc3lzdGVtLXNwZWNpZmljCisJCQkJICAgaGVhZGVyIGZpbGUuICAqLworCisgIC8qIEdldCB0aGUgcHNzIGVudHJ5IGZyb20gdGhlIGNvcmUgZmlsZSAqLworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnBzcywgMSwgc2l6ZW9mIHBzcywgYWJmZCk7CisgIGlmICh2YWwgIT0gc2l6ZW9mIHBzcykKKyAgICB7CisgICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKikKKyAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBseW54X2NvcmVfc3RydWN0KSk7CisKKyAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgcHNzLnBuYW1lLCBQTk1MRU4gKyAxKTsKKworICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgY29udGV4dHMgKi8KKworICB0Y29udGV4dF9zaXplID0gcHNzLnRocmVhZGNudCAqIHNpemVvZiAoY29yZV9zdF90KTsKKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRocmVhZCBjb250ZXh0cyAqLworCisgIHRocmVhZHAgPSAoY29yZV9zdF90ICopYmZkX2FsbG9jIChhYmZkLCB0Y29udGV4dF9zaXplKTsKKyAgaWYgKCF0aHJlYWRwKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFNhdmUgdGhyZWFkIGNvbnRleHRzICovCisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBwYWdlc2l6ZSwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopdGhyZWFkcCwgcHNzLnRocmVhZGNudCwgc2l6ZW9mIChjb3JlX3N0X3QpLCBhYmZkKTsKKworICBpZiAodmFsICE9IHRjb250ZXh0X3NpemUpCisgICAgeworICAgICAgLyogUHJvYmFibHkgdG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBjb3JlX3NpZ25hbCAoYWJmZCkgPSB0aHJlYWRwLT5jdXJyc2lnOworCisgIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCisJCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAorCQkJICAgICAgIHBzcy5zc2l6ZSwKKwkJCSAgICAgICBwc3Muc2xpbWl0LAorCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSk7CisgIGlmICghbmV3c2VjdCkKKyAgICByZXR1cm4gTlVMTDsKKworICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCisJCQkgICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAorCQkJICAgICAgIHBzcy5kYXRhX2xlbiArIHBzcy5ic3NfbGVuLAorCQkJICAgICAgIHBzcy5kYXRhX3N0YXJ0LAorCQkJICAgICAgIHBhZ2VzaXplICsgdGNvbnRleHRfc2l6ZSArIHBzcy5zc2l6ZQorI2lmIGRlZmluZWQgKFNQQVJDKSB8fCBkZWZpbmVkIChfX1NQQVJDX18pCisJCQkgICAgICAgLyogU1BBUkMgTHlueCBzZWVtcyB0byBzdGFydCBkdW1waW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5kYXRhIHNlY3Rpb24gYXQgYSBwYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkuICBJdCdzIE9LIHRvIGNoZWNrIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGxpa2UgU1BBUkMgaGVyZSBiZWNhdXNlIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIGEgTHlueAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuICAqLworCQkJICAgICAgICsgcHNzLmRhdGFfc3RhcnQgJSBwYWdlc2l6ZQorI2VuZGlmCisJCQkgICAgICAgKTsKKyAgaWYgKCFuZXdzZWN0KQorICAgIHJldHVybiBOVUxMOworCisvKiBBbmQsIG5vdyBmb3IgdGhlIC5yZWcvWFhYIHBzZXVkbyBzZWN0aW9ucy4gIEVhY2ggdGhyZWFkIGhhcyBpdCdzIG93bgorICAgLnJlZy9YWFggc2VjdGlvbiwgd2hlcmUgWFhYIGlzIHRoZSB0aHJlYWQgaWQgKHdpdGhvdXQgbGVhZGluZyB6ZXJvcykuICBUaGUKKyAgIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZCAoYXQgdGhlIHRpbWUgb2YgdGhlIGNvcmUgZHVtcCkgYWxzbyBoYXMgYW4gYWxpYXMKKyAgIGNhbGxlZCBgLnJlZycgKGp1c3QgdG8ga2VlcCBHREIgaGFwcHkpLiAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFgnIGFzCisgICBvcHBvc2VkIHRvIGAucmVnWFhYJyBiZWNhdXNlIEdEQiBleHBlY3RzIHRoYXQgLnJlZzIgd2lsbCBiZSB0aGUgZmxvYXRpbmctCisgICBwb2ludCByZWdpc3RlcnMuICAqLworCisgIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAorCQkJICAgICAgIFNFQ19IQVNfQ09OVEVOVFMsCisJCQkgICAgICAgc2l6ZW9mIChjb3JlX3N0X3QpLAorCQkJICAgICAgIDAsCisJCQkgICAgICAgcGFnZXNpemUpOworICBpZiAoIW5ld3NlY3QpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChzZWNudW0gPSAwOyBzZWNudW0gPCBwc3MudGhyZWFkY250OyBzZWNudW0rKykKKyAgICB7CisgICAgICBjaGFyIHNlY25hbWVbMTAwXTsKKworICAgICAgc3ByaW50ZiAoc2VjbmFtZSwgIi5yZWcvJWQiLCBCVUlMRFBJRCAoMCwgdGhyZWFkcFtzZWNudW1dLnRpZCkpOworICAgICAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAorCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMsCisJCQkJICAgc2l6ZW9mIChjb3JlX3N0X3QpLAorCQkJCSAgIDAsCisJCQkJICAgcGFnZXNpemUgKyBzZWNudW0gKiBzaXplb2YgKGNvcmVfc3RfdCkpOworICAgICAgaWYgKCFuZXdzZWN0KQorCXJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKworY2hhciAqCitseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitpbnQKK2x5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitib29sZWFuCitseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKKyAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOworeworICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KK30KKworI2VuZGlmIC8qIExZTlhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL202OGs0a25ldGJzZC5jIGIvYmZkL202OGs0a25ldGJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzQzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbTY4azRrbmV0YnNkLmMKQEAgLTAsMCArMSwzMiBAQAorLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBCWVRFU19JTl9XT1JECTQKKyNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorCisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgxMDAwCisKKyNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKKyNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLNEtfTkVUQlNECisKKyNkZWZpbmUgTVkoT1ApIENBVChtNjhrNGtuZXRic2RfLE9QKQorLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4azRrLW5ldGJzZCIKKworI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtsaW51eC5jIGIvYmZkL202OGtsaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjQ3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbTY4a2xpbnV4LmMKQEAgLTAsMCArMSw3NzIgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgbGludXggZmxhdm9yZWQgbTY4ayBhLm91dCBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFIDQwOTYKKyNkZWZpbmUgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSAxMDI0CisjZGVmaW5lCVNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCisjZGVmaW5lIFRFWFRfU1RBUlRfQUREUgkweDAKKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CisKKyNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fNjgwMjAgfHwgKG10eXBlKSA9PSBNX1VOS05PV04pCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKyNpbmNsdWRlICJhb3V0L2FyLmgiCisjaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKKyNkZWZpbmUgTVkoT1ApIENBVChtNjhrbGludXhfLE9QKQorI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLWxpbnV4IgorCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOworCisvKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKKyAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgorICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLworCitzdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCisgIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7CitzdGF0aWMgYm9vbGVhbiBtNjhrbGludXhfYmZkX2ZpbmFsX2xpbmsKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIG02OGtsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGJvb2xlYW4KK202OGtsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OworICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKK30KKworI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBtNjhrbGludXhfYmZkX2ZpbmFsX2xpbmsKKworLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK202OGtsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fNjgwMjApOworCisgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOworCisgIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOworCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBtNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCisMCisvKiBDb2RlIHRvIGxpbmsgYWdhaW5zdCBMaW51eCBhLm91dCBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKworLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworCisjaWZuZGVmIEdPVF9SRUZfUFJFRklYCisjZGVmaW5lCUdPVF9SRUZfUFJFRklYCSJfX0dPVF8iCisjZW5kaWYKKworI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKKyAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQorCisvKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworCisjaWZuZGVmIFBMVF9SRUZfUFJFRklYCisjZGVmaW5lCVBMVF9SRUZfUFJFRklYCSJfX1BMVF8iCisjZW5kaWYKKworI2RlZmluZSBJU19QTFRfU1lNKG5hbWUpIFwKKyAgKHN0cm5jbXAgKG5hbWUsIFBMVF9SRUZfUFJFRklYLCBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSA9PSAwKQorCisvKiBUaGlzIHN0cmluZyBpcyB1c2VkIHRvIGdlbmVyYXRlIHNwZWNpYWxpemVkIGVycm9yIG1lc3NhZ2VzLiAgKi8KKworI2lmbmRlZiBORUVEU19TSFJMSUIKKyNkZWZpbmUgTkVFRFNfU0hSTElCICJfX05FRURTX1NIUkxJQl8iCisjZW5kaWYKKworLyogVGhpcyBzcGVjaWFsIHN5bWJvbCBpcyBhIHNldCB2ZWN0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YKKyAgIHBvaW50ZXJzIHRvIGZpeHVwIHRhYmxlcy4gIEl0IHdpbGwgYmUgcHJlc2VudCBpbiBhbnkgZHluYW1pY2x5CisgICBsaW5rZWQgZmlsZS4gIFRoZSBsaW5rZXIgZ2VuZXJhdGVkIGZpeHVwIHRhYmxlIHNob3VsZCBhbHNvIGJlIGFkZGVkCisgICB0byB0aGUgbGlzdCwgYW5kIGl0IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzZWNvbmQgc2xvdCAodGhlCisgICBmaXJzdCBvbmUgaXMgYSBkdW1teSB3aXRoIGEgbWFnaWMgbnVtYmVyIHRoYXQgaXMgZGVmaW5lZCBpbgorICAgY3J0MC5vKS4gICovCisKKyNpZm5kZWYgU0hBUkFCTEVfQ09ORkxJQ1RTCisjZGVmaW5lIFNIQVJBQkxFX0NPTkZMSUNUUyAiX19TSEFSQUJMRV9DT05GTElDVFNfXyIKKyNlbmRpZgorCisvKiBXZSBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBUaGUgdGVybWlub2xvZ3kgaXMgYSBiaXQgc3RyYW5nZSwgYnV0CisgICBlYWNoIGZpeHVwIGNvbnRhaW5zIHR3byAzMiBiaXQgbnVtYmVycy4gIEEgcmVndWxhciBmaXh1cCBjb250YWlucworICAgYW4gYWRkcmVzcyBhbmQgYSBwb2ludGVyLCBhbmQgYXQgcnVudGltZSB3ZSBzaG91bGQgc3RvcmUgdGhlCisgICBhZGRyZXNzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBwb2ludGVyLiAgQSBidWlsdGluIGZpeHVwCisgICBjb250YWlucyB0d28gcG9pbnRlcnMsIGFuZCB3ZSBzaG91bGQgcmVhZCB0aGUgYWRkcmVzcyB1c2luZyBvbmUKKyAgIHBvaW50ZXIgYW5kIHN0b3JlIGl0IGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBvdGhlcgorICAgcG9pbnRlci4gIEJ1aWx0aW4gZml4dXBzIGNvbWUgaW50byBwbGF5IHdoZW4gd2UgaGF2ZSBkdXBsaWNhdGUKKyAgIF9fR09UX18gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUuICBUaGUgYnVpbHRpbiBmaXh1cCB3aWxsIGNvcHkKKyAgIHRoZSBHT1QgcG9pbnRlciBmcm9tIG9uZSBvdmVyIGludG8gdGhlIG90aGVyLiAgKi8KKworc3RydWN0IGZpeHVwCit7CisgIHN0cnVjdCBmaXh1cCAqbmV4dDsKKyAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgYmZkX3ZtYSB2YWx1ZTsKKworICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBqdW1wIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQsCisgICAgIHplcm8gaWYgdGhpcyBpcyBqdXN0IGEgcG9pbnRlciAqLworICBjaGFyIGp1bXA7CisKKyAgY2hhciBidWlsdGluOworfTsKKworLyogV2UgZG9uJ3QgbmVlZCBhIHNwZWNpYWwgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUsIGJ1dCB3ZSBkbyBuZWVkCisgICB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYmV0d2VlbiBsaW5rZXIgcGFzc2VzLCBzbyB3ZSB1c2UgYSBzcGVjaWFsCisgICBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgcm9vdDsKK307CisKK3N0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisKKyAgLyogRmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gbGluay4gICovCisgIGJmZCAqZHlub2JqOworCisgIC8qIE51bWJlciBvZiBmaXh1cHMuICAqLworICBzaXplX3QgZml4dXBfY291bnQ7CisKKyAgLyogTnVtYmVyIG9mIGJ1aWx0aW4gZml4dXBzLiAgKi8KKyAgc2l6ZV90IGxvY2FsX2J1aWx0aW5zOworCisgIC8qIExpc3Qgb2YgZml4dXBzLiAgKi8KKyAgc3RydWN0IGZpeHVwICpmaXh1cF9saXN0OworfTsKKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbGludXhfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHN0cnVjdCBmaXh1cCAqbmV3X2ZpeHVwCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwKKwkgICBiZmRfdm1hLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGxpbnV4X2FkZF9vbmVfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAorCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOworc3RhdGljIGJvb2xlYW4gbGludXhfdGFsbHlfc3ltYm9scworICBQQVJBTVMgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gbGludXhfZmluaXNoX2R5bmFtaWNfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK2xpbnV4X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCisJIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAorCQkJCSAgICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgbG9jYWwgZmllbGRzOyB0aGVyZSBhcmVuJ3QgYW55LiAgKi8KKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBDcmVhdGUgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICpyZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopCisJIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorICBpZiAoISBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpICgmcmV0LT5yb290LCBhYmZkLAorCQkJCQkgbGludXhfbGlua19oYXNoX25ld2Z1bmMpKQorICAgIHsKKyAgICAgIGZyZWUgKHJldCk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorCisgIHJldC0+ZHlub2JqID0gTlVMTDsKKyAgcmV0LT5maXh1cF9jb3VudCA9IDA7CisgIHJldC0+bG9jYWxfYnVpbHRpbnMgPSAwOworICByZXQtPmZpeHVwX2xpc3QgPSBOVUxMOworCisgIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Cit9CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKKyAgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopIFwKKyAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKKwkJCSAgKGZvbGxvdykpKQorCisvKiBUcmF2ZXJzZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgbGludXhfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKKyAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAorICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCisgICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCisgICAgKGluZm8pKSkKKworLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCisgICBqdXN0IGEgY2FzdC4gICovCisKKyNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCisKKy8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLworCitzdGF0aWMgc3RydWN0IGZpeHVwICoKK25ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBpbnQgYnVpbHRpbjsKK3sKKyAgc3RydWN0IGZpeHVwICpmOworCisgIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCisJCQkJCSAgc2l6ZW9mIChzdHJ1Y3QgZml4dXApKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gZjsKKyAgZi0+bmV4dCA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OworICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdCA9IGY7CisgIGYtPmggPSBoOworICBmLT52YWx1ZSA9IHZhbHVlOworICBmLT5idWlsdGluID0gYnVpbHRpbjsKKyAgZi0+anVtcCA9IDA7CisgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OworICByZXR1cm4gZjsKK30KKworLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgcmVhbGl6ZSB0aGF0IHdlIGFyZSBnb2luZyB0byBsaW5rIHRvIGEgc2hhcmVkCisgICBsaWJyYXJ5LiAgV2UgbmVlZCB0byBjcmVhdGUgYSBzcGVjaWFsIHNlY3Rpb24gdGhhdCBjb250YWlucyB0aGUKKyAgIGZpeHVwIHRhYmxlLCBhbmQgd2UgdWx0aW1hdGVseSBuZWVkIHRvIGFkZCBhIHBvaW50ZXIgdG8gdGhpcyBpbnRvCisgICB0aGUgc2V0IHZlY3RvciBmb3IgU0hBUkFCTEVfQ09ORkxJQ1RTLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QKKyAgIGtub3cgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGJ1dCB0aGF0J3MgT0sgLSB3ZSBqdXN0IG5lZWQgdG8KKyAgIGNyZWF0ZSBpdCBmb3Igbm93LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGZsYWd3b3JkIGZsYWdzOworICByZWdpc3RlciBhc2VjdGlvbiAqczsKKworICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLworICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7CisKKyAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCisgICAgIFdoeSBub3Q/ICovCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHMtPl9yYXdfc2l6ZSA9IDA7CisgIHMtPmNvbnRlbnRzID0gMDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCisgICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCisgICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKKwkJICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGZsYWd3b3JkIGZsYWdzOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgICBib29sZWFuIGNvcHk7CisgICAgIGJvb2xlYW4gY29sbGVjdDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKK3sKKyAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgYm9vbGVhbiBpbnNlcnQ7CisKKyAgLyogTG9vayB1cCBhbmQgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgICAgSWYgd2UgZG8sIGFuZCB0aGUgZGVmaW5pbmcgZW50cnkgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCB3ZQorICAgICBuZWVkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucy4KKworICAgICBGSVhNRTogV2hhdCBpZiBhYmZkLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3I/ICBXZSBtYXkgd2FudCB0bworICAgICBiZSBhYmxlIHRvIGxpbmsgTGludXggYS5vdXQgYW5kIEVMRiBvYmplY3RzIHRvZ2V0aGVyLCBidXQgc2VyaW91cworICAgICBjb25mdXNpb24gaXMgcG9zc2libGUuICAqLworCisgIGluc2VydCA9IGZhbHNlOworCisgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQorICAgICAgJiYgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMCisgICAgICAmJiBzdHJjbXAgKG5hbWUsIFNIQVJBQkxFX0NPTkZMSUNUUykgPT0gMAorICAgICAgJiYgKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCisgICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCisgICAgeworICAgICAgaWYgKCEgbGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykpCisJcmV0dXJuIGZhbHNlOworICAgICAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGFiZmQ7CisgICAgICBpbnNlcnQgPSB0cnVlOworICAgIH0KKworICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWN0aW9uKQorICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQorICAgIHsKKyAgICAgIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgZmFsc2UsCisJCQkJICBmYWxzZSwgZmFsc2UpOworICAgICAgaWYgKGggIT0gTlVMTAorCSAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisJeworCSAgc3RydWN0IGZpeHVwICpmOworCisJICBpZiAoaGFzaHAgIT0gTlVMTCkKKwkgICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7CisKKwkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCAhIElTX1BMVF9TWU0gKG5hbWUpKTsKKwkgIGlmIChmID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGYtPmp1bXAgPSBJU19QTFRfU1lNIChuYW1lKTsKKworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH0KKworICAvKiBEbyB0aGUgdXN1YWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBzeW1ib2wuICAqLworICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCisJCQkJCSAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKKwkJCQkJICBoYXNocCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKKyAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KKyAgaWYgKGluc2VydCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKworICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCisJIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAorCQkJCSAgICIubGludXgtZHluYW1pYyIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAorCSAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KKyAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKKyAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCisgICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAorICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAorICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQorICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitsaW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQorICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKKyAgc3RydWN0IGZpeHVwICpmLCAqZjE7CisgIGludCBpc19wbHQ7CisgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7CisgIGJvb2xlYW4gZXhpc3RzOworCisgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCisJCSAgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDEpID09IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIGNoYXIgKnA7CisgICAgICBjaGFyICphbGxvYyA9IE5VTEw7CisKKyAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcgKyBzaXplb2YgTkVFRFNfU0hSTElCIC0gMTsKKyAgICAgIHAgPSBzdHJyY2hyIChuYW1lLCAnXycpOworICAgICAgaWYgKHAgIT0gTlVMTCkKKwlhbGxvYyA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKKworICAgICAgaWYgKHAgPT0gTlVMTCB8fCBhbGxvYyA9PSBOVUxMKQorCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzJ1xuIiksCisJCQkgICAgICAgbmFtZSk7CisgICAgICBlbHNlCisJeworCSAgc3RyY3B5IChhbGxvYywgbmFtZSk7CisJICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7CisJICAqcCsrID0gJ1wwJzsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCisJICAgICBhbGxvYywgcCk7CisJICBmcmVlIChhbGxvYyk7CisJfQorCisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0IGl0ICovCisgIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7CisKKyAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQorICAgIHsKKyAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKKwkgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKKwkgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCisgICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAorCQkJCSAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKKwkJCQkgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKKwkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCisgICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKKwkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCisJCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCisJCQkJICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgIC8qIFRoZSByZWFsIHN5bWJvbCBtdXN0IGV4aXN0IGJ1dCBpZiBpdCBpcyBhbHNvIGFuIEFCUyBzeW1ib2wsCisJIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBhIGZpeHVwLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgYm90aAorCSBjYW1lIGZyb20gdGhlIHNhbWUgbGlicmFyeS4gIElmIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYWQgdG8KKwkgdXNlIGFuIGluZGlyZWN0IHN5bWJvbCB0byBnZXQgdG8gdGhlIHJlYWwgc3ltYm9sLCB3ZSBhZGQgdGhlCisJIGZpeHVwIGFueXdheSwgc2luY2UgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZXNlIHN5bWJvbHMgY29tZQorCSBmcm9tIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyaWVzICovCisgICAgICBpZiAoaDEgIT0gTlVMTAorCSAgJiYgKCgoaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQl8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKKwkgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCisJeworCSAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAorCSAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCisJICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKKwkgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCisJICBleGlzdHMgPSBmYWxzZTsKKwkgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKKwkgICAgICAgZjEgIT0gTlVMTDsKKwkgICAgICAgZjEgPSBmMS0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKKwkJICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKKwkJY29udGludWU7CisJICAgICAgaWYgKGYxLT5oID09IGgxKQorCQlleGlzdHMgPSB0cnVlOworCSAgICAgIGlmICghIGV4aXN0cworCQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQorCQl7CisJCSAgZiA9IG5ld19maXh1cCAoaW5mbywgaDEsIGYxLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOworCQkgIGYtPmp1bXAgPSBpc19wbHQ7CisJCX0KKwkgICAgICBmMS0+aCA9IGgxOworCSAgICAgIGYxLT5qdW1wID0gaXNfcGx0OworCSAgICAgIGYxLT5idWlsdGluID0gMDsKKwkgICAgICBleGlzdHMgPSB0cnVlOworCSAgICB9CisJICBpZiAoISBleGlzdHMKKwkgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKKwkgICAgeworCSAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOworCSAgICAgIGlmIChmID09IE5VTEwpCisJCXsKKwkJICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBmLT5qdW1wID0gaXNfcGx0OworCSAgICB9CisJfQorCisgICAgICAvKiBRdWljayBhbmQgZGlydHkgd2F5IG9mIHN0cmlwcGluZyB0aGVzZSBzeW1ib2xzIGZyb20gdGhlCisJIHN5bXRhYi4gKi8KKyAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKKwloLT5yb290LndyaXR0ZW4gPSB0cnVlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSAubGludXgtZHluYW1pYyBzZWN0aW9uIGlzLgorICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMaW51eCBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uCisgICByb3V0aW5lLiAgV2UgaGF2ZSBmaW5pc2hlZCByZWFkaW5nIGFsbCBvZiB0aGUgaW5wdXQgZmlsZXMsIGFuZCBub3cKKyAgIHdlIGp1c3Qgc2NhbiB0aGUgaGFzaCB0YWJsZXMgdG8gZmluZCBvdXQgaG93IG1hbnkgYWRkaXRpb25hbCBmaXh1cHMKKyAgIGFyZSByZXF1aXJlZC4gICovCisKK2Jvb2xlYW4KK2JmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzdHJ1Y3QgZml4dXAgKmY7CisgIGFzZWN0aW9uICpzOworCisgIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLworICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAorCQkJICAgIGxpbnV4X3RhbGx5X3N5bWJvbHMsCisJCQkgICAgKFBUUikgaW5mbyk7CisKKyAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKKyAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdworICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCisgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChmLT5idWlsdGluKQorCXsKKwkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OworCSAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCisJYWJvcnQgKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCisJCQkgICAgICAgIi5saW51eC1keW5hbWljIik7CisgIGlmIChzICE9IE5VTEwpCisgICAgeworICAgICAgcy0+X3Jhd19zaXplID0gOCArIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAqIDg7CisgICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBtZW1zZXQgKHMtPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzLT5fcmF3X3NpemUpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgYXJlIHJlYWR5IHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBmaXh1cCB0YWJsZSB0bworICAgdGhlIG91dHB1dCBmaWxlLiAgU2NhbiB0aGUgZml4dXAgdGFibGVzIGFuZCBzbyBmb3J0aCBhbmQgZ2VuZXJhdGUKKyAgIHRoZSBzdHVmZiB3ZSBuZWVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGFzZWN0aW9uICpzLCAqb3MsICppczsKKyAgYmZkX2J5dGUgKmZpeHVwX3RhYmxlOworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOworICBzdHJ1Y3QgZml4dXAgKmY7CisgIHVuc2lnbmVkIGludCBuZXdfYWRkcjsKKyAgaW50IHNlY3Rpb25fb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgZml4dXBzX3dyaXR0ZW47CisKKyAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCisJCQkgICAgICAgIi5saW51eC1keW5hbWljIik7CisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247CisgIGZpeHVwc193cml0dGVuID0gMDsKKworI2lmZGVmIExJTlVYX0xJTktfREVCVUcKKyAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLCAKKwkgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKKwkgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKKyNlbmRpZgorCisgIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7CisgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOworICBmaXh1cF90YWJsZSArPSA0OworCisgIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLworICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoZi0+YnVpbHRpbikKKwljb250aW51ZTsKKworICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAorCSAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKKyAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7CisKKyNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCisgICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCisJICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKKyNlbmRpZgorCisgICAgICBpZiAoZi0+anVtcCkKKwl7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlICsgMiwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKKwkgIGZpeHVwX3RhYmxlICs9IDQ7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwl9CisgICAgICArK2ZpeHVwc193cml0dGVuOworICAgIH0KKworICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zICE9IDApCisgICAgeworICAgICAgLyogU3BlY2lhbCBtYXJrZXIgc28gd2Uga25vdyB0byBzd2l0Y2ggdG8gdGhlIG90aGVyIHR5cGUgb2YgZml4dXAgKi8KKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKyAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7CisgICAgICBmaXh1cF90YWJsZSArPSA0OworICAgICAgKytmaXh1cHNfd3JpdHRlbjsKKyAgICAgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorCXsKKwkgIGlmICghIGYtPmJ1aWx0aW4pCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCShfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCisJCSBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247CisJICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7CisJICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OworCisjaWZkZWYgTElOVVhfTElOS19ERUJVRworCSAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAorCQkgIG5ld19hZGRyLCBmLT52YWx1ZSk7CisjZW5kaWYKKworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKKwkgIGZpeHVwX3RhYmxlICs9IDQ7CisJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwkgICsrZml4dXBzX3dyaXR0ZW47CisJfQorICB9CisKKyAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCAhPSBmaXh1cHNfd3JpdHRlbikKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iKSk7CisgICAgICB3aGlsZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ID4gZml4dXBzX3dyaXR0ZW4pCisJeworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOworCSAgZml4dXBfdGFibGUgKz0gNDsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKwkgIGZpeHVwX3RhYmxlICs9IDQ7CisJICArK2ZpeHVwc193cml0dGVuOworCX0KKyAgICB9CisKKyAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCAKKwkJCSAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAorCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisKKyAgaWYgKGggIT0gTlVMTAorICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKyAgICB7CisgICAgICBpcyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OworICAgICAgbmV3X2FkZHIgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKKworI2lmZGVmIExJTlVYX0xJTktfREVCVUcKKyAgICAgIHByaW50ZiAoIkJ1aWx0aW4gZml4dXAgdGFibGUgYXQgJXhcbiIsIG5ld19hZGRyKTsKKyNlbmRpZgorCisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOworICAgIH0KKyAgZWxzZQorICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKworICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMtPmNvbnRlbnRzLCAxLCBzLT5fcmF3X3NpemUsIG91dHB1dF9iZmQpCisgICAgICAhPSBzLT5fcmF3X3NpemUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgbGludXhfYWRkX29uZV9zeW1ib2wKKyNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBsaW51eF9maW5pc2hfZHluYW1pY19saW5rCisKKyNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMQorCisjaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tNjhrbHlueC5jIGIvYmZkL202OGtseW54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjZGZiYwotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9tNjhrbHlueC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgbTY4ayBiaW5hcmllcyB1bmRlciBMeW54T1MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKKworI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAorI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX202OGsKKworI2RlZmluZSBNWShPUCkgQ0FUKG02OGtseW54X2FvdXRfLE9QKQorI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLWx5bngiCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgImxpYmFvdXQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorCisjZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKworI2lmZGVmIExZTlhfQ09SRQorCitjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoKTsKK2ludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCgpOworYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCgpOworY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCgpOworCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAorI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyNkZWZpbmUJTVlfY29yZV9maWxlX3AgbHlueF9jb3JlX2ZpbGVfcAorCisjZW5kaWYgLyogTFlOWF9DT1JFICovCisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtuZXRic2QuYyBiL2JmZC9tNjhrbmV0YnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkMTY2NQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9tNjhrbmV0YnNkLmMKQEAgLTAsMCArMSwzNCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAorI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCisKKy8qIE91ciBtNjhrIHBvcnRzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCisgICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gYWxsIG02OGsgbWFjaGluZXMuICovCisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCisKKyNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKKyNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLX05FVEJTRAorCisjZGVmaW5lIE1ZKE9QKSBDQVQobTY4a25ldGJzZF8sT1ApCisvKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLworI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLW5ldGJzZCIKKworI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL204OGttYWNoMy5jIGIvYmZkL204OGttYWNoMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNTY0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbTg4a21hY2gzLmMKQEAgLTAsMCArMSwzOCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBNb3Rvcm9sYSBtODhrIGEub3V0IChNYWNoIDMpIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkoNDA5NioyKQorI2RlZmluZSBTRUdNRU5UX1NJWkUJMHgyMDAwMAorI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMAorI2RlZmluZSBCWVRFU19JTl9XT1JECTQKKyNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxIAkJLyogKE5fTUFHSUcoeCkgPT0gWk1BR0lDKSAqLworI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAorCisjZGVmaW5lIE5fVFhUU0laRSh4KQkoKHgpLmFfdGV4dCkKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIKKworI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTg4aworI2RlZmluZSBNWShPUCkgQ0FUKG04OGttYWNoM18sT1ApCisjZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW04OGstbWFjaDMiCisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL21ha2VmaWxlLmRvcyBiL2JmZC9tYWtlZmlsZS5kb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMmM2YQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9tYWtlZmlsZS5kb3MKQEAgLTAsMCArMSw0OSBAQAorQ0ZMQUdTPS1PMgorCisuYy5vIDoKKwlnY2MgJChDRkxBR1MpIC1JLiAtSS4uL2luY2x1ZGUgLWMgJDwKKworYWxsIDogbGliYmZkLmEKKwordGFyZ2V0cy5vIDogdGFyZ2V0cy5jCisJZ2NjICQoQ0ZMQUdTKSAtSS4gLUkuLi9pbmNsdWRlIC1EU0VMRUNUX1ZFQ1M9JmdvMzJjb2ZmX3ZlYywmaTM4NmFvdXRfdmVjIC1EREVGQVVMVF9WRUNUT1I9Z28zMmNvZmZfdmVjIC1jICQqLmMKKworYXJjaHVyZXMubyA6IGFyY2h1cmVzLmMKKwlnY2MgJChDRkxBR1MpIC1JLiAtSS4uL2luY2x1ZGUgLURTRUxFQ1RfQVJDSElURUNUVVJFUz1iZmRfaTM4Nl9hcmNoIC1jICQqLmMKKworT0JKUyA9IFwKKwlsaWJiZmQubyBcCisJb3BuY2xzLm8gXAorCWJmZC5vIFwKKwlhcmNoaXZlLm8gXAorCXRhcmdldHMubyBcCisJY2FjaGUubyBcCisJYXJjaHVyZXMubyBcCisJY29yZWZpbGUubyBcCisJc2VjdGlvbi5vIFwKKwlmb3JtYXQubyBcCisJc3ltcy5vIFwKKwlyZWxvYy5vIFwKKwlpbml0Lm8gXAorCWNvZmZnZW4ubyBcCisJc3JlYy5vIFwKKwloYXNoLm8gXAorCWxpbmtlci5vIFwKKwllY29mZi5vIFwKKwllY29mZmxpbmsubyBcCisJZWxmLm8gXAorCWFvdXQzMi5vIFwKKwlzdGFiLXN5bS5vIFwKKwlpMzg2YW91dC5vIFwKKwljcHUtaTM4Ni5vIFwKKwljb2ZmLWdvMzIubyBcCisJY29mZmxpbmsubyBcCisJZWxmMzIubyBcCisJYmluYXJ5Lm8gXAorCXRla2hleC5vIFwKKwkkRQorCitsaWJiZmQuYSA6ICQoT0JKUykKKwktcm0gbGliYmZkLmEKKwlhciBydnMgbGliYmZkLmEgJChPQkpTKQorCXJhbmxpYiBsaWJiZmQuYQpkaWZmIC0tZ2l0IGEvYmZkL21ha2VmaWxlLnZtcyBiL2JmZC9tYWtlZmlsZS52bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2YjFmZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9tYWtlZmlsZS52bXMKQEAgLTAsMCArMSw3NSBAQAorIworIyBNYWtlZmlsZSBmb3IgYmZkIGxpYnJhcnkgdW5kZXIgb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKKyMKKyMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKKyMKKyMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcm1pLmRlCisjCisjCisKK0NDPWNjCisKK2lmZXEgKCQoQVJDSCksQUxQSEEpCitIT1NURklMRT1hbHBoYXZtcy5oCitUQVJHRVRPQkpTID0gY3B1LWFscGhhLm9iagorZWxzZQorSE9TVEZJTEU9dmF4dm1zLmgKK1RBUkdFVE9CSlMgPSBjcHUtdmF4Lm9iagorZW5kaWYKKworCitPQkpTPWFyY2hpdmUub2JqLGFyY2h1cmVzLm9iaixiZmQub2JqLGNhY2hlLm9iaixjb2ZmZ2VuLm9iaixjb3JlZmlsZS5vYmosXAorICBmb3JtYXQub2JqLGluaXQub2JqLGxpYmJmZC5vYmosb3BuY2xzLm9iaixyZWxvYy5vYmosc2VjdGlvbi5vYmosc3ltcy5vYmosXAorICB0YXJnZXRzLm9iaixoYXNoLm9iaixsaW5rZXIub2JqLGVsZi5vYmosc3JlYy5vYmosYmluYXJ5Lm9iaix0ZWtoZXgub2JqLFwKKyAgaWhleC5vYmosc3RhYi1zeW1zLm9iaix2bXMub2JqLHZtcy1oZHIub2JqLHZtcy1nc2Qub2JqLHZtcy10aXIub2JqLFwKKyAgdm1zLW1pc2Mub2JqLCQoVEFSR0VUT0JKUykKKworaWZlcSAoJChDQyksZ2NjKQoraWZlcSAoJChBUkNIKSxBTFBIQSkKK0RFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfYWxwaGFfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF9hbHBoYV9hcmNoIixcCisiSEFWRV92bXNfYWxwaGFfdmVjPTEiKQorZWxzZQorREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc192YXhfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF92YXhfYXJjaCIsXAorIkhBVkVfdm1zX3ZheF92ZWM9MSIsIlZNU19ERUJVRyIpCitlbmRpZgorQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkkKERFRlMpCitlbHNlCitpZmVxICgkKEFSQ0gpLEFMUEhBKQorREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc19hbHBoYV92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX2FscGhhX2FyY2giLFwKKyJIQVZFX3Ztc19hbHBoYV92ZWM9MSIsInVubGluaz1yZW1vdmUiLCJjb25zdD0iLCJWTVNfREVCVUciLCkKK2Vsc2UKK0RFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfdmF4X3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfdmF4X2FyY2giLFwKKyJIQVZFX3Ztc192YXhfdmVjPTEiLCJ1bmxpbms9cmVtb3ZlIiwiY29uc3Q9IiwiVk1TX0RFQlVHIikKK2VuZGlmCitDRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKSQoREVGUykvd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMsbG9uZ2V4dGVybikKK2VuZGlmCisKKworbGliYmZkLm9sYjogc3lzZGVwLmggYmZkLmggJChPQkpTKQorCXB1cmdlCisJbGliL2NyZWF0ZSBsaWJiZmQgJChPQkpTKQorCitzeXNkZXAuaDogWy5ob3N0c10kKEhPU1RGSUxFKSBjb25maWcuaAorCSQoQ1ApICQ8ICRACisKK2JmZC5oOiBiZmQtaW4yLmgKKwkkJCBAY29uZmlndXJlCisKK3RhcmdtYXRjaC5oOiBiZmQuaAorY29uZmlnLmg6IGJmZC5oCisKK3Ztcy5jOiB2bXMuaAordm1zLW1oZC5jOiB2bXMuaAordm1zLWdzZC5jOiB2bXMuaAordm1zLXRpci5jOiB2bXMuaAordm1zLW1pc2MuYzogdm1zLmgKK3RhcmdldHMuYzogdGFyZ21hdGNoLmgKKworY2xlYW46CisJJCQgcHVyZ2UKKwkkKFJNKSBsaWJiZmQub2xiOworCSQoUk0pIHN5c2RlcC5oOworCSQoUk0pIGJmZC5oOworCSQoUk0pIHRhcmdtYXRjaC5oOworCSQoUk0pIGNvbmZpZy5oOworCSQoUk0pICoub2JqOwpkaWZmIC0tZ2l0IGEvYmZkL21pcHNic2QuYyBiL2JmZC9taXBzYnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiYTY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9taXBzYnNkLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIEJGRCBiYWNrZW5kIGZvciBNSVBTIEJTRCAoYS5vdXQpIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBSYWxwaCBDYW1wYmVsbC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAorLyogI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVSTyAqLworI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKyAgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAoeCkuYV9lbnRyeSA6CS8qIG9iamVjdCBmaWxlIG9yIE5NQUdJQyAqL1wKKwkgICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFCS8qIG5vIHBhZGRpbmcgKi9cCisgICAgKQorI2RlZmluZSBOX0RBVEFERFIoeCkgKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpCisjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiA0MDk2CisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgorI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQorI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbWlwcworI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9VTktOT1dOIFwKKwkJCSAgICB8fCAobXR5cGUpID09IE1fTUlQUzEgfHwgKG10eXBlKSA9PSBNX01JUFMyKQorI2RlZmluZSBNWV9zeW1ib2xfbGVhZGluZ19jaGFyICdcMCcKKworI2RlZmluZSBNWShPUCkgQ0FUKG1pcHNic2RfLE9QKQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAibGliYW91dC5oIgorCisjZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAorICBNWShzZXRfYXJjaF9tYWNoKShBQkZELCBOX01BQ0hUWVBFIChFWEVDKSk7IFwKKyAgTVkoY2hvb3NlX3JlbG9jX3NpemUpKEFCRkQpOworc3RhdGljIHZvaWQgTVkoc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgbWFjaHR5cGUpKTsKK3N0YXRpYyB2b2lkIE1ZKGNob29zZV9yZWxvY19zaXplKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQorc3RhdGljIGJvb2xlYW4gTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworLyogV2UgY2FuJ3QgdXNlIE1ZKHgpIGhlcmUgYmVjYXVzZSBpdCBsZWFkcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIHRvIENBVAorICAgd2hlbiBleHBhbmRlZCBpbnNpZGUgSlVNUF9UQUJMRS4gICovCisjZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBtaXBzYnNkX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwCisjZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBtaXBzYnNkX2Nhbm9uaWNhbGl6ZV9yZWxvYworCisjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgdW51c2VkCisjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisKKyNkZWZpbmUgTVlfYmFja2VuZF9kYXRhICZNWShiYWNrZW5kX2RhdGEpCisjZGVmaW5lIE1ZX0JGRF9UQVJHRVQKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCisKK3N0YXRpYyB2b2lkCitNWShzZXRfYXJjaF9tYWNoKSAoYWJmZCwgbWFjaHR5cGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IG1hY2h0eXBlOworeworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgbG9uZyBtYWNoaW5lOworCisgIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAqLworICBzd2l0Y2ggKG1hY2h0eXBlKSB7CisKKyAgY2FzZSBNX01JUFMxOgorICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOworICAgIG1hY2hpbmUgPSAzMDAwOworICAgIGJyZWFrOworCisgIGNhc2UgTV9NSVBTMjoKKyAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKKyAgICBtYWNoaW5lID0gNDAwMDsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOworICAgIG1hY2hpbmUgPSAwOworICAgIGJyZWFrOworICB9CisgIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2hpbmUpOyAgCit9CisKKy8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHJlbG9jYXRpb24gZW50cnksIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KK3N0YXRpYyB2b2lkCitNWShjaG9vc2VfcmVsb2Nfc2l6ZSkgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKKyAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKKyAgY2FzZSBiZmRfYXJjaF9hMjlrOgorICBjYXNlIGJmZF9hcmNoX21pcHM6CisgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfRVhUX1NJWkU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisgICAgYnJlYWs7CisgIH0KK30KKworLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gQlNEIGEub3V0IGZvcm1hdC4KKyAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCisgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CisgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKKworICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCisgIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7CisgIGNhc2UgYmZkX2FyY2hfbTY4azoKKyAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaChhYmZkKSkgeworICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOgorICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDEwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6CisgICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjgwMjApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIGJmZF9hcmNoX3NwYXJjOgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9TUEFSQyk7CisgICAgYnJlYWs7CisgIGNhc2UgYmZkX2FyY2hfaTM4NjoKKyAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMzg2KTsKKyAgICBicmVhazsKKyAgY2FzZSBiZmRfYXJjaF9hMjlrOgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV8yOUspOworICAgIGJyZWFrOworICBjYXNlIGJmZF9hcmNoX21pcHM6CisgICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKKyAgICBjYXNlIDQwMDA6CisgICAgY2FzZSA2MDAwOgorICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fTUlQUzEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKKyAgfQorCisgIE1ZKGNob29zZV9yZWxvY19zaXplKShhYmZkKTsKKworICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIE1JUFMgcmVsb2NhdGlvbiB0eXBlcy4KKyAqLworI2RlZmluZSBNSVBTX1JFTE9DXzMyCQkwCisjZGVmaW5lIE1JUFNfUkVMT0NfSk1QCQkxCisjZGVmaW5lIE1JUFNfUkVMT0NfV0RJU1AxNgkyCisjZGVmaW5lIE1JUFNfUkVMT0NfSEkxNgkJMworI2RlZmluZSBNSVBTX1JFTE9DX0hJMTZfUwk0CisjZGVmaW5lIE1JUFNfUkVMT0NfTE8xNgkJNQorCisvKgorICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfTUlQU19KTVAgcmVsb2NhdGlvbi4KKyAqIFRoZSBqdW1wIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgZm9ybWVkIGZyb20gdGhlIHVwcGVyIDQgYml0cyBvZiB0aGUKKyAqICJjdXJyZW50IiBwcm9ncmFtIGNvdW50ZXIgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGp1bXAgaW5zdHJ1Y3Rpb24ncworICogMjYgYml0IGZpZWxkIGFuZCB0d28gdHJhaWxpbmcgemVyb3MuCisgKiBJZiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBub3QgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgImN1cnJlbnQiCisgKiBwcm9ncmFtIGNvdW50ZXIsIHRoZW4gd2UgbmVlZCB0byBzaWduYWwgYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfZml4X2ptcF9hZGRyIChhYmZkLHJlbG9jX2VudHJ5LHN5bWJvbCxkYXRhLGlucHV0X3NlY3Rpb24sb3V0cHV0X2JmZCkKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKKyAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKK3sKKyAgYmZkX3ZtYSByZWxvY2F0aW9uLCBwYzsKKyAKKyAgLyogSWYgdGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwganVzdCBjb250aW51ZS4gKi8KKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCisgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKKworICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQorICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOworCisgIC8qIAorICAgKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCisgICAqIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLgorICAgKi8KKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZWxvY2F0aW9uID0gMDsKKyAgZWxzZQorICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOworCisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIHBjID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKworICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgNDsKKworICBpZiAoKHJlbG9jYXRpb24gJiAweEYwMDAwMDAwKSAhPSAocGMgJiAweEYwMDAwMDAwKSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OworCisgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Cit9CisKKy8qCisgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gcGVyZm9ybWluZyBhIEJGRF9SRUxPQ19ISTE2X1MgcmVsb2NhdGlvbi4KKyAqIFdlIG5lZWQgdG8gc2VlIGlmIGJpdCAxNSBpcyBzZXQgaW4gdGhlIHJlc3VsdC4gSWYgaXQgaXMsIHdlIGFkZAorICogMHgxMDAwMCBhbmQgY29udGludWUgbm9ybWFsbHkuIFRoaXMgd2lsbCBjb21wZW5zYXRlIGZvciB0aGUgc2lnbiBleHRlbnNpb24KKyAqIHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBhZGRlZCBhdCBydW4gdGltZS4KKyAqLworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorbWlwc19maXhfaGkxNl9zIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAorCQkJIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK21pcHNfZml4X2hpMTZfcyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKKwkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisgCisgIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCisgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQorICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7CisKKyAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQorICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICAvKiAKKyAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQorICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KKyAgICovCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmVsb2NhdGlvbiA9IDA7CisgIGVsc2UKKyAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKKworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKworICBpZiAocmVsb2NhdGlvbiAmIDB4ODAwMCkKKyAgICByZWxvY19lbnRyeS0+YWRkZW5kICs9IDB4MTAwMDA7CisKKyAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKK30KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbWlwc19ob3d0b190YWJsZV9leHRbXSA9IHsKKyAge01JUFNfUkVMT0NfMzIsICAgICAgMCwgMiwgMzIsIGZhbHNlLCAwLCAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsCisJIjMyIiwgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsIGZhbHNlfSwKKyAge01JUFNfUkVMT0NfSk1QLCAgICAgMiwgMiwgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LAorCW1pcHNfZml4X2ptcF9hZGRyLAorCSJNSVBTX0pNUCIsIGZhbHNlLCAwLCAweDAzZmZmZmZmLCBmYWxzZX0sCisgIHtNSVBTX1JFTE9DX1dESVNQMTYsIDIsIDIsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAorCSJXRElTUDE2IiwgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCisgIHtNSVBTX1JFTE9DX0hJMTYsICAgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsCisJIkhJMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKKyAge01JUFNfUkVMT0NfSEkxNl9TLCAxNiwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKyAgICAgICAgbWlwc19maXhfaGkxNl9zLAorICAgICAgICAiSEkxNl9TIiwgICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAorICB7TUlQU19SRUxPQ19MTzE2LCAgICAwLCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCisJIkxPMTYiLCAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKK307CisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlICoKK01ZKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKSAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKworICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9taXBzKQorICAgIHJldHVybiAwOworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKKyAgICBjYXNlIEJGRF9SRUxPQ18zMjoKKyAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfMzJdKTsKKyAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKKyAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSk1QXSk7CisgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6CisgICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX1dESVNQMTZdKTsKKyAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgorICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19ISTE2XSk7CisgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgorICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19ISTE2X1NdKTsKKyAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgorICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19MTzE2XSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyoKKyAqIFRoaXMgaXMganVzdCBsaWtlIHRoZSBzdGFuZGFyZCBhb3V0eC5oIHZlcnNpb24gYnV0IHdlIG5lZWQgdG8gZG8gb3VyCisgKiBvd24gbWFwcGluZyBvZiBleHRlcm5hbCByZWxvYyB0eXBlIHZhbHVlcyB0byBob3d0byBlbnRyaWVzLgorICovCitsb25nCitNWShjYW5vbmljYWxpemVfcmVsb2MpKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKKyAgICAgIGJmZCAqYWJmZDsKKyAgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKyAgdW5zaWduZWQgaW50IGNvdW50LCBjOworICBleHRlcm4gcmVsb2NfaG93dG9fdHlwZSBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKVtdOworCisgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSByZWFkIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLCByZXR1cm4gdGhlIHZhbHVlcy4gKi8KKyAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSB7CisgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKKworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKSB7CisgICAgICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKKyAgICAgIGNoYWluID0gY2hhaW4tPm5leHQ7CisgICAgfQorICAgICpyZWxwdHIgPSAwOworICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgfQorICBpZiAodGJscHRyICYmIHNlY3Rpb24tPnJlbG9jX2NvdW50KSB7CisgICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAorICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7CisgICAgKnJlbHB0ciA9IDA7CisgICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OworICB9CisKKyAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQorICAgIHJldHVybiAtMTsKKyAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKworICAvKiBmaXggdXAgaG93dG8gZW50cmllcyAqLworICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykgCisgICAgeworICAgICAgYyA9IHRibHB0ci0+aG93dG8gLSBOQU1FKGFvdXQsZXh0X2hvd3RvX3RhYmxlKTsKKyAgICAgIHRibHB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZV9leHRbY107CisKKyAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOworICAgIH0KKyAgKnJlbHB0ciA9IDA7CisgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKK30KKworc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0geworICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLworICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCisgIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLworICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLworICBUQVJHRVRfUEFHRV9TSVpFLAkJCS8qIHRleHQgdm1hICovCisgIE1ZX3NldF9zaXplcywKKyAgMCwJCQkJLyogdGV4dCBzaXplIGluY2x1ZGVzIGV4ZWMgaGVhZGVyICovCisgIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KKyAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KKyAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLworICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLworICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCisgIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLworfTsKKworY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfbGl0dGxlX3ZlYyA9Cit7CisgICJhLm91dC1taXBzLWxpdHRsZSIsCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBieXRlIG9yZGVyIChsaXR0bGUpICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAobGl0dGxlKSAqLworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKKyAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisgICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAorICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCisgICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCit9OworCitjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19iaWdfdmVjID0KK3sKKyAgImEub3V0LW1pcHMtYmlnIiwJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KKyAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChiaWcpICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAorICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAorICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KKyAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCisgICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKKyAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAorICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCisgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKKyAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKK307CmRpZmYgLS1naXQgYS9iZmQvbXB3LWNvbmZpZy5pbiBiL2JmZC9tcHctY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWRkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbXB3LWNvbmZpZy5pbgpAQCAtMCwwICsxLDg2IEBACisjIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIEJGRC4KKworIyBUaGlzIGlzIGFsbW9zdCBhbHdheXMgY29ycmVjdC4KKworU2V0IHNlbGFyY2hzICImYmZkX3t0YXJnZXRfY3B1fV9hcmNoIgorU2V0IGRlZnZlYyAiIgorU2V0IHNlbHZlY3MgIiIKK1NldCBoYXZldmVjcyAiIgorCitJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KKwlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtbTY4ay5jLm8gIntvfSJjb2ZmbGluay5jLm8nCisJU2V0IGRlZnZlYyBtNjhrY29mZl92ZWMKKwlTZXQgc2VsdmVjcyAnJm02OGtjb2ZmX3ZlYycKKwlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfbTY4a2NvZmZfdmVjJworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLworCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1wbWFjLmMubyAie299Inhjb2ZmbGluay5jLm8nCisJU2V0IGRlZnZlYyBwbWFjX3hjb2ZmX3ZlYworCVNldCBzZWx2ZWNzICcmcG1hY194Y29mZl92ZWMnCisJU2V0IGhhdmV2ZWNzICctZCBIQVZFX3BtYWNfeGNvZmZfdmVjJworCVNldCBzZWxhcmNocyAiJmJmZF9wb3dlcnBjX2FyY2giCisKK0Vsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCisJU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLWkzODYuYy5vJworCVNldCBkZWZ2ZWMgaTM4NmNvZmZfdmVjCisJU2V0IHNlbHZlY3MgJyZpMzg2Y29mZl92ZWMnCisJU2V0IGhhdmV2ZWNzICctZCBIQVZFX2kzODZjb2ZmX3ZlYycKKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtXE9wdGlvbi14LworCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1taXBzLmMubyAie299ImVjb2ZmLmMubyAie299ImVjb2ZmbGluay5jLm8gIntvfSJlbGYzMi5jLm8gIntvfSJlbGYzMi1taXBzLmMubyAie299ImVsZmxpbmsuYy5vJworCVNldCBkZWZ2ZWMgZWNvZmZfYmlnX3ZlYworCVNldCBzZWx2ZWNzICcmZWNvZmZfYmlnX3ZlYywmZWNvZmZfbGl0dGxlX3ZlYywmYmZkX2VsZjMyX2JpZ21pcHNfdmVjJworCVNldCBoYXZldmVjcyAnLWQgSEFWRV9lY29mZl9iaWdfdmVjIC1kIEhBVkVfZWNvZmZfbGl0dGxlX3ZlYyAtZCBIQVZFX2JmZF9lbGYzMl9iaWdtaXBzX3ZlYycKKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KKwlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtc2guYy5vICJ7b30iY29mZmxpbmsuYy5vJworCVNldCBkZWZ2ZWMgc2hjb2ZmX3ZlYworCVNldCBzZWx2ZWNzICcmc2hjb2ZmX3ZlYywmc2hsY29mZl92ZWMnCisJU2V0IGhhdmV2ZWNzICctZCBIQVZFX3NoY29mZl92ZWMgLWQgSEFWRV9zaGxjb2ZmX3ZlYycKK0VuZCBJZgorCitTZXQgdGEgYGVjaG8ge3NlbGFyY2hzfSB8IHNlZCAtZSAncy8mYmZkXy97b31jcHUtL2cnIC1lICdzL19hcmNoLy5jLm8vZydgCisKK1NldCB0ZGVmYXVsdHMgIi1kIERFRkFVTFRfVkVDVE9SPXtkZWZ2ZWN9IC1kIFNFTEVDVF9WRUNTPXtzZWx2ZWNzfSAtZCBTRUxFQ1RfQVJDSElURUNUVVJFUz17c2VsYXJjaHN9IHtoYXZldmVjc30iCisKK0VjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAorRWNobyAnV09SRFNJWkUgPSAzMicJCQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICdCRkRfTUFDSElORVMgPSAnIHt0YX0JCQkJPj4gIntvfSJtay50bXAKK0VjaG8gJ0JGRF9CQUNLRU5EUyA9ICcge0JGRF9CQUNLRU5EU30JCQk+PiAie299Im1rLnRtcAorRWNobyAnVERFRkFVTFRTID0gJyB7dGRlZmF1bHRzfQkJCQk+PiAie299Im1rLnRtcAorRWNobyAnSERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKK0VjaG8gJ1RERVBGSUxFUyA9ICcJCQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCisKK0VjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3CitFY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQkJPj4gIntvfSJjb25maWcubmV3CisKK01vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaAorCisjIFdlIGNhbiBvbmx5IGhhbmRsZSAzMi1iaXQgdGFyZ2V0cyByaWdodCBub3cuCisKK3NlZCAtZSAncy9AV09SRFNJWkVALzMyLycgXE9wdGlvbi1kCisgICAgLWUgJ3MvQHdvcmRzaXplQC8zMi8nIFxPcHRpb24tZAorICAgIC1lICJzL0BWRVJTSU9OQC9gQ2F0ZW5hdGUge3NyY2Rpcn1WRVJTSU9OYC8iIFxPcHRpb24tZAorICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAvMC8nIFxPcHRpb24tZAorICAgIC1lICdzL0BCRkRfSE9TVF82NF9CSVRALy8nIFxPcHRpb24tZAorICAgIC1lICdzL0BCRkRfSE9TVF9VXzY0X0JJVEAvLycgXE9wdGlvbi1kCisgICAgLWUgJ3MvQEJGRF9IT1NUXzY0QklUX0xPTkdALzAvJyBcT3B0aW9uLWQKKyAgICAie3NyY2Rpcn0iYmZkLWluMi5oID4ie299ImJmZC5oLW5ldworCitNb3ZlSWZDaGFuZ2UgIntvfSJiZmQuaC1uZXcgIntvfSJiZmQuaAorCitzZWQgLWUgJ3MvTk4vMzIvZycgIntzcmNkaXJ9ImVsZnh4LXRhcmdldC5oID4ie299ImVsZjMyLXRhcmdldC5oLW5ldworTW92ZUlmQ2hhbmdlICJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3ICJ7b30iZWxmMzItdGFyZ2V0LmgKKworIyBQcmUtZXhwYW5kIHNvbWUgbWFjcm9zIGluIGNvZmZzd2FwLmgsIHNvIE1QVyBDIGRvZXNuJ3QgY2hva2UuCisKK3NlZCAtZSAncy9eICBQVVRfQU9VVEhEUl9UU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKKyAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9EU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKKyAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9CU0laRSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKKyAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9FTlRSWSAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKKyAgICAtZSAncy9eICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAorICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCisgICAgIntzcmNkaXJ9ImNvZmZzd2FwLmggPiJ7b30iY29mZnN3YXAuaC1uZXcKKworTW92ZUlmQ2hhbmdlICJ7b30iY29mZnN3YXAuaC1uZXcgIntvfSJjb2Zmc3dhcC5oCmRpZmYgLS1naXQgYS9iZmQvbXB3LW1ha2Uuc2VkIGIvYmZkL21wdy1tYWtlLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjQ2M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL21wdy1tYWtlLnNlZApAQCAtMCwwICsxLDgxIEBACisjIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIFVuaXggQkZEIE1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KKworIyBXaGFjayBvdXQgdW51c2VkIGhvc3QgYW5kIHRhcmdldCBkZWZpbmUgYml0cy4KKy9IREVGSU5FUy9zL0BIREVGSU5FU0AvLworL1RERUZJTkVTL3MvQFRERUZJTkVTQC8vCisKKyMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgorL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLworL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCisKKyMgQ29tbWVudCBvdXQgc2V0dGluZyBvZiB2YXJzLCBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWRkIHRoZXNlIGl0c2VsZi4KKy9eV09SRFNJWkUgPS9zL14vIy8KKyMgL15BTExfQkFDS0VORFMvcy9eLyMvCisvXkJGRF9CQUNLRU5EUy9zL14vIy8KKy9eQkZEX01BQ0hJTkVTL3MvXi8jLworL15UREVGQVVMVFMvcy9eLyMvCisKKyMgUmVtb3ZlIGV4dHJhLCB1c2VsZXNzLCAiYWxsIi4KKy9eYWxsIFxcT3B0aW9uLWYgX29sZGVzdC8sL14kL2QKKworIyBSZW1vdmUgdGhlIE1ha2VmaWxlIHJlYnVpbGQgcnVsZS4KKy9eTWFrZWZpbGUgLywvLS1yZWNoZWNrL2QKKworIyBEb24ndCBkbyBhbnkgcmVjdXJzaXZlIHN1YmRpciBzdHVmZi4KKy8gc3ViZGlyX2RvL3Mve01BS0V9L251bGwtY29tbWFuZC8KKworL0JGRF9IL3MvXntCRkRfSH0vI3tCRkRfSH0vCisKKyMgQWRkIGV4cGxpY2l0IHNyY2RpciBwYXRocyB0byBzcGVjaWFsIGZpbGVzLgorL2NvbmZpZy5iZmQvcy8gY29uZmlnLmJmZC8gIntzfSJjb25maWcuYmZkL2cKKy90YXJnbWF0Y2guc2VkL3MvIHRhcmdtYXRjaC5zZWQvICJ7c30idGFyZ21hdGNoLnNlZC9nCisKKyMgUG9pbnQgYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW4gdGhlIG9iamRpci4KKy9iZmQvcy8ie3N9ImJmZFwuaC8ie299ImJmZC5oL2cKKy9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKKy90YXJnbWF0Y2gvcy8ie3N9InRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oL2cKKy90YXJnbWF0Y2gvcy9edGFyZ21hdGNoXC5oLyJ7b30idGFyZ21hdGNoLmgvCisvZWxmMzItdGFyZ2V0L3MvIntzfSJlbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC9nCisvZWxmMzItdGFyZ2V0L3MvXmVsZjMyLXRhcmdldFwuaC8ie299ImVsZjMyLXRhcmdldC5oLworL2VsZjY0LXRhcmdldC9zLyJ7c30iZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvZworL2VsZjY0LXRhcmdldC9zL15lbGY2NC10YXJnZXRcLmgvIntvfSJlbGY2NC10YXJnZXQuaC8KKworLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZworCisvZGVwL3MvXC5kZXAvX19kZXAvZworCisjIFJlbW92aW5nIGR1cGxpY2F0ZXMgaXMgY29vbCBidXQgcHJlc2VudGx5IHVubmVjZXNzYXJ5LAorIyBzbyB3aGFjayB0aGlzIG91dC4KKy9eb2ZpbGVzIFxcT3B0aW9uLWYvLC9eJC9kCisvb2ZpbGVzL3Mve09GSUxFU30gb2ZpbGVzL3tPRklMRVN9LworL2VjaG8gb2ZpbGVzID0gL2QKKy9jYXQgb2ZpbGVzL3MvYGNhdCBvZmlsZXNgL3tPRklMRVN9LworCisjIE5vIGNvcmVmaWxlIHN1cHBvcnQuCisvQ09SRUZJTEUvcy9AQ09SRUZJTEVALy8KKy9DT1JFRkxBRy9zL0BDT1JFRkxBR0AvLworCisjIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCisvQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LworL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCisvQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KKy9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCisKKyMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgorL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKKy5jLm8gXFxPcHRpb24tZiAuYworCisjIE1QVyBNYWtlIGRvZXNuJ3Qga25vdyBhYm91dCAkPC4KKy8ie299InRhcmdldHMuYy5vIFxcT3B0aW9uLWYgIntzfSJ0YXJnZXRzLmMgTWFrZWZpbGUvLC9eJC9jXAorIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlXAorCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJ0YXJnZXRzLmMgLW8gIntvfSJ0YXJnZXRzLmMubworCisvIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGUvLC9eJC9jXAorIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGVcCisJe0NDfSBAREFTSF9DX0ZMQUdAIHtBTExfQ0ZMQUdTfSB7VERFRkFVTFRTfSAie3N9ImFyY2h1cmVzLmMgLW8gIntvfSJhcmNodXJlcy5jLm8KKworIyBSZW1vdmUgdGhlIC5oIHJlYnVpbGRpbmcgcnVsZXMsIHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgZG9jIHN1YmRpciwKKyMgb3IgYSB3YXkgdG8gYnVpbGQgdGhlIHByb3RvdHlwZS1oYWNraW5nIHRvb2wgdGhhdCdzIGluIGl0LgorL14ie3NyY2Rpcn0iYmZkLWluMi5oIFxcT3B0aW9uLWYgLywvXiQvZAorL14ie3NyY2Rpcn0ibGliYmZkLmggXFxPcHRpb24tZiAvLC9eJC9kCisvXiJ7c3JjZGlyfSJsaWJjb2ZmLmggXFxPcHRpb24tZiAvLC9eJC9kCmRpZmYgLS1naXQgYS9iZmQvbmV0YnNkLWNvcmUuYyBiL2JmZC9uZXRic2QtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjE4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmV0YnNkLWNvcmUuYwpAQCAtMCwwICsxLDI1MSBAQAorLyogQkZEIGJhY2sgZW5kIGZvciBOZXRCU0Qgc3R5bGUgY29yZSBmaWxlcworICAgQ29weXJpZ2h0IDE5ODgsIDg5LCA5MSwgOTIsIDkzLCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgUGF1bCBLcmFuZW5idXJnLCBFVVIKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2NvcmUuaD4KKworLyoKKyAqIEZJWE1FOiBPbiBOZXRCU0Qvc3BhcmMgQ09SRV9GUFVfT0ZGU0VUIHNob3VsZCBiZSAoc2l6ZW9mKHN0cnVjdCB0cmFwZnJhbWUpKQorICovCisKK3N0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgeworCXN0cnVjdCBjb3JlIGNvcmU7Cit9ICpyYXdwdHI7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoJbmV0YnNkX2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGNoYXIgKgkJbmV0YnNkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgaW50IAkJbmV0YnNkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBib29sZWFuCQluZXRic2RfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisJCQkgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOworc3RhdGljIHZvaWQJCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOworCisvKiBIYW5kbGUgTmV0QlNELXN0eWxlIGNvcmUgZHVtcCBmaWxlLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK25ldGJzZF9jb3JlX2ZpbGVfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworCit7CisJaW50CQlpLCB2YWwsIG9mZnNldDsKKwlhc2VjdGlvbgkqYXNlY3QsICphc2VjdDI7CisJc3RydWN0IGNvcmUJY29yZTsKKwlzdHJ1Y3QgY29yZXNlZwljb3Jlc2VnOworCisJdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJmNvcmUsIDEsIHNpemVvZiBjb3JlLCBhYmZkKTsKKwlpZiAodmFsICE9IHNpemVvZiBjb3JlKSB7CisJCS8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLworCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoQ09SRV9HRVRNQUdJQyhjb3JlKSAhPSBDT1JFTUFHSUMpIHsKKwkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmF3cHRyID0gKHN0cnVjdCBuZXRic2RfY29yZV9zdHJ1Y3QgKikKKwkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0KSk7CisJaWYgKHJhd3B0ciA9PSBOVUxMKSB7CisJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX25vX21lbW9yeSk7CisJCXJldHVybiAwOworCX0KKworCXJhd3B0ci0+Y29yZSA9IGNvcmU7CisJYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YSA9IHJhd3B0cjsKKworCW9mZnNldCA9IGNvcmUuY19oZHJzaXplOworCWZvciAoaSA9IDA7IGkgPCBjb3JlLmNfbnNlZzsgaSsrKSB7CisKKwkJaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorCQkJZ290byBwdW50OworCisJCXZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZjb3Jlc2VnLCAxLCBzaXplb2YgY29yZXNlZywgYWJmZCk7CisJCWlmICh2YWwgIT0gc2l6ZW9mIGNvcmVzZWcpIHsKKwkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKKwkJCWdvdG8gcHVudDsKKwkJfQorCQlpZiAoQ09SRV9HRVRNQUdJQyhjb3Jlc2VnKSAhPSBDT1JFU0VHTUFHSUMpIHsKKwkJCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJCQlnb3RvIHB1bnQ7CisJCX0KKworCQlvZmZzZXQgKz0gY29yZS5jX3NlZ2hkcnNpemU7CisKKwkJYXNlY3QgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mKGFzZWN0aW9uKSk7CisJCWlmIChhc2VjdCA9PSBOVUxMKSB7CisJCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCQkJZ290byBwdW50OworCQl9CisKKwkJYXNlY3QtPl9yYXdfc2l6ZSA9IGNvcmVzZWcuY19zaXplOworCQlhc2VjdC0+dm1hID0gY29yZXNlZy5jX2FkZHI7CisJCWFzZWN0LT5maWxlcG9zID0gb2Zmc2V0OworCQlhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKwkJYXNlY3QtPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKKwkJYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDsKKwkJYWJmZC0+c2VjdGlvbl9jb3VudCsrOworCQlvZmZzZXQgKz0gY29yZXNlZy5jX3NpemU7CisKKwkJc3dpdGNoIChDT1JFX0dFVEZMQUcoY29yZXNlZykpIHsKKwkJY2FzZSBDT1JFX0NQVToKKwkJCWFzZWN0LT5uYW1lID0gIi5yZWciOworCQkJYXNlY3QtPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUzsKKyNpZmRlZiBDT1JFX0ZQVV9PRkZTRVQKKwkJCS8qIEhhY2tpc2guLi4gKi8KKwkJCWFzZWN0LT5fcmF3X3NpemUgPSBDT1JFX0ZQVV9PRkZTRVQ7CisJCQlhc2VjdDIgPSAoYXNlY3Rpb24gKiliZmRfemFsbG9jIChhYmZkLAorCQkJCQkJCSBzaXplb2YgKGFzZWN0aW9uKSk7CisJCQlpZiAoYXNlY3QyID09IE5VTEwpIHsKKwkJCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCQkJCWdvdG8gcHVudDsKKwkJCX0KKwkJCWFzZWN0Mi0+X3Jhd19zaXplID0gY29yZXNlZy5jX3NpemUgLSBDT1JFX0ZQVV9PRkZTRVQ7CisJCQlhc2VjdDItPnZtYSA9IDA7CisJCQlhc2VjdDItPmZpbGVwb3MgPSBhc2VjdC0+ZmlsZXBvcyArIENPUkVfRlBVX09GRlNFVDsKKwkJCWFzZWN0Mi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKwkJCWFzZWN0Mi0+bmV4dCA9IGFiZmQtPnNlY3Rpb25zOworCQkJYXNlY3QyLT5uYW1lID0gIi5yZWcyIjsKKwkJCWFzZWN0Mi0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTOworCQkJYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDI7CisJCQlhYmZkLT5zZWN0aW9uX2NvdW50Kys7CisjZW5kaWYKKworCQkJYnJlYWs7CisJCWNhc2UgQ09SRV9EQVRBOgorCQkJYXNlY3QtPm5hbWUgPSAiLmRhdGEiOworCQkJYXNlY3QtPmZsYWdzID0gU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFM7CisJCQlicmVhazsKKwkJY2FzZSBDT1JFX1NUQUNLOgorCQkJYXNlY3QtPm5hbWUgPSAiLnN0YWNrIjsKKwkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KKwlyZXR1cm4gYWJmZC0+eHZlYzsKKworcHVudDoJeworCQlhc2VjdGlvbgkqYW5leHQ7CisJCWZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYW5leHQpIHsKKwkJCWFuZXh0ID0gYXNlY3QtPm5leHQ7CisJCQlmcmVlKCh2b2lkICopYXNlY3QpOworCQl9CisJfQorCWZyZWUgKCh2b2lkICopcmF3cHRyKTsKKwlhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhID0gTlVMTDsKKwlhYmZkLT5zZWN0aW9ucyA9IE5VTEw7CisJYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyKgorbmV0YnNkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCisJYmZkICphYmZkOworeworIC8qcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ki8KKyAgcmV0dXJuIGFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEtPmNvcmUuY19uYW1lOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGludAorbmV0YnNkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKKwliZmQgKmFiZmQ7Cit7CisgIC8qcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsqLworICByZXR1cm4gYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YS0+Y29yZS5jX3NpZ25vOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGJvb2xlYW4KK25ldGJzZF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKK3sKKyAgcmV0dXJuIHRydWU7CQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzIHBvaW50ICovCit9CisMCisvKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCitzdGF0aWMgdm9pZAorc3dhcF9hYm9ydCgpCit7CisgIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLworfQorI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19TSUdORURfR0VUIFwKKyAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKworY29uc3QgYmZkX3RhcmdldCBuZXRic2RfY29yZV92ZWMgPQorICB7CisgICAgIm5ldGJzZC1jb3JlIiwKKyAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCisgICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLworICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLworICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLworCisgICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KKyAgICAgbmV0YnNkX2NvcmVfZmlsZV9wCQkvKiBhIGNvcmUgZmlsZSAqLworICAgIH0sCisgICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKKyAgICB9LAorICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgCisgICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKG5ldGJzZCksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCit9OwpkaWZmIC0tZ2l0IGEvYmZkL25ldGJzZC5oIGIvYmZkL25ldGJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDgyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmV0YnNkLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIEJGRCBiYWNrLWVuZCBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbCBOZXRCU0QgdGFyZ2V0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKK1VTQS4gICovCisKKy8qIENoZWNrIGZvciBvdXIgbWFjaGluZSB0eXBlIChwYXJ0IG9mIG1hZ2ljIG51bWJlcikuICovCisjaWZuZGVmIE1BQ0hUWVBFX09LCisjZGVmaW5lIE1BQ0hUWVBFX09LKG0pICgobSkgPT0gREVGQVVMVF9NSUQgfHwgKG0pID09IE1fVU5LTk9XTikKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSBub3JtYWwgbG9hZCBhZGRyZXNzIGZvciBleGVjdXRhYmxlcy4gKi8KKyNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCQlUQVJHRVRfUEFHRV9TSVpFCisKKy8qIE5ldEJTRCBaTUFHSUMgaGFzIGl0cyBoZWFkZXIgaW4gdGhlIHRleHQgc2VnbWVudC4gICovCisjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMQorCisvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5IHVzaW5nIHRoZSBmbGFncy4gKi8KKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIAkoTl9EWU5BTUlDKHgpKQorCisvKiBXZSBoYXZlIDYgYml0cyBvZiBmbGFncyBhbmQgMTAgYml0cyBvZiBtYWNoaW5lIElELiAgKi8KKyNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSBcCisJKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHgwM2ZmKSkKKyNkZWZpbmUgTl9GTEFHUyhleGVjKSBcCisJKCgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCisKKyNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCisJIHwgKCgoaW50KSh0eXBlKSAmIDB4M2ZmKSA8PCAxNikgXAorCSB8ICgoKGZsYWdzKSAmIDB4M2YpIDw8IDI0KSkKKyNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9IFwKKyAgICAgICAgICgoZXhlYykuYV9pbmZvICYgMHhmYjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4M2ZmKSA8PCAxNikpCisjZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCisJKChleGVjKS5hX2luZm8gPSBcCisJICgoZXhlYykuYV9pbmZvICYgMHgwM2ZmZmZmZikgfCAoKGZsYWdzICYgMHgwM2YpIDw8IDI2KSkKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIKKworLyogT24gTmV0QlNELCB0aGUgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBpbiBudG9obCdzICJuZXR3b3JrIiAoYmlnLWVuZGlhbikKKyAgIGZvcm1hdC4gICovCisjZGVmaW5lIFNXQVBfTUFHSUMoZXh0KSBiZmRfZ2V0YjMyIChleHQpCisKKy8qIE9uIE5ldEJTRCwgdGhlIGVudHJ5IHBvaW50IG1heSBiZSB0YWtlbiB0byBiZSB0aGUgc3RhcnQgb2YgdGhlIHRleHQKKyAgIHNlY3Rpb24uICAqLworI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMQorCisjZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCitzdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgorCisvKiBXcml0ZSBhbiBvYmplY3QgZmlsZS4KKyAgIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQorICAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK01ZKHdyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisgIC8qIFdlIG11c3QgbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1hZ2ljIG51bWJlciBoYXMgYmVlbiBzZXQuICBUaGlzCisgICAgIHdpbGwgbm9ybWFsbHkgaGF2ZSBiZWVuIGRvbmUgYnkgc2V0X3NlY3Rpb25fY29udGVudHMsIGJ1dCBvbmx5IGlmCisgICAgIHRoZXJlIGFjdHVhbGx5IGFyZSBzb21lIHNlY3Rpb24gY29udGVudHMuICAqLworICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOworICAgICAgZmlsZV9wdHIgdGV4dF9lbmQ7CisKKyAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOworICAgIH0KKworI2lmIENIT09TRV9SRUxPQ19TSVpFCisgIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOworI2Vsc2UKKyAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisjZW5kaWYKKworICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCisgIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7CisgIGNhc2UgREVGQVVMVF9BUkNIOgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgREVGQVVMVF9NSUQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFRoZSBOZXRCU0QgbWFnaWMgbnVtYmVyIGlzIGFsd2F5cyBiaWctZW5kaWFuICovCisjaWZuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKKyAgLyogWFhYIGFyZW4ndCB0aGVyZSBhbnkgbWFjcm8gdG8gY2hhbmdlIGJ5dGVvcmRlciBvZiBhIHdvcmQgaW5kZXBlbmRlbnQgb2YKKyAgICAgdGhlIGhvc3QncyBvciB0YXJnZXQncyBlbmRpYW5lc3Nlcz8gICovCisgIGV4ZWNwLT5hX2luZm8KKyAgICA9IChleGVjcC0+YV9pbmZvICYgMHhmZikgPDwgMjQgfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMCkgPDwgOAorICAgICAgfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwKSA+PiA4IHwgKGV4ZWNwLT5hX2luZm8gJiAweGZmMDAwMDAwKSA+PiAyNDsKKyNlbmRpZgorCisgIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmZkL25ld3NvczMuYyBiL2JmZC9uZXdzb3MzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjN2E3NQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9uZXdzb3MzLmMKQEAgLTAsMCArMSw0MCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBOZXdzT1MzIChTb255LCA2OGspIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgorI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQorI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAorI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKyNkZWZpbmUgTVkoT1ApIENBVChuZXdzb3MzXyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbmV3c29zMyIKKyNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgd2hlbiBjb21waWxlZCB3aXRoIC1XYWxsLiAqLworI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4aworI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCisjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtLXRhcmdldC5oIGIvYmZkL25sbS10YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjFkNDdkCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL25sbS10YXJnZXQuaApAQCAtMCwwICsxLDIyOSBAQAorLyogVGFyZ2V0IGRlZmluaXRpb25zIGZvciAzMi82NC1iaXQgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgbmxtX2NvcmVfZmlsZV9wIF9iZmRfZHVtbXlfdGFyZ2V0CisKKyNkZWZpbmUgbmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQgbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQorI2RlZmluZSBubG1fZ2V0X3N5bXRhYiBubG1OQU1FKGdldF9zeW10YWIpCisjZGVmaW5lIG5sbV9tYWtlX2VtcHR5X3N5bWJvbCBubG1OQU1FKG1ha2VfZW1wdHlfc3ltYm9sKQorI2RlZmluZSBubG1fcHJpbnRfc3ltYm9sIG5sbU5BTUUocHJpbnRfc3ltYm9sKQorI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvIG5sbU5BTUUoZ2V0X3N5bWJvbF9pbmZvKQorI2RlZmluZSBubG1fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBubG1fZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCisjZGVmaW5lIG5sbV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQorI2RlZmluZSBubG1fYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBubG1fcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBubG1fbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCisKKyNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCBubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKKyNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyBubG1OQU1FKGNhbm9uaWNhbGl6ZV9yZWxvYykKKyNkZWZpbmUgbmxtX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAorCisjZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyBubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQorCisjZGVmaW5lIG5sbV9zaXplb2ZfaGVhZGVycyBfYmZkX25vbGlua19zaXplb2ZfaGVhZGVycworI2RlZmluZSBubG1fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBubG1fYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgorI2RlZmluZSBubG1fYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZGVmaW5lIG5sbV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBubG1fYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKKyNkZWZpbmUgbmxtX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZGVmaW5lIG5sbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IEJGRCBrbm93cyBhYm91dCBhIHRhcmdldC4KKyAgIEl0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGl0cyBieXRlIG9yZGVyLCBuYW1lLCB3aGF0IHJvdXRpbmVzIHRvIGNhbGwKKyAgIHRvIGRvIHZhcmlvdXMgb3BlcmF0aW9ucywgZXRjLiAgRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUKKyAgIHdpdGggaXRzICJ4dmVjIiBtZW1iZXIuCisKKyAgIFRoZXJlIGFyZSB0d28gc3VjaCBzdHJ1Y3R1cmVzIGhlcmU6ICBvbmUgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMgYW5kCisgICBvbmUgZm9yIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMuICAgKi8KKworCisjaWZkZWYgVEFSR0VUX0JJR19TWU0KK2NvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQoreworICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLworICBUQVJHRVRfQklHX05BTUUsCisKKyAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KKyAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKKworICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgYmlnIGVuZGlhbiAqLworICBCRkRfRU5ESUFOX0JJRywKKworICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBiaWcgZW5kaWFuICovCisgIEJGRF9FTkRJQU5fQklHLAorCisgIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUworICAgfCBXUF9URVhUKSwKKyAgCisgIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KKyAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8CisgICBTRUNfQ09ERSB8IFNFQ19EQVRBKSwgCisKKyAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKKyAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLworICAgMCwKKworICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgorICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKKyAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLworICAnLycsCisKKyAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKKyAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCisgICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKKyAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLworICAxNSwKKworICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAorCisgIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKKworICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCisgIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLworICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLworICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLworICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KKyAgfSwKKworICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KKyAgeyBiZmRfZmFsc2UsCisgICAgbmxtX21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCisgICAgYmZkX2ZhbHNlCisgIH0sCisKKyAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLworICB7IGJmZF9mYWxzZSwKKyAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCisgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAorICAgIGJmZF9mYWxzZQorICB9LAorCisgIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKKyAgICAgIm5sbSIgKi8KKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKKyAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAvKiBiYWNrZW5kX2RhdGE6ICovCisgIChQVFIpIFRBUkdFVF9CQUNLRU5EX0RBVEEKK307CisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCitjb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9MSVRUTEVfU1lNID0KK3sKKyAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KKyAgVEFSR0VUX0xJVFRMRV9OQU1FLAorCisgIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCisgIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCisKKyAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGxpdHRsZSBlbmRpYW4gKi8KKyAgQkZEX0VORElBTl9MSVRUTEUsCisKKyAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gbGl0dGxlIGVuZGlhbiAqLworICBCRkRfRU5ESUFOX0xJVFRMRSwKKworICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMKKyAgIHwgV1BfVEVYVCksCisgIAorICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCisgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAorICAgU0VDX0RBVEEpLCAKKworICAgLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAorICAgICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCisgICAwLAorCisgIC8qIGFyX3BhZF9jaGFyOiBwYWQgY2hhcmFjdGVyIGZvciBmaWxlbmFtZXMgd2l0aGluIGFuIGFyY2hpdmUgaGVhZGVyCisgICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYworICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kL29yIG9zIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlICovCisgICcvJywKKworICAvKiBhcl9tYXhfbmFtZWxlbjogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBhcmNoaXZlIGhlYWRlcgorICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKKyAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZCBzaG91bGQgYmUgaW5kZXBlbmRlbnRseSB0dW5hYmxlLiAgVGhpcyB2YWx1ZSBpcworICAgICBhIFdBRyAod2lsZCBhKiogZ3Vlc3MpICovCisgIDE1LAorCisgIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGRhdGEgc2VjdGlvbnMgKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCisKKyAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXJzICovCisgIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKKyAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAorCisgIC8qIGJmZF9jaGVja19mb3JtYXQ6IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQgKi8KKyAgeyBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgbmxtTkFNRShvYmplY3RfcCksCQkvKiBhc3NlbWJsZXIvbGlua2VyIG91dHB1dCAob2JqZWN0IGZpbGUpICovCisgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCisgICAgbmxtX2NvcmVfZmlsZV9wCQkvKiBhIGNvcmUgZmlsZSAqLworICB9LAorCisgIC8qIGJmZF9zZXRfZm9ybWF0OiBzZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLworICB7IGJmZF9mYWxzZSwKKyAgICBubG1fbWtvYmplY3QsCisgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKKyAgICBiZmRfZmFsc2UKKyAgfSwKKworICAvKiBiZmRfd3JpdGVfY29udGVudHM6IHdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuICovCisgIHsgYmZkX2ZhbHNlLAorICAgIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSwKKyAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2ZhbHNlCisgIH0sCisKKyAgLyogSW5pdGlhbGl6ZSBhIGp1bXAgdGFibGUgd2l0aCB0aGUgc3RhbmRhcmQgbWFjcm8uICBBbGwgbmFtZXMgc3RhcnQgd2l0aAorICAgICAibmxtIiAqLworICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKKyAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAobmxtKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChubG0pLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAobmxtKSwKKyAgQkZEX0pVTVBfVEFCTEVfTElOSyAobmxtKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIC8qIGJhY2tlbmRfZGF0YTogKi8KKyAgKFBUUikgVEFSR0VUX0JBQ0tFTkRfREFUQQorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL25sbS5jIGIvYmZkL25sbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzZiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmxtLmMKQEAgLTAsMCArMSw1NSBAQAorLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYm5sbS5oIgorCisvKiBNYWtlIGFuIE5MTSBvYmplY3QuICBXZSBqdXN0IG5lZWQgdG8gYWxsb2NhdGUgdGhlIGJhY2tlbmQKKyAgIGluZm9ybWF0aW9uLiAgKi8KKworYm9vbGVhbgorbmxtX21rb2JqZWN0IChhYmZkKQorICAgICBiZmQgKiBhYmZkOworeworICBubG1fdGRhdGEgKGFiZmQpID0KKyAgICAoc3RydWN0IG5sbV9vYmpfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbmxtX29ial90ZGF0YSkpOworICBpZiAobmxtX3RkYXRhIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiAoZmFsc2UpOworCisgIGlmIChubG1fYXJjaGl0ZWN0dXJlIChhYmZkKSAhPSBiZmRfYXJjaF91bmtub3duKQorICAgIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpLAorCQkJICAgICAgIG5sbV9tYWNoaW5lIChhYmZkKSk7CisKKyAgLyogc2luY2UgZXZlcnl0aGluZyBpcyBkb25lIGF0IGNsb3NlIHRpbWUsIGRvIHdlIG5lZWQgYW55IGluaXRpYWxpemF0aW9uPyAqLworICByZXR1cm4gKHRydWUpOworfQorCisvKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBmb3IgYW4gTkxNIG9iamVjdC4gICovCisKK2Jvb2xlYW4KK25sbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKiBhYmZkOworICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOworeworICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKKyAgcmV0dXJuIGFyY2ggPT0gbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCk7Cit9CmRpZmYgLS1naXQgYS9iZmQvbmxtMzItYWxwaGEuYyBiL2JmZC9ubG0zMi1hbHBoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzhlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmxtMzItYWxwaGEuYwpAQCAtMCwwICsxLDg5MiBAQAorLyogU3VwcG9ydCBmb3IgMzItYml0IEFscGhhIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIDMyIGJpdCBBbHBoYSBOTE0gZm9ybWF0LiAgWW91IG1pZ2h0IHRoaW5rCisgICB0aGF0IGFuIEFscGhhIGNoaXAgd291bGQgdXNlIGEgNjQgYml0IGZvcm1hdCwgYnV0LCBmb3Igc29tZSByZWFzb24sCisgICBpdCBkb2Vzbid0LiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjZGVmaW5lIEFSQ0hfU0laRSAzMgorCisjaW5jbHVkZSAibmxtL2FscGhhLWV4dC5oIgorI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgorCisjaW5jbHVkZSAibGlibmxtLmgiCisKK3N0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wCisgIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfcHJlZml4CisgIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfcmVhZF9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOworc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX21hbmdsZV9yZWxvY3MKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOworc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3JlYWRfaW1wb3J0CisgIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfaW1wb3J0CisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9zZXRfcHVibGljX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKK3N0YXRpYyBiZmRfdm1hIG5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldAorICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwKKyAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOworDAorLyogQWxwaGEgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCisgICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCisgICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX2FscGhhX2JhY2tlbmRfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgcy5tYWdpYykgIT0gTkxNMzJfQUxQSEFfTUFHSUMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZJWE1FOiBTaG91bGQgd2UgY2hlY2sgdGhlIGZvcm1hdCBudW1iZXI/ICAqLworCisgIC8qIFNraXAgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyLiAgKi8KKyAgc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcy5zaXplKTsKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaXplLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9hbHBoYV93cml0ZV9wcmVmaXggKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKKworICBtZW1zZXQgKCZzLCAwLCBzaXplb2Ygcyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX0FMUEhBX01BR0lDLCBzLm1hZ2ljKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgMiwgcy5mb3JtYXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzaXplb2Ygcywgcy5zaXplKTsKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorDAorLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9hbHBoYV9ob3d0b190YWJsZVtdID0KK3sKKyAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQgYnkgaXRzZWxmLiAgSG93ZXZlciwgaXQgYXBwZWFycyBhZnRlciBhCisgICAgIEdQRElTUCByZWxvYyB0byBpZGVudGlmeSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGxvdyBvcmRlciAxNiBiaXRzCisgICAgIG9mIHRoZSBncCByZWdpc3RlciBhcmUgbG9hZGVkLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfSUdOT1JFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA4LAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJJR05PUkUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCisgIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfUkVGUVVBRCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0CisgICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKKyAgICAgYWRkZWQgaW4uICAqLworICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCisgICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCisgICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTElURVJBTCIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCisgICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCisgICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCisgICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQorICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKKyAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgorICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKKyAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQorICAgICByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgorICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgbmV4dCByZWxvYworICAgICB3aWxsIGJlIGFuIElHTk9SRSByZWxvYyB3aGljaCBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGRhCisgICAgIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHN5bWJvbCBpbmRleCBvZgorICAgICB0aGUgR1BESVNQIGluc3RydWN0aW9uIGFwcGVhcnMgdG8gYWN0dWFsbHkgYmUgdGhlIG51bWJlciBvZiBieXRlcworICAgICBiZXR3ZWVuIHRoZSBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBnaXZlcyB0d28gZGlmZmVyZW50CisgICAgIHdheXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaXM7IEkgZG9uJ3Qga25vdyB3aHkKKyAgICAgYm90aCBhcmUgdXNlZC4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uIGlzIHRoZQorICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUgY3VycmVudCBsb2NhdGlvbjsgdGhlCisgICAgIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIgaG9sZGluZyB0aGUgY3VycmVudAorICAgICBhZGRyZXNzLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfR1BESVNQLAkvKiB0eXBlICovCisJIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAyMSBiaXQgYnJhbmNoLiAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZXNlIGZvcgorICAgICBicmFuY2hlcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYW5kIGFsc28gZmlsbHMgaW4gdGhlIFBDCisgICAgIHJlbGF0aXZlIG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBJdCBzZWVtcyB0byBtZSB0aGF0IHRoaXMKKyAgICAgcmVsb2MsIHVubGlrZSB0aGUgb3RoZXJzLCBpcyBub3QgcGFydGlhbF9pbnBsYWNlLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfQlJBRERSLAkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAyMSwJCQkvKiBiaXRzaXplICovCisJIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkJSQUREUiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCisgIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCisJIDIsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAxNCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiSElOVCIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLworICBIT1dUTyAoQUxQSEFfUl9TUkVMMTYsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE2LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCisgIEhPV1RPIChBTFBIQV9SX1NSRUwzMiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJTUkVMMzIiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCisgIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJTUkVMNjQiLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KKyAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLworICBIT1dUTyAoQUxQSEFfUl9PUF9TVE9SRSwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQorICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCisgICAgIGdpdmVuIHZhbHVlLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfT1BfUFJTSElGVCwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEFkanVzdCB0aGUgR1AgdmFsdWUgZm9yIGEgbmV3IHJhbmdlIGluIHRoZSBvYmplY3QgZmlsZS4gICovCisgIEhPV1RPIChBTFBIQV9SX0dQVkFMVUUsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLworfTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfbndfaG93dG8gPQorICBIT1dUTyAoQUxQSEFfUl9OV19SRUxPQywJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiTldfUkVMT0MiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLworCisvKiBSZWFkIGFuIEFscGhhIE5MTSByZWxvYy4gIFRoaXMgcm91dGluZSBrZWVwcyBzb21lIHN0YXRpYyBkYXRhIHdoaWNoCisgICBpdCB1c2VzIHdoZW4gaGFuZGxpbmcgbG9jYWwgcmVsb2NzLiAgVGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseQorICAgYmVjYXVzZSBhbGwgdGhlIGxvY2FsIHJlbG9jcyBhcmUgcmVhZCBhdCBvbmNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9hbHBoYV9yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOworICAgICBhc2VjdGlvbiAqKnNlY3A7CisgICAgIGFyZWxlbnQgKnJlbDsKK3sKKyAgc3RhdGljIGJmZF92bWEgZ3BfdmFsdWU7CisgIHN0YXRpYyBiZmRfdm1hIGxpdGFfYWRkcmVzczsKKyAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jIGV4dDsKKyAgYmZkX3ZtYSByX3ZhZGRyOworICBsb25nIHJfc3ltbmR4OworICBpbnQgcl90eXBlLCByX2V4dGVybiwgcl9vZmZzZXQsIHJfc2l6ZTsKKyAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7CisKKyAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCisgIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogU3dhcCBpbiB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLworICByX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LnJfdmFkZHIpOworICByX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC5yX3N5bW5keCk7CisKKyAgQkZEX0FTU0VSVCAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKKworICByX3R5cGUgPSAoKGV4dC5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKKwkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOworICByX2V4dGVybiA9IChleHQucl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKKyAgcl9vZmZzZXQgPSAoKGV4dC5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQorCSAgICAgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOworICAvKiBJZ25vcmUgdGhlIHJlc2VydmVkIGJpdHMuICAqLworICByX3NpemUgPSAoKGV4dC5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSkKKwkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOworCisgIC8qIEZpbGwgaW4gdGhlIEJGRCBhcmVsZW50IHN0cnVjdHVyZS4gICovCisgIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOworICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgaWYgKHJfZXh0ZXJuKQorICAgIHsKKyAgICAgIC8qIEV4dGVybmFsIHJlbG9jYXRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGltcG9ydHMuICAqLworICAgICAgQkZEX0FTU0VSVCAoc3ltICE9IE5VTEwpOworICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgc3ltX3B0cl9wdHIgZm9yIHRoaXMgY2FzZS4gIEl0IGlzIHNldCBpbgorCSBubG1fY2Fub25pY2FsaXplX3JlbG9jLiAgKi8KKyAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBOVUxMOworICAgICAgcmVsLT5hZGRlbmQgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEludGVybmFsIHJlbG9jYXRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGxvY2FsIHJlbG9jYXRpb24KKwkgZml4dXBzLiAgSWYgdGhleSBhcmUgbm90IE5XX1JFTE9DIG9yIEdQRElTUCBvciBJR05PUkUsIHRoZXkKKwkgbXVzdCBiZSBhZ2FpbnN0IC50ZXh0IG9yIC5kYXRhLiAgKi8KKyAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DIHx8IHN5bSA9PSBOVUxMKTsKKyAgICAgIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQworCSAgfHwgcl90eXBlID09IEFMUEhBX1JfR1BESVNQCisJICB8fCByX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCisJeworCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworCSAgcmVsLT5hZGRlbmQgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKHJfc3ltbmR4ID09IEFMUEhBX1JFTE9DX1NFQ1RJT05fVEVYVCkKKwl7CisJICByZWwtPnN5bV9wdHJfcHRyID0gY29kZV9zZWMtPnN5bWJvbF9wdHJfcHRyOworCSAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY29kZV9zZWMpID09IDApOworCSAgcmVsLT5hZGRlbmQgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKHJfc3ltbmR4ID09IEFMUEhBX1JFTE9DX1NFQ1RJT05fREFUQSkKKwl7CisJICByZWwtPnN5bV9wdHJfcHRyID0gZGF0YV9zZWMtPnN5bWJvbF9wdHJfcHRyOworCSAgcmVsLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGRhdGFfc2VjKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgQkZEX0FTU0VSVCAoMCk7CisJICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisJICByZWwtPmFkZGVuZCA9IDA7CisJfQorICAgIH0KKworICAvKiBXZSB1c2UgdGhlIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlbG9jIGlzIGluIHRoZSAudGV4dAorICAgICBvciAuZGF0YSBzZWN0aW9uLiAgUl9OV19SRUxPQyByZWxvY3MgZG9uJ3QgcmVhbGx5IGhhdmUgYSBzZWN0aW9uLAorICAgICBzbyB3ZSBwdXQgdGhlbSBpbiAudGV4dC4gICovCisgIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQworICAgICAgfHwgcl92YWRkciA8IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKSkKKyAgICB7CisgICAgICAqc2VjcCA9IGNvZGVfc2VjOworICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqc2VjcCA9IGRhdGFfc2VjOworICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkciAtIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKKyAgICB9CisKKyAgLyogV2UgbXVzdCBhZGp1c3QgdGhlIGFkZGVuZCBiYXNlZCBvbiB0aGUgdHlwZS4gICovCisgIEJGRF9BU1NFUlQgKChyX3R5cGUgPj0gMCAmJiByX3R5cGUgPD0gQUxQSEFfUl9HUFZBTFVFKQorCSAgICAgIHx8IHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DKTsKKworICBzd2l0Y2ggKHJfdHlwZSkKKyAgICB7CisgICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKKyAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgorICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6CisgICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKKyAgICAgIC8qIFRoZSBQQyByZWxhdGl2ZSByZWxvY3MgZG8gbm90IHNlZW0gdG8gdXNlIHRoZSBzZWN0aW9uIFZNQSBhcworCSBhIG5lZ2F0aXZlIGFkZGVuZC4gICovCisgICAgICByZWwtPmFkZGVuZCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9HUFJFTDMyOgorICAgICAgLyogQ29weSB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgYWRkZW5kLCB0bworCSBlbnN1cmUgdGhhdCB3ZSBhcmUgbm90IGNvbmZ1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLworICAgICAgaWYgKCEgcl9leHRlcm4pCisJcmVsLT5hZGRlbmQgKz0gZ3BfdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9MSVRFUkFMOgorICAgICAgQkZEX0FTU0VSVCAoISByX2V4dGVybik7CisgICAgICByZWwtPmFkZGVuZCArPSBsaXRhX2FkZHJlc3M7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6CisgICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKKyAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KKwkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQorCSBhZGRlbmQgZmllbGQuICAqLworICAgICAgcmVsLT5hZGRlbmQgPSByX3N5bW5keDsKKyAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9SX09QX1NUT1JFOgorICAgICAgLyogVGhlIFNUT1JFIHJlbG9jIG5lZWRzIHRoZSBzaXplIGFuZCBvZmZzZXQgZmllbGRzLiAgV2Ugc3RvcmUKKwkgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KKyAgICAgIEJGRF9BU1NFUlQgKHJfb2Zmc2V0IDwgMjU2ICYmIHJfc2l6ZSA8IDI1Nik7CisgICAgICByZWwtPmFkZGVuZCA9IChyX29mZnNldCA8PCA4KSArIHJfc2l6ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6CisgICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6CisgICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6CisgICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgorCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCisJIGFkZGVuZC4gICovCisgICAgICByZWwtPmFkZGVuZCA9IHJfdmFkZHI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgorICAgICAgLyogUmVjb3JkIHRoZSBuZXcgZ3AgdmFsdWUuICAqLworICAgICAgZ3BfdmFsdWUgKz0gcl9zeW1uZHg7CisgICAgICByZWwtPmFkZGVuZCA9IGdwX3ZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgorICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCisJIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKKwkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQorCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCisJIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCisgICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisgICAgICByZWwtPmFkZHJlc3MgPSByX3ZhZGRyOworICAgICAgcmVsLT5hZGRlbmQgPSBncF92YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBTFBIQV9SX05XX1JFTE9DOgorICAgICAgLyogSWYgdGhpcyBpcyBTRVRHUCwgd2Ugc2V0IHRoZSBhZGRlbmQgdG8gMC4gIE90aGVyd2lzZSB3ZSBzZXQKKwkgdGhlIGFkZGVuZCB0byB0aGUgc2l6ZSBvZiB0aGUgLmxpdGEgc2VjdGlvbiAodGhpcyBpcworCSByX3N5bW5keCkgcGx1cyAxLiAgV2UgaGF2ZSBhbHJlYWR5IHNldCB0aGUgYWRkcmVzcyBvZiB0aGUKKwkgcmVsb2MgdG8gcl92YWRkci4gICovCisgICAgICBpZiAocl9zaXplID09IEFMUEhBX1JfTldfUkVMT0NfU0VUR1ApCisJeworCSAgZ3BfdmFsdWUgPSByX3ZhZGRyOworCSAgcmVsLT5hZGRlbmQgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKHJfc2l6ZSA9PSBBTFBIQV9SX05XX1JFTE9DX0xJVEEpCisJeworCSAgbGl0YV9hZGRyZXNzID0gcl92YWRkcjsKKwkgIHJlbC0+YWRkZW5kID0gcl9zeW1uZHggKyAxOworCX0KKyAgICAgIGVsc2UKKwlCRkRfQVNTRVJUICgwKTsKKyAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MpCisgICAgcmVsLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKKyAgZWxzZQorICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFuZ2xlIEFscGhhIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fYWxwaGFfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBkYXRhOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgYW4gQUxQSEEgTkxNIGltcG9ydCByZWNvcmQgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9hbHBoYV9yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Cit7CisgIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLworICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCisgIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCisgIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCisgIGNoYXIgKm5hbWU7CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCisgICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCisgICAgcmV0dXJuIGZhbHNlOworICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOworICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCisgICAgcmV0dXJuIGZhbHNlOworICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOworICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOworICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKKyAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7CisgIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7CisgIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCisJCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKKyAgaWYgKCFubG1fcmVsb2NzKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7CisgIHN5bSAtPiByY250ID0gMDsKKyAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICAgCisgICAgICBpZiAobmxtX2FscGhhX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCisJCQkJJm5sbV9yZWxvY3MgLT4gcmVsb2MpCisJICA9PSBmYWxzZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOworICAgICAgbmxtX3JlbG9jcysrOworICAgICAgc3ltIC0+IHJjbnQrKzsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIGFuIEFscGhhIE5MTSByZWxvYy4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIGFzeW1ib2wgKnN5bTsKKyAgYmZkX3ZtYSByX3ZhZGRyOworICBsb25nIHJfc3ltbmR4OworICBpbnQgcl90eXBlLCByX2V4dGVybiwgcl9vZmZzZXQsIHJfc2l6ZTsKKyAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jIGV4dDsKKworICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKKworICAvKiBHZXQgdmFsdWVzIGZvciB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuICAqLworICByX3R5cGUgPSByZWwtPmhvd3RvLT50eXBlOworICBpZiAocl90eXBlICE9IEFMUEhBX1JfTldfUkVMT0MpCisgICAgeworICAgICAgcl92YWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7CisgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKKwlyX3ZhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsCisJCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKKwkJCQkJCQkgICAgICBOTE1fQ09ERV9OQU1FKSk7CisgICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCXsKKwkgIHJfZXh0ZXJuID0gMTsKKwkgIHJfc3ltbmR4ID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcl9leHRlcm4gPSAwOworCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQorCSAgICByX3N5bW5keCA9IEFMUEhBX1JFTE9DX1NFQ1RJT05fVEVYVDsKKwkgIGVsc2UKKwkgICAgcl9zeW1uZHggPSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEE7CisJfQorICAgICAgcl9vZmZzZXQgPSAwOworICAgICAgcl9zaXplID0gMDsKKworICAgICAgc3dpdGNoIChyX3R5cGUpCisJeworCWNhc2UgQUxQSEFfUl9MSVRVU0U6CisJY2FzZSBBTFBIQV9SX0dQRElTUDoKKwkgIHJfc3ltbmR4ID0gcmVsLT5hZGRlbmQ7CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKKwkgIHJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKKwkgIHJfb2Zmc2V0ID0gKHJlbC0+YWRkZW5kID4+IDgpICYgMHhmZjsKKwkgIGJyZWFrOworCisJY2FzZSBBTFBIQV9SX09QX1BVU0g6CisJY2FzZSBBTFBIQV9SX09QX1BTVUI6CisJY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6CisJICByX3ZhZGRyID0gcmVsLT5hZGRlbmQ7CisJICBicmVhazsKKworCWNhc2UgQUxQSEFfUl9JR05PUkU6CisJICByX3ZhZGRyID0gcmVsLT5hZGRyZXNzOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DICovCisgICAgICByX3ZhZGRyID0gcmVsLT5hZGRyZXNzOworICAgICAgaWYgKHJlbC0+YWRkZW5kID09IDApCisJeworCSAgcl9zeW1uZHggPSAwOworCSAgcl9zaXplID0gQUxQSEFfUl9OV19SRUxPQ19TRVRHUDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcl9zeW1uZHggPSByZWwtPmFkZGVuZCAtIDE7CisJICByX3NpemUgPSBBTFBIQV9SX05XX1JFTE9DX0xJVEE7CisJfQorICAgICAgcl9leHRlcm4gPSAwOworICAgICAgcl9vZmZzZXQgPSAwOworICAgIH0KKworICAvKiBTd2FwIG91dCB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuICAqLworICBiZmRfaF9wdXRfNjQgKGFiZmQsIHJfdmFkZHIsIChiZmRfYnl0ZSAqKSBleHQucl92YWRkcik7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcl9zeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQucl9zeW1uZHgpOworCisgIEJGRF9BU1NFUlQgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSk7CisKKyAgZXh0LnJfYml0c1swXSA9ICgocl90eXBlIDw8IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKQorCQkgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKKyAgZXh0LnJfYml0c1sxXSA9ICgocl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKKwkJICAgfCAoKHJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCisJCSAgICAgICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkpOworICBleHQucl9iaXRzWzJdID0gMDsKKyAgZXh0LnJfYml0c1szXSA9ICgocl9zaXplIDw8IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKQorCQkgICAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jYXRpb24uICAqLworICBpZiAoYmZkX3dyaXRlICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIEFscGhhIE5ldFdhcmUgZG9lcyBub3QgdXNlIHRoZSBoaWdoIGJpdCB0byBkZXRlcm1pbmUgd2hldGhlciBhCisgICBwdWJsaWMgc3ltYm9sIGlzIGluIHRoZSBjb2RlIHNlZ21lbnQgb3IgdGhlIGRhdGEgc2VnbWVudC4gIEluc3RlYWQsCisgICBpdCBqdXN0IHVzZXMgdGhlIGFkZHJlc3MuICBUaGUgc2V0X3B1YmxpY19zZWN0aW9uIGFuZAorICAgZ2V0X3B1YmxpY19vZmZzZXQgcm91dGluZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29kZSB3aGljaCB1c2VzIHRoZQorICAgaGlnaCBiaXQuICAqLworCisvKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uIChhYmZkLCBzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKK3sKKyAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7CisKKyAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7CisgIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOworICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgPCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykpCisgICAgeworICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGNvZGVfc2VjOworICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBkYXRhX3NlYzsKKyAgICAgIHN5bS0+c3ltYm9sLnZhbHVlIC09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKKyAgICAgIC8qIFRoZSBkYXRhIHNlZ21lbnQgaGFkIGJldHRlciBiZSBhbGlnbmVkLiAgKi8KKyAgICAgIEJGRF9BU1NFUlQgKChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykgJiAweGYpID09IDApOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KKworc3RhdGljIGJmZF92bWEKK25sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldCAoYWJmZCwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKnN5bTsKK3sKKyAgcmV0dXJuIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOworfQorDAorLyogV3JpdGUgYW4gQWxwaGEgTkxNIGV4dGVybmFsIHN5bWJvbC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworICAgICBhc3ltYm9sICpzeW07CisgICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Cit7CisgIGludCBpOworICBiZmRfYnl0ZSBsZW47CisgIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisgIGFyZWxlbnQgcjsKKworICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7CisgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKKyAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQgKyAyLCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlIGZpcnN0IHR3byByZWxvY3MgZm9yIGVhY2ggZXh0ZXJuYWwgc3ltYm9sIGFyZSB0aGUgLmxpdGEKKyAgICAgYWRkcmVzcyBhbmQgdGhlIEdQIHZhbHVlLiAgKi8KKyAgci5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworICByLmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOworCisgIHIuYWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKGFiZmQpLT5saXRhX2FkZHJlc3M7CisgIHIuYWRkZW5kID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAoYWJmZCktPmxpdGFfc2l6ZSArIDE7CisgIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgJnIpID09IGZhbHNlKQorICAgIHJldHVybiBmYWxzZTsKKworICByLmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChhYmZkKS0+Z3A7CisgIHIuYWRkZW5kID0gMDsKKyAgaWYgKG5sbV9hbHBoYV93cml0ZV9pbXBvcnQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCAmcikgPT0gZmFsc2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLAorCQkJCSAgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2luY2x1ZGUgIm5sbXN3YXAuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX2FscGhhX2JhY2tlbmQgPQoreworICAiTmV0V2FyZSBBbHBoYSBNb2R1bGUgICBcMDMyIiwKKyAgc2l6ZW9mIChObG0zMl9hbHBoYV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAorICBzaXplb2YgKHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyKSwKKyAgYmZkX2FyY2hfYWxwaGEsCisgIDAsCisgIHRydWUsIC8qIG5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBwZXJtaXR0ZWQgYnkgQWxwaGEgTmV0V2FyZS4gICovCisgIG5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wLAorICBubG1fYWxwaGFfd3JpdGVfcHJlZml4LAorICBubG1fYWxwaGFfcmVhZF9yZWxvYywKKyAgbmxtX2FscGhhX21hbmdsZV9yZWxvY3MsCisgIG5sbV9hbHBoYV9yZWFkX2ltcG9ydCwKKyAgbmxtX2FscGhhX3dyaXRlX2ltcG9ydCwKKyAgbmxtX2FscGhhX3NldF9wdWJsaWNfc2VjdGlvbiwKKyAgbmxtX2FscGhhX2dldF9wdWJsaWNfb2Zmc2V0LAorICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCisgIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCisgIG5sbV9hbHBoYV93cml0ZV9leHRlcm5hbCwKKyAgMCwJLyogd3JpdGVfZXhwb3J0ICovCit9OworCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJIm5sbTMyLWFscGhhIgorI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJbmxtTkFNRShhbHBoYV92ZWMpCisjZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9hbHBoYV9iYWNrZW5kCisKKyNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItaTM4Ni5jIGIvYmZkL25sbTMyLWkzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZjNzRkCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL25sbTMyLWkzODYuYwpAQCAtMCwwICsxLDQ1MSBAQAorLyogU3VwcG9ydCBmb3IgMzItYml0IGkzODYgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkKKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNkZWZpbmUgQVJDSF9TSVpFIDMyCisKKyNpbmNsdWRlICJubG0vaTM4Ni1leHQuaCIKKyNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9pMzg2X0V4dGVybmFsX0ZpeGVkX0hlYWRlcgorCisjaW5jbHVkZSAibGlibmxtLmgiCisKK3N0YXRpYyBib29sZWFuIG5sbV9pMzg2X3JlYWRfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9pMzg2X3dyaXRlX2ltcG9ydAorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1faTM4Nl9tYW5nbGVfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIG5sbV9pMzg2X3JlYWRfaW1wb3J0CisgIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1faTM4Nl93cml0ZV9leHRlcm5hbAorICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYXN5bWJvbCAqLCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqKSk7CisKKy8qIEFkanVzdCB0aGUgcmVsb2MgbG9jYXRpb24gYnkgYW4gYWJzb2x1dGUgdmFsdWUuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1faTM4Nl9hYnNfaG93dG8gPQorICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIjMyIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCisKKy8qIEFkanVzdCB0aGUgcmVsb2MgbG9jYXRpb24gYnkgYSBQQyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1faTM4Nl9wY3JlbF9ob3d0byA9CisgIEhPV1RPICgxLAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworLyogUmVhZCBhIE5ldFdhcmUgaTM4NiByZWxvYy4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1faTM4Nl9yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOworICAgICBhc2VjdGlvbiAqKnNlY3A7CisgICAgIGFyZWxlbnQgKnJlbDsKK3sKKyAgYmZkX2J5dGUgdGVtcFs0XTsKKyAgYmZkX3ZtYSB2YWw7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgaWYgKGJmZF9yZWFkICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQorICAgIHJldHVybiBmYWxzZTsKKworICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKKworICAvKiBUaGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gZWl0aGVyIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4KKyAgICAgVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQuCisKKyAgICAgSWYgdGhpcyBpcyBhIHJlbG9jYXRpb24gZml4dXAgcmF0aGVyIHRoYW4gYW4gaW1wb3J0ZWQgc3ltYm9sICh0aGUKKyAgICAgc3ltIGFyZ3VtZW50IGlzIE5VTEwpIHRoZW4gdGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIGxvY2F0aW9uCisgICAgIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQsIG9yIDEgaWYKKyAgICAgdGhlIGxvY2F0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IHRoZSBhZGRyZXNzIG9mIHRoZSBjb2RlCisgICAgIHNlZ21lbnQuICBJZiB0aGlzIGlzIGFuIGltcG9ydGVkIHN5bWJvbCwgdGhlbiB0aGUgaGlnaCBiaXQgaXMgMAorICAgICBpZiB0aGUgbG9jYXRpb24gaXMgMCBpZiB0aGUgbG9jYXRpb24gc2hvdWxkIGJlIGFkanVzdGVkIGJ5IHRoZQorICAgICBvZmZzZXQgdG8gdGhlIHN5bWJvbCwgb3IgMSBpZiB0aGUgbG9jYXRpb24gc2hvdWxkIGFkanVzdGVkIGJ5IHRoZQorICAgICBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgorCisgICAgIFRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMCBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0CisgICAgIGludG8gdGhlIGRhdGEgc2VnbWVudCwgb3IgMSBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gdGhlCisgICAgIGNvZGUgc2VnbWVudC4KKworICAgICBBbGwgdGhpcyB0cmFuc2xhdGVzIGZhaXJseSBlYXNpbHkgaW50byBhIEJGRCByZWxvYy4gICovCisKKyAgaWYgKHN5bSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgodmFsICYgTkxNX0hJQklUKSA9PSAwKQorCW5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOworICAgICAgZWxzZQorCXsKKwkgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOworCSAgdmFsICY9fiBOTE1fSElCSVQ7CisJfQorICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKS0+c3ltYm9sX3B0cl9wdHI7CisgICAgICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X2Fic19ob3d0bzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJbiB0aGlzIGNhc2Ugd2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBzeW1fcHRyX3B0ciBmaWVsZC4gICovCisgICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKKyAgICAgIGlmICgodmFsICYgTkxNX0hJQklUKSA9PSAwKQorCXJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87CisgICAgICBlbHNlCisJeworCSAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9hYnNfaG93dG87CisJICB2YWwgJj1+IE5MTV9ISUJJVDsKKwl9CisgICAgfQorCisgIGlmICgodmFsICYgKE5MTV9ISUJJVCA+PiAxKSkgPT0gMCkKKyAgICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgZWxzZQorICAgIHsKKyAgICAgICpzZWNwID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOworICAgICAgdmFsICY9fiAoTkxNX0hJQklUID4+IDEpOworICAgIH0KKworICByZWwtPmFkZHJlc3MgPSB2YWw7CisgIHJlbC0+YWRkZW5kID0gMDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgYSBOZXRXYXJlIGkzODYgcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX2kzODZfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIGFzeW1ib2wgKnN5bTsKKyAgYmZkX3ZtYSB2YWw7CisgIGJmZF9ieXRlIHRlbXBbNF07CisKKyAgLyogTmV0V2FyZSBvbmx5IHN1cHBvcnRzIHR3byBraW5kcyBvZiByZWxvY3MuICBXZSBzaG91bGQgY2hlY2sKKyAgICAgc3BlY2lhbF9mdW5jdGlvbiBoZXJlLCBhcyB3ZWxsLCBidXQgYXQgdGhlIG1vbWVudCBjb2ZmLWkzODYKKyAgICAgcmVsb2NzIHVzZXMgYSBzcGVjaWFsX2Z1bmN0aW9uIHdoaWNoIGRvZXMgbm90IGFmZmVjdCB3aGF0IHdlIGRvCisgICAgIGhlcmUuICAqLworICBpZiAocmVsLT5hZGRlbmQgIT0gMAorICAgICAgfHwgcmVsLT5ob3d0byA9PSBOVUxMCisgICAgICB8fCByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKKyAgICAgIHx8IHJlbC0+aG93dG8tPnNpemUgIT0gMgorICAgICAgfHwgcmVsLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgorICAgICAgfHwgcmVsLT5ob3d0by0+Yml0cG9zICE9IDAKKyAgICAgIHx8IHJlbC0+aG93dG8tPnNyY19tYXNrICE9IDB4ZmZmZmZmZmYKKyAgICAgIHx8IHJlbC0+aG93dG8tPmRzdF9tYXNrICE9IDB4ZmZmZmZmZmYpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7CisKKyAgLyogVGhlIHZhbHVlIHdlIHdyaXRlIG91dCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFwcHJvcHJpYXRlCisgICAgIHNlZ21lbnQuICBUaGlzIG9mZnNldCBpcyB0aGUgc2VjdGlvbiB2bWEsIGFkanVzdGVkIGJ5IHRoZSB2bWEgb2YKKyAgICAgdGhlIGxvd2VzdCBzZWN0aW9uIGluIHRoYXQgc2VnbWVudCwgcGx1cyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgcmVsb2NhdGlvbi4gICovCisgIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7CisKKyAgLyogVGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQKKyAgICAgaW50byB0aGUgZGF0YSBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUKKyAgICAgY29kZSBzZWdtZW50LiAgKi8KKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQorICAgIHsKKyAgICAgIHZhbCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKKyAgICAgIHZhbCB8PSBOTE1fSElCSVQgPj4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB2YWwgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7CisKKyAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorICAgIHsKKyAgICAgIC8qIE5ldFdhcmUgb25seSBzdXBwb3J0cyBhYnNvbHV0ZSBpbnRlcm5hbCByZWxvY3MuICAqLworICAgICAgaWYgKHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICAvKiBUaGUgaGlnaCBiaXQgaXMgMSBpZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCB0aGUgY29kZSBzZWN0aW9uLCAwCisJIGlmIGFnYWluc3QgdGhlIGRhdGEgc2VjdGlvbi4gICovCisgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpICYgU0VDX0NPREUpCisJdmFsIHw9IE5MTV9ISUJJVDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgaGlnaCBiaXQgaXMgMSBpZiB0aGlzIGlzIGFuIGFic29sdXRlIHJlbG9jLCAwIGlmIGl0IGlzIFBDCisJIHJlbGF0aXZlLiAgKi8KKyAgICAgIGlmICghIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlKQorCXZhbCB8PSBOTE1fSElCSVQ7CisgICAgICBlbHNlCisJeworCSAgLyogUEMgcmVsYXRpdmUgcmVsb2NzIG9uIE5ldFdhcmUgbXVzdCBiZSBwY3JlbF9vZmZzZXQuICAqLworCSAgaWYgKCEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEkgd2FudCB0byBiZSBhYmxlIHRvIHVzZSBvYmpjb3B5IHRvIHR1cm4gYSBpMzg2IGEub3V0IG9yIENPRkYgZmlsZQorICAgaW50byBhIE5ldFdhcmUgaTM4NiBtb2R1bGUuICBUaGF0IG1lYW5zIHRoYXQgdGhlIHJlbG9jcyBmcm9tIHRoZQorICAgc291cmNlIGZpbGUgaGF2ZSB0byBiZSBtYXBwZWQgaW50byByZWxvY3MgdGhhdCBhcHBseSB0byB0aGUgdGFyZ2V0CisgICBmaWxlLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzIHRvIGdpdmUKKyAgIGl0IGEgY2hhbmNlIHRvIHJld29yayB0aGUgcmVsb2NzLgorCisgICBUaGlzIGlzIGFjdHVhbGx5IGEgZmFpcmx5IGdlbmVyYWwgY29uY2VwdC4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGEKKyAgIGdlbmVyYWwgaW1wbGVtZW50YXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX2kzODZfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBkYXRhOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgYXJlbGVudCAqKnJlbF9wdHJfcHRyLCAqKnJlbF9lbmQ7CisKKyAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOworICByZWxfZW5kID0gcmVsX3B0cl9wdHIgKyBzZWMtPnJlbG9jX2NvdW50OworICBmb3IgKDsgcmVsX3B0cl9wdHIgPCByZWxfZW5kOyByZWxfcHRyX3B0cisrKQorICAgIHsKKyAgICAgIGFyZWxlbnQgKnJlbDsKKyAgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgIGJmZF92bWEgYWRkZW5kOworCisgICAgICByZWwgPSAqcmVsX3B0cl9wdHI7CisgICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKKworICAgICAgLyogTm90ZSB0aGF0IG5vIHNlcmlvdXMgaGFybSB3aWxsIGVuc3VlIGlmIHdlIGZhaWwgdG8gY2hhbmdlIGEKKwkgcmVsb2MuICBXZSB3aWxsIHdpbmQgdXAgZmFpbGluZyBpbiBubG1faTM4Nl93cml0ZV9pbXBvcnQuICAqLworCisgICAgICAvKiBNYWtlIHN1cmUgdGhpcyByZWxvYyBpcyB3aXRoaW4gdGhlIGRhdGEgd2UgaGF2ZS4gIFdlIG9ubHkgNAorCSBieXRlIHJlbG9jcyBoZXJlLCBzbyB3ZSBpbnNpc3Qgb24gaGF2aW5nIDQgYnl0ZXMuICAqLworICAgICAgaWYgKHJlbC0+YWRkcmVzcyA8IG9mZnNldAorCSAgfHwgcmVsLT5hZGRyZXNzICsgNCA+IG9mZnNldCArIGNvdW50KQorCWNvbnRpbnVlOworCisgICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCByZWxvYyBhZGRlbmRzLCBzbyB3ZSBnZXQgcmlkIG9mIHRoZW0KKwkgaGVyZSBieSBzaW1wbHkgYWRkaW5nIHRoZW0gaW50byB0aGUgb2JqZWN0IGRhdGEuICBXZSBoYW5kbGUKKwkgdGhlIHN5bWJvbCB2YWx1ZSwgaWYgYW55LCB0aGUgc2FtZSB3YXkuICAqLworICAgICAgYWRkZW5kID0gcmVsLT5hZGRlbmQgKyBzeW0tPnZhbHVlOworCisgICAgICAvKiBUaGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLiAgSWYgdGhlCisJIHN5bWJvbCBpcyBpbiB0aGUgLmJzcyBzZWdtZW50LCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIHNpemUgb2YKKwkgdGhlIGRhdGEgc2VnbWVudCBpbiB0aGUgb2Zmc2V0IGFzIHdlbGwuICBGb3J0dW5hdGVseSwgd2Uga25vdworCSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgTkxNCisJIGhlYWRlci4gICovCisgICAgICBpZiAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKKwkgICAgJiBTRUNfTE9BRCkgPT0gMCkKKwkgICYmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCisJICAgICAgICYgU0VDX0FMTE9DKSAhPSAwKSkKKwlhZGRlbmQgKz0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZVNpemU7CisKKyAgICAgIGlmIChhZGRlbmQgIT0gMAorCSAgJiYgcmVsLT5ob3d0byAhPSBOVUxMCisJICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKKwkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgorCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgorCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKKwkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKKwkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCisJeworCSAgYmZkX3ZtYSB2YWw7CisKKwkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKKwkgIHZhbCArPSBhZGRlbmQ7CisJICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsLT5hZGRyZXNzIC0gb2Zmc2V0KTsKKwkgIHJlbC0+YWRkZW5kID0gMDsKKwl9CisKKyAgICAgIC8qIE5ldFdhcmUgdXNlcyBhIHJlbG9jIHdpdGggcGNyZWxfb2Zmc2V0IHNldC4gIFdlIGFkanVzdAorCSBwY19yZWxhdGl2ZSByZWxvY3MgYWNjb3JkaW5nbHkuICBXZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZQorCSBob3d0byBmaWVsZCwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgY3VycmVudCBvbmUgaXMKKwkgY29tcGF0aWJsZS4gIFdlIHNob3VsZCBjaGVjayBzcGVjaWFsX2Z1bmN0aW9uIGhlcmUsIGJ1dCBhdAorCSB0aGUgbW9tZW50IGNvZmYtaTM4NiB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbiB3aGljaCBkb2VzIG5vdAorCSBhZmZlY3Qgd2hhdCB3ZSBhcmUgZG9pbmcgaGVyZS4gICovCisgICAgICBpZiAocmVsLT5ob3d0byAhPSBOVUxMCisJICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQorCSAgJiYgISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQKKwkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAorCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCisJICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCisJICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAorCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgorCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKKwl7CisJICBiZmRfdm1hIHZhbDsKKworCSAgLyogV2hlbiBwY3JlbF9vZmZzZXQgaXMgbm90IHNldCwgaXQgbWVhbnMgdGhhdCB0aGUgbmVnYXRpdmUKKwkgICAgIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZQorCSAgICAgbWVtb3J5IGxvY2F0aW9uLiAgV2UgbXVzdCBhZGQgaXQgYmFjayBpbi4gICovCisJICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7CisJICB2YWwgKz0gcmVsLT5hZGRyZXNzOworCSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7CisKKwkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBhIE5ldFdhcmUgaTM4NiBpbXBvcnQgcmVjb3JkICovCitzdGF0aWMgYm9vbGVhbgorbmxtX2kzODZfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOworeworICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KKyAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLworICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLworICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLworICBjaGFyICpuYW1lOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKKyAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQorICAgIHJldHVybiBmYWxzZTsKKyAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKKyAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKKyAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7CisgIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOworICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCisgICAgcmV0dXJuIGZhbHNlOworICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOworICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQorCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7CisgIGlmICghbmxtX3JlbG9jcykKKyAgICByZXR1cm4gZmFsc2U7CisgIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOworICBzeW0gLT4gcmNudCA9IDA7CisgIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgIAorICAgICAgaWYgKG5sbV9pMzg2X3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCisJCQkgICAgICAgJm5sbV9yZWxvY3MgLT4gcmVsb2MpCisJICA9PSBmYWxzZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOworICAgICAgbmxtX3JlbG9jcysrOworICAgICAgc3ltIC0+IHJjbnQrKzsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9pMzg2X3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKKyAgICAgYXN5bWJvbCAqc3ltOworICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgYmZkX2J5dGUgbGVuOworICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKKyAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKSAhPSBzaXplb2YoYmZkX2J5dGUpKQorICAgICAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQorICAgIHJldHVybiBmYWxzZTsKKworICBiZmRfcHV0XzMyIChhYmZkLCBjb3VudCwgdGVtcCk7CisgIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZih0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgaWYgKG5sbV9pMzg2X3dyaXRlX2ltcG9ydCAoYWJmZCwgcmVsb2NzW2ldLnNlYywKKwkJCQkgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI2luY2x1ZGUgIm5sbXN3YXAuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX2kzODZfYmFja2VuZCA9Cit7CisgICJOZXRXYXJlIExvYWRhYmxlIE1vZHVsZVwwMzIiLAorICBzaXplb2YgKE5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKKyAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KKyAgYmZkX2FyY2hfaTM4NiwKKyAgMCwKKyAgZmFsc2UsCisgIDAsCS8qIGJhY2tlbmRfb2JqZWN0X3AgKi8KKyAgMCwJLyogd3JpdGVfcHJlZml4X2Z1bmMgKi8KKyAgbmxtX2kzODZfcmVhZF9yZWxvYywKKyAgbmxtX2kzODZfbWFuZ2xlX3JlbG9jcywKKyAgbmxtX2kzODZfcmVhZF9pbXBvcnQsCisgIG5sbV9pMzg2X3dyaXRlX2ltcG9ydCwKKyAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCisgIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCisgIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKKyAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKKyAgbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwsCisgIDAsCS8qIHdyaXRlX2V4cG9ydCAqLworfTsKKworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJubG0zMi1pMzg2IgorI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJbmxtTkFNRShpMzg2X3ZlYykKKyNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX2kzODZfYmFja2VuZAorCisjaW5jbHVkZSAibmxtLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbTMyLXBwYy5jIGIvYmZkL25sbTMyLXBwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjJkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmxtMzItcHBjLmMKQEAgLTAsMCArMSwxMDQ1IEBACisvKiBTdXBwb3J0IGZvciAzMi1iaXQgUG93ZXJQQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworLyogVGhlIGZvcm1hdCBvZiBhIFBvd2VyUEMgTkxNIGNoYW5nZWQuICBEZWZpbmUgT0xERk9STUFUIHRvIGdldCB0aGUKKyAgIG9sZCBmb3JtYXQuICAqLworCisjZGVmaW5lIEFSQ0hfU0laRSAzMgorCisjaW5jbHVkZSAibmxtL3BwYy1leHQuaCIKKyNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG0zMl9wb3dlcnBjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgorCisjaW5jbHVkZSAibGlibmxtLmgiCisKKyNpZmRlZiBPTERGT1JNQVQKK3N0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AKKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeAorICBQQVJBTVMgKChiZmQgKikpOworI2VuZGlmCisKK3N0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOworc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQKKyAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKKworI2lmZGVmIE9MREZPUk1BVAorc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiwgaW50KSk7CisjZW5kaWYKKworc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0CisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKKworI2lmbmRlZiBPTERGT1JNQVQKK3N0YXRpYyBib29sZWFuIG5sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbgorICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOworc3RhdGljIGJmZF92bWEgbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQKKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOworI2VuZGlmCisMCisjaWZkZWYgT0xERk9STUFUCisKKy8qIFRoZSBwcmVmaXggaGVhZGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgb2xkIGZvcm1hdC4gICovCisKKy8qIFBvd2VyUEMgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCisgICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCisgICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobWVtY21wIChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSkgIT0gMAorICAgICAgfHwgYmZkX2hfZ2V0XzMyIChhYmZkLCBzLmhlYWRlclZlcnNpb24pICE9IE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04pCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgdGhlIHByZWZpeC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fcG93ZXJwY193cml0ZV9wcmVmaXggKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciBzOworCisgIG1lbXNldCAoJnMsIDAsIHNpemVvZiBzKTsKKyAgbWVtY3B5IChzLnNpZ25hdHVyZSwgTkxNMzJfUE9XRVJQQ19TSUdOQVRVUkUsIHNpemVvZiBzLnNpZ25hdHVyZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04sIHMuaGVhZGVyVmVyc2lvbik7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIDAsIHMub3JpZ2lucyk7CisKKyAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGFib3V0IHRoZSBkYXRlPyAgKi8KKworICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmcywgc2l6ZW9mIHMsIDEsIGFiZmQpICE9IHNpemVvZiBzKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmIC8qIE9MREZPUk1BVCAqLworDAorI2lmbmRlZiBPTERGT1JNQVQKKworLyogVGhlcmUgaXMgb25seSBvbmUgdHlwZSBvZiByZWxvYyBpbiBhIFBvd2VyUEMgTkxNLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG8gPQorICBIT1dUTyAoMCwJCQkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAzMiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIjMyIiwJCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLworCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCisKKy8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOworICAgICBhc2VjdGlvbiAqKnNlY3A7CisgICAgIGFyZWxlbnQgKnJlbDsKK3sKKyAgYmZkX2J5dGUgdGVtcFs0XTsKKyAgYmZkX3ZtYSB2YWw7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgaWYgKGJmZF9yZWFkICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQorICAgIHJldHVybiBmYWxzZTsKKworICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKKworICAvKiBUaGUgdmFsdWUgaXMgYSB3b3JkIG9mZnNldCBpbnRvIGVpdGhlciB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuCisgICAgIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoaWNoIG5lZWRzIHRvIGJlIGFkanVzdGVkLgorCisgICAgIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgZGF0YQorICAgICBzZWdtZW50LCBvciAxIGlmIHRoZSB2YWx1ZSBpcyBhbiBvZmZzZXQgaW50byB0aGUgdGV4dCBzZWdtZW50LgorCisgICAgIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGZpeHVwIHJhdGhlciB0aGFuIGFuIGltcG9ydGVkIHN5bWJvbCAodGhlCisgICAgIHN5bSBhcmd1bWVudCBpcyBOVUxMKSwgdGhlbiB0aGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAKKyAgICAgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCisgICAgIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgdmFsdWUsIG9yIDEgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIHRleHQKKyAgICAgc2VnbWVudCBzaG91bGQgYmUgYWRkZWQuCisKKyAgICAgSWYgdGhpcyBpcyBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMKKyAgICAgbm90IHVzZWQgYW5kIG11c3QgYmUgMC4gICovCisKKyAgaWYgKCh2YWwgJiBOTE1fSElCSVQpID09IDApCisgICAgbmFtZSA9IE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUU7CisgIGVsc2UKKyAgICB7CisgICAgICBuYW1lID0gTkxNX0NPREVfTkFNRTsKKyAgICAgIHZhbCAmPX4gTkxNX0hJQklUOworICAgIH0KKyAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7CisKKyAgaWYgKHN5bSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgodmFsICYgKE5MTV9ISUJJVCA+PiAxKSkgPT0gMCkKKwluYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKKyAgICAgIGVsc2UKKwl7CisJICBuYW1lID0gTkxNX0NPREVfTkFNRTsKKwkgIHZhbCAmPX4gKE5MTV9ISUJJVCA+PiAxKTsKKwl9CisgICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpLT5zeW1ib2xfcHRyX3B0cjsKKyAgICB9CisKKyAgcmVsLT5ob3d0byA9ICZubG1fcG93ZXJwY19ob3d0bzsKKworICByZWwtPmFkZHJlc3MgPSB2YWwgPDwgMjsKKyAgcmVsLT5hZGRlbmQgPSAwOworCisgIHJldHVybiB0cnVlOworfQorCisjZWxzZSAvKiBPTERGT1JNQVQgKi8KKworLyogVGhpcyByZWxvYyBoYW5kbGluZyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIG9sZCBmb3JtYXQuICAqLworCisvKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gIFBvd2VyUEMgTkxNcyB1c2UgWENPRkYKKyAgIHJlbG9jIHR5cGVzLCBhbmQgSSBoYXZlIGp1c3QgY29waWVkIHRoZSBYQ09GRiByZWxvYyB0YWJsZSBoZXJlLiAgKi8KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbXSA9Cit7CisgIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IHJlbG9jYXRpb24sIGJ1dCBzdG9yZSBuZWdhdGl2ZSB2YWx1ZS4gICovCisgIEhPV1RPICgxLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAtMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfTkVHIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCisgIEhPV1RPICgyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogMTYgYml0IFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KKyAgSE9XVE8gKDMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9UT0MiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzIGlzLiAgKi8KKyAgSE9XVE8gKDQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JUQiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBFeHRlcm5hbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KKyAgSE9XVE8gKDUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX0dMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogTG9jYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCisgIEhPV1RPICg2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9UQ0wiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIHsgNyB9LAorICAKKyAgLyogTm9uIG1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KKyAgSE9XVE8gKDgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX0JBIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgeyA5IH0sCisKKyAgLyogTm9uIG1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KKyAgSE9XVE8gKDB4YSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfQlIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICB7IDB4YiB9LAorCisgIC8qIEluZGlyZWN0IGxvYWQuICAqLworICBIT1dUTyAoMHhjLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9STCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIExvYWQgYWRkcmVzcy4gICovCisgIEhPV1RPICgweGQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JMQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgeyAweGUgfSwKKyAgCisgIC8qIE5vbi1yZWxvY2F0aW5nIHJlZmVyZW5jZS4gICovCisgIEhPV1RPICgweGYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JFRiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLCAgICAgCSAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICB7IDB4MTAgfSwKKyAgeyAweDExIH0sCisgIAorICAvKiBUT0MgcmVsYXRpdmUgaW5kaXJlY3QgbG9hZC4gICovCisgIEhPV1RPICgweDEyLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9UUkwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIFRPQyByZWxhdGl2ZSBsb2FkIGFkZHJlc3MuICAqLworICBIT1dUTyAoMHgxMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfVFJMQSIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBNb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCisgIEhPV1RPICgweDE0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SUlRCSSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogTW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLworICBIT1dUTyAoMHgxNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUlJUQkEiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIE1vZGlmaWFibGUgY2FsbCBhYnNvbHV0ZSBpbmRpcmVjdC4gICovCisgIEhPV1RPICgweDE2LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9DQUkiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIE1vZGlmaWFibGUgY2FsbCByZWxhdGl2ZS4gICovCisgIEhPV1RPICgweDE3LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKyAgCisgIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KKyAgSE9XVE8gKDB4MTgsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCisJIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCisJICJSX1JCQSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLworICAKKyAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLworICBIT1dUTyAoMHgxOSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUkJBQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBNb2RpZmlhYmxlIGJyYW5jaCByZWxhdGl2ZS4gICovCisgIEhPV1RPICgweDFhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUkVMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCisgIAorICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCisgIEhPV1RPICgweDFiLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAorCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCisJIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAorCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KK307CisKKyNkZWZpbmUgSE9XVE9fQ09VTlQgKHNpemVvZiBubG1fcG93ZXJwY19ob3d0b190YWJsZQkJXAorCQkgICAgIC8gc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlWzBdKQorCisvKiBSZWFkIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKKyAgYmZkX3ZtYSBsX3ZhZGRyOworICB1bnNpZ25lZCBsb25nIGxfc3ltbmR4OworICBpbnQgbF9ydHlwZTsKKyAgaW50IGxfcnNlY25tOworICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7CisKKyAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCisgIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogU3dhcCBpbiB0aGUgZmllbGRzLiAgKi8KKyAgbF92YWRkciA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0LmxfdmFkZHIpOworICBsX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0Lmxfc3ltbmR4KTsKKyAgbF9ydHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnR5cGUpOworICBsX3JzZWNubSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LmxfcnNlY25tKTsKKworICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KKyAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7CisgIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOworICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7CisKKyAgLyogV29yayBvdXQgdGhlIGFyZWxlbnQgZmllbGRzLiAgKi8KKyAgaWYgKHN5bSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYW4gaW1wb3J0LiAgc3ltX3B0cl9wdHIgaXMgZmlsbGVkIGluIGJ5CisJIG5sbV9jYW5vbmljYWxpemVfcmVsb2MuICAqLworICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNlY3Rpb24gKnNlYzsKKworICAgICAgaWYgKGxfc3ltbmR4ID09IDApCisJc2VjID0gY29kZV9zZWM7CisgICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAxKQorCXNlYyA9IGRhdGFfc2VjOworICAgICAgZWxzZSBpZiAobF9zeW1uZHggPT0gMikKKwlzZWMgPSBic3Nfc2VjOworICAgICAgZWxzZQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlYy0+c3ltYm9sX3B0cl9wdHI7CisgICAgfQorCisgIHJlbC0+YWRkZW5kID0gMDsKKworICBCRkRfQVNTRVJUICgobF9ydHlwZSAmIDB4ZmYpIDwgSE9XVE9fQ09VTlQpOworCisgIHJlbC0+aG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIChsX3J0eXBlICYgMHhmZik7CisKKyAgQkZEX0FTU0VSVCAocmVsLT5ob3d0by0+bmFtZSAhPSBOVUxMCisJICAgICAgJiYgKChsX3J0eXBlICYgMHg4MDAwKSAhPSAwCisJCSAgPyAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKKwkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCisJCSAgOiAocmVsLT5ob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cKKwkJICAgICA9PSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCkpCisJICAgICAgJiYgKChsX3J0eXBlID4+IDgpICYgMHgxZikgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZSAtIDEpOworCisgIGlmIChsX3JzZWNubSA9PSAwKQorICAgICpzZWNwID0gY29kZV9zZWM7CisgIGVsc2UgaWYgKGxfcnNlY25tID09IDEpCisgICAgeworICAgICAgKnNlY3AgPSBkYXRhX3NlYzsKKyAgICAgIGxfdmFkZHIgLT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZWwtPmFkZHJlc3MgPSBsX3ZhZGRyOworCisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYgLyogT0xERk9STUFUICovCisKKy8qIE1hbmdsZSBQb3dlclBDIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIGRhdGE7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBhIFBvd2VyUEMgTkxNIGltcG9ydCByZWNvcmQgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9wb3dlcnBjX3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKK3sKKyAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCisgIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KKyAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KKyAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KKyAgY2hhciAqbmFtZTsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKKyAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKKyAgICByZXR1cm4gKGZhbHNlKTsKKyAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKKyAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQorICAgIHJldHVybiAoZmFsc2UpOworICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOworICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOworICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKKyAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7CisgIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gKGZhbHNlKTsKKyAgcmNvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKKyAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKKwkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOworICBpZiAobmxtX3JlbG9jcyA9PSAoc3RydWN0IG5sbV9yZWxlbnQgKikgTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHN5bSAtPiByZWxvY3MgPSBubG1fcmVsb2NzOworICBzeW0gLT4gcmNudCA9IDA7CisgIHdoaWxlIChzeW0gLT4gcmNudCA8IHJjb3VudCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgIAorICAgICAgaWYgKG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCisJCQkJICAmbmxtX3JlbG9jcyAtPiByZWxvYykKKwkgID09IGZhbHNlKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247CisgICAgICBubG1fcmVsb2NzKys7CisgICAgICBzeW0gLT4gcmNudCsrOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZm5kZWYgT0xERk9STUFUCisKKy8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIGFzeW1ib2wgKnN5bTsKKyAgYmZkX3ZtYSB2YWw7CisgIGJmZF9ieXRlIHRlbXBbNF07CisKKyAgLyogUG93ZXJQQyBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgb25lIGtpbmQgb2YgcmVsb2MuICAqLworICBpZiAocmVsLT5hZGRlbmQgIT0gMAorICAgICAgfHwgcmVsLT5ob3d0byA9PSBOVUxMCisgICAgICB8fCByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ICE9IDAKKyAgICAgIHx8IHJlbC0+aG93dG8tPnNpemUgIT0gMgorICAgICAgfHwgcmVsLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgorICAgICAgfHwgcmVsLT5ob3d0by0+Yml0cG9zICE9IDAKKyAgICAgIHx8IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCisgICAgICB8fCAocmVsLT5ob3d0by0+c3JjX21hc2sgIT0gMHhmZmZmZmZmZiAmJiByZWwtPmFkZGVuZCAhPSAwKQorICAgICAgfHwgcmVsLT5ob3d0by0+ZHN0X21hc2sgIT0gMHhmZmZmZmZmZikKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKKworICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKKyAgICAgc2VnbWVudCwgcmlnaHRzaGlmdGVkIGJ5IHR3by4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwKKyAgICAgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzCisgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KKyAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKKyAgaWYgKCh2YWwgJiAzKSAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgdmFsID4+PSAyOworCisgIC8qIFRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSByZWxvYyBpcyBpbiB0aGUgZGF0YSBzZWN0aW9uLCBvciAxIGlmCisgICAgIHRoZSByZWxvYyBpcyBpbiB0aGUgY29kZSBzZWN0aW9uLiAgKi8KKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQorICAgIHZhbCAtPSBubG1fZ2V0X2RhdGFfbG93IChhYmZkKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHZhbCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKKyAgICAgIHZhbCB8PSBOTE1fSElCSVQ7CisgICAgfQorICAgIAorICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhbiBpbnRlcm5hbCByZWxvY2F0aW9uIGZpeHVwLiAgVGhlIHNlY29uZCBtb3N0CisJIHNpZ25pZmljYW50IGJpdCBpcyAwIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBkYXRhCisJIHNlZ21lbnQsIG9yIDEgaWYgaXQgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQuICAqLworICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQorCXZhbCB8PSBOTE1fSElCSVQgPj4gMTsKKyAgICB9CisKKyAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbHNlIC8qIE9MREZPUk1BVCAqLworCisvKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSByZWxvYyBoYW5kbGluZyBpbiB0aGUgb2xkIGZvcm1hdC4gICovCisKKy8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsLCBpbmR4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGFyZWxlbnQgKnJlbDsKKyAgICAgaW50IGluZHg7Cit7CisgIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3JlbG9jIGV4dDsKKyAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWMsICpic3Nfc2VjOworICBhc3ltYm9sICpzeW07CisgIGFzZWN0aW9uICpzeW1zZWM7CisgIHVuc2lnbmVkIGxvbmcgbF9zeW1uZHg7CisgIGludCBsX3J0eXBlOworICBpbnQgbF9yc2Vjbm07CisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOworICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7CisKKyAgLyogR2V0IHRoZSBzZWN0aW9ucyBub3csIGZvciBjb252ZW5pZW5jZS4gICovCisgIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOworICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOworCisgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOworICBzeW1zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7CisgIGlmIChpbmR4ICE9IC0xKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc2VjKSk7CisgICAgICBsX3N5bW5keCA9IGluZHggKyAzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChzeW1zZWMgPT0gY29kZV9zZWMpCisJbF9zeW1uZHggPSAwOworICAgICAgZWxzZSBpZiAoc3ltc2VjID09IGRhdGFfc2VjKQorCWxfc3ltbmR4ID0gMTsKKyAgICAgIGVsc2UgaWYgKHN5bXNlYyA9PSBic3Nfc2VjKQorCWxfc3ltbmR4ID0gMjsKKyAgICAgIGVsc2UKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGxfc3ltbmR4LCBleHQubF9zeW1uZHgpOworCisgIGZvciAoaG93dG8gPSBubG1fcG93ZXJwY19ob3d0b190YWJsZTsKKyAgICAgICBob3d0byA8IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgSE9XVE9fQ09VTlQ7CisgICAgICAgaG93dG8rKykKKyAgICB7CisgICAgICBpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPT0gcmVsLT5ob3d0by0+cmlnaHRzaGlmdAorCSAgJiYgaG93dG8tPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQorCSAgJiYgaG93dG8tPmJpdHNpemUgPT0gcmVsLT5ob3d0by0+Yml0c2l6ZQorCSAgJiYgaG93dG8tPnBjX3JlbGF0aXZlID09IHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCisJICAmJiBob3d0by0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcworCSAgJiYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gcmVsLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCisJICAgICAgfHwgKCEgcmVsLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCisJCSAgJiYgcmVsLT5hZGRlbmQgPT0gMCkpCisJICAmJiAoaG93dG8tPnNyY19tYXNrID09IHJlbC0+aG93dG8tPnNyY19tYXNrCisJICAgICAgfHwgKHJlbC0+aG93dG8tPnNyY19tYXNrID09IDAKKwkJICAmJiByZWwtPmFkZGVuZCA9PSAwKSkKKwkgICYmIGhvd3RvLT5kc3RfbWFzayA9PSByZWwtPmhvd3RvLT5kc3RfbWFzaworCSAgJiYgaG93dG8tPnBjcmVsX29mZnNldCA9PSByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCisJYnJlYWs7CisgICAgfQorICBpZiAoaG93dG8gPj0gbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyBIT1dUT19DT1VOVCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgbF9ydHlwZSA9IGhvd3RvLT50eXBlOworICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKKyAgICBsX3J0eXBlIHw9IDB4ODAwMDsKKyAgbF9ydHlwZSB8PSAoaG93dG8tPmJpdHNpemUgLSAxKSA8PCA4OworICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBsX3J0eXBlLCBleHQubF9ydHlwZSk7CisKKyAgYWRkcmVzcyA9IHJlbC0+YWRkcmVzczsKKworICBpZiAoc2VjID09IGNvZGVfc2VjKQorICAgIGxfcnNlY25tID0gMDsKKyAgZWxzZSBpZiAoc2VjID09IGRhdGFfc2VjKQorICAgIHsKKyAgICAgIGxfcnNlY25tID0gMTsKKyAgICAgIGFkZHJlc3MgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZV9zZWMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBsX3JzZWNubSwgZXh0LmxfcnNlY25tKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgYWRkcmVzcywgZXh0LmxfdmFkZHIpOworCisgIGlmIChiZmRfd3JpdGUgKCZleHQsIHNpemVvZiBleHQsIDEsIGFiZmQpICE9IHNpemVvZiBleHQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBhIFBvd2VyUEMgTkxNIGltcG9ydC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGFyZWxlbnQgKnJlbDsKK3sKKyAgcmV0dXJuIG5sbV9wb3dlcnBjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCwgLTEpOworfQorCisjZW5kaWYgLyogT0xERk9STUFUICovCisKKy8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gZXh0ZXJuYWwgc3ltYm9sLiAgVGhpcyByb3V0aW5lIGtlZXBzIGEgc3RhdGljCisgICBjb3VudCBvZiB0aGUgc3ltYm9sIGluZGV4LiAgRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCisgICBuZWNlc3NhcnksIGFuZCB0aGUgaW5kZXggbmV2ZXIgZ2V0cyByZXNldC4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIGJmZF9ieXRlIGxlbjsKKyAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKyNpZmRlZiBPTERGT1JNQVQKKyAgc3RhdGljIGludCBpbmR4OworI2VuZGlmCisKKyAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOworICBpZiAoKGJmZF93cml0ZSAoJmxlbiwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpICE9IHNpemVvZihiZmRfYnl0ZSkpCisgICAgICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisjaWZuZGVmIE9MREZPUk1BVAorICAgICAgaWYgKCEgbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLCByZWxvY3NbaV0ucmVsKSkKKwlyZXR1cm4gZmFsc2U7CisjZWxzZQorICAgICAgaWYgKCEgbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCisJCQkJICAgICByZWxvY3NbaV0ucmVsLCBpbmR4KSkKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBPTERGT1JNQVQKKyAgKytpbmR4OworI2VuZGlmCisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisjaWZuZGVmIE9MREZPUk1BVAorCisvKiBQb3dlclBDIE5ldHdhcmUgdXNlcyBhIHdvcmQgb2Zmc2V0LCBub3QgYSBieXRlIG9mZnNldCwgZm9yIHB1YmxpYworICAgc3ltYm9scy4gICovCisKKy8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9wb3dlcnBjX3NldF9wdWJsaWNfc2VjdGlvbiAoYWJmZCwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Cit7CisgIGlmIChzeW0tPnN5bWJvbC52YWx1ZSAmIE5MTV9ISUJJVCkKKyAgICB7CisgICAgICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+TkxNX0hJQklUOworICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9CisJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQorCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgICB9CisKKyAgc3ltLT5zeW1ib2wudmFsdWUgPDw9IDI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KKworc3RhdGljIGJmZF92bWEKK25sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0IChhYmZkLCBzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBiZmRfdm1hIG9mZnNldDsKKyAgYXNlY3Rpb24gKnNlYzsKKworICBvZmZzZXQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKKyAgc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOworICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQorICAgIHsKKyAgICAgIG9mZnNldCAtPSBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKKyAgICAgIG9mZnNldCB8PSBOTE1fSElCSVQ7CisgICAgfQorICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKKyAgICB7CisgICAgICAvKiBTRUNfQUxMT0MgaXMgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLworICAgICAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGNhbid0IGhhbmRsZSBhbiBleHBvcnRlZCBzeW1ib2wgdGhhdCBpcyBub3QgaW4gdGhlIGNvZGUgb3IKKwkgZGF0YSBzZWdtZW50LiAgKi8KKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcmV0dXJuIG9mZnNldDsKK30KKworI2VuZGlmIC8qICEgZGVmaW5lZCAoT0xERk9STUFUKSAqLworDAorI2luY2x1ZGUgIm5sbXN3YXAuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX3Bvd2VycGNfYmFja2VuZCA9Cit7CisgICJOZXRXYXJlIFBvd2VyUEMgTW9kdWxlIFwwMzIiLAorICBzaXplb2YgKE5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKKyNpZm5kZWYgT0xERk9STUFUCisgIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCisjZWxzZQorICBzaXplb2YgKHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIpLAorI2VuZGlmCisgIGJmZF9hcmNoX3Bvd2VycGMsCisgIDAsCisgIGZhbHNlLAorI2lmbmRlZiBPTERGT1JNQVQKKyAgMCwJLyogYmFja2VuZF9vYmplY3RfcCAqLworICAwLAkvKiB3cml0ZV9wcmVmaXggKi8KKyNlbHNlCisgIG5sbV9wb3dlcnBjX2JhY2tlbmRfb2JqZWN0X3AsCisgIG5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeCwKKyNlbmRpZgorICBubG1fcG93ZXJwY19yZWFkX3JlbG9jLAorICBubG1fcG93ZXJwY19tYW5nbGVfcmVsb2NzLAorICBubG1fcG93ZXJwY19yZWFkX2ltcG9ydCwKKyAgbmxtX3Bvd2VycGNfd3JpdGVfaW1wb3J0LAorI2lmbmRlZiBPTERGT1JNQVQKKyAgbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uLAorICBubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldCwKKyNlbHNlCisgIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLworICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLworI2VuZGlmCisgIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiwKKyAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCwKKyAgbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwsCisgIDAsCS8qIHdyaXRlX2V4cG9ydCAqLworfTsKKworI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkibmxtMzItcG93ZXJwYyIKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQlubG1OQU1FKHBvd2VycGNfdmVjKQorI2RlZmluZSBUQVJHRVRfQkFDS0VORF9EQVRBCQkmbmxtMzJfcG93ZXJwY19iYWNrZW5kCisKKyNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItc3BhcmMuYyBiL2JmZC9ubG0zMi1zcGFyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjNhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmxtMzItc3BhcmMuYwpAQCAtMCwwICsxLDQ0MCBAQAorLyogU3VwcG9ydCBmb3IgMzItYml0IFNQQVJDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjZGVmaW5lIEFSQ0hfU0laRSAzMgorCisjaW5jbHVkZSAibmxtL3NwYXJjMzItZXh0LmgiCisjZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCisKKyNpbmNsdWRlICJsaWJubG0uaCIKKworc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3JlYWRfcmVsb2MKKyAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcworICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfcmVhZF9pbXBvcnQKKyAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9pbXBvcnQKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOworc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsCisgIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKKworZW51bSByZWxvY190eXBlCisgIHsKKyAgICBSX1NQQVJDX05PTkUgPSAwLAorICAgIFJfU1BBUkNfOCwJCVJfU1BBUkNfMTYsCQlSX1NQQVJDXzMyLCAKKyAgICBSX1NQQVJDX0RJU1A4LAlSX1NQQVJDX0RJU1AxNiwJCVJfU1BBUkNfRElTUDMyLCAKKyAgICBSX1NQQVJDX1dESVNQMzAsCVJfU1BBUkNfV0RJU1AyMiwKKyAgICBSX1NQQVJDX0hJMjIsCVJfU1BBUkNfMjIsCisgICAgUl9TUEFSQ18xMywJCVJfU1BBUkNfTE8xMCwKKyAgICBSX1NQQVJDX0dPVDEwLAlSX1NQQVJDX0dPVDEzLAkJUl9TUEFSQ19HT1QyMiwKKyAgICBSX1NQQVJDX1BDMTAsCVJfU1BBUkNfUEMyMiwKKyAgICBSX1NQQVJDX1dQTFQzMCwKKyAgICBSX1NQQVJDX0NPUFksCisgICAgUl9TUEFSQ19HTE9CX0RBVCwJUl9TUEFSQ19KTVBfU0xPVCwKKyAgICBSX1NQQVJDX1JFTEFUSVZFLAorICAgIFJfU1BBUkNfVUEzMiwKKyAgICBSX1NQQVJDX21heAorICB9OworCisjaWYgMAorc3RhdGljIENPTlNUIGNoYXIgKkNPTlNUIHJlbG9jX3R5cGVfbmFtZXNbXSA9Cit7CisgICJSX1NQQVJDX05PTkUiLAorICAiUl9TUEFSQ184IiwJCSJSX1NQQVJDXzE2IiwJCSJSX1NQQVJDXzMyIiwKKyAgIlJfU1BBUkNfRElTUDgiLAkiUl9TUEFSQ19ESVNQMTYiLAkiUl9TUEFSQ19ESVNQMzIiLAorICAiUl9TUEFSQ19XRElTUDMwIiwJIlJfU1BBUkNfV0RJU1AyMiIsCisgICJSX1NQQVJDX0hJMjIiLAkiUl9TUEFSQ18yMiIsCisgICJSX1NQQVJDXzEzIiwJCSJSX1NQQVJDX0xPMTAiLAorICAiUl9TUEFSQ19HT1QxMCIsCSJSX1NQQVJDX0dPVDEzIiwJIlJfU1BBUkNfR09UMjIiLAorICAiUl9TUEFSQ19QQzEwIiwJIlJfU1BBUkNfUEMyMiIsCisgICJSX1NQQVJDX1dQTFQzMCIsCisgICJSX1NQQVJDX0NPUFkiLAorICAiUl9TUEFSQ19HTE9CX0RBVCIsCSJSX1NQQVJDX0pNUF9TTE9UIiwKKyAgIlJfU1BBUkNfUkVMQVRJVkUiLAorICAiUl9TUEFSQ19VQTMyIiwKK307CisjZW5kaWYKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbXSA9IAoreworICBIT1dUTyhSX1NQQVJDX05PTkUsICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKKyAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCisgIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAorfTsKKworLyogUmVhZCBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLworCitzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHsKKyAgdW5zaWduZWQgY2hhciBvZmZzZXRbNF07CisgIHVuc2lnbmVkIGNoYXIgYWRkZW5kWzRdOworICB1bnNpZ25lZCBjaGFyIHR5cGVbMV07CisgIHVuc2lnbmVkIGNoYXIgcGFkMVszXTsKK307CisKK3N0YXRpYyBib29sZWFuCitubG1fc3BhcmNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKKyAgICAgYXNlY3Rpb24gKipzZWNwOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIGJmZF92bWEgdmFsLCBhZGRlbmQ7CisgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgdW5zaWduZWQgaW50IHR5cGU7CisgIHN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgdG1wX3JlbG9jOworICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYzsKKworICBpZiAoYmZkX3JlYWQgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7CisgIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOworCisgICpzZWNwID0gY29kZV9zZWM7CisKKyAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdG1wX3JlbG9jLm9mZnNldCk7CisgIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5hZGRlbmQpOworICB0eXBlID0gYmZkX2dldF84IChhYmZkLCB0bXBfcmVsb2MudHlwZSk7CisKKyAgcmVsLT5hZGRyZXNzID0gdmFsOworICByZWwtPmFkZGVuZCA9IGFkZGVuZDsKKyAgcmVsLT5ob3d0byA9IE5VTEw7CisKKyAgZm9yIChpbmRleCA9IDA7CisgICAgICAgaW5kZXggPCBzaXplb2YobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOworICAgICAgIGluZGV4KyspCisgICAgaWYgKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XS50eXBlID09IHR5cGUpIHsKKyAgICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOworICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICBhZGRyZXNzID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWQsIGhvd3RvID0gJTA4bHhcbiIsCisJICAgX19GVU5DVElPTl9fLCByZWwtPmFkZHJlc3MsIHJlbC0+YWRkZW5kLCB0eXBlLCByZWwtPmhvd3RvKTsKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKKworfQorCisvKiBXcml0ZSBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIGJmZF92bWEgdmFsOworICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKKyAgdW5zaWduZWQgaW50IGluZGV4OworICBpbnQgdHlwZSA9IC0xOworICByZWxvY19ob3d0b190eXBlICp0bXA7CisKKyAgCisgIGZvciAoaW5kZXggPSAwOworICAgICAgIGluZGV4IDwgc2l6ZW9mIChubG0zMl9zcGFyY19ob3d0b190YWJsZSkgLyBzaXplb2YocmVsb2NfaG93dG9fdHlwZSk7CisgICAgICAgaW5kZXgrKykgeworICAgIHRtcCA9ICZubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF07CisKKyAgICBpZiAodG1wLT5yaWdodHNoaWZ0ID09IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQKKwkmJiB0bXAtPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQorCSYmIHRtcC0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCisJJiYgdG1wLT5wY19yZWxhdGl2ZSA9PSByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQorCSYmIHRtcC0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcworCSYmIHRtcC0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKKwkmJiB0bXAtPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrKSB7CisgICAgICB0eXBlID0gdG1wLT50eXBlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICh0eXBlID09IC0xKQorICAgIGFib3J0KCk7CisKKyAgLyoKKyAgICogTmV0d2FyZSB3YW50cyBhIGxpc3Qgb2YgcmVsb2NzIGZvciBlYWNoIGFkZHJlc3MuCisgICAqIEZvcm1hdCBpczoKKyAgICoJbG9uZwlvZmZzZXQKKyAgICoJbG9uZwlhZGRlbmQKKyAgICoJY2hhcgl0eXBlCisgICAqIFRoYXQgc2hvdWxkIGJlIGl0LgorICAgKi8KKworICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKKyAgICAgc2VnbWVudC4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZgorICAgICB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgICByZWxvY2F0aW9uLiAgKi8KKyNpZiAwCisgIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pICsgcmVsLT5hZGRyZXNzOworI2Vsc2UKKyAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICB2YWwgPSAlMDhseCwgYWRkZW5kID0gJTA4bHgsIHR5cGUgPSAlZFxuIiwKKwkgICBfX0ZVTkNUSU9OX18sIHZhbCwgcmVsLT5hZGRlbmQsIHJlbC0+aG93dG8tPnR5cGUpOworI2VuZGlmCisgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdG1wX3JlbG9jLm9mZnNldCk7CisgIGJmZF9wdXRfMzIgKGFiZmQsIHJlbC0+YWRkZW5kLCB0bXBfcmVsb2MuYWRkZW5kKTsKKyAgYmZkX3B1dF84IChhYmZkLCAoc2hvcnQpKHJlbC0+aG93dG8tPnR5cGUpLCB0bXBfcmVsb2MudHlwZSk7CisKKyAgaWYgKGJmZF93cml0ZSAoJnRtcF9yZWxvYywgMTIsIDEsIGFiZmQpICE9IDEyKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFuZ2xlIHJlbG9jcyBmb3IgU1BBUkMgTmV0V2FyZS4gIFdlIGNhbiBqdXN0IHVzZSB0aGUgc3RhbmRhcmQKKyAgIFNQQVJDIHJlbG9jcy4gICovCisKK3N0YXRpYyBib29sZWFuCitubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBkYXRhOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgYSBOZXRXYXJlIHNwYXJjIGltcG9ydCByZWNvcmQgKi8KK3N0YXRpYyBib29sZWFuCitubG1fc3BhcmNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOworeworICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KKyAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLworICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLworICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLworICBjaGFyICpuYW1lOworICAKKyAgLyoKKyAgICogRmlyc3QsIHJlYWQgaW4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9uCisgICAqIGVudHJpZXMgZm9yIHRoaXMgc3ltYm9sCisgICAqLworICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgcmNvdW50ID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7CisgIAorICAvKgorICAgKiBOZXh0LCByZWFkIGluIHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbAorICAgKi8KKyAgCisgIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKKyAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgLyoKKyAgICogVGhlbiByZWFkIGluIHRoZSBzeW1ib2wKKyAgICovCisgIAorICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQorICAgIHJldHVybiBmYWxzZTsKKyAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKKyAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKKyAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7CisgIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOworICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICAKKyAgLyoKKyAgICogTmV4dCwgc3RhcnQgcmVhZGluZyBpbiB0aGUgcmVsb2NzLgorICAgKi8KKyAgCisgIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCisJCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKKyAgaWYgKCFubG1fcmVsb2NzKQorICAgIHJldHVybiBmYWxzZTsKKyAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7CisgIHN5bSAtPiByY250ID0gMDsKKyAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICAgCisgICAgICBpZiAobmxtX3NwYXJjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCisJCQkgICAgICAmbmxtX3JlbG9jcyAtPiByZWxvYykKKwkgID09IGZhbHNlKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247CisgICAgICBubG1fcmVsb2NzKys7CisgICAgICBzeW0gLT4gcmNudCsrOworICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitubG1fc3BhcmNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBhcmVsZW50ICpyZWw7Cit7CisgIGNoYXIgdGVtcFs0XTsKKyAgYXNlY3Rpb24gKmNvZGUsICpkYXRhLCAqYnNzLCAqc3ltc2VjOworICBiZmRfdm1hIGJhc2U7CisKKyAgY29kZSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKKyAgZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgYnNzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7CisgIHN5bXNlYyA9ICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb247CisKKyAgaWYgKHN5bXNlYyA9PSBjb2RlKSB7CisgICAgYmFzZSA9IDA7CisgIH0gZWxzZSBpZiAoc3ltc2VjID09IGRhdGEpIHsKKyAgICBiYXNlID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZSk7CisgIH0gZWxzZSBpZiAoc3ltc2VjID09IGJzcykgeworICAgIGJhc2UgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlKSArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRhdGEpOworICB9IGVsc2UKKyAgICBiYXNlID0gMDsKKworI2lmZGVmIERFQlVHCisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgPCV4LCAxPlxuXHQiLAorCSAgIF9fRlVOQ1RJT05fXywgYmFzZSArICgqcmVsLT5zeW1fcHRyX3B0ciktPnZhbHVlKTsKKyNlbmRpZgorICBiZmRfcHV0XzMyIChhYmZkLCBiYXNlICsgKCpyZWwtPnN5bV9wdHJfcHRyKS0+dmFsdWUsIHRlbXApOworICBpZiAoYmZkX3dyaXRlICgoUFRSKXRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworICBiZmRfcHV0XzMyIChhYmZkLCAxLCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAoKFBUUil0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpID09IGZhbHNlKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKKyAgICAgYXN5bWJvbCAqc3ltOworICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgYmZkX2J5dGUgbGVuOworICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKKyAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQorICAgIHJldHVybiBmYWxzZTsKKworICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7CisgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKKyAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKKwkJCQkgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK25sbV9zcGFyY193cml0ZV9leHBvcnQgKGFiZmQsIHN5bSwgdmFsdWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltOworICAgICBiZmRfdm1hIHZhbHVlOworeworICBiZmRfYnl0ZSBsZW47CisgIGJmZF9ieXRlIHRlbXBbNF07CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICIlczogPCV4LCAlZCwgJXM+XG4iLAorCSAgIF9fRlVOQ1RJT05fXywgdmFsdWUsIHN0cmxlbiAoc3ltLT5uYW1lKSwgc3ltLT5uYW1lKTsKKyNlbmRpZgorICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgdGVtcCk7CisgIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKKworICBpZiAoYmZkX3dyaXRlICh0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0CisgICAgICB8fCBiZmRfd3JpdGUgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEKKyAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4KKyN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0CisKKyNpbmNsdWRlICJubG1zd2FwLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9zcGFyY19iYWNrZW5kID0KK3sKKyAgIk5ldFdhcmUgU1BBUkMgTW9kdWxlICAgXDAzMiIsCisgIHNpemVvZiAoTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKKyAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KKyAgYmZkX2FyY2hfc3BhcmMsCisgIDAsCisgIGZhbHNlLAorICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCisgIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCisgIG5sbV9zcGFyY19yZWFkX3JlbG9jLAorICBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcywKKyAgbmxtX3NwYXJjX3JlYWRfaW1wb3J0LAorICBubG1fc3BhcmNfd3JpdGVfaW1wb3J0LAorICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KKyAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KKyAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAorICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAorICBubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwsCisgIG5sbV9zcGFyY193cml0ZV9leHBvcnQKK307CisKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkibmxtMzItc3BhcmMiCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQlubG1OQU1FKHNwYXJjX3ZlYykKKyNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX3NwYXJjX2JhY2tlbmQKKworI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi5jIGIvYmZkL25sbTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ubG0zMi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIDMyLWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEFSQ0hfU0laRSAzMgorI2luY2x1ZGUgIm5sbWNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG02NC5jIGIvYmZkL25sbTY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjZDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9ubG02NC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIDY0LWJpdCBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEFSQ0hfU0laRSA2NAorI2luY2x1ZGUgIm5sbWNvZGUuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG1jb2RlLmggYi9iZmQvbmxtY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYWMwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmxtY29kZS5oCkBAIC0wLDAgKzEsMjA1NiBAQAorLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCisgICB0ZW1wbGF0ZS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAibGlibmxtLmgiCisKKy8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGRvIG5vdCB1c2UgdGhlIG5hbWVzIHRoZXkgYXBwZWFyIHRvIHVzZS4KKyAgIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBzaXplCisgICBvZiBOTE0gdGFyZ2V0IHdlIGFyZSB1c2luZy4gIEF0IGVhY2ggc2l6ZSB3ZSB1c2UgYSBkaWZmZXJlbnQgbmFtZSwKKyAgIGNvbnN0cnVjdGVkIGJ5IHRoZSBtYWNybyBubG1OQU1FLiAgRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3aGljaAorICAgaXMgbmFtZWQgbmxtX3N5bWJvbF90eXBlIGJlbG93IGlzIGFjdHVhbGx5IG5hbWVkIG5sbTMyX3N5bWJvbF90eXBlCisgICBpbiB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICovCisKKyNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0ZpeGVkX0hlYWRlcikKKyNkZWZpbmUgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpCisjZGVmaW5lIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikKKyNkZWZpbmUgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikKKyNkZWZpbmUgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKQorI2RlZmluZSBObG1fRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikKKworI2RlZmluZSBubG1fc3ltYm9sX3R5cGUJCQlubG1OQU1FKHN5bWJvbF90eXBlKQorI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCisjZGVmaW5lIG5sbV9nZXRfc3ltdGFiCQkJbmxtTkFNRShnZXRfc3ltdGFiKQorI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wJCW5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCisjZGVmaW5lIG5sbV9wcmludF9zeW1ib2wJCW5sbU5BTUUocHJpbnRfc3ltYm9sKQorI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvCQlubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKKyNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZAlubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKKyNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCisjZGVmaW5lIG5sbV9vYmplY3RfcAkJCW5sbU5BTUUob2JqZWN0X3ApCisjZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cwlubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQorI2RlZmluZSBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzCW5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQorCisjZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbihhYmZkLHNyYyxkc3QpIFwKKyAgKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCisjZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQoYWJmZCxzcmMsZHN0KSBcCisgIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYWJmZCkpKGFiZmQsc3JjLGRzdCkKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgYm9vbGVhbiBhZGRfYmZkX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGZsYWd3b3JkKSk7CitzdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4KKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQKKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIGZpbmRfbm9uemVybworICBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4KKyAgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dAorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3N5bWJvbF90YWJsZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcworICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucworICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZQorICBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworCisvKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKKyAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCisjaWYgQVJDSF9TSVpFID09IDY0CisjZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAorI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKKyNlbmRpZgorI2lmIEFSQ0hfU0laRSA9PSAzMgorI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKKyNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCisjZW5kaWYKKworY29uc3QgYmZkX3RhcmdldCAqCitubG1fb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IG5sbV90ZGF0YSAoYWJmZCk7CisgIGJvb2xlYW4gKCpiYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOworICBQVFIgeF9meGRoZHIgPSBOVUxMOworICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CisgIHN0cnVjdCBubG1fb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOworICBjb25zdCBjaGFyICpzaWduYXR1cmU7CisgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworCisgIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZAorICAgICBoZWFkZXIuICAqLworICBiYWNrZW5kX29iamVjdF9wID0gbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyAoYWJmZCk7CisgIGlmIChiYWNrZW5kX29iamVjdF9wKQorICAgIHsKKyAgICAgIGlmICghKCpiYWNrZW5kX29iamVjdF9wKSAoYWJmZCkpCisJZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOworICAgIH0KKworICAvKiBSZWFkIGluIHRoZSBmaXhlZCBsZW5ndGggcG9ydGlvbiBvZiB0aGUgTkxNIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLworCisgIHhfZnhkaGRyID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSk7CisgIGlmICh4X2Z4ZGhkciA9PSBOVUxMKQorICAgIGdvdG8gZ290X25vX21hdGNoOworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgeF9meGRoZHIsIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpICE9CisgICAgICBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7CisgICAgICBlbHNlCisJZ290byBnb3Rfbm9fbWF0Y2g7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBubG1fb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bworICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KKworICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBubG1fb2JqX3RkYXRhICopCisJICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5sbV9vYmpfdGRhdGEpKSk7CisgIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKKyAgICBnb3RvIGdvdF9ub19tYXRjaDsKKworICBubG1fdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOworCisgIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOworICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHhfZnhkaGRyLCBpX2Z4ZGhkcnApOworICBmcmVlICh4X2Z4ZGhkcik7CisgIHhfZnhkaGRyID0gTlVMTDsKKworICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBOTE0gZmlsZSBmb3IgdGhpcyBiYWNrZW5kIGJ5IG1hdGNoaW5nCisgICAgIHRoZSBOTE0gc2lnbmF0dXJlLiAqLworCisgIHNpZ25hdHVyZSA9IG5sbV9zaWduYXR1cmUgKGFiZmQpOworICBpZiAoc2lnbmF0dXJlICE9IE5VTEwKKyAgICAgICYmICpzaWduYXR1cmUgIT0gJ1wwJworICAgICAgJiYgc3RybmNtcCAoKGNoYXIgKikgaV9meGRoZHJwLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwKKwkJICBOTE1fU0lHTkFUVVJFX1NJWkUpICE9IDApCisgICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOworCisgIC8qIFRoZXJlJ3Mgbm8gc3VwcG9ydGVkIHdheSB0byBkaXNjb3ZlciB0aGUgZW5kaWFuZXNzIG9mIGFuIE5MTSwgc28gdGVzdCBmb3IKKyAgICAgYSBzYW5lIHZlcnNpb24gbnVtYmVyIGFmdGVyIGRvaW5nIGJ5dGUgc3dhcHBpbmcgYXBwcm9wcmlhdGUgZm9yIHRoaXMKKyAgICAgWFZFQy4gIChIYWNrIGFsZXJ0ISkgKi8KKworICBpZiAoaV9meGRoZHJwLT52ZXJzaW9uID4gMHhGRkZGKQorICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKworICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gY2hlY2sgZm9yIDMyIGJpdCB2ZXJzdXMgNjQgYml0IGFkZHJlc3NlcywKKyAgICAgc28gaWdub3JlIHRoaXMgZGlzdGluY3Rpb24gZm9yIG5vdy4gIChGSVhNRSkgKi8KKworICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSByZXF1aXJlZCBoZWFkZXIuICAqLworICBpZiAoIW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbiAoYWJmZCkpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKKyAgICAgIGVsc2UKKwlnb3RvIGdvdF9ub19tYXRjaDsKKyAgICB9CisKKyAgLyogQWRkIHRoZSBzZWN0aW9ucyBzdXBwbGllZCBieSBhbGwgTkxNJ3MsIGFuZCB0aGVuIHJlYWQgaW4gdGhlCisgICAgIGF1eGlsaWFyeSBoZWFkZXJzLiAgUmVhZGluZyB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMgbWF5IGNyZWF0ZQorICAgICBhZGRpdGlvbmFsIHNlY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgY3lnbnVzX2V4dCBoZWFkZXIuCisgICAgIEZyb20gdGhpcyBwb2ludCBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFuIE5MTSwgYW5kIGRvIG5vdAorICAgICB0cmVhdCBlcnJvcnMgYXMgaW5kaWNhdGluZyB0aGUgd3JvbmcgZm9ybWF0LiAgKi8KKworICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0NPREVfTkFNRSwKKwkJCWlfZnhkaGRycC0+Y29kZUltYWdlT2Zmc2V0LAorCQkJaV9meGRoZHJwLT5jb2RlSW1hZ2VTaXplLAorCQkJKFNFQ19DT0RFIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkgfCBTRUNfUkVMT0MpKQorICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSwKKwkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlT2Zmc2V0LAorCQkJICAgaV9meGRoZHJwLT5kYXRhSW1hZ2VTaXplLAorCQkJICAgKFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkgICAgfCBTRUNfUkVMT0MpKQorICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAorCQkJICAgKGZpbGVfcHRyKSAwLAorCQkJICAgaV9meGRoZHJwLT51bmluaXRpYWxpemVkRGF0YVNpemUsCisJCQkgICBTRUNfQUxMT0MpKQorICAgIGdvdG8gZ290X25vX21hdGNoOworCisgIGlmICghbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpKQorICAgIGdvdG8gZ290X25vX21hdGNoOworCisgIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzICE9IDAKKyAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQorICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKKyAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgIT0gMAorICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzICE9IDAKKyAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQorICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOworCisgIGFyY2ggPSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKKyAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKKyAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCAodW5zaWduZWQgbG9uZykgMCk7CisKKyAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOworICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldDsKKworICByZXR1cm4gKGFiZmQtPnh2ZWMpOworCitnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgorICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKK2dvdF9ub19tYXRjaDoKKyAgbmxtX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKKyAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQorICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOworICBpZiAoeF9meGRoZHIgIT0gTlVMTCkKKyAgICBmcmVlICh4X2Z4ZGhkcik7CisgIHJldHVybiAoTlVMTCk7Cit9CisKKy8qIEFkZCBhIHNlY3Rpb24gdG8gdGhlIGJmZC4gKi8KKworc3RhdGljIGJvb2xlYW4KK2FkZF9iZmRfc2VjdGlvbiAoYWJmZCwgbmFtZSwgb2Zmc2V0LCBzaXplLCBmbGFncykKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpuYW1lOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7Cit7CisgIGFzZWN0aW9uICpuZXdzZWN0OworCisgIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKKyAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICB9CisgIG5ld3NlY3QtPnZtYSA9IDA7CQkvKiBOTE0ncyBhcmUgcmVsb2NhdGFibGUuICovCisgIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IHNpemU7CisgIG5ld3NlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7CisgIG5ld3NlY3QtPmZsYWdzID0gZmxhZ3M7CisgIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IGJmZF9sb2cyICgwKTsJLyogRklYTUUgKi8KKyAgcmV0dXJuICh0cnVlKTsKK30KKworLyogUmVhZCBhbmQgc3dhcCBpbiB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlci4gIEFsbCB0aGUgZmllbGRzIG11c3QKKyAgIGV4aXN0IGluIHRoZSBOTE0sIGFuZCBtdXN0IGV4aXN0IGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWFkIGhlcmUuICovCisKK3N0YXRpYyBib29sZWFuCitubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICAvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KKworICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAorCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCisJCTEsIGFiZmQpICE9CisgICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkpCisgICAgcmV0dXJuIChmYWxzZSk7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKKwkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKKwkJMSwgYWJmZCkgIT0KKyAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxKQorICAgIHJldHVybiAoZmFsc2UpOworCisgIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KKworICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCisgICAgcmV0dXJuIChmYWxzZSk7CisgIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRlbXApOworCisgIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHJlc2VydmVkIGZpZWxkLiAqLworCisgIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKyAgICByZXR1cm4gKGZhbHNlKTsKKyAgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnJlc2VydmVkID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKKworICAvKiBSZWFkIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSwKKwkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCisJCTEsIGFiZmQpICE9CisgICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKKyAgICByZXR1cm4gKGZhbHNlKTsKKworICAvKiBSZWFkIHRoZSBzY3JlZW4gbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KKworICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCisJCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAorCQkxLCBhYmZkKSAhPQorICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkpCisgICAgcmV0dXJuIChmYWxzZSk7CisgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCisJCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKKwkJMSwgYWJmZCkgIT0KKyAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEpCisgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgLyogUmVhZCB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAorCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSwKKwkJMSwgYWJmZCkgIT0KKyAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQorICAgIHJldHVybiAoZmFsc2UpOworICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAorCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEsCisJCTEsIGFiZmQpICE9CisgICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQorICAgIHJldHVybiAoZmFsc2UpOworICByZXR1cm4gKHRydWUpOworfQorCisvKiBTd2FwIGFuZCB3cml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0CisgICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGlzIG9yZGVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICAvKiBXcml0ZSB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgsCisJCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCisJCSAxLCBhYmZkKSAhPQorICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQorICAgIHJldHVybiAoZmFsc2UpOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25UZXh0LAorCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKKwkJIDEsIGFiZmQpICE9CisgICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKKyAgICByZXR1cm4gKGZhbHNlKTsKKworICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgc3RhY2tTaXplIGZpZWxkLiAqLworCisgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnN0YWNrU2l6ZSwKKwkgICAgKGJmZF9ieXRlICopIHRlbXApOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQorICAgIHJldHVybiAoZmFsc2UpOworCisgIC8qIENvbnZlcnQgYW5kIHdyaXRlIHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KKworICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCwKKwkgICAgKGJmZF9ieXRlICopIHRlbXApOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQorICAgIHJldHVybiAoZmFsc2UpOworCisgIC8qIFdyaXRlIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCisJCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSwKKwkJIDEsIGFiZmQpICE9CisgICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKKyAgICByZXR1cm4gKGZhbHNlKTsKKworICAvKiBXcml0ZSB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCisKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCwKKwkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAorCQkgMSwgYWJmZCkgIT0KKyAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQorICAgIHJldHVybiAoZmFsc2UpOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZSwKKwkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKKwkJIDEsIGFiZmQpICE9CisgICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQorICAgIHJldHVybiAoZmFsc2UpOworCisgIC8qIFdyaXRlIHRoZSB0aHJlYWQgbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KKworICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAorCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCisJCSAxLCBhYmZkKSAhPQorICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkpCisgICAgcmV0dXJuIChmYWxzZSk7CisgIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAorCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAorCQkgMSwgYWJmZCkgIT0KKyAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpCisgICAgcmV0dXJuIChmYWxzZSk7CisgIHJldHVybiAodHJ1ZSk7Cit9CisKKy8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMuICBCZWNhdXNlIG9mCisgICB0aGUgYnJhaW5kZWFkIGRlc2lnbiwgd2UgaGF2ZSB0byBkbyBzdHJjbXBzIG9uIHN0cmluZ3Mgb2YgaW5kZXRlcm1pbmF0ZQorICAgbGVuZ3RoIHRvIGZpZ3VyZSBvdXQgd2hhdCBlYWNoIGF1eGlsaWFyeSBoZWFkZXIgaXMuICBFdmVuIHdvcnNlLCB3ZSBoYXZlCisgICBubyB3YXkgb2Yga25vd2luZyBob3cgbWFueSBhdXhpbGlhcnkgaGVhZGVycyB0aGVyZSBhcmUgb3Igd2hlcmUgdGhlIGVuZAorICAgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIGFyZSwgZXhjZXB0IGJ5IGZpbmRpbmcgc29tZXRoaW5nIHRoYXQgZG9lc24ndAorICAgbG9vayBsaWtlIGEga25vd24gYXV4aWxpYXJ5IGhlYWRlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgbmV3IHR5cGUKKyAgIG9mIGF1eGlsaWFyeSBoZWFkZXIgYWRkZWQgd2lsbCBicmVhayBhbGwgZXhpc3RpbmcgdG9vbHMgdGhhdCBkb24ndAorICAgcmVjb2duaXplIGl0LiAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciB0ZW1wc3RyWzE2XTsKKyAgbG9uZyBwb3NpdGlvbjsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOworICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wc3RyLCBzaXplb2YgKHRlbXBzdHIpLCAxLCBhYmZkKSAhPQorCSAgc2l6ZW9mICh0ZW1wc3RyKSkKKwlyZXR1cm4gKGZhbHNlKTsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkKKwlyZXR1cm4gKGZhbHNlKTsKKyAgICAgIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiVmVSc0lvTiMiLCA4KSA9PSAwKQorCXsKKwkgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCisJICAgIHJldHVybiAoZmFsc2UpOworCSAgbWVtY3B5IChubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKKwkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKKwkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tYWpvclZlcnNpb24pOworCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1pbm9yVmVyc2lvbik7CisJICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXZpc2lvbik7CisJICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnllYXIpOworCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGggPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubW9udGgpOworCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5ID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRheSk7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIk1lU3NBZ0VzIiwgOCkgPT0gMCkKKwl7CisJICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7CisJICBpZiAoYmZkX3JlYWQgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKKwkgICAgcmV0dXJuIChmYWxzZSk7CisJICBtZW1jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKKwkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlEID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmxhbmd1YWdlSUQpOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlT2Zmc2V0KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZUxlbmd0aCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50ID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VDb3VudCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVPZmZzZXQpOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlTGVuZ3RoKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0ID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFPZmZzZXQpOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGggPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YUxlbmd0aCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlT2Zmc2V0KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KKwkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVMZW5ndGgpOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YU9mZnNldCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhTGVuZ3RoKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9CisJICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucHJvZHVjdElEKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQwKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQxKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQyKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQzKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ0KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUgPQorCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ1KTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiQ29QeVJpR2hUPSIsIDEwKSA9PSAwKQorCXsKKwkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwKKwkJCXNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCksCisJCQkxLCBhYmZkKQorCSAgICAgICE9IHNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCkpCisJICAgIHJldHVybiAoZmFsc2UpOworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCkKKwkJCQkgLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoKSwKKwkJCTEsIDEsIGFiZmQpICE9IDEpCisJICAgIHJldHVybiAoZmFsc2UpOworCSAgLyogVGhlIGNvcHlyaWdodCBtZXNzYWdlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4gKi8KKwkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAorCQkgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKKwkJCTEsIGFiZmQpICE9CisJICAgICAgKChiZmRfc2l6ZV90eXBlKQorCSAgICAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKKwkgICAgcmV0dXJuIChmYWxzZSk7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkN1U3RIZUFkIiwgOCkgPT0gMCkKKwl7CisJICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOworCSAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7CisJICBmaWxlX3B0ciBkYXRhT2Zmc2V0OworCSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOworCSAgY2hhciBkYXRhU3RhbXBbOF07CisJICBQVFIgaGRyOworCisJICAvKiBSZWFkIHRoZSBzdGFtcCAoIkN1U3RIZUFkIikuICAqLworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLnN0YW1wLCAxLCBzaXplb2YgKHRoZHIuc3RhbXApLCBhYmZkKQorCSAgICAgICE9IHNpemVvZiAodGhkci5zdGFtcCkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC8qIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGlzIGN1c3RvbSBoZWFkZXIuICAqLworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmxlbmd0aCwgMSwgc2l6ZW9mICh0aGRyLmxlbmd0aCksIGFiZmQpCisJICAgICAgIT0gc2l6ZW9mICh0aGRyLmxlbmd0aCkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGhkckxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sZW5ndGgpOworCSAgLyogUmVhZCBmdXJ0aGVyIGZpZWxkcyBpZiB3ZSBoYXZlIHRoZW0uICAqLworCSAgaWYgKGhkckxlbmd0aCA8IE5MTV9UQVJHRVRfTE9OR19TSVpFKQorCSAgICBkYXRhT2Zmc2V0ID0gMDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhT2Zmc2V0LCAxLAorCQkJICAgIHNpemVvZiAodGhkci5kYXRhT2Zmc2V0KSwgYWJmZCkKKwkJICAhPSBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBkYXRhT2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFPZmZzZXQpOworCSAgICB9CisJICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFKQorCSAgICBkYXRhTGVuZ3RoID0gMDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhTGVuZ3RoLCAxLAorCQkJICAgIHNpemVvZiAodGhkci5kYXRhTGVuZ3RoKSwgYWJmZCkKKwkJICAhPSBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBkYXRhTGVuZ3RoID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFMZW5ndGgpOworCSAgICB9CisJICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKKwkgICAgbWVtc2V0IChkYXRhU3RhbXAsIDAsIHNpemVvZiAoZGF0YVN0YW1wKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGRhdGFTdGFtcCwgMSwgc2l6ZW9mIChkYXRhU3RhbXApLCBhYmZkKQorCQkgICE9IHNpemVvZiAoZGF0YVN0YW1wKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgaWYgYW55LiAgKi8KKwkgIGlmIChoZHJMZW5ndGggPD0gMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKKwkgICAgeworCSAgICAgIGhkciA9IE5VTEw7CisJICAgICAgaGRyTGVuZ3RoID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaGRyTGVuZ3RoIC09IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDg7CisJICAgICAgaGRyID0gYmZkX2FsbG9jIChhYmZkLCBoZHJMZW5ndGgpOworCSAgICAgIGlmIChoZHIgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCBoZHJMZW5ndGgsIGFiZmQpICE9IGhkckxlbmd0aCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSBDeWdudXMgaGVhZGVyLCBwcm9jZXNzIGl0LiAgT3RoZXJ3aXNlLAorCSAgICAganVzdCBzYXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gaW50ZXJwcmV0CisJICAgICBpdC4gICovCisJICBpZiAoc3RybmNtcCAoZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KSA9PSAwKQorCSAgICB7CisJICAgICAgZmlsZV9wdHIgcG9zOworCSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKKwkgICAgICBiZmRfYnl0ZSAqcCwgKnBlbmQ7CisKKwkgICAgICBCRkRfQVNTRVJUIChoZHJMZW5ndGggPT0gMCAmJiBoZHIgPT0gTlVMTCk7CisKKwkgICAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCk7CisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YUxlbmd0aCk7CisJICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBpZiAoYmZkX3JlYWQgKGNvbnRlbnRzLCAxLCBkYXRhTGVuZ3RoLCBhYmZkKSAhPSBkYXRhTGVuZ3RoKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBwb3MsIFNFRUtfU0VUKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICBtZW1jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksICJDeUduVXNFeCIsIDgpOworCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCA9IGRhdGFPZmZzZXQ7CisJICAgICAgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoID0gZGF0YUxlbmd0aDsKKworCSAgICAgIC8qIFRoaXMgZGF0YSB0aGlzIGhlYWRlciBwb2ludHMgdG8gcHJvdmlkZXMgYSBsaXN0IG9mCisJCSB0aGUgc2VjdGlvbnMgd2hpY2ggd2VyZSBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0IGZpbGUKKwkJIHdoaWNoIHdhcyBjb252ZXJ0ZWQgdG8gYmVjb21lIGFuIE5MTS4gIFdlIGxvY2F0ZQorCQkgdGhvc2Ugc2VjdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBCRkQuICBOb3RlIHRoYXQKKwkJIHRoaXMgaXMgbGlrZWx5IHRvIGNyZWF0ZSBhIHNlY29uZCAudGV4dCwgLmRhdGEgYW5kCisJCSAuYnNzIHNlY3Rpb247IHJldHJpZXZpbmcgdGhlIHNlY3Rpb25zIGJ5IG5hbWUgd2lsbAorCQkgZ2V0IHRoZSBhY3R1YWwgTkxNIHNlY3Rpb25zLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8KKwkJIGhhcHBlbi4gIFRoZSBzZWN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCB3aGljaAorCQkgbWF5IGJlIHN1YnNldHMgb2YgdGhlIE5MTSBzZWN0aW9uLCBjYW4gb25seSBiZSBmb3VuZAorCQkgdXNpbmcgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KKwkgICAgICBwID0gY29udGVudHM7CisJICAgICAgcGVuZCA9IHAgKyBkYXRhTGVuZ3RoOworCSAgICAgIHdoaWxlIChwIDwgcGVuZCkKKwkJeworCQkgIGNoYXIgKm5hbWU7CisJCSAgc2l6ZV90IGw7CisJCSAgZmlsZV9wdHIgZmlsZXBvczsKKwkJICBiZmRfc2l6ZV90eXBlIHNpemU7CisJCSAgYXNlY3Rpb24gKm5ld3NlYzsKKworCQkgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcworCQkgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKKwkJICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQorCQkgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCisJCSAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQorCQkgICAgICovCisKKwkJICBuYW1lID0gKGNoYXIgKikgcDsKKwkJICBsID0gc3RybGVuIChuYW1lKSArIDE7CisJCSAgbCA9IChsICsgMykgJn4gMzsKKwkJICBwICs9IGw7CisJCSAgZmlsZXBvcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcCk7CisJCSAgcCArPSA0OworCQkgIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOworCQkgIHAgKz0gNDsKKworCQkgIG5ld3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKKwkJICBpZiAobmV3c2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIG5ld3NlYy0+X3Jhd19zaXplID0gc2l6ZTsKKwkJICBpZiAoZmlsZXBvcyAhPSAwKQorCQkgICAgeworCQkgICAgICBuZXdzZWMtPmZpbGVwb3MgPSBmaWxlcG9zOworCQkgICAgICBuZXdzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAorCQkgICAgICBzaXplb2YgKHRoZHIuc3RhbXApKTsKKwkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9IGhkckxlbmd0aDsKKwkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OworCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7CisJICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwgZGF0YVN0YW1wLAorCQkgICAgICBzaXplb2YgKGRhdGFTdGFtcCkpOworCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyID0gaGRyOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiAodHJ1ZSk7Cit9CisKKy8qIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgbm9uLXplcm8gYnl0ZSBpbiBhIG1lbW9yeSBibG9jay4gICovCisKK3N0YXRpYyBib29sZWFuCitmaW5kX25vbnplcm8gKGJ1Ziwgc2l6ZSkKKyAgICAgUFRSIGJ1ZjsKKyAgICAgc2l6ZV90IHNpemU7Cit7CisgIGNoYXIgKnAgPSAoY2hhciAqKSBidWY7CisKKyAgd2hpbGUgKHNpemUtLSAhPSAwKQorICAgIGlmICgqcCsrICE9IDApCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBTd2FwIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgV2UgY3JlYXRlIHRob3NlCisgICBhdXhpbGlhcnkgaGVhZGVycyB3aGljaCBoYXZlIGJlZW4gc2V0IG5vbi16ZXJvLiAgV2UgZG8gbm90IHJlcXVpcmUKKyAgIHRoZSBjYWxsZXIgdG8gc2V0IHVwIHRoZSBzdGFtcCBmaWVsZHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIC8qIFdyaXRlIG91dCB0aGUgdmVyc2lvbiBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KKyAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKSwKKwkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyKSkpCisgICAgeworICAgICAgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyIHRoZHI7CisKKyAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIlZlUnNJb04jIiwgOCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiwKKwkJKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKKyAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uLAorCQkoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOworICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiwKKwkJKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOworICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyLAorCQkoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKKyAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGgsCisJCShiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKKyAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5LAorCQkoYmZkX2J5dGUgKikgdGhkci5kYXkpOworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogV3JpdGUgb3V0IHRoZSBleHRlbmRlZCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KKyAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCisJCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKKyAgICB7CisgICAgICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7CisKKyAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlELAorCQkoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCwKKwkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50LAorCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQsCisJCShiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoLAorCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGgsCisJCShiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoLAorCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCSAgICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLAorCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkQ291bnQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCwKKwkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOworICAgICAgcHV0X3dvcmQgKGFiZmQsCisJICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCwKKwkJKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwKKwkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUsCisJCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgIC8qIFdyaXRlIG91dCB0aGUgY29weXJpZ2h0IGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLworICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCisJCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCisgICAgeworICAgICAgTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIgdGhkcjsKKworICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ29QeVJpR2hUPSIsIDEwKTsKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuc3RhbXAsIHNpemVvZiAodGhkci5zdGFtcCksIDEsIGFiZmQpCisJICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aFswXSA9CisJbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGhkci5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLCAxLCAxLCBhYmZkKSAhPSAxKQorCXJldHVybiBmYWxzZTsKKyAgICAgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2UsCisJCSAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKKwkJICAgICAxLCBhYmZkKSAhPQorCSAgKChiZmRfc2l6ZV90eXBlKQorCSAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogV3JpdGUgb3V0IHRoZSBjdXN0b20gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICAqLworICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCksCisJCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKSkpCisgICAgeworICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKKyAgICAgIGJvb2xlYW4gZHM7CisgICAgICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKKworICAgICAgZHMgPSBmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLAorCQkJIHNpemVvZiAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXApKTsKKyAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7CisgICAgICBoZHJMZW5ndGggPSAoMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgKGRzID8gOCA6IDApCisJCSAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOworICAgICAgcHV0X3dvcmQgKGFiZmQsIGhkckxlbmd0aCwgdGhkci5sZW5ndGgpOworICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQsCisJCXRoZHIuZGF0YU9mZnNldCk7CisgICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCwKKwkJdGhkci5kYXRhTGVuZ3RoKTsKKyAgICAgIGlmICghIGRzKQorCXsKKwkgIEJGRF9BU1NFUlQgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoID09IDApOworCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIDEsCisJCQkgc2l6ZW9mICh0aGRyKSAtIHNpemVvZiAodGhkci5kYXRhU3RhbXApLCBhYmZkKQorCSAgICAgICE9IHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKKwkJICBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSk7CisJICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKGJmZF93cml0ZSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHIsIDEsCisJCQkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgsIGFiZmQpCisJICAgICAgIT0gbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIC8qIFdyaXRlIG91dCB0aGUgQ3lnbnVzIGRlYnVnZ2luZyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KKyAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKKwkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCisgICAgeworICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKKworICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ3VTdEhlQWQiLCA4KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCwKKwkJKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKKyAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+b2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKKyAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoLAorCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKKyAgICAgIG1lbWNweSAodGhkci5kYXRhU3RhbXAsICJDeUduVXNFeCIsIDgpOworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2UgcmVhZCB0aGUgTkxNJ3MgcHVibGljIHN5bWJvbHMgYW5kIHVzZSBpdCB0byBnZW5lcmF0ZSBhIGJmZCBzeW1ib2wKKyAgIHRhYmxlIChoZXksIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZykgb24gYSBvbmUtZm9yLW9uZSBiYXNpcy4gIFRodXMKKyAgIHVzZSB0aGUgbnVtYmVyIG9mIHB1YmxpYyBzeW1ib2xzIGFzIHRoZSBudW1iZXIgb2YgYmZkIHN5bWJvbHMgd2Ugd2lsbAorICAgaGF2ZSBvbmNlIHdlIGFjdHVhbGx5IGdldCBhcm91bmQgdG8gcmVhZGluZyB0aGVtIGluLgorCisgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLCBiYXNlZCBvbgorICAgdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBOVUxMIHRlcm1pbmF0ZSB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZAorICAgb24gdGhpcyBzaXplLiAqLworCitsb25nCitubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLworICBsb25nIHN5bWNvdW50OworICBsb25nIHN5bXRhYl9zaXplID0gMDsKKworICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKKyAgc3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKKwkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMKKwkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOworICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCArIDEpICogKHNpemVvZiAoYXN5bWJvbCkpOworICByZXR1cm4gKHN5bXRhYl9zaXplKTsKK30KKworLyogTm90ZSB0aGF0IGJmZF9nZXRfc3ltY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIHNsdXJwaW5nIHRoZQorICAgc3ltYm9sIHRhYmxlIGZhaWxzLiAqLworCitsb25nCitubG1fZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKiphbG9jYXRpb247Cit7CisgIG5sbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKKyAgYmZkX3NpemVfdHlwZSBjb3VudGVyID0gMDsKKworICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCisgICAgcmV0dXJuIC0xOworICBzeW1iYXNlID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKKyAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKKyAgICB7CisgICAgICAqYWxvY2F0aW9uKysgPSAmc3ltYmFzZS0+c3ltYm9sOworICAgICAgc3ltYmFzZSsrOworICAgICAgY291bnRlcisrOworICAgIH0KKyAgKmFsb2NhdGlvbiA9IChhc3ltYm9sICopIE5VTEw7CisgIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKK30KKworLyogTWFrZSBhbiBOTE0gc3ltYm9sLiAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuICAqLworCithc3ltYm9sICoKK25sbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBubG1fc3ltYm9sX3R5cGUgKm5ldzsKKworICBuZXcgPSAobmxtX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSk7CisgIGlmIChuZXcpCisgICAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7CisgIHJldHVybiAmbmV3LT5zeW1ib2w7Cit9CisKKy8qIEdldCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworCit2b2lkCitubG1fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Cit9CisKKy8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisKK3ZvaWQKK25sbV9wcmludF9zeW1ib2wgKGFiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgYWZpbGU7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKK3sKKyAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOworCisgIHN3aXRjaCAoaG93KQorICAgIHsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKKyAgICAgIGlmIChzeW1ib2wtPm5hbWUpCisJZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6CisgICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOworICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzIiwgc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKKyAgICAgIGlmIChzeW1ib2wtPm5hbWUpCisJZnByaW50ZiAoZmlsZSwgIiAlcyIsIHN5bWJvbC0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFNsdXJwIGluIG5sbSBzeW1ib2wgdGFibGUuCisKKyAgIEluIHRoZSBleHRlcm5hbCAoaW4tZmlsZSkgZm9ybSwgTkxNIGV4cG9ydCByZWNvcmRzIGFyZSB2YXJpYWJsZSBsZW5ndGgsCisgICB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybToKKworCTEgYnl0ZQkJbGVuZ3RoIG9mIHRoZSBzeW1ib2wgbmFtZSAoTikKKwlOIGJ5dGVzCQl0aGUgc3ltYm9sIG5hbWUKKwk0IGJ5dGVzCQl0aGUgc3ltYm9sIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGl0J3Mgc2VjdGlvbgorCisgICBXZSBhbHNvIHJlYWQgaW4gdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGFuZCBpbXBvcnQgcmVjb3Jkcy4gIEltcG9ydAorICAgcmVjb3JkcyBhcmUgdHJlYXRlZCBhcyB1bmRlZmluZWQgc3ltYm9scy4gIEFzIHdlIHJlYWQgdGhlIGltcG9ydAorICAgcmVjb3JkcyB3ZSBhbHNvIHJlYWQgaW4gdGhlIGFzc29jaWF0ZWQgcmVsb2MgaW5mb3JtYXRpb24sIHdoaWNoIGlzCisgICBhdHRhY2hlZCB0byB0aGUgc3ltYm9sLgorCisgICBUaGUgYmZkIHN5bWJvbHMgYXJlIGNvcGllZCB0byBTWU1QVFJTLgorCisgICBXaGVuIHdlIHJldHVybiwgdGhlIGJmZCBzeW1jb3VudCBpcyBlaXRoZXIgemVybyBvciBjb250YWlucyB0aGUgY29ycmVjdAorICAgbnVtYmVyIG9mIHN5bWJvbHMuCisqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLworICBiZmRfc2l6ZV90eXBlIHRvdHN5bWNvdW50OwkvKiBOdW1iZXIgb2YgTkxNIHN5bWJvbHMgKi8KKyAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsJLyogQ291bnRlciBvZiBOTE0gc3ltYm9scyAqLworICBubG1fc3ltYm9sX3R5cGUgKnN5bTsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBiZmQgc3ltYm9sICovCisgIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkvKiBTeW1ib2wgbGVuZ3RoIHJlYWQgaW50byBoZXJlICovCisgIHVuc2lnbmVkIGNoYXIgc3ltdHlwZTsJLyogVHlwZSBvZiBkZWJ1Z2dpbmcgc3ltYm9sICovCisgIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiBTeW1ib2wgb2Zmc2V0cyByZWFkIGludG8gaGVyZSAqLworICBib29sZWFuICgqcmVhZF9pbXBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqKSk7CisgIGJvb2xlYW4gKCpzZXRfcHVibGljX3NlY3Rpb25fZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqKSk7CisKKyAgaWYgKG5sbV9nZXRfc3ltYm9scyAoYWJmZCkgIT0gTlVMTCkKKyAgICByZXR1cm4gKHRydWUpOworCisgIC8qIFJlYWQgZWFjaCByYXcgTkxNIHN5bWJvbCwgdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBiZmQKKyAgICAgc3ltYm9sIHRhYmxlIGVudHJ5LgorCisgICAgIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSB0aGUgaW5pdGlhbCBiZmQgY2Fub25pY2FsIHN5bWJvbCBidWZmZXIgYmFzZWQgb24gYQorICAgICBvbmUtdG8tb25lIG1hcHBpbmcgb2YgdGhlIE5MTSBzeW1ib2xzIHRvIGNhbm9uaWNhbCBzeW1ib2xzLiAgV2UgYWN0dWFsbHkKKyAgICAgdXNlIGFsbCB0aGUgTkxNIHN5bWJvbHMsIHNvIHRoZXJlIHdpbGwgYmUgbm8gc3BhY2UgbGVmdCBvdmVyIGF0IHRoZSBlbmQuCisgICAgIFdoZW4gd2UgaGF2ZSBhbGwgdGhlIHN5bWJvbHMsIHdlIGJ1aWxkIHRoZSBjYWxsZXIncyBwb2ludGVyIHZlY3Rvci4gKi8KKworICBhYmZkLT5zeW1jb3VudCA9IDA7CisgIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOworICB0b3RzeW1jb3VudCA9IChpX2Z4ZGhkcnAtPm51bWJlck9mUHVibGljcworCQkgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzCisJCSArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOworICBpZiAodG90c3ltY291bnQgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gKHRydWUpOworICAgIH0KKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+cHVibGljc09mZnNldCwgU0VFS19TRVQpID09IC0xKQorICAgIHJldHVybiAoZmFsc2UpOworCisgIHN5bSA9ICgobmxtX3N5bWJvbF90eXBlICopCisJIGJmZF96YWxsb2MgKGFiZmQsIHRvdHN5bWNvdW50ICogc2l6ZW9mIChubG1fc3ltYm9sX3R5cGUpKSk7CisgIGlmICghc3ltKQorICAgIHJldHVybiBmYWxzZTsKKyAgbmxtX3NldF9zeW1ib2xzIChhYmZkLCBzeW0pOworCisgIC8qIFdlIHVzZSB0aGUgYmZkJ3Mgc3ltY291bnQgZGlyZWN0bHkgYXMgdGhlIGNvbnRyb2wgY291bnQsIHNvIHRoYXQgZWFybHkKKyAgICAgdGVybWluYXRpb24gb2YgdGhlIGxvb3AgbGVhdmVzIHRoZSBzeW1jb3VudCBjb3JyZWN0IGZvciB0aGUgc3ltYm9scyB0aGF0CisgICAgIHdlcmUgcmVhZC4gKi8KKworICBzZXRfcHVibGljX3NlY3Rpb25fZnVuYyA9IG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYyAoYWJmZCk7CisgIHN5bWNvdW50ID0gaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3M7CisgIHdoaWxlIChhYmZkLT5zeW1jb3VudCA8IHN5bWNvdW50KQorICAgIHsKKyAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKKwkgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKKwlyZXR1cm4gKGZhbHNlKTsKKyAgICAgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworICAgICAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7CisgICAgICBpZiAoIXN5bS0+c3ltYm9sLm5hbWUpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW0tPnN5bWJvbC5uYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpCisJICAhPSBzeW1sZW5ndGgpCisJcmV0dXJuIChmYWxzZSk7CisgICAgICAvKiBDYXN0IGF3YXkgY29uc3QuICAqLworICAgICAgKChjaGFyICopIChzeW0tPnN5bWJvbC5uYW1lKSlbc3ltbGVuZ3RoXSA9ICdcMCc7CisgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCisJcmV0dXJuIChmYWxzZSk7CisgICAgICBzeW0tPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOworICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgdGVtcCk7CisgICAgICBpZiAoc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMpCisJeworCSAgLyogTW9zdCBiYWNrZW5kcyBjYW4gdXNlIHRoZSBjb2RlIGJlbG93LCBidXQgdW5mb3J0dW5hdGVseQorCSAgICAgc29tZSB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lLiAgKi8KKwkgIGlmICgoKnNldF9wdWJsaWNfc2VjdGlvbl9mdW5jKSAoYWJmZCwgc3ltKSA9PSBmYWxzZSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgJiBOTE1fSElCSVQpCisJICAgIHsKKwkgICAgICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+TkxNX0hJQklUOworCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKKwkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KKwkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KKwkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOworCSAgICB9CisJfQorICAgICAgc3ltLT5yY250ID0gMDsKKyAgICAgIGFiZmQtPnN5bWNvdW50Kys7CisgICAgICBzeW0rKzsKKyAgICB9CisKKyAgLyogUmVhZCB0aGUgZGVidWdnaW5nIHJlY29yZHMuICAqLworCisgIGlmIChpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzID4gMCkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+ZGVidWdJbmZvT2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCisJcmV0dXJuIChmYWxzZSk7CisKKyAgICAgIHN5bWNvdW50ICs9IGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHM7CisgICAgICB3aGlsZSAoYWJmZC0+c3ltY291bnQgPCBzeW1jb3VudCkKKwl7CisJICBpZiAoKGJmZF9yZWFkICgoUFRSKSAmIHN5bXR5cGUsIHNpemVvZiAoc3ltdHlwZSksIDEsIGFiZmQpCisJICAgICAgICE9IHNpemVvZiAoc3ltdHlwZSkpCisJICAgfHwgYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkKKwkgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpICYgc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCisJCSAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7CisJICBzeW0tPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKKwkgIGlmICghc3ltLT5zeW1ib2wubmFtZSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW0tPnN5bWJvbC5uYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpCisJICAgICAgIT0gc3ltbGVuZ3RoKQorCSAgICByZXR1cm4gKGZhbHNlKTsKKwkgIC8qIENhc3QgYXdheSBjb25zdC4gICovCisJICAoKGNoYXIgKikgKHN5bS0+c3ltYm9sLm5hbWUpKVtzeW1sZW5ndGhdID0gJ1wwJzsKKwkgIHN5bS0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOworCSAgc3ltLT5zeW1ib2wudmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgdGVtcCk7CisJICBpZiAoc3ltdHlwZSA9PSAwKQorCSAgICB7CisJICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9CisJCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3ltdHlwZSA9PSAxKQorCSAgICB7CisJICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQorCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgICB9CisJICBzeW0tPnJjbnQgPSAwOworCSAgYWJmZC0+c3ltY291bnQrKzsKKwkgIHN5bSsrOworCX0KKyAgICB9CisKKyAgLyogUmVhZCBpbiB0aGUgaW1wb3J0IHJlY29yZHMuICBXZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGtub3cgaG93CisgICAgIHRvIHJlYWQgcmVsb2NzIGZvciB0aGlzIHRhcmdldC4gICovCisKKyAgcmVhZF9pbXBvcnRfZnVuYyA9IG5sbV9yZWFkX2ltcG9ydF9mdW5jIChhYmZkKTsKKyAgaWYgKHJlYWRfaW1wb3J0X2Z1bmMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0LCBTRUVLX1NFVCkKKwkgID09IC0xKQorCXJldHVybiAoZmFsc2UpOworCisgICAgICBzeW1jb3VudCArPSBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOworICAgICAgd2hpbGUgKGFiZmQtPnN5bWNvdW50IDwgc3ltY291bnQpCisJeworCSAgaWYgKCgqcmVhZF9pbXBvcnRfZnVuYykgKGFiZmQsIHN5bSkgPT0gZmFsc2UpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIHN5bSsrOworCSAgYWJmZC0+c3ltY291bnQrKzsKKwl9CisgICAgfQorCisgIHJldHVybiAodHJ1ZSk7Cit9CisMCisvKiBHZXQgdGhlIHJlbG9jcyBmb3IgYW4gTkxNIGZpbGUuICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHJlbG9jcy4KKyAgIEltcG9ydHMgYXJlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBvdGhlciBOTE0gZmlsZXMuICBXZQorICAgdHJlYXQgdGhlc2UgYXMgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICBSZWxvY2F0aW9uIGZpeHVwcworICAgYXJlIGludGVybmFsIHJlbG9jcy4KKworICAgVGhlIGFjdHVhbCBmb3JtYXQgdXNlZCB0byBzdG9yZSB0aGUgcmVsb2NzIGlzIG1hY2hpbmUgc3BlY2lmaWMuICAqLworCisvKiBSZWFkIGluIHRoZSByZWxvY2F0aW9uIGZpeHVwIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBzdG9yZWQgaW4KKyAgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcywgYW4gYXJyYXkgb2YgYXJlbGVudCBzdHJ1Y3R1cmVzLCBhbmQKKyAgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MsIGFuIGFycmF5IG9mIHNlY3Rpb24gcG9pbnRlcnMuICBUaGUKKyAgIHNlY3Rpb24gcG9pbnRlcnMgYXJlIG5lZWRlZCBiZWNhdXNlIHRoZSByZWxvY3MgYXJlIG5vdCBzb3J0ZWQgYnkKKyAgIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBib29sZWFuICgqcmVhZF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgbmxtX3N5bWJvbF90eXBlICosIGFzZWN0aW9uICoqLAorCQkJCWFyZWxlbnQgKikpOworICBiZmRfc2l6ZV90eXBlIGNvdW50OworICBhcmVsZW50ICpyZWxzOworICBhc2VjdGlvbiAqKnNlY3M7CisKKyAgaWYgKG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgIT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmVhZF9mdW5jID0gbmxtX3JlYWRfcmVsb2NfZnVuYyAoYWJmZCk7CisgIGlmIChyZWFkX2Z1bmMgPT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQsCisJCVNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb3VudCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7CisgIHJlbHMgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSk7CisgIHNlY3MgPSAoYXNlY3Rpb24gKiopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKKyAgaWYgKChyZWxzID09IE5VTEwgfHwgc2VjcyA9PSBOVUxMKSAmJiBjb3VudCAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSA9IHJlbHM7CisgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MgKGFiZmQpID0gc2VjczsKKworICAvKiBXZSBoYXZlIHRvIHJlYWQgcGllY2UgYnkgcGllY2UsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgbGFyZ2UKKyAgICAgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcmVsb2MgaW5mb3JtYXRpb24gaXMuICAqLworICB3aGlsZSAoY291bnQtLSAhPSAwKQorICAgIHsKKyAgICAgIGlmICgoKnJlYWRfZnVuYykgKGFiZmQsIChubG1fc3ltYm9sX3R5cGUgKikgTlVMTCwgc2VjcywgcmVscykgPT0gZmFsc2UpCisJeworCSAgbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSA9IE5VTEw7CisJICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKSA9IE5VTEw7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgKytzZWNzOworICAgICAgKytyZWxzOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2V0IHRoZSBudW1iZXIgb2YgcmVsb2NzLiAgVGhpcyByZWFsbHkganVzdCByZXR1cm5zIGFuIHVwcGVyIGJvdW5kLAorICAgc2luY2UgaXQgZG9lcyBub3QgYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB0aGVtIGJhc2VkIG9uIHRoZSBzZWN0aW9uLgorICAgVGhhdCB3aWxsIGJlIGhhbmRsZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseSByZWFkLiAgKi8KKworbG9uZworbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7Cit7CisgIG5sbV9zeW1ib2xfdHlwZSAqc3ltczsKKyAgYmZkX3NpemVfdHlwZSBjb3VudDsKKyAgdW5zaWduZWQgaW50IHJldDsKKworICAvKiBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZWFkIHJlbG9jcywganVzdCByZXR1cm4gMC4gICovCisgIGlmIChubG1fcmVhZF9yZWxvY19mdW5jIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZWl0aGVyIHRoZSBjb2RlIG9yIHRoZSBkYXRhIHNlY3Rpb24uICAqLworICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIChTRUNfQ09ERSB8IFNFQ19EQVRBKSkgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBzeW1zID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKKyAgaWYgKHN5bXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCisJcmV0dXJuIC0xOworICAgICAgc3ltcyA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7CisgICAgfQorCisgIHJldCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7CisKKyAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKKyAgd2hpbGUgKGNvdW50LS0gIT0gMCkKKyAgICB7CisgICAgICByZXQgKz0gc3ltcy0+cmNudDsKKyAgICAgICsrc3ltczsKKyAgICB9CisKKyAgcmV0dXJuIChyZXQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKK30KKworLyogR2V0IHRoZSByZWxvY3MgdGhlbXNlbHZlcy4gICovCisKK2xvbmcKK25sbV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHRyLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGFyZWxlbnQgKipyZWxwdHI7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworICBhcmVsZW50ICpyZWxzOworICBhc2VjdGlvbiAqKnNlY3M7CisgIGJmZF9zaXplX3R5cGUgY291bnQsIGk7CisgIHVuc2lnbmVkIGludCByZXQ7CisKKyAgLyogR2V0IHRoZSByZWxvY2F0aW9uIGZpeHVwcy4gICovCisgIHJlbHMgPSBubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpOworICBpZiAocmVscyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChubG1fc2x1cnBfcmVsb2NfZml4dXBzIChhYmZkKSA9PSBmYWxzZSkKKwlyZXR1cm4gLTE7CisgICAgICByZWxzID0gbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKTsKKyAgICB9CisgIHNlY3MgPSBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKTsKKworICByZXQgPSAwOworICBjb3VudCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByZWxzKyssIHNlY3MrKykKKyAgICB7CisgICAgICBpZiAoKnNlY3MgPT0gc2VjKQorCXsKKwkgICpyZWxwdHIrKyA9IHJlbHM7CisJICArK3JldDsKKwl9CisgICAgfQorCisgIC8qIEdldCB0aGUgaW1wb3J0IHN5bWJvbHMuICAqLworICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltYm9scysrKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnN5bTsKKworICAgICAgc3ltID0gKnN5bWJvbHM7CisgICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSA9PSBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyKQorCXsKKwkgIG5sbV9zeW1ib2xfdHlwZSAqbmxtX3N5bTsKKwkgIGJmZF9zaXplX3R5cGUgajsKKworCSAgbmxtX3N5bSA9IChubG1fc3ltYm9sX3R5cGUgKikgc3ltOworCSAgZm9yIChqID0gMDsgaiA8IG5sbV9zeW0tPnJjbnQ7IGorKykKKwkgICAgeworCSAgICAgIGlmIChubG1fc3ltLT5yZWxvY3Nbal0uc2VjdGlvbiA9PSBzZWMpCisJCXsKKwkJICAqcmVscHRyID0gJm5sbV9zeW0tPnJlbG9jc1tqXS5yZWxvYzsKKwkJICAoKnJlbHB0ciktPnN5bV9wdHJfcHRyID0gc3ltYm9sczsKKwkJICArK3JlbHB0cjsKKwkJICArK3JldDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAqcmVscHRyID0gTlVMTDsKKworICByZXR1cm4gcmV0OworfQorDAorLyogQ29tcHV0ZSB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyBmb3IgYW4gTkxNIGZpbGUuICBBbGwgdmFyaWFibGUKKyAgIGxlbmd0aCBkYXRhIGluIHRoZSBmaWxlIGhlYWRlcnMgbXVzdCBiZSBzZXQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMKKyAgIGNhbGxlZC4gIElmIHRoZSB2YXJpYWJsZSBsZW5ndGggZGF0YSBpcyBjaGFuZ2VkIGxhdGVyLCB0aGUKKyAgIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aWxsIGJlIGluY29ycmVjdC4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzCisgICBubyB3YXkgdG8gY2hlY2sgdGhpcy4KKworICAgVGhpcyByb3V0aW5lIGFsc28gc2V0cyB0aGUgU2l6ZSBhbmQgT2Zmc2V0IGZpZWxkcyBpbiB0aGUgZml4ZWQKKyAgIGhlYWRlci4KKworICAgSXQgYWxzbyBsb29rcyBvdmVyIHRoZSBzeW1ib2xzIGFuZCBtb3ZlcyBhbnkgY29tbW9uIHN5bWJvbHMgaW50bworICAgdGhlIC5ic3Mgc2VjdGlvbjsgTkxNIGhhcyBubyB3YXkgdG8gcmVwcmVzZW50IGEgY29tbW9uIHN5bWJvbC4KKyAgIFRoaXMgYXBwcm9hY2ggbWVhbnMgdGhhdCBlaXRoZXIgdGhlIHN5bWJvbHMgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbgorICAgc2V0IGF0IHRoaXMgcG9pbnQsIG9yIHRoZXJlIG11c3QgYmUgbm8gY29tbW9uIHN5bWJvbHMuICBXZSBuZWVkIHRvCisgICBtb3ZlIHRoZSBzeW1ib2xzIGF0IHRoaXMgcG9pbnQgc28gdGhhdCBtYW5nbGVfcmVsb2NzIGNhbiBzZWUgdGhlCisgICBmaW5hbCB2YWx1ZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBmaWxlX3B0ciBzb2ZhcjsKKyAgYXNlY3Rpb24gKnNlYzsKKyAgYmZkX3ZtYSB0ZXh0LCBkYXRhLCBic3M7CisgIGJmZF92bWEgdGV4dF9sb3csIGRhdGFfbG93OworICB1bnNpZ25lZCBpbnQgdGV4dF9hbGlnbiwgZGF0YV9hbGlnbiwgb3RoZXJfYWxpZ247CisgIGZpbGVfcHRyIHRleHRfcHRyLCBkYXRhX3B0ciwgb3RoZXJfcHRyOworICBhc2VjdGlvbiAqYnNzX3NlYzsKKyAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOworCisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIHRvIGhvbGQgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KKyAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOworICBpZiAoYnNzX3NlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUsCisJCQkgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCwKKwkJCSAgICBTRUNfQUxMT0MpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgICB9CisKKyAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisKKyAgLyogVGhlIGZpeGVkIGhlYWRlci4gICovCisgIHNvZmFyID0gbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSArIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCk7CisKKyAgLyogVGhlIHZhcmlhYmxlIGhlYWRlci4gICovCisgIHNvZmFyICs9IChzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkKKwkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxCisJICAgICsgTkxNX1RBUkdFVF9MT05HX1NJWkUJLyogc3RhY2tTaXplICovCisJICAgICsgTkxNX1RBUkdFVF9MT05HX1NJWkUJLyogcmVzZXJ2ZWQgKi8KKwkgICAgKyBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKQorCSAgICArIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpCisJICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxCisJICAgICsgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkKKwkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpOworCisgIC8qIFRoZSBhdXhpbGlhcnkgaGVhZGVycy4gICovCisgIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCksCisJCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcikpKQorICAgIHNvZmFyICs9IHNpemVvZiAoTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyKTsKKyAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCisJCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKKyAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpOworICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCisJCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCisgICAgc29mYXIgKz0gKHNpemVvZiAoTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIpCisJICAgICAgKyBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKTsKKyAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLAorCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcikpKQorICAgIHNvZmFyICs9IChzaXplb2YgKE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyKQorCSAgICAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOworICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLAorCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpKSkKKyAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyKTsKKworICAvKiBDb21wdXRlIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIGluIHR3byBwYXNzZXMuICBGaXJzdCBnZXQgdGhlCisgICAgIHNpemVzIG9mIHRoZSB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLCBhbmQgdGhlbiBzZXQgdGhlIGZpbGUKKyAgICAgcG9zaXRpb25zLiAgVGhpcyBjb2RlIGFsaWducyB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdXNpbmcgdGhlCisgICAgIHNhbWUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyB0aGF0IGFwcGx5IHRvIHRoZSBzZWN0aW9ucyBpbiBtZW1vcnk7CisgICAgIHRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnkuICAqLworICB0ZXh0ID0gMDsKKyAgdGV4dF9sb3cgPSAoYmZkX3ZtYSkgLSAxOworICB0ZXh0X2FsaWduID0gMDsKKyAgZGF0YSA9IDA7CisgIGRhdGFfbG93ID0gKGJmZF92bWEpIC0gMTsKKyAgZGF0YV9hbGlnbiA9IDA7CisgIGJzcyA9IDA7CisgIG90aGVyX2FsaWduID0gMDsKKyAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCisgICAgeworICAgICAgZmxhZ3dvcmQgZjsKKworICAgICAgc2VjLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHNlYy0+X3Jhd19zaXplLCAxIDw8IHNlYy0+YWxpZ25tZW50X3Bvd2VyKTsKKworICAgICAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKKyAgICAgIGlmIChmICYgU0VDX0NPREUpCisJeworCSAgdGV4dCArPSBzZWMtPl9yYXdfc2l6ZTsKKwkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpIDwgdGV4dF9sb3cpCisJICAgIHRleHRfbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKKwkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IHRleHRfYWxpZ24pCisJICAgIHRleHRfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKKwl9CisgICAgICBlbHNlIGlmIChmICYgU0VDX0RBVEEpCisJeworCSAgZGF0YSArPSBzZWMtPl9yYXdfc2l6ZTsKKwkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpIDwgZGF0YV9sb3cpCisJICAgIGRhdGFfbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKKwkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IGRhdGFfYWxpZ24pCisJICAgIGRhdGFfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKKwl9CisgICAgICBlbHNlIGlmIChmICYgU0VDX0hBU19DT05URU5UUykKKwl7CisJICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiBvdGhlcl9hbGlnbikKKwkgICAgb3RoZXJfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKKwl9CisgICAgICBlbHNlIGlmIChmICYgU0VDX0FMTE9DKQorCWJzcyArPSBzZWMtPl9yYXdfc2l6ZTsKKyAgICB9CisKKyAgbmxtX3NldF90ZXh0X2xvdyAoYWJmZCwgdGV4dF9sb3cpOworICBubG1fc2V0X2RhdGFfbG93IChhYmZkLCBkYXRhX2xvdyk7CisKKyAgaWYgKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEgKGFiZmQpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgTmV0V2FyZSBmb3JtYXQgZG9lcyBub3QgdXNlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gIFdlIG11c3QKKwkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFdlIHdpbGwgbmV2ZXIgd2luZCB1cAorCSB3cml0aW5nIHRob3NlIGZpbGUgbG9jYXRpb25zLCBzbyB0aGV5IHdpbGwgcmVtYWluIHplcm8uICAqLworICAgICAgZGF0YSArPSBic3M7CisgICAgICBic3MgPSAwOworICAgIH0KKworICB0ZXh0X3B0ciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgdGV4dF9hbGlnbik7CisgIGRhdGFfcHRyID0gQkZEX0FMSUdOICh0ZXh0X3B0ciArIHRleHQsIDEgPDwgZGF0YV9hbGlnbik7CisgIG90aGVyX3B0ciA9IEJGRF9BTElHTiAoZGF0YV9wdHIgKyBkYXRhLCAxIDw8IG90aGVyX2FsaWduKTsKKworICAvKiBGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBoZWFkZXIgZm9yIHdoaWNoIHdlIG5vdyBoYXZlIHRoZQorICAgICBpbmZvcm1hdGlvbi4gICovCisgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPSB0ZXh0X3B0cjsKKyAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZVNpemUgPSB0ZXh0OworICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlT2Zmc2V0ID0gZGF0YV9wdHI7CisgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VTaXplID0gZGF0YTsKKyAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA9IGJzczsKKworICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKKyAgICB7CisgICAgICBmbGFnd29yZCBmOworCisgICAgICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOworCisgICAgICBpZiAoZiAmIFNFQ19DT0RFKQorCXsKKwkgIHNlYy0+ZmlsZXBvcyA9IHRleHRfcHRyOworCSAgdGV4dF9wdHIgKz0gc2VjLT5fcmF3X3NpemU7CisJfQorICAgICAgZWxzZSBpZiAoZiAmIFNFQ19EQVRBKQorCXsKKwkgIHNlYy0+ZmlsZXBvcyA9IGRhdGFfcHRyOworCSAgZGF0YV9wdHIgKz0gc2VjLT5fcmF3X3NpemU7CisJfQorICAgICAgZWxzZSBpZiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpCisJeworCSAgc2VjLT5maWxlcG9zID0gb3RoZXJfcHRyOworCSAgb3RoZXJfcHRyICs9IHNlYy0+X3Jhd19zaXplOworCX0KKyAgICB9CisKKyAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9IG90aGVyX3B0cjsKKworICAvKiBNb3ZlIGFsbCBjb21tb24gc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24uICAqLworCisgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKKyAgaWYgKHN5bV9wdHJfcHRyICE9IE5VTEwpCisgICAgeworICAgICAgYXN5bWJvbCAqKnN5bV9lbmQ7CisgICAgICBiZmRfdm1hIGFkZDsKKworICAgICAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisgICAgICBhZGQgPSAwOworICAgICAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKKwl7CisJICBhc3ltYm9sICpzeW07CisJICBiZmRfdm1hIHNpemU7CisKKwkgIHN5bSA9ICpzeW1fcHRyX3B0cjsKKworCSAgaWYgKCFiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBQdXQgdGhlIGNvbW1vbiBzeW1ib2wgaW4gdGhlIC5ic3Mgc2VjdGlvbiwgYW5kIGluY3JlYXNlCisJICAgICB0aGUgc2l6ZSBvZiB0aGUgLmJzcyBzZWN0aW9uIGJ5IHRoZSBzaXplIG9mIHRoZSBjb21tb24KKwkgICAgIHN5bWJvbCAod2hpY2ggaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sKS4gICovCisJICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOworCSAgc2l6ZSA9IHN5bS0+dmFsdWU7CisJICBzeW0tPnZhbHVlID0gYnNzX3NlYy0+X3Jhd19zaXplICsgYWRkOworCSAgYWRkICs9IHNpemU7CisJICBhZGQgPSBCRkRfQUxJR04gKGFkZCwgMSA8PCBic3Nfc2VjLT5hbGlnbm1lbnRfcG93ZXIpOworCX0KKyAgICAgIGlmIChhZGQgIT0gMCkKKwl7CisJICBpZiAobmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YSAoYWJmZCkpCisJICAgIHsKKwkgICAgICAvKiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBjYXNlLCBidXQgc28gZmFyIGl0IGhhc24ndCBiZWVuCisJCSBuZWNlc3NhcnkuICAqLworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dW5pbml0aWFsaXplZERhdGFTaXplICs9IGFkZDsKKwkgIGJzc19zZWMtPl9yYXdfc2l6ZSArPSBhZGQ7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUbyBkbyB0aGlzIHdlIG5lZWQgdG8ga25vdyB3aGVyZQorICAgdGhlIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgbG9jYXRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGF0IG1lYW5zCisgICB0aGF0IHRoZSBzaXplcyBvZiBhbGwgdGhlIHNlY3Rpb25zIG11c3QgYmUgc2V0LCBhbmQgYWxsIHRoZQorICAgdmFyaWFibGUgc2l6ZSBoZWFkZXIgaW5mb3JtYXRpb24gbXVzdCBiZSBrbm93bi4gICovCisKK2Jvb2xlYW4KK25sbV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZQorICAgICAgJiYgbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIGkzODYgTmV0V2FyZSBoYXMgYSB2ZXJ5IHJlc3RyaWN0ZWQgc2V0IG9mIHJlbG9jcy4gIEluIG9yZGVyIGZvcgorICAgICBvYmpjb3B5IHRvIHdvcmssIHRoZSBOTE0gaTM4NiBiYWNrZW5kIG5lZWRzIGEgY2hhbmNlIHRvIHJld29yaworICAgICB0aGUgc2VjdGlvbiBjb250ZW50cyBzbyB0aGF0IGl0cyBzZXQgb2YgcmVsb2NzIHdpbGwgd29yay4gIElmIGFsbAorICAgICB0aGUgcmVsb2NzIGFyZSBhbHJlYWR5IGFjY2VwdGFibGUsIHRoaXMgd2lsbCBub3QgZG8gYW55dGhpbmcuICAqLworICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKKyAgICB7CisgICAgICBib29sZWFuICgqbWFuZ2xlX3JlbG9jc19mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLAorCQkJCQkgICAgIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKKworICAgICAgbWFuZ2xlX3JlbG9jc19mdW5jID0gbmxtX21hbmdsZV9yZWxvY3NfZnVuYyAoYWJmZCk7CisgICAgICBpZiAobWFuZ2xlX3JlbG9jc19mdW5jICE9IE5VTEwpCisJeworCSAgaWYgKCEoKm1hbmdsZV9yZWxvY3NfZnVuYykgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAorCQkJCSAgICAgIChiZmRfdm1hKSBvZmZzZXQsIGNvdW50KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdlIG5lZWQgdG8gc29ydCBhIGxpc3Qgb2YgcmVsb2NzIGFzc29jaWF0ZWQgd2l0aCBzZWN0aW9ucyB3aGVuIHdlCisgICB3cml0ZSBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCisKK3N0YXRpYyBpbnQKK25sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlIChwMSwgcDIpCisgICAgIGNvbnN0IHZvaWQgKnAxOworICAgICBjb25zdCB2b2lkICpwMjsKK3sKKyAgY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnIxID0gKGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICopIHAxOworICBjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcjIgPSAoY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgcDI7CisgIGludCBjbXA7CisKKyAgY21wID0gc3RyY21wICgoKnIxLT5yZWwtPnN5bV9wdHJfcHRyKS0+bmFtZSwKKwkJKCpyMi0+cmVsLT5zeW1fcHRyX3B0ciktPm5hbWUpOworICBpZiAoY21wICE9IDApCisgICAgcmV0dXJuIGNtcDsKKworICAvKiBXZSBzb3J0IGJ5IGFkZHJlc3Mgd2l0aGluIHN5bWJvbCB0byBtYWtlIHRoZSBzb3J0IG1vcmUgc3RhYmxlIGFuZAorICAgICBpbmNyZWFzZSB0aGUgY2hhbmNlcyB0aGF0IGRpZmZlcmVudCBob3N0cyB3aWxsIGdlbmVyYXRlIGJpdCBmb3IKKyAgICAgYml0IGVxdWl2YWxlbnQgcmVzdWx0cy4gICovCisgIHJldHVybiAoaW50KSAocjEtPnJlbC0+YWRkcmVzcyAtIHIyLT5yZWwtPmFkZHJlc3MpOworfQorCisvKiBXcml0ZSBvdXQgYW4gTkxNIGZpbGUuICBXZSB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgb3JkZXI6CisgICAgIGZpeGVkIGhlYWRlcgorICAgICB2YXJpYWJsZSBoZWFkZXIKKyAgICAgYXV4aWxpYXJ5IGhlYWRlcnMKKyAgICAgY29kZSBzZWN0aW9ucworICAgICBkYXRhIHNlY3Rpb25zCisgICAgIG90aGVyIHNlY3Rpb25zIChjdXN0b20gZGF0YSwgbWVzc2FnZXMsIGhlbHAsIHNoYXJlZCBOTE0sIFJQQywKKyAgICAgCQkgICAgIG1vZHVsZSBkZXBlbmRlbmNpZXMpCisgICAgIHJlbG9jYXRpb24gZml4dXBzCisgICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgKGltcG9ydHMpCisgICAgIHB1YmxpYyBzeW1ib2xzIChleHBvcnRzKQorICAgICBkZWJ1Z2dpbmcgcmVjb3JkcworICAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBvcmRlciB1c2VkIGJ5IHRoZSBOZXRXYXJlIHRvb2xzOyB0aGUKKyAgIGRpZmZlcmVuY2UgaXMgdGhhdCBOZXRXYXJlIHB1dHMgdGhlIHNlY3Rpb25zIG90aGVyIHRoYW4gY29kZSwgZGF0YQorICAgYW5kIGN1c3RvbSBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIE5MTS4gIEl0IGlzIGNvbnZlbmllbnQgZm9yIHVzIHRvCisgICBrbm93IHdoZXJlIHRoZSBzZWN0aW9ucyBhcmUgZ29pbmcgdG8gYmUgYmVmb3JlIHdvcnJ5aW5nIGFib3V0IHRoZQorICAgc2l6ZSBvZiB0aGUgb3RoZXIgaW5mb3JtYXRpb24uCisKKyAgIEJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIHNlY3Rpb24gZGF0YSBzaG91bGQKKyAgIGhhdmUgYmVlbiBvdXRwdXQgdXNpbmcgc2V0X3NlY3Rpb25fY29udGVudHMuICBOb3RlIHRoYXQgY3VzdG9tCisgICBkYXRhLCB0aGUgbWVzc2FnZSBmaWxlLCB0aGUgaGVscCBmaWxlLCB0aGUgc2hhcmVkIE5MTSBmaWxlLCB0aGUgUlBDCisgICBkYXRhLCBhbmQgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlCisgICBzZWN0aW9uczsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgb2Zmc2V0IGFuZAorICAgbGVuZ3RoIGZpZWxkcyBpbiB0aGUgTkxNIGhlYWRlcnMuICBUaGUgcmVsb2NhdGlvbiBmaXh1cHMgYW5kCisgICBpbXBvcnRzIGFyZSBib3RoIG9idGFpbmVkIGZyb20gdGhlIGxpc3Qgb2YgcmVsb2NzIGF0dGFjaGVkIHRvIGVhY2gKKyAgIHNlY3Rpb24uICBUaGUgZXhwb3J0cyBhbmQgZGVidWdnaW5nIHJlY29yZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlCisgICBsaXN0IG9mIG91dHN5bWJvbHMuICAqLworCitib29sZWFuCitubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzZWN0aW9uICpzZWM7CisgIGJvb2xlYW4gKCp3cml0ZV9pbXBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX2NvdW50LCBpbnRlcm5hbF9yZWxvY19jb3VudCwgaSwgYzsKKyAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKmV4dGVybmFsX3JlbG9jczsKKyAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOworICBmaWxlX3B0ciBsYXN0OworICBib29sZWFuICgqd3JpdGVfcHJlZml4X2Z1bmMpIFBBUkFNUyAoKGJmZCAqKSk7CisgIHVuc2lnbmVkIGNoYXIgKmZpeGVkX2hlYWRlciA9IE5VTEw7CisKKyAgZml4ZWRfaGVhZGVyID0gKCh1bnNpZ25lZCBjaGFyICopCisJCSAgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkpOworICBpZiAoZml4ZWRfaGVhZGVyID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UKKyAgICAgICYmIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpID09IGZhbHNlKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFdyaXRlIG91dCB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlcnMuICAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJICAgICBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpICsgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSwKKwkJU0VFS19TRVQpICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGlmIChubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0IChhYmZkKSA9PSBmYWxzZQorICAgICAgfHwgbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworICAgICAgZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIC8qIEEgd2VhayBjaGVjayBvbiB3aGV0aGVyIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIHdlcmUKKyAgICAgcmVhc29uYWJsZS4gICovCisgIGlmIChiZmRfdGVsbCAoYWJmZCkgPiBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0KQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgLyogQWR2YW5jZSB0byB0aGUgcmVsb2NzLiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAorCQlTRUVLX1NFVCkgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgZm9ybWF0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgaXMgZGVwZW5kZW50IHVwb24gdGhlCisgICAgIHBhcnRpY3VsYXIgdGFyZ2V0LiAgV2UgdXNlIGFuIGV4dGVybmFsIHJvdXRpbmUgdG8gd3JpdGUgdGhlIHJlbG9jCisgICAgIG91dC4gICovCisgIHdyaXRlX2ltcG9ydF9mdW5jID0gbmxtX3dyaXRlX2ltcG9ydF9mdW5jIChhYmZkKTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGludGVybmFsIHJlbG9jYXRpb24gZml4dXBzLiAgV2hpbGUgd2UncmUgbG9vcGluZworICAgICBvdmVyIHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQgdGhlIGV4dGVybmFsIHJlbG9jcywgd2hpY2ggaXMKKyAgICAgbmVlZGVkIHdoZW4gdGhleSBhcmUgd3JpdHRlbiBvdXQgYmVsb3cuICAqLworICBpbnRlcm5hbF9yZWxvY19jb3VudCA9IDA7CisgIGV4dGVybmFsX3JlbG9jX2NvdW50ID0gMDsKKyAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCisgICAgeworICAgICAgYXJlbGVudCAqKnJlbF9wdHJfcHRyLCAqKnJlbF9lbmQ7CisKKyAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIFdlIGNhbiBvbmx5IHJlcHJlc2VudCByZWxvY3Mgd2l0aGluIGEgY29kZSBvciBkYXRhCisJIHNlY3Rpb24uICBXZSBpZ25vcmUgdGhlbSBmb3IgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCisgICAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIChTRUNfQ09ERSB8IFNFQ19EQVRBKSkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogV2UgbmVlZCB0byBrbm93IGhvdyB0byB3cml0ZSBvdXQgaW1wb3J0cyAqLworICAgICAgaWYgKHdyaXRlX2ltcG9ydF9mdW5jID09IE5VTEwpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwkgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOworICAgICAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKKyAgICAgIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCisJeworCSAgYXJlbGVudCAqcmVsOworCSAgYXN5bWJvbCAqc3ltOworCisJICByZWwgPSAqcmVsX3B0cl9wdHI7CisJICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKKworCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCSAgICB7CisJICAgICAgKytpbnRlcm5hbF9yZWxvY19jb3VudDsKKwkgICAgICBpZiAoKCp3cml0ZV9pbXBvcnRfZnVuYykgKGFiZmQsIHNlYywgcmVsKSA9PSBmYWxzZSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgKytleHRlcm5hbF9yZWxvY19jb3VudDsKKwl9CisgICAgfQorICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzID0gaW50ZXJuYWxfcmVsb2NfY291bnQ7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBpbXBvcnRzIChyZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzKS4gIFRoZXNlCisgICAgIGFyZSBvdXRwdXQgYXMgYSBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBhbGwgdGhlIHJlbG9jcyBmb3IgdGhhdAorICAgICBzeW1ib2wsIHNvIHdlIG11c3QgZmlyc3QgZ2F0aGVyIHRvZ2V0aGVyIGFsbCB0aGUgcmVsb2NzIGFnYWluc3QKKyAgICAgZXh0ZXJuYWwgc3ltYm9scyBhbmQgc29ydCB0aGVtLiAgKi8KKyAgZXh0ZXJuYWxfcmVsb2NzID0KKyAgICAoc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgYmZkX2FsbG9jIChhYmZkLAorCQkJCQkoZXh0ZXJuYWxfcmVsb2NfY291bnQKKwkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYykpKTsKKyAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSAoc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgaSA9IDA7CisgIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQorICAgIHsKKyAgICAgIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOworCisgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICByZWxfcHRyX3B0ciA9IHNlYy0+b3JlbG9jYXRpb247CisgICAgICByZWxfZW5kID0gcmVsX3B0cl9wdHIgKyBzZWMtPnJlbG9jX2NvdW50OworICAgICAgZm9yICg7IHJlbF9wdHJfcHRyIDwgcmVsX2VuZDsgcmVsX3B0cl9wdHIrKykKKwl7CisJICBhcmVsZW50ICpyZWw7CisJICBhc3ltYm9sICpzeW07CisKKwkgIHJlbCA9ICpyZWxfcHRyX3B0cjsKKwkgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOworCisJICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJICAgIGNvbnRpbnVlOworCisJICBleHRlcm5hbF9yZWxvY3NbaV0ucmVsID0gcmVsOworCSAgZXh0ZXJuYWxfcmVsb2NzW2ldLnNlYyA9IHNlYzsKKwkgICsraTsKKwl9CisgICAgfQorCisgIEJGRF9BU1NFUlQgKGkgPT0gZXh0ZXJuYWxfcmVsb2NfY291bnQpOworCisgIC8qIFNvcnQgdGhlIGV4dGVybmFsIHJlbG9jcyBieSBuYW1lLiAgKi8KKyAgcXNvcnQgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgKHNpemVfdCkgZXh0ZXJuYWxfcmVsb2NfY291bnQsCisJIHNpemVvZiAoc3RydWN0IHJlbG9jX2FuZF9zZWMpLCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSk7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICAqLworICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOworICBjID0gMDsKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgZXh0ZXJuYWxfcmVsb2NfY291bnQpCisgICAgeworICAgICAgYXJlbGVudCAqcmVsOworICAgICAgYXN5bWJvbCAqc3ltOworICAgICAgYmZkX3NpemVfdHlwZSBqLCBjbnQ7CisKKyAgICAgICsrYzsKKworICAgICAgcmVsID0gZXh0ZXJuYWxfcmVsb2NzW2ldLnJlbDsKKyAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOworCisgICAgICBjbnQgPSAwOworICAgICAgZm9yIChqID0gaTsKKwkgICAoaiA8IGV4dGVybmFsX3JlbG9jX2NvdW50CisJICAgICYmICpleHRlcm5hbF9yZWxvY3Nbal0ucmVsLT5zeW1fcHRyX3B0ciA9PSBzeW0pOworCSAgIGorKykKKwkrK2NudDsKKworICAgICAgaWYgKCgqbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMgKGFiZmQpKSAoYWJmZCwgY250LCBzeW0sCisJCQkJCSAgICAgJmV4dGVybmFsX3JlbG9jc1tpXSkKKwkgID09IGZhbHNlKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpICs9IGNudDsKKyAgICB9CisKKyAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzID0gYzsKKworICAvKiBXcml0ZSBvdXQgdGhlIHB1YmxpYyBzeW1ib2xzIChleHBvcnRzKS4gICovCisgIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKKyAgaWYgKHN5bV9wdHJfcHRyICE9IChhc3ltYm9sICoqKSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF92bWEgKCpnZXRfcHVibGljX29mZnNldF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7CisgICAgICBib29sZWFuICgqd3JpdGVfZXhwb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZF92bWEpKTsKKworICAgICAgYXN5bWJvbCAqKnN5bV9lbmQ7CisKKyAgICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOworICAgICAgZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyA9IG5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jIChhYmZkKTsKKyAgICAgIHdyaXRlX2V4cG9ydF9mdW5jID0gbmxtX3dyaXRlX2V4cG9ydF9mdW5jIChhYmZkKTsKKyAgICAgIGMgPSAwOworICAgICAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisgICAgICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQorCXsKKwkgIGFzeW1ib2wgKnN5bTsKKwkgIGJmZF9ieXRlIGxlbjsKKwkgIGJmZF92bWEgb2Zmc2V0OworCSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKwkgIHN5bSA9ICpzeW1fcHRyX3B0cjsKKworCSAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKSkgPT0gMAorCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKKwkgICAgY29udGludWU7CisKKwkgICsrYzsKKworCSAgaWYgKGdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpCisJICAgIHsKKwkgICAgICAvKiBNb3N0IGJhY2tlbmRzIGNhbiB1c2UgdGhlIGNvZGUgYmVsb3csIGJ1dAorCQkgdW5mb3J0dW5hdGVseSBzb21lIHVzZSBhIGRpZmZlcmVudCBzY2hlbWUuICAqLworCSAgICAgIG9mZnNldCA9ICgqZ2V0X3B1YmxpY19vZmZzZXRfZnVuYykgKGFiZmQsIHN5bSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOworCSAgICAgIHNlYyA9IHN5bS0+c2VjdGlvbjsKKwkgICAgICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQorCQl7CisJCSAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOworCQkgIG9mZnNldCB8PSBOTE1fSElCSVQ7CisJCX0KKwkgICAgICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKKwkJeworCQkgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCisJCSAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2UgY2FuJ3QgaGFuZGxlIGFuIGV4cG9ydGVkIHN5bWJvbCB0aGF0IGlzIG5vdCBpbgorCQkgICAgIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4gICovCisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKwkJICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCSAgICB9CisKKwkgIGlmICh3cml0ZV9leHBvcnRfZnVuYykKKwkgICAgeworCSAgICAgIGlmICgoKndyaXRlX2V4cG9ydF9mdW5jKSAoYWJmZCwgc3ltLCBvZmZzZXQpID09IGZhbHNlKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOworCSAgICAgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkKKwkJICAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCisJCSAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCSAgICAgIHB1dF93b3JkIChhYmZkLCBvZmZzZXQsIHRlbXApOworCSAgICAgIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB9CisJfQorICAgICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUHVibGljcyA9IGM7CisKKyAgICAgIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIHJlY29yZHMuICBUaGUgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQorCSB3YW50cyB0byBiZSBhYmxlIHRvIGluaGliaXQgdGhpcywgc28gYXMgYSBzcGVjaWFsIGhhY2sgaWYKKwkgZGVidWdJbmZvT2Zmc2V0IGlzIHNldCB0byAtMSB3ZSBkb24ndCB3cml0ZSBhbnkgZGVidWdnaW5nCisJIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gbm90IGJlIGhhbmRsZWQgYnkgZmlkZGxpbmcgd2l0aCB0aGUKKwkgc3ltYm9sIHRhYmxlLCBiZWNhdXNlIGV4cG9ydGVkIHN5bWJvbHMgYXBwZWFyIGluIGJvdGggdGhlCisJIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGFuZCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID09IChmaWxlX3B0cikgLSAxKQorCXsKKwkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSAwOworCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKKwkgIGMgPSAwOworCSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOworCSAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisJICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQorCSAgICB7CisJICAgICAgYXN5bWJvbCAqc3ltOworCSAgICAgIGJmZF9ieXRlIHR5cGUsIGxlbjsKKwkgICAgICBiZmRfdm1hIG9mZnNldDsKKwkgICAgICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworCSAgICAgIHN5bSA9ICpzeW1fcHRyX3B0cjsKKworCSAgICAgIC8qIFRoZSBOTE0gbm90aW9uIG9mIGEgZGVidWdnaW5nIHN5bWJvbCBpcyBhY3R1YWxseSB3aGF0CisJCSBCRkQgY2FsbHMgYSBsb2NhbCBvciBnbG9iYWwgc3ltYm9sLiAgV2hhdCBCRkQgY2FsbHMgYQorCQkgZGVidWdnaW5nIHN5bWJvbCBOTE0gZG9lcyBub3QgdW5kZXJzdGFuZCBhdCBhbGwuICAqLworCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfTE9DQUwgfCBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCkpID09IDAKKwkJICB8fCAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKKwkJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJCWNvbnRpbnVlOworCisJICAgICAgKytjOworCisJICAgICAgb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7CisJICAgICAgc2VjID0gc3ltLT5zZWN0aW9uOworCSAgICAgIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCisJCXsKKwkJICBvZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7CisJCSAgdHlwZSA9IDE7CisJCX0KKwkgICAgICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKKwkJeworCQkgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCisJCSAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOworCQkgIHR5cGUgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl0eXBlID0gMjsKKworCSAgICAgIC8qIFRoZSB0eXBlIGlzIDAgZm9yIGRhdGEsIDEgZm9yIGNvZGUsIDIgZm9yIGFic29sdXRlLiAgKi8KKwkgICAgICBpZiAoYmZkX3dyaXRlICgmdHlwZSwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpCisJCSAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgcHV0X3dvcmQgKGFiZmQsIG9mZnNldCwgdGVtcCk7CisJICAgICAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkgICAgICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7CisJICAgICAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKQorCQkgICAhPSBzaXplb2YgKGJmZF9ieXRlKSkKKwkJICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB9CisJICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPSBjOworCX0KKyAgICB9CisKKyAgLyogTkxNTElOSyBmaWxscyBpbiBvZmZzZXQgdmFsdWVzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZGF0YSwgc28gd2UgZG8KKyAgICAgdGhlIHNhbWUuICAqLworICBsYXN0ID0gYmZkX3RlbGwgKGFiZmQpOworICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCA9PSAwKQorICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPSBsYXN0OworICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZU9mZnNldCA9PSAwKQorICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VPZmZzZXQgPSBsYXN0OworICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmN1c3RvbURhdGFPZmZzZXQgPT0gMCkKKyAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9IGxhc3Q7CisgIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9PSAwKQorICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID0gbGFzdDsKKyAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPT0gMCkKKyAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0gbGFzdDsKKyAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPT0gMCkKKyAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0gbGFzdDsKKyAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID09IDApCisgICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnB1YmxpY3NPZmZzZXQgPSBsYXN0OworICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9PSAwKQorICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSBsYXN0OworCisgIC8qIEF0IHRoaXMgcG9pbnQgZXZlcnl0aGluZyBoYXMgYmVlbiB3cml0dGVuIG91dCBleGNlcHQgdGhlIGZpeGVkCisgICAgIGhlYWRlci4gICovCisgIG1lbWNweSAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnNpZ25hdHVyZSwgbmxtX3NpZ25hdHVyZSAoYWJmZCksCisJICBOTE1fU0lHTkFUVVJFX1NJWkUpOworICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dmVyc2lvbiA9IE5MTV9IRUFERVJfVkVSU0lPTjsKKyAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldCA9CisgICAgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkKKyAgICAgLSBubG1fZ2V0X3RleHRfbG93IChhYmZkKSk7CisKKyAgLyogV2UgaGF2ZSBubyBjb252ZW5pZW50IHdheSBmb3IgdGhlIGNhbGxlciB0byBwYXNzIGluIHRoZSBleGl0CisgICAgIHByb2NlZHVyZSBvciB0aGUgY2hlY2sgdW5sb2FkIHByb2NlZHVyZSwgc28gdGhlIGNhbGxlciBtdXN0IHNldAorICAgICB0aGUgdmFsdWVzIGluIHRoZSBoZWFkZXIgdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gICovCisgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leGl0UHJvY2VkdXJlT2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOworICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ICE9IDApCisgICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0IC09CisgICAgICBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIHdyaXRlX3ByZWZpeF9mdW5jID0gbmxtX3dyaXRlX3ByZWZpeF9mdW5jIChhYmZkKTsKKyAgaWYgKHdyaXRlX3ByZWZpeF9mdW5jKQorICAgIHsKKyAgICAgIGlmICgoKndyaXRlX3ByZWZpeF9mdW5jKSAoYWJmZCkgPT0gZmFsc2UpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSBiZmRfdGVsbCAoYWJmZCkKKwkgICAgICA9PSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpKTsKKworICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKSwgZml4ZWRfaGVhZGVyKTsKKyAgaWYgKGJmZF93cml0ZSAoZml4ZWRfaGVhZGVyLCBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpLCAxLCBhYmZkKQorICAgICAgIT0gbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoZml4ZWRfaGVhZGVyICE9IE5VTEwpCisgICAgZnJlZSAoZml4ZWRfaGVhZGVyKTsKKyAgcmV0dXJuIHRydWU7CisKK2Vycm9yX3JldHVybjoKKyAgaWYgKGZpeGVkX2hlYWRlciAhPSBOVUxMKQorICAgIGZyZWUgKGZpeGVkX2hlYWRlcik7CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2JmZC9ubG1zd2FwLmggYi9iZmQvbmxtc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWNlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbmxtc3dhcC5oCkBAIC0wLDAgKzEsMTU3IEBACisvKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzd2FwcGluZyByb3V0aW5lcyBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCB1c2luZyBFTEYgc3VwcG9ydCBhcyB0aGUKKyAgIHRlbXBsYXRlLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFsdGhvdWdoIHRoaXMgaXMgYSBoZWFkZXIgZmlsZSwgaXQgZGVmaW5lcyBmdW5jdGlvbnMuICBJdCBpcworICAgaW5jbHVkZWQgYnkgTkxNIGJhY2tlbmRzIHRvIGRlZmluZSBzd2FwcGluZyBmdW5jdGlvbnMgdGhhdCB2YXJ5CisgICBmcm9tIG9uZSBOTE0gdG8gYW5vdGhlci4gIFRoZSBiYWNrZW5kIGNvZGUgbXVzdCBhcnJhbmdlIGZvcgorICAgTmxtX0V4dGVybmFsX3h4eHggdG8gYmUgZGVmaW5lZCBhcHByb3ByaWF0ZWx5LCBhbmQgY2FuIHRoZW4gaW5jbHVkZQorICAgdGhpcyBmaWxlIHRvIGdldCB0aGUgc3dhcHBpbmcgcm91dGluZXMuCisKKyAgIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3Igb25lIHN0cnVjdHVyZSwgdGhlIGZpeGVkIE5MTQorICAgZmlsZSBoZWFkZXIuICAqLworCitzdGF0aWMgdm9pZCBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwKKwkJCQkJICAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqKSk7CitzdGF0aWMgdm9pZCBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IFBBUkFNUyAoKGJmZCAqLAorCQkJCQkgICAgICAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqLAorCQkJCQkgICAgICAgUFRSKSk7CisKKy8qIFRyYW5zbGF0ZSBhbiBOTE0gZml4ZWQgbGVuZ3RoIGZpbGUgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdCBpbnRvIGFuIE5MTQorICAgZmlsZSBoZWFkZXIgaW4gaW50ZXJuYWwgZm9ybWF0LiAqLworCitzdGF0aWMgdm9pZAorbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luIChhYmZkLCByZWFsc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIHJlYWxzcmM7CisgICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmRzdDsKK3sKKyAgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqc3JjID0gKE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKikgcmVhbHNyYzsKKyAgbWVtY3B5IChkc3QtPnNpZ25hdHVyZSwgc3JjLT5zaWduYXR1cmUsIE5MTV9TSUdOQVRVUkVfU0laRSk7CisgIG1lbWNweSAoZHN0LT5tb2R1bGVOYW1lLCBzcmMtPm1vZHVsZU5hbWUsIE5MTV9NT0RVTEVfTkFNRV9TSVpFKTsKKyAgZHN0LT52ZXJzaW9uID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnZlcnNpb24pOworICBkc3QtPmNvZGVJbWFnZU9mZnNldCA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jb2RlSW1hZ2VPZmZzZXQpOworICBkc3QtPmNvZGVJbWFnZVNpemUgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y29kZUltYWdlU2l6ZSk7CisgIGRzdC0+ZGF0YUltYWdlT2Zmc2V0ID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmRhdGFJbWFnZU9mZnNldCk7CisgIGRzdC0+ZGF0YUltYWdlU2l6ZSA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5kYXRhSW1hZ2VTaXplKTsKKyAgZHN0LT51bmluaXRpYWxpemVkRGF0YVNpemUgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+dW5pbml0aWFsaXplZERhdGFTaXplKTsKKyAgZHN0LT5jdXN0b21EYXRhT2Zmc2V0ID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmN1c3RvbURhdGFPZmZzZXQpOworICBkc3QtPmN1c3RvbURhdGFTaXplID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmN1c3RvbURhdGFTaXplKTsKKyAgZHN0LT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQpOworICBkc3QtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzKTsKKyAgZHN0LT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKKyAgZHN0LT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzKTsKKyAgZHN0LT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KTsKKyAgZHN0LT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyk7CisgIGRzdC0+cHVibGljc09mZnNldCA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wdWJsaWNzT2Zmc2V0KTsKKyAgZHN0LT5udW1iZXJPZlB1YmxpY3MgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZQdWJsaWNzKTsKKyAgZHN0LT5kZWJ1Z0luZm9PZmZzZXQgPQorICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZGVidWdJbmZvT2Zmc2V0KTsKKyAgZHN0LT5udW1iZXJPZkRlYnVnUmVjb3JkcyA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZkRlYnVnUmVjb3Jkcyk7CisgIGRzdC0+Y29kZVN0YXJ0T2Zmc2V0ID0KKyAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNvZGVTdGFydE9mZnNldCk7CisgIGRzdC0+ZXhpdFByb2NlZHVyZU9mZnNldCA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5leGl0UHJvY2VkdXJlT2Zmc2V0KTsKKyAgZHN0LT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCk7CisgIGRzdC0+bW9kdWxlVHlwZSA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5tb2R1bGVUeXBlKTsKKyAgZHN0LT5mbGFncyA9CisgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5mbGFncyk7Cit9CisKKy8qIFRyYW5zbGF0ZSBhbiBOTE0gZml4ZWQgbGVuZ3RoIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvCisgICBhbiBOTE0gZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0LiAqLworCitzdGF0aWMgdm9pZAorbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCAoYWJmZCwgc3JjLCByZWFsZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKnNyYzsKKyAgICAgUFRSIHJlYWxkc3Q7Cit7CisgIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKmRzdCA9IChObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICopIHJlYWxkc3Q7CisgIG1lbXNldCAoZHN0LCAwLCBzaXplb2YgKmRzdCk7CisgIG1lbWNweSAoZHN0LT5zaWduYXR1cmUsIHNyYy0+c2lnbmF0dXJlLCBOTE1fU0lHTkFUVVJFX1NJWkUpOworICBtZW1jcHkgKGRzdC0+bW9kdWxlTmFtZSwgc3JjLT5tb2R1bGVOYW1lLCBOTE1fTU9EVUxFX05BTUVfU0laRSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+dmVyc2lvbiwKKwkJKGJmZF9ieXRlICopIGRzdC0+dmVyc2lvbik7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y29kZUltYWdlT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgZHN0LT5jb2RlSW1hZ2VPZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNvZGVJbWFnZVNpemUsCisJCShiZmRfYnl0ZSAqKSBkc3QtPmNvZGVJbWFnZVNpemUpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmRhdGFJbWFnZU9mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+ZGF0YUltYWdlT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5kYXRhSW1hZ2VTaXplLAorCQkoYmZkX2J5dGUgKikgZHN0LT5kYXRhSW1hZ2VTaXplKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT51bmluaXRpYWxpemVkRGF0YVNpemUsCisJCShiZmRfYnl0ZSAqKSBkc3QtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y3VzdG9tRGF0YU9mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+Y3VzdG9tRGF0YU9mZnNldCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y3VzdG9tRGF0YVNpemUsCisJCShiZmRfYnl0ZSAqKSBkc3QtPmN1c3RvbURhdGFTaXplKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgZHN0LT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcywKKwkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnJlbG9jYXRpb25GaXh1cE9mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMsCisJCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgZHN0LT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzLAorCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+cHVibGljc09mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+cHVibGljc09mZnNldCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZQdWJsaWNzLAorCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZlB1YmxpY3MpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmRlYnVnSW5mb09mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+ZGVidWdJbmZvT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZkRlYnVnUmVjb3JkcywKKwkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNvZGVTdGFydE9mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+Y29kZVN0YXJ0T2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5leGl0UHJvY2VkdXJlT2Zmc2V0LAorCQkoYmZkX2J5dGUgKikgZHN0LT5leGl0UHJvY2VkdXJlT2Zmc2V0KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCwKKwkJKGJmZF9ieXRlICopIGRzdC0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm1vZHVsZVR5cGUsCisJCShiZmRfYnl0ZSAqKSBkc3QtPm1vZHVsZVR5cGUpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmZsYWdzLAorCQkoYmZkX2J5dGUgKikgZHN0LT5mbGFncyk7Cit9CmRpZmYgLS1naXQgYS9iZmQvbnMzMmsuaCBiL2JmZC9uczMyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2M2JhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvbnMzMmsuaApAQCAtMCwwICsxLDQxIEBACisvKiBIZWFkZXIgZmlsZSBmb3IgbnMzMmsgcm91dGluZXMuCisgICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jYXRlX2NvbnRlbnRzCisgIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKKworZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzCisgIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosCisJICAgbG9uZyAoKikgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpLAorCSAgIGludCAoKikgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpKSk7CisKK2V4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCisgIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCisJICAgYmZkX3ZtYSwgYmZkX3ZtYSkpOworCitleHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOworZXh0ZXJuIGxvbmcgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlIFBBUkFNUyAoKGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKK2V4dGVybiBpbnQgX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKK2V4dGVybiBpbnQgX2JmZF9uczMya19wdXRfaW1tZWRpYXRlIFBBUkFNUyAoKGxvbmcsIGJmZF9ieXRlICosIGxvbmcsIGxvbmcpKTsKKworZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AKKyAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CitleHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfaW1tCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrbmV0YnNkLmMgYi9iZmQvbnMzMmtuZXRic2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIzNTZkCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL25zMzJrbmV0YnNkLmMKQEAgLTAsMCArMSw1MyBAQAorLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUJQllURVNfSU5fV09SRAk0CisjdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgorI2RlZmluZQlTRUdNRU5UX1NJWkUJNDA5NgorCisjZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9uczMyaworI2RlZmluZQlERUZBVUxUX01JRCAJTV81MzJfTkVUQlNECisKKyNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm5ldGJzZF8sT1ApCisKKyNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKKworLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbnMzMmstbmV0YnNkIgorCisjZGVmaW5lIG5zMzJrYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCisKKyNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQorCisvKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZQorICogZm9yIG1lIC0tIElXRAorICovCisjZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBuczMya2FvdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisKKyNpbmNsdWRlICJiZmQuaCIJCS8qIFRvIGVuc3VyZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gaXMgT0sgKi8KKworQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCitNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TKChiZmQgKmFiZmQgQU5ECisJICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworCisKKyNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9vYXN5cy5jIGIvYmZkL29hc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxNTYwZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9vYXN5cy5jCkBAIC0wLDAgKzEsMTUzNSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBvYXN5cyBvYmplY3RzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsIDxzYWNAY3lnbnVzLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBVTkRFUlNDT1JFX0hBQ0sgMQorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAib2FzeXMuaCIKKyNpbmNsdWRlICJsaWJvYXN5cy5oIgorCisvKiBYWFggLSBGSVhNRS4gIG9mZnNldG9mIGJlbG9uZ3MgaW4gdGhlIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyBpbgorICAgLi4vaW5jbHVkZS9zeXMuICovCisvKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdCAqLworCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHR5cGUsIGlkZW50aWZpZXIpIChzaXplX3QpICYoKCh0eXBlICopIDApLT5pZGVudGlmaWVyKQorI2VuZGlmCisKK3N0YXRpYyBib29sZWFuIG9hc3lzX3JlYWRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLAorCQkJCQkgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopKTsKK3N0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9yZWNvcmQgUEFSQU1TICgoYmZkICosCisJCQkJCSAgIG9hc3lzX3JlY29yZF9lbnVtX3R5cGUsCisJCQkJCSAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICosCisJCQkJCSAgIHNpemVfdCkpOworc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9lbmQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2RhdGEgUEFSQU1TICgoYmZkICopKTsKKworLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KK1BST1RPIChzdGF0aWMgYm9vbGVhbiwgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhLCAoYmZkICogQ09OU1QgYWJmZCkpOworCitzdGF0aWMgYm9vbGVhbgorb2FzeXNfcmVhZF9yZWNvcmQgKGFiZmQsIHJlY29yZCkKKyAgICAgYmZkICphYmZkOworICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOworeworICBpZiAoYmZkX3JlYWQgKChQVFIpIHJlY29yZCwgMSwgc2l6ZW9mIChyZWNvcmQtPmhlYWRlciksIGFiZmQpCisgICAgICAhPSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKChzaXplX3QpIHJlY29yZC0+aGVhZGVyLmxlbmd0aCA8PSAoc2l6ZV90KSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAoKChjaGFyICopIHJlY29yZCkgKyBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSksCisJCTEsIHJlY29yZC0+aGVhZGVyLmxlbmd0aCAtIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpLAorCQlhYmZkKQorICAgICAgIT0gcmVjb3JkLT5oZWFkZXIubGVuZ3RoIC0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KK3N0YXRpYyBzaXplX3QKK29hc3lzX3N0cmluZ19sZW5ndGggKHJlY29yZCkKKyAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKK3sKKyAgcmV0dXJuIHJlY29yZC0+aGVhZGVyLmxlbmd0aAorICAgIC0gKChjaGFyICopIHJlY29yZC0+c3ltYm9sLm5hbWUgLSAoY2hhciAqKSByZWNvcmQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisKK1NsdXJwIHRoZSBzeW1ib2wgdGFibGUgYnkgcmVhZGluZyBpbiBhbGwgdGhlIHJlY29yZHMgYXQgdGhlIHN0YXJ0IGZpbGUKK3RpbGwgd2UgZ2V0IHRvIHRoZSBmaXJzdCBzZWN0aW9uIHJlY29yZC4KKworV2UnbGwgc29ydCB0aGUgc3ltYm9sc3MgaW50byAgdHdvIGxpc3RzLCBkZWZpbmVkIGFuZCB1bmRlZmluZWQuIFRoZQordW5kZWZpbmVkIHN5bWJvbHMgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgdGFibGUgYWNjb3JkaW5nIHRvIHRoZWlyCityZWZuby4KKworV2UgZG8gdGhpcyBieSBwbGFjaW5nIGFsbCB1bmRlZmluZWQgc3ltYm9scyBhdCB0aGUgZnJvbnQgb2YgdGhlIHRhYmxlCittb3ZpbmcgaW4sIGFuZCB0aGUgZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIG1vdmluZyBiYWNrLgorCisqLworCitzdGF0aWMgYm9vbGVhbgorb2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQorICAgICBiZmQgKkNPTlNUIGFiZmQ7Cit7CisgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKKyAgb2FzeXNfZGF0YV90eXBlICpkYXRhID0gT0FTWVNfREFUQSAoYWJmZCk7CisgIGJvb2xlYW4gbG9vcCA9IHRydWU7CisgIGFzeW1ib2wgKmRlc3RfZGVmaW5lZDsKKyAgYXN5bWJvbCAqZGVzdDsKKyAgY2hhciAqc3RyaW5nX3B0cjsKKworCisgIGlmIChkYXRhLT5zeW1ib2xzICE9IChhc3ltYm9sICopIE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAvKiBCdXkgZW5vdWdoIG1lbW9yeSBmb3IgYWxsIHRoZSBzeW1ib2xzIGFuZCBhbGwgdGhlIG5hbWVzICovCisgIGRhdGEtPnN5bWJvbHMgPQorICAgIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSAqIGFiZmQtPnN5bWNvdW50KTsKKyNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKKyAgLyogYnV5IDEgbW9yZSBjaGFyIGZvciBlYWNoIHN5bWJvbCB0byBrZWVwIHRoZSB1bmRlcnNjb3JlIGluKi8KKyAgZGF0YS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgZGF0YS0+c3ltYm9sX3N0cmluZ19sZW5ndGggKworCQkJICAgICBhYmZkLT5zeW1jb3VudCk7CisjZWxzZQorICBkYXRhLT5zdHJpbmdzID0gYmZkX2FsbG9jIChhYmZkLCBkYXRhLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCk7CisjZW5kaWYKKyAgaWYgKCFkYXRhLT5zeW1ib2xzIHx8ICFkYXRhLT5zdHJpbmdzKQorICAgIHJldHVybiBmYWxzZTsKKworICBkZXN0X2RlZmluZWQgPSBkYXRhLT5zeW1ib2xzICsgYWJmZC0+c3ltY291bnQgLSAxOworCisgIHN0cmluZ19wdHIgPSBkYXRhLT5zdHJpbmdzOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworICB3aGlsZSAobG9vcCkKKyAgICB7CisKKyAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBzd2l0Y2ggKHJlY29yZC5oZWFkZXIudHlwZSkKKwl7CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06CisJICBicmVhazsKKwljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgorCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3N5bWJvbF9lbnVtOgorCSAgeworCSAgICBpbnQgZmxhZyA9IHJlY29yZC5oZWFkZXIudHlwZSA9PSAoaW50KSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bSA/CisJICAgIChCU0ZfTE9DQUwpIDogKEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUKTsKKworCisJICAgIHNpemVfdCBsZW5ndGggPSBvYXN5c19zdHJpbmdfbGVuZ3RoICgmcmVjb3JkKTsKKwkgICAgc3dpdGNoIChyZWNvcmQuc3ltYm9sLnJlbGIgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKKwkgICAgICB7CisJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgorCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07CisJCWRlc3QtPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCQlkZXN0LT5mbGFncyA9IDA7CisKKwkJYnJlYWs7CisJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgorCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07CisJCWRlc3QtPnNlY3Rpb24gPQorCQkgIE9BU1lTX0RBVEEgKGFiZmQpLT5zZWN0aW9uc1tyZWNvcmQuc3ltYm9sLnJlbGIgJgorCQkJCQkgICAgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107CisJCWlmIChyZWNvcmQuaGVhZGVyLnR5cGUgPT0gKGludCkgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0pCisJCSAgeworCQkgICAgZGVzdC0+ZmxhZ3MgPSBCU0ZfTE9DQUw7CisJCSAgICBpZiAoZGVzdC0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgKH4wKSkKKwkJICAgICAgeworCQkJLyogSXQgc2VlbXMgdGhhdCBzb21ldGltZXMgaW50ZXJuYWwgc3ltYm9scyBhcmUgdGllZCB1cCwgYnV0CisJCSAgICAgICBzdGlsbCBnZXQgb3V0cHV0LCBldmVuIHRob3VnaCB0aGVyZSBpcyBubworCQkgICAgICAgc2VjdGlvbiAqLworCQkJZGVzdC0+c2VjdGlvbiA9IDA7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICB7CisKKwkJICAgIGRlc3QtPmZsYWdzID0gZmxhZzsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKKwkJZGVzdCA9IGRhdGEtPnN5bWJvbHMgKyBiZmRfaF9nZXRfMTYgKGFiZmQsIHJlY29yZC5zeW1ib2wucmVmbm8pOworCQlkZXN0LT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgorCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07CisJCWRlc3QtPm5hbWUgPSBzdHJpbmdfcHRyOworCQlkZXN0LT50aGVfYmZkID0gYWJmZDsKKworCQlkZXN0LT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKKworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQlkZXN0ID0gZGVzdF9kZWZpbmVkLS07CisJCUJGRF9BU1NFUlQgKDApOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGRlc3QtPm5hbWUgPSBzdHJpbmdfcHRyOworCSAgICBkZXN0LT50aGVfYmZkID0gYWJmZDsKKwkgICAgZGVzdC0+dWRhdGEucCA9IChQVFIpIE5VTEw7CisJICAgIGRlc3QtPnZhbHVlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc3ltYm9sLnZhbHVlKTsKKworI2lmZGVmIFVOREVSU0NPUkVfSEFDSworCSAgICBpZiAocmVjb3JkLnN5bWJvbC5uYW1lWzBdICE9ICdfJykKKwkgICAgICB7CisJCXN0cmluZ19wdHJbMF0gPSAnXyc7CisJCXN0cmluZ19wdHIrKzsKKwkgICAgICB9CisjZW5kaWYKKwkgICAgbWVtY3B5IChzdHJpbmdfcHRyLCByZWNvcmQuc3ltYm9sLm5hbWUsIGxlbmd0aCk7CisKKworCSAgICBzdHJpbmdfcHRyW2xlbmd0aF0gPSAwOworCSAgICBzdHJpbmdfcHRyICs9IGxlbmd0aCArIDE7CisJICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgbG9vcCA9IGZhbHNlOworCX0KKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgbG9uZworb2FzeXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKKyAgICAgYmZkICpDT05TVCBhYmZkOworeworICBpZiAoISBvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChvYXN5c19zeW1ib2xfdHlwZSAqKSk7Cit9CisKKy8qCisqLworCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7CisKK2xvbmcKK29hc3lzX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKK3sKKyAgYXN5bWJvbCAqc3ltYmFzZTsKKyAgdW5zaWduZWQgaW50IGNvdW50ZXI7CisgIGlmIChvYXN5c19zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHN5bWJhc2UgPSBPQVNZU19EQVRBIChhYmZkKS0+c3ltYm9sczsKKyAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGFiZmQtPnN5bWNvdW50OyBjb3VudGVyKyspCisgICAgeworICAgICAgKihsb2NhdGlvbisrKSA9IHN5bWJhc2UrKzsKKyAgICB9CisgICpsb2NhdGlvbiA9IDA7CisgIHJldHVybiBhYmZkLT5zeW1jb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBhcmNoaXZlIHN0dWZmCisqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitvYXN5c19hcmNoaXZlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgb2FzeXNfYXJjaGl2ZV9oZWFkZXJfdHlwZSBoZWFkZXI7CisgIG9hc3lzX2V4dGFyY2hpdmVfaGVhZGVyX3R5cGUgaGVhZGVyX2V4dDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGZpbGVfcHRyIGZpbGVwb3M7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIGZhbHNlKSAhPSAwCisgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpICYgaGVhZGVyX2V4dCwgMSwgc2l6ZW9mIChoZWFkZXJfZXh0KSwgYWJmZCkKKwkgICE9IHNpemVvZiAoaGVhZGVyX2V4dCkpKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBoZWFkZXIudmVyc2lvbiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC52ZXJzaW9uKTsKKyAgaGVhZGVyLm1vZF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5tb2RfY291bnQpOworICBoZWFkZXIubW9kX3RibF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQubW9kX3RibF9vZmZzZXQpOworICBoZWFkZXIuc3ltX3RibF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV90Ymxfc2l6ZSk7CisgIGhlYWRlci5zeW1fY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQuc3ltX2NvdW50KTsKKyAgaGVhZGVyLnN5bV90Ymxfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV90Ymxfb2Zmc2V0KTsKKyAgaGVhZGVyLnhyZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQueHJlZl9jb3VudCk7CisgIGhlYWRlci54cmVmX2xzdF9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQueHJlZl9sc3Rfb2Zmc2V0KTsKKworICAvKgorICAgIFRoZXJlIGlzbid0IGEgbWFnaWMgbnVtYmVyIGluIGFuIE9hc3lzIGFyY2hpdmUsIHNvIHRoZSBiZXN0IHdlCisgICAgY2FuIGRvIHRvIHZlcmlmeSByZWFzbmFibGVuZXNzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgaW4KKyAgICB0aGUgaGVhZGVyIGFyZSB0b28gd2VpcmQKKyAgICAqLworCisgIGlmIChoZWFkZXIudmVyc2lvbiA+IDEwMDAwIHx8CisgICAgICBoZWFkZXIubW9kX2NvdW50ID4gMTAwMDAgfHwKKyAgICAgIGhlYWRlci5zeW1fY291bnQgPiAxMDAwMDAgfHwKKyAgICAgIGhlYWRlci54cmVmX2NvdW50ID4gMTAwMDAwKQorICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOworCisgIC8qCisgICAgVGhhdCBhbGwgd29ya2VkLCBsZXQncyBidXkgdGhlIHNwYWNlIGZvciB0aGUgaGVhZGVyIGFuZCByZWFkIGluCisgICAgdGhlIGhlYWRlcnMuCisgICAgKi8KKyAgeworICAgIG9hc3lzX2FyX2RhdGFfdHlwZSAqYXIgPQorICAgIChvYXN5c19hcl9kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX2FyX2RhdGFfdHlwZSkpOworCisgICAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqbW9kdWxlID0KKyAgICAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKQorICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19tb2R1bGVfaW5mb190eXBlKSAqIGhlYWRlci5tb2RfY291bnQpOworICAgIG9hc3lzX21vZHVsZV90YWJsZV90eXBlIHJlY29yZDsKKworICAgIGlmICghYXIgfHwgIW1vZHVsZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgYWJmZC0+dGRhdGEub2FzeXNfYXJfZGF0YSA9IGFyOworICAgIGFyLT5tb2R1bGUgPSBtb2R1bGU7CisgICAgYXItPm1vZHVsZV9jb3VudCA9IGhlYWRlci5tb2RfY291bnQ7CisKKyAgICBmaWxlcG9zID0gaGVhZGVyLm1vZF90Ymxfb2Zmc2V0OworICAgIGZvciAoaSA9IDA7IGkgPCBoZWFkZXIubW9kX2NvdW50OyBpKyspCisgICAgICB7CisJaWYgKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKKwkgIHJldHVybiBOVUxMOworCisJLyogVGhlcmUgYXJlIHR3byB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGFyY2hpdmUgaGVhZGVyICovCisKKwlpZiAoMCkKKwkgIHsKKwkgICAgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYV90eXBlIHJlY29yZF9leHQ7CisJICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiByZWNvcmRfZXh0LCAxLCBzaXplb2YgKHJlY29yZF9leHQpLCBhYmZkKQorCQkhPSBzaXplb2YgKHJlY29yZF9leHQpKQorCSAgICAgIHJldHVybiBOVUxMOworCisJICAgIHJlY29yZC5tb2Rfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2Rfc2l6ZSk7CisJICAgIHJlY29yZC5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5maWxlX29mZnNldCk7CisKKwkgICAgcmVjb3JkLmRlcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBfY291bnQpOworCSAgICByZWNvcmQuZGVwZWVfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwZWVfY291bnQpOworCSAgICByZWNvcmQuc2VjdF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5zZWN0X2NvdW50KTsKKworCSAgICBtb2R1bGVbaV0ubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgMzMpOworCSAgICBpZiAoIW1vZHVsZVtpXS5uYW1lKQorCSAgICAgIHJldHVybiBOVUxMOworCisJICAgIG1lbWNweSAobW9kdWxlW2ldLm5hbWUsIHJlY29yZF9leHQubW9kX25hbWUsIDMzKTsKKwkgICAgZmlsZXBvcyArPQorCSAgICAgIHNpemVvZiAocmVjb3JkX2V4dCkgKworCSAgICAgIHJlY29yZC5kZXBfY291bnQgKiA0ICsKKwkgICAgICByZWNvcmQuZGVwZWVfY291bnQgKiA0ICsKKwkgICAgICByZWNvcmQuc2VjdF9jb3VudCAqIDggKyAxODc7CisJICB9CisJZWxzZQorCSAgeworCSAgICBvYXN5c19leHRtb2R1bGVfdGFibGVfdHlwZV9iX3R5cGUgcmVjb3JkX2V4dDsKKwkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHJlY29yZF9leHQsIDEsIHNpemVvZiAocmVjb3JkX2V4dCksIGFiZmQpCisJCSE9IHNpemVvZiAocmVjb3JkX2V4dCkpCisJICAgICAgcmV0dXJuIE5VTEw7CisKKwkgICAgcmVjb3JkLm1vZF9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0Lm1vZF9zaXplKTsKKwkgICAgcmVjb3JkLmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmZpbGVfb2Zmc2V0KTsKKworCSAgICByZWNvcmQuZGVwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcF9jb3VudCk7CisJICAgIHJlY29yZC5kZXBlZV9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBlZV9jb3VudCk7CisJICAgIHJlY29yZC5zZWN0X2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LnNlY3RfY291bnQpOworCSAgICByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2RfbmFtZV9sZW5ndGgpOworCisJICAgIG1vZHVsZVtpXS5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSArIDEpOworCSAgICBpZiAoIW1vZHVsZVtpXS5uYW1lKQorCSAgICAgIHJldHVybiBOVUxMOworCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpIG1vZHVsZVtpXS5uYW1lLCAxLCByZWNvcmQubW9kdWxlX25hbWVfc2l6ZSwKKwkJCSAgYWJmZCkKKwkJIT0gcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUpCisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIG1vZHVsZVtpXS5uYW1lW3JlY29yZC5tb2R1bGVfbmFtZV9zaXplXSA9IDA7CisJICAgIGZpbGVwb3MgKz0KKwkgICAgICBzaXplb2YgKHJlY29yZF9leHQpICsKKwkgICAgICByZWNvcmQuZGVwX2NvdW50ICogNCArCisJICAgICAgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgKyAxOworCisJICB9CisKKworCW1vZHVsZVtpXS5zaXplID0gcmVjb3JkLm1vZF9zaXplOworCW1vZHVsZVtpXS5wb3MgPSByZWNvcmQuZmlsZV9vZmZzZXQ7CisJbW9kdWxlW2ldLmFiZmQgPSAwOworICAgICAgfQorCisgIH0KKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKK3N0YXRpYyBib29sZWFuCitvYXN5c19ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworCisgIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gKG9hc3lzX2RhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfZGF0YV90eXBlKSk7CisgIHJldHVybiBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA/IHRydWUgOiBmYWxzZTsKK30KKworI2RlZmluZSBNQVhfU0VDUyAxNgorc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorb2FzeXNfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgb2FzeXNfZGF0YV90eXBlICpvYXN5czsKKyAgb2FzeXNfZGF0YV90eXBlICpzYXZlID0gT0FTWVNfREFUQSAoYWJmZCk7CisgIGJvb2xlYW4gbG9vcCA9IHRydWU7CisgIGJvb2xlYW4gaGFkX3VzZWZ1bGwgPSBmYWxzZTsKKworICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IDA7CisgIG9hc3lzX21rb2JqZWN0IChhYmZkKTsKKyAgb2FzeXMgPSBPQVNZU19EQVRBIChhYmZkKTsKKyAgbWVtc2V0ICgoUFRSKSBvYXN5cy0+c2VjdGlvbnMsIDB4ZmYsIHNpemVvZiAob2FzeXMtPnNlY3Rpb25zKSk7CisKKyAgLyogUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICBnb3RvIGZhaWw7CisgIG9hc3lzLT5zeW1ib2xfc3RyaW5nX2xlbmd0aCA9IDA7CisgIC8qIEluc3BlY3QgdGhlIHJlY29yZHMsIGJ1dCBvbmx5IGtlZXAgdGhlIHNlY3Rpb24gaW5mbyAtCisgICAgIHJlbWVtYmVyIHRoZSBzaXplIG9mIHRoZSBzeW1ib2xzCisgICAgICovCisgIG9hc3lzLT5maXJzdF9kYXRhX3JlY29yZCA9IDA7CisgIHdoaWxlIChsb29wKQorICAgIHsKKyAgICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlIHJlY29yZDsKKyAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKKwlnb3RvIGZhaWw7CisgICAgICBpZiAoKHNpemVfdCkgcmVjb3JkLmhlYWRlci5sZW5ndGggPCAoc2l6ZV90KSBzaXplb2YgKHJlY29yZC5oZWFkZXIpKQorCWdvdG8gZmFpbDsKKworCisgICAgICBzd2l0Y2ggKChvYXN5c19yZWNvcmRfZW51bV90eXBlKSAocmVjb3JkLmhlYWRlci50eXBlKSkKKwl7CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06CisJICBoYWRfdXNlZnVsbCA9IHRydWU7CisJICBicmVhazsKKwljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKKwljYXNlIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtOgorCSAgLyogQ291bnQgc3ltYm9scyBhbmQgcmVtZW1iZXIgdGhlaXIgc2l6ZSBmb3IgYSBmdXR1cmUgbWFsbG9jICAgKi8KKwkgIGFiZmQtPnN5bWNvdW50Kys7CisJICBvYXN5cy0+c3ltYm9sX3N0cmluZ19sZW5ndGggKz0gMSArIG9hc3lzX3N0cmluZ19sZW5ndGggKCZyZWNvcmQpOworCSAgaGFkX3VzZWZ1bGwgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgorCSAgeworCSAgICBhc2VjdGlvbiAqczsKKwkgICAgY2hhciAqYnVmZmVyOworCSAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9udW1iZXI7CisJICAgIGlmIChyZWNvcmQuc2VjdGlvbi5oZWFkZXIubGVuZ3RoICE9IHNpemVvZiAocmVjb3JkLnNlY3Rpb24pKQorCSAgICAgIHsKKwkJZ290byBmYWlsOworCSAgICAgIH0KKwkgICAgYnVmZmVyID0gYmZkX2FsbG9jIChhYmZkLCAzKTsKKwkgICAgaWYgKCFidWZmZXIpCisJICAgICAgZ290byBmYWlsOworCSAgICBzZWN0aW9uX251bWJlciA9IHJlY29yZC5zZWN0aW9uLnJlbGIgJiBSRUxPQ0FUSU9OX1NFQ1RfQklUUzsKKwkgICAgc3ByaW50ZiAoYnVmZmVyLCAiJXUiLCBzZWN0aW9uX251bWJlcik7CisJICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBidWZmZXIpOworCSAgICBvYXN5cy0+c2VjdGlvbnNbc2VjdGlvbl9udW1iZXJdID0gczsKKwkgICAgc3dpdGNoIChyZWNvcmQuc2VjdGlvbi5yZWxiICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCisJICAgICAgeworCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKKwkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6CisJCWJyZWFrOworCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKKwkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006CisJCUJGRF9GQUlMICgpOworCSAgICAgIH0KKworCSAgICBzLT5fcmF3X3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZC5zZWN0aW9uLnZhbHVlKTsKKwkgICAgcy0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc2VjdGlvbi52bWEpOworCSAgICBzLT5mbGFncyA9IDA7CisJICAgIGhhZF91c2VmdWxsID0gdHJ1ZTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bToKKwkgIG9hc3lzLT5maXJzdF9kYXRhX3JlY29yZCA9IGJmZF90ZWxsIChhYmZkKSAtIHJlY29yZC5oZWFkZXIubGVuZ3RoOworCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2RlYnVnX2VudW06CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfbW9kdWxlX2VudW06CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfbmFtZWRfc2VjdGlvbl9lbnVtOgorCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtOgorCSAgaWYgKGhhZF91c2VmdWxsID09IGZhbHNlKQorCSAgICBnb3RvIGZhaWw7CisJICBsb29wID0gZmFsc2U7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZ290byBmYWlsOworCX0KKyAgICB9CisgIG9hc3lzLT5zeW1ib2xzID0gKGFzeW1ib2wgKikgTlVMTDsKKyAgLyoKKyAgICBPYXN5cyBzdXBwb3J0IHNldmVyYWwgYXJjaGl0ZWN0dXJlcywgYnV0IEkgY2FuJ3Qgc2VlIGEgc2ltcGxlIHdheQorICAgIHRvIGRpc2NvdmVyIHdoaWNoIG9uZSBpcyBpbiBhIHBhcnRpY3VsYXIgZmlsZSAtIHdlJ2xsIGd1ZXNzCisgICAgKi8KKyAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7CisgIGlmIChhYmZkLT5zeW1jb3VudCAhPSAwKQorICAgIHsKKyAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOworICAgIH0KKworICAvKgorICAgIFdlIGRvbid0IGtub3cgaWYgYSBzZWN0aW9uIGhhcyBkYXRhIHVudGlsIHdlJ3ZlIHJlYWQgaXQuLgorICAgICovCisKKyAgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKTsKKworCisgIHJldHVybiBhYmZkLT54dmVjOworCitmYWlsOgorICAodm9pZCkgYmZkX3JlbGVhc2UgKGFiZmQsIG9hc3lzKTsKKyAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSBzYXZlOworICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAorb2FzeXNfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7CisgIGlmICghc3ltYm9sLT5zZWN0aW9uKQorICAgIHJldC0+dHlwZSA9IChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKSA/ICdhJyA6ICdBJzsKK30KKworc3RhdGljIHZvaWQKK29hc3lzX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgUFRSIGFmaWxlOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKKworICBzd2l0Y2ggKGhvdykKKyAgICB7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6CisgICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKKyAgICAgIHsKKwlDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwgPworCShDT05TVCBjaGFyICopICIqYWJzIiA6IHN5bWJvbC0+c2VjdGlvbi0+bmFtZTsKKworCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7CisKKwlmcHJpbnRmIChmaWxlLCAiICUtNXMgJXMiLAorCQkgc2VjdGlvbl9uYW1lLAorCQkgc3ltYm9sLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KK30KKy8qCisgVGhlIGhvd3RvIHRhYmxlIGlzIGJ1aWxkIHVzaW5nIHRoZSB0b3AgdHdvIGJpdHMgb2YgYSByZWxvYyBieXRlIHRvCisgaW5kZXggaW50byBpdC4gVGhlIGJpdHMgYXJlIFBDUkVMLFdPUkQvTE9ORworKi8KK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQoreworCisgIEhPV1RPICgwLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPICgwLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiYWJzMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPICgwLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicGNyZWwxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8gKDAsIDAsIDIsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJwY3JlbDMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpCit9OworCisvKiBSZWFkIGluIGFsbCB0aGUgc2VjdGlvbiBkYXRhIGFuZCByZWxvY2F0aW9uIHN0dWZmIHRvbyAqLworc3RhdGljIGJvb2xlYW4KK29hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkKKyAgICAgYmZkICpDT05TVCBhYmZkOworeworICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7CisgIG9hc3lzX2RhdGFfdHlwZSAqZGF0YSA9IE9BU1lTX0RBVEEgKGFiZmQpOworICBib29sZWFuIGxvb3AgPSB0cnVlOworCisgIG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKnBlcjsKKworICBhc2VjdGlvbiAqczsKKworICAvKiBTZWUgaWYgdGhlIGRhdGEgaGFzIGJlZW4gc2x1cnBlZCBhbHJlYWR5IC4uICovCisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBwZXIgPSBvYXN5c19wZXJfc2VjdGlvbiAocyk7CisgICAgICBpZiAocGVyLT5pbml0aWFsaXplZCA9PSB0cnVlKQorCXJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoZGF0YS0+Zmlyc3RfZGF0YV9yZWNvcmQgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGRhdGEtPmZpcnN0X2RhdGFfcmVjb3JkLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHdoaWxlIChsb29wKQorICAgIHsKKyAgICAgIGlmICghIG9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCAmcmVjb3JkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBzd2l0Y2ggKHJlY29yZC5oZWFkZXIudHlwZSkKKwl7CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW06CisJICBicmVhazsKKwljYXNlIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW06CisJICB7CisKKwkgICAgYmZkX2J5dGUgKnNyYyA9IHJlY29yZC5kYXRhLmRhdGE7CisJICAgIGJmZF9ieXRlICplbmRfc3JjID0gKChiZmRfYnl0ZSAqKSAmIHJlY29yZCkgKyByZWNvcmQuaGVhZGVyLmxlbmd0aDsKKwkgICAgYmZkX2J5dGUgKmRzdF9wdHI7CisJICAgIGJmZF9ieXRlICpkc3RfYmFzZV9wdHI7CisJICAgIHVuc2lnbmVkIGludCByZWxiaXQ7CisJICAgIHVuc2lnbmVkIGludCBjb3VudDsKKwkgICAgYXNlY3Rpb24gKnNlY3Rpb24gPQorCSAgICBkYXRhLT5zZWN0aW9uc1tyZWNvcmQuZGF0YS5yZWxiICYgUkVMT0NBVElPTl9TRUNUX0JJVFNdOworCSAgICBiZmRfdm1hIGRzdF9vZmZzZXQ7CisKKwkgICAgcGVyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pOworCisJICAgIGlmIChwZXItPmluaXRpYWxpemVkID09IGZhbHNlKQorCSAgICAgIHsKKwkJcGVyLT5kYXRhID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisJCWlmICghcGVyLT5kYXRhKQorCQkgIHJldHVybiBmYWxzZTsKKwkJcGVyLT5yZWxvY190YWlsX3B0ciA9IChvYXN5c19yZWxvY190eXBlICoqKSAmIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKKwkJcGVyLT5oYWRfdm1hID0gZmFsc2U7CisJCXBlci0+aW5pdGlhbGl6ZWQgPSB0cnVlOworCQlzZWN0aW9uLT5yZWxvY19jb3VudCA9IDA7CisJCXNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOworCSAgICAgIH0KKworCSAgICBkc3Rfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuZGF0YS5hZGRyKTsKKwkgICAgaWYgKHBlci0+aGFkX3ZtYSA9PSBmYWxzZSkKKwkgICAgICB7CisJCS8qIFRha2UgdGhlIGZpcnN0IHZtYSB3ZSBzZWUgYXMgdGhlIGJhc2UgKi8KKwkJc2VjdGlvbi0+dm1hID0gZHN0X29mZnNldDsKKwkJcGVyLT5oYWRfdm1hID0gdHJ1ZTsKKwkgICAgICB9CisKKwkgICAgZHN0X29mZnNldCAtPSBzZWN0aW9uLT52bWE7CisKKwkgICAgZHN0X2Jhc2VfcHRyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhOworCSAgICBkc3RfcHRyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsKKwkgICAgICBkc3Rfb2Zmc2V0OworCisJICAgIGlmIChzcmMgPCBlbmRfc3JjKQorCSAgICAgIHsKKwkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOworCSAgICAgIH0KKwkgICAgd2hpbGUgKHNyYyA8IGVuZF9zcmMpCisJICAgICAgeworCQl1bnNpZ25lZCBjaGFyIG1vZF9ieXRlID0gKnNyYysrOworCQlzaXplX3QgZ2FwID0gZW5kX3NyYyAtIHNyYzsKKworCQljb3VudCA9IDg7CisJCWlmIChtb2RfYnl0ZSA9PSAwICYmIGdhcCA+PSA4KQorCQkgIHsKKwkJICAgIGRzdF9wdHJbMF0gPSBzcmNbMF07CisJCSAgICBkc3RfcHRyWzFdID0gc3JjWzFdOworCQkgICAgZHN0X3B0clsyXSA9IHNyY1syXTsKKwkJICAgIGRzdF9wdHJbM10gPSBzcmNbM107CisJCSAgICBkc3RfcHRyWzRdID0gc3JjWzRdOworCQkgICAgZHN0X3B0cls1XSA9IHNyY1s1XTsKKwkJICAgIGRzdF9wdHJbNl0gPSBzcmNbNl07CisJCSAgICBkc3RfcHRyWzddID0gc3JjWzddOworCQkgICAgZHN0X3B0ciArPSA4OworCQkgICAgc3JjICs9IDg7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgZm9yIChyZWxiaXQgPSAxOyBjb3VudC0tICE9IDAgJiYgc3JjIDwgZW5kX3NyYzsgcmVsYml0IDw8PSAxKQorCQkgICAgICB7CisJCQlpZiAocmVsYml0ICYgbW9kX2J5dGUpCisJCQkgIHsKKwkJCSAgICB1bnNpZ25lZCBjaGFyIHJlbG9jID0gKnNyYzsKKwkJCSAgICAvKiBUaGlzIGl0ZW0gbmVlZHMgdG8gYmUgcmVsb2NhdGVkICovCisJCQkgICAgc3dpdGNoIChyZWxvYyAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQorCQkJICAgICAgeworCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQUJTOgorCisJCQkJYnJlYWs7CisKKwkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKKwkJCQl7CisJCQkJICAvKiBSZWxvY2F0ZSB0aGUgaXRlbSByZWxhdGl2ZSB0byB0aGUgc2VjdGlvbiAqLworCQkJCSAgb2FzeXNfcmVsb2NfdHlwZSAqciA9CisJCQkJICAob2FzeXNfcmVsb2NfdHlwZSAqKQorCQkJCSAgYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgICAgIHNpemVvZiAob2FzeXNfcmVsb2NfdHlwZSkpOworCQkJCSAgaWYgKCFyKQorCQkJCSAgICByZXR1cm4gZmFsc2U7CisJCQkJICAqKHBlci0+cmVsb2NfdGFpbF9wdHIpID0gcjsKKwkJCQkgIHBlci0+cmVsb2NfdGFpbF9wdHIgPSAmci0+bmV4dDsKKwkJCQkgIHItPm5leHQgPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMOworCQkJCSAgLyogUmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBzeW1ib2wgKi8KKwkJCQkgIHNyYysrOworCQkJCSAgLyogVGhlcmUgaXMgbm8gc3ltYm9sICovCisJCQkJICByLT5zeW1ib2wgPSAwOworCQkJCSAgLyogV29yayBvdXQgdGhlIGhvd3RvICovCisJCQkJICBhYm9ydCAoKTsKKyNpZiAwCisJCQkJICByLT5yZWxlbnQuc2VjdGlvbiA9CisJCQkJICAgIGRhdGEtPnNlY3Rpb25zW3JlbG9jICYKKwkJCQkJCSAgIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKKworCQkJCSAgci0+cmVsZW50LmFkZGVuZCA9IC0KKwkJCQkgICAgci0+cmVsZW50LnNlY3Rpb24tPnZtYTsKKyNlbmRpZgorCQkJCSAgci0+cmVsZW50LmFkZHJlc3MgPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOworCQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmhvd3RvX3RhYmxlW3JlbG9jID4+IDZdOworCQkJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIE5VTEw7CisJCQkJICBzZWN0aW9uLT5yZWxvY19jb3VudCsrOworCisJCQkJICAvKiBGYWtlIHVwIHRoZSBkYXRhIHRvIGxvb2sgbGlrZSBpdCdzIGdvdCB0aGUgLXZlIHBjIGluIGl0LCB0aGlzIG1ha2VzCisJCQkJICAgICAgIGl0IG11Y2ggZWFzaWVyIHRvIGNvbnZlcnQgaW50byBvdGhlciBmb3JtYXRzLiBUaGlzIGlzIGRvbmUgYnkKKwkJCQkgICAgICAgaGl0dGluZyB0aGUgYWRkZW5kLgorCQkJCSAgICAgICAqLworCQkJCSAgaWYgKHItPnJlbGVudC5ob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKKwkJCQkgICAgeworCQkJCSAgICAgIHItPnJlbGVudC5hZGRlbmQgLT0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKKwkJCQkgICAgfQorCisKKwkJCQl9CisJCQkJYnJlYWs7CisKKworCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfVU5EOgorCQkJCXsKKwkJCQkgIG9hc3lzX3JlbG9jX3R5cGUgKnIgPQorCQkJCSAgKG9hc3lzX3JlbG9jX3R5cGUgKikKKwkJCQkgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkJICAgICBzaXplb2YgKG9hc3lzX3JlbG9jX3R5cGUpKTsKKwkJCQkgIGlmICghcikKKwkJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJCSAgKihwZXItPnJlbG9jX3RhaWxfcHRyKSA9IHI7CisJCQkJICBwZXItPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7CisJCQkJICByLT5uZXh0ID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTDsKKwkJCQkgIC8qIFJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sICovCisJCQkJICBzcmMrKzsKKwkJCQkgIC8qIEdldCBzeW1ib2wgbnVtYmVyICovCisJCQkJICByLT5zeW1ib2wgPSAoc3JjWzBdIDw8IDgpIHwgc3JjWzFdOworCQkJCSAgLyogV29yayBvdXQgdGhlIGhvd3RvICovCisJCQkJICBhYm9ydCAoKTsKKworI2lmIDAKKwkJCQkgIHItPnJlbGVudC5zZWN0aW9uID0gKGFzZWN0aW9uCisJCQkJCQkgICAgICAgKikgTlVMTDsKKyNlbmRpZgorCQkJCSAgci0+cmVsZW50LmFkZGVuZCA9IDA7CisJCQkJICByLT5yZWxlbnQuYWRkcmVzcyA9IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7CisJCQkJICByLT5yZWxlbnQuaG93dG8gPSAmaG93dG9fdGFibGVbcmVsb2MgPj4gNl07CisJCQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgTlVMTDsKKwkJCQkgIHNlY3Rpb24tPnJlbG9jX2NvdW50Kys7CisKKwkJCQkgIHNyYyArPSAyOworCQkJCSAgLyogRmFrZSB1cCB0aGUgZGF0YSB0byBsb29rIGxpa2UgaXQncyBnb3QgdGhlIC12ZSBwYyBpbiBpdCwgdGhpcyBtYWtlcworCQkJCSAgICAgICBpdCBtdWNoIGVhc2llciB0byBjb252ZXJ0IGludG8gb3RoZXIgZm9ybWF0cy4gVGhpcyBpcyBkb25lIGJ5CisJCQkJICAgICAgIGhpdHRpbmcgdGhlIGFkZGVuZC4KKwkJCQkgICAgICAgKi8KKwkJCQkgIGlmIChyLT5yZWxlbnQuaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCisJCQkJICAgIHsKKwkJCQkgICAgICByLT5yZWxlbnQuYWRkZW5kIC09IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7CisJCQkJICAgIH0KKworCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9DT006CisJCQkJQkZEX0ZBSUwgKCk7CisJCQkgICAgICB9CisJCQkgIH0KKwkJCSpkc3RfcHRyKysgPSAqc3JjKys7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKKwljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKKwljYXNlIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW06CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgbG9vcCA9IGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7CisKK30KKworc3RhdGljIGJvb2xlYW4KK29hc3lzX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Cit7CisgIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0gKFBUUikKKyAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfcGVyX3NlY3Rpb25fdHlwZSkpOworICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQorICAgIHJldHVybiBmYWxzZTsKKyAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5kYXRhID0gKGJmZF9ieXRlICopIE5VTEw7CisgIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+c2VjdGlvbiA9IG5ld3NlY3Q7CisgIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+b2Zmc2V0ID0gMDsKKyAgb2FzeXNfcGVyX3NlY3Rpb24gKG5ld3NlY3QpLT5pbml0aWFsaXplZCA9IGZhbHNlOworICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAxOworICAvKiBUdXJuIHRoZSBzZWN0aW9uIHN0cmluZyBpbnRvIGFuIGluZGV4ICovCisKKyAgc3NjYW5mIChuZXdzZWN0LT5uYW1lLCAiJXUiLCAmbmV3c2VjdC0+dGFyZ2V0X2luZGV4KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgbG9uZworb2FzeXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworeworICBpZiAoISBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIChhc2VjdC0+cmVsb2NfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKK30KKworc3RhdGljIGJvb2xlYW4KK29hc3lzX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBvYXN5c19wZXJfc2VjdGlvbl90eXBlICpwID0gKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7CisgIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7CisgIGlmIChwLT5pbml0aWFsaXplZCA9PSBmYWxzZSkKKyAgICB7CisgICAgICAodm9pZCkgbWVtc2V0IChsb2NhdGlvbiwgMCwgKGludCkgY291bnQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICh2b2lkKSBtZW1jcHkgKGxvY2F0aW9uLCAoUFRSKSAocC0+ZGF0YSArIG9mZnNldCksIChpbnQpIGNvdW50KTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisKK2xvbmcKK29hc3lzX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaWdub3JlX2FiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBhcmVsZW50ICoqcmVscHRyOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgdW5zaWduZWQgaW50IHJlbG9jX2NvdW50ID0gMDsKKyAgb2FzeXNfcmVsb2NfdHlwZSAqc3JjID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgKHNlY3Rpb24tPnJlbG9jYXRpb24pOworICB3aGlsZSAoc3JjICE9IChvYXN5c19yZWxvY190eXBlICopIE5VTEwpCisgICAgeworICAgICAgYWJvcnQgKCk7CisKKyNpZiAwCisgICAgICBpZiAoc3JjLT5yZWxlbnQuc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKwl7CisJICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBzcmMtPnN5bWJvbDsKKwl9CisjZW5kaWYKKworICAgICAgKnJlbHB0cisrID0gJnNyYy0+cmVsZW50OworICAgICAgc3JjID0gc3JjLT5uZXh0OworICAgICAgcmVsb2NfY291bnQrKzsKKyAgICB9CisgICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOworICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQgPSByZWxvY19jb3VudDsKK30KKworCisKKworLyogV3JpdGluZyAqLworCisKKy8qIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gYW5kIHdyaXRlIG9uZSByZWNvcmQgKi8KK3N0YXRpYyBib29sZWFuCitvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsIHR5cGUsIHJlY29yZCwgc2l6ZSkKKyAgICAgYmZkICphYmZkOworICAgICBvYXN5c19yZWNvcmRfZW51bV90eXBlIHR5cGU7CisgICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7CisgICAgIHNpemVfdCBzaXplOworeworICBpbnQgY2hlY2tzdW07CisgIHNpemVfdCBpOworICB1bnNpZ25lZCBjaGFyICpwdHI7CisKKyAgcmVjb3JkLT5oZWFkZXIubGVuZ3RoID0gc2l6ZTsKKyAgcmVjb3JkLT5oZWFkZXIudHlwZSA9IChpbnQpIHR5cGU7CisgIHJlY29yZC0+aGVhZGVyLmNoZWNrX3N1bSA9IDA7CisgIHJlY29yZC0+aGVhZGVyLmZpbGwgPSAwOworICBwdHIgPSAodW5zaWduZWQgY2hhciAqKSAmcmVjb3JkLT5wYWRbMF07CisgIGNoZWNrc3VtID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICBjaGVja3N1bSArPSAqcHRyKys7CisgICAgfQorICByZWNvcmQtPmhlYWRlci5jaGVja19zdW0gPSAweGZmICYgKC1jaGVja3N1bSk7CisgIGlmIChiZmRfd3JpdGUgKChQVFIpIHJlY29yZCwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qIFdyaXRlIG91dCBhbGwgdGhlIHN5bWJvbHMgKi8KK3N0YXRpYyBib29sZWFuCitvYXN5c193cml0ZV9zeW1zIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgYXN5bWJvbCAqKmdlbmVyaWMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgaW5kZXggPSAwOworICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsgY291bnQrKykKKyAgICB7CisKKyAgICAgIG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSBzeW1ib2w7CisgICAgICBhc3ltYm9sICpDT05TVCBnID0gZ2VuZXJpY1tjb3VudF07CisKKyAgICAgIENPTlNUIGNoYXIgKnNyYyA9IGctPm5hbWU7CisgICAgICBjaGFyICpkc3QgPSBzeW1ib2wubmFtZTsKKyAgICAgIHVuc2lnbmVkIGludCBsID0gMDsKKworICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoZy0+c2VjdGlvbikpCisJeworCSAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfQ09NOworCSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbmRleCwgc3ltYm9sLnJlZm5vKTsKKwkgIGluZGV4Kys7CisJfQorICAgICAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChnLT5zZWN0aW9uKSkKKwl7CisJICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9BQlM7CisJICBiZmRfaF9wdXRfMTYgKGFiZmQsIDAsIHN5bWJvbC5yZWZubyk7CisKKwl9CisgICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGctPnNlY3Rpb24pKQorCXsKKwkgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1VORDsKKwkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW5kZXgsIHN5bWJvbC5yZWZubyk7CisJICAvKiBPdmVybG9hZCB0aGUgdmFsdWUgZmllbGQgd2l0aCB0aGUgb3V0cHV0IGluZGV4IG51bWJlciAqLworCSAgaW5kZXgrKzsKKwl9CisgICAgICBlbHNlIGlmIChnLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCisJeworCSAgLyogdGhyb3cgaXQgYXdheSAqLworCSAgY29udGludWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChnLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQorCSAgICB7CisJICAgICAgLyogU29tZXRpbWUsIHRoZSBvYXN5cyB0b29scyBnaXZlIG91dCBhIHN5bWJvbCB3aXRoIGlsbGVnYWwKKwkgICBiaXRzIGluIGl0LCB3ZSdsbCBvdXRwdXQgaXQgaW4gdGhlIHNhbWUgYnJva2VuIHdheSAqLworCisJICAgICAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfUkVMIHwgMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfUkVMIHwgZy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkgICAgfQorCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAwLCBzeW1ib2wucmVmbm8pOworCX0KKyNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKKyAgICAgIGlmIChzcmNbbF0gPT0gJ18nKQorCWRzdFtsKytdID0gJy4nOworI2VuZGlmCisgICAgICB3aGlsZSAoc3JjW2xdKQorCXsKKwkgIGRzdFtsXSA9IHNyY1tsXTsKKwkgIGwrKzsKKwl9CisKKyAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZy0+dmFsdWUsIHN5bWJvbC52YWx1ZSk7CisKKworICAgICAgaWYgKGctPmZsYWdzICYgQlNGX0xPQ0FMKQorCXsKKwkgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKKwkJCQkgICAgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0sCisJCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIHN5bWJvbCwKKwkJCQkgICAgb2Zmc2V0b2YgKG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSwKKwkJCQkJICAgICAgbmFtZVswXSkgKyBsKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCisJCQkJICAgIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bSwKKwkJCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgc3ltYm9sLAorCQkJCSAgICBvZmZzZXRvZiAob2FzeXNfc3ltYm9sX3JlY29yZF90eXBlLAorCQkJCQkgICAgICBuYW1lWzBdKSArIGwpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgZy0+dmFsdWUgPSBpbmRleCAtIDE7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKyAvKiBXcml0ZSBhIHNlY3Rpb24gaGVhZGVyIGZvciBlYWNoIHNlY3Rpb24gKi8KK3N0YXRpYyBib29sZWFuCitvYXN5c193cml0ZV9zZWN0aW9ucyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqczsKKyAgc3RhdGljIG9hc3lzX3NlY3Rpb25fcmVjb3JkX3R5cGUgb3V0OworCisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lWzBdKSkKKwl7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gb2FzeXMiKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzLT5uYW1lKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIG91dC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1JFTCB8IHMtPnRhcmdldF9pbmRleDsKKyAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcy0+X2Nvb2tlZF9zaXplLCBvdXQudmFsdWUpOworICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzLT52bWEsIG91dC52bWEpOworCisgICAgICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCisJCQkJb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bSwKKwkJCQkob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBvdXQsCisJCQkJc2l6ZW9mIChvdXQpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK29hc3lzX3dyaXRlX2hlYWRlciAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICAvKiBDcmVhdGUgYW5kIHdyaXRlIHRoZSBoZWFkZXIgKi8KKyAgb2FzeXNfaGVhZGVyX3JlY29yZF90eXBlIHI7CisgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4gKGFiZmQtPmZpbGVuYW1lKTsKKyAgaWYgKGxlbmd0aCA+IChzaXplX3QpIHNpemVvZiAoci5tb2R1bGVfbmFtZSkpCisgICAgeworICAgICAgbGVuZ3RoID0gc2l6ZW9mIChyLm1vZHVsZV9uYW1lKTsKKyAgICB9CisKKyAgKHZvaWQpIG1lbWNweSAoci5tb2R1bGVfbmFtZSwKKwkJIGFiZmQtPmZpbGVuYW1lLAorCQkgbGVuZ3RoKTsKKyAgKHZvaWQpIG1lbXNldCAoci5tb2R1bGVfbmFtZSArIGxlbmd0aCwKKwkJICcgJywKKwkJIHNpemVvZiAoci5tb2R1bGVfbmFtZSkgLSBsZW5ndGgpOworCisgIHIudmVyc2lvbl9udW1iZXIgPSBPQVNZU19WRVJTSU9OX05VTUJFUjsKKyAgci5yZXZfbnVtYmVyID0gT0FTWVNfUkVWX05VTUJFUjsKKyAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAorCQkJICAgIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bSwKKwkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiByLAorCQkJICAgIG9mZnNldG9mIChvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGUsCisJCQkJICAgICAgZGVzY3JpcHRpb25bMF0pKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitvYXN5c193cml0ZV9lbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgb2FzeXNfZW5kX3JlY29yZF90eXBlIGVuZDsKKyAgdW5zaWduZWQgY2hhciBudWxsID0gMDsKKyAgZW5kLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfQUJTOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGFiZmQtPnN0YXJ0X2FkZHJlc3MsIGVuZC5lbnRyeSk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMCwgZW5kLmZpbGwpOworICBlbmQuemVybyA9IDA7CisgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKKwkJCSAgICBvYXN5c19yZWNvcmRfaXNfZW5kX2VudW0sCisJCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgZW5kLAorCQkJICAgIHNpemVvZiAoZW5kKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG51bGwsIDEsIDEsIGFiZmQpICE9IDEpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAorY29tcCAoYXAsIGJwKQorICAgICBDT05TVCBQVFIgYXA7CisgICAgIENPTlNUIFBUUiBicDsKK3sKKyAgYXJlbGVudCAqYSA9ICooKGFyZWxlbnQgKiopIGFwKTsKKyAgYXJlbGVudCAqYiA9ICooKGFyZWxlbnQgKiopIGJwKTsKKyAgcmV0dXJuIGEtPmFkZHJlc3MgLSBiLT5hZGRyZXNzOworfQorCisvKgorIFdyaXRpbmcgZGF0YS4uCisKKyovCitzdGF0aWMgYm9vbGVhbgorb2FzeXNfd3JpdGVfZGF0YSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqczsKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKQorCXsKKwkgIGJmZF9ieXRlICpyYXdfZGF0YSA9IG9hc3lzX3Blcl9zZWN0aW9uIChzKS0+ZGF0YTsKKwkgIG9hc3lzX2RhdGFfcmVjb3JkX3R5cGUgcHJvY2Vzc2VkX2RhdGE7CisJICBiZmRfc2l6ZV90eXBlIGN1cnJlbnRfYnl0ZV9pbmRleCA9IDA7CisJICB1bnNpZ25lZCBpbnQgcmVsb2NzX3RvX2dvID0gcy0+cmVsb2NfY291bnQ7CisJICBhcmVsZW50ICoqcCA9IHMtPm9yZWxvY2F0aW9uOworCSAgaWYgKHMtPnJlbG9jX2NvdW50ICE9IDApCisJICAgIHsKKy8qIFNvcnQgdGhlIHJlbG9jIHJlY29yZHMgc28gaXQncyBlYXN5IHRvIGluc2VydCB0aGUgcmVsb2NzIGludG8gdGhlCisJICAgZGF0YSAqLworCisJICAgICAgcXNvcnQgKHMtPm9yZWxvY2F0aW9uLAorCQkgICAgIHMtPnJlbG9jX2NvdW50LAorCQkgICAgIHNpemVvZiAoYXJlbGVudCAqKiksCisJCSAgICAgY29tcCk7CisJICAgIH0KKwkgIGN1cnJlbnRfYnl0ZV9pbmRleCA9IDA7CisJICBwcm9jZXNzZWRfZGF0YS5yZWxiID0gcy0+dGFyZ2V0X2luZGV4IHwgUkVMT0NBVElPTl9UWVBFX1JFTDsKKworCSAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9jb29rZWRfc2l6ZSkKKwkgICAgeworCSAgICAgIC8qIFNjYW4gZm9yd2FyZHMgYnkgZWlnaHQgYnl0ZXMgb3IgaG93ZXZlciBtdWNoIGlzIGxlZnQgYW5kIHNlZSBpZgorCSAgICAgICB0aGVyZSBhcmUgYW55IHJlbG9jYXRpb25zIGdvaW5nIG9uICovCisJICAgICAgYmZkX2J5dGUgKm1vZCA9ICZwcm9jZXNzZWRfZGF0YS5kYXRhWzBdOworCSAgICAgIGJmZF9ieXRlICpkc3QgPSAmcHJvY2Vzc2VkX2RhdGEuZGF0YVsxXTsKKworCSAgICAgIHVuc2lnbmVkIGludCBpID0gMDsKKwkgICAgICAqbW9kID0gMDsKKworCisJICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzLT52bWEgKyBjdXJyZW50X2J5dGVfaW5kZXgsCisJCQkgICAgcHJvY2Vzc2VkX2RhdGEuYWRkcik7CisKKwkgICAgICAvKiBEb24ndCBzdGFydCBhIHJlbG9jYXRpb24gdW5sZXNzIHlvdSdyZSBzdXJlIHlvdSBjYW4gZmluaXNoIGl0CisgCSAgICAgICB3aXRoaW4gdGhlIHNhbWUgZGF0YSByZWNvcmQuICBUaGUgd29yc3QgY2FzZSByZWxvY2F0aW9uIGlzIGEKKyAJICAgICAgIDQtYnl0ZSByZWxvY2F0YWJsZSB2YWx1ZSB3aGljaCBpcyBzcGxpdCBhY3Jvc3MgdHdvIG1vZGlmaWNhdGlvbgorIAkgICAgICAgYnl0ZXMgKDEgcmVsb2NhdGlvbiBieXRlICsgMiBzeW1ib2wgcmVmZXJlbmNlIGJ5dGVzICsgMiBkYXRhICsKKyAJICAgICAgIDEgbW9kaWZpY2F0aW9uIGJ5dGUgKyAyIGRhdGEgPSA4IGJ5dGVzIHRvdGFsKS4gIFRoYXQncyB3aGVyZQorIAkgICAgICAgdGhlIG1hZ2ljIG51bWJlciA4IGNvbWVzIGZyb20uCisgCSAgICAqLworCSAgICAgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fcmF3X3NpemUgJiYgZHN0IDw9CisJCSAgICAgJnByb2Nlc3NlZF9kYXRhLmRhdGFbc2l6ZW9mIChwcm9jZXNzZWRfZGF0YS5kYXRhKSAtIDhdKQorCQl7CisKKworCQkgIGlmIChyZWxvY3NfdG9fZ28gIT0gMCkKKwkJICAgIHsKKwkJICAgICAgYXJlbGVudCAqciA9ICpwOworCQkgICAgICByZWxvY19ob3d0b190eXBlICpjb25zdCBob3cgPSByLT5ob3d0bzsKKwkJICAgICAgLyogVGhlcmUgaXMgYSByZWxvY2F0aW9uLCBpcyBpdCBmb3IgdGhpcyBieXRlID8gKi8KKwkJICAgICAgaWYgKHItPmFkZHJlc3MgPT0gY3VycmVudF9ieXRlX2luZGV4KQorCQkJeworCQkJICB1bnNpZ25lZCBjaGFyIHJlbF9ieXRlOworCisJCQkgIHArKzsKKwkJCSAgcmVsb2NzX3RvX2dvLS07CisKKwkJCSAgKm1vZCB8PSAoMSA8PCBpKTsKKwkJCSAgaWYgKGhvdy0+cGNfcmVsYXRpdmUpCisJCQkgICAgeworCQkJICAgICAgcmVsX2J5dGUgPSBSRUxPQ0FUSU9OX1BDUkVMX0JJVDsKKworCQkJICAgICAgLyogQWxzbyBwYXRjaCB0aGUgcmF3IGRhdGEgc28gdGhhdCBpdCBkb2Vzbid0IGhhdmUKKwkJCSB0aGUgLXZlIHN0dWZmIGFueSBtb3JlICovCisJCQkgICAgICBpZiAoaG93LT5zaXplICE9IDIpCisJCQkJeworCQkJCSAgYmZkX3B1dF8xNiAoYWJmZCwKKwkJCQkJICAgICAgYmZkX2dldF8xNiAoYWJmZCwgcmF3X2RhdGEpICsKKwkJCQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4LCByYXdfZGF0YSk7CisJCQkJfQorCisJCQkgICAgICBlbHNlCisJCQkJeworCQkJCSAgYmZkX3B1dF8zMiAoYWJmZCwKKwkJCQkJICAgICAgYmZkX2dldF8zMiAoYWJmZCwgcmF3X2RhdGEpICsKKwkJCQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4LCByYXdfZGF0YSk7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgIHJlbF9ieXRlID0gMDsKKwkJCSAgICB9CisJCQkgIGlmIChob3ctPnNpemUgPT0gMikKKwkJCSAgICB7CisJCQkgICAgICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OXzMyQklUX0JJVDsKKwkJCSAgICB9CisKKwkJCSAgLyogSXMgdGhpcyBhIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbiwgb3IgYSBzeW1ib2wKKwkJICAgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24gPyAqLworCQkJICBhYm9ydCAoKTsKKworI2lmIDAKKwkJCSAgaWYgKHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCisJCQkgICAgeworCQkJICAgICAgLyogVGhlIHJlbGVudCBoYXMgYSBzZWN0aW9uIGF0dGFjaGVkLCBzbyBpdCBtdXN0IGJlIHNlY3Rpb24KKwkJCSAgICAgcmVsYXRpdmUgKi8KKwkJCSAgICAgIHJlbF9ieXRlIHw9IFJFTE9DQVRJT05fVFlQRV9SRUw7CisJCQkgICAgICByZWxfYnl0ZSB8PSByLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworCQkJICAgICAgKmRzdCsrID0gcmVsX2J5dGU7CisJCQkgICAgfQorCQkJICBlbHNlCisjZW5kaWYKKwkJCSAgICB7CisJCQkgICAgICBhc3ltYm9sICpwID0gKihyLT5zeW1fcHRyX3B0cik7CisKKwkJCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhIHNlY3Rpb24gYXR0YWNoZWQsIHRoZW4gaXQKKwkJCSAgICAgaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZC4gIENoYW5nZSBmcm9tIGEgc3ltYm9sCisJCQkgICAgIHJlZiB0byBhIHNlY3Rpb24gcmVmICovCisJCQkgICAgICBpZiAocC0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKwkJCQl7CisJCQkJICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OX1RZUEVfUkVMOworCQkJCSAgcmVsX2J5dGUgfD0KKwkJCQkgICAgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkJCQkgICpkc3QrKyA9IHJlbF9ieXRlOworCQkJCX0KKwkJCSAgICAgIGVsc2UKKwkJCQl7CisJCQkJICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OX1RZUEVfVU5EOworCQkJCSAgKmRzdCsrID0gcmVsX2J5dGU7CisJCQkJICAvKiBOZXh0IHR3byBieXRlcyBhcmUgYSBzeW1ib2wgaW5kZXggLSB3ZSBjYW4gZ2V0CisJCQkgICAgICAgdGhpcyBmcm9tIHRoZSBzeW1ib2wgdmFsdWUgd2hpY2ggaGFzIGJlZW4gemFwcGVkCisJCQkgICAgICAgaW50byB0aGUgc3ltYm9sIGluZGV4IGluIHRoZSB0YWJsZSB3aGVuIHRoZQorCQkJICAgICAgIHN5bWJvbCB0YWJsZSB3YXMgd3JpdHRlbgorCQkJICAgICAgICovCisJCQkJICAqZHN0KysgPSBwLT52YWx1ZSA+PiA4OworCQkJCSAgKmRzdCsrID0gcC0+dmFsdWU7CisJCQkJfQorCQkJICAgIH0KKyNkZWZpbmUgQURWQU5DRSB7IGlmICgrK2kgPj0gOCkgeyBpID0gMDsgbW9kID0gZHN0Kys7ICptb2QgPSAwOyB9IGN1cnJlbnRfYnl0ZV9pbmRleCsrOyB9CisJCQkgIC8qIHJlbG9jYXRpb25zIG5ldmVyIG9jY3VyIGZyb20gYW4gdW5sb2FkYWJsZSBzZWN0aW9uLAorCQkgICAgICAgc28gd2UgY2FuIGFzc3VtZSB0aGF0IHJhd19kYXRhIGlzIG5vdCBOVUxMCisJCSAgICAgKi8KKwkJCSAgKmRzdCsrID0gKnJhd19kYXRhKys7CisJCQkgIEFEVkFOQ0UKKwkJCSAgICAqIGRzdCsrID0gKnJhd19kYXRhKys7CisJCQkgIEFEVkFOQ0UKKwkJCSAgICBpZiAoaG93LT5zaXplID09IDIpCisJCQkgICAgeworCQkJICAgICAgKmRzdCsrID0gKnJhd19kYXRhKys7CisJCQkgICAgICBBRFZBTkNFCisJCQkJKiBkc3QrKyA9ICpyYXdfZGF0YSsrOworCQkJICAgICAgQURWQU5DRQorCQkJICAgIH0KKwkJCSAgY29udGludWU7CisJCQl9CisJCSAgICB9CisJCSAgLyogSWYgdGhpcyBpcyBjb21pbmcgZnJvbSBhbiB1bmxvYWRhYmxlIHNlY3Rpb24gdGhlbiBjb3B5CisJCSAgIHplcm9zICovCisJCSAgaWYgKHJhd19kYXRhID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgICpkc3QrKyA9IDA7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAqZHN0KysgPSAqcmF3X2RhdGErKzsKKwkJICAgIH0KKwkJICBBRFZBTkNFCisJCX0KKworCSAgICAgIC8qIERvbid0IHdyaXRlIGEgdXNlbGVzcyBudWxsIG1vZGlmaWNhdGlvbiBieXRlICovCisJICAgICAgaWYgKGRzdCA9PSBtb2QgKyAxKQorCQl7CisJCSAgLS1kc3Q7CisJCX0KKworCSAgICAgIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKKwkJCQkJb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bSwKKwkJCQkJKChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKQorCQkJCQkgJiBwcm9jZXNzZWRfZGF0YSksCisJCQkJCWRzdCAtIChiZmRfYnl0ZSAqKSAmIHByb2Nlc3NlZF9kYXRhKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK29hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoISBvYXN5c193cml0ZV9oZWFkZXIgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCEgb2FzeXNfd3JpdGVfc3ltcyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoISBvYXN5c193cml0ZV9zZWN0aW9ucyAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoISBvYXN5c193cml0ZV9kYXRhIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghIG9hc3lzX3dyaXRlX2VuZCAoYWJmZCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworCisKKworLyoqIGV4ZWMgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLworCisvKiBzZXQgc2VjdGlvbiBjb250ZW50cyBpcyBjb21wbGljYXRlZCB3aXRoIE9BU1lTIHNpbmNlIHRoZSBmb3JtYXQgaXMKKyogbm90IGEgYnl0ZSBpbWFnZSwgYnV0IGEgcmVjb3JkIHN0cmVhbS4KKyovCitzdGF0aWMgYm9vbGVhbgorb2FzeXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIGlmIChjb3VudCAhPSAwKQorICAgIHsKKyAgICAgIGlmIChvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPT0gKGJmZF9ieXRlICopIE5VTEwpCisJeworCSAgb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID0KKwkgICAgKGJmZF9ieXRlICopIChiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSkpOworCSAgaWYgKCFvYXN5c19wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICAodm9pZCkgbWVtY3B5ICgoUFRSKSAob2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsgb2Zmc2V0KSwKKwkJICAgICBsb2NhdGlvbiwKKwkJICAgICAoc2l6ZV90KSBjb3VudCk7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCisKKy8qIE5hdGl2ZS1sZXZlbCBpbnRlcmZhY2UgdG8gc3ltYm9scy4gKi8KKworLyogV2UgcmVhZCB0aGUgc3ltYm9scyBpbnRvIGEgYnVmZmVyLCB3aGljaCBpcyBkaXNjYXJkZWQgd2hlbiB0aGlzCitmdW5jdGlvbiBleGl0cy4gIFdlIHJlYWQgdGhlIHN0cmluZ3MgaW50byBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8KK2hvbGQgdGhlbSBhbGwgcGx1cyBhbGwgdGhlIGNhY2hlZCBzeW1ib2wgZW50cmllcy4gKi8KKworc3RhdGljIGFzeW1ib2wgKgorb2FzeXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKworICBvYXN5c19zeW1ib2xfdHlwZSAqbmV3ID0KKyAgKG9hc3lzX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfc3ltYm9sX3R5cGUpKTsKKyAgaWYgKCFuZXcpCisgICAgcmV0dXJuIE5VTEw7CisgIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gJm5ldy0+c3ltYm9sOworfQorDAorCisKKworLyogVXNlciBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBmaWxlIGZsYWdzOyBwZXJoYXBzIHdlIHNob3VsZCByZXR1cm4KK0JGRF9OT19NT1JFX1NZTUJPTFMgaWYgdGhlcmUgYXJlIG5vbmU/ICovCisKK3N0YXRpYyBiZmQgKgorb2FzeXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQorICAgICBiZmQgKmFyY2g7CisgICAgIGJmZCAqcHJldjsKK3sKKyAgb2FzeXNfYXJfZGF0YV90eXBlICphciA9IE9BU1lTX0FSX0RBVEEgKGFyY2gpOworICBvYXN5c19tb2R1bGVfaW5mb190eXBlICpwOworICAvKiB0YWtlIHRoZSBuZXh0IG9uZSBmcm9tIHRoZSBhcmNoIHN0YXRlLCBvciByZXNldCAqLworICBpZiAocHJldiA9PSAoYmZkICopIE5VTEwpCisgICAgeworICAgICAgLyogUmVzZXQgdGhlIGluZGV4IC0gdGhlIGZpcnN0IHR3byBlbnRyaWVzIGFyZSBib2d1cyovCisgICAgICBhci0+bW9kdWxlX2luZGV4ID0gMDsKKyAgICB9CisKKyAgcCA9IGFyLT5tb2R1bGUgKyBhci0+bW9kdWxlX2luZGV4OworICBhci0+bW9kdWxlX2luZGV4Kys7CisKKyAgaWYgKGFyLT5tb2R1bGVfaW5kZXggPD0gYXItPm1vZHVsZV9jb3VudCkKKyAgICB7CisgICAgICBpZiAocC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCisJeworCSAgcC0+YWJmZCA9IF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCAoYXJjaCk7CisJICBwLT5hYmZkLT5vcmlnaW4gPSBwLT5wb3M7CisJICBwLT5hYmZkLT5maWxlbmFtZSA9IHAtPm5hbWU7CisKKwkgIC8qIEZpeHVwIGEgcG9pbnRlciB0byB0aGlzIGVsZW1lbnQgZm9yIHRoZSBtZW1iZXIgKi8KKwkgIHAtPmFiZmQtPmFyZWx0X2RhdGEgPSAoUFRSKSBwOworCX0KKyAgICAgIHJldHVybiBwLT5hYmZkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKKyAgICAgIHJldHVybiAoYmZkICopIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgYm9vbGVhbgorb2FzeXNfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsCisJCQkgc2VjdGlvbiwKKwkJCSBzeW1ib2xzLAorCQkJIG9mZnNldCwKKwkJCSBmaWxlbmFtZV9wdHIsCisJCQkgZnVuY3Rpb25uYW1lX3B0ciwKKwkJCSBsaW5lX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJmZF92bWEgb2Zmc2V0OworICAgICBjaGFyICoqZmlsZW5hbWVfcHRyOworICAgICBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKK3sKKyAgcmV0dXJuIGZhbHNlOworCit9CisKK3N0YXRpYyBpbnQKK29hc3lzX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgYnVmKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBzdGF0ICpidWY7Cit7CisgIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZCA9IChvYXN5c19tb2R1bGVfaW5mb190eXBlICopIGFiZmQtPmFyZWx0X2RhdGE7CisgIGlmIChtb2QgPT0gKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1Zi0+c3Rfc2l6ZSA9IG1vZC0+c2l6ZTsKKyAgICAgIGJ1Zi0+c3RfbW9kZSA9IDA2NjY7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK29hc3lzX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlYzsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUJb2FzeXNfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCisjZGVmaW5lIG9hc3lzX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbworCisjZGVmaW5lIG9hc3lzX3NsdXJwX2FybWFwIGJmZF90cnVlCisjZGVmaW5lIG9hc3lzX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmZkX3RydWUKKyNkZWZpbmUgb2FzeXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAorICAgYmZkX3RydWUpCisjZGVmaW5lIG9hc3lzX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKKyNkZWZpbmUgb2FzeXNfd3JpdGVfYXJtYXAgXAorICAoKGJvb2xlYW4gKCopIFwKKyAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKKyAgIGJmZF90cnVlKQorI2RlZmluZSBvYXN5c19yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKKyNkZWZpbmUgb2FzeXNfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAorI2RlZmluZSBvYXN5c191cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCisKKyNkZWZpbmUgb2FzeXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBvYXN5c19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KKyNkZWZpbmUgb2FzeXNfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBvYXN5c19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIG9hc3lzX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAorCisjZGVmaW5lIG9hc3lzX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAorCisjZGVmaW5lIG9hc3lzX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAorCisjZGVmaW5lIG9hc3lzX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCisgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKKworI2RlZmluZSBvYXN5c19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIG9hc3lzX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgb2FzeXNfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZGVmaW5lIG9hc3lzX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIG9hc3lzX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIG9hc3lzX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZGVmaW5lIG9hc3lzX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorCisvKlNVUFBSRVNTIDQ2MCAqLworY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWMgPQoreworICAib2FzeXMiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAorICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLworICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLworICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8CisgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKKyAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCisgIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KKworICB7X2JmZF9kdW1teV90YXJnZXQsCisgICBvYXN5c19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIG9hc3lzX2FyY2hpdmVfcCwKKyAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICB9LAorICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgYmZkX2ZhbHNlLAorICAgIG9hc3lzX21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCisgICAgYmZkX2ZhbHNlCisgIH0sCisgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgYmZkX2ZhbHNlLAorICAgIG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cywKKyAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2ZhbHNlLAorICB9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKG9hc3lzKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChvYXN5cyksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG9hc3lzKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChvYXN5cyksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChvYXN5cyksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKG9hc3lzKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpIDAKK307CmRpZmYgLS1naXQgYS9iZmQvb3BuY2xzLmMgYi9iZmQvb3BuY2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxMDEzNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9vcG5jbHMuYwpAQCAtMCwwICsxLDY4MyBAQAorLyogb3BuY2xzLmMgLS0gb3BlbiBhbmQgY2xvc2UgYSBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJvYmphbGxvYy5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaWZuZGVmIFNfSVhVU1IKKyNkZWZpbmUgU19JWFVTUiAwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworI2VuZGlmCisjaWZuZGVmIFNfSVhHUlAKKyNkZWZpbmUgU19JWEdSUCAwMDEwCS8qIEV4ZWN1dGUgYnkgZ3JvdXAuICAqLworI2VuZGlmCisjaWZuZGVmIFNfSVhPVEgKKyNkZWZpbmUgU19JWE9USCAwMDAxCS8qIEV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKyNlbmRpZgorCisvKiBmZG9wZW4gaXMgYSBsb3NlciAtLSB3ZSBzaG91bGQgdXNlIHN0ZGlvIGV4Y2x1c2l2ZWx5LiAgVW5mb3J0dW5hdGVseQorICAgaWYgd2UgZG8gdGhhdCB3ZSBjYW4ndCB1c2UgZmNudGwuICAqLworCisvKiBGSVhNRTogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCitsb25nIF9iZmRfY2h1bmtzaXplID0gLTE7CisKKy8qIFJldHVybiBhIG5ldyBCRkQuICBBbGwgQkZEJ3MgYXJlIGFsbG9jYXRlZCB0aHJvdWdoIHRoaXMgcm91dGluZS4gICovCisKK2JmZCAqCitfYmZkX25ld19iZmQgKCkKK3sKKyAgYmZkICpuYmZkOworCisgIG5iZmQgPSAoYmZkICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZCkpOworICBpZiAobmJmZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIG5iZmQtPm1lbW9yeSA9IChQVFIpIG9iamFsbG9jX2NyZWF0ZSAoKTsKKyAgaWYgKG5iZmQtPm1lbW9yeSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG5iZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKKworICBuYmZkLT5kaXJlY3Rpb24gPSBub19kaXJlY3Rpb247CisgIG5iZmQtPmlvc3RyZWFtID0gTlVMTDsKKyAgbmJmZC0+d2hlcmUgPSAwOworICBuYmZkLT5zZWN0aW9ucyA9IChhc2VjdGlvbiAqKSBOVUxMOworICBuYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKKyAgbmJmZC0+bXlfYXJjaGl2ZSA9IChiZmQgKikgTlVMTDsKKyAgbmJmZC0+b3JpZ2luID0gMDsJCQkJCisgIG5iZmQtPm9wZW5lZF9vbmNlID0gZmFsc2U7CisgIG5iZmQtPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKKyAgbmJmZC0+c2VjdGlvbl9jb3VudCA9IDA7CisgIG5iZmQtPnVzcmRhdGEgPSAoUFRSKSBOVUxMOworICBuYmZkLT5jYWNoZWFibGUgPSBmYWxzZTsKKyAgbmJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7CisgIG5iZmQtPm10aW1lX3NldCA9IGZhbHNlOworCisgIHJldHVybiBuYmZkOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBCRkQgYXMgYSBtZW1iZXIgb2YgYXJjaGl2ZSBPQkZELiAgKi8KKworYmZkICoKK19iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpCisgICAgIGJmZCAqb2JmZDsKK3sKKyAgYmZkICpuYmZkOworCisgIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7CisgIG5iZmQtPnh2ZWMgPSBvYmZkLT54dmVjOworICBuYmZkLT5teV9hcmNoaXZlID0gb2JmZDsKKyAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247CisgIG5iZmQtPnRhcmdldF9kZWZhdWx0ZWQgPSBvYmZkLT50YXJnZXRfZGVmYXVsdGVkOworICByZXR1cm4gbmJmZDsKK30KKworLyoKK1NFQ1RJT04KKwlPcGVuaW5nIGFuZCBjbG9zaW5nIEJGRHMKKworKi8KKworLyoKK0ZVTkNUSU9OCisJYmZkX29wZW5yCisKK1NZTk9QU0lTCisgICAgICAgIGJmZCAqYmZkX29wZW5yKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpOworCitERVNDUklQVElPTgorCU9wZW4gdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0gKHVzaW5nIDw8Zm9wZW4+Pikgd2l0aCB0aGUgdGFyZ2V0CisJQHZhcnt0YXJnZXR9LiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBCRkQuCisKKwlDYWxscyA8PGJmZF9maW5kX3RhcmdldD4+LCBzbyBAdmFye3RhcmdldH0gaXMgaW50ZXJwcmV0ZWQgYXMgYnkKKwl0aGF0IGZ1bmN0aW9uLgorCisJSWYgPDxOVUxMPj4gaXMgcmV0dXJuZWQgdGhlbiBhbiBlcnJvciBoYXMgb2NjdXJlZC4gICBQb3NzaWJsZSBlcnJvcnMKKwlhcmUgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gb3IgPDxzeXN0ZW1fY2FsbD4+IGVycm9yLgorKi8KKworYmZkICoKK2JmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCkKKyAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7CisgICAgIENPTlNUIGNoYXIgKnRhcmdldDsKK3sKKyAgYmZkICpuYmZkOworICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOworCisgIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7CisgIGlmIChuYmZkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKKyAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7CisgICAgICBmcmVlIChuYmZkKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247CisKKyAgaWYgKGJmZF9vcGVuX2ZpbGUgKG5iZmQpID09IE5VTEwpCisgICAgeworICAgICAgLyogRmlsZSBkaWRuJ3QgZXhpc3QsIG9yIHNvbWUgc3VjaCAqLworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKKyAgICAgIGZyZWUgKG5iZmQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBuYmZkOworfQorCisvKiBEb24ndCB0cnkgdG8gYG9wdGltaXplJyB0aGlzIGZ1bmN0aW9uOgorCisgICBvIC0gV2UgbG9jayB1c2luZyBzdGFjayBzcGFjZSBzbyB0aGF0IGludGVycnVwdGluZyB0aGUgbG9ja2luZworICAgICAgIHdvbid0IGNhdXNlIGEgc3RvcmFnZSBsZWFrLgorICAgbyAtIFdlIG9wZW4gdGhlIGZpbGUgc3RyZWFtIGxhc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0bworICAgICAgIGNsb3NlIGl0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuICBDbG9zaW5nIHRoZSBzdHJlYW0gbWVhbnMgY2xvc2luZworICAgICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG9vLCBldmVuIHRob3VnaCB3ZSBkaWRuJ3Qgb3BlbiBpdC4KKyAqLworLyoKK0ZVTkNUSU9OCisgICAgICAgICBiZmRfZmRvcGVucgorCitTWU5PUFNJUworICAgICAgICAgYmZkICpiZmRfZmRvcGVucihDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0LCBpbnQgZmQpOworCitERVNDUklQVElPTgorICAgICAgICAgPDxiZmRfZmRvcGVucj4+IGlzIHRvIDw8YmZkX2ZvcGVucj4+IG11Y2ggbGlrZSA8PGZkb3Blbj4+IGlzIHRvIDw8Zm9wZW4+Pi4KKwkgSXQgb3BlbnMgYSBCRkQgb24gYSBmaWxlIGFscmVhZHkgZGVzY3JpYmVkIGJ5IHRoZSBAdmFye2ZkfQorCSBzdXBwbGllZC4KKworCSBXaGVuIHRoZSBmaWxlIGlzIGxhdGVyIDw8YmZkX2Nsb3NlPj5kLCB0aGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgY2xvc2VkLgorCisJIElmIHRoZSBjYWxsZXIgZGVzaXJlcyB0aGF0IHRoaXMgZmlsZSBkZXNjcmlwdG9yIGJlIGNhY2hlZCBieSBCRkQKKwkgKG9wZW5lZCBhcyBuZWVkZWQsIGNsb3NlZCBhcyBuZWVkZWQgdG8gZnJlZSBkZXNjcmlwdG9ycyBmb3IKKwkgb3RoZXIgb3BlbnMpLCB3aXRoIHRoZSBzdXBwbGllZCBAdmFye2ZkfSB1c2VkIGFzIGFuIGluaXRpYWwKKwkgZmlsZSBkZXNjcmlwdG9yIChidXQgc3ViamVjdCB0byBjbG9zdXJlIGF0IGFueSB0aW1lKSwgY2FsbAorCSBiZmRfc2V0X2NhY2hlYWJsZShiZmQsIDEpIG9uIHRoZSByZXR1cm5lZCBCRkQuICBUaGUgZGVmYXVsdCBpcyB0bworCSBhc3N1bWUgbm8gY2FjaGVpbmc7IHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCByZW1haW4gb3BlbiB1bnRpbAorCSA8PGJmZF9jbG9zZT4+LCBhbmQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgQkZEIG9wZXJhdGlvbnMgb24gb3RoZXIKKwkgZmlsZXMuCisKKyAgICAgICAgIFBvc3NpYmxlIGVycm9ycyBhcmUgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sIDw8YmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0Pj4gYW5kIDw8YmZkX2Vycm9yX3N5c3RlbV9jYWxsPj4uCisqLworCitiZmQgKgorYmZkX2Zkb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQsIGZkKQorICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKKyAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OworICAgICBpbnQgZmQ7Cit7CisgIGJmZCAqbmJmZDsKKyAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKKyAgaW50IGZkZmxhZ3M7CisKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKyNpZiAhIGRlZmluZWQoSEFWRV9GQ05UTCkgfHwgISBkZWZpbmVkKEZfR0VURkwpCisgIGZkZmxhZ3MgPSBPX1JEV1I7CQkJLyogQXNzdW1lIGZ1bGwgYWNjZXNzICovCisjZWxzZQorICBmZGZsYWdzID0gZmNudGwgKGZkLCBGX0dFVEZMLCBOVUxMKTsKKyNlbmRpZgorICBpZiAoZmRmbGFncyA9PSAtMSkgcmV0dXJuIE5VTEw7CisKKyAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKKyAgaWYgKG5iZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOworICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7CisgICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7CisgICAgICBmcmVlIChuYmZkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmbmRlZiBIQVZFX0ZET1BFTgorICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOworI2Vsc2UKKyAgLyogKE9fQUNDTU9ERSkgcGFyZW5zIGFyZSB0byBhdm9pZCBVbHRyaXggaGVhZGVyIGZpbGUgYnVnICovCisgIHN3aXRjaCAoZmRmbGFncyAmIChPX0FDQ01PREUpKQorICAgIHsKKyAgICBjYXNlIE9fUkRPTkxZOiBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JCKTsgICBicmVhazsKKyAgICBjYXNlIE9fV1JPTkxZOiBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JVQik7ICBicmVhazsKKyAgICBjYXNlIE9fUkRXUjogICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGZkb3BlbiAoZmQsIEZPUEVOX1JVQik7ICBicmVhazsKKyAgICBkZWZhdWx0OiBhYm9ydCAoKTsKKyAgICB9CisjZW5kaWYKKworICBpZiAobmJmZC0+aW9zdHJlYW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7CisgICAgICBmcmVlIChuYmZkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBPSywgcHV0IGV2ZXJ5dGhpbmcgd2hlcmUgaXQgYmVsb25ncyAqLworCisgIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7CisKKyAgLyogQXMgYSBzcGVjaWFsIGNhc2Ugd2UgYWxsb3cgYSBGRCBvcGVuIGZvciByZWFkL3dyaXRlIHRvCisgICAgIGJlIHdyaXR0ZW4gdGhyb3VnaCwgYWx0aG91Z2ggZG9pbmcgc28gcmVxdWlyZXMgdGhhdCB3ZSBlbmQKKyAgICAgdGhlIHByZXZpb3VzIGNsYXVzZSB3aXRoIGEgcHJlcG9zaXRpb24uICAqLworICAvKiAoT19BQ0NNT0RFKSBwYXJlbnMgYXJlIHRvIGF2b2lkIFVsdHJpeCBoZWFkZXIgZmlsZSBidWcgKi8KKyAgc3dpdGNoIChmZGZsYWdzICYgT19BQ0NNT0RFKQorICAgIHsKKyAgICBjYXNlIE9fUkRPTkxZOiBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsgYnJlYWs7CisgICAgY2FzZSBPX1dST05MWTogbmJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOyBicmVhazsKKyAgICBjYXNlIE9fUkRXUjogbmJmZC0+ZGlyZWN0aW9uID0gYm90aF9kaXJlY3Rpb247IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0ICgpOworICAgIH0KKworICBpZiAoISBiZmRfY2FjaGVfaW5pdCAobmJmZCkpCisgICAgeworICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOworICAgICAgZnJlZSAobmJmZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIG5iZmQtPm9wZW5lZF9vbmNlID0gdHJ1ZTsKKworICByZXR1cm4gbmJmZDsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX29wZW5zdHJlYW1yCisKK1NZTk9QU0lTCisJYmZkICpiZmRfb3BlbnN0cmVhbXIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFBUUik7CisKK0RFU0NSSVBUSU9OCisKKwlPcGVuIGEgQkZEIGZvciByZWFkIGFjY2VzcyBvbiBhbiBleGlzdGluZyBzdGRpbyBzdHJlYW0uICBXaGVuCisJdGhlIEJGRCBpcyBwYXNzZWQgdG8gPDxiZmRfY2xvc2U+PiwgdGhlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZC4KKyovCisKK2JmZCAqCitiZmRfb3BlbnN0cmVhbXIgKGZpbGVuYW1lLCB0YXJnZXQsIHN0cmVhbWFyZykKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKKyAgICAgUFRSIHN0cmVhbWFyZzsKK3sKKyAgRklMRSAqc3RyZWFtID0gKEZJTEUgKikgc3RyZWFtYXJnOworICBiZmQgKm5iZmQ7CisgIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7CisKKyAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKKyAgaWYgKG5iZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOworICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7CisgICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7CisgICAgICBmcmVlIChuYmZkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIHN0cmVhbTsKKyAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgbmJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247CisJCQkJCisgIGlmICghIGJmZF9jYWNoZV9pbml0IChuYmZkKSkKKyAgICB7CisgICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7CisgICAgICBmcmVlIChuYmZkKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICByZXR1cm4gbmJmZDsKK30KKwwKKy8qKiBiZmRfb3BlbncgLS0gb3BlbiBmb3Igd3JpdGluZy4KKyAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmcmVzaGx5LWFsbG9jYXRlZCBCRkQgb24gc3VjY2Vzcywgb3IgTlVMTC4KKworICBTZWUgY29tbWVudCBieSBiZmRfZmRvcGVuciBiZWZvcmUgeW91IHRyeSB0byBtb2RpZnkgdGhpcyBmdW5jdGlvbi4gKi8KKworLyoKK0ZVTkNUSU9OCisJYmZkX29wZW53CisKK1NZTk9QU0lTCisJYmZkICpiZmRfb3BlbncoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCk7CisKK0RFU0NSSVBUSU9OCisJQ3JlYXRlIGEgQkZELCBhc3NvY2lhdGVkIHdpdGggZmlsZSBAdmFye2ZpbGVuYW1lfSwgdXNpbmcgdGhlCisJZmlsZSBmb3JtYXQgQHZhcnt0YXJnZXR9LCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KKworCVBvc3NpYmxlIGVycm9ycyBhcmUgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiwgPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4sCisJPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+Pi4KKyovCisKK2JmZCAqCitiZmRfb3BlbncgKGZpbGVuYW1lLCB0YXJnZXQpCisgICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOworICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Cit7CisgIGJmZCAqbmJmZDsKKyAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKKworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworCisgIC8qIG5iZmQgaGFzIHRvIHBvaW50IHRvIGhlYWQgb2YgbWFsbG9jJ2VkIGJsb2NrIHNvIHRoYXQgYmZkX2Nsb3NlIG1heQorICAgICByZWNsYWltIGl0IGNvcnJlY3RseS4gKi8KKworICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOworICBpZiAobmJmZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7CisgIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCisgICAgeworICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOworICAgICAgZnJlZSAobmJmZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgbmJmZC0+ZGlyZWN0aW9uID0gd3JpdGVfZGlyZWN0aW9uOworCisgIGlmIChiZmRfb3Blbl9maWxlIChuYmZkKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CS8qIEZpbGUgbm90IHdyaXRlYWJsZSwgZXRjICovCisgICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7CisgICAgICBmcmVlIChuYmZkKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIG5iZmQ7Cit9CisKKy8qCisKK0ZVTkNUSU9OCisJYmZkX2Nsb3NlCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfY2xvc2UoYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKworCUNsb3NlIGEgQkZELiBJZiB0aGUgQkZEIHdhcyBvcGVuIGZvciB3cml0aW5nLAorCXRoZW4gcGVuZGluZyBvcGVyYXRpb25zIGFyZSBjb21wbGV0ZWQgYW5kIHRoZSBmaWxlIHdyaXR0ZW4gb3V0CisJYW5kIGNsb3NlZC4gSWYgdGhlIGNyZWF0ZWQgZmlsZSBpcyBleGVjdXRhYmxlLCB0aGVuCisJPDxjaG1vZD4+IGlzIGNhbGxlZCB0byBtYXJrIGl0IGFzIHN1Y2guCisKKwlBbGwgbWVtb3J5IGF0dGFjaGVkIHRvIHRoZSBCRkQgaXMgcmVsZWFzZWQuCisKKwlUaGUgZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkZEIGlzIGNsb3NlZCAoZXZlbgorCWlmIGl0IHdhcyBwYXNzZWQgaW4gdG8gQkZEIGJ5IDw8YmZkX2Zkb3BlbnI+PikuCisKK1JFVFVSTlMKKwk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCisqLworCisKK2Jvb2xlYW4KK2JmZF9jbG9zZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBib29sZWFuIHJldDsKKworICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpKQorICAgIHsKKyAgICAgIGlmICghIEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF93cml0ZV9jb250ZW50cywgKGFiZmQpKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIEJGRF9TRU5EIChhYmZkLCBfY2xvc2VfYW5kX2NsZWFudXAsIChhYmZkKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldCA9IGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7CisKKyAgLyogSWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHdyaXRpbmcgYW5kIGlzIG5vdyBleGVjdXRhYmxlLAorICAgICBtYWtlIGl0IHNvICovCisgIGlmIChyZXQKKyAgICAgICYmIGFiZmQtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24KKyAgICAgICYmIGFiZmQtPmZsYWdzICYgRVhFQ19QKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwKQorCXsKKyAJICBpbnQgbWFzayA9IHVtYXNrICgwKTsKKwkgIHVtYXNrIChtYXNrKTsKKwkgIGNobW9kIChhYmZkLT5maWxlbmFtZSwKKwkJICgwNzc3CisJCSAgJiAoYnVmLnN0X21vZGUgfCAoKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkgJn4gbWFzaykpKSk7CisJfQorICAgIH0KKworICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSk7CisgIGZyZWUgKGFiZmQpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9jbG9zZV9hbGxfZG9uZQorCitTWU5PUFNJUworCWJvb2xlYW4gYmZkX2Nsb3NlX2FsbF9kb25lKGJmZCAqKTsKKworREVTQ1JJUFRJT04KKwlDbG9zZSBhIEJGRC4gIERpZmZlcnMgZnJvbSA8PGJmZF9jbG9zZT4+CisJc2luY2UgaXQgZG9lcyBub3QgY29tcGxldGUgYW55IHBlbmRpbmcgb3BlcmF0aW9ucy4gIFRoaXMKKwlyb3V0aW5lIHdvdWxkIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGhhZCBqdXN0IHVzZWQgQkZEIGZvcgorCXN3YXBwaW5nIGFuZCBkaWRuJ3Qgd2FudCB0byB1c2UgYW55IG9mIHRoZSB3cml0aW5nIGNvZGUuCisKKwlJZiB0aGUgY3JlYXRlZCBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4gPDxjaG1vZD4+IGlzIGNhbGxlZAorCXRvIG1hcmsgaXQgYXMgc3VjaC4KKworCUFsbCBtZW1vcnkgYXR0YWNoZWQgdG8gdGhlIEJGRCBpcyByZWxlYXNlZC4KKworUkVUVVJOUworCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KKworKi8KKworYm9vbGVhbgorYmZkX2Nsb3NlX2FsbF9kb25lIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJvb2xlYW4gcmV0OworCisgIHJldCA9IGJmZF9jYWNoZV9jbG9zZSAoYWJmZCk7CisKKyAgLyogSWYgdGhlIGZpbGUgd2FzIG9wZW4gZm9yIHdyaXRpbmcgYW5kIGlzIG5vdyBleGVjdXRhYmxlLAorICAgICBtYWtlIGl0IHNvICovCisgIGlmIChyZXQKKyAgICAgICYmIGFiZmQtPmRpcmVjdGlvbiA9PSB3cml0ZV9kaXJlY3Rpb24KKyAgICAgICYmIGFiZmQtPmZsYWdzICYgRVhFQ19QKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwKQorCXsKKwkgIGludCBtYXNrID0gdW1hc2sgKDApOworCSAgdW1hc2sgKG1hc2spOworCSAgY2htb2QgKGFiZmQtPmZpbGVuYW1lLAorCQkgKDB4Nzc3CisJCSAgJiAoYnVmLnN0X21vZGUgfCAoKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkgJn4gbWFzaykpKSk7CisJfQorICAgIH0KKworICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSk7CisgIGZyZWUgKGFiZmQpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9jcmVhdGUKKworU1lOT1BTSVMKKwliZmQgKmJmZF9jcmVhdGUoQ09OU1QgY2hhciAqZmlsZW5hbWUsIGJmZCAqdGVtcGwpOworCitERVNDUklQVElPTgorCUNyZWF0ZSBhIG5ldyBCRkQgaW4gdGhlIG1hbm5lciBvZgorCTw8YmZkX29wZW53Pj4sIGJ1dCB3aXRob3V0IG9wZW5pbmcgYSBmaWxlLiBUaGUgbmV3IEJGRAorCXRha2VzIHRoZSB0YXJnZXQgZnJvbSB0aGUgdGFyZ2V0IHVzZWQgYnkgQHZhcnt0ZW1wbGF0ZX0uIFRoZQorCWZvcm1hdCBpcyBhbHdheXMgc2V0IHRvIDw8YmZkX29iamVjdD4+LgorCisqLworCitiZmQgKgorYmZkX2NyZWF0ZSAoZmlsZW5hbWUsIHRlbXBsKQorICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKKyAgICAgYmZkICp0ZW1wbDsKK3sKKyAgYmZkICpuYmZkOworCisgIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7CisgIGlmIChuYmZkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIG5iZmQtPmZpbGVuYW1lID0gZmlsZW5hbWU7CisgIGlmICh0ZW1wbCkKKyAgICBuYmZkLT54dmVjID0gdGVtcGwtPnh2ZWM7CisgIG5iZmQtPmRpcmVjdGlvbiA9IG5vX2RpcmVjdGlvbjsKKyAgYmZkX3NldF9mb3JtYXQgKG5iZmQsIGJmZF9vYmplY3QpOworICByZXR1cm4gbmJmZDsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX21ha2Vfd3JpdGFibGUKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9tYWtlX3dyaXRhYmxlKGJmZCAqYWJmZCk7CisKK0RFU0NSSVBUSU9OCisJVGFrZXMgYSBCRkQgYXMgY3JlYXRlZCBieSA8PGJmZF9jcmVhdGU+PiBhbmQgY29udmVydHMgaXQKKwlpbnRvIG9uZSBsaWtlIGFzIHJldHVybmVkIGJ5IDw8YmZkX29wZW53Pj4uICBJdCBkb2VzIHRoaXMKKwlieSBjb252ZXJ0aW5nIHRoZSBCRkQgdG8gQkZEX0lOX01FTU9SWS4gIEl0J3MgYXNzdW1lZCB0aGF0CisJeW91IHdpbGwgY2FsbCA8PGJmZF9tYWtlX3JlYWRhYmxlPj4gb24gdGhpcyBiZmQgbGF0ZXIuCisKK1JFVFVSTlMKKwk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uCisqLworCitib29sZWFuCitiZmRfbWFrZV93cml0YWJsZShhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW07CisKKyAgaWYgKGFiZmQtPmRpcmVjdGlvbiAhPSBub19kaXJlY3Rpb24pCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYmltID0gKHN0cnVjdCBiZmRfaW5fbWVtb3J5ICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9pbl9tZW1vcnkpKTsKKyAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBiaW07CisgIC8qIGJmZF93cml0ZSB3aWxsIGdyb3cgdGhlc2UgYXMgbmVlZGVkICovCisgIGJpbS0+c2l6ZSA9IDA7CisgIGJpbS0+YnVmZmVyID0gMDsKKworICBhYmZkLT5mbGFncyB8PSBCRkRfSU5fTUVNT1JZOworICBhYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247CisgIGFiZmQtPndoZXJlID0gMDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX21ha2VfcmVhZGFibGUKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9tYWtlX3JlYWRhYmxlKGJmZCAqYWJmZCk7CisKK0RFU0NSSVBUSU9OCisJVGFrZXMgYSBCRkQgYXMgY3JlYXRlZCBieSA8PGJmZF9jcmVhdGU+PiBhbmQKKwk8PGJmZF9tYWtlX3dyaXRhYmxlPj4gYW5kIGNvbnZlcnRzIGl0IGludG8gb25lIGxpa2UgYXMKKwlyZXR1cm5lZCBieSA8PGJmZF9vcGVucj4+LiAgSXQgZG9lcyB0aGlzIGJ5IHdyaXRpbmcgdGhlCisJY29udGVudHMgb3V0IHRvIHRoZSBtZW1vcnkgYnVmZmVyLCB0aGVuIHJldmVyc2luZyB0aGUKKwlkaXJlY3Rpb24uCisKK1JFVFVSTlMKKwk8PHRydWU+PiBpcyByZXR1cm5lZCBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8PGZhbHNlPj4uICAqLworCitib29sZWFuCitiZmRfbWFrZV9yZWFkYWJsZShhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChhYmZkLT5kaXJlY3Rpb24gIT0gd3JpdGVfZGlyZWN0aW9uIHx8ICEoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBCRkRfU0VORF9GTVQgKGFiZmQsIF9iZmRfd3JpdGVfY29udGVudHMsIChhYmZkKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIEJGRF9TRU5EIChhYmZkLCBfY2xvc2VfYW5kX2NsZWFudXAsIChhYmZkKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisKKyAgYWJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OworCisgIGFiZmQtPndoZXJlID0gMDsKKyAgYWJmZC0+c2VjdGlvbnMgPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247CisgIGFiZmQtPm15X2FyY2hpdmUgPSAoYmZkICopIE5VTEw7CisgIGFiZmQtPm9yaWdpbiA9IDA7CQkJCQorICBhYmZkLT5vcGVuZWRfb25jZSA9IGZhbHNlOworICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7CisgIGFiZmQtPnNlY3Rpb25fY291bnQgPSAwOworICBhYmZkLT51c3JkYXRhID0gKFBUUikgTlVMTDsKKyAgYWJmZC0+Y2FjaGVhYmxlID0gZmFsc2U7CisgIGFiZmQtPmZsYWdzID0gQkZEX0lOX01FTU9SWTsKKyAgYWJmZC0+bXRpbWVfc2V0ID0gZmFsc2U7CisKKyAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7CisgIGFiZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOworICBhYmZkLT5zZWN0aW9ucyA9IDA7CisgIGFiZmQtPnN5bWNvdW50ID0gMDsKKyAgYWJmZC0+b3V0c3ltYm9scyA9IDA7CisgIGFiZmQtPnRkYXRhLmFueSA9IDA7CisKKyAgYmZkX2NoZWNrX2Zvcm1hdChhYmZkLCBiZmRfb2JqZWN0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2FsbG9jCisKK1NZTk9QU0lTCisJUFRSIGJmZF9hbGxvYyAoYmZkICphYmZkLCBzaXplX3Qgd2FudGVkKTsKKworREVTQ1JJUFRJT04KKwlBbGxvY2F0ZSBhIGJsb2NrIG9mIEB2YXJ7d2FudGVkfSBieXRlcyBvZiBtZW1vcnkgYXR0YWNoZWQgdG8KKwk8PGFiZmQ+PiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KKyovCisKKworUFRSCitiZmRfYWxsb2MgKGFiZmQsIHNpemUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2l6ZV90IHNpemU7Cit7CisgIFBUUiByZXQ7CisKKyAgcmV0ID0gb2JqYWxsb2NfYWxsb2MgKGFiZmQtPm1lbW9yeSwgKHVuc2lnbmVkIGxvbmcpIHNpemUpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgIHJldHVybiByZXQ7Cit9CisKK1BUUgorYmZkX3phbGxvYyAoYWJmZCwgc2l6ZSkKKyAgICAgYmZkICphYmZkOworICAgICBzaXplX3Qgc2l6ZTsKK3sKKyAgUFRSIHJlczsKKworICByZXMgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOworICBpZiAocmVzKQorICAgIG1lbXNldCAocmVzLCAwLCBzaXplKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBmb3IgYSBCRkQuICAqLworCit2b2lkCitiZmRfcmVsZWFzZSAoYWJmZCwgYmxvY2spCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGJsb2NrOworeworICBvYmphbGxvY19mcmVlX2Jsb2NrICgoc3RydWN0IG9iamFsbG9jICopIGFiZmQtPm1lbW9yeSwgYmxvY2spOworfQpkaWZmIC0tZ2l0IGEvYmZkL29zZi1jb3JlLmMgYi9iZmQvb3NmLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFmNGFmCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL29zZi1jb3JlLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgT1NGLzEgY29yZSBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBPU0YvMSBzdHlsZQorICAgY29yZSBmaWxlcy4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8c3lzL2NvcmUuaD4KKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIGFzZWN0aW9uICoKK21ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAorCQkJICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKK3N0YXRpYyBhc3ltYm9sICoKK29zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitvc2ZfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGNoYXIgKgorb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludAorb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbgorb3NmX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworc3RhdGljIHZvaWQKK3N3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOworCisvKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLworCitzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0IAoreworICBpbnQgc2lnOworICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKK307CisKKyNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLm9zZl9jb3JlX2RhdGEpCisjZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKKyNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKKworc3RhdGljIGFzZWN0aW9uICoKK21ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOworICAgICBiZmRfdm1hIHZtYTsKKyAgICAgZmlsZV9wdHIgZmlsZXBvczsKK3sKKyAgYXNlY3Rpb24gKmFzZWN0OworCisgIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOworICBpZiAoIWFzZWN0KQorICAgIHJldHVybiBOVUxMOworCisgIGFzZWN0LT5mbGFncyA9IGZsYWdzOworICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOworICBhc2VjdC0+dm1hID0gdm1hOworICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7CisgIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA4OworCisgIHJldHVybiBhc2VjdDsKK30KKworc3RhdGljIGFzeW1ib2wgKgorb3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7CisgIGlmIChuZXcpCisgICAgbmV3LT50aGVfYmZkID0gYWJmZDsKKyAgcmV0dXJuIG5ldzsKK30KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorb3NmX2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHZhbDsKKyAgaW50IGk7CisgIGNoYXIgKnNlY25hbWU7CisgIHN0cnVjdCBjb3JlX2ZpbGVoZHIgY29yZV9oZWFkZXI7CisKKyAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVfaGVhZGVyLCAxLCBzaXplb2YgY29yZV9oZWFkZXIsIGFiZmQpOworICBpZiAodmFsICE9IHNpemVvZiBjb3JlX2hlYWRlcikKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc3RybmNtcCAoY29yZV9oZWFkZXIubWFnaWMsICJDb3JlIiwgNCkgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAqKQorICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG9zZl9jb3JlX3N0cnVjdCkpOworICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBjb3JlX2hlYWRlci5uYW1lLCBNQVhDT01MRU4gKyAxKTsKKyAgY29yZV9zaWduYWwgKGFiZmQpID0gY29yZV9oZWFkZXIuc2lnbm87CisKKyAgZm9yIChpID0gMDsgaSA8IGNvcmVfaGVhZGVyLm5zY25zOyBpKyspCisgICAgeworICAgICAgc3RydWN0IGNvcmVfc2NuaGRyIGNvcmVfc2NuaGRyOworICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisKKyAgICAgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3JlX3NjbmhkciwgMSwgc2l6ZW9mIGNvcmVfc2NuaGRyLCBhYmZkKTsKKyAgICAgIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVfc2NuaGRyKQorCWJyZWFrOworCisgICAgICAvKiBTa2lwIGVtcHR5IHNlY3Rpb25zLiAgKi8KKyAgICAgIGlmIChjb3JlX3Njbmhkci5zaXplID09IDAgfHwgY29yZV9zY25oZHIuc2NucHRyID09IDApCisJY29udGludWU7CisKKyAgICAgIHN3aXRjaCAoY29yZV9zY25oZHIuc2NudHlwZSkKKwl7CisJY2FzZSBTQ05SR046CisJICBzZWNuYW1lID0gIi5kYXRhIjsKKwkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOworCSAgYnJlYWs7CisJY2FzZSBTQ05TVEFDSzoKKwkgIHNlY25hbWUgPSAiLnN0YWNrIjsKKwkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOworCSAgYnJlYWs7CisJY2FzZSBTQ05SRUdTOgorCSAgc2VjbmFtZSA9ICIucmVnIjsKKwkgIGZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaGFuZGxlZCBPU0YvMSBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iKSwKKwkJCQkgY29yZV9zY25oZHIuc2NudHlwZSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAorCQkJICAgICAgKGJmZF9zaXplX3R5cGUpIGNvcmVfc2NuaGRyLnNpemUsCisJCQkgICAgICAoYmZkX3ZtYSkgY29yZV9zY25oZHIudmFkZHIsCisJCQkgICAgICAoZmlsZV9wdHIpIGNvcmVfc2NuaGRyLnNjbnB0cikpCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitzdGF0aWMgY2hhciAqCitvc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGludAorb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgYm9vbGVhbgorb3NmX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKK3sKKyAgcmV0dXJuIHRydWU7CQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzIHBvaW50ICovCit9CisMCisjZGVmaW5lIG9zZl9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAorI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKKyNkZWZpbmUgb3NmX2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAorI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCisjZGVmaW5lIG9zZl9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIG9zZl9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubworI2RlZmluZSBvc2ZfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQorI2RlZmluZSBvc2ZfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIG9zZl9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSBvc2ZfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAorCisvKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCitzdGF0aWMgdm9pZAorc3dhcF9hYm9ydCgpCit7CisgIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLworfQorI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19TSUdORURfR0VUIFwKKyAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKworY29uc3QgYmZkX3RhcmdldCBvc2ZfY29yZV92ZWMgPQorICB7CisgICAgIm9zZi1jb3JlIiwKKyAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLworICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KKyAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KKyAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KKworICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCisgICAgIG9zZl9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCisgICAgfSwKKyAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCisgICAgfSwKKyAgICAKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAob3NmX2NvcmUpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChvc2ZfY29yZSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLworfTsKZGlmZiAtLWdpdCBhL2JmZC9wYzUzMi1tYWNoLmMgYi9iZmQvcGM1MzItbWFjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjRhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcGM1MzItbWFjaC5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIE1hY2gzLzUzMiBhLm91dC1pc2ggYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBJYW4gRGFsbAorICogICAgICAgICAgICAxOS1BcHItOTQKKyAqCisgKiBGb3JtZXJseSBwYXJ0IG9mIGFvdXQtcGM1MzItbWFjaC5jLiBTcGxpdCBvdXQgdG8gYWxsb3cgbW9yZQorICogZmxleGliaWxpdHkgd2l0aCBtdWx0aXBsZSBmb3JtYXRzLgorICoKKyAqLworLyogVGhpcyBhcmNoaXRlY3R1cmUgaGFzIE5fVFhUT0ZGIGFuZCBOX1RYVEFERFIgZGVmaW5lZCBhcyBpZgorICogTl9IRUFERVJfSU5fVEVYVCwgYnV0IHRoZSBhX3RleHQgZW50cnkgKHRleHQgc2l6ZSkgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAqIHNwYWNlIGZvciB0aGUgaGVhZGVyLiBTbyB3ZSBoYXZlIE5fSEVBREVSX0lOX1RFWFQgZGVmaW5lZCB0bworICogMSBhbmQgc3BlY2lhbGx5IGRlZmluZSBvdXIgb3duIE5fVFhUU0laRQorICovCisKKyNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCisjZGVmaW5lIE5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKKworCisjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAweDEwMDAwICAgICAgIC8qIGZyb20gb2xkIGxkICovCisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHgxMDAwICAgICAgIC8qIGZyb20gb2xkIGxkLCAgMDMyICYgNTMyIGFyZSByZWFsbHkgNTEyLzRrICovCisKKy8qIFVzZSBhX2VudHJ5IG9mIDAgdG8gZGlzdGluZ3Vpc2ggb2JqZWN0IGZpbGVzIGZyb20gT01BR0lDIGV4ZWN1dGFibGVzICovCisjZGVmaW5lIE5fVFhUQUREUih4KSBcCisgIChOX01BR0lDKHgpID09IE9NQUdJQyA/IFwKKyAgICgoeCkuYV9lbnRyeSA8IFRFWFRfU1RBUlRfQUREUj8gMDogVEVYVF9TVEFSVF9BRERSKTogXAorICAgKE5fTUFHSUMoeCkgPT0gTk1BR0lDPyBURVhUX1NUQVJUX0FERFI6IFwKKyAgICBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUpKQorCisjZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCisKKyNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX25zMzJrCisgIAorI2RlZmluZSBNWShPUCkgQ0FUKHBjNTMybWFjaGFvdXRfLE9QKQorCisvKiBNdXN0IGJlIHRoZSBzYW1lIGFzIGFvdXQtbnMzMmsuYyAqLworI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhuczMya2FvdXQsXzMyXyx5KQorCisjZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXBjNTMyLW1hY2giCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKworLyogV2UgY2FuYHQgdXNlIHRoZSBNWU5TIG1hY3JvIGhlcmUgZm9yIGNwcCByZWFzb25zIHRvbyBzdWJ0bGUgZm9yIG1lIC0tIElXRCAqLworCisjZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBuczMya2FvdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCisKKy8qIGxpYmFvdXQgZG9lc24ndCB1c2UgTkFNRSBmb3IgdGhlc2UgLi4uICovCisKKyNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cworCisjZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKKworI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCisgICAgIAorI2RlZmluZSBNWU5TWChPUCkgQ0FUKG5zMzJrYW91dF8sT1ApCityZWxvY19ob3d0b190eXBlICoKK01ZTlNYKGJmZF9yZWxvY190eXBlX2xvb2t1cCkKKyAgUEFSQU1TKChiZmQgKmFiZmQgQU5ECisJICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworCitib29sZWFuCitNWU5TWCh3cml0ZV9vYmplY3RfY29udGVudHMpCisgIFBBUkFNUygoYmZkICphYmZkKSk7CisKK3N0YXRpYyBib29sZWFuCitNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQorYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisgIAorI2lmIENIT09TRV9SRUxPQ19TSVpFCisgIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOworI2Vsc2UKKyAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisjZW5kaWYKKyAgCisgIEJGRF9BU1NFUlQgKGJmZF9nZXRfYXJjaCAoYWJmZCkgPT0gYmZkX2FyY2hfbnMzMmspOworICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCisgICAgeworICAgIGNhc2UgMzIwMzI6CisgICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX05TMzIwMzIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjUzMjoKKyAgICBkZWZhdWx0OgorICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9OUzMyNTMyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7CisgIAorICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKKyAgCisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCisKKyNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLWFybS5jIGIvYmZkL3BlLWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTU4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcGUtYXJtLmMKQEAgLTAsMCArMSwzNCBAQAorLyogQkZEIGJhY2stZW5kIGZvciBBUk0gUEVDT0ZGIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisjaWZuZGVmIFRBUkdFVF9MSVRUTEVfU1lNCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybXBlX2xpdHRsZV92ZWMKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgInBlLWFybS1saXR0bGUiCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybXBlX2JpZ192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLWFybS1iaWciCisjZW5kaWYKKworI2RlZmluZSBDT0ZGX1dJVEhfUEUKKyNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgICAgdHJ1ZQorI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworCisjaW5jbHVkZSAiY29mZi1hcm0uYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1pMzg2LmMgYi9iZmQvcGUtaTM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGJlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcGUtaTM4Ni5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFQ09GRiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworCisjZGVmaW5lIFRBUkdFVF9TWU0gaTM4NnBlX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRSAicGUtaTM4NiIKKyNkZWZpbmUgQ09GRl9XSVRIX1BFCisjZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKKyNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCisjZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCisKKyNpbmNsdWRlICJjb2ZmLWkzODYuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZS1tY29yZS5jIGIvYmZkL3BlLW1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExOWY4MQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wZS1tY29yZS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisjaWZuZGVmIFRBUkdFVF9CSUdfU1lNCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlX2JpZ192ZWMKKyNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLW1jb3JlLWJpZyIKKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGUtbWNvcmUtbGl0dGxlIgorI2VuZGlmCisKKyNkZWZpbmUgQ09GRl9XSVRIX1BFCisjZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICAgIHRydWUKKyNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKKworI2RlZmluZSBNQ09SRV9QRQorCisjaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLXBwYy5jIGIvYmZkL3BlLXBwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmFjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcGUtcHBjLmMKQEAgLTAsMCArMSw0MSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFQ09GRiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKworI2RlZmluZSBFX0ZJTEVOTUxFTiAgICAgMTgKKworI2RlZmluZSBQUENfUEUKKworI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAicGUtcG93ZXJwY2xlIgorCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgYmZkX3Bvd2VycGNfcGVfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGUtcG93ZXJwYyIKKworI2RlZmluZSBDT0ZGX1dJVEhfUEUKKworI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworCisvKiBGSVhNRTogdmVyaWZ5IFBDUkVMT0ZGU0VUIGlzIGFsd2F5cyBmYWxzZSAqLworCisjaW5jbHVkZSAiY29mZi1wcGMuYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktYXJtLmMgYi9iZmQvcGVpLWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTViM2EKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcGVpLWFybS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgYXJtIFBFIElNQUdFIENPRkYgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKyNpZm5kZWYgVEFSR0VUX0xJVFRMRV9TWU0KKyNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gIGFybXBlaV9saXR0bGVfdmVjCisjZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAicGVpLWFybS1saXR0bGUiCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICBhcm1wZWlfYmlnX3ZlYworI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlaS1hcm0tYmlnIgorI2VuZGlmCisKKyNkZWZpbmUgSU1BR0VfQkFTRSAgICAgICAgIE5UX0lNQUdFX0JBU0UKKyNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCisjZGVmaW5lIENPRkZfV0lUSF9QRQorI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgdHJ1ZQorI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworCisjaW5jbHVkZSAiY29mZi1hcm0uYyIKZGlmZiAtLWdpdCBhL2JmZC9wZWktaTM4Ni5jIGIvYmZkL3BlaS1pMzg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1Mjk2OAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wZWktaTM4Ni5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgSW50ZWwgMzg2IFBFIElNQUdFIENPRkYgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKyNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVpX3ZlYworI2RlZmluZSBUQVJHRVRfTkFNRSAicGVpLWkzODYiCisjZGVmaW5lIElNQUdFX0JBU0UgTlRfSU1BR0VfQkFTRQorI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKKyNkZWZpbmUgQ09GRl9XSVRIX1BFCisjZGVmaW5lIFBDUkVMT0ZGU0VUIHRydWUKKyNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCisjZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCisKKyNpbmNsdWRlICJjb2ZmLWkzODYuYyIKKworCisKZGlmZiAtLWdpdCBhL2JmZC9wZWktbWNvcmUuYyBiL2JmZC9wZWktbWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGE4NzJjCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3BlaS1tY29yZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisjaWZuZGVmIFRBUkdFVF9CSUdfU1lNCisjZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlaV9iaWdfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJwZWktbWNvcmUtYmlnIgorI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGVpLW1jb3JlLWxpdHRsZSIKKyNlbmRpZgorCisjZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICBOVF9JTUFHRV9CQVNFCisjZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQorI2RlZmluZSBDT0ZGX1dJVEhfUEUKKyNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgIHRydWUKKyNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKKworI2RlZmluZSBNQ09SRV9QRQorCisjaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1wcGMuYyBiL2JmZC9wZWktcHBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5YmMwZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wZWktcHBjLmMKQEAgLTAsMCArMSw0NyBAQAorLyogQkZEIGJhY2stZW5kIGZvciBQb3dlclBDIFBFIElNQUdFIENPRkYgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisvKiBzZXR0aW5nIHVwIGZvciBhIFBFIGVudmlyb25tZW50IHN0b2xlbiBkaXJlY3RseSBmcm9tIHRoZSBpMzg2IHN0cnVjdHVyZSAqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKworI2RlZmluZSBQUENfUEUKKworI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYworI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlaS1wb3dlcnBjbGUiCisKKyNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICBiZmRfcG93ZXJwY19wZWlfdmVjCisjZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLXBvd2VycGMiCisKKyNkZWZpbmUgSU1BR0VfQkFTRSAgICAgICAgICBOVF9JTUFHRV9CQVNFCisKKyNkZWZpbmUgQ09GRl9JTUFHRV9XSVRIX1BFCisjZGVmaW5lIENPRkZfV0lUSF9QRQorCisjZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCisKKy8qIEZJWE1FOiBWZXJpZnkgUENSRUxPRkZTRVQgaXMgYWx3YXlzIGZhbHNlICovCisKKyNpbmNsdWRlICJjb2ZmLXBwYy5jIgorCisKKwpkaWZmIC0tZ2l0IGEvYmZkL3BlaWNvZGUuaCBiL2JmZC9wZWljb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkMTZlNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wZWljb2RlLmgKQEAgLTAsMCArMSwyMTQ0IEBACisvKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBtb3N0IENPRkYgdmFyaWFudHMsIGZvciBCRkQuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKK01vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAorCQkJc2FjQGN5Z251cy5jb20KKyovCisKKy8qIEhleSBsb29rLCBzb21lIGRvY3VtZW50YXRpb24gW2FuZCBpbiBhIHBsYWNlIHlvdSBleHBlY3QgdG8gZmluZCBpdF0hCisKKyAgIFRoZSBtYWluIHJlZmVyZW5jZSBmb3IgdGhlIHBlaSBmb3JtYXQgaXMgIk1pY3Jvc29mdCBQb3J0YWJsZSBFeGVjdXRhYmxlCisgICBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIDQuMSIuICBHZXQgaXQgaWYgeW91IG5lZWQgdG8KKyAgIGRvIHNvbWUgc2VyaW91cyBoYWNraW5nIG9uIHRoaXMgY29kZS4KKworICAgQW5vdGhlciByZWZlcmVuY2U6CisgICAiUGVlcmluZyBJbnNpZGUgdGhlIFBFOiBBIFRvdXIgb2YgdGhlIFdpbjMyIFBvcnRhYmxlIEV4ZWN1dGFibGUKKyAgIEZpbGUgRm9ybWF0IiwgTVNKIDE5OTQsIFZvbHVtZSA5LgorCisgICBUaGUgKnNvbGUqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGUgZm9ybWF0IGFuZCB0aGUgcGVpIGZvcm1hdCBpcyB0aGF0IHRoZQorICAgbGF0dGVyIGhhcyBhbiBNU0RPUyAyLjAgLmV4ZSBoZWFkZXIgb24gdGhlIGZyb250IHRoYXQgcHJpbnRzIHRoZSBtZXNzYWdlCisgICAiVGhpcyBhcHAgbXVzdCBiZSBydW4gdW5kZXIgV2luZG93cy4iIChvciBzb21lIHN1Y2gpLgorICAgKEZJWE1FOiBXaGV0aGVyIHRoYXQgc3RhdGVtZW50IGlzICpyZWFsbHkqIHRydWUgb3Igbm90IGlzIHVua25vd24uCisgICBBcmUgdGhlcmUgbW9yZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwZSBhbmQgcGVpIGZvcm1hdHM/CisgICBGb3Igbm93IGFzc3VtZSB0aGVyZSBhcmVuJ3QuICBJZiB5b3UgZmluZCBvbmUsIHRoZW4gZm9yIEdvZCBzYWtlcworICAgZG9jdW1lbnQgaXQgaGVyZSEpCisKKyAgIFRoZSBNaWNyb3NvZnQgZG9jcyB1c2UgdGhlIHdvcmQgImltYWdlIiBpbnN0ZWFkIG9mICJleGVjdXRhYmxlIiBiZWNhdXNlCisgICB0aGUgZm9ybWVyIGNhbiBhbHNvIHJlZmVyIHRvIGEgRExMIChzaGFyZWQgbGlicmFyeSkuICBDb25mdXNpb24gY2FuIGFyaXNlCisgICBiZWNhdXNlIHRoZSBgaScgaW4gYHBlaScgYWxzbyByZWZlcnMgdG8gImltYWdlIi4gIFRoZSBgcGUnIGZvcm1hdCBjYW4KKyAgIGFsc28gY3JlYXRlIGltYWdlcyAoaS5lLiBleGVjdXRhYmxlcyksIGl0J3MganVzdCB0aGF0IHRvIHJ1biBvbiBhIHdpbjMyCisgICBzeXN0ZW0geW91IG5lZWQgdG8gdXNlIHRoZSBwZWkgZm9ybWF0LgorCisgICBGSVhNRTogUGxlYXNlIGFkZCBtb3JlIGRvY3MgaGVyZSBzbyB0aGUgbmV4dCBwb29yIGZvb2wgdGhhdCBoYXMgdG8gaGFjaworICAgb24gdGhpcyBjb2RlIGhhcyBhIGNoYW5jZSBvZiBnZXR0aW5nIHNvbWV0aGluZyBhY2NvbXBsaXNoZWQgd2l0aG91dAorICAgd2FzdGluZyB0b28gbXVjaCB0aW1lLgorKi8KKworI2lmZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKK3N0YXRpYyBib29sZWFuICgqcGVfc2F2ZWRfY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSkKKyAgICAgUEFSQU1TICgoYmZkICosIFBUUikpCisgICAgID0gY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YTsKKyN1bmRlZiBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCisjZWxzZQorc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQorICAgICBQQVJBTVMgKChiZmQgKiwgUFRSKSkKKyAgICAgPSBOVUxMOworI2VuZGlmCisjZGVmaW5lIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorCisjZGVmaW5lIGNvZmZfbWtvYmplY3QgICAgICBwZV9ta29iamVjdAorI2RlZmluZSBjb2ZmX21rb2JqZWN0X2hvb2sgcGVfbWtvYmplY3RfaG9vaworCisjaWZuZGVmIEdFVF9GQ05fTE5OT1BUUgorI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSBcCisgICAgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCisjZW5kaWYKKworI2lmbmRlZiBHRVRfRkNOX0VORE5EWAorI2RlZmluZSBHRVRfRkNOX0VORE5EWChhYmZkLCBleHQpICBcCisJYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQorI2VuZGlmCisKKyNpZm5kZWYgUFVUX0ZDTl9MTk5PUFRSCisjZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQorI2VuZGlmCisjaWZuZGVmIFBVVF9GQ05fRU5ETkRYCisjZGVmaW5lIFBVVF9GQ05fRU5ETkRYKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCisjZW5kaWYKKyNpZm5kZWYgR0VUX0xOU1pfTE5OTworI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQorI2VuZGlmCisjaWZuZGVmIEdFVF9MTlNaX1NJWkUKKyNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKKyNlbmRpZgorI2lmbmRlZiBQVVRfTE5TWl9MTk5PCisjZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQorI2VuZGlmCisjaWZuZGVmIFBVVF9MTlNaX1NJWkUKKyNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCisjZW5kaWYKKyNpZm5kZWYgR0VUX1NDTl9TQ05MRU4KKyNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05fTlJFTE9DCisjZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsICBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05fTkxJTk5PCisjZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbmxpbm5vKQorI2VuZGlmCisjaWZuZGVmIFBVVF9TQ05fU0NOTEVOCisjZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOX05SRUxPQworI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOX05MSU5OTworI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMTYoYWJmZCxpbiwgKGJmZF9ieXRlICAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQorI2VuZGlmCisjaWZuZGVmIEdFVF9MSU5FTk9fTE5OTworI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2VuZGlmCisjaWZuZGVmIFBVVF9MSU5FTk9fTE5OTworI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2VuZGlmCisKKy8qIFRoZSBmX3N5bXB0ciBmaWVsZCBpbiB0aGUgZmlsZWhkciBpcyBzb21ldGltZXMgNjQgYml0cy4gICovCisjaWZuZGVmIEdFVF9GSUxFSERSX1NZTVBUUgorI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX0ZJTEVIRFJfU1lNUFRSCisjZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfMzIKKyNlbmRpZgorCisvKiBTb21lIGZpZWxkcyBpbiB0aGUgYW91dGhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLworI2lmbmRlZiBHRVRfQU9VVEhEUl9UU0laRQorI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9UU0laRQorI2RlZmluZSBQVVRfQU9VVEhEUl9UU0laRSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9EU0laRQorI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9EU0laRQorI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9CU0laRQorI2RlZmluZSBHRVRfQU9VVEhEUl9CU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9CU0laRQorI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9FTlRSWQorI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9FTlRSWQorI2RlZmluZSBQVVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9wdXRfMzIKKyNlbmRpZgorI2lmbmRlZiBHRVRfQU9VVEhEUl9URVhUX1NUQVJUCisjZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVAorI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQKKyNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUCisjZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzMyCisjZW5kaWYKKworLyogU29tZSBmaWVsZHMgaW4gdGhlIHNjbmhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLworI2lmbmRlZiBHRVRfU0NOSERSX1BBRERSCisjZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX1NDTkhEUl9QQUREUgorI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfVkFERFIKKyNkZWZpbmUgR0VUX1NDTkhEUl9WQUREUiBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOSERSX1ZBRERSCisjZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzMyCisjZW5kaWYKKyNpZm5kZWYgR0VUX1NDTkhEUl9TSVpFCisjZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfMzIKKyNlbmRpZgorI2lmbmRlZiBQVVRfU0NOSERSX1NJWkUKKyNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfU0NOUFRSCisjZGVmaW5lIEdFVF9TQ05IRFJfU0NOUFRSIGJmZF9oX2dldF8zMgorI2VuZGlmCisjaWZuZGVmIFBVVF9TQ05IRFJfU0NOUFRSCisjZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfUkVMUFRSCisjZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF8zMgorI2VuZGlmCisjaWZuZGVmIFBVVF9TQ05IRFJfUkVMUFRSCisjZGVmaW5lIFBVVF9TQ05IRFJfUkVMUFRSIGJmZF9oX3B1dF8zMgorI2VuZGlmCisjaWZuZGVmIEdFVF9TQ05IRFJfTE5OT1BUUgorI2RlZmluZSBHRVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfZ2V0XzMyCisjZW5kaWYKKyNpZm5kZWYgUFVUX1NDTkhEUl9MTk5PUFRSCisjZGVmaW5lIFBVVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9wdXRfMzIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfcmVsb2NfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIHZvaWQgY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hdXhfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb2ZmX3N3YXBfbGluZW5vX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfbGluZW5vX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGNvZmZfc3dhcF9hb3V0aGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIHZvaWQgYWRkX2RhdGFfZW50cnkKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICosIGludCwgY2hhciAqLCBiZmRfdm1hKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hb3V0aGRyX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGNvZmZfc3dhcF9zY25oZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9zY25oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfaWRhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfZWRhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcGRhdGEgUEFSQU1TICgoYmZkICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcmVsb2MgUEFSQU1TICgoYmZkICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gcGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBwZV9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIFBUUiBwZV9ta29iamVjdF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOworc3RhdGljIGJvb2xlYW4gcGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBzcmM7CisgICAgIFBUUiBkc3Q7Cit7CisgIFJFTE9DICpyZWxvY19zcmMgPSAoUkVMT0MgKikgc3JjOworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgZHN0OworCisgIHJlbG9jX2RzdC0+cl92YWRkciA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilyZWxvY19zcmMtPnJfdmFkZHIpOworICByZWxvY19kc3QtPnJfc3ltbmR4ID0gYmZkX2hfZ2V0X3NpZ25lZF8zMihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3N5bW5keCk7CisKKyAgcmVsb2NfZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl90eXBlKTsKKworI2lmZGVmIFNXQVBfSU5fUkVMT0NfT0ZGU0VUCisgIHJlbG9jX2RzdC0+cl9vZmZzZXQgPSBTV0FQX0lOX1JFTE9DX09GRlNFVChhYmZkLAorCQkJCQkgICAgIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfb2Zmc2V0KTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglzcmM7CisgICAgIFBUUglkc3Q7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2Nfc3JjID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKXNyYzsKKyAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpyZWxvY19kc3QgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopZHN0OworICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3ZhZGRyLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3ZhZGRyKTsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIHJlbG9jX3NyYy0+cl9zeW1uZHgsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfc3ltbmR4KTsKKworICBiZmRfaF9wdXRfMTYoYWJmZCwgcmVsb2Nfc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKQorCSAgICAgICByZWxvY19kc3QtPnJfdHlwZSk7CisKKyNpZmRlZiBTV0FQX09VVF9SRUxPQ19PRkZTRVQKKyAgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKGFiZmQsCisJCQlyZWxvY19zcmMtPnJfb2Zmc2V0LAorCQkJKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9vZmZzZXQpOworI2VuZGlmCisjaWZkZWYgU1dBUF9PVVRfUkVMT0NfRVhUUkEKKyAgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxyZWxvY19zcmMsIHJlbG9jX2RzdCk7CisjZW5kaWYKKyAgcmV0dXJuIFJFTFNaOworfQorCisKK3N0YXRpYyB2b2lkCitjb2ZmX3N3YXBfZmlsZWhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAgICAgICAgICAgICphYmZkOworICAgICBQVFIJICAgICBzcmM7CisgICAgIFBUUgkgICAgIGRzdDsKK3sKKyAgRklMSERSICpmaWxlaGRyX3NyYyA9IChGSUxIRFIgKikgc3JjOworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9kc3QgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZHN0OworICBmaWxlaGRyX2RzdC0+Zl9tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfbWFnaWMpOworICBmaWxlaGRyX2RzdC0+Zl9uc2NucyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnNjbnMpOworICBmaWxlaGRyX2RzdC0+Zl90aW1kYXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX3RpbWRhdCk7CisKKyAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX25zeW1zKTsKKyAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX2ZsYWdzKTsKKyAgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9zcmMtPmZfc3ltcHRyKTsKKworICAvKiBPdGhlciBwZW9wbGUncyB0b29scyBzb21ldGltZXMgZ2VuZXJhdGUgaGVhZGVycyB3aXRoIGFuIG5zeW1zIGJ1dAorICAgICBhIHplcm8gc3ltcHRyLiAgKi8KKyAgaWYgKGZpbGVoZHJfZHN0LT5mX25zeW1zICE9IDAgJiYgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID09IDApCisgICAgeworICAgICAgZmlsZWhkcl9kc3QtPmZfbnN5bXMgPSAwOworICAgICAgZmlsZWhkcl9kc3QtPmZfZmxhZ3MgfD0gRl9MU1lNUzsKKyAgICB9CisKKyAgZmlsZWhkcl9kc3QtPmZfb3B0aGRyID0gYmZkX2hfZ2V0XzE2KGFiZmQsIAorCQkJCSAgICAgICAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfb3B0aGRyKTsKK30KKworI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQorCitzdGF0aWMgIHVuc2lnbmVkIGludAorY29mZl9zd2FwX2ZpbGVoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglpbjsKKyAgICAgUFRSCW91dDsKK3sKKyAgaW50IGlkeDsKKyAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKilpbjsKKyAgRklMSERSICpmaWxlaGRyX291dCA9IChGSUxIRFIgKilvdXQ7CisKKyAgaWYgKHBlX2RhdGEgKGFiZmQpLT5oYXNfcmVsb2Nfc2VjdGlvbikKKyAgICBmaWxlaGRyX2luLT5mX2ZsYWdzICY9IH5GX1JFTEZMRzsKKworICBpZiAocGVfZGF0YSAoYWJmZCktPmRsbCkKKyAgICBmaWxlaGRyX2luLT5mX2ZsYWdzIHw9IEZfRExMOworCisgIGZpbGVoZHJfaW4tPnBlLmVfbWFnaWMgICAgPSBET1NNQUdJQzsKKyAgZmlsZWhkcl9pbi0+cGUuZV9jYmxwICAgICA9IDB4OTA7CisgIGZpbGVoZHJfaW4tPnBlLmVfY3AgICAgICAgPSAweDM7CisgIGZpbGVoZHJfaW4tPnBlLmVfY3JsYyAgICAgPSAweDA7CisgIGZpbGVoZHJfaW4tPnBlLmVfY3BhcmhkciAgPSAweDQ7CisgIGZpbGVoZHJfaW4tPnBlLmVfbWluYWxsb2MgPSAweDA7CisgIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MgPSAweGZmZmY7CisgIGZpbGVoZHJfaW4tPnBlLmVfc3MgICAgICAgPSAweDA7CisgIGZpbGVoZHJfaW4tPnBlLmVfc3AgICAgICAgPSAweGI4OworICBmaWxlaGRyX2luLT5wZS5lX2NzdW0gICAgID0gMHgwOworICBmaWxlaGRyX2luLT5wZS5lX2lwICAgICAgID0gMHgwOworICBmaWxlaGRyX2luLT5wZS5lX2NzICAgICAgID0gMHgwOworICBmaWxlaGRyX2luLT5wZS5lX2xmYXJsYyAgID0gMHg0MDsKKyAgZmlsZWhkcl9pbi0+cGUuZV9vdm5vICAgICA9IDB4MDsKKworICBmb3IgKGlkeD0wOyBpZHggPCA0OyBpZHgrKykKKyAgICBmaWxlaGRyX2luLT5wZS5lX3Jlc1tpZHhdID0gMHgwOworCisgIGZpbGVoZHJfaW4tPnBlLmVfb2VtaWQgICA9IDB4MDsKKyAgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvID0gMHgwOworCisgIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKKyAgICBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSA9IDB4MDsKKworICBmaWxlaGRyX2luLT5wZS5lX2xmYW5ldyA9IDB4ODA7CisKKyAgLyogdGhpcyBuZXh0IGNvbGxlY3Rpb24gb2YgZGF0YSBhcmUgbW9zdGx5IGp1c3QgY2hhcmFjdGVycy4gIEl0IGFwcGVhcnMKKyAgICAgdG8gYmUgY29uc3RhbnQgd2l0aGluIHRoZSBoZWFkZXJzIHB1dCBvbiBOVCBleGVzICovCisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzBdICA9IDB4MGViYTFmMGU7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzFdICA9IDB4Y2QwOWI0MDA7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzJdICA9IDB4NGMwMWI4MjE7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzNdICA9IDB4Njg1NDIxY2Q7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzRdICA9IDB4NzAyMDczNjk7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzVdICA9IDB4NzI2NzZmNzI7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzZdICA9IDB4NjMyMDZkNjE7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzddICA9IDB4NmY2ZTZlNjE7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzhdICA9IDB4NjU2MjIwNzQ7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzldICA9IDB4NmU3NTcyMjA7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEwXSA9IDB4MjA2ZTY5MjA7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzExXSA9IDB4MjA1MzRmNDQ7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEyXSA9IDB4NjU2NDZmNmQ7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzEzXSA9IDB4MGEwZDBkMmU7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzE0XSA9IDB4MjQ7CisgIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlWzE1XSA9IDB4MDsKKyAgZmlsZWhkcl9pbi0+cGUubnRfc2lnbmF0dXJlID0gTlRfU0lHTkFUVVJFOworCisKKworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7CisKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIHRpbWUgKDApLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKKyAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCisJCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOworICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7CisKKyAgLyogcHV0IGluIGV4dHJhIGRvcyBoZWFkZXIgc3R1ZmYuICBUaGlzIGRhdGEgcmVtYWlucyBlc3NlbnRpYWxseQorICAgICBjb25zdGFudCwgaXQganVzdCBoYXMgdG8gYmUgdGFja2VkIG9uIHRvIHRoZSBiZWdpbm5pbmcgb2YgYWxsIGV4ZXMgCisgICAgIGZvciBOVCAqLworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21hZ2ljKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY2JscCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NibHApOworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NwKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfY3JsYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NybGMpOworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcGFyaGRyLCAKKwkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NwYXJoZHIpOworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9taW5hbGxvYywgCisJICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9taW5hbGxvYyk7CisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21heGFsbG9jLCAKKwkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21heGFsbG9jKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcyk7CisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfc3ApOworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jc3VtLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3N1bSk7CisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2lwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfaXApOworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2NzKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbGZhcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbGZhcmxjKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfb3ZubywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX292bm8pOworICB7CisgICAgaW50IGlkeDsKKyAgICBmb3IgKGlkeD0wOyBpZHggPCA0OyBpZHgrKykKKyAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3Jlc1tpZHhdLCAKKwkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3Jlc1tpZHhdKTsKKyAgfQorICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vZW1pZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX29lbWlkKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfb2VtaW5mbywKKwkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX29lbWluZm8pOworICB7CisgICAgaW50IGlkeDsKKyAgICBmb3IgKGlkeD0wOyBpZHggPCAxMDsgaWR4KyspCisgICAgICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9yZXMyW2lkeF0sCisJCSAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9yZXMyW2lkeF0pOworICB9CisgIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2xmYW5ldywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX2xmYW5ldyk7CisKKyAgeworICAgIGludCBpZHg7CisgICAgZm9yIChpZHg9MDsgaWR4IDwgMTY7IGlkeCsrKQorICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLmRvc19tZXNzYWdlW2lkeF0sCisJCSAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZG9zX21lc3NhZ2VbaWR4XSk7CisgIH0KKworICAvKiBhbHNvIHB1dCBpbiB0aGUgTlQgc2lnbmF0dXJlICovCisgIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5wZS5udF9zaWduYXR1cmUsIAorCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPm50X3NpZ25hdHVyZSk7CisKKworCisKKyAgcmV0dXJuIEZJTEhTWjsKK30KKyNlbHNlCisKK3N0YXRpYyAgdW5zaWduZWQgaW50Citjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCisgICAgIGJmZCAgICAgICAqYWJmZDsKKyAgICAgUFRSCWluOworICAgICBQVFIJb3V0OworeworICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOworICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKKworICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9tYWdpYywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX21hZ2ljKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfbnNjbnMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc2Nucyk7CisgIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX3RpbWRhdCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RpbWRhdCk7CisgIFBVVF9GSUxFSERSX1NZTVBUUiAoYWJmZCwgKGJmZF92bWEpIGZpbGVoZHJfaW4tPmZfc3ltcHRyLAorCQkgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfc3ltcHRyKTsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfbnN5bXMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9uc3ltcyk7CisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX29wdGhkciwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX29wdGhkcik7CisgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX2ZsYWdzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfZmxhZ3MpOworCisgIHJldHVybiBGSUxIU1o7Cit9CisKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCitjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCisgICAgIGJmZCAgICAgICAgICAgICphYmZkOworICAgICBQVFIgZXh0MTsKKyAgICAgUFRSIGluMTsKK3sKKyAgU1lNRU5UICpleHQgPSAoU1lNRU5UICopZXh0MTsKKyAgc3RydWN0IGludGVybmFsX3N5bWVudCAgICAgICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW4xOworCisgIGlmKCBleHQtPmUuZV9uYW1lWzBdID09IDApIHsKKyAgICBpbi0+X24uX25fbi5fbl96ZXJvZXMgPSAwOworICAgIGluLT5fbi5fbl9uLl9uX29mZnNldCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV9vZmZzZXQpOworICB9CisgIGVsc2UgeworI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KKyAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOworI2Vsc2UKKyAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKKyNlbmRpZgorICB9CisKKyAgaW4tPm5fdmFsdWUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7IAorICBpbi0+bl9zY251bSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKKyAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMil7CisgICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOworICB9CisgIGVsc2UgeworICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKKyAgfQorICBpbi0+bl9zY2xhc3MgPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfc2NsYXNzKTsKKyAgaW4tPm5fbnVtYXV4ID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX251bWF1eCk7CisKKyAgLyogVGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIC5pZGF0YSQgc2VjdGlvbnMgaGF2ZSBjbGFzcyAweDY4CisgICAgIChDX1NFQ1RJT04pLCB3aGljaCBNUyBkb2N1bWVudGF0aW9uIGluZGljYXRlcyBpcyBhIHNlY3Rpb24KKyAgICAgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSwgdGhlIHZhbHVlIGZpZWxkIGluIHRoZSBzeW1ib2wgaXMgc2ltcGx5IGEKKyAgICAgY29weSBvZiB0aGUgLmlkYXRhIHNlY3Rpb24ncyBmbGFncyByYXRoZXIgdGhhbiBzb21ldGhpbmcgdXNlZnVsLgorICAgICBXaGVuIHRoZXNlIHN5bWJvbHMgYXJlIGVuY291bnRlcmVkLCBjaGFuZ2UgdGhlIHZhbHVlIHRvIDAgc28gdGhhdAorICAgICB0aGV5IHdpbGwgYmUgaGFuZGxlZCBzb21ld2hhdCBjb3JyZWN0bHkgaW4gdGhlIGJmZCBjb2RlLiAgKi8KKyAgaWYgKGluLT5uX3NjbGFzcyA9PSBDX1NFQ1RJT04pCisgICAgeworICAgICAgaW4tPm5fdmFsdWUgPSAweDA7CisKKyAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNsZWFybHkgd3JvbmcuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBiZSB0aGF0CisgICAgICAgICB1bmRlZmluZWQgQ19TRUNUSU9OIHN5bWJvbHMgYXBwZWFyIGluIHRoZSBmaXJzdCBvYmplY3Qgb2YgYQorICAgICAgICAgTVMgZ2VuZXJhdGVkIC5saWIgZmlsZSwgYW5kIHRoZSBzeW1ib2xzIGFyZSBub3QgZGVmaW5lZAorICAgICAgICAgYW55d2hlcmUuICAqLworICAgICAgaW4tPm5fc2NudW0gPSAxOworCisgICAgICAvKiBJIGhhdmUgdHJpZWQgc2V0dGluZyB0aGUgY2xhc3MgdG8gMyBhbmQgdXNpbmcgdGhlIGZvbGxvd2luZworCSB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyLiAgVGhpcyB3aWxsIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUKKwkgcG9pbnRlciB0byB0aGUgc3RyaW5nIGtlcm5lbDMyLmRsbCBhdCBhZGRyZXNzZXMgMCBhbmQgMHgxMAorCSBvZmYgc3RhcnQgb2YgaWRhdGEgc2VjdGlvbiB3aGljaCBpcyBub3QgY29ycmVjdCAqLworICAgICAgLyogICAgaWYgKHN0cmNtcCAoaW4tPl9uLl9uX25hbWUsICIuaWRhdGEkNCIpID09IDApICovCisgICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMzsgKi8KKyAgICAgIC8qICAgIGVsc2UgKi8KKyAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAyOyAqLworICAgIH0KKworI2lmZGVmIGNvZmZfc3dhcF9zeW1faW5faG9vaworICBjb2ZmX3N3YXBfc3ltX2luX2hvb2soYWJmZCwgZXh0MSwgaW4xKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citjb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgaW5wLCBleHRwKQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglpbnA7CisgICAgIFBUUglleHRwOworeworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW5wOworICBTWU1FTlQgKmV4dCA9KFNZTUVOVCAqKWV4dHA7CisgIGlmKGluLT5fbi5fbl9uYW1lWzBdID09IDApIHsKKyAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfemVyb2VzKTsKKyAgICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPl9uLl9uX24uX25fb2Zmc2V0LCAoYmZkX2J5dGUgKikgIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKKyAgfQorICBlbHNlIHsKKyNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCisgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIFNZTU5NTEVOITsKKyNlbHNlCisgICAgbWVtY3B5KGV4dC0+ZS5lX25hbWUsIGluLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7CisjZW5kaWYKKyAgfQorCisgIGJmZF9oX3B1dF8zMihhYmZkLCAgaW4tPm5fdmFsdWUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsKKyAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl9zY251bSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOworICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKQorICAgIHsKKyAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fdHlwZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKKyAgICB9CisgIGJmZF9oX3B1dF84KGFiZmQsICBpbi0+bl9zY2xhc3MgLCBleHQtPmVfc2NsYXNzKTsKKyAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX251bWF1eCAsIGV4dC0+ZV9udW1hdXgpOworCisgIHJldHVybiBTWU1FU1o7Cit9CisKK3N0YXRpYyB2b2lkCitjb2ZmX3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCisgICAgIGJmZCAgICAgICAgICAgICphYmZkOworICAgICBQVFIgCSAgICAgIGV4dDE7CisgICAgIGludCAgICAgICAgICAgICB0eXBlOworICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7CisgICAgIGludAkgICAgICBpbmR4OworICAgICBpbnQJICAgICAgbnVtYXV4OworICAgICBQVFIgCSAgICAgIGluMTsKK3sKKyAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7CisKKyAgc3dpdGNoIChjbGFzcykgeworICBjYXNlIENfRklMRToKKyAgICBpZiAoZXh0LT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7CisgICAgICBpbi0+eF9maWxlLnhfbi54X3plcm9lcyA9IDA7CisgICAgICBpbi0+eF9maWxlLnhfbi54X29mZnNldCA9IAorCWJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworI2lmIEZJTE5NTEVOICE9IEVfRklMTk1MRU4KKyAgICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7CisjZWxzZQorICAgICAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm47CisKKworICBjYXNlIENfU1RBVDoKKyNpZmRlZiBDX0xFQUZTVEFUCisgIGNhc2UgQ19MRUFGU1RBVDoKKyNlbmRpZgorICBjYXNlIENfSElEREVOOgorICAgIGlmICh0eXBlID09IFRfTlVMTCkgeworICAgICAgaW4tPnhfc2NuLnhfc2NubGVuID0gR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KTsKKyAgICAgIGluLT54X3Njbi54X25yZWxvYyA9IEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCk7CisgICAgICBpbi0+eF9zY24ueF9ubGlubm8gPSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpOworICAgICAgaW4tPnhfc2NuLnhfY2hlY2tzdW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsCisJCQkJCSAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY2hlY2tzdW0pOworICAgICAgaW4tPnhfc2NuLnhfYXNzb2NpYXRlZCA9CisJYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2Fzc29jaWF0ZWQpOworICAgICAgaW4tPnhfc2NuLnhfY29tZGF0ID0gYmZkX2hfZ2V0XzggKGFiZmQsCisJCQkJCShiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY29tZGF0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBpbi0+eF9zeW0ueF90YWduZHgubCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7CisjaWZuZGVmIE5PX1RWTkRYCisgIGluLT54X3N5bS54X3R2bmR4ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOworI2VuZGlmCisKKyAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCisgICAgeworICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IEdFVF9GQ05fTE5OT1BUUiAoYWJmZCwgZXh0KTsKKyAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gR0VUX0ZDTl9FTkRORFggKGFiZmQsIGV4dCk7CisgICAgfQorICBlbHNlCisgICAgeworI2lmIERJTU5VTSAhPSBFX0RJTU5VTQorICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KKyNlbmRpZgorICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0gPQorCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7CisgICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSA9CisJYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKKyAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdID0KKwliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOworICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10gPQorCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7CisgICAgfQorCisgIGlmIChJU0ZDTih0eXBlKSkgeworICAgIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7CisgIH0KKyAgZWxzZSB7CisgICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vID0gR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpOworICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSA9IEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citjb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQorICAgICBiZmQgICAqYWJmZDsKKyAgICAgUFRSIAlpbnA7CisgICAgIGludCAgIHR5cGU7CisgICAgIGludCAgIGNsYXNzOworICAgICBpbnQgICBpbmR4OworICAgICBpbnQgICBudW1hdXg7CisgICAgIFBUUglleHRwOworeworICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWlucDsKKyAgQVVYRU5UICpleHQgPSAoQVVYRU5UICopZXh0cDsKKworICBtZW1zZXQoKFBUUilleHQsIDAsIEFVWEVTWik7CisgIHN3aXRjaCAoY2xhc3MpIHsKKyAgY2FzZSBDX0ZJTEU6CisgICAgaWYgKGluLT54X2ZpbGUueF9mbmFtZVswXSA9PSAwKSB7CisgICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X3plcm9lcyk7CisgICAgICBiZmRfaF9wdXRfMzIoYWJmZCwKKwkgICAgICBpbi0+eF9maWxlLnhfbi54X29mZnNldCwKKwkgICAgICAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfb2Zmc2V0KTsKKyAgICB9CisgICAgZWxzZSB7CisjaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgorICAgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKKyNlbHNlCisgICAgICBtZW1jcHkgKGV4dC0+eF9maWxlLnhfZm5hbWUsIGluLT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBBVVhFU1o7CisKKworICBjYXNlIENfU1RBVDoKKyNpZmRlZiBDX0xFQUZTVEFUCisgIGNhc2UgQ19MRUFGU1RBVDoKKyNlbmRpZgorICBjYXNlIENfSElEREVOOgorICAgIGlmICh0eXBlID09IFRfTlVMTCkgeworICAgICAgUFVUX1NDTl9TQ05MRU4oYWJmZCwgaW4tPnhfc2NuLnhfc2NubGVuLCBleHQpOworICAgICAgUFVUX1NDTl9OUkVMT0MoYWJmZCwgaW4tPnhfc2NuLnhfbnJlbG9jLCBleHQpOworICAgICAgUFVUX1NDTl9OTElOTk8oYWJmZCwgaW4tPnhfc2NuLnhfbmxpbm5vLCBleHQpOworICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+eF9zY24ueF9jaGVja3N1bSwKKwkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY2hlY2tzdW0pOworICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zY24ueF9hc3NvY2lhdGVkLAorCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9hc3NvY2lhdGVkKTsKKyAgICAgIGJmZF9oX3B1dF84IChhYmZkLCBpbi0+eF9zY24ueF9jb21kYXQsCisJCSAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfY29tZGF0KTsKKyAgICAgIHJldHVybiBBVVhFU1o7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT54X3N5bS54X3RhZ25keC5sLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7CisjaWZuZGVmIE5PX1RWTkRYCisgIGJmZF9oX3B1dF8xNihhYmZkLCBpbi0+eF9zeW0ueF90dm5keCAsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOworI2VuZGlmCisKKyAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCisgICAgeworICAgICAgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyLCBleHQpOworICAgICAgUFVUX0ZDTl9FTkRORFgoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sLCBleHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZiBESU1OVU0gIT0gRV9ESU1OVU0KKyAjZXJyb3Igd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRElNTlVNCisjZW5kaWYKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdKTsKKyAgICAgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10sCisJCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKKyAgICB9CisKKyAgaWYgKElTRkNOICh0eXBlKSkKKyAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSwKKwkgICAgIChiZmRfYnl0ZSAqKSAgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7CisgIGVsc2UKKyAgICB7CisgICAgICBQVVRfTE5TWl9MTk5PIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8sIGV4dCk7CisgICAgICBQVVRfTE5TWl9TSVpFIChhYmZkLCBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsIGV4dCk7CisgICAgfQorCisgIHJldHVybiBBVVhFU1o7Cit9CisKKworc3RhdGljIHZvaWQKK2NvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIGV4dDEsIGluMSkKKyAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7CisgICAgIFBUUiBleHQxOworICAgICBQVFIgaW4xOworeworICBMSU5FTk8gKmV4dCA9IChMSU5FTk8gKilleHQxOworICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbjE7CisKKyAgaW4tPmxfYWRkci5sX3N5bW5keCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5sX2FkZHIubF9zeW1uZHgpOworICBpbi0+bF9sbm5vID0gR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCBpbnAsIG91dHApCisgICAgIGJmZCAgICAgICAqYWJmZDsKKyAgICAgUFRSCWlucDsKKyAgICAgUFRSCW91dHA7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbnA7CisgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmV4dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICopb3V0cDsKKyAgYmZkX2hfcHV0XzMyKGFiZmQsIGluLT5sX2FkZHIubF9zeW1uZHgsIChiZmRfYnl0ZSAqKQorCSAgZXh0LT5sX2FkZHIubF9zeW1uZHgpOworCisgIFBVVF9MSU5FTk9fTE5OTyAoYWJmZCwgaW4tPmxfbG5ubywgZXh0KTsKKyAgcmV0dXJuIExJTkVTWjsKK30KKworCisKK3N0YXRpYyB2b2lkCitjb2ZmX3N3YXBfYW91dGhkcl9pbiAoYWJmZCwgYW91dGhkcl9leHQxLCBhb3V0aGRyX2ludDEpCisgICAgIGJmZCAgICAgICAgICAgICphYmZkOworICAgICBQVFIgYW91dGhkcl9leHQxOworICAgICBQVFIgYW91dGhkcl9pbnQxOworeworICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYTsKKyAgUEVBT1VUSERSICpzcmMgPSAoUEVBT1VUSERSICopKGFvdXRoZHJfZXh0MSk7CisgIEFPVVRIRFIgICAgICAgICphb3V0aGRyX2V4dCA9IChBT1VUSERSICopIGFvdXRoZHJfZXh0MTsKKyAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkcl9pbnQxOworCisgIGFvdXRoZHJfaW50LT5tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm1hZ2ljKTsKKyAgYW91dGhkcl9pbnQtPnZzdGFtcCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZzdGFtcCk7CisgIGFvdXRoZHJfaW50LT50c2l6ZSA9CisgICAgR0VUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dHNpemUpOworICBhb3V0aGRyX2ludC0+ZHNpemUgPQorICAgIEdFVF9BT1VUSERSX0RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRzaXplKTsKKyAgYW91dGhkcl9pbnQtPmJzaXplID0KKyAgICBHRVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5ic2l6ZSk7CisgIGFvdXRoZHJfaW50LT5lbnRyeSA9CisgICAgR0VUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZW50cnkpOworICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCA9CisgICAgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50ZXh0X3N0YXJ0KTsKKyAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgPQorICAgIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZGF0YV9zdGFydCk7CisKKyAgYSA9ICZhb3V0aGRyX2ludC0+cGU7CisgIGEtPkltYWdlQmFzZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+SW1hZ2VCYXNlKTsKKyAgYS0+U2VjdGlvbkFsaWdubWVudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2VjdGlvbkFsaWdubWVudCk7CisgIGEtPkZpbGVBbGlnbm1lbnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkZpbGVBbGlnbm1lbnQpOworICBhLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSAKKyAgICBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7CisgIGEtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IAorICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKKyAgYS0+TWFqb3JJbWFnZVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1ham9ySW1hZ2VWZXJzaW9uKTsKKyAgYS0+TWlub3JJbWFnZVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1pbm9ySW1hZ2VWZXJzaW9uKTsKKyAgYS0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOworICBhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7CisgIGEtPlJlc2VydmVkMSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+UmVzZXJ2ZWQxKTsKKyAgYS0+U2l6ZU9mSW1hZ2UgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZkltYWdlKTsKKyAgYS0+U2l6ZU9mSGVhZGVycyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSGVhZGVycyk7CisgIGEtPkNoZWNrU3VtID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5DaGVja1N1bSk7CisgIGEtPlN1YnN5c3RlbSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U3Vic3lzdGVtKTsKKyAgYS0+RGxsQ2hhcmFjdGVyaXN0aWNzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOworICBhLT5TaXplT2ZTdGFja1Jlc2VydmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZlN0YWNrUmVzZXJ2ZSk7CisgIGEtPlNpemVPZlN0YWNrQ29tbWl0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TaXplT2ZTdGFja0NvbW1pdCk7CisgIGEtPlNpemVPZkhlYXBSZXNlcnZlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TaXplT2ZIZWFwUmVzZXJ2ZSk7CisgIGEtPlNpemVPZkhlYXBDb21taXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZkhlYXBDb21taXQpOworICBhLT5Mb2FkZXJGbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TG9hZGVyRmxhZ3MpOworICBhLT5OdW1iZXJPZlJ2YUFuZFNpemVzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5OdW1iZXJPZlJ2YUFuZFNpemVzKTsKKworICB7CisgICAgaW50IGlkeDsKKyAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCisgICAgICB7CisJYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzID0KKwkgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RGF0YURpcmVjdG9yeVtpZHhdWzBdKTsKKwlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSA9CisJICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkRhdGFEaXJlY3RvcnlbaWR4XVsxXSk7CisgICAgICB9CisgIH0KKworICBpZiAoYW91dGhkcl9pbnQtPmVudHJ5KQorICAgIHsKKyAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSArPSBhLT5JbWFnZUJhc2U7CisgICAgICBhb3V0aGRyX2ludC0+ZW50cnkgJj0gMHhmZmZmZmZmZjsKKyAgICB9CisgIGlmIChhb3V0aGRyX2ludC0+dHNpemUpIAorICAgIHsKKyAgICAgIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKKyAgICAgIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ICY9IDB4ZmZmZmZmZmY7CisgICAgfQorICBpZiAoYW91dGhkcl9pbnQtPmRzaXplKSAKKyAgICB7CisgICAgICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCArPSBhLT5JbWFnZUJhc2U7CisgICAgICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCAmPSAweGZmZmZmZmZmOworICAgIH0KKworI2lmZGVmIFBPV0VSUENfTEVfUEUKKyAgLyogVGhlc2UgdGhyZWUgZmllbGRzIGFyZSBub3JtYWxseSBzZXQgdXAgYnkgcHBjX3JlbG9jYXRlX3NlY3Rpb24uCisgICAgIEluIHRoZSBjYXNlIG9mIHJlYWRpbmcgYSBmaWxlIGluLCB3ZSBjYW4gcGljayB0aGVtIHVwIGZyb20KKyAgICAgdGhlIERhdGFEaXJlY3RvcnkuCisgICovCisgIGZpcnN0X3RodW5rX2FkZHJlc3MgPSBhLT5EYXRhRGlyZWN0b3J5WzEyXS5WaXJ0dWFsQWRkcmVzcyA7CisgIHRodW5rX3NpemUgPSBhLT5EYXRhRGlyZWN0b3J5WzEyXS5TaXplOworICBpbXBvcnRfdGFibGVfc2l6ZSA9IGEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBhb3V0LCBpZHgsIG5hbWUsIGJhc2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmFvdXQ7CisgICAgIGludCBpZHg7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGJmZF92bWEgYmFzZTsKK3sKKyAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKKworICAvKiBhZGQgaW1wb3J0IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpZiBpdCBleGlzdHMgKi8KKyAgaWYgKChzZWMgIT0gTlVMTCkKKyAgICAgICYmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKQorICAgICAgJiYgKHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgIT0gTlVMTCkpCisgICAgeworICAgICAgYW91dC0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzID0gKHNlYy0+dm1hIC0gYmFzZSkgJiAweGZmZmZmZmZmOworICAgICAgYW91dC0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUgPSBwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT52aXJ0X3NpemU7CisgICAgICBzZWMtPmZsYWdzIHw9IFNFQ19EQVRBOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCBpbiwgb3V0KQorICAgICBiZmQgICAgICAgKmFiZmQ7CisgICAgIFBUUglpbjsKKyAgICAgUFRSCW91dDsKK3sKKyAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilpbjsKKyAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmV4dHJhID0gJnBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHI7CisgIFBFQU9VVEhEUiAqYW91dGhkcl9vdXQgPSAoUEVBT1VUSERSICopb3V0OworCisgIGJmZF92bWEgc2EgPSBleHRyYS0+U2VjdGlvbkFsaWdubWVudDsKKyAgYmZkX3ZtYSBmYSA9IGV4dHJhLT5GaWxlQWxpZ25tZW50OworICBiZmRfdm1hIGliID0gZXh0cmEtPkltYWdlQmFzZSA7CisKKyAgaWYgKGFvdXRoZHJfaW4tPnRzaXplKSAKKyAgICB7CisgICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0IC09IGliOworICAgICAgYW91dGhkcl9pbi0+dGV4dF9zdGFydCAmPSAweGZmZmZmZmZmOworICAgIH0KKyAgaWYgKGFvdXRoZHJfaW4tPmRzaXplKSAKKyAgICB7CisgICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0IC09IGliOworICAgICAgYW91dGhkcl9pbi0+ZGF0YV9zdGFydCAmPSAweGZmZmZmZmZmOworICAgIH0KKyAgaWYgKGFvdXRoZHJfaW4tPmVudHJ5KSAKKyAgICB7CisgICAgICBhb3V0aGRyX2luLT5lbnRyeSAtPSBpYjsKKyAgICAgIGFvdXRoZHJfaW4tPmVudHJ5ICY9IDB4ZmZmZmZmZmY7CisgICAgfQorCisjZGVmaW5lIEZBKHgpICAoKCh4KSArIGZhIC0xICkgJiAoLSBmYSkpCisjZGVmaW5lIFNBKHgpICAoKCh4KSArIHNhIC0xICkgJiAoLSBzYSkpCisKKyAgLyogV2UgbGlrZSB0byBoYXZlIHRoZSBzaXplcyBhbGlnbmVkICovCisKKyAgYW91dGhkcl9pbi0+YnNpemUgPSBGQSAoYW91dGhkcl9pbi0+YnNpemUpOworCisKKyAgZXh0cmEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUzsKKworICAvKiBmaXJzdCBudWxsIG91dCBhbGwgZGF0YSBkaXJlY3RvcnkgZW50cmllcyAuLiAqLworICBtZW1zZXQgKGV4dHJhLT5EYXRhRGlyZWN0b3J5LCBzaXplb2YgKGV4dHJhLT5EYXRhRGlyZWN0b3J5KSwgMCk7CisKKyAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAwLCAiLmVkYXRhIiwgaWIpOworICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDEsICIuaWRhdGEiLCBpYik7CisgIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMiwgIi5yc3JjIiAsaWIpOworCisjaWZkZWYgUE9XRVJQQ19MRV9QRQorICAvKiBGSVhNRTogZG8gb3RoZXIgUEUgcGxhdGZvcm1zIHVzZSB0aGlzPyAqLworICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDMsICIucGRhdGEiICxpYik7CisjZW5kaWYKKworICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDUsICIucmVsb2MiLCBpYik7CisKKyNpZmRlZiBQT1dFUlBDX0xFX1BFCisgIC8qIE9uIHRoZSBQUEMgTlQgc3lzdGVtLCB0aGlzIGZpZWxkIGlzIHNldCB1cCBhcyBmb2xsb3dzLiBJdCBpcworICAgICBub3QgYW4gIm9mZmljaWFsbHkiIHJlc2VydmVkIGZpZWxkLCBzbyBpdCBjdXJyZW50bHkgaGFzIG5vIHRpdGxlLgorICAgICBmaXJzdF90aHVua19hZGRyZXNzIGlzIGlkYXRhJDUsIGFuZCB0aGUgdGh1bmtfc2l6ZSBpcyB0aGUgc2l6ZQorICAgICBvZiB0aGUgaWRhdGEkNSBjaHVuayBvZiB0aGUgaWRhdGEgc2VjdGlvbi4KKyAgKi8KKyAgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzID0gZmlyc3RfdGh1bmtfYWRkcmVzczsKKyAgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMTJdLlNpemUgPSB0aHVua19zaXplOworCisgIC8qIE9uIHRoZSBQUEMgTlQgc3lzdGVtLCB0aGUgc2l6ZSBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGlzIG5vdCB0aGUKKyAgICAgc2l6ZSBvZiB0aGUgZW50aXJlIHNlY3Rpb24uIEl0J3MgYWN0dWFsbHkgb2Zmc2V0IHRvIHRoZSBlbmQgb2YgCisgICAgIHRoZSBpZGF0YSQzIGNvbXBvbmVudCBvZiB0aGUgaWRhdGEgc2VjdGlvbi4gVGhpcyBpcyB0aGUgc2l6ZSBvZgorICAgICB0aGUgZW50aXJlIGltcG9ydCB0YWJsZS4gKGFsc28ga25vd24gYXMgdGhlIHN0YXJ0IG9mIGlkYXRhJDQpCisgICovCisgIGV4dHJhLT5EYXRhRGlyZWN0b3J5WzFdLlNpemUgPSBpbXBvcnRfdGFibGVfc2l6ZTsKKyNlbmRpZgorCisgIHsKKyAgICBhc2VjdGlvbiAqc2VjOworICAgIGJmZF92bWEgZHNpemU9IDA7CisgICAgYmZkX3ZtYSBpc2l6ZSA9IFNBKGFiZmQtPnNlY3Rpb25zLT5maWxlcG9zKTsKKyAgICBiZmRfdm1hIHRzaXplPSAwOworCisgICAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCisgICAgICB7CisJaW50IHJvdW5kZWQgPSBGQShzZWMtPl9yYXdfc2l6ZSk7CisKKwlpZiAoc2VjLT5mbGFncyAmIFNFQ19EQVRBKSAKKwkgIGRzaXplICs9IHJvdW5kZWQ7CisJaWYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkKKwkgIHRzaXplICs9IHJvdW5kZWQ7CisJaXNpemUgKz0gU0Eocm91bmRlZCk7CisgICAgICB9CisKKyAgICBhb3V0aGRyX2luLT5kc2l6ZSA9IGRzaXplOworICAgIGFvdXRoZHJfaW4tPnRzaXplID0gdHNpemU7CisgICAgZXh0cmEtPlNpemVPZkltYWdlID0gaXNpemU7CisgIH0KKworICBleHRyYS0+U2l6ZU9mSGVhZGVycyA9IGFiZmQtPnNlY3Rpb25zLT5maWxlcG9zOworICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dGhkcl9pbi0+bWFnaWMsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQubWFnaWMpOworCisjaWZkZWYgUE9XRVJQQ19MRV9QRQorICAvKiB0aGlzIGxpdHRsZSBwaWVjZSBvZiBtYWdpYyBzZXRzIHRoZSAibGlua2VyIHZlcnNpb24iIGZpZWxkIHRvIDIuNjAgKi8KKyAgYmZkX2hfcHV0XzE2KGFiZmQsIDIgICsgNjAgKiAyNTYsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudnN0YW1wKTsKKyNlbHNlCisgIC8qIHRoaXMgbGl0dGxlIHBpZWNlIG9mIG1hZ2ljIHNldHMgdGhlICJsaW5rZXIgdmVyc2lvbiIgZmllbGQgdG8gMi41NSAqLworICBiZmRfaF9wdXRfMTYoYWJmZCwgMiAgKyA1NSAqIDI1NiwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC52c3RhbXApOworI2VuZGlmCisKKyAgUFVUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPnRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRzaXplKTsKKyAgUFVUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmRzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmRzaXplKTsKKyAgUFVUX0FPVVRIRFJfQlNJWkUgKGFiZmQsIGFvdXRoZHJfaW4tPmJzaXplLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmJzaXplKTsKKyAgUFVUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIGFvdXRoZHJfaW4tPmVudHJ5LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmVudHJ5KTsKKyAgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgYW91dGhkcl9pbi0+dGV4dF9zdGFydCwKKwkJCSAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC50ZXh0X3N0YXJ0KTsKKworICBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0LAorCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLmRhdGFfc3RhcnQpOworCisKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+SW1hZ2VCYXNlLCAKKwkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5JbWFnZUJhc2UpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50LAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNlY3Rpb25BbGlnbm1lbnQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5GaWxlQWxpZ25tZW50LAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkZpbGVBbGlnbm1lbnQpOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbik7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9ySW1hZ2VWZXJzaW9uLAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1ham9ySW1hZ2VWZXJzaW9uKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWlub3JJbWFnZVZlcnNpb24sCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JJbWFnZVZlcnNpb24pOworICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NYWpvclN1YnN5c3RlbVZlcnNpb24sCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JTdWJzeXN0ZW1WZXJzaW9uKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uLAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbik7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlJlc2VydmVkMSwKKwkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5SZXNlcnZlZDEpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZJbWFnZSwKKwkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZJbWFnZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYWRlcnMsCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSGVhZGVycyk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkNoZWNrU3VtLAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkNoZWNrU3VtKTsKKyAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+U3Vic3lzdGVtLAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlN1YnN5c3RlbSk7CisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPkRsbENoYXJhY3RlcmlzdGljcywKKwkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5EbGxDaGFyYWN0ZXJpc3RpY3MpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja1Jlc2VydmUsCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mU3RhY2tDb21taXQsCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mU3RhY2tDb21taXQpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZIZWFwUmVzZXJ2ZSwKKwkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwUmVzZXJ2ZSk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBDb21taXQsCisJCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2l6ZU9mSGVhcENvbW1pdCk7CisgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkxvYWRlckZsYWdzLAorCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkxvYWRlckZsYWdzKTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TnVtYmVyT2ZSdmFBbmRTaXplcywKKwkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5OdW1iZXJPZlJ2YUFuZFNpemVzKTsKKyAgeworICAgIGludCBpZHg7CisgICAgZm9yIChpZHg9MDsgaWR4IDwgMTY7IGlkeCsrKQorICAgICAgeworCWJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkRhdGFEaXJlY3RvcnlbaWR4XS5WaXJ0dWFsQWRkcmVzcywKKwkJICAgICAgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF1bMF0pOworCWJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplLAorCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVsxXSk7CisgICAgICB9CisgIH0KKworICByZXR1cm4gQU9VVFNaOworfQorCitzdGF0aWMgdm9pZAorICAgIGNvZmZfc3dhcF9zY25oZHJfaW4gKGFiZmQsIGV4dCwgaW4pCisgICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKKyAgUFRSCSAgICAgZXh0OworICBQVFIJICAgICBpbjsKK3sKKyAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKSBleHQ7CisgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKKworICBtZW1jcHkoc2NuaGRyX2ludC0+c19uYW1lLCBzY25oZHJfZXh0LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKKyAgc2NuaGRyX2ludC0+c192YWRkciA9CisgICAgR0VUX1NDTkhEUl9WQUREUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfdmFkZHIpOworICBzY25oZHJfaW50LT5zX3BhZGRyID0KKyAgICBHRVRfU0NOSERSX1BBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7CisgIHNjbmhkcl9pbnQtPnNfc2l6ZSA9CisgICAgR0VUX1NDTkhEUl9TSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKKyAgc2NuaGRyX2ludC0+c19zY25wdHIgPQorICAgIEdFVF9TQ05IRFJfU0NOUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOworICBzY25oZHJfaW50LT5zX3JlbHB0ciA9CisgICAgR0VUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7CisgIHNjbmhkcl9pbnQtPnNfbG5ub3B0ciA9CisgICAgR0VUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKKyAgc2NuaGRyX2ludC0+c19mbGFncyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19mbGFncyk7CisKKyAgc2NuaGRyX2ludC0+c19ucmVsb2MgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKKyAgc2NuaGRyX2ludC0+c19ubG5ubyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ubG5ubyk7CisKKyAgaWYgKHNjbmhkcl9pbnQtPnNfdmFkZHIgIT0gMCkgCisgICAgeworICAgICAgc2NuaGRyX2ludC0+c192YWRkciArPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKKyAgICAgIHNjbmhkcl9pbnQtPnNfdmFkZHIgJj0gMHhmZmZmZmZmZjsKKyAgICB9CisgIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgX0JTUykgPT0gMCkgCisgICAgeworICAgICAgc2NuaGRyX2ludC0+c19zaXplID0gc2NuaGRyX2ludC0+c19wYWRkcjsKKyAgICAgIHNjbmhkcl9pbnQtPnNfcGFkZHIgPSAwOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCisgICAgIGJmZCAgICAgICAqYWJmZDsKKyAgICAgUFRSCWluOworICAgICBQVFIJb3V0OworeworICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKilpbjsKKyAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKW91dDsKKyAgdW5zaWduZWQgaW50IHJldCA9IFNDTkhTWjsKKyAgYmZkX3ZtYSBwczsKKyAgYmZkX3ZtYSBzczsKKworICBtZW1jcHkoc2NuaGRyX2V4dC0+c19uYW1lLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZihzY25oZHJfaW50LT5zX25hbWUpKTsKKworICBQVVRfU0NOSERSX1ZBRERSIChhYmZkLCAKKwkJICAgICgoc2NuaGRyX2ludC0+c192YWRkciAKKwkJICAgICAgLSBwZV9kYXRhKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKQorCQkgICAgICYgMHhmZmZmZmZmZiksCisJCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7CisKKyAgLyogTlQgd2FudHMgdGhlIHNpemUgZGF0YSB0byBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IE5UX0ZJTEVfQUxJR05NRU5UCisgICAgIHZhbHVlIGV4Y2VwdCBmb3IgdGhlIEJTUyBzZWN0aW9uLCBpdHMgc19zaXplIHNob3VsZCBiZSAwICovCisKKworICBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsIF9CU1MpID09IDApIAorICAgIHsKKyAgICAgIHBzID0gc2NuaGRyX2ludC0+c19zaXplOworICAgICAgc3MgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBzID0gc2NuaGRyX2ludC0+c19wYWRkcjsKKyAgICAgIHNzID0gc2NuaGRyX2ludC0+c19zaXplOworICAgIH0KKworICBQVVRfU0NOSERSX1NJWkUgKGFiZmQsIHNzLAorCQkgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zaXplKTsKKworCisgIFBVVF9TQ05IRFJfUEFERFIgKGFiZmQsIHBzLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19wYWRkcik7CisKKyAgUFVUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfc2NucHRyLAorCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7CisgIFBVVF9TQ05IRFJfUkVMUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3JlbHB0ciwKKwkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOworICBQVVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwKKwkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7CisKKyAgLyogRXh0cmEgZmxhZ3MgbXVzdCBiZSBzZXQgd2hlbiBkZWFsaW5nIHdpdGggTlQuICBBbGwgc2VjdGlvbnMgc2hvdWxkIGFsc28KKyAgICAgaGF2ZSB0aGUgSU1BR0VfU0NOX01FTV9SRUFEICgweDQwMDAwMDAwKSBmbGFnIHNldC4gIEluIGFkZGl0aW9uLCB0aGUKKyAgICAgLnRleHQgc2VjdGlvbiBtdXN0IGhhdmUgSU1BR0VfU0NOX01FTV9FWEVDVVRFICgweDIwMDAwMDAwKSBhbmQgdGhlIGRhdGEKKyAgICAgc2VjdGlvbnMgKC5pZGF0YSwgLmRhdGEsIC5ic3MsIC5DUlQpIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX1dSSVRFIHNldAorICAgICAodGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgLmlkYXRhIHNlY3Rpb24gc2luY2UKKyAgICAgdGhlIGFkZHJlc3NlcyBmb3Igcm91dGluZXMgZnJvbSAuZGxscyBtdXN0IGJlIG92ZXJ3cml0dGVuKS4gIElmIC5yZWxvYworICAgICBzZWN0aW9uIGRhdGEgaXMgZXZlciBnZW5lcmF0ZWQsIHdlIG11c3QgYWRkIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKKyAgICAgKDB4MDIwMDAwMDApLiAgQWxzbywgdGhlIHJlc291cmNlIGRhdGEgc2hvdWxkIGFsc28gYmUgcmVhZCBhbmQKKyAgICAgd3JpdGFibGUuICAqLworCisgIC8qIEZJWE1FOiBhbGlnbm1lbnQgaXMgYWxzbyBlbmNvZGVkIGluIHRoaXMgZmllbGQsIGF0IGxlYXN0IG9uIHBwYyAoa3JrKSAqLworICAvKiBGSVhNRTogZXZlbiB3b3JzZSwgSSBkb24ndCBzZWUgaG93IHRvIGdldCB0aGUgb3JpZ2luYWwgYWxpZ25tZW50IGZpZWxkKi8KKyAgLyogICAgICAgIGJhY2suLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogRklYTUU6IEJhc2luZyB0aGlzIG9uIHNlY3Rpb24gbmFtZXMgaXMgYm9ndXMuICBBbHNvLCB0aGlzIHNob3VsZAorICAgICBiZSBpbiBzZWNfdG9fc3R5cF9mbGFncy4gICovCisKKyAgeworICAgIGludCBmbGFncyA9IHNjbmhkcl9pbnQtPnNfZmxhZ3M7CisgICAgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmRhdGEiKSAgPT0gMCB8fAorCXN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLkNSVCIpICAgPT0gMCB8fAorCXN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmJzcyIpICAgPT0gMCkKKyAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fV1JJVEU7CisgICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIudGV4dCIpID09IDApCisgICAgICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX0VYRUNVVEU7CisgICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIucmVsb2MiKSA9PSAwKQorICAgICAgZmxhZ3MgPSAoU0VDX0RBVEEgfCBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCisJICAgICAgIHwgSU1BR0VfU0NOX01FTV9TSEFSRUQpOworICAgIGVsc2UgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmlkYXRhIikgPT0gMCkKKyAgICAgIGZsYWdzID0gSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURSB8IFNFQ19EQVRBOyAgICAgCisgICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIucmRhdGEiKSA9PSAwCisJICAgICB8fCBzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5lZGF0YSIpID09IDApCisgICAgICBmbGFncyA9ICBJTUFHRV9TQ05fTUVNX1JFQUQgfCBTRUNfREFUQTsgICAgIAorICAgIGVsc2UgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLnBkYXRhIikgPT0gMCkKKyAgICAgIGZsYWdzID0gSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBIHwgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyB8CisJCQkgIElNQUdFX1NDTl9NRU1fUkVBRCA7CisgICAgLyogUmVtZW1iZXIgdGhpcyBmaWVsZCBpcyBhIG1heCBvZiA4IGNoYXJzLCBzbyB0aGUgbnVsbCBpcyBfbm90XyB0aGVyZQorICAgICAgIGZvciBhbiA4IGNoYXJhY3RlciBuYW1lIGxpa2UgIi5yZWxkYXRhIi4gKHllcC4gU3R1cGlkIGJ1ZykgKi8KKyAgICBlbHNlIGlmIChzdHJuY21wIChzY25oZHJfaW50LT5zX25hbWUsICIucmVsZGF0YSIsIDgpID09IDApCisgICAgICBmbGFncyA9ICBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fOEJZVEVTIHwKKwkgICAgICAgSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURSA7CisgICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIueWRhdGEiKSA9PSAwKQorICAgICAgZmxhZ3MgPSAgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBIHwgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyB8CisJICAgICAgIElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fV1JJVEUgOworICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5kcmVjdHZlIiwgOCkgPT0gMCkKKyAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9MTktfSU5GTyB8IElNQUdFX1NDTl9MTktfUkVNT1ZFIDsKKyAgICBlbHNlIGlmIChzdHJuY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuc3RhYiIsIDUpID09IDApCisgICAgICBmbGFncyB8PSAoSU1BR0VfU0NOX0xOS19JTkZPIHwgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQorCQl8IElNQUdFX1NDTl9NRU1fU0hBUkVEIHwgSU1BR0VfU0NOX01FTV9SRUFEKTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yc3JjIikgID09IDApCisgICAgICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1NIQVJFRDsKKyAgICBlbHNlCisgICAgICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQ7CisKKyAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmxhZ3MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKKyAgfQorCisgIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKKyAgICBiZmRfaF9wdXRfMTYoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOworICBlbHNlCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCisJCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkJICAgICBzY25oZHJfaW50LT5zX25sbm5vKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisgICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOworICAgICAgcmV0ID0gMDsKKyAgICB9CisgIGlmIChzY25oZHJfaW50LT5zX25yZWxvYyA8PSAweGZmZmYpCisgICAgYmZkX2hfcHV0XzE2KGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOworICBlbHNlCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCisJCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCQkJICAgICBzY25oZHJfaW50LT5zX25yZWxvYyk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOworICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7CisgICAgICByZXQgPSAwOworICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNoYXIgKiBkaXJfbmFtZXNbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdID0gCit7CisgIE5fICgiRXhwb3J0IERpcmVjdG9yeSBbLmVkYXRhIChvciB3aGVyZSBldmVyIHdlIGZvdW5kIGl0KV0iKSwKKyAgTl8gKCJJbXBvcnQgRGlyZWN0b3J5IFtwYXJ0cyBvZiAuaWRhdGFdIiksCisgIE5fICgiUmVzb3VyY2UgRGlyZWN0b3J5IFsucnNyY10iKSwKKyAgTl8gKCJFeGNlcHRpb24gRGlyZWN0b3J5IFsucGRhdGFdIiksCisgIE5fICgiU2VjdXJpdHkgRGlyZWN0b3J5IiksCisgIE5fICgiQmFzZSBSZWxvY2F0aW9uIERpcmVjdG9yeSBbLnJlbG9jXSIpLAorICBOXyAoIkRlYnVnIERpcmVjdG9yeSIpLAorICBOXyAoIkRlc2NyaXB0aW9uIERpcmVjdG9yeSIpLAorICBOXyAoIlNwZWNpYWwgRGlyZWN0b3J5IiksCisgIE5fICgiVGhyZWFkIFN0b3JhZ2UgRGlyZWN0b3J5IFsudGxzXSIpLAorICBOXyAoIkxvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkiKSwKKyAgTl8gKCJCb3VuZCBJbXBvcnQgRGlyZWN0b3J5IiksCisgIE5fICgiSW1wb3J0IEFkZHJlc3MgVGFibGUgRGlyZWN0b3J5IiksCisgIE5fICgiUmVzZXJ2ZWQiKSwKKyAgTl8gKCJSZXNlcnZlZCIpLAorICBOXyAoIlJlc2VydmVkIikKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2xlYW4KK3BlX3ByaW50X2lkYXRhKGFiZmQsIHZmaWxlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiB2ZmlsZTsKK3sKKyAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOworICBiZmRfYnl0ZSAqZGF0YSA9IDA7CisgIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEiKTsKKyAgdW5zaWduZWQgbG9uZyBhZGo7CisKKyNpZmRlZiBQT1dFUlBDX0xFX1BFCisgIGFzZWN0aW9uICpyZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbGRhdGEiKTsKKyNlbmRpZgorCisgIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7CisgIGJmZF9zaXplX3R5cGUgZGF0YW9mZjsKKyAgYmZkX3NpemVfdHlwZSBzZWNzaXplOworICBiZmRfc2l6ZV90eXBlIGk7CisgIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7CisgIGludCBvbmFsaW5lID0gMjA7CisKKyAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOworICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKKworICBpZiAoc2VjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7CisgICAgICBkYXRhb2ZmID0gMDsKKworICAgICAgaWYgKGRhdGFzaXplID09IDApCisJcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmZkX3ZtYSBhZGRyLCBzaXplOworCisgICAgICBhZGRyID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3M7CisgICAgICBzaXplID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZTsKKworICAgICAgaWYgKGFkZHIgPT0gMCB8fCBzaXplID09IDApCisJcmV0dXJuIHRydWU7CisKKyAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorCXsKKwkgIGlmIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlIDw9IGFkZHIKKwkgICAgICAmJiAoKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UKKwkJICAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSkKKwkJICA+PSBhZGRyICsgc2l6ZSkpCisJICAgIGJyZWFrOworCX0KKyAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgaW1wb3J0IHRhYmxlIHNpemUgaXMgbm90IHJlbGlhYmxlLiAgVGhlCisgICAgICAgICBpbXBvcnQgZGF0YSB3aWxsIGV4dGVuZCBwYXN0IHRoZSBpbmRpY2F0ZWQgc2l6ZSwgYW5kIGJlZm9yZQorICAgICAgICAgdGhlIGluZGljYXRlZCBhZGRyZXNzLiAgKi8KKyAgICAgIGRhdGFvZmYgPSBhZGRyIC0gKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UpOworICAgICAgZGF0YXNpemUgPSBzaXplOworICAgIH0KKworI2lmZGVmIFBPV0VSUENfTEVfUEUKKyAgaWYgKHJlbF9zZWN0aW9uICE9IDAgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pICE9IDApCisgICAgeworICAgICAgLyogVGhlIHRvYyBhZGRyZXNzIGNhbiBiZSBmb3VuZCBieSB0YWtpbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3MsCisJIHdoaWNoIG9uIHRoZSBQUEMgbG9jYXRlcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuIFRoZSBkZXNjcmlwdG9yCisJIGNvbnNpc3RzIG9mIHRoZSBmdW5jdGlvbiBjb2RlIHN0YXJ0aW5nIGFkZHJlc3MgZm9sbG93ZWQgYnkgdGhlCisJIGFkZHJlc3Mgb2YgdGhlIHRvYy4gVGhlIHN0YXJ0aW5nIGFkZHJlc3Mgd2UgZ2V0IGZyb20gdGhlIGJmZCwKKwkgYW5kIHRoZSBkZXNjcmlwdG9yIGlzIHN1cHBvc2VkIHRvIGJlIGluIHRoZSAucmVsZGF0YSBzZWN0aW9uLiAKKyAgICAgICovCisKKyAgICAgIGJmZF92bWEgbG9hZGFibGVfdG9jX2FkZHJlc3M7CisgICAgICBiZmRfdm1hIHRvY19hZGRyZXNzOworICAgICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOworICAgICAgYmZkX2J5dGUgKmRhdGEgPSAwOworICAgICAgaW50IG9mZnNldDsKKyAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgCisJCQkJCQkJCSByZWxfc2VjdGlvbikpOworICAgICAgaWYgKGRhdGEgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pOworICAKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCisJCQkJcmVsX3NlY3Rpb24sIAorCQkJCShQVFIpIGRhdGEsIDAsIAorCQkJCWJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSk7CisKKyAgICAgIG9mZnNldCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3MgLSByZWxfc2VjdGlvbi0+dm1hOworCisgICAgICBzdGFydF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK29mZnNldCk7CisgICAgICBsb2FkYWJsZV90b2NfYWRkcmVzcyA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStvZmZzZXQrNCk7CisgICAgICB0b2NfYWRkcmVzcyA9IGxvYWRhYmxlX3RvY19hZGRyZXNzIC0gMzI3Njg7CisKKyAgICAgIGZwcmludGYoZmlsZSwKKwkgICAgICBfKCJcbkZ1bmN0aW9uIGRlc2NyaXB0b3IgbG9jYXRlZCBhdCB0aGUgc3RhcnQgYWRkcmVzczogJTA0bHhcbiIpLAorCSAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpKTsKKyAgICAgIGZwcmludGYgKGZpbGUsCisJICAgICAgIF8oIlx0Y29kZS1iYXNlICUwOGx4IHRvYyAobG9hZGFibGUvYWN0dWFsKSAlMDhseC8lMDhseFxuIiksIAorCSAgICAgICBzdGFydF9hZGRyZXNzLCBsb2FkYWJsZV90b2NfYWRkcmVzcywgdG9jX2FkZHJlc3MpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBmcHJpbnRmKGZpbGUsCisJICAgICAgXygiXG5ObyByZWxkYXRhIHNlY3Rpb24hIEZ1bmN0aW9uIGRlc2NyaXB0b3Igbm90IGRlY29kZWQuXG4iKSk7CisgICAgfQorI2VuZGlmCisKKyAgZnByaW50ZihmaWxlLAorCSAgXygiXG5UaGUgSW1wb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmlkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iKSk7CisgIGZwcmludGYoZmlsZSwKKwkgIF8oIiB2bWE6ICAgICAgICAgICAgSGludCAgICBUaW1lICAgICAgRm9yd2FyZCAgRExMICAgICAgIEZpcnN0XG4iKSk7CisgIGZwcmludGYoZmlsZSwKKwkgIF8oIiAgICAgICAgICAgICAgICAgVGFibGUgICBTdGFtcCAgICAgQ2hhaW4gICAgTmFtZSAgICAgIFRodW5rXG4iKSk7CisKKyAgc2Vjc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOworICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlY3NpemUpOworICBpZiAoZGF0YSA9PSBOVUxMICYmIHNlY3NpemUgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBzZWNzaXplKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYWRqID0gKGV4dHJhLT5JbWFnZUJhc2UgLSBzZWN0aW9uLT52bWEpICYgMHhmZmZmZmZmZjsKKworICBzdGFydCA9IGRhdGFvZmY7CisgIHN0b3AgPSBkYXRhb2ZmICsgZGF0YXNpemU7CisgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBvbmFsaW5lKQorICAgIHsKKyAgICAgIGJmZF92bWEgaGludF9hZGRyOworICAgICAgYmZkX3ZtYSB0aW1lX3N0YW1wOworICAgICAgYmZkX3ZtYSBmb3J3YXJkX2NoYWluOworICAgICAgYmZkX3ZtYSBkbGxfbmFtZTsKKyAgICAgIGJmZF92bWEgZmlyc3RfdGh1bms7CisgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgIGJmZF9zaXplX3R5cGUgajsKKyAgICAgIGNoYXIgKmRsbDsKKworICAgICAgZnByaW50ZiAoZmlsZSwKKwkgICAgICAgIiAlMDhseFx0IiwgCisJICAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGkgKyBzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSk7CisgICAgICAKKyAgICAgIGlmIChpKzIwID4gc3RvcCkKKwl7CisJICAvKiBjaGVjayBzdHVmZiAqLworCSAgOworCX0KKyAgICAgIAorICAgICAgaGludF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOworICAgICAgdGltZV9zdGFtcCA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOworICAgICAgZm9yd2FyZF9jaGFpbiA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzgpOworICAgICAgZGxsX25hbWUgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxMik7CisgICAgICBmaXJzdF90aHVuayA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzE2KTsKKyAgICAgIAorICAgICAgZnByaW50ZihmaWxlLCAiJTA4bHggJTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsCisJICAgICAgaGludF9hZGRyLAorCSAgICAgIHRpbWVfc3RhbXAsCisJICAgICAgZm9yd2FyZF9jaGFpbiwKKwkgICAgICBkbGxfbmFtZSwKKwkgICAgICBmaXJzdF90aHVuayk7CisKKyAgICAgIGlmIChoaW50X2FkZHIgPT0gMCAmJiBmaXJzdF90aHVuayA9PSAwKQorCWJyZWFrOworCisgICAgICAvKiB0aGUgaW1hZ2UgYmFzZSBpcyBwcmVzZW50IGluIHRoZSBzZWN0aW9uLT52bWEgKi8KKyAgICAgIGRsbCA9IChjaGFyICopIGRhdGEgKyBkbGxfbmFtZSArIGFkajsKKyAgICAgIGZwcmludGYoZmlsZSwgXygiXG5cdERMTCBOYW1lOiAlc1xuIiksIGRsbCk7CisKKyAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKKwl7CisJICBmcHJpbnRmIChmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7CisKKwkgIGlkeCA9IGhpbnRfYWRkciArIGFkajsKKworCSAgZm9yIChqID0gMDsgaiA8IHN0b3A7IGogKz0gNCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOworCisJICAgICAgaWYgKG1lbWJlciA9PSAwKQorCQlicmVhazsKKwkgICAgICBpZiAobWVtYmVyICYgMHg4MDAwMDAwMCkKKwkJZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGx1IiwgbWVtYmVyLAorCQkJIG1lbWJlciAmIDB4N2ZmZmZmZmYpOworCSAgICAgIGVsc2UKKwkJeworCQkgIGludCBvcmRpbmFsOworCQkgIGNoYXIgKm1lbWJlcl9uYW1lOworCisJCSAgb3JkaW5hbCA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBtZW1iZXIgKyBhZGopOworCQkgIG1lbWJlcl9uYW1lID0gKGNoYXIgKikgZGF0YSArIG1lbWJlciArIGFkaiArIDI7CisJCSAgZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGQgICVzIiwKKwkJCSAgIG1lbWJlciwgb3JkaW5hbCwgbWVtYmVyX25hbWUpOworCQl9CisKKwkgICAgICAvKiBJZiB0aGUgdGltZSBzdGFtcCBpcyBub3QgemVybywgdGhlIGltcG9ydCBhZGRyZXNzCisgICAgICAgICAgICAgICAgIHRhYmxlIGhvbGRzIGFjdHVhbCBhZGRyZXNzZXMuICAqLworCSAgICAgIGlmICh0aW1lX3N0YW1wICE9IDAKKwkJICAmJiBmaXJzdF90aHVuayAhPSAwCisJCSAgJiYgZmlyc3RfdGh1bmsgIT0gaGludF9hZGRyKQorCQlmcHJpbnRmIChmaWxlLCAiXHQlMDRseCIsCisJCQkgYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGZpcnN0X3RodW5rICsgYWRqICsgaikpOworCisJICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChoaW50X2FkZHIgIT0gZmlyc3RfdGh1bmsgJiYgdGltZV9zdGFtcCA9PSAwKQorCXsKKwkgIGludCBkaWZmZXIgPSAwOworCSAgaW50IGlkeDI7CisKKwkgIGlkeDIgPSBmaXJzdF90aHVuayArIGFkajsKKworCSAgZm9yIChqPTA7ajxzdG9wO2orPTQpCisJICAgIHsKKwkgICAgICBpbnQgb3JkaW5hbDsKKwkgICAgICBjaGFyICptZW1iZXJfbmFtZTsKKwkgICAgICBiZmRfdm1hIGhpbnRfbWVtYmVyID0gMDsKKwkgICAgICBiZmRfdm1hIGlhdF9tZW1iZXI7CisKKwkgICAgICBpZiAoaGludF9hZGRyICE9IDApCisJCWhpbnRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOworCSAgICAgIGlhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4MiArIGopOworCisJICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGlhdF9tZW1iZXIgPT0gMCkKKwkJYnJlYWs7CisKKwkgICAgICBpZiAoaGludF9hZGRyID09IDAgfHwgaGludF9tZW1iZXIgIT0gaWF0X21lbWJlcikKKwkJeworCQkgIGlmIChkaWZmZXIgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZiAoZmlsZSwgCisJCQkgICAgICAgXygiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgKGRpZmZlcmVuY2UgZm91bmQpXG4iKSk7CisJCSAgICAgIGZwcmludGYoZmlsZSwgXygiXHR2bWE6ICBIaW50L09yZCBNZW1iZXItTmFtZVxuIikpOworCQkgICAgICBkaWZmZXIgPSAxOworCQkgICAgfQorCQkgIGlmIChpYXRfbWVtYmVyID09IDApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoZmlsZSwKKwkJCSAgICAgIF8oIlx0Pj4+IFJhbiBvdXQgb2YgSUFUIG1lbWJlcnMhXG4iKSk7CisJCSAgICB9CisJCSAgZWxzZSAKKwkJICAgIHsKKwkJICAgICAgb3JkaW5hbCA9IGJmZF9nZXRfMTYoYWJmZCwKKwkJCQkJICAgZGF0YSArIGlhdF9tZW1iZXIgKyBhZGopOworCQkgICAgICBtZW1iZXJfbmFtZSA9IChjaGFyICopIGRhdGEgKyBpYXRfbWVtYmVyICsgYWRqICsgMjsKKwkJICAgICAgZnByaW50ZihmaWxlLCAiXHQlMDRseFx0ICU0ZCAgJXNcbiIsCisJCQkgICAgICBpYXRfbWVtYmVyLCBvcmRpbmFsLCBtZW1iZXJfbmFtZSk7CisJCSAgICB9CisJCX0KKworCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCAmJiBoaW50X21lbWJlciA9PSAwKQorCQlicmVhazsKKwkgICAgfQorCSAgaWYgKGRpZmZlciA9PSAwKQorCSAgICB7CisJICAgICAgZnByaW50ZihmaWxlLAorCQkgICAgICBfKCJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSBpcyBpZGVudGljYWxcbiIpKTsKKwkgICAgfQorCX0KKworICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKKworICAgIH0KKworICBmcmVlIChkYXRhKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK3BlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSkKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgdmZpbGU7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKKyAgYmZkX2J5dGUgKmRhdGEgPSAwOworICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmVkYXRhIik7CisKKyAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKKyAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOworICBiZmRfc2l6ZV90eXBlIGk7CisKKyAgaW50IGFkajsKKyAgc3RydWN0IEVEVF90eXBlIAorICAgIHsKKyAgICAgIGxvbmcgZXhwb3J0X2ZsYWdzOyAgICAgICAgICAgICAvKiByZXNlcnZlZCAtIHNob3VsZCBiZSB6ZXJvICovCisgICAgICBsb25nIHRpbWVfc3RhbXA7CisgICAgICBzaG9ydCBtYWpvcl92ZXI7CisgICAgICBzaG9ydCBtaW5vcl92ZXI7CisgICAgICBiZmRfdm1hIG5hbWU7ICAgICAgICAgICAgICAgICAgLyogcnZhIC0gcmVsYXRpdmUgdG8gaW1hZ2UgYmFzZSAqLworICAgICAgbG9uZyBiYXNlOyAgICAgICAgICAgICAgICAgICAgIC8qIG9yZGluYWwgYmFzZSAqLworICAgICAgdW5zaWduZWQgbG9uZyBudW1fZnVuY3Rpb25zOyAgIC8qIE51bWJlciBpbiB0aGUgZXhwb3J0IGFkZHJlc3MgdGFibGUgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX25hbWVzOyAgICAgICAvKiBOdW1iZXIgaW4gdGhlIG5hbWUgcG9pbnRlciB0YWJsZSAqLworICAgICAgYmZkX3ZtYSBlYXRfYWRkcjsgICAgLyogcnZhIHRvIHRoZSBleHBvcnQgYWRkcmVzcyB0YWJsZSAqLworICAgICAgYmZkX3ZtYSBucHRfYWRkcjsgICAgICAgIC8qIHJ2YSB0byB0aGUgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZSAqLworICAgICAgYmZkX3ZtYSBvdF9hZGRyOyAvKiBydmEgdG8gdGhlIE9yZGluYWwgVGFibGUgKi8KKyAgICB9IGVkdDsKKworICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7CisgIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZS0+cGVfb3B0aGRyOworCisgIGlmIChzZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKKyAgICAgIGRhdGFvZmYgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF92bWEgYWRkciwgc2l6ZTsKKworICAgICAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlZpcnR1YWxBZGRyZXNzOworICAgICAgc2l6ZSA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlNpemU7CisKKyAgICAgIGlmIChhZGRyID09IDAgfHwgc2l6ZSA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKKwl7CisJICBpZiAoc2VjdGlvbi0+dm1hIC0gZXh0cmEtPkltYWdlQmFzZSA8PSBhZGRyCisJICAgICAgJiYgKChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlCisJCSAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpCisJCSAgPj0gYWRkciArIHNpemUpKQorCSAgICBicmVhazsKKwl9CisgICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQorCXJldHVybiB0cnVlOworCisgICAgICBkYXRhc2l6ZSA9IHNpemU7CisgICAgICBkYXRhb2ZmID0gYWRkciAtIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlKTsKKyAgICB9CisKKyAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChkYXRhc2l6ZSk7CisgIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgZGF0YXNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBHbyBnZXQgRXhwb3J0IERpcmVjdG9yeSBUYWJsZSAqLworICBlZHQuZXhwb3J0X2ZsYWdzICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMCk7IAorICBlZHQudGltZV9zdGFtcCAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErNCk7CisgIGVkdC5tYWpvcl92ZXIgICAgICA9IGJmZF9nZXRfMTYoYWJmZCwgZGF0YSs4KTsKKyAgZWR0Lm1pbm9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzEwKTsKKyAgZWR0Lm5hbWUgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzEyKTsKKyAgZWR0LmJhc2UgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzE2KTsKKyAgZWR0Lm51bV9mdW5jdGlvbnMgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzIwKTsgCisgIGVkdC5udW1fbmFtZXMgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyNCk7IAorICBlZHQuZWF0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjgpOworICBlZHQubnB0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMzIpOyAKKyAgZWR0Lm90X2FkZHIgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzM2KTsKKworICBhZGogPSAoZXh0cmEtPkltYWdlQmFzZSAtIChzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSkgJiAweGZmZmZmZmZmOworCisKKyAgLyogRHVtcCB0aGUgRURUIGZpcnN0IGZpcnN0ICovCisgIGZwcmludGYoZmlsZSwKKwkgIF8oIlxuVGhlIEV4cG9ydCBUYWJsZXMgKGludGVycHJldGVkIC5lZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuXG4iKSk7CisKKyAgZnByaW50ZihmaWxlLAorCSAgXygiRXhwb3J0IEZsYWdzIFx0XHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQuZXhwb3J0X2ZsYWdzKTsKKworICBmcHJpbnRmKGZpbGUsCisJICBfKCJUaW1lL0RhdGUgc3RhbXAgXHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQudGltZV9zdGFtcCk7CisKKyAgZnByaW50ZihmaWxlLAorCSAgXygiTWFqb3IvTWlub3IgXHRcdFx0JWQvJWRcbiIpLCBlZHQubWFqb3JfdmVyLCBlZHQubWlub3JfdmVyKTsKKworICBmcHJpbnRmIChmaWxlLAorCSAgIF8oIk5hbWUgXHRcdFx0XHQiKSk7CisgIGZwcmludGZfdm1hIChmaWxlLCBlZHQubmFtZSk7CisgIGZwcmludGYgKGZpbGUsCisJICAgIiAlc1xuIiwgZGF0YSArIGVkdC5uYW1lICsgYWRqKTsKKworICBmcHJpbnRmKGZpbGUsCisJICBfKCJPcmRpbmFsIEJhc2UgXHRcdFx0JWxkXG4iKSwgZWR0LmJhc2UpOworCisgIGZwcmludGYoZmlsZSwKKwkgIF8oIk51bWJlciBpbjpcbiIpKTsKKworICBmcHJpbnRmKGZpbGUsCisJICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQlbHhcbiIpLAorCSAgZWR0Lm51bV9mdW5jdGlvbnMpOworCisgIGZwcmludGYoZmlsZSwKKwkgIF8oIlx0W05hbWUgUG9pbnRlci9PcmRpbmFsXSBUYWJsZVx0JWx1XG4iKSwgZWR0Lm51bV9uYW1lcyk7CisKKyAgZnByaW50ZihmaWxlLAorCSAgXygiVGFibGUgQWRkcmVzc2VzXG4iKSk7CisKKyAgZnByaW50ZiAoZmlsZSwKKwkgICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQiKSk7CisgIGZwcmludGZfdm1hIChmaWxlLCBlZHQuZWF0X2FkZHIpOworICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKKworICBmcHJpbnRmIChmaWxlLAorCSAgXygiXHROYW1lIFBvaW50ZXIgVGFibGUgXHRcdCIpKTsKKyAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5ucHRfYWRkcik7CisgIGZwcmludGYgKGZpbGUsICJcbiIpOworCisgIGZwcmludGYgKGZpbGUsCisJICAgXygiXHRPcmRpbmFsIFRhYmxlIFx0XHRcdCIpKTsKKyAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5vdF9hZGRyKTsKKyAgZnByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgCisgIC8qIFRoZSBuZXh0IHRhYmxlIHRvIGZpbmQgc2kgdGhlIEV4cG9ydCBBZGRyZXNzIFRhYmxlLiBJdCdzIGJhc2ljYWxseQorICAgICBhIGxpc3Qgb2YgcG9pbnRlcnMgdGhhdCBlaXRoZXIgbG9jYXRlIGEgZnVuY3Rpb24gaW4gdGhpcyBkbGwsIG9yCisgICAgIGZvcndhcmQgdGhlIGNhbGwgdG8gYW5vdGhlciBkbGwuIFNvbWV0aGluZyBsaWtlOgorICAgICAgdHlwZWRlZiB1bmlvbiAKKyAgICAgIHsKKyAgICAgICAgbG9uZyBleHBvcnRfcnZhOworICAgICAgICBsb25nIGZvcndhcmRlcl9ydmE7CisgICAgICB9IGV4cG9ydF9hZGRyZXNzX3RhYmxlX2VudHJ5OworICAqLworCisgIGZwcmludGYoZmlsZSwKKwkgIF8oIlxuRXhwb3J0IEFkZHJlc3MgVGFibGUgLS0gT3JkaW5hbCBCYXNlICVsZFxuIiksCisJICBlZHQuYmFzZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGVkdC5udW1fZnVuY3Rpb25zOyArK2kpCisgICAgeworICAgICAgYmZkX3ZtYSBlYXRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgCisJCQkJICAgICAgIGRhdGEgKyBlZHQuZWF0X2FkZHIgKyAoaSAqIDQpICsgYWRqKTsKKyAgICAgIGJmZF92bWEgZWF0X2FjdHVhbCA9IChleHRyYS0+SW1hZ2VCYXNlICsgZWF0X21lbWJlcikgJiAweGZmZmZmZmZmOworICAgICAgYmZkX3ZtYSBlZGF0YV9zdGFydCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsc2VjdGlvbikgKyBkYXRhb2ZmOworICAgICAgYmZkX3ZtYSBlZGF0YV9lbmQgPSBlZGF0YV9zdGFydCArIGRhdGFzaXplOworCisgICAgICBpZiAoZWF0X21lbWJlciA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoZWRhdGFfc3RhcnQgPCBlYXRfYWN0dWFsICYmIGVhdF9hY3R1YWwgPCBlZGF0YV9lbmQpIAorCXsKKwkgIC8qIHRoaXMgcnZhIGlzIHRvIGEgbmFtZSAoZm9yd2FyZGluZyBmdW5jdGlvbikgaW4gb3VyIHNlY3Rpb24gKi8KKwkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yICovCisJICBmcHJpbnRmKGZpbGUsCisJCSAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzIC0tICVzXG4iLCAKKwkJICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLAorCQkgICJGb3J3YXJkZXIgUlZBIiwgZGF0YSArIGVhdF9tZW1iZXIgKyBhZGopOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBTaG91bGQgbG9jYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciBpbiB0aGUgcmVsZGF0YSBzZWN0aW9uICovCisJICBmcHJpbnRmKGZpbGUsCisJCSAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzXG4iLCAKKwkJICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLCAiRXhwb3J0IFJWQSIpOworCX0KKyAgICB9CisKKyAgLyogVGhlIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGUgaXMgcGFpcmVkIHdpdGggdGhlIEV4cG9ydCBPcmRpbmFsIFRhYmxlICovCisgIC8qIER1bXAgdGhlbSBpbiBwYXJhbGxlbCBmb3IgY2xhcml0eSAqLworICBmcHJpbnRmKGZpbGUsCisJICBfKCJcbltPcmRpbmFsL05hbWUgUG9pbnRlcl0gVGFibGVcbiIpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9uYW1lczsgKytpKQorICAgIHsKKyAgICAgIGJmZF92bWEgbmFtZV9wdHIgPSBiZmRfZ2V0XzMyKGFiZmQsIAorCQkJCSAgICBkYXRhICsgCisJCQkJICAgIGVkdC5ucHRfYWRkcgorCQkJCSAgICArIChpKjQpICsgYWRqKTsKKyAgICAgIAorICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIGRhdGEgKyBuYW1lX3B0ciArIGFkajsKKworICAgICAgYmZkX3ZtYSBvcmQgPSBiZmRfZ2V0XzE2KGFiZmQsIAorCQkJCSAgICBkYXRhICsgCisJCQkJICAgIGVkdC5vdF9hZGRyCisJCQkJICAgICsgKGkqMikgKyBhZGopOworICAgICAgZnByaW50ZihmaWxlLAorCSAgICAgICJcdFslNGxkXSAlc1xuIiwgKGxvbmcpIG9yZCwgbmFtZSk7CisKKyAgICB9CisKKyAgZnJlZSAoZGF0YSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitwZV9wcmludF9wZGF0YSAoYWJmZCwgdmZpbGUpCisgICAgIGJmZCAgKmFiZmQ7CisgICAgIFBUUiB2ZmlsZTsKK3sKKyAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOworICBiZmRfYnl0ZSAqZGF0YSA9IDA7CisgIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucGRhdGEiKTsKKyAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7CisgIGJmZF9zaXplX3R5cGUgaTsKKyAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKKyAgaW50IG9uYWxpbmUgPSAyMDsKKworICBpZiAoc2VjdGlvbiA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIHN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKKyAgaWYgKChzdG9wICUgb25hbGluZSkgIT0gMCkKKyAgICBmcHJpbnRmIChmaWxlLCBfKCJXYXJuaW5nLCAucGRhdGEgc2VjdGlvbiBzaXplICglbGQpIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkXG4iKSwKKwkgICAgIChsb25nKXN0b3AsIG9uYWxpbmUpOworCisgIGZwcmludGYoZmlsZSwKKwkgIF8oIlxuVGhlIEZ1bmN0aW9uIFRhYmxlIChpbnRlcnByZXRlZCAucGRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKKyAgZnByaW50ZihmaWxlLAorCSAgXygiIHZtYTpcdFx0QmVnaW4gICAgRW5kICAgICAgRUggICAgICAgRUggICAgICAgUHJvbG9nRW5kXG4iKSk7CisgIGZwcmludGYoZmlsZSwKKwkgIF8oIiAgICAgXHRcdEFkZHJlc3MgIEFkZHJlc3MgIEhhbmRsZXIgIERhdGEgICAgIEFkZHJlc3NcbiIpKTsKKworICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKKyAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIAorCQkJICAgIHNlY3Rpb24sIAorCQkJICAgIChQVFIpIGRhdGEsIDAsIAorCQkJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKKworICBzdGFydCA9IDA7CisKKyAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCisgICAgeworICAgICAgYmZkX3ZtYSBiZWdpbl9hZGRyOworICAgICAgYmZkX3ZtYSBlbmRfYWRkcjsKKyAgICAgIGJmZF92bWEgZWhfaGFuZGxlcjsKKyAgICAgIGJmZF92bWEgZWhfZGF0YTsKKyAgICAgIGJmZF92bWEgcHJvbG9nX2VuZF9hZGRyOworCisgICAgICBpZiAoaSsyMCA+IHN0b3ApCisJICBicmVhazsKKyAgICAgIAorICAgICAgYmVnaW5fYWRkciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKTsKKyAgICAgIGVuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7CisgICAgICBlaF9oYW5kbGVyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krOCk7CisgICAgICBlaF9kYXRhID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTIpOworICAgICAgcHJvbG9nX2VuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTYpOworICAgICAgCisgICAgICBpZiAoYmVnaW5fYWRkciA9PSAwICYmIGVuZF9hZGRyID09IDAgJiYgZWhfaGFuZGxlciA9PSAwCisJICAmJiBlaF9kYXRhID09IDAgJiYgcHJvbG9nX2VuZF9hZGRyID09IDApCisJeworCSAgLyogV2UgYXJlIHByb2JhYmx5IGludG8gdGhlIHBhZGRpbmcgb2YgdGhlCisJICAgICBzZWN0aW9uIG5vdyAqLworCSAgYnJlYWs7CisJfQorCisgICAgICBmcHJpbnRmIChmaWxlLAorCSAgICAgICAiICUwOGx4XHQiLCAKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOworCisgICAgICBmcHJpbnRmKGZpbGUsICIlMDhseCAlMDhseCAlMDhseCAlMDhseCAlMDhseCIsCisJICAgICAgYmVnaW5fYWRkciwKKwkgICAgICBlbmRfYWRkciwKKwkgICAgICBlaF9oYW5kbGVyLAorCSAgICAgIGVoX2RhdGEsCisJICAgICAgcHJvbG9nX2VuZF9hZGRyKTsKKworI2lmZGVmIFBPV0VSUENfTEVfUEUKKyAgICAgIGlmIChlaF9oYW5kbGVyID09IDAgJiYgZWhfZGF0YSAhPSAwKQorCXsKKwkgIC8qIFNwZWNpYWwgYml0cyBoZXJlLCBhbHRob3VnaCB0aGUgbWVhbmluZyBtYXkgKi8KKwkgIC8qIGJlIGEgbGl0dGxlIG15c3RlcmlvdXMuIFRoZSBvbmx5IG9uZSBJIGtub3cgKi8KKwkgIC8qIGZvciBzdXJlIGlzIDB4MDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgIC8qIENvZGUgU2lnbmlmaWNhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgIC8qIDB4MDAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgIC8qIDB4MDEgUmVnaXN0ZXIgU2F2ZSBNaWxsaWNvZGUgICAgICAgICAgICAgICAgKi8KKwkgIC8qIDB4MDIgUmVnaXN0ZXIgUmVzdG9yZSBNaWxsaWNvZGUgICAgICAgICAgICAgKi8KKwkgIC8qIDB4MDMgR2x1ZSBDb2RlIFNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgKi8KKwkgIHN3aXRjaCAoZWhfZGF0YSkKKwkgICAgeworCSAgICBjYXNlIDB4MDE6CisJICAgICAgZnByaW50ZihmaWxlLCBfKCIgUmVnaXN0ZXIgc2F2ZSBtaWxsaWNvZGUiKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMHgwMjoKKwkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciByZXN0b3JlIG1pbGxpY29kZSIpKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAweDAzOgorCSAgICAgIGZwcmludGYoZmlsZSwgXygiIEdsdWUgY29kZSBzZXF1ZW5jZSIpKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyNlbmRpZgkgICAKKyAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7CisgICAgfQorCisgIGZyZWUgKGRhdGEpOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdGJsWzZdID0KK3sKKyJBQlNPTFVURSIsCisiSElHSCIsCisiTE9XIiwKKyJISUdITE9XIiwKKyJISUdIQURKIiwKKyJNSVBTX0pNUEFERFIiCit9OworCitzdGF0aWMgYm9vbGVhbgorcGVfcHJpbnRfcmVsb2MgKGFiZmQsIHZmaWxlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiB2ZmlsZTsKK3sKKyAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOworICBiZmRfYnl0ZSAqZGF0YSA9IDA7CisgIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsb2MiKTsKKyAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7CisgIGJmZF9zaXplX3R5cGUgaTsKKyAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKKworICBpZiAoc2VjdGlvbiA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGZwcmludGYoZmlsZSwKKwkgIF8oIlxuXG5QRSBGaWxlIEJhc2UgUmVsb2NhdGlvbnMgKGludGVycHJldGVkIC5yZWxvYyBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOworCisgIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOworICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOworICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCisJCQkgICAgc2VjdGlvbiwgCisJCQkgICAgKFBUUikgZGF0YSwgMCwgCisJCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOworCisgIHN0YXJ0ID0gMDsKKworICBzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7CisKKyAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIGJmZF92bWEgdmlydHVhbF9hZGRyZXNzOworICAgICAgbG9uZyBudW1iZXIsIHNpemU7CisKKyAgICAgIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBhIHNlcXVlbmNlIG9mIGJsb2Nrcywgd2l0aCBhIGhlYWRlciBjb25zaXN0aW5nCisJIG9mIHR3byAzMiBiaXQgcXVhbnRpdGllcywgZm9sbG93ZWQgYnkgYSBudW1iZXIgb2YgMTYgYml0IGVudHJpZXMgKi8KKworICAgICAgdmlydHVhbF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOworICAgICAgc2l6ZSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOworICAgICAgbnVtYmVyID0gKHNpemUgLSA4KSAvIDI7CisKKyAgICAgIGlmIChzaXplID09IDApIAorCXsKKwkgIGJyZWFrOworCX0KKworICAgICAgZnByaW50ZiAoZmlsZSwKKwkgICAgICAgXygiXG5WaXJ0dWFsIEFkZHJlc3M6ICUwOGx4IENodW5rIHNpemUgJWxkICgweCVseCkgTnVtYmVyIG9mIGZpeHVwcyAlbGRcbiIpLAorCSAgICAgICB2aXJ0dWFsX2FkZHJlc3MsIHNpemUsIHNpemUsIG51bWJlcik7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXI7ICsraikKKwl7CisJICB1bnNpZ25lZCBzaG9ydCBlID0gYmZkX2dldF8xNihhYmZkLCBkYXRhICsgaSArIDggKyBqKjIpOworCSAgaW50IHQgPSAgIChlICYgMHhGMDAwKSA+PiAxMjsKKwkgIGludCBvZmYgPSBlICYgMHgwRkZGOworCisJICBpZiAodCA+IDUpIAorCSAgICBhYm9ydCgpOworCisJICBmcHJpbnRmKGZpbGUsCisJCSAgXygiXHRyZWxvYyAlNGQgb2Zmc2V0ICU0eCBbJTRseF0gJXNcbiIpLCAKKwkJICBqLCBvZmYsIChsb25nKSAob2ZmICsgdmlydHVhbF9hZGRyZXNzKSwgdGJsW3RdKTsKKwkgIAorCX0KKyAgICAgIGkgKz0gc2l6ZTsKKyAgICB9CisKKyAgZnJlZSAoZGF0YSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSkKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgdmZpbGU7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKKyAgaW50IGo7CisgIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKKyAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmkgPSAmcGUtPnBlX29wdGhkcjsKKworICAvKiBUaGUgTVMgZHVtcGJpbiBwcm9ncmFtIHJlcG9ydGVkbHkgYW5kcyB3aXRoIDB4ZmYwZiBiZWZvcmUKKyAgICAgcHJpbnRpbmcgdGhlIGNoYXJhY3RlcmlzdGljcyBmaWVsZC4gIE5vdCBzdXJlIHdoeS4gIE5vIHJlYXNvbiB0bworICAgICBlbXVsYXRlIGl0IGhlcmUuICAqLworICBmcHJpbnRmIChmaWxlLCBfKCJcbkNoYXJhY3RlcmlzdGljcyAweCV4XG4iKSwgcGUtPnJlYWxfZmxhZ3MpOworI3VuZGVmIFBGCisjZGVmaW5lIFBGKHgsIHkpICAgIGlmIChwZS0+cmVhbF9mbGFncyAmIHgpIHsgZnByaW50ZiAoZmlsZSwgIlx0JXNcbiIsIHkpOyB9CisgIFBGIChGX1JFTEZMRywgInJlbG9jYXRpb25zIHN0cmlwcGVkIik7CisgIFBGIChGX0VYRUMsICJleGVjdXRhYmxlIik7CisgIFBGIChGX0xOTk8sICJsaW5lIG51bWJlcnMgc3RyaXBwZWQiKTsKKyAgUEYgKEZfTFNZTVMsICJzeW1ib2xzIHN0cmlwcGVkIik7CisgIFBGICgweDgwLCAibGl0dGxlIGVuZGlhbiIpOworICBQRiAoRl9BUjMyV1IsICIzMiBiaXQgd29yZHMiKTsKKyAgUEYgKDB4MjAwLCAiZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlbW92ZWQiKTsKKyAgUEYgKDB4MTAwMCwgInN5c3RlbSBmaWxlIik7CisgIFBGIChGX0RMTCwgIkRMTCIpOworICBQRiAoMHg4MDAwLCAiYmlnIGVuZGlhbiIpOworI3VuZGVmIFBGCisKKyAgZnByaW50ZiAoZmlsZSwiXG5JbWFnZUJhc2VcdFx0Iik7CisgIGZwcmludGZfdm1hIChmaWxlLCBpLT5JbWFnZUJhc2UpOworICBmcHJpbnRmIChmaWxlLCJcblNlY3Rpb25BbGlnbm1lbnRcdCIpOworICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2VjdGlvbkFsaWdubWVudCk7CisgIGZwcmludGYgKGZpbGUsIlxuRmlsZUFsaWdubWVudFx0XHQiKTsKKyAgZnByaW50Zl92bWEgKGZpbGUsIGktPkZpbGVBbGlnbm1lbnQpOworICBmcHJpbnRmIChmaWxlLCJcbk1ham9yT1N5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOworICBmcHJpbnRmIChmaWxlLCJNaW5vck9TeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKKyAgZnByaW50ZiAoZmlsZSwiTWFqb3JJbWFnZVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvckltYWdlVmVyc2lvbik7CisgIGZwcmludGYgKGZpbGUsIk1pbm9ySW1hZ2VWZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JJbWFnZVZlcnNpb24pOworICBmcHJpbnRmIChmaWxlLCJNYWpvclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOworICBmcHJpbnRmIChmaWxlLCJNaW5vclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOworICBmcHJpbnRmIChmaWxlLCJSZXNlcnZlZDFcdFx0JTA4bHhcbiIsIGktPlJlc2VydmVkMSk7CisgIGZwcmludGYgKGZpbGUsIlNpemVPZkltYWdlXHRcdCUwOGx4XG4iLCBpLT5TaXplT2ZJbWFnZSk7CisgIGZwcmludGYgKGZpbGUsIlNpemVPZkhlYWRlcnNcdFx0JTA4bHhcbiIsIGktPlNpemVPZkhlYWRlcnMpOworICBmcHJpbnRmIChmaWxlLCJDaGVja1N1bVx0XHQlMDhseFxuIiwgaS0+Q2hlY2tTdW0pOworICBmcHJpbnRmIChmaWxlLCJTdWJzeXN0ZW1cdFx0JTA4eFxuIiwgaS0+U3Vic3lzdGVtKTsKKyAgZnByaW50ZiAoZmlsZSwiRGxsQ2hhcmFjdGVyaXN0aWNzXHQlMDh4XG4iLCBpLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOworICBmcHJpbnRmIChmaWxlLCJTaXplT2ZTdGFja1Jlc2VydmVcdCIpOworICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKKyAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZTdGFja0NvbW1pdFx0Iik7CisgIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja0NvbW1pdCk7CisgIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcFJlc2VydmVcdCIpOworICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcFJlc2VydmUpOworICBmcHJpbnRmIChmaWxlLCJcblNpemVPZkhlYXBDb21taXRcdCIpOworICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcENvbW1pdCk7CisgIGZwcmludGYgKGZpbGUsIlxuTG9hZGVyRmxhZ3NcdFx0JTA4bHhcbiIsIGktPkxvYWRlckZsYWdzKTsKKyAgZnByaW50ZiAoZmlsZSwiTnVtYmVyT2ZSdmFBbmRTaXplc1x0JTA4bHhcbiIsIGktPk51bWJlck9mUnZhQW5kU2l6ZXMpOworCisgIGZwcmludGYgKGZpbGUsIlxuVGhlIERhdGEgRGlyZWN0b3J5XG4iKTsKKyAgZm9yIChqID0gMDsgaiA8IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOyBqKyspIAorICAgIHsKKyAgICAgIGZwcmludGYgKGZpbGUsICJFbnRyeSAlMXggIiwgaik7CisgICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+RGF0YURpcmVjdG9yeVtqXS5WaXJ0dWFsQWRkcmVzcyk7CisgICAgICBmcHJpbnRmIChmaWxlLCAiICUwOGx4ICIsIGktPkRhdGFEaXJlY3Rvcnlbal0uU2l6ZSk7CisgICAgICBmcHJpbnRmIChmaWxlLCAiJXNcbiIsIGRpcl9uYW1lc1tqXSk7CisgICAgfQorCisgIHBlX3ByaW50X2lkYXRhIChhYmZkLCB2ZmlsZSk7CisgIHBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSk7CisgIHBlX3ByaW50X3BkYXRhIChhYmZkLCB2ZmlsZSk7CisgIHBlX3ByaW50X3JlbG9jIChhYmZkLCB2ZmlsZSk7CisKKyAgaWYgKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcHV0YyAoJ1xuJywgZmlsZSk7CisgIAorICAgICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHZmaWxlKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitwZV9ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICogYWJmZDsKK3sKKyAgcGVfZGF0YV90eXBlICpwZTsKKyAgYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPSAKKyAgICAoc3RydWN0IHBlX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocGVfZGF0YV90eXBlKSk7CisKKyAgaWYgKGFiZmQtPnRkYXRhLnBlX29ial9kYXRhID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBlID0gcGVfZGF0YSAoYWJmZCk7CisKKyAgcGUtPmNvZmYucGUgPSAxOworICBwZS0+aW5fcmVsb2NfcCA9IGluX3JlbG9jX3A7CisgIHJldHVybiB0cnVlOworfQorCisvKiBDcmVhdGUgdGhlIENPRkYgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCitzdGF0aWMgUFRSCitwZV9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQorICAgICBiZmQgKiBhYmZkOworICAgICBQVFIgZmlsZWhkcjsKKyAgICAgUFRSIGFvdXRoZHI7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7CisgIHBlX2RhdGFfdHlwZSAqcGU7CisKKyAgaWYgKHBlX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKKyAgICByZXR1cm4gTlVMTDsKKworICBwZSA9IHBlX2RhdGEgKGFiZmQpOworICBwZS0+Y29mZi5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOworICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbAorICAgICB0YWJsZSB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycKKyAgICAgdW5mb3J0dW5hdGVseSB2YXJ5IGFtb25nIGNvZmYgaW1wbGVtZW50YXRpb25zLi4uICAqLworICBwZS0+Y29mZi5sb2NhbF9uX2J0bWFzayA9IE5fQlRNQVNLOworICBwZS0+Y29mZi5sb2NhbF9uX2J0c2hmdCA9IE5fQlRTSEZUOworICBwZS0+Y29mZi5sb2NhbF9uX3RtYXNrID0gTl9UTUFTSzsKKyAgcGUtPmNvZmYubG9jYWxfbl90c2hpZnQgPSBOX1RTSElGVDsKKyAgcGUtPmNvZmYubG9jYWxfc3ltZXN6ID0gU1lNRVNaOworICBwZS0+Y29mZi5sb2NhbF9hdXhlc3ogPSBBVVhFU1o7CisgIHBlLT5jb2ZmLmxvY2FsX2xpbmVzeiA9IExJTkVTWjsKKworICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPQorICAgIG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpID0KKyAgICAgIGludGVybmFsX2YtPmZfbnN5bXM7CisKKyAgcGUtPnJlYWxfZmxhZ3MgPSBpbnRlcm5hbF9mLT5mX2ZsYWdzOworCisgIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRExMKSAhPSAwKQorICAgIHBlLT5kbGwgPSAxOworCisjaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCisgIGlmIChhb3V0aGRyKSAKKyAgICBwZS0+cGVfb3B0aGRyID0gKChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHIpLT5wZTsKKyNlbmRpZgorCisjaWZkZWYgQVJNIAorICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKKyAgICBjb2ZmX2RhdGEgKGFiZmQpIC0+ZmxhZ3MgPSAwOworI2VuZGlmCisgIAorICByZXR1cm4gKFBUUikgcGU7Cit9CisKKworCisvKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKKyAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KKworI2lmZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQorc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCisgICAgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpCisgICAgID0gY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhOworI3VuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQorI2Vsc2UKK3N0YXRpYyBib29sZWFuICgqcGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQorICAgICBQQVJBTVMgKChiZmQgKiwgYmZkICopKQorICAgICA9IE5VTEw7CisjZW5kaWYKKyNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKKworc3RhdGljIGJvb2xlYW4KK3BlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCisgICAgIGJmZCAqaWJmZCwgKm9iZmQ7Cit7CisgIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCisgIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCisgICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorICAgIHJldHVybiB0cnVlOworCisgIHBlX2RhdGEgKG9iZmQpLT5wZV9vcHRoZHIgPSBwZV9kYXRhIChpYmZkKS0+cGVfb3B0aGRyOworICBwZV9kYXRhIChvYmZkKS0+ZGxsID0gcGVfZGF0YSAoaWJmZCktPmRsbDsKKworICBpZiAocGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQorICAgIHJldHVybiBwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpOworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKworLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gICovCisKKyNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQorCitzdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQorICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKKworc3RhdGljIGJvb2xlYW4KK3BlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQorICAgICBiZmQgKmliZmQ7CisgICAgIGFzZWN0aW9uICppc2VjOworICAgICBiZmQgKm9iZmQ7CisgICAgIGFzZWN0aW9uICpvc2VjOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgorICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwKKyAgICAgICYmIHBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQorCXsKKwkgIG9zZWMtPnVzZWRfYnlfYmZkID0KKwkgICAgKFBUUikgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7CisJICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQorCXsKKwkgIGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPQorCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOworCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT52aXJ0X3NpemUgPQorCXBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpLT52aXJ0X3NpemU7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9wby9NYWtlLWluIGIvYmZkL3BvL01ha2UtaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1MmRiMQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wby9NYWtlLWluCkBAIC0wLDAgKzEsMjUxIEBACisjIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCitQQUNLQUdFID0gQFBBQ0tBR0VACitWRVJTSU9OID0gQFZFUlNJT05ACisKK1NIRUxMID0gL2Jpbi9zaAorQFNFVF9NQUtFQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitkYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KK3N1YmRpciA9IHBvCisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACisKK0NDID0gQENDQAorR0VOQ0FUID0gQEdFTkNBVEAKK0dNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACitNU0dGTVQgPSBATVNHRk1UQAorWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAorTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKKworREVGUyA9IEBERUZTQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorCitJTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKKworQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKKworU09VUkNFUyA9IGNhdC1pZC10YmwuYworUE9GSUxFUyA9IEBQT0ZJTEVTQAorR01PRklMRVMgPSBAR01PRklMRVNACitESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAorc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQorCitQT1RGSUxFUyA9IFwKKworQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAorCisuYy5vOgorCSQoQ09NUElMRSkgJDwKKworLnBvLnBveDoKKwkkKE1BS0UpICQoUEFDS0FHRSkucG90CisJJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAorCisucG8ubW86CisJJChNU0dGTVQpIC1vICRAICQ8CisKKy5wby5nbW86CisJZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAorCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8CisKKy5wby5jYXQ6CisJc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKKwkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKKworCithbGw6IGFsbC1AVVNFX05MU0AKKworYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAorYWxsLW5vOgorCiskKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCisJJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAorCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKKwkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KKwlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKKwltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAorCiskKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6CiskKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAorCXJtIC1mIGNhdC1pZC10YmwudG1wCisJc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAorCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAorCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKKwkgIHJtIGNhdC1pZC10YmwudG1wOyBcCisJZWxzZSBcCisJICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCisJICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCisJICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCisJZmkKKwljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCisKKworaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQoraW5zdGFsbC1leGVjOgoraW5zdGFsbC1pbmZvOgoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACitpbnN0YWxsLWRhdGEtbm86IGFsbAoraW5zdGFsbC1kYXRhLXllczogYWxsCisJaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAorCWVsc2UgXAorCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKKwlmaQorCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAorCSAgY2FzZSAiJCRjYXQiIGluIFwKKwkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAorCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCisJICBlc2FjOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCisJICBlbHNlIFwKKwkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAorCSAgZWxzZSBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKKwkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAorCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKKwkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHRydWU7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZG9uZQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCisJICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCisJICBmaTsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCisJCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKworIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgoraW5zdGFsbGNoZWNrOgorCit1bmluc3RhbGw6CisJY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAorCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCisJICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKKwlkb25lCisJcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgorCitjaGVjazogYWxsCisKK2NhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKKworZHZpIGluZm8gdGFncyBUQUdTIElEOgorCittb3N0bHljbGVhbjoKKwlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCisJcm0gLWZyICoubworCitjbGVhbjogbW9zdGx5Y2xlYW4KKworZGlzdGNsZWFuOiBjbGVhbgorCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQorCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwlybSAtZiAkKEdNT0ZJTEVTKQorCitkaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCisJZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCisJZG9uZQorCit1cGRhdGUtcG86IE1ha2VmaWxlCisJJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAorCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAorCWNkICQoc3JjZGlyKTsgXAorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCisJICBlY2hvICIkJGxhbmc6IjsgXAorCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAorCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCisJICAgIHJtIC1mICQkbGFuZy5wbzsgXAorCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAorCSAgZmk7IFwKKwlkb25lCisKK1BPVEZJTEVTOiBQT1RGSUxFUy5pbgorCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCisJICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKKwkgIGVsc2UgXAorCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAorCSAgZmk7IFwKKwkgIHJtIC1mICRALXQgJEAgXAorCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCisJCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKKwkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAorCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCisJICAgICYmIG12ICRALXQgJEAgKQorCitQT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQorCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KKworTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUworCWNkIC4uIFwKKwkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAorCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iZmQvcG8vUE9URklMRVMuaW4gYi9iZmQvcG8vUE9URklMRVMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0OTk2NgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wby9QT1RGSUxFUy5pbgpAQCAtMCwwICsxLDI2NCBAQAorYXJjaHVyZXMuYworYmZkLWluMi5oCithaXgzODYtY29yZS5jCithb3V0LWFkb2JlLmMKK2FvdXQtYXJtLmMKK2FvdXQtZW5jYXAuYworYW91dC1uczMyay5jCithb3V0LXNwYXJjbGUuYworYW91dC10YXJnZXQuaAorYW91dC10aWMzMC5jCithb3V0MC5jCithb3V0MzIuYworYW91dDY0LmMKK2FvdXRmMS5oCithb3V0eC5oCithcmNoaXZlLmMKK2JmZC1pbi5oCitiZmQuYworYmluYXJ5LmMKK2JvdXQuYworY2FjaGUuYworY2YtaTM4Nmx5bnguYworY2YtbTY4a2x5bnguYworY2Ytc3BhcmNseW54LmMKK2Npc2NvLWNvcmUuYworY29mZi1hMjlrLmMKK2NvZmYtYWxwaGEuYworY29mZi1hcG9sbG8uYworY29mZi1hcm0uYworY29mZi1hdXguYworY29mZi1nbzMyLmMKK2NvZmYtaDgzMDAuYworY29mZi1oODUwMC5jCitjb2ZmLWkzODYuYworY29mZi1pODYwLmMKK2NvZmYtaTk2MC5jCitjb2ZmLW02OGsuYworY29mZi1tODhrLmMKK2NvZmYtbWNvcmUuYworY29mZi1taXBzLmMKK2NvZmYtcG1hYy5jCitjb2ZmLXBwYy5jCitjb2ZmLXJzNjAwMC5jCitjb2ZmLXNoLmMKK2NvZmYtc3BhcmMuYworY29mZi1zdGdvMzIuYworY29mZi1zdm02OGsuYworY29mZi10aWMzMC5jCitjb2ZmLXRpYzgwLmMKK2NvZmYtdTY4ay5jCitjb2ZmLXc2NS5jCitjb2ZmLXdlMzJrLmMKK2NvZmYtejhrLmMKK2NvZmZjb2RlLmgKK2NvZmZnZW4uYworY29mZmxpbmsuYworY29mZnN3YXAuaAorY3B1LW0xMDMwMC5jCitjcHUtbTMyci5jCitjcHUtbWlwcy5jCitjb3JlZmlsZS5jCitjcHUtYTI5ay5jCitjcHUtYWxwaGEuYworY3B1LWFyYy5jCitjcHUtYXJtLmMKK2NwdS1kMTB2LmMKK2NwdS1kMzB2LmMKK2NwdS1mcjMwLmMKK2NwdS1oODMwMC5jCitjcHUtaDg1MDAuYworY3B1LWhwcGEuYworY3B1LWkzODYuYworY3B1LWk4NjAuYworY3B1LWk5NjAuYworY3B1LW0xMDIwMC5jCitjcHUtc2guYworZWxmLW0xMDMwMC5jCitjcHUtbTY4ay5jCitjcHUtbTg4ay5jCitjcHUtbWNvcmUuYworZWxmMzItbTMyci5jCitjcHUtbnMzMmsuYworY3B1LXBvd2VycGMuYworY3B1LXJzNjAwMC5jCitsaWJiZmQuaAorY3B1LXNwYXJjLmMKK2NwdS10aWMzMC5jCitjcHUtdGljODAuYworY3B1LXY4NTAuYworY3B1LXZheC5jCitlbGYzMi1taXBzLmMKK2NwdS13NjUuYworY3B1LXdlMzJrLmMKK2NwdS16OGsuYworZGVtbzY0LmMKK2R3YXJmMS5jCitkd2FyZjIuYworZWNvZmYuYworZWNvZmZsaW5rLmMKK2Vjb2Zmc3dhcC5oCitlbGYtYmZkLmgKK2VsZi1tMTAyMDAuYworbGliaHBwYS5oCitlbGYuYworZWxmMzItYXJjLmMKK2VsZjMyLWFybS5oCitlbGYzMi1kMTB2LmMKK2VsZjMyLWQzMHYuYworZWxmMzItZnIzMC5jCitlbGYzMi1nZW4uYworZWxmMzItaHBwYS5jCitlbGYzMi1ocHBhLmgKK2VsZjMyLWkzODYuYworZWxmMzItaTg2MC5jCityZWxvYy5jCitlbGYzMi1tNjhrLmMKK2VsZjMyLW04OGsuYworZWxmMzItbWNvcmUuYwordGFyZ2V0cy5jCitlbGYzMi1wcGMuYworZWxmMzItc2guYworZWxmMzItc3BhcmMuYworZWxmMzItdjg1MC5jCitlbGYzMi5jCitlbGY2NC1hbHBoYS5jCitlbGY2NC1nZW4uYworZWxmNjQtbWlwcy5jCitlbGY2NC1zcGFyYy5jCitlbGY2NC5jCitlbGZhcm0tbmFiaS5jCitlbGZhcm0tb2FiaS5jCitlbGZjb2RlLmgKK2VsZmNvcmUuaAorZWxmbGluay5jCitlbGZsaW5rLmgKK2VsZnh4LXRhcmdldC5oCitlcG9jLXBlLWFybS5jCitlcG9jLXBlaS1hcm0uYworZm9ybWF0LmMKK2ZyZWVic2QuaAorZ2VuLWFvdXQuYworZ2VubGluay5oCitnbzMyc3R1Yi5oCitoYXNoLmMKK2hvc3QtYW91dC5jCitocDMwMGJzZC5jCitocDMwMGhwdXguYworaHBwYV9zdHVicy5oCitocHBhYnNkLWNvcmUuYworaHB1eC1jb3JlLmMKK2kzODZhb3V0LmMKK2kzODZic2QuYworaTM4NmR5bml4LmMKK2kzODZmcmVlYnNkLmMKK2kzODZsaW51eC5jCitpMzg2bHlueC5jCitpMzg2bWFjaDMuYworaTM4Nm1zZG9zLmMKK2kzODZuZXRic2QuYworaTM4Nm9zOWsuYworaWVlZS5jCitpaGV4LmMKK2luaXQuYworaXJpeC1jb3JlLmMKK2xpYmFvdXQuaAorbGliYmZkLWluLmgKK2xpYmJmZC5jCitsaWJjb2ZmLWluLmgKK2xpYmNvZmYuaAorbGliZWNvZmYuaAorbGliaWVlZS5oCitsaWJubG0uaAorbGlib2FzeXMuaAorbGlua2VyLmMKK2x5bngtY29yZS5jCittNjhrNGtuZXRic2QuYworbTY4a2xpbnV4LmMKK202OGtseW54LmMKK202OGtuZXRic2QuYworZG9jL2NoZXcuYworbTg4a21hY2gzLmMKK21pcHNic2QuYworbmV0YnNkLWNvcmUuYworbmV0YnNkLmgKK25ld3NvczMuYworbmxtLXRhcmdldC5oCitubG0uYworbmxtMzItYWxwaGEuYworbmxtMzItaTM4Ni5jCitubG0zMi1wcGMuYworbmxtMzItc3BhcmMuYworbmxtMzIuYworbmxtNjQuYworbmxtY29kZS5oCitubG1zd2FwLmgKK25zMzJrLmgKK25zMzJrbmV0YnNkLmMKK29hc3lzLmMKK29wbmNscy5jCitvc2YtY29yZS5jCitwYzUzMi1tYWNoLmMKK3BlLWFybS5jCitwZS1pMzg2LmMKK3BlLW1jb3JlLmMKK3BlLXBwYy5jCitwZWktYXJtLmMKK3BlaS1pMzg2LmMKK3BlaS1tY29yZS5jCitwZWktcHBjLmMKK3BlaWNvZGUuaAorcHBjYm9vdC5jCitwdHJhY2UtY29yZS5jCityZWxvYzE2LmMKK3Jpc2NpeC5jCityczYwMDAtY29yZS5jCitzY281LWNvcmUuYworc2VjdGlvbi5jCitzb20uYworc29tLmgKK3NwYXJjbGludXguYworc3BhcmNseW54LmMKK3NwYXJjbmV0YnNkLmMKK3NyZWMuYworc3RhYi1zeW1zLmMKK3N0YWJzLmMKK3N1bm9zLmMKK3N5bXMuYworc3lzZGVwLmgKK3Rla2hleC5jCit0cmFkLWNvcmUuYwordmF4bmV0YnNkLmMKK3ZlcnNhZG9zLmMKK3Ztcy1nc2QuYwordm1zLWhkci5jCit2bXMtbWlzYy5jCit2bXMtdGlyLmMKK3Ztcy5jCit2bXMuaAoreGNvZmZsaW5rLmMKK2hvc3RzL2FscGhhbGludXguaAoraG9zdHMvYWxwaGF2bXMuaAoraG9zdHMvZGVjc3RhdGlvbi5oCitob3N0cy9kZWx0YTY4LmgKK2hvc3RzL2RweDIuaAoraG9zdHMvaHAzMDBic2QuaAoraG9zdHMvaTM4NmJzZC5oCitob3N0cy9pMzg2bGludXguaAoraG9zdHMvaTM4Nm1hY2gzLmgKK2hvc3RzL2kzODZzY28uaAoraG9zdHMvaTg2MG1hY2gzLmgKK2hvc3RzL202OGthdXguaAoraG9zdHMvbTY4a2xpbnV4LmgKK2hvc3RzL204OGttYWNoMy5oCitob3N0cy9taXBzYnNkLmgKK2hvc3RzL21pcHNtYWNoMy5oCitob3N0cy9uZXdzLW1pcHMuaAoraG9zdHMvbmV3cy5oCitob3N0cy9wYzUzMm1hY2guaAoraG9zdHMvcmlzY29zLmgKK2hvc3RzL3N5bW1ldHJ5LmgKK2hvc3RzL3RhaG9lLmgKK2hvc3RzL3ZheGJzZC5oCitob3N0cy92YXh1bHQuaAoraG9zdHMvdmF4dWx0Mi5oCmRpZmYgLS1naXQgYS9iZmQvcG8vYmZkLnBvdCBiL2JmZC9wby9iZmQucG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZmZiYjQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcG8vYmZkLnBvdApAQCAtMCwwICsxLDYzMiBAQAorIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgorIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCisjCisjLCBmdXp6eQorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDQtMTggMTg6MjYtMDQwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgorIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgorIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCisKKyM6IGFvdXQtYWRvYmUuYzoxODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IFVua25vd24gc2VjdGlvbiB0eXBlIGluIGEub3V0LmFkb2JlIGZpbGU6ICV4XG4iCittc2dzdHIgIiIKKworIzogYW91dHguaDoxMjM3IGFvdXR4Lmg6MTY1MQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIKK21zZ3N0ciAiIgorCisjOiBhb3V0eC5oOjE2MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGZvciBzeW1ib2wgYCVzJyBpbiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQiCittc2dzdHIgIiIKKworIzogYW91dHguaDoxNjIzCittc2dpZCAiKnVua25vd24qIgorbXNnc3RyICIiCisKKyM6IGFvdXR4Lmg6MzY2NworIywgYy1mb3JtYXQKK21zZ2lkICIlczogcmVsb2NhdGVhYmxlIGxpbmsgZnJvbSAlcyB0byAlcyBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICIiCisKKyM6IGFyY2hpdmUuYzoxNzE2Cittc2dpZCAiV2FybmluZzogd3JpdGluZyBhcmNoaXZlIHdhcyBzbG93OiByZXdyaXRpbmcgdGltZXN0YW1wXG4iCittc2dzdHIgIiIKKworIzogYXJjaGl2ZS5jOjE5ODcKK21zZ2lkICJSZWFkaW5nIGFyY2hpdmUgZmlsZSBtb2QgdGltZXN0YW1wIgorbXNnc3RyICIiCisKKyMuIEZJWE1FOiBiZmQgY2FuJ3QgY2FsbCBwZXJyb3IuCisjOiBhcmNoaXZlLmM6MjAxMQorbXNnaWQgIldyaXRpbmcgdXBkYXRlZCBhcm1hcCB0aW1lc3RhbXAiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjc0Cittc2dpZCAiTm8gZXJyb3IiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjc1Cittc2dpZCAiU3lzdGVtIGNhbGwgZXJyb3IiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjc2Cittc2dpZCAiSW52YWxpZCBiZmQgdGFyZ2V0IgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI3NworbXNnaWQgIkZpbGUgaW4gd3JvbmcgZm9ybWF0IgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI3OAorbXNnaWQgIkludmFsaWQgb3BlcmF0aW9uIgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI3OQorbXNnaWQgIk1lbW9yeSBleGhhdXN0ZWQiCittc2dzdHIgIiIKKworIzogYmZkLmM6MjgwCittc2dpZCAiTm8gc3ltYm9scyIKK21zZ3N0ciAiIgorCisjOiBiZmQuYzoyODEKK21zZ2lkICJBcmNoaXZlIGhhcyBubyBpbmRleDsgcnVuIHJhbmxpYiB0byBhZGQgb25lIgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI4MgorbXNnaWQgIk5vIG1vcmUgYXJjaGl2ZWQgZmlsZXMiCittc2dzdHIgIiIKKworIzogYmZkLmM6MjgzCittc2dpZCAiTWFsZm9ybWVkIGFyY2hpdmUiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjg0Cittc2dpZCAiRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjg1Cittc2dpZCAiRmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzIgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI4NgorbXNnaWQgIlNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI4NworbXNnaWQgIk5vbnJlcHJlc2VudGFibGUgc2VjdGlvbiBvbiBvdXRwdXQiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjg4Cittc2dpZCAiU3ltYm9sIG5lZWRzIGRlYnVnIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgZXhpc3QiCittc2dzdHIgIiIKKworIzogYmZkLmM6Mjg5Cittc2dpZCAiQmFkIHZhbHVlIgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI5MAorbXNnaWQgIkZpbGUgdHJ1bmNhdGVkIgorbXNnc3RyICIiCisKKyM6IGJmZC5jOjI5MQorbXNnaWQgIkZpbGUgdG9vIGJpZyIKK21zZ3N0ciAiIgorCisjOiBiZmQuYzoyOTIKK21zZ2lkICIjPEludmFsaWQgZXJyb3IgY29kZT4iCittc2dzdHIgIiIKKworIzogYmZkLmM6Njc5CisjLCBjLWZvcm1hdAorbXNnaWQgImJmZCBhc3NlcnRpb24gZmFpbCAlczolZCIKK21zZ3N0ciAiIgorCisjOiBiaW5hcnkuYzoyOTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogV3JpdGluZyBzZWN0aW9uIGAlcycgdG8gaHVnZSAoaWUgbmVnYXRpdmUpIGZpbGUgb2Zmc2V0IDB4JWx4LiIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLWEyOWsuYzoxMjEKK21zZ2lkICJNaXNzaW5nIElIQ09OU1QiCittc2dzdHIgIiIKKworIzogY29mZi1hMjlrLmM6MTgxCittc2dpZCAiTWlzc2luZyBJSElIQUxGIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYTI5ay5jOjIxMworbXNnaWQgIlVucmVjb2duaXplZCByZWxvYyIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLWEyOWsuYzo0MDYKK21zZ2lkICJtaXNzaW5nIElIQ09OU1QgcmVsb2MiCittc2dzdHIgIiIKKworIzogY29mZi1hMjlrLmM6NDk3Cittc2dpZCAibWlzc2luZyBJSElIQUxGIHJlbG9jIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYWxwaGEuYzo4ODAgY29mZi1hbHBoYS5jOjkxNworbXNnaWQgIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYWxwaGEuYzoxNDg2IGVsZjY0LWFscGhhLmM6NDA1MQorbXNnaWQgInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLWFscGhhLmM6MTk5MiBjb2ZmLW1pcHMuYzoxNDM1IGVsZjMyLW1pcHMuYzo1MTc1Cittc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6ODg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzo5MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVuYWJsZSB0byBmaW5kIEFSTSBnbHVlICclcycgZm9yIGAlcyciCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoxMTkyIGNvZmYtYXJtLmM6MTI4NgorIywgYy1mb3JtYXQKK21zZ2lkICIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoxMTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IGFybSBjYWxsIHRvIHRodW1iIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MTI5MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLWFybS5jOjEyOTMKK21zZ2lkICIgIGNvbnNpZGVyIHJlbGlua2luZyB3aXRoIC0tc3VwcG9ydC1vbGQtY29kZSBlbmFibGVkIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MTU4MSBjb2ZmLXRpYzgwLmM6NjgyIGNvZmZsaW5rLmM6MjcyMgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogYmFkIHJlbG9jIGFkZHJlc3MgMHglbHggaW4gc2VjdGlvbiBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjAzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogRVJST1I6IGNvbXBpbGVkIGZvciBBUENTLSVkIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgQVBDUy0lZCIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLWFybS5jOjIwNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBmbG9hdCByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBpbnRlZ2VyICIKKyJyZWdpc3RlcnMiCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMDU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIlczogRVJST1I6IHBhc3NlcyBmbG9hdHMgaW4gaW50ZWdlciByZWdpc3RlcnMgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBmbG9hdCAiCisicmVnaXN0ZXJzIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjA2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyAiCisiYWJzb2x1dGUgcG9zaXRpb24iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMDcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIlczogRVJST1I6IGNvbXBpbGVkIGFzIGFic29sdXRlIHBvc2l0aW9uIGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzIHBvc2l0aW9uICIKKyJpbmRlcGVuZGVudCIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLWFybS5jOjIxMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogaW5wdXQgZmlsZSAlcyBzdXBwb3J0cyBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcyBub3QuIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMuIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjEzMgorIywgYy1mb3JtYXQKK21zZ2lkICJwcml2YXRlIGZsYWdzID0gJXg6IgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjE0MAorbXNnaWQgIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjE0MgorbXNnaWQgIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMTQ1Cittc2dpZCAiIFtwb3NpdGlvbiBpbmRlcGVuZGVudF0iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMTQ3Cittc2dpZCAiIFthYnNvbHV0ZSBwb3NpdGlvbl0iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMTUxCittc2dpZCAiIFtpbnRlcndvcmtpbmcgZmxhZyBub3QgaW5pdGlhbGlzZWRdIgorbXNnc3RyICIiCisKKyM6IGNvZmYtYXJtLmM6MjE1MworbXNnaWQgIiBbaW50ZXJ3b3JraW5nIHN1cHBvcnRlZF0iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMTU1Cittc2dpZCAiIFtpbnRlcndvcmtpbmcgbm90IHN1cHBvcnRlZF0iCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMjA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJXYXJuaW5nOiBOb3Qgc2V0dGluZyBpbnRlcndvcmtpbmcgZmxhZyBvZiAlcywgc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiAiCisic3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciCittc2dzdHIgIiIKKworIzogY29mZi1hcm0uYzoyMjA4CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IENsZWFyaW5nIHRoZSBpbnRlcndvcmtpbmcgZmxhZyBvZiAlcyBkdWUgdG8gb3V0c2lkZSByZXF1ZXN0IgorbXNnc3RyICIiCisKKyM6IGNvZmYtaTk2MC5jOjEzNSBjb2ZmLWk5NjAuYzo0ODQKK21zZ2lkICJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiCittc2dzdHIgIiIKKworIzogY29mZi1taXBzLmM6ODc1IGVsZjMyLW1pcHMuYzoxMTgzCittc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLW1pcHMuYzoyNDMzCittc2dpZCAidW5zdXBwb3J0ZWQgcmVsb2MgdHlwZSIKK21zZ3N0ciAiIgorCisjLiBObyBvdGhlciBzZWN0aW9ucyBzaG91bGQgYXBwZWFyIGluIC1tZW1iZWRkZWQtcGljCisjLiBjb2RlLgorIzogY29mZi1taXBzLmM6MjQ3MAorbXNnaWQgInJlbG9jIGFnYWluc3QgdW5zdXBwb3J0ZWQgc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb2ZmLW1pcHMuYzoyNDc4Cittc2dpZCAicmVsb2Mgbm90IHByb3Blcmx5IGFsaWduZWQiCittc2dzdHIgIiIKKworIzogY29mZi10aWM4MC5jOjQ0NQorIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbml6ZWQgcmVsb2MgdHlwZSAweCV4IgorbXNnc3RyICIiCisKKyM6IGNvZmYtdzY1LmM6MzgzCisjLCBjLWZvcm1hdAorbXNnaWQgImlnbm9yaW5nIHJlbG9jICVzXG4iCittc2dzdHIgIiIKKworIzogY29mZmNvZGUuaDozNDEzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIgorbXNnc3RyICIiCisKKyM6IGNvZmZjb2RlLmg6MzQyNworIywgYy1mb3JtYXQKK21zZ2lkICIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvZmZjb2RlLmg6Mzc0OAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogVW5yZWNvZ25pemVkIHN0b3JhZ2UgY2xhc3MgJWQgZm9yICVzIHN5bWJvbCBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvZmZjb2RlLmg6MzkzMgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIKK21zZ3N0ciAiIgorCisjOiBjb2ZmY29kZS5oOjM5NzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGlsbGVnYWwgcmVsb2NhdGlvbiB0eXBlICVkIGF0IGFkZHJlc3MgMHglbHgiCittc2dzdHIgIiIKKworIzogY29mZmdlbi5jOjE2MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGJhZCBzdHJpbmcgdGFibGUgc2l6ZSAlbHUiCittc2dzdHIgIiIKKworIzogY29mZmxpbmsuYzo0MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogdHlwZSBvZiBzeW1ib2wgYCVzJyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgaW4gJXMiCittc2dzdHIgIiIKKworIzogY29mZmxpbmsuYzoyMDkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiByZWxvY3MgaW4gc2VjdGlvbiBgJXMnLCBidXQgaXQgaGFzIG5vIGNvbnRlbnRzIgorbXNnc3RyICIiCisKKyM6IGNvZmZzd2FwLmg6ODc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB3YXJuaW5nOiAlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIgorbXNnc3RyICIiCisKKyM6IGNvZmZzd2FwLmg6ODkyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIgorbXNnc3RyICIiCisKKyM6IGR3YXJmMi5jOjQyMAorbXNnaWQgIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4iCittc2dzdHIgIiIKKworIzogZHdhcmYyLmM6NDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIkR3YXJmIEVycm9yOiBBYmJyZXYgb2Zmc2V0ICgldSkgYmlnZ2VyIHRoYW4gYWJicmV2IHNpemUgKCV1KS4iCittc2dzdHIgIiIKKworIzogZHdhcmYyLmM6NjE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iCittc2dzdHIgIiIKKworIzogZHdhcmYyLmM6NzIwCittc2dpZCAiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2xpbmUgc2VjdGlvbi4iCittc2dzdHIgIiIKKworIzogZHdhcmYyLmM6ODgxCittc2dpZCAiRHdhcmYgRXJyb3I6IG1hbmdsZWQgbGluZSBudW1iZXIgc2VjdGlvbi4iCittc2dzdHIgIiIKKworIzogZHdhcmYyLmM6MTA1NCBkd2FyZjIuYzoxMjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIKK21zZ3N0ciAiIgorCisjOiBkd2FyZjIuYzoxMTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJEd2FyZiBFcnJvcjogZm91bmQgZHdhcmYgdmVyc2lvbiAnJWh1JywgdGhpcyByZWFkZXIgb25seSBoYW5kbGVzIHZlcnNpb24gMiAiCisiaW5mb3JtYXRpb24uIgorbXNnc3RyICIiCisKKyM6IGR3YXJmMi5jOjExNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG5vdCBoYW5kbGUgc2l6ZXMgIgorImdyZWF0ZXIgdGhhbiAnJXUnLiIKK21zZ3N0ciAiIgorCisjOiBkd2FyZjIuYzoxMTkyCisjLCBjLWZvcm1hdAorbXNnaWQgIkR3YXJmIEVycm9yOiBCYWQgYWJicmV2IG51bWJlcjogJWQuIgorbXNnc3RyICIiCisKKyM6IGVjb2ZmLmM6MTMwOAorIywgYy1mb3JtYXQKK21zZ2lkICJVbmtub3duIGJhc2ljIHR5cGUgJWQiCittc2dzdHIgIiIKKworIzogZWNvZmYuYzoxNTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICBFbmQrMSBzeW1ib2w6ICVsZCIKK21zZ3N0ciAiIgorCisjOiBlY29mZi5jOjE1ODcgZWNvZmYuYzoxNTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICBGaXJzdCBzeW1ib2w6ICVsZCIKK21zZ3N0ciAiIgorCisjOiBlY29mZi5jOjE2MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiAgICAgIEVuZCsxIHN5bWJvbDogJS03bGQgICBUeXBlOiAgJXMiCittc2dzdHIgIiIKKworIzogZWNvZmYuYzoxNjA5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICBMb2NhbCBzeW1ib2w6ICVsZCIKK21zZ3N0ciAiIgorCisjOiBlY29mZi5jOjE2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiAgICAgIHN0cnVjdDsgRW5kKzEgc3ltYm9sOiAlbGQiCittc2dzdHIgIiIKKworIzogZWNvZmYuYzoxNjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICB1bmlvbjsgRW5kKzEgc3ltYm9sOiAlbGQiCittc2dzdHIgIiIKKworIzogZWNvZmYuYzoxNjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIgICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIKK21zZ3N0ciAiIgorCisjOiBlY29mZi5jOjE2MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiAgICAgIFR5cGU6ICVzIgorbXNnc3RyICIiCisKKyM6IGVsZi1tMTAyMDAuYzo0NTUgZWxmLW0xMDMwMC5jOjY2NyBlbGYzMi1kMTB2LmM6NDkwIGVsZjMyLWZyMzAuYzo2NTAKKyM6IGVsZjMyLW0zMnIuYzoxMTU3IGVsZjMyLXY4NTAuYzoxNjc0Cittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIKK21zZ3N0ciAiIgorCisjOiBlbGYtbTEwMjAwLmM6NDU5IGVsZi1tMTAzMDAuYzo2NzEgZWxmMzItZDEwdi5jOjQ5NCBlbGYzMi1mcjMwLmM6NjU0CisjOiBlbGYzMi1tMzJyLmM6MTE2MSBlbGYzMi12ODUwLmM6MTY3OAorbXNnaWQgImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIgorbXNnc3RyICIiCisKKyM6IGVsZi1tMTAyMDAuYzo0NjMgZWxmLW0xMDMwMC5jOjY3NSBlbGYzMi1kMTB2LmM6NDk4IGVsZjMyLW0zMnIuYzoxMTY1Cittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIKK21zZ3N0ciAiIgorCisjOiBlbGYtbTEwMjAwLmM6NDY3IGVsZi1tMTAzMDAuYzo2NzkgZWxmMzItZDEwdi5jOjUwMiBlbGYzMi1mcjMwLmM6NjYyCisjOiBlbGYzMi1tMzJyLmM6MTE2OSBlbGYzMi12ODUwLmM6MTY5OAorbXNnaWQgImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjMyMAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogaW52YWxpZCBzdHJpbmcgb2Zmc2V0ICV1ID49ICVsdSBmb3Igc2VjdGlvbiBgJXMnIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjU0MworbXNnaWQgIiIKKyJcbiIKKyJQcm9ncmFtIEhlYWRlcjpcbiIKK21zZ3N0ciAiIgorCisjOiBlbGYuYzo1OTEKK21zZ2lkICIiCisiXG4iCisiRHluYW1pYyBTZWN0aW9uOlxuIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjY5MworbXNnaWQgIiIKKyJcbiIKKyJWZXJzaW9uIGRlZmluaXRpb25zOlxuIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjcxNgorbXNnaWQgIiIKKyJcbiIKKyJWZXJzaW9uIFJlZmVyZW5jZXM6XG4iCittc2dzdHIgIiIKKworIzogZWxmLmM6NzIxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgcmVxdWlyZWQgZnJvbSAlczpcbiIKK21zZ3N0ciAiIgorCisjOiBlbGYuYzoxODgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcmVhdGluZyBzZWN0aW9uIHN5bWJvbCwgbmFtZSA9ICVzLCB2YWx1ZSA9IDB4JS44bHgsIGluZGV4ID0gJWQsIHNlY3Rpb24gPSAiCisiMHglLjhseFxuIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjI0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzIChhbGxvY2F0ZWQgJXUsIG5lZWQgJXUpIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjI1ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzLCB0cnkgbGlua2luZyB3aXRoIC1OIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjI3MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3I6IEZpcnN0IHNlY3Rpb24gaW4gc2VnbWVudCAoJXMpIHN0YXJ0cyBhdCAweCV4IgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjI3MTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgICAgIHdoZXJlYXMgc2VnbWVudCBzdGFydHMgYXQgMHgleCIKK21zZ3N0ciAiIgorCisjOiBlbGYuYzoyOTgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB3YXJuaW5nOiBhbGxvY2F0ZWQgc2VjdGlvbiBgJXMnIG5vdCBpbiBzZWdtZW50IgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjMzNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHN5bWJvbCBgJXMnIHJlcXVpcmVkIGJ1dCBub3QgcHJlc2VudCIKK21zZ3N0ciAiIgorCisjOiBlbGYuYzozMzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAweCUuOGx4LCBuYW1lID0gJXMsIHN5bSBudW0gPSAlZCwgZmxhZ3MgPSAiCisiMHglLjhseCVzXG4iCittc2dzdHIgIiIKKworIzogZWxmLmM6MzUwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogd2FybmluZzogRW1wdHkgbG9hZGFibGUgc2VnbWVudCBkZXRlY3RlZFxuIgorbXNnc3RyICIiCisKKyM6IGVsZi5jOjQ3NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAlcyIKK21zZ3N0ciAiIgorCisjOiBlbGYzMi1mcjMwLmM6NjU4IGVsZjMyLXY4NTAuYzoxNjgyCittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIgorbXNnc3RyICIiCisKKyM6IGVsZjMyLWhwcGEuYzoxMjE1Cittc2dpZCAiVW5zdXBwb3J0ZWQgY2FsbCB0byBocHBhX2VsZl9yZWxvYyIKK21zZ3N0ciAiIgorCisjOiBlbGYzMi1pMzg2LmM6MTI5MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJXM6IHdhcm5pbmc6IHVucmVzb2x2YWJsZSByZWxvY2F0aW9uIGFnYWluc3Qgc3ltYm9sIGAlcycgZnJvbSAlcyBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGVsZjMyLW0zMnIuYzo4MDgKK21zZ2lkICJTREEgcmVsb2NhdGlvbiB3aGVuIF9TREFfQkFTRV8gbm90IGRlZmluZWQiCittc2dzdHIgIiIKKworIzogZWxmMzItbTMyci5jOjg5MiBlbGYzMi1wcGMuYzozMDcxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCIKK21zZ3N0ciAiIgorCisjOiBlbGYzMi1tMzJyLmM6MTEwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogVGhlIHRhcmdldCAoJXMpIG9mIGFuICVzIHJlbG9jYXRpb24gaXMgaW4gdGhlIHdyb25nIHNlY3Rpb24gKCVzKSIKK21zZ3N0ciAiIgorCisjOiBlbGYzMi1tMzJyLmM6MTkwNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIKK21zZ3N0ciAiIgorCisjOiBlbGYzMi1tMzJyLmM6MTkyOQorIywgYy1mb3JtYXQKK21zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4IgorbXNnc3RyICIiCisKKyM6IGVsZjMyLW0zMnIuYzoxOTM0Cittc2dpZCAiOiBtMzJyIGluc3RydWN0aW9ucyIKK21zZ3N0ciAiIgorCmRpZmYgLS1naXQgYS9iZmQvcHBjYm9vdC5jIGIvYmZkL3BwY2Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmRhNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL3BwY2Jvb3QuYwpAQCAtMCwwICsxLDUzNSBAQAorLyogQkZEIGJhY2stZW5kIGZvciBQUENidWcgYm9vdCByZWNvcmRzLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IE1pY2hhZWwgTWVpc3NuZXIsIEN5Z251cyBTdXBwb3J0LCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGlzIGEgQkZEIGJhY2tlbmQgd2hpY2ggbWF5IGJlIHVzZWQgdG8gd3JpdGUgUG93ZXJQQ0J1ZyBib290IG9iamVjdHMuCisgICBJdCBtYXkgb25seSBiZSB1c2VkIGZvciBvdXRwdXQsIG5vdCBpbnB1dC4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGlzIG1heQorICAgYmUgdXNlZCBhcyBhbiBvdXRwdXQgZm9ybWF0IGZvciBvYmpjb3B5IGluIG9yZGVyIHRvIGdlbmVyYXRlIHJhdyBiaW5hcnkKKyAgIGRhdGEuCisKKyAgIFRoaXMgaXMgdmVyeSBzaW1wbGUuICBUaGUgb25seSBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgcmVhbCBkYXRhCisgICB3aWxsIHN0YXJ0IGF0IHNvbWUgYWRkcmVzcyBYLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSB3aWxsIG5vdCB3YW50IHRvCisgICBpbmNsdWRlIFggemVyb2VzIGp1c3QgdG8gZ2V0IHRvIHRoYXQgcG9pbnQuICBTaW5jZSB0aGUgc3RhcnQKKyAgIGFkZHJlc3MgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0LCB3ZSB1c2UgaXQKKyAgIGluc3RlYWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgc3RhcnQgb2YKKyAgIHRoZSBmaWxlLiAgb2JqY29weSBjb29wZXJhdGVzIGJ5IHNwZWNpYWxseSBzZXR0aW5nIHRoZSBzdGFydAorICAgYWRkcmVzcyB0byB6ZXJvIGJ5IGRlZmF1bHQuICAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisvKiBQUENidWcgbG9jYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBwcGNib290X2xvY2F0aW9uIHsKKyAgYmZkX2J5dGUJaW5kOworICBiZmRfYnl0ZQloZWFkOworICBiZmRfYnl0ZQlzZWN0b3I7CisgIGJmZF9ieXRlCWN5bGluZGVyOworfSBwcGNib290X2xvY2F0aW9uX3Q7CisKKy8qIFBQQ2J1ZyBwYXJ0aXRpb24gdGFibGUgbGF5b3V0ICovCit0eXBlZGVmIHN0cnVjdCBwcGNib290X3BhcnRpdGlvbiB7CisgIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fYmVnaW47CS8qIHBhcnRpdGlvbiBiZWdpbiAqLworICBwcGNib290X2xvY2F0aW9uX3QJcGFydGl0aW9uX2VuZDsJCS8qIHBhcnRpdGlvbiBlbmQgKi8KKyAgYmZkX2J5dGUJCXNlY3Rvcl9iZWdpbls0XTsJLyogMzItYml0IHN0YXJ0IFJCQSAoemVyby1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KKyAgYmZkX2J5dGUJCXNlY3Rvcl9sZW5ndGhbNF07CS8qIDMyLWJpdCBSQkEgY291bnQgKG9uZS1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KK30gcHBjYm9vdF9wYXJ0aXRpb25fdDsKKworLyogUFBDYnVnIGJvb3QgbGF5b3V0LiAgKi8KK3R5cGVkZWYgc3RydWN0IHBwY2Jvb3RfaGRyIHsKKyAgYmZkX2J5dGUJCXBjX2NvbXBhdGliaWxpdHlbNDQ2XTsJLyogeDg2IGluc3RydWN0aW9uIGZpZWxkICovCisgIHBwY2Jvb3RfcGFydGl0aW9uX3QJcGFydGl0aW9uWzRdOwkJLyogcGFydGl0aW9uIGluZm9ybWF0aW9uICovCisgIGJmZF9ieXRlCQlzaWduYXR1cmVbMl07CQkvKiAweDU1IGFuZCAweGFhICovCisgIGJmZF9ieXRlCQllbnRyeV9vZmZzZXRbNF07CS8qIGVudHJ5IHBvaW50IG9mZnNldCwgbGl0dGxlIGVuZGlhbiAqLworICBiZmRfYnl0ZQkJbGVuZ3RoWzRdOwkJLyogbG9hZCBpbWFnZSBsZW5ndGgsIGxpdHRsZSBlbmRpYW4gKi8KKyAgYmZkX2J5dGUJCWZsYWdzOwkJCS8qIGZsYWcgZmllbGQgKi8KKyAgYmZkX2J5dGUJCW9zX2lkOwkJCS8qIE9TX0lEICovCisgIGNoYXIJCQlwYXJ0aXRpb25fbmFtZVszMl07CS8qIHBhcnRpdGlvbiBuYW1lICovCisgIGJmZF9ieXRlCQlyZXNlcnZlZDFbNDcwXTsJCS8qIHJlc2VydmVkICovCit9IHBwY2Jvb3RfaGRyX3Q7CisKKy8qIFNpZ25hdHVyZSBieXRlcyBmb3IgbGFzdCAyIGJ5dGVzIG9mIHRoZSA1MTIgYnl0ZSByZWNvcmQgKi8KKyNkZWZpbmUgU0lHTkFUVVJFMCAweDU1CisjZGVmaW5lIFNJR05BVFVSRTEgMHhhYQorCisvKiBQb3dlclBDIGJvb3QgdHlwZSAqLworI2RlZmluZSBQUENfSU5EIDB4NDEKKworLyogSW5mb3JtYXRpb24gbmVlZGVkIGZvciBwcGNib290IGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9kYXRhIHsKKyAgcHBjYm9vdF9oZHJfdAloZWFkZXI7CQkJCS8qIHJhdyBoZWFkZXIgKi8KKyAgYXNlY3Rpb24gKnNlYzsJCQkJLyogc2luZ2xlIHNlY3Rpb24gKi8KK30gcHBjYm9vdF9kYXRhX3Q7CisKKy8qIEFueSBiZmQgd2UgY3JlYXRlIGJ5IHJlYWRpbmcgYSBwcGNib290IGZpbGUgaGFzIHRocmVlIHN5bWJvbHM6CisgICBhIHN0YXJ0IHN5bWJvbCwgYW4gZW5kIHN5bWJvbCwgYW5kIGFuIGFic29sdXRlIGxlbmd0aCBzeW1ib2wuICAqLworI2RlZmluZSBQUENCT09UX1NZTVMgMworCitzdGF0aWMgYm9vbGVhbiBwcGNib290X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqcHBjYm9vdF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfYXJjaF9tYWNoCisgIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBib29sZWFuIHBwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBsb25nIHBwY2Jvb3RfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGNoYXIgKm1hbmdsZV9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKK3N0YXRpYyBsb25nIHBwY2Jvb3RfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworc3RhdGljIGFzeW1ib2wgKnBwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIHBwY2Jvb3RfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIHBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBpbnQgcHBjYm9vdF9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7CisKKyNkZWZpbmUgcHBjYm9vdF9zZXRfdGRhdGEoYWJmZCwgcHRyKSAoKGFiZmQpLT50ZGF0YS5hbnkgPSAoUFRSKSAocHRyKSkKKyNkZWZpbmUgcHBjYm9vdF9nZXRfdGRhdGEoYWJmZCkgKChwcGNib290X2RhdGFfdCAqKSAoKGFiZmQpLT50ZGF0YS5hbnkpKQorDAorLyogQ3JlYXRlIGEgcHBjYm9vdCBvYmplY3QuICBJbnZva2VkIHZpYSBiZmRfc2V0X2Zvcm1hdC4gICovCisKK3N0YXRpYyBib29sZWFuCitwcGNib290X21rb2JqZWN0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmICghcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpKQorICAgIHBwY2Jvb3Rfc2V0X3RkYXRhIChhYmZkLCBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHBwY2Jvb3RfZGF0YV90KSkpOworCisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSB0byBQb3dlclBDICovCitzdGF0aWMgYm9vbGVhbgorcHBjYm9vdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCisgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7CisKKyAgZWxzZSBpZiAoYXJjaCAhPSBiZmRfYXJjaF9wb3dlcnBjKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Cit9CisKKwwKKy8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgcHBjYm9vdCBmaWxlLCBwcm92aWRlZCB0aGUgdGFyZ2V0CisgICB3YXMgbm90IGRlZmF1bHRlZC4gIFRoYXQgaXMsIGl0IG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYXMKKyAgIGJlaW5nIHBwY2Jvb3QuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitwcGNib290X29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgIGFzZWN0aW9uICpzZWM7CisgIHBwY2Jvb3RfaGRyX3QgaGRyOworICBzaXplX3QgaTsKKyAgcHBjYm9vdF9kYXRhX3QgKnRkYXRhOworCisgIEJGRF9BU1NFUlQgKHNpemVvZiAocHBjYm9vdF9oZHJfdCkgPT0gMTAyNCk7CisKKyAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogRmluZCB0aGUgZmlsZSBzaXplLiAgKi8KKyAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKChzaXplX3QpIHN0YXRidWYuc3Rfc2l6ZSA8IHNpemVvZiAocHBjYm9vdF9oZHJfdCkpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBzaXplb2YgKGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAoaGRyKSkKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBOb3cgZG8gc29tZSBiYXNpYyBjaGVja3MuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChoZHIucGNfY29tcGF0aWJpbGl0eSk7IGkrKykKKyAgICBpZiAoaGRyLnBjX2NvbXBhdGliaWxpdHlbaV0pCisgICAgICB7CisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgaWYgKGhkci5zaWduYXR1cmVbMF0gIT0gU0lHTkFUVVJFMCB8fCBoZHIuc2lnbmF0dXJlWzFdICE9IFNJR05BVFVSRTEpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGhkci5wYXJ0aXRpb25bMF0ucGFydGl0aW9uX2VuZC5pbmQgIT0gUFBDX0lORCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhYmZkLT5zeW1jb3VudCA9IFBQQ0JPT1RfU1lNUzsKKworICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KKyAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7CisgIGlmIChzZWMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFM7CisgIHNlYy0+dm1hID0gMDsKKyAgc2VjLT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemUgLSBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOworICBzZWMtPmZpbGVwb3MgPSBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpOworCisgIHBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpOworICB0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKKyAgdGRhdGEtPnNlYyA9IHNlYzsKKyAgbWVtY3B5ICgoUFRSKSAmdGRhdGEtPmhlYWRlciwgKFBUUikgJmhkciwgc2l6ZW9mIChwcGNib290X2hkcl90KSk7CisKKyAgcHBjYm9vdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9wb3dlcnBjLCAwKTsKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKKyNkZWZpbmUgcHBjYm9vdF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKKyNkZWZpbmUgcHBjYm9vdF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKyNkZWZpbmUgcHBjYm9vdF9uZXdfc2VjdGlvbl9ob29rIF9iZmRfZ2VuZXJpY19uZXdfc2VjdGlvbl9ob29rCisKKwwKKy8qIEdldCBjb250ZW50cyBvZiB0aGUgb25seSBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BwY2Jvb3RfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQgKyBzaXplb2YocHBjYm9vdF9oZHJfdCksIFNFRUtfU0VUKSAhPSAwCisgICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisMCisvKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCisKK3N0YXRpYyBsb25nCitwcGNib290X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIChQUENCT09UX1NZTVMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKK30KKworDAorLyogQ3JlYXRlIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGJmZCdzIGZpbGVuYW1lLiAgKi8KKworc3RhdGljIGNoYXIgKgorbWFuZ2xlX25hbWUgKGFiZmQsIHN1ZmZpeCkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpzdWZmaXg7Cit7CisgIGludCBzaXplOworICBjaGFyICpidWY7CisgIGNoYXIgKnA7CisKKyAgc2l6ZSA9IChzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQorCSAgKyBzdHJsZW4gKHN1ZmZpeCkKKwkgICsgc2l6ZW9mICJfcHBjYm9vdF9fIik7CisKKyAgYnVmID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiAiIjsKKworICBzcHJpbnRmIChidWYsICJfcHBjYm9vdF8lc18lcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdWZmaXgpOworCisgIC8qIENoYW5nZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHVuZGVyc2NvcmVzLiAgKi8KKyAgZm9yIChwID0gYnVmOyAqcDsgcCsrKQorICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkpCisgICAgICAqcCA9ICdfJzsKKworICByZXR1cm4gYnVmOworfQorCisMCisvKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisKK3N0YXRpYyBsb25nCitwcGNib290X2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOworeworICBhc2VjdGlvbiAqc2VjID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpLT5zZWM7CisgIGFzeW1ib2wgKnN5bXM7CisgIHVuc2lnbmVkIGludCBpOworCisgIHN5bXMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIFBQQ0JPT1RfU1lNUyAqIHNpemVvZiAoYXN5bWJvbCkpOworICBpZiAoc3ltcyA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBTdGFydCBzeW1ib2wuICAqLworICBzeW1zWzBdLnRoZV9iZmQgPSBhYmZkOworICBzeW1zWzBdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInN0YXJ0Iik7CisgIHN5bXNbMF0udmFsdWUgPSAwOworICBzeW1zWzBdLmZsYWdzID0gQlNGX0dMT0JBTDsKKyAgc3ltc1swXS5zZWN0aW9uID0gc2VjOworICBzeW1zWzBdLnVkYXRhLnAgPSBOVUxMOworCisgIC8qIEVuZCBzeW1ib2wuICAqLworICBzeW1zWzFdLnRoZV9iZmQgPSBhYmZkOworICBzeW1zWzFdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgImVuZCIpOworICBzeW1zWzFdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7CisgIHN5bXNbMV0uZmxhZ3MgPSBCU0ZfR0xPQkFMOworICBzeW1zWzFdLnNlY3Rpb24gPSBzZWM7CisgIHN5bXNbMV0udWRhdGEucCA9IE5VTEw7CisKKyAgLyogU2l6ZSBzeW1ib2wuICAqLworICBzeW1zWzJdLnRoZV9iZmQgPSBhYmZkOworICBzeW1zWzJdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInNpemUiKTsKKyAgc3ltc1syXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOworICBzeW1zWzJdLmZsYWdzID0gQlNGX0dMT0JBTDsKKyAgc3ltc1syXS5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgc3ltc1syXS51ZGF0YS5wID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgUFBDQk9PVF9TWU1TOyBpKyspCisgICAgKmFsb2NhdGlvbisrID0gc3ltcysrOworICAqYWxvY2F0aW9uID0gTlVMTDsKKworICByZXR1cm4gUFBDQk9PVF9TWU1TOworfQorCisMCisvKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gICovCisKK3N0YXRpYyBhc3ltYm9sICoKK3BwY2Jvb3RfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Cit9CisKKwwKKyNkZWZpbmUgcHBjYm9vdF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCisKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitwcGNib290X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIHN5bWJvbF9pbmZvICpyZXQ7Cit7CisgIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOworfQorCisjZGVmaW5lIHBwY2Jvb3RfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBwcGNib290X2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubworI2RlZmluZSBwcGNib290X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIHBwY2Jvb3RfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBwcGNib290X3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgcHBjYm9vdF9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSBwcGNib290X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQorI2RlZmluZSBwcGNib290X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQorI2RlZmluZSBwcGNib290X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAorDAorLyogV3JpdGUgc2VjdGlvbiBjb250ZW50cyBvZiBhIHBwY2Jvb3QgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcGNib290X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBQVFIgZGF0YTsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Cit7CisgIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCisgICAgeworICAgICAgYmZkX3ZtYSBsb3c7CisgICAgICBhc2VjdGlvbiAqczsKKworICAgICAgLyogVGhlIGxvd2VzdCBzZWN0aW9uIFZNQSBzZXRzIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0CisgICAgICAgICBvZiB0aGUgZmlsZS4gIFdlIHVzZSB0aGUgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIG9mIGFsbCB0aGUKKyAgICAgICAgIHNlY3Rpb25zLiAgKi8KKyAgICAgIGxvdyA9IGFiZmQtPnNlY3Rpb25zLT52bWE7CisgICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9ucy0+bmV4dDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwlpZiAocy0+dm1hIDwgbG93KQorCSAgbG93ID0gcy0+dm1hOworCisgICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwlzLT5maWxlcG9zID0gcy0+dm1hIC0gbG93OworCisgICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOworfQorCisMCitzdGF0aWMgaW50CitwcGNib290X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlYzsKK3sKKyAgcmV0dXJuIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Cit9CisKKwwKKy8qIFByaW50IG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIGZhcmcpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGZhcmc7Cit7CisgIEZJTEUgKmYgPSAoRklMRSAqKWZhcmc7CisgIHBwY2Jvb3RfZGF0YV90ICp0ZGF0YSA9IHBwY2Jvb3RfZ2V0X3RkYXRhIChhYmZkKTsKKyAgbG9uZyBlbnRyeV9vZmZzZXQgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIuZW50cnlfb2Zmc2V0KTsKKyAgbG9uZyBsZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIubGVuZ3RoKTsKKyAgaW50IGk7CisKKyAgZnByaW50ZiAoZiwgXygiXG5wcGNib290IGhlYWRlcjpcbiIpKTsKKyAgZnByaW50ZiAoZiwgXygiRW50cnkgb2Zmc2V0ICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBlbnRyeV9vZmZzZXQsIGVudHJ5X29mZnNldCk7CisgIGZwcmludGYgKGYsIF8oIkxlbmd0aCAgICAgICAgICAgICAgPSAweCUuOGx4ICglbGQpXG4iKSwgbGVuZ3RoLCBsZW5ndGgpOworCisgIGlmICh0ZGF0YS0+aGVhZGVyLmZsYWdzKQorICAgIGZwcmludGYgKGYsIF8oIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIpLCB0ZGF0YS0+aGVhZGVyLmZsYWdzKTsKKworICBpZiAodGRhdGEtPmhlYWRlci5vc19pZCkKKyAgICBmcHJpbnRmIChmLCAiT1NfSUQgICAgICAgICAgICAgICA9IDB4JS4yeFxuIiwgdGRhdGEtPmhlYWRlci5vc19pZCk7CisKKyAgaWYgKHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpCisgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uIG5hbWUgICAgICA9IFwiJXNcIlxuIiksIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uX25hbWUpOworCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgbG9uZyBzZWN0b3JfYmVnaW4gID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfYmVnaW4pOworICAgICAgbG9uZyBzZWN0b3JfbGVuZ3RoID0gYmZkX2dldGxfc2lnbmVkXzMyICgoUFRSKSB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5zZWN0b3JfbGVuZ3RoKTsKKworICAgICAgLyogU2tpcCBhbGwgMCBlbnRyaWVzICovCisgICAgICBpZiAoIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQKKwkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZAorCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5zZWN0b3IKKwkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIKKwkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZAorCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZAorCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuc2VjdG9yCisJICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcgorCSAgJiYgIXNlY3Rvcl9iZWdpbiAmJiAhc2VjdG9yX2xlbmd0aCkKKwljb250aW51ZTsKKworICAgICAgZnByaW50ZiAoZiwgXygiXG5QYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAorCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaW5kLAorCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uaGVhZCwKKwkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvciwKKwkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmN5bGluZGVyKTsKKworICAgICAgZnByaW50ZiAoZiwgXygiUGFydGl0aW9uWyVkXSBlbmQgICAgPSB7IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCB9XG4iKSwgaSwKKwkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5pbmQsCisJICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaGVhZCwKKwkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IsCisJICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuY3lsaW5kZXIpOworCisgICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIHNlY3RvciA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfYmVnaW4sIHNlY3Rvcl9iZWdpbik7CisgICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIpLCBpLCBzZWN0b3JfbGVuZ3RoLCBzZWN0b3JfbGVuZ3RoKTsKKyAgICB9CisKKyAgZnByaW50ZiAoZiwgIlxuIik7CisgIHJldHVybiB0cnVlOworfQorCisMCisjZGVmaW5lIHBwY2Jvb3RfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBwcGNib290X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgcHBjYm9vdF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKKyNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBwcGNib290X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIHBwY2Jvb3RfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKKyNkZWZpbmUgcHBjYm9vdF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKyNkZWZpbmUgcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAorICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93CisKKyNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIHBwY2Jvb3RfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCisjZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCisjZGVmaW5lIHBwY2Jvb3RfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQorI2RlZmluZSBwcGNib290X2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCisjZGVmaW5lIHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdCBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCisKK2NvbnN0IGJmZF90YXJnZXQgcHBjYm9vdF92ZWMgPQoreworICAicHBjYm9vdCIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwJLyogZmxhdm91ciAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIGJ5dGVvcmRlciBpcyBiaWcgZW5kaWFuIGZvciBjb2RlICovCisgIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyX2J5dGVvcmRlciAqLworICBFWEVDX1AsCQkJLyogb2JqZWN0X2ZsYWdzICovCisgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWSB8IFNFQ19DT0RFIHwgU0VDX0RBVEEKKyAgIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMpLCAvKiBzZWN0aW9uX2ZsYWdzICovCisgIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBoZHJzICovCisgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIHBwY2Jvb3Rfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgIH0sCisgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICBiZmRfZmFsc2UsCisgICAgcHBjYm9vdF9ta29iamVjdCwKKyAgICBiZmRfZmFsc2UsCisgICAgYmZkX2ZhbHNlLAorICB9LAorICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgIGJmZF9mYWxzZSwKKyAgICBiZmRfdHJ1ZSwKKyAgICBiZmRfZmFsc2UsCisgICAgYmZkX2ZhbHNlLAorICB9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHBwY2Jvb3QpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChwcGNib290KSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHBwY2Jvb3QpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHBwY2Jvb3QpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAocHBjYm9vdCksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKHBwY2Jvb3QpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgTlVMTAorfTsKZGlmZiAtLWdpdCBhL2JmZC9wdHJhY2UtY29yZS5jIGIvYmZkL3B0cmFjZS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0ZmRiYgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9wdHJhY2UtY29yZS5jCkBAIC0wLDAgKzEsMjMwIEBACisvKiBCRkQgYmFja2VuZCBmb3IgY29yZSBmaWxlcyB3aGljaCB1c2UgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZQorICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0cmFkLWNvcmUuYyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZQorICAgb2YgQ3lnbnVzIFN1cHBvcnQuCisgICBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBieSBLZXZpbiBBLiBCdWV0dG5lci4KKyAgIChMb25ndGVybSBpdCBtYXkgYmUgYmV0dGVyIHRvIG1lcmdlIHRoaXMgZmlsZSB3aXRoIHRyYWQtY29yZS5jKQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBQVFJBQ0VfQ09SRQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorCisKK3N0cnVjdCB0cmFkX2NvcmVfc3RydWN0CisgIHsKKyAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOworICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOworICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKKyAgICBzdHJ1Y3QgcHRyYWNlX3VzZXIgdTsKKyAgfTsKKworI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKKyNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQorI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKKyNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworY29uc3QgYmZkX3RhcmdldCAqcHRyYWNlX3VuaXhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7CitjaGFyICoJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7CitpbnQJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2Jvb2xlYW4JCXB0cmFjZV91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAorCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKK3N0YXRpYyB2b2lkCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOworCisvKiBBUkdTVVNFRCAqLworY29uc3QgYmZkX3RhcmdldCAqCitwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworCit7CisgIGludCB2YWw7CisgIHN0cnVjdCBwdHJhY2VfdXNlciB1OworICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOworCisgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7CisgIGlmICh2YWwgIT0gc2l6ZW9mIHUgfHwgdS5wdF9tYWdpYyAhPSBfQkNTX1BUUkFDRV9NQUdJQyAKKyAgICAgIHx8IHUucHRfcmV2ICE9IF9CQ1NfUFRSQUNFX1JFVikKKyAgICB7CisgICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLworCisgIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbworICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCisgIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQorCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0KSk7CisKKyAgaWYgKHJhd3B0ciA9PSBOVUxMKQorICAgIHJldHVybiAwOworICAKKyAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7CisKKyAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KKworICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKKyAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KKworICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7CisgIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7CisKKyAgLyogRklYTUU6ICBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoYXJlZCBtZW1vcnksIGxpYnJhcnkgZGF0YSwgYW5kIGxpYnJhcnkKKyAgICAgdGV4dC4gIEkgZG9uJ3QgdGhpbmsgdGhhdCBhbnkgb2YgdGhlc2UgdGhpbmdzIGFyZSBzdXBwb3J0ZWQgb24gdGhlCisgICAgIHN5c3RlbSBvbiB3aGljaCBJIGFtIGRldmVsb3BpbmcgdGhpcyBmb3IgdGhvdWdoLiAqLworCisKKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOworICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7CisKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gIHUucHRfZHNpemU7CisgIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSB1LnB0X3NzaXplOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZih1KTsKKworICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSB1LnB0X29fZGF0YV9zdGFydDsKKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IFVTUlNUQUNLIC0gdS5wdF9zc2l6ZTsKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gc2l6ZW9mKHUpOwkvKiBzZWUgdHJhZC1jb3JlLmMgKi8KKworICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gKGludCkgdS5wdF9kYXRhcHRyOworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChpbnQpICh1LnB0X2RhdGFwdHIgKyB1LnB0X2RzaXplKTsKKyAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyBwdHJhY2VfdXNlciAqLworCisgIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7CisgIGFiZmQtPnNlY3Rpb25fY291bnQgPSAzOworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitjaGFyICoKK3B0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUucHRfY29tbTsKKyAgaWYgKCpjb20pCisgICAgcmV0dXJuIGNvbTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBBUkdTVVNFRCAqLworaW50CitwdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnB0X3NpZ2ZyYW1lLnNpZ19udW07Cit9CisKKy8qIEFSR1NVU0VEICovCitib29sZWFuCitwdHJhY2VfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKK3sKKyAgLyogRklYTUU6IFVzZSBwdF90aW1kYXQgZmllbGQgb2YgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSB0byBtYXRjaCAKKyAgICAgdGhlIGRhdGUgb2YgdGhlIGV4ZWN1dGFibGUgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCitzdGF0aWMgdm9pZAorc3dhcF9hYm9ydCgpCit7CisgIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLworfQorI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZQlOT19TSUdORURfR0VUIFwKKyAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKworY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWMgPQorICB7CisgICAgInRyYWQtY29yZSIsCisgICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKyAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLworICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KKyAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KKyAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KKworICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCisgICAgIHB0cmFjZV91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCisgICAgfSwKKyAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCisgICAgfSwKKyAgICAKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAocHRyYWNlX3VuaXgpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLworfTsKKworI2VuZGlmIC8qIFBUUkFDRV9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvcmVsb2MuYyBiL2JmZC9yZWxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODU4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvcmVsb2MuYwpAQCAtMCwwICsxLDI4NDIgQEAKKy8qIEJGRCBzdXBwb3J0IGZvciBoYW5kbGluZyByZWxvY2F0aW9uIGVudHJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitTRUNUSU9OCisJUmVsb2NhdGlvbnMKKworCUJGRCBtYWludGFpbnMgcmVsb2NhdGlvbnMgaW4gbXVjaCB0aGUgc2FtZSB3YXkgaXQgbWFpbnRhaW5zCisJc3ltYm9sczogdGhleSBhcmUgbGVmdCBhbG9uZSB1bnRpbCByZXF1aXJlZCwgdGhlbiByZWFkIGluCisJZW4tbWFzcyBhbmQgdHJhbnNsYXRlZCBpbnRvIGFuIGludGVybmFsIGZvcm0uICBBIGNvbW1vbgorCXJvdXRpbmUgPDxiZmRfcGVyZm9ybV9yZWxvY2F0aW9uPj4gYWN0cyB1cG9uIHRoZQorCWNhbm9uaWNhbCBmb3JtIHRvIGRvIHRoZSBmaXh1cC4KKworCVJlbG9jYXRpb25zIGFyZSBtYWludGFpbmVkIG9uIGEgcGVyIHNlY3Rpb24gYmFzaXMsCisJd2hpbGUgc3ltYm9scyBhcmUgbWFpbnRhaW5lZCBvbiBhIHBlciBCRkQgYmFzaXMuCisKKwlBbGwgdGhhdCBhIGJhY2sgZW5kIGhhcyB0byBkbyB0byBmaXQgdGhlIEJGRCBpbnRlcmZhY2UgaXMgdG8gY3JlYXRlCisJYSA8PHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeT4+IGZvciBlYWNoIHJlbG9jYXRpb24KKwlpbiBhIHBhcnRpY3VsYXIgc2VjdGlvbiwgYW5kIGZpbGwgaW4gdGhlIHJpZ2h0IGJpdHMgb2YgdGhlIHN0cnVjdHVyZXMuCisKK0BtZW51CitAKiB0eXBlZGVmIGFyZWxlbnQ6OgorQCogaG93dG8gbWFuYWdlcjo6CitAZW5kIG1lbnUKKworKi8KKworLyogRE8gY29tcGlsZSBpbiB0aGUgcmVsb2NfY29kZSBuYW1lIHRhYmxlIGZyb20gbGliYmZkLmguICAqLworI2RlZmluZSBfQkZEX01BS0VfVEFCTEVfYmZkX3JlbG9jX2NvZGVfcmVhbAorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorLyoKK0RPQ0RECitJTk9ERQorCXR5cGVkZWYgYXJlbGVudCwgaG93dG8gbWFuYWdlciwgUmVsb2NhdGlvbnMsIFJlbG9jYXRpb25zCisKK1NVQlNFQ1RJT04KKwl0eXBlZGVmIGFyZWxlbnQKKworCVRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiBhIHJlbG9jYXRpb24gZW50cnk6CisKK0NPREVfRlJBR01FTlQKKy4KKy50eXBlZGVmIGVudW0gYmZkX3JlbG9jX3N0YXR1cworLnsKKy4gICAgICAgeyogTm8gZXJyb3JzIGRldGVjdGVkICp9CisuICBiZmRfcmVsb2Nfb2ssCisuCisuICAgICAgIHsqIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCB0aGVyZSB3YXMgYW4gb3ZlcmZsb3cuICp9CisuICBiZmRfcmVsb2Nfb3ZlcmZsb3csCisuCisuICAgICAgIHsqIFRoZSBhZGRyZXNzIHRvIHJlbG9jYXRlIHdhcyBub3Qgd2l0aGluIHRoZSBzZWN0aW9uIHN1cHBsaWVkLiAqfQorLiAgYmZkX3JlbG9jX291dG9mcmFuZ2UsCisuCisuICAgICAgIHsqIFVzZWQgYnkgc3BlY2lhbCBmdW5jdGlvbnMgKn0KKy4gIGJmZF9yZWxvY19jb250aW51ZSwKKy4KKy4gICAgICAgeyogVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBzaXplIHJlcXVlc3RlZC4gKn0KKy4gIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQsCisuCisuICAgICAgIHsqIFVudXNlZCAqfQorLiAgYmZkX3JlbG9jX290aGVyLAorLgorLiAgICAgICB7KiBUaGUgc3ltYm9sIHRvIHJlbG9jYXRlIGFnYWluc3Qgd2FzIHVuZGVmaW5lZC4gKn0KKy4gIGJmZF9yZWxvY191bmRlZmluZWQsCisuCisuICAgICAgIHsqIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCBtYXkgbm90IGJlIG9rIC0gcHJlc2VudGx5CisuICAgICAgICAgIGdlbmVyYXRlZCBvbmx5IHdoZW4gbGlua2luZyBpOTYwIGNvZmYgZmlsZXMgd2l0aCBpOTYwIGIub3V0CisuICAgICAgICAgIHN5bWJvbHMuICBJZiB0aGlzIHR5cGUgaXMgcmV0dXJuZWQsIHRoZSBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50CisuICAgICAgICAgIHRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gd2lsbCBiZSBzZXQuICAqfQorLiAgYmZkX3JlbG9jX2Rhbmdlcm91cworLiB9CisuIGJmZF9yZWxvY19zdGF0dXNfdHlwZTsKKy4KKy4KKy50eXBlZGVmIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeQorLnsKKy4gICAgICAgeyogQSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCB0YWJsZSBvZiBwb2ludGVycyAgKn0KKy4gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1fcHRyX3B0cjsKKy4KKy4gICAgICAgeyogb2Zmc2V0IGluIHNlY3Rpb24gKn0KKy4gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKKy4KKy4gICAgICAgeyogYWRkZW5kIGZvciByZWxvY2F0aW9uIHZhbHVlICp9CisuICBiZmRfdm1hIGFkZGVuZDsKKy4KKy4gICAgICAgeyogUG9pbnRlciB0byBob3cgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgcmVsb2NhdGlvbiAqfQorLiAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisuCisufSBhcmVsZW50OworCisqLworCisvKgorREVTQ1JJUFRJT04KKworICAgICAgICBIZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBvZiB0aGUgZmllbGRzIHdpdGhpbiBhbiA8PGFyZWxlbnQ+PjoKKworICAgICAgICBvIDw8c3ltX3B0cl9wdHI+PgorCisgICAgICAgIFRoZSBzeW1ib2wgdGFibGUgcG9pbnRlciBwb2ludHMgdG8gYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wKKyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxvY2F0aW9uIHJlcXVlc3QuICBJdCBpcworICAgICAgICB0aGUgcG9pbnRlciBpbnRvIHRoZSB0YWJsZSByZXR1cm5lZCBieSB0aGUgYmFjayBlbmQncworICAgICAgICA8PGdldF9zeW10YWI+PiBhY3Rpb24uIEB4cmVme1N5bWJvbHN9LiBUaGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQKKyAgICAgICAgdGhyb3VnaCBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHNvIHRoYXQgdG9vbHMgbGlrZSB0aGUgbGlua2VyCisgICAgICAgIGNhbiBmaXggdXAgYWxsIHRoZSBzeW1ib2xzIG9mIHRoZSBzYW1lIG5hbWUgYnkgbW9kaWZ5aW5nIG9ubHkKKyAgICAgICAgb25lIHBvaW50ZXIuIFRoZSByZWxvY2F0aW9uIHJvdXRpbmUgbG9va3MgaW4gdGhlIHN5bWJvbCBhbmQKKyAgICAgICAgdXNlcyB0aGUgYmFzZSBvZiB0aGUgc2VjdGlvbiB0aGUgc3ltYm9sIGlzIGF0dGFjaGVkIHRvIGFuZCB0aGUKKyAgICAgICAgdmFsdWUgb2YgdGhlIHN5bWJvbCBhcyB0aGUgaW5pdGlhbCByZWxvY2F0aW9uIG9mZnNldC4gSWYgdGhlCisgICAgICAgIHN5bWJvbCBwb2ludGVyIGlzIHplcm8sIHRoZW4gdGhlIHNlY3Rpb24gcHJvdmlkZWQgaXMgbG9va2VkIHVwLgorCisgICAgICAgIG8gPDxhZGRyZXNzPj4KKworICAgICAgICBUaGUgPDxhZGRyZXNzPj4gZmllbGQgZ2l2ZXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiYXNlIG9mCisgICAgICAgIHRoZSBzZWN0aW9uIGRhdGEgd2hpY2ggb3ducyB0aGUgcmVsb2NhdGlvbiByZWNvcmQgdG8gdGhlIGZpcnN0CisgICAgICAgIGJ5dGUgb2YgcmVsb2NhdGFibGUgaW5mb3JtYXRpb24uIFRoZSBhY3R1YWwgZGF0YSByZWxvY2F0ZWQKKyAgICAgICAgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzIHBvaW50OyBmb3IgZXhhbXBsZSwgYSByZWxvY2F0aW9uCisgICAgICAgIHR5cGUgd2hpY2ggbW9kaWZpZXMgdGhlIGJvdHRvbSB0d28gYnl0ZXMgb2YgYSBmb3VyIGJ5dGUgd29yZAorICAgICAgICB3b3VsZCBub3QgdG91Y2ggdGhlIGZpcnN0IGJ5dGUgcG9pbnRlZCB0byBpbiBhIGJpZyBlbmRpYW4KKyAgICAgICAgd29ybGQuCisKKwlvIDw8YWRkZW5kPj4KKworCVRoZSA8PGFkZGVuZD4+IGlzIGEgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGJlIGFkZGVkICghKQorCXRvIHRoZSByZWxvY2F0aW9uIG9mZnNldC4gSXRzIGludGVycHJldGF0aW9uIGlzIGRlcGVuZGVudCB1cG9uCisJdGhlIGhvd3RvLiBGb3IgZXhhbXBsZSwgb24gdGhlIDY4ayB0aGUgY29kZToKKworCit8ICAgICAgICBjaGFyIGZvb1tdOworfCAgICAgICAgbWFpbigpCit8ICAgICAgICAgICAgICAgIHsKK3wgICAgICAgICAgICAgICAgcmV0dXJuIGZvb1sweDEyMzQ1Njc4XTsKK3wgICAgICAgICAgICAgICAgfQorCisgICAgICAgIENvdWxkIGJlIGNvbXBpbGVkIGludG86CisKK3wgICAgICAgIGxpbmt3IGZwLCMtNAorfCAgICAgICAgbW92ZWIgQEAjMTIzNDU2NzgsZDAKK3wgICAgICAgIGV4dGJsIGQwCit8ICAgICAgICB1bmxrIGZwCit8ICAgICAgICBydHMKKworCisgICAgICAgIFRoaXMgY291bGQgY3JlYXRlIGEgcmVsb2MgcG9pbnRpbmcgdG8gPDxmb28+PiwgYnV0IGxlYXZlIHRoZQorICAgICAgICBvZmZzZXQgaW4gdGhlIGRhdGEsIHNvbWV0aGluZyBsaWtlOgorCisKK3xSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Cit8b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCit8MDAwMDAwMDYgMzIgICAgICAgIF9mb28KK3wKK3wwMDAwMDAwMCA0ZTU2IGZmZmMgICAgICAgICAgOyBsaW5rdyBmcCwjLTQKK3wwMDAwMDAwNCAxMDM5IDEyMzQgNTY3OCAgICAgOyBtb3ZlYiBAQCMxMjM0NTY3OCxkMAorfDAwMDAwMDBhIDQ5YzAgICAgICAgICAgICAgICA7IGV4dGJsIGQwCit8MDAwMDAwMGMgNGU1ZSAgICAgICAgICAgICAgIDsgdW5sayBmcAorfDAwMDAwMDBlIDRlNzUgICAgICAgICAgICAgICA7IHJ0cworCisKKyAgICAgICAgVXNpbmcgY29mZiBhbmQgYW4gODhrLCBzb21lIGluc3RydWN0aW9ucyBkb24ndCBoYXZlIGVub3VnaAorICAgICAgICBzcGFjZSBpbiB0aGVtIHRvIHJlcHJlc2VudCB0aGUgZnVsbCBhZGRyZXNzIHJhbmdlLCBhbmQKKyAgICAgICAgcG9pbnRlcnMgaGF2ZSB0byBiZSBsb2FkZWQgaW4gdHdvIHBhcnRzLiBTbyB5b3UnZCBnZXQgc29tZXRoaW5nIGxpa2U6CisKKworfCAgICAgICAgb3IudSAgICAgcjEzLHIwLGhpMTYoX2ZvbysweDEyMzQ1Njc4KQorfCAgICAgICAgbGQuYiAgICAgcjIscjEzLGxvMTYoX2ZvbysweDEyMzQ1Njc4KQorfCAgICAgICAgam1wICAgICAgcjEKKworCisgICAgICAgIFRoaXMgc2hvdWxkIGNyZWF0ZSB0d28gcmVsb2NzLCBib3RoIHBvaW50aW5nIHRvIDw8X2Zvbz4+LCBhbmQgd2l0aAorICAgICAgICAweDEyMzQwMDAwIGluIHRoZWlyIGFkZGVuZCBmaWVsZC4gVGhlIGRhdGEgd291bGQgY29uc2lzdCBvZjoKKworCit8UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgorfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQorfDAwMDAwMDAyIEhWUlQxNiAgICBfZm9vKzB4MTIzNDAwMDAKK3wwMDAwMDAwNiBMVlJUMTYgICAgX2ZvbysweDEyMzQwMDAwCit8Cit8MDAwMDAwMDAgNWRhMDU2NzggICAgICAgICAgIDsgb3IudSByMTMscjAsMHg1Njc4Cit8MDAwMDAwMDQgMWM0ZDU2NzggICAgICAgICAgIDsgbGQuYiByMixyMTMsMHg1Njc4Cit8MDAwMDAwMDggZjQwMGMwMDEgICAgICAgICAgIDsgam1wIHIxCisKKworICAgICAgICBUaGUgcmVsb2NhdGlvbiByb3V0aW5lIGRpZ3Mgb3V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBkYXRhLCBhZGRzCisgICAgICAgIGl0IHRvIHRoZSBhZGRlbmQgdG8gZ2V0IHRoZSBvcmlnaW5hbCBvZmZzZXQsIGFuZCB0aGVuIGFkZHMgdGhlCisgICAgICAgIHZhbHVlIG9mIDw8X2Zvbz4+LiBOb3RlIHRoYXQgYWxsIDMyIGJpdHMgaGF2ZSB0byBiZSBrZXB0IGFyb3VuZAorICAgICAgICBzb21ld2hlcmUsIHRvIGNvcGUgd2l0aCBjYXJyeSBmcm9tIGJpdCAxNSB0byBiaXQgMTYuCisKKyAgICAgICAgT25lIGZ1cnRoZXIgZXhhbXBsZSBpcyB0aGUgc3BhcmMgYW5kIHRoZSBhLm91dCBmb3JtYXQuIFRoZQorICAgICAgICBzcGFyYyBoYXMgYSBzaW1pbGFyIHByb2JsZW0gdG8gdGhlIDg4aywgaW4gdGhhdCBzb21lCisgICAgICAgIGluc3RydWN0aW9ucyBkb24ndCBoYXZlIHJvb20gZm9yIGFuIGVudGlyZSBvZmZzZXQsIGJ1dCBvbiB0aGUKKyAgICAgICAgc3BhcmMgdGhlIHBhcnRzIGFyZSBjcmVhdGVkIGluIG9kZCBzaXplZCBsdW1wcy4gVGhlIGRlc2lnbmVycyBvZgorICAgICAgICB0aGUgYS5vdXQgZm9ybWF0IGNob3NlIHRvIG5vdCB1c2UgdGhlIGRhdGEgd2l0aGluIHRoZSBzZWN0aW9uCisgICAgICAgIGZvciBzdG9yaW5nIHBhcnQgb2YgdGhlIG9mZnNldDsgYWxsIHRoZSBvZmZzZXQgaXMga2VwdCB3aXRoaW4KKyAgICAgICAgdGhlIHJlbG9jLiBBbnl0aGluZyBpbiB0aGUgZGF0YSBzaG91bGQgYmUgaWdub3JlZC4KKworfCAgICAgICAgc2F2ZSAlc3AsLTExMiwlc3AKK3wgICAgICAgIHNldGhpICVoaShfZm9vKzB4MTIzNDU2NzgpLCVnMgorfCAgICAgICAgbGRzYiBbJWcyKyVsbyhfZm9vKzB4MTIzNDU2NzgpXSwlaTAKK3wgICAgICAgIHJldAorfCAgICAgICAgcmVzdG9yZQorCisgICAgICAgIEJvdGggcmVsb2NzIGNvbnRhaW4gYSBwb2ludGVyIHRvIDw8Zm9vPj4sIGFuZCB0aGUgb2Zmc2V0cworICAgICAgICBjb250YWluIGp1bmsuCisKKworfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKK3xvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKK3wwMDAwMDAwNCBISTIyICAgICAgX2ZvbysweDEyMzQ1Njc4Cit8MDAwMDAwMDggTE8xMCAgICAgIF9mb28rMHgxMjM0NTY3OAorfAorfDAwMDAwMDAwIDlkZTNiZjkwICAgICA7IHNhdmUgJXNwLC0xMTIsJXNwCit8MDAwMDAwMDQgMDUwMDAwMDAgICAgIDsgc2V0aGkgJWhpKF9mb28rMCksJWcyCit8MDAwMDAwMDggZjA0OGEwMDAgICAgIDsgbGRzYiBbJWcyKyVsbyhfZm9vKzApXSwlaTAKK3wwMDAwMDAwYyA4MWM3ZTAwOCAgICAgOyByZXQKK3wwMDAwMDAxMCA4MWU4MDAwMCAgICAgOyByZXN0b3JlCisKKworICAgICAgICBvIDw8aG93dG8+PgorCisgICAgICAgIFRoZSA8PGhvd3RvPj4gZmllbGQgY2FuIGJlIGltYWdpbmVkIGFzIGEKKyAgICAgICAgcmVsb2NhdGlvbiBpbnN0cnVjdGlvbi4gSXQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHdoaWNoCisgICAgICAgIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHdoYXQgdG8gZG8gd2l0aCBhbGwgb2YgdGhlIG90aGVyCisgICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSByZWxvYyByZWNvcmQgYW5kIGRhdGEgc2VjdGlvbi4gQSBiYWNrIGVuZAorICAgICAgICB3b3VsZCBub3JtYWxseSBoYXZlIGEgcmVsb2NhdGlvbiBpbnN0cnVjdGlvbiBzZXQgYW5kIHR1cm4KKyAgICAgICAgcmVsb2NhdGlvbnMgaW50byBwb2ludGVycyB0byB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgb24gaW5wdXQgLQorICAgICAgICBidXQgaXQgd291bGQgYmUgcG9zc2libGUgdG8gY3JlYXRlIGVhY2ggaG93dG8gZmllbGQgb24gZGVtYW5kLgorCisqLworCisvKgorU1VCU1VCU0VDVElPTgorCTw8ZW51bSBjb21wbGFpbl9vdmVyZmxvdz4+CisKKwlJbmRpY2F0ZXMgd2hhdCBzb3J0IG9mIG92ZXJmbG93IGNoZWNraW5nIHNob3VsZCBiZSBkb25lIHdoZW4KKwlwZXJmb3JtaW5nIGEgcmVsb2NhdGlvbi4KKworQ09ERV9GUkFHTUVOVAorLgorLmVudW0gY29tcGxhaW5fb3ZlcmZsb3cKKy57CisuCXsqIERvIG5vdCBjb21wbGFpbiBvbiBvdmVyZmxvdy4gKn0KKy4gIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCisuCisuCXsqIENvbXBsYWluIGlmIHRoZSBiaXRmaWVsZCBvdmVyZmxvd3MsIHdoZXRoZXIgaXQgaXMgY29uc2lkZXJlZAorLgkgICBhcyBzaWduZWQgb3IgdW5zaWduZWQuICp9CisuICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKKy4KKy4JeyogQ29tcGxhaW4gaWYgdGhlIHZhbHVlIG92ZXJmbG93cyB3aGVuIGNvbnNpZGVyZWQgYXMgc2lnbmVkCisuCSAgIG51bWJlci4gKn0KKy4gIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKKy4KKy4JeyogQ29tcGxhaW4gaWYgdGhlIHZhbHVlIG92ZXJmbG93cyB3aGVuIGNvbnNpZGVyZWQgYXMgYW4KKy4JICAgdW5zaWduZWQgbnVtYmVyLiAqfQorLiAgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQKKy59OworCisqLworCisvKgorU1VCU1VCU0VDVElPTgorICAgICAgICA8PHJlbG9jX2hvd3RvX3R5cGU+PgorCisgICAgICAgIFRoZSA8PHJlbG9jX2hvd3RvX3R5cGU+PiBpcyBhIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhbGwgdGhlCisgICAgICAgIGluZm9ybWF0aW9uIHRoYXQgbGliYmZkIG5lZWRzIHRvIGtub3cgdG8gdGllIHVwIGEgYmFjayBlbmQncyBkYXRhLgorCitDT0RFX0ZSQUdNRU5UCisuc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeTsJCXsqIEZvcndhcmQgZGVjbGFyYXRpb24gKn0KKy4KKy5zdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0CisueworLiAgICAgICB7KiAgVGhlIHR5cGUgZmllbGQgaGFzIG1haW5seSBhIGRvY3VtZW50YXJ5IHVzZSAtIHRoZSBiYWNrIGVuZCBjYW4KKy4gICAgICAgICAgIGRvIHdoYXQgaXQgd2FudHMgd2l0aCBpdCwgdGhvdWdoIG5vcm1hbGx5IHRoZSBiYWNrIGVuZCdzCisuICAgICAgICAgICBleHRlcm5hbCBpZGVhIG9mIHdoYXQgYSByZWxvYyBudW1iZXIgaXMgc3RvcmVkCisuICAgICAgICAgICBpbiB0aGlzIGZpZWxkLiBGb3IgZXhhbXBsZSwgYSBQQyByZWxhdGl2ZSB3b3JkIHJlbG9jYXRpb24KKy4gICAgICAgICAgIGluIGEgY29mZiBlbnZpcm9ubWVudCBoYXMgdGhlIHR5cGUgMDIzIC0gYmVjYXVzZSB0aGF0J3MKKy4gICAgICAgICAgIHdoYXQgdGhlIG91dHNpZGUgd29ybGQgY2FsbHMgYSBSX1BDUldPUkQgcmVsb2MuICp9CisuICB1bnNpZ25lZCBpbnQgdHlwZTsKKy4KKy4gICAgICAgeyogIFRoZSB2YWx1ZSB0aGUgZmluYWwgcmVsb2NhdGlvbiBpcyBzaGlmdGVkIHJpZ2h0IGJ5LiBUaGlzIGRyb3BzCisuICAgICAgICAgICB1bndhbnRlZCBkYXRhIGZyb20gdGhlIHJlbG9jYXRpb24uICAqfQorLiAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQ7CisuCisuCXsqICBUaGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzICpub3QqIGEKKy4JICAgIHBvd2VyLW9mLXR3byBtZWFzdXJlLiAgVG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgb3BlcmF0ZWQKKy4JICAgIG9uIGJ5IGEgdHlwZSBvZiByZWxvY2F0aW9uLCB1c2UgYmZkX2dldF9yZWxvY19zaXplLiAgKn0KKy4gIGludCBzaXplOworLgorLiAgICAgICB7KiAgVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgdXNlZAorLgkgICAgd2hlbiBkb2luZyBvdmVyZmxvdyBjaGVja2luZy4gICp9CisuICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKKy4KKy4gICAgICAgeyogIE5vdGVzIHRoYXQgdGhlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZQorLiAgICAgICAgICAgZGF0YSBzZWN0aW9uIG9mIHRoZSBhZGRlbmQuIFRoZSByZWxvY2F0aW9uIGZ1bmN0aW9uIHdpbGwKKy4gICAgICAgICAgIHN1YnRyYWN0IGZyb20gdGhlIHJlbG9jYXRpb24gdmFsdWUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCisuICAgICAgICAgICBiZWluZyByZWxvY2F0ZWQuICp9CisuICBib29sZWFuIHBjX3JlbGF0aXZlOworLgorLgl7KiAgVGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVsb2MgdmFsdWUgaW4gdGhlIGRlc3RpbmF0aW9uLgorLgkgICAgVGhlIHJlbG9jYXRlZCB2YWx1ZSBpcyBsZWZ0IHNoaWZ0ZWQgYnkgdGhpcyBhbW91bnQuICp9CisuICB1bnNpZ25lZCBpbnQgYml0cG9zOworLgorLgl7KiBXaGF0IHR5cGUgb2Ygb3ZlcmZsb3cgZXJyb3Igc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHdoZW4KKy4JICAgcmVsb2NhdGluZy4gKn0KKy4gIGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgY29tcGxhaW5fb25fb3ZlcmZsb3c7CisuCisuICAgICAgIHsqIElmIHRoaXMgZmllbGQgaXMgbm9uIG51bGwsIHRoZW4gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGlzCisuICAgICAgICAgIGNhbGxlZCByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyByZWFsbHkKKy4gICAgICAgICAgc3RyYW5nZSByZWxvY2F0aW9uIG1ldGhvZHMgdG8gYmUgYWNjb21vZGF0ZWQgKGUuZy4sIGk5NjAgY2FsbGoKKy4gICAgICAgICAgaW5zdHJ1Y3Rpb25zKS4gKn0KKy4gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAoKnNwZWNpYWxfZnVuY3Rpb24pCisuCQkJCSAgICBQQVJBTVMgKChiZmQgKmFiZmQsCisuCQkJCQkgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sLAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKKy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKKy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7CisuCisuICAgICAgIHsqIFRoZSB0ZXh0dWFsIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24gdHlwZS4gKn0KKy4gIGNoYXIgKm5hbWU7CisuCisuICAgICAgIHsqIFdoZW4gcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluaywgc29tZSBmb3JtYXRzIG11c3QgbW9kaWZ5IHRoZQorLiAgICAgICAgICByZWxvY2F0aW9ucyByYXRoZXIgdGhhbiB0aGUgZGF0YSAtIHRoaXMgZmxhZyBzaWduYWxzIHRoaXMuKn0KKy4gIGJvb2xlYW4gcGFydGlhbF9pbnBsYWNlOworLgorLiAgICAgICB7KiBUaGUgc3JjX21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgcmVhZCBpbiBkYXRhCisuICAgICAgICAgIGFyZSB0byBiZSB1c2VkIGluIHRoZSByZWxvY2F0aW9uIHN1bS4gIEUuZy4sIGlmIHRoaXMgd2FzIGFuIDggYml0CisuICAgICAgICAgIGJpdCBvZiBkYXRhIHdoaWNoIHdlIHJlYWQgYW5kIHJlbG9jYXRlZCwgdGhpcyB3b3VsZCBiZQorLiAgICAgICAgICAweDAwMDAwMGZmLiBXaGVuIHdlIGhhdmUgcmVsb2NzIHdoaWNoIGhhdmUgYW4gYWRkZW5kLCBzdWNoIGFzCisuICAgICAgICAgIHN1bjQgZXh0ZW5kZWQgcmVsb2NzLCB0aGUgdmFsdWUgaW4gdGhlIG9mZnNldCBwYXJ0IG9mIGEKKy4gICAgICAgICAgcmVsb2NhdGluZyBmaWVsZCBpcyBnYXJiYWdlIHNvIHdlIG5ldmVyIHVzZSBpdC4gSW4gdGhpcyBjYXNlCisuICAgICAgICAgIHRoZSBtYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICp9CisuICBiZmRfdm1hIHNyY19tYXNrOworLgorLiAgICAgICB7KiBUaGUgZHN0X21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIHJlcGxhY2VkCisuICAgICAgICAgIGludG8gdGhlIGluc3RydWN0aW9uLiBJbiBtb3N0IGNhc2VzIHNyY19tYXNrID09IGRzdF9tYXNrLAorLiAgICAgICAgICBleGNlcHQgaW4gdGhlIGFib3ZlIHNwZWNpYWwgY2FzZSwgd2hlcmUgZHN0X21hc2sgd291bGQgYmUKKy4gICAgICAgICAgMHgwMDAwMDBmZiwgYW5kIHNyY19tYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICAgKn0KKy4gIGJmZF92bWEgZHN0X21hc2s7CisuCisuICAgICAgIHsqIFdoZW4gc29tZSBmb3JtYXRzIGNyZWF0ZSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMsIHRoZXkgbGVhdmUKKy4gICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwYyBvZiB0aGUgcGxhY2UgYmVpbmcgcmVsb2NhdGVkIGluIHRoZSBvZmZzZXQKKy4gICAgICAgICAgc2xvdCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIHRoYXQgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGNhbgorLiAgICAgICAgICBiZSBtYWRlIGp1c3QgYnkgYWRkaW5nIGluIGFuIG9yZGluYXJ5IG9mZnNldCAoZS5nLiwgc3VuMyBhLm91dCkuCisuICAgICAgICAgIFNvbWUgZm9ybWF0cyBsZWF2ZSB0aGUgZGlzcGxhY2VtZW50IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24KKy4gICAgICAgICAgZW1wdHkgKGUuZy4sIG04OGsgYmNzKTsgdGhpcyBmbGFnIHNpZ25hbHMgdGhlIGZhY3QuKn0KKy4gIGJvb2xlYW4gcGNyZWxfb2Zmc2V0OworLgorLn07CisKKyovCisKKy8qCitGVU5DVElPTgorCVRoZSBIT1dUTyBNYWNybworCitERVNDUklQVElPTgorCVRoZSBIT1dUTyBkZWZpbmUgaXMgaG9ycmlibGUgYW5kIHdpbGwgZ28gYXdheS4KKworCisuI2RlZmluZSBIT1dUTyhDLCBSLFMsQiwgUCwgQkksIE8sIFNGLCBOQU1FLCBJTlBMQUNFLCBNQVNLU1JDLCBNQVNLRFNULCBQQykgXAorLiAgeyh1bnNpZ25lZClDLFIsUyxCLCBQLCBCSSwgTyxTRixOQU1FLElOUExBQ0UsTUFTS1NSQyxNQVNLRFNULFBDfQorCitERVNDUklQVElPTgorCUFuZCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRvdGFsbHkgbWFnaWMgd2F5LiBCdXQgZm9yIHRoZQorCW1vbWVudCwgd2UgYXJlIGNvbXBhdGlibGUsIHNvIGRvIGl0IHRoaXMgd2F5LgorCisKKy4jZGVmaW5lIE5FV0hPV1RPKCBGVU5DVElPTiwgTkFNRSxTSVpFLFJFTCxJTikgSE9XVE8oMCwwLFNJWkUsMCxSRUwsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LEZVTkNUSU9OLCBOQU1FLGZhbHNlLDAsMCxJTikKKy4KK0RFU0NSSVBUSU9OCisJSGVscGVyIHJvdXRpbmUgdG8gdHVybiBhIHN5bWJvbCBpbnRvIGEgcmVsb2NhdGlvbiB2YWx1ZS4KKworLiNkZWZpbmUgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2wpICAgICAgXAorLiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorLiAgaWYgKHN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpIHsgICAgICAgICAgICAgXAorLiAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKSB7IFwKKy4gICAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy4gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy4gICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsgICAgICAgICAgICAgIFwKKy4gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy4gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy59CisKKyovCisKKy8qCitGVU5DVElPTgorCWJmZF9nZXRfcmVsb2Nfc2l6ZQorCitTWU5PUFNJUworCXVuc2lnbmVkIGludCBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvX3R5cGUgKik7CisKK0RFU0NSSVBUSU9OCisJRm9yIGEgcmVsb2NfaG93dG9fdHlwZSB0aGF0IG9wZXJhdGVzIG9uIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzLAorCXRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkIG9uLgorICovCisKK3Vuc2lnbmVkIGludAorYmZkX2dldF9yZWxvY19zaXplIChob3d0bykKKyAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Cit7CisgIHN3aXRjaCAoaG93dG8tPnNpemUpCisgICAgeworICAgIGNhc2UgMDogcmV0dXJuIDE7CisgICAgY2FzZSAxOiByZXR1cm4gMjsKKyAgICBjYXNlIDI6IHJldHVybiA0OworICAgIGNhc2UgMzogcmV0dXJuIDA7CisgICAgY2FzZSA0OiByZXR1cm4gODsKKyAgICBjYXNlIDg6IHJldHVybiAxNjsKKyAgICBjYXNlIC0yOiByZXR1cm4gNDsKKyAgICBkZWZhdWx0OiBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qCitUWVBFREVGCisJYXJlbGVudF9jaGFpbgorCitERVNDUklQVElPTgorCisJSG93IHJlbG9jcyBhcmUgdGllZCB0b2dldGhlciBpbiBhbiA8PGFzZWN0aW9uPj46CisKKy50eXBlZGVmIHN0cnVjdCByZWxlbnRfY2hhaW4geworLiAgYXJlbGVudCByZWxlbnQ7CisuICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7CisufSBhcmVsZW50X2NoYWluOworCisqLworCisvKiBOX09ORVMgcHJvZHVjZXMgTiBvbmUgYml0cywgd2l0aG91dCBvdmVyZmxvd2luZyBtYWNoaW5lIGFyaXRobWV0aWMuICAqLworI2RlZmluZSBOX09ORVMobikgKCgoKChiZmRfdm1hKSAxIDw8ICgobikgLSAxKSkgLSAxKSA8PCAxKSB8IDEpCisKKy8qCitGVU5DVElPTgorCWJmZF9jaGVja19vdmVyZmxvdworCitTWU5PUFNJUworCWJmZF9yZWxvY19zdGF0dXNfdHlwZQorCQliZmRfY2hlY2tfb3ZlcmZsb3cKKwkJCShlbnVtIGNvbXBsYWluX292ZXJmbG93IGhvdywKKwkJCSB1bnNpZ25lZCBpbnQgYml0c2l6ZSwKKwkJCSB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCwKKwkJCSB1bnNpZ25lZCBpbnQgYWRkcnNpemUsCisJCQkgYmZkX3ZtYSByZWxvY2F0aW9uKTsKKworREVTQ1JJUFRJT04KKwlQZXJmb3JtIG92ZXJmbG93IGNoZWNraW5nIG9uIEB2YXJ7cmVsb2NhdGlvbn0gd2hpY2ggaGFzCisJQHZhcntiaXRzaXplfSBzaWduaWZpY2FudCBiaXRzIGFuZCB3aWxsIGJlIHNoaWZ0ZWQgcmlnaHQgYnkKKwlAdmFye3JpZ2h0c2hpZnR9IGJpdHMsIG9uIGEgbWFjaGluZSB3aXRoIGFkZHJlc3NlcyBjb250YWluaW5nCisJQHZhcnthZGRyc2l6ZX0gc2lnbmlmaWNhbnQgYml0cy4gIFRoZSByZXN1bHQgaXMgZWl0aGVyIG9mCisJQGNvZGV7YmZkX3JlbG9jX29rfSBvciBAY29kZXtiZmRfcmVsb2Nfb3ZlcmZsb3d9LgorCisqLworCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2JmZF9jaGVja19vdmVyZmxvdyAoaG93LCBiaXRzaXplLCByaWdodHNoaWZ0LCBhZGRyc2l6ZSwgcmVsb2NhdGlvbikKKyAgICAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3c7CisgICAgIHVuc2lnbmVkIGludCBiaXRzaXplOworICAgICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKKyAgICAgdW5zaWduZWQgaW50IGFkZHJzaXplOworICAgICBiZmRfdm1hIHJlbG9jYXRpb247Cit7CisgIGJmZF92bWEgZmllbGRtYXNrLCBhZGRybWFzaywgc2lnbm1hc2ssIHNzLCBhOworICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKKworICBhID0gcmVsb2NhdGlvbjsKKworICAvKiBOb3RlOiBCSVRTSVpFIHNob3VsZCBhbHdheXMgYmUgPD0gQUREUlNJWkUsIGJ1dCBpbiBjYXNlIGl0J3Mgbm90LAorICAgICB3ZSdsbCBiZSBwZXJtaXNzaXZlOiBleHRyYSBiaXRzIGluIHRoZSBmaWVsZCBtYXNrIHdpbGwKKyAgICAgYXV0b21hdGljYWxseSBleHRlbmQgdGhlIGFkZHJlc3MgbWFzayBmb3IgcHVycG9zZXMgb2YgdGhlCisgICAgIG92ZXJmbG93IGNoZWNrLiAgKi8KKyAgZmllbGRtYXNrID0gTl9PTkVTIChiaXRzaXplKTsKKyAgYWRkcm1hc2sgPSBOX09ORVMgKGFkZHJzaXplKSB8IGZpZWxkbWFzazsKKworICBzd2l0Y2ggKGhvdykKKyAgICB7CisgICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19kb250OgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKKyAgICAgIC8qIElmIGFueSBzaWduIGJpdHMgYXJlIHNldCwgYWxsIHNpZ24gYml0cyBtdXN0IGJlIHNldC4gIFRoYXQKKyAgICAgICAgIGlzLCBBIG11c3QgYmUgYSB2YWxpZCBuZWdhdGl2ZSBhZGRyZXNzIGFmdGVyIHNoaWZ0aW5nLiAgKi8KKyAgICAgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OworICAgICAgc2lnbm1hc2sgPSB+IChmaWVsZG1hc2sgPj4gMSk7CisgICAgICBzcyA9IGEgJiBzaWdubWFzazsKKyAgICAgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoYWRkcm1hc2sgPj4gcmlnaHRzaGlmdCkgJiBzaWdubWFzaykpCisJZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKKyAgICAgIC8qIFdlIGhhdmUgYW4gb3ZlcmZsb3cgaWYgdGhlIGFkZHJlc3MgZG9lcyBub3QgZml0IGluIHRoZSBmaWVsZC4gICovCisgICAgICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKKyAgICAgIGlmICgoYSAmIH4gZmllbGRtYXNrKSAhPSAwKQorCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7CisgICAgICBicmVhazsKKworICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6CisgICAgICAvKiBCaXRmaWVsZHMgYXJlIHNvbWV0aW1lcyBzaWduZWQsIHNvbWV0aW1lcyB1bnNpZ25lZC4gIFdlCisgICAgICAgICBvdmVyZmxvdyBpZiB0aGUgdmFsdWUgaGFzIHNvbWUsIGJ1dCBub3QgYWxsLCBiaXRzIHNldCBvdXRzaWRlCisgICAgICAgICB0aGUgZmllbGQsIG9yIGlmIGl0IGhhcyBhbnkgYml0cyBzZXQgb3V0c2lkZSB0aGUgZmllbGQgYnV0CisgICAgICAgICB0aGUgc2lnbiBiaXQgaXMgbm90IHNldC4gICovCisgICAgICBhID4+PSByaWdodHNoaWZ0OworICAgICAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCisJeworCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKKwkgIHNzID0gKHNpZ25tYXNrIDw8IHJpZ2h0c2hpZnQpIC0gMTsKKwkgIGlmICgoc3MgfCByZWxvY2F0aW9uKSAhPSB+IChiZmRfdm1hKSAwKQorCSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICByZXR1cm4gZmxhZzsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX3BlcmZvcm1fcmVsb2NhdGlvbgorCitTWU5PUFNJUworCWJmZF9yZWxvY19zdGF0dXNfdHlwZQorICAgICAgICAgICAgICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChiZmQgKmFiZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkLAorCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKKworREVTQ1JJUFRJT04KKwlJZiBAdmFye291dHB1dF9iZmR9IGlzIHN1cHBsaWVkIHRvIHRoaXMgZnVuY3Rpb24sIHRoZQorCWdlbmVyYXRlZCBpbWFnZSB3aWxsIGJlIHJlbG9jYXRhYmxlOyB0aGUgcmVsb2NhdGlvbnMgYXJlCisJY29waWVkIHRvIHRoZSBvdXRwdXQgZmlsZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIHRvCisJcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mIHRoZSB3b3JsZC4gVGhlcmUgYXJlIHR3byB3YXlzIG9mCisJcmVmbGVjdGluZyB0aGUgcmVzdWx0cyBvZiBwYXJ0aWFsIGxpbmthZ2UgaW4gYW4gb3V0cHV0IGZpbGU6CisJYnkgbW9kaWZ5aW5nIHRoZSBvdXRwdXQgZGF0YSBpbiBwbGFjZSwgYW5kIGJ5IG1vZGlmeWluZyB0aGUKKwlyZWxvY2F0aW9uIHJlY29yZC4gIFNvbWUgbmF0aXZlIGZvcm1hdHMgKGUuZy4sIGJhc2ljIGEub3V0IGFuZAorCWJhc2ljIGNvZmYpIGhhdmUgbm8gd2F5IG9mIHNwZWNpZnlpbmcgYW4gYWRkZW5kIGluIHRoZQorCXJlbG9jYXRpb24gdHlwZSwgc28gdGhlIGFkZGVuZCBoYXMgdG8gZ28gaW4gdGhlIG91dHB1dCBkYXRhLgorCVRoaXMgaXMgbm8gYmlnIGRlYWwgc2luY2UgaW4gdGhlc2UgZm9ybWF0cyB0aGUgb3V0cHV0IGRhdGEKKwlzbG90IHdpbGwgYWx3YXlzIGJlIGJpZyBlbm91Z2ggZm9yIHRoZSBhZGRlbmQuIENvbXBsZXggcmVsb2MKKwl0eXBlcyB3aXRoIGFkZGVuZHMgd2VyZSBpbnZlbnRlZCB0byBzb2x2ZSBqdXN0IHRoaXMgcHJvYmxlbS4KKwlUaGUgQHZhcntlcnJvcl9tZXNzYWdlfSBhcmd1bWVudCBpcyBzZXQgdG8gYW4gZXJyb3IgbWVzc2FnZSBpZgorCXRoaXMgcmV0dXJuIEBjb2Rle2JmZF9yZWxvY19kYW5nZXJvdXN9LgorCisqLworCisKK2JmZF9yZWxvY19zdGF0dXNfdHlwZQorYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCisJCQllcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBQVFIgZGF0YTsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7CisgIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87CisgIGFzZWN0aW9uICpyZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb247CisgIGFzeW1ib2wgKnN5bWJvbDsKKworICBzeW1ib2wgPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7CisgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKKyAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOworICAgIH0KKworICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKKyAgICAgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gIEFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbCBpcworICAgICBjb25zaWRlcmVkIHRvIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvIChTVlI0IEFCSSwgcC4gNC0yNykuICAqLworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCisgICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKKyAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICAvKiBJZiB0aGVyZSBpcyBhIGZ1bmN0aW9uIHN1cHBsaWVkIHRvIGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gdHlwZSwKKyAgICAgY2FsbCBpdC4gIEl0J2xsIHJldHVybiBgYmZkX3JlbG9jX2NvbnRpbnVlJyBpZiBmdXJ0aGVyIHByb2Nlc3NpbmcKKyAgICAgY2FuIGJlIGRvbmUuICAqLworICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24pCisgICAgeworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvbnQ7CisgICAgICBjb250ID0gaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCisJCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKKwkJCQkgICAgICBlcnJvcl9tZXNzYWdlKTsKKyAgICAgIGlmIChjb250ICE9IGJmZF9yZWxvY19jb250aW51ZSkKKwlyZXR1cm4gY29udDsKKyAgICB9CisKKyAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCisgIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQorICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCisKKyAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJlbG9jYXRpb24gPSAwOworICBlbHNlCisgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7CisKKworICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLworICBpZiAob3V0cHV0X2JmZCAmJiBob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQorICAgIG91dHB1dF9iYXNlID0gMDsKKyAgZWxzZQorICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7CisKKyAgcmVsb2NhdGlvbiArPSBvdXRwdXRfYmFzZSArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKworICAvKiBBZGQgaW4gc3VwcGxpZWQgYWRkZW5kLiAgKi8KKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworCisgIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCisgICAgIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLworCisgIGlmIChob3d0by0+cGNfcmVsYXRpdmUgPT0gdHJ1ZSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04KKwkgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBhbmQgdGhlCisJIGxvY2F0aW9uLiAgUkVMT0NBVElPTiBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuCisKKwkgV2Ugc3RhcnQgYnkgc3VidHJhY3RpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZworCSB0aGUgbG9jYXRpb24uCisKKwkgSWYgcGNyZWxfb2Zmc2V0IGlzIHNldCwgd2UgbXVzdCBmdXJ0aGVyIHN1YnRyYWN0IHRoZSBwb3NpdGlvbgorCSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgU29tZSB0YXJnZXRzIGFycmFuZ2UgZm9yCisJIHRoZSBhZGRlbmQgdG8gYmUgdGhlIG5lZ2F0aXZlIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb24KKwkgd2l0aGluIHRoZSBzZWN0aW9uOyBmb3IgZXhhbXBsZSwgaTM4Ni1hb3V0IGRvZXMgdGhpcy4gIEZvcgorCSBpMzg2LWFvdXQsIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIFNvbWUgb3RoZXIgdGFyZ2V0cyBkbyBub3QKKwkgaW5jbHVkZSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uOyBmb3IgZXhhbXBsZSwgbTg4a2JjcywKKwkgb3IgRUxGLiAgRm9yIHRob3NlIHRhcmdldHMsIHBjcmVsX29mZnNldCBpcyB0cnVlLgorCisJIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlbiB3ZSBtdXN0IGVuc3VyZQorCSB0aGF0IHRoaXMgcmVsb2Mgd2lsbCBiZSBjb3JyZWN0bHkgY29tcHV0ZWQgd2hlbiB0aGUgZmluYWwKKwkgcmVsb2NhdGlvbiBpcyBkb25lLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlIHdlIHdhbnQgdG8gd2luZAorCSB1cCB3aXRoIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLAorCSB3aGljaCBtZWFucyB3ZSBtdXN0IGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGJ5IHRoZSBjaGFuZ2UKKwkgaW4gdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIElmIHBjcmVsX29mZnNldCBpcyB0cnVlCisJIHdlIGRvIG5vdCB3YW50IHRvIGFkanVzdCB0aGUgZXhpc3RpbmcgYWRkZW5kIGF0IGFsbC4KKworCSBGSVhNRTogVGhpcyBzZWVtcyBsb2dpY2FsIHRvIG1lLCBidXQgZm9yIHRoZSBjYXNlIG9mCisJIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0IGl0IGlzIG5vdCB3aGF0IHRoZSBjb2RlCisJIGFjdHVhbGx5IGRvZXMuICBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LCBiZWNhdXNlIGl0IHNlZW1zCisJIGZhciB0b28gbGlrZWx5IHRoYXQgc29tZXRoaW5nIHdpbGwgYnJlYWsuICAqLworCisgICAgICByZWxvY2F0aW9uIC09CisJaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCisJcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChob3d0by0+cGFydGlhbF9pbnBsYWNlID09IGZhbHNlKQorCXsKKwkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCisJICAgICB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLiBNb2RpZnkgdGhlIHJlbG9jCisJICAgICBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCisJICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKKwkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisJICByZXR1cm4gZmxhZzsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYnV0IGlucGxhY2UsIHNvIG1vZGlmeSB0aGUKKwkgICAgIHJlbG9jIHJlY29yZCBhIGJpdC4KKworCSAgICAgSWYgd2UndmUgcmVsb2NhdGVkIHdpdGggYSBzeW1ib2wgd2l0aCBhIHNlY3Rpb24sIGNoYW5nZQorCSAgICAgaW50byBhIHJlZiB0byB0aGUgc2VjdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHN5bWJvbC4gICovCisKKwkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKwkgIC8qIFdURj8/ICovCisJICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgorCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgIT0gMAorCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgIT0gMAorCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtbGl0dGxlIikgIT0gMAorCSAgICAgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtYmlnIikgIT0gMCkKKwkgICAgeworI2lmIDEKKwkgICAgICAvKiBGb3IgbTY4ay1jb2ZmLCB0aGUgYWRkZW5kIHdhcyBiZWluZyBzdWJ0cmFjdGVkIHR3aWNlIGR1cmluZworCQkgcmVsb2NhdGlvbiB3aXRoIC1yLiAgUmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3cgdGhpcyBjb21tZW50CisJCSBmaXhlcyB0aGF0IHByb2JsZW07IHNlZSBQUiAyOTUzLgorCitIb3dldmVyLCBJYW4gd3JvdGUgdGhlIGZvbGxvd2luZywgcmVnYXJkaW5nIHJlbW92aW5nIHRoZSBsaW5lIGJlbG93LAord2hpY2ggZXhwbGFpbnMgd2h5IGl0IGlzIHN0aWxsIGVuYWJsZWQ6ICAtLWRqbQorCitJZiB5b3UgcHV0IGEgcGF0Y2ggbGlrZSB0aGF0IGludG8gQkZEIHlvdSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgQ09GRgorbGlua2Vycy4gIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCBwYXRjaCB3aWxsIGJyZWFrIGNvZmYtaTM4NiAoZS5nLiwKK1NDTyk7IHNlZSBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMgd2hlcmUgSSB3b3JrZWQgYXJvdW5kIHRoZQorcHJvYmxlbSBpbiBhIGRpZmZlcmVudCB3YXkuICBUaGVyZSBtYXkgdmVyeSB3ZWxsIGJlIGEgcmVhc29uIHRoYXQgdGhlCitjb2RlIHdvcmtzIGFzIGl0IGRvZXMuCisKK0htbW0uICBUaGUgZmlyc3Qgb2J2aW91cyBwb2ludCBpcyB0aGF0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gc2hvdWxkCitub3QgaGF2ZSBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgZmxhdm91ci4gIEl0J3Mgc2VlbSBsaWtlCitlbnRpcmVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIHN1Y2ggYSB0aGluZy4gIFRoZSBzZWNvbmQgb2J2aW91cyBwb2ludAoraXMgdGhhdCB0aGUgY3VycmVudCBjb2RlIGlnbm9yZXMgdGhlIHJlbG9jIGFkZGVuZCB3aGVuIHByb2R1Y2luZworcmVsb2NhdGVhYmxlIG91dHB1dCBmb3IgQ09GRi4gIFRoYXQncyBwZWN1bGlhci4gIEluIGZhY3QsIEkgcmVhbGx5CitoYXZlIG5vIGlkZWEgd2hhdCB0aGUgcG9pbnQgb2YgdGhlIGxpbmUgeW91IHdhbnQgdG8gcmVtb3ZlIGlzLgorCitBIHR5cGljYWwgQ09GRiByZWxvYyBzdWJ0cmFjdHMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBhZGRzIGluCit0aGUgbmV3IHZhbHVlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUgKGlmIGl0J3MgYSBwYworcmVsYXRpdmUgcmVsb2MgaXQgYWRkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZQorbG9jYXRpb24pLiAgV2hlbiByZWxvY2F0aW5nIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhhdCBwcm9wZXJ0eS4KKworQkZEIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBhZGRlbmQgdG8gdGhlIG5lZ2F0aXZlIG9mIHRoZSBvbGQKK3ZhbHVlIG9mIHRoZSBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5IGl0IGhhbmRsZXMgY29tbW9uIHN5bWJvbHMgaW4gYQorbm9uLXN0YW5kYXJkIHdheSAoaXQgZG9lc24ndCBzdWJ0cmFjdCB0aGUgb2xkIHZhbHVlKSBidXQgdGhhdCdzIGEKK2RpZmZlcmVudCBzdG9yeSAod2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgbG9zaW5nIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5IHdpdGggb2xkIG9iamVjdCBmaWxlcykgKGNvZmYtaTM4NiBkb2VzIHN1YnRyYWN0IHRoZSBvbGQKK3ZhbHVlLCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29mZi1pMzg2IHRhcmdldHMsIGxpa2UgU0NPKS4KKworU28gZXZlcnl0aGluZyB3b3JrcyBmaW5lIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgV2hlbgord2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBsb2dpY2FsbHkgd2Ugc2hvdWxkIGRvIGV4YWN0bHkKK3doYXQgd2UgZG8gd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGVyZWZvcmUsIHlvdXIKK3BhdGNoIGlzIGNvcnJlY3QuICBJbiBmYWN0LCBpdCBzaG91bGQgcHJvYmFibHkgYWx3YXlzIGp1c3Qgc2V0CityZWxvY19lbnRyeS0+YWRkZW5kIHRvIDAgZm9yIGFsbCBjYXNlcywgc2luY2UgaXQgaXMsIGluIGZhY3QsIGdvaW5nIHRvCithZGQgdGhlIHZhbHVlIGludG8gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyB3b24ndCBodXJ0IHRoZSBDT0ZGIGNvZGUsCit3aGljaCBkb2Vzbid0IHVzZSB0aGUgYWRkZW5kOyBJJ20gbm90IHN1cmUgd2hhdCBpdCB3aWxsIGRvIHRvIG90aGVyCitmb3JtYXRzICh0aGUgdGhpbmcgdG8gY2hlY2sgZm9yIHdvdWxkIGJlIHdoZXRoZXIgYW55IGZvcm1hdHMgYm90aCB1c2UKK3RoZSBhZGRlbmQgYW5kIHNldCBwYXJ0aWFsX2lucGxhY2UpLgorCitXaGVuIEkgd2FudGVkIHRvIG1ha2UgY29mZi1pMzg2IHByb2R1Y2UgcmVsb2NhdGVhYmxlIG91dHB1dCwgSSByYW4KK2ludG8gdGhlIHByb2JsZW0gdGhhdCB5b3UgYXJlIHJ1bm5pbmcgaW50bzogSSB3YW50ZWQgdG8gcmVtb3ZlIHRoYXQKK2xpbmUuICBSYXRoZXIgdGhhbiByaXNrIGl0LCBJIG1hZGUgdGhlIGNvZmYtaTM4NiByZWxvY3MgdXNlIGEgc3BlY2lhbAorZnVuY3Rpb247IGl0J3MgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jLiAgVGhlIGZ1bmN0aW9uCitzcGVjaWZpY2FsbHkgYWRkcyB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIG9iamVjdCBmaWxlLCBrbm93aW5nIHRoYXQKK2JmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgbm90IGdvaW5nIHRvLiAgSWYgeW91IHJlbW92ZSB0aGF0IGxpbmUsIHRoZW4KK2NvZmYtaTM4Ni5jIHdpbGwgd2luZCB1cCBhZGRpbmcgdGhlIGFkZGVuZCBmaWVsZCBpbiB0d2ljZS4gIEl0J3MKK3RyaXZpYWwgdG8gZml4OyBpdCBqdXN0IG5lZWRzIHRvIGJlIGRvbmUuCisKK1RoZSBwcm9ibGVtIHdpdGggcmVtb3ZpbmcgdGhlIGxpbmUgaXMganVzdCB0aGF0IGl0IG1heSBicmVhayBzb21lCit3b3JraW5nIGNvZGUuICBXaXRoIEJGRCBpdCdzIGhhcmQgdG8gYmUgc3VyZSBvZiBhbnl0aGluZy4gIFRoZSByaWdodAord2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzIHNpbXBseSB0byBidWlsZCBhbmQgdGVzdCBhdCBsZWFzdCBhbGwgdGhlCitzdXBwb3J0ZWQgQ09GRiB0YXJnZXRzLiAgSXQgc2hvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiB0aW1lIGFuZCBkaXNrCitzcGFjZSBjb25zdW1pbmcuICBGb3IgZWFjaCB0YXJnZXQ6CisgICAgMSkgYnVpbGQgdGhlIGxpbmtlcgorICAgIDIpIGdlbmVyYXRlIHNvbWUgZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgdXNpbmcgLXIgKEkgd291bGQKKyAgICAgICBwcm9iYWJseSB1c2UgcGFyYW5vaWEubyBhbmQgbGluayBhZ2FpbnN0IG5ld2xpYi9saWJjLmEsIHdoaWNoCisgICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHRhcmdldHMgd291bGQgYmUgYXZhaWxhYmxlIGluCisgICAgICAgL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvSC1ob3N0L3RhcmdldC9saWIvbGliYy5hKS4KKyAgICAzKSBtYWtlIHRoZSBjaGFuZ2UgdG8gcmVsb2MuYworICAgIDQpIHJlYnVpbGQgdGhlIGxpbmtlcgorICAgIDUpIHJlcGVhdCBzdGVwIDIKKyAgICA2KSBpZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlcyBhcmUgdGhlIHNhbWUsIHlvdSBoYXZlIGF0IGxlYXN0CisgICAgICAgbWFkZSBpdCBubyB3b3JzZQorICAgIDcpIGlmIHRoZXkgYXJlIGRpZmZlcmVudCB5b3UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoaWNoIHZlcnNpb24gaXMKKyAgICAgICByaWdodAorKi8KKwkgICAgICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisjZW5kaWYKKwkgICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7CisgICAgfQorCisgIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCisgICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCisgICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQorICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKKyAgICAgbWFjaGluZSB3b3JkLgorICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgorICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLworICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQKKyAgICAgICYmIGZsYWcgPT0gYmZkX3JlbG9jX29rKQorICAgIGZsYWcgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKKwkJCSAgICAgICBob3d0by0+Yml0c2l6ZSwKKwkJCSAgICAgICBob3d0by0+cmlnaHRzaGlmdCwKKwkJCSAgICAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSwKKwkJCSAgICAgICByZWxvY2F0aW9uKTsKKworICAvKgorICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQorICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAorICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQorICAgICovCisKKyAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKKyAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQorICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKKworICAgICBzdHJ1Y3Qgc3RyCisgICAgIHsKKyAgICAgICB1bnNpZ25lZCBpbnQgaTA7CisgICAgIH0gcyA9IHsgMCB9OworCisgICAgIGludAorICAgICBtYWluICgpCisgICAgIHsKKyAgICAgICB1bnNpZ25lZCBsb25nIHg7CisKKyAgICAgICB4ID0gMHgxMDAwMDAwMDA7CisgICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7CisgICAgICAgaWYgKHggPT0gMCkKKwkgcHJpbnRmICgiZmFpbGVkXG4iKTsKKyAgICAgICBlbHNlCisJIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7CisgICAgIH0KKyAgICAgKi8KKworICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7CisKKyAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KKworICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKKworICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLworCisgIC8qIFdoYXQgd2UgZG86CisgICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQorICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KKyAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQorICAgICBTIHNyYyBtYXNrCisgICAgIEQgZHN0IG1hc2sKKyAgICAgTiB+ZHN0IG1hc2sKKyAgICAgQSBwYXJ0IDEKKyAgICAgQiBwYXJ0IDIKKyAgICAgUiByZXN1bHQKKworICAgICBEbyB0aGlzOgorICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KKyAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50CisgICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCisgICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgQSBBIEEgQSBBCisgICAgIEFuZCB0aGlzOgorICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KKyAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIC4uLiAgIEIgQiBCIEIgQgorCisgICAgIEFuZCB0aGVuOgorICAgICBCIEIgQiBCIEIKKyAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+CisgICAgICovCisKKyNkZWZpbmUgRE9JVCh4KSBcCisgIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCisKKyAgc3dpdGNoIChob3d0by0+c2l6ZSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgeworCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSArIGFkZHIpOworCURPSVQgKHgpOworCWJmZF9wdXRfOCAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIGFkZHIpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICB7CisJc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisJRE9JVCAoeCk7CisJYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSArIGFkZHIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgeworCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisJRE9JVCAoeCk7CisJYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgLTI6CisgICAgICB7CisJbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKwlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247CisJRE9JVCAoeCk7CisJYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAtMToKKyAgICAgIHsKKwlsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKKwlET0lUICh4KTsKKwliZmRfcHV0XzE2IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICAvKiBEbyBub3RoaW5nICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyNpZmRlZiBCRkQ2NAorICAgICAgeworCWJmZF92bWEgeCA9IGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisJRE9JVCAoeCk7CisJYmZkX3B1dF82NCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBhYm9ydCAoKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7CisgICAgfQorCisgIHJldHVybiBmbGFnOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfaW5zdGFsbF9yZWxvY2F0aW9uCisKK1NZTk9QU0lTCisJYmZkX3JlbG9jX3N0YXR1c190eXBlCisgICAgICAgICAgICAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKGJmZCAqYWJmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQVFIgZGF0YSwgYmZkX3ZtYSBkYXRhX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorCQkJIGNoYXIgKiplcnJvcl9tZXNzYWdlKTsKKworREVTQ1JJUFRJT04KKwlUaGlzIGxvb2tzIHJlbWFya2FibHkgbGlrZSA8PGJmZF9wZXJmb3JtX3JlbG9jYXRpb24+PiwgZXhjZXB0IGl0CisJZG9lcyBub3QgZXhwZWN0IHRoYXQgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KKwlJLmUuLCBpdCdzIHN1aXRhYmxlIGZvciB1c2Ugd2hlbiBjcmVhdGluZywgcmF0aGVyIHRoYW4gYXBwbHlpbmcKKwlhIHJlbG9jYXRpb24uCisKKwlGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIHJlc2VydmVkIGZvciB0aGUKKwlhc3NlbWJsZXIuCisKKyovCisKKworYmZkX3JlbG9jX3N0YXR1c190eXBlCitiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgZGF0YV9zdGFydCwgZGF0YV9zdGFydF9vZmZzZXQsCisJCQlpbnB1dF9zZWN0aW9uLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBQVFIgZGF0YV9zdGFydDsKKyAgICAgYmZkX3ZtYSBkYXRhX3N0YXJ0X29mZnNldDsKKyAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOworICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKKyAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7CisgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOworICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOworICBhc3ltYm9sICpzeW1ib2w7CisgIGJmZF9ieXRlICpkYXRhOworCisgIHN5bWJvbCA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICB7CisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKKyAgICB9CisKKyAgLyogSWYgdGhlcmUgaXMgYSBmdW5jdGlvbiBzdXBwbGllZCB0byBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIHR5cGUsCisgICAgIGNhbGwgaXQuICBJdCdsbCByZXR1cm4gYGJmZF9yZWxvY19jb250aW51ZScgaWYgZnVydGhlciBwcm9jZXNzaW5nCisgICAgIGNhbiBiZSBkb25lLiAgKi8KKyAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uKQorICAgIHsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb250OworICAKKyAgICAgIC8qIFhYWCAtIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIGNhbGxzIGhhdmVuJ3QgYmVlbiBmaXhlZCB1cCB0byBkZWFsCisJIHdpdGggY3JlYXRpbmcgbmV3IHJlbG9jYXRpb25zIGFuZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIGNvbnQgPSBob3d0by0+c3BlY2lhbF9mdW5jdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwKKwkJCQkgICAgICAvKiBYWFggLSBOb24tcG9ydGFibGUhICovCisJCQkJICAgICAgKChiZmRfYnl0ZSAqKSBkYXRhX3N0YXJ0CisJCQkJICAgICAgIC0gZGF0YV9zdGFydF9vZmZzZXQpLAorCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIGFiZmQsIGVycm9yX21lc3NhZ2UpOworICAgICAgaWYgKGNvbnQgIT0gYmZkX3JlbG9jX2NvbnRpbnVlKQorCXJldHVybiBjb250OworICAgIH0KKworICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KKyAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKKworICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCisgICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KKworICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmVsb2NhdGlvbiA9IDA7CisgIGVsc2UKKyAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKKworICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLworICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKKyAgICBvdXRwdXRfYmFzZSA9IDA7CisgIGVsc2UKKyAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOworCisgIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7CisKKyAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCisgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKKworICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQorICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KKworICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCisJIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQorCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgorCisJIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKKwkgdGhlIGxvY2F0aW9uLgorCisJIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KKwkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgorCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCisJIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKKwkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90CisJIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCisJIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KKworCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKKwkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCisJIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKKwkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKKwkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCisJIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQorCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCisKKwkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgorCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQorCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcworCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KKworICAgICAgcmVsb2NhdGlvbiAtPQorCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCisgICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlICYmIGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gdHJ1ZSkKKwlyZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworICAgIH0KKworICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgorCSB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLiBNb2RpZnkgdGhlIHJlbG9jCisJIGlucGxhY2UgdG8gcmVmbGVjdCB3aGF0IHdlIG5vdyBrbm93LiAgKi8KKyAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBmbGFnOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCisJIHJlbG9jIHJlY29yZCBhIGJpdC4KKworCSBJZiB3ZSd2ZSByZWxvY2F0ZWQgd2l0aCBhIHN5bWJvbCB3aXRoIGEgc2VjdGlvbiwgY2hhbmdlCisJIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLworCisgICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCisgICAgICAvKiBXVEY/PyAqLworICAgICAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKKwkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgIT0gMAorCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAieGNvZmYtcG93ZXJtYWMiKSAhPSAwCisJICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKKwkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgImNvZmYtSW50ZWwtYmlnIikgIT0gMCkKKwl7CisjaWYgMQorLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKKyAgIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAorICAgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KKworSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKK3doaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KKworSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKK2xpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCitTQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKK3Byb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQorY29kZSB3b3JrcyBhcyBpdCBkb2VzLgorCitIbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHNob3VsZAorbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQorZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKK2lzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKK3JlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQoraGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KKworQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgordGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKK3JlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKK2xvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCisKK0JGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCit2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKK25vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCitkaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAorY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCit2YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCisKK1NvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KK3dlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Cit3aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCitwYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAorcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bworYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAord2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgorZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCit0aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KKworV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCitpbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0CitsaW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKK2Z1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgorc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0CitiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCitjb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCit0cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgorCitUaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQord29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKK3dheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQorc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzaworc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgorICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKKyAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCisgICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAorICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgorICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCisgICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKKyAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKKyAgICA1KSByZXBlYXQgc3RlcCAyCisgICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAorICAgICAgIG1hZGUgaXQgbm8gd29yc2UKKyAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCisgICAgICAgcmlnaHQKKyovCisJICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRlbmQ7CisjZW5kaWYKKwkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKKwl9CisgICAgfQorCisgIC8qIEZJWE1FOiBUaGlzIG92ZXJmbG93IGNoZWNraW5nIGlzIGluY29tcGxldGUsIGJlY2F1c2UgdGhlIHZhbHVlCisgICAgIG1pZ2h0IGhhdmUgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuICBGb3IgYSBjb3JyZWN0IGNoZWNrIHdlCisgICAgIG5lZWQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgaW4gYSBzaXplIGxhcmdlciB0aGFuIGJpdHNpemUsIGJ1dCB3ZQorICAgICBjYW4ndCByZWFzb25hYmx5IGRvIHRoYXQgZm9yIGEgcmVsb2MgdGhlIHNhbWUgc2l6ZSBhcyBhIGhvc3QKKyAgICAgbWFjaGluZSB3b3JkLgorICAgICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gZG8gb3ZlcmZsb3cgY2hlY2tpbmcgb24gdGhlIHJlc3VsdCBhZnRlcgorICAgICBhZGRpbmcgaW4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLworICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCisgICAgZmxhZyA9IGJmZF9jaGVja19vdmVyZmxvdyAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93LAorCQkJICAgICAgIGhvd3RvLT5iaXRzaXplLAorCQkJICAgICAgIGhvd3RvLT5yaWdodHNoaWZ0LAorCQkJICAgICAgIGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKGFiZmQpLAorCQkJICAgICAgIHJlbG9jYXRpb24pOworCisgIC8qCisgICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5CisgICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0CisgICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCisgICAgKi8KKworICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgorICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCisgICAgIGZvbGxvd2luZyBwcm9ncmFtOgorCisgICAgIHN0cnVjdCBzdHIKKyAgICAgeworICAgICAgIHVuc2lnbmVkIGludCBpMDsKKyAgICAgfSBzID0geyAwIH07CisKKyAgICAgaW50CisgICAgIG1haW4gKCkKKyAgICAgeworICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKKworICAgICAgIHggPSAweDEwMDAwMDAwMDsKKyAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKKyAgICAgICBpZiAoeCA9PSAwKQorCSBwcmludGYgKCJmYWlsZWRcbiIpOworICAgICAgIGVsc2UKKwkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKKyAgICAgfQorICAgICAqLworCisgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKKworICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLworCisgIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOworCisgIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCisKKyAgLyogV2hhdCB3ZSBkbzoKKyAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCisgICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgorICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5CisgICAgIFMgc3JjIG1hc2sKKyAgICAgRCBkc3QgbWFzaworICAgICBOIH5kc3QgbWFzaworICAgICBBIHBhcnQgMQorICAgICBCIHBhcnQgMgorICAgICBSIHJlc3VsdAorCisgICAgIERvIHRoaXM6CisgICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgorICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKKyAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKKyAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICBBIEEgQSBBIEEKKyAgICAgQW5kIHRoaXM6CisgICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgorICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgLi4uICAgQiBCIEIgQiBCCisKKyAgICAgQW5kIHRoZW46CisgICAgIEIgQiBCIEIgQgorICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KKyAgICAgKi8KKworI2RlZmluZSBET0lUKHgpIFwKKyAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKKworICBkYXRhID0gKGJmZF9ieXRlICopIGRhdGFfc3RhcnQgKyAoYWRkciAtIGRhdGFfc3RhcnRfb2Zmc2V0KTsKKworICBzd2l0Y2ggKGhvd3RvLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICB7CisJY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCAoY2hhciAqKSBkYXRhKTsKKwlET0lUICh4KTsKKwliZmRfcHV0XzggKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICB7CisJc2hvcnQgeCA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKKwlET0lUICh4KTsKKwliZmRfcHV0XzE2IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHsKKwlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7CisJRE9JVCAoeCk7CisJYmZkX3B1dF8zMiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAtMjoKKyAgICAgIHsKKwlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7CisJcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOworCURPSVQgKHgpOworCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgLyogRG8gbm90aGluZyAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQ6CisgICAgICB7CisJYmZkX3ZtYSB4ID0gYmZkX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOworCURPSVQgKHgpOworCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOworICAgIH0KKworICByZXR1cm4gZmxhZzsKK30KKworLyogVGhpcyByZWxvY2F0aW9uIHJvdXRpbmUgaXMgdXNlZCBieSBzb21lIG9mIHRoZSBiYWNrZW5kIGxpbmtlcnMuCisgICBUaGV5IGRvIG5vdCBjb25zdHJ1Y3QgYXN5bWJvbCBvciBhcmVsZW50IHN0cnVjdHVyZXMsIHNvIHRoZXJlIGlzIG5vCisgICByZWFzb24gZm9yIHRoZW0gdG8gdXNlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uICBBbHNvLAorICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBzbyBoYWNrZWQgdXAgaXQgaXMgZWFzaWVyIHRvIHdyaXRlIGEgbmV3CisgICBmdW5jdGlvbiB0aGFuIHRvIHRyeSB0byBkZWFsIHdpdGggaXQuCisKKyAgIFRoaXMgcm91dGluZSBkb2VzIGEgZmluYWwgcmVsb2NhdGlvbi4gIFdoZXRoZXIgaXQgaXMgdXNlZnVsIGZvciBhCisgICByZWxvY2F0ZWFibGUgbGluayBkZXBlbmRzIHVwb24gaG93IHRoZSBvYmplY3QgZm9ybWF0IGRlZmluZXMKKyAgIHJlbG9jYXRpb25zLgorCisgICBGSVhNRTogVGhpcyByb3V0aW5lIGlnbm9yZXMgYW55IHNwZWNpYWxfZnVuY3Rpb24gaW4gdGhlIEhPV1RPLAorICAgc2luY2UgdGhlIGV4aXN0aW5nIHNwZWNpYWxfZnVuY3Rpb24gdmFsdWVzIGhhdmUgYmVlbiB3cml0dGVuIGZvcgorICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4KKworICAgSE9XVE8gaXMgdGhlIHJlbG9jIGhvd3RvIGluZm9ybWF0aW9uLgorICAgSU5QVVRfQkZEIGlzIHRoZSBCRkQgd2hpY2ggdGhlIHJlbG9jIGFwcGxpZXMgdG8uCisgICBJTlBVVF9TRUNUSU9OIGlzIHRoZSBzZWN0aW9uIHdoaWNoIHRoZSByZWxvYyBhcHBsaWVzIHRvLgorICAgQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLgorICAgQUREUkVTUyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2Mgd2l0aGluIElOUFVUX1NFQ1RJT04uCisgICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0aGUgcmVsb2MgcmVmZXJzIHRvLgorICAgQURERU5EIGlzIHRoZSBhZGRlbmQgb2YgdGhlIHJlbG9jLiAgKi8KKworYmZkX3JlbG9jX3N0YXR1c190eXBlCitfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCBhZGRyZXNzLAorCQkJICB2YWx1ZSwgYWRkZW5kKQorICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIGJmZF92bWEgYWRkcmVzczsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKKyAgICAgYmZkX3ZtYSBhZGRlbmQ7Cit7CisgIGJmZF92bWEgcmVsb2NhdGlvbjsKKworICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLworICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKKyAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7CisKKyAgLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhc2ljIHJlbG9jYXRpb24KKyAgICAgYWdhaW5zdCBhIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0bworICAgICByZWxvY2F0ZSB0by4gIFRoaXMgaXMganVzdCBWQUxVRSwgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHBsdXMKKyAgICAgQURERU5ELCBhbnkgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2MuICAqLworICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7CisKKyAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgUEMgcmVsYXRpdmUsIHdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04gdG8KKyAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCAoY3VycmVudGx5IGluIFJFTE9DQVRJT04pIGFuZCB0aGUKKyAgICAgbG9jYXRpb24gd2UgYXJlIHJlbG9jYXRpbmcuICBTb21lIHRhcmdldHMgKGUuZy4sIGkzODYtYW91dCkKKyAgICAgYXJyYW5nZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUKKyAgICAgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBzdWNoIHRhcmdldHMKKyAgICAgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgT3RoZXIgdGFyZ2V0cyAoZS5nLiwgbTg4a2JjcyBvciBFTEYpCisgICAgIHNpbXBseSBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXMgemVybzsgZm9yIHN1Y2gKKyAgICAgdGFyZ2V0cyBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSBkbyBub3QKKyAgICAgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZQorICAgICBzZWN0aW9uICh3aGljaCBpcyBqdXN0IEFERFJFU1MpLiAgKi8KKyAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKKyAgICB7CisgICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQorCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKKyAgICB9CisKKyAgcmV0dXJuIF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCisJCQkJIGNvbnRlbnRzICsgYWRkcmVzcyk7Cit9CisKKy8qIFJlbG9jYXRlIGEgZ2l2ZW4gbG9jYXRpb24gdXNpbmcgYSBnaXZlbiB2YWx1ZSBhbmQgaG93dG8uICAqLworCitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK19iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGxvY2F0aW9uKQorICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKKyAgICAgYmZkX2J5dGUgKmxvY2F0aW9uOworeworICBpbnQgc2l6ZTsKKyAgYmZkX3ZtYSB4OworICBib29sZWFuIG92ZXJmbG93OworICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdCA9IGhvd3RvLT5yaWdodHNoaWZ0OworICB1bnNpZ25lZCBpbnQgYml0cG9zID0gaG93dG8tPmJpdHBvczsKKworICAvKiBJZiB0aGUgc2l6ZSBpcyBuZWdhdGl2ZSwgbmVnYXRlIFJFTE9DQVRJT04uICBUaGlzIGlzbid0IHZlcnkKKyAgICAgZ2VuZXJhbC4gICovCisgIGlmIChob3d0by0+c2l6ZSA8IDApCisgICAgcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOworCisgIC8qIEdldCB0aGUgdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJlbG9jYXRlLiAgKi8KKyAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSAxOgorICAgICAgeCA9IGJmZF9nZXRfOCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB4ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisjaWZkZWYgQkZENjQKKyAgICAgIHggPSBiZmRfZ2V0XzY0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKKyNlbHNlCisgICAgICBhYm9ydCAoKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENoZWNrIGZvciBvdmVyZmxvdy4gIEZJWE1FOiBXZSBtYXkgZHJvcCBiaXRzIGR1cmluZyB0aGUgYWRkaXRpb24KKyAgICAgd2hpY2ggd2UgZG9uJ3QgY2hlY2sgZm9yLiAgV2UgbXVzdCBlaXRoZXIgY2hlY2sgYXQgZXZlcnkgc2luZ2xlCisgICAgIG9wZXJhdGlvbiwgd2hpY2ggd291bGQgYmUgdGVkaW91cywgb3Igd2UgbXVzdCBkbyB0aGUgY29tcHV0YXRpb25zCisgICAgIGluIGEgdHlwZSBsYXJnZXIgdGhhbiBiZmRfdm1hLCB3aGljaCB3b3VsZCBiZSBpbmVmZmljaWVudC4gICovCisgIG92ZXJmbG93ID0gZmFsc2U7CisgIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgIT0gY29tcGxhaW5fb3ZlcmZsb3dfZG9udCkKKyAgICB7CisgICAgICBiZmRfdm1hIGFkZHJtYXNrLCBmaWVsZG1hc2ssIHNpZ25tYXNrLCBzczsKKyAgICAgIGJmZF92bWEgYSwgYiwgc3VtOworCisgICAgICAvKiBHZXQgdGhlIHZhbHVlcyB0byBiZSBhZGRlZCB0b2dldGhlci4gIEZvciBzaWduZWQgYW5kIHVuc2lnbmVkCisgICAgICAgICByZWxvY2F0aW9ucywgd2UgYXNzdW1lIHRoYXQgYWxsIHZhbHVlcyBzaG91bGQgYmUgdHJ1bmNhdGVkIHRvCisgICAgICAgICB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzLiAgRm9yIGJpdGZpZWxkcywgYWxsIHRoZSBiaXRzIG1hdHRlci4KKyAgICAgICAgIFNlZSBhbHNvIGJmZF9jaGVja19vdmVyZmxvdy4gICovCisgICAgICBmaWVsZG1hc2sgPSBOX09ORVMgKGhvd3RvLT5iaXRzaXplKTsKKyAgICAgIGFkZHJtYXNrID0gTl9PTkVTIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpKSB8IGZpZWxkbWFzazsKKyAgICAgIGEgPSByZWxvY2F0aW9uOworICAgICAgYiA9IHggJiBob3d0by0+c3JjX21hc2s7CisKKyAgICAgIHN3aXRjaCAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93KQorCXsKKwljYXNlIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDoKKwkgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OworCisJICAvKiBJZiBhbnkgc2lnbiBiaXRzIGFyZSBzZXQsIGFsbCBzaWduIGJpdHMgbXVzdCBiZSBzZXQuCisJICAgICBUaGF0IGlzLCBBIG11c3QgYmUgYSB2YWxpZCBuZWdhdGl2ZSBhZGRyZXNzIGFmdGVyCisJICAgICBzaGlmdGluZy4gICovCisJICBzaWdubWFzayA9IH4gKGZpZWxkbWFzayA+PiAxKTsKKwkgIHNzID0gYSAmIHNpZ25tYXNrOworCSAgaWYgKHNzICE9IDAgJiYgc3MgIT0gKChhZGRybWFzayA+PiByaWdodHNoaWZ0KSAmIHNpZ25tYXNrKSkKKwkgICAgb3ZlcmZsb3cgPSB0cnVlOworCisJICAvKiBXZSBvbmx5IG5lZWQgdGhpcyBuZXh0IGJpdCBvZiBjb2RlIGlmIHRoZSBzaWduIGJpdCBvZiBCCisgICAgICAgICAgICAgaXMgYmVsb3cgdGhlIHNpZ24gYml0IG9mIEEuICBUaGlzIHdvdWxkIG9ubHkgaGFwcGVuIGlmCisgICAgICAgICAgICAgU1JDX01BU0sgaGFkIGZld2VyIGJpdHMgdGhhbiBCSVRTSVpFLiAgTm90ZSB0aGF0IGlmCisgICAgICAgICAgICAgU1JDX01BU0sgaGFzIG1vcmUgYml0cyB0aGFuIEJJVFNJWkUsIHdlIGNhbiBnZXQgaW50bworICAgICAgICAgICAgIHRyb3VibGU7IHdlIHdvdWxkIG5lZWQgdG8gdmVyaWZ5IHRoYXQgQiBpcyBpbiByYW5nZSwgYXMKKyAgICAgICAgICAgICB3ZSBkbyBmb3IgQSBhYm92ZS4gICovCisJICBzaWdubWFzayA9ICgofiBob3d0by0+c3JjX21hc2spID4+IDEpICYgaG93dG8tPnNyY19tYXNrOworCSAgaWYgKChiICYgc2lnbm1hc2spICE9IDApCisJICAgIHsKKwkgICAgICAvKiBTZXQgYWxsIHRoZSBiaXRzIGFib3ZlIHRoZSBzaWduIGJpdC4gICovCisJICAgICAgYiAtPSBzaWdubWFzayA8PD0gMTsKKwkgICAgfQorCisJICBiID0gKGIgJiBhZGRybWFzaykgPj4gYml0cG9zOworCisJICAvKiBOb3cgd2UgY2FuIGRvIHRoZSBhZGRpdGlvbi4gICovCisJICBzdW0gPSBhICsgYjsKKworCSAgLyogU2VlIGlmIHRoZSByZXN1bHQgaGFzIHRoZSBjb3JyZWN0IHNpZ24uICBCaXRzIGFib3ZlIHRoZQorICAgICAgICAgICAgIHNpZ24gYml0IGFyZSBqdW5rIG5vdzsgaWdub3JlIHRoZW0uICBJZiB0aGUgc3VtIGlzCisgICAgICAgICAgICAgcG9zaXRpdmUsIG1ha2Ugc3VyZSB3ZSBkaWQgbm90IGhhdmUgYWxsIG5lZ2F0aXZlIGlucHV0czsKKyAgICAgICAgICAgICBpZiB0aGUgc3VtIGlzIG5lZ2F0aXZlLCBtYWtlIHN1cmUgd2UgZGlkIG5vdCBoYXZlIGFsbAorICAgICAgICAgICAgIHBvc2l0aXZlIGlucHV0cy4gIFRoZSB0ZXN0IGJlbG93IGxvb2tzIG9ubHkgYXQgdGhlIHNpZ24KKyAgICAgICAgICAgICBiaXRzLCBhbmQgaXQgcmVhbGx5IGp1c3QKKwkgICAgICAgICBTSUdOIChBKSA9PSBTSUdOIChCKSAmJiBTSUdOIChBKSAhPSBTSUdOIChTVU0pCisJICAgICAqLworCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKKwkgIGlmICgoKH4gKGEgXiBiKSkgJiAoYSBeIHN1bSkpICYgc2lnbm1hc2spCisJICAgIG92ZXJmbG93ID0gdHJ1ZTsKKworCSAgYnJlYWs7CisKKwljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgorCSAgLyogQ2hlY2tpbmcgZm9yIGFuIHVuc2lnbmVkIG92ZXJmbG93IGlzIHJlbGF0aXZlbHkgZWFzeToKKyAgICAgICAgICAgICB0cmltIHRoZSBhZGRyZXNzZXMgYW5kIGFkZCwgYW5kIHRyaW0gdGhlIHJlc3VsdCBhcyB3ZWxsLgorICAgICAgICAgICAgIE92ZXJmbG93IGlzIG5vcm1hbGx5IGluZGljYXRlZCB3aGVuIHRoZSByZXN1bHQgZG9lcyBub3QKKyAgICAgICAgICAgICBmaXQgaW4gdGhlIGZpZWxkLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZQorICAgICAgICAgICAgIGNhc2Ugd2hlbiwgZS5nLiwgZmllbGRtYXNrIGlzIDB4N2ZmZmZmZmYgb3Igc21hbGxlciwgYW4KKyAgICAgICAgICAgICBpbnB1dCBpcyAweDgwMDAwMDAwLCBhbmQgYmZkX3ZtYSBpcyBvbmx5IDMyIGJpdHM7IHRoZW4gd2UKKyAgICAgICAgICAgICB3aWxsIGdldCBzdW0gPT0gMCwgYnV0IHRoZXJlIGlzIGFuIG92ZXJmbG93LCBzaW5jZSB0aGUKKyAgICAgICAgICAgICBpbnB1dHMgZGlkIG5vdCBmaXQgaW4gdGhlIGZpZWxkLiAgSW5zdGVhZCBvZiBkb2luZyBhCisgICAgICAgICAgICAgc2VwYXJhdGUgdGVzdCwgd2UgY2FuIGNoZWNrIGZvciB0aGlzIGJ5IG9yLWluZyBpbiB0aGUKKyAgICAgICAgICAgICBvcGVyYW5kcyB3aGVuIHRlc3RpbmcgZm9yIHRoZSBzdW0gb3ZlcmZsb3dpbmcgaXRzIGZpbmFsCisgICAgICAgICAgICAgZmllbGQuICAqLworCSAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7CisJICBiID0gKGIgJiBhZGRybWFzaykgPj4gYml0cG9zOworCSAgc3VtID0gKGEgKyBiKSAmIGFkZHJtYXNrOworCSAgaWYgKChhIHwgYiB8IHN1bSkgJiB+IGZpZWxkbWFzaykKKwkgICAgb3ZlcmZsb3cgPSB0cnVlOworCisJICBicmVhazsKKworCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6CisJICAvKiBNdWNoIGxpa2UgdW5zaWduZWQsIGV4Y2VwdCBubyB0cmltbWluZyB3aXRoIGFkZHJtYXNrLiAgSW4KKyAgICAgICAgICAgICBhZGRpdGlvbiwgdGhlIHN1bSBvdmVyZmxvd3MgaWYgdGhlcmUgaXMgYSBjYXJyeSBvdXQgb2YKKyAgICAgICAgICAgICB0aGUgYmZkX3ZtYSwgaS5lLiwgdGhlIHN1bSBpcyBsZXNzIHRoYW4gZWl0aGVyIGlucHV0CisgICAgICAgICAgICAgb3BlcmFuZC4gICovCisJICBhID4+PSByaWdodHNoaWZ0OworCSAgYiA+Pj0gYml0cG9zOworCisJICAvKiBCaXRmaWVsZHMgYXJlIHNvbWV0aW1lcyB1c2VkIGZvciBzaWduZWQgbnVtYmVyczsgZm9yCisgICAgICAgICAgICAgZXhhbXBsZSwgYSAxMy1iaXQgZmllbGQgc29tZXRpbWVzIHJlcHJlc2VudHMgdmFsdWVzIGluCisgICAgICAgICAgICAgMC4uODE5MSBhbmQgc29tZXRpbWVzIHJlcHJlc2VudHMgdmFsdWVzIGluIC00MDk2Li40MDk1LgorICAgICAgICAgICAgIElmIHRoZSBmaWVsZCBpcyBzaWduZWQgYW5kIGEgaXMgLTQwOTUgKDB4MTAwMSkgYW5kIGIgaXMKKyAgICAgICAgICAgICAtMSAoMHgxZmZmKSwgdGhlIHN1bSBpcyAtNDA5NiAoMHgxMDAwKSwgYnV0ICgweDEwMDEgKworICAgICAgICAgICAgIDB4MWZmZiBpcyAweDMwMDApLiAgSXQncyBub3QgY2xlYXIgaG93IHRvIGhhbmRsZSB0aGlzCisgICAgICAgICAgICAgZXZlcnl3aGVyZSwgc2luY2UgdGhlcmUgaXMgbm90IHdheSB0byBrbm93IGhvdyBtYW55IGJpdHMKKyAgICAgICAgICAgICBhcmUgc2lnbmlmaWNhbnQgaW4gdGhlIHJlbG9jYXRpb24sIGJ1dCB0aGUgb3JpZ2luYWwgY29kZQorICAgICAgICAgICAgIGFzc3VtZWQgdGhhdCBpdCB3YXMgZnVsbHkgc2lnbiBleHRlbmRlZCwgYW5kIHdlIHdpbGwga2VlcAorICAgICAgICAgICAgIHRoYXQgYXNzdW1wdGlvbi4gICovCisJICBzaWdubWFzayA9IChmaWVsZG1hc2sgPj4gMSkgKyAxOworCisJICBpZiAoKGEgJiB+IGZpZWxkbWFzaykgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFNvbWUgYml0cyBvdXQgb2YgdGhlIGZpZWxkIGFyZSBzZXQuICBUaGlzIG1pZ2h0IG5vdAorICAgICAgICAgICAgICAgICBiZSBhIHByb2JsZW06IGlmIHRoaXMgaXMgYSBzaWduZWQgYml0ZmllbGQsIGl0IGlzIE9LCisgICAgICAgICAgICAgICAgIGlmZiBhbGwgdGhlIGhpZ2ggYml0cyBhcmUgc2V0LCBpbmNsdWRpbmcgdGhlIHNpZ24KKyAgICAgICAgICAgICAgICAgYml0LiAgV2UnbGwgdHJ5IHNldHRpbmcgYWxsIGJ1dCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgICAgICAgICAgICAgICBiaXQgaW4gdGhlIG9yaWdpbmFsIHJlbG9jYXRpb24gdmFsdWU6IGlmIHRoaXMgaXMgYWxsCisgICAgICAgICAgICAgICAgIG9uZXMsIHdlIGFyZSBPSywgYXNzdW1pbmcgYSBzaWduZWQgYml0ZmllbGQuICAqLworCSAgICAgIHNzID0gKHNpZ25tYXNrIDw8IHJpZ2h0c2hpZnQpIC0gMTsKKwkgICAgICBpZiAoKHNzIHwgcmVsb2NhdGlvbikgIT0gfiAoYmZkX3ZtYSkgMCkKKwkJb3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGEgJj0gZmllbGRtYXNrOworCSAgICB9CisKKwkgIC8qIFdlIGp1c3QgYXNzdW1lIChiICYgfiBmaWVsZG1hc2spID09IDAuICAqLworCisJICBzdW0gPSBhICsgYjsKKwkgIGlmIChzdW0gPCBhIHx8IChzdW0gJiB+IGZpZWxkbWFzaykgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFRoZXJlIHdhcyBhIGNhcnJ5IG91dCwgb3IgdGhlIGZpZWxkIG92ZXJmbG93LiAgVGVzdAorICAgICAgICAgICAgICAgICBmb3Igc2lnbmVkIG9wZXJhbmRzIGFnYWluLiAgSGVyZSBpcyB0aGUgb3ZlcmZsb3cgdGVzdAorICAgICAgICAgICAgICAgICBpcyBhcyBmb3IgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLiAgKi8KKwkgICAgICBpZiAoKCh+IChhIF4gYikpICYgKGEgXiBzdW0pKSAmIHNpZ25tYXNrKQorCQlvdmVyZmxvdyA9IHRydWU7CisJICAgIH0KKworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICAvKiBQdXQgUkVMT0NBVElPTiBpbiB0aGUgcmlnaHQgYml0cy4gICovCisgIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSByaWdodHNoaWZ0OworICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgYml0cG9zOworCisgIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSByaWdodCBiaXRzIG9mIFguICAqLworICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykKKyAgICAgICB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKKworICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZS4gICovCisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDA6CisgICAgICBhYm9ydCAoKTsKKyAgICBjYXNlIDE6CisgICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyNpZmRlZiBCRkQ2NAorICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7CisjZWxzZQorICAgICAgYWJvcnQgKCk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Cit9CisKKy8qCitET0NERAorSU5PREUKKwlob3d0byBtYW5hZ2VyLCAgLCB0eXBlZGVmIGFyZWxlbnQsIFJlbG9jYXRpb25zCisKK1NFQ1RJT04KKwlUaGUgaG93dG8gbWFuYWdlcgorCisJV2hlbiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBjcmVhdGUgYSByZWxvY2F0aW9uLCBidXQgZG9lc24ndAorCWtub3cgd2hhdCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWlnaHQgY2FsbCBpdCwgaXQgY2FuIGZpbmQgb3V0IGJ5CisJdXNpbmcgdGhpcyBiaXQgb2YgY29kZS4KKworKi8KKworLyoKK1RZUEVERUYKKwliZmRfcmVsb2NfY29kZV90eXBlCisKK0RFU0NSSVBUSU9OCisJVGhlIGluc2lkZXMgb2YgYSByZWxvYyBjb2RlLiAgVGhlIGlkZWEgaXMgdGhhdCwgZXZlbnR1YWxseSwgdGhlcmUKKwl3aWxsIGJlIG9uZSBlbnVtZXJhdG9yIGZvciBldmVyeSB0eXBlIG9mIHJlbG9jYXRpb24gd2UgZXZlciBkby4KKwlQYXNzIG9uZSBvZiB0aGVzZSB2YWx1ZXMgdG8gPDxiZmRfcmVsb2NfdHlwZV9sb29rdXA+PiwgYW5kIGl0J2xsCisJcmV0dXJuIGEgaG93dG8gcG9pbnRlci4KKworCVRoaXMgZG9lcyBtZWFuIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG11c3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0CisJZW51bWVyYXRvciB2YWx1ZTsgeW91IGNhbid0IGdldCBhIGhvd3RvIHBvaW50ZXIgZnJvbSBhIHJhbmRvbSBzZXQKKwlvZiBhdHRyaWJ1dGVzLgorCitTRU5VTQorICAgYmZkX3JlbG9jX2NvZGVfcmVhbAorCitFTlVNCisgIEJGRF9SRUxPQ182NAorRU5VTVgKKyAgQkZEX1JFTE9DXzMyCitFTlVNWAorICBCRkRfUkVMT0NfMjYKK0VOVU1YCisgIEJGRF9SRUxPQ18yNAorRU5VTVgKKyAgQkZEX1JFTE9DXzE2CitFTlVNWAorICBCRkRfUkVMT0NfMTQKK0VOVU1YCisgIEJGRF9SRUxPQ184CitFTlVNRE9DCisgIEJhc2ljIGFic29sdXRlIHJlbG9jYXRpb25zIG9mIE4gYml0cy4KKworRU5VTQorICBCRkRfUkVMT0NfNjRfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ18zMl9QQ1JFTAorRU5VTVgKKyAgQkZEX1JFTE9DXzI0X1BDUkVMCitFTlVNWAorICBCRkRfUkVMT0NfMTZfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ18xMl9QQ1JFTAorRU5VTVgKKyAgQkZEX1JFTE9DXzhfUENSRUwKK0VOVU1ET0MKKyAgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuICBTb21ldGltZXMgdGhlc2UgYXJlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzCitvZiB0aGUgcmVsb2NhdGlvbiBpdHNlbGY7IHNvbWV0aW1lcyB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YKK3RoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHJlbG9jYXRpb24uICBJdCBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyB0YXJnZXQuCisKK1RoZSAyNC1iaXQgcmVsb2NhdGlvbiBpcyB1c2VkIGluIHNvbWUgSW50ZWwgOTYwIGNvbmZpZ3VyYXRpb25zLgorCitFTlVNCisgIEJGRF9SRUxPQ18zMl9HT1RfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ18xNl9HT1RfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ184X0dPVF9QQ1JFTAorRU5VTVgKKyAgQkZEX1JFTE9DXzMyX0dPVE9GRgorRU5VTVgKKyAgQkZEX1JFTE9DXzE2X0dPVE9GRgorRU5VTVgKKyAgQkZEX1JFTE9DX0xPMTZfR09UT0ZGCitFTlVNWAorICBCRkRfUkVMT0NfSEkxNl9HT1RPRkYKK0VOVU1YCisgIEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGCitFTlVNWAorICBCRkRfUkVMT0NfOF9HT1RPRkYKK0VOVU1YCisgIEJGRF9SRUxPQ18zMl9QTFRfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ18yNF9QTFRfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ18xNl9QTFRfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ184X1BMVF9QQ1JFTAorRU5VTVgKKyAgQkZEX1JFTE9DXzMyX1BMVE9GRgorRU5VTVgKKyAgQkZEX1JFTE9DXzE2X1BMVE9GRgorRU5VTVgKKyAgQkZEX1JFTE9DX0xPMTZfUExUT0ZGCitFTlVNWAorICBCRkRfUkVMT0NfSEkxNl9QTFRPRkYKK0VOVU1YCisgIEJGRF9SRUxPQ19ISTE2X1NfUExUT0ZGCitFTlVNWAorICBCRkRfUkVMT0NfOF9QTFRPRkYKK0VOVU1ET0MKKyAgRm9yIEVMRi4KKworRU5VTQorICBCRkRfUkVMT0NfNjhLX0dMT0JfREFUCitFTlVNWAorICBCRkRfUkVMT0NfNjhLX0pNUF9TTE9UCitFTlVNWAorICBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFCitFTlVNRE9DCisgIFJlbG9jYXRpb25zIHVzZWQgYnkgNjhLIEVMRi4KKworRU5VTQorICBCRkRfUkVMT0NfMzJfQkFTRVJFTAorRU5VTVgKKyAgQkZEX1JFTE9DXzE2X0JBU0VSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTAorRU5VTVgKKyAgQkZEX1JFTE9DXzhfQkFTRVJFTAorRU5VTVgKKyAgQkZEX1JFTE9DX1JWQQorRU5VTURPQworICBMaW5rYWdlLXRhYmxlIHJlbGF0aXZlLgorCitFTlVNCisgIEJGRF9SRUxPQ184X0ZGbm4KK0VOVU1ET0MKKyAgQWJzb2x1dGUgOC1iaXQgcmVsb2NhdGlvbiwgYnV0IHVzZWQgdG8gZm9ybSBhbiBhZGRyZXNzIGxpa2UgMHhGRm5uLgorCitFTlVNCisgIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgorRU5VTVgKKyAgQkZEX1JFTE9DXzE2X1BDUkVMX1MyCitFTlVNWAorICBCRkRfUkVMT0NfMjNfUENSRUxfUzIKK0VOVU1ET0MKKyAgVGhlc2UgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbnMgYXJlIHN0b3JlZCBhcyB3b3JkIGRpc3BsYWNlbWVudHMgLS0KK2kuZS4sIGJ5dGUgZGlzcGxhY2VtZW50cyBzaGlmdGVkIHJpZ2h0IHR3byBiaXRzLiAgVGhlIDMwLWJpdCB3b3JkCitkaXNwbGFjZW1lbnQgKDw8MzJfUENSRUxfUzI+PiAtLSAzMiBiaXRzLCBzaGlmdGVkIDIpIGlzIHVzZWQgb24gdGhlCitTUEFSQy4gIChTUEFSQyB0b29scyBnZW5lcmFsbHkgcmVmZXIgdG8gdGhpcyBhcyA8PFdESVNQMzA+Pi4pICBUaGUKK3NpZ25lZCAxNi1iaXQgZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIE1JUFMsIGFuZCB0aGUgMjMtYml0CitkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgQWxwaGEuCisKK0VOVU0KKyAgQkZEX1JFTE9DX0hJMjIKK0VOVU1YCisgIEJGRF9SRUxPQ19MTzEwCitFTlVNRE9DCisgIEhpZ2ggMjIgYml0cyBhbmQgbG93IDEwIGJpdHMgb2YgMzItYml0IHZhbHVlLCBwbGFjZWQgaW50byBsb3dlciBiaXRzIG9mCit0aGUgdGFyZ2V0IHdvcmQuICBUaGVzZSBhcmUgdXNlZCBvbiB0aGUgU1BBUkMuCisKK0VOVU0KKyAgQkZEX1JFTE9DX0dQUkVMMTYKK0VOVU1YCisgIEJGRF9SRUxPQ19HUFJFTDMyCitFTlVNRE9DCisgIEZvciBzeXN0ZW1zIHRoYXQgYWxsb2NhdGUgYSBHbG9iYWwgUG9pbnRlciByZWdpc3RlciwgdGhlc2UgYXJlCitkaXNwbGFjZW1lbnRzIG9mZiB0aGF0IHJlZ2lzdGVyLiAgVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUKK2hhbmRsZWQgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZSB2YWx1ZSB0aGUgcmVnaXN0ZXIgd2lsbCBoYXZlIGlzCitkZWNpZGVkIHJlbGF0aXZlbHkgbGF0ZS4KKworCitFTlVNCisgIEJGRF9SRUxPQ19JOTYwX0NBTExKCitFTlVNRE9DCisgIFJlbG9jIHR5cGVzIHVzZWQgZm9yIGk5NjAvYi5vdXQuCisKK0VOVU0KKyAgQkZEX1JFTE9DX05PTkUKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkMyMgorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDMTMKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19HT1QxMAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX0dPVDEzCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfR09UMjIKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19QQzEwCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfUEMyMgorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX1dQTFQzMAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX0NPUFkKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19HTE9CX0RBVAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9UCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19VQTMyCitFTlVNRE9DCisgIFNQQVJDIEVMRiByZWxvY2F0aW9ucy4gIFRoZXJlIGlzIHByb2JhYmx5IHNvbWUgb3ZlcmxhcCB3aXRoIG90aGVyCisgIHJlbG9jYXRpb24gdHlwZXMgYWxyZWFkeSBkZWZpbmVkLgorCitFTlVNCisgIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19CQVNFMjIKK0VOVU1ET0MKKyAgSSB0aGluayB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gU1BBUkMgYS5vdXQgKGUuZy4sIFN1biA0KS4KKworRU5VTUVRCisgIEJGRF9SRUxPQ19TUEFSQ182NAorICBCRkRfUkVMT0NfNjQKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ18xMAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDXzExCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfT0xPMTAKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19ISDIyCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfSE0xMAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX0xNMjIKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19QQ19ISDIyCitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfUENfSE0xMAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2CitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOQorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDXzcKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ182CitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfNQorRU5VTUVRWAorICBCRkRfUkVMT0NfU1BBUkNfRElTUDY0CisgIEJGRF9SRUxPQ182NF9QQ1JFTAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX1BMVDY0CitFTlVNWAorICBCRkRfUkVMT0NfU1BBUkNfSElYMjIKK0VOVU1YCisgIEJGRF9SRUxPQ19TUEFSQ19MT1gxMAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX0g0NAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX000NAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX0w0NAorRU5VTVgKKyAgQkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSCitFTlVNRE9DCisgIFNQQVJDNjQgcmVsb2NhdGlvbnMKKworRU5VTQorICBCRkRfUkVMT0NfU1BBUkNfUkVWMzIKK0VOVU1ET0MKKyAgU1BBUkMgbGl0dGxlIGVuZGlhbiByZWxvY2F0aW9uCisKK0VOVU0KKyAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2CitFTlVNRE9DCisgIEFscGhhIEVDT0ZGIGFuZCBFTEYgcmVsb2NhdGlvbnMuICBTb21lIG9mIHRoZXNlIHRyZWF0IHRoZSBzeW1ib2wgb3IKKyAgICAgImFkZGVuZCIgaW4gc29tZSBzcGVjaWFsIHdheS4KKyAgRm9yIEdQRElTUF9ISTE2ICgiZ3BkaXNwIikgcmVsb2NhdGlvbnMsIHRoZSBzeW1ib2wgaXMgaWdub3JlZCB3aGVuCisgICAgIHdyaXRpbmc7IHdoZW4gcmVhZGluZywgaXQgd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICBUaGUKKyAgICAgYWRkZW5kIGlzIHRoZSBkaXNwbGFjZW1lbnQgaW4gYnl0ZXMgb2YgdGhlICJsZGEiIGluc3RydWN0aW9uIGZyb20KKyAgICAgdGhlICJsZGFoIiBpbnN0cnVjdGlvbiAod2hpY2ggaXMgYXQgdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYykuCitFTlVNCisgIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNgorRU5VTURPQworICBGb3IgR1BESVNQX0xPMTYgKCJpZ25vcmUiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBoYW5kbGVkIGFzCisgICAgIHdpdGggR1BESVNQX0hJMTYgcmVsb2NzLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZyB0aGUKKyAgICAgcmVsb2NhdGlvbnMgb3V0LCBhbmQgaXMgZmlsbGVkIGluIHdpdGggdGhlIGZpbGUncyBHUCB2YWx1ZSBvbgorICAgICByZWFkaW5nLCBmb3IgY29udmVuaWVuY2UuCisKK0VOVU0KKyAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUAorRU5VTURPQworICBUaGUgRUxGIEdQRElTUCByZWxvY2F0aW9uIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIEdQRElTUF9ISTE2CisgICAgIHJlbG9jYXRpb24gZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gYWNjb21wYW55aW5nIEdQRElTUF9MTzE2CisgICAgIHJlbG9jYXRpb24uCisKK0VOVU0KKyAgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwKK0VOVU1YCisgIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTAorRU5VTVgKKyAgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRQorRU5VTURPQworICBUaGUgQWxwaGEgTElURVJBTC9MSVRVU0UgcmVsb2NzIGFyZSBwcm9kdWNlZCBieSBhIHN5bWJvbCByZWZlcmVuY2U7CisgICAgIHRoZSBhc3NlbWJsZXIgdHVybnMgaXQgaW50byBhIExEUSBpbnN0cnVjdGlvbiB0byBsb2FkIHRoZSBhZGRyZXNzIG9mCisgICAgIHRoZSBzeW1ib2wsIGFuZCB0aGVuIGZpbGxzIGluIGEgcmVnaXN0ZXIgaW4gdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uCisKKyAgICAgVGhlIExJVEVSQUwgcmVsb2MsIGF0IHRoZSBMRFEgaW5zdHJ1Y3Rpb24sIHJlZmVycyB0byB0aGUgLmxpdGEKKyAgICAgc2VjdGlvbiBzeW1ib2wuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nLCBidXQgaXMgZmlsbGVkCisgICAgIGluIHdpdGggdGhlIGZpbGUncyBHUCB2YWx1ZSBvbiByZWFkaW5nLCBmb3IgY29udmVuaWVuY2UsIGFzIHdpdGggdGhlCisgICAgIEdQRElTUF9MTzE2IHJlbG9jLgorCisgICAgIFRoZSBFTEZfTElURVJBTCByZWxvYyBpcyBzb21ld2hlcmUgYmV0d2VlbiAxNl9HT1RPRkYgYW5kIEdQRElTUF9MTzE2LgorICAgICBJdCBzaG91bGQgcmVmZXIgdG8gdGhlIHN5bWJvbCB0byBiZSByZWZlcmVuY2VkLCBhcyB3aXRoIDE2X0dPVE9GRiwKKyAgICAgYnV0IGl0IGdlbmVyYXRlcyBvdXRwdXQgbm90IGJhc2VkIG9uIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIC5nb3QKKyAgICAgc2VjdGlvbiwgYnV0IHJlbGF0aXZlIHRvIHRoZSBHUCB2YWx1ZSBjaG9zZW4gZm9yIHRoZSBmaWxlIGR1cmluZyB0aGUKKyAgICAgZmluYWwgbGluayBzdGFnZS4KKworICAgICBUaGUgTElUVVNFIHJlbG9jLCBvbiB0aGUgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIGxvYWRlZCBhZGRyZXNzLCBnaXZlcworICAgICBpbmZvcm1hdGlvbiB0byB0aGUgbGlua2VyIHRoYXQgaXQgbWlnaHQgYmUgYWJsZSB0byB1c2UgdG8gb3B0aW1pemUKKyAgICAgYXdheSBzb21lIGxpdGVyYWwgc2VjdGlvbiByZWZlcmVuY2VzLiAgVGhlIHN5bWJvbCBpcyBpZ25vcmVkIChyZWFkCisgICAgIGFzIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbCksIGFuZCB0aGUgImFkZGVuZCIgaW5kaWNhdGVzIHRoZSB0eXBlCisgICAgIG9mIGluc3RydWN0aW9uIHVzaW5nIHRoZSByZWdpc3RlcjoKKyAgICAgICAgICAgICAgMSAtICJtZW1vcnkiIGZtdCBpbnNuCisgICAgICAgICAgICAgIDIgLSBieXRlLW1hbmlwdWxhdGlvbiAoYnl0ZSBvZmZzZXQgcmVnKQorICAgICAgICAgICAgICAzIC0ganNyICh0YXJnZXQgb2YgYnJhbmNoKQorCisgICAgIFRoZSBHTlUgbGlua2VyIGN1cnJlbnRseSBkb2Vzbid0IGRvIGFueSBvZiB0aGlzIG9wdGltaXppbmcuCisKK0VOVU0KKyAgQkZEX1JFTE9DX0FMUEhBX0hJTlQKK0VOVU1ET0MKKyAgVGhlIEhJTlQgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgYSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBmaWxsZWQgaW50byB0aGUKKyAgICAgImhpbnQiIGZpZWxkIG9mIGEgam1wL2pzci9yZXQgaW5zdHJ1Y3Rpb24sIGZvciBwb3NzaWJsZSBicmFuY2gtCisgICAgIHByZWRpY3Rpb24gbG9naWMgd2hpY2ggbWF5IGJlIHByb3ZpZGVkIG9uIHNvbWUgcHJvY2Vzc29ycy4KKworRU5VTQorICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRQorRU5VTURPQworICBUaGUgTElOS0FHRSByZWxvY2F0aW9uIG91dHB1dHMgYSBsaW5rYWdlIHBhaXIgaW4gdGhlIG9iamVjdCBmaWxlLAorICAgICB3aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4KKworRU5VTQorICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIKK0VOVU1ET0MKKyAgVGhlIENPREVBRERSIHJlbG9jYXRpb24gb3V0cHV0cyBhIFNUT19DQSBpbiB0aGUgb2JqZWN0IGZpbGUsCisgICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgorCitFTlVNCisgIEJGRF9SRUxPQ19NSVBTX0pNUAorRU5VTURPQworICBCaXRzIDI3Li4yIG9mIHRoZSByZWxvY2F0aW9uIGFkZHJlc3Mgc2hpZnRlZCByaWdodCAyIGJpdHM7CisgICAgIHNpbXBsZSByZWxvYyBvdGhlcndpc2UuCisKK0VOVU0KKyAgQkZEX1JFTE9DX01JUFMxNl9KTVAKK0VOVU1ET0MKKyAgVGhlIE1JUFMxNiBqdW1wIGluc3RydWN0aW9uLgorCitFTlVNCisgIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUwKK0VOVU1ET0MKKyAgTUlQUzE2IEdQIHJlbGF0aXZlIHJlbG9jLgorCitFTlVNCisgIEJGRF9SRUxPQ19ISTE2CitFTlVNRE9DCisgIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWU7IHNpbXBsZSByZWxvYy4KK0VOVU0KKyAgQkZEX1JFTE9DX0hJMTZfUworRU5VTURPQworICBIaWdoIDE2IGJpdHMgb2YgMzItYml0IHZhbHVlIGJ1dCB0aGUgbG93IDE2IGJpdHMgd2lsbCBiZSBzaWduCisgICAgIGV4dGVuZGVkIGFuZCBhZGRlZCB0byBmb3JtIHRoZSBmaW5hbCByZXN1bHQuICBJZiB0aGUgbG93IDE2CisgICAgIGJpdHMgZm9ybSBhIG5lZ2F0aXZlIG51bWJlciwgd2UgbmVlZCB0byBhZGQgb25lIHRvIHRoZSBoaWdoIHZhbHVlCisgICAgIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBib3Jyb3cgd2hlbiB0aGUgbG93IGJpdHMgYXJlIGFkZGVkLgorRU5VTQorICBCRkRfUkVMT0NfTE8xNgorRU5VTURPQworICBMb3cgMTYgYml0cy4KK0VOVU0KKyAgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUworRU5VTURPQworICBMaWtlIEJGRF9SRUxPQ19ISTE2X1MsIGJ1dCBQQyByZWxhdGl2ZS4KK0VOVU0KKyAgQkZEX1JFTE9DX1BDUkVMX0xPMTYKK0VOVU1ET0MKKyAgTGlrZSBCRkRfUkVMT0NfTE8xNiwgYnV0IFBDIHJlbGF0aXZlLgorCitFTlVNRVEKKyAgQkZEX1JFTE9DX01JUFNfR1BSRUwKKyAgQkZEX1JFTE9DX0dQUkVMMTYKK0VOVU1ET0MKKyAgUmVsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIHBvaW50ZXIuCisKK0VOVU0KKyAgQkZEX1JFTE9DX01JUFNfTElURVJBTAorRU5VTURPQworICBSZWxvY2F0aW9uIGFnYWluc3QgYSBNSVBTIGxpdGVyYWwgc2VjdGlvbi4KKworRU5VTQorICBCRkRfUkVMT0NfTUlQU19HT1QxNgorRU5VTVgKKyAgQkZEX1JFTE9DX01JUFNfQ0FMTDE2CitFTlVNRVFYCisgIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIKKyAgQkZEX1JFTE9DX0dQUkVMMzIKK0VOVU1YCisgIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2CitFTlVNWAorICBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgorRU5VTVgKKyAgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2CitFTlVNWAorICBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYKK0NPTU1FTlQKK0VOVU1ET0MKKyAgTUlQUyBFTEYgcmVsb2NhdGlvbnMuCisKK0NPTU1FTlQKKworRU5VTQorICBCRkRfUkVMT0NfMzg2X0dPVDMyCitFTlVNWAorICBCRkRfUkVMT0NfMzg2X1BMVDMyCitFTlVNWAorICBCRkRfUkVMT0NfMzg2X0NPUFkKK0VOVU1YCisgIEJGRF9SRUxPQ18zODZfR0xPQl9EQVQKK0VOVU1YCisgIEJGRF9SRUxPQ18zODZfSlVNUF9TTE9UCitFTlVNWAorICBCRkRfUkVMT0NfMzg2X1JFTEFUSVZFCitFTlVNWAorICBCRkRfUkVMT0NfMzg2X0dPVE9GRgorRU5VTVgKKyAgQkZEX1JFTE9DXzM4Nl9HT1RQQworRU5VTURPQworICBpMzg2L2VsZiByZWxvY2F0aW9ucworCitFTlVNCisgIEJGRF9SRUxPQ19OUzMyS19JTU1fOAorRU5VTVgKKyAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNgorRU5VTVgKKyAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMgorRU5VTVgKKyAgQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMCitFTlVNWAorICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMCitFTlVNWAorICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMCitFTlVNWAorICBCRkRfUkVMT0NfTlMzMktfRElTUF84CitFTlVNWAorICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNgorRU5VTVgKKyAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIKK0VOVU1YCisgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMCitFTlVNWAorICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTAorRU5VTURPQworICBuczMyayByZWxvY2F0aW9ucworCitFTlVNCisgIEJGRF9SRUxPQ19QUENfQjI2CitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0JBMjYKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfVE9DMTYKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfQjE2CitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTgorRU5VTVgKKyAgQkZEX1JFTE9DX1BQQ19CQTE2CitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTgorRU5VTVgKKyAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSTlRBS0VOCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0NPUFkKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfSk1QX1NMT1QKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfUkVMQVRJVkUKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfTE9DQUwyNFBDCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2CitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTYKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfRU1CX1NEQTIxCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2CitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTworRU5VTVgKKyAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEkKK0VOVU1YCisgIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBCitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxECitFTlVNWAorICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREEKK0VOVU1ET0MKKyAgUG93ZXIocnM2MDAwKSBhbmQgUG93ZXJQQyByZWxvY2F0aW9ucy4KKworRU5VTQorICBCRkRfUkVMT0NfQ1RPUgorRU5VTURPQworICBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIHRvIGJ1aWxkIGEgY29udHJ1Y3RvciB0YWJsZSAtIGF0IHRoZSBtb21lbnQKKyAgcHJvYmFibHkgYSAzMiBiaXQgd2lkZSBhYnNvbHV0ZSByZWxvY2F0aW9uLCBidXQgdGhlIHRhcmdldCBjYW4gY2hvb3NlLgorICBJdCBnZW5lcmFsbHkgZG9lcyBtYXAgdG8gb25lIG9mIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLgorCitFTlVNCisgIEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNICitFTlVNRE9DCisgIEFSTSAyNiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQorICBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KK0VOVU0KKyAgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEUKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTQorRU5VTVgKKyAgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0KK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fU1dJCitFTlVNWAorICBCRkRfUkVMT0NfQVJNX01VTFRJCitFTlVNWAorICBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0KK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fQURSX0lNTQorRU5VTVgKKyAgQkZEX1JFTE9DX0FSTV9MRFJfSU1NCitFTlVNWAorICBCRkRfUkVMT0NfQVJNX0xJVEVSQUwKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fSU5fUE9PTAorRU5VTVgKKyAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOAorRU5VTVgKKyAgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fVEhVTUJfQURECitFTlVNWAorICBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTQorRU5VTVgKKyAgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVAorRU5VTVgKKyAgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fR09UMTIKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fR09UMzIKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9UCitFTlVNWAorICBCRkRfUkVMT0NfQVJNX0NPUFkKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fR0xPQl9EQVQKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fUExUMzIKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fUkVMQVRJVkUKK0VOVU1YCisgIEJGRF9SRUxPQ19BUk1fR09UT0ZGCitFTlVNWAorICBCRkRfUkVMT0NfQVJNX0dPVFBDCitFTlVNRE9DCisgIFRoZXNlIHJlbG9jcyBhcmUgb25seSB1c2VkIHdpdGhpbiB0aGUgQVJNIGFzc2VtYmxlci4gIFRoZXkgYXJlIG5vdAorICAoYXQgcHJlc2VudCkgd3JpdHRlbiB0byBhbnkgb2JqZWN0IGZpbGVzLgorCitFTlVNCisgIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyCitFTlVNWAorICBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIKK0VOVU1YCisgIEJGRF9SRUxPQ19TSF9JTU00CitFTlVNWAorICBCRkRfUkVMT0NfU0hfSU1NNEJZMgorRU5VTVgKKyAgQkZEX1JFTE9DX1NIX0lNTTRCWTQKK0VOVU1YCisgIEJGRF9SRUxPQ19TSF9JTU04CitFTlVNWAorICBCRkRfUkVMT0NfU0hfSU1NOEJZMgorRU5VTVgKKyAgQkZEX1JFTE9DX1NIX0lNTThCWTQKK0VOVU1YCisgIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIKK0VOVU1YCisgIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQKK0VOVU1YCisgIEJGRF9SRUxPQ19TSF9TV0lUQ0gxNgorRU5VTVgKKyAgQkZEX1JFTE9DX1NIX1NXSVRDSDMyCitFTlVNWAorICBCRkRfUkVMT0NfU0hfVVNFUworRU5VTVgKKyAgQkZEX1JFTE9DX1NIX0NPVU5UCitFTlVNWAorICBCRkRfUkVMT0NfU0hfQUxJR04KK0VOVU1YCisgIEJGRF9SRUxPQ19TSF9DT0RFCitFTlVNWAorICBCRkRfUkVMT0NfU0hfREFUQQorRU5VTVgKKyAgQkZEX1JFTE9DX1NIX0xBQkVMCitFTlVNRE9DCisgIEhpdGFjaGkgU0ggcmVsb2NzLiAgTm90IGFsbCBvZiB0aGVzZSBhcHBlYXIgaW4gb2JqZWN0IGZpbGVzLgorCitFTlVNCisgIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5CitFTlVNWAorICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTIKK0VOVU1YCisgIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMworRU5VTURPQworICBUaHVtYiAyMy0sIDEyLSBhbmQgOS1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoZXMuICBUaGUgbG93ZXN0IGJpdCBtdXN0CisgIGJlIHplcm8gYW5kIGlzIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgorCitFTlVNCisgIEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMCitFTlVNRE9DCisgIEFyZ29uYXV0IFJJU0MgQ29yZSAoQVJDKSByZWxvY3MuCisgIEFSQyAyMiBiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZQorICBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDIwIGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDI2CisgIHRocm91Z2ggNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCitFTlVNCisgIEJGRF9SRUxPQ19BUkNfQjI2CitFTlVNRE9DCisgIEFSQyAyNiBiaXQgYWJzb2x1dGUgYnJhbmNoLiAgVGhlIGxvd2VzdCB0d28gYml0cyBtdXN0IGJlIHplcm8gYW5kIGFyZSBub3QKKyAgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIDI0IGJpdHMgYXJlIGluc3RhbGxlZCBpbiBiaXRzIDIzCisgIHRocm91Z2ggMC4KKworRU5VTQorICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SCitFTlVNRE9DCisgIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCisgIFRoaXMgaXMgYSAxMC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCisgIGFzc3VtZWQgdG8gYmUgMC4KK0VOVU0KKyAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfTAorRU5VTURPQworICBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgorICBUaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cworICBhc3N1bWVkIHRvIGJlIDAuICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyByZWxvYworICBleGNlcHQgaXQgaXMgaW4gdGhlIGxlZnQgY29udGFpbmVyLCBpLmUuLAorICBzaGlmdGVkIGxlZnQgMTUgYml0cy4KK0VOVU0KKyAgQkZEX1JFTE9DX0QxMFZfMTgKK0VOVU1ET0MKKyAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCisgIGFzc3VtZWQgdG8gYmUgMC4KK0VOVU0KKyAgQkZEX1JFTE9DX0QxMFZfMThfUENSRUwKK0VOVU1ET0MKKyAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCisgIGFzc3VtZWQgdG8gYmUgMC4KKworRU5VTQorICBCRkRfUkVMT0NfRDMwVl82CitFTlVNRE9DCisgIE1pdHN1YmlzaGkgRDMwViByZWxvY3MuCisgIFRoaXMgaXMgYSA2LWJpdCBhYnNvbHV0ZSByZWxvYy4KK0VOVU0KKyAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKKyAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICAKK0VOVU0KKyAgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SCitFTlVNRE9DCisgIFRoaXMgaXMgYSA2LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAorICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQorICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCisgIG9mIHRoZSBjb250YWluZXIuICAKK0VOVU0KKyAgQkZEX1JFTE9DX0QzMFZfMTUKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDEyLWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIHRoZSAKKyAgcmlnaHQgMyBiaXRzYXNzdW1lZCB0byBiZSAwLiAgCitFTlVNCisgIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMCitFTlVNRE9DCisgIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKKyAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICAKK0VOVU0KKyAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUgorRU5VTURPQworICBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCisgIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCisgIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKKyAgb2YgdGhlIGNvbnRhaW5lci4gIAorRU5VTQorICBCRkRfUkVMT0NfRDMwVl8yMQorRU5VTURPQworICBUaGlzIGlzIGFuIDE4LWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIAorICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KK0VOVU0KKyAgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUwKK0VOVU1ET0MKKyAgVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKKyAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuCitFTlVNCisgIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IKK0VOVU1ET0MKKyAgVGhpcyBpcyBhbiAxOC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKKyAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKKyAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQorICBvZiB0aGUgY29udGFpbmVyLgorRU5VTQorICBCRkRfUkVMT0NfRDMwVl8zMgorRU5VTURPQworICBUaGlzIGlzIGEgMzItYml0IGFic29sdXRlIHJlbG9jLgorRU5VTQorICBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGEgMzItYml0IHBjLXJlbGF0aXZlIHJlbG9jLgorCitFTlVNCisgIEJGRF9SRUxPQ19NMzJSXzI0CitFTlVNRE9DCisgIE1pdHN1YmlzaGkgTTMyUiByZWxvY3MuCisgIFRoaXMgaXMgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcy4KK0VOVU0KKyAgQkZEX1JFTE9DX00zMlJfMTBfUENSRUwKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDEwLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgorRU5VTQorICBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGFuIDE4LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgorRU5VTQorICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGEgMjYtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuCitFTlVNCisgIEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPCitFTlVNRE9DCisgIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgaGlnaCAxNiBiaXRzIG9mIGFuIGFkZHJlc3MKKyAgdXNlZCB3aGVuIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkLgorRU5VTQorICBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTworRU5VTURPQworICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCisgIHVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyBzaWduZWQuCitFTlVNCisgIEJGRF9SRUxPQ19NMzJSX0xPMTYKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBsb3dlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuCitFTlVNCisgIEJGRF9SRUxPQ19NMzJSX1NEQTE2CitFTlVNRE9DCisgIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgc21hbGwgZGF0YSBhcmVhIG9mZnNldCBmb3IgdXNlIGluCisgIGFkZDMsIGxvYWQsIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMuCisKK0VOVU0KKyAgQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGEgOS1iaXQgcmVsb2MKK0VOVU0KKyAgQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDIyLWJpdCByZWxvYworCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKKyAgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlci4KK0VOVU0KKyAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVAorRU5VTURPQworICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQorICB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLgorRU5VTQorICBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVAorRU5VTURPQworICBUaGlzIGlzIGFuIDggYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA2IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCisgIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUCitFTlVNRE9DCisgIFRoaXMgaXMgYW4gOGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNyBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55CisgIGRhdGEgYXJlYSBwb2ludGVyLgorRU5VTQorICBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVAorRU5VTURPQworICBUaGlzIGlzIGEgNyBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KK0NPTU1FTlQKK0VOVU0KKyAgQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDUgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA0IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKKyAgZGF0YSBhcmVhIHBvaW50ZXIuCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VUCitFTlVNRE9DCisgIFRoaXMgaXMgYSA0IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4KK0VOVU0KKyAgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVAorRU5VTURPQworICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKKyAgYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4KK0VOVU0KKyAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVAorRU5VTURPQworICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQorICBiaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLgorRU5VTQorICBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUCitFTlVNRE9DCisgIFRoaXMgaXMgYSA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuCitFTlVNCisgIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVAorRU5VTURPQworICBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4KK0NPTU1FTlQKKworRU5VTQorICBCRkRfUkVMT0NfTU4xMDMwMF8zMl9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGEgMzJiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQorICBpbnN0cnVjdGlvbi4KK0VOVU0KKyAgQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2Yml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKKyAgaW5zdHJ1Y3Rpb24uCisKK0VOVU0KKyAgQkZEX1JFTE9DX1RJQzMwX0xEUAorRU5VTURPQworICBUaGlzIGlzIGEgOGJpdCBEUCByZWxvYyBmb3IgdGhlIHRtczMyMGMzMCwgd2hlcmUgdGhlIG1vc3QKKyAgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIGEgMjQgYml0IHdvcmQgYXJlIHBsYWNlZCBpbnRvIHRoZSBsZWFzdAorICBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIG9wY29kZS4KKworRU5VTQorICBCRkRfUkVMT0NfRlIzMF80OAorRU5VTURPQworICBUaGlzIGlzIGEgNDggYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAzMiBiaXRzLgorRU5VTQorICBCRkRfUkVMT0NfRlIzMF8yMAorRU5VTURPQworICBUaGlzIGlzIGEgMzIgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAyMCBiaXRzIHNwbGl0IHVwIGludG8KKyAgdHdvIHNlY3Rpb25zLgorRU5VTQorICBCRkRfUkVMT0NfRlIzMF82X0lOXzQKK0VOVU1ET0MKKyAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSA2IGJpdCB3b3JkIG9mZnNldCBpbgorICA0IGJpdHMuCitFTlVNCisgIEJGRF9SRUxPQ19GUjMwXzhfSU5fOAorRU5VTURPQworICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhbiA4IGJpdCBieXRlIG9mZnNldAorICBpbnRvIDggYml0cy4KK0VOVU0KKyAgQkZEX1JFTE9DX0ZSMzBfOV9JTl84CitFTlVNRE9DCisgIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgc2hvcnQgb2Zmc2V0CisgIGludG8gOCBiaXRzLgorRU5VTQorICBCRkRfUkVMT0NfRlIzMF8xMF9JTl84CitFTlVNRE9DCisgIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgMTAgYml0IHdvcmQgb2Zmc2V0CisgIGludG8gOCBiaXRzLgorRU5VTQorICBCRkRfUkVMT0NfRlIzMF85X1BDUkVMCitFTlVNRE9DCisgIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgcGMgcmVsYXRpdmUKKyAgc2hvcnQgb2Zmc2V0IGludG8gOCBiaXRzLgorRU5VTQorICBCRkRfUkVMT0NfRlIzMF8xMl9QQ1JFTAorRU5VTURPQworICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEyIGJpdCBwYyByZWxhdGl2ZQorICBzaG9ydCBvZmZzZXQgaW50byAxMSBiaXRzLgorICAKK0VOVU0KKyAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQKK0VOVU1YCisgIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMgorRU5VTVgKKyAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIKK0VOVU1YCisgIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMgorRU5VTVgKKyAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMgorRU5VTURPQworICBNb3Rvcm9sYSBNY29yZSByZWxvY2F0aW9ucy4KKyAgCitFTlVNCisgIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorRU5VTVgKKyAgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQorRU5VTURPQworICBUaGVzZSB0d28gcmVsb2NhdGlvbnMgYXJlIHVzZWQgYnkgdGhlIGxpbmtlciB0byBkZXRlcm1pbmUgd2hpY2ggb2YgCisgIHRoZSBlbnRyaWVzIGluIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgYXJlIGFjdHVhbGx5IHVzZWQuICBXaGVuCisgIHRoZSAtLWdjLXNlY3Rpb25zIG9wdGlvbiBpcyBnaXZlbiwgdGhlIGxpbmtlciB3aWxsIHplcm8gb3V0IHRoZSBlbnRyaWVzCisgIHRoYXQgYXJlIG5vdCB1c2VkLCBzbyB0aGF0IHRoZSBjb2RlIGZvciB0aG9zZSBmdW5jdGlvbnMgbmVlZCBub3QgYmUKKyAgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KKworICBWVEFCTEVfSU5IRVJJVCBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB1c2VkIHRvIGRlc2NyaWJlIHRvIHRoZQorICBsaW5rZXIgdGhlIGluaGVyaXRlbmNlIHRyZWUgb2YgYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gIFRoZQorICByZWxvY2F0aW9uJ3Mgc3ltYm9sIHNob3VsZCBiZSB0aGUgcGFyZW50IGNsYXNzJyB2dGFibGUsIGFuZCB0aGUKKyAgcmVsb2NhdGlvbiBzaG91bGQgYmUgbG9jYXRlZCBhdCB0aGUgY2hpbGQgdnRhYmxlLgorCisgIFZUQUJMRV9FTlRSWSBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgdXNlIG9mIGEKKyAgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBlbnRyeS4gIFRoZSByZWxvYydzIHN5bWJvbCBzaG91bGQgcmVmZXIgdG8gdGhlCisgIHRhYmxlIG9mIHRoZSBjbGFzcyBtZW50aW9uZWQgaW4gdGhlIGNvZGUuICBPZmYgb2YgdGhhdCBiYXNlLCBhbiBvZmZzZXQKKyAgZGVzY3JpYmVzIHRoZSBlbnRyeSB0aGF0IGlzIGJlaW5nIHVzZWQuICBGb3IgUmVsYSBob3N0cywgdGhpcyBvZmZzZXQgCisgIGlzIHN0b3JlZCBpbiB0aGUgcmVsb2MncyBhZGRlbmQuICBGb3IgUmVsIGhvc3RzLCB3ZSBhcmUgZm9yY2VkIHRvIHB1dAorICB0aGlzIG9mZnNldCBpbiB0aGUgcmVsb2MncyBzZWN0aW9uIG9mZnNldC4KKworRU5EU0VOVU0KKyAgQkZEX1JFTE9DX1VOVVNFRAorQ09ERV9GUkFHTUVOVAorLgorLnR5cGVkZWYgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZTsKKyovCisKKworLyoKK0ZVTkNUSU9OCisJYmZkX3JlbG9jX3R5cGVfbG9va3VwCisKK1NZTk9QU0lTCisJcmVsb2NfaG93dG9fdHlwZSAqCisJYmZkX3JlbG9jX3R5cGVfbG9va3VwIChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuCisJaW52b2tlZCwgd2lsbCBwZXJmb3JtIHRoZSByZWxvY2F0aW9uIEB2YXJ7Y29kZX0gb24gZGF0YSBmcm9tIHRoZQorCWFyY2hpdGVjdHVyZSBub3RlZC4KKworKi8KKworCityZWxvY19ob3d0b190eXBlICoKK2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgcmV0dXJuIEJGRF9TRU5EIChhYmZkLCByZWxvY190eXBlX2xvb2t1cCwgKGFiZmQsIGNvZGUpKTsKK30KKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYmZkX2hvd3RvXzMyID0KK0hPV1RPICgwLCAwMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlZSVDMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpOworCisKKy8qCitJTlRFUk5BTF9GVU5DVElPTgorCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCisKK1NZTk9QU0lTCisJcmVsb2NfaG93dG9fdHlwZSAqYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKKwkoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpOworCitERVNDUklQVElPTgorCVByb3ZpZGVzIGEgZGVmYXVsdCByZWxvY2F0aW9uIGxvb2t1cCByb3V0aW5lIGZvciBhbnkgYXJjaGl0ZWN0dXJlLgorCisKKyovCisKK3JlbG9jX2hvd3RvX3R5cGUgKgorYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Cit7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKKyAgICAgIC8qIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgaW4gYSBjdG9yLCB3aGljaCB3aWxsIGJlIGFzIHdpZGUgYXMgdGhlCisJIGFkZHJlc3MgLSBzbyBlaXRoZXIgYSA2NCwgMzIsIG9yIDE2IGJpdHRlci4gICovCisgICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKKwl7CisJY2FzZSA2NDoKKwkgIEJGRF9GQUlMICgpOworCWNhc2UgMzI6CisJICByZXR1cm4gJmJmZF9ob3d0b18zMjsKKwljYXNlIDE2OgorCSAgQkZEX0ZBSUwgKCk7CisJZGVmYXVsdDoKKwkgIEJGRF9GQUlMICgpOworCX0KKyAgICBkZWZhdWx0OgorICAgICAgQkZEX0ZBSUwgKCk7CisgICAgfQorICByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2dldF9yZWxvY19jb2RlX25hbWUKKworU1lOT1BTSVMKKwljb25zdCBjaGFyICpiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpOworCitERVNDUklQVElPTgorCVByb3ZpZGVzIGEgcHJpbnRhYmxlIG5hbWUgZm9yIHRoZSBzdXBwbGllZCByZWxvY2F0aW9uIGNvZGUuCisJVXNlZnVsIG1haW5seSBmb3IgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMuCisqLworCitjb25zdCBjaGFyICoKK2JmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKQorICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgaWYgKGNvZGUgPiBCRkRfUkVMT0NfVU5VU0VEKQorICAgIHJldHVybiAwOworICByZXR1cm4gYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lc1soaW50KWNvZGVdOworfQorCisvKgorSU5URVJOQUxfRlVOQ1RJT04KKwliZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCisJIChiZmQgKmFiZmQsCisJICBhc2VjdGlvbiAqc2VjdGlvbiwKKwkgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJICBib29sZWFuICopOworCitERVNDUklQVElPTgorCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgZm9yIHJlbGF4aW5nIGZvciBiYWNrIGVuZHMgd2hpY2gKKwlkb24ndCBkbyByZWxheGluZyAtLSBpLmUuLCBkb2VzIG5vdGhpbmcuCisqLworCisvKkFSR1NVU0VEKi8KK2Jvb2xlYW4KK2JmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGJvb2xlYW4gKmFnYWluOworeworICAqYWdhaW4gPSBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qCitJTlRFUk5BTF9GVU5DVElPTgorCWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucworCSAoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopOworCitERVNDUklQVElPTgorCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgZm9yIHJlbGF4aW5nIGZvciBiYWNrIGVuZHMgd2hpY2gKKwlkb24ndCBkbyBzZWN0aW9uIGdjIC0tIGkuZS4sIGRvZXMgbm90aGluZy4KKyovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworeworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKK0lOVEVSTkFMX0ZVTkNUSU9OCisJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisKK1NZTk9QU0lTCisJYmZkX2J5dGUgKgorCSAgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYmZkICphYmZkLAorCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKKwkgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKKwkgICAgIGJmZF9ieXRlICpkYXRhLAorCSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCisJICAgICBhc3ltYm9sICoqc3ltYm9scyk7CisKK0RFU0NSSVBUSU9OCisJUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBvZiByZWxvY2F0aW9uIGVmZm9ydCBmb3IgYmFjayBlbmRzCisJd2hpY2ggY2FuJ3QgYmUgYm90aGVyZWQgdG8gZG8gaXQgZWZmaWNpZW50bHkuCisKKyovCisKK2JmZF9ieXRlICoKK2JmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAorCQkJCQkgICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KKyAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKworICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOworICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKKyAgbG9uZyByZWxvY19jb3VudDsKKworICBpZiAocmVsb2Nfc2l6ZSA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbG9jX3NpemUpOworICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKKwkJCQkgaW5wdXRfc2VjdGlvbiwKKwkJCQkgKFBUUikgZGF0YSwKKwkJCQkgMCwKKwkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCisgIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKKyAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7CisKKyAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCisJCQkJCWlucHV0X3NlY3Rpb24sCisJCQkJCXJlbG9jX3ZlY3RvciwKKwkJCQkJc3ltYm9scyk7CisgIGlmIChyZWxvY19jb3VudCA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKHJlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBhcmVsZW50ICoqcGFyZW50OworICAgICAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQgIT0gKGFyZWxlbnQgKikgTlVMTDsKKwkgICBwYXJlbnQrKykKKwl7CisJICBjaGFyICplcnJvcl9tZXNzYWdlID0gKGNoYXIgKikgTlVMTDsKKwkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByID0KKwkgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLAorCQkJCSAgICAqcGFyZW50LAorCQkJCSAgICAoUFRSKSBkYXRhLAorCQkJCSAgICBpbnB1dF9zZWN0aW9uLAorCQkJCSAgICByZWxvY2F0ZWFibGUgPyBhYmZkIDogKGJmZCAqKSBOVUxMLAorCQkJCSAgICAmZXJyb3JfbWVzc2FnZSk7CisKKwkgIGlmIChyZWxvY2F0ZWFibGUpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqb3MgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKworCSAgICAgIC8qIEEgcGFydGlhbCBsaW5rLCBzbyBrZWVwIHRoZSByZWxvY3MgKi8KKwkgICAgICBvcy0+b3JlbG9jYXRpb25bb3MtPnJlbG9jX2NvdW50XSA9ICpwYXJlbnQ7CisJICAgICAgb3MtPnJlbG9jX2NvdW50Kys7CisJICAgIH0KKworCSAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQorCSAgICB7CisJICAgICAgc3dpdGNoIChyKQorCQl7CisJCWNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKKwkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAorCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBicmVhazsKKwkJY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgorCQkgIEJGRF9BU1NFUlQgKGVycm9yX21lc3NhZ2UgIT0gKGNoYXIgKikgTlVMTCk7CisJCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQorCQkJKGxpbmtfaW5mbywgZXJyb3JfbWVzc2FnZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJICgqcGFyZW50KS0+YWRkcmVzcykpKQorCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCSAgYnJlYWs7CisJCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkJKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKigqcGFyZW50KS0+c3ltX3B0cl9wdHIpLAorCQkJICgqcGFyZW50KS0+aG93dG8tPm5hbWUsICgqcGFyZW50KS0+YWRkZW5kLAorCQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKCpwYXJlbnQpLT5hZGRyZXNzKSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICBicmVhazsKKwkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkJZGVmYXVsdDoKKwkJICBhYm9ydCAoKTsKKwkJICBicmVhazsKKwkJfQorCisJICAgIH0KKwl9CisgICAgfQorICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCisgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKKyAgcmV0dXJuIGRhdGE7CisKK2Vycm9yX3JldHVybjoKKyAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQorICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYmZkL3JlbG9jMTYuYyBiL2JmZC9yZWxvYzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3OTUyZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9yZWxvYzE2LmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIDggYW5kIDE2IGJpdCBDT0ZGIHJlbG9jYXRpb24gZnVuY3Rpb25zLCBmb3IgQkZELgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogCitNb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwKKwkJCXNhY0BjeWdudXMuY29tIAorKi8KKworLyogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgY29mZi1oODMwMCBhbmQgY29mZi16OGsgdG8gZG8KKyAgIHJlbG9jYXRpb24uCisKKyAgIEZJWE1FOiBUaGlzIGNvZGUgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBzdXBwb3J0IHRoZSBuZXcgQ09GRgorICAgbGlua2VyLiAgQmFzaWNhbGx5LCB0aGV5IG5lZWQgdG8gZGVhbCB3aXRoIENPRkYgcmVsb2NzIHJhdGhlciB0aGFuCisgICBCRkQgZ2VuZXJpYyByZWxvY3MuICBUaGV5IHNob3VsZCBzdG9yZSB0aGUgcmVsb2NzIGluIHNvbWUgbG9jYXRpb24KKyAgIHdoZXJlIGNvZmZfbGlua19pbnB1dF9iZmQgY2FuIGZpbmQgdGhlbSAoYW5kIGNvZmZfbGlua19pbnB1dF9iZmQKKyAgIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSB0aGlzIGxvY2F0aW9uIHJhdGhlciB0aGFuIHJlcmVhZGluZyB0aGUKKyAgIGZpbGUpICh1bmxlc3MgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIGluIHdoaWNoIGNhc2UgdGhleSBzaG91bGQKKyAgIGZyZWUgdXAgdGhlIHJlbG9jcyBhZnRlciBkZWFsaW5nIHdpdGggdGhlbSkuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImdlbmxpbmsuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCitiZmRfdm1hCitiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbikKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworeworICBiZmRfdm1hIHZhbHVlOworICBhc3ltYm9sICpzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7CisgIC8qIEEgc3ltYm9sIGhvbGRzIGEgcG9pbnRlciB0byBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUKKyAgICAgYmFzZSBvZiB0aGUgc2VjdGlvbi4gIFRvIHJlbG9jYXRlLCB3ZSBmaW5kIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwKKyAgICAgbGl2ZSBpbiB0aGUgb3V0cHV0IGFuZCBhZGQgdGhhdCBpbiAqLworCisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKKyAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBCRkQuICBMb29rIGl0IHVwIGluIHRoZQorCSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBGSVhNRTogVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aGVuCisJIHdlIGNvbnZlcnQgdGhpcyBzdHVmZiB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uCisJIGFuZCBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZQorCSB0aGUgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KKyAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAorCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAorCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwl2YWx1ZSA9IChoLT51LmRlZi52YWx1ZQorCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorCXZhbHVlID0gaC0+dS5jLnNpemU7CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCisJCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAorCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQorCSAgICBhYm9ydCAoKTsKKwkgIHZhbHVlID0gMDsKKwl9CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIHZhbHVlID0gc3ltYm9sLT52YWx1ZSArCisJc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKKwkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKKyAgICB9CisgIAorICAvKiBBZGQgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVsb2NhdGlvbiAqLworICB2YWx1ZSArPSByZWxvYy0+YWRkZW5kOworICAKKyAgcmV0dXJuIHZhbHVlOworfQorCit2b2lkCitiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIHNsaXAsIGlucHV0X3NlY3Rpb24sIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBzbGlwOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgYXN5bWJvbCAqKnM7CisKKyAgcyA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKKyAgQkZEX0FTU0VSVCAocyAhPSAoYXN5bWJvbCAqKikgTlVMTCk7CisKKyAgLyogRmluZCBhbGwgc3ltYm9scyBwYXN0IHRoaXMgcG9pbnQsIGFuZCBtYWtlIHRoZW0ga25vdworICAgICB3aGF0J3MgaGFwcGVuZWQgKi8KKyAgd2hpbGUgKCpzKSAKKyAgICB7CisgICAgICBhc3ltYm9sICpwID0gKnM7CisgICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKSAKKwl7CisJICAvKiBUaGlzIHdhcyBwb2ludGluZyBpbnRvIHRoaXMgc2VjdGlvbiwgc28gbWFuZ2xlIGl0ICovCisJICBpZiAocC0+dmFsdWUgPiB2YWx1ZSkKKwkgICAgeworCSAgICAgIHAtPnZhbHVlIC09IHNsaXA7CisJICAgICAgaWYgKHAtPnVkYXRhLnAgIT0gTlVMTCkKKwkJeworCQkgIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCQkgIGggPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIHAtPnVkYXRhLnA7CisJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7CisJCSAgaC0+cm9vdC51LmRlZi52YWx1ZSAtPSBzbGlwOworCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudS5kZWYudmFsdWUgPT0gcC0+dmFsdWUpOworCQl9CisJICAgIH0KKwl9CisgICAgICBzKys7CisgICAgfSAgICAKK30KKworYm9vbGVhbiAKK2JmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgaSwgbGlua19pbmZvLCBhZ2FpbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqaTsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKKyAgICAgYm9vbGVhbiAqYWdhaW47Cit7CisgIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCisgIGJmZCAqaW5wdXRfYmZkID0gaS0+b3duZXI7CisgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gaTsKKyAgaW50ICpzaHJpbmtzOworICBpbnQgc2hyaW5rID0gMDsKKyAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKKyAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7CisgIGxvbmcgcmVsb2NfY291bnQ7CisKKyAgLyogV2Ugb25seSBkbyBnbG9iYWwgcmVsYXhhdGlvbiBvbmNlLiAgSXQgaXMgbm90IHNhZmUgdG8gZG8gaXQgbXVsdGlwbGUKKyAgICAgdGltZXMgKHNlZSBkaXNjdXNzaW9uIG9mIHRoZSAic2hyaW5rcyIgYXJyYXkgYmVsb3cpLiAgKi8KKyAgKmFnYWluID0gZmFsc2U7CisKKyAgaWYgKHJlbG9jX3NpemUgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocmVsb2Nfc2l6ZSk7CisgIGlmICghcmVsb2NfdmVjdG9yICYmIHJlbG9jX3NpemUgPiAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBHZXQgdGhlIHJlbG9jcyBhbmQgdGhpbmsgYWJvdXQgdGhlbSAqLworICByZWxvY19jb3VudCA9CisgICAgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvY192ZWN0b3IsCisJCQkgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCkpOworICBpZiAocmVsb2NfY291bnQgPCAwKQorICAgIHsKKyAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFRoZSByZWxvYzE2LmMgYW5kIHJlbGF0ZWQgcmVsYXhpbmcgY29kZSBpcyB2ZXJ5IHNpbXBsZSwgdGhlIHByaWNlCisgICAgIGZvciB0aGF0IHNpbXBsaWNpdHkgaXMgd2UgY2FuIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgZm9yCisgICAgIGVhY2ggc2VjdGlvbi4KKworICAgICBTbywgdG8gZ2V0IHRoZSBiZXN0IHJlc3VsdHMgd2l0aGluIHRoYXQgbGltaXRhdGlvbiwgd2UgZG8gbXVsdGlwbGUKKyAgICAgcmVsYXhpbmcgcGFzc2VzIG92ZXIgZWFjaCBzZWN0aW9uIGhlcmUuICBUaGF0IGludm9sdmVzIGtlZXBpbmcgdHJhY2sKKyAgICAgb2YgdGhlICJzaHJpbmsiIGF0IGVhY2ggcmVsb2MgaW4gdGhlIHNlY3Rpb24uICBUaGlzIGFsbG93cyB1cyB0bworICAgICBhY2N1cmF0ZWx5IGRldGVybWluZSB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgdHdvIHJlbG9jcyB3aXRoaW4KKyAgICAgdGhpcyBzZWN0aW9uLgorCisgICAgIEluIHRoZW9yeSwgaWYgd2Uga2VwdCB0aGUgInNocmlua3MiIGFycmF5IGZvciBlYWNoIHNlY3Rpb24gZm9yIHRoZQorICAgICBlbnRpcmUgbGluaywgd2UgY291bGQgdXNlIHRoZSBnZW5lcmljIHJlbGF4aW5nIGNvZGUgaW4gdGhlIGxpbmtlcgorICAgICBhbmQgZ2V0IGJldHRlciByZXN1bHRzLCBwYXJ0aWN1bGFybHkgZm9yIGpzci0+YnNyIGFuZCAyNC0+MTYgYml0CisgICAgIG1lbW9yeSByZWZlcmVuY2UgcmVsYXhhdGlvbnMuICAqLworICAgICAKKyAgaWYgKHJlbG9jX2NvdW50ID4gMCkKKyAgICB7CisgICAgICBpbnQgYW5vdGhlcl9wYXNzID0gMDsKKworICAgICAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHNocmlua3MgYXJyYXkgZm9yIHRoaXMgc2VjdGlvbi4gICovCisgICAgICBzaHJpbmtzID0gKGludCAqKSBiZmRfbWFsbG9jIChyZWxvY19jb3VudCAqIHNpemVvZiAoaW50KSk7CisgICAgICBtZW1zZXQgKHNocmlua3MsIDAsIHJlbG9jX2NvdW50ICogc2l6ZW9mIChpbnQpKTsKKworICAgICAgLyogTG9vcCB1bnRpbCBub3RoaW5nIGNoYW5nZXMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KKyAgICAgIGRvIHsKKwlhcmVsZW50ICoqcGFyZW50OworCXVuc2lnbmVkIGludCBpOworCWxvbmcgajsKKworCWFub3RoZXJfcGFzcyA9IDA7CisKKwlmb3IgKGkgPSAwLCBwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrLCBpKyspIAorCSAgeworCSAgICAvKiBMZXQgdGhlIHRhcmdldC9tYWNoaW5lIGRlcGVuZGVudCBjb2RlIGV4YW1pbmUgZWFjaCByZWxvYworCSAgICAgICBpbiB0aGlzIHNlY3Rpb24gYW5kIGF0dGVtcHQgdG8gc2hyaW5rIGl0LiAgKi8KKwkgICAgc2hyaW5rID0gYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgKnBhcmVudCwKKwkJCQkJCXNocmlua3NbaV0sIGxpbmtfaW5mbyk7CisKKwkgICAgLyogSWYgaXQgc2hydW5rLCBub3RlIGl0IGluIHRoZSBzaHJpbmtzIGFycmF5IGFuZCBzZXQgdXAgZm9yCisJICAgICAgIGFub3RoZXIgcGFzcy4gICovCisJICAgIGlmIChzaHJpbmsgIT0gc2hyaW5rc1tpXSkKKwkgICAgICB7CisJICAgICAgICBhbm90aGVyX3Bhc3MgPSAxOworCQlmb3IgKGogPSBpICsgMTsgaiA8IHJlbG9jX2NvdW50OyBqKyspCisJCSAgc2hyaW5rc1tqXSArPSBzaHJpbmsgLSBzaHJpbmtzW2ldOworCSAgICAgIH0KKwkgIH0KKyAgCisgICAgICB9IHdoaWxlIChhbm90aGVyX3Bhc3MpOworCisgICAgICBmcmVlKChjaGFyICopc2hyaW5rcyk7CisgICAgfQorCisgIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSAtPSBzaHJpbms7ICAKKyAgZnJlZSgoY2hhciAqKXJlbG9jX3ZlY3Rvcik7CisgIHJldHVybiB0cnVlOworfQorCitiZmRfYnl0ZSAqCitiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyhpbl9hYmZkLAorCQkJCQkJbGlua19pbmZvLAorCQkJCQkJbGlua19vcmRlciwKKwkJCQkJCWRhdGEsCisJCQkJCQlyZWxvY2F0ZWFibGUsCisJCQkJCQlzeW1ib2xzKQorICAgICBiZmQgKmluX2FiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KKyAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOworICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKKyAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKKyAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKKyAgbG9uZyByZWxvY19jb3VudDsKKworICBpZiAocmVsb2Nfc2l6ZSA8IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogSWYgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGRvbid0IGJvdGhlciB0byByZWxheC4gICovCisgIGlmIChyZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoaW5fYWJmZCwgbGlua19pbmZvLAorCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsCisJCQkJCQkgICAgICAgZGF0YSwgcmVsb2NhdGVhYmxlLAorCQkJCQkJICAgICAgIHN5bWJvbHMpOworCisgIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KKyAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGlucHV0X2JmZCwKKwkJCQkgaW5wdXRfc2VjdGlvbiwKKwkJCQkgZGF0YSwKKwkJCQkgMCwKKwkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIAorICByZWxvY192ZWN0b3IgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYygoc2l6ZV90KSByZWxvY19zaXplKTsKKyAgaWYgKCFyZWxvY192ZWN0b3IgJiYgcmVsb2Nfc2l6ZSAhPSAwKQorICAgIHJldHVybiBOVUxMOworICAKKyAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIAorCQkJCQlpbnB1dF9zZWN0aW9uLAorCQkJCQlyZWxvY192ZWN0b3IsCisJCQkJCXN5bWJvbHMpOworICBpZiAocmVsb2NfY291bnQgPCAwKQorICAgIHsKKyAgICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgIGlmIChyZWxvY19jb3VudCA+IDApCisgICAgeworICAgICAgYXJlbGVudCAqKnBhcmVudCA9IHJlbG9jX3ZlY3RvcjsKKyAgICAgIGFyZWxlbnQgKnJlbG9jIDsKKyAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7CisgICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOworICAgICAgdW5zaWduZWQgaW50IHJ1bjsKKyAgICAgIHVuc2lnbmVkIGludCBpZHg7CisgICAgCisgICAgICAvKiBGaW5kIGhvdyBsb25nIGEgcnVuIHdlIGNhbiBkbyAqLworICAgICAgd2hpbGUgKGRzdF9hZGRyZXNzIDwgbGlua19vcmRlci0+c2l6ZSkgCisJeworCSAgcmVsb2MgPSAqcGFyZW50OworCSAgaWYgKHJlbG9jKSAKKwkgICAgeworCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQorCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQorCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLworCSAgICAgIHJ1biA9IHJlbG9jLT5hZGRyZXNzIC0gc3JjX2FkZHJlc3M7CisJICAgICAgcGFyZW50Kys7CisJICAgIH0KKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7CisJICAgIH0KKwkgIC8qIENvcHkgdGhlIGJ5dGVzICovCisJICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCisJICAgIHsKKwkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKKwkgICAgfQorICAgIAorCSAgLyogTm93IGRvIHRoZSByZWxvY2F0aW9uICovCisgICAgCisJICBpZiAocmVsb2MpIAorCSAgICB7CisJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCisJCQkJCSAgICByZWxvYywgZGF0YSwgJnNyY19hZGRyZXNzLAorCQkJCQkgICAgJmRzdF9hZGRyZXNzKTsKKwkgICAgfSAgICAKKwl9CisgICAgfQorICBmcmVlKChjaGFyICopcmVsb2NfdmVjdG9yKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKZGlmZiAtLWdpdCBhL2JmZC9yaXNjaXguYyBiL2JmZC9yaXNjaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFiNDlhCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3Jpc2NpeC5jCkBAIC0wLDAgKzEsNjQ0IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIFJJU0MgaVggKEFjb3JuLCBhcm0pIGJpbmFyaWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKyAgIAorVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFJJU0MgaVggb3ZlcmxvYWRzIHRoZSBNQUdJQyBmaWVsZCB0byBpbmRpY2F0ZSBtb3JlIHRoYW4ganVzdCB0aGUgdXN1YWwKKyAgIFtaTk9dTUFHSUMgdmFsdWVzLiAgQWxzbyBpbmNsdWRlZCBhcmUgc3F1ZWV6aW5nIGluZm9ybWF0aW9uIGFuZAorICAgc2hhcmVkIGxpYnJhcnkgdXNhZ2UuICAqLworCisvKiBUaGUgZm9sbG93aW5nIGNvbWUgZnJvbSB0aGUgbWFuIHBhZ2UuICAqLworI2RlZmluZSBTSExJQkxFTiA2MAorCisjZGVmaW5lIE1GX0lNUFVSRSAgICAgICAwMDIwMAorI2RlZmluZSBNRl9TUVVFRVpFRCAgICAgMDEwMDAKKyNkZWZpbmUgTUZfVVNFU19TTCAgICAgIDAyMDAwCisjZGVmaW5lIE1GX0lTX1NMICAgICAgICAwNDAwMAorCisvKiBDb21tb24gY29tYmluYXRpb25zLiAgKi8KKyNkZWZpbmUgSU1BR0lDICAgICAgICAgIChNRl9JTVBVUkV8Wk1BR0lDKSAgICAgIC8qIERlbWFuZCBsb2FkIChpbXB1cmUgdGV4dCkgKi8KKyNkZWZpbmUgU1BPTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfE9NQUdJQykgICAgIC8qIE9NQUdJQyB3aXRoIGxhcmdlIGhlYWRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIG1heSBjb250YWluIGEgcmVmIHRvIGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFyZWQgbGliIHJlcXVpcmVkIGJ5IHRoZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdC4gKi8KKyNkZWZpbmUgU0xPTUFHSUMgICAgICAgIChNRl9JU19TTHxPTUFHSUMpIC8qIEEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIGxpYnJhcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG9iamVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGFpbnMgIm92ZXJmbG93IHRleHQiIGZyb20gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzaGFyZWQgbGlicmFyeSB0byBiZSBsaW5rZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHdpdGggYW4gb2JqZWN0ICovCisjZGVmaW5lIFFNQUdJQyAgICAgICAgICAoTUZfU1FVRUVaRUR8Wk1BR0lDKSAgICAvKiBTcWVlemVkIGRlbWFuZCBwYWdlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaW50ZXJwcmV0YXRpb24gb2YgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNQUdJQyBzZWVtcyB0byBiZSBhdCB2YXJpYW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aCB0aGF0IHVzZWQgb24gb3RoZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyY2hpdGVjdHVyZXMuICovCisjZGVmaW5lIFNQWk1BR0lDICAgICAgICAoTUZfVVNFU19TTHxaTUFHSUMpICAgICAvKiBwcm9ncmFtIHdoaWNoIHVzZXMgc2wgKi8KKyNkZWZpbmUgU1BRTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfFFNQUdJQykgICAgIC8qIHNxZWV6ZWQgZGl0dG8gKi8KKyNkZWZpbmUgU0xaTUFHSUMgICAgICAgIChNRl9JU19TTHxaTUFHSUMpICAgICAgIC8qIHNoYXJlZCBsaWIgcGFydCBvZiBwcm9nICovCisjZGVmaW5lIFNMUFpNQUdJQyAgICAgICAoTUZfVVNFU19TTHxTTFpNQUdJQykgICAvKiBzbCB3aGljaCB1c2VzIGFub3RoZXIgKi8KKworI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2luZm8gJiBNRl9VU0VTX1NMKQorCisvKiBPbmx5IGEgcHVyZSBPTUFHSUMgZmlsZSBoYXMgdGhlIG1pbmltYWwgaGVhZGVyICovCisjZGVmaW5lIE5fVFhUT0ZGKHgpICAgICAgICAgICAgICAgICAgICAgXAorICgoeCkuYV9pbmZvID09IE9NQUdJQyA/IDMyICAgICAgICAgICAgIFwKKyAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMpID8gVEFSR0VUX1BBR0VfU0laRSAgXAorICA6IDk5OSkKKworI2RlZmluZSBOX1RYVEFERFIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC8qIFByb2dyYW1zIHdpdGggc2hhcmVkIGxpYnMgYXJlIGxvYWRlZCBhdCB0aGUgZmlyc3QgcGFnZSBhZnRlciBhbGwgdGhlICAgXAorICAgICAgdGV4dCBzZWdtZW50cyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgcHJvZ3JhbXMuICBXaXRob3V0IGxvb2tpbmcgdGhpcyAgICBcCisgICAgICB1cCB3ZSBjYW4ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgYWRkcmVzcyB3aWxsIGJlLiAgQSByZWFzb25hYmxlIGd1ZXNzIFwKKyAgICAgIGlzIHRoYXQgYV9lbnRyeSB3aWxsIGJlIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBleGVjdXRhYmxlLiAgKi8gICAgICAgXAorICAgOiBOX1NIQVJFRF9MSUIoeCkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiBURVhUX1NUQVJUX0FERFIpCisKKyNkZWZpbmUgTl9TWU1PRkYoeCkgXAorICAoTl9UWFRPRkYgKHgpICsgKHgpLmFfdGV4dCArICh4KS5hX2RhdGEgKyAoeCkuYV90cnNpemUgKyAoeCkuYV9kcnNpemUpCisKKyNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGICh4KSArICh4KS5hX3N5bXMpCisKKyNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDMyNzY4CisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMzI3NjgKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKyNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2FybQorCisjZGVmaW5lIE1ZKE9QKSBDQVQocmlzY2l4XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcmlzY2l4IgorI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCisjZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgXAorICB7CQkJCQkJCQkJICAgXAorICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJCSAgIFwKKyAgICBmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkJICAgXAorICAgIGlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJCSAgIFwKKyAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwkgICBcCisgICAgCQkJCQkJCQkJICAgXAorICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgIFwKKyAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgXAorICAgIAkJCQkJCQkJCSAgIFwKKyAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKKwkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAorICAgIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgXAorCQkgICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCQkgICBcCisgICAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJCSAgIFwKKyAgICAJCQkJCQkJCQkgICBcCisgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgIFwKKyAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkJICAgXAorCSE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICBcCisgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKKyAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgXAorCQkJCQkJCQkJICAgXAorICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkJICAgXAorCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCQkJCSAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICBcCisJaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgIFwKKwkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAorCQkJCQkJCQkJICAgXAorCWlmICghIE5BTUUoYW91dCx3cml0ZV9zeW1zKShhYmZkKSkgcmV0dXJuIGZhbHNlOwkJICAgXAorCQkJCQkJCQkJICAgXAorCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCisJICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKwlpZiAoISByaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCSAgIFwKKwkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAorCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCisJICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKwlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkJICAgXAorCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCisgICAgICB9CQkJCQkJCQkJICAgXAorICB9CisKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAorCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcmlzY2l4X2ZpeF9wY3JlbF8yNiBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKKwkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tdID0geworICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCisgIEhPV1RPKCAwLCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwgICAgICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAorICBIT1dUTyggMSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPKCAyLCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oIDMsICAgICAgICAgICAgICAyLCAgMywgICAyNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNiAsICJBUk0yNiIsICAgICAgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCisgIEhPV1RPKCA0LCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIHRydWUpLAorICBIT1dUTyggNSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCB0cnVlKSwKKyAgSE9XVE8oIDYsICAgICAgICAgICAgICAwLCAgMiwgICAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AzMiIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgdHJ1ZSksCisgIEhPV1RPKCA3LCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICByaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUsICJBUk0yNkQiLHRydWUsMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCisgIHstMX0sCisgIEhPV1RPKCA5LCAgICAgICAgICAgICAgMCwgLTEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUcxNiIsICAgICAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKKyAgSE9XVE8oIDEwLCAgICAgICAgICAgICAgMCwgLTIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUczMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKQorfTsKKworI2RlZmluZSBSSVNDSVhfVEFCTEVfU0laRSBcCisgIChzaXplb2YgKHJpc2NpeF9zdGRfcmVsb2NfaG93dG8pIC8gc2l6ZW9mIChyZWxvY19ob3d0b190eXBlKSkKKworCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCityaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCisJCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLworICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCitzdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCityaXNjaXhfZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAorCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOworeworICBiZmRfdm1hIHJlbG9jYXRpb247CisgIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOworICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7CisgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOworICAKKyAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KKyAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCisgICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQorICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKKworICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKKyAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCisgIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQorICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKKyAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOworCisgIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKKyAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7CisgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOworICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisgIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgcmVsb2NhdGlvbiAtPSBhZGRyOworICBpZiAocmVsb2NhdGlvbiAmIDMpCisgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKKworICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQorICAgIHsKKyAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCisJZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKKyAgICB9CisgIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKKyAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OworCisgIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKKyAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOworCisgIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgorICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCisgIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZyaXNjaXhfc3RkX3JlbG9jX2hvd3RvWzddOworICAKKyAgcmV0dXJuIGZsYWc7Cit9CisKK3JlbG9jX2hvd3RvX3R5cGUgKgorREVGVU4ocmlzY2l4X3JlbG9jX3R5cGVfbG9va3VwLChhYmZkLGNvZGUpLAorICAgICAgYmZkICphYmZkIEFORAorICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpCit7CisjZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tqXQorICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKKyAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKKyAgICAgIHsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7CisgICAgICB9CisKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNiwgMSk7CisgICAgICBBU1REIChCRkRfUkVMT0NfMzIsIDIpOworICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsIDMpOworICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOworICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKKyAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7CisgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7CisgICAgfQorfQorCisjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgc2hvdWxkX25vdF9iZV91c2VkCisjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisKKyNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJpc2NpeF9yZWxvY190eXBlX2xvb2t1cAorI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgcmlzY2l4X2Nhbm9uaWNhbGl6ZV9yZWxvYworI2RlZmluZSBNWV9vYmplY3RfcCByaXNjaXhfb2JqZWN0X3AKKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnJpc2NpeF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOworCit2b2lkCityaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqZzsKKyAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOworeworICBpbnQgcl9pbmRleDsKKyAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7CisgIGludCByX2V4dGVybjsKKyAgaW50IHJfbGVuZ3RoOworICBpbnQgcl9wY3JlbDsKKyAgaW50IHJfbmVnID0gMDsJLyogTmVnYXRpdmUgcmVsb2NzIHVzZSB0aGUgQkFTRVJFTCBiaXQuICAqLworICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOworCisgIFBVVF9XT1JEKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKKworICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplIDsgICAvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCisgIGlmIChyX2xlbmd0aCA8IDApCisgICAgeworICAgICAgcl9sZW5ndGggPSAtcl9sZW5ndGg7CisgICAgICByX25lZyA9IDE7CisgICAgfQorCisgIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KKworICAvKiBGb3IgUklTQyBpWCwgaW4gcGMtcmVsYXRpdmUgcmVsb2NzIHRoZSByX3BjcmVsIGJpdCBtZWFucyB0aGF0IHRoZQorICAgICByZWxvY2F0aW9uIGhhcyBiZWVuIGRvbmUgYWxyZWFkeSAoT25seSBmb3IgdGhlIDI2LWJpdCBvbmUgSSB0aGluayk/Pz8hISEKKyAgICAgKi8KKyAgCisgIGlmIChyX2xlbmd0aCA9PSAzKQorICAgIHJfcGNyZWwgPSByX3BjcmVsID8gMCA6IDE7CisgIAorCisjaWYgMAorICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLworICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7CisjZW5kaWYKKworICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLworCisgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKKyAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCisKKyAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAorICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KKyAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQorICAgICAqLworCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQorICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgorICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKKyAgICB7CisgICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCisJeworCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAorCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KKwkgIHJfaW5kZXggPSAwOworCSAgcl9leHRlcm4gPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGaWxsIGluIHN5bWJvbCAqLworCSAgcl9leHRlcm4gPSAxOworCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKyAgICB9CisKKyAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KKyAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisgICAgeworICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7CisgICAgICBuYXRwdHItPnJfdHlwZVswXSA9CisJKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQorCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOiAwKQorCSB8IChyX25lZyAgICA/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUc6IDApCisJIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKKyAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7CisgICAgICBuYXRwdHItPnJfdHlwZVswXSA9CisJKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQorCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQorCSB8IChyX25lZyAgICA/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEU6IDApCisJIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7CisgICAgfQorfQorCitib29sZWFuCityaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGFyZWxlbnQgKipnZW5lcmljOworICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7CisgIHNpemVfdCBlYWNoX3NpemU7CisgIAorICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgc2l6ZV90IG5hdHNpemU7CisKKyAgaWYgKGNvdW50ID09IDApIHJldHVybiB0cnVlOworCisgIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKKyAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OworICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKKyAgaWYgKCFuYXRpdmUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKKworICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKKyAgICAgICBjb3VudCAhPSAwOworICAgICAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKKyAgICByaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCAqZ2VuZXJpYywKKwkJCSAgICAgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBuYXRwdHIpOworCisgIGlmICggYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qCisgKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgorICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KKyAqLworbG9uZworTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCisgICAgICBiZmQgKmFiZmQ7CisgICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgICBhcmVsZW50ICoqcmVscHRyOworICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247CisgIHVuc2lnbmVkIGludCBjb3VudCwgYzsKKyAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSlbXTsKKworICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCisgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgeworICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47CisKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgeworICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7CisgICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OworICAgIH0KKyAgICAqcmVscHRyID0gMDsKKyAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7CisgIH0KKyAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgeworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQorICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7CisgICAgKnJlbHB0ciA9IDA7CisgICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OworICB9CisKKyAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQorICAgIHJldHVybiAtMTsKKyAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKworICAvKiBmaXggdXAgaG93dG8gZW50cmllcyAqLworICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKKyAgICB7CisgICAgICBjID0gdGJscHRyLT5ob3d0byAtIE5BTUUoYW91dCxzdGRfaG93dG9fdGFibGUpOworICAgICAgQkZEX0FTU0VSVCAoYyA8IFJJU0NJWF9UQUJMRV9TSVpFKTsKKyAgICAgIHRibHB0ci0+aG93dG8gPSAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tjXTsKKworICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7CisgICAgfQorICAqcmVscHRyID0gMDsKKyAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OworfQorCisvKiBUaGlzIGlzIHRoZSBzYW1lIGFzIE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApLCBidXQgaGFzIGRpZmZlcmVudCAKKyAgIGV4cGFuc2lvbnMgb2YgdGhlIG1hY3JvIGRlZmluaXRpb25zLiAgKi8KKworY29uc3QgYmZkX3RhcmdldCAqCityaXNjaXhfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCBleGVjcCwgY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7CisgICAgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKK3sKKyAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0ciwgKm9sZHJhd3B0cjsKKyAgY29uc3QgYmZkX3RhcmdldCAqcmVzdWx0OworCisgIHJhd3B0ciA9ICgoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICopIAorCSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpKTsKKworICBpZiAocmF3cHRyID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgb2xkcmF3cHRyID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhOworICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7CisKKyAgLyogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIG9sZCB0ZGF0YSBzdHJ1Y3QuCisgICAgIEluIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhlIHN1YmZvcm1hdCwgc2luY2UgZm9yIGhwdXggaXQgd2FzIHNldCBpbgorICAgICBocDMwMGhwdXguYzpzd2FwX2V4ZWNfaGVhZGVyX2luIGFuZCB3aWxsIGJlIHVzZWQgaW4KKyAgICAgaHAzMDBocHV4LmM6Y2FsbGJhY2suICAqLworICBpZiAob2xkcmF3cHRyICE9IE5VTEwpCisgICAgKmFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9ICpvbGRyYXdwdHI7CisKKyAgYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkciA9ICZyYXdwdHItPmU7CisgICooYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcikgPSAqZXhlY3A7ICAgICAvKiBDb3B5IGluIHRoZSBpbnRlcm5hbF9leGVjCisJCQkJCQkgICBzdHJ1Y3QgKi8KKyAgZXhlY3AgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyOworCisgIC8qIFNldCB0aGUgZmlsZSBmbGFncyAqLworICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKKyAgaWYgKGV4ZWNwLT5hX2Ryc2l6ZSB8fCBleGVjcC0+YV90cnNpemUpCisgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOworICAvKiBTZXR0aW5nIG9mIEVYRUNfUCBoYXMgYmVlbiBkZWZlcnJlZCB0byB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24gKi8KKyAgaWYgKGV4ZWNwLT5hX3N5bXMpCisgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKKyAgaWYgKE5fRFlOQU1JQygqZXhlY3ApKQorICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7CisKKwkJCQkJCQkJICAKKyAgaWYgKChleGVjcC0+YV9pbmZvICYgTUZfU1FVRUVaRUQpICE9IDApIC8qIFNxdWVlemVkIGZpbGVzIGFyZW4ndCBzdXBwb3J0ZWQgCisJCQkJCSAgICAgKHlldCkhICovCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKChleGVjcC0+YV9pbmZvICYgTUZfSVNfU0wpICE9IDApCS8qIE5vciBhcmUgc2hhcmVkIGxpYnJhcmllcyAqLworICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IFpNQUdJQykKKyAgICB7CisgICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKKyAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7CisgICAgfQorICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE5NQUdJQykKKyAgICB7CisgICAgICBhYmZkLT5mbGFncyB8PSBXUF9URVhUOworICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gbl9tYWdpYzsKKyAgICB9CisgIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gT01BR0lDKQorICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG9fbWFnaWM7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGNoZWNrZWQgd2l0aCBOX0JBRE1BRyBiZWZvcmUgdGhpcyByb3V0aW5lCisgICAgICAgICB3YXMgY2FsbGVkLiAgKi8KKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gZXhlY3AtPmFfZW50cnk7CisKKyAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSAoYW91dF9zeW1ib2xfdHlwZSAqKU5VTEw7CisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKKworICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBWNyBVbml4LiAgKi8KKyAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisKKyAgLyogVGhlIGRlZmF1bHQgc3ltYm9sIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBVbml4LiAqLworICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gRVhURVJOQUxfTkxJU1RfU0laRTsKKworICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7CisgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKKyAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBOVUxMOworCisgIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9kYXRhOworICBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfYnNzOworCisgIG9ial90ZXh0c2VjIChhYmZkKS0+ZmxhZ3MgPQorICAgIChleGVjcC0+YV90cnNpemUgIT0gMAorICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKKyAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKKyAgb2JqX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9CisgICAgKGV4ZWNwLT5hX2Ryc2l6ZSAhPSAwCisgICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQorICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOworICBvYmpfYnNzc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0M7CisKKyAgcmVzdWx0ID0gKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKShhYmZkKTsKKworI2lmIGRlZmluZWQoTUFDSCkgfHwgZGVmaW5lZChTVEFUX0ZPUl9FWEVDKQorICAvKiBUaGUgb3JpZ2luYWwgaGV1cmlzdGljIGRvZXNuJ3Qgd29yayBpbiBzb21lIGltcG9ydGFudCBjYXNlcy4gVGhlCisgICAqIGEub3V0IGZpbGUgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHN0YXJ0IGFkZHJlc3MuIEZvcgorICAgKiBmaWxlcyAobGlrZSBrZXJuZWxzKSBsaW5rZWQgdG8gbm9uLXN0YW5kYXJkIGFkZHJlc3NlcyAobGQgLVR0ZXh0CisgICAqIG5ubikgdGhlIGVudHJ5IHBvaW50IG1heSBub3QgYmUgYmV0d2VlbiB0aGUgZGVmYXVsdCB0ZXh0IHN0YXJ0CisgICAqIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSBhbmQgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpICsgdGV4dCBzaXplCisgICAqIFRoaXMgaXMgbm90IGp1c3QgYSBtYWNoIGlzc3VlLiBNYW55IGtlcm5lbHMgYXJlIGxvYWRlZCBhdCBub24KKyAgICogc3RhbmRhcmQgYWRkcmVzc2VzLgorICAgKi8KKyAgeworICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOworICAgIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMCisJJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMAorICAgICAgICAmJiAoZnN0YXQoZmlsZW5vKChGSUxFICopIChhYmZkLT5pb3N0cmVhbSkpLCAmc3RhdF9idWYpID09IDApCisgICAgICAgICYmICgoc3RhdF9idWYuc3RfbW9kZSAmIDAxMTEpICE9IDApKQorICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOworICB9CisjZWxzZSAvKiAhIE1BQ0ggKi8KKyAgLyogTm93IHRoYXQgdGhlIHNlZ21lbnQgYWRkcmVzc2VzIGhhdmUgYmVlbiB3b3JrZWQgb3V0LCB0YWtlIGEgYmV0dGVyCisgICAgIGd1ZXNzIGF0IHdoZXRoZXIgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS4gIElmIHRoZSBlbnRyeSBwb2ludAorICAgICBpcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYXNzdW1lIGl0IGlzLiAgKFRoaXMgbWFrZXMgZmlsZXMKKyAgICAgZXhlY3V0YWJsZSBldmVuIGlmIHRoZWlyIGVudHJ5IHBvaW50IGFkZHJlc3MgaXMgMCwgYXMgbG9uZyBhcworICAgICB0aGVpciB0ZXh0IHN0YXJ0cyBhdCB6ZXJvLikKKworICAgICBBdCBzb21lIHBvaW50IHdlIHNob3VsZCBwcm9iYWJseSBicmVhayBkb3duIGFuZCBzdGF0IHRoZSBmaWxlIGFuZAorICAgICBkZWNsYXJlIGl0IGV4ZWN1dGFibGUgaWYgKG9uZSBvZikgaXRzICd4JyBiaXRzIGFyZSBvbi4uLiAgKi8KKyAgaWYgKChleGVjcC0+YV9lbnRyeSA+PSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSAmJgorICAgICAgKGV4ZWNwLT5hX2VudHJ5IDwgb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpKQorICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKKyNlbmRpZiAvKiBNQUNIICovCisgIGlmIChyZXN1bHQpCisgICAgeworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZyZWUgKHJhd3B0cik7CisgICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSBvbGRyYXdwdHI7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK01ZKG9iamVjdF9wKSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOyAgICAgIC8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KKyAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsgICAgICAgICAgICAvKiBDbGVhbmVkLXVwIGV4ZWMgaGVhZGVyICovCisgIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCisgICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKKyAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7CisKKyAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7CisjaWZkZWYgTUFDSFRZUEVfT0sKKyAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOworI2VuZGlmCisKKyAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7CisKKyAgdGFyZ2V0ID0gcmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmV4ZWMsIE1ZKGNhbGxiYWNrKSk7CisKKyAgcmV0dXJuIHRhcmdldDsKK30KKworCisjaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9yczYwMDAtY29yZS5jIGIvYmZkL3JzNjAwMC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9yczYwMDAtY29yZS5jCkBAIC0wLDAgKzEsNTA3IEBACisvKiBJQk0gUlMvNjAwMCAiWENPRkYiIGJhY2stZW5kIGZvciBCRkQuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/CisgICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAorICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0CisgICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgorICAgV3JpdHRlbiBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUsIAorICAgICBhbmQgSm9obiBHaWxtb3JlLgorICAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCisgICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24gYW5kIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgcG9ydCBjdXJyZW50bHkgb25seSBoYW5kbGVzIHJlYWRpbmcgb2JqZWN0IGZpbGVzLCBleGNlcHQgd2hlbgorICAgY29tcGlsZWQgb24gYW4gUlMvNjAwMCBob3N0LiAgLS0gbm8gYXJjaGl2ZSBzdXBwb3J0LCBubyBjb3JlIGZpbGVzLgorICAgSW4gYWxsIGNhc2VzLCBpdCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcuCisKKyAgIEZJWE1FbWdvIGNvbW1lbnRzIGFyZSBsZWZ0IGZyb20gTWV0aW4gT3ppc2lrJ3Mgb3JpZ2luYWwgcG9ydC4KKworICAgVGhpcyBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgZnJvbSBjb2ZmLXJzNjAwMC5jLCBiZWNhdXNlIGl0IGluY2x1ZGVzCisgICBzeXN0ZW0gaW5jbHVkZSBmaWxlcyB0aGF0IGNvbmZsaWN0IHdpdGggY29mZi9yczYwMDAuaC4KKyAgKi8KKworLyogSW50ZXJuYWxjb2ZmLmggYW5kIGNvZmZjb2RlLmggbW9kaWZ5IHRoZW1zZWx2ZXMgYmFzZWQgb24gdGhpcyBmbGFnLiAgKi8KKyNkZWZpbmUgUlM2MDAwQ09GRl9DIDEKKworLyogVGhlIEFJWCA0LjEga2VybmVsIGlzIG9idmlvdXNseSBjb21waWxlZCB3aXRoIC1EX0xPTkdfTE9ORywgc28KKyAgIHdlIGhhdmUgdG8gZGVmaW5lIF9MT05HX0xPTkcgZm9yIG9sZGVyIHZlcnNpb25zIG9mIGdjYyB0byBnZXQgdGhlCisgICBwcm9wZXIgYWxpZ25tZW50cyBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUuICAqLworI2lmIGRlZmluZWQoX0FJWDQxKSAmJiAhZGVmaW5lZChfTE9OR19MT05HKQorI2RlZmluZSBfTE9OR19MT05HCisjZW5kaWYKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaWZkZWYgQUlYX0NPUkUKKworLyogQU9VVEhEUiBpcyBkZWZpbmVkIGJ5IHRoZSBhYm92ZS4gIFdlIG5lZWQgYW5vdGhlciBkZWZuIG9mIGl0LCBmcm9tIHRoZQorICAgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICBQdW50IHRoZSBvbGQgb25lIGFuZCBnZXQgdXMgYSBuZXcgbmFtZSBmb3IgdGhlCisgICB0eXBlZGVmIGluIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gICovCisjaWZkZWYgQU9VVEhEUgorI3VuZGVmIEFPVVRIRFIKKyNlbmRpZgorI2RlZmluZQlBT1VUSERSCXNlY29uZF9BT1VUSERSCisKKyN1bmRlZglTQ05IRFIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCVN1cHBvcnQgZm9yIGNvcmUgZmlsZSBzdHVmZi4uIAkJCQkJICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8c3lzL2xkci5oPgorI2luY2x1ZGUgPHN5cy9jb3JlLmg+CisKKworLyogTnVtYmVyIG9mIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMgc3VwcG9ydGVkIGJ5IGdkYi4gIFRoaXMgdmFsdWUKKyAgIHNob3VsZCBtYXRjaCBgdG0uaCcgaW4gZ2RiIGRpcmVjdG9yeS4gIENsZWFuIHRoaXMgbWVzcyB1cCBhbmQgdXNlCisgICB0aGUgbWFjcm9zIGluIHN5cy9yZWcuaC4gIEZJWE1FbWdvLiAqLworCisjZGVmaW5lCU5VTV9PRl9TUEVDX1JFR1MgIDcKKworI2RlZmluZQljb3JlX2hkcihiZmQpCQkoKChSczZrQ29yRGF0YSopKGJmZC0+dGRhdGEuYW55KSktPmhkcikKKworLyogQUlYIDQuMSBDaGFuZ2VkIHRoZSBuYW1lcyBhbmQgbG9jYXRpb25zIG9mIGEgZmV3IGl0ZW1zIGluIHRoZSBjb3JlIGZpbGUsCisgICB0aGlzIHNlZW1zIHRvIGJlIHRoZSBxdWlja2VzdCBlYXNpZXQgd2F5IHRvIGRlYWwgd2l0aCBpdC4gCisKKyAgIE5vdGUgaG93ZXZlciB0aGF0IGVuY29kaW5nIG1hZ2ljIGFkZHJlc3NlcyAoU1RBQ0tfRU5EX0FERFIpIGlzIGdvaW5nCisgICB0byBiZSBfdmVyeV8gZnJhZ2lsZS4gIEJ1dCBJIGRvbid0IHNlZSBhbnkgZWFzeSB3YXkgdG8gZ2V0IHRoYXQgaW5mbworICAgcmlnaHQgbm93LiAgKi8KKyNpZmRlZiBDT1JFX1ZFUlNJT05fMQorI2RlZmluZSBDT1JFX0RBVEFfU0laRV9GSUVMRCBjX3UuVV9kc2l6ZQorI2RlZmluZSBDT1JFX0NPTU1fRklFTEQgY191LlVfY29tbQorI2RlZmluZSBTQVZFX0ZJRUxEIGNfbXN0CisjZGVmaW5lCVNUQUNLX0VORF9BRERSIDB4MmZmMjMwMDAKKyNlbHNlCisjZGVmaW5lIENPUkVfREFUQV9TSVpFX0ZJRUxEIGNfdS51X2RzaXplCisjZGVmaW5lIENPUkVfQ09NTV9GSUVMRCBjX3UudV9jb21tCisjZGVmaW5lIFNBVkVfRklFTEQgY191LnVfc2F2ZQorI2RlZmluZQlTVEFDS19FTkRfQUREUiAweDJmZjgwMDAwCisjZW5kaWYKKworLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGNvcmVfZHVtcCBoZHI7CQkvKiBjb3JlIGZpbGUgaGVhZGVyICovCit9IFJzNmtDb3JEYXRhOworCitzdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLAorCQkJCQkgICAgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKKworc3RhdGljIGFzZWN0aW9uICoKK21ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOworICAgICBiZmRfdm1hIHZtYTsKKyAgICAgZmlsZV9wdHIgZmlsZXBvczsKK3sKKyAgYXNlY3Rpb24gKmFzZWN0OworCisgIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOworICBpZiAoIWFzZWN0KQorICAgIHJldHVybiBOVUxMOworCisgIGFzZWN0LT5mbGFncyA9IGZsYWdzOworICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOworICBhc2VjdC0+dm1hID0gdm1hOworICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7CisgIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA4OworCisgIHJldHVybiBhc2VjdDsKK30KKworLyogRGVjaWRlIGlmIGEgZ2l2ZW4gYmZkIHJlcHJlc2VudHMgYSBgY29yZScgZmlsZSBvciBub3QuIFRoZXJlIHJlYWxseSBpcyBubworICAgbWFnaWMgbnVtYmVyIG9yIGFueXRoaW5nIGxpa2UsIGluIHJzNjAwMGNvZmYuICovCisKK2NvbnN0IGJmZF90YXJnZXQgKgorcnM2MDAwY29mZl9jb3JlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGNvcmVfZHVtcCBjb3JlZGF0YTsKKyAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgYmZkX3NpemVfdHlwZSBucmVhZDsKKyAgY2hhciAqdG1wcHRyOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbnJlYWQgPSBiZmRfcmVhZCAoJmNvcmVkYXRhLCAxLCBzaXplb2YgKHN0cnVjdCBjb3JlX2R1bXApLCBhYmZkKTsKKyAgaWYgKG5yZWFkICE9IHNpemVvZiAoc3RydWN0IGNvcmVfZHVtcCkpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChiZmRfc3RhdCAoYWJmZCwgJnN0YXRidWYpIDwgMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIElmIHRoZSBjb3JlIGZpbGUgdWxpbWl0IGlzIHRvbyBzbWFsbCwgdGhlIHN5c3RlbSB3aWxsIGZpcnN0CisgICAgIG9taXQgdGhlIGRhdGEgc2VnbWVudCwgdGhlbiBvbWl0IHRoZSBzdGFjaywgdGhlbiBkZWNsaW5lIHRvCisgICAgIGR1bXAgY29yZSBhbHRvZ2V0aGVyIChhcyBmYXIgYXMgSSBrbm93IFVCTE9DS19WQUxJRCBhbmQgTEVfVkFMSUQKKyAgICAgYXJlIGFsd2F5cyBzZXQpICh0aGlzIGlzIGJhc2VkIG9uIGV4cGVyaW1lbnRhdGlvbiBvbiBBSVggMy4yKS4KKyAgICAgTm93LCB0aGUgdGhpbmcgaXMgdGhhdCBHREIgdXNlcnMgd2lsbCBiZSBzdXJwcmlzZWQKKyAgICAgaWYgc2VnbWVudHMganVzdCBzaWxlbnRseSBkb24ndCBhcHBlYXIgKHdlbGwsIG1heWJlIHRoZXkgd291bGQKKyAgICAgdGhpbmsgdG8gY2hlY2sgImluZm8gZmlsZXMiLCBJIGRvbid0IGtub3cpLgorCisgICAgIEZvciB0aGUgZGF0YSBzZWdtZW50LCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8ga2VlcCBnb2luZyBpZiBpdCdzCisgICAgIG5vdCB0aGVyZSwgc2luY2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgbm90IHRvIGR1bXAgaXQgKHJlZ2FyZGxlc3MKKyAgICAgb2YgdGhlIHVsaW1pdCwgaXQncyBiYXNlZCBvbiBTQV9GVUxMRFVNUCkuICBCdXQgZm9yIHRoZSBzdGFjayBzZWdtZW50LAorICAgICBpZiBpdCdzIG5vdCB0aGVyZSwgd2UgcmVmdXNlIHRvIGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGlzIGNvcmUKKyAgICAgZmlsZS4gIFRoZSB1c2VmdWxuZXNzIG9mIGEgY29yZSBkdW1wIHdpdGhvdXQgYSBzdGFjayBzZWdtZW50IGlzIHByZXR0eQorICAgICBsaW1pdGVkIGFueXdheS4gICovCisgICAgIAorICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiBVQkxPQ0tfVkFMSUQpCisgICAgICB8fCAhKGNvcmVkYXRhLmNfZmxhZyAmIExFX1ZBTElEKSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoIShjb3JlZGF0YS5jX2ZsYWcgJiBVU1RBQ0tfVkFMSUQpKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogRG9uJ3QgY2hlY2sgdGhlIGNvcmUgZmlsZSBzaXplIGZvciBhIGZ1bGwgY29yZSwgQUlYIDQuMSBpbmNsdWRlcworICAgICBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb25zIGluIGEgZnVsbCBjb3JlLiAgKi8KKyAgaWYgKCEoY29yZWRhdGEuY19mbGFnICYgKEZVTExfQ09SRSB8IENPUkVfVFJVTkMpKQorICAgICAgJiYgKChiZmRfdm1hKWNvcmVkYXRhLmNfc3RhY2sgKyBjb3JlZGF0YS5jX3NpemUpICE9IHN0YXRidWYuc3Rfc2l6ZSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgc2l6ZSBpcyB3cm9uZywgaXQgbWVhbnMgd2UncmUgbWlzaW50ZXJwcmV0aW5nIHNvbWV0aGluZy4gICovCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBTYW5pdHkgY2hlY2sgb24gdGhlIGNfdGFiIGZpZWxkLiAgKi8KKyAgaWYgKCh1X2xvbmcpIGNvcmVkYXRhLmNfdGFiIDwgc2l6ZW9mIGNvcmVkYXRhIHx8CisgICAgICAodV9sb25nKSBjb3JlZGF0YS5jX3RhYiA+PSBzdGF0YnVmLnN0X3NpemUgfHwKKyAgICAgIChsb25nKSBjb3JlZGF0YS5jX3RhYiA+PSAobG9uZyljb3JlZGF0YS5jX3N0YWNrKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIElzc3VlIHdhcm5pbmcgaWYgdGhlIGNvcmUgZmlsZSB3YXMgdHJ1bmNhdGVkIGR1cmluZyB3cml0aW5nLiAgKi8KKyAgaWYgKGNvcmVkYXRhLmNfZmxhZyAmIENPUkVfVFJVTkMpCisgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogd2FybmluZyBjb3JlIGZpbGUgdHJ1bmNhdGVkIiksCisJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisKKyAgLyogQWxsb2NhdGUgY29yZSBmaWxlIGhlYWRlci4gICovCisgIHRtcHB0ciA9IChjaGFyKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChSczZrQ29yRGF0YSkpOworICBpZiAoIXRtcHB0cikKKyAgICByZXR1cm4gTlVMTDsKKyAgICAgIAorICBzZXRfdGRhdGEgKGFiZmQsIHRtcHB0cik7CisKKyAgLyogQ29weSBjb3JlIGZpbGUgaGVhZGVyLiAgKi8KKyAgY29yZV9oZHIgKGFiZmQpID0gY29yZWRhdGE7CisKKyAgLyogLnN0YWNrIHNlY3Rpb24uICovCisgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuc3RhY2siLAorICAJCQkgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKKwkJCSAgKGJmZF9zaXplX3R5cGUpIGNvcmVkYXRhLmNfc2l6ZSwKKwkJCSAgKGJmZF92bWEpIChTVEFDS19FTkRfQUREUiAtIGNvcmVkYXRhLmNfc2l6ZSksCisJCQkgIChmaWxlX3B0cikgY29yZWRhdGEuY19zdGFjaykpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogLnJlZyBzZWN0aW9uIGZvciBHUFJzIGFuZCBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KKyAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAorICAJCQkgIFNFQ19IQVNfQ09OVEVOVFMsCisJCQkgIChiZmRfc2l6ZV90eXBlKSAoKDMyICsgTlVNX09GX1NQRUNfUkVHUykgKiA0KSwKKwkJCSAgKGJmZF92bWEpIDAsCisJCQkgIChmaWxlX3B0cikgKChjaGFyICopICZjb3JlZGF0YS5TQVZFX0ZJRUxECisJCQkJICAgICAgLSAoY2hhciAqKSAmY29yZWRhdGEpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiAucmVnMiBzZWN0aW9uIGZvciBGUFJzIChmbG9hdGluZyBwb2ludCByZWdpc3RlcnMpLiAqLworICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZzIiLAorICAJCQkgIFNFQ19IQVNfQ09OVEVOVFMsCisJCQkgIChiZmRfc2l6ZV90eXBlKSA4ICogMzIsCS8qIDMyIEZQUnMuICovCisJCQkgIChiZmRfdm1hKSAwLAorCQkJICAoZmlsZV9wdHIpICgoY2hhciAqKSAmY29yZWRhdGEuU0FWRV9GSUVMRC5mcHJbMF0KKwkJCQkgICAgICAtIChjaGFyICopICZjb3JlZGF0YSkpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIC5sZGluZm8gc2VjdGlvbi4KKyAgICAgVG8gYWN0dWFsbHkgZmluZCBvdXQgaG93IGxvbmcgdGhpcyBzZWN0aW9uIGlzIGluIHRoaXMgcGFydGljdWxhcgorICAgICBjb3JlIGR1bXAgd291bGQgcmVxdWlyZSBnb2luZyBkb3duIHRoZSB3aG9sZSBsaXN0IG9mIHN0cnVjdCBsZF9pbmZvJ3MuCisgICAgIFNlZSBpZiB3ZSBjYW4ganVzdCBmYWtlIGl0LiAgKi8KKyAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5sZGluZm8iLAorICAJCQkgIFNFQ19IQVNfQ09OVEVOVFMsCisJCQkgIChiZmRfc2l6ZV90eXBlKSAweDdmZmZmZmZmLAorCQkJICAoYmZkX3ZtYSkgMCwKKwkJCSAgKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3RhYikpCisgICAgcmV0dXJuIE5VTEw7CisKKyNpZm5kZWYgQ09SRV9WRVJTSU9OXzEKKyAgLyogLmRhdGEgc2VjdGlvbiBpZiBwcmVzZW50LgorICAgICBBSVggMyBkdW1wcyB0aGUgY29tcGxldGUgZGF0YSBzZWN0aW9uIGFuZCBzZXRzIEZVTExfQ09SRSBpZiB0aGUKKyAgICAgdWxpbWl0IGlzIGxhcmdlIGVub3VnaCwgb3RoZXJ3aXNlIHRoZSBkYXRhIHNlY3Rpb24gaXMgb21pdHRlZC4KKyAgICAgQUlYIDQgc2V0cyBGVUxMX0NPUkUgZXZlbiBpZiB0aGUgY29yZSBmaWxlIGlzIHRydW5jYXRlZCwgd2UgaGF2ZQorICAgICB0byBleGFtaW5lIGNvcmVkYXRhLmNfZGF0YXNpemUgYmVsb3cgdG8gZmluZCBvdXQgdGhlIGFjdHVhbCBzaXplIG9mCisgICAgIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgaWYgKGNvcmVkYXRhLmNfZmxhZyAmIEZVTExfQ09SRSkKKyAgICB7CisgICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAorCQkJICAgICAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAorCQkJICAgICAgKGJmZF9zaXplX3R5cGUpIGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxELAorCQkJICAgICAgKGJmZF92bWEpCisJCQkJQ0RBVEFfQUREUiAoY29yZWRhdGEuQ09SRV9EQVRBX1NJWkVfRklFTEQpLAorCQkJICAgICAgKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3N0YWNrICsgY29yZWRhdGEuY19zaXplKSkKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPUkVfVkVSU0lPTl8xCisgIC8qIEFJWCA0IGFkZHMgZGF0YSBzZWN0aW9ucyBmcm9tIGxvYWRlZCBvYmplY3RzIHRvIHRoZSBjb3JlIGZpbGUsCisgICAgIHdoaWNoIGNhbiBiZSBmb3VuZCBieSBleGFtaW5pbmcgbGRpbmZvLCBhbmQgYW5vbnltb3VzbHkgbW1hcHBlZAorICAgICByZWdpb25zLiAgKi8KKyAgeworICAgIHN0cnVjdCBsZF9pbmZvIGxkaW5mbzsKKyAgICBiZmRfc2l6ZV90eXBlIGxkaW5mb19zaXplOworICAgIGZpbGVfcHRyIGxkaW5mb19vZmZzZXQgPSAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfdGFiOworCisgICAgLyogLmRhdGEgc2VjdGlvbiBmcm9tIGV4ZWN1dGFibGUuICAqLworICAgIGlmIChjb3JlZGF0YS5jX2RhdGFzaXplKQorICAgICAgeworCWlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCisJCQkJU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAorCQkJCShiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5jX2RhdGFzaXplLAorCQkJCShiZmRfdm1hKQorCQkJCSAgQ0RBVEFfQUREUiAoY29yZWRhdGEuQ09SRV9EQVRBX1NJWkVfRklFTEQpLAorCQkJCShmaWxlX3B0cikgY29yZWRhdGEuY19kYXRhKSkKKwkgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgLyogLmRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cy4gICovCisgICAgbGRpbmZvX3NpemUgPSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19maWxlbmFtZVswXQorCQkgIC0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fbmV4dDsKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKwlpZiAoYmZkX3NlZWsgKGFiZmQsIGxkaW5mb19vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorCSAgcmV0dXJuIE5VTEw7CisJaWYgKGJmZF9yZWFkICgmbGRpbmZvLCBsZGluZm9fc2l6ZSwgMSwgYWJmZCkgIT0gbGRpbmZvX3NpemUpCisJICByZXR1cm4gTlVMTDsKKwlpZiAobGRpbmZvLmxkaW5mb19jb3JlKQorCSAgeworCSAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAorCQkJCSAgICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCisJCQkJICAgIChiZmRfc2l6ZV90eXBlKSBsZGluZm8ubGRpbmZvX2RhdGFzaXplLAorCQkJCSAgICAoYmZkX3ZtYSkgbGRpbmZvLmxkaW5mb19kYXRhb3JnLAorCQkJCSAgICAoZmlsZV9wdHIpIGxkaW5mby5sZGluZm9fY29yZSkpCisJICAgICAgcmV0dXJuIE5VTEw7CisJICB9CisJaWYgKGxkaW5mby5sZGluZm9fbmV4dCA9PSAwKQorCSAgYnJlYWs7CisJbGRpbmZvX29mZnNldCArPSBsZGluZm8ubGRpbmZvX25leHQ7CisgICAgICB9CisKKyAgICAvKiAudm1kYXRhIHNlY3Rpb25zIGZyb20gYW5vbnltb3VzbHkgbW1hcHBlZCByZWdpb25zLiAgKi8KKyAgICBpZiAoY29yZWRhdGEuY192bXJlZ2lvbnMpCisgICAgICB7CisJaW50IGk7CisKKwlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgY29yZWRhdGEuY192bW0sIFNFRUtfU0VUKSAhPSAwKQorCSAgcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29yZWRhdGEuY192bXJlZ2lvbnM7IGkrKykKKwkgIHsKKwkgICAgc3RydWN0IHZtX2luZm8gdm1pbmZvOworCisJICAgIGlmIChiZmRfcmVhZCAoJnZtaW5mbywgc2l6ZW9mICh2bWluZm8pLCAxLCBhYmZkKSAhPSBzaXplb2YgKHZtaW5mbykpCisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIGlmICh2bWluZm8udm1pbmZvX29mZnNldCkKKwkgICAgICB7CisJCWlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIudm1kYXRhIiwKKwkJCQkJU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAorCQkJCQkoYmZkX3NpemVfdHlwZSkgdm1pbmZvLnZtaW5mb19zaXplLAorCQkJCQkoYmZkX3ZtYSkgdm1pbmZvLnZtaW5mb19hZGRyLAorCQkJCQkoZmlsZV9wdHIpIHZtaW5mby52bWluZm9fb2Zmc2V0KSkKKwkJICByZXR1cm4gTlVMTDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBhYmZkLT54dmVjOwkJCQkvKiB0aGlzIGlzIGdhcmJhZ2UgZm9yIG5vdy4gKi8KK30KKworCisKKy8qIHJldHVybiBgdHJ1ZScgaWYgZ2l2ZW4gY29yZSBpcyBmcm9tIHRoZSBnaXZlbiBleGVjdXRhYmxlLi4gKi8KK2Jvb2xlYW4KK3JzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQ7CisgICAgIGJmZCAqZXhlY19iZmQ7Cit7CisgIHN0cnVjdCBjb3JlX2R1bXAgY29yZWRhdGE7CisgIHN0cnVjdCBsZF9pbmZvIGxkaW5mbzsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICBjaGFyICpwYXRoLCAqczsKKyAgc2l6ZV90IGFsbG9jOworICBjb25zdCBjaGFyICpzdHIxLCAqc3RyMjsKKyAgYm9vbGVhbiByZXQ7CisKKyAgaWYgKGJmZF9zZWVrIChjb3JlX2JmZCwgMCwgU0VFS19TRVQpICE9IDAKKyAgICAgIHx8IGJmZF9yZWFkICgmY29yZWRhdGEsIHNpemVvZiBjb3JlZGF0YSwgMSwgY29yZV9iZmQpICE9IHNpemVvZiBjb3JlZGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9zZWVrIChjb3JlX2JmZCwgKGxvbmcpIGNvcmVkYXRhLmNfdGFiLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2l6ZSA9IChjaGFyICopICZsZGluZm8ubGRpbmZvX2ZpbGVuYW1lWzBdIC0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fbmV4dDsKKyAgaWYgKGJmZF9yZWFkICgmbGRpbmZvLCBzaXplLCAxLCBjb3JlX2JmZCkgIT0gc2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYWxsb2MgPSAxMDA7CisgIHBhdGggPSBiZmRfbWFsbG9jIChhbGxvYyk7CisgIGlmIChwYXRoID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBzID0gcGF0aDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoYmZkX3JlYWQgKHMsIDEsIDEsIGNvcmVfYmZkKSAhPSAxKQorCXsKKwkgIGZyZWUgKHBhdGgpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmICgqcyA9PSAnXDAnKQorCWJyZWFrOworICAgICAgKytzOworICAgICAgaWYgKHMgPT0gcGF0aCArIGFsbG9jKQorCXsKKwkgIGNoYXIgKm47CisKKwkgIGFsbG9jICo9IDI7CisJICBuID0gYmZkX3JlYWxsb2MgKHBhdGgsIGFsbG9jKTsKKwkgIGlmIChuID09IE5VTEwpCisJICAgIHsKKwkgICAgICBmcmVlIChwYXRoKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIHMgPSBuICsgKHBhdGggLSBzKTsKKwkgIHBhdGggPSBuOworCX0KKyAgICB9CisgIAorICBzdHIxID0gc3RycmNociAocGF0aCwgJy8nKTsKKyAgc3RyMiA9IHN0cnJjaHIgKGV4ZWNfYmZkLT5maWxlbmFtZSwgJy8nKTsKKworICAvKiBzdGVwIG92ZXIgY2hhcmFjdGVyICcvJyAqLworICBzdHIxID0gc3RyMSAhPSBOVUxMID8gc3RyMSArIDEgOiBwYXRoOworICBzdHIyID0gc3RyMiAhPSBOVUxMID8gc3RyMiArIDEgOiBleGVjX2JmZC0+ZmlsZW5hbWU7CisKKyAgaWYgKHN0cmNtcCAoc3RyMSwgc3RyMikgPT0gMCkKKyAgICByZXQgPSB0cnVlOworICBlbHNlCisgICAgcmV0ID0gZmFsc2U7CisKKyAgZnJlZSAocGF0aCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworY2hhciAqCityczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciAqY29tID0gY29yZV9oZHIgKGFiZmQpLkNPUkVfQ09NTV9GSUVMRDsKKyAgaWYgKCpjb20pCisgICAgcmV0dXJuIGNvbTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK3JzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiBjb3JlX2hkciAoYWJmZCkuY19zaWdubzsKK30KKworCitib29sZWFuCityczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICAgIGlmIChjb3VudCA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgLyogUmVhZGluZyBhIGNvcmUgZmlsZSdzIHNlY3Rpb25zIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50LiBGb3IgdGhlCisgICAgICAgcmVzdCBvZiB0aGVtIHdlIGNhbiB1c2UgYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKCkgSSBzdXBwb3NlLiAqLworICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHJvdXRpbmUgd29ya3MgZm9yIGFueSBiZmQgYW5kIGFueSBzZWN0aW9uLiBGSVhNRW1nby4gKi8KKworICAgIGlmIChhYmZkLT5mb3JtYXQgPT0gYmZkX2NvcmUgJiYgc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLnJlZyIpID09IDApIHsKKworICAgICAgc3RydWN0IG1zdHNhdmUgbXN0YXR1czsKKyAgICAgIGludCAgICByZWdvZmZzZXQgPSAoY2hhciopJm1zdGF0dXMuZ3ByWzBdIC0gKGNoYXIqKSZtc3RhdHVzOworCisgICAgICAvKiBBc3NlcnQgdGhhdCB0aGUgb25seSB3YXkgdGhpcyBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQgaXMgcmVhZGluZyB0aGUKKyAgICAgICAgIHdob2xlIHNlY3Rpb24uICovCisgICAgICBpZiAob2Zmc2V0IHx8IGNvdW50ICE9IChzaXplb2YobXN0YXR1cy5ncHIpICsgKDQgKiBOVU1fT0ZfU1BFQ19SRUdTKSkpCisgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgKF8oIkVSUk9SISBpbiByczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKClcbiIpKTsKKworICAgICAgLyogZm9yIGAucmVnJyBzZWN0aW9uLCBgZmlsZXBvcycgaXMgYSBwb2ludGVyIHRvIHRoZSBgbXN0c2F2ZScgc3RydWN0dXJlCisgICAgICAgICBpbiB0aGUgY29yZSBmaWxlLiAqLworCisgICAgICAvKiByZWFkIEdQUidzIGludG8gdGhlIGxvY2F0aW9uLiAqLworICAgICAgaWYgKCBiZmRfc2VlayhhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgcmVnb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEKKwl8fCBiZmRfcmVhZChsb2NhdGlvbiwgc2l6ZW9mIChtc3RhdHVzLmdwciksIDEsIGFiZmQpICE9IHNpemVvZiAobXN0YXR1cy5ncHIpKQorCXJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLworCisgICAgICAvKiBpbmNyZW1lbnQgbG9jYXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiBzcGVjaWFsIHJlZ2lzdGVycyBpbiB0aGUgc2VjdGlvbiwKKyAgICAgICAgIHJlc2V0IHJlZ2lzdGVyIG9mZnNldCB2YWx1ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGZpcnN0IHNwZWNpYWwgcmVnaXN0ZXIKKwkgaW4gbXN0c2F2ZSBzdHJ1Y3R1cmUsIGFuZCByZWFkIHNwZWNpYWwgcmVnaXN0ZXJzLiAqLworCisgICAgICBsb2NhdGlvbiA9IChQVFIpICgoY2hhciopbG9jYXRpb24gKyBzaXplb2YgKG1zdGF0dXMuZ3ByKSk7CisgICAgICByZWdvZmZzZXQgPSAoY2hhciopJm1zdGF0dXMuaWFyIC0gKGNoYXIqKSZtc3RhdHVzOworCisgICAgICBpZiAoIGJmZF9zZWVrKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MgKyByZWdvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMQorCXx8IGJmZF9yZWFkKGxvY2F0aW9uLCA0ICogTlVNX09GX1NQRUNfUkVHUywgMSwgYWJmZCkgIT0gCisJCQkJCQkJNCAqIE5VTV9PRl9TUEVDX1JFR1MpCisJcmV0dXJuIChmYWxzZSk7IC8qIG9uIGVycm9yICovCisgICAgICAKKyAgICAgIC8qIGluY3JlbWVudCBsb2NhdGlvbiBhZGRyZXNzLCBhbmQgcmVhZCB0aGUgc3BlY2lhbCByZWdpc3RlcnMuLiAqLworICAgICAgLyogRklYTUVtZ28gKi8KKyAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgfQorCisgICAgLyogZWxzZSwgdXNlIGRlZmF1bHQgYmZkIHNlY3Rpb24gY29udGVudCB0cmFuc2Zlci4gKi8KKyAgICBlbHNlCisgICAgICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzIAorICAgICAgCQkJKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KTsKK30KKworI2VuZGlmIC8qIEFJWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvc2NvNS1jb3JlLmMgYi9iZmQvc2NvNS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYzhmMQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9zY281LWNvcmUuYwpAQCAtMCwwICsxLDQyOSBAQAorLyogQkZEIGJhY2sgZW5kIGZvciBTQ081IGNvcmUgZmlsZXMgKFUtYXJlYSBhbmQgcmF3IHNlY3Rpb25zKQorICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEpvdWtlIE51bWFuIDxqbnVtYW5AaGlzY29tLm5sPgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy91c2VyLmg+ICAgICAgICAgICAvKiBBZnRlciBhLm91dC5oICAqLworI2luY2x1ZGUgPHN5cy9wYWNjZXNzLmg+CisjaW5jbHVkZSA8c3lzL3JlZ2lvbi5oPgorCitzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdAoreworICBzdHJ1Y3QgdXNlciB1OworfTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIGFzZWN0aW9uICoKK21ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKK3N0YXRpYyBhc3ltYm9sICpzY281X2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBzdHJ1Y3QgdXNlciAqcmVhZF91YXJlYSBQQVJBTVMgKChiZmQgKiwgaW50KSk7Citjb25zdCBiZmRfdGFyZ2V0ICpzY281X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworY2hhciAqc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworaW50IHNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworYm9vbGVhbiBzY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLAorCQkJCQkJICAgICBiZmQgKmV4ZWNfYmZkKSk7CitzdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGFzZWN0aW9uICoKK21ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOworICAgICBiZmRfdm1hIHZtYTsKKyAgICAgZmlsZV9wdHIgZmlsZXBvczsKK3sKKyAgYXNlY3Rpb24gKmFzZWN0OworCisgIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOworICBpZiAoIWFzZWN0KQorICAgIHJldHVybiBOVUxMOworICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKKyAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKKyAgYXNlY3QtPnZtYSA9IHZtYTsKKyAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOworICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICByZXR1cm4gYXNlY3Q7Cit9CisKK3N0YXRpYyBhc3ltYm9sICoKK3NjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKKyAgaWYgKG5ldykKKyAgICBuZXctPnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gbmV3OworfQorIAorc3RhdGljIHN0cnVjdCB1c2VyICoKK3JlYWRfdWFyZWEoYWJmZCwgZmlsZXBvcykKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgZmlsZXBvczsKKworeworICBzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqcmF3cHRyOworCisgIHJhd3B0ciA9ICgoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKikKKwkgICAgYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QpKSk7CisgIGlmIChyYXdwdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBhYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YSA9IHJhd3B0cjsKKworICBpZiAoKGJmZF9zZWVrIChhYmZkLCBmaWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKKyAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmcmF3cHRyLT51LCAxLCBzaXplb2YgcmF3cHRyLT51LCBhYmZkKQorCSAgIT0gc2l6ZW9mIHJhd3B0ci0+dSkpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogU2FuaXR5IGNoZWNrIHBlcmhhcHM/Pz8gKi8KKyAgaWYgKHJhd3B0ci0+dS51X2RzaXplID4gMHgxMDAwMDAwKSAgICAvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLworICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBpZiAocmF3cHRyLT51LnVfc3NpemUgPiAweDEwMDAwMDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldHVybiAmcmF3cHRyLT51OworfQorCisvKiBBUkdTVVNFRCAqLworY29uc3QgYmZkX3RhcmdldCAqCitzY281X2NvcmVfZmlsZV9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBjb2Zmc2V0X3NpeiwgdmFsLCBuc2VjcywgY2hlYWRvZmZzOworICBpbnQgY29yZXNpemU7CisgIHN0cnVjdCB1c2VyICp1OworICBzdHJ1Y3QgY29yZW9mZnNldHMgY29mZnNldHM7CisgIHN0cnVjdCBjb3Jlc2VjdGhlYWQgY2hlYWQ7CisgIGNoYXIgKnNlY25hbWU7CisgIGZsYWd3b3JkIGZsYWdzOworCisgIC8qIFJlYWQgY29yZW9mZnNldHMgcmVnaW9uIGF0IGVuZCBvZiBjb3JlIChzZWUgY29yZShGUCkpICovCisKKyAgeworICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCisgICAgICB7CisgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIGNvcmVzaXplID0gc3RhdGJ1Zi5zdF9zaXplOworICB9CisgIC8qIExhc3QgbG9uZyBpbiBjb3JlIGlzIHNpemVvZiBzdHJ1Y3QgY29yZW9mZnNldHMsIHJlYWQgaXQgKi8KKyAgaWYgKChiZmRfc2VlayAoYWJmZCwgY29yZXNpemUtc2l6ZW9mIGNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKKyAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldF9zaXosIDEsIHNpemVvZiBjb2Zmc2V0X3NpeiwgYWJmZCkKKwkgICE9IHNpemVvZiBjb2Zmc2V0X3NpeikgKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBVc2UgaXQgdG8gc2VlayBzdGFydCBvZiBjb3Jlb2Zmc2V0cyByZWdpb24sIHJlYWQgaXQgYW5kIGRldGVybWluZQorICAgICB2YWxpZGl0eSAqLworICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1jb2Zmc2V0X3NpeiwgU0VFS19TRVQpICE9IDApCisgICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNvZmZzZXRzLCAxLCBzaXplb2YgY29mZnNldHMsIGFiZmQpCisJICAhPSBzaXplb2YgY29mZnNldHMpCisgICAgICB8fCAoKGNvZmZzZXRzLnVfaW5mbyAhPSAxKSAmJiAoY29mZnNldHMudV9pbmZvICE9IENfVkVSU0lPTikpKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworCisgIGlmIChjb2Zmc2V0cy51X2luZm8gPT0gMSkgCisgICAgeyAKKyAgICAgIC8qIE9sZCB2ZXJzaW9uLCBubyBzZWN0aW9uIGhlYWRzLCByZWFkIGluZm8gZnJvbSB1c2VyIHN0cnVjdCAqLworCisgICAgICB1ID0gcmVhZF91YXJlYShhYmZkLCBjb2Zmc2V0cy51X3VzZXIpOworICAgICAgaWYgKCEgdSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLCBTRUNfSEFTX0NPTlRFTlRTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSBjb2Zmc2V0cy51X3VzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIChiZmRfdm1hKSB1LT51X2FyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV91c2VyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgCisgICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLCAKKwkJCSAgICAgIFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmZkX3NpemVfdHlwZSkgdS0+dV9leGRhdGEudXhfZHNpemUKKwkJCSAgICAgICArIHUtPnVfZXhkYXRhLnV4X2JzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X2V4ZGF0YS51eF9kYXRvcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZV9wdHIpIGNvZmZzZXRzLnVfZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIAorICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsIAorCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfc2l6ZV90eXBlKSB1LT51X3NzaXplICogTkJQQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfdm1hKSB1LT51X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9zdGFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICByZXR1cm4gYWJmZC0+eHZlYzsJCS8qIERvbmUgZm9yIHZlcnNpb24gMSAqLworICAgIH0gICAgICAKKworICAvKiBJbW1lZGlhdGVseSBiZWZvcmUgY29yZW9mZnNldHMgcmVnaW9uIGlzIGEgbG9uZyB3aXRoIG9mZnNldCBpbiBjb3JlCisgICAgIHRvIGZpcnN0IGNvcmVzZWN0aGVhZCAoQ09SRVNfT0ZGU0VUUyksIHRoZSBsb25nIGJlZm9yZSB0aGlzIGlzIHRoZQorICAgICBudW1iZXIgb2Ygc2VjdGlvbiBoZWFkcyBpbiB0aGUgbGlzdC4gUmVhZCBib3RoIGxvbmdzIGFuZCByZWFkIHRoZQorICAgICBjb3Jlc2VjdGhlYWQgYW5kIGNoZWNrIGl0cyB2YWxpZGl0eSAqLworICAgIAorICBpZiAoKGJmZF9zZWVrIChhYmZkLCAKKwkJIGNvcmVzaXplIC0gY29mZnNldF9zaXogLSAyICogc2l6ZW9mIGNvZmZzZXRfc2l6LCAKKwkJIFNFRUtfU0VUKSAhPSAwKQorICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZuc2VjcywgMSwgc2l6ZW9mIG5zZWNzLCBhYmZkKSAhPSBzaXplb2YgbnNlY3MpCisgICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkb2ZmcywgMSwgc2l6ZW9mIGNoZWFkb2ZmcywgYWJmZCkKKwkgICE9IHNpemVvZiBjaGVhZG9mZnMpCisgICAgICB8fCAoYmZkX3NlZWsgKGFiZmQsIGNoZWFkb2ZmcywgU0VFS19TRVQpICE9IDApCisgICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKKyAgICAgIHx8IChjaGVhZC5jc19zdHlwZSAhPSBDT1JFU19PRkZTRVRTKQorICAgICAgfHwgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLworCisgIC8qIE5vdyBsb29wIG92ZXIgYWxsIHJlZ2lvbnMgYW5kIG1hcCB0aGVtICovCisgIG5zZWNzLS07CQkJCS8qIFdlJ3ZlIHNlZW4gQ09SRVNfT0ZGU0VUUyBhbHJlYWR5ICovCisgIGZvciAoOyBuc2VjczsgbnNlY3MtLSkgCisgICAgeworICAgICAgaWYgKChiZmRfc2VlayAoYWJmZCwgY2hlYWQuY3NfaHNlZWssIFNFRUtfU0VUKSAhPSAwKQorCSAgfHwgYmZkX3JlYWQgKCh2b2lkICopJmNoZWFkLCAxLCBzaXplb2YgY2hlYWQsIGFiZmQpICE9IHNpemVvZiBjaGVhZCkKKyAgICAgICAgeworICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOyAKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBzd2l0Y2ggKGNoZWFkLmNzX3N0eXBlKSAKKwl7CisJY2FzZSBDT1JFU19NQUdJQzoJCQkvKiBDb3JlIGhlYWRlciwgY2hlY2sgbWFnaWMgKi8KKwkgIGlmIChjaGVhZC5jc194LmNzeF9tYWdpYyAhPSBDT1JFTUFHSUNfTlVNQkVSKQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgIHNlY25hbWUgPSBOVUxMOworCSAgbnNlY3MrKzsJCQkJLyogTUFHSUMgbm90IGluIHNlY3Rpb24gY250ISovCisJICBicmVhazsKKwljYXNlIENPUkVTX1VBUkVBOgkJCS8qIFUtYXJlYSwgcmVhZCBpbiB0ZGF0YSAqLworCSAgdSA9IHJlYWRfdWFyZWEoYWJmZCwgY2hlYWQuY3Nfc3NlZWspOworCSAgaWYgKCEgdSkKKwkgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAvKiBUaGlzIGlzIHRyaWNreS4gIEFzIHRoZSAicmVnaXN0ZXIgc2VjdGlvbiIsIHdlIGdpdmUgdGhlbQorCSAgICAgdGhlIGVudGlyZSB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZQorCSAgICAgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4gIFRoZXJlIGFyZSB0d28gdHJpY2tzIHdpdGggdGhpcywKKwkgICAgIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgbWlnaHQgYmUKKwkgICAgIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzIGZyb20KKwkgICAgICp1X2FyMC4gIFRoZSBvdGhlciBpcyB0aGF0IHVfYXIwIGlzIHNvbWV0aW1lcyBhbiBhYnNvbHV0ZQorCSAgICAgYWRkcmVzcyBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbgorCSAgICAgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KKwkKKwkgICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzCisJICAgICBhY3R1YWxseSBhcmUsIHNvIHdlIGhhdmUgdG8gcGFzcyB0aGUgd2hvbGUgYXJlYSB0byBHREIuCisJICAgICBXZSBlbmNvZGUgdGhlIHZhbHVlIG9mIHVfYXIwIGJ5IHNldHRpbmcgdGhlIC5yZWdzIHNlY3Rpb24KKwkgICAgIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgMCBpcyBhdCB0aGUgcGxhY2UKKwkgICAgIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQgb2YKKwkgICAgIHRoZSBzZWN0aW9uIHRvIC11X2FyMCkuICBHREIgdXNlcyB0aGlzIGluZm8gdG8gbG9jYXRlIHRoZQorCSAgICAgcmVncywgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUKKwkgICAgIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCisKKwkgIGNoZWFkLmNzX3ZhZGRyID0gMCAtIChiZmRfdm1hKSB1LT51X2FyMDsKKworCisgICAgICAgICAgc2VjbmFtZSA9ICIucmVnIjsKKyAgICAgICAgICBmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7CisKKyAgICAgICAgICBicmVhazsKKwljYXNlIENPUkVTX1BSRUdJT046CQkJLyogQSBwcm9ncmFtIHJlZ2lvbiwgbWFwIGl0ICovCisJICBzd2l0Y2ggKGNoZWFkLmNzX3guY3N4X3ByZWcuY3N4cF9ydHlwKQorCSAgICB7CisJICAgIGNhc2UgUFRfREFUQToKKwkgICAgICBzZWNuYW1lID0gIi5kYXRhIjsgIAkvKiBEYXRhIHJlZ2lvbi4gICAgICAgICAgKi8KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQVF9TVEFDSzoKKwkgICAgICBzZWNuYW1lID0gIi5zdGFjayI7IAkvKiBTdGFjayByZWdpb24uICAgICAgICAgKi8KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQVF9TSE1FTToKKwkgICAgICBzZWNuYW1lID0gIi5zaG1lbSI7IAkvKiBTaGFyZWQgbWVtb3J5ICAgICAgICAgKi8KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQVF9MSUJEQVQ6CisJICAgICAgc2VjbmFtZSA9ICIubGliZGF0IjsJLyogU2hhcmVkIGxpYnJhcnkgZGF0YSAgICovCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUFRfVjg2OgorCSAgICAgIHNlY25hbWUgPSAiLnZpcnQ4NiI7CS8qIFZpcnR1YWwgODA4NiBtb2RlICAgICAqLworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBUX1NIRklMOgorCSAgICAgIHNlY25hbWUgPSAiLm1tZmlsZSI7CS8qIE1lbW9yeSBtYXBwZWQgZmlsZSAgICAqLworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBUX1hEQVRBMDoKKwkgICAgICBzZWNuYW1lID0gIi5YZGF0MCI7IAkvKiBYRU5JWCBkYXRhIHJlZ2lvbiwgdmlydHVhbCAwICovCisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgc2VjbmFtZSA9ICIiOworCSAgICB9CisJICBmbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKKwkgIGJyZWFrOworCWNhc2UgQ09SRVNfUFJPQzoJCQkvKiBzdHJ1Y3QgcHJvYyAqLworCWNhc2UgQ09SRVNfSVRJTUVSOgkJCS8qIGludGVydmFsIHRpbWVycyAqLworCWNhc2UgQ09SRVNfU0NPVVRTTkFNRToJCQkvKiBzdHJ1Y3Qgc2NvdXRzbmFtZSAqLworCSAgc2VjbmFtZSA9IE5VTEw7CS8qIElnbm9yZSB0aGVzZSAqLworCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiVW5oYW5kbGVkIFNDTyBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlYWQuY3Nfc3R5cGUpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmIChzZWNuYW1lCisJICAmJiAhbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAorCQkJCSAoYmZkX3NpemVfdHlwZSkgY2hlYWQuY3NfdnNpemUsCisJCQkJIChiZmRfdm1hKSBjaGVhZC5jc192YWRkciwKKwkJCQkgKGZpbGVfcHRyKSBjaGVhZC5jc19zc2VlaykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgfQorCisgIHJldHVybiBhYmZkLT54dmVjOworCit9CisKK2NoYXIgKgorc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfY29tbTsKKyAgaWYgKCpjb20pCisgICAgcmV0dXJuIGNvbTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBBUkdTVVNFRCAqLworaW50CitzY281X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7Cit7CisgIHJldHVybiAoKGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0ICE9IDApIAorCSAgPyBpZ25vcmVfYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9zeXNhYm9ydCAKKwkgIDogLTEpOworfQorCisvKiBBUkdTVVNFRCAqLworYm9vbGVhbgorc2NvNV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCisgICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKK3sKKyAgcmV0dXJuIHRydWU7ICAgICAgICAgIC8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KK30KKworI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCisjZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKKyNkZWZpbmUgc2NvNV9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKKyNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KKyNkZWZpbmUgc2NvNV9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIHNjbzVfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KKyNkZWZpbmUgc2NvNV9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIHNjbzVfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIHNjbzVfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgc2NvNV9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCisKKy8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KK3N0YXRpYyB2b2lkCitzd2FwX2Fib3J0KCkKK3sKKyAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCit9CisjZGVmaW5lIE5PX0dFVCAgKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorI2RlZmluZSBOT19QVVQgICgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKKyNkZWZpbmUgTk9fU0lHTkVEX0dFVCBcCisgICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCisKK2NvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYyA9CisgIHsKKyAgICAic2NvNS1jb3JlIiwKKyAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgLyogb2JqZWN0IGZsYWdzICovCisgICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCisgICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLworICAgICcgJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLworICAgIDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBkYXRhICovCisgICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgZGF0YSAqLworICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDY0IGJpdCBoZHJzICovCisgICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogMzIgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAxNiBiaXQgaGRycyAqLworCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogdW5rbm93biBmb3JtYXQgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogb2JqZWN0IGZpbGUgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsICAgICAgICAgLyogYXJjaGl2ZSAqLworICAgICBzY281X2NvcmVfZmlsZV9wICAgICAgCS8qIGEgY29yZSBmaWxlICovCisgICAgfSwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCisgICAgfSwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoc2NvNSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNjbzVfY29yZSksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgICAgKFBUUikgMCAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2tlbmRfZGF0YSAqLworfTsKZGlmZiAtLWdpdCBhL2JmZC9zZWN0aW9uLmMgYi9iZmQvc2VjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Nzc4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc2VjdGlvbi5jCkBAIC0wLDAgKzEsMTA3NSBAQAorLyogT2JqZWN0IGZpbGUgInNlY3Rpb24iIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitTRUNUSU9OCisJU2VjdGlvbnMKKworCVRoZSByYXcgZGF0YSBjb250YWluZWQgd2l0aGluIGEgQkZEIGlzIG1haW50YWluZWQgdGhyb3VnaCB0aGUKKwlzZWN0aW9uIGFic3RyYWN0aW9uLiAgQSBzaW5nbGUgQkZEIG1heSBoYXZlIGFueSBudW1iZXIgb2YKKwlzZWN0aW9ucy4gIEl0IGtlZXBzIGhvbGQgb2YgdGhlbSBieSBwb2ludGluZyB0byB0aGUgZmlyc3Q7CisJZWFjaCBvbmUgcG9pbnRzIHRvIHRoZSBuZXh0IGluIHRoZSBsaXN0LgorCisJU2VjdGlvbnMgYXJlIHN1cHBvcnRlZCBpbiBCRkQgaW4gPDxzZWN0aW9uLmM+Pi4KKworQG1lbnUKK0AqIFNlY3Rpb24gSW5wdXQ6OgorQCogU2VjdGlvbiBPdXRwdXQ6OgorQCogdHlwZWRlZiBhc2VjdGlvbjo6CitAKiBzZWN0aW9uIHByb3RvdHlwZXM6OgorQGVuZCBtZW51CisKK0lOT0RFCitTZWN0aW9uIElucHV0LCBTZWN0aW9uIE91dHB1dCwgU2VjdGlvbnMsIFNlY3Rpb25zCitTVUJTRUNUSU9OCisJU2VjdGlvbiBpbnB1dAorCisJV2hlbiBhIEJGRCBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoZSBzZWN0aW9uIHN0cnVjdHVyZXMgYXJlCisJY3JlYXRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIEJGRC4KKworCUVhY2ggc2VjdGlvbiBoYXMgYSBuYW1lIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2VjdGlvbiBpbiB0aGUKKwlvdXRzaWRlIHdvcmxkLS0tZm9yIGV4YW1wbGUsIDw8YS5vdXQ+PiB3b3VsZCBjb250YWluIGF0IGxlYXN0CisJdGhyZWUgc2VjdGlvbnMsIGNhbGxlZCA8PC50ZXh0Pj4sIDw8LmRhdGE+PiBhbmQgPDwuYnNzPj4uCisKKwlOYW1lcyBuZWVkIG5vdCBiZSB1bmlxdWU7IGZvciBleGFtcGxlIGEgQ09GRiBmaWxlIG1heSBoYXZlIHNldmVyYWwKKwlzZWN0aW9ucyBuYW1lZCA8PC5kYXRhPj4uCisKKwlTb21ldGltZXMgYSBCRkQgd2lsbCBjb250YWluIG1vcmUgdGhhbiB0aGUgYGBuYXR1cmFsJycgbnVtYmVyIG9mCisJc2VjdGlvbnMuIEEgYmFjayBlbmQgbWF5IGF0dGFjaCBvdGhlciBzZWN0aW9ucyBjb250YWluaW5nCisJY29uc3RydWN0b3IgZGF0YSwgb3IgYW4gYXBwbGljYXRpb24gbWF5IGFkZCBhIHNlY3Rpb24gKHVzaW5nCisJPDxiZmRfbWFrZV9zZWN0aW9uPj4pIHRvIHRoZSBzZWN0aW9ucyBhdHRhY2hlZCB0byBhbiBhbHJlYWR5IG9wZW4KKwlCRkQuIEZvciBleGFtcGxlLCB0aGUgbGlua2VyIGNyZWF0ZXMgYW4gZXh0cmEgc2VjdGlvbgorCTw8Q09NTU9OPj4gZm9yIGVhY2ggaW5wdXQgZmlsZSdzIEJGRCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0CisJY29tbW9uIHN0b3JhZ2UuCisKKwlUaGUgcmF3IGRhdGEgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4gd2hlbgorCXRoZSBzZWN0aW9uIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gU29tZSB0YXJnZXRzIG1heSBsZWF2ZSB0aGUKKwlkYXRhIGluIHBsYWNlIHVudGlsIGEgPDxiZmRfZ2V0X3NlY3Rpb25fY29udGVudHM+PiBjYWxsIGlzCisJbWFkZS4gT3RoZXIgYmFjayBlbmRzIG1heSByZWFkIGluIGFsbCB0aGUgZGF0YSBhdCBvbmNlLiAgRm9yCisJZXhhbXBsZSwgYW4gUy1yZWNvcmQgZmlsZSBoYXMgdG8gYmUgcmVhZCBvbmNlIHRvIGRldGVybWluZSB0aGUKKwlzaXplIG9mIHRoZSBkYXRhLiBBbiBJRUVFLTY5NSBmaWxlIGRvZXNuJ3QgY29udGFpbiByYXcgZGF0YSBpbgorCXNlY3Rpb25zLCBidXQgZGF0YSBhbmQgcmVsb2NhdGlvbiBleHByZXNzaW9ucyBpbnRlcm1peGVkLCBzbworCXRoZSBkYXRhIGFyZWEgaGFzIHRvIGJlIHBhcnNlZCB0byBnZXQgb3V0IHRoZSBkYXRhIGFuZAorCXJlbG9jYXRpb25zLgorCitJTk9ERQorU2VjdGlvbiBPdXRwdXQsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb24gSW5wdXQsIFNlY3Rpb25zCisKK1NVQlNFQ1RJT04KKwlTZWN0aW9uIG91dHB1dAorCisJVG8gd3JpdGUgYSBuZXcgb2JqZWN0IHN0eWxlIEJGRCwgdGhlIHZhcmlvdXMgc2VjdGlvbnMgdG8gYmUKKwl3cml0dGVuIGhhdmUgdG8gYmUgY3JlYXRlZC4gVGhleSBhcmUgYXR0YWNoZWQgdG8gdGhlIEJGRCBpbgorCXRoZSBzYW1lIHdheSBhcyBpbnB1dCBzZWN0aW9uczsgZGF0YSBpcyB3cml0dGVuIHRvIHRoZQorCXNlY3Rpb25zIHVzaW5nIDw8YmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzPj4uCisKKwlBbnkgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgb3IgY29tYmluZXMgc2VjdGlvbnMgKGUuZy4sIHRoZSBhc3NlbWJsZXIKKwlhbmQgbGlua2VyKSBtdXN0IHVzZSB0aGUgPDxhc2VjdGlvbj4+IGZpZWxkcyA8PG91dHB1dF9zZWN0aW9uPj4gYW5kCisJPDxvdXRwdXRfb2Zmc2V0Pj4gdG8gaW5kaWNhdGUgdGhlIGZpbGUgc2VjdGlvbnMgdG8gd2hpY2ggZWFjaAorCXNlY3Rpb24gbXVzdCBiZSB3cml0dGVuLiAgKElmIHRoZSBzZWN0aW9uIGlzIGJlaW5nIGNyZWF0ZWQgZnJvbQorCXNjcmF0Y2gsIDw8b3V0cHV0X3NlY3Rpb24+PiBzaG91bGQgcHJvYmFibHkgcG9pbnQgdG8gdGhlIHNlY3Rpb24KKwlpdHNlbGYgYW5kIDw8b3V0cHV0X29mZnNldD4+IHNob3VsZCBwcm9iYWJseSBiZSB6ZXJvLikKKworCVRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gY29tZXMgZnJvbSBpbnB1dCBzZWN0aW9ucyBhdHRhY2hlZAorCSh2aWEgPDxvdXRwdXRfc2VjdGlvbj4+IHBvaW50ZXJzKSB0bworCXRoZSBvdXRwdXQgc2VjdGlvbnMuICBUaGUgb3V0cHV0IHNlY3Rpb24gc3RydWN0dXJlIGNhbiBiZQorCWNvbnNpZGVyZWQgYSBmaWx0ZXIgZm9yIHRoZSBpbnB1dCBzZWN0aW9uOiB0aGUgb3V0cHV0IHNlY3Rpb24KKwlkZXRlcm1pbmVzIHRoZSB2bWEgb2YgdGhlIG91dHB1dCBkYXRhIGFuZCB0aGUgbmFtZSwgYnV0IHRoZQorCWlucHV0IHNlY3Rpb24gZGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IGludG8gdGhlIG91dHB1dCBzZWN0aW9uIG9mCisJdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KKworCUUuZy4sIHRvIGNyZWF0ZSBhIHNlY3Rpb24gIk8iLCBzdGFydGluZyBhdCAweDEwMCwgMHgxMjMgbG9uZywKKwljb250YWluaW5nIHR3byBzdWJzZWN0aW9ucywgIkEiIGF0IG9mZnNldCAweDAgKGkuZS4sIGF0IHZtYQorCTB4MTAwKSBhbmQgIkIiIGF0IG9mZnNldCAweDIwIChpLmUuLCBhdCB2bWEgMHgxMjApIHRoZSA8PGFzZWN0aW9uPj4KKwlzdHJ1Y3R1cmVzIHdvdWxkIGxvb2sgbGlrZToKKworfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQSIKK3wgICAgIG91dHB1dF9vZmZzZXQgICAweDAwCit8ICAgICBzaXplICAgICAgICAgICAgMHgyMAorfCAgICAgb3V0cHV0X3NlY3Rpb24gLS0tLS0tLS0tLS0+ICBzZWN0aW9uIG5hbWUgICAgIk8iCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHZtYSAgICAgICAgICAgICAweDEwMAorfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQiIgfCAgICBzaXplICAgICAgICAgICAgMHgxMjMKK3wgICAgIG91dHB1dF9vZmZzZXQgICAweDIwICAgIHwKK3wgICAgIHNpemUgICAgICAgICAgICAweDEwMyAgIHwKK3wgICAgIG91dHB1dF9zZWN0aW9uICAtLS0tLS0tLXwKKworCitTVUJTRUNUSU9OCisJTGluayBvcmRlcnMKKworCVRoZSBkYXRhIHdpdGhpbiBhIHNlY3Rpb24gaXMgc3RvcmVkIGluIGEgQGRmbntsaW5rX29yZGVyfS4KKwlUaGVzZSBhcmUgbXVjaCBsaWtlIHRoZSBmaXh1cHMgaW4gPDxnYXM+Pi4gIFRoZSBsaW5rX29yZGVyCisJYWJzdHJhY3Rpb24gYWxsb3dzIGEgc2VjdGlvbiB0byBncm93IGFuZCBzaHJpbmsgd2l0aGluIGl0c2VsZi4KKworCUEgbGlua19vcmRlciBrbm93cyBob3cgYmlnIGl0IGlzLCBhbmQgd2hpY2ggaXMgdGhlIG5leHQKKwlsaW5rX29yZGVyIGFuZCB3aGVyZSB0aGUgcmF3IGRhdGEgZm9yIGl0IGlzOyBpdCBhbHNvIHBvaW50cyB0bworCWEgbGlzdCBvZiByZWxvY2F0aW9ucyB3aGljaCBhcHBseSB0byBpdC4KKworCVRoZSBsaW5rX29yZGVyIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBwZXJmb3JtIHJlbGF4aW5nIG9uCisJZmluYWwgY29kZS4gIFRoZSBjb21waWxlciBjcmVhdGVzIGNvZGUgd2hpY2ggaXMgYXMgYmlnIGFzCisJbmVjZXNzYXJ5IHRvIG1ha2UgaXQgd29yayB3aXRob3V0IHJlbGF4aW5nLCBhbmQgdGhlIHVzZXIgY2FuCisJc2VsZWN0IHdoZXRoZXIgdG8gcmVsYXguICBTb21ldGltZXMgcmVsYXhpbmcgdGFrZXMgYSBsb3Qgb2YKKwl0aW1lLiAgVGhlIGxpbmtlciBydW5zIGFyb3VuZCB0aGUgcmVsb2NhdGlvbnMgdG8gc2VlIGlmIGFueQorCWFyZSBhdHRhY2hlZCB0byBkYXRhIHdoaWNoIGNhbiBiZSBzaHJ1bmssIGlmIHNvIGl0IGRvZXMgaXQgb24KKwlhIGxpbmtfb3JkZXIgYnkgbGlua19vcmRlciBiYXNpcy4KKworKi8KKworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisvKgorRE9DREQKK0lOT0RFCit0eXBlZGVmIGFzZWN0aW9uLCBzZWN0aW9uIHByb3RvdHlwZXMsIFNlY3Rpb24gT3V0cHV0LCBTZWN0aW9ucworU1VCU0VDVElPTgorCXR5cGVkZWYgYXNlY3Rpb24KKworCUhlcmUgaXMgdGhlIHNlY3Rpb24gc3RydWN0dXJlOgorCitDT0RFX0ZSQUdNRU5UCisuCisudHlwZWRlZiBzdHJ1Y3Qgc2VjCisueworLiAgICAgICAgeyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKKy4gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICp9CisuCisuICAgIENPTlNUIGNoYXIgKm5hbWU7CisuCisuICAgICAgICB7KiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKn0KKy4KKy4gICBpbnQgaW5kZXg7CisuCisuICAgICAgICB7KiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqfQorLgorLiAgICBzdHJ1Y3Qgc2VjICpuZXh0OworLgorLiAgICAgICAgeyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKKy4gICAgICAgICAgIGZsYWdzIGFyZSByZWFkIGluIGZyb20gdGhlIG9iamVjdCBmaWxlLCBhbmQgc29tZSBhcmUKKy4gICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqfQorLgorLiAgICBmbGFnd29yZCBmbGFnczsKKy4KKy4jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCisuCisuICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgc2VjdGlvbiB3aGVuIGxvYWRpbmcuCisuICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgorLiAgICAgICAgICAgb25seS4gKn0KKy4jZGVmaW5lIFNFQ19BTExPQyAgICAgIDB4MDAxCisuCisuICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gbG9hZCB0aGUgc2VjdGlvbiBmcm9tIHRoZSBmaWxlIHdoZW4gbG9hZGluZy4KKy4gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqfQorLiNkZWZpbmUgU0VDX0xPQUQgICAgICAgMHgwMDIKKy4KKy4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgc3RpbGwgdG8gYmUgcmVsb2NhdGVkLCBzbyB0aGVyZSBpcworLiAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKn0KKy4jZGVmaW5lIFNFQ19SRUxPQyAgICAgIDB4MDA0CisuCisuI2lmIDAgICB7KiBPYnNvbGV0ZSA/ICp9CisuI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAorLiNlbmRpZgorLgorLiAgICAgICAgeyogQSBzaWduYWwgdG8gdGhlIE9TIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgcmVhZCBvbmx5CisuICAgICAgICAgIGRhdGEuICp9CisuI2RlZmluZSBTRUNfUkVBRE9OTFkgICAweDAxMAorLgorLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29kZSBvbmx5LiAqfQorLiNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKKy4KKy4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seS4gKn0KKy4jZGVmaW5lIFNFQ19EQVRBICAgICAgIDB4MDQwCisuCisuICAgICAgICB7KiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICp9CisuI2RlZmluZSBTRUNfUk9NICAgICAgICAweDA4MAorLgorLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgorLiAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKKy4gICAgICAgICAgIGRlc3RydWN0b3JzIHVzZWQgYnkgPDxnKys+Pi4gV2hlbiBhIGJhY2sgZW5kIHNlZXMgYSBzeW1ib2wKKy4gICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldworLiAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcworLiAgICAgICAgICAgdGhlIHN5bWJvbCB0byBpdCwgYW5kIGJ1aWxkcyBhIHJlbG9jYXRpb24uIFRvIGJ1aWxkIHRoZSBsaXN0cworLiAgICAgICAgICAgb2YgY29uc3RydWN0b3JzLCBhbGwgdGhlIGxpbmtlciBoYXMgdG8gZG8gaXMgY2F0ZW5hdGUgYWxsIHRoZQorLiAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQorLiAgICAgICAgICAgY29udGFpbmVkIHdpdGhpbiAtIGV4YWN0bHkgdGhlIG9wZXJhdGlvbnMgaXQgd291bGQgcGVmb3JtIG9uCisuICAgICAgICAgICBzdGFuZGFyZCBkYXRhLiAqfQorLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCisuCisuICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIGNvbnN0cnVjdG9yLCBhbmQgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUKKy4gICAgICAgICAgZW5kIG9mIHRoZSB0ZXh0LCBkYXRhLCBvciBic3Mgc2VjdGlvbig/KS4gKn0KKy4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAorLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0RBVEEgMHgyMTAwCisuI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfQlNTICAweDMxMDAKKy4KKy4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCisuICAgICAgICAgICA8PFNFQ19BTExPQz4+IHwgPDxTRUNfSEFTX0NPTlRFTlRTPj47IGEgZGVidWcgc2VjdGlvbiBjb3VsZCBiZQorLiAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKn0KKy4jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKKy4KKy4gICAgICAgIHsqIEFuIGluc3RydWN0aW9uIHRvIHRoZSBsaW5rZXIgdG8gbm90IG91dHB1dCB0aGUgc2VjdGlvbgorLiAgICAgICAgICAgZXZlbiBpZiBpdCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKn0KKy4jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCisuCisuICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gIFRoaXMgZmxhZyBpcworLiAgICAgICAgICAgb25seSBmb3IgdGhlIGxpbmtlci4gIElmIHRoaXMgdHlwZSBvZiBzZWN0aW9uIGFwcGVhcnMgaW4KKy4gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKKy4gICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZtYSBvciBzaXplLiAgRklYTUU6IEFsdGhvdWdoIHRoaXMKKy4gICAgICAgICAgIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGdlbmVyYWwsIGl0IHJlYWxseSBpcyBDT0ZGCisuICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKKy4gICAgICAgICAgIG1pZ2h0IGJlIGNsZWFuZXIgdG8gaGF2ZSBzb21lIG1vcmUgZ2VuZXJhbCBtZWNoYW5pc20gdG8KKy4gICAgICAgICAgIGFsbG93IHRoZSBiYWNrIGVuZCB0byBjb250cm9sIHdoYXQgdGhlIGxpbmtlciBkb2VzIHdpdGgKKy4gICAgICAgICAgIHNlY3Rpb25zLiAqfQorLiNkZWZpbmUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgMHg4MDAKKy4KKy4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbW1vbiBzeW1ib2xzIChzeW1ib2xzIG1heSBiZSBkZWZpbmVkCisuICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKKy4gICAgICAgICAgIHNwYWNlIGl0IHJlcXVpcmVzLCBhbmQgdGhlIGxhcmdlc3Qgc3ltYm9sIHZhbHVlIGlzIHRoZSBvbmUKKy4gICAgICAgICAgIHVzZWQpLiAgTW9zdCB0YXJnZXRzIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgKHdoaWNoIHdlCisuCSAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqfQorLiNkZWZpbmUgU0VDX0lTX0NPTU1PTiAweDgwMDAKKy4KKy4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRm9yCisuICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCisuICAgICAgICAgICBzdHJpcCB0ZXN0cyB0aGlzIGZsYWcgdG8gc2VlIGlmIGEgc2VjdGlvbiBjYW4gYmUKKy4gICAgICAgICAgIGRpc2NhcmRlZC4gKn0KKy4jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAorLgorLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgaGVsZCBpbiBtZW1vcnkgcG9pbnRlZCB0bworLiAgICAgICAgICAgYnkgdGhlIGNvbnRlbnRzIGZpZWxkLiAgVGhpcyBpcyBjaGVja2VkIGJ5CisuICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQorLiAgICAgICAgICAgbWVtb3J5IGlmIGFwcHJvcHJpYXRlLiAgKn0KKy4jZGVmaW5lIFNFQ19JTl9NRU1PUlkgMHgyMDAwMAorLgorLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCisuCSAgICBsaW5rZXIgZm9yIGV4ZWN1dGFibGUgYW5kIHNoYXJlZCBvYmplY3RzIHVubGVzcyB0aG9zZQorLgkgICAgb2JqZWN0cyBhcmUgdG8gYmUgZnVydGhlciByZWxvY2F0ZWQuICAqfQorLiNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAorLgorLgl7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBzb3J0ZWQgYnkgdGhlCisuCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKKy4JICAgdGFibGUuICAqfQorLiNkZWZpbmUgU0VDX1NPUlRfRU5UUklFUyAweDgwMDAwCisuCisuCXsqIFdoZW4gbGlua2luZywgZHVwbGljYXRlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2hvdWxkIGJlCisuCSAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCisuCSAgIGlzIHVzdWFsbHkgZG9uZS4gIFRoaXMgaXMgc2ltaWxhciB0byBob3cgY29tbW9uIHN5bWJvbHMgYXJlCisuCSAgIGhhbmRsZWQuICBTZWUgU0VDX0xJTktfRFVQTElDQVRFUyBiZWxvdy4gICp9CisuI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCisuCisuCXsqIElmIFNFQ19MSU5LX09OQ0UgaXMgc2V0LCB0aGlzIGJpdGZpZWxkIGRlc2NyaWJlcyBob3cgdGhlIGxpbmtlcgorLgkgICBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSBzZWN0aW9ucy4gICp9CisuI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCisuCisuCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCBkdXBsaWNhdGUKKy4JICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBzaW1wbHkgYmUgZGlzY2FyZGVkLiAqfQorLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAorLgorLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgorLgkgICBzaG91bGQgd2FybiBpZiB0aGVyZSBhcmUgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucywgYWx0aG91Z2gKKy4JICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICp9CisuI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZIDB4MjAwMDAwCisuCisuCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCisuCSAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqfQorLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUgMHg0MDAwMDAKKy4KKy4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKKy4JICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAorLgkgICBjb250ZW50cy4gICp9CisuI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMgMHg2MDAwMDAKKy4KKy4JeyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCisuCSAgIHJlbG9jYXRpb24gb3Igb3RoZXIgYXJjYW5lIHByb2Nlc3NpbmcuICBJdCBpcyBza2lwcGVkIHdoZW4KKy4JICAgZ29pbmcgdGhyb3VnaCB0aGUgZmlyc3QtcGFzcyBvdXRwdXQsIHRydXN0aW5nIHRoYXQgc29tZW9uZQorLgkgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKn0KKy4jZGVmaW5lIFNFQ19MSU5LRVJfQ1JFQVRFRCAweDgwMDAwMAorLgorLgl7KiBUaGlzIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9CisuI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKKy4KKy4JeyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKn0KKy4KKy4JeyogU29tZSBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqfQorLgorLgl7KiBTZWUgdGhlIHZtYSBmaWVsZC4gICp9CisuCXVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOworLgorLgl7KiBXaGV0aGVyIHJlbG9jYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqfQorLgl1bnNpZ25lZCBpbnQgcmVsb2NfZG9uZSA6IDE7CisuCisuCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKn0KKy4JdW5zaWduZWQgaW50IGxpbmtlcl9tYXJrIDogMTsKKy4KKy4JeyogQSBtYXJrIGZsYWcgdXNlZCBieSBzb21lIGxpbmtlciBiYWNrZW5kcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKn0KKy4JdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOworLgorLgl7KiBFbmQgb2YgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KKy4KKy4gICAgICAgeyogIFRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd2lsbCBiZQorLiAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQorLgkgICAgdXNlcl9zZXRfdm1hIGZsYWcgaXMgbWFpbnRhaW5lZCBieSBiZmQ7IGlmIGl0J3Mgbm90IHNldCwgdGhlCisuCSAgICBiYWNrZW5kIGNhbiBhc3NpZ24gYWRkcmVzc2VzIChmb3IgZXhhbXBsZSwgaW4gPDxhLm91dD4+LCB3aGVyZQorLgkgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKKy4JICAgIHRhcmdldCBhbmQgdmFyaW91cyBmbGFncykuICAqfQorLgorLiAgIGJmZF92bWEgdm1hOworLgorLiAgICAgICB7KiAgVGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdvdWxkIGJlIGluIGEKKy4gICAgICAgICAgIHJvbSBpbWFnZTsgcmVhbGx5IG9ubHkgdXNlZCBmb3Igd3JpdGluZyBzZWN0aW9uIGhlYWRlcgorLgkgICAgaW5mb3JtYXRpb24uICp9CisuCisuICAgYmZkX3ZtYSBsbWE7CisuCisuICAgICAgICB7KiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcywgYXMgaXQgd2lsbCBiZSBvdXRwdXQuCisuICAgICAgICAgICBjb250YWlucyBhIHZhbHVlIGV2ZW4gaWYgdGhlIHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzIChlLmcuLCB0aGUKKy4gICAgICAgICAgIHNpemUgb2YgPDwuYnNzPj4pLiBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGFmdGVyIHJlbG9jYXRpb24gKn0KKy4KKy4gICBiZmRfc2l6ZV90eXBlIF9jb29rZWRfc2l6ZTsKKy4KKy4gICAgICAgIHsqIFRoZSBvcmlnaW5hbCBzaXplIG9uIGRpc2sgb2YgdGhlIHNlY3Rpb24sIGluIGJ5dGVzLiAgTm9ybWFsbHkgdGhpcworLgkgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcworLgkgICAgYmVlbiBkb25lLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBiaWdnZXIuICAqfQorLgorLiAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOworLgorLiAgICAgICAgeyogSWYgdGhpcyBzZWN0aW9uIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlbiB0aGlzIHZhbHVlIGlzIHRoZQorLiAgICAgICAgICAgb2Zmc2V0IGludG8gdGhlIG91dHB1dCBzZWN0aW9uIG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSBpbnB1dAorLiAgICAgICAgICAgc2VjdGlvbi4gRS5nLiwgaWYgdGhpcyB3YXMgZ29pbmcgdG8gc3RhcnQgYXQgdGhlIDEwMHRoIGJ5dGUgaW4KKy4gICAgICAgICAgIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSAxMDAuICp9CisuCisuICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OworLgorLiAgICAgICAgeyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKn0KKy4KKy4gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKKy4KKy4gICAgICAgIHsqIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IG9mIDIgLQorLiAgICAgICAgICAgZS5nLiwgMyBhbGlnbnMgdG8gMl4zIChvciA4KS4gKn0KKy4KKy4gICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOworLgorLiAgICAgICAgeyogSWYgYW4gaW5wdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHJlbG9jYXRpb24KKy4gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KKy4KKy4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbG9jYXRpb247CisuCisuICAgICAgICB7KiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCisuICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKn0KKy4KKy4gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKKy4KKy4gICAgICAgIHsqIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICp9CisuCisuICAgdW5zaWduZWQgcmVsb2NfY291bnQ7CisuCisuICAgICAgICB7KiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKKy4gICAgICAgICAgIG9yIHVwZGF0ZWQuICAqfQorLgorLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKn0KKy4KKy4gICBmaWxlX3B0ciBmaWxlcG9zOworLgorLiAgICAgICAgeyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKn0KKy4KKy4gICBmaWxlX3B0ciByZWxfZmlsZXBvczsKKy4KKy4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICp9CisuCisuICAgZmlsZV9wdHIgbGluZV9maWxlcG9zOworLgorLiAgICAgICAgeyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKn0KKy4KKy4gICBQVFIgdXNlcmRhdGE7CisuCisuICAgICAgICB7KiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAorLiAgICAgICAgICAgY29udGVudHMuICAqfQorLiAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOworLgorLiAgICAgICAgeyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKn0KKy4KKy4gICBhbGVudCAqbGluZW5vOworLgorLiAgICAgICAgeyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqfQorLgorLiAgIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7CisuCisuICAgICAgICB7KiBXaGVuIGEgc2VjdGlvbiBpcyBiZWluZyBvdXRwdXQsIHRoaXMgdmFsdWUgY2hhbmdlcyBhcyBtb3JlCisuICAgICAgICAgICBsaW5lbnVtYmVycyBhcmUgd3JpdHRlbiBvdXQgKn0KKy4KKy4gICBmaWxlX3B0ciBtb3ZpbmdfbGluZV9maWxlcG9zOworLgorLiAgICAgICAgeyogV2hhdCB0aGUgc2VjdGlvbiBudW1iZXIgaXMgaW4gdGhlIHRhcmdldCB3b3JsZCAgKn0KKy4KKy4gICBpbnQgdGFyZ2V0X2luZGV4OworLgorLiAgIFBUUiB1c2VkX2J5X2JmZDsKKy4KKy4gICAgICAgIHsqIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRoZW4gaGVyZSBpcyBhIGxpc3Qgb2YgdGhlCisuICAgICAgICAgICByZWxvY2F0aW9ucyBjcmVhdGVkIHRvIHJlbG9jYXRlIGl0ZW1zIHdpdGhpbiBpdC4gKn0KKy4KKy4gICBzdHJ1Y3QgcmVsZW50X2NoYWluICpjb25zdHJ1Y3Rvcl9jaGFpbjsKKy4KKy4gICAgICAgIHsqIFRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc2VjdGlvbi4gKn0KKy4KKy4gICBiZmQgKm93bmVyOworLgorLgkgeyogQSBzeW1ib2wgd2hpY2ggcG9pbnRzIGF0IHRoaXMgc2VjdGlvbiBvbmx5ICp9CisuICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOworLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xfcHRyX3B0cjsKKy4KKy4gICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXJfaGVhZDsKKy4gICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXJfdGFpbDsKKy59IGFzZWN0aW9uIDsKKy4KKy4gICAgeyogVGhlc2Ugc2VjdGlvbnMgYXJlIGdsb2JhbCwgYW5kIGFyZSBtYW5hZ2VkIGJ5IEJGRC4gIFRoZSBhcHBsaWNhdGlvbgorLiAgICAgICBhbmQgdGFyZ2V0IGJhY2sgZW5kIGFyZSBub3QgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluCisuCXRoZXNlIHNlY3Rpb25zLiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgc2VjdGlvbl9wdHIgbWFjcm9zIHJhdGhlcgorLiAgICAgICB0aGFuIHJlZmVycmluZyBkaXJlY3RseSB0byB0aGUgY29uc3Qgc2VjdGlvbnMuICBUaGUgY29uc3Qgc2VjdGlvbnMKKy4gICAgICAgbWF5IGV2ZW50dWFsbHkgdmFuaXNoLiAgKn0KKy4jZGVmaW5lIEJGRF9BQlNfU0VDVElPTl9OQU1FICIqQUJTKiIKKy4jZGVmaW5lIEJGRF9VTkRfU0VDVElPTl9OQU1FICIqVU5EKiIKKy4jZGVmaW5lIEJGRF9DT01fU0VDVElPTl9OQU1FICIqQ09NKiIKKy4jZGVmaW5lIEJGRF9JTkRfU0VDVElPTl9OQU1FICIqSU5EKiIKKy4KKy4gICAgeyogdGhlIGFic29sdXRlIHNlY3Rpb24gKn0KKy5leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2Fic19zZWN0aW9uOworLiNkZWZpbmUgYmZkX2Fic19zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfYWJzX3NlY3Rpb24pCisuI2RlZmluZSBiZmRfaXNfYWJzX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKKy4gICAgeyogUG9pbnRlciB0byB0aGUgdW5kZWZpbmVkIHNlY3Rpb24gKn0KKy5leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX3VuZF9zZWN0aW9uOworLiNkZWZpbmUgYmZkX3VuZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfdW5kX3NlY3Rpb24pCisuI2RlZmluZSBiZmRfaXNfdW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKKy4gICAgeyogUG9pbnRlciB0byB0aGUgY29tbW9uIHNlY3Rpb24gKn0KKy5leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2NvbV9zZWN0aW9uOworLiNkZWZpbmUgYmZkX2NvbV9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfY29tX3NlY3Rpb24pCisuICAgIHsqIFBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IHNlY3Rpb24gKn0KKy5leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2luZF9zZWN0aW9uOworLiNkZWZpbmUgYmZkX2luZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfaW5kX3NlY3Rpb24pCisuI2RlZmluZSBiZmRfaXNfaW5kX3NlY3Rpb24oc2VjKSAoKHNlYykgPT0gYmZkX2luZF9zZWN0aW9uX3B0cikKKy4KKy5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9hYnNfc3ltYm9sOworLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX2NvbV9zeW1ib2w7CisuZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfdW5kX3N5bWJvbDsKKy5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9pbmRfc3ltYm9sOworLiNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHNlY3Rpb24pIFwKKy4gICAgIChzZWN0aW9uLT5yZWxvY19kb25lID8gKGFib3J0KCksMSk6IChzZWN0aW9uKS0+X3Jhd19zaXplKQorLiNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2Moc2VjdGlvbikgXAorLiAgICAgKChzZWN0aW9uLT5yZWxvY19kb25lKSA/IChzZWN0aW9uKS0+X2Nvb2tlZF9zaXplOiAoYWJvcnQoKSwxKSkKKyovCisKKy8qIFRoZXNlIHN5bWJvbHMgYXJlIGdsb2JhbCwgbm90IHNwZWNpZmljIHRvIGFueSBCRkQuICBUaGVyZWZvcmUsIGFueXRoaW5nCisgICB0aGF0IHRyaWVzIHRvIGNoYW5nZSB0aGVtIGlzIGJyb2tlbiwgYW5kIHNob3VsZCBiZSByZXBhaXJlZC4gICovCitzdGF0aWMgY29uc3QgYXN5bWJvbCBnbG9iYWxfc3ltc1tdID0KK3sKKyAvKiB0aGVfYmZkLCBuYW1lLCB2YWx1ZSwgYXR0ciwgc2VjdGlvbiBbLCB1ZGF0YV0gKi8KKyAgezAsIEJGRF9DT01fU0VDVElPTl9OQU1FLCAwLCBCU0ZfU0VDVElPTl9TWU0sIChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9ufSwKKyAgezAsIEJGRF9VTkRfU0VDVElPTl9OQU1FLCAwLCBCU0ZfU0VDVElPTl9TWU0sIChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9ufSwKKyAgezAsIEJGRF9BQlNfU0VDVElPTl9OQU1FLCAwLCBCU0ZfU0VDVElPTl9TWU0sIChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9ufSwKKyAgezAsIEJGRF9JTkRfU0VDVElPTl9OQU1FLCAwLCBCU0ZfU0VDVElPTl9TWU0sIChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9ufSwKK307CisKKyNkZWZpbmUgU1REX1NFQ1RJT04oU0VDLCBGTEFHUywgU1lNLCBOQU1FLCBJRFgpCVwKKyAgY29uc3QgYXN5bWJvbCAqIGNvbnN0IFNZTSA9IChhc3ltYm9sICopICZnbG9iYWxfc3ltc1tJRFhdOyBcCisgIGNvbnN0IGFzZWN0aW9uIFNFQyA9IFwKKyAgICB7IE5BTUUsIDAsIDAsIEZMQUdTLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAoYXNlY3Rpb24gKikgJlNFQywgXAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgICAgIChhc3ltYm9sICopICZnbG9iYWxfc3ltc1tJRFhdLCAoYXN5bWJvbCAqKikgJlNZTSwgMCwgMCB9CisKK1NURF9TRUNUSU9OIChiZmRfY29tX3NlY3Rpb24sIFNFQ19JU19DT01NT04sIGJmZF9jb21fc3ltYm9sLAorCSAgICAgQkZEX0NPTV9TRUNUSU9OX05BTUUsIDApOworU1REX1NFQ1RJT04gKGJmZF91bmRfc2VjdGlvbiwgMCwgYmZkX3VuZF9zeW1ib2wsIEJGRF9VTkRfU0VDVElPTl9OQU1FLCAxKTsKK1NURF9TRUNUSU9OIChiZmRfYWJzX3NlY3Rpb24sIDAsIGJmZF9hYnNfc3ltYm9sLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMik7CitTVERfU0VDVElPTiAoYmZkX2luZF9zZWN0aW9uLCAwLCBiZmRfaW5kX3N5bWJvbCwgQkZEX0lORF9TRUNUSU9OX05BTUUsIDMpOworI3VuZGVmIFNURF9TRUNUSU9OCisKKy8qCitET0NERAorSU5PREUKK3NlY3Rpb24gcHJvdG90eXBlcywgICwgdHlwZWRlZiBhc2VjdGlvbiwgU2VjdGlvbnMKK1NVQlNFQ1RJT04KKwlTZWN0aW9uIHByb3RvdHlwZXMKKworVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhlIHNlY3Rpb24gaGFuZGxpbmcgcGFydCBvZiBCRkQuCisqLworCisvKgorRlVOQ1RJT04KKwliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQorCitTWU5PUFNJUworCWFzZWN0aW9uICpiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOworCitERVNDUklQVElPTgorCVJ1biB0aHJvdWdoIEB2YXJ7YWJmZH0gYW5kIHJldHVybiB0aGUgb25lIG9mIHRoZQorCTw8YXNlY3Rpb24+PnMgd2hvc2UgbmFtZSBtYXRjaGVzIEB2YXJ7bmFtZX0sIG90aGVyd2lzZSA8PE5VTEw+Pi4KKwlAeHJlZntTZWN0aW9uc30sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIHNwZWNpYWwgY2FzZXM7IHRoZSBub3JtYWwgd2F5IHRvIHByb2Nlc3MKKwlhbGwgc2VjdGlvbnMgb2YgYSBnaXZlbiBuYW1lIGlzIHRvIHVzZSA8PGJmZF9tYXBfb3Zlcl9zZWN0aW9ucz4+IGFuZAorCTw8c3RyY21wPj4gb24gdGhlIG5hbWUgKG9yIGJldHRlciB5ZXQsIGJhc2UgaXQgb24gdGhlIHNlY3Rpb24gZmxhZ3MKKwlvciBzb21ldGhpbmcgZWxzZSkgZm9yIGVhY2ggc2VjdGlvbi4KKyovCisKK2FzZWN0aW9uICoKK2JmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIGFzZWN0aW9uICpzZWN0OworCisgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0ICE9IE5VTEw7IHNlY3QgPSBzZWN0LT5uZXh0KQorICAgIGlmICghc3RyY21wIChzZWN0LT5uYW1lLCBuYW1lKSkKKyAgICAgIHJldHVybiBzZWN0OworICByZXR1cm4gTlVMTDsKK30KKworCisvKgorRlVOQ1RJT04KKwliZmRfbWFrZV9zZWN0aW9uX29sZF93YXkKKworU1lOT1BTSVMKKwlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5KGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqbmFtZSk7CisKK0RFU0NSSVBUSU9OCisJQ3JlYXRlIGEgbmV3IGVtcHR5IHNlY3Rpb24gY2FsbGVkIEB2YXJ7bmFtZX0KKwlhbmQgYXR0YWNoIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciB0aGUKKwlCRkQgQHZhcnthYmZkfS4gQW4gYXR0ZW1wdCB0byBjcmVhdGUgYSBzZWN0aW9uIHdpdGggYSBuYW1lIHdoaWNoCisJaXMgYWxyZWFkeSBpbiB1c2UgcmV0dXJucyBpdHMgcG9pbnRlciB3aXRob3V0IGNoYW5naW5nIHRoZQorCXNlY3Rpb24gY2hhaW4uCisKKwlJdCBoYXMgdGhlIGZ1bm55IG5hbWUgc2luY2UgdGhpcyBpcyB0aGUgd2F5IGl0IHVzZWQgdG8gYmUKKwliZWZvcmUgaXQgd2FzIHJld3JpdHRlbi4uLi4KKworCVBvc3NpYmxlIGVycm9ycyBhcmU6CisJbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KKwlJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgdGhpcyBCRkQuCisJbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCisJSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisKKyovCisKKworYXNlY3Rpb24gKgorYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7CisgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCisgICAgeworICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7CisgICAgfQorICByZXR1cm4gc2VjOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfbWFrZV9zZWN0aW9uX2FueXdheQorCitTWU5PUFNJUworCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uX2FueXdheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOworCitERVNDUklQVElPTgorICAgQ3JlYXRlIGEgbmV3IGVtcHR5IHNlY3Rpb24gY2FsbGVkIEB2YXJ7bmFtZX0gYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mCisgICB0aGUgY2hhaW4gb2Ygc2VjdGlvbnMgZm9yIEB2YXJ7YWJmZH0uICBDcmVhdGUgYSBuZXcgc2VjdGlvbiBldmVuIGlmIHRoZXJlCisgICBpcyBhbHJlYWR5IGEgc2VjdGlvbiB3aXRoIHRoYXQgbmFtZS4KKworICAgUmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQgPDxiZmRfZXJyb3I+PiBvbiBlcnJvcjsgcG9zc2libGUgZXJyb3JzIGFyZToKKyAgIG8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtIElmIG91dHB1dCBoYXMgYWxyZWFkeSBzdGFydGVkIGZvciBAdmFye2FiZmR9LgorICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorKi8KKworc2VjX3B0cgorYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKK3sKKyAgYXNlY3Rpb24gKm5ld3NlY3Q7CisgIGFzZWN0aW9uICoqcHJldiA9ICZhYmZkLT5zZWN0aW9uczsKKyAgYXNlY3Rpb24gKnNlY3QgPSBhYmZkLT5zZWN0aW9uczsKKworICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHdoaWxlIChzZWN0KQorICAgIHsKKyAgICAgIHByZXYgPSAmc2VjdC0+bmV4dDsKKyAgICAgIHNlY3QgPSBzZWN0LT5uZXh0OworICAgIH0KKworICBuZXdzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBuZXdzZWN0LT5uYW1lID0gbmFtZTsKKyAgbmV3c2VjdC0+aW5kZXggPSBhYmZkLT5zZWN0aW9uX2NvdW50Kys7CisgIG5ld3NlY3QtPmZsYWdzID0gU0VDX05PX0ZMQUdTOworCisgIG5ld3NlY3QtPnVzZXJkYXRhID0gTlVMTDsKKyAgbmV3c2VjdC0+Y29udGVudHMgPSBOVUxMOworICBuZXdzZWN0LT5uZXh0ID0gKGFzZWN0aW9uICopIE5VTEw7CisgIG5ld3NlY3QtPnJlbG9jYXRpb24gPSAoYXJlbGVudCAqKSBOVUxMOworICBuZXdzZWN0LT5yZWxvY19jb3VudCA9IDA7CisgIG5ld3NlY3QtPmxpbmVfZmlsZXBvcyA9IDA7CisgIG5ld3NlY3QtPm93bmVyID0gYWJmZDsKKworICAvKiBDcmVhdGUgYSBzeW1ib2wgd2hvcyBvbmx5IGpvYiBpcyB0byBwb2ludCB0byB0aGlzIHNlY3Rpb24uIFRoaXMgaXMKKyAgICAgdXNlZnVsIGZvciB0aGluZ3MgbGlrZSByZWxvY3Mgd2hpY2ggYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIGEKKyAgICAgc2VjdGlvbi4gICovCisgIG5ld3NlY3QtPnN5bWJvbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7CisgIGlmIChuZXdzZWN0LT5zeW1ib2wgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgbmV3c2VjdC0+c3ltYm9sLT5uYW1lID0gbmFtZTsKKyAgbmV3c2VjdC0+c3ltYm9sLT52YWx1ZSA9IDA7CisgIG5ld3NlY3QtPnN5bWJvbC0+c2VjdGlvbiA9IG5ld3NlY3Q7CisgIG5ld3NlY3QtPnN5bWJvbC0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07CisKKyAgbmV3c2VjdC0+c3ltYm9sX3B0cl9wdHIgPSAmbmV3c2VjdC0+c3ltYm9sOworCisgIGlmIChCRkRfU0VORCAoYWJmZCwgX25ld19zZWN0aW9uX2hvb2ssIChhYmZkLCBuZXdzZWN0KSkgIT0gdHJ1ZSkKKyAgICB7CisgICAgICBmcmVlIChuZXdzZWN0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAqcHJldiA9IG5ld3NlY3Q7CisgIHJldHVybiBuZXdzZWN0OworfQorCisvKgorRlVOQ1RJT04KKwliZmRfbWFrZV9zZWN0aW9uCisKK1NZTk9QU0lTCisJYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb24oYmZkICosIENPTlNUIGNoYXIgKm5hbWUpOworCitERVNDUklQVElPTgorICAgTGlrZSA8PGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Pj4sIGJ1dCByZXR1cm4gPDxOVUxMPj4gKHdpdGhvdXQgY2FsbGluZworICAgYmZkX3NldF9lcnJvciAoKSkgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VjdGlvbiBjaGFpbiBpZiB0aGVyZSBpcyBhbHJlYWR5IGEKKyAgIHNlY3Rpb24gbmFtZWQgQHZhcntuYW1lfS4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCByZXR1cm4gPDxOVUxMPj4gYW5kIHNldAorICAgPDxiZmRfZXJyb3I+Pi4KKyovCisKK2FzZWN0aW9uICoKK2JmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKK3sKKyAgYXNlY3Rpb24gKnNlY3QgPSBhYmZkLT5zZWN0aW9uczsKKworICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSkgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgICB9CisgIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9DT01fU0VDVElPTl9OQU1FKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBiZmRfY29tX3NlY3Rpb25fcHRyOworICAgIH0KKyAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX1VORF9TRUNUSU9OX05BTUUpID09IDApCisgICAgeworICAgICAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7CisgICAgfQorCisgIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9JTkRfU0VDVElPTl9OQU1FKSA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBiZmRfaW5kX3NlY3Rpb25fcHRyOworICAgIH0KKworICB3aGlsZSAoc2VjdCkKKyAgICB7CisgICAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCisJcmV0dXJuIE5VTEw7CisgICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKKyAgICB9CisKKyAgLyogVGhlIG5hbWUgaXMgbm90IGFscmVhZHkgdXNlZDsgZ28gYWhlYWQgYW5kIG1ha2UgYSBuZXcgc2VjdGlvbi4gICovCisgIHJldHVybiBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX3NldF9zZWN0aW9uX2ZsYWdzCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBmbGFnd29yZCBmbGFncyk7CisKK0RFU0NSSVBUSU9OCisJU2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uIEB2YXJ7c2VjfSBpbiB0aGUgQkZECisJQHZhcnthYmZkfSB0byB0aGUgdmFsdWUgQHZhcntmbGFnc30uIFJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLAorCTw8ZmFsc2U+PiBvbiBlcnJvci4gUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6CisKKwlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQorCVRoZSBzZWN0aW9uIGNhbm5vdCBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZSBhdHRyaWJ1dGVzCisJcmVxdWVzdGVkLiBGb3IgZXhhbXBsZSwgYSAuYnNzIHNlY3Rpb24gaW4gPDxhLm91dD4+IG1heSBub3QKKwloYXZlIHRoZSA8PFNFQ19IQVNfQ09OVEVOVFM+PiBmaWVsZCBzZXQuCisKKyovCisKKy8qQVJHU1VTRUQqLworYm9vbGVhbgorYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBmbGFncykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIGZsYWd3b3JkIGZsYWdzOworeworI2lmIDAKKyAgLyogSWYgeW91IHRyeSB0byBjb3B5IGEgdGV4dCBzZWN0aW9uIGZyb20gYW4gaW5wdXQgZmlsZSAod2hlcmUgaXQKKyAgICAgaGFzIHRoZSBTRUNfQ09ERSBmbGFnIHNldCkgdG8gYW4gb3V0cHV0IGZpbGUsIHRoaXMgbG9zZXMgYmlnIGlmCisgICAgIHRoZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChhYmZkKSBkb2Vzbid0IGhhdmUgdGhlIFNFQ19DT0RFCisgICAgIHNldCAtIHdoaWNoIGl0IGRvZXNuJ3QsIGF0IGxlYXN0IG5vdCBmb3IgYS5vdXQuICBGSVhNRSAqLworCisgIGlmICgoZmxhZ3MgJiBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChhYmZkKSkgIT0gZmxhZ3MpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworICBzZWN0aW9uLT5mbGFncyA9IGZsYWdzOworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKgorRlVOQ1RJT04KKwliZmRfbWFwX292ZXJfc2VjdGlvbnMKKworU1lOT1BTSVMKKwl2b2lkIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyhiZmQgKmFiZmQsCisJCQkJICAgdm9pZCAoKmZ1bmMpKGJmZCAqYWJmZCwKKwkJCQkJCWFzZWN0aW9uICpzZWN0LAorCQkJCQkJUFRSIG9iaiksCisJCQkJICAgUFRSIG9iaik7CisKK0RFU0NSSVBUSU9OCisJQ2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gQHZhcntmdW5jfSBmb3IgZWFjaCBzZWN0aW9uCisJYXR0YWNoZWQgdG8gdGhlIEJGRCBAdmFye2FiZmR9LCBwYXNzaW5nIEB2YXJ7b2JqfSBhcyBhbgorCWFyZ3VtZW50LiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYXMgaWYgYnkKKworfAlmdW5jKGFiZmQsIHRoZV9zZWN0aW9uLCBvYmopOworCisJVGhpcyBpcyB0aGUgcHJlZmVyZWQgbWV0aG9kIGZvciBpdGVyYXRpbmcgb3ZlciBzZWN0aW9uczsgYW4KKwlhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB1c2UgYSBsb29wOgorCit8CSAgIHNlY3Rpb24gKnA7Cit8CSAgIGZvciAocCA9IGFiZmQtPnNlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorfAkgICAgICBmdW5jKGFiZmQsIHAsIC4uLikKKworCisqLworCisvKlZBUkFSR1MyKi8KK3ZvaWQKK2JmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgb3BlcmF0aW9uLCB1c2VyX3N0b3JhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdm9pZCAoKm9wZXJhdGlvbikgUEFSQU1TICgoYmZkICogYWJmZCwgYXNlY3Rpb24gKiBzZWN0LCBQVFIgb2JqKSk7CisgICAgIFBUUiB1c2VyX3N0b3JhZ2U7Cit7CisgIGFzZWN0aW9uICpzZWN0OworICB1bnNpZ25lZCBpbnQgaSA9IDA7CisKKyAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3QgIT0gTlVMTDsgaSsrLCBzZWN0ID0gc2VjdC0+bmV4dCkKKyAgICAoKm9wZXJhdGlvbikgKGFiZmQsIHNlY3QsIHVzZXJfc3RvcmFnZSk7CisKKyAgaWYgKGkgIT0gYWJmZC0+c2VjdGlvbl9jb3VudCkJLyogRGVidWdnaW5nICovCisgICAgYWJvcnQgKCk7Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX3NldF9zZWN0aW9uX3NpemUKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9zaXplKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3NpemVfdHlwZSB2YWwpOworCitERVNDUklQVElPTgorCVNldCBAdmFye3NlY30gdG8gdGhlIHNpemUgQHZhcnt2YWx9LiBJZiB0aGUgb3BlcmF0aW9uIGlzCisJb2ssIHRoZW4gPDx0cnVlPj4gaXMgcmV0dXJuZWQsIGVsc2UgPDxmYWxzZT4+LgorCisJUG9zc2libGUgZXJyb3IgcmV0dXJuczoKKwlvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLQorCVdyaXRpbmcgaGFzIHN0YXJ0ZWQgdG8gdGhlIEJGRCwgc28gc2V0dGluZyB0aGUgc2l6ZSBpcyBpbnZhbGlkLgorCisqLworCitib29sZWFuCitiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcHRyLCB2YWwpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBwdHI7CisgICAgIGJmZF9zaXplX3R5cGUgdmFsOworeworICAvKiBPbmNlIHlvdSd2ZSBzdGFydGVkIHdyaXRpbmcgdG8gYW55IHNlY3Rpb24geW91IGNhbm5vdCBjcmVhdGUgb3IgY2hhbmdlCisgICAgIHRoZSBzaXplIG9mIGFueSBvdGhlcnMuICovCisKKyAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcHRyLT5fY29va2VkX3NpemUgPSB2YWw7CisgIHB0ci0+X3Jhd19zaXplID0gdmFsOworCisgIHJldHVybiB0cnVlOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfc2V0X3NlY3Rpb25fY29udGVudHMKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cworICAgICAgICAgKGJmZCAqYWJmZCwKKyAgICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAorICAgICAgICAgUFRSIGRhdGEsCisgICAgICAgICBmaWxlX3B0ciBvZmZzZXQsCisgICAgICAgICBiZmRfc2l6ZV90eXBlIGNvdW50KTsKKworCitERVNDUklQVElPTgorCVNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIEB2YXJ7c2VjdGlvbn0gaW4gQkZECisJQHZhcnthYmZkfSB0byB0aGUgZGF0YSBzdGFydGluZyBpbiBtZW1vcnkgYXQgQHZhcntkYXRhfS4gVGhlCisJZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdCBvZmZzZXQKKwlAdmFye29mZnNldH0gZm9yIEB2YXJ7Y291bnR9IGJ5dGVzLgorCisKKworCU5vcm1hbGx5IDw8dHJ1ZT4+IGlzIHJldHVybmVkLCBlbHNlIDw8ZmFsc2U+Pi4gUG9zc2libGUgZXJyb3IKKwlyZXR1cm5zIGFyZToKKwlvIDw8YmZkX2Vycm9yX25vX2NvbnRlbnRzPj4gLQorCVRoZSBvdXRwdXQgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSA8PFNFQ19IQVNfQ09OVEVOVFM+PgorCWF0dHJpYnV0ZSwgc28gbm90aGluZyBjYW4gYmUgd3JpdHRlbiB0byBpdC4KKwlvIGFuZCBzb21lIG1vcmUgdG9vCisKKwlUaGlzIHJvdXRpbmUgaXMgZnJvbnQgZW5kIHRvIHRoZSBiYWNrIGVuZCBmdW5jdGlvbgorCTw8X2JmZF9zZXRfc2VjdGlvbl9jb250ZW50cz4+LgorCisKKyovCisKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfbm93KGFiZmQsc2VjKSBcCisoc2VjLT5yZWxvY19kb25lIFwKKyA/IGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jIChzZWMpIFwKKyA6IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSkKKworYm9vbGVhbgorYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIHNlY3Rpb247CisgICAgIFBUUiBsb2NhdGlvbjsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBiZmRfc2l6ZV90eXBlIHN6OworCisgIGlmICghKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfSEFTX0NPTlRFTlRTKSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fY29udGVudHMpOworICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgfQorCisgIGlmIChvZmZzZXQgPCAwKQorICAgIHsKKyAgICBiYWRfdmFsOgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBzeiA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdyAoYWJmZCwgc2VjdGlvbik7CisgIGlmICgoYmZkX3NpemVfdHlwZSkgb2Zmc2V0ID4gc3oKKyAgICAgIHx8IGNvdW50ID4gc3oKKyAgICAgIHx8IG9mZnNldCArIGNvdW50ID4gc3opCisgICAgZ290byBiYWRfdmFsOworCisgIHN3aXRjaCAoYWJmZC0+ZGlyZWN0aW9uKQorICAgIHsKKyAgICBjYXNlIHJlYWRfZGlyZWN0aW9uOgorICAgIGNhc2Ugbm9fZGlyZWN0aW9uOgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2Ugd3JpdGVfZGlyZWN0aW9uOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJvdGhfZGlyZWN0aW9uOgorICAgICAgLyogRmlsZSBpcyBvcGVuZWQgZm9yIHVwZGF0ZS4gYG91dHB1dF9oYXNfYmVndW4nIHNvbWUgdGltZSBhZ28gd2hlbgorCSAgIHRoZSBmaWxlIHdhcyBjcmVhdGVkLiAgRG8gbm90IHJlY29tcHV0ZSBzZWN0aW9ucyBzaXplcyBvciBhbGlnbm1lbnRzCisJICAgaW4gX2JmZF9zZXRfc2VjdGlvbl9jb250ZW50LiAgKi8KKyAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChCRkRfU0VORCAoYWJmZCwgX2JmZF9zZXRfc2VjdGlvbl9jb250ZW50cywKKwkJKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KSkpCisgICAgeworICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cworICAgICAgICAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLAorICAgICAgICAgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KTsKKworREVTQ1JJUFRJT04KKwlSZWFkIGRhdGEgZnJvbSBAdmFye3NlY3Rpb259IGluIEJGRCBAdmFye2FiZmR9CisJaW50byBtZW1vcnkgc3RhcnRpbmcgYXQgQHZhcntsb2NhdGlvbn0uIFRoZSBkYXRhIGlzIHJlYWQgYXQgYW4KKwlvZmZzZXQgb2YgQHZhcntvZmZzZXR9IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzZWN0aW9uLAorCWFuZCBpcyByZWFkIGZvciBAdmFye2NvdW50fSBieXRlcy4KKworCUlmIHRoZSBjb250ZW50cyBvZiBhIGNvbnN0cnVjdG9yIHdpdGggdGhlIDw8U0VDX0NPTlNUUlVDVE9SPj4KKwlmbGFnIHNldCBhcmUgcmVxdWVzdGVkIG9yIGlmIHRoZSBzZWN0aW9uIGRvZXMgbm90IGhhdmUgdGhlCisJPDxTRUNfSEFTX0NPTlRFTlRTPj4gZmxhZyBzZXQsIHRoZW4gdGhlIEB2YXJ7bG9jYXRpb259IGlzIGZpbGxlZAorCXdpdGggemVyb2VzLiBJZiBubyBlcnJvcnMgb2NjdXIsIDw8dHJ1ZT4+IGlzIHJldHVybmVkLCBlbHNlCisJPDxmYWxzZT4+LgorCisKKworKi8KK2Jvb2xlYW4KK2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgYmZkX3NpemVfdHlwZSBzejsKKworICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCisgICAgeworICAgICAgbWVtc2V0IChsb2NhdGlvbiwgMCwgKHVuc2lnbmVkKSBjb3VudCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKG9mZnNldCA8IDApCisgICAgeworICAgIGJhZF92YWw6CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIC8qIEV2ZW4gaWYgcmVsb2NfZG9uZSBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHJlYWRzIHVucmVsb2NhdGVkCisgICAgIGNvbnRlbnRzLCBzbyB3ZSB3YW50IHRoZSByYXcgc2l6ZS4gICovCisgIHN6ID0gc2VjdGlvbi0+X3Jhd19zaXplOworICBpZiAoKGJmZF9zaXplX3R5cGUpIG9mZnNldCA+IHN6IHx8IGNvdW50ID4gc3ogfHwgb2Zmc2V0ICsgY291bnQgPiBzeikKKyAgICBnb3RvIGJhZF92YWw7CisKKyAgaWYgKGNvdW50ID09IDApCisgICAgLyogRG9uJ3QgYm90aGVyLiAgKi8KKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkKKyAgICB7CisgICAgICBtZW1zZXQgKGxvY2F0aW9uLCAwLCAodW5zaWduZWQpIGNvdW50KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0lOX01FTU9SWSkgIT0gMCkKKyAgICB7CisgICAgICBtZW1jcHkgKGxvY2F0aW9uLCBzZWN0aW9uLT5jb250ZW50cyArIG9mZnNldCwgKHNpemVfdCkgY291bnQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cywKKwkJICAgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KSk7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YShiZmQgKmliZmQsIGFzZWN0aW9uICppc2VjLCBiZmQgKm9iZmQsIGFzZWN0aW9uICpvc2VjKTsKKworREVTQ1JJUFRJT04KKwlDb3B5IHByaXZhdGUgc2VjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIEB2YXJ7aXNlY30gaW4gdGhlIEJGRAorCUB2YXJ7aWJmZH0gdG8gdGhlIHNlY3Rpb24gQHZhcntvc2VjfSBpbiB0aGUgQkZEIEB2YXJ7b2JmZH0uCisJUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCisJcmV0dXJucyBhcmU6CisKKwlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KKwlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvc2VjfS4KKworLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSBcCisuICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLCBcCisuCQkoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSkKKyovCisKKy8qCitGVU5DVElPTgorCV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAorCitTWU5PUFNJUworCXZvaWQgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0CisJKGFzZWN0aW9uICpzZWN0aW9uKTsKKworREVTQ1JJUFRJT04KKwlSZW1vdmUgQHZhcntzZWN0aW9ufSBmcm9tIHRoZSBvdXRwdXQuICBJZiB0aGUgb3V0cHV0IHNlY3Rpb24gYmVjb21lcworCWVtcHR5LCByZW1vdmUgaXQgZnJvbSB0aGUgb3V0cHV0IGJmZC4KKyovCit2b2lkCitfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQgKHMpCisgICAgIGFzZWN0aW9uICpzOworeworICBhc2VjdGlvbiAqKnNwcCwgKm9zOworICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnAsICpwcDsKKworICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOworICBmb3IgKHAgPSBvcy0+bGlua19vcmRlcl9oZWFkLCBwcCA9IE5VTEw7IHAgIT0gTlVMTDsgcHAgPSBwLCBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgorCSYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbiA9PSBzKQorICAgICAgeworCS8qIEV4Y2lzZSB0aGUgaW5wdXQgc2VjdGlvbi4gICovCisJaWYgKHBwKQorCSAgcHAtPm5leHQgPSBwLT5uZXh0OworCWVsc2UKKwkgIG9zLT5saW5rX29yZGVyX2hlYWQgPSBwLT5uZXh0OworCWlmICghcC0+bmV4dCkKKwkgIG9zLT5saW5rX29yZGVyX3RhaWwgPSBwcDsKKworCWlmICghb3MtPmxpbmtfb3JkZXJfaGVhZCkKKwkgIHsKKwkgICAgLyogRXhjaXNlIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisJICAgIGZvciAoc3BwID0gJm9zLT5vd25lci0+c2VjdGlvbnM7ICpzcHA7IHNwcCA9ICYoKnNwcCktPm5leHQpCisJICAgICAgaWYgKCpzcHAgPT0gb3MpCisJCXsKKwkJICAqc3BwID0gb3MtPm5leHQ7CisJCSAgb3MtPm93bmVyLT5zZWN0aW9uX2NvdW50LS07CisJCSAgYnJlYWs7CisJCX0KKwkgIH0KKwlicmVhazsKKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2JmZC9zb20uYyBiL2JmZC9zb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc4NmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL3NvbS5jCkBAIC0wLDAgKzEsNjI2NCBAQAorLyogYmZkIGJhY2stZW5kIGZvciBIUCBQQS1SSVNDIFNPTSBvYmplY3RzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisjaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpIHx8IGRlZmluZWQoSE9TVF9IUFBBTVBFSVgpCisKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJzb20uaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisvKiBNYWdpYyBub3QgZGVmaW5lZCBpbiBzdGFuZGFyZCBIUC1VWCBoZWFkZXIgZmlsZXMgdW50aWwgOC4wICovCisKKyNpZm5kZWYgQ1BVX1BBX1JJU0MxXzAKKyNkZWZpbmUgQ1BVX1BBX1JJU0MxXzAgMHgyMEIKKyNlbmRpZiAvKiBDUFVfUEFfUklTQzFfMCAqLworCisjaWZuZGVmIENQVV9QQV9SSVNDMV8xCisjZGVmaW5lIENQVV9QQV9SSVNDMV8xIDB4MjEwCisjZW5kaWYgLyogQ1BVX1BBX1JJU0MxXzEgKi8KKworI2lmbmRlZiBDUFVfUEFfUklTQzJfMAorI2RlZmluZSBDUFVfUEFfUklTQzJfMCAweDIxNAorI2VuZGlmIC8qIENQVV9QQV9SSVNDMl8wICovCisKKyNpZm5kZWYgX1BBX1JJU0MxXzBfSUQKKyNkZWZpbmUgX1BBX1JJU0MxXzBfSUQgQ1BVX1BBX1JJU0MxXzAKKyNlbmRpZiAvKiBfUEFfUklTQzFfMF9JRCAqLworCisjaWZuZGVmIF9QQV9SSVNDMV8xX0lECisjZGVmaW5lIF9QQV9SSVNDMV8xX0lEIENQVV9QQV9SSVNDMV8xCisjZW5kaWYgLyogX1BBX1JJU0MxXzFfSUQgKi8KKworI2lmbmRlZiBfUEFfUklTQzJfMF9JRAorI2RlZmluZSBfUEFfUklTQzJfMF9JRCBDUFVfUEFfUklTQzJfMAorI2VuZGlmIC8qIF9QQV9SSVNDMl8wX0lEICovCisKKyNpZm5kZWYgX1BBX1JJU0NfTUFYSUQKKyNkZWZpbmUgX1BBX1JJU0NfTUFYSUQJMHgyRkYKKyNlbmRpZiAvKiBfUEFfUklTQ19NQVhJRCAqLworCisjaWZuZGVmIF9QQV9SSVNDX0lECisjZGVmaW5lIF9QQV9SSVNDX0lEKF9fbV9udW0pCQlcCisgICAgKCgoX19tX251bSkgPT0gX1BBX1JJU0MxXzBfSUQpIHx8CVwKKyAgICAgKChfX21fbnVtKSA+PSBfUEFfUklTQzFfMV9JRCAmJiAoX19tX251bSkgPD0gX1BBX1JJU0NfTUFYSUQpKQorI2VuZGlmIC8qIF9QQV9SSVNDX0lEICovCisKKworLyogSElVWCBpbiBpdCdzIGluZmluaXRlIHN0dXBpZGl0eSBjaGFuZ2VkIHRoZSBuYW1lcyBmb3Igc2V2ZXJhbCAid2VsbAorICAga25vd24iIGNvbnN0YW50cy4gIFdvcmsgYXJvdW5kIHN1Y2ggYnJhaW5kYW1hZ2UuICBUcnkgdGhlIEhQVVggdmVyc2lvbgorICAgZmlyc3QsIHRoZW4gdGhlIEhJVVggdmVyc2lvbiwgYW5kIGZpbmFsbHkgcHJvdmlkZSBhIGRlZmF1bHQuICAqLworI2lmZGVmIEhQVVhfQVVYX0lECisjZGVmaW5lIEVYRUNfQVVYX0lEIEhQVVhfQVVYX0lECisjZW5kaWYKKworI2lmICFkZWZpbmVkIChFWEVDX0FVWF9JRCkgJiYgZGVmaW5lZCAoSElVWF9BVVhfSUQpCisjZGVmaW5lIEVYRUNfQVVYX0lEIEhJVVhfQVVYX0lECisjZW5kaWYKKworI2lmbmRlZiBFWEVDX0FVWF9JRAorI2RlZmluZSBFWEVDX0FVWF9JRCAwCisjZW5kaWYKKworLyogU2l6ZSAoaW4gY2hhcnMpIG9mIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyB1c2VkIGR1cmluZyBmaXh1cCBhbmQgc3RyaW5nCisgICB0YWJsZSB3cml0ZXMuICAgKi8KKyAgIAorI2RlZmluZSBTT01fVE1QX0JVRlNJWkUgODE5MgorCisvKiBTaXplIG9mIHRoZSBoYXNoIHRhYmxlIGluIGFyY2hpdmVzLiAgKi8KKyNkZWZpbmUgU09NX0xTVF9IQVNIX1NJWkUgMzEKKworLyogTWF4IG51bWJlciBvZiBTT01zIHRvIGJlIGZvdW5kIGluIGFuIGFyY2hpdmUuICAqLworI2RlZmluZSBTT01fTFNUX01PRFVMRV9MSU1JVCAxMDI0CisKKy8qIEdlbmVyaWMgYWxpZ25tZW50IG1hY3JvLiAgKi8KKyNkZWZpbmUgU09NX0FMSUdOKHZhbCwgYWxpZ25tZW50KSBcCisgICgoKHZhbCkgKyAoYWxpZ25tZW50KSAtIDEpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCisvKiBTT00gYWxsb3dzIGFueSBvbmUgb2YgdGhlIGZvdXIgcHJldmlvdXMgcmVsb2NhdGlvbnMgdG8gYmUgcmV1c2VkCisgICB3aXRoIGEgIlJfUFJFVl9GSVhVUCIgcmVsb2NhdGlvbiBlbnRyeS4gIFNpbmNlIFJfUFJFVl9GSVhVUAorICAgcmVsb2NhdGlvbnMgYXJlIGFsd2F5cyBhIHNpbmdsZSBieXRlLCB1c2luZyBhIFJfUFJFVl9GSVhVUCBpbnN0ZWFkCisgICBvZiBzb21lIG11bHRpLWJ5dGUgcmVsb2NhdGlvbiBtYWtlcyBvYmplY3QgZmlsZXMgc21hbGxlci4gCisKKyAgIE5vdGUgb25lIHNpZGUgZWZmZWN0IG9mIHVzaW5nIGEgUl9QUkVWX0ZJWFVQIGlzIHRoZSByZWxvY2F0aW9uIHRoYXQKKyAgIGlzIGJlaW5nIHJlcGVhdGVkIG1vdmVzIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICAqLworc3RydWN0IHJlbG9jX3F1ZXVlCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyICpyZWxvYzsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgfSByZWxvY19xdWV1ZVs0XTsKKworLyogVGhpcyBmdWxseSBkZXNjcmliZXMgdGhlIHN5bWJvbCB0eXBlcyB3aGljaCBtYXkgYmUgYXR0YWNoZWQgdG8KKyAgIGFuIEVYUE9SVCBvciBJTVBPUlQgZGlyZWN0aXZlLiAgT25seSBTT00gdXNlcyB0aGlzIGZvcm1hdGlvbgorICAgKEVMRiBoYXMgbm8gbmVlZCBmb3IgaXQpLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBTWU1CT0xfVFlQRV9VTktOT1dOLAorICBTWU1CT0xfVFlQRV9BQlNPTFVURSwKKyAgU1lNQk9MX1RZUEVfQ09ERSwKKyAgU1lNQk9MX1RZUEVfREFUQSwKKyAgU1lNQk9MX1RZUEVfRU5UUlksCisgIFNZTUJPTF9UWVBFX01JTExJQ09ERSwKKyAgU1lNQk9MX1RZUEVfUExBQkVMLAorICBTWU1CT0xfVFlQRV9QUklfUFJPRywKKyAgU1lNQk9MX1RZUEVfU0VDX1BST0csCit9IHBhX3N5bWJvbF90eXBlOworCitzdHJ1Y3Qgc2VjdGlvbl90b190eXBlCit7CisgIGNoYXIgKnNlY3Rpb247CisgIGNoYXIgdHlwZTsKK307CisKKy8qIEFzc29ydGVkIHN5bWJvbCBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGRlcml2ZWQgZnJvbSB0aGUgQkZEIHN5bWJvbAorICAgYW5kL29yIHRoZSBCRkQgYmFja2VuZCBwcml2YXRlIHN5bWJvbCBkYXRhLiAgKi8KK3N0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbworeworICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGU7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfc2NvcGU7CisgIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfaW5mbzsKKyAgdW5zaWduZWQgaW50IHN5bWJvbF92YWx1ZTsKKyAgdW5zaWduZWQgaW50IHByaXZfbGV2ZWw7Cit9OworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgYm9vbGVhbiBzb21fbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICogc29tX29iamVjdF9zZXR1cCBQQVJBTVMgKChiZmQgKiwKKwkJCQkJCSAgICBzdHJ1Y3QgaGVhZGVyICosCisJCQkJCQkgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqLAorCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBib29sZWFuIHNldHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaGVhZGVyICosIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICogc29tX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fc2x1cnBfc3RyaW5nX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHNvbV9zbHVycF9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBsb25nIHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgbG9uZyBzb21fY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAorCQkJCQkgICAgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOworc3RhdGljIGxvbmcgc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOworc3RhdGljIHVuc2lnbmVkIGludCBzb21fc2V0X3JlbG9jX2luZm8gUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkJCQlhcmVsZW50ICosIGFzZWN0aW9uICosCisJCQkJCQlhc3ltYm9sICoqLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fc2x1cnBfcmVsb2NfdGFibGUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCisJCQkJCSAgICAgIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKK3N0YXRpYyBsb25nIHNvbV9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7CitzdGF0aWMgYXN5bWJvbCAqIHNvbV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHZvaWQgc29tX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLAorCQkJCSAgICAgIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKKwkJCQkJCQkgIGJmZCAqLCBhc3ltYm9sICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKKwkJCQkJCQkgIGJmZCAqLCBhc2VjdGlvbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKyNkZWZpbmUgc29tX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQorI2RlZmluZSBzb21fYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKK3N0YXRpYyBib29sZWFuIHNvbV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fc2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKKwkJCQkJCSBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOworc3RhdGljIGJvb2xlYW4gc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCisJCQkJCQkgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIHNvbV9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCisJCQkJCSAgdW5zaWduZWQgbG9uZykpOworc3RhdGljIGJvb2xlYW4gc29tX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAorCQkJCQkgICAgICBhc3ltYm9sICoqLCBiZmRfdm1hLAorCQkJCQkgICAgICBDT05TVCBjaGFyICoqLAorCQkJCQkgICAgICBDT05TVCBjaGFyICoqLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKikpOworc3RhdGljIHZvaWQgc29tX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7CitzdGF0aWMgYXNlY3Rpb24gKiBiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgUEFSQU1TICgoYmZkICosIAorCQkJCQlzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICopKTsKK3N0YXRpYyBpbnQgbG9nMiBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgaHBwYV9zb21fcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKKwkJCQkJCSAgICAgYXN5bWJvbCAqLCBQVFIsCisJCQkJCQkgICAgIGFzZWN0aW9uICosIGJmZCAqLAorCQkJCQkJICAgICBjaGFyICoqKSk7CitzdGF0aWMgdm9pZCBzb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSBQQVJBTVMgKChzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOworc3RhdGljIHZvaWQgc29tX3JlbG9jX3F1ZXVlX2luc2VydCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwKKwkJCQkJICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7CitzdGF0aWMgdm9pZCBzb21fcmVsb2NfcXVldWVfZml4IFBBUkFNUyAoKHN0cnVjdCByZWxvY19xdWV1ZSAqLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBpbnQgc29tX3JlbG9jX3F1ZXVlX2ZpbmQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkJCSBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0cnlfcHJldl9maXh1cCBQQVJBTVMgKChiZmQgKiwgaW50ICosIHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCwKKwkJCQkJICAgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX3NraXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50ICosCisJCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBzb21fcmVsb2NfYWRkZW5kIFBBUkFNUyAoKGJmZCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkJICAgICAgICAgdW5zaWduZWQgaW50ICosCisJCQkJCQkgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX2NhbGwgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqLAorCQkJCQkgICAgICAgYXJlbGVudCAqLCBpbnQsCisJCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc29tX2NvdW50X3NwYWNlcyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc29tX2NvdW50X3N1YnNwYWNlcyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBjb21wYXJlX3N5bXMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3N0YXRpYyBpbnQgY29tcGFyZV9zdWJzcGFjZXMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb21wdXRlX2NoZWNrc3VtIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fcHJlcF9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgaW50IHNvbV9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gc29tX2ZpbmlzaF93cml0aW5nIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHZvaWQgc29tX3ByZXBfZm9yX2ZpeHVwcyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgdW5zaWduZWQgbG9uZykpOworc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX2ZpeHVwcyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50ICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV93cml0ZV9zcGFjZV9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBsb25nLAorCQkJCQkJdW5zaWduZWQgaW50ICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkJCSBhc3ltYm9sICoqLCB1bnNpZ25lZCBpbnQsCisJCQkJCQkgdW5zaWduZWQgKiwKKwkJCQkJCSBDT01QVU5JVCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fYmVnaW5fd3JpdGluZyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwCisJUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOworc3RhdGljIGNoYXIgc29tX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgc29tX2RlY29kZV9zeW1jbGFzcyBQQVJBTVMgKChhc3ltYm9sICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGxzdF9oZWFkZXIgKiwKKwkJCQkJCSBzeW1pbmRleCAqKSk7CisKK3N0YXRpYyBib29sZWFuIHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgbHN0X2hlYWRlciAqLAorCQkJCQkJICAgY2Fyc3ltICoqc3ltcykpOworc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLAorCQkJCQl1bnNpZ25lZCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAorCQkJCQkgICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgKiwKKwkJCQkJCSAgdW5zaWduZWQgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29tX2JmZF9hcl9zeW1ib2xfaGFzaCBQQVJBTVMgKChhc3ltYm9sICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQsCisJCQkJCQkgICAgICBzdHJ1Y3QgbHN0X2hlYWRlciwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCkpOworc3RhdGljIGJvb2xlYW4gc29tX2lzX3NwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV9pc19zdWJzcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7CitzdGF0aWMgYm9vbGVhbiBzb21faXNfY29udGFpbmVyIFBBUkFNUyAoKGFzZWN0aW9uICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyBib29sZWFuIHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gc29tX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKKwkKKy8qIE1hcCBTT00gc2VjdGlvbiBuYW1lcyB0byBQT1NJWC9CU0Qgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZXMuCisKKyAgIFRoaXMgdGFibGUgaW5jbHVkZXMgYWxsIHRoZSBzdGFuZGFyZCBzdWJzcGFjZXMgYXMgZGVmaW5lZCBpbiB0aGUgCisgICBjdXJyZW50ICJQUk8gQUJJIGZvciBQQS1SSVNDIFN5c3RlbXMiLCAkVU5XSU5EJCB3aGljaCBmb3IgCisgICBzb21lIHJlYXNvbiB3YXMgbGVmdCBvdXQsIGFuZCBzZWN0aW9ucyBzcGVjaWZpYyB0byBlbWJlZGRlZCBzdGFicy4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlIHN0dFtdID0geworICB7IiRURVhUJCIsICd0J30sCisgIHsiJFNITElCX0lORk8kIiwgJ3QnfSwKKyAgeyIkTUlMTElDT0RFJCIsICd0J30sCisgIHsiJExJVCQiLCAndCd9LAorICB7IiRDT0RFJCIsICd0J30sCisgIHsiJFVOV0lORF9TVEFSVCQiLCAndCd9LAorICB7IiRVTldJTkQkIiwgJ3QnfSwKKyAgeyIkUFJJVkFURSQiLCAnZCd9LAorICB7IiRQTFQkIiwgJ2QnfSwKKyAgeyIkU0hMSUJfREFUQSQiLCAnZCd9LAorICB7IiREQVRBJCIsICdkJ30sCisgIHsiJFNIT1JUREFUQSQiLCAnZyd9LAorICB7IiRETFQkIiwgJ2QnfSwKKyAgeyIkR0xPQkFMJCIsICdnJ30sCisgIHsiJFNIT1JUQlNTJCIsICdzJ30sCisgIHsiJEJTUyQiLCAnYid9LAorICB7IiRHREJfU1RSSU5HUyQiLCAnTid9LAorICB7IiRHREJfU1lNQk9MUyQiLCAnTid9LAorICB7MCwgMH0KK307CisKKy8qIEFib3V0IHRoZSByZWxvY2F0aW9uIGZvcm1hdHRpbmcgdGFibGUuLi4KKworICAgVGhlcmUgYXJlIDI1NiBlbnRyaWVzIGluIHRoZSB0YWJsZSwgb25lIGZvciBlYWNoIHBvc3NpYmxlCisgICByZWxvY2F0aW9uIG9wY29kZSBhdmFpbGFibGUgaW4gU09NLiAgV2UgaW5kZXggdGhlIHRhYmxlIGJ5CisgICB0aGUgcmVsb2NhdGlvbiBvcGNvZGUuICBUaGUgbmFtZXMgYW5kIG9wZXJhdGlvbnMgYXJlIHRob3NlCisgICBkZWZpbmVkIGJ5IGEub3V0XzgwMCAoNCkuCisKKyAgIFJpZ2h0IG5vdyB0aGlzIHRhYmxlIGlzIG9ubHkgdXNlZCB0byBjb3VudCBhbmQgcGVyZm9ybSBtaW5pbWFsCisgICBwcm9jZXNzaW5nIG9uIHJlbG9jYXRpb24gc3RyZWFtcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGludGVybmFsaXplZAorICAgaW50byBCRkQgYW5kIHN5bWJvbGljYWxseSBwcmludGVkIGJ5IHV0aWxpdGllcy4gIFRvIG1ha2UgYWN0dWFsIHVzZSAKKyAgIG9mIHRoZW0gd291bGQgYmUgbXVjaCBtb3JlIGRpZmZpY3VsdCwgQkZEJ3MgY29uY2VwdCBvZiByZWxvY2F0aW9ucworICAgaXMgZmFyIHRvbyBzaW1wbGUgdG8gaGFuZGxlIFNPTSByZWxvY2F0aW9ucy4gIFRoZSBiYXNpYyBhc3N1bXB0aW9uCisgICB0aGF0IGEgcmVsb2NhdGlvbiBjYW4gYmUgY29tcGxldGVseSBwcm9jZXNzZWQgaW5kZXBlbmRlbnQgb2Ygb3RoZXIKKyAgIHJlbG9jYXRpb25zIGJlZm9yZSBhbiBvYmplY3QgZmlsZSBpcyB3cml0dGVuIGlzIGludmFsaWQgZm9yIFNPTS4KKworICAgVGhlIFNPTSByZWxvY2F0aW9ucyBhcmUgbWVhbnQgdG8gYmUgcHJvY2Vzc2VkIGFzIGEgc3RyZWFtLCB0aGV5CisgICBzcGVjaWZ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbgorICAgd2hpbGUgcG9zc2libHkgbW9kaWZ5aW5nIHRoZSBkYXRhIGluIHNvbWUgbWFubmVyLiAgVGhleSBhbHNvIGNhbiAKKyAgIHNwZWNpZnkgdGhhdCBhIHZhcmlhYmxlIG51bWJlciBvZiB6ZXJvcyBvciB1bmluaXRpYWxpemVkIGRhdGEgYmUKKyAgIGluc2VydGVkIG9uIGluIHRoZSBvdXRwdXQgc2VnbWVudCBhdCB0aGUgY3VycmVudCBvZmZzZXQuICBTb21lCisgICByZWxvY2F0aW9ucyBzcGVjaWZ5IHRoYXQgc29tZSBwcmV2aW91cyByZWxvY2F0aW9uIGJlIHJlLWFwcGxpZWQgYXQKKyAgIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBpbnB1dC9vdXRwdXQgc2VjdGlvbnMuICBBbmQgZmluYWxseSBhIG51bWJlcgorICAgb2YgcmVsb2NhdGlvbnMgaGF2ZSBlZmZlY3RzIG9uIG90aGVyIHNlY3Rpb25zIChSX0VOVFJZLCBSX0VYSVQsCisgICBSX1VOV0lORF9BVVggYW5kIGEgdmFyaWV0eSBvZiBvdGhlcnMpLiAgVGhlcmUgaXNuJ3QgZXZlbiBlbm91Z2ggcm9vbQorICAgaW4gdGhlIEJGRCByZWxvY2F0aW9uIGRhdGEgc3RydWN0dXJlIHRvIHN0b3JlIGVub3VnaCBpbmZvcm1hdGlvbiB0bworICAgcGVyZm9ybSBhbGwgdGhlIHJlbG9jYXRpb25zLgorCisgICBFYWNoIGVudHJ5IGluIHRoZSB0YWJsZSBoYXMgdGhyZWUgZmllbGRzLiAKKworICAgVGhlIGZpcnN0IGVudHJ5IGlzIGFuIGluZGV4IGludG8gdGhpcyAiY2xhc3MiIG9mIHJlbG9jYXRpb25zLiAgVGhpcworICAgaW5kZXggY2FuIHRoZW4gYmUgdXNlZCBhcyBhIHZhcmlhYmxlIHdpdGhpbiB0aGUgcmVsb2NhdGlvbiBpdHNlbGYuCisKKyAgIFRoZSBzZWNvbmQgZmllbGQgaXMgYSBmb3JtYXQgc3RyaW5nIHdoaWNoIGFjdHVhbGx5IGNvbnRyb2xzIHByb2Nlc3NpbmcKKyAgIG9mIHRoZSByZWxvY2F0aW9uLiAgSXQgdXNlcyBhIHNpbXBsZSBwb3N0Zml4IG1hY2hpbmUgdG8gZG8gY2FsY3VsYXRpb25zCisgICBiYXNlZCBvbiB2YXJpYWJsZXMvY29uc3RhbnRzIGZvdW5kIGluIHRoZSBzdHJpbmcgYW5kIHRoZSByZWxvY2F0aW9uCisgICBzdHJlYW0uICAKKworICAgVGhlIHRoaXJkIGZpZWxkIHNwZWNpZnlzIHdoZXRoZXIgb3Igbm90IHRoaXMgcmVsb2NhdGlvbiBtYXkgdXNlIAorICAgYSBjb25zdGFudCAoVikgZnJvbSB0aGUgcHJldmlvdXMgUl9EQVRBX09WRVJSSURFIHJhdGhlciB0aGFuIGEgY29uc3RhbnQKKyAgIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCisKKyAgIFZhcmlhYmxlczogIAorICAKKyAgIEwgPSBpbnB1dCBzcGFjZSBieXRlIGNvdW50CisgICBEID0gaW5kZXggaW50byBjbGFzcyBvZiByZWxvY2F0aW9ucworICAgTSA9IG91dHB1dCBzcGFjZSBieXRlIGNvdW50CisgICBOID0gc3RhdGVtZW50IG51bWJlciAodW51c2VkPykKKyAgIE8gPSBzdGFjayBvcGVyYXRpb24KKyAgIFIgPSBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBiaXRzCisgICBTID0gc3ltYm9sIGluZGV4CisgICBUID0gZmlyc3QgMzIgYml0cyBvZiBzdGFjayB1bndpbmQgaW5mb3JtYXRpb24KKyAgIFUgPSBzZWNvbmQgMzIgYml0cyBvZiBzdGFjayB1bndpbmQgaW5mb3JtYXRpb24KKyAgIFYgPSBhIGxpdGVyYWwgY29uc3RhbnQgKHVzdWFsbHkgdXNlZCBpbiB0aGUgbmV4dCByZWxvY2F0aW9uKQorICAgUCA9IGEgcHJldmlvdXMgcmVsb2NhdGlvbgorICAKKyAgIExvd2VyIGNhc2UgbGV0dGVycyAoc3RhcnRpbmcgd2l0aCAnYicpIHJlZmVyIHRvIGZvbGxvd2luZyAKKyAgIGJ5dGVzIGluIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICdiJyBpcyB0aGUgbmV4dCAxIGJ5dGUsCisgICBjIGlzIHRoZSBuZXh0IDIgYnl0ZXMsIGQgaXMgdGhlIG5leHQgMyBieXRlcywgZXRjLi4uICAKKyAgIFRoaXMgaXMgdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIHJlbG9jYXRpb24gZW50cmllcyB0aGF0CisgICBtYWtlcyBvdXIgbGlmZSBhIGxpdmluZyBoZWxsLgorCisgICBudW1lcmljYWwgY29uc3RhbnRzIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBOb3RlCisgICB0aGUgY29uc3RhbnRzIGFyZSByZXByZXNlbnRlZCBpbiBkZWNpbWFsLiAKKworICAgJysnLCAiKiIgYW5kICI9IiByZXByZXNlbnRzIHRoZSBvYnZpb3VzIHBvc3RmaXggb3BlcmF0b3JzLgorICAgJzwnIHJlcHJlc2VudHMgYSBsZWZ0IHNoaWZ0LiAKKworICAgU3RhY2sgT3BlcmF0aW9uczoKKworICAgUGFyYW1ldGVyIFJlbG9jYXRpb24gQml0czoKKworICAgVW53aW5kIEVudHJpZXM6ICAKKyAgIAorICAgUHJldmlvdXMgUmVsb2NhdGlvbnM6ICBUaGUgaW5kZXggZmllbGQgcmVwcmVzZW50cyB3aGljaCBpbiB0aGUgcXVldWUKKyAgIG9mIDQgcHJldmlvdXMgZml4dXBzIHNob3VsZCBiZSByZS1hcHBsaWVkLgorCisgICBMaXRlcmFsIENvbnN0YW50czogIFRoZXNlIGFyZSBnZW5lcmFsbHkgdXNlZCB0byByZXByZXNlbnQgYWRkZW5kCisgICBwYXJ0cyBvZiByZWxvY2F0aW9ucyB3aGVuIHRoZXNlIGNvbnN0YW50cyBhcmUgbm90IHN0b3JlZCBpbiB0aGUKKyAgIGZpZWxkcyBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuICBGb3IgZXhhbXBsZSB0aGUgaW5zdHJ1Y3Rpb24KKyAgIGFkZGlsIGZvby0kZ2xvYmFsJC0weDEyMzQgd291bGQgdXNlIGFuIG92ZXJyaWRlIGZvciAiMHgxMjM0IiByYXRoZXIKKyAgIHRoYW4gc3RvcmluZyBpdCBpbnRvIHRoZSBhZGRpbCBpdHNlbGYuICAqLworCitzdHJ1Y3QgZml4dXBfZm9ybWF0Cit7CisgIGludCBEOworICBjaGFyICpmb3JtYXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpeHVwX2Zvcm1hdCBzb21fZml4dXBfZm9ybWF0c1syNTZdID0KK3sKKyAgLyogUl9OT19SRUxPQ0FUSU9OICovCisgIDAsICAgIkxEMSs0Kj0iLCAgICAgICAvKiAweDAwICovCisgIDEsICAgIkxEMSs0Kj0iLAkvKiAweDAxICovCisgIDIsICAgIkxEMSs0Kj0iLAkvKiAweDAyICovCisgIDMsICAgIkxEMSs0Kj0iLAkvKiAweDAzICovCisgIDQsICAgIkxEMSs0Kj0iLAkvKiAweDA0ICovCisgIDUsICAgIkxEMSs0Kj0iLAkvKiAweDA1ICovCisgIDYsICAgIkxEMSs0Kj0iLAkvKiAweDA2ICovCisgIDcsICAgIkxEMSs0Kj0iLAkvKiAweDA3ICovCisgIDgsICAgIkxEMSs0Kj0iLAkvKiAweDA4ICovCisgIDksICAgIkxEMSs0Kj0iLAkvKiAweDA5ICovCisgIDEwLCAgIkxEMSs0Kj0iLAkvKiAweDBhICovCisgIDExLCAgIkxEMSs0Kj0iLAkvKiAweDBiICovCisgIDEyLCAgIkxEMSs0Kj0iLAkvKiAweDBjICovCisgIDEzLCAgIkxEMSs0Kj0iLAkvKiAweDBkICovCisgIDE0LCAgIkxEMSs0Kj0iLAkvKiAweDBlICovCisgIDE1LCAgIkxEMSs0Kj0iLAkvKiAweDBmICovCisgIDE2LCAgIkxEMSs0Kj0iLAkvKiAweDEwICovCisgIDE3LCAgIkxEMSs0Kj0iLAkvKiAweDExICovCisgIDE4LCAgIkxEMSs0Kj0iLAkvKiAweDEyICovCisgIDE5LCAgIkxEMSs0Kj0iLAkvKiAweDEzICovCisgIDIwLCAgIkxEMSs0Kj0iLAkvKiAweDE0ICovCisgIDIxLCAgIkxEMSs0Kj0iLAkvKiAweDE1ICovCisgIDIyLCAgIkxEMSs0Kj0iLAkvKiAweDE2ICovCisgIDIzLCAgIkxEMSs0Kj0iLAkvKiAweDE3ICovCisgIDAsICAgIkxEODxiKzErNCo9IiwJLyogMHgxOCAqLworICAxLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MTkgKi8KKyAgMiwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDFhICovCisgIDMsICAgIkxEODxiKzErNCo9IiwJLyogMHgxYiAqLworICAwLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFjICovCisgIDEsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWQgKi8KKyAgMiwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxZSAqLworICAwLCAgICJMZDErPSIsICAgICAgICAgLyogMHgxZiAqLworICAvKiBSX1pFUk9FUyAqLworICAwLCAgICAiTGIxKzQqPSIsCS8qIDB4MjAgKi8KKyAgMSwgICAgIkxkMSs9IiwJLyogMHgyMSAqLworICAvKiBSX1VOSU5JVCAqLworICAwLCAgICAiTGIxKzQqPSIsCS8qIDB4MjIgKi8KKyAgMSwgICAgIkxkMSs9IiwJLyogMHgyMyAqLworICAvKiBSX1JFTE9DQVRJT04gKi8KKyAgMCwgICAgIkw0PSIsICAgICAgICAgIC8qIDB4MjQgKi8KKyAgLyogUl9EQVRBX09ORV9TWU1CT0wgKi8KKyAgMCwgICAgIkw0PVNiPSIsCS8qIDB4MjUgKi8KKyAgMSwgICAgIkw0PVNkPSIsCS8qIDB4MjYgKi8KKyAgLyogUl9EQVRBX1BMRUJFTCAqLworICAwLCAgICAiTDQ9U2I9IiwJLyogMHgyNyAqLworICAxLCAgICAiTDQ9U2Q9IiwJLyogMHgyOCAqLworICAvKiBSX1NQQUNFX1JFRiAqLworICAwLCAgICAiTDQ9IiwgICAgICAgICAgLyogMHgyOSAqLworICAvKiBSX1JFUEVBVEVEX0lOSVQgKi8KKyAgMCwgICAgIkw0PU1iMSs0Kj0iLAkvKiAweDJhICovCisgIDEsICAgICJMYjQqPU1iMStMKj0iLAkvKiAweDJiICovCisgIDIsICAgICJMYjQqPU1kMSs0Kj0iLAkvKiAweDJjICovCisgIDMsICAgICJMZDErPU1lMSs9IiwJLyogMHgyZCAqLworICAvKiBSX1NIT1JUX1BDUkVMX01PREUgKi8KKyAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZSAqLworICAvKiBSX0xPTkdfUENSRUxfTU9ERSAqLworICAwLCAgIAkiIiwJICAgICAgICAvKiAweDJmICovCisgIC8qIFJfUENSRUxfQ0FMTCAqLworICAwLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMCAqLworICAxLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMSAqLworICAyLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMiAqLworICAzLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMyAqLworICA0LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNCAqLworICA1LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNSAqLworICA2LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNiAqLworICA3LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNyAqLworICA4LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOCAqLworICA5LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOSAqLworICAwLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYSAqLworICAxLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYiAqLworICAwLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzYyAqLworICAxLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzZCAqLworICAvKiBSX1JFU0VSVkVEICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4M2UgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZiAqLworICAvKiBSX0FCU19DQUxMICovCisgIDAsICAgICJMND1SRD1TYj0iLAkvKiAweDQwICovCisgIDEsICAgICJMND1SRD1TYj0iLAkvKiAweDQxICovCisgIDIsICAgICJMND1SRD1TYj0iLAkvKiAweDQyICovCisgIDMsICAgICJMND1SRD1TYj0iLAkvKiAweDQzICovCisgIDQsICAgICJMND1SRD1TYj0iLAkvKiAweDQ0ICovCisgIDUsICAgICJMND1SRD1TYj0iLAkvKiAweDQ1ICovCisgIDYsICAgICJMND1SRD1TYj0iLAkvKiAweDQ2ICovCisgIDcsICAgICJMND1SRD1TYj0iLAkvKiAweDQ3ICovCisgIDgsICAgICJMND1SRD1TYj0iLAkvKiAweDQ4ICovCisgIDksICAgICJMND1SRD1TYj0iLAkvKiAweDQ5ICovCisgIDAsICAgICJMND1SRDg8Yis9U2I9IiwvKiAweDRhICovCisgIDEsICAgICJMND1SRDg8Yis9U2I9IiwvKiAweDRiICovCisgIDAsICAgICJMND1SRDg8Yis9U2Q9IiwvKiAweDRjICovCisgIDEsICAgICJMND1SRDg8Yis9U2Q9IiwvKiAweDRkICovCisgIC8qIFJfUkVTRVJWRUQgKi8KKyAgMCwgICAgICIiLAkgICAgICAgIC8qIDB4NGUgKi8KKyAgMCwgICAgICIiLAkgICAgICAgIC8qIDB4NGYgKi8KKyAgLyogUl9EUF9SRUxBVElWRSAqLworICAwLCAgICAiTDQ9U0Q9IiwJLyogMHg1MCAqLworICAxLCAgICAiTDQ9U0Q9IiwJLyogMHg1MSAqLworICAyLCAgICAiTDQ9U0Q9IiwJLyogMHg1MiAqLworICAzLCAgICAiTDQ9U0Q9IiwJLyogMHg1MyAqLworICA0LCAgICAiTDQ9U0Q9IiwJLyogMHg1NCAqLworICA1LCAgICAiTDQ9U0Q9IiwJLyogMHg1NSAqLworICA2LCAgICAiTDQ9U0Q9IiwJLyogMHg1NiAqLworICA3LCAgICAiTDQ9U0Q9IiwJLyogMHg1NyAqLworICA4LCAgICAiTDQ9U0Q9IiwJLyogMHg1OCAqLworICA5LCAgICAiTDQ9U0Q9IiwJLyogMHg1OSAqLworICAxMCwgICAiTDQ9U0Q9IiwJLyogMHg1YSAqLworICAxMSwgICAiTDQ9U0Q9IiwJLyogMHg1YiAqLworICAxMiwgICAiTDQ9U0Q9IiwJLyogMHg1YyAqLworICAxMywgICAiTDQ9U0Q9IiwJLyogMHg1ZCAqLworICAxNCwgICAiTDQ9U0Q9IiwJLyogMHg1ZSAqLworICAxNSwgICAiTDQ9U0Q9IiwJLyogMHg1ZiAqLworICAxNiwgICAiTDQ9U0Q9IiwJLyogMHg2MCAqLworICAxNywgICAiTDQ9U0Q9IiwJLyogMHg2MSAqLworICAxOCwgICAiTDQ9U0Q9IiwJLyogMHg2MiAqLworICAxOSwgICAiTDQ9U0Q9IiwJLyogMHg2MyAqLworICAyMCwgICAiTDQ9U0Q9IiwJLyogMHg2NCAqLworICAyMSwgICAiTDQ9U0Q9IiwJLyogMHg2NSAqLworICAyMiwgICAiTDQ9U0Q9IiwJLyogMHg2NiAqLworICAyMywgICAiTDQ9U0Q9IiwJLyogMHg2NyAqLworICAyNCwgICAiTDQ9U0Q9IiwJLyogMHg2OCAqLworICAyNSwgICAiTDQ9U0Q9IiwJLyogMHg2OSAqLworICAyNiwgICAiTDQ9U0Q9IiwJLyogMHg2YSAqLworICAyNywgICAiTDQ9U0Q9IiwJLyogMHg2YiAqLworICAyOCwgICAiTDQ9U0Q9IiwJLyogMHg2YyAqLworICAyOSwgICAiTDQ9U0Q9IiwJLyogMHg2ZCAqLworICAzMCwgICAiTDQ9U0Q9IiwJLyogMHg2ZSAqLworICAzMSwgICAiTDQ9U0Q9IiwJLyogMHg2ZiAqLworICAzMiwgICAiTDQ9U2I9IiwJLyogMHg3MCAqLworICAzMywgICAiTDQ9U2Q9IiwJLyogMHg3MSAqLworICAvKiBSX1JFU0VSVkVEICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzIgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MyAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweDc0ICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzUgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NiAqLworICAwLCAgICAiIiwgICAgICAJLyogMHg3NyAqLworICAvKiBSX0RMVF9SRUwgKi8KKyAgMCwgICAgIkw0PVNiPSIsCS8qIDB4NzggKi8KKyAgMSwgICAgIkw0PVNkPSIsCS8qIDB4NzkgKi8KKyAgLyogUl9SRVNFUlZFRCAqLworICAwLCAgICAiIiwgICAgICAgIAkvKiAweDdhICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2IgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YyAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweDdkICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2UgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZiAqLworICAvKiBSX0NPREVfT05FX1NZTUJPTCAqLworICAwLCAgICAiTDQ9U0Q9IiwJLyogMHg4MCAqLworICAxLCAgICAiTDQ9U0Q9IiwJLyogMHg4MSAqLworICAyLCAgICAiTDQ9U0Q9IiwJLyogMHg4MiAqLworICAzLCAgICAiTDQ9U0Q9IiwJLyogMHg4MyAqLworICA0LCAgICAiTDQ9U0Q9IiwJLyogMHg4NCAqLworICA1LCAgICAiTDQ9U0Q9IiwJLyogMHg4NSAqLworICA2LCAgICAiTDQ9U0Q9IiwJLyogMHg4NiAqLworICA3LCAgICAiTDQ9U0Q9IiwJLyogMHg4NyAqLworICA4LCAgICAiTDQ9U0Q9IiwJLyogMHg4OCAqLworICA5LCAgICAiTDQ9U0Q9IiwJLyogMHg4OSAqLworICAxMCwgICAiTDQ9U0Q9IiwJLyogMHg4cSAqLworICAxMSwgICAiTDQ9U0Q9IiwJLyogMHg4YiAqLworICAxMiwgICAiTDQ9U0Q9IiwJLyogMHg4YyAqLworICAxMywgICAiTDQ9U0Q9IiwJLyogMHg4ZCAqLworICAxNCwgICAiTDQ9U0Q9IiwJLyogMHg4ZSAqLworICAxNSwgICAiTDQ9U0Q9IiwJLyogMHg4ZiAqLworICAxNiwgICAiTDQ9U0Q9IiwJLyogMHg5MCAqLworICAxNywgICAiTDQ9U0Q9IiwJLyogMHg5MSAqLworICAxOCwgICAiTDQ9U0Q9IiwJLyogMHg5MiAqLworICAxOSwgICAiTDQ9U0Q9IiwJLyogMHg5MyAqLworICAyMCwgICAiTDQ9U0Q9IiwJLyogMHg5NCAqLworICAyMSwgICAiTDQ9U0Q9IiwJLyogMHg5NSAqLworICAyMiwgICAiTDQ9U0Q9IiwJLyogMHg5NiAqLworICAyMywgICAiTDQ9U0Q9IiwJLyogMHg5NyAqLworICAyNCwgICAiTDQ9U0Q9IiwJLyogMHg5OCAqLworICAyNSwgICAiTDQ9U0Q9IiwJLyogMHg5OSAqLworICAyNiwgICAiTDQ9U0Q9IiwJLyogMHg5YSAqLworICAyNywgICAiTDQ9U0Q9IiwJLyogMHg5YiAqLworICAyOCwgICAiTDQ9U0Q9IiwJLyogMHg5YyAqLworICAyOSwgICAiTDQ9U0Q9IiwJLyogMHg5ZCAqLworICAzMCwgICAiTDQ9U0Q9IiwJLyogMHg5ZSAqLworICAzMSwgICAiTDQ9U0Q9IiwJLyogMHg5ZiAqLworICAzMiwgICAiTDQ9U2I9IiwJLyogMHhhMCAqLworICAzMywgICAiTDQ9U2Q9IiwJLyogMHhhMSAqLworICAvKiBSX1JFU0VSVkVEICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTIgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMyAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweGE0ICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTUgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNiAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweGE3ICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTggKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOSAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweGFhICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWIgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYyAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweGFkICovCisgIC8qIFJfTUlMTElfUkVMICovCisgIDAsICAgICJMND1TYj0iLAkvKiAweGFlICovCisgIDEsICAgICJMND1TZD0iLAkvKiAweGFmICovCisgIC8qIFJfQ09ERV9QTEFCRUwgKi8KKyAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YjAgKi8KKyAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YjEgKi8KKyAgLyogUl9CUkVBS1BPSU5UICovCisgIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YjIgKi8KKyAgLyogUl9FTlRSWSAqLworICAwLCAgICAiVGU9VWU9IiwgICAgICAgLyogMHhiMyAqLworICAxLCAgICAiVWY9IiwJICAgICAgICAvKiAweGI0ICovCisgIC8qIFJfQUxUX0VOVFJZICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjUgKi8KKyAgLyogUl9FWElUICovCisgIDAsICAgICIiLAkJLyogMHhiNiAqLworICAvKiBSX0JFR0lOX1RSWSAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweGI3ICovCisgIC8qIFJfRU5EX1RSWSAqLworICAwLCAgICAiUjA9IiwJICAgICAgICAvKiAweGI4ICovCisgIDEsICAgICJSYjQqPSIsCS8qIDB4YjkgKi8KKyAgMiwgICAgIlJkNCo9IiwJLyogMHhiYSAqLworICAvKiBSX0JFR0lOX0JSVEFCICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4YmIgKi8KKyAgLyogUl9FTkRfQlJUQUIgKi8KKyAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYyAqLworICAvKiBSX1NUQVRFTUVOVCAqLworICAwLCAgICAiTmI9IiwJICAgICAgICAvKiAweGJkICovCisgIDEsICAgICJOYz0iLAkgICAgICAgIC8qIDB4YmUgKi8KKyAgMiwgICAgIk5kPSIsCSAgICAgICAgLyogMHhiZiAqLworICAvKiBSX0RBVEFfRVhQUiAqLworICAwLCAgICAiTDQ9IiwJICAgICAgICAvKiAweGMwICovCisgIC8qIFJfQ09ERV9FWFBSICovCisgIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzEgKi8KKyAgLyogUl9GU0VMICovCisgIDAsICAgICIiLAkJLyogMHhjMiAqLworICAvKiBSX0xTRUwgKi8KKyAgMCwgICAgIiIsCQkvKiAweGMzICovCisgIC8qIFJfUlNFTCAqLworICAwLCAgICAiIiwJCS8qIDB4YzQgKi8KKyAgLyogUl9OX01PREUgKi8KKyAgMCwgICAgIiIsCQkvKiAweGM1ICovCisgIC8qIFJfU19NT0RFICovCisgIDAsICAgICIiLAkJLyogMHhjNiAqLworICAvKiBSX0RfTU9ERSAqLworICAwLCAgICAiIiwJCS8qIDB4YzcgKi8KKyAgLyogUl9SX01PREUgKi8KKyAgMCwgICAgIiIsCQkvKiAweGM4ICovCisgIC8qIFJfREFUQV9PVkVSUklERSAqLworICAwLCAgICAiVjA9IiwJICAgICAgICAvKiAweGM5ICovCisgIDEsICAgICJWYj0iLAkgICAgICAgIC8qIDB4Y2EgKi8KKyAgMiwgICAgIlZjPSIsCSAgICAgICAgLyogMHhjYiAqLworICAzLCAgICAiVmQ9IiwJICAgICAgICAvKiAweGNjICovCisgIDQsICAgICJWZT0iLAkgICAgICAgIC8qIDB4Y2QgKi8KKyAgLyogUl9UUkFOU0xBVEVEICovCisgIDAsICAgICIiLAkgICAgICAgIC8qIDB4Y2UgKi8KKyAgLyogUl9SRVNFUlZFRCAqLworICAwLCAgICAiIiwJICAgICAgICAvKiAweGNmICovCisgIC8qIFJfQ09NUDEgKi8KKyAgMCwgICAgIk9iPSIsCSAgICAgICAgLyogMHhkMCAqLworICAvKiBSX0NPTVAyICovCisgIDAsICAgICJPYj1TZD0iLAkvKiAweGQxICovCisgIC8qIFJfQ09NUDMgKi8KKyAgMCwgICAgIk9iPVZlPSIsCS8qIDB4ZDIgKi8KKyAgLyogUl9QUkVWX0ZJWFVQICovCisgIDAsICAgICJQIiwgICAJICAgICAgICAvKiAweGQzICovCisgIDEsICAgICJQIiwJICAgICAgICAvKiAweGQ0ICovCisgIDIsICAgICJQIiwJICAgICAgICAvKiAweGQ1ICovCisgIDMsICAgICJQIiwJICAgICAgICAvKiAweGQ2ICovCisgIC8qIFJfU0VDX1NUTVQgKi8KKyAgMCwJIiIsCQkvKiAweGQ3ICovCisgIC8qIFJfTjBTRUwgKi8KKyAgMCwJIiIsCQkvKiAweGQ4ICovCisgIC8qIFJfTjFTRUwgKi8KKyAgMCwJIiIsCQkvKiAweGQ5ICovCisgIC8qIFJfTElORVRBQiAqLworICAwLAkiIiwJCS8qIDB4ZGEgKi8KKyAgLyogUl9MSU5FVEFCX0VTQyAqLworICAwLAkiIiwJCS8qIDB4ZGIgKi8KKyAgLyogUl9MVFBfT1ZFUlJJREUgKi8KKyAgMCwJIiIsCQkvKiAweGRjICovCisgIC8qIFJfQ09NTUVOVCAqLworICAwLAkiIiwJCS8qIDB4ZGQgKi8KKyAgLyogUl9SRVNFUlZFRCAqLworICAwLAkiIiwJCS8qIDB4ZGUgKi8KKyAgMCwJIiIsCQkvKiAweGRmICovCisgIDAsCSIiLAkJLyogMHhlMCAqLworICAwLAkiIiwJCS8qIDB4ZTEgKi8KKyAgMCwJIiIsCQkvKiAweGUyICovCisgIDAsCSIiLAkJLyogMHhlMyAqLworICAwLAkiIiwJCS8qIDB4ZTQgKi8KKyAgMCwJIiIsCQkvKiAweGU1ICovCisgIDAsCSIiLAkJLyogMHhlNiAqLworICAwLAkiIiwJCS8qIDB4ZTcgKi8KKyAgMCwJIiIsCQkvKiAweGU4ICovCisgIDAsCSIiLAkJLyogMHhlOSAqLworICAwLAkiIiwJCS8qIDB4ZWEgKi8KKyAgMCwJIiIsCQkvKiAweGViICovCisgIDAsCSIiLAkJLyogMHhlYyAqLworICAwLAkiIiwJCS8qIDB4ZWQgKi8KKyAgMCwJIiIsCQkvKiAweGVlICovCisgIDAsCSIiLAkJLyogMHhlZiAqLworICAwLAkiIiwJCS8qIDB4ZjAgKi8KKyAgMCwJIiIsCQkvKiAweGYxICovCisgIDAsCSIiLAkJLyogMHhmMiAqLworICAwLAkiIiwJCS8qIDB4ZjMgKi8KKyAgMCwJIiIsCQkvKiAweGY0ICovCisgIDAsCSIiLAkJLyogMHhmNSAqLworICAwLAkiIiwJCS8qIDB4ZjYgKi8KKyAgMCwJIiIsCQkvKiAweGY3ICovCisgIDAsCSIiLAkJLyogMHhmOCAqLworICAwLAkiIiwJCS8qIDB4ZjkgKi8KKyAgMCwJIiIsCQkvKiAweGZhICovCisgIDAsCSIiLAkJLyogMHhmYiAqLworICAwLAkiIiwJCS8qIDB4ZmMgKi8KKyAgMCwJIiIsCQkvKiAweGZkICovCisgIDAsCSIiLAkJLyogMHhmZSAqLworICAwLAkiIiwJCS8qIDB4ZmYgKi8KK307CisKK3N0YXRpYyBjb25zdCBpbnQgY29tcDFfb3Bjb2Rlc1tdID0KK3sKKyAgMHgwMCwKKyAgMHg0MCwKKyAgMHg0MSwKKyAgMHg0MiwKKyAgMHg0MywKKyAgMHg0NCwKKyAgMHg0NSwKKyAgMHg0NiwKKyAgMHg0NywKKyAgMHg0OCwKKyAgMHg0OSwKKyAgMHg0YSwKKyAgMHg0YiwKKyAgMHg2MCwKKyAgMHg4MCwKKyAgMHhhMCwKKyAgMHhjMCwKKyAgLTEKK307CisKK3N0YXRpYyBjb25zdCBpbnQgY29tcDJfb3Bjb2Rlc1tdID0KK3sKKyAgMHgwMCwKKyAgMHg4MCwKKyAgMHg4MiwKKyAgMHhjMCwKKyAgLTEKK307CisKK3N0YXRpYyBjb25zdCBpbnQgY29tcDNfb3Bjb2Rlc1tdID0KK3sKKyAgMHgwMCwKKyAgMHgwMiwKKyAgLTEKK307CisKKy8qIFRoZXNlIGFwcGFyZW50bHkgYXJlIG5vdCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBocHV4IHJlbG9jLmggKGhwdXg3KS4gICovCisjaWZuZGVmIFJfRExUX1JFTAorI2RlZmluZSBSX0RMVF9SRUwgMHg3OAorI2VuZGlmCisKKyNpZm5kZWYgUl9BVVhfVU5XSU5ECisjZGVmaW5lIFJfQVVYX1VOV0lORCAweGNmCisjZW5kaWYKKworI2lmbmRlZiBSX1NFQ19TVE1UCisjZGVmaW5lIFJfU0VDX1NUTVQgMHhkNworI2VuZGlmCisKKy8qIEFuZCB0aGVzZSBmaXJzdCBhcHBlYXJlZCBpbiBocHV4MTAuICAqLworI2lmbmRlZiBSX1NIT1JUX1BDUkVMX01PREUKKyNkZWZpbmUgUl9TSE9SVF9QQ1JFTF9NT0RFIDB4M2UKKyNlbmRpZgorCisjaWZuZGVmIFJfTE9OR19QQ1JFTF9NT0RFCisjZGVmaW5lIFJfTE9OR19QQ1JFTF9NT0RFIDB4M2YKKyNlbmRpZgorCisjaWZuZGVmIFJfTjBTRUwKKyNkZWZpbmUgUl9OMFNFTCAweGQ4CisjZW5kaWYKKworI2lmbmRlZiBSX04xU0VMCisjZGVmaW5lIFJfTjFTRUwgMHhkOQorI2VuZGlmCisKKyNpZm5kZWYgUl9MSU5FVEFCCisjZGVmaW5lIFJfTElORVRBQiAweGRhCisjZW5kaWYKKworI2lmbmRlZiBSX0xJTkVUQUJfRVNDCisjZGVmaW5lIFJfTElORVRBQl9FU0MgMHhkYgorI2VuZGlmCisKKyNpZm5kZWYgUl9MVFBfT1ZFUlJJREUKKyNkZWZpbmUgUl9MVFBfT1ZFUlJJREUgMHhkYworI2VuZGlmCisKKyNpZm5kZWYgUl9DT01NRU5UCisjZGVmaW5lIFJfQ09NTUVOVCAweGRkCisjZW5kaWYKKworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc29tX2hwcGFfaG93dG9fdGFibGVbXSA9Cit7CisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCisgIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKKyAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAorICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAorICB7Ul9aRVJPRVMsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1pFUk9FUyJ9LAorICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAorICB7Ul9VTklOSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1VOSU5JVCJ9LAorICB7Ul9SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRUxPQ0FUSU9OIn0sCisgIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCisgIHtSX0RBVEFfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PTkVfU1lNQk9MIn0sCisgIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAorICB7Ul9EQVRBX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9QTEFCRUwifSwKKyAge1JfU1BBQ0VfUkVGLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TUEFDRV9SRUYifSwKKyAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKKyAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKKyAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKKyAge1JfUkVQRUFURURfSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJFUEVBVEVEX0lOSVQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCisgIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKKyAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAorICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCisgIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKKyAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAorICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCisgIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKKyAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAorICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCisgIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKKyAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAorICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCisgIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKKyAge1JfU0hPUlRfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0hPUlRfUENSRUxfTU9ERSJ9LAorICB7Ul9MT05HX1BDUkVMX01PREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xPTkdfUENSRUxfTU9ERSJ9LAorICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKKyAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCisgIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAorICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKKyAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCisgIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAorICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKKyAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCisgIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAorICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKKyAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCisgIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAorICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKKyAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKKyAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCisgIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX0RMVF9SRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RMVF9SRUwifSwKKyAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9DT0RFX09ORV9TWU1CT0wsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfT05FX1NZTUJPTCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCisgIHtSX01JTExJX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTUlMTElfUkVMIn0sCisgIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAorICB7Ul9DT0RFX1BMQUJFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9QTEFCRUwifSwKKyAge1JfQlJFQUtQT0lOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQlJFQUtQT0lOVCJ9LAorICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKKyAge1JfRU5UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VOVFJZIn0sCisgIHtSX0FMVF9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUxUX0VOVFJZIn0sCisgIHtSX0VYSVQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VYSVQifSwKKyAge1JfQkVHSU5fVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CRUdJTl9UUlkifSwKKyAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAorICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCisgIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKKyAge1JfQkVHSU5fQlJUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX0JSVEFCIn0sCisgIHtSX0VORF9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX0JSVEFCIn0sCisgIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCisgIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCisgIHtSX1NUQVRFTUVOVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU1RBVEVNRU5UIn0sCisgIHtSX0RBVEFfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9FWFBSIn0sCisgIHtSX0NPREVfRVhQUiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9FWFBSIn0sCisgIHtSX0ZTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0ZTRUwifSwKKyAge1JfTFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFNFTCJ9LAorICB7Ul9SU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SU0VMIn0sCisgIHtSX05fTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTl9NT0RFIn0sCisgIHtSX1NfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU19NT0RFIn0sCisgIHtSX0RfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRF9NT0RFIn0sCisgIHtSX1JfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUl9NT0RFIn0sCisgIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKKyAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAorICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCisgIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKKyAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAorICB7Ul9UUkFOU0xBVEVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9UUkFOU0xBVEVEIn0sCisgIHtSX0FVWF9VTldJTkQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FVWF9VTldJTkQifSwKKyAge1JfQ09NUDEsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAxIn0sCisgIHtSX0NPTVAyLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMiJ9LAorICB7Ul9DT01QMywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDMifSwKKyAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAorICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCisgIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKKyAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAorICB7Ul9TRUNfU1RNVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfU0VDX1NUTVQifSwKKyAge1JfTjBTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04wU0VMIn0sCisgIHtSX04xU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OMVNFTCJ9LAorICB7Ul9MSU5FVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCIn0sCisgIHtSX0xJTkVUQUJfRVNDLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MSU5FVEFCX0VTQyJ9LAorICB7Ul9MVFBfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xUUF9PVkVSUklERSJ9LAorICB7Ul9DT01NRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01NRU5UIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAorICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKKyAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCisgIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9fTsKKyAgCisvKiBJbml0aWFsaXplIHRoZSBTT00gcmVsb2NhdGlvbiBxdWV1ZS4gIEJ5IGRlZmluaXRpb24gdGhlIHF1ZXVlIGhvbGRzCisgICB0aGUgbGFzdCBmb3VyIG11bHRpYnl0ZSBmaXh1cHMuICAqLworICAKK3N0YXRpYyB2b2lkCitzb21faW5pdGlhbGl6ZV9yZWxvY19xdWV1ZSAocXVldWUpCisgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Cit7CisgIHF1ZXVlWzBdLnJlbG9jID0gTlVMTDsKKyAgcXVldWVbMF0uc2l6ZSA9IDA7CisgIHF1ZXVlWzFdLnJlbG9jID0gTlVMTDsKKyAgcXVldWVbMV0uc2l6ZSA9IDA7CisgIHF1ZXVlWzJdLnJlbG9jID0gTlVMTDsKKyAgcXVldWVbMl0uc2l6ZSA9IDA7CisgIHF1ZXVlWzNdLnJlbG9jID0gTlVMTDsKKyAgcXVldWVbM10uc2l6ZSA9IDA7Cit9CisKKy8qIEluc2VydCBhIG5ldyByZWxvY2F0aW9uIGludG8gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLworCitzdGF0aWMgdm9pZAorc29tX3JlbG9jX3F1ZXVlX2luc2VydCAocCwgc2l6ZSwgcXVldWUpCisgICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOworeworICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOworICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKKyAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKKyAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7CisgIHF1ZXVlWzFdLnJlbG9jID0gcXVldWVbMF0ucmVsb2M7CisgIHF1ZXVlWzFdLnNpemUgPSBxdWV1ZVswXS5zaXplOworICBxdWV1ZVswXS5yZWxvYyA9IHA7CisgIHF1ZXVlWzBdLnNpemUgPSBzaXplOworfQorCisvKiBXaGVuIGFuIGVudHJ5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlIGlzIHJldXNlZCwgdGhlIGVudHJ5IG1vdmVzCisgICB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KKworc3RhdGljIHZvaWQKK3NvbV9yZWxvY19xdWV1ZV9maXggKHF1ZXVlLCBpbmRleCkKKyAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKKyAgICAgdW5zaWduZWQgaW50IGluZGV4OworeworICBpZiAoaW5kZXggPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGluZGV4ID09IDEpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOworICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOworICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKKyAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsxXS5zaXplOworICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOworICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChpbmRleCA9PSAyKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKKyAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKKyAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7CisgICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKKyAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7CisgICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKKyAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKKyAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoaW5kZXggPT0gMykKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7CisgICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7CisgICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzNdLnJlbG9jOworICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzNdLnNpemU7CisgICAgICBxdWV1ZVszXS5yZWxvYyA9IHF1ZXVlWzJdLnJlbG9jOworICAgICAgcXVldWVbM10uc2l6ZSA9IHF1ZXVlWzJdLnNpemU7CisgICAgICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOworICAgICAgcXVldWVbMl0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7CisgICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7CisgICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGFib3J0KCk7Cit9CisKKy8qIFNlYXJjaCBmb3IgYSBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLworCitzdGF0aWMgaW50Citzb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpCisgICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOworeworICBpZiAocXVldWVbMF0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMF0ucmVsb2MsIHNpemUpCisgICAgICAmJiBzaXplID09IHF1ZXVlWzBdLnNpemUpCisgICAgcmV0dXJuIDA7CisgIGlmIChxdWV1ZVsxXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVsxXS5yZWxvYywgc2l6ZSkKKyAgICAgICYmIHNpemUgPT0gcXVldWVbMV0uc2l6ZSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHF1ZXVlWzJdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzJdLnJlbG9jLCBzaXplKQorICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsyXS5zaXplKQorICAgIHJldHVybiAyOworICBpZiAocXVldWVbM10ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbM10ucmVsb2MsIHNpemUpCisgICAgICAmJiBzaXplID09IHF1ZXVlWzNdLnNpemUpCisgICAgcmV0dXJuIDM7CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCBzaXplLCBxdWV1ZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOworICAgICB1bnNpZ25lZCBjaGFyICpwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKK3sKKyAgaW50IHF1ZXVlX2luZGV4ID0gc29tX3JlbG9jX3F1ZXVlX2ZpbmQgKHAsIHNpemUsIHF1ZXVlKTsKKworICBpZiAocXVldWVfaW5kZXggIT0gLTEpCisgICAgeworICAgICAgLyogRm91bmQgdGhpcyBpbiBhIHByZXZpb3VzIGZpeHVwLiAgVW5kbyB0aGUgZml4dXAgd2UKKwkganVzdCBidWlsdCBhbmQgdXNlIFJfUFJFVl9GSVhVUCBpbnN0ZWFkLiAgV2Ugc2F2ZWQgCisJIGEgdG90YWwgb2Ygc2l6ZSAtIDEgYnl0ZXMgaW4gdGhlIGZpeHVwIHN0cmVhbS4gICovCisgICAgICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCArIHF1ZXVlX2luZGV4LCBwKTsKKyAgICAgIHAgKz0gMTsKKyAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSAxOworICAgICAgc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIHF1ZXVlX2luZGV4KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSk7CisgICAgICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gc2l6ZTsKKyAgICAgIHAgKz0gc2l6ZTsKKyAgICB9CisgIHJldHVybiBwOworfQorCisvKiBFbWl0IHRoZSBwcm9wZXIgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgdGhlIG5leHQgU0tJUAorICAgYnl0ZXMgd2l0aG91dCBhbnkgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UKKyAgIHJlbG9jYXRpb24gc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSAKKyAgIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK3NvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IHNraXA7CisgICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7CisgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Cit7CisgIC8qIFVzZSBhIDQgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkgd2l0aCBhIG1heGltYWwgdmFsdWUKKyAgICAgdGhlbiBSX1BSRVZfRklYVVBzIHRvIGdldCB0aGUgZGlmZmVyZW5jZSBkb3duIHRvIGEKKyAgICAgcmVhc29uYWJsZSBzaXplLiAgKi8KKyAgaWYgKHNraXAgPj0gMHgxMDAwMDAwKQorICAgIHsKKyAgICAgIHNraXAgLT0gMHgxMDAwMDAwOworICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7CisgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHAgKyAxKTsKKyAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgcCArIDIpOworICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOworICAgICAgd2hpbGUgKHNraXAgPj0gMHgxMDAwMDAwKQorCXsKKwkgIHNraXAgLT0gMHgxMDAwMDAwOworCSAgYmZkX3B1dF84IChhYmZkLCBSX1BSRVZfRklYVVAsIHApOworCSAgcCsrOworCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7CisJICAvKiBObyBuZWVkIHRvIGFkanVzdCBxdWV1ZSBoZXJlIHNpbmNlIHdlIGFyZSByZXBlYXRpbmcgdGhlCisJICAgICBtb3N0IHJlY2VudCBmaXh1cC4gICovCisJfQorICAgIH0KKyAgCisgIC8qIFRoZSBkaWZmZXJlbmNlIG11c3QgYmUgbGVzcyB0aGFuIDB4MTAwMDAwMC4gIFVzZSBvbmUgCisgICAgIG1vcmUgUl9OT19SRUxPQ0FUSU9OIGVudHJ5IHRvIGdldCB0byB0aGUgcmlnaHQgZGlmZmVyZW5jZS4gICovCisgIGlmICgoc2tpcCAmIDMpID09IDAgJiYgc2tpcCA8PSAweGMwMDAwICYmIHNraXAgPiAwKQorICAgIHsKKyAgICAgIC8qIERpZmZlcmVuY2UgY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW1wbGUgc2luZ2xlLWJ5dGUKKwkgUl9OT19SRUxPQ0FUSU9OIGVudHJ5LiAgKi8KKyAgICAgIGlmIChza2lwIDw9IDB4NjApCisJeworCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAoc2tpcCA+PiAyKSAtIDEsIHApOworCSAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7CisJICBwKys7CisJfQorICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0d28gYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLworICAgICAgZWxzZSBpZiAoc2tpcCA8PSAweDEwMDApCisJeworCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyNCArICgoKHNraXAgPj4gMikgLSAxKSA+PiA4KSwgcCk7CisJICBiZmRfcHV0XzggKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOworCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMiwgcXVldWUpOworCX0KKyAgICAgIC8qIEhhbmRsZSBpdCB3aXRoIGEgdGhyZWUgYnl0ZSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLworICAgICAgZWxzZQorCXsKKwkgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMjggKyAoKChza2lwID4+IDIpIC0gMSkgPj4gMTYpLCBwKTsKKwkgIGJmZF9wdXRfMTYgKGFiZmQsIChza2lwID4+IDIpIC0gMSwgcCArIDEpOworCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOworCX0KKyAgICB9CisgIC8qIFVnaC4gIFB1bnQgYW5kIHVzZSBhIDQgYnl0ZSBlbnRyeS4gICovCisgIGVsc2UgaWYgKHNraXAgPiAwKQorICAgIHsKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9OT19SRUxPQ0FUSU9OICsgMzEsIHApOworICAgICAgYmZkX3B1dF84IChhYmZkLCAoc2tpcCAtIDEpID4+IDE2LCBwICsgMSk7CisgICAgICBiZmRfcHV0XzE2IChhYmZkLCBza2lwIC0gMSwgcCArIDIpOworICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNCwgcXVldWUpOworICAgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qIEVtaXQgdGhlIHByb3BlciBSX0RBVEFfT1ZFUlJJREUgZml4dXBzIHRvIGhhbmRsZSBhIG5vbnplcm8gYWRkZW5kCisgICBmcm9tIGEgQkZEIHJlbG9jYXRpb24uICBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHN1YnNwYWNlIHJlbG9jYXRpb24KKyAgIHN0cmVhbSB2aWEgU1VCU1BBQ0VfUkVMT0NfU0laRV9QOyBhbHNvIHJldHVybiB0aGUgY3VycmVudCBwb2ludGVyCisgICBpbnRvIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK3NvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGFkZGVuZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHF1ZXVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBhZGRlbmQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgIHVuc2lnbmVkIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7CisgICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Cit7CisgIGlmICgodW5zaWduZWQpKGFkZGVuZCkgKyAweDgwIDwgMHgxMDApCisgICAgeworICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAxLCBwKTsKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBwICsgMSk7CisgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7IAorICAgIH0KKyAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMCA8IDB4MTAwMDApCisgICAgeworICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAyLCBwKTsKKyAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGFkZGVuZCwgcCArIDEpOworICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgMywgcXVldWUpOworICAgIH0KKyAgZWxzZSBpZiAoKHVuc2lnbmVkKSAoYWRkZW5kKSArIDB4ODAwMDAwIDwgMHgxMDAwMDAwKQorICAgIHsKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9EQVRBX09WRVJSSURFICsgMywgcCk7CisgICAgICBiZmRfcHV0XzggKGFiZmQsIGFkZGVuZCA+PiAxNiwgcCArIDEpOworICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMik7CisgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyA0LCBwKTsKKyAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGFkZGVuZCwgcCArIDEpOworICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOworICAgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qIEhhbmRsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJlbG9jYXRpb24uICAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitzb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIGJmZF9yZWxvYywgc3ltX251bSwgcXVldWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKKyAgICAgYXJlbGVudCAqYmZkX3JlbG9jOworICAgICBpbnQgc3ltX251bTsKKyAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKK3sKKyAgaW50IGFyZ19iaXRzID0gSFBQQV9SX0FSR19SRUxPQyAoYmZkX3JlbG9jLT5hZGRlbmQpOworICBpbnQgcnRuX2JpdHMgPSBhcmdfYml0cyAmIDB4MzsKKyAgaW50IHR5cGUsIGRvbmUgPSAwOworICAKKyAgLyogWW91J2xsIG5ldmVyIGJlbGlldmUgYWxsIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSByZWxvY2F0aW9ucworICAgICBmb3IgZnVuY3Rpb24gY2FsbHMuICBIYXZpbmcgdG8gY29tcHV0ZSBhbmQgcGFjayB0aGUgYXJndW1lbnQKKyAgICAgcmVsb2NhdGlvbiBiaXRzIGlzIHRoZSByZWFsIG5pZ2h0bWFyZS4KKyAgICAgCisgICAgIElmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGhvdyB0aGlzIHdvcmtzLCBqdXN0IGZvcmdldCBpdC4gIFlvdSByZWFsbHkKKyAgICAgZG8gbm90IHdhbnQgdG8ga25vdyBhYm91dCB0aGlzIGJyYWluZGFtYWdlLiAgKi8KKworICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgInNpbXBsZSIgcmVsb2NhdGlvbi4gIFNpbXBsZQorICAgICByZWxvY2F0aW9ucyBoYXZlIGEgc3ltYm9sIG51bWJlciA8IDB4MTAwIGFuZCBoYXZlIHNpbXBsZSBlbmNvZGluZ3MKKyAgICAgb2YgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLworCisgIGlmIChzeW1fbnVtIDwgMHgxMDApCisgICAgeworICAgICAgc3dpdGNoIChhcmdfYml0cykKKwl7CisJY2FzZSAwOgorCWNhc2UgMToKKwkgIHR5cGUgPSAwOworCSAgYnJlYWs7CisJY2FzZSAxIDw8IDg6CisJY2FzZSAxIDw8IDggfCAxOgorCSAgdHlwZSA9IDE7CisJICBicmVhazsKKwljYXNlIDEgPDwgOCB8IDEgPDwgNjoKKwljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDE6CisJICB0eXBlID0gMjsKKwkgIGJyZWFrOworCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0OgorCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMToKKwkgIHR5cGUgPSAzOworCSAgYnJlYWs7CisJY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI6CisJY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDIgfCAxOgorCSAgdHlwZSA9IDQ7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogTm90IG9uZSBvZiB0aGUgZWFzeSBlbmNvZGluZ3MuICBUaGlzIHdpbGwgaGF2ZSB0byBiZQorCSAgICAgaGFuZGxlZCBieSB0aGUgbW9yZSBjb21wbGV4IGNvZGUgYmVsb3cuICAqLworCSAgdHlwZSA9IC0xOworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKHR5cGUgIT0gLTEpCisJeworCSAgLyogQWNjb3VudCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0b28uICAqLworCSAgaWYgKHJ0bl9iaXRzKQorCSAgICB0eXBlICs9IDU7CisKKwkgIC8qIEVtaXQgYSAyIGJ5dGUgcmVsb2NhdGlvbi4gIFRoZW4gc2VlIGlmIGl0IGNhbiBiZSBoYW5kbGVkCisJICAgICB3aXRoIGEgcmVsb2NhdGlvbiB3aGljaCBpcyBhbHJlYWR5IGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KKwkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIHR5cGUsIHApOworCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMSk7CisJICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7CisJICBkb25lID0gMTsKKwl9CisgICAgfQorICAKKyAgLyogSWYgdGhpcyBjb3VsZCBub3QgYmUgaGFuZGxlZCB3aXRoIGEgc2ltcGxlIHJlbG9jYXRpb24sIHRoZW4gZG8gYSBoYXJkCisgICAgIG9uZS4gIEhhcmQgcmVsb2NhdGlvbnMgb2NjdXIgaWYgdGhlIHN5bWJvbCBudW1iZXIgd2FzIHRvbyBoaWdoIG9yIGlmCisgICAgIHRoZSBlbmNvZGluZyBvZiBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgaXMgdG9vIGNvbXBsZXguICAqLworICBpZiAoISBkb25lKQorICAgIHsKKyAgICAgIC8qIERvbid0IGFzayBhYm91dCB0aGVzZSBtYWdpYyBzZXF1ZW5jZXMuICBJIHRvb2sgdGhlbSBzdHJhaWdodAorCSBmcm9tIGdhcy0xLjM2IHdoaWNoIHRvb2sgdGhlbSBmcm9tIHRoZSBhLm91dCBtYW4gcGFnZS4gICovCisgICAgICB0eXBlID0gcnRuX2JpdHM7CisgICAgICBpZiAoKGFyZ19iaXRzID4+IDYgJiAweGYpID09IDB4ZSkKKwl0eXBlICs9IDkgKiA0MDsKKyAgICAgIGVsc2UKKwl0eXBlICs9ICgzICogKGFyZ19iaXRzID4+IDggJiAzKSArIChhcmdfYml0cyA+PiA2ICYgMykpICogNDA7CisgICAgICBpZiAoKGFyZ19iaXRzID4+IDIgJiAweGYpID09IDB4ZSkKKwl0eXBlICs9IDkgKiA0OworICAgICAgZWxzZQorCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gNCAmIDMpICsgKGFyZ19iaXRzID4+IDIgJiAzKSkgKiA0OworICAgICAgCisgICAgICAvKiBPdXRwdXQgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgcmVsb2NhdGlvbi4gIFRoZXNlIGRlc2NyaWJlCisJIHRoZSBsZW5ndGggb2YgdGhlIHJlbG9jYXRpb24gYW5kIGVuY29kaW5nIHN0eWxlLiAgKi8KKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEwCisJCSArIDIgKiAoc3ltX251bSA+PSAweDEwMCkgKyAodHlwZSA+PSAweDEwMCksCisJCSBwKTsKKyAgICAgIGJmZF9wdXRfOCAoYWJmZCwgdHlwZSwgcCArIDEpOworICAgICAgCisgICAgICAvKiBOb3cgb3V0cHV0IHRoZSBzeW1ib2wgaW5kZXggYW5kIHNlZSBpZiB0aGlzIGJpemFycmUgcmVsb2NhdGlvbgorCSBqdXN0IGhhcHBlbmVkIHRvIGJlIGluIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAgKi8KKyAgICAgIGlmIChzeW1fbnVtIDwgMHgxMDApCisJeworCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtLCBwICsgMik7CisJICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOworCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOworCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcCwgNSwgcXVldWUpOworCX0KKyAgICB9CisgIHJldHVybiBwOworfQorCisKKy8qIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIFgsIGJhc2UgMiwgY29uc2lkZXJpbmcgWCB1bnNpZ25lZC4gCisgICBBYm9ydCAtMSBpZiBYIGlzIG5vdCBhIHBvd2VyIG9yIHR3byBvciBpcyB6ZXJvLiAgKi8KKworc3RhdGljIGludAorbG9nMiAoeCkKKyAgICAgdW5zaWduZWQgaW50IHg7Cit7CisgIGludCBsb2cgPSAwOworCisgIC8qIFRlc3QgZm9yIDAgb3IgYSBwb3dlciBvZiAyLiAgKi8KKyAgaWYgKHggPT0gMCB8fCB4ICE9ICh4ICYgLXgpKQorICAgIHJldHVybiAtMTsKKworICB3aGlsZSAoKHggPj49IDEpICE9IDApCisgICAgbG9nKys7CisgIHJldHVybiBsb2c7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK2hwcGFfc29tX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAorCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OworICAgICBhc3ltYm9sICpzeW1ib2xfaW47CisgICAgIFBUUiBkYXRhOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKK3sKKyAgaWYgKG91dHB1dF9iZmQpCisgICAgeworICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7CisgICAgfQorICByZXR1cm4gYmZkX3JlbG9jX29rOworfQorCisvKiBHaXZlbiBhIGdlbmVyaWMgSFBQQSByZWxvY2F0aW9uIHR5cGUsIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXQsCisgICBhbmQgYSBmaWVsZCBzZWxlY3RvciwgcmV0dXJuIG9uZSBvciBtb3JlIGFwcHJvcHJpYXRlIFNPTSByZWxvY2F0aW9ucy4gICovCisKK2ludCAqKgoraHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUgKGFiZmQsIGJhc2VfdHlwZSwgZm9ybWF0LCBmaWVsZCwgc3ltX2RpZmYsIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgYmFzZV90eXBlOworICAgICBpbnQgZm9ybWF0OworICAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZmllbGQ7CisgICAgIGludCBzeW1fZGlmZjsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBpbnQgKmZpbmFsX3R5cGUsICoqZmluYWxfdHlwZXM7CisKKyAgZmluYWxfdHlwZXMgPSAoaW50ICoqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50ICopICogNik7CisgIGZpbmFsX3R5cGUgPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKKyAgaWYgKCFmaW5hbF90eXBlcyB8fCAhZmluYWxfdHlwZSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBUaGUgZmllbGQgc2VsZWN0b3IgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCByZWxvY2F0aW9ucyB0byBiZSAKKyAgICAgZ2VuZXJhdGVkLiAgSXQncyBpbXBvc3NpYmxlIHRvIGtub3cgYXQgdGhpcyBtb21lbnQgaWYgYWRkaXRpb25hbAorICAgICByZWxvY2F0aW9ucyB3aWxsIGJlIG5lZWRlZCwgc28gd2UgbWFrZSB0aGVtLiAgVGhlIGNvZGUgdG8gYWN0dWFsbHkKKyAgICAgd3JpdGUgdGhlIHJlbG9jYXRpb24vZml4dXAgc3RyZWFtIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZworICAgICBhbnkgcmVkdW5kYW50IHJlbG9jYXRpb25zLiAgKi8KKyAgc3dpdGNoIChmaWVsZCkKKyAgICB7CisgICAgICBjYXNlIGVfZnNlbDoKKyAgICAgIGNhc2UgZV9wc2VsOgorICAgICAgY2FzZSBlX2xwc2VsOgorICAgICAgY2FzZSBlX3Jwc2VsOgorCWZpbmFsX3R5cGVzWzBdID0gZmluYWxfdHlwZTsKKwlmaW5hbF90eXBlc1sxXSA9IE5VTEw7CisJZmluYWxfdHlwZXNbMl0gPSBOVUxMOworCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOworCWJyZWFrOworCisgICAgICBjYXNlIGVfdHNlbDoKKyAgICAgIGNhc2UgZV9sdHNlbDoKKyAgICAgIGNhc2UgZV9ydHNlbDoKKwlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOworCWlmICghZmluYWxfdHlwZXNbMF0pCisJICByZXR1cm4gTlVMTDsKKwlpZiAoZmllbGQgPT0gZV90c2VsKQorCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOworCWVsc2UgaWYgKGZpZWxkID09IGVfbHRzZWwpCisJICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7CisJZWxzZQorCSAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOworCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKKwlmaW5hbF90eXBlc1syXSA9IE5VTEw7CisJKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgZV9sc3NlbDoKKyAgICAgIGNhc2UgZV9yc3NlbDoKKwlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOworCWlmICghZmluYWxfdHlwZXNbMF0pCisJICByZXR1cm4gTlVMTDsKKwkqZmluYWxfdHlwZXNbMF0gPSBSX1NfTU9ERTsKKwlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7CisJZmluYWxfdHlwZXNbMl0gPSBOVUxMOworCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOworCWJyZWFrOworCisgICAgICBjYXNlIGVfbHNlbDoKKyAgICAgIGNhc2UgZV9yc2VsOgorCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJaWYgKCFmaW5hbF90eXBlc1swXSkKKwkgIHJldHVybiBOVUxMOworCSpmaW5hbF90eXBlc1swXSA9IFJfTl9NT0RFOworCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKKwlmaW5hbF90eXBlc1syXSA9IE5VTEw7CisJKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgZV9sZHNlbDoKKyAgICAgIGNhc2UgZV9yZHNlbDoKKwlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOworCWlmICghZmluYWxfdHlwZXNbMF0pCisJICByZXR1cm4gTlVMTDsKKwkqZmluYWxfdHlwZXNbMF0gPSBSX0RfTU9ERTsKKwlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7CisJZmluYWxfdHlwZXNbMl0gPSBOVUxMOworCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOworCWJyZWFrOworCisgICAgICBjYXNlIGVfbHJzZWw6CisgICAgICBjYXNlIGVfcnJzZWw6CisJZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKKwlpZiAoIWZpbmFsX3R5cGVzWzBdKQorCSAgcmV0dXJuIE5VTEw7CisJKmZpbmFsX3R5cGVzWzBdID0gUl9SX01PREU7CisJZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOworCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKKwkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKKwlicmVhazsKKworICAgICAgY2FzZSBlX25zZWw6CisJZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKKwlpZiAoIWZpbmFsX3R5cGVzWzBdKQorCSAgcmV0dXJuIE5VTEw7CisJKmZpbmFsX3R5cGVzWzBdID0gUl9OMVNFTDsKKwlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7CisJZmluYWxfdHlwZXNbMl0gPSBOVUxMOworCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOworCWJyZWFrOworCisgICAgICBjYXNlIGVfbmxzZWw6CisgICAgICBjYXNlIGVfbmxyc2VsOgorCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJaWYgKCFmaW5hbF90eXBlc1swXSkKKwkgIHJldHVybiBOVUxMOworCSpmaW5hbF90eXBlc1swXSA9IFJfTjBTRUw7CisJZmluYWxfdHlwZXNbMV0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKKwlpZiAoIWZpbmFsX3R5cGVzWzFdKQorCSAgcmV0dXJuIE5VTEw7CisJaWYgKGZpZWxkID09IGVfbmxzZWwpCisJICAqZmluYWxfdHlwZXNbMV0gPSBSX05fTU9ERTsKKwllbHNlCisJICAqZmluYWxfdHlwZXNbMV0gPSBSX1JfTU9ERTsKKwlmaW5hbF90eXBlc1syXSA9IGZpbmFsX3R5cGU7CisJZmluYWxfdHlwZXNbM10gPSBOVUxMOworCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOworCWJyZWFrOworICAgIH0KKyAgCisgIHN3aXRjaCAoYmFzZV90eXBlKQorICAgIHsKKyAgICBjYXNlIFJfSFBQQToKKyAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KKyAgICAgIGlmIChzeW1fZGlmZikKKwl7CisJICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCisJICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKKwkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKKwkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOworCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQorCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7CisJICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOworCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKKwkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7CisJICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7CisJICBpZiAoZm9ybWF0ID09IDMyKQorCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKKwkgIGVsc2UKKwkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7CisJICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7CisJICBicmVhazsKKwl9CisgICAgICAvKiBQTEFCRUxzIGdldCB0aGVpciBvd24gcmVsb2NhdGlvbiB0eXBlLiAgKi8KKyAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfcHNlbAorCSAgfHwgZmllbGQgPT0gZV9scHNlbAorCSAgfHwgZmllbGQgPT0gZV9ycHNlbCkKKwl7CisJICAvKiBBIFBMQUJFTCByZWxvY2F0aW9uIHRoYXQgaGFzIGEgc2l6ZSBvZiAzMiBiaXRzIG11c3QKKwkgICAgIGJlIGEgUl9EQVRBX1BMQUJFTC4gIEFsbCBvdGhlcnMgYXJlIFJfQ09ERV9QTEFCRUxzLiAgKi8KKwkgIGlmIChmb3JtYXQgPT0gMzIpCisJICAgICpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKKwkgIGVsc2UKKwkgICAgKmZpbmFsX3R5cGUgPSBSX0NPREVfUExBQkVMOworCX0KKyAgICAgIC8qIFBJQyBzdHVmZi4gICovCisgICAgICBlbHNlIGlmIChmaWVsZCA9PSBlX3RzZWwKKwkgIHx8IGZpZWxkID09IGVfbHRzZWwKKwkgIHx8IGZpZWxkID09IGVfcnRzZWwpCisJKmZpbmFsX3R5cGUgPSBSX0RMVF9SRUw7CisgICAgICAvKiBBIHJlbG9jYXRpb24gaW4gdGhlIGRhdGEgc3BhY2UgaXMgYWx3YXlzIGEgZnVsbCAzMmJpdHMuICAqLworICAgICAgZWxzZSBpZiAoZm9ybWF0ID09IDMyKQorCXsKKwkgICpmaW5hbF90eXBlID0gUl9EQVRBX09ORV9TWU1CT0w7CisKKwkgIC8qIElmIHRoZXJlJ3Mgbm8gU09NIHN5bWJvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJGRAorCSAgICAgc3ltYm9sLCB0aGVuIHNldCB0aGUgc3ltYm9sIHR5cGUgdG8gU1RfREFUQS4KKworCSAgICAgT25seSBkbyB0aGlzIGlmIHRoZSB0eXBlIGlzIGdvaW5nIHRvIGRlZmF1bHQgbGF0ZXIgd2hlbgorCSAgICAgd2Ugd3JpdGUgdGhlIG9iamVjdCBmaWxlLgorCisJICAgICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgbGlua2VyIG5ldmVyIGVuY291bnRlcnMgYW4KKwkgICAgIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGludm9sdmluZyBhbiBTVF9DT0RFIHN5bWJvbC4KKworCSAgICAgVGhpcyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZworCSAgICAgdGFibGVzLgorCisJICAgICBOb3RlIHRoYXQgb25lIGRheSB3ZSBtYXkgbmVlZCB0byBhbHNvIGVtaXQgQkVHSU5fQlJUQUIgYW5kCisJICAgICBFTkRfQlJUQUIgdG8gcHJldmVudCB0aGUgbGlua2VyIGZyb20gb3B0aW1pemluZyBhd2F5IGluc25zCisJICAgICBpbiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucy4gICovCisJICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCisJICAgICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKwkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMAorCSAgICAgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQorCSAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKKwl9CisgICAgICBicmVhazsKKworCisgICAgY2FzZSBSX0hQUEFfR09UT0ZGOgorICAgICAgLyogTW9yZSBQTEFCRUwgc3BlY2lhbCBjYXNlcy4gICovCisgICAgICBpZiAoZmllbGQgPT0gZV9wc2VsCisJICB8fCBmaWVsZCA9PSBlX2xwc2VsCisJICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQorCSpmaW5hbF90eXBlID0gUl9EQVRBX1BMQUJFTDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0hQUEFfQ09NUExFWDoKKyAgICAgIC8qIFRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIG5lZWRzICp2ZXJ5KiBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KKyAgICAgIGlmIChzeW1fZGlmZikKKwl7CisJICBmaW5hbF90eXBlc1swXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBmaW5hbF90eXBlc1sxXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBmaW5hbF90eXBlc1syXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBmaW5hbF90eXBlc1szXSA9IChpbnQgKiliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7CisJICBpZiAoIWZpbmFsX3R5cGVzWzBdIHx8ICFmaW5hbF90eXBlc1sxXSB8fCAhZmluYWxfdHlwZXNbMl0pCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwkgIGlmIChmaWVsZCA9PSBlX2ZzZWwpCisJICAgICpmaW5hbF90eXBlc1swXSA9IFJfRlNFTDsKKwkgIGVsc2UgaWYgKGZpZWxkID09IGVfcnNlbCkKKwkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9SU0VMOworCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9sc2VsKQorCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX0xTRUw7CisJICAqZmluYWxfdHlwZXNbMV0gPSBSX0NPTVAyOworCSAgKmZpbmFsX3R5cGVzWzJdID0gUl9DT01QMjsKKwkgICpmaW5hbF90eXBlc1szXSA9IFJfQ09NUDE7CisJICBmaW5hbF90eXBlc1s0XSA9IGZpbmFsX3R5cGU7CisJICBpZiAoZm9ybWF0ID09IDMyKQorCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0RBVEFfRVhQUjsKKwkgIGVsc2UKKwkgICAgKmZpbmFsX3R5cGVzWzRdID0gUl9DT0RFX0VYUFI7CisJICBmaW5hbF90eXBlc1s1XSA9IE5VTEw7CisJICBicmVhazsKKwl9CisgICAgICBlbHNlCisJYnJlYWs7CisKKyAgICBjYXNlIFJfSFBQQV9OT05FOgorICAgIGNhc2UgUl9IUFBBX0FCU19DQUxMOgorICAgIGNhc2UgUl9IUFBBX1BDUkVMX0NBTEw6CisgICAgICAvKiBSaWdodCBub3cgd2UgY2FuIGRlZmF1bHQgYWxsIHRoZXNlLiAgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIGZpbmFsX3R5cGVzOworfQorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlY3QgZW50cnkgaW4gdGhlIFBBIFNPTSByZWxvY2F0aW9uCisgICBob3d0byB0YWJsZS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgorc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKKyAgICAgYmZkICphYmZkOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKK3sKKyAgaWYgKChpbnQpIGNvZGUgPCAoaW50KSBSX05PX1JFTE9DQVRJT04gKyAyNTUpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAoKGludCkgc29tX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV0udHlwZSA9PSAoaW50KSBjb2RlKTsKKyAgICAgIHJldHVybiAmc29tX2hwcGFfaG93dG9fdGFibGVbKGludCkgY29kZV07CisgICAgfQorCisgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSAwOworfQorCisvKiBQZXJmb3JtIHNvbWUgaW5pdGlhbGl6YXRpb24gZm9yIGFuIG9iamVjdC4gIFNhdmUgcmVzdWx0cyBvZiB0aGlzCisgICBpbml0aWFsaXphdGlvbiBpbiB0aGUgQkZELiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorc29tX29iamVjdF9zZXR1cCAoYWJmZCwgZmlsZV9oZHJwLCBhdXhfaGRycCwgY3VycmVudF9vZmZzZXQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHJwOworICAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICphdXhfaGRycDsKKyAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKK3sKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIGludCBmb3VuZDsKKworICAvKiBzb21fbWtvYmplY3Qgd2lsbCBzZXQgYmZkX2Vycm9yIGlmIHNvbV9ta29iamVjdCBmYWlscy4gICovCisgIGlmIChzb21fbWtvYmplY3QgKGFiZmQpICE9IHRydWUpCisgICAgcmV0dXJuIDA7CisKKyAgLyogU2V0IEJGRCBmbGFncyBiYXNlZCBvbiB3aGF0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgU09NLiAgKi8KKyAgYWJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7CisgIGlmIChmaWxlX2hkcnAtPnN5bWJvbF90b3RhbCkKKyAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOworCisgIHN3aXRjaCAoZmlsZV9oZHJwLT5hX21hZ2ljKQorICAgIHsKKyAgICBjYXNlIERFTUFORF9NQUdJQzoKKyAgICAgIGFiZmQtPmZsYWdzIHw9IChEX1BBR0VEIHwgV1BfVEVYVCB8IEVYRUNfUCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIQVJFX01BR0lDOgorICAgICAgYWJmZC0+ZmxhZ3MgfD0gKFdQX1RFWFQgfCBFWEVDX1ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWEVDX01BR0lDOgorICAgICAgYWJmZC0+ZmxhZ3MgfD0gKEVYRUNfUCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFTE9DX01BR0lDOgorICAgICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOworICAgICAgYnJlYWs7CisjaWZkZWYgU0hMX01BR0lDCisgICAgY2FzZSBTSExfTUFHSUM6CisjZW5kaWYKKyNpZmRlZiBETF9NQUdJQworICAgIGNhc2UgRExfTUFHSUM6CisjZW5kaWYKKyAgICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgdG8gaG9sZCB0aGUgc2F2ZWQgZXhlYyBoZWFkZXIgaW5mb3JtYXRpb24uICAqLworICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPSAoc3RydWN0IHNvbV9leGVjX2RhdGEgKikKKyAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19kYXRhICkpOworICBpZiAob2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogVGhlIGJyYWluZGFtYWdlZCBPU0YxIGxpbmtlciBzd2l0Y2hlZCBleGVjX2ZsYWdzIGFuZCBleGVjX2VudHJ5IQorCisgICAgIFdlIHVzZWQgdG8gaWRlbnRpZnkgT1NGMSBiaW5hcmllcyBiYXNlZCBvbiBORVdfVkVSU0lPTl9JRCwgYnV0CisgICAgIGFwcGFyZW50bHkgdGhlIGxhdGVzdCBIUFVYIGxpbmtlciBpcyB1c2luZyBORVdfVkVSU0lPTl9JRCBub3cuCisKKyAgICAgSXQncyBhYm91dCB0aW1lLCBPU0YgaGFzIHVzZWQgdGhlIG5ldyBpZCBzaW5jZSBhdCBsZWFzdCAxOTkyOworICAgICBIUFVYIGRpZG4ndCBzdGFydCB0aWxsIG5lYXJseSAxOTk1IS4KKyAgICAKKyAgICAgVGhlIG5ldyBhcHByb2FjaCBleGFtaW5lcyB0aGUgZW50cnkgZmllbGQuICBJZiBpdCdzIHplcm8gb3Igbm90IDQKKyAgICAgYnl0ZSBhbGlnbmVkIHRoZW4gaXQncyBub3QgYSBwcm9wZXIgY29kZSBhZGRyZXNzIGFuZCB3ZSBndWVzcyBpdCdzCisgICAgIHJlYWxseSB0aGUgZXhlY3V0YWJsZSBmbGFncy4gICovCisgIGZvdW5kID0gMDsKKyAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIGlmIChhdXhfaGRycC0+ZXhlY19lbnRyeSA+PSBzZWN0aW9uLT52bWEKKwkgICYmIGF1eF9oZHJwLT5leGVjX2VudHJ5IDwgc2VjdGlvbi0+dm1hICsgc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQorCWZvdW5kID0gMTsKKyAgICB9CisgIGlmIChhdXhfaGRycC0+ZXhlY19lbnRyeSA9PSAwCisgICAgICB8fCAoYXV4X2hkcnAtPmV4ZWNfZW50cnkgJiAweDMpICE9IDAKKyAgICAgIHx8ICEgZm91bmQpCisgICAgeworICAgICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOworICAgICAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5leGVjX2ZsYWdzID0gYXV4X2hkcnAtPmV4ZWNfZW50cnk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGF1eF9oZHJwLT5leGVjX2VudHJ5ICsgY3VycmVudF9vZmZzZXQ7CisgICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19mbGFnczsKKyAgICB9CisKKyAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaHBwYSwgcGExMCk7CisgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZmlsZV9oZHJwLT5zeW1ib2xfdG90YWw7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc2F2ZWQgc3ltYm9sIHRhYmxlIGFuZCBzdHJpbmcgdGFibGUgdG8gTlVMTC4gIAorICAgICBTYXZlIGltcG9ydGFudCBvZmZzZXRzIGFuZCBzaXplcyBmcm9tIHRoZSBTT00gaGVhZGVyIGludG8KKyAgICAgdGhlIEJGRC4gICovCisgIG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSA9IChjaGFyICAqKSBOVUxMOworICBvYmpfc29tX3N5bXRhYiAoYWJmZCkgPSAoc29tX3N5bWJvbF90eXBlICopIE5VTEw7CisgIG9ial9zb21fc29ydGVkX3N5bXMgKGFiZmQpID0gTlVMTDsKKyAgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX3NpemU7CisgIG9ial9zb21fc3ltX2ZpbGVwb3MgKGFiZmQpID0gZmlsZV9oZHJwLT5zeW1ib2xfbG9jYXRpb24gKyBjdXJyZW50X29mZnNldDsKKyAgb2JqX3NvbV9zdHJfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5zeW1ib2xfc3RyaW5nc19sb2NhdGlvbgorCQkJCSsgY3VycmVudF9vZmZzZXQpOworICBvYmpfc29tX3JlbG9jX2ZpbGVwb3MgKGFiZmQpID0gKGZpbGVfaGRycC0+Zml4dXBfcmVxdWVzdF9sb2NhdGlvbgorCQkJCSAgKyBjdXJyZW50X29mZnNldCk7CisgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkID0gZmlsZV9oZHJwLT5zeXN0ZW1faWQ7CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKKy8qIENvbnZlcnQgYWxsIG9mIHRoZSBzcGFjZSBhbmQgc3Vic3BhY2UgaW5mbyBpbnRvIEJGRCBzZWN0aW9ucy4gIEVhY2ggc3BhY2UKKyAgIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YnNwYWNlcywgd2hpY2ggaW4gdHVybiBkZXNjcmliZSB0aGUgbWFwcGluZyBiZXR3ZWVuCisgICByZWdpb25zIG9mIHRoZSBleGVjIGZpbGUsIGFuZCB0aGUgYWRkcmVzcyBzcGFjZSB0aGF0IHRoZSBwcm9ncmFtIHJ1bnMgaW4uCisgICBCRkQgc2VjdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byBzcGFjZXMgd2lsbCBvdmVybGFwIHRoZSBzZWN0aW9ucyBmb3IgdGhlCisgICBhc3NvY2lhdGVkIHN1YnNwYWNlcy4gICovCisKK3N0YXRpYyBib29sZWFuCitzZXR1cF9zZWN0aW9ucyAoYWJmZCwgZmlsZV9oZHIsIGN1cnJlbnRfb2Zmc2V0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOworICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OworeworICBjaGFyICpzcGFjZV9zdHJpbmdzOworICB1bnNpZ25lZCBpbnQgc3BhY2VfaW5kZXgsIGk7CisgIHVuc2lnbmVkIGludCB0b3RhbF9zdWJzcGFjZXMgPSAwOworICBhc2VjdGlvbiAqKnN1YnNwYWNlX3NlY3Rpb25zLCAqc2VjdGlvbjsKKworICAvKiBGaXJzdCwgcmVhZCBpbiBzcGFjZSBuYW1lcyAqLworCisgIHNwYWNlX3N0cmluZ3MgPSBiZmRfbWFsbG9jIChmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplKTsKKyAgaWYgKCFzcGFjZV9zdHJpbmdzICYmIGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24sIAorICAJCVNFRUtfU0VUKSA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIGlmIChiZmRfcmVhZCAoc3BhY2Vfc3RyaW5ncywgMSwgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSwgYWJmZCkKKyAgICAgICE9IGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogTG9vcCBvdmVyIGFsbCBvZiB0aGUgc3BhY2UgZGljdGlvbmFyaWVzLCBidWlsZGluZyB1cCBzZWN0aW9ucyAqLworICBmb3IgKHNwYWNlX2luZGV4ID0gMDsgc3BhY2VfaW5kZXggPCBmaWxlX2hkci0+c3BhY2VfdG90YWw7IHNwYWNlX2luZGV4KyspCisgICAgeworICAgICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkIHNwYWNlOworICAgICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkIHN1YnNwYWNlLCBzYXZlX3N1YnNwYWNlOworICAgICAgaW50IHN1YnNwYWNlX2luZGV4OworICAgICAgYXNlY3Rpb24gKnNwYWNlX2FzZWN0OworICAgICAgY2hhciAqbmV3bmFtZTsKKworICAgICAgLyogUmVhZCB0aGUgc3BhY2UgZGljdGlvbmFyeSBlbGVtZW50ICovCisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2VfbG9jYXRpb24KKwkJICAgICArIHNwYWNlX2luZGV4ICogc2l6ZW9mIHNwYWNlKSwKKwkJICAgIFNFRUtfU0VUKSA8IDApCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAoYmZkX3JlYWQgKCZzcGFjZSwgMSwgc2l6ZW9mIHNwYWNlLCBhYmZkKSAhPSBzaXplb2Ygc3BhY2UpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIFNldHVwIHRoZSBzcGFjZSBuYW1lIHN0cmluZyAqLworICAgICAgc3BhY2UubmFtZS5uX25hbWUgPSBzcGFjZS5uYW1lLm5fc3RyeCArIHNwYWNlX3N0cmluZ3M7CisKKyAgICAgIC8qIE1ha2UgYSBzZWN0aW9uIG91dCBvZiBpdCAqLworICAgICAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzcGFjZS5uYW1lLm5fbmFtZSkgKyAxKTsKKyAgICAgIGlmICghbmV3bmFtZSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIHN0cmNweSAobmV3bmFtZSwgc3BhY2UubmFtZS5uX25hbWUpOworCQkJICAgCisgICAgICBzcGFjZV9hc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuZXduYW1lKTsKKyAgICAgIGlmICghc3BhY2VfYXNlY3QpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgICBpZiAoc3BhY2UuaXNfbG9hZGFibGUgPT0gMCkKKwlzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKKworICAgICAgLyogU2V0IHVwIGFsbCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgKi8KKyAgICAgIGlmIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlX2FzZWN0LCBzcGFjZS5pc19kZWZpbmVkLAorCQkJCQkgIHNwYWNlLmlzX3ByaXZhdGUsIHNwYWNlLnNvcnRfa2V5LAorCQkJCQkgIHNwYWNlLnNwYWNlX251bWJlcikgPT0gZmFsc2UpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIElmIHRoZSBzcGFjZSBoYXMgbm8gc3Vic3BhY2VzLCB0aGVuIHdlJ3JlIGRvbmUuICAqLworICAgICAgaWYgKHNwYWNlLnN1YnNwYWNlX3F1YW50aXR5ID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIE5vdywgcmVhZCBpbiB0aGUgZmlyc3Qgc3Vic3BhY2UgZm9yIHRoaXMgc3BhY2UgKi8KKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKKwkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zdWJzcGFjZV9sb2NhdGlvbgorCQkgICAgICsgc3BhY2Uuc3Vic3BhY2VfaW5kZXggKiBzaXplb2Ygc3Vic3BhY2UpLAorCQkgICAgU0VFS19TRVQpIDwgMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGlmIChiZmRfcmVhZCAoJnN1YnNwYWNlLCAxLCBzaXplb2Ygc3Vic3BhY2UsIGFiZmQpICE9IHNpemVvZiBzdWJzcGFjZSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIC8qIFNlZWsgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlcyBmb3IgbG9vcCBiZWxvdyAqLworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAorCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCisJCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCisJCSAgICBTRUVLX1NFVCkgPCAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICAvKiBTZXR1cCB0aGUgc3RhcnQgYWRkcmVzcyBhbmQgZmlsZSBsb2MgZnJvbSB0aGUgZmlyc3Qgc3Vic3BhY2UgcmVjb3JkICovCisgICAgICBzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7CisgICAgICBzcGFjZV9hc2VjdC0+ZmlsZXBvcyA9IHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUgKyBjdXJyZW50X29mZnNldDsKKyAgICAgIHNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBsb2cyIChzdWJzcGFjZS5hbGlnbm1lbnQpOworICAgICAgaWYgKHNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPT0gLTEpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIEluaXRpYWxpemUgc2F2ZV9zdWJzcGFjZSBzbyB3ZSBjYW4gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIHRoaXMKKwkgbG9vcCBwbGFjZWQgYW55IHVzZWZ1bCB2YWx1ZXMgaW50byBpdC4gICovCisgICAgICBtZW1zZXQgKCZzYXZlX3N1YnNwYWNlLCAwLCBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpOworCisgICAgICAvKiBMb29wIG92ZXIgdGhlIHJlc3Qgb2YgdGhlIHN1YnNwYWNlcywgYnVpbGRpbmcgdXAgbW9yZSBzZWN0aW9ucyAqLworICAgICAgZm9yIChzdWJzcGFjZV9pbmRleCA9IDA7IHN1YnNwYWNlX2luZGV4IDwgc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHk7CisJICAgc3Vic3BhY2VfaW5kZXgrKykKKwl7CisJICBhc2VjdGlvbiAqc3Vic3BhY2VfYXNlY3Q7CisKKwkgIC8qIFJlYWQgaW4gdGhlIG5leHQgc3Vic3BhY2UgKi8KKwkgIGlmIChiZmRfcmVhZCAoJnN1YnNwYWNlLCAxLCBzaXplb2Ygc3Vic3BhY2UsIGFiZmQpCisJICAgICAgIT0gc2l6ZW9mIHN1YnNwYWNlKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgLyogU2V0dXAgdGhlIHN1YnNwYWNlIG5hbWUgc3RyaW5nICovCisJICBzdWJzcGFjZS5uYW1lLm5fbmFtZSA9IHN1YnNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKKworCSAgbmV3bmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzdWJzcGFjZS5uYW1lLm5fbmFtZSkgKyAxKTsKKwkgIGlmICghbmV3bmFtZSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBzdHJjcHkgKG5ld25hbWUsIHN1YnNwYWNlLm5hbWUubl9uYW1lKTsKKworCSAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIHRoaXMgc3Vic3BhY2UgKi8KKwkgIHN1YnNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOworCSAgaWYgKCFzdWJzcGFjZV9hc2VjdCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIC8qIFN0b3JlIHByaXZhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlY3Rpb24uICAqLworCSAgaWYgKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc3Vic3BhY2VfYXNlY3QsIHNwYWNlX2FzZWN0LAorCQkJCQkJIHN1YnNwYWNlLmFjY2Vzc19jb250cm9sX2JpdHMsCisJCQkJCQkgc3Vic3BhY2Uuc29ydF9rZXksCisJCQkJCQkgc3Vic3BhY2UucXVhZHJhbnQpID09IGZhbHNlKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgLyogS2VlcCBhbiBlYXN5IG1hcHBpbmcgYmV0d2VlbiBzdWJzcGFjZXMgYW5kIHNlY3Rpb25zLiAKKwkgICAgIE5vdGUgd2UgZG8gbm90IG5lY2Vzc2FyaWx5IHJlYWQgdGhlIHN1YnNwYWNlcyBpbiB0aGUKKwkgICAgIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLgorCisJICAgICBTbyB0byBtYWtlIHRoZSB0YXJnZXQgaW5kZXggY29tZSBvdXQgY29ycmVjdGx5LCB3ZQorCSAgICAgc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZSBoZWFkZXIgaW4gdGFyZ2V0CisJICAgICBpbmRleCwgdGhlbiBzb3J0IHVzaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3Vic3BhY2UKKwkgICAgIGhlYWRlciBhcyB0aGUga2V5LiAgVGhlbiB3ZSBjYW4gYXNzaWduIGNvcnJlY3QKKwkgICAgIHN1YnNwYWNlIGluZGljZXMuICAqLworCSAgdG90YWxfc3Vic3BhY2VzKys7CisJICBzdWJzcGFjZV9hc2VjdC0+dGFyZ2V0X2luZGV4ID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdWJzcGFjZSk7CisKKwkgIC8qIFNldCBTRUNfUkVBRE9OTFkgYW5kIFNFQ19DT0RFL1NFQ19EQVRBIGFzIHNwZWNpZmllZAorCSAgICAgYnkgdGhlIGFjY2Vzc19jb250cm9sX2JpdHMgaW4gdGhlIHN1YnNwYWNlIGhlYWRlci4gICovCisJICBzd2l0Y2ggKHN1YnNwYWNlLmFjY2Vzc19jb250cm9sX2JpdHMgPj4gNCkKKwkgICAgeworCSAgICAvKiBSZWFkb25seSBkYXRhLiAgKi8gIAorCSAgICBjYXNlIDB4MDoKKwkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfUkVBRE9OTFk7CisJICAgICAgYnJlYWs7CisKKwkgICAgLyogTm9ybWFsIGRhdGEuICAqLyAgCisJICAgIGNhc2UgMHgxOgorCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQTsKKwkgICAgICBicmVhazsKKworCSAgICAvKiBSZWFkb25seSBjb2RlIGFuZCB0aGUgZ2F0ZXdheXMuCisJICAgICAgIEdhdGV3YXlzIGhhdmUgb3RoZXIgYXR0cmlidXRlcyB3aGljaCBkbyBub3QgbWFwCisJICAgICAgIGludG8gYW55dGhpbmcgQkZEIGtub3dzIGFib3V0LiAgKi8KKwkgICAgY2FzZSAweDI6CisJICAgIGNhc2UgMHg0OgorCSAgICBjYXNlIDB4NToKKwkgICAgY2FzZSAweDY6CisJICAgIGNhc2UgMHg3OgorCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19SRUFET05MWTsKKwkgICAgICBicmVhazsKKworCSAgICAvKiBkeW5hbWljICh3cml0YWJsZSkgY29kZS4gICovCisJICAgIGNhc2UgMHgzOgorCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgCisJICBpZiAoc3Vic3BhY2UuZHVwX2NvbW1vbiB8fCBzdWJzcGFjZS5pc19jb21tb24pIAorCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKKwkgIGVsc2UgaWYgKHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCA+IDApCisJICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOworCisJICBpZiAoc3Vic3BhY2UuaXNfbG9hZGFibGUpCisJICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKKwkgIGVsc2UKKwkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7CisKKwkgIGlmIChzdWJzcGFjZS5jb2RlX29ubHkpCisJICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfQ09ERTsKKworCSAgLyogQm90aCBmaWxlX2xvY19pbml0X3ZhbHVlIGFuZCBpbml0aWFsaXphdGlvbl9sZW5ndGggd2lsbAorCSAgICAgYmUgemVybyBmb3IgYSBCU1MgbGlrZSBzdWJzcGFjZS4gICovCisJICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA9PSAwCisJICAgICAgJiYgc3Vic3BhY2UuaW5pdGlhbGl6YXRpb25fbGVuZ3RoID09IDApCisJICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyAmPSB+KFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKTsKKworCSAgLyogVGhpcyBzdWJzcGFjZSBoYXMgcmVsb2NhdGlvbnMuCisJICAgICBUaGUgZml4dXBfcmVxdWVzdF9xdWFudGl0eSBpcyBhIGJ5dGUgY291bnQgZm9yIHRoZSBudW1iZXIgb2YKKwkgICAgIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtOyBpdCBpcyBub3QgdGhlIGFjdHVhbCBudW1iZXIKKwkgICAgIG9mIHJlbG9jYXRpb25zIGluIHRoZSBzdWJzcGFjZS4gICovCisJICBpZiAoc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eSAhPSAwKQorCSAgICB7CisJICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19SRUxPQzsKKwkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsX2ZpbGVwb3MgPSBzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X2luZGV4OworCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlX2FzZWN0KS0+cmVsb2Nfc2l6ZQorCQk9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfcXVhbnRpdHk7CisJICAgICAgLyogV2UgY2FuIG5vdCBkZXRlcm1pbmUgdGhpcyB5ZXQuICBXaGVuIHdlIHJlYWQgaW4gdGhlIAorCQkgcmVsb2NhdGlvbiB0YWJsZSB0aGUgY29ycmVjdCB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbi4gICovCisJICAgICAgc3Vic3BhY2VfYXNlY3QtPnJlbG9jX2NvdW50ID0gLTE7CisJICAgIH0KKworCSAgLyogVXBkYXRlIHNhdmVfc3Vic3BhY2UgaWYgYXBwcm9wcmlhdGUuICAqLworCSAgaWYgKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUgPiBzYXZlX3N1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUpCisJICAgIHNhdmVfc3Vic3BhY2UgPSBzdWJzcGFjZTsKKworCSAgc3Vic3BhY2VfYXNlY3QtPnZtYSA9IHN1YnNwYWNlLnN1YnNwYWNlX3N0YXJ0OworCSAgc3Vic3BhY2VfYXNlY3QtPl9jb29rZWRfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKKwkgIHN1YnNwYWNlX2FzZWN0LT5fcmF3X3NpemUgPSBzdWJzcGFjZS5zdWJzcGFjZV9sZW5ndGg7CisJICBzdWJzcGFjZV9hc2VjdC0+ZmlsZXBvcyA9IChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlCisJCQkJICAgICArIGN1cnJlbnRfb2Zmc2V0KTsKKwkgIHN1YnNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBsb2cyIChzdWJzcGFjZS5hbGlnbm1lbnQpOworCSAgaWYgKHN1YnNwYWNlX2FzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPT0gLTEpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBhIC5vIHdoaWNoIGRlZmluZXMgc3ltYm9scyBpbiBvdGhlcndpc2UKKyAgICAgICAgIGVtcHR5IHN1YnNwYWNlcy4gICovCisgICAgICBpZiAoIXNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKKwl7CisJICBzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gMDsKKwkgIHNwYWNlX2FzZWN0LT5fcmF3X3NpemUgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBTZXR1cCB0aGUgc2l6ZXMgZm9yIHRoZSBzcGFjZSBzZWN0aW9uIGJhc2VkIHVwb24gdGhlIGluZm8gaW4gdGhlCisJICAgICBsYXN0IHN1YnNwYWNlIG9mIHRoZSBzcGFjZS4gICovCisJICBzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gKHNhdmVfc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQKKwkJCQkgICAgICAgLSBzcGFjZV9hc2VjdC0+dm1hCisJCQkJICAgICAgICsgc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9sZW5ndGgpOworCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IChzYXZlX3N1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKKwkJCQkgICAgLSBzcGFjZV9hc2VjdC0+ZmlsZXBvcworCQkJCSAgICArIHNhdmVfc3Vic3BhY2UuaW5pdGlhbGl6YXRpb25fbGVuZ3RoKTsKKwl9CisgICAgfQorICAvKiBOb3cgdGhhdCB3ZSd2ZSByZWFkIGluIGFsbCB0aGUgc3Vic3BhY2UgcmVjb3Jkcywgd2UgbmVlZCB0byBhc3NpZ24KKyAgICAgYSB0YXJnZXQgaW5kZXggdG8gZWFjaCBzdWJzcGFjZS4gICovCisgIHN1YnNwYWNlX3NlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jICh0b3RhbF9zdWJzcGFjZXMKKwkJCQkJCSogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgIGlmIChzdWJzcGFjZV9zZWN0aW9ucyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCisgICAgeworICAgICAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQorCWNvbnRpbnVlOworCisgICAgICBzdWJzcGFjZV9zZWN0aW9uc1tpXSA9IHNlY3Rpb247CisgICAgICBpKys7CisgICAgfQorICBxc29ydCAoc3Vic3BhY2Vfc2VjdGlvbnMsIHRvdGFsX3N1YnNwYWNlcywKKwkgc2l6ZW9mIChhc2VjdGlvbiAqKSwgY29tcGFyZV9zdWJzcGFjZXMpOworICAKKyAgLyogc3Vic3BhY2Vfc2VjdGlvbnMgaXMgbm93IHNvcnRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHN1YnNwYWNlcworICAgICBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgQXNzaWduIGFuIGluZGV4IHRvIGVhY2ggb25lIG5vdy4gICovCisgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9zdWJzcGFjZXM7IGkrKykKKyAgICBzdWJzcGFjZV9zZWN0aW9uc1tpXS0+dGFyZ2V0X2luZGV4ID0gaTsKKworICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQorICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOworCisgIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQorICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKHNwYWNlX3N0cmluZ3MgIT0gTlVMTCkKKyAgICBmcmVlIChzcGFjZV9zdHJpbmdzKTsKKworICBpZiAoc3Vic3BhY2Vfc2VjdGlvbnMgIT0gTlVMTCkKKyAgICBmcmVlIChzdWJzcGFjZV9zZWN0aW9ucyk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogUmVhZCBpbiBhIFNPTSBvYmplY3QgYW5kIG1ha2UgaXQgaW50byBhIEJGRC4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK3NvbV9vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgaGVhZGVyIGZpbGVfaGRyOworICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyIGF1eF9oZHI7CisgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOworICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3RfaGVhZGVyOworICBzdHJ1Y3Qgc29tX2VudHJ5IHNvbV9lbnRyeTsKKyNkZWZpbmUgRU5UUllfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9lbnRyeSkKKworICBpZiAoYmZkX3JlYWQgKChQVFIpICYgZmlsZV9oZHIsIDEsIEZJTEVfSERSX1NJWkUsIGFiZmQpICE9IEZJTEVfSERSX1NJWkUpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICghX1BBX1JJU0NfSUQgKGZpbGVfaGRyLnN5c3RlbV9pZCkpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3dpdGNoIChmaWxlX2hkci5hX21hZ2ljKQorICAgIHsKKyAgICBjYXNlIFJFTE9DX01BR0lDOgorICAgIGNhc2UgRVhFQ19NQUdJQzoKKyAgICBjYXNlIFNIQVJFX01BR0lDOgorICAgIGNhc2UgREVNQU5EX01BR0lDOgorI2lmZGVmIERMX01BR0lDCisgICAgY2FzZSBETF9NQUdJQzoKKyNlbmRpZgorI2lmZGVmIFNITF9NQUdJQworICAgIGNhc2UgU0hMX01BR0lDOgorI2VuZGlmCisjaWZkZWYgU0hBUkVEX01BR0lDX0NOWAorICAgIGNhc2UgU0hBUkVEX01BR0lDX0NOWDoKKyNlbmRpZgorICAgICAgYnJlYWs7CisKKyNpZmRlZiBFWEVDTElCTUFHSUMKKyAgICBjYXNlIEVYRUNMSUJNQUdJQzoKKyAgICAgIC8qIFJlYWQgdGhlIGxzdCBoZWFkZXIgYW5kIGRldGVybWluZSB3aGVyZSB0aGUgU09NIGRpcmVjdG9yeSBiZWdpbnMgKi8KKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3RfaGVhZGVyLCAxLCBTTFNUSERSLCBhYmZkKSAhPSBTTFNUSERSKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAvKiBQb3NpdGlvbiB0byBhbmQgcmVhZCB0aGUgZmlyc3QgZGlyZWN0b3J5IGVudHJ5ICovCisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2hlYWRlci5kaXJfbG9jLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgc29tX2VudHJ5LCAxLCBFTlRSWV9TSVpFLCBhYmZkKSAhPSBFTlRSWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAvKiBOb3cgcG9zaXRpb24gdG8gdGhlIGZpcnN0IFNPTSAqLworCisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNvbV9lbnRyeS5sb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgY3VycmVudF9vZmZzZXQgPSBzb21fZW50cnkubG9jYXRpb247CisKKyAgICAgIC8qIEFuZCBmaW5hbGx5LCByZS1yZWFkIHRoZSBzb20gaGVhZGVyICovCisKKyAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKKwkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoZmlsZV9oZHIudmVyc2lvbl9pZCAhPSBWRVJTSU9OX0lECisgICAgICAmJiBmaWxlX2hkci52ZXJzaW9uX2lkICE9IE5FV19WRVJTSU9OX0lEKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIElmIHRoZSBhdXhfaGVhZGVyX3NpemUgZmllbGQgaW4gdGhlIGZpbGUgaGVhZGVyIGlzIHplcm8sIHRoZW4gdGhpcworICAgICBvYmplY3QgaXMgYW4gaW5jb21wbGV0ZSBleGVjdXRhYmxlIChhIC5vIGZpbGUpLiAgRG8gbm90IHRyeSB0byByZWFkCisgICAgIGEgbm9uLWV4aXN0YW50IGF1eGlsaWFyeSBoZWFkZXIuICAqLworICBtZW1zZXQgKCZhdXhfaGRyLCAwLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpKTsKKyAgaWYgKGZpbGVfaGRyLmF1eF9oZWFkZXJfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBhdXhfaGRyLCAxLCBBVVhfSERSX1NJWkUsIGFiZmQpICE9IEFVWF9IRFJfU0laRSkKKwl7CisJICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBpZiAoIXNldHVwX3NlY3Rpb25zIChhYmZkLCAmZmlsZV9oZHIsIGN1cnJlbnRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAvKiBzZXR1cF9zZWN0aW9ucyBkb2VzIG5vdCBidWJibGUgdXAgYSBiZmQgZXJyb3IgY29kZS4gICovCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBTT00gb2JqZWN0LiAgRG8gc29tZSBpbml0aWFsaXphdGlvbi4gICovCisgIHJldHVybiBzb21fb2JqZWN0X3NldHVwIChhYmZkLCAmZmlsZV9oZHIsICZhdXhfaGRyLCBjdXJyZW50X29mZnNldCk7Cit9CisKKy8qIENyZWF0ZSBhIFNPTSBvYmplY3QuICAqLworCitzdGF0aWMgYm9vbGVhbgorc29tX21rb2JqZWN0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIGJhY2tlbmQgaW5mb3JtYXRpb24uICAqLworICBhYmZkLT50ZGF0YS5zb21fZGF0YSA9IChzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0ICopCisgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0KSk7CisgIGlmIChhYmZkLT50ZGF0YS5zb21fZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEluaXRpYWxpemUgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZSBoZWFkZXIuICBUaGlzIHJvdXRpbmUgbWFrZXMKKyAgIG5vdCBhdHRlbXB0IGF0IGRvaW5nIHRoZSByaWdodCB0aGluZyBmb3IgYSBmdWxsIGV4ZWN1dGFibGU7IGl0CisgICBpcyBvbmx5IG1lYW50IHRvIGhhbmRsZSByZWxvY2F0YWJsZSBvYmplY3RzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV9wcmVwX2hlYWRlcnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7CisgIGFzZWN0aW9uICpzZWN0aW9uOworCisgIC8qIE1ha2UgYW5kIGF0dGFjaCBhIGZpbGUgaGVhZGVyIHRvIHRoZSBCRkQuICAqLworICBmaWxlX2hkciA9IChzdHJ1Y3QgaGVhZGVyICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGhlYWRlcikpOworICBpZiAoZmlsZV9oZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpID0gZmlsZV9oZHI7CisKKyAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQorICAgIHsKKworICAgICAgLyogTWFrZSBhbmQgYXR0YWNoIGFuIGV4ZWMgaGVhZGVyIHRvIHRoZSBCRkQuICAqLworICAgICAgb2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPSAoc3RydWN0IHNvbV9leGVjX2F1eGhkciAqKQorCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOworICAgICAgaWYgKG9ial9zb21fZXhlY19oZHIgKGFiZmQpID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQorCWZpbGVfaGRyLT5hX21hZ2ljID0gREVNQU5EX01BR0lDOworICAgICAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiBXUF9URVhUKQorCWZpbGVfaGRyLT5hX21hZ2ljID0gU0hBUkVfTUFHSUM7CisjaWZkZWYgU0hMX01BR0lDCisgICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpCisJZmlsZV9oZHItPmFfbWFnaWMgPSBTSExfTUFHSUM7CisjZW5kaWYKKyAgICAgIGVsc2UKKwlmaWxlX2hkci0+YV9tYWdpYyA9IEVYRUNfTUFHSUM7CisgICAgfQorICBlbHNlCisgICAgZmlsZV9oZHItPmFfbWFnaWMgPSBSRUxPQ19NQUdJQzsKKworICAvKiBPbmx5IG5ldyBmb3JtYXQgU09NIGlzIHN1cHBvcnRlZC4gICovCisgIGZpbGVfaGRyLT52ZXJzaW9uX2lkID0gTkVXX1ZFUlNJT05fSUQ7CisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCwgYW5kIGVtYmVkZGluZyB0aW1lc3RhbXBzIGlzIG5vdCBhbHdheXMKKyAgICAgYSB3aXNlIHRoaW5nIHRvIGRvLCBpdCBtYWtlcyBjb21wYXJpbmcgb2JqZWN0cyBkdXJpbmcgYSBtdWx0aS1zdGFnZQorICAgICBib290c3RyYXAgZGlmZmljdWx0LiAgKi8KKyAgZmlsZV9oZHItPmZpbGVfdGltZS5zZWNzID0gMDsKKyAgZmlsZV9oZHItPmZpbGVfdGltZS5uYW5vc2VjcyA9IDA7IAorCisgIGZpbGVfaGRyLT5lbnRyeV9zcGFjZSA9IDA7CisgIGZpbGVfaGRyLT5lbnRyeV9zdWJzcGFjZSA9IDA7CisgIGZpbGVfaGRyLT5lbnRyeV9vZmZzZXQgPSAwOworICBmaWxlX2hkci0+cHJlc3VtZWRfZHAgPSAwOworCisgIC8qIE5vdyBpdGVyYXRlIG92ZXIgdGhlIHNlY3Rpb25zIHRyYW5zbGF0aW5nIGluZm9ybWF0aW9uIGZyb20KKyAgICAgQkZEIHNlY3Rpb25zIHRvIFNPTSBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KKworICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKKyAgICB7CisgICAgICAvKiBJZ25vcmUgYW55dGhpbmcgd2hpY2ggaGFzIG5vdCBiZWVuIG1hcmtlZCBhcyBhIHNwYWNlIG9yCisJIHN1YnNwYWNlLiAgKi8KKyAgICAgIGlmICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSAmJiAhc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKKwljb250aW51ZTsKKyAgICAgIAorICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCisJeworCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KKwkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0CisJICAgID0gKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQorCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7CisJICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLyogU2V0IHNwYWNlIGF0dHJpYnV0ZXMuICBOb3RlIG1vc3QgYXR0cmlidXRlcyBvZiBTT00gc3BhY2VzCisJICAgICBhcmUgc2V0IGJhc2VkIG9uIHRoZSBzdWJzcGFjZXMgaXQgY29udGFpbnMuICAqLworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmxvYWRlcl9maXhfaW5kZXggPSAtMTsKKwkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pbml0X3BvaW50ZXJfaW5kZXggPSAtMTsKKworCSAgLyogU2V0IG1vcmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgc3R1ZmZlZCBhd2F5IGluIHByaXZhdGUgZGF0YS4gICovCisJICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c29ydF9rZXkgPSAKKwkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXk7CisJICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfZGVmaW5lZCA9IAorCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19kZWZpbmVkOworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmlzX3ByaXZhdGUgPSAKKwkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfcHJpdmF0ZTsKKwkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zcGFjZV9udW1iZXIgPQorCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zcGFjZV9udW1iZXI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeS4gICovCisJICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdAorCSAgICA9IChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKikKKwkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpOworCSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0ID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogU2V0IHN1YnNwYWNlIGF0dHJpYnV0ZXMuICBCYXNpYyBzdHVmZiBpcyBkb25lIGhlcmUsIGFkZGl0aW9uYWwKKwkgICAgIGF0dHJpYnV0ZXMgYXJlIGZpbGxlZCBpbiBsYXRlciBhcyBtb3JlIGluZm9ybWF0aW9uIGJlY29tZXMKKwkgICAgIGF2YWlsYWJsZS4gICovCisJICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKQorCSAgICB7CisJICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmR1cF9jb21tb24gPSAxOworCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5pc19jb21tb24gPSAxOworCSAgICB9CisKKwkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykKKwkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2xvYWRhYmxlID0gMTsKKworCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCisJICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5jb2RlX29ubHkgPSAxOworCisJICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2Vfc3RhcnQgPSAKKwkgICAgc2VjdGlvbi0+dm1hOworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnN1YnNwYWNlX2xlbmd0aCA9CisJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmluaXRpYWxpemF0aW9uX2xlbmd0aCA9CisJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFsaWdubWVudCA9IAorCSAgICAxIDw8IHNlY3Rpb24tPmFsaWdubWVudF9wb3dlcjsKKworCSAgLyogU2V0IG1vcmUgYXR0cmlidXRlcyB0aGF0IHdlcmUgc3R1ZmZlZCBhd2F5IGluIHByaXZhdGUgZGF0YS4gICovCisJICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c29ydF9rZXkgPQorCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKKwkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5hY2Nlc3NfY29udHJvbF9iaXRzID0KKwkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+YWNjZXNzX2NvbnRyb2xfYml0czsKKwkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5xdWFkcmFudCA9CisJICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnF1YWRyYW50OworCX0KKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV9pc19zcGFjZSAoc2VjdGlvbikKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKKyAgICAgc3Vic3BhY2UuICAqLworICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpc24ndCB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKKyAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3BhY2UuICAqLworICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyICE9IHNlY3Rpb24KKyAgICAgICYmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCisJICAhPSBzZWN0aW9uKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogT0suICBNdXN0IGJlIGEgc3BhY2UuICAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNlY3Rpb24gaXMgYSBTT00gc3Vic3BhY2UsIGZhbHNlIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pCisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICAvKiBJZiBubyBjb3B5IGRhdGEgaXMgYXZhaWxhYmxlLCB0aGVuIGl0J3MgbmVpdGhlciBhIHNwYWNlIG5vciBhCisgICAgIHN1YnNwYWNlLiAgKi8KKyAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogSWYgdGhlIGNvbnRhaW5pbmcgc3BhY2UgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHNlY3Rpb24sCisgICAgIHRoZW4gdGhpcyBpc24ndCBhIHN1YnNwYWNlLiAgKi8KKyAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzZWN0aW9uCisgICAgICB8fCAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyLT5vdXRwdXRfc2VjdGlvbgorCSAgPT0gc2VjdGlvbikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIE9LLiAgTXVzdCBiZSBhIHN1YnNwYWNlLiAgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzcGFjZSBjb250YWluaW5zIHRoZSBnaXZlbiBzdWJzcGFjZS4gIEl0CisgICBpcyBzYWZlIHRvIGFzc3VtZSBzcGFjZSByZWFsbHkgaXMgYSBzcGFjZSwgYW5kIHN1YnNwYWNlIHJlYWxseQorICAgaXMgYSBzdWJzcGFjZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzb21faXNfY29udGFpbmVyIChzcGFjZSwgc3Vic3BhY2UpCisgICAgIGFzZWN0aW9uICpzcGFjZSwgKnN1YnNwYWNlOworeworICByZXR1cm4gKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXIgPT0gc3BhY2UKKwkgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzdWJzcGFjZSktPmNvcHlfZGF0YS0+Y29udGFpbmVyLT5vdXRwdXRfc2VjdGlvbgorCSAgICAgID09IHNwYWNlKSk7Cit9CisKKy8qIENvdW50IGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitzb21fY291bnRfc3BhY2VzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBjb3VudCA9IDA7CisgIGFzZWN0aW9uICpzZWN0aW9uOworCisgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorICAgICAgY291bnQgKz0gc29tX2lzX3NwYWNlIChzZWN0aW9uKTsKKworICByZXR1cm4gY291bnQ7Cit9CisKKy8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBCRkQuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpbnQgY291bnQgPSAwOworICBhc2VjdGlvbiAqc2VjdGlvbjsKKworICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKKyAgICBjb3VudCArPSBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pOworCisgIHJldHVybiBjb3VudDsKK30KKworLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN5bTEgYW5kIHN5bTIuCisKKyAgIFdlIGRlc2lyZSBzeW1ib2xzIHRvIGJlIG9yZGVyZWQgc3RhcnRpbmcgd2l0aCB0aGUgc3ltYm9sIHdpdGggdGhlCisgICBoaWdoZXN0IHJlbG9jYXRpb24gY291bnQgZG93biB0byB0aGUgc3ltYm9sIHdpdGggdGhlIGxvd2VzdCByZWxvY2F0aW9uCisgICBjb3VudC4gIERvaW5nIHNvIGNvbXBhY3RzIHRoZSByZWxvY2F0aW9uIHN0cmVhbS4gICovCisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfc3ltcyAoYXJnMSwgYXJnMikKKyAgICAgY29uc3QgUFRSIGFyZzE7CisgICAgIGNvbnN0IFBUUiBhcmcyOworCit7CisgIGFzeW1ib2wgKipzeW0xID0gKGFzeW1ib2wgKiopIGFyZzE7CisgIGFzeW1ib2wgKipzeW0yID0gKGFzeW1ib2wgKiopIGFyZzI7CisgIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKKyAgCisgIC8qIEdldCByZWxvY2F0aW9uIGNvdW50IGZvciBlYWNoIHN5bWJvbC4gIE5vdGUgdGhhdCB0aGUgY291bnQKKyAgICAgaXMgc3RvcmVkIGluIHRoZSB1ZGF0YSBwb2ludGVyIGZvciBzZWN0aW9uIHN5bWJvbHMhICAqLworICBpZiAoKCpzeW0xKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisgICAgY291bnQxID0gKCpzeW0xKS0+dWRhdGEuaTsKKyAgZWxzZQorICAgIGNvdW50MSA9IHNvbV9zeW1ib2xfZGF0YSAoKnN5bTEpLT5yZWxvY19jb3VudDsKKworICBpZiAoKCpzeW0yKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisgICAgY291bnQyID0gKCpzeW0yKS0+dWRhdGEuaTsKKyAgZWxzZQorICAgIGNvdW50MiA9IHNvbV9zeW1ib2xfZGF0YSAoKnN5bTIpLT5yZWxvY19jb3VudDsKKworICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHZhbHVlLiAgKi8KKyAgaWYgKGNvdW50MSA8IGNvdW50MikKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoY291bnQxID4gY291bnQyKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiAtMSwgMCwgMSBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBzdWJzcGFjZTEKKyAgIGFuZCBzdWJzcGFjZS4gICovCisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfc3Vic3BhY2VzIChhcmcxLCBhcmcyKQorICAgICBjb25zdCBQVFIgYXJnMTsKKyAgICAgY29uc3QgUFRSIGFyZzI7CisKK3sKKyAgYXNlY3Rpb24gKipzdWJzcGFjZTEgPSAoYXNlY3Rpb24gKiopIGFyZzE7CisgIGFzZWN0aW9uICoqc3Vic3BhY2UyID0gKGFzZWN0aW9uICoqKSBhcmcyOworICB1bnNpZ25lZCBpbnQgY291bnQxLCBjb3VudDI7CisgIAorICBpZiAoKCpzdWJzcGFjZTEpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMiktPnRhcmdldF9pbmRleCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKCgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4IDwgKCpzdWJzcGFjZTEpLT50YXJnZXRfaW5kZXgpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogUGVyZm9ybSB2YXJpb3VzIHdvcmsgaW4gcHJlcGFyYXRpb24gZm9yIGVtaXR0aW5nIHRoZSBmaXh1cCBzdHJlYW0uICAqLworCitzdGF0aWMgdm9pZAorc29tX3ByZXBfZm9yX2ZpeHVwcyAoYWJmZCwgc3ltcywgbnVtX3N5bXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKnN5bXM7CisgICAgIHVuc2lnbmVkIGxvbmcgbnVtX3N5bXM7Cit7CisgIGludCBpOworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOworCisgIC8qIE1vc3QgU09NIHJlbG9jYXRpb25zIGludm9sdmluZyBhIHN5bWJvbCBoYXZlIGEgbGVuZ3RoIHdoaWNoIGlzCisgICAgIGRlcGVuZGVudCBvbiB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbC4gIFNvIHN5bWJvbHMgd2hpY2ggYXJlCisgICAgIHVzZWQgb2Z0ZW4gaW4gcmVsb2NhdGlvbnMgc2hvdWxkIGhhdmUgYSBzbWFsbCBpbmRleC4gICovCisKKyAgLyogRmlyc3QgaW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgZm9yIGVhY2ggc3ltYm9sLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCisgICAgeworICAgICAgLyogSGFuZGxlIGEgc2VjdGlvbiBzeW1ib2w7IHRoZXNlIGhhdmUgbm8gcG9pbnRlcnMgYmFjayB0byB0aGUKKwkgU09NIHN5bWJvbCBpbmZvLiAgU28gd2UganVzdCB1c2UgdGhlIHVkYXRhIGZpZWxkIHRvIGhvbGQgdGhlCisJIHJlbG9jYXRpb24gY291bnQuICAqLworICAgICAgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltc1tpXSkgPT0gTlVMTAorCSAgfHwgc3ltc1tpXS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisJeworCSAgc3ltc1tpXS0+ZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOworCSAgc3ltc1tpXS0+dWRhdGEuaSA9IDA7CisJfQorICAgICAgZWxzZQorCXNvbV9zeW1ib2xfZGF0YSAoc3ltc1tpXSktPnJlbG9jX2NvdW50ID0gMDsKKyAgICB9CisKKyAgLyogTm93IHRoYXQgdGhlIGNvdW50ZXJzIGFyZSBpbml0aWFsaXplZCwgbWFrZSBhIHdlaWdodGVkIGNvdW50CisgICAgIG9mIGhvdyBvZnRlbiBhIGdpdmVuIHN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2NhdGlvbi4gICovCisgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICAvKiBEb2VzIHRoaXMgc2VjdGlvbiBoYXZlIGFueSByZWxvY2F0aW9ucz8gICovCisgICAgICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPD0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogV2FsayB0aHJvdWdoIGVhY2ggcmVsb2NhdGlvbiBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KKyAgICAgIGZvciAoaSA9IDE7IGkgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgaSsrKQorCXsKKwkgIGFyZWxlbnQgKnJlbG9jID0gc2VjdGlvbi0+b3JlbG9jYXRpb25baV07CisJICBpbnQgc2NhbGU7CisKKwkgIC8qIEEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSAqQUJTKiBzZWN0aW9uIHJlYWxseQorCSAgICAgZG9lcyBub3QgaGF2ZSBhIHN5bWJvbC4gIExpa2V3aXNlIGlmIHRoZSBzeW1ib2wgaXNuJ3QgYXNzb2NpYXRlZAorCSAgICAgd2l0aCBhbnkgc2VjdGlvbi4gICovCisJICBpZiAocmVsb2MtPnN5bV9wdHJfcHRyID09IE5VTEwKKwkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKCgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+c2VjdGlvbikpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBTY2FsaW5nIHRvIGVuY291cmFnZSBzeW1ib2xzIGludm9sdmVkIGluIFJfRFBfUkVMQVRJVkUgCisJICAgICBhbmQgUl9DT0RFX09ORV9TWU1CT0wgcmVsb2NhdGlvbnMgdG8gY29tZSBmaXJzdC4gIFRoZXNlCisJICAgICB0d28gcmVsb2NhdGlvbnMgaGF2ZSBzaW5nbGUgYnl0ZSB2ZXJzaW9ucyBpZiB0aGUgc3ltYm9sCisJICAgICBpbmRleCBpcyB2ZXJ5IHNtYWxsLiAgKi8KKwkgIGlmIChyZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9EUF9SRUxBVElWRQorCSAgICAgIHx8IHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0NPREVfT05FX1NZTUJPTCkKKwkgICAgc2NhbGUgPSAyOworCSAgZWxzZQorCSAgICBzY2FsZSA9IDE7CisKKwkgIC8qIEhhbmRsZSBzZWN0aW9uIHN5bWJvbHMgYnkgc3RvcmluZyB0aGUgY291bnQgaW4gdGhlIHVkYXRhCisJICAgICBmaWVsZC4gIEl0IHdpbGwgbm90IGJlIHVzZWQgYW5kIHRoZSBjb3VudCBpcyB2ZXJ5IGltcG9ydGFudAorCSAgICAgZm9yIHRoZXNlIHN5bWJvbHMuICAqLworCSAgaWYgKCgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisJICAgIHsKKwkgICAgICAoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnVkYXRhLmkgPQorCQkoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnVkYXRhLmkgKyBzY2FsZTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBBIG5vcm1hbCBzeW1ib2wuICBJbmNyZW1lbnQgdGhlIGNvdW50LiAgKi8KKwkgIHNvbV9zeW1ib2xfZGF0YSAoKnJlbG9jLT5zeW1fcHRyX3B0ciktPnJlbG9jX2NvdW50ICs9IHNjYWxlOworCX0KKyAgICB9CisKKyAgLyogU29ydCBhIGNvcHkgb2YgdGhlIHN5bWJvbCB0YWJsZSwgcmF0aGVyIHRoYW4gdGhlIGNhbm9uaWNhbAorICAgICBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgKi8KKyAgc29ydGVkX3N5bXMgPSAoYXN5bWJvbCAqKikgYmZkX3phbGxvYyAoYWJmZCwgbnVtX3N5bXMgKiBzaXplb2YgKGFzeW1ib2wgKikpOworICBtZW1jcHkgKHNvcnRlZF9zeW1zLCBzeW1zLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgIHFzb3J0IChzb3J0ZWRfc3ltcywgbnVtX3N5bXMsIHNpemVvZiAoYXN5bWJvbCAqKSwgY29tcGFyZV9zeW1zKTsKKyAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBzb3J0ZWRfc3ltczsKKworICAvKiBDb21wdXRlIHRoZSBzeW1ib2wgaW5kZXhlcywgdGhleSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgcmVsb2NhdGlvbgorICAgICBjb2RlLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCisgICAgeworICAgICAgLyogQSBzZWN0aW9uIHN5bWJvbC4gIEFnYWluLCB0aGVyZSBpcyBubyBwb2ludGVyIHRvIGJhY2tlbmQgc3ltYm9sCisJIGluZm9ybWF0aW9uLCBzbyB3ZSByZXVzZSB0aGUgdWRhdGEgZmllbGQgYWdhaW4uICAqLworICAgICAgaWYgKHNvcnRlZF9zeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKKwlzb3J0ZWRfc3ltc1tpXS0+dWRhdGEuaSA9IGk7CisgICAgICBlbHNlCisgICAgICAgIHNvbV9zeW1ib2xfZGF0YSAoc29ydGVkX3N5bXNbaV0pLT5pbmRleCA9IGk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbGVhbgorc29tX3dyaXRlX2ZpeHVwcyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHRvdGFsX3JlbG9jX3NpemVwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7CisgICAgIHVuc2lnbmVkIGludCAqdG90YWxfcmVsb2Nfc2l6ZXA7Cit7CisgIHVuc2lnbmVkIGludCBpLCBqOworICAvKiBDaHVuayBvZiBtZW1vcnkgdGhhdCB3ZSBjYW4gdXNlIGFzIGJ1ZmZlciBzcGFjZSwgdGhlbiB0aHJvdworICAgICBhd2F5LiAgKi8KKyAgdW5zaWduZWQgY2hhciB0bXBfc3BhY2VbU09NX1RNUF9CVUZTSVpFXTsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOworICB1bnNpZ25lZCBpbnQgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7CisgIHVuc2lnbmVkIGludCBudW1fc3BhY2VzID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3RvdGFsOworICBhc2VjdGlvbiAqc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOworCisgIG1lbXNldCAodG1wX3NwYWNlLCAwLCBTT01fVE1QX0JVRlNJWkUpOworICBwID0gdG1wX3NwYWNlOworCisgIC8qIEFsbCB0aGUgZml4dXBzIGZvciBhIHBhcnRpY3VsYXIgc3Vic3BhY2UgYXJlIGVtaXR0ZWQgaW4gYSBzaW5nbGUKKyAgICAgc3RyZWFtLiAgQWxsIHRoZSBzdWJzcGFjZXMgZm9yIGEgcGFydGljdWxhciBzcGFjZSBhcmUgZW1pdHRlZAorICAgICBhcyBhIHNpbmdsZSBzdHJlYW0uCisKKyAgICAgU28sIHRvIGdldCBhbGwgdGhlIGxvY2F0aW9ucyBjb3JyZWN0IG9uZSBtdXN0IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlCisgICAgIHNwYWNlcywgZm9yIGVhY2ggc3BhY2UgaXRlcmF0ZSB0aHJvdWdoIGl0cyBzdWJzcGFjZXMgYW5kIG91dHB1dCBhCisgICAgIGZpeHVwcyBzdHJlYW0uICAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOworCisgICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLworICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQorCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworCisgICAgICAvKiBOb3cgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgaXRzIHN1YnNwYWNlcy4gICovCisgICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKKwkgICBzdWJzZWN0aW9uICE9IE5VTEw7CisJICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCisJeworCSAgaW50IHJlbG9jX29mZnNldCwgY3VycmVudF9yb3VuZGluZ19tb2RlOworCisJICAvKiBGaW5kIGEgc3Vic3BhY2Ugb2YgdGhpcyBzcGFjZS4gICovCisJICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKKwkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBJZiB0aGlzIHN1YnNwYWNlIGRvZXMgbm90IGhhdmUgcmVhbCBkYXRhLCB0aGVuIHdlIGFyZQorCSAgICAgZmluaXNlZCB3aXRoIGl0LiAgKi8KKwkgIGlmICgoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQorCSAgICB7CisJICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKKwkJPSAtMTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBUaGlzIHN1YnNwYWNlIGhhcyBzb21lIHJlbG9jYXRpb25zLiAgUHV0IHRoZSByZWxvY2F0aW9uIHN0cmVhbQorCSAgICAgaW5kZXggaW50byB0aGUgc3Vic3BhY2UgcmVjb3JkLiAgKi8KKwkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maXh1cF9yZXF1ZXN0X2luZGV4CisJICAgID0gdG90YWxfcmVsb2Nfc2l6ZTsKKworCSAgLyogVG8gbWFrZSBsaWZlIGVhc2llciBzdGFydCBvdmVyIHdpdGggYSBjbGVhbiBzbGF0ZSBmb3IgCisJICAgICBlYWNoIHN1YnNwYWNlLiAgU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtCisJICAgICBmb3IgdGhpcyBzdWJzcGFjZSBpbiBwcmVwYXJhdGlvbiBmb3Igd3JpdGluZyBvdXQgaXRzIGZpeHVwCisJICAgICBzdHJlYW0uICAqLworCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCArIHRvdGFsX3JlbG9jX3NpemUsIFNFRUtfU0VUKSA8IDApCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgLyogQnVmZmVyIHNwYWNlIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLiAgSnVzdCBwZXJmb3JtIHNvbWUKKwkgICAgIGluaXRpYWxpemF0aW9uIGhlcmUuICAqLworCSAgcCA9IHRtcF9zcGFjZTsKKwkgIHN1YnNwYWNlX3JlbG9jX3NpemUgPSAwOworCSAgcmVsb2Nfb2Zmc2V0ID0gMDsKKwkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7CisJICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBSX05fTU9ERTsKKworCSAgLyogVHJhbnNsYXRlIGVhY2ggQkZEIHJlbG9jYXRpb24gaW50byBvbmUgb3IgbW9yZSBTT00gCisJICAgICByZWxvY2F0aW9ucy4gICovCisJICBmb3IgKGogPSAwOyBqIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKKwkgICAgeworCSAgICAgIGFyZWxlbnQgKmJmZF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW2pdOworCSAgICAgIHVuc2lnbmVkIGludCBza2lwOworCSAgICAgIGludCBzeW1fbnVtOworCisJICAgICAgLyogR2V0IHRoZSBzeW1ib2wgbnVtYmVyLiAgUmVtZW1iZXIgaXQncyBzdG9yZWQgaW4gYSAKKwkJIHNwZWNpYWwgcGxhY2UgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCisJICAgICAgaWYgKCgqYmZkX3JlbG9jLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQorCQlzeW1fbnVtID0gKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaTsKKwkgICAgICBlbHNlCisJCXN5bV9udW0gPSBzb21fc3ltYm9sX2RhdGEgKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+aW5kZXg7CisJICAgICAgCisJICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBjb3VwbGUgcmVsb2NhdGlvbnMsCisJCSB0aGVuIGR1bXAgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEFsc28gcmVpbml0aWFsaXplCisJCSB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gCisKKwkJIE5vIHNpbmdsZSBCRkQgcmVsb2NhdGlvbiBjb3VsZCBldmVyIHRyYW5zbGF0ZSBpbnRvIG1vcmUKKwkJIHRoYW4gMTAwIGJ5dGVzIG9mIFNPTSByZWxvY2F0aW9ucyAoMjBieXRlcyBpcyBwcm9iYWJseSB0aGUKKwkJIHVwcGVyIGxpbWl0LCBidXQgbGVhdmUgbG90cyBvZiBzcGFjZSBmb3IgZ3Jvd3RoKS4gICovCisJICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyAxMDAgPiBTT01fVE1QX0JVRlNJWkUpCisJCXsKKwkJICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCisJCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCisJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJICBwID0gdG1wX3NwYWNlOworCQkgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7CisJCX0KKworCSAgICAgIC8qIEVtaXQgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyB0byBtYXAgYW55IGJ5dGVzIHdoaWNoIHdlcmUKKwkJIHNraXBwZWQuICAqLworCSAgICAgIHNraXAgPSBiZmRfcmVsb2MtPmFkZHJlc3MgLSByZWxvY19vZmZzZXQ7CisJICAgICAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBza2lwLCBwLAorCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKKworCSAgICAgIC8qIFVwZGF0ZSByZWxvY19vZmZzZXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKworCQkgTWFueSByZWxvY2F0aW9ucyBkbyBub3QgY29uc3VtZSBpbnB1dCBieXRlcy4gIFRoZXkKKwkJIGFyZSBtYXJrZXJzLCBvciBzZXQgc3RhdGUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gc29tZQorCQkgbGF0ZXIgcmVsb2NhdGlvbi4gICovCisJICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQorCQl7CisJCWNhc2UgUl9FTlRSWToKKwkJY2FzZSBSX0FMVF9FTlRSWToKKwkJY2FzZSBSX0VYSVQ6CisJCWNhc2UgUl9OX01PREU6CisJCWNhc2UgUl9TX01PREU6CisJCWNhc2UgUl9EX01PREU6CisJCWNhc2UgUl9SX01PREU6CisJCWNhc2UgUl9GU0VMOgorCQljYXNlIFJfTFNFTDoKKwkJY2FzZSBSX1JTRUw6CisJCWNhc2UgUl9DT01QMToKKwkJY2FzZSBSX0NPTVAyOgorCQljYXNlIFJfQkVHSU5fQlJUQUI6CisJCWNhc2UgUl9FTkRfQlJUQUI6CisJCWNhc2UgUl9CRUdJTl9UUlk6CisJCWNhc2UgUl9FTkRfVFJZOgorCQljYXNlIFJfTjBTRUw6CisJCWNhc2UgUl9OMVNFTDoKKwkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3M7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICByZWxvY19vZmZzZXQgPSBiZmRfcmVsb2MtPmFkZHJlc3MgKyA0OworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBOb3cgdGhlIGFjdHVhbCByZWxvY2F0aW9uIHdlIGNhcmUgYWJvdXQuICAqLworCSAgICAgIHN3aXRjaCAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSkKKwkJeworCQljYXNlIFJfUENSRUxfQ0FMTDoKKwkJY2FzZSBSX0FCU19DQUxMOgorCQkgIHAgPSBzb21fcmVsb2NfY2FsbCAoYWJmZCwgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCisJCQkJICAgICAgYmZkX3JlbG9jLCBzeW1fbnVtLCByZWxvY19xdWV1ZSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBSX0NPREVfT05FX1NZTUJPTDoKKwkJY2FzZSBSX0RQX1JFTEFUSVZFOgorCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQuICAqLworCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCkKKwkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCisJCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKKworCQkgIGlmIChzeW1fbnVtIDwgMHgyMCkKKwkJICAgIHsKKwkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgc3ltX251bSwgcCk7CisJCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKKwkJICAgICAgcCArPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN5bV9udW0gPCAweDEwMCkKKwkJICAgIHsKKwkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzIsIHApOworCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKKwkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKKwkJCQkJICAyLCByZWxvY19xdWV1ZSk7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCisJCSAgICB7CisJCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDMzLCBwKTsKKwkJICAgICAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMSk7CisJCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsgCisJCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCisJCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGFib3J0ICgpOworCQkgIGJyZWFrOworCisJCWNhc2UgUl9EQVRBX09ORV9TWU1CT0w6CisJCWNhc2UgUl9EQVRBX1BMQUJFTDoKKwkJY2FzZSBSX0NPREVfUExBQkVMOgorCQljYXNlIFJfRExUX1JFTDoKKwkJICAvKiBBY2NvdW50IGZvciBhbnkgYWRkZW5kIHVzaW5nIFJfREFUQV9PVkVSUklERS4gICovCisJCSAgaWYgKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgIT0gUl9EQVRBX09ORV9TWU1CT0wKKwkJICAgICAgJiYgYmZkX3JlbG9jLT5hZGRlbmQpCisJCSAgICBwID0gc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAsIAorCQkJCQkgICZzdWJzcGFjZV9yZWxvY19zaXplLCByZWxvY19xdWV1ZSk7CisKKwkJICBpZiAoc3ltX251bSA8IDB4MTAwKQorCQkgICAgeworCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOworCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKKwkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcCwKKwkJCQkJICAyLCByZWxvY19xdWV1ZSk7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwMDAwMDApCisJCSAgICB7CisJCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOworCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKKwkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKKwkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKKwkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYWJvcnQgKCk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBSX0VOVFJZOgorCQkgIHsKKwkJICAgIGludCB0bXA7CisJCSAgICBhcmVsZW50ICp0bXBfcmVsb2MgPSBOVUxMOworCQkgICAgYmZkX3B1dF84IChhYmZkLCBSX0VOVFJZLCBwKTsKKworCQkgICAgLyogUl9FTlRSWSByZWxvY2F0aW9ucyBoYXZlIDY0IGJpdHMgb2YgYXNzb2NpYXRlZAorCQkgICAgICAgZGF0YS4gIFVuZm9ydHVuYXRlbHkgdGhlIGFkZGVuZCBmaWVsZCBvZiBhIGJmZAorCQkgICAgICAgcmVsb2NhdGlvbiBpcyBvbmx5IDMyIGJpdHMuICBTbywgd2Ugc3BsaXQgdXAKKwkJICAgICAgIHRoZSA2NGJpdCB1bndpbmQgaW5mb3JtYXRpb24gYW5kIHN0b3JlIHBhcnQgaW4KKwkJICAgICAgIHRoZSBSX0VOVFJZIHJlbG9jYXRpb24sIGFuZCB0aGUgcmVzdCBpbiB0aGUgUl9FWElUCisJCSAgICAgICByZWxvY2F0aW9uLiAgKi8KKwkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwICsgMSk7CisJCQorCQkgICAgLyogRmluZCB0aGUgbmV4dCBSX0VYSVQgcmVsb2NhdGlvbi4gICovCisJCSAgICBmb3IgKHRtcCA9IGo7IHRtcCA8IHN1YnNlY3Rpb24tPnJlbG9jX2NvdW50OyB0bXArKykKKwkJICAgICAgeworCQkgICAgICAgIHRtcF9yZWxvYyA9IHN1YnNlY3Rpb24tPm9yZWxvY2F0aW9uW3RtcF07CisJCQlpZiAodG1wX3JlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0VYSVQpCisJCQkgIGJyZWFrOworCQkgICAgICB9CisKKwkJICAgIGlmICh0bXAgPT0gc3Vic2VjdGlvbi0+cmVsb2NfY291bnQpCisJCSAgICAgIGFib3J0ICgpOworCisJCSAgICBiZmRfcHV0XzMyIChhYmZkLCB0bXBfcmVsb2MtPmFkZGVuZCwgcCArIDUpOworCQkgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKKwkJCQkJcCwgOSwgcmVsb2NfcXVldWUpOworCQkgICAgYnJlYWs7CisJCSAgfQorCQkgIAorCQljYXNlIFJfTl9NT0RFOgorCQljYXNlIFJfU19NT0RFOgorCQljYXNlIFJfRF9NT0RFOgorCQljYXNlIFJfUl9NT0RFOgorCQkgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiByZXF1ZXN0cyB0aGUgY3VycmVudCByb3VuZGluZworCQkgICAgIG1vZGUsIHRoZW4gaXQgaXMgcmVkdW5kYW50LiAgKi8KKwkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBjdXJyZW50X3JvdW5kaW5nX21vZGUpCisJCSAgICB7CisJCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7CisJCSAgICAgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKKwkJICAgICAgcCArPSAxOworCQkgICAgICBjdXJyZW50X3JvdW5kaW5nX21vZGUgPSBiZmRfcmVsb2MtPmhvd3RvLT50eXBlOworCQkgICAgfQorCQkgIGJyZWFrOworCisJCWNhc2UgUl9FWElUOgorCQljYXNlIFJfQUxUX0VOVFJZOgorCQljYXNlIFJfRlNFTDoKKwkJY2FzZSBSX0xTRUw6CisJCWNhc2UgUl9SU0VMOgorCQljYXNlIFJfQkVHSU5fQlJUQUI6CisJCWNhc2UgUl9FTkRfQlJUQUI6CisJCWNhc2UgUl9CRUdJTl9UUlk6CisJCWNhc2UgUl9OMFNFTDoKKwkJY2FzZSBSX04xU0VMOgorCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7CisJCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOworCQkgIHAgKz0gMTsKKwkJICBicmVhazsKKworCQljYXNlIFJfRU5EX1RSWToKKwkJICAvKiBUaGUgZW5kIG9mIGEgZXhjZXB0aW9uIGhhbmRsaW5nIHJlZ2lvbi4gIFRoZSByZWxvYydzCisJCSAgICAgYWRkZW5kIGNvbnRhaW5zIHRoZSBvZmZzZXQgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZworCQkgICAgIGNvZGUuICAqLworCQkgIGlmIChiZmRfcmVsb2MtPmFkZGVuZCA9PSAwKQorCQkgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKKwkJICBlbHNlIGlmIChiZmRfcmVsb2MtPmFkZGVuZCA8IDEwMjQpCisJCSAgICB7CisJCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDEsIHApOworCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kIC8gNCwgcCArIDEpOworCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAorCQkJCQkgIHAsIDIsIHJlbG9jX3F1ZXVlKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSArIDIsIHApOworCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIChiZmRfcmVsb2MtPmFkZGVuZCAvIDQpID4+IDE2LCBwICsgMSk7CisJCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kIC8gNCwgcCArIDIpOworCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAorCQkJCQkgIHAsIDQsIHJlbG9jX3F1ZXVlKTsKKwkJICAgIH0KKwkJICBicmVhazsKKwkJICAgICAgCisJCWNhc2UgUl9DT01QMToKKwkJICAvKiBUaGUgb25seSB0aW1lIHdlIGdlbmVyYXRlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIAorCQkgICAgIFJfQ09ERV9FWFBSIHJlbG9jcyBpcyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCisJCSAgICAgc3ltYm9scy4gIEhlbmNlIHdlIGNhbiBjaGVhdCBoZXJlLiAgKi8KKwkJICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOworCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0NCwgcCArIDEpOworCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCisJCQkJICAgICAgcCwgMiwgcmVsb2NfcXVldWUpOworCQkgIGJyZWFrOworCisJCWNhc2UgUl9DT01QMjoKKwkJICAvKiBUaGUgb25seSB0aW1lIHdlIGdlbmVyYXRlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIAorCQkgICAgIFJfQ09ERV9FWFBSIHJlbG9jcyBpcyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCisJCSAgICAgc3ltYm9scy4gIEhlbmNlIHdlIGNhbiBjaGVhdCBoZXJlLiAgKi8KKwkJICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOworCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg4MCwgcCArIDEpOworCQkgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDIpOworCQkgIGJmZF9wdXRfMTYgKGFiZmQsIHN5bV9udW0sIHAgKyAzKTsKKwkJICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAorCQkJCSAgICAgIHAsIDUsIHJlbG9jX3F1ZXVlKTsKKwkJICBicmVhazsKKworCQljYXNlIFJfQ09ERV9FWFBSOgorCQljYXNlIFJfREFUQV9FWFBSOgorCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCisJCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KKwkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLworCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7CisJCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOworCQkgIHAgKz0gMTsKKwkJICBicmVhazsKKworCQkvKiBQdXQgYSAiUl9SRVNFUlZFRCIgcmVsb2NhdGlvbiBpbiB0aGUgc3RyZWFtIGlmCisJCSAgIHdlIGhpdCBzb21ldGhpbmcgd2UgZG8gbm90IHVuZGVyc3RhbmQuICBUaGUgbGlua2VyCisJCSAgIHdpbGwgY29tcGxhaW4gbG91ZGx5IGlmIHRoaXMgZXZlciBoYXBwZW5zLiAgKi8KKwkJZGVmYXVsdDoKKwkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZmYsIHApOworCQkgIHN1YnNwYWNlX3JlbG9jX3NpemUgKz0gMTsKKwkJICBwICs9IDE7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICAvKiBMYXN0IEJGRCByZWxvY2F0aW9uIGZvciBhIHN1YnNwYWNlIGhhcyBiZWVuIHByb2Nlc3NlZC4KKwkgICAgIE1hcCB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2Ugd2l0aCBSX05PX1JFTE9DQVRJT04gZml4dXBzLiAgKi8KKwkgIHAgPSBzb21fcmVsb2Nfc2tpcCAoYWJmZCwgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbikgCisJCQkgICAgICAgICAgICAgIC0gcmVsb2Nfb2Zmc2V0LAorCQkJICAgICAgcCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKKworCSAgLyogU2NyaWJibGUgb3V0IHRoZSByZWxvY2F0aW9ucy4gICovCisJICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0bXBfc3BhY2UsIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCisJICAgICAgIT0gcCAtIHRtcF9zcGFjZSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgcCA9IHRtcF9zcGFjZTsKKworCSAgdG90YWxfcmVsb2Nfc2l6ZSArPSBzdWJzcGFjZV9yZWxvY19zaXplOworCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfcXVhbnRpdHkKKwkgICAgPSBzdWJzcGFjZV9yZWxvY19zaXplOworCX0KKyAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworICAgIH0KKyAgKnRvdGFsX3JlbG9jX3NpemVwID0gdG90YWxfcmVsb2Nfc2l6ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgc3BhY2Uvc3Vic3BhY2Ugc3RyaW5nIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV93cml0ZV9zcGFjZV9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3RyaW5nX3NpemVwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7CisgICAgIHVuc2lnbmVkIGludCAqc3RyaW5nX3NpemVwOworeworICAvKiBDaHVuayBvZiBtZW1vcnkgdGhhdCB3ZSBjYW4gdXNlIGFzIGJ1ZmZlciBzcGFjZSwgdGhlbiB0aHJvdworICAgICBhd2F5LiAgKi8KKyAgdW5zaWduZWQgY2hhciB0bXBfc3BhY2VbU09NX1RNUF9CVUZTSVpFXTsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgdW5zaWduZWQgaW50IHN0cmluZ3Nfc2l6ZSA9IDA7CisgIGFzZWN0aW9uICpzZWN0aW9uOworCisgIG1lbXNldCAodG1wX3NwYWNlLCAwLCBTT01fVE1QX0JVRlNJWkUpOworICBwID0gdG1wX3NwYWNlOworCisgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzcGFjZSBzdHJpbmdzIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nCisgICAgIHRoZW0gb3V0LiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogV2FsayB0aHJvdWdoIGFsbCB0aGUgc3BhY2VzIGFuZCBzdWJzcGFjZXMgKG9yZGVyIGlzIG5vdCBpbXBvcnRhbnQpCisgICAgIGJ1aWxkaW5nIHVwIGFuZCB3cml0aW5nIHN0cmluZyB0YWJsZSBlbnRyaWVzIGZvciB0aGVpciBuYW1lcy4gICovCisgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBsZW5ndGg7CisKKyAgICAgIC8qIE9ubHkgd29yayB3aXRoIHNwYWNlL3N1YnNwYWNlczsgYXZvaWQgYW55IG90aGVyIHNlY3Rpb25zCisJIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBtYWRlICgudGV4dCBmb3IgZXhhbXBsZSkuICAqLworICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQorCWNvbnRpbnVlOworCisgICAgICAvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3BhY2Uvc3Vic3BhY2UgbmFtZS4gICovCisgICAgICBsZW5ndGggPSBzdHJsZW4gKHNlY3Rpb24tPm5hbWUpOworCisgICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCisJIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gIEVhY2ggZW50cnkgd2lsbCB0YWtlIDQgYnl0ZXMgdG8KKwkgaG9sZCB0aGUgc3RyaW5nIGxlbmd0aCArIHRoZSBzdHJpbmcgaXRzZWxmICsgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KKyAgICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKKwl7CisJICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQorCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpIAorCSAgICByZXR1cm4gZmFsc2U7CisJICAvKiBSZXNldCB0byBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBzcGFjZS4gICovCisJICBwID0gdG1wX3NwYWNlOworCX0KKworICAgICAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorCSBzdHJpbmcuICBBbGlnbm1lbnQgaXNzdWVzIGFyZSBhbHJlYWR5IGhhbmRsZWQuICAqLworICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKKyAgICAgIHAgKz0gNDsKKyAgICAgIHN0cmluZ3Nfc2l6ZSArPSA0OworCisgICAgICAvKiBSZWNvcmQgdGhlIGluZGV4IGluIHRoZSBzcGFjZS9zdWJzcGFjZSByZWNvcmRzLiAgKi8KKyAgICAgIGlmIChzb21faXNfc3BhY2UgKHNlY3Rpb24pKQorCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKKyAgICAgIGVsc2UKKwlzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7CisKKyAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCisgICAgICBzdHJjcHkgKHAsIHNlY3Rpb24tPm5hbWUpOworICAgICAgcCArPSBsZW5ndGggKyAxOworICAgICAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7CisKKyAgICAgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgICAgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQorCXsKKwkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7CisJICBwKys7CisJICBzdHJpbmdzX3NpemUrKzsKKwl9CisgICAgfQorCisgIC8qIERvbmUgd2l0aCB0aGUgc3BhY2Uvc3Vic3BhY2Ugc3RyaW5ncy4gIFdyaXRlIG91dCBhbnkgaW5mb3JtYXRpb24KKyAgICAgY29udGFpbmVkIGluIGEgcGFydGlhbCBibG9jay4gICovCisgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpICE9IHAgLSB0bXBfc3BhY2UpCisgICAgcmV0dXJuIGZhbHNlOworICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsIG51bV9zeW1zLCBzdHJpbmdfc2l6ZXAsCisJCQkgIGNvbXBpbGF0aW9uX3VuaXQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKKyAgICAgYXN5bWJvbCAqKnN5bXM7CisgICAgIHVuc2lnbmVkIGludCBudW1fc3ltczsKKyAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7CisgICAgIENPTVBVTklUICpjb21waWxhdGlvbl91bml0OworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgCisgIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93CisgICAgIGF3YXkuICAqLworICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKKyAgdW5zaWduZWQgY2hhciAqY29tcFs0XTsKKworICAvKiBUaGlzIGdldHMgYSBiaXQgZ3J1ZXNvbWUgYmVjYXVzZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4gIFRoZQorICAgICBzdHJpbmdzIHdpdGhpbiB0aGUgY29tcGlsYXRpb24gdW5pdCBhcmUgcGFydCBvZiB0aGUgc3ltYm9sCisgICAgIHN0cmluZ3MsIGJ1dCBkb24ndCBoYXZlIHN5bWJvbF9kaWN0aW9uYXJ5IGVudHJpZXMuICBTbywgbWFudWFsbHkKKyAgICAgd3JpdGUgdGhlbSBhbmQgdXBkYXRlIHRoZSBjb21wbGlhdGlvbiB1bml0IGhlYWRlci4gIE9uIGlucHV0LCB0aGUKKyAgICAgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgY29udGFpbnMgbG9jYWwgY29waWVzIG9mIHRoZSBzdHJpbmdzLgorICAgICBNb3ZlIHRoZW0gYXNpZGUuICAqLworICBpZiAoY29tcGlsYXRpb25fdW5pdCkKKyAgICB7CisgICAgICBjb21wWzBdID0gY29tcGlsYXRpb25fdW5pdC0+bmFtZS5uX25hbWU7CisgICAgICBjb21wWzFdID0gY29tcGlsYXRpb25fdW5pdC0+bGFuZ3VhZ2VfbmFtZS5uX25hbWU7CisgICAgICBjb21wWzJdID0gY29tcGlsYXRpb25fdW5pdC0+cHJvZHVjdF9pZC5uX25hbWU7CisgICAgICBjb21wWzNdID0gY29tcGlsYXRpb25fdW5pdC0+dmVyc2lvbl9pZC5uX25hbWU7CisgICAgfQorCisgIG1lbXNldCAodG1wX3NwYWNlLCAwLCBTT01fVE1QX0JVRlNJWkUpOworICBwID0gdG1wX3NwYWNlOworCisgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzcGFjZSBzdHJpbmdzIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nCisgICAgIHRoZW0gb3V0LiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGNvbXBpbGF0aW9uX3VuaXQpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJICBpbnQgbGVuZ3RoID0gc3RybGVuIChjb21wW2ldKTsKKworCSAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBlbnRyeSwgdGhlbiBkdW1wCisJICAgICB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgKi8KKwkgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKKwkgICAgeworCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCisJCSAgIT0gcCAtIHRtcF9zcGFjZSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KKwkgICAgICBwID0gdG1wX3NwYWNlOworCSAgICB9CisKKwkgIC8qIEZpcnN0IGVsZW1lbnQgaW4gYSBzdHJpbmcgdGFibGUgZW50cnkgaXMgdGhlIGxlbmd0aCBvZgorCSAgICAgdGhlIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzCisJICAgICBhbHNvIGFuIGFwcHJvcHJpYXRlIHRpbWUgdG8gZmlsbCBpbiB0aGUgc3RyaW5nIGluZGV4CisJICAgICBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KKwkgIGJmZF9wdXRfMzIgKGFiZmQsIGxlbmd0aCwgcCk7CisJICBzdHJpbmdzX3NpemUgKz0gNDsKKwkgIHAgKz0gNDsKKworCSAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KKwkgIHN0cmNweSAocCwgY29tcFtpXSk7CisKKwkgIHN3aXRjaCAoaSkKKwkgICAgeworCSAgICBjYXNlIDA6CQorCSAgICAgIG9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCktPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDE6CisJICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bGFuZ3VhZ2VfbmFtZS5uX3N0cnggPSAKKwkJc3RyaW5nc19zaXplOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDI6CisJICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+cHJvZHVjdF9pZC5uX3N0cnggPSAKKwkJc3RyaW5nc19zaXplOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDM6CisJICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+dmVyc2lvbl9pZC5uX3N0cnggPSAKKwkJc3RyaW5nc19zaXplOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIHAgKz0gbGVuZ3RoICsgMTsKKwkgIHN0cmluZ3Nfc2l6ZSArPSBsZW5ndGggKyAxOworCisJICAvKiBBbHdheXMgYWxpZ24gdXAgdG8gdGhlIG5leHQgd29yZCBib3VuZGFyeS4gICovCisJICB3aGlsZSAoc3RyaW5nc19zaXplICUgNCkKKwkgICAgeworCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7CisJICAgICAgc3RyaW5nc19zaXplKys7CisJICAgICAgcCsrOworCSAgICB9CisJfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKKyAgICB7CisgICAgICBpbnQgbGVuZ3RoID0gc3RybGVuIChzeW1zW2ldLT5uYW1lKTsKKworICAgICAgLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciB0aGUgbmV4dCBlbnRyeSwgdGhlbiBkdW1wIHRoZQorCSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLworICAgICBpZiAocCAtIHRtcF9zcGFjZSArIDUgKyBsZW5ndGggPiBTT01fVE1QX0JVRlNJWkUpCisJeworCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKKwkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQorCSAgICByZXR1cm4gZmFsc2U7CisJICAvKiBSZXNldCB0byBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBzcGFjZS4gICovCisJICBwID0gdG1wX3NwYWNlOworCX0KKworICAgICAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorCSBzdHJpbmcuICBUaGlzIG11c3QgYWx3YXlzIGJlIDQgYnl0ZSBhbGlnbmVkLiAgVGhpcyBpcyBhbHNvCisJIGFuIGFwcHJvcHJpYXRlIHRpbWUgdG8gZmlsbCBpbiB0aGUgc3RyaW5nIGluZGV4IGZpZWxkIGluIHRoZQorCSBzeW1ib2wgdGFibGUgZW50cnkuICAqLworICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKKyAgICAgIHN0cmluZ3Nfc2l6ZSArPSA0OworICAgICAgcCArPSA0OworCisgICAgICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLworICAgICAgc3RyY3B5IChwLCBzeW1zW2ldLT5uYW1lKTsKKworICAgICAgc29tX3N5bWJvbF9kYXRhKHN5bXNbaV0pLT5zdHJpbmd0YWJfb2Zmc2V0ID0gc3RyaW5nc19zaXplOworICAgICAgcCArPSBsZW5ndGggKyAxOworICAgICAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7CisKKyAgICAgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgICAgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQorICAgICAgICB7CisJICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOworCSAgc3RyaW5nc19zaXplKys7CisJICBwKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogU2NyaWJibGUgb3V0IGFueSBwYXJ0aWFsIGJsb2NrLiAgKi8KKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKnN0cmluZ19zaXplcCA9IHN0cmluZ3Nfc2l6ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvbXB1dGUgdmFyaWFibGUgaW5mb3JtYXRpb24gdG8gYmUgcGxhY2VkIGluIHRoZSBTT00gaGVhZGVycywgCisgICBzcGFjZS9zdWJzcGFjZSBkaWN0aW9uYXJpZXMsIHJlbG9jYXRpb24gc3RyZWFtcywgZXRjLiAgQmVnaW4KKyAgIHdyaXRpbmcgcGFydHMgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4gCitzb21fYmVnaW5fd3JpdGluZyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0ID0gMDsKKyAgaW50IHN0cmluZ3Nfc2l6ZSA9IDA7CisgIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplID0gMDsKKyAgdW5zaWduZWQgbG9uZyBudW1fc3BhY2VzLCBudW1fc3Vic3BhY2VzLCBpOworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7CisgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmV4ZWNfaGVhZGVyID0gTlVMTDsKKworICAvKiBUaGUgZmlsZSBoZWFkZXIgd2lsbCBhbHdheXMgYmUgZmlyc3QgaW4gYW4gb2JqZWN0IGZpbGUsIAorICAgICBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGluIHJhbmRvbSBsb2NhdGlvbnMuICBUbyBrZWVwIHRoaW5ncworICAgICAic2ltcGxlIiBCRkQgd2lsbCBsYXkgb3V0IHRoZSBvYmplY3QgZmlsZSBpbiB0aGUgbWFubmVyIHN1Z2dlc3RlZAorICAgICBieSB0aGUgUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zLiAgKi8KKworICAvKiBCZWZvcmUgYW55IG91dHB1dCBjYW4gcmVhbGx5IGJlZ2luIG9mZnNldHMgZm9yIGFsbCB0aGUgbWFqb3IKKyAgICAgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlIG11c3QgYmUgY29tcHV0ZWQuICBTbywgc3RhcnRpbmcKKyAgICAgd2l0aCB0aGUgaW5pdGlhbCBmaWxlIGhlYWRlciBjb21wdXRlIChhbmQgc29tZXRpbWVzIHdyaXRlKQorICAgICBlYWNoIHBvcnRpb24gb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKworICAvKiBNYWtlIHJvb20gZm9yIHRoZSBmaWxlIGhlYWRlciwgaXQncyBjb250ZW50cyBhcmUgbm90IGNvbXBsZXRlCisgICAgIHlldCwgc28gaXQgY2FuIG5vdCBiZSB3cml0dGVuIGF0IHRoaXMgdGltZS4gICovCisgIGN1cnJlbnRfb2Zmc2V0ICs9IHNpemVvZiAoc3RydWN0IGhlYWRlcik7ICAKKworICAvKiBBbnkgYXV4aWxpYXJ5IGhlYWRlcnMgd2lsbCBmb2xsb3cgdGhlIGZpbGUgaGVhZGVyLiAgUmlnaHQgbm93CisgICAgIHdlIHN1cHBvcnQgb25seSB0aGUgY29weXJpZ2h0IGFuZCB2ZXJzaW9uIGhlYWRlcnMuICAqLworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplID0gMDsKKyAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQorICAgIHsKKyAgICAgIC8qIFBhcnRzIG9mIHRoZSBleGVjIGhlYWRlciB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciwgc28KKwkgZGVsYXkgd3JpdGluZyB0aGUgaGVhZGVyIGl0c2VsZi4gIEZpbGwgaW4gdGhlIGRlZmF1bHRzLAorCSBhbmQgd3JpdGUgaXQgbGF0ZXIuICAqLworICAgICAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKTsKKyAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUKKwkrPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOworICAgICAgZXhlY19oZWFkZXIgPSBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKTsKKyAgICAgIGV4ZWNfaGVhZGVyLT5zb21fYXV4aGRyLnR5cGUgPSBFWEVDX0FVWF9JRDsKKyAgICAgIGV4ZWNfaGVhZGVyLT5zb21fYXV4aGRyLmxlbmd0aCA9IDQwOworICAgIH0KKyAgaWYgKG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGxlbjsKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBhdXhfaWQgc3RydWN0dXJlIGFuZCB0aGUgc3RyaW5nIGxlbmd0aC4gICovCisgICAgICBsZW4gPSBzaXplb2YgKHN0cnVjdCBhdXhfaWQpICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpOworICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSArPSBsZW47CisgICAgICBjdXJyZW50X29mZnNldCArPSBsZW47CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBXcml0ZSB0aGUgdmVyc2lvbiBzdHJpbmcuICAqLworICAgICAgbGVuID0gb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggLSBzaXplb2YgKGludCk7CisgICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKKyAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT51c2VyX3N0cmluZywKKwkJICAgICBsZW4sIDEsIGFiZmQpICE9IGxlbikKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGxlbjsKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCwgU0VFS19TRVQpIDwgMCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBhdXhfaWQgc3RydWN0dXJlIGFuZCB0aGUgc3RyaW5nIGxlbmd0aC4gICovCisgICAgICBsZW4gPSBzaXplb2YgKHN0cnVjdCBhdXhfaWQpICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpOworICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZSArPSBsZW47CisgICAgICBjdXJyZW50X29mZnNldCArPSBsZW47CisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBjb3B5cmlnaHQgc3RyaW5nLiAgKi8KKyAgICAgIGxlbiA9IG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggLSBzaXplb2YgKGludCk7CisgICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKKyAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKKyAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmNvcHlyaWdodCwKKwkJICAgICBsZW4sIDEsIGFiZmQpICE9IGxlbikKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIE5leHQgY29tZXMgdGhlIGluaXRpYWxpemF0aW9uIHBvaW50ZXJzOyB3ZSBoYXZlIG5vIGluaXRpYWxpemF0aW9uCisgICAgIHBvaW50ZXJzLCBzbyBjdXJyZW50IG9mZnNldCBkb2VzIG5vdCBjaGFuZ2UuICAqLworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+aW5pdF9hcnJheV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+aW5pdF9hcnJheV90b3RhbCA9IDA7CisKKyAgLyogTmV4dCBhcmUgdGhlIHNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCisKKyAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCisgICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHNwYWNlIHJlY29yZHMuCisKKyAgICAgVGhlIG5hbWVzIG9mIHRoZSBzcGFjZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKKyAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzcGFjZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKKyAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3BhY2UgaGVhZGVycworICAgICBhdCB0aGlzIHRpbWUuICAqLworICBudW1fc3BhY2VzID0gc29tX2NvdW50X3NwYWNlcyAoYWJmZCk7CisgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWwgPSBudW1fc3BhY2VzOworICBjdXJyZW50X29mZnNldCArPSBudW1fc3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOworCisgIC8qIE5leHQgYXJlIHRoZSBzdWJzcGFjZSByZWNvcmRzLiAgVGhlc2UgYXJlIGZpeGVkIGxlbmd0aCByZWNvcmRzLgorCisgICAgIENvdW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhZXMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCisgICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN1YnNwYWNlIHJlY29yZHMuCisKKyAgICAgQSB2YXJpZXR5IGlmIGZpZWxkcyBpbiB0aGUgc3Vic3BhY2UgcmVjb3JkIGFyZSBzdGlsbCB1bmtub3duIGF0CisgICAgIHRoaXMgdGltZSAoaW5kZXggaW50byBzdHJpbmcgdGFibGUsIGZpeHVwIHN0cmVhbSBsb2NhdGlvbi9zaXplLCBldGMpLiAgKi8KKyAgbnVtX3N1YnNwYWNlcyA9IHNvbV9jb3VudF9zdWJzcGFjZXMgKGFiZmQpOworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKKyAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX3RvdGFsID0gbnVtX3N1YnNwYWNlczsKKyAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N1YnNwYWNlcyAqIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKTsKKworICAvKiBOZXh0IGlzIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lcy4gIFdlIHdpbGwKKyAgICAgYnVpbGQgYW5kIHdyaXRlIHRoZSBzdHJpbmcgdGFibGUgb24gdGhlIGZseS4gIEF0IHRoZSBzYW1lIHRpbWUKKyAgICAgd2Ugd2lsbCBmaWxsIGluIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lIGluZGV4IGZpZWxkcy4gICovCisKKyAgLyogVGhlIHN0cmluZyB0YWJsZSBuZWVkcyB0byBiZSBhbGlnbmVkIG9uIGEgd29yZCBib3VuZGFyeS4gICovCisgIGlmIChjdXJyZW50X29mZnNldCAlIDQpCisgICAgY3VycmVudF9vZmZzZXQgKz0gKDQgLSAoY3VycmVudF9vZmZzZXQgJSA0KSk7CisKKyAgLyogTWFyayB0aGUgb2Zmc2V0IG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUgaW4gdGhlIAorICAgICBmaWxlIGhlYWRlci4gICovCisgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV9zdHJpbmdzX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7CisKKyAgLyogU2NyaWJibGUgb3V0IHRoZSBzcGFjZSBzdHJpbmdzLiAgKi8KKyAgaWYgKHNvbV93cml0ZV9zcGFjZV9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgJnN0cmluZ3Nfc2l6ZSkgPT0gZmFsc2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFJlY29yZCB0b3RhbCBzdHJpbmcgdGFibGUgc2l6ZSBpbiB0aGUgaGVhZGVyIGFuZCB1cGRhdGUgdGhlCisgICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KKyAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3Nfc2l6ZSA9IHN0cmluZ3Nfc2l6ZTsKKyAgY3VycmVudF9vZmZzZXQgKz0gc3RyaW5nc19zaXplOworCisgIC8qIE5leHQgaXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQuICovCisgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAwOworICBpZiAob2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkgCisgICAgeworICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX3RvdGFsID0gMTsKKyAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IENPTVBVTklUU1o7IAorICAgIH0KKworICAvKiBOb3cgY29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBsb2FkYWJsZSBzdWJzcGFjZXMsIHRha2luZworICAgICBjYXJlIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIHN0YXlzIHByb3Blcmx5IGFsaWduZWQuICAqLworCisgIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKKyAgICAgIGludCBmaXJzdF9zdWJzcGFjZTsKKyAgICAgIHVuc2lnbmVkIGludCBzdWJzcGFjZV9vZmZzZXQgPSAwOworCisgICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLworICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQorCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworCisgICAgICBmaXJzdF9zdWJzcGFjZSA9IDE7CisgICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLworICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7CisJICAgc3Vic2VjdGlvbiAhPSBOVUxMOworCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQorCXsKKworCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCisJICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCisJICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQorCSAgICBjb250aW51ZTsKKworCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3Vic3BhY2UgaW4gdGhlIHNwYWNlLCBhbmQgd2UgYXJlCisJICAgICBidWlsZGluZyBhbiBleGVjdXRhYmxlLCB0aGVuIHRha2UgY2FyZSB0byBtYWtlIHN1cmUgYWxsCisJICAgICB0aGUgYWxpZ25tZW50cyBhcmUgY29ycmVjdCBhbmQgdXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCisJICBpZiAoZmlyc3Rfc3Vic3BhY2UKKwkgICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpKQorCSAgICB7CisJICAgICAgLyogRGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzIGhhdmUgZWFjaCBzcGFjZSBhbGlnbmVkIHRvIGEKKwkJIHBhZ2UgYm91bmRhcnkuICBTaGFyYWJsZSBleGVjdXRhYmxlcyAod3JpdGUtcHJvdGVjdGVkCisJCSB0ZXh0KSBoYXZlIGp1c3QgdGhlIHByaXZhdGUgKGFrYSBkYXRhICYgYnNzKSBzcGFjZSBhbGlnbmVkCisJCSB0byBhIHBhZ2UgYm91bmRhcnkuICBVZ2guICBOb3QgdHJ1ZSBmb3IgSFBVWC4KKworCQkgVGhlIEhQVVgga2VybmVsIHJlcXVpcmVzIHRoZSB0ZXh0IHRvIGFsd2F5cyBiZSBwYWdlIGFsaWduZWQKKwkJIHdpdGhpbiB0aGUgZmlsZSByZWdhcmRsZXNzIG9mIHRoZSBleGVjdXRhYmxlJ3MgdHlwZS4gICovCisJICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKERfUEFHRUQgfCBEWU5BTUlDKQorCQkgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQorCQkgIHx8ICgoYWJmZC0+ZmxhZ3MgJiBXUF9URVhUKQorCQkgICAgICAmJiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQSkpKQorCQljdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKKworCSAgICAgIC8qIFVwZGF0ZSB0aGUgZXhlYyBoZWFkZXIuICAqLworCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFICYmIGV4ZWNfaGVhZGVyLT5leGVjX3RmaWxlID09IDApCisJCXsKKwkJICBleGVjX2hlYWRlci0+ZXhlY190bWVtID0gc2VjdGlvbi0+dm1hOworCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RmaWxlID0gY3VycmVudF9vZmZzZXQ7CisJCX0KKwkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQSAmJiBleGVjX2hlYWRlci0+ZXhlY19kZmlsZSA9PSAwKQorCQl7CisJCSAgZXhlY19oZWFkZXItPmV4ZWNfZG1lbSA9IHNlY3Rpb24tPnZtYTsKKwkJICBleGVjX2hlYWRlci0+ZXhlY19kZmlsZSA9IGN1cnJlbnRfb2Zmc2V0OworCQl9CisKKwkgICAgICAvKiBLZWVwIHRyYWNrIG9mIGV4YWN0bHkgd2hlcmUgd2UgYXJlIHdpdGhpbiBhIHBhcnRpY3VsYXIKKwkJIHNwYWNlLiAgVGhpcyBpcyBuZWNlc3NhcnkgYXMgdGhlIGJyYWluZGFtYWdlZCBIUFVYCisJCSBsb2FkZXIgd2lsbCBjcmVhdGUgaG9sZXMgYmV0d2VlbiBzdWJzcGFjZXMgKmFuZCogCisJCSBzdWJzcGFjZSBhbGlnbm1lbnRzIGFyZSAqTk9UKiBwcmVzZXJ2ZWQuICBXaGF0IGEgY3JvY2suICAqLworCSAgICAgIHN1YnNwYWNlX29mZnNldCA9IHN1YnNlY3Rpb24tPnZtYTsKKworCSAgICAgIC8qIE9ubHkgZG8gdGhpcyBmb3IgdGhlIGZpcnN0IHN1YnNwYWNlIHdpdGhpbiBlYWNoIHNwYWNlLiAgKi8KKwkgICAgICBmaXJzdF9zdWJzcGFjZSA9IDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQorCSAgICB7CisJICAgICAgLyogVGhlIGJyYWluZGFtYWdlZCBIUFVYIGxvYWRlciBtYXkgaGF2ZSBjcmVhdGVkIGEgaG9sZQorCQkgYmV0d2VlbiB0d28gc3Vic3BhY2VzLiAgSXQgaXMgKm5vdCogc3VmZmljaWVudCB0byB1c2UKKwkJIHRoZSBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbnMgd2l0aGluIHRoZSBzdWJzcGFjZXMgdG8KKwkJIGFjY291bnQgZm9yIHRoZXNlIGhvbGVzIC0tIEkndmUgcnVuIGludG8gYXQgbGVhc3Qgb25lCisJCSBjYXNlIHdoZXJlIHRoZSBsb2FkZXIgbGVmdCBvbmUgY29kZSBzdWJzcGFjZSB1bmFsaWduZWQKKwkJIGluIGEgZmluYWwgZXhlY3V0YWJsZS4KKworCQkgVG8gY29tYmF0IHRoaXMgd2Uga2VlcCBhIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiBlYWNoIHNwYWNlLAorCQkgYW5kIHVzZSB0aGUgc3Vic3BhY2Ugdm1hIGZpZWxkcyB0byBkZXRlY3QgYW5kIHByZXNlcnZlCisJCSBob2xlcy4gIFdoYXQgYSBjcm9jayEKKworCQkgcHMuICBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIHVubG9hZGFibGUgc3BhY2Uvc3Vic3BhY2VzLiAgKi8KKwkgICAgICBjdXJyZW50X29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7CisJICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCisJCWV4ZWNfaGVhZGVyLT5leGVjX3RzaXplICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKKwkgICAgICBlbHNlCisJCWV4ZWNfaGVhZGVyLT5leGVjX2RzaXplICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKKwkgICAgICBzdWJzcGFjZV9vZmZzZXQgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OworCSAgICB9CisKKworCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7CisJICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCisJICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkKKwkgICAgeworCSAgICAgIC8qIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY29kZSAmIGRhdGEuICAqLworCSAgICAgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKQorCQkgICYmIHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCisJCWV4ZWNfaGVhZGVyLT5leGVjX3RzaXplICs9IHN1YnNlY3Rpb24tPl9jb29rZWRfc2l6ZTsKKwkgICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKQorCQkgICAgICAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQSkKKwkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOworCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCisJCT0gY3VycmVudF9vZmZzZXQ7CisJICAgICAgc3Vic2VjdGlvbi0+ZmlsZXBvcyA9IGN1cnJlbnRfb2Zmc2V0OworCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOyAKKwkgICAgICBzdWJzcGFjZV9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7CisJICAgIH0KKwkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgYnNzIHNlY3Rpb24uICAqLworCSAgICAgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKKwkJZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOworCisJICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKKwkJPSAwOworCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT4KKwkJaW5pdGlhbGl6YXRpb25fbGVuZ3RoID0gMDsKKwkgICAgfQorCX0KKyAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCisgICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCisgICAgfQorCisgIC8qIEZpbmFsbHkgY29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHVubG9hZGFibGUgc3Vic3BhY2VzLgorICAgICBJZiBidWlsZGluZyBhbiBleGVjdXRhYmxlLCBzdGFydCB0aGUgdW5sb2FkYWJsZSBzdHVmZiBvbiBpdHMKKyAgICAgb3duIHBhZ2UuICAqLworCisgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKKyAgICBjdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKKworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCisgICAgeworICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247CisKKyAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCisgICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCisJc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7CisKKyAgICAgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKKwljdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKKworICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBpdHMgc3Vic3BhY2VzLiAgKi8KKyAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOworCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKKwkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKKwl7CisJICAKKwkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQorCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQorCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIHN1YnNlY3Rpb24tPnRhcmdldF9pbmRleCA9IHRvdGFsX3N1YnNwYWNlcysrOworCSAgLyogVGhpcyBpcyByZWFsIGRhdGEgdG8gYmUgbG9hZGVkIGZyb20gdGhlIGZpbGUuICAqLworCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwKQorCSAgICB7CisJICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKKwkJPSBjdXJyZW50X29mZnNldDsKKwkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7CisJICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAorCSAgICB9CisJICAvKiBMb29rcyBsaWtlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCisJICBlbHNlCisJICAgIHsKKwkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQorCQk9IDA7CisJICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgorCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKKwkgICAgfQorCX0KKyAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCisgICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCisgICAgfQorCisgIC8qIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gbWFrZSBzdXJlIHRvIHNlZWsgdG8gYW5kIHdyaXRlCisgICAgIG9uZSBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdG8gbWFrZSBzdXJlIGFueSBuZWNlc3NhcnkKKyAgICAgemVyb3MgYXJlIGZpbGxlZCBpbi4gIFVnaC4gICovCisgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKKyAgICBjdXJyZW50X29mZnNldCA9IFNPTV9BTElHTiAoY3VycmVudF9vZmZzZXQsIFBBX1BBR0VTSVpFKTsKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBjdXJyZW50X29mZnNldCAtIDEsIFNFRUtfU0VUKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYmZkX3dyaXRlICgoUFRSKSAiIiwgMSwgMSwgYWJmZCkgIT0gMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnVubG9hZGFibGVfc3Bfc2l6ZQorICAgID0gY3VycmVudF9vZmZzZXQgLSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9sb2NhdGlvbjsKKworICAvKiBMb2FkZXIgZml4dXBzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFueSB3YXkgc2hhcGUgb3IgZm9ybS4gICovCisgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfbG9jYXRpb24gPSAwOworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+bG9hZGVyX2ZpeHVwX3RvdGFsID0gMDsKKworICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTSBzbyBmYXIuICAqLworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aCA9IGN1cnJlbnRfb2Zmc2V0OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5hbGx5LCBzY3JpYmJsZSBvdXQgdGhlIHZhcmlvdXMgaGVhZGVycyB0byB0aGUgZGlzay4gICovCisKK3N0YXRpYyBib29sZWFuCitzb21fZmluaXNoX3dyaXRpbmcgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKKyAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOworICBpbnQgaSwgbnVtX3N5bXMsIHN0cmluZ3Nfc2l6ZTsKKyAgaW50IHN1YnNwYWNlX2luZGV4ID0gMDsKKyAgZmlsZV9wdHIgbG9jYXRpb247CisgIGFzZWN0aW9uICpzZWN0aW9uOworICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZTsKKworICAvKiBOZXh0IGlzIHRoZSBzeW1ib2wgdGFibGUuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCisKKyAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIGRldGVybWluZSBob3cgbXVjaCByb29tIGlzIG5lZWRlZAorICAgICBpbiB0aGUgb2JqZWN0IGZpbGUgZm9yIHRoZSBzeW1ib2wgdGFibGUuCisKKyAgICAgVGhlIG5hbWVzIG9mIHRoZSBzeW1ib2xzIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBzdHJpbmcgdGFibGUsCisgICAgIGFuZCB0aGUgaW5kZXggZm9yIGVhY2ggc3ltYm9sIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlIGlzIGNvbXB1dGVkCisgICAgIGJlbG93LiAgVGhlcmVmb3JlLCBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgdGhlIHN5bWJvbCB0YWJsZQorICAgICBhdCB0aGlzIHRpbWUuIAorCisgICAgIFRoZXNlIHVzZWQgdG8gYmUgb3V0cHV0IGJlZm9yZSB0aGUgc3Vic3BhY2UgY29udGVudHMsIGJ1dCB0aGV5CisgICAgIHdlcmUgbW92ZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIHN0dXBpZCBidWcgaW4gdGhlIGhwdXggbGlua2VyCisgICAgIChmaXhlZCBpbiBocHV4MTApLiAgKi8KKyAgY3VycmVudF9vZmZzZXQgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aDsKKworICAvKiBNYWtlIHN1cmUgd2UncmUgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKKyAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCisKKyAgbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKKyAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3RvdGFsID0gbnVtX3N5bXM7CisgIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zeW1zICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkKTsKKworICAvKiBOZXh0IGFyZSB0aGUgc3ltYm9sIHN0cmluZ3MuCisgICAgIEFsaWduIHRoZW0gdG8gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKKyAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKKyAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7CisKKyAgLyogU2NyaWJibGUgb3V0IHRoZSBzeW1ib2wgc3RyaW5ncy4gICovCisgIGlmIChzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzeW1zLAorCQkJCW51bV9zeW1zLCAmc3RyaW5nc19zaXplLAorCQkJCW9ial9zb21fY29tcGlsYXRpb25fdW5pdCAoYWJmZCkpCisgICAgICA9PSBmYWxzZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIGhlYWRlciBhbmQgdXBkYXRlIHRoZQorICAgICBjdXJyZW50IG9mZnNldC4gICovCisgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOworICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7CisKKyAgLyogRG8gcHJlcCB3b3JrIGJlZm9yZSBoYW5kbGluZyBmaXh1cHMuICAqLworICBzb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLAorCQkgICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSwKKwkJICAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKKworICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHRoZSBmaXh1cCBzdHJlYW0gd2hpY2ggc3RhcnRzIG9uIGEKKyAgICAgd29yZCBib3VuZGFyeS4gICovCisgIGlmIChjdXJyZW50X29mZnNldCAlIDQpCisgICAgY3VycmVudF9vZmZzZXQgKz0gKDQgLSAoY3VycmVudF9vZmZzZXQgJSA0KSk7IAorICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Zml4dXBfcmVxdWVzdF9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OworCisgIC8qIFdyaXRlIHRoZSBmaXh1cHMgYW5kIHVwZGF0ZSBmaWVsZHMgaW4gc3Vic3BhY2UgaGVhZGVycyB3aGljaAorICAgICByZWxhdGUgdG8gdGhlIGZpeHVwIHN0cmVhbS4gICovCisgIGlmIChzb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgJnRvdGFsX3JlbG9jX3NpemUpID09IGZhbHNlKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBSZWNvcmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpeHVwIHN0cmVhbSBpbiB0aGUgZmlsZSBoZWFkZXIuICAqLworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Zml4dXBfcmVxdWVzdF90b3RhbCA9IHRvdGFsX3JlbG9jX3NpemU7CisKKyAgLyogRG9uZS4gIFN0b3JlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBTT00uICAqLworICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c29tX2xlbmd0aCA9IGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZTsKKyAKKyAgLyogTm93IHRoYXQgdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBpcyBjb21wbGV0ZSwgYnVpbGQgYW5kCisgICAgIHdyaXRlIHRoZSBzeW1ib2wgdGFibGUuICAqLworICBpZiAoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgKGFiZmQpID09IGZhbHNlKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBTdWJzcGFjZXMgYXJlIHdyaXR0ZW4gZmlyc3Qgc28gdGhhdCB3ZSBjYW4gc2V0IHVwIGluZm9ybWF0aW9uCisgICAgIGFib3V0IHRoZW0gaW4gdGhlaXIgY29udGFpbmluZyBzcGFjZXMgYXMgdGhlIHN1YnNwYWNlIGlzIHdyaXR0ZW4uICAqLworCisgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IHJlY29yZHMuICAqLworICBsb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbjsKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOworICAvKiBOb3cgZm9yIGVhY2ggbG9hZGFibGUgc3BhY2Ugd3JpdGUgb3V0IHJlY29yZHMgZm9yIGl0cyBzdWJzcGFjZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOworCisgICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLworICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQorCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworCisgICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLworICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7CisJICAgc3Vic2VjdGlvbiAhPSBOVUxMOworCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQorCXsKKwkgIAorCSAgLyogU2tpcCBhbnkgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BhY2UKKwkgICAgIG9yIHN1YnNwYWNlLiAgT3IgZG9lcyBub3QgaGF2ZSBTRUNfQUxMT0Mgc2V0IChhbmQgdGhlcmVmb3JlCisJICAgICBoYXMgbm8gcmVhbCBiaXRzIG9uIHRoZSBkaXNrKS4gICovCisJICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKKwkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKKwkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCisJICAgIGNvbnRpbnVlOworCisJICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCisJICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQWxzbworCSAgICAgc2V0ICJpc19sb2FkYWJsZSIgaW4gdGhlIGNvbnRhaW5pbmcgc3BhY2UuICAqLworCisJICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCisJICAgIHsKKwkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOworCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAorCQk9IHN1YnNwYWNlX2luZGV4OworCSAgICB9CisKKwkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCisJICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCisJICBzdWJzcGFjZV9pbmRleCsrOworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5Kys7CisKKwkgIC8qIE1hcmsgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHNwYWNlIHdpdGhpbiB0aGUgc3Vic3BhY2UncworCSAgICAgZGljdGlvbmFyeSByZWNvcmQuICAqLworCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnNwYWNlX2luZGV4ID0gaTsKKwkgIAorCSAgLyogRHVtcCB0aGUgY3VycmVudCBzdWJzcGFjZSBoZWFkZXIuICAqLworCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQorCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCisgICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCisgICAgfQorCisgIC8qIE5vdyByZXBlYXQgdGhlIHByb2Nlc3MgZm9yIHVubG9hZGFibGUgc3Vic3BhY2VzLiAgKi8KKyAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOworICAvKiBOb3cgZm9yIGVhY2ggc3BhY2Ugd3JpdGUgb3V0IHJlY29yZHMgZm9yIGl0cyBzdWJzcGFjZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOworCisgICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLworICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQorCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworCisgICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLworICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7CisJICAgc3Vic2VjdGlvbiAhPSBOVUxMOworCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQorCXsKKwkgIAorCSAgLyogU2tpcCBhbnkgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgc3BhY2Ugb3IKKwkgICAgIHN1YnNwYWNlLCBvciB3aGljaCBTRUNfQUxMT0Mgc2V0IChhbmQgdGhlcmVmb3JlIGhhbmRsZWQKKwkgICAgIGluIHRoZSBsb2FkYWJsZSBzcGFjZXMvc3Vic3BhY2VzIGNvZGUgYWJvdmUpLiAgKi8KKworCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCisJICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCisJICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQorCSAgICBjb250aW51ZTsKKworCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3Vic3BhY2UgZm9yIHRoaXMgc3BhY2UsIHRoZW4gc2F2ZQorCSAgICAgdGhlIGluZGV4IG9mIHRoZSBzdWJzcGFjZSBpbiBpdHMgY29udGFpbmluZyBzcGFjZS4gIENsZWFyCisJICAgICAiaXNfbG9hZGFibGUiLiAgKi8KKworCSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9xdWFudGl0eSA9PSAwKQorCSAgICB7CisJICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmlzX2xvYWRhYmxlID0gMDsKKwkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfaW5kZXgKKwkJPSBzdWJzcGFjZV9pbmRleDsKKwkgICAgfQorCisJICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgc2VlbiBhbmQgdGhlIG51bWJlciBvZgorCSAgICAgc3Vic3BhY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgc3BhY2UuICAqLworCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5Kys7CisJICBzdWJzcGFjZV9pbmRleCsrOyAKKworCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCisJICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCisJICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOworCSAgCisJICAvKiBEdW1wIHRoaXMgc3Vic3BhY2UgaGVhZGVyLiAgKi8KKwkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LAorCQkJIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKKwkgICAgICAhPSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLworICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7IAorICAgIH0KKworICAvKiBBbGwgdGhlIHN1YnNwYWNlIGRpY3Rpb25kYXJ5IHJlY29yZHMgYXJlIHdyaXR0ZW4sIGFuZCBhbGwgdGhlCisgICAgIGZpZWxkcyBhcmUgc2V0IHVwIGluIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IHJlY29yZHMuCisKKyAgICAgU2VlayB0byB0aGUgcmlnaHQgbG9jYXRpb24gYW5kIHN0YXJ0IHdyaXRpbmcgdGhlIHNwYWNlCisgICAgIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCisgIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCisgICAgeworCisgICAgICAvKiBGaW5kIGEgc3BhY2UuICAqLworICAgICAgd2hpbGUgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pKQorCXNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworCisgICAgICAvKiBEdW1wIGl0cyBoZWFkZXIgICovCisgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCwKKwkJICAgICBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCisJICAhPSBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBHb3RvIHRoZSBuZXh0IHNlY3Rpb24uICAqLworICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7CisgICAgfQorCisgIC8qIFdyaXRlIHRoZSBjb21waWxhdGlvbiB1bml0IHJlY29yZCBpZiB0aGVyZSBpcyBvbmUuICAqLworICBpZiAob2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKKyAgICB7CisgICAgICBsb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl9sb2NhdGlvbjsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSwKKwkJICAgICBDT01QVU5JVFNaLCAxLCBhYmZkKSAhPSBDT01QVU5JVFNaKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFNldHRpbmcgb2YgdGhlIHN5c3RlbV9pZCBoYXMgdG8gaGFwcGVuIHZlcnkgbGF0ZSBub3cgdGhhdCBjb3B5aW5nIG9mCisgICAgIEJGRCBwcml2YXRlIGRhdGEgaGFwcGVucyAqYWZ0ZXIqIHNlY3Rpb24gY29udGVudHMgYXJlIHNldC4gICovCisgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKKyAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPnN5c3RlbV9pZDsKKyAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBwYTIwKQorICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMl8wOworICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMTEpCisgICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MxXzE7CisgIGVsc2UKKyAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMDsKKworICAvKiBDb21wdXRlIHRoZSBjaGVja3N1bSBmb3IgdGhlIGZpbGUgaGVhZGVyIGp1c3QgYmVmb3JlIHdyaXRpbmcKKyAgICAgdGhlIGhlYWRlciB0byBkaXNrLiAgKi8KKyAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNoZWNrc3VtID0gc29tX2NvbXB1dGVfY2hlY2tzdW0gKGFiZmQpOworCisgIC8qIE9ubHkgdGhpbmcgbGVmdCB0byBkbyBpcyB3cml0ZSBvdXQgdGhlIGZpbGUgaGVhZGVyLiAgSXQgaXMgYWx3YXlzCisgICAgIGF0IGxvY2F0aW9uIHplcm8uICBTZWVrIHRoZXJlIGFuZCB3cml0ZSBpdC4gICovCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCksCisJCSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpLCAxLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm93IHdyaXRlIHRoZSBleGVjIGhlYWRlci4gICovCisgIGlmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkKKyAgICB7CisgICAgICBsb25nIHRtcCwgc29tX2xlbmd0aDsKKyAgICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmV4ZWNfaGVhZGVyOworCisgICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOworICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZmxhZ3MgPSBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3M7CisKKyAgICAgIC8qIE9oIGpveXMuICBSYW0gc29tZSBvZiB0aGUgQlNTIGRhdGEgaW50byB0aGUgREFUQSBzZWN0aW9uCisJIHRvIGJlIGNvbXBhdGFibGUgd2l0aCBob3cgdGhlIGhwIGxpbmtlciBtYWtlcyBvYmplY3RzCisJIChzYXZlcyBtZW1vcnkgc3BhY2UpLiAgKi8KKyAgICAgIHRtcCA9IGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplOworICAgICAgdG1wID0gU09NX0FMSUdOICh0bXAsIFBBX1BBR0VTSVpFKTsKKyAgICAgIGV4ZWNfaGVhZGVyLT5leGVjX2JzaXplIC09ICh0bXAgLSBleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSk7CisgICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPCAwKQorCWV4ZWNfaGVhZGVyLT5leGVjX2JzaXplID0gMDsKKyAgICAgIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplID0gdG1wOworCisgICAgICAvKiBOb3cgcGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MuICBUaGUgaWRlYSBpcyB0byBjYXRjaCBib2dvbnMgbm93IGFuZAorCSBpbmZvcm0gdGhlIHVzZXIsIGluc3RlYWQgb2Ygc2lsZW50bHkgZ2VuZXJhdGluZyBhIGJvZ3VzIGZpbGUuICAqLworICAgICAgc29tX2xlbmd0aCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOworICAgICAgaWYgKGV4ZWNfaGVhZGVyLT5leGVjX3RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgPiBzb21fbGVuZ3RoCisJICB8fCBleGVjX2hlYWRlci0+ZXhlY19kZmlsZSArIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplID4gc29tX2xlbmd0aCkKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfbG9jYXRpb24sCisJCSAgICBTRUVLX1NFVCkgPCAwKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgZXhlY19oZWFkZXIsIEFVWF9IRFJfU0laRSwgMSwgYWJmZCkKKwkgICE9IEFVWF9IRFJfU0laRSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBjaGVja3N1bSBmb3IgYSBTT00gZmlsZSBoZWFkZXIuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworc29tX2NvbXB1dGVfY2hlY2tzdW0gKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgdW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY291bnQsIGk7CisgIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nICopIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpOworCisgIGNoZWNrc3VtID0gMDsKKyAgY291bnQgPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpIC8gc2l6ZW9mICh1bnNpZ25lZCBsb25nKTsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgY2hlY2tzdW0gXj0gKihidWZmZXIgKyBpKTsKKworICByZXR1cm4gY2hlY2tzdW07Cit9CisKK3N0YXRpYyB2b2lkCitzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChhYmZkLCBzeW0sIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltOworICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKmluZm87Cit7CisgIC8qIEluaXRpYWxpemUuICAqLworICBtZW1zZXQgKGluZm8sIDAsIHNpemVvZiAoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKSk7CisKKyAgLyogVGhlIEhQIFNPTSBsaW5rZXIgcmVxdWlyZXMgZGV0YWlsZWQgdHlwZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICBhbGwgc3ltYm9scyAoaW5jbHVkaW5nIHVuZGVmaW5lZCBzeW1ib2xzISkuICBVbmZvcnR1bmF0ZWx5LAorICAgICB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gYW4gaW1wb3J0L2V4cG9ydCBzdGF0ZW1lbnQgZG9lcyBub3QKKyAgICAgYWx3YXlzIG1hdGNoIHdoYXQgdGhlIGxpbmtlciB3YW50cy4gIFNldmVyZSBicmFpbmRhbWFnZS4gICovCisJIAorICAvKiBTZWN0aW9uIHN5bWJvbHMgd2lsbCBub3QgaGF2ZSBhIFNPTSBzeW1ib2wgdHlwZSBhc3NpZ25lZCB0bworICAgICB0aGVtIHlldC4gIEFzc2lnbiBhbGwgc2VjdGlvbiBzeW1ib2xzIHR5cGUgU1RfREFUQS4gICovCisgIGlmIChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQorICAgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfREFUQTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENvbW1vbiBzeW1ib2xzIG11c3QgaGF2ZSBzY29wZSBTU19VTlNBVCBhbmQgdHlwZQorCSBTVF9TVE9SQUdFIG9yIHRoZSBsaW5rZXIgd2lsbCBjaG9rZS4gICovCisgICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQorCXsKKwkgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOworCSAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TVE9SQUdFOworCX0KKworICAgICAgLyogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN5bWJvbCB3aXRob3V0IGFuIGFzc29jaWF0ZWQKKwkgdHlwZS4gIFRoaXMgaGFwcGVucyBpZiB0aGUgdXNlciBpbXBvcnRlZCB0aGUgc3ltYm9sCisJIHdpdGhvdXQgYSB0eXBlIGFuZCB0aGUgc3ltYm9sIHdhcyBuZXZlciBkZWZpbmVkCisJIGxvY2FsbHkuICBJZiBCU0ZfRlVOQ1RJT04gaXMgc2V0IGZvciB0aGlzIHN5bWJvbCwgdGhlbgorCSBhc3NpZ24gaXQgdHlwZSBTVF9DT0RFICh0aGUgSFAgbGlua2VyIHJlcXVpcmVzIHVuZGVmaW5lZAorCSBleHRlcm5hbCBmdW5jdGlvbnMgdG8gaGF2ZSB0eXBlIFNUX0NPREUgcmF0aGVyIHRoYW4gU1RfRU5UUlkpLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KKwkJfHwgc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9DT0RFKQorCSAgICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKKwkgICAgICAgJiYgc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikKKwlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7CisKKyAgICAgIC8qIEhhbmRsZSBmdW5jdGlvbiBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUuCisJIFRoZXkgc2hvdWxkIGhhdmUgdHlwZSBTVF9FTlRSWS4gIEFsc28gcmV0cmlldmUgdGhlIGFyZ3VtZW50CisJIHJlbG9jYXRpb24gYml0cyBmcm9tIHRoZSBTT00gYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCisgICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0VOVFJZCisJICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUKKwkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKQorCSAgICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOCisJCSAgICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkpCisJeworCSAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9FTlRSWTsKKwkgIGluZm8tPmFyZ19yZWxvYyA9IHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYzsKKwkgIGluZm8tPnByaXZfbGV2ZWw9IHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWw7CisJfQorCisgICAgICAvKiBGb3IgdW5rbm93biBzeW1ib2xzIHNldCB0aGUgc3ltYm9sJ3MgdHlwZSBiYXNlZCBvbiB0aGUgc3ltYm9sJ3MKKwkgc2VjdGlvbiAoU1RfREFUQSBmb3IgREFUQSBzZWN0aW9ucywgU1RfQ09ERSBmb3IgQ09ERSBzZWN0aW9ucykuICAqLworICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9VTktOT1dOKQorCXsKKwkgIGlmIChzeW0tPnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCisJICAgIGluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKKwkgIGVsc2UKKwkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOworCX0KKyAgCisgICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCisJaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOworCisgICAgICAvKiBGcm9tIG5vdyBvbiBpdCdzIGEgdmVyeSBzaW1wbGUgbWFwcGluZy4gICovCisgICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0FCU09MVVRFKQorCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQUJTT0xVVEU7CisgICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCisJaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOworICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9EQVRBKQorCWluZm8tPnN5bWJvbF90eXBlID0gU1RfREFUQTsKKyAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfTUlMTElDT0RFKQorCWluZm8tPnN5bWJvbF90eXBlID0gU1RfTUlMTElDT0RFOworICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9QTEFCRUwpCisJaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QTEFCRUw7CisgICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BSSV9QUk9HKQorCWluZm8tPnN5bWJvbF90eXBlID0gU1RfUFJJX1BST0c7CisgICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1NFQ19QUk9HKQorCWluZm8tPnN5bWJvbF90eXBlID0gU1RfU0VDX1BST0c7CisgICAgfQorCQorICAvKiBOb3cgaGFuZGxlIHRoZSBzeW1ib2wncyBzY29wZS4gIEV4cG9ydGVkIGRhdGEgd2hpY2ggaXMgbm90CisgICAgIGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUgU1NfVU5JVkVSU0FMLiAgTm90ZSBzY29wZQorICAgICBvZiBjb21tb24gc3ltYm9scyB3YXMgaGFuZGxlZCBlYXJsaWVyISAgKi8KKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKKyAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTlNBVDsKKyAgZWxzZSBpZiAoc3ltLT5mbGFncyAmIEJTRl9FWFBPUlQgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCisgICAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5JVkVSU0FMOworICAvKiBBbnl0aGluZyBlbHNlIHdoaWNoIGlzIG5vdCBpbiB0aGUgY29tbW9uIHNlY3Rpb24gaGFzIHNjb3BlCisgICAgIFNTX0xPQ0FMLiAgKi8KKyAgZWxzZSBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCisgICAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfTE9DQUw7CisKKyAgLyogTm93IHNldCB0aGUgc3ltYm9sX2luZm8gZmllbGQuICBJdCBoYXMgbm8gcmVhbCBtZWFuaW5nCisgICAgIGZvciB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbHMsIGJ1dCB0aGUgSFAgbGlua2VyIHdpbGwKKyAgICAgY2hva2UgaWYgaXQncyBub3Qgc2V0IHRvIHNvbWUgInJlYXNvbmFibGUiIHZhbHVlLiAgV2UKKyAgICAgdXNlIHplcm8gYXMgYSByZWFzb25hYmxlIHZhbHVlLiAgKi8KKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQorICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCisgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCisgICAgaW5mby0+c3ltYm9sX2luZm8gPSAwOworICAvKiBGb3IgYWxsIG90aGVyIHN5bWJvbHMsIHRoZSBzeW1ib2xfaW5mbyBmaWVsZCBjb250YWlucyB0aGUgCisgICAgIHN1YnNwYWNlIGluZGV4IG9mIHRoZSBzcGFjZSB0aGlzIHN5bWJvbCBpcyBjb250YWluZWQgaW4uICAqLworICBlbHNlCisgICAgaW5mby0+c3ltYm9sX2luZm8gPSBzeW0tPnNlY3Rpb24tPnRhcmdldF9pbmRleDsKKworICAvKiBTZXQgdGhlIHN5bWJvbCdzIHZhbHVlLiAgKi8KKyAgaW5mby0+c3ltYm9sX3ZhbHVlID0gc3ltLT52YWx1ZSArIHN5bS0+c2VjdGlvbi0+dm1hOworfQorCisvKiBCdWlsZCBhbmQgd3JpdGUsIGluIG9uZSBiaWcgY2h1bmssIHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlIGZvcgorICAgdGhpcyBCRkQuICAqLworCitzdGF0aWMgYm9vbGVhbgorc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgdW5zaWduZWQgaW50IG51bV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisgIGZpbGVfcHRyIHN5bXRhYl9sb2NhdGlvbiA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfbG9jYXRpb247CisgIGFzeW1ib2wgKipiZmRfc3ltcyA9IG9ial9zb21fc29ydGVkX3N5bXMgKGFiZmQpOworICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpzb21fc3ltdGFiID0gTlVMTDsKKyAgaW50IGksIHN5bXRhYl9zaXplOworCisgIC8qIENvbXB1dGUgdG90YWwgc3ltYm9sIHRhYmxlIHNpemUgYW5kIGFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5CisgICAgIHRvIGhvbGQgdGhlIHN5bWJvbCB0YWJsZSBhcyB3ZSBidWlsZCBpdC4gICovCisgIHN5bXRhYl9zaXplID0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOworICBzb21fc3ltdGFiID0gKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKikgYmZkX21hbGxvYyAoc3ltdGFiX3NpemUpOworICBpZiAoc29tX3N5bXRhYiA9PSBOVUxMICYmIHN5bXRhYl9zaXplICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIG1lbXNldCAoc29tX3N5bXRhYiwgMCwgc3ltdGFiX3NpemUpOworCisgIC8qIFdhbGsgb3ZlciBlYWNoIHN5bWJvbC4gICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyBpbmZvOworCisgICAgICAvKiBUaGlzIGlzIHJlYWxseSBhbiBpbmRleCBpbnRvIHRoZSBzeW1ib2wgc3RyaW5ncyB0YWJsZS4gIAorCSBCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgdGhlIGluZGV4IGhhcyBhbHJlYWR5IGJlZW4gCisJIGNvbXB1dGVkIGFuZCBzdG9yZWQgaW50byB0aGUgbmFtZSBmaWVsZCBpbiB0aGUgQkZEIHN5bWJvbC4gICovCisgICAgICBzb21fc3ltdGFiW2ldLm5hbWUubl9zdHJ4ID0gc29tX3N5bWJvbF9kYXRhKGJmZF9zeW1zW2ldKS0+c3RyaW5ndGFiX29mZnNldDsKKworICAgICAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KKyAgICAgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIGJmZF9zeW1zW2ldLCAmaW5mbyk7CisKKyAgICAgIC8qIE5vdyB1c2UgaXQuICAqLworICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfdHlwZSA9IGluZm8uc3ltYm9sX3R5cGU7CisgICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF9zY29wZSA9IGluZm8uc3ltYm9sX3Njb3BlOworICAgICAgc29tX3N5bXRhYltpXS5hcmdfcmVsb2MgPSBpbmZvLmFyZ19yZWxvYzsKKyAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX2luZm8gPSBpbmZvLnN5bWJvbF9pbmZvOworICAgICAgc29tX3N5bXRhYltpXS54bGVhc3QgPSAzOworICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfdmFsdWUgPSBpbmZvLnN5bWJvbF92YWx1ZSB8IGluZm8ucHJpdl9sZXZlbDsKKyAgICB9CisKKyAgLyogRXZlcnl0aGluZyBpcyByZWFkeSwgc2VlayB0byB0aGUgcmlnaHQgbG9jYXRpb24gYW5kCisgICAgIHNjcmliYmxlIG91dCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW10YWJfbG9jYXRpb24sIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc3ltdGFiLCBzeW10YWJfc2l6ZSwgMSwgYWJmZCkgIT0gc3ltdGFiX3NpemUpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKHNvbV9zeW10YWIgIT0gTlVMTCkKKyAgICBmcmVlIChzb21fc3ltdGFiKTsKKyAgcmV0dXJuIHRydWU7CisgZXJyb3JfcmV0dXJuOgorICBpZiAoc29tX3N5bXRhYiAhPSBOVUxMKQorICAgIGZyZWUgKHNvbV9zeW10YWIpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFdyaXRlIGFuIG9iamVjdCBpbiBTT00gZm9ybWF0LiAgKi8gIAorCitzdGF0aWMgYm9vbGVhbgorc29tX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKKyAgICB7CisgICAgICAvKiBTZXQgdXAgZml4ZWQgcGFydHMgb2YgdGhlIGZpbGUsIHNwYWNlLCBhbmQgc3Vic3BhY2UgaGVhZGVycy4KKwkgTm90aWZ5IHRoZSB3b3JsZCB0aGF0IG91dHB1dCBoYXMgYmVndW4uICAqLworICAgICAgc29tX3ByZXBfaGVhZGVycyAoYWJmZCk7CisgICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKKyAgICAgIC8qIFN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpbmNsdWRlIGFsbCB0aGUgc3RyaW5nCisJIHRhYmxlcywgZml4dXAgc3RyZWFtcywgYW5kIG90aGVyIHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCisgICAgICBzb21fYmVnaW5fd3JpdGluZyAoYWJmZCk7CisgICAgfQorCisgIHJldHVybiAoc29tX2ZpbmlzaF93cml0aW5nIChhYmZkKSk7Cit9CisKKwwKKy8qIFJlYWQgYW5kIHNhdmUgdGhlIHN0cmluZyB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEJGRC4gICovCisKK3N0YXRpYyBib29sZWFuCitzb21fc2x1cnBfc3RyaW5nX3RhYmxlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgKnN0cmluZ3RhYjsKKworICAvKiBVc2UgdGhlIHNhdmVkIHZlcnNpb24gaWYgaXRzIGF2YWlsYWJsZS4gICovCisgIGlmIChvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkgIT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIGN1cnJlbnRseSBoYXBwZW4sIGFuZCBJJ20gbm90IHN1cmUgaXQgc2hvdWxkCisgICAgIHJlYWxseSBiZSBhbiBlcnJvciwgYnV0IGl0J3MgYmV0dGVyIHRoYW4gZ2V0dGluZyB1bnByZWRpY3RhYmxlIHJlc3VsdHMKKyAgICAgZnJvbSB0aGUgaG9zdCdzIG1hbGxvYyB3aGVuIHBhc3NlZCBhIHNpemUgb2YgemVyby4gICovCisgIGlmIChvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgYW5kIHJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCisgIHN0cmluZ3RhYiA9IGJmZF9tYWxsb2MgKG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKTsKKyAgaWYgKHN0cmluZ3RhYiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgbWVtc2V0IChzdHJpbmd0YWIsIDAsIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmIChiZmRfcmVhZCAoc3RyaW5ndGFiLCBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSwgMSwgYWJmZCkKKyAgICAgICE9IG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBTYXZlIG91ciByZXN1bHRzIGFuZCByZXR1cm4gc3VjY2Vzcy4gKi8KKyAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gc3RyaW5ndGFiOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSAoaW4gYnl0ZXMpIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN5bWJvbAorICAgdGFibGUgZm9yIHRoaXMgb2JqZWN0LiAgKi8KKworc3RhdGljIGxvbmcKK3NvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmICghc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOworfQorCisvKiBDb252ZXJ0IGZyb20gYSBTT00gc3Vic3BhY2UgaW5kZXggdG8gYSBCRkQgc2VjdGlvbi4gICovCisKK3N0YXRpYyBhc2VjdGlvbiAqCitiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgKGFiZmQsIHN5bWJvbCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpzeW1ib2w7Cit7CisgIGFzZWN0aW9uICpzZWN0aW9uOworCisgIC8qIFRoZSBtZWFuaW5nIG9mIHRoZSBzeW1ib2xfaW5mbyBmaWVsZCBjaGFuZ2VzIGZvciBmdW5jdGlvbnMKKyAgICAgd2l0aGluIGV4ZWN1dGFibGVzLiAgU28gb25seSB1c2UgdGhlIHF1aWNrIHN5bWJvbF9pbmZvIG1hcHBpbmcgZm9yCisgICAgIGluY29tcGxldGUgb2JqZWN0cyBhbmQgbm9uLWZ1bmN0aW9uIHN5bWJvbHMgaW4gZXhlY3V0YWJsZXMuICAqLworICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwCisgICAgICB8fCAoc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9FTlRSWQorCSAgJiYgc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9QUklfUFJPRworCSAgJiYgc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9TRUNfUFJPRworCSAgJiYgc3ltYm9sLT5zeW1ib2xfdHlwZSAhPSBTVF9NSUxMSUNPREUpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IHN5bWJvbC0+c3ltYm9sX2luZm87CisgICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKKwlpZiAoc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID09IGluZGV4ICYmIHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCisJICByZXR1cm4gc2VjdGlvbjsKKworICAgICAgLyogQ291bGQgYmUgYSBzeW1ib2wgZnJvbSBhbiBleHRlcm5hbCBsaWJyYXJ5IChzdWNoIGFzIGFuIE9NT1MKKwkgc2hhcmVkIGxpYnJhcnkpLiAgRG9uJ3QgYWJvcnQuICAqLworICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSBzeW1ib2wtPnN5bWJvbF92YWx1ZTsKKworICAgICAgLyogRm9yIGV4ZWN1dGFibGVzIHdlIHdpbGwgaGF2ZSB0byB1c2UgdGhlIHN5bWJvbCdzIGFkZHJlc3MgYW5kCisJIGZpbmQgb3V0IHdoYXQgc2VjdGlvbiB3b3VsZCBjb250YWluIHRoYXQgYWRkcmVzcy4gICBZdWsuICAqLworICAgICAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorCXsKKwkgIGlmICh2YWx1ZSA+PSBzZWN0aW9uLT52bWEKKwkgICAgICAmJiB2YWx1ZSA8PSBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUKKwkgICAgICAmJiBzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQorCSAgICByZXR1cm4gc2VjdGlvbjsKKwl9CisKKyAgICAgIC8qIENvdWxkIGJlIGEgc3ltYm9sIGZyb20gYW4gZXh0ZXJuYWwgbGlicmFyeSAoc3VjaCBhcyBhbiBPTU9TCisJIHNoYXJlZCBsaWJyYXJ5KS4gIERvbid0IGFib3J0LiAgKi8KKyAgICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOworCisgICAgfQorfQorCisvKiBSZWFkIGFuZCBzYXZlIHRoZSBzeW1ib2wgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBCRkQuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50Citzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBzeW1ib2xfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKKyAgaW50IHN5bXNpemUgPSBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOworICBjaGFyICpzdHJpbmd0YWI7CisgIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKmJ1ZiA9IE5VTEwsICpidWZwLCAqZW5kYnVmcDsKKyAgc29tX3N5bWJvbF90eXBlICpzeW0sICpzeW1iYXNlOworCisgIC8qIFJldHVybiBzYXZlZCB2YWx1ZSBpZiBpdCBleGlzdHMuICAqLworICBpZiAob2JqX3NvbV9zeW10YWIgKGFiZmQpICE9IE5VTEwpCisgICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKKworICAvKiBTcGVjaWFsIGNhc2UuICBUaGlzIGlzICpub3QqIGFuIGVycm9yLiAgKi8KKyAgaWYgKHN5bWJvbF9jb3VudCA9PSAwKQorICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47CisKKyAgaWYgKCFzb21fc2x1cnBfc3RyaW5nX3RhYmxlIChhYmZkKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBzdHJpbmd0YWIgPSBvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCk7CisKKyAgc3ltYmFzZSA9ICgoc29tX3N5bWJvbF90eXBlICopCisJICAgICBiZmRfbWFsbG9jIChzeW1ib2xfY291bnQgKiBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpKTsKKyAgaWYgKHN5bWJhc2UgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgbWVtc2V0IChzeW1iYXNlLCAwLCBzeW1ib2xfY291bnQgKiBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpOworCisgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIFNPTSByZXByZXNlbnRhdGlvbi4gICovCisgIGJ1ZiA9IGJmZF9tYWxsb2MgKHN5bWJvbF9jb3VudCAqIHN5bXNpemUpOworICBpZiAoYnVmID09IE5VTEwgJiYgc3ltYm9sX2NvdW50ICogc3ltc2l6ZSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgPCAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBpZiAoYmZkX3JlYWQgKGJ1Ziwgc3ltYm9sX2NvdW50ICogc3ltc2l6ZSwgMSwgYWJmZCkgCisgICAgICAhPSBzeW1ib2xfY291bnQgKiBzeW1zaXplKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHN5bWJvbHMgYW5kIGludGVybmFsaXplIHRoZW0uICAqLworICBlbmRidWZwID0gYnVmICsgc3ltYm9sX2NvdW50OworICBmb3IgKGJ1ZnAgPSBidWYsIHN5bSA9IHN5bWJhc2U7IGJ1ZnAgPCBlbmRidWZwOyArK2J1ZnApCisgICAgeworCisgICAgICAvKiBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYWJvdXQgdGhlc2UuICAqLworICAgICAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKKwkgIHx8IGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCisJY29udGludWU7CisKKyAgICAgIC8qIFNldCBzb21lIHByaXZhdGUgZGF0YSB3ZSBjYXJlIGFib3V0LiAgKi8KKyAgICAgIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9OVUxMKQorCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9VTktOT1dOOworICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQUJTT0xVVEUpCisJc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0FCU09MVVRFOworICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfREFUQSkKKwlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKKyAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0NPREUpCisJc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX0NPREU7CisgICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9QUklfUFJPRykKKwlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfUFJJX1BST0c7CisgICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9TRUNfUFJPRykKKwlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfU0VDX1BST0c7CisgICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9FTlRSWSkKKwlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfRU5UUlk7CisgICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9NSUxMSUNPREUpCisJc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX01JTExJQ09ERTsKKyAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1BMQUJFTCkKKwlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfUExBQkVMOworICAgICAgZWxzZQorCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9VTktOT1dOOworICAgICAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jID0gYnVmcC0+YXJnX3JlbG9jOworCisgICAgICAvKiBTb21lIHJlYXNvbmFibGUgZGVmYXVsdHMuICAqLworICAgICAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7CisgICAgICBzeW0tPnN5bWJvbC5uYW1lID0gYnVmcC0+bmFtZS5uX3N0cnggKyBzdHJpbmd0YWI7CisgICAgICBzeW0tPnN5bWJvbC52YWx1ZSA9IGJ1ZnAtPnN5bWJvbF92YWx1ZTsKKyAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSAwOworICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgPSAwOworCisgICAgICBzd2l0Y2ggKGJ1ZnAtPnN5bWJvbF90eXBlKQorCXsKKwljYXNlIFNUX0VOVFJZOgorCWNhc2UgU1RfTUlMTElDT0RFOgorCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCSAgc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9CisJICAgIHN5bS0+c3ltYm9sLnZhbHVlICYgMHgzOworCSAgc3ltLT5zeW1ib2wudmFsdWUgJj0gfjB4MzsKKwkgIGJyZWFrOworCisJY2FzZSBTVF9TVFVCOgorCWNhc2UgU1RfQ09ERToKKwljYXNlIFNUX1BSSV9QUk9HOgorCWNhc2UgU1RfU0VDX1BST0c6CisJICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0KKwkgICAgc3ltLT5zeW1ib2wudmFsdWUgJiAweDM7CisJICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+MHgzOworCSAgLyogSWYgdGhlIHN5bWJvbCdzIHNjb3BlIGlzIFNUX1VOU0FULCB0aGVuIHRoZXNlIGFyZQorCSAgICAgdW5kZWZpbmVkIGZ1bmN0aW9uIHN5bWJvbHMuICAqLworCSAgaWYgKGJ1ZnAtPnN5bWJvbF9zY29wZSA9PSBTU19VTlNBVCkKKwkgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCSAgICAgCisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBIYW5kbGUgc2NvcGluZyBhbmQgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCisgICAgICBzd2l0Y2ggKGJ1ZnAtPnN5bWJvbF9zY29wZSkKKwl7CisJLyogc3ltYm9sX2luZm8gZmllbGQgaXMgdW5kZWZpbmVkIGZvciBTU19FWFRFUk5BTCBhbmQgU1NfVU5TQVQgc3ltYm9scywKKwkgICBzbyB0aGUgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wgY2FuJ3QgYmUga25vd24uICAqLworCWNhc2UgU1NfRVhURVJOQUw6CisJICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKKwkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBlbHNlCisJICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOworCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKTsKKwkgIGJyZWFrOworCisJY2FzZSBTU19VTlNBVDoKKwkgIGlmIChidWZwLT5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQorCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkgIGVsc2UKKwkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7CisJICBicmVhazsKKworCWNhc2UgU1NfVU5JVkVSU0FMOgorCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKTsKKwkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgKGFiZmQsIGJ1ZnApOworCSAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisKKyNpZiAwCisJLyogU1NfR0xPQkFMIGFuZCBTU19MT0NBTCBhcmUgdHdvIG5hbWVzIGZvciB0aGUgc2FtZSB0aGluZy4KKwkgICBTb3VuZCBkdW1iPyAgSXQgaXMuICAqLworCWNhc2UgU1NfR0xPQkFMOgorI2VuZGlmCisJY2FzZSBTU19MT0NBTDoKKwkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9MT0NBTDsKKwkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wgKGFiZmQsIGJ1ZnApOworCSAgc3ltLT5zeW1ib2wudmFsdWUgLT0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+dm1hOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBNYXJrIHNlY3Rpb24gc3ltYm9scyBhbmQgc3ltYm9scyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4KKwkgTm90ZSAkU1RBUlQkIGlzIGEgbWFnaWMgY29kZSBzeW1ib2wsIE5PVCBhIHNlY3Rpb24gc3ltYm9sLiAgKi8KKyAgICAgIGlmIChzeW0tPnN5bWJvbC5uYW1lWzBdID09ICckJworCSAgJiYgc3ltLT5zeW1ib2wubmFtZVtzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpIC0gMV0gPT0gJyQnCisJICAmJiAhc3RyY21wIChzeW0tPnN5bWJvbC5uYW1lLCBzeW0tPnN5bWJvbC5zZWN0aW9uLT5uYW1lKSkKKwlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07CisgICAgICBlbHNlIGlmICghc3RybmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgIkwkMFwwMDIiLCA0KSkKKwl7CisJICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07CisJICBzeW0tPnN5bWJvbC5uYW1lID0gc3ltLT5zeW1ib2wuc2VjdGlvbi0+bmFtZTsKKwl9CisgICAgICBlbHNlIGlmICghc3RybmNtcCAoc3ltLT5zeW1ib2wubmFtZSwgIkwkMFwwMDEiLCA0KSkKKwlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOworCisgICAgICAvKiBOb3RlIGluY3JlbWVudCBhdCBib3R0b20gb2YgbG9vcCwgc2luY2Ugd2Ugc2tpcCBzb21lIHN5bWJvbHMKKyAgICAgICAgIHdlIGNhbiBub3QgaW5jbHVkZSBpdCBhcyBwYXJ0IG9mIHRoZSBmb3Igc3RhdGVtZW50LiAgKi8KKyAgICAgIHN5bSsrOworICAgIH0KKworICAvKiBXZSBtb2RpZnkgdGhlIHN5bWJvbCBjb3VudCB0byByZWNvcmQgdGhlIG51bWJlciBvZiBCRkQgc3ltYm9scyB3ZQorICAgICBjcmVhdGVkLiAgKi8KKyAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW0gLSBzeW1iYXNlOworCisgIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAgKi8KKyAgb2JqX3NvbV9zeW10YWIgKGFiZmQpID0gc3ltYmFzZTsKKyBzdWNjZXNzZnVsX3JldHVybjoKKyAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIGZyZWUgKGJ1Zik7CisgIHJldHVybiAodHJ1ZSk7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChidWYgIT0gTlVMTCkKKyAgICBmcmVlIChidWYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIENhbm9uaWNhbGl6ZSBhIFNPTSBzeW1ib2wgdGFibGUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzCisgICBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIGxvbmcKK3NvbV9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqbG9jYXRpb247Cit7CisgIGludCBpOworICBzb21fc3ltYm9sX3R5cGUgKnN5bWJhc2U7CisKKyAgaWYgKCFzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaSA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICBzeW1iYXNlID0gb2JqX3NvbV9zeW10YWIgKGFiZmQpOworCisgIGZvciAoOyBpID4gMDsgaS0tLCBsb2NhdGlvbisrLCBzeW1iYXNlKyspCisgICAgKmxvY2F0aW9uID0gJnN5bWJhc2UtPnN5bWJvbDsKKworICAvKiBGaW5hbCBudWxsIHBvaW50ZXIuICAqLworICAqbG9jYXRpb24gPSAwOworICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKK30KKworLyogTWFrZSBhIFNPTSBzeW1ib2wuICBUaGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4gICovCisKK3N0YXRpYyBhc3ltYm9sICoKK3NvbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzb21fc3ltYm9sX3R5cGUgKm5ldyA9CisgIChzb21fc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzb21fc3ltYm9sX3R5cGUpKTsKKyAgaWYgKG5ldyA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKworICByZXR1cm4gJm5ldy0+c3ltYm9sOworfQorCisvKiBQcmludCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgdm9pZAorc29tX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgUFRSIGFmaWxlOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKKyAgc3dpdGNoIChob3cpCisgICAgeworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgorICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgorICAgICAgZnByaW50ZiAoZmlsZSwgInNvbSAiKTsKKyAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKKyAgICAgIGZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIHN5bWJvbC0+ZmxhZ3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKKyAgICAgIHsKKwlDT05TVCBjaGFyICpzZWN0aW9uX25hbWU7CisJc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID8gc3ltYm9sLT5zZWN0aW9uLT5uYW1lIDogIigqbm9uZSopIjsKKwliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOworCWZwcmludGYgKGZpbGUsICIgJXNcdCVzIiwgc2VjdGlvbl9uYW1lLCBzeW1ib2wtPm5hbWUpOworCWJyZWFrOworICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGJvb2xlYW4KK3NvbV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKK30KKworLyogQ291bnQgb3IgcHJvY2VzcyB2YXJpYWJsZS1sZW5ndGggU09NIGZpeHVwIHJlY29yZHMuCisKKyAgIFRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gd2UgdXNlIHRoaXMgY29kZSBib3RoIHRvIGNvbXB1dGUgdGhlIG51bWJlcgorICAgb2YgcmVsb2NhdGlvbnMgcmVxdWVzdGVkIGJ5IGEgc3RyZWFtLCBhbmQgdG8gaW50ZXJuYWxpemUgdGhlIHN0cmVhbS4KKworICAgV2hlbiBjb21wdXRpbmcgdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgYSBzdHJlYW0gdGhlCisgICB2YXJpYWJsZXMgcnB0ciwgc2VjdGlvbiwgYW5kIHN5bWJvbHMgaGF2ZSBubyBtZWFuaW5nLgorCisgICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGZpeHVwIHN0cmVhbS4gIFdoZW4KKyAgIG5vdCBqdXN0IGNvdW50aW5nIAorCisgICBUaGlzIG5lZWRzIGF0IGxlYXN0IHR3byBvciB0aHJlZSBtb3JlIHBhc3NlcyB0byBnZXQgaXQgY2xlYW5lZCB1cC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NvbV9zZXRfcmVsb2NfaW5mbyAoZml4dXAsIGVuZCwgaW50ZXJuYWxfcmVsb2NzLCBzZWN0aW9uLCBzeW1ib2xzLCBqdXN0X2NvdW50KQorICAgICB1bnNpZ25lZCBjaGFyICpmaXh1cDsKKyAgICAgdW5zaWduZWQgaW50IGVuZDsKKyAgICAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7CisgICAgIGJvb2xlYW4ganVzdF9jb3VudDsKK3sKKyAgdW5zaWduZWQgaW50IG9wLCB2YXJuYW1lLCBkZWFsbG9jYXRlX2NvbnRlbnRzID0gMDsKKyAgdW5zaWduZWQgY2hhciAqZW5kX2ZpeHVwcyA9ICZmaXh1cFtlbmRdOworICBjb25zdCBzdHJ1Y3QgZml4dXBfZm9ybWF0ICpmcDsKKyAgY2hhciAqY3A7CisgIHVuc2lnbmVkIGNoYXIgKnNhdmVfZml4dXA7CisgIGludCB2YXJpYWJsZXNbMjZdLCBzdGFja1syMF0sIGMsIHYsIGNvdW50LCBwcmV2X2ZpeHVwLCAqc3AsIHNhdmVkX3Vud2luZF9iaXRzOworICBjb25zdCBpbnQgKnN1Ym9wOworICBhcmVsZW50ICpycHRyPSBpbnRlcm5hbF9yZWxvY3M7CisgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCisjZGVmaW5lCXZhcihjKQkJdmFyaWFibGVzWyhjKSAtICdBJ10KKyNkZWZpbmUJcHVzaCh2KQkJKCpzcCsrID0gKHYpKQorI2RlZmluZQlwb3AoKQkJKCotLXNwKQorI2RlZmluZQllbXB0eXN0YWNrKCkJKHNwID09IHN0YWNrKQorCisgIHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChyZWxvY19xdWV1ZSk7CisgIG1lbXNldCAodmFyaWFibGVzLCAwLCBzaXplb2YgKHZhcmlhYmxlcykpOworICBtZW1zZXQgKHN0YWNrLCAwLCBzaXplb2YgKHN0YWNrKSk7CisgIGNvdW50ID0gMDsKKyAgcHJldl9maXh1cCA9IDA7CisgIHNhdmVkX3Vud2luZF9iaXRzID0gMDsKKyAgc3AgPSBzdGFjazsKKworICB3aGlsZSAoZml4dXAgPCBlbmRfZml4dXBzKQorICAgIHsKKworICAgICAgLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGZpeHVwLiAgV2UnbGwgdXNlCisJIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gcHV0IHRoaXMgZml4dXAKKwkgb24gdGhlIHF1ZXVlLiAgKi8KKyAgICAgIHNhdmVfZml4dXAgPSBmaXh1cDsKKworICAgICAgLyogR2V0IHRoZSBmaXh1cCBjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBmb3JtYXQuICAqLworICAgICAgb3AgPSAqZml4dXArKzsKKyAgICAgIGZwID0gJnNvbV9maXh1cF9mb3JtYXRzW29wXTsKKworICAgICAgLyogSGFuZGxlIGEgcmVxdWVzdCBmb3IgYSBwcmV2aW91cyBmaXh1cC4gICovCisgICAgICBpZiAoKmZwLT5mb3JtYXQgPT0gJ1AnKQorCXsKKwkgIC8qIEdldCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByZXYgZml4dXAsIG1vdmUKKwkgICAgIHRoZSByZXBlYXRlZCBmaXh1cCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuICAqLworCSAgZml4dXAgPSByZWxvY19xdWV1ZVtmcC0+RF0ucmVsb2M7CisJICBzb21fcmVsb2NfcXVldWVfZml4IChyZWxvY19xdWV1ZSwgZnAtPkQpOworCSAgcHJldl9maXh1cCA9IDE7CisKKwkgIC8qIEdldCB0aGUgZml4dXAgY29kZSBhbmQgaXRzIGFzc29jaWF0ZWQgZm9ybWF0LiAgKi8KKwkgIG9wID0gKmZpeHVwKys7CisJICBmcCA9ICZzb21fZml4dXBfZm9ybWF0c1tvcF07CisJfQorCisgICAgICAvKiBJZiB0aGlzIGZpeHVwIHdpbGwgYmUgcGFzc2VkIHRvIEJGRCwgc2V0IHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCisgICAgICBpZiAoISBqdXN0X2NvdW50CisJICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX05PX1JFTE9DQVRJT04KKwkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfREFUQV9PVkVSUklERSkKKwl7CisJICBycHRyLT5hZGRyZXNzID0gb2Zmc2V0OworCSAgcnB0ci0+aG93dG8gPSAmc29tX2hwcGFfaG93dG9fdGFibGVbb3BdOworCSAgcnB0ci0+YWRkZW5kID0gMDsKKwkgIHJwdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CisJfQorCisgICAgICAvKiBTZXQgZGVmYXVsdCBpbnB1dCBsZW5ndGggdG8gMC4gIEdldCB0aGUgb3Bjb2RlIGNsYXNzIGluZGV4CisJIGludG8gRC4gICovCisgICAgICB2YXIgKCdMJykgPSAwOworICAgICAgdmFyICgnRCcpID0gZnAtPkQ7CisgICAgICB2YXIgKCdVJykgPSBzYXZlZF91bndpbmRfYml0czsKKworICAgICAgLyogR2V0IHRoZSBvcGNvZGUgZm9ybWF0LiAgKi8KKyAgICAgIGNwID0gZnAtPmZvcm1hdDsKKworICAgICAgLyogUHJvY2VzcyB0aGUgZm9ybWF0IHN0cmluZy4gIFBhcnNpbmcgaGFwcGVucyBpbiB0d28gcGhhc2VzLAorCSBwYXJzZSBSSFMsIHRoZW4gYXNzaWduIHRvIExIUy4gIFJlcGVhdCB1bnRpbCBubyBtb3JlIAorCSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgKi8KKyAgICAgIHdoaWxlICgqY3ApCisJeworCSAgLyogVGhlIHZhcmlhYmxlIHRoaXMgcGFzcyBpcyBnb2luZyB0byBjb21wdXRlIGEgdmFsdWUgZm9yLiAgKi8KKwkgIHZhcm5hbWUgPSAqY3ArKzsKKworCSAgLyogU3RhcnQgcHJvY2Vzc2luZyBSSFMuICBDb250aW51ZSB1bnRpbCBhIE5VTEwgb3IgJz0nIGlzIGZvdW5kLiAgKi8KKwkgIGRvCisJICAgIHsKKwkgICAgICBjID0gKmNwKys7CisKKwkgICAgICAvKiBJZiB0aGlzIGlzIGEgdmFyaWFibGUsIHB1c2ggaXQgb24gdGhlIHN0YWNrLiAgKi8KKwkgICAgICBpZiAoaXN1cHBlciAoYykpCisJCXB1c2ggKHZhciAoYykpOworCisJICAgICAgLyogSWYgdGhpcyBpcyBhIGxvd2VyIGNhc2UgbGV0dGVyLCB0aGVuIGl0IHJlcHJlc2VudHMKKwkJIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBmaXh1cCBzdHJlYW0gdG8gYmUgcHVzaGVkIG9udG8KKwkJIHRoZSBzdGFjay4gICovCisJICAgICAgZWxzZSBpZiAoaXNsb3dlciAoYykpCisJCXsKKwkJICBpbnQgYml0cyA9IChjIC0gJ2EnKSAqIDg7CisJCSAgZm9yICh2ID0gMDsgYyA+ICdhJzsgLS1jKQorCQkgICAgdiA9ICh2IDw8IDgpIHwgKmZpeHVwKys7CisJCSAgaWYgKHZhcm5hbWUgPT0gJ1YnKQorCQkgICAgdiA9IHNpZ25fZXh0ZW5kICh2LCBiaXRzKTsKKwkJICBwdXNoICh2KTsKKwkJfQorCisJICAgICAgLyogQSBkZWNpbWFsIGNvbnN0YW50LiAgUHVzaCBpdCBvbiB0aGUgc3RhY2suICAqLworCSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKGMpKQorCQl7CisJCSAgdiA9IGMgLSAnMCc7CisJCSAgd2hpbGUgKGlzZGlnaXQgKCpjcCkpCisJCSAgICB2ID0gKHYgKiAxMCkgKyAoKmNwKysgLSAnMCcpOworCQkgIHB1c2ggKHYpOworCQl9CisJICAgICAgZWxzZQorCisJCS8qIEFuIG9wZXJhdG9yLiAgUG9wIHR3byB0d28gdmFsdWVzIGZyb20gdGhlIHN0YWNrIGFuZAorCQkgICB1c2UgdGhlbSBhcyBvcGVyYW5kcyB0byB0aGUgZ2l2ZW4gb3BlcmF0aW9uLiAgUHVzaAorCQkgICB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gYmFjayBvbiB0aGUgc3RhY2suICAqLworCQlzd2l0Y2ggKGMpCisJCSAgeworCQkgIGNhc2UgJysnOgorCQkgICAgdiA9IHBvcCAoKTsKKwkJICAgIHYgKz0gcG9wICgpOworCQkgICAgcHVzaCAodik7CisJCSAgICBicmVhazsKKwkJICBjYXNlICcqJzoKKwkJICAgIHYgPSBwb3AgKCk7CisJCSAgICB2ICo9IHBvcCAoKTsKKwkJICAgIHB1c2ggKHYpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAnPCc6CisJCSAgICB2ID0gcG9wICgpOworCQkgICAgdiA9IHBvcCAoKSA8PCB2OworCQkgICAgcHVzaCAodik7CisJCSAgICBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgYWJvcnQgKCk7CisJCSAgfQorCSAgICB9CisJICB3aGlsZSAoKmNwICYmICpjcCAhPSAnPScpOworCisJICAvKiBNb3ZlIG92ZXIgdGhlIGVxdWFsIG9wZXJhdG9yLiAgKi8KKwkgIGNwKys7CisKKwkgIC8qIFBvcCB0aGUgUkhTIG9mZiB0aGUgc3RhY2suICAqLworCSAgYyA9IHBvcCAoKTsKKworCSAgLyogUGVyZm9ybSB0aGUgYXNzaWdubWVudC4gICovCisJICB2YXIgKHZhcm5hbWUpID0gYzsKKworCSAgLyogSGFuZGxlIHNpZGUgZWZmZWN0cy4gYW5kIHNwZWNpYWwgJ08nIHN0YWNrIGNhc2VzLiAgKi8KKwkgIHN3aXRjaCAodmFybmFtZSkKKwkgICAgeworCSAgICAvKiBDb25zdW1lIHNvbWUgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3BhY2UuICAqLworCSAgICBjYXNlICdMJzoKKwkgICAgICBvZmZzZXQgKz0gYzsKKwkgICAgICBicmVhazsKKwkgICAgLyogQSBzeW1ib2wgdG8gdXNlIGluIHRoZSByZWxvY2F0aW9uLiAgTWFrZSBhIG5vdGUKKwkgICAgICAgb2YgdGhpcyBpZiB3ZSBhcmUgbm90IGp1c3QgY291bnRpbmcuICAqLworCSAgICBjYXNlICdTJzoKKwkgICAgICBpZiAoISBqdXN0X2NvdW50KQorCQlycHRyLT5zeW1fcHRyX3B0ciA9ICZzeW1ib2xzW2NdOworCSAgICAgIGJyZWFrOworCSAgICAvKiBBcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgZm9yIGEgZnVuY3Rpb24gY2FsbC4gICovCisJICAgIGNhc2UgJ1InOgorCSAgICAgIGlmICghIGp1c3RfY291bnQpCisJCXsKKwkJICB1bnNpZ25lZCBpbnQgdG1wID0gdmFyICgnUicpOworCQkgIHJwdHItPmFkZGVuZCA9IDA7CisKKwkJICBpZiAoKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfUENSRUxfQ0FMTAorCQkgICAgICAgJiYgUl9QQ1JFTF9DQUxMICsgMTAgPiBvcCkKKwkJICAgICAgfHwgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfQUJTX0NBTEwKKwkJCSAgJiYgUl9BQlNfQ0FMTCArIDEwID4gb3ApKQorCQkgICAgeworCQkgICAgICAvKiBTaW1wbGUgZW5jb2RpbmcuICAqLworCQkgICAgICBpZiAodG1wID4gNCkKKwkJCXsKKwkJCSAgdG1wIC09IDU7CisJCQkgIHJwdHItPmFkZGVuZCB8PSAxOworCQkJfQorCQkgICAgICBpZiAodG1wID09IDQpCisJCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2IHwgMSA8PCA0IHwgMSA8PCAyOworCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMykKKwkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQ7CisJCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAyKQorCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNjsKKwkJICAgICAgZWxzZSBpZiAodG1wID09IDEpCisJCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4OworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgdW5zaWduZWQgaW50IHRtcDEsIHRtcDI7CisKKwkJICAgICAgLyogRmlyc3QgcGFydCBpcyBlYXN5IC0tIGxvdyBvcmRlciB0d28gYml0cyBhcmUKKwkJCSBkaXJlY3RseSBjb3BpZWQsIHRoZW4gc2hpZnRlZCBhd2F5LiAgKi8KKwkJICAgICAgcnB0ci0+YWRkZW5kID0gdG1wICYgMHgzOworCQkgICAgICB0bXAgPj49IDI7CisKKwkJICAgICAgLyogRGl2aW5nIHRoZSByZXN1bHQgYnkgMTAgZ2l2ZXMgdXMgdGhlIHNlY29uZAorCQkJIHBhcnQuICBJZiBpdCBpcyA5LCB0aGVuIHRoZSBmaXJzdCB0d28gd29yZHMKKwkJCSBhcmUgYSBkb3VibGUgcHJlY2lzaW9uIHBhcmFtYXRlciwgZWxzZSBpdCBpcworCQkJIDMgKiB0aGUgZmlyc3QgYXJnIGJpdHMgKyB0aGUgMm5kIGFyZyBiaXRzLiAgKi8KKwkJICAgICAgdG1wMSA9IHRtcCAvIDEwOworCQkgICAgICB0bXAgLT0gdG1wMSAqIDEwOworCQkgICAgICBpZiAodG1wMSA9PSA5KQorCQkJcnB0ci0+YWRkZW5kICs9ICgweGUgPDwgNik7CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgLyogR2V0IHRoZSB0d28gcGllY2VzLiAgKi8KKwkJCSAgdG1wMiA9IHRtcDEgLyAzOworCQkJICB0bXAxIC09IHRtcDIgKiAzOworCQkJICAvKiBQdXQgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KKwkJCSAgcnB0ci0+YWRkZW5kICs9ICh0bXAyIDw8IDgpICsgKHRtcDEgPDwgNik7CisJCQl9CisKKwkJICAgICAgLyogV2hhdCdzIGxlZnQgaXMgdGhlIHRoaXJkIHBhcnQuICBJdCdzIHVucGFja2VkCisJCQkganVzdCBsaWtlIHRoZSBzZWNvbmQuICAqLworCQkgICAgICBpZiAodG1wID09IDkpCisJCQlycHRyLT5hZGRlbmQgKz0gKDB4ZSA8PCAyKTsKKwkJICAgICAgZWxzZQorCQkJeworCQkJICB0bXAyID0gdG1wIC8gMzsKKwkJCSAgdG1wIC09IHRtcDIgKiAzOworCQkJICBycHRyLT5hZGRlbmQgKz0gKHRtcDIgPDwgNCkgKyAodG1wIDw8IDIpOworCQkJfQorCQkgICAgfQorCQkgIHJwdHItPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKHJwdHItPmFkZGVuZCwgMCk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgLyogSGFuZGxlIHRoZSBsaW5rZXIgZXhwcmVzc2lvbiBzdGFjay4gICovCisJICAgIGNhc2UgJ08nOgorCSAgICAgIHN3aXRjaCAob3ApCisJCXsKKwkJY2FzZSBSX0NPTVAxOgorCQkgIHN1Ym9wID0gY29tcDFfb3Bjb2RlczsKKwkJICBicmVhazsKKwkJY2FzZSBSX0NPTVAyOgorCQkgIHN1Ym9wID0gY29tcDJfb3Bjb2RlczsKKwkJICBicmVhazsKKwkJY2FzZSBSX0NPTVAzOgorCQkgIHN1Ym9wID0gY29tcDNfb3Bjb2RlczsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIHdoaWxlICgqc3Vib3AgPD0gKHVuc2lnbmVkIGNoYXIpIGMpCisJCSsrc3Vib3A7CisJICAgICAgLS1zdWJvcDsKKwkgICAgICBicmVhazsKKwkgICAgLyogVGhlIGxvd2VyIDMydW53aW5kIGJpdHMgbXVzdCBiZSBwZXJzaXN0ZW50LiAgKi8KKwkgICAgY2FzZSAnVSc6CisJICAgICAgc2F2ZWRfdW53aW5kX2JpdHMgPSB2YXIgKCdVJyk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogSWYgd2UgdXNlZCBhIHByZXZpb3VzIGZpeHVwLCBjbGVhbiB1cCBhZnRlciBpdC4gICovCisgICAgICBpZiAocHJldl9maXh1cCkKKwl7CisJICBmaXh1cCA9IHNhdmVfZml4dXAgKyAxOworCSAgcHJldl9maXh1cCA9IDA7CisJfQorICAgICAgLyogUXVldWUgaXQuICAqLworICAgICAgZWxzZSBpZiAoZml4dXAgPiBzYXZlX2ZpeHVwICsgMSkKKwlzb21fcmVsb2NfcXVldWVfaW5zZXJ0IChzYXZlX2ZpeHVwLCBmaXh1cCAtIHNhdmVfZml4dXAsIHJlbG9jX3F1ZXVlKTsKKworICAgICAgLyogV2UgZG8gbm90IHBhc3MgUl9EQVRBX09WRVJSSURFIG9yIFJfTk9fUkVMT0NBVElPTiAKKwkgZml4dXBzIHRvIEJGRC4gICovCisgICAgICBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9EQVRBX09WRVJSSURFCisJICAmJiBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX05PX1JFTE9DQVRJT04pCisJeworCSAgLyogRG9uZSB3aXRoIGEgc2luZ2xlIHJlbG9jdGlvbi4gTG9vcCBiYWNrIHRvIHRoZSB0b3AuICAqLworCSAgaWYgKCEganVzdF9jb3VudCkKKwkgICAgeworCSAgICAgIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0VOVFJZKQorCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdUJyk7CisJICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9FWElUKQorCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdVJyk7CisJICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9QQ1JFTF9DQUxMCisJCSAgICAgICB8fCBzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0FCU19DQUxMKQorCQk7CisJICAgICAgZWxzZSBpZiAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9EQVRBX09ORV9TWU1CT0wpCisJCXsKKwkJICB1bnNpZ25lZCBhZGRlbmQgPSB2YXIgKCdWJyk7CisKKwkJICAvKiBUcnkgd2hhdCB3YXMgc3BlY2lmaWVkIGluIFJfREFUQV9PVkVSUklERSBmaXJzdAorCQkgICAgIChpZiBhbnl0aGluZykuICBUaGVuIHRoZSBoYXJkIHdheSB1c2luZyB0aGUKKwkJICAgICBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKwkJICBycHRyLT5hZGRlbmQgPSB2YXIgKCdWJyk7CisKKwkJICBpZiAocnB0ci0+YWRkZW5kID09IDAgJiYgIXNlY3Rpb24tPmNvbnRlbnRzKQorCQkgICAgeworCQkgICAgICAvKiBHb3QgdG8gcmVhZCB0aGUgZGFtbiBjb250ZW50cyBmaXJzdC4gIFdlIGRvbid0CisJCSAgICAgICAgIGJvdGhlciBzYXZpbmcgdGhlIGNvbnRlbnRzICh5ZXQpLiAgQWRkIGl0IG9uZQorCQkJIGRheSBpZiB0aGUgbmVlZCBhcmlzZXMuICAqLworCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9IGJmZF9tYWxsb2MgKHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisJCSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCSAgICAgIGRlYWxsb2NhdGVfY29udGVudHMgPSAxOworCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHNlY3Rpb24tPm93bmVyLAorCQkJCQkJc2VjdGlvbiwKKwkJCQkJCXNlY3Rpb24tPmNvbnRlbnRzLAorCQkJCQkJMCwKKwkJCQkJCXNlY3Rpb24tPl9yYXdfc2l6ZSk7CisJCSAgICB9CisJCSAgZWxzZSBpZiAocnB0ci0+YWRkZW5kID09IDApCisJCSAgICBycHRyLT5hZGRlbmQgPSBiZmRfZ2V0XzMyIChzZWN0aW9uLT5vd25lciwKKwkJCQkJICAgICAgIChzZWN0aW9uLT5jb250ZW50cworCQkJCQkJKyBvZmZzZXQgLSB2YXIgKCdMJykpKTsKKwkJCQorCQl9CisJICAgICAgZWxzZQorCQlycHRyLT5hZGRlbmQgPSB2YXIgKCdWJyk7CisJICAgICAgcnB0cisrOworCSAgICB9CisJICBjb3VudCsrOworCSAgLyogTm93IHRoYXQgd2UndmUgaGFuZGxlZCBhICJmdWxsIiByZWxvY2F0aW9uLCByZXNldAorCSAgICAgc29tZSBzdGF0ZS4gICovCisJICBtZW1zZXQgKHZhcmlhYmxlcywgMCwgc2l6ZW9mICh2YXJpYWJsZXMpKTsKKwkgIG1lbXNldCAoc3RhY2ssIDAsIHNpemVvZiAoc3RhY2spKTsKKwl9CisgICAgfQorICBpZiAoZGVhbGxvY2F0ZV9jb250ZW50cykKKyAgICBmcmVlIChzZWN0aW9uLT5jb250ZW50cyk7CisKKyAgcmV0dXJuIGNvdW50OworCisjdW5kZWYgdmFyCisjdW5kZWYgcHVzaAorI3VuZGVmIHBvcAorI3VuZGVmIGVtcHR5c3RhY2sKK30KKworLyogUmVhZCBpbiB0aGUgcmVsb2NzIChha2EgZml4dXBzIGluIFNPTSB0ZXJtcykgZm9yIGEgc2VjdGlvbi4gCisKKyAgIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgY2FsbHMgdGhpcyByb3V0aW5lIHdpdGggSlVTVF9DT1VOVCAKKyAgIHNldCB0byB0cnVlIHRvIGluZGljYXRlIGl0IG9ubHkgbmVlZHMgYSBjb3VudCBvZiB0aGUgbnVtYmVyCisgICBvZiBhY3R1YWwgcmVsb2NhdGlvbnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc29tX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBqdXN0X2NvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYm9vbGVhbiBqdXN0X2NvdW50OworeworICBjaGFyICpleHRlcm5hbF9yZWxvY3M7CisgIHVuc2lnbmVkIGludCBmaXh1cF9zdHJlYW1fc2l6ZTsKKyAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOworICB1bnNpZ25lZCBpbnQgbnVtX3JlbG9jczsKKworICBmaXh1cF9zdHJlYW1fc2l6ZSA9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zaXplOworICAvKiBJZiB0aGVyZSB3ZXJlIG5vIHJlbG9jYXRpb25zLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICAqLworICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBJZiByZWxvY19jb3VudCBpcyAtMSwgdGhlbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0gaGFzIG5vdCBiZWVuIAorICAgICBwYXJzZWQuICBXZSBtdXN0IGRvIHNvIG5vdyB0byBrbm93IGhvdyBtYW55IHJlbG9jYXRpb25zIGV4aXN0LiAgKi8KKyAgaWYgKHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IC0xKQorICAgIHsKKyAgICAgIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9tYWxsb2MgKGZpeHVwX3N0cmVhbV9zaXplKTsKKyAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gKGNoYXIgKikgTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICAvKiBSZWFkIGluIHRoZSBleHRlcm5hbCBmb3Jtcy4gKi8KKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKKwkJICAgIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgKyBzZWN0aW9uLT5yZWxfZmlsZXBvcywKKwkJICAgIFNFRUtfU0VUKQorCSAgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZml4dXBfc3RyZWFtX3NpemUsIGFiZmQpCisJICAhPSBmaXh1cF9zdHJlYW1fc2l6ZSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIExldCBjYWxsZXJzIGtub3cgaG93IG1hbnkgcmVsb2NhdGlvbnMgZm91bmQuCisJIGFsc28gc2F2ZSB0aGUgcmVsb2NhdGlvbiBzdHJlYW0gYXMgd2Ugd2lsbAorCSBuZWVkIGl0IGFnYWluLiAgKi8KKyAgICAgIHNlY3Rpb24tPnJlbG9jX2NvdW50ID0gc29tX3NldF9yZWxvY19pbmZvIChleHRlcm5hbF9yZWxvY3MsCisJCQkJCQkgZml4dXBfc3RyZWFtX3NpemUsCisJCQkJCQkgTlVMTCwgTlVMTCwgTlVMTCwgdHJ1ZSk7CisKKyAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW0gPSBleHRlcm5hbF9yZWxvY3M7CisgICAgfQorCisgIC8qIElmIHRoZSBjYWxsZXIgb25seSB3YW50ZWQgYSBjb3VudCwgdGhlbiByZXR1cm4gbm93LiAgKi8KKyAgaWYgKGp1c3RfY291bnQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbnVtX3JlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OworICBleHRlcm5hbF9yZWxvY3MgPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtOworICAvKiBSZXR1cm4gc2F2ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbG9jYXRpb25zIGlmIGl0IGlzIGF2YWlsYWJsZS4gICovCisgIGlmIChzZWN0aW9uLT5yZWxvY2F0aW9uICE9IChhcmVsZW50ICopIE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgCisgICAgYmZkX3phbGxvYyAoYWJmZCwgKG51bV9yZWxvY3MgKiBzaXplb2YgKGFyZWxlbnQpKSk7CisgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gKGFyZWxlbnQgKikgTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogUHJvY2VzcyBhbmQgaW50ZXJuYWxpemUgdGhlIHJlbG9jYXRpb25zLiAgKi8KKyAgc29tX3NldF9yZWxvY19pbmZvIChleHRlcm5hbF9yZWxvY3MsIGZpeHVwX3N0cmVhbV9zaXplLAorCQkgICAgICBpbnRlcm5hbF9yZWxvY3MsIHNlY3Rpb24sIHN5bWJvbHMsIGZhbHNlKTsKKworICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zLiAgRnJlZSB0aGVtLiAgKi8KKyAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKKyAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbSA9IE5VTEw7CisKKyAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICAqLworICBzZWN0aW9uLT5yZWxvY2F0aW9uID0gaW50ZXJuYWxfcmVsb2NzOworICByZXR1cm4gKHRydWUpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgcmVsb2NhdGlvbgorICAgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWN0aW9uLiAgKi8gCisKK3N0YXRpYyBsb25nCitzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworeworICAvKiBJZiBzZWN0aW9uIGhhcyByZWxvY2F0aW9ucywgdGhlbiByZWFkIGluIHRoZSByZWxvY2F0aW9uIHN0cmVhbQorICAgICBhbmQgcGFyc2UgaXQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbG9jYXRpb25zIGV4aXN0LiAgKi8KKyAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykKKyAgICB7CisgICAgICBpZiAoISBzb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBOVUxMLCB0cnVlKSkKKwlyZXR1cm4gLTE7CisgICAgICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOworICAgIH0KKyAgLyogVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIENvbnZlcnQgcmVsb2NhdGlvbnMgZnJvbSBTT00gKGV4dGVybmFsKSBmb3JtIGludG8gQkZEIGludGVybmFsCisgICBmb3JtLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMuICAqLworCitzdGF0aWMgbG9uZworc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgYXJlbGVudCAqKnJlbHB0cjsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisgIGFyZWxlbnQgKnRibHB0cjsKKyAgaW50IGNvdW50OworCisgIGlmIChzb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIGZhbHNlKSA9PSBmYWxzZSkKKyAgICByZXR1cm4gLTE7CisKKyAgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKworICB3aGlsZSAoY291bnQtLSkKKyAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKKworICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKKyAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OworfQorCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOworCisvKiBBIGhvb2sgdG8gc2V0IHVwIG9iamVjdCBmaWxlIGRlcGVuZGVudCBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpuZXdzZWN0OworeworICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9CisgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKKyAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKKyAgICByZXR1cm4gZmFsc2U7CisgIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IDM7CisKKyAgLyogV2UgYWxsb3cgbW9yZSB0aGFuIHRocmVlIHNlY3Rpb25zIGludGVybmFsbHkgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IHN5bWJvbAorICAgdG8gdGhlIG91dHB1dCBzeW1ib2wuICAqLworCitzdGF0aWMgYm9vbGVhbgorc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW1ib2wsIG9iZmQsIG9zeW1ib2wpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYXN5bWJvbCAqaXN5bWJvbDsKKyAgICAgYmZkICpvYmZkOworICAgICBhc3ltYm9sICpvc3ltYm9sOworeworICBzdHJ1Y3Qgc29tX3N5bWJvbCAqaW5wdXRfc3ltYm9sID0gKHN0cnVjdCBzb21fc3ltYm9sICopIGlzeW1ib2w7CisgIHN0cnVjdCBzb21fc3ltYm9sICpvdXRwdXRfc3ltYm9sID0gKHN0cnVjdCBzb21fc3ltYm9sICopIG9zeW1ib2w7CisKKyAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KKyAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgorICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgb25seSBwcml2YXRlIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gY29weSBpcyB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgorICAgICBiaXRzLiAgKi8KKyAgb3V0cHV0X3N5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyA9CisgICAgaW5wdXRfc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uCisgICB0byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworc3RhdGljIGJvb2xlYW4KK3NvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKQorICAgICBiZmQgKmliZmQ7CisgICAgIGFzZWN0aW9uICppc2VjdGlvbjsKKyAgICAgYmZkICpvYmZkOworICAgICBhc2VjdGlvbiAqb3NlY3Rpb247Cit7CisgIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCisgIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKKyAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgorICAgICAgfHwgKCFzb21faXNfc3BhY2UgKGlzZWN0aW9uKSAmJiAhc29tX2lzX3N1YnNwYWNlIChpc2VjdGlvbikpKQorICAgIHJldHVybiB0cnVlOworCisgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhCisgICAgPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCisgICAgICBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOworICBpZiAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbWVtY3B5IChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YSwKKwkgIHNvbV9zZWN0aW9uX2RhdGEgKGlzZWN0aW9uKS0+Y29weV9kYXRhLAorCSAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKKworICAvKiBSZXBhcmVudCBpZiBuZWNlc3NhcnkuICAqLworICBpZiAoc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lcikKKyAgICBzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0KKyAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKKyAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQsICpvYmZkOworeworICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLworICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCisgICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgdG8gaG9sZCB0aGUgZGF0YSB3ZSBuZWVkLiAgKi8KKyAgb2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpID0gKHN0cnVjdCBzb21fZXhlY19kYXRhICopCisgICAgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSkpOworICBpZiAob2JqX3NvbV9leGVjX2RhdGEgKG9iZmQpID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIE5vdyBjb3B5IHRoZSBkYXRhLiAgKi8KKyAgbWVtY3B5IChvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCksIG9ial9zb21fZXhlY19kYXRhIChpYmZkKSwKKwkgIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IGJhY2tlbmQgaW5mbyBmb3Igc2VjdGlvbnMgd2hpY2ggY2FuIG5vdCBiZSBkZXNjcmliZWQKKyAgIGluIHRoZSBCRkQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKworYm9vbGVhbgorYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0X2tleSwgc3BudW0pCisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBpbnQgZGVmaW5lZDsKKyAgICAgaW50IHByaXZhdGU7CisgICAgIHVuc2lnbmVkIGludCBzb3J0X2tleTsKKyAgICAgaW50IHNwbnVtOworeworICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCB0aGUgbWFnaWMgaW5mb3JtYXRpb24uICAqLworICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEKKwk9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKKwkgIGJmZF96YWxsb2MgKHNlY3Rpb24tPm93bmVyLAorCQkgICAgICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOworICAgICAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleSA9IHNvcnRfa2V5OworICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19kZWZpbmVkID0gZGVmaW5lZDsKKyAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+aXNfcHJpdmF0ZSA9IHByaXZhdGU7CisgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9IHNlY3Rpb247CisgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlciA9IHNwbnVtOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IGJhY2tlbmQgaW5mbyBmb3Igc3Vic2VjdGlvbnMgd2hpY2ggY2FuIG5vdCBiZSBkZXNjcmliZWQgCisgICBpbiB0aGUgQkZEIGRhdGEgc3RydWN0dXJlcy4gICovCisKK2Jvb2xlYW4KK2JmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VjdGlvbiwgY29udGFpbmVyLCBhY2Nlc3MsCisJCQkJICAgc29ydF9rZXksIHF1YWRyYW50KQorICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYXNlY3Rpb24gKmNvbnRhaW5lcjsKKyAgICAgaW50IGFjY2VzczsKKyAgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5OworICAgICBpbnQgcXVhZHJhbnQ7Cit7CisgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBtYWdpYyBpbmZvcm1hdGlvbi4gICovCisgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCisgICAgeworICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YQorCT0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQorCSAgYmZkX3phbGxvYyAoc2VjdGlvbi0+b3duZXIsCisJCSAgICAgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7CisgICAgICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5ID0gc29ydF9rZXk7CisgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmFjY2Vzc19jb250cm9sX2JpdHMgPSBhY2Nlc3M7CisgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnF1YWRyYW50ID0gcXVhZHJhbnQ7CisgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNldCB0aGUgZnVsbCBTT00gc3ltYm9sIHR5cGUuICBTT00gbmVlZHMgZmFyIG1vcmUgc3ltYm9sIGluZm9ybWF0aW9uCisgICB0aGFuIGFueSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXQgSSdtIGF3YXJlIG9mLiAgSXQgaXMgbWFuZGF0b3J5CisgICB0byBiZSBhYmxlIHRvIGtub3cgaWYgYSBzeW1ib2wgaXMgYW4gZW50cnkgcG9pbnQsIG1pbGxpY29kZSwgZGF0YSwKKyAgIGNvZGUsIGFic29sdXRlLCBzdG9yYWdlIHJlcXVlc3QsIG9yIHByb2NlZHVyZSBsYWJlbC4gIElmIHlvdSBnZXQKKyAgIHRoZSBzeW1ib2wgdHlwZSB3cm9uZyB5b3VyIHByb2dyYW0gd2lsbCBub3QgbGluay4gICovCisKK3ZvaWQKK2JmZF9zb21fc2V0X3N5bWJvbF90eXBlIChzeW1ib2wsIHR5cGUpCisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgdW5zaWduZWQgaW50IHR5cGU7Cit7CisgIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPSB0eXBlOworfQorCisvKiBBdHRhY2ggYW4gYXV4aWxpYXJ5IGhlYWRlciB0byB0aGUgQkZEIGJhY2tlbmQgc28gdGhhdCBpdCBtYXkgYmUKKyAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLworYm9vbGVhbgorYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoYWJmZCwgdHlwZSwgc3RyaW5nKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCB0eXBlOworICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGlmICh0eXBlID09IFZFUlNJT05fQVVYX0lEKQorICAgIHsKKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7CisgICAgICBpbnQgcGFkID0gMDsKKworICAgICAgaWYgKGxlbiAlIDQpCisJcGFkID0gKDQgLSAobGVuICUgNCkpOworICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgPSAoc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKikKKwliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhdXhfaWQpCisJCQkgICAgICArIHNpemVvZiAodW5zaWduZWQgaW50KSArIGxlbiArIHBhZCk7CisgICAgICBpZiAoIW9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQudHlwZSA9IFZFUlNJT05fQVVYX0lEOworICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggPSBsZW4gKyBwYWQ7CisgICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCArPSBzaXplb2YgKGludCk7CisgICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+c3RyaW5nX2xlbmd0aCA9IGxlbjsKKyAgICAgIHN0cm5jcHkgKG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT51c2VyX3N0cmluZywgc3RyaW5nLCBsZW4pOworICAgIH0KKyAgZWxzZSBpZiAodHlwZSA9PSBDT1BZUklHSFRfQVVYX0lEKQorICAgIHsKKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKHN0cmluZyk7CisgICAgICBpbnQgcGFkID0gMDsKKworICAgICAgaWYgKGxlbiAlIDQpCisJcGFkID0gKDQgLSAobGVuICUgNCkpOworICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKSA9IChzdHJ1Y3QgY29weXJpZ2h0X2F1eF9oZHIgKikKKwliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhdXhfaWQpCisJCQkgICAgKyBzaXplb2YgKHVuc2lnbmVkIGludCkgKyBsZW4gKyBwYWQpOworICAgICAgaWYgKCFvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC50eXBlID0gQ09QWVJJR0hUX0FVWF9JRDsKKyAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggPSBsZW4gKyBwYWQ7CisgICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoICs9IHNpemVvZiAoaW50KTsKKyAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPnN0cmluZ19sZW5ndGggPSBsZW47CisgICAgICBzdHJjcHkgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmNvcHlyaWdodCwgc3RyaW5nKTsKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiBBdHRhY2ggYW4gY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgdG8gdGhlIEJGRCBiYWNrZW5kIHNvIHRoYXQgaXQgbWF5IGJlCisgICB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KKworYm9vbGVhbgorYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCAoYWJmZCwgbmFtZSwgbGFuZ3VhZ2VfbmFtZSwgcHJvZHVjdF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25faWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2VfbmFtZTsKKyAgICAgY29uc3QgY2hhciAqcHJvZHVjdF9pZDsKKyAgICAgY29uc3QgY2hhciAqdmVyc2lvbl9pZDsKK3sKKyAgQ09NUFVOSVQgKm4gPSAoQ09NUFVOSVQgKikgYmZkX3phbGxvYyAoYWJmZCwgQ09NUFVOSVRTWik7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisjZGVmaW5lIFNUUkRVUChmKSBcCisgIGlmIChmICE9IE5VTEwpIFwKKyAgICB7IFwKKyAgICAgIG4tPmYubl9uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKGYpICsgMSk7IFwKKyAgICAgIGlmIChuLT5mLm5fbmFtZSA9PSBOVUxMKSBcCisJcmV0dXJuIGZhbHNlOyBcCisgICAgICBzdHJjcHkgKG4tPmYubl9uYW1lLCBmKTsgXAorICAgIH0KKworICBTVFJEVVAgKG5hbWUpOworICBTVFJEVVAgKGxhbmd1YWdlX25hbWUpOworICBTVFJEVVAgKHByb2R1Y3RfaWQpOworICBTVFJEVVAgKHZlcnNpb25faWQpOworCisjdW5kZWYgU1RSRFVQCisKKyAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSA9IG47CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitzb21fZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisgIGlmIChjb3VudCA9PSAwIHx8ICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKChiZmRfc2l6ZV90eXBlKShvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCisgICAgICB8fCBiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpID09IC0xCisgICAgICB8fCBiZmRfcmVhZCAobG9jYXRpb24sIChiZmRfc2l6ZV90eXBlKTEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKKyAgICByZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KKyAgcmV0dXJuICh0cnVlKTsKK30KKworc3RhdGljIGJvb2xlYW4KK3NvbV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpCisgICAgeworICAgICAgLyogU2V0IHVwIGZpeGVkIHBhcnRzIG9mIHRoZSBmaWxlLCBzcGFjZSwgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCisJIE5vdGlmeSB0aGUgd29ybGQgdGhhdCBvdXRwdXQgaGFzIGJlZ3VuLiAgKi8KKyAgICAgIHNvbV9wcmVwX2hlYWRlcnMgKGFiZmQpOworICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisgICAgICAvKiBTdGFydCB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaW5jbHVkZSBhbGwgdGhlIHN0cmluZworCSB0YWJsZXMsIGZpeHVwIHN0cmVhbXMsIGFuZCBvdGhlciBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLworICAgICAgc29tX2JlZ2luX3dyaXRpbmcgKGFiZmQpOworICAgIH0KKworICAvKiBPbmx5IHdyaXRlIHN1YnNwYWNlcyB3aGljaCBoYXZlICJyZWFsIiBjb250ZW50cyAoZWcuIHRoZSBjb250ZW50cworICAgICBhcmUgbm90IGdlbmVyYXRlZCBhdCBydW4gdGltZSBieSB0aGUgT1MpLiAgKi8KKyAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pCisgICAgICB8fCAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogU2VlayB0byB0aGUgcHJvcGVyIG9mZnNldCB3aXRoaW4gdGhlIG9iamVjdCBmaWxlIGFuZCB3cml0ZSB0aGUKKyAgICAgZGF0YS4gICovCisgIG9mZnNldCArPSBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZTsgCisgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK3NvbV9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIC8qIEFsbG93IGFueSBhcmNoaXRlY3R1cmUgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZSBTT00gYmFja2VuZCAqLworICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Cit9CisKK3N0YXRpYyBib29sZWFuCitzb21fZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAorCQkJZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBiZmRfdm1hIG9mZnNldDsKKyAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKKyAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7CisgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Cit7CisgIHJldHVybiAoZmFsc2UpOworfQorCitzdGF0aWMgaW50Citzb21fc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gcmVsb2M7Cit7CisgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygic29tX3NpemVvZl9oZWFkZXJzIHVuaW1wbGVtZW50ZWQiKSk7CisgIGZmbHVzaCAoc3RkZXJyKTsKKyAgYWJvcnQgKCk7CisgIHJldHVybiAoMCk7Cit9CisKKy8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCisgICBTT00gc2VjdGlvbiBTLCBvciAnPycgZm9yIGFuIHVua25vd24gU09NIHNlY3Rpb24uICAqLworCitzdGF0aWMgY2hhcgorc29tX3NlY3Rpb25fdHlwZSAocykKKyAgICAgY29uc3QgY2hhciAqczsKK3sKKyAgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSAqdDsKKworICBmb3IgKHQgPSAmc3R0WzBdOyB0LT5zZWN0aW9uOyB0KyspCisgICAgaWYgKCFzdHJjbXAgKHMsIHQtPnNlY3Rpb24pKQorICAgICAgcmV0dXJuIHQtPnR5cGU7CisgIHJldHVybiAnPyc7Cit9CisKK3N0YXRpYyBpbnQKK3NvbV9kZWNvZGVfc3ltY2xhc3MgKHN5bWJvbCkKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworeworICBjaGFyIGM7CisKKyAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZXR1cm4gJ0MnOworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJldHVybiAnVSc7CisgIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmV0dXJuICdJJzsKKyAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9MT0NBTCkpKQorICAgIHJldHVybiAnPyc7CisKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQorICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKSAhPSBOVUxMCisJICAmJiBzb21fc3ltYm9sX2RhdGEgKHN5bWJvbCktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0FCU09MVVRFKSkKKyAgICBjID0gJ2EnOworICBlbHNlIGlmIChzeW1ib2wtPnNlY3Rpb24pCisgICAgYyA9IHNvbV9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7CisgIGVsc2UKKyAgICByZXR1cm4gJz8nOworICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCisgICAgYyA9IHRvdXBwZXIgKGMpOworICByZXR1cm4gYzsKK30KKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IFNPTSBzeW1ib2wgU1lNQk9MIGluIFJFVC4gICovCisKK3N0YXRpYyB2b2lkCitzb21fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgcmV0LT50eXBlID0gc29tX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKKyAgaWYgKHJldC0+dHlwZSAhPSAnVScpCisgICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUrc3ltYm9sLT5zZWN0aW9uLT52bWE7CisgIGVsc2UKKyAgICByZXQtPnZhbHVlID0gMDsKKyAgcmV0LT5uYW1lID0gc3ltYm9sLT5uYW1lOworfQorCisvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlLiAgTmVjZXNzYXJ5CisgICBzbyB0aGF0IHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIHRoZSBjYXJzeW1zIGF0IG9uY2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorc29tX2JmZF9jb3VudF9hcl9zeW1ib2xzIChhYmZkLCBsc3RfaGVhZGVyLCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgbHN0X2hlYWRlciAqbHN0X2hlYWRlcjsKKyAgICAgc3ltaW5kZXggKmNvdW50OworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKKyAgZmlsZV9wdHIgbHN0X2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKKworICBoYXNoX3RhYmxlID0gCisgICAgKHVuc2lnbmVkIGludCAqKSBiZmRfbWFsbG9jIChsc3RfaGVhZGVyLT5oYXNoX3NpemUKKwkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOworICBpZiAoaGFzaF90YWJsZSA9PSBOVUxMICYmIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIERvbid0IGZvcmdldCB0byBpbml0aWFsaXplIHRoZSBjb3VudGVyISAgKi8KKyAgKmNvdW50ID0gMDsKKworICAvKiBSZWFkIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGhhcyB0YWJsZSBpcyBhbiBhcnJheSBvZiAzMmJpdCBmaWxlIG9mZnNldHMKKyAgICAgd2hpY2ggcG9pbnQgdG8gdGhlIGhhc2ggY2hhaW5zLiAgKi8KKyAgaWYgKGJmZF9yZWFkICgoUFRSKSBoYXNoX3RhYmxlLCBsc3RfaGVhZGVyLT5oYXNoX3NpemUsIDQsIGFiZmQpCisgICAgICAhPSBsc3RfaGVhZGVyLT5oYXNoX3NpemUgKiA0KQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFdhbGsgZWFjaCBjaGFpbiBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm91bmQgb24gdGhhdCBwYXJ0aWN1bGFyCisgICAgIGNoYWluLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxzdF9oZWFkZXItPmhhc2hfc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCBsc3Rfc3ltYm9sOworCisgICAgICAvKiBBbiBlbXB0eSBjaGFpbiBoYXMgemVybyBhcyBpdCdzIGZpbGUgb2Zmc2V0LiAgKi8KKyAgICAgIGlmIChoYXNoX3RhYmxlW2ldID09IDApCisJY29udGludWU7CisKKyAgICAgIC8qIFNlZWsgdG8gdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzIGhhc2ggY2hhaW4uICAqLworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGhhc2hfdGFibGVbaV0sIFNFRUtfU0VUKSA8IDApCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIFJlYWQgaW4gdGhpcyBzeW1ib2wgYW5kIHVwZGF0ZSB0aGUgY291bnRlci4gICovCisgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKKwkgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgICgqY291bnQpKys7CisKKyAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIHN5bWJvbHMgb24gdGhpcyBjaGFpbi4gICovCisgICAgICB3aGlsZSAobHN0X3N5bWJvbC5uZXh0X2VudHJ5KQorCXsKKworCSAgLyogU2VlayB0byB0aGUgbmV4dCBzeW1ib2wuICAqLworCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9zeW1ib2wubmV4dF9lbnRyeSwgU0VFS19TRVQpCisJICAgICAgPCAwKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgLyogUmVhZCB0aGUgc3ltYm9sIGluIGFuZCB1cGRhdGUgdGhlIGNvdW50ZXIuICAqLworCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCisJICAgICAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgICgqY291bnQpKys7CisJfQorICAgIH0KKyAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKKyAgICBmcmVlIChoYXNoX3RhYmxlKTsKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCisgICAgZnJlZSAoaGFzaF90YWJsZSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogRmlsbCBpbiB0aGUgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scyAoU1lNUykgZnJvbSB0aGUgYXJjaGl2ZSBkZXNjcmliZWQKKyAgIGJ5IEFCRkQgYW5kIExTVF9IRUFERVIuICAqLworCitzdGF0aWMgYm9vbGVhbgorc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMgKGFiZmQsIGxzdF9oZWFkZXIsIHN5bXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGxzdF9oZWFkZXIgKmxzdF9oZWFkZXI7CisgICAgIGNhcnN5bSAqKnN5bXM7Cit7CisgIHVuc2lnbmVkIGludCBpLCBsZW47CisgIGNhcnN5bSAqc2V0ID0gc3ltc1swXTsKKyAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKKyAgc3RydWN0IHNvbV9lbnRyeSAqc29tX2RpY3QgPSBOVUxMOworICBmaWxlX3B0ciBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOworCisgIGhhc2hfdGFibGUgPSAKKyAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPmhhc2hfc2l6ZQorCQkJCSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7CisgIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0X2hlYWRlci0+aGFzaF9zaXplICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgc29tX2RpY3QgPQorICAgIChzdHJ1Y3Qgc29tX2VudHJ5ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudAorCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKKyAgaWYgKHNvbV9kaWN0ID09IE5VTEwgJiYgbHN0X2hlYWRlci0+bW9kdWxlX2NvdW50ICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogUmVhZCBpbiB0aGUgaGFzaCB0YWJsZS4gIFRoZSBoYXMgdGFibGUgaXMgYW4gYXJyYXkgb2YgMzJiaXQgZmlsZSBvZmZzZXRzCisgICAgIHdoaWNoIHBvaW50IHRvIHRoZSBoYXNoIGNoYWlucy4gICovCisgIGlmIChiZmRfcmVhZCAoKFBUUikgaGFzaF90YWJsZSwgbHN0X2hlYWRlci0+aGFzaF9zaXplLCA0LCBhYmZkKQorICAgICAgIT0gbHN0X2hlYWRlci0+aGFzaF9zaXplICogNCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBTZWVrIHRvIGFuZCByZWFkIGluIHRoZSBTT00gZGljdGlvbmFyeS4gIFdlIHdpbGwgbmVlZCB0aGlzIHRvIGZpbGwKKyAgICAgaW4gdGhlIGNhcnN5bSdzIGZpbGVwb3MgZmllbGQuICAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X2hlYWRlci0+ZGlyX2xvYywgU0VFS19TRVQpIDwgMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoYmZkX3JlYWQgKChQVFIpIHNvbV9kaWN0LCBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQsIAorCQlzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpLCBhYmZkKQorICAgICAgIT0gbHN0X2hlYWRlci0+bW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBXYWxrIGVhY2ggY2hhaW4gZmlsbGluZyBpbiB0aGUgY2Fyc3ltcyBhcyB3ZSBnbyBhbG9uZy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBsc3RfaGVhZGVyLT5oYXNoX3NpemU7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgbHN0X3N5bWJvbDsKKworICAgICAgLyogQW4gZW1wdHkgY2hhaW4gaGFzIHplcm8gYXMgaXQncyBmaWxlIG9mZnNldC4gICovCisgICAgICBpZiAoaGFzaF90YWJsZVtpXSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBTZWVrIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBzeW1ib2wgb24gdGhlIGNoYWluLiAgKi8KKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBoYXNoX3RhYmxlW2ldLCBTRUVLX1NFVCkgPCAwKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKKwkgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLCBmaXJzdCBnZXQgdGhlIGxlbmd0aCB3aGljaCBpcyBzdG9yZWQKKwkgYXMgYSAzMmJpdCBpbnRlZ2VyIGp1c3QgYmVmb3JlIHRoZSBzeW1ib2wuCisKKwkgT25lIG1pZ2h0IGFzayB3aHkgd2UgZG9uJ3QganVzdCByZWFkIGluIHRoZSBlbnRpcmUgc3RyaW5nIHRhYmxlCisJIGFuZCBpbmRleCBpbnRvIGl0LiAgV2VsbCwgYWNjb3JkaW5nIHRvIHRoZSBTT00gQUJJIHRoZSBzdHJpbmcKKwkgaW5kZXggY2FuIHBvaW50ICphbnl3aGVyZSogaW4gdGhlIGFyY2hpdmUgdG8gc2F2ZSBzcGFjZSwgc28ganVzdAorCSB1c2luZyB0aGUgc3RyaW5nIHRhYmxlIHdvdWxkIG5vdCBiZSBzYWZlLiAgKi8KKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5zdHJpbmdfbG9jCisJCQkgICAgKyBsc3Rfc3ltYm9sLm5hbWUubl9zdHJ4IC0gNCwgU0VFS19TRVQpIDwgMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgaWYgKGJmZF9yZWFkICgmbGVuLCAxLCA0LCBhYmZkKSAhPSA0KQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5hbWUgYW5kIG51bGwgdGVybWluYXRlIGl0IHRvby4gICovCisgICAgICBzZXQtPm5hbWUgPSBiZmRfemFsbG9jIChhYmZkLCBsZW4gKyAxKTsKKyAgICAgIGlmICghc2V0LT5uYW1lKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgaWYgKGJmZF9yZWFkIChzZXQtPm5hbWUsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBzZXQtPm5hbWVbbGVuXSA9IDA7CisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIGZpbGUgb2Zmc2V0LiAgTm90ZSB0aGF0IHRoZSAibG9jYXRpb24iIGZpZWxkIHBvaW50cworCSB0byB0aGUgU09NIGl0c2VsZiwgbm90IHRoZSBhcl9oZHIgaW4gZnJvbnQgb2YgaXQuICAqLworICAgICAgc2V0LT5maWxlX29mZnNldCA9IHNvbV9kaWN0W2xzdF9zeW1ib2wuc29tX2luZGV4XS5sb2NhdGlvbgorCQkJICAtIHNpemVvZiAoc3RydWN0IGFyX2hkcik7CisKKyAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCisgICAgICBzZXQrKzsKKworICAgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBjaGFpbi4gICovCisgICAgICB3aGlsZSAobHN0X3N5bWJvbC5uZXh0X2VudHJ5KQorCXsKKwkgIC8qIFNlZWsgdG8gdGhlIG5leHQgc3ltYm9sIGFuZCByZWFkIGl0IGluLiAgKi8KKwkgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3Rfc3ltYm9sLm5leHRfZW50cnksIFNFRUtfU0VUKSA8MCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQorCSAgICAgICE9IHNpemVvZiAobHN0X3N5bWJvbCkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICAvKiBTZWVrIHRvIHRoZSBuYW1lIGxlbmd0aCAmIHN0cmluZyBhbmQgcmVhZCB0aGVtIGluLiAgKi8KKwkgIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5zdHJpbmdfbG9jIAorCQkJCSsgbHN0X3N5bWJvbC5uYW1lLm5fc3RyeCAtIDQsIFNFRUtfU0VUKSA8IDApCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDQsIGFiZmQpICE9IDQpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5hbWUgYW5kIG51bGwgdGVybWluYXRlIGl0IHRvby4gICovCisJICBzZXQtPm5hbWUgPSBiZmRfemFsbG9jIChhYmZkLCBsZW4gKyAxKTsKKwkgIGlmICghc2V0LT5uYW1lKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgaWYgKGJmZF9yZWFkIChzZXQtPm5hbWUsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIHNldC0+bmFtZVtsZW5dID0gMDsKKworCSAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXQuICBOb3RlIHRoYXQgdGhlICJsb2NhdGlvbiIgZmllbGQgcG9pbnRzCisJICAgICB0byB0aGUgU09NIGl0c2VsZiwgbm90IHRoZSBhcl9oZHIgaW4gZnJvbnQgb2YgaXQuICAqLworCSAgc2V0LT5maWxlX29mZnNldCA9IHNvbV9kaWN0W2xzdF9zeW1ib2wuc29tX2luZGV4XS5sb2NhdGlvbgorCQkJICAgICAgIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKKworCSAgLyogR28gb24gdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KKwkgIHNldCsrOworCX0KKyAgICB9CisgIC8qIElmIHdlIGhhdmVuJ3QgZGllZCBieSBub3csIHRoZW4gd2Ugc3VjY2Vzc2Z1bGx5IHJlYWQgdGhlIGVudGlyZSAKKyAgICAgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICAqLworICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQorICAgIGZyZWUgKGhhc2hfdGFibGUpOworICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKKyAgICBmcmVlIChzb21fZGljdCk7CisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQorICAgIGZyZWUgKGhhc2hfdGFibGUpOworICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKKyAgICBmcmVlIChzb21fZGljdCk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogUmVhZCBpbiB0aGUgTFNUIGZyb20gdGhlIGFyY2hpdmUuICAqLworc3RhdGljIGJvb2xlYW4KK3NvbV9zbHVycF9hcm1hcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgbHN0X2hlYWRlciBsc3RfaGVhZGVyOworICBzdHJ1Y3QgYXJfaGRyIGFyX2hlYWRlcjsKKyAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOworICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7CisgIGNoYXIgbmV4dG5hbWVbMTddOworICBpbnQgaSA9IGJmZF9yZWFkICgoUFRSKSBuZXh0bmFtZSwgMSwgMTYsIGFiZmQpOworCisgIC8qIFNwZWNpYWwgY2FzZXMuICAqLworICBpZiAoaSA9PSAwKQorICAgIHJldHVybiB0cnVlOworICBpZiAoaSAhPSAxNikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEZvciBhcmNoaXZlcyB3aXRob3V0IC5vIGZpbGVzIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZS4gICovCisgIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCisgICAgeworICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogUmVhZCBpbiBhbmQgc2FuaXR5IGNoZWNrIHRoZSBhcmNoaXZlIGhlYWRlci4gICovCisgIGlmIChiZmRfcmVhZCAoKFBUUikgJmFyX2hlYWRlciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKKyAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChzdHJuY21wIChhcl9oZWFkZXIuYXJfZm1hZywgQVJGTUFHLCAyKSkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBIb3cgYmlnIGlzIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBlbnRyeT8gICovCisgIGVycm5vID0gMDsKKyAgcGFyc2VkX3NpemUgPSBzdHJ0b2wgKGFyX2hlYWRlci5hcl9zaXplLCBOVUxMLCAxMCk7CisgIGlmIChlcnJubyAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFNhdmUgb2ZmIHRoZSBmaWxlIG9mZnNldCBvZiB0aGUgZmlyc3QgcmVhbCB1c2VyIGRhdGEuICAqLworICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSArIHBhcnNlZF9zaXplOworCisgIC8qIFJlYWQgaW4gdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgV2UnbGwgbWFrZSBoZWF2eSB1c2Ugb2YgdGhpcworICAgICBpbiBqdXN0IGEgbWludXRlLiAgKi8KKyAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFNhbml0eSBjaGVjay4gICovCisgIGlmIChsc3RfaGVhZGVyLmFfbWFnaWMgIT0gTElCTUFHSUMpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogQ291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIHRoZSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCisgIGlmIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgKGFiZmQsICZsc3RfaGVhZGVyLCAmYXJkYXRhLT5zeW1kZWZfY291bnQpCisgICAgICA9PSBmYWxzZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogR2V0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCisgIGlmIChiZmRfc2VlayAoYWJmZCwgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgLSBwYXJzZWRfc2l6ZSAKKwkJCSsgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIFNFRUtfU0VUKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEluaXRpYWxpemFlIHRoZSBjYWNoZSBhbmQgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBsaWJyYXJ5IHN5bWJvbHMuICAqLworICBhcmRhdGEtPmNhY2hlID0gMDsKKyAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCisJCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50CisJCQkJCSAgICogc2l6ZW9mIChjYXJzeW0pKSk7CisgIGlmICghYXJkYXRhLT5zeW1kZWZzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOb3cgZmlsbCBpbiB0aGUgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scy4gICovCisgIGlmIChzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyAoYWJmZCwgJmxzdF9oZWFkZXIsICZhcmRhdGEtPnN5bWRlZnMpCisgICAgICA9PSBmYWxzZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogU2VlayBiYWNrIHRvIHRoZSAiZmlyc3QiIGZpbGUgaW4gdGhlIGFyY2hpdmUuICBOb3RlIHRoZSAiZmlyc3QiCisgICAgIGZpbGUgbWF5IGJlIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlLiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcywgU0VFS19TRVQpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm90aWZ5IHRoZSBnZW5lcmljIGFyY2hpdmUgY29kZSB0aGF0IHdlIGhhdmUgYSBzeW1ib2wgbWFwLiAgKi8KKyAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEJlZ2luIHByZXBhcmluZyB0byB3cml0ZSBhIFNPTSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4KKworICAgQXMgcGFydCBvZiB0aGUgcHJlcCB3b3JrIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scworICAgYW5kIHRoZSBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIHN0cmluZyBzZWN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUgKGFiZmQsIG51bV9zeW1zLCBzdHJpbmdzaXplKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCAqbnVtX3N5bXMsICpzdHJpbmdzaXplOworeworICBiZmQgKmN1cnJfYmZkID0gYWJmZC0+YXJjaGl2ZV9oZWFkOworCisgIC8qIFNvbWUgaW5pdGlhbGl6YXRpb24uICAqLworICAqbnVtX3N5bXMgPSAwOworICAqc3RyaW5nc2l6ZSA9IDA7CisKKyAgLyogSXRlcmF0ZSBvdmVyIGVhY2ggQkZEIHdpdGhpbiB0aGlzIGFyY2hpdmUuICAqLworICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgaTsKKyAgICAgIHNvbV9zeW1ib2xfdHlwZSAqc3ltOworCisgICAgICAvKiBEb24ndCBib3RoZXIgZm9yIG5vbi1TT00gb2JqZWN0cy4gICovCisgICAgICBpZiAoY3Vycl9iZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0CisJICB8fCBjdXJyX2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyKQorCXsKKwkgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHJlYWQsIHRoZW4gc25hZyBhIHBvaW50ZXIKKwkgdG8gaXQuICBJdCdzIGEgbGl0dGxlIHNsaW1leSB0byBncmFiIHRoZSBzeW1ib2xzIHZpYSBvYmpfc29tX3N5bXRhYiwKKwkgYnV0IGRvaW5nIHNvIGF2b2lkcyBhbGxvY2F0aW5nIGxvdHMgb2YgZXh0cmEgbWVtb3J5LiAgKi8KKyAgICAgIGlmIChzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChjdXJyX2JmZCkgPT0gZmFsc2UpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBzeW0gPSBvYmpfc29tX3N5bXRhYiAoY3Vycl9iZmQpOworICAgICAgY3Vycl9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGN1cnJfYmZkKTsKKworICAgICAgLyogRXhhbWluZSBlYWNoIHN5bWJvbCB0byBkZXRlcm1pbmUgaWYgaXQgYmVsb25ncyBpbiB0aGUKKwkgbGlicmFyeSBzeW1ib2wgdGFibGUuICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJfY291bnQ7IGkrKywgc3ltKyspCisJeworCSAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87CisKKwkgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCisJICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChjdXJyX2JmZCwgJnN5bS0+c3ltYm9sLCAmaW5mbyk7CisKKwkgIC8qIFNob3VsZCB3ZSBpbmNsdWRlIHRoaXMgc3ltYm9sPyAgKi8KKwkgIGlmIChpbmZvLnN5bWJvbF90eXBlID09IFNUX05VTEwKKwkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKKwkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBPbmx5IGdsb2JhbCBzeW1ib2xzIGFuZCB1bnNhdGlzZmllZCBjb21tb25zLiAgKi8KKwkgIGlmIChpbmZvLnN5bWJvbF9zY29wZSAhPSBTU19VTklWRVJTQUwKKwkgICAgICAmJiBpbmZvLnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCisJICAgIGNvbnRpbnVlOworCisJICAvKiBEbyBubyBpbmNsdWRlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KKwkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pKQorCSAgICBjb250aW51ZTsKKworCSAgLyogQnVtcCB0aGUgdmFyaW91cyBjb3VudGVycywgYmVpbmcgY2FyZWZ1bCB0byBob25vcgorCSAgICAgYWxpZ25tZW50IGNvbnNpZGVyYXRpb25zIGluIHRoZSBzdHJpbmcgdGFibGUuICAqLworCSAgKCpudW1fc3ltcykrKzsKKwkgICpzdHJpbmdzaXplID0gKnN0cmluZ3NpemUgKyBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpICsgNTsKKwkgIHdoaWxlICgqc3RyaW5nc2l6ZSAlIDQpCisJICAgICgqc3RyaW5nc2l6ZSkrKzsKKwl9CisKKyAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogSGFzaCBhIHN5bWJvbCBuYW1lIGJhc2VkIG9uIHRoZSBoYXNoaW5nIGFsZ29yaXRobSBwcmVzZW50ZWQgaW4gdGhlCisgICBTT00gQUJJLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NvbV9iZmRfYXJfc3ltYm9sX2hhc2ggKHN5bWJvbCkKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworeworICB1bnNpZ25lZCBpbnQgbGVuID0gc3RybGVuIChzeW1ib2wtPm5hbWUpOworCisgIC8qIE5hbWVzIHdpdGggbGVuZ3RoIDEgYXJlIHNwZWNpYWwuICAqLworICBpZiAobGVuID09IDEpCisgICAgcmV0dXJuIDB4MTAwMDEwMCB8IChzeW1ib2wtPm5hbWVbMF0gPDwgMTYpIHwgc3ltYm9sLT5uYW1lWzBdOworCisgIHJldHVybiAoKGxlbiAmIDB4N2YpIDw8IDI0KSB8IChzeW1ib2wtPm5hbWVbMV0gPDwgMTYpCisJICB8IChzeW1ib2wtPm5hbWVbbGVuLTJdIDw8IDgpIHwgc3ltYm9sLT5uYW1lW2xlbi0xXTsKK30KKworLyogRG8gdGhlIGJ1bGsgb2YgdGhlIHdvcmsgcmVxdWlyZWQgdG8gd3JpdGUgdGhlIFNPTSBsaWJyYXJ5CisgICBzeW1ib2wgdGFibGUuICAqLworICAgCitzdGF0aWMgYm9vbGVhbgorc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYgKGFiZmQsIG5zeW1zLCBzdHJpbmdfc2l6ZSwgbHN0LCBlbGVuZ3RoKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBuc3ltcywgc3RyaW5nX3NpemU7CisgICAgIHN0cnVjdCBsc3RfaGVhZGVyIGxzdDsKKyAgICAgdW5zaWduZWQgZWxlbmd0aDsKK3sKKyAgZmlsZV9wdHIgbHN0X2ZpbGVwb3M7CisgIGNoYXIgKnN0cmluZ3MgPSBOVUxMLCAqcDsKKyAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICpsc3Rfc3ltcyA9IE5VTEwsICpjdXJyX2xzdF9zeW07CisgIGJmZCAqY3Vycl9iZmQ7CisgIHVuc2lnbmVkIGludCAqaGFzaF90YWJsZSA9IE5VTEw7CisgIHN0cnVjdCBzb21fZW50cnkgKnNvbV9kaWN0ID0gTlVMTDsKKyAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICoqbGFzdF9oYXNoX2VudHJ5ID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGN1cnJfc29tX29mZnNldCwgc29tX2luZGV4ID0gMDsKKworICBoYXNoX3RhYmxlID0KKyAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOworICBpZiAoaGFzaF90YWJsZSA9PSBOVUxMICYmIGxzdC5oYXNoX3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgc29tX2RpY3QgPQorICAgIChzdHJ1Y3Qgc29tX2VudHJ5ICopIGJmZF9tYWxsb2MgKGxzdC5tb2R1bGVfY291bnQKKwkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7CisgIGlmIChzb21fZGljdCA9PSBOVUxMICYmIGxzdC5tb2R1bGVfY291bnQgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBsYXN0X2hhc2hfZW50cnkgPQorICAgICgoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICoqKQorICAgICBiZmRfbWFsbG9jIChsc3QuaGFzaF9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKikpKTsKKyAgaWYgKGxhc3RfaGFzaF9lbnRyeSA9PSBOVUxMICYmIGxzdC5oYXNoX3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBMb3RzIG9mIGZpZWxkcyBhcmUgZmlsZSBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0CisgICAgIG9mIHRoZSBsc3QgcmVjb3JkLiAgU28gc2F2ZSBpdHMgbG9jYXRpb24uICAqLworICBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOworCisgIC8qIFNvbWUgaW5pdGlhbGl6YXRpb24uICAqLworICBtZW1zZXQgKGhhc2hfdGFibGUsIDAsIDQgKiBsc3QuaGFzaF9zaXplKTsKKyAgbWVtc2V0IChzb21fZGljdCwgMCwgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOworICBtZW1zZXQgKGxhc3RfaGFzaF9lbnRyeSwgMCwgCQorCSAgbHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICopKTsKKworICAvKiBTeW1ib2xzIGhhdmUgc29tX2luZGV4IGZpZWxkcywgc28gd2UgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHRoZQorICAgICBpbmRleCBvZiBlYWNoIFNPTSBpbiB0aGUgYXJjaGl2ZS4KKworICAgICBUaGUgU09NIGRpY3Rpb25hcnkgaGFzIChhbW9uZyBvdGhlciB0aGluZ3MpIHRoZSBhYnNvbHV0ZSBmaWxlCisgICAgIHBvc2l0aW9uIGZvciB0aGUgU09NIHdoaWNoIGEgcGFydGljdWxhciBkaWN0aW9uYXJ5IGVudHJ5CisgICAgIGRlc2NyaWJlcy4gIFdlIGhhdmUgdG8gY29tcHV0ZSB0aGF0IGluZm9ybWF0aW9uIGFzIHdlIGl0ZXJhdGUKKyAgICAgdGhyb3VnaCB0aGUgU09Ncy9zeW1ib2xzLiAgKi8KKyAgc29tX2luZGV4ID0gMDsKKworICAvKiBXZSBhZGQgaW4gdGhlIHNpemUgb2YgdGhlIGFyY2hpdmUgaGVhZGVyIHR3aWNlIGFzIHRoZSBsb2NhdGlvbgorICAgICBpbiB0aGUgU09NIGRpY3Rpb25hcnkgaXMgdGhlIGFjdHVhbCBvZmZzZXQgb2YgdGhlIFNPTSwgbm90IHRoZQorICAgICBhcmNoaXZlIGhlYWRlciBiZWZvcmUgdGhlIFNPTS4gICovCisgIGN1cnJfc29tX29mZnNldCA9IDggKyAyICogc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIGxzdC5maWxlX2VuZDsKKworICAvKiBNYWtlIHJvb20gZm9yIHRoZSBhcmNoaXZlIGhlYWRlciBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgICBleHRlbmRlZCBzdHJpbmcgdGFibGUuICBOb3RlIHRoYXQgZWxlbmd0aCBpbmNsdWRlcyB0aGUgc2l6ZQorICAgICBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlISAgKi8KKyAgaWYgKGVsZW5ndGgpCisgICAgY3Vycl9zb21fb2Zmc2V0ICs9IGVsZW5ndGg7CisKKyAgLyogTWFrZSBzdXJlIHdlJ3JlIHByb3Blcmx5IGFsaWduZWQuICAqLworICBjdXJyX3NvbV9vZmZzZXQgPSAoY3Vycl9zb21fb2Zmc2V0ICsgMHgxKSAmIH4weDE7CisKKyAgLyogRklYTUUgc2hvdWxkIGJlIGRvbmUgd2l0aCBidWZmZXJzIGp1c3QgbGlrZSBldmVyeXRoaW5nIGVsc2UuLi4gKi8KKyAgbHN0X3N5bXMgPSBiZmRfbWFsbG9jIChuc3ltcyAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSk7CisgIGlmIChsc3Rfc3ltcyA9PSBOVUxMICYmIG5zeW1zICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIHN0cmluZ3MgPSBiZmRfbWFsbG9jIChzdHJpbmdfc2l6ZSk7CisgIGlmIChzdHJpbmdzID09IE5VTEwgJiYgc3RyaW5nX3NpemUgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBwID0gc3RyaW5nczsKKyAgY3Vycl9sc3Rfc3ltID0gbHN0X3N5bXM7CisKKyAgY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7CisgIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBpOworICAgICAgc29tX3N5bWJvbF90eXBlICpzeW07CisKKyAgICAgIC8qIERvbid0IGJvdGhlciBmb3Igbm9uLVNPTSBvYmplY3RzLiAgKi8KKyAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QKKwkgIHx8IGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCisJeworCSAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgorCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAorCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLworICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKKwlnb3RvIGVycm9yX3JldHVybjsKKworICAgICAgc3ltID0gb2JqX3NvbV9zeW10YWIgKGN1cnJfYmZkKTsKKyAgICAgIGN1cnJfY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChjdXJyX2JmZCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyX2NvdW50OyBpKyssIHN5bSsrKQorCXsKKwkgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyBpbmZvOworCisJICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLworCSAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoY3Vycl9iZmQsICZzeW0tPnN5bWJvbCwgJmluZm8pOworCisJICAvKiBTaG91bGQgd2UgaW5jbHVkZSB0aGlzIHN5bWJvbD8gICovCisJICBpZiAoaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9OVUxMCisJICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9TWU1fRVhUCisJICAgICAgfHwgaW5mby5zeW1ib2xfdHlwZSA9PSBTVF9BUkdfRVhUKQorCSAgICBjb250aW51ZTsKKworCSAgLyogT25seSBnbG9iYWwgc3ltYm9scyBhbmQgdW5zYXRpc2ZpZWQgY29tbW9ucy4gICovCisJICBpZiAoaW5mby5zeW1ib2xfc2NvcGUgIT0gU1NfVU5JVkVSU0FMCisJICAgICAgJiYgaW5mby5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQorCSAgICBjb250aW51ZTsKKworCSAgLyogRG8gbm8gaW5jbHVkZSB1bmRlZmluZWQgc3ltYm9scy4gICovCisJICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnN5bWJvbC5zZWN0aW9uKSkKKwkgICAgY29udGludWU7CisKKwkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN5bWJvbCBmcm9tIHRoaXMgU09NLCB0aGVuIHVwZGF0ZQorCSAgICAgdGhlIFNPTSBkaWN0aW9uYXJ5IHRvby4gICovCisJICBpZiAoc29tX2RpY3Rbc29tX2luZGV4XS5sb2NhdGlvbiA9PSAwKQorCSAgICB7CisJICAgICAgc29tX2RpY3Rbc29tX2luZGV4XS5sb2NhdGlvbiA9IGN1cnJfc29tX29mZnNldDsKKwkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxlbmd0aCA9IGFyZWx0X3NpemUgKGN1cnJfYmZkKTsKKwkgICAgfQorCisJICAvKiBGaWxsIGluIHRoZSBsc3Qgc3ltYm9sIHJlY29yZC4gICovCisJICBjdXJyX2xzdF9zeW0tPmhpZGRlbiA9IDA7CisJICBjdXJyX2xzdF9zeW0tPnNlY29uZGFyeV9kZWYgPSAwOworCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfdHlwZSA9IGluZm8uc3ltYm9sX3R5cGU7CisJICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9zY29wZSA9IGluZm8uc3ltYm9sX3Njb3BlOworCSAgY3Vycl9sc3Rfc3ltLT5jaGVja19sZXZlbCA9IDA7CisJICBjdXJyX2xzdF9zeW0tPm11c3RfcXVhbGlmeSA9IDA7CisJICBjdXJyX2xzdF9zeW0tPmluaXRpYWxseV9mcm96ZW4gPSAwOworCSAgY3Vycl9sc3Rfc3ltLT5tZW1vcnlfcmVzaWRlbnQgPSAwOworCSAgY3Vycl9sc3Rfc3ltLT5pc19jb21tb24gPSBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pOworCSAgY3Vycl9sc3Rfc3ltLT5kdXBfY29tbW9uID0gMDsKKwkgIGN1cnJfbHN0X3N5bS0+eGxlYXN0ID0gMzsKKwkgIGN1cnJfbHN0X3N5bS0+YXJnX3JlbG9jID0gaW5mby5hcmdfcmVsb2M7CisJICBjdXJyX2xzdF9zeW0tPm5hbWUubl9zdHJ4ID0gcCAtIHN0cmluZ3MgKyA0OworCSAgY3Vycl9sc3Rfc3ltLT5xdWFsaWZpZXJfbmFtZS5uX3N0cnggPSAwOworCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfaW5mbyA9IGluZm8uc3ltYm9sX2luZm87CisJICBjdXJyX2xzdF9zeW0tPnN5bWJvbF92YWx1ZSA9IGluZm8uc3ltYm9sX3ZhbHVlIHwgaW5mby5wcml2X2xldmVsOworCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfZGVzY3JpcHRvciA9IDA7CisJICBjdXJyX2xzdF9zeW0tPnJlc2VydmVkID0gMDsKKwkgIGN1cnJfbHN0X3N5bS0+c29tX2luZGV4ID0gc29tX2luZGV4OworCSAgY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ID0gc29tX2JmZF9hcl9zeW1ib2xfaGFzaCAoJnN5bS0+c3ltYm9sKTsKKwkgIGN1cnJfbHN0X3N5bS0+bmV4dF9lbnRyeSA9IDA7CisKKwkgIC8qIEluc2VydCBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkgIGlmIChoYXNoX3RhYmxlW2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdKQorCSAgICB7CisJICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkICp0bXA7CisKKwkgICAgICAvKiBUaGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBhdCB0aGUgaGVhZCBvZiB0aGlzIGhhc2ggY2hhaW4sCisJCSBzbyB0YWNrIHRoaXMgc3ltYm9sIG9udG8gdGhlIGVuZCBvZiB0aGUgY2hhaW4uICAqLworCSAgICAgIHRtcCA9IGxhc3RfaGFzaF9lbnRyeVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXTsKKwkgICAgICB0bXAtPm5leHRfZW50cnkKKwkJPSAoY3Vycl9sc3Rfc3ltIC0gbHN0X3N5bXMpICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpCisJCSAgKyBsc3QuaGFzaF9zaXplICogNCAKKwkJICArIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpCisJCSAgKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRmlyc3QgZW50cnkgaW4gdGhpcyBoYXNoIGNoYWluLiAgKi8KKwkgICAgICBoYXNoX3RhYmxlW2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdCisJCT0gKGN1cnJfbHN0X3N5bSAtIGxzdF9zeW1zKSAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKQorCQkgICsgbHN0Lmhhc2hfc2l6ZSAqIDQgCisJCSAgKyBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KQorCQkgICsgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7CisJICAgIH0KKworCSAgLyogS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzeW1ib2wgd2UgYWRkZWQgdG8gdGhpcyBjaGFpbiBzbyB3ZSBjYW4KKwkgICAgIGVhc2lseSB1cGRhdGUgaXRzIG5leHRfZW50cnkgcG9pbnRlci4gICovCisJICBsYXN0X2hhc2hfZW50cnlbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0KKwkgICAgPSBjdXJyX2xzdF9zeW07CisKKworCSAgLyogVXBkYXRlIHRoZSBzdHJpbmcgdGFibGUuICAqLworCSAgYmZkX3B1dF8zMiAoYWJmZCwgc3RybGVuIChzeW0tPnN5bWJvbC5uYW1lKSwgcCk7CisJICBwICs9IDQ7CisJICBzdHJjcHkgKHAsIHN5bS0+c3ltYm9sLm5hbWUpOworCSAgcCArPSBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpICsgMTsKKwkgIHdoaWxlICgoaW50KXAgJSA0KQorCSAgICB7CisJICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKKwkgICAgICBwKys7CisJICAgIH0KKworCSAgLyogSGVhZCB0byB0aGUgbmV4dCBzeW1ib2wuICAqLworCSAgY3Vycl9sc3Rfc3ltKys7CisJfQorCisgICAgICAvKiBLZWVwIHRyYWNrIG9mIHdoZXJlIGVhY2ggU09NIHdpbGwgZmluYWxseSByZXNpZGU7IHRoZW4gbG9vaworCSBhdCB0aGUgbmV4dCBCRkQuICAqLworICAgICAgY3Vycl9zb21fb2Zmc2V0ICs9IGFyZWx0X3NpemUgKGN1cnJfYmZkKSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7CisgCisgICAgICAvKiBBIHBhcnRpY3VsYXIgb2JqZWN0IGluIHRoZSBhcmNoaXZlIG1heSBoYXZlIGFuIG9kZCBsZW5ndGg7IHRoZQorCSBsaW5rZXIgcmVxdWlyZXMgb2JqZWN0cyBiZWdpbiBvbiBhbiBldmVuIGJvdW5kYXJ5LiAgU28gcm91bmQKKwkgdXAgdGhlIGN1cnJlbnQgb2Zmc2V0IGFzIG5lY2Vzc2FyeS4gICovCisgICAgICBjdXJyX3NvbV9vZmZzZXQgPSAoY3Vycl9zb21fb2Zmc2V0ICsgMHgxKSAmIH4weDE7CisgICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OworICAgICAgc29tX2luZGV4Kys7CisgICAgfQorCisgIC8qIE5vdyBzY3JpYmJsZSBvdXQgdGhlIGhhc2ggdGFibGUuICAqLworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBoYXNoX3RhYmxlLCBsc3QuaGFzaF9zaXplLCA0LCBhYmZkKQorICAgICAgIT0gbHN0Lmhhc2hfc2l6ZSAqIDQpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogVGhlbiB0aGUgU09NIGRpY3Rpb25hcnkuICAqLworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fZGljdCwgbHN0Lm1vZHVsZV9jb3VudCwKKwkJIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSksIGFiZmQpCisgICAgICAhPSBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBUaGUgbGlicmFyeSBzeW1ib2xzLiAgKi8KKyAgaWYgKGJmZF93cml0ZSAoKFBUUikgbHN0X3N5bXMsIG5zeW1zLCBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCksIGFiZmQpCisgICAgICAhPSBuc3ltcyAqIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBBbmQgZmluYWxseSB0aGUgc3RyaW5ncy4gICovCisgIGlmIChiZmRfd3JpdGUgKChQVFIpIHN0cmluZ3MsIHN0cmluZ19zaXplLCAxLCBhYmZkKSAhPSBzdHJpbmdfc2l6ZSkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQorICAgIGZyZWUgKGhhc2hfdGFibGUpOworICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKKyAgICBmcmVlIChzb21fZGljdCk7CisgIGlmIChsYXN0X2hhc2hfZW50cnkgIT0gTlVMTCkKKyAgICBmcmVlIChsYXN0X2hhc2hfZW50cnkpOworICBpZiAobHN0X3N5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChsc3Rfc3ltcyk7CisgIGlmIChzdHJpbmdzICE9IE5VTEwpCisgICAgZnJlZSAoc3RyaW5ncyk7CisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQorICAgIGZyZWUgKGhhc2hfdGFibGUpOworICBpZiAoc29tX2RpY3QgIT0gTlVMTCkKKyAgICBmcmVlIChzb21fZGljdCk7CisgIGlmIChsYXN0X2hhc2hfZW50cnkgIT0gTlVMTCkKKyAgICBmcmVlIChsYXN0X2hhc2hfZW50cnkpOworICBpZiAobHN0X3N5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChsc3Rfc3ltcyk7CisgIGlmIChzdHJpbmdzICE9IE5VTEwpCisgICAgZnJlZSAoc3RyaW5ncyk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBXcml0ZSBvdXQgdGhlIExTVCBmb3IgdGhlIGFyY2hpdmUuCisKKyAgIFlvdSdsbCBuZXZlciBiZWxpZXZlIHRoaXMgaXMgcmVhbGx5IGhvdyBhcm1hcHMgYXJlIGhhbmRsZWQgaW4gU09NLi4uICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitzb21fd3JpdGVfYXJtYXAgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7CisgICAgIHN0cnVjdCBvcmwgKm1hcDsKKyAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKKyAgICAgaW50IHN0cmlkeDsKK3sKKyAgYmZkICpjdXJyX2JmZDsKKyAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgdW5zaWduZWQgaW50IGksIGxzdF9zaXplLCBuc3ltcywgc3RyaW5nc2l6ZTsKKyAgc3RydWN0IGFyX2hkciBoZHI7CisgIHN0cnVjdCBsc3RfaGVhZGVyIGxzdDsKKyAgaW50ICpwOworIAorICAvKiBXZSdsbCB1c2UgdGhpcyBmb3IgdGhlIGFyY2hpdmUncyBkYXRlIGFuZCBtb2RlIGxhdGVyLiAgKi8KKyAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmc3RhdGJ1ZikgIT0gMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgLyogRnVkZ2UgZmFjdG9yLiAgKi8KKyAgYmZkX2FyZGF0YSAoYWJmZCktPmFybWFwX3RpbWVzdGFtcCA9IHN0YXRidWYuc3RfbXRpbWUgKyA2MDsKKworICAvKiBBY2NvdW50IGZvciB0aGUgbHN0IGhlYWRlciBmaXJzdC4gICovCisgIGxzdF9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7CisKKyAgLyogU3RhcnQgYnVpbGRpbmcgdGhlIExTVCBoZWFkZXIuICAqLworICAvKiBGSVhNRTogIERvIHdlIG5lZWQgdG8gZXhhbWluZSBlYWNoIGVsZW1lbnQgdG8gZGV0ZXJtaW5lIHRoZQorICAgICBsYXJnZXN0IGlkIG51bWJlcj8gICovCisgIGxzdC5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMDsKKyAgbHN0LmFfbWFnaWMgPSBMSUJNQUdJQzsKKyAgbHN0LnZlcnNpb25faWQgPSBWRVJTSU9OX0lEOworICBsc3QuZmlsZV90aW1lLnNlY3MgPSAwOworICBsc3QuZmlsZV90aW1lLm5hbm9zZWNzID0gMDsKKworICBsc3QuaGFzaF9sb2MgPSBsc3Rfc2l6ZTsKKyAgbHN0Lmhhc2hfc2l6ZSA9IFNPTV9MU1RfSEFTSF9TSVpFOworCisgIC8qIEhhc2ggdGFibGUgaXMgYSBTT01fTFNUX0hBU0hfU0laRSAzMmJpdCBvZmZzZXRzLiAgKi8KKyAgbHN0X3NpemUgKz0gNCAqIFNPTV9MU1RfSEFTSF9TSVpFOworCisgIC8qIFdlIG5lZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBTT01zIGluIHRoaXMgYXJjaGl2ZS4gICovCisgIGN1cnJfYmZkID0gYWJmZC0+YXJjaGl2ZV9oZWFkOworICBsc3QubW9kdWxlX2NvdW50ID0gMDsKKyAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCisgICAgeworICAgICAgLyogT25seSB0cnVlIFNPTSBvYmplY3RzIGNvdW50LiAgKi8KKyAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ID09IGJmZF9vYmplY3QKKwkgICYmIGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCisJbHN0Lm1vZHVsZV9jb3VudCsrOworICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKKyAgICB9CisgIGxzdC5tb2R1bGVfbGltaXQgPSBsc3QubW9kdWxlX2NvdW50OworICBsc3QuZGlyX2xvYyA9IGxzdF9zaXplOworICBsc3Rfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpICogbHN0Lm1vZHVsZV9jb3VudDsKKworICAvKiBXZSBkb24ndCBzdXBwb3J0IGltcG9ydC9leHBvcnQgdGFibGVzLCBhdXhpbGlhcnkgaGVhZGVycywKKyAgICAgb3IgZnJlZSBsaXN0cyB5ZXQuICBNYWtlIHRoZSBsaW5rZXIgd29yayBhIGxpdHRsZSBoYXJkZXIKKyAgICAgdG8gbWFrZSBvdXIgbGlmZSBlYXNpZXIuICAqLworCisgIGxzdC5leHBvcnRfbG9jID0gMDsKKyAgbHN0LmV4cG9ydF9jb3VudCA9IDA7CisgIGxzdC5pbXBvcnRfbG9jID0gMDsKKyAgbHN0LmF1eF9sb2MgPSAwOworICBsc3QuYXV4X3NpemUgPSAwOworCisgIC8qIENvdW50IGhvdyBtYW55IHN5bWJvbHMgd2Ugd2lsbCBoYXZlIG9uIHRoZSBoYXNoIGNoYWlucyBhbmQgdGhlCisgICAgIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHRhYmxlLiAgKi8KKyAgaWYgKHNvbV9iZmRfcHJlcF9mb3JfYXJfd3JpdGUgKGFiZmQsICZuc3ltcywgJnN0cmluZ3NpemUpID09IGZhbHNlKQorICAgIHJldHVybiBmYWxzZTsKKworICBsc3Rfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkgKiBuc3ltczsKKworICAvKiBGb3IgdGhlIHN0cmluZyB0YWJsZS4gIE9uZSBkYXkgd2UgbWlnaHQgYWN0dWFsbHkgdXNlIHRoaXMgaW5mbworICAgICB0byBhdm9pZCBzbWFsbCBzZWVrcy9yZWFkcyB3aGVuIHJlYWRpbmcgYXJjaGl2ZXMuICAqLworICBsc3Quc3RyaW5nX2xvYyA9IGxzdF9zaXplOworICBsc3Quc3RyaW5nX3NpemUgPSBzdHJpbmdzaXplOworICBsc3Rfc2l6ZSArPSBzdHJpbmdzaXplOworCisgIC8qIFNPTSBBQkkgc2F5cyB0aGlzIG11c3QgYmUgemVyby4gICovCisgIGxzdC5mcmVlX2xpc3QgPSAwOworICBsc3QuZmlsZV9lbmQgPSBsc3Rfc2l6ZTsKKworICAvKiBDb21wdXRlIHRoZSBjaGVja3N1bS4gIE11c3QgaGFwcGVuIGFmdGVyIHRoZSBlbnRpcmUgbHN0IGhlYWRlcgorICAgICBoYXMgZmlsbGVkIGluLiAgKi8KKyAgcCA9IChpbnQgKikmbHN0OworICBsc3QuY2hlY2tzdW0gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcikvc2l6ZW9mIChpbnQpIC0gMTsgaSsrKQorICAgIGxzdC5jaGVja3N1bSBePSAqcCsrOworCisgIHNwcmludGYgKGhkci5hcl9uYW1lLCAiLyAgICAgICAgICAgICAgICIpOworICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIGJmZF9hcmRhdGEgKGFiZmQpLT5hcm1hcF90aW1lc3RhbXApOworICBzcHJpbnRmIChoZHIuYXJfdWlkLCAiJWxkIiwgKGxvbmcpIGdldHVpZCAoKSk7CisgIHNwcmludGYgKGhkci5hcl9naWQsICIlbGQiLCAobG9uZykgZ2V0Z2lkICgpKTsKKyAgc3ByaW50ZiAoaGRyLmFyX21vZGUsICIlLThvIiwgKHVuc2lnbmVkIGludCkgc3RhdGJ1Zi5zdF9tb2RlKTsKKyAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIGxzdF9zaXplKTsKKyAgaGRyLmFyX2ZtYWdbMF0gPSAnYCc7CisgIGhkci5hcl9mbWFnWzFdID0gJ1wwMTInOworCisgIC8qIFR1cm4gYW55IG51bGxzIGludG8gc3BhY2VzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKKyAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKKyAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7CisKKyAgLyogU2NyaWJibGUgb3V0IHRoZSBhciBoZWFkZXIuICAqLworICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm93IHNjcmliYmxlIG91dCB0aGUgbHN0IGhlYWRlci4gICovCisgIGlmIChiZmRfd3JpdGUgKChQVFIpICZsc3QsIDEsIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpLCBhYmZkKQorICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEJ1aWxkIGFuZCB3cml0ZSB0aGUgYXJtYXAuICAqLworICBpZiAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYgKGFiZmQsIG5zeW1zLCBzdHJpbmdzaXplLCBsc3QsIGVsZW5ndGgpCisgICAgICA9PSBmYWxzZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICAvKiBEb25lLiAgKi8KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZyZWUgYWxsIGluZm9ybWF0aW9uIHdlIGhhdmUgY2FjaGVkIGZvciB0aGlzIEJGRC4gIFdlIGNhbiBhbHdheXMKKyAgIHJlYWQgaXQgYWdhaW4gbGF0ZXIgaWYgd2UgbmVlZCBpdC4gICovCisKK3N0YXRpYyBib29sZWFuCitzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKm87CisKKyAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQorICAgIHJldHVybiB0cnVlOworCisjZGVmaW5lIEZSRUUoeCkgaWYgKHggIT0gTlVMTCkgeyBmcmVlICh4KTsgeCA9IE5VTEw7IH0KKyAgLyogRnJlZSB0aGUgbmF0aXZlIHN0cmluZyBhbmQgc3ltYm9sIHRhYmxlcy4gICovCisgIEZSRUUgKG9ial9zb21fc3ltdGFiIChhYmZkKSk7CisgIEZSRUUgKG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSk7CisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICAvKiBGcmVlIHRoZSBuYXRpdmUgcmVsb2NhdGlvbnMuICAqLworICAgICAgby0+cmVsb2NfY291bnQgPSAtMTsKKyAgICAgIEZSRUUgKHNvbV9zZWN0aW9uX2RhdGEgKG8pLT5yZWxvY19zdHJlYW0pOworICAgICAgLyogRnJlZSB0aGUgZ2VuZXJpYyByZWxvY2F0aW9ucy4gICovCisgICAgICBGUkVFIChvLT5yZWxvY2F0aW9uKTsKKyAgICB9CisjdW5kZWYgRlJFRQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBFbmQgb2YgbWlzY2VsbGFuZW91cyBzdXBwb3J0IGZ1bmN0aW9ucy4gKi8KKworLyogTGlua2VyIHN1cHBvcnQgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBib29sZWFuCitzb21fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7Cit7CisgIHJldHVybiAoc29tX2lzX3N1YnNwYWNlIChzZWMpICYmIHNlYy0+X3Jhd19zaXplID4gMjQwMDAwKTsKK30KKworI2RlZmluZQlzb21fY2xvc2VfYW5kX2NsZWFudXAJCXNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbworCisjZGVmaW5lIHNvbV9yZWFkX2FyX2hkcgkJCV9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgorI2RlZmluZSBzb21fb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQorI2RlZmluZSBzb21fZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKKyNkZWZpbmUgc29tX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CisjZGVmaW5lIHNvbV90cnVuY2F0ZV9hcm5hbWUJCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lCisjZGVmaW5lIHNvbV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2RlZmluZSBzb21fY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAorICBfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQorI2RlZmluZSBzb21fdXBkYXRlX2FybWFwX3RpbWVzdGFtcAliZmRfdHJ1ZQorI2RlZmluZSBzb21fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorCisjZGVmaW5lIHNvbV9nZXRfbGluZW5vICAgICAgICAgICAgICAgICAgX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubworI2RlZmluZSBzb21fYmZkX21ha2VfZGVidWdfc3ltYm9sCV9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBzb21fcmVhZF9taW5pc3ltYm9scwkJX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgc29tX21pbmlzeW1ib2xfdG9fc3ltYm9sCV9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAorI2RlZmluZSBzb21fZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworCisjZGVmaW5lIHNvbV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKKyNkZWZpbmUgc29tX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgc29tX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIHNvbV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scworI2RlZmluZSBzb21fYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKKworI2RlZmluZSBzb21fYmZkX2djX3NlY3Rpb25zCQliZmRfZ2VuZXJpY19nY19zZWN0aW9ucworCisKK2NvbnN0IGJmZF90YXJnZXQgc29tX3ZlYyA9Cit7CisgICJzb20iLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9zb21fZmxhdm91ciwKKyAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQgfCBEWU5BTUlDKSwKKyAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUworICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCQkvKiBzZWN0aW9uIGZsYWdzICovCisKKy8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKKyAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLworICAwLAorICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE0LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KKyAge19iZmRfZHVtbXlfdGFyZ2V0LAorICAgc29tX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLAorICAgX2JmZF9kdW1teV90YXJnZXQKKyAgfSwKKyAgeworICAgIGJmZF9mYWxzZSwKKyAgICBzb21fbWtvYmplY3QsCisgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKKyAgICBiZmRfZmFsc2UKKyAgfSwKKyAgeworICAgIGJmZF9mYWxzZSwKKyAgICBzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAorICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKKyAgICBiZmRfZmFsc2UsCisgIH0sCisjdW5kZWYgc29tCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc29tKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoc29tKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChzb20pLAorICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzb20pLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNvbSksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzb20pLAorICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzb20pLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgMAorfTsKKworI2VuZGlmIC8qIEhPU1RfSFBQQUhQVVggfHwgSE9TVF9IUFBBQlNEIHx8IEhPU1RfSFBQQU9TRiAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NvbS5oIGIvYmZkL3NvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzc4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc29tLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfU09NX0gKKyNkZWZpbmUgX1NPTV9ICisKKyNpbmNsdWRlICJsaWJocHBhLmgiCisKKyNpbmNsdWRlIDxhLm91dC5oPgorI2luY2x1ZGUgPGxzdC5oPgorI2luY2x1ZGUgPGFyLmg+CisKKy8qIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBjdXJyZW50bHkgdXNlIGFueXRoaW5nIGZyb20gdGhlc2UKKyAgIHR3byBpbmNsdWRlIGZpbGVzLCBidXQgaXQncyBsaWtlbHkgdG8gbmVlZCB0aGVtIGluIHRoZSBmdXR1cmUuICAqLworI2lmZGVmIFJfRExUX1JFTAorI2luY2x1ZGUgPHNobC5oPgorI2luY2x1ZGUgPGRsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCisvKiBCU0QgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNjaGVtZSBmb3Igb2JqZWN0IGZpbGUgaWRlbnRpZmljYXRpb24uCisgICBzbyBmb3Igbm93LCBkZWZpbmUgX1BBX1JJU0NfSUQgdG8gYWNjZXB0IGFueSByYW5kb20gdmFsdWUgZm9yIGEgbW9kZWwKKyAgIG51bWJlci4gICovCisjdW5kZWYgX1BBX1JJU0NfSUQKKyNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkgMQorI2VuZGlmIC8qIEhPU1RfSFBQQUJTRCAqLworCisjZGVmaW5lIEZJTEVfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpCisjZGVmaW5lIEFVWF9IRFJfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9leGVjX2F1eGhkcikKKwordHlwZWRlZiBzdHJ1Y3Qgc29tX3N5bWJvbAorICB7CisgICAgYXN5bWJvbCBzeW1ib2w7CisgICAgdW5zaWduZWQgaW50IHNvbV90eXBlOworCisgICAgLyogU3RydWN0dXJlZCBsaWtlIHRoZSBFTEYgdGNfZGF0YSB1bmlvbi4gIEFsbG93cyBtb3JlIGNvZGUgc2hhcmluZworICAgICAgIGluIEdBUyB0aGlzIHdheS4gICovCisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3QKKwl7CisJICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7CisJICB1bnNpZ25lZCBpbnQgaHBwYV9wcml2X2xldmVsOworCX0gYXA7CisJUFRSIGFueTsKKyAgICAgIH0KKyAgICB0Y19kYXRhOworCisgICAgLyogSW5kZXggb2YgdGhpcyBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIE9ubHkgdXNlZCB3aGVuCisgICAgICAgYnVpbGRpbmcgcmVsb2NhdGlvbiBzdHJlYW1zIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLworICAgIGludCBpbmRleDsKKworICAgIC8qIEhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgQnkgc29ydGluZworICAgICAgIHRoZSBzeW1ib2xzIGZyb20gbW9zdCB1c2VkIHRvIGxlYXN0IHVzZWQgd2UgY2FuIHNpZ25pZmljYW50bHkKKyAgICAgICByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLworICAgIGludCByZWxvY19jb3VudDsKKworICAgIC8qIER1cmluZyBvYmplY3QgZmlsZSB3cml0aW5nLCB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sCisgICAgICAgaW4gdGhlIFNPTSBzdHJpbmcgdGFibGUuICovCisgICAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7CisgIH0KK3NvbV9zeW1ib2xfdHlwZTsKKworLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIG1hZ2ljIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIEJGRCdzCisgICBwcml2YXRlIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBhbiBvYmpjb3B5L3N0cmlwIHJ1bi4gICovCitzdHJ1Y3Qgc29tX2V4ZWNfZGF0YQorICB7CisgICAgLyogU29ydC1vZiBhIG1hZ2ljIG51bWJlci4gIEJTRCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAgICBuYXRpdmUgZXhlY3V0YWJsZXMgYW5kIGhwdXggZXhlY3V0YWJsZXMuICAqLworICAgIHNob3J0IHN5c3RlbV9pZDsKKworICAgIC8qIE1hZ2ljIGV4ZWMgZmxhZ3MuICBUaGVzZSBjb250cm9sIHRoaW5ncyBsaWtlIHdoZXRoZXIgb3Igbm90CisgICAgICAgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNpbmcgaXMgYWxsb3dlZCBhbmQgdGhlIGxpa2UuICAqLworICAgIGxvbmcgZXhlY19mbGFnczsKKworICAgIC8qIEFkZCBtb3JlIHN0dWZmIGhlcmUgYXMgbmVlZGVkLiAgR29vZCBleGFtcGxlcyBvZiBpbmZvcm1hdGlvbgorICAgICAgIHdlIG1pZ2h0IHdhbnQgdG8gcGFzcyB3b3VsZCBiZSBwcmVzdW1lZF9kcCwgZW50cnlfKiBhbmQgbWF5YmUKKyAgICAgICBvdGhlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLworICB9OworCitzdHJ1Y3Qgc29tZGF0YQorICB7CisgICAgLyogQWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBhYm91dCBhbiBleGVjdXRhYmxlIHdoaWNoIGxpdmVzCisgICAgICAgaW4gdGhlIHByaXZhdGUgQkZEIHN0cnVjdHVyZSBhbmQgbmVlZHMgdG8gYmUgY29waWVkIGZyb20KKyAgICAgICB0aGUgaW5wdXQgYmZkIHRvIHRoZSBvdXRwdXQgYmZkIGR1cmluZyBhIG9iamNvcHkvc3RyaXAuICAqLworICAgIHN0cnVjdCBzb21fZXhlY19kYXRhICpleGVjX2RhdGE7CisKKyAgICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG9ubHkgdXNlZCB3aGVuIHdyaXRpbmcgZmlsZXMgYW5kIGFyZQorICAgICAgIGdlbmVyYXRlZCBmcm9tIHNjcmF0Y2guICBUaGV5IG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weQorICAgICAgIG9yIHN0cmlwIHRvIHdvcmsuICAqLworICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOworICAgIHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqY29weXJpZ2h0X2F1eF9oZHI7CisgICAgc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKnZlcnNpb25fYXV4X2hkcjsKKyAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hkcjsKKyAgICBDT01QVU5JVCAqY29tcF91bml0OworCisgICAgLyogUG9pbnRlcnMgdG8gYSBzYXZlZCBjb3B5IG9mIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMuICBUaGVzZQorICAgICAgIG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weSBvciBzdHJpcCB0byB3b3JrLiAgKi8KKyAgICBzb21fc3ltYm9sX3R5cGUgKnN5bXRhYjsKKyAgICBjaGFyICpzdHJpbmd0YWI7CisgICAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOworCisgICAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCisgICAgICAgbm8gZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgZXhlY19oZHIuCisgICAgICAgVGhlc2Ugb2Zmc2V0cyBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCisKKyAgICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKKyAgICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKKyAgICBmaWxlX3B0ciByZWxvY19maWxlcG9zOworICAgIHVuc2lnbmVkIHN0cmluZ3RhYl9zaXplOworICB9OworCitzdHJ1Y3Qgc29tX2RhdGFfc3RydWN0CisgIHsKKyAgICBzdHJ1Y3Qgc29tZGF0YSBhOworICB9OworCisvKiBTdWJzdHJ1Y3R1cmUgb2Ygc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uCisgICB3aGljaCBjYW4ndCBiZSByZXByZXNlbnRlZCBieSB0aGUgZ2VuZXJpYyBCRkQgc2VjdGlvbiBzdHJ1Y3R1cmUsCisgICBidXQgd2hpY2ggbXVzdCBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkgb3Igc3RyaXAuICAqLworc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0CisgIHsKKyAgICAvKiBWYXJpb3VzIGZpZWxkcyBpbiBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyB0aGF0IHdlIG5lZWQKKyAgICAgICB0byBwYXNzIGFyb3VuZC4gICovCisgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5IDogODsKKyAgICB1bnNpZ25lZCBpbnQgYWNjZXNzX2NvbnRyb2xfYml0cyA6IDc7CisgICAgdW5zaWduZWQgaW50IGlzX2RlZmluZWQgOiAxOworICAgIHVuc2lnbmVkIGludCBpc19wcml2YXRlIDogMTsKKyAgICB1bnNpZ25lZCBpbnQgcXVhZHJhbnQgOiAyOworCisgICAgLyogRm9yIHN1YnNwYWNlcywgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUKKyAgICAgICBzcGFjZSBpbiB3aGljaCB0aGUgc3Vic3BhY2UgaXMgY29udGFpbmVkLiAgRm9yIHNwYWNlcyBpdCBwb2ludHMKKyAgICAgICBiYWNrIHRvIHRoZSBzZWN0aW9uIGZvciB0aGlzIHNwYWNlLiAgKi8KKyAgICBhc2VjdGlvbiAqY29udGFpbmVyOworCisgICAgLyogVGhlIHVzZXItc3BlY2lmaWVkIHNwYWNlIG51bWJlci4gIEl0IGlzIHdyb25nIHRvIHVzZSB0aGlzIGFzCisgICAgICAgYW4gaW5kZXggc2luY2UgZHVwbGljYXRlcyBhbmQgaG9sZXMgYXJlIGFsbG93ZWQuICAqLworICAgIGludCBzcGFjZV9udW1iZXI7CisKKyAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KKyAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnMsIAorICAgICAgIGFuZCB0aGUgbWFueSBzdWJzcGFjZSBmbGFncyB3ZSBkbyBub3QgcmVwcmVzZW50IHlldC4gICovCisgIH07CisKKy8qIFVzZWQgdG8ga2VlcCBleHRyYSBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gc2VjdGlvbi4KKworICAgcmVsb2Nfc2l6ZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0sIG5vdGUgdGhpcworICAgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGFzIFNPTSByZWxvY2F0aW9ucworICAgYXJlIHZhcmlhYmxlIGxlbmd0aC4gCisKKyAgIHJlbG9jX3N0cmVhbSBpcyB0aGUgYWN0dWFsIHN0cmVhbSBvZiByZWxvY2F0aW9uIGVudHJpZXMuICAqLworCitzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QKKyAgeworICAgIHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqY29weV9kYXRhOworICAgIHVuc2lnbmVkIGludCByZWxvY19zaXplOworICAgIGNoYXIgKnJlbG9jX3N0cmVhbTsKKyAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKnNwYWNlX2RpY3Q7CisgICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzdWJzcGFjZV9kaWN0OworICB9OworCisjZGVmaW5lIHNvbWRhdGEoYmZkKQkJCSgoYmZkKS0+dGRhdGEuc29tX2RhdGEtPmEpCisjZGVmaW5lIG9ial9zb21fZXhlY19kYXRhKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19kYXRhKQorI2RlZmluZSBvYmpfc29tX2ZpbGVfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZmlsZV9oZHIpCisjZGVmaW5lIG9ial9zb21fZXhlY19oZHIoYmZkKQkJKHNvbWRhdGEoYmZkKS5leGVjX2hkcikKKyNkZWZpbmUgb2JqX3NvbV9jb3B5cmlnaHRfaGRyKGJmZCkJKHNvbWRhdGEoYmZkKS5jb3B5cmlnaHRfYXV4X2hkcikKKyNkZWZpbmUgb2JqX3NvbV92ZXJzaW9uX2hkcihiZmQpCShzb21kYXRhKGJmZCkudmVyc2lvbl9hdXhfaGRyKQorI2RlZmluZSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQoYmZkKQkoc29tZGF0YShiZmQpLmNvbXBfdW5pdCkKKyNkZWZpbmUgb2JqX3NvbV9zeW10YWIoYmZkKQkJKHNvbWRhdGEoYmZkKS5zeW10YWIpCisjZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3RyaW5ndGFiKQorI2RlZmluZSBvYmpfc29tX3N5bV9maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKKyNkZWZpbmUgb2JqX3NvbV9zdHJfZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCisjZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiX3NpemUoYmZkKQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYl9zaXplKQorI2RlZmluZSBvYmpfc29tX3JlbG9jX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnJlbG9jX2ZpbGVwb3MpCisjZGVmaW5lIG9ial9zb21fc29ydGVkX3N5bXMoYmZkKQkoc29tZGF0YShiZmQpLnNvcnRlZF9zeW1zKQorI2RlZmluZSBzb21fc2VjdGlvbl9kYXRhKHNlYykgXAorICAoKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCAqKXNlYy0+dXNlZF9ieV9iZmQpCisjZGVmaW5lIHNvbV9zeW1ib2xfZGF0YShzeW1ib2wpCQkoKHNvbV9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpCisKKworLyogRGVmaW5lcyBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAorICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAorICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KKworICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgorICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2F0aW9uIGFzCisgICBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZSAKKyAgIGJldHdlZW4gdGhlIHR3byBvYmplY3QgZm9ybWF0cy4gICovCisKKyNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX05PX1JFTE9DQVRJT04KKyNkZWZpbmUJUl9IUFBBCQkJCVJfQ09ERV9PTkVfU1lNQk9MCisjZGVmaW5lCVJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BDUkVMX0NBTEwKKyNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9BQlNfQ0FMTAorI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9EUF9SRUxBVElWRQorI2RlZmluZSBSX0hQUEFfRU5UUlkJCQlSX0VOVFJZCisjZGVmaW5lIFJfSFBQQV9FWElUCQkJUl9FWElUCisjZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9DT01QMQorI2RlZmluZSBSX0hQUEFfQkVHSU5fQlJUQUIJCVJfQkVHSU5fQlJUQUIKKyNkZWZpbmUgUl9IUFBBX0VORF9CUlRBQgkJUl9FTkRfQlJUQUIKKyNkZWZpbmUgUl9IUFBBX0JFR0lOX1RSWQkJUl9CRUdJTl9UUlkKKyNkZWZpbmUgUl9IUFBBX0VORF9UUlkJCQlSX0VORF9UUlkKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zLCBtb3N0bHkgZm9yIHVzZSBieSBHQVMuICAqLworYm9vbGVhbiBiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBpbnQsCisJCQkJCQl1bnNpZ25lZCBpbnQsIGludCkpOworYm9vbGVhbiBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwKKwkJCQkJCSAgIGludCwgdW5zaWduZWQgaW50LCBpbnQpKTsKK3ZvaWQgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgUEFSQU1TICgoYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQpKTsKK2Jvb2xlYW4gYmZkX3NvbV9hdHRhY2hfYXV4X2hkciBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKK2ludCAqKiBocHBhX3NvbV9nZW5fcmVsb2NfdHlwZQorICBQQVJBTVMgKChiZmQgKiwgaW50LCBpbnQsIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKKwkgICBpbnQsIGFzeW1ib2wgKikpOworYm9vbGVhbiBiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKworI2VuZGlmIC8qIF9TT01fSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbGludXguYyBiL2JmZC9zcGFyY2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkNGU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9zcGFyY2xpbnV4LmMKQEAgLTAsMCArMSw3NzAgQEAKKy8qIEJGRCBiYWNrLWVuZCBmb3IgbGludXggZmxhdm9yZWQgc3BhcmMgYS5vdXQgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCitVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgICAgICAgIDQwOTYKKyNkZWZpbmUgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSAxMDI0CisjZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCisjZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAgICAgICAgMHgwCisjZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAorCisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNX1NQQVJDIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfc3BhcmMKKyNkZWZpbmUgTVkoT1ApIENBVChzcGFyY2xpbnV4XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3BhcmMtbGludXgiCisKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IE1ZKHZlYyk7CisKKy8qIFdlIGFsd2F5cyBnZW5lcmF0ZSBRTUFHSUMgZmlsZXMgaW4gcHJlZmVyZW5jZSB0byBaTUFHSUMgZmlsZXMuICBJdAorICAgd291bGQgYmUgcG9zc2libGUgdG8gbWFrZSB0aGlzIGEgbGlua2VyIG9wdGlvbiwgaWYgdGhhdCBldmVyCisgICBiZWNvbWVzIGltcG9ydGFudC4gICovCisKK3N0YXRpYyB2b2lkIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKKyAgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKKworc3RhdGljIGJvb2xlYW4gc3BhcmNsaW51eF9iZmRfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7CisKK3N0YXRpYyBib29sZWFuCitzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID0gcV9tYWdpY19mb3JtYXQ7CisgIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOworfQorCisjZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIHNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsKKworLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KKworc3RhdGljIGJvb2xlYW4gc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7CisKK3N0YXRpYyBib29sZWFuCitzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOworICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7CisKKyAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQyk7CisKKyAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7CisKKyAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCisvKiBDb2RlIHRvIGxpbmsgYWdhaW5zdCBMaW51eCBhLm91dCBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKworLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworCisjaWZuZGVmIEdPVF9SRUZfUFJFRklYCisjZGVmaW5lICAgICAgICBHT1RfUkVGX1BSRUZJWCAgIl9fR09UXyIKKyNlbmRpZgorCisjZGVmaW5lIElTX0dPVF9TWU0obmFtZSkgXAorICAoc3RybmNtcCAobmFtZSwgR09UX1JFRl9QUkVGSVgsIHNpemVvZiBHT1RfUkVGX1BSRUZJWCAtIDEpID09IDApCisKKy8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gKi8KKworI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAorI2RlZmluZSAgICAgICAgUExUX1JFRl9QUkVGSVggICJfX1BMVF8iCisjZW5kaWYKKworI2RlZmluZSBJU19QTFRfU1lNKG5hbWUpIFwKKyAgKHN0cm5jbXAgKG5hbWUsIFBMVF9SRUZfUFJFRklYLCBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSA9PSAwKQorCisvKiBUaGlzIHN0cmluZyBpcyB1c2VkIHRvIGdlbmVyYXRlIHNwZWNpYWxpemVkIGVycm9yIG1lc3NhZ2VzLiAgKi8KKworI2lmbmRlZiBORUVEU19TSFJMSUIKKyNkZWZpbmUgTkVFRFNfU0hSTElCICJfX05FRURTX1NIUkxJQl8iCisjZW5kaWYKKworLyogVGhpcyBzcGVjaWFsIHN5bWJvbCBpcyBhIHNldCB2ZWN0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YKKyAgIHBvaW50ZXJzIHRvIGZpeHVwIHRhYmxlcy4gIEl0IHdpbGwgYmUgcHJlc2VudCBpbiBhbnkgZHluYW1pY2x5CisgICBsaW5rZWQgZmlsZS4gIFRoZSBsaW5rZXIgZ2VuZXJhdGVkIGZpeHVwIHRhYmxlIHNob3VsZCBhbHNvIGJlIGFkZGVkCisgICB0byB0aGUgbGlzdCwgYW5kIGl0IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzZWNvbmQgc2xvdCAodGhlCisgICBmaXJzdCBvbmUgaXMgYSBkdW1teSB3aXRoIGEgbWFnaWMgbnVtYmVyIHRoYXQgaXMgZGVmaW5lZCBpbgorICAgY3J0MC5vKS4gICovCisKKyNpZm5kZWYgU0hBUkFCTEVfQ09ORkxJQ1RTCisjZGVmaW5lIFNIQVJBQkxFX0NPTkZMSUNUUyAiX19TSEFSQUJMRV9DT05GTElDVFNfXyIKKyNlbmRpZgorCisvKiBXZSBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBUaGUgdGVybWlub2xvZ3kgaXMgYSBiaXQgc3RyYW5nZSwgYnV0CisgICBlYWNoIGZpeHVwIGNvbnRhaW5zIHR3byAzMiBiaXQgbnVtYmVycy4gIEEgcmVndWxhciBmaXh1cCBjb250YWlucworICAgYW4gYWRkcmVzcyBhbmQgYSBwb2ludGVyLCBhbmQgYXQgcnVudGltZSB3ZSBzaG91bGQgc3RvcmUgdGhlCisgICBhZGRyZXNzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBwb2ludGVyLiAgQSBidWlsdGluIGZpeHVwCisgICBjb250YWlucyB0d28gcG9pbnRlcnMsIGFuZCB3ZSBzaG91bGQgcmVhZCB0aGUgYWRkcmVzcyB1c2luZyBvbmUKKyAgIHBvaW50ZXIgYW5kIHN0b3JlIGl0IGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBvdGhlcgorICAgcG9pbnRlci4gIEJ1aWx0aW4gZml4dXBzIGNvbWUgaW50byBwbGF5IHdoZW4gd2UgaGF2ZSBkdXBsaWNhdGUKKyAgIF9fR09UX18gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUuICBUaGUgYnVpbHRpbiBmaXh1cCB3aWxsIGNvcHkKKyAgIHRoZSBHT1QgcG9pbnRlciBmcm9tIG9uZSBvdmVyIGludG8gdGhlIG90aGVyLiAgKi8KKworc3RydWN0IGZpeHVwCit7CisgIHN0cnVjdCBmaXh1cCAqbmV4dDsKKyAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgYmZkX3ZtYSB2YWx1ZTsKKworICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBqdW1wIGluc3RydWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQsCisgICAgIHplcm8gaWYgdGhpcyBpcyBqdXN0IGEgcG9pbnRlciAqLworICBjaGFyIGp1bXA7CisKKyAgY2hhciBidWlsdGluOworfTsKKworLyogV2UgZG9uJ3QgbmVlZCBhIHNwZWNpYWwgaGFzaCB0YWJsZSBlbnRyeSBzdHJ1Y3R1cmUsIGJ1dCB3ZSBkbyBuZWVkCisgICB0byBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYmV0d2VlbiBsaW5rZXIgcGFzc2VzLCBzbyB3ZSB1c2UgYSBzcGVjaWFsCisgICBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgcm9vdDsKK307CisKK3N0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlIHJvb3Q7CisKKyAgLyogRmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gbGluay4gICovCisgIGJmZCAqZHlub2JqOworCisgIC8qIE51bWJlciBvZiBmaXh1cHMuICAqLworICBzaXplX3QgZml4dXBfY291bnQ7CisKKyAgLyogTnVtYmVyIG9mIGJ1aWx0aW4gZml4dXBzLiAgKi8KKyAgc2l6ZV90IGxvY2FsX2J1aWx0aW5zOworCisgIC8qIExpc3Qgb2YgZml4dXBzLiAgKi8KKyAgc3RydWN0IGZpeHVwICpmaXh1cF9saXN0OworfTsKKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbGludXhfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHN0cnVjdCBmaXh1cCAqbmV3X2ZpeHVwCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKiwKKyAgICAgICAgICBiZmRfdm1hLCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIGxpbnV4X2FkZF9vbmVfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAorICAgICAgICAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKKyAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOworc3RhdGljIGJvb2xlYW4gbGludXhfdGFsbHlfc3ltYm9scworICBQQVJBTVMgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gbGludXhfZmluaXNoX2R5bmFtaWNfbGluaworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK2xpbnV4X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQorICAgICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICopCisgICAgICAgIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgbG9jYWwgZmllbGRzOyB0aGVyZSBhcmVuJ3QgYW55LiAgKi8KKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBDcmVhdGUgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgorbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICpyZXQ7CisKKyAgcmV0ID0gKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopCisgICAgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlKSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOworICBpZiAoISBOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpICgmcmV0LT5yb290LCBhYmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBmcmVlIChyZXQpOworICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOworICAgIH0KKworICByZXQtPmR5bm9iaiA9IE5VTEw7CisgIHJldC0+Zml4dXBfY291bnQgPSAwOworICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKKyAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKKworICByZXR1cm4gJnJldC0+cm9vdC5yb290OworfQorCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCisgICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCisgICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZvbGxvdykpKQorCisvKiBUcmF2ZXJzZSBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgbGludXhfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKSAgICAgICAgICAgICAgICAgICAgXAorICAoYW91dF9saW5rX2hhc2hfdHJhdmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoJih0YWJsZSktPnJvb3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksIFwKKyAgICAoaW5mbykpKQorCisvKiBHZXQgdGhlIExpbnV4IGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKKyAgIGp1c3QgYSBjYXN0LiAgKi8KKworI2RlZmluZSBsaW51eF9oYXNoX3RhYmxlKHApICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKKworLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBmaXh1cC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZml4dXAgKgorbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgYnVpbHRpbikKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGludCBidWlsdGluOworeworICBzdHJ1Y3QgZml4dXAgKmY7CisKKyAgZiA9IChzdHJ1Y3QgZml4dXAgKikgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZml4dXApKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gZjsKKyAgZi0+bmV4dCA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OworICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdCA9IGY7CisgIGYtPmggPSBoOworICBmLT52YWx1ZSA9IHZhbHVlOworICBmLT5idWlsdGluID0gYnVpbHRpbjsKKyAgZi0+anVtcCA9IDA7CisgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OworICByZXR1cm4gZjsKK30KKworLyogV2UgY29tZSBoZXJlIG9uY2Ugd2UgcmVhbGl6ZSB0aGF0IHdlIGFyZSBnb2luZyB0byBsaW5rIHRvIGEgc2hhcmVkCisgICBsaWJyYXJ5LiAgV2UgbmVlZCB0byBjcmVhdGUgYSBzcGVjaWFsIHNlY3Rpb24gdGhhdCBjb250YWlucyB0aGUKKyAgIGZpeHVwIHRhYmxlLCBhbmQgd2UgdWx0aW1hdGVseSBuZWVkIHRvIGFkZCBhIHBvaW50ZXIgdG8gdGhpcyBpbnRvCisgICB0aGUgc2V0IHZlY3RvciBmb3IgU0hBUkFCTEVfQ09ORkxJQ1RTLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QKKyAgIGtub3cgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGJ1dCB0aGF0J3MgT0sgLSB3ZSBqdXN0IG5lZWQgdG8KKyAgIGNyZWF0ZSBpdCBmb3Igbm93LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGZsYWd3b3JkIGZsYWdzOworICByZWdpc3RlciBhc2VjdGlvbiAqczsKKworICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcuICAqLworICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7CisKKyAgLyogV2UgY2hvb3NlIHRvIHVzZSB0aGUgbmFtZSAiLmxpbnV4LWR5bmFtaWMiIGZvciB0aGUgZml4dXAgdGFibGUuCisgICAgIFdoeSBub3Q/ICovCisgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmxpbnV4LWR5bmFtaWMiKTsKKyAgaWYgKHMgPT0gTlVMTAorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHMtPl9yYXdfc2l6ZSA9IDA7CisgIHMtPmNvbnRlbnRzID0gMDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCisgICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCisgICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2xpbnV4X2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBmbGFnd29yZCBmbGFnczsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgYm9vbGVhbiBjb3B5OworICAgICBib29sZWFuIGNvbGxlY3Q7CisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Cit7CisgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7CisgIGJvb2xlYW4gaW5zZXJ0OworCisgIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCisgICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKKyAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCisKKyAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KKyAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKKyAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KKworICBpbnNlcnQgPSBmYWxzZTsKKworICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAorICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKKyAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAorICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQorICAgIHsKKyAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQorICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOworICAgICAgaW5zZXJ0ID0gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKKyAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKKyAgICB7CisgICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGlmIChoICE9IE5VTEwKKyAgICAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKyAgICAgICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQorICAgICAgIHsKKyAgICAgICAgIHN0cnVjdCBmaXh1cCAqZjsKKworICAgICAgICAgaWYgKGhhc2hwICE9IE5VTEwpCisgICAgICAgICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOworCisgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7CisgICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7CisKKyAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgIH0KKyAgICB9CisKKyAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KKyAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNocCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEluc2VydCBhIHBvaW50ZXIgdG8gb3VyIHRhYmxlIGluIHRoZSBzZXQgdmVjdG9yLiAgVGhlIGR5bmFtaWMKKyAgICAgbGlua2VyIHJlcXVpcmVzIHRoaXMgaW5mb3JtYXRpb24gKi8KKyAgaWYgKGluc2VydCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKworICAgICAgLyogSGVyZSB3ZSBkbyBvdXIgc3BlY2lhbCB0aGluZyB0byBhZGQgdGhlIHBvaW50ZXIgdG8gdGhlCisgICAgICAgIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGUgU0hBUkFCTEVfQ09ORkxJQ1RTIHNldCB2ZWN0b3IuICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisgICAgICAgICAgICAoaW5mbywgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgU0hBUkFCTEVfQ09ORkxJQ1RTLAorICAgICAgICAgICAgIEJTRl9HTE9CQUwgfCBCU0ZfQ09OU1RSVUNUT1IsIHMsIDAsIE5VTEwsIGZhbHNlLCBmYWxzZSwgTlVMTCkpKQorICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdlIHdpbGwgY3Jhd2wgdGhlIGhhc2ggdGFibGUgYW5kIGNvbWUgaGVyZSBmb3IgZXZlcnkgZ2xvYmFsIHN5bWJvbC4KKyAgIFdlIHdpbGwgZXhhbWluZSBlYWNoIGVudHJ5IGFuZCBzZWUgaWYgdGhlcmUgYXJlIGluZGljYXRpb25zIHRoYXQgd2UKKyAgIG5lZWQgdG8gYWRkIGEgZml4dXAuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNhc2VzIC0gb25lIGlzIHdoZXJlCisgICB5b3UgaGF2ZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgb2YgUExUIG9yIEdPVCBzeW1ib2xzIC0gdGhlc2Ugd2lsbAorICAgaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0IGFuZCBhZGRlZCBhcyAiYnVpbHRpbiIgZml4dXBzLiAgSWYgd2UgZmluZAorICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBub24gUExUL0dPVCBzeW1ib2wgaXMgYWxzbyBwcmVzZW50LCB3ZQorICAgY29udmVydCBpdCB0byBhIHJlZ3VsYXIgZml4dXAgaW5zdGVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitsaW51eF90YWxseV9zeW1ib2xzIChoLCBkYXRhKQorICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8gPSAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgZGF0YTsKKyAgc3RydWN0IGZpeHVwICpmLCAqZjE7CisgIGludCBpc19wbHQ7CisgIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmgxLCAqaDI7CisgIGJvb2xlYW4gZXhpc3RzOworCisgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBORUVEU19TSFJMSUIsCisgICAgICAgICAgICAgICAgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBjaGFyICpwOworICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOworCisgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7CisgICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKKyAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7CisKKyAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKKyAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgc3RyY3B5IChhbGxvYywgbmFtZSk7CisgICAgICAgICBwID0gc3RycmNociAoYWxsb2MsICdfJyk7CisgICAgICAgICAqcCsrID0gJ1wwJzsKKyAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorICAgICAgICAgICAoXygiT3V0cHV0IGZpbGUgcmVxdWlyZXMgc2hhcmVkIGxpYnJhcnkgYCVzLnNvLiVzJ1xuIiksCisgICAgICAgICAgICBhbGxvYywgcCk7CisgICAgICAgICBmcmVlIChhbGxvYyk7CisgICAgICAgfQorCisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGEgUExUL0dPVCwgd2UgZG8gbm90IGV2ZW4gbmVlZCB0byBsb29rIGF0CisgICAgIGl0LiAgKi8KKyAgaXNfcGx0ID0gSVNfUExUX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKKworICBpZiAoaXNfcGx0IHx8IElTX0dPVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZykpCisgICAgeworICAgICAgLyogTG9vayB1cCB0aGlzIHN5bWJvbCB0d2ljZS4gIE9uY2UganVzdCBhcyBhIHJlZ3VsYXIgbG9va3VwLAorICAgICAgICBhbmQgdGhlbiBhZ2FpbiBmb2xsb3dpbmcgYWxsIG9mIHRoZSBpbmRpcmVjdCBsaW5rcyB1bnRpbCB3ZQorICAgICAgICByZWFjaCBhIHJlYWwgc3ltYm9sLiAgKi8KKyAgICAgIGgxID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAvKiBoMiBkb2VzIG5vdCBmb2xsb3cgaW5kaXJlY3Qgc3ltYm9scy4gKi8KKyAgICAgIGgyID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAorICAgICAgICB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKKyAgICAgICAgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCisgICAgICAgIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQorICAgICAgICBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKKyAgICAgICAgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLworICAgICAgaWYgKGgxICE9IE5VTEwKKyAgICAgICAgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKyAgICAgICAgICAgICAgIHx8IGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisgICAgICAgICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoMS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQorICAgICAgICAgICAgIHx8IGgyLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KSkKKyAgICAgICB7CisgICAgICAgICAvKiBTZWUgaWYgdGhlcmUgaXMgYSAiYnVpbHRpbiIgZml4dXAgYWxyZWFkeSBwcmVzZW50CisgICAgICAgICAgICBpbnZvbHZpbmcgdGhpcyBzeW1ib2wuICBJZiBzbywgY29udmVydCBpdCB0byBhIHJlZ3VsYXIKKyAgICAgICAgICAgIGZpeHVwLiAgSW4gdGhlIGVuZCwgdGhpcyByZWxheGVzIHNvbWUgb2YgdGhlIHJlcXVpcmVtZW50cworICAgICAgICAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHBlcmZvcm1pbmcgZml4dXBzLiAgKi8KKyAgICAgICAgIGV4aXN0cyA9IGZhbHNlOworICAgICAgICAgZm9yIChmMSA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OworICAgICAgICAgICAgICBmMSAhPSBOVUxMOworICAgICAgICAgICAgICBmMSA9IGYxLT5uZXh0KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKChmMS0+aCAhPSBoICYmIGYxLT5oICE9IGgxKQorICAgICAgICAgICAgICAgICB8fCAoISBmMS0+YnVpbHRpbiAmJiAhIGYxLT5qdW1wKSkKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIGlmIChmMS0+aCA9PSBoMSkKKyAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICBpZiAoISBleGlzdHMKKyAgICAgICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgZi0+anVtcCA9IGlzX3BsdDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBmMS0+aCA9IGgxOworICAgICAgICAgICAgIGYxLT5qdW1wID0gaXNfcGx0OworICAgICAgICAgICAgIGYxLT5idWlsdGluID0gMDsKKyAgICAgICAgICAgICBleGlzdHMgPSB0cnVlOworICAgICAgICAgICB9CisgICAgICAgICBpZiAoISBleGlzdHMKKyAgICAgICAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBoLT5yb290LnJvb3QudS5kZWYudmFsdWUsIDApOworICAgICAgICAgICAgIGlmIChmID09IE5VTEwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KKyAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZi0+anVtcCA9IGlzX3BsdDsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQorICAgICAgICBzeW10YWIuICovCisgICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCisgICAgICAgaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KKyAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgorICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93CisgICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCisgICBhcmUgcmVxdWlyZWQuICAqLworCitib29sZWFuCitiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIHN0cnVjdCBmaXh1cCAqZjsKKyAgYXNlY3Rpb24gKnM7CisKKyAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogRmlyc3QgZmluZCB0aGUgZml4dXBzLi4uICovCisgIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF90YWxseV9zeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBUUikgaW5mbyk7CisKKyAgLyogSWYgdGhlcmUgYXJlIGJ1aWx0aW4gZml4dXBzLCBsZWF2ZSByb29tIGZvciBhIG1hcmtlci4gIFRoaXMgaXMKKyAgICAgdXNlZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgc28gdGhhdCBpdCBrbm93cyB0aGF0IGFsbCB0aGF0IGZvbGxvdworICAgICBhcmUgYnVpbHRpbiBmaXh1cHMgaW5zdGVhZCBvZiByZWd1bGFyIGZpeHVwcy4gICovCisgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChmLT5idWlsdGluKQorICAgICAgIHsKKyAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50OworICAgICAgICAgKytsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnM7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgfQorCisgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IDApCisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBmaXh1cCB0YWJsZS4gIFdlIHdpbGwgZmlsbCBpdCBpbiBsYXRlci4gICovCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOworICBpZiAocyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OworICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCisgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KKyAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCisgICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCisKK3N0YXRpYyBib29sZWFuCitsaW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7CisgIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKKyAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgc3RydWN0IGZpeHVwICpmOworICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7CisgIGludCBzZWN0aW9uX29mZnNldDsKKyAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOworCisgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5saW51eC1keW5hbWljIik7CisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgIG9zID0gcy0+b3V0cHV0X3NlY3Rpb247CisgIGZpeHVwc193cml0dGVuID0gMDsKKworI2lmZGVmIExJTlVYX0xJTktfREVCVUcKKyAgcHJpbnRmICgiRml4dXAgdGFibGUgZmlsZSBvZmZzZXQ6ICV4ICBWTUE6ICV4XG4iLAorICAgICAgICAgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAorICAgICAgICAgb3MtPnZtYSArIHMtPm91dHB1dF9vZmZzZXQpOworI2VuZGlmCisKKyAgZml4dXBfdGFibGUgPSBzLT5jb250ZW50czsKKyAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50LCBmaXh1cF90YWJsZSk7CisgIGZpeHVwX3RhYmxlICs9IDQ7CisKKyAgLyogRmlsbCBpbiBmaXh1cCB0YWJsZS4gICovCisgIGZvciAoZiA9IGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChmLT5idWlsdGluKQorICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisgICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCisgICAgICAgeworICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisgICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCisgICAgICAgICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOworICAgICAgICAgY29udGludWU7CisgICAgICAgfQorCisgICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OworICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKKworI2lmZGVmIExJTlVYX0xJTktfREVCVUcKKyAgICAgIHByaW50ZiAoIkZpeHVwKCVkKSAlczogJXggJXhcbiIsZi0+anVtcCwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKKyAgICAgICAgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOworI2VuZGlmCisKKyAgICAgIGlmIChmLT5qdW1wKQorICAgICAgIHsKKyAgICAgICAgIC8qIFJlbGF0aXZlIGFkZHJlc3MgKi8KKyAgICAgICAgIG5ld19hZGRyID0gbmV3X2FkZHIgLSAoZi0+dmFsdWUgKyA1KTsKKwkgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKKyAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDEsIGZpeHVwX3RhYmxlKTsKKyAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICAgfQorICAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7CisgICAgICAgICBmaXh1cF90YWJsZSArPSA0OworICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKKyAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICAgfQorICAgICAgKytmaXh1cHNfd3JpdHRlbjsKKyAgICB9CisKKyAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQorICAgIHsKKyAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7CisgICAgICBmaXh1cF90YWJsZSArPSA0OworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOworICAgICAgZml4dXBfdGFibGUgKz0gNDsKKyAgICAgICsrZml4dXBzX3dyaXR0ZW47CisgICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKKyAgICAgICB7CisgICAgICAgICBpZiAoISBmLT5idWlsdGluKQorICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgICAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorICAgICAgICAgICAgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKKyAgICAgICAgICAgICAgICBmLT5oLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOworICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICB9CisKKyAgICAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7CisgICAgICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OworCisjaWZkZWYgTElOVVhfTElOS19ERUJVRworICAgICAgICAgcHJpbnRmICgiRml4dXAoQikgJXM6ICV4ICV4XG4iLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAorICAgICAgICAgICAgICAgICBuZXdfYWRkciwgZi0+dmFsdWUpOworI2VuZGlmCisKKyAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7CisgICAgICAgICBmaXh1cF90YWJsZSArPSA0OworICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKKyAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICAgICArK2ZpeHVwc193cml0dGVuOworICAgICAgIH0KKyAgfQorCisgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOworICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQorICAgICAgIHsKKyAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKKyAgICAgICAgIGZpeHVwX3RhYmxlICs9IDQ7CisgICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7CisgICAgICAgICBmaXh1cF90YWJsZSArPSA0OworICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKKyAgICAgICB9CisgICAgfQorCisgIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCisgIGlmIChoICE9IE5VTEwKKyAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKyAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCisgICAgeworICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKKyAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7CisKKyNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCisgICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7CisjZW5kaWYKKworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKKyAgICB9CisgIGVsc2UKKyAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7CisKKyAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQorICAgICAgIT0gcy0+X3Jhd19zaXplKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCisjZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluaworCisjZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvc3BhcmNseW54LmMgYi9iZmQvc3BhcmNseW54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmY2FlNQotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9zcGFyY2x5bnguYwpAQCAtMCwwICsxLDI2NiBAQAorLyogQkZEIHN1cHBvcnQgZm9yIFNwYXJjIGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmIDAKKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CisjZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCisKKyNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKKyNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA0MDk2CisjZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCisjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9zcGFyYworCisjZW5kaWYKKworI2RlZmluZSBNWShPUCkgQ0FUKHNwYXJjbHlueF9hb3V0XyxPUCkKKyNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtc3BhcmMtbHlueCIKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorCisjaW5jbHVkZSAiYW91dC9zdW40LmgiCisjaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorCisvKiBUaGlzIGlzIG5lZWRlZCB0byByZWplY3QgYSBOZXdzT1MgZmlsZSwgZS5nLiBpbgorICAgZ2RiL3Rlc3RzdWl0ZS9nZGIudDEwL2Nyb3NzbG9hZC5leHAuIDxraW5nZG9uQGN5Z251cy5jb20+CisgICBJIG5lZWRlZCB0byBhZGQgTV9VTktOT1dOIHRvIHJlY29nbml6ZSBhIDY4MDAwIG9iamVjdCwgc28gdGhpcyB3aWxsCisgICBwcm9iYWJseSBubyBsb25nZXIgcmVqZWN0IGEgTmV3c09TIG9iamVjdC4gIDxpYW5AY3lnbnVzLmNvbT4uICovCisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNX1VOS05PV04gXAorCQkJICAgIHx8IChtdHlwZSkgPT0gTV82ODAxMCBcCisJCQkgICAgfHwgKG10eXBlKSA9PSBNXzY4MDIwIFwKKwkJCSAgICB8fCAobXR5cGUpID09IE1fU1BBUkMpCisKKy8qCitUaGUgZmlsZSBAY29kZXthb3V0ZjEuaH0gY29udGFpbnMgdGhlIGNvZGUgZm9yIEJGRCdzCithLm91dCBiYWNrIGVuZC4gQ29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgYmFjayBlbmQgaXMgZ2l2ZW4gYnkgdGhlc2UKK3R3byBwcmVwcm9jZXNzb3IgbmFtZXM6CitAdGFibGUgQGNvZGUKK0BpdGVtIEFSQ0hfU0laRQorVGhpcyB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIDMyIG9yIDY0LCBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiBhbgoraW50IGluIHRoZSB0YXJnZXQgZm9ybWF0LiBJdCBjaGFuZ2VzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0cyB3aGljaAorcGVyZm9ybSB0aGUgbWVtb3J5L2Rpc2sgbWFwcGluZyBvZiBzdHJ1Y3R1cmVzLgorCitUaGUgNjQgYml0IGJhY2tlbmQgbWF5IG9ubHkgYmUgdXNlZCBpZiB0aGUgaG9zdCBjb21waWxlciBzdXBwb3J0cyA2NAoraW50cyAoZWcgbG9uZyBsb25nIHdpdGggZ2NjKSwgYnkgZGVmaW5pbmcgdGhlIG5hbWUgQGNvZGV7QkZEX0hPU1RfNjRfQklUfSBpbiBAY29kZXtiZmQuaH0uCitXaXRoIHRoaXMgbmFtZSBkZWZpbmVkLCBAZW1waHthbGx9IGJmZCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgd2l0aCA2NGJpdAorYXJpdGhtZXRpYywgbm90IGp1c3QgdGhvc2UgdG8gYSA2NGJpdCB0YXJnZXQuCisKK0BpdGVtIFRBUkdFVE5BTUUKK1RoZSBuYW1lIHB1dCBpbnRvIHRoZSB0YXJnZXQgdmVjdG9yLgorQGl0ZW0KK0BlbmQgdGFibGUKKworKi8KKworLypTVVBQUkVTUzU1OCovCisvKlNVUFBSRVNTNTI5Ki8KKwordm9pZAorTkFNRShseW54LHNldF9hcmNoX21hY2gpIChhYmZkLCBtYWNodHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgbWFjaHR5cGU7Cit7CisgIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KKyAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgIGxvbmcgbWFjaGluZTsKKyAgc3dpdGNoIChtYWNodHlwZSkKKyAgICB7CisKKyAgICBjYXNlIE1fVU5LTk9XTjoKKyAgICAgIC8qIFNvbWUgU3VuM3MgbWFrZSBtYWdpYyBudW1iZXJzIHdpdGhvdXQgY3B1IHR5cGVzIGluIHRoZW0sIHNvCisJIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIDY4MDAwLiAqLworICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fNjgwMTA6CisgICAgY2FzZSBNX0hQMjAwOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDEwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fNjgwMjA6CisgICAgY2FzZSBNX0hQMzAwOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gYmZkX21hY2hfbTY4MDIwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU1BBUkM6CisgICAgICBhcmNoID0gYmZkX2FyY2hfc3BhcmM7CisgICAgICBtYWNoaW5lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNXzM4NjoKKyAgICBjYXNlIE1fMzg2X0RZTklYOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX2kzODY7CisgICAgICBtYWNoaW5lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNXzI5SzoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9IUFVYOgorICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7CisgICAgICBtYWNoaW5lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFyY2ggPSBiZmRfYXJjaF9vYnNjdXJlOworICAgICAgbWFjaGluZSA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKK30KKworI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKKyAgTkFNRShseW54LHNldF9hcmNoX21hY2gpKEFCRkQsIE5fTUFDSFRZUEUgKEVYRUMpKTsgXAorICBjaG9vc2VfcmVsb2Nfc2l6ZShBQkZEKTsKKworLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSwgYmFzZWQgb24gdGhlIGFyY2hpdGVjdHVyZSAqLworc3RhdGljIHZvaWQKK2Nob29zZV9yZWxvY19zaXplIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKKyAgICBjYXNlIGJmZF9hcmNoX2EyOWs6CisgICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gTHlueE9TIGZvcm1hdC4KKyAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCisgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKKyAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOworCisgIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCisJeworCWNhc2UgYmZkX21hY2hfbTY4MDEwOgorCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAxMCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgYmZkX21hY2hfbTY4MDIwOgorCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV82ODAyMCk7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgorICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2kzODY6CisgICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzM4Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9hcmNoX2EyOWs6CisgICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzI5Syk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9VTktOT1dOKTsKKyAgICB9CisKKyAgY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpOworCisgIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOworCisgIFdSSVRFX0hFQURFUlMgKGFiZmQsIGV4ZWNwKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBNWV9zZXRfc2l6ZXMgc3BhcmNseW54X3NldF9zaXplcworc3RhdGljIGJvb2xlYW4KK3NwYXJjbHlueF9zZXRfc2l6ZXMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6CisgICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOworICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDsKKyAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOworICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDA7CisgICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCitzdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHNwYXJjbHlueF9hb3V0X2JhY2tlbmQgPQoreworICAwLCAxLCAwLCAxLCAwLCBzcGFyY2x5bnhfc2V0X3NpemVzLCAwLAorICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCisgIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCisgIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KKyAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KKyAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLworICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KK307CisMCisKKyNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCisjZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKKyNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZQlcCisJCQkodm9pZCAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAorCisjZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cwlOQU1FKGFvdXQsc3BhcmNseW54X3dyaXRlX29iamVjdF9jb250ZW50cykKKyNkZWZpbmUgTVlfYmFja2VuZF9kYXRhCQkJJnNwYXJjbHlueF9hb3V0X2JhY2tlbmQKKworI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCisKKyNpZmRlZiBMWU5YX0NPUkUKKworY2hhciAqbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kICgpOworaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsICgpOworYm9vbGVhbiBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoKTsKK2NvbnN0IGJmZF90YXJnZXQgKmx5bnhfY29yZV9maWxlX3AgKCk7CisKKyNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKKyNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCisjZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAorI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCisKKyNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KKworI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvc3BhcmNuZXRic2QuYyBiL2JmZC9zcGFyY25ldGJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzdiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc3BhcmNuZXRic2QuYwpAQCAtMCwwICsxLDM0IEBACisvKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9zcGFyYyBhLm91dC1pc2ggYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAorI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCisKKy8qIFNQQVJDIGNoaXBzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCisgICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gZWl0aGVyIG9uZS4gKi8KKyNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDIwMDAKKworI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfc3BhcmMKKyNkZWZpbmUgREVGQVVMVF9NSUQgCU1fU1BBUkNfTkVUQlNECisKKyNkZWZpbmUgTVkoT1ApIENBVChzcGFyY25ldGJzZF8sT1ApCisvKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLworI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1uZXRic2QiCisKKyNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcmVjLmMgYi9iZmQvc3JlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZDJmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc3JlYy5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLyogQkZEIGJhY2stZW5kIGZvciBzLXJlY29yZCBvYmplY3RzLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKK1NVQlNFQ1RJT04KKwlTLVJlY29yZCBoYW5kbGluZworCitERVNDUklQVElPTgorCQorCU9yZGluYXJ5IFMtUmVjb3JkcyBjYW5ub3QgaG9sZCBhbnl0aGluZyBidXQgYWRkcmVzc2VzIGFuZAorCWRhdGEsIHNvIHRoYXQncyBhbGwgdGhhdCB3ZSBpbXBsZW1lbnQuCisKKwlUaGUgb25seSBpbnRlcmVzdGluZyB0aGluZyBpcyB0aGF0IFMtUmVjb3JkcyBtYXkgY29tZSBvdXQgb2YKKwlvcmRlciBhbmQgdGhlcmUgaXMgbm8gaGVhZGVyLCBzbyBhbiBpbml0aWFsIHNjYW4gaXMgcmVxdWlyZWQKKwl0byBkaXNjb3ZlciB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhZGRyZXNzZXMgdXNlZCB0byBjcmVhdGUKKwl0aGUgdm1hIGFuZCBzaXplIG9mIHRoZSBvbmx5IHNlY3Rpb24gd2UgY3JlYXRlLiAgV2UKKwlhcmJpdHJhcmlseSBjYWxsIHRoaXMgc2VjdGlvbiAiLnRleHQiLgorCisJV2hlbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgaXMgY2FsbGVkIHRoZSBmaWxlIGlzIHJlYWQKKwlhZ2FpbiwgYW5kIHRoaXMgdGltZSB0aGUgZGF0YSBpcyBwbGFjZWQgaW50byBhIGJmZF9hbGxvYydkCisJYXJlYS4KKworCUFueSBudW1iZXIgb2Ygc2VjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgZm9yIG91dHB1dCwgd2Ugc2F2ZSB0aGVtCisJdXAgYW5kIG91dHB1dCB0aGVtIHdoZW4gaXQncyB0aW1lIHRvIGNsb3NlIHRoZSBiZmQuCisKKwlBbiBzIHJlY29yZCBsb29rcyBsaWtlOgorCQorRVhBTVBMRQorCVM8dHlwZT48bGVuZ3RoPjxhZGRyZXNzPjxkYXRhPjxjaGVja3N1bT4KKwkKK0RFU0NSSVBUSU9OCisJV2hlcmUKKwlvIGxlbmd0aAorCWlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHVwdG8gdGhlIGNoZWNrc3VtLiBOb3RlIHRoYXQKKwl0aGlzIGlzIG5vdCB0aGUgbnVtYmVyIG9mIGNoYXJzIGZvbGxvd2luZywgc2luY2UgaXQgdGFrZXMgdHdvCisJY2hhcnMgdG8gcmVwcmVzZW50IGEgYnl0ZS4KKwlvIHR5cGUKKwlpcyBvbmUgb2Y6CisJMCkgaGVhZGVyIHJlY29yZAorCTEpIHR3byBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKKwkyKSB0aHJlZSBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKKwkzKSBmb3VyIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAorCTcpIGZvdXIgYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAorCTgpIHRocmVlIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKKwk5KSB0d28gYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAorCQorCW8gYWRkcmVzcworCWlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIGZvbGxvd2luZywgb3IgaW4gdGhlIGNhc2Ugb2YKKwlhIHRlcm1pbmF0aW9uIHJlY29yZCwgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGltYWdlCisJbyBkYXRhCisJaXMgdGhlIGRhdGEuCisJbyBjaGVja3N1bQorCWlzIHRoZSBzdW0gb2YgYWxsIHRoZSByYXcgYnl0ZSBkYXRhIGluIHRoZSByZWNvcmQsIGZyb20gdGhlIGxlbmd0aAorCXVwd2FyZHMsIG1vZHVsbyAyNTYgYW5kIHN1YnRyYWN0ZWQgZnJvbSAyNTUuCisKKworU1VCU0VDVElPTgorCVN5bWJvbCBTLVJlY29yZCBoYW5kbGluZworCitERVNDUklQVElPTgorCVNvbWUgSUNFIGVxdWlwbWVudCB1bmRlcnN0YW5kcyBhbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKKwlTLVJlY29yZCBmb3JtYXQ7IHN5bWJvbHMgYW5kIHRoZWlyIGFkZHJlc3NlcyBjYW4gYmUgc2VudAorCWJlZm9yZSB0aGUgZGF0YS4KKworCVRoZSBmb3JtYXQgb2YgdGhpcyBpczoKKwkoJCQgPG1vZHVsZW5hbWU+CisJCSg8c3BhY2U+IDxzeW1ib2w+IDxhZGRyZXNzPikqKQorCSQkCisKKwlzbyBhIHNob3J0IHN5bWJvbCB0YWJsZSBjb3VsZCBsb29rIGxpa2U6CisKK0VYQU1QTEUKKwkkJCBmbGFzaC54CisJJCQgZmxhc2guYworCSAgX3BvcnQ2ICQwCisJICBfZGVsYXkgJDQKKwkgIF9zdGFydCAkMTQKKwkgIF9ldGV4dCAkODAzNgorCSAgX2VkYXRhICQ4MDM2CisgCSAgX2VuZCAkODAzNgorCSQkCisKK0RFU0NSSVBUSU9OCisJV2UgYWxsb3cgc3ltYm9scyB0byBiZSBhbnl3aGVyZSBpbiB0aGUgZGF0YSBzdHJlYW0gLSB0aGUgbW9kdWxlIG5hbWVzCisJYXJlIGFsd2F5cyBpZ25vcmVkLgorCQkKKyovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdGF0aWMgdm9pZCBzcmVjX2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7CitzdGF0aWMgdm9pZCBzcmVjX3ByaW50X3N5bWJvbAorIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7CitzdGF0aWMgdm9pZCBzcmVjX2luaXQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGJvb2xlYW4gc3JlY19ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBzcmVjX2dldF9ieXRlIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuICopKTsKK3N0YXRpYyB2b2lkIHNyZWNfYmFkX2J5dGUgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgaW50LCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzcmVjX3NjYW4gUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpzcmVjX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3ltYm9sc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gc3JlY19yZWFkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICopKTsKKworc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9yZWNvcmQgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSwKKwkJCQkJICBjb25zdCBiZmRfYnl0ZSAqLAorCQkJCQkgIGNvbnN0IGJmZF9ieXRlICopKTsKK3N0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHNyZWNfbmV3X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CitzdGF0aWMgYm9vbGVhbiBzcmVjX3NldF9hcmNoX21hY2gKKyAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOworc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cworICBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOworc3RhdGljIGJvb2xlYW4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICosIGludCkpOworc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgaW50IHNyZWNfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKK3N0YXRpYyBhc3ltYm9sICpzcmVjX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBsb25nIHNyZWNfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworCisvKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KKworc3RhdGljIENPTlNUIGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisjZGVmaW5lIE5JQkJMRSh4KSBoZXhfdmFsdWUoeCkKKyNkZWZpbmUgSEVYKGJ1ZmZlcikgKChOSUJCTEUoKGJ1ZmZlcilbMF0pPDw0KSArIE5JQkJMRSgoYnVmZmVyKVsxXSkpCisjZGVmaW5lIFRPSEVYKGQsIHgsIGNoKSBcCisJZFsxXSA9IGRpZ3NbKHgpICYgMHhmXTsgXAorCWRbMF0gPSBkaWdzWygoeCk+PjQpJjB4Zl07IFwKKwljaCArPSAoKHgpICYgMHhmZik7CisjZGVmaW5lCUlTSEVYKHgpICBoZXhfcCh4KQorCisvKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAqLworCitzdGF0aWMgdm9pZAorc3JlY19pbml0ICgpCit7CisgIHN0YXRpYyBib29sZWFuIGluaXRlZCA9IGZhbHNlOworCisgIGlmIChpbml0ZWQgPT0gZmFsc2UpCisgICAgeworICAgICAgaW5pdGVkID0gdHJ1ZTsKKyAgICAgIGhleF9pbml0ICgpOworICAgIH0KK30KKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9uIGEgbGluZSBpcyBGRiAqLworI2RlZmluZSBNQVhDSFVOSyAweGZmCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGZpdCBvbnRvIGEgbGluZSBvbiBvdXRwdXQgKi8KKyNkZWZpbmUgQ0hVTksgMjEKKworLyogV2hlbiB3cml0aW5nIGFuIFMtcmVjb3JkIGZpbGUsIHRoZSBTLXJlY29yZHMgY2FuIG5vdCBiZSBvdXRwdXQgYXMKKyAgIHRoZXkgYXJlIHNlZW4uICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlbSBpbiBtZW1vcnkuICAqLworCitzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0Cit7CisgIHN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3QgKm5leHQ7CisgIGJmZF9ieXRlICpkYXRhOworICBiZmRfdm1hIHdoZXJlOworICBiZmRfc2l6ZV90eXBlIHNpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfbGlzdF9zdHJ1Y3Qgc3JlY19kYXRhX2xpc3RfdHlwZTsKKworLyogV2hlbiBzY2FubmluZyB0aGUgUy1yZWNvcmQgZmlsZSwgYSBsaW5rZWQgbGlzdCBvZiBzcmVjX3N5bWJvbAorICAgc3RydWN0dXJlcyBpcyBidWlsdCB0byByZXByZXNlbnQgdGhlIHN5bWJvbCB0YWJsZSAoaWYgdGhlcmUgaXMKKyAgIG9uZSkuICAqLworCitzdHJ1Y3Qgc3JlY19zeW1ib2wKK3sKKyAgc3RydWN0IHNyZWNfc3ltYm9sICpuZXh0OworICBjb25zdCBjaGFyICpuYW1lOworICBiZmRfdm1hIHZhbDsKK307CisKKy8qIFRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QKKyAgeworICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmhlYWQ7CisgICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqdGFpbDsKKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsKKyAgICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKnN5bWJvbHM7CisgICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW10YWlsOworICAgIGFzeW1ib2wgKmNzeW1ib2xzOworICB9Cit0ZGF0YV90eXBlOworCitzdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIHRkYXRhX3R5cGUgKiwKKwkJCQkJICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX3Rlcm1pbmF0b3IgUEFSQU1TICgoYmZkICosIHRkYXRhX3R5cGUgKikpOworCisvKiBTZXQgdXAgdGhlIFMtcmVjb3JkIHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NyZWNfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3JlY19pbml0ICgpOworCisgIGlmIChhYmZkLT50ZGF0YS5zcmVjX2RhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7CisgICAgICBpZiAodGRhdGEgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEgPSB0ZGF0YTsKKyAgICAgIHRkYXRhLT50eXBlID0gMTsKKyAgICAgIHRkYXRhLT5oZWFkID0gTlVMTDsKKyAgICAgIHRkYXRhLT50YWlsID0gTlVMTDsKKyAgICAgIHRkYXRhLT5zeW1ib2xzID0gTlVMTDsKKyAgICAgIHRkYXRhLT5zeW10YWlsID0gTlVMTDsKKyAgICAgIHRkYXRhLT5jc3ltYm9scyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWFkIGEgYnl0ZSBmcm9tIGFuIFMgcmVjb3JkIGZpbGUuICBTZXQgKkVSUk9SUFRSIGlmIGFuIGVycm9yCisgICBvY2N1cnJlZC4gIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLworCitzdGF0aWMgaW50CitzcmVjX2dldF9ieXRlIChhYmZkLCBlcnJvcnB0cikKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuICplcnJvcnB0cjsKK3sKKyAgYmZkX2J5dGUgYzsKKworICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKKwkqZXJyb3JwdHIgPSB0cnVlOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisKKyAgcmV0dXJuIChpbnQpIChjICYgMHhmZik7Cit9CisKKy8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gUyByZWNvcmQgZmlsZS4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHNob3VsZAorICAgbm90IGNhbGwgZnByaW50ZiwgYnV0IHdlIHJlYWxseSBkbyBuZWVkIHNvbWUgbWVjaGFuaXNtIGZvciBwcmludGluZworICAgZXJyb3IgbWVzc2FnZXMuICAqLworCitzdGF0aWMgdm9pZAorc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcikKKyAgICAgYmZkICphYmZkOworICAgICB1bnNpZ25lZCBpbnQgbGluZW5vOworICAgICBpbnQgYzsKKyAgICAgYm9vbGVhbiBlcnJvcjsKK3sKKyAgaWYgKGMgPT0gRU9GKQorICAgIHsKKyAgICAgIGlmICghIGVycm9yKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbMTBdOworCisgICAgICBpZiAoISBpc3ByaW50IChjKSkKKwlzcHJpbnRmIChidWYsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjKTsKKyAgICAgIGVsc2UKKwl7CisJICBidWZbMF0gPSBjOworCSAgYnVmWzFdID0gJ1wwJzsKKwl9CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkoXygiJXM6JWQ6IFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGAlcycgaW4gUy1yZWNvcmQgZmlsZVxuIiksCisJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sIGJ1Zik7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICB9Cit9CisKKy8qIEFkZCBhIG5ldyBzeW1ib2wgZm91bmQgaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzcmVjX25ld19zeW1ib2wgKGFiZmQsIG5hbWUsIHZhbCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgc3RydWN0IHNyZWNfc3ltYm9sICpuOworCisgIG4gPSAoc3RydWN0IHNyZWNfc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3JlY19zeW1ib2wpKTsKKyAgaWYgKG4gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbi0+bmFtZSA9IG5hbWU7CisgIG4tPnZhbCA9IHZhbDsKKworICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzID09IE5VTEwpCisgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5zeW1ib2xzID0gbjsKKyAgZWxzZQorICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltdGFpbC0+bmV4dCA9IG47CisgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltdGFpbCA9IG47CisgIG4tPm5leHQgPSBOVUxMOworCisgICsrYWJmZC0+c3ltY291bnQ7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgdGhlIFMgcmVjb3JkIGZpbGUgYW5kIHR1cm4gaXQgaW50byBzZWN0aW9ucy4gIFdlIGNyZWF0ZSBhIG5ldworICAgc2VjdGlvbiBmb3IgZWFjaCBjb250aWd1b3VzIHNldCBvZiBieXRlcy4gICovCisKK3N0YXRpYyBib29sZWFuCitzcmVjX3NjYW4gKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IGM7CisgIHVuc2lnbmVkIGludCBsaW5lbm8gPSAxOworICBib29sZWFuIGVycm9yID0gZmFsc2U7CisgIGJmZF9ieXRlICpidWYgPSBOVUxMOworICBzaXplX3QgYnVmc2l6ZSA9IDA7CisgIGFzZWN0aW9uICpzZWMgPSBOVUxMOworICBjaGFyICpzeW1idWYgPSBOVUxMOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCisgICAgeworICAgICAgLyogV2Ugb25seSBidWlsZCBzZWN0aW9ucyBmcm9tIGNvbnRpZ3VvdXMgUy1yZWNvcmRzLCBzbyBpZiB0aGlzCisgICAgICAgICBpcyBub3QgYW4gUy1yZWNvcmQsIHRoZW4gc3RvcCBidWlsZGluZyBhIHNlY3Rpb24uICAqLworICAgICAgaWYgKGMgIT0gJ1MnICYmIGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpCisJc2VjID0gTlVMTDsKKworICAgICAgc3dpdGNoIChjKQorCXsKKwlkZWZhdWx0OgorCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7CisJICBnb3RvIGVycm9yX3JldHVybjsKKworCWNhc2UgJ1xuJzoKKwkgICsrbGluZW5vOworCSAgYnJlYWs7CisKKwljYXNlICdccic6CisJICBicmVhazsKKworCWNhc2UgJyQnOgorCSAgLyogU3RhcnRpbmcgYSBtb2R1bGUgbmFtZSwgd2hpY2ggd2UgaWdub3JlLiAgKi8KKwkgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9ICdcbicKKwkJICYmIGMgIT0gRU9GKQorCSAgICA7CisJICBpZiAoYyA9PSBFT0YpCisJICAgIHsKKwkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCisJICArK2xpbmVubzsKKworCSAgYnJlYWs7CisKKwljYXNlICcgJzoKKwkgIGRvCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBpbnQgYWxjOworCSAgICAgIGNoYXIgKnAsICpzeW1uYW1lOworCSAgICAgIGJmZF92bWEgc3ltdmFsOworCisJICAgICAgLyogU3RhcnRpbmcgYSBzeW1ib2wgZGVmaW5pdGlvbi4gICovCisJICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCisJCSAgICAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCisJCTsKKworCSAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQorCQlicmVhazsKKworCSAgICAgIGlmIChjID09IEVPRikKKwkJeworCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOworCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkgICAgICBhbGMgPSAxMDsKKwkgICAgICBzeW1idWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChhbGMgKyAxKTsKKwkgICAgICBpZiAoc3ltYnVmID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgICAgcCA9IHN5bWJ1ZjsKKworCSAgICAgICpwKysgPSBjOworCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgorCQkgICAgICYmICEgaXNzcGFjZSAoYykpCisJCXsKKwkJICBpZiAoKHVuc2lnbmVkIGludCkgKHAgLSBzeW1idWYpID49IGFsYykKKwkJICAgIHsKKwkJICAgICAgY2hhciAqbjsKKworCQkgICAgICBhbGMgKj0gMjsKKwkJICAgICAgbiA9IChjaGFyICopIGJmZF9yZWFsbG9jIChzeW1idWYsIGFsYyArIDEpOworCQkgICAgICBpZiAobiA9PSBOVUxMKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCSAgICAgIHAgPSBuICsgKHAgLSBzeW1idWYpOworCQkgICAgICBzeW1idWYgPSBuOworCQkgICAgfQorCisJCSAgKnArKyA9IGM7CisJCX0KKworCSAgICAgIGlmIChjID09IEVPRikKKwkJeworCQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOworCQkgIGdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkgICAgICAqcCsrID0gJ1wwJzsKKwkgICAgICBzeW1uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltYnVmKTsKKwkgICAgICBpZiAoc3ltbmFtZSA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICBzdHJjcHkgKHN5bW5hbWUsIHN5bWJ1Zik7CisJICAgICAgZnJlZSAoc3ltYnVmKTsKKwkgICAgICBzeW1idWYgPSBOVUxMOworCisJICAgICAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GCisJCSAgICAgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykpCisJCTsKKwkgICAgICBpZiAoYyA9PSBFT0YpCisJCXsKKwkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKKwkJICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJICAgICAgLyogU2tpcCBhIGRvbGxhciBzaWduIGJlZm9yZSB0aGUgaGV4IHZhbHVlLiAgKi8KKwkgICAgICBpZiAoYyA9PSAnJCcpCisJCXsKKwkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKKwkJICBpZiAoYyA9PSBFT0YpCisJCSAgICB7CisJCSAgICAgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOworCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICAgIH0KKwkJfQorCisJICAgICAgc3ltdmFsID0gMDsKKwkgICAgICB3aGlsZSAoSVNIRVggKGMpKQorCQl7CisJCSAgc3ltdmFsIDw8PSA0OworCQkgIHN5bXZhbCArPSBOSUJCTEUgKGMpOworCQkgIGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpOworCQl9CisKKwkgICAgICBpZiAoISBzcmVjX25ld19zeW1ib2wgKGFiZmQsIHN5bW5hbWUsIHN5bXZhbCkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB9CisJICB3aGlsZSAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKTsKKworCSAgaWYgKGMgPT0gJ1xuJykKKwkgICAgKytsaW5lbm87CisJICBlbHNlIGlmIChjICE9ICdccicpCisJICAgIHsKKwkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCisJICBicmVhazsKKyAgICAKKwljYXNlICdTJzoKKwkgIHsKKwkgICAgZmlsZV9wdHIgcG9zOworCSAgICBjaGFyIGhkclszXTsKKwkgICAgdW5zaWduZWQgaW50IGJ5dGVzOworCSAgICBiZmRfdm1hIGFkZHJlc3M7CisJICAgIGJmZF9ieXRlICpkYXRhOworCisJICAgIC8qIFN0YXJ0aW5nIGFuIFMtcmVjb3JkLiAgKi8KKworCSAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCkgLSAxOworCisJICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQorCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICAgIGlmICghIElTSEVYIChoZHJbMV0pIHx8ICEgSVNIRVggKGhkclsyXSkpCisJICAgICAgeworCQlpZiAoISBJU0hFWCAoaGRyWzFdKSkKKwkJICBjID0gaGRyWzFdOworCQllbHNlCisJCSAgYyA9IGhkclsyXTsKKwkJc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIH0KKworCSAgICBieXRlcyA9IEhFWCAoaGRyICsgMSk7CisJICAgIGlmIChieXRlcyAqIDIgPiBidWZzaXplKQorCSAgICAgIHsKKwkJaWYgKGJ1ZiAhPSBOVUxMKQorCQkgIGZyZWUgKGJ1Zik7CisJCWJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChieXRlcyAqIDIpOworCQlpZiAoYnVmID09IE5VTEwpCisJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCWJ1ZnNpemUgPSBieXRlcyAqIDI7CisJICAgICAgfQorCisJICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKworCSAgICAvKiBJZ25vcmUgdGhlIGNoZWNrc3VtIGJ5dGUuICAqLworCSAgICAtLWJ5dGVzOworCisJICAgIGFkZHJlc3MgPSAwOworCSAgICBkYXRhID0gYnVmOworCSAgICBzd2l0Y2ggKGhkclswXSkKKwkgICAgICB7CisJICAgICAgY2FzZSAnMCc6CisJICAgICAgY2FzZSAnNSc6CisJCS8qIFByb2xvZ3VlLS1pZ25vcmUgdGhlIGZpbGUgbmFtZSwgYnV0IHN0b3AgYnVpbGRpbmcgYQorICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gYXQgdGhpcyBwb2ludC4gICovCisJCXNlYyA9IE5VTEw7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnMyc6CisJCWFkZHJlc3MgPSBIRVggKGRhdGEpOworCQlkYXRhICs9IDI7CisJCS0tYnl0ZXM7CisJCS8qIEZhbGwgdGhyb3VnaC4gICovCisJICAgICAgY2FzZSAnMic6CisJCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7CisJCWRhdGEgKz0gMjsKKwkJLS1ieXRlczsKKwkJLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkgICAgICBjYXNlICcxJzoKKwkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKKwkJZGF0YSArPSAyOworCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOworCQlkYXRhICs9IDI7CisJCWJ5dGVzIC09IDI7CisKKwkJaWYgKHNlYyAhPSBOVUxMCisJCSAgICAmJiBzZWMtPnZtYSArIHNlYy0+X3Jhd19zaXplID09IGFkZHJlc3MpCisJCSAgeworCQkgICAgLyogVGhpcyBkYXRhIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KKwkJICAgIHNlYy0+X3Jhd19zaXplICs9IGJ5dGVzOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGNoYXIgc2VjYnVmWzIwXTsKKwkJICAgIGNoYXIgKnNlY25hbWU7CisKKwkJICAgIHNwcmludGYgKHNlY2J1ZiwgIi5zZWMlZCIsIGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgKyAxKTsKKwkJICAgIHNlY25hbWUgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoc2VjYnVmKSArIDEpOworCQkgICAgc3RyY3B5IChzZWNuYW1lLCBzZWNidWYpOworCQkgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSk7CisJCSAgICBpZiAoc2VjID09IE5VTEwpCisJCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgICAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKKwkJICAgIHNlYy0+dm1hID0gYWRkcmVzczsKKwkJICAgIHNlYy0+bG1hID0gYWRkcmVzczsKKwkJICAgIHNlYy0+X3Jhd19zaXplID0gYnl0ZXM7CisJCSAgICBzZWMtPmZpbGVwb3MgPSBwb3M7CisJCSAgfQorCisJCWJyZWFrOworCisJICAgICAgY2FzZSAnNyc6CisJCWFkZHJlc3MgPSBIRVggKGRhdGEpOworCQlkYXRhICs9IDI7CisJCS8qIEZhbGwgdGhyb3VnaC4gICovCisJICAgICAgY2FzZSAnOCc6CisJCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7CisJCWRhdGEgKz0gMjsKKwkJLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkgICAgICBjYXNlICc5JzoKKwkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKKwkJZGF0YSArPSAyOworCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOworCQlkYXRhICs9IDI7CisKKwkJLyogVGhpcyBpcyBhIHRlcm1pbmF0aW9uIHJlY29yZC4gICovCisJCWFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBhZGRyZXNzOworCisJCWlmIChidWYgIT0gTlVMTCkKKwkJICBmcmVlIChidWYpOworCisJCXJldHVybiB0cnVlOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGVycm9yKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChidWYgIT0gTlVMTCkKKyAgICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoc3ltYnVmICE9IE5VTEwpCisgICAgZnJlZSAoc3ltYnVmKTsKKyAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIGZyZWUgKGJ1Zik7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGFuIFMtcmVjb3JkIGZpbGUuICAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCitzcmVjX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGJmZF9ieXRlIGJbNF07CisKKyAgc3JlY19pbml0ICgpOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpICE9IDQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGJbMF0gIT0gJ1MnIHx8ICFJU0hFWCAoYlsxXSkgfHwgIUlTSEVYIChiWzJdKSB8fCAhSVNIRVggKGJbM10pKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghIHNyZWNfbWtvYmplY3QgKGFiZmQpCisgICAgICB8fCAhIHNyZWNfc2NhbiAoYWJmZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKKyAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKworLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGFuIFMtcmVjb3JkIGZpbGUgd2l0aCBzeW1ib2xzLiAgKi8KKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgorc3ltYm9sc3JlY19vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBjaGFyIGJbMl07CisKKyAgc3JlY19pbml0ICgpOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDIsIGFiZmQpICE9IDIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGJbMF0gIT0gJyQnIHx8IGJbMV0gIT0gJyQnKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghIHNyZWNfbWtvYmplY3QgKGFiZmQpCisgICAgICB8fCAhIHNyZWNfc2NhbiAoYWJmZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKKyAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKKworICByZXR1cm4gYWJmZC0+eHZlYzsKK30KKworLyogUmVhZCBpbiB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGNvbnRlbnRzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7Cit7CisgIGludCBjOworICBiZmRfc2l6ZV90eXBlIHNvZmFyID0gMDsKKyAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOworICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKKyAgc2l6ZV90IGJ1ZnNpemUgPSAwOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcywgU0VFS19TRVQpICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIGJmZF9ieXRlIGhkclszXTsKKyAgICAgIHVuc2lnbmVkIGludCBieXRlczsKKyAgICAgIGJmZF92bWEgYWRkcmVzczsKKyAgICAgIGJmZF9ieXRlICpkYXRhOworCisgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKwljb250aW51ZTsKKworICAgICAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc3JlY19zY2FuIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCBzbyB3ZQorICAgICAgICAgb3VnaHQgdG8ga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KKyAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJ1MnKTsKKworICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDMsIGFiZmQpICE9IDMpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIEJGRF9BU1NFUlQgKElTSEVYIChoZHJbMV0pICYmIElTSEVYIChoZHJbMl0pKTsKKworICAgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOworCisgICAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKKwl7CisJICBpZiAoYnVmICE9IE5VTEwpCisJICAgIGZyZWUgKGJ1Zik7CisJICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKKwkgIGlmIChidWYgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBidWZzaXplID0gYnl0ZXMgKiAyOworCX0KKworICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGJ5dGVzICogMiwgYWJmZCkgIT0gYnl0ZXMgKiAyKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBhZGRyZXNzID0gMDsKKyAgICAgIGRhdGEgPSBidWY7CisgICAgICBzd2l0Y2ggKGhkclswXSkKKwl7CisJZGVmYXVsdDoKKwkgIEJGRF9BU1NFUlQgKHNvZmFyID09IHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisJICBpZiAoYnVmICE9IE5VTEwpCisJICAgIGZyZWUgKGJ1Zik7CisJICByZXR1cm4gdHJ1ZTsKKworCWNhc2UgJzMnOgorCSAgYWRkcmVzcyA9IEhFWCAoZGF0YSk7CisJICBkYXRhICs9IDI7CisJICAtLWJ5dGVzOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlICcyJzoKKwkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7CisJICBkYXRhICs9IDI7CisJICAtLWJ5dGVzOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlICcxJzoKKwkgIGFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7CisJICBkYXRhICs9IDI7CisJICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOworCSAgZGF0YSArPSAyOworCSAgYnl0ZXMgLT0gMjsKKworCSAgaWYgKGFkZHJlc3MgIT0gc2VjdGlvbi0+dm1hICsgc29mYXIpCisJICAgIHsKKwkgICAgICAvKiBXZSd2ZSBjb21lIHRvIHRoZSBlbmQgb2YgdGhpcyBzZWN0aW9uLiAgKi8KKwkgICAgICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOworCSAgICAgIGlmIChidWYgIT0gTlVMTCkKKwkJZnJlZSAoYnVmKTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCisJICAvKiBEb24ndCBjb25zaWRlciBjaGVja3N1bS4gICovCisJICAtLWJ5dGVzOworCisJICB3aGlsZSAoYnl0ZXMtLSAhPSAwKQorCSAgICB7CisJICAgICAgY29udGVudHNbc29mYXJdID0gSEVYIChkYXRhKTsKKwkgICAgICBkYXRhICs9IDI7CisJICAgICAgKytzb2ZhcjsKKwkgICAgfQorCisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChlcnJvcikKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOworCisgIGlmIChidWYgIT0gTlVMTCkKKyAgICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoYnVmICE9IE5VTEwpCisgICAgZnJlZSAoYnVmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBHZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCisgICAgeworICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisgICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTAorCSAgJiYgc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBzcmVjX3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAorCSAgKHNpemVfdCkgY291bnQpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdGhlIGFyY2hpdGVjdHVyZS4gIFdlIGFjY2VwdCBhbiB1bmtub3duIGFyY2hpdGVjdHVyZSBoZXJlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3NyZWNfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCkKKyAgICAgYmZkICphYmZkOworICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgICAgdW5zaWduZWQgbG9uZyBtYWNoOworeworICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQorICAgIHsKKyAgICAgIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpOworfQorCisvKiB3ZSBoYXZlIHRvIHNhdmUgdXAgYWxsIHRoZSBTcmVjb3JkcyBmb3IgYSBzcGx1cmdlIGJlZm9yZSBvdXRwdXQgKi8KKworc3RhdGljIGJvb2xlYW4KK3NyZWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Cit7CisgIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOworICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICplbnRyeTsKKworICBlbnRyeSA9ICgoc3JlY19kYXRhX2xpc3RfdHlwZSAqKQorCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzcmVjX2RhdGFfbGlzdF90eXBlKSkpOworICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJ5dGVzX3RvX2RvCisgICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpCisgICAgICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkpCisgICAgeworICAgICAgYmZkX2J5dGUgKmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBieXRlc190b19kbyk7CisgICAgICBpZiAoZGF0YSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG1lbWNweSAoKFBUUikgZGF0YSwgbG9jYXRpb24sIChzaXplX3QpIGJ5dGVzX3RvX2RvKTsKKworICAgICAgaWYgKChzZWN0aW9uLT5sbWEgKyBvZmZzZXQgKyBieXRlc190b19kbyAtIDEpIDw9IDB4ZmZmZikKKwl7CisKKwl9CisgICAgICBlbHNlIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmZmZgorCSAgICAgICAmJiB0ZGF0YS0+dHlwZSA8PSAyKQorCXsKKwkgIHRkYXRhLT50eXBlID0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgdGRhdGEtPnR5cGUgPSAzOworCX0KKworICAgICAgZW50cnktPmRhdGEgPSBkYXRhOworICAgICAgZW50cnktPndoZXJlID0gc2VjdGlvbi0+bG1hICsgb2Zmc2V0OworICAgICAgZW50cnktPnNpemUgPSBieXRlc190b19kbzsKKworICAgICAgLyogU29ydCB0aGUgcmVjb3JkcyBieSBhZGRyZXNzLiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBvZgorICAgICAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLworICAgICAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKKwkgICYmIGVudHJ5LT53aGVyZSA+PSB0ZGF0YS0+dGFpbC0+d2hlcmUpCisJeworCSAgdGRhdGEtPnRhaWwtPm5leHQgPSBlbnRyeTsKKwkgIGVudHJ5LT5uZXh0ID0gTlVMTDsKKwkgIHRkYXRhLT50YWlsID0gZW50cnk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJlZ2lzdGVyIHNyZWNfZGF0YV9saXN0X3R5cGUgKipsb29rOworCisJICBmb3IgKGxvb2sgPSAmdGRhdGEtPmhlYWQ7CisJICAgICAgICpsb29rICE9IE5VTEwgJiYgKCpsb29rKS0+d2hlcmUgPCBlbnRyeS0+d2hlcmU7CisJICAgICAgIGxvb2sgPSAmKCpsb29rKS0+bmV4dCkKKwkgICAgOworCSAgZW50cnktPm5leHQgPSAqbG9vazsKKwkgICpsb29rID0gZW50cnk7CisJICBpZiAoZW50cnktPm5leHQgPT0gTlVMTCkKKwkgICAgdGRhdGEtPnRhaWwgPSBlbnRyeTsKKwl9CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgYSByZWNvcmQgb2YgdHlwZSwgb2YgdGhlIHN1cHBsaWVkIG51bWJlciBvZiBieXRlcy4gVGhlCisgICBzdXBwbGllZCBieXRlcyBhbmQgbGVuZ3RoIGRvbid0IGhhdmUgYSBjaGVja3N1bS4gVGhhdCdzIHdvcmtlZCBvdXQKKyAgIGhlcmUKKyovCitzdGF0aWMgYm9vbGVhbgorc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIHR5cGUsIGFkZHJlc3MsIGRhdGEsIGVuZCkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgdHlwZTsKKyAgICAgYmZkX3ZtYSBhZGRyZXNzOworICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKKyAgICAgY29uc3QgYmZkX2J5dGUgKmVuZDsKK3sKKyAgY2hhciBidWZmZXJbTUFYQ0hVTktdOworICB1bnNpZ25lZCBpbnQgY2hlY2tfc3VtID0gMDsKKyAgQ09OU1QgYmZkX2J5dGUgKnNyYyA9IGRhdGE7CisgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKKyAgY2hhciAqbGVuZ3RoOworICBiZmRfc2l6ZV90eXBlIHdybGVuOworCisgICpkc3QrKyA9ICdTJzsKKyAgKmRzdCsrID0gJzAnICsgdHlwZTsKKworICBsZW5ndGggPSBkc3Q7CisgIGRzdCArPSAyOwkJCS8qIGxlYXZlIHJvb20gZm9yIGRzdCovCisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIDM6CisgICAgY2FzZSA3OgorICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gMjQpLCBjaGVja19zdW0pOworICAgICAgZHN0ICs9IDI7CisgICAgY2FzZSA4OgorICAgIGNhc2UgMjoKKyAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDE2KSwgY2hlY2tfc3VtKTsKKyAgICAgIGRzdCArPSAyOworICAgIGNhc2UgOToKKyAgICBjYXNlIDE6CisgICAgY2FzZSAwOgorICAgICAgVE9IRVggKGRzdCwgKGFkZHJlc3MgPj4gOCksIGNoZWNrX3N1bSk7CisgICAgICBkc3QgKz0gMjsKKyAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzKSwgY2hlY2tfc3VtKTsKKyAgICAgIGRzdCArPSAyOworICAgICAgYnJlYWs7CisKKyAgICB9CisgIGZvciAoc3JjID0gZGF0YTsgc3JjIDwgZW5kOyBzcmMrKykKKyAgICB7CisgICAgICBUT0hFWCAoZHN0LCAqc3JjLCBjaGVja19zdW0pOworICAgICAgZHN0ICs9IDI7CisgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIGxlbmd0aCAqLworICBUT0hFWCAobGVuZ3RoLCAoZHN0IC0gbGVuZ3RoKSAvIDIsIGNoZWNrX3N1bSk7CisgIGNoZWNrX3N1bSAmPSAweGZmOworICBjaGVja19zdW0gPSAyNTUgLSBjaGVja19zdW07CisgIFRPSEVYIChkc3QsIGNoZWNrX3N1bSwgY2hlY2tfc3VtKTsKKyAgZHN0ICs9IDI7CisKKyAgKmRzdCsrID0gJ1xyJzsKKyAgKmRzdCsrID0gJ1xuJzsKKyAgd3JsZW4gPSBkc3QgLSBidWZmZXI7CisgIGlmIChiZmRfd3JpdGUgKChQVFIpIGJ1ZmZlciwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKworCitzdGF0aWMgYm9vbGVhbgorc3JlY193cml0ZV9oZWFkZXIgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYmZkX2J5dGUgYnVmZmVyW01BWENIVU5LXTsKKyAgYmZkX2J5dGUgKmRzdCA9IGJ1ZmZlcjsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLyogSSdsbCBwdXQgYW4gYXJiaXRhcnkgNDAgY2hhciBsaW1pdCBvbiBoZWFkZXIgc2l6ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgNDAgJiYgYWJmZC0+ZmlsZW5hbWVbaV07IGkrKykKKyAgICB7CisgICAgICAqZHN0KysgPSBhYmZkLT5maWxlbmFtZVtpXTsKKyAgICB9CisgIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgYnVmZmVyLCBkc3QpOworfQorCitzdGF0aWMgYm9vbGVhbgorc3JlY193cml0ZV9zZWN0aW9uIChhYmZkLCB0ZGF0YSwgbGlzdCkKKyAgICAgYmZkICphYmZkOworICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKKyAgICAgc3JlY19kYXRhX2xpc3RfdHlwZSAqbGlzdDsKK3sKKyAgdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOworICBiZmRfYnl0ZSAqbG9jYXRpb24gPSBsaXN0LT5kYXRhOworCisgIHdoaWxlIChieXRlc193cml0dGVuIDwgbGlzdC0+c2l6ZSkKKyAgICB7CisgICAgICBiZmRfdm1hIGFkZHJlc3M7CisKKyAgICAgIHVuc2lnbmVkIGludCBieXRlc190aGlzX2NodW5rID0gbGlzdC0+c2l6ZSAtIGJ5dGVzX3dyaXR0ZW47CisKKyAgICAgIGlmIChieXRlc190aGlzX2NodW5rID4gQ0hVTkspCisJeworCSAgYnl0ZXNfdGhpc19jaHVuayA9IENIVU5LOworCX0KKworICAgICAgYWRkcmVzcyA9IGxpc3QtPndoZXJlICsgYnl0ZXNfd3JpdHRlbjsKKworICAgICAgaWYgKCEgc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsCisJCQkgICAgICAgdGRhdGEtPnR5cGUsCisJCQkgICAgICAgYWRkcmVzcywKKwkJCSAgICAgICBsb2NhdGlvbiwKKwkJCSAgICAgICBsb2NhdGlvbiArIGJ5dGVzX3RoaXNfY2h1bmspKQorCXJldHVybiBmYWxzZTsKKworICAgICAgYnl0ZXNfd3JpdHRlbiArPSBieXRlc190aGlzX2NodW5rOworICAgICAgbG9jYXRpb24gKz0gYnl0ZXNfdGhpc19jaHVuazsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitzcmVjX3dyaXRlX3Rlcm1pbmF0b3IgKGFiZmQsIHRkYXRhKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHRkYXRhX3R5cGUgKnRkYXRhOworeworICBiZmRfYnl0ZSBidWZmZXJbMl07CisKKyAgcmV0dXJuIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCAxMCAtIHRkYXRhLT50eXBlLAorCQkJICAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MsIGJ1ZmZlciwgYnVmZmVyKTsKK30KKworCisKK3N0YXRpYyBib29sZWFuCitzcmVjX3dyaXRlX3N5bWJvbHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciBidWZmZXJbTUFYQ0hVTktdOworICAvKiBEdW1wIG91dCB0aGUgc3ltYm9scyBvZiBhIGJmZCAqLworICBpbnQgaTsKKyAgaW50IGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisKKyAgaWYgKGNvdW50KQorICAgIHsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBhc3ltYm9sICoqdGFibGUgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOworICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJCQgJXNcclxuIiwgYWJmZC0+ZmlsZW5hbWUpOworCisgICAgICBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7CisgICAgICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJeworCSAgYXN5bWJvbCAqcyA9IHRhYmxlW2ldOworCSAgaWYgKCEgYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzKQorCSAgICAgICYmIChzLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDApCisJICAgIHsKKwkgICAgICAvKiBKdXN0IGR1bXAgb3V0IG5vbiBkZWJ1ZyBzeW1ib2xzICovCisJICAgICAgYmZkX3NpemVfdHlwZSBsOworCSAgICAgIGNoYXIgYnVmMls0MF0sICpwOworCisJICAgICAgc3ByaW50Zl92bWEgKGJ1ZjIsCisJCQkgICBzLT52YWx1ZSArIHMtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5sbWEKKwkJCSAgICsgcy0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJICAgICAgcCA9IGJ1ZjI7CisJICAgICAgd2hpbGUgKHBbMF0gPT0gJzAnICYmIHBbMV0gIT0gMCkKKwkJcCsrOworCSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiAgJXMgJCVzXHJcbiIsIHMtPm5hbWUsIHApOworCSAgICAgIGwgPSBzdHJsZW4gKGJ1ZmZlcik7CisJICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsLCAxLCBhYmZkKSAhPSBsKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgICBzcHJpbnRmIChidWZmZXIsICIkJCBcclxuIik7CisgICAgICBsZW4gPSBzdHJsZW4gKGJ1ZmZlcik7CisgICAgICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sZWFuCitpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgc3ltYm9sczsKK3sKKyAgdGRhdGFfdHlwZSAqdGRhdGEgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGE7CisgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmxpc3Q7CisKKyAgaWYgKHN5bWJvbHMpCisgICAgeworICAgICAgaWYgKCEgc3JlY193cml0ZV9zeW1ib2xzIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIHNyZWNfd3JpdGVfaGVhZGVyIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTm93IHdhbmRlciB0aG91Z2ggYWxsIHRoZSBzZWN0aW9ucyBwcm92aWRlZCBhbmQgb3V0cHV0IHRoZW0gKi8KKyAgbGlzdCA9IHRkYXRhLT5oZWFkOworCisgIHdoaWxlIChsaXN0ICE9IChzcmVjX2RhdGFfbGlzdF90eXBlICopIE5VTEwpCisgICAgeworICAgICAgaWYgKCEgc3JlY193cml0ZV9zZWN0aW9uIChhYmZkLCB0ZGF0YSwgbGlzdCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICByZXR1cm4gc3JlY193cml0ZV90ZXJtaW5hdG9yIChhYmZkLCB0ZGF0YSk7Cit9CisKK3N0YXRpYyBib29sZWFuCitzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIDApOworfQorCitzdGF0aWMgYm9vbGVhbgorc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcmV0dXJuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCAxKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgaW50CitzcmVjX3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlYzsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhc3ltYm9sICoKK3NyZWNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7CisgIGlmIChuZXcpCisgICAgbmV3LT50aGVfYmZkID0gYWJmZDsKKyAgcmV0dXJuIG5ldzsKK30KKworLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgbG9uZworc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKK30KKworLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgbG9uZworc3JlY19nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKK3sKKyAgdW5zaWduZWQgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CisgIGFzeW1ib2wgKmNzeW1ib2xzOworICB1bnNpZ25lZCBpbnQgaTsKKworICBjc3ltYm9scyA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+Y3N5bWJvbHM7CisgIGlmIChjc3ltYm9scyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKmM7CisgICAgICBzdHJ1Y3Qgc3JlY19zeW1ib2wgKnM7CisKKyAgICAgIGNzeW1ib2xzID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCkpOworICAgICAgaWYgKGNzeW1ib2xzID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPmNzeW1ib2xzID0gY3N5bWJvbHM7CisKKyAgICAgIGZvciAocyA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scywgYyA9IGNzeW1ib2xzOworCSAgIHMgIT0gTlVMTDsKKwkgICBzID0gcy0+bmV4dCwgKytjKQorCXsKKwkgIGMtPnRoZV9iZmQgPSBhYmZkOworCSAgYy0+bmFtZSA9IHMtPm5hbWU7CisJICBjLT52YWx1ZSA9IHMtPnZhbDsKKwkgIGMtPmZsYWdzID0gQlNGX0dMT0JBTDsKKwkgIGMtPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgYy0+dWRhdGEucCA9IE5VTEw7CisJfQorICAgIH0KKwkKKyAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCisgICAgKmFsb2NhdGlvbisrID0gY3N5bWJvbHMrKzsKKyAgKmFsb2NhdGlvbiA9IE5VTEw7CisKKyAgcmV0dXJuIHN5bWNvdW50OworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitzcmVjX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIHN5bWJvbF9pbmZvICpyZXQ7Cit7CisgIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitzcmVjX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgUFRSIGFmaWxlOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKKyAgc3dpdGNoIChob3cpCisgICAgeworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgorICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOworICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKKwkgICAgICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAorCSAgICAgICBzeW1ib2wtPm5hbWUpOworCisgICAgfQorfQorCisjZGVmaW5lCXNyZWNfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCisjZGVmaW5lIHNyZWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCisjZGVmaW5lIHNyZWNfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vaworCisjZGVmaW5lIHNyZWNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQorI2RlZmluZSBzcmVjX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubworI2RlZmluZSBzcmVjX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIHNyZWNfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorI2RlZmluZSBzcmVjX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKKyNkZWZpbmUgc3JlY19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSBzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQorI2RlZmluZSBzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCisgICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQorI2RlZmluZSBzcmVjX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAorCisjZGVmaW5lIHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworCisjZGVmaW5lIHNyZWNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSBzcmVjX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgc3JlY19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKKyNkZWZpbmUgc3JlY19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSBzcmVjX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIHNyZWNfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKKyNkZWZpbmUgc3JlY19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKworY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYyA9Cit7CisgICJzcmVjIiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAorICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLworICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUworICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLworCisgIHsKKyAgICBfYmZkX2R1bW15X3RhcmdldCwKKyAgICBzcmVjX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICB9LAorICB7CisgICAgYmZkX2ZhbHNlLAorICAgIHNyZWNfbWtvYmplY3QsCisgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKKyAgICBiZmRfZmFsc2UsCisgIH0sCisgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgYmZkX2ZhbHNlLAorICAgIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAorICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKKyAgICBiZmRfZmFsc2UsCisgIH0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoc3JlYyksCisgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCisgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKKyAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChzcmVjKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChzcmVjKSwKKyAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNyZWMpLAorICBCRkRfSlVNUF9UQUJMRV9MSU5LIChzcmVjKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpIDAKK307CisKKworCitjb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjID0KK3sKKyAgInN5bWJvbHNyZWMiLAkJCS8qIG5hbWUgKi8KKyAgYmZkX3RhcmdldF9zcmVjX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KKyAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAorICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCisgICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLworICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCisKKyAgeworICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAorICAgIHN5bWJvbHNyZWNfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgICBfYmZkX2R1bW15X3RhcmdldCwKKyAgICBfYmZkX2R1bW15X3RhcmdldCwKKyAgfSwKKyAgeworICAgIGJmZF9mYWxzZSwKKyAgICBzcmVjX21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCisgICAgYmZkX2ZhbHNlLAorICB9LAorICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgIGJmZF9mYWxzZSwKKyAgICBzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cywKKyAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2ZhbHNlLAorICB9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNyZWMpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCisgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKKyAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc3JlYyksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYyksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzcmVjKSwKKyAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc3JlYyksCisgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKKworICAoUFRSKSAwCit9OwpkaWZmIC0tZ2l0IGEvYmZkL3N0YWItc3ltcy5jIGIvYmZkL3N0YWItc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmU2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc3RhYi1zeW1zLmMKQEAgLTAsMCArMSw1NyBAQAorLyogVGFibGUgb2Ygc3RhYiBuYW1lcyBmb3IgdGhlIEJGRCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKworI2RlZmluZSBBUkNIX1NJWkUgMzIJCS8qIFZhbHVlIGRvZXNuJ3QgbWF0dGVyLiAqLworI2luY2x1ZGUgImxpYmFvdXQuaCIKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorCisvKiBJZ25vcmUgZHVwbGljYXRlIHN0YWIgY29kZXM7IGp1c3QgcmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBmaXJzdAorICAgb25lLiAgKi8KKyNkZWZpbmUgX19kZWZpbmVfc3RhYihOQU1FLCBDT0RFLCBTVFJJTkcpIF9fZGVmaW5lX25hbWUoQ09ERSwgU1RSSU5HKQorI2RlZmluZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZShOQU1FLCBDT0RFLCBTVFJJTkcpCisKKy8qIFRoZXNlIGFyZSBub3QgcmVhbGx5IHN0YWIgc3ltYm9scywgYnV0IGl0IGlzCisgICBjb252ZW5pZW50IHRvIGhhdmUgdGhlbSBoZXJlIGZvciB0aGUgc2FrZSBvZiBubS4KKyAgIEZvciBjb21wbGV0ZW5lc3MsIHdlIGNvdWxkIGFsc28gYWRkIE5fVEVYVCBldGMsIGJ1dCB0aG9zZQorICAgYXJlIG5ldmVyIG5lZWRlZCwgc2luY2Ugbm0gdHJlYXRzIHRob3NlIHNwZWNpYWxseS4gKi8KKyNkZWZpbmUgRVhUUkFfU1lNQk9MUyBcCisgIF9fZGVmaW5lX25hbWUgKE5fU0VUQSwgIlNFVEEiKS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCisgIF9fZGVmaW5lX25hbWUgKE5fU0VUVCwgIlNFVFQiKS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKKyAgX19kZWZpbmVfbmFtZSAoTl9TRVRELCAiU0VURCIpLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAorICBfX2RlZmluZV9uYW1lIChOX1NFVEIsICJTRVRCIikvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKKyAgX19kZWZpbmVfbmFtZSAoTl9TRVRWLCAiU0VUViIpLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gKi8gXAorICBfX2RlZmluZV9uYW1lIChOX0lORFIsICJJTkRSIikgXAorICBfX2RlZmluZV9uYW1lIChOX1dBUk5JTkcsICJXQVJOSU5HIikKKworY29uc3QgY2hhciAqCitiZmRfZ2V0X3N0YWJfbmFtZSAoY29kZSkKKyAgICAgaW50IGNvZGU7Cit7CisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisjZGVmaW5lIF9fZGVmaW5lX25hbWUodmFsLCBzdHIpIGNhc2UgdmFsOiByZXR1cm4gc3RyOworI2luY2x1ZGUgImFvdXQvc3RhYi5kZWYiCisgICAgICBFWFRSQV9TWU1CT0xTCisgICAgfQorCisgIHJldHVybiAoY29uc3QgY2hhciAqKSAwOworfQpkaWZmIC0tZ2l0IGEvYmZkL3N0YWJzLmMgYi9iZmQvc3RhYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMwMDBkCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3N0YWJzLmMKQEAgLTAsMCArMSw2NTEgQEAKKy8qIFN0YWJzIGluIHNlY3Rpb25zIGxpbmtpbmcgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucywgYXMgdXNlZAorICAgb24gQ09GRiBhbmQgRUxGLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6CisgICAgIDQgYnl0ZSBzdHJpbmcgdGFibGUgaW5kZXgKKyAgICAgMSBieXRlIHN0YWIgdHlwZQorICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAorICAgICAyIGJ5dGUgc3RhYiBkZXNjIGZpZWxkCisgICAgIDQgYnl0ZSBzdGFiIHZhbHVlCisgICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgorCisgICBUaGUgc3RhYnMgc3ltYm9scyBhcmUgZGl2aWRlZCBpbnRvIGNvbXBpbGF0aW9uIHVuaXRzLiAgRm9yIHRoZQorICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aCBvZgorICAgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlIG51bWJlciBvZgorICAgc3RhYnMgc3ltYm9scyBmb3IgdGhpcyB1bml0LiAgKi8KKworI2RlZmluZSBTVFJEWE9GRiAoMCkKKyNkZWZpbmUgVFlQRU9GRiAoNCkKKyNkZWZpbmUgT1RIRVJPRkYgKDUpCisjZGVmaW5lIERFU0NPRkYgKDYpCisjZGVmaW5lIFZBTE9GRiAoOCkKKyNkZWZpbmUgU1RBQlNJWkUgKDEyKQorCisvKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KKworc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZQoreworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKK307CisKKy8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgorICAgZmlsZS4gICovCisKK3N0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzCit7CisgIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OworICBiZmRfdm1hIHRvdGFsOworfTsKKworLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLworICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOworfTsKKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKKyAgKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKKyAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMsIHNvbWUgb2YKKyAgIHdoaWNoIG1pZ2h0IGJlIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KKworc3RydWN0IHN0YWJfZXhjbF9saXN0Cit7CisgIC8qIFRoZSBuZXh0IHN5bWJvbCB0byBjb252ZXJ0LiAgKi8KKyAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpuZXh0OworICAvKiBUaGUgb2Zmc2V0IHRvIHRoaXMgc3ltYm9sIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBvZmZzZXQ7CisgIC8qIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wuICAqLworICBiZmRfdm1hIHZhbDsKKyAgLyogVGhlIHR5cGUgb2YgdGhpcyBzeW1ib2wgKE5fQklOQ0wgb3IgTl9FWENMKS4gICovCisgIGludCB0eXBlOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIHdpdGggZWFjaCAuc3RhYiBzZWN0aW9uLiAgKi8KKworc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvCit7CisgIC8qIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMgd2hpY2ggc2hvdWxkIGJlCisgICAgIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KKyAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpleGNsczsKKworICAvKiBUaGlzIGlzIHVzZWQgdG8gbWFwIGlucHV0IHN0YWIgb2Zmc2V0cyB3aXRoaW4gdGhlaXIgc2VjdGlvbnMKKyAgICAgdG8gb3V0cHV0IHN0YWIgb2Zmc2V0cywgdG8gdGFrZSBpbnRvIGFjY291bnQgc3RhYnMgdGhhdCBoYXZlCisgICAgIGJlZW4gZGVsZXRlZC4gIElmIGl0IGlzIE5VTEwsIHRoZSBvdXRwdXQgb2Zmc2V0cyBhcmUgdGhlIHNhbWUKKyAgICAgYXMgdGhlIGlucHV0IG9mZnNldHMsIGJlY2F1c2Ugbm8gc3RhYnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbQorICAgICB0aGlzIHNlY3Rpb24uICBPdGhlcndpc2UgdGhlIGkndGggZW50cnkgaXMgdGhlIG51bWJlciBvZgorICAgICBieXRlcyBvZiBzdGFicyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIHByaW9yIHRvIHRoZSBpJ3RoCisgICAgIHN0YWIuICovCisgIGJmZF9zaXplX3R5cGUgKmN1bXVsYXRpdmVfc2tpcHM7CisKKyAgLyogVGhpcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgaW5kaWNlcy4gIEZvciBlYWNoIHN0YWIgc3ltYm9sLCB3ZQorICAgICBzdG9yZSB0aGUgc3RyaW5nIGluZGV4IGhlcmUuICBJZiBhIHN0YWIgc3ltYm9sIHNob3VsZCBub3QgYmUKKyAgICAgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIG91dHB1dCwgdGhlIHN0cmluZyBpbmRleCBpcyAtMS4gICovCisgIGJmZF9zaXplX3R5cGUgc3RyaWR4c1sxXTsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBzdGFicyBpbiBzZWN0aW9ucworICAgaW5mb3JtYXRpb24gd2hpbGUgbGlua2luZy4gICovCisKK3N0cnVjdCBzdGFiX2luZm8KK3sKKyAgLyogQSBoYXNoIHRhYmxlIHVzZWQgdG8gaG9sZCBzdGFicyBzdHJpbmdzLiAgKi8KKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RyaW5nczsKKyAgLyogVGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLworICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOworICAvKiBUaGUgZmlyc3QgLnN0YWJzdHIgc2VjdGlvbi4gICovCisgIGFzZWN0aW9uICpzdGFic3RyOworfTsKKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKKwwKKy8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK3N0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQorICAgIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAorCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOworICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCisJIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPnRvdGFscyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKwwKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGlucHV0IGZpbGUgZnJvbSB0aGUgYWRkX3N5bWJvbHMKKyAgIHBhc3Mgb2YgdGhlIGxpbmtlci4gICovCisKK2Jvb2xlYW4KK19iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLCBwc2luZm8sIHN0YWJzZWMsIHN0YWJzdHJzZWMsIHBzZWNpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiAqcHNpbmZvOworICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKKyAgICAgYXNlY3Rpb24gKnN0YWJzdHJzZWM7CisgICAgIFBUUiAqcHNlY2luZm87Cit7CisgIGJvb2xlYW4gZmlyc3Q7CisgIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOworICBiZmRfc2l6ZV90eXBlIGNvdW50OworICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87CisgIGJmZF9ieXRlICpzdGFiYnVmID0gTlVMTDsKKyAgYmZkX2J5dGUgKnN0YWJzdHJidWYgPSBOVUxMOworICBiZmRfYnl0ZSAqc3ltLCAqc3ltZW5kOworICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmYsIHNraXA7CisgIGJmZF9zaXplX3R5cGUgKnBzdHJpZHg7CisKKyAgaWYgKHN0YWJzZWMtPl9yYXdfc2l6ZSA9PSAwCisgICAgICB8fCBzdGFic3Ryc2VjLT5fcmF3X3NpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGlmIChzdGFic2VjLT5fcmF3X3NpemUgJSBTVEFCU0laRSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmb3JtYXQgb2YgdGhlc2Ugc3RhYiBzeW1ib2xzLgorICAgICAgICAgRG9uJ3QgdHJ5IHRvIG9wdGltaXplIHRoZW0uICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGlmICgoc3RhYnN0cnNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisgICAgeworICAgICAgLyogV2Ugc2hvdWxkbid0IHNlZSByZWxvY2F0aW9ucyBpbiB0aGUgc3RyaW5ncywgYW5kIHdlIGFyZW4ndAorICAgICAgICAgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZW0uICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGlmICgoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAorICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24pKQorICAgICAgfHwgKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKKwkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnN0cnNlYy0+b3V0cHV0X3NlY3Rpb24pKSkKKyAgICB7CisgICAgICAvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHNlY3Rpb25zIGlzIGJlaW5nIGRpc2NhcmRlZCBmcm9tIHRoZQorICAgICAgICAgbGluaywgc28gd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZW0uICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGZpcnN0ID0gZmFsc2U7CisKKyAgaWYgKCpwc2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJbml0aWFsaXplIHRoZSBzdGFicyBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YuICAqLworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgKnBzaW5mbyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9pbmZvKSk7CisgICAgICBpZiAoKnBzaW5mbyA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOworICAgICAgc2luZm8tPnN0cmluZ3MgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOworICAgICAgaWYgKHNpbmZvLT5zdHJpbmdzID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZzaW5mby0+aW5jbHVkZXMucm9vdCwKKwkJCQkgICBzdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYywKKwkJCQkgICAyNTEpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgc2luZm8tPnN0YWJzdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zdGFic3RyIik7CisgICAgICBzaW5mby0+c3RhYnN0ci0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkc7CisgICAgfQorCisgIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKKworICAvKiBJbml0aWFsaXplIHRoZSBpbmZvcm1hdGlvbiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgZm9yIHRoaXMgLnN0YWIKKyAgICAgc2VjdGlvbi4gICovCisKKyAgY291bnQgPSBzdGFic2VjLT5fcmF3X3NpemUgLyBTVEFCU0laRTsKKworICAqcHNlY2luZm8gPSBiZmRfYWxsb2MgKGFiZmQsCisJCQkgKHNpemVvZiAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvKQorCQkJICArIChjb3VudCAtIDEpICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSkpOworICBpZiAoKnBzZWNpbmZvID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOworICBzZWNpbmZvLT5leGNscyA9IE5VTEw7CisgIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPSBOVUxMOworICBtZW1zZXQgKHNlY2luZm8tPnN0cmlkeHMsIDAsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7CisKKyAgLyogUmVhZCB0aGUgc3RhYnMgaW5mb3JtYXRpb24gZnJvbSBhYmZkLiAgKi8KKworICBzdGFiYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN0YWJzZWMtPl9yYXdfc2l6ZSk7CisgIHN0YWJzdHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3RhYnN0cnNlYy0+X3Jhd19zaXplKTsKKyAgaWYgKHN0YWJidWYgPT0gTlVMTCB8fCBzdGFic3RyYnVmID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjLCBzdGFiYnVmLCAwLAorCQkJCSAgc3RhYnNlYy0+X3Jhd19zaXplKQorICAgICAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWMsIHN0YWJzdHJidWYsIDAsCisJCQkJICAgICBzdGFic3Ryc2VjLT5fcmF3X3NpemUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc3RhYnMgc3ltYm9scywgd29yayBvdXQgdGhlIG5ldyBzdHJpbmcgaW5kaWNlcywKKyAgICAgYW5kIGlkZW50aWZ5IE5fQklOQ0wgc3ltYm9scyB3aGljaCBjYW4gYmUgZWxpbWluYXRlZC4gICovCisKKyAgc3Ryb2ZmID0gMDsKKyAgbmV4dF9zdHJvZmYgPSAwOworICBza2lwID0gMDsKKworICBzeW1lbmQgPSBzdGFiYnVmICsgc3RhYnNlYy0+X3Jhd19zaXplOworICBmb3IgKHN5bSA9IHN0YWJidWYsIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOworICAgICAgIHN5bSA8IHN5bWVuZDsKKyAgICAgICBzeW0gKz0gU1RBQlNJWkUsICsrcHN0cmlkeCkKKyAgICB7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKworICAgICAgaWYgKCpwc3RyaWR4ICE9IDApCisJeworCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGJ5IGFuIE5fQklOQ0wgcGFzcy4gICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHR5cGUgPSBzeW1bVFlQRU9GRl07CisKKyAgICAgIGlmICh0eXBlID09IDApCisJeworCSAgLyogU3BlY2lhbCB0eXBlIDAgc3RhYnMgaW5kaWNhdGUgdGhlIG9mZnNldCB0byB0aGUgbmV4dAorICAgICAgICAgICAgIHN0cmluZyB0YWJsZS4gIFdlIG9ubHkgY29weSB0aGUgdmVyeSBmaXJzdCBvbmUuICAqLworCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7CisJICBuZXh0X3N0cm9mZiArPSBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyA4KTsKKwkgIGlmICghIGZpcnN0KQorCSAgICB7CisJICAgICAgKnBzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7CisJICAgICAgKytza2lwOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBmaXJzdCA9IGZhbHNlOworCX0KKworICAgICAgLyogU3RvcmUgdGhlIHN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIHJlY29yZCB0aGUgaW5kZXguICAqLworICAgICAgc3RyaW5nID0gKChjaGFyICopIHN0YWJzdHJidWYKKwkJKyBzdHJvZmYKKwkJKyBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyBTVFJEWE9GRikpOworICAgICAgKnBzdHJpZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNpbmZvLT5zdHJpbmdzLCBzdHJpbmcsIHRydWUsIHRydWUpOworCisgICAgICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicyBlbnRyaWVzCisJIGZvciBhIGhlYWRlciBmaWxlLiAgV2UgbmVlZCB0byBzY2FuIGFoZWFkIHRvIHRoZSBuZXh0IE5fRUlOQ0wKKwkgc3ltYm9sLCBpZ25vcmluZyBuZXN0aW5nLCBhZGRpbmcgdXAgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQorCSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUgbnVtYmVycyBpbiB0eXBlcyAodGhlCisJIGZpcnN0IG51bWJlciBhZnRlciBhbiBvcGVuIHBhcmVudGhlc2lzKS4gICovCisgICAgICBpZiAodHlwZSA9PSBOX0JJTkNMKQorCXsKKwkgIGJmZF92bWEgdmFsOworCSAgaW50IG5lc3Q7CisJICBiZmRfYnl0ZSAqaW5jbF9zeW07CisJICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICppbmNsX2VudHJ5OworCSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7CisJICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKm5lOworCisJICB2YWwgPSAwOworCSAgbmVzdCA9IDA7CisJICBmb3IgKGluY2xfc3ltID0gc3ltICsgU1RBQlNJWkU7CisJICAgICAgIGluY2xfc3ltIDwgc3ltZW5kOworCSAgICAgICBpbmNsX3N5bSArPSBTVEFCU0laRSkKKwkgICAgeworCSAgICAgIGludCBpbmNsX3R5cGU7CisKKwkgICAgICBpbmNsX3R5cGUgPSBpbmNsX3N5bVtUWVBFT0ZGXTsKKwkgICAgICBpZiAoaW5jbF90eXBlID09IDApCisJCWJyZWFrOworCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQorCQl7CisJCSAgaWYgKG5lc3QgPT0gMCkKKwkJICAgIGJyZWFrOworCQkgIC0tbmVzdDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQorCQkrK25lc3Q7CisJICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQorCQl7CisJCSAgY29uc3QgY2hhciAqc3RyOworCisJCSAgc3RyID0gKChjaGFyICopIHN0YWJzdHJidWYKKwkJCSArIHN0cm9mZgorCQkJICsgYmZkX2dldF8zMiAoYWJmZCwgaW5jbF9zeW0gKyBTVFJEWE9GRikpOworCQkgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQorCQkgICAgeworCQkgICAgICB2YWwgKz0gKnN0cjsKKwkJICAgICAgaWYgKCpzdHIgPT0gJygnKQorCQkJeworCQkJICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCisJCQkgICsrc3RyOworCQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzdHIpKQorCQkJICAgICsrc3RyOworCQkJICAtLXN0cjsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlIHNhbWUKKwkgICAgIHZhbHVlLCB0aGVuIHJlcGxhY2VkIHRoaXMgb25lIHdpdGggYW4gTl9FWENMIHN5bWJvbC4gICovCisJICBpbmNsX2VudHJ5ID0gc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJnNpbmZvLT5pbmNsdWRlcywgc3RyaW5nLAorCQkJCQkJICB0cnVlLCB0cnVlKTsKKwkgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCisJICAgIGlmICh0LT50b3RhbCA9PSB2YWwpCisJICAgICAgYnJlYWs7CisKKwkgIC8qIFJlY29yZCB0aGlzIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSB2YWx1ZQorICAgICAgICAgICAgIGNvcnJlY3RseS4gICovCisJICBuZSA9IChzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKm5lKTsKKwkgIGlmIChuZSA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIG5lLT5vZmZzZXQgPSBzeW0gLSBzdGFiYnVmOworCSAgbmUtPnZhbCA9IHZhbDsKKwkgIG5lLT50eXBlID0gTl9CSU5DTDsKKwkgIG5lLT5uZXh0ID0gc2VjaW5mby0+ZXhjbHM7CisJICBzZWNpbmZvLT5leGNscyA9IG5lOworCisJICBpZiAodCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIgZmlsZQorCQkgd2l0aCB0aGlzIHNldCBvZiBzdGFicyBzdHJpbmdzLiAgKi8KKwkgICAgICB0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqKQorCQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJnNpbmZvLT5pbmNsdWRlcy5yb290LCBzaXplb2YgKnQpKTsKKwkgICAgICBpZiAodCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICB0LT50b3RhbCA9IHZhbDsKKwkgICAgICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOworCSAgICAgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJmZF9zaXplX3R5cGUgKmluY2xfcHN0cmlkeDsKKworCSAgICAgIC8qIFdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlciBmaWxlIGJlZm9yZS4gIFRlbGwgdGhlIGZpbmFsCisJCSBwYXNzIHRvIGNoYW5nZSB0aGUgdHlwZSB0byBOX0VYQ0wuICAqLworCSAgICAgIG5lLT50eXBlID0gTl9FWENMOworCisJICAgICAgLyogTWFyayB0aGUgc2tpcHBlZCBzeW1ib2xzLiAgKi8KKworCSAgICAgIG5lc3QgPSAwOworCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyBTVEFCU0laRSwgaW5jbF9wc3RyaWR4ID0gcHN0cmlkeCArIDE7CisJCSAgIGluY2xfc3ltIDwgc3ltZW5kOworCQkgICBpbmNsX3N5bSArPSBTVEFCU0laRSwgKytpbmNsX3BzdHJpZHgpCisJCXsKKwkJICBpbnQgaW5jbF90eXBlOworCisJCSAgaW5jbF90eXBlID0gaW5jbF9zeW1bVFlQRU9GRl07CisKKwkJICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCisJCSAgICB7CisJCSAgICAgIGlmIChuZXN0ID09IDApCisJCQl7CisJCQkgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7CisJCQkgICsrc2tpcDsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICAgIC0tbmVzdDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKKwkJICAgICsrbmVzdDsKKwkJICBlbHNlIGlmIChuZXN0ID09IDApCisJCSAgICB7CisJCSAgICAgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7CisJCSAgICAgICsrc2tpcDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICBmcmVlIChzdGFiYnVmKTsKKyAgc3RhYmJ1ZiA9IE5VTEw7CisgIGZyZWUgKHN0YWJzdHJidWYpOworICBzdGFic3RyYnVmID0gTlVMTDsKKworICAvKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBzaXplcyBzdWNoIHRoYXQgdGhlIGxpbmtlciB3aWxsCisgICAgIGNvbXB1dGUgdGhlIG91dHB1dCBzZWN0aW9uIHNpemVzIGNvcnJlY3RseS4gIFdlIHNldCB0aGUgLnN0YWIKKyAgICAgc2l6ZSB0byBub3QgaW5jbHVkZSB0aGUgZW50cmllcyB3ZSBkb24ndCB3YW50LiAgV2Ugc2V0CisgICAgIFNFQ19FWENMVURFIGZvciB0aGUgLnN0YWJzdHIgc2VjdGlvbiwgc28gdGhhdCBpdCB3aWxsIGJlIGRyb3BwZWQKKyAgICAgZnJvbSB0aGUgbGluay4gIFdlIHJlY29yZCB0aGUgc2l6ZSBvZiB0aGUgc3RydGFiIGluIHRoZSBmaXJzdAorICAgICAuc3RhYnN0ciBzZWN0aW9uIHdlIHNhdywgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBzZXQgU0VDX0VYQ0xVREUKKyAgICAgZm9yIHRoYXQgc2VjdGlvbi4gICovCisgIHN0YWJzZWMtPl9jb29rZWRfc2l6ZSA9IChjb3VudCAtIHNraXApICogU1RBQlNJWkU7CisgIGlmIChzdGFic2VjLT5fY29va2VkX3NpemUgPT0gMCkKKyAgICBzdGFic2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKKyAgc3RhYnN0cnNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7CisgIHNpbmZvLT5zdGFic3RyLT5fY29va2VkX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncyk7CisKKyAgLyogQ2FsY3VsYXRlIHRoZSBgY3VtdWxhdGl2ZV9za2lwcycgYXJyYXkgbm93IHRoYXQgc3RhYnMgaGF2ZSBiZWVuCisgICAgIGRlbGV0ZWQgZm9yIHRoaXMgc2VjdGlvbi4gKi8KKworICBpZiAoc2tpcCAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgaSwgb2Zmc2V0OworICAgICAgYmZkX3NpemVfdHlwZSAqcHNraXBzOworCisgICAgICBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID0KKwkoYmZkX3NpemVfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7CisgICAgICBpZiAoc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworCisgICAgICBwc2tpcHMgPSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzOworICAgICAgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7CisgICAgICBvZmZzZXQgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcHNraXBzKyssIHBzdHJpZHgrKykKKwl7CisJICAqcHNraXBzID0gb2Zmc2V0OworCSAgaWYgKCpwc3RyaWR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkgICAgb2Zmc2V0ICs9IFNUQUJTSVpFOworCX0KKworICAgICAgQkZEX0FTU0VSVCAob2Zmc2V0ICE9IDApOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKHN0YWJidWYgIT0gTlVMTCkKKyAgICBmcmVlIChzdGFiYnVmKTsKKyAgaWYgKHN0YWJzdHJidWYgIT0gTlVMTCkKKyAgICBmcmVlIChzdGFic3RyYnVmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBXcml0ZSBvdXQgdGhlIHN0YWIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIHJlbG9jYXRlZAorICAgY29udGVudHMuICAqLworCitib29sZWFuCitfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMgKG91dHB1dF9iZmQsIHBzaW5mbywgc3RhYnNlYywgcHNlY2luZm8sIGNvbnRlbnRzKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIFBUUiAqcHNpbmZvOworICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKKyAgICAgUFRSICpwc2VjaW5mbzsKKyAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworeworICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKKyAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOworICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKmU7CisgIGJmZF9ieXRlICpzeW0sICp0b3N5bSwgKnN5bWVuZDsKKyAgYmZkX3NpemVfdHlwZSAqcHN0cmlkeDsKKworICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87CisgIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKKworICBpZiAoc2VjaW5mbyA9PSBOVUxMKQorICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLAorCQkJCSAgICAgY29udGVudHMsIHN0YWJzZWMtPm91dHB1dF9vZmZzZXQsCisJCQkJICAgICBzdGFic2VjLT5fcmF3X3NpemUpOworCisgIC8qIEhhbmRsZSBlYWNoIE5fQklOQ0wgZW50cnkuICAqLworICBmb3IgKGUgPSBzZWNpbmZvLT5leGNsczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKKyAgICB7CisgICAgICBiZmRfYnl0ZSAqZXhjbF9zeW07CisKKyAgICAgIEJGRF9BU1NFUlQgKGUtPm9mZnNldCA8IHN0YWJzZWMtPl9yYXdfc2l6ZSk7CisgICAgICBleGNsX3N5bSA9IGNvbnRlbnRzICsgZS0+b2Zmc2V0OworICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZS0+dmFsLCBleGNsX3N5bSArIFZBTE9GRik7CisgICAgICBleGNsX3N5bVtUWVBFT0ZGXSA9IGUtPnR5cGU7CisgICAgfQorCisgIC8qIENvcHkgb3ZlciBhbGwgdGhlIHN0YWJzIHN5bWJvbHMsIG9taXR0aW5nIHRoZSBvbmVzIHdlIGRvbid0IHdhbnQsCisgICAgIGFuZCBjb3JyZWN0aW5nIHRoZSBzdHJpbmcgaW5kaWNlcyBmb3IgdGhvc2Ugd2UgZG8gd2FudC4gICovCisgIHRvc3ltID0gY29udGVudHM7CisgIHN5bWVuZCA9IGNvbnRlbnRzICsgc3RhYnNlYy0+X3Jhd19zaXplOworICBmb3IgKHN5bSA9IGNvbnRlbnRzLCBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKKyAgICAgICBzeW0gPCBzeW1lbmQ7CisgICAgICAgc3ltICs9IFNUQUJTSVpFLCArK3BzdHJpZHgpCisgICAgeworICAgICAgaWYgKCpwc3RyaWR4ICE9IChiZmRfc2l6ZV90eXBlKSAtMSkKKwl7CisJICBpZiAodG9zeW0gIT0gc3ltKQorCSAgICBtZW1jcHkgKHRvc3ltLCBzeW0sIFNUQUJTSVpFKTsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICpwc3RyaWR4LCB0b3N5bSArIFNUUkRYT0ZGKTsKKworCSAgaWYgKHN5bVtUWVBFT0ZGXSA9PSAwKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyB0aGUgaGVhZGVyIHN5bWJvbCBmb3IgdGhlIHN0YWJzIHNlY3Rpb24uICBXZQorICAgICAgICAgICAgICAgICBkb24ndCByZWFsbHkgbmVlZCBvbmUsIHNpbmNlIHdlIGhhdmUgbWVyZ2VkIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgaW5wdXQgc3RhYnMgc2VjdGlvbnMgaW50byBvbmUsIGJ1dCB3ZSBnZW5lcmF0ZSBvbmUKKyAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIHJlYWRlcnMgd2hpY2ggZXhwZWN0IHRvIHNlZSBvbmUuICAqLworCSAgICAgIEJGRF9BU1NFUlQgKHN5bSA9PSBjb250ZW50cyk7CisJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpLAorCQkJICB0b3N5bSArIFZBTE9GRik7CisJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwKKwkJCSAgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSAvIFNUQUJTSVpFIC0gMSwKKwkJCSAgdG9zeW0gKyBERVNDT0ZGKTsKKwkgICAgfQorCisJICB0b3N5bSArPSBTVEFCU0laRTsKKwl9CisgICAgfQorCisgIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAodG9zeW0gLSBjb250ZW50cykgPT0gc3RhYnNlYy0+X2Nvb2tlZF9zaXplKTsKKworICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiwKKwkJCQkgICBjb250ZW50cywgc3RhYnNlYy0+b3V0cHV0X29mZnNldCwKKwkJCQkgICBzdGFic2VjLT5fY29va2VkX3NpemUpOworfQorCisvKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLworCitib29sZWFuCitfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAob3V0cHV0X2JmZCwgcHNpbmZvKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIFBUUiAqcHNpbmZvOworeworICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKKworICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87CisKKyAgaWYgKHNpbmZvID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uKSkKKyAgICB7CisgICAgICAvKiBUaGUgc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIEJGRF9BU1NFUlQgKChzaW5mby0+c3RhYnN0ci0+b3V0cHV0X29mZnNldAorCSAgICAgICArIF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKSkKKwkgICAgICA8PSBzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7CisKKyAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAorCQkoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zCisJCSArIHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfb2Zmc2V0KSwKKwkJU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKG91dHB1dF9iZmQsIHNpbmZvLT5zdHJpbmdzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uLiAgKi8KKyAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc2luZm8tPnN0cmluZ3MpOworICBiZmRfaGFzaF90YWJsZV9mcmVlICgmc2luZm8tPmluY2x1ZGVzLnJvb3QpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGp1c3QgYW4gYWRkcmVzcyBpbiB0aGUgLnN0YWIgc2VjdGlvbi4gIEdpdmVuIE9GRlNFVCB3aXRoaW4KKyAgIFNUQUJTRUMsIHRoaXMgcmV0dXJucyB0aGUgbmV3IG9mZnNldCBpbiB0aGUgYWRqdXN0ZWQgc3RhYiBzZWN0aW9uLAorICAgb3IgLTEgaWYgdGhlIGFkZHJlc3MgcmVmZXJzIHRvIGEgc3RhYiB3aGljaCBoYXMgYmVlbiByZW1vdmVkLiAgKi8KKworYmZkX3ZtYQorX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0IChvdXRwdXRfYmZkLCBwc2luZm8sIHN0YWJzZWMsIHBzZWNpbmZvLCBvZmZzZXQpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgUFRSICpwc2luZm87CisgICAgIGFzZWN0aW9uICpzdGFic2VjOworICAgICBQVFIgKnBzZWNpbmZvOworICAgICBiZmRfdm1hIG9mZnNldDsKK3sKKyAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOworCisgIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKKworICBpZiAoc2VjaW5mbyA9PSBOVUxMKQorICAgIHJldHVybiBvZmZzZXQ7CisKKyAgaWYgKG9mZnNldCA+PSBzdGFic2VjLT5fcmF3X3NpemUpCisgICAgcmV0dXJuIG9mZnNldCAtIChzdGFic2VjLT5fY29va2VkX3NpemUgLSBzdGFic2VjLT5fcmF3X3NpemUpOworCisgIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzKQorICAgIHsKKyAgICAgIGJmZF92bWEgaTsKKworICAgICAgaSA9IG9mZnNldCAvIFNUQUJTSVpFOworCisgICAgICBpZiAoc2VjaW5mby0+c3RyaWR4cyBbaV0gPT0gKGJmZF9zaXplX3R5cGUpIC0xKQorCXJldHVybiAoYmZkX3ZtYSkgLTE7CisKKyAgICAgIHJldHVybiBvZmZzZXQgLSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzIFtpXTsKKyAgICB9CisKKyAgcmV0dXJuIG9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2JmZC9zdGFtcC1oLmluIGIvYmZkL3N0YW1wLWguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4OGY3MAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC9zdGFtcC1oLmluCkBAIC0wLDAgKzEgQEAKK3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvYmZkL3N1bm9zLmMgYi9iZmQvc3Vub3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzRmODc4Ci0tLSAvZGV2L251bGwKKysrIGIvYmZkL3N1bm9zLmMKQEAgLTAsMCArMSwyOTQ4IEBACisvKiBCRkQgYmFja2VuZCBmb3IgU3VuT1MgYmluYXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zdW5vcy1iaWciCisjZGVmaW5lIE1ZKE9QKSBDQVQoc3Vub3NfYmlnXyxPUCkKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJhb3V0LmgiCisKKy8qIFN0YXRpYyByb3V0aW5lcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgbG9uZyBzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKK3N0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgbG9uZyBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYworICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3Vub3NfbGlua19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKiwKKwkgICBiZmRfc2l6ZV90eXBlICosIGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX2FkZF9vbmVfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICosIGZsYWd3b3JkLCBhc2VjdGlvbiAqLAorCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOworc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9yZWxvY3MKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fc3RkX3JlbG9jcworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fZXh0X3JlbG9jcworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKK3N0YXRpYyBib29sZWFuIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOworc3RhdGljIGJvb2xlYW4gc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKKwkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSLCBiZmRfYnl0ZSAqLCBib29sZWFuICosCisJICAgYmZkX3ZtYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisKKyNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAorI2RlZmluZSBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCisjZGVmaW5lIE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIHN1bm9zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCisjZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCisjZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKKyNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzCisjZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIHN1bm9zX2FkZF9vbmVfc3ltYm9sCisjZGVmaW5lIE1ZX2xpbmtfZHluYW1pY19vYmplY3Qgc3Vub3NfbGlua19keW5hbWljX29iamVjdAorI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCBzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbAorI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MKKyNkZWZpbmUgTVlfZmluaXNoX2R5bmFtaWNfbGluayBzdW5vc19maW5pc2hfZHluYW1pY19saW5rCisKKy8qID8/PyBXaGVyZSBzaG91bGQgdGhpcyBnbz8gICovCisjZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSBcCisgICgoKG10eXBlKSA9PSBNX1NQQVJDICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIDApICE9IE5VTEwpIFwKKyAgIHx8ICgobXR5cGUpID09IE1fU1BBUkNMRVQgXAorICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0KSAhPSBOVUxMKSBcCisgICB8fCAoKG10eXBlKSA9PSBNX1NQQVJDTElURV9MRSBcCisgICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpICE9IE5VTEwpIFwKKyAgIHx8ICgoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkgXAorICAgICAgICYmIGJmZF9sb29rdXBfYXJjaCAoYmZkX2FyY2hfbTY4aywgMCkgIT0gTlVMTCkpCisKKy8qIEluY2x1ZGUgdGhlIHVzdWFsIGEub3V0IHN1cHBvcnQuICAqLworI2luY2x1ZGUgImFvdXRmMS5oIgorCisvKiBUaGUgU3VuT1MgNC4xLjQgL3Vzci9pbmNsdWRlL2xvY2FsZS5oIGRlZmluZXMgdmFsaWQgYXMgYSBtYWNyby4gICovCisjdW5kZWYgdmFsaWQKKworLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZQorICAgaW4gb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKS4gICovCisKK3N0cnVjdCBzdW5vc19keW5hbWljX2luZm8KK3sKKyAgLyogV2hldGhlciB3ZSBmb3VuZCBhbnkgZHluYW1pYyBpbmZvcm1hdGlvbi4gICovCisgIGJvb2xlYW4gdmFsaWQ7CisgIC8qIER5bmFtaWMgaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgZHluaW5mbzsKKyAgLyogTnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scy4gICovCisgIHVuc2lnbmVkIGxvbmcgZHluc3ltX2NvdW50OworICAvKiBSZWFkIGluIG5saXN0cyBmb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KKyAgc3RydWN0IGV4dGVybmFsX25saXN0ICpkeW5zeW07CisgIC8qIGFzeW1ib2wgc3RydWN0dXJlcyBmb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KKyAgYW91dF9zeW1ib2xfdHlwZSAqY2Fub25pY2FsX2R5bnN5bTsKKyAgLyogUmVhZCBpbiBkeW5hbWljIHN0cmluZyB0YWJsZS4gICovCisgIGNoYXIgKmR5bnN0cjsKKyAgLyogTnVtYmVyIG9mIGR5bmFtaWMgcmVsb2NzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBkeW5yZWxfY291bnQ7CisgIC8qIFJlYWQgaW4gZHluYW1pYyByZWxvY3MuICBUaGlzIG1heSBiZSByZWxvY19zdGRfZXh0ZXJuYWwgb3IKKyAgICAgcmVsb2NfZXh0X2V4dGVybmFsLiAgKi8KKyAgUFRSIGR5bnJlbDsKKyAgLyogYXJlbGVudCBzdHJ1Y3R1cmVzIGZvciBkeW5hbWljIHJlbG9jcy4gICovCisgIGFyZWxlbnQgKmNhbm9uaWNhbF9keW5yZWw7Cit9OworCisvKiBUaGUgaGFzaCB0YWJsZSBvZiBkeW5hbWljIHN5bWJvbHMgaXMgY29tcG9zZWQgb2YgdHdvIHdvcmQgZW50cmllcy4KKyAgIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oIGZvciBkZXRhaWxzLiAgKi8KKworI2RlZmluZSBIQVNIX0VOVFJZX1NJWkUgKDIgKiBCWVRFU19JTl9XT1JEKQorCisvKiBSZWFkIGluIHRoZSBiYXNpYyBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBsb2NhdGVzIHRoZSBfX0RZTkFNSUMKKyAgIHN0cnVjdHVyZSBhbmQgdXNlcyBpdCB0byBmaW5kIHRoZSBkeW5hbWljX2xpbmsgc3RydWN0dXJlLiAgSXQKKyAgIGNyZWF0ZXMgYW5kIHNhdmVzIGEgc3Vub3NfZHluYW1pY19pbmZvIHN0cnVjdHVyZS4gIElmIGl0IGNhbid0IGZpbmQKKyAgIF9fRFlOQU1JQywgaXQgc2V0cyB0aGUgdmFsaWQgZmllbGQgb2YgdGhlIHN1bm9zX2R5bmFtaWNfaW5mbworICAgc3RydWN0dXJlIHRvIGZhbHNlIHRvIGF2b2lkIGRvaW5nIHRoaXMgd29yayBhZ2Fpbi4gICovCisKK3N0YXRpYyBib29sZWFuCitzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOworICBhc2VjdGlvbiAqZHluc2VjOworICBiZmRfdm1hIGR5bm9mZjsKKyAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYyBkeW5pbmZvOworICB1bnNpZ25lZCBsb25nIGR5bnZlcjsKKyAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rIGxpbmtpbmZvOworCisgIGlmIChvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpICE9IChQVFIpIE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaW5mbyA9ICgoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKQorCSAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKSkpOworICBpZiAoIWluZm8pCisgICAgcmV0dXJuIGZhbHNlOworICBpbmZvLT52YWxpZCA9IGZhbHNlOworICBpbmZvLT5keW5zeW0gPSBOVUxMOworICBpbmZvLT5keW5zdHIgPSBOVUxMOworICBpbmZvLT5jYW5vbmljYWxfZHluc3ltID0gTlVMTDsKKyAgaW5mby0+ZHlucmVsID0gTlVMTDsKKyAgaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9IE5VTEw7CisgIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPSAoUFRSKSBpbmZvOworCisgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGxvb2sgZm9yIHRoZSBfX0RZTkFNSUMgc3ltYm9sIHRvIGxvY2F0ZSB0aGUgZHluYW1pYworICAgICBsaW5raW5nIGluZm9ybWF0aW9uLgorICAgICBIb3dldmVyIHRoaXMgaW5oaWJpdHMgcmVjb3ZlcmluZyB0aGUgZHluYW1pYyBzeW1ib2xzIGZyb20gYQorICAgICBzdHJpcHBlZCBvYmplY3QgZmlsZSwgc28gYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgZHluYW1pYyBsaW5raW5nCisgICAgIGluZm9ybWF0aW9uIGlzIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24uCisgICAgIFdlIGNvdWxkIHZlcmlmeSB0aGlzIGFzc3VtcHRpb24gbGF0ZXIgYnkgbG9va2luZyB0aHJvdWdoIHRoZSBkeW5hbWljCisgICAgIHN5bWJvbHMgZm9yIHRoZSBfX0RZTkFNSUMgc3ltYm9sLiAgKi8KKyAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCisgICAgcmV0dXJuIHRydWU7CisgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpLCAoUFRSKSAmZHluaW5mbywKKwkJCQkgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGR5bmluZm8pKQorICAgIHJldHVybiB0cnVlOworCisgIGR5bnZlciA9IEdFVF9XT1JEIChhYmZkLCBkeW5pbmZvLmxkX3ZlcnNpb24pOworICBpZiAoZHludmVyICE9IDIgJiYgZHludmVyICE9IDMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZHlub2ZmID0gR0VUX1dPUkQgKGFiZmQsIGR5bmluZm8ubGQpOworCisgIC8qIGR5bm9mZiBpcyBhIHZpcnR1YWwgYWRkcmVzcy4gIEl0IGlzIHByb2JhYmx5IGFsd2F5cyBpbiB0aGUgLmRhdGEKKyAgICAgc2VjdGlvbiwgYnV0IHRoaXMgY29kZSBzaG91bGQgd29yayBldmVuIGlmIGl0IG1vdmVzLiAgKi8KKyAgaWYgKGR5bm9mZiA8IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpCisgICAgZHluc2VjID0gb2JqX3RleHRzZWMgKGFiZmQpOworICBlbHNlCisgICAgZHluc2VjID0gb2JqX2RhdGFzZWMgKGFiZmQpOworICBkeW5vZmYgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgZHluc2VjKTsKKyAgaWYgKGR5bm9mZiA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGR5bnNlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogVGhpcyBleGVjdXRhYmxlIGFwcGVhcnMgdG8gYmUgZHluYW1pY2FsbHkgbGlua2VkIGluIGEgd2F5IHRoYXQgd2UKKyAgICAgY2FuIHVuZGVyc3RhbmQuICAqLworICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGR5bnNlYywgKFBUUikgJmxpbmtpbmZvLCBkeW5vZmYsCisJCQkJICAoYmZkX3NpemVfdHlwZSkgc2l6ZW9mIGxpbmtpbmZvKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBTd2FwIGluIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uICAqLworICBpbmZvLT5keW5pbmZvLmxkX2xvYWRlZCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9sb2FkZWQpOworICBpbmZvLT5keW5pbmZvLmxkX25lZWQgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfbmVlZCk7CisgIGluZm8tPmR5bmluZm8ubGRfcnVsZXMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcnVsZXMpOworICBpbmZvLT5keW5pbmZvLmxkX2dvdCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9nb3QpOworICBpbmZvLT5keW5pbmZvLmxkX3BsdCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9wbHQpOworICBpbmZvLT5keW5pbmZvLmxkX3JlbCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9yZWwpOworICBpbmZvLT5keW5pbmZvLmxkX2hhc2ggPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfaGFzaCk7CisgIGluZm8tPmR5bmluZm8ubGRfc3RhYiA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zdGFiKTsKKyAgaW5mby0+ZHluaW5mby5sZF9zdGFiX2hhc2ggPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3RhYl9oYXNoKTsKKyAgaW5mby0+ZHluaW5mby5sZF9idWNrZXRzID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2J1Y2tldHMpOworICBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3ltYm9scyk7CisgIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N5bWJfc2l6ZSk7CisgIGluZm8tPmR5bmluZm8ubGRfdGV4dCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF90ZXh0KTsKKyAgaW5mby0+ZHluaW5mby5sZF9wbHRfc3ogPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfcGx0X3N6KTsKKworICAvKiBSZXBvcnRlZGx5IHRoZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBvZmZzZXQgYnkgdGhlIHNpemUgb2YgdGhlCisgICAgIGV4ZWMgaGVhZGVyIGluIGFuIE5NQUdJQyBmaWxlLiAgKi8KKyAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSBuX21hZ2ljKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgZXhlY19ieXRlc19zaXplID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKKworICAgICAgaW5mby0+ZHluaW5mby5sZF9uZWVkICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKKyAgICAgIGluZm8tPmR5bmluZm8ubGRfcnVsZXMgKz0gZXhlY19ieXRlc19zaXplOworICAgICAgaW5mby0+ZHluaW5mby5sZF9yZWwgKz0gZXhlY19ieXRlc19zaXplOworICAgICAgaW5mby0+ZHluaW5mby5sZF9oYXNoICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKKyAgICAgIGluZm8tPmR5bmluZm8ubGRfc3RhYiArPSBleGVjX2J5dGVzX3NpemU7CisgICAgICBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMgKz0gZXhlY19ieXRlc19zaXplOworICAgIH0KKworICAvKiBUaGUgb25seSB3YXkgdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24gYXBwZWFycyB0bworICAgICBiZSB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gaXQgYW5kIHRoZSBzdHJpbmcgdGFibGUuICAqLworICBpbmZvLT5keW5zeW1fY291bnQgPSAoKGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyAtIGluZm8tPmR5bmluZm8ubGRfc3RhYikKKwkJCS8gRVhURVJOQUxfTkxJU1RfU0laRSk7CisgIEJGRF9BU1NFUlQgKGluZm8tPmR5bnN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUKKwkgICAgICA9PSAodW5zaWduZWQgbG9uZykgKGluZm8tPmR5bmluZm8ubGRfc3ltYm9scworCQkJCSAgLSBpbmZvLT5keW5pbmZvLmxkX3N0YWIpKTsKKworICAvKiBTaW1pbGFybHksIHRoZSByZWxvY3MgZW5kIGF0IHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgaW5mby0+ZHlucmVsX2NvdW50ID0gKChpbmZvLT5keW5pbmZvLmxkX2hhc2ggLSBpbmZvLT5keW5pbmZvLmxkX3JlbCkKKwkJCS8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKKyAgQkZEX0FTU0VSVCAoaW5mby0+ZHlucmVsX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpCisJICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5keW5pbmZvLmxkX2hhc2gKKwkJCQkgIC0gaW5mby0+ZHluaW5mby5sZF9yZWwpKTsKKworICBpbmZvLT52YWxpZCA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCisKK3N0YXRpYyBsb25nCitzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKKworICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCisgICAgcmV0dXJuIC0xOworCisgIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOworICBpZiAoISBpbmZvLT52YWxpZCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAoaW5mby0+ZHluc3ltX2NvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Cit9CisKKy8qIFJlYWQgdGhlIGV4dGVybmFsIGR5bmFtaWMgc3ltYm9scy4gICovCisKK3N0YXRpYyBib29sZWFuCitzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOworCisgIC8qIEdldCB0aGUgZ2VuZXJhbCBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCisJICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOworICBpZiAoISBpbmZvLT52YWxpZCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIEdldCB0aGUgZHluYW1pYyBubGlzdCBzdHJ1Y3R1cmVzLiAgKi8KKyAgaWYgKGluZm8tPmR5bnN5bSA9PSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwpCisgICAgeworICAgICAgaW5mby0+ZHluc3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKKwkJICAgICAgYmZkX2FsbG9jIChhYmZkLAorCQkJCSAoaW5mby0+ZHluc3ltX2NvdW50CisJCQkJICAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKSk7CisgICAgICBpZiAoaW5mby0+ZHluc3ltID09IE5VTEwgJiYgaW5mby0+ZHluc3ltX2NvdW50ICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3N0YWIsIFNFRUtfU0VUKSAhPSAwCisJICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnN5bSwgaW5mby0+ZHluc3ltX2NvdW50LAorCQkJRVhURVJOQUxfTkxJU1RfU0laRSwgYWJmZCkKKwkgICAgICAhPSBpbmZvLT5keW5zeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFKSkKKwl7CisJICBpZiAoaW5mby0+ZHluc3ltICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+ZHluc3ltKTsKKwkgICAgICBpbmZvLT5keW5zeW0gPSBOVUxMOworCSAgICB9CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBHZXQgdGhlIGR5bmFtaWMgc3RyaW5ncy4gICovCisgIGlmIChpbmZvLT5keW5zdHIgPT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBpbmZvLT5keW5zdHIgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplKTsKKyAgICAgIGlmIChpbmZvLT5keW5zdHIgPT0gTlVMTCAmJiBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzLCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5zdHIsIDEsIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplLAorCQkJYWJmZCkKKwkgICAgICAhPSBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSkpCisJeworCSAgaWYgKGluZm8tPmR5bnN0ciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmR5bnN0cik7CisJICAgICAgaW5mby0+ZHluc3RyID0gTlVMTDsKKwkgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCisKK3N0YXRpYyBsb25nCitzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN0b3JhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKnN0b3JhZ2U7Cit7CisgIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87CisgIHVuc2lnbmVkIGxvbmcgaTsKKworICBpZiAoISBzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkpCisgICAgcmV0dXJuIC0xOworCisgIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOworCisjaWZkZWYgQ0hFQ0tfRFlOQU1JQ19IQVNICisgIC8qIENoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZSBieSBtYWtpbmcgc3VyZQorICAgICB0aGF0IGVhY2ggc3ltYm9sIGNhbiBiZSBsb2NhdGVkIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgeworICAgIGJmZF9zaXplX3R5cGUgdGFibGVfc2l6ZTsKKyAgICBiZmRfYnl0ZSAqdGFibGU7CisgICAgYmZkX3NpemVfdHlwZSBpOworCisgICAgaWYgKGluZm8tPmR5bmluZm8ubGRfYnVja2V0cyA+IGluZm8tPmR5bnN5bV9jb3VudCkKKyAgICAgIGFib3J0ICgpOworICAgIHRhYmxlX3NpemUgPSBpbmZvLT5keW5pbmZvLmxkX3N0YWIgLSBpbmZvLT5keW5pbmZvLmxkX2hhc2g7CisgICAgdGFibGUgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAodGFibGVfc2l6ZSk7CisgICAgaWYgKHRhYmxlID09IE5VTEwgJiYgdGFibGVfc2l6ZSAhPSAwKQorICAgICAgYWJvcnQgKCk7CisgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX2hhc2gsIFNFRUtfU0VUKSAhPSAwCisJfHwgYmZkX3JlYWQgKChQVFIpIHRhYmxlLCAxLCB0YWJsZV9zaXplLCBhYmZkKSAhPSB0YWJsZV9zaXplKQorICAgICAgYWJvcnQgKCk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnN5bV9jb3VudDsgaSsrKQorICAgICAgeworCXVuc2lnbmVkIGNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCisJbmFtZSA9ICgodW5zaWduZWQgY2hhciAqKSBpbmZvLT5keW5zdHIKKwkJKyBHRVRfV09SRCAoYWJmZCwgaW5mby0+ZHluc3ltW2ldLmVfc3RyeCkpOworCWhhc2ggPSAwOworCXdoaWxlICgqbmFtZSAhPSAnXDAnKQorCSAgaGFzaCA9IChoYXNoIDw8IDEpICsgKm5hbWUrKzsKKwloYXNoICY9IDB4N2ZmZmZmZmY7CisJaGFzaCAlPSBpbmZvLT5keW5pbmZvLmxkX2J1Y2tldHM7CisJd2hpbGUgKEdFVF9XT1JEIChhYmZkLCB0YWJsZSArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpICE9IGkpCisJICB7CisJICAgIGhhc2ggPSBHRVRfV09SRCAoYWJmZCwKKwkJCSAgICAgdGFibGUgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFICsgQllURVNfSU5fV09SRCk7CisJICAgIGlmIChoYXNoID09IDAgfHwgaGFzaCA+PSB0YWJsZV9zaXplIC8gSEFTSF9FTlRSWV9TSVpFKQorCSAgICAgIGFib3J0ICgpOworCSAgfQorICAgICAgfQorICAgIGZyZWUgKHRhYmxlKTsKKyAgfQorI2VuZGlmIC8qIENIRUNLX0RZTkFNSUNfSEFTSCAqLworCisgIC8qIEdldCB0aGUgYXN5bWJvbCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGR5bmFtaWMgbmxpc3QKKyAgICAgc3RydWN0dXJlcy4gICovCisgIGlmIChpbmZvLT5jYW5vbmljYWxfZHluc3ltID09IChhb3V0X3N5bWJvbF90eXBlICopIE5VTEwpCisgICAgeworICAgICAgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKQorCQkJCWJmZF9hbGxvYyAoYWJmZCwKKwkJCQkJICAgKGluZm8tPmR5bnN5bV9jb3VudAorCQkJCQkgICAgKiBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKSkpOworICAgICAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPT0gTlVMTCAmJiBpbmZvLT5keW5zeW1fY291bnQgIT0gMCkKKwlyZXR1cm4gLTE7CisKKyAgICAgIGlmICghIGFvdXRfMzJfdHJhbnNsYXRlX3N5bWJvbF90YWJsZSAoYWJmZCwgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSwKKwkJCQkJICAgIGluZm8tPmR5bnN5bSwgaW5mby0+ZHluc3ltX2NvdW50LAorCQkJCQkgICAgaW5mby0+ZHluc3RyLAorCQkJCQkgICAgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUsCisJCQkJCSAgICB0cnVlKSkKKwl7CisJICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmNhbm9uaWNhbF9keW5zeW0pOworCSAgICAgIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPSBOVUxMOworCSAgICB9CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAvKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIGR5bmFtaWMgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnN5bV9jb3VudDsgaSsrKQorICAgICpzdG9yYWdlKysgPSAoYXN5bWJvbCAqKSAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSArIGkpOworICAqc3RvcmFnZSA9IE5VTEw7CisKKyAgcmV0dXJuIGluZm8tPmR5bnN5bV9jb3VudDsKK30KKworLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyByZWxvY3MuICAqLworCitzdGF0aWMgbG9uZworc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKKworICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCisgICAgcmV0dXJuIC0xOworCisgIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOworICBpZiAoISBpbmZvLT52YWxpZCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAoaW5mby0+ZHlucmVsX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Cit9CisKKy8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KKworc3RhdGljIGxvbmcKK3N1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBzdG9yYWdlLCBzeW1zKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFyZWxlbnQgKipzdG9yYWdlOworICAgICBhc3ltYm9sICoqc3ltczsKK3sKKyAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKKyAgdW5zaWduZWQgbG9uZyBpOworCisgIC8qIEdldCB0aGUgZ2VuZXJhbCBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgPT0gKFBUUikgTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyAoYWJmZCkpCisJcmV0dXJuIC0xOworICAgIH0KKworICBpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKKyAgaWYgKCEgaW5mby0+dmFsaWQpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBHZXQgdGhlIGR5bmFtaWMgcmVsb2MgaW5mb3JtYXRpb24uICAqLworICBpZiAoaW5mby0+ZHlucmVsID09IE5VTEwpCisgICAgeworICAgICAgaW5mby0+ZHlucmVsID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLAorCQkJCSAgICAgIChpbmZvLT5keW5yZWxfY291bnQKKwkJCQkgICAgICAgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpKTsKKyAgICAgIGlmIChpbmZvLT5keW5yZWwgPT0gTlVMTCAmJiBpbmZvLT5keW5yZWxfY291bnQgIT0gMCkKKwlyZXR1cm4gLTE7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfcmVsLCBTRUVLX1NFVCkgIT0gMAorCSAgfHwgKGJmZF9yZWFkICgoUFRSKSBpbmZvLT5keW5yZWwsIGluZm8tPmR5bnJlbF9jb3VudCwKKwkJCW9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSwgYWJmZCkKKwkgICAgICAhPSBpbmZvLT5keW5yZWxfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpKQorCXsKKwkgIGlmIChpbmZvLT5keW5yZWwgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5keW5yZWwpOworCSAgICAgIGluZm8tPmR5bnJlbCA9IE5VTEw7CisJICAgIH0KKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIC8qIEdldCB0aGUgYXJlbGVudCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGR5bmFtaWMgcmVsb2MKKyAgICAgaW5mb3JtYXRpb24uICAqLworICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9PSAoYXJlbGVudCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFyZWxlbnQgKnRvOworCisgICAgICBpbmZvLT5jYW5vbmljYWxfZHlucmVsID0gKChhcmVsZW50ICopCisJCQkJYmZkX2FsbG9jIChhYmZkLAorCQkJCQkgICAoaW5mby0+ZHlucmVsX2NvdW50CisJCQkJCSAgICAqIHNpemVvZiAoYXJlbGVudCkpKSk7CisgICAgICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnJlbCA9PSBOVUxMICYmIGluZm8tPmR5bnJlbF9jb3VudCAhPSAwKQorCXJldHVybiAtMTsKKyAgICAgIAorICAgICAgdG8gPSBpbmZvLT5jYW5vbmljYWxfZHlucmVsOworCisgICAgICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID09IFJFTE9DX0VYVF9TSVpFKQorCXsKKwkgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnA7CisJICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpwZW5kOworCisJICBwID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgaW5mby0+ZHlucmVsOworCSAgcGVuZCA9IHAgKyBpbmZvLT5keW5yZWxfY291bnQ7CisJICBmb3IgKDsgcCA8IHBlbmQ7IHArKywgdG8rKykKKwkgICAgTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgcCwgdG8sIHN5bXMsCisJCQkJCSAgaW5mby0+ZHluc3ltX2NvdW50KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcDsKKwkgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnBlbmQ7CisKKwkgIHAgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBpbmZvLT5keW5yZWw7CisJICBwZW5kID0gcCArIGluZm8tPmR5bnJlbF9jb3VudDsKKwkgIGZvciAoOyBwIDwgcGVuZDsgcCsrLCB0bysrKQorCSAgICBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBwLCB0bywgc3ltcywKKwkJCQkJICBpbmZvLT5keW5zeW1fY291bnQpOworCX0KKyAgICB9CisKKyAgLyogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSBkeW5hbWljIGFyZWxlbnQgc3RydWN0dXJlcy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5keW5yZWxfY291bnQ7IGkrKykKKyAgICAqc3RvcmFnZSsrID0gaW5mby0+Y2Fub25pY2FsX2R5bnJlbCArIGk7CisgICpzdG9yYWdlID0gTlVMTDsKKworICByZXR1cm4gaW5mby0+ZHlucmVsX2NvdW50OworfQorDAorLyogQ29kZSB0byBoYW5kbGUgbGlua2luZyBvZiBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKworLyogQSBTUEFSQyBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBpcyAxMiBieXRlcy4gIFRoZSBmaXJzdCBlbnRyeQorICAgaW4gdGhlIHRhYmxlIGlzIGEganVtcCB3aGljaCBpcyBmaWxsZWQgaW4gYnkgdGhlIHJ1bnRpbWUgbGlua2VyLgorICAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBicmFuY2hlcyBiYWNrIHRvIHRoZSBmaXJzdCBlbnRyeSwKKyAgIGZvbGxvd2VkIGJ5IGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24gdGFibGUgZW5jb2RlZCB0byBsb29rIGxpa2UKKyAgIGEgc2V0aGkgb2YgJWcwLiAgKi8KKworI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfU0laRSAoMTIpCisKK3N0YXRpYyBjb25zdCBiZmRfYnl0ZSBzcGFyY19wbHRfZmlyc3RfZW50cnlbU1BBUkNfUExUX0VOVFJZX1NJWkVdID0KK3sKKyAgLyogc2V0aGkgJWhpKDApLCVnMTsgYWRkcmVzcyBmaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIuICAqLworICAweDMsIDAsIDAsIDAsCisgIC8qIGptcCAlZzE7IG9mZnNldCBmaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIuICAqLworICAweDgxLCAweGMwLCAweDYwLCAwLAorICAvKiBub3AgKi8KKyAgMHgxLCAwLCAwLCAwCit9OworCisvKiBzYXZlICVzcCwgLTk2LCAlc3AgKi8KKyNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQwIDB4OWRlM2JmYTAKKy8qIGNhbGw7IGFkZHJlc3MgZmlsbGVkIGluIGxhdGVyLiAgKi8KKyNkZWZpbmUgU1BBUkNfUExUX0VOVFJZX1dPUkQxIDB4NDAwMDAwMDAKKy8qIHNldGhpOyByZWxvYyBpbmRleCBmaWxsZWQgaW4gbGF0ZXIuICAqLworI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDIgMHgwMTAwMDAwMAorCisvKiBUaGlzIHNlcXVlbmNlIGlzIHVzZWQgd2hlbiBmb3IgdGhlIGp1bXAgdGFibGUgZW50cnkgdG8gYSBkZWZpbmVkCisgICBzeW1ib2wgaW4gYSBjb21wbGV0ZSBleGVjdXRhYmxlLiAgSXQgaXMgdXNlZCB3aGVuIGxpbmtpbmcgUElDCisgICBjb21waWxlZCBjb2RlIHdoaWNoIGlzIG5vdCBiZWluZyBwdXQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKy8qIHNldGhpIDxhZGRyZXNzIHRvIGJlIGZpbGxlZCBpbiBsYXRlcj4sICVnMSAqLworI2RlZmluZSBTUEFSQ19QTFRfUElDX1dPUkQwIDB4MDMwMDAwMDAKKy8qIGptcCAlZzEgKyA8YWRkcmVzcyB0byBiZSBmaWxsZWQgaW4gbGF0ZXI+ICovCisjZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDEgMHg4MWMwNjAwMAorLyogbm9wICovCisjZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDIgMHgwMTAwMDAwMAorCisvKiBBbiBtNjhrIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGlzIDggYnl0ZXMuICBUaGUgZmlyc3QgZW50cnkKKyAgIGluIHRoZSB0YWJsZSBpcyBhIGp1bXAgd2hpY2ggaXMgZmlsbGVkIGluIHRoZSBieSB0aGUgcnVudGltZQorICAgbGlua2VyLiAgVGhlIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBicmFuY2hlcyBiYWNrIHRvIHRoZSBmaXJzdAorICAgZW50cnksIGZvbGxvd2VkIGJ5IGEgdHdvIGJ5dGUgaW5kZXggaW50byB0aGUgcmVsb2NhdGlvbiB0YWJsZS4gICovCisKKyNkZWZpbmUgTTY4S19QTFRfRU5UUllfU0laRSAoOCkKKworc3RhdGljIGNvbnN0IGJmZF9ieXRlIG02OGtfcGx0X2ZpcnN0X2VudHJ5W002OEtfUExUX0VOVFJZX1NJWkVdID0KK3sKKyAgLyogam1wcyBAIyAqLworICAweDRlLCAweGY5LAorICAvKiBGaWxsZWQgaW4gYnkgcnVudGltZSBsaW5rZXIgd2l0aCBhIG1hZ2ljIGFkZHJlc3MuICAqLworICAwLCAwLCAwLCAwLAorICAvKiBOb3QgdXNlZD8gICovCisgIDAsIDAKK307CisKKy8qIGJzcmwgKi8KKyNkZWZpbmUgTTY4S19QTFRfRU5UUllfV09SRDAgKDB4NjFmZikKKy8qIFJlbWFpbmluZyB3b3JkcyBmaWxsZWQgaW4gbGF0ZXIuICAqLworCisvKiBBbiBlbnRyeSBpbiB0aGUgU3VuT1MgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSByb290OworCisgIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIHN5bWJvbCwgdGhpcyBpcyBpdHMgaW5kZXggaW50byB0aGUgZHluYW1pYworICAgICBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGluaXRpYWxpemVkIHRvIC0xLiAgQXMgdGhlIGxpbmtlciBsb29rcyBhdAorICAgICB0aGUgaW5wdXQgZmlsZXMsIGl0IGNoYW5nZXMgdGhpcyB0byAtMiBpZiBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIEFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIHNlZW4sCisgICAgIHRoZSBsaW5rZXIgd2lsbCBrbm93IHdoZXRoZXIgdG8gYnVpbGQgYSBkeW5hbWljIHN5bWJvbCB0YWJsZTsgaWYKKyAgICAgaXQgZG9lcyBidWlsZCBvbmUsIHRoaXMgYmVjb21lcyB0aGUgaW5kZXggaW50byB0aGUgdGFibGUuICAqLworICBsb25nIGR5bmluZHg7CisKKyAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgbmFtZSBpbiB0aGUKKyAgICAgZHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KKyAgbG9uZyBkeW5zdHJfaW5kZXg7CisKKyAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHVzZWQgZm9yIHRoaXMgc3ltYm9sLiAgSWYKKyAgICAgdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgR09UIGVudHJ5LCB0aGlzIGlzIDAuICAqLworICBiZmRfdm1hIGdvdF9vZmZzZXQ7CisKKyAgLyogVGhlIG9mZnNldCBpbnRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB1c2VkIGZvciB0aGlzIHN5bWJvbC4KKyAgICAgSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgUExUIGVudHJ5LCB0aGlzIGlzIDAuICAqLworICBiZmRfdm1hIHBsdF9vZmZzZXQ7CisKKyAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLworICB1bnNpZ25lZCBjaGFyIGZsYWdzOworICAvKiBTeW1ib2wgaXMgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KKyNkZWZpbmUgU1VOT1NfUkVGX1JFR1VMQVIgMDEKKyAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCisjZGVmaW5lIFNVTk9TX0RFRl9SRUdVTEFSIDAyCisgIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLworI2RlZmluZSBTVU5PU19SRUZfRFlOQU1JQyAwNAorICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KKyNkZWZpbmUgU1VOT1NfREVGX0RZTkFNSUMgMDEwCisgIC8qIFN5bWJvbCBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KKyNkZWZpbmUgU1VOT1NfQ09OU1RSVUNUT1IgMDIwCit9OworCisvKiBUaGUgU3VuT1MgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlCit7CisgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OworCisgIC8qIFRoZSBvYmplY3Qgd2hpY2ggaG9sZHMgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLworICBiZmQgKmR5bm9iajsKKworICAvKiBXaGV0aGVyIHdlIGhhdmUgY3JlYXRlZCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisgIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOworCisgIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCisgIGJvb2xlYW4gZHluYW1pY19zZWN0aW9uc19uZWVkZWQ7CisKKyAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSAuZ290IHRhYmxlLiAgKi8KKyAgYm9vbGVhbiBnb3RfbmVlZGVkOworCisgIC8qIFRoZSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KKyAgc2l6ZV90IGR5bnN5bWNvdW50OworCisgIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCisgIHNpemVfdCBidWNrZXRjb3VudDsKKworICAvKiBUaGUgbGlzdCBvZiBkeW5hbWljIG9iamVjdHMgbmVlZGVkIGJ5IGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbgorICAgICB0aGUgbGluay4gICovCisgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkOworCisgIC8qIFRoZSBvZmZzZXQgb2YgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpbnRvIHRoZSAuZ290IHNlY3Rpb24uICAqLworICBiZmRfdm1hIGdvdF9iYXNlOworfTsKKworLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitzdW5vc19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikKKwkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKKworICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCisgIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKQorCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKKwkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPmR5bmluZHggPSAtMTsKKyAgICAgIHJldC0+ZHluc3RyX2luZGV4ID0gLTE7CisgICAgICByZXQtPmdvdF9vZmZzZXQgPSAwOworICAgICAgcmV0LT5wbHRfb2Zmc2V0ID0gMDsKKyAgICAgIHJldC0+ZmxhZ3MgPSAwOworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIENyZWF0ZSBhIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCitzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKnJldDsKKworICByZXQgPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikKKwkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgIGlmICghIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCkgKCZyZXQtPnJvb3QsIGFiZmQsCisJCQkJCSBzdW5vc19saW5rX2hhc2hfbmV3ZnVuYykpCisgICAgeworICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7CisgICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7CisgICAgfQorCisgIHJldC0+ZHlub2JqID0gTlVMTDsKKyAgcmV0LT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSBmYWxzZTsKKyAgcmV0LT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCA9IGZhbHNlOworICByZXQtPmdvdF9uZWVkZWQgPSBmYWxzZTsKKyAgcmV0LT5keW5zeW1jb3VudCA9IDA7CisgIHJldC0+YnVja2V0Y291bnQgPSAwOworICByZXQtPm5lZWRlZCA9IE5VTEw7CisgIHJldC0+Z290X2Jhc2UgPSAwOworCisgIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Cit9CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBzdW5vc19saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCisgICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBcCisgICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCisJCQkgIChmb2xsb3cpKSkKKworLyogVHJhdmVyc2UgYSBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIHN1bm9zX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCisgIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisKKy8qIEdldCB0aGUgU3VuT1MgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcworICAganVzdCBhIGNhc3QuICAqLworCisjZGVmaW5lIHN1bm9zX2hhc2hfdGFibGUocCkgKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQorCitzdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CisKKy8qIENyZWF0ZSB0aGUgZHluYW1pYyBzZWN0aW9ucyBuZWVkZWQgaWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhCisgICBkeW5hbWljIG9iamVjdCwgb3IgaWYgd2UgYXJlIGxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUuICBBQkZEIGlzIGEKKyAgIGJmZCB3ZSBjYW4gYXR0YWNoIHRoZSBkeW5hbWljIHNlY3Rpb25zIHRvLiAgVGhlIGxpbmtlciBzY3JpcHQgd2lsbAorICAgbG9vayBmb3IgdGhlc2Ugc3BlY2lhbCBzZWN0aW9ucyBuYW1lcyBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0CisgICBwbGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBTZWUgaW5jbHVkZS9hb3V0L3N1bjQuaCBmb3IgbW9yZSBkZXRhaWxzCisgICBvZiB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBuZWVkZWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gbmVlZGVkOworeworICBhc2VjdGlvbiAqczsKKworICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQorICAgIHsKKyAgICAgIGZsYWd3b3JkIGZsYWdzOworCisgICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKKworICAgICAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQorCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7CisKKyAgICAgIC8qIFRoZSAuZHluYW1pYyBzZWN0aW9uIGhvbGRzIHRoZSBiYXNpYyBkeW5hbWljIGluZm9ybWF0aW9uOiB0aGUKKwkgc3VuNF9keW5hbWljIHN0cnVjdHVyZSwgdGhlIGR5bmFtaWMgZGVidWdnZXIgaW5mb3JtYXRpb24sIGFuZAorCSB0aGUgc3VuNF9keW5hbWljX2xpbmsgc3RydWN0dXJlLiAgKi8KKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bmFtaWMiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBUaGUgLmdvdCBzZWN0aW9uIGhvbGRzIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVGhlIGFkZHJlc3MKKwkgaXMgcHV0IGluIHRoZSBsZF9nb3QgZmllbGQuICAqLworICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7CisgICAgICBpZiAocyA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogVGhlIC5wbHQgc2VjdGlvbiBob2xkcyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGUKKwkgYWRkcmVzcyBpcyBwdXQgaW4gdGhlIGxkX3BsdCBmaWVsZC4gICovCisgICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5wbHQiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19DT0RFKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFRoZSAuZHlucmVsIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgcmVsb2NzLiAgVGhlIGFkZHJlc3MgaXMKKwkgcHV0IGluIHRoZSBsZF9yZWwgZmllbGQuICAqLworICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHlucmVsIik7CisgICAgICBpZiAocyA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogVGhlIC5oYXNoIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgaGFzaCB0YWJsZS4gIFRoZSBhZGRyZXNzCisJIGlzIHB1dCBpbiB0aGUgbGRfaGFzaCBmaWVsZC4gICovCisgICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5oYXNoIik7CisgICAgICBpZiAocyA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogVGhlIC5keW5zeW0gc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVGhlIGFkZHJlc3MKKwkgaXMgcHV0IGluIHRoZSBsZF9zdGFiIGZpZWxkLiAgKi8KKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOworICAgICAgaWYgKHMgPT0gTlVMTAorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFRoZSAuZHluc3RyIHNlY3Rpb24gaG9sZHMgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZS4KKwkgVGhlIGFkZHJlc3MgaXMgcHV0IGluIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgKi8KKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN0ciIpOworICAgICAgaWYgKHMgPT0gTlVMTAorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgPSB0cnVlOworICAgIH0KKworICBpZiAoKG5lZWRlZCAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCkKKyAgICAgIHx8IGluZm8tPnNoYXJlZCkKKyAgICB7CisgICAgICBiZmQgKmR5bm9iajsKKworICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBpZiAocy0+X3Jhd19zaXplID09IDApCisJcy0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKKworICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkID0gdHJ1ZTsKKyAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBkeW5hbWljIHN5bWJvbHMgZHVyaW5nIGEgbGluay4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBhLm91dAorICAgYmFja2VuZCBsaW5rZXIgZm9yIGVhY2ggb2JqZWN0IGl0IGVuY291bnRlcnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbywgc3ltc3AsIHN5bV9jb3VudHAsIHN0cmluZ3NwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKipzeW1zcDsKKyAgICAgYmZkX3NpemVfdHlwZSAqc3ltX2NvdW50cDsKKyAgICAgY2hhciAqKnN0cmluZ3NwOworeworICBhc2VjdGlvbiAqczsKKyAgYmZkICpkeW5vYmo7CisgIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmRpbmZvOworICB1bnNpZ25lZCBsb25nIG5lZWQ7CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYWxsIHRoZSByZXF1aXJlZCBzZWN0aW9ucy4gICovCisgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCisgICAgeworICAgICAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sCisJCQkJCSAgICgoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAorCQkJCQkgICAgICYmICEgaW5mby0+cmVsb2NhdGVhYmxlKQorCQkJCQkgICAgPyB0cnVlCisJCQkJCSAgICA6IGZhbHNlKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gZm9yIGEgbm9ybWFsIG9iamVjdC4gICovCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisKKyAgLyogV2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUgc2VjdGlvbnMgaW4gYSBkeW5hbWljIG9iamVjdCBpbiB0aGUKKyAgICAgb3V0cHV0IGZpbGUuICBXZSBoYWNrIGJ5IHNpbXBseSBjbG9iYmVyaW5nIHRoZSBsaXN0IG9mIHNlY3Rpb25zCisgICAgIGluIHRoZSBCRkQuICBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgbW9yZSBjbGVhbmx5IGJ5LCBzYXksIGEgbmV3CisgICAgIHNlY3Rpb24gZmxhZzsgdGhlIGV4aXN0aW5nIFNFQ19ORVZFUl9MT0FEIGZsYWcgaXMgbm90IHRoZSBvbmUgd2UKKyAgICAgd2FudCwgYmVjYXVzZSB0aGF0IG9uZSBzdGlsbCBpbXBsaWVzIHRoYXQgdGhlIHNlY3Rpb24gdGFrZXMgdXAKKyAgICAgc3BhY2UgaW4gdGhlIG91dHB1dCBmaWxlLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3Qgb2JqZWN0IHdlIGhhdmUKKyAgICAgc2Vlbiwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgZHluYW1pYyBzZWN0aW9ucyB3ZSBqdXN0IGNyZWF0ZWQuICAqLworICBpZiAoYWJmZCAhPSBkeW5vYmopCisgICAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisKKyAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOworCSAgIChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMDsKKwkgICBzID0gcy0+bmV4dCkKKwk7CisgICAgICBhYmZkLT5zZWN0aW9ucyA9IHM7CisgICAgfQorCisgIC8qIFRoZSBuYXRpdmUgbGlua2VyIHNlZW1zIHRvIGp1c3QgaWdub3JlIGR5bmFtaWMgb2JqZWN0cyB3aGVuIC1yIGlzCisgICAgIHVzZWQuICAqLworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoIGRvZXMgbm90IGV4YWN0bHkKKyAgICAgbWF0Y2ggdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUuICAqLworICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgLm5lZWQgYW5kIGEgLnJ1bGVzIHNlY3Rpb25zLiAgVGhlc2UgYXJlIG9ubHkKKyAgICAgbmVlZGVkIGlmIHRoZXJlIHJlYWxseSBpcyBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLCBzbyB0aGV5CisgICAgIGFyZSBub3QgYWRkZWQgYnkgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLworICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIikgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGUgLm5lZWQgc2VjdGlvbiBob2xkcyB0aGUgbGlzdCBvZiBuYW1lcyBvZiBzaGFyZWQgb2JqZXRzCisJIHdoaWNoIG11c3QgYmUgaW5jbHVkZWQgYXQgcnVudGltZS4gIFRoZSBhZGRyZXNzIG9mIHRoaXMKKwkgc2VjdGlvbiBpcyBwdXQgaW4gdGhlIGxkX25lZWQgZmllbGQuICAqLworICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5uZWVkIik7CisgICAgICBpZiAocyA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLAorCQkJCSAgICAgIChTRUNfQUxMT0MKKwkJCQkgICAgICAgfCBTRUNfTE9BRAorCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkgICAgICAgfCBTRUNfSU5fTUVNT1JZCisJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZKSkKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCAyKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIikgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGUgLnJ1bGVzIHNlY3Rpb24gaG9sZHMgdGhlIHBhdGggdG8gc2VhcmNoIGZvciBzaGFyZWQKKwkgb2JqZWN0cy4gIFRoZSBhZGRyZXNzIG9mIHRoaXMgc2VjdGlvbiBpcyBwdXQgaW4gdGhlIGxkX3J1bGVzCisJIGZpZWxkLiAgKi8KKyAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucnVsZXMiKTsKKyAgICAgIGlmIChzID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsCisJCQkJICAgICAgKFNFQ19BTExPQworCQkJCSAgICAgICB8IFNFQ19MT0FECisJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUworCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKKwkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIDIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogUGljayB1cCB0aGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZXR1cm4gdGhlbSB0byB0aGUgY2FsbGVyLiAgKi8KKyAgaWYgKCEgc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBkaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7CisgICpzeW1zcCA9IGRpbmZvLT5keW5zeW07CisgICpzeW1fY291bnRwID0gZGluZm8tPmR5bnN5bV9jb3VudDsKKyAgKnN0cmluZ3NwID0gZGluZm8tPmR5bnN0cjsKKworICAvKiBSZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgYW55IG90aGVyIG9iamVjdHMgbmVlZGVkIGJ5IHRoaXMgb25lLiAgKi8KKyAgbmVlZCA9IGRpbmZvLT5keW5pbmZvLmxkX25lZWQ7CisgIHdoaWxlIChuZWVkICE9IDApCisgICAgeworICAgICAgYmZkX2J5dGUgYnVmWzE2XTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZSwgZmxhZ3M7CisgICAgICB1bnNpZ25lZCBzaG9ydCBtYWpvcl92bm8sIG1pbm9yX3ZubzsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqKnBwOworICAgICAgY2hhciAqbmFtZWJ1ZiwgKnA7CisgICAgICBzaXplX3QgYWxjOworICAgICAgYmZkX2J5dGUgYjsKKyAgICAgIGNoYXIgKm5hbWVjb3B5OworCisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5lZWQsIFNFRUtfU0VUKSAhPSAwCisJICB8fCBiZmRfcmVhZCAoYnVmLCAxLCAxNiwgYWJmZCkgIT0gMTYpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBGb3IgdGhlIGZvcm1hdCBvZiBhbiBsZF9uZWVkIGVudHJ5LCBzZWUgYW91dC9zdW40LmguICBXZQorICAgICAgICAgc2hvdWxkIHByb2JhYmx5IGRlZmluZSBzdHJ1Y3RzIGZvciB0aGlzIG1hbmlwdWxhdGlvbi4gICovCisKKyAgICAgIG5hbWUgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYpOworICAgICAgZmxhZ3MgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYgKyA0KTsKKyAgICAgIG1ham9yX3ZubyA9ICh1bnNpZ25lZCBzaG9ydCliZmRfZ2V0XzE2IChhYmZkLCBidWYgKyA4KTsKKyAgICAgIG1pbm9yX3ZubyA9ICh1bnNpZ25lZCBzaG9ydCliZmRfZ2V0XzE2IChhYmZkLCBidWYgKyAxMCk7CisgICAgICBuZWVkID0gYmZkX2dldF8zMiAoYWJmZCwgYnVmICsgMTIpOworCisgICAgICBuZWVkZWQgPSAoKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKQorCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0KSkpOworICAgICAgaWYgKG5lZWRlZCA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG5lZWRlZC0+YnkgPSBhYmZkOworCisgICAgICAvKiBXZSByZXR1cm4gdGhlIG5hbWUgYXMgWy1sXW5hbWVbLm1hal1bLm1pbl0uICAqLworICAgICAgYWxjID0gMzA7CisgICAgICBuYW1lYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7CisgICAgICBpZiAobmFtZWJ1ZiA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHAgPSBuYW1lYnVmOworCisgICAgICBpZiAoKGZsYWdzICYgMHg4MDAwMDAwMCkgIT0gMCkKKwl7CisJICAqcCsrID0gJy0nOworCSAgKnArKyA9ICdsJzsKKwl9CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5hbWUsIFNFRUtfU0VUKSAhPSAwKQorCXsKKwkgIGZyZWUgKG5hbWVidWYpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgZG8KKwl7CisJICBpZiAoYmZkX3JlYWQgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQorCSAgICB7CisJICAgICAgZnJlZSAobmFtZWJ1Zik7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIGlmICgoc2l6ZV90KSAocCAtIG5hbWVidWYpID49IGFsYykKKwkgICAgeworCSAgICAgIGNoYXIgKm47CisKKwkgICAgICBhbGMgKj0gMjsKKwkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKG5hbWVidWYsIGFsYyArIDEpOworCSAgICAgIGlmIChuID09IE5VTEwpCisJCXsKKwkJICBmcmVlIChuYW1lYnVmKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICBwID0gbiArIChwIC0gbmFtZWJ1Zik7CisJICAgICAgbmFtZWJ1ZiA9IG47CisJICAgIH0KKworCSAgKnArKyA9IGI7CisJfQorICAgICAgd2hpbGUgKGIgIT0gJ1wwJyk7CisKKyAgICAgIGlmIChtYWpvcl92bm8gPT0gMCkKKwkqcCA9ICdcMCc7CisgICAgICBlbHNlCisJeworCSAgY2hhciBtYWpidWZbMzBdOworCSAgY2hhciBtaW5idWZbMzBdOworCisJICBzcHJpbnRmIChtYWpidWYsICIuJWQiLCBtYWpvcl92bm8pOworCSAgaWYgKG1pbm9yX3ZubyA9PSAwKQorCSAgICBtaW5idWZbMF0gPSAnXDAnOworCSAgZWxzZQorCSAgICBzcHJpbnRmIChtaW5idWYsICIuJWQiLCBtaW5vcl92bm8pOworCisJICBpZiAoKHAgLSBuYW1lYnVmKSArIHN0cmxlbiAobWFqYnVmKSArIHN0cmxlbiAobWluYnVmKSA+PSBhbGMpCisJICAgIHsKKwkgICAgICBjaGFyICpuOworCisJICAgICAgYWxjID0gKHAgLSBuYW1lYnVmKSArIHN0cmxlbiAobWFqYnVmKSArIHN0cmxlbiAobWluYnVmKTsKKwkgICAgICBuID0gKGNoYXIgKikgYmZkX3JlYWxsb2MgKG5hbWVidWYsIGFsYyArIDEpOworCSAgICAgIGlmIChuID09IE5VTEwpCisJCXsKKwkJICBmcmVlIChuYW1lYnVmKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICBwID0gbiArIChwIC0gbmFtZWJ1Zik7CisJICAgICAgbmFtZWJ1ZiA9IG47CisJICAgIH0KKworCSAgc3RyY3B5IChwLCBtYWpidWYpOworCSAgc3RyY2F0IChwLCBtaW5idWYpOworCX0KKworICAgICAgbmFtZWNvcHkgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAobmFtZWJ1ZikgKyAxKTsKKyAgICAgIGlmIChuYW1lY29weSA9PSBOVUxMKQorCXsKKwkgIGZyZWUgKG5hbWVidWYpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHN0cmNweSAobmFtZWNvcHksIG5hbWVidWYpOworICAgICAgZnJlZSAobmFtZWJ1Zik7CisgICAgICBuZWVkZWQtPm5hbWUgPSBuYW1lY29weTsKKworICAgICAgbmVlZGVkLT5uZXh0ID0gTlVMTDsKKworICAgICAgZm9yIChwcCA9ICZzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOworCSAgICpwcCAhPSBOVUxMOworCSAgIHBwID0gJigqcHApLT5uZXh0KQorCTsKKyAgICAgICpwcCA9IG5lZWRlZDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcworICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQorICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCisKK3N0YXRpYyBib29sZWFuCitzdW5vc19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCisJCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBmbGFnd29yZCBmbGFnczsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgYm9vbGVhbiBjb3B5OworICAgICBib29sZWFuIGNvbGxlY3Q7CisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Cit7CisgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7CisgIGludCBuZXdfZmxhZzsKKworICBpZiAoKGZsYWdzICYgKEJTRl9JTkRJUkVDVCB8IEJTRl9XQVJOSU5HIHwgQlNGX0NPTlNUUlVDVE9SKSkgIT0gMAorICAgICAgfHwgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQorICAgIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgY29weSwKKwkJCQlmYWxzZSk7CisgIGVsc2UKKyAgICBoID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopCisJIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKSk7CisgIGlmIChoID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChoYXNocCAhPSBOVUxMKQorICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOworCisgIC8qIFRyZWF0IGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlIC5ic3MKKyAgICAgc2VjdGlvbiBvZiB0aGUgZHluYW1pYyBvYmplY3QuICBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIHNwYWNlCisgICAgIGZvciBpdCBpbiBvdXIgcHJvY2VzcyBpbWFnZS4gICovCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCisgICAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQorICAgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKKworICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCisgICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX25ldworICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKyAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICB7CisgICAgICAvKiBXZSBhcmUgZGVmaW5pbmcgdGhlIHN5bWJvbCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZC4gIFRoaXMKKwkgaXMgYSBwb3RlbnRpYWwgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gICovCisgICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKwl7CisJICAvKiBUaGUgZGVmaW5pdGlvbiB3ZSBhcmUgYWRkaW5nIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4KKwkgICAgIFdlIGRvIG5vdCB3YW50IHRoaXMgbmV3IGRlZmluaXRpb24gdG8gb3ZlcnJpZGUgdGhlCisJICAgICBleGlzdGluZyBkZWZpbml0aW9uLCBzbyB3ZSBwcmV0ZW5kIGl0IGlzIGp1c3QgYQorCSAgICAgcmVmZXJlbmNlLiAgKi8KKwkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCX0KKyAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgICAmJiBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgIT0gTlVMTAorCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCisJeworCSAgLyogVGhlIGV4aXN0aW5nIGRlZmluaXRpb24gaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgV2UKKwkgICAgIHdhbnQgdG8gb3ZlcnJpZGUgaXQgd2l0aCB0aGUgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLgorCSAgICAgQ2xvYmJlciB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbi4gICovCisJICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOworCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKKwl9CisgICAgICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgorCSAgICAgICAmJiAoaC0+cm9vdC5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorCXsKKwkgIC8qIFRoZSBleGlzdGluZyBkZWZpbml0aW9uIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIFdlCisJICAgICB3YW50IHRvIG92ZXJyaWRlIGl0IHdpdGggdGhlIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4KKwkgICAgIENsb2JiZXIgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24uICBXZSBjYW4ndCBzZXQgaXQgdG8gbmV3LAorCSAgICAgYmVjYXVzZSBpdCBpcyBvbiB0aGUgdW5kZWZpbmVkIGxpc3QuICAqLworCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKKwkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyOworCX0KKyAgICB9CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKKyAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcgorICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfQ09OU1RSVUNUT1IpICE9IDApCisgICAgeworICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbCwgYW5kIHRoaXMgc3ltYm9sCisgICAgICAgICBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBBIGNvbnN0cnVjdG9yIHN5bWJvbCBpcyBhY3R1YWxseSBhCisgICAgICAgICBkZWZpbml0aW9uLCBhbHRob3VnaCB0aGUgdHlwZSB3aWxsIGJlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisgICAgICAgICBhdCB0aGlzIHBvaW50LiAgV2Ugd2FudCB0byBpZ25vcmUgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUKKyAgICAgICAgIGR5bmFtaWMgb2JqZWN0LiAgKi8KKyAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworICAgIH0KKyAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0NPTlNUUlVDVE9SKSAhPSAwCisJICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAorCSAgICYmIGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCisJICAgJiYgKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgdGhpcworICAgICAgICAgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wuICBBcyBhYm92ZSwgd2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlCisgICAgICAgICBvZiB0aGUgY29uc3RydWN0b3Igc3ltYm9sIGZyb20gdGhlIHJlZ3VsYXIgb2JqZWN0LiAgKi8KKyAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9uZXc7CisgICAgfQorCisgIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCisgIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKKwkJCQkJICB2YWx1ZSwgc3RyaW5nLCBjb3B5LCBjb2xsZWN0LAorCQkJCQkgIGhhc2hwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKKyAgICB7CisgICAgICAvKiBTZXQgYSBmbGFnIGluIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGluZGljYXRpbmcgdGhlIHR5cGUgb2YKKwkgcmVmZXJlbmNlIG9yIGRlZmluaXRpb24gd2UganVzdCBmb3VuZC4gIEtlZXAgYSBjb3VudCBvZiB0aGUKKwkgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyB3ZSBmaW5kLiAgQSBkeW5hbWljIHN5bWJvbCBpcyBvbmUKKwkgd2hpY2ggaXMgcmVmZXJlbmNlZCBvciBkZWZpbmVkIGJ5IGJvdGggYSByZWd1bGFyIG9iamVjdCBhbmQgYQorCSBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorCXsKKwkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQorCSAgICBuZXdfZmxhZyA9IFNVTk9TX1JFRl9SRUdVTEFSOworCSAgZWxzZQorCSAgICBuZXdfZmxhZyA9IFNVTk9TX0RFRl9SRUdVTEFSOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKKwkgICAgbmV3X2ZsYWcgPSBTVU5PU19SRUZfRFlOQU1JQzsKKwkgIGVsc2UKKwkgICAgbmV3X2ZsYWcgPSBTVU5PU19ERUZfRFlOQU1JQzsKKwl9CisgICAgICBoLT5mbGFncyB8PSBuZXdfZmxhZzsKKworICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEKKwkgICYmIChoLT5mbGFncyAmIChTVU5PU19ERUZfUkVHVUxBUiB8IFNVTk9TX1JFRl9SRUdVTEFSKSkgIT0gMCkKKwl7CisJICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKKwkgIGgtPmR5bmluZHggPSAtMjsKKwl9CisKKyAgICAgIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKKwkgICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCisJaC0+ZmxhZ3MgfD0gU1VOT1NfQ09OU1RSVUNUT1I7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBuZWVkZWQgYnkgQkZELiAgKi8KKworLypBUkdTVVNFRCovCitzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKgorYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gJk1ZKHZlYykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOworfQorCisvKiBSZWNvcmQgYW4gYXNzaWdubWVudCBtYWRlIHRvIGEgc3ltYm9sIGJ5IGEgbGlua2VyIHNjcmlwdC4gIFdlIG5lZWQKKyAgIHRoaXMgaW4gY2FzZSBzb21lIGR5bmFtaWMgb2JqZWN0IHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCisKK2Jvb2xlYW4KK2JmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOworCisgIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIGhhdmUgZXhhbWluZWQgYWxsIHRoZSBpbnB1dCBvYmplY3RzLiAgSWYKKyAgICAgdGhlIHN5bWJvbCBkb2VzIG5vdCBleGlzdCwgaXQgbWVyZWx5IG1lYW5zIHRoYXQgbm8gb2JqZWN0IHJlZmVycworICAgICB0byBpdCwgYW5kIHdlIGNhbiBqdXN0IGlnbm9yZSBpdCBhdCB0aGlzIHBvaW50LiAgKi8KKyAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAorCQkJICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIGlmIChoID09IE5VTEwpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSW4gYSBzaGFyZWQgbGlicmFyeSwgdGhlIF9fRFlOQU1JQyBzeW1ib2wgZG9lcyBub3QgYXBwZWFyIGluIHRoZQorICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZS4gICovCisgIGlmICghIGluZm8tPnNoYXJlZCB8fCBzdHJjbXAgKG5hbWUsICJfX0RZTkFNSUMiKSAhPSAwKQorICAgIHsKKyAgICAgIGgtPmZsYWdzIHw9IFNVTk9TX0RFRl9SRUdVTEFSOworCisgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKKwkgIGgtPmR5bmluZHggPSAtMjsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucyBjcmVhdGVkIGluCisgICBzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFN1bk9TIGxpbmtlcgorICAgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZXMgb2YgdGhlCisgICBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHZhcmlvdXMKKyAgIHNlY3Rpb25zLiAgVGhpcyB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHJlYWRpbmcgYWxsIHRoZSByZWxvY3Mgc28KKyAgIHRoYXQgd2UgY2FuIHdvcmsgb3V0IHdoaWNoIG9uZXMgbmVlZCB0byBiZWNvbWUgZHluYW1pYyByZWxvY3MuICBJZgorICAgaW5mby0+a2VlcF9tZW1vcnkgaXMgdHJ1ZSwgd2Uga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeTsgb3RoZXJ3aXNlLAorICAgd2UgZGlzY2FyZCB0aGVtLCBhbmQgd2lsbCByZWFkIHRoZW0gYWdhaW4gbGF0ZXIuICAqLworCitib29sZWFuCitiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvLCBzZHlucHRyLCBzbmVlZHB0ciwKKwkJCQkgc3J1bGVzcHRyKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBhc2VjdGlvbiAqKnNkeW5wdHI7CisgICAgIGFzZWN0aW9uICoqc25lZWRwdHI7CisgICAgIGFzZWN0aW9uICoqc3J1bGVzcHRyOworeworICBiZmQgKmR5bm9iajsKKyAgc2l6ZV90IGR5bnN5bWNvdW50OworICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoOworICBhc2VjdGlvbiAqczsKKyAgc2l6ZV90IGJ1Y2tldGNvdW50OworICBzaXplX3QgaGFzaGFsbG9jOworICBzaXplX3QgaTsKKyAgYmZkICpzdWI7CisKKyAgKnNkeW5wdHIgPSBOVUxMOworICAqc25lZWRwdHIgPSBOVUxMOworICAqc3J1bGVzcHRyID0gTlVMTDsKKworICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGlucHV0IEJGRCdzIGFuZCByZWFkIHRoZWlyIHJlbG9jcy4gIEl0IHdvdWxkCisgICAgIGJlIGJldHRlciBpZiB3ZSBkaWRuJ3QgaGF2ZSB0byBkbyB0aGlzLCBidXQgdGhlcmUgaXMgbm8gb3RoZXIgd2F5CisgICAgIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgcmVsb2NzIHdlIG5lZWQsIGFuZCwgbW9yZQorICAgICBpbXBvcnRhbnRseSwgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQKKyAgICAgZ2V0IGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCisgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQorICAgIHsKKyAgICAgIGlmICgoc3ViLT5mbGFncyAmIERZTkFNSUMpID09IDAKKwkgICYmIHN1Yi0+eHZlYyA9PSBvdXRwdXRfYmZkLT54dmVjKQorCXsKKwkgIGlmICghIHN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBzdWIsIG9ial90ZXh0c2VjIChzdWIpLAorCQkJCSAgIGV4ZWNfaGRyIChzdWIpLT5hX3Ryc2l6ZSkKKwkgICAgICB8fCAhIHN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBzdWIsIG9ial9kYXRhc2VjIChzdWIpLAorCQkJCSAgICAgIGV4ZWNfaGRyIChzdWIpLT5hX2Ryc2l6ZSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgIGR5bnN5bWNvdW50ID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OworCisgIC8qIElmIHRoZXJlIHdlcmUgbm8gZHluYW1pYyBvYmplY3RzIGluIHRoZSBsaW5rLCBhbmQgd2UgZG9uJ3QgbmVlZAorICAgICB0byBidWlsZCBhIGdsb2JhbCBvZmZzZXQgdGFibGUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZS4gICovCisgIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZAorICAgICAgJiYgISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBJZiBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIHdhcyBtZW50aW9uZWQsIGRlZmluZSBpdC4gICovCisgIGggPSBzdW5vc19saW5rX2hhc2hfbG9va3VwIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICAgICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgIGlmIChoICE9IE5VTEwgJiYgKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApCisgICAgeworICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7CisgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKKwl7CisJICArK3N1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKKwkgIGgtPmR5bmluZHggPSAtMjsKKwl9CisgICAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKKyAgICAgIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKworICAgICAgLyogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlIHRoYW4gMHgxMDAwIGJ5dGVzLCB3ZSBzZXQKKyAgICAgICAgIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gYmUgMHgxMDAwIGJ5dGVzIGludG8gdGhlIHNlY3Rpb24sCisgICAgICAgICBzbyB0aGF0IDEzIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBpZiAocy0+X3Jhd19zaXplID49IDB4MTAwMCkKKwloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7CisgICAgICBlbHNlCisJaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gMDsKKworICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9iYXNlID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOworICAgIH0KKworICAvKiBJZiB0aGVyZSBhcmUgYW55IHNoYXJlZCBvYmplY3RzIGluIHRoZSBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gc2V0CisgICAgIHVwIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLworICBpZiAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkKQorICAgIHsKKyAgICAgICpzZHlucHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7CisKKyAgICAgIC8qIFRoZSAuZHluYW1pYyBzZWN0aW9uIGlzIGFsd2F5cyB0aGUgc2FtZSBzaXplLiAgKi8KKyAgICAgIHMgPSAqc2R5bnB0cjsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgPSAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljKQorCQkgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFCisJCSAgICAgICsgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmspKTsKKworICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuZHluc3ltIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFdlIGNvdW50ZWQKKwkgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgYXMgd2UgcmVhZCB0aGUgaW5wdXQgZmlsZXMuICBXZQorCSB3aWxsIGJ1aWxkIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSAoLmR5bnN5bSkgYW5kIHRoZSBoYXNoCisJIHRhYmxlICguaGFzaCkgd2hlbiB3ZSBidWlsZCB0aGUgZmluYWwgc3ltYm9sIHRhYmxlLCBiZWNhdXNlCisJIHVudGlsIHRoZW4gd2UgZG8gbm90IGtub3cgdGhlIGNvcnJlY3QgdmFsdWUgdG8gZ2l2ZSB0aGUKKwkgc3ltYm9scy4gIFdlIGJ1aWxkIHRoZSBkeW5hbWljIHN5bWJvbCBzdHJpbmcgdGFibGUgKC5keW5zdHIpCisJIGluIGEgdHJhdmVyc2FsIG9mIHRoZSBzeW1ib2wgdGFibGUgdXNpbmcKKwkgc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbC4gICovCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKKyAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIAorICAgICAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGlzIGp1c3QgdGhlIG51bWJlciBvZiBzeW1ib2xzIGRpdmlkZWQKKwkgYnkgZm91ci4gIFRvIGNvbXB1dGUgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGhhc2ggdGFibGUsIHdlCisJIG11c3QgYWN0dWFsbHkgY29tcHV0ZSB0aGUgaGFzaCB0YWJsZS4gIE5vcm1hbGx5IHdlIG5lZWQKKwkgZXhhY3RseSBhcyBtYW55IGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUgYXMgdGhlcmUgYXJlCisJIGR5bmFtaWMgc3ltYm9scywgYnV0IGlmIHNvbWUgb2YgdGhlIGJ1Y2tldHMgYXJlIG5vdCB1c2VkIHdlCisJIHdpbGwgbmVlZCBhZGRpdGlvbmFsIGVudHJpZXMuICBJbiB0aGUgd29yc3QgY2FzZSwgZXZlcnkKKwkgc3ltYm9sIHdpbGwgaGFzaCB0byB0aGUgc2FtZSBidWNrZXQsIGFuZCB3ZSB3aWxsIG5lZWQKKwkgQlVDS0VUQ09VTlQgLSAxIGV4dHJhIGVudHJpZXMuICAqLworICAgICAgaWYgKGR5bnN5bWNvdW50ID49IDQpCisJYnVja2V0Y291bnQgPSBkeW5zeW1jb3VudCAvIDQ7CisgICAgICBlbHNlIGlmIChkeW5zeW1jb3VudCA+IDApCisJYnVja2V0Y291bnQgPSBkeW5zeW1jb3VudDsKKyAgICAgIGVsc2UKKwlidWNrZXRjb3VudCA9IDE7CisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgaGFzaGFsbG9jID0gKGR5bnN5bWNvdW50ICsgYnVja2V0Y291bnQgLSAxKSAqIEhBU0hfRU5UUllfU0laRTsKKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBoYXNoYWxsb2MpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgZHluc3ltY291bnQgPiAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIGhhc2hhbGxvYyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0Y291bnQ7IGkrKykKKwlQVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIC0xLCBzLT5jb250ZW50cyArIGkgKiBIQVNIX0VOVFJZX1NJWkUpOworICAgICAgcy0+X3Jhd19zaXplID0gYnVja2V0Y291bnQgKiBIQVNIX0VOVFJZX1NJWkU7CisKKyAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCA9IGJ1Y2tldGNvdW50OworCisgICAgICAvKiBTY2FuIGFsbCB0aGUgc3ltYm9scywgcGxhY2UgdGhlbSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsCisJIGFuZCBidWlsZCB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgV2UgcmV1c2UgZHluc3ltY291bnQgYXMgYQorCSBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgd2UgaGF2ZSBhZGRlZCBzbyBmYXIuICAqLworICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gMDsKKyAgICAgIHN1bm9zX2xpbmtfaGFzaF90cmF2ZXJzZSAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCwKKwkJCQkoUFRSKSBpbmZvKTsKKyAgICAgIEJGRF9BU1NFUlQgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9PSBkeW5zeW1jb3VudCk7CisKKyAgICAgIC8qIFRoZSBTdW5PUyBuYXRpdmUgbGlua2VyIHNlZW1zIHRvIGFsaWduIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorCSBzeW1ib2wgc3RyaW5ncyB0byBhIG11bHRpcGxlIG9mIDguICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcworCSBpbXBvcnRhbnQsIGJ1dCBpdCBjYW4ndCBodXJ0IG11Y2guICAqLworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgaWYgKChzLT5fcmF3X3NpemUgJiA3KSAhPSAwKQorCXsKKwkgIGJmZF9zaXplX3R5cGUgYWRkOworCSAgYmZkX2J5dGUgKmNvbnRlbnRzOworCisJICBhZGQgPSA4IC0gKHMtPl9yYXdfc2l6ZSAmIDcpOworCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLAorCQkJCQkgICAgICAgKHNpemVfdCkgKHMtPl9yYXdfc2l6ZSArIGFkZCkpOworCSAgaWYgKGNvbnRlbnRzID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIG1lbXNldCAoY29udGVudHMgKyBzLT5fcmF3X3NpemUsIDAsIChzaXplX3QpIGFkZCk7CisJICBzLT5jb250ZW50cyA9IGNvbnRlbnRzOworCSAgcy0+X3Jhd19zaXplICs9IGFkZDsKKwl9CisgICAgfQorCisgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd29ya2VkIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlCisgICAgIHRhYmxlIGFuZCB0aGUgZHluYW1pYyByZWxvY3MsIGFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZW0uICAqLworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUuICAqLworICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGR5bm9iaikpCisJeworCWNhc2UgYmZkX2FyY2hfc3BhcmM6CisJICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBzcGFyY19wbHRfZmlyc3RfZW50cnksIFNQQVJDX1BMVF9FTlRSWV9TSVpFKTsKKwkgIGJyZWFrOworCisJY2FzZSBiZmRfYXJjaF9tNjhrOgorCSAgbWVtY3B5IChzLT5jb250ZW50cywgbTY4a19wbHRfZmlyc3RfZW50cnksIE02OEtfUExUX0VOVFJZX1NJWkUpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKKyAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IG9mIHRoZQorICAgICByZWxvY3Mgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KKyAgcy0+cmVsb2NfY291bnQgPSAwOworCisgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoZHlub2JqLCBzLT5fcmF3X3NpemUpOworICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKnNuZWVkcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7CisgICpzcnVsZXNwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJ1bGVzIik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitzdW5vc19zY2FuX3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLCByZWxfc2l6ZSkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKK3sKKyAgUFRSIHJlbG9jczsKKyAgUFRSIGZyZWVfcmVsb2NzID0gTlVMTDsKKworICBpZiAocmVsX3NpemUgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKKyAgICByZWxvY3MgPSBmcmVlX3JlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKm47CisKKyAgICAgIG4gPSAoKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKKwkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCkpKTsKKyAgICAgIGlmIChuID09IE5VTEwpCisJcmVsb2NzID0gTlVMTDsKKyAgICAgIGVsc2UKKwl7CisJICBzZXRfYW91dF9zZWN0aW9uX2RhdGEgKHNlYywgbik7CisJICByZWxvY3MgPSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxfc2l6ZSk7CisJICBhb3V0X3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gcmVsb2NzOworCX0KKyAgICB9CisgIGlmIChyZWxvY3MgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWMtPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3JlYWQgKHJlbG9jcywgMSwgcmVsX3NpemUsIGFiZmQpICE9IHJlbF9zaXplKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfU1REX1NJWkUpCisgICAgeworICAgICAgaWYgKCEgc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsCisJCQkJICAgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzLAorCQkJCSAgIHJlbF9zaXplKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBzdW5vc19zY2FuX2V4dF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKKwkJCQkgICAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3MsCisJCQkJICAgcmVsX3NpemUpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmcmVlX3JlbG9jcyk7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQorICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24gdXNpbmcgc3RhbmRhcmQgcmVsb2NzLiAgV2UKKyAgIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBkeW5hbWljCisgICBzeW1ib2wuICBJZiB0aGUgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLCBhbiBlbnRyeSBpcyBtYWRlIGluCisgICB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGRvIHRoZSB3cm9uZworICAgdGhpbmcgaWYgdGhlIHN5bWJvbCBpcyBhY3R1YWxseSBkYXRhOyBJIGRvbid0IHRoaW5rIHRoZSBTdW4gMworICAgbmF0aXZlIGxpbmtlciBoYW5kbGVzIHRoaXMgY2FzZSBjb3JyZWN0bHkgZWl0aGVyLiAgSWYgdGhlIHN5bWJvbCBpcworICAgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSByZWxvYyBhcyBhIGR5bmFtaWMKKyAgIHJlbG9jLiAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGhhbmRsZSB0aGUgUElDIHJlbG9jcyBoZXJlIGJ5CisgICBidWlsZGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJpZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbG9jcywgcmVsX3NpemUpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKKyAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKK3sKKyAgYmZkICpkeW5vYmo7CisgIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKKyAgYXNlY3Rpb24gKnNyZWwgPSBOVUxMOworICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKKyAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsLCAqcmVsZW5kOworCisgIC8qIFdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIG02OGsgcGx0IGVudHJpZXMuICAqLworICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9tNjhrKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGR5bm9iaiA9IE5VTEw7CisKKyAgc3ltX2hhc2hlcyA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqKSBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKTsKKworICByZWxlbmQgPSByZWxvY3MgKyByZWxfc2l6ZSAvIFJFTE9DX1NURF9TSVpFOworICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKKyAgICB7CisgICAgICBpbnQgcl9pbmRleDsKKyAgICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIC8qIFdlIG9ubHkgd2FudCByZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KKyAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorCXsKKwkgIGlmICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSA9PSAwKQorCSAgICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpID09IDApCisJICAgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogR2V0IHRoZSBzeW1ib2wgaW5kZXguICAqLworICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCisJcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQorCQkgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKKwkJICAgfCByZWwtPnJfaW5kZXhbMl0pOworICAgICAgZWxzZQorCXJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFsyXSA8PCAxNikKKwkJICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCisJCSAgIHwgcmVsLT5yX2luZGV4WzBdKTsKKworICAgICAgLyogR2V0IHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KKyAgICAgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOworICAgICAgaWYgKGggPT0gTlVMTCkKKwl7CisJICAvKiBUaGlzIHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuLCBidXQgaXQgd2lsbCBpbiBhbnkgY2FzZQorCSAgICAgYmUgY2F1Z2h0IGluIHRoZSByZWxvY2F0aW9uIHBoYXNlLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogQXQgdGhpcyBwb2ludCBjb21tb24gc3ltYm9scyBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIHNvCisJIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4gIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhhdAorCSB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBzeW1ib2wgYW5kIG1hcmtlZCBpdCB1bmRlZmluZWQ7CisJIGlmIHRoZSBzeW1ib2wgaXMgcmVhbGx5IHVuZGVmaW5lZCwgdGhlbiBTVU5PU19ERUZfRFlOQU1JQworCSB3aWxsIGJlIHplcm8uICAqLworICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisJICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKwljb250aW51ZTsKKworICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCisJICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkKKwljb250aW51ZTsKKworICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQorCXsKKwkgIGFzZWN0aW9uICpzZ290OworCisJICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgZmFsc2UpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCSAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisJICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKKwkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOworCisJICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7CisJICBpZiAoc2dvdC0+X3Jhd19zaXplID09IDApCisJICAgIHNnb3QtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7CisJICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7CisJfQorCisgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCk7CisgICAgICBCRkRfQVNTRVJUIChoLT5wbHRfb2Zmc2V0ICE9IDAKKwkJICB8fCAoKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCQkgICAgICA/IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzCisJCQkgJiBEWU5BTUlDKSAhPSAwCisJCSAgICAgIDogKGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkpOworCisgICAgICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgZGVmaW5lZCBvbmx5IGJ5IGEgZHluYW1pYworCSBvYmplY3QuICAqLworCisgICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJeworCSAgLyogUHJlc3VtYWJseSB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIGFzIGJlaW5nIHVuZGVmaW5lZCBieQorCSAgICAgYW4gZWFybGllciByZWxvYy4gICovCisJICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7CisJfQorICAgICAgZWxzZSBpZiAoKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQorCXsKKwkgIGJmZCAqc3ViOworCisJICAvKiBUaGlzIHJlbG9jIGlzIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIEl0IG11c3QgYmUKKwkgICAgIGNvcGllZCBpbnRvIHRoZSBkeW5hbWljIHJlbG9jcy4gIFdlIG1hcmsgdGhlIHN5bWJvbCBhcworCSAgICAgYmVpbmcgdW5kZWZpbmVkLiAgKi8KKwkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKKwkgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKKwkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisJICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFdlIG11c3QgZ2l2ZSBpdCBhbgorCSAgICAgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBpZiB3ZSBoYXZlIG5vdAorCSAgICAgYWxyZWFkeSBkb25lIHNvLiAgV2UgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeW1ib2wKKwkgICAgIHRvIHRoZSAucGx0IHNlY3Rpb247IHRoaXMgd2lsbCBjYXVzZSByZWxvY3MgYWdhaW5zdCBpdCB0bworCSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLworCSAgaWYgKGgtPnBsdF9vZmZzZXQgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChzcGx0LT5fcmF3X3NpemUgPT0gMCkKKwkJc3BsdC0+X3Jhd19zaXplID0gTTY4S19QTFRfRU5UUllfU0laRTsKKwkgICAgICBoLT5wbHRfb2Zmc2V0ID0gc3BsdC0+X3Jhd19zaXplOworCisJICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQorCQl7CisJCSAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBzcGx0OworCQkgIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IHNwbHQtPl9yYXdfc2l6ZTsKKwkJfQorCisJICAgICAgc3BsdC0+X3Jhd19zaXplICs9IE02OEtfUExUX0VOVFJZX1NJWkU7CisKKwkgICAgICAvKiBXZSBtYXkgYWxzbyBuZWVkIGEgZHluYW1pYyByZWxvYyBlbnRyeS4gICovCisJICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQorCQlzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfU1REX1NJWkU7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBTY2FuIHRoZSByZWxvY3MgZm9yIGFuIGlucHV0IHNlY3Rpb24gdXNpbmcgZXh0ZW5kZWQgcmVsb2NzLiAgV2UKKyAgIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBkeW5hbWljCisgICBzeW1ib2wuICBJZiB0aGUgcmVsb2MgaXMgYSBXRElTUDMwLCBhbmQgdGhlIHN5bWJvbCBpcyBpbiB0aGUgLnRleHQKKyAgIHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLgorICAgT3RoZXJ3aXNlLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSByZWxvYyBhcyBhIGR5bmFtaWMgcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3Vub3Nfc2Nhbl9leHRfcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbG9jcywgcmVsX3NpemUpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbG9jczsKKyAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKK3sKKyAgYmZkICpkeW5vYmo7CisgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOworICBjb25zdCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpyZWwsICpyZWxlbmQ7CisgIGFzZWN0aW9uICpzcGx0ID0gTlVMTDsKKyAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOworICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7CisKKyAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgU1BBUkMgcGx0IGVudHJpZXMuICAqLworICBpZiAoYmZkX2dldF9hcmNoIChhYmZkKSAhPSBiZmRfYXJjaF9zcGFyYykKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBkeW5vYmogPSBOVUxMOworCisgIHN5bV9oYXNoZXMgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCk7CisKKyAgcmVsZW5kID0gcmVsb2NzICsgcmVsX3NpemUgLyBSRUxPQ19FWFRfU0laRTsKKyAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHJfaW5kZXg7CisgICAgICBpbnQgcl9leHRlcm47CisgICAgICBpbnQgcl90eXBlOworICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7CisKKyAgICAgIC8qIFN3YXAgaW4gdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQorCXsKKwkgIHJfaW5kZXggPSAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKKwkJICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKKwkJICAgICB8IHJlbC0+cl9pbmRleFsyXSk7CisJICByX2V4dGVybiA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcpKTsKKwkgIHJfdHlwZSA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKKwkJICAgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQorCQkgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQorCQkgICAgIHwgcmVsLT5yX2luZGV4WzBdKTsKKwkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOworCSAgcl90eXBlID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQorCQkgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOworCX0KKworICAgICAgaWYgKHJfZXh0ZXJuKQorCXsKKwkgIGggPSBzeW1faGFzaGVzW3JfaW5kZXhdOworCSAgaWYgKGggPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sIGJ1dCBpdCB3aWxsIGluIGFueQorCQkgY2FzZSBiZSBjYXVnaHQgaW4gdGhlIHJlbG9jYXRpb24gcGhhc2UuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGEgYmFzZSByZWxhdGl2ZSByZWxvYywgd2UgbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluCisgICAgICAgICB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KKyAgICAgIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCisJICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEzCisJICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQorCXsKKwkgIGlmIChkeW5vYmogPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgZW50cnkgaW4gdGhlIC5nb3QgdGFibGUuICAqLworCSAgICAgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKKwkJc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKKwkgICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7CisJICAgIH0KKworCSAgaWYgKHJfZXh0ZXJuKQorCSAgICB7CisJICAgICAgaWYgKGgtPmdvdF9vZmZzZXQgIT0gMCkKKwkJY29udGludWU7CisKKwkgICAgICBoLT5nb3Rfb2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAocl9pbmRleCA+PSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKKwkJeworCQkgIC8qIFRoaXMgaXMgYWJub3JtYWwsIGJ1dCBzaG91bGQgYmUgY2F1Z2h0IGluIHRoZQorCQkgICAgIHJlbG9jYXRpb24gcGhhc2UuICAqLworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgICBpZiAoYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCisJCXsKKwkJICBhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPQorCQkgICAgKGJmZF92bWEgKikgYmZkX3phbGxvYyAoYWJmZCwKKwkJCQkJICAgIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKQorCQkJCQkgICAgICogc2l6ZW9mIChiZmRfdm1hKSkpOworCQkgIGlmIChhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgaWYgKGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0c1tyX2luZGV4XSAhPSAwKQorCQljb250aW51ZTsKKworCSAgICAgIGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0c1tyX2luZGV4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKKwkgICAgfQorCisJICBzZ290LT5fcmF3X3NpemUgKz0gQllURVNfSU5fV09SRDsKKworCSAgLyogSWYgd2UgYXJlIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LCBvciBpZiB0aGUgc3ltYm9sIGlzCisJICAgICBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlIHdpbGwgbmVlZCBhIGR5bmFtaWMgcmVsb2MKKwkgICAgIGVudHJ5LiAgKi8KKwkgIGlmIChpbmZvLT5zaGFyZWQKKwkgICAgICB8fCAoaCAhPSBOVUxMCisJCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKKwkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCisJICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBPdGhlcndpc2UsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gcmVsb2NzIGFnYWluc3Qgc3ltYm9scworICAgICAgICAgZGVmaW5lZCBpbiBkeW5hbWljIG9iamVjdHMgYnV0IG5vdCBpbiByZWd1bGFyIG9iamVjdHMuICBXZQorICAgICAgICAgb25seSBuZWVkIHRvIGNvbnNpZGVyIHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuICAqLworICAgICAgaWYgKCEgcl9leHRlcm4pCisJeworCSAgLyogQnV0LCBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0bworICAgICAgICAgICAgIGdlbmVyYXRlIGFuIGFic29sdXRlIHJlbG9jLiAgKi8KKwkgIGlmIChpbmZvLT5zaGFyZWQpCisJICAgIHsKKwkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCisJCXsKKwkJICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywgdHJ1ZSkpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKwkJICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKwkJICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKwkJICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKKwkJICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7CisJCX0KKworCSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY29tbW9uIHN5bWJvbHMgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBzbworCSB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZW0uICBXZSBuZWVkIHRvIGNvbnNpZGVyIHRoYXQKKwkgd2UgbWF5IGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgc3ltYm9sIGFuZCBtYXJrZWQgaXQgdW5kZWZpbmVkOworCSBpZiB0aGUgc3ltYm9sIGlzIHJlYWxseSB1bmRlZmluZWQsIHRoZW4gU1VOT1NfREVGX0RZTkFNSUMKKwkgd2lsbCBiZSB6ZXJvLiAgKi8KKyAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaworCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJY29udGludWU7CisKKyAgICAgIGlmIChyX3R5cGUgIT0gUkVMT0NfSk1QX1RCTAorCSAgJiYgISBpbmZvLT5zaGFyZWQKKwkgICYmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAorCSAgICAgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKSkKKwljb250aW51ZTsKKworICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMCisJICAmJiAhIGluZm8tPnNoYXJlZAorCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKKwkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQorCXsKKwkgIC8qIFRoaXMgc3ltYm9sIGlzIGFwcGFyZW50bHkgdW5kZWZpbmVkLiAgRG9uJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICAgICBoZXJlOyBqdXN0IGxldCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lIHJlcG9ydCBhbiB1bmRlZmluZWQKKyAgICAgICAgICAgICBzeW1ib2wuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQorCXsKKwkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisJICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKwkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOworCSAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7CisJICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7CisKKwkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluaXRpYWwgZW50cnkgaW4gdGhlIC5nb3QgdGFibGUuICAqLworCSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQorCSAgICBzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOworCSAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOworCX0KKworICAgICAgQkZEX0FTU0VSVCAocl90eXBlID09IFJFTE9DX0pNUF9UQkwKKwkJICB8fCBpbmZvLT5zaGFyZWQKKwkJICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCk7CisgICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gUkVMT0NfSk1QX1RCTAorCQkgIHx8IGluZm8tPnNoYXJlZAorCQkgIHx8IGgtPnBsdF9vZmZzZXQgIT0gMAorCQkgIHx8ICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJCSAgICAgID8gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKKwkJCSAmIERZTkFNSUMpICE9IDAKKwkJICAgICAgOiAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKSk7CisKKyAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIG9ubHkgYnkgYSBkeW5hbWljCisJIG9iamVjdCwgb3IgaXQgaXMgYSBqdW1wIHRhYmxlIHJlbG9jIGZyb20gUElDIGNvbXBpbGVkIGNvZGUuICAqLworCisgICAgICBpZiAocl90eXBlICE9IFJFTE9DX0pNUF9UQkwKKwkgICYmIGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCXsKKwkgIC8qIFByZXN1bWFibHkgdGhpcyBzeW1ib2wgd2FzIG1hcmtlZCBhcyBiZWluZyB1bmRlZmluZWQgYnkKKwkgICAgIGFuIGVhcmxpZXIgcmVsb2MuICAqLworCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOworCX0KKyAgICAgIGVsc2UgaWYgKHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMCisJICAgICAgICYmIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKKwl7CisJICBiZmQgKnN1YjsKKworCSAgLyogVGhpcyByZWxvYyBpcyBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBJdCBtdXN0IGJlCisJICAgICBjb3BpZWQgaW50byB0aGUgZHluYW1pYyByZWxvY3MuICBXZSBtYXJrIHRoZSBzeW1ib2wgYXMKKwkgICAgIGJlaW5nIHVuZGVmaW5lZC4gICovCisJICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7CisJICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCisJICAgIHsKKwkgICAgICBzdWIgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7CisJICAgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKKwkgICAgICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgV2UgbXVzdCBnaXZlIGl0IGFuCisJICAgICBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGlmIHdlIGhhdmUgbm90CisJICAgICBhbHJlYWR5IGRvbmUgc28uICBXZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbAorCSAgICAgdG8gdGhlIC5wbHQgc2VjdGlvbjsgdGhpcyB3aWxsIGNhdXNlIHJlbG9jcyBhZ2FpbnN0IGl0IHRvCisJICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCisJICBpZiAoaC0+cGx0X29mZnNldCA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA9PSAwKQorCQlzcGx0LT5fcmF3X3NpemUgPSBTUEFSQ19QTFRfRU5UUllfU0laRTsKKwkgICAgICBoLT5wbHRfb2Zmc2V0ID0gc3BsdC0+X3Jhd19zaXplOworCisJICAgICAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQorCQl7CisJCSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCQkgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisJCSAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBzcGx0OworCQkgIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IHNwbHQtPl9yYXdfc2l6ZTsKKwkJfQorCisJICAgICAgc3BsdC0+X3Jhd19zaXplICs9IFNQQVJDX1BMVF9FTlRSWV9TSVpFOworCisJICAgICAgLyogV2Ugd2lsbCBhbHNvIG5lZWQgYSBkeW5hbWljIHJlbG9jIGVudHJ5LCB1bmxlc3MgdGhpcworICAgICAgICAgICAgICAgICBpcyBhIEpNUF9UQkwgcmVsb2MgcHJvZHVjZWQgYnkgbGlua2luZyBQSUMgY29tcGlsZWQKKyAgICAgICAgICAgICAgICAgY29kZSwgYW5kIHdlIGFyZSBub3QgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnkuICAqLworCSAgICAgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCisJCXNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKKwkgICAgfQorCisJICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IG92ZXIKKyAgICAgICAgICAgICBhbnkgcmVsb2Mgb3RoZXIgdGhhbiBhIGp1bXAgdGFibGUgcmVsb2MuICAqLworCSAgaWYgKGluZm8tPnNoYXJlZCAmJiByX3R5cGUgIT0gUkVMT0NfSk1QX1RCTCkKKwkgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEJ1aWxkIHRoZSBoYXNoIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scywgYW5kIHRvIG1hcmsgYXMgd3JpdHRlbiBhbGwKKyAgIHN5bWJvbHMgZnJvbSBkeW5hbWljIG9iamVjdHMgd2hpY2ggd2UgZG8gbm90IHBsYW4gdG8gd3JpdGUgb3V0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wgKGgsIGRhdGEpCisgICAgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBkYXRhOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOworCisgIC8qIFNldCB0aGUgd3JpdHRlbiBmbGFnIGZvciBzeW1ib2xzIHdlIGRvIG5vdCB3YW50IHRvIHdyaXRlIG91dCBhcworICAgICBwYXJ0IG9mIHRoZSByZWd1bGFyIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYWxsIHN5bWJvbHMgd2hpY2ggYXJlCisgICAgIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4gIEZvciBzb21lIHJlYXNvbiBzeW1ib2xzCisgICAgIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QgYW5kIGRlZmluZWQgYnkgYSBkeW5hbWljCisgICAgIG9iamVjdCBkbyBub3Qgc2VlbSB0byBzaG93IHVwIGluIHRoZSByZWd1bGFyIHN5bWJvbCB0YWJsZS4gIEl0IGlzCisgICAgIHBvc3NpYmxlIGZvciBhIHN5bWJvbCB0byBoYXZlIG9ubHkgU1VOT1NfUkVGX1JFR1VMQVIgc2V0IGhlcmUsIGl0CisgICAgIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIHR1cm5lZCBpbnRvIGEgY29tbW9uIHN5bWJvbAorICAgICBiZWNhdXNlIGl0IHdhcyBmb3VuZCBpbiBhbiBhcmNoaXZlIG9iamVjdCB3aGljaCB3YXMgbm90IGluY2x1ZGVkCisgICAgIGluIHRoZSBsaW5rLiAgKi8KKyAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwCisgICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAorICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsICJfX0RZTkFNSUMiKSAhPSAwKQorICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKKyAgICAgcmVndWxhciBvYmplY3QsIHNlZSB3aGV0aGVyIHdlIGdhdmUgaXQgYSByZWFzb25hYmxlIHZhbHVlIHdoaWxlCisgICAgIHNjYW5uaW5nIHRoZSByZWxvY3MuICAqLworCisgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMAorICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKKyAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgJiYgKChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKwkgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQorCXsKKwkgIGJmZCAqc3ViOworCisJICAvKiBUaGlzIHN5bWJvbCBpcyBjdXJyZW50bHkgZGVmaW5lZCBpbiBhIGR5bmFtaWMgc2VjdGlvbgorCSAgICAgd2hpY2ggaXMgbm90IGJlaW5nIHB1dCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKKwkgICAgIGltcGxpZXMgdGhhdCB0aGVyZSBpcyBubyByZWxvYyBhZ2FpbnN0IHRoZSBzeW1ib2wuICBJJ20KKwkgICAgIG5vdCBzdXJlIHdoeSB0aGlzIGNhc2Ugd291bGQgZXZlciBvY2N1ci4gIEluIGFueSBjYXNlLCB3ZQorCSAgICAgY2hhbmdlIHRoZSBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkLiAgKi8KKwkgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKKwkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisJICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gc3ViOworCX0KKyAgICB9CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBmaWxlLCBhZGQgaXQKKyAgICAgdG8gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCisgIGlmICgoaC0+ZmxhZ3MgJiAoU1VOT1NfREVGX1JFR1VMQVIgfCBTVU5PU19SRUZfUkVHVUxBUikpICE9IDApCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBzaXplX3QgbGVuOworICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAgICAgdW5zaWduZWQgY2hhciAqbmFtZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKyAgICAgIGJmZCAqZHlub2JqOworCisgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ID09IC0yKTsKKworICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICAgICAgaC0+ZHluaW5keCA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKKyAgICAgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OworCisgICAgICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7CisKKyAgICAgIC8qIFdlIGRvbid0IGJvdGhlciB0byBjb25zdHJ1Y3QgYSBCRkQgaGFzaCB0YWJsZSBmb3IgdGhlIHN0cmluZ3MKKwkgd2hpY2ggYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVXNpbmcgYSBoYXNoCisJIHRhYmxlIGZvciB0aGUgcmVndWxhciBzeW1ib2xzIGlzIGJlbmVmaWNpYWwsIGJlY2F1c2UgdGhlCisJIHJlZ3VsYXIgc3ltYm9scyBpbmNsdWRlcyB0aGUgZGVidWdnaW5nIHN5bWJvbHMsIHdoaWNoIGhhdmUKKwkgbG9uZyBuYW1lcyBhbmQgYXJlIG9mdGVuIGR1cGxpY2F0ZWQgaW4gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCisJIFRoZXJlIGFyZSBubyBkZWJ1Z2dpbmcgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChzLT5jb250ZW50cywKKwkJCQkJICAgcy0+X3Jhd19zaXplICsgbGVuICsgMSk7CisgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBzLT5jb250ZW50cyA9IGNvbnRlbnRzOworCisgICAgICBoLT5keW5zdHJfaW5kZXggPSBzLT5fcmF3X3NpemU7CisgICAgICBzdHJjcHkgKChjaGFyICopIGNvbnRlbnRzICsgcy0+X3Jhd19zaXplLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOworICAgICAgcy0+X3Jhd19zaXplICs9IGxlbiArIDE7CisKKyAgICAgIC8qIEFkZCBpdCB0byB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgKi8KKyAgICAgIG5hbWUgPSAodW5zaWduZWQgY2hhciAqKSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7CisgICAgICBoYXNoID0gMDsKKyAgICAgIHdoaWxlICgqbmFtZSAhPSAnXDAnKQorCWhhc2ggPSAoaGFzaCA8PCAxKSArICpuYW1lKys7CisgICAgICBoYXNoICY9IDB4N2ZmZmZmZmY7CisgICAgICBoYXNoICU9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudDsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKworICAgICAgaWYgKEdFVF9TV09SRCAoZHlub2JqLCBzLT5jb250ZW50cyArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUpID09IC0xKQorCVBVVF9XT1JEIChkeW5vYmosIGgtPmR5bmluZHgsIHMtPmNvbnRlbnRzICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSk7CisgICAgICBlbHNlCisJeworCSAgYmZkX3ZtYSBuZXh0OworCisJICBuZXh0ID0gR0VUX1dPUkQgKGR5bm9iaiwKKwkJCSAgIChzLT5jb250ZW50cworCQkJICAgICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRQorCQkJICAgICsgQllURVNfSU5fV09SRCkpOworCSAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplIC8gSEFTSF9FTlRSWV9TSVpFLAorCQkgICAgcy0+Y29udGVudHMgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFICsgQllURVNfSU5fV09SRCk7CisJICBQVVRfV09SRCAoZHlub2JqLCBoLT5keW5pbmR4LCBzLT5jb250ZW50cyArIHMtPl9yYXdfc2l6ZSk7CisJICBQVVRfV09SRCAoZHlub2JqLCBuZXh0LCBzLT5jb250ZW50cyArIHMtPl9yYXdfc2l6ZSArIEJZVEVTX0lOX1dPUkQpOworCSAgcy0+X3Jhd19zaXplICs9IEhBU0hfRU5UUllfU0laRTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBMaW5rIGEgZHluYW1pYyBvYmplY3QuICBXZSBhY3R1YWxseSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIGF0CisgICB0aGlzIHBvaW50LiAgVGhpcyBlbnRyeSBwb2ludCBleGlzdHMgdG8gcHJldmVudCB0aGUgcmVndWxhciBsaW5rZXIKKyAgIGNvZGUgZnJvbSBkb2luZyBhbnl0aGluZyB3aXRoIHRoZSBvYmplY3QuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitzdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0IChpbmZvLCBhYmZkKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IGEgZHluYW1pYyBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZmluYWwgdHJhdmVyc2FsCisgICBvdmVyIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKK3sKKyAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7CisgIGludCB0eXBlOworICBiZmRfdm1hIHZhbDsKKyAgYXNlY3Rpb24gKnM7CisgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqb3V0c3ltOworCisgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgZmlsbCBpbiB0aGUKKyAgICAgdGFibGUgZW50cnkuICAqLworICBpZiAoaC0+cGx0X29mZnNldCAhPSAwKQorICAgIHsKKyAgICAgIGJmZCAqZHlub2JqOworICAgICAgYXNlY3Rpb24gKnNwbHQ7CisgICAgICBiZmRfYnl0ZSAqcDsKKyAgICAgIGFzZWN0aW9uICpzOworICAgICAgYmZkX3ZtYSByX2FkZHJlc3M7CisKKyAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7CisgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKKyAgICAgIHAgPSBzcGx0LT5jb250ZW50cyArIGgtPnBsdF9vZmZzZXQ7CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOworCisgICAgICByX2FkZHJlc3MgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKKwkJICAgKyBoLT5wbHRfb2Zmc2V0KTsKKworICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpKQorCXsKKwljYXNlIGJmZF9hcmNoX3NwYXJjOgorCSAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKKwkgICAgeworCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9FTlRSWV9XT1JEMCwgcCk7CisJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJCSAgKFNQQVJDX1BMVF9FTlRSWV9XT1JEMQorCQkJICAgKyAoKCgtIChoLT5wbHRfb2Zmc2V0ICsgNCkgPj4gMikKKwkJCSAgICAgICAmIDB4M2ZmZmZmZmYpKSksCisJCQkgIHAgKyA0KTsKKwkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfRU5UUllfV09SRDIgKyBzLT5yZWxvY19jb3VudCwKKwkJCSAgcCArIDgpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfdm1hIHZhbDsKKworCSAgICAgIHZhbCA9IChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJICAgICArIGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSk7CisJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJCSAgU1BBUkNfUExUX1BJQ19XT1JEMCArICgodmFsID4+IDEwKSAmIDB4M2ZmZmZmKSwKKwkJCSAgcCk7CisJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKKwkJCSAgU1BBUkNfUExUX1BJQ19XT1JEMSArICh2YWwgJiAweDNmZiksCisJCQkgIHAgKyA0KTsKKwkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTUEFSQ19QTFRfUElDX1dPUkQyLCBwICsgOCk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBiZmRfYXJjaF9tNjhrOgorCSAgaWYgKCEgaW5mby0+c2hhcmVkICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKQorCSAgICBhYm9ydCAoKTsKKwkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIE02OEtfUExUX0VOVFJZX1dPUkQwLCBwKTsKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICgtIChoLT5wbHRfb2Zmc2V0ICsgMikpLCBwICsgMik7CisJICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCBzLT5yZWxvY19jb3VudCwgcCArIDYpOworCSAgcl9hZGRyZXNzICs9IDI7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBhZGQgYSBqdW1wIHRhYmxlIHJlbG9jLCB1bmxlc3MgdGhpcyBpcyB0aGUKKyAgICAgICAgIHJlc3VsdCBvZiBhIEpNUF9UQkwgcmVsb2MgZnJvbSBQSUMgY29tcGlsZWQgY29kZS4gICovCisgICAgICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQorCXsKKwkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPj0gMCk7CisJICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCisJCSAgICAgIDwgcy0+X3Jhd19zaXplKTsKKwkgIHAgPSBzLT5jb250ZW50cyArIHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKG91dHB1dF9iZmQpOworCSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChvdXRwdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKKwkgICAgeworCSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7CisKKwkgICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcDsKKwkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRyZXNzLCBzcmVsLT5yX2FkZHJlc3MpOworCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQorCQl7CisJCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7CisJCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKKwkJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4KTsKKwkJICBzcmVsLT5yX3R5cGVbMF0gPSAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRworCQkJCSAgICAgfCBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7CisJCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKKwkJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7CisJCSAgc3JlbC0+cl90eXBlWzBdID0gKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUKKwkJCQkgICAgIHwgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOworCisJICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7CisJICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkcmVzcywgZXJlbC0+cl9hZGRyZXNzKTsKKwkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKKwkJeworCQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOworCQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7CisJCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OworCQkgIGVyZWwtPnJfdHlwZVswXSA9CisJCSAgICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRworCQkgICAgIHwgKFJFTE9DX0pNUF9TTE9UIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKKwkJICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOworCQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKKwkJICBlcmVsLT5yX3R5cGVbMF0gPQorCQkgICAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUKKwkJICAgICB8IChSRUxPQ19KTVBfU0xPVCA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSkpOworCQl9CisJICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBlcmVsLT5yX2FkZGVuZCk7CisJICAgIH0KKworCSAgKytzLT5yZWxvY19jb3VudDsKKwl9CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgbm90IGEgZHluYW1pYyBzeW1ib2wsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAgICAgZWxzZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyBhZnRlciBoYW5kbGluZyB0aGUgUExUIGVudHJ5LCBiZWNhdXNlCisgICAgIHdlIGNhbiBoYXZlIGEgUExUIGVudHJ5IGZvciBhIG5vbmR5bmFtaWMgc3ltYm9sIHdoZW4gbGlua2luZyBQSUMKKyAgICAgY29tcGlsZWQgY29kZSBmcm9tIGEgcmVndWxhciBvYmplY3QuICAqLworICBpZiAoaC0+ZHluaW5keCA8IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChoLT5yb290LnJvb3QudHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgorICAgICAgYWJvcnQgKCk7CisgICAgICAvKiBBdm9pZCB2YXJpYWJsZSBub3QgaW5pdGlhbGl6ZWQgd2FybmluZ3MuICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKKyAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKKyAgICAgIHZhbCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKyAgICAgIHsKKwlhc2VjdGlvbiAqc2VjOworCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKworCXNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOworCW91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKKwlCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQorCQkgICAgfHwgb3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOworCWlmIChoLT5wbHRfb2Zmc2V0ICE9IDAKKwkgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCisJICB7CisJICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKKwkgICAgdmFsID0gMDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCisJICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgPyBOX1RFWFQKKwkJICAgICAgOiBOX1dFQUtUKTsKKwkgICAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQorCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgID8gTl9EQVRBCisJCSAgICAgIDogTl9XRUFLRCk7CisJICAgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQorCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgID8gTl9CU1MKKwkJICAgICAgOiBOX1dFQUtCKTsKKwkgICAgZWxzZQorCSAgICAgIHR5cGUgPSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgID8gTl9BQlMKKwkJICAgICAgOiBOX1dFQUtBKTsKKwkgICAgdHlwZSB8PSBOX0VYVDsKKwkgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQorCQkgICArIG91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKKyAgICAgIHR5cGUgPSBOX1VOREYgfCBOX0VYVDsKKyAgICAgIHZhbCA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6CisgICAgICB0eXBlID0gTl9XRUFLVTsKKyAgICAgIHZhbCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6CisgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6CisgICAgICAvKiBGSVhNRTogSWdub3JlIHRoZXNlIGZvciBub3cuICBUaGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaAorCSB0aGV5IHNob3VsZCBiZSB3cml0dGVuIG91dCBhcmUgbm90IGNsZWFyIHRvIG1lLiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosICIuZHluc3ltIik7CisgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgIG91dHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX25saXN0ICopCisJICAgIChzLT5jb250ZW50cyArIGgtPmR5bmluZHggKiBFWFRFUk5BTF9OTElTVF9TSVpFKSk7CisKKyAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIHR5cGUsIG91dHN5bS0+ZV90eXBlKTsKKyAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9vdGhlcik7CisKKyAgLyogRklYTUU6IFRoZSBuYXRpdmUgbGlua2VyIGRvZXNuJ3QgdXNlIDAgZm9yIGRlc2MuICBJdCBzZWVtcyB0byB1c2UKKyAgICAgb25lIGxlc3MgdGhhbiB0aGUgZGVzYyB2YWx1ZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGFsdGhvdWdoIHRoYXQKKyAgICAgc2VlbXMgdW5saWtlbHkuICAqLworICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIDAsIG91dHN5bS0+ZV9kZXNjKTsKKworICBQVVRfV09SRCAob3V0cHV0X2JmZCwgaC0+ZHluc3RyX2luZGV4LCBvdXRzeW0tPmVfc3RyeCk7CisgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCB2YWwsIG91dHN5bS0+ZV92YWx1ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgSWYgdGhpcworICAgaXMgYSByZWxvYyB3aGljaCBhcmUgYXJlIGdvaW5nIHRvIGNvcHkgYXMgYSBkeW5hbWljIHJlbG9jLCB0aGVuCisgICBjb3B5IGl0IG92ZXIsIGFuZCB0ZWxsIHRoZSBjYWxsZXIgdG8gbm90IGJvdGhlciBwcm9jZXNzaW5nIHRoaXMKKyAgIHJlbG9jLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyAoaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoYXJnLCByZWxvYywKKwkJCSAgIGNvbnRlbnRzLCBza2lwLCByZWxvY2F0aW9ucCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqaW5wdXRfYmZkOworICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKKyAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoYXJnOworICAgICBQVFIgcmVsb2M7CisgICAgIGJmZF9ieXRlICpjb250ZW50czsKKyAgICAgYm9vbGVhbiAqc2tpcDsKKyAgICAgYmZkX3ZtYSAqcmVsb2NhdGlvbnA7Cit7CisgIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOworICBiZmQgKmR5bm9iajsKKyAgYm9vbGVhbiBiYXNlcmVsOworICBib29sZWFuIGptcHRibDsKKyAgYm9vbGVhbiBwY3JlbDsKKyAgYXNlY3Rpb24gKnM7CisgIGJmZF9ieXRlICpwOworICBsb25nIGluZHg7CisKKyAgKnNraXAgPSBmYWxzZTsKKworICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOworCisgIGlmIChoICE9IE5VTEwKKyAgICAgICYmIGgtPnBsdF9vZmZzZXQgIT0gMAorICAgICAgJiYgKGluZm8tPnNoYXJlZAorCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzcGx0OworCisgICAgICAvKiBSZWRpcmVjdCB0aGUgcmVsb2NhdGlvbiB0byB0aGUgUExUIGVudHJ5LiAgKi8KKyAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOworICAgICAgKnJlbG9jYXRpb25wID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICsgaC0+cGx0X29mZnNldCk7CisgICAgfQorCisgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKKyAgICB7CisgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOworCisgICAgICBzcmVsID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2M7CisgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQorCXsKKwkgIGJhc2VyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKKwkgIGptcHRibCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKKwkgIHBjcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRykpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiYXNlcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKSk7CisJICBqbXB0YmwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKSk7CisJICBwY3JlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKKyAgICAgIGludCByX3R5cGU7CisKKyAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvYzsKKyAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCisJcl90eXBlID0gKChlcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKKwkJICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7CisgICAgICBlbHNlCisJcl90eXBlID0gKChlcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKKwkJICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7CisgICAgICBiYXNlcmVsID0gKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKKwkJIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKKwkJIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpOworICAgICAgam1wdGJsID0gcl90eXBlID09IFJFTE9DX0pNUF9UQkw7CisgICAgICBwY3JlbCA9IChyX3R5cGUgPT0gUkVMT0NfRElTUDgKKwkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX0RJU1AxNgorCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfRElTUDMyCisJICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19XRElTUDMwCisJICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19XRElTUDIyKTsKKyAgICAgIC8qIFdlIGRvbid0IGNvbnNpZGVyIHRoZSBQQzEwIGFuZCBQQzIyIHR5cGVzIHRvIGJlIFBDIHJlbGF0aXZlLAorICAgICAgICAgYmVjYXVzZSB0aGV5IGFyZSBwY3JlbF9vZmZzZXQuICAqLworICAgIH0KKworICBpZiAoYmFzZXJlbCkKKyAgICB7CisgICAgICBiZmRfdm1hICpnb3Rfb2Zmc2V0cDsKKyAgICAgIGFzZWN0aW9uICpzZ290OworCisgICAgICBpZiAoaCAhPSBOVUxMKQorCWdvdF9vZmZzZXRwID0gJmgtPmdvdF9vZmZzZXQ7CisgICAgICBlbHNlIGlmIChhZGF0YSAoaW5wdXRfYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQorCWdvdF9vZmZzZXRwID0gTlVMTDsKKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOworCSAgaW50IHJfaW5kZXg7CisKKwkgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvYzsKKwkgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKKwkgICAgeworCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCisJCXJfaW5kZXggPSAoKHNyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCisJCQkgICB8IChzcmVsLT5yX2luZGV4WzFdIDw8IDgpCisJCQkgICB8IHNyZWwtPnJfaW5kZXhbMl0pOworCSAgICAgIGVsc2UKKwkJcl9pbmRleCA9ICgoc3JlbC0+cl9pbmRleFsyXSA8PCAxNikKKwkJCSAgIHwgKHNyZWwtPnJfaW5kZXhbMV0gPDwgOCkKKwkJCSAgIHwgc3JlbC0+cl9pbmRleFswXSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7CisKKwkgICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2M7CisJICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKKwkJcl9pbmRleCA9ICgoZXJlbC0+cl9pbmRleFswXSA8PCAxNikKKwkJCSAgIHwgKGVyZWwtPnJfaW5kZXhbMV0gPDwgOCkKKwkJCSAgIHwgZXJlbC0+cl9pbmRleFsyXSk7CisJICAgICAgZWxzZQorCQlyX2luZGV4ID0gKChlcmVsLT5yX2luZGV4WzJdIDw8IDE2KQorCQkJICAgfCAoZXJlbC0+cl9pbmRleFsxXSA8PCA4KQorCQkJICAgfCBlcmVsLT5yX2luZGV4WzBdKTsKKwkgICAgfQorCisJICBnb3Rfb2Zmc2V0cCA9IGFkYXRhIChpbnB1dF9iZmQpLmxvY2FsX2dvdF9vZmZzZXRzICsgcl9pbmRleDsKKwl9CisKKyAgICAgIEJGRF9BU1NFUlQgKGdvdF9vZmZzZXRwICE9IE5VTEwgJiYgKmdvdF9vZmZzZXRwICE9IDApOworCisgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKworICAgICAgLyogV2Ugc2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBoYXZlCisJIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIEdPVCBlbnRyeS4gICovCisgICAgICBpZiAoKCpnb3Rfb2Zmc2V0cCAmIDEpID09IDApCisJeworCSAgaWYgKGggPT0gTlVMTAorCSAgICAgIHx8ICghIGluZm8tPnNoYXJlZAorCQkgICYmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAorCQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMCkpKQorCSAgICBQVVRfV09SRCAoZHlub2JqLCAqcmVsb2NhdGlvbnAsIHNnb3QtPmNvbnRlbnRzICsgKmdvdF9vZmZzZXRwKTsKKwkgIGVsc2UKKwkgICAgUFVUX1dPUkQgKGR5bm9iaiwgMCwgc2dvdC0+Y29udGVudHMgKyAqZ290X29mZnNldHApOworCisJICBpZiAoaW5mby0+c2hhcmVkCisJICAgICAgfHwgKGggIT0gTlVMTAorCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCisJCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApKQorCSAgICB7CisJICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBHTE9CX0RBVCBvciAzMiByZWxvYyB0byB0ZWxsIHRoZQorICAgICAgICAgICAgICAgICBkeW5hbWljIGxpbmtlciB0byBmaWxsIGluIHRoaXMgZW50cnkgaW4gdGhlIHRhYmxlLiAgKi8KKworCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOworCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisJICAgICAgQkZEX0FTU0VSVCAocy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKQorCQkJICA8IHMtPl9yYXdfc2l6ZSk7CisKKwkgICAgICBwID0gKHMtPmNvbnRlbnRzCisJCSAgICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSk7CisKKwkgICAgICBpZiAoaCAhPSBOVUxMKQorCQlpbmR4ID0gaC0+ZHluaW5keDsKKwkgICAgICBlbHNlCisJCWluZHggPSAwOworCisJICAgICAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopID09IFJFTE9DX1NURF9TSVpFKQorCQl7CisJCSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKKworCQkgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOworCQkgIFBVVF9XT1JEIChkeW5vYmosCisJCQkgICAgKCpnb3Rfb2Zmc2V0cAorCQkJICAgICArIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0KSwKKwkJCSAgICBzcmVsLT5yX2FkZHJlc3MpOworCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCisJCSAgICB7CisJCSAgICAgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOworCQkgICAgICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOworCQkgICAgICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7CisJCSAgICAgIGlmIChoID09IE5VTEwpCisJCQlzcmVsLT5yX3R5cGVbMF0gPSAyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUc7CisJCSAgICAgIGVsc2UKKwkJCXNyZWwtPnJfdHlwZVswXSA9CisJCQkgIChSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCisJCQkgICB8IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCisJCQkgICB8IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRworCQkJICAgfCAoMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKKwkJICAgICAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKKwkJICAgICAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OworCQkgICAgICBpZiAoaCA9PSBOVUxMKQorCQkJc3JlbC0+cl90eXBlWzBdID0gMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFOworCQkgICAgICBlbHNlCisJCQlzcmVsLT5yX3R5cGVbMF0gPQorCQkJICAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQorCQkJICAgfCBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRQorCQkJICAgfCBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUKKwkJCSAgIHwgKDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKKworCQkgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBwOworCQkgIFBVVF9XT1JEIChkeW5vYmosCisJCQkgICAgKCpnb3Rfb2Zmc2V0cAorCQkJICAgICArIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0KSwKKwkJCSAgICBlcmVsLT5yX2FkZHJlc3MpOworCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCisJCSAgICB7CisJCSAgICAgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOworCQkgICAgICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOworCQkgICAgICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7CisJCSAgICAgIGlmIChoID09IE5VTEwpCisJCQllcmVsLT5yX3R5cGVbMF0gPQorCQkJICBSRUxPQ18zMiA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKKwkJICAgICAgZWxzZQorCQkJZXJlbC0+cl90eXBlWzBdID0KKwkJCSAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcKKwkJCSAgIHwgKFJFTE9DX0dMT0JfREFUIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKKwkJICAgICAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKKwkJICAgICAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OworCQkgICAgICBpZiAoaCA9PSBOVUxMKQorCQkJZXJlbC0+cl90eXBlWzBdID0KKwkJCSAgUkVMT0NfMzIgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEU7CisJCSAgICAgIGVsc2UKKwkJCWVyZWwtPnJfdHlwZVswXSA9CisJCQkgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCisJCQkgICB8IChSRUxPQ19HTE9CX0RBVAorCQkJICAgICAgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpKTsKKwkJICAgIH0KKwkJICBQVVRfV09SRCAoZHlub2JqLCAwLCBlcmVsLT5yX2FkZGVuZCk7CisJCX0KKworCSAgICAgICsrcy0+cmVsb2NfY291bnQ7CisJICAgIH0KKworCSAgKmdvdF9vZmZzZXRwIHw9IDE7CisJfQorCisgICAgICAqcmVsb2NhdGlvbnAgPSAoc2dvdC0+dm1hCisJCSAgICAgICsgKCpnb3Rfb2Zmc2V0cCAmfiAxKQorCQkgICAgICAtIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfYmFzZSk7CisKKyAgICAgIC8qIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBmb3IgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICghIGluZm8tPnNoYXJlZCkKKyAgICB7CisgICAgICBpZiAoaCA9PSBOVUxMCisJICB8fCBoLT5keW5pbmR4ID09IC0xCisJICB8fCBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDAKKwkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCisJICB8fCAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorCXJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChoICE9IE5VTEwKKwkgICYmIChoLT5keW5pbmR4ID09IC0xCisJICAgICAgfHwgam1wdGJsCisJICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsCisJCQkgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyogSXQgbG9va3MgbGlrZSB0aGlzIGlzIGEgcmVsb2Mgd2UgYXJlIHN1cHBvc2VkIHRvIGNvcHkuICAqLworCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOworICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopIDwgcy0+X3Jhd19zaXplKTsKKworICBwID0gcy0+Y29udGVudHMgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopOworCisgIC8qIENvcHkgdGhlIHJlbG9jIG92ZXIuICAqLworICBtZW1jcHkgKHAsIHJlbG9jLCBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZHlub2JqKSk7CisKKyAgaWYgKGggIT0gTlVMTCkKKyAgICBpbmR4ID0gaC0+ZHluaW5keDsKKyAgZWxzZQorICAgIGluZHggPSAwOworCisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBhbmQgc3ltYm9sIGluZGV4LiAgKi8KKyAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopID09IFJFTE9DX1NURF9TSVpFKQorICAgIHsKKyAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7CisKKyAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOworICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKKwkJKEdFVF9XT1JEIChkeW5vYmosIHNyZWwtPnJfYWRkcmVzcykKKwkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSwKKwkJc3JlbC0+cl9hZGRyZXNzKTsKKyAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGR5bm9iaikpCisJeworCSAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7CisJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOworCSAgc3JlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSlpbmR4OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKKwkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7CisJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7CisJfQorICAgICAgLyogRklYTUU6IFdlIG1heSBoYXZlIHRvIGNoYW5nZSB0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlCisgICAgICAgICByZWxvYy4gICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKKworICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7CisgICAgICBQVVRfV09SRCAoZHlub2JqLAorCQkoR0VUX1dPUkQgKGR5bm9iaiwgZXJlbC0+cl9hZGRyZXNzKQorCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAorCQllcmVsLT5yX2FkZHJlc3MpOworICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKKwl7CisJICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKKwkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7CisJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOworCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKKwkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKKwl9CisgICAgICBpZiAocGNyZWwgJiYgaCAhPSBOVUxMKQorCXsKKwkgIC8qIEFkanVzdCB0aGUgYWRkZW5kIGZvciB0aGUgY2hhbmdlIGluIGFkZHJlc3MuICAqLworCSAgUFVUX1dPUkQgKGR5bm9iaiwKKwkJICAgIChHRVRfV09SRCAoZHlub2JqLCBlcmVsLT5yX2FkZGVuZCkKKwkJICAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkrIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKSksCisJCSAgICBlcmVsLT5yX2FkZGVuZCk7CisJfQorICAgIH0KKworICArK3MtPnJlbG9jX2NvdW50OworCisgIGlmIChoICE9IE5VTEwpCisgICAgKnNraXAgPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitzdW5vc19maW5pc2hfZHluYW1pY19saW5rIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKmR5bm9iajsKKyAgYXNlY3Rpb24gKm87CisgIGFzZWN0aW9uICpzOworICBhc2VjdGlvbiAqc2R5bjsKKworICBpZiAoISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQKKyAgICAgICYmICEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKKworICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7CisgIEJGRF9BU1NFUlQgKHNkeW4gIT0gTlVMTCk7CisKKyAgLyogRmluaXNoIHVwIHRoZSAubmVlZCBzZWN0aW9uLiAgVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBmaWxsZWQgaXQKKyAgICAgaW4sIGJ1dCB3aXRoIG9mZnNldHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZgorICAgICByZWFsIGFkZHJlc3Nlcy4gIE5vdyB0aGF0IHdlIGtub3cgdGhlIHNlY3Rpb24gbG9jYXRpb24sIHdlIGNhbgorICAgICBmaWxsIGluIHRoZSBmaW5hbCB2YWx1ZXMuICAqLworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7CisgIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCisgICAgeworICAgICAgZmlsZV9wdHIgZmlsZXBvczsKKyAgICAgIGJmZF9ieXRlICpwOworCisgICAgICBmaWxlcG9zID0gcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0OworICAgICAgcCA9IHMtPmNvbnRlbnRzOworICAgICAgd2hpbGUgKDEpCisJeworCSAgYmZkX3ZtYSB2YWw7CisKKwkgIFBVVF9XT1JEIChkeW5vYmosIEdFVF9XT1JEIChkeW5vYmosIHApICsgZmlsZXBvcywgcCk7CisJICB2YWwgPSBHRVRfV09SRCAoZHlub2JqLCBwICsgMTIpOworCSAgaWYgKHZhbCA9PSAwKQorCSAgICBicmVhazsKKwkgIFBVVF9XT1JEIChkeW5vYmosIHZhbCArIGZpbGVwb3MsIHAgKyAxMik7CisJICBwICs9IDE2OworCX0KKyAgICB9CisKKyAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSAuZ290IHNlY3Rpb24gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgIGR5bmFtaWMgaW5mb3JtYXRpb24sIHVubGVzcyB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkuICAqLworICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKKyAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgaWYgKGluZm8tPnNoYXJlZCB8fCBzZHluLT5fcmF3X3NpemUgPT0gMCkKKyAgICBQVVRfV09SRCAoZHlub2JqLCAwLCBzLT5jb250ZW50cyk7CisgIGVsc2UKKyAgICBQVVRfV09SRCAoZHlub2JqLCBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKKwkgICAgICBzLT5jb250ZW50cyk7CisKKyAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMAorCSAgJiYgby0+Y29udGVudHMgIT0gTlVMTCkKKwl7CisJICBCRkRfQVNTRVJUIChvLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCisJCSAgICAgICYmIG8tPm91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBhYmZkKTsKKwkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCisJCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCisJCQkJCSAgby0+X3Jhd19zaXplKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgaWYgKHNkeW4tPl9yYXdfc2l6ZSA+IDApCisgICAgeworICAgICAgc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pYyBlc2Q7CisgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgZXNkbDsKKworICAgICAgLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIGxpbmsgaW5mb3JtYXRpb24uICAqLworICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDMsIGVzZC5sZF92ZXJzaW9uKTsKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosCisJCXNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0ICsgc2l6ZW9mIGVzZCwKKwkJZXNkLmxkZCk7CisgICAgICBQVVRfV09SRCAoZHlub2JqLAorCQkoc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgKyBzZHluLT5vdXRwdXRfb2Zmc2V0CisJCSArIHNpemVvZiBlc2QKKwkJICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpLAorCQllc2QubGQpOworCisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNkeW4tPm91dHB1dF9zZWN0aW9uLCAmZXNkLAorCQkJCSAgICAgIHNkeW4tPm91dHB1dF9vZmZzZXQsIHNpemVvZiBlc2QpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfbG9hZGVkKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIubmVlZCIpOworICAgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKKwlQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9uZWVkKTsKKyAgICAgIGVsc2UKKwlQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCisJCSAgZXNkbC5sZF9uZWVkKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKKyAgICAgIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCisJUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfcnVsZXMpOworICAgICAgZWxzZQorCVBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKKwkJICBlc2RsLmxkX3J1bGVzKTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQsCisJCWVzZGwubGRfZ290KTsKKworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQsCisJCWVzZGwubGRfcGx0KTsKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSwgZXNkbC5sZF9wbHRfc3opOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCisJCSAgPT0gcy0+X3Jhd19zaXplKTsKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKKwkJZXNkbC5sZF9yZWwpOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7CisgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOworICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAorCQllc2RsLmxkX2hhc2gpOworCisgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKKyAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7CisgICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCisJCWVzZGwubGRfc3RhYik7CisKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX3N0YWJfaGFzaCk7CisKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+YnVja2V0Y291bnQsCisJCWVzZGwubGRfYnVja2V0cyk7CisKKyAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN0ciIpOworICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKKwkJZXNkbC5sZF9zeW1ib2xzKTsKKyAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPl9yYXdfc2l6ZSwgZXNkbC5sZF9zeW1iX3NpemUpOworCisgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdGV4dCBhcmVhIGlzIHRoZSBzaXplIG9mIHRoZSAudGV4dCBzZWN0aW9uCisJIHJvdW5kZWQgdXAgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IFNob3VsZCB0aGUgcGFnZSBzaXplIGJlCisJIGNvbmRpdGlvbmFsIG9uIHNvbWV0aGluZz8gICovCisgICAgICBQVVRfV09SRCAoZHlub2JqLAorCQlCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCAweDIwMDApLAorCQllc2RsLmxkX3RleHQpOworICAKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2R5bi0+b3V0cHV0X3NlY3Rpb24sICZlc2RsLAorCQkJCSAgICAgIChzZHluLT5vdXRwdXRfb2Zmc2V0CisJCQkJICAgICAgICsgc2l6ZW9mIGVzZAorCQkJCSAgICAgICArIEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKSwKKwkJCQkgICAgICBzaXplb2YgZXNkbCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JmZC9zeW1zLmMgYi9iZmQvc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OWQxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc3ltcy5jCkBAIC0wLDAgKzEsMTI1MyBAQAorLyogR2VuZXJpYyBzeW1ib2wtdGFibGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitTRUNUSU9OCisJU3ltYm9scworCisJQkZEIHRyaWVzIHRvIG1haW50YWluIGFzIG11Y2ggc3ltYm9sIGluZm9ybWF0aW9uIGFzIGl0IGNhbiB3aGVuCisJaXQgbW92ZXMgaW5mb3JtYXRpb24gZnJvbSBmaWxlIHRvIGZpbGUuIEJGRCBwYXNzZXMgaW5mb3JtYXRpb24KKwl0byBhcHBsaWNhdGlvbnMgdGhvdWdoIHRoZSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuIFdoZW4gdGhlCisJYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIHN5bWJvbCB0YWJsZSwgQkZEIHJlYWRzIHRoZSB0YWJsZSBpbgorCXRoZSBuYXRpdmUgZm9ybSBhbmQgdHJhbnNsYXRlcyBwYXJ0cyBvZiBpdCBpbnRvIHRoZSBpbnRlcm5hbAorCWZvcm1hdC4gVG8gbWFpbnRhaW4gbW9yZSB0aGFuIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8KKwlhcHBsaWNhdGlvbnMsIHNvbWUgdGFyZ2V0cyBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYGBiZWhpbmQgdGhlCisJc2NlbmVzJycgaW4gYSBzdHJ1Y3R1cmUgb25seSB0aGUgcGFydGljdWxhciBiYWNrIGVuZCBrbm93cworCWFib3V0LiBGb3IgZXhhbXBsZSwgdGhlIGNvZmYgYmFjayBlbmQga2VlcHMgdGhlIG9yaWdpbmFsCisJc3ltYm9sIHRhYmxlIHN0cnVjdHVyZSBhcyB3ZWxsIGFzIHRoZSBjYW5vbmljYWwgc3RydWN0dXJlIHdoZW4KKwlhIEJGRCBpcyByZWFkIGluLiBPbiBvdXRwdXQsIHRoZSBjb2ZmIGJhY2sgZW5kIGNhbiByZWNvbnN0cnVjdAorCXRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlIHNvIHRoYXQgbm8gaW5mb3JtYXRpb24gaXMgbG9zdCwgZXZlbgorCWluZm9ybWF0aW9uIHVuaXF1ZSB0byBjb2ZmIHdoaWNoIEJGRCBkb2Vzbid0IGtub3cgb3IKKwl1bmRlcnN0YW5kLiBJZiBhIGNvZmYgc3ltYm9sIHRhYmxlIHdlcmUgcmVhZCwgYnV0IHdlcmUgd3JpdHRlbgorCXRocm91Z2ggYW4gYS5vdXQgYmFjayBlbmQsIGFsbCB0aGUgY29mZiBzcGVjaWZpYyBpbmZvcm1hdGlvbgorCXdvdWxkIGJlIGxvc3QuIFRoZSBzeW1ib2wgdGFibGUgb2YgYSBCRkQKKwlpcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBpbiB1bnRpbCBhIGNhbm9uaWNhbGl6ZSByZXF1ZXN0IGlzCisJbWFkZS4gVGhlbiB0aGUgQkZEIGJhY2sgZW5kIGZpbGxzIGluIGEgdGFibGUgcHJvdmlkZWQgYnkgdGhlCisJYXBwbGljYXRpb24gd2l0aCBwb2ludGVycyB0byB0aGUgY2Fub25pY2FsIGluZm9ybWF0aW9uLiAgVG8KKwlvdXRwdXQgc3ltYm9scywgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIEJGRCB3aXRoIGEgdGFibGUgb2YKKwlwb2ludGVycyB0byBwb2ludGVycyB0byA8PGFzeW1ib2w+PnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucworCWxpa2UgdGhlIGxpbmtlciB0byBvdXRwdXQgYSBzeW1ib2wgYXMgaXQgd2FzIHJlYWQsIHNpbmNlIHRoZSBgYGJlaGluZAorCXRoZSBzY2VuZXMnJyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN0aWxsIGF2YWlsYWJsZS4KK0BtZW51CitAKiBSZWFkaW5nIFN5bWJvbHM6OgorQCogV3JpdGluZyBTeW1ib2xzOjoKK0AqIE1pbmkgU3ltYm9sczo6CitAKiB0eXBlZGVmIGFzeW1ib2w6OgorQCogc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9uczo6CitAZW5kIG1lbnUKKworSU5PREUKK1JlYWRpbmcgU3ltYm9scywgV3JpdGluZyBTeW1ib2xzLCBTeW1ib2xzLCBTeW1ib2xzCitTVUJTRUNUSU9OCisJUmVhZGluZyBzeW1ib2xzCisKKwlUaGVyZSBhcmUgdHdvIHN0YWdlcyB0byByZWFkaW5nIGEgc3ltYm9sIHRhYmxlIGZyb20gYSBCRkQ6CisJYWxsb2NhdGluZyBzdG9yYWdlLCBhbmQgdGhlIGFjdHVhbCByZWFkaW5nIHByb2Nlc3MuIFRoaXMgaXMgYW4KKwlleGNlcnB0IGZyb20gYW4gYXBwbGljYXRpb24gd2hpY2ggcmVhZHMgdGhlIHN5bWJvbCB0YWJsZToKKworfAkgIGxvbmcgc3RvcmFnZV9uZWVkZWQ7Cit8CSAgYXN5bWJvbCAqKnN5bWJvbF90YWJsZTsKK3wJICBsb25nIG51bWJlcl9vZl9zeW1ib2xzOworfAkgIGxvbmcgaTsKK3wKK3wJICBzdG9yYWdlX25lZWRlZCA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKK3wKK3wgICAgICAgICBpZiAoc3RvcmFnZV9uZWVkZWQgPCAwKQorfCAgICAgICAgICAgRkFJTAorfAorfAkgIGlmIChzdG9yYWdlX25lZWRlZCA9PSAwKSB7Cit8CSAgICAgcmV0dXJuIDsKK3wJICB9Cit8CSAgc3ltYm9sX3RhYmxlID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2VfbmVlZGVkKTsKK3wJICAgIC4uLgorfAkgIG51bWJlcl9vZl9zeW1ib2xzID0KK3wJICAgICBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltYm9sX3RhYmxlKTsKK3wKK3wgICAgICAgICBpZiAobnVtYmVyX29mX3N5bWJvbHMgPCAwKQorfCAgICAgICAgICAgRkFJTAorfAorfAkgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc3ltYm9sczsgaSsrKSB7Cit8CSAgICAgcHJvY2Vzc19zeW1ib2wgKHN5bWJvbF90YWJsZVtpXSk7Cit8CSAgfQorCisJQWxsIHN0b3JhZ2UgZm9yIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaXMgaW4gYW4gb2JqYWxsb2MKKwljb25uZWN0ZWQgdG8gdGhlIEJGRDsgaXQgaXMgZnJlZWQgd2hlbiB0aGUgQkZEIGlzIGNsb3NlZC4KKworCitJTk9ERQorV3JpdGluZyBTeW1ib2xzLCBNaW5pIFN5bWJvbHMsIFJlYWRpbmcgU3ltYm9scywgU3ltYm9scworU1VCU0VDVElPTgorCVdyaXRpbmcgc3ltYm9scworCisJV3JpdGluZyBvZiBhIHN5bWJvbCB0YWJsZSBpcyBhdXRvbWF0aWMgd2hlbiBhIEJGRCBvcGVuIGZvcgorCXdyaXRpbmcgaXMgY2xvc2VkLiBUaGUgYXBwbGljYXRpb24gYXR0YWNoZXMgYSB2ZWN0b3Igb2YKKwlwb2ludGVycyB0byBwb2ludGVycyB0byBzeW1ib2xzIHRvIHRoZSBCRkQgYmVpbmcgd3JpdHRlbiwgYW5kCisJZmlsbHMgaW4gdGhlIHN5bWJvbCBjb3VudC4gVGhlIGNsb3NlIGFuZCBjbGVhbnVwIGNvZGUgcmVhZHMKKwl0aHJvdWdoIHRoZSB0YWJsZSBwcm92aWRlZCBhbmQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkKKwlvcGVyYXRpb25zLiBUaGUgQkZEIG91dHB1dCBjb2RlIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkIHdpdGggYW4KKwlgYG93bmVkJycgc3ltYm9sOiBvbmUgd2hpY2ggaGFzIGNvbWUgZnJvbSBhbm90aGVyIEJGRCwgb3Igb25lCisJd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCB1c2luZyA8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+LiAgSGVyZSBpcyBhbgorCWV4YW1wbGUgc2hvd2luZyB0aGUgY3JlYXRpb24gb2YgYSBzeW1ib2wgdGFibGUgd2l0aCBvbmx5IG9uZSBlbGVtZW50OgorCit8CSNpbmNsdWRlICJiZmQuaCIKK3wJbWFpbigpCit8CXsKK3wJICBiZmQgKmFiZmQ7Cit8CSAgYXN5bWJvbCAqcHRyc1syXTsKK3wJICBhc3ltYm9sICpuZXc7Cit8Cit8CSAgYWJmZCA9IGJmZF9vcGVudygiZm9vIiwiYS5vdXQtc3Vub3MtYmlnIik7Cit8CSAgYmZkX3NldF9mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Cit8CSAgbmV3ID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOworfAkgIG5ldy0+bmFtZSA9ICJkdW1teV9zeW1ib2wiOworfAkgIG5ldy0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShhYmZkLCAiLnRleHQiKTsKK3wJICBuZXctPmZsYWdzID0gQlNGX0dMT0JBTDsKK3wJICBuZXctPnZhbHVlID0gMHgxMjM0NTsKK3wKK3wJICBwdHJzWzBdID0gbmV3OworfAkgIHB0cnNbMV0gPSAoYXN5bWJvbCAqKTA7Cit8Cit8CSAgYmZkX3NldF9zeW10YWIoYWJmZCwgcHRycywgMSk7Cit8CSAgYmZkX2Nsb3NlKGFiZmQpOworfAl9Cit8Cit8CS4vbWFrZXN5bQorfAlubSBmb28KK3wJMDAwMTIzNDUgQSBkdW1teV9zeW1ib2wKKworCU1hbnkgZm9ybWF0cyBjYW5ub3QgcmVwcmVzZW50IGFyYml0YXJ5IHN5bWJvbCBpbmZvcm1hdGlvbjsgZm9yCisgCWluc3RhbmNlLCB0aGUgPDxhLm91dD4+IG9iamVjdCBmb3JtYXQgZG9lcyBub3QgYWxsb3cgYW4KKwlhcmJpdGFyeSBudW1iZXIgb2Ygc2VjdGlvbnMuIEEgc3ltYm9sIHBvaW50aW5nIHRvIGEgc2VjdGlvbgorCXdoaWNoIGlzIG5vdCBvbmUgIG9mIDw8LnRleHQ+PiwgPDwuZGF0YT4+IG9yIDw8LmJzcz4+IGNhbm5vdAorCWJlIGRlc2NyaWJlZC4KKworSU5PREUKK01pbmkgU3ltYm9scywgdHlwZWRlZiBhc3ltYm9sLCBXcml0aW5nIFN5bWJvbHMsIFN5bWJvbHMKK1NVQlNFQ1RJT04KKwlNaW5pIFN5bWJvbHMKKworCU1pbmkgc3ltYm9scyBwcm92aWRlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHN5bWJvbCB0YWJsZS4KKwlUaGV5IHVzZSBsZXNzIG1lbW9yeSBzcGFjZSwgYnV0IHJlcXVpcmUgbW9yZSB0aW1lIHRvIGFjY2Vzcy4KKwlUaGV5IGNhbiBiZSB1c2VmdWwgZm9yIHRvb2xzIGxpa2Ugbm0gb3Igb2JqZHVtcCwgd2hpY2ggbWF5CisJaGF2ZSB0byBoYW5kbGUgc3ltYm9sIHRhYmxlcyBvZiBleHRyZW1lbHkgbGFyZ2UgZXhlY3V0YWJsZXMuCisKKwlUaGUgPDxiZmRfcmVhZF9taW5pc3ltYm9scz4+IGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgc3ltYm9scworCWludG8gbWVtb3J5IGluIGFuIGludGVybmFsIGZvcm0uICBJdCB3aWxsIHJldHVybiBhIDw8dm9pZCAqPj4KKwlwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5LCBhIHN5bWJvbCBjb3VudCwgYW5kIHRoZSBzaXplIG9mCisJZWFjaCBzeW1ib2wuICBUaGUgcG9pbnRlciBpcyBhbGxvY2F0ZWQgdXNpbmcgPDxtYWxsb2M+PiwgYW5kCisJc2hvdWxkIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCisJVGhlIGZ1bmN0aW9uIDw8YmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sPj4gd2lsbCB0YWtlIGEgcG9pbnRlcgorCXRvIGEgbWluaXN5bWJvbCwgYW5kIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXR1cm5lZCBieQorCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4sIGFuZCByZXR1cm4gYSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuCisJVGhlIHJldHVybiB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgZnJvbQorCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4gd2hpY2ggd2FzIHBhc3NlZCBpbi4KKworKi8KKworCisKKy8qCitET0NERAorSU5PREUKK3R5cGVkZWYgYXN5bWJvbCwgc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgTWluaSBTeW1ib2xzLCBTeW1ib2xzCisKKyovCisvKgorU1VCU0VDVElPTgorCXR5cGVkZWYgYXN5bWJvbAorCisJQW4gPDxhc3ltYm9sPj4gaGFzIHRoZSBmb3JtOgorCisqLworCisvKgorQ09ERV9GUkFHTUVOVAorCisuCisudHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5CisueworLgl7KiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KKy4JICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCisuICAgCSAgIGluZm9ybWF0aW9uIChpbnZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcikgaXMgY2FycmllZAorLgkgICB3aXRoIHRoZSBzeW1ib2wuCisuCisuCSAgIFRoaXMgZmllbGQgaXMgKmFsbW9zdCogcmVkdW5kYW50LCBzaW5jZSB5b3UgY2FuIHVzZSBzZWN0aW9uLT5vd25lcgorLgkgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucworLgkgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKKy4JICAgdGhlc2UgZ2xvYmFscyBiZSBwZXItYmZkIChvciBwZXItdGFyZ2V0LWZsYXZvcikuICBGSVhNRS4gKn0KKy4KKy4gIHN0cnVjdCBfYmZkICp0aGVfYmZkOyB7KiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICp9CisuCisuCXsqIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKKy4JICAgYXBwbGljYXRpb24gbWF5IG5vdCBhbHRlciBpdC4gKn0KKy4gIENPTlNUIGNoYXIgKm5hbWU7CisuCisuCXsqIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQorLiAgICAgICAgICBudW1lcmljIHZhbHVlIHdpdGggYSBwb2ludGVyLCBzaW5jZSBzb21lIGZsYWdzIGluZGljYXRlIHRoYXQKKy4gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKn0KKy4gIHN5bXZhbHVlIHZhbHVlOworLgorLgl7KiBBdHRyaWJ1dGVzIG9mIGEgc3ltYm9sOiAqfQorLgorLiNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKKy4KKy4JeyogVGhlIHN5bWJvbCBoYXMgbG9jYWwgc2NvcGU7IDw8c3RhdGljPj4gaW4gPDxDPj4uIFRoZSB2YWx1ZQorLiAJICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQorLiNkZWZpbmUgQlNGX0xPQ0FMCTB4MDEKKy4KKy4JeyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKKy4JICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQorLiNkZWZpbmUgQlNGX0dMT0JBTAkweDAyCisuCisuCXsqIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcworLgkgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9CisuI2RlZmluZSBCU0ZfRVhQT1JUCUJTRl9HTE9CQUwgeyogbm8gcmVhbCBkaWZmZXJlbmNlICp9CisuCisuCXsqIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKKy4JICAgPDxCU0ZfTE9DQUw+PiwgPDxCU0ZfRk9SVF9DT01NPj4sICA8PEJTRl9VTkRFRklORUQ+PiBvcgorLgkgICA8PEJTRl9HTE9CQUw+PiAqfQorLgorLgl7KiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQorLgkgICBtZWFuaW5nLiAqfQorLiNkZWZpbmUgQlNGX0RFQlVHR0lORwkweDA4CisuCisuCXsqIFRoZSBzeW1ib2wgZGVub3RlcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgVXNlZCBpbiBFTEYsCisuCSAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqfQorLiNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKKy4KKy4JeyogVXNlZCBieSB0aGUgbGlua2VyLiAqfQorLiNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKKy4jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCisuCisuCXsqIEEgd2VhayBnbG9iYWwgc3ltYm9sLCBvdmVycmlkYWJsZSB3aXRob3V0IHdhcm5pbmdzIGJ5CisuCSAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqfQorLiNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKKy4KKy4gICAgICAgeyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgdG8gcG9pbnQgdG8gYSBzZWN0aW9uLCBlLmcuIEVMRidzCisuCSAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqfQorLiNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCisuCisuCXsqIFRoZSBzeW1ib2wgdXNlZCB0byBiZSBhIGNvbW1vbiBzeW1ib2wsIGJ1dCBub3cgaXQgaXMKKy4JICAgYWxsb2NhdGVkLiAqfQorLiNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCisuCisuCXsqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjb21tb24gZGF0YS4gKn0KKy4jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCisuCisuCXsqIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKKy4JICAgbG9jYXRpb24gaW4gYW4gb3V0cHV0IGZpbGUgLSBpZSBpbiBjb2ZmIGEgPDxJU0ZDTj4+IHN5bWJvbAorLgkgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKKy4JICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAorLiAgCSAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICp9CisuCisuI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAorLgorLgl7KiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqfQorLiNkZWZpbmUgQlNGX0NPTlNUUlVDVE9SICAgMHg4MDAKKy4KKy4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQorLgkgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKKy4JICAgaWYgYSByZWZlcmVuY2UgaXMgbWFkZSB0byBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQKKy4JICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICp9CisuI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKKy4KKy4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBpbmRpcmVjdC4gIFRoaXMgc3ltYm9sIGlzIGFuIGluZGlyZWN0CisuCSAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqfQorLiNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCisuCisuCXsqIEJTRl9GSUxFIG1hcmtzIHN5bWJvbHMgdGhhdCBjb250YWluIGEgZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkCisuCSAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICp9CisuI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKKy4KKy4JeyogU3ltYm9sIGlzIGZyb20gZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKn0KKy4jZGVmaW5lIEJTRl9EWU5BTUlDCSAgIDB4ODAwMAorLgorLiAgICAgICB7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcworLiAgICAgICAgICBvdGhlcnMgc29tZWRheS4gICp9CisuI2RlZmluZSBCU0ZfT0JKRUNUCSAgIDB4MTAwMDAKKy4KKy4gIGZsYWd3b3JkIGZsYWdzOworLgorLgl7KiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKKy4JICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAorLiAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKn0KKy4gIHN0cnVjdCBzZWMgKnNlY3Rpb247CisuCisuCXsqIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICp9CisuICB1bmlvbgorLiAgICB7CisuICAgICAgUFRSIHA7CisuICAgICAgYmZkX3ZtYSBpOworLiAgICB9IHVkYXRhOworLgorLn0gYXN5bWJvbDsKKyovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorCitzdGF0aWMgY2hhciBjb2ZmX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworLyoKK0RPQ0RECitJTk9ERQorc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgICwgdHlwZWRlZiBhc3ltYm9sLCBTeW1ib2xzCitTVUJTRUNUSU9OCisJU3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucworKi8KKworLyoKK0ZVTkNUSU9OCisJYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycworCXRvIDw8YXN5bWJvbHM+PiBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgQHZhcnthYmZkfSwKKwlpbmNsdWRpbmcgYSB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluCisJdGhlIEJGRCwgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLgorCisuI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCisuICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCisKKyovCisKKy8qCitGVU5DVElPTgorCWJmZF9pc19sb2NhbF9sYWJlbAorCitTWU5PUFNJUworICAgICAgICBib29sZWFuIGJmZF9pc19sb2NhbF9sYWJlbChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSk7CisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBAdmFye3N5bX0gaW4gdGhlIEJGRCBAdmFye2FiZmR9IGlzCisJYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuIGZhbHNlLgorKi8KKworYm9vbGVhbgorYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChzeW0tPm5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgc3ltLT5uYW1lKTsKK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKKworU1lOT1BTSVMKKyAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpOworCitERVNDUklQVElPTgorCVJldHVybiB0cnVlIGlmIGEgc3ltYm9sIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lfSBpbiB0aGUgQkZECisJQHZhcnthYmZkfSBpcyBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4KKwlmYWxzZS4gIFRoaXMganVzdCBjaGVja3Mgd2hldGhlciB0aGUgbmFtZSBoYXMgdGhlIGZvcm0gb2YgYQorCWxvY2FsIGxhYmVsLgorCisuI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCisuICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCisqLworCisvKgorRlVOQ1RJT04KKwliZmRfY2Fub25pY2FsaXplX3N5bXRhYgorCitERVNDUklQVElPTgorCVJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIEB2YXJ7YWJmZH0sIGFuZCBmaWxscyBpbgorCXRoZSB2ZWN0b3IgQHZhcntsb2NhdGlvbn0gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQKKwlhIHRyYWlsaW5nIE5VTEwuCisJUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHN5bWJvbCBwb2ludGVycywgbm90CisJaW5jbHVkaW5nIHRoZSBOVUxMLgorCisKKy4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCisuICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKKy4gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQorCisqLworCisKKy8qCitGVU5DVElPTgorCWJmZF9zZXRfc3ltdGFiCisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfc2V0X3N5bXRhYiAoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCk7CisKK0RFU0NSSVBUSU9OCisJQXJyYW5nZSB0aGF0IHdoZW4gdGhlIG91dHB1dCBCRkQgQHZhcnthYmZkfSBpcyBjbG9zZWQsCisJdGhlIHRhYmxlIEB2YXJ7bG9jYXRpb259IG9mIEB2YXJ7Y291bnR9IHBvaW50ZXJzIHRvIHN5bWJvbHMKKwl3aWxsIGJlIHdyaXR0ZW4uCisqLworCitib29sZWFuCitiZmRfc2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24sIHN5bWNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKKyAgICAgdW5zaWduZWQgaW50IHN5bWNvdW50OworeworICBpZiAoKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB8fCAoYmZkX3JlYWRfcCAoYWJmZCkpKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSBsb2NhdGlvbjsKKyAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9wcmludF9zeW1ib2xfdmFuZGYKKworU1lOT1BTSVMKKwl2b2lkIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCk7CisKK0RFU0NSSVBUSU9OCisJUHJpbnQgdGhlIHZhbHVlIGFuZCBmbGFncyBvZiB0aGUgQHZhcntzeW1ib2x9IHN1cHBsaWVkIHRvIHRoZQorCXN0cmVhbSBAdmFye2ZpbGV9LgorKi8KK3ZvaWQKK2JmZF9wcmludF9zeW1ib2xfdmFuZGYgKGFyZywgc3ltYm9sKQorICAgICBQVFIgYXJnOworICAgICBhc3ltYm9sICpzeW1ib2w7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhcmc7CisgIGZsYWd3b3JkIHR5cGUgPSBzeW1ib2wtPmZsYWdzOworICBpZiAoc3ltYm9sLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKKyAgICB9CisKKyAgLyogVGhpcyBwcmVzdW1lcyB0aGF0IGEgc3ltYm9sIGNhbiBub3QgYmUgYm90aCBCU0ZfREVCVUdHSU5HIGFuZAorICAgICBCU0ZfRFlOQU1JQywgbm9yIG1vcmUgdGhhbiBvbmUgb2YgQlNGX0ZVTkNUSU9OLCBCU0ZfRklMRSwgYW5kCisgICAgIEJTRl9PQkpFQ1QuICAqLworICBmcHJpbnRmIChmaWxlLCAiICVjJWMlYyVjJWMlYyVjIiwKKwkgICAoKHR5cGUgJiBCU0ZfTE9DQUwpCisJICAgID8gKHR5cGUgJiBCU0ZfR0xPQkFMKSA/ICchJyA6ICdsJworCSAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAorCSAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnLAorCSAgICh0eXBlICYgQlNGX0NPTlNUUlVDVE9SKSA/ICdDJyA6ICcgJywKKwkgICAodHlwZSAmIEJTRl9XQVJOSU5HKSA/ICdXJyA6ICcgJywKKwkgICAodHlwZSAmIEJTRl9JTkRJUkVDVCkgPyAnSScgOiAnICcsCisJICAgKHR5cGUgJiBCU0ZfREVCVUdHSU5HKSA/ICdkJyA6ICh0eXBlICYgQlNGX0RZTkFNSUMpID8gJ0QnIDogJyAnLAorCSAgICgodHlwZSAmIEJTRl9GVU5DVElPTikKKwkgICAgPyAnRicKKwkgICAgOiAoKHR5cGUgJiBCU0ZfRklMRSkKKwkgICAgICAgPyAnZicKKwkgICAgICAgOiAoKHR5cGUgJiBCU0ZfT0JKRUNUKSA/ICdPJyA6ICcgJykpKSk7Cit9CisKKworLyoKK0ZVTkNUSU9OCisJYmZkX21ha2VfZW1wdHlfc3ltYm9sCisKK0RFU0NSSVBUSU9OCisJQ3JlYXRlIGEgbmV3IDw8YXN5bWJvbD4+IHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBAdmFye2FiZmR9CisJYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCisKKwlUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZQorCWluZm9ybWF0aW9uIHN1cnJvdW5kaW5nIHRoZSA8PGFzeW1ib2w+Pi4gQnVpbGRpbmcgeW91ciBvd24KKwk8PGFzeW1ib2w+PiBhbmQgcG9pbnRpbmcgdG8gaXQgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlCisJaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLgorCisuI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAorLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKKyovCisKKy8qCitGVU5DVElPTgorCWJmZF9tYWtlX2RlYnVnX3N5bWJvbAorCitERVNDUklQVElPTgorCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfSwKKwl0byBiZSB1c2VkIGFzIGEgZGVidWdnaW5nIHN5bWJvbC4gIEZ1cnRoZXIgZGV0YWlscyBvZiBpdHMgdXNlIGhhdmUKKwl5ZXQgdG8gYmUgd29ya2VkIG91dC4KKworLiNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKKy4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKKyovCisKK3N0cnVjdCBzZWN0aW9uX3RvX3R5cGUKK3sKKyAgQ09OU1QgY2hhciAqc2VjdGlvbjsKKyAgY2hhciB0eXBlOworfTsKKworLyogTWFwIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgorICAgVGhpcyB0YWJsZSBpcyBwcm9iYWJseSBpbmNvbXBsZXRlLiAgSXQgaXMgc29ydGVkIGZvciBjb252ZW5pZW5jZSBvZgorICAgYWRkaW5nIGVudHJpZXMuICBTaW5jZSBpdCBpcyBzbyBzaG9ydCwgYSBsaW5lYXIgc2VhcmNoIGlzIHVzZWQuICAqLworc3RhdGljIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPQoreworICB7IipERUJVRyoiLCAnTid9LAorICB7Ii5ic3MiLCAnYid9LAorICB7Inplcm92YXJzIiwgJ2InfSwJCS8qIE1SSSAuYnNzICovCisgIHsiLmRhdGEiLCAnZCd9LAorICB7InZhcnMiLCAnZCd9LAkJLyogTVJJIC5kYXRhICovCisgIHsiLnJkYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KKyAgeyIucm9kYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KKyAgeyIuc2JzcyIsICdzJ30sCQkvKiBTbWFsbCBCU1MgKHVuaW5pdGlhbGl6ZWQgZGF0YSkuICAqLworICB7Ii5zY29tbW9uIiwgJ2MnfSwJCS8qIFNtYWxsIGNvbW1vbi4gICovCisgIHsiLnNkYXRhIiwgJ2cnfSwJCS8qIFNtYWxsIGluaXRpYWxpemVkIGRhdGEuICAqLworICB7Ii50ZXh0IiwgJ3QnfSwKKyAgeyJjb2RlIiwgJ3QnfSwJCS8qIE1SSSAudGV4dCAqLworICB7MCwgMH0KK307CisKKy8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCisgICBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBDT0ZGIHNlY3Rpb24uICAKKworICAgQ2hlY2sgZm9yIGFueSBsZWFkaW5nIHN0cmluZyB3aGljaCBtYXRjaGVzLCBzbyAudGV4dDUgcmV0dXJucworICAgJ3QnIGFzIHdlbGwgYXMgLnRleHQgKi8KKworc3RhdGljIGNoYXIKK2NvZmZfc2VjdGlvbl90eXBlIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBDT05TVCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OworCisgIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykgCisgICAgaWYgKCFzdHJuY21wIChzLCB0LT5zZWN0aW9uLCBzdHJsZW4gKHQtPnNlY3Rpb24pKSkKKyAgICAgIHJldHVybiB0LT50eXBlOworCisgIHJldHVybiAnPyc7Cit9CisKKyNpZm5kZWYgaXNsb3dlcgorI2RlZmluZSBpc2xvd2VyKGMpICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpCisjZW5kaWYKKyNpZm5kZWYgdG91cHBlcgorI2RlZmluZSB0b3VwcGVyKGMpIChpc2xvd2VyKGMpID8gKChjKSAmIH4weDIwKSA6IChjKSkKKyNlbmRpZgorCisvKgorRlVOQ1RJT04KKwliZmRfZGVjb2RlX3N5bWNsYXNzCisKK0RFU0NSSVBUSU9OCisJUmV0dXJuIGEgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN5bWJvbAorCWNsYXNzIG9mIEB2YXJ7c3ltYm9sfSwgb3IgJz8nIGZvciBhbiB1bmtub3duIGNsYXNzLgorCitTWU5PUFNJUworCWludCBiZmRfZGVjb2RlX3N5bWNsYXNzKGFzeW1ib2wgKnN5bWJvbCk7CisqLworaW50CitiZmRfZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpCisgICAgIGFzeW1ib2wgKnN5bWJvbDsKK3sKKyAgY2hhciBjOworCisgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCisgICAgcmV0dXJuICdDJzsKKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKyAgICByZXR1cm4gJ1UnOworICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIHJldHVybiAnSSc7CisgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCisgICAgcmV0dXJuICdXJzsKKyAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0xPQ0FMKSkpCisgICAgcmV0dXJuICc/JzsKKworICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQorICAgIGMgPSAnYSc7CisgIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKKyAgICBjID0gY29mZl9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7CisgIGVsc2UKKyAgICByZXR1cm4gJz8nOworICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCisgICAgYyA9IHRvdXBwZXIgKGMpOworICByZXR1cm4gYzsKKworICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBqdXN0IHlldCwgYnV0IHdlIHdpbGwgc29vbjoKKyAgICAgTl9TRVRWOiAndic7CisgICAgIE5fU0VUQTogJ2wnOworICAgICBOX1NFVFQ6ICd4JzsKKyAgICAgTl9TRVREOiAneic7CisgICAgIE5fU0VUQjogJ3MnOworICAgICBOX0lORFI6ICdpJzsKKyAgICAgKi8KK30KKworLyoKK0ZVTkNUSU9OCisJYmZkX3N5bWJvbF9pbmZvCisKK0RFU0NSSVBUSU9OCisJRmlsbCBpbiB0aGUgYmFzaWMgaW5mbyBhYm91dCBzeW1ib2wgdGhhdCBubSBuZWVkcy4KKwlBZGRpdGlvbmFsIGluZm8gbWF5IGJlIGFkZGVkIGJ5IHRoZSBiYWNrLWVuZHMgYWZ0ZXIKKwljYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisKK1NZTk9QU0lTCisJdm9pZCBiZmRfc3ltYm9sX2luZm8oYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KTsKKyovCisKK3ZvaWQKK2JmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpCisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgcmV0LT50eXBlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKKyAgaWYgKHJldC0+dHlwZSAhPSAnVScpCisgICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYTsKKyAgZWxzZQorICAgIHJldC0+dmFsdWUgPSAwOworICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKKworU1lOT1BTSVMKKwlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pOworCitERVNDUklQVElPTgorCUNvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzeW19IGluIHRoZSBCRkQKKwlAdmFye2liZmR9IHRvIHRoZSBzeW1ib2wgQHZhcntvc3ltfSBpbiB0aGUgQkZEIEB2YXJ7b2JmZH0uCisJUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCisJcmV0dXJucyBhcmU6CisKKwlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KKwlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvc2VjfS4KKworLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCisuICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKKy4JCShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKKworKi8KKworLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBtaW5pIHN5bWJvbHMuCisgICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYmFja2VuZCBkb2VzIG5vdCBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgIHZlcnNpb24uICBJdCBqdXN0IHVzZXMgQkZEIGFzeW1ib2wgc3RydWN0dXJlcyBhcyBtaW5pIHN5bWJvbHMuICAqLworCitsb25nCitfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIGR5bmFtaWM7CisgICAgIFBUUiAqbWluaXN5bXNwOworICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOworeworICBsb25nIHN0b3JhZ2U7CisgIGFzeW1ib2wgKipzeW1zID0gTlVMTDsKKyAgbG9uZyBzeW1jb3VudDsKKworICBpZiAoZHluYW1pYykKKyAgICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7CisgIGVsc2UKKyAgICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOworICBpZiAoc3RvcmFnZSA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzdG9yYWdlKTsKKyAgaWYgKHN5bXMgPT0gTlVMTCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICBpZiAoZHluYW1pYykKKyAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bXMpOworICBlbHNlCisgICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7CisgIGlmIChzeW1jb3VudCA8IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgKm1pbmlzeW1zcCA9IChQVFIpIHN5bXM7CisgICpzaXplcCA9IHNpemVvZiAoYXN5bWJvbCAqKTsKKyAgcmV0dXJuIHN5bWNvdW50OworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoc3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKHN5bXMpOworICByZXR1cm4gLTE7Cit9CisKKy8qIFRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGEgbWluaXN5bWJvbCB0bworICAgYW4gYXN5bWJvbC4gIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzeW0gYXJndW1lbnQgd2UgYXJlIHBhc3NlZDsKKyAgIHdlIGp1c3QgcmV0dXJuIHRoZSBhc3ltYm9sIHRoZSBtaW5pc3ltYm9sIHBvaW50cyB0by4gICovCisKKy8qQVJHU1VTRUQqLworYXN5bWJvbCAqCitfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIGR5bmFtaWM7CisgICAgIGNvbnN0IFBUUiBtaW5pc3ltOworICAgICBhc3ltYm9sICpzeW07Cit7CisgIHJldHVybiAqKGFzeW1ib2wgKiopIG1pbmlzeW07Cit9CisKKy8qIExvb2sgdGhyb3VnaCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gLnN0YWIgYW5kIC5zdGFic3RyCisgICBzZWN0aW9ucyB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZSBhbmQgbGluZSBjbG9zZXN0IHRvIGEgZGVzaXJlZAorICAgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgYnkgQ09GRiBhbmQgRUxGIHRhcmdldHMuICBJdCBzZXRzICpwZm91bmQKKyAgIHRvIHRydWUgaWYgaXQgZmluZHMgc29tZSBpbmZvcm1hdGlvbi4gIFRoZSAqcGluZm8gZmllbGQgaXMgdXNlZCB0bworICAgcGFzcyBjYWNoZWQgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBvZiB0aGlzIHJvdXRpbmU7IHRoaXMgZmlyc3QgdGltZQorICAgdGhlIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBhIEJGRCwgKnBpbmZvIHNob3VsZCBiZSBOVUxMLiAgVGhlIHZhbHVlCisgICBwbGFjZWQgaW4gKnBpbmZvIHNob3VsZCBiZSBzYXZlZCB3aXRoIHRoZSBCRkQsIGFuZCBwYXNzZWQgYmFjayBlYWNoCisgICB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KKworLyogV2UgdXNlIGEgY2FjaGUgYnkgZGVmYXVsdC4gICovCisKKyNkZWZpbmUgRU5BQkxFX0NBQ0hJTkcKKworLyogV2Uga2VlcCBhbiBhcnJheSBvZiBpbmRleGVudHJ5IHN0cnVjdHVyZXMgdG8gcmVjb3JkIHdoZXJlIGluIHRoZQorICAgc3RhYnMgc2VjdGlvbiB3ZSBzaG91bGQgbG9vayB0byBmaW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhCisgICBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLworCitzdHJ1Y3QgaW5kZXhlbnRyeQoreworICBiZmRfdm1hIHZhbDsKKyAgYmZkX2J5dGUgKnN0YWI7CisgIGJmZF9ieXRlICpzdHI7CisgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOworICBjaGFyICpmaWxlX25hbWU7CisgIGNoYXIgKmZ1bmN0aW9uX25hbWU7Cit9OworCisvKiBDb21wYXJlIHR3byBpbmRleGVudHJ5IHN0cnVjdHVyZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLworCitzdGF0aWMgaW50CitjbXBpbmRleGVudHJ5IChhLCBiKQorICAgICBjb25zdCBQVFIgKmE7CisgICAgIGNvbnN0IFBUUiAqYjsKK3sKKyAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRBID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGE7CisgIGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICpjb250ZXN0YW50QiA9IChjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqKSBiOworCisgIGlmIChjb250ZXN0YW50QS0+dmFsIDwgY29udGVzdGFudEItPnZhbCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKGNvbnRlc3RhbnRBLT52YWwgPiBjb250ZXN0YW50Qi0+dmFsKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW4gKnBpbmZvLiAgKi8KKworc3RydWN0IHN0YWJfZmluZF9pbmZvCit7CisgIC8qIFRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KKyAgYXNlY3Rpb24gKnN0YWJzZWM7CisgIC8qIFRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KKyAgYXNlY3Rpb24gKnN0cnNlYzsKKyAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KKyAgYmZkX2J5dGUgKnN0YWJzOworICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLworICBiZmRfYnl0ZSAqc3RyczsKKworICAvKiBBIHRhYmxlIHRoYXQgaW5kZXhlcyBzdGFicyBieSBtZW1vcnkgYWRkcmVzcy4gICovCisgIHN0cnVjdCBpbmRleGVudHJ5ICppbmRleHRhYmxlOworICAvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kZXh0YWJsZS4gICovCisgIGludCBpbmRleHRhYmxlc2l6ZTsKKworI2lmZGVmIEVOQUJMRV9DQUNISU5HCisgIC8qIENhY2hlZCB2YWx1ZXMgdG8gcmVzdGFydCBxdWlja2x5LiAgKi8KKyAgc3RydWN0IGluZGV4ZW50cnkgKmNhY2hlZF9pbmRleGVudHJ5OworICBiZmRfdm1hIGNhY2hlZF9vZmZzZXQ7CisgIGJmZF9ieXRlICpjYWNoZWRfc3RhYjsKKyAgY2hhciAqY2FjaGVkX2ZpbGVfbmFtZTsKKyNlbmRpZgorCisgIC8qIFNhdmVkIHB0ciB0byBtYWxsb2MnZWQgZmlsZW5hbWUuICAqLworICBjaGFyICpmaWxlbmFtZTsKK307CisKK2Jvb2xlYW4KK19iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsIHBmb3VuZCwKKwkJCQkgICAgIHBmaWxlbmFtZSwgcGZubmFtZSwgcGxpbmUsIHBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYmZkX3ZtYSBvZmZzZXQ7CisgICAgIGJvb2xlYW4gKnBmb3VuZDsKKyAgICAgY29uc3QgY2hhciAqKnBmaWxlbmFtZTsKKyAgICAgY29uc3QgY2hhciAqKnBmbm5hbWU7CisgICAgIHVuc2lnbmVkIGludCAqcGxpbmU7CisgICAgIFBUUiAqcGluZm87Cit7CisgIHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqaW5mbzsKKyAgYmZkX3NpemVfdHlwZSBzdGFic2l6ZSwgc3Ryc2l6ZTsKKyAgYmZkX2J5dGUgKnN0YWIsICpzdHIsICpsYXN0X3N0YWI7CisgIGJmZF9zaXplX3R5cGUgc3Ryb2ZmOworICBzdHJ1Y3QgaW5kZXhlbnRyeSAqaW5kZXhlbnRyeTsKKyAgY2hhciAqZGlyZWN0b3J5X25hbWUsICpmaWxlX25hbWU7CisgIGludCBzYXdfZnVuOworCisgICpwZm91bmQgPSBmYWxzZTsKKyAgKnBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOworICAqcGZubmFtZSA9IE5VTEw7CisgICpwbGluZSA9IDA7CisKKyAgLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKKyAgICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4CisgICAgICAgMSBieXRlIHN0YWIgdHlwZQorICAgICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCisgICAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAorICAgICAgIDQgYnl0ZSBzdGFiIHZhbHVlCisgICAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuCisKKyAgICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKKyAgICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aAorICAgICBvZiB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGlzIHVuaXQsIGFuZCB0aGUgZGVzYyBmaWVsZCBpcyB0aGUKKyAgICAgbnVtYmVyIG9mIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCisKKyNkZWZpbmUgU1RSRFhPRkYgKDApCisjZGVmaW5lIFRZUEVPRkYgKDQpCisjZGVmaW5lIE9USEVST0ZGICg1KQorI2RlZmluZSBERVNDT0ZGICg2KQorI2RlZmluZSBWQUxPRkYgKDgpCisjZGVmaW5lIFNUQUJTSVpFICgxMikKKworICBpbmZvID0gKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqKSAqcGluZm87CisgIGlmIChpbmZvICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKKwl7CisJICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKKyAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb25nIHJlbG9jX3NpemUsIHJlbG9jX2NvdW50OworICAgICAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKKyAgICAgIGludCBpOworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIGNoYXIgKmZpbGVfbmFtZTsKKyAgICAgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOworICAgICAgY2hhciAqZnVuY3Rpb25fbmFtZTsKKworICAgICAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICppbmZvKTsKKyAgICAgIGlmIChpbmZvID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBGSVhNRTogV2hlbiB1c2luZyB0aGUgbGlua2VyIC0tc3BsaXQtYnktZmlsZSBvcgorCSAtLXNwbGl0LWJ5LXJlbG9jIG9wdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgLnN0YWIgYW5kCisJIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIHNwbGl0LiAgV2Ugc2hvdWxkIGhhbmRsZSB0aGF0LiAgKi8KKworICAgICAgaW5mby0+c3RhYnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKKyAgICAgIGluZm8tPnN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKKworICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKKwl7CisJICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZXQgKnBpbmZvIHNvIHRoYXQgd2UKKyAgICAgICAgICAgICBjYW4gcmV0dXJuIHF1aWNrbHkgaW4gdGhlIGluZm8gIT0gTlVMTCBjYXNlIGFib3ZlLiAgKi8KKwkgICpwaW5mbyA9IChQVFIpIGluZm87CisJICByZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICAgIHN0YWJzaXplID0gaW5mby0+c3RhYnNlYy0+X3Jhd19zaXplOworICAgICAgc3Ryc2l6ZSA9IGluZm8tPnN0cnNlYy0+X3Jhd19zaXplOworCisgICAgICBpbmZvLT5zdGFicyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YWJzaXplKTsKKyAgICAgIGluZm8tPnN0cnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJzaXplKTsKKyAgICAgIGlmIChpbmZvLT5zdGFicyA9PSBOVUxMIHx8IGluZm8tPnN0cnMgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3RhYnNlYywgaW5mby0+c3RhYnMsIDAsCisJCQkJICAgICAgc3RhYnNpemUpCisJICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3Ryc2VjLCBpbmZvLT5zdHJzLCAwLAorCQkJCQkgc3Ryc2l6ZSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCB3ZSBoYXZlIHRvIHJlbG9jYXRlCisJIHRoZSBlbnRyaWVzIGluIC5zdGFiLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNpbXBsZSAzMiBiaXQKKwkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSwgc28KKwkgdGhpcyBzaG91bGQgYmUgbm8gYmlnIGRlYWwuICAqLworICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGluZm8tPnN0YWJzZWMpOworICAgICAgaWYgKHJlbG9jX3NpemUgPCAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKKyAgICAgIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBpbmZvLT5zdGFic2VjLCByZWxvY192ZWN0b3IsCisJCQkJCSAgICBzeW1ib2xzKTsKKyAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCisJeworCSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQorCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmIChyZWxvY19jb3VudCA+IDApCisJeworCSAgYXJlbGVudCAqKnByOworCisJICBmb3IgKHByID0gcmVsb2NfdmVjdG9yOyAqcHIgIT0gTlVMTDsgcHIrKykKKwkgICAgeworCSAgICAgIGFyZWxlbnQgKnI7CisJICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CisJICAgICAgYXN5bWJvbCAqc3ltOworCisJICAgICAgciA9ICpwcjsKKwkgICAgICBpZiAoci0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAorCQkgIHx8IHItPmhvd3RvLT5zaXplICE9IDIKKwkJICB8fCByLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgorCQkgIHx8IHItPmhvd3RvLT5wY19yZWxhdGl2ZQorCQkgIHx8IHItPmhvd3RvLT5iaXRwb3MgIT0gMAorCQkgIHx8IHItPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQorCQl7CisJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAoXygiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIpKTsKKwkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworCQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKKwkJICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisKKwkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOworCSAgICAgIHZhbCAmPSByLT5ob3d0by0+c3JjX21hc2s7CisJICAgICAgc3ltID0gKnItPnN5bV9wdHJfcHRyOworCSAgICAgIHZhbCArPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWEgKyByLT5hZGRlbmQ7CisJICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOworCSAgICB9CisJfQorCisgICAgICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCisJZnJlZSAocmVsb2NfdmVjdG9yKTsKKworICAgICAgLyogRmlyc3QgdGltZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGJ1aWxkIGEgdGFibGUgbWF0Y2hpbmcKKwkgZnVuY3Rpb24gVk0gYWRkcmVzc2VzIHRvIHN0YWJzLCB0aGVuIHNvcnQgYmFzZWQgb24gc3RhcnRpbmcKKwkgVk0gYWRkcmVzcy4gIERvIHRoaXMgaW4gdHdvIHBhc3Nlczogb25jZSB0byBjb3VudCBob3cgbWFueQorCSB0YWJsZSBlbnRyaWVzIHdlJ2xsIG5lZWQsIGFuZCBhIHNlY29uZCB0byBhY3R1YWxseSBidWlsZCB0aGUKKwkgdGFibGUuICAqLworCisgICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IDA7CisgICAgICBzYXdfZnVuID0gMTsKKyAgICAgIGZvciAoc3RhYiA9IGluZm8tPnN0YWJzOyBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSBTVEFCU0laRSkKKwl7CisJICBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX1NPKQorCSAgICB7CisJICAgICAgLyogTl9TTyB3aXRoIG51bGwgbmFtZSBpbmRpY2F0ZXMgRU9GICovCisJICAgICAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRikgPT0gMCkKKwkJY29udGludWU7CisKKwkgICAgICAvKiBpZiB3ZSBkaWQgbm90IHNlZSBhIGZ1bmN0aW9uIGRlZiwgbGVhdmUgc3BhY2UgZm9yIG9uZS4gKi8KKwkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQorCQkrK2luZm8tPmluZGV4dGFibGVzaXplOworCisJICAgICAgc2F3X2Z1biA9IDA7CisKKwkgICAgICAvKiB0d28gTl9TTydzIGluIGEgcm93IGlzIGEgZmlsZW5hbWUgYW5kIGRpcmVjdG9yeS4gU2tpcCAqLworCSAgICAgIGlmIChzdGFiICsgU1RBQlNJWkUgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplCisJCSAgJiYgKihzdGFiICsgU1RBQlNJWkUgKyBUWVBFT0ZGKSA9PSBOX1NPKQorCQl7CisJCSAgc3RhYiArPSBTVEFCU0laRTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChzdGFiW1RZUEVPRkZdID09IE5fRlVOKQorCSAgICB7CisJICAgICAgc2F3X2Z1biA9IDE7CisJICAgICAgKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHNhd19mdW4gPT0gMCkKKwkrK2luZm8tPmluZGV4dGFibGVzaXplOworICAgICAgCisgICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZXNpemUgPT0gMCkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7CisKKyAgICAgIGluZm8tPmluZGV4dGFibGUgPSAoKHN0cnVjdCBpbmRleGVudHJ5ICopCisJCQkgIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkgICAgIChzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KQorCQkJCSAgICAgICogaW5mby0+aW5kZXh0YWJsZXNpemUpKSk7CisgICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKKyAgICAgIHNhd19mdW4gPSAxOworCisgICAgICBmb3IgKGkgPSAwLCBzdHJvZmYgPSAwLCBzdGFiID0gaW5mby0+c3RhYnMsIHN0ciA9IGluZm8tPnN0cnM7CisJICAgaSA8IGluZm8tPmluZGV4dGFibGVzaXplICYmIHN0YWIgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplOworCSAgIHN0YWIgKz0gU1RBQlNJWkUpCisJeworCSAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLworCSAgICAgIGlmICgoYmZkX3NpemVfdHlwZSkgKChpbmZvLT5zdHJzICsgc3Ryc2l6ZSkgLSBzdHIpIDwgc3Ryb2ZmKQorCQlicmVhazsKKwkgICAgICBzdHIgKz0gc3Ryb2ZmOworCSAgICAgIHN0cm9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgTl9TTzoKKwkgICAgICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLworCisJICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNyZWF0ZXMgYSBuZXcgaW5kZXh0YWJsZSBlbnRyeSB3aXRoCisJICAgICAgICAgYSBOVUxMIGZ1bmN0aW9uIG5hbWUgaWYgdGhlcmUgd2VyZSBubyBOX0ZVTnMgaW4gYSBmaWxlLgorCSAgICAgICAgIE5vdGUgdGhhdCBhIE5fU08gd2l0aG91dCBhIGZpbGUgbmFtZSBpcyBhbiBFT0YgYW5kCisJICAgICAgICAgdGhlcmUgY291bGQgYmUgMiBOX1NPIGZvbGxvd2luZyBpdCB3aXRoIHRoZSBuZXcgZmlsZW5hbWUgCisJICAgICAgICAgYW5kIGRpcmVjdG9yeS4gKi8KKwkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQorCQl7CisJCSAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBsYXN0X3N0YWIgKyBWQUxPRkYpOworCQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKKwkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKKwkJICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7CisJCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7CisJCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKKwkJICArK2k7CisJCX0KKwkgICAgICBzYXdfZnVuID0gMDsKKwkgICAgICAKKwkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOworCSAgICAgIGlmICgqZmlsZV9uYW1lID09ICdcMCcpCisJCXsKKwkJICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7CisJCSAgZmlsZV9uYW1lID0gTlVMTDsKKwkJICBzYXdfZnVuID0gMTsKKwkJfQorCSAgICAgIGVsc2UgeworCQlsYXN0X3N0YWIgPSBzdGFiOworCQlpZiAoc3RhYiArIFNUQUJTSVpFID49IGluZm8tPnN0YWJzICsgc3RhYnNpemUKKwkJICAgIHx8ICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgIT0gTl9TTykKKwkJICB7CisJCSAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgLyogVHdvIGNvbnNlY3V0aXZlIE5fU09zIGFyZSBhIGRpcmVjdG9yeSBhbmQgYSBmaWxlCisJCSAgICAgICBuYW1lLiAgKi8KKwkJICAgIHN0YWIgKz0gU1RBQlNJWkU7CisJCSAgICBkaXJlY3RvcnlfbmFtZSA9IGZpbGVfbmFtZTsKKwkJICAgIGZpbGVfbmFtZSA9ICgoY2hhciAqKSBzdHIKKwkJCQkgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpKTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgTl9TT0w6CisJICAgICAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KKwkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgTl9GVU46CisJICAgICAgLyogQSBmdW5jdGlvbiBuYW1lLiAgKi8KKwkgICAgICBzYXdfZnVuID0gMTsKKwkgICAgICBuYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKKworCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQorCQluYW1lID0gTlVMTDsKKworCSAgICAgIGZ1bmN0aW9uX25hbWUgPSBuYW1lOworCisJICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJY29udGludWU7CisKKwkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOworCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IHN0YWI7CisJICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7CisJICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOworCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOworCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IGZ1bmN0aW9uX25hbWU7CisJICAgICAgKytpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBpZiAoc2F3X2Z1biA9PSAwKQorCXsKKwkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKKwkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKKwkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOworCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOworCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7CisJICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOworCSAgKytpOworCX0KKworICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSAoYmZkX3ZtYSkgLTE7CisgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBpbmZvLT5zdGFicyArIHN0YWJzaXplOworICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7CisgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKKyAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7CisgICAgICArK2k7CisKKyAgICAgIGluZm8tPmluZGV4dGFibGVzaXplID0gaTsKKyAgICAgIHFzb3J0IChpbmZvLT5pbmRleHRhYmxlLCBpLCBzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KSwgY21waW5kZXhlbnRyeSk7CisKKyAgICAgICpwaW5mbyA9IChQVFIpIGluZm87CisgICAgfQorCisgIC8qIFdlIGFyZSBwYXNzZWQgYSBzZWN0aW9uIHJlbGF0aXZlIG9mZnNldC4gIFRoZSBvZmZzZXRzIGluIHRoZQorICAgICBzdGFicyBpbmZvcm1hdGlvbiBhcmUgYWJzb2x1dGUuICAqLworICBvZmZzZXQgKz0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7CisKKyNpZmRlZiBFTkFCTEVfQ0FDSElORworICBpZiAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgIT0gTlVMTAorICAgICAgJiYgb2Zmc2V0ID49IGluZm8tPmNhY2hlZF9vZmZzZXQKKyAgICAgICYmIG9mZnNldCA8IChpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSArIDEpLT52YWwpCisgICAgeworICAgICAgc3RhYiA9IGluZm8tPmNhY2hlZF9zdGFiOworICAgICAgaW5kZXhlbnRyeSA9IGluZm8tPmNhY2hlZF9pbmRleGVudHJ5OworICAgICAgZmlsZV9uYW1lID0gaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIC8qIENhY2hlIG5vbi1leGlzdGFudCBvciBpbnZhbGlkLiAgRG8gYmluYXJ5IHNlYXJjaCBvbgorICAgICAgICAgaW5kZXh0YWJsZS4gICovCisKKyAgICAgIGxvbmcgbG93LCBoaWdoOworICAgICAgbG9uZyBtaWQgPSAtMTsKKworICAgICAgaW5kZXhlbnRyeSA9IE5VTEw7CisKKyAgICAgIGxvdyA9IDA7CisgICAgICBoaWdoID0gaW5mby0+aW5kZXh0YWJsZXNpemUgLSAxOworICAgICAgd2hpbGUgKGxvdyAhPSBoaWdoKQorCXsKKwkgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7CisJICBpZiAob2Zmc2V0ID49IGluZm8tPmluZGV4dGFibGVbbWlkXS52YWwKKwkgICAgICAmJiBvZmZzZXQgPCBpbmZvLT5pbmRleHRhYmxlW21pZCArIDFdLnZhbCkKKwkgICAgeworCSAgICAgIGluZGV4ZW50cnkgPSAmaW5mby0+aW5kZXh0YWJsZVttaWRdOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsID4gb2Zmc2V0KQorCSAgICBoaWdoID0gbWlkOworCSAgZWxzZQorCSAgICBsb3cgPSBtaWQgKyAxOworCX0KKworICAgICAgaWYgKGluZGV4ZW50cnkgPT0gTlVMTCkKKwlyZXR1cm4gdHJ1ZTsKKworICAgICAgc3RhYiA9IGluZGV4ZW50cnktPnN0YWIgKyBTVEFCU0laRTsKKyAgICAgIGZpbGVfbmFtZSA9IGluZGV4ZW50cnktPmZpbGVfbmFtZTsKKyAgICB9CisKKyAgZGlyZWN0b3J5X25hbWUgPSBpbmRleGVudHJ5LT5kaXJlY3RvcnlfbmFtZTsKKyAgc3RyID0gaW5kZXhlbnRyeS0+c3RyOworCisgIGZvciAoOyBzdGFiIDwgKGluZGV4ZW50cnkrMSktPnN0YWI7IHN0YWIgKz0gU1RBQlNJWkUpCisgICAgeworICAgICAgYm9vbGVhbiBkb25lOworICAgICAgYmZkX3ZtYSB2YWw7CisKKyAgICAgIGRvbmUgPSBmYWxzZTsKKworICAgICAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQorCXsKKwljYXNlIE5fU09MOgorCSAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KKwkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOworCSAgaWYgKHZhbCA8PSBvZmZzZXQpCisJICAgIHsKKwkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOworCSAgICAgICpwbGluZSA9IDA7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBOX1NMSU5FOgorCWNhc2UgTl9EU0xJTkU6CisJY2FzZSBOX0JTTElORToKKwkgIC8qIEEgbGluZSBudW1iZXIuICBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAgICAgIGN1cnJlbnQgZnVuY3Rpb24uICAqLworCSAgdmFsID0gaW5kZXhlbnRyeS0+dmFsICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFZBTE9GRik7CisJICBpZiAodmFsIDw9IG9mZnNldCkKKwkgICAgeworCSAgICAgICpwbGluZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyBERVNDT0ZGKTsKKworI2lmZGVmIEVOQUJMRV9DQUNISU5HCisJICAgICAgaW5mby0+Y2FjaGVkX3N0YWIgPSBzdGFiOworCSAgICAgIGluZm8tPmNhY2hlZF9vZmZzZXQgPSB2YWw7CisJICAgICAgaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKKwkgICAgICBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSA9IGluZGV4ZW50cnk7CisjZW5kaWYKKwkgICAgfQorCSAgaWYgKHZhbCA+IG9mZnNldCkKKwkgICAgZG9uZSA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgTl9GVU46CisJY2FzZSBOX1NPOgorCSAgZG9uZSA9IHRydWU7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChkb25lKQorCWJyZWFrOworICAgIH0KKworICAqcGZvdW5kID0gdHJ1ZTsKKworICBpZiAoZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQorICAgICpwZmlsZW5hbWUgPSBmaWxlX25hbWU7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgZGlybGVuOworCisgICAgICBkaXJsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKTsKKyAgICAgIGlmIChpbmZvLT5maWxlbmFtZSA9PSBOVUxMCisJICB8fCBzdHJuY21wIChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUsIGRpcmxlbikgIT0gMAorCSAgfHwgc3RyY21wIChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKSAhPSAwKQorCXsKKwkgIGlmIChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKQorCSAgICBmcmVlIChpbmZvLT5maWxlbmFtZSk7CisJICBpbmZvLT5maWxlbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKGRpcmxlbiArCisJCQkJCQlzdHJsZW4gKGZpbGVfbmFtZSkKKwkJCQkJCSsgMSk7CisJICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUpOworCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKTsKKwl9CisKKyAgICAgICpwZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKKyAgICB9CisKKyAgaWYgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpzOworCisgICAgICAvKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWV0aGluZyBsaWtlIG1haW46RigwLDEpLCBzbyB3ZSB3YW50CisgICAgICAgICB0byBjbG9iYmVyIHRoZSBjb2xvbi4gIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBuYW1lLCBzaW5jZSB0aGUKKyAgICAgICAgIHN0cmluZyBpcyBpbiBvdXIgb3duIGxvY2FsIHN0b3JhZ2UgYW55aG93LiAgKi8KKworICAgICAgcyA9IHN0cmNociAoaW5kZXhlbnRyeS0+ZnVuY3Rpb25fbmFtZSwgJzonKTsKKyAgICAgIGlmIChzICE9IE5VTEwpCisJKnMgPSAnXDAnOworCisgICAgICAqcGZubmFtZSA9IGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWU7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmZkL3N5c2RlcC5oIGIvYmZkL3N5c2RlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNTg5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvc3lzZGVwLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qIHN5c2RlcC5oIC0tIGhhbmRsZSBob3N0IGRlcGVuZGVuY2llcyBmb3IgdGhlIEJGRCBsaWJyYXJ5CisgICBDb3B5cmlnaHQgMTk5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBCRkRfU1lTREVQX0gKKyNkZWZpbmUgQkZEX1NZU0RFUF9ICisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWYgIShkZWZpbmVkKGVycm5vKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9JTkNfRVJSTk8pKQorZXh0ZXJuIGludCBlcnJubzsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqc3RyY2hyICgpOworZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgVVNFX0JJTkFSWV9GT1BFTgorI2luY2x1ZGUgImZvcGVuLWJpbi5oIgorI2Vsc2UKKyNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1lTX0ZJTEVfSAorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9fUkRPTkxZCisjZGVmaW5lIE9fUkRPTkxZIDAKKyNlbmRpZgorI2lmbmRlZiBPX1dST05MWQorI2RlZmluZSBPX1dST05MWSAxCisjZW5kaWYKKyNpZm5kZWYgT19SRFdSCisjZGVmaW5lIE9fUkRXUiAyCisjZW5kaWYKKyNpZm5kZWYgT19BQ0NNT0RFCisjZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCisjZGVmaW5lIFNFRUtfU0VUIDAKKyNlbmRpZgorI2lmbmRlZiBTRUVLX0NVUgorI2RlZmluZSBTRUVLX0NVUiAxCisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCitleHRlcm4gY2hhciAqc3Ryc3RyICgpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQworZXh0ZXJuIFBUUiBtYWxsb2MgKCk7CisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQworZXh0ZXJuIFBUUiByZWFsbG9jICgpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKK2V4dGVybiB2b2lkIGZyZWUgKCk7CisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCitleHRlcm4gY2hhciAqZ2V0ZW52ICgpOworI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTkxTCisjaW5jbHVkZSA8bGliaW50bC5oPgorI2RlZmluZSBfKFN0cmluZykgZGdldHRleHQgKFBBQ0tBR0UsIFN0cmluZykKKyNpZmRlZiBnZXR0ZXh0X25vb3AKKyNkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKKyNlbHNlCisjZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKKyNlbmRpZgorI2Vsc2UKKy8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCisjZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQorI2RlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKKyNkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQorI2RlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCisjZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCisjZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQorI2RlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCisjZW5kaWYKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX1NZU0RFUF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3RhcmdldHMuYyBiL2JmZC90YXJnZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2ZTUxZAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC90YXJnZXRzLmMKQEAgLTAsMCArMSwxMDc5IEBACisvKiBHZW5lcmljIHRhcmdldC1maWxlLXR5cGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImZubWF0Y2guaCIKKworLyoKK1NFQ1RJT04gCisJVGFyZ2V0cworCitERVNDUklQVElPTgorCUVhY2ggcG9ydCBvZiBCRkQgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSByZXF1cmllcyB0aGUgY3JlYXRpb24KKwlvZiBhIHRhcmdldCBiYWNrIGVuZC4gQWxsIHRoZSBiYWNrIGVuZCBwcm92aWRlcyB0byB0aGUgcm9vdAorCXBhcnQgb2YgQkZEIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCisJd2hpY2ggcGVyZm9ybSBjZXJ0YWluIGxvdyBsZXZlbCBvcGVyYXRpb25zIG9uIGZpbGVzLiBCRkQKKwl0cmFuc2xhdGVzIHRoZSBhcHBsaWNhdGlvbnMncyByZXF1ZXN0cyB0aHJvdWdoIGEgcG9pbnRlciBpbnRvCisJY2FsbHMgdG8gdGhlIGJhY2sgZW5kIHJvdXRpbmVzLiAKKworCVdoZW4gYSBmaWxlIGlzIG9wZW5lZCB3aXRoIDw8YmZkX29wZW5yPj4sIGl0cyBmb3JtYXQgYW5kCisJdGFyZ2V0IGFyZSB1bmtub3duLiBCRkQgdXNlcyB2YXJpb3VzIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lCisJaG93IHRvIGludGVycHJldCB0aGUgZmlsZS4gVGhlIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFyZToKKworCW8gQ3JlYXRlIGEgQkZEIGJ5IGNhbGxpbmcgdGhlIGludGVybmFsIHJvdXRpbmUKKwk8PF9iZmRfbmV3X2JmZD4+LCB0aGVuIGNhbGwgPDxiZmRfZmluZF90YXJnZXQ+PiB3aXRoIHRoZQorCXRhcmdldCBzdHJpbmcgc3VwcGxpZWQgdG8gPDxiZmRfb3BlbnI+PiBhbmQgdGhlIG5ldyBCRkQgcG9pbnRlci4gCisKKwlvIElmIGEgbnVsbCB0YXJnZXQgc3RyaW5nIHdhcyBwcm92aWRlZCB0byA8PGJmZF9maW5kX3RhcmdldD4+LAorCWxvb2sgdXAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj4gYW5kIHVzZQorCXRoYXQgYXMgdGhlIHRhcmdldCBzdHJpbmcuIAorCisJbyBJZiB0aGUgdGFyZ2V0IHN0cmluZyBpcyBzdGlsbCA8PE5VTEw+Piwgb3IgdGhlIHRhcmdldCBzdHJpbmcgaXMKKwk8PGRlZmF1bHQ+PiwgdGhlbiB1c2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRhcmdldCB2ZWN0b3IKKwlhcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCBzZXQgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaW4gdGhlIEJGRCB0bworCWNhdXNlIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHMuCisJQHhyZWZ7YmZkX3RhcmdldH0uICBAeHJlZntGb3JtYXRzfS4KKworCW8gT3RoZXJ3aXNlLCBpbnNwZWN0IHRoZSBlbGVtZW50cyBpbiB0aGUgdGFyZ2V0IHZlY3RvcgorCW9uZSBieSBvbmUsIHVudGlsIGEgbWF0Y2ggb24gdGFyZ2V0IG5hbWUgaXMgZm91bmQuIFdoZW4gZm91bmQsCisJdXNlIGl0LiAKKworCW8gT3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiB0bworCTw8YmZkX29wZW5yPj4uCisKKwlvIDw8YmZkX29wZW5yPj4gYXR0ZW1wdHMgdG8gb3BlbiB0aGUgZmlsZSB1c2luZworCTw8YmZkX29wZW5fZmlsZT4+LCBhbmQgcmV0dXJucyB0aGUgQkZELgorCisJT25jZSB0aGUgQkZEIGhhcyBiZWVuIG9wZW5lZCBhbmQgdGhlIHRhcmdldCBzZWxlY3RlZCwgdGhlIGZpbGUKKwlmb3JtYXQgbWF5IGJlIGRldGVybWluZWQuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCisJPDxiZmRfY2hlY2tfZm9ybWF0Pj4gb24gdGhlIEJGRCB3aXRoIGEgc3VnZ2VzdGVkIGZvcm1hdC4gCisJSWYgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaGFzIGJlZW4gc2V0LCBlYWNoIHBvc3NpYmxlIHRhcmdldAorCXR5cGUgaXMgdHJpZWQgdG8gc2VlIGlmIGl0IHJlY29nbml6ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQuCisJPDxiZmRfY2hlY2tfZm9ybWF0Pj4gcmV0dXJucyA8PHRydWU+PiB3aGVuIHRoZSBjYWxsZXIgZ3Vlc3NlcyByaWdodC4KK0BtZW51CitAKiBiZmRfdGFyZ2V0OjoKK0BlbmQgbWVudQorKi8KKworCisvKgorCitJTk9ERQorCWJmZF90YXJnZXQsICAsIFRhcmdldHMsIFRhcmdldHMKK0RPQ0RECitTVUJTRUNUSU9OCisJYmZkX3RhcmdldAorCitERVNDUklQVElPTgorCVRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYQorCXRhcmdldC4gSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIGFuZCB3aGljaAorCXJvdXRpbmVzIHRvIGNhbGwgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLiAgIAorCisJRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUgd2l0aCBpdHMgPDx4dmVjPj4KKwltZW1iZXIuIAorCisJVGhlIG1hY3JvcyBiZWxvdyBhcmUgdXNlZCB0byBkaXNwYXRjaCB0byBmdW5jdGlvbnMgdGhyb3VnaCB0aGUKKwk8PGJmZF90YXJnZXQ+PiB2ZWN0b3IuIFRoZXkgYXJlIHVzZWQgaW4gYSBudW1iZXIgb2YgbWFjcm9zIGZ1cnRoZXIKKwlkb3duIGluIEBmaWxle2JmZC5ofSwgYW5kIGFyZSBhbHNvIHVzZWQgd2hlbiBjYWxsaW5nIHZhcmlvdXMKKwlyb3V0aW5lcyBieSBoYW5kIGluc2lkZSB0aGUgQkZEIGltcGxlbWVudGF0aW9uLiAgVGhlIEB2YXJ7YXJnbGlzdH0KKwlhcmd1bWVudCBtdXN0IGJlIHBhcmVudGhlc2l6ZWQ7IGl0IGNvbnRhaW5zIGFsbCB0aGUgYXJndW1lbnRzCisJdG8gdGhlIGNhbGxlZCBmdW5jdGlvbi4gCisKKwlUaGV5IG1ha2UgdGhlIGRvY3VtZW50YXRpb24gKG1vcmUpIHVucGxlYXNhbnQgdG8gcmVhZCwgc28gaWYKKwlzb21lb25lIHdhbnRzIHRvIGZpeCB0aGlzIGFuZCBub3QgYnJlYWsgdGhlIGFib3ZlLCBwbGVhc2UgZG8uCisKKy4jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAorLiAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCisuCisuI2lmZGVmIERFQlVHX0JGRF9TRU5ECisuI3VuZGVmIEJGRF9TRU5ECisuI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKKy4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAorLiAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKKy4gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCisuI2VuZGlmCisKKwlGb3Igb3BlcmF0aW9ucyB3aGljaCBpbmRleCBvbiB0aGUgQkZEIGZvcm1hdDoKKworLiNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAorLiAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQorLgorLiNpZmRlZiBERUJVR19CRkRfU0VORAorLiN1bmRlZiBCRkRfU0VORF9GTVQKKy4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKKy4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAorLiAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKKy4gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKKy4jZW5kaWYKKworCVRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlIG9mIEJGRCB0aGlzIGlzLiAgVGhlCisJPDx4dmVjPj4gbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgPDxiZmQ+PiBpdHNlbGYgcG9pbnRzIGhlcmUuICBFYWNoCisJbW9kdWxlIHRoYXQgaW1wbGVtZW50cyBhY2Nlc3MgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHVuZGVyIEJGRCwKKwlkZWZpbmVzIG9uZSBvZiB0aGVzZS4KKworCisJRklYTUUsIHRoZXNlIG5hbWVzIHNob3VsZCBiZSByYXRpb25hbGlzZWQgd2l0aCB0aGUgbmFtZXMgb2YKKwl0aGUgZW50cnkgcG9pbnRzIHdoaWNoIGNhbGwgdGhlbS4gVG9vIGJhZCB3ZSBjYW4ndCBoYXZlIG9uZQorCW1hY3JvIHRvIGRlZmluZSB0aGVtIGJvdGghIAorCisuZW51bSBiZmRfZmxhdm91ciB7CisuICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKy4gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorLiAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAorLiAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAorLiAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAorLiAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKKy4gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAorLiAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAorLiAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCisuICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKKy4gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCisufTsKKy4KKy5lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OworLgorLnsqIEZvcndhcmQgZGVjbGFyYXRpb24uICAqfQorLnR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87CisuCisudHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAorLnsKKworSWRlbnRpZmllcyB0aGUga2luZCBvZiB0YXJnZXQsIGUuZy4sIFN1bk9TNCwgVWx0cml4LCBldGMuCisKKy4gIGNoYXIgKm5hbWU7CisKK1RoZSAiZmxhdm91ciIgb2YgYSBiYWNrIGVuZCBpcyBhIGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCB0aGUgY29udGVudHMKK29mIGEgZmlsZS4KKworLiAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOworCitUaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBkYXRhIGFyZWEgb2YgYSBmaWxlLgorCisuICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOworCitUaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBoZWFkZXIgcGFydHMgb2YgYSBmaWxlLgorCisuICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKKworQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYW4gZXhlY3V0YWJsZSBtYXkgaGF2ZSBzZXQgLQorZnJvbSB0aGUgc2V0IDw8QkZEX05PX0ZMQUdTPj4sIDw8SEFTX1JFTE9DPj4sIC4uLjw8RF9QQUdFRD4+LgorCisuICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAorCitBIG1hc2sgb2YgYWxsIHRoZSBmbGFncyB3aGljaCBhIHNlY3Rpb24gbWF5IGhhdmUgc2V0IC0gZnJvbQordGhlIHNldCA8PFNFQ19OT19GTEFHUz4+LCA8PFNFQ19BTExPQz4+LCAuLi48PFNFVF9ORVZFUl9MT0FEPj4uCisKKy4gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7CisKK1RoZSBjaGFyYWN0ZXIgbm9ybWFsbHkgZm91bmQgYXQgdGhlIGZyb250IG9mIGEgc3ltYm9sIAorKGlmIGFueSksIHBlcmhhcHMgYF8nLgorCisuICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7CisKK1RoZSBwYWQgY2hhcmFjdGVyIGZvciBmaWxlIG5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlci4KKworLiAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKKworVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCisKKy4gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOworCitFbnRyaWVzIGZvciBieXRlIHN3YXBwaW5nIGZvciBkYXRhLiBUaGVzZSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyCitlbnRyeSBwb2ludHMsIHNpbmNlIHRoZXkgZG9uJ3QgdGFrZSBhIEJGRCBhc3RoZSBmaXJzdCBhcmd1bWVudC4KK0NlcnRhaW4gb3RoZXIgaGFuZGxlcnMgY291bGQgZG8gdGhlIHNhbWUuCisKKy4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKy4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisuICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisuICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisuICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOworLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKy4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKKworQnl0ZSBzd2FwcGluZyBmb3IgdGhlIGhlYWRlcnMKKworLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisuICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7CisuICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKKy4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOworLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisuICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKy4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKKy4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOworCitGb3JtYXQgZGVwZW5kZW50IHJvdXRpbmVzOiB0aGVzZSBhcmUgdmVjdG9ycyBvZiBlbnRyeSBwb2ludHMKK3dpdGhpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUsIG9uZSBmb3IgZWFjaCBmb3JtYXQgdG8gY2hlY2suCisKK0NoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQuICBSZXR1cm4gYSA8PGJmZF90YXJnZXQgKj4+IG9yIHplcm8uIAorCisuICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOworCitTZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbi4gIAorCisuICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7CisKK1dyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuLCBhdCA8PGJmZF9jbG9zZT4+LiAKKworLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKKworVGhlIGdlbmVyYWwgdGFyZ2V0IHZlY3Rvci4KKworLgorLiAgeyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqfQorLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKKy5DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKKy5DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKKy5DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAorLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAorLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCisuCisuICB7KiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqfQorLiAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKKy4gIHsqIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICp9CisuICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOworLiAgeyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKn0KKy4gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKKy4gIHsqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICp9CisuICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOworLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQorLiAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKKy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisuCisuICB7KiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqfQorLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKKy5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAorLkNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAorLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAorLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCisuQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAorLkNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCisuICB7KiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKKy4gICAgIHRvIGFub3RoZXIuICAqfQorLiAgYm9vbGVhbgkgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CisuICB7KiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCisuICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqfQorLiAgYm9vbGVhbgkgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCisuICAgICB0byBhbm90aGVyLiAgKn0KKy4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOworLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAorLiAgICAgdG8gYW5vdGhlci4gICp9CisuICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCisuCQkJCQkJCSAgIGJmZCAqLCBhc3ltYm9sICopKTsKKy4gIHsqIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICp9CisuICBib29sZWFuCSAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOworLgorLiAgeyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKn0KKy4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKKy4KKy4gIHsqIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqfQorLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKKy5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAorLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKKy5DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQorLiAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKKy4gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKKy4gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CisuCisuICB7KiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICp9CisuI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAorLkNBVChOQU1FLF9zbHVycF9hcm1hcCksXAorLkNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCisuQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCisuQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAorLkNBVChOQU1FLF93cml0ZV9hcm1hcCksXAorLkNBVChOQU1FLF9yZWFkX2FyX2hkciksXAorLkNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKKy5DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAorLkNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKKy5DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKKy4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKKy4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOworLiAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQorLiAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7CisuICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKKy4gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKKy4gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7CisuICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKKy4jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKKy4gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKKy4gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOworLiAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7CisuCisuICB7KiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICp9CisuI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAorLkNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCisuQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKKy5DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKKy5DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCisuQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAorLkNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAorLkNBVChOQU1FLF9nZXRfbGluZW5vKSxcCisuQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCisuQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAorLkNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCisuQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQorLiAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7CisuICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgorLiAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7CisuICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKKy4jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKKy4gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCisuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7CisuI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKKy4gIGJvb2xlYW4JICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7CisuCisuICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKKy4gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCisuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKKy4gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCisuICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKKy4geyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKKy4gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCisuICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICp9CisuICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCisuICAgICAgIGJmZCAqYWJmZCwKKy4gICAgICAgdm9pZCAqcHRyLAorLiAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKKy4jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKKy4gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQorLiAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKKy4jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCisuICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCisuICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKKy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKKy4KKy4gIHsqIFJvdXRpbmVzIGZvciByZWxvY3MuICAqfQorLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAorLkNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKKy5DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCisuQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKKy4gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKKy4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworLiAgeyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqfQorLiAgcmVsb2NfaG93dG9fdHlwZSAqCisuICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKKy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKKy4KKy4gIHsqIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKn0KKy4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAorLkNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCisuQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQorLiAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKKy4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKKy4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAorLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKy4KKy4gIHsqIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICp9CisuI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAorLkNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAorLkNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCisuQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCisuQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCisuQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCisuQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCisuQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKKy5DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQorLiAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7CisuICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAorLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCisuICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCisuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7CisuCisuICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAorLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKKy4KKy4gIHsqIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKKy4gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKn0KKy4gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKKy4KKy4gIHsqIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKn0KKy4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisuCisuICB7KiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCisuICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqfQorLiAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKKy4KKy4gIHsqIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICp9CisuICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKKy4KKy4gIHsqIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqfQorLiAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7CisuCisuICB7KiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqfQorLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKKy5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCisuQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAorLkNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAorLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKKy4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICp9CisuICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOworLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKn0KKy4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCisuICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7CisuICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqfQorLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOworLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqfQorLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQorLiAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworLgorCitEYXRhIGZvciB1c2UgYnkgYmFjay1lbmQgcm91dGluZXMsIHdoaWNoIGlzbid0IGdlbmVyaWMgZW5vdWdoIHRvIGJlbG9uZworaW4gdGhpcyBzdHJ1Y3R1cmUuCisKKy4gUFRSIGJhY2tlbmRfZGF0YTsKKy59IGJmZF90YXJnZXQ7CisKKyovCisKKy8qIEFsbCBrbm93biB4dmVjcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMpLgorICAgQWxwaGFiZXRpemVkIGZvciBlYXN5IHJlZmVyZW5jZS4KKyAgIFRoZXkgYXJlIGxpc3RlZCBhIHNlY29uZCB0aW1lIGJlbG93LCBzaW5jZQorICAgd2UgY2FuJ3QgaW50ZXJtaXggZXh0ZXJuJ3MgYW5kIGluaXRpYWxpemVycy4gICovCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBhMjlrY29mZl9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dDBfYmlnX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFwb2xsb2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9saXR0bGVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVfbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2JpZ192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlaV9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2JpZ192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlaV9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2JpZ19ob3N0OworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0OworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2FscGhhX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcmNfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ21pcHNfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QxMHZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QzMHZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2hwcGFfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzODZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k4NjBfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tMzJyX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tNjhrX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tODhrX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMjAwX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMzAwX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NoX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaGxfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NwYXJjX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl92ODUwX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9mcjMwX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9zcGFyY192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBkZW1vXzY0X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaG9zdF9hb3V0X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwYnNkX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwaHB1eF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmFvdXRfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmJzZF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2ZHluaXhfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmZyZWVic2RfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmNvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfcG93ZXJwY19wZWlfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZWlfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NnBlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZWlfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMmNvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMnN0dWJiZWRjb2ZmX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZsaW51eF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9hb3V0X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZseW54X2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm1hY2gzX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bmV0YnNkX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGk4NjBjb2ZmX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrYXV4X2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZ1bl92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbGludXhfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfYW91dF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbHlueF9jb2ZmX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtuZXRic2RfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a3N5c3Zjb2ZmX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGs0a25ldGJzZF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG04OGttYWNoM192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfbGl0dGxlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9iaWdfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2xpdHRsZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXdzb3MzX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2kzODZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfc3BhcmNfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfYWxwaGFfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfcG93ZXJwY192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm5ldGJzZF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm1hY2hhb3V0X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcmlzY2l4X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBtYWNfeGNvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcnM2MDAwY29mZl92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2xlX2FvdXRfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsaW51eF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfYW91dF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfY29mZl92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY25ldGJzZF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3Vub3NfYmlnX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljODBjb2ZmX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZheG5ldGJzZF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCB3ZTMya2NvZmZfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdzY1X3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjOworCisvKiBzcmVjIGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjOworCisvKiBiaW5hcnkgaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7CisKKy8qIGloZXggaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGloZXhfdmVjOworCisvKiBBbGwgb2YgdGhlIHh2ZWNzIGZvciBjb3JlIGZpbGVzLiAgKi8KK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb3NmX2NvcmVfdmVjOworZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYzsKK2V4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWM7CitleHRlcm4gY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWM7CisKK2NvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdID0geworCisjaWZkZWYgU0VMRUNUX1ZFQ1MKKworCVNFTEVDVF9WRUNTLAorCisjZWxzZSAvKiBub3QgU0VMRUNUX1ZFQ1MgKi8KKworI2lmZGVmIERFRkFVTFRfVkVDVE9SCisJJkRFRkFVTFRfVkVDVE9SLAorI2VuZGlmCisJLyogVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQorCSAgIHdpdGggb3RoZXIgdmVjdG9yIGxpc3RzIC0tIHRoZSBkZWNscyBhYm92ZSBhbmQKKwkgICB0aGUgY2FzZSBzdGF0ZW1lbnQgaW4gY29uZmlndXJlLmluLgorCSAgIFZlY3RvcnMgdGhhdCBkb24ndCBjb21waWxlIG9uIGFsbCBzeXN0ZW1zLCBvciBhcmVuJ3QgZmluaXNoZWQsCisJICAgc2hvdWxkIGhhdmUgYW4gZW50cnkgaGVyZSB3aXRoICNpZiAwIGFyb3VuZCBpdCwgdG8gc2hvdyB0aGF0CisJICAgaXQgd2Fzbid0IG9taXR0ZWQgYnkgbWlzdGFrZS4gICovCisJJmEyOWtjb2ZmX2JpZ192ZWMsCisJJmFfb3V0X2Fkb2JlX3ZlYywKKyNpZiAwCQkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCisJJmFvdXRfbWlwc19iaWdfdmVjLAorI2VuZGlmCisJJmFvdXRfbWlwc19saXR0bGVfdmVjLAorCSZiX291dF92ZWNfYmlnX2hvc3QsCisJJmJfb3V0X3ZlY19saXR0bGVfaG9zdCwKKworCS8qIFRoaXMsIGFuZCBvdGhlciB2ZWN0b3JzLCBtYXkgbm90IGJlIHVzZWQgaW4gYW55ICoubXQgY29uZmlndXJhdGlvbi4KKwkgICBCdXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoZXkgYXJlIHVubmVjZXNzYXJ5LiAgSWYgY29uZmlndXJlZCB3aXRoCisJICAgLS1lbmFibGUtdGFyZ2V0cz1hbGwsIG9iamR1bXAgb3IgZ2RiIHNob3VsZCBiZSBhYmxlIHRvIGV4YW1pbmUKKwkgICB0aGUgZmlsZSBldmVuIGlmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbWFjaGluZSB0eXBlLiAgKi8KKwkmYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYywKKyNpZmRlZiBCRkQ2NAorCSZiZmRfZWxmNjRfYWxwaGFfdmVjLAorI2VuZGlmCisJJmJmZF9lbGYzMl9iaWdhcmNfdmVjLAorICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV92ZWMsCisgICAgICAgICZiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLAorCSZiZmRfZWxmMzJfYmlnbWlwc192ZWMsCisjaWZkZWYgQkZENjQKKwkmYmZkX2VsZjY0X2JpZ21pcHNfdmVjLAorI2VuZGlmCisJJmJmZF9lbGYzMl9kMTB2X3ZlYywKKwkmYmZkX2VsZjMyX2QzMHZfdmVjLAorCSZiZmRfZWxmMzJfaHBwYV92ZWMsCisJJmJmZF9lbGYzMl9pMzg2X3ZlYywKKwkmYmZkX2VsZjMyX2k4NjBfdmVjLAorCSZiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjLAorCSZiZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYywKKyAgICAgICAgJmJmZF9lbGYzMl9saXR0bGVhcm1fdmVjLAorICAgICAgICAmYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYywKKwkmYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLAorI2lmZGVmIEJGRDY0CisJJmJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYywKKyNlbmRpZgorCSZiZmRfZWxmMzJfbTMycl92ZWMsCisJJmJmZF9lbGYzMl9tbjEwMjAwX3ZlYywKKwkmYmZkX2VsZjMyX21uMTAzMDBfdmVjLAorCSZiZmRfZWxmMzJfbTY4a192ZWMsCisJJmJmZF9lbGYzMl9tODhrX3ZlYywKKwkmYmZkX2VsZjMyX3NwYXJjX3ZlYywKKwkmYmZkX2VsZjMyX3Bvd2VycGNfdmVjLAorCSZiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYywKKwkmYmZkX2VsZjMyX3Y4NTBfdmVjLAorCSZiZmRfZWxmMzJfZnIzMF92ZWMsCisJJmJmZF9lbGYzMl9tY29yZV9iaWdfdmVjLAorCSZiZmRfZWxmMzJfbWNvcmVfbGl0dGxlX3ZlYywKKyNpZmRlZiBCRkQ2NAkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCisJJmJmZF9lbGY2NF9iaWdfZ2VuZXJpY192ZWMsCisJJmJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMsCisjZW5kaWYKKyNpZiAwCisJJmJmZF9lbGY2NF9zcGFyY192ZWMsCisjZW5kaWYKKwkvKiBXZSBkb24ndCBpbmNsdWRlIGNpc2NvX2NvcmVfdmVjLiAgQWx0aG91Z2ggaXQgaGFzIGEgbWFnaWMgbnVtYmVyLAorCSAgIHRoZSBtYWdpYyBudW1iZXIgaXNuJ3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgYW5kIHRodXMKKwkgICBtaWdodCBzcHVyaW91c2x5IG1hdGNoIG90aGVyIGtpbmRzIG9mIGZpbGVzLiAgKi8KKyNpZmRlZiBCRkQ2NAorCSZkZW1vXzY0X3ZlYywJLyogT25seSBjb21waWxlZCBpZiBob3N0IGhhcyBsb25nLWxvbmcgc3VwcG9ydCAqLworI2VuZGlmCisJJmVjb2ZmX2JpZ192ZWMsCisJJmVjb2ZmX2xpdHRsZV92ZWMsCisJJmVjb2ZmX2JpZ2xpdHRsZV92ZWMsCisjaWZkZWYgQkZENjQKKwkmZWNvZmZhbHBoYV9saXR0bGVfdmVjLAorI2VuZGlmCisJJmg4MzAwY29mZl92ZWMsCisJJmg4NTAwY29mZl92ZWMsCisjaWYgMAorCS8qIFNpbmNlIGEub3V0IGZpbGVzIGxhY2sgZGVjZW50IG1hZ2ljIG51bWJlcnMsIG5vIHdheSB0byByZWNvZ25pemUKKwkgICB3aGljaCBraW5kIG9mIGEub3V0IGZpbGUgaXQgaXMuICAqLworCSZob3N0X2FvdXRfdmVjLAorI2VuZGlmCisjaWYgMAkJCQkvKiBDbGFzaGVzIHdpdGggc3Vub3NfYmlnX3ZlYyBtYWdpYyBuby4gICovCisJJmhwMzAwYnNkX3ZlYywKKyNlbmRpZgorCSZocDMwMGhwdXhfdmVjLAorI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKQorICAgICAgICAmc29tX3ZlYywKKyNlbmRpZgorCSZpMzg2YW91dF92ZWMsCisJJmkzODZic2RfdmVjLAorCSZpMzg2Y29mZl92ZWMsCisJJmkzODZmcmVlYnNkX3ZlYywKKwkmaTg2MGNvZmZfdmVjLAorCSZiZmRfcG93ZXJwY19wZV92ZWMsCisJJmJmZF9wb3dlcnBjbGVfcGVfdmVjLAorCSZiZmRfcG93ZXJwY19wZWlfdmVjLAorCSZiZmRfcG93ZXJwY2xlX3BlaV92ZWMsCisJJmdvMzJjb2ZmX3ZlYywKKwkmZ28zMnN0dWJiZWRjb2ZmX3ZlYywKKyNpZiAwCisJLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQorCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCisJJmkzODZsaW51eF92ZWMsCisjZW5kaWYKKwkmaTM4Nmx5bnhfYW91dF92ZWMsCisJJmkzODZseW54X2NvZmZfdmVjLAorI2lmIDAKKwkvKiBObyBkaXN0aW5ndWlzaGluZyBmZWF0dXJlcyBmb3IgTWFjaCAzIGV4ZWN1dGFibGVzLiAgKi8KKwkmaTM4Nm1hY2gzX3ZlYywKKyNlbmRpZgorCSZpMzg2bXNkb3NfdmVjLAorCSZpMzg2bmV0YnNkX3ZlYywKKwkmaTM4Nm9zOWtfdmVjLAorCSZpMzg2cGVfdmVjLAorCSZpMzg2cGVpX3ZlYywKKwkmYXJtY29mZl9saXR0bGVfdmVjLAorCSZhcm1jb2ZmX2JpZ192ZWMsCisJJmFybXBlX2xpdHRsZV92ZWMsCisJJmFybXBlX2JpZ192ZWMsCisJJmFybXBlaV9saXR0bGVfdmVjLAorCSZhcm1wZWlfYmlnX3ZlYywKKwkmYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYywKKwkmYXJtX2Vwb2NfcGVfYmlnX3ZlYywKKwkmYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMsCisJJmFybV9lcG9jX3BlaV9iaWdfdmVjLAorCSZpY29mZl9iaWdfdmVjLAorCSZpY29mZl9saXR0bGVfdmVjLAorCSZpZWVlX3ZlYywKKwkmbTY4a2NvZmZfdmVjLAorCSZtNjhrY29mZnVuX3ZlYywKKyNpZiAwCisJLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQorCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCisJJm02OGtsaW51eF92ZWMsCisjZW5kaWYKKwkmbTY4a2x5bnhfYW91dF92ZWMsCisJJm02OGtseW54X2NvZmZfdmVjLAorCSZtNjhrbmV0YnNkX3ZlYywKKwkmbTY4a3N5c3Zjb2ZmX3ZlYywKKwkmbTg4a2Jjc192ZWMsCisJJm04OGttYWNoM192ZWMsCisJJm1jb3JlX3BlX2JpZ192ZWMsCisJJm1jb3JlX3BlX2xpdHRsZV92ZWMsCisJJm1jb3JlX3BlaV9iaWdfdmVjLAorCSZtY29yZV9wZWlfbGl0dGxlX3ZlYywKKwkmbmV3c29zM192ZWMsCisJJm5sbTMyX2kzODZfdmVjLAorCSZubG0zMl9zcGFyY192ZWMsCisjaWZkZWYgQkZENjQKKwkmbmxtMzJfYWxwaGFfdmVjLAorI2VuZGlmCisJJnBjNTMybmV0YnNkX3ZlYywKKyNpZiAwCisJLyogV2UgaGF2ZSBubyBvYXN5cyB0b29scyBhbnltb3JlLCBzbyB3ZSBjYW4ndCB0ZXN0IGFueSBvZiB0aGlzCisJICAgYW55bW9yZS4gSWYgeW91IHdhbnQgdG8gdGVzdCB0aGUgc3R1ZmYgeW91cnNlbGYsIGdvIGFoZWFkLi4uCisJICAgc3RldmVAY3lnbnVzLmNvbQorCSAgIFdvcnNlLCBzaW5jZSB0aGVyZSBpcyBubyBtYWdpYyBudW1iZXIgZm9yIGFyY2hpdmVzLCB0aGVyZQorCSAgIGNhbiBiZSBhbm5veWluZyB0YXJnZXQgbWlzLW1hdGNoZXMuICAqLworCSZvYXN5c192ZWMsCisjZW5kaWYKKwkmcGM1MzJtYWNoYW91dF92ZWMsCisjaWYgMAorCS8qIFdlIGhhdmUgbm8gd2F5IG9mIGRpc3Rpbmd1aXNoaW5nIHRoZXNlIGZyb20gb3RoZXIgYS5vdXQgdmFyaWFudHMgKi8KKwkmYW91dF9hcm1fYmlnX3ZlYywKKwkmYW91dF9hcm1fbGl0dGxlX3ZlYywKKwkmcmlzY2l4X3ZlYywKKyNlbmRpZgorI2lmIDAKKwkvKiBUaGlzIGhhcyB0aGUgc2FtZSBtYWdpYyBudW1iZXIgYXMgUlMvNjAwMC4gKi8KKwkmcG1hY194Y29mZl92ZWMsCisjZW5kaWYKKwkmcnM2MDAwY29mZl92ZWMsCisJJnBwY2Jvb3RfdmVjLAorCSZzaGNvZmZfdmVjLAorCSZzaGxjb2ZmX3ZlYywKKwkmc2hjb2ZmX3NtYWxsX3ZlYywKKwkmc2hsY29mZl9zbWFsbF92ZWMsCisJJnNwYXJjbGVfYW91dF92ZWMsCisJJnNwYXJjbGludXhfdmVjLAorCSZzcGFyY2x5bnhfYW91dF92ZWMsCisJJnNwYXJjbHlueF9jb2ZmX3ZlYywKKwkmc3BhcmNuZXRic2RfdmVjLAorCSZzdW5vc19iaWdfdmVjLAorCSZhb3V0MF9iaWdfdmVjLAorCSZ0aWMzMF9hb3V0X3ZlYywKKwkmdGljMzBfY29mZl92ZWMsCisJJnRpYzgwY29mZl92ZWMsCisJJnZheG5ldGJzZF92ZWMsCisJJnZlcnNhZG9zX3ZlYywKKyNpZmRlZiBCRkQ2NAorCSZ2bXNfYWxwaGFfdmVjLAorI2VuZGlmCisJJnZtc192YXhfdmVjLAorCSZ3ZTMya2NvZmZfdmVjLAorCSZ6OGtjb2ZmX3ZlYywKKworI2VuZGlmIC8qIG5vdCBTRUxFQ1RfVkVDUyAqLworCisvKiBBbHdheXMgc3VwcG9ydCBTLXJlY29yZHMsIGZvciBjb252ZW5pZW5jZS4gICovCisJJnNyZWNfdmVjLAorCSZzeW1ib2xzcmVjX3ZlYywKKy8qIEFuZCB0ZWtoZXggKi8KKwkmdGVraGV4X3ZlYywKKy8qIExpa2V3aXNlIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KKwkmYmluYXJ5X3ZlYywKKy8qIExpa2V3aXNlIGZvciBpaGV4LiAgKi8KKwkmaWhleF92ZWMsCisKKy8qIEFkZCBhbnkgcmVxdWlyZWQgdHJhZGl0aW9uYWwtY29yZS1maWxlLWhhbmRsZXIuICAqLworCisjaWZkZWYgQUlYMzg2X0NPUkUKKwkmYWl4Mzg2X2NvcmVfdmVjLAorI2VuZGlmCisjaWZkZWYgSFBVWF9DT1JFCisJJmhwdXhfY29yZV92ZWMsCisjZW5kaWYKKyNpZmRlZiBIUFBBQlNEX0NPUkUKKwkmaHBwYWJzZF9jb3JlX3ZlYywKKyNlbmRpZgorI2lmZGVmIElSSVhfQ09SRQorCSZpcml4X2NvcmVfdmVjLAorI2VuZGlmCisjaWZkZWYgTkVUQlNEX0NPUkUKKwkmbmV0YnNkX2NvcmVfdmVjLAorI2VuZGlmCisjaWZkZWYgT1NGX0NPUkUKKwkmb3NmX2NvcmVfdmVjLAorI2VuZGlmCisjaWZkZWYgU0NPNV9DT1JFCisJJnNjbzVfY29yZV92ZWMsCisjZW5kaWYKKyNpZmRlZglUUkFEX0NPUkUKKwkmdHJhZF9jb3JlX3ZlYywKKyNlbmRpZgorCisjaWZkZWYJUFRSQUNFX0NPUkUKKwkmcHRyYWNlX2NvcmVfdmVjLAorI2VuZGlmCisKKwlOVUxMIC8qIGVuZCBvZiBsaXN0IG1hcmtlciAqLworfTsKKworLyogYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGNvbnRhaW5zIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCB2ZWN0b3IsCisgICBpZiB0aGVyZSBpcyBvbmUsIG9yIHplcm8gaWYgdGhlcmUgaXNuJ3QuICAqLworCitjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXSA9IHsKKyNpZmRlZiBERUZBVUxUX1ZFQ1RPUgorCSZERUZBVUxUX1ZFQ1RPUiwKKyNlbmRpZgorCU5VTEwKK307CisKKy8qIFdoZW4gdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLCBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgcHV0cyB0aGUKKyAgIG5hbWVzIG9mIHRoZSBtYXRjaGluZyB0YXJnZXRzIGluIGFuIGFycmF5LiAgVGhpcyB2YXJpYWJsZSBpcyB0aGUgbWF4aW11bQorICAgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0aGUgYXJyYXkgY291bGQgcG9zc2libHkgbmVlZC4gICovCitjb25zdCBzaXplX3QgX2JmZF90YXJnZXRfdmVjdG9yX2VudHJpZXMgPSBzaXplb2YoYmZkX3RhcmdldF92ZWN0b3IpL3NpemVvZigqYmZkX3RhcmdldF92ZWN0b3IpOworDAorLyogVGhpcyBhcnJheSBtYXBzIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgb250byBCRkQgdmVjdG9ycy4gICovCisKK3N0cnVjdCB0YXJnbWF0Y2gKK3sKKyAgLyogVGhlIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCisgIGNvbnN0IGNoYXIgKnRyaXBsZXQ7CisgIC8qIFRoZSBCRkQgdmVjdG9yLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGVuIHRoZSB2ZWN0b3IgaXMgZm91bmQgYnkKKyAgICAgc2VhcmNoaW5nIGZvcndhcmQgZm9yIHRoZSBuZXh0IHN0cnVjdHVyZSB3aXRoIGEgbm9uIE5VTEwgdmVjdG9yCisgICAgIGZpZWxkLiAgKi8KKyAgY29uc3QgYmZkX3RhcmdldCAqdmVjdG9yOworfTsKKworLyogdGFyZ21hdGNoLmggaXMgYnVpbHQgYnkgTWFrZWZpbGUgb3V0IG9mIGNvbmZpZy5iZmQuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXJnbWF0Y2ggYmZkX3RhcmdldF9tYXRjaFtdID0geworI2luY2x1ZGUgInRhcmdtYXRjaC5oIgorICB7IE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmZpbmRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCisvKiBGaW5kIGEgdGFyZ2V0IHZlY3RvciwgZ2l2ZW4gYSBuYW1lIG9yIGNvbmZpZ3VyYXRpb24gdHJpcGxldC4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK2ZpbmRfdGFyZ2V0IChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldDsKKyAgY29uc3Qgc3RydWN0IHRhcmdtYXRjaCAqbWF0Y2g7CisKKyAgZm9yICh0YXJnZXQgPSAmYmZkX3RhcmdldF92ZWN0b3JbMF07ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspCisgICAgaWYgKHN0cmNtcCAobmFtZSwgKCp0YXJnZXQpLT5uYW1lKSA9PSAwKQorICAgICAgcmV0dXJuICp0YXJnZXQ7CisKKyAgLyogSWYgd2UgY291bGRuJ3QgbWF0Y2ggb24gdGhlIGV4YWN0IG5hbWUsIHRyeSBtYXRjaGluZyBvbiB0aGUKKyAgICAgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgRklYTUU6IFdlIHNob3VsZCBydW4gdGhlIHRyaXBsZXQgdGhyb3VnaAorICAgICBjb25maWcuc3ViIGZpcnN0LCBidXQgdGhhdCBpcyBoYXJkLiAgKi8KKyAgZm9yIChtYXRjaCA9ICZiZmRfdGFyZ2V0X21hdGNoWzBdOyBtYXRjaC0+dHJpcGxldCAhPSBOVUxMOyBtYXRjaCsrKQorICAgIHsKKyAgICAgIGlmIChmbm1hdGNoIChtYXRjaC0+dHJpcGxldCwgbmFtZSwgMCkgPT0gMCkKKwl7CisJICB3aGlsZSAobWF0Y2gtPnZlY3RvciA9PSBOVUxMKQorCSAgICArK21hdGNoOworCSAgcmV0dXJuIG1hdGNoLT52ZWN0b3I7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7CisgIHJldHVybiBOVUxMOworfQorCisvKgorRlVOQ1RJT04KKwliZmRfc2V0X2RlZmF1bHRfdGFyZ2V0CisKK1NZTk9QU0lTCisJYm9vbGVhbiBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChjb25zdCBjaGFyICpuYW1lKTsKKworREVTQ1JJUFRJT04KKwlTZXQgdGhlIGRlZmF1bHQgdGFyZ2V0IHZlY3RvciB0byB1c2Ugd2hlbiByZWNvZ25pemluZyBhIEJGRC4KKwlUaGlzIHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQsIHdoaWNoIG1heSBiZSBhIEJGRCB0YXJnZXQKKwluYW1lIG9yIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LgorKi8KKworYm9vbGVhbgorYmZkX3NldF9kZWZhdWx0X3RhcmdldCAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OworCisgIGlmIChiZmRfZGVmYXVsdF92ZWN0b3JbMF0gIT0gTlVMTAorICAgICAgJiYgc3RyY21wIChuYW1lLCBiZmRfZGVmYXVsdF92ZWN0b3JbMF0tPm5hbWUpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgdGFyZ2V0ID0gZmluZF90YXJnZXQgKG5hbWUpOworICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSA9IHRhcmdldDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qCitGVU5DVElPTgorCWJmZF9maW5kX3RhcmdldAorCitTWU5PUFNJUworCWNvbnN0IGJmZF90YXJnZXQgKmJmZF9maW5kX3RhcmdldChDT05TVCBjaGFyICp0YXJnZXRfbmFtZSwgYmZkICphYmZkKTsKKworREVTQ1JJUFRJT04KKwlSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciB2ZWN0b3IgZm9yIHRoZSBvYmplY3QgdGFyZ2V0CisJbmFtZWQgQHZhcnt0YXJnZXRfbmFtZX0uICBJZiBAdmFye3RhcmdldF9uYW1lfSBpcyA8PE5VTEw+PiwgY2hvb3NlIHRoZQorCW9uZSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPDxHTlVUQVJHRVQ+PjsgaWYgdGhhdCBpcyBudWxsIG9yIG5vdAorCWRlZmluZWQsIHRoZW4gY2hvb3NlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0IGxpc3QuCisJUGFzc2luZyBpbiB0aGUgc3RyaW5nICJkZWZhdWx0IiBvciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAorCXZhcmlhYmxlIHRvICJkZWZhdWx0IiB3aWxsIGNhdXNlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFyZ2V0CisJbGlzdCB0byBiZSByZXR1cm5lZCwgYW5kICJ0YXJnZXRfZGVmYXVsdGVkIiB3aWxsIGJlIHNldCBpbiB0aGUKKwlCRkQuICBUaGlzIGNhdXNlcyA8PGJmZF9jaGVja19mb3JtYXQ+PiB0byBsb29wIG92ZXIgYWxsIHRoZQorCXRhcmdldHMgdG8gZmluZCB0aGUgb25lIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZSBiZWluZyByZWFkLiAgIAorKi8KKworY29uc3QgYmZkX3RhcmdldCAqCitiZmRfZmluZF90YXJnZXQgKHRhcmdldF9uYW1lLCBhYmZkKQorICAgICBjb25zdCBjaGFyICp0YXJnZXRfbmFtZTsKKyAgICAgYmZkICphYmZkOworeworICBjb25zdCBjaGFyICp0YXJnbmFtZTsKKyAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0OworCisgIGlmICh0YXJnZXRfbmFtZSAhPSBOVUxMKQorICAgIHRhcmduYW1lID0gdGFyZ2V0X25hbWU7CisgIGVsc2UKKyAgICB0YXJnbmFtZSA9IGdldGVudiAoIkdOVVRBUkdFVCIpOworCisgIC8qIFRoaXMgaXMgc2FmZTsgdGhlIHZlY3RvciBjYW5ub3QgYmUgbnVsbCAqLworICBpZiAodGFyZ25hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKHRhcmduYW1lLCAiZGVmYXVsdCIpID09IDApCisgICAgeworICAgICAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IHRydWU7CisgICAgICBpZiAoYmZkX2RlZmF1bHRfdmVjdG9yWzBdICE9IE5VTEwpCisJYWJmZC0+eHZlYyA9IGJmZF9kZWZhdWx0X3ZlY3RvclswXTsKKyAgICAgIGVsc2UKKwlhYmZkLT54dmVjID0gYmZkX3RhcmdldF92ZWN0b3JbMF07CisgICAgICByZXR1cm4gYWJmZC0+eHZlYzsKKyAgICB9CisKKyAgYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IGZhbHNlOworCisgIHRhcmdldCA9IGZpbmRfdGFyZ2V0ICh0YXJnbmFtZSk7CisgIGlmICh0YXJnZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBhYmZkLT54dmVjID0gdGFyZ2V0OworICByZXR1cm4gdGFyZ2V0OworfQorCisvKgorRlVOQ1RJT04KKwliZmRfdGFyZ2V0X2xpc3QKKworU1lOT1BTSVMKKwljb25zdCBjaGFyICoqYmZkX3RhcmdldF9saXN0KHZvaWQpOworCitERVNDUklQVElPTgorCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkCisJdmVjdG9yIG9mIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHZhbGlkIEJGRCB0YXJnZXRzLiBEbyBub3QKKwltb2RpZnkgdGhlIG5hbWVzLgorCisqLworCitjb25zdCBjaGFyICoqCitiZmRfdGFyZ2V0X2xpc3QgKCkKK3sKKyAgaW50IHZlY19sZW5ndGg9IDA7CisjaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgJiYgISBkZWZpbmVkIChfX1NURENfXykKKyAgLyogVGhlIG5hdGl2ZSBjb21waWxlciBvbiB0aGUgSFA5MDAwLzcwMCBoYXMgYSBidWcgd2hpY2ggY2F1c2VzIGl0CisgICAgIHRvIGxvb3AgZW5kbGVzc2x5IHdoZW4gY29tcGlsaW5nIHRoaXMgZmlsZS4gIFRoaXMgYXZvaWRzIGl0LiAgKi8KKyAgdm9sYXRpbGUKKyNlbmRpZgorICAgIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0OworICBDT05TVCAgY2hhciAqKm5hbWVfbGlzdCwgKipuYW1lX3B0cjsKKworICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKKyAgICB2ZWNfbGVuZ3RoKys7CisKKyAgbmFtZV9wdHIgPSBuYW1lX2xpc3QgPSAoQ09OU1QgY2hhciAqKikKKyAgICBiZmRfem1hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOworCisgIGlmIChuYW1lX2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKKyAgICAqKG5hbWVfcHRyKyspID0gKCp0YXJnZXQpLT5uYW1lOworCisgIHJldHVybiBuYW1lX2xpc3Q7Cit9CmRpZmYgLS1naXQgYS9iZmQvdGFyZ21hdGNoLnNlZCBiL2JmZC90YXJnbWF0Y2guc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDBlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvdGFyZ21hdGNoLnNlZApAQCAtMCwwICsxLDMyIEBACisxLC9TVEFSVCBPRiB0YXJnbWF0Y2guaC8JZAorL0VORCBPRiB0YXJnbWF0Y2guaC8sJAkJZAorcy9eI2lmL0tFRVAgI2lmLworcy9eI2VuZGlmL0tFRVAgI2VuZGlmLworcy9eWyAJXSojLiokLy8KK3MvXktFRVAgIy8jLworcy9bIAldKlxcJC8vCit0IGxhYjEKKwk6bGFiMQorcy9bfCAJXVt8IAldKlwoW158KCkgCV1bXnwoKSAJXSpcKVsgCV0qfC97ICJcMSIsIE5VTEwgfSwvZworcy9bfCAJXVt8IAldKlwoW158KCkgCV1bXnwoKSAJXSpcKVsgCV0qKS97ICJcMSIsL2cKK3QgbGFiMgorcy9eWyAJXSp0YXJnX2RlZnZlYz1cKFteIAldKlwpLyNpZiAhZGVmaW5lZCAoU0VMRUNUX1ZFQ1MpIHx8IGRlZmluZWQgKEhBVkVfXDEpLwordCBsYWIzCitzLy4qPS4qLy8KK3MvOzsvLworYgorCTpsYWIyCitICitkCisJOmxhYjMKK0cKK3MvXG4vJUVPTCUvZworcy9cKGRlZmluZWQgKEhBVkVfXClcKFteKV0qXClcKC4qXCkvXDFcMlwzXAorXCZcMiB9LFwKKyNlbmRpZi8KK3MvJUVPTCUvXAorL2cKK3AKK3MvLiovL2cKK3MvXG4vL2cKK2gKZGlmZiAtLWdpdCBhL2JmZC90ZWtoZXguYyBiL2JmZC90ZWtoZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhmZTJkCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3Rla2hleC5jCkBAIC0wLDAgKzEsMTA2NSBAQAorLyogQkZEIGJhY2tlbmQgZm9yIEV4dGVuZGVkIFRla3Ryb25peCBIZXggRm9ybWF0ICBvYmplY3RzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorU1VCU0VDVElPTgorCVRla3Ryb25peCBIZXggRm9ybWF0IGhhbmRsaW5nCisKK0RFU0NSSVBUSU9OCisJCisJVGVrIEhleCByZWNvcmRzIGNhbiBob2xkIHN5bWJvbHMgYW5kIGRhdGEsIGJ1dCBub3QKKwlyZWxvY2F0aW9ucy4gVGhlaXIgbWFpbiBhcHBsaWNhdGlvbiBpcyBjb21tdW5pY2F0aW9uIHdpdGgKKwlkZXZpY2VzIGxpa2UgUFJPTSBwcm9ncmFtbWVycyBhbmQgSUNFIGVxdWlwbWVudC4KKwkKKwlJdCBzZWVtcyB0aGF0IHRoZSBzZWN0aW9ucyBhcmUgZGVzY2liZWQgYXMgYmVpbmcgcmVhbGx5IGJpZywKKyAgICAgICAgdGhlIGV4YW1wbGUgSSBoYXZlIHNheXMgdGhhdCB0aGUgdGV4dCBzZWN0aW9uIGlzIDAuLmZmZmZmZmZmLgorCUJGRCB3b3VsZCBiYXJmIHdpdGggdGhpcywgbWFueSBhcHBzIHdvdWxkIHRyeSB0byBhbGxvYyA0R0IgdG8KKwlyZWFkIGluIHRoZSBmaWxlLgorCisJVGV4IEhleCBtYXkgY29udGFpbiBtYW55IHNlY3Rpb25zLCBidXQgdGhlIGRhdGEgd2hpY2ggY29tZXMgaW4KKwloYXMgbm8gdGFnIHNheWluZyB3aGljaCBzZWN0aW9uIGl0IGJlbG9uZ3MgdG8sIHNvIHdlIGNyZWF0ZQorCW9uZSBzZWN0aW9uIGZvciBlYWNoIGJsb2NrIG9mIGRhdGEsIGNhbGxlZCAiYmxrbm5ubiIgd2hpY2ggd2UKKwlzdGljayBhbGwgdGhlIGRhdGEgaW50by4KKworCVRla0hleCBtYXkgY29tZSBvdXQgb2YgCW9yZGVyIGFuZCB0aGVyZSBpcyBubyBoZWFkZXIsIHNvIGFuCisJaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkICB0byBkaXNjb3ZlciB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorCWFkZHJlc3NlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdm1hIGFuZCBzaXplIG9mIHRoZSBzZWN0aW9ucyB3ZQorCWNyZWF0ZS4KKwlXZSByZWFkIGluIHRoZSBkYXRhIGludG8gcGFnZXMgb2YgQ0hVTktfTUFTSysxIHNpemUgYW5kIHJlYWQKKwl0aGVtIG91dCBmcm9tIHRoYXQgd2hlbmV2ZXIgd2UgbmVlZCB0by4KKworCUFueSBudW1iZXIgb2Ygc2VjdGlvbnMgbWF5IGJlIGNyZWF0ZWQgZm9yIG91dHB1dCwgd2Ugc2F2ZSB0aGVtCisJdXAgYW5kIG91dHB1dCB0aGVtIHdoZW4gaXQncyB0aW1lIHRvIGNsb3NlIHRoZSBiZmQuCisKKworCUEgVGVrSGV4IHJlY29yZCBsb29rcyBsaWtlOgorRVhBTVBMRQorCSU8YmxvY2sgbGVuZ3RoPjx0eXBlPjxjaGVja3N1bT48c3R1ZmY+PGNyPgorCQorREVTQ1JJUFRJT04KKwlXaGVyZQorCW8gbGVuZ3RoCisJaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVjb3JkIG5vdCBpbmNsdWRpbmcgdGhlICUgc2lnbi4KKwlvIHR5cGUKKwlpcyBvbmUgb2Y6CisJMykgc3ltYm9sIHJlY29yZAorCTYpIGRhdGEgcmVjb3JkCisJOCkgdGVybWluYXRpb24gcmVjb3JkCisJCisKK1RoZSBkYXRhIGNhbiBjb21lIG91dCBvZiBvcmRlciwgYW5kIG1heSBiZSBkaXNjb250aWdvdXMuIFRoaXMgaXMgYQorc2VyaWFsIHByb3RvY29sLCBzbyBiaWcgZmlsZXMgYXJlIHVubGlrZWx5LCBzbyB3ZSBrZWVwIGEgbGlzdCBvZiA4ayBjaHVua3MKKyovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGJmZF92bWEgbG93OworICAgIGJmZF92bWEgaGlnaDsKKyAgfSBhZGRyX3JhbmdlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0CisgIHsKKworICAgIGFzeW1ib2wgc3ltYm9sOworICAgIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqcHJldjsKKworICB9IHRla2hleF9zeW1ib2xfdHlwZTsKKworc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCitzdGF0aWMgY2hhciBzdW1fYmxvY2tbMjU2XTsKKworI2RlZmluZSBOT1RfSEVYIDIwCisjZGVmaW5lIE5JQkJMRSh4KSBoZXhfdmFsdWUoeCkKKyNkZWZpbmUgSEVYKGJ1ZmZlcikgKChOSUJCTEUoKGJ1ZmZlcilbMF0pPDw0KSArIE5JQkJMRSgoYnVmZmVyKVsxXSkpCisjZGVmaW5lIFRPSEVYKGQseCkgXAorKGQpWzFdID0gZGlnc1soeCkgJiAweGZdOyBcCisoZClbMF0gPSBkaWdzWygoeCk+PjQpJjB4Zl07CisjZGVmaW5lCUlTSEVYKHgpICBoZXhfcCh4KQorCitzdGF0aWMgdm9pZCB0ZWtoZXhfaW5pdCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYmZkX3ZtYSBnZXR2YWx1ZSBQQVJBTVMgKChjaGFyICoqKSk7CitzdGF0aWMgdm9pZCB0ZWtoZXhfcHJpbnRfc3ltYm9sCisgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHRla2hleF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOworc3RhdGljIGFzeW1ib2wgKnRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCB0ZWtoZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIG91dCBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICosIGNoYXIgKikpOworc3RhdGljIHZvaWQgd3JpdGVzeW0gUEFSQU1TICgoY2hhciAqKiwgQ09OU1QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCB3cml0ZXZhbHVlIFBBUkFNUyAoKGNoYXIgKiosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHRla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cworIFBBUkFNUyAoKGJmZCosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyBib29sZWFuIHRla2hleF9zZXRfYXJjaF9tYWNoCisgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOworc3RhdGljIGJvb2xlYW4gdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCisgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyB2b2lkIG1vdmVfc2VjdGlvbl9jb250ZW50cworIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlLCBib29sZWFuKSk7CitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqdGVraGV4X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgYm9vbGVhbiB0ZWtoZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyBsb25nIHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgbG9uZyB0ZWtoZXhfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOworc3RhdGljIHZvaWQgcGFzc19vdmVyIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQqLCBpbnQsIGNoYXIgKikpKTsKK3N0YXRpYyB2b2lkIGZpcnN0X3BoYXNlIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGNoYXIgKikpOworc3RhdGljIHZvaWQgaW5zZXJ0X2J5dGUgUEFSQU1TICgoYmZkICosIGludCwgYmZkX3ZtYSkpOworc3RhdGljIHN0cnVjdCBkYXRhX3N0cnVjdCAqZmluZF9jaHVuayBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOworc3RhdGljIHVuc2lnbmVkIGludCBnZXRzeW0gUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7CisKKy8qCitIZXJlJ3MgYW4gZXhhbXBsZQorJTNBNkM2NDgwMDA0RTU2RkZGQzRFNzE3MDYzQjBBRUZGRkM2RDA2NTJBRUZGRkM2MEYyNEU1RTRFNzUKKyUxQjM3MDlUX1NFR01FTlQxMTA4RkZGRkZGRkYKKyUyQjNBQjlUX1NFR01FTlQ3RGdjY19jb21waWxlZCQxMDg3aGVsbG8kYzEwCislMzczODI5VF9TRUdNRU5UODBpbnQkdDEkcjEkJDIxNDc0MTA4MGNoYXIkdDIkcjIkMCQxMjcxMAorJTM3Mzc2OVRfU0VHTUVOVDgwbG9uZyRpbnQkdDMkcjEkJDEwODB1bnNpZ25lZCRpbnQkdDQkMTAKKyUzNzNDQTlUX1NFR01FTlQ4MGxvbmckdW5zaWduZWQkaW4xMDgwc2hvcnQkaW50JHQ2JHIxJDEwCislMzczMDQ5VF9TRUdNRU5UODBsb25nJGxvbmckaW50JHQ3MTA4MHNob3J0JHVuc2lnbmVkJGkxMAorJTM3M0EyOVRfU0VHTUVOVDgwbG9uZyRsb25nJHVuc2lnbjEwODBzaWduZWQkY2hhciR0MTAkMTAKKyUzNzNENjlUX1NFR01FTlQ4MHVuc2lnbmVkJGNoYXIkdDExMDgwZmxvYXQkdDEyJHIxJDQkMDEwCislMzczRDE5VF9TRUdNRU5UODBkb3VibGUkdDEzJHIxJDgkMTA4MGxvbmckZG91YmxlJHQxNCQxMAorJTI3MzREOVRfU0VHTUVOVDhCdm9pZCR0MTUkMTUxMDM1X21haW4xMAorJTJGM0NBOVRfU0VHTUVOVDgxJDEwODEkMTY4MSQxRTgxJDIxNDg3bWFpbiRGMTEwCislMjgzMkY5VF9TRUdNRU5UODNpJDE4RkZGRkZGRkM4MSQxNDgxJDIxNAorJTA3IDggMTAgMTAKKworZXhwbGFuYXRpb246CislM0E2QzY0ODAwMDRFNTZGRkZDNEU3MTcwNjNCMEFFRkZGQzZEMDY1MkFFRkZGQzYwRjI0RTVFNEU3NQorIF4gXl4gXiAgICAgXi1kYXRhCisgfCB8fCArLS0tLS0tIDQgY2hhciBpbnRlZ2VyIDB4ODAwMAorIHwgfCstLS0tLS0tLSBjaGVja3N1bQorIHwgKy0tLS0tLS0tLSB0eXBlIDYgKGRhdGEgcmVjb3JkKQorICstLS0tLS0tLS0tLSBsZW5ndGggM2EgY2hhcnMKKyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAzYSAoNTggY2hhcnMpIC0tLS0tLS0tLS0tLS0tLS0tLS0+CisKKyUxQjM3MDlUX1NFR01FTlQxMTA4RkZGRkZGRkYKKyAgICAgIF4gICAgICAgICBeXiBeLSA4IGNoYXJhY3RlciBpbnRlZ2VyIDB4ZmZmZmZmZmYKKyAgICAgIHwgICAgICAgICB8Ky0gICAxIGNoYXJhY3RlciBpbnRlZ2VyIDAKKyAgICAgIHwgICAgICAgICArLS0gICB0eXBlIDEgc3ltYm9sIChzZWN0aW9uIGRlZmluaXRpb24pCisgICAgICArLS0tLS0tLS0tLS0tICAgOSBjaGFyIHN5bWJvbCBUX1NFR01FTlQKKworJTJCM0FCOVRfU0VHTUVOVDdEZ2NjX2NvbXBpbGVkJDEwODdoZWxsbyRjMTAKKyUzNzM4MjlUX1NFR01FTlQ4MGludCR0MSRyMSQkMjE0NzQxMDgwY2hhciR0MiRyMiQwJDEyNzEwCislMzczNzY5VF9TRUdNRU5UODBsb25nJGludCR0MyRyMSQkMTA4MHVuc2lnbmVkJGludCR0NCQxMAorJTM3M0NBOVRfU0VHTUVOVDgwbG9uZyR1bnNpZ25lZCRpbjEwODBzaG9ydCRpbnQkdDYkcjEkMTAKKyUzNzMwNDlUX1NFR01FTlQ4MGxvbmckbG9uZyRpbnQkdDcxMDgwc2hvcnQkdW5zaWduZWQkaTEwCislMzczQTI5VF9TRUdNRU5UODBsb25nJGxvbmckdW5zaWduMTA4MHNpZ25lZCRjaGFyJHQxMCQxMAorJTM3M0Q2OVRfU0VHTUVOVDgwdW5zaWduZWQkY2hhciR0MTEwODBmbG9hdCR0MTIkcjEkNCQwMTAKKyUzNzNEMTlUX1NFR01FTlQ4MGRvdWJsZSR0MTMkcjEkOCQxMDgwbG9uZyRkb3VibGUkdDE0JDEwCislMjczNEQ5VF9TRUdNRU5UOEJ2b2lkJHQxNSQxNTEwMzVfbWFpbjEwCislMkYzQ0E5VF9TRUdNRU5UODEkMTA4MSQxNjgxJDFFODEkMjE0ODdtYWluJEYxMTAKKyUyODMyRjlUX1NFR01FTlQ4M2kkMThGRkZGRkZGQzgxJDE0ODEkMjE0CislMDc4MTAxMAorCitUdXJucyBpbnRvCitzYWNAdGhlcHViJCAuL29iamR1bXAgLWR4IC1tIG02OGsgZgorCitmOiAgICAgZmlsZSBmb3JtYXQgdGVraGV4CistLS0tLXgtLS0gOS81NTcyOCAtMTM0MjE5NDE2IFNlcCAyOSAxNToxMyAxOTk1IGYKK2FyY2hpdGVjdHVyZTogVU5LTk9XTiEsIGZsYWdzIDB4MDAwMDAwMTA6CitIQVNfU1lNUworc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwCitTRUNUSU9OIDAgW0QwMDAwMDAwMF0JOiBzaXplIDAwMDIwMDAwIHZtYSAwMDAwMDAwMCBhbGlnbiAyKiowCisgQUxMT0MsIExPQUQKK1NFQ1RJT04gMSBbRDAwMDA4MDAwXQk6IHNpemUgMDAwMDIwMDEgdm1hIDAwMDA4MDAwIGFsaWduIDIqKjAKKworU0VDVElPTiAyIFtUX1NFR01FTlRdCTogc2l6ZSBmZmZmZmZmZiB2bWEgMDAwMDAwMDAgYWxpZ24gMioqMAorCitTWU1CT0wgVEFCTEU6CiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZ2NjX2NvbXBpbGVkJAorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGhlbGxvJGMKKzAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBpbnQkdDEkcjEkJDIxNDc0CiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgY2hhciR0MiRyMiQwJDEyNworMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckaW50JHQzJHIxJCQKKzAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB1bnNpZ25lZCRpbnQkdDQkCiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyR1bnNpZ25lZCRpbgorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNob3J0JGludCR0NiRyMSQKKzAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGxvbmckaW50JHQ3CiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2hvcnQkdW5zaWduZWQkaQorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckbG9uZyR1bnNpZ24KKzAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaWduZWQkY2hhciR0MTAkCiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdW5zaWduZWQkY2hhciR0MQorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGZsb2F0JHQxMiRyMSQ0JDAKKzAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBkb3VibGUkdDEzJHIxJDgkCiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRkb3VibGUkdDE0JAorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHZvaWQkdDE1JDE1CiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgX21haW4KKzAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKKzAwMDAwMDEwICBnICAgICAgIFRfU0VHTUVOVCAkCiswMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbWFpbiRGMQorZmNmZmZmZmYgIGcgICAgICAgVF9TRUdNRU5UIGkkMQorMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKKzAwMDAwMDEwICBnICAgICAgIFRfU0VHTUVOVCAkCisKKworUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbRDAwMDAwMDAwXTogKG5vbmUpCisKK1JFTE9DQVRJT04gUkVDT1JEUyBGT1IgW0QwMDAwODAwMF06IChub25lKQorCitSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtUX1NFR01FTlRdOiAobm9uZSkKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBEMDAwMDAwMDA6CisuLi4KKzAwMDA4MDAwICgkKyk3ZmYwIGxpbmt3IGZwLCMtNAorMDAwMDgwMDQgKCQrKTdmZjQgbm9wCiswMDAwODAwNiAoJCspN2ZmNiBtb3ZlbCAjOTksZDAKKzAwMDA4MDA4ICgkKyk3ZmY4IGNtcGwgZnBAKC00KSxkMAorMDAwMDgwMGMgKCQrKTdmZmMgYmx0cyAwMDAwODAxNCAoJCspODAwNAorMDAwMDgwMGUgKCQrKTdmZmUgYWRkcWwgIzEsZnBAKC00KQorMDAwMDgwMTIgKCQrKTgwMDIgYnJhcyAwMDAwODAwNiAoJCspN2ZmNgorMDAwMDgwMTQgKCQrKTgwMDQgdW5sayBmcAorMDAwMDgwMTYgKCQrKTgwMDYgcnRzCisuLi4KKworKi8KKworc3RhdGljIHZvaWQKK3Rla2hleF9pbml0ICgpCit7CisgIHVuc2lnbmVkIGludCBpOworICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKKyAgaW50IHZhbDsKKworICBpZiAoaW5pdGVkID09IGZhbHNlKQorICAgIHsKKyAgICAgIGluaXRlZCA9IHRydWU7CisgICAgICBoZXhfaW5pdCAoKTsKKyAgICAgIHZhbCA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwl7CisJICBzdW1fYmxvY2tbaSArICcwJ10gPSB2YWwrKzsKKwl9CisgICAgICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspCisJeworCSAgc3VtX2Jsb2NrW2ldID0gdmFsKys7CisJfQorICAgICAgc3VtX2Jsb2NrWyckJ10gPSB2YWwrKzsKKyAgICAgIHN1bV9ibG9ja1snJSddID0gdmFsKys7CisgICAgICBzdW1fYmxvY2tbJy4nXSA9IHZhbCsrOworICAgICAgc3VtX2Jsb2NrWydfJ10gPSB2YWwrKzsKKyAgICAgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykKKwl7CisJICBzdW1fYmxvY2tbaV0gPSB2YWwrKzsKKwl9CisgICAgfQorfQorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb24gYSBsaW5lIGlzIEZGICovCisjZGVmaW5lIE1BWENIVU5LIDB4ZmYKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgZml0IG9udG8gYSBsaW5lIG9uIG91dHB1dCAqLworI2RlZmluZSBDSFVOSyAyMQorCisvKiBXZSBjYW5ub3Qgb3V0cHV0IG91ciB0ZWtoZXhvcmRzIGFzIHdlIHNlZSB0aGVtLCB3ZSBoYXZlIHRvIGdsdWUgdGhlbQorICAgdG9nZXRoZXIsIHRoaXMgaXMgZG9uZSBpbiB0aGlzIHN0cnVjdHVyZSA6ICovCisKK3N0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICpkYXRhOworICBiZmRfdm1hIHdoZXJlOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIHN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdCAqbmV4dDsKKworfTsKK3R5cGVkZWYgc3RydWN0IHRla2hleF9kYXRhX2xpc3Rfc3RydWN0IHRla2hleF9kYXRhX2xpc3RfdHlwZTsKKworI2RlZmluZSBDSFVOS19NQVNLIDB4MWZmZgorCitzdHJ1Y3QgZGF0YV9zdHJ1Y3QKKyAgeworICAgIGNoYXIgY2h1bmtfZGF0YVtDSFVOS19NQVNLICsgMV07CisgICAgY2hhciBjaHVua19pbml0W0NIVU5LX01BU0sgKyAxXTsKKyAgICBiZmRfdm1hIHZtYTsKKyAgICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKm5leHQ7CisgIH07CisKK3R5cGVkZWYgc3RydWN0IHRla2hleF9kYXRhX3N0cnVjdAoreworICB0ZWtoZXhfZGF0YV9saXN0X3R5cGUgKmhlYWQ7CisgIHVuc2lnbmVkIGludCB0eXBlOworICBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CisgIHN0cnVjdCBkYXRhX3N0cnVjdCAqZGF0YTsKK30gdGRhdGFfdHlwZTsKKworI2RlZmluZSBlbmRhKHgpICh4LT52bWEgKyB4LT5zaXplKQorCitzdGF0aWMgYmZkX3ZtYQorZ2V0dmFsdWUgKHNyY3ApCisgICAgIGNoYXIgKipzcmNwOworeworICBjaGFyICpzcmMgPSAqc3JjcDsKKyAgYmZkX3ZtYSB2YWx1ZSA9IDA7CisgIHVuc2lnbmVkIGludCBsZW4gPSBoZXhfdmFsdWUoKnNyYysrKTsKKworICBpZiAobGVuID09IDApCisgICAgbGVuID0gMTY7CisgIHdoaWxlIChsZW4tLSkKKyAgICB7CisgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDQgfCBoZXhfdmFsdWUoKnNyYysrKTsKKyAgICB9CisgICpzcmNwID0gc3JjOworICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2dldHN5bSAoZHN0cCwgc3JjcCkKKyAgICAgY2hhciAqZHN0cDsKKyAgICAgY2hhciAqKnNyY3A7Cit7CisgIGNoYXIgKnNyYyA9ICpzcmNwOworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGxlbiA9IGhleF92YWx1ZSgqc3JjKyspOworCisgIGlmIChsZW4gPT0gMCkKKyAgICBsZW4gPSAxNjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIGRzdHBbaV0gPSBzcmNbaV07CisgIGRzdHBbaV0gPSAwOworICAqc3JjcCA9IHNyYyArIGk7CisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKgorZmluZF9jaHVuayAoYWJmZCwgdm1hKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF92bWEgdm1hOworeworICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKKworICB2bWEgJj0gfkNIVU5LX01BU0s7CisgIHdoaWxlIChkICYmIChkLT52bWEpICE9IHZtYSkKKyAgICB7CisgICAgICBkID0gZC0+bmV4dDsKKyAgICB9CisgIGlmICghZCkKKyAgICB7CisgICAgICBjaGFyICpzbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgMTIpOworCisgICAgICAvKiBObyBjaHVuayBmb3IgdGhpcyBhZGRyZXNzLCBzbyBtYWtlIG9uZSB1cCAqLworICAgICAgZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikKKwliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGRhdGFfc3RydWN0KSk7CisKKyAgICAgIGlmICghc25hbWUgfHwgIWQpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIG1lbXNldCAoZC0+Y2h1bmtfaW5pdCwgMCwgQ0hVTktfTUFTSyArIDEpOworICAgICAgbWVtc2V0IChkLT5jaHVua19kYXRhLCAwLCBDSFVOS19NQVNLICsgMSk7CisgICAgICBkLT5uZXh0ID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7CisgICAgICBkLT52bWEgPSB2bWE7CisgICAgICBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YSA9IGQ7CisgICAgfQorICByZXR1cm4gZDsKK30KKworc3RhdGljIHZvaWQKK2luc2VydF9ieXRlIChhYmZkLCB2YWx1ZSwgYWRkcikKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgdmFsdWU7CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgLyogRmluZCB0aGUgY2h1bmsgdGhhdCB0aGlzIGJ5dGUgbmVlZHMgYW5kIHB1dCBpdCBpbiAqLworICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQgPSBmaW5kX2NodW5rIChhYmZkLCBhZGRyKTsKKworICBkLT5jaHVua19kYXRhW2FkZHIgJiBDSFVOS19NQVNLXSA9IHZhbHVlOworICBkLT5jaHVua19pbml0W2FkZHIgJiBDSFVOS19NQVNLXSA9IDE7Cit9CisKKy8qIFRoZSBmaXJzdCBwYXNzIGlzIHRvIGZpbmQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgc2VjdGlvbnMsIGFuZCBzZWUKKyAgaG93IGJpZyB0aGUgZGF0YSBpcyAqLworc3RhdGljIHZvaWQKK2ZpcnN0X3BoYXNlIChhYmZkLCB0eXBlLCBzcmMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHR5cGU7CisgICAgIGNoYXIgKnNyYzsKK3sKKyAgYXNlY3Rpb24gKnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICBpbnQgbGVuOworICBjaGFyIHN5bVsxN107CQkJLyogQSBzeW1ib2wgY2FuIG9ubHkgYmUgMTZjaGFycyBsb25nICovCisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICc2JzoKKyAgICAgIC8qIERhdGEgcmVjb3JkIC0gcmVhZCBpdCBhbmQgc3RvcmUgaXQgKi8KKyAgICAgIHsKKwliZmRfdm1hIGFkZHIgPSBnZXR2YWx1ZSAoJnNyYyk7CisKKwl3aGlsZSAoKnNyYykKKwkgIHsKKwkgICAgaW5zZXJ0X2J5dGUgKGFiZmQsIEhFWCAoc3JjKSwgYWRkcik7CisJICAgIHNyYyArPSAyOworCSAgICBhZGRyKys7CisJICB9CisgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICBjYXNlICczJzoKKyAgICAgIC8qIFN5bWJvbCByZWNvcmQsIHJlYWQgdGhlIHNlZ21lbnQgKi8KKyAgICAgIGxlbiA9IGdldHN5bSAoc3ltLCAmc3JjKTsKKyAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3ltKTsKKyAgICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQorCXsKKwkgIGNoYXIgKm4gPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOworCisJICBpZiAoIW4pCisJICAgIGFib3J0KCk7CQkvKiBGSVhNRSAqLworCSAgbWVtY3B5IChuLCBzeW0sIGxlbiArIDEpOworCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG4pOworCX0KKyAgICAgIHdoaWxlICgqc3JjKQorCXsKKwkgIHN3aXRjaCAoKnNyYykKKwkgICAgeworCSAgICBjYXNlICcxJzoJCS8qIHNlY3Rpb24gcmFuZ2UgKi8KKwkgICAgICBzcmMrKzsKKwkgICAgICBzZWN0aW9uLT52bWEgPSBnZXR2YWx1ZSAoJnNyYyk7CisJICAgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gZ2V0dmFsdWUgKCZzcmMpIC0gc2VjdGlvbi0+dm1hOworCSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICcwJzoKKwkgICAgY2FzZSAnMic6CisJICAgIGNhc2UgJzMnOgorCSAgICBjYXNlICc0JzoKKwkgICAgY2FzZSAnNic6CisJICAgIGNhc2UgJzcnOgorCSAgICBjYXNlICc4JzoKKwkgICAgICAvKiBTeW1ib2xzLCBhZGQgdG8gc2VjdGlvbiAqLworCSAgICAgIHsKKwkJdGVraGV4X3N5bWJvbF90eXBlICpuZXcgPQorCQkodGVraGV4X3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkJICAgICAgIHNpemVvZiAodGVraGV4X3N5bWJvbF90eXBlKSk7CisJCWNoYXIgdHlwZSA9ICgqc3JjKTsKKworCQlpZiAoIW5ldykKKwkJICBhYm9ydCgpOwkvKiBGSVhNRSAqLworCQluZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKwkJc3JjKys7CisJCWFiZmQtPnN5bWNvdW50Kys7CisJCWFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOworCQluZXctPnByZXYgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9sczsKKwkJYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHMgPSBuZXc7CisJCWxlbiA9IGdldHN5bSAoc3ltLCAmc3JjKTsKKwkJbmV3LT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSk7CisJCWlmICghbmV3LT5zeW1ib2wubmFtZSkKKwkJICBhYm9ydCgpOwkvKiBGSVhNRSAqLworCQltZW1jcHkgKChjaGFyICopIChuZXctPnN5bWJvbC5uYW1lKSwgc3ltLCBsZW4gKyAxKTsKKwkJbmV3LT5zeW1ib2wuc2VjdGlvbiA9IHNlY3Rpb247CisJCWlmICh0eXBlIDw9ICc0JykKKwkJICBuZXctPnN5bWJvbC5mbGFncyA9IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7CisJCWVsc2UKKwkJICBuZXctPnN5bWJvbC5mbGFncyA9IEJTRl9MT0NBTDsKKwkJbmV3LT5zeW1ib2wudmFsdWUgPSBnZXR2YWx1ZSAoJnNyYykgLSBzZWN0aW9uLT52bWE7CisJICAgICAgfQorCSAgICB9CisJfQorICAgIH0KK30KKworLyogUGFzcyBvdmVyIGFuIHRla2hleCwgY2FsbGluZyBvbmUgb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucyBvbiBlYWNoCisgICByZWNvcmQuICAqLworCitzdGF0aWMgdm9pZAorcGFzc19vdmVyIChhYmZkLCBmdW5jKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKK3sKKyAgdW5zaWduZWQgaW50IGNoYXJzX29uX2xpbmU7CisgIGJvb2xlYW4gZW9mID0gZmFsc2U7CisKKyAgLyogVG8gdGhlIGZyb250IG9mIHRoZSBmaWxlICovCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgd2hpbGUgKGVvZiA9PSBmYWxzZSkKKyAgICB7CisgICAgICBjaGFyIGJ1ZmZlcltNQVhDSFVOS107CisgICAgICBjaGFyICpzcmMgPSBidWZmZXI7CisgICAgICBjaGFyIHR5cGU7CisKKyAgICAgIC8qIEZpbmQgZmlyc3QgJyUnICovCisgICAgICBlb2YgPSAoYm9vbGVhbikgKGJmZF9yZWFkIChzcmMsIDEsIDEsIGFiZmQpICE9IDEpOworICAgICAgd2hpbGUgKCpzcmMgIT0gJyUnICYmICFlb2YpCisJeworCSAgZW9mID0gKGJvb2xlYW4pIChiZmRfcmVhZCAoc3JjLCAxLCAxLCBhYmZkKSAhPSAxKTsKKwl9CisgICAgICBpZiAoZW9mKQorCWJyZWFrOworICAgICAgc3JjKys7CisKKyAgICAgIC8qIEZldGNoIHRoZSB0eXBlIGFuZCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hlY2tzdW0gKi8KKyAgICAgIGlmIChiZmRfcmVhZCAoc3JjLCAxLCA1LCBhYmZkKSAhPSA1KQorCWFib3J0ICgpOyAvKiBGSVhNRSAqLworCisgICAgICB0eXBlID0gc3JjWzJdOworCisgICAgICBpZiAoIUlTSEVYIChzcmNbMF0pIHx8ICFJU0hFWCAoc3JjWzFdKSkKKwlicmVhazsKKworICAgICAgY2hhcnNfb25fbGluZSA9IEhFWCAoc3JjKSAtIDU7CS8qIEFscmVhZHkgcmVhZCBmaXZlIGNoYXIgKi8KKworICAgICAgaWYgKGJmZF9yZWFkIChzcmMsIDEsIGNoYXJzX29uX2xpbmUsIGFiZmQpICE9IGNoYXJzX29uX2xpbmUpCisJYWJvcnQgKCk7IC8qIEZJWE1FICovCisgICAgICBzcmNbY2hhcnNfb25fbGluZV0gPSAwOwkvKiBwdXQgYSBudWxsIGF0IHRoZSBlbmQgKi8KKworICAgICAgZnVuYyAoYWJmZCwgdHlwZSwgc3JjKTsKKyAgICB9CisKK30KKworc3RhdGljIGxvbmcKK3Rla2hleF9nZXRfc3ltdGFiIChhYmZkLCB0YWJsZSkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqdGFibGU7Cit7CisgIHRla2hleF9zeW1ib2xfdHlwZSAqcCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzOworICB1bnNpZ25lZCBpbnQgYyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworCisgIHRhYmxlW2NdID0gMDsKKyAgd2hpbGUgKHApCisgICAgeworICAgICAgdGFibGVbLS1jXSA9ICYocC0+c3ltYm9sKTsKKyAgICAgIHAgPSBwLT5wcmV2OworICAgIH0KKworICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Cit9CisKK3N0YXRpYyBsb25nCit0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICByZXR1cm4gKGFiZmQtPnN5bWNvdW50ICsgMSkgKiAoc2l6ZW9mIChzdHJ1Y3QgdGVraGV4X2FzeW1ib2xfc3RydWN0ICopKTsKKworfQorCitzdGF0aWMgYm9vbGVhbgordGVraGV4X21rb2JqZWN0IChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHRkYXRhX3R5cGUgKnRkYXRhID0gKHRkYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHRkYXRhX3R5cGUpKTsKKworICBpZiAoIXRkYXRhKQorICAgIHJldHVybiBmYWxzZTsKKyAgYWJmZC0+dGRhdGEudGVraGV4X2RhdGEgPSB0ZGF0YTsKKyAgdGRhdGEtPnR5cGUgPSAxOworICB0ZGF0YS0+aGVhZCA9ICh0ZWtoZXhfZGF0YV9saXN0X3R5cGUgKikgTlVMTDsKKyAgdGRhdGEtPnN5bWJvbHMgPSAoc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICopIE5VTEw7CisgIHRkYXRhLT5kYXRhID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKSBOVUxMOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgbG9va3MgbGlrZSBpdCdzIGluIFRla0hleCBmb3JtYXQuIEp1c3QgbG9vaworICBmb3IgYSBwZXJjZW50IHNpZ24gYW5kIHNvbWUgaGV4IGRpZ2l0cyAqLworCitzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCit0ZWtoZXhfb2JqZWN0X3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciBiWzRdOworCisgIHRla2hleF9pbml0ICgpOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgYmZkX3JlYWQgKGIsIDEsIDQsIGFiZmQpICE9IDQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGJbMF0gIT0gJyUnIHx8ICFJU0hFWCAoYlsxXSkgfHwgIUlTSEVYIChiWzJdKSB8fCAhSVNIRVggKGJbM10pKQorICAgIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOworCisgIHRla2hleF9ta29iamVjdCAoYWJmZCk7CisKKyAgcGFzc19vdmVyIChhYmZkLCBmaXJzdF9waGFzZSk7CisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitzdGF0aWMgdm9pZAorbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQsIGdldCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9ucDsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworICAgICBib29sZWFuIGdldDsKK3sKKyAgYmZkX3ZtYSBhZGRyOworICBjaGFyICpsb2NhdGlvbiA9IChjaGFyICopIGxvY2F0aW9ucDsKKyAgYmZkX3ZtYSBwcmV2X251bWJlciA9IDE7CS8qIE5vdGhpbmcgY2FuIGhhdmUgdGhpcyBhcyBhIGhpZ2ggYml0Ki8KKyAgc3RydWN0IGRhdGFfc3RydWN0ICpkID0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKSBOVUxMOworCisgIGZvciAoYWRkciA9IHNlY3Rpb24tPnZtYTsgY291bnQgIT0gMDsgY291bnQtLSwgYWRkcisrKQorICAgIHsKKworICAgICAgYmZkX3ZtYSBjaHVua19udW1iZXIgPSBhZGRyICYgfkNIVU5LX01BU0s7CS8qIEdldCBoaWdoIGJpdHMgb2YgYWRkcmVzcyAqLworICAgICAgYmZkX3ZtYSBsb3dfYml0cyA9IGFkZHIgJiBDSFVOS19NQVNLOworCisgICAgICBpZiAoY2h1bmtfbnVtYmVyICE9IHByZXZfbnVtYmVyKQorCXsKKwkgIC8qIERpZmZlcmVudCBjaHVuaywgc28gbW92ZSBwb2ludGVyICovCisJICBkID0gZmluZF9jaHVuayAoYWJmZCwgY2h1bmtfbnVtYmVyKTsKKwl9CisKKyAgICAgIGlmIChnZXQpCisJeworCSAgaWYgKGQtPmNodW5rX2luaXRbbG93X2JpdHNdKQorCSAgICB7CisJICAgICAgKmxvY2F0aW9uID0gZC0+Y2h1bmtfZGF0YVtsb3dfYml0c107CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpsb2NhdGlvbiA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgZC0+Y2h1bmtfZGF0YVtsb3dfYml0c10gPSAqbG9jYXRpb247CisJICBkLT5jaHVua19pbml0W2xvd19iaXRzXSA9ICgqbG9jYXRpb24gIT0gMCk7CisJfQorCisgICAgICBsb2NhdGlvbisrOworCisgICAgfQorCit9CisKK3N0YXRpYyBib29sZWFuCit0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9ucDsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQorICAgIHsKKyAgICAgIG1vdmVfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGNvdW50LCB0cnVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2xlYW4KK3Rla2hleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Cit7CisgIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKK30KKworLyogd2UgaGF2ZSB0byBzYXZlIHVwIGFsbCB0aGUgVGVraGV4b3JkcyBmb3IgYSBzcGx1cmdlIGJlZm9yZSBvdXRwdXQsCisgICAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Rla2hleF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9ucDsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOworeworCisgIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQorICAgIHsKKyAgICAgIC8qIFRoZSBmaXJzdCB0aW1lIGFyb3VuZCwgYWxsb2NhdGUgZW5vdWdoIHNlY3Rpb25zIHRvIGhvbGQgYWxsIHRoZSBjaHVua3MgKi8KKyAgICAgIGFzZWN0aW9uICpzID0gYWJmZC0+c2VjdGlvbnM7CisgICAgICBiZmRfdm1hIHZtYTsKKworICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKQorCSAgICB7CisJICAgICAgZm9yICh2bWEgPSBzLT52bWEgJiB+Q0hVTktfTUFTSzsKKwkJICAgdm1hIDwgcy0+dm1hICsgcy0+X3Jhd19zaXplOworCQkgICB2bWEgKz0gQ0hVTktfTUFTSykKKwkJZmluZF9jaHVuayAoYWJmZCwgdm1hKTsKKwkgICAgfQorCX0KKworICAgIH0KKyAgaWYgKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKKyAgICB7CisgICAgICBtb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBieXRlc190b19kbywgZmFsc2UpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXZhbHVlIChkc3QsIHZhbHVlKQorICAgICBjaGFyICoqZHN0OworICAgICBiZmRfdm1hIHZhbHVlOworeworICBjaGFyICpwID0gKmRzdDsKKyAgaW50IGxlbjsKKyAgaW50IHNoaWZ0OworCisgIGZvciAobGVuID0gOCwgc2hpZnQgPSAyODsgc2hpZnQ7IHNoaWZ0IC09IDQsIGxlbi0tKQorICAgIHsKKyAgICAgIGlmICgodmFsdWUgPj4gc2hpZnQpICYgMHhmKQorCXsKKwkgICpwKysgPSBsZW4gKyAnMCc7CisJICB3aGlsZSAobGVuKQorCSAgICB7CisJICAgICAgKnArKyA9IGRpZ3NbKHZhbHVlID4+IHNoaWZ0KSAmIDB4Zl07CisJICAgICAgc2hpZnQgLT0gNDsKKwkgICAgICBsZW4tLTsKKwkgICAgfQorCSAgKmRzdCA9IHA7CisJICByZXR1cm47CisKKwl9CisgICAgfQorICAqcCsrID0gJzEnOworICAqcCsrID0gJzAnOworICAqZHN0ID0gcDsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlc3ltIChkc3QsIHN5bSkKKyAgICAgY2hhciAqKmRzdDsKKyAgICAgQ09OU1QgY2hhciAqc3ltOworeworICBjaGFyICpwID0gKmRzdDsKKyAgaW50IGxlbiA9IChzeW0gPyBzdHJsZW4gKHN5bSkgOiAwKTsKKworICBpZiAobGVuID49IDE2KQorICAgIHsKKyAgICAgICpwKysgPSAnMCc7CisgICAgICBsZW4gPSAxNjsKKyAgICB9CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChsZW4gPT0gMCkKKwl7CisJICAqcCsrID0gJzEnOworCSAgc3ltID0gIiQiOworCSAgbGVuID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgKnArKyA9IGRpZ3NbbGVuXTsKKwl9CisgICAgfQorCisgIHdoaWxlIChsZW4tLSkKKyAgICB7CisgICAgICAqcCsrID0gKnN5bSsrOworICAgIH0KKyAgKmRzdCA9IHA7Cit9CisKK3N0YXRpYyB2b2lkCitvdXQgKGFiZmQsIHR5cGUsIHN0YXJ0LCBlbmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHR5cGU7CisgICAgIGNoYXIgKnN0YXJ0OworICAgICBjaGFyICplbmQ7Cit7CisgIGludCBzdW0gPSAwOworICBjaGFyICpzOworICBjaGFyIGZyb250WzZdOworICBiZmRfc2l6ZV90eXBlIHdybGVuOworCisgIGZyb250WzBdID0gJyUnOworICBUT0hFWCAoZnJvbnQgKyAxLCBlbmQgLSBzdGFydCArIDUpOworICBmcm9udFszXSA9IHR5cGU7CisKKyAgZm9yIChzID0gc3RhcnQ7IHMgPCBlbmQ7IHMrKykKKyAgICB7CisgICAgICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSAqc107CisgICAgfQorCisgIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpIGZyb250WzFdXTsJLyogIGxlbmd0aCAqLworICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFsyXV07CisgIHN1bSArPSBzdW1fYmxvY2tbKHVuc2lnbmVkIGNoYXIpIGZyb250WzNdXTsJLyogdHlwZSAqLworICBUT0hFWCAoZnJvbnQgKyA0LCBzdW0pOworICBpZiAoYmZkX3dyaXRlIChmcm9udCwgMSwgNiwgYWJmZCkgIT0gNikKKyAgICBhYm9ydCAoKTsKKyAgZW5kWzBdID0gJ1xuJzsKKyAgd3JsZW4gPSBlbmQgLSBzdGFydCArIDE7CisgIGlmIChiZmRfd3JpdGUgKHN0YXJ0LCAxLCB3cmxlbiwgYWJmZCkgIT0gd3JsZW4pCisgICAgYWJvcnQgKCk7Cit9CisKK3N0YXRpYyBib29sZWFuCit0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBieXRlc193cml0dGVuOworICBjaGFyIGJ1ZmZlclsxMDBdOworICBhc3ltYm9sICoqcDsKKyAgYXNlY3Rpb24gKnM7CisgIHN0cnVjdCBkYXRhX3N0cnVjdCAqZDsKKworICB0ZWtoZXhfaW5pdCAoKTsKKworICBieXRlc193cml0dGVuID0gMDsKKworICAvKiBBbmQgdGhlIHJhdyBkYXRhICovCisgIGZvciAoZCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhOworICAgICAgIGQgIT0gKHN0cnVjdCBkYXRhX3N0cnVjdCAqKSBOVUxMOworICAgICAgIGQgPSBkLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBsb3c7CisKKyAgICAgIENPTlNUIGludCBzcGFuID0gMzI7CisgICAgICBpbnQgYWRkcjsKKworICAgICAgLyogV3JpdGUgaXQgaW4gYmxvY2tzIG9mIDMyIGJ5dGVzICovCisKKyAgICAgIGZvciAoYWRkciA9IDA7IGFkZHIgPCBDSFVOS19NQVNLICsgMTsgYWRkciArPSBzcGFuKQorCXsKKwkgIGludCBuZWVkID0gMDsKKworCSAgLyogQ2hlY2sgdG8gc2VlIGlmIG5lY2Vzc2FyeSAqLworCSAgZm9yIChsb3cgPSAwOyAhbmVlZCAmJiBsb3cgPCBzcGFuOyBsb3crKykKKwkgICAgeworCSAgICAgIGlmIChkLT5jaHVua19pbml0W2FkZHIgKyBsb3ddKQorCQluZWVkID0gMTsKKwkgICAgfQorCSAgaWYgKG5lZWQpCisJICAgIHsKKwkgICAgICBjaGFyICpkc3QgPSBidWZmZXI7CisKKwkgICAgICB3cml0ZXZhbHVlICgmZHN0LCBhZGRyICsgZC0+dm1hKTsKKwkgICAgICBmb3IgKGxvdyA9IDA7IGxvdyA8IHNwYW47IGxvdysrKQorCQl7CisJCSAgVE9IRVggKGRzdCwgZC0+Y2h1bmtfZGF0YVthZGRyICsgbG93XSk7CisJCSAgZHN0ICs9IDI7CisJCX0KKwkgICAgICBvdXQgKGFiZmQsICc2JywgYnVmZmVyLCBkc3QpOworCSAgICB9CisJfQorICAgIH0KKyAgLyogd3JpdGUgYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgZm9yIHRoZSBzZWN0aW9ucyAqLworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOworCisgICAgICB3cml0ZXN5bSAoJmRzdCwgcy0+bmFtZSk7CisgICAgICAqZHN0KysgPSAnMSc7CisgICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52bWEpOworICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dm1hICsgcy0+X3Jhd19zaXplKTsKKyAgICAgIG91dCAoYWJmZCwgJzMnLCBidWZmZXIsIGRzdCk7CisgICAgfQorCisgIC8qIEFuZCB0aGUgc3ltYm9scyAqLworICBpZiAoYWJmZC0+b3V0c3ltYm9scykKKyAgICB7CisgICAgICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzOyAqcDsgcCsrKQorCXsKKwkgIGludCBzZWN0aW9uX2NvZGUgPSBiZmRfZGVjb2RlX3N5bWNsYXNzICgqcCk7CisKKwkgIGlmIChzZWN0aW9uX2NvZGUgIT0gJz8nKQorCSAgICB7CQkJLyogZG8gbm90IGluY2x1ZGUgZGVidWcgc3ltYm9scyAqLworCSAgICAgIGFzeW1ib2wgKnMgPSAqcDsKKwkgICAgICBjaGFyICpkc3QgPSBidWZmZXI7CisKKwkgICAgICB3cml0ZXN5bSAoJmRzdCwgcy0+c2VjdGlvbi0+bmFtZSk7CisKKwkgICAgICBzd2l0Y2ggKHNlY3Rpb25fY29kZSkKKwkJeworCQljYXNlICdBJzoKKwkJICAqZHN0KysgPSAnMic7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkgICpkc3QrKyA9ICc2JzsKKwkJICBicmVhazsKKwkJY2FzZSAnRCc6CisJCWNhc2UgJ0InOgorCQljYXNlICdPJzoKKwkJICAqZHN0KysgPSAnNCc7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2QnOgorCQljYXNlICdiJzoKKwkJY2FzZSAnbyc6CisJCSAgKmRzdCsrID0gJzgnOworCQkgIGJyZWFrOworCQljYXNlICdUJzoKKwkJICAqZHN0KysgPSAnMyc7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkgICpkc3QrKyA9ICc3JzsKKwkJICBicmVhazsKKwkJY2FzZSAnQyc6CisJCWNhc2UgJ1UnOgorCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPm5hbWUpOworCSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZhbHVlICsgcy0+c2VjdGlvbi0+dm1hKTsKKwkgICAgICBvdXQgKGFiZmQsICczJywgYnVmZmVyLCBkc3QpOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBBbmQgdGhlIHRlcm1pbmF0b3IgKi8KKyAgaWYgKGJmZF93cml0ZSAoIiUwNzgxMDEwXG4iLCAxLCA5LCBhYmZkKSAhPSA5KQorICAgIGFib3J0ICgpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAordGVraGV4X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZXhlYzsKKworeworICByZXR1cm4gMDsKK30KKworc3RhdGljIGFzeW1ib2wgKgordGVraGV4X21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHRla2hleF9zeW1ib2xfdHlwZSAqbmV3ID0KKyAgKHRla2hleF9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCkpOworCisgIGlmICghbmV3KQorICAgIHJldHVybiBOVUxMOworICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKKyAgbmV3LT5wcmV2ID0gKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqKSBOVUxMOworICByZXR1cm4gJihuZXctPnN5bWJvbCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZWtoZXhfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgZmlsZXAsIHN5bWJvbCwgaG93KQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBQVFIgZmlsZXA7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKK3sKKyAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOworCisgIHN3aXRjaCAoaG93KQorICAgIHsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKKyAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKKyAgICAgIHsKKwlDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7CisKKwliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOworCisJZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKKwkJIHNlY3Rpb25fbmFtZSwKKwkJIHN5bWJvbC0+bmFtZSk7CisgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lCXRla2hleF9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKKyNkZWZpbmUgdGVraGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbworI2RlZmluZSB0ZWtoZXhfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vaworCisjZGVmaW5lIHRla2hleF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCisjZGVmaW5lIHRla2hleF9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KKyNkZWZpbmUgdGVraGV4X2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIHRla2hleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCisjZGVmaW5lIHRla2hleF9yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCisjZGVmaW5lIHRla2hleF9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSB0ZWtoZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCisgIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cworI2RlZmluZSB0ZWtoZXhfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgorI2RlZmluZSB0ZWtoZXhfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZGVmaW5lIHRla2hleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKKyNkZWZpbmUgdGVraGV4X2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZGVmaW5lIHRla2hleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KKworI2RlZmluZSB0ZWtoZXhfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworCitjb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWMgPQoreworICAidGVraGV4IiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfdGVraGV4X2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCisgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KKyAgKEVYRUNfUCB8CQkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfU1lNUyB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfUkVMT0MgfCBIQVNfTE9DQUxTIHwKKyAgIFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUworICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KKyAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCisgICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KKyAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KKyAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAorICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCisgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLworCisgIHsKKyAgICBfYmZkX2R1bW15X3RhcmdldCwKKyAgICB0ZWtoZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgIH0sCisgIHsKKyAgICBiZmRfZmFsc2UsCisgICAgdGVraGV4X21rb2JqZWN0LAorICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCisgICAgYmZkX2ZhbHNlLAorICB9LAorICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLworICAgIGJmZF9mYWxzZSwKKyAgICB0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAorICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKKyAgICBiZmRfZmFsc2UsCisgIH0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodGVraGV4KSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHRla2hleCksCisgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh0ZWtoZXgpLAorICBCRkRfSlVNUF9UQUJMRV9MSU5LICh0ZWtoZXgpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgKFBUUikgMAorfTsKZGlmZiAtLWdpdCBhL2JmZC90cmFkLWNvcmUuYyBiL2JmZC90cmFkLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ5MjBiCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3RyYWQtY29yZS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKiBCRkQgYmFjayBlbmQgZm9yIHRyYWRpdGlvbmFsIFVuaXggY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCisgICBDb3B5cmlnaHQgMTk4OCwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLworCisjaWZkZWYgVFJBRF9IRUFERVIKKyNpbmNsdWRlIFRSQURfSEVBREVSCisjZW5kaWYKKworICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAKKyAgICB7CisgICAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOworICAgICAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247CisgICAgICBhc2VjdGlvbiAqcmVnX3NlY3Rpb247CisgICAgICBzdHJ1Y3QgdXNlciB1OworICAgIH07CisKKyNkZWZpbmUgY29yZV91cGFnZShiZmQpICgmKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dSkpCisjZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPmRhdGFfc2VjdGlvbikKKyNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpICgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnN0YWNrX3NlY3Rpb24pCisjZGVmaW5lIGNvcmVfcmVnc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+cmVnX3NlY3Rpb24pCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK2NvbnN0IGJmZF90YXJnZXQgKnRyYWRfdW5peF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2NoYXIgKgkJdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7CitpbnQJCXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Citib29sZWFuCQl0cmFkX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisJCQkgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOworc3RhdGljIHZvaWQJc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEhhbmRsZSA0LjItc3R5bGUgKGFuZCBwZXJoYXBzIGFsc28gc3lzVi1zdHlsZSkgY29yZSBkdW1wIGZpbGUuICAqLworCisvKiBBUkdTVVNFRCAqLworY29uc3QgYmZkX3RhcmdldCAqCit0cmFkX3VuaXhfY29yZV9maWxlX3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKKworeworICBpbnQgdmFsOworICBzdHJ1Y3QgdXNlciB1OworICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOworCisjaWZkZWYgVFJBRF9DT1JFX1VTRVJfT0ZGU0VUCisgIC8qIElmIGRlZmluZWQsIHRoaXMgbWFjcm8gaXMgdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhlIHVzZXIgc3RydWN0LiAgKi8KKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBUUkFEX0NPUkVfVVNFUl9PRkZTRVQsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiAwOworI2VuZGlmCisgICAgCisgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7CisgIGlmICh2YWwgIT0gc2l6ZW9mIHUpCisgICAgeworICAgICAgLyogVG9vIHNtYWxsIHRvIGJlIGEgY29yZSBmaWxlICovCisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBTYW5pdHkgY2hlY2sgcGVyaGFwcz8/PyAqLworICBpZiAodS51X2RzaXplID4gMHgxMDAwMDAwKQkvKiBSZW1lbWJlciwgaXQncyBpbiBwYWdlcy4uLiAqLworICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAodS51X3NzaXplID4gMHgxMDAwMDAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIHNpemUgY2xhaW1lZCBpcyBubyBncmVhdGVyIHRoYW4gdGhlIGZpbGUgc2l6ZS4gICovCisgIHsKKyAgICBGSUxFICpzdHJlYW0gPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChmc3RhdCAoZmlsZW5vIChzdHJlYW0pLCAmc3RhdGJ1ZikgPCAwKQorICAgICAgeworCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisJcmV0dXJuIDA7CisgICAgICB9CisgICAgaWYgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplCisjaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCisJCS0gdS51X3RzaXplCisjZW5kaWYKKwkJKyB1LnVfc3NpemUpID4gc3RhdGJ1Zi5zdF9zaXplKQorICAgICAgeworCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisJcmV0dXJuIDA7CisgICAgICB9CisjaWZuZGVmIFRSQURfQ09SRV9BTExPV19BTllfRVhUUkFfU0laRQorICAgIGlmIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkKKyNpZmRlZiBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECisJLyogU29tZSBzeXN0ZW1zIHdyaXRlIHRoZSBmaWxlIHRvbyBiaWcuICAqLworCSsgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRAorI2VuZGlmCisJPCBzdGF0YnVmLnN0X3NpemUpCisgICAgICB7CisJLyogVGhlIGZpbGUgaXMgdG9vIGJpZy4gIE1heWJlIGl0J3Mgbm90IGEgY29yZSBmaWxlCisJICAgb3Igd2Ugb3RoZXJ3aXNlIGhhdmUgYmFkIHZhbHVlcyBmb3IgdV9kc2l6ZSBhbmQgdV9zc2l6ZSkuICAqLworCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworCXJldHVybiAwOworICAgICAgfQorI2VuZGlmCisgIH0KKworICAvKiBPSywgd2UgYmVsaWV2ZSB5b3UuICBZb3UncmUgYSBjb3JlIGZpbGUgKHN1cmUsIHN1cmUpLiAgKi8KKworICAvKiBBbGxvY2F0ZSBib3RoIHRoZSB1cGFnZSBhbmQgdGhlIHN0cnVjdCBjb3JlX2RhdGEgYXQgb25jZSwgc28KKyAgICAgYSBzaW5nbGUgZnJlZSgpIHdpbGwgZnJlZSB0aGVtIGJvdGguICAqLworICByYXdwdHIgPSAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKikKKwkJYmZkX3ptYWxsb2MgKHNpemVvZiAoc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QpKTsKKyAgaWYgKHJhd3B0ciA9PSBOVUxMKQorICAgIHJldHVybiAwOworICAKKyAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7CisKKyAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KKworICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKKyAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KKworICBjb3JlX3N0YWNrc2VjKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgaWYgKGNvcmVfc3RhY2tzZWMgKGFiZmQpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOworICBpZiAoY29yZV9kYXRhc2VjIChhYmZkKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBjb3JlX3JlZ3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOworICBpZiAoY29yZV9yZWdzZWMgKGFiZmQpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5hbWUgPSAiLnN0YWNrIjsKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmFtZSA9ICIuZGF0YSI7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+bmFtZSA9ICIucmVnIjsKKworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKKworICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSAgTkJQRyAqIHUudV9kc2l6ZQorI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQorICAgIC0gTkJQRyAqIHUudV90c2l6ZQorI2VuZGlmCisgICAgICA7CisgIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOQlBHICogdS51X3NzaXplOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiBVUEFHRVM7IC8qIExhcmdlciB0aGFuIHNpemVvZiBzdHJ1Y3QgdSAqLworCisgIC8qIFdoYXQgYSBoYWNrLi4uIHdlJ2QgbGlrZSB0byBzdGVhbCBpdCBmcm9tIHRoZSBleGVjIGZpbGUsCisgICAgIHNpbmNlIHRoZSB1cGFnZSBkb2VzIG5vdCBzZWVtIHRvIHByb3ZpZGUgaXQuICBGSVhNRS4gICovCisjaWZkZWYgSE9TVF9EQVRBX1NUQVJUX0FERFIKKyAgY29yZV9kYXRhc2VjIChhYmZkKS0+dm1hID0gSE9TVF9EQVRBX1NUQVJUX0FERFI7CisjZWxzZQorICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1RFWFRfU1RBUlRfQUREUiArIChOQlBHICogdS51X3RzaXplKTsKKyNlbmRpZgorCisjaWZkZWYgSE9TVF9TVEFDS19TVEFSVF9BRERSCisgIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX1NUQVJUX0FERFI7CisjZWxzZQorICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+dm1hID0gSE9TVF9TVEFDS19FTkRfQUREUiAtIChOQlBHICogdS51X3NzaXplKTsKKyNlbmRpZgorCisgIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtIHRoZSBlbnRpcmUKKyAgICAgdXBhZ2UgYW5kIHN0YWNrLiAgdS51X2FyMCBwb2ludHMgdG8gd2hlcmUgInJlZ2lzdGVyIDAiIGlzIHN0b3JlZC4KKyAgICAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLCB0aG91Z2guICBPbmUgaXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUKKyAgICAgcmVnaXN0ZXJzIG1pZ2h0IGJlIGF0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIChvciBib3RoKSBkaXNwbGFjZW1lbnRzCisgICAgIGZyb20gKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlIGFkZHJlc3MKKyAgICAgaW4ga2VybmVsIG1lbW9yeSwgYW5kIG9uIG90aGVyIHN5c3RlbXMgaXQgaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgYHN0cnVjdCB1c2VyJy4KKyAgICAgCisgICAgIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVnaXN0ZXJzIGFjdHVhbGx5IGFyZSwKKyAgICAgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4gIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAKKyAgICAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbiB1cCBzbyB0aGF0IGl0cyB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCisgICAgIDAgaXMgYXQgdGhlIHBsYWNlIHBvaW50ZWQgdG8gYnkgdV9hcjAgKGJ5IHNldHRpbmcgdGhlIHZtYSBvZiB0aGUgc3RhcnQKKyAgICAgb2YgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlIHJlZ3MsCisgICAgIHVzaW5nIG1pbm9yIHRyaWNrZXJ5IHRvIGdldCBhcm91bmQgdGhlIG9mZnNldC1vci1hYnNvbHV0ZS1hZGRyIHByb2JsZW0uICovCisgIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMCAtIChiZmRfdm1hKSB1LnVfYXIwOworCisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOQlBHICogVVBBR0VTOworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChOQlBHICogVVBBR0VTKSArIE5CUEcgKiB1LnVfZHNpemUKKyNpZmRlZiBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKKyAgICAtIE5CUEcgKiB1LnVfdHNpemUKKyNlbmRpZgorICAgICAgOworICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAwOyAvKiBSZWdpc3RlciBzZWdtZW50IGlzIHRoZSB1cGFnZSAqLworCisgIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KKyAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7CisgIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKworICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOworICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7CisgIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7CisgIGFiZmQtPnNlY3Rpb25fY291bnQgPSAzOworCisgIHJldHVybiBhYmZkLT54dmVjOworfQorCitjaGFyICoKK3RyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWZuZGVmIE5PX0NPUkVfQ09NTUFORAorICBjaGFyICpjb20gPSBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2NvbW07CisgIGlmICgqY29tKQorICAgIHJldHVybiBjb207CisgIGVsc2UKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKiBBUkdTVVNFRCAqLworaW50Cit0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKK3sKKyNpZmRlZiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCisgIHJldHVybiBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGlnbm9yZV9hYmZkKTsKKyNlbHNlCisgIHJldHVybiAtMTsJCS8qIEZJWE1FLCB3aGVyZSBpcyBpdD8gKi8KKyNlbmRpZgorfQorCisvKiBBUkdTVVNFRCAqLworYm9vbGVhbgordHJhZF91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKKyAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOworeworICByZXR1cm4gdHJ1ZTsJCS8qIEZJWE1FLCBXZSBoYXZlIG5vIHdheSBvZiB0ZWxsaW5nIGF0IHRoaXMgcG9pbnQgKi8KK30KKwwKKy8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KK3N0YXRpYyB2b2lkCitzd2FwX2Fib3J0KCkKK3sKKyAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCit9CisjZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCisjZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCisjZGVmaW5lCU5PX1NJR05FRF9HRVQgXAorICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQorCitjb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWMgPQorICB7CisgICAgInRyYWQtY29yZSIsCisgICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKyAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLworICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAorICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCisgICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KKyAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KKyAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KKyAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KKworICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLworICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCisgICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KKyAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCisgICAgIHRyYWRfdW5peF9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLworICAgIH0sCisgICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKKyAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKKyAgICB9LAorICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAorICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQorICAgIH0sCisgICAgCisgICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHRyYWRfdW5peCksCisgICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAorICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKKyAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCisKKyAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCit9OwpkaWZmIC0tZ2l0IGEvYmZkL3ZheG5ldGJzZC5jIGIvYmZkL3ZheG5ldGJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzdkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvdmF4bmV0YnNkLmMKQEAgLTAsMCArMSwzMyBAQAorLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvVkFYIGEub3V0LWlzaCBiaW5hcmllcy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUJQllURVNfSU5fV09SRAk0CisjdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAorCisjZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJMTAyNAorI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQorCisjZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF92YXgKKyNkZWZpbmUJREVGQVVMVF9NSUQgCU1fVkFYX05FVEJTRAorCisjZGVmaW5lIE1ZKE9QKSBDQVQodmF4bmV0YnNkXyxPUCkKKy8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCisjZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXZheC1uZXRic2QiCisKKyNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC92ZXJzYWRvcy5jIGIvYmZkL3ZlcnNhZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjZDEwOAotLS0gL2Rldi9udWxsCisrKyBiL2JmZC92ZXJzYWRvcy5jCkBAIC0wLDAgKzEsOTIzIEBACisvKiBCRkQgYmFjay1lbmQgZm9yIFZFUlNBZG9zLUUgb2JqZWN0cy4KKyAgIENvcHlyaWdodCAxOTk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQgPHNhY0BjeWdudXMuY29tPi4KKworICAgVmVyc2Fkb3MgaXMgYSBNb3Rvcm9sYSB0cmFkZW1hcmsuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAgIFNVQlNFQ1RJT04KKyAgIFZFUlNBZG9zLUUgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlIGZvcm1hdAorCisgICBERVNDUklQVElPTgorCisgICBUaGlzIG1vZHVsZSBzdXBwb3J0cyByZWFkaW5nIG9mIFZFUlNBZG9zIHJlbG9jYXRlYWJsZQorICAgb2JqZWN0IGZpbGVzLgorCisgICBBIFZFUlNBZG9zIGZpbGUgbG9va3MgbGlrZSBjb250YWlucworCisgICBvIEluZGVudGlmaWNhdGlvbiBSZWNvcmQKKyAgIG8gRXh0ZXJuYWwgU3ltYm9sIERlZmluaXRpb24gUmVjb3JkCisgICBvIE9iamVjdCBUZXh0IFJlY3JvZAorICAgbyBFbmQgUmVjb3JkCisKKworICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworCitzdGF0aWMgYm9vbGVhbiB2ZXJzYWRvc19ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gdmVyc2Fkb3Nfc2NhbiBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnZlcnNhZG9zX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7CisKKworI2RlZmluZSBWSEVBREVSICcxJworI2RlZmluZSBWRVNUREVGICcyJworI2RlZmluZSBWT1RSICczJworI2RlZmluZSBWRU5EICc0JworCisKKyNkZWZpbmUgRVNfQkFTRSAxNwkJLyogZmlyc3Qgc3ltYm9sIGhhcyBlc2RpZCAxNyAqLworCisvKiBQZXIgZmlsZSB0YXJnZXQgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCisKKy8qIG9uZSBmb3IgZWFjaCBzZWN0aW9uICovCitzdHJ1Y3QgZXNkaWQKKyAgeworICAgIGFzZWN0aW9uICpzZWN0aW9uOwkJLyogcHRyIHRvIGJmZCB2ZXJzaW9uICovCisgICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7CS8qIHVzZWQgdG8gYnVpbGQgaW1hZ2UgKi8KKyAgICBpbnQgcGM7CisgICAgaW50IHJlbG9jczsJCQkvKiByZWxvYyBjb3VudCwgdmFsaWQgZW5kIG9mIHBhc3MgMSAqLworICAgIGludCBkb25lcmVsOwkJLyogaGF2ZSByZWxvY3MgYmVlbiB0cmFuc2xhdGVkICovCisgIH07CisKK3R5cGVkZWYgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0CisgIHsKKyAgICBpbnQgZXNfZG9uZTsJCS8qIGNvdW50IG9mIHN5bWJvbCBpbmRleCwgc3RhcnRzIGF0IEVTX0JBU0UgKi8KKyAgICBhc3ltYm9sICpzeW1ib2xzOwkJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2xzICovCisgICAgY2hhciAqc3RyaW5nczsJCS8qIHN0cmluZ3Mgb2YgYWxsIHRoZSBhYm92ZSAqLworICAgIGludCBzdHJpbmdsZW47CQkvKiBsZW4gb2Ygc3RyaW5nIHRhYmxlICh2YWxpZCBlbmQgb2YgcGFzczEpICovCisgICAgaW50IG5zZWNzeW1zOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zICovCisKKyAgICBpbnQgbmRlZnM7CQkJLyogbnVtYmVyIG9mIGV4cG9ydGVkIHN5bWJvbHMgKHRoZXkgZG9udCBnZXQgZXNkaWRzKSAqLworICAgIGludCBucmVmczsJCQkvKiBudW1iZXIgb2YgaW1wb3J0ZWQgc3ltYm9scyAgKHZhbGlkIGVuZCBvZiBwYXNzMSkgKi8KKworICAgIGludCByZWZfaWR4OwkJLyogY3VycmVudCBwcm9jZXNzZWQgdmFsdWUgb2YgdGhlIGFib3ZlICovCisgICAgaW50IGRlZl9pZHg7CisKKyAgICBpbnQgcGFzc18yX2RvbmU7CisKKyAgICBzdHJ1Y3QgZXNkaWQgZVsxNl07CQkvKiBwZXIgc2VjdGlvbiBpbmZvICovCisgICAgaW50IGFsZXJ0OwkJCS8qIHRvIHNlZSBpZiB3ZSdyZSB0cmFtcGxpbmcgKi8KKyAgICBhc3ltYm9sICpyZXN0WzI1NiAtIDE2XTsJLyogcGVyIHN5bWJvbCBpbmZvICovCisKKyAgfQordGRhdGFfdHlwZTsKKworI2RlZmluZSBWREFUQShhYmZkKSAgICAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSkKKyNkZWZpbmUgRURBVEEoYWJmZCwgbikgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEtPmVbbl0pCisjZGVmaW5lIFJEQVRBKGFiZmQsIG4pICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhLT5yZXN0W25dKQorCitzdHJ1Y3QgZXh0X290cgorICB7CisgICAgdW5zaWduZWQgY2hhciBzaXplOworICAgIGNoYXIgdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIG1hcFs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGVzZGlkOworICAgIHVuc2lnbmVkIGNoYXIgZGF0YVsyMDBdOworICB9OworCitzdHJ1Y3QgZXh0X3ZoZWFkZXIKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKKyAgICBjaGFyIHR5cGU7CQkJLyogcmVjb3JkIHR5cGUgKi8KKyAgICBjaGFyIG5hbWVbMTBdOwkJLyogbW9kdWxlIG5hbWUgKi8KKyAgICBjaGFyIHJldjsJCQkvKiBtb2R1bGUgcmV2IG51bWJlciAqLworICAgIGNoYXIgbGFuZzsKKyAgICBjaGFyIHZvbFs0XTsKKyAgICBjaGFyIHVzZXJbMl07CisgICAgY2hhciBjYXRbOF07CisgICAgY2hhciBmbmFtZVs4XTsKKyAgICBjaGFyIGV4dFsyXTsKKyAgICBjaGFyIHRpbWVbM107CisgICAgY2hhciBkYXRlWzNdOworICAgIGNoYXIgcmVzdFsyMTFdOworICB9OworCitzdHJ1Y3QgZXh0X2VzZAorICB7CisgICAgdW5zaWduZWQgY2hhciBzaXplOworICAgIGNoYXIgdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIGVzZF9lbnRyaWVzWzFdOworICB9OworI2RlZmluZSBFU0RfQUJTIAkwCisjZGVmaW5lIEVTRF9DT01NT04gCTEKKyNkZWZpbmUgRVNEX1NURF9SRUxfU0VDIDIKKyNkZWZpbmUgRVNEX1NIUlRfUkVMX1NFQyAzCisjZGVmaW5lIEVTRF9YREVGX0lOX1NFQyA0CisjZGVmaW5lIEVTRF9YUkVGX1NZTSAgICA3CisjZGVmaW5lIEVTRF9YUkVGX1NFQwk2CisjZGVmaW5lIEVTRF9YREVGX0lOX0FCUyA1Cit1bmlvbiBleHRfYW55CisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIHNpemU7CisgICAgc3RydWN0IGV4dF92aGVhZGVyIGhlYWRlcjsKKyAgICBzdHJ1Y3QgZXh0X2VzZCBlc2Q7CisgICAgc3RydWN0IGV4dF9vdHIgb3RyOworICB9OworCisvKiBJbml0aWFsaXplIGJ5IGZpbGxpbmcgaW4gdGhlIGhleCBjb252ZXJzaW9uIGFycmF5LiAqLworCisKKworCisKKy8qIFNldCB1cCB0aGUgdGRhdGEgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgordmVyc2Fkb3NfbWtvYmplY3QgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7CisgICAgICBpZiAodGRhdGEgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhID0gdGRhdGE7CisgICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7CisgICAgICBWREFUQSAoYWJmZCktPmFsZXJ0ID0gMHgxMjM0NTY3ODsKKyAgICB9CisKKyAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTY4aywgMCk7CisgIHJldHVybiB0cnVlOworfQorCisKKy8qIFJlcG9ydCBhIHByb2JsZW0gaW4gYW4gUyByZWNvcmQgZmlsZS4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHNob3VsZAorICAgbm90IGNhbGwgZnByaW50ZiwgYnV0IHdlIHJlYWxseSBkbyBuZWVkIHNvbWUgbWVjaGFuaXNtIGZvciBwcmludGluZworICAgZXJyb3IgbWVzc2FnZXMuICAqLworCisKKworc3RhdGljIGFzeW1ib2wgKgordmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSwgbmFtZSwgdmFsLCBzZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHNudW07CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZF92bWEgdmFsOworICAgICBhc2VjdGlvbiAqc2VjOworeworICBhc3ltYm9sICpuID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzICsgc251bTsKKyAgbi0+bmFtZSA9IG5hbWU7CisgIG4tPnZhbHVlID0gdmFsOworICBuLT5zZWN0aW9uID0gc2VjOworICBuLT50aGVfYmZkID0gYWJmZDsKKyAgbi0+ZmxhZ3MgPSAwOworICByZXR1cm4gbjsKK30KKworCitzdGF0aWMgaW50CitnZXRfcmVjb3JkIChhYmZkLCBwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5pb24gZXh0X2FueSAqcHRyOworeworICBiZmRfcmVhZCAoJnB0ci0+c2l6ZSwgMSwgMSwgYWJmZCk7CisgIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgcHRyICsgMSwgMSwgcHRyLT5zaXplLCBhYmZkKSAhPSBwdHItPnNpemUpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCitpbnQKK2dldF80IChwcCkKKyAgICAgdW5zaWduZWQgY2hhciAqKnBwOworeworICB1bnNpZ25lZCBjaGFyICpwID0gKnBwOworICAqcHAgKz0gNDsKKyAgcmV0dXJuIChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgKHBbM10gPDwgMCk7Cit9CisKK3ZvaWQKK2dldF8xMCAocHAsIG5hbWUpCisgICAgIHVuc2lnbmVkIGNoYXIgKipwcDsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgY2hhciAqcCA9IChjaGFyICopICpwcDsKKyAgaW50IGxlbiA9IDEwOworICAqcHAgKz0gbGVuOworICB3aGlsZSAoKnAgIT0gJyAnCisJICYmIGxlbikKKyAgICB7CisgICAgICAqbmFtZSsrID0gKnArKzsKKyAgICAgIGxlbi0tOworICAgIH0KKyAgKm5hbWUgPSAwOworfQorCitzdGF0aWMgY2hhciAqCituZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpuYW1lOworeworICBjaGFyICpuID0gVkRBVEEgKGFiZmQpLT5zdHJpbmdzOworICBzdHJjcHkgKFZEQVRBIChhYmZkKS0+c3RyaW5ncywgbmFtZSk7CisgIFZEQVRBIChhYmZkKS0+c3RyaW5ncyArPSBzdHJsZW4gKFZEQVRBIChhYmZkKS0+c3RyaW5ncykgKyAxOworICByZXR1cm4gbjsKK30KKworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19lc2QgKGFiZmQsIGVzZCwgcGFzcykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgZXh0X2VzZCAqZXNkOworICAgICBpbnQgcGFzczsKK3sKKyAgLyogUmVhZCB0aHJvdWdoIHRoZSBleHQgZGVmIGZvciB0aGUgZXN0IGVudHJpZXMgKi8KKyAgaW50IHRvZ28gPSBlc2QtPnNpemUgLSAyOworICBiZmRfdm1hIHNpemU7CisgIGJmZF92bWEgc3RhcnQ7CisgIGFzZWN0aW9uICpzZWM7CisgIGNoYXIgbmFtZVsxMV07CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9IGVzZC0+ZXNkX2VudHJpZXM7CisgIHVuc2lnbmVkIGNoYXIgKmVuZCA9IHB0ciArIHRvZ287CisgIHdoaWxlIChwdHIgPCBlbmQpCisgICAgeworICAgICAgaW50IHNjbiA9ICpwdHIgJiAweGY7CisgICAgICBpbnQgdHlwID0gKCpwdHIgPj4gNCkgJiAweGY7CisKKyAgICAgIC8qIERlY2xhcmUgdGhpcyBzZWN0aW9uICovCisgICAgICBzcHJpbnRmIChuYW1lLCAiJWQiLCBzY24pOworICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBzdHJkdXAgKG5hbWUpKTsKKyAgICAgIHNlYy0+dGFyZ2V0X2luZGV4ID0gc2NuOworICAgICAgRURBVEEgKGFiZmQsIHNjbikuc2VjdGlvbiA9IHNlYzsKKyAgICAgIHB0cisrOworICAgICAgc3dpdGNoICh0eXApCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIEVTRF9YUkVGX1NFQzoKKwljYXNlIEVTRF9YUkVGX1NZTToKKwkgIHsKKwkgICAgaW50IHNudW0gPSBWREFUQSAoYWJmZCktPnJlZl9pZHgrKzsKKwkgICAgZ2V0XzEwICgmcHRyLCBuYW1lKTsKKwkgICAgaWYgKHBhc3MgPT0gMSkKKwkgICAgICB7CisJCVZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAobmFtZSkgKyAxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW50IGVzaWR4OworCQlhc3ltYm9sICpzOworCQljaGFyICpuID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpOworCQlzID0gdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSwgbiwgMCwKKwkJCQkJICZiZmRfdW5kX3NlY3Rpb24sIHNjbik7CisJCWVzaWR4ID0gVkRBVEEgKGFiZmQpLT5lc19kb25lKys7CisJCVJEQVRBIChhYmZkLCBlc2lkeCAtIEVTX0JBU0UpID0gczsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKworCisJY2FzZSBFU0RfQUJTOgorCSAgc2l6ZSA9IGdldF80ICgmcHRyKTsKKwkgIHN0YXJ0ID0gZ2V0XzQgKCZwdHIpOworCSAgYnJlYWs7CisJY2FzZSBFU0RfU1REX1JFTF9TRUM6CisJY2FzZSBFU0RfU0hSVF9SRUxfU0VDOgorCSAgeworCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGdldF80ICgmcHRyKTsKKwkgICAgc2VjLT5mbGFncyB8PSBTRUNfQUxMT0M7CisJICB9CisJICBicmVhazsKKwljYXNlIEVTRF9YREVGX0lOX0FCUzoKKwkgIHNlYyA9IChhc2VjdGlvbiAqKSAmIGJmZF9hYnNfc2VjdGlvbjsKKwljYXNlIEVTRF9YREVGX0lOX1NFQzoKKwkgIHsKKwkgICAgaW50IHNudW0gPSBWREFUQSAoYWJmZCktPmRlZl9pZHgrKzsKKwkgICAgbG9uZyB2YWw7CisJICAgIGdldF8xMCAoJnB0ciwgbmFtZSk7CisJICAgIHZhbCA9IGdldF80ICgmcHRyKTsKKwkgICAgaWYgKHBhc3MgPT0gMSkKKwkgICAgICB7CisJCS8qIEp1c3QgcmVtZW1iZXIgdGhlIHN5bWJvbCAqLworCQlWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKG5hbWUpICsgMTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWFzeW1ib2wgKnM7CisJCWNoYXIgKm4gPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgbmFtZSk7CisJCXMgPSB2ZXJzYWRvc19uZXdfc3ltYm9sIChhYmZkLCBzbnVtICsgVkRBVEEgKGFiZmQpLT5ucmVmcywgbiwgdmFsLCBzZWMsIHNjbik7CisJCXMtPmZsYWdzIHw9IEJTRl9HTE9CQUw7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworI2RlZmluZSBSX1JFTFdPUkQgMQorI2RlZmluZSBSX1JFTExPTkcgMgorI2RlZmluZSBSX1JFTFdPUkRfTkVHIDMKKyNkZWZpbmUgUl9SRUxMT05HX05FRyA0CisKK3JlbG9jX2hvd3RvX3R5cGUgdmVyc2Fkb3NfaG93dG9fdGFibGVbXSA9Cit7CisgIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwKKwkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKKwkgIit2MTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCisgIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwKKwkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKKwkgIit2MzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCisKKyAgSE9XVE8gKFJfUkVMV09SRF9ORUcsIDAsIC0xLCAxNiwgZmFsc2UsCisJIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCisJICItdjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAorICBIT1dUTyAoUl9SRUxMT05HX05FRywgMCwgLTIsIDMyLCBmYWxzZSwKKwkgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwKKwkgIi12MzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCit9OworCisKK3N0YXRpYyBpbnQKK2dldF9vZmZzZXQgKGxlbiwgcHRyKQorICAgICBpbnQgbGVuOworICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Cit7CisgIGludCB2YWwgPSAwOworICBpZiAobGVuKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgdmFsID0gKnB0cisrOworICAgICAgaWYgKHZhbCAmIDB4ODApCisJdmFsIHw9IH4weGZmOworICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKQorCXZhbCA9ICh2YWwgPDwgOCkgfCAqcHRyKys7CisgICAgfQorCisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX290ciAoYWJmZCwgb3RyLCBwYXNzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBleHRfb3RyICpvdHI7CisgICAgIGludCBwYXNzOworeworICB1bnNpZ25lZCBsb25nIHNoaWZ0OworICB1bnNpZ25lZCBjaGFyICpzcmNwID0gb3RyLT5kYXRhOworICB1bnNpZ25lZCBjaGFyICplbmRwID0gKHVuc2lnbmVkIGNoYXIgKikgb3RyICsgb3RyLT5zaXplOworICB1bnNpZ25lZCBpbnQgYml0cyA9IChvdHItPm1hcFswXSA8PCAyNCkKKyAgfCAob3RyLT5tYXBbMV0gPDwgMTYpCisgIHwgKG90ci0+bWFwWzJdIDw8IDgpCisgIHwgKG90ci0+bWFwWzNdIDw8IDApOworCisgIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKTsKKyAgdW5zaWduZWQgY2hhciAqY29udGVudHMgPSBlc2RpZC0+Y29udGVudHM7CisgIGludCBuZWVkX2NvbnRlbnRzID0gMDsKKyAgdW5zaWduZWQgaW50IGRzdF9pZHggPSBlc2RpZC0+cGM7CisKKyAgZm9yIChzaGlmdCA9ICgxIDw8IDMxKTsgc2hpZnQgJiYgc3JjcCA8IGVuZHA7IHNoaWZ0ID4+PSAxKQorICAgIHsKKyAgICAgIGlmIChiaXRzICYgc2hpZnQpCisJeworCSAgaW50IGZsYWcgPSAqc3JjcCsrOworCSAgaW50IGVzZGlkcyA9IChmbGFnID4+IDUpICYgMHg3OworCSAgaW50IHNpemVpbndvcmRzID0gKChmbGFnID4+IDMpICYgMSkgPyAyIDogMTsKKwkgIGludCBvZmZzZXRsZW4gPSBmbGFnICYgMHg3OworCSAgaW50IGo7CisKKworCSAgaWYgKGVzZGlkcyA9PSAwKQorCSAgICB7CisJICAgICAgLyogQSB6ZXJvIGVzZGlkIG1lYW5zIHRoZSBuZXcgcGMgaXMgdGhlIG9mZnNldCBnaXZlbiAqLworCSAgICAgIGRzdF9pZHggKz0gZ2V0X29mZnNldCAob2Zmc2V0bGVuLCBzcmNwKTsKKwkgICAgICBzcmNwICs9IG9mZnNldGxlbjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaW50IHZhbCA9IGdldF9vZmZzZXQgKG9mZnNldGxlbiwgc3JjcCArIGVzZGlkcyk7CisJICAgICAgaWYgKHBhc3MgPT0gMSkKKwkJbmVlZF9jb250ZW50cyA9IDE7CisJICAgICAgZWxzZQorCQlmb3IgKGogPSAwOyBqIDwgc2l6ZWlud29yZHMgKiAyOyBqKyspCisJCSAgeworCQkgICAgY29udGVudHNbZHN0X2lkeCArIChzaXplaW53b3JkcyAqIDIpIC0gaiAtIDFdID0gdmFsOworCQkgICAgdmFsID4+PSA4OworCQkgIH0KKworCSAgICAgIGZvciAoaiA9IDA7IGogPCBlc2RpZHM7IGorKykKKwkJeworCQkgIGludCBlc2RpZCA9ICpzcmNwKys7CisKKwkJICBpZiAoZXNkaWQpCisJCSAgICB7CisJCSAgICAgIGludCBybiA9IEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkucmVsb2NzKys7CisJCSAgICAgIGlmIChwYXNzID09IDEpCisJCQl7CisJCQkgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgZGF0YSwgCisJCQkgICAgIGp1c3QgcmVtZW1iZXIgdGhhdCB3ZSBuZWVkIGEgcmVsb2MgKi8KKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBhcmVsZW50ICpuID0KKwkJCSAgRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5zZWN0aW9uLT5yZWxvY2F0aW9uICsgcm47CisJCQkgIG4tPmFkZHJlc3MgPSBkc3RfaWR4OworCisJCQkgIG4tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIGVzZGlkOworCQkJICBuLT5hZGRlbmQgPSAwOworCQkJICBuLT5ob3d0byA9IHZlcnNhZG9zX2hvd3RvX3RhYmxlICsgKChqICYgMSkgKiAyKSArIChzaXplaW53b3JkcyAtIDEpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgc3JjcCArPSBvZmZzZXRsZW47CisJICAgICAgZHN0X2lkeCArPSBzaXplaW53b3JkcyAqIDI7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgbmVlZF9jb250ZW50cyA9IDE7CisJICBpZiAoZHN0X2lkeCA8IGVzZGlkLT5zZWN0aW9uLT5fcmF3X3NpemUpCisJICAgIGlmIChwYXNzID09IDIpCisJICAgICAgeworCQkvKiBhYnNvbHV0ZSBjb2RlLCBjb21lcyBpbiAxNiBiaXQgbHVtcHMgKi8KKwkJY29udGVudHNbZHN0X2lkeF0gPSBzcmNwWzBdOworCQljb250ZW50c1tkc3RfaWR4ICsgMV0gPSBzcmNwWzFdOworCSAgICAgIH0KKwkgIGRzdF9pZHggKz0gMjsKKwkgIHNyY3AgKz0gMjsKKwl9CisgICAgfQorICBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnBjID0gZHN0X2lkeDsKKworICBpZiAoIWNvbnRlbnRzICYmIG5lZWRfY29udGVudHMpCisgICAgZXNkaWQtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBlc2RpZC0+c2VjdGlvbi0+X3Jhd19zaXplKTsKKworCit9CisKK3N0YXRpYyBib29sZWFuCit2ZXJzYWRvc19zY2FuIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBsb29wID0gMTsKKyAgaW50IGk7CisgIGludCBqOworICBpbnQgbnNlY3MgPSAwOworCisgIFZEQVRBIChhYmZkKS0+bnJlZnMgPSAwOworICBWREFUQSAoYWJmZCktPm5kZWZzID0gMDsKKyAgVkRBVEEgKGFiZmQpLT5yZWZfaWR4ID0gMDsKKyAgVkRBVEEgKGFiZmQpLT5kZWZfaWR4ID0gMDsKKworICB3aGlsZSAobG9vcCkKKyAgICB7CisgICAgICB1bmlvbiBleHRfYW55IGFueTsKKyAgICAgIGlmICghZ2V0X3JlY29yZCAoYWJmZCwgJmFueSkpCisJcmV0dXJuIHRydWU7CisgICAgICBzd2l0Y2ggKGFueS5oZWFkZXIudHlwZSkKKwl7CisJY2FzZSBWSEVBREVSOgorCSAgYnJlYWs7CisJY2FzZSBWRU5EOgorCSAgbG9vcCA9IDA7CisJICBicmVhazsKKwljYXNlIFZFU1RERUY6CisJICBwcm9jZXNzX2VzZCAoYWJmZCwgJmFueS5lc2QsIDEpOworCSAgYnJlYWs7CisJY2FzZSBWT1RSOgorCSAgcHJvY2Vzc19vdHIgKGFiZmQsICZhbnkub3RyLCAxKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogTm93IGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVsb2NzIGFuZCBzZWN0aW9ucyAqLworCisgIFZEQVRBIChhYmZkKS0+bnJlZnMgPSBWREFUQSAoYWJmZCktPnJlZl9pZHg7CisgIFZEQVRBIChhYmZkKS0+bmRlZnMgPSBWREFUQSAoYWJmZCktPmRlZl9pZHg7CisgIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7CisgIFZEQVRBIChhYmZkKS0+ZGVmX2lkeCA9IDA7CisKKyAgYWJmZC0+c3ltY291bnQgPSBWREFUQSAoYWJmZCktPm5yZWZzICsgVkRBVEEgKGFiZmQpLT5uZGVmczsKKworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBpKTsKKyAgICAgIGlmIChlc2RpZC0+c2VjdGlvbikKKwl7CisJICBlc2RpZC0+c2VjdGlvbi0+cmVsb2NhdGlvbgorCSAgICA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50KSAqIGVzZGlkLT5yZWxvY3MpOworCisJICBlc2RpZC0+cGMgPSAwOworCisJICBpZiAoZXNkaWQtPmNvbnRlbnRzKQorCSAgICBlc2RpZC0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEOworCisJICBlc2RpZC0+c2VjdGlvbi0+cmVsb2NfY291bnQgPSBlc2RpZC0+cmVsb2NzOworCSAgaWYgKGVzZGlkLT5yZWxvY3MpCisJICAgIGVzZGlkLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfUkVMT0M7CisKKwkgIGVzZGlkLT5yZWxvY3MgPSAwOworCisJICAvKiBBZGQgYW4gZW50cnkgaW50byB0aGUgc3ltYm9sIHRhYmxlIGZvciBpdCAqLworCSAgbnNlY3MrKzsKKwkgIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuICs9IHN0cmxlbiAoZXNkaWQtPnNlY3Rpb24tPm5hbWUpICsgMTsKKwl9CisgICAgfQorCisgIGFiZmQtPnN5bWNvdW50ICs9IG5zZWNzOworCisgIFZEQVRBIChhYmZkKS0+c3ltYm9scyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwKKwkJCQkgICAgICAgc2l6ZW9mIChhc3ltYm9sKSAqIChhYmZkLT5zeW1jb3VudCkpOworCisgIFZEQVRBIChhYmZkKS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4pOworCisgIGlmICgoVkRBVEEgKGFiZmQpLT5zeW1ib2xzID09IE5VTEwgJiYgYWJmZC0+c3ltY291bnQgPiAwKQorICAgICAgfHwgKFZEQVRBIChhYmZkKS0+c3RyaW5ncyA9PSBOVUxMICYmIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuID4gMCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIEFjdHVhbGx5IGZpbGwgaW4gdGhlIHNlY3Rpb24gc3ltYm9scywKKyAgICAgd2Ugc3RpY2sgdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAqLworCisgIGZvciAoaiA9IFZEQVRBIChhYmZkKS0+bnJlZnMgKyBWREFUQSAoYWJmZCktPm5kZWZzLCBpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgaSk7CisgICAgICBhc2VjdGlvbiAqc2VjID0gZXNkaWQtPnNlY3Rpb247CisgICAgICBpZiAoc2VjKQorCXsKKwkgIGFzeW1ib2wgKnMgPSBWREFUQSAoYWJmZCktPnN5bWJvbHMgKyBqOworCSAgcy0+bmFtZSA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBzZWMtPm5hbWUpOworCSAgcy0+c2VjdGlvbiA9IHNlYzsKKwkgIHMtPmZsYWdzID0gQlNGX0xPQ0FMOworCSAgcy0+dmFsdWUgPSAwOworCSAgcy0+dGhlX2JmZCA9IGFiZmQ7CisJICBqKys7CisJfQorICAgIH0KKyAgaWYgKGFiZmQtPnN5bWNvdW50KQorICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOworCisgIC8qIFNldCB0aGlzIHRvIG5zZWNzIC0gc2luY2Ugd2UndmUgYWxyZWFkeSBwbGFudGVkIHRoZSBzZWN0aW9uCisgICAgIHN5bWJvbHMgKi8KKyAgVkRBVEEgKGFiZmQpLT5uc2Vjc3ltcyA9IG5zZWNzOworCisgIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKworCisvKiBDaGVjayB3aGV0aGVyIGFuIGV4aXN0aW5nIGZpbGUgaXMgYSB2ZXJzYWRvcyAgZmlsZS4gICovCisKK3N0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKK3ZlcnNhZG9zX29iamVjdF9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBleHRfdmhlYWRlciBleHQ7CisgIHVuc2lnbmVkIGNoYXIgbGVuOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmIChiZmRfcmVhZCAoJmV4dC50eXBlLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCisJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgLyogV2UgZ3Vlc3MgdGhhdCB0aGUgbGFuZ3VhZ2UgZmllbGQgd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbiAxMC4KKyAgICAgSW4gc2FtcGxlIGZpbGVzLCBpdCBpcyBhbHdheXMgZWl0aGVyIDAgb3IgMS4gIENoZWNraW5nIGZvciB0aGlzCisgICAgIHByZXZlbnRzIGNvbmZ1c2lvbiB3aXRoIEludGVsIEhleCBmaWxlcy4gICovCisgIGlmIChleHQudHlwZSAhPSBWSEVBREVSCisgICAgICB8fCBleHQubGFuZyA+IDEwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIE9LLCBsb29rcyBsaWtlIGEgcmVjb3JkLCBidWlsZCB0aGUgdGRhdGEgYW5kIHJlYWQgaW4uICAqLworCisgIGlmICghdmVyc2Fkb3NfbWtvYmplY3QgKGFiZmQpCisgICAgICB8fCAhdmVyc2Fkb3Nfc2NhbiAoYWJmZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGFiZmQtPnh2ZWM7Cit9CisKKworc3RhdGljIGJvb2xlYW4KK3ZlcnNhZG9zX3Bhc3NfMiAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICB1bmlvbiBleHRfYW55IGFueTsKKworICBpZiAoVkRBVEEgKGFiZmQpLT5wYXNzXzJfZG9uZSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQorICAgIHJldHVybiAwOworCisgIFZEQVRBIChhYmZkKS0+ZXNfZG9uZSA9IEVTX0JBU0U7CisKKworICAvKiByZWFkIHJlY29yZHMgdGlsbCB3ZSBnZXQgdG8gd2hlcmUgd2Ugd2FudCB0byBiZSAqLworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGdldF9yZWNvcmQgKGFiZmQsICZhbnkpOworICAgICAgc3dpdGNoIChhbnkuaGVhZGVyLnR5cGUpCisJeworCWNhc2UgVkVORDoKKwkgIFZEQVRBIChhYmZkKS0+cGFzc18yX2RvbmUgPSAxOworCSAgcmV0dXJuIDE7CisJY2FzZSBWRVNUREVGOgorCSAgcHJvY2Vzc19lc2QgKGFiZmQsICZhbnkuZXNkLCAyKTsKKwkgIGJyZWFrOworCWNhc2UgVk9UUjoKKwkgIHByb2Nlc3Nfb3RyIChhYmZkLCAmYW55Lm90ciwgMik7CisJICBicmVhazsKKwl9CisgICAgfQorfQorCitzdGF0aWMgYm9vbGVhbgordmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBQVFIgbG9jYXRpb247CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKK3sKKyAgaWYgKCF2ZXJzYWRvc19wYXNzXzIgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBtZW1jcHkgKGxvY2F0aW9uLAorCSAgRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuY29udGVudHMgKyBvZmZzZXQsCisJICAoc2l6ZV90KSBjb3VudCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgdmVyc2Fkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKKyAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworCitzdGF0aWMgYm9vbGVhbgordmVyc2Fkb3Nfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGJ5dGVzX3RvX2RvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgYnl0ZXNfdG9fZG87Cit7CisgIHJldHVybiBmYWxzZTsKK30KKworCisvKkFSR1NVU0VEICovCitzdGF0aWMgaW50Cit2ZXJzYWRvc19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIGV4ZWM7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgYXN5bWJvbCAqCit2ZXJzYWRvc19tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKKyAgaWYgKG5ldykKKyAgICBuZXctPnRoZV9iZmQgPSBhYmZkOworICByZXR1cm4gbmV3OworfQorCisvKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gICovCisKK3N0YXRpYyBsb25nCit2ZXJzYWRvc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKK30KKworLyogUmV0dXJuIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgbG9uZwordmVyc2Fkb3NfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKiphbG9jYXRpb247Cit7CisgIHVuc2lnbmVkIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworICB1bnNpZ25lZCBpbnQgaTsKKyAgYXN5bWJvbCAqczsKKworICB2ZXJzYWRvc19wYXNzXzIgKGFiZmQpOworCisgIGZvciAoaSA9IDAsIHMgPSBWREFUQSAoYWJmZCktPnN5bWJvbHM7CisgICAgICAgaSA8IHN5bWNvdW50OworICAgICAgIHMrKywgaSsrKQorICAgIHsKKyAgICAgICphbG9jYXRpb24rKyA9IHM7CisgICAgfQorCisgICphbG9jYXRpb24gPSBOVUxMOworCisgIHJldHVybiBzeW1jb3VudDsKK30KKworLypBUkdTVVNFRCAqLwordm9pZAordmVyc2Fkb3NfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Cit9CisKKy8qQVJHU1VTRUQgKi8KK3ZvaWQKK3ZlcnNhZG9zX3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgUFRSIGFmaWxlOworICAgICBhc3ltYm9sICpzeW1ib2w7CisgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Cit7CisgIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhZmlsZTsKKyAgc3dpdGNoIChob3cpCisgICAgeworICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgorICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOworICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKKwkgICAgICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAorCSAgICAgICBzeW1ib2wtPm5hbWUpOworCisgICAgfQorfQorCitsb25nCit2ZXJzYWRvc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7Cit7CisgIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Cit9CisKKworbG9uZwordmVyc2Fkb3NfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBhcmVsZW50ICoqcmVscHRyOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyAgdW5zaWduZWQgaW50IGNvdW50OworICBhcmVsZW50ICpzcmM7CisKKyAgdmVyc2Fkb3NfcGFzc18yIChhYmZkKTsKKyAgc3JjID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKKyAgaWYgKCFFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5kb25lcmVsKQorICAgIHsKKyAgICAgIEVEQVRBIChhYmZkLCBzZWN0aW9uLT50YXJnZXRfaW5kZXgpLmRvbmVyZWwgPSAxOworICAgICAgLyogdHJhbnNsYXRlIGZyb20gaW5kZXhlcyB0byBzeW1wdHIgcHRycyAqLworICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCisJeworCSAgaW50IGVzZGlkID0gKGludCkgc3JjW2NvdW50XS5zeW1fcHRyX3B0cjsKKworCSAgaWYgKGVzZGlkID09IDApCisJICAgIHsKKwkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uLnN5bWJvbF9wdHJfcHRyOworCSAgICB9CisJICBlbHNlIGlmIChlc2RpZCA8IEVTX0JBU0UpCS8qIFNlY3Rpb24gcmVsYXRpdmUgdGhpbmcgKi8KKwkgICAgeworCSAgICAgIHN0cnVjdCBlc2RpZCAqZSA9ICZFREFUQSAoYWJmZCwgZXNkaWQgLSAxKTsKKwkgICAgICBpZiAoIXNlY3Rpb24pCisJCXsKKwkJIC8qKiByZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHNlY3Rpb24gd2hpY2ggd2FzCisJCSAgIG5ldmVyIGRlY2xhcmVkICEgKi8KKwkJfQorCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBlLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBlc2RpZCAtIEVTX0JBU0U7CisJICAgIH0KKworCX0KKyAgICB9CisKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCisgICAgeworICAgICAgKnJlbHB0cisrID0gc3JjKys7CisgICAgfQorICAqcmVscHRyID0gMDsKKyAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OworfQorCisjZGVmaW5lCXZlcnNhZG9zX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAorI2RlZmluZSB2ZXJzYWRvc19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KKyNkZWZpbmUgdmVyc2Fkb3NfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vaworCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKKyNkZWZpbmUgdmVyc2Fkb3NfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCisjZGVmaW5lIHZlcnNhZG9zX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKKyNkZWZpbmUgdmVyc2Fkb3NfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scworI2RlZmluZSB2ZXJzYWRvc19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKKworI2RlZmluZSB2ZXJzYWRvc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKKworI2RlZmluZSB2ZXJzYWRvc19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKKworI2RlZmluZSB2ZXJzYWRvc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKKyAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KKyNkZWZpbmUgdmVyc2Fkb3NfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCisjZGVmaW5lIHZlcnNhZG9zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgorCitjb25zdCBiZmRfdGFyZ2V0IHZlcnNhZG9zX3ZlYyA9Cit7CisgICJ2ZXJzYWRvcyIsCQkJLyogbmFtZSAqLworICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCisgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKyAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCisgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCisgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKKyAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKKyAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUworICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCQkvKiBzZWN0aW9uIGZsYWdzICovCisgIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLworICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCisgIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLworICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCisgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKKyAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCisgIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKKyAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAorICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KKworICB7CisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgICAgdmVyc2Fkb3Nfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgICAgX2JmZF9kdW1teV90YXJnZXQsCisgIH0sCisgIHsKKyAgICBiZmRfZmFsc2UsCisgICAgdmVyc2Fkb3NfbWtvYmplY3QsCisgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKKyAgICBiZmRfZmFsc2UsCisgIH0sCisgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICAgYmZkX2ZhbHNlLAorICAgIGJmZF9mYWxzZSwKKyAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCisgICAgYmZkX2ZhbHNlLAorICB9LAorCisgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZlcnNhZG9zKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCisgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZlcnNhZG9zKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTICh2ZXJzYWRvcyksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh2ZXJzYWRvcyksCisgIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZlcnNhZG9zKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAorCisgIChQVFIpIDAKK307CmRpZmYgLS1naXQgYS9iZmQvdm1zLWdzZC5jIGIvYmZkL3Ztcy1nc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTUyNDYyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3Ztcy1nc2QuYwpAQCAtMCwwICsxLDkyMCBAQAorLyogdm1zLWdzZC5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCisgICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBJbmMuCisKKyAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKKyAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQorCisgICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNpbmNsdWRlICJ2bXMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHR5cGljYWwgc2VjdGlvbnMgZm9yIHZheCBvYmplY3QgZmlsZXMgICovCisKKyNkZWZpbmUgVkFYX0NPREVfTkFNRQkJIiRDT0RFIgorI2RlZmluZSBWQVhfREFUQV9OQU1FCQkiJERBVEEiCisjZGVmaW5lIFZBWF9BRERSRVNTX0RBVEFfTkFNRQkiJEFERFJFU1NfREFUQSIKKworLyogdHlwaWNhbCBzZWN0aW9ucyBmb3IgZXZheCBvYmplY3QgZmlsZXMgICovCisKKyNkZWZpbmUgRVZBWF9BQlNfTkFNRQkJIiRBQlMkIgorI2RlZmluZSBFVkFYX0NPREVfTkFNRQkJIiRDT0RFJCIKKyNkZWZpbmUgRVZBWF9MSU5LX05BTUUJCSIkTElOSyQiCisjZGVmaW5lIEVWQVhfREFUQV9OQU1FCQkiJERBVEEkIgorI2RlZmluZSBFVkFYX0JTU19OQU1FCQkiJEJTUyQiCisjZGVmaW5lIEVWQVhfUkVBRE9OTFlBRERSX05BTUUJIiRSRUFET05MWV9BRERSJCIKKyNkZWZpbmUgRVZBWF9SRUFET05MWV9OQU1FCSIkUkVBRE9OTFkkIgorI2RlZmluZSBFVkFYX0xJVEVSQUxfTkFNRQkiJExJVEVSQUwkIgorI2RlZmluZSBFVkFYX0NPTU1PTl9OQU1FCSIkQ09NTU9OJCIKKyNkZWZpbmUgRVZBWF9MT0NBTF9OQU1FCQkiJExPQ0FMJCIKKworc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgeworICBjaGFyICpuYW1lOwkJCS8qIG5hbWUgb2Ygc2VjdGlvbiAqLworICBpbnQgdmZsYWdzX2Fsd2F5czsKKyAgZmxhZ3dvcmQgZmxhZ3NfYWx3YXlzOwkvKiBmbGFncyB3ZSBzZXQgYWx3YXlzICovCisgIGludCB2ZmxhZ3NfaGFzc2l6ZTsKKyAgZmxhZ3dvcmQgZmxhZ3NfaGFzc2l6ZTsJLyogZmxhZ3Mgd2Ugc2V0IGlmIHRoZSBzZWN0aW9uIGhhcyBhIHNpemUgPiAwICovCit9OworCisvKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBWQVgpIGNvbXBhdGlibGUgICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCB2YXhfc2VjdGlvbl9mbGFnc1tdID0geworICB7IFZBWF9DT0RFX05BTUUsCisJKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAorCShTRUNfQ09ERSksCisJKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fU0hSfEdQU19TX01fRVhFfEdQU19TX01fUkQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAorICB7IFZBWF9EQVRBX05BTUUsCisJKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAorCShTRUNfREFUQSksCisJKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAorICB7IFZBWF9BRERSRVNTX0RBVEFfTkFNRSwKKwkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRCksCisJKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCisJKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKKyAgeyBOVUxMLAorCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKKwkoU0VDX0RBVEEpLAorCShHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKSwKKwkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfQorfTsKKworCisvKiBUaGVzZSBmbGFncyBhcmUgZGVjY3J0bC92YXhjcnRsIChvcGVuVk1TIDYuMiBBbHBoYSkgY29tcGF0aWJsZSAgKi8KKworc3RhdGljIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IGV2YXhfc2VjdGlvbl9mbGFnc1tdID0geworICB7IEVWQVhfQUJTX05BTUUsCisJKEVHUFNfU19WX1NIUiksCisJKFNFQ19EQVRBKSwKKwkoRUdQU19TX1ZfU0hSKSwKKwkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKKyAgeyBFVkFYX0NPREVfTkFNRSwKKwkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfRVhFKSwKKwkoU0VDX0NPREUpLAorCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9FWEUpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAorICB7IEVWQVhfTElURVJBTF9OQU1FLAorCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRHxFR1BTX1NfVl9OT01PRCksCisJKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCisJKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEKSwKKwkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCisgIHsgRVZBWF9MSU5LX05BTUUsCisJKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCisJKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCisJKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCisJKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAorICB7IEVWQVhfREFUQV9OQU1FLAorCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKKwkoU0VDX0RBVEEpLAorCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUKSwKKwkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKKyAgeyBFVkFYX0JTU19OQU1FLAorCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKKwkoU0VDX05PX0ZMQUdTKSwKKwkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRCksCisJKFNFQ19JTl9NRU1PUll8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCisgIHsgRVZBWF9SRUFET05MWUFERFJfTkFNRSwKKwkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCisJKFNFQ19EQVRBfFNFQ19SRUFET05MWSksCisJKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKKyAgeyBFVkFYX1JFQURPTkxZX05BTUUsCisJKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEfEVHUFNfU19WX05PTU9EKSwKKwkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKKwkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKKyAgeyBFVkFYX0xPQ0FMX05BTUUsCisJKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAorCShTRUNfREFUQSksCisJKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAorICB7IE5VTEwsCisJKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAorCShTRUNfREFUQSksCisJKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAorCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9Cit9OworCisvKiBSZXRyaWV2ZSBiZmQgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLworCitzdGF0aWMgZmxhZ3dvcmQKK3Ztc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHNlY3Rpb25fZmxhZ3MsIG5hbWUsIHNpemUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgKnNlY3Rpb25fZmxhZ3M7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBzaXplOworeworICBpbnQgaSA9IDA7CisKKyAgd2hpbGUgKHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoUFJJVihpc192YXgpPworCSAgICBzdHJjYXNlY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpOgorCSAgICBzdHJjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSkpID09IDApCisJeworCSAgaWYgKHNpemUgPiAwKQorCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19oYXNzaXplOworCSAgZWxzZQorCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS5mbGFnc19hbHdheXM7CisJfQorICAgICAgaSsrOworICAgIH0KKyAgaWYgKHNpemUgPiAwKQorICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2hhc3NpemU7CisgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2Fsd2F5czsKK30KKworCisvKiBSZXRyaWV2ZSB2bXMgc2VjdGlvbiBmbGFncyBieSBuYW1lIGFuZCBzaXplICAqLworCitzdGF0aWMgZmxhZ3dvcmQKK3Ztc19lc2VjZmxhZ19ieV9uYW1lIChzZWN0aW9uX2ZsYWdzLCBuYW1lLCBzaXplKQorICAgICBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCAqc2VjdGlvbl9mbGFnczsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IHNpemU7Cit7CisgIGludCBpID0gMDsKKworICB3aGlsZSAoc2VjdGlvbl9mbGFnc1tpXS5uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKSA9PSAwKQorCXsKKwkgIGlmIChzaXplID4gMCkKKwkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2hhc3NpemU7CisJICBlbHNlCisJICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19hbHdheXM7CisJfQorICAgICAgaSsrOworICAgIH0KKyAgaWYgKHNpemUgPiAwKQorICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19oYXNzaXplOworICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfYWx3YXlzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBWTVNfREVCVUcKKy8qIGRlYnVnICovCisKK3N0cnVjdCBmbGFnZGVzY3N0cnVjdCB7IGNoYXIgKm5hbWU7IGZsYWd3b3JkIHZhbHVlOyB9OworCisvKiBDb252ZXJ0IGZsYWcgdG8gcHJpbnRhYmxlIHN0cmluZyAgKi8KKworc3RhdGljIGNoYXIgKgorZmxhZzJzdHIoZmxhZ2Rlc2MsIGZsYWdzKQorICAgICBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgKmZsYWdkZXNjOworICAgICBmbGFnd29yZCBmbGFnczsKK3sKKworICBzdGF0aWMgY2hhciByZXNbNjRdOworICBpbnQgbmV4dCA9IDA7CisKKyAgcmVzWzBdID0gMDsKKyAgd2hpbGUgKGZsYWdkZXNjLT5uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKChmbGFncyAmIGZsYWdkZXNjLT52YWx1ZSkgIT0gMCkKKwl7CisJICBpZiAobmV4dCkKKwkgICAgc3RyY2F0KHJlcywgIiwiKTsKKwkgIGVsc2UKKwkgICAgbmV4dCA9IDE7CisJICBzdHJjYXQgKHJlcywgZmxhZ2Rlc2MtPm5hbWUpOworCX0KKyAgICAgIGZsYWdkZXNjKys7CisgICAgfQorICByZXR1cm4gcmVzOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogaW5wdXQgcm91dGluZXMgKi8KKworLyogUHJvY2VzcyBHU0QvRUdTRCByZWNvcmQKKyAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLworCitpbnQKK19iZmRfdm1zX3NsdXJwX2dzZCAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgc3RhdGljIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCBncHNmbGFnZGVzY1tdID0KKyAgeworICAgIHsgIlBJQyIsIDB4MDAwMSB9LAorICAgIHsgIkxJQiIsIDB4MDAwMiB9LAorICAgIHsgIk9WUiIsIDB4MDAwNCB9LAorICAgIHsgIlJFTCIsIDB4MDAwOCB9LAorICAgIHsgIkdCTCIsIDB4MDAxMCB9LAorICAgIHsgIlNIUiIsIDB4MDAyMCB9LAorICAgIHsgIkVYRSIsIDB4MDA0MCB9LAorICAgIHsgIlJEIiwgIDB4MDA4MCB9LAorICAgIHsgIldSVCIsIDB4MDEwMCB9LAorICAgIHsgIlZFQyIsIDB4MDIwMCB9LAorICAgIHsgIk5PTU9EIiwgMHgwNDAwIH0sCisgICAgeyAiQ09NIiwgMHgwODAwIH0sCisgICAgeyBOVUxMLCAwIH0KKyAgfTsKKworICBzdGF0aWMgc3RydWN0IGZsYWdkZXNjc3RydWN0IGdzeWZsYWdkZXNjW10gPQorICB7CisgICAgeyAiV0VBSyIsIDB4MDAwMSB9LAorICAgIHsgIkRFRiIsICAweDAwMDIgfSwKKyAgICB7ICJVTkkiLCAgMHgwMDA0IH0sCisgICAgeyAiUkVMIiwgIDB4MDAwOCB9LAorICAgIHsgIkNPTU0iLCAweDAwMTAgfSwKKyAgICB7ICJWRUNFUCIsIDB4MDAyMCB9LAorICAgIHsgIk5PUk0iLCAweDAwNDAgfSwKKyAgICB7IE5VTEwsIDAgfQorICB9OworI2VuZGlmCisKKyAgaW50IGdzZF90eXBlLCBnc2Rfc2l6ZTsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CisgIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOworICBjaGFyICpuYW1lOworICBhc3ltYm9sICpzeW1ib2w7CisgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OworICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBhbGlnbl9hZGRyOworICBzdGF0aWMgaW50IHBzZWN0X2lkeCA9IDA7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgyLCAiR1NEL0VHU0QgKCVkLyV4KVxuIiwgb2JqdHlwZSwgb2JqdHlwZSk7CisjZW5kaWYKKworICBzd2l0Y2ggKG9ianR5cGUpCisgICAgeworICAgICAgY2FzZSBFT0JKX1NfQ19FR1NEOgorIAlQUklWKHZtc19yZWMpICs9IDg7CS8qIHNraXAgdHlwZSwgc2l6ZSwgbF90ZW1wICovCisJUFJJVihyZWNfc2l6ZSkgLT0gODsKKwlicmVhazsKKyAgICAgIGNhc2UgT0JKX1NfQ19HU0Q6CisJUFJJVih2bXNfcmVjKSArPSAxOworCVBSSVYocmVjX3NpemUpIC09IDE7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXJldHVybiAtMTsKKyAgICB9CisKKyAgLyogY2FsY3VsYXRlIGJhc2UgYWRkcmVzcyBmb3IgZWFjaCBzZWN0aW9uICAqLworICBiYXNlX2FkZHIgPSAwTDsKKworICBhYmZkLT5zeW1jb3VudCA9IDA7CisKKyAgd2hpbGUgKFBSSVYocmVjX3NpemUpID4gMCkKKyAgICB7CisgICAgICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKKworICAgICAgaWYgKG9ianR5cGUgPT0gT0JKX1NfQ19HU0QpCisJeworCSAgZ3NkX3R5cGUgPSAqdm1zX3JlYzsKKwl9CisgICAgICBlbHNlCisJeworCSAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIHZtc19yZWMsICZnc2RfdHlwZSwgJmdzZF9zaXplKTsKKwkgIGdzZF90eXBlICs9IEVWQVhfT0ZGU0VUOworCX0KKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDMsICJnc2RfdHlwZSAlZFxuIiwgZ3NkX3R5cGUpOworI2VuZGlmCisKKyAgICAgIHN3aXRjaCAoZ3NkX3R5cGUpCisJeworCSAgY2FzZSBHU0RfU19DX1BTQzoKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24KKwkgICAgICAgKi8KKworCSAgICAgIGFzZWN0aW9uICpvbGRfc2VjdGlvbiA9IDA7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg0LCAiR1NEX1NfQ19QU0NcbiIpOworI2VuZGlmCisJICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzbid0IGEgYmZkIHNlY3Rpb24uICAqLworCisJICAgICAgaWYgKFBSSVYoaXNfdmF4KSAmJiAocHNlY3RfaWR4IDwgKGFiZmQtPnNlY3Rpb25fY291bnQtMSkpKQorCQl7CisJCSAgLyogY2hlY2sgZm9yIHRlbXBvcmFyeSBzZWN0aW9uIGZyb20gVElSIHJlY29yZC4gICovCisKKwkJICBpZiAocHNlY3RfaWR4IDwgUFJJVihzZWN0aW9uX2NvdW50KSkKKwkJICAgIG9sZF9zZWN0aW9uID0gUFJJVihzZWN0aW9ucylbcHNlY3RfaWR4XTsKKwkJICBlbHNlCisJCSAgICBvbGRfc2VjdGlvbiA9IDA7CisJCX0KKworCSAgICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgOCk7CisJICAgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOworCSAgICAgIGlmICghc2VjdGlvbikKKwkJeworCQkgIGZwcmludGYgKHN0ZGVyciwgImJmZF9tYWtlX3NlY3Rpb24gKCVzKSBmYWlsZWRcbiIsIG5hbWUpOworCQkgIHJldHVybiAtMTsKKwkJfQorCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKKwkgICAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBiZmRfZ2V0bDMyKHZtc19yZWMgKyA0KTsJLyogYWxsb2NhdGlvbiAqLworCSAgICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIHZheF9zZWN0aW9uX2ZsYWdzLCBuYW1lLCBzZWN0aW9uLT5fcmF3X3NpemUpOworCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCisJCW5ld19mbGFncyB8PSBTRUNfUkVMT0M7CisJICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fT1ZSKQorCQluZXdfZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKKwkgICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKKwkJeworCQkgIGZwcmludGYgKHN0ZGVyciwgImJmZF9zZXRfc2VjdGlvbl9mbGFncyAoJXMsICV4KSBmYWlsZWRcbiIsIG5hbWUsIG5ld19mbGFncyk7CisJCSAgcmV0dXJuIC0xOworCQl9CisJICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gdm1zX3JlY1sxXTsKKwkgICAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKKwkgICAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCisJCWJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7CisJICAgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOworCSAgICAgIGJhc2VfYWRkciArPSBzZWN0aW9uLT5fcmF3X3NpemU7CisKKwkgICAgICAvKiBnbG9iYWwgc2VjdGlvbiBpcyBjb21tb24gc3ltYm9sICAqLworCisJICAgICAgaWYgKG9sZF9mbGFncyAmIEdQU19TX01fR0JMKQorCQl7CisJCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOworCQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCisJCSAgICB7CisJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCQkgICAgICByZXR1cm4gLTE7CisJCSAgICB9CisJCSAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKKworCQkgIHN5bWJvbC0+dmFsdWUgPSAwOworCQkgIHN5bWJvbC0+c2VjdGlvbiA9IHNlY3Rpb247CisJCSAgc3ltYm9sLT5mbGFncyA9IChCU0ZfR0xPQkFMfEJTRl9TRUNUSU9OX1NZTXxCU0ZfT0xEX0NPTU1PTik7CisJCX0KKworCSAgICAgIC8qIGNvcHkgc2F2ZWQgY29udGVudHMgaWYgb2xkX3NlY3Rpb24gc2V0ICAqLworCisJICAgICAgaWYgKG9sZF9zZWN0aW9uICE9IDApCisJCXsKKwkJICBzZWN0aW9uLT5jb250ZW50cyA9IG9sZF9zZWN0aW9uLT5jb250ZW50czsKKwkJICBpZiAoc2VjdGlvbi0+X3Jhd19zaXplIDwgb2xkX3NlY3Rpb24tPl9yYXdfc2l6ZSkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU2l6ZSBtaXNtYXRjaCBzZWN0aW9uICVzPSVkLCAlcz0lZFxuIiwgb2xkX3NlY3Rpb24tPm5hbWUsIG9sZF9zZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPm5hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisJCSAgICAgIHJldHVybiAtMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPiBvbGRfc2VjdGlvbi0+X3Jhd19zaXplKQorCQkgICAgeworCQkgICAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQorCQkJCSAgICBiZmRfcmVhbGxvYyAob2xkX3NlY3Rpb24tPmNvbnRlbnRzLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKKwkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCisJCQl7CisJCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCQkJICByZXR1cm4gLTE7CisJCSAgICAgICAgfQorCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7CisJCSAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCQkgICAgICByZXR1cm4gLTE7CisJCSAgICB9CisJCSAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdClzZWN0aW9uLT5fcmF3X3NpemUpOworCQl9CisJICAgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOworI2lmIFZNU19ERUJVRworCSAgICAgIHZtc19kZWJ1ZyAoNCwgImdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAorCQkJIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChncHNmbGFnZGVzYywgb2xkX2ZsYWdzKSk7CisJICAgICAgdm1zX2RlYnVnICg0LCAiJWQgYnl0ZXMgYXQgMHglMDhseCAobWVtICVwKVxuIiwKKwkJCSBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOworI2VuZGlmCisKKwkgICAgICBnc2Rfc2l6ZSA9IHZtc19yZWNbOF0gKyA5OworCisJICAgICAgcHNlY3RfaWR4Kys7CisJICAgIH0KKwkgIGJyZWFrOworCisJICBjYXNlIEdTRF9TX0NfRVBNOgorCSAgY2FzZSBHU0RfU19DX0VQTVc6CisjaWYgVk1TX0RFQlVHCisJCXZtc19kZWJ1Zyg0LCAiZ3NkIGVwbVxuIik7CisjZW5kaWYKKwkgIC8qRkFMTFRIUlUqLworCSAgY2FzZSBHU0RfU19DX1NZTToKKwkgIGNhc2UgR1NEX1NfQ19TWU1XOgorCSAgICB7CisJICAgICAgaW50IG5hbWVfb2Zmc2V0LCB2YWx1ZV9vZmZzZXQ7CisKKwkgICAgICAvKgorCSAgICAgICAqIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkKKwkgICAgICAgKi8KKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDQsICJHU0RfU19DX1NZTShXKVxuIik7CisjZW5kaWYKKwkgICAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMik7CisJICAgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOworCisJICAgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fV0VBSykKKwkJbmV3X2ZsYWdzIHw9IEJTRl9XRUFLOworCisJICAgICAgc3dpdGNoIChnc2RfdHlwZSkKKwkJeworCQkgIGNhc2UgR1NEX1NfQ19FUE06CisJCSAgICBuYW1lX29mZnNldCA9IDExOworCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKKwkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisJCSAgICBicmVhazsKKwkJICBjYXNlIEdTRF9TX0NfRVBNVzoKKwkJICAgIG5hbWVfb2Zmc2V0ID0gMTI7CisJCSAgICB2YWx1ZV9vZmZzZXQgPSA2OworCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgR1NEX1NfQ19TWU06CisJCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCisJCSAgICAgIG5hbWVfb2Zmc2V0ID0gOTsKKwkJICAgIGVsc2UKKwkJICAgICAgbmFtZV9vZmZzZXQgPSA0OworCQkgICAgdmFsdWVfb2Zmc2V0ID0gNTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgR1NEX1NfQ19TWU1XOgorCQkgICAgaWYgKG9sZF9mbGFncyAmIEdTWV9TX01fREVGKQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLworCQkgICAgICBuYW1lX29mZnNldCA9IDEwOworCQkgICAgZWxzZQorCQkgICAgICBuYW1lX29mZnNldCA9IDU7CisJCSAgICB2YWx1ZV9vZmZzZXQgPSA2OworCQkgICAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIHNhdmUgc3ltYm9sIGluIHZtc19zeW1ib2xfdGFibGUgKi8KKworCSAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLAorCQkJX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIG5hbWVfb2Zmc2V0KSk7CisJICAgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKKwkJeworCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCQkgIHJldHVybiAtMTsKKwkJfQorCSAgICAgIHN5bWJvbCA9IGVudHJ5LT5zeW1ib2w7CisKKwkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCisJCXsKKwkJICBpbnQgcHNlY3Q7CisKKwkJICBzeW1ib2wtPnZhbHVlID0gYmZkX2dldGwzMiAodm1zX3JlYyt2YWx1ZV9vZmZzZXQpOworCQkgIGlmICgoZ3NkX3R5cGUgPT0gR1NEX1NfQ19TWU1XKQorCQkgICAgICB8fCAoZ3NkX3R5cGUgPT0gR1NEX1NfQ19FUE1XKSkKKwkJICAgIHBzZWN0ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIHZhbHVlX29mZnNldCAtIDIpOworCQkgIGVsc2UKKwkJICAgIHBzZWN0ID0gdm1zX3JlY1t2YWx1ZV9vZmZzZXQtMV07CisKKwkJICBzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKilwc2VjdDsKKyNpZiBWTVNfREVCVUcKKwkJICB2bXNfZGVidWcoNCwgImdzZCBzeW0gZGVmICMlZCAoJXMsICVkIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKKwkJCQlzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOworI2VuZGlmCisJCX0KKwkgICAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KKwkJeworCQkgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKKyNpZiBWTVNfREVCVUcKKwkJICB2bXNfZGVidWcgKDQsICJnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlcyBbJXBdLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCisJCQkJc3ltYm9sLT5uYW1lLCBzeW1ib2wtPnNlY3Rpb24tPm5hbWUsIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0ciAoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOworI2VuZGlmCisJCX0KKworCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1tuYW1lX29mZnNldF0gKyBuYW1lX29mZnNldCArIDE7CisJICAgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKKwkgICAgfQorCisJICBicmVhazsKKworCSAgY2FzZSBHU0RfU19DX1BSTzoKKwkgIGNhc2UgR1NEX1NfQ19QUk9XOgorI2lmIFZNU19ERUJVRworCQl2bXNfZGVidWcoNCwgImdzZCBwcm9cbiIpOworI2VuZGlmCisJICBicmVhazsKKwkgIGNhc2UgR1NEX1NfQ19JREM6CisjaWYgVk1TX0RFQlVHCisJCXZtc19kZWJ1Zyg0LCAiZ3NkIGlkY1xuIik7CisjZW5kaWYKKwkgIGJyZWFrOworCSAgY2FzZSBHU0RfU19DX0VOVjoKKyNpZiBWTVNfREVCVUcKKwkJdm1zX2RlYnVnKDQsICJnc2QgZW52XG4iKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJICBjYXNlIEdTRF9TX0NfTFNZOgorI2lmIFZNU19ERUJVRworCQl2bXNfZGVidWcoNCwgImdzZCBsc3lcbiIpOworI2VuZGlmCisJICBicmVhazsKKwkgIGNhc2UgR1NEX1NfQ19MRVBNOgorI2lmIFZNU19ERUJVRworCQl2bXNfZGVidWcoNCwgImdzZCBsZXBtXG4iKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJICBjYXNlIEdTRF9TX0NfTFBSTzoKKyNpZiBWTVNfREVCVUcKKwkJdm1zX2RlYnVnKDQsICJnc2QgbHByb1xuIik7CisjZW5kaWYKKwkgIGJyZWFrOworCSAgY2FzZSBHU0RfU19DX1NQU0M6CisjaWYgVk1TX0RFQlVHCisJCXZtc19kZWJ1Zyg0LCAiZ3NkIHNwc2NcbiIpOworI2VuZGlmCisJICBicmVhazsKKwkgIGNhc2UgR1NEX1NfQ19TWU1WOgorI2lmIFZNU19ERUJVRworCQl2bXNfZGVidWcoNCwgImdzZCBzeW12XG4iKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJICBjYXNlIEdTRF9TX0NfRVBNVjoKKyNpZiBWTVNfREVCVUcKKwkJdm1zX2RlYnVnKDQsICJnc2QgZXBtdlxuIik7CisjZW5kaWYKKwkgIGJyZWFrOworCSAgY2FzZSBHU0RfU19DX1BST1Y6CisjaWYgVk1TX0RFQlVHCisJCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb3ZcbiIpOworI2VuZGlmCisJICBicmVhazsKKworCWNhc2UgRUdTRF9TX0NfUFNDICsgRVZBWF9PRkZTRVQ6CisJICB7CisJICAgIC8qIHByb2dyYW0gc2VjdGlvbiBkZWZpbml0aW9uICAqLworCisJICAgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzEyKTsKKwkgICAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOworCSAgICBpZiAoIXNlY3Rpb24pCisJICAgICAgcmV0dXJuIC0xOworCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7CisJICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsJLyogYWxsb2NhdGlvbiAqLworCSAgICBuZXdfZmxhZ3MgPSB2bXNfc2VjZmxhZ19ieV9uYW1lIChhYmZkLCBldmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIChpbnQpIHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisJICAgIGlmIChvbGRfZmxhZ3MgJiBFR1BTX1NfVl9SRUwpCisJICAgICAgbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKKwkgICAgaWYgKCFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24sIG5ld19mbGFncykpCisJICAgICAgcmV0dXJuIC0xOworCSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB2bXNfcmVjWzRdOworCSAgICBhbGlnbl9hZGRyID0gKDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKKwkgICAgaWYgKChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSAhPSAwKQorCSAgICAgIGJhc2VfYWRkciArPSAoYWxpZ25fYWRkciAtIChiYXNlX2FkZHIgJSBhbGlnbl9hZGRyKSk7CisJICAgIHNlY3Rpb24tPnZtYSA9IChiZmRfdm1hKWJhc2VfYWRkcjsKKwkgICAgYmFzZV9hZGRyICs9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKKwkgICAgc2VjdGlvbi0+Y29udGVudHMgPSAoKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkgYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKSk7CisJICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQorCSAgICAgIHJldHVybiAtMTsKKwkgICAgbWVtc2V0IChzZWN0aW9uLT5jb250ZW50cywgMCwgKHNpemVfdCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKKwkgICAgc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOworI2lmIFZNU19ERUJVRworCSAgICB2bXNfZGVidWcoNCwgImVnc2QgcHNjICVkICglcywgZmxhZ3MgJTA0eD0lcykgIiwKKwkJICAgICAgIHNlY3Rpb24tPmluZGV4LCBuYW1lLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKKwkgICAgdm1zX2RlYnVnKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAorCQkgICAgICAgc2VjdGlvbi0+X3Jhd19zaXplLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPmNvbnRlbnRzKTsKKyNlbmRpZgorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIEVHU0RfU19DX1NZTSArIEVWQVhfT0ZGU0VUOgorCSAgeworCSAgICAvKiBzeW1ib2wgc3BlY2lmaWNhdGlvbiAoZGVmaW5pdGlvbiBvciByZWZlcmVuY2UpICAqLworCisJICAgIHN5bWJvbCA9IF9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKKwkgICAgaWYgKHN5bWJvbCA9PSAwKQorCSAgICAgIHJldHVybiAtMTsKKworCSAgICBvbGRfZmxhZ3MgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNik7CisJICAgIG5ld19mbGFncyA9IEJTRl9OT19GTEFHUzsKKworCSAgICBpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfV0VBSykKKwkgICAgICBuZXdfZmxhZ3MgfD0gQlNGX1dFQUs7CisKKwkgICAgaWYgKHZtc19yZWNbNl0gJiBFR1NZX1NfVl9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCisJICAgICAgeworCQlzeW1ib2wtPm5hbWUgPQorCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMzIpOworCQlpZiAob2xkX2ZsYWdzICYgRUdTWV9TX1ZfTk9STSkKKwkJICB7ICAgICAgICAgLyogcHJvYyBkZWYgKi8KKwkJICAgIG5ld19mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisJCSAgfQorCQlzeW1ib2wtPnZhbHVlID0gYmZkX2dldGw2NCAodm1zX3JlYys4KTsKKwkJc3ltYm9sLT5zZWN0aW9uID0gKGFzZWN0aW9uICopKCh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyICh2bXNfcmVjKzI4KSk7CisjaWYgVk1TX0RFQlVHCisJCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gZGVmICMlZCAoJXMsICVkLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCisJCQkgICBzeW1ib2wtPm5hbWUsIChpbnQpc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyKGdzeWZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKKyNlbmRpZgorCSAgICAgIH0KKwkgICAgZWxzZQkvKiBzeW1ib2wgcmVmZXJlbmNlICovCisJICAgICAgeworCSAgICAgICAgc3ltYm9sLT5uYW1lID0KKwkJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjKzgpOworI2lmIFZNU19ERUJVRworCQl2bXNfZGVidWcoNCwgImVnc2Qgc3ltIHJlZiAjJWQgKCVzLCAlMDR4PSVzKVxuIiwgYWJmZC0+c3ltY291bnQsCisJCQkgICBzeW1ib2wtPm5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOworI2VuZGlmCisJICAgICAgICBzeW1ib2wtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSk7CisJICAgICAgfQorCisJICAgIHN5bWJvbC0+ZmxhZ3MgPSBuZXdfZmxhZ3M7CisKKwkgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAgKi8KKworCSAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgc3ltYm9sLT5uYW1lLCB0cnVlLCBmYWxzZSk7CisJICAgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCisJICAgICAgeworCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKKwkJcmV0dXJuIC0xOworCSAgICAgIH0KKwkgICAgaWYgKGVudHJ5LT5zeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKQorCSAgICAgIHsJCQkJCS8qIEZJWE1FID8sIERFQyBDIGdlbmVyYXRlcyB0aGlzICovCisjaWYgVk1TX0RFQlVHCisJCXZtc19kZWJ1Zyg0LCAiRUdTRF9TX0NfU1lNOiBkdXBsaWNhdGUgXCIlc1wiXG4iLCBzeW1ib2wtPm5hbWUpOworI2VuZGlmCisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQllbnRyeS0+c3ltYm9sID0gc3ltYm9sOworCQlQUklWKGdzZF9zeW1fY291bnQpKys7CisJCWFiZmQtPnN5bWNvdW50Kys7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIEVHU0RfU19DX0lEQyArIEVWQVhfT0ZGU0VUOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiKSwgZ3NkX3R5cGUpOworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICByZXR1cm4gLTE7CisKKwl9IC8qIHN3aXRjaCAqLworCisgICAgICBQUklWKHJlY19zaXplKSAtPSBnc2Rfc2l6ZTsKKyAgICAgIFBSSVYodm1zX3JlYykgKz0gZ3NkX3NpemU7CisKKyAgICB9IC8qIHdoaWxlIChyZWNzaXplID4gMCkgKi8KKworICBpZiAoYWJmZC0+c3ltY291bnQgPiAwKQorICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOworCisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIG91dHB1dCByb3V0aW5lcyAqLworCisvKiBXcml0ZSBzZWN0aW9uIGFuZCBzeW1ib2wgZGlyZWN0b3J5IG9mIGJmZCBhYmZkICAqLworCitpbnQKK19iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIGFzeW1ib2wgKnN5bWJvbDsKKyAgaW50IHN5bW51bTsKKyAgaW50IGxhc3RfaW5kZXggPSAtMTsKKyAgY2hhciBkdW1teV9uYW1lWzEwXTsKKyAgY2hhciAqc25hbWU7CisgIGZsYWd3b3JkIG5ld19mbGFncywgb2xkX2ZsYWdzOworICBjaGFyICpucHRyLCAqdXB0cjsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZ3NkICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKKyNlbmRpZgorCisgIC8qIG91dHB1dCBzZWN0aW9ucyAgKi8KKworICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMywgIiVkIHNlY3Rpb25zIGZvdW5kXG4iLCBhYmZkLT5zZWN0aW9uX2NvdW50KTsKKyNlbmRpZgorCisgIC8qIGVnc2QgaXMgcXVhZHdvcmQgYWxpZ25lZCAgKi8KKworICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA4KTsKKworICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKKyAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOworICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLworCisgIHdoaWxlIChzZWN0aW9uICE9IDApCisgICAgeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDMsICJTZWN0aW9uICMlZCAlcywgJWQgYnl0ZXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7CisjZW5kaWYKKworCS8qIDEzIGJ5dGVzIGVnc2QsIG1heCAzMSBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA0NCBieXRlcyAqLworICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgNjQpIDwgMCkKKwl7CisJICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKKwkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOworCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7CisJICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CisJICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLworCX0KKworCS8qIENyZWF0ZSBkdW1teSBzZWN0aW9ucyB0byBrZWVwIGNvbnNlY3V0aXZlIGluZGljZXMgKi8KKworICAgICAgd2hpbGUgKHNlY3Rpb24tPmluZGV4IC0gbGFzdF9pbmRleCA+IDEpCisJeworI2lmIFZNU19ERUJVRworCSAgdm1zX2RlYnVnICgzLCAiaW5kZXggJWQsIGxhc3QgJWRcbiIsIHNlY3Rpb24tPmluZGV4LCBsYXN0X2luZGV4KTsKKyNlbmRpZgorCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19QU0MsIC0xKTsKKwkgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CisJICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOworCSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOworCSAgc3ByaW50ZiAoZHVtbXlfbmFtZSwgIi5EVU1NWSUwMmQiLCBsYXN0X2luZGV4KTsKKwkgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBkdW1teV9uYW1lKTsKKwkgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisJICBsYXN0X2luZGV4Kys7CisJfQorCisgICAgICAvKiBEb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjY2VzYXJ5IGZvciB0aGUgbGlua2VyIGJ1dCBmb3Igbm93IGl0IGtlZXBzCisJIHZtc19zbHVycF9nc2QgaGFwcHkgICovCisKKyAgICAgIHNuYW1lID0gKGNoYXIgKilzZWN0aW9uLT5uYW1lOworICAgICAgaWYgKCpzbmFtZSA9PSAnLicpCisJeworCSAgc25hbWUrKzsKKwkgIGlmICgoKnNuYW1lID09ICd0JykgJiYgKHN0cmNtcCAoc25hbWUsICJ0ZXh0IikgPT0gMCkpCisJICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9DT0RFX05BTUU6RVZBWF9DT0RFX05BTUU7CisJICBlbHNlIGlmICgoKnNuYW1lID09ICdkJykgJiYgKHN0cmNtcCAoc25hbWUsICJkYXRhIikgPT0gMCkpCisJICAgIHNuYW1lID0gUFJJVihpc192YXgpP1ZBWF9EQVRBX05BTUU6RVZBWF9EQVRBX05BTUU7CisJICBlbHNlIGlmICgoKnNuYW1lID09ICdiJykgJiYgKHN0cmNtcCAoc25hbWUsICJic3MiKSA9PSAwKSkKKwkgICAgc25hbWUgPSBFVkFYX0JTU19OQU1FOworCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGluayIpID09IDApKQorCSAgICBzbmFtZSA9IEVWQVhfTElOS19OQU1FOworCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAncicpICYmIChzdHJjbXAgKHNuYW1lLCAicmRhdGEiKSA9PSAwKSkKKwkgICAgc25hbWUgPSBFVkFYX1JFQURPTkxZX05BTUU7CisJICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsaXRlcmFsIikgPT0gMCkpCisJICAgIHNuYW1lID0gRVZBWF9MSVRFUkFMX05BTUU7CisJICBlbHNlIGlmICgoKnNuYW1lID09ICdjJykgJiYgKHN0cmNtcCAoc25hbWUsICJjb21tIikgPT0gMCkpCisJICAgIHNuYW1lID0gRVZBWF9DT01NT05fTkFNRTsKKwkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxjb21tIikgPT0gMCkpCisJICAgIHNuYW1lID0gRVZBWF9MT0NBTF9OQU1FOworCX0KKyAgICAgIGVsc2UKKwlzbmFtZSA9IF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc25hbWUsIEVPQkpfU19DX1NFQ1NJWik7CisKKyAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRUdTRF9TX0NfUFNDLCAtMSk7CisgICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciAmIDB4ZmYpOworICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCisJeworCSAgbmV3X2ZsYWdzID0gKEVHUFNfU19WX09WUnxFR1BTX1NfVl9SRUx8RUdQU19TX1ZfR0JMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVHxFR1BTX1NfVl9OT01PRHxFR1BTX1NfVl9DT00pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBuZXdfZmxhZ3MgPSB2bXNfZXNlY2ZsYWdfYnlfbmFtZSAoZXZheF9zZWN0aW9uX2ZsYWdzLCBzbmFtZSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKKwl9CisgICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7CisgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc2VjdGlvbi0+X3Jhd19zaXplKTsKKyAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBzbmFtZSk7CisgICAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCisgICAgICBsYXN0X2luZGV4ID0gc2VjdGlvbi0+aW5kZXg7CisgICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKKyAgICB9CisKKyAgLyogb3V0cHV0IHN5bWJvbHMgICovCisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgzLCAiJWQgc3ltYm9scyBmb3VuZFxuIiwgYWJmZC0+c3ltY291bnQpOworI2VuZGlmCisKKyAgYmZkX3NldF9zdGFydF9hZGRyZXNzIChhYmZkLCAoYmZkX3ZtYSktMSk7CisKKyAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCisgICAgeworCisgICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07CisgICAgICBpZiAoKihzeW1ib2wtPm5hbWUpID09ICdfJykKKwl7CisJICBpZiAoc3RyY21wIChzeW1ib2wtPm5hbWUsICJfX21haW4iKSA9PSAwKQorCSAgICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKXN5bWJvbC0+dmFsdWUpOworCX0KKyAgICAgIG9sZF9mbGFncyA9IHN5bWJvbC0+ZmxhZ3M7CisKKyAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRklMRSkKKwljb250aW51ZTsKKworICAgICAgaWYgKCgob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKSA9PSAwKQkvKiBub3QgeGRlZiAqLworCSAgJiYgKCFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpKQkvKiBhbmQgbm90IHhyZWYgKi8KKwljb250aW51ZTsJCQkJCS8qIGRvbnQgb3V0cHV0ICovCisKKyAgICAgIC8qIDEzIGJ5dGVzIGVnc2QsIG1heCA2NCBjaGFycyBuYW1lIC0+IHNob3VsZCBiZSA3NyBieXRlcyAgKi8KKworICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgODApIDwgMCkKKwl7CisJICBfYmZkX3Ztc19vdXRwdXRfcG9wIChhYmZkKTsKKwkgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOworCSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FR1NELCAtMSk7CisJICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CisJICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CQkvKiBwcmVwYXJlIG91dHB1dCBmb3Igc3VicmVjb3JkcyAqLworCX0KKworICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19TWU0sIC0xKTsKKworICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsJCQkvKiBkYXRhIHR5cGUsIGFsaWdubWVudCAqLworCisgICAgICBuZXdfZmxhZ3MgPSAwOworCisgICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX1dFQUspCisJbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1dFQUs7CisgICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQkJLyogLmNvbW0gICovCisJbmV3X2ZsYWdzIHw9IChFR1NZX1NfVl9XRUFLfEVHU1lfU19WX0NPTU0pOworCisgICAgICBpZiAob2xkX2ZsYWdzICYgQlNGX0ZVTkNUSU9OKQorCXsKKwkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9OT1JNOworCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKKwl9CisgICAgICBpZiAob2xkX2ZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX1dFQUspKQorCXsKKwkgIG5ld19mbGFncyB8PSBFR1NZX1NfVl9ERUY7CisJICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKKwkgICAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX1JFTDsKKwl9CisgICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIG5ld19mbGFncyk7CisKKyAgICAgIGlmIChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpCQkvKiBzeW1ib2wgZGVmaW5pdGlvbiAqLworCXsKKwkgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCisJICAgIHsKKwkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7CisJICAgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCisJCQkJICAgICAoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSktPnZhbHVlKTsKKwkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKKwkJCQkgICAgICgoKGFzeW1ib2wgKikoc3ltYm9sLT51ZGF0YS5wKSkKKwkJCQkgICAgICAtPnNlY3Rpb24tPmluZGV4KSk7CisJICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgc3ltYm9sLT52YWx1ZSk7CS8qIExfVkFMVUUgKi8KKwkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgMCk7CQkJLyogTF9DT0RFX0FERFJFU1MgKi8KKwkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CQkJLyogTF9DQV9QU0lORFggKi8KKwkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc3ltYm9sLT5zZWN0aW9uLT5pbmRleCk7LyogTF9QU0lORFggKi8KKwkgICAgfQorCX0KKyAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bWJvbC0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7CisKKyAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisKKyAgICB9CisKKyAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgOCk7CisgIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOworICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZmQvdm1zLWhkci5jIGIvYmZkL3Ztcy1oZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQyMGFhCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3Ztcy1oZHIuYwpAQCAtMCwwICsxLDQ2MSBAQAorLyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAorICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgSERSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKKyAgIEVNSCByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCisgICBhbmQKKyAgIEVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCisgICBFRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKKworICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgInZtcy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAorICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCisKK2ludAorX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBvYmp0eXBlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBvYmp0eXBlOworeworICB1bnNpZ25lZCBjaGFyICpwdHI7CisgIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CisgIGludCBzdWJ0eXBlOworCisgIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7CisjZW5kaWYKKworICBzd2l0Y2ggKG9ianR5cGUpCisgICAgeworICAgICAgY2FzZSBPQkpfU19DX0hEUjoKKwlzdWJ0eXBlID0gdm1zX3JlY1sxXTsKKwlicmVhazsKKyAgICAgIGNhc2UgRU9CSl9TX0NfRU1IOgorCXN1YnR5cGUgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNCkgKyBFVkFYX09GRlNFVDsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJc3VidHlwZSA9IC0xOworICAgIH0KKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOworI2VuZGlmCisKKyAgc3dpdGNoIChzdWJ0eXBlKQorICAgIHsKKworICAgICAgY2FzZSBNSERfU19DX01IRDoKKwkvKgorCSAqIG1vZHVsZSBoZWFkZXIKKwkgKi8KKwlQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOworCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAzKTsKKwlQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDUpOworCXB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7CisJUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CisJcHRyICs9ICpwdHIgKyAxOworCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CisKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1IRF9TX0NfTE5NOgorCS8qCisJICoKKwkgKi8KKwlQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1IRF9TX0NfU1JDOgorCS8qCisJICoKKwkgKi8KKwlQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1IRF9TX0NfVFRMOgorCS8qCisJICoKKwkgKi8KKwlQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1IRF9TX0NfQ1BSOgorCS8qCisJICoKKwkgKi8KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1IRF9TX0NfTVRDOgorCS8qCisJICoKKwkgKi8KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE1IRF9TX0NfR1RYOgorCS8qCisJICoKKwkgKi8KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6CisJLyoKKwkgKiBtb2R1bGUgaGVhZGVyCisJICovCisJUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKKwlQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKKwlQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CisJUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKKwlQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0KKwkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyAyMCk7CisJcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOworCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPQorCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKKwlwdHIgKz0gKnB0ciArIDE7CisJUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9CisJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CisKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVNSF9TX0NfTE5NICsgRVZBWF9PRkZTRVQ6CisJLyoKKwkgKgorCSAqLworCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9CisJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVNSF9TX0NfU1JDICsgRVZBWF9PRkZTRVQ6CisJLyoKKwkgKgorCSAqLworCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9CisJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CisJLyoKKwkgKgorCSAqLworCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9CisJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEVNSF9TX0NfQ1BSICsgRVZBWF9PRkZTRVQ6CisJLyoKKwkgKgorCSAqLworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRU1IX1NfQ19NVEMgKyBFVkFYX09GRlNFVDoKKwkvKgorCSAqCisJICovCisgICAgICBicmVhazsKKworICAgICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgorCS8qCisJICoKKwkgKi8KKyAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIC0xOworCisgICAgfSAvKiBzd2l0Y2ggKi8KKworICByZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIE91dHB1dCByb3V0aW5lcy4gICovCisKKworLyogTWFudWZhY3VyZSBhIFZNUyBsaWtlIHRpbWUgb24gYSB1bml4IGJhc2VkIHN5c3RlbS4KKyAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorZ2V0X3Ztc190aW1lX3N0cmluZyAoKQoreworICBzdGF0aWMgdW5zaWduZWQgY2hhciB0YnVmWzE4XTsKKyNpZm5kZWYgVk1TCisjaW5jbHVkZSA8dGltZS5oPgorCisgIGNoYXIgKnBudDsKKyAgdGltZV90IHRpbWViOworICB0aW1lICgmdGltZWIpOworICBwbnQgPSBjdGltZSAoJnRpbWViKTsKKyAgcG50WzNdID0gMDsKKyAgcG50WzddID0gMDsKKyAgcG50WzEwXSA9IDA7CisgIHBudFsxNl0gPSAwOworICBwbnRbMjRdID0gMDsKKyAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOworI2Vsc2UKKyNpbmNsdWRlIDxzdGFybGV0Lmg+CisgIHN0cnVjdAorICB7CisgICAgaW50IFNpemU7CisgICAgdW5zaWduZWQgY2hhciAqUHRyOworICB9IERlc2NyaXB0b3I7CisgIERlc2NyaXB0b3IuU2l6ZSA9IDE3OworICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CisgIFNZUyRBU0NUSU0gKDAsICZEZXNjcmlwdG9yLCAwLCAwKTsKKyNlbmRpZiAvKiBub3QgVk1TICovCisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAidm1zdGltZXN0cmluZzonJXMnXG4iLCB0YnVmKTsKKyNlbmRpZgorCisgIHJldHVybiB0YnVmOworfQorCisKKy8qIHdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkICAqLworCitpbnQKK19iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyAgYXN5bWJvbCAqc3ltYm9sOworICBpbnQgc3ltbnVtOworICBpbnQgaGFkX2Nhc2UgPSAwOworICBpbnQgaGFkX2ZpbGUgPSAwOworCisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2hkciAoJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorCisgIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDIpOworCisgIC8qIE1IRCAqLworCisgIGlmIChvYmp0eXBlID09IE9CSl9TX0NfSERSKQorICAgIHsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19NSEQpOworICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOworICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOworICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOworICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7CisgICAgfQorCisgIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIHN0cmlwIHBhdGggYW5kIHN1ZmZpeCBpbmZvcm1hdGlvbiAqLworCisgICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOworCisgICAgICBmcHRyID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7CisgICAgICBmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChmcHRyKSArIDEpOworICAgICAgc3RyY3B5IChmbmFtZSwgZnB0cik7CisgICAgICBmb3V0ID0gc3RycmNociAoZm5hbWUsICddJyk7CisgICAgICBpZiAoZm91dCA9PSAwKQorCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOworICAgICAgaWYgKGZvdXQgIT0gMCkKKwlmb3V0Kys7CisgICAgICBlbHNlCisJZm91dCA9IGZuYW1lOworCisgICAgICAvKiBzdHJpcCAub2JqIHN1ZmZpeCAgKi8KKworICAgICAgZnB0ciA9IHN0cnJjaHIgKGZuYW1lLCAnLicpOworICAgICAgaWYgKChmcHRyICE9IDApCisJICAmJiAoc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKSkKKwkqZnB0ciA9IDA7CisKKyAgICAgIGZwdHIgPSBmb3V0OworICAgICAgd2hpbGUgKCpmcHRyICE9IDApCisJeworCSAgaWYgKGlzbG93ZXIgKCpmcHRyKSkKKwkgICAgKmZwdHIgPSB0b3VwcGVyICgqZnB0cik7CisJICBmcHRyKys7CisJICBpZiAoKCpmcHRyID09ICc7JykKKwkgICAgIHx8ICgoZnB0ciAtIGZvdXQpID4gMzEpKQorCSAgICAqZnB0ciA9IDA7CisJfQorICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGZvdXQpOworICAgIH0KKyAgZWxzZQorICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCAiTk9OQU1FIik7CisKKyAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OKTsKKyAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKKyAgX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIDAsIDE3KTsKKyAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKworICAvKiBMTU4gKi8KKworICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19MTk0pOworICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiR0FTIHByb0dJUyIsIDEwKTsKKyAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKworICAvKiBTUkMgKi8KKworICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19TUkMpOworCisgIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQorICAgIHsKKyAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKKworICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRklMRSkKKwl7CisJICBjaGFyICpzOworCisJICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQorCSAgICB7CisJICAgICAgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykgPSBzeW1ib2wtPm5hbWVbNl0gLSAnMCc7CisJICAgICAgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOworCisJICAgICAgaWYgKGhhZF9maWxlKQorCQlicmVhazsKKwkgICAgICBoYWRfY2FzZSA9IDE7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopc3ltYm9sLT5uYW1lLCBzdHJsZW4gKHN5bWJvbC0+bmFtZSkpOworCSAgaWYgKGhhZF9jYXNlKQorCSAgICBicmVhazsKKwkgIGhhZF9maWxlID0gMTsKKwl9CisgICAgfQorCisgIGlmIChzeW1udW0gPT0gYWJmZC0+c3ltY291bnQpCisgICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOworCisgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisKKyAgLyogVFRMICovCisKKyAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfVFRMKTsKKyAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIlRUTCIsIDMpOworICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCisgIC8qIENQUiAqLworCisgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0NQUik7CisgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLAorCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCisJCQkgMzkpOworICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUHJvY2VzcyBFT00vRUVPTSByZWNvcmQKKyAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLworCitpbnQKK19iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcoMiwgIkVPTS9FRU9NXG4iKTsKKyNlbmRpZgorCisgIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOworCisgIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkgCisgICAgIHx8IChvYmp0eXBlID09IE9CSl9TX0NfRU9NVykpCisgICAgeworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKKyAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA9ICoodm1zX3JlYyArIDgpOworICAgICAgaWYgKFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA+IDEpCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIpKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBmYWxzZTsKKyAgICAgIGlmIChQUklWKHJlY19zaXplKSA+IDEwKQorCXsKKwkgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gdHJ1ZTsKKwkgICBQUklWKGVvbV9kYXRhKS5lb21fYl90ZnJmbGcgPSAqKHZtc19yZWMgKyA5KTsKKwkgICBQUklWKGVvbV9kYXRhKS5lb21fbF9wc2luZHggPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOworCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkciA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CisKKwkgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8qIFdyaXRlIGVvbSByZWNvcmQgZm9yIGJmZCBhYmZkICAqLworCitpbnQKK19iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7CisjZW5kaWYKKworICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKKyAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShQUklWKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7CisgIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogY29tcGxldGlvbiBjb2RlICovCisgIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogZmlsbCBieXRlICovCisKKyAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCisgICAgeworICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisKKyAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saW5rIik7CisgICAgICBpZiAoc2VjdGlvbiA9PSAwKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7CisgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNlY3Rpb24tPmluZGV4KSk7CisgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOworICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOworICAgIH0KKworICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZmQvdm1zLW1pc2MuYyBiL2JmZC92bXMtbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmRhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvdm1zLW1pc2MuYwpAQCAtMCwwICsxLDExNDUgQEAKKy8qIHZtcy1taXNjLmMgLS0gTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAorICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliYmZkLmgiCisKKyNpbmNsdWRlICJ2bXMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgVk1TX0RFQlVHCisvKiBkZWJ1ZyBmdW5jdGlvbnMgKi8KKworLyogZGVidWcgZnVuY3Rpb24gZm9yIGFsbCB2bXMgZXh0ZW5zaW9ucworICAgZXZhbHVhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlIFZNU19ERUJVRyBmb3IgYQorICAgbnVtZXJpY2FsIHZhbHVlIG9uIHRoZSBmaXJzdCBjYWxsCisgICBhbGwgZXJyb3IgbGV2ZWxzIGJlbG93IHRoaXMgdmFsdWUgYXJlIHByaW50ZWQKKyAgCisgICBsZXZlbHM6CisgICAxCXRvcGxldmVsIGJmZCBjYWxscyAoZnVuY3Rpb25zIGZyb20gdGhlIGJmZCB2ZWN0b3IpCisgICAyCWZ1bmN0aW9ucyBjYWxsZWQgYnkgYmZkIGNhbGxzCisgICAuLi4KKyAgIDkJYWxtb3N0IGV2ZXJ5dGhpbmcKKworICAgbGV2ZWwgaXMgYWxzbyBpZGVudGF0aW9uIGxldmVsLiBJbmRlbnRhdGlvbiBpcyBwZXJmb3JtZWQKKyAgIGlmIGxldmVsID4gMAorCSovCisKKyNpZiBfX1NURENfXwordm9pZAorX2JmZF92bXNfZGVidWcgKGludCBsZXZlbCwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHN0YXRpYyBpbnQgbWluX2xldmVsID0gLTE7CisgIHN0YXRpYyBGSUxFICpvdXRwdXQgPSBOVUxMOworICBjaGFyICplcHRyOworICB2YV9saXN0IGFyZ3M7CisgIGludCBhYnNsdmwgPSAobGV2ZWwgPiAwKT9sZXZlbDotbGV2ZWw7CisKKyAgaWYgKG1pbl9sZXZlbCA9PSAtMSkKKyAgICB7CisgICAgICBpZiAoKGVwdHIgPSBnZXRlbnYoIlZNU19ERUJVRyIpKSAhPSBOVUxMKQorCXsKKwkgIG1pbl9sZXZlbCA9IGF0b2koZXB0cik7CisJICBvdXRwdXQgPSBzdGRlcnI7CisJfQorICAgICAgZWxzZQorCW1pbl9sZXZlbCA9IDA7CisgICAgfQorICBpZiAob3V0cHV0ID09IE5VTEwpCisgICAgcmV0dXJuOworICBpZiAoYWJzbHZsID4gbWluX2xldmVsKQorICAgIHJldHVybjsKKworICB3aGlsZSgtLWxldmVsPjApCisgICAgZnByaW50ZihvdXRwdXQsICIgIik7CisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgIHZmcHJpbnRmKG91dHB1dCwgZm9ybWF0LCBhcmdzKTsKKyAgZmZsdXNoKG91dHB1dCk7CisgIHZhX2VuZChhcmdzKTsKKworICByZXR1cm47Cit9CisKKyNlbHNlIC8qIG5vdCBfX1NURENfXyAqLworCit2b2lkCitfYmZkX3Ztc19kZWJ1ZyAobGV2ZWwsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikKKyAgICAgaW50IGxldmVsOworICAgICBjaGFyICpmb3JtYXQ7CisgICAgIGxvbmcgYTE7IGxvbmcgYTI7IGxvbmcgYTM7CisgICAgIGxvbmcgYTQ7IGxvbmcgYTU7IGxvbmcgYTY7Cit7CisgIHN0YXRpYyBpbnQgbWluX2xldmVsID0gLTE7CisgIHN0YXRpYyBGSUxFICpvdXRwdXQgPSBOVUxMOworICBjaGFyICplcHRyOworCisgIGlmIChtaW5fbGV2ZWwgPT0gLTEpCisgICAgeworICAgICAgaWYgKChlcHRyID0gZ2V0ZW52KCJWTVNfREVCVUciKSkgIT0gTlVMTCkKKwl7CisJICBtaW5fbGV2ZWwgPSBhdG9pKGVwdHIpOworCSAgb3V0cHV0ID0gc3RkZXJyOworCX0KKyAgICAgIGVsc2UKKwltaW5fbGV2ZWwgPSAwOworICAgIH0KKyAgaWYgKG91dHB1dCA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgaWYgKGxldmVsID4gbWluX2xldmVsKQorICAgIHJldHVybjsKKworICB3aGlsZSgtLWxldmVsPjApCisgICAgZnByaW50ZihvdXRwdXQsICIgIik7CisgIGZwcmludGYob3V0cHV0LCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOworICBmZmx1c2gob3V0cHV0KTsKKworICByZXR1cm47Cit9CisjZW5kaWYgLyogX19TVERDX18gKi8KKworCisvKiBhIGRlYnVnIGZ1bmN0aW9uCisgICBoZXggZHVtcCAnc2l6ZScgYnl0ZXMgc3RhcnRpbmcgYXQgJ3B0cicgICovCisKK3ZvaWQKK19iZmRfaGV4ZHVtcCAobGV2ZWwsIHB0ciwgc2l6ZSwgb2Zmc2V0KQorICAgICBpbnQgbGV2ZWw7CisgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKKyAgICAgaW50IHNpemU7CisgICAgIGludCBvZmZzZXQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgKmxwdHIgPSBwdHI7CisgIGludCBjb3VudCA9IDA7CisgIGxvbmcgc3RhcnQgPSBvZmZzZXQ7CisKKyAgd2hpbGUgKHNpemUtLSA+IDApCisgICAgeworICAgICAgaWYgKChjb3VudCUxNikgPT0gMCkKKwl2bXNfZGVidWcgKGxldmVsLCAiJTA4bHg6Iiwgc3RhcnQpOworICAgICAgdm1zX2RlYnVnICgtbGV2ZWwsICIgJTAyeCIsICpwdHIrKyk7CisgICAgICBjb3VudCsrOworICAgICAgc3RhcnQrKzsKKyAgICAgIGlmIChzaXplID09IDApCisJeworCSAgd2hpbGUgKChjb3VudCUxNikgIT0gMCkKKwkgICAgeworCSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICAgIik7CisJICAgICAgY291bnQrKzsKKwkgICAgfQorCX0KKyAgICAgIGlmICgoY291bnQlMTYpID09IDApCisJeworCSAgdm1zX2RlYnVnICgtbGV2ZWwsICIgIik7CisJICB3aGlsZSAobHB0ciA8IHB0cikKKwkgICAgeworCSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiJWMiLCAoKmxwdHIgPCAzMik/Jy4nOipscHRyKTsKKwkgICAgICBscHRyKys7CisJICAgIH0KKwkgIHZtc19kZWJ1ZyAoLWxldmVsLCAiXG4iKTsKKwl9CisgICAgfQorICBpZiAoKGNvdW50JTE2KSAhPSAwKQorICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiXG4iKTsKKworICByZXR1cm47Cit9CisjZW5kaWYKKworDAorLyogaGFzaCBmdW5jdGlvbnMKKworICAgVGhlc2UgYXJlIG5lZWRlZCB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICAqLworCisvKiBhbGxvY2F0ZSBuZXcgdm1zX2hhc2hfZW50cnkKKyAgIGtlZXAgdGhlIHN5bWJvbCBuYW1lIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGJmZCBzeW1ib2wgaW4gdGhlIHRhYmxlICAqLworCitzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorX2JmZF92bXNfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICB2bXNfc3ltYm9sX2VudHJ5ICpyZXQ7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg1LCAiX2JmZF92bXNfaGFzaF9uZXdmdW5jKCVwLCAlcCwgJXMpXG4iLCBlbnRyeSwgdGFibGUsIHN0cmluZyk7CisjZW5kaWYKKworICBpZiAoZW50cnkgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKU5VTEwpCisgICAgeworICAgICAgcmV0ID0gKHZtc19zeW1ib2xfZW50cnkgKikKKwkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAodm1zX3N5bWJvbF9lbnRyeSkpOworICAgICAgaWYgKHJldCA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKSBOVUxMKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilOVUxMOworCX0KKyAgICB9CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIGJhc2UgY2xhc3MuICAqLworCisgIHJldCA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilyZXQsIHRhYmxlLCBzdHJpbmcpOworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19oYXNoX25ld2Z1bmMgcmV0ICVwXG4iLCByZXQpOworI2VuZGlmCisKKyAgcmV0LT5zeW1ib2wgPSAoYXN5bWJvbCAqKU5VTEw7CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilyZXQ7Cit9CisKKwwKKy8qIG9iamVjdCBmaWxlIGlucHV0IGZ1bmN0aW9ucyAqLworCisvKiBSZXR1cm4gdHlwZSBhbmQgbGVuZ3RoIGZyb20gcmVjb3JkIGhlYWRlciAoYnVmKSBvbiBBbHBoYS4gICovCisKK3ZvaWQKK19iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCBidWYsIHR5cGUsIGxlbmd0aCkKKyAgICAgYmZkICphYmZkOworICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCAqdHlwZTsKKyAgICAgaW50ICpsZW5ndGg7Cit7CisgIGlmICh0eXBlICE9IDApCisgICAgKnR5cGUgPSBiZmRfZ2V0bDE2IChidWYpOworICBidWYgKz0gMjsKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgICpsZW5ndGggPSBiZmRfZ2V0bDE2IChidWYpOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMTAsICJfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyB0eXBlICV4LCBsZW5ndGggJXhcbiIsICh0eXBlPyp0eXBlOjApLCAobGVuZ3RoPypsZW5ndGg6MCkpOworI2VuZGlmCisKKworICByZXR1cm47Cit9CisKKworLyogR2V0IG5leHQgcmVjb3JkIGZyb20gb2JqZWN0IGZpbGUgdG8gdm1zX2J1ZgorICAgc2V0IFBSSVYoYnVmX3NpemUpIGFuZCByZXR1cm4gaXQKKyAgCisgICB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSBzaW5jZSBpdCBzaG91bGQgYmUgcG9ydGFibGUuCisgIAorICAgdGhlIG9wZW5WTVMgb2JqZWN0IGZpbGUgaGFzICd2YXJpYWJsZSBsZW5ndGgnIHdoaWNoIG1lYW5zIHRoYXQKKyAgIHJlYWQoKSByZXR1cm5zIGRhdGEgaW4gY2h1bmtzIG9mIChob3BlZnVsbHkpIGNvcnJlY3QgYW5kIGV4cGVjdGVkCisgICBzaXplLiBUaGUgbGlua2VyIChhbmQgb3RoZXIgdG9vbHMgb24gdm1zKSBkZXBlbmQgb24gdGhhdC4gVW5peCBkb2Vzbid0CisgICBrbm93IGFib3V0ICdmb3JtYXR0ZWQnIGZpbGVzLCBzbyByZWFkaW5nIGFuZCB3cml0aW5nIHN1Y2ggYW4gb2JqZWN0CisgICBmaWxlIGluIGEgdW5peCBlbnZpcm9ubWVudCBpcyBub3QgdHJpdmlhbC4KKyAgCisgICBXaXRoIHRoZSB0b29sICdmaWxlJyAoYXZhaWxhYmxlIG9uIGFsbCB2bXMgZnRwIHNpdGVzKSwgb25lCisgICBjYW4gdmlldyBhbmQgY2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZmlsZS4gQ2hhbmdpbmcgZnJvbQorICAgJ3ZhcmlhYmxlIGxlbmd0aCcgdG8gJ2ZpeGVkIGxlbmd0aCwgNTEyIGJ5dGVzJyByZXZlYWxzIHRoZQorICAgcmVjb3JkIGxlbmd0aCBhdCB0aGUgZmlyc3QgMiBieXRlcyBvZiBldmVyeSByZWNvcmQuIFRoZSBzYW1lCisgICBoYXBwZW5zIGR1cmluZyB0aGUgdHJhbnNmZXIgb2Ygb2JqZWN0IGZpbGVzIGZyb20gdm1zIHRvIHVuaXgsCisgICBhdCBsZWFzdCB3aXRoIHVjeCwgZGVjJ3MgaW1wbGVtZW50YXRpb24gb2YgdGNwL2lwLgorICAKKyAgIFRoZSB2bXMgZm9ybWF0IHJlcGVhdHMgdGhlIGxlbmd0aCBhdCBieXRlcyAyICYgMyBvZiBldmVyeSByZWNvcmQuCisgIAorICAgT24gdGhlIGZpcnN0IGNhbGwgKGZpbGVfZm9ybWF0ID09IEZGX1VOS05PV04pIHdlIGNoZWNrIGlmCisgICB0aGUgZmlyc3QgYW5kIHRoZSB0aGlyZCBieXRlIHBhaXIgKCEpIG9mIHRoZSByZWNvcmQgbWF0Y2guCisgICBJZiB0aGV5IGRvIGl0J3MgYW4gb2JqZWN0IGZpbGUgaW4gYW4gdW5peCBlbnZpcm9ubWVudCBvciB3aXRoCisgICB3cm9uZyBhdHRyaWJ1dGVzIChGRl9GT1JFSUdOKSwgZWxzZSB3ZSBzaG91bGQgYmUgaW4gYSB2bXMKKyAgIGVudmlyb25tZW50IHdoZXJlIHJlYWQoKSByZXR1cm5zIHRoZSByZWNvcmQgc2l6ZSAoRkZfTkFUSVZFKS4KKyAgCisgICByZWFkaW5nIGlzIGFsd2F5cyBkb25lIGluIDIgc3RlcHMuCisgICBmaXJzdCBqdXN0IHRoZSByZWNvcmQgaGVhZGVyIGlzIHJlYWQgYW5kIHRoZSBsZW5ndGggZXh0cmFjdGVkCisgICBieSBnZXRfaGVhZGVyX3ZhbHVlcworICAgdGhlbiB0aGUgcmVhZCBidWZmZXIgaXMgYWRqdXN0ZWQgYW5kIHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlCisgICByZWFkIGluLgorICAKKyAgIGFsbCBmaWxlIGkvbyBpcyBhbHdheXMgZG9uZSBvbiBldmVuIGZpbGUgcG9zaXRpb25zICAqLworCitpbnQKK19iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHRlc3RfbGVuLCB0ZXN0X3N0YXJ0LCByZW1haW5pbmc7CisgIHVuc2lnbmVkIGNoYXIgKnZtc19idWY7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfZ2V0X3JlY29yZFxuIik7CisjZW5kaWYKKworICAvKiBtaW5pbXVtIGlzIDYgYnl0ZXMgb24gQWxwaGEKKyAgICAgKDIgYnl0ZXMgbGVuZ3RoLCAyIGJ5dGVzIHJlY29yZCBpZCwgMiBieXRlcyBsZW5ndGggcmVwZWF0ZWQpCisKKyAgICAgb24gVkFYIHRoZXJlJ3Mgbm8gbGVuZ3RoIGluZm9ybWF0aW9uIGluIHRoZSByZWNvcmQKKyAgICAgc28gc3RhcnQgd2l0aCBPQkpfU19DX01BWFJFQ1NJWiAgKi8KKworICBpZiAoUFJJVihidWZfc2l6ZSkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoUFJJVihpc192YXgpKQorCXsKKwkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9CSl9TX0NfTUFYUkVDU0laKTsKKwkgIFBSSVYoYnVmX3NpemUpID0gT0JKX1NfQ19NQVhSRUNTSVo7CisJICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1ZBWDsKKwl9CisgICAgICBlbHNlCisJUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoNik7CisgICAgfQorCisgIHZtc19idWYgPSBQUklWKHZtc19idWYpOworCisgIGlmICh2bXNfYnVmID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHN3aXRjaCAoUFJJVihmaWxlX2Zvcm1hdCkpCisgICAgeworICAgICAgY2FzZSBGRl9VTktOT1dOOgorICAgICAgY2FzZSBGRl9GT1JFSUdOOgorCXRlc3RfbGVuID0gNjsJCQkvKiBwcm9iZSA2IGJ5dGVzICovCisJdGVzdF9zdGFydCA9IDI7CQkJLyogd2hlcmUgdGhlIHJlY29yZCBzdGFydHMgKi8KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZGX05BVElWRToKKwl0ZXN0X2xlbiA9IDQ7CisJdGVzdF9zdGFydCA9IDA7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBGRl9WQVg6CisJdGVzdF9sZW4gPSAwOworCXRlc3Rfc3RhcnQgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBza2lwIG9kZCBhbGlnbm1lbnQgYnl0ZSAgKi8KKworICBpZiAoYmZkX3RlbGwgKGFiZmQpICYgMSkKKyAgICB7CisgICAgICBpZiAoYmZkX3JlYWQgKFBSSVYodm1zX2J1ZiksIDEsIDEsIGFiZmQpICE9IDEpCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgLyogcmVhZCB0aGUgcmVjb3JkIGhlYWRlciBvbiBBbHBoYS4gICovCisKKyAgaWYgKCh0ZXN0X2xlbiAhPSAwKQorICAgICAgJiYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCB0ZXN0X2xlbiwgYWJmZCkgIT0gdGVzdF9sZW4pKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogY2hlY2sgZmlsZSBmb3JtYXQgb24gZmlyc3QgY2FsbCAgKi8KKworICBpZiAoUFJJVihmaWxlX2Zvcm1hdCkgPT0gRkZfVU5LTk9XTikKKyAgICB7CQkJCQkJLyogcmVjb3JkIGxlbmd0aCByZXBlYXRzID8gKi8KKyAgICAgIGlmICggKHZtc19idWZbMF0gPT0gdm1zX2J1Zls0XSkKKyAgICAgICAgJiYgKHZtc19idWZbMV0gPT0gdm1zX2J1Zls1XSkpCisJeworCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9GT1JFSUdOOwkvKiBZOiBmb3JlaWduIGVudmlyb25tZW50ICovCisJICB0ZXN0X3N0YXJ0ID0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9OQVRJVkU7CS8qIE46IG5hdGl2ZSBlbnZpcm9ubWVudCAqLworCSAgdGVzdF9zdGFydCA9IDA7CisJfQorICAgIH0KKworICBpZiAoUFJJVihpc192YXgpKQorICAgIHsKKyAgICAgIFBSSVYocmVjX2xlbmd0aCkgPSBiZmRfcmVhZCAodm1zX2J1ZiwgMSwgUFJJVihidWZfc2l6ZSksIGFiZmQpOworICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPD0gMCkKKwl7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWY7CisgICAgfQorICBlbHNlCQkvKiBBbHBoYSAgKi8KKyAgICB7CisgICAgICAvKiBleHRyYWN0IHZtcyByZWNvcmQgbGVuZ3RoICAqLworCisgICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX2J1Zit0ZXN0X3N0YXJ0LCBOVUxMLAorCQkJCSAgJlBSSVYocmVjX2xlbmd0aCkpOworCisgICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIHRoYXQncyB3aGF0IHRoZSBsaW5rZXIgbWFudWFsIHNheXMgICovCisKKyAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gRU9CSl9TX0NfTUFYUkVDU0laKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIGFkanVzdCB0aGUgYnVmZmVyICAqLworCisgICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IFBSSVYoYnVmX3NpemUpKQorCXsKKwkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSByZWFsbG9jICh2bXNfYnVmLCBQUklWKHJlY19sZW5ndGgpKTsKKwkgIHZtc19idWYgPSBQUklWKHZtc19idWYpOworCSAgaWYgKHZtc19idWYgPT0gMCkKKwkgICAgeworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCSAgUFJJVihidWZfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOworCX0KKworICAgICAgLyogcmVhZCB0aGUgcmVtYWluaW5nIHJlY29yZCAgKi8KKworICAgICAgcmVtYWluaW5nID0gUFJJVihyZWNfbGVuZ3RoKSAtIHRlc3RfbGVuICsgdGVzdF9zdGFydDsKKworI2lmIFZNU19ERUJVRworICAgICAgdm1zX2RlYnVnICgxMCwgImJmZF9yZWFkIHJlbWFpbmluZyAlZFxuIiwgcmVtYWluaW5nKTsKKyNlbmRpZgorICAgICAgaWYgKGJmZF9yZWFkICh2bXNfYnVmICsgdGVzdF9sZW4sIDEsIHJlbWFpbmluZywgYWJmZCkgIT0gcmVtYWluaW5nKQorCXsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBQUklWKHZtc19yZWMpID0gdm1zX2J1ZiArIHRlc3Rfc3RhcnQ7CisgICAgfQorCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMTEsICJiZmRfcmVhZCByZWNfbGVuZ3RoICVkXG4iLCBQUklWKHJlY19sZW5ndGgpKTsKKyNlbmRpZgorCisgIHJldHVybiBQUklWKHJlY19sZW5ndGgpOworfQorCisKKy8qIGdldCBuZXh0IHZtcyByZWNvcmQgZnJvbSBmaWxlCisgICB1cGRhdGUgdm1zX3JlYyBhbmQgcmVjX2xlbmd0aCB0byBuZXcgKHJlbWFpbmluZykgdmFsdWVzICAqLworCitpbnQKK19iZmRfdm1zX25leHRfcmVjb3JkIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX25leHRfcmVjb3JkIChsZW4gJWQsIHNpemUgJWQpXG4iLAorCSAgICAgIFBSSVYocmVjX2xlbmd0aCksIFBSSVYocmVjX3NpemUpKTsKKyNlbmRpZgorCisgIGlmIChQUklWKHJlY19sZW5ndGgpID4gMCkKKyAgICB7CisgICAgICBQUklWKHZtc19yZWMpICs9IFBSSVYocmVjX3NpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChfYmZkX3Ztc19nZXRfcmVjb3JkIChhYmZkKSA8PSAwKQorCXJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKFBSSVYoaXNfdmF4KSkKKyAgICB7CisgICAgICBQUklWKHJlY190eXBlKSA9ICooUFJJVih2bXNfcmVjKSk7CisgICAgICBQUklWKHJlY19zaXplKSA9IFBSSVYocmVjX2xlbmd0aCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIFBSSVYodm1zX3JlYyksICZQUklWKHJlY190eXBlKSwKKwkJCQkgICZQUklWKHJlY19zaXplKSk7CisgICAgfQorICBQUklWKHJlY19sZW5ndGgpIC09IFBSSVYocmVjX3NpemUpOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX25leHRfcmVjb3JkOiByZWMgJXAsIHNpemUgJWQsIGxlbmd0aCAlZCwgdHlwZSAlZFxuIiwKKwkgICAgICBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSwgUFJJVihyZWNfbGVuZ3RoKSwKKwkgICAgICBQUklWKHJlY190eXBlKSk7CisjZW5kaWYKKworICByZXR1cm4gUFJJVihyZWNfdHlwZSk7Cit9CisKKworDAorLyogQ29weSBzaXplZCBzdHJpbmcgKHN0cmluZyB3aXRoIGZpeGVkIGxlbmd0aCkgdG8gbmV3IGFsbG9jYXRlZCBhcmVhCisgICBzaXplIGlzIHN0cmluZyBsZW5ndGggKHNpemUgb2YgcmVjb3JkKSAgKi8KKworY2hhciAqCitfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAoc3RyLCBzaXplKQorICAgICB1bnNpZ25lZCBjaGFyICpzdHI7CisgICAgIGludCBzaXplOworeworICBjaGFyICpuZXdzdHIgPSBiZmRfbWFsbG9jIChzaXplICsgMSk7CisKKyAgaWYgKG5ld3N0ciA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBzdHJuY3B5IChuZXdzdHIsIChjaGFyICopc3RyLCBzaXplKTsKKyAgbmV3c3RyW3NpemVdID0gMDsKKworICByZXR1cm4gbmV3c3RyOworfQorCisvKiBDb3B5IGNvdW50ZWQgc3RyaW5nIChzdHJpbmcgd2l0aCBsZW5ndGggYXQgZmlyc3QgYnl0ZSkgdG8gbmV3IGFsbG9jYXRlZCBhcmVhCisgICBwdHIgcG9pbnRzIHRvIGxlbmd0aCBieXRlIG9uIGVudHJ5ICAqLworCitjaGFyICoKK19iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cikKKyAgICAgdW5zaWduZWQgY2hhciAqcHRyOworeworICBpbnQgbGVuID0gKnB0cisrOworCisgIHJldHVybiBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCBsZW4pOworfQorCisMCisvKiBzdGFjayByb3V0aW5lcyBmb3Igdm1zIEVUSVIgY29tbWFuZHMgKi8KKworLyogUHVzaCB2YWx1ZSBhbmQgc2VjdGlvbiBpbmRleCAgKi8KKwordm9pZAorX2JmZF92bXNfcHVzaCAoYWJmZCwgdmFsLCBwc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICB1cXVhZCB2YWw7CisgICAgIGludCBwc2VjdDsKK3sKKyAgc3RhdGljIGludCBsYXN0X3BzZWN0OworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNCwgIjxwdXNoICUwMTZseCglZCkgYXQgJWQ+XG4iLCB2YWwsIHBzZWN0LCBQUklWKHN0YWNrcHRyKSk7CisjZW5kaWYKKworICBpZiAocHNlY3QgPj0gMCkKKyAgICBsYXN0X3BzZWN0ID0gcHNlY3Q7CisKKyAgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnZhbHVlID0gdmFsOworICBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QgPSBsYXN0X3BzZWN0OworICBQUklWKHN0YWNrcHRyKSsrOworICBpZiAoUFJJVihzdGFja3B0cikgPj0gU1RBQ0tTSVpFKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjayBvdmVyZmxvdyAoJWQpIGluIF9iZmRfdm1zX3B1c2giKSwgUFJJVihzdGFja3B0cikpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICByZXR1cm47Cit9CisKKworLyogUG9wIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4ICAqLworCit1cXVhZAorX2JmZF92bXNfcG9wIChhYmZkLCBwc2VjdCkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgKnBzZWN0OworeworICB1cXVhZCB2YWx1ZTsKKworICBpZiAoUFJJVihzdGFja3B0cikgPT0gMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2sgdW5kZXJmbG93IGluIF9iZmRfdm1zX3BvcCIpKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgUFJJVihzdGFja3B0ciktLTsKKyAgdmFsdWUgPSBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkudmFsdWU7CisgIGlmICgocHNlY3QgIT0gTlVMTCkgJiYgKFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCA+PSAwKSkKKyAgICAqcHNlY3QgPSBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3Q7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg0LCAiPHBvcCAlMDE2bHgoJWQpPlxuIiwgdmFsdWUsIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCk7CisjZW5kaWYKKworICByZXR1cm4gdmFsdWU7Cit9CisKKwwKKy8qIG9iamVjdCBmaWxlIG91dHB1dCBmdW5jdGlvbnMgKi8KKworLyogR0FTIHRlbmRzIHRvIHdyaXRlIHNlY3Rpb25zIGluIGxpdHRsZSBjaHVua3MgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cykKKyAgIHdoaWNoIHdlIGNhbid0IHVzZSBkaXJlY3RseS4gU28gd2Ugc2F2ZSB0aGUgbGl0dGxlIGNodW5rcyBpbiBsaW5rZWQKKyAgIGxpc3RzIChvbmUgcGVyIHNlY3Rpb24pIGFuZCB3cml0ZSB0aGVtIGxhdGVyLiAgKi8KKworLyogQWRkIGEgbmV3IHZtc19zZWN0aW9uIHN0cnVjdHVyZSB0byB2bXNfc2VjdGlvbl90YWJsZQorICAgLSBmb3J3YXJkIGNoYWluaW5nIC0gICovCisKK3N0YXRpYyB2bXNfc2VjdGlvbiAqCithZGRfbmV3X2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgc2VjdGlvbjsKK3sKKyAgdm1zX3NlY3Rpb24gKnNwdHIsICpuZXdwdHI7CisKKyAgc3B0ciA9IFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW3NlY3Rpb24tPmluZGV4XTsKKyAgaWYgKHNwdHIgIT0gTlVMTCkKKyAgICByZXR1cm4gc3B0cjsKKworICBuZXdwdHIgPSAodm1zX3NlY3Rpb24gKikgYmZkX21hbGxvYyAoc2l6ZW9mICh2bXNfc2VjdGlvbikpOworICBpZiAobmV3cHRyID09ICh2bXNfc2VjdGlvbiAqKSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBuZXdwdHItPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7CisgIGlmIChuZXdwdHItPmNvbnRlbnRzID09ICh1bnNpZ25lZCBjaGFyICopTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgbmV3cHRyLT5vZmZzZXQgPSAwOworICBuZXdwdHItPnNpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7CisgIG5ld3B0ci0+bmV4dCA9IDA7CisgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW3NlY3Rpb24tPmluZGV4XSA9IG5ld3B0cjsKKyAgcmV0dXJuIG5ld3B0cjsKK30KKworCisvKiBTYXZlIHNlY3Rpb24gZGF0YSAmIG9mZnNldCB0byBhbiB2bXNfc2VjdGlvbiBzdHJ1Y3R1cmUKKyAgIHZtc19zZWN0aW9uX3RhYmxlW10gaG9sZHMgdGhlIHZtc19zZWN0aW9uIGNoYWluICAqLworCitib29sZWFuCitfYmZkX3NhdmVfdm1zX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGRhdGEsIG9mZnNldCwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0aW9uOworICAgICBQVFIgZGF0YTsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworICB2bXNfc2VjdGlvbiAqc3B0cjsKKworICBpZiAoc2VjdGlvbi0+aW5kZXggPj0gVk1TX1NFQ1RJT05fQ09VTlQpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoY291bnQgPT0gKGJmZF9zaXplX3R5cGUpMCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgc3B0ciA9IGFkZF9uZXdfY29udGVudHMgKGFiZmQsIHNlY3Rpb24pOworICBpZiAoc3B0ciA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgbWVtY3B5IChzcHRyLT5jb250ZW50cyArIG9mZnNldCwgZGF0YSwgKHNpemVfdCkgY291bnQpOworCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIEdldCB2bXNfc2VjdGlvbiBwb2ludGVyIHRvIHNhdmVkIGNvbnRlbnRzIGZvciBzZWN0aW9uICMgaW5kZXggICovCisKK3Ztc19zZWN0aW9uICoKK19iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBpbmRleCkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgaW5kZXg7Cit7CisgIGlmIChpbmRleCA+PSAgVk1TX1NFQ1RJT05fQ09VTlQpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldHVybiBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpbmRleF07Cit9CisKKwwKKy8qIE9iamVjdCBvdXRwdXQgcm91dGluZXMgICovCisKKy8qIEJlZ2luIG5ldyByZWNvcmQgb3IgcmVjb3JkIGhlYWRlcgorICAgd3JpdGUgMiBieXRlcyByZWN0eXBlCisgICB3cml0ZSAyIGJ5dGVzIHJlY29yZCBsZW5ndGggKGZpbGxlZCBpbiBhdCBmbHVzaCkKKyAgIHdyaXRlIDIgYnl0ZXMgaGVhZGVyIHR5cGUgKG9tbWl0dGVkIGlmIHJlY2hlYWQgPT0gLTEpICAqLworCit2b2lkCitfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIHJlY3R5cGUsIHJlY2hlYWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHJlY3R5cGU7CisgICAgIGludCByZWNoZWFkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYmVnaW4odHlwZSAlZCwgaGVhZCAlZClcbiIsIHJlY3R5cGUsCisJICAgICAgcmVjaGVhZCk7CisjZW5kaWYKKworICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQscmVjdHlwZSk7CisKKyAgLyogc2F2ZSBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiB0byBmaWxsIGluIGxlbmdodCBsYXRlciAgKi8KKworICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCisgICAgUFJJVihsZW5ndGhfcG9zKSA9IFBSSVYob3V0cHV0X3NpemUpOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9iZWdpbjogbGVuZ3RoX3BvcyA9ICVkXG4iLAorCSAgICAgIFBSSVYobGVuZ3RoX3BvcykpOworI2VuZGlmCisKKyAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLDApOwkJLyogcGxhY2Vob2xkZXIgZm9yIGxlbmd0aCAqLworCisgIGlmIChyZWNoZWFkICE9IC0xKQorICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCxyZWNoZWFkKTsKKworICByZXR1cm47Cit9CisKKworLyogU2V0IHJlY29yZC9zdWJyZWNvcmQgYWxpZ25tZW50ICAqLworCit2b2lkCitfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCBhbGlnbnRvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBhbGlnbnRvOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KCVkKVxuIiwgYWxpZ250byk7CisjZW5kaWYKKworICBQUklWKG91dHB1dF9hbGlnbm1lbnQpID0gYWxpZ250bzsKKyAgcmV0dXJuOworfQorCisKKy8qIFByZXBhcmUgZm9yIHN1YnJlY29yZCBmaWVsZHMgICovCisKK3ZvaWQKK19iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcHVzaChwdXNoZWRfc2l6ZSA9ICVkKVxuIiwgUFJJVihvdXRwdXRfc2l6ZSkpOworI2VuZGlmCisKKyAgUFJJVihwdXNoX2xldmVsKSsrOworICBQUklWKHB1c2hlZF9zaXplKSA9IFBSSVYob3V0cHV0X3NpemUpOworICByZXR1cm47Cit9CisKKworLyogRW5kIG9mIHN1YnJlY29yZCBmaWVsZHMgICovCisKK3ZvaWQKK19iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wb3AocHVzaGVkX3NpemUgPSAlZClcbiIsIFBSSVYocHVzaGVkX3NpemUpKTsKKyNlbmRpZgorCisgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisgIFBSSVYobGVuZ3RoX3BvcykgPSAyOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcG9wOiBsZW5ndGhfcG9zID0gJWRcbiIsIFBSSVYobGVuZ3RoX3BvcykpOworI2VuZGlmCisKKyAgUFJJVihwdXNoZWRfc2l6ZSkgPSAwOworICBQUklWKHB1c2hfbGV2ZWwpLS07CisgIHJldHVybjsKK30KKworCisvKiBGbHVzaCB1bndyaXR0ZW4gb3V0cHV0LCBlbmRzIGN1cnJlbnQgcmVjb3JkICAqLworCit2b2lkCitfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHJlYWxfc2l6ZSA9IFBSSVYob3V0cHV0X3NpemUpOworICBpbnQgYWxpZ25jb3VudDsKKyAgaW50IGxlbmd0aDsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZmx1c2gocmVhbF9zaXplID0gJWQsIHB1c2hlZF9zaXplICVkIGF0IGxlbnBvcyAlZClcbiIsCisJICAgICAgcmVhbF9zaXplLCBQUklWKHB1c2hlZF9zaXplKSwgUFJJVihsZW5ndGhfcG9zKSk7CisjZW5kaWYKKworICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCisgICAgbGVuZ3RoID0gcmVhbF9zaXplIC0gUFJJVihwdXNoZWRfc2l6ZSk7CisgIGVsc2UKKyAgICBsZW5ndGggPSByZWFsX3NpemU7CisKKyAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHJldHVybjsKKyAgYWxpZ25jb3VudCA9IChQUklWKG91dHB1dF9hbGlnbm1lbnQpCisJCS0gKGxlbmd0aCAlIFBSSVYob3V0cHV0X2FsaWdubWVudCkpKSAlIFBSSVYob3V0cHV0X2FsaWdubWVudCk7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAiYWxpZ246IGFkZGluZyAlZCBieXRlc1xuIiwgYWxpZ25jb3VudCk7CisjZW5kaWYKKworICB3aGlsZShhbGlnbmNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIFBSSVYob3V0cHV0X2J1ZilbcmVhbF9zaXplKytdID0gMDsKKyNpZiAwCisgICAgICAvKiB0aGlzIGlzIHdoeSBJICpsb3ZlKiB2bXM6IGluY29uc2lzdGVuY3kgOi19CisJIGFsaWdubWVudCBpcyBhZGRlZCB0byB0aGUgc3VicmVjb3JkIGxlbmd0aAorCSBidXQgbm90IHRvIHRoZSByZWNvcmQgbGVuZ3RoICAqLworICAgICAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQorI2VuZGlmCisJbGVuZ3RoKys7CisgICAgfQorCisgIC8qIHB1dCBsZW5ndGggdG8gYnVmZmVyICAqLworICBQUklWKG91dHB1dF9zaXplKSA9IFBSSVYobGVuZ3RoX3Bvcyk7CisgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgKHVuc2lnbmVkIGludClsZW5ndGgpOworCisgIGlmIChQUklWKHB1c2hfbGV2ZWwpID09IDApCisgICAgeworI2lmbmRlZiBWTVMKKwkvKiB3cml0ZSBsZW5ndGggZmlyc3QsIHNlZSBGRl9GT1JFSUdOIGluIHRoZSBpbnB1dCByb3V0aW5lcyAqLworICAgICAgZndyaXRlIChQUklWKG91dHB1dF9idWYpKzIsIDIsIDEsIChGSUxFICopYWJmZC0+aW9zdHJlYW0pOworI2VuZGlmCisgICAgICBmd3JpdGUgKFBSSVYob3V0cHV0X2J1ZiksIHJlYWxfc2l6ZSwgMSwgKEZJTEUgKilhYmZkLT5pb3N0cmVhbSk7CisKKyAgICAgIFBSSVYob3V0cHV0X3NpemUpID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBQUklWKG91dHB1dF9zaXplKSA9IHJlYWxfc2l6ZTsKKyAgICAgIFBSSVYocHVzaGVkX3NpemUpID0gUFJJVihvdXRwdXRfc2l6ZSk7CisgICAgfQorCisgIHJldHVybjsKK30KKworCisvKiBFbmQgcmVjb3JkIG91dHB1dCAgKi8KKwordm9pZAorX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZW5kXG4iKTsKKyNlbmRpZgorCisgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisKKyAgcmV0dXJuOworfQorCisKKy8qIGNoZWNrIHJlbWFpbmluZyBidWZmZXIgc2l6ZQorCisgICByZXR1cm4gd2hhdCdzIGxlZnQuICAqLworCitpbnQKK19iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgc2l6ZSkKKyAgICBiZmQgKmFiZmQ7CisgICAgaW50IHNpemU7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9jaGVjayglZClcbiIsIHNpemUpOworI2VuZGlmCisKKyAgcmV0dXJuIChNQVhfT1VUUkVDX1NJWkUgLSAoUFJJVihvdXRwdXRfc2l6ZSkgKyBzaXplICsgTUlOX09VVFJFQ19MVUZUKSk7Cit9CisKKworLyogT3V0cHV0IGJ5dGUgKDggYml0KSB2YWx1ZSAgKi8KKwordm9pZAorX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2J5dGUoJTAyeClcbiIsIHZhbHVlKTsKKyNlbmRpZgorCisgIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOworICBQUklWKG91dHB1dF9zaXplKSArPSAxOworICByZXR1cm47Cit9CisKKworLyogT3V0cHV0IHNob3J0ICgxNiBiaXQpIHZhbHVlICAqLworCit2b2lkCitfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X3Nob3J0ICglMDR4KVxuIiwgdmFsdWUpOworI2VuZGlmCisKKyAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUgJiAweGZmZmYsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7CisgIFBSSVYob3V0cHV0X3NpemUpICs9IDI7CisgIHJldHVybjsKK30KKworCisvKiBPdXRwdXQgbG9uZyAoMzIgYml0KSB2YWx1ZSAgKi8KKwordm9pZAorX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9sb25nICglMDhseClcbiIsIHZhbHVlKTsKKyNlbmRpZgorCisgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOworICBQUklWKG91dHB1dF9zaXplKSArPSA0OworICByZXR1cm47Cit9CisKKworLyogT3V0cHV0IHF1YWQgKDY0IGJpdCkgdmFsdWUgICovCisKK3ZvaWQKK19iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCB2YWx1ZSkKKyAgICAgYmZkICphYmZkOworICAgICB1cXVhZCB2YWx1ZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X3F1YWQoJTAxNmx4KVxuIiwgdmFsdWUpOworI2VuZGlmCisKKyAgYmZkX3B1dF82NChhYmZkLCB2YWx1ZSwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKKyAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gODsKKyAgcmV0dXJuOworfQorCisKKy8qIE91dHB1dCBjLXN0cmluZyBhcyBjb3VudGVkIHN0cmluZyAgKi8KKwordm9pZAorX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKnZhbHVlOworeworaW50IGxlbjsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCglcylcbiIsIHZhbHVlKTsKKyNlbmRpZgorCisgIGxlbiA9IHN0cmxlbiAodmFsdWUpOworICBpZiAobGVuID09IDApCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIikpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKGxlbiA+IDI1NSkKKyAgICB7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHRvbyBtYW55IGJ5dGVzIikpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIGxlbiAmIDB4ZmYpOworICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKil2YWx1ZSwgbGVuKTsKK30KKworCisvKiBPdXRwdXQgY2hhcmFjdGVyIGFyZWEgICovCisKK3ZvaWQKK19iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBkYXRhLCBsZW5ndGgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2R1bXAoJWQpXG4iLCBsZW5ndGgpOworI2VuZGlmCisKKyAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHJldHVybjsKKworICBtZW1jcHkgKFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSwgZGF0YSwgbGVuZ3RoKTsKKyAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gbGVuZ3RoOworCisgIHJldHVybjsKK30KKworCisvKiBPdXRwdXQgY291bnQgYnl0ZXMgb2YgdmFsdWUgICovCisKK3ZvaWQKK19iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCB2YWx1ZSwgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHZhbHVlOworICAgICBpbnQgY291bnQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9maWxsKHZhbCAlMDJ4IHRpbWVzICVkKVxuIiwgdmFsdWUsIGNvdW50KTsKKyNlbmRpZgorCisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybjsKKyAgbWVtc2V0IChQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSksIHZhbHVlLCBjb3VudCk7CisgIFBSSVYob3V0cHV0X3NpemUpICs9IGNvdW50OworCisgIHJldHVybjsKK30KKworLyogdGhpcyBoYXNoIHJvdXRpbmUgYm9ycm93ZWQgZnJvbSBHTlUtRU1BQ1MsIGFuZCBzdHJlbmd0aGVuZWQgc2xpZ2h0bHkgIEVSWSovCisKK3N0YXRpYyBpbnQKK2hhc2hfc3RyaW5nIChwdHIpCisgICAgIGNvbnN0IGNoYXIgKnB0cjsKK3sKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHN0cmxlbiAocHRyKTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOworICByZWdpc3RlciBpbnQgaGFzaCA9IDA7CisKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGMgPSAqcCsrOworICAgICAgaGFzaCA9ICgoaGFzaCA8PCAzKSArIChoYXNoIDw8IDE1KSArIChoYXNoID4+IDI4KSArIGMpOworICAgIH0KKyAgcmV0dXJuIGhhc2g7Cit9CisKKy8qIEdlbmVyYXRlIGEgbGVuZ3RoLWhhc2hlZCBWTVMgc3ltYm9sIG5hbWUgKGxpbWl0ZWQgdG8gbWF4bGVuIGNoYXJzKS4gICovCisKK2NoYXIgKgorX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBpbiwgbWF4bGVuKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKmluOworICAgICBpbnQgbWF4bGVuOworeworICBsb25nIGludCBpbml0OworICBsb25nIGludCByZXN1bHQ7CisgIGludCBpbl9sZW47CisgIGNoYXIgKnBudCA9IDA7CisgIGNoYXIgKm5ld19uYW1lOworICBjb25zdCBjaGFyICpvbGRfbmFtZTsKKyAgaW50IGk7CisgIHN0YXRpYyBjaGFyIG91dGJ1ZltFT0JKX1NfQ19TWU1TSVorMV07CisgIGNoYXIgKm91dCA9IG91dGJ1ZjsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcoNCwgIl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBcIiVzXCJcbiIsIGluKTsKKyNlbmRpZgorCisgIGlmIChtYXhsZW4gPiBFT0JKX1NfQ19TWU1TSVopCisgICAgbWF4bGVuID0gRU9CSl9TX0NfU1lNU0laOworCisgIG5ld19uYW1lID0gb3V0OwkJLyogc2F2ZSB0aGlzIGZvciBsYXRlci4gICovCisKKyAgLyogV2UgbWF5IG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHN5bWJvbCwgc2F2ZSB0aGUgaGFzaCBmb3IgbGF0ZXIuICAqLworCisgIGluX2xlbiA9IHN0cmxlbiAoaW4pOworCisgIHJlc3VsdCA9IChpbl9sZW4gPiBtYXhsZW4pID8gaGFzaF9zdHJpbmcgKGluKSA6IDA7CisKKyAgb2xkX25hbWUgPSBpbjsKKworICAvKiBEbyB0aGUgbGVuZ3RoIGNoZWNraW5nLiAgKi8KKworICBpZiAoaW5fbGVuIDw9IG1heGxlbikKKyAgICB7CisgICAgICBpID0gaW5fbGVuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSkKKwlpID0gbWF4bGVuLTk7CisgICAgICBlbHNlCisJaSA9IG1heGxlbjsKKyAgICB9CisKKyAgc3RybmNweSAob3V0LCBpbiwgaSk7CisgIGluICs9IGk7CisgIG91dCArPSBpOworCisgIGlmICgoaW5fbGVuID4gbWF4bGVuKQorICAgICAgJiYgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykpCisgICAgc3ByaW50ZiAob3V0LCAiXyUwOHgiLCByZXN1bHQpOworICBlbHNlCisgICAgKm91dCA9IDA7CisKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnKDQsICItLT4gWyVkXVwiJXNcIlxuIiwgc3RybGVuIChvdXRidWYpLCBvdXRidWYpOworI2VuZGlmCisKKyAgaWYgKGluX2xlbiA+IG1heGxlbgorCSYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCisJJiYgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpKQorICAgIHByaW50ZiAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKKworICByZXR1cm4gb3V0YnVmOworfQorCisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHN5bWJvbC4gICovCisKK3N0YXRpYyBhc3ltYm9sICoKK25ld19zeW1ib2wgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgYXN5bWJvbCAqc3ltYm9sOworCisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg3LCAgIm5ld19zeW1ib2wgJXNcbiIsIG5hbWUpOworI2VuZGlmCisKKyAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOworICBpZiAoc3ltYm9sID09IDApCisgICAgcmV0dXJuIHN5bWJvbDsKKyAgc3ltYm9sLT5uYW1lID0gbmFtZTsKKyAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOworCisgIHJldHVybiBzeW1ib2w7Cit9CisKKworLyogQWxsb2NhdGUgYW5kIGVudGVyIGEgbmV3IHByaXZhdGUgc3ltYm9sLiAgKi8KKwordm1zX3N5bWJvbF9lbnRyeSAqCitfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDYsICAiX2JmZF92bXNfZW50ZXJfc3ltYm9sICVzXG4iLCBuYW1lKTsKKyNlbmRpZgorCisgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikKKwkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKKyAgaWYgKGVudHJ5ID09IDApCisgICAgeworI2lmIFZNU19ERUJVRworICAgICAgX2JmZF92bXNfZGVidWcgKDgsICAiY3JlYXRpbmcgaGFzaCBlbnRyeSBmb3IgJXNcbiIsIG5hbWUpOworI2VuZGlmCisgICAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCB0cnVlLCBmYWxzZSk7CisgICAgICBpZiAoZW50cnkgIT0gMCkKKwl7CisJICBhc3ltYm9sICpzeW1ib2w7CisJICBzeW1ib2wgPSBuZXdfc3ltYm9sIChhYmZkLCBuYW1lKTsKKwkgIGlmIChzeW1ib2wgIT0gMCkKKwkgICAgeworCSAgICAgIGVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7CisJICAgICAgUFJJVihnc2Rfc3ltX2NvdW50KSsrOworCSAgICAgIGFiZmQtPnN5bWNvdW50Kys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZW50cnkgPSAwOworCX0KKyAgICAgIGVsc2UKKwkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImZhaWxlZCB0byBlbnRlciAlcyIpLCBuYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgVk1TX0RFQlVHCisgICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJmb3VuZCBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDcsICItPiBlbnRyeSAlcCwgZW50cnktPnN5bWJvbCAlcFxuIiwgZW50cnksIGVudHJ5LT5zeW1ib2wpOworI2VuZGlmCisgIHJldHVybiBlbnRyeTsKK30KZGlmZiAtLWdpdCBhL2JmZC92bXMtdGlyLmMgYi9iZmQvdm1zLXRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmY1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQvdm1zLXRpci5jCkBAIC0wLDAgKzEsMjQ4OSBAQAorLyogdm1zLXRpci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVkFYIChvcGVuVk1TL1ZBWCkgYW5kCisgICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucworICAgRVRJUiByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCisKKyAgIGdvIGFuZCByZWFkIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgKGVzcC4gYXBwZW5kaXggQikKKyAgIGlmIHlvdSBkb24ndCBrbm93IHdoYXQncyBnb2luZyBvbiBoZXJlIDotKQorCisgICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworLyogVGhlIGZvbGxvd2luZyB0eXBlIGFiYnJldmlhdGlvbnMgYXJlIHVzZWQ6CisKKwljcwljb3VudGVkIHN0cmluZyAoYXNjaWkgc3RyaW5nIHdpdGggbGVuZ3RoIGJ5dGUpCisJYnkJYnl0ZSAoMSBieXRlKQorCXNoCXNob3J0ICgyIGJ5dGUsIDE2IGJpdCkKKwlsdwlsb25nd29yZCAoNCBieXRlLCAzMiBiaXQpCisJcXcJcXVhZHdvcmQgKDggYnl0ZSwgNjQgYml0KQorCWRhCWRhdGEgc3RyZWFtICAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgInZtcy5oIgorCitzdGF0aWMgdm9pZCBpbWFnZV9zZXRfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHBzZWN0LCB1cXVhZCBvZmZzZXQpKTsKK3N0YXRpYyB2b2lkIGltYWdlX2luY19wdHIgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCBvZmZzZXQpKTsKK3N0YXRpYyB2b2lkIGltYWdlX2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7CitzdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9iIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7CitzdGF0aWMgdm9pZCBpbWFnZV93cml0ZV93IFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7CitzdGF0aWMgdm9pZCBpbWFnZV93cml0ZV9sIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOworc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfcSBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbHVlKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CitjaGVja19zZWN0aW9uIChhYmZkLCBzaXplKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBzaXplOworeworICBpbnQgb2Zmc2V0OworCisgIG9mZnNldCA9IFBSSVYoaW1hZ2VfcHRyKSAtIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzOworICBpZiAoKG9mZnNldCArIHNpemUpID4gUFJJVihpbWFnZV9zZWN0aW9uKS0+X3Jhd19zaXplKQorICAgIHsKKyAgICAgIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzID0gYmZkX3JlYWxsb2MgKFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzLCBvZmZzZXQgKyBzaXplKTsKKyAgICAgIGlmIChQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyA9PSAwKQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiTm8gTWVtICEiKSk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgUFJJVihpbWFnZV9zZWN0aW9uKS0+X3Jhd19zaXplID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICAgIFBSSVYoaW1hZ2VfcHRyKSA9IFBSSVYoaW1hZ2Vfc2VjdGlvbiktPmNvbnRlbnRzICsgb2Zmc2V0OworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogcm91dGluZXMgdG8gZmlsbCBzZWN0aW9ucyBjb250ZW50cyBkdXJpbmcgdGlyL2V0aXIgcmVhZCAqLworCisvKiBJbml0aWFsaXplIGltYWdlIGJ1ZmZlciBwb2ludGVyIHRvIGJlIGZpbGxlZCAgKi8KKworc3RhdGljIHZvaWQKK2ltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBvZmZzZXQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IHBzZWN0OworICAgICB1cXVhZCBvZmZzZXQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg0LCAiaW1hZ2Vfc2V0X3B0ciAoJWQ9JXMsICVkKVxuIiwKKwkJcHNlY3QsIFBSSVYoc2VjdGlvbnMpW3BzZWN0XS0+bmFtZSwgb2Zmc2V0KTsKKyNlbmRpZgorCisgIFBSSVYoaW1hZ2VfcHRyKSA9IFBSSVYoc2VjdGlvbnMpW3BzZWN0XS0+Y29udGVudHMgKyBvZmZzZXQ7CisgIFBSSVYoaW1hZ2Vfc2VjdGlvbikgPSBQUklWKHNlY3Rpb25zKVtwc2VjdF07CisgIHJldHVybjsKK30KKworCisvKiBJbmNyZW1lbnQgaW1hZ2UgYnVmZmVyIHBvaW50ZXIgYnkgb2Zmc2V0ICAqLworCitzdGF0aWMgdm9pZAoraW1hZ2VfaW5jX3B0ciAoYWJmZCwgb2Zmc2V0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVxdWFkIG9mZnNldDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDQsICJpbWFnZV9pbmNfcHRyICglZClcbiIsIG9mZnNldCk7CisjZW5kaWYKKworICBQUklWKGltYWdlX3B0cikgKz0gb2Zmc2V0OworCisgIHJldHVybjsKK30KKworCisvKiBEdW1wIG11bHRpcGxlIGJ5dGVzIHRvIHNlY3Rpb24gaW1hZ2UgICovCisKK3N0YXRpYyB2b2lkCitpbWFnZV9kdW1wIChhYmZkLCBwdHIsIHNpemUsIG9mZnNldCkKKyAgICBiZmQgKmFiZmQ7CisgICAgdW5zaWduZWQgY2hhciAqcHRyOworICAgIGludCBzaXplOworICAgIGludCBvZmZzZXQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg4LCAiaW1hZ2VfZHVtcCBmcm9tICglcCwgJWQpIHRvICglcClcbiIsIHB0ciwgc2l6ZSwgUFJJVihpbWFnZV9wdHIpKTsKKyAgX2JmZF9oZXhkdW1wICg5LCBwdHIsIHNpemUsIG9mZnNldCk7CisjZW5kaWYKKworICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIHNpemUpKQorICAgIHJldHVybjsKKworICB3aGlsZSAoc2l6ZS0tID4gMCkKKyAgICAqUFJJVihpbWFnZV9wdHIpKysgPSAqcHRyKys7CisgIHJldHVybjsKK30KKworCisvKiBXcml0ZSBieXRlIHRvIHNlY3Rpb24gaW1hZ2UgICovCisKK3N0YXRpYyB2b2lkCitpbWFnZV93cml0ZV9iIChhYmZkLCB2YWx1ZSkKKyAgICAgYmZkICphYmZkOworICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Cit7CisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfYiglMDJ4KVxuIiwgKGludCl2YWx1ZSk7CisjZW5kaWYKKworICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDEpKQorICAgIHJldHVybjsKKworICAqUFJJVihpbWFnZV9wdHIpKysgPSAodmFsdWUgJiAweGZmKTsKKyAgcmV0dXJuOworfQorCisKKy8qIFdyaXRlIDItYnl0ZSB3b3JkIHRvIGltYWdlICAqLworCitzdGF0aWMgdm9pZAoraW1hZ2Vfd3JpdGVfdyAoYWJmZCwgdmFsdWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdW5zaWduZWQgaW50IHZhbHVlOworeworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3coJTA0eClcbiIsIChpbnQpdmFsdWUpOworI2VuZGlmCisKKyAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAyKSkKKyAgICByZXR1cm47CisKKyAgYmZkX3B1dGwxNiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7CisgIFBSSVYoaW1hZ2VfcHRyKSArPSAyOworCisgIHJldHVybjsKK30KKworCisvKiBXcml0ZSA0LWJ5dGUgbG9uZyB0byBpbWFnZSAgKi8KKworc3RhdGljIHZvaWQKK2ltYWdlX3dyaXRlX2wgKGFiZmQsIHZhbHVlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Cit7CisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfbCAoJTA4bHgpXG4iLCB2YWx1ZSk7CisjZW5kaWYKKworICBpZiAoUFJJVihpc192YXgpICYmIGNoZWNrX3NlY3Rpb24gKGFiZmQsIDQpKQorICAgIHJldHVybjsKKworICBiZmRfcHV0bDMyICh2YWx1ZSwgUFJJVihpbWFnZV9wdHIpKTsKKyAgUFJJVihpbWFnZV9wdHIpICs9IDQ7CisKKyAgcmV0dXJuOworfQorCisKKy8qIFdyaXRlIDgtYnl0ZSBxdWFkIHRvIGltYWdlICAqLworCitzdGF0aWMgdm9pZAoraW1hZ2Vfd3JpdGVfcSAoYWJmZCwgdmFsdWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgdXF1YWQgdmFsdWU7Cit7CisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg2LCAiaW1hZ2Vfd3JpdGVfcSAoJTAxNmx4KVxuIiwgdmFsdWUpOworI2VuZGlmCisKKyAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA4KSkKKyAgICByZXR1cm47CisKKyAgYmZkX3B1dGw2NCAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7CisgIFBSSVYoaW1hZ2VfcHRyKSArPSA4OworCisgIHJldHVybjsKK30KKwwKKworI2RlZmluZSBISUdIQklUKG9wKSAoKG9wICYgMHg4MDAwMDAwMEwpID09IDB4ODAwMDAwMDBMKQorCisvKiBldGlyX3N0YQorICAKKyAgIHZtcyBzdGFjayBjb21tYW5kcworICAKKyAgIGhhbmRsZSBzdGFfeHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgorICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCisgIAorICAgc2VlIHRhYmxlIEItOCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLworCitzdGF0aWMgYm9vbGVhbgorZXRpcl9zdGEgKGFiZmQsIGNtZCwgcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBjbWQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKK3sKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhICVkLyV4XG4iLCBjbWQsIGNtZCk7CisgIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOworI2VuZGlmCisKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAgICAgLyogc3RhY2sgKi8KKworICAgICAgLyogc3RhY2sgZ2xvYmFsCisJICAgYXJnOiBjcwlzeW1ib2wgbmFtZQorCisJICAgc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKSAgKi8KKworICAgICAgY2FzZSBFVElSX1NfQ19TVEFfR0JMOgorCXsKKwkgIGNoYXIgKm5hbWU7CisJICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKKworCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CisJICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopCisJCSAgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOworCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKKwkgICAgeworI2lmIFZNU19ERUJVRworCSAgICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RBX0dCTDogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7CisjZW5kaWYKKwkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMCwgLTEpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisKKwkvKiBzdGFjayBsb25nd29yZAorCSAgIGFyZzogbHcJdmFsdWUKKworCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gNjQgYml0ICAqLworCisgICAgICBjYXNlIEVUSVJfU19DX1NUQV9MVzoKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGwzMiAocHRyKSwgLTEpOworICAgICAgYnJlYWs7CisKKwkvKiBzdGFjayBnbG9iYWwKKwkgICBhcmc6IHF3CXZhbHVlCisKKwkgICBzdGFjayA2NCBiaXQgdmFsdWUgb2Ygc3ltYm9sCSAqLworCisgICAgICBjYXNlIEVUSVJfU19DX1NUQV9RVzoKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpYmZkX2dldGw2NChwdHIpLCAtMSk7CisgICAgICBicmVhazsKKworCS8qIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBxdWFkd29yZCBvZmZzZXQKKwkgICBhcmc6IGx3CXNlY3Rpb24gaW5kZXgKKwkgIAlxdwlzaWduZWQgcXVhZHdvcmQgb2Zmc2V0IChsb3cgMzIgYml0cykKKworCSAgIHN0YWNrIHF3IGFyZ3VtZW50IGFuZCBzZWN0aW9uIGluZGV4CisJICAgKHNlZSBFVElSX1NfQ19TVE9fT0ZGLCBFVElSX1NfQ19DVExfU0VUUkIpICAqLworCisgICAgICBjYXNlIEVUSVJfU19DX1NUQV9QUToKKyAgCXsKKwkgIHVxdWFkIGR1bW15OworCSAgaW50IHBzZWN0OworCisJICBwc2VjdCA9IGJmZF9nZXRsMzIgKHB0cik7CisJICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKKwkgICAgeworCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiQmFkIHNlY3Rpb24gaW5kZXggaW4gRVRJUl9TX0NfU1RBX1BRIikpOworCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZHVtbXkgPSBiZmRfZ2V0bDY0IChwdHIrNCk7CisJICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOworICAgICAgICB9CisgICAgICBicmVhazsKKworCS8qIGFsbCBub3Qgc3VwcG9ydGVkICAqLworCisgICAgICBjYXNlIEVUSVJfU19DX1NUQV9MSToKKyAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX01PRDoKKyAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0NLQVJHOgorCisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbnN1cHBvcnRlZCBTVEEgY21kICVkIiksIGNtZCk7CisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIGNtZCk7CisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RhIHRydWVcbiIpOworI2VuZGlmCisgIHJldHVybiB0cnVlOworfQorCisKKy8qCisgICBldGlyX3N0bworICAKKyAgIHZtcyBzdG9yZSBjb21tYW5kcworICAKKyAgIGhhbmRsZSBzdG9feHh4IGNvbW1hbmRzIGluIGV0aXIgc2VjdGlvbgorICAgcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCisgIAorICAgc2VlIHRhYmxlIEItOSBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLworCitzdGF0aWMgYm9vbGVhbgorZXRpcl9zdG8gKGFiZmQsIGNtZCwgcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBjbWQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKK3sKKyAgdXF1YWQgZHVtbXk7CisgIGludCBwc2VjdDsKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RvICVkLyV4XG4iLCBjbWQsIGNtZCk7CisgIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOworI2VuZGlmCisKKyAgc3dpdGNoIChjbWQpCisgICAgeworCisgICAgICAvKiBzdG9yZSBieXRlOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKKwkgYXJnOiAtICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVE9fQjoKKyAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOworI2lmIDAKKyAgICAgIGlmIChpc19zaGFyZSkJCS8qIEZJWE1FICovCisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RPX0I6IGJ5dGUgZml4dXBzIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgICAgaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCisgICAgICBicmVhazsKKworICAgICAgLyogc3RvcmUgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCisJIGFyZzogLSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RPX1c6CisgICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKyNpZiAwCisgICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLworCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiB3b3JkIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICAgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCisgICAgICBicmVhazsKKworICAgICAgLyogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKKwkgYXJnOiAtICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVE9fTFc6CisgICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKyAgICAgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7CisgICAgICBpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIHN0b3JlIHF1YWR3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHF1YWR3b3JkCisJIGFyZzogLSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RPX1FXOgorICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7CisgICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOworICAgICAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgZHVtbXkpOwkJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCisgICAgICBicmVhazsKKworICAgICAgLyogc3RvcmUgaW1tZWRpYXRlIHJlcGVhdGVkOiBwb3Agc3RhY2sgZm9yIHJlcGVhdCBjb3VudAorCSBhcmc6IGx3CWJ5dGUgY291bnQKKwkgZGEJZGF0YSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTVI6CisgICAgICB7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJc2l6ZSA9IGJmZF9nZXRsMzIgKHB0cik7CisJZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCXdoaWxlIChkdW1teS0tID4gMEwpCisJICBpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLyogc3RvcmUgZ2xvYmFsOiB3cml0ZSBzeW1ib2wgdmFsdWUKKwkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUT19HQkw6CisgICAgICB7CisJdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7CisJY2hhciAqbmFtZTsKKworCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOworCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7CisJaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKKwkgIHsKKwkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fR0JMOiBubyBzeW1ib2wgXCIlc1wiIiksCisJCQkJICAgbmFtZSk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwllbHNlCisJICBpbWFnZV93cml0ZV9xIChhYmZkLCAodXF1YWQpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIHN0b3JlIGNvZGUgYWRkcmVzczogd3JpdGUgYWRkcmVzcyBvZiBlbnRyeSBwb2ludAorCSBhcmc6IGNzCWdsb2JhbCBzeW1ib2wgbmFtZSAocHJvY2VkdXJlKSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RPX0NBOgorICAgICAgeworCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OworCWNoYXIgKm5hbWU7CisKKwluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKKwllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKKwlpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQorCSAgeworCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIpLAorCQkJCSAgIG5hbWUpOworCSAgICByZXR1cm4gZmFsc2U7CisJICB9CisJZWxzZQorCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVE9fUkI6CisgICAgY2FzZSBFVElSX1NfQ19TVE9fQUI6CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19SQi9BQjogTm90IHN1cHBvcnRlZCIpKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogc3RvcmUgb2Zmc2V0IHRvIHBzZWN0OiBwb3Agc3RhY2ssIGFkZCBsb3cgMzIgYml0cyB0byBiYXNlIG9mIHBzZWN0CisgICAgICAgYXJnOiAtICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVE9fT0ZGOgorICAgICAgeworCXVxdWFkIHE7CisJaW50IHBzZWN0OworCisJcSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlxICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7CisJaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgcSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLyogc3RvcmUgaW1tZWRpYXRlCisJIGFyZzogbHcJY291bnQgb2YgYnl0ZXMKKwkgZGEJZGF0YSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RPX0lNTToKKyAgICAgIHsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOworCWltYWdlX2R1bXAgKGFiZmQsIHB0cis0LCBzaXplLCAwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiB0aGlzIGNvZGUgaXMgJ3Jlc2VydmVkIHRvIGRpZ2l0YWwnIGFjY29yZGluZyB0byB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsLAorCSBob3dldmVyIGl0IGlzIGdlbmVyYXRlZCBieSB0aGUgREVDIEMgY29tcGlsZXIgYW5kIGRlZmluZWQgaW4gdGhlIGluY2x1ZGUgZmlsZS4KKwkgRklYTUUsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaXMganVzdCBhIGd1ZXNzCisJIHN0b3JlIGdsb2JhbCBsb25nd29yZDogc3RvcmUgMzJiaXQgdmFsdWUgb2Ygc3ltYm9sCisJIGFyZzogY3MJc3ltYm9sIG5hbWUgICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUT19HQkxfTFc6CisgICAgICB7CisJdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7CisJY2hhciAqbmFtZTsKKworCW5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOworCWVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKiliZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7CisJaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKKwkgIHsKKyNpZiBWTVNfREVCVUcKKwkgICAgX2JmZF92bXNfZGVidWcgKDMsICJFVElSX1NfQ19TVE9fR0JMX0xXOiBubyBzeW1ib2wgXCIlc1wiXG4iLCBuYW1lKTsKKyNlbmRpZgorCSAgICBpbWFnZV93cml0ZV9sIChhYmZkLCAodW5zaWduZWQgbG9uZykwKTsJLyogRklYTUUsIHJlbG9jICovCisJICB9CisJZWxzZQorCSAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSk7CS8qIEZJWE1FLCByZWxvYyAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUT19MUF9QU0I6CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19MUF9QU0I6IE5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICBicmVhazsKKworICAgIC8qICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX0dCTDoKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfR0JMOiBub3QgaW1wbGVtZW50ZWQiKSk7CisgICAgICBicmVhazsKKworICAgIC8qICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUT19ISU5UX1BTOgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fSElOVF9QUzogbm90IGltcGxlbWVudGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIGNtZCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIHN0YWNrIG9wZXJhdG9yIGNvbW1hbmRzCisgICBhbGwgMzIgYml0IHNpZ25lZCBhcml0aG1ldGljCisgICBhbGwgd29yZCBqdXN0IGxpa2UgYSBzdGFjayBjYWxjdWxhdG9yCisgICBhcmd1bWVudHMgYXJlIHBvcHBlZCBmcm9tIHN0YWNrLCByZXN1bHRzIGFyZSBwdXNoZWQgb24gc3RhY2sKKyAgCisgICBzZWUgdGFibGUgQi0xMCBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLworCitzdGF0aWMgYm9vbGVhbgorZXRpcl9vcHIgKGFiZmQsIGNtZCwgcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBjbWQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKK3sKKyAgbG9uZyBvcDEsIG9wMjsKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfb3ByICVkLyV4XG4iLCBjbWQsIGNtZCk7CisgIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOworI2VuZGlmCisKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAgICAgLyogb3BlcmF0aW9uICovCisKKyAgICAgIC8qIG5vLW9wICAqLworCisgICAgY2FzZSBFVElSX1NfQ19PUFJfTk9QOgorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGFkZCAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FERDoKKyAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisgICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgKyBvcDIpLCAtMSk7CisgICAgICBicmVhazsKKworICAgICAgLyogc3VidHJhY3QgICovCisKKyAgICBjYXNlIEVUSVJfU19DX09QUl9TVUI6CisgICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKyAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AyIC0gb3AxKSwgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG11bHRpcGx5ICAqLworCisgICAgY2FzZSBFVElSX1NfQ19PUFJfTVVMOgorICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKyAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSAqIG9wMiksIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBkaXZpZGUgICovCisKKyAgICBjYXNlIEVUSVJfU19DX09QUl9ESVY6CisgICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKyAgICAgIGlmIChvcDIgPT0gMCkKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpMEwsIC0xKTsKKyAgICAgIGVsc2UKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMiAvIG9wMSksIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBsb2dpY2FsIGFuZCAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FORDoKKyAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisgICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgJiBvcDIpLCAtMSk7CisgICAgICBicmVhazsKKworICAgICAgLyogbG9naWNhbCBpbmNsdXNpdmUgb3IJICovCisKKyAgICBjYXNlIEVUSVJfU19DX09QUl9JT1I6CisgICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKyAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIHwgb3AyKSwgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGxvZ2ljYWwgZXhjbHVzaXZlIG9yICAqLworCisgICAgY2FzZSBFVElSX1NfQ19PUFJfRU9SOgorICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKyAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisgICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSBeIG9wMiksIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBuZWdhdGUgICovCisKKyAgICBjYXNlIEVUSVJfU19DX09QUl9ORUc6CisgICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKSgtb3AxKSwgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGNvbXBsZW1lbnQgICovCisKKyAgICBjYXNlIEVUSVJfU19DX09QUl9DT006CisgICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgXiAtMUwpLCAtMSk7CisgICAgICBicmVhazsKKworICAgICAgLyogaW5zZXJ0IGZpZWxkICAqLworCisgICAgY2FzZSBFVElSX1NfQ19PUFJfSU5TVjoKKyAgICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAvKiBhcml0aG1ldGljIHNoaWZ0ICAqLworCisgICAgY2FzZSBFVElSX1NfQ19PUFJfQVNIOgorICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKyAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisgICAgICBpZiAob3AyIDwgMCkJCS8qIHNoaWZ0IHJpZ2h0ICovCisJb3AxID4+PSAtb3AyOworICAgICAgZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KKwlvcDEgPDw9IG9wMjsKKyAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZClvcDEsIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiB1bnNpZ25lZCBzaGlmdCAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfT1BSX1VTSDoKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1VTSDogTm90IHN1cHBvcnRlZCIpKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiByb3RhdGUgICovCisKKyAgICBjYXNlIEVUSVJfU19DX09QUl9ST1Q6CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9ST1Q6IE5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICBicmVhazsKKworICAgICAgLyogc2VsZWN0ICAqLworCisgICAgY2FzZSBFVElSX1NfQ19PUFJfU0VMOgorICAgICAgaWYgKChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCkgJiAweDAxTCkKKwkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgZWxzZQorCXsKKwkgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKW9wMSwgLTEpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbiAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfT1BSX1JFREVGOgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICBicmVhazsKKworICAgICAgLyogZGVmaW5lIGEgbGl0ZXJhbCAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfT1BSX0RGTElUOgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfREZMSVQ6IE5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIE9QUiBjbWQgJWQiKSwgY21kKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBjb250cm9sIGNvbW1hbmRzCisgIAorICAgc2VlIHRhYmxlIEItMTEgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KKworc3RhdGljIGJvb2xlYW4KK2V0aXJfY3RsIChhYmZkLCBjbWQsIHB0cikKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgY21kOworICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Cit7CisgIHVxdWFkCSBkdW1teTsKKyAgaW50IHBzZWN0OworCisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9jdGwgJWQvJXhcbiIsIGNtZCwgY21kKTsKKyAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7CisjZW5kaWYKKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgICAvKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCisJIGFyZzogLSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NFVFJCOgorICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7CisgICAgICBpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlOiBpbmNyZW1lbnQgaW1hZ2UgbG9jYXRpb24gY291bnRlciBieSBvZmZzZXQKKwkgYXJnOiBsdwlvZmZzZXQgdmFsdWUgICovCisKKyAgICBjYXNlIEVUSVJfU19DX0NUTF9BVUdSQjoKKyAgICAgIGR1bW15ID0gYmZkX2dldGwzMiAocHRyKTsKKyAgICAgIGltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBkZWZpbmUgbG9jYXRpb246IHBvcCBpbmRleCwgc2F2ZSBsb2NhdGlvbiBjb3VudGVyIHVuZGVyIGluZGV4CisJIGFyZzogLSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfQ1RMX0RGTE9DOgorICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworICAgICAgLyogRklYTUUgKi8KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKKwkgYXJnOiAtICAqLworCisgICAgY2FzZSBFVElSX1NfQ19DVExfU1RMT0M6CisgICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKyAgICAgIC8qIEZJWE1FICovCisgICAgICBicmVhazsKKworICAgICAgLyogc3RhY2sgZGVmaW5lZCBsb2NhdGlvbjogcG9wIGluZGV4LCBwdXNoIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAorCSBhcmc6IC0gICovCisKKyAgICBjYXNlIEVUSVJfU19DX0NUTF9TVEtETDoKKyAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOworICAgICAgLyogRklYTUUgKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBjbWQpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBzdG9yZSBjb25kaXRpb25hbCBjb21tYW5kcworICAKKyAgIHNlZSB0YWJsZSBCLTEyIGFuZCBCLTEzIG9mIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgICovCisKK3N0YXRpYyBib29sZWFuCitldGlyX3N0YyAoYWJmZCwgY21kLCBwdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IGNtZDsKKyAgICAgdW5zaWduZWQgY2hhciAqcHRyOworeworCisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICg1LCAiZXRpcl9zdGMgJWQvJXhcbiIsIGNtZCwgY21kKTsKKyAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7CisjZW5kaWYKKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgICAvKiAyMDAgU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyCisJIGFyZzogICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUQ19MUDoKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0xQOiBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIDIwMSBTdG9yZS1jb25kaXRpb25hbCBMaW5rYWdlIFBhaXIgd2l0aCBQcm9jZWR1cmUgU2lnbmF0dXJlCisJIGFyZzoJbHcJbGlua2FnZSBpbmRleAorCSBjcwlwcm9jZWR1cmUgbmFtZQorCSBieQlzaWduYXR1cmUgbGVuZ3RoCisJIGRhCXNpZ25hdHVyZSAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xQX1BTQjoKKyAgICAgIGltYWdlX2luY19wdHIgKGFiZmQsIDE2KTsJLyogc2tpcCBlbnRyeSxwcm9jdmFsICovCisgICAgICBicmVhazsKKworICAgICAgLyogMjAyIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgZ2xvYmFsIGFkZHJlc3MKKwkgYXJnOglsdwlsaW5rYWdlIGluZGV4CisJIGNzCWdsb2JhbCBuYW1lICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVENfR0JMOgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfR0JMOiBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIDIwMyBTdG9yZS1jb25kaXRpb25hbCBDb2RlIEFkZHJlc3MgYXQgZ2xvYmFsIGFkZHJlc3MKKwkgYXJnOglsdwlsaW5rYWdlIGluZGV4CisJIGNzCXByb2NlZHVyZSBuYW1lICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVENfR0NBOgorICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVENfR0NBOiBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIDIwNCBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IHBzZWN0ICsgb2Zmc2V0CisJIGFyZzoJbHcJbGlua2FnZSBpbmRleAorCSBsdwlwc2VjdCBpbmRleAorCSBxdwlvZmZzZXQgICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUQ19QUzoKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX1BTOiBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIDIwNSBTdG9yZS1jb25kaXRpb25hbCBOT1AgYXQgYWRkcmVzcyBvZiBnbG9iYWwKKwkgYXJnOiAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RDX05PUF9HQkw6CisKKyAgICAgIC8qIDIwNiBTdG9yZS1jb25kaXRpb25hbCBOT1AgYXQgcGVjdCArIG9mZnNldAorCSBhcmc6ICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVENfTk9QX1BTOgorCisgICAgICAvKiAyMDcgU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IGdsb2JhbCBhZGRyZXNzCisJIGFyZzogICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUQ19CU1JfR0JMOgorCisgICAgICAvKiAyMDggU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQKKwkgYXJnOiAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JTUl9QUzoKKworICAgICAgLyogMjA5IFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcworCSBhcmc6ICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVENfTERBX0dCTDoKKworICAgICAgLyogMjEwIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBwc2VjdCArIG9mZnNldAorCSBhcmc6ICAqLworCisgICAgY2FzZSBFVElSX1NfQ19TVENfTERBX1BTOgorCisgICAgICAvKiAyMTEgU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgZ2xvYmFsIGFkZHJlc3MKKwkgYXJnOiAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RDX0JPSF9HQkw6CisKKyAgICAgIC8qIDIxMiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBwZWN0ICsgb2Zmc2V0CisJIGFyZzogICovCisKKyAgICBjYXNlIEVUSVJfU19DX1NUQ19CT0hfUFM6CisKKyAgICAgIC8qIDIxMyBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgZ2xvYmFsIGFkZHJlc3MKKwkgYXJnOiAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RDX05CSF9HQkw6CisKKyAgICAgIC8qIDIxNCBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQKKwkgYXJnOiAgKi8KKworICAgIGNhc2UgRVRJUl9TX0NfU1RDX05CSF9QUzoKKy8qIEZJWE1FICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJFVElSX1NfQ19TVENfeHg6ICglZCkgbm90IHN1cHBvcnRlZCIsIGNtZCk7ICovCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisjaWYgVk1TX0RFQlVHCisgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgICJSZXNlcnZlZCBTVEMgY21kICVkIiwgY21kKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCitzdGF0aWMgYXNlY3Rpb24gKgorbmV3X3NlY3Rpb24gKGFiZmQsIGlkeCkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgaWR4OworeworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgY2hhciBzbmFtZVsxNl07CisgIGNoYXIgKm5hbWU7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDUsICAibmV3X3NlY3Rpb24gJWRcbiIsIGlkeCk7CisjZW5kaWYKKyAgc3ByaW50ZiAoc25hbWUsIFNFQ1RJT05fTkFNRV9URU1QTEFURSwgaWR4KTsKKworICBuYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzbmFtZSkgKyAxKTsKKyAgaWYgKG5hbWUgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgc3RyY3B5IChuYW1lLCBzbmFtZSk7CisKKyAgc2VjdGlvbiA9IGJmZF9tYWxsb2MgKHNpemVvZiAoYXNlY3Rpb24pKTsKKyAgaWYgKHNlY3Rpb24gPT0gMCkKKyAgICB7CisjaWYgVk1TX0RFQlVHCisgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNiwgICJiZmRfbWFrZV9zZWN0aW9uICglcykgZmFpbGVkIiwgbmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBzZWN0aW9uLT5fcmF3X3NpemUgPSAwOworICBzZWN0aW9uLT52bWEgPSAwOworICBzZWN0aW9uLT5jb250ZW50cyA9IDA7CisgIHNlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IDA7CisgIHNlY3Rpb24tPm5hbWUgPSBuYW1lOworICBzZWN0aW9uLT5pbmRleCA9IGlkeDsKKworICByZXR1cm4gc2VjdGlvbjsKK30KKworCitzdGF0aWMgaW50CithbGxvY19zZWN0aW9uIChhYmZkLCBpZHgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IGlkeDsKK3sKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDQsICAiYWxsb2Nfc2VjdGlvbiAlZFxuIiwgaWR4KTsKKyNlbmRpZgorCisgIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKKwkJICAgIGJmZF9yZWFsbG9jIChQUklWKHNlY3Rpb25zKSwgKGlkeCsxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKKyAgaWYgKFBSSVYoc2VjdGlvbnMpID09IDApCisgICAgcmV0dXJuIC0xOworCisgIHdoaWxlIChQUklWKHNlY3Rpb25fY291bnQpIDw9IGlkeCkKKyAgICB7CisgICAgICBQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9IG5ld19zZWN0aW9uIChhYmZkLCBQUklWKHNlY3Rpb25fY291bnQpKTsKKyAgICAgIGlmIChQUklWKHNlY3Rpb25zKVtQUklWKHNlY3Rpb25fY291bnQpXSA9PSAwKQorCXJldHVybiAtMTsKKyAgICAgIFBSSVYoc2VjdGlvbl9jb3VudCkrKzsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHRpcl9zdGEKKyAqCisgKiB2YXggc3RhY2sgY29tbWFuZHMKKyAqCisgKiBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgorICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCisgKgorICogc2VlIHRhYmxlIDctMyBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordGlyX3N0YSAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCit7CisgIGludCBjbWQgPSAqcHRyKys7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RhICVkXG4iLCBjbWQpOworI2VuZGlmCisKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAvKiBzdGFjayAqLworICAgICAgY2FzZSBUSVJfU19DX1NUQV9HQkw6CisJLyoKKwkgKiBzdGFjayBnbG9iYWwKKwkgKiBhcmc6IGNzCXN5bWJvbCBuYW1lCisJICoKKwkgKiBzdGFjayAzMiBiaXQgdmFsdWUgb2Ygc3ltYm9sIChoaWdoIGJpdHMgc2V0IHRvIDApCisJICovCisJeworCSAgY2hhciAqbmFtZTsKKwkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OworCisJICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKKworICAgICAgICAgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKKwkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCisJICAgIHJldHVybiAwOworCisJICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykoZW50cnktPnN5bWJvbC0+dmFsdWUpLCAtMSk7CisJICBwdHIgKz0gKnB0ciArIDE7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfU0I6CisJLyoKKwkgKiBzdGFjayBzaWduZWQgYnl0ZQorCSAqIGFyZzogYnkJdmFsdWUKKwkgKgorCSAqIHN0YWNrIGJ5dGUgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAorCSAqLworCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKSpwdHIrKywgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfU1c6CisJLyoKKwkgKiBzdGFjayBzaWduZWQgc2hvcnQgd29yZAorCSAqIGFyZzogc2gJdmFsdWUKKwkgKgorCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZSwgc2lnbiBleHRlbmQgdG8gMzIgYml0CisJICovCisJX2JmZF92bXNfcHVzaCAoYWJmZCwgKGxvbmcpYmZkX2dldGwxNihwdHIpLCAtMSk7CisJcHRyICs9IDI7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUQV9MVzoKKwkvKgorCSAqIHN0YWNrIHNpZ25lZCBsb25nd29yZAorCSAqIGFyZzogbHcJdmFsdWUKKwkgKgorCSAqIHN0YWNrIDMyIGJpdCB2YWx1ZQorCSAqLworCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKKwlwdHIgKz0gNDsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfU1RBX1BCOgorICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUEI6CisJLyoKKwkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgYnl0ZSBvZmZzZXQgKHdvcmQgaW5kZXgpCisJICogYXJnOiBieQlzZWN0aW9uIGluZGV4CisJICoJKHNoCXNlY3Rpb24gaW5kZXgpCisJICoJYnkJc2lnbmVkIGJ5dGUgb2Zmc2V0CisJICoKKwkgKi8KKyAgCXsKKwkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7CisJICBpbnQgcHNlY3Q7CisKKwkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEIpCisJICAgIHBzZWN0ID0gKnB0cisrOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7CisJICAgICAgcHRyICs9IDI7CisJICAgIH0KKworCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCisJICAgIHsKKwkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7CisJICAgIH0KKworCSAgZHVtbXkgPSAobG9uZykqcHRyKys7CisJICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOworCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfUFc6CisgICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQVzoKKwkvKgorCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyB3b3JkIG9mZnNldCAod29yZCBpbmRleCkKKwkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKKwkgKgkoc2gJc2VjdGlvbiBpbmRleCkKKwkgKglzaAlzaWduZWQgc2hvcnQgb2Zmc2V0CisJICoKKwkgKi8KKyAgCXsKKwkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7CisJICBpbnQgcHNlY3Q7CisKKwkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUFcpCisJICAgIHBzZWN0ID0gKnB0cisrOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7CisJICAgICAgcHRyICs9IDI7CisJICAgIH0KKworCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCisJICAgIHsKKwkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7CisJICAgIH0KKworCSAgZHVtbXkgPSBiZmRfZ2V0bDE2KHB0cik7IHB0cis9MjsKKwkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7CisJICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUQV9QTDoKKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BMOgorCS8qCisJICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGxvbmcgb2Zmc2V0ICh3b3JkIGluZGV4KQorCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAorCSAqCShzaAlzZWN0aW9uIGluZGV4KQorCSAqCWx3CXNpZ25lZCBsb25nd29yZCBvZmZzZXQKKwkgKgorCSAqLworICAJeworCSAgdW5zaWduZWQgbG9uZyBkdW1teTsKKwkgIGludCBwc2VjdDsKKworCSAgaWYgKGNtZCA9PSBUSVJfU19DX1NUQV9QTCkKKwkgICAgcHNlY3QgPSAqcHRyKys7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwc2VjdCA9IGJmZF9nZXRsMTYocHRyKTsKKwkgICAgICBwdHIgKz0gMjsKKwkgICAgfQorCisJICBpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKKwkgICAgeworCSAgICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKKwkgICAgfQorCisJICBkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7IHB0ciArPSA0OworCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKKwkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfU1RBX1VCOgorCS8qCisJICogc3RhY2sgdW5zaWduZWQgYnl0ZQorCSAqIGFyZzogYnkJdmFsdWUKKwkgKgorCSAqIHN0YWNrIGJ5dGUgdmFsdWUKKwkgKi8KKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykqcHRyKyssIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfU1RBX1VXOgorCS8qCisJICogc3RhY2sgdW5zaWduZWQgc2hvcnQgd29yZAorCSAqIGFyZzogc2gJdmFsdWUKKwkgKgorCSAqIHN0YWNrIDE2IGJpdCB2YWx1ZQorCSAqLworCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOworCXB0ciArPSAyOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfQkZJOgorCS8qCisJICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCisJICogYXJnOiAtCisJICoKKwkgKi8KKwkvKkZBTExUSFJVKi8KKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfV0ZJOgorCS8qCisJICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCisJICogYXJnOiAtCisJICoKKwkgKi8KKwkvKkZBTExUSFJVKi8KKyAgICAgIGNhc2UgVElSX1NfQ19TVEFfTEZJOgorCS8qCisJICogc3RhY2sgYnl0ZSBmcm9tIGltYWdlCisJICogYXJnOiAtCisJICoKKwkgKi8KKyAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIpKTsKKwlyZXR1cm4gTlVMTDsKKworICAgICAgY2FzZSBUSVJfU19DX1NUQV9FUE06CisJLyoKKwkgKiBzdGFjayBlbnRyeSBwb2ludCBtYXNrCisJICogYXJnOiBjcwlzeW1ib2wgbmFtZQorCSAqCisJICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAorCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKKwkgKi8KKwl7CisJICBjaGFyICpuYW1lOworCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7CisKKwkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOworCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOworCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKKwkgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOworCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKKwkgIHB0ciArPSAqcHRyICsgMTsKKwl9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUQV9DS0FSRzoKKwkvKgorCSAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50CisJICogYXJnOiBjcwlzeW1ib2wgbmFtZQorCSAqCWJ5CWFyZ3VtZW50IGluZGV4CisJICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgorCSAqCisJICogY29tcGFyZSBhcmd1bWVudCBkZXNjcmlwdG9yIHdpdGggc3ltYm9sIGFyZ3VtZW50IChBUkckVl9QQVNTTUVDSCkKKwkgKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKKwkgKi8KKyAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJQQVNTTUVDSCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgMUwsIC0xKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUQV9MU1k6CisJLyoKKwkgKiBzdGFjayBsb2NhbCBzeW1ib2wgdmFsdWUKKwkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4CisJICoJY3MJc3ltYm9sIG5hbWUKKwkgKi8KKwl7CisJICBpbnQgZW52aWR4OworCSAgY2hhciAqbmFtZTsKKwkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OworCisJICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOworCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CisJICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7CisJICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQorCSAgICByZXR1cm4gMDsKKyAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7CisJICBfYmZkX3Ztc19wdXNoIChhYmZkLCAwTCwgLTEpOworCSAgcHRyICs9ICpwdHIgKyAxOworCX0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfU1RBX0xJVDoKKwkvKgorCSAqIHN0YWNrIGxpdGVyYWwKKyAJICogYXJnOglieQlsaXRlcmFsIGluZGV4CisJICoKKwkgKiBzdGFjayBsaXRlcmFsCisJICovCisJcHRyKys7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKKwkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxpdGVyYWwgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOworCWJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfU1RBX0xFUE06CisJLyoKKwkgKiBzdGFjayBsb2NhbCBzeW1ib2wgZW50cnkgcG9pbnQgbWFzaworCSAqIGFyZzoJc2gJZW52aXJvbm1lbnQgaW5kZXgKKwkgKgljcwlzeW1ib2wgbmFtZQorCSAqCisJICogc3RhY2sgKHVuc2lnbmVkKSBlbnRyeSBwb2ludCBtYXNrIG9mIHN5bWJvbAorCSAqIGVyciBpZiBzeW1ib2wgaXMgbm8gZW50cnkgcG9pbnQKKwkgKi8KKwl7CisJICBpbnQgZW52aWR4OworCSAgY2hhciAqbmFtZTsKKwkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OworCisJICBlbnZpZHggPSBiZmRfZ2V0bDE2KHB0cik7IHB0ciArPSAyOworCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CisJICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7CisJICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQorCSAgICByZXR1cm4gMDsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stbG9jYWwtc3ltYm9sLWVudHJ5LXBvaW50LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOworCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKKwkgIHB0ciArPSAqcHRyICsgMTsKKwl9CisgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKwkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIFNUQSBjbWQgJWQiKSwgcHRyWy0xXSk7CisJcmV0dXJuIE5VTEw7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBwdHI7Cit9CisKKworLyoKKyAqIHRpcl9zdG8KKyAqCisgKiB2YXggc3RvcmUgY29tbWFuZHMKKyAqCisgKiBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiB0aXIgc2VjdGlvbgorICogcHRyIHBvaW50cyB0byBkYXRhIGFyZWEgaW4gcmVjb3JkCisgKgorICogc2VlIHRhYmxlIDctNCBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordGlyX3N0byAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCit7CisgIHVuc2lnbmVkIGxvbmcgZHVtbXk7CisgIGludCBzaXplOworICBpbnQgcHNlY3Q7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfc3RvICVkXG4iLCAqcHRyKTsKKyNlbmRpZgorCisgIHN3aXRjaCAoKnB0cisrKQorICAgIHsKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fU0I6CisJLyoKKwkgKiBzdG9yZSBzaWduZWQgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCisJICogYXJnOiAtCisJICovCisJZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7CisJaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsJLyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUT19TVzoKKwkvKgorCSAqIHN0b3JlIHNpZ25lZCB3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIHdvcmQKKwkgKiBhcmc6IC0KKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fTFc6CisJLyoKKwkgKiBzdG9yZSBsb25nd29yZDogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAorCSAqIGFyZzogLQorCSAqLworCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOworCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUT19CRDoKKwkvKgorCSAqIHN0b3JlIGJ5dGUgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYysxLCB3cml0ZSBieXRlCisJICogYXJnOiAtCisJICovCisJZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7CisJZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyAxKTsKKwlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fV0Q6CisJLyoKKwkgKiBzdG9yZSB3b3JkIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMiwgd3JpdGUgd29yZAorCSAqIGFyZzogLQorCSAqLworCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOworCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMik7CisJaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLworICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX0xEOgorCS8qCisJICogc3RvcmUgbG9uZyBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzQsIHdyaXRlIGxvbmcKKwkgKiBhcmc6IC0KKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDQpOworCWltYWdlX3dyaXRlX2wgKGFiZmQsIGR1bW15ICYgMHhmZmZmZmZmZik7LyogRklYTUU6IGNoZWNrIHRvcCBiaXRzICovCisgICAgICBicmVhazsKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fTEk6CisJLyoKKwkgKiBzdG9yZSBzaG9ydCBsaXRlcmFsOiBwb3Agc3RhY2ssIHdyaXRlIGJ5dGUKKwkgKiBhcmc6IC0KKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLworICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJRFI6CisJLyoKKwkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBkYXRhIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAorCSAqIGFyZzogLQorCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1BJQ1I6CisJLyoKKwkgKiBzdG9yZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHJlZmVyZW5jZTogcG9wIHN0YWNrLCB3cml0ZSBsb25nd29yZAorCSAqIGFyZzogLQorCSAqIEZJWE1FOiBpbmNvbXBsZXRlICEKKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlpbWFnZV93cml0ZV9iIChhYmZkLCAweDlmKTsKKwlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1JJVkI6CisJLyoKKwkgKiBzdG9yZSByZXBlYXRlZCBpbW1lZGlhdGUgdmFyaWFibGUgYnl0ZXMKKwkgKiAxLWJ5dGUgY291bnQgbiBmaWVsZCBmb2xsb3dlZCBieSBuIGJ5dGVzIG9mIGRhdGEKKwkgKiBwb3Agc3RhY2ssIHdyaXRlIG4gYnl0ZXMgPHN0YWNrPiB0aW1lcworCSAqLworCXNpemUgPSAqcHRyKys7CisJZHVtbXkgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCXdoaWxlIChkdW1teS0tID4gMEwpCisJICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIHNpemUsIDApOworCXB0ciArPSBzaXplOworCWJyZWFrOworICAgICAgY2FzZSBUSVJfU19DX1NUT19COgorCS8qCisJICogc3RvcmUgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAorCSAqLworCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOworCWJyZWFrOworICAgICAgY2FzZSBUSVJfU19DX1NUT19XOgorCS8qCisJICogc3RvcmUgd29yZCBmcm9tIHRvcCBsb25nd29yZAorCSAqLworCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CisJYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1JCOgorCS8qCisJICogc3RvcmUgcmVwZWF0ZWQgYnl0ZSBmcm9tIHRvcCBsb25nd29yZAorCSAqLworCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CisJYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1JXOgorCS8qCisJICogc3RvcmUgcmVwZWF0ZWQgd29yZCBmcm9tIHRvcCBsb25nd29yZAorCSAqLworCXNpemUgPSAodW5zaWduZWQgbG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkgIGltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX1NUT19SU0I6CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1JTVzoKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fUkw6CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1ZQUzoKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNCOgorICAgICAgY2FzZSBUSVJfU19DX1NUT19VU1c6CisgICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVQjoKKyAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlVXOgorICAgICAgY2FzZSBUSVJfU19DX1NUT19QSVJSOgorCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5pbXBsZW1lbnRlZCBTVE8gY21kICVkIiksIHB0clstMV0pOworICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVE8gY21kICVkIiksIHB0clstMV0pOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcHRyOworfQorCisKKy8qCisgKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcworICogYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYworICogYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgorICogYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCisgKgorICogc2VlIHRhYmxlIDctNSBvZiB0aGUgVkFYL1ZNUyBsaW5rZXIgbWFudWFsCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordGlyX29wciAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCit7CisgIGxvbmcgb3AxLCBvcDI7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfb3ByICVkXG4iLCAqcHRyKTsKKyNlbmRpZgorCisgIHN3aXRjaCAoKnB0cisrKQorICAgIHsKKyAgLyogb3BlcmF0aW9uICovCisgICAgICBjYXNlIFRJUl9TX0NfT1BSX05PUDoKKwkvKgorCSAqIG5vLW9wCisJICovCisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX09QUl9BREQ6CisJLyoKKwkgKiBhZGQKKwkgKi8KKwlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSArIG9wMiksIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfT1BSX1NVQjoKKwkvKgorCSAqIHN1YnRyYWN0CisJICovCisJb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLSBvcDEpLCAtMSk7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX09QUl9NVUw6CisJLyoKKwkgKiBtdWx0aXBseQorCSAqLworCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICogb3AyKSwgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19PUFJfRElWOgorCS8qCisJICogZGl2aWRlCisJICovCisJb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCWlmIChvcDIgPT0gMCkKKwkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKTBMLCAtMSk7CisJZWxzZQorCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMiAvIG9wMSksIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfT1BSX0FORDoKKwkvKgorCSAqIGxvZ2ljYWwgYW5kCisJICovCisJb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgJiBvcDIpLCAtMSk7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX09QUl9JT1I6CisJb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwkvKgorCSAqIGxvZ2ljYWwgaW5jbHVzaXZlIG9yCisJICovCisJb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIHwgb3AyKSwgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19PUFJfRU9SOgorCS8qCisJICogbG9naWNhbCBleGNsdXNpdmUgb3IKKwkgKi8KKwlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIG9wMiksIC0xKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfT1BSX05FRzoKKwkvKgorCSAqIG5lZ2F0ZQorCSAqLworCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKC1vcDEpLCAtMSk7CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX09QUl9DT006CisJLyoKKwkgKiBjb21wbGVtZW50CisJICovCisJb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxIF4gLTFMKSwgLTEpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU5TVjoKKwkvKgorCSAqIGluc2VydCBmaWVsZAorCSAqLworCSh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpICAoIlRJUl9TX0NfT1BSX0lOU1YgaW5jb21wbGV0ZSIpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19PUFJfQVNIOgorCS8qCisJICogYXJpdGhtZXRpYyBzaGlmdAorCSAqLworCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlpZiAoSElHSEJJVChvcDEpKQkJLyogc2hpZnQgcmlnaHQgKi8KKwkgIG9wMiA+Pj0gb3AxOworCWVsc2UJCQkvKiBzaGlmdCBsZWZ0ICovCisJICBvcDIgPDw9IG9wMTsKKwlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZylvcDIsIC0xKTsKKwkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfT1BSX0FTSCBpbmNvbXBsZXRlIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19PUFJfVVNIOgorCS8qCisJICogdW5zaWduZWQgc2hpZnQKKwkgKi8KKwlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCisJICBvcDIgPj49IG9wMTsKKwllbHNlCQkJLyogc2hpZnQgbGVmdCAqLworCSAgb3AyIDw8PSBvcDE7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9VU0ggaW5jb21wbGV0ZSIpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfT1BSX1JPVDoKKwkvKgorCSAqIHJvdGF0ZQorCSAqLworCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7CisJb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwlpZiAoSElHSEJJVCgwKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCisJICBvcDIgPj49IG9wMTsKKwllbHNlCQkJLyogc2hpZnQgbGVmdCAqLworCSAgb3AyIDw8PSBvcDE7CisJX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ST1QgaW5jb21wbGV0ZSIpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRJUl9TX0NfT1BSX1NFTDoKKwkvKgorCSAqIHNlbGVjdAorCSAqLworCWlmICgobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpICYgMHgwMUwpCisJICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOworCWVsc2UKKwkgIHsKKwkgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwkgICAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwkgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AxLCAtMSk7CisJICB9CisgICAgICBicmVhazsKKworICAgICAgY2FzZSBUSVJfU19DX09QUl9SRURFRjoKKwkvKgorCSAqIHJlZGVmaW5lIHN5bWJvbCB0byBjdXJyZW50IGxvY2F0aW9uCisJICovCisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9SRURFRiBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVElSX1NfQ19PUFJfREZMSVQ6CisJLyoKKwkgKiBkZWZpbmUgYSBsaXRlcmFsCisJICovCisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9ERkxJVCBub3Qgc3VwcG9ydGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBPUFIgY21kICVkIiksIHB0clstMV0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBwdHI7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordGlyX2N0bCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCisvKgorICogY29udHJvbCBjb21tYW5kcworICoKKyAqIHNlZSB0YWJsZSA3LTYgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAorICovCit7CisgIHVuc2lnbmVkIGxvbmcgZHVtbXk7CisgIGludCBwc2VjdDsKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNSwgInRpcl9jdGwgJWRcbiIsICpwdHIpOworI2VuZGlmCisKKyAgc3dpdGNoICgqcHRyKyspCisgICAgeworICAgICAgY2FzZSBUSVJfU19DX0NUTF9TRVRSQjoKKwkvKgorCSAqIHNldCByZWxvY2F0aW9uIGJhc2U6IHBvcCBzdGFjaywgc2V0IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIKKwkgKiBhcmc6IC0KKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwlpZiAocHNlY3QgPj0gUFJJVihzZWN0aW9uX2NvdW50KSkKKwkgIHsKKwkgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOworCSAgfQorCWltYWdlX3NldF9wdHIgKGFiZmQsIHBzZWN0LCBkdW1teSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgVElSX1NfQ19DVExfQVVHUkI6CisJLyoKKwkgKiBhdWdtZW50IHJlbG9jYXRpb24gYmFzZTogaW5jcmVtZW50IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIgYnkgb2Zmc2V0CisJICogYXJnOiBsdwlvZmZzZXQgdmFsdWUKKwkgKi8KKwlkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7CisJaW1hZ2VfaW5jX3B0ciAoYWJmZCwgZHVtbXkpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJUl9TX0NfQ1RMX0RGTE9DOgorCS8qCisJICogZGVmaW5lIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHNhdmUgbG9jYXRpb24gY291bnRlciB1bmRlciBpbmRleAorCSAqIGFyZzogLQorCSAqLworCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKKwkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSBUSVJfU19DX0NUTF9TVExPQzoKKwkvKgorCSAqIHNldCBsb2NhdGlvbjogcG9wIGluZGV4LCByZXN0b3JlIGxvY2F0aW9uIGNvdW50ZXIgZnJvbSBpbmRleAorCSAqIGFyZzogLQorCSAqLworCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOworCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19DVExfU1RMT0Mgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUSVJfU19DX0NUTF9TVEtETDoKKwkvKgorCSAqIHN0YWNrIGRlZmluZWQgbG9jYXRpb246IHBvcCBpbmRleCwgcHVzaCBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKKwkgKiBhcmc6IC0KKwkgKi8KKwlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKKwkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgQ1RMIGNtZCAlZCIpLCBwdHJbLTFdKTsKKwlicmVhazsKKyAgfQorICByZXR1cm4gcHRyOworfQorCisKKy8qCisgKiBoYW5kbGUgY29tbWFuZCBmcm9tIFRJUiBzZWN0aW9uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgordGlyX2NtZCAoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpwdHIpCit7CisgIHN0cnVjdCB7CisgICAgaW50IG1pbmNvZDsKKyAgICBpbnQgbWF4Y29kOworICAgIHVuc2lnbmVkIGNoYXIgKiAoKmV4cGxhaW4pKGJmZCAqLCB1bnNpZ25lZCBjaGFyICopOworICB9IHRpcl90YWJsZVtdID0geworICAgIHsgMCwJCSBUSVJfU19DX01BWFNUQUNPRCwgdGlyX3N0YSB9CisgICAseyBUSVJfU19DX01JTlNUT0NPRCwgVElSX1NfQ19NQVhTVE9DT0QsIHRpcl9zdG8gfQorICAgLHsgVElSX1NfQ19NSU5PUFJDT0QsIFRJUl9TX0NfTUFYT1BSQ09ELCB0aXJfb3ByIH0KKyAgICx7IFRJUl9TX0NfTUlOQ1RMQ09ELCBUSVJfU19DX01BWENUTENPRCwgdGlyX2N0bCB9CisgICAseyAtMSwgLTEsIE5VTEwgfQorICB9OworICBpbnQgaSA9IDA7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDQsICJ0aXJfY21kICVkLyV4XG4iLCAqcHRyLCAqcHRyKTsKKyAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7CisjZW5kaWYKKworICBpZiAoKnB0ciAmIDB4ODApCQkJCS8qIHN0b3JlIGltbWVkaWF0ZSAqLworICAgIHsKKyAgICAgIGkgPSAxMjggLSAoKnB0cisrICYgMHg3Zik7CisgICAgICBpbWFnZV9kdW1wIChhYmZkLCBwdHIsIGksIDApOworICAgICAgcHRyICs9IGk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKHRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKKwl7CisJICBpZiAoICh0aXJfdGFibGVbaV0ubWluY29kIDw9ICpwdHIpIAorCSAgICAmJiAoKnB0ciA8PSB0aXJfdGFibGVbaV0ubWF4Y29kKSkKKwkgICAgeworCSAgICAgIHB0ciA9IHRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBwdHIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpKys7CisJfQorICAgICAgaWYgKHRpcl90YWJsZVtpXS5taW5jb2QgPCAwKQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqIGNvZGUgJWQgbm90IGZvdW5kIiksICpwdHIpOworCSAgcHRyID0gMDsKKwl9CisgICAgfQorCisgIHJldHVybiBwdHI7Cit9CisKKworLyogaGFuZGxlIGNvbW1hbmQgZnJvbSBFVElSIHNlY3Rpb24gICovCisKK3N0YXRpYyBpbnQKK2V0aXJfY21kIChhYmZkLCBjbWQsIHB0cikKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgY21kOworICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Cit7CisgIHN0YXRpYyBzdHJ1Y3QgeworICAgIGludCBtaW5jb2Q7CisgICAgaW50IG1heGNvZDsKKyAgICBib29sZWFuICgqZXhwbGFpbikgUEFSQU1TKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICopKTsKKyAgfSBldGlyX3RhYmxlW10gPSB7CisgICAgeyBFVElSX1NfQ19NSU5TVEFDT0QsIEVUSVJfU19DX01BWFNUQUNPRCwgZXRpcl9zdGEgfSwKKyAgICB7IEVUSVJfU19DX01JTlNUT0NPRCwgRVRJUl9TX0NfTUFYU1RPQ09ELCBldGlyX3N0byB9LAorICAgIHsgRVRJUl9TX0NfTUlOT1BSQ09ELCBFVElSX1NfQ19NQVhPUFJDT0QsIGV0aXJfb3ByIH0sCisgICAgeyBFVElSX1NfQ19NSU5DVExDT0QsIEVUSVJfU19DX01BWENUTENPRCwgZXRpcl9jdGwgfSwKKyAgICB7IEVUSVJfU19DX01JTlNUQ0NPRCwgRVRJUl9TX0NfTUFYU1RDQ09ELCBldGlyX3N0YyB9LAorICAgIHsgLTEsIC0xLCBOVUxMIH0KKyAgfTsKKworICBpbnQgaSA9IDA7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZCAlZC8leFxuIiwgY21kLCBjbWQpOworICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKKyNlbmRpZgorCisgIHdoaWxlIChldGlyX3RhYmxlW2ldLm1pbmNvZCA+PSAwKQorICAgIHsKKyAgICAgIGlmICggKGV0aXJfdGFibGVbaV0ubWluY29kIDw9IGNtZCkgCisJJiYgKGNtZCA8PSBldGlyX3RhYmxlW2ldLm1heGNvZCkpCisJeworCSAgaWYgKCFldGlyX3RhYmxlW2ldLmV4cGxhaW4gKGFiZmQsIGNtZCwgcHRyKSkKKwkgICAgcmV0dXJuIC0xOworCSAgYnJlYWs7CisJfQorICAgICAgaSsrOworICAgIH0KKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImV0aXJfY21kOiA9IDBcbiIpOworI2VuZGlmCisgIHJldHVybiAwOworfQorCisKKy8qIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAoT0JKJENfVElSKQorICAgaGFuZGxlIHRpciByZWNvcmQgICovCisKK3N0YXRpYyBpbnQKK2FuYWx5emVfdGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKKyAgICAgYmZkICphYmZkOworICAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Cit7CisgIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfdGlyOiAlZCBieXRlc1xuIiwgbGVuZ3RoKTsKKyNlbmRpZgorCisgIG1heHB0ciA9IHB0ciArIGxlbmd0aDsKKworICB3aGlsZSAocHRyIDwgbWF4cHRyKQorICAgIHsKKyAgICAgIHB0ciA9IHRpcl9jbWQgKGFiZmQsIHB0cik7CisgICAgICBpZiAocHRyID09IDApCisJcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCisvKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKEVPQkokQ19FVElSKQorICAgaGFuZGxlIGV0aXIgcmVjb3JkICAqLworCitzdGF0aWMgaW50CithbmFseXplX2V0aXIgKGFiZmQsIHB0ciwgbGVuZ3RoKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKKyAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKK3sKKyAgaW50IGNtZDsKKyAgdW5zaWduZWQgY2hhciAqbWF4cHRyOworICBpbnQgcmVzdWx0ID0gMDsKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7CisjZW5kaWYKKworICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7CisKKyAgd2hpbGUgKHB0ciA8IG1heHB0cikKKyAgICB7CisgICAgICBjbWQgPSBiZmRfZ2V0bDE2IChwdHIpOworICAgICAgbGVuZ3RoID0gYmZkX2dldGwxNiAocHRyICsgMik7CisgICAgICByZXN1bHQgPSBldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIrNCk7CisgICAgICBpZiAocmVzdWx0ICE9IDApCisJYnJlYWs7CisgICAgICBwdHIgKz0gbGVuZ3RoOworICAgIH0KKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMywgImFuYWx5emVfZXRpcjogPSAlZFxuIiwgcmVzdWx0KTsKKyNlbmRpZgorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogcHJvY2VzcyBFVElSIHJlY29yZAorICAKKyAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLworCitpbnQKK19iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyAgaW50IHJlc3VsdDsKKworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRJUi9FVElSXG4iKTsKKyNlbmRpZgorCisgIHN3aXRjaCAob2JqdHlwZSkKKyAgICB7CisgICAgICBjYXNlIEVPQkpfU19DX0VUSVI6CisJUFJJVih2bXNfcmVjKSArPSA0OwkvKiBza2lwIHR5cGUsIHNpemUgKi8KKwlQUklWKHJlY19zaXplKSAtPSA0OworCXJlc3VsdCA9IGFuYWx5emVfZXRpciAoYWJmZCwgUFJJVih2bXNfcmVjKSwgUFJJVihyZWNfc2l6ZSkpOworCWJyZWFrOworICAgICAgY2FzZSBPQkpfU19DX1RJUjoKKwlQUklWKHZtc19yZWMpICs9IDE7CS8qIHNraXAgdHlwZSAqLworCVBSSVYocmVjX3NpemUpIC09IDE7CisJcmVzdWx0ID0gYW5hbHl6ZV90aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcmVzdWx0ID0gLTE7CisJYnJlYWs7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogcHJvY2VzcyBFREJHIHJlY29yZAorICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAgCisgICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLworCitpbnQKK19iZmRfdm1zX3NsdXJwX2RiZyAoYWJmZCwgb2JqdHlwZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgb2JqdHlwZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDIsICJEQkcvRURCR1xuIik7CisjZW5kaWYKKworICBhYmZkLT5mbGFncyB8PSAoSEFTX0RFQlVHIHwgSEFTX0xJTkVOTyk7CisgIHJldHVybiAwOworfQorCisKKy8qIHByb2Nlc3MgRVRCVCByZWNvcmQKKyAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgIAorICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KKworaW50CitfYmZkX3Ztc19zbHVycF90YnQgKGFiZmQsIG9ianR5cGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IG9ianR5cGU7Cit7CisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICgyLCAiVEJUL0VUQlRcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogcHJvY2VzcyBMTksgcmVjb3JkCisgICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorICAKKyAgIG5vdCBpbXBsZW1lbnRlZCB5ZXQgICovCisKK2ludAorX2JmZF92bXNfc2x1cnBfbG5rIChhYmZkLCBvYmp0eXBlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBvYmp0eXBlOworeworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIkxOS1xuIik7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KKwwKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgkJCQkJCQkJCSovCisvKglXUklURSBFVElSIFNFQ1RJT04JCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJdGhpcyBpcyBzdGlsbCB1bmRlciBjb25zdHJ1Y3Rpb24gYW5kIHRoZXJlZm9yZSBub3QgZG9jdW1lbnRlZAkqLworLyoJCQkJCQkJCQkqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc3RhcnRfZXRpcl9yZWNvcmQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgaW5kZXgsIHVxdWFkIG9mZnNldCwgYm9vbGVhbiBqdXN0b2Zmc2V0KSk7CitzdGF0aWMgdm9pZCBzdG9faW1tIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm1zX3NlY3Rpb24gKnNwdHIsIGJmZF92bWEgdmFkZHIsIGludCBpbmRleCkpOworc3RhdGljIHZvaWQgZW5kX2V0aXJfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitzdGF0aWMgdm9pZAorc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIGluZGV4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIHZtc19zZWN0aW9uICpzcHRyOworICAgICBiZmRfdm1hIHZhZGRyOworICAgICBpbnQgaW5kZXg7Cit7CisgIGludCBzaXplOworICBpbnQgc3NpemU7CisgIHVuc2lnbmVkIGNoYXIgKmNwdHI7CisKKyNpZiBWTVNfREVCVUcKKyAgX2JmZF92bXNfZGVidWcgKDgsICJzdG9faW1tICVkIGJ5dGVzXG4iLCBzcHRyLT5zaXplKTsKKyAgX2JmZF9oZXhkdW1wICg5LCBzcHRyLT5jb250ZW50cywgKGludClzcHRyLT5zaXplLCAoaW50KXZhZGRyKTsKKyNlbmRpZgorCisgIHNzaXplID0gc3B0ci0+c2l6ZTsKKyAgY3B0ciA9IHNwdHItPmNvbnRlbnRzOworCisgIHdoaWxlIChzc2l6ZSA+IDApCisgICAgeworCisgICAgICBzaXplID0gc3NpemU7CQkJCS8qIHRyeSBhbGwgdGhlIHJlc3QgKi8KKworICAgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgc2l6ZSkgPCAwKQorCXsJCQkJCS8qIGRvZXNuJ3QgZml0LCBzcGxpdCAhICovCisJICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOworCSAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIGluZGV4LCB2YWRkciwgZmFsc2UpOworCSAgc2l6ZSA9IF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMCk7CS8qIGdldCBtYXggc2l6ZSAqLworCSAgaWYgKHNpemUgPiBzc2l6ZSkJCQkvKiBtb3JlIHRoYW4gd2hhdCdzIGxlZnQgPyAqLworCSAgICBzaXplID0gc3NpemU7CisJfQorCisgICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX1NUT19JTU0sIC0xKTsKKyAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoc2l6ZSkpOworICAgICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGNwdHIsIHNpemUpOworICAgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKworI2lmIFZNU19ERUJVRworICAgICAgX2JmZF92bXNfZGVidWcgKDEwLCAiZHVtcGVkICVkIGJ5dGVzXG4iLCBzaXplKTsKKyAgICAgIF9iZmRfaGV4ZHVtcCAoMTAsIGNwdHIsIChpbnQpc2l6ZSwgKGludCl2YWRkcik7CisjZW5kaWYKKworICAgICAgdmFkZHIgKz0gc2l6ZTsKKyAgICAgIHNzaXplIC09IHNpemU7CisgICAgICBjcHRyICs9IHNpemU7CisgICAgfQorCisgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc3RhcnQgRVRJUiByZWNvcmQgZm9yIHNlY3Rpb24gI2luZGV4IGF0IHZpcnR1YWwgYWRkciBvZmZzZXQuICAqLworCitzdGF0aWMgdm9pZAorc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIGluZGV4LCBvZmZzZXQsIGp1c3RvZmZzZXQpCisgICAgYmZkICphYmZkOworICAgIGludCBpbmRleDsKKyAgICB1cXVhZCBvZmZzZXQ7CisgICAgYm9vbGVhbiBqdXN0b2Zmc2V0OworeworICBpZiAoIWp1c3RvZmZzZXQpCisgICAgeworICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FVElSLCAtMSk7CS8qIG9uZSBFVElSIHBlciBzZWN0aW9uICovCisgICAgICBfYmZkX3Ztc19vdXRwdXRfcHVzaCAoYWJmZCk7CisgICAgfQorCisgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRVRJUl9TX0NfU1RBX1BRLCAtMSk7CS8qIHB1c2ggc3RhcnQgb2Zmc2V0ICovCisgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZylpbmRleCk7CisgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCAodXF1YWQpb2Zmc2V0KTsKKyAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKworICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX0NUTF9TRVRSQiwgLTEpOwkvKiBzdGFydCA9IHBvcCAoKSAqLworICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCisgIHJldHVybjsKK30KKworCisvKiBlbmQgZXRpciByZWNvcmQgICovCitzdGF0aWMgdm9pZAorZW5kX2V0aXJfcmVjb3JkIChhYmZkKQorICAgIGJmZCAqYWJmZDsKK3sKKyAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7CisgIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOyAKK30KKworLyogd3JpdGUgc2VjdGlvbiBjb250ZW50cyBmb3IgYmZkIGFiZmQgICovCisKK2ludAorX2JmZF92bXNfd3JpdGVfdGlyIChhYmZkLCBvYmp0eXBlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBvYmp0eXBlOworeworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgdm1zX3NlY3Rpb24gKnNwdHI7CisgIGludCBuZXh0b2Zmc2V0OworCisjaWYgVk1TX0RFQlVHCisgIF9iZmRfdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX3RpciAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7CisjZW5kaWYKKworICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA0KTsKKworICBuZXh0b2Zmc2V0ID0gMDsKKyAgUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPSAxOworCisgIC8qIGR1bXAgYWxsIG90aGVyIHNlY3Rpb25zICAqLworCisgIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKKworICB3aGlsZSAoc2VjdGlvbiAhPSBOVUxMKQorICAgIHsKKworI2lmIFZNU19ERUJVRworICAgICAgX2JmZF92bXNfZGVidWcgKDQsICJ3cml0aW5nICVkLiBzZWN0aW9uICclcycgKCVkIGJ5dGVzKVxuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIChpbnQpKHNlY3Rpb24tPl9yYXdfc2l6ZSkpOw0KKyNlbmRpZgorCisgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCisJeworCSAgaW50IGk7CisKKwkgIGlmICgoaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50KSA8PSAwKQorCSAgICB7CisJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTRUNfUkVMT0Mgd2l0aCBubyByZWxvY3MgaW4gc2VjdGlvbiAlcyIpLAorCQkJCSAgICAgc2VjdGlvbi0+bmFtZSk7CisJICAgIH0KKyNpZiBWTVNfREVCVUcKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFyZWxlbnQgKipycHRyOworCSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAiJWQgcmVsb2NhdGlvbnM6XG4iLCBpKTsKKwkgICAgICBycHRyID0gc2VjdGlvbi0+b3JlbG9jYXRpb247CisJICAgICAgd2hpbGUgKGktLSA+IDApCisJCXsKKwkJICBfYmZkX3Ztc19kZWJ1ZyAoNCwgInN5bSAlcyBpbiBzZWMgJXMsIHZhbHVlICUwOGx4LCBhZGRyICUwOGx4LCBvZmYgJTA4bHgsIGxlbiAlZDogJXNcbiIsCisJCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+bmFtZSwKKwkJCSAgICAgICgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uLT5uYW1lLAorCQkJICAgICAgKGxvbmcpKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPnZhbHVlLAorCQkJICAgICAgKCpycHRyKS0+YWRkcmVzcywgKCpycHRyKS0+YWRkZW5kLAorCQkJICAgICAgYmZkX2dldF9yZWxvY19zaXplKCgqcnB0ciktPmhvd3RvKSwKKwkJCSAgICAgICgqcnB0ciktPmhvd3RvLT5uYW1lKTsKKwkJICBycHRyKys7CisJCX0KKwkgICAgfQorI2VuZGlmCisJfQorCisgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykKKwkmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKKwl7CisJICBiZmRfdm1hIHZhZGRyOwkJLyogdmlydHVhbCBhZGRyIGluIHNlY3Rpb24gKi8KKworCSAgc3B0ciA9IF9iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBzZWN0aW9uLT5pbmRleCk7CisJICBpZiAoc3B0ciA9PSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKKwkgICAgICByZXR1cm4gLTE7CisJICAgIH0KKworCSAgdmFkZHIgPSAoYmZkX3ZtYSkoc3B0ci0+b2Zmc2V0KTsKKworCSAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsIHNlY3Rpb24tPmluZGV4LCAodXF1YWQpIHNwdHItPm9mZnNldCwKKwkJCSAgICAgZmFsc2UpOworCisJICB3aGlsZSAoc3B0ciAhPSBOVUxMKQkJCQkvKiBvbmUgU1RBX1BRLCBDVExfU0VUUkIgcGVyIHZtc19zZWN0aW9uICovCisJICAgIHsKKworCSAgICAgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykJCQkvKiBjaGVjayBmb3IgcmVsb2NzICovCisJCXsKKwkJICBhcmVsZW50ICoqcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOworCQkgIGludCBpID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7CisJCSAgZm9yICg7OykKKwkJICAgIHsKKwkJICAgICAgYmZkX3NpemVfdHlwZSBhZGRyID0gKCpycHRyKS0+YWRkcmVzczsKKwkJICAgICAgaW50IGxlbiA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoKCpycHRyKS0+aG93dG8pOworCQkgICAgICBpZiAoc3B0ci0+b2Zmc2V0IDwgYWRkcikJCS8qIHNwdHIgc3RhcnRzIGJlZm9yZSByZWxvYyAqLworCQkJeworCQkJICBpbnQgYmVmb3JlID0gYWRkciAtIHNwdHItPm9mZnNldDsKKwkJCSAgaWYgKHNwdHItPnNpemUgPD0gYmVmb3JlKQkJLyogY29tcGxldGUgYmVmb3JlICovCisJCQkgICAgeworCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKKwkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisJCQkgIGVsc2UJCQkJLyogcGFydGx5IGJlZm9yZSAqLworCQkJICAgIHsKKwkJCSAgICAgIGludCBhZnRlciA9IHNwdHItPnNpemUgLSBiZWZvcmU7CisJCQkgICAgICBzcHRyLT5zaXplID0gYmVmb3JlOworCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKKwkJCSAgICAgIHZhZGRyICs9IHNwdHItPnNpemU7CisJCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBiZWZvcmU7CisJCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gYmVmb3JlOworCQkJICAgICAgc3B0ci0+c2l6ZSA9IGFmdGVyOworCQkJICAgIH0KKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc3B0ci0+b2Zmc2V0ID09IGFkZHIpCS8qIHNwdHIgc3RhcnRzIGF0IHJlbG9jICovCisJCQl7CisJCQkgIGFzeW1ib2wgKnN5bSA9ICooKnJwdHIpLT5zeW1fcHRyX3B0cjsKKwkJCSAgYXNlY3Rpb24gKnNlYyA9IHN5bS0+c2VjdGlvbjsKKworCQkJICBzd2l0Y2ggKCgqcnB0ciktPmhvd3RvLT50eXBlKQorCQkJICAgIHsKKwkJCSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgorCQkJICAgICAgYnJlYWs7CisKKwkJCSAgICBjYXNlIEFMUEhBX1JfUkVGTE9ORzoKKwkJCSAgICAgIHsKKwkJCQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQorCQkJCSAgeworCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAorCQkJCQkJCQlzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQorCQkJCQk8IDApCisJCQkJICAgICAgeworCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOworCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKKwkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKKwkJCQkJCQkgICB2YWRkciwgZmFsc2UpOworCQkJCSAgICAgIH0KKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAorCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fR0JMX0xXLAorCQkJCQkJCSAgICAtMSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAorCQkJCQkJCSAgICAgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKwkJCQkgIH0KKwkJCQllbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCisJCQkJICB7CisJCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDE2KSA8IDApCisJCQkJICAgICAgeworCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOworCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKKwkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKKwkJCQkJCQkgICB2YWRkciwgZmFsc2UpOworCQkJCSAgICAgIH0KKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAorCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfTFcsCisJCQkJCQkJICAgIC0xKTsKKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCisJCQkJCQkJICAgKHVxdWFkKXN5bS0+dmFsdWUpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCisJCQkJCQkJICAgIEVUSVJfU19DX1NUT19MVywKKwkJCQkJCQkgICAgLTEpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCQkJCSAgfQorCQkJCWVsc2UKKwkJCQkgIHsKKwkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMzIpIDwgMCkKKwkJCQkgICAgICB7CisJCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7CisJCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAorCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAorCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7CisJCQkJICAgICAgfQorCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCisJCQkJCQkJICAgIEVUSVJfU19DX1NUQV9QUSwKKwkJCQkJCQkgICAgLTEpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKKwkJCQkJCQkgICAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKKwkJCQkJCQkgICAoKHVxdWFkKSgqcnB0ciktPmFkZGVuZAorCQkJCQkJCSAgICArICh1cXVhZClzeW0tPnZhbHVlKSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKKwkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0xXLAorCQkJCQkJCSAgICAtMSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisJCQkJICB9CisJCQkgICAgICB9CisJCQkgICAgICBicmVhazsKKworCQkJICAgIGNhc2UgQUxQSEFfUl9SRUZRVUFEOgorCQkJICAgICAgeworCQkJCWlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCisJCQkJICB7CisJCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCisJCQkJCQkJCXN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCisJCQkJCTwgMCkKKwkJCQkgICAgICB7CisJCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7CisJCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAorCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAorCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7CisJCQkJICAgICAgfQorCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCisJCQkJCQkJICAgIEVUSVJfU19DX1NUT19HQkwsCisJCQkJCQkJICAgIC0xKTsKKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCisJCQkJCQkJICAgICAgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCQkJCSAgfQorCQkJCWVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKKwkJCQkgIHsKKwkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMTYpIDwgMCkKKwkJCQkgICAgICB7CisJCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7CisJCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAorCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAorCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7CisJCQkJICAgICAgfQorCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCisJCQkJCQkJICAgIEVUSVJfU19DX1NUQV9RVywKKwkJCQkJCQkgICAgLTEpOworCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKKwkJCQkJCQkgICAodXF1YWQpc3ltLT52YWx1ZSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKKwkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX1FXLAorCQkJCQkJCSAgICAtMSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisJCQkJICB9CisJCQkJZWxzZQorCQkJCSAgeworCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAzMikgPCAwKQorCQkJCSAgICAgIHsKKwkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKKwkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCisJCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCisJCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKKwkJCQkgICAgICB9CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKKwkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX1BRLAorCQkJCQkJCSAgICAtMSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAorCQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKShzZWMtPmluZGV4KSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAorCQkJCQkJCSAgICgodXF1YWQpKCpycHRyKS0+YWRkZW5kCisJCQkJCQkJICAgICsgKHVxdWFkKXN5bS0+dmFsdWUpKTsKKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKwkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAorCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fT0ZGLAorCQkJCQkJCSAgICAtMSk7CisJCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CisJCQkJICB9CisJCQkgICAgICB9CisJCQkgICAgICBicmVhazsKKworCQkJICAgIGNhc2UgQUxQSEFfUl9ISU5UOgorCQkJICAgICAgeworCQkJCWludCBoaW50X3NpemU7CisKKwkJCQloaW50X3NpemUgPSBzcHRyLT5zaXplOworCQkJCXNwdHItPnNpemUgPSBsZW47CisJCQkJc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKKwkJCQlzcHRyLT5zaXplID0gaGludF9zaXplOworI2lmIDAKKwkJCQl2bXNfb3V0cHV0X2JlZ2luKGFiZmQsIEVUSVJfU19DX1NUT19ISU5UX0dCTCwgLTEpOworCQkJCXZtc19vdXRwdXRfbG9uZyhhYmZkLCAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOworCQkJCXZtc19vdXRwdXRfcXVhZChhYmZkLCAodXF1YWQpYWRkcik7CisKKwkJCQl2bXNfb3V0cHV0X2NvdW50ZWQoYWJmZCwgX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzeW0tPm5hbWUsIEVPQkpfU19DX1NZTVNJWikpOworCQkJCXZtc19vdXRwdXRfZmx1c2goYWJmZCk7CisjZW5kaWYKKwkJCSAgICAgIH0KKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgQUxQSEFfUl9MSU5LQUdFOgorCQkJICAgICAgeworCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDY0KSA8IDApCisJCQkJICB7CisJCQkJICAgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7CisJCQkJICAgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwKKwkJCQkJCSAgICAgICB2YWRkciwgZmFsc2UpOworCQkJCSAgfQorCQkJCV9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKKwkJCQkJCQlFVElSX1NfQ19TVENfTFBfUFNCLAorCQkJCQkJCS0xKTsKKwkJCQlfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKKwkJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylQUklWKHZtc19saW5rYWdlX2luZGV4KSk7CisJCQkJUFJJVih2bXNfbGlua2FnZV9pbmRleCkgKz0gMjsKKwkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKKwkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKKwkJCQlfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CisJCQkJX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKKwkJCSAgICAgIH0KKwkJCSAgICAgIGJyZWFrOworCisJCQkgICAgY2FzZSBBTFBIQV9SX0NPREVBRERSOgorCQkJICAgICAgeworCQkJCWlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsCisJCQkJCQkJICAgIHN0cmxlbigoY2hhciAqKXN5bS0+bmFtZSkpCisJCQkJICAgIDwgMCkKKwkJCQkgIHsKKwkJCQkgICAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKKwkJCQkgICAgc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCisJCQkJCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsCisJCQkJCQkgICAgICAgdmFkZHIsIGZhbHNlKTsKKwkJCQkgIH0KKwkJCQlfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCisJCQkJCQkJRVRJUl9TX0NfU1RPX0NBLAorCQkJCQkJCS0xKTsKKwkJCQlfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKKwkJCQkJCQkgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKKwkJCQlfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOworCQkJICAgICAgfQorCQkJICAgICAgYnJlYWs7CisKKwkJCSAgICBkZWZhdWx0OgorCQkJICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJVbmhhbmRsZWQgcmVsb2NhdGlvbiAlcyIpLAorCQkJCQkJICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisKKwkJCSAgdmFkZHIgKz0gbGVuOworCisJCQkgIGlmIChsZW4gPT0gc3B0ci0+c2l6ZSkKKwkJCSAgICB7CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBzcHRyLT5jb250ZW50cyArPSBsZW47CisJCQkgICAgICBzcHRyLT5vZmZzZXQgKz0gbGVuOworCQkJICAgICAgc3B0ci0+c2l6ZSAtPSBsZW47CisJCQkgICAgICBpLS07CisJCQkgICAgICBycHRyKys7CisJCQkgICAgfQorCQkJfQorCQkgICAgICBlbHNlCQkJCQkvKiBzcHRyIHN0YXJ0cyBhZnRlciByZWxvYyAqLworCQkJeworCQkJICBpLS07CQkJCS8qIGNoZWNrIG5leHQgcmVsb2MgKi8KKwkJCSAgcnB0cisrOworCQkJfQorCisJCSAgICAgIGlmIChpPT0wKQkJCQkvKiBhbGwgcmVsb2MgY2hlY2tlZCAqLworCQkJeworCQkJICBpZiAoc3B0ci0+c2l6ZSA+IDApCisJCQkgICAgeworCQkJICAgICAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsJLyogZHVtcCByZXN0ICovCisJCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOworCQkJICAgIH0KKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9IC8qIGZvciAoOzspICovCisJCX0gLyogaWYgU0VDX1JFTE9DICovCisJICAgICAgZWxzZQkJCQkJCS8qIG5vIHJlbG9jcywganVzdCBkdW1wICovCisJCXsKKwkJICBzdG9faW1tIChhYmZkLCBzcHRyLCB2YWRkciwgc2VjdGlvbi0+aW5kZXgpOworCQkgIHZhZGRyICs9IHNwdHItPnNpemU7CisJCX0KKworCSAgICAgIHNwdHIgPSBzcHRyLT5uZXh0OworCisJICAgIH0gLyogd2hpbGUgKHNwdHIgIT0gMCkgKi8KKworCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKKworCX0gLyogaGFzX2NvbnRlbnRzICovCisKKyAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OworICAgIH0KKworICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KGFiZmQsIDIpOworICByZXR1cm4gMDsKK30KKworCisvKiB3cml0ZSB0cmFjZWJhY2sgZGF0YSBmb3IgYmZkIGFiZmQgICovCisKK2ludAorX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBvYmp0eXBlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBvYmp0eXBlOworeworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90YnQgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogd3JpdGUgZGVidWcgaW5mbyBmb3IgYmZkIGFiZmQgICovCisKK2ludAorX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBvYmp0eXBlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBvYmp0eXBlOworeworI2lmIFZNU19ERUJVRworICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV9kYmcgKCVwLCBvYmp0eXBlKVxuIiwgYWJmZCwgb2JqdHlwZSk7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JmZC92bXMuYyBiL2JmZC92bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjMTNhCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3Ztcy5jCkBAIC0wLDAgKzEsMTk0NyBAQAorLyogdm1zLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKKyAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKworI2luY2x1ZGUgInZtcy5oIgorCitzdGF0aWMgYm9vbGVhbiB2bXNfaW5pdGlhbGl6ZSBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBwcml2X3NlY3Rpb25fY291bnQ7CitzdGF0aWMgYm9vbGVhbiBmaWxsX3NlY3Rpb25fcHRyIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIHZtc19maXh1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGJvb2xlYW4gY29weV9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKK3N0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmVsb2NfbmlsCisgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOworc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp2bXNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgYm9vbGVhbiB2bXNfbWtvYmplY3QgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgYm9vbGVhbiB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGJvb2xlYW4gdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGJvb2xlYW4gdm1zX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOworc3RhdGljIGJvb2xlYW4gdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiB4MSwgZmlsZV9wdHIgeDIsCisJICAgYmZkX3NpemVfdHlwZSB4MykpOworc3RhdGljIGJvb2xlYW4gdm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdworICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfd2luZG93ICp3LCBmaWxlX3B0ciBvZmZzZXQsCisJICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICpzcmMsIGJmZCAqZGVzdCkpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCisgIFBBUkFNUyAoKGJmZCAqc3JjYmZkLCBhc2VjdGlvbiAqc3Jjc2VjLCBiZmQgKmRzdGJmZCwgYXNlY3Rpb24gKmRzdHNlYykpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKKyAgUEFSQU1TICgoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pKTsKK3N0YXRpYyBib29sZWFuIHZtc19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQorICBQQVJBTVMgKChiZmQgKmFiZmQsIHZvaWQgKmZpbGUpKTsKK3N0YXRpYyBjaGFyICp2bXNfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBpbnQgdm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBib29sZWFuIHZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKKyAgUEFSQU1TICgoYmZkICphYmZkLCBiZmQgKmJiZmQpKTsKK3N0YXRpYyBib29sZWFuIHZtc19zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBib29sZWFuIHZtc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGJvb2xlYW4gdm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqKnRhYmxvYywgYmZkX3NpemVfdHlwZSAqdGFibGVuLAorCSAgIGNvbnN0IGNoYXIgKipuYW1lKSk7CitzdGF0aWMgdm9pZCB2bXNfdHJ1bmNhdGVfYXJuYW1lCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqcGF0aG5hbWUsIGNoYXIgKmFyaGRyKSk7CitzdGF0aWMgYm9vbGVhbiB2bXNfd3JpdGVfYXJtYXAKKyAgUEFSQU1TICgoYmZkICphcmNoLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCwgc3RydWN0IG9ybCAqbWFwLAorCSAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKK3N0YXRpYyBQVFIgdm1zX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworc3RhdGljIGJmZCAqdm1zX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICphYmZkLCBzeW1pbmRleCBpbmRleCkpOworc3RhdGljIGJmZCAqdm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2gsIGJmZCAqcHJldikpOworc3RhdGljIGJvb2xlYW4gdm1zX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgaW50IHZtc19nZW5lcmljX3N0YXRfYXJjaF9lbHQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqc3RhdCkpOworc3RhdGljIGxvbmcgdm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipzeW1ib2xzKSk7CitzdGF0aWMgdm9pZCB2bXNfcHJpbnRfc3ltYm9sCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCwgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOworc3RhdGljIHZvaWQgdm1zX2dldF9zeW1ib2xfaW5mbworICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYWxlbnQgKnZtc19nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sKSk7CitzdGF0aWMgYm9vbGVhbiB2bXNfZmluZF9uZWFyZXN0X2xpbmUKKyAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYXN5bWJvbCAqKnN5bWJvbHMsIGJmZF92bWEgb2Zmc2V0LAorCSAgIGNvbnN0IGNoYXIgKipmaWxlLCBjb25zdCBjaGFyICoqZnVuYywgdW5zaWduZWQgaW50ICpsaW5lKSk7CitzdGF0aWMgYXN5bWJvbCAqdm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAorICBQQVJBTVMgKChiZmQgKmFiZmQsIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBzaXplKSk7CitzdGF0aWMgbG9uZyB2bXNfcmVhZF9taW5pc3ltYm9scworICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgUFRSICptaW5pc3ltc3AsIHVuc2lnbmVkIGludCAqc2l6ZXApKTsKK3N0YXRpYyBhc3ltYm9sICp2bXNfbWluaXN5bWJvbF90b19zeW1ib2wKKyAgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGR5bmFtaWMsIGNvbnN0IFBUUiBtaW5pc3ltLCBhc3ltYm9sICpzeW0pKTsKK3N0YXRpYyBsb25nIHZtc19nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCkpOworc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYworICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGFyZWxlbnQgKipsb2NhdGlvbiwKKwkgICBhc3ltYm9sICoqc3ltYm9scykpOworc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKnZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKKyAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOworc3RhdGljIGJvb2xlYW4gdm1zX3NldF9hcmNoX21hY2gKKyAgUEFSQU1TICgoYmZkICphYmZkLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoKSk7CitzdGF0aWMgYm9vbGVhbiB2bXNfc2V0X3NlY3Rpb25fY29udGVudHMKKyAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsCisJICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOworc3RhdGljIGludCB2bXNfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIHJlbG9jKSk7CitzdGF0aWMgYmZkX2J5dGUgKnZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKKwkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsIGJmZF9ieXRlICpkYXRhLAorCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqc3ltYm9scykpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9yZWxheF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCisJICAgYm9vbGVhbiAqYWdhaW4pKTsKK3N0YXRpYyBib29sZWFuIHZtc19iZmRfZ2Nfc2VjdGlvbnMKKyAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvKSk7CitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKnZtc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQorICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBib29sZWFuIHZtc19iZmRfbGlua19hZGRfc3ltYm9scworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKK3N0YXRpYyBib29sZWFuIHZtc19iZmRfZmluYWxfbGluaworICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKK3N0YXRpYyBib29sZWFuIHZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKK3N0YXRpYyBsb25nIHZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkKSk7CitzdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKK3N0YXRpYyBsb25nIHZtc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK3N0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYworICBQQVJBTVMgKChiZmQgKmFiZmQsIGFyZWxlbnQgKiphcmVsLCBhc3ltYm9sICoqc3ltYm9scykpOworc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqaWJmZCwgYmZkICpvYmZkKSk7CitzdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKKworI2RlZmluZSB2bXNfbWFrZV9lbXB0eV9zeW1ib2wgX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wKKwwKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjID0KK3sKKworICAidm1zLWFscGhhIiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyLAorICBmYWxzZSwJCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIGZhbHNlLAkJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBIQVNfU1lNUworICAgfCBXUF9URVhUIHwgRF9QQUdFRCksCS8qIG9iamVjdCBmbGFncyAqLworICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKKyAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQorICAgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSksCQkvKiBzZWN0IGZsYWdzICovCisgIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKKworICB7X2JmZF9kdW1teV90YXJnZXQsIHZtc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KKyAgIHZtc19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKKyAge2JmZF9mYWxzZSwgdm1zX21rb2JqZWN0LAkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCisgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAorICB7YmZkX2ZhbHNlLCB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KKyAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKKworICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9DT1BZICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9DT1JFICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZtcyksCisgIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDICh2bXMpLAorCisgIChQVFIpIDAKK307CisKK2NvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWMgPQoreworCisgICJ2bXMtdmF4IiwJCQkvKiBuYW1lICovCisgIGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyLAorICBmYWxzZSwJCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCisgIGZhbHNlLAkJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLworCisgIChIQVNfUkVMT0MgfCBIQVNfU1lNUyAJLyogb2JqZWN0IGZsYWdzICovCisgICB8IFdQX1RFWFQgfCBEX1BBR0VECisgICB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfTE9DQUxTKSwKKworICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKKyAgIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQorICAgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSksCQkvKiBzZWN0IGZsYWdzICovCisgIDAsCQkJCS8qIHN5bWJvbF9sZWFkaW5nX2NoYXIgKi8KKyAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLworICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KKyAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAorICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCisgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLworICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCisgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKKyAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCisKKyAge19iZmRfZHVtbXlfdGFyZ2V0LCB2bXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCisgICB2bXNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCisgIHtiZmRfZmFsc2UsIHZtc19ta29iamVjdCwJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLworICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKKyAge2JmZF9mYWxzZSwgdm1zX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCisgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCisKKyAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09QWSAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTICh2bXMpLAorICBCRkRfSlVNUF9UQUJMRV9XUklURSAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfTElOSyAodm1zKSwKKyAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAodm1zKSwKKworICAoUFRSKSAwCit9OworDAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBJbml0aWFsaXplIHByaXZhdGUgZGF0YSAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19pbml0aWFsaXplIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGludCBpOworCisgIGlmIChhYmZkLT50ZGF0YS5hbnkgIT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKS0xKTsKKworICBhYmZkLT50ZGF0YS5hbnkgPSAoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCopCisJCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgdm1zX3ByaXZhdGVfZGF0YV9zdHJ1Y3QpKSk7CisgIGlmIChhYmZkLT50ZGF0YS5hbnkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBfX0FMUEhBCisgIFBSSVYoaXNfdmF4KSA9IDA7CisjZWxzZQorICBQUklWKGlzX3ZheCkgPSAxOworI2VuZGlmCisgIFBSSVYodm1zX2J1ZikgPSAwOworICBQUklWKGJ1Zl9zaXplKSA9IDA7CisgIFBSSVYocmVjX2xlbmd0aCkgPSAwOworICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1VOS05PV047CisgIFBSSVYoZml4dXBfZG9uZSkgPSBmYWxzZTsKKyAgUFJJVihzZWN0aW9ucykgPSBOVUxMOworCisgIFBSSVYoc3RhY2spID0gKChzdHJ1Y3Qgc3RhY2tfc3RydWN0ICopCisJCSBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdGFja19zdHJ1Y3QpICogU1RBQ0tTSVpFKSk7CisgIGlmIChQUklWKHN0YWNrKSA9PSAwKQorICAgIHsKKyAgICAgdm1zX2luaXRfbm9fbWVtMToKKyAgICAgIGZyZWUgKGFiZmQtPnRkYXRhLmFueSk7CisgICAgICBhYmZkLT50ZGF0YS5hbnkgPSAwOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgUFJJVihzdGFja3B0cikgPSAwOworCisgIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQorCQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKKyAgaWYgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPT0gMCkKKyAgICB7CisgICAgIHZtc19pbml0X25vX21lbTI6CisgICAgICBmcmVlIChQUklWKHN0YWNrKSk7CisgICAgICBQUklWKHN0YWNrKSA9IDA7CisgICAgICBnb3RvIHZtc19pbml0X25vX21lbTE7CisgICAgfQorCisgIGlmICghYmZkX2hhc2hfdGFibGVfaW5pdCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgX2JmZF92bXNfaGFzaF9uZXdmdW5jKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAoKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QgKikKKwkJCSAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9jYXRpb25fc3RydWN0KQorCQkJCSAgICAgICogTE9DQVRJT05fU0FWRV9TSVpFKSk7CisgIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSA9PSAwKQorICAgIHsKKyAgICAgdm1zX2luaXRfbm9fbWVtMzoKKyAgICAgIGZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOworICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7CisgICAgICBnb3RvIHZtc19pbml0X25vX21lbTI7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQorICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKKworICBQUklWKG91dHB1dF9idWYpID0gKHVuc2lnbmVkIGNoYXIgKikgbWFsbG9jIChNQVhfT1VUUkVDX1NJWkUpOworICBpZiAoUFJJVihvdXRwdXRfYnVmKSA9PSAwKQorICAgIHsKKyAgICAgIGZyZWUgKFBSSVYobG9jYXRpb25fc3RhY2spKTsKKyAgICAgIFBSSVYobG9jYXRpb25fc3RhY2spID0gMDsKKyAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMzsKKyAgICB9CisgIFBSSVYocHVzaF9sZXZlbCkgPSAwOworICBQUklWKHB1c2hlZF9zaXplKSA9IDA7CisgIFBSSVYobGVuZ3RoX3BvcykgPSAyOworICBQUklWKG91dHB1dF9zaXplKSA9IDA7CisgIFBSSVYob3V0cHV0X2FsaWdubWVudCkgPSAxOworCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIEZpbGwgc3ltYm9sLT5zZWN0aW9uIHdpdGggc2VjdGlvbiBwdHIKKyAgIHN5bWJvbC0+c2VjdGlvbiBpcyBmaWxsZWQgd2l0aCB0aGUgc2VjdGlvbiBpbmRleCBmb3IgZGVmaW5lZCBzeW1ib2xzCisgICBkdXJpbmcgcmVhZGluZyB0aGUgR1NEL0VHU0Qgc2VjdGlvbi4gQnV0IHdlIG5lZWQgdGhlIHBvaW50ZXIgdG8gdGhlCisgICBiZmQgc2VjdGlvbiBsYXRlci4KKworICAgSXQgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGZvciByZWZlcmVuY2VkICh1bmRlZmluZWQgc2VjdGlvbikgc3ltYm9scworCisgICBjYWxsZWQgZnJvbSBiZmRfaGFzaF90cmF2ZXJzZSBpbiB2bXNfZml4dXBfc2VjdGlvbnMgICovCisKK3N0YXRpYyBib29sZWFuCitmaWxsX3NlY3Rpb25fcHRyIChlbnRyeSwgc2VjdGlvbnMpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIFBUUiBzZWN0aW9uczsKK3sKKyAgYXNlY3Rpb24gKnNlYzsKKyAgYXN5bWJvbCAqc3ltOworCisgIHN5bSA9ICAoKHZtc19zeW1ib2xfZW50cnkgKillbnRyeSktPnN5bWJvbDsKKyAgc2VjID0gc3ltLT5zZWN0aW9uOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoNiwgImZpbGxfc2VjdGlvbl9wdHI6IHN5bSAlcCwgc2VjICVwXG4iLCBzeW0sIHNlYyk7CisjZW5kaWYKKworICAvKiBmaWxsIGZvcndhcmQgcmVmZXJlbmNlcyAodGhlc2UgY29udGFpbiBzZWN0aW9uIG51bWJlciwgbm90IHNlY3Rpb24gcHRyKS4gICovCisKKyAgaWYgKChpbnQpc2VjIDwgcHJpdl9zZWN0aW9uX2NvdW50KQorICAgIHsKKyAgICAgIHNlYyA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sLT5zZWN0aW9uID0KKwkoKGFzZWN0aW9uICoqKXNlY3Rpb25zKVsoaW50KXNlY107CisgICAgfQorCisgIGlmIChzdHJjbXAgKHN5bS0+bmFtZSwgc2VjLT5uYW1lKSA9PSAwKQorICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNOworCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIEZpeHVwIHNlY3Rpb25zCisgICBzZXQgdXAgYWxsIHBvaW50ZXJzIGFuZCBhcnJheXMsIGNvdW50ZXJzIGFuZCBzaXplcyBhcmUgZml4ZWQgbm93CisKKyAgIHdlIGJ1aWxkIGEgcHJpdmF0ZSBzZWN0aW9ucyB2ZWN0b3IgZm9yIGVhc3kgYWNjZXNzIHNpbmNlIHNlY3Rpb25zCisgICBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgYnkgYW4gaW5kZXggbnVtYmVyLgorCisgICBhbGxvYyBQUklWKHNlY3Rpb25zKSBhY2NvcmRpbmcgdG8gYWJmZC0+c2VjdGlvbl9jb3VudAorCWNvcHkgYWJmZC0+c2VjdGlvbnMgdG8gUFJJVihzZWN0aW9ucykgICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKnM7CisKKyAgaWYgKFBSSVYoZml4dXBfZG9uZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyoKKyAgICogdHJhdmVyc2Ugc3ltYm9sIHRhYmxlIGFuZCBmaWxsIGluIGFsbCBzZWN0aW9uIHBvaW50ZXJzCisgICAqLworCisgIC8qIGNhbid0IHByb3ZpZGUgc2VjdGlvbiBjb3VudCBhcyBhcmd1bWVudCB0byBmaWxsX3NlY3Rpb25fcHRyKCkuICAqLworICBwcml2X3NlY3Rpb25fY291bnQgPSBQUklWKHNlY3Rpb25fY291bnQpOworICBiZmRfaGFzaF90cmF2ZXJzZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgZmlsbF9zZWN0aW9uX3B0ciwKKwkJICAgIChQVFIpKFBSSVYoc2VjdGlvbnMpKSk7CisKKyAgUFJJVihmaXh1cF9kb25lKSA9IHRydWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogQ2hlY2sgdGhlIGZvcm1hdCBmb3IgYSBmaWxlIGJlaW5nIHJlYWQuCisgICBSZXR1cm4gYSAoYmZkX3RhcmdldCAqKSBpZiBpdCdzIGFuIG9iamVjdCBmaWxlIG9yIHplcm8gaWYgbm90LiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICoKK3Ztc19vYmplY3RfcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpbnQgZXJyID0gMDsKKyAgaW50IHByZXZfdHlwZTsKKyAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWN0b3IgPSAwOworICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSAwOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19vYmplY3RfcCglcClcbiIsIGFiZmQpOworI2VuZGlmCisKKyAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIDBMLCBTRUVLX1NFVCkpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBwcmV2X3R5cGUgPSAtMTsKKworICBkbworICAgIHsKKyNpZiBWTVNfREVCVUcKKyAgICAgIHZtc19kZWJ1ZyAoNywgInJlYWRpbmcgYXQgJTA4bHhcbiIsIGJmZF90ZWxsKGFiZmQpKTsKKyNlbmRpZgorICAgICAgaWYgKF9iZmRfdm1zX25leHRfcmVjb3JkIChhYmZkKSA8IDApCisJeworI2lmIFZNU19ERUJVRworCSAgdm1zX2RlYnVnICgyLCAibmV4dF9yZWNvcmQgZmFpbGVkXG4iKTsgICAgICAKKyNlbmRpZgorCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGlmICgocHJldl90eXBlID09IEVPQkpfU19DX0VHU0QpCisJICAgJiYgKFBSSVYocmVjX3R5cGUpICE9IEVPQkpfU19DX0VHU0QpKQorCXsKKwkgIGlmICh2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpID09IGZhbHNlKQorCSAgICB7CisjaWYgVk1TX0RFQlVHCisJICAgICAgdm1zX2RlYnVnICgyLCAidm1zX2ZpeHVwX3NlY3Rpb25zIGZhaWxlZFxuIik7CisjZW5kaWYKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKworICAgICAgcHJldl90eXBlID0gUFJJVihyZWNfdHlwZSk7CisKKyAgICAgIGlmICh0YXJnZXRfdmVjdG9yID09IDApCisJeworCSAgaWYgKHByZXZfdHlwZSA8PSBPQkpfU19DX01BWFJFQ1RZUCkKKwkgICAgdGFyZ2V0X3ZlY3RvciA9ICZ2bXNfdmF4X3ZlYzsKKwkgIGVsc2UKKwkgICAgdGFyZ2V0X3ZlY3RvciA9ICZ2bXNfYWxwaGFfdmVjOworCX0KKworICAgICAgc3dpdGNoIChwcmV2X3R5cGUpCisJeworCSAgY2FzZSBPQkpfU19DX0hEUjoKKwkgIGNhc2UgRU9CSl9TX0NfRU1IOgorCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIHByZXZfdHlwZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBPQkpfU19DX0VPTToKKwkgIGNhc2UgT0JKX1NfQ19FT01XOgorCSAgY2FzZSBFT0JKX1NfQ19FRU9NOgorCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIHByZXZfdHlwZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBPQkpfU19DX0dTRDoKKwkgIGNhc2UgRU9CSl9TX0NfRUdTRDoKKwkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfZ3NkIChhYmZkLCBwcmV2X3R5cGUpOworCSAgICBicmVhazsKKwkgIGNhc2UgT0JKX1NfQ19USVI6CisJICBjYXNlIEVPQkpfU19DX0VUSVI6CisJICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX3RpciAoYWJmZCwgcHJldl90eXBlKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9CSl9TX0NfREJHOgorCSAgY2FzZSBFT0JKX1NfQ19FREJHOgorCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIHByZXZfdHlwZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBPQkpfU19DX1RCVDoKKwkgIGNhc2UgRU9CSl9TX0NfRVRCVDoKKwkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfdGJ0IChhYmZkLCBwcmV2X3R5cGUpOworCSAgICBicmVhazsKKwkgIGNhc2UgT0JKX1NfQ19MTks6CisJICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgcHJldl90eXBlKTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBlcnIgPSAtMTsKKwl9CisgICAgICBpZiAoZXJyICE9IDApCisJeworI2lmIFZNU19ERUJVRworCSAgdm1zX2RlYnVnICgyLCAic2x1cnAgdHlwZSAlZCBmYWlsZWQgd2l0aCAlZFxuIiwgcHJldl90eXBlLCBlcnIpOworI2VuZGlmCisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIHdoaWxlICgocHJldl90eXBlICE9IEVPQkpfU19DX0VFT00pICYmIChwcmV2X3R5cGUgIT0gT0JKX1NfQ19FT00pICYmIChwcmV2X3R5cGUgIT0gT0JKX1NfQ19FT01XKSk7CisKKyAgaWYgKHRhcmdldF92ZWN0b3IgPT0gJnZtc192YXhfdmVjKQorICAgIHsKKyAgICAgIGlmICh2bXNfZml4dXBfc2VjdGlvbnMgKGFiZmQpID09IGZhbHNlKQorCXsKKyNpZiBWTVNfREVCVUcKKwkgIHZtc19kZWJ1ZyAoMiwgInZtc19maXh1cF9zZWN0aW9ucyBmYWlsZWRcbiIpOworI2VuZGlmCisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogc2V0IGFyY2hfaW5mbyB0byB2YXggICovCisgCisgICAgICBhcmNoID0gYmZkX3NjYW5fYXJjaCAoInZheCIpOworICAgICAgUFJJViAoaXNfdmF4KSA9IDE7CisjaWYgVk1TX0RFQlVHCisgICAgICB2bXNfZGVidWcgKDIsICJhcmNoIGlzIHZheFxuIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKHRhcmdldF92ZWN0b3IgPT0gJnZtc19hbHBoYV92ZWMpCisgICAgeworICAgICAgLyogc2V0IGFyY2hfaW5mbyB0byBhbHBoYSAgKi8KKyAKKyAgICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoICgiYWxwaGEiKTsKKyAgICAgIFBSSVYgKGlzX3ZheCkgPSAwOworI2lmIFZNU19ERUJVRworICAgICAgdm1zX2RlYnVnICgyLCAiYXJjaCBpcyBhbHBoYVxuIik7CisjZW5kaWYKKyAgICB9CisKKyAgaWYgKGFyY2ggPT0gMCkKKyAgICB7CisjaWYgVk1TX0RFQlVHCisgICAgICB2bXNfZGVidWcgKDIsICJhcmNoIG5vdCBmb3VuZFxuIik7CisjZW5kaWYKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOworCisgIHJldHVybiB0YXJnZXRfdmVjdG9yOworfQorCisKKy8qIENoZWNrIHRoZSBmb3JtYXQgZm9yIGEgZmlsZSBiZWluZyByZWFkLgorICAgUmV0dXJuIGEgKGJmZF90YXJnZXQgKikgaWYgaXQncyBhbiBhcmNoaXZlIGZpbGUgb3IgemVyby4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqCit2bXNfYXJjaGl2ZV9wIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19hcmNoaXZlX3AoJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorCisgIHJldHVybiAwOworfQorCisKKy8qIFNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19ta29iamVjdCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfbWtvYmplY3QoJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorCisgIGlmICghdm1zX2luaXRpYWxpemUgKGFiZmQpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInZtc19pbml0aWFsaXplICgpIGZhaWxlZCAhIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgeworI2lmZGVmIF9fVkFYCisgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoID0gYmZkX3NjYW5fYXJjaCAoInZheCIpOworI2Vsc2UKKyAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgiYWxwaGEiKTsKKyNlbmRpZgorICAgIGlmIChhcmNoID09IDApCisgICAgICB7CisJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICBhYmZkLT5hcmNoX2luZm8gPSBhcmNoOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLyogV3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4sIGF0IGJmZF9jbG9zZS4gICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc193cml0ZV9vYmplY3RfY29udGVudHMoJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorCisgIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gMCkJCQkvKiB3ZSBoYXZlIHNlY3Rpb25zICovCisgICAgeworICAgICAgaWYgKFBSSVYoaXNfdmF4KSkKKwl7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBPQkpfU19DX0hEUikgIT0gMCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2dzZCAoYWJmZCwgT0JKX1NfQ19HU0QpICE9IDApCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIE9CSl9TX0NfVElSKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBPQkpfU19DX1RCVCkgIT0gMCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgT0JKX1NfQ19EQkcpICE9IDApCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gMjU1KQorCSAgICB7CisJICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT01XKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIE9CSl9TX0NfRU9NKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKF9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgRU9CSl9TX0NfRU1IKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBFT0JKX1NfQ19FR1NEKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfdGlyIChhYmZkLCBFT0JKX1NfQ19FVElSKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfdGJ0IChhYmZkLCBFT0JKX1NfQ19FVEJUKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBFT0JKX1NfQ19FREJHKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBFT0JKX1NfQ19FRU9NKSAhPSAwKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qLS0gNC4xLCBnZW5lcmljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ2FsbGVkIHdoZW4gdGhlIEJGRCBpcyBiZWluZyBjbG9zZWQgdG8gZG8gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19jbG9zZV9hbmRfY2xlYW51cCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqc2VjOworICB2bXNfc2VjdGlvbiAqZXMsICplczE7CisgIHZtc19yZWxvYyAqZXIsICplcjE7CisgIGludCBpOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19jbG9zZV9hbmRfY2xlYW51cCglcClcbiIsIGFiZmQpOworI2VuZGlmCisgIGlmIChhYmZkID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKFBSSVYodm1zX2J1ZikgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChQUklWKHZtc19idWYpKTsKKyAgICAgIFBSSVYodm1zX2J1ZikgPSBOVUxMOworICAgIH0KKyAgUFJJVihidWZfc2l6ZSkgPSAwOworCisgIGlmIChQUklWKG91dHB1dF9idWYpICE9IDApCisgICAgeworICAgICAgZnJlZSAoUFJJVihvdXRwdXRfYnVmKSk7CisgICAgICBQUklWKG91dHB1dF9idWYpID0gMDsKKyAgICB9CisKKyAgc2VjID0gYWJmZC0+c2VjdGlvbnM7CisgIHdoaWxlIChzZWMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc2VjLT5jb250ZW50cykKKwlmcmVlIChzZWMtPmNvbnRlbnRzKTsKKyAgICAgIHNlYyA9IHNlYy0+bmV4dDsKKyAgICB9CisKKyAgaWYgKFBSSVYoc2VjdGlvbnMpICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoUFJJVihzZWN0aW9ucykpOworICAgICAgUFJJVihzZWN0aW9ucykgPSBOVUxMOworICAgIH0KKworICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSkKKyAgICB7CisgICAgICBiZmRfaGFzaF90YWJsZV9mcmVlIChQUklWKHZtc19zeW1ib2xfdGFibGUpKTsKKyAgICAgIFBSSVYodm1zX3N5bWJvbF90YWJsZSkgPSAwOworICAgIH0KKworICBpZiAoUFJJVihzdGFjaykpCisgICAgeworICAgICAgZnJlZSAoUFJJVihzdGFjaykpOworICAgICAgUFJJVihzdGFjaykgPSAwOworICAgIH0KKworICBpZiAoUFJJVihsb2NhdGlvbl9zdGFjaykpCisgICAgeworICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOworICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgVk1TX1NFQ1RJT05fQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICBlcyA9IFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldOworICAgICAgd2hpbGUgKGVzICE9IE5VTEwpCisJeworCSAgZXMxID0gZXMtPm5leHQ7CisJICBmcmVlIChlcyk7CisJICBlcyA9IGVzMTsKKwl9CisgICAgICBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpXSA9IE5VTEw7CisgICB9CisKKyAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKKyAgYWJmZC0+dGRhdGEuYW55ID0gTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBBc2sgdGhlIEJGRCB0byBmcmVlIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24uICAqLworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8oJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBDYWxsZWQgd2hlbiBhIG5ldyBzZWN0aW9uIGlzIGNyZWF0ZWQuICAqLworCitzdGF0aWMgYm9vbGVhbgordm1zX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19uZXdfc2VjdGlvbl9ob29rICglcCwgWyVkXSVzKSwgY291bnQgJWRcbiIsIGFiZmQsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCBhYmZkLT5zZWN0aW9uX2NvdW50KTsKKyNlbmRpZgorICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNlY3Rpb24sIDQpOworCisgIGlmIChhYmZkLT5zZWN0aW9uX2NvdW50ID4gUFJJVihzZWN0aW9uX2NvdW50KSkKKyAgICB7CisgICAgICBQUklWKHNlY3Rpb25zKSA9ICgoYXNlY3Rpb24gKiopCisJCQkgICAgYmZkX3JlYWxsb2MgKFBSSVYoc2VjdGlvbnMpLCBhYmZkLT5zZWN0aW9uX2NvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSkpOworICAgICAgaWYgKFBSSVYoc2VjdGlvbnMpID09IDApCisJcmV0dXJuIGZhbHNlOworICAgICAgUFJJVihzZWN0aW9uX2NvdW50KSA9IGFiZmQtPnNlY3Rpb25fY291bnQ7CisgICAgfQorI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDYsICJzZWN0aW9uX2NvdW50OiAlZFxuIiwgUFJJVihzZWN0aW9uX2NvdW50KSk7CisjZW5kaWYKKyAgUFJJVihzZWN0aW9ucylbc2VjdGlvbi0+aW5kZXhdID0gc2VjdGlvbjsKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICg3LCAiJWQ6ICVzXG4iLCBzZWN0aW9uLT5pbmRleCwgc2VjdGlvbi0+bmFtZSk7CisjZW5kaWYKKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uCisgICBidWYgcG9pbnRzIHRvIGEgYnVmZmVyIG9mIGJ1Zl9zaXplIGJ5dGVzIHRvIGJlIGZpbGxlZCB3aXRoCisgICBzZWN0aW9uIGRhdGEgKHN0YXJ0aW5nIGF0IG9mZnNldCBpbnRvIHNlY3Rpb24pICAqLworCitzdGF0aWMgYm9vbGVhbgordm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBidWYsIG9mZnNldCwgYnVmX3NpemUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIFBUUiBidWY7CisgICAgIGZpbGVfcHRyIG9mZnNldDsKKyAgICAgYmZkX3NpemVfdHlwZSBidWZfc2l6ZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCAlcywgJXAsIG9mZiAlbGQsIHNpemUgJWQpXG4iLAorCQkgYWJmZCwgc2VjdGlvbi0+bmFtZSwgYnVmLCBvZmZzZXQsIChpbnQpYnVmX3NpemUpOworI2VuZGlmCisKKyAgLyogc2hvdWxkbid0IGJlIGNhbGxlZCwgc2luY2UgYWxsIHNlY3Rpb25zIGFyZSBJTl9NRU1PUlkgICovCisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uCisgICBidWYgcG9pbnRzIHRvIGEgYnVmZmVyIG9mIGJ1Zl9zaXplIGJ5dGVzIHRvIGJlIGZpbGxlZCB3aXRoCisgICBzZWN0aW9uIGRhdGEgKHN0YXJ0aW5nIGF0IG9mZnNldCBpbnRvIHNlY3Rpb24pICAqLworCitzdGF0aWMgYm9vbGVhbgordm1zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyAoYWJmZCwgc2VjdGlvbiwgdywgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYmZkX3dpbmRvdyAqdzsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KCVwLCAlcywgJXAsIG9mZiAlbGQsIGNvdW50ICVkKVxuIiwKKwkJIGFiZmQsIHNlY3Rpb24tPm5hbWUsIHcsIG9mZnNldCwgKGludCljb3VudCk7CisjZW5kaWYKKworICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qLS0gUGFydCA0LjIsIGNvcHkgcHJpdmF0ZSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ2FsbGVkIHRvIGNvcHkgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCisgICB0byBhbm90aGVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCisgICAgIGJmZCAqc3JjOworICAgICBiZmQgKmRlc3Q7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKCVwLCAlcClcbiIsIHNyYywgZGVzdCk7CisjZW5kaWYKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLyogTWVyZ2UgcHJpdmF0ZSBCRkQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIEB2YXJ7aWJmZH0gdG8gdGhlCisgICB0aGUgb3V0cHV0IGZpbGUgQkZEIEB2YXJ7b2JmZH0gd2hlbiBsaW5raW5nLiAgUmV0dXJuIDw8dHJ1ZT4+CisgICBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKKworICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCisgICAgIE5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKKyAgICAgYmZkICppYmZkOworICAgICBiZmQgKm9iZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwidm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKCVwLCAlcClcbiIsIGliZmQsIG9iZmQpOworI2VuZGlmCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIFNldCBwcml2YXRlIEJGRCBmbGFnIGluZm9ybWF0aW9uIGluIHRoZSBCRkQgQHZhcnthYmZkfS4KKyAgIFJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgorICAgcmV0dXJucyBhcmU6CisKKyAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQorICAgICBOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4gICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKKyAgICAgYmZkICphYmZkOworICAgICBmbGFnd29yZCBmbGFnczsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX3NldF9wcml2YXRlX2ZsYWdzKCVwLCAlbHgpXG4iLCBhYmZkLCAobG9uZylmbGFncyk7CisjZW5kaWYKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCisgICB0byBhbm90aGVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoc3JjYmZkLCBzcmNzZWMsIGRzdGJmZCwgZHN0c2VjKQorICAgICBiZmQgKnNyY2JmZDsKKyAgICAgYXNlY3Rpb24gKnNyY3NlYzsKKyAgICAgYmZkICpkc3RiZmQ7CisgICAgIGFzZWN0aW9uICpkc3RzZWM7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSglcCwgJXMsICVwLCAlcylcbiIsCisJCSBzcmNiZmQsIHNyY3NlYy0+bmFtZSwgZHN0YmZkLCBkc3RzZWMtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiB0cnVlOworfQorCisvKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzeW1ib2wgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQorICAgdG8gYW5vdGhlci4gICovCisKK3N0YXRpYyBib29sZWFuIAordm1zX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgKGliZmQsIGlzeW0sIG9iZmQsIG9zeW0pCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYXN5bWJvbCAqaXN5bTsKKyAgICAgYmZkICpvYmZkOworICAgICBhc3ltYm9sICpvc3ltOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSglcCwgJXMsICVwLCAlcylcbiIsCisJCSBpYmZkLCBpc3ltLT5uYW1lLCBvYmZkLCBvc3ltLT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworLyotLSBQYXJ0IDQuMywgY29yZSBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBSZXR1cm4gYSByZWFkLW9ubHkgc3RyaW5nIGV4cGxhaW5pbmcgd2hpY2ggcHJvZ3JhbSB3YXMgcnVubmluZworICAgd2hlbiBpdCBmYWlsZWQgYW5kIHByb2R1Y2VkIHRoZSBjb3JlIGZpbGUgYWJmZC4gICovCisKK3N0YXRpYyBjaGFyICoKK3Ztc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBjYXVzZWQgdGhlIGNvcmUgZHVtcCB3aGljaAorICAgZ2VuZXJhdGVkIHRoZSBmaWxlIHRoZSBCRkQgYWJmZCBpcyBhdHRhY2hlZCB0by4gICovCisKK3N0YXRpYyBpbnQKK3Ztc19jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCglcClcbiIsIGFiZmQpOworI2VuZGlmCisgIHJldHVybiAwOworfQorCisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBjb3JlIGZpbGUgYXR0YWNoZWQgdG8gY29yZV9iZmQgd2FzIGdlbmVyYXRlZAorICAgYnkgYSBydW4gb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhdHRhY2hlZCB0byBleGVjX2JmZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGFiZmQsIGJiZmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkICpiYmZkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCVwLCAlcClcbiIsIGFiZmQsIGJiZmQpOworI2VuZGlmCisgIHJldHVybiBmYWxzZTsKK30KKworLyotLSBQYXJ0IDQuNCwgYXJjaGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gYXJjaGl2ZSBtYXAuCisgICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19zbHVycF9hcm1hcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfc2x1cnBfYXJtYXAoJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorICByZXR1cm4gZmFsc2U7Cit9CisKKworLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCisgICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qID8/PwlkbyBzb21ldGhpbmcgd2l0aCBhbiBleHRlbmRlZCBuYW1lIHRhYmxlLgorICAgUmV0dXJuIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIHRhYmxvYywgdGFibGVuLCBuYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKip0YWJsb2M7CisgICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbjsKKyAgICAgY29uc3QgY2hhciAqKm5hbWU7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSglcClcbiIsIGFiZmQpOworI2VuZGlmCisgIHJldHVybiBmYWxzZTsKK30KKworCisvKiBUcnVuY2F0ZSB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIHRvIG1hdGNoIHN5c3RlbS1kZXBlbmRlbnQgcmVzdHJpY3Rpb25zICAqLworCitzdGF0aWMgdm9pZAordm1zX3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOworICAgICBjaGFyICphcmhkcjsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX3RydW5jYXRlX2FybmFtZSglcCwgJXMsICVzKVxuIiwgYWJmZCwgcGF0aG5hbWUsIGFyaGRyKTsKKyNlbmRpZgorICByZXR1cm47Cit9CisKKworLyogPz8/CXdyaXRlIGFyY2hpdmUgbWFwICAqLworCitzdGF0aWMgYm9vbGVhbgordm1zX3dyaXRlX2FybWFwIChhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQorICAgICBiZmQgKmFyY2g7CisgICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOworICAgICBzdHJ1Y3Qgb3JsICptYXA7CisgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7CisgICAgIGludCBzdHJpZHg7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc193cml0ZV9hcm1hcCglcCwgJWQsICVwLCAlZCAlZClcbiIsCisJYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCk7CisjZW5kaWYKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgYXJjaGl2ZSBoZWFkZXIgPz8/ICAqLworCitzdGF0aWMgUFRSCit2bXNfcmVhZF9hcl9oZHIgKGFiZmQpCisgICAgYmZkICogYWJmZDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX3JlYWRfYXJfaGRyKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIChQVFIpMDsKK30KKworCisvKiBQcm92aWRlZCBhIEJGRCwgQHZhcnthcmNoaXZlfSwgY29udGFpbmluZyBhbiBhcmNoaXZlIGFuZCBOVUxMLCBvcGVuCisgICBhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCisgICBTdWJzZXF1ZW50IGNhbGxzIHNob3VsZCBwYXNzIHRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlCisgICB0byByZXR1cm4gYSBjcmVhdGVkIEJGRCB0byB0aGUgbmV4dCBjb250YWluZWQgZWxlbWVudC4KKyAgIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZS4gICovCisKK3N0YXRpYyBiZmQgKgordm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKKyAgICAgYmZkICphcmNoOworICAgICBiZmQgKnByZXY7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUoJXAsICVwKVxuIiwgYXJjaCwgcHJldik7CisjZW5kaWYKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIFJldHVybiB0aGUgQkZEIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIHN5bWJvbCBpbiBBQkZEIGluZGV4ZWQgYnkKKyAgIElOREVYLiAgSU5ERVggc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSBiZmRfZ2V0X25leHRfbWFwZW50LiAgKi8KKworc3RhdGljIGJmZCAqCit2bXNfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgaW5kZXgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3ltaW5kZXggaW5kZXg7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfZWx0X2F0X2luZGV4KCVwLCAlcClcbiIsIGFiZmQsIGluZGV4KTsKKyNlbmRpZgorICByZXR1cm4gX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgoYWJmZCwgaW5kZXgpOworfQorCisKKy8qID8/PworICAgLT4gYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAgKi8KKworc3RhdGljIGludAordm1zX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCAoYWJmZCwgc3RhdCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCglcCwgJXApXG4iLCBhYmZkLCBzdGF0KTsKKyNlbmRpZgorICByZXR1cm4gYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KTsKK30KKworCisvKiBUaGlzIGlzIGEgbmV3IGZ1bmN0aW9uIGluIGJmZCAyLjUgICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCglcClcbiIsIGFiZmQpOworI2VuZGlmCisgIHJldHVybiB0cnVlOworfQorCisvKi0tIFBhcnQgNC41LCBzeW1ib2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKKyAgIHRvIGFzeW1ib2xzIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gdGhlIEJGRCBhYmZkLCBpbmNsdWRpbmcgYQorICAgdGVybWluYWwgTlVMTCBwb2ludGVyLiBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBpbiB0aGUgQkZELAorICAgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLiAgKi8KKworc3RhdGljIGxvbmcKK3Ztc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKCVwKSwgJWQgc3ltYm9sc1xuIiwgYWJmZCwgUFJJVihnc2Rfc3ltX2NvdW50KSk7CisjZW5kaWYKKyAgcmV0dXJuIChQUklWKGdzZF9zeW1fY291bnQpKzEpICogc2l6ZW9mKGFzeW1ib2wgKik7Cit9CisKKworLyogQ29weSBzeW1ib2xzIGZyb20gaGFzaCB0YWJsZSB0byBzeW1ib2wgdmVjdG9yCisKKyAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19nZXRfc3ltdGFiCisgICBpbml0IGNvdW50ZXIgdG8gMCBpZiBlbnRyeSA9PSAwICAqLworCitzdGF0aWMgYm9vbGVhbgorY29weV9zeW1ib2xzIChlbnRyeSwgYXJnKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBQVFIgYXJnOworeworICBiZmQgKmFiZmQgPSAoYmZkICopIGFyZzsKKworICBpZiAoZW50cnkgPT0gTlVMTCkJLyogaW5pdCBjb3VudGVyICovCisgICAgUFJJVihzeW1udW0pID0gMDsKKyAgZWxzZQkJCS8qIGZpbGwgdmVjdG9yLCBpbmMgY291bnRlciAqLworICAgIFBSSVYoc3ltY2FjaGUpW1BSSVYoc3ltbnVtKSsrXSA9ICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOworCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIFJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIGFiZmQsIGFuZCBmaWxscyBpbiB0aGUgdmVjdG9yCisgICBsb2NhdGlvbiB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIGFuZCBhIHRyYWlsaW5nIE5VTEwuCisKKyAgIHJldHVybiAjIG9mIHN5bWJvbHMgcmVhZCAgKi8KKworc3RhdGljIGxvbmcKK3Ztc19nZXRfc3ltdGFiIChhYmZkLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bXRhYiglcCwgPHJldD4pXG4iLCBhYmZkKTsKKyNlbmRpZgorCisJLyogaW5pdCBjb3VudGVyICovCisgICh2b2lkKWNvcHlfc3ltYm9scygoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopMCwgYWJmZCk7CisKKwkvKiB0cmF2ZXJzZSB0YWJsZSBhbmQgZmlsbCBzeW1ib2xzIHZlY3RvciAqLworCisgIFBSSVYoc3ltY2FjaGUpID0gc3ltYm9sczsKKyAgYmZkX2hhc2hfdHJhdmVyc2UoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgY29weV9zeW1ib2xzLCAoUFRSKWFiZmQpOworCisgIHN5bWJvbHNbUFJJVihnc2Rfc3ltX2NvdW50KV0gPSBOVUxMOworCisgIHJldHVybiBQUklWKGdzZF9zeW1fY291bnQpOworfQorCisKKy8qIENyZWF0ZSBhIG5ldyBhc3ltYm9sIHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBhYmZkIGFuZCByZXR1cm4gYSBwb2ludGVyCisgICB0byBpdC4KKyAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoIGJhY2sgZW5kIGhhcyBwcml2YXRlIGluZm9ybWF0aW9uCisgICBzdXJyb3VuZGluZyB0aGUgYXN5bWJvbC4gQnVpbGRpbmcgeW91ciBvd24gYXN5bWJvbCBhbmQgcG9pbnRpbmcgdG8gaXQKKyAgIHdpbGwgbm90IGNyZWF0ZSB0aGUgcHJpdmF0ZSBpbmZvcm1hdGlvbiwgYW5kIHdpbGwgY2F1c2UgcHJvYmxlbXMgbGF0ZXIgb24uICAqLworCithc3ltYm9sICoKK19iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzeW1ib2wgKnN5bWJvbCA9IChhc3ltYm9sICopYmZkX3phbGxvYyhhYmZkLCBzaXplb2YoYXN5bWJvbCkpOworCisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgIl9iZmRfdm1zX21ha2VfZW1wdHlfc3ltYm9sKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKworICBpZiAoc3ltYm9sID09IDApCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHN5bWJvbC0+dGhlX2JmZCA9IGFiZmQ7CisKKyAgcmV0dXJuIHN5bWJvbDsKK30KKworCisvKiBQcmludCBzeW1ib2wgdG8gZmlsZSBhY2NvcmRpbmcgdG8gaG93LiBob3cgaXMgb25lIG9mCisgICBiZmRfcHJpbnRfc3ltYm9sX25hbWUJanVzdCBwcmludCB0aGUgbmFtZQorICAgYmZkX3ByaW50X3N5bWJvbF9tb3JlCXByaW50IG1vcmUgKD8/PykKKyAgIGJmZF9wcmludF9zeW1ib2xfYWxsCXByaW50IGFsbCB3ZSBrbm93LCB3aGljaCBpcyBub3QgbXVjaCByaWdodCBub3cgOi0pICAqLworCitzdGF0aWMgdm9pZAordm1zX3ByaW50X3N5bWJvbCAoYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGZpbGU7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX3ByaW50X3N5bWJvbCglcCwgJXAsICVwLCAlZClcbiIsIGFiZmQsIGZpbGUsIHN5bWJvbCwgaG93KTsKKyNlbmRpZgorCisgIHN3aXRjaCAoaG93KQorICAgIHsKKyAgICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgorICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6CisJZnByaW50ZigoRklMRSAqKWZpbGUsIiAlcyIsIHN5bWJvbC0+bmFtZSk7CisgICAgICBicmVhazsKKworICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6CisJeworCSAgQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOworCisJICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKChQVFIpZmlsZSxzeW1ib2wpOworCisJICBmcHJpbnRmKChGSUxFICopZmlsZSwiICUtOHMgJXMiLCBzZWN0aW9uX25hbWUsIHN5bWJvbC0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuOworfQorCisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBzeW1ib2wgaW4gcmV0LgorCisgICBmaWxsIHR5cGUsIHZhbHVlIGFuZCBuYW1lCisgICB0eXBlOgorCUEJYWJzb2x1dGUKKwlCCWJzcyBzZWdtZW50IHN5bWJvbAorCUMJY29tbW9uIHN5bWJvbAorCUQJZGF0YSBzZWdtZW50IHN5bWJvbAorCWYJZmlsZW5hbWUKKwl0CWEgc3RhdGljIGZ1bmN0aW9uIHN5bWJvbAorCVQJdGV4dCBzZWdtZW50IHN5bWJvbAorCVUJdW5kZWZpbmVkCisJLQlkZWJ1ZyAgKi8KKworc3RhdGljIHZvaWQKK3Ztc19nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKnN5bWJvbDsKKyAgICAgc3ltYm9sX2luZm8gKnJldDsKK3sKKyAgYXNlY3Rpb24gKnNlYzsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3N5bWJvbF9pbmZvKCVwLCAlcCwgJXApXG4iLCBhYmZkLCBzeW1ib2wsIHJldCk7CisjZW5kaWYKKworICBzZWMgPSBzeW1ib2wtPnNlY3Rpb247CisKKyAgaWYgKHJldCA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQorICAgIHJldC0+dHlwZSA9ICdDJzsKKyAgZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQorICAgIHJldC0+dHlwZSA9ICdBJzsKKyAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQorICAgIHJldC0+dHlwZSA9ICdVJzsKKyAgZWxzZSBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzZWMpKQorICAgIHJldC0+dHlwZSA9ICdJJzsKKyAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpCisgICAgcmV0LT50eXBlID0gJ1QnOworICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfREFUQSkKKyAgICByZXQtPnR5cGUgPSAnRCc7CisgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19BTExPQykKKyAgICByZXQtPnR5cGUgPSAnQic7CisgIGVsc2UKKyAgICByZXQtPnR5cGUgPSAnLSc7CisKKyAgaWYgKHJldC0+dHlwZSAhPSAnVScpCisgICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYTsKKyAgZWxzZQorICAgIHJldC0+dmFsdWUgPSAwOworICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7CisKKyAgcmV0dXJuOworfQorCisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzeW1ib2wgc3ltIGluIHRoZSBCRkQgYWJmZCBpcworICAgYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuIGZhbHNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUoJXAsICVzKVxuIiwgYWJmZCwgbmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOworfQorCisKKy8qIEdldCBzb3VyY2UgbGluZSBudW1iZXIgZm9yIHN5bWJvbCAgKi8KKworc3RhdGljIGFsZW50ICoKK3Ztc19nZXRfbGluZW5vIChhYmZkLCBzeW1ib2wpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqc3ltYm9sOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2xpbmVubyglcCwgJXApXG4iLCBhYmZkLCBzeW1ib2wpOworI2VuZGlmCisgIHJldHVybiAwOworfQorCisKKy8qIFByb3ZpZGVkIGEgQkZELCBhIHNlY3Rpb24gYW5kIGFuIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uLCBjYWxjdWxhdGUgYW5kCisgICByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGFuZCB0aGUgbGluZSBuZWFyZXN0IHRvIHRoZSB3YW50ZWQKKyAgIGxvY2F0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlLCBmdW5jLCBsaW5lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKKyAgICAgYmZkX3ZtYSBvZmZzZXQ7CisgICAgIENPTlNUIGNoYXIgKipmaWxlOworICAgICBDT05TVCBjaGFyICoqZnVuYzsKKyAgICAgdW5zaWduZWQgaW50ICpsaW5lOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfZmluZF9uZWFyZXN0X2xpbmUoJXAsICVzLCAlcCwgJWxkLCA8cmV0PiwgPHJldD4sIDxyZXQ+KVxuIiwKKwkgICAgICBhYmZkLCBzZWN0aW9uLT5uYW1lLCBzeW1ib2xzLCAobG9uZyBpbnQpb2Zmc2V0KTsKKyNlbmRpZgorICByZXR1cm4gZmFsc2U7Cit9CisKKworLyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKKyAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgorICAgd2hlbiBjcmVhdGluZyBDT0ZGIGZpbGVzLiAgKi8KKworc3RhdGljIGFzeW1ib2wgKgordm1zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAoYWJmZCwgcHRyLCBzaXplKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHZvaWQgKnB0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBzaXplOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sKCVwLCAlcCwgJWxkKVxuIiwgYWJmZCwgcHRyLCBzaXplKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworCisvKiBSZWFkIG1pbmlzeW1ib2xzLiAgRm9yIG1pbmlzeW1ib2xzLCB3ZSB1c2UgdGhlIHVubW9kaWZpZWQgYS5vdXQKKyAgIHN5bWJvbHMuICBUaGUgbWluaXN5bWJvbF90b19zeW1ib2wgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGVzZSBpbnRvCisgICBCRkQgYXN5bWJvbCBzdHJ1Y3R1cmVzLiAgKi8KKworc3RhdGljIGxvbmcKK3Ztc19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZHluYW1pYzsKKyAgICAgUFRSICptaW5pc3ltc3A7CisgICAgIHVuc2lnbmVkIGludCAqc2l6ZXA7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19yZWFkX21pbmlzeW1ib2xzKCVwLCAlZCwgJXAsICVkKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCAqc2l6ZXApOworI2VuZGlmCisgIHJldHVybiBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCk7Cit9CisKKy8qIENvbnZlcnQgYSBtaW5pc3ltYm9sIHRvIGEgQkZEIGFzeW1ib2wuICBBIG1pbmlzeW1ib2wgaXMganVzdCBhbgorICAgdW5tb2RpZmllZCBhLm91dCBzeW1ib2wuICBUaGUgU1lNIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlIHJldHVybmVkCisgICBieSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wsIHdoaWNoIHdlIGZpbGwgaW4gaGVyZS4gICovCisKK3N0YXRpYyBhc3ltYm9sICoKK3Ztc19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZHluYW1pYzsKKyAgICAgY29uc3QgUFRSIG1pbmlzeW07CisgICAgIGFzeW1ib2wgKnN5bTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sKCVwLCAlZCwgJXAsICVwKVxuIiwgYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKKyNlbmRpZgorICByZXR1cm4gX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOworfQorCisvKi0tIFBhcnQgNC42LCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uCisgICBhc3NvY2lhdGVkIHdpdGggc2VjdGlvbiBzZWN0IGF0dGFjaGVkIHRvIGJmZCBhYmZkLgorICAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuICAqLworCitzdGF0aWMgbG9uZwordm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCglcCwgJXMpXG4iLCBhYmZkLCBzZWN0aW9uLT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gLTFMOworfQorCisKKy8qIENhbGwgdGhlIGJhY2sgZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlbiBCRkQgYWJmZCBhbmQgdHJhbnNsYXRlIHRoZQorICAgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBzZWMgaW50byB0aGUKKyAgIGludGVybmFsIGNhbm9uaWNhbCBmb3JtLiAgUGxhY2UgdGhlIHRhYmxlIGludG8gbWVtb3J5IGF0IGxvYywgd2hpY2ggaGFzCisgICBiZWVuIHByZWFsbG9jYXRlZCwgdXN1YWxseSBieSBhIGNhbGwgdG8gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiByZWxvY3MsIG9yIC0xIG9uIGVycm9yLiAgKi8KKworc3RhdGljIGxvbmcKK3Ztc19jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBhcmVsZW50ICoqbG9jYXRpb247CisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfY2Fub25pY2FsaXplX3JlbG9jKCVwLCAlcywgPHJldD4sIDxyZXQ+KVxuIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGlzIGlzIGp1c3QgY29waWVkIGZyb20gZWNvZmYtYWxwaGEsIG5lZWRzIHRvIGJlIGZpeGVkIHByb2JhYmx5ICovCisKKy8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgKi8KKworc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQorcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgUFRSIGRhdGE7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInJlbG9jX25pbChhYmZkICVwLCBvdXRwdXRfYmZkICVwKVxuIiwgYWJmZCwgb3V0cHV0X2JmZCk7CisgIHZtc19kZWJ1ZyAoMiwgIkluIHNlY3Rpb24gJXMsIHN5bWJvbCAlc1xuIiwKKwlzZWMtPm5hbWUsIHN5bS0+bmFtZSk7CisgIHZtc19kZWJ1ZyAoMiwgInJlbG9jIHN5bSAlcywgYWRkciAlMDhseCwgYWRkZW5kICUwOGx4LCByZWxvYyBpcyBhICVzXG4iLAorCQlyZWxvYy0+c3ltX3B0cl9wdHJbMF0tPm5hbWUsCisJCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRyZXNzLAorCQkodW5zaWduZWQgbG9uZylyZWxvYy0+YWRkZW5kLCByZWxvYy0+aG93dG8tPm5hbWUpOworICB2bXNfZGVidWcgKDIsICJkYXRhIGF0ICVwXG4iLCBkYXRhKTsKKy8qICBfYmZkX2hleGR1bXAgKDIsIGRhdGEsIGJmZF9nZXRfcmVsb2Nfc2l6ZShyZWxvYy0+aG93dG8pLDApOyAqLworI2VuZGlmCisKKyAgcmV0dXJuIGJmZF9yZWxvY19vazsKK30KKworLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQorICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLworI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIGFscGhhX2hvd3RvX3RhYmxlW10gPQoreworICBIT1dUTyAoQUxQSEFfUl9JR05PUkUsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDgsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIklHTk9SRSIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLworICBIT1dUTyAoQUxQSEFfUl9SRUZRVUFELAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA2NCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogQSAyMSBiaXQgYnJhbmNoLiAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZXNlIGZvcgorICAgICBicmFuY2hlcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYW5kIGFsc28gZmlsbHMgaW4gdGhlIFBDCisgICAgIHJlbGF0aXZlIG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBIT1dUTyAoQUxQSEFfUl9CUkFERFIsCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDIxLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkJSQUREUiIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDB4MWZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgxZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIGhpbnQgZm9yIGEganVtcCB0byBhIHJlZ2lzdGVyLiAgKi8KKyAgSE9XVE8gKEFMUEhBX1JfSElOVCwJCS8qIHR5cGUgKi8KKwkgMiwJCQkvKiByaWdodHNoaWZ0ICovCisJIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDE0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJISU5UIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHgzZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHgzZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCisgIEhPV1RPIChBTFBIQV9SX1NSRUwxNiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMTYsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCisgIEhPV1RPIChBTFBIQV9SX1NSRUwzMiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgMzIsCQkJLyogYml0c2l6ZSAqLworCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiU1JFTDMyIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBBIDY0IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLworICBIT1dUTyAoQUxQSEFfUl9TUkVMNjQsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDY0LAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlNSRUw2NCIsCQkvKiBuYW1lICovCisJIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCisJIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIFB1c2ggYSB2YWx1ZSBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gICovCisgIEhPV1RPIChBTFBIQV9SX09QX1BVU0gsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJPUF9QVVNIIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICBTdG9yZSBpdCBpbgorICAgICBhIGJpdGZpZWxkIG9mIHNpemUgcl9zaXplIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiByX29mZnNldC4gICovCisgIEhPV1RPIChBTFBIQV9SX09QX1NUT1JFLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSA2NCwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogU3VidHJhY3QgdGhlIHJlbG9jIGFkZHJlc3MgZnJvbSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUKKyAgICAgcmVsb2NhdGlvbiBzdGFjay4gICovCisgIEhPV1RPIChBTFBIQV9SX09QX1BTVUIsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDAsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLworCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJPUF9QU1VCIiwJCS8qIG5hbWUgKi8KKwkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCisJIDAsCQkJLyogc3JjX21hc2sgKi8KKwkgMCwJCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworICAvKiBTaGlmdCB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgcmVsb2NhdGlvbiBzdGFjayByaWdodCBieSB0aGUKKyAgICAgZ2l2ZW4gdmFsdWUuICAqLworICBIT1dUTyAoQUxQSEFfUl9PUF9QUlNISUZULAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiT1BfUFJTSElGVCIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCisKKyAgLyogSGFjay4gTGlua2FnZSBpcyBkb25lIGJ5IGxpbmtlci4gICovCisgIEhPV1RPIChBTFBIQV9SX0xJTktBR0UsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDgsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDI1NiwJCQkvKiBiaXRzaXplICovCisJIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCisJIDAsCQkJLyogYml0cG9zICovCisJIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIkxJTktBR0UiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMCwJCQkvKiBzcmNfbWFzayAqLworCSAwLAkJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCisgIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KKwkgIlJFRkxPTkciLAkJLyogbmFtZSAqLworCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCisJIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLworCisgIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHByb2NlZHVyZSwgd3JpdHRlbiBhcyAzMiBiaXQgdmFsdWUuICAqLworICBIT1dUTyAoQUxQSEFfUl9DT0RFQUREUiwJLyogdHlwZSAqLworCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KKwkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KKwkgNjQsCQkJLyogYml0c2l6ZSAqLworCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiQ09ERUFERFIiLAkJLyogbmFtZSAqLworCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworfTsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCwgd2hlbiBpbnZva2VkLCB3aWxsIHBlcmZvcm0KKyAgIHRoZSByZWxvY2F0aW9uIGNvZGUgb24gZGF0YSBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgbm90ZWQuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCit2bXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworeworICBpbnQgYWxwaGFfdHlwZTsKKworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKCVwLCAlZClcdCIsIGFiZmQsIGNvZGUpOworI2VuZGlmCisKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDE2OwlicmVhazsKKyAgICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGTE9ORzsJYnJlYWs7CisgICAgICBjYXNlIEJGRF9SRUxPQ182NDoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRlFVQUQ7CWJyZWFrOworICAgICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCWFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRlFVQUQ7CWJyZWFrOworICAgICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6CWFscGhhX3R5cGUgPSBBTFBIQV9SX0JSQUREUjsJYnJlYWs7CisgICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOglhbHBoYV90eXBlID0gQUxQSEFfUl9ISU5UOwlicmVhazsKKyAgICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDE2OwlicmVhazsKKyAgICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDMyOwlicmVhazsKKyAgICAgIGNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDY0OwlicmVhazsKKyAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0U6CWFscGhhX3R5cGUgPSBBTFBIQV9SX0xJTktBR0U7CWJyZWFrOworICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFI6CWFscGhhX3R5cGUgPSBBTFBIQV9SX0NPREVBRERSOwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgicmVsb2MgKCVkKSBpcyAqVU5LTk9XTioiLCBjb2RlKTsKKwlyZXR1cm4gKGNvbnN0IHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgTlVMTDsKKyAgICB9CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMiwgInJlbG9jIGlzICVzXG4iLCBhbHBoYV9ob3d0b190YWJsZVthbHBoYV90eXBlXS5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gJmFscGhhX2hvd3RvX3RhYmxlW2FscGhhX3R5cGVdOworfQorCisKKy8qLS0gUGFydCA0LjcsIHdyaXRpbmcgYW4gb2JqZWN0IGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBpbiBCRkQgYWJmZCB0byBhcmNoIGFuZCBtYWNoLgorICAgRmluZCB0aGUgY29ycmVjdCBwb2ludGVyIHRvIGEgc3RydWN0dXJlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgYXJjaF9pbmZvCisgICBwb2ludGVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19zZXRfYXJjaF9tYWNoKCVwLCAlZCwgJWxkKVxuIiwgYWJmZCwgYXJjaCwgbWFjaCk7CisjZW5kaWYKKyAgYWJmZC0+YXJjaF9pbmZvID0gYmZkX3NjYW5fYXJjaCgiYWxwaGEiKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBzZWN0aW9uIGluIEJGRCBhYmZkIHRvIHRoZSBkYXRhIHN0YXJ0aW5nCisgICBpbiBtZW1vcnkgYXQgZGF0YS4gVGhlIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gc3RhcnRpbmcgYXQKKyAgIG9mZnNldCBvZmZzZXQgZm9yIGNvdW50IGJ5dGVzLgorCisgICBOb3JtYWxseSB0cnVlIGlzIHJldHVybmVkLCBlbHNlIGZhbHNlLiBQb3NzaWJsZSBlcnJvciByZXR1cm5zIGFyZToKKyAgIG8gYmZkX2Vycm9yX25vX2NvbnRlbnRzIC0gVGhlIG91dHB1dCBzZWN0aW9uIGRvZXMgbm90IGhhdmUgdGhlCisJU0VDX0hBU19DT05URU5UUyBhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCisgICBvIGFuZCBzb21lIG1vcmUgdG9vICAqLworCitzdGF0aWMgYm9vbGVhbgordm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGxvY2F0aW9uOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19zZXRfc2VjdGlvbl9jb250ZW50cyglcCwgc2VjICVzLCBsb2MgJXAsIG9mZiAlbGQsIGNvdW50ICVkKVxuIiwKKwkJCQkJYWJmZCwgc2VjdGlvbi0+bmFtZSwgbG9jYXRpb24sIChsb25nIGludClvZmZzZXQsIChpbnQpY291bnQpOworICB2bXNfZGVidWcgKDIsICJzZWNyYXcgJWQsIHNlY2Nvb2tlZCAlZFxuIiwgKGludClzZWN0aW9uLT5fcmF3X3NpemUsIChpbnQpc2VjdGlvbi0+X2Nvb2tlZF9zaXplKTsKKyNlbmRpZgorICByZXR1cm4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KTsKK30KKworCisvKi0tIFBhcnQgNC44LCBsaW5rZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KKworc3RhdGljIGludAordm1zX3NpemVvZl9oZWFkZXJzIChhYmZkLCByZWxvYykKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIHJlbG9jOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfc2l6ZW9mX2hlYWRlcnMoJXAsICVzKVxuIiwgYWJmZCwgKHJlbG9jKT8iVHJ1ZSI6IkZhbHNlIik7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUHJvdmlkZXMgZGVmYXVsdCBoYW5kbGluZyBvZiByZWxvY2F0aW9uIGVmZm9ydCBmb3IgYmFjayBlbmRzCisgICB3aGljaCBjYW4ndCBiZSBib3RoZXJlZCB0byBkbyBpdCBlZmZpY2llbnRseS4gICovCisKK3N0YXRpYyBiZmRfYnl0ZSAqCit2bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCBkYXRhLAorCQkJCQkgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKKyAgICAgYmZkX2J5dGUgKmRhdGE7CisgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOworICAgICBhc3ltYm9sICoqc3ltYm9sczsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMoJXAsICVwLCAlcCwgJXAsICVzLCAlcClcbiIsCisJCQlhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsIChyZWxvY2F0ZWFibGUpPyJUcnVlIjoiRmFsc2UiLCBzeW1ib2xzKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworCisvKiA/Pz8gICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfYmZkX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87CisgICAgIGJvb2xlYW4gKmFnYWluOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3JlbGF4X3NlY3Rpb24oJXAsICVzLCAlcCwgPHJldD4pXG4iLAorCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsaW5rX2luZm8pOworI2VuZGlmCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbGVhbgordm1zX2JmZF9nY19zZWN0aW9ucyAoYWJmZCwgbGlua19pbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZ2Nfc2VjdGlvbnMoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCisgICBkaWZmZXJlbnQgaW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCit2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworLyogQWRkIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCBmaWxlIGludG8gdGhlIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgordm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBsaW5rX2luZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzKCVwLCAlcClcbiIsIGFiZmQsIGxpbmtfaW5mbyk7CisjZW5kaWYKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKKyAgIHNlY3Rpb24gb2YgdGhlIEJGRC4gICovCisKK3N0YXRpYyBib29sZWFuCit2bXNfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGxpbmtfaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2ZpbmFsX2xpbmsoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKKyNlbmRpZgorICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2hvdWxkIHRoaXMgc2VjdGlvbiBiZSBzcGxpdCB1cCBpbnRvIHNtYWxsZXIgcGllY2VzIGR1cmluZyBsaW5raW5nLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworI2lmIFZNU19ERUJVRworICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiglcCwgJXMpXG4iLCBhYmZkLCBzZWN0aW9uLT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qLS0gUGFydCA0LjksIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCisKK3N0YXRpYyBsb25nCit2bXNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQoJXApXG4iLCBhYmZkKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2xlYW4KK3Ztc19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmlsZSkKKyAgICBiZmQgKmFiZmQ7CisgICAgdm9pZCAqZmlsZTsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KKworc3RhdGljIGxvbmcKK3Ztc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bWJvbHMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIoJXAsIDxyZXQ+KVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIDBMOworfQorCisKKy8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCisKK3N0YXRpYyBsb25nCit2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyNpZiBWTVNfREVCVUcKKyAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKCVwKVxuIiwgYWJmZCk7CisjZW5kaWYKKyAgcmV0dXJuIDBMOworfQorCisKKy8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KKworc3RhdGljIGxvbmcKK3Ztc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgYXJlbCwgc3ltYm9scykKKyAgICAgYmZkICphYmZkOworICAgICBhcmVsZW50ICoqYXJlbDsKKyAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Cit7CisjaWYgVk1TX0RFQlVHCisgIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyglcClcbiIsIGFiZmQpOworI2VuZGlmCisgIHJldHVybiAwTDsKK30KZGlmZiAtLWdpdCBhL2JmZC92bXMuaCBiL2JmZC92bXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmJkZDAyCi0tLSAvZGV2L251bGwKKysrIGIvYmZkL3Ztcy5oCkBAIC0wLDAgKzEsNjc1IEBACisjdW5kZWYgdm1zCisvKiB2bXMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVk1TIChBbHBoYSBhbmQgVmF4KSBzdXBwb3J0LgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFZNU19ICisjZGVmaW5lIFZNU19ICisKKworLyogQ29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggJ0V4eHhfJyBhcmUgZm9yIG9wZW5WTVMvQWxwaGEgKEVWQVggb2JqZWN0IGxhbmd1YWdlKSAgKi8KKworLyogVk1TIFRleHQsIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIHJlY29yZCAoVElSL0VUSVIpIGRlZmluaXRpb25zLiAgKi8KKworI2RlZmluZSBUSVJfU19DX1NUQV9HQkwJCTAKKyNkZWZpbmUgVElSX1NfQ19TVEFfU0IJCTEKKyNkZWZpbmUgVElSX1NfQ19TVEFfU1cJCTIKKyNkZWZpbmUgVElSX1NfQ19TVEFfTFcJCTMKKyNkZWZpbmUgVElSX1NfQ19TVEFfUEIJCTQKKyNkZWZpbmUgVElSX1NfQ19TVEFfUFcJCTUKKyNkZWZpbmUgVElSX1NfQ19TVEFfUEwJCTYKKyNkZWZpbmUgVElSX1NfQ19TVEFfVUIgIAk3CisjZGVmaW5lIFRJUl9TX0NfU1RBX1VXICAJOAorI2RlZmluZSBUSVJfU19DX1NUQV9CRkkgCTkKKyNkZWZpbmUgVElSX1NfQ19TVEFfV0ZJIAkxMAorI2RlZmluZSBUSVJfU19DX1NUQV9MRkkgCTExCisjZGVmaW5lIFRJUl9TX0NfU1RBX0VQTSAJMTIKKyNkZWZpbmUgVElSX1NfQ19TVEFfQ0tBUkcgICAgICAgMTMKKyNkZWZpbmUgVElSX1NfQ19TVEFfV1BCIAkxNAorI2RlZmluZSBUSVJfU19DX1NUQV9XUFcgCTE1CisjZGVmaW5lIFRJUl9TX0NfU1RBX1dQTCAJMTYKKyNkZWZpbmUgVElSX1NfQ19TVEFfTFNZIAkxNworI2RlZmluZSBUSVJfU19DX1NUQV9MSVQgCTE4CisjZGVmaW5lIFRJUl9TX0NfU1RBX0xFUE0gICAgICAgIDE5CisjZGVmaW5lIFRJUl9TX0NfTUFYU1RBQ09EICAgICAgIDE5CisjZGVmaW5lIFRJUl9TX0NfTUlOU1RPQ09EICAgICAgIDIwCisjZGVmaW5lIFRJUl9TX0NfU1RPX1NCICAJMjAKKyNkZWZpbmUgVElSX1NfQ19TVE9fU1cgIAkyMQorI2RlZmluZSBUSVJfU19DX1NUT19MICAgCTIyCisjZGVmaW5lIFRJUl9TX0NfU1RPX0xXICAJMjIKKyNkZWZpbmUgVElSX1NfQ19TVE9fQkQgIAkyMworI2RlZmluZSBUSVJfU19DX1NUT19XRCAgCTI0CisjZGVmaW5lIFRJUl9TX0NfU1RPX0xEICAJMjUKKyNkZWZpbmUgVElSX1NfQ19TVE9fTEkgIAkyNgorI2RlZmluZSBUSVJfU19DX1NUT19QSURSICAgICAgICAyNworI2RlZmluZSBUSVJfU19DX1NUT19QSUNSICAgICAgICAyOAorI2RlZmluZSBUSVJfU19DX1NUT19SU0IgCTI5CisjZGVmaW5lIFRJUl9TX0NfU1RPX1JTVyAJMzAKKyNkZWZpbmUgVElSX1NfQ19TVE9fUkwgIAkzMQorI2RlZmluZSBUSVJfU19DX1NUT19WUFMgCTMyCisjZGVmaW5lIFRJUl9TX0NfU1RPX1VTQiAJMzMKKyNkZWZpbmUgVElSX1NfQ19TVE9fVVNXIAkzNAorI2RlZmluZSBUSVJfU19DX1NUT19SVUIgCTM1CisjZGVmaW5lIFRJUl9TX0NfU1RPX1JVVyAJMzYKKyNkZWZpbmUgVElSX1NfQ19TVE9fQiAgIAkzNworI2RlZmluZSBUSVJfU19DX1NUT19XICAgCTM4CisjZGVmaW5lIFRJUl9TX0NfU1RPX1JCICAJMzkKKyNkZWZpbmUgVElSX1NfQ19TVE9fUlcgIAk0MAorI2RlZmluZSBUSVJfU19DX1NUT19SSVZCICAgICAgICA0MQorI2RlZmluZSBUSVJfU19DX1NUT19QSVJSICAgICAgICA0MgorI2RlZmluZSBUSVJfU19DX01BWFNUT0NPRCAgICAgICA0MgorI2RlZmluZSBUSVJfU19DX01JTk9QUkNPRCAgICAgICA1MAorI2RlZmluZSBUSVJfU19DX09QUl9OT1AgCTUwCisjZGVmaW5lIFRJUl9TX0NfT1BSX0FERCAJNTEKKyNkZWZpbmUgVElSX1NfQ19PUFJfU1VCIAk1MgorI2RlZmluZSBUSVJfU19DX09QUl9NVUwgCTUzCisjZGVmaW5lIFRJUl9TX0NfT1BSX0RJViAJNTQKKyNkZWZpbmUgVElSX1NfQ19PUFJfQU5EIAk1NQorI2RlZmluZSBUSVJfU19DX09QUl9JT1IgCTU2CisjZGVmaW5lIFRJUl9TX0NfT1BSX0VPUiAJNTcKKyNkZWZpbmUgVElSX1NfQ19PUFJfTkVHIAk1OAorI2RlZmluZSBUSVJfU19DX09QUl9DT00gCTU5CisjZGVmaW5lIFRJUl9TX0NfT1BSX0lOU1YgICAgICAgIDYwCisjZGVmaW5lIFRJUl9TX0NfT1BSX0FTSCAJNjEKKyNkZWZpbmUgVElSX1NfQ19PUFJfVVNIIAk2MgorI2RlZmluZSBUSVJfU19DX09QUl9ST1QgCTYzCisjZGVmaW5lIFRJUl9TX0NfT1BSX1NFTCAJNjQKKyNkZWZpbmUgVElSX1NfQ19PUFJfUkVERUYgICAgICAgNjUKKyNkZWZpbmUgVElSX1NfQ19PUFJfREZMSVQgICAgICAgNjYKKyNkZWZpbmUgVElSX1NfQ19NQVhPUFJDT0QgICAgICAgNjYKKyNkZWZpbmUgVElSX1NfQ19NSU5DVExDT0QgICAgICAgODAKKyNkZWZpbmUgVElSX1NfQ19DVExfU0VUUkIgICAgICAgODAKKyNkZWZpbmUgVElSX1NfQ19DVExfQVVHUkIgICAgICAgODEKKyNkZWZpbmUgVElSX1NfQ19DVExfREZMT0MgICAgICAgODIKKyNkZWZpbmUgVElSX1NfQ19DVExfU1RMT0MgICAgICAgODMKKyNkZWZpbmUgVElSX1NfQ19DVExfU1RLREwgICAgICAgODQKKyNkZWZpbmUgVElSX1NfQ19NQVhDVExDT0QgICAgICAgODQKKworI2RlZmluZSBFVElSX1NfQ19NSU5TVEFDT0QgMAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLworI2RlZmluZSBFVElSX1NfQ19TVEFfR0JMIDAJCS8qIFN0YWNrIGdsb2JhbCBzeW1ib2wgdmFsdWUJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RBX0xXIDEJCS8qIFN0YWNrIGxvbmd3b3JkCQkqLworI2RlZmluZSBFVElSX1NfQ19TVEFfUVcgMgkJLyogU3RhY2sgcXVhZHdvcmQJCSovCisjZGVmaW5lIEVUSVJfU19DX1NUQV9QUSAzCQkvKiBTdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0ICAqLworI2RlZmluZSBFVElSX1NfQ19TVEFfTEkgNAkJLyogU3RhY2sgbGl0ZXJhbAkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RBX01PRCA1CQkvKiBTdGFjayBtb2R1bGUJCQkqLworI2RlZmluZSBFVElSX1NfQ19TVEFfQ0tBUkcgNgkJLyogQ2hlY2sgQXJndW1lbnRzCQkqLworI2RlZmluZSBFVElSX1NfQ19NQVhTVEFDT0QgNgkJLyogTWF4aW11bSBzdGFjayBjb2RlCQkqLworI2RlZmluZSBFVElSX1NfQ19NSU5TVE9DT0QgNTAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RPX0IgNTAJCS8qIFN0b3JlIGJ5dGUJCQkqLworI2RlZmluZSBFVElSX1NfQ19TVE9fVyA1MQkJLyogU3RvcmUgd29yZAkJCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19MVyA1MgkJLyogU3RvcmUgbG9uZ3dvcmQJCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19RVyA1MwkJLyogU3RvcmUgcXVhZHdvcmQJCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19JTU1SIDU0CQkvKiBTdG9yZSBpbW1lZGlhdGUgUmVwZWF0ZWQJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTCA1NQkJLyogU3RvcmUgZ2xvYmFsCQkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RPX0NBIDU2CQkvKiBTdG9yZSBjb2RlIGFkZHJlc3MJCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19SQiA1NwkJLyogU3RvcmUgcmVsYXRpdmUgYnJhbmNoCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19BQiA1OAkJLyogU3RvcmUgYWJzb2x1dGUgYnJhbmNoCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19PRkYgNTkJCS8qIFN0b3JlIG9mZnNldCB3aXRoaW4gcHNlY3QJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTSA2MQkJLyogU3RvcmUgaW1tZWRpYXRlCQkqLworI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMX0xXIDYyCQkvKiBTdG9yZSBnbG9iYWwgTG9uZ3dvcmQJKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RPX0xQX1BTQiA2MwkJLyogU1RPX0xQX1BTQiBub3QgdmFsaWQgaW4gbGV2ZWwgMiB1c2UgU1RDX0xQX1BTQgkJCSovCisjZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX0dCTCA2NAkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLworI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9QUyA2NQkJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KKyNkZWZpbmUgRVRJUl9TX0NfTUFYU1RPQ09EIDY1CQkvKiBNYXhpbXVtIHN0b3JlIGNvZGUJCSovCisjZGVmaW5lIEVUSVJfU19DX01JTk9QUkNPRCAxMDAJCS8qIE1pbmltdW0gb3BlcmF0ZSBjb2RlCQkqLworI2RlZmluZSBFVElSX1NfQ19PUFJfTk9QIDEwMAkJLyogTm8tb3AJCQkqLworI2RlZmluZSBFVElSX1NfQ19PUFJfQUREIDEwMQkJLyogQWRkCQkJCSovCisjZGVmaW5lIEVUSVJfU19DX09QUl9TVUIgMTAyCQkvKiBTdWJ0cmFjdAkJCSovCisjZGVmaW5lIEVUSVJfU19DX09QUl9NVUwgMTAzCQkvKiBNdWx0aXBseQkJCSovCisjZGVmaW5lIEVUSVJfU19DX09QUl9ESVYgMTA0CQkvKiBEaXZpZGUJCQkqLworI2RlZmluZSBFVElSX1NfQ19PUFJfQU5EIDEwNQkJLyogTG9naWNhbCBBTkQJCQkqLworI2RlZmluZSBFVElSX1NfQ19PUFJfSU9SIDEwNgkJLyogTG9naWNhbCBpbmNsdXNpdmUgT1IJCSovCisjZGVmaW5lIEVUSVJfU19DX09QUl9FT1IgMTA3CQkvKiBMb2dpY2FsIGV4Y2x1c2l2ZSBPUgkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfT1BSX05FRyAxMDgJCS8qIE5lZ2F0ZQkJCSovCisjZGVmaW5lIEVUSVJfU19DX09QUl9DT00gMTA5CQkvKiBDb21wbGVtZW50CQkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfT1BSX0lOU1YgMTEwCQkvKiBJbnNlcnQgYml0IGZpZWxkCQkqLworI2RlZmluZSBFVElSX1NfQ19PUFJfQVNIIDExMQkJLyogQXJpdGhtZXRpYyBzaGlmdAkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfT1BSX1VTSCAxMTIJCS8qIFVuc2lnbmVkIHNoaWZ0CQkqLworI2RlZmluZSBFVElSX1NfQ19PUFJfUk9UIDExMwkJLyogUm90YXRlCQkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfT1BSX1NFTCAxMTQJCS8qIFNlbGVjdCBvbmUgb2YgdGhyZWUgbG9uZ3dvcmRzIG9uIHRvcCBvZiBzdGFjayAgKi8KKyNkZWZpbmUgRVRJUl9TX0NfT1BSX1JFREVGIDExNQkJLyogUmVkZWZpbmUgdGhpcyBzeW1ib2wgYWZ0ZXIgcGFzcyAyICAqLworI2RlZmluZSBFVElSX1NfQ19PUFJfREZMSVQgMTE2CQkvKiBEZWZpbmUgYSBsaXRlcmFsCQkqLworI2RlZmluZSBFVElSX1NfQ19NQVhPUFJDT0QgMTE2CQkvKiBNYXhpbXVtIG9wZXJhdGUgY29kZQkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfTUlOQ1RMQ09EIDE1MAkJLyogTWluaW11bSBjb250cm9sIGNvZGUJCSovCisjZGVmaW5lIEVUSVJfU19DX0NUTF9TRVRSQiAxNTAJCS8qIFNldCByZWxvY2F0aW9uIGJhc2UJCSovCisjZGVmaW5lIEVUSVJfU19DX0NUTF9BVUdSQiAxNTEJCS8qIEF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlCSovCisjZGVmaW5lIEVUSVJfU19DX0NUTF9ERkxPQyAxNTIJCS8qIERlZmluZSBkZWJ1ZyBsb2NhdGlvbgkqLworI2RlZmluZSBFVElSX1NfQ19DVExfU1RMT0MgMTUzCQkvKiBTZXQgZGVidWcgbG9jYXRpb24JCSovCisjZGVmaW5lIEVUSVJfU19DX0NUTF9TVEtETCAxNTQJCS8qIFN0YWNrIGRlYnVnIGxvY2F0aW9uCQkqLworI2RlZmluZSBFVElSX1NfQ19NQVhDVExDT0QgMTU0CQkvKiBNYXhpbXVtIGNvbnRyb2wgY29kZQkJKi8KKyNkZWZpbmUgRVRJUl9TX0NfTUlOU1RDQ09EIDIwMAkJLyogTWluaW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCisjZGVmaW5lIEVUSVJfU19DX1NUQ19MUCAyMDAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciAgICAqLworI2RlZmluZSBFVElSX1NfQ19TVENfTFBfUFNCIDIwMQkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZSAqLworI2RlZmluZSBFVElSX1NfQ19TVENfR0JMIDIwMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLworI2RlZmluZSBFVElSX1NfQ19TVENfR0NBIDIwMwkJLyogU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCisjZGVmaW5lIEVUSVJfU19DX1NUQ19QUyAyMDQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQgKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9HQkwgMjA1CS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbCAqLworI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX1BTIDIwNgkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQgKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9HQkwgMjA3CS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcyAqLworI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX1BTIDIwOAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQgKi8KKyNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9HQkwgMjA5CS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcyAqLworI2RlZmluZSBFVElSX1NfQ19TVENfTERBX1BTIDIxMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0ICovCisjZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfR0JMIDIxMQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcyAqLworI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX1BTIDIxMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldCAqLworI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX0dCTCAyMTMJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCisjZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfUFMgMjE0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KKyNkZWZpbmUgRVRJUl9TX0NfTUFYU1RDQ09EIDIxNAkJLyogTWF4aW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCisKKy8qIFZNUyBHbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkIChHU0QvRUdTRCkuICAqLworCisjZGVmaW5lIEdTRF9TX0tfRU5UUklFUyAxCisjZGVmaW5lIEdTRF9TX0NfRU5UUklFUyAxCisjZGVmaW5lIEdTRF9TX0NfUFNDICAgICAwCisjZGVmaW5lIEdTRF9TX0NfU1lNICAgICAxCisjZGVmaW5lIEdTRF9TX0NfRVBNICAgICAyCisjZGVmaW5lIEdTRF9TX0NfUFJPICAgICAzCisjZGVmaW5lIEdTRF9TX0NfU1lNVyAgICA0CisjZGVmaW5lIEdTRF9TX0NfRVBNVyAgICA1CisjZGVmaW5lIEdTRF9TX0NfUFJPVyAgICA2CisjZGVmaW5lIEdTRF9TX0NfSURDICAgICA3CisjZGVmaW5lIEdTRF9TX0NfRU5WICAgICA4CisjZGVmaW5lIEdTRF9TX0NfTFNZICAgICA5CisjZGVmaW5lIEdTRF9TX0NfTEVQTSAgICAxMAorI2RlZmluZSBHU0RfU19DX0xQUk8gICAgMTEKKyNkZWZpbmUgR1NEX1NfQ19TUFNDICAgIDEyCisjZGVmaW5lIEdTRF9TX0NfU1lNViAgICAxMworI2RlZmluZSBHU0RfU19DX0VQTVYgICAgMTQKKyNkZWZpbmUgR1NEX1NfQ19QUk9WICAgIDE1CisjZGVmaW5lIEdTRF9TX0NfTUFYUkVDVFlQICAgICAgIDE1CisKKyNkZWZpbmUgRUdTRF9TX0tfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KKyNkZWZpbmUgRUdTRF9TX0NfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KKyNkZWZpbmUgRUdTRF9TX0NfUFNDIDAJCS8qIFBzZWN0IGRlZmluaXRpb24JCQkqLworI2RlZmluZSBFR1NEX1NfQ19TWU0gMQkJLyogU3ltYm9sIHNwZWNpZmljYXRpb24JCQkqLworI2RlZmluZSBFR1NEX1NfQ19JREMgMgkJLyogUmFuZG9tIGVudGl0eSBjaGVjawkJCSovCisjZGVmaW5lIEVHU0RfU19DX1NQU0MgNQkJLyogU2hhcmVhYmxlIGltYWdlIHBzZWN0IGRlZmluaXRpb24JKi8KKyNkZWZpbmUgRUdTRF9TX0NfU1lNViA2CQkvKiBWZWN0b3JlZCAoZHVhbC12YWx1ZWQpIHZlcnNpb25zIG9mIFNZTSwgKi8KKyNkZWZpbmUgRUdTRF9TX0NfU1lNTSA3CQkvKiBNYXNrZWQgdmVyc2lvbnMgb2YgU1lNLAkJKi8KKyNkZWZpbmUgRUdTRF9TX0NfU1lNRyA4CQkvKiBFR1NUIC0gZ3N0IHZlcnNpb24gb2YgU1lNCQkqLworI2RlZmluZSBFR1NEX1NfQ19NQVhSRUNUWVAgOAkvKiBNYXhpbXVtIGVudHJ5IHR5cGUgZGVmaW5lZAkJKi8KKworI2RlZmluZSBHUFNfU19NX1BJQyAgICAgMQorI2RlZmluZSBHUFNfU19NX0xJQiAgICAgMgorI2RlZmluZSBHUFNfU19NX09WUiAgICAgNAorI2RlZmluZSBHUFNfU19NX1JFTCAgICAgOAorI2RlZmluZSBHUFNfU19NX0dCTCAgICAgMTYKKyNkZWZpbmUgR1BTX1NfTV9TSFIgICAgIDMyCisjZGVmaW5lIEdQU19TX01fRVhFICAgICA2NAorI2RlZmluZSBHUFNfU19NX1JEICAgICAgMTI4CisjZGVmaW5lIEdQU19TX01fV1JUICAgICAyNTYKKyNkZWZpbmUgR1BTX1NfTV9WRUMgICAgIDUxMgorI2RlZmluZSBHUFNfU19LX05BTUUgICAgOQorI2RlZmluZSBHUFNfU19DX05BTUUgICAgOQorCisjZGVmaW5lIEVHUFNfU19WX1BJQwkweDAwMDEKKyNkZWZpbmUgRUdQU19TX1ZfTElCCTB4MDAwMgorI2RlZmluZSBFR1BTX1NfVl9PVlIJMHgwMDA0CisjZGVmaW5lIEVHUFNfU19WX1JFTAkweDAwMDgKKyNkZWZpbmUgRUdQU19TX1ZfR0JMCTB4MDAxMAorI2RlZmluZSBFR1BTX1NfVl9TSFIJMHgwMDIwCisjZGVmaW5lIEVHUFNfU19WX0VYRQkweDAwNDAKKyNkZWZpbmUgRUdQU19TX1ZfUkQJMHgwMDgwCisjZGVmaW5lIEVHUFNfU19WX1dSVAkweDAxMDAKKyNkZWZpbmUgRUdQU19TX1ZfVkVDCTB4MDIwMAorI2RlZmluZSBFR1BTX1NfVl9OT01PRAkweDA0MDAKKyNkZWZpbmUgRUdQU19TX1ZfQ09NCTB4MDgwMAorCisjZGVmaW5lIEdTWV9TX01fV0VBSyAgICAxCisjZGVmaW5lIEdTWV9TX01fREVGICAgICAyCisjZGVmaW5lIEdTWV9TX01fVU5JICAgICA0CisjZGVmaW5lIEdTWV9TX01fUkVMICAgICA4CisKKyNkZWZpbmUgRUdTWV9TX1ZfV0VBSwkweDAwMDEKKyNkZWZpbmUgRUdTWV9TX1ZfREVGCTB4MDAwMgorI2RlZmluZSBFR1NZX1NfVl9VTkkJMHgwMDA0CisjZGVmaW5lIEVHU1lfU19WX1JFTAkweDAwMDgKKyNkZWZpbmUgRUdTWV9TX1ZfQ09NTQkweDAwMTAKKyNkZWZpbmUgRUdTWV9TX1ZfVkVDRVAJMHgwMDIwCisjZGVmaW5lIEVHU1lfU19WX05PUk0JMHgwMDQwCisKKyNkZWZpbmUgTFNZX1NfTV9ERUYgICAgIDIKKyNkZWZpbmUgTFNZX1NfTV9SRUwgICAgIDgKKworI2RlZmluZSBFTlZfU19NX0RFRiAgICAgMQorI2RlZmluZSBFTlZfU19NX05FU1RFRCAgMgorCisvKgorICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KKyAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKKyAqCQkJCQl0byBiZSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgRFNUX1NfQ19DCQkgIDcJLyogTGFuZ3VhZ2UgPT0gIkMiCSovCisjZGVmaW5lIERTVF9TX0NfQ1hYCQkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KKyNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCQkxNTMKKyNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJCTE1NQkvKiBTb3VyY2UgZmlsZQkJKi8KKyNkZWZpbmUgRFNUX1NfQ19QUk9MT0cJCTE2MgorI2RlZmluZQlEU1RfU19DX0JMS0JFRwkJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLworI2RlZmluZQlEU1RfU19DX0JMS0VORAkJMTc3CS8qIEVuZCBvZiBibG9jawkqLworI2RlZmluZSBEU1RfU19DX0VOVFJZCQkxODEKKyNkZWZpbmUgRFNUX1NfQ19QU0VDVAkJMTg0CisjZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLworI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgorI2RlZmluZSBEU1RfU19DX0xBQkVMCQkxODcKKyNkZWZpbmUJRFNUX1NfQ19NT0RCRUcJCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCisjZGVmaW5lCURTVF9TX0NfTU9ERU5ECQkxODkJLyogRW5kIG9mIG1vZHVsZQkqLworI2RlZmluZQlEU1RfU19DX1JUTkJFRwkJMTkwCS8qIEJlZ2lubmluZyBvZiByb3V0aW5lCSovCisjZGVmaW5lCURTVF9TX0NfUlRORU5ECQkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KKyNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLworI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLworI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCisjZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAorI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cgNQorI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IgNgorI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNworI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAorI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KKyNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCisjZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJMTEKKyNkZWZpbmUgRFNUX1NfQ19TRVRfUENfTAkxMgorI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCisjZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCisjZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KKyNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLworI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLworI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLworI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KKyNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCisjZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KKy8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KKyNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLworI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLworI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLworI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCisjZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KKyNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLworI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KKy8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgorICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCisgKi8KKyNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgorI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCisjZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKKyNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQorI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2CisjZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKKyNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAorI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5CisjZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKKyNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KKyNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLworI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLworI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCisjZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLworI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNworI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMworLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCisgKi8KKyNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KKyNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLworI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KKyNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KKyNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLworI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KKy8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KKyAqLworI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLworI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCisjZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KKyNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCisvKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKKyAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCisgKi8KKyNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKKyNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1CisjZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKKyNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLworI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgorI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKKyNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLworLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKKyAqLworI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLworI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLworI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLworI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLworI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCisjZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCisjZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCisjZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCisjZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKKyNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLworI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCisjZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KKyNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLworI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCisjZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KKyNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KKyNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKKyNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCisjZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAorCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKKyNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKKwkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCisvKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucworICovCisjZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KKy8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKKyAqLworI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCisjZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLworI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KKyNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCisjZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLworLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQorICogIGFjdHVhbCBkYXRhIHR5cGUKKyAqLworI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQorI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKKyNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKKyNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgorI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKKyNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQorCisvKiBWTVMgTW9kdWxlIGhlYWRlciByZWNvcmQgKEVNSCkgZGVmaW5pdGlvbnMuICAqLworCisjZGVmaW5lIE1IRF9TX0NfTUhEIDAKKyNkZWZpbmUgTUhEX1NfQ19MTk0gMQorI2RlZmluZSBNSERfU19DX1NSQyAyCisjZGVmaW5lIE1IRF9TX0NfVFRMIDMKKyNkZWZpbmUgTUhEX1NfQ19DUFIgNAorI2RlZmluZSBNSERfU19DX01UQyA1CisjZGVmaW5lIE1IRF9TX0NfR1RYIDYKKyNkZWZpbmUgTUhEX1NfQ19NQVhIRFJUWVAgNgorCisjZGVmaW5lIEVNSF9TX0NfTUhEIDAJCS8qIE1haW4gaGVhZGVyIHJlY29yZAkJKi8KKyNkZWZpbmUgRU1IX1NfQ19MTk0gMQkJLyogTGFuZ3VhZ2UgbmFtZSBhbmQgdmVyc2lvbgkqLworI2RlZmluZSBFTUhfU19DX1NSQyAyCQkvKiBTb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uCSovCisjZGVmaW5lIEVNSF9TX0NfVFRMIDMJCS8qIFRpdGxlIHRleHQgb2YgbW9kdWxlCQkqLworI2RlZmluZSBFTUhfU19DX0NQUiA0CQkvKiBDb3B5cmlnaHQgbm90aWNlCQkqLworI2RlZmluZSBFTUhfU19DX01UQyA1CQkvKiBNYWludGVuYW5jZSBzdGF0dXMJCSovCisjZGVmaW5lIEVNSF9TX0NfR1RYIDYJCS8qIEdlbmVyYWwgdGV4dAkJCSovCisjZGVmaW5lIEVNSF9TX0NfTUFYSERSVFlQIDYJLyogTWF4aW11bSBhbGxvd2FibGUgdHlwZQkqLworCisvKiB2bXMuYy4gICovCisKK2V4dGVybiBhc3ltYm9sICpfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworLyogdm1zLWdzZC5jLiAgKi8KKworZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOworZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOworCisvKiB2bXMtbWhkLmMuICAqLworCitleHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7CitleHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7CitleHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7CitleHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7CisKKy8qIHZtcy10aXIuYy4gICovCisKK2V4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKK2V4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKK2V4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKK2V4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfbG5rIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKKworZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOworZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOworZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOworCisvKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KKyNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKKyNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkxCisjZGVmaW5lIEFMUEhBX1JfQlJBRERSCQkyCisjZGVmaW5lIEFMUEhBX1JfSElOVAkJMworI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJNAorI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkJNQorI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkJNgorI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJCTcKKyNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRQk4CisjZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkJOQorI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQJMTAKKyNkZWZpbmUgQUxQSEFfUl9MSU5LQUdFCQkxMQorI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEyCisjZGVmaW5lIEFMUEhBX1JfQ09ERUFERFIJMTMKKworLyogT2JqZWN0IGxhbmd1YWdlIGRlZmluaXRpb25zLiAgKi8KKworI2RlZmluZSBPQkpfU19DX0hEUiAwCQkvKlZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KKyNkZWZpbmUgT0JKX1NfQ19HU0QgMQkJLypWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZAkqLworI2RlZmluZSBPQkpfU19DX1RJUiAyCQkvKlZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KKyNkZWZpbmUgT0JKX1NfQ19FT00gMwkJLypWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCisjZGVmaW5lIE9CSl9TX0NfREJHIDQJCS8qVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLworI2RlZmluZSBPQkpfU19DX1RCVCA1CQkvKlZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCisjZGVmaW5lIE9CSl9TX0NfTE5LIDYJCS8qVkFYIGxpbmtlciBvcHRpb25zIHJlY29yZAkJKi8KKyNkZWZpbmUgT0JKX1NfQ19FT01XIDcJCS8qVkFYIGVuZCBvZiBtb2R1bGUgd29yZC1wc2VjdCByZWNvcmQJKi8KKyNkZWZpbmUgT0JKX1NfQ19NQVhSRUNUWVAgNwkvKlZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCQkqLworI2RlZmluZSBFT0JKX1NfQ19FTUggOAkJLypFVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLworI2RlZmluZSBFT0JKX1NfQ19FRU9NIDkJCS8qRVZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KKyNkZWZpbmUgRU9CSl9TX0NfRUdTRCAxMAkvKkVWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAgKi8KKyNkZWZpbmUgRU9CSl9TX0NfRVRJUiAxMQkvKkVWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCisjZGVmaW5lIEVPQkpfU19DX0VEQkcgMTIJLypFVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLworI2RlZmluZSBFT0JKX1NfQ19FVEJUIDEzCS8qRVZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCisjZGVmaW5lIEVPQkpfU19DX01BWFJFQ1RZUCAxMwkvKkVWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkqLworI2RlZmluZSBPQkpfU19LX1NVQlRZUCAxCisjZGVmaW5lIE9CSl9TX0NfU1VCVFlQIDEKKyNkZWZpbmUgRU9CSl9TX0tfU1VCVFlQIDQKKyNkZWZpbmUgRU9CSl9TX0NfU1VCVFlQIDQKKyNkZWZpbmUgT0JKX1NfQ19NQVhSRUNTSVogMjA0OAkvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLworI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNTSVogODE5MiAvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLworI2RlZmluZSBPQkpfU19DX1NUUkxWTCAwCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVPQkpfU19DX1NUUkxWTCAyCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9CSl9TX0NfU1lNU0laIDMxCS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLworI2RlZmluZSBFT0JKX1NfQ19TWU1TSVogNjQJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCisjZGVmaW5lIEVPQkpfU19DX1NFQ1NJWiAzMQkvKk1heGltdW0gc2VjdGlvbiBuYW1lIGxlbmd0aAkJKi8KKyNkZWZpbmUgT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KKyNkZWZpbmUgRU9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCisjZGVmaW5lIE9CSl9TX0NfUFNDQUxJTElNIDkJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KKyNkZWZpbmUgRU9CSl9TX0NfUFNDQUxJTElNIDE2CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCisKKyNkZWZpbmUgRVZBWF9PRkZTRVQJMjU2CS8qdHlwZSBvZmZzZXQgZm9yIEVWQVggY29kZXMgaW4gc3dpdGNoICAqLworLyogTWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucy4gICovCisKKyNpZiBfX0dOVUNfXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdXF1YWQ7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVxdWFkOworI2VuZGlmCisKKyNkZWZpbmUgTUFYX09VVFJFQ19TSVpFIDQwOTYKKyNkZWZpbmUgTUlOX09VVFJFQ19MVUZUIDY0CisKK3R5cGVkZWYgc3RydWN0IF92bXNfc2VjdGlvbiB7CisgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOworICBiZmRfdm1hIG9mZnNldDsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICBzdHJ1Y3QgX3Ztc19zZWN0aW9uICpuZXh0OworfSB2bXNfc2VjdGlvbjsKKworZXh0ZXJuIGJvb2xlYW4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uCisgIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBkYXRhLCBmaWxlX3B0ciBvZmZzZXQsCisJICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOworZXh0ZXJuIHZtc19zZWN0aW9uICpfYmZkX2dldF92bXNfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCkpOworCit0eXBlZGVmIHN0cnVjdCBfdm1zX3JlbG9jIHsKKyAgc3RydWN0IF92bXNfcmVsb2MgKm5leHQ7CisgIGFyZWxlbnQgKnJlbG9jOworICBhc2VjdGlvbiAqc2VjdGlvbjsKK30gdm1zX3JlbG9jOworCisvKiB2bXMgbW9kdWxlIGhlYWRlciAgKi8KKworc3RydWN0IGhkcl9zdHJ1YyB7CisgIGludCBoZHJfYl9zdHJsdmw7CisgIGxvbmcgaGRyX2xfYXJjaDE7CisgIGxvbmcgaGRyX2xfYXJjaDI7CisgIGxvbmcgaGRyX2xfcmVjc2l6OworICBjaGFyICpoZHJfdF9uYW1lOworICBjaGFyICpoZHJfdF92ZXJzaW9uOworICBjaGFyICpoZHJfdF9kYXRlOworICBjaGFyICpoZHJfY19sbm07CisgIGNoYXIgKmhkcl9jX3NyYzsKKyAgY2hhciAqaGRyX2NfdHRsOworfTsKKworCisvKiB2bXMgZW5kIG9mIG1vZHVsZSAgKi8KKworc3RydWN0IGVvbV9zdHJ1YyB7CisgIGxvbmcgZW9tX2xfdG90YWxfbHBzOworICB1bnNpZ25lZCBjaGFyIGVvbV9iX2NvbWNvZDsKKyAgYm9vbGVhbiBlb21faGFzX3RyYW5zZmVyOworICB1bnNpZ25lZCBjaGFyIGVvbV9iX3RmcmZsZzsKKyAgbG9uZyBlb21fbF9wc2luZHg7CisgIGxvbmcgZW9tX2xfdGZyYWRyOworfTsKKworZW51bSBmaWxlX2Zvcm1hdF9lbnVtIHsgRkZfVU5LTk9XTiwgRkZfRk9SRUlHTiwgRkZfTkFUSVZFLCBGRl9WQVggfTsKKwordHlwZWRlZiBzdHJ1Y3Qgdm1zX3N5bWJvbF9zdHJ1Y3QgeworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgYmZkX2hhc2g7CisgIGFzeW1ib2wgKnN5bWJvbDsKK30gdm1zX3N5bWJvbF9lbnRyeTsKKworLyogc3RhY2sgdmFsdWUgZm9yIHB1c2gvcG9wIGNvbW1hbmRzICAqLworCitzdHJ1Y3Qgc3RhY2tfc3RydWN0IHsKKyAgdXF1YWQgdmFsdWU7CisgIGludCBwc2VjdDsKK307CisjZGVmaW5lIFNUQUNLU0laRSA4MTkyCisKKy8qIGxvY2F0aW9uIHN0YWNrIGRlZmluaXRpb25zIGZvciBDVExfREZMT0MsIENUTF9TVExPQywgYW5kIENUTF9TVEtETCAgKi8KKworc3RydWN0IGxvY2F0aW9uX3N0cnVjdCB7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIGludCBwc2VjdDsKK307CisjZGVmaW5lIExPQ0FUSU9OX1NBVkVfU0laRSAzMgorCisjZGVmaW5lIFZNU19TRUNUSU9OX0NPVU5UIDEwMjQKKworc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0IHsKKyAgaW50IGlzX3ZheDsKKyAgYm9vbGVhbiBmaXh1cF9kb25lOwkJCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWxsCisJCQkJCSAgIHNlY3Rpb24gcG9pbnRlcnMgYW5kIFBSSVYoc2VjdGlvbnMpCisJCQkJCSAgIGFyZSBzZXQgdXAgY29ycmVjdGx5ICAqLworICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwkJLyogYnVmZmVyIHRvIHJlY29yZCAgKi8KKyAgaW50IGJ1Zl9zaXplOwkJCQkvKiBtYXggc2l6ZSBvZiBidWZmZXIgICovCisgIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CQkvKiBhY3R1YWwgcmVjb3JkIHB0ciAgKi8KKyAgaW50IHJlY19sZW5ndGg7CQkJLyogcmVtYWluaW5nIHJlY29yZCBsZW5ndGggICovCisgIGludCByZWNfc2l6ZTsJCQkJLyogYWN0dWFsIHJlY29yZCBzaXplICAqLworICBpbnQgcmVjX3R5cGU7CQkJCS8qIGFjdHVhbCByZWNvcmQgdHlwZSAgKi8KKyAgZW51bSBmaWxlX2Zvcm1hdF9lbnVtIGZpbGVfZm9ybWF0OworCisgIHN0cnVjdCBoZHJfc3RydWMgaGRyX2RhdGE7CQkvKiBkYXRhIGZyb20gSERSL0VNSCByZWNvcmQgICovCisgIHN0cnVjdCBlb21fc3RydWMgZW9tX2RhdGE7CQkvKiBkYXRhIGZyb20gRU9NL0VFT00gcmVjb3JkICAqLworICBpbnQgc2VjdGlvbl9jb3VudDsJCQkvKiAjIG9mIHNlY3Rpb25zIGluIGZvbGxvd2luZyBhcnJheSAgKi8KKyAgYXNlY3Rpb24gKipzZWN0aW9uczsJCQkvKiBhcnJheSBvZiBHU0QvRUdTRCBzZWN0aW9ucyAgKi8KKyAgaW50IGdzZF9zeW1fY291bnQ7CQkJLyogIyBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLworICBhc3ltYm9sICoqc3ltYm9sczsJCQkvKiB2ZWN0b3Igb2YgR1NEL0VHU0Qgc3ltYm9scyAgKi8KKyAgc3RydWN0IHByb2NfdmFsdWUgKnByb2NlZHVyZTsKKworICBzdHJ1Y3Qgc3RhY2tfc3RydWN0ICpzdGFjazsKKyAgaW50IHN0YWNrcHRyOworCisgIHZtc19zZWN0aW9uICp2bXNfc2VjdGlvbl90YWJsZVtWTVNfU0VDVElPTl9DT1VOVF07CisKKyAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp2bXNfc3ltYm9sX3RhYmxlOworICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltY2FjaGU7CisgIGludCBzeW1udW07CisKKyAgc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqbG9jYXRpb25fc3RhY2s7CisKKyAgYXNlY3Rpb24gKmltYWdlX3NlY3Rpb247CQkvKiBzZWN0aW9uIGZvciBpbWFnZV9wdHIgICovCisgIHVuc2lnbmVkIGNoYXIgKmltYWdlX3B0cjsJCS8qIGEgcG9pbnRlciB0byBzZWN0aW9uLT5jb250ZW50cyAqLworCisgIHVuc2lnbmVkIGNoYXIgcGRzY1s4XTsJCS8qIHByb2NlZHVyZSBkZXNjcmlwdG9yICovCisKKyAgLyogT3V0cHV0IHJvdXRpbmUgc3RvcmFnZSAgKi8KKworICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfYnVmOwkJLyogb3V0cHV0IGRhdGEgICovCisgIGludCBwdXNoX2xldmVsOworICBpbnQgcHVzaGVkX3NpemU7CisgIGludCBsZW5ndGhfcG9zOworICBpbnQgb3V0cHV0X3NpemU7CisgIGludCBvdXRwdXRfYWxpZ25tZW50OworCisgIC8qIGxpbmthZ2UgaW5kZXggY291bnRlcgorICAgdXNlZCBieSBjb25kaXRpb25hbCBzdG9yZSBjb21tYW5kcyAoRVRJUl9TX0NfU1RDXykgICovCisKKyAgaW50IHZtc19saW5rYWdlX2luZGV4OworCisgIC8qIHNlZSB0Yy1hbHBoYS5jIG9mIGdhcyBmb3IgYSBkZXNjcmlwdGlvbi4gICovCisgIGludCBmbGFnX2hhc2hfbG9uZ19uYW1lczsJLyogLSssIGhhc2ggaW5zdGVhZCBvZiB0cnVuY2F0ZSAqLworICBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCwgc2hvdyBoYXNoaW5nL3RydW5jYXRpb24gKi8KK307CisKKyNkZWZpbmUgUFJJVihuYW1lKQkoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCAqKWFiZmQtPnRkYXRhLmFueSktPm5hbWUKKworI2RlZmluZSBTRUNUSU9OX05BTUVfVEVNUExBVEUgIl9fU0VDX18lZCIKKworI2lmIFZNU19ERUJVRworZXh0ZXJuIHZvaWQgX2JmZF92bXNfZGVidWcgUEFSQU1TKChpbnQgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgLi4uKSk7CitleHRlcm4gdm9pZCBfYmZkX2hleGR1bXAKKyAgUEFSQU1TICgoaW50IGxldmVsLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7CisKKyNkZWZpbmUgdm1zX2RlYnVnIF9iZmRfdm1zX2RlYnVnCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF92bXNfaGFzaF9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCisJICAgY29uc3QgY2hhciAqc3RyaW5nKSk7CitleHRlcm4gdm9pZCBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcworICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50ICp0eXBlLCBpbnQgKmxlbmd0aCkpOworZXh0ZXJuIGludCBfYmZkX3Ztc19nZXRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworZXh0ZXJuIGludCBfYmZkX3Ztc19uZXh0X3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IHNpemUpKTsKK2V4dGVybiBjaGFyICpfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnB0cikpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbCwgaW50IHBzZWN0KSk7CitleHRlcm4gdXF1YWQgX2JmZF92bXNfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50ICpwc2VjdCkpOworCitleHRlcm4gYm9vbGVhbiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGRhdGEsIGZpbGVfcHRyIG9mZnNldCwKKwkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7CitleHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfYmVnaW4KKyAgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgcmVjdHlwZSwgaW50IHJlY2hlYWQpKTsKK2V4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgYWxpZ250bykpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3B1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7CitleHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKK2V4dGVybiBpbnQgX2JmZF92bXNfb3V0cHV0X2NoZWNrIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHNpemUpKTsKK2V4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7CitleHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKK2V4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9sb25nIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3F1YWQgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICp2YWx1ZSkpOworZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJCQkgICBpbnQgbGVuZ3RoKSk7CitleHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmlsbCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOworZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKmluLCBpbnQgbWF4bGVuKSk7CisKK2V4dGVybiB2bXNfc3ltYm9sX2VudHJ5ICpfYmZkX3Ztc19lbnRlcl9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpuYW1lKSk7CisKKyNlbmRpZiAvKiBWTVNfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3hjb2ZmbGluay5jIGIvYmZkL3hjb2ZmbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODJkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9iZmQveGNvZmZsaW5rLmMKQEAgLTAsMCArMSw2NjM1IEBACisvKiBQT1dFUi9Qb3dlclBDIFhDT0ZGIGxpbmtlciBzdXBwb3J0LgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiwgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgorCisvKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFhDT0ZGIGxpbmtlciBjb2RlLiAgKi8KKworI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQorCisvKiBJbiBvcmRlciB0byBzdXBwb3J0IGxpbmtpbmcgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgaW50byBhbgorICAgWENPRkYgZm9ybWF0LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCisgICBiZmRfdGFyZ2V0IGlzIGFuIFhDT0ZGIHZlY3Rvci4gIEZJWE1FOiBXZSBuZWVkIHRvIHJldGhpbmsgdGhpcworICAgd2hvbGUgYXBwcm9hY2guICAqLworI2RlZmluZSBYQ09GRl9YVkVDUCh4dikgXAorICAoc3RyY21wICgoeHYpLT5uYW1lLCAiYWl4Y29mZi1yczYwMDAiKSA9PSAwIFwKKyAgIHx8IHN0cmNtcCAoKHh2KS0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgPT0gMCkKKworLyogR2V0IHRoZSBYQ09GRiBoYXNoIHRhYmxlIGVudHJpZXMgZm9yIGEgQkZELiAgKi8KKyNkZWZpbmUgb2JqX3hjb2ZmX3N5bV9oYXNoZXMoYmZkKSBcCisgICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikgb2JqX2NvZmZfc3ltX2hhc2hlcyAoYmZkKSkKKworLyogWENPRkYgcmVsb2NhdGlvbiB0eXBlcy4gIFRoZXNlIHByb2JhYmx5IGJlbG9uZyBpbiBhIGhlYWRlciBmaWxlCisgICBzb21ld2hlcmUuICBUaGUgcmVsb2NhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZnVuY3Rpb24KKyAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaW4gdGhpcyBmaWxlLiAgKi8KKworI2RlZmluZSBSX1BPUyAgICgweDAwKQorI2RlZmluZSBSX05FRyAgICgweDAxKQorI2RlZmluZSBSX1JFTCAgICgweDAyKQorI2RlZmluZSBSX1RPQyAgICgweDAzKQorI2RlZmluZSBSX1JUQiAgICgweDA0KQorI2RlZmluZSBSX0dMICAgICgweDA1KQorI2RlZmluZSBSX1RDTCAgICgweDA2KQorI2RlZmluZSBSX0JBICAgICgweDA4KQorI2RlZmluZSBSX0JSICAgICgweDBhKQorI2RlZmluZSBSX1JMICAgICgweDBjKQorI2RlZmluZSBSX1JMQSAgICgweDBkKQorI2RlZmluZSBSX1JFRiAgICgweDBmKQorI2RlZmluZSBSX1RSTCAgICgweDEyKQorI2RlZmluZSBSX1RSTEEgICgweDEzKQorI2RlZmluZSBSX1JSVEJJICgweDE0KQorI2RlZmluZSBSX1JSVEJBICgweDE1KQorI2RlZmluZSBSX0NBSSAgICgweDE2KQorI2RlZmluZSBSX0NSRUwgICgweDE3KQorI2RlZmluZSBSX1JCQSAgICgweDE4KQorI2RlZmluZSBSX1JCQUMgICgweDE5KQorI2RlZmluZSBSX1JCUiAgICgweDFhKQorI2RlZmluZSBSX1JCUkMgICgweDFiKQorCisvKiBUaGUgZmlyc3Qgd29yZCBvZiBnbG9iYWwgbGlua2FnZSBjb2RlLiAgVGhpcyBtdXN0IGJlIG1vZGlmaWVkIGJ5CisgICBmaWxsaW5nIGluIHRoZSBjb3JyZWN0IFRPQyBvZmZzZXQuICAqLworCisjZGVmaW5lIFhDT0ZGX0dMSU5LX0ZJUlNUICgweDgxODIwMDAwKQkvKiBsd3ogcjEyLDAocjIpICovCisKKy8qIFRoZSByZW1haW5pbmcgd29yZHMgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhjb2ZmX2dsaW5rX2NvZGVbXSA9Cit7CisgIDB4OTA0MTAwMTQsCS8qIHN0dyByMiwyMChyMSkgKi8KKyAgMHg4MDBjMDAwMCwJLyogbHd6IHIwLDAocjEyKSAqLworICAweDgwNGMwMDA0LAkvKiBsd3ogcjIsNChyMTIpICovCisgIDB4N2MwOTAzYTYsCS8qIG10Y3RyIHIwICovCisgIDB4NGU4MDA0MjAsCS8qIGJjdHIgKi8KKyAgMHgwLAkJLyogc3RhcnQgb2YgdHJhY2ViYWNrIHRhYmxlICovCisgIDB4MDAwYzgwMDAsCS8qIHRyYWNlYmFjayB0YWJsZSAqLworICAweDAJCS8qIHRyYWNlYmFjayB0YWJsZSAqLworfTsKKworI2RlZmluZSBYQ09GRl9HTElOS19TSVpFIFwKKyAgKCgoc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXSkgKiA0KSArIDQpCisKKy8qIFdlIHJldXNlIHRoZSBTRUNfUk9NIGZsYWcgYXMgYSBtYXJrIGZsYWcgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgdXNlZCBvbiBpbnB1dCBzZWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0VDX01BUksgKFNFQ19ST00pCisKKy8qIFRoZSBsZGhkciBzdHJ1Y3R1cmUuICBUaGlzIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyCisgICBzZWN0aW9uLiAgKi8KKworc3RydWN0IGludGVybmFsX2xkaGRyCit7CisgIC8qIFRoZSB2ZXJzaW9uIG51bWJlcjogY3VycmVudGx5IGFsd2F5cyAxLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsX3ZlcnNpb247CisgIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMuICAqLworICBiZmRfc2l6ZV90eXBlIGxfbnN5bXM7CisgIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBsX25yZWxvYzsKKyAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW1wb3J0IGZpbGUgc3RyaW5nIHRhYmxlLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBsX2lzdGxlbjsKKyAgLyogVGhlIG51bWJlciBvZiBpbXBvcnQgZmlsZXMuICAqLworICBiZmRfc2l6ZV90eXBlIGxfbmltcGlkOworICAvKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAubG9hZGVyIHNlY3Rpb24gdG8gdGhlIGZpcnN0CisgICAgIGVudHJ5IGluIHRoZSBpbXBvcnQgZmlsZSB0YWJsZS4gICovCisgIGJmZF9zaXplX3R5cGUgbF9pbXBvZmY7CisgIC8qIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0YWJsZS4gICovCisgIGJmZF9zaXplX3R5cGUgbF9zdGxlbjsKKyAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAorICAgICBlbnRyeSBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBsX3N0b2ZmOworfTsKKworc3RydWN0IGV4dGVybmFsX2xkaGRyCit7CisgIGJmZF9ieXRlIGxfdmVyc2lvbls0XTsKKyAgYmZkX2J5dGUgbF9uc3ltc1s0XTsKKyAgYmZkX2J5dGUgbF9ucmVsb2NbNF07CisgIGJmZF9ieXRlIGxfaXN0bGVuWzRdOworICBiZmRfYnl0ZSBsX25pbXBpZFs0XTsKKyAgYmZkX2J5dGUgbF9pbXBvZmZbNF07CisgIGJmZF9ieXRlIGxfc3RsZW5bNF07CisgIGJmZF9ieXRlIGxfc3RvZmZbNF07Cit9OworCisjZGVmaW5lIExESERSU1ogKDggKiA0KQorCisvKiBUaGUgbGRzeW0gc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHN5bWJvbCBpbiB0aGUKKyAgIC5sb2FkZXIgc2VjdGlvbi4gICovCisKK3N0cnVjdCBpbnRlcm5hbF9sZHN5bQoreworICB1bmlvbgorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgbmFtZSBpZiA8PSBTWU1OTUxFTiBjaGFyYWN0ZXJzLiAgKi8KKyAgICAgIGNoYXIgX2xfbmFtZVtTWU1OTUxFTl07CisgICAgICBzdHJ1Y3QKKwl7CisJICAvKiBaZXJvIGlmIHRoZSBzeW1ib2wgbmFtZSBpcyBtb3JlIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCisJICBsb25nIF9sX3plcm9lczsKKwkgIC8qIFRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZQorICAgICAgICAgICAgIHRoYW4gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCisJICBsb25nIF9sX29mZnNldDsKKwl9IF9sX2w7CisgICAgfSBfbDsKKyAgLyogVGhlIHN5bWJvbCB2YWx1ZS4gICovCisgIGJmZF92bWEgbF92YWx1ZTsKKyAgLyogVGhlIHN5bWJvbCBzZWN0aW9uIG51bWJlci4gICovCisgIHNob3J0IGxfc2NudW07CisgIC8qIFRoZSBzeW1ib2wgdHlwZSBhbmQgZmxhZ3MuICAqLworICBjaGFyIGxfc210eXBlOworICAvKiBUaGUgc3ltYm9sIHN0b3JhZ2UgY2xhc3MuICAqLworICBjaGFyIGxfc21jbGFzOworICAvKiBUaGUgaW1wb3J0IGZpbGUgSUQuICAqLworICBiZmRfc2l6ZV90eXBlIGxfaWZpbGU7CisgIC8qIE9mZnNldCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgY2hlY2sgc3RyaW5nLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBsX3Bhcm07Cit9OworCitzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0KK3sKKyAgdW5pb24KKyAgICB7CisgICAgICBiZmRfYnl0ZSBfbF9uYW1lW1NZTU5NTEVOXTsKKyAgICAgIHN0cnVjdAorCXsKKwkgIGJmZF9ieXRlIF9sX3plcm9lc1s0XTsKKwkgIGJmZF9ieXRlIF9sX29mZnNldFs0XTsKKwl9IF9sX2w7CisgICAgfSBfbDsKKyAgYmZkX2J5dGUgbF92YWx1ZVs0XTsKKyAgYmZkX2J5dGUgbF9zY251bVsyXTsKKyAgYmZkX2J5dGUgbF9zbXR5cGVbMV07CisgIGJmZF9ieXRlIGxfc21jbGFzWzFdOworICBiZmRfYnl0ZSBsX2lmaWxlWzRdOworICBiZmRfYnl0ZSBsX3Bhcm1bNF07Cit9OworCisjZGVmaW5lIExEU1lNU1ogKDggKyAzICogNCArIDIgKyAyKQorCisvKiBUaGVzZSBmbGFncyBhcmUgZm9yIHRoZSBsX3NtdHlwZSBmaWVsZCAodGhlIGxvd2VyIHRocmVlIGJpdHMgYXJlIGFuCisgICBYVFlfKiB2YWx1ZSkuICAqLworCisvKiBJbXBvcnRlZCBzeW1ib2wuICAqLworI2RlZmluZSBMX0lNUE9SVCAoMHg0MCkKKy8qIEVudHJ5IHBvaW50LiAgKi8KKyNkZWZpbmUgTF9FTlRSWSAoMHgyMCkKKy8qIEV4cG9ydGVkIHN5bWJvbC4gICovCisjZGVmaW5lIExfRVhQT1JUICgweDEwKQorCisvKiBUaGUgbGRyZWwgc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHJlbG9jIGluIHRoZQorICAgLmxvYWRlciBzZWN0aW9uLiAgKi8KKworc3RydWN0IGludGVybmFsX2xkcmVsCit7CisgIC8qIFRoZSByZWxvYyBhZGRyZXNzLiAgKi8KKyAgYmZkX3ZtYSBsX3ZhZGRyOworICAvKiBUaGUgc3ltYm9sIHRhYmxlIGluZGV4IGluIHRoZSAubG9hZGVyIHNlY3Rpb24gc3ltYm9sIHRhYmxlLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBsX3N5bW5keDsKKyAgLyogVGhlIHJlbG9jYXRpb24gdHlwZSBhbmQgc2l6ZS4gICovCisgIHNob3J0IGxfcnR5cGU7CisgIC8qIFRoZSBzZWN0aW9uIG51bWJlciB0aGlzIHJlbG9jYXRpb24gYXBwbGllcyB0by4gICovCisgIHNob3J0IGxfcnNlY25tOworfTsKKworc3RydWN0IGV4dGVybmFsX2xkcmVsCit7CisgIGJmZF9ieXRlIGxfdmFkZHJbNF07CisgIGJmZF9ieXRlIGxfc3ltbmR4WzRdOworICBiZmRfYnl0ZSBsX3J0eXBlWzJdOworICBiZmRfYnl0ZSBsX3JzZWNubVsyXTsKK307CisKKyNkZWZpbmUgTERSRUxTWiAoMiAqIDQgKyAyICogMikKKworLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KKworc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlCit7CisgIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0LiAgKi8KKyAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuZXh0OworICAvKiBUaGUgcGF0aC4gICovCisgIGNvbnN0IGNoYXIgKnBhdGg7CisgIC8qIFRoZSBmaWxlIG5hbWUuICAqLworICBjb25zdCBjaGFyICpmaWxlOworICAvKiBUaGUgbWVtYmVyIG5hbWUuICAqLworICBjb25zdCBjaGFyICptZW1iZXI7Cit9OworCisvKiBBbiBlbnRyeSBpbiB0aGUgWENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5IHJvb3Q7CisKKyAgLyogU3ltYm9sIGluZGV4IGluIG91dHB1dCBmaWxlLiAgU2V0IHRvIC0xIGluaXRpYWxseS4gIFNldCB0byAtMiBpZgorICAgICB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLworICBsb25nIGluZHg7CisKKyAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgdGhpcyBpcyB0aGUgLnRjCisgICAgIHNlY3Rpb24gd2hpY2ggaG9sZHMgaXQuICAqLworICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247CisKKyAgdW5pb24KKyAgICB7CisgICAgICAvKiBJZiB3ZSBoYXZlIGNyZWF0ZWQgYSBUT0MgZW50cnkgKHRoZSBYQ09GRl9TRVRfVE9DIGZsYWcgaXMKKwkgc2V0KSwgdGhpcyBpcyB0aGUgb2Zmc2V0IGluIHRvY19zZWN0aW9uLiAgKi8KKyAgICAgIGJmZF92bWEgdG9jX29mZnNldDsKKyAgICAgIC8qIElmIHRoZSBUT0MgZW50cnkgY29tZXMgZnJvbSBhbiBpbnB1dCBmaWxlLCB0aGlzIGlzIHNldCB0byB0aGUKKyAgICAgICAgIHN5bWJvbCBpbmRleCBvZiB0aGUgQ19ISURFWFQgWE1DX1RDIG9yIFhNQ19URCBzeW1ib2wuICAqLworICAgICAgbG9uZyB0b2NfaW5keDsKKyAgICB9IHU7CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCB3aGljaCBpcyBjYWxsZWQsIHRoaXMKKyAgICAgZmllbGQgaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSWYgdGhpcyBzeW1ib2wKKyAgICAgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGlzIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUKKyAgICAgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLworICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpkZXNjcmlwdG9yOworCisgIC8qIFRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZSBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLiAgKi8KKyAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKKworICAvKiBJZiBYQ09GRl9CVUlMVF9MRFNZTSBpcyBzZXQsIHRoaXMgaXMgdGhlIC5sb2FkZXIgc3ltYm9sIHRhYmxlCisgICAgIGluZGV4LiAgSWYgWENPRkZfQlVJTERfTERTWU0gaXMgY2xlYXIsIGFuZCBYQ09GRl9JTVBPUlQgaXMgc2V0LAorICAgICB0aGlzIGlzIHRoZSBsX2lmaWxlIHZhbHVlLiAgKi8KKyAgbG9uZyBsZGluZHg7CisKKyAgLyogU29tZSBsaW5rZXIgZmxhZ3MuICAqLworICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKKyAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCisjZGVmaW5lIFhDT0ZGX1JFRl9SRUdVTEFSICgwMSkKKyAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gICovCisjZGVmaW5lIFhDT0ZGX0RFRl9SRUdVTEFSICgwMikKKyAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCisjZGVmaW5lIFhDT0ZGX0RFRl9EWU5BTUlDICgwNCkKKyAgLyogU3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvYyBiZWluZyBjb3BpZWQgaW50byB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgWENPRkZfTERSRUwgKDAxMCkKKyAgLyogU3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludC4gICovCisjZGVmaW5lIFhDT0ZGX0VOVFJZICgwMjApCisgIC8qIFN5bWJvbCBpcyBjYWxsZWQ7IHRoaXMgaXMsIGl0IGFwcGVhcnMgaW4gYSBSX0JSIHJlbG9jLiAgKi8KKyNkZWZpbmUgWENPRkZfQ0FMTEVEICgwNDApCisgIC8qIFN5bWJvbCBuZWVkcyB0aGUgVE9DIGVudHJ5IGZpbGxlZCBpbi4gICovCisjZGVmaW5lIFhDT0ZGX1NFVF9UT0MgKDAxMDApCisgIC8qIFN5bWJvbCBpcyBleHBsaWNpdGx5IGltcG9ydGVkLiAgKi8KKyNkZWZpbmUgWENPRkZfSU1QT1JUICgwMjAwKQorICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBleHBvcnRlZC4gICovCisjZGVmaW5lIFhDT0ZGX0VYUE9SVCAoMDQwMCkKKyAgLyogU3ltYm9sIGhhcyBiZWVuIHByb2Nlc3NlZCBieSB4Y29mZl9idWlsZF9sZHN5bXMuICAqLworI2RlZmluZSBYQ09GRl9CVUlMVF9MRFNZTSAoMDEwMDApCisgIC8qIFN5bWJvbCBpcyBtZW50aW9uZWQgYnkgYSBzZWN0aW9uIHdoaWNoIHdhcyBub3QgZ2FyYmFnZSBjb2xsZWN0ZWQuICAqLworI2RlZmluZSBYQ09GRl9NQVJLICgwMjAwMCkKKyAgLyogU3ltYm9sIHNpemUgaXMgcmVjb3JkZWQgaW4gc2l6ZV9saXN0IGxpc3QgZnJvbSBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgWENPRkZfSEFTX1NJWkUgKDA0MDAwKQorICAvKiBTeW1ib2wgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgWENPRkZfREVTQ1JJUFRPUiAoMDEwMDAwKQorICAvKiBNdWx0aXBsZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gZm9yIHRoZSBzeW1ib2wuICAqLworI2RlZmluZSBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEICgwMjAwMDApCisKKyAgLyogVGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcy4gICovCisgIHVuc2lnbmVkIGNoYXIgc21jbGFzOworfTsKKworLyogVGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OworCisgIC8qIFRoZSAuZGVidWcgc3RyaW5nIGhhc2ggdGFibGUuICBXZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyB3aGlsZQorICAgICByZWFkaW5nIHRoZSBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBrbm93IGhvdyBsYXJnZSB0aGUgLmRlYnVnCisgICAgIHNlY3Rpb24gd2lsbCBiZSBiZWZvcmUgd2UgYXNzaWduIHNlY3Rpb24gcG9zaXRpb25zLiAgKi8KKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOworCisgIC8qIFRoZSAuZGVidWcgc2VjdGlvbiB3ZSB3aWxsIHVzZSBmb3IgdGhlIGZpbmFsIG91dHB1dC4gICovCisgIGFzZWN0aW9uICpkZWJ1Z19zZWN0aW9uOworCisgIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLworICBhc2VjdGlvbiAqbG9hZGVyX3NlY3Rpb247CisKKyAgLyogQSBjb3VudCBvZiBub24gVE9DIHJlbGF0aXZlIHJlbG9jcyB3aGljaCB3aWxsIG5lZWQgdG8gYmUKKyAgICAgYWxsb2NhdGVkIGluIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLworICBzaXplX3QgbGRyZWxfY291bnQ7CisKKyAgLyogVGhlIC5sb2FkZXIgc2VjdGlvbiBoZWFkZXIuICAqLworICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7CisKKyAgLyogVGhlIC5nbCBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLworICBhc2VjdGlvbiAqbGlua2FnZV9zZWN0aW9uOworCisgIC8qIFRoZSAudGMgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCB0b2MgZW50cmllcyB3ZSBidWlsZCBmb3IgZ2xvYmFsCisgICAgIGxpbmthZ2UgY29kZS4gICovCisgIGFzZWN0aW9uICp0b2Nfc2VjdGlvbjsKKworICAvKiBUaGUgLmRzIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgZnVuY3Rpb24gZGVzY3JpcHRvcnMgd2hpY2ggd2UKKyAgICAgY3JlYXRlIGZvciBleHBvcnRlZCBzeW1ib2xzLiAgKi8KKyAgYXNlY3Rpb24gKmRlc2NyaXB0b3Jfc2VjdGlvbjsKKworICAvKiBUaGUgbGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLworICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmltcG9ydHM7CisKKyAgLyogUmVxdWlyZWQgYWxpZ25tZW50IG9mIHNlY3Rpb25zIHdpdGhpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247CisKKyAgLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seS4gICovCisgIGJvb2xlYW4gdGV4dHJvOworCisgIC8qIFdoZXRoZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBkb25lLiAgKi8KKyAgYm9vbGVhbiBnYzsKKworICAvKiBBIGxpbmtlZCBsaXN0IG9mIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGhhdmUgc2l6ZSBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdAorICAgIHsKKyAgICAgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbmV4dDsKKyAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7CisgICAgfSAqc2l6ZV9saXN0OworCisgIC8qIE1hZ2ljIHNlY3Rpb25zOiBfdGV4dCwgX2V0ZXh0LCBfZGF0YSwgX2VkYXRhLCBfZW5kLCBlbmQuICAqLworICBhc2VjdGlvbiAqc3BlY2lhbF9zZWN0aW9uc1s2XTsKK307CisKKy8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgZHVyaW5nIHRoZQorICAgZmluYWwgbGluayBwaGFzZS4gICovCisKK3N0cnVjdCB4Y29mZl9saW5rX3NlY3Rpb25faW5mbworeworICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCisgICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLworICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hlczsKKyAgLyogSWYgdGhlcmUgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIGFuZCB0aGUKKyAgICAgaW5kZXggb2YgdGhlIFRPQyBzeW1ib2wgaXMgbm90IGtub3duIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLAorICAgICBhbiBlbnRyeSBpcyBhZGRlZCB0byB0aGlzIGxpbmtlZCBsaXN0LiAgVGhpcyBpcyBub3QgYW4gYXJyYXksCisgICAgIGxpa2UgcmVsX2hhc2hlcywgYmVjYXVzZSB0aGlzIGNhc2UgaXMgcXVpdGUgdW5jb21tb24uICAqLworICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoCisgICAgeworICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbmV4dDsKKyAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgICB9ICp0b2NfcmVsX2hhc2hlczsKK307CisKKy8qIEluZm9ybWF0aW9uIHRoYXQgd2UgcGFzcyBhcm91bmQgd2hpbGUgZG9pbmcgdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCisKK3N0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8KK3sKKyAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgIC8qIE91dHB1dCBCRkQuICAqLworICBiZmQgKm91dHB1dF9iZmQ7CisgIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KKyAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOworICAvKiBBcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZQorICAgICB0YXJnZXRfaW5kZXggZmllbGQuICAqLworICBzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNlY3Rpb25faW5mbzsKKyAgLyogU3ltYm9sIGluZGV4IG9mIGxhc3QgQ19GSUxFIHN5bWJvbCAoLTEgaWYgbm9uZSkuICAqLworICBsb25nIGxhc3RfZmlsZV9pbmRleDsKKyAgLyogQ29udGVudHMgb2YgbGFzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KKyAgc3RydWN0IGludGVybmFsX3N5bWVudCBsYXN0X2ZpbGU7CisgIC8qIFN5bWJvbCBpbmRleCBvZiBUT0Mgc3ltYm9sLiAgKi8KKyAgbG9uZyB0b2Nfc3ltaW5keDsKKyAgLyogU3RhcnQgb2YgLmxvYWRlciBzeW1ib2xzLiAgKi8KKyAgc3RydWN0IGV4dGVybmFsX2xkc3ltICpsZHN5bTsKKyAgLyogTmV4dCAubG9hZGVyIHJlbG9jIHRvIHN3YXAgb3V0LiAgKi8KKyAgc3RydWN0IGV4dGVybmFsX2xkcmVsICpsZHJlbDsKKyAgLyogRmlsZSBwb3NpdGlvbiBvZiBzdGFydCBvZiBsaW5lIG51bWJlcnMuICAqLworICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKKyAgICAgaW5wdXQgZmlsZS4gICovCisgIGxvbmcgKnN5bV9pbmRpY2VzOworICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KKyAgYmZkX2J5dGUgKm91dHN5bXM7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAorICAgICBzZWN0aW9uLiAgKi8KKyAgYmZkX2J5dGUgKmxpbmVub3M7CisgIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCisgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Cit9OworCitzdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX2luCisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGludGVybmFsX2xkaGRyICopKTsKK3N0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRoZHJfb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKiwgc3RydWN0IGV4dGVybmFsX2xkaGRyICopKTsKK3N0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1faW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikpOworc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHN5bV9vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikpOworc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9pbgorICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICosIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqKSk7CitzdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkcmVsX291dAorICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICosIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKSk7CitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICp4Y29mZl9saW5rX2hhc2hfbmV3ZnVuYworICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCisgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAorCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7CitzdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKK3N0YXRpYyBiZmRfc2l6ZV90eXBlIHhjb2ZmX2ZpbmRfcmVsb2MKKyAgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF9zaXplX3R5cGUsIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfbWFya19zeW1ib2wKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgYm9vbGVhbiB4Y29mZl9tYXJrIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyB2b2lkIHhjb2ZmX3N3ZWVwIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKK3N0YXRpYyBib29sZWFuIHhjb2ZmX2J1aWxkX2xkc3ltcworICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19pbnB1dF9iZmQKKyAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbAorICBQQVJBTVMgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGJvb2xlYW4geGNvZmZfcmVsb2NfbGlua19vcmRlcgorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAorCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7CitzdGF0aWMgaW50IHhjb2ZmX3NvcnRfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisMCisvKiBSb3V0aW5lcyB0byBzd2FwIGluZm9ybWF0aW9uIGluIHRoZSBYQ09GRiAubG9hZGVyIHNlY3Rpb24uICBJZiB3ZQorICAgZXZlciBuZWVkIHRvIHdyaXRlIGFuIFhDT0ZGIGxvYWRlciwgdGhpcyBzdHVmZiB3aWxsIG5lZWQgdG8gYmUKKyAgIG1vdmVkIHRvIGFub3RoZXIgZmlsZSBzaGFyZWQgYnkgdGhlIGxpbmtlciAod2hpY2ggWENPRkYgY2FsbHMgdGhlCisgICBgYGJpbmRlcicnKSBhbmQgdGhlIGxvYWRlci4gICovCisKKy8qIFN3YXAgaW4gdGhlIGxkaGRyIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKnNyYzsKKyAgICAgc3RydWN0IGludGVybmFsX2xkaGRyICpkc3Q7Cit7CisgIGRzdC0+bF92ZXJzaW9uID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24pOworICBkc3QtPmxfbnN5bXMgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbnN5bXMpOworICBkc3QtPmxfbnJlbG9jID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYyk7CisgIGRzdC0+bF9pc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaXN0bGVuKTsKKyAgZHN0LT5sX25pbXBpZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQpOworICBkc3QtPmxfaW1wb2ZmID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZik7CisgIGRzdC0+bF9zdGxlbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbik7CisgIGRzdC0+bF9zdG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zdG9mZik7Cit9CisKKy8qIFN3YXAgb3V0IHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgdm9pZAoreGNvZmZfc3dhcF9sZGhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqc3JjOworICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKmRzdDsKK3sKKyAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZlcnNpb24sIGRzdC0+bF92ZXJzaW9uKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zLCBkc3QtPmxfbnN5bXMpOworICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbnJlbG9jLCBkc3QtPmxfbnJlbG9jKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbiwgZHN0LT5sX2lzdGxlbik7CisgIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uaW1waWQsIGRzdC0+bF9uaW1waWQpOworICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfaW1wb2ZmLCBkc3QtPmxfaW1wb2ZmKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0bGVuLCBkc3QtPmxfc3RsZW4pOworICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYsIGRzdC0+bF9zdG9mZik7Cit9CisKKy8qIFN3YXAgaW4gdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBzcmMsIGRzdCkKKyAgICAgYmZkICphYmZkOworICAgICBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKnNyYzsKKyAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpkc3Q7Cit7CisgIGlmIChiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfemVyb2VzKSAhPSAwKQorICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOworICAgICAgZHN0LT5fbC5fbF9sLl9sX29mZnNldCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQpOworICAgIH0KKyAgZHN0LT5sX3ZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlKTsKKyAgZHN0LT5sX3NjbnVtID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3NjbnVtKTsKKyAgZHN0LT5sX3NtdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSk7CisgIGRzdC0+bF9zbWNsYXMgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbWNsYXMpOworICBkc3QtPmxfaWZpbGUgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfaWZpbGUpOworICBkc3QtPmxfcGFybSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9wYXJtKTsKK30KKworLyogU3dhcCBvdXQgdGhlIGxkc3ltIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9zd2FwX2xkc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkc3ltICpzcmM7CisgICAgIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZHN0OworeworICBpZiAoc3JjLT5fbC5fbF9sLl9sX3plcm9lcyAhPSAwKQorICAgIG1lbWNweSAoZHN0LT5fbC5fbF9uYW1lLCBzcmMtPl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIDAsIGRzdC0+X2wuX2xfbC5fbF96ZXJvZXMpOworICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX29mZnNldCwgZHN0LT5fbC5fbF9sLl9sX29mZnNldCk7CisgICAgfQorICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFsdWUsIGRzdC0+bF92YWx1ZSk7CisgIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSwgZHN0LT5sX3NjbnVtKTsKKyAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc210eXBlLCBkc3QtPmxfc210eXBlKTsKKyAgYmZkX3B1dF84IChhYmZkLCBzcmMtPmxfc21jbGFzLCBkc3QtPmxfc21jbGFzKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlLCBkc3QtPmxfaWZpbGUpOworICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfcGFybSwgZHN0LT5sX3Bhcm0pOworfQorCisvKiBTd2FwIGluIHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgdm9pZAoreGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkcmVsICpzcmM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqZHN0OworeworICBkc3QtPmxfdmFkZHIgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIpOworICBkc3QtPmxfc3ltbmR4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3N5bW5keCk7CisgIGRzdC0+bF9ydHlwZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9ydHlwZSk7CisgIGRzdC0+bF9yc2Vjbm0gPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tKTsKK30KKworLyogU3dhcCBvdXQgdGhlIGxkcmVsIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9zd2FwX2xkcmVsX291dCAoYWJmZCwgc3JjLCBkc3QpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX2xkcmVsICpzcmM7CisgICAgIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZHN0OworeworICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfdmFkZHIsIGRzdC0+bF92YWRkcik7CisgIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgsIGRzdC0+bF9zeW1uZHgpOworICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUsIGRzdC0+bF9ydHlwZSk7CisgIGJmZF9wdXRfMTYgKGFiZmQsIHNyYy0+bF9yc2Vjbm0sIGRzdC0+bF9yc2Vjbm0pOworfQorDAorLyogUm91dGluZXMgdG8gcmVhZCBYQ09GRiBkeW5hbWljIGluZm9ybWF0aW9uLiAgVGhpcyBkb24ndCByZWFsbHkKKyAgIGJlbG9uZyBoZXJlLCBidXQgd2UgYWxyZWFkeSBoYXZlIHRoZSBsZHN5bSBtYW5pcHVsYXRpb24gcm91dGluZXMKKyAgIGhlcmUuICAqLworCisvKiBSZWFkIHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworeworICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKKyAgICB7CisgICAgICBzZWMtPnVzZWRfYnlfYmZkID0gYmZkX3phbGxvYyAoYWJmZCwKKwkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOworICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPQorCShiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7CisgICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKKwkJCQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogR2V0IHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCisKK2xvbmcKK19iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzZWN0aW9uICpsc2VjOworICBiZmRfYnl0ZSAqY29udGVudHM7CisgIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKKworICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7CisgIGlmIChsc2VjID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCisgICAgcmV0dXJuIC0xOworICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7CisKKyAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKKworICByZXR1cm4gKGxkaGRyLmxfbnN5bXMgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKK30KKworLyogR2V0IHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLworCitsb25nCitfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgcHN5bXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXN5bWJvbCAqKnBzeW1zOworeworICBhc2VjdGlvbiAqbHNlYzsKKyAgYmZkX2J5dGUgKmNvbnRlbnRzOworICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7CisgIGNvbnN0IGNoYXIgKnN0cmluZ3M7CisgIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKKyAgY29mZl9zeW1ib2xfdHlwZSAqc3ltYnVmOworCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKKyAgaWYgKGxzZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKKyAgICByZXR1cm4gLTE7CisgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKKworICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOworCisgIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7CisKKyAgc3RyaW5ncyA9IChjaGFyICopIGNvbnRlbnRzICsgbGRoZHIubF9zdG9mZjsKKworICBzeW1idWYgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKKwkgICAgYmZkX3phbGxvYyAoYWJmZCwgbGRoZHIubF9uc3ltcyAqIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpKTsKKyAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGNvbnRlbnRzICsgTERIRFJTWik7CisgIGVsc3ltZW5kID0gZWxzeW0gKyBsZGhkci5sX25zeW1zOworICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKywgc3ltYnVmKyssIHBzeW1zKyspCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOworCisgICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKKworICAgICAgc3ltYnVmLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7CisKKyAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQorCXN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7CisgICAgICBlbHNlCisJeworCSAgaW50IGk7CisKKwkgIGZvciAoaSA9IDA7IGkgPCBTWU1OTUxFTjsgaSsrKQorCSAgICBpZiAobGRzeW0uX2wuX2xfbmFtZVtpXSA9PSAnXDAnKQorCSAgICAgIGJyZWFrOworCSAgaWYgKGkgPCBTWU1OTUxFTikKKwkgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IChjaGFyICopIGVsc3ltLT5fbC5fbF9uYW1lOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciAqYzsKKworCSAgICAgIGMgPSBiZmRfYWxsb2MgKGFiZmQsIFNZTU5NTEVOICsgMSk7CisJICAgICAgaWYgKGMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCSAgICAgIG1lbWNweSAoYywgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOworCSAgICAgIGNbU1lNTk1MRU5dID0gJ1wwJzsKKwkgICAgICBzeW1idWYtPnN5bWJvbC5uYW1lID0gYzsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGxkc3ltLmxfc21jbGFzID09IFhNQ19YTykKKwlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKyAgICAgIGVsc2UKKwlzeW1idWYtPnN5bWJvbC5zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLAorCQkJCQkJCSAgICAgIGxkc3ltLmxfc2NudW0pOworICAgICAgc3ltYnVmLT5zeW1ib2wudmFsdWUgPSBsZHN5bS5sX3ZhbHVlIC0gc3ltYnVmLT5zeW1ib2wuc2VjdGlvbi0+dm1hOworCisgICAgICBzeW1idWYtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKKyAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgIT0gMCkKKwlzeW1idWYtPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOworCisgICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQKKyAgICAgICAgIHdpdGggdGhlIGxvYWRlciBzeW1ib2wuICAqLworCisgICAgICAqcHN5bXMgPSAoYXN5bWJvbCAqKSBzeW1idWY7CisgICAgfQorCisgICpwc3ltcyA9IE5VTEw7CisKKyAgcmV0dXJuIGxkaGRyLmxfbnN5bXM7Cit9CisKKy8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCisKK2xvbmcKK19iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgYXNlY3Rpb24gKmxzZWM7CisgIGJmZF9ieXRlICpjb250ZW50czsKKyAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOworCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKKyAgaWYgKGxzZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKKyAgICByZXR1cm4gLTE7CisgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKKworICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOworCisgIHJldHVybiAobGRoZHIubF9ucmVsb2MgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKK30KKworLyogVGhlIHR5cGljYWwgZHluYW1pYyByZWxvYy4gICovCisKK3N0YXRpYyByZWxvY19ob3d0b190eXBlIHhjb2ZmX2R5bmFtaWNfcmVsb2MgPQorICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKKwkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAorCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKKwkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCisJIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgZmFsc2UpOyAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KKworLyogR2V0IHRoZSBkeW5hbWljIHJlbG9jcy4gICovCisKK2xvbmcKK19iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHByZWxvY3MsIHN5bXMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXJlbGVudCAqKnByZWxvY3M7CisgICAgIGFzeW1ib2wgKipzeW1zOworeworICBhc2VjdGlvbiAqbHNlYzsKKyAgYmZkX2J5dGUgKmNvbnRlbnRzOworICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7CisgIGFyZWxlbnQgKnJlbGJ1ZjsKKyAgc3RydWN0IGV4dGVybmFsX2xkcmVsICplbHJlbCwgKmVscmVsZW5kOworCisgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKKyAgaWYgKGxzZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKKyAgICByZXR1cm4gLTE7CisgIGNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKKworICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOworCisgIHJlbGJ1ZiA9IChhcmVsZW50ICopIGJmZF9hbGxvYyAoYWJmZCwgbGRoZHIubF9ucmVsb2MgKiBzaXplb2YgKGFyZWxlbnQpKTsKKyAgaWYgKHJlbGJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBlbHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCisJICAgKGNvbnRlbnRzICsgTERIRFJTWiArIGxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7CisgIGVscmVsZW5kID0gZWxyZWwgKyBsZGhkci5sX25yZWxvYzsKKyAgZm9yICg7IGVscmVsIDwgZWxyZWxlbmQ7IGVscmVsKyssIHJlbGJ1ZisrLCBwcmVsb2NzKyspCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOworCisgICAgICB4Y29mZl9zd2FwX2xkcmVsX2luIChhYmZkLCBlbHJlbCwgJmxkcmVsKTsKKworICAgICAgaWYgKGxkcmVsLmxfc3ltbmR4ID49IDMpCisJcmVsYnVmLT5zeW1fcHRyX3B0ciA9IHN5bXMgKyAobGRyZWwubF9zeW1uZHggLSAzKTsKKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgYXNlY3Rpb24gKnNlYzsKKworCSAgc3dpdGNoIChsZHJlbC5sX3N5bW5keCkKKwkgICAgeworCSAgICBjYXNlIDA6CisJICAgICAgbmFtZSA9ICIudGV4dCI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgICBuYW1lID0gIi5kYXRhIjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAyOgorCSAgICAgIG5hbWUgPSAiLmJzcyI7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOworCSAgaWYgKHNlYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisKKwkgIHJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOworCX0KKworICAgICAgcmVsYnVmLT5hZGRyZXNzID0gbGRyZWwubF92YWRkcjsKKyAgICAgIHJlbGJ1Zi0+YWRkZW5kID0gMDsKKworICAgICAgLyogTW9zdCBkeW5hbWljIHJlbG9jcyBoYXZlIHRoZSBzYW1lIHR5cGUuICBGSVhNRTogVGhpcyBpcyBvbmx5CisgICAgICAgICBjb3JyZWN0IGlmIGxkcmVsLmxfcnR5cGUgPT0gMC4gIEluIG90aGVyIGNhc2VzLCB3ZSBzaG91bGQgdXNlCisgICAgICAgICBhIGRpZmZlcmVudCBob3d0by4gICovCisgICAgICByZWxidWYtPmhvd3RvID0gJnhjb2ZmX2R5bmFtaWNfcmVsb2M7CisKKyAgICAgIC8qIEZJWE1FOiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGxfcnNlY25tIGZpZWxkLiAgKi8KKworICAgICAgKnByZWxvY3MgPSByZWxidWY7CisgICAgfQorCisgICpwcmVsb2NzID0gTlVMTDsKKworICByZXR1cm4gbGRoZHIubF9ucmVsb2M7Cit9CisMCisvKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKK3hjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKKworICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCisgICAgIHN1YmNsYXNzLiAgKi8KKyAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5KSkpOworICBpZiAocmV0ID09IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCisJIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAorCQkJCSB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KKyAgICAgIHJldC0+aW5keCA9IC0xOworICAgICAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7CisgICAgICByZXQtPnUudG9jX2luZHggPSAtMTsKKyAgICAgIHJldC0+ZGVzY3JpcHRvciA9IE5VTEw7CisgICAgICByZXQtPmxkc3ltID0gTlVMTDsKKyAgICAgIHJldC0+bGRpbmR4ID0gLTE7CisgICAgICByZXQtPmZsYWdzID0gMDsKKyAgICAgIHJldC0+c21jbGFzID0gWE1DX1VBOworICAgIH0KKworICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Cit9CisKKy8qIENyZWF0ZSBhIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCisKK3N0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKK19iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqcmV0OworCisgIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQorCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSkpKTsKKyAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQorICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKKyAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwgeGNvZmZfbGlua19oYXNoX25ld2Z1bmMpKQorICAgIHsKKyAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOworICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOworICAgIH0KKworICByZXQtPmRlYnVnX3N0cnRhYiA9IF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQgKCk7CisgIHJldC0+ZGVidWdfc2VjdGlvbiA9IE5VTEw7CisgIHJldC0+bG9hZGVyX3NlY3Rpb24gPSBOVUxMOworICByZXQtPmxkcmVsX2NvdW50ID0gMDsKKyAgbWVtc2V0ICgmcmV0LT5sZGhkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIpKTsKKyAgcmV0LT5saW5rYWdlX3NlY3Rpb24gPSBOVUxMOworICByZXQtPnRvY19zZWN0aW9uID0gTlVMTDsKKyAgcmV0LT5kZXNjcmlwdG9yX3NlY3Rpb24gPSBOVUxMOworICByZXQtPmltcG9ydHMgPSBOVUxMOworICByZXQtPmZpbGVfYWxpZ24gPSAwOworICByZXQtPnRleHRybyA9IGZhbHNlOworICByZXQtPmdjID0gZmFsc2U7CisgIG1lbXNldCAocmV0LT5zcGVjaWFsX3NlY3Rpb25zLCAwLCBzaXplb2YgcmV0LT5zcGVjaWFsX3NlY3Rpb25zKTsKKworICAvKiBUaGUgbGlua2VyIHdpbGwgYWx3YXlzIGdlbmVyYXRlIGEgZnVsbCBhLm91dCBoZWFkZXIuICBXZSBuZWVkIHRvCisgICAgIHJlY29yZCB0aGF0IGZhY3Qgbm93LCBiZWZvcmUgdGhlIHNpemVvZl9oZWFkZXJzIHJvdXRpbmUgY291bGQgYmUKKyAgICAgY2FsbGVkLiAgKi8KKyAgeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkciA9IHRydWU7CisKKyAgcmV0dXJuICZyZXQtPnJvb3Q7Cit9CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSB4Y29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCisgICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBcCisgICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKKwkJCSAoZm9sbG93KSkpCisKKy8qIFRyYXZlcnNlIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKKyAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCisgICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKKyAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisKKy8qIEdldCB0aGUgWENPRkYgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcworICAganVzdCBhIGNhc3QuICAqLworCisjZGVmaW5lIHhjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQorDAorLyogUmVhZCBpbnRlcm5hbCByZWxvY3MgZm9yIGFuIFhDT0ZGIGNzZWN0LiAgVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kCisgICBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3Mgd2hpY2ggdHJpZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgYW55CisgICByZWxvY3Mgd2hpY2ggbWF5IGhhdmUgYmVlbiBjYWNoZWQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbi4gICovCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgoreGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKKwkJCSAgICByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYm9vbGVhbiBjYWNoZTsKKyAgICAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKKyAgICAgYm9vbGVhbiByZXF1aXJlX2ludGVybmFsOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKK3sKKyAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKKyAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPT0gTlVMTAorICAgICAgJiYgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCisgICAgeworICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKKworICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5lbmNsb3Npbmc7CisKKyAgICAgIGlmIChlbmNsb3NpbmcgIT0gTlVMTAorCSAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpID09IE5VTEwKKwkgICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzID09IE5VTEwpCisJICAmJiBjYWNoZQorCSAgJiYgZW5jbG9zaW5nLT5yZWxvY19jb3VudCA+IDApCisJeworCSAgaWYgKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgZW5jbG9zaW5nLCB0cnVlLAorCQkJCQkgICAgICBleHRlcm5hbF9yZWxvY3MsIGZhbHNlLAorCQkJCQkgICAgICAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpCisJICAgICAgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKKwkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpICE9IE5VTEwKKwkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgIT0gTlVMTCkKKwl7CisJICBzaXplX3Qgb2ZmOworCisJICBvZmYgPSAoKHNlYy0+cmVsX2ZpbGVwb3MgLSBlbmNsb3NpbmctPnJlbF9maWxlcG9zKQorCQkgLyBiZmRfY29mZl9yZWxzeiAoYWJmZCkpOworCSAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKKwkgICAgcmV0dXJuIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBlbmNsb3NpbmcpLT5yZWxvY3MgKyBvZmY7CisJICBtZW1jcHkgKGludGVybmFsX3JlbG9jcywKKwkJICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmLAorCQkgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOworCSAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKKwl9CisgICAgfQorCisgIHJldHVybiBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgY2FjaGUsIGV4dGVybmFsX3JlbG9jcywKKwkJCQkJIHJlcXVpcmVfaW50ZXJuYWwsIGludGVybmFsX3JlbG9jcyk7Cit9CisMCisvKiBHaXZlbiBhbiBYQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcworICAgYXBwcm9wcmlhdGUuICAqLworCitib29sZWFuCitfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfb2JqZWN0OgorICAgICAgcmV0dXJuIHhjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKKworICAgIGNhc2UgYmZkX2FyY2hpdmU6CisgICAgICAvKiBJZiB0aGUgYXJjaGl2ZSBoYXMgYSBtYXAsIGRvIHRoZSB1c3VhbCBzZWFyY2guICBXZSB0aGVuIG5lZWQKKyAgICAgICAgIHRvIGNoZWNrIHRoZSBhcmNoaXZlIGZvciBzdHJpcHBlZCBkeW5hbWljIG9iamVjdHMsIGJlY2F1c2UKKyAgICAgICAgIHRoZXkgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBhcmNoaXZlIG1hcCBldmVuIHRob3VnaCB0aGV5CisgICAgICAgICBzaG91bGQsIHBlcmhhcHMsIGJlIGluY2x1ZGVkLiAgSWYgdGhlIGFyY2hpdmUgaGFzIG5vIG1hcCwgd2UKKyAgICAgICAgIGp1c3QgY29uc2lkZXIgZWFjaCBvYmplY3QgZmlsZSBpbiB0dXJuLCBzaW5jZSB0aGF0IGFwcGFyZW50bHkKKyAgICAgICAgIGlzIHdoYXQgdGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMuICAqLworICAgICAgaWYgKGJmZF9oYXNfbWFwIChhYmZkKSkKKwl7CisJICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scworCQkgKGFiZmQsIGluZm8sIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHsKKwliZmQgKm1lbWJlcjsKKworCW1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCk7CisJd2hpbGUgKG1lbWJlciAhPSBOVUxMKQorCSAgeworCSAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAobWVtYmVyLCBiZmRfb2JqZWN0KQorCQkmJiAoISBiZmRfaGFzX21hcCAoYWJmZCkKKwkJICAgIHx8ICgobWVtYmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDAKKwkJCSYmIChtZW1iZXItPmZsYWdzICYgSEFTX1NZTVMpID09IDApKSkKKwkgICAgICB7CisJCWJvb2xlYW4gbmVlZGVkOworCisJCWlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChtZW1iZXIsIGluZm8sICZuZWVkZWQpKQorCQkgIHJldHVybiBmYWxzZTsKKwkJaWYgKG5lZWRlZCkKKwkJICBtZW1iZXItPmFyY2hpdmVfcGFzcyA9IC0xOworCSAgICAgIH0KKwkgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgbWVtYmVyKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBkZWZhdWx0OgorICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKiBBZGQgc3ltYm9scyBmcm9tIGFuIFhDT0ZGIG9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3hjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCEgeGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeSkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ2hlY2sgYSBzaW5nbGUgYXJjaGl2ZSBlbGVtZW50IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4KKyAgIHRoZSBsaW5rLiAgKlBORUVERUQgaXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcworICAgbmVlZGVkIGluIHRoZSBsaW5rIG9yIG5vdC4gIFRoaXMgaXMgY2FsbGVkIHZpYQorICAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYm9vbGVhbiAqcG5lZWRlZDsKK3sKKyAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCpwbmVlZGVkKQorICAgIHsKKyAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKKyAgICB7CisgICAgICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBMb29rIHRocm91Z2ggdGhlIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgb2JqZWN0IGZpbGUgc2hvdWxkIGJlCisgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJvb2xlYW4gKnBuZWVkZWQ7Cit7CisgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworICBiZmRfYnl0ZSAqZXN5bTsKKyAgYmZkX2J5dGUgKmVzeW1fZW5kOworCisgICpwbmVlZGVkID0gZmFsc2U7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKKyAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmsKKyAgICAgICYmIGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKKyAgICByZXR1cm4geGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpOworCisgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7CisgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7CisgIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKKyAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKKworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOworCisgICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUICYmIHN5bS5uX3NjbnVtICE9IE5fVU5ERUYpCisJeworCSAgY29uc3QgY2hhciAqbmFtZTsKKwkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07CisJICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBhbmQgaXMgZGVmaW5lZCBieSB0aGlzCisgICAgICAgICAgICAgb2JqZWN0IGZpbGUuICAqLworCisJICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmc3ltLCBidWYpOworCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCisJICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgdGhhdCBhcmUgY3VycmVudGx5CisJICAgICB1bmRlZmluZWQuICBJZiBhIHN5bWJvbCBpcyBjdXJyZW50bHkga25vd24gdG8gYmUgY29tbW9uLAorCSAgICAgWENPRkYgbGlua2VycyBkbyBub3QgYnJpbmcgaW4gYW4gb2JqZWN0IGZpbGUgd2hpY2gKKwkgICAgIGRlZmluZXMgaXQuICBXZSBhbHNvIGRvbid0IGJyaW5nIGluIHN5bWJvbHMgdG8gc2F0aXNmeQorCSAgICAgdW5kZWZpbmVkIHJlZmVyZW5jZXMgaW4gc2hhcmVkIG9iamVjdHMuICAqLworCSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKwkgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJICAgICAgJiYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYworCQkgIHx8ICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCisJCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApKQorCSAgICB7CisJICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7CisgICAgfQorCisgIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSBsb2FkZXIgc3ltYm9scyB0byBzZWUgaWYgdGhpcyBkeW5hbWljIG9iamVjdAorICAgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgVGhlIG5hdGl2ZSBsaW5rZXIgdXNlcyB0aGUgbG9hZGVyCisgICBzeW1ib2xzLCBub3QgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIHNvIHdlIGRvIHRvby4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYm9vbGVhbiAqcG5lZWRlZDsKK3sKKyAgYXNlY3Rpb24gKmxzZWM7CisgIGJmZF9ieXRlICpidWY7CisgIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKKyAgY29uc3QgY2hhciAqc3RyaW5nczsKKyAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOworCisgICpwbmVlZGVkID0gZmFsc2U7CisKKyAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOworICBpZiAobHNlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoZXJlIGFyZSBubyBzeW1ib2xzLCBzbyBkb24ndCB0cnkgdG8gaW5jbHVkZSBpdC4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgYnVmID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50czsKKworICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKKworICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKKworICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOworICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKKyAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOworICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7CisKKyAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZXhwb3J0ZWQgc3ltYm9scy4gICovCisgICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpID09IDApCisJY29udGludWU7CisKKyAgICAgIGlmIChsZHN5bS5fbC5fbF9sLl9sX3plcm9lcyA9PSAwKQorCW5hbWUgPSBzdHJpbmdzICsgbGRzeW0uX2wuX2xfbC5fbF9vZmZzZXQ7CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5IChuYW1idWYsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKKwkgIG5hbWJ1ZltTWU1OTUxFTl0gPSAnXDAnOworCSAgbmFtZSA9IG5hbWJ1ZjsKKwl9CisKKyAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKworICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAgICAgdW5kZWZpbmVkLiAgQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCisgICAgICAgICBoYXNoIHRhYmxlLiAgKi8KKyAgICAgIGlmIChoICE9IE5VTEwKKwkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkgICYmICgoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaCktPmZsYWdzCisJICAgICAgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMCkKKwl7CisJICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGFiZmQsIG5hbWUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICAqcG5lZWRlZCA9IHRydWU7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorCisgIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgc2hhcmVkIG9iamVjdC4gICovCisKKyAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQorICAgIHsKKyAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOworICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm5zIHRoZSBpbmRleCBvZiByZWxvYyBpbiBSRUxPQ1Mgd2l0aCB0aGUgbGVhc3QgYWRkcmVzcyBncmVhdGVyCisgICB0aGFuIG9yIGVxdWFsIHRvIEFERFJFU1MuICBUaGUgcmVsb2NzIGFyZSBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCisKK3N0YXRpYyBiZmRfc2l6ZV90eXBlCit4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGNvdW50LCBhZGRyZXNzKQorICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKKyAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKKyAgICAgYmZkX3ZtYSBhZGRyZXNzOworeworICBiZmRfc2l6ZV90eXBlIG1pbiwgbWF4LCB0aGlzOworCisgIGlmIChjb3VudCA8IDIpCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDEgJiYgcmVsb2NzWzBdLnJfdmFkZHIgPCBhZGRyZXNzKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKworICBtaW4gPSAwOworICBtYXggPSBjb3VudDsKKworICAvKiBEbyBhIGJpbmFyeSBzZWFyY2ggb3ZlciAobWluLG1heF0uICAqLworICB3aGlsZSAobWluICsgMSA8IG1heCkKKyAgICB7CisgICAgICBiZmRfdm1hIHJhZGRyOworCisgICAgICB0aGlzID0gKG1heCArIG1pbikgLyAyOworICAgICAgcmFkZHIgPSByZWxvY3NbdGhpc10ucl92YWRkcjsKKyAgICAgIGlmIChyYWRkciA+IGFkZHJlc3MpCisJbWF4ID0gdGhpczsKKyAgICAgIGVsc2UgaWYgKHJhZGRyIDwgYWRkcmVzcykKKwltaW4gPSB0aGlzOworICAgICAgZWxzZQorCXsKKwkgIG1pbiA9IHRoaXM7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChyZWxvY3NbbWluXS5yX3ZhZGRyIDwgYWRkcmVzcykKKyAgICByZXR1cm4gbWluICsgMTsKKworICB3aGlsZSAobWluID4gMAorCSAmJiByZWxvY3NbbWluIC0gMV0ucl92YWRkciA9PSBhZGRyZXNzKQorICAgIC0tbWluOworCisgIHJldHVybiBtaW47Cit9CisKKy8qIEFkZCBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4KKworICAgWENPRkYgaXMgYSB3ZWlyZCBmb3JtYXQuICBBIG5vcm1hbCBYQ09GRiAubyBmaWxlcyB3aWxsIGhhdmUgdGhyZWUKKyAgIENPRkYgc2VjdGlvbnMtLS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MtLWJ1dCBlYWNoIENPRkYgc2VjdGlvbiB3aWxsCisgICBjb250YWluIG1hbnkgY3NlY3RzLiAgVGhlc2UgY3NlY3RzIGFyZSBkZXNjcmliZWQgaW4gdGhlIHN5bWJvbAorICAgdGFibGUuICBGcm9tIHRoZSBsaW5rZXIncyBwb2ludCBvZiB2aWV3LCBlYWNoIGNzZWN0IG11c3QgYmUKKyAgIGNvbnNpZGVyZWQgYSBzZWN0aW9uIGluIGl0cyBvd24gcmlnaHQuICBGb3IgZXhhbXBsZSwgYSBUT0MgZW50cnkgaXMKKyAgIGhhbmRsZWQgYXMgYSBzbWFsbCBYTUNfVEMgY3NlY3QuICBUaGUgbGlua2VyIG11c3QgYmUgYWJsZSB0byBtZXJnZQorICAgZGlmZmVyZW50IFRPQyBlbnRyaWVzIHRvZ2V0aGVyLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgYmUgYWJsZSB0bworICAgZXh0cmFjdCB0aGUgWE1DX1RDIGNzZWN0cyBmcm9tIHRoZSAuZGF0YSBzZWN0aW9uIG9mIHRoZSBpbnB1dCAubworICAgZmlsZS4KKworICAgRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBvdXIgbGlua2VyLCB0aGlzIGlzLCBvZiBjb3Vyc2UsIGEgaGlkZW91cworICAgbmlnaHRtYXJlLiAgV2UgY29wZSBieSBhY3R1YWxseSBjcmVhdGluZyBzZWN0aW9ucyBmb3IgZWFjaCBjc2VjdCwKKyAgIGFuZCBkaXNjYXJkaW5nIHRoZSBvcmlnaW5hbCBzZWN0aW9ucy4gIFdlIHRoZW4gaGF2ZSB0byBoYW5kbGUgdGhlCisgICByZWxvY2F0aW9uIGVudHJpZXMgY2FyZWZ1bGx5LCBzaW5jZSB0aGUgb25seSB3YXkgdG8gdGVsbCB3aGljaAorICAgY3NlY3QgdGhleSBiZWxvbmcgdG8gaXMgdG8gZXhhbWluZSB0aGUgYWRkcmVzcy4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICB1bnNpZ25lZCBpbnQgbl90bWFzazsKKyAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OworICBib29sZWFuIGRlZmF1bHRfY29weTsKKyAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOworICBhc2VjdGlvbiAqKmNzZWN0X2NhY2hlOworICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKKyAgYXNlY3Rpb24gKm87CisgIGFzZWN0aW9uICpsYXN0X3JlYWw7CisgIGJvb2xlYW4ga2VlcF9zeW1zOworICBhc2VjdGlvbiAqY3NlY3Q7CisgIHVuc2lnbmVkIGludCBjc2VjdF9pbmRleDsKKyAgYXNlY3Rpb24gKmZpcnN0X2NzZWN0OworICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKKyAgYmZkX2J5dGUgKmVzeW07CisgIGJmZF9ieXRlICplc3ltX2VuZDsKKyAgc3RydWN0IHJlbG9jX2luZm9fc3RydWN0CisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7CisgICAgICBhc2VjdGlvbiAqKmNzZWN0czsKKyAgICAgIGJmZF9ieXRlICpsaW5lbm9zOworICAgIH0gKnJlbG9jX2luZm8gPSBOVUxMOworCisgIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7CisKKyAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKKyAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCisgICAgeworICAgICAgaWYgKCEgeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBidWlsZCBhIC5sb2FkZXIgc2VjdGlvbiwgc28gd2UgZG8gaXQgaGVyZS4gIFRoaXMKKwkgd29uJ3Qgd29yayBpZiB3ZSdyZSBwcm9kdWNpbmcgYW4gWENPRkYgb3V0cHV0IGZpbGUgd2l0aCBubworCSBYQ09GRiBpbnB1dCBmaWxlcy4gIEZJWE1FLiAgKi8KKyAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPT0gTlVMTCkKKwl7CisJICBhc2VjdGlvbiAqbHNlYzsKKworCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmxvYWRlciIpOworCSAgaWYgKGxzZWMgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24gPSBsc2VjOworCSAgbHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7CisJfQorICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBsaW5rYWdlIHNlY3Rpb24uICAqLworICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPT0gTlVMTCkKKwl7CisJICBhc2VjdGlvbiAqbHNlYzsKKworCSAgbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmdsIik7CisJICBpZiAobHNlYyA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24gPSBsc2VjOworCSAgbHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUworCQkJICB8IFNFQ19JTl9NRU1PUlkpOworCSAgbHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKKwl9CisgICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIFRPQyBzZWN0aW9uLiAgKi8KKyAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKKwl7CisJICBhc2VjdGlvbiAqdHNlYzsKKworCSAgdHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRjIik7CisJICBpZiAodHNlYyA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbiA9IHRzZWM7CisJICB0c2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkgIHwgU0VDX0lOX01FTU9SWSk7CisJICB0c2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOworCX0KKyAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgZGVzY3JpcHRvciBzZWN0aW9uLiAgKi8KKyAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID09IE5VTEwpCisJeworCSAgYXNlY3Rpb24gKmRzZWM7CisKKwkgIGRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5kcyIpOworCSAgaWYgKGRzZWMgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gZHNlYzsKKwkgIGRzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKKwkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKKwkgIGRzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7CisJfQorICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCisgICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPT0gTlVMTAorCSAgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQorCXsKKwkgIGFzZWN0aW9uICpkc2VjOworCisJICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZGVidWciKTsKKwkgIGlmIChkc2VjID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb24gPSBkc2VjOworCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7CisJfQorICAgIH0KKworICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAorICAgICAgJiYgISBpbmZvLT5zdGF0aWNfbGluaykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBuX3RtYXNrID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzazsKKyAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0c2hmdDsKKworICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCisjZGVmaW5lIE5fVE1BU0sgbl90bWFzaworI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAorCisgIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKKyAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKKyAgZWxzZQorICAgIGRlZmF1bHRfY29weSA9IHRydWU7CisKKyAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7CisKKyAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCisgICAgIHRvIGVhY2ggZXh0ZXJuYWwgc3ltYm9sLiAgKi8KKyAgc3ltX2hhc2ggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopCisJICAgICAgYmZkX2FsbG9jIChhYmZkLAorCQkJIChzeW1jb3VudAorCQkJICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKKyAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgY29mZl9kYXRhIChhYmZkKS0+c3ltX2hhc2hlcyA9IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoOworICBtZW1zZXQgKHN5bV9oYXNoLCAwLAorCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOworCisgIC8qIEJlY2F1c2Ugb2YgdGhlIHdlaXJkIHN0dWZmIHdlIGFyZSBkb2luZyB3aXRoIFhDT0ZGIGNzZWN0cywgd2UgY2FuCisgICAgIG5vdCBlYXNpbHkgZGV0ZXJtaW5lIHdoaWNoIHNlY3Rpb24gYSBzeW1ib2wgaXMgaW4sIHNvIHdlIHN0b3JlCisgICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoZSBpbnB1dCBmaWxlLiAgKi8KKyAgY3NlY3RfY2FjaGUgPSAoKGFzZWN0aW9uICoqKQorCQkgYmZkX2FsbG9jIChhYmZkLCBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKKyAgaWYgKGNzZWN0X2NhY2hlID09IE5VTEwgJiYgc3ltY291bnQgIT0gMCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKyAgeGNvZmZfZGF0YSAoYWJmZCktPmNzZWN0cyA9IGNzZWN0X2NhY2hlOworICBtZW1zZXQgKGNzZWN0X2NhY2hlLCAwLCAoc2l6ZV90KSBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOworCisgIC8qIFdoaWxlIHNwbGl0dGluZyBzZWN0aW9ucyBpbnRvIGNzZWN0cywgd2UgbmVlZCB0byBhc3NpZ24gdGhlCisgICAgIHJlbG9jcyBjb3JyZWN0bHkuICBUaGUgcmVsb2NzIGFuZCB0aGUgY3NlY3RzIG11c3QgYm90aCBiZSBpbgorICAgICBvcmRlciBieSBWTUEgd2l0aGluIGEgZ2l2ZW4gc2VjdGlvbiwgc28gd2UgaGFuZGxlIHRoaXMgYnkKKyAgICAgc2Nhbm5pbmcgYWxvbmcgdGhlIHJlbG9jcyBhcyB3ZSBwcm9jZXNzIHRoZSBjc2VjdHMuICBXZSBpbmRleAorICAgICBpbnRvIHJlbG9jX2luZm8gdXNpbmcgdGhlIHNlY3Rpb24gdGFyZ2V0X2luZGV4LiAgKi8KKyAgcmVsb2NfaW5mbyA9ICgoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0ICopCisJCWJmZF9tYWxsb2MgKChhYmZkLT5zZWN0aW9uX2NvdW50ICsgMSkKKwkJCSAgICAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSkpOworICBpZiAocmVsb2NfaW5mbyA9PSBOVUxMKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBtZW1zZXQgKChQVFIpIHJlbG9jX2luZm8sIDAsCisJICAoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfaW5mb19zdHJ1Y3QpKTsKKworICAvKiBSZWFkIGluIHRoZSByZWxvY3MgYW5kIGxpbmUgbnVtYmVycyBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KKyAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKKyAgbGFzdF9yZWFsID0gTlVMTDsKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgbGFzdF9yZWFsID0gbzsKKyAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisJeworCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9CisJICAgIHhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBvLCB0cnVlLCAoYmZkX2J5dGUgKikgTlVMTCwKKwkJCQkJZmFsc2UsIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7CisJICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0KKwkgICAgKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOworCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBtZW1zZXQgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMsIDAsCisJCSAgby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKKwl9CisKKyAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQorCSAgJiYgby0+bGluZW5vX2NvdW50ID4gMCkKKwl7CisJICBiZmRfYnl0ZSAqbGluZW5vczsKKworCSAgbGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5saW5lbm9fY291bnQgKiBsaW5lc3opOworCSAgaWYgKGxpbmVub3MgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IGxpbmVub3M7CisJICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPmxpbmVfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKwkgICAgICB8fCAoYmZkX3JlYWQgKGxpbmVub3MsIGxpbmVzeiwgby0+bGluZW5vX2NvdW50LCBhYmZkKQorCQkgICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKyAgICB9CisKKyAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KKyAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IHRydWU7CisKKyAgY3NlY3QgPSBOVUxMOworICBjc2VjdF9pbmRleCA9IDA7CisgIGZpcnN0X2NzZWN0ID0gTlVMTDsKKworICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOworICBCRkRfQVNTRVJUIChzeW1lc3ogPT0gYmZkX2NvZmZfYXV4ZXN6IChhYmZkKSk7CisgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7CisgIGVzeW1fZW5kID0gZXN5bSArIHN5bWNvdW50ICogc3ltZXN6OworICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQorICAgIHsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOworICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworICAgICAgaW50IHNtdHlwOworICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgIGJmZF92bWEgdmFsdWU7CisgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpzZXRfdG9jOworCisgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7CisKKyAgICAgIC8qIEluIHRoaXMgcGFzcyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHN5bWJvbHMgd2l0aCBjc2VjdAorICAgICAgICAgaW5mb3JtYXRpb24uICAqLworICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCAmJiBzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQpCisJeworCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUgJiYgY3NlY3QgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9CisJCSgoZXN5bQorCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQorCQkgLyBzeW1lc3opOworCSAgICAgIGNzZWN0ID0gTlVMTDsKKwkgICAgfQorCisJICBpZiAoY3NlY3QgIT0gTlVMTCkKKwkgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7CisJICBlbHNlIGlmIChmaXJzdF9jc2VjdCA9PSBOVUxMIHx8IHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCisJICAgICpjc2VjdF9jYWNoZSA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOworCSAgZWxzZQorCSAgICAqY3NlY3RfY2FjaGUgPSBOVUxMOworCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7CisJICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOworCSAgY3NlY3RfY2FjaGUgKz0gc3ltLm5fbnVtYXV4ICsgMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBpdCwKKyAgICAgICAgIGFuZCB3ZSdyZSBub3Qgc3RyaXBwaW5nIGl0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kCisgICAgICAgICBhZGQgdGhlbSB0byB0aGUgY291bnQgZm9yIHRoaXMgY3NlY3QuICBJbiB0aGUgZmluYWwgbGluayBwYXNzCisgICAgICAgICB3ZSBhcmUgZ29pbmcgdG8gYXR0YWNoIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJ5IHN5bWJvbCwKKyAgICAgICAgIHJhdGhlciB0aGFuIGJ5IHNlY3Rpb24sIGluIG9yZGVyIHRvIG1vcmUgZWFzaWx5IGhhbmRsZQorICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KKyAgICAgIGlmICgoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZSB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQorCSAgJiYgc3ltLm5fbnVtYXV4ID4gMQorCSAgJiYgY3NlY3QgIT0gTlVMTAorCSAgJiYgSVNGQ04gKHN5bS5uX3R5cGUpKQorCXsKKwkgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhsaW47CisKKwkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIHN5bWVzeiksCisJCQkJc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAorCQkJCTAsIHN5bS5uX251bWF1eCwgKFBUUikgJmF1eGxpbik7CisJICBpZiAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciAhPSAwKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKKwkgICAgICBiZmRfc2l6ZV90eXBlIGxpbm9mZjsKKworCSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5lbmNsb3Npbmc7CisJICAgICAgaWYgKGVuY2xvc2luZyA9PSBOVUxMKQorCQl7CisJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAoXygiJXM6IGAlcycgaGFzIGxpbmUgbnVtYmVycyBidXQgbm8gZW5jbG9zaW5nIHNlY3Rpb24iKSwKKwkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkgICAgICBsaW5vZmYgPSAoYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cgorCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7CisJICAgICAgaWYgKGxpbm9mZiA8IGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KQorCQl7CisJCSAgc3RydWN0IGludGVybmFsX2xpbmVubyBsaW47CisJCSAgYmZkX2J5dGUgKmxpbnBzdGFydDsKKworCQkgIGxpbnBzdGFydCA9IChyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5saW5lbm9zCisJCQkgICAgICAgKyBsaW5vZmYpOworCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wc3RhcnQsIChQVFIpICZsaW4pOworCQkgIGlmIChsaW4ubF9sbm5vID09IDAKKwkJICAgICAgJiYgKChiZmRfc2l6ZV90eXBlKSBsaW4ubF9hZGRyLmxfc3ltbmR4CisJCQkgID09ICgoZXN5bQorCQkJICAgICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQorCQkJICAgICAgLyBzeW1lc3opKSkKKwkJICAgIHsKKwkJICAgICAgYmZkX2J5dGUgKmxpbnBlbmQsICpsaW5wOworCisJCSAgICAgIGxpbnBlbmQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcworCQkJCSArIGVuY2xvc2luZy0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKKwkJICAgICAgZm9yIChsaW5wID0gbGlucHN0YXJ0ICsgbGluZXN6OworCQkJICAgbGlucCA8IGxpbnBlbmQ7CisJCQkgICBsaW5wICs9IGxpbmVzeikKKwkJCXsKKwkJCSAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIChQVFIpIGxpbnAsCisJCQkJCQkgICAoUFRSKSAmbGluKTsKKwkJCSAgaWYgKGxpbi5sX2xubm8gPT0gMCkKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgICAgY3NlY3QtPmxpbmVub19jb3VudCArPSAobGlucCAtIGxpbnBzdGFydCkgLyBsaW5lc3o7CisJCSAgICAgIC8qIFRoZSBzZXR0aW5nIG9mIGxpbmVfZmlsZXBvcyB3aWxsIG9ubHkgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgaWYgYWxsIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzIGZvciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgY3NlY3QgYXJlIGNvbnRpZ3VvdXM7IHRoaXMgb25seSBtYXR0ZXJzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHJlcG9ydGluZy4gICovCisJCSAgICAgIGlmIChjc2VjdC0+bGluZV9maWxlcG9zID09IDApCisJCQljc2VjdC0+bGluZV9maWxlcG9zID0KKwkJCSAgYXV4bGluLnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cjsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisgICAgICAvKiBQaWNrIHVwIHRoZSBjc2VjdCBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLworCisgICAgICBpZiAoc3ltLm5fbnVtYXV4ID09IDApCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogY2xhc3MgJWQgc3ltYm9sIGAlcycgaGFzIG5vIGF1eCBlbnRyaWVzIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3ltLm5fc2NsYXNzLCBuYW1lKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCSAgZ290byBlcnJvcl9yZXR1cm47CisJfQorCisgICAgICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwKKwkJCSAgICAoUFRSKSAoZXN5bSArIHN5bWVzeiAqIHN5bS5uX251bWF1eCksCisJCQkgICAgc3ltLm5fdHlwZSwgc3ltLm5fc2NsYXNzLAorCQkJICAgIHN5bS5uX251bWF1eCAtIDEsIHN5bS5uX251bWF1eCwKKwkJCSAgICAoUFRSKSAmYXV4KTsKKworICAgICAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7CisKKyAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKKyAgICAgIHNlY3Rpb24gPSBOVUxMOworICAgICAgdmFsdWUgPSAwOworICAgICAgc2V0X3RvYyA9IE5VTEw7CisKKyAgICAgIHN3aXRjaCAoc210eXApCisJeworCWRlZmF1bHQ6CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIGNzZWN0IHR5cGUgJWQiKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzbXR5cCk7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIGdvdG8gZXJyb3JfcmV0dXJuOworCisJY2FzZSBYVFlfRVI6CisJICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCisJICBpZiAoc3ltLm5fc2NsYXNzID09IENfSElERVhUCisJICAgICAgfHwgc3ltLm5fc2NudW0gIT0gTl9VTkRFRgorCSAgICAgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKKwkgICAgeworCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkoXygiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIpLAorCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywgc3ltLm5fc2NudW0sCisJCSBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKKwkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgfQorCisJICAvKiBBbiBYTUNfWE8gZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIGFjdHVhbGx5IGEgcmVmZXJlbmNlIHRvCisgICAgICAgICAgICAgYW4gYWJzb2x1dGUgbG9jYXRpb24uICAqLworCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19YTykKKwkgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgICAgICB2YWx1ZSA9IHN5bS5uX3ZhbHVlOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgWFRZX1NEOgorCSAgLyogVGhpcyBpcyBhIGNzZWN0IGRlZmluaXRpb24uICAqLworCisJICBpZiAoY3NlY3QgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9CisJCSgoZXN5bQorCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQorCQkgLyBzeW1lc3opOworCSAgICB9CisKKwkgIGNzZWN0ID0gTlVMTDsKKwkgIGNzZWN0X2luZGV4ID0gLTE7CisKKwkgIC8qIFdoZW4gd2Ugc2VlIGEgVE9DIGFuY2hvciwgd2UgcmVjb3JkIHRoZSBUT0MgdmFsdWUuICAqLworCSAgaWYgKGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQzApCisJICAgIHsKKwkgICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfSElERVhUCisJCSAgfHwgYXV4LnhfY3NlY3QueF9zY25sZW4ubCAhPSAwKQorCQl7CisJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAoXygiJXM6IFhNQ19UQzAgc3ltYm9sIGAlcycgaXMgY2xhc3MgJWQgc2NubGVuICVkIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIHN5bS5uX3NjbGFzcywKKwkJICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sKTsKKwkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkJICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCSAgICAgIHhjb2ZmX2RhdGEgKGFiZmQpLT50b2MgPSBzeW0ubl92YWx1ZTsKKwkgICAgfQorCisJICAvKiBXZSBtdXN0IG1lcmdlIFRPQyBlbnRyaWVzIGZvciB0aGUgc2FtZSBzeW1ib2wuICBXZSBjYW4KKwkgICAgIG1lcmdlIHR3byBUT0MgZW50cmllcyBpZiB0aGV5IGFyZSBib3RoIENfSElERVhULCB0aGV5CisJICAgICBib3RoIGhhdmUgdGhlIHNhbWUgbmFtZSwgdGhleSBhcmUgYm90aCA0IGJ5dGVzIGxvbmcsIGFuZAorCSAgICAgdGhleSBib3RoIGhhdmUgYSByZWxvY2F0aW9uIHRhYmxlIGVudHJ5IGZvciBhbiBleHRlcm5hbAorCSAgICAgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKKwkgICAgIHRoYXQgd2UgbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLiAgSWNrLiAgKi8KKwkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKKwkgICAgICAmJiBzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKKwkgICAgICAmJiBhdXgueF9jc2VjdC54X3Njbmxlbi5sID09IDQKKwkgICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOworCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworCSAgICAgIGJmZF9zaXplX3R5cGUgcmVsaW5keDsKKwkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKworCSAgICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOworCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkgICAgICByZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7CisJICAgICAgcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKKwkJCQkJICBzeW0ubl92YWx1ZSk7CisJICAgICAgcmVsID0gcmVsb2NzICsgcmVsaW5keDsKKwkgICAgICBpZiAocmVsaW5keCA8IGVuY2xvc2luZy0+cmVsb2NfY291bnQKKwkJICAmJiByZWwtPnJfdmFkZHIgPT0gKGJmZF92bWEpIHN5bS5uX3ZhbHVlCisJCSAgJiYgcmVsLT5yX3NpemUgPT0gMzEKKwkJICAmJiByZWwtPnJfdHlwZSA9PSBSX1BPUykKKwkJeworCQkgIGJmZF9ieXRlICplcmVsc3ltOworCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgcmVsc3ltOworCisJCSAgZXJlbHN5bSA9ICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkKKwkJCSAgICAgKyByZWwtPnJfc3ltbmR4ICogc3ltZXN6KTsKKwkJICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXJlbHN5bSwgKFBUUikgJnJlbHN5bSk7CisJCSAgaWYgKHJlbHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKKwkJICAgIHsKKwkJICAgICAgY29uc3QgY2hhciAqcmVsbmFtZTsKKwkJICAgICAgY2hhciByZWxidWZbU1lNTk1MRU4gKyAxXTsKKwkJICAgICAgYm9vbGVhbiBjb3B5OworCQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworCisJCSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHRoZSBUT0MgZW50cnkgaXMKKwkJCSBmb3IgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCisJCSAgICAgIHJlbG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZyZWxzeW0sCisJCQkJCQkJCXJlbGJ1Zik7CisJCSAgICAgIGlmIChyZWxuYW1lID09IE5VTEwpCisJCQlnb3RvIGVycm9yX3JldHVybjsKKworCQkgICAgICAvKiBXZSBvbmx5IG1lcmdlIFRPQyBlbnRyaWVzIGlmIHRoZSBUQyBuYW1lIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIHN5bWJvbCBuYW1lLiAgVGhpcyBoYW5kbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vcm1hbCBjYXNlLCBidXQgbm90IGNvbW1vbiBjYXNlcyBsaWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lNLlA0IHdoaWNoIGdjYyBnZW5lcmF0ZXMgdG8gc3RvcmUgU1lNICsgNAorICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBUT0MuICBGSVhNRS4gICovCisJCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHJlbG5hbWUpID09IDApCisJCQl7CisJCQkgIGNvcHkgPSAoISBpbmZvLT5rZWVwX21lbW9yeQorCQkJCSAgfHwgcmVsc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKKwkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKTsKKwkJCSAgaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCQkJICAgICAgcmVsbmFtZSwgdHJ1ZSwgY29weSwKKwkJCQkJCSAgICAgIGZhbHNlKTsKKwkJCSAgaWYgKGggPT0gTlVMTCkKKwkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKworCQkJICAvKiBBdCB0aGlzIHBvaW50IGgtPnJvb3QudHlwZSBjb3VsZCBiZQorCQkJICAgICBiZmRfbGlua19oYXNoX25ldy4gIFRoYXQgc2hvdWxkIGJlIE9LLAorCQkJICAgICBzaW5jZSB3ZSBrbm93IGZvciBzdXJlIHRoYXQgd2Ugd2lsbCBjb21lCisJCQkgICAgIGFjcm9zcyB0aGlzIHN5bWJvbCBhcyB3ZSBzdGVwIHRocm91Z2ggdGhlCisJCQkgICAgIGZpbGUuICAqLworCisJCQkgIC8qIFdlIHN0b3JlIGggaW4gKnN5bV9oYXNoIGZvciB0aGUKKwkJCSAgICAgY29udmVuaWVuY2Ugb2YgdGhlIHJlbG9jYXRlX3NlY3Rpb24KKwkJCSAgICAgZnVuY3Rpb24uICAqLworCQkJICAqc3ltX2hhc2ggPSBoOworCisJCQkgIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMKQorCQkJICAgIHsKKwkJCSAgICAgIGFzZWN0aW9uICoqcmVsX2NzZWN0czsKKworCQkJICAgICAgLyogV2UgYWxyZWFkeSBoYXZlIGEgVE9DIGVudHJ5IGZvciB0aGlzCisJCQkJIHN5bWJvbCwgc28gd2UgY2FuIGp1c3QgaWdub3JlIHRoaXMKKwkJCQkgb25lLiAgKi8KKwkJCSAgICAgIHJlbF9jc2VjdHMgPQorCQkJCXJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0czsKKwkJCSAgICAgIHJlbF9jc2VjdHNbcmVsaW5keF0gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCisJCQkgIC8qIFdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBUT0MgZW50cnkgZm9yCisJCQkgICAgIHRoaXMgc3ltYm9sLiAgKi8KKwkJCSAgc2V0X3RvYyA9IGg7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBzZWN0aW9uLiAgV2UgZ2V0IHRoZSBuYW1lIGZyb20KKwkgICAgIHRoZSBjc2VjdCBzdG9yYWdlIG1hcHBpbmcgY2xhc3MsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4KKwkgICAgIGFjY3VtdWxhdGUgc2ltaWxhciBjc2VjdHMgdG9nZXRoZXIuICAqLworCSAgeworCSAgICBzdGF0aWMgY29uc3QgY2hhciAqY3NlY3RfbmFtZV9ieV9jbGFzc1tdID0KKwkgICAgICB7CisJCSIucHIiLCAiLnJvIiwgIi5kYiIsICIudGMiLCAiLnVhIiwgIi5ydyIsICIuZ2wiLCAiLnhvIiwKKwkJIi5zdiIsICIuYnMiLCAiLmRzIiwgIi51YyIsICIudGkiLCAiLnRiIiwgTlVMTCwgIi50YzAiLAorCQkiLnRkIgorCSAgICAgIH07CisJICAgIGNvbnN0IGNoYXIgKmNzZWN0X25hbWU7CisJICAgIGFzZWN0aW9uICplbmNsb3Npbmc7CisKKwkgICAgaWYgKChhdXgueF9jc2VjdC54X3NtY2xhcyA+PQorCQkgc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3MgLyBzaXplb2YgY3NlY3RfbmFtZV9ieV9jbGFzc1swXSkKKwkJfHwgY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc10gPT0gTlVMTCkKKwkgICAgICB7CisJCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBzbWNsYXMgJWQiKSwKKwkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUsIGF1eC54X2NzZWN0Lnhfc21jbGFzKTsKKwkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIH0KKworCSAgICBjc2VjdF9uYW1lID0gY3NlY3RfbmFtZV9ieV9jbGFzc1thdXgueF9jc2VjdC54X3NtY2xhc107CisJICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIGNzZWN0X25hbWUpOworCSAgICBpZiAoY3NlY3QgPT0gTlVMTCkKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgZW5jbG9zaW5nID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBzeW0ubl9zY251bSk7CisJICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKKwkgICAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlbmNsb3NpbmcpCisJCSYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPCBlbmNsb3NpbmctPnZtYQorCQkgICAgfHwgKChiZmRfdm1hKSBzeW0ubl92YWx1ZSArIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKKwkJCT4gZW5jbG9zaW5nLT52bWEgKyBlbmNsb3NpbmctPl9yYXdfc2l6ZSkpKQorCSAgICAgIHsKKwkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgKF8oIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIpLAorCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7CisJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICB9CisJICAgIGNzZWN0LT52bWEgPSBzeW0ubl92YWx1ZTsKKwkgICAgY3NlY3QtPmZpbGVwb3MgPSAoZW5jbG9zaW5nLT5maWxlcG9zCisJCQkgICAgICArIHN5bS5uX3ZhbHVlCisJCQkgICAgICAtIGVuY2xvc2luZy0+dm1hKTsKKwkgICAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7CisJICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7CisJICAgIGNzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBTTVRZUF9BTElHTiAoYXV4LnhfY3NlY3QueF9zbXR5cCk7CisKKwkgICAgLyogUmVjb3JkIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiBpbiB0aGUgdGRhdGEgZm9yIHRoaXMgbmV3CisJICAgICAgIHNlY3Rpb24uICAqLworCSAgICBjc2VjdC0+dXNlZF9ieV9iZmQgPQorCSAgICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOworCSAgICBpZiAoY3NlY3QtPnVzZWRfYnlfYmZkID09IE5VTEwpCisJICAgICAgZ290byBlcnJvcl9yZXR1cm47CisJICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KKwkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhKSk7CisJICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQorCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nID0gZW5jbG9zaW5nOworCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGluZW5vX2NvdW50ID0KKwkgICAgICBlbmNsb3NpbmctPmxpbmVub19jb3VudDsKKworCSAgICBpZiAoZW5jbG9zaW5nLT5vd25lciA9PSBhYmZkKQorCSAgICAgIHsKKwkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7CisJCWJmZF9zaXplX3R5cGUgcmVsaW5keDsKKwkJc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7CisJCWFzZWN0aW9uICoqcmVsX2NzZWN0OworCisJCXJlbG9jcyA9IHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKKwkJcmVsaW5keCA9IHhjb2ZmX2ZpbmRfcmVsb2MgKHJlbG9jcywgZW5jbG9zaW5nLT5yZWxvY19jb3VudCwKKwkJCQkJICAgIGNzZWN0LT52bWEpOworCQlyZWwgPSByZWxvY3MgKyByZWxpbmR4OworCQlyZWxfY3NlY3QgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0uY3NlY3RzCisJCQkgICAgICsgcmVsaW5keCk7CisJCWNzZWN0LT5yZWxfZmlsZXBvcyA9IChlbmNsb3NpbmctPnJlbF9maWxlcG9zCisJCQkJICAgICAgKyByZWxpbmR4ICogYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKKwkJd2hpbGUgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50CisJCSAgICAgICAmJiAqcmVsX2NzZWN0ID09IE5VTEwKKwkJICAgICAgICYmIHJlbC0+cl92YWRkciA8IGNzZWN0LT52bWEgKyBjc2VjdC0+X3Jhd19zaXplKQorCQkgIHsKKwkJICAgICpyZWxfY3NlY3QgPSBjc2VjdDsKKwkJICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfUkVMT0M7CisJCSAgICArK2NzZWN0LT5yZWxvY19jb3VudDsKKwkJICAgICsrcmVsaW5keDsKKwkJICAgICsrcmVsOworCQkgICAgKytyZWxfY3NlY3Q7CisJCSAgfQorCSAgICAgIH0KKworCSAgICAvKiBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgZmllbGRzIGFuZCBzZWN0aW9uIGZsYWdzCisJICAgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KKworCSAgICBjc2VjdF9pbmRleCA9ICgoZXN5bQorCQkJICAgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQorCQkJICAgLyBzeW1lc3opOworCisJICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKKworCSAgICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKKwkgICAgICBmaXJzdF9jc2VjdCA9IGNzZWN0OworCisJICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIENfRVhULCB3ZSB0cmVhdCBpdCBhcyBzdGFydGluZyBhdCB0aGUKKwkgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBuZXdseSBjcmVhdGVkIHNlY3Rpb24uICAqLworCSAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQorCSAgICAgIHsKKwkJc2VjdGlvbiA9IGNzZWN0OworCQl2YWx1ZSA9IDA7CisJICAgICAgfQorCisJICAgIC8qIElmIHRoaXMgaXMgYSBUT0Mgc2VjdGlvbiBmb3IgYSBzeW1ib2wsIHJlY29yZCBpdC4gICovCisJICAgIGlmIChzZXRfdG9jICE9IE5VTEwpCisJICAgICAgc2V0X3RvYy0+dG9jX3NlY3Rpb24gPSBjc2VjdDsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBYVFlfTEQ6CisJICAvKiBUaGlzIGlzIGEgbGFiZWwgZGVmaW5pdGlvbi4gIFRoZSB4X3NjbmxlbiBmaWVsZCBpcyB0aGUKKyAgICAgICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNzZWN0LiAgSSBiZWxpZXZlIHRoYXQgdGhpcyBtdXN0CisgICAgICAgICAgICAgYWx3YXlzIGZvbGxvdyB0aGUgYXBwcm9wcmlhdGUgWFRZX1NEIHN5bWJvbCwgc28gSSB3aWxsCisgICAgICAgICAgICAgaW5zaXN0IG9uIGl0LiAgKi8KKwkgIHsKKwkgICAgYm9vbGVhbiBiYWQ7CisKKwkgICAgYmFkID0gZmFsc2U7CisJICAgIGlmIChhdXgueF9jc2VjdC54X3Njbmxlbi5sIDwgMAorCQl8fCAoYXV4LnhfY3NlY3QueF9zY25sZW4ubAorCQkgICAgPj0gZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkpCisJICAgICAgYmFkID0gdHJ1ZTsKKwkgICAgaWYgKCEgYmFkKQorCSAgICAgIHsKKwkJc2VjdGlvbiA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHNbYXV4LnhfY3NlY3QueF9zY25sZW4ubF07CisJCWlmIChzZWN0aW9uID09IE5VTEwKKwkJICAgIHx8IChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCisJCSAgYmFkID0gdHJ1ZTsKKwkgICAgICB9CisJICAgIGlmIChiYWQpCisJICAgICAgeworCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJICAoXygiJXM6IG1pc3BsYWNlZCBYVFlfTEQgYCVzJyIpLAorCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSk7CisJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwkgICAgICB9CisKKwkgICAgdmFsdWUgPSBzeW0ubl92YWx1ZSAtIGNzZWN0LT52bWE7CisJICB9CisJICBicmVhazsKKworCWNhc2UgWFRZX0NNOgorCSAgLyogVGhpcyBpcyBhbiB1bml0aWFsaXplZCBjc2VjdC4gIFdlIGNvdWxkIGJhc2UgdGhlIG5hbWUgb24KKyAgICAgICAgICAgICB0aGUgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGV4Y2VwdCBmb3IKKyAgICAgICAgICAgICBhbiBYTUNfVEQgc3ltYm9sLiAgSWYgdGhpcyBjc2VjdCBpcyBleHRlcm5hbGx5IHZpc2libGUsCisgICAgICAgICAgICAgaXQgaXMgYSBjb21tb24gc3ltYm9sLiAgV2UgcHV0IFhNQ19URCBzeW1ib2xzIGluIHNlY3Rpb25zCisgICAgICAgICAgICAgbmFtZWQgLnRvY2JzcywgYW5kIHJlbHkgb24gdGhlIGxpbmtlciBzY3JpcHQgdG8gcHV0IHRoYXQKKyAgICAgICAgICAgICBpbiB0aGUgVE9DIGFyZWEuICAqLworCisJICBpZiAoY3NlY3QgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5sYXN0X3N5bW5keCA9CisJCSgoZXN5bQorCQkgIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpKQorCQkgLyBzeW1lc3opOworCSAgICB9CisKKwkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEQpCisJICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIudG9jYnNzIik7CisJICBlbHNlCisJICAgIGNzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuYnNzIik7CisJICBpZiAoY3NlY3QgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisJICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7CisJICBjc2VjdC0+X3Jhd19zaXplID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKKwkgIGNzZWN0LT5mbGFncyB8PSBTRUNfQUxMT0M7CisJICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOworCSAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncworCSAgICAgd2hpY2ggd2UgZG8gbm90IGJvdGhlciB0byBzZXQuICAqLworCisJICBjc2VjdF9pbmRleCA9ICgoZXN5bQorCQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKKwkJCSAvIHN5bWVzeik7CisKKwkgIGNzZWN0LT51c2VkX2J5X2JmZCA9CisJICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOworCSAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQorCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID0KKwkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOworCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPnRkYXRhID09IE5VTEwpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmZpcnN0X3N5bW5keCA9IGNzZWN0X2luZGV4OworCisJICBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCkKKwkgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKKworCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKKwkgICAgeworCSAgICAgIGNzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOworCSAgICAgIGNzZWN0LT5fcmF3X3NpemUgPSAwOworCSAgICAgIHNlY3Rpb24gPSBjc2VjdDsKKwkgICAgICB2YWx1ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7CisJICAgIH0KKworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBDaGVjayBmb3IgbWFnaWMgc3ltYm9sIG5hbWVzLiAgKi8KKyAgICAgIGlmICgoc210eXAgPT0gWFRZX1NEIHx8IHNtdHlwID09IFhUWV9DTSkKKwkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19UQworCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgIT0gWE1DX1REKQorCXsKKwkgIGludCBpOworCisJICBpID0gLTE7CisJICBpZiAobmFtZVswXSA9PSAnXycpCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiX3RleHQiKSA9PSAwKQorCQlpID0gMDsKKwkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZXRleHQiKSA9PSAwKQorCQlpID0gMTsKKwkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZGF0YSIpID09IDApCisJCWkgPSAyOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lZGF0YSIpID09IDApCisJCWkgPSAzOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIl9lbmQiKSA9PSAwKQorCQlpID0gNDsKKwkgICAgfQorCSAgZWxzZSBpZiAobmFtZVswXSA9PSAnZScgJiYgc3RyY21wIChuYW1lLCAiZW5kIikgPT0gMCkKKwkgICAgaSA9IDU7CisKKwkgIGlmIChpICE9IC0xKQorCSAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3BlY2lhbF9zZWN0aW9uc1tpXSA9IGNzZWN0OworCX0KKworICAgICAgLyogTm93IHdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFkZCB0aGUgc3ltYm9sIHRvIHRoZQorICAgICAgICAgbGlua2VyIGhhc2ggdGFibGUuICAqLworCisgICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUKQorCXsKKwkgIGJvb2xlYW4gY29weTsKKworCSAgQkZEX0FTU0VSVCAoc2VjdGlvbiAhPSBOVUxMKTsKKworCSAgLyogV2UgbXVzdCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5IGlmIHdlIGdvdCBpdCBmcm9tIHRoZQorICAgICAgICAgICAgIHN5bWVudCBpdHNlbGYsIHJhdGhlciB0aGFuIHRoZSBzdHJpbmcgdGFibGUuICAqLworCSAgY29weSA9IGRlZmF1bHRfY29weTsKKwkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgIT0gMAorCSAgICAgIHx8IHN5bS5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQorCSAgICBjb3B5ID0gdHJ1ZTsKKworCSAgLyogVGhlIEFJWCBsaW5rZXIgYXBwZWFycyB0byBvbmx5IGRldGVjdCBtdWx0aXBsZSBzeW1ib2wKKwkgICAgIGRlZmluaXRpb25zIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHN5bWJvbC4gIElmCisJICAgICBhIHN5bWJvbCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLCBhbmQgdGhlIG9ubHkKKwkgICAgIHJlZmVyZW5jZXMgYXJlIGZyb20gdGhlIHNhbWUgb2JqZWN0IGZpbGUsIHRoZSBBSVggbGlua2VyCisJICAgICBhcHBlYXJzIHRvIHBlcm1pdCBpdC4gIEl0IGRvZXMgbm90IG1lcmdlIHRoZSBkaWZmZXJlbnQKKwkgICAgIGRlZmluaXRpb25zLCBidXQgaGFuZGxlcyB0aGVtIGluZGVwZW5kZW50bHkuICBPbiB0aGUKKwkgICAgIG90aGVyIGhhbmQsIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlLCB0aGUgbGlua2VyIHJlcG9ydHMKKwkgICAgIGFuIGVycm9yLgorCisJICAgICBUaGlzIG1hdHRlcnMgYmVjYXVzZSB0aGUgQUlYIDxuZXQvbmV0X2dsb2JhbHMuaD4gaGVhZGVyCisJICAgICBmaWxlIGFjdHVhbGx5IGRlZmluZXMgYW4gaW5pdGlhbGl6ZWQgYXJyYXksIHNvIHdlIGhhdmUgdG8KKwkgICAgIGFjdHVhbGx5IHBlcm1pdCB0aGF0IHRvIHdvcmsuCisKKwkgICAgIEp1c3QgdG8gbWFrZSBtYXR0ZXJzIGV2ZW4gbW9yZSBjb25mdXNpbmcsIHRoZSBBSVggbGlua2VyCisJICAgICBhcHBlYXJzIHRvIHBlcm1pdCBtdWx0aXBsZSBzeW1ib2wgZGVmaW5pdGlvbnMgd2hlbmV2ZXIKKwkgICAgIHRoZSBzZWNvbmQgZGVmaW5pdGlvbiBpcyBpbiBhbiBhcmNoaXZlIHJhdGhlciB0aGFuIGFuCisJICAgICBvYmplY3QgZmlsZS4gIFRoaXMgbWF5IGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIG1hbm5lciBpbgorCSAgICAgd2hpY2ggaXQgaGFuZGxlcyBhcmNoaXZlczogSSB0aGluayBpdCBtYXkgbG9hZCB0aGUgZW50aXJlCisJICAgICBhcmNoaXZlIGluIGFzIHNlcGFyYXRlIGNzZWN0cywgYW5kIHRoZW4gbGV0IGdhcmJhZ2UKKwkgICAgIGNvbGxlY3Rpb24gZGlzY2FyZCBzeW1ib2xzLgorCisJICAgICBXZSBhbHNvIGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHN0YXRpY2FsbHkgbGlua2luZyBhCisJICAgICBzaGFyZWQgb2JqZWN0LCB3aGljaCB3aWxsIGNhdXNlIHN5bWJvbCByZWRlZmluaXRpb25zLAorCSAgICAgYWx0aG91Z2ggdGhpcyBpcyBhbiBlYXNpZXIgY2FzZSB0byBkZXRlY3QuICAqLworCisJICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQorCSAgICB7CisJICAgICAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKKwkJKnN5bV9oYXNoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCisJCQkJCQkgICAgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOworCSAgICAgIGVsc2UKKwkJKnN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopCisJCQkgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsCisJCQkJCQkJICAgdHJ1ZSwgY29weSwgZmFsc2UpKTsKKwkgICAgICBpZiAoKnN5bV9oYXNoID09IE5VTEwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIGlmICgoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJCSAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCisJCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQorCQl7CisJCSAgLyogVGhpcyBpcyBhIHNlY29uZCBkZWZpbml0aW9uIG9mIGEgZGVmaW5lZCBzeW1ib2wuICAqLworCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCisJCSAgICAgICYmICgoKnN5bV9oYXNoKS0+c21jbGFzICE9IFhNQ19HTAorCQkJICB8fCBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfR0wKKwkJCSAgfHwgKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncworCQkJICAgICAgJiBEWU5BTUlDKSA9PSAwKSkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIG5ldyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBub3QgZ2xvYmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIG9yIHRoaXMgc3ltYm9sIGlzIGdsb2JhbCBsaW5rYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS4gIElmIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgZ2xvYmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2FnZSBjb2RlIGFuZCB0aGUgbmV3IHN5bWJvbCBpcyBub3QsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZSB3YW50IHRvIHVzZSB0aGUgbmV3IHN5bWJvbC4gICovCisJCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCQkgICAgICB2YWx1ZSA9IDA7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncworCQkJICAgICYgRFlOQU1JQykgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZSBpdC4gICovCisJCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKKwkJICAgICAgKCpzeW1faGFzaCktPnJvb3QudS51bmRlZi5hYmZkID0KKwkJCSgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOworCQkgICAgfQorCQkgIGVsc2UgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBpcyBhIHJlZGVmaW5pdGlvbiBpbiBhbiBvYmplY3QgY29udGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW4gYXJjaGl2ZS4gIEp1c3QgaWdub3JlIGl0LiAgU2VlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgYWJvdmUuICAqLworCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkJICAgICAgdmFsdWUgPSAwOworCQkgICAgfQorCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5yb290Lm5leHQgIT0gTlVMTAorCQkJICAgfHwgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgPT0gJigqc3ltX2hhc2gpLT5yb290KQorCQkgICAgeworCQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UsIHdlIGp1c3QgY29udGludWUgYW5kIHBlcm1pdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgU2VlIHRoZSBjb21tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gICovCisJCSAgICB9CisJCSAgZWxzZSBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBhdXgueF9jc2VjdC54X3NtY2xhcykKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIHN5bWJvbHMgYXJlIGJvdGggY3NlY3RzIG9mIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICBUaGVyZSBpcyBhdCBsZWFzdCBhIGNoYW5jZSB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIHNlbWktbGVnaXRpbWF0ZSByZWRlZmluaXRpb24uICAqLworCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKKwkJICAgICAgdmFsdWUgPSAwOworCQkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gWENPRkZfTVVMVElQTFlfREVGSU5FRDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9NVUxUSVBMWV9ERUZJTkVEKSAhPSAwCisJCSAgICAgICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCQkgICAgICAgJiYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikKKwkJCSAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpKQorCQl7CisJCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIG11bHRpcGx5IGRlZmluZWQgc3ltYm9sLgorCQkgICAgIFJlcG9ydCB0aGUgZXJyb3Igbm93LiAgU2VlIHRoZSBjb21tZW50IGFib3ZlCisJCSAgICAgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgQUlYIGxpbmtlci4gIFdlIGNvdWxkCisJCSAgICAgYWxzbyBkbyB0aGlzIHdpdGggd2FybmluZyBzeW1ib2xzLCBidXQgSSdtIG5vdAorCQkgICAgIHN1cmUgdGhlIFhDT0ZGIGxpbmtlciBpcyB3aG9sbHkgcHJlcGFyZWQgdG8KKwkJICAgICBoYW5kbGUgdGhlbSwgYW5kIHRoYXQgd291bGQgb25seSBiZSBhIHdhcm5pbmcsCisJCSAgICAgbm90IGFuIGVycm9yLiAgKi8KKwkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPm11bHRpcGxlX2RlZmluaXRpb24pCisJCQkgKGluZm8sICgqc3ltX2hhc2gpLT5yb290LnJvb3Quc3RyaW5nLAorCQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAwLAorCQkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKKwkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiwKKwkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUpKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIC8qIFRyeSBub3QgdG8gZ2l2ZSB0aGlzIGVycm9yIHRvbyBtYW55IHRpbWVzLiAgKi8KKwkJICAoKnN5bV9oYXNoKS0+ZmxhZ3MgJj0gflhDT0ZGX01VTFRJUExZX0RFRklORUQ7CisJCX0KKwkgICAgfQorCisJICAvKiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBtYXkgY2FsbCB0aGUgbGlua2VyIHRvCisJICAgICBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIGxpbmtlciBtYXkgdHJ5IHRvIHJlYWQKKwkgICAgIHRoZSBzeW1ib2wgdGFibGUgdG8gZ2l2ZSBhIGdvb2QgZXJyb3IuICBSaWdodCBub3csIHRoZQorCSAgICAgbGluZSBudW1iZXJzIGFyZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNpbmNlIHRoZXkgYXJlCisJICAgICBjb3VudGVkIGJvdGggaW4gdGhlIHJlYWwgc2VjdGlvbnMgYW5kIGluIHRoZSBuZXcgY3NlY3RzLgorCSAgICAgV2UgbmVlZCB0byBsZWF2ZSB0aGUgY291bnQgaW4gdGhlIHJlYWwgc2VjdGlvbnMgc28gdGhhdAorCSAgICAgdGhlIGxpbmtlciBjYW4gcmVwb3J0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXJyb3IKKwkgICAgIGNvcnJlY3RseSwgc28gdGVtcG9yYXJpbHkgY2xvYmJlciB0aGUgbGluayB0byB0aGUgY3NlY3RzCisJICAgICBzbyB0aGF0IHRoZSBsaW5rZXIgd2lsbCBub3QgdHJ5IHRvIHJlYWQgdGhlIGxpbmUgbnVtYmVycworCSAgICAgYSBzZWNvbmQgdGltZSBmcm9tIHRoZSBjc2VjdHMuICAqLworCSAgQkZEX0FTU0VSVCAobGFzdF9yZWFsLT5uZXh0ID09IGZpcnN0X2NzZWN0KTsKKwkgIGxhc3RfcmVhbC0+bmV4dCA9IE5VTEw7CisJICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKKwkJIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsCisJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCwgY29weSwgdHJ1ZSwKKwkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCSAgbGFzdF9yZWFsLT5uZXh0ID0gZmlyc3RfY3NlY3Q7CisKKwkgIGlmIChzbXR5cCA9PSBYVFlfQ00pCisJICAgIHsKKwkgICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbgorCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5zZWN0aW9uICE9IGNzZWN0KQorCQl7CisJCSAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY29tbW9uIGNzZWN0IHdlIGp1c3QgY3JlYXRlZC4gICovCisJCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCisJCSAgICAgPSBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyOworCQl9CisJICAgIH0KKworCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKKwkgICAgeworCSAgICAgIGludCBmbGFnOworCisJICAgICAgaWYgKHNtdHlwID09IFhUWV9FUiB8fCBzbXR5cCA9PSBYVFlfQ00pCisJCWZsYWcgPSBYQ09GRl9SRUZfUkVHVUxBUjsKKwkgICAgICBlbHNlCisJCWZsYWcgPSBYQ09GRl9ERUZfUkVHVUxBUjsKKwkgICAgICAoKnN5bV9oYXNoKS0+ZmxhZ3MgfD0gZmxhZzsKKworCSAgICAgIGlmICgoKnN5bV9oYXNoKS0+c21jbGFzID09IFhNQ19VQQorCQkgIHx8IGZsYWcgPT0gWENPRkZfREVGX1JFR1VMQVIpCisJCSgqc3ltX2hhc2gpLT5zbWNsYXMgPSBhdXgueF9jc2VjdC54X3NtY2xhczsKKwkgICAgfQorCX0KKworICAgICAgKmNzZWN0X2NhY2hlID0gY3NlY3Q7CisKKyAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OworICAgICAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKKyAgICAgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7CisgICAgfQorCisgIEJGRF9BU1NFUlQgKGxhc3RfcmVhbCA9PSBOVUxMIHx8IGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgcmVsb2NzLiAgKi8KKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gZmlyc3RfY3NlY3Q7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIHNpemUgYW5kIHRoZSBsaW5lIG51bWJlciBjb3VudCwgc2luY2UgdGhlCisJIGRhdGEgaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICBEb24ndCByZXNldCB0aGUgc2l6ZSBvZgorCSB0aGUgLmRlYnVnIHNlY3Rpb24sIHNpbmNlIHdlIG5lZWQgdG8gcmVhZCBpdCBiZWxvdyBpbgorCSBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBvKSwgIi5kZWJ1ZyIpICE9IDApCisJby0+X3Jhd19zaXplID0gMDsKKyAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7CisKKyAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisJeworCSAgYmZkX3NpemVfdHlwZSBpOworCSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7CisJICBhc2VjdGlvbiAqKnJlbF9jc2VjdDsKKworCSAgcmVsID0gcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKKwkgIHJlbF9jc2VjdCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7CisJICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsKyssIHJlbF9jc2VjdCsrKQorCSAgICB7CisJICAgICAgaWYgKCpyZWxfY3NlY3QgPT0gTlVMTCkKKwkJeworCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgICAgKF8oIiVzOiByZWxvYyAlczolZCBub3QgaW4gY3NlY3QiKSwKKwkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgby0+bmFtZSwgaSk7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisJCSAgZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCSAgICAgIC8qIFdlIGlkZW50aWZ5IGFsbCBzeW1ib2xzIHdoaWNoIGFyZSBjYWxsZWQsIHNvIHRoYXQgd2UKKwkJIGNhbiBjcmVhdGUgZ2x1ZSBjb2RlIGZvciBjYWxscyB0byBmdW5jdGlvbnMgaW1wb3J0ZWQKKwkJIGZyb20gZHluYW1pYyBvYmplY3RzLiAgKi8KKwkgICAgICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjCisJCSAgJiYgKnJlbF9jc2VjdCAhPSBiZmRfdW5kX3NlY3Rpb25fcHRyCisJCSAgJiYgKHJlbC0+cl90eXBlID09IFJfQlIKKwkJICAgICAgfHwgcmVsLT5yX3R5cGUgPT0gUl9SQlIpCisJCSAgJiYgb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3JlbC0+cl9zeW1uZHhdICE9IE5VTEwpCisJCXsKKwkJICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworCisJCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XTsKKwkJICBoLT5mbGFncyB8PSBYQ09GRl9DQUxMRUQ7CisJCSAgLyogSWYgdGhlIHN5bWJvbCBuYW1lIHN0YXJ0cyB3aXRoIGEgcGVyaW9kLCBpdCBpcworICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGUgb2YgYSBmdW5jdGlvbi4gIElmIHRoZSBzeW1ib2wgaXMKKyAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIFRoaXMgc2hvdWxkIGRvIG5vCisgICAgICAgICAgICAgICAgICAgICBoYXJtLCBiZWNhdXNlIGFueSByZWd1bGFyIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYWxzbyBkZWZpbmUgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLiAgSXQgaGVscHMsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB3ZQorICAgICAgICAgICAgICAgICAgICAgd2lsbCBpZGVudGlmeSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciB3aXRoIGEKKyAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgb2JqZWN0IGlmIGEgZHluYW1pYyBvYmplY3QgZGVmaW5lcyBpdC4gICovCisJCSAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCisJCSAgICAgICYmIGgtPmRlc2NyaXB0b3IgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOworCisJCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCQkJICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcgKyAxLAorCQkJCQkJICAgIHRydWUsIGZhbHNlLCB0cnVlKTsKKwkJICAgICAgaWYgKGhkcyA9PSBOVUxMKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKKwkJCXsKKwkJCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCisJCQkJIChpbmZvLCBhYmZkLCBoZHMtPnJvb3Qucm9vdC5zdHJpbmcsCisJCQkJICAoZmxhZ3dvcmQpIDAsIGJmZF91bmRfc2VjdGlvbl9wdHIsCisJCQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCisJCQkJICB0cnVlLAorCQkJCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGRzKSkpCisJCQkgICAgZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCSAgICAgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKKwkJICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKKwkJCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOworCQkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOworCQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyk7CisJICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID0gTlVMTDsKKworCSAgLyogUmVzZXQgU0VDX1JFTE9DIGFuZCB0aGUgcmVsb2NfY291bnQsIHNpbmNlIHRoZSByZWxvYworCSAgICAgaW5mb3JtYXRpb24gaXMgbm93IGF0dGFjaGVkIHRvIHRoZSBjc2VjdHMuICAqLworCSAgby0+ZmxhZ3MgJj1+IFNFQ19SRUxPQzsKKwkgIG8tPnJlbG9jX2NvdW50ID0gMDsKKworCSAgLyogSWYgd2UgYXJlIG5vdCBrZWVwaW5nIG1lbW9yeSwgZnJlZSB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLworCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKKwkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbykgIT0gTlVMTAorCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzICE9IE5VTEwKKwkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9yZWxvY3MpCisJICAgIHsKKwkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyk7CisJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MgPSBOVUxMOworCSAgICB9CisJfQorCisgICAgICAvKiBGcmVlIHVwIHRoZSBsaW5lIG51bWJlcnMuICBGSVhNRTogV2UgY291bGQgY2FjaGUgdGhlc2UKKyAgICAgICAgIHNvbWV3aGVyZSBmb3IgdGhlIGZpbmFsIGxpbmssIHRvIGF2b2lkIHJlYWRpbmcgdGhlbSBhZ2Fpbi4gICovCisgICAgICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgIT0gTlVMTCkKKwl7CisJICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7CisJICByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyA9IE5VTEw7CisJfQorICAgIH0KKworICBmcmVlIChyZWxvY19pbmZvKTsKKworICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAocmVsb2NfaW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorCXsKKwkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzICE9IE5VTEwpCisJICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOworCSAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCisJICAgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zKTsKKwl9CisgICAgZnJlZSAocmVsb2NfaW5mbyk7CisgICAgfQorICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOworICByZXR1cm4gZmFsc2U7Cit9CisKKyN1bmRlZiBOX1RNQVNLCisjdW5kZWYgTl9CVFNIRlQKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBzeW1ib2xzIGZyb20gYSBkeW5hbWljIG9iamVjdCB0byB0aGUKKyAgIGdsb2JhbCBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBhc2VjdGlvbiAqbHNlYzsKKyAgYmZkX2J5dGUgKmJ1ZjsKKyAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOworICBjb25zdCBjaGFyICpzdHJpbmdzOworICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7CisgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKKyAgY29uc3QgY2hhciAqYm5hbWU7CisgIGNvbnN0IGNoYXIgKm1uYW1lOworICBjb25zdCBjaGFyICpzOworICB1bnNpZ25lZCBpbnQgYzsKKyAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICoqcHA7CisKKyAgLyogV2UgY2FuIG9ubHkgaGFuZGxlIGEgZHluYW1pYyBvYmplY3QgaWYgd2UgYXJlIGdlbmVyYXRpbmcgYW4gWENPRkYKKyAgICAgb3V0cHV0IGZpbGUuICAqLworICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQorICAgIHsKKyAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCShfKCIlczogWENPRkYgc2hhcmVkIG9iamVjdCB3aGVuIG5vdCBwcm9kdWNpbmcgWENPRkYgb3V0cHV0IiksCisJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFRoZSBzeW1ib2xzIHdlIHVzZSBmcm9tIGEgZHluYW1pYyBvYmplY3QgYXJlIG5vdCB0aGUgc3ltYm9scyBpbgorICAgICB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZSwgYnV0LCByYXRoZXIsIHRoZSBzeW1ib2xzIGluIHRoZSBleHBvcnQKKyAgICAgdGFibGUuICBJZiB0aGVyZSBpcyBhIGdsb2JhbCBzeW1ib2wgaW4gYSBkeW5hbWljIG9iamVjdCB3aGljaCBpcworICAgICBub3QgaW4gdGhlIGV4cG9ydCB0YWJsZSwgdGhlIGxvYWRlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgaXQsCisgICAgIHNvIHdlIGRvbid0IHdhbnQgdG8gZmluZCBpdCBlaXRoZXIuICBBbHNvLCBvbiBBSVggNC4xLjMsIHNoci5vIGluCisgICAgIGxpYmMuYSBoYXMgc3ltYm9scyBpbiB0aGUgZXhwb3J0IHRhYmxlIHdoaWNoIGFyZSBub3QgaW4gdGhlCisgICAgIHN5bWJvbCB0YWJsZS4gICovCisKKyAgLyogUmVhZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgRklYTUU6IFdlIHNob3VsZCByZWFsbHkgdXNlIHRoZQorICAgICBvX3NubG9hZGVyIGZpZWxkIGluIHRoZSBhLm91dCBoZWFkZXIsIHJhdGhlciB0aGFuIGdyYWJiaW5nIHRoZQorICAgICBzZWN0aW9uIGJ5IG5hbWUuICAqLworICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7CisgIGlmIChsc2VjID09IE5VTEwpCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJKF8oIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIpLAorCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7CisKKyAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBmcm9tIHRoaXMgb2JqZWN0LCBzbyB0aGF0IHRoZXkgZG8gbm90IGdldAorICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gICovCisgIGFiZmQtPnNlY3Rpb25zID0gTlVMTDsKKworICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGJ1ZiwgJmxkaGRyKTsKKworICBzdHJpbmdzID0gKGNoYXIgKikgYnVmICsgbGRoZHIubF9zdG9mZjsKKworICBlbHN5bSA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikgKGJ1ZiArIExESERSU1opOworICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKKyAgQkZEX0FTU0VSVCAoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pID09IExEU1lNU1opOworICBmb3IgKDsgZWxzeW0gPCBlbHN5bWVuZDsgZWxzeW0rKykKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gbGRzeW07CisgICAgICBjaGFyIG5hbWJ1ZltTWU1OTUxFTiArIDFdOworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOworCisgICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLworICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKKwluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OworICAgICAgZWxzZQorCXsKKwkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7CisJICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKKwkgIG5hbWUgPSBuYW1idWY7CisJfQorCisgICAgICAvKiBOb3JtYWxseSB3ZSBjb3VsZCBub3QgY2FsbCB4Y29mZl9saW5rX2hhc2hfbG9va3VwIGluIGFuIGFkZAorCSBzeW1ib2xzIHJvdXRpbmUsIHNpbmNlIHdlIG1pZ2h0IG5vdCBiZSB1c2luZyBhbiBYQ09GRiBoYXNoCisJIHRhYmxlLiAgSG93ZXZlciwgd2UgdmVyaWZpZWQgYWJvdmUgdGhhdCB3ZSBhcmUgdXNpbmcgYW4gWENPRkYKKwkgaGFzaCB0YWJsZS4gICovCisKKyAgICAgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwKKwkJCQkgIHRydWUsIHRydWUpOworICAgICAgaWYgKGggPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9EWU5BTUlDOworCisgICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgYW5kIHRoZSBCRkQgaXQgd2FzIGZvdW5kIGluIGlzCisJIG5vdCBhIGR5bmFtaWMgb2JqZWN0LCBjaGFuZ2UgdGhlIEJGRCB0byB0aGlzIGR5bmFtaWMgb2JqZWN0LAorCSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3QgaW1wb3J0IGZpbGUgSUQuICAqLworICAgICAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJICAmJiAoaC0+cm9vdC51LnVuZGVmLmFiZmQgPT0gTlVMTAorCSAgICAgIHx8IChoLT5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKSkKKwloLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7CisKKyAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCisJeworCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisJICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7CisJICAvKiBXZSBkbyBub3Qgd2FudCB0byBhZGQgdGhpcyB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KKwl9CisKKyAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1VBCisJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwloLT5zbWNsYXMgPSBsZHN5bS5sX3NtY2xhczsKKworICAgICAgLyogVW5sZXNzIHRoaXMgaXMgYW4gWE1DX1hPIHN5bWJvbCwgd2UgZG9uJ3QgYm90aGVyIHRvIGFjdHVhbGx5CisgICAgICAgICBkZWZpbmUgaXQsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBzZWN0aW9uIHRvIHB1dCBpdCBpbiBhbnlob3cuCisgICAgICAgICBJbnN0ZWFkLCB0aGUgcmVsb2NhdGlvbiByb3V0aW5lcyBoYW5kbGUgdGhlIERFRl9EWU5BTUlDIGZsYWcKKyAgICAgICAgIGNvcnJlY3RseS4gICovCisKKyAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX1hPCisJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKKwl7CisJICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gYWJzb2x1dGUgdmFsdWUuICAqLworCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOworCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOworCX0KKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgZGVmaW5lcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIHRoZW4gaXQKKwkgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBjb2RlIGFzIHdlbGwuICAqLworICAgICAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfRFMKKwkgIHx8IChoLT5zbWNsYXMgPT0gWE1DX1hPICYmIG5hbWVbMF0gIT0gJy4nKSkKKwloLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOworICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCisJeworCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOworCisJICBoZHMgPSBoLT5kZXNjcmlwdG9yOworCSAgaWYgKGhkcyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqZHNubTsKKworCSAgICAgIGRzbm0gPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMik7CisJICAgICAgaWYgKGRzbm0gPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGRzbm1bMF0gPSAnLic7CisJICAgICAgc3RyY3B5IChkc25tICsgMSwgbmFtZSk7CisJICAgICAgaGRzID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIGRzbm0sCisJCQkJCSAgICB0cnVlLCB0cnVlLCB0cnVlKTsKKwkgICAgICBmcmVlIChkc25tKTsKKwkgICAgICBpZiAoaGRzID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAgIGlmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKKwkJeworCQkgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7CisJCSAgaGRzLT5yb290LnUudW5kZWYuYWJmZCA9IGFiZmQ7CisJCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGxpc3QuICAqLworCQl9CisKKwkgICAgICBoZHMtPmRlc2NyaXB0b3IgPSBoOworCSAgICAgIGgtPmRlc2NyaXB0b3IgPSBoZHM7CisJICAgIH0KKworCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKKwkgIGlmIChoZHMtPnNtY2xhcyA9PSBYTUNfVUEpCisJICAgIGhkcy0+c21jbGFzID0gWE1DX1BSOworCisJICAvKiBBbiBhYnNvbHV0ZSBzeW1ib2wgYXBwZWFycyB0byBhY3R1YWxseSBkZWZpbmUgY29kZSwgbm90IGEKKwkgICAgIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIGlzIGhvdyBzb21lIG1hdGggZnVuY3Rpb25zIGFyZQorCSAgICAgaW1wbGVtZW50ZWQgb24gQUlYIDQuMS4gICovCisJICBpZiAoaC0+c21jbGFzID09IFhNQ19YTworCSAgICAgICYmIChoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorCQkgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKKwkgICAgeworCSAgICAgIGhkcy0+c21jbGFzID0gWE1DX1hPOworCSAgICAgIGhkcy0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOworCSAgICAgIGhkcy0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwkgICAgICBoZHMtPnJvb3QudS5kZWYudmFsdWUgPSBsZHN5bS5sX3ZhbHVlOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoYnVmICE9IE5VTEwgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmtlZXBfY29udGVudHMpCisgICAgeworICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyk7CisgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzID0gTlVMTDsKKyAgICB9CisKKyAgLyogUmVjb3JkIHRoaXMgZmlsZSBpbiB0aGUgaW1wb3J0IGZpbGVzLiAgKi8KKworICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKKyAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlKSkpOworICBpZiAobiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgbi0+bmV4dCA9IE5VTEw7CisKKyAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgcGF0aCBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgbGlzdCBmb3IgYQorICAgICBzaGFyZWQgb2JqZWN0IGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgVGhlIGZpbGUgbmFtZSBpcyB0aGUKKyAgICAgYmFzZSBuYW1lLiAgKi8KKyAgbi0+cGF0aCA9ICIiOworICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7CisgICAgICBtbmFtZSA9ICIiOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZC0+bXlfYXJjaGl2ZSk7CisgICAgICBtbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOworICAgIH0KKyAgcyA9IHN0cnJjaHIgKGJuYW1lLCAnLycpOworICBpZiAocyAhPSBOVUxMKQorICAgIGJuYW1lID0gcyArIDE7CisgIG4tPmZpbGUgPSBibmFtZTsKKyAgbi0+bWVtYmVyID0gbW5hbWU7CisKKyAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGltcG9ydCBmaWxlIG51bWJlciBpcyByZXNlcnZlZAorICAgICBmb3IgTElCUEFUSC4gICovCisgIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOworICAgICAgICpwcCAhPSBOVUxMOworICAgICAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCisgICAgOworICAqcHAgPSBuOworCisgIHhjb2ZmX2RhdGEgKGFiZmQpLT5pbXBvcnRfZmlsZV9pZCA9IGM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBSb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4KKyAgIGhhbmRsZWQsIGJ1dCBiZWZvcmUgdGhlIHNlY3Rpb25zIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkuICAqLworCisvKiBNYXJrIGEgc3ltYm9sIGFzIG5vdCBiZWluZyBnYXJiYWdlLCBpbmNsdWRpbmcgdGhlIHNlY3Rpb24gaW4gd2hpY2gKKyAgIGl0IGlzIGRlZmluZWQuICAqLworCitzdGF0aWMgSU5MSU5FIGJvb2xlYW4KK3hjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKK3sKKyAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKKyAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKyAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisgICAgeworICAgICAgYXNlY3Rpb24gKmhzZWM7CisKKyAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247CisgICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGhzZWMpCisJICAmJiAoaHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKKwl7CisJICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoc2VjKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgaWYgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwKKyAgICAgICYmIChoLT50b2Nfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKKyAgICB7CisgICAgICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBoLT50b2Nfc2VjdGlvbikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhlIG1hcmsgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgRm9yIGEgZ2l2ZW4gc2VjdGlvbiwgbWFyaworICAgaXQsIGFuZCBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGRlZmluZSBzeW1ib2xzIHRvIHdoaWNoIGl0IHJlZmVycy4KKyAgIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29rIGF0IHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQKKyAgIHRoZSBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIG5lZWQgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKKyAgIHNlY3Rpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfbWFyayAoaW5mbywgc2VjKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYXNlY3Rpb24gKnNlYzsKK3sKKyAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQorICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgIT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzZWMtPmZsYWdzIHw9IFNFQ19NQVJLOworCisgIGlmIChzZWMtPm93bmVyLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IKKyAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKKyAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipocCwgKipocGVuZDsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLCAqcmVsZW5kOworCisgICAgICAvKiBNYXJrIGFsbCB0aGUgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24uICAqLworCisgICAgICBocCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKKwkgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmZpcnN0X3N5bW5keCk7CisgICAgICBocGVuZCA9IChvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcikKKwkgICAgICAgKyB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxhc3Rfc3ltbmR4KTsKKyAgICAgIGZvciAoOyBocCA8IGhwZW5kOyBocCsrKQorCXsKKwkgIHJlZ2lzdGVyIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkgIGggPSAqaHA7CisJICBpZiAoaCAhPSBOVUxMCisJICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKKwkgICAgeworCSAgICAgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KKworICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCisJICAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKKwl7CisJICByZWwgPSB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoc2VjLT5vd25lciwgc2VjLCB0cnVlLAorCQkJCQkgICAgKGJmZF9ieXRlICopIE5VTEwsIGZhbHNlLAorCQkJCQkgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKTsKKwkgIGlmIChyZWwgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgcmVsZW5kID0gcmVsICsgc2VjLT5yZWxvY19jb3VudDsKKwkgIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQorCSAgICB7CisJICAgICAgYXNlY3Rpb24gKnJzZWM7CisJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgICAgIGlmICgodW5zaWduZWQgaW50KSByZWwtPnJfc3ltbmR4CisJCSAgPiBvYmpfcmF3X3N5bWVudF9jb3VudCAoc2VjLT5vd25lcikpCisJCWNvbnRpbnVlOworCisJICAgICAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChzZWMtPm93bmVyKVtyZWwtPnJfc3ltbmR4XTsKKwkgICAgICBpZiAoaCAhPSBOVUxMCisJCSAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKKwkJeworCQkgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgcnNlYyA9IHhjb2ZmX2RhdGEgKHNlYy0+b3duZXIpLT5jc2VjdHNbcmVsLT5yX3N5bW5keF07CisJICAgICAgaWYgKHJzZWMgIT0gTlVMTAorCQkgICYmIChyc2VjLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQorCQl7CisJCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgcnNlYykpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCX0KKworCSAgICAgIC8qIFNlZSBpZiB0aGlzIHJlbG9jIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCisgICAgICAgICAgICAgICAgIHNlY3Rpb24uICAqLworCSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCisJCXsKKwkJZGVmYXVsdDoKKwkJICBpZiAoaCA9PSBOVUxMCisJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaworCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KKwkJICAgICAgfHwgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAorCQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJCQkgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCisJCQkgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAorCQkJICAmJiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKKwkJCSAgICAgIHx8ICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDAKKwkJCQkgICYmIChoLT5kZXNjcmlwdG9yLT5mbGFncworCQkJCSAgICAgICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKSkpCisJCSAgICBicmVhazsKKwkJICAvKiBGYWxsIHRocm91Z2guICAqLworCQljYXNlIFJfUE9TOgorCQljYXNlIFJfTkVHOgorCQljYXNlIFJfUkw6CisJCWNhc2UgUl9STEE6CisJCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRyZWxfY291bnQ7CisJCSAgaWYgKGggIT0gTlVMTCkKKwkJICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0xEUkVMOworCQkgIGJyZWFrOworCQljYXNlIFJfVE9DOgorCQljYXNlIFJfR0w6CisJCWNhc2UgUl9UQ0w6CisJCWNhc2UgUl9UUkw6CisJCWNhc2UgUl9UUkxBOgorCQkgIC8qIFdlIHNob3VsZCBuZXZlciBuZWVkIGEgLmxvYWRlciByZWxvYyBmb3IgYSBUT0MKKwkJICAgICByZWxhdGl2ZSByZWxvYy4gICovCisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICBpZiAoISBpbmZvLT5rZWVwX21lbW9yeQorCSAgICAgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKKwkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzICE9IE5VTEwKKwkgICAgICAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5rZWVwX3JlbG9jcykKKwkgICAgeworCSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MpOworCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5yZWxvY3MgPSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhlIHN3ZWVwIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIFJlbW92ZSBhbGwgZ2FyYmFnZQorICAgc2VjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAoreGNvZmZfc3dlZXAgKGluZm8pCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBiZmQgKnN1YjsKKworICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqbzsKKworICAgICAgZm9yIChvID0gc3ViLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKwl7CisJICBpZiAoKG8tPmZsYWdzICYgU0VDX01BUkspID09IDApCisJICAgIHsKKwkgICAgICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBmcm9tIG5vbi1YQ09GRiBpbnB1dCBmaWxlcy4gIEtlZXAKKyAgICAgICAgICAgICAgICAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgbW9tZW50LiAgKi8KKwkgICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IKKwkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uCisJCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24KKwkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb24KKwkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbgorCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbgorCQkgIHx8IHN0cmNtcCAoby0+bmFtZSwgIi5kZWJ1ZyIpID09IDApCisJCW8tPmZsYWdzIHw9IFNFQ19NQVJLOworCSAgICAgIGVsc2UKKwkJeworCQkgIG8tPl9yYXdfc2l6ZSA9IDA7CisJCSAgby0+cmVsb2NfY291bnQgPSAwOworCQkgIG8tPmxpbmVub19jb3VudCA9IDA7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIFJlY29yZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgc2V0LiAgVGhpcyBpcyB1c2VkIHRvIG91dHB1dCB0aGUKKyAgIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KKworYm9vbGVhbgorYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgc2l6ZSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7CisgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKK3sKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7CisgIHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCAqbjsKKworICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogVGhpcyB3aWxsIGhhcmRseSBldmVyIGJlIGNhbGxlZC4gIEkgZG9uJ3Qgd2FudCB0byBidXJuIGZvdXIgYnl0ZXMKKyAgICAgcGVyIGdsb2JhbCBzeW1ib2wsIHNvIGluc3RlYWQgdGhlIHNpemUgaXMga2VwdCBvbiBhIGxpbmtlZCBsaXN0CisgICAgIGF0dGFjaGVkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworICBuID0gKChzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKikKKyAgICAgICBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0KSkpOworICBpZiAobiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgbi0+bmV4dCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3Q7CisgIG4tPmggPSBoOworICBuLT5zaXplID0gc2l6ZTsKKyAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNpemVfbGlzdCA9IG47CisKKyAgaC0+ZmxhZ3MgfD0gWENPRkZfSEFTX1NJWkU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEltcG9ydCBhIHN5bWJvbC4gICovCisKK2Jvb2xlYW4KK2JmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCB2YWwsIGltcHBhdGgsIGltcGZpbGUsCisJCQkgaW1wbWVtYmVyKQorICAgICBiZmQgKm91dHB1dF9iZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKKyAgICAgYmZkX3ZtYSB2YWw7CisgICAgIGNvbnN0IGNoYXIgKmltcHBhdGg7CisgICAgIGNvbnN0IGNoYXIgKmltcGZpbGU7CisgICAgIGNvbnN0IGNoYXIgKmltcG1lbWJlcjsKK3sKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7CisKKyAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEEgc3ltYm9sIG5hbWUgd2hpY2ggc3RhcnRzIHdpdGggYSBwZXJpb2QgaXMgdGhlIGNvZGUgZm9yIGEKKyAgICAgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgdGhlbiBhZGQgYW4gdW5kZWZpbmVkCisgICAgIHN5bWJvbCBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBpbXBvcnQgdGhhdCBpbnN0ZWFkLiAgKi8KKyAgaWYgKGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gPT0gJy4nCisgICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKyAgICAgICYmIHZhbCA9PSAoYmZkX3ZtYSkgLTEpCisgICAgeworICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGRzOworCisgICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOworICAgICAgaWYgKGhkcyA9PSBOVUxMKQorCXsKKwkgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAorCQkJCQloLT5yb290LnJvb3Quc3RyaW5nICsgMSwKKwkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUpOworCSAgaWYgKGhkcyA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCisJICAgIHsKKwkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOworCSAgICAgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKKwkgICAgfQorCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOworCSAgQkZEX0FTU0VSVCAoKGhkcy0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpID09IDAKKwkJICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgPT0gMCk7CisJICBoZHMtPmRlc2NyaXB0b3IgPSBoOworCSAgaC0+ZGVzY3JpcHRvciA9IGhkczsKKwl9CisKKyAgICAgIC8qIE5vdywgaWYgdGhlIGRlc2NyaXB0b3IgaXMgdW5kZWZpbmVkLCBpbXBvcnQgdGhlIGRlc2NyaXB0b3IKKyAgICAgICAgIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgd2Ugd2VyZSB0b2xkIHRvIGltcG9ydC4gIEZJWE1FOiBJcworICAgICAgICAgdGhpcyBjb3JyZWN0IGluIGFsbCBjYXNlcz8gICovCisgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJaCA9IGhkczsKKyAgICB9CisKKyAgaC0+ZmxhZ3MgfD0gWENPRkZfSU1QT1JUOworCisgIGlmICh2YWwgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAmJiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikKKwkgICAgICB8fCBoLT5yb290LnUuZGVmLnZhbHVlICE9IHZhbCkpCisJeworCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQorCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCisJCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uLCBoLT5yb290LnUuZGVmLnZhbHVlLAorCQkgIG91dHB1dF9iZmQsIGJmZF9hYnNfc2VjdGlvbl9wdHIsIHZhbCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisgICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHZhbDsKKyAgICB9CisKKyAgLyogV2Ugb3ZlcmxvYWQgdGhlIGxkaW5keCBmaWVsZCB0byBob2xkIHRoZSBsX2lmaWxlIHZhbHVlIGZvciB0aGlzCisgICAgIHN5bWJvbC4gICovCisgIEJGRF9BU1NFUlQgKGgtPmxkc3ltID09IE5VTEwpOworICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9CVUlMVF9MRFNZTSkgPT0gMCk7CisgIGlmIChpbXBwYXRoID09IE5VTEwpCisgICAgaC0+bGRpbmR4ID0gLTE7CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgYzsKKyAgICAgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOworCisgICAgICAvKiBXZSBzdGFydCBjIGF0IDEgYmVjYXVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGltcG9ydCBsaXN0IGlzCisgICAgICAgICByZXNlcnZlZCBmb3IgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGguICAqLworICAgICAgZm9yIChwcCA9ICZ4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0cywgYyA9IDE7CisJICAgKnBwICE9IE5VTEw7CisJICAgcHAgPSAmKCpwcCktPm5leHQsICsrYykKKwl7CisJICBpZiAoc3RyY21wICgoKnBwKS0+cGF0aCwgaW1wcGF0aCkgPT0gMAorCSAgICAgICYmIHN0cmNtcCAoKCpwcCktPmZpbGUsIGltcGZpbGUpID09IDAKKwkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5tZW1iZXIsIGltcG1lbWJlcikgPT0gMCkKKwkgICAgYnJlYWs7CisJfQorCisgICAgICBpZiAoKnBwID09IE5VTEwpCisJeworCSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpuOworCisJICBuID0gKChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKikKKwkgICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKKwkgIGlmIChuID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIG4tPm5leHQgPSBOVUxMOworCSAgbi0+cGF0aCA9IGltcHBhdGg7CisJICBuLT5maWxlID0gaW1wZmlsZTsKKwkgIG4tPm1lbWJlciA9IGltcG1lbWJlcjsKKwkgICpwcCA9IG47CisJfQorCisgICAgICBoLT5sZGluZHggPSBjOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRXhwb3J0IGEgc3ltYm9sLiAgKi8KKworYm9vbGVhbgorYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHN5c2NhbGwpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOworICAgICBib29sZWFuIHN5c2NhbGw7Cit7CisgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOworCisgIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBoLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7CisKKyAgLyogRklYTUU6IEknbSBub3QgYXQgYWxsIHN1cmUgd2hhdCBzeXNjYWxsIGlzIHN1cHBvc2VkIHRvIG1lYW4sIHNvCisgICAgIEknbSBqdXN0IGdvaW5nIHRvIGlnbm9yZSBpdCB1bnRpbCBzb21lYm9keSBleHBsYWlucyBpdC4gICovCisKKyAgLyogU2VlIGlmIHRoaXMgaXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgSXQgbWF5IGJlIG9uZSBldmVuIHRob3VnaAorICAgICBpdCBpcyBub3Qgc28gbWFya2VkLiAgKi8KKyAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDAKKyAgICAgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gIT0gJy4nKQorICAgIHsKKyAgICAgIGNoYXIgKmZubmFtZTsKKyAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhmbjsKKworICAgICAgZm5uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSArIDIpOworICAgICAgaWYgKGZubmFtZSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGZubmFtZVswXSA9ICcuJzsKKyAgICAgIHN0cmNweSAoZm5uYW1lICsgMSwgaC0+cm9vdC5yb290LnN0cmluZyk7CisgICAgICBoZm4gPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCQkgICAgZm5uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgZnJlZSAoZm5uYW1lKTsKKyAgICAgIGlmIChoZm4gIT0gTlVMTAorCSAgJiYgaGZuLT5zbWNsYXMgPT0gWE1DX1BSCisJICAmJiAoaGZuLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgICAgfHwgaGZuLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwl7CisJICBoLT5mbGFncyB8PSBYQ09GRl9ERVNDUklQVE9SOworCSAgaC0+ZGVzY3JpcHRvciA9IGhmbjsKKwkgIGhmbi0+ZGVzY3JpcHRvciA9IGg7CisJfQorICAgIH0KKworICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2FyYmFnZSBjb2xsZWN0IHRoaXMgc3ltYm9sLiAgKi8KKyAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgbWFrZSBzdXJlIHdlIGRvbid0IGdhcmJhZ2UKKyAgICAgY29sbGVjdCB0aGUgYXNzb2NpYXRlZCBmdW5jdGlvbiBjb2RlLiAgV2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSB0bworICAgICB3b3JyeSBhYm91dCB0aGlzLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXR0YWNoZWQgdG8gYQorICAgICBzZWN0aW9uIHdpdGggcmVsb2NzLCBidXQgaWYgd2UgYXJlIGNyZWF0aW5nIHRoZSBkZXNjcmlwdG9yCisgICAgIG91cnNlbHZlcyB0aG9zZSByZWxvY3Mgd2lsbCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbWFyayBjb2RlLiAgKi8KKyAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpICE9IDApCisgICAgeworICAgICAgaWYgKCEgeGNvZmZfbWFya19zeW1ib2wgKGluZm8sIGgtPmRlc2NyaXB0b3IpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIENvdW50IGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGZvciByZWxvY3MKKyAgIGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCwgdHlwaWNhbGx5IGZvciBnbG9iYWwgY29uc3RydWN0b3JzCisgICBhbmQgZGVzdHJ1Y3RvcnMuICAqLworCitib29sZWFuCitiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgaW5mbywgbmFtZSkKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQorICAgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUsIGZhbHNlLCBmYWxzZSwKKwkJCQkgICAgIGZhbHNlKSk7CisgIGlmIChoID09IE5VTEwpCisgICAgeworICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbm8gc3VjaCBzeW1ib2wiKSwgbmFtZSk7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGgtPmZsYWdzIHw9IFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfTERSRUw7CisgICsreGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OworICAKKyAgLyogTWFyayB0aGUgc3ltYm9sIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCisgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCB0byB3aGljaCB0aGUgbGlua2VyIHNjcmlwdAorICAgYXNzaWducyBhIHZhbHVlLiAgKi8KKworYm9vbGVhbgorYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQorICAgIHJldHVybiB0cnVlOworCisgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwgdHJ1ZSwgdHJ1ZSwKKwkJCSAgICAgIGZhbHNlKTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCisgICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLworCitzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8KK3sKKyAgLyogU2V0IGlmIGEgcHJvYmxlbSBvY2N1cnJlZC4gICovCisgIGJvb2xlYW4gZmFpbGVkOworICAvKiBPdXRwdXQgQkZELiAgKi8KKyAgYmZkICpvdXRwdXRfYmZkOworICAvKiBMaW5rIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gICovCisgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAvKiBXaGV0aGVyIGFsbCBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIGV4cG9ydGVkLiAgKi8KKyAgYm9vbGVhbiBleHBvcnRfZGVmaW5lZHM7CisgIC8qIE51bWJlciBvZiBsZHN5bSBzdHJ1Y3R1cmVzLiAgKi8KKyAgc2l6ZV90IGxkc3ltX2NvdW50OworICAvKiBTaXplIG9mIHN0cmluZyB0YWJsZS4gICovCisgIHNpemVfdCBzdHJpbmdfc2l6ZTsKKyAgLyogU3RyaW5nIHRhYmxlLiAgKi8KKyAgYmZkX2J5dGUgKnN0cmluZ3M7CisgIC8qIEFsbG9jYXRlZCBzaXplIG9mIHN0cmluZyB0YWJsZS4gICovCisgIHNpemVfdCBzdHJpbmdfYWxjOworfTsKKworLyogQnVpbGQgdGhlIC5sb2FkZXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBYQ09GRiBsaW5rZXIKKyAgIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lLiAgV2UgbXVzdCBzZXQgdGhlIHNpemUgb2YgdGhlCisgICAubG9hZGVyIHNlY3Rpb24gYmVmb3JlIHRoZSBsaW5rZXIgbGF5cyBvdXQgdGhlIG91dHB1dCBmaWxlLgorICAgTElCUEFUSCBpcyB0aGUgbGlicmFyeSBwYXRoIHRvIHNlYXJjaCBmb3Igc2hhcmVkIG9iamVjdHM7IHRoaXMgaXMKKyAgIG5vcm1hbGx5IGJ1aWx0IGZyb20gdGhlIC1MIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGxpbmtlci4gIEVOVFJZCisgICBpcyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgcG9pbnQgc3ltYm9sICh0aGUgLWUgbGlua2VyIG9wdGlvbikuCisgICBGSUxFX0FMSUdOIGlzIHRoZSBhbGlnbm1lbnQgdG8gdXNlIGZvciBzZWN0aW9ucyB3aXRoaW4gdGhlIGZpbGUKKyAgICh0aGUgLUggbGlua2VyIG9wdGlvbikuICBNQVhTVEFDSyBpcyB0aGUgbWF4aW11bSBzdGFjayBzaXplICh0aGUKKyAgIC1ibWF4c3RhY2sgbGlua2VyIG9wdGlvbikuICBNQVhEQVRBIGlzIHRoZSBtYXhpbXVtIGRhdGEgc2l6ZSAodGhlCisgICAtYm1heGRhdGEgbGlua2VyIG9wdGlvbikuICBHQyBpcyB3aGV0aGVyIHRvIGRvIGdhcmJhZ2UgY29sbGVjdGlvbgorICAgKHRoZSAtYmdjIGxpbmtlciBvcHRpb24pLiAgTU9EVFlQRSBpcyB0aGUgbW9kdWxlIHR5cGUgKHRoZQorICAgLWJtb2R0eXBlIGxpbmtlciBvcHRpb24pLiAgVEVYVFJPIGlzIHdoZXRoZXIgdGhlIHRleHQgc2VjdGlvbiBtdXN0CisgICBiZSByZWFkIG9ubHkgKHRoZSAtYnRleHRybyBsaW5rZXIgb3B0aW9uKS4gIEVYUE9SVF9ERUZJTkVEUyBpcworICAgd2hldGhlciBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZCAodGhlIC11bml4IGxpbmtlcgorICAgb3B0aW9uKS4gIFNQRUNJQUxfU0VDVElPTlMgaXMgc2V0IGJ5IHRoaXMgcm91dGluZSB0byBjc2VjdHMgd2l0aAorICAgbWFnaWMgbmFtZXMgbGlrZSBfZW5kLiAgKi8KKworYm9vbGVhbgorYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbywgbGlicGF0aCwgZW50cnksCisJCQkJIGZpbGVfYWxpZ24sIG1heHN0YWNrLCBtYXhkYXRhLCBnYywKKwkJCQkgbW9kdHlwZSwgdGV4dHJvLCBleHBvcnRfZGVmaW5lZHMsCisJCQkJIHNwZWNpYWxfc2VjdGlvbnMpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKmxpYnBhdGg7CisgICAgIGNvbnN0IGNoYXIgKmVudHJ5OworICAgICB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247CisgICAgIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7CisgICAgIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKKyAgICAgYm9vbGVhbiBnYzsKKyAgICAgaW50IG1vZHR5cGU7CisgICAgIGJvb2xlYW4gdGV4dHJvOworICAgICBib29sZWFuIGV4cG9ydF9kZWZpbmVkczsKKyAgICAgYXNlY3Rpb24gKipzcGVjaWFsX3NlY3Rpb25zOworeworICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZW50cnk7CisgIGFzZWN0aW9uICpsc2VjOworICBzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gbGRpbmZvOworICBpbnQgaTsKKyAgc2l6ZV90IGltcHNpemUsIGltcGNvdW50OworICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKmZsOworICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKmxkaGRyOworICBiZmRfc2l6ZV90eXBlIHN0b2ZmOworICByZWdpc3RlciBjaGFyICpvdXQ7CisgIGFzZWN0aW9uICpzZWM7CisgIGJmZCAqc3ViOworICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpkZWJ1Z19zdHJ0YWI7CisgIGJmZF9ieXRlICpkZWJ1Z19jb250ZW50cyA9IE5VTEw7CisKKyAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJc3BlY2lhbF9zZWN0aW9uc1tpXSA9IE5VTEw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgbGRpbmZvLmZhaWxlZCA9IGZhbHNlOworICBsZGluZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7CisgIGxkaW5mby5pbmZvID0gaW5mbzsKKyAgbGRpbmZvLmV4cG9ydF9kZWZpbmVkcyA9IGV4cG9ydF9kZWZpbmVkczsKKyAgbGRpbmZvLmxkc3ltX2NvdW50ID0gMDsKKyAgbGRpbmZvLnN0cmluZ19zaXplID0gMDsKKyAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOworICBsZGluZm8uc3RyaW5nX2FsYyA9IDA7CisKKyAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1heHN0YWNrID0gbWF4c3RhY2s7CisgIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tYXhkYXRhID0gbWF4ZGF0YTsKKyAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPm1vZHR5cGUgPSBtb2R0eXBlOworCisgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5maWxlX2FsaWduID0gZmlsZV9hbGlnbjsKKyAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRleHRybyA9IHRleHRybzsKKworICBoZW50cnkgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgZW50cnksCisJCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaWYgKGhlbnRyeSAhPSBOVUxMKQorICAgIGhlbnRyeS0+ZmxhZ3MgfD0gWENPRkZfRU5UUlk7CisKKyAgLyogR2FyYmFnZSBjb2xsZWN0IHVudXNlZCBzZWN0aW9ucy4gICovCisgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKKyAgICAgIHx8ICEgZ2MKKyAgICAgIHx8IGhlbnRyeSA9PSBOVUxMCisgICAgICB8fCAoaGVudHJ5LT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAmJiBoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQorICAgIHsKKyAgICAgIGdjID0gZmFsc2U7CisgICAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+Z2MgPSBmYWxzZTsKKworICAgICAgLyogV2Ugc3RpbGwgbmVlZCB0byBjYWxsIHhjb2ZmX21hcmssIGluIG9yZGVyIHRvIHNldCBsZHJlbF9jb3VudAorICAgICAgICAgY29ycmVjdGx5LiAgKi8KKyAgICAgIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQorCXsKKwkgIGFzZWN0aW9uICpvOworCisJICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQorCQl7CisJCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgbykpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIGhlbnRyeS0+cm9vdC51LmRlZi5zZWN0aW9uKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIHhjb2ZmX3N3ZWVwIChpbmZvKTsKKyAgICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5nYyA9IHRydWU7CisgICAgfQorCisgIC8qIFJldHVybiBzcGVjaWFsIHNlY3Rpb25zIHRvIHRoZSBjYWxsZXIuICAqLworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisKKyAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zcGVjaWFsX3NlY3Rpb25zW2ldOworICAgICAgaWYgKHNlYyAhPSBOVUxMCisJICAmJiBnYworCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKKwlzZWMgPSBOVUxMOworICAgICAgc3BlY2lhbF9zZWN0aW9uc1tpXSA9IHNlYzsKKyAgICB9CisKKyAgaWYgKGluZm8tPmlucHV0X2JmZHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBpbiB0aGlzIGJpemFycmUgY2FzZS4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwgeGNvZmZfYnVpbGRfbGRzeW1zLAorCQkJICAgIChQVFIpICZsZGluZm8pOworICBpZiAobGRpbmZvLmZhaWxlZCkKKyAgICBnb3RvIGVycm9yX3JldHVybjsKKworICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgaW1wb3J0IGZpbGUgbmFtZXMuICBFYWNoIGltcG9ydCBmaWxlIElECisgICAgIGNvbnNpc3RzIG9mIHRocmVlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzOiB0aGUgcGF0aCwgdGhlIGZpbGUKKyAgICAgbmFtZSwgYW5kIHRoZSBhcmNoaXZlIG1lbWJlciBuYW1lLiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0CisgICAgIG9mIG5hbWVzIGlzIHRoZSBwYXRoIHRvIHVzZSB0byBmaW5kIG9iamVjdHMsIHdoaWNoIHRoZSBsaW5rZXIgaGFzCisgICAgIHBhc3NlZCBpbiBhcyB0aGUgbGlicGF0aCBhcmd1bWVudC4gIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGgKKyAgICAgZW50cnkgaW4gdGhlIG90aGVyIGltcG9ydCBmaWxlIG5hbWVzIGFwcGVhcnMgdG8gYWx3YXlzIGJlIGVtcHR5LiAgKi8KKyAgaW1wc2l6ZSA9IHN0cmxlbiAobGlicGF0aCkgKyAzOworICBpbXBjb3VudCA9IDE7CisgIGZvciAoZmwgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0czsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKKyAgICB7CisgICAgICArK2ltcGNvdW50OworICAgICAgaW1wc2l6ZSArPSAoc3RybGVuIChmbC0+cGF0aCkKKwkJICArIHN0cmxlbiAoZmwtPmZpbGUpCisJCSAgKyBzdHJsZW4gKGZsLT5tZW1iZXIpCisJCSAgKyAzKTsKKyAgICB9CisKKyAgLyogU2V0IHVwIHRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KKyAgbGRoZHIgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyOworICBsZGhkci0+bF92ZXJzaW9uID0gMTsKKyAgbGRoZHItPmxfbnN5bXMgPSBsZGluZm8ubGRzeW1fY291bnQ7CisgIGxkaGRyLT5sX25yZWxvYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZHJlbF9jb3VudDsKKyAgbGRoZHItPmxfaXN0bGVuID0gaW1wc2l6ZTsKKyAgbGRoZHItPmxfbmltcGlkID0gaW1wY291bnQ7CisgIGxkaGRyLT5sX2ltcG9mZiA9IChMREhEUlNaCisJCSAgICAgKyBsZGhkci0+bF9uc3ltcyAqIExEU1lNU1oKKwkJICAgICArIGxkaGRyLT5sX25yZWxvYyAqIExEUkVMU1opOworICBsZGhkci0+bF9zdGxlbiA9IGxkaW5mby5zdHJpbmdfc2l6ZTsKKyAgc3RvZmYgPSBsZGhkci0+bF9pbXBvZmYgKyBpbXBzaXplOworICBpZiAobGRpbmZvLnN0cmluZ19zaXplID09IDApCisgICAgbGRoZHItPmxfc3RvZmYgPSAwOworICBlbHNlCisgICAgbGRoZHItPmxfc3RvZmYgPSBzdG9mZjsKKworICAvKiBXZSBub3cga25vdyB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgQWxsb2NhdGUKKyAgICAgc3BhY2UgZm9yIGl0LiAgKi8KKyAgbHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbjsKKyAgbHNlYy0+X3Jhd19zaXplID0gc3RvZmYgKyBsZGhkci0+bF9zdGxlbjsKKyAgbHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgbHNlYy0+X3Jhd19zaXplKTsKKyAgaWYgKGxzZWMtPmNvbnRlbnRzID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogU2V0IHVwIHRoZSBoZWFkZXIuICAqLworICB4Y29mZl9zd2FwX2xkaGRyX291dCAob3V0cHV0X2JmZCwgbGRoZHIsCisJCQkoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGxzZWMtPmNvbnRlbnRzKTsKKworICAvKiBTZXQgdXAgdGhlIGltcG9ydCBmaWxlIG5hbWVzLiAgKi8KKyAgb3V0ID0gKGNoYXIgKikgbHNlYy0+Y29udGVudHMgKyBsZGhkci0+bF9pbXBvZmY7CisgIHN0cmNweSAob3V0LCBsaWJwYXRoKTsKKyAgb3V0ICs9IHN0cmxlbiAobGlicGF0aCkgKyAxOworICAqb3V0KysgPSAnXDAnOworICAqb3V0KysgPSAnXDAnOworICBmb3IgKGZsID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCisgICAgeworICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKworICAgICAgcyA9IGZsLT5wYXRoOworICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQorCTsKKyAgICAgIHMgPSBmbC0+ZmlsZTsKKyAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKKwk7CisgICAgICBzID0gZmwtPm1lbWJlcjsKKyAgICAgIHdoaWxlICgoKm91dCsrID0gKnMrKykgIT0gJ1wwJykKKwk7CisgICAgfQorCisgIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAoKGJmZF9ieXRlICopIG91dCAtIGxzZWMtPmNvbnRlbnRzKSA9PSBzdG9mZik7CisKKyAgLyogU2V0IHVwIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KKyAgaWYgKGxkaW5mby5zdHJpbmdfc2l6ZSA+IDApCisgICAgeworICAgICAgbWVtY3B5IChvdXQsIGxkaW5mby5zdHJpbmdzLCBsZGluZm8uc3RyaW5nX3NpemUpOworICAgICAgZnJlZSAobGRpbmZvLnN0cmluZ3MpOworICAgICAgbGRpbmZvLnN0cmluZ3MgPSBOVUxMOworICAgIH0KKworICAvKiBXZSBjYW4ndCBzZXQgdXAgdGhlIHN5bWJvbCB0YWJsZSBvciB0aGUgcmVsb2NzIHlldCwgYmVjYXVzZSB3ZQorICAgICBkb24ndCB5ZXQga25vdyB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIHZhcmlvdXMgc2VjdGlvbnMuICBUaGUKKyAgICAgLmxvYWRlciBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbAorICAgICBzeW1ib2xzIGFyZSB3cml0dGVuIG91dCBpbiB4Y29mZl9saW5rX2lucHV0X2JmZCBvcgorICAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLiAgVGhlIC5sb2FkZXIgcmVsb2NzIGFyZSB3cml0dGVuIG91dAorICAgICB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG5vcm1hbCByZWxvY3MgYXJlIGhhbmRsZWQgaW4KKyAgICAgeGNvZmZfbGlua19pbnB1dF9iZmQuICAqLworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLworICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uOworICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQorICAgIHsKKyAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOworICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50b2Nfc2VjdGlvbjsKKyAgaWYgKHNlYy0+X3Jhd19zaXplID4gMCkKKyAgICB7CisgICAgICBzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKG91dHB1dF9iZmQsIHNlYy0+X3Jhd19zaXplKTsKKyAgICAgIGlmIChzZWMtPmNvbnRlbnRzID09IE5VTEwpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOworICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQorICAgIHsKKyAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOworICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgLyogTm93IHRoYXQgd2UndmUgZG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24sIGZpZ3VyZSBvdXQgdGhlIGNvbnRlbnRzCisgICAgIG9mIHRoZSAuZGVidWcgc2VjdGlvbi4gICovCisgIGRlYnVnX3N0cnRhYiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zdHJ0YWI7CisKKyAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCisgICAgeworICAgICAgYXNlY3Rpb24gKnN1YmRlYjsKKyAgICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7CisgICAgICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRleDsKKyAgICAgIGFzZWN0aW9uICoqY3NlY3RwcDsKKyAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKKyAgICAgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworCisgICAgICBpZiAoc3ViLT54dmVjICE9IGluZm8tPmhhc2gtPmNyZWF0b3IpCisJY29udGludWU7CisgICAgICBzdWJkZWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ViLCAiLmRlYnVnIik7CisgICAgICBpZiAoc3ViZGViID09IE5VTEwgfHwgc3ViZGViLT5fcmF3X3NpemUgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbAorCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKKwkgIHx8IGluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwpCisJeworCSAgc3ViZGViLT5fcmF3X3NpemUgPSAwOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKHN1YikpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKHN1Yik7CisgICAgICBkZWJ1Z19pbmRleCA9ICgodW5zaWduZWQgbG9uZyAqKQorCQkgICAgIGJmZF96YWxsb2MgKHN1Yiwgc3ltY291bnQgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKSk7CisgICAgICBpZiAoZGVidWdfaW5kZXggPT0gTlVMTCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIHhjb2ZmX2RhdGEgKHN1YiktPmRlYnVnX2luZGljZXMgPSBkZWJ1Z19pbmRleDsKKworICAgICAgLyogR3JhYiB0aGUgY29udGVudHMgb2YgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgV2UgdXNlIG1hbGxvYyBhbmQKKwkgY29weSB0aGUgbmFtZXMgaW50byB0aGUgZGVidWcgc3RyaW5ndGFiLCByYXRoZXIgdGhhbgorCSBiZmRfYWxsb2MsIGJlY2F1c2UgSSBleHBlY3QgdGhhdCwgd2hlbiBsaW5raW5nIG1hbnkgZmlsZXMKKwkgdG9nZXRoZXIsIG1hbnkgb2YgdGhlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZS4gIFN0b3JpbmcgdGhlCisJIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgc2hvdWxkIHNhdmUgc3BhY2UgaW4gdGhpcyBjYXNlLiAgKi8KKyAgICAgIGRlYnVnX2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN1YmRlYi0+X3Jhd19zaXplKTsKKyAgICAgIGlmIChkZWJ1Z19jb250ZW50cyA9PSBOVUxMKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzdWIsIHN1YmRlYiwgKFBUUikgZGVidWdfY29udGVudHMsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzdWJkZWItPl9yYXdfc2l6ZSkpCisJZ290byBlcnJvcl9yZXR1cm47CisKKyAgICAgIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChzdWIpLT5jc2VjdHM7CisKKyAgICAgIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoc3ViKTsKKyAgICAgIGVzeW0gPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoc3ViKTsKKyAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltY291bnQgKiBzeW1lc3o7CisgICAgICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCisJeworCSAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07CisKKwkgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChzdWIsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOworCisJICAqZGVidWdfaW5kZXggPSAodW5zaWduZWQgbG9uZykgLTE7CisKKwkgIGlmIChzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAorCSAgICAgICYmICpjc2VjdHBwICE9IE5VTEwKKwkgICAgICAmJiAoISBnYworCQkgIHx8ICgoKmNzZWN0cHApLT5mbGFncyAmIFNFQ19NQVJLKSAhPSAwCisJCSAgfHwgKmNzZWN0cHAgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKKwkgICAgICAmJiBiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChzdWIsICZzeW0pKQorCSAgICB7CisJICAgICAgY2hhciAqbmFtZTsKKwkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7CisKKwkgICAgICBuYW1lID0gKGNoYXIgKikgZGVidWdfY29udGVudHMgKyBzeW0uX24uX25fbi5fbl9vZmZzZXQ7CisJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZGVidWdfc3RydGFiLCBuYW1lLCB0cnVlLCB0cnVlKTsKKwkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgICpkZWJ1Z19pbmRleCA9IGluZHg7CisJICAgIH0KKworCSAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7CisJICBjc2VjdHBwICs9IHN5bS5uX251bWF1eCArIDE7CisJICBkZWJ1Z19pbmRleCArPSBzeW0ubl9udW1hdXggKyAxOworCX0KKworICAgICAgZnJlZSAoZGVidWdfY29udGVudHMpOworICAgICAgZGVidWdfY29udGVudHMgPSBOVUxMOworCisgICAgICAvKiBDbGVhciB0aGUgc2l6ZSBvZiBzdWJkZWIsIHNvIHRoYXQgaXQgaXMgbm90IGluY2x1ZGVkIGRpcmVjdGx5CisJIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisgICAgICBzdWJkZWItPl9yYXdfc2l6ZSA9IDA7CisKKyAgICAgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQorCXsKKwkgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKHN1YikpCisJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCX0KKyAgICB9CisKKyAgaWYgKGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKKyAgICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbi0+X3Jhd19zaXplID0KKyAgICAgIF9iZmRfc3RyaW5ndGFiX3NpemUgKGRlYnVnX3N0cnRhYik7CisKKyAgcmV0dXJuIHRydWU7CisKKyBlcnJvcl9yZXR1cm46CisgIGlmIChsZGluZm8uc3RyaW5ncyAhPSBOVUxMKQorICAgIGZyZWUgKGxkaW5mby5zdHJpbmdzKTsKKyAgaWYgKGRlYnVnX2NvbnRlbnRzICE9IE5VTEwpCisgICAgZnJlZSAoZGVidWdfY29udGVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIEFkZCBhIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzeW1ib2xzLCBpZiBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgYm9vbGVhbgoreGNvZmZfYnVpbGRfbGRzeW1zIChoLCBwKQorICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICpsZGluZm8gPSAoc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvICopIHA7CisgIHNpemVfdCBsZW47CisKKyAgLyogSWYgdGhpcyBpcyBhIGZpbmFsIGxpbmssIGFuZCB0aGUgc3ltYm9sIHdhcyBkZWZpbmVkIGFzIGEgY29tbW9uCisgICAgIHN5bWJvbCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIGFuZCB0aGVyZSB3YXMgbm8gZGVmaW5pdGlvbiBpbgorICAgICBhbnkgZHluYW1pYyBvYmplY3QsIHRoZW4gdGhlIGxpbmtlciB3aWxsIGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvcgorICAgICB0aGUgc3ltYm9sIGluIGEgY29tbW9uIHNlY3Rpb24gYnV0IHRoZSBYQ09GRl9ERUZfUkVHVUxBUiBmbGFnCisgICAgIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKKyAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX1JFRl9SRUdVTEFSKSAhPSAwCisgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAorICAgICAgJiYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQorCSAgfHwgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCisgICAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7CisKKyAgLyogSWYgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQsIG1hcmsgdGhlbSBub3cuICBXZQorICAgICBkb24ndCB3YW50IHRvIGV4cG9ydCB0aGUgYWN0dWFsIGZ1bmN0aW9ucywganVzdCB0aGUgZnVuY3Rpb24KKyAgICAgZGVzY3JpcHRvcnMuICAqLworICBpZiAobGRpbmZvLT5leHBvcnRfZGVmaW5lZHMKKyAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCisgICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdICE9ICcuJykKKyAgICB7CisgICAgICBib29sZWFuIGV4cG9ydDsKKworICAgICAgLyogV2UgZG9uJ3QgZXhwb3J0IGEgc3ltYm9sIHdoaWNoIGlzIGJlaW5nIGRlZmluZWQgYnkgYW4gb2JqZWN0CisJIGluY2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSB3aGljaCBjb250YWlucyBhIHNoYXJlZCBvYmplY3QuICBUaGUKKwkgcmF0aW9uYWxlIGlzIHRoYXQgaWYgYW4gYXJjaGl2ZSBjb250YWlucyBib3RoIGFuIHVuc2hhcmVkIGFuZAorCSBhIHNoYXJlZCBvYmplY3QsIHRoZW4gdGhlcmUgbXVzdCBiZSBzb21lIHJlYXNvbiB0aGF0IHRoZQorCSB1bnNoYXJlZCBvYmplY3QgaXMgdW5zaGFyZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0CisJIHByb3ZpZGluZyBhIHNoYXJlZCB2ZXJzaW9uIG9mIGl0LiAgSW4gcGFydGljdWxhciwgdGhpcyBzb2x2ZXMKKwkgYSBidWcgaW52b2x2aW5nIHRoZSBfc2F2ZWZOTiBzZXQgb2YgZnVuY3Rpb25zLiAgZ2NjIHdpbGwgY2FsbAorCSB0aG9zZSBmdW5jdGlvbnMgd2l0aG91dCBwcm92aWRpbmcgYSBzbG90IHRvIHJlc3RvcmUgdGhlIFRPQywKKwkgc28gaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGJlIGxpbmtlZCBpbiBkaXJlY3RseQorCSBhbmQgbm90IGZyb20gYSBzaGFyZWQgb2JqZWN0LCB3aGljaCBtZWFucyB0aGF0IGEgc2hhcmVkCisJIG9iamVjdCB3aGljaCBhbHNvIGhhcHBlbnMgdG8gbGluayB0aGVtIGluIG11c3Qgbm90IGV4cG9ydAorCSB0aGVtLiAgVGhpcyBpcyBjb25mdXNpbmcsIGJ1dCBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mCisJIGEgZGlmZmVyZW50IGFwcHJvYWNoLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIGNhbiwgb2YgY291cnNlLAorCSBiZSBleHBvcnRlZCBleHBsaWNpdGx5LiAgKi8KKyAgICAgIGV4cG9ydCA9IHRydWU7CisgICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCSAgJiYgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCisJICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlICE9IE5VTEwpCisJeworCSAgYmZkICphcmJmZCwgKm1lbWJlcjsKKworCSAgYXJiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5teV9hcmNoaXZlOworCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJiZmQsIChiZmQgKikgTlVMTCk7CisJICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorCQl7CisJCSAgZXhwb3J0ID0gZmFsc2U7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmJmZCwgbWVtYmVyKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGV4cG9ydCkKKwloLT5mbGFncyB8PSBYQ09GRl9FWFBPUlQ7CisgICAgfQorCisgIC8qIFdlIGRvbid0IHdhbnQgdG8gZ2FyYmFnZSBjb2xsZWN0IHN5bWJvbHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIGluCisgICAgIFhDT0ZGIGZpbGVzLiAgVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gbWFyayB0aGVtLiAgKi8KKyAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCisgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSA9PSAwCisgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICAgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyID09IE5VTEwKKwkgIHx8IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT54dmVjCisJICAgICAgIT0gbGRpbmZvLT5pbmZvLT5oYXNoLT5jcmVhdG9yKSkpCisgICAgaC0+ZmxhZ3MgfD0gWENPRkZfTUFSSzsKKworICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBjYWxsZWQgYW5kIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdCwgb3IgaXQKKyAgICAgaXMgaW1wb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBzZXQgdXAgZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgaXQuCisgICAgIChVbmxlc3Mgd2UgZGlkIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgd2UgZGlkbid0IG5lZWQgdGhpcworICAgICBzeW1ib2wuKSAgKi8KKyAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0NBTExFRCkgIT0gMAorICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorICAgICAgJiYgaC0+cm9vdC5yb290LnN0cmluZ1swXSA9PSAnLicKKyAgICAgICYmIGgtPmRlc2NyaXB0b3IgIT0gTlVMTAorICAgICAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCisJICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCisJICAgICAgJiYgKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApKQorICAgICAgJiYgKCEgeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKKwkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX01BUkspICE9IDApKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZHM7CisKKyAgICAgIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKKyAgICAgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKKyAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHNlYzsKKyAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKKyAgICAgIGgtPnNtY2xhcyA9IFhNQ19HTDsKKyAgICAgIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOworICAgICAgc2VjLT5fcmF3X3NpemUgKz0gWENPRkZfR0xJTktfU0laRTsKKworICAgICAgLyogVGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgcmVxdWlyZXMgYSBUT0MgZW50cnkgZm9yIHRoZQorICAgICAgICAgZGVzY3JpcHRvci4gICovCisgICAgICBoZHMgPSBoLT5kZXNjcmlwdG9yOworICAgICAgQkZEX0FTU0VSVCAoKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJCSAgIHx8IGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorCQkgICYmIChoZHMtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDApOworICAgICAgaGRzLT5mbGFncyB8PSBYQ09GRl9NQVJLOworICAgICAgaWYgKGhkcy0+dG9jX3NlY3Rpb24gPT0gTlVMTCkKKwl7CisJICBoZHMtPnRvY19zZWN0aW9uID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+dG9jX3NlY3Rpb247CisJICBoZHMtPnUudG9jX29mZnNldCA9IGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZTsKKwkgIGhkcy0+dG9jX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSA0OworCSAgKyt4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudDsKKwkgICsraGRzLT50b2Nfc2VjdGlvbi0+cmVsb2NfY291bnQ7CisJICBoZHMtPmluZHggPSAtMjsKKwkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfU0VUX1RPQyB8IFhDT0ZGX0xEUkVMOworCisJICAvKiBXZSBuZWVkIHRvIGNhbGwgeGNvZmZfYnVpbGRfbGRzeW1zIHJlY3Vyc2l2ZWx5IGhlcmUsCisgICAgICAgICAgICAgYmVjYXVzZSB3ZSBtYXkgYWxyZWFkeSBoYXZlIHBhc3NlZCBoZHMgb24gdGhlIHRyYXZlcnNhbC4gICovCisJICB4Y29mZl9idWlsZF9sZHN5bXMgKGhkcywgcCk7CisJfQorICAgIH0KKworICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBleHBvcnRlZCwgYnV0IG5vdCBkZWZpbmVkLCB3ZSBuZWVkIHRvIHRyeSB0bworICAgICBkZWZpbmUgaXQuICAqLworICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwCisgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDAKKyAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwCisgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAorICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSkKKyAgICB7CisgICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAorCSAgJiYgKGgtPmRlc2NyaXB0b3ItPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCBoLT5kZXNjcmlwdG9yLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwl7CisJICBhc2VjdGlvbiAqc2VjOworCisJICAvKiBUaGlzIGlzIGFuIHVuZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgIGEgZGVmaW5lZCBlbnRyeSBwb2ludC4gIFdlIGNhbiBidWlsZCB1cCBhIGZ1bmN0aW9uCisgICAgICAgICAgICAgZGVzY3JpcHRvciBvdXJzZWx2ZXMuICBCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIEFJWCBsaW5rZXIKKyAgICAgICAgICAgICBhY3R1YWxseSBkb2VzIHRoaXMsIGFuZCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0bworICAgICAgICAgICAgIGRvIGl0IGFzIHdlbGwuICAqLworCSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOworCSAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOworCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gc2VjOworCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOworCSAgaC0+c21jbGFzID0gWE1DX0RTOworCSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7CisJICBzZWMtPl9yYXdfc2l6ZSArPSAxMjsKKworCSAgLyogQSBmdW5jdGlvbiBkZXNjcmlwdG9yIHVzZXMgdHdvIHJlbG9jczogb25lIGZvciB0aGUKKyAgICAgICAgICAgICBhc3NvY2lhdGVkIGNvZGUsIGFuZCBvbmUgZm9yIHRoZSBUT0MgYWRkcmVzcy4gICovCisJICB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5sZHJlbF9jb3VudCArPSAyOworCSAgc2VjLT5yZWxvY19jb3VudCArPSAyOworCisJICAvKiBXZSBoYW5kbGUgd3JpdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZXNjcmlwdG9yIGluCisgICAgICAgICAgICAgeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbC4gICovCisJfQorICAgICAgZWxzZQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygid2FybmluZzogYXR0ZW1wdCB0byBleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCBgJXMnIiksCisJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKKwkgIGgtPmxkc3ltID0gTlVMTDsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBzdGlsbCBhIGNvbW1vbiBzeW1ib2wsIGFuZCBpdCB3YXNuJ3QgZ2FyYmFnZQorICAgICBjb2xsZWN0ZWQsIHdlIG5lZWQgdG8gYWN0dWFsbHkgYWxsb2NhdGUgc3BhY2UgZm9yIGl0IGluIHRoZSAuYnNzCisgICAgIHNlY3Rpb24uICAqLworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCisgICAgICAmJiAoISB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYworCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgIT0gMCkKKyAgICAgICYmIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPl9yYXdfc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc19jb21fc2VjdGlvbiAoaC0+cm9vdC51LmMucC0+c2VjdGlvbikpOworICAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+X3Jhd19zaXplID0gaC0+cm9vdC51LmMuc2l6ZTsKKyAgICB9CisKKyAgLyogV2UgbmVlZCB0byBhZGQgYSBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbiBpZiBpdCBpcyBtZW50aW9uZWQKKyAgICAgaW4gYSByZWxvYyB3aGljaCB3ZSBhcmUgY29weWluZyB0byB0aGUgLmxvYWRlciBzZWN0aW9uIGFuZCBpdCB3YXMKKyAgICAgbm90IGRlZmluZWQgb3IgY29tbW9uLCBvciBpZiBpdCBpcyB0aGUgZW50cnkgcG9pbnQsIG9yIGlmIGl0IGlzCisgICAgIGJlaW5nIGV4cG9ydGVkLiAgKi8KKworICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0xEUkVMKSA9PSAwCisgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKKyAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCisgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9FTlRSWSkgPT0gMAorICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSA9PSAwKQorICAgIHsKKyAgICAgIGgtPmxkc3ltID0gTlVMTDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBXZSBkb24ndCBuZWVkIHRvIGFkZCB0aGlzIHN5bWJvbCBpZiB3ZSBkaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZAorICAgICB3ZSBkaWQgbm90IG1hcmsgdGhpcyBzeW1ib2wuICAqLworICBpZiAoeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKKyAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCisgICAgeworICAgICAgaC0+bGRzeW0gPSBOVUxMOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIFdlIG1heSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgc3ltYm9sIGR1ZSB0byB0aGUgcmVjdXJzaXZlCisgICAgIGNhbGwgYWJvdmUuICAqLworICBpZiAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pICE9IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogV2UgbmVlZCB0byBhZGQgdGhpcyBzeW1ib2wgdG8gdGhlIC5sb2FkZXIgc3ltYm9scy4gICovCisKKyAgQkZEX0FTU0VSVCAoaC0+bGRzeW0gPT0gTlVMTCk7CisgIGgtPmxkc3ltID0gKChzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKikKKwkgICAgICBiZmRfemFsbG9jIChsZGluZm8tPm91dHB1dF9iZmQsCisJCQkgIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkc3ltKSkpOworICBpZiAoaC0+bGRzeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCisgICAgaC0+bGRzeW0tPmxfaWZpbGUgPSBoLT5sZGluZHg7CisKKyAgLyogVGhlIGZpcnN0IDMgc3ltYm9sIHRhYmxlIGluZGljZXMgYXJlIHJlc2VydmVkIHRvIGluZGljYXRlIHRoZQorICAgICBzZWN0aW9ucy4gICovCisgIGgtPmxkaW5keCA9IGxkaW5mby0+bGRzeW1fY291bnQgKyAzOworCisgICsrbGRpbmZvLT5sZHN5bV9jb3VudDsKKworICBsZW4gPSBzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpOworICBpZiAobGVuIDw9IFNZTU5NTEVOKQorICAgIHN0cm5jcHkgKGgtPmxkc3ltLT5fbC5fbF9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobGRpbmZvLT5zdHJpbmdfc2l6ZSArIGxlbiArIDMgPiBsZGluZm8tPnN0cmluZ19hbGMpCisJeworCSAgc2l6ZV90IG5ld2FsYzsKKwkgIGJmZF9ieXRlICpuZXdzdHJpbmdzOworCisJICBuZXdhbGMgPSBsZGluZm8tPnN0cmluZ19hbGMgKiAyOworCSAgaWYgKG5ld2FsYyA9PSAwKQorCSAgICBuZXdhbGMgPSAzMjsKKwkgIHdoaWxlIChsZGluZm8tPnN0cmluZ19zaXplICsgbGVuICsgMyA+IG5ld2FsYykKKwkgICAgbmV3YWxjICo9IDI7CisKKwkgIG5ld3N0cmluZ3MgPSAoKGJmZF9ieXRlICopCisJCQliZmRfcmVhbGxvYyAoKFBUUikgbGRpbmZvLT5zdHJpbmdzLCBuZXdhbGMpKTsKKwkgIGlmIChuZXdzdHJpbmdzID09IE5VTEwpCisJICAgIHsKKwkgICAgICBsZGluZm8tPmZhaWxlZCA9IHRydWU7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBsZGluZm8tPnN0cmluZ19hbGMgPSBuZXdhbGM7CisJICBsZGluZm8tPnN0cmluZ3MgPSBuZXdzdHJpbmdzOworCX0KKworICAgICAgYmZkX3B1dF8xNiAobGRpbmZvLT5vdXRwdXRfYmZkLCBsZW4gKyAxLAorCQkgIGxkaW5mby0+c3RyaW5ncyArIGxkaW5mby0+c3RyaW5nX3NpemUpOworICAgICAgc3RyY3B5IChsZGluZm8tPnN0cmluZ3MgKyBsZGluZm8tPnN0cmluZ19zaXplICsgMiwgaC0+cm9vdC5yb290LnN0cmluZyk7CisgICAgICBoLT5sZHN5bS0+X2wuX2xfbC5fbF96ZXJvZXMgPSAwOworICAgICAgaC0+bGRzeW0tPl9sLl9sX2wuX2xfb2Zmc2V0ID0gbGRpbmZvLT5zdHJpbmdfc2l6ZSArIDI7CisgICAgICBsZGluZm8tPnN0cmluZ19zaXplICs9IGxlbiArIDM7CisgICAgfQorCisgIGgtPmZsYWdzIHw9IFhDT0ZGX0JVSUxUX0xEU1lNOworCisgIHJldHVybiB0cnVlOworfQorDAorLyogRG8gdGhlIGZpbmFsIGxpbmsgc3RlcC4gICovCisKK2Jvb2xlYW4KK19iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGJmZF9zaXplX3R5cGUgc3ltZXN6OworICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvIGZpbmZvOworICBhc2VjdGlvbiAqbzsKKyAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7CisgIHNpemVfdCBtYXhfc3ltX2NvdW50OworICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKKyAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKKyAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7CisgIGZpbGVfcHRyIHJlbF9maWxlcG9zOworICB1bnNpZ25lZCBpbnQgcmVsc3o7CisgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKKyAgdW5zaWduZWQgaW50IGxpbmVzejsKKyAgYmZkICpzdWI7CisgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3MgPSBOVUxMOworICBjaGFyIHN0cmJ1ZltTVFJJTkdfU0laRV9TSVpFXTsKKworICBpZiAoaW5mby0+c2hhcmVkKQorICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7CisKKyAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKKworICBmaW5mby5pbmZvID0gaW5mbzsKKyAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7CisgIGZpbmZvLnN0cnRhYiA9IE5VTEw7CisgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7CisgIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOworICBmaW5mby50b2Nfc3ltaW5keCA9IC0xOworICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKKyAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOworICBmaW5mby5vdXRzeW1zID0gTlVMTDsKKyAgZmluZm8ubGluZW5vcyA9IE5VTEw7CisgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKKyAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKKworICBmaW5mby5sZHN5bSA9ICgoc3RydWN0IGV4dGVybmFsX2xkc3ltICopCisJCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cworCQkgICsgTERIRFJTWikpOworICBmaW5mby5sZHJlbCA9ICgoc3RydWN0IGV4dGVybmFsX2xkcmVsICopCisJCSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cworCQkgICsgTERIRFJTWgorCQkgICsgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyLmxfbnN5bXMgKiBMRFNZTVNaKSk7CisKKyAgeGNvZmZfZGF0YSAoYWJmZCktPmNvZmYubGlua19pbmZvID0gaW5mbzsKKworICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOworICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogQ291bnQgdGhlIGxpbmUgbnVtYmVyIGFuZCByZWxvY2F0aW9uIGVudHJpZXMgcmVxdWlyZWQgZm9yIHRoZQorICAgICBvdXRwdXQgZmlsZS4gIERldGVybWluZSBhIGZldyBtYXhpbXVtIHNpemVzLiAgKi8KKyAgbWF4X2NvbnRlbnRzX3NpemUgPSAwOworICBtYXhfbGluZW5vX2NvdW50ID0gMDsKKyAgbWF4X3JlbG9jX2NvdW50ID0gMDsKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgby0+cmVsb2NfY291bnQgPSAwOworICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKKyAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwl7CisJICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzZWM7CisKKwkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247CisKKwkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisJCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCisJCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAorCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCisJICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7CisKKwkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQorCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCisJCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKKworCSAgICAgIG8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7CisKKwkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKKwkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKKwkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQorCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7CisJICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpICE9IE5VTEwKKwkJICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTAorCQkgICYmICh4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudAorCQkgICAgICA+IG1heF9saW5lbm9fY291bnQpKQorCQltYXhfbGluZW5vX2NvdW50ID0KKwkJICB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPmxpbmVub19jb3VudDsKKwkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKKwkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKKwkgICAgfQorCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQorCSAgICArK28tPnJlbG9jX2NvdW50OworCX0KKyAgICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLworICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKKyAgICB7CisgICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmZpbGVfYWxpZ24gIT0gMCkKKwlhYm9ydCAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiZmRfdm1hIGZpbGVfYWxpZ247CisKKyAgICAgIGZpbGVfYWxpZ24gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbjsKKyAgICAgIGlmIChmaWxlX2FsaWduICE9IDApCisJeworCSAgYm9vbGVhbiBzYXdfY29udGVudHM7CisJICBpbnQgaW5keDsKKwkgIGFzZWN0aW9uICoqb3A7CisJICBmaWxlX3B0ciBzb2ZhcjsKKworCSAgLyogSW5zZXJ0IC5wYWQgc2VjdGlvbnMgYmVmb3JlIGV2ZXJ5IHNlY3Rpb24gd2hpY2ggaGFzCisgICAgICAgICAgICAgY29udGVudHMgYW5kIGlzIGxvYWRlZCwgaWYgaXQgaXMgcHJlY2VkZWQgYnkgc29tZSBvdGhlcgorICAgICAgICAgICAgIHNlY3Rpb24gd2hpY2ggaGFzIGNvbnRlbnRzIGFuZCBpcyBsb2FkZWQuICAqLworCSAgc2F3X2NvbnRlbnRzID0gdHJ1ZTsKKwkgIGZvciAob3AgPSAmYWJmZC0+c2VjdGlvbnM7ICpvcCAhPSBOVUxMOyBvcCA9ICYoKm9wKS0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmIChzdHJjbXAgKCgqb3ApLT5uYW1lLCAiLnBhZCIpID09IDApCisJCXNhd19jb250ZW50cyA9IGZhbHNlOworCSAgICAgIGVsc2UgaWYgKCgoKm9wKS0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCisJCSAgICAgICAmJiAoKCpvcCktPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCisJCXsKKwkJICBpZiAoISBzYXdfY29udGVudHMpCisJCSAgICBzYXdfY29udGVudHMgPSB0cnVlOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYXNlY3Rpb24gKm4sICpob2xkOworCisJCSAgICAgIGhvbGQgPSAqb3A7CisJCSAgICAgICpvcCA9IE5VTEw7CisJCSAgICAgIG4gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5wYWQiKTsKKwkJICAgICAgQkZEX0FTU0VSVCAoKm9wID09IG4pOworCQkgICAgICBuLT5uZXh0ID0gaG9sZDsKKwkJICAgICAgbi0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOworCQkgICAgICBuLT5hbGlnbm1lbnRfcG93ZXIgPSAwOworCQkgICAgICBzYXdfY29udGVudHMgPSBmYWxzZTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIC8qIFJlc2V0IHRoZSBzZWN0aW9uIGluZGljZXMgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBuZXcKKyAgICAgICAgICAgICBzZWN0aW9ucy4gICovCisJICBpbmR4ID0gMDsKKwkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorCSAgICB7CisJICAgICAgKytpbmR4OworCSAgICAgIG8tPnRhcmdldF9pbmRleCA9IGluZHg7CisJICAgIH0KKwkgIEJGRF9BU1NFUlQgKCh1bnNpZ25lZCBpbnQpIGluZHggPT0gYWJmZC0+c2VjdGlvbl9jb3VudCk7CisKKwkgIC8qIFdvcmsgb3V0IGFwcHJvcHJpYXRlIHNpemVzIGZvciB0aGUgLnBhZCBzZWN0aW9ucyB0byBmb3JjZQorICAgICAgICAgICAgIGVhY2ggc2VjdGlvbiB0byBsYW5kIG9uIGEgcGFnZSBib3VuZGFyeS4gIFRoaXMgYml0IG9mCisgICAgICAgICAgICAgY29kZSBrbm93cyB3aGF0IGNvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBnb2luZworICAgICAgICAgICAgIHRvIGRvLiAgKi8KKwkgIHNvZmFyID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKKwkgIHNvZmFyICs9IGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7CisJICBzb2ZhciArPSBhYmZkLT5zZWN0aW9uX2NvdW50ICogYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKKwkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorCSAgICBpZiAoby0+cmVsb2NfY291bnQgPj0gMHhmZmZmIHx8IG8tPmxpbmVub19jb3VudCA+PSAweGZmZmYpCisJICAgICAgc29mYXIgKz0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKKworCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnBhZCIpID09IDApCisJCXsKKwkJICBiZmRfdm1hIHBhZ2VvZmY7CisKKwkJICBCRkRfQVNTRVJUIChvLT5fcmF3X3NpemUgPT0gMCk7CisJCSAgcGFnZW9mZiA9IHNvZmFyICYgKGZpbGVfYWxpZ24gLSAxKTsKKwkJICBpZiAocGFnZW9mZiAhPSAwKQorCQkgICAgeworCQkgICAgICBvLT5fcmF3X3NpemUgPSBmaWxlX2FsaWduIC0gcGFnZW9mZjsKKwkJICAgICAgc29mYXIgKz0gZmlsZV9hbGlnbiAtIHBhZ2VvZmY7CisJCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKKwkJICAgIHNvZmFyICs9IEJGRF9BTElHTiAoby0+X3Jhd19zaXplLAorCQkJCQkxIDw8IG8tPmFsaWdubWVudF9wb3dlcik7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZSBuZWVkIHRvIGtlZXAgZm9yIHRoZSByZWxvY3MuICAqLworICB7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKKyAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCisgICAgZmluZm8uc2VjdGlvbl9pbmZvID0KKyAgICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICopCisgICAgICAgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQorCQkgICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOworICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQorICAgICAgeworCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOworCWZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzID0gTlVMTDsKKwlmaW5mby5zZWN0aW9uX2luZm9baV0udG9jX3JlbF9oYXNoZXMgPSBOVUxMOworICAgICAgfQorICB9CisKKyAgLyogU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCisgIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7CisgIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOworICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCisJby0+cmVsX2ZpbGVwb3MgPSAwOworICAgICAgZWxzZQorCXsKKwkgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgSG93ZXZlciwgd2Ugc3RpbGwKKyAgICAgICAgICAgICBhbGxvY2F0ZSB0aGUgYnVmZmVycywgc28gdGhhdCBsYXRlciBjb2RlIGRvZXNuJ3QgaGF2ZSB0bworICAgICAgICAgICAgIHdvcnJ5IGFib3V0IHdoZXRoZXIgd2UgYXJlIHN0cmlwcGluZyBvciBub3QuICAqLworCSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKKwkgICAgby0+cmVsX2ZpbGVwb3MgPSAwOworCSAgZWxzZQorCSAgICB7CisJICAgICAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOworCSAgICAgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7CisJICAgICAgcmVsX2ZpbGVwb3MgKz0gby0+cmVsb2NfY291bnQgKiByZWxzejsKKwkgICAgfQorCisJICAvKiBXZSBkb24ndCBrbm93IHRoZSBpbmRpY2VzIG9mIGdsb2JhbCBzeW1ib2xzIHVudGlsIHdlIGhhdmUKKyAgICAgICAgICAgICB3cml0dGVuIG91dCBhbGwgdGhlIGxvY2FsIHN5bWJvbHMuICBGb3IgZWFjaCBzZWN0aW9uIGluCisgICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLCB3ZSBrZWVwIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGhhc2gKKyAgICAgICAgICAgICB0YWJsZSBlbnRyaWVzLiAgRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYQorICAgICAgICAgICAgIHJlbG9jLiAgV2hlbiB3ZSBmaW5kIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIHdlCisgICAgICAgICAgICAgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICBmaXggdXAgdGhlIHN5bWJvbCBpbmRleCBhZnRlciB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUKKyAgICAgICAgICAgICBsb2NhbCBzeW1ib2xzLgorCisJICAgICBCZWNhdXNlIG9mIHRoaXMgcHJvYmxlbSwgd2UgYWxzbyBrZWVwIHRoZSByZWxvY3MgaW4KKwkgICAgIG1lbW9yeSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyB3YXN0ZXMgbWVtb3J5LgorCSAgICAgV2UgY291bGQgYmFja3BhdGNoIHRoZSBmaWxlIGxhdGVyLCBJIHN1cHBvc2UsIGFsdGhvdWdoIGl0CisJICAgICB3b3VsZCBiZSBzbG93LiAgKi8KKwkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9CisJICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCisJICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOworCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9CisJICAgICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKKwkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50CisJCSAgICAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKTsKKwkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPT0gTlVMTAorCSAgICAgIHx8IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPT0gTlVMTCkKKwkgICAgZ290byBlcnJvcl9yZXR1cm47CisKKwkgIGlmIChvLT5yZWxvY19jb3VudCA+IG1heF9vdXRwdXRfcmVsb2NfY291bnQpCisJICAgIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSBvLT5yZWxvY19jb3VudDsKKwl9CisgICAgfQorCisgIC8qIFdlIG5vdyBrbm93IHRoZSBzaXplIG9mIHRoZSByZWxvY3MsIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGZpbGUKKyAgICAgcG9zaXRpb25zIG9mIHRoZSBsaW5lIG51bWJlcnMuICAqLworICBsaW5lX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKKyAgZmluZm8ubGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOworICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOworICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCisJby0+bGluZV9maWxlcG9zID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7CisJICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OworCX0KKworICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bworCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KKyAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKKyAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7CisgICAgfQorCisgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7CisKKyAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCisgICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQorICAgICBpbnB1dCBCRkQncy4gIFdlIHdhbnQgYXQgbGVhc3QgNiBzeW1ib2xzLCBzaW5jZSB0aGF0IGlzIHRoZQorICAgICBudW1iZXIgd2hpY2ggeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCBtYXkgbmVlZC4gICovCisgIG1heF9zeW1fY291bnQgPSA2OworICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKKyAgICB7CisgICAgICBzaXplX3Qgc3o7CisKKyAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOworICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKKyAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCisJbWF4X3N5bV9jb3VudCA9IHN6OworICAgIH0KKworICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KKyAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQorCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKKwkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOworICBmaW5mby5zeW1faW5kaWNlcyA9IChsb25nICopIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGxvbmcpKTsKKyAgZmluZm8ub3V0c3ltcyA9ICgoYmZkX2J5dGUgKikKKwkJICAgYmZkX21hbGxvYyAoKHNpemVfdCkgKChtYXhfc3ltX2NvdW50ICsgMSkgKiBzeW1lc3opKSk7CisgIGZpbmZvLmxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2xpbmVub19jb3VudAorCQkJCQkgICAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCkpOworICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7CisgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfcmVsb2NfY291bnQgKiByZWxzeik7CisgIGlmICgoZmluZm8uaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQorICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCisgICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKKyAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCisgICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCisgICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKKyAgeGNvZmZfZGF0YSAoYWJmZCktPnRvYyA9IChiZmRfdm1hKSAtMTsKKworICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKKyAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKKyAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZworICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKKyAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCisgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKwl7CisJICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgorCSAgICAgICYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXItPnh2ZWMgPT0gYWJmZC0+eHZlYykKKwkgICAgeworCSAgICAgIHN1YiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7CisJICAgICAgaWYgKCEgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuKQorCQl7CisJCSAgaWYgKCEgeGNvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKKwkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQorCSAgICB7CisJICAgICAgaWYgKCEgeGNvZmZfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgJmZpbmZvLCBvLCBwKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSB4Y29mZl9saW5rX2lucHV0X2JmZC4gICovCisKKyAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKKyAgICAgIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOworICAgICAgZmluZm8uc3ltX2luZGljZXMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmxpbmVub3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5saW5lbm9zKTsKKyAgICAgIGZpbmZvLmxpbmVub3MgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmNvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZmluZm8uY29udGVudHMpOworICAgICAgZmluZm8uY29udGVudHMgPSBOVUxMOworICAgIH0KKyAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7CisgICAgICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOworICAgIH0KKworICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBzdXBwb3NlZCB0byBiZSAtMS4gIFdyaXRlCisgICAgIGl0IG91dCBhZ2Fpbi4gICovCisgIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEpCisgICAgeworICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSAtMTsKKyAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKKwkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQorCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKKwkJICAgIFNFRUtfU0VUKSAhPSAwCisJICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scyB3aGljaCBkbyBub3QgY29tZSBmcm9tIFhDT0ZGCisgICAgIGlucHV0IGZpbGVzLiAgKi8KKyAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKKwkJCSAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLAorCQkJICAgIChQVFIpICZmaW5mbyk7CisKKyAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKKyAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOworICAgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cgdGhlCisgICAgIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbiBmaW5hbGx5CisgICAgIHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KKyAgZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeik7CisgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICE9IDApCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOworICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOworICAgICAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqdG9jX3JlbF9oYXNoOworICAgICAgYmZkX2J5dGUgKmVyZWw7CisKKyAgICAgIC8qIEEgc3RyaXBwZWQgZmlsZSBoYXMgbm8gcmVsb2NzLiAgKi8KKyAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCisJeworCSAgby0+cmVsb2NfY291bnQgPSAwOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKKyAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7CisgICAgICByZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXM7CisgICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKKwl7CisJICBpZiAoKnJlbF9oYXNoICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoKCpyZWxfaGFzaCktPmluZHggPCAwKQorCQl7CisJCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQorCQkJIChpbmZvLCAoKnJlbF9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKKwkJCSAgKGJmZCAqKSBOVUxMLCBvLCBpcmVsLT5yX3ZhZGRyKSkpCisJCSAgICBnb3RvIGVycm9yX3JldHVybjsKKwkJICAoKnJlbF9oYXNoKS0+aW5keCA9IDA7CisJCX0KKwkgICAgICBpcmVsLT5yX3N5bW5keCA9ICgqcmVsX2hhc2gpLT5pbmR4OworCSAgICB9CisJfQorCisgICAgICBmb3IgKHRvY19yZWxfaGFzaCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnRvY19yZWxfaGFzaGVzOworCSAgIHRvY19yZWxfaGFzaCAhPSBOVUxMOworCSAgIHRvY19yZWxfaGFzaCA9IHRvY19yZWxfaGFzaC0+bmV4dCkKKwl7CisJICBpZiAodG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4IDwgMCkKKwkgICAgeworCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKKwkJICAgICAoaW5mbywgdG9jX3JlbF9oYXNoLT5oLT5yb290LnJvb3Quc3RyaW5nLAorCQkgICAgICAoYmZkICopIE5VTEwsIG8sIHRvY19yZWxfaGFzaC0+cmVsLT5yX3ZhZGRyKSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCSAgICAgIHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keCA9IDA7CisJICAgIH0KKwkgIHRvY19yZWxfaGFzaC0+cmVsLT5yX3N5bW5keCA9IHRvY19yZWxfaGFzaC0+aC0+dS50b2NfaW5keDsKKwl9CisKKyAgICAgIC8qIFhDT0ZGIHJlcXVpcmVzIHRoYXQgdGhlIHJlbG9jcyBiZSBzb3J0ZWQgYnkgYWRkcmVzcy4gIFdlIHRlbmQKKyAgICAgICAgIHRvIHByb2R1Y2UgdGhlbSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlaXIgY29udGFpbmluZyBjc2VjdHMKKyAgICAgICAgIGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgYnkKKyAgICAgICAgIGFkZHJlc3MuICBTbyB3ZSBzb3J0IHRoZW0gaGVyZS4gIFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8KKyAgICAgICAgIGRvIHRoaXMuICAqLworICAgICAgcXNvcnQgKChQVFIpIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcywKKwkgICAgIG8tPnJlbG9jX2NvdW50LCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyksCisJICAgICB4Y29mZl9zb3J0X3JlbG9jcyk7CisKKyAgICAgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7CisgICAgICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OworICAgICAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKKyAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQorCWJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKKworICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKKwkgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCisJCQlhYmZkKSAhPSByZWxzeiAqIG8tPnJlbG9jX2NvdW50KQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKKyAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7CisgICAgfQorCisgIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLworICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCisJeworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7CisJICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKKwkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOworCX0KKyAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7CisgICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOworICAgIH0KKworICAvKiBXcml0ZSBvdXQgdGhlIGxvYWRlciBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgQkZEX0FTU0VSVCAoKGJmZF9ieXRlICopIGZpbmZvLmxkcmVsCisJICAgICAgPT0gKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sb2FkZXJfc2VjdGlvbi0+Y29udGVudHMKKwkJICArIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZGhkci5sX2ltcG9mZikpOworICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uOworICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAorCQkJCSAgby0+Y29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCisJCQkJICBvLT5fcmF3X3NpemUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIC8qIFdyaXRlIG91dCB0aGUgbWFnaWMgc2VjdGlvbnMuICAqLworICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxpbmthZ2Vfc2VjdGlvbjsKKyAgaWYgKG8tPl9yYXdfc2l6ZSA+IDAKKyAgICAgICYmICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwgby0+Y29udGVudHMsCisJCQkJICAgICBvLT5vdXRwdXRfb2Zmc2V0LCBvLT5fcmF3X3NpemUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uOworICBpZiAoby0+X3Jhd19zaXplID4gMAorICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKKwkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisgIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVzY3JpcHRvcl9zZWN0aW9uOworICBpZiAoby0+X3Jhd19zaXplID4gMAorICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKKwkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCisgICAgZ290byBlcnJvcl9yZXR1cm47CisKKyAgLyogV3JpdGUgb3V0IHRoZSBzdHJpbmcgdGFibGUuICAqLworICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCShvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCisJCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzeiksCisJCVNFRUtfU0VUKSAhPSAwKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBiZmRfaF9wdXRfMzIgKGFiZmQsCisJCV9iZmRfc3RyaW5ndGFiX3NpemUgKGZpbmZvLnN0cnRhYikgKyBTVFJJTkdfU0laRV9TSVpFLAorCQkoYmZkX2J5dGUgKikgc3RyYnVmKTsKKyAgaWYgKGJmZF93cml0ZSAoc3RyYnVmLCAxLCBTVFJJTkdfU0laRV9TSVpFLCBhYmZkKSAhPSBTVFJJTkdfU0laRV9TSVpFKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgc3RyaW5nIHRhYmxlLiAgKi8KKyAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uOworICBpZiAobyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKKworICAgICAgZGVidWdfc3RydGFiID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3N0cnRhYjsKKyAgICAgIEJGRF9BU1NFUlQgKG8tPm91dHB1dF9zZWN0aW9uLT5fcmF3X3NpemUgLSBvLT5vdXRwdXRfb2Zmc2V0CisJCSAgPj0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZGVidWdfc3RydGFiKSk7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCisJCSAgICBvLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIG8tPm91dHB1dF9vZmZzZXQsCisJCSAgICBTRUVLX1NFVCkgIT0gMCkKKwlnb3RvIGVycm9yX3JldHVybjsKKyAgICAgIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGRlYnVnX3N0cnRhYikpCisJZ290byBlcnJvcl9yZXR1cm47CisgICAgfQorCisgIC8qIFNldHRpbmcgYmZkX2dldF9zeW1jb3VudCB0byAwIHdpbGwgY2F1c2Ugd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHRvCisgICAgIG5vdCB0cnkgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzLiAgKi8KKyAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOworCisgIHJldHVybiB0cnVlOworCisgZXJyb3JfcmV0dXJuOgorICBpZiAoZmluZm8uc3RydGFiICE9IE5VTEwpCisgICAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKKyAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQorCXsKKwkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzICE9IE5VTEwpCisJICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MpOworCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzICE9IE5VTEwpCisJICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxfaGFzaGVzKTsKKwl9CisgICAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm8pOworICAgIH0KKyAgaWYgKGZpbmZvLmludGVybmFsX3N5bXMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9zeW1zKTsKKyAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCisgICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOworICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOworICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQorICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOworICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5jb250ZW50cyk7CisgIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKKyAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOworICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCisgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBMaW5rIGFuIGlucHV0IGZpbGUgaW50byB0aGUgbGlua2VyIG91dHB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbgorICAgaGFuZGxlcyBhbGwgdGhlIHNlY3Rpb25zIGFuZCByZWxvY2F0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3hjb2ZmX2xpbmtfaW5wdXRfYmZkIChmaW5mbywgaW5wdXRfYmZkKQorICAgICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7Cit7CisgIGJmZCAqb3V0cHV0X2JmZDsKKyAgY29uc3QgY2hhciAqc3RyaW5nczsKKyAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKKyAgdW5zaWduZWQgaW50IG5fdG1hc2s7CisgIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKKyAgYm9vbGVhbiBjb3B5LCBoYXNoOworICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7CisgIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKKyAgYmZkX3NpemVfdHlwZSBsaW5lc3o7CisgIGJmZF9ieXRlICplc3ltOworICBiZmRfYnl0ZSAqZXN5bV9lbmQ7CisgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKKyAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXN5bXA7CisgIGFzZWN0aW9uICoqY3NlY3RwcDsKKyAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kZXg7CisgIGxvbmcgKmluZGV4cDsKKyAgdW5zaWduZWQgbG9uZyBvdXRwdXRfaW5kZXg7CisgIGJmZF9ieXRlICpvdXRzeW07CisgIHVuc2lnbmVkIGludCBpbmNsczsKKyAgYXNlY3Rpb24gKm9saW5lOworICBib29sZWFuIGtlZXBfc3ltczsKKyAgYXNlY3Rpb24gKm87CisKKyAgLyogV2UgY2FuIGp1c3Qgc2tpcCBEWU5BTUlDIGZpbGVzLCB1bmxlc3MgdGhpcyBpcyBhIHN0YXRpYyBsaW5rLiAgKi8KKyAgaWYgKChpbnB1dF9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAorICAgICAgJiYgISBmaW5mby0+aW5mby0+c3RhdGljX2xpbmspCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKworICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7CisgIHN0cmluZ3MgPSBOVUxMOworICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKKyAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKKyAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7CisgIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKKyAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOworCisgIG5fdG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fdG1hc2s7CisgIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0c2hmdDsKKworICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCisjZGVmaW5lIE5fVE1BU0sgbl90bWFzaworI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAorCisgIGNvcHkgPSBmYWxzZTsKKyAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQorICAgIGNvcHkgPSB0cnVlOworICBoYXNoID0gdHJ1ZTsKKyAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCisgICAgaGFzaCA9IGZhbHNlOworCisgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOworICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7CisgIHN5bV9oYXNoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7CisgIGNzZWN0cHAgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHM7CisgIGRlYnVnX2luZGV4ID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5kaWNlczsKKyAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKKyAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOworICBvdXRwdXRfaW5kZXggPSBzeW1lbnRfYmFzZTsKKyAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7CisgIGluY2xzID0gMDsKKyAgb2xpbmUgPSBOVUxMOworCisgIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOworICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKKyAgICAgIGludCBzbXR5cCA9IDA7CisgICAgICBib29sZWFuIHNraXA7CisgICAgICBib29sZWFuIHJlcXVpcmU7CisgICAgICBpbnQgYWRkOworCisgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wsIHdlIG5lZWQgdGhlIGNzZWN0CisgICAgICAgICBpbmZvcm1hdGlvbi4gICovCisgICAgICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKKwl7CisJICBCRkRfQVNTRVJUIChpc3ltcC0+bl9udW1hdXggPiAwKTsKKwkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsCisJCQkJKFBUUikgKGVzeW0gKyBpc3ltZXN6ICogaXN5bXAtPm5fbnVtYXV4KSwKKwkJCQlpc3ltcC0+bl90eXBlLCBpc3ltcC0+bl9zY2xhc3MsCisJCQkJaXN5bXAtPm5fbnVtYXV4IC0gMSwgaXN5bXAtPm5fbnVtYXV4LAorCQkJCShQVFIpICZhdXgpOworCSAgc210eXAgPSBTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCk7CisJfQorCisgICAgICAvKiBNYWtlIGEgY29weSBvZiAqaXN5bXAgc28gdGhhdCB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbgorCSBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgdmFsdWVzLiAgVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KKwkgYWx3YXlzIHJlY29tcHV0aW5nIHRoZSBzeW1ib2wgdmFsdWUgZXZlbiBpZiB3ZSBhcmUgc3RyaXBwaW5nCisJIHRoZSBzeW1ib2wuICAqLworICAgICAgaXN5bSA9ICppc3ltcDsKKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbiwgc3dhcCBvdXQgdGhlCisgICAgICAgICAubG9hZGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4gIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sCisgICAgICAgICByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHN5bWJvbCwgdGhvdWdoLCB0aGVuIHdhaXQgdW50aWwgd2UgZ2V0CisgICAgICAgICB0byB0aGUgZGVmaW5pdGlvbi4gICovCisgICAgICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAorCSAgJiYgKnN5bV9oYXNoICE9IE5VTEwKKwkgICYmICgqc3ltX2hhc2gpLT5sZHN5bSAhPSBOVUxMCisJICAmJiAoc210eXAgIT0gWFRZX0VSCisJICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkpCisJeworCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKwkgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07CisKKwkgIGggPSAqc3ltX2hhc2g7CisJICBsZHN5bSA9IGgtPmxkc3ltOworCSAgaWYgKGlzeW0ubl9zY251bSA+IDApCisJICAgIHsKKwkgICAgICBsZHN5bS0+bF9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisJICAgICAgbGRzeW0tPmxfdmFsdWUgPSAoaXN5bS5uX3ZhbHVlCisJCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0CisJCQkJLSAoKmNzZWN0cHApLT52bWEpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBsZHN5bS0+bF9zY251bSA9IGlzeW0ubl9zY251bTsKKwkgICAgICBsZHN5bS0+bF92YWx1ZSA9IGlzeW0ubl92YWx1ZTsKKwkgICAgfQorCisJICBsZHN5bS0+bF9zbXR5cGUgPSBzbXR5cDsKKwkgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKKwkgICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCisJICAgICAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQorCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7CisJICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCisJICAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQorCSAgICAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMCkKKwkgICAgbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOworCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQorCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9FTlRSWTsKKworCSAgbGRzeW0tPmxfc21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7CisKKwkgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKKwkgIGVsc2UgaWYgKGxkc3ltLT5sX2lmaWxlID09IDApCisJICAgIHsKKwkgICAgICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQorCQlsZHN5bS0+bF9pZmlsZSA9IDA7CisJICAgICAgZWxzZQorCQl7CisJCSAgYmZkICppbXBiZmQ7CisKKwkJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCQkgICAgaW1wYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKKwkJICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKKwkJCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKKwkJICAgIGltcGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOworCQkgIGVsc2UKKwkJICAgIGltcGJmZCA9IE5VTEw7CisKKwkJICBpZiAoaW1wYmZkID09IE5VTEwpCisJCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBCRkRfQVNTRVJUIChpbXBiZmQtPnh2ZWMgPT0gZmluZm8tPm91dHB1dF9iZmQtPnh2ZWMpOworCQkgICAgICBsZHN5bS0+bF9pZmlsZSA9IHhjb2ZmX2RhdGEgKGltcGJmZCktPmltcG9ydF9maWxlX2lkOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgbGRzeW0tPmxfcGFybSA9IDA7CisKKwkgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKKwkgIEJGRF9BU1NFUlQgKExEU1lNU1ogPT0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pKTsKKwkgIHhjb2ZmX3N3YXBfbGRzeW1fb3V0IChmaW5mby0+b3V0cHV0X2JmZCwgbGRzeW0sCisJCQkJZmluZm8tPmxkc3ltICsgaC0+bGRpbmR4IC0gMyk7CisJICBoLT5sZHN5bSA9IE5VTEw7CisKKwkgIC8qIEZpbGwgaW4gc25lbnRyeSBub3cgdGhhdCB3ZSBrbm93IHRoZSB0YXJnZXRfaW5kZXguICAqLworCSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwCisJICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwkgICAgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnNuZW50cnkgPQorCSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwl9CisKKyAgICAgICppbmRleHAgPSAtMTsKKworICAgICAgc2tpcCA9IGZhbHNlOworICAgICAgcmVxdWlyZSA9IGZhbHNlOworICAgICAgYWRkID0gMSArIGlzeW0ubl9udW1hdXg7CisKKyAgICAgIC8qIElmIHdlIGFyZSBza2lwcGluZyB0aGlzIGNzZWN0LCB3ZSB3YW50IHRvIHNraXAgdGhpcyBzeW1ib2wuICAqLworICAgICAgaWYgKCpjc2VjdHBwID09IE5VTEwpCisJc2tpcCA9IHRydWU7CisKKyAgICAgIC8qIElmIHdlIGdhcmJhZ2UgY29sbGVjdGVkIHRoaXMgY3NlY3QsIHdlIHdhbnQgdG8gc2tpcCB0aGlzCisgICAgICAgICBzeW1ib2wuICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5nYworCSAgJiYgKCgqY3NlY3RwcCktPmZsYWdzICYgU0VDX01BUkspID09IDAKKwkgICYmICpjc2VjdHBwICE9IGJmZF9hYnNfc2VjdGlvbl9wdHIpCisJc2tpcCA9IHRydWU7CisKKyAgICAgIC8qIEFuIFhDT0ZGIGxpbmtlciBhbHdheXMgc2tpcHMgQ19TVEFUIHN5bWJvbHMuICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfU1RBVCkKKwlza2lwID0gdHJ1ZTsKKworICAgICAgLyogV2Ugc2tpcCBhbGwgYnV0IHRoZSBmaXJzdCBUT0MgYW5jaG9yLiAgKi8KKyAgICAgIGlmICghIHNraXAKKwkgICYmIGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVAorCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKKwl7CisJICBpZiAoZmluZm8tPnRvY19zeW1pbmR4ICE9IC0xKQorCSAgICBza2lwID0gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJmZF92bWEgdG9jdmFsLCB0b2NlbmQ7CisKKwkgICAgICB0b2N2YWwgPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0CisJCQkrIGlzeW0ubl92YWx1ZQorCQkJLSAoKmNzZWN0cHApLT52bWEpOworCSAgICAgIC8qIFdlIHdhbnQgdG8gZmluZCBvdXQgaWYgdG9jdmFsIGlzIGEgZ29vZCB2YWx1ZSB0byB1c2UKKyAgICAgICAgICAgICAgICAgYXMgdGhlIFRPQyBhbmNob3ItLXRoYXQgaXMsIHdoZXRoZXIgd2UgY2FuIGFjY2VzcyBhbGwKKyAgICAgICAgICAgICAgICAgb2YgdGhlIFRPQyB1c2luZyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0b2N2YWwuICBUaGlzCisgICAgICAgICAgICAgICAgIHRlc3QgYXNzdW1lcyB0aGF0IHRoZSBUT0MgY29tZXMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgb3V0cHV0IHNlY3Rpb24sIGFzIGl0IGRvZXMgaW4gdGhlIGRlZmF1bHQgbGlua2VyCisgICAgICAgICAgICAgICAgIHNjcmlwdC4gIEZJWE1FOiBUaGlzIGRvZXNuJ3QgaGFuZGxlIC50b2Nic3Mgc2VjdGlvbnMKKyAgICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIFhNQ19URCBjb21tb24gc3ltYm9scyBjb3JyZWN0bHkuICAqLworCisJICAgICAgdG9jZW5kID0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJCSsgKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7CisKKwkgICAgICBpZiAodG9jdmFsICsgMHgxMDAwMCA8IHRvY2VuZCkKKwkJeworCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCQkgICAgKF8oIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIpLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSAodG9jZW5kIC0gdG9jdmFsKSk7CisJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdG9vX2JpZyk7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisKKwkgICAgICBpZiAodG9jdmFsICsgMHg4MDAwIDwgdG9jZW5kKQorCQl7CisJCSAgYmZkX3ZtYSB0b2NhZGQ7CisKKwkJICB0b2NhZGQgPSB0b2NlbmQgLSAodG9jdmFsICsgMHg4MDAwKTsKKwkJICB0b2N2YWwgKz0gdG9jYWRkOworCQkgIGlzeW0ubl92YWx1ZSArPSB0b2NhZGQ7CisJCX0KKworCSAgICAgIGZpbmZvLT50b2Nfc3ltaW5keCA9IG91dHB1dF9pbmRleDsKKwkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnRvYyA9IHRvY3ZhbDsKKwkgICAgICB4Y29mZl9kYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnNudG9jID0KKwkJKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkgICAgICByZXF1aXJlID0gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2Ugd2FudCB0byBza2lwIHRoaXMgb25lLiAgKi8KKyAgICAgIGlmICghIHNraXAKKwkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCisJc2tpcCA9IHRydWU7CisKKyAgICAgIC8qIFdlIGNhbiBza2lwIHJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAorCSAgJiYgc210eXAgPT0gWFRZX0VSCisJICAmJiAoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorCXNraXAgPSB0cnVlOworCisgICAgICAvKiBXZSBjYW4gc2tpcCBjb21tb24gc3ltYm9scyBpZiB0aGV5IGdvdCBkZWZpbmVkIHNvbWV3aGVyZQorICAgICAgICAgZWxzZS4gICovCisgICAgICBpZiAoISBza2lwCisJICAmJiBpc3ltLm5fc2NsYXNzID09IENfRVhUCisJICAmJiBzbXR5cCA9PSBYVFlfQ00KKwkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uCisJICAgICAgfHwgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPnNlY3Rpb24gIT0gKmNzZWN0cHApCisJICAmJiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uICE9ICpjc2VjdHBwKSkKKwlza2lwID0gdHJ1ZTsKKworICAgICAgLyogU2tpcCBsb2NhbCBzeW1ib2xzIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZW0uICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9hbGwKKwkgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FWFQKKwkgICYmIChpc3ltLm5fc2NsYXNzICE9IENfSElERVhUCisJICAgICAgfHwgc210eXAgIT0gWFRZX1NEKSkKKwlza2lwID0gdHJ1ZTsKKworICAgICAgLyogSWYgd2Ugc3RyaXBwaW5nIGRlYnVnZ2luZyBzeW1ib2xzLCBhbmQgdGhpcyBpcyBhIGRlYnVnZ2luZworICAgICAgICAgc3ltYm9sLCB0aGVuIHNraXAgaXQuICAqLworICAgICAgaWYgKCEgc2tpcAorCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2RlYnVnZ2VyCisJICAmJiBpc3ltLm5fc2NudW0gPT0gTl9ERUJVRykKKwlza2lwID0gdHJ1ZTsKKworICAgICAgLyogSWYgc29tZSBzeW1ib2xzIGFyZSBzdHJpcHBlZCBiYXNlZCBvbiB0aGUgbmFtZSwgd29yayBvdXQgdGhlCisJIG5hbWUgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHNraXAgdGhpcyBzeW1ib2wuICBXZSBkb24ndCBoYW5kbGUKKwkgdGhpcyBjb3JyZWN0bHkgZm9yIHN5bWJvbHMgd2hvc2UgbmFtZXMgYXJlIGluIHRoZSAuZGVidWcKKwkgc2VjdGlvbjsgdG8gZ2V0IGl0IHJpZ2h0IHdlIHdvdWxkIG5lZWQgYSBuZXcgYmZkX3N0cnRhYl9oYXNoCisJIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc3RyaW5nIGdpdmVuIHRoZSBpbmRleC4gICovCisgICAgICBpZiAoISBza2lwCisJICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKKwkgICAgICB8fCBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wpCisJICAmJiAoZGVidWdfaW5kZXggPT0gTlVMTCB8fCAqZGVidWdfaW5kZXggPT0gKHVuc2lnbmVkIGxvbmcpIC0xKSkKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKKworCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKKwkgIGlmIChuYW1lID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQorCSAgICAgICAmJiAoYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLCBuYW1lLCBmYWxzZSwKKwkJCQkgICAgZmFsc2UpID09IE5VTEwpKQorCSAgICAgIHx8IChmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2wKKwkJICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAorCQkgICAgICAmJiAoaXN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAorCQkJICB8fCBzbXR5cCAhPSBYVFlfU0QpKQorCQkgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKSkKKwkgICAgc2tpcCA9IHRydWU7CisJfQorCisgICAgICAvKiBXZSBjYW4gbm90IHNraXAgdGhlIGZpcnN0IFRPQyBhbmNob3IuICAqLworICAgICAgaWYgKHNraXAKKwkgICYmIHJlcXVpcmUKKwkgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCisJc2tpcCA9IGZhbHNlOworCisgICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCisgICAgICBpZiAoISBza2lwKQorCXsKKwkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCisKKwkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKKwkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYSBsb25nIG5hbWUuICBFbnRlciBpdCBpbiB0aGUgc3RyaW5nCisJCSB0YWJsZSB3ZSBhcmUgYnVpbGRpbmcuICBJZiAqZGVidWdfaW5kZXggIT0gLTEsIHRoZQorCQkgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWQgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KKwkgICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCAmJiAqZGVidWdfaW5kZXggIT0gKHVuc2lnbmVkIGxvbmcpIC0xKQorCQlpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gKmRlYnVnX2luZGV4OworCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbnN0IGNoYXIgKm5hbWU7CisJCSAgYmZkX3NpemVfdHlwZSBpbmR4OworCisJCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwKKwkJCQkJCQkgKGNoYXIgKikgTlVMTCk7CisJCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBuYW1lLCBoYXNoLCBjb3B5KTsKKwkJICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OworCQl9CisJICAgIH0KKworCSAgaWYgKGlzeW0ubl9zY2xhc3MgIT0gQ19CU1RBVAorCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19FU1RBVAorCSAgICAgICYmIGlzeW0ubl9zY2xhc3MgIT0gQ19ERUNMCisJICAgICAgJiYgaXN5bS5uX3NjbnVtID4gMCkKKwkgICAgeworCSAgICAgIGlzeW0ubl9zY251bSA9ICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisJICAgICAgaXN5bS5uX3ZhbHVlICs9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkgICAgICAgKyAoKmNzZWN0cHApLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgICAgLSAoKmNzZWN0cHApLT52bWEpOworCSAgICB9CisKKwkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfRklMRSBzeW1ib2wgaXMgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUKKwkgICAgIG5leHQgQ19GSUxFIHN5bWJvbC4gIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sCisJICAgICBpcyAtMS4gIFdlIHRyeSB0byBnZXQgdGhpcyByaWdodCwgYmVsb3csIGp1c3QgYmVmb3JlIHdlCisJICAgICB3cml0ZSB0aGUgc3ltYm9scyBvdXQsIGJ1dCBpbiB0aGUgZ2VuZXJhbCBjYXNlIHdlIG1heQorCSAgICAgaGF2ZSB0byB3cml0ZSB0aGUgc3ltYm9sIG91dCB0d2ljZS4gICovCisJICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCisJICAgIHsKKwkgICAgICBpZiAoZmluZm8tPmxhc3RfZmlsZV9pbmRleCAhPSAtMQorCQkgICYmIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSAhPSAobG9uZykgb3V0cHV0X2luZGV4KQorCQl7CisJCSAgLyogV2UgbXVzdCBjb3JyZWN0IHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgZW50cnkuICAqLworCQkgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKKwkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPj0gc3ltZW50X2Jhc2UpCisJCSAgICB7CisJCSAgICAgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgaW4gdGhpcyBpbnB1dCBmaWxlLiAgKi8KKwkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAorCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAorCQkJCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcworCQkJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4CisJCQkJCQkJLSBzeW1lbnRfYmFzZSkKKwkJCQkJCSAgICAgICAqIG9zeW1lc3opKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QgQ19GSUxFCisJCQkgc3ltYm9sLiAgV2UgbmVlZCB0byB3cml0ZSBpdCBvdXQgYWdhaW4uICBXZQorCQkJIGJvcnJvdyAqb3V0c3ltIHRlbXBvcmFyaWx5LiAgKi8KKwkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAorCQkJCQkgICAgIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAorCQkJCQkgICAgIChQVFIpIG91dHN5bSk7CisJCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKKwkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKKwkJCQkgICAgICsgZmluZm8tPmxhc3RfZmlsZV9pbmRleCAqIG9zeW1lc3opLAorCQkJCSAgICBTRUVLX1NFVCkgIT0gMAorCQkJICB8fCAoYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsIG91dHB1dF9iZmQpCisJCQkgICAgICAhPSBvc3ltZXN6KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA9IG91dHB1dF9pbmRleDsKKwkgICAgICBmaW5mby0+bGFzdF9maWxlID0gaXN5bTsKKwkgICAgfQorCisJICAvKiBUaGUgdmFsdWUgb2YgYSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9sIGlzIGEgZmlsZSBvZmZzZXQKKyAgICAgICAgICAgICBpbnRvIHRoZSBsaW5lIG51bWJlcnMuICBXZSB1cGRhdGUgdGhlIHN5bWJvbCB2YWx1ZXMgd2hlbgorICAgICAgICAgICAgIHdlIGhhbmRsZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KKwkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfQklOQ0wKKwkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfRUlOQ0wpCisJICAgIHsKKwkgICAgICBpc3ltLm5fdmFsdWUgPSBmaW5mby0+bGluZV9maWxlcG9zOworCSAgICAgICsraW5jbHM7CisJICAgIH0KKworCSAgLyogT3V0cHV0IHRoZSBzeW1ib2wuICAqLworCisJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOworCisJICAqaW5kZXhwID0gb3V0cHV0X2luZGV4OworCisJICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKKwkgICAgeworCSAgICAgIGxvbmcgaW5keDsKKwkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAgICAgaW5keCA9ICgoZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQorCQkgICAgICAvIGlzeW1lc3opOworCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpbmR4XTsKKwkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOworCSAgICAgIGgtPmluZHggPSBvdXRwdXRfaW5kZXg7CisJICAgIH0KKworCSAgLyogSWYgdGhpcyBpcyBhIHN5bWJvbCBpbiB0aGUgVE9DIHdoaWNoIHdlIG1heSBoYXZlIG1lcmdlZAorICAgICAgICAgICAgIChjbGFzcyBYTUNfVEMpLCByZW1lbWJlciB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZSBUT0MKKyAgICAgICAgICAgICBzeW1ib2wuICAqLworCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19ISURFWFQKKwkgICAgICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMKKwkgICAgICAmJiAqc3ltX2hhc2ggIT0gTlVMTCkKKwkgICAgeworCSAgICAgIEJGRF9BU1NFUlQgKCgoKnN5bV9oYXNoKS0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKKwkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+dG9jX3NlY3Rpb24gIT0gTlVMTCk7CisJICAgICAgKCpzeW1faGFzaCktPnUudG9jX2luZHggPSBvdXRwdXRfaW5kZXg7CisJICAgIH0KKworCSAgb3V0cHV0X2luZGV4ICs9IGFkZDsKKwkgIG91dHN5bSArPSBhZGQgKiBvc3ltZXN6OworCX0KKworICAgICAgZXN5bSArPSBhZGQgKiBpc3ltZXN6OworICAgICAgaXN5bXAgKz0gYWRkOworICAgICAgY3NlY3RwcCArPSBhZGQ7CisgICAgICBzeW1faGFzaCArPSBhZGQ7CisgICAgICBpZiAoZGVidWdfaW5kZXggIT0gTlVMTCkKKwlkZWJ1Z19pbmRleCArPSBhZGQ7CisgICAgICArK2luZGV4cDsKKyAgICAgIGZvciAoLS1hZGQ7IGFkZCA+IDA7IC0tYWRkKQorCSppbmRleHArKyA9IC0xOworICAgIH0KKworICAvKiBGaXggdXAgdGhlIGF1eCBlbnRyaWVzIGFuZCB0aGUgQ19CU1RBVCBzeW1ib2xzLiAgVGhpcyBtdXN0IGJlCisgICAgIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXNzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3Qgc3ltYm9sCisgICAgIGluZGljZXMgdW50aWwgd2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgd2hpY2ggc3ltYm9scyB3ZSBhcmUgZ29pbmcKKyAgICAgdG8ga2VlcC4gICovCisKKyAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOworICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7CisgIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7CisgIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKKyAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0czsKKyAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7CisgIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCisgICAgeworICAgICAgaW50IGFkZDsKKworICAgICAgYWRkID0gMSArIGlzeW1wLT5uX251bWF1eDsKKworICAgICAgaWYgKCppbmRleHAgPCAwKQorCWVzeW0gKz0gYWRkICogaXN5bWVzejsKKyAgICAgIGVsc2UKKwl7CisJICBpbnQgaTsKKworCSAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JTVEFUKQorCSAgICB7CisJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOworCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKKworCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIENfQlNUQVQgc3ltYm9sIGlzIHRoZSBzeW1ib2wgdGFibGUKKyAgICAgICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLworCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLCAoUFRSKSBvdXRzeW0sIChQVFIpICZpc3ltKTsKKwkgICAgICBpbmR4ID0gaXN5bS5uX3ZhbHVlOworCSAgICAgIGlmIChpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCisJCXsKKwkJICBsb25nIHN5bWluZHg7CisKKwkJICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOworCQkgIGlmIChzeW1pbmR4IDwgMCkKKwkJICAgIGlzeW0ubl92YWx1ZSA9IDA7CisJCSAgZWxzZQorCQkgICAgaXN5bS5uX3ZhbHVlID0gc3ltaW5keDsKKwkJICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLAorCQkJCQkgKFBUUikgb3V0c3ltKTsKKwkJfQorCSAgICB9CisKKwkgIGVzeW0gKz0gaXN5bWVzejsKKwkgIG91dHN5bSArPSBvc3ltZXN6OworCisJICBmb3IgKGkgPSAwOyBpIDwgaXN5bXAtPm5fbnVtYXV4ICYmIGVzeW0gPCBlc3ltX2VuZDsgaSsrKQorCSAgICB7CisJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKKworCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIGlzeW1wLT5uX3R5cGUsCisJCQkJICAgIGlzeW1wLT5uX3NjbGFzcywgaSwgaXN5bXAtPm5fbnVtYXV4LAorCQkJCSAgICAoUFRSKSAmYXV4KTsKKworCSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19GSUxFKQorCQl7CisJCSAgLyogVGhpcyBpcyB0aGUgZmlsZSBuYW1lIChvciBzb21lIGNvbW1lbnQgcHV0IGluIGJ5CisJCSAgICAgdGhlIGNvbXBpbGVyKS4gIElmIGl0IGlzIGxvbmcsIHdlIG11c3QgcHV0IGl0IGluCisJCSAgICAgdGhlIHN0cmluZyB0YWJsZS4gICovCisJCSAgaWYgKGF1eC54X2ZpbGUueF9uLnhfemVyb2VzID09IDAKKwkJICAgICAgJiYgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisJCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKKworCQkgICAgICBCRkRfQVNTRVJUIChhdXgueF9maWxlLnhfbi54X29mZnNldAorCQkJCSAgPj0gU1RSSU5HX1NJWkVfU0laRSk7CisJCSAgICAgIGlmIChzdHJpbmdzID09IE5VTEwpCisJCQl7CisJCQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGlucHV0X2JmZCk7CisJCQkgIGlmIChzdHJpbmdzID09IE5VTEwpCisJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJfQorCQkgICAgICBmaWxlbmFtZSA9IHN0cmluZ3MgKyBhdXgueF9maWxlLnhfbi54X29mZnNldDsKKwkJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgZmlsZW5hbWUsCisJCQkJCQkgaGFzaCwgY29weSk7CisJCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkJCXJldHVybiBmYWxzZTsKKwkJICAgICAgYXV4LnhfZmlsZS54X24ueF9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQKKwkJCXx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKKwkJICAgICAgICYmIGkgKyAxID09IGlzeW1wLT5uX251bWF1eCkKKwkJeworCQkgIC8qIFdlIGRvbid0IHN1cHBvcnQgdHlwZSBjaGVja2luZy4gIEkgZG9uJ3Qga25vdyBpZgorICAgICAgICAgICAgICAgICAgICAgYW55Ym9keSBkb2VzLiAgKi8KKwkJICBhdXgueF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKKwkJICAvKiBJIGRvbid0IHRoaW5rIGFueWJvZHkgdXNlcyB0aGVzZSBmaWVsZHMsIGJ1dCB3ZSdkCisgICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgY2xvYmJlciB0aGVtIGp1c3QgaW4gY2FzZS4gICovCisJCSAgYXV4LnhfY3NlY3QueF9zdGFiID0gMDsKKwkJICBhdXgueF9jc2VjdC54X3Nuc3RhYiA9IDA7CisJCSAgaWYgKFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKSA9PSBYVFlfTEQpCisJCSAgICB7CisJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5keDsKKworCQkgICAgICBpbmR4ID0gYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKKwkJICAgICAgaWYgKGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKKwkJCXsKKwkJCSAgbG9uZyBzeW1pbmR4OworCisJCQkgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07CisJCQkgIGlmIChzeW1pbmR4IDwgMCkKKwkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IDA7CisJCQkgIGVsc2UKKwkJCSAgICBhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChpc3ltcC0+bl9zY2xhc3MgIT0gQ19TVEFUIHx8IGlzeW1wLT5uX3R5cGUgIT0gVF9OVUxMKQorCQl7CisJCSAgdW5zaWduZWQgbG9uZyBpbmR4OworCisJCSAgaWYgKElTRkNOIChpc3ltcC0+bl90eXBlKQorCQkgICAgICB8fCBJU1RBRyAoaXN5bXAtPm5fc2NsYXNzKQorCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19CTE9DSworCQkgICAgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19GQ04pCisJCSAgICB7CisJCSAgICAgIGluZHggPSBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKKwkJICAgICAgaWYgKGluZHggPiAwCisJCQkgICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKKwkJCXsKKwkJCSAgLyogV2UgbG9vayBmb3J3YXJkIHRocm91Z2ggdGhlIHN5bWJvbCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHN5bWJvbCB3ZSBhcmUgZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5jbHVkZS4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZWx5IHJpZ2h0LiAgKi8KKwkJCSAgd2hpbGUgKGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XSA8IDAKKwkJCQkgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQorCQkJICAgICsraW5keDsKKwkJCSAgaWYgKGluZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCisJCQkgICAgaW5keCA9IG91dHB1dF9pbmRleDsKKwkJCSAgZWxzZQorCQkJICAgIGluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07CisJCQkgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gaW5keDsKKwkJCX0KKwkJICAgIH0KKworCQkgIGluZHggPSBhdXgueF9zeW0ueF90YWduZHgubDsKKwkJICBpZiAoaW5keCA+IDAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQorCQkgICAgeworCQkgICAgICBsb25nIHN5bWluZHg7CisKKwkJICAgICAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKKwkJICAgICAgaWYgKHN5bWluZHggPCAwKQorCQkJYXV4Lnhfc3ltLnhfdGFnbmR4LmwgPSAwOworCQkgICAgICBlbHNlCisJCQlhdXgueF9zeW0ueF90YWduZHgubCA9IHN5bWluZHg7CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIENvcHkgb3ZlciB0aGUgbGluZSBudW1iZXJzLCB1bmxlc3Mgd2UgYXJlIHN0cmlwcGluZworCQkgdGhlbS4gIFdlIGRvIHRoaXMgb24gYSBzeW1ib2wgYnkgc3ltYm9sIGJhc2lzIGluCisJCSBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KKwkgICAgICBpZiAoKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVAorCQkgICB8fCBpc3ltcC0+bl9zY2xhc3MgPT0gQ19ISURFWFQpCisJCSAgJiYgaSA9PSAwCisJCSAgJiYgaXN5bXAtPm5fbnVtYXV4ID4gMQorCQkgICYmIElTRkNOIChpc3ltcC0+bl90eXBlKQorCQkgICYmIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKKwkJeworCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfbm9uZQorCQkgICAgICAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfc29tZSkKKwkJICAgIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSAwOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKKwkJICAgICAgdW5zaWduZWQgaW50IGVuY19jb3VudDsKKwkJICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7CisJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOworCisJCSAgICAgIG8gPSAqY3NlY3RwcDsKKwkJICAgICAgZW5jbG9zaW5nID0geGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+ZW5jbG9zaW5nOworCQkgICAgICBlbmNfY291bnQgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5saW5lbm9fY291bnQ7CisJCSAgICAgIGlmIChvbGluZSAhPSBlbmNsb3NpbmcpCisJCQl7CisJCQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLAorCQkJCQllbmNsb3NpbmctPmxpbmVfZmlsZXBvcywKKwkJCQkJU0VFS19TRVQpICE9IDAKKwkJCSAgICAgIHx8IChiZmRfcmVhZCAoZmluZm8tPmxpbmVub3MsIGxpbmVzeiwKKwkJCQkJICAgIGVuY19jb3VudCwgaW5wdXRfYmZkKQorCQkJCSAgIT0gbGluZXN6ICogZW5jX2NvdW50KSkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisJCQkgIG9saW5lID0gZW5jbG9zaW5nOworCQkJfQorCisJCSAgICAgIGxpbm9mZiA9IChhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyCisJCQkJLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyk7CisKKwkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwKKwkJCQkJICAgICAgIChQVFIpIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiksCisJCQkJCSAgICAgICAoUFRSKSAmbGluKTsKKwkJICAgICAgaWYgKGxpbi5sX2xubm8gIT0gMAorCQkJICB8fCAoKGJmZF9zaXplX3R5cGUpIGxpbi5sX2FkZHIubF9zeW1uZHgKKwkJCSAgICAgICE9ICgoZXN5bQorCQkJCSAgIC0gaXN5bWVzegorCQkJCSAgIC0gKChiZmRfYnl0ZSAqKQorCQkJCSAgICAgIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpKQorCQkJCSAgLyBpc3ltZXN6KSkpCisJCQlhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gMDsKKwkJICAgICAgZWxzZQorCQkJeworCQkJICBiZmRfYnl0ZSAqbGlucGVuZCwgKmxpbnA7CisJCQkgIGJmZF92bWEgb2Zmc2V0OworCQkJICBiZmRfc2l6ZV90eXBlIGNvdW50OworCisJCQkgIGxpbi5sX2FkZHIubF9zeW1uZHggPSAqaW5kZXhwOworCQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKG91dHB1dF9iZmQsIChQVFIpICZsaW4sCisJCQkJCQkgICAgKFBUUikgKGZpbmZvLT5saW5lbm9zCisJCQkJCQkJICAgKyBsaW5vZmYpKTsKKworCQkJICBsaW5wZW5kID0gKGZpbmZvLT5saW5lbm9zCisJCQkJICAgICArIGVuY19jb3VudCAqIGxpbmVzeik7CisJCQkgIG9mZnNldCA9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCQkJICAgICsgby0+b3V0cHV0X29mZnNldAorCQkJCSAgICAtIG8tPnZtYSk7CisJCQkgIGZvciAobGlucCA9IGZpbmZvLT5saW5lbm9zICsgbGlub2ZmICsgbGluZXN6OworCQkJICAgICAgIGxpbnAgPCBsaW5wZW5kOworCQkJICAgICAgIGxpbnAgKz0gbGluZXN6KQorCQkJICAgIHsKKwkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChpbnB1dF9iZmQsIChQVFIpIGxpbnAsCisJCQkJCQkgICAgICAgKFBUUikgJmxpbik7CisJCQkgICAgICBpZiAobGluLmxfbG5ubyA9PSAwKQorCQkJCWJyZWFrOworCQkJICAgICAgbGluLmxfYWRkci5sX3BhZGRyICs9IG9mZnNldDsKKwkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwKKwkJCQkJCQkoUFRSKSAmbGluLAorCQkJCQkJCShQVFIpIGxpbnApOworCQkJICAgIH0KKworCQkJICBjb3VudCA9IChsaW5wIC0gKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmKSkgLyBsaW5lc3o7CisKKwkJCSAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9CisJCQkgICAgKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKKwkJCSAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKKworCQkJICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCisJCQkJCWF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsCisJCQkJCVNFRUtfU0VUKSAhPSAwCisJCQkgICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+bGluZW5vcyArIGxpbm9mZiwKKwkJCQkJICAgICBsaW5lc3osIGNvdW50LCBvdXRwdXRfYmZkKQorCQkJCSAgIT0gbGluZXN6ICogY291bnQpKQorCQkJICAgIHJldHVybiBmYWxzZTsKKworCQkJICBvLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50ICs9IGNvdW50OworCisJCQkgIGlmIChpbmNscyA+IDApCisJCQkgICAgeworCQkJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaWlzcCwgKmlpc3BlbmQ7CisJCQkgICAgICBsb25nICppaW5kcDsKKwkJCSAgICAgIGJmZF9ieXRlICpvb3M7CisJCQkgICAgICBpbnQgaWlhZGQ7CisKKwkJCSAgICAgIC8qIFVwZGF0ZSBhbnkgQ19CSU5DTCBvciBDX0VJTkNMIHN5bWJvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVmZXIgdG8gYSBsaW5lIG51bWJlciBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlIHdlIGp1c3Qgb3V0cHV0LiAgKi8KKwkJCSAgICAgIGlpc3AgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKKwkJCSAgICAgIGlpc3BlbmQgPSAoaWlzcAorCQkJCQkgKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSk7CisJCQkgICAgICBpaW5kcCA9IGZpbmZvLT5zeW1faW5kaWNlczsKKwkJCSAgICAgIG9vcyA9IGZpbmZvLT5vdXRzeW1zOworCQkJICAgICAgd2hpbGUgKGlpc3AgPCBpaXNwZW5kKQorCQkJCXsKKwkJCQkgIGlmICgqaWluZHAgPj0gMAorCQkJCSAgICAgICYmIChpaXNwLT5uX3NjbGFzcyA9PSBDX0JJTkNMCisJCQkJCSAgfHwgaWlzcC0+bl9zY2xhc3MgPT0gQ19FSU5DTCkKKwkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKKwkJCQkJICA+PSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcyArIGxpbm9mZikKKwkJCQkgICAgICAmJiAoKGJmZF9zaXplX3R5cGUpIGlpc3AtPm5fdmFsdWUKKwkJCQkJICA8IChlbmNsb3NpbmctPmxpbmVfZmlsZXBvcworCQkJCQkgICAgICsgZW5jX2NvdW50ICogbGluZXN6KSkpCisJCQkJICAgIHsKKwkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlpczsKKworCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvdXRwdXRfYmZkLAorCQkJCQkJCSAgICAoUFRSKSBvb3MsCisJCQkJCQkJICAgIChQVFIpICZpaXMpOworCQkJCSAgICAgIGlpcy5uX3ZhbHVlID0KKwkJCQkJKGlpc3AtPm5fdmFsdWUKKwkJCQkJIC0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MKKwkJCQkJIC0gbGlub2ZmCisJCQkJCSArIGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpOworCQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKKwkJCQkJCQkgICAgIChQVFIpICZpaXMsCisJCQkJCQkJICAgICAoUFRSKSBvb3MpOworCQkJCSAgICAgIC0taW5jbHM7CisJCQkJICAgIH0KKworCQkJCSAgaWlhZGQgPSAxICsgaWlzcC0+bl9udW1hdXg7CisJCQkJICBpZiAoKmlpbmRwID49IDApCisJCQkJICAgIG9vcyArPSBpaWFkZCAqIG9zeW1lc3o7CisJCQkJICBpaXNwICs9IGlpYWRkOworCQkJCSAgaWluZHAgKz0gaWlhZGQ7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJfQorCisJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBpc3ltcC0+bl90eXBlLAorCQkJCSAgICAgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCisJCQkJICAgICAoUFRSKSBvdXRzeW0pOworCSAgICAgIG91dHN5bSArPSBvc3ltZXN6OworCSAgICAgIGVzeW0gKz0gaXN5bWVzejsKKwkgICAgfQorCX0KKworICAgICAgaW5kZXhwICs9IGFkZDsKKyAgICAgIGlzeW1wICs9IGFkZDsKKyAgICAgIGNzZWN0cHAgKz0gYWRkOworICAgIH0KKworICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCisgICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQorICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAorICAgICBhZ2Fpbi4gICovCisgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCisgICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKKyAgICB7CisgICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7CisgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAorCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKKyAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCisgCQkJCSAgICAgICAqIG9zeW1lc3opKSk7CisgICAgfQorCisgIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisgIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCisJCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAorCQkgICAgU0VFS19TRVQpICE9IDAKKwkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKKwkJCW91dHB1dF9iZmQpCisJICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQorCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQorCQkgID09IG91dHB1dF9pbmRleCk7CisKKyAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKKyAgICB9CisKKyAgLyogRG9uJ3QgbGV0IHRoZSBsaW5rZXIgcmVsb2NhdGlvbiByb3V0aW5lcyBkaXNjYXJkIHRoZSBzeW1ib2xzLiAgKi8KKyAga2VlcF9zeW1zID0gb2JqX2NvZmZfa2VlcF9zeW1zIChpbnB1dF9iZmQpOworICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSB0cnVlOworCisgIC8qIFJlbG9jYXRlIHRoZSBjb250ZW50cyBvZiBlYWNoIHNlY3Rpb24uICAqLworICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQorICAgIHsKKyAgICAgIGJmZF9ieXRlICpjb250ZW50czsKKworICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCisJeworCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAorCSAgfHwgby0+X3Jhd19zaXplID09IDAKKwkgIHx8IChvLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCisJY29udGludWU7CisKKyAgICAgIC8qIFdlIGhhdmUgc2V0IGZpbGVwb3MgY29ycmVjdGx5IGZvciB0aGUgc2VjdGlvbnMgd2UgY3JlYXRlZCB0bworICAgICAgICAgcmVwcmVzZW50IGNzZWN0cywgc28gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIHNob3VsZCB3b3JrLiAgKi8KKyAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKSAhPSBOVUxMCisJICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKKwljb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pLT5jb250ZW50czsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgbywgZmluZm8tPmNvbnRlbnRzLAorCQkJCQkgIChmaWxlX3B0cikgMCwgby0+X3Jhd19zaXplKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgY29udGVudHMgPSBmaW5mby0+Y29udGVudHM7CisJfQorCisgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQorCXsKKwkgIGludCB0YXJnZXRfaW5kZXg7CisJICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybmFsX3JlbG9jczsKKwkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKKwkgIGJmZF92bWEgb2Zmc2V0OworCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOworCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOworCSAgbG9uZyByX3N5bW5keDsKKworCSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLiAgKi8KKwkgIHRhcmdldF9pbmRleCA9IG8tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisJICBpbnRlcm5hbF9yZWxvY3MgPSAoeGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKKwkJCSAgICAgKGlucHV0X2JmZCwgbywgZmFsc2UsIGZpbmZvLT5leHRlcm5hbF9yZWxvY3MsCisJCQkgICAgICB0cnVlLAorCQkJICAgICAgKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKKwkJCSAgICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkpKTsKKwkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCisgICAgICAgICAgICAgY29udGVudHMuICAqLworCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCisJCQkJCSAgIGlucHV0X2JmZCwgbywKKwkJCQkJICAgY29udGVudHMsCisJCQkJCSAgIGludGVybmFsX3JlbG9jcywKKwkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCisJCQkJCSAgIHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0cykpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgb2Zmc2V0ID0gby0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIG8tPm91dHB1dF9vZmZzZXQgLSBvLT52bWE7CisJICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOworCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKKwkgIHJlbF9oYXNoID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCisJCSAgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKwkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQorCSAgICB7CisJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7CisJICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOworCSAgICAgIGJvb2xlYW4gcXVpZXQ7CisKKwkgICAgICAqcmVsX2hhc2ggPSBOVUxMOworCisJICAgICAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLworCisJICAgICAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7CisKKwkgICAgICByX3N5bW5keCA9IGlyZWwtPnJfc3ltbmR4OworCisJICAgICAgaWYgKHJfc3ltbmR4ID09IC0xKQorCQloID0gTlVMTDsKKwkgICAgICBlbHNlCisJCWggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX3N5bW5keF07CisKKwkgICAgICBpZiAocl9zeW1uZHggIT0gLTEgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKKwkJeworCQkgIGlmIChoICE9IE5VTEwKKwkJICAgICAgJiYgaC0+c21jbGFzICE9IFhNQ19URAorCQkgICAgICAmJiAoaXJlbC0+cl90eXBlID09IFJfVE9DCisJCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX0dMCisJCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RDTAorCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UUkwKKwkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVFJMQSkpCisJCSAgICB7CisJCSAgICAgIC8qIFRoaXMgaXMgYSBUT0MgcmVsYXRpdmUgcmVsb2Mgd2l0aCBhIHN5bWJvbAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgdGhlIG9uZSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmVsb2MgaXMgZm9yLiAgV2Ugd2FudCB0byBtYWtlIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWxvYyBhZ2FpbnN0IHRoZSBUT0MgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0aGUgc3ltYm9sIGl0c2VsZi4gICovCisJCSAgICAgIEJGRF9BU1NFUlQgKGgtPnRvY19zZWN0aW9uICE9IE5VTEwpOworCQkgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKKwkJICAgICAgaWYgKGgtPnUudG9jX2luZHggIT0gLTEpCisJCQlpcmVsLT5yX3N5bW5keCA9IGgtPnUudG9jX2luZHg7CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCAqbjsKKwkJCSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzaTsKKworCQkJICBuID0gKChzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICopCisJCQkgICAgICAgYmZkX2FsbG9jIChmaW5mby0+b3V0cHV0X2JmZCwKKwkJCQkJICBzaXplb2YgKHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2gpKSk7CisJCQkgIGlmIChuID09IE5VTEwpCisJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJICBzaSA9IGZpbmZvLT5zZWN0aW9uX2luZm8gKyB0YXJnZXRfaW5kZXg7CisJCQkgIG4tPm5leHQgPSBzaS0+dG9jX3JlbF9oYXNoZXM7CisJCQkgIG4tPmggPSBoOworCQkJICBuLT5yZWwgPSBpcmVsOworCQkJICBzaS0+dG9jX3JlbF9oYXNoZXMgPSBuOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBzeW1ib2wuICAqLworCQkgICAgICBpZiAoaC0+aW5keCA+PSAwKQorCQkJaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGJlaW5nIHdyaXR0ZW4gYXQgdGhlIGVuZAorCQkJICAgICBvZiB0aGUgZmlsZSwgYW5kIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUKKwkJCSAgICAgc3ltYm9sIGluZGV4LiAgV2Ugc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUKKwkJCSAgICAgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgcmVsX2hhc2ggbGlzdC4KKwkJCSAgICAgV2Ugc2V0IHRoZSBpbmR4IGZpZWxkIHRvIC0yIHRvIGluZGljYXRlCisJCQkgICAgIHRoYXQgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgc3RyaXBwZWQuICAqLworCQkJICAqcmVsX2hhc2ggPSBoOworCQkJICBoLT5pbmR4ID0gLTI7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsb25nIGluZHg7CisKKwkJICAgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tyX3N5bW5keF07CisKKwkJICAgICAgaWYgKGluZHggPT0gLTEpCisJCQl7CisJCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOworCisJCQkgIC8qIFJlbG9jYXRpb25zIGFnYWluc3QgYSBUQzAgVE9DIGFuY2hvciBhcmUKKwkJCSAgICAgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBiZSBhZ2FpbnN0CisJCQkgICAgIHRoZSBUT0MgYW5jaG9yIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisJCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKKwkJCSAgaWYgKGlzLT5uX3NjbGFzcyA9PSBDX0hJREVYVAorCQkJICAgICAgJiYgaXMtPm5fbnVtYXV4ID4gMCkKKwkJCSAgICB7CisJCQkgICAgICBQVFIgYXV4cHRyOworCQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKKworCQkJICAgICAgYXV4cHRyID0gKChQVFIpCisJCQkJCSgoKGJmZF9ieXRlICopCisJCQkJCSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKKwkJCQkJICsgKChyX3N5bW5keCArIGlzLT5uX251bWF1eCkKKwkJCQkJICAgICogaXN5bWVzeikpKTsKKwkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIGF1eHB0ciwKKwkJCQkJCSAgICBpcy0+bl90eXBlLCBpcy0+bl9zY2xhc3MsCisJCQkJCQkgICAgaXMtPm5fbnVtYXV4IC0gMSwKKwkJCQkJCSAgICBpcy0+bl9udW1hdXgsCisJCQkJCQkgICAgKFBUUikgJmF1eCk7CisJCQkgICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApID09IFhUWV9TRAorCQkJCSAgJiYgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDMCkKKwkJCQlpbmR4ID0gZmluZm8tPnRvY19zeW1pbmR4OworCQkJICAgIH0KKwkJCX0KKworCQkgICAgICBpZiAoaW5keCAhPSAtMSkKKwkJCWlyZWwtPnJfc3ltbmR4ID0gaW5keDsKKwkJICAgICAgZWxzZQorCQkJeworCQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppczsKKwkJCSAgY29uc3QgY2hhciAqbmFtZTsKKwkJCSAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKKworCQkJICAvKiBUaGlzIHJlbG9jIGlzIGFnYWluc3QgYSBzeW1ib2wgd2UgYXJlCisJCQkgICAgIHN0cmlwcGluZy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGhhbmRsZQorCQkJICAgICB0aGlzIGNhc2UsIGJ1dCBJIGRvbid0IHRoaW5rIGl0J3Mgd29ydGggaXQuICAqLworCQkJICBpcyA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7CisKKwkJCSAgbmFtZSA9IChfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKKwkJCQkgIChpbnB1dF9iZmQsIGlzLCBidWYpKTsKKwkJCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkJCSAgICByZXR1cm4gZmFsc2U7CisKKwkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKKwkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG8sCisJCQkJICBpcmVsLT5yX3ZhZGRyKSkpCisJCQkgICAgcmV0dXJuIGZhbHNlOworCQkJfQorCQkgICAgfQorCQl9CisKKwkgICAgICBxdWlldCA9IGZhbHNlOworCSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQorCQl7CisJCWRlZmF1bHQ6CisJCSAgaWYgKGggPT0gTlVMTAorCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKKwkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorCQkgICAgYnJlYWs7CisJCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkJY2FzZSBSX1BPUzoKKwkJY2FzZSBSX05FRzoKKwkJY2FzZSBSX1JMOgorCQljYXNlIFJfUkxBOgorCQkgIC8qIFRoaXMgcmVsb2MgbmVlZHMgdG8gYmUgY29waWVkIGludG8gdGhlIC5sb2FkZXIKKwkJICAgICBzZWN0aW9uLiAgKi8KKwkJICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKKwkJICBpZiAocl9zeW1uZHggPT0gLTEpCisJCSAgICBsZHJlbC5sX3N5bW5keCA9IC0xOworCQkgIGVsc2UgaWYgKGggPT0gTlVMTAorCQkJICAgfHwgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisJCQkgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKKwkJICAgIHsKKwkJICAgICAgYXNlY3Rpb24gKnNlYzsKKworCQkgICAgICBpZiAoaCA9PSBOVUxMKQorCQkJc2VjID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzW3Jfc3ltbmR4XTsKKwkJICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQorCQkJc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKwkJICAgICAgZWxzZQorCQkJc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCQkgICAgICBzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOworCisJCSAgICAgIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKKwkJCWxkcmVsLmxfc3ltbmR4ID0gMDsKKwkJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuZGF0YSIpID09IDApCisJCQlsZHJlbC5sX3N5bW5keCA9IDE7CisJCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmJzcyIpID09IDApCisJCQlsZHJlbC5sX3N5bW5keCA9IDI7CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAorCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAorCQkJICAgICBzZWMtPm5hbWUpOworCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKKwkJCSAgcmV0dXJuIGZhbHNlOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQorCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgPT0gMAorCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpID09IDApCisJCQl7CisJCQkgIC8qIFdlIGFscmVhZHkgY2FsbGVkIHRoZSB1bmRlZmluZWRfc3ltYm9sCisJCQkgICAgIGNhbGxiYWNrIGZvciB0aGlzIHJlbG9jYXRpb24sIGluCisJCQkgICAgIF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24uICBEb24ndAorCQkJICAgICBpc3N1ZSBhbnkgbW9yZSB3YXJuaW5ncy4gICovCisJCQkgIHF1aWV0ID0gdHJ1ZTsKKwkJCX0KKwkJICAgICAgaWYgKGgtPmxkaW5keCA8IDAgJiYgISBxdWlldCkKKwkJCXsKKwkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCQkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKKwkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7CisJCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkJICByZXR1cm4gZmFsc2U7CisJCQl9CisJCSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OworCQkgICAgfQorCQkgIGxkcmVsLmxfcnR5cGUgPSAoaXJlbC0+cl9zaXplIDw8IDgpIHwgaXJlbC0+cl90eXBlOworCQkgIGxkcmVsLmxfcnNlY25tID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKwkJICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT50ZXh0cm8KKwkJICAgICAgJiYgc3RyY21wIChvLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMAorCQkgICAgICAmJiAhIHF1aWV0KQorCQkgICAgeworCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkJCShfKCIlczogbG9hZGVyIHJlbG9jIGluIHJlYWQtb25seSBzZWN0aW9uICVzIiksCisJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKKwkJCSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmluZm8tPm91dHB1dF9iZmQsCisJCQkJCSAgICAgICBvLT5vdXRwdXRfc2VjdGlvbikpOworCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOworCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCSAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwKKwkJCQkJZmluZm8tPmxkcmVsKTsKKwkJICBCRkRfQVNTRVJUIChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHJlbCkgPT0gTERSRUxTWik7CisJCSAgKytmaW5mby0+bGRyZWw7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBSX1RPQzoKKwkJY2FzZSBSX0dMOgorCQljYXNlIFJfVENMOgorCQljYXNlIFJfVFJMOgorCQljYXNlIFJfVFJMQToKKwkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCisJCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OworCX0KKworICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgby0+b3V0cHV0X3NlY3Rpb24sCisJCQkJICAgICAgY29udGVudHMsIG8tPm91dHB1dF9vZmZzZXQsCisJCQkJICAgICAgKG8tPl9jb29rZWRfc2l6ZSAhPSAwCisJCQkJICAgICAgID8gby0+X2Nvb2tlZF9zaXplCisJCQkJICAgICAgIDogby0+X3Jhd19zaXplKSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCkgPSBrZWVwX3N5bXM7CisKKyAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQorICAgIHsKKyAgICAgIGlmICghIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworI3VuZGVmIE5fVE1BU0sKKyN1bmRlZiBOX0JUU0hGVAorCisvKiBXcml0ZSBvdXQgYSBub24tWENPRkYgZ2xvYmFsIHN5bWJvbC4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sIChoLCBwKQorICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSAoc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBwOworICBiZmQgKm91dHB1dF9iZmQ7CisgIGJmZF9ieXRlICpvdXRzeW07CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKKworICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7CisgIG91dHN5bSA9IGZpbmZvLT5vdXRzeW1zOworCisgIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBnYXJiYWdlIGNvbGxlY3RlZCwganVzdCBza2lwIGl0LiAgKi8KKyAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+Z2MKKyAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogSWYgd2UgbmVlZCBhIC5sb2FkZXIgc2VjdGlvbiBlbnRyeSwgd3JpdGUgaXQgb3V0LiAgKi8KKyAgaWYgKGgtPmxkc3ltICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKKyAgICAgIGJmZCAqaW1wYmZkOworCisgICAgICBsZHN5bSA9IGgtPmxkc3ltOworCisgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCisJeworCSAgbGRzeW0tPmxfdmFsdWUgPSAwOworCSAgbGRzeW0tPmxfc2NudW0gPSBOX1VOREVGOworCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX0VSOworCSAgaW1wYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7CisJfQorICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorCXsKKwkgIGFzZWN0aW9uICpzZWM7CisKKwkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKwkgIGxkc3ltLT5sX3ZhbHVlID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCQkgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKKwkgIGxkc3ltLT5sX3NjbnVtID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworCSAgbGRzeW0tPmxfc210eXBlID0gWFRZX1NEOworCSAgaW1wYmZkID0gc2VjLT5vd25lcjsKKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisKKyAgICAgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKKwkgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKKwkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKKwlsZHN5bS0+bF9zbXR5cGUgfD0gTF9JTVBPUlQ7CisgICAgICBpZiAoKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9SRUdVTEFSKSAhPSAwCisJICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCisJICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDApCisJbGRzeW0tPmxfc210eXBlIHw9IExfRVhQT1JUOworICAgICAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSAhPSAwKQorCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0VOVFJZOworCisgICAgICBsZHN5bS0+bF9zbWNsYXMgPSBoLT5zbWNsYXM7CisKKyAgICAgIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCisJbGRzeW0tPmxfaWZpbGUgPSAwOworICAgICAgZWxzZSBpZiAobGRzeW0tPmxfaWZpbGUgPT0gMCkKKwl7CisJICBpZiAoKGxkc3ltLT5sX3NtdHlwZSAmIExfSU1QT1JUKSA9PSAwKQorCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7CisJICBlbHNlIGlmIChpbXBiZmQgPT0gTlVMTCkKKwkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOworCSAgZWxzZQorCSAgICB7CisJICAgICAgQkZEX0FTU0VSVCAoaW1wYmZkLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpOworCSAgICAgIGxkc3ltLT5sX2lmaWxlID0geGNvZmZfZGF0YSAoaW1wYmZkKS0+aW1wb3J0X2ZpbGVfaWQ7CisJICAgIH0KKwl9CisKKyAgICAgIGxkc3ltLT5sX3Bhcm0gPSAwOworCisgICAgICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7CisgICAgICBCRkRfQVNTRVJUIChMRFNZTVNaID09IHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSk7CisgICAgICB4Y29mZl9zd2FwX2xkc3ltX291dCAob3V0cHV0X2JmZCwgbGRzeW0sIGZpbmZvLT5sZHN5bSArIGgtPmxkaW5keCAtIDMpOworICAgICAgaC0+bGRzeW0gPSBOVUxMOworICAgIH0KKworICAvKiBJZiB0aGlzIHN5bWJvbCBuZWVkcyBnbG9iYWwgbGlua2FnZSBjb2RlLCB3cml0ZSBpdCBvdXQuICAqLworICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgorCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5saW5rYWdlX3NlY3Rpb24pKQorICAgIHsKKyAgICAgIGJmZF9ieXRlICpwOworICAgICAgYmZkX3ZtYSB0b2NvZmY7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgcCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+Y29udGVudHMgKyBoLT5yb290LnUuZGVmLnZhbHVlOworCisgICAgICAvKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGdsb2JhbCBsaW5rYWdlIGNvZGUgbG9hZHMgYQorICAgICAgICAgc3BlY2lmaWMgVE9DIGVsZW1lbnQuICAqLworICAgICAgdG9jb2ZmID0gKGgtPmRlc2NyaXB0b3ItPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSsgaC0+ZGVzY3JpcHRvci0+dG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKKwkJLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKTsKKyAgICAgIGlmICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSAhPSAwKQorCXRvY29mZiArPSBoLT5kZXNjcmlwdG9yLT51LnRvY19vZmZzZXQ7CisgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBYQ09GRl9HTElOS19GSVJTVCB8ICh0b2NvZmYgJiAweGZmZmYpLCBwKTsKKyAgICAgIGZvciAoaSA9IDAsIHAgKz0gNDsKKwkgICBpIDwgc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGUgLyBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZVswXTsKKwkgICBpKyssIHAgKz0gNCkKKwliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB4Y29mZl9nbGlua19jb2RlW2ldLCBwKTsKKyAgICB9CisKKyAgLyogSWYgd2UgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHdyaXRlIG91dCB0aGUgcmVxdWlyZWQKKyAgICAgcmVsb2NzLiAgKi8KKyAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpICE9IDApCisgICAgeworICAgICAgYXNlY3Rpb24gKnRvY3NlYzsKKyAgICAgIGFzZWN0aW9uICpvc2VjOworICAgICAgaW50IG9pbmR4OworICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOworICAgICAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpcnN5bTsKKyAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBpcmF1eDsKKworICAgICAgdG9jc2VjID0gaC0+dG9jX3NlY3Rpb247CisgICAgICBvc2VjID0gdG9jc2VjLT5vdXRwdXRfc2VjdGlvbjsKKyAgICAgIG9pbmR4ID0gb3NlYy0+dGFyZ2V0X2luZGV4OworICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OworICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKKwkJICAgICAgICsgdG9jc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICArIGgtPnUudG9jX29mZnNldCk7CisgICAgICBpZiAoaC0+aW5keCA+PSAwKQorCWlyZWwtPnJfc3ltbmR4ID0gaC0+aW5keDsKKyAgICAgIGVsc2UKKwl7CisJICBoLT5pbmR4ID0gLTI7CisJICBpcmVsLT5yX3N5bW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKKwl9CisgICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKKyAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOworICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOworICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKKworICAgICAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOworICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7CisgICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKKyAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKKyAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7CisgICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOworICAgICAgKytmaW5mby0+bGRyZWw7CisKKyAgICAgIC8qIFdlIG5lZWQgdG8gZW1pdCBhIHN5bWJvbCB0byBkZWZpbmUgYSBjc2VjdCB3aGljaCBob2xkcyB0aGUKKyAgICAgICAgIHJlbG9jLiAgKi8KKyAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQorCXsKKwkgIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQorCSAgICBzdHJuY3B5IChpcnN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBib29sZWFuIGhhc2g7CisJICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OworCisJICAgICAgaGFzaCA9IHRydWU7CisJICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCisJCWhhc2ggPSBmYWxzZTsKKwkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLAorCQkJCQkgaGFzaCwgZmFsc2UpOworCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGlyc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKKwkgICAgICBpcnN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OworCSAgICB9CisKKwkgIGlyc3ltLm5fdmFsdWUgPSBpcmVsLT5yX3ZhZGRyOworCSAgaXJzeW0ubl9zY251bSA9IG9zZWMtPnRhcmdldF9pbmRleDsKKwkgIGlyc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7CisJICBpcnN5bS5uX3R5cGUgPSBUX05VTEw7CisJICBpcnN5bS5uX251bWF1eCA9IDE7CisKKwkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyc3ltLCAoUFRSKSBvdXRzeW0pOworCSAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7CisKKwkgIG1lbXNldCAoJmlyYXV4LCAwLCBzaXplb2YgaXJhdXgpOworCSAgaXJhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOworCSAgaXJhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gNDsKKwkgIGlyYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfVEM7CisKKwkgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlyYXV4LCBUX05VTEwsIENfSElERVhULAorCQkJCSAwLCAxLCAoUFRSKSBvdXRzeW0pOworCSAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7CisKKwkgIGlmIChoLT5pbmR4ID49IDApCisJICAgIHsKKwkgICAgICAvKiBXZSBhcmVuJ3QgZ29pbmcgdG8gd3JpdGUgb3V0IHRoZSBzeW1ib2xzIGJlbG93LCBzbyB3ZQorCQkgbmVlZCB0byB3cml0ZSB0aGVtIG91dCBub3cuICAqLworCSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKKwkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQorCQkJICAgICArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKKwkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCkpKSwKKwkJCSAgICBTRUVLX1NFVCkgIT0gMAorCQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKKwkJCQkgb3V0cHV0X2JmZCkKKwkJICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9CisJCShvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOworCisJICAgICAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgc3BlY2lhbGx5IGRlZmluZWQgZnVuY3Rpb24gZGVzY3JpcHRvciwgd3JpdGUKKyAgICAgaXQgb3V0LiAgVGhlIGZpcnN0IHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvZGUKKyAgICAgaXRzZWxmLCB0aGUgc2Vjb25kIHdvcmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFRPQywgYW5kIHRoZSB0aGlyZAorICAgICB3b3JkIGlzIHplcm8uICAqLworICBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVTQ1JJUFRPUikgIT0gMAorICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbgorCSAgPT0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24pKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisgICAgICBhc2VjdGlvbiAqb3NlYzsKKyAgICAgIGludCBvaW5keDsKKyAgICAgIGJmZF9ieXRlICpwOworICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGVudHJ5OworICAgICAgYXNlY3Rpb24gKmVzZWM7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7CisgICAgICBhc2VjdGlvbiAqdHNlYzsKKworICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworICAgICAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisgICAgICBvaW5keCA9IG9zZWMtPnRhcmdldF9pbmRleDsKKyAgICAgIHAgPSBzZWMtPmNvbnRlbnRzICsgaC0+cm9vdC51LmRlZi52YWx1ZTsKKworICAgICAgaGVudHJ5ID0gaC0+ZGVzY3JpcHRvcjsKKyAgICAgIEJGRF9BU1NFUlQgKGhlbnRyeSAhPSBOVUxMCisJCSAgJiYgKGhlbnRyeS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkgICAgICB8fCBoZW50cnktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKKyAgICAgIGVzZWMgPSBoZW50cnktPnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCisJCSAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgKyBlc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICsgaGVudHJ5LT5yb290LnUuZGVmLnZhbHVlKSwKKwkJICBwKTsKKworICAgICAgaXJlbCA9IGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbG9jcyArIG9zZWMtPnJlbG9jX2NvdW50OworICAgICAgaXJlbC0+cl92YWRkciA9IChvc2VjLT52bWEKKwkJICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOworICAgICAgaXJlbC0+cl9zeW1uZHggPSBlc2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OworICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7CisgICAgICBpcmVsLT5yX3NpemUgPSAzMTsKKyAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKKyAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7CisKKyAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOworICAgICAgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDApCisJbGRyZWwubF9zeW1uZHggPSAwOworICAgICAgZWxzZSBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5kYXRhIikgPT0gMCkKKwlsZHJlbC5sX3N5bW5keCA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCisJbGRyZWwubF9zeW1uZHggPSAyOworICAgICAgZWxzZQorCXsKKwkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQorCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKKwkgICAgIGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKKyAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7CisgICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOworICAgICAgKytmaW5mby0+bGRyZWw7CisKKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MsIHAgKyA0KTsKKworICAgICAgdHNlYyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAob3V0cHV0X2JmZCwKKwkJCQkJICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+c250b2MpOworCisgICAgICArK2lyZWw7CisgICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQorCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZQorCQkgICAgICAgKyA0KTsKKyAgICAgIGlyZWwtPnJfc3ltbmR4ID0gdHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKyAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOworICAgICAgaXJlbC0+cl9zaXplID0gMzE7CisgICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7CisgICAgICArK29zZWMtPnJlbG9jX2NvdW50OworCisgICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKKyAgICAgIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwKQorCWxkcmVsLmxfc3ltbmR4ID0gMDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuZGF0YSIpID09IDApCisJbGRyZWwubF9zeW1uZHggPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5ic3MiKSA9PSAwKQorCWxkcmVsLmxfc3ltbmR4ID0gMjsKKyAgICAgIGVsc2UKKwl7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCisJICAgICB0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBsZHJlbC5sX3J0eXBlID0gKDMxIDw8IDgpIHwgUl9QT1M7CisgICAgICBsZHJlbC5sX3JzZWNubSA9IG9pbmR4OworICAgICAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKKyAgICAgICsrZmluZm8tPmxkcmVsOworICAgIH0KKworICBpZiAoaC0+aW5keCA+PSAwIHx8IGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoaC0+aW5keCAhPSAtMgorICAgICAgJiYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKKwkgIHx8IChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQorCSAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCisJCQkJICAgaC0+cm9vdC5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKQorCQkgID09IE5VTEwpKSkpCisgICAgeworICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoaC0+aW5keCAhPSAtMgorICAgICAgJiYgKGgtPmZsYWdzICYgKFhDT0ZGX1JFRl9SRUdVTEFSIHwgWENPRkZfREVGX1JFR1VMQVIpKSA9PSAwKQorICAgIHsKKyAgICAgIEJGRF9BU1NFUlQgKG91dHN5bSA9PSBmaW5mby0+b3V0c3ltcyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgbWVtc2V0ICgmYXV4LCAwLCBzaXplb2YgYXV4KTsKKworICBoLT5pbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOworCisgIGlmIChzdHJsZW4gKGgtPnJvb3Qucm9vdC5zdHJpbmcpIDw9IFNZTU5NTEVOKQorICAgIHN0cm5jcHkgKGlzeW0uX24uX25fbmFtZSwgaC0+cm9vdC5yb290LnN0cmluZywgU1lNTk1MRU4pOworICBlbHNlCisgICAgeworICAgICAgYm9vbGVhbiBoYXNoOworICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OworCisgICAgICBoYXNoID0gdHJ1ZTsKKyAgICAgIGlmICgob3V0cHV0X2JmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQorCWhhc2ggPSBmYWxzZTsKKyAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGhhc2gsCisJCQkJIGZhbHNlKTsKKyAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpc3ltLl9uLl9uX24uX25femVyb2VzID0gMDsKKyAgICAgIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSBTVFJJTkdfU0laRV9TSVpFICsgaW5keDsKKyAgICB9CisKKyAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAorICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQorICAgIHsKKyAgICAgIGlzeW0ubl92YWx1ZSA9IDA7CisgICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOworICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOworICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9FUjsKKyAgICB9CisgIGVsc2UgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgJiYgaC0+c21jbGFzID09IFhNQ19YTykKKyAgICB7CisgICAgICBCRkRfQVNTRVJUIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3QudS5kZWYuc2VjdGlvbikpOworICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmRlZi52YWx1ZTsKKyAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7CisgICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7CisgICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOworICAgIH0KKyAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisgICAgeworICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICpsOworCisgICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0CisJCSAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7CisgICAgICBpc3ltLm5fc2NudW0gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgICBpc3ltLm5fc2NsYXNzID0gQ19ISURFWFQ7CisgICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOworCisgICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfSEFTX1NJWkUpICE9IDApCisJeworCSAgZm9yIChsID0geGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5zaXplX2xpc3Q7CisJICAgICAgIGwgIT0gTlVMTDsKKwkgICAgICAgbCA9IGwtPm5leHQpCisJICAgIHsKKwkgICAgICBpZiAobC0+aCA9PSBoKQorCQl7CisJCSAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IGwtPnNpemU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKyAgICB7CisgICAgICBpc3ltLm5fdmFsdWUgPSAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICArIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOworICAgICAgaXN5bS5uX3NjbnVtID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKyAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKKyAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfQ007CisgICAgICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gaC0+cm9vdC51LmMuc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICBhYm9ydCAoKTsKKworICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKKyAgaXN5bS5uX251bWF1eCA9IDE7CisKKyAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKKyAgb3V0c3ltICs9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7CisKKyAgYXV4LnhfY3NlY3QueF9zbWNsYXMgPSBoLT5zbWNsYXM7CisKKyAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBUX05VTEwsIGlzeW0ubl9zY2xhc3MsIDAsIDEsCisJCQkgKFBUUikgb3V0c3ltKTsKKyAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7CisKKyAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisgICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKyAgICAgICYmIGgtPnNtY2xhcyAhPSBYTUNfWE8pCisgICAgeworICAgICAgLyogV2UganVzdCBvdXRwdXQgYW4gU0Qgc3ltYm9sLiAgTm93IG91dHB1dCBhbiBMRCBzeW1ib2wuICAqLworCisgICAgICBoLT5pbmR4ICs9IDI7CisKKyAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKKyAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7CisgICAgICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKKworICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKKyAgICAgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7CisKKyAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgJmF1eCwgVF9OVUxMLCBDX0VYVCwgMCwgMSwKKwkJCSAgICAgKFBUUikgb3V0c3ltKTsKKyAgICAgIG91dHN5bSArPSBiZmRfY29mZl9hdXhlc3ogKG91dHB1dF9iZmQpOworICAgIH0KKworICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCisJCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCisJCSArIChvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkKKwkJICAgICogYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKSkpLAorCQlTRUVLX1NFVCkgIT0gMAorICAgICAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLCBvdXRwdXRfYmZkKQorCSAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQorICAgIHJldHVybiBmYWxzZTsKKyAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpICs9CisgICAgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCisKK3N0YXRpYyBib29sZWFuCit4Y29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBmaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIpCisgICAgIGJmZCAqb3V0cHV0X2JmZDsKKyAgICAgc3RydWN0IHhjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87CisgICAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKyAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworeworICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgYXNlY3Rpb24gKmhzZWM7CisgIGJmZF92bWEgaHZhbDsKKyAgYmZkX3ZtYSBhZGRlbmQ7CisgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKKyAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoX3B0cjsKKyAgc3RydWN0IGludGVybmFsX2xkcmVsIGxkcmVsOworCisgIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBzb21laG93IGxvY2F0ZSBhIHN5bWJvbCBpbiB0aGUgcmlnaHQgc2VjdGlvbi4gIFRoZQorICAgICAgICAgc3ltYm9sIG11c3QgZWl0aGVyIGhhdmUgYSB2YWx1ZSBvZiB6ZXJvLCBvciB3ZSBtdXN0IGFkanVzdAorICAgICAgICAgdGhlIGFkZGVuZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIEZJWE1FOiBXcml0ZSB0aGlzCisgICAgICAgICB3aGVuIHdlIG5lZWQgaXQuICBUaGUgb2xkIGxpbmtlciBjb3VsZG4ndCBoYW5kbGUgdGhpcyBhbnlob3cuICAqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKKyAgaWYgKGhvd3RvID09IE5VTEwpCisgICAgeworICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKKyAgICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKKwkJCQkgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAorCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKSk7CisgIGlmIChoID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKKwkgICAgIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKKwkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKyAgICB7CisgICAgICBoc2VjID0gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKKyAgICAgIGh2YWwgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisgICAgeworICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKKyAgICAgIGh2YWwgPSBoLT5yb290LnUuZGVmLnZhbHVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhzZWMgPSBOVUxMOworICAgICAgaHZhbCA9IDA7CisgICAgfQorCisgIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOworICBpZiAoaHNlYyAhPSBOVUxMKQorICAgIGFkZGVuZCArPSAoaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCSAgICAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQKKwkgICAgICAgKyBodmFsKTsKKworICBpZiAoYWRkZW5kICE9IDApCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBzaXplOworICAgICAgYmZkX2J5dGUgKmJ1ZjsKKyAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKKyAgICAgIGJvb2xlYW4gb2s7CisKKyAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKKyAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfem1hbGxvYyAoc2l6ZSk7CisgICAgICBpZiAoYnVmID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBvdXRwdXRfYmZkLCBhZGRlbmQsIGJ1Zik7CisgICAgICBzd2l0Y2ggKHJzdGF0KQorCXsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKKwkgIGFib3J0ICgpOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCisJCSAoZmluZm8tPmluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAorCQkgIGhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsCisJCSAgKGJmZF92bWEpIDApKSkKKwkgICAgeworCSAgICAgIGZyZWUgKGJ1Zik7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKKwkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKKyAgICAgIGZyZWUgKGJ1Zik7CisgICAgICBpZiAoISBvaykKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFN0b3JlIHRoZSByZWxvYyBpbmZvcm1hdGlvbiBpbiB0aGUgcmlnaHQgcGxhY2UuICBJdCB3aWxsIGdldAorICAgICBzd2FwcGVkIGFuZCB3cml0dGVuIG91dCBhdCB0aGUgZW5kIG9mIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUuICAqLworCisgIGlyZWwgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxvY3MKKwkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKyAgcmVsX2hhc2hfcHRyID0gKGZpbmZvLT5zZWN0aW9uX2luZm9bb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcworCQkgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKKworICBtZW1zZXQgKGlyZWwsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSk7CisgICpyZWxfaGFzaF9wdHIgPSBOVUxMOworCisgIGlyZWwtPnJfdmFkZHIgPSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgbGlua19vcmRlci0+b2Zmc2V0OworCisgIGlmIChoLT5pbmR4ID49IDApCisgICAgaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OworICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBpbmRleCB0byAtMiB0byBmb3JjZSB0aGlzIHN5bWJvbCB0byBnZXQgd3JpdHRlbiBvdXQuICAqLworICAgICAgaC0+aW5keCA9IC0yOworICAgICAgKnJlbF9oYXNoX3B0ciA9IGg7CisgICAgICBpcmVsLT5yX3N5bW5keCA9IDA7CisgICAgfQorCisgIGlyZWwtPnJfdHlwZSA9IGhvd3RvLT50eXBlOworICBpcmVsLT5yX3NpemUgPSBob3d0by0+Yml0c2l6ZSAtIDE7CisgIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQorICAgIGlyZWwtPnJfc2l6ZSB8PSAweDgwOworCisgICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OworCisgIC8qIE5vdyBvdXRwdXQgdGhlIHJlbG9jIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLworCisgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOworCisgIGlmIChoc2VjICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKKworICAgICAgc2VjbmFtZSA9IGhzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lOworCisgICAgICBpZiAoc3RyY21wIChzZWNuYW1lLCAiLnRleHQiKSA9PSAwKQorCWxkcmVsLmxfc3ltbmR4ID0gMDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi5kYXRhIikgPT0gMCkKKwlsZHJlbC5sX3N5bW5keCA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKHNlY25hbWUsICIuYnNzIikgPT0gMCkKKwlsZHJlbC5sX3N5bW5keCA9IDI7CisgICAgICBlbHNlCisJeworCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLCBzZWNuYW1lKTsKKwkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoaC0+bGRpbmR4IDwgMCkKKwl7CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiBgJXMnIGluIGxvYWRlciByZWxvYyBidXQgbm90IGxvYWRlciBzeW0iKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAorCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBsZHJlbC5sX3N5bW5keCA9IGgtPmxkaW5keDsKKyAgICB9CisKKyAgbGRyZWwubF9ydHlwZSA9IChpcmVsLT5yX3NpemUgPDwgOCkgfCBpcmVsLT5yX3R5cGU7CisgIGxkcmVsLmxfcnNlY25tID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKKyAgeGNvZmZfc3dhcF9sZHJlbF9vdXQgKG91dHB1dF9iZmQsICZsZHJlbCwgZmluZm8tPmxkcmVsKTsKKyAgKytmaW5mby0+bGRyZWw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNvcnQgcmVsb2NzIGJ5IFZNQS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCisKK3N0YXRpYyBpbnQKK3hjb2ZmX3NvcnRfcmVsb2NzIChwMSwgcDIpCisgICAgIGNvbnN0IFBUUiBwMTsKKyAgICAgY29uc3QgUFRSIHAyOworeworICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnIxID0gKGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBwMTsKKyAgY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICpyMiA9IChjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgcDI7CisKKyAgaWYgKHIxLT5yX3ZhZGRyID4gcjItPnJfdmFkZHIpCisgICAgcmV0dXJuIDE7CisgIGVsc2UgaWYgKHIxLT5yX3ZhZGRyIDwgcjItPnJfdmFkZHIpCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgdGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBSUy82MDAwL1BPV0VSL1Bvd2VyUEMuCisgICBUaGlzIGlzIGN1cnJlbnRseSB0aGUgb25seSBwcm9jZXNzb3Igd2hpY2ggdXNlcyBYQ09GRjsgSSBob3BlIHRoYXQKKyAgIHdpbGwgbmV2ZXIgY2hhbmdlLiAgKi8KKworYm9vbGVhbgorX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAorCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAorCQkJCSBzZWN0aW9ucykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgYmZkICppbnB1dF9iZmQ7CisgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOworICAgICBiZmRfYnl0ZSAqY29udGVudHM7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOworICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOworeworICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKKyAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7CisKKyAgcmVsID0gcmVsb2NzOworICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKKyAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCisgICAgeworICAgICAgbG9uZyBzeW1uZHg7CisgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOworICAgICAgYmZkX3ZtYSBhZGRlbmQ7CisgICAgICBiZmRfdm1hIHZhbDsKKyAgICAgIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgaG93dG87CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7CisKKyAgICAgIC8qIFJlbG9jYXRpb24gdHlwZSBSX1JFRiBpcyBhIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlIHdoaWNoIGlzCisgICAgICAgICBtZXJlbHkgdXNlZCB0byBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiBmcm9tIG9jY3VycmluZyBmb3IKKyAgICAgICAgIHRoZSBjc2VjdCBpbmNsdWRpbmcgdGhlIHN5bWJvbCB3aGljaCBpdCByZWZlcmVuY2VzLiAgKi8KKyAgICAgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1JFRikKKwljb250aW51ZTsKKworICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKKworICAgICAgaWYgKHN5bW5keCA9PSAtMSkKKwl7CisJICBoID0gTlVMTDsKKwkgIHN5bSA9IE5VTEw7CisJICBhZGRlbmQgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7ICAgIAorCSAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07CisJICBzeW0gPSBzeW1zICsgc3ltbmR4OworCSAgYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7CisJfQorCisgICAgICAvKiBXZSBidWlsZCB0aGUgaG93dG8gaW5mb3JtYXRpb24gb24gdGhlIGZseS4gICovCisKKyAgICAgIGhvd3RvLnR5cGUgPSByZWwtPnJfdHlwZTsKKyAgICAgIGhvd3RvLnJpZ2h0c2hpZnQgPSAwOworICAgICAgaG93dG8uc2l6ZSA9IDI7CisgICAgICBob3d0by5iaXRzaXplID0gKHJlbC0+cl9zaXplICYgMHgxZikgKyAxOworICAgICAgaG93dG8ucGNfcmVsYXRpdmUgPSBmYWxzZTsKKyAgICAgIGhvd3RvLmJpdHBvcyA9IDA7CisgICAgICBpZiAoKHJlbC0+cl9zaXplICYgMHg4MCkgIT0gMCkKKwlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZDsKKyAgICAgIGVsc2UKKwlob3d0by5jb21wbGFpbl9vbl9vdmVyZmxvdyA9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOworICAgICAgaG93dG8uc3BlY2lhbF9mdW5jdGlvbiA9IE5VTEw7CisgICAgICBob3d0by5uYW1lID0gImludGVybmFsIjsKKyAgICAgIGhvd3RvLnBhcnRpYWxfaW5wbGFjZSA9IHRydWU7CisgICAgICBpZiAoaG93dG8uYml0c2l6ZSA9PSAzMikKKwlob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gMHhmZmZmZmZmZjsKKyAgICAgIGVsc2UKKwl7CisJICBob3d0by5zcmNfbWFzayA9IGhvd3RvLmRzdF9tYXNrID0gKDEgPDwgaG93dG8uYml0c2l6ZSkgLSAxOworCSAgaWYgKGhvd3RvLmJpdHNpemUgPT0gMTYpCisJICAgIGhvd3RvLnNpemUgPSAxOworCX0KKyAgICAgIGhvd3RvLnBjcmVsX29mZnNldCA9IGZhbHNlOworCisgICAgICB2YWwgPSAwOworCisgICAgICBpZiAoaCA9PSBOVUxMKQorCXsKKwkgIGFzZWN0aW9uICpzZWM7CisKKwkgIGlmIChzeW1uZHggPT0gLTEpCisJICAgIHsKKwkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworCSAgICAgIHZhbCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07CisJICAgICAgLyogSGFjayB0byBtYWtlIHN1cmUgd2UgdXNlIHRoZSByaWdodCBUT0MgYW5jaG9yIHZhbHVlCisgICAgICAgICAgICAgICAgIGlmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCB0aGUgVE9DIGFuY2hvci4gICovCisJICAgICAgaWYgKHNlYy0+bmFtZVszXSA9PSAnMCcKKwkJICAmJiBzdHJjbXAgKHNlYy0+bmFtZSwgIi50YzAiKSA9PSAwKQorCQl2YWwgPSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jOworCSAgICAgIGVsc2UKKwkJdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKKwkJICAgICAgICsgc3ltLT5uX3ZhbHVlCisJCSAgICAgICAtIHNlYy0+dm1hKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2VjOworCisJICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOworCSAgICAgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCisJCSAgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpzZWM7CisKKwkgICAgICBzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOworCSAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKKwkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCisJCSAgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIEV2ZXJ5IHN5bWJvbCBpbiBhIHNoYXJlZCBvYmplY3QgaXMgZGVmaW5lZCBzb21ld2hlcmUuICAqLworCSAgICAgIHZhbCA9IDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQorCSAgICB7CisJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQorCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCisJCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICAvKiBEb24ndCB0cnkgdG8gcHJvY2VzcyB0aGUgcmVsb2MuICBJdCBjYW4ndCBoZWxwLCBhbmQKKyAgICAgICAgICAgICAgICAgaXQgbWF5IGdlbmVyYXRlIGFub3RoZXIgZXJyb3IuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorCisgICAgICAvKiBJIHRvb2sgdGhlIHJlbG9jYXRpb24gdHlwZSBkZWZpbml0aW9ucyBmcm9tIHR3byBkb2N1bWVudHM6CisJIHRoZSBQb3dlclBDIEFJWCBWZXJzaW9uIDQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgRmlyc3QKKwkgRWRpdGlvbiAoQXByaWwgMTk5MiksIGFuZCB0aGUgUG93ZXJPcGVuIEFCSSwgQmlnLUVuZGlhbgorCSAzMi1CaXQgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24gKEp1bmUgMzAsIDE5OTQpLiAgRGlmZmVyZW5jZXMKKwkgYmV0d2VlbiB0aGUgZG9jdW1lbnRzIGFyZSBub3RlZCBiZWxvdy4gICovCisKKyAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCisJeworCWNhc2UgUl9SVEI6CisJY2FzZSBSX1JSVEJJOgorCWNhc2UgUl9SUlRCQToKKwkgIC8qIFRoZXNlIHJlbG9jcyBhcmUgZGVmaW5lZCBieSB0aGUgUG93ZXJQQyBBQkkgdG8gYmUKKyAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2hlcyB3aGljaCB1c2UgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZQorICAgICAgICAgICAgIGJldHdlZW4gdGhlIHN5bWJvbCBhbmQgdGhlIHByb2dyYW0gY291bnRlci4gIEkgY2FuJ3QKKyAgICAgICAgICAgICBxdWl0ZSBmaWd1cmUgb3V0IHdoZW4gdGhpcyBpcyB1c2VmdWwuICBUaGVzZSByZWxvY3MgYXJlCisgICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgdGhlIFBvd2VyT3BlbiBBQkkuICAqLworCWRlZmF1bHQ6CisJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKKwkgICAgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCAodW5zaWduZWQgaW50KSByZWwtPnJfdHlwZSk7CisJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKKwkgIHJldHVybiBmYWxzZTsKKwljYXNlIFJfUE9TOgorCSAgLyogU2ltcGxlIHBvc2l0aXZlIHJlbG9jYXRpb24uICAqLworCSAgYnJlYWs7CisJY2FzZSBSX05FRzoKKwkgIC8qIFNpbXBsZSBuZWdhdGl2ZSByZWxvY2F0aW9uLiAgKi8KKwkgIHZhbCA9IC0gdmFsOworCSAgYnJlYWs7CisJY2FzZSBSX1JFTDoKKwkgIC8qIFNpbXBsZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KKwkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgUl9UT0M6CisJICAvKiBUT0MgcmVsYXRpdmUgcmVsb2NhdGlvbi4gIFRoZSB2YWx1ZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gaW4KKyAgICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGlucHV0IGZpbGUgVE9DIHRvCisgICAgICAgICAgICAgdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSB3YW50IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmluYWwKKyAgICAgICAgICAgICBUT0MgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uICBXZSBoYXZlOgorCSAgICAgICAgIGlzeW0gPSBpVE9DICsgaW4KKwkJIGlpbnNuID0gaW4gKyBvCisJCSBvc3ltID0gb1RPQyArIG9uCisJCSBvaW5zbiA9IG9uICsgbworCSAgICAgc28gd2UgbXVzdCBjaGFuZ2UgaW5zbiBieSBvbiAtIGluLgorCSAgICAgKi8KKwljYXNlIFJfR0w6CisJICAvKiBHbG9iYWwgbGlua2FnZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgcmVsb2NhdGlvbgorICAgICAgICAgICAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24uICAqLworCWNhc2UgUl9UQ0w6CisJICAvKiBMb2NhbCBvYmplY3QgVE9DIGFkZHJlc3MuICBJIGNhbid0IGZpZ3VyZSBvdXQgdGhlCisgICAgICAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGNhc2UgUl9HTC4gICovCisJY2FzZSBSX1RSTDoKKwkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgQSBUT0MgcmVsYXRpdmUgbG9hZCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzIGluc3RydWN0aW9uLgorICAgICAgICAgICAgIEZJWE1FOiBXZSBkb24ndCBjdXJyZW50bHkgaW1wbGVtZW50IHRoaXMgb3B0aW1pemF0aW9uLiAgKi8KKwljYXNlIFJfVFJMQToKKwkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSBsb2FkCisgICAgICAgICAgICAgYWRkcmVzcyBpbnN0cnVjdGlvbiB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byBhIGxvYWQKKyAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdAorICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgKi8KKwkgIGlmIChoICE9IE5VTEwgJiYgaC0+c21jbGFzICE9IFhNQ19URCkKKwkgICAgeworCSAgICAgIGlmIChoLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQorCQl7CisJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCisJCSAgICAoXygiJXM6IFRPQyByZWxvYyBhdCAweCV4IHRvIHN5bWJvbCBgJXMnIHdpdGggbm8gVE9DIGVudHJ5IiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcmVsLT5yX3ZhZGRyLAorCQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOworCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgPT0gMCk7CisJICAgICAgdmFsID0gKGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCisJCSAgICAgKyBoLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7CisJICAgIH0KKworCSAgdmFsID0gKCh2YWwgLSB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+dG9jKQorCQkgLSAoc3ltLT5uX3ZhbHVlIC0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+dG9jKSk7CisJICBhZGRlbmQgPSAwOworCSAgYnJlYWs7CisJY2FzZSBSX0JBOgorCSAgLyogQWJzb2x1dGUgYnJhbmNoLiAgV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIGxvd2VyCisgICAgICAgICAgICAgdHdvIGJpdHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKwljYXNlIFJfQ0FJOgorCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBjYWxsIHdoaWNoCisgICAgICAgICAgICAgbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhIHJlbGF0aXZlIGNhbGwuICBUaGUgUG93ZXJPcGVuCisgICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCisJY2FzZSBSX1JCQToKKwkgIC8qIEFic29sdXRlIGJyYW5jaCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEKKyAgICAgICAgICAgICByZWxhdGl2ZSBicmFuY2guICAqLworCWNhc2UgUl9SQkFDOgorCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQorICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGFuIGFic29sdXRlIGJyYW5jaAorICAgICAgICAgICAgIHRvIGEgc3ltYm9sLiAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMKKyAgICAgICAgICAgICByZWxvY2F0aW9uIHR5cGUuICAqLworCWNhc2UgUl9SQlJDOgorCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhbiBhYnNvbHV0ZSBicmFuY2ggdG8gYQorICAgICAgICAgICAgIGZpeGVkIGFkZHJlc3Mgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGEgcmVsYXRpdmUgYnJhbmNoLgorICAgICAgICAgICAgIFRoZSBQb3dlck9wZW4gQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCisJICBob3d0by5zcmNfbWFzayAmPSB+MzsKKwkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7CisJICBicmVhazsKKwljYXNlIFJfQlI6CisJICAvKiBSZWxhdGl2ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKKyAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCWNhc2UgUl9DUkVMOgorCSAgLyogVGhlIFBvd2VyUEMgQUJJIGRlZmluZXMgdGhpcyBhcyBhIHJlbGF0aXZlIGNhbGwgd2hpY2ggbWF5CisgICAgICAgICAgICAgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGFuIGFic29sdXRlIGNhbGwuICBUaGUgUG93ZXJPcGVuCisgICAgICAgICAgICAgQUJJIGRvZXMgbm90IGRlZmluZSB0aGlzIHJlbG9jYXRpb24gdHlwZS4gICovCisJY2FzZSBSX1JCUjoKKwkgIC8qIEEgcmVsYXRpdmUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4KKyAgICAgICAgICAgICBhYnNvbHV0ZSBicmFuY2guICBGSVhNRTogV2UgZG9uJ3QgaW1wbGVtZW50IHRoaXMsCisgICAgICAgICAgICAgYWx0aG91Z2ggd2Ugc2hvdWxkIGZvciBzeW1ib2xzIG9mIHN0b3JhZ2UgbWFwcGluZyBjbGFzcworICAgICAgICAgICAgIFhNQ19YTy4gICovCisJICBob3d0by5wY19yZWxhdGl2ZSA9IHRydWU7CisJICBob3d0by5zcmNfbWFzayAmPSB+MzsKKwkgIGhvd3RvLmRzdF9tYXNrID0gaG93dG8uc3JjX21hc2s7CisJICBicmVhazsKKwljYXNlIFJfUkw6CisJICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCB3aGljaCBtYXkgYmUKKyAgICAgICAgICAgICBjaGFuZ2VkIHRvIGEgbG9hZCBhZGRyZXNzLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cyB0aGlzCisgICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgY2FzZSBSX1BPUy4gICovCisJICBicmVhazsKKwljYXNlIFJfUkxBOgorCSAgLyogVGhlIFBvd2VyUEMgQUlYIEFCSSBkZXNjcmliZXMgdGhpcyBhcyBhIGxvYWQgYWRkcmVzcworICAgICAgICAgICAgIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZC4gIFRoZSBQb3dlck9wZW4gQUJJIHNheXMKKyAgICAgICAgICAgICB0aGlzIGlzIHRoZSBzYW1lIGFzIFJfUE9TLiAgKi8KKwkgIGJyZWFrOworCX0KKworICAgICAgLyogSWYgd2Ugc2VlIGFuIFJfQlIgb3IgUl9SQlIgcmVsb2Mgd2hpY2ggaXMganVtcGluZyB0byBnbG9iYWwKKyAgICAgICAgIGxpbmthZ2UgY29kZSwgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IGFuIGFwcHJvcHJpYXRlIGNyb3Igbm9wCisgICAgICAgICBpbnN0cnVjdGlvbiwgd2UgcmVwbGFjZSB0aGUgY3JvciB3aXRoIGx3eiByMiwyMChyMSkuICBUaGlzCisgICAgICAgICByZXN0b3JlcyB0aGUgVE9DIGFmdGVyIHRoZSBnbGluayBjb2RlLiAgQ29udHJhcml3aXNlLCBpZiB0aGUKKyAgICAgICAgIGNhbGwgaXMgZm9sbG93ZWQgYnkgYSBsd3ogcjIsMjAocjEpLCBidXQgdGhlIGNhbGwgaXMgbm90CisgICAgICAgICBnb2luZyB0byBnbG9iYWwgbGlua2FnZSBjb2RlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgbG9hZCB3aXRoIGEKKyAgICAgICAgIGNyb3IuICAqLworICAgICAgaWYgKChyZWwtPnJfdHlwZSA9PSBSX0JSIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQorCSAgJiYgaCAhPSBOVUxMCisJICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAmJiAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgOAorCSAgICAgIDw9IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkpCisJeworCSAgYmZkX2J5dGUgKnBuZXh0OworCSAgdW5zaWduZWQgbG9uZyBuZXh0OworCisJICBwbmV4dCA9IGNvbnRlbnRzICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkgKyA0OworCSAgbmV4dCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgcG5leHQpOworCisJICAvKiBUaGUgX3B0cmdsIGZ1bmN0aW9uIGlzIG1hZ2ljLiAgSXQgaXMgdXNlZCBieSB0aGUgQUlYCisgICAgICAgICAgICAgY29tcGlsZXIgdG8gY2FsbCBhIGZ1bmN0aW9uIHRocm91Z2ggYSBwb2ludGVyLiAgKi8KKwkgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0dMCisJICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiLl9wdHJnbCIpID09IDApCisJICAgIHsKKwkgICAgICBpZiAobmV4dCA9PSAweDRkZWY3YjgyCQkvKiBjcm9yIDE1LDE1LDE1ICovCisJCSAgfHwgbmV4dCA9PSAweDRmZmZmYjgyKQkvKiBjcm9yIDMxLDMxLDMxICovCisJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg4MDQxMDAxNCwgcG5leHQpOyAvKiBsd3ogcjEsMjAocjEpICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChuZXh0ID09IDB4ODA0MTAwMTQpCQkvKiBsd3ogcjEsMjAocjEpICovCisJCWJmZF9wdXRfMzIgKGlucHV0X2JmZCwgMHg0ZmZmZmI4MiwgcG5leHQpOyAvKiBjcm9yIDMxLDMxLDMxICovCisJICAgIH0KKwl9CisKKyAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgaW5jbHVkZXMgdGhlIHNlY3Rpb24gYWRkcmVzcy4gICovCisgICAgICBpZiAoaG93dG8ucGNfcmVsYXRpdmUpCisJYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKKworICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKCZob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAorCQkJCQljb250ZW50cywKKwkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAorCQkJCQl2YWwsIGFkZGVuZCk7CisKKyAgICAgIHN3aXRjaCAocnN0YXQpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIGJmZF9yZWxvY19vazoKKwkgIGJyZWFrOworCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOworCSAgICBjaGFyIGhvd3RvX25hbWVbMTBdOworCisJICAgIGlmIChzeW1uZHggPT0gLTEpCisJICAgICAgbmFtZSA9ICIqQUJTKiI7CisJICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKKwkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7CisJCWlmIChuYW1lID09IE5VTEwpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgICAgc3ByaW50ZiAoaG93dG9fbmFtZSwgIjB4JTAyeCIsIHJlbC0+cl90eXBlKTsKKworCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQorCQkgICAoaW5mbywgbmFtZSwgaG93dG9fbmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKKwkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvQ2hhbmdlTG9nIGIvYmludXRpbHMvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTNkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9DaGFuZ2VMb2cKQEAgLTAsMCArMSw2NDA0IEBACisxOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KKworMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBpbgorCUJGRDY0IGNhc2UuCisKKwkqIHJlYWRlbGYuYyAoZ2V0X3NlY3Rpb25fdHlwZV9uYW1lKTogVXNlIGNvcnJlY3QgdHlwZXMgaW4gcHJpbnRmCisJZm9ybWF0cy4KKwkocHJvY2Vzc19yZWxvY3MpOiBMaWtld2lzZS4KKwkocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBMaWtld2lzZS4KKwkocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBMaWtld2lzZS4KKwkocHJvY2Vzc19taXBzX3NwZWNpZmljKTogTGlrZXdpc2UuCisKK1R1ZSBBcHIgMTMgMjE6MjI6MDAgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBNYXJrIHRodW1iIGZ1bmN0aW9ucyBhcworCUNfVEhVTUJFWFRGVU5DLgorCisxOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBidWNvbW0uaCAoZW52aXJvbik6IERlY2xhcmUgaXQsIGlmIG5lZWRlZC4KKwkoYWxsb2NhKSBbQ19BTExPQ0FdOiBEb24ndCB1c2UgZ2NjJ3MgYnVpbHRpbiBvciA8YWxsb2NhLmg+LgorCSogY29uZmlndXJlLmluIChlbnZpcm9uKTogRGV0ZWN0IGRlY2xhcmF0aW9uLgorCSogbm0uYyAobWFpbik6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgorCisJKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IFBhZCBvdXQgdGhlIC5yZWxvYyBzZWN0aW9uIHRvIGEKKwkzMi1ieXRlIGJvdW5kYXJ5IHdpdGggZHVtbXkgcmVsb2NhdGlvbnMsIHRvIG1ha2UgdGhlIEJlT1MgbG9hZGVyCisJaGFwcHkuICBQYXRjaCBmcm9tIEJvYiBNYW5zb24gPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+LgorCisxOTk5LTA0LTA4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLnRleGkgKGMrK2ZpbHQpOiBVcGRhdGVkIGZvciAtai8tLWphdmEsIGFuZCBocC9lZGcKKwlmb3JtYXRzLgorCisxOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmM6IEFkZCBhYmlsaXR5IHRvIGRlY29kZSBuZXcgY29uc3RhbnRzIGZvdW5kIGluIEFwcmlsIDI1CisJMTk5OCBEcmFmdCBvZiBTeXN0ZW0gViBBQkkgc3BlYy4KKworMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIGJ1Y29tbS5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KKwkqIGFkZHIybGluZS5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlCisJc3lzdGVtIGRvZXMgbm90IGRlZmluZSBpdC4KKwkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIGRsbHRvb2wuYyAobWFpbik6IExpa2V3aXNlLgorCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCisJKiBubS5jIChtYWluKTogTGlrZXdpc2UuCisJKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgorCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCisJKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgorCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCisJKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHdpbmRyZXMuYyAobWFpbik6IExpa2V3aXNlLgorCSogcmVhZGVsZi5jIChtYWluKTogQ2FsbCBsb2NhbGUgc2V0dGluZyBmdW5jdGlvbnMuCisKKzE5OTktMDQtMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAoZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24pOiBGaXggRFdfT1BfY29uc3Q4e3N8dX0KKwlkZWNvZGVzLiAKKworMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIHJlbmFtZS5jOiBOZXcgZmlsZSwgY29waWVkIG91dCBvZiBvYmpjb3B5LmMgd2l0aCBhIGZldyBjaGFuZ2VzLgorCSogYnVjb21tLmggKHNldF90aW1lcywgc21hcnRfcmVuYW1lKTogRGVjbGFyZS4KKwkqIGFyLmM6IERvbid0IGluY2x1ZGUgPHV0aW1lLmg+LgorCShleHRyYWN0X2ZpbGUpOiBDYWxsIHNldF90aW1lcyByYXRoZXIgdGhhbiB1dGltZS4KKwkod3JpdGVfYXJjaGl2ZSk6IENhbGwgc21hcnRfcmVuYW1lIHJhdGhlciB0aGFuIHVubGluayBhbmQgcmVuYW1lLgorCSogb2JqY29weS5jOiBEb24ndCBpbmNsdWRlIDx1dGltZS5oPi4KKwkoc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSwgc2V0X3RpbWVzKTogTW92ZSB0byByZW5hbWUuYy4KKwkoc3RyaXBfbWFpbik6IFVwZGF0ZSBzbWFydF9yZW5hbWUgY2FsbCBmb3IgbmV3IHBhcmFtZXRlci4KKwkoY29weV9tYWluKTogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKENGSUxFUyk6IEFkZCByZW5hbWUuYy4KKwkob2JqY29weV9TT1VSQ0VTLCBzdHJpcF9uZXdfU09VUkNFUyk6IEFkZCByZW5hbWUuYy4KKwkoYXJfU09VUkNFUywgcmFubGliX1NPVVJDRVMpOiBBZGQgcmVuYW1lLmMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShFWFRSQV9QUk9HUkFNUyk6IFJlbW92ZSBiYWNrc2xhc2ggd2hpY2ggdHJvdWJsZXMgY3VycmVudCB2ZXJzaW9uCisJb2YgYXV0b21ha2UuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogZGxsd3JhcC5jIChtYWluKTogRXhwZWN0IGNvcnJlY3QgdHlwZSBpbiBmb3JtYXQgc3RyaW5nLgorCSogcmVzcmVzLmM6IEluY2x1ZGUgImJmZC5oIiwgImJ1Y29tbS5oIiwgImxpYmliZXJ0eS5oIiwgYW5kCisJPHRpbWUuaD4uICBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiBhbmQgPGVycm5vLmg+LgorCSh3cml0ZV9yZXNfZmlsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGUgYW5kIGkuCisJKHJlYWRfcmVzb3VyY2VfZW50cnkpOiBSZW1vdmUgdW51c2VkIGxvY2FscyBydHlwZSBhbmQgbi4KKwkocmVhZF91bmlzdHJpbmcpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG4uCisKKzE5OTktMDQtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBhcnBhcnNlLnk6IERlY2xhcmUgeXlsZXguCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogSW5pdGlhbGl6ZSBieXRlcy4gIEFkZCBjb21tZW50CisJZm9yIGluY29ycmVjdCB1c2Ugb2YgYnl0ZXMuCisJKiByZWFkZWxmLmM6IENoYW5nZSBtYW55IGZvcm1hdHMgdG8gYXZvaWQgd2FybmluZ3MuCisKKzE5OTktMDQtMDEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAocmVzZXRfc3RhdGVfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4gIFJlc2V0cyB0aGUKKwlyZWdpc3RlcnMgb2YgdGhlIHNvdXJjZSBsaW5lIG51bWJlciBzdGF0ZSBtYWNoaW5lLgorCShwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBVc2Ugc3RhdGUgbWFjaGluZS4KKwkoZGlzcGxheV9kZWJ1Z19saW5lcyk6IFVzZSBzdGF0ZSBtYWNoaW5lLiAgSGFuZGxlIG11bHRpcGxlIGxpbmUKKwludW1iZXIgYmxvY2tzIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uLgorCisxOTk5LTAzLTI5ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogZW5kX3NlcXVlbmNlIGFsc28gcmVzZXRzCisJdGhlIGxpbmUgbnVtYmVyLgorCShkaXNwbGF5X2RlYnVnX2xpbmVzKTogYWR2YW5jZV9saW5lIHRha2VzIGEgc2lnbmVkIG9wZXJhbmQuCisJKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IFByaW50IHJlZnMgYXMgPCV4PiwgYWRkcmVzc2VzIGFzICUjeCwKKwlvdGhlcnMgYXMgJWQuICBIYW5kbGUgb3RoZXIgbG9jYXRpb24gZXhwcmVzc2lvbiBhdHRyaWJ1dGVzLgorCShkaXNwbGF5X2RlYnVnX2luZm8pOiBIYW5kbGUgbmVzdGluZy4gIEFsd2F5cyBwcmludCB0aGUJb2Zmc2V0LgorCisxOTk5LTAzLTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KKworCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IFdoZW4gY2hlY2tpbmcgd2hldGhlciB0byBrZWVwIGEKKwlzeW1ib2wsIGNoZWNrIHRoZSBCRkQgc2VjdGlvbiBzeW1ib2wgZm9yIGEgc3ltYm9sIHdpdGgKKwlCU0ZfU0VDVElPTl9TWU0gc2V0LgorCisxOTk5LTAzLTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFByaW50IG5ldyBTb2xhcmlzIGR5bmFtaWMKKwlzZWN0aW9uIGVudHJpZXMuICBDb3JyZWN0IHByaW50aW5nIG9mIERUX1BPU0ZMQUdfMSBhbmQgRFRfRkxBR1NfMS4KKworMTk5OS0wMy0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jIChyZXF1ZXN0X2R1bXApOiBOZXcgZnVuY3Rpb24uCisJUmVtb3ZlZCBhcmJpdGFyeSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIHRoYXQgY2FuIGJlCisJZHVtcGVkLgorCitXZWQgTWFyIDEwIDE1OjEwOjE0IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBkbGx0b29sLmMgKG1ha2Vfb25lX2xpYl9maWxlKTogVXNlICUwNWQgdG8gb3V0cHV0IHRoZSBzdHViIG5hbWUgc28KKwlvcmRlciBpbiB0aGUgaW1wb3J0IGxpYnJhcnkgaXMgcHJlc2VydmVkLgorCisxOTk5LTAyLTE5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmM6IEZpeCBjb21waWxlIHRpbWUgd2FyaW5ncy4KKworMTk5OS0wMi0xNyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKyAgICAgICAgKiByZXNiaW4uYyAocmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyk6IEluc3RlYWQgb2YgZW50ZXJpbmcgYSB2YWx1ZQorCWxlbmd0aCBvZiB6ZXJvIGluIGEgdmVyc2lvbiBpbmZvIHN0cmluZywgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCisJbGVuZ3RoLgorCitUdWUgRmViIDE2IDE2OjAwOjMzIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMIHRvCisJQUNfUFJPR19JTlNUQUxMLiAgQWRkIGNvbW1lbnRzIGZvciBBQ19ERUZJTkUgY2FsbHMuCisJKiBhY2NvbmZpZy5oOiBSZW1vdmUuCisJKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisJKiBjb25maWcuaW46IFJlYnVpbGQuCisKKzE5OTktMDItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogQWRkIGRpc3BsYXkgb2YgYmFzaWMgdHlwZQorCWVuY29kaW5ncy4KKwkoZGlzcGxheV9kZWJ1Z19hcmFuZ2VzKTogTmV3IGZ1bmN0aW9uOiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhCisJLmRlYnVnX2FyYW5nZXMgc2VjdGlvbi4KKwkoZGlzcGxheV9kZWJ1Z19pbmZvKTogRHVtcCB0YWdzIGZvdW5kIGFmdGVyIGNvbXB1bml0IGVudHJ5LgorCisJKiBiaW51dGlscy50ZXhpOiBGaXhlZCBidWcgaW4gcmVhZGVsZiBkb2N1bWVudGF0aW9uLgorCitNb24gRmViICAxIDEyOjM4OjAxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogIEhhbmRsZSBFTV9BUk0gYXMgUkVMLgorCisxOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogRG8gbm90IHByb2R1Y2UgYSBoaXN0b2dyYW0gb2YKKwlidWNrZXQgY2hhaW5zIGlmIG5vbmUgd2VyZSBmb3VuZC4KKworMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdmVyc2lvbi5jOiBBZGQgMTk5OSBjb3B5cmlnaHQuCisKKwkqIGJpbnV0aWxzLnRleGkgKHJlYWRlbGYpOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMKKwktLWRlYnVnLWR1bXAgYW5kIC0taGlzdG9ncmFtLgorCisJKiByZWFkZWxmLmM6IEFkZCBhYmlsaXR5IHRvIGRpc3BsYXkgY29udGVudHMgb2Ygc29tZSBvciBhbGwgb2YgdGhlCisJRHdhcmYyIGRlYnVnIHNlY3Rpb25zLiAge1dvcmsgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkfS4KKwkoZGlzcGxheV9kZWJ1Z19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShkaXNwbGF5X2RlYnVnX2luZm8pOiBOZXcgZnVuY3Rpb24uCisJKGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCk6IE5ldyBmdW5jdGlvbi4KKwkoZGlzcGxheV9kZWJ1Z19saW5lKTogTmV3IGZ1bmN0aW9uLgorCShkaXNwbGF5X2RlYnVnX2FiYnJldik6IE5ldyBmdW5jdGlvbi4KKwkocHJvY2Vzc19hYmJyZXZfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkocmVhZF9sZWIxMjgpOiBOZXcgZnVuY3Rpb24uCisJKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IE5ldyBmdW5jdGlvbi4KKwkoZ2V0X1RBR19uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShnZXRfQVRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2V0X0ZPUk1fbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoZnJlZV9hYmJyZXZzKTogTmV3IGZ1bmN0aW9uLgorCShhZGRfYWJicmV2KTogTmV3IGZ1bmN0aW9uLgorCShhZGRfYWJicmV2X2F0dHIpOiBOZXcgZnVuY3Rpb24uCisJKHJlYWRfYW5kX2Rpc3BsYXlfYXR0cik6IE5ldyBmdW5jdGlvbi4KKwkoZGlzcGxheV9ibG9jayk6IE5ldyBmdW5jdGlvbi4KKworVGh1IEphbiAxNCAyMzozNjoxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvZmZkdW1wLmMgKHhjYWxsb2MpOiBSZW1vdmUsIGluIGxpYmliZXJ0eSBub3cuCisJKiBzcmNvbnYuYyAoeGNhbGxvYyk6IExpa2V3aXNlLgorCSogc3lzZHVtcC5jICh4Y2FsbG9jKTogTGlrZXdpc2UuCisKKzE5OTktMDEtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAocHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMpOiBPbWl0IHRyYWlsaW5nIHNwYWNlIGF0IGVuZAorCW9mIHNlY3Rpb24gaGVhZGVyIGNvbnRlbnRzIGxpbmUuCisKK1dlZCBEZWMgMTYgMTc6MjA6MDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZS4KKworTW9uIERlYyAxNCAxMjo1NTozNiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGRsbHdyYXAuYzogSW5jbHVkZSBiZmQuaCBhbmQgYnVjb21tLmguICBNb3ZlIGdldG9wdC5oIGluY2x1ZGUKKwlhZnRlciBsaWJpYmVydHkuaCBpbmNsdWRlLgorCitUdWUgRGVjICA4IDE2OjI5OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC4xOiBGaXggdHlwbyAoLWQgdG8gLUQpLiAgRnJvbSBOb2t1YmkgSGlyb3Rha2EKKwk8aG5va3ViaUB5eXkub3IuanA+LgorCitTdW4gRGVjICA2IDEzOjI4OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChTRklMRSk6IEFkZCBzaXplIGZpZWxkLgorCShvYmpkdW1wX3NwcmludGYpOiBNZXJnZSBib3RoIHZlcnNpb25zIGludG8gb25lLiAgSW5jcmVhc2UgYnVmZmVyCisJc2l6ZSBhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcmZsb3cuCisJKGRpc2Fzc2VtYmxlX2J5dGVzKTogQ2hhbmdlIGJ1ZiBmcm9tIDEwMDAgYnl0ZXMgdG8gNTAuICBDaGFuZ2UKKwlpbml0aWFsaXphdGlvbiBhbmQgdXNlIG9mIHNmaWxlIHRvIG1hdGNoIGNoYW5nZXMgdG8KKwlvYmpkdW1wX3NwcmludGYuCisKKwkqIHN0cmlwLjE6IEZpeCB0eXBvICgtViB0byAtdikuICBGcm9tIElzc2VpIEhpcmF5YW1hCisJPGlzc0BtYWlsLndicy5vci5qcD4uCisKKzE5OTgtMTItMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogSW1wcm92ZSBvdXRwdXQgZm9ybWF0IGZvcgorCXZhcmlvdXMgRFRfKiB2YWx1ZXMuCisKKzE5OTgtMTItMDIgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IFByaW50IC5jb25mbGljdCBzZWN0aW9uCisJY29udGVudC4KKworCSogcmVhZGVsZi5jIChwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBQcmludCBsX2ZsYWdzIGluIGxpYmxpc3QgaW4KKwl0ZXh0dWFsIGZvcm0uCisKKzE5OTgtMTEtMzAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IEFkZCBzb21lIHBhcmFub2lhIGNoZWNrcyBmb3IgbmVnYXRpdmVseQorCXNpemVkIGZpbGVzLgorCitUdWUgTm92IDI0IDA5OjM5OjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLmMgKERJUl9TRVBBUkFUT1IpOiBEZWZpbmUgYXMgJ1xcJyBpZiBXSU4zMiBpcyBkZWZpbmVkLgorCitUdWUgTm92IDE3IDEwOjI1OjI2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCitNb24gTm92IDE2IDE5OjE3OjIzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogcG8vYmludXRpbHMucG90OiBSZWdlbmVyYXRlLgorCitNb24gTm92IDE2IDEwOjE4OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBSZWdlcm5hdGVkIGRlcGVuZGVuY2llcy4KKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworU2F0IE5vdiAxNCAxNDo1MDo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IENvcnJlY3QgcmV0dXJuIHR5cGUgZnJvbSBmYWxzZSB0bworCURFQlVHX1RZUEVfTlVMTC4KKworU2F0IE5vdiAxNCAxNDo0ODoyMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNraXAgb3ZlciByZWxvY3MgYmVsb3cgc3RhcnQKKwlhZGRyZXNzLgorCitUdWUgTm92IDEwIDE1OjMxOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgZGVwZW5kZW5jeSBvZiByZWFkZWxmLmMgb24gZWxmL2ZyMzAuaAorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKK1dlZCBOb3YgIDQgMTY6MjU6NTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEZSMzAuCisKK01vbiBOb3YgIDIgMTQ6NTk6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKKyAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKworRnJpIE9jdCAzMCAxNToxNDo0OSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogZGxsd3JhcC5jOiBjaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gY3lnd2luMzJfIHRvIGN5Z3dpbl8sCisJY2hhbmdlIEN5Z3dpbiB0YXJnZXQgZGVmIHRvIENZR1dJTi4KKworV2VkIE9jdCAyOCAxMDozMToxOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBSZXBsYWNlICd1bnNpZ25lZCBsb25nJyB3aXRoCisJJ2JmZF92bWEnLgorCitUdWUgT2N0IDI3IDE0OjM5OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBcHBsaWVkIHRoaXMgcGF0Y2ggZnJvbSBQaGlsaXAKKwlCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OiAgTWFrZSBhZGRyZXNzIHZhcmlhYmxlcyB1bnNpZ25lZCB0bworCWF2b2lkIHByb2JsZW1zIHdoZW4gZGlzYXNzZW1ibGluZyBjb2RlIGF0IGhpZ2gtYml0LXNldCBhZGRyZXNzZXMuCisKK01vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKyAgICAgICAgKiBkbGx3cmFwLmMgKHN0cmhhc2gpOiBOZXcgZnVuY3Rpb24uCisgICAgICAgIChtYWluKTogVXNlIGl0IHRvIHN1cHBseSBpbWFnZSBiYXNlIGlmIG5vdCBzdXBwbGllZCBieSB1c2VyLgorICAgICAgICAocHJvZ3JhbV92ZXJzaW9uKTogVXAgdG8gMC4yLjQuCisKK01vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKyAgICAgICAgKiBkbGx0b29sLmMgKGFkZF9zdGRjYWxsX2FsaWFzKTogTmV3IGdsb2JhbC4KKyAgICAgICAgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KKyAgICAgICAgKG1haW4pOiBIYW5kbGUgaXQuCisgICAgICAgIChzY2FuX2RyZWN0dmVfc3ltYm9scyk6IEFkZCBhbGlhcyBpZiAtLWFkZC1zdGRjYWxsLWFsaWFzIGlzCisgICAgICAgIHNwZWNpZmllZC4KKyAgICAgICAgKHNjYW5fZmlsdGVyZWRfc3ltYm9scyk6IExpa2V3aXNlLgorICAgICAgICAoZ2VuX2RlZl9maWxlKTogT3V0cHV0IGFsaWFzIGZvciBzdGRjYWxsIHN5bXMgaWYgYXBwcm9wcmlhdGUuCisKKyAgICAgICAgKiBiaW51dGlscy50ZXhpIChkbGx0b29sKTogRG9jdW1lbnQgLS1hZGQtc3RkY2FsbC1hbGlhcyBvcHRpb24uCisKKyAgICAgICAgKiBkbGx3cmFwLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KKyAgICAgICAgKG1haW4pOiBIYW5kbGUgaXQuCisKKyAgICAgICAgKiBkZWZwYXJzZS55IChvcHRfbmFtZSk6IEFsbG93ICIuIiBpbiBuYW1lLgorICAgICAgICAqIGRsbHRvb2wuYyAoZGVmX25hbWUpOiBTZXQgZGxsX25hbWUgZnJvbSBOQU1FIGVudHJ5IGluIGRlZiBmaWxlLgorICAgICAgICAoZGVmX2xpYnJhcnkpOiBTZXQgZGxsX25hbWUgZnJvbSBMSUJSQVJZIGVudHJ5IGluIGRlZiBmaWxlLgorCitNb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgorCisgICAgICAgICogZGxsd3JhcC5jIChsb25nX29wdGlvbnMpOiAtLWltcGxpYiBzeW5vbnltIGZvciAtLW91dHB1dC1saWIuCisgICAgICAgIChtYWluKTogUGFzcyAtLWV4cG9ydC1hbGwgdG8gZGxsdG9vbCBvbmx5IGlmIHNwZWNpZmllZC4KKyAgICAgICAgKHByb2dyYW1fdmVyc2lvbik6IFVwIHRvIDAuMi4zLgorCitNb24gT2N0IDI2IDE0OjA3OjU5IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgorCisgICAgICAgICogZGxsd3JhcC5jIChteWJhc2VuYW1lKTogTmV3IGZ1bmN0aW9uLgorICAgICAgICAobWFpbik6IFJ1biBkbGx0b29sIHRvIGNyZWF0ZSBleHBvcnQgZGVmaW5pdGlvbiBmaWxlIGFuZCBpbXBvcnQKKyAgICAgICAgbGlicmFyeSBmaWxlIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgQ2hhbmdlIGV4cF9maWxlX25hbWUgc28gdGhhdCBpdCdzIGJhc2VkIG9uIHRoZSBkbGwgbmFtZS4KKworU3VuIE9jdCAyNSAxMDozNzo0NSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KKworICAgICAgICAqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IEZpeCBwYXRjaCBlcnJvci4KKworRnJpIE9jdCAxNiAyMjo1NjoyMCAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBmaXggIm5vIHN5bWJvbHMiIG1lc3NhZ2VzLgorCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBkaXR0by4KKwkqIHBvL1BPVEZJTEVTLmluLCBwby9iaW51dGlscy5wb3Q6IHJlYnVpbHQKKworTW9uIE9jdCAxMiAxNDoyODowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiBSZW5hbWUgZmllbGQgZnJvbSBWYWx1ZSB0byBJbmZvIHRvCisJbWF0Y2ggbmFtZSBvZiBmaWVsZCBpbiBFTEYgc3RydWN0dXJlcy4KKworVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IGNhbGwgQUNfRVhFRVhUIGluc3RlYWQgb2YgQU1fRVhFRVhUIGFuZAorCUFNX0NZR1dJTjMyLgorCSogYWNsb2NhbC5tNDogcmVtb3ZlIGxvY2FsIEFNX0VYRUVYVC9BTV9DWUdXSU4zMiBtYWNyb3MuCisJKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKworVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJRnJvbSBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT46CisgICAgICAgICogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRG9uJ3QgcmUtZXhwb3J0IHN5bWJvbHMgZXhwb3J0ZWQKKyAgICAgICAgYnkgb3RoZXIgRExMcy4KKworVGh1IE9jdCAgOCAxNTozMzowOCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQlVJTERfRExMV1JBUCk6IEFkZC4KKwkoQlVJTERfRExMV1JBUCwgRExMV1JBUF9QUk9HKTogQWRkLgorCShiaW5fUFJPR1JBTVMpOiBBZGQgZGxsd3JhcC4KKwkqIE1ha2VmaWxlLmluOiByZWdlbmVyYXRlIHdpdGggYXV0b21ha2UKKworCUZyb20gTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+OgorICAgICAgICAqIGRsbHdyYXAuYzogTmV3IGZpbGUgZnJvbSBkbGxoZWxwZXJzIHYwLjIuMS4KKwkocHJpbnRfdmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KKwkobG9uZ19vcHRpb25zKTogQWRkIC0tdmVyc2lvbi4KKwkobWFpbik6IEhhbmRsZS4KKyAgICAgICAgKiBkeW4tc3RyaW5nLmgsIGR5bi1zdHJpbmcuYzogTmV3IGZpbGVzIGZyb20gZWdjcy0xLjEvZ2NjLgorICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQlVJTERfRExMV1JBUCk6IEFkZC4KKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1R1ZSBPY3QgIDYgMTg6MjA6MTAgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKHdpbmRyZXNfU09VUkNFUyk6IEFkZCByZXNyZXMuYy4KKwkod2luZHJlc19PQkpFQ1RTKTogQWRkIHJlc3Jlcy5vLgorCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZQorCisgICAgICAgIEZyb20gQW5kZXJzIE5vcmxhbmRlciA8YW5vcmxhbmRAaGVtMi5wYXNzYWdlbi5zZT4uCisgICAgICAgICogcmVzcmVzLmM6IE5ldyBmaWxlLiAgSW1wbGVtZW50YXRpb24gb2YgcmVhZF9yZXNfZmlsZSBhbmQKKyAgICAgICAgd3JpdGVfcmVzX2ZpbGUgZnVuY3Rpb25zIGZvciB3aW5kcmVzLgorICAgICAgICAqIHJjcGFyc2UueTogSGFuZGxlIENPTlRST0wncyB3aXRoIG5hbWVkIGNsYXNzZXMuCisgICAgICAgICogcmVzYmluLmM6IEJ1ZyBpbiByZXNfdG9fYmluX2RpYWxvZyBhbmQgYmluX3RvX3Jlc19kaWFsb2cKKyAgICAgICAgd2hlbiBkaWFsb2cgaXMgZXh0ZW5kZWQ6IFRoZSB2ZXJzaW9uIGFuZCBzaWduYXR1cmUgZmllbGRzIHNob3VsZAorICAgICAgICBiZSByZXZlcnNlZCAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuIElkIGlzIDMyIGJpdHMgbG9uZyBpbgorICAgICAgICBleHRlbmRlZCBkaWFsb2dzLgorICAgICAgICAqIHJlc3JjLmMgKHdyaXRlX3JjX2RpYWxvZyk6IHByb3Blcmx5IHByaW50IGNvbnRyb2xzIHdpdGggbmFtZWQKKyAgICAgICAgY2xhc3Nlcy4KKyAgICAgICAgKiB3aW5kcmVzLmMgKHJlYWRfcmVzX2ZpbGUsIHdyaXRlX3Jlc19maWxlKTogUmVtb3ZlIHN0dWJzLgorICAgICAgICAqIHJlc3Jlcy5jICh3cml0ZV9yZXMpOiBSZW5hbWUgUlRfQUNDRUxFUkFUT1JTIHRvIFJUX0FDQ0VMRVJBVE9SLgorCitTdW4gT2N0ICA0IDIwOjM0OjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gTm9rdWJpIEhpcm90YWthIDxobm9rdWJpQHl5eS5vci5qcD46CisJKiBvYmpjb3B5LjE6IEZpeCB0eXBvIGluIC0tcmVtb3ZlLWxlYWRpbmctY2hhciBkb2NzLgorCSogb2JqZHVtcC4xOiBGaXggZm9ybWF0dGluZyBpbiAtLXN0YWJzIGRvY3MuCisKK1NhdCBTZXAgMTkgMjM6MzM6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByY3BhcnNlLnkgKG1lbWZsYWdzX21vdmUpOiBDb3JyZWN0IHJlY3Vyc2lvbi4KKworMTk5OC0wOS0xMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBQcmludCBpbiBoaXN0b2dyYW0gaG93IG1hbnkKKwlzeW1ib2xzIGFyZSBjb3ZlcmVkIGJ5IHRoZSBjdXJyZW50IGNoYWluIGxlbmd0aC4KKworU3VuIFNlcCAgNiAxNjoxNTo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyk6IERvIG5vdCB0cnkgdG8gZHVtcCBlbXB0eQorCXNlY3Rpb25zLgorCitTYXQgU2VwICA1IDE5OjE3OjEwIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgorCisJKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBEb24ndCByZS1leHBvcnQgc3ltYm9scyBleHBvcnRlZAorCWJ5IG90aGVyIERMTHMuCisKKzE5OTgtMDktMDIgMTQ6NTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUHJpbnQgRFRfKiB2YWx1ZSBvbmx5IGlmCisJZG9fZHluYW1pYy4KKwkoZG9faGlzdG9ncmFtKTogTmV3IHZhcmlhYmxlLgorCShvcHRpb25zKTogTmV3IGxvbmcgb3B0aW9uIGhpc3RvZ3JhbS4gIFNldCBkb19oaXN0b2dyYW0gaWYgdGhpcworCW9wdGlvbiBpcyB1c2VkLgorCSh1c2FnZSk6IERvY3VtZW50IC0taGlzdG9ncmFtLgorCShwYXJzZV9hcmdzKTogSGFuZGxlIDAgcmV0dXJuIHZhbHVlIGZyb20gZ2V0b3B0X2xvbmcuICBFbmFibGUKKwlkb19oaXN0b2dyYW0gZm9yIC1hLgorCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFJlYWQgaGFzaCB0YWJsZSBhbHNvIGlmIG9ubHkgZG9faGlzdG9ncmFtLgorCUFkZCBjb2RlIHRvIHByaW50IGhhc2ggdGFibGUgaGlzdG9ncmFtLgorCisxOTk4LTA4LTI1IDE2OjQ1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jIChwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IFJlYWQgc3ltaW5mbyBzZWN0aW9uIGlmCisJYXZhaWxhYmxlLgorCShwcm9jZXNzX3N5bWluZm8pOiBOZXcgZnVuY3Rpb24uICBQcmludCBzeW1pbmZvIGluZm9ybWF0aW9uLgorCShwcm9jZXNzX2ZpbGUpOiBDYWxsIHByb2Nlc3Nfc3ltaW5mbyBhbmQgZnJlZSBzeW1pbmZvIGRhdGEgYXQgdGhlIGVuZC4KKworV2VkIEF1ZyAxOSAxNjoxOTo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAodXNhZ2UpOiBBZGQgZmlsZSBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKG1haW4pOiBEb24ndCB0cmVhdCAnPycgYXMgYSBzcGVjaWFsIGNhc2UgaW4gZ2V0b3B0IHJldHVybi4KKworCSogYmludXRpbHMudGV4aSAoZGxsdG9vbCk6IERvY3VtZW50IG5ldyBvcHRpb25zLiAgQWRkIHNvbWUgdXNlcyBvZgorCUB2YXIuCisKK1dlZCBBdWcgMTkgMTY6MTk6MDcgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKwkqIGRsbHRvb2wuYyAoZ2VuX2RlZl9maWxlKTogUGx1ZyBtZW1vcnkgbGVhay4gIERvbid0IHByaW50CisJZGVtYW5nbGVkIG5hbWUgaWYgaXQgaXMgTlVMTC4KKworCVN1cHBvcnQgZm9yIGV4cG9ydGluZyBhbGwgc3ltYm9scyB0byBhbiBvdXRwdXQgZXhwb3J0IGRlZiBmaWxlOgorCSogZGxsdG9vbC5jICh7ZXhwb3J0X2FsbF9zeW1ib2xzLCBub19kZWZhdWx0X2V4Y2x1ZGVzLAorCW5vX2RlZmF1bHRfZXhjbHVkZXMsIGV4Y2x1ZGVzfSk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZXMuCisJKHN0cnVjdCBzdHJpbmdfbGlzdCk6IFR5cGUgdG8gaG9sZCBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4KKwkoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBSZW5hbWVkIGZyb20gc2Nhbl9vcGVuX29ial9maWxlLgorCShzY2FuX2ZpbHRlcmVkX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhZGRfZXhjbHVkZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShtYXRjaF9leGNsdWRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoc2V0X2RlZmF1bHRfZXhjbHVkZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShmaWx0ZXJfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNjYW5fYWxsX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzY2FuX29wZW5fb2JqX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh1c2FnZSk6IERvY3VtZW50IG5ldyBvcHRpb25zLgorCShsb25nX29wdGlvbnMpOiBBZGQgbmV3IG9wdGlvbnMuCisJKG1haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCisKKzE5OTgtMDctMzEgMjE6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmMgKHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzKTogUHJpbnQgcF9vZmZzZXQgdmFsdWUgd2l0aAorCXNpeCBoZXggZGlnaXRzLgorCShkeW5hbWljX3NlZ21lbnRfbWlwc192YWwpOiBBZGQgc3VwcG9ydCBmb3IgRFRfTUlQU19GTEFHUywKKwlEVF9NSVBTX0lWRVJTSU9OLCBhbmQgRFRfTUlQU19USU1FX1NUQU1QLgorCShwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBBbHNvIHByaW50IHNlY29uZHMgb2YgdGltZSBzdGFtcC4KKworRnJpIEp1bCAzMSAxMDowNDoyMyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6ICBFTV9BUk0gdXNlcyByZWxhIHJlbG9jcy4KKworMTk5OC0wNy0zMCAxNjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IERvbid0IHVzZWQgZ2V0dGV4dCBvbiB0aGUgbmFtZXMuCisJQWRkIG5ldyBEVF8qIHZhbHVlcyBmcm9tIFNvbGFyaXMuICBEb24ndCBwcmludCBudWVtcmljIHZhbHVlIGluCisJY2FzZSBvZiBhbiB1bmtub3duIGVudHJ5LgorCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IEhhbmRsZSBuZXcgRFRfKiBlbnRyaWVzLiAgUHJpbnQgbnVtZXJpYworCXZhbHVlcyBpbiBkZWNpbWFsLCBub3QgaGV4LgorCitGcmkgSnVsIDI0IDE2OjI4OjU3IDE5OTggIEplZmYgSG9sY29tYiAgPGplZmZoQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAoZ2V0X2R5bmFtaWNfdHlwZSk6IFJlbW92ZSBlbXB0eSBkZWZhdWx0IGZyb20gc3dpdGNoCisJc3RhdGVtZW50LgorCitGcmkgSnVsIDI0IDE2OjI4OjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IHJlbW92ZSB0aGUgZmlsZSBiZWZvcmUKKwljaGVja2luZyB3aGV0aGVyICQoYmluZGlyKSA9PSAkKHRvb2xkaXIpL2Jpbi4gIEZyb20gTWFjaWVqCisJVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworRnJpIEp1bCAyNCAwOTozODo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmM6IFJlbW92ZWQgc3B1cmlvdXMgaW5jbHVzaW9uIG9mIGVsZi9pbnRlcm5hbC5oIGFuZAorCWVsZi1iZmQuaC4KKworMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYzogQ29uc2lzdGFudGx5IHVzZSBlbGZfIHByZWZpeCBmb3IgKl9yZWxvY190eXBlCisJZnVuY3Rpb25zLgorCitXZWQgSnVsIDIyIDE2OjI5OjEyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBkdW1wcyBvZiBIUFBBIGFuZCBBUkMKKwlyZWxvY2F0aW9ucy4KKworCShwcm9jZXNzX3JlbG9jcyk6IERvIG5vdCBhYm9ydCBpZiBubyBzdHJpbmcgdGFibGUgY2FuIGJlIGZvdW5kLgorCisxOTk4LTA3LTIyIDE0OjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgdG8gcmV0dXJuIHJlbG9jYXRpb24KKwlzeW1ib2wgc3RyaW5ncy4gIFRoZXkgbm93IGdldCBpbXBsaWNpdGx5IGRlZmluZWQgd2hlbiBpbmNsdWRlIHRoZQorCXN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyLgorCisxOTk4LTA3LTIyIDEzOjUxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBCZWZvcmUgaW5jbHVkZSBzeXN0ZW0gc3BlY2lmaWMgRUxGIGhlYWRlciBkZWZpbmUKKwlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIGFuZCBFTkRfUkVMT0NfTlVNQkVSUy4gIEZvciBub3cKKwl1c2VkIGZvciBwcGMsIG1pcHMsIGFuZCBtbjEwMzAwLgorCitXZWQgSnVsIDIyIDEwOjI2OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IERpc3BsYXkgbnVtYmVyIG9mIHVucmVjb2duaXNlZAorCXJlbG9jYXRpb25zLgorCisxOTk4LTA3LTIxIDEzOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBVc2Ugc3ltYm9saWMgbmFtZXMgb2YgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGUgdmFyaW91cworCWFyY2hpdGVjdHVyZXMuICBDb3JyZWN0IG1vcmUgbGF5b3V0IGRldGFpbHMuCisJUHJpbnQgbmFtZXMgb2YgTUlQUyBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgUHJpbnQgQWxwaGEsIEFSTSwgYW5kCisJTUlQUyByZWxvY2F0aW9uIHR5cGUgbmFtZXMuCisKKzE5OTgtMDctMjAgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogQWRkIGNvZGUgZm9yIHN0cmlwIGFsbCBzeW1ib2xzIGNhc2UuCisgICAgICAgIChjb3B5X29iamVjdHMpOiBTdHJpcCBhbGwgY2FzZSBpcyBub3cgcHJvY2Vzc2VkIGFsc28gdGhyb3VnaAorCWZpbHRlcl9zeW1ib2xzLiAgTm8gbWFya2luZyBzeW1ib2xzIHVzZWQgaW4gcmVsb2NhdGlvbnMgd2hlbiBzdHJpcAorCWFsbCBzeW1ib2xzIGNhc2UuCisJKGNvcHlfc2VjdGlvbik6IFdoZW4gc3RyaXAgYWxsIHN5bWJvbHMgY2FzZSwgcmVtb3ZlIHJlbG9jYXRpb25zCisJd2hpY2ggYXJlIG5vdCBpbiBrZWVwIHN0cmlwIHNwZWNpZmljIGxpc3QuCisJKHN0cmlwX21haW4pOiBSZW1vdmUgZ3VhcmQgYHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCcgZm9yCisJc2V0dGluZyB1cCBzdHJpcCBhbGwgc3ltYm9scyBieSBkZWZhdWx0LgorCitNb24gSnVsIDIwIDEyOjUxOjE2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBhZGRyMmxpbmUuYyAoZmluZF9hZGRyZXNzX2luX3NlY3Rpb24pOiBPbmx5IGNvbnNpZGVyIGEgc2VjdGlvbgorCWlmIHRoZSBwYyB2YWx1ZSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gaXQuCisJKHRyYW5zbGF0ZV9hZGRyZXNzZXMpOiBEb24ndCBjcmFzaCBpZiBmdW5jdGlvbm5hbWUgb3IgZmlsZW5hbWUgYXJlCisJbnVsbC4KKworMTk5OC0wNy0yMCAwNzo0NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBGaXggbGl0dGxlIGFsaWdubWVudCBwcm9ibGVtCisJaW4gcHJpbnRlZCB0YWJsZSBoZWFkZXIuCisKKzE5OTgtMDctMjAgMDc6MTQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmM6IENvcnJlY3QgcmVhZGluZyBvZiAuZHluYW1pYyBzZWN0aW9uLgorCShkeW5hbWljX3NlY3Rpb24pOiBOb3cgYSBnbG9iYWwgdmFyaWFibGUuCisJKHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uLCBwcm9jZXNzX21pcHNfc3BlY2lmaWMsCisJcHJvY2Vzc19hcmNoX3NwZWNpZmljKTogTmV3IGZ1bmN0aW9ucy4KKwkoZ2V0X2ZpbGVfaGVhZGVyKTogQ2FsbCBwcm9jZXNzX2FyY2hfc3BlY2lmaWMuCisKKzE5OTgtMDctMTkgMTU6MTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmM6IEZpeCBzZXZlcmFsIHZlcnNpb25pbmcgcmVsYXRlZCBidWdzLiAgUHJvZHVjZSBuaWNlcgorCW91dHB1dC4KKwlBZGQgc3VwcG9ydCBmb3IgcHJvY2Vzc29yIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIE1JUFMuCisKK0ZyaSBKdWwgMTAgMTU6NTc6NTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBTd2l0Y2ggcHJvdG90eXBlcyBmcm9tIHVuc2lnbmVkIHNob3J0IHRvIHVuc2lnbmVkCisJaW50LgorCitGcmkgSnVsIDEwIDE2OjE3OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gQ2hyaXN0aWFuIEhvbGxhbmQgPENIb2xsYW5kQGRlLmx1Y2VudC5jb20+OgorCSogaWVlZS5jIChwYXJzZV9pZWVlKTogSW5pdGlhbGl6ZSBpbmZvLmdsb2JhbF92YXJzIGFuZAorCWluZm8uZ2xvYmFsX3R5cGVzLgorCShwYXJzZV9pZWVlX2F0bik6IElnbm9yZSByZWdpc3RlciBsaWZldGltZSBpbmZvcm1hdGlvbiByZXBvcnRlZGx5CisJZW1pdHRlZCBieSBNUkkgY29tcGlsZXIuCisKK1RodSBKdWwgIDkgMTM6MDg6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoTUFJTlRBSU5FUkNMRUFORklMRVMpOiBEZWZpbmUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVHVlIEp1bCAgNyAyMTo0ODo1NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHJlYWRlbGYuYyAoYnl0ZV9nZXQpOiBVc2UgUEFSQU1TIGluIHByb3RvdHlwZS4KKwkoZXJyb3IpOiBNYWtlIGl0IHdvcmsgd2l0aCBub24tQU5TSSBjb21waWxlcnMuCisJKHdhcm4pOiBMaWtld2lzZS4KKwkoZ2V0X3Zlcl9mbGFncyk6IERvbid0IHVzZSBhbiBBTlNJIHByb3RvdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KKworVHVlIEp1bCAgNyAxMzoyNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogU2V0IHNpemUgY29ycmVjdGx5IGlmIHRoZSBzaXplIG9mIHRoZQorCXNlY3Rpb24gaXMgbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgdGhlIGludGVybGVhdmUuICBCYXNlZCBvbiBwYXRjaAorCWZyb20gQnJpb24gU3RvbmUgPEJyaW9uLlN0b25lQGF0dHdzLmNvbT4uCisKK1RodSBKdWwgIDIgMTQ6MDE6MzQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+CisKKwkqIGNvbmZpZ3VyZS5jb206IEFkZCB2YXgvdm1zIHN1cHBvcnQuCisJKiBtYWtlZmlsZS52bXMtaW46IFJlbmFtZWQgZnJvbSBtYWtlZmlsZS52bXMuICBBZGQgc3Vic3RpdHV0aW9ucworCW5vdyBkb25lIGJ5IGNvbmZpZ3VyZS5jb20uCisKK1dlZCBKdWwgIDEgMjA6NDM6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdGFicy5jIChwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBIYW5kbGUgNCBhbmQgOCBieXRlIHNpZ25lZAorIAlpbnRlZ2VycyB3aXRoIHJlYWwgdXBwZXIgYm91bmRzLiAgSGFuZGxlIGEgbG93ZXIgYm91bmQgb25lIGxhcmdlcgorIAl0aGFuIHRoZSB1cHBlciBib3VuZCBhcyBhIHNpZ25lZCBpbnRlZ2VyLiAgSGFuZGxlIDggYnl0ZSBzaWduZWQKKwlpbnRlZ2Vycy4KKwkoc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSk6IE9wdGlvbmFsbHkgcmV0dXJuIHRoZSBkZW1hbmdsZWQgbmFtZSBvZgorCXRoZSB0ZW1wbGF0ZS4KKwkoc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQpOiBUcmVhdCBhIHRlbXBsYXRlIG5hbWUgYXMgYSB0YWdnZWQKKwl0eXBlLgorCShzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgorCitXZWQgSnVsICAxIDE2OjI5OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYzogTWlub3IgZm9ybWF0dGluZyBpbXByb3ZlbWVudHMuCisJKiByZWFkZWxmLmM6IE1pbm9yIG91dHB1dCBmb3JtYXR0aW5nIGltcHJvdmVtZW50LgorCitXZWQgSnVsICAxIDE0OjIzOjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmNsZXgubDogQWRkIGNhc3RzIGFuZCBjaGFuZ2UgdHlwZXMgdG8gYXZvaWQgd2FybmluZ3MuCisJKiByY3BhcnNlLnk6IExpa2V3aXNlLgorCSogcmVzYmluLmM6IExpa2V3aXNlLgorCSogcmVzY29mZi5jOiBMaWtld2lzZS4KKwkqIHJlc3JjLmM6IExpa2V3aXNlLgorCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisgCShIRklMRVMpOiBSZW1vdmUgcmVhZGVsZi5oLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwlCYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmV3IEtvemluCisJPEFuZHJldy5Lb3ppbkBwMTQuZjk2MC5uNTAyMC56Mi5maWRvbmV0Lm9yZz46CisJKiB3aW5kdW5pLmg6IE5ldyBmaWxlLCBmcm9tIHdpbmRyZXMuaC4KKwkqIHdpbmR1bmkuYzogTmV3IGZpbGUsIGZyb20gd2luZHJlcy5jLgorCSogd2luZHJlcy5jOiBNb3ZlIFVuaWNvZGUgZnVuY3Rpb25zIGludG8gd2luZHVuaS5jLgorCSogd2luZHJlcy5oOiBNb3ZlIFVuaWNvZGUgZGVjbGFyYXRpb25zIGludG8gd2luZHVuaS5oLiAgSW5jbHVkZQorCXdpbmR1bmkuaC4KKyAJKFJUX0FDQ0VMRVJBVE9SKTogUmVuYW1lIGZyb20gUlRfQUNDRUxFUkFUT1JTIHRvIG1hdGNoIFdpbmRvd3MKKwltYWNyby4gIENoYW5nZSBhbGwgdXNlcy4KKwkoUlRfUExVR1BMQVksIFJUX1ZYRCk6IENvcnJlY3QgdmFsdWVzLgorCSogTWFrZWZpbGUuYW0gKEhGSUxFUyk6IEFkZCB3aW5kcmVzLmguCisJKENGSUxFUyk6IEFkZCB3aW5kdW5pLmMuCisJKHdpbmRyZXNfU09VUkNFUyk6IEFkZCB3aW5kdW5pLmMuCisKK01vbiBKdW4gMjkgMTc6MDE6MjEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBVc2UgQkZEIEludGVybmFsIGFuZCBFeHRlcm5hbCBFbGYgc3RydWN0dXJlcy4KKwkqIHJlYWRlbGYuaDogUmVtb3ZlZCAtIG5vIGxvbmdlciBuZWVkZWQuCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlYWRlbGYuYydzIGRlcGVuZGVuY3kgdXBvbiByZWFkZWxmLmguCisKKzE5OTgtMDYtMjYgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBrZWVwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCBhcyBhZGRpdGlvbmFsCisJY29uZGl0aW9uIHRvIHNldCB1cCBzdHJpcCBhbGwgc3ltYm9scyBieSBkZWZhdWx0LgorCShjb3B5X2FyY2hpdmUpOiBkb24ndCBjaGFuZ2UgYXJjaGl2ZSB3aGVuIGVycm9yIGluIG9iamVjdCBmaWxlcyBvZgorCXRoZSBhcmNoaXZlLgorCitXZWQgSnVuIDI0IDE3OjUzOjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAocGFyc2VfbnVtYmVyKTogU2lnbiBleHRlbmQgbmVnYXRpdmUgdmFsdWVzIGNvcnJlY3RseSBpZgorCWJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZy4KKworVHVlIEp1biAyMyAxNDo1NTowNSAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQorCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVHVlIEp1biAyMyAxMTowODo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmM6IFJld3JpdGUgdG8gdXNlIGZvcGVuL2ZyZWFkIHJhdGVociB0aGFuIG1tYXAuCisKKwlBZGQgLS1zZWN0aW9uLWhlYWRlcnMgY29tbWFuZCBsaW5lIHN3aXRjaCwgd2hpY2ggaXMgYW4gYWxpYXMgZm9yCisJLS1zZWN0aW9ucy4KKworCUluY29ycG9yYXRlIGltcHJvdmVtbnRzIG1hZGUgYnkgQW5kcmVhcyBTY2h3YWIKKwk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPiBpbmNsdWRpbmcgb3V0cHV0CisJZm9ybWF0dGluZyBhbmQgdmVyc2lvbiBpbmZvIGRpc3BsYXkuCisKKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC0tc2VjdGlvbi1oZWFkZXJzIHN3aXRjaCB0byByZWFkZWxmLgorCitNb24gSnVuIDIyIDE4OjI4OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBJbmNsdWRlIGJmZC5oIGFuZCBidWNvbW0uaCBiZWZvcmUgc3lzdGVtIGhlYWRlcgorCWZpbGVzLgorCShwYXJzZV9hcmdzKTogQ2hhbmdlIHR5cGUgb2YgYyBmcm9tIGNoYXIgdG8gaW50LgorCitTdW4gSnVuIDE0IDE0OjI2OjI4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAodXNhZ2UpOiBXcml0ZSB0byBzdGRvdXQsIG5vdCBzdGRlcnIuCisKK0ZyaSBKdW4gMTIgMTM6MzM6NTEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBwby9NYWtlLWluIChhbGwteWVzKTogRGVwZW5kIG9uIC5wb3QgZmlsZSBpZiBtYWludGFpbmVyIG1vZGUKKwllbmFibGVkLgorCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCisKK0ZyaSBKdW4gMTIgMTY6MDY6MTUgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHJlYWRlbGYuYyAoZ2V0X3BwY19yZWxfdHlwZSk6IE5ldyBQb3dlclBDIHN1cHBvcnQuCisJKGR1bXBfcmVsb2NhdGlvbnMpOiBQb3dlclBDIHVzZXMgUkVMQSByZWxvY2F0aW9ucy4KKwkoZ2V0X21hY2hpbmVfbmFtZSk6IFNwZWxsIFBvd2VyUEMgY29ycmVjdGx5LgorCShnZXRfZmlsZV90eXBlKTogQ2hhbmdlIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlciB0byB1bnNpZ25lZC4KKwkoZ2V0X21hY2hpbmVfbmFtZSk6IERpdHRvLgorCShnZXRfbWFjaGluZV9kYXRhKTogUmV0dXJuIHdoZXRoZXIgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgorCShnZXRfbWFjaGluZV9mbGFncyk6IEludGVycHJldCBQb3dlclBDLCBNMzJSLCBhbmQgTUlQUyBmbGFncy4KKwkocHJvY2Vzc19lbGZfaGVhZGVyKTogUHJpbnQgZW5kaWFuLWVzcy4gIENvbnZlcnQgYWxsIG51bWVyaWMKKwlmb3JtYXRzIHRvIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFByaW50IG91dCBtYWNoaW5lIHNwZWNpZmljIGZsYWcKKwliaXRzLgorCShwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IEluY3JlYXNlIG5hbWUgYnkgMyBjb2x1bW5zIGFuZCBkZWNyZWFzZQorCXR5cGUgYnkgdGhlIHNhbWUgc28gdGhhdCAuZ2NjX2V4Y2VwdF90YWJsZSBmaXRzIGluIHRoZSBzcGFjZS4KKworCSogcmVhZGVsZi5oOiBJbmNsdWRlIGVsZi9wcGMuaCwgZWxmL21pcHMuaCwgYW5kIGVsZi9tMzJyLmggdG8gZ2V0CisJbWFjaGluZSBzcGVjaWZpYyBmbGFnIGJpdHMuCisKK1RodSBKdW4gMTEgMTc6NTQ6MjYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVhZGVsZi5jOiBSZW1vdmUgZXh0cmFuZW91cyAjaW5jbHVkZXMuICBGaXggd2FybmluZ3MgcHJvZHVjZWQKKwlieSAtV2FsbCB3aGVuIGNvbXBpbGluZyB1bmRlciBMaW51eC4KKworCSogTWFrZWZpbGUuYW0gKHJlYWRlbGZfTERBREQpOiBBZGQgJChMSUJJQkVSVFkpLgorCitUaHUgSnVuIDExIDE4OjMwOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIHNlbGZfY3Jvc3NyZWYgZmllbGQuCisJKHBhcnNlX3N0YWJfc3RyaW5nKTogSWYgYSB0YWcgaXMgYSBjcm9zcyByZWZlcmVuY2UgdG8gaXRzZWxmLAorCWRvbid0IGRlZmluZSBpdCBpbiB0aGUgdGFncyBsaXN0LgorCShwYXJzZV9zdGFiX3R5cGUpOiBTZXQgaW5mby0+c2VsZl9jcm9zc3JlZi4KKworCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0KTogRGVmaW5lLgorCShkZWJ1Z19nZXRfcmVhbF90eXBlKTogQWRkIGxpc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCUNoZWNrIGZvciBjaXJjdWxhcml0eSB0byBhdm9pZCBjcmFzaGluZyB3aGVuIGl0IG9jY3Vycy4KKworVGh1IEp1biAxMSAxNDo0ODozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWFkZWxmLmM6IE5ldyBmaWxlOiBEaXNwbGF5IGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZS4KKwkqIHJlYWRlbGYuaDogTmV3IGZpbGU6IEhlYWRlciBmaWxlIGZvciByZWFkZWxmLmMKKwkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gYnVpbGQgcmVhZGVsZi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgorCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgcmVhZGVsZi4KKwkqIE5FV1M6IE1lbnRpb24gaW5jbHVzaW9uIG9mIHJlYWRlbGYgaW50byBiaW51dGlscy4KKwkqIHBvL1BPVEZJTEVTLmluOyBSZWJ1aWx0LgorCitGcmkgSnVuICA1IDE4OjQzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogQWRqdXN0IHRoZSBzZWN0aW9uIHNpemUgaWYgY29weV9ieXRlCisJaXMgPj0gMC4KKwkoY29weV9zZWN0aW9uKTogRG8gbm90IGNhbGwgYmZkX3NldF9zZWN0aW9uX3NpemUuCisKK1RodSBKdW4gIDQgMDk6MTI6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogQWRkIG1pc3NpbmcgXG5cIGZyb20gaGVscCBkZXNjcmlwdGlvbi4KKworV2VkIEp1biAgMyAxOTozMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChZQUNDKTogQ29ycmVjdCBiaXNvbiAtTCBvcHRpb24uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtcC8tLXByaXZhdGUtaGVhZGVycy4KKworV2VkIEp1biAgMyAxMjowOTo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmM6IEFkZCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnM6IC0tY2hhbmdlLXNlY3Rpb24tbG1hCisJYW5kIC0tY2hhbmdlLXNlY3Rpb24tdm1hLiAgUmVuYW1lIG9sZCBjb21tYW5kIGxpbmUgb3B0aW9uCisJLS1hZGp1c3Qtc2VjdGlvbi12bWEgdG8gLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzLiAgUmVuYW1lCisJLS1hZGp1c3Qtdm1hIHRvIC0tY2hhbmdlLWFkZHJlc3NlcyBhbmQgLS1hZGp1c3Qtc3RhcnQgdG8KKwktLWNoYW5nZS1zdGFydC4gIFByb3ZpZGUgYWxpYXNlcyB0byBzdXBwb3J0IHRoZSBvbGQgdmVyc2lvbnMgb2YKKwl0aGVzZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKworCUNoYW5nZSB0aGUgbmFtZXMgb2YgbWFjcm9zIGFuZCBlbnVtIGVsZW1lbnRzIHRvIHVwcGVyIGNhc2UgdG8KKwltYXRjaCB0aGUgR05VIGNvZGluZyBzdGFuZGFyZC4KKworCVJlcGxhY2UgY2FsbHMgdG8gZnByaW50ZiAoc3RkZXJyLC4uLikgd2l0aCBjYWxscyB0byBmYXRhbCAoKSBvcgorCW5vbl9mYXRhbCAoKSBhcyBhcHByb3ByaWF0ZS4KKworCSogb2JqY29weS4xOiBEb2N1bWVudCBjb21tYW5kIGxpbmUgb3B0aW9uIGNoYW5nZXMuCisJKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCBjb21tYW5kIGxpbmUgb3B0aW9uIGNoYW5nZXMuCisKKwkqIGJ1Y29tbS5oOiBOZXcgZXhwb3J0ZWQgZnVudGlvbiBmcm9tIGJ1Y29tbS5jOiBub25fZmF0YWwoKS4KKwkqIGJ1Y29tbS5jIChub25fZmF0YWwpOiBOZXcgZXhwb3J0ZWQgZnVuY3Rpb24uICBKdXN0IGxpa2UgZmF0YWwoKQorCWV4Y2VwdCB0aGF0IGl0IHJldHVybnMgcmF0aGVyIHRoYW4gY2FsbGluZyB4ZXhpdCgpLgorCisJKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IENhbGwgZmF0YWwoKSByYXRoZXIgdGhhbiBiZmRfZmF0YWwoKS4KKworCShjaGVja19tYXRjaGluZ19mb3JtYXRzKTogRml4IEMgZm9ybWF0aW5nLgorCisJKHBhcnNlX3ZtYSk6IENhbGwgZmF0YWwoKS4KKworTW9uIEp1biAgMSAxODoyNjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIFl1bGkgQmFyY29oZW4gPHl1bGkuYmFyY29oZW5AdGVscmFkLmNvLmlsPjoKKwkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBBdm9pZCBlbmRsZXNzIGxvb3BzIGNvbXBhcmluZworCWZ1bmN0aW9uIGFuZCBtZXRob2QgcGFyYW1ldGVyIHR5cGVzLgorCitGcmkgTWF5IDIyIDE0OjAyOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChkdW1wX2lhdCk6IENvbW1lbnQgb3V0OyBub3QgdXNlZC4KKwkoZGlzcGxheSk6IFJlbmFtZSBmcm9tIHRlbGwuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisKK1RodSBNYXkgMTQgMTQ6MDA6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jOiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgRExMcy4gIEFkZCBzdXBwb3J0IGZvcgorCWludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgcHJvZ3JhbXMgYW5kIERMTHMuICBUaWR5IHRoZQorCWNvZGUuCisKKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGRsbHRvb2wuCisKKwkqIGNvbmZpZ3VyZTogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0cy4KKworCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogSW5jbHVkZSAxOTk4IGluIGNvcHlyaWdodCBzdHJpbmdzLgorCisJKiBzdGFicy5jIChwYXJzZV9zdGFiKTogU3VwcG9ydCBXaW4zMiBzdHlsZSBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4KKworU3VuIE1heSAxMCAyMjozNDo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCisKK0ZyaSBNYXkgIDggMTA6MzM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogYXIuYyAodXNhZ2UpOiBFeHRlbmQgaW5mb3JtYXRpb24gcHJvdmlkZWQgYWJvdXQgY29tbWFuZCBsaW5lCisJb3B0aW9ucy4KKworV2VkIE1heSAgNiAxNToyODo1MSAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogbWFrZWZpbGUudm1zOiBSdW4gZGVjIGMgd2l0aCAvbm9kZWJ1Zy4gIFBhc3MgQ0MgdmFsdWUgd2hlbgorCWNhbGxpbmcgbWFrZS4KKworVHVlIE1heSAgNSAxNToxOTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IEJ1aWxkIGRsbHRvb2wgZm9yIHRodW1iLXBlIHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0LgorCitTdW4gTWF5ICAzIDIyOjA0OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEVYVFJBX1BST0dSQU1TKTogQ2hhbmdlICQoU1JDT05WX1BST0cpIHRvIHN5c2NvbmYKKwlzeXNkdW1wIGNvZmZkdW1wIHRvIGF2b2lkIGV4dHJhICQoRVhFRVhUKS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitXZWQgQXByIDI5IDIyOjIyOjU1IDE5OTggIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTdG9wIGFwcGVuZGluZyBFWEVFWFQgdG8gdGhlIGVuZCBvZgorCVNSQ09OVl9QUk9HICh3cm9uZyBiZWNhdXNlIHRoYXQgdmFyaWFibGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUKKwlwcm9ncmFtcykKKwkqIE1ha2VmaWxlLmFtOiBpbnN0ZWFkLCBhZGQgRVhFRVhUcyB0byBlYWNoIFNSQ09OVl9QUk9HCisJcHJvZ3JhbQorCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUKKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQorCitUdWUgQXByIDI4IDE5OjE0OjM0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWRkcjJsaW5lLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgorCSogd2luZHJlcy5jIChtYWluKTogTGlrZXdpc2UuCisJKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgorCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgorCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCisJKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgorCSogZGxsdG9vbC5jIChtYWluKTogTGlrZXdpc2UuCisJKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCisJKiBhci5jIChtYWluKTogTGlrZXdpc2UuCisJKiBidWNvbW0uaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCisJKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgorCitUdWUgQXByIDI4IDEwOjMzOjA3IDE5OTggIEJpbGwgTW95ZXIgIDx0dGtAY3lnbnVzLmNvbT4KKworCUFkZCBzdXBwb3J0IGZvciBJTVBPUlRTOgorCSogZGVmcGFyc2UueSAoaW1wbGluZSk6IEFkZCBJTVBPUlRTIHN5bnRheGVzLgorCSogZGxsdG9vbC5jIChpZnVuY3R5cGUsIGloZWFkdHlwZSk6IE5ldyB0eXBlZGVmcy4KKwkoaW1wb3J0X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShhcHBlbmRfaW1wb3J0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZGVmX2ltcG9ydCk6IEFkZCBhbiBlbnRyeSB0byBpbXBvcnRfbGlzdC4KKwkoZ2VuZXJhdGVfaWRhdGFfb2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShnZW5fZXhwX2ZpbGUpOiBDYWxsIGdlbmVyYXRlX2lkYXRhX29maWxlLgorCSogZGxsdG9vbC5oIChkZWZfaW1wb3J0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCitNb24gQXByIDI3IDE2OjM5OjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIEFwciAyMiAxNjowMDozNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCisKK1dlZCBBcHIgMjIgMDA6MzM6NTYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogU2VhcmNoIGludGwgZGlycyBmb3IgaGVhZGVyczsgZGVmaW5lCisJTE9DQUxFRElSLgorCSogYWRkcjJsaW5lLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIHRleHRkb21haW4uCisJKiBhci5jIChtYWluKTogTGlrZXdpc2UuCisJKiBjb2ZmZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCisJKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgorCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgorCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCisJKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgorCSogc3Jjb252LmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHN0cmluZ3MuYyAobWFpbik6IExpa2V3aXNlLgorCSogc3lzZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCisJKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KKworVHVlIEFwciAyMSAyMjoxMzowOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgorCisJKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKKwlzdHJpbmdzLgorCSogYnVjb21tLmg6IEFkZGVkIGdldHRleHQtcmVsYXRlZCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KKwkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKKwlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgorCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAorCXBvL01ha2VmaWxlLiAgVXNlIEFNX1BST0dfTEVYLgorCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCisJKFBPVEZJTEVTKTogTGlrZXdpc2UuCisJKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KKwkoTERBREQpOiBBZGRlZCBJTlRMTElCUy4KKwkob2JqZHVtcF9MREFERCk6IExpa2V3aXNlLgorCShjX19maWx0X0xEQUREKTogTGlrZXdpc2UuCisJKGFyX0xEQUREKTogTGlrZXdpc2UuCisJKHJhbmxpYl9MREFERCk6IExpa2V3aXNlLgorCShkbGx0b29sX0xEQUREKTogTGlrZXdpc2UuCisJKHdpbmRyZXNfTERBREQpOiBMaWtld2lzZS4KKwkqIHBvL01ha2UtaW4sIHBvL1BPVEZJTEVTLmluLCBwby9iaW51dGlscy5wb3Q6IE5ldyBmaWxlcy4KKworVHVlIEFwciAyMSAxNjowNzoxOCAxOTk4ICBTdGFuaXNsYXYgQnJhYmVjICA8dXR4QGszMzIuZmVsZC5jdnV0LmN6PgorCisJKiBvYmpjb3B5LmMgKHByZXNlcnZlX2RhdGVzKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgorCShzbWFydF9yZW5hbWUpOiBJZiBwcmVzZXJ2ZV9kYXRlcywgY2FsbCBzZXRfdGltZXMgd2hlbiBjb3B5aW5nLgorCShzdHJpcF9tYWluKTogUmVtb3ZlIHByZXNlcnZlX2RhdGVzIGxvY2FsIHZhcmlhYmxlLgorCShjb3B5X21haW4pOiBMaWtld2lzZS4KKworVHVlIEFwciAgNyAxNTo0MToxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBBZGQgZGVmcGFyc2UuaCwgZGVmcGFyc2UuYywgcmNsZXguYywKKwlyY3BhcnNlLmgsIGFuZCByY3BhcnNlLmMKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitNb24gQXByICA2IDE2OjI0OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFBST0dTKTogTW92ZSAkKEFERFIyTElORV9QUk9HKSB0byBlbmQsIHNvIHRoYXQKKwlNYWtlZmlsZS5pbiBkb2Vzbid0IGhhdmUgYW4gZW1wdHkgY29udGludWF0aW9uIGxpbmUuCisJKGJpbl9QUk9HUkFNUyk6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBBcHIgIDMgMTQ6NDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgorCShNT1NUTFlDTEVBTkZJTEVTKTogQWRkIGJpbnV0aWxzLmxvZywgYmludXRpbHMuc3VtLCBhbmQgYWJjZGVmZ2gqLgorCShtb3N0bHljbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworV2VkIEFwciAgMSAxNTo1NDoxNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIFphY2sgV2VpbmJlcmcgPHphY2tAcmFiaS5waHlzLmNvbHVtYmlhLmVkdT4gYW5kIEguSi4gTHUKKwk8aGpsQGdudS5vcmc+OgorCSogYXIuYyAodXNhZ2UpOiBNZW50aW9uIFMgbW9kaWZpZXIuCisJKG1haW4pOiBBZGQgUyBtb2RpZmllci4KKwkqIGFyLjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IFMgbW9kaWZpZXIuCisKK1dlZCBBcHIgIDEgMTM6MTE6MjMgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGJpbnV0aWxzLnRleGk6IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KKworVHVlIE1hciAzMSAxODo0NDoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRlcC1pbi5zZWQ6IEFkZCBydWxlIHRvIHJlbW92ZSBAT0JKRElSQC4KKwkqIE1ha2VmaWxlLmFtIChkZXAuc2VkKTogU3Vic3RpdHV0ZSBmb3IgQE9CSkRJUkAuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIE1hciAzMCAxMjo0NzoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KKworCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogUmVtb3ZlIGRlZnBhcnNlLmgsIGFycGFyc2UuaCwKKwlyY3BhcnNlLmgsIGFuZCBubG1oZWFkZXIuaC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitTYXQgTWFyIDI4IDE3OjM5OjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBEZWZpbmUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKKwkqIG5sbWNvbnYuYyAobWFpbik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KKwkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgorCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KKwkqIHNpemUuYyAocHJpbnRfc3lzdl9mb3JtYXQpOiBMaWtld2lzZS4KKwkqIHNyY2NvbnYuYyAod3Jfb2IpOiBMaWtld2lzZS4KKwkqIHdyc3RhYnMuYyAoc3RhYl9tb2RpZnlfdHlwZSk6IExpa2V3aXNlLgorCShzdGFiX3ZhcmlhYmxlKTogTGlrZXdpc2UuCisJKiBubG1jb252LmMgKG1haW4pOiBJbml0aWFsaXplIHZhcmlhYmxlcyB0byBhdm9pZCB3YXJuaW5ncy4KKwkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogTGlrZXdpc2UuCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGlrZXdpc2UuCisJKiB3cnN0YWJzLmMgKHN0YWJfZW5kX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KKwkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AyKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgorCShkb19saW5lcyk6IENoYW5nZSBsIHRvIHVuc2lnbmVkIGludC4KKwkqIG5sbWhlYWRlci55ICh5eWxleCk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KKwkqIG5tLmMgKHByaW50X3N5bWJvbCk6IENoYW5nZSBqIHRvIGxvbmcuCisJKiBzaXplLmMgKGxwcmludF9udW1iZXIpOiBDb21tZW50IG91dC4KKwkqIHNyY29udi5jICh3cl9vYik6IENoYW5nZSBpIHRvIGJmZF9zaXplX3R5cGUuCisJKiBzeXNkdW1wLmMgKHVuaXRfaW5mb19saXN0KTogQ29tbWVudCBvdXQuCisJKG9iamVjdF9ib2R5X2xpc3QsIHByb2dyYW1fc3RydWN0dXJlLCBkZWJ1Z19saXN0KTogTGlrZXdpc2UuCisJKiBzeXNpbmZvLnkgKHl5ZXJyb3IpOiBSZXR1cm4gdmFsdWUuCisKK1RodSBNYXIgMjYgMTc6MDY6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZGVmcGFyc2UueSAoZXhwbGlzdCk6IEFsbG93IGVwc2lsb24uCisJU3VnZ2VzdGlvbiBmcm9tIEpvbmF0aGFuLUhhcnJpc0Bwc2lvbi5jb20uCisKK1RodSBNYXIgMjYgMTY6NTk6MDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDEpOiBVc2UgdGhlIHNlY3Rpb24ncyBsbWEgaW5zdGVhZCBvZiB2bWEKKwlmb3IgdGhlIGJlbmVmaXQgb2YgcHJvbSBsb2FkZXJzLgorCitXZWQgTWFyIDI1IDEzOjA1OjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSAgPGhqbEBnbnUub3JnPjoKKwkqIE1ha2VmaWxlLmFtIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCisJKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCisJKERJU1RDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1R1ZSBNYXIgMjQgMTk6MzM6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByY2xleC5sOiBBY2NlcHQgeyBhbmQgfSBhcyBzeW5vbnltcyBmb3IgQkVHSU4gYW5kIEVORC4KKworRnJpIE1hciAyMCAxOToxODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgorCitUdWUgRmViIDI0IDEzOjA3OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERlbGV0ZSAiKytwbGFjZSIgYWZ0ZXIgY2FsbCB0bworCWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLiAgU2V0IGRpc2FzbV9pbmZvLnN5bWJvbHMgdG8gYXJyYXkgb2YKKwlzeW1ib2xzIGF0IHRoZSBjdXJyZW50IGFkZHJlc3MuCisKK1dlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgorCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgorCitUdWUgRmViIDE3IDE4OjQwOjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYyAoY29tcGFyZV9zZWN0aW9uX2xtYSk6IFJlbmFtZSBmcm9tIF92bWEuCisgICAgICAgIChjb3B5X29iamVjdCk6IEdhcCBmaWxsIGJhc2VkIG9uIExNQSBub3QgVk1BLgorCSogYmludXRpbHMudGV4aTogVXBkYXRlIGFuZCBjbGFyaWZ5LgorCSogb2JqY29weS4xOiBMaWtld2lzZS4KKworVHVlIEZlYiAxNyAyMDozNDoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogR2VuZXJhdGUgX2ltcF9fJXMgYXMgd2VsbCBhcyBfX2ltcF8lcywKKwlmb3IgTWljcm9zb2Z0IGNvbXBhdGliaWxpdHkuCisJKG1ha2Vfb25lX2xpYl9maWxlKTogTGlrZXdpc2UuCisKKwkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBEb24ndCBhZGQgMSB0byBoaW50LgorCitGcmkgRmViIDEzIDE2OjM3OjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KKworVGh1IEZlYiAxMiAxNDoxMzo0NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRlZmxleC5sOiBBY2NlcHQgJz8nIGluIHN5bWJvbCBuYW1lcywgZm9yIFZDKysgbWFuZ2xlZCBuYW1lcy4KKwlGcm9tIE1pa2V5IDxqZWZmZGJAbmV0em9uZS5jb20+LgorCisJKiBhZGRyMmxpbmUuYyAodXNhZ2UpOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgorCSogYXIuYyAodXNhZ2UpOiBMaWtld2lzZS4KKwkqIG5sbWNvbnYuYyAoc2hvd191c2FnZSk6IExpa2V3aXNlLgorCSogbm0uYyAodXNhZ2UpOiBMaWtld2lzZS4KKwkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IExpa2V3aXNlLgorCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgorCSogb2JqZHVtcC5jICh1c2FnZSk6IExpa2V3aXNlLgorCSogc2l6ZS5jICh1c2FnZSk6IExpa2V3aXNlLgorCSogc3RyaW5ncy5jICh1c2FnZSk6IExpa2V3aXNlLgorCSogd2luZHJlcy5jICh1c2FnZSk6IExpa2V3aXNlLgorCSogYmludXRpbHMudGV4aSAoQnVnIFJlcG9ydGluZyk6IExpa2V3aXNlLgorCitTYXQgRmViICA3IDE1OjM2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCisKK1RodSBGZWIgIDUgMTI6MjE6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCisKK0ZyaSBKYW4gMzAgMTk6MTY6MjggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9UQVJHRVQsbmxtY29tdi5vKTogQ2hhbmdlIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKKwl0byB0cmFuc2Zvcm0uCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworVGh1IEphbiAyOSAxNjoyNDowNCAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KKworCSogZGxsdG9vbC5jOiBEZWZpbmUgZXhpdCBzdGF0dXMgbWFjcm9zIGZvciBfV0lOMzIgYnV0IG5vdAorCV9fQ1lHV0lOMzJfXy4KKwkoZ2VuX2xpYl9maWxlKTogQ2hlY2sgZm9yIGV4aXQgc3RhdHVzIG9mIHVubGluay4KKwkqIHJlc3JjLmM6IERlZmluZSBwb3BlbiBhbmQgcGNsb3NlIGlmIF9XSU4zMiBidXQgbm90CisJX19DWUdXSU4zMl9fLgorCitXZWQgSmFuIDI4IDE3OjQ1OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZW1vdmUgdmZvcmsgY2hlY2suCisJKiBubG1jb252LmM6IE5ldmVyIGluY2x1ZGUgdmZvcmsuaC4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGNvbmZpZy5pbjogUmVidWlsZC4KKworV2VkIEphbiAyOCAxNzo0MzowMiAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgorCisJKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IE9ubHkgcGFzcyBvbmUgYXJndW1lbnQgdG8gbWtkaXIgaWYKKwlfV0lOMzIgYnV0IG5vdCBfX0NZR1dJTjMyX18uCisJKHNtYXJ0X3JlbmFtZSk6IEFkZCBjb2RlIGZvciBfV0lOMzIgKG5vdCBfX0NZR1dJTjMyX18pLCB0byBjb3BlCisJd2l0aCBkaWZmZXJlbnQgcmVuYW1lIGJlaGF2aW91ciBhbmQgbGFjayBvZiBjaG93bi4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgbWluZ3czMiB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gYnVpbGQKKwlkbGx0b29sLgorCSogZGxsdG9vbC5jOiBOZXZlciBpbmNsdWRlIHZmb3JrLmguCisJKHJ1bik6IFVzZSBwZXhlY3V0ZSByYXRoZXIgdGhhbiB2Zm9yay4KKwkoZ2VuX2xpYl9maWxlKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIGFuZAorCWJmZF9jbG9zZS4gIENsb3NlIGFsbCB0aGUgQkZEcyBpbiB0aGUgYXJjaGl2ZSBiZWZvcmUgZGVsZXRpbmcgdGhlCisJdGVtcG9yYXJ5IGZpbGVzLgorCitUaHUgSmFuIDIyIDE2OjIyOjU1IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogQWRkIGZsYWcgSU5TTl9IQVNfUkVMT0MgdG8gdGVsbAorCWRpc2Fzc2VtYmx5IGZ1bmN0aW9uIHRoZXJlIGlzIGEgcmVsb2Mgb24gdGhpcyBsaW5lLgorCitXZWQgSmFuIDE0IDE1OjI5OjQzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHNyY29udi5jIChzaCwgaDgzMDApOiBEZWxldGUgdmFyaWFibGVzLgorCShhZGRyc2l6ZSwgdG9vbG5hbWUsIHJuYW1lcyk6IE5ldyB2YXJpYWJsZXMuCisJKHdyaXRlSU5UKTogVXNlIGFkZHJzaXplLgorCSh3cl91bik6IFVzZSB0b29sbmFtZS4KKwkod3JfaGQpOiBTZXQgdXAgYWRkcnNpemUgZXQgYWwgcHJvcGVybHkgZm9yIGg4MzAwW2hzXS4KKwkod2Fsa190cmVlX3N5bWJvbCk6IFplcm8gZHN5LiAgVXNlIHJuYW1lcy4KKwkod3JfdW4sIHdyX2hkLCB3cl9vYiwgd3JfZHUpOiBVc2UgcHJvcGVyIGJmZCBhY2Nlc3MgbWFjcm9zLgorCSogc3lzZHVtcC5jIChzaCwgaDgzMDApOiBEZWxldGUgdmFyaWFibGVzLgorCShhZGRyc2l6ZSk6IE5ldyB2YXJpYWJsZS4KKwkoZ2V0SU5UKTogVXNlIGl0LgorCShnZXRvbmUpOiBJbml0aWFsaXplIGl0LgorCShnZXRCSVRTKTogUmFuZ2UgY2hlY2sgb24gTUFYLgorCitNb24gRGVjIDI5IDE2OjU4OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gTWF0dGhldyBCZWxsYW50b25pIDxtYXR0aGV3QGNocnlzYWxpcy5jb20+OgorCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiBBZGQgZGVmYXVsdF9wb3NuYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCShyZXBsYWNlX21lbWJlcnMpOiBEZWZhdWx0IHRvIHJlcGxhY2luZyBpbiB0aGUgc2FtZSBwb3NpdGlvbi4KKworTW9uIERlYyAyMiAxMToyNzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJjbGV4Lmw6IERvbid0IHBlcm1pdCBhIGNvbW1hIGluIGEgU1RSSU5HLgorCSogcmNwYXJzZS55IChhY2NfZW50cnkpOiBXYXJuIGlmIGFuIGluYXBwcm9wcmlhdGUgbW9kaWZpZXIgaXMgdXNlZAorCXdpdGggYSBub24gVklSVEtFWS4KKwkoYWNjX2V2ZW50KTogRm9yIGEgY29udHJvbCBjaGFyYWN0ZXIsIHNldCBWSVJUS0VZLCBhbmQgZm9yY2UgdGhlCisJY2hhcmFjdGVyIHRvIHVwcGVyY2FzZS4KKwkoYWNjX29wdGlvbnMpOiBEb24ndCByZXF1aXJlIGEgY29tbWEgc2VwYXJhdG9yLgorCitUdWUgRGVjICA5IDEzOjI1OjQyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaXplLmMgKHNpemVfbnVtYmVyKTogTmV3IGZ1bmN0aW9uIHRvIHByb3ZpZGUgc2l6ZSBvZiBmaWVsZC4KKwkoe2wscn1wcmludF9udW1iZXIpOiBGb3Igb2N0YWwgYW5kIGhleCBmaWVsZHMsIHByaW50IGZpZWxkIHVzaW5nCisJJzAnIGFuZCAnMHgnIHN1ZmZpeGVzLiAgRG8gbm90IGluY2x1ZGUgZm9sbG93aW5nIHRhYi4KKwkoc3lzdl9pbnRlcm5hbF9zaXplcik6IFNpemUgc2VjdGlvbiBuYW1lLCBzZWN0aW9uIHNpemUsIGFuZCB2bWEKKwlhZGRyZXNzIGZpZWxkcy4KKwkoc3lzdl9pbnRlcm5hbF9wcmludGVyKTogVXNlIGNhbGN1bGF0ZWQgc2l6ZXMgZm9yIHRoZSBjb2x1bW5zLgorCShwcmludF9zeXN2X2Zvcm1hdCk6IFNpemUgY29sdW1ucyBiZWZvcmUgcHJpbnRpbmcuCisJKHByaW50X2JlcmtlbGV5X2Zvcm1hdCk6IFByaW50IHRhYnMgYmV0d2VlbiBudW1iZXJzIG5vdyB0aGF0CisJe2wscn1wcmludF9udW1iZXIgZG9lc24ndC4gIFByaW50IGZpZWxkcyByaWdodCBqdXN0aWZpZWQuCisKK01vbiBEZWMgIDggMTE6MjI6MDQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBSZW1vdmUgY2FsbCB0bworCWRpc2FzbV9zeW1hZGRyKCkgYXMgdGhpcyBmdW5jdGlvbiBubyBsb25nZXIgZXhpc3RzLgorCitUdWUgRGVjICAyIDEwOjIzOjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogQ2FsbCBkaXNhc21fc3ltYWRkcigpCisJdG8gYWxsb3cgYmFja2VuZCB0byBrbm93IHdoaWNoIHN5bWJvbCBoYXMganVzdCBiZWVuIGRpc3BsYXllZC4KKworVHVlIERlYyAgMiAxMzowNjo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHdpbmRyZXMuaCAoRVNDQVBFXyopOiBEZWZpbmUgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4KKwkqIHJjbGV4LmwgKGhhbmRsZV9xdW90ZXMpOiBIYW5kbGUgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4gIFdhcm4KKwlhYm91dCBhbiB1bnJlY29nbml6ZWQgZXNjYXBlIGNoYXJhY3Rlci4KKwkqIHdpbmRyZXMuYyAodW5pY29kZV9wcmludCk6IFByaW50IHN0YW5kYXJkIGVzY2FwZSBzZXF1ZW5jZXMuCisJKiByY3BhcnNlLnkgKGFjY19ldmVudCk6IEluaXRpYWxpemUgJCQubmV4dC4KKwkqIHJlc2Jpbi5jIChiaW5fdG9fcmVzX21lbnVpdGVtcyk6IERvbid0IHNldCBNRU5VSVRFTV9QT1BVUCBvcgorCU1FTlVJVEVNX0VORE1FTlUgaW4gdGhlIG1lbnUgaXRlbSBmbGFncy4KKwkoYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMpOiBBbGxvY2F0ZSBhIHN0cnVjdHVyZSAodGhlIG9sZCBjb2RlCisJbmV2ZXIgd29ya2VkKS4KKwkocmVzX3RvX2Jpbl9hY2NlbGVyYXRvcik6IENvcnJlY3QgdGhlIHRlc3QgZm9yIHNldHRpbmcgQUNDX0xBU1QuCisJKHJlc190b19iaW5fZGlhbG9nKTogU2F2ZSB0aGUgZXh0ZW5kZWQgc3R5bGUgcmF0aGVyIHRoYW4gc2F2aW5nCisJdGhlIHN0eWxlIHR3aWNlLiAgUmVtb3ZlIHVzZWxlc3Mgc2hhZG93aW5nIGxlbmd0aCB2YXJpYWJsZS4gIFNldAorCXRoZSBsZW5ndGggb2YgY29udHJvbCBkYXRhIGNvcnJlY3RseS4KKwkqIHJlc3JjLmMgKHdyaXRlX3JjX2RpYWxvZyk6IERvbid0IHByaW50IHRoZSBjbGFzcyBvciBtZW51IGlmIHRoZQorCXN0cmluZyBsZW5ndGggaXMgemVyby4KKworTW9uIE5vdiAyNCAxODo1Mjo0MyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9hcmd0eXBlcyk6IERvbid0IHRyeSB0byBwYXJzZSB0aGUgbmFtZSBvZiBhCisJZGVzdHJ1Y3RvciBhcyBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLgorCitNb24gTm92IDEwIDE3OjUxOjQxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBhZGRyMmxpbmUuYyAodHJhbnNsYXRlX2FkZHJlc3Nlcyk6IFVzZSBiZmRfc2Nhbl92bWEgcmF0aGVyCisJdGhhbiBzdHJ0b2wgdG8gc2NhbiBhZGRyZXNzZXMuCisKK1N1biBOb3YgIDkgMTE6MDE6MzEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5hbSAoYmluX1BST0dSQU1TKTogRG9uJ3QgdXNlIGxpbmUgY29udGludWF0aW9ucyBoZXJlLgorCitUdWUgTm92ICA0IDExOjU2OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChjb3B5X3NlY3Rpb24pOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyCisJaW5mb3JtYXRpb24gZm9yIGEgc2VjdGlvbi4KKworTW9uIE5vdiAgMyAxMjozNjoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYyAocGFyc2VfZmxhZ3MpOiBNYWtlIGZsYWcgY2hlY2sgY2FzZSBpbnNlbnNpdGl2ZS4KKwlDaGVjayBmb3IgYGNvbnRlbnRzJyBmbGFnLiAgR2l2ZSBhbiBlcnJvciBmb3IgdW5yZWNvZ25pemVkIGZsYWdzLgorCShjb3B5X3NlY3Rpb24pOiBJZiB0aGUgY29udGVudHMgZmxhZyB3YXMgc2V0IGZvciBhIHNlY3Rpb24gdGhhdAorCWhhZCBubyBjb250ZW50cywgemVybyBvdXQgdGhlIG5ldyBjb250ZW50cy4KKwkqIGJpbnV0aWxzLnRleGkgKG9iamNvcHkpOiBEb2N1bWVudCBjb250ZW50cyBzZWN0aW9uIGZsYWcuCisKK1N1biBOb3YgIDIgMTQ6NDk6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmM6IE1vdmUgbmV3IHN0cnVjdCBhbmQgdmFyaWFibGUgZGVmaW5pdGlvbnMgdG8gdG9wIG9mCisJZmlsZS4gIFJlbW92ZSBvYnNvbGV0ZSBhZGRfc3RyaXBfc3ltYm9sIGFuZCBpc19zdHJpcF9zeW1ib2wKKwlkZWNsYXJhdGlvbnMuICBBZGQgcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgYWRkX3NwZWNpZmljX3N5bWJvbAorCWFuZCBpc19zcGVjaWZpZWRfc3ltYm9sLgorCitNb24gT2N0IDIwIDE1OjMxOjQzIDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBjb25maWd1cmUuY29tIChIQVZFX1NCUkspOiBVbmRlZmluZS4KKworVHVlIE9jdCAxNCAxNjoxNDozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm5zCisJdHJ1ZSBpZiBhIHN5bWJvbCBjYW4gYmUgZm91bmQgYXQgdGhlIGFkZHJlc3MgcGFzc2VkIGluLgorCShkaXNhc3NlbWJsZV9kYXRhKTogU2V0IHRoZSBzeW1ib2xfYXRfYWRkcmVzc19mdW5jIGZpZWxkIHRvIHBvaW50CisJdG8gb2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcy4KKworRnJpIE9jdCAxMCAxNDoxMzowOSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMsIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogImxvY2FsaXplIiBpcyBhIGJldHRlciBuYW1lCisJdGhhbiAicHJpdmF0aXplIi4gIFVwZGF0ZSBhbGwgcmVmZXJlbmNlcy4KKworVGh1IE9jdCAgOSAxNTo1NzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLnRleGkgKHN0cmlwKTogUmVtb3ZlIGR1cGxpY2F0ZSAtLXRhcmdldC4gIEZyb20gTWFydHkKKwlMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KKworCSogbm0uYyAobGluZW5vX2NhY2hlX2JmZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KKwkobGluZW5vX2NhY2hlX3JlbF9iZmQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCisJKGRpc3BsYXlfYXJjaGl2ZSk6IENsZWFyIGxpbmVub19jYWNoZV9iZmQgYW5kIGxpbmVub19jYWNoZV9yZWxfYmZkCisJd2hlbiBjbG9zaW5nIGEgQkZELgorCShkaXNwbGF5X2ZpbGUpOiBMaWtld2lzZS4KKwkocHJpbnRfc3ltYm9sKTogVXNlIGxpbmVub19jYWNoZV9iZmQgYW5kIGxpbmVub19jYWNoZV9yZWxfYmZkCisJaW5zdGVhZCBvZiBjYWNoZV9iZmQgYW5kIGNhY2hlX3JlbF9iZmQuICBNYWtlIHNlY2NvdW50IHN0YXRpYywgYW5kCisJb25seSBzZXQgaXQgd2hlbiBzZXR0aW5nIHJlbG9jcy4KKworV2VkIE9jdCAgOCAyMToxOToxMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGtlZXBfc3BlY2lmaWNfbGlzdCwgcHJpdmF0aXplX3NwZWNpZmljX2xpc3QsCisJd2Vha2VuX3NwZWNpZmljX2xpc3QpOiBOZXcgdmFyaWFibGVzLgorCShrZWVwX3N5bWJvbHMpOiBSZW1vdmVkLgorCShhZGRfc3BlY2lmaWNfc3ltYm9sKTogTmV3IGZ1bmN0aW9uIGZyb20gdGhlIGNhcmNhcyBvZgorCWFkZF9zdHJpcF9zeW1ib2wuICBUYWtlcyBhIGxpc3QgYXMgYW4gYXJndW1lbnQuCisJKGlzX3NwZWNpZmllZF9zeW1ib2wpOiBMaWtld2lzZSBmcm9tIGlzX3N0cmlwX3N5bWJvbC4KKwkoZmlsdGVyX3N5bWJvbHMpOiBIb25vciB0aGUgbmV3IHByaXZhdGl6ZSBhbmQgd2Vha2VuIGxpc3RzLgorCU9wdGltaXplIGJmZF9hc3ltYm9sX25hbWUgaGFuZGxpbmcuCisJKGNvcHlfb2JqZWN0LCBjb3B5X29wdGlvbnMsIGNvcHlfdXNhZ2UpOiBBZGQgcHJpdmF0aXplLXN5bWJvbCAmCisJd2Vha2VuLXN5bWJvbCBvcHRpb25zLgorCisJKiBvYmpjb3B5LjEsIGJpbnV0aWxzLnRleGk6IFVwZGF0ZSBkb2NzLgorCitTdW4gT2N0ICA1IDA5OjA1OjQ0IDE5OTcgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IE1ha2UgIi0tcHJlZml4LWFkZHJlc3NlcyIKKyAJZGlzYXNzZW1ibHkgYWRqdXN0IHRvIG1peGVkLWxlbmd0aCBpbnN0cnVjdGlvbnMuCisJKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IEFkZCAiMHgiIHByZWZpeCBmb3IgaGV4YWRlY2ltYWwKKyAJc3ltYm9sLW9mZnNldHMgaW4gZGlzYXNzZW1ibHkuCisKK0ZyaSBPY3QgIDMgMTI6MDQ6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKHNldF90aW1lcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHJlcGxhY2luZworCW1ha2Vfc2FtZV9kYXRlcy4KKwkoc3RyaXBfbWFpbik6IElmIHByZXNlcnZlX2RhdGVzLCBzdGF0IHRoZSBpbnB1dCBmaWxlIGJlZm9yZQorCWNvcHlpbmcgaXQsIGFuZCBjYWxsIHNldF90aW1lcyBhZnRlcndhcmQuCisJKGNvcHlfbWFpbik6IExpa2V3aXNlLgorCisJKiB3cnN0YWJzLmMgKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogQ2FzdCBwIHRvCisJY2hhciAqIHdoZW4gY2FsbGluZyBzdHJjcHkgYW5kIHN0cmxlbi4KKworV2VkIFNlcCAyNCAxMTozNDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLnRleGkJKGFyIGNtZGxpbmUpOiBEb2N1bWVudCB0aGF0IHEgbm93IHdvcmtzIGxpa2Ugci4KKwlGcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgorCisJKiBiaW51dGlscy50ZXhpIChzaXplKTogVGhlIG9iamVjdCBmaWxlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLgorCUZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCisKKwkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIEF1ZyAyNiAxNzo0ODozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChFWEVFWFRfRk9SX0JVSUxEKTogTmV3IHZhcmlhYmxlLiAgVXNlIGl0IGluIGFsbAorCXJlZmVyZW5jZXMgdG8gdGhlIHN5c2luZm8gcHJvZ3JhbS4KKwkqIGNvbmZpZ3VyZS5pbjogUmVidWlsZCB3aXRoIG5ldyBiZmQvYWNpbmNsdWRlLm00LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBBdWcgIDggMTU6MzI6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3aW5kcmVzLmM6IEluY2x1ZGUgPHRpbWUuaD4uCisJKGRlZmluZV9yZXNvdXJjZSk6IFNldCBhIHRpbWVzdGFtcCBmb3IgdGhlIHJlc291cmNlLgorCitXZWQgQXVnICA2IDEzOjM3OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUIGluIGhlYWRlciBmaWxlLgorCSogYWNjb25maWcuaCAoVEFSR0VUKTogQWRkICN1bmRlZi4KKwkqIE1ha2VmaWxlLmFtICh2ZXJzaW9uLm8sIGJ1Y29tbS5vKTogUmVtb3ZlIHNwZWNpYWwgdGFyZ2V0cy4KKwkqIGJ1Y29tbS5jICh0YXJnZXQpOiBSZW1vdmUuCisJKiBubS5jIChwcm9ncmFtX25hbWUpOiBEb24ndCBkZWNsYXJlLgorCSh0YXJnZXQpOiBNYWtlIHN0YXRpYy4KKwkqIHNpemUuYyAodGFyZ2V0KTogTWFrZSBzdGF0aWMuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbiwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1R1ZSBBdWcgIDUgMDA6MDE6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IEV4cG9ydCByLgorCSguZGVwMSk6IFVzZSAkKElOQ0xVREVTKSByYXRoZXIgdGhhbiAkKEFMTF9DRkxBR1MpLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIG5sbWhlYWRlci55OiBVc2UgVkVSU0lPTksgcmF0aGVyIHRoYW4gVkVSU0lPTi4KKworCSogTWFrZWZpbGUuYW0gKFNUUklQX1BST0cpOiBDaGFuZ2UgZnJvbSBzdHJpcC5uZXcgdG8gc3RyaXAtbmV3LgorCShOTV9QUk9HKTogQ2hhbmdlIGZyb20gbm0ubmV3IHRvIG5tLW5ldy4KKwkoVE9PTF9QUk9HUywgaW5zdGFsbC1leGVjLWxvY2FsKTogQWRqdXN0IGFjY29yZGluZ2x5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK01vbiBBdWcgIDQgMTE6NDc6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBBQ19BUkdfUFJPR1JBTTsgaXQncyBpbnZva2VkIGJ5CisJQU1fSU5JVF9BVVRPTUFLRS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IENyZWF0ZSAkKHRvb2xkaXIpL2JpbiBiZWZvcmUKKwl0cnlpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBpbnRvIGl0LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIE1ha2VmaWxlLmFtIChUT09MX1BST0dTKTogVXNlIGFuIGV4cGxpY2l0ICQoRVhFRVhUKS4KKwkoaW5zdGFsbC1leGVjLWxvY2FsKTogV2hlbiBoYW5kbGluZyAkKG5vaW5zdF9QUk9HUkFNUyksIG9ubHkgdXNlCisJJChFWEVFWFQpIG9uIHRoZSBpbnN0YWxsZWQgZmlsZS4gIFdoZW4gaGFuZGxpbmcgJChUT09MX1BST0dTKSwKKwloYW5kbGUgJChFWEVFWFQpIGNvcnJlY3RseS4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGFuIGV4cGxpY2l0ICQoRVhFRVhUKSB3aGVuIHN1YnN0aXR1dGluZyBmb3IKKwl0aGUgbmFtZSBvZiBhIHByb2dyYW0gdG8gYnVpbGQuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggbmV3IGF1dG9tYWtlCisJcGF0Y2hlcy4KKworCSogZGVmbGV4LmwsIGRlZnBhcnNlLnk6IFVzZSBWRVJTSU9OSyByYXRoZXIgdGhhbiBWRVJTSU9OLgorCSogcmNsZXgubCwgcmNwYXJzZS55OiBMaWtld2lzZS4KKwkqIE1ha2VmaWxlLmFtICh3aW5kcmVzX1NPVVJDRVMpOiBBZGQgJChCVUxJQlMpLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBBdWcgIDEgMTM6MDg6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhY2luY2x1ZGUubTQ6IEluY2x1ZGUgYmZkL2FjaW5jbHVkZS5tNCwgbm90IGJmZC9hY21hY3Jvcy5tNC4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgorCitUaHUgSnVsIDMxIDExOjUxOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCisJKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgorCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQorCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQorCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCisJQUNfUFJPR19MRVgsIEFDX0RFQ0xfWVlURVNULCBBTV9NQUlOVEFJTkVSX01PREUsIEFNX0NZR1dJTjMyLCBhbmQKKwlBTV9FWEVFWFQuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoIEFNX1BST0dfSU5TVEFMTC4gIFJlbW92ZQorCXN0YW1wLWggaGFuZGxpbmcgaW4gQUNfT1VUUFVULgorCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgorCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCisJKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgorCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCisKKwlGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD46CisJKiByY3BhcnNlLnkgKGRpYWxvZyk6IERlZmF1bHQgbWVudSBhbmQgY2xhc3MgdG8gYmUgbmFtZWQuCisJKHN0eWxlcyk6IElmIEZPTlQgaXMgc2Vlbiwgc2V0IERTX1NFVEZPTlQgaW4gZGlhbG9nIHN0eWxlLgorCSogcmVzYmluLmMgKHJlc190b19iaW5fZGlhbG9nKTogQ29ycmVjdCBjb21wdXRhdGlvbiBvZiBmb250CisJaW5mb3JtYXRpb24gbGVuZ3RoLgorCitXZWQgSnVsIDMwIDExOjIxOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPjoKKwkqIHJlc2Jpbi5jIChyZXNfdG9fYmluX21lbnUpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIG1lbnUKKwl2cy4gbWVudWV4IGxlbmd0aC4KKwkqIHJlc3JjLmMgKGRlZmluZV9zdHJpbmd0YWJsZSk6IEFkZCAxIHRvIHJlc291cmNlIElELgorCitUdWUgSnVsIDI5IDExOjA2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVzYmluLmMgKGJpbl90b19yZXNfc3RyaW5nKTogQ29ycmVjdCBhZGp1c3RtZW50IG9mIGRhdGEgYW5kCisJbGVuZ3RoLiAgRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+LgorCitUdWUgSnVsIDIyIDE4OjAxOjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IENhbGwgbGliaWJlcnR5IHBleGVjdXRlIGZ1bmN0aW9uLgorCShwZXhlY3V0ZSkgW211bHRpcGxlIHZlcnNpb25zXTogUmVtb3ZlLgorCitUdWUgSnVsIDIyIDE2OjE5OjM0IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KKworCSogYnVjb21tLmMgKG1ha2VfdGVtcG5hbWUpOiBJZiB3ZSBtaWdodCBiZSB1c2luZyBhIERPUyBmaWxlc3lzdGVtLAorCWNoZWNrIGZvciBhIGJhY2tzbGFzaCBhcyB3ZWxsIGFzIGEgc2xhc2guCisKK1RodSBKdW4gMjYgMTM6NTM6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3aW5kcmVzLmMgKG1haW4pOiBRdWl0IGlmIHdlIGRpZG4ndCBnZXQgYW55IHJlc291cmNlcy4KKwkodXNhZ2UpOiBGaXggLS15eWRlYnVnIHVzYWdlIG1lc3NhZ2UuCisJKiByZXNjb2ZmLmMgKHdyaXRlX2NvZmZfZmlsZSk6IERvbid0IGZyZWUgdGhlIHJlbG9jYXRpb24gYXJyYXkKKwl1bnRpbCBhZnRlciB3ZSd2ZSBjbG9zZWQgdGhlIEJGRC4KKwkocmVhZF9jb2ZmX3JzcmMpOiBRdWl0IHJhdGhlciB0aGFuIHRyeSB0byByZWFkIHN0YW5kYXJkIGlucHV0LgorCSh3cml0ZV9jb2ZmX2ZpbGUpOiBRdWl0IHJhdGhlciB0aGFuIHRyeSB0byB3cml0ZSB0byBzdGFuZGFyZAorCW91dHB1dC4KKwkqIHJjcGFyc2UueTogQWRkIGEgY291cGxlIG9mIG1pc3Npbmcgc2VtaWNvbG9ucyAoYWNjZXB0ZWQgYnkgYmlzb24KKwlidXQgbm90IGJ5YWNjKS4KKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHdpbmRyZXMuCisKK1dlZCBKdW4gMjUgMjA6NTc6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZXNiaW4uYzogTmV3IGZpbGUuCisJKiByY2xleC5sLCByY3BhcnNlLnksIHJlc2NvZmYuYywgcmVzcmMuYywgd2luZHJlcy5jLCB3aW5kcmVzLmg6CisJTnVtZXJvdXMgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKENGSUxFUyk6IEFkZCByZXNiaW4uYy4KKwkoV0lORFJFU19PQkpTKTogQWRkIHJlc2Jpbi5vLgorCitTdW4gSnVuIDIyIDE3OjI5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZpcnN0IHN0YWIgYXQgV2luZG93cyByZXNvdXJjZSBjb21waWxlcjoKKwkqIHdpbmRyZXMuaDogTmV3IGZpbGUuCisJKiB3aW5kcmVzLmM6IE5ldyBmaWxlLgorCSogcmVzcmMuYzogTmV3IGZpbGUuCisJKiByY3BhcnNlLnk6IE5ldyBmaWxlLgorCSogcmNsZXgubDogTmV3IGZpbGUuCisJKiByZXNjb2ZmLmM6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgQlVJTERfV0lORFJFUy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKFdJTkRSRVNfUFJPRyk6IE5ldyB2YXJpYWJsZS4KKwkoUFJPR1MpOiBBZGQgQEJVSUxEX1dJTkRSRVNALgorCShIRklMRVMpOiBBZGQgZGxsdG9vbC5oIGFuZCB3aW5kcmVzLmguCisJKENGSUxFUyk6IEFkZCB3aW5kcmVzLmMgYW5kIHJlc3JjLmMuCisJKEdFTkVSQVRFRF9DRklMRVMpOiBBZGQgcmNwYXJzZS5jIGFuZCByY2xleC5jLgorCShXSU5EUkVTX09CSlMpOiBOZXcgdmFyaWFibGUuCisJJChXSU5EUkVTX1BST0cpOiBOZXcgdGFyZ2V0LgorCShyY3BhcnNlLmMsIHJjcGFyc2UuaCwgcmNsZXguYyk6IE5ldyB0YXJnZXRzLgorCitUaHUgSnVuIDEyIDEyOjI3OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChleHBvcnRfdHlwZSk6IEFkZCBkYXRhIGZpZWxkLgorCShkZWZfZXhwb3J0cyk6IEFkZCBkYXRhIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkoZHVtcF9kZWZfaW5mbyk6IFByaW50IGRhdGEgZmllbGQuCisJKGdlbl9kZWZfZmlsZSk6IExpa2V3aXNlLgorCShtYWtlX29uZV9saWJfZmlsZSk6IEhhbmRsZSBkYXRhIGZpZWxkIGJ5IG5vdCBlbWl0dGluZyBzaW1wbGUKKwlsYWJlbCBhbmQgbm90IGVtaXR0aW5nIGFueXRoaW5nIGluIFNFQ19URVhULgorCShkdGFiKTogUHJpbnQgZGF0YSBmaWVsZC4KKwkocHJvY2Vzc19kdXBsaWNhdGVzKTogTWVyZ2UgZGF0YSBmaWVsZC4KKwkqIGRsbHRvb2wuaCAoZGVmX2V4cG9ydHMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBkZWZwYXJzZS55IChleHBsaW5lKTogQWNjZXB0IG9wdF9EQVRBLiAgUGFzcyBpdCB0byBkZWZfZXhwb3J0cy4KKwkob3B0X0RBVEEpOiBOZXcgbm9uLXRlcm1pbmFsLgorCitXZWQgSnVuIDExIDE3OjE1OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5oOiBOZXcgZmlsZS4KKwkqIGRlZmxleC5sOiBJbmNsdWRlIGRsbHRvb2wuaCBhbmQgbGliaWJlcnR5LmguICBEb24ndCBkZWNsYXJlCisJc3RyZHVwLiAgVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgorCSogZGVmcGFyc2UueTogSW5jbHVkZSBiZmQuaCwgYnVjb21tLmgsIGFuZCBkbGx0b29sLmguCisJKiBkbGx0b29sLmM6IEluY2x1ZGUgZGxsdG9vbC5oIGFuZCB0aW1lLmguICBNYWtlIGEgbG90IG9mCisJdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgc3RhdGljLiAgTWFrZSBhIGxvdCBvZiBjaGFyICogdmFyaWFibGVzCisJYW5kIHBhcmFtZXRlcnMgY29uc3QuICBBZGQgZGVjbGFyYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgRG8KKwlzb21lIHJlaW5kZW50aW5nLiAgSGlkZSBtb3JlIFBvd2VyUEMgc3R1ZmYgaW5zaWRlIERMTFRPT0xfUFBDLgorCitXZWQgSnVuIDExIDEyOjA1OjUyIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwkqIGFyLmMgKGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlKTogQWRkIGNvbnN0LgorCitNb24gTWF5IDEyIDIyOjA5OjM1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQYXNzIENDX0ZPUl9UQVJHRVQgYW5kIENGTEFHU19GT1JfVEFSR0VUCisJdG8gcnVudGVzdC4KKworTW9uIE1heSAxMiAxMzoxNDoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2xlYXIgT1BDT0RFUyB3aGVuIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBpcworCXVzZWQgb24gSFAvVVguCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBBcHIgMjUgMTQ6MjI6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogQ2hhbmdlICouaW5mbyoKKwl0byBiaW51dGlscy5pbmZvKiB0byBzYXZlIHN5c3JvZmYuaW5mby4KKworVHVlIEFwciAxNSAxMzo0MjoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KKwkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCisJKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCisJZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nICQoSU5TVEFMTF9YRk9STSkgYW5kCisJJChJTlNUQUxMX1hGT1JNMSkuCisJKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbC1pbmZvKTogUnVuIG1raW5zdGFsbGRpcnMuCisKK01vbiBBcHIgMTQgMTE6NTI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCisKKwlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46CisJKiBNYWtlZmlsZS5pbjogQWx3YXlzIHVzZSAkKFNIRUxMKSB3aGVuIHJ1bm5pbmcgbW92ZS1pZi1jaGFuZ2UuCisJKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgQXByICA0IDEzOjI4OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgQUNfRlVOQ19BTExPQ0EuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKwkqIGJ1Y29tbS5oOiBBZGQgYWxsb2NhIGhhbmRsaW5nLCBjb3BpZWQgZnJvbSBnYXMvYXMuaC4KKwkqIGRsbHRvb2wuYzogQWRkICNwcmFnbWEgYWxsb2NhIGZvciBBSVggdG8gc3RhcnQgb2YgZmlsZS4KKwkqIG5sbWNvbnYuYzogTGlrZXdpc2UuCisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLiAgUmVtb3ZlCisJZXZlcnl0aGluZyB0aGF0IGNsZWFuIHJlbW92ZXMuCisKK1RodSBBcHIgIDMgMTM6MTg6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byAyLjguMS4KKworCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgorCitUdWUgQXByICAxIDE2OjIxOjQ0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBjb25maWd1cmUuY29tOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy5oLXZtczogUmVtb3ZlIGZpbGUuCisJKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBmb3IgbmV3IGNvbmZpZ3VyZSBzY2hlbWUuCisKK01vbiBNYXIgMzEgMTU6MzA6NDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogb2JqY29weS5jIChtYWtlX3NhbWVfZGF0ZXMpOiBVc2Ugc3RhdGJ1Ziwgbm90IGJ1ZiwgaWYgbm90CisJSEFWRV9HT09EX1VUSU1FX0guCisKK0ZyaSBNYXIgMjggMTc6NTc6NTMgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogRG9uJ3QgbGluayBhZ2FpbnN0IEJGRExJQiB0d2ljZS4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIGNvbW1vbmJmZGxpYi4gIElmIGl0IGlzIHNldCwKKwlzZXQgT1BDT0RFUyB0byBlbXB0eS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IE1hciAyNyAxNjowMzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcnR5IExlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+OgorCSogb2JqY29weS5jOiBJbmNsdWRlIDx1dGltZS5oPiBvciA8c3lzL3RpbWUuaD4uCisJKHN0cmlwX29wdGlvbnMpOiBBZGQgInByZXNlcnZlLWRhdGVzIi4KKwkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCisJKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC1wIGFuZCAtLXByZXNlcnZlLWRhdGVzLgorCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgorCShtYWtlX3NhbWVfZGF0ZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzdHJpcF9tYWluKTogSGFuZGxlIC1wLgorCShjb3B5X21haW4pOiBMaWtld2lzZS4KKwkqIGJpbnV0aWxzLnRleGksIHN0cmlwLjEsIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KKworCWFkZHIybGluZS5jIGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyCisJPFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlPjoKKwkqIGFkZHIybGluZS5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKEFERFIyTElORV9QUk9HKTogTmV3IHZhcmlhYmxlLgorCShNQU5QQUdFUyk6IEFkZCBhZGRyMmxpbmUuCisJKFBST0dTKTogQWRkICQoQUREUjJMSU5FX1BST0cpLgorCShDRklMRVMpOiBBZGQgYWRkcjJsaW5lLmMuCisJKCQoQUREUjJMSU5FX1BST0cpKTogTmV3IHRhcmdldC4KKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGFkZHIybGluZS4KKwkqIGFkZHIybGluZS4xOiBOZXcgZmlsZS4KKworCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlLgorCitNb24gTWFyIDI0IDEwOjUyOjQ1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBleGl0IGlmIGEgZmlsZSBjYW5ub3QgYmUKKwlkaXNhc3NlbWJsZWQsIGluc3RlYWQganVzdCByZXR1cm4uCisKK1RodSBNYXIgMjAgMjE6MTY6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaXplLmMgKHVzYWdlKTogTWFrZSBkZWZpbml0aW9uIG1hdGNoIGl0cyBwcm90b3R5cGUuCisJKGRpc3BsYXlfYmZkLCBscHJpbnRfbnVtYmVyLCBycHJpbnRfbnVtYmVyKTogTGlrZXdpc2UuCisJKHByaW50X2JlcmtlbGV5X2Zvcm1hdCwgc3lzdl9pbnRlcm5hbF9wcmludGVyKTogTGlrZXdpc2UuCisJKHByaW50X3N5c3ZfZm9ybWF0KTogTGlrZXdpc2UuCisJKiBubS5jIChzZXRfcHJpbnRfcmFkaXgsIHNldF9vdXRwdXRfZm9ybWF0KTogTGlrZXdpc2UuCisJKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IExpa2V3aXNlLgorCitUdWUgTWFyIDE4IDE2OjM5OjU1IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgorCisJKiBNYW55IGZpbGVzOiBBZGQgZnVuY3Rpb24gcHJvdG90eXBlcy4KKwkqIGFyLmMgKG1yaV9lbXVsLCBnZXRfcG9zX2JmZCk6IE1ha2Ugc3RhdGljLgorCSogYXJsZXgubDogSW5jbHVkZSAibGliaWJlcnR5LmgiLiAgRG9uJ3QgZGVjbGFyZSBzdHJkdXAuICBVc2UKKwl4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KKwkqIGFycGFyc2UueSAoeXllcnJvcik6IE1ha2UgYXJndW1lbnQgY29uc3QuICBDb3JyZWN0IHR5cG8uCisJKiBhcnN1cC5jIChzdHJkdXApOiBEb24ndCBkZWNsYXJlLgorCShhcl9zYXZlKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgorCSogZmlsZW1vZGUuYzogSW5jbHVkZSAiYnVjb21tLmgiLgorCSogbm0uYyAodXNhZ2UpOiBNYWtlIHN0YXRpYy4KKwkocHJpbnRfc3ltbmFtZSk6IE1ha2UgZm9ybWF0IGFuZCBuYW1lIGNvbnN0LgorCSogb2JqY29weS5jIChjYXQpOiBSZW1vdmUuCisJKGNvcHlfYXJjaGl2ZSk6IE1ha2Ugb3V0cHV0X3RhcmdldCBjb25zdC4gIFVzZSBjb25jYXQsIG5vdCBjYXQuCisJKGNvcHlfZmlsZSwgc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSk6IE1ha2UgYXJndW1lbnRzIGNvbnN0LgorCSogb2JqZHVtcC5jIChyZWFkX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KKwkocHJpbnRfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgorCShkaXNwbGF5X3RhcmdldF90YWJsZXMpOiBEb24ndCBkZWNsYXJlIGdldGVudi4KKwkqIHN0cmluZ3MuYyAoc3RyaW5nc19vYmplY3RfZmlsZSk6IENoYW5nZSBmaWxlIHRvIGNvbnN0LgorCShwcmludF9zdHJpbmdzKTogQ2hhbmdlIGZpbGVuYW1lIHRvIGNvbnN0LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCitUdWUgTWFyIDE4IDExOjM3OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KS4KKwkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVi4KKwkqIGJ1Y29tbS5oIChnZXRlbnYpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisJKiBubG1jb252LmMgKGdldGVudik6IERvbid0IGRlY2xhcmUuCisKKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKworU2F0IE1hciAxNSAxNTozNTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSmFtaWUgTG9raWVyIDxqYW1pZUByZWJlbGxpb24uY28udWs+OgorCSogb2JqZHVtcC5jOiBJbmNsdWRlICJkZW1hbmdsZS5oIi4KKwkoZG9fZGVtYW5nbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCSh1c2FnZSk6IE1lbnRpb24gLUMvLS1kZW1hbmdsZS4KKwkobG9uZ19vcHRpb25zKTogQWRkICJkZW1hbmdsZSIuCisJKG9iamR1bXBfcHJpbnRfc3ltbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IFVzZSBvYmpkdW1wX3ByaW50X3N5bW5hbWUuCisJKGRpc2Fzc2VtYmxlX2J5dGVzKTogTGlrZXdpc2UuCisJKGR1bXBfcmVsb2Nfc2V0KTogTGlrZXdpc2UuCisJKGR1bXBfc3ltYm9scyk6IERlbWFuZ2xlIHN5bWJvbCBuYW1lLgorCShtYWluKTogSGFuZGxlIC1DLgorCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtQy8tLWRlbWFuZ2xlLgorCisJKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiAtLW5vLXNob3ctcmF3LWluc24uCisJKGxvbmdfb3B0aW9ucyk6IEFkZCAibm8tc2hvdy1yYXctaW5zbiIuCisJKGRpc2Fzc2VtYmxlX2J5dGVzKTogSGFuZGxlIC0tbm8tc2hvdy1yYXctaW5zbi4KKwkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1uby1zaG93LXJhdy1pbnNuLgorCitXZWQgTWFyIDEyIDExOjQyOjAwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiByZGRiZy5jIChmcmVlX3NhdmVkX3N0YWJzKTogU2V0IHRoZSBzdHJpbmdzIHRvIE5VTEwgYWZ0ZXIgYmVpbmcKKwlmcmVlZC4KKworRnJpIEZlYiAyOCAxNzoxODo0NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJ1Y29tbS5jIChzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0KTogTmV3IGZ1bmN0aW9uLgorCSogYnVjb21tLmggKHNldF9kZWZhdWx0X2JmZF90YXJnZXQpOiBEZWNsYXJlLgorCSogYXIuYyAobWFpbik6IENhbGwgc2V0X2RlZmF1bHRfYmZkX3RhcmdldC4KKwkqIG5sbWNvbnYuYyAobWFpbik6IExpa2V3aXNlLgorCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgorCSogb2JqY29weS5jIChtYWluKTogTGlrZXdpc2UuCisJKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHNpemUuYyAobWFpbik6IExpa2V3aXNlLgorCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbiAoYnVjb21tLm8pOiBOZXcgdGFyZ2V0LCB0byBkZWZpbmUgVEFSR0VULgorCitUdWUgRmViIDI1IDIxOjI4OjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChhZGp1c3Rfc2VjdGlvbl92bWEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCSh1c2FnZSk6IE1lbnRpb24gLS1hZGp1c3Qtc2VjdGlvbi12bWEuCisJKE9QVElPTl9BREpVU1RfVk1BKTogRGVmaW5lLgorCShsb25nX29wdGlvbnMpOiBBZGQgImFkZGp1c3Qtdm1hIi4KKwkoZGlzcGxheV9iZmQpOiBJZiBhZGp1c3Rfc2VjdGlvbl92bWEgaXMgbm90IDAsIGFkZCBpdCB0byBhbGwgdGhlCisJc2VjdGlvbiBhZGRyZXNzZXMuCisJKG1haW4pOiBIYW5kbGUgT1BUSU9OX0FESlVTVF9WTUEuCisJKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tYWRqdXN0LXZtYS4KKworRnJpIEZlYiAxNCAxODo0Njo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG5tLmMgKHByaW50X3N5bWJvbCk6IENhY2hlIHRoZSBCRkQgYXMgd2VsbCBhcyB0aGUgc3ltYm9scyBhbmQKKyAJcmVsb2NzLCBhbmQgZG9uJ3QgdHJ5IHRvIHVzZSB0aGUgc3ltYm9scyBvciByZWxvY3Mgd2l0aCBhCisgCWRpZmZlcmVudCBCRkQuCisKK1RodSBGZWIgMTMgMjE6MzQ6NDMgMTk5NyAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCisKKwkqIGNvbmZpZy5oLXZtczogc2JyaygpIGlzIHByb3ZpZGVkIG9uIG9wZW5WTVMvQWxwaGEuCisJKiBtYWtlZmlsZS52bXM6IGFsbG93IGNvbXBpbGluZyB3aXRoIGN1cnJlbnQgZ2NjIHNuYXBzaG90LgorCitUaHUgRmViIDEzIDIwOjE0OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXJzdXAuYywgY29mZmdyb2suYywgZGxsdG9vbC5jLCBubG1jb252LmM6IFVzZSB4bWFsbG9jIHJhdGhlcgorCXRoYW4gbWFsbG9jLgorCitXZWQgRmViIDEyIDE2OjEyOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQ29ycmVjdCBWTUEgYXJndW1lbnQgdG8KKwlmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcy4gIEltcHJvdmUgaGFuZGxpbmcgb2YgY29kZSB3aXRoIG5vIHN5bWJvbAorCWZvbGxvd2VkIGJ5IGNvZGUgd2l0aCBhIHN5bWJvbC4KKworV2VkIEZlYiAxMiAxMjoxNjo0NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IE1ha2Ugb3V0cHV0IG9mIHJhdyBpbnN0cnVjdGlvbnMKKwl3b3JrIGJldHRlciBmb3Igbm9uLXN0YW5kYXJkIHZhbHVlcyBvZiBieXRlc19wZXJfY2h1bmsgYW5kCisJYnl0ZXNfcGVyX2xpbmUuCisKK1RodSBGZWIgIDYgMTQ6MTQ6NTkgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBZGRlZCBjb2RlIHRvIGFsbG93IHNvbWUgY29udHJvbAorIAlvdmVyIHRoZSB3YXkgcmF3IGluc3RydWN0aW9ucyBhcmUgZGlzcGxheWVkLgorCitUaHUgRmViICA2IDEyOjM2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAoc3RydWN0IGJpbmNsX2ZpbGUpOiBBZGQgbmV4dF9zdGFjayBmaWVsZC4KKwkocHVzaF9iaW5jbCk6IFB1dCB0aGUgbmV3IGZpbGUgb24gYm90aCBiaW5jbF9saXN0IGFuZAorCWJpbmNsX3N0YWNrLiAgQ2xlYXIgdGhlIGZpbGVfdHlwZXMgZmllbGQuCisJKHBvcF9iaW5jbCk6IFVzZSB0aGUgbmV4dF9zdGFjayBmaWVsZCB3aGVuIHBvcHBpbmcgdGhlIHN0YWNrLgorCURvbid0IHB1dCB0aGUgZmlsZSBvbiBiaW5jbF9saXN0LgorCShmaW5kX2V4Y2wpOiBJbmNsdWRlIHRoZSBmaWxlIG5hbWUgd2hlbiB3YXJuaW5nIGFib3V0IGFuIHVuZm91bmQKKwlOX0VYQ0wuCisKKwkqIGRlYnVnLmMgKGRlYnVnX3R5cGVfc2FtZXApOiBEb24ndCBjcmFzaCBpZiB3ZSBhcmUgcGFzc2VkIE5VTEwuCisKK1RodSBGZWIgIDYgMTE6NTQ6MjQgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBvYmpjb3B5LjE6IEFkZCBtaXNzaW5nIHNwYWNlIGFmdGVyIC5CLgorCitGcmkgSmFuIDMxIDEwOjMzOjA3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBJbml0aWFsaXplIGBhdXgucmVxdWlyZV9zZWMnLgorCitXZWQgSmFuIDI5IDEzOjIxOjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogQWRkIHNraXBfemVyb2VzIHBhcmFtZXRlci4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IExpa2V3aXNlLiAgQ2FsbCBvYmpkdW1wX3ByaW50X3ZhbHVlCisJdG8gcHJpbnQgYWRkcmVzcy4KKwkob2JqZHVtcF9wcmludF9hZGRyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSnVzdCBjYWxsIG9iamR1bXBfcHJpbnRfYWRkci4KKwkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBQcmludCByZWFsIGFkZHJlc3MsIG5vdCBmdW5jdGlvbiBvZmZzZXQuCisJU2tpcCBhIGNlcnRhaW4gbnVtYmVyIG9mIGxlYWRpbmcgemVyb2VzLgorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX3plcm9lcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHVzYWdlKTogTWVudGlvbiAtLWRpc2Fzc2VtYmxlLXplcm9lcy4KKwkobG9uZ19vcHRpb25zKTogQWRkICJkaXNhc3NlbWJsZS16ZXJvZXMiLgorCShkaXNhc3NlbWJsZV9ieXRlcyk6IENoZWNrIGRpc2Fzc2VtYmxlX3plcm9lcy4KKworVHVlIEphbiAyOCAxNjo0NzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBEb24ndCBza2lwIHplcm9lcyBpZiB0aGUKKwlkaXNhc3NlbWJsZXIgaGFzIHRvbGQgdXMgdGhhdCB3ZSBhcmUgaW4gYSBicmFuY2ggZGVsYXkgc2xvdC4KKworTW9uIEphbiAyMCAxNDoyNDowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNpemUuYyAoYmVya2VsZXlfc3VtKTogUmV3cml0ZS4gIFNraXAgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAorCVNFQ19BTExPQy4gIENvdW50IFNFQ19SRUFET05MWSBzZWN0aW9ucyBhcyB0ZXh0LgorCitUdWUgSmFuIDE0IDE1OjE0OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogUmVtb3ZlICouaW5mbyosIG5vdAorCWp1c3QgKi5pbmZvLiAgRnJvbSBILkouIEx1IDxoamxAbHVjb24ub3JnPi4KKworVHVlIERlYyAzMSAxNTo0Mjo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCisKK0ZyaSBEZWMgMjcgMTE6MTk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFdvcmsgYXJvdW5kIGJ1ZyBpbiBBQ19GVU5DX1ZGT1JLIGluIGF1dG9jb25mIDIuMTIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBEZWMgMTkgMTM6MTE6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQmFzZWQgb24gcGF0Y2ggZnJvbSBBbmRyZXcgSiBLbG9zc25lciA8YW5kcmV3QHBvZ28ud3YudGVrLmNvbT46CisJKiBvYmpjb3B5LmMgKE9QVElPTl9XRUFLRU4pOiBEZWZpbmUuCisJKGNvcHlfb3B0aW9ucyk6IEFkZCAid2Vha2VuIi4KKwkoY29weV91c2FnZSk6IE1lbnRpb24gLS13ZWFrZW4uCisJKHdlYWtlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGZpbHRlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWtlbi4KKwkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIHdlYWtlbi4KKwkoY29weV9tYWluKTogSGFuZGxlIE9QVElPTl9XRUFLRU4uCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0td2Vha2VuLgorCitXZWQgRGVjIDE4IDIyOjQ5OjEzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCisKK1NhdCBEZWMgIDcgMTA6MTc6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEFkZCAiZWxzZSB0cnVlIiBjbGF1c2UgdG8gY2F0ZXIgdG8KKwlicm9rZW4gIm1ha2UiIG9uIHNvbWUgc3lzdGVtcy4KKworRnJpIERlYyAgNiAxNzoyMTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAocGFyc2VfaWVlZV9iYik6IEFsd2F5cyBpbml0aWFsaXplIG5hbWNvcHkgdG8gYXZvaWQgZ2NjCisJd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgorCShpZWVlX3JlYWRfY3h4X2NsYXNzKTogTGlrZXdpc2UsIGZvciBwZi4KKwkoaWVlZV9lbnVtX3R5cGUpOiBMaWtld2lzZSwgZm9yIGkuCisKK1R1ZSBOb3YgMjYgMTc6MDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cnN0YWJzLmMgKHN0YWJfYXJyYXlfdHlwZSk6IEFkZCBjYXN0cyB3aGVuIHByaW50aW5nCisJYmZkX3NpZ25lZF92bWEgdmFsdWVzLgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgorCitNb24gTm92IDI1IDE2OjUzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgY3Jhc2ggaWYgdGhlcmUgaXMgbm8KKwlzeW1ib2wuCisKK0ZyaSBOb3YgMjIgMTc6Mjk6MTQgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGFyLmMgKG9wZW5faW5hcmNoKTogRG9uJ3QgY2FsbCBiZmRfb3BlbnIgd2l0aCBhIG51bGwgbmFtZS4KKworRnJpIE5vdiAgMSAxMjowODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLnRleGk6IEFkZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgorCitUaHUgT2N0IDMxIDE4OjIwOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGJpbmNsX2xpc3QgZmllbGQuCisJKHBhcnNlX3N0YWIpOiBQYXNzIHZhbHVlIHRvIHB1c2hfYmluY2wuICBDYWxsIGZpbmRfZXhjbCBmb3IKKwlOX0VYQ0wuCisJKHN0cnVjdCBiaW5jbF9maWxlKTogQWRkIGhhc2gsIGZpbGUgYW5kIGZpbGVfdHlwZXMgZmllbGRzLgorCShwdXNoX2JpbmNsKTogQWRkIGhhc2ggcGFyYW1ldGVyLiAgU2F2ZSBpdCBpbiB0aGUgbmV3IGhhc2ggZmllbGQuCisJU2F2ZSB0aGUgZmlsZSBudW1iZXIgaW4gdGhlIG5ldyBmaWxlIGZpZWxkLgorCShwb3BfYmluY2wpOiBQdXQgdGhlIGJpbmNsX2ZpbGUgb24gYmluY2xfbGlzdCwgcmF0aGVyIHRoYW4gZnJlZWluZworCWl0LiAgU2F2ZSB0aGUgZmlsZSB0eXBlcyBpbiB0aGUgbmV3IGZpbGVfdHlwZXMgZmllbGQuCisJKGZpbmRfZXhjbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKKwkqIGllZWUuYyAoaWVlZV9saW5lbm8pOiBEb24ndCBjb21wYXJlIGxpbmUgbnVtYmVyIGFkZHJlc3NlcyB0bworCWluZm8tPmhpZ2hhZGRyICh1bmRvIHBhcnQgb2YgT2N0b2JlciAyOCBwYXRjaCkuCisKK1R1ZSBPY3QgMjkgMTY6NDA6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBEb24ndCBwcmludCB0aGUgZW1wdHkgc3RyaW5nCisJZm9yIHplcm8uCisKK01vbiBPY3QgMjggMTY6NTg6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgZnVuY3Rpb25fZW5kIGZpZWxkLgorCShzdGFydF9zdGFiKTogSW5pdGlhbGl6ZSBmdW5jdGlvbl9lbmQuCisJKGZpbmlzaF9zdGFiKTogUGFzcyBpbmZvLT5mdW5jdGlvbl9lbmQgdG8gZGVidWdfZW5kX2Z1bmN0aW9uLgorCShwYXJzZV9zdGFiKTogSWYgaW5mby0+ZnVuY3Rpb25fZW5kIGlzIHNldCwgdXNlIGl0IGFzIHRoZSBhZGRyZXNzCisJd2hpY2ggZW5kcyBhIGZ1bmN0aW9uLgorCisJKiBpZWVlLmMgKGllZWVfYXJyYXlfdHlwZSk6IFJlbWVtYmVyIHRoZSBjb3JyZWN0IHNpemUuCisKKwkqIGllZWUuYyAoaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCk6IFBlcm1pdCBjb2FsZXNjaW5nIHJhbmdlcworCXRoYXQgYXJlIHVwIHRvIDB4MTAwMCBieXRlcyBhcGFydCwgbm90IGp1c3QgNjQuCisJKGllZWVfYWRkX2JiMTFfYmxvY2tzKTogRG9uJ3QgYm90aGVyIHRvIGVtaXQgYSBCQjExIHRoYXQgaXMgbGVzcworCXRoYW4gMHgxMDAgYnl0ZXMuCisJKGllZWVfbGluZW5vKTogT25seSBlbWl0IGxpbmUgbnVtYmVycyB0aGF0IGFyZSBsZXNzIHRoYW4KKwlpbmZvLT5oaWdoYWRkci4KKworRnJpIE9jdCAyNSAxMjoxMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAoc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtKTogQWRkIGRlZmluZWQgZmllbGQuCisJKGllZWVfZW51bV90eXBlKTogSWYgdGhlIGVudW0gdGFnIGhhcyBiZWVuIHNlZW4gYmVmb3JlIGJ1dCBub3QKKwlkZWZpbmVkLCByZXVzZSB0aGUgc2FtZSB0eXBlIGluZGV4LCBhbmQgZGVmaW5lIGl0LgorCShpZWVlX3RhZ190eXBlKTogSWYgdGhpcyBlbnVtIGhhcyBub3QgYmVlbiBkZWZpbmVkLCBhZGQgYW4KKwl1bmRlZmluZWQgZW50cnkgdG8gdGhlIGxpc3Qgb2YgZW51bXMuCisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMZXQgdGhlIGRpc2Fzc2VtYmxlciBvdmVycmlkZSB0aGUKKwludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCBvbiBhIGxpbmUuCisKK1RodSBPY3QgMjQgMTY6NDI6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKHByZWZpeF9hZGRyZXNzZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShsb25nX29wdGlvbnMpOiBBZGQgInByZWZpeC1hZGRyZXNzZXMiLgorCShjb21wYXJlX3N5bWJvbHMpOiBTb3J0IEJTRl9GVU5DVElPTiBzeW1ib2xzIGJlZm9yZSBvdGhlcgorCXN5bWJvbHMuCisJKGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgorCW9iamR1bXBfcHJpbnRfYWRkcmVzcy4KKwkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgorCW9iamR1bXBfcHJpbnRfYWRkcmVzcy4KKwkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ2FsbCBuZXcgZnVuY3Rpb25zLgorCShkaXNhc3NlbWJsZV9ieXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKKwlkaXNhc3NlbWJsZV9kYXRhLiAgQ2hhbmdlIGRpc2Fzc2VtYmx5IGZvcm1hdCwgdW5sZXNzCisJcHJlZml4X2FkZHJlc3NlcyBpcyBzZXQuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIGRpc2Fzc2VtYmxlX2J5dGVzLiAgVW5sZXNzCisJcHJlZml4X2FkZHJlc3NlcyBpcyBzZXQsIGRpc2Fzc2VtYmxlIGluIGNodW5rcyBoZWFkZWQgYnkgYQorCXN5bWJvbC4KKwkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1wcmVmaXgtYWRkcmVzc2VzLgorCisJKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBQcmVzZXJ2ZSB0aGUKKwliYWNrc2xhc2ggd2hlbiBjb25jYXRlbmF0aW5nIG11bHRpcGxlIHN0YWJzIHN0cmluZ3MuCisKK1RodSBPY3QgMTAgMTE6MzY6MzEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChzY2FuX29wZW5fb2JqX2ZpbGUpOiBGaXggbG9vcCBleGl0IHRlc3QuCisJQWRkIG1pc3NpbmcgcGFyYW1ldGVyIHRvIGRlZl9leHBvcnRzLgorCitUdWUgT2N0ICA4IDEyOjA2OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKExFWF9PUFRJT05TKTogU2V0IHRvIGVtcHR5IHN0cmluZy4gIC1JIC1DZW0gaXMgdGhlCisJZGVmYXVsdCBmb3IgZmxleCwgYW5kIGlzIG5vdCByZWNvZ25pemVkIGJ5IGxleC4KKworVGh1IE9jdCAgMyAxNzo0MToyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLnRleGkgKFRhcmdldCBTZWxlY3Rpb24pOiBEb2N1bWVudCB0aGF0IHlvdSBjYW4gbm93CisJc3BlY2lmeSB0YXJnZXRzIHVzaW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMuCisKKwkqIGFyLmMgKHVzYWdlKTogRGVjbGFyZS4gIE1ha2Ugc3VyZSBhbGwgY2FsbGVycyBwYXNzIGFuIGFyZ3VtZW50LgorCitUaHUgT2N0ICAzIDE1OjM5OjQyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCitXZWQgT2N0ICAyIDE1OjQ5OjE2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IEJ1bXAgdmVyc2lvbiBkYXRlLgorCitUdWUgT2N0ICAxIDE1OjAwOjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogdmVyc2lvbi5jIChwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgorCSogYnVjb21tLmggKHByaW50X3ZlcnNpb24pOiBEZWNsYXJlLgorCSogYXIuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KKwkoZG9fc2hvd192ZXJzaW9uKTogUmVtb3ZlLgorCSh1c2FnZSk6IEFkZCBoZWxwIHBhcmFtZXRlci4gIFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KKwkobWFpbik6IFNldCBpc19yYW5saWIgYXQgc3RhcnQuICBDaGVjayBmb3IgLS1oZWxwIGFuZCAtLXZlcnNpb24uCisJQ2FsbCBwcmludF92ZXJzaW9uLCBub3QgZG9fc2hvd192ZXJzaW9uLgorCSogbmxtY29udi5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgorCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgorCShzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgorCSogbm0uYyAocHJvZ3JhbV92ZXJzaW9uLCBwcmludF92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KKwkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCisJKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCisJKiBvYmpjb3B5LmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCisJKGNvcHlfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCisJKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCisJKHN0cmlwX21haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCisJKGNvcHlfbWFpbik6IExpa2V3aXNlLgorCSogb2JqZHVtcC5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgorCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KKwkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KKwkqIHNpemUuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KKwkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCisJKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCisJKiBzdHJpbmdzLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCisJKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCisJKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgorCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisKK1RodSBTZXAgMTkgMTQ6NTM6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmM6IFJldmVydCBNb25kYXkncyByZWZsb2NhbHAgcGF0Y2gsIGFuZCBhcHBseSB0aGlzIHBhdGNoCisJaW5zdGVhZDoKKyAJKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBXcml0ZSBhIGR1bW15IHR5cGUgYXQgdGhlIGVuZCBvZiB0aGUKKwlnbG9iYWwgdHlwZSBibG9jay4KKworTW9uIFNlcCAxNiAxNTozMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAoc3RydWN0IGllZWVfd3JpdGVfdHlwZSk6IEFkZCByZWZsb2NhbHAgZmllbGQuCisJKGllZWVfcG9pbnRlcl90eXBlKTogU2V0IHJlZmxvY2FscCBhZnRlciBwdXNoaW5nIHR5cGUuCisJKGllZWVfZnVuY3Rpb25fdHlwZSk6IElmIHJlZmxvY2FscCBpcyBzZXQsIG1ha2UgdGhpcyB0eXBlIGxvY2FsLgorCShpZWVlX3JhbmdlX3R5cGUsIGllZWVfYXJyYXlfdHlwZSwgaWVlZV9zZXRfdHlwZSk6IExpa2V3aXNlLgorCShpZWVlX2NvbnN0X3R5cGUsIGllZWVfdm9sYXRpbGVfdHlwZSk6IExpa2V3aXNlLgorCShpZWVlX3N0cnVjdF9maWVsZCwgaWVlZV9jbGFzc19iYXNlY2xhc3MpOiBMaWtld2lzZS4KKworCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIGdsb2JhbF90eXBlcyBmaWVsZC4KKwkocGFyc2VfaWVlZV9iYik6IFdoZW4gc3RhcnRpbmcgYSBCQjEsIGluaXRpYWxpemUgdGhlIHR5cGVzIGZpZWxkCisJdG8gdGhlIGdsb2JhbF90eXBlcyBmaWVsZC4KKwkocGFyc2VfaWVlZV9iZSk6IFdoZW4gZW5kaW5nIGEgQkIyLCBjb3B5IHRoZSB0eXBlcyBmaWVsZCB0byB0aGUKKwlnbG9iYWxfdHlwZXMgZmllbGQuCisKK0ZyaSBTZXAgMTMgMTc6MzI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGNoYW5nZV9sZWFkaW5nX2NoYXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUik6IERlZmluZS4KKwkoY29weV9vcHRpb25zKTogQWRkICJjaGFuZ2UtbGVhZGluZy1jaGFyIi4KKwkoY29weV91c2FnZSk6IE1lbnRpb24gLS1jaGFuZ2UtbGVhZGluZy1jaGFyLgorCShmaWx0ZXJfc3ltYm9scyk6IEFkZCBvYmZkIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwlJbXBsZW1lbnQgY2hhbmdlX2xlYWRpbmdfY2hhci4KKwkoY29weV9vYmplY3QpOiBDYWxsIGZpbHRlcl9zeW1ib2xzIGlmIGNoYW5nZV9sZWFkaW5nX2NoYXIuCisJKGNvcHlfbWFpbik6IEhhbmRsZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUi4KKwkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1jaGFuZ2UtbGVhZGluZy1jaGFyLgorCitUdWUgU2VwICAzIDE0OjA1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX2VudW1fdHlwZSk6IERvbid0IGNoZWNrIGluZGV4IGludG8gYSBOVUxMIG5hbWVzCisJYXJyYXkuCisJKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6IEFsd2F5cyBpbml0aWFsaXplIG5leHQuCisJKiByZGNvZmYuYyAocGFyc2VfY29mZl90eXBlKTogV2FybiBhYm91dCBhbiBpbmNvbXByZWhlbnNpYmxlCisJdHlwZSByYXRoZXIgdGhhbiBjcmFzaGluZy4KKwkqIHJkZGJnLmMgKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogSW5pdGlhbGl6ZSBmLgorCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogU2V0IGNvbnRleHQgaW4gYWxsIGNhc2VzLgorCitUaHUgQXVnIDI5IDE2OjU2OjUyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1RodSBBdWcgMjkgMTE6Mjk6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKExfdG1wbmFtKTogTmV2ZXIgZGVmaW5lLgorCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIGNob29zZV90ZW1wX2Jhc2UgaW5zdGVhZCBvZiB0bXBuYW0uCisJKGRpc3BsYXlfaW5mb190YWJsZSk6IExpa2V3aXNlLgorCitUdWUgQXVnIDI3IDE4OjE1OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAocGFyc2Vfc3RhYik6IEFuIE5fRlVOIHN5bWJvbCB3aXRoIGFuIGVtcHR5IHN0cmluZworCWluZGljYXRlcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uCisKK1RodSBBdWcgMjIgMTc6MDg6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cnN0YWJzLmMgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSk6IEFkZCBuZXh0IGZpZWxkLgorCShzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUpOiBDaGFuZ2Ugc3RyaW5ncyB0byBhIHBvaW50ZXIgdG8KKwlzdHJpbmdfaGFzaF9lbnRyeS4gIEFkZCBsYXN0X3N0cmluZ3MgZmllbGQuICBSZW1vdmUgc3RyaW5nc19hbGxvYworCWZpZWxkLgorCShzdHJpbmdfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXh0IGZpZWxkLgorCShzdGFiX3dyaXRlX3N5bWJvbCk6IENvcHkgc3RyaW5nIGludG8gaGFzaCB0YWJsZSByYXRoZXIgdGhhbiBpbnRvCisJYnVmZmVyLiAgS2VlcCBhIGxpc3Qgb2YgaGFzaCB0YWJsZSBlbnRyaWVzLgorCSh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IEluaXRpYWxpemUgbGFzdF9zdHJpbmcuCisJQ29weSBzdHJpbmdzIGZyb20gbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMgaW4gbWVtb3J5LgorCShzdGFiX21vZGlmeV90eXBlKTogSWYgdGhlIGVudHJ5IG9uIHRoZSBzdGFjayBpcyBhIGRlZmluaXRpb24sCisJbWFrZSBhIG5ldyBkZWZpbml0aW9uIHJhdGhlciB0aGFuIGZhaWxpbmcgYW4gYXNzZXJ0LgorCShzdGFiX2FycmF5X3R5cGUpOiBUaGUgc2l6ZSBpcyBvbmx5IHplcm8gaWYgaGlnaCBpcyBzdHJpY3RseSBsZXNzCisJdGhhbiBsb3cuCisKKwkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBzYXdfZmlsZW5hbWUgZmllbGQuCisJKHBhcnNlX2llZWUpOiBJbml0aWFsaXplIHNhd19maWxlbmFtZS4KKwkocGFyc2VfaWVlZV9iYik6IFNldCBzYXdfZmlsZW5hbWUgZm9yIGEgQkIxIG9yIEJCMi4gIEluIGEgQkIxLAorCWRpc2NhcmQgdGhlIGN1cnJlbnQgdmFyaWFibGVzIGFuZCB0eXBlcy4gIEluIGEgQkIxMCwgaWYgbm8KKwlmaWxlbmFtZSBoYXMgYmVlbiBzZWVuLCBjYWxsIGRlYnVnX3NldF9maWxlbmFtZS4KKwkocGFyc2VfaWVlZV90eSk6IEluIGNhc2UgJ2cnLCB0aGUgdHlwZSBpcyBvcHRpb25hbC4KKworCSogcHJkYmcuYyAocHJfZml4X3Zpc2liaWxpdHkpOiBEb24ndCBhYm9ydCBvbgorCURFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFLgorCisJKiBkZWJ1Zy5jIChkZWJ1Z19uYW1lX3R5cGUpOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2UuCisKKwkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBITERFTlYuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLiAgVXNlIGl0IHdoZW5ldmVyIGxpbmtpbmcgYQorCXByb2dyYW0uCisKK1RodSBBdWcgMTUgMTk6MzA6NDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IEFkZCBzeW1ib2xpYyBkb3VibGVxdW90ZXMgYXJvdW5kIHRoZSB2ZXJzaW9uCisJbnVtYmVyLgorCitUaHUgQXVnICA4IDEyOjI3OjUyIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IEFkZCBiZXR0ZXIgc3VwcG9ydCBmb3IgREVDIEMgY29tcGlsYXRpb24uCisJQWRkIG5ldyBtYWNyb3MgYXMgaW4gTWFrZWZpbGUuaW4uCisKK1dlZCBBdWcgIDcgMTQ6Mjc6MzMgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIHN0cnN0ciBhbmQgc2Jyay4KKwkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fU1RSU1RSKTogTmV3IG1hY3JvLgorCShORUVEX0RFQ0xBUkFUSU9OX1NCUkspOiBOZXcgbWFjcm8uCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKwkqIGJ1Y29tbS5oIChzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgorCShzYnJrKTogRGVjbGFyZSBpZiBIQVZFX1NCUksgYW5kIE5FRURfREVDTEFSQVRJT05fU0JSSy4KKworCSogcHJkYmcuYyAocHJfZW5kX3N0cnVjdF90eXBlKTogQXZvaWQgdXNpbmcgYSBzdHJpbmcgY29uc3RhbnQgaW4KKwlhc3NlcnQsIGZvciB0aGUgYmVuZWZpdCBvZiBicm9rZW4gYXNzZXJ0IG1hY3Jvcy4KKworRnJpIEp1bCAyNiAxNDowNjo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNhc21faW5mby5mbGF2b3VyIGZyb20KKwlhYmZkLgorCitUdWUgSnVsIDIzIDEzOjU5OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChzZWNkYXRhKTogSW4gbm9uIERMTFRPT0xfUFBDIGNhc2UsIGNoYW5nZSBhbGlnbm1lbnQKKwlvZiAudGV4dCBzZWN0aW9uIHRvIDIuCisKK01vbiBKdWwgMjIgMDg6NDY6MTUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6ICBGaXggdGVzdCBmb3Igc3RhYnMgc2VjdGlvbnMKKwllbmRpbmcgd2l0aCBudW1iZXJzLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0gd2l0aCAuc3RhYiBiZWluZworCWNvbmZ1c2VkIHdpdGggLnN0YWIuaW5kZXguCisKK1dlZCBKdWwgMTAgMTM6MzI6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdGFicy5jIChzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSk6IFJldHVybiBhIHZvaWQgKiBmb3IgYQorCXRlbXBsYXRlLCByYXRoZXIgdGhhbiBzaW1wbHkgYWJvcnRpbmcuCisKK01vbiBKdWwgIDggMTU6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhci5jIChvcGVuX2luYXJjaCk6IEFkZCBmaWxlIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmCisJdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgYXJjaGl2ZSwgc2V0IHRoZSB0YXJnZXQgYmFzZWQgb24gdGhlCisJZmlsZS4KKwkqIGFyc3VwLmggKG9wZW5faW5hcmNoKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCitUaHUgSnVsICA0IDEyOjAwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gY3lnbnVzLTIuNy4xLgorCisJKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCisKKwkqIHJkY29mZi5jIChwYXJzZV9jb2ZmKTogR2V0IGFkZHJlc3MgdG8gcGFzcyB0byBkZWJ1Z19lbmRfZnVuY3Rpb24KKwlmcm9tIGZ1bmN0aW9uIHNpemUsIG5vdCB2YWx1ZSBvZiAuZWYgc3ltYm9sLiAgRnJvbSBOaW5nCisJTW9zYmVyZ2VyLVRhbmcgPG5pbmdAQVpTdGFyTmV0LmNvbT4uCisKK1NhdCBKdW4gMjkgMjE6MTg6MDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKHN0cmlwX21haW4pOiBBZGQgLW8gb3B0aW9uLCBhbmQgaGFuZGxlIGl0LgorCShzdHJpcF91c2FnZSk6IE1lbnRpb24gLW8uCisJKiBiaW51dGlscy50ZXhpLCBzdHJpcC4xOiBNZW50aW9uIC1vLgorCitNb24gSnVuIDI0IDE3OjE5OjAyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAorCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mIHNldCB2YWx1ZXMuCisJKGRvY2Rpcik6IFJlbW92ZWQuCisJKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IEF1dG9jb25mIDIuNSBvciBoaWdoZXIuCisKK01vbiBKdW4gMjQgMTE6NTk6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKGVuZGlhbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHVzYWdlKTogTWVudGlvbiAtRUIvLUVMLy0tZW5kaWFuLgorCShsb25nX29wdGlvbnMpOiBBZGQgImVuZGlhbiIuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBJZiBlbmRpYW5uZXNzIHdhcyBzcGVjaWZpZWQsIHJlcGxhY2UKKwlhYmZkLT54dmVjIHdpdGggYSBjb3B5IG9mIGl0c2VsZiB3aXRoIHRoZSBnaXZlbiBlbmRpYW5uZXNzLgorCShtYWluKTogSGFuZGxlIC1FQi8tRUwvLS1lbmRpYW4uCisJKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IE1lbnRpb24gLUVCLy1FTC8tLWVuZGlhbi4KKworCSogb2JqZHVtcC5jOiBNYWtlIG1vc3QgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgc3RhdGljLgorCisJKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKKwl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KKworU3VuIEp1biAyMyAxNDo0NzozNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChzZWNkYXRhKTogQ2hhbmdlZCAucmRhdGEgdG8gLnJlbGRhdGEgc28gLnJlbG9jIHdpbGwgd29yay4KKwkobWFrZV9vbmVfbGliX2ZpbGUpOiBSZW1vdmVkIGNydWZ0LiAoI2lmIDEpCisKK1dlZCBKdW4gMTkgMTQ6NDY6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKHN0YWJzKTogQ2hhbmdlIGZyb20gc3RydWN0IGludGVybmFsX25saXN0ICogdG8KKwliZmRfYnl0ZSAqLgorCShwcmludF9zZWN0aW9uX3N0YWJzKTogRmV0Y2ggc3RhYnMgaW5mb3JtYXRpb24gZGlyZWN0bHksIHJhdGhlcgorCXRoYW4gYXNzdW1pbmcgdGhhdCBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgaXMgdGhlIHJpZ2h0IHNpemUuCisKKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGNoYW5nZSB0byBiaW5hcnkgZm9ybWF0OiBmaWxlIHBvc2l0aW9uCisJYmFzZWQgb24gbG9hZCBhZGRyZXNzLCBub3Qgc2VjdGlvbiBWTUEuCisKKwkqIGJ1Y29tbS5oOiBEZWZpbmUgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQgaWYgdGhleSBhcmUKKwlub3QgYWxyZWFkeSBkZWZpbmVkLgorCitUdWUgSnVuIDE4IDE4OjI1OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBkZWZsZXguYy4KKworVHVlIEp1biAxOCAxNTowMzo0NCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogY29uZmlnLmgtdm1zLCBtYWtlZmlsZS52bXM6IE5ldyBmaWxlcy4KKworTW9uIEp1biAxNyAwOTo0NzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgQkZEX1JFTE9DX1JWQSByYXRoZXIgdGhhbgorCUJGRF9SRUxPQ18zMiBpbiBJREFUQTcuCisKK1dlZCBKdW4gMTIgMTE6NTI6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBubS5jIChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvKTogRGVmaW5lLgorCShsaW5lX251bWJlcnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShsb25nX29wdGlvbnMpOiBBZGQgImxpbmUtbnVtYmVycyIuCisJKHVzYWdlKTogTWVudGlvbiAtbCBhbmQgLS1saW5lLW51bWJlcnMuCisJKG1haW4pOiBIYW5kbGUgLWwuCisJKHByaW50X3N5bWJvbCk6IFByaW50IGxpbmUgbnVtYmVycyBpZiByZXF1ZXN0ZWQuCisJKGdldF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogYmludXRpbHMudGV4aSwgbm0uMTogRG9jdW1lbnQgLWwvLS1saW5lLW51bWJlcnMuCisKK1R1ZSBKdW4gMTEgMjA6MTI6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2Nfc2V0KTogQWRkIHNlYyBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCisJY2FsbGVycy4gIElmIHdpdGhfbGluZV9udW1iZXJzIGlzIHNldCwgZGlzcGxheSBsaW5lIG51bWJlcnMgb2YKKwlyZWxvY2F0aW9uIGVudHJpZXMuCisJKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1sIHdpdGggLXIuCisKK01vbiBKdW4gMTAgMjM6NDI6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhci5jIChvcGVuX2luYXJjaCk6IFJlcG9ydCBCRkQgZXJyb3IgbWVzc2FnZSBpZiBhbiBhcmNoaXZlIGNhbgorCW5vdCBiZSByZWNvZ25pemVkLiAgTGlzdCBtYXRjaGluZyBmb3JtYXRzIGlmIHRoZSBmaWxlIGlzCisJYW1iaWd1b3VzbHkgcmVjb2duaXplZC4KKwkocmFubGliX3RvdWNoKTogTGlrZXdpc2UuCisKK1RodSBKdW4gIDYgMTM6NTY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBSRUFETUU6IEFkZCBub3RlcyBvbiBob3cgdG8gYnVpbGQgaWYgeW91IGRvbid0IGhhdmUgYXIuCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgb2xkIGluY29ycmVjdCBzZXR0aW5nIG9mIENDLgorCitUdWUgSnVuICA0IDEwOjUyOjQ5IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGNoZWNrIHRvIHNlZSBpZiB0b29sZGlyIGV4aXN0cy4KKwlNYWtlICQodG9vbGRpcikgYW5kICQodG9vbGRpcikvYmluLgorCitNb24gSnVuICAzIDE3OjQwOjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc3RyaW5ncy5jIChtYWluKTogTWFrZSBtYWluIGFuIGludCBmdW5jdGlvbiwgbm90IHZvaWQuCisKK0ZyaSBNYXkgMzEgMTM6NTk6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBubS5jIChmaWx0ZXJfc3ltYm9scyk6IENoZWNrIGZvciBCU0ZfV0VBSyBhcyB3ZWxsIGFzCisJQlNGX0dMT0JBTC4KKwkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBMaWtld2lzZS4KKworV2VkIE1heSAgOCAxNjo1NzoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBNYWtlIGNsZWFyIHRoYXQgaXQgaXMgb25seSBhIHdhcm5pbmcKKwl3aGVuIHRoZSBvdXRwdXQgZmlsZSBjYW4gbm90IHJlcHJlc2VudCB0aGUgYXJjaGl0ZWN0dXJlLgorCitGcmkgTWF5ICAzIDExOjMwOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgcmVmZXIgdG8gYnl0ZXMgcGFzdCB0aGUgZW5kCisJb2YgZGF0YS4KKworV2VkIEFwciAyNCAxNDoxMDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJkZGJnLmMgKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTW92ZSBjYWxsIHRvCisJZnJlZV9zYXZlZF9zdGFicyBvdXRzaWRlIHRoZSBsb29wIG92ZXIgdGhlIHN5bWJvbHMuCisKK1R1ZSBBcHIgMjMgMTI6NTY6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgc3ltYm9scyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoCisgCWAuJyBhZnRlciBvdGhlciBzeW1ib2xzLiAgSWYgbm8gb3RoZXIgZGVjaXNpb24gY2FuIGJlIG1hZGUsIHNvcnQKKwlzeW1ib2xzIGJ5IG5hbWUuCisKK1RodSBBcHIgMTggMTY6MDI6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkZXAtaW4uc2VkOiBTdWJzdGl0dXRlICQoQkZERElSKSBmb3IgQEJGRERJUkAuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKGRlcC5zZWQpOiBTdWJzdGl0dXRlICQoQkZERElSKSBmb3IgQEJGRERJUkAuCisKK1R1ZSBBcHIgMTYgMTM6NTA6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZGNvZmYuYzogTmV3IGZpbGUuCisJKiByZGRiZy5jIChyZWFkX2RlYnVnZ2luZ19pbmZvKTogUmVhZCBDT0ZGIHN5bWJvbHMgaWYgQ09GRiBmbGF2b3VyCisJYW5kIG5vIHN0YWJzIHdlcmUgZm91bmQuCisJKiBidWRiZy5oIChwYXJzZV9jb2ZmKTogRGVjbGFyZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQ0ZJTEVTKTogQWRkIHJkY29mZi5jLgorCShERUJVR19PQkpTKTogQWRkIHJkY29mZi5vLgorCitNb24gQXByIDE1IDE1OjU1OjAxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG5sbWNvbnYuYyAoY2hvb3NlX3RlbXBfYmFzZXssX3RyeX0pOiBEZWxldGUsIGluIGxpYmliZXJ0eSBub3cuCisJKGxpbmtfaW5wdXRzKTogVXBkYXRlIGNhbGwgdG8gY2hvb3NlX3RlbXBfYmFzZS4KKworTW9uIEFwciAgOCAxNDo0MDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgorCWRpcmVjdG9yaWVzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgTWFyIDI5IDE2OjExOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogUHJpbnQgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZworCWFuZCB0aGUgU0VDX0xJTktfRFVQTElDQVRFUyBmaWVsZC4KKworRnJpIE1hciAyOSAxMTozNTo1NSAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQorCisJKiBubG1jb252LjE6IENoYW5nZWQgdG8gYmUgcmVjb2duaXplZCBieSBjYXRtYW4gLXcgb24gU29sYXJpcy4KKworVGh1IE1hciAyOCAxNDoxNzowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHdyc3RhYnMuYyAoc3RhYl9lbnVtX3R5cGUpOiBTZXQgYnVmIGJlZm9yZSB1c2luZyBpdC4KKworRnJpIE1hciAyMiAxNTo0OTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBmaWVsZCBhYmZkLgorCShzdGFydF9zdGFiKTogQWRkIGFiZmQgcGFyYW1ldGVyLgorCShwYXJzZV9zdGFiX3N0cmluZyk6IFNraXAgdGhlIHN5bWJvbCBsZWFkaW5nIGNoYXIgd2hlbiBzZWFyY2hpbmcKKwlmb3IgdGhlIHZhbHVlIG9mIGEgZ2xvYmFsIHN5bWJvbC4KKwkqIGJ1ZGJnLmggKHN0YXJ0X3N0YWIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBQYXNzIGFiZmQgdG8KKwlzdGFydF9zdGFiLgorCShyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgorCitUaHUgTWFyIDIxIDEyOjQwOjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogd3JzdGFicy5jIChzdGFiX2Z1bmN0aW9uX3R5cGUpOiBPdXRwdXQgYW4gZW1wdHkgdHlwZWRlZiBmb3IgYW4KKwl1bnVzZWQgYXJndW1lbnQsIHJhdGhlciB0aGFuIG1ha2luZyB1cCBhIG1lYW5pbmdsZXNzIG5hbWUuCisJKHN0YWJfdmFyaWFibGUpOiBVc2UgTl9SU1lNIGZvciBhIERFQlVHX1JFR0lTVEVSIHZhcmlhYmxlLgorCisJKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgZ2xvYmFsX3ZhcnMgZmllbGQuCisJKHBhcnNlX2llZWVfYmUpOiBXaGVuIGVuZGluZyB0aGUgZ2xvYmFsIHR5cGVkZWYgYmxvY2ssIGNvcHkgdGhlCisJdmFyaWFibGVzIGludG8gaW5mby0+Z2xvYmFsX3ZhcnMuCisJKHBhcnNlX2llZWVfYXRuKTogRG9uJ3QgcmVxdWlyZSBhbiBOTiByZWNvcmQgZm9yIGEgcG1pc2MgQVROLgorCShpZWVlX3JlYWRfcmVmZXJlbmNlKTogU2VhcmNoIHRoZSBnbG9iYWwgdmFyaWFibGVzIGFmdGVyIHRoZSBsb2NhbAorCXZhcmlhYmxlcy4KKworV2VkIE1hciAyMCAxODowODoxOSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTWFrZSBzdXJlIHN5bV9uYW1lIGlzIGFsd2F5cyBzZXQuCisJKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBBbHdheXMgcHV0IGEgc3BhY2UgYWZ0ZXIgdGhlIHNlY3Rpb24gbmFtZS4KKwkoZHVtcF9iZmRfaGVhZGVyKTogVGVybWluYXRlIG91dHB1dCB3aXRoIG5ld2xpbmUuCisKK1dlZCBNYXIgMjAgMTY6MzU6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cnN0YWJzLmM6IE5ldyBmaWxlLgorCSogYnVkYmcuaCAod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBEZWNsYXJlLgorCSogb2JqY29weS5jICh3cml0ZV9kZWJ1Z2dpbmdfaW5mbyk6IEZvciBDT0ZGIG9yIEVMRiwgb3V0cHV0IHN0YWJzCisJaW4gc2VjdGlvbnMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKENGSUxFUyk6IEFkZCB3cnN0YWJzLmMuCisJKFdSSVRFX0RFQlVHX09CSlMpOiBOZXcgdmFyaWFibGUuCisJKCQoT0JKQ09QWV9QUk9HKSk6IFVzZSAkKFdSSVRFX0RFQlVHX09CSlMpLCBub3QgJChERUJVR19PQkpTKS4KKwkoJChTVFJJUF9QUk9HKSk6IExpa2V3aXNlLgorCisJKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBNYWtlIHR5cGUgc3R1YiBkZXRlY3Rpb24gbW9yZSBsaWtlCisJZ2RiLgorCisJKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2hhbmRsZSk6IEFkZCBmaWVsZHMgY29tcGxleF9mbG9hdF9pbmRleCBhbmQKKwljb21wbGV4X2RvdWJsZV9pbmRleC4KKwkoaWVlZV9jb21wbGV4X3R5cGUpOiBDYWNoZSB0eXBlIGluZGV4IGluIGNvbXBsZXhfZmxvYXRfaW5kZXggYW5kCisJY29tcGxleF9kb3VibGVfaW5kZXgsIGRlcGVuZGluZyB1cG9uIHNpemUuICBTZXQgc2l6ZSBvbiB0eXBlIHN0YWNrCisJdG8gc2l6ZSAqIDIuCisKKwkqIGllZWUuYyAoaWVlZV9lbXB0eV90eXBlKTogVXNlIGJ1aWx0aW5fdW5rbm93biwgbm90IDAuCisJKGllZWVfdm9pZF90eXBlKTogVXNlIGJ1aWx0aW5fdm9pZCwgbm90IDEuCisKKwkqIGllZWUuYyAocGFyc2VfaWVlZV90eSk6IEhhbmRsZSAnVicgdHlwZSBjb2RlLgorCShwYXJzZV9pZWVlX2F0bik6IERvbid0IHJlcXVpcmUgdHdvIG51bWJlcnMgZm9yIHR5cGUgMTAuCisKKwkqIGllZWUuYyAocGFyc2VfaWVlZV9iZSk6IEFkZCBvbmUgdG8gb2Zmc2V0IGF0IGVuZCBvZiBmdW5jdGlvbiBvcgorCWJsb2NrLgorCisJKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2Jsb2NrKTogQWRkIGZpZWxkIHNraXAuCisJKHBhcnNlX2llZWVfYmIpOiBEb24ndCBjYWxsIGRlYnVnX3JlY29yZF9mdW5jdGlvbiBmb3IgX19YUllDUFAKKwlmdW5jdGlvbiwgYW5kIHNldCBza2lwIGZpZWxkLgorCShwYXJzZV9pZWVlX2JlKTogRG9uJ3QgY2FsbCBkZWJ1Z19lbmRfZnVuY3Rpb24gaWYgc2tpcCBpcyBzZXQuCisKKwkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBBZGQgZmllbGRzIGN1cnJlbnRfd3JpdGVfbGluZW5vCisJYW5kIGN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4LgorCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgY3VycmVudF93cml0ZV9saW5lbm8gYW5kCisJY3VycmVudF93cml0ZV9saW5lbm9faW5kZXggZm9yIGVhY2ggdW5pdC4gIENhbGwKKwlkZWJ1Z193cml0ZV9saW5lbm9zIHJhdGhlciB0aGFuIHdyaXRpbmcgb3V0IHRoZSBsaW5lIG51bWJlcnMKKwlkaXJlY3RseS4KKwkoZGVidWdfd3JpdGVfZnVuY3Rpb24pOiBDYWxsIGRlYnVnX3dyaXRlX2xpbmVub3MuCisJKGRlYnVnX3dyaXRlX2Jsb2NrKTogTGlrZXdpc2UuCisJKGRlYnVnX3dyaXRlX2xpbmVub3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCisJKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogRm9yIERFQlVHX0tJTkRfRlVOQ1RJT04sIHB1c2ggcmV0dXJuCisJdHlwZSBiZWZvcmUgYXJndW1lbnRzLgorCitNb24gTWFyIDE4IDE4OjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgQUNfRlVOQ19WRk9SSy4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgorCSogZGxsdG9vbC5jLCBubG1jb252LmM6IEluY2x1ZGUgPHZmb3JrLmg+IGlmIEhBVkVfVkZPUktfSCBpcworCWRlZmluZWQuCisKKwkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEEgY29tcGxleCB0eXBlIGlzIGRlZmluZWQgYXMgYQorCXN1YnJhbmdlIG9mIGl0c2VsZiB3aXRoIHRoZSBoaWdoIGJvdW5kIHplcm8uCisJKiBpZWVlLmMgKGllZWVfY29tcGxleF90eXBlKTogRG9uJ3QgY3Jhc2ggb24gc2l6ZXMgb2YgMTIgb3IgMTYuCisKK1R1ZSBNYXIgMTIgMTI6MDk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmMgKGllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZyk6IFN3aXRjaCB0byBnbG9iYWxfdHlwZXMgZXZlbgorCWlmIGl0IGlzIG5vdCBlbXB0eS4KKwkoaWVlZV90YWdfdHlwZSk6IEZvciBhbiBlbnVtLCBsb29rIHRocm91Z2ggaW5mby0+ZW51bXMuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KKworCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IERvbid0IGxvb3AgZW5kbGVzc2x5IGluCisJREVCVUdfS0lORF9FTlVNIGNhc2UuICBGcm9tIEVyaWMgQmF1ciA8ZWNiQG5leGVuLmNvbT4uCisKK01vbiBNYXIgMTEgMTI6MzU6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBDYWxsIHNhdmVfc3RhYiBmb3IKKwllYWNoIHN0YWIgZW50cnksIGNhbGwgc3RhYl9jb250ZXh0IG9uIGFuIGVycm9yLCBhbmQgY2FsbAorCWZyZWVfc2F2ZWRfc3RhYnMgYmVmb3JlIHJ0dXJuaW5nLgorCShyZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgorCShTQVZFX1NUQUJTX0NPVU5UKTogRGVmaW5lLgorCShzdHJ1Y3Qgc2F2ZWRfc3RhYik6IERlZmluZS4KKwkoc2F2ZWRfc3RhYnMsIHNhdmVkX3N0YWJzX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKHNhdmVfc3RhYiwgc3RhYl9jb250ZXh0LCBmcmVlX3NhdmVkX3N0YWJzKTogTmV3IHN0YXRpYyBmdW5jdGlvcy4KKworCSogb2JqZHVtcC5jIChzdGFiX25hbWUpOiBSZW1vdmUuCisJKHN0cnVjdCBzdGFiX3ByaW50KTogUmVtb3ZlLgorCShzdGFiX3ByaW50KTogUmVtb3ZlLgorCShkdW1wX3N0YWJzKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdGFiX25hbWUuCisJKHByaW50X3NlY3Rpb25fc3RhYnMpOiBDYWxsIGJmZF9nZXRfc3RhYl9uYW1lIHJhdGhlciB0aGFuIHVzaW5nCisJdGhlIHN0YWJfbmFtZSBhcnJheS4KKworVHVlIEZlYiAyNyAxOTo1MjowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHByZGJnLmMgKHByX2ludF9jb25zdGFudCk6IEluaXRpYWxpemUgaW5mbyBjb3JyZWN0bHkuCisJKHByX2Zsb2F0X2NvbnN0YW50KTogTGlrZXdpc2UuCisKK01vbiBGZWIgMjYgMTg6MTE6MzcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSB0byBoYW5kbGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KKworU2F0IEZlYiAyNCAxMToyMTo0OSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgorCisJKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogU2VhcmNoICQoQkZETElCKSBiZWZvcmUKKwkkKE9QQ09ERVMpLgorCitUaHUgRmViIDE1IDEyOjQ0OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCB0YW1wZXIgd2l0aCBMREZMQUdTLiAgQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZQorCWNvbmZpZ3VyZS5ob3N0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KKwkoY2hlY2spOiBVc2UgJChSUEFUSF9FTlZWQVIpIHJhdGhlciB0aGFuIExEX0xJQlJBUllfUEFUSC4KKworCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBSYXRoZXIgdGhhbiBkb2luZyBjaG1vZCB0aGVuIGNob3duLCBkbworCWNobW9kIHdpdGhvdXQgc2V0dWlkLCB0aGVuIGNob3duLCB0aGVuIGNobW9kIHdpdGggc2V0dWlkLgorCitXZWQgRmViIDE0IDE2OjQ2OjQyIDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+CisKKwkqIGFyc3VwLmMgKG1hcF9vdmVyX2xpc3QpOiBSZWluZGVudC4gIERvbid0IGFzc3VtZSB0aGF0IHRoZQorCWZ1bmN0aW9uIGRvZXMgbm90IGRlbGV0ZSB0aGUgQkZELgorCShhcl9hZGRsaWJfZG9lcik6IERvbid0IHNldCBwcmV2LT5uZXh0IGlmIHByZXYgaXMgTlVMTC4KKworV2VkIEZlYiAxNCAxNToxMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYyAoaWVlZV9yZWdub190b19nZW5yZWcpOiBDb252ZXJ0IHJlZ2lzdGVyIG51bWJlcnMgZm9yIG02OGsKKwlhbmQgaTk2MC4KKwkoaWVlZV9nZW5yZWdfdG9fcmVnbm8pOiBMaWtld2lzZS4KKworTW9uIEZlYiAxMiAxNDoxOTo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGllZWUuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gd3JpdGUgY29kZSB0byBwdXQgdHlwZXMgaW4gdGhlCisJZ2xvYmFsIHR5cGUgYmxvY2sgd2hlbiBwb3NzaWJsZSwgdG8gb3V0cHV0IHJhbmdlcyBmb3IgYWxsIG1lbW9yeQorCW9jY3VwaWVkIGJ5IHRoZSBtb2R1bGUsIGFuZCB0byBpbXByb3ZlIGVmZmljaWVuY3kuCisKKwkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19oYW5kbGUpOiBSZW1vdmUgY2xhc3NfbWFyayBmaWVsZC4gIEFkZAorCWlkX2xpc3QgYW5kIGNvbXBhcmVfbGlzdCBmaWVsZHMuCisJKHN0cnVjdCBkZWJ1Z19jbGFzc19pZCk6IERlZmluZS4KKwkoc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0KTogRGVmaW5lLgorCShkZWJ1Z193cml0ZSk6IEluaXRpYWxpemUgaW5mby0+aWRfbGlzdAorCShkZWJ1Z193cml0ZV9uYW1lKTogUmVtb3ZlIHJlZmVyZW5jZSB0byBpbmZvLT5jbGFzc19tYXJrLgorCShkZWJ1Z193cml0ZV90eXBlKTogR2V0IGlkIGZvciBhbGwgc3RydWN0cyBhbmQgY2xhc3Nlcy4gIFNpbXBsaWZ5CisJdGVzdCBmb3Igd2hldGhlciBzdHJ1Y3QgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgorCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogR2V0IGlkIGZvciBhbGwgY2xhc3Nlcy4gIFNpbXBsaWZ5IHRlc3QKKwlmb3Igd2hldGhlciBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCisJKGRlYnVnX3dyaXRlX2Jsb2NrKTogRG9uJ3Qgd3JpdGUgb3V0IGJsb2NrcyBvdGhlciB0aGFuIHRoZSB0b3AKKwlsZXZlbCBibG9jayBpZiB0aGV5IGhhdmUgbm8gbG9jYWwgdmFyaWFibGVzLgorCShkZWJ1Z19zZXRfY2xhc3NfaWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShkZWJ1Z190eXBlX3NhbWVwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZGVidWdfY2xhc3NfdHlwZV9zYW1lcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKiBwcmRiZy5jIChwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFsd2F5cyBwcmludCBpZC4KKwkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgorCShwcl90YWdfdHlwZSk6IExpa2V3aXNlLgorCisJKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgc3ltcyBhbmQgc3ltY291bnQgZmllbGRzLgorCShzdGFydF9zdGFiKTogQWRkIHN5bXMgYW5kIHN5bWNvdW50IHBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsCisJY2FsbGVycy4KKwkocGFyc2Vfc3RhYl9zdHJpbmcpOiBMb29rIHVwIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHN5bWJvbCB0YWJsZQorCXRvIGdldCB0aGUgcmlnaHQgdmFsdWUuCisJKiBidWRiZy5oIChzdGFydF9zdGFiKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogcmRkYmcuYyAocmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogQWRkIHN5bXMgYW5kCisJc3ltY291bnQgcGFyYW1ldGVycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KKworCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9hcnJheV90eXBlKTogSWYgdGhlIGluZGV4IHR5cGUgaXMgMCwgdXNlCisJaW50LgorCitXZWQgRmViICA3IDE0OjE3OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jIChpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpOiBDbGVhciBtb2RpZmllZCBhbmQKKwltb2RpZmllZF9hbGxvYyBmaWVsZHMgb2YgaW5mby4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgU3Vic3RpdHV0ZSBuZXcKKwl2YXJpYWJsZXMgQkZETElCIGFuZCBPUENPREVTLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKEJGRExJQik6IFNldCB0byBAQkZETElCQC4KKwkoT1BDT0RFUyk6IFNldCB0byBAT1BDT0RFU0AuCisKK01vbiBGZWIgIDUgMTY6MTg6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCisJcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKKwkqIGNvbmZpZ3VyZS5pbiAoSExERkxBR1MpOiBOZXcgc3Vic3RpdHV0aW9uLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLiAgTWFrZSBhbGwgbGlua3MgdXNlCisJJChITERGTEFHUykgYmVmb3JlICQoQ0ZMQUdTKSBhbmQgJChMREZMQUdTKS4KKwkoQkZETElCX0RFUCk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mICQoQkZEKSBhcworCWEgZGVwZW5kZW5jeSB3aXRoICQoQkZETElCX0RFUCkuICBSZW1vdmUgJChCRkQpIGFzIGEgZGVwZW5kZW5jeSBpZgorCXRoZXJlIGlzIGFsc28gYSBkZXBlbmRlbmN5IG9uICQoQURETF9ERVBTKS4KKwkoQkZETElCKTogUmVuYW1lIGZyb20gQkZEOyBjaGFuZ2UgYWxsIHVzZXM7IHNldCB0byAtTC4uL2JmZCAtbGJmZC4KKwkoT1BDT0RFU19ERVApOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmRzIG9mICQoT1BDT0RFUykKKwlhcyBhIGRlcGVuZGVuY3kgd2l0aCAkKE9QQ09ERVNfREVQKS4KKwkoT1BDT0RFUyk6IFNldCB0byAtTC4uL29wY29kZXMgLWxvcGNvZGVzLgorCShBRERMX0RFUFMpOiBOZXcgdmFyaWFibGUuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZgorCSQoQURETF9MSUJTKSBhcyBhIGRlcGVuZGVuY3kgd2l0aCAkKEFERExfREVQUykuCisJKGNoZWNrKTogU2V0IExEX0xJQlJBUllfUEFUSCBpbiB0aGUgZW52aXJvbm1lbnQuCisJKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBCRkQgY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZy5iZmQuCisKK0ZyaSBGZWIgIDIgMTc6MDI6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYzogI2luY2x1ZGUgc3RkYXJnLmggb3IgdmFyYXJncy5oLgorCShvYmpkdW1wX3ByaW50X3ZhbHVlKTogQ2hhbmdlIEZJTEUqIGFyZyB0byBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyouCisJQWxsIGNhbGxlcnMgdXBkYXRlZC4gIFVzZSBmcHJpbnRmX2Z1bmMuCisJKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENvbnNpc3RlbnRseSB1c2UgZnByaW50Zl9mdW5jLgorCShvYmpkdW1wX3NwcmludGYpOiBOZXcgZnVuY3Rpb24uCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBQcmludCBpbnNuIGludG8gYSBidWZmZXIsIHByaW50IHJhdyBpbnNuIG91cnNlbHZlcywKKwl0aGVuIHByaW50IGluc24gbW5lbW9uaWMuCisKK0ZyaSBGZWIgIDIgMTY6NDg6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1RodSBGZWIgIDEgMDk6Mzg6MTggMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpWzMtNl04Ni0qLXdpbjMyKTogQmVjb21lcyBpWzMtNl04Ni0qLWN5Z3dpbjMyLgorCShwb3dlcnBjKi0qLWN5Z3dpbjMyKTogTmV3LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworV2VkIEphbiAzMSAxMzoyMjowMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4xLgorCitNb24gSmFuIDI5IDE3OjM2OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBIIEogTHUgPGhqbEB6b29tLmNvbT46CisJKiBvYmpjb3B5LmMgKHJlbW92ZV9sZWFkaW5nX2NoYXIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUik6IERlZmluZS4KKwkoY29weV91c2FnZSk6IE1lbnRpb24gLS1yZW1vdmUtbGVhZGluZy1jaGFyLgorCShmaWx0ZXJfc3ltYm9scyk6IElmIHJlbW92ZV9sZWFkaW5nX2NoYXIsIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyCisJb2YgYSBnbG9iYWwgc3ltYm9sIG1hdGNoZXMgdGhlIHN5bWJvbCBsZWFkaW5nIGNoYXIgb2YgdGhlIEJGRCwKKwlyZW1vdmUgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKwkoY29weV9vYmplY3QpOiBGaWx0ZXIgdGhlIHN5bWJvbHMgaWYgcmVtb3ZlX2xlYWRpbmdfY2hhciBpcyBzZXQuCisJKGNvcHlfbWFpbik6IEhhbmRsZSAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KKworU2F0IEphbiAyNyAxNTo0MDoxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZnByaW50Zik6IEFkZCBwcm90b3R5cGUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyBvbgorCVN1bk9TLgorCitGcmkgSmFuIDI2IDExOjUzOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMudGV4aSAobm0pOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb24gc3ltYm9sIHR5cGVzLgorCShvYmpkdW1wKTogUmVmZXJlbmNlIHRoZSBzdGFicyBtYW51YWwgZnJvbSB0aGUgZGlzY3Vzc2lvbiBvZiB0aGUKKwktLXN0YWJzIG9wdGlvbi4KKworVGh1IEphbiAyNSAxMToyMTo0NiAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IEFkZCBhICJzdGFtcHMiIHRhcmdldC4KKworVGh1IEphbiAyNSAxMzo1MTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzLCBkdW1wX3NlY3Rpb25faGVhZGVyKTogQ2hhbmdlIG9iamR1bXAgLWgKKwlvdXRwdXQgdG8gYmUgc2ltcGxlciBhbmQgdG8gaW5jbHVkZSBzZWN0aW9uIGZpbGUgb2Zmc2V0cy4KKworV2VkIEphbiAyNCAxMjowNjowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IERvbid0IGFkanVzdCB2b2Zmc2V0LgorCisJKiBpZWVlLmMgKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBEb24ndCBtdWx0aXBseSB2b2Zmc2V0IGJ5IDQuCisJKHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUpOiBBZGQgbmFtZSBmaWVsZC4KKwkoc3RydWN0IGllZWVfdHlwZV9jbGFzcyk6IFJlbW92ZSBuYW1lIGZpZWxkLiAgQ2hhbmdlIGFsbCB1c2VzIHRvCisJdXNlIG5ldyBuYW1lIGZpZWxkIGluIHR5cGUgaW5zdGVhZC4KKwkoc3RydWN0IGllZWVfbmFtZV90eXBlKTogTGlrZXdpc2UuCisJKGllZWVfc3RhcnRfc3RydWN0X3R5cGUpOiBJbml0aWFsaXplIG5hbWUgZmllbGQgb2YgdHlwZS4KKwkoaWVlZV9zdGFydF9jbGFzc190eXBlKTogRG9uJ3QgaW5pdGlhbGl6ZSBjbGFzc2RlZiBlbnRyeSBvZiB0YWcuCisJKGllZWVfY2xhc3NfbWV0aG9kX3Zhcik6IERvbid0IGFkanVzdCB2b2Zmc2V0LgorCShpZWVlX2VuZF9jbGFzc190eXBlKTogTGlrZXdpc2UuCisJKGllZWVfdGFnX3R5cGUpOiBJbml0aWFsaXplIG5ldyBuYW1lIGZpZWxkIG9mIHR5cGUuCisJKGllZWVfdHlwZGVmKTogU2V0IG5hbWUgYWZ0ZXIgY29weWluZyBpbiB0eXBlIGluZm9ybWF0aW9uLgorCisJKiBkZWJ1Zy5jIChWT0ZGU0VUX1NUQVRJQ19NRVRIT0QpOiBEZWZpbmUgYXMgLTEsIG5vdCAxLgorCisJKiBpZWVlLmMgKHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUpOiBEZWZpbmUuCisJKHN0cnVjdCBpZWVlX2hhbmRsZSk6IEFkZCBtb2RpZmllZCBhbmQgbW9kaWZpZWRfYWxsb2MgZmllbGRzLgorCShpZWVlX2dldF9tb2RpZmllZF9pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoaWVlZV9wb2ludGVyX3R5cGUpOiBDYWNoZSB0eXBlIGluZGV4LgorCShpZWVlX2NvbnN0X3R5cGUpOiBMaWtld2lzZS4KKwkoaWVlZV92b2xhdGlsZV90eXBlKTogTGlrZXdpc2UuCisKKwkqIGllZWUuYyAoaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSk6IFdoZW4gY3JlYXRpbmcgYSB0YWcgZm9yIGFuCisJYW5vbnltb3VzIHN0cnVjdCwgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeS4KKwkoaWVlZV90YWdfdHlwZSk6IExpa2V3aXNlLgorCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IE9ubHkgY2hlY2sgYW5kIHNldCBpZCBmaWVsZCBmb3IgYW4KKwl1bm5hbWVkIG9iamVjdC4KKwkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgorCisJKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byB3cml0ZSBvdXQgdHlwZXMgZm9yIGZ1bmN0aW9ucyBhbmQKKwlyZWZlcmVuY2VzLCBhbmQgdG8gbm90IHdyaXRlIG91dCB1bm5lY2Vzc2FyeSBmdW5jdGlvbiB0eXBlcy4KKworCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV92YXIpOiBSZW1vdmUgdmFyaWFibGUgZmllbGQuICBBZGQga2luZAorCWZpZWxkLCBhbmQgZGVmaW5lIHNvbWUgZW51bSBjb25zdGFudHMgZm9yIGl0LgorCShwYXJzZV9pZWVlX3R5KTogU2V0IGtpbmQgZmllbGQgb2YgdmFyaWFibGUgZm9yICd4JyBhbmQgJ1gnIHR5cGVzLgorCShwYXJzZV9pZWVlX2F0bik6IE1ha2UgYW4gaW5kaXJlY3Qgc2xvdCBmb3IgYW4gZXh0ZXJuYWwgdmFyaWFibGUsCisJYWx0aG91Z2ggd2Ugb3RoZXJ3aXNlIGRvbid0IHJlY29yZCBpdC4gIFNldCBraW5kIGZpZWxkIHJhdGhlciB0aGFuCisJdmFyaWFibGUgZmllbGQgb2YgcHZhci4KKwkoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IFRyeSB0byBnZXQgdGhlIHR5cGUgb2YgYSBzdGF0aWMgbWVtYmVyLgorCShpZWVlX3JlYWRfcmVmZXJlbmNlKTogQ2hlY2sga2luZCBmaWVsZCByYXRoZXIgdGhhbiB2YXJpYWJsZQorCWZpZWxkLgorCitUdWUgSmFuIDIzIDE1OjU0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gaGFuZGxlIHJlYWRpbmcgQysrIHJlZmVyZW5jZSB0eXBlCisJaW5mb3JtYXRpb24uCisKKwkqIGRlYnVnLmggKGVudW0gZGVidWdfdmFyX2tpbmQpOiBBZGQgREVCVUdfVkFSX0lMTEVHQUwuCisJKGVudW0gZGVidWdfcGFybV9raW5kKTogQWRkIERFQlVHX1BBUk1fSUxMRUdBTC4KKwkqIGRlYnVnLmMgKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBIYW5kbGUgREVCVUdfS0lORF9GVU5DVElPTi4KKworCSogaWVlZS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gd3JpdGUgb3V0IGRlZmluaXRpb25zIG9mIEMrKyBjbGFzc2VzLgorCisJKiBkZWJ1Zy5jIChkZWJ1Z19hcHBlbmRfZmlsZW5hbWUpOiBSZW1vdmUuCisJKiBkZWJ1Zy5oIChkZWJ1Z19hcHBlbmRfZmlsZW5hbWUpOiBEb24ndCBkZWNsYXJlLgorCisJKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBSZW1vdmUgbGFzdF90eXBlIGZpZWxkLiAgQWRkCisJc29fc3RyaW5nIGFuZCBzb192YWx1ZSBmaWVsZHMuCisJKGZpbmlzaF9zdGFiKTogQ2FsbCBzdGFiX2VtaXRfcGVuZGluZ192YXJzIGJlZm9yZSBjYWxsaW5nCisJZGVidWdfZW5kX2Z1bmN0aW9uLiAgRG9uJ3Qgd2FybiBhYm91dCBwZW5kaW5nIHZhcmlhYmxlcy4KKwkocGFyc2Vfc3RhYik6IEFjY3VtdWxhdGUgTl9TTyBzdHJpbmdzIHVudGlsIGEgbm9uIE5fU08gc3ltYm9sIGlzCisJc2VlbiwgcmF0aGVyIHRoYW4gY2FsbGluZyBkZWJ1Z19hcHBlbmRfZmlsZW5hbWUuICBDYWxsCisJc3RhYl9lbWl0X3BlbmRpbmdfdmFycyBiZWZvcmUgY2FsbGluZyBkZWJ1Z19lbmRfZnVuY3Rpb24uICBEb24ndAorCXNldCBpbmZvLT5sYXN0X3R5cGUuCisKK1R1ZSBKYW4gMjMgMDk6NTM6NTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSB1bmtub3duIGVuZGlhbm5lc3MuCisJUGFzcyBmcHJpbnRmIHRvIElOSVRfRElTQVNTRU1CTEVfSU5GTy4KKworTW9uIEphbiAyMiAxNjo0Njo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCUFkZCBuZXcgb3B0aW9uIC0tc2hvdy1yYXctaW5zbi4KKwkqIG9iamR1bXAuYyAoc2hvd19yYXdfaW5zbik6IE5ldyBnbG9iYWwuCisJKHVzYWdlKTogVXBkYXRlLgorCShsb25nX29wdGlvbnMpOiBVcGRhdGUuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgZGlzYXNtX2luZm8uZmxhZ3MgaWYgLS1zaG93LXJhdy1pbnNuLgorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgbmV3IGFyY2gsbWFjaCxlbmRpYW4gZmllbGRzIGluCisJZGlzYXNtX2luZm8uCisKK01vbiBKYW4gMjIgMTk6Mjk6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHBhc3MgYSBzaW5nbGUgaW5mbyBhcmd1bWVudCBhcm91bmQKKwlpbiB0aGUgcmVhZGluZyByb3V0aW5lcywgcmF0aGVyIHRoYW4gc2V2ZXJhbCBhcmd1bWVudHMuICBBZGQgY29kZQorCXRvIHJlYWQgQysrIGRlYnVnZ2luZyByZWNvcmRzLgorCisJKiBkZWJ1Zy5oIChkZWJ1Z19nZXRfdHlwZV9zaXplKTogRGVjbGFyZS4KKwkoZGVidWdfZ2V0X2ZpZWxkX25hbWUpOiBEZWNsYXJlLgorCShkZWJ1Z19nZXRfZmllbGRfYml0cG9zKTogRGVjbGFyZS4KKwkoZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUpOiBEZWNsYXJlLgorCShkZWJ1Z19nZXRfZmllbGRfdmlzaWJpbGl0eSk6IERlY2xhcmUuCisJKGRlYnVnX2dldF9maWVsZF9waHlzbmFtZSk6IERlY2xhcmUuCisJKiBkZWJ1Zy5jIChkZWJ1Z19nZXRfcmVhbF90eXBlKTogSGFuZGxlIERFQlVHX0tJTkRfVEFHR0VELgorCShkZWJ1Z19nZXRfdHlwZV9zaXplKTogTmV3IGZ1bmN0aW9uLgorCShkZWJ1Z19nZXRfZmllbGRfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUpOiBOZXcgZnVuY3Rpb24uCisJKGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5KTogTmV3IGZ1bmN0aW9uLgorCShkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGRlYnVnX3dyaXRlX3R5cGUpOiBNYWtlIHN1cmUgd2UgcGFzcyB0aGUgcmVhbCBraW5kLCBub3QgSU5ESVJFQ1QsCisJdG8gdGFnX3R5cGUuICBQYXNzIHRoZSBuYW1lIHJlY3Vyc2l2ZWx5IGZvciBJTkRJUkVDVC4KKworRnJpIEphbiAxOSAxMjozMTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRlYnVnLmggKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBSZW1vdmUgZWxsaXBzaXNfdHlwZS4gIEFkZCBpbnQKKwlhbmQgYm9vbGVhbiBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uX3R5cGUuICBBZGQgYm9vbGVhbiBwYXJhbWV0ZXIgdG8KKwltZXRob2RfdHlwZS4KKwkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogRG9uJ3QgZGVjbGFyZS4KKwkoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlKTogQWRkIGRlYnVnX3R5cGUgKiBhbmQgYm9vbGVhbgorCXBhcmFtZXRlcnMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKGRlYnVnX21ha2VfbWV0aG9kX3R5cGUpOiBBZGQgYm9vbGVhbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCisJY2FsbGVycy4KKwkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEFkZCBib29sZWFuICogcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAorCWNhbGxlcnMuCisJKGRlYnVnX2dldF90YXJnZXRfdHlwZSk6IERlY2xhcmUuCisJKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSk6IEFkZCBmaWVsZHMgYXJnX3R5cGVzIGFuZAorCXZhcmFyZ3MuCisJKHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSk6IEFkZCBmaWVsZCB2YXJhcmdzLgorCShkZWJ1Z19lbGxpcHNpc190eXBlLCBFTExJUFNJU19QKTogUmVtb3ZlLgorCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCisJKGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdfdHlwZXMgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KKwkoZGVidWdfbWFrZV9tZXRob2RfdHlwZSk6IEFkZCB2YXJhcmdzIHBhcmFtZXRlci4KKwkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEFkZCBwdmFyYXJncyBwYXJhbWV0ZXIuCisJKGRlYnVnX2dldF90YXJnZXRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfd3JpdGVfdHlwZSk6IEluIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTiwgcHVzaCBhcmd1bWVudAorCXR5cGVzIGFuZCBwYXNzIGNvdW50IHRvIGZ1bmN0aW9uX3R5cGUuICBJbiBERUJVR19LSU5EX01FVEhPRCwgdXNlCisJYSBzaWduZWQgaW50IGZvciB0aGUgY291bnQsIGRvbid0IGNhbGwgZWxsaXBzaXNfdHlwZSwgYW5kIHBhc3MKKwl2YXJhcmdzIHRvIG1ldGhvZF90eXBlLgorCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyk6IEFkZCB2YXJhcmdzIGZpZWxkLgorCShzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzKTogQWRkIHB2YXJhcmdzIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCShzdGFiX2RlbWFuZ2xlX2FyZ3MpOiBMaWtld2lzZS4KKwkoc3RhYl9kZW1hbmdsZV90eXBlKTogSW4gY2FzZSAnRicsIHBpY2sgdXAgYXJndW1lbnQgdHlwZXMuCisJKiBwcmRiZy5jIChwcl9lbGxpcHNpc190eXBlKTogUmVtb3ZlLgorCShwcl9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ2NvdW50IGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCisJKHByX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLgorCSogaWVlZS5jIChpZWVlX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCisJKGllZWVfZnVuY3Rpb25fdHlwZSk6IEFkZCBhcmdjb3VudCBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgorCShpZWVlX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLiAgUmVtb3ZlIG1vc3Qgb2YKKwlmdW5jdGlvbiBib2R5LCBhbmQganVzdCBjYWxsIGllZWVfZnVuY3Rpb25fdHlwZS4KKworCSogc3RhYnMuYzogSW5jbHVkZSAiZGVtYW5nbGUuaCIuICBBZGRlZCBzZXZlcmFsIG5ldyBzdGF0aWMKKwlmdW5jdGlvbnMgbm90IGxpc3RlZCBiZWxvdyB0byBkZW1hbmdsZSBhcmd1bWVudCB0eXBlczsgdGhleSBhcmUKKwlhbGwgY2FsbGVkIHZpYSBzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzLgorCShmaW5pc2hfc3RhYik6IElmIHRoZSBraW5kIG9mIGFuIHVuZGVmaW5lZCB0YWcgaXMKKwlERUJVR19LSU5EX0lMTEVHQUwsIHVzZSBERUJVR19LSU5EX1NUUlVDVCBpbnN0ZWFkLiAgV2FybiBpZiB0aGVyZQorCWFyZSBhbnkgcGVuZGluZyB2YXJpYWJsZS4KKwkocGFyc2Vfc3RhYik6IERvbid0IGNsb3NlIHRoZSBmdW5jdGlvbiB3aGVuIHRoZSBibG9jayBkZXB0aCBnb2VzCisJdG8gemVyby4gIFBhc3MgdmFsdWUgdG8gZGVidWdfZW5kX2Z1bmN0aW9uLgorCShwYXJzZV9zdGFiX3N0cmluZyk6IEluIGNhc2UgJ1QnLCBwYXNzIHRoZSBuYW1lIHRvCisJcGFyc2Vfc3RhYl90eXBlLgorCShwYXJzZV9zdGFiX3R5cGUpOiBJbiBjYXNlICd4JywgdXNlIHN0YWJfZmluZF90YWdnZWRfdHlwZS4gIEluCisJY2FzZSAnIycsIGhhbmRsZSBmdW5jdGlvbnMgd2l0aCB2YXJpYWJsZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4KKwkocGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZSk6IEFkZCB0YWduYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCShwYXJzZV9zdGFiX21lbWJlcnMpOiBBZGQgdGFnbmFtZSBhbmQgdHlwZW51bXMgcGFyYW1ldGVycy4gIENoYW5nZQorCWFsbCBjYWxsZXJzLiAgSWYgdGhlIHR5cGUgb2YgYSBtZXRob2QgaXMgYSBzdHViLCBjYWxsCisJcGFyc2Vfc3RhYl9hcmd0eXBlcyB0byBkZW1hbmdsZSB0aGUgYXJndW1lbnQgdHlwZXMgYW5kIGdldCB0aGUKKwlwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKwkocGFyc2Vfc3RhYl9hcmd0eXBlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHN0YWJfcmVjb3JkX3ZhcmlhYmxlKTogRm9yIGEgREVCVUdfR0xPQkFMIG9yIERFQlVHX1NUQVRJQworCXZhcmlhYmxlLCBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4KKwkoc3RhYl9maW5kX3RhZ2dlZF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworCSogZGVidWcuaCAoZW51bSBkZWJ1Z190eXBlX2tpbmQpOiBBZGQgREVCVUdfS0lORF9JTExFR0FMLgorCShzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogQWRkIGZpZWxkIGVsbGlwc2lzX3R5cGUuICBBZGQgaWQKKwlwYXJhbWV0ZXIgdG8gc3RhcnRfc3RydWN0X3R5cGUsIHN0YXJ0X2NsYXNzX3R5cGUsIGFuZCB0YWdfdHlwZS4KKwkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogRGVjbGFyZS4KKwkoZGVidWdfZmluZF9uYW1lZF90eXBlKTogRGVjbGFyZS4KKwkoZGVidWdfZ2V0X3R5cGVfa2luZCk6IERlY2xhcmUuCisJKGRlYnVnX2dldF9yZXR1cm5fdHlwZSk6IERlY2xhcmUuCisJKGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMpOiBEZWNsYXJlLgorCShkZWJ1Z19nZXRfZmllbGRzKTogRGVjbGFyZS4KKwkoZGVidWdfZ2V0X2ZpZWxkX3R5cGUpOiBEZWNsYXJlLgorCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IEFkZCBmaWVsZHMgY2xhc3NfaWQgYW5kIGJhc2VfaWQuCisJKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlKTogQWRkIGZpZWxkIGlkLgorCShzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgdG8gcGh5c25hbWUuCisJQ2hhbmdlIGFsbCB1c2VzLgorCShkZWJ1Z19lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoRUxMSVBTSVNfUCk6IE5ldyBtYWNyby4KKwkoZGVidWdfbWFrZV9lbGxpcHNpc190eXBlKTogTmV3IGZ1bmN0aW9uLgorCShkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHRvIHBoeXNuYW1lLgorCShkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgorCShkZWJ1Z19uYW1lX3R5cGUpOiBBbHdheXMgcHV0IHR5cGVzIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLgorCShkZWJ1Z19maW5kX25hbWVkX3R5cGUpOiBOZXcgZnVuY3Rpb24uCisJKGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUpOiBUcmVhdCBERUJVR19LSU5EX0lMTEVHQUwgc3BlY2lhbGx5LAorCXJhdGhlciB0aGFuIERFQlVHX0tJTkRfVk9JRC4KKwkoZGVidWdfZ2V0X3JlYWxfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGRlYnVnX2dldF90eXBlX2tpbmQpOiBOZXcgZnVuY3Rpb24uCisJKGRlYnVnX2dldF9yZXR1cm5fdHlwZSk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfZ2V0X2ZpZWxkcyk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfZ2V0X2ZpZWxkX3R5cGUpOiBOZXcgZnVuY3Rpb24uCisJKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBiYXNlX2lkLgorCShkZWJ1Z193cml0ZV90eXBlKTogUGFzcyBuZXcgaWQgYXJndW1lbnQgdG8gdGFnX3R5cGUuICBIYW5kbGUKKwlERUJVR19LSU5EX0lMTEVHQUwuICBVc2UgaWQgZm9yCURFQlVHX0tJTkRfU1RSVUNUIGFuZAorCURFQlVHX0tJTkRfVU5JT04uICBIYW5kbGUgZWxsaXBzaXMgZm9yIG1ldGhvZCBhcmd1bWVudHMuCisJKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBEb24ndCBkZXJlZmVyZW5jZSBrY2xhc3MgaWYgaXQgaXMgTlVMTC4KKwlVc2UgaWQuCisJKiBwcmRiZy5jIChwcl9mbnMpOiBBZGQgcHJfZWxsaXBzaXNfdHlwZS4KKwkocHJfZWxsaXBzaXNfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHByX3BvaW50ZXJfdHlwZSk6IElmIHRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5LCBwYXJlbnRoZXNpemUKKwlpdCBjb3JyZWN0bHkuCisJKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogQWRkIGlkIHBhcmFtZXRlci4KKwkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgorCShwcl90YWdfdHlwZSk6IExpa2V3aXNlLgorCShwcl9maXhfdmlzaWJpbGl0eSk6IEFkZCB0aGUgdmlzaWJpbGl0eSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjaywKKwlub3QgdGhlIHNlY29uZCBlbGVtZW50IG9uIHRoZSBzdGFjay4KKwkocHJfc3RydWN0X2ZpZWxkKTogUG9wIHRoZSBzdGFjayBiZWZvcmUgY2FsbGluZyBwcl9maXhfdmlzaWJpbGl0eS4KKwkocHJfY2xhc3Nfc3RhdGljX21lbWJlcik6IExpa2V3aXNlLgorCShwcl9jbGFzc19zdGFydF9tZXRob2QpOiBEb24ndCBwdXNoIGEgdHlwZSwganVzdCBzZXQgdGhlIG1ldGhvZAorCW5hbWUgaW4gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCisJKHByX2NsYXNzX2VuZF9tZXRob2QpOiBEb24ndCBwb3AgdGhlIHN0YWNrLgorCShwcl9jbGFzc19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyBwYXJhbWV0ZXIgdG8gcGh5c25hbWUuCisJQXBwZW5kIGNvbnN0IGFuZCB2b2xhdGlsZSByYXRoZXIgdGhhbiBwcmVwZW5kaW5nIHRoZW0uICBBZGQgYQorCXNwYWNlIGFmdGVyIHRoZSBwaHlzbmFtZS4KKwkocHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCisJKiBpZWVlLmMgKGllZWVfZm5zKTogQWRkIGllZWVfZWxsaXBzaXNfdHlwZS4KKwkoaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSk6IFVzZSBERUJVR19LSU5EX0lMTEVHQUwgcmF0aGVyIHRoYW4KKwlERUJVR19LSU5EX1ZPSUQuCisJKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBMaWtld2lzZS4KKwkoaWVlZV90eXBkZWYpOiBMaWtld2lzZS4KKwkoaWVlZV9lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSk6IEFkZCBpZCBwYXJhbWV0ZXIuCisJKGllZWVfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgorCShpZWVlX3RhZ190eXBlKTogTGlrZXdpc2UuCisJKGllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgbmFtZSB0byBwaHlzbmFtZS4KKwkoaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KKworCSogTWFrZWZpbGUuaW4gKERFQlVHX09CSlMpOiBSZW1vdmUgcHJkYmcuby4KKwkoJChPQkpEVU1QX1BST0cpKTogRGVwZW5kIHVwb24sIGFuZCBsaW5rIGFnYWluc3QsIHByZGJnLm8uCisKK1RodSBKYW4gMTggMTc6MzU6MDYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAobWFrZV90YWlsKTogQ2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIHNlY3Rpb25zIHRvIGF2b2lkCisJYW4gYWxpZ25tZW50IHByb2JsZW0uCisKK1dlZCBKYW4gMTcgMTQ6MjM6MDAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBzcmNvbnYuYyAod3JfZHUpOiBTZXQgZHUuc3RhY2tmcm10IHRvIDAuCisJKHdyX3VuLCB3cl9zYyk6IEVtaXQgYWxsIHNlY3Rpb25zLCBldmVuIHRob3NlIHdpdGggMCBzaXplLgorCitUdWUgSmFuIDE2IDE2OjE1OjQ5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogc3Jjb252LmMgKHdyX2hkKTogU3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCB3YXMgYmVpbmcKKwlzdG9yZWQgaW4gc2VnbWVudCBpZGVudGlmaWVyIGZpZWxkLgorCitUdWUgSmFuIDE2IDEyOjA3OjI1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZy5pbiAoQlVJTERfTkxNQ09OViwgQlVJTERfU1JDT05WLCBTWVNJTkZPX1BST0csCisJQlVJTERfRExMVE9PTCk6IFB1dCBkZWZpbml0aW9ucyBmb3IgdGhlc2UgaW50byBtYWtlZmlsZSB3aGVuCisJY29uZmlndXJpbmcsIGluc3RlYWQgb2YgYWx3YXlzIGNsZWFyaW5nIGluIG1wdy1tYWtlLnNlZC4KKwkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgYW55IGhvc3RfYWxpYXMgb3IgdGFyZ2V0X2FsaWFzIHNldHRpbmdzLAorCWZpeCBwYXRobmFtZSB0byBCRkQgaW50ZXJuYWwgaW5jbHVkZSBmaWxlcywgcmVtb3ZlIGRlcGVuZGVuY3kKKwljYWxjdWxhdGlvbiBydWxlcy4KKworVGh1IEphbiAxMSAxNzozMTozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IEFkZCBuZXcgc2VjdGlvbiBmbGFncworCVNFQ197RVhDTFVERSxTT1JUX0VOVFJJRVN9LgorCitUaHUgSmFuIDExIDExOjQ1OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IE5VTEwgdGVybWluYXRlIHRoZSBvdXRwdXQgc3ltYm9scy4KKwkoY29weV9vYmplY3QpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBwb3NzaWJsZSBleHRyYSBOVUxMIHBvaW50ZXIuCisKKwkqIGRlYnVnLmMgKGRlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlKTogTWFrZSBzdXJlIHdlIGFyZQorCWdpdmVuIGEga2luZCBvZiB0eXBlIHdlIGNhbiBoYW5kbGUuCisJKGRlYnVnX3dyaXRlX3R5cGUpOiBIYW5kbGUgdW5kZWZpbmVkIGVudW1zIGFuZCBzdHJ1Y3RzLgorCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogSGFuZGxlIHVuZGVmaW5lZCBjbGFzc2VzLgorCSogcHJkYmcuYyAocHJfZW51bV90eXBlKTogSGFuZGxlIGFuIHVuZGVmaW5lZCBlbnVtLgorCSogaWVlZS5jIChpZWVlX2VudW1fdHlwZSk6IExpa2V3aXNlLgorCitXZWQgSmFuIDEwIDE1OjMzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgZGVwZW5kZW5jaWVzLgorCShBTExPQ0EsIE1BTExPQyk6IFJlbW92ZSB2YXJpYWJsZXMuCisJKEFERExfTElCUyk6IFJlbW92ZSAkKE1BTExPQykgZnJvbSBkZWZpbml0aW9uLgorCSogYWxsb2NhLmMsIGdtYWxsb2MuYzogUmVtb3ZlLgorCitNb24gSmFuICA4IDE4OjAyOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jOiBBZGQgZ2xvYmFsIGZ1bmN0aW9uIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gYW5kIGEKKwlidW5jaCBvZiBzdGF0aWMgZnVuY3Rpb25zIGFuZCBzdHJ1Y3RzIHVzZWQgdG8gd3JpdGUgb3V0IElFRUUKKwlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisJKiBidWRiZy5oICh3cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvKTogRGVjbGFyZS4KKworCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV90eXBlKTogQWRkIHBzbG90IGZpZWxkLgorCShlbnVtIGJ1aWx0aW5fdHlwZXMpOiBEZWZpbmUuCisJKGllZWVfYnVpbHRpbl90eXBlKTogRm9yIGEgcG9pbnRlciwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmFtZWQKKwl0eXBlLiAgVXNlIGVudW0gdmFsdWVzIHJhdGhlciB0aGFuIG51bWJlcnMuCisJKGllZWVfYWxsb2NfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGllZWVfcmVhZF90eXBlX2luZGV4KTogVXNlIGllZWVfYWxsb2NfdHlwZS4KKwkocGFyc2VfaWVlZV9iYik6IExpa2V3aXNlLgorCShwYXJzZV9pZWVlX3R5KTogTGlrZXdpc2UuICBVc2UgaWVlZV9idWlsdGluX3R5cGUgZm9yIGFycmF5IHJhbmdlLAorCXJhdGhlciB0aGFuIG1ha2luZyBhIG5ldyBpbnRlZ2VyIHR5cGUuICBTdG9yZSB0aGUgbmV3IHR5cGUgaW4gdGhlCisJc2xvdCwgaWYgdGhlcmUgaXMgb25lLgorCShwYXJzZV9pZWVlX2F0bik6IFRyZWF0IEFUTjEwIGFzIGRlZmluaW5nIGEgcmVnaXN0ZXIgdmFyaWFibGUuCisJKGllZWVfcmVnbm9fdG9fZ2VucmVnKTogUmVuYW1lIGZyb20gaWVlZV9yZWdub190b19nZW4uICBDaGFuZ2UgYWxsCisJY2FsbGVycy4KKwkoaWVlZV9nZW5yZWdfdG9fcmVnbm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCisJKiBzdGFicy5jIChwYXJzZV9zdGFiX3R5cGUpOiBBZGQgbmV3IHR5cGVuYW1lIHBhcmFtZXRlci4gIENoYW5nZQorCWFsbCBjYWxsZXJzLgorCShwYXJzZV9zdGFiX3JhbmdlX3R5cGUpOiBBZGQgbmV3IHR5cGVuYW1lIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCisJKiBkZWJ1Zy5oIChzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zKTogQWRkIHRhZyBwYXJhbWV0ZXIgdG8KKwllbnVtX3R5cGUsIHN0YXJ0X3N0cnVjdF90eXBlLCBhbmQgc3RhcnRfY2xhc3NfdHlwZS4KKwkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBQYXNzIGFueSB0YWcgbmFtZSB0bworCXN0YXJ0X3N0cnVjdF90eXBlLCBkZWJ1Z193cml0ZV9jbGFzc190eXBlLCBhbmQgZW51bV90eXBlLiAgSWYKKwlERUJVR19LSU5EX1RBR0dFRCwgcGFzcyB0aGUgbmFtZSBpbiB0aGUgcmVjdXJzaXZlIGNhbGwuCisJKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBBY2NlcHQgYSBuZXcgdGFnIHBhcmFtZXRlciwgYW5kIHBhc3MgaXQKKwl0byBzdGFydF9jbGFzc190eXBlLgorCSogcHJkYmcuYyAocG9wX3R5cGUpOiBEb24ndCByZW1vdmUgJysnIGNoYXJhY3Rlci4KKwkocHJfZW51bV90eXBlKTogQWNjZXB0IGFuZCB1c2UgdGFnIHBhcmFtZXRlci4KKwkocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBMaWtld2lzZS4KKwkocHJfc3RhcnRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgorCShwcl9jbGFzc19iYXNlY2xhc3MpOiBBZGp1c3QgYWxnb3JpdGhtIHVzZWQgdG8gZmluZCB3aGVyZSB0byBwdXQKKwl0aGUgYmFzZWNsYXNzIG5hbWUuCisJKHByX3RhZyk6IERvbid0IGJvdGhlciB0byBpbnNlcnQgdGhlIHRhZyBuYW1lLgorCisJKiBvYmpjb3B5LmM6IEluY2x1ZGUgYnVkYmcuaC4KKwkoY29udmVydF9kZWJ1Z2dpbmcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShPUFRJT05fREVCVUdHSU5HKTogRGVmaW5lLgorCShjb3B5X29wdGlvbnMpOiBBZGQgImRlYnVnZ2luZyIuCisJKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tZGVidWdnaW5nLgorCShpc19zdHJpcF9zZWN0aW9uKTogU2tpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgY29udmVydF9kZWJ1Z2dpbmcuCisJKHNldHVwX3NlY3Rpb24sIGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgorCShmaWx0ZXJfc3ltYm9scyk6IFNraXAgZGVidWdnaW5nIHN5bWJvbHMgaWYgY29udmVydF9kZWJ1Z2dpbmcuCisJKGNvcHlfb2JqZWN0KTogSWYgY29udmVydF9kZWJ1Z2dpbmcsIHJlYWQgYW5kIHdyaXRlIGRlYnVnZ2luZworCWluZm9ybWF0aW9uLgorCSh3cml0ZV9kZWJ1Z2dpbmdfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvcHlfbWFpbik6IEhhbmRsZSAtLWRlYnVnZ2luZy4KKwkqIE1ha2VmaWxlLmluIChERUJVR19PQkpTKTogTmV3IHZhcmlhYmxlLgorCSgkKE9CSkNPUFlfUFJPRykpOiBEZXBlbmQgdXBvbiBhbmQgbGluayBhZ2FpbnN0ICQoREVCVUdfT0JKUykuCisJKCQoU1RSSVBfUFJPRykpOiBMaWtld2lzZS4KKwkoT0JKRFVNUF9PQkpTKTogUmVtb3ZlIHZhcmlhYmxlLgorCSgkKE9CSkRVTVBfUFJPRykpOiBVc2Ugb2JqZHVtcC5vICQoREVCVUdfT0JKUykgcmF0aGVyIHRoYW4KKwkkKE9CSkRVTVBfT0JKUykuCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tZGVidWdnaW5nLgorCitUaHUgSmFuICA0IDE2OjMxOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaWVlZS5jOiBOZXcgZmlsZSB3aXRoIGNvZGUgdG8gcmVhZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKwkqIGJ1ZGJnLmggKHBhcnNlX2llZWUpOiBEZWNsYXJlLgorCSogcmRkYmcuYyAocmVhZF9kZWJ1Z2dpbmdfaW5mbyk6IEhhbmRsZSBJRUVFIGZsYXZvdXIgZmlsZXMuCisJKHJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKENGSUxFUyk6IEFkZCBpZWVlLmMuCisJKE9CSkRVTVBfT0JKUyk6IEFkZCBpZWVlLm8uCisKKwkqIGJ1Y29tbS5oICh4cmVhbGxvYyk6IENoYW5nZSB0eXBlIG9mIGZpcnN0IHBhcmFtZXRlciBmcm9tIGNoYXIgKgorCXRvIFBUUi4KKworVHVlIEphbiAgMiAxNzo0NDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBBZGQgdGFyZ2V0cyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCVJlbW92ZSB0YXJnZXRzIHdoaWNoIGp1c3QgbGlzdGVkIGRlcGVuZGVuY2llcyBvZiAubyBmaWxlcy4KKwkoREVQKTogTmV3IHZhcmlhYmxlLgorCShIRklMRVMsIEdFTkVSQVRFRF9IRklMRVMpOiBOZXcgdmFyaWFibGVzLgorCShDRklMRVMsIEdFTkVSQVRFRF9DRklMRVMpOiBOZXcgdmFyaWFibGVzLgorCSh1bmRlcnNjb3JlLmMpOiBEb24ndCBkbyBhbnl0aGluZywganVzdCBkZXBlbmQgdXBvbiBzdGFtcC11bmRlci4KKwkoc3RhbXAtdW5kZXIpOiBOZXcgdGFyZ2V0OyBkbyB3aGF0IHVuZGVyc2NvcmUuYyB1c2VkIHRvIGRvLgorCShubG1jb252Lm8pOiBEZXBlbmQgdXBvbiBzeW0uaCBhbmQgZWNvZmYuaC4KKwkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuCisJKHN0YWdlMSwgc3RhZ2UyLCBzdGFnZTMsIGFnYWluc3QsIGNvbXBhcmlzb24pOiBSZW1vdmUuCisJKGRlLXN0YWdlMSwgZGUtc3RhZ2UyLCBkZS1zdGFnZTMpOiBSZW1vdmUuCisJKGNsZWFuLCBkaXN0Y2xlYW4pOiBSZW1vdmUgc3RhbXAtdW5kZXIgYW5kIGRlcC5zZWQuCisJKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KKworCUltcGxlbWVudCBnZW5lcmljIGRlYnVnZ2luZyBzdXBwb3J0LiAgSW1wbGVtZW50IGEgc3RhYnMgcmVhZGVyIGFuZAorCWEgZ2VuZXJpYyBwcmludGVyLgorCSogYnVkYmcuaCwgZGVidWcuYywgZGVidWcuaCwgcHJkYmcuYywgcmRkYmcuYywgc3RhYnMuYzogTmV3IGZpbGVzLgorCSogb2JqZHVtcC5jOiBJbmNsdWRlICJkZWJ1Zy5oIiBhbmQgImJ1ZGJnLmgiLgorCShkdW1wX2RlYnVnZ2luZyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisJKHVzYWdlKTogTWVudGlvbiAtLWRlYnVnZ2luZy4KKwkobG9uZ19vcHRpb25zKTogQWRkICJkZWJ1Z2dpbmciLgorCShkaXNwbGF5X2JmZCk6IEhhbmRsZSAtLWRlYnVnZ2luZy4KKwkqIE1ha2VmaWxlLmluIChPQkpEVU1QX09CSlMpOiBOZXcgdmFyaWFibGUuCisJKCQoT0JKRFVNUF9QUk9HKSk6IFVzZSAkKE9CSkRVTVBfT0JKUykuCisJKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC0tZGVidWdnaW5nLgorCitTYXQgRGVjIDMwIDA5OjU5OjUxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbm0uYyAoIGxvbmdfb3B0aW9ucyk6IEFkZCAiLS1kZWZpbmVkLW9ubHkiIG9wdGlvbi4KKwkodXNhZ2UpOiBVcGRhdGUgZm9yIG5ldyAiLS1kZWZpbmVkLW9ubHkiIG9wdGlvbi4KKwkoZmlsdGVyX3N5bWJvbHMpOiBIYW5kbGUgIi0tZGVmaW5lZC1vbmx5Ii4KKworRnJpIERlYyAyOSAxNjowNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFycGFyc2UueTogSW5jbHVkZSAiYnVjb21tLmgiLCBub3QgPHN5c2RlcC5oPi4KKwkqIG5sbWhlYWRlci55OiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCisKK1R1ZSBEZWMgMjYgMTg6MjM6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBubS5jIChwcmludF9zeW1kZWZfZW50cnkpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKKwliZmRfZ2V0X2VsdF9hdF9pbmRleC4KKworU2F0IERlYyAyMyAxMTowMzoxNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmNneW5zdS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoRExMVE9PTF9ERUZTKTogQnVpbGQgZGxsdG9vbCBmb3IgUG93ZXJQQyBpZiB0YXJnZXQKKwlpcyBwb3dlcnBjKi0qLXdpbiogaW4gYWRkaXRpb24gdG8gcG93ZXJwYyotKi0qcGUqLgorCitGcmkgRGVjIDE1IDE2OjMwOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChlbmRpYW5fc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSBpdC4KKwkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCisKK0ZyaSBEZWMgMTUgMDc6NTE6MzQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogU3RhcnQgZnJvbSAxIGlmIG5vIG90aGVyIGluc3RydWN0aW9ucworIAlnaXZlbi4KKworVHVlIERlYyAxMiAxMjowNToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSAkKERFTUFOR0xFUl9QUk9HKS4xLiAgRnJvbSBSb25hbGQKKwlGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT4uCisKK01vbiBEZWMgMTEgMTQ6MzM6MDUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtYWMtYmludXRpbHMucjogRml4IGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmdzLgorCisJKiBNYWtlZmlsZS5pbiAodmVyc2lvbik6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCisKK0ZyaSBEZWMgIDEgMTQ6NDE6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQgKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgaW4gTWFjLXNwZWNpZmljCisJaW5zdGFsbCBwcm9jZWR1cmUuCisKK1RodSBOb3YgMzAgMjA6MjY6MDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAocHBjX2p0YWIpOiBUaGUgYmluYXJ5IGdsdWUgZm9yIFBvd2VyUEMgZGxsIGxpbmthZ2UsCisJaW5jbHVkaW5nIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24uCisJc2luZm86IGFkZGVkIGEgcHJlZmVycmVkIGFsaWdubWVudCBmaWVsZC4KKwkoc2VjZGF0YSk6IHNlY3Rpb24gZGF0YSBmb3IgdGhlIFBvd2VyUEMgdmVyc2lvbi4KKwkobWFrZV9vbmVfbGliX2ZpbGUpOiBNb3JlIHN5bWJvbHMsIE1vcmUgc2VjdGlvbnMgKHBkYXRhLCByZGF0YSkKKwkobWFrZV90YWlsKTogVXNlIGlkYXRhJDYgaW5zdGVhZCBvZiBpZGF0YSQ3IGZvciBwcGMuIEFsc28gYWRkZWQgYQorCU5VTEwgaWRhdGEkMyBkZXNjcmlwdG9yICh0ZW1wb3JhcnkpLgorCitUdWUgTm92IDI4IDE3OjIzOjQ0IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IERvbid0IHJlZmVyZW5jZSBkX2V4cG9ydF92ZWMgaWYKKwl0aGVyZSBhcmUgbm8gZXhwb3J0ZWQgZnVuY3Rpb25zLgorCitNb24gTm92IDI3IDEzOjA1OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgorCitXZWQgTm92IDIyIDEzOjE3OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogU3RhcnQgYXNzaWduaW5nIG9yZGluYWxzIGF0IDEuCisKKwkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBVc2UgJCRyLCBub3QgJCR7cm9vdG1lfS4KKwkoY2hlY2spOiBTZXQgciwgbm90IHJvb3RtZS4KKworVHVlIE5vdiAyMSAxODowNDowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgorCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fRlBSSU5URiBpbiBAVE9QQCBzZWN0aW9uLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCisKK0ZyaSBOb3YgMTcgMTA6MzQ6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFVzZSBAaG9zdEAgYW5kIEB0YXJnZXRALCBub3QKKwkkKGhvc3RfY2Fub25pY2FsKSBhbmQgJCh0YXJnZXRfY2Fub25pY2FsKS4KKworVGh1IE5vdiAxNiAwMzozOToyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCVZlcnNpb24gMi42IHJlbGVhc2VkLgorCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi42LgorCitXZWQgTm92IDE1IDEyOjE0OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBEZWZpbmUuCisJKGNoZWNrKTogUGFzcyBDQyBhbmQgQ0ZMQUdTIHRvIHJ1bnRlc3QuCisKKwkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBEb24ndCByZXF1aXJlIGEgRFlOQU1JQyBvYmplY3Qgd2hlbgorCWR1bXBpbmcgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgorCisJKiBvYmpkdW1wLmMgKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIGxvY2FsCisJc3ltYm9scyBiZWZvcmUgZGVidWdnaW5nIHN5bWJvbHMuCisJKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IERvbid0IGZ1dHogYXJvdW5kIGxvb2tpbmcgZm9yIGEgZ2xvYmFsCisJc3ltYm9sIHdpdGggdGhlIHNhbWUgdmFsdWUuCisKK1R1ZSBOb3YgMTQgMTc6MTk6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkbGx0b29sLmM6IFVzZSBGT1BFTl8qIG1hY3JvcyByYXRoZXIgdGhhbiAiciIgb3IgInciLgorCisJKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBDb3JyZWN0IG1lbXNldCBjYWxsLgorCitTdW4gTm92IDEyIDEyOjU2OjA1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkIChERU1BTkdMRVJfUFJPRyk6IEVkaXQgb3V0IGF0dGVtcHRzIHRvIGRvIGFueXRoaW5nCisgCXdpdGggdGhlIG1hbiBwYWdlLgorCitGcmkgTm92IDEwIDExOjQxOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChzZXR1cF9zZWN0aW9uKTogQ29weSB0aGUgc2VjdGlvbiBsbWEgaW5kZXBlbmRlbnRseSBvZgorCXRoZSB2bWEuCisKK1dlZCBOb3YgIDggMTE6MzM6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcnN1cC5jIChhcl9vcGVuKTogQ2FzdCBtYWxsb2MgcmV0dXJuIHZhbHVlLgorCitUdWUgTm92ICA3IDA5OjAxOjI2IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAoRExMVE9PTF9ERUZTKTogQWRkZWQgcHBjIHRhcmdldC4KKwkqIGRsbHRvb2wuYyAoTVBQQyk6IEFkZGVkIGJhc2ljIFBQQyBkZWZpbml0aW9ucy4KKworVHVlIE5vdiAgNyAxNDowMjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHJlYXQgcnM2MDAwLSotbHlueCogc3BlY2lhbGx5LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlnL3JzbHlueDogUmVtb3ZlLgorCSogTWFrZWZpbGUuaW46IFJlbW92ZSBAdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC4KKworTW9uIE5vdiAgNiAxNTowMDo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJ1Y29tbS5oOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4uCisJKiBhci5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gb3IgPHN0ZGlvLmg+LgorCSogYnVjb21tLmMsIGRsbHRvb2wuYywgbmxtY29udi5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYzogTGlrZXdpc2UuCisKK0ZyaSBOb3YgIDMgMTI6Mzg6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KKworCVBlcm1pdCB1c2VyIHRvIG92ZXJyaWRlIERFTUFOR0xFUl9QUk9HIGZyb20gY29tbWFuZCBsaW5lLiAgRnJvbQorCU1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4uCisJKiBNYWtlZmlsZS5pbiAoJChERU1BTkdMRVJfUFJPRykpOiBEZXBlbmQgdXBvbgorCSQoREVNQU5HTEVSX1BST0cpLjEuCisJKGluc3RhbGwpOiBEb24ndCBkZXBlbmQgdXBvbiAkKERFTUFOR0xFUl9QUk9HKS4xLiAgT25seSBpbnN0YWxsCisJJChERU1BTkdMRVJfUFJPRykuMSBpZiAkKERFTUFOR0xFUl9QUk9HKSBpcyBub3QgZW1wdHkuCisKK1dlZCBOb3YgIDEgMTU6MDQ6NTcgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIE1ha2VmaWxlLmluIChzeXNsZXgubyk6IGFkZCAtSSQoc3JjZGlyKSBpZiBjb21waWxpbmcgaW4gYQorCXNlcGFyYXRlIGRpcmVjdG9yeS4KKworTW9uIE9jdCAzMCAxNDoyNDoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSBpdC4gIElmIHdlIG5lZWQgdGhlIHJpZ2h0IHNlY3Rpb24gZm9yCisJdGhlIHN5bWJvbCwgYW5kIHdlIGNhbid0IGZpbmQgaXQsIHByaW50IGFuIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uCisJcmF0aGVyIHRoYW4gdXNpbmcgYSBzeW1ib2wgZnJvbSBzb21lIG90aGVyIHNlY3Rpb24uCisKK1RodSBPY3QgMjYgMTA6MjM6MTQgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChub19pZGF0YTQsIG5vX2lkYXRhNSk6IE5ldy4KKwkoYXJtX2p0YWIpOiBVc2UgY29ycmVjdCBlbmNvZGluZyBvZiBqdW1wIGluc3RydWN0aW9uLgorCSh1c2FnZSwgbWFpbiwgbWFrZV9oZWFkLCBtYWtlX3RhaWwpOiBBY3Qgb24gbm9faWRhdGE0LCBub19pZGF0YTUuCisKK1dlZCBPY3QgMjUgMTI6MTA6MDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IEVkaXQgcGF0aHMgdG8gZ2VuZXJhdGVkIHkudGFiLltjaF0gZmlsZXMuCisKK0ZyaSBPY3QgMjAgMTg6NDA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy50ZXhpOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KKworVGh1IE9jdCAxOSAxNzo0Nzo0MSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgZXh0cmFuZW91cyB0YWIgb24gb3RoZXJ3aXNlIGVtcHR5IGxpbmUsCisJd2hpY2ggY29uZnVzZXMgbWFueSBub24tR05VIHZlcnNpb25zIG9mICJtYWtlIi4KKworV2VkIE9jdCAxOCAxNjozMTo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBkbGx0b29sLmMgKGkzODZfanRhYiwgYXJtX2p0YWIpOiBOZXcKKwkoZ2VuX2xpYl9maWxlKTogUmV3cml0dGVuIHRvIHVzZSBiZmQuCisKK0ZyaSBPY3QgMTMgMTY6MTA6MDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZiBkbGx0b29sCisJd2Fzbid0IGJ1aWx0LgorCitGcmkgT2N0IDEzIDExOjA0OjM3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRlZmxleC5sOiBBbGxvdyBxdW90aW5nIG9mIElEcy4KKwkqIGRlZnBhcnNlLnkgKCV1bmlvbik6IHN0cmluZyBkZWxldGVkLgorCShjb21tYW5kKTogREVTQ1JJUFRJT04gdGFrZXMgSUQuCisJKiBkbGx0b29sLmMgKGdlbl9kZWZfZmlsZSk6IFF1b3RlIG91dGdvaW5nIG5hbWUgaWYKKwluZWNlc3NhcnkuICBQcmVzZXJ2ZSBOT05BTUUuCisJKGdlbl9saWJfZmlsZSk6IFJ1biByYW5saWIuCisJKHdvcmtvdXRfcHJlZml4KTogRGVsZXRlZC4KKwkobWFpbiwgdXNhZ2UsIGxvbmdfb3B0aW9ucyk6IEFkZCAtLWFzLCAtLXJhbmxpYiwgLS1hciBvcHRpb25zLgorCitXZWQgT2N0IDExIDEzOjM2OjEzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAobXRhYmxlKTogSE9XX0FMSUdOX0xPTkcsIG5ldy4KKwkoZF9vcmQpOiBEZWxldGVkLgorCShkX2xvd19vcmQsIGRfaGlnaF9vcmQsIGRfbmFtZWRfZnVuY3MpOiBOZXcuCisJKGdlbl9leHBfZmlsZSk6IENyZWF0ZSBub25hbWUgZW50cmllcyBjb3JyZWN0bHkuCisJKGdlbl9saWJfZmlsZSk6IER1bXAgZXhwb3J0cyBhbHBoYWJldGljYWxseS4KKwkocHJvY2Vzc19kdXBsaWNhdGVzKTogIENvdW50IG5vbmFtZWQgZnVuY3Rpb25zLgorCShmaWxsX29yZGluYWxzKTogS2VlcCB0cmFjayBvZiBoaWdoZXN0IG9yZCB0b28uCisJKG1hbmdsZV9kZWZzKTogQ3JlYXRlIGFscGhhYmV0aWNhbGx5IG9yZGVyZWQgbGlzdCBvZiBuYW1lcy4KKworVHVlIE9jdCAxMCAwOTozOTowOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVE9PTF9QUk9HUyk6IEluY2x1ZGUgRExMVE9PTF9QUk9HLgorCitNb24gT2N0ICA5IDEzOjA2OjMxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAoYWRkX3VuZGVyc2NvcmUpOiBOZXcuCisJKHhsYXRlKTogVXNlIG5ldyBuYW1lLgorCShtYWluLCB1c2FnZSk6IFVwZGF0ZS4KKworRnJpIE9jdCAgNiAxNDowODo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogc3lzaW5mby55OiBFbGltaW5hdGUgdW51c2VkIHRlcm1pbmFscyAiWyIgYW5kICJdIiBhbmQgdW51c2VkCisJbm9udGVybWluYWwgIm5hbWUiLiAgT25lIHMvciBjb25mbGljdCByZW1haW5zLgorCisJTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbm0uYyAocHJpbnRfc3ltbmFtZSk6IERvbid0IHRyeSB0byBkZW1hbmdsZSBhbiBlbXB0eQorCW5hbWUuCisJKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IFJlc2V0IHN5bWNvdW50IGlmIHRoZXJlIGFyZQorCW5vIHN5bWJvbHMuCisJKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UsIGZvciBkeW5zeW1jb3VudC4KKwkoZGlzYXNzZW1ibGVfZGF0YSk6IEZpeCBtZW1vcnkgbGVhazogZnJlZSBzb3J0ZWRfc3ltcyB3aGVuIGRvbmUuCisJKGRpc3BsYXlfYmZkKTogTGlrZXdpc2UsIGZvciBzeW1zIGFuZCBkeW5zeW1zLgorCShkdW1wX3JlbG9jcyk6IERvbid0IHByaW50IGhlYWRlciBiZWZvcmUgcG9zc2libHkgZ2VuZXJhdGluZyBhbgorCWVycm9yIG1lc3NhZ2UuCisJKGR1bXBfZHluYW1pY19yZWxvY3MpOiBMaWtld2lzZS4KKworCSogYXIuMSwgbm0uMSwgb2JqZHVtcC4xLCBzaXplLjEsIHN0cmluZ3MuMSwgc3RyaXAuMTogRml4IHR5cG9zIGFuZAorCWZvcm1hdHRpbmcgYnVncy4KKworRnJpIE9jdCAgNiAxMjowMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFyLmMgKGRvX3F1aWNrX2FwcGVuZCk6IENvbW1lbnQgb3V0LgorCShyZXBsYWNlX21lbWJlcnMpOiBBZGQgcXVpY2sgYXJndW1lbnQuCisJKG1haW4pOiBEb24ndCBjYWxsIGRvX3F1aWNrX2FwcGVuZC4KKwkob3Blbl9pbmFyY2gpOiBEb24ndCBjYWxsIHF1aWNrX2FwcGVuZCB0byBjcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4KKwlJbnN0ZWFkIGNhbGwgYmZkX29wZW53L2JmZF9zZXRfZm9ybWF0L2JmZF9jbG9zZS4KKworVGh1IE9jdCAgNSAyMDo1MzowOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogYnVjb21tLmM6IEFsd2F5cyBpbmNsdWRlIHRpbWUuaC4KKworVGh1IE9jdCAgNSAxNzoyNToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQKKwlzeW1ib2xzIGFmdGVyIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gIExpa2V3aXNlIGZvcgorCXN5bWJvbHMgd2hpY2ggbG9vayBsaWtlIGZpbGUgbmFtZXMuCisJKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEFsd2F5cyBjaG9zZSB0aGUgZmlyc3QgcmVhc29uYWJsZSBzeW1ib2wKKwl3aXRoIGEgZ2l2ZW4gdmFsdWUuCisKK1R1ZSBPY3QgIDMgMjI6Mzg6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcnN1cC5jIChhcl9zYXZlKTogVXNlIHJlbmFtZSwgbm90IHVubGluay9saW5rL3VubGluay4KKworTW9uIE9jdCAgMiAxMjoxMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0cmluZ3MuYyAobWFpbik6IEV4aXQgd2l0aCB6ZXJvIHN0YXR1cyBpZiBubyBmaWxlcyBhcmUgZ2l2ZW4KKwlhbmQgc3RhbmRhcmQgaW5wdXQgaXMgcmVhZC4KKworVGh1IFNlcCAyOCAyMDowMzowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW46IENhbGN1bGF0ZSB1bmRlcnNjb3JlIGFuZCBwdXQgaW50byBtYWtlZmlsZQorCWZyYWdtZW50LCBnZW5lcmF0ZSBjb25maWcuaC4KKwkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byBlZGl0IFVuaXggbWFrZWZpbGUKKwlpbnRvIE1QVyBzeW50YXguCisJKiBtcHctbWFrZS5pbjogUmVtb3ZlLgorCSogbWFjLWJpbnV0aWxzLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2VzLgorCitUaHUgU2VwIDI4IDE1OjQ5OjAwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYzogKGdlbl9leHBfZmlsZSk6IEFsd2F5cyBlbWl0IGEgLnJlbG9jIHNlY3Rpb24gaWYKKwlyZWxvY2F0YWJsZS4KKwkoaW1wX25hbWVfbGFiKTogTmV3LgorCShnZW5fZGVmX2ZpbGUpOiBOZXcuCisJKGdlbl9saWJfZmlsZSk6IFVzZSBpbXBfbmFtZV9sYWIuCisJKG1haW4pOiBJbml0aWFsaXplIGltcF9uYW1lX2xhYi4KKworTW9uIFNlcCAyNSAxMjowNTozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfU1lTX1dBSVQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWcuaW46IFJlYnVpbGQuCisJKiBkbGx0b29sLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIiBhbmQgImJ1Y29tbS5oIi4gIERvbid0IGluY2x1ZGUKKwk8c3RkaW8uaD4sIDxzdGRsaWIuaD4sIG9yIDxzdHJpbmcuaD4uICBEb24ndCBpbmNsdWRlIDx3YWl0Lmg+LgorCUluY2x1ZGUgPHN5cy90eXBlcy5oPi4gIFVzZSBIQVZFX1NZU19XQUlUX0ggdG8gY29udHJvbCB3aGV0aGVyIHRvCisJaW5jbHVkZSA8c3lzL3dhaXQuaD4gb3IgZGVmaW5lIHRoZSB3YWl0IG1hY3JvcyBieSBoYW5kLiAgRG9uJ3QKKwlkZWNsYXJlIHhtYWxsb2MuCisJKGdlbl9saWJfZmlsZSk6IERvbid0IGFzc3VtZSB0aGF0IHNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisJY2hhcmFjdGVyczsgdXNlIHN0cmxlbiBpbnN0ZWFkLgorCitGcmkgU2VwIDIyIDE3OjE2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgdXNlIHRoZSBvbGQgQkZEIGJhc2VkCisJZGlzYXNzZW1ibGVyIGludGVyZmFjZS4gIE1ha2UgaW5mbyBhIGNvbnN0IHBvaW50ZXIuCisKK1dlZCBTZXAgMTMgMTg6MzM6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKHN0YXJ0X2FkZHJlc3MpOiBOZXcgdmFyaWFibGUuCisJKHN0b3BfYWRkcmVzcyk6IE5ldyB2YXJpYWJsZS4KKwkodXNhZ2UpOiBNZW50aW9uIC0tc3RhcnQtYWRkcmVzcyBhbmQgLS1zdG9wLWFkZHJlc3MuCisJKE9QVElPTl9TVEFSVF9BRERSRVNTLCBPUFRJT05fU1RPUF9BRERSRVNTKTogRGVmaW5lLgorCShsb25nX29wdGlvbnMpOiBBZGQgInN0YXJ0LWFkZHJlc3MiIGFuZCAic3RvcC1hZGRyZXNzIi4KKwkoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSBzdGFydF9hZGRyZXNzIGFuZCBzdG9wX2FkZHJlc3MuCisJKGR1bXBfZGF0YSwgZHVtcF9yZWxvY19zZXQpOiBMaWtld2lzZS4KKwkobWFpbik6IERvbid0IHNldCBzZWVuZmxhZyBmb3IgLWwuICBIYW5kbGUgT1BUSU9OX1NUQVJUX0FERFJFU1MKKwlhbmQgT1BUSU9OX1NUT1BfQUREUkVTUy4KKwkqIG9iamNvcHkuYyAocGFyc2Vfdm1hKTogTW92ZSB0byBidWNvbW0uYy4KKwkqIGJ1Y29tbS5jIChwYXJzZV92bWEpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2JqY29weS5jLgorCSogYnVjb21tLmggKHBhcnNlX3ZtYSk6IERlY2xhcmUuCisJKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IG5ldyBvYmpkdW1wIG9wdGlvbnMuCisKK1R1ZSBTZXAgMTIgMTI6Mzc6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCisKKwkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IERvbid0IGNhbGwgd3JpdGVfYXJjaGl2ZSBpZiBub3RoaW5nCisJY2hhbmdlZC4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQWRkIGNhc3RzIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KKworVGh1IFNlcCAgNyAxMjoxMjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KKwlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCisJY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KKwljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmgsIHN0YW1wLWgsIGFuZAorICAgICAgICBjb25maWcubG9nLgorCisJKiBubS5jICh2YWx1ZV9mb3JtYXQpOiBJbml0aWFsaXplIGJhc2VkIG9uIEJGRDY0IGFuZAorCUJGRF9IT1NUXzY0QklUX0xPTkcuCisJKHByaW50X3JhZGl4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoc2V0X3ByaW50X3JhZGl4KTogU2V0IHByaW50X3JhZGl4LiAgQWRqdXN0IGNoYW5nZXMgdG8KKwl2YWx1ZV9mb3JtYXQuCisJKHByaW50X3ZhbHVlKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgdG8gcHJpbnQgNjQgYml0IG9jdGFsIGFuZAorCWRlY2ltYWwgdmFsdWVzIGNvcnJlY3RseS4KKwkocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogQ2hlY2sgQkZENjQsIG5vdCBCRkRfSE9TVF82NF9CSVQuICBVc2UKKwlwcmludF92YWx1ZS4KKwkocHJpbnRfc3ltYm9sX2luZm9fc3lzdik6IFVzZSBwcmludF92YWx1ZS4KKwkocHJpbnRfc3ltYm9sX2luZm9fcG9zaXgpOiBMaWtld2lzZS4KKworV2VkIFNlcCAgNiAxNTowMjo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICgqLm8pOiBSZW1vdmUgaW5jb3JyZWN0IGRlcGVuZGVuY2llcyBvbgorCSQoQkZERElSKS9ob3N0cy9zdGQtaG9zdC5oLgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9EQVRBKTogQWRkIC1tIDY0NC4KKwkoSU5TVEFMTF9YRk9STTEpOiBMaWtld2lzZS4KKwkoQ0NfRk9SX0JVSUxEKTogU2V0IHRvIEBDQ19GT1JfQlVJTERAIHJhdGhlciB0aGFuICQoQ0MpLgorCShtb3N0bHljbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQkZEX0NDX0ZPUl9CVUlMRCBhbmQgQkZEX0JJTkFSWV9GT1BFTi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIFNlcCAgNSAyMDoyMjo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmV3cml0ZSB0byB1c2UgYXV0b2NvbmYuCisJKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9jb25mLgorCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCisJKiBNYWtlZmlsZS5pbjogVmFyaW91cyBjaGFuZ2VzIGZvciBuZXcgY29uZmlndXJlIHNjcmlwdC4gIEFsc286CisJKFBST0dTKTogUmVtb3ZlICQoU1lTSU5GT19QUk9HKS4KKwkoQUxMX0NGTEFHUyk6IFJlbW92ZSAkKFRERUZJTkVTKS4KKwkodmVyc2lvbi5vKTogVXNlICQoQUxMX0NGTEFHUykuCisJKGNwbHVzLWRlbS5vLCBkbGx0b29sLm8sIG5sbWNvbnYubyk6IExpa2V3aXNlLgorCShzeXNkdW1wLm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaCBhbmQgY29uZmlnLmguCisJKHNyY29udi5vLCBhcnN1cC5vLCBzdHJpbmdzLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KKwkoZmlsZW1vZGUubyk6IERvbid0IGRlcGVuZCB1cG9uIC4uL2JmZC9zeXNkZXAuaC4KKwkoYnVjb21tLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaCwgbm90IC4uL2JmZC9zeXNkZXAuaC4KKwkoc2l6ZS5vLCBvYmpkdW1wLm8sIG5tLm8sIGFyLm8sIG9iamNvcHkubyk6IExpa2V3aXNlLgorCShubG1oZWFkZXIubywgbmxtY29udi5vKTogTGlrZXdpc2UuCisJKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBzeXNkZXAuaC4KKwkqIGJ1Y29tbS5oOiBJbmNsdWRlICJhbnNpZGVjbC5oIiwgPHN0ZGlvLmg+LCBhbmQgImNvbmZpZy5oIi4KKyAgCUluY2x1ZGUgImZvcGVuLXNhbWUuaCIgb3IgImZvcGVuLWJpbi5oIiwgYmFzZWQgb24KKyAJVVNFX0JJTkFSWV9GT1BFTi4gIEluY2x1ZGUgPGVycm5vLmg+LCBhbmQgZGVjbGFyZSBlcnJubyBpZiBpdCBpcworIAlub3QgYSBtYWNyby4gIEluY2x1ZGUgPHVuaXN0ZC5oPiwgPHN0cmluZy5oPiwgPHN0cmluZ3MuaD4sCisgCTxzdGRsaWIuaD4sIGFuZCA8ZmNudGwuaD4gaWYgdGhleSBhcmUgcHJlc2VudC4gIERlY2xhcmUgc3RyY2hyLAorIAlzdHJyY2hyLCBhbmQgc3Ryc3RyIGlmIG5vIHN0cmluZyBoZWFkZXIgZmlsZSBleGlzdHMuICBJbmNsdWRlCisJPHN5cy9maWxlLmg+IGlmIGl0IGV4aXN0cyBhbmQgPGZjbnRsLmg+IGRvZXMgbm90LiAgRGVmaW5lCisJT19SRE9OTFkgYW5kIE9fUkRXUiBpZiBuZWNlc3NhcnkuCisJKiBhci5jOiAgRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgRG8gaW5jbHVkZSA8c3lzL3R5cGVzLmg+IGFuZAorCTxzeXMvc3RhdC5oPi4gIFVzZSBIQVZFX0dPT0RfVVRJTUVfSCByYXRoZXIgdGhhbiBQT1NJWF9VVElNRS4gIFVzZQorCUhBVkVfVVRJTUVTIHJhdGhlciB0aGFuICFVU0VfVVRJTUUuICBEb24ndCBpbmNsdWRlIDxlcnJuby5oPiwgYW5kCisJZG9uJ3QgZGVjbGFyZSBlcnJuby4KKwkqIGFyc3VwLmM6IERvbid0IGluY2x1ZGUgPHN5c2RlcC5oPi4KKwkqIGJ1Y29tbS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlIDxzdGRpby5oPiwKKwk8c3lzL3R5cGVzLmg+LCBhbmQgPHN5cy9zdGF0Lmg+LiAgSW5jbHVkZSA8dGltZS5oPiBpZiBpdCBkZWZpbmVzCisJdGltZV90LiAgRGVmaW5lIHRpbWVfdCBpZiBuZWNlc3NhcnkuCisJKiBjb2ZmZHVtcC5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCisJKiBjb2ZmZ3Jvay5jLCBmaWxlbW9kZS5jLCBubG1jb252LmMsIHNpemUuYzogTGlrZXdpc2UuCisJKiBzcmNvbnYuYywgc3RyaW5ncy5jOiBMaWtld2lzZS4KKwkqIG5tLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIERvbid0IHRyeSB0byBkZWZpbmUgSEFWRV9TQlJLLgorCSogb2JqY29weS5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kCisJPHN5cy9zdGF0Lmg+LgorCShzaW1wbGVfY29weSk6IFVzZSBjcmVhdCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IE9fQ1JFQVQgaXMKKwlkZWZpbmVkLgorCSogb2JqZHVtcC5jOiBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBVc2UKKwlORUVEX0RFQ0xBUkFUSU9OX1BSSU5URiByYXRoZXIgdGhhbiAhRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVELgorCSogc3lzZHVtcC5jOiBJbmNsdWRlICJiZmQuaCIgYW5kICJidWNvbW0uaCIuICBEb24ndCBpbmNsdWRlCisJInN5c2RlcC5oIiBvciA8c3RkbGliLmg+LgorCShkdW1wX3N5bWJvbF9pbmZvKTogUmVuYW1lIGZyb20gc3ltYm9sX2luZm8uICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisKK01vbiBTZXAgIDQgMTQ6MzA6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IERvbid0IHNldC4gIFN1YnN0aXR1dGUgZm9yCisJQENDQCwgQENGTEFHU0AsIEBIREVGSU5FU0AgYW5kIEBMREZMQUdTQCBpbiBNYWtlZmlsZS4KKwkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6IFNldCB0byByYyByYXRoZXIgdGhhbiBxdi4KKwkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KKwkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgorCShMREZMQUdTKTogRGVmaW5lIGFzIEBMREZMQUdTQC4KKwkoQUxMX0NGTEFHUyk6IFVzZSBASERFRklORVNAIHJhdGhlciB0aGFuICQoSERFRklORVMpLgorCisJKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciB0byBjYWxsIGNvbmZpZy5iZmQgZm9yIGVhY2ggdGFyZ2V0LgorCUp1c3QgY2FsbCBpdCBmb3IgdGhlIGRlZmF1bHQgdGFyZ2V0LCBhbmQgdXNlIHRoZSBzaGVsbCB2YXJpYWJsZSB0bworCWRlY2lkZSB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSB1c2VkLgorCitUaHUgQXVnIDMxIDE5OjIxOjQ4IDE5OTUgIEphc29uIE1vbGVuZGEgICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogbWF0Y2ggaVszLTZdODYtKi13aW4zMiwgbm90IGp1c3QgaTM4Ni0qLXdpbjMyLgorCitUaHUgQXVnIDMxIDE2OjMwOjIyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAoYWRkX2luZGlyZWN0KTogTmV3LgorCShhc21fcHJlZml4KTogTmV3CisJKGdlbl9leHBfZmlsZSk6IFRpbWVzdGFtcCBzaG91bGQgYmUgMC4gSW5zZXJ0IHByZWZpeCB3aGVuCisJbmVlZGVkLiBOZXcgY29kZSBmb3IgaW5kaXJlY3Rpb24uCisJKGdlbl9saWJfZmlsZSk6IFRpbWVzdGFtcCBzaG91bGQgYmUgMC4gSW5zZXJ0IHByZWZpeAorCXdoZW4gbmVlZGVkLgorCSh1c2FnZSk6IERvY3VtZW50IC0tYWRkLWluZGlyZWN0LgorCShtYWluKTogQ29wZSB3aXRoIG5ldyBvcHRpb24uCisKKwkqIG9iamR1bXAuYyAoZHVtcF9wcml2YXRlX2hlYWRlcnMpOiBOZXcuCisJKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KKwkobG9uZ19vcHRpb24pOiBBZGQgcHJpdmF0ZS1oZWFkZXJzLgorCShkdW1wX2JmZF9wcml2YXRlX2hlYWRlcik6IE5ldy4KKwkobWFpbik6IENvcGUgd2l0aCBuZXcgb3B0aW9uLgorCitUaHUgQXVnIDMxIDA0OjA5OjE2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAocnVuKTogQWRkIG1pc3NpbmcgM3JkIGFyZyB0byB3YWl0cGlkLgorCitXZWQgQXVnIDMwIDExOjAyOjExIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChUT09MX1BST0dTKTogSW5jbHVkZSBkbGx0b29sIGlmIG5lZWRlZC4KKworVHVlIEF1ZyAyOSAxMzoyNToyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBkbGx0b29sLmMgKHJ2YSk6IERlbGV0ZWQuCisJKHJ2YWFmdGVyLCBydmFfYmVmb3JlKTogVXNlIG5ldyBhc3NlbWJsZXIgcHNldWRvLgorCShmbHVzaF9wYWdlLCBnZW5fZXhwX2ZpbGUsIGdlbl9saWJfZmlsZSk6IFVzZSBuZXcgd2F5IG9mIFJWQWluZy4KKwkoZ2VuX2V4cF9maWxlKTogRG9uJ3QgZ2VuZXJhdGUgLmVkYXRhIGlmIG5vIG5lZWQuCisJKGdlbl9saWJfZmlsZSk6IERvbid0IG1ha2UgdGltZXN0YW1wLgorCVB1dCBfaW5hbWUgaW4gaWRhdGEkNy4KKwkod29ya291dF9wcmVmaXgpOiBGaXggbWVtb3J5IGluaXRpYWxpemF0aW9uIGJ1Zy4KKwkodXNhZ2UpOiBUaWR5IHVwLCBkZWxldGUgbWFueSBzaW5nbGUgY2hhciBvcHRpb25zLgorCShtYWluKTogcnZhIG9wdGlvbiBpcyBnb25lLgorCitNb24gQXVnIDIxIDE4OjQxOjI4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYyAob3B0aW9ucyk6IGltYWdlLWJhc2UgaXMgYSBzeW5vbnltIGZvciBydmEuCisJKGdlbl9saWJfZmlsZSk6IFB1dCBkbGwgbmFtZSBpbnRvIGliYXNlJDcuCisKK1N1biBBdWcgMjAgMDk6NTk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCU1vZGlmaWVkIHRvIGdlbmVyYXRlIGFyY2hpdmVzIGFuZCBvYmplY3RzIHJhdGhlciB0aGFuIC5zIGZpbGVzLgorCSogZGxsdG9vbC5jIChydW4pIE5ldyBmdW5jdGlvbi4KKyAJKGdlbl9leHBfZmlsZSwgZ2VuX2xpYl9maWxlKTogVXNlIHJ1bi4KKwkod29ya291dF9wcmVmaXgpOiBOZXcuCisJKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCisJKG1haW4pOiBQYXJzZSBuZXcgb3B0aW9ucy4KKworV2VkIEF1ZyAxNiAxNjoyNjo1MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IEZpeCBSVkEgaGFuZGxpbmcuCisJKHJ2YV9zLCBydmFfbik6IERlbGV0ZS4KKworRnJpIEF1ZyAxMSAxODoyNzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG5tLmMgKG1haW4pOiBJZ25vcmUgLWUuCisKK1RodSBBdWcgMTAgMTc6MzU6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjb25maWcudGV4aSk6IE5ldyB0YXJnZXQuICBXcml0ZSBvdXQgYSBzZXR0aW5nIGZvcgorCXRleGluZm8gdmFyaWFibGUgVkVSU0lPTi4KKwkoYmludXRpbHMuZHZpLCBiaW51dGlscy5pbmZvKTogRGVwZW5kIG9uIGl0LgorCSogYmludXRpbHMudGV4aTogSW5jbHVkZSBpdCwgYW5kIHJlZmVyZW5jZSBAdmFsdWV7VkVSU0lPTn0gaW5zdGVhZAorCW9mIGV4cGxpY2l0bHkgc3BlY2lmeWluZyAyLjIoISkuCisKK1RodSBBdWcgMTAgMTY6MDc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb2ZmZ3Jvay5jIChkb190eXBlKTogSGFuZGxlIGFycmF5IGRpbWVuc2lvbnMgdGhlIHNhbWUgd2F5IGdkYgorCWRvZXMuCisKK1R1ZSBBdWcgIDggMTc6MTA6NDIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZGxsdG9vbC5jIChtdGFibGUpOiBOZXcgZmllbGRzLgorCShBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUik6IE5ldy4KKwkoZmx1c2hfcGFnZSk6IFVzZSBuZXcgbWFjcm9zLgorCitTYXQgQXVnICA1IDAwOjE2OjM3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBvYmpjb3B5LmMgKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogSGFuZGxlIHNlY3Rpb25zCisJd2l0aCBubyByZWxvY2F0aW9ucy4KKwkqIGNvZmZncm9rLmMgKGRvX3NlY3Rpb25zX3AxKTogTGlrZXdpc2UuCisKK01vbiBKdWwgMzEgMTI6NTE6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nCisJc3RyaW5ncyBwcm9ncmFtcywgcHJpbnQgc3RyaW5ncyB3aGljaCBhcmUgbm90IHRlcm1pbmF0ZWQgd2l0aCBhCisJbnVsbCBieXRlIG9yIGEgbmV3bGluZS4KKwkqIGJpbnV0aWxzLnRleGksIHN0cmluZ3MuMTogVXBkYXRlIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCisKKwkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXIKKwlwcm9ncmFtcywgcGVybWl0IHVzZXJzIHRvIGFkZCB0aGUgc2FtZSBmaWxlIG11bHRpcGxlIHRpbWVzLgorCitUdWUgSnVsIDI1IDExOjIxOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3RyaW5ncy5jIChEQVRBX0ZMQUdTKTogUmVtb3ZlIFNFQ19EQVRBLgorCShtYWluKTogSWYgbm8gZmlsZSBuYW1lcyBhcmUgZ2l2ZW4sIHNjYW4gc3RhbmRhcmQgaW5wdXQuCisJKiBiaW51dGlscy50ZXhpLCBzdHJpbmdzLjE6IHN0cmluZ3Mgbm93IHNjYW5zIG5vbi1kYXRhIHNlY3Rpb25zIGJ5CisJZGVmYXVsdC4KKworTW9uIEp1bCAyNCAxMzo1MjoyOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHNyY29udi5jICh3cl9oZCk6IFNldCBhZmwgZmllbGQgdG8gNCBmb3IgYmZkX2FyY2hfc2guCisJKHdyaXRlSU5UKTogV2hlbiBzaXplID09IC0yLCB1c2UgMiBieXRlcyBmb3IgdGhlIGg4MzAwIGFuZCA0IGJ5dGVzCisJZm9yIHRoZQlzaC4KKworCSogc3lzZHVtcC5jIChmaWxsdXApOiBSZXR1cm4gc2l6ZSAtIDEsIHRoZSBsYXN0IGJ5dGUgaXMgYSBjaGVja3N1bQorCWFuZCBzaG91bGRuJ3QgYmUgY291bnRlZC4KKwkqIHN5c3JvZmYuaW5mbyAoaGQpOiBDaGFuZ2VkIHNlZ21lbnQgaWRlbnRpZmllciBmcm9tIGEgYnl0ZSB0byBhIDEKKwliaXQgZmllbGQuICBUaGUgc3lzcm9mZiAyLjAtMDEgc3BlY2lmaWNhdGlvbiBzZWVtcyB0byBiZSBpbiBlcnJvcgorCWhlcmUuICBSZWR1Y2Ugd2lkdGggb2YgZm9sbG93aW5nICJzcGFyZSIgZmllbGQgZnJvbSA0IHRvIDMgYml0cy4KKwkocmwpOiBDaGFuZ2VkIG9yZGVyIGFuZCB3aWR0aCBvZiBmaXJzdCA0IGJpdGZpZWxkcyB0byBjb3JyZXNwb25kCisJdG8gc3lzcm9mZiBzcGVjaWZpY2F0aW9uLgorCShkbG5faGVhZCwgZGxuX2luc2lkZSwgZGxuX3RhaWwpOiBSZW1vdmVkLgorCitUdWUgSnVsIDE4IDIzOjAwOjAzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBubS5jIChzb3J0X3N5bWJvbHNfYnlfc2l6ZSk6ICBFbmNsb3NlIGV4cHJlc3Npb24gYmVpbmcgY2FzdGVkCisJaW4gcGFyZW5zIHNvIHJlc3VsdCBpcyBjYXN0ZWQsIG5vdCBqdXN0IGZpcnN0IG9wZXJhbmQuICBDYW4ndAorCWRvIHBvaW50ZXIgYXJpdGhtZXRpYyBvbiB2b2lkKiBwb2ludGVycy4KKworRnJpIEp1bCAxNCAxMzo0Mjo0MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHN5c2R1bXAuYyAoZGgpOiBDaGFuZ2VkIGZvcm1hdCBvZiBvdXRwdXQgdG8gYmUgMTYgaGV4IGRpZ2l0cworCWZvbGxvd2VkIGJ5IDE2IGFzY2lpIGNoYXJhY3RlcnMsIHNpbWlsYXIgdG8gRW1hY3MnIGhleGwtbW9kZSwKKwl0byBtYWtlIGl0IGVhc2llciB0byByZWFkLgorCSh4Y2FsbG9jKTogZml4IHR5cG8uCisKK1RodSBKdWwgMTMgMTU6Mjc6NDQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBzcmNvbnYuYyAod3JfdHIpOiBXcml0ZSBvdXQgaGFuZGNyYWZ0ZWQgdHIgYmxvY2suCisJKHdhbGtfdHJlZV9zeW1ib2wpOiBVc2UgZXZhbGxlbiBhbmQgZXZhbHVlIGluc3RlYWQgb2YKKwl2YWxsZW4gJiB2YWx1ZSBiZWNhdXNlIG9mIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbgorCXN5c3JvZmYuaW5mby4KKworCSogc3lzZHVtcC5jIChzeXNyb2ZmX3N3YXBfdHJfaW4sIHN5c3JvZmZfcHJpbnRfdHJfb3V0KTogTmV3CisJZnVuY3Rpb25zLgorCisJKiBzeXNyb2ZmLmluZm8gKHRyKTogdGhlIHRyIGJsb2NrIGlzIGEgc3BlY2lhbCBjYXNlIC0tLSBhIGJsb2NrCisJd2l0aG91dCBjb250ZW50cyAtLS0gd2hpY2ggY2FuJ3QgYmUgaGFuZGxlZCBieSBnZW5lcmF0ZWQgY29kZS4KKwkoZGVuLCBkcHApOiBvbmx5IGZpcnN0IGJ5dGUgaXMgcHJlc2VudCBmb3IgREVOZW5kLCBEUFBlbmQuCisJKGRzeSk6IGRlc2NyaWJlIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiBibG9jaywgcmVuYW1lIHNvbWUgZmllbGRzLgorCShkcHMpOiBkZXNjcmliZSBhIGNvbmRpdGlvbmFsIHBvcnRpb24gb2YgYmxvY2suCisJKGRmbCk6IHJlbW92ZWQuCisKKwkqIHN5c2luZm8ueSAoeXllcnJvcik6IHdyaXRlIGVycm9yIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCisKK1RodSBKdWwgMTMgMTA6NDM6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGFycGFyc2UuaCBhbmQgc3lzaW5mby5oLgorCShtb3N0bHljbGVhbik6IFJlbW92ZSB5Lm91dHB1dC4KKwkoY2xlYW4pOiBSZW1vdmUgc3lzcm9mZiwgc3lzcm9mZi5jLCBzeXNyb2ZmLmgsIGFuZCBzeXNpbmZvLgorCisJKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENhc3QgbWVtc2V0IGFyZyB0byBzaXplX3QuCisJKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogTGlrZXdpc2UuCisKKwkqIG5tLmMgKEhBVkVfU0JSSyk6IERlZmluZSBleGVjcHQgb24gYW1pZ2Fkb3MgYW5kIFdJTkRPV1NfTlQuCisJKHN0cnVjdCBzaXplX3N5bSk6IERlZmluZS4KKwkoc2hvd19zdGF0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGxvbmdfb3B0aW9ucyk6IEFkZCB1bmRvY3VtZW50ZWQgb3B0aW9uICJzdGF0cyIuCisJKG1haW4pOiBQcmludCBtZW1vcnkgc3RhdHMgaWYgcmVxdWVzdGVkLgorCShzb3J0X2JmZCwgc29ydF9keW5hbWljLCBzb3J0X3gsIHNvcnRfeSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgorCShudW1lcmljX2ZvcndhcmQpOiBVc2UgbWluaXN5bWJvbHMgcmF0aGVyIHRoYW4gYXN5bWJvbHMuCisJKG5vbl9udW1lcmljX2ZvcndhcmQpOiBMaWtld2lzZS4KKwkoc2l6ZV9mb3J3YXJkMSk6IFJlbmFtZSBmcm9tIHNpemVfZm9yd2FyZC4gIFVzZSBtaW5pc3ltYm9scy4KKwkoc2l6ZV9mb3J3YXJkMik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNvcnRfc3ltYm9sc19ieV9zaXplKTogVGFrZSBuZXcgYXJndW1lbnRzIGR5bmFtaWMsIHNpemUsIGFuZAorCXN5bXNpemVwLiAgVXNlIG1pbmlzeW1ib2xzLiAgRG9uJ3Qgc3RvcmUgdGhlIHNpemUgYmFjayBpbiB0aGUKKwlzeW1ib2w7IHN0b3JlIGluIGEgbmV3bHkgYWxsb2NhdGUgc3RydWN0IHNpemVfc3ltIGFycmF5LgorCShkaXNwbGF5X3JlbF9maWxlKTogUmVhZCBtaW5pc3ltYm9scyByYXRoZXIgdGhhbiBhc3ltYm9scy4gIFNldAorCXNvcnRfKiB2YXJpYWJsZXMuICBDYWxsIHByaW50X3NpemVfc3ltYm9scyBpZiBzb3J0aW5nIGJ5IHNpemUuCisJKGZpbHRlcl9zeW1ib2xzKTogVGFrZSBuZXcgYXJndW1lbnRzIGR5bmFtaWMgYW5kIHNpemUuICBVc2UKKwltaW5pc3ltYm9scy4KKwkocHJpbnRfc3ltYm9scyk6IExpa2V3aXNlLiAgQ2FsbCBwcmludF9zeW1ib2wgZm9yIGFjdHVhbCBwcmludGluZy4KKwkocHJpbnRfc2l6ZV9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkocHJpbnRfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworV2VkIEp1bCAxMiAxMDo0MzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogT25seSBwcmludCBlYWNoIHN0YWJzIHNlY3Rpb24KKwlvbmNlLgorCShjb21wYXJlX3JlbG9jcyk6IE1ha2UgaXQgY2xlYXIgdG8gZ2NjIHRoYXQgdGhpcyBhbHdheXMgcmV0dXJucyBhCisJdmFsdWUuCisKK1dlZCBKdWwgMTIgMTA6NDA6MjMgMTk5NSAgSC5KLiBMdSAgPGhqbEBueW5leHN0LmNvbT4KKworCSogb2JqY29weS5jIChzaW1wbGVfY29weSk6IFByZXNlcnZlIGVycm5vIG9uIGZhaWx1cmUuCisJKHNtYXJ0X3JlbmFtZSk6IFByaW50IGVycm9yIG1lc2FnZSBpZiBzaW1wbGVfY29weSBmYWlscy4KKworVHVlIEp1bCAxMSAxMzoxMDo1MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHN5c2R1bXAuYzogcmUtaW5kZW50ZWQgZmlsZS4KKwkobW9kdWxlKTogcmVhZCBibG9ja3Mgc2VxdWVudGlhbGx5IGluc3RlYWQgb2YgdHJ5aW5nIHRvIHBhcnNlCisJdGhlbSwgYXMgdGhhdCB3b3VsZCByZXF1aXJlIGNoYW5naW5nIHRoZSBwYXJzZXIgcmVjb2duaXplIHRoZQorCWRpZmZlcmVuY2UgYmV0d2VlbiBhIERQU3N0YXJ0IGFuZCBEUFNlbmQgYmxvY2suCisJKGdldG9uZSk6IEFkZCBicmVhaydzIGJldHdlZW4gc3dpdGNoIGJsb2NrcyBhcyBhcHByb3ByaWF0ZS4KKwkob2JqZWN0X2JvZHlfbGlzdCk6IHBhcnNlIGJsb2NrcyBhY2NvcmRpbmcgdG8gc3lzcm9mZiBzcGVjLgorCitNb24gSnVsIDEwIDEyOjM3OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0Bwb3NlaWRvbi5jeWdudXMuY29tPgorCisJKiBzeXNyb2ZmLmluZm86IHJlLWluZGVudGVkIGZpbGUsIHByaW9yIGZvcm1hdHRpbmcgd2FzIGNvbmZ1c2luZworCWJlY2F1c2UgaXQgd2FzIGluZGVudGF0aW9uIGRpZCBub3QgcmVmbGVjdCBuZXN0aW5nIG9mIGNvbmRpdGlvbmFsCisJcmVjb3Jkcy4gIENoYW5nZSAic3BhY2Ugc2l6ZSB3aXRoaW4gc2VnbWVudCIgcmVjb3JkIGluIGhkIHJlY29yZAorCWZyb20gYml0IHRvIGJ5dGUuCisKKwkqIHN5c2luZm8ueSAoY29uZF9pdF9maWVsZCk6IFVzZSB4Y2FsbG9jIGluc3RlYWQgb2YgY2FsbG9jLgorCisJKiBzcmNvbnYuYyAod3JfY3MpOiBSZWZvcm1hdHRlZCBjcyBoZWFkZXIgYXJyYXksIHRhZyBlYWNoIGJ5dGUKKwl3aXRoIGEgY29tbWVudCBkZXNjcmliaW5nIHRoZSBmaWVsZC4KKwkod3JfdW5pdF9pbmZvKTogVXNlIFNFRUtfU0VUIG1hY3JvIGluc3RlYWQgb2YgY29uc3RhbnQgMC4KKwkobWFpbik6IFVzZSBGT1BFTl9XQiBtYWNybyBpbnN0ZWFkIG9mIGxpdGVyYWwgIndiIi4KKwkqIHN5c3JvZmYuaW5mbzogUmVtb3ZlIGZkbCAoZGZsKSBmaWVsZCBmcm9tIGNzIGJsb2NrLiAgQ29tcGFyZQorCXB0ci0+dHlwZSB3aXRoIEVEX1RZUEVfQ09OU1QgaW5zdGVhZCBvZiBjb25zdGFudCAyIGluIGVkIGJsb2NrLgorCitUdWUgSnVsICA0IDE0OjQ4OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbm0uYyAoc2l6ZV9mb3J3YXJkKTogQ2hlY2sgeWYgYWdhaW5zdCB5biwgbm90IHhuLgorCisJKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IFJlY29yZCBhbGwgb3V0cHV0IEJGRCdzLCBhbmQgY2xvc2UKKwl0aGVtIGJlZm9yZSB1bmxpbmtpbmcgdGhlbSBhbmQgcmVtb3ZpbmcgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnksCisJdG8gYXZvaWQgTkZTIHByb2JsZW1zLgorCisJKiBhci5jIChyZXBsYWNlX21lbWJlcnMpOiBJbiB2ZXJib3NlIG1lc3NhZ2VzLCB1c2UgJ3InIHdoZW4KKyAgICAgICAgcmVwbGFjaW5nIGEgbWVtYmVyLCBhbmQgJ2EnIHdoZW4gYWRkaW5nIG9uZS4KKworCSogYXIuYyAoYXJfdHJ1bmNhdGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShub3JtYWxpemUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gY29uc3QgY2hhciAqLiAgQWRkIGFiZmQKKwlhcmd1bWVudC4gIENoYW5nZSBhbGwgY2FsbGVycy4gIElmIGFyX3RydW5jYXRlLCBjaG9wIHRoZSBmaWxlbmFtZQorCXRvIGFiZmQtPmFyX21heF9uYW1lbGVuLgorCShtYWluKTogRm9yIHRoZSAnZicgbW9kaWZpZXIsIHNldCBhcl90cnVuY2F0ZSB0byB0cnVlLiAgRG9uJ3QKKwljaGFuZ2UgcXVpY2tfYXBwZW5kIHRvIHJlcGxhY2UgaWYgYXJfdHJ1bmNhdGUgaXMgdHJ1ZS4KKwkoZG9fcXVpY2tfYXBwZW5kKTogSWYgYXJfdHJ1bmNhdGUsIHNldCBCRkRfVFJBRElUSU9OQUxfRk9STUFULgorCSh3cml0ZV9hcmNoaXZlKTogTGlrZXdpc2UuCisJKiBiaW51dGlscy50ZXhpLCBhci4xOiBEb2N1bWVudCAnZicgbW9kaWZpZXIuCisKKwkqIG9iamNvcHkuYyAoZW51bSBzdHJpcF9hY3Rpb24pOiBEZWZpbmUgc3RyaXBfdW5uZWVkZWQuCisJKE9QVElPTl9TVFJJUF9VTk5FRURFRCk6IERlZmluZS4KKwkoc3RyaXBfb3B0aW9ucyk6IEFkZCAic3RyaXAtdW5uZWVkZWQiLgorCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KKwkoY29weV91c2FnZSk6IE1lbnRpb24gLS1zdHJpcC11bm5lZWRlZC4KKwkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KKwkoaXNfc3RyaXBfc2VjdGlvbik6IFN0cmlwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBzdHJpcF91bm5lZWRlZC4KKwkoZmlsdGVyX3N5bWJvbHMpOiBJZiBzdHJpcF91bm5lZWRlZCwgb25seSBrZWVwIEJTRl9LRUVQIHN5bWJvbHMuCisJKGNvcHlfb2JqZWN0KTogSWYgc3RyaXBfYWxsLCBkaXNjYXJkIHN5bWJvbHMgd2l0aG91dCBjaGVja2luZworCWRpc2NhcmRfbG9jYWxzLgorCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgc3RyaXBfdW5uZWVkZWQuCisJKHNldHVwX3NlY3Rpb24pOiBTdHJpcCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgc3RyaXBfdW5uZWVkZWQuCisJKGNvcHlfc2VjdGlvbik6IExpa2V3aXNlLgorCShzdHJpcF9tYWluKTogSGFuZGxlIE9QVElPTl9TVFJJUF9VTk5FRURFRC4KKwkoY29weV9tYWluKTogTGlrZXdpc2UuCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IC0tc3RyaXAtdW5uZWVkZWQuCisKK01vbiBKdWwgIDMgMTQ6MTY6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotd2luMzIpOiBOZXcgY29uZmlndXJhdGlvbi4KKwkqIGRsbHRvb2wuYyAoa2lsbGF0LCB4bGF0ZSwgdXNhZ2UsIGxvbmdfb3B0aW9ucywgbWFpbik6CisJVW5kZXJzdGFuZCBhbmQgY29wZSB3aXRoIC1rIG9wdGlvbi4KKworU2F0IEp1bCAgMSAxMjoyNToxNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogYXIuYzogKGV4dHJhY3RfZmlsZSk6ICBDaGFuZ2UgIiNpZiBQT1NJWF9VVElNRSIgdG8KKwkiI2lmZGVmIFBPU0lYX1VUSU1FIiB0byBtYXRjaCBvdGhlciB0ZXN0cyBvZiBQT1NJWF9VVElNRQorCWFuZCBhdm9pZCBsb3NzYWdlIHdoZW4gUE9TSVhfVVRJTUUgaXMgbm90IGRlZmluZWQgYXQgYWxsLgorCitXZWQgSnVuIDI4IDE3OjUxOjI0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGFyLmM6IChwcmludF9jb250ZW50cy5jLCBleHRyYWN0X2ZpbGUsIGRvX3F1aWNrX2FwcGVuZCk6CisJTWFsbG9jIGJ1ZmZlcnMgcmF0aGVyIHRoYW4gYWxsb2NhdGUgb24gc3RhY2sgKHNvIGl0IHdvcmtzCisJb24gTlQpLgorCSogZGVmbGV4Lmw6IE5hbWVzIGNhbiBoYXZlIGFuIEAgaW4gdGhlbS4KKwkqIGRsbHRvb2wuYzogTG9hZHMgb2Ygc3R1ZmYuIENhbiBub3cgZ2VuZXJhdGUgLmltcCBmaWxlcyB3aGljaAorCXdvcmsgd2l0aCBOVCAuZGxscy4KKworVGh1IEp1biAyMiAxOToxMDo1MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLmluIChkZW1hbmdsZS5jLm8pOiBSZW1vdmUuCisJKGFycGFyc2UuaCk6IERlcGVuZCBvbiBhcnBhcnNlLmMgaW5zdGVhZCBvZiBhcnBhcnNlLnkuCisKK1dlZCBKdW4gMjEgMTc6MzI6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IERvbid0IGluY2x1ZGUgaW5mbyBoZXJlLgorCShkaXN0c3R1ZmYpOiBJbmNsdWRlIGl0IGhlcmUuCisJKHJlYWxjbGVhbik6IFJlbW92ZSAqLmluZm8uCisKKwkqIG9iamR1bXAuYyAoY29tcGFyZV9yZWxvY3MpOiBJZiByZWxvY2F0aW9uIGVudHJpZXMgaGF2ZSB0aGUgc2FtZQorCWFkZHJlc3MsIGtlZXAgdGhlbSBpbiBmaWxlIG9yZGVyLgorCitNb24gSnVuIDE5IDA5OjA2OjQ5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRsbHRvb2wuYzogQ2hhbmdlIG5hbWVzIG9mIGdlbmVyYXRlZCBmaWxlcy4gLioucy0+IC0qLnMKKworCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiAgQ2hlY2sgZm9yIG5hbWVzCisJd2hpY2ggYXJlIHN1cGVyc2V0cyBvZiBzZWxlY3RlZCBuYW1lcy4KKworV2VkIEp1biAxNCAxOTo0Mzo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBkbGx0b29sLmMgKG10YWJsZSwgQVJNIGp1bXApOiBNdXN0IHJlZGlyZWN0IHZpYSBwYyBvZmZzZXRhYmxlIHB0ci4KKworV2VkIEp1biAxNCAxMzoyNzoyMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBkZWZsZXgubCwgZGVmcGFyc2UueSwgZGxsdG9vbC5jOiBOZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBTdXBwb3J0IGZvciB0aGVtLgorCitNb24gSnVuIDEyIDExOjI3OjU0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHN5c2R1bXAuYzogSW5jbHVkZSBzeXNkZXAuaAorCShtYWluKTogT3BlbiBpbnB1dCB3aXRoIEZPUEVOX1JCLgorCitGcmkgSnVuICA5IDE3OjI2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jICh3aWRlX291dHB1dCk6IE5ldyBmbGFnIHZhcmlhYmxlLgorCSh1c2FnZSk6IFByaW50IG5ldyAtdywgLS13aWRlIG9wdGlvbnMuCisJKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXdpZGUgc3VwcG9ydC4KKwkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IElmIC0td2lkZSwgZG9uJ3QgcHJpbnQgYSBuZXdsaW5lIGJldHdlZW4KKwl0aGUgc2VjdGlvbidzIGZpcnN0IGxpbmUgYW5kIHRoZSBmbGFncy4KKwkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIHVuc2lnbmVkIGNvbXBhcmlzb25zIGZvciB0aGUgYmluYXJ5CisJc2VhcmNoLCBub3Qgc2lnbmVkLgorCShkaXNhc3NlbWJsZV9kYXRhKTogSWYgLS13aWRlLCBkb24ndCBwdXQgYSBcbiBiZXR3ZWVuIHRoZQorCWRpc2Fzc2VtYmx5IG91dHB1dCBhbmQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKwkobWFpbik6IFN1cHBvcnQgLXcgb3B0aW9uIGJlaW5nIHRoZSBzYW1lIGFzIC0td2lkZS4KKworVGh1IEp1biAgMSAxNzowOToyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJU2F0IE1heSAgNiAwODo1MjoyNCAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCisKKwkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogbWFrZSBpdCBzbWFydGVyLCBjbGVhbiB1cAorCSAgaWYgcmVuYW1lICgpIGZhaWxzLgorCitUdWUgTWF5IDMwIDE0OjI0OjE1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBEZWxldGUgbGluZXMgd2l0aCBsb3RzIG9mICMjIyMgYmVjYXVzZSBmb3VyIG9yIG1vcmUKKwlpbmRpY2F0ZSBhIHBvaW50IGZvciBtYWtlZmlsZSBmcmFnbWVudCBzdWJzdGl0dXRpb24uCisKK1R1ZSBNYXkgIDkgMTc6MTc6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5sbWNvbnYgb24gUG93ZXJQQyBlYWJpIGFueSBtb3JlLCBpdAorCWlzIG5vdCBuZWVkZWQuCisKK1RodSBBcHIgMjcgMjA6MjE6MjQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IERlZmluZS4KKwkoUlVOVEVTVCk6IFVzZSBvbmUgaW4gc291cmNlIHRyZWUgaWYgcHJlc2VudC4KKwkoY2hlY2spOiBTZXQgYHJvb3RtZScgZm9yICQoRVhQRUNUKS4KKworV2VkIEFwciAyNiAxODoyNjoyMSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBzcmNvbnYuYyAobWFpbik6IEFkZCBzdXBwb3J0IGZvciAtbiBvcHRpb24gd2hpY2ggZGlzYWJsZXMKKwlwcmVzY2FuIG9mIGNvbW1vbiBzeW1ib2xzLgorCSh3cl9vYik6IElmIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgZmlsbCB3aXRoIHplcm9zLgorCitUdWUgQXByIDI1IDE5OjE0OjM3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IERpc3BsYXkgbG9hZCBhZGRyZXNzIGFmdGVyCisJdmlydHVhbCBtZW1vcnkgKHJ1bi10aW1lKSBhZGRyZXNzLgorCitXZWQgQXByIDE5IDA5OjQ0OjA2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8pOiBQYXNzIC1EVkVSU0lPTj0nIiQoVkVSU0lPTikiJyB0byB0aGUKKyAgICAgICAgY29tcGlsZS4KKwkoREVNQU5HTEVSX1BST0cpOiBObyBsb25nZXIgdXNlcyB2ZXJzaW9uLm8uCisKK01vbiBBcHIgMTAgMTM6Mjk6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCisJKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKKworCSogbXB3LWNvbmZpZy5pbiAoVERFRklORVMpOiBEZWZpbmUgYXMgZW1wdHkgaW4gbWFrZWZpbGUgZnJhZy4KKworCSogbXB3LWNvbmZpZy5pbjogQ3JlYXRlIG1rLnRtcCwgZGVmaW5lIEFSQ0hERUZTIGluIGl0LgorCisJKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIGNvbmZpZ3VyZSBmcmFnbWVudCBmb3IgYmludXRpbHMuCisJKiBtcHctbWFrZS5pbiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbCk6IEFsc28gZGVwZW5kIG9uIGluc3RhbGwtb25seS4KKworCSogbXB3LW1ha2UuaW4gKGNwbHVzZmlsdCk6IFJlbmFtZWQgZnJvbSBjKytmaWx0LgorCShJTkNMVURFUyk6IEFkZCBtb3JlIHBhdGhzLgorCisJKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyBtYWtlZmlsZSBmcmFnbWVudCBmb3IgYmludXRpbHMuCisJKE5vcm1hbGx5IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gTWFrZWZpbGUuaW4uKQorCitNb24gTWFyIDI3IDExOjUyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXIuYyAod3JpdGVfYXJjaGl2ZSk6IENhbGwgbWFrZV90ZW1wbmFtZSB0byBnZXQgb3V0cHV0IGZpbGUKKwluYW1lLCByYXRoZXIgdGhhbiB1c2luZyBhIGZpeGVkIG5hbWUgYmFzZWQgb24gdGhlIGlucHV0IGZpbGUuCisKKwkqIG9iamNvcHkuYyAobWFrZV90ZW1wbmFtZSk6IENvcHkgZnJvbSBoZXJlLi4uCisJKiBidWNvbW0uYyAobWFrZV90ZW1wbmFtZSk6IC4uLnRvIGhlcmUsIGFuZCBtYWtlIGdsb2JhbC4KKwkqIGJ1Y29tbS5oIChtYWtlX3RlbXBuYW1lKTogRGVjbGFyZS4KKworRnJpIE1hciAyNCAxMTo0Nzo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0cmluZ3MuYzogSW5jbHVkZSAiYmZkLmgiIGJlZm9yZSBvdGhlciBoZWFkZXJzLiAgSW5jbHVkZQorCSJzeXNkZXAuaCIuCisJKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiBDYXN0IHN0X3VpZCBhbmQgc3RfZ2lkIHRvIGxvbmcsCisJYW5kIHByaW50IHRoZW0gd2l0aCAlbGQuCisKK0ZyaSBNYXIgMTAgMTM6MDk6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKHN0cmlwX29wdGlvbnMpOiBBZGQgLS1rZWVwLXN5bWJvbC4KKwkoY29weV9vcHRpb25zKTogTGlrZXdpc2UuCisJKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0ta2VlcC1zeW1ib2wgYW5kIC1LLgorCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgorCShrZWVwX3N5bWJvbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShpc19zdHJpcF9zeW1ib2wpOiBBZGp1c3QgdGhlIHJldHVybiB2YWx1ZSBhY2NvcmRpbmcgdG8KKwlrZWVwX3N5bWJvbHMuCisJKHN0cmlwX21haW4pOiBIYW5kbGUgLUsuICBGb3IgLU4sIGNoZWNrIHRoYXQgLUsgd2FzIG5vdCBnaXZlbi4KKwkoY29weV9tYWluKTogTGlrZXdpc2UuCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjEsIHN0cmlwLjE6IERvY3VtZW50IC1LLgorCitNb24gTWFyICA2IDEzOjMzOjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBDaGVjayByZXN1bHQgb2YgbWtkaXIuCisJKGNvcHlfbWFpbik6IENhc3QgYW4geG1hbGxvYyByZXN1bHQuCisKKwkqIG9iamR1bXAuYyAodXNhZ2UpOiBCcmVhayBsb25nIGZvcm1hdCBzdHJpbmcgaW50byBzaG9ydGVyIG9uZXMuCisKK01vbiBNYXIgIDYgMTM6NDY6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBidWNvbW0uYyAobGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyk6IE5ldyBmdW5jdGlvbi4KKwkqIGJ1Y29tbS5oIChsaXN0X3N1cHBvcnRlZF90YXJnZXRzKTogRGVjbGFyZS4KKwkqIGFyLmMgKHVzYWdlKTogQ2FsbCBsaXN0X3N1cHBvcnRlZF90YXJnZXRzLgorCSogbm0uYyAodXNhZ2UpOiBMaWtld2lzZS4KKwkqIG9iamNvcHkuYyAoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KKwkqIG9iamR1bXAuYyAodXNhZ2UpOiBMaWtld2lzZS4KKwkqIHNpemUuYyAodXNhZ2UpOiBMaWtld2lzZS4KKwkqIHN0cmluZ3MuYyAodXNhZ2UpOiBMaWtld2lzZS4KKworVHVlIEZlYiAyOCAxNToxMzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENhc3Qgc3Rfc2l6ZSB0byBsb25nIGJlZm9yZQorCXBhc3NpbmcgaXQgdG8gZnByaW50Zi4KKworRnJpIEZlYiAxNyAxMzozNjo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYyAoc3RydWN0IHNlY3Rpb25fbGlzdCk6IEFkZCBmaWVsZHMgcmVtb3ZlLCBzZXRfZmxhZ3MsCisJYW5kIGZsYWdzLiAgQ2hhbmdlIGFkanVzdCBmcm9tIGJvb2xlYW4gdG8gZW51bS4KKwkocmVtb3ZlX3NlY3Rpb25zKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KKwkoc2VjdGlvbnNfcmVtb3ZlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGNvcHlfb3B0aW9ucyk6IEFkZCAtLXNldC1zZWN0aW9uLWZsYWdzLgorCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXNldC1zZWN0aW9uLWZsYWdzLgorCShwYXJzZV9mbGFncyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGZpbmRfc2VjdGlvbl9saXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoaXNfc3RyaXBfc3ltYm9sKTogQ2hhbmdlIHJldHVybiB0eXBlIGZyb20gaW50IHRvIGJvb2xlYW4uCisJKGlzX3N0cmlwX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShmaWx0ZXJfc3ltYm9scyk6IENhbGwgaXNfc3RyaXBfc2VjdGlvbi4KKwkoY29weV9vYmplY3QpOiBXaGVuIGFkZGluZyBzZWN0aW9ucywgY2hlY2sgZm9yIHNwZWNpZmllZCBmbGFncyBvcgorCVZNQS4gIENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgYW55IHNlY3Rpb25zIGFyZSBiZWluZyByZW1vdmVkLgorCShzZXR1cF9zZWN0aW9uKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGZ1bmN0aW9uIHJhdGhlciB0aGFuCisJbG9va2luZyB0aHJvdWdoIHJlbW92ZV9zZWN0aW9ucyBhbmQgYWRqdXN0X3NlY3Rpb25zLiAgSGFuZGxlCisJLS1zZXQtc2VjdGlvbi1mbGFncy4KKwkoY29weV9zZWN0aW9uKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaAorCXJlbW92ZV9zZWN0aW9ucy4KKwkoc3RyaXBfbWFpbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBpbnN0ZWFkIG9mIGFkZGluZyBpdGVtcyB0bworCXNlY3Rpb25zX3JlbW92ZWQuCisJKGNvcHlfbWFpbik6IFVzZSBmaW5kX3NlY3Rpb25fbGlzdCBpbnN0ZWFkIG9mIGFkZGluZyBpdGVtcyB0bworCXNlY3Rpb25zX3JlbW92ZWQgYW5kIGFkanVzdF9zZWN0aW9ucy4gIEhhbmRsZSAtLXNldC1zZWN0aW9uLWZsYWdzLgorCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXNldC1zZWN0aW9uLWZsYWdzLgorCitUdWUgRmViIDE0IDE4OjAzOjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jICh3aXRoX3NvdXJjZV9jb2RlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkodXNhZ2UpOiBNZW50aW9uIC1TLy0tc291cmNlLgorCShsb25nX29wdGlvbnMpOiBBZGQgLS1zb3VyY2UuCisJKHByZXZfZnVuY3Rpb25uYW1lLCBwcmV2X2xpbmUpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoc3RydWN0IHByaW50X2ZpbGVfbGlzdCk6IERlZmluZS4KKwkocHJpbnRfZmlsZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShza2lwX3RvX2xpbmUsIHNob3dfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FsbCBzaG93X2xpbmUgdG8gaGFuZGxlIC1sIGFuZCAtUy4KKwkobWFpbik6IEhhbmRsZSAtUy4KKwkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLVMvLS1zb3VyY2UuCisKK1RodSBGZWIgIDkgMTY6MTE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBSZW5hbWUgcGFyYW1ldGVyIHRvIGF2b2lkIHNoYWRvd2luZy4KKwkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KKworCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpOiBEZWZpbmUuCisJKGFkZF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLWFkZC1zZWN0aW9uLgorCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWFkZC1zZWN0aW9uLgorCShjb3B5X29iamVjdCk6IEFkZCBzZWN0aW9ucyBmcm9tIHRoZSBhZGRfc2VjdGlvbnMgbGlzdC4KKwkoY29weV9tYWluKTogSGFuZGxlIC0tYWRkLXNlY3Rpb24uCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tYWRkLXNlY3Rpb24uCisKK1dlZCBGZWIgIDEgMTU6MDQ6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUGFzcyBzZWN0aW9uIG9mZnNldCwgbm90IGFic29sdXRlCisJYWRkcmVzcywgdG8gYmZkX2ZpbmRfbmVhcmVzdF9saW5lLgorCisJKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IERvbid0IHVzZSBjb25zdCB3aXRoCisJcmVsb2NfaG93dG9fdHlwZS4KKworVGh1IEphbiAyNiAxODo1MDowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogVXNlIGJmZF9hc3ltYm9sX3ZhbHVlIChWQVIpIHJhdGhlcgorCXRoYW4gVkFSLT52YWx1ZS4KKwkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogTGlrZXdpc2UuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBjaGFuZ2UgdGhlIHN5bWJvbCB2YWx1ZXMuICBJdCBjYW4KKwljb25mdXNlIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCisKK1RodSBKYW4gMjYgMTI6MDM6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWJhaS4KKworV2VkIEphbiAxOCAxMDowMjoxMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogY29mZmR1bXAuYzogSW5jbHVkZSBzeXNkZXAuaC4KKwkoZHVtcF9jb2ZmX3R5cGUpOiBIYW5kbGUgY29mZl9zZWNkZWZfdHlwZS4KKwkqIGNvZmZncm9rLmMgOiBJbmNsdWRlIHN5c2RlcC5oLgorCSogc3Jjb252LmM6IEluY2x1ZGUgbGliaWJlcnR5LmgKKwkoYWJzb2x1dGVfcCwgZHR5X3N0YXJ0LCBkdHlfZW5kLCBkdW1wX3RyZWVfc3RydWN0dXJlKTogUmVtb3ZlLgorCitXZWQgSmFuIDE4IDEyOjI0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29mZmR1bXAuYyAoZHVtcF9jb2ZmX3Njb3BlKTogQ2FzdCBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yCisJcHJpbnRmLgorCSogY29mZmdyb2suYzogSW5jbHVkZSBidWNvbW0uaC4gIERvbid0IGRlY2xhcmUgeG1hbGxvYy4KKwkocHVzaF9zY29wZSk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgbGluay4KKwkqIHNpemUuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkqIHNyY29udi5jOiBJbmNsdWRlIGJ1Y29tbS5oLgorCShmaW5kX2Jhc2UpOiBEZWNsYXJlIGF0IHRvcCBvZiBmaWxlLgorCSh3cl9oZCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gYXJjaGl0ZWN0dXJlIHN3aXRjaC4KKwkod3JfZHBzX3N0YXJ0KTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBuZXN0LgorCSh3cl9kdSk6IENvbW1lbnQgb3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgaW4gY29tbWVudGVkIG91dCBibG9ja3MuCisJKHdyX2R1cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaS4KKwkod3Jfc2MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBteWluZm8sIGxvdywgYW5kIGhpZ2guCisJKiBzdHJpbmdzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisJKiBzeXNkdW1wLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgorCitUdWUgRGVjIDIwIDE5OjEzOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYXIuYyAobWFpbik6IElnbm9yZSAnZicgbW9kaWZpZXIgdXNlZCBvbiBIUC9VWCA5LgorCitUaHUgRGVjIDE1IDE3OjM0OjEyIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogYXIuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmM6IEluY2x1ZGUgcHJvZ3Jlc3MuaC4KKwkqIGFyLmMsIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jIChtYWluKTogQWRkIFNUQVJUX1BST0dSRVNTCisJYW5kIEVORF9QUk9HUkVTUy4KKwkqIGFyLmMgKG1hcF9vdmVyX21lbWJlcnMsIG9wZW5faW5hcmNoKTogQ2FsbCBQUk9HUkVTUy4KKwkqIG5tLmMgKG1haW4sIGRpc3BsYXlfYXJjaGl2ZSwgZmlsdGVyX3N5bWJvbHMsIHByaW50X3N5bWJvbHMpOgorCUNhbGwgUFJPR1JFU1MuCisKKwkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IEJyZWFrIHVwIGxvbmcgdXNhZ2Ugc3RyaW5nLgorCitXZWQgRGVjIDE0IDE1OjUxOjU2IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBEb24ndCBib3RoZXIgc2V0dGluZyBzdGF0dXMgYWZ0ZXIKKwlub25mYXRhbCgpICJjYWxsIiwgYmVjYXVzZSBpdCB3b24ndCByZXR1cm4uCisKK0ZyaSBEZWMgIDkgMDA6MjI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IERvbid0IHN3aXRjaCBhIHJlbG9jIHRvIHVzZQorCXRoZSBzZWN0aW9uIHN5bWJvbCBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KKworVGh1IERlYyAgOCAxNDo0NTo1MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGFkZF9zdHJpcF9zeW1ib2wpOiBDYXN0IHJldHVybiB2YWx1ZSBvZiB4bWFsbG9jLgorCitXZWQgTm92IDMwIDExOjA1OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+CisKKwkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IFBhc3MgY3VycmVudC0+ZmlsZW5hbWUgdG8gbm9ybWFsaXplIHdoZW4KKwljaGVja2luZyBmb3IgZHVwbGljYXRlcywgYmVjYXVzZSB0aGUgZmlsZW5hbWUgb2YgYSBuZXdseSBhZGRlZAorCWZpbGUgd2lsbCBub3QgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgeWV0LgorCitUaHUgTm92IDE3IDE1OjAwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYXIuYyAobWFpbik6IERvbid0IGNhbGwgZG9fcXVpY2tfYXBwZW5kIGlmIGFueSBvZiB0aGUgYXJjaGl2ZQorCW5hbWVzIGFyZSBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLgorCisJKiBvYmpjb3B5LmMgKG1haW4pOiBGaXggaXNfc3RyaXAgdGVzdC4gIEZyb20KKwlwaXJrZXJAZWl1bml4LnR1d2llbi5hYy5hdCAoTWFydGluIFBpcmtlcikuCisKK1RodSBOb3YgMTcgMTU6Mzc6MTkgMTk5NCAgTWFyayBXLiBFaWNoaW4gIDxlaWNoaW5AY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5jIChhZGRfc3RyaXBfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLCBhZGRzIGEgbmFtZSB0byBhbgorCWV4cGxpY2l0IGxpc3Qgb2Ygc3ltYm9scyB0byBzdHJpcC4KKwkoaXNfc3RyaXBfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLCByZXBvcnRzIHdoZXRoZXIgdGhlIG5hbWUgYXJndW1lbnQKKwlpcyBpbiB0aGUgZXhwbGljaXQgbGlzdC4KKwkoZmlsdGVyX3N5bWJvbHMpOiBDaGVjayBhZ2FpbnN0IGlzX3N0cmlwX3N5bWJvbCBhYm92ZSBhbGwuCisJKHN0cmlwX21haW4pOiBSZWNvZ25pemUgLU4gb3B0aW9uLiBJZiB1c2VkLCBkb24ndCBkZWZhdWx0IHRvCisJc3RyaXBfYWxsLgorCShjb3B5X21haW4pOiBSZWNvZ25pemUgLU4gb3B0aW9uLgorCShzdHJpcF91c2FnZSk6IERvY3VtZW50IC1OIGFuZCAtLXN0cmlwLXN5bWJvbCBvcHRpb25zLgorCShjb3B5X3VzYWdlKTogRGl0dG8uCisJKiBvYmpjb3B5LjEsIHN0cmlwLjEsIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC1OIGFuZAorCS0tc3RyaXAtc3ltYm9sIG9wdGlvbnMuCisKK1R1ZSBOb3YgIDggMTM6MTI6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IFBhc3MgYW4KKwlhcnJheSB0byB0bXBhcmcsIHJhdGhlciB0aGFuIE5VTEwsIHNpbmNlIHNvbWUgc3lzdGVtcyBjYW4ndCBoYW5kbGUKKwlOVUxMLgorCisJKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IEtlZXAgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUKKyAgICAgICAgdGVtcG9yYXJ5IGZpbGVzIHdlIGNyZWF0ZWQuICBDbG9zZSBlYWNoIGlucHV0IEJGRCBhZnRlciB3ZSBvcGVuCisgICAgICAgIGl0cyBzdWNjZXNzb3IuCisKK01vbiBOb3YgIDcgMTU6NDg6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIDIuNS4zLgorCitUaHUgTm92ICAzIDE5OjA0OjM0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBJbnN0YWxsIGluZm8gZmlsZXMgZnJvbSB3aGF0ZXZlcgorCWRpcmVjdG9yeSB0aGV5IHdlcmUgZm91bmQgaW4uCisKKwlQYXRjaCBmcm9tIERKIERlbG9yaWU6CisJKiBjb25maWd1cmUuYmF0OiBkbyBjKytmaWx0IC0+IGN4eGZpbHQgcmlnaHQKKworCSogc3lzaW5mby55OiBJbmNsdWRlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZWFybHksIHNvIGFueSBwb3RlbnRpYWwKKwlkZWNsYXJhdGlvbiBvZiBhYm9ydCgpIG9jY3VycyBiZWZvcmUgaXRzIHVzZS4KKworCSogc3RyaW5ncy5jIChzdHJpbmdzX2ZpbGUpOiBUcnkgb3BlbmluZyB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQorCWZpcnN0LgorCitXZWQgTm92ICAyIDE1OjQ0OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYXIuYyAobWFpbik6IFRyZWF0IGFyIHFzIGxpa2UgYXIgcnMuCisKK1R1ZSBPY3QgMjUgMTY6MTk6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGdhcF9maWxsKTogRXhwbGljaXRseSBpbml0aWFsaXplLCBmb3IgY2xhcml0eS4KKwkocGFkX3RvX3NldCwgcGFkX3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKGNvcHlfb3B0aW9ucyk6IEFjY2VwdCAtLXBhZC10by4KKwkoY29weV91c2FnZSk6IE1lbnRpb24gLS1wYWQtdG8uCisJKGNvcHlfb2JqZWN0KTogU3VwcG9ydCAtLXBhZC10by4KKwkoY29tcGFyZV9zZWN0aW9uX3ZtYSk6IFNvcnQgbm9uIGxvYWRhYmxlIHNlY3Rpb25zIHRvIHRoZSBmcm9udC4KKwlTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgVk1BIGJ5IHNpemUuCisJKGNvcHlfbWFpbik6IEhhbmRsZSAtLXBhZC10by4KKwkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1wYWQtdG8uCisKK1RodSBPY3QgMjAgMTM6NTE6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmMgKGdhcF9maWxsX3NldCwgZ2FwX2ZpbGwpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tZ2FwLWZpbGwuCisJKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tZ2FwLWZpbGwuCisJKGNvcHlfb2JqZWN0KTogU3VwcG9ydCAtLWdhcC1maWxsLgorCShnZXRfc2VjdGlvbnMsIGNvbXBhcmVfc2VjdGlvbl92bWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKwkoY29weV9tYWluKTogSGFuZGxlIC0tZ2FwLWZpbGwuCisJKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tZ2FwLWZpbGwuCisKK1dlZCBPY3QgMTkgMTQ6MDk6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBBZGQgYSBkdW1teSBlbHNlIGNsYXVzZSB0byB0aGUgaWYKKwlzdGF0ZW1lbnQuCisKKwkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgorCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBSZW1vdmUgc3BlY2lhbCBtZW50aW9uIG9mIC0tc2V0LXN0YXJ0CisJYW5kIGBiaW5hcnknIG91dHB1dCBmb3JtYXQuCisKK1R1ZSBPY3QgMTggMTE6MTI6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogSWYgdGhlIG91dHB1dCBmaWxlIGZvcm1hdCBpcyBgYmluYXJ5JywKKwlhbmQgdGhlIHN0YXJ0IGFkZHJlc3Mgd2FzIG5vdCBzZXQgdXNpbmcgLS1zZXQtc3RhcnQsIGRlZmF1bHQgdGhlCisJc3RhcnQgYWRkcmVzcyB0byB6ZXJvLiAgVGhpcyBoYWNrIGlzIGJlY2F1c2UgdGhlIGBiaW5hcnknIG91dHB1dAorCWZpbGUgZm9ybWF0IHVzZXMgdGhlIHN0YXJ0IGFkZHJlc3MgdG8gc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YKKwl0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgZmlsZS4KKwkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogQWRkIHNvbWUgbm90ZXMgb24gZ2VuZXJhdGluZyBTLXJlY29yZHMKKwlhbmQgYmluYXJ5IGZpbGVzLgorCisJKiBubS5jIChwcmludF9zeW1kZWZfZW50cnkpOiBDYWxsIHByaW50X3N5bW5hbWUgdG8gcHJpbnQgdGhlCisJc3ltYm9sIG5hbWUsIHNvIHRoYXQgLS1kZW1hbmdsZSB3b3Jrcy4KKworCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIHRtcGRpci4KKworCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGZpZWxkcyB1c2VkLCBhZGp1c3QsIHZhbC4KKwkoYWRqdXN0X3N0YXJ0LCBzZXRfc3RhcnRfc2V0LCBzZXRfc3RhcnQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoYWRqdXN0X3NlY3Rpb25fdm1hLCBhZGp1c3Rfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoY29weV9vcHRpb25zKTogQWRkIC0tYWRqdXN0LXN0YXJ0LCAtLWFkanVzdC12bWEsCisJLS1hZGp1c3Qtc2VjdGlvbi12bWEsIC0tYWRqdXN0LXdhcm5pbmdzLCAtLW5vLWFkanVzdC13YXJuaW5ncywKKwktLXNldC1zdGFydC4KKwkocGFyc2Vfdm1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29weV91c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCisJKGNvcHlfb2JqZWN0KTogSGFuZGxlIC0tc2V0LXN0YXJ0IGFuZCAtLWFkanVzdC1zdGFydC4KKwkoc2V0dXBfc2VjdGlvbik6IENvcnJlY3QgdHlwZSBvZiBsYXN0IGFyZ3VtZW50IHRvIFBUUi4gIFNldCB1c2VkCisJZmllbGQgaWYgc2VjdGlvbiBpcyByZW1vdmVkLiAgSGFuZGxlIC0tYWRqdXN0LXZtYSBhbmQKKwktLWFkanVzdC1zZWN0aW9uLXZtYS4KKwkoY29weV9zZWN0aW9uKTogQ29ycmVjdCB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8gUFRSLgorCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IExpa2V3aXNlLgorCShzdHJpcF9tYWluKTogQ2xlYXIgdXNlZCBmaWVsZCB3aGVuIGhhbmRsaW5nIC1SLgorCShjb3B5X21haW4pOiBIYW5kbGUgbmV3IG9wdGlvbnMuCisJKiBiaW51dGlscy50ZXhpIChvYmpjb3B5KTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCisJKiBvYmpjb3B5LjE6IERvY3VtZW50IG5ldyBvcHRpb25zLgorCitGcmkgT2N0IDE0IDE0OjM4OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogUmVtb3ZlIGRlZmluaXRpb24tLXRlc3RzdWl0ZSBpcyBubworCWxvbmdlciBjb25maWd1cmVkLgorCSogTWFrZWZpbGUuaW4gKHRlc3RzdWl0ZSk6IFJlbW92ZSB0YXJnZXQuCisJKHNpdGUuZXhwKTogTmV3IHRhcmdldC4KKwkoY2hlY2spOiBSZXdyaXRlLgorCShjbGVhbiwgZGlzdGNsZWFuKTogRG9uJ3QgcmVjdXIgaW50byB0ZXN0c3VpdGUgZGlyZWN0b3J5LgorCitUaHUgT2N0IDEzIDE5OjI0OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjUuCisJKiBWZXJzaW9uIDIuNSByZWxlYXNlZC4KKworVHVlIE9jdCAxMSAxNToyNjo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChzeXNkdW1wLm8pOiBEZXBlbmRzIHVwb24gc3lzcm9mZi5jLgorCitNb24gT2N0IDEwIDEzOjUwOjMwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKKworCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IFBhc3MgLVVyIGZsYWcgdG8gbGQgc28gdGhhdCB0aGUKKwkgIGN0b3IvZHRvciB0YWJsZXMgbmVlZGVkIGJ5IEMrKyBwcm9ncmFtcyBhcmUgYnVpbHQuCisKK1N1biBPY3QgIDkgMTg6MDQ6MDAgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc3Jjb252Lm8pOiBBZGQgZGVwZW5kZW5jZSBvbiBzeXNyb2ZmLmMuCisKK1R1ZSBPY3QgIDQgMTI6MTk6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSAke2NvbmZpZ19zaGVsbH0gd2hlbiBydW5uaW5nIGNvbmZpZy5iZmQuCisKKwkqIE1ha2VmaWxlLmluIChzeXNyb2ZmLmgpOiBTcGxpdCB0YXJnZXQgYXdheSBmcm9tIHN5c3JvZmYuYy4KKwkoc3Jjb252Lm8sIHN5c2R1bXAubyk6IE5ldyB0YXJnZXRzLgorCShzcmNvbnYsIHN5c2R1bXApOiBEb24ndCBkZXBlbmQgdXBvbiBzeXNyb2ZmLmMuCisKK1dlZCBTZXAgMjggMTM6MDQ6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYXJwYXJzZS5jKTogRG9uJ3QgaWdub3JlIGVycm9ycyBmcm9tIG12LgorCShzeXNpbmZvLmMpOiBMaWtld2lzZS4gIEFsc28sIGRlcGVuZCB1cG9uIGFycGFyc2UuYywgdG8gcHJldmVudCBhCisJcGFyYWxsZWwgbWFrZSBmcm9tIHRyeWluZyB0byBidWlsZCBib3RoIGFycGFyc2UuYyBhbmQgc3lzaW5mby5jCisJc2ltdWx0YW5lb3VzbHkuCisJKG5sbWhlYWRlci5jKTogU2ltaWxhciBjaGFuZ2UuCisJKGFycGFyc2UuaCk6IFNlcGFyYXRlIHRhcmdldCBmcm9tIGFycGFyc2UuYywgc28gdGhhdCBhIHBhcmFsbGVsCisJbWFrZSBkb2VzIG5vdCB0cnkgdG8gYnVpbGQgYm90aCBhdCBvbmNlLiAgRGVwZW5kIHVwb24gYXJwYXJzZS5jLgorCShzeXNpbmZvLmgpOiBTaW1pbGFyIGNoYW5nZS4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogUGFzcyB0aGUgcmVsb2MgYnVmZmVyIHRvIGZyZWUsIG5vdAorCXRoZSBwb2ludGVyIHVzZWQgdG8gbG9vcCBvdmVyIHRoZSByZWxvY3MuCisKK1NhdCBTZXAgMjQgMTY6MTY6NTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYXN0IHJlc3VsdCBvZiB4bWFsbG9jLgorCitXZWQgU2VwIDIxIDE5OjMwOjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChzb3J0ZWRfc3ltcywgc29ydGVkX3N5bWNvdW50KTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCisJKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFVzZSBzb3J0ZWRfc3ltcyBhbmQgc29ydGVkX3N5bWNvdW50CisJaW5zdGVhZCBvZiBzeW1zIGFuZCBzeW1jb3VudC4KKwkoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGJvdGhlciB0byBnZXQgdGhlIHJlbG9jcyBiZWZvcmUgbG9vcGluZworCW92ZXIgdGhlIHNlY3Rpb25zLiAgQmVmb3JlIGZpbHRlcmluZyBhbmQgc29ydGluZyB0aGUgc3ltYm9sIHRhYmxlLAorCWNvcHkgaXQgaW50byBzb3J0ZWRfc3ltcy4KKworRnJpIFNlcCAxNiAxMToyNzozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8pOiBBZGQgZmllbGQgcmVxdWlyZV9zZWMuCisJKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IElmIGF1eC0+cmVxdWlyZV9zZWMsIHJlcXVpcmUgdGhhdCB0aGUKKwlzeW1ib2wgYmUgaW4gYXV4LT5zZWMgZXZlbiBpZiBIQVNfUkVMT0MgaXMgbm90IHNldC4gIElmIHdlIGNhbid0CisJZmluZCBhIHNtYWxsZXIgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLCBsb29rIGZvciBhIGxhcmdlciBvbmUuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgYXV4LnJlcXVpcmVfc2VjIGFyb3VuZCB0aGUKKwlvYmpkdW1wX3ByaW50X2FkZHJlc3MgY2FsbCBmb3IgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MuCisKK1RodSBTZXAgMTUgMjE6NDM6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhci5jOiBDYWxsIHhleGl0IHJhdGhlciB0aGFuIGV4aXQuCisJKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X2ZpbGUsIG91dHB1dF9iZmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkocmVtb3ZlX291dHB1dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1haW4pOiBDYWxsIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpLiAgQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbgorCXJldHVybmluZy4KKwkoZXh0cmFjdF9maWxlKTogU2V0IG91dHB1dF9maWxlbmFtZSBhbmQgb3V0cHV0X2ZpbGUgd2hpbGUgb3V0cHV0CisJZmlsZSBpcyBvcGVuLgorCSh3cml0ZV9hcmNoaXZlKTogTGlrZXdpc2UsIGJ1dCB1c2Ugb3V0cHV0X2JmZCwgbm90IG91dHB1dF9maWxlLgorCSogYXJzdXAuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIENhbGwgeGV4aXQgcmF0aGVyIHRoYW4gZXhpdC4KKwkqIGJ1Y29tbS5jOiBMaWtld2lzZS4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9hbGwpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCSh1c2FnZSk6IERvY3VtZW50IC0tZGlzYXNzZW1ibGUtYWxsLgorCShsb25nX29wdGlvbnMpOiBBZGQgZGlzYXNzZW1ibGUtYWxsIGFzIGEgc3lub255bSBmb3IgLUQuCisJKGNvbXBhcmVfc3ltYm9scyk6IE1ha2UgcG9pbnRlcnMgY29uc3QuCisJKGNvbXBhcmVfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZGlzYXNzZW1ibGVfZGF0YSk6IFJlbmFtZSBkaXNhc3NlbWJsZSB0byBkaXNhc3NlbWJsZV9mbiB0byBhdm9pZAorCXNoYWRvd2luZy4gIElmIGR1bXBfcmVsb2NfaW5mbywgcHJpbnQgcmVsb2NzIGFsb25nIHdpdGgKKwlkaXNhc3NlbWJseS4gIFNraXAgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBTRUNfQ09ERSB1bmxlc3MKKwlkaXNhc3NlbWJsZV9hbGwgb3Igb25seSBpcyBzZXQuCisJKGRpc3BsYXlfYmZkKTogRG9uJ3QgY2FsbCBkdW1wX3JlbG9jcyBpZiBkaXNhc3NlbWJsZSBpcyBzZXQuCisJKG1haW4pOiBBY2NlcHQgYW5kIGhhbmRsZSAtRC4KKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC1ELy0tZGlzYXNzZW1ibGUtYWxsLgorCSogb2JqZHVtcC4xOiBMaWtld2lzZS4KKworV2VkIFNlcCAxNCAxMjoxOTowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpemUgcHJldmxpbmUgdG8gMC4gIE1ha2UKKwlwcmV2X2Z1bmN0aW9uIG5vbiBjb25zdC4gIENvcHkgZnVuY3Rpb25uYW1lIGludG8gYW4gbWFsbG9jIGJ1ZmZlcgorCXdoZW4gc2V0dGluZyBwcmV2X2Z1bmN0aW9uLCBpbnN0ZWFkIG9mIGFzc3VtaW5nIHRoYXQgdGhlIHN0cmluZworCXdpbGwgbGFzdCBmb3JldmVyLgorCisJKiBubS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgorCShzb3J0X2J5X3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShsb25nX29wdGlvbnMpOiBBZGQgLS1zaXplLXNvcnQuCisJKHVzYWdlKTogTWVudGlvbiAtLXNpemUtc29ydC4KKwkobnVtZXJpY19mb3J3YXJkKTogTWFrZSBzdGF0aWMuICBDaGFuZ2UgZnJvbSB2b2lkICogdG8gUFRSLgorCShudW1lcmljX3JldmVyc2UpOiBMaWtld2lzZS4KKwkobm9uX251bWVyaWNfZm9yd2FyZCwgbm9uX251bWVyaWNfcmV2ZXJzZSk6IExpa2V3aXNlLgorCShzb3J0ZXJzKTogQ2hhbmdlIGRlY2xhcmF0aW9uIGZyb20gdm9pZCAqIHRvIFBUUi4KKwkoc2l6ZV9mb3J3YXJkLCBzb3J0X3N5bWJvbF9ieV9zaXplKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKGRpc3BsYXlfcmVsX2ZpbGUpOiBIYW5kbGUgc29ydF9ieV9zaXplLgorCShmaWx0ZXJfc3ltYm9scyk6IElmIHNvcnRfYnlfc2l6ZSwgZGlzY2FyZCBhYnNvbHV0ZSBhbmQgdW5kZWZpbmVkCisJc3ltYm9scy4KKwkqIGJpbnV0aWxzLnRleGkgKG5tKTogRG9jdW1lbnQgLS1zaXplLXNvcnQuCisJKiBubS4xOiBEb2N1bWVudCAtLXNpemUtc29ydC4KKworVHVlIFNlcCAxMyAyMTowNjowNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogb2JqY29weS5jIChjb3B5X21haW4pOiBJbml0aWFsaXplIGlucHV0X2ZpbGVuYW1lIGFuZAorCW91dHB1dF9maWxlbmFtZSB0byBOVUxMLgorCitUdWUgU2VwIDEzIDE0OjE3OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHZlcnNpb24ubyk6IERlcGVuZCB1cG9uIE1ha2VmaWxlLCBzbyB0aGF0IHZlcnNpb24ubworCWdldHMgcmVidWlsdCB3aGVuIG1ha2UgdmFyaWFibGUgVkVSU0lPTiBpcyBjaGFuZ2VkLgorCisJKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCB0aGUgU0VDX05FVkVSX0xPQUQgZmxhZy4KKworV2VkIEF1ZyAyNCAxMjo0MDowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCisKK1R1ZSBBdWcgMjMgMTE6MDA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBhci5jIChyYW5saWJfdG91Y2gpOiBEb24ndCB1cGRhdGUgdGhlIGFyY2hpdmUgbWFwIGlmIHRoZXJlIGlzbid0CisJb25lLgorCitNb24gQXVnIDIyIDE2OjAyOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogYXIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkoaW5hcmNoKTogUmVtb3ZlIHZhcmlhYmxlLgorCShtYXBfb3Zlcl9tZW1iZXJzKTogTWFrZSBzdGF0aWMuICBBZGQgYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdAorCWluc3RlYWQgb2YgaW5hcmNoLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShtYWluKTogVHJlYXQgLS12ZXJzaW9uIGFzIC12LiAgQWNjZXB0IC10IGFyZ3VtZW50LiAgQWNjZXB0IGFueQorCW51bWJlciBvZiBhcmNoaXZlIGFyZ3VtZW50cy4gIENhdGNoIGFuZCB1c2Ugb3Blbl9pbmFyY2ggcmV0dXJuCisJdmFsdWUsIHJhdGhlciB0aGFuIHVzaW5nIGluYXJjaC4KKwkob3Blbl9pbmFyY2gpOiBSZXR1cm4gbmV3bHkgb3BlbmVkIEJGRCwgcmF0aGVyIHRoYW4gdXNpbmcgaW5hcmNoLgorCShkb19xdWlja19hcHBlbmQpOiBNYWtlIGFyY2hpdmVfZmlsZW5hbWUgY29uc3QuCisJKHdyaXRlX2FyY2hpdmUpOiBBZGQgaWFyY2ggYXJndW1lbnQsIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBpbmFyY2guCisJQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShkZWxldGVfbWVtYmVycywgbW92ZV9tZW1iZXJzLCByZXBsYWNlX21lbWJlcnMpOiBMaWtld2lzZS4KKwkocmFubGliX29ubHkpOiBEb24ndCBleGl0IG9uIHN1Y2Nlc3MuICBDYXRjaCBhbmQgdXNlIG9wZW5faW5hcmNoCisJcmV0dXJuIHZhbHVlLgorCShyYW5saWJfdG91Y2gpOiBOZXcgZnVuY3Rpb24uCisJKiBhcnN1cC5oIChtYXBfb3Zlcl9tZW1iZXJzKTogRG9uJ3QgZGVjbGFyZS4KKwkoYXJfZW5kLCBhcl9leHRyYWN0KTogRGVjbGFyZS4KKwkob3Blbl9pbmFyY2gpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGluIGRlY2xhcmF0aW9uIHRvIGJmZCAqLgorCSogYXJzdXAuYyAobWFwX292ZXJfbGlzdCk6IE1ha2Ugc3RhdGljLiBBbHdheXMgcGFzcyB0d28gYXJndW1lbnRzCisJdG8gZnVuY3Rpb24uICBBZGQgYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGluYXJjaC4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKGFyX2RpcmVjdG9yeV9kb2VyKTogTWFrZSBzdGF0aWMuICBBZGQgaWdub3JlZCBzZWNvbmQgYXJndW1lbnQuCisJQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShhcl9kaXJlY3RvcnkpOiBVc2Ugb3Blbl9pbmFyY2ggcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIGluYXJjaC4KKwkoYXJfYWRkbGliX2RvZXIpOiBNYWtlIHN0YXRpYy4KKwkoYXJfYWRkbGliKTogVXNlIG9wZW5faW5hcmNoIHJldHVybiB2YWx1ZSByYXRoZXIgdGhhbiBpbmFyY2guCisJKGFyX2V4dHJhY3QpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGFiZmQuCisKK1RodSBBdWcgMTEgMTQ6NTU6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJQWRkIHN1cHBvcnQgZm9yIHJlbW92aW5nIG5hbWVkIHNlY3Rpb25zIHRvIG9iamNvcHkgYW5kIHN0cmlwLgorCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogRGVmaW5lLgorCShyZW1vdmVfc2VjdGlvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShzdHJpcF9vcHRpb25zLCBjb3B5X29wdGlvbnMpOiBBZGQgcmVtb3ZlLXNlY3Rpb24uCisJKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogTWVudGlvbiAtUiBhbmQgLS1yZW1vdmUtc2VjdGlvbi4KKwkoc2V0dXBfc2VjdGlvbik6IElmIHNlY3Rpb24gaXMgaW4gcmVtb3ZlX3NlY3Rpb25zIGxpc3QsIGlnbm9yZSBpdC4KKwkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCisJKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IEhhbmRsZSAtUi4KKwkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCisKK1dlZCBBdWcgMTAgMTA6MTk6NTUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IFJlbmFtZSBzeW12YWx1ZSB0byBzeW1fdmFsdWUsCisJc28gYXMgbm90IHRvIGNvbmZsaWN0IHdpdGggdGhlIHN5bXZhbHVlIHR5cGVkZWYgaW4gYmZkLmguCisKK01vbiBBdWcgIDEgMTM6MTk6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBubG1oZWFkZXIueTogUGVyIGN1cnJlbnQgTmV0V2FyZSBkb2NzLCBhY2NlcHQgYSByZXZpc2lvbiBudW1iZXIKKwlvZiAwIGFuZCB0cmVhdCBhIHJldmlzaW9uIG51bWJlciBncmVhdGVyIHRoYW4gMjYgYXMgMC4KKworTW9uIEp1bCAyNSAxMjo1ODozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ29ycmVjdCBoYW5kbGluZyBvZiBlbmQgb2YKKwlzeW1ib2xzIHdoZW4gbG9va2luZyBmb3IgbmV4dCBzeW1ib2wgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4KKworRnJpIEp1bCAyMiAxNjo0ODozNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBubS5jIChudW1lcmljX2ZvcndhcmQpOiBUcmVhdCB1bmRlZmluZWQgc3ltYm9scyBhcyAibGVzcyB0aGFuIgorCWRlZmluZWQgc3ltYm9scyB3aXRoIHplcm8gdmFsdWVzLiAgSWYgbnVtZXJpYyB2YWx1ZXMgYXJlIGVxdWFsLCBvcgorCWJvdGggc3ltYm9scyBhcmUgdW5kZWZpbmVkLCBzb3J0IGFscGhhYmV0aWNhbGx5LiAgRG9uJ3QgYXNzdW1lCisJdGhhdCB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYmZkX3ZtYSB2YWx1ZXMgd2lsbCB0cnVuY2F0ZSB0byAiaW50IgorCWFuZCBzdGlsbCBoYXZlIHRoZSBzYW1lIHNpZ24uCisJKG51bWVyaWNfcmV2ZXJzZSk6IENhbGwgbnVtZXJpY19mb3J3YXJkIGFuZCBuZWdhdGUgdGhlIHJlc3VsdC4KKwkocHJpbnRfc3ltYm9sX2luZm9fYnNkKTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzLCBwcmludCBsZWFkaW5nCisJc3BhY2VzIGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIGEgcHJpbnRlZCBiZmRfdm1hLCByYXRoZXIgdGhhbgorCWFzc3VtaW5nIHRoYXQgOCB3aWxsIGxvb2sgcmlnaHQuCisKK0ZyaSBKdWwgMjIgMTA6MzY6NTAgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZmdyb2suYyAoZG9pdCk6ICBaZXJvIGFsbCBmaWVsZHMgb2YgbmV3IHN0cnVjdHVyZS4KKwkqIHNyY29udi5jIChzeXNyb2ZmX3N3YXBfKl9vdXQpOiBSZW1vdmUgcmVkdW5kYW50IHRyYWlsaW5nIGFyZy4KKwkqIHN5c2luZm8ueTogR2VuZXJhdGUgc3lzcm9mZl9zd2FwXypfb3V0IHdpdGhvdXQgcmVxdWlyaW5nIGV4dHJhCisJYXJnLgorCitGcmkgSnVsIDIyIDEwOjA5OjUzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogbmxtaGVhZGVyLnk6IE1ha2UgInN0YWNrIiBhbmQgInN0YWNrc2l6ZSIgc3lub255bXMgaW4gdGhlIGxleGVyCisJICByYXRoZXIgdGhhbiB0aGUgcGFyc2VyLgorCitUaHUgSnVsIDIxIDEwOjI1OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLWFscGhhb3NmLCBjb25maWcvbWgtYXBvbGxvNjh2LCBjb25maWcvbWgtZGVsdGE4ODoKKwlSZW1vdmU7IG9ic29sZXRlLgorCitTYXQgSnVsIDE2IDIyOjM0OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChzbHVycF9keW5hbWljX3N5bXRhYik6IFRyeSB0byBnZXQgdGhlIGR5bmFtaWMgc3ltYm9scworCWV2ZW4gaWYgdGhlIGJmZCBpcyBub3QgbWFya2VkIERZTkFNSUMuICBFTEYgZXhlY3V0YWJsZXMgYXJlIG5vdAorCW1hcmtlZCBEWU5BTUlDLCBidXQgZG8gaGF2ZSBkeW5hbWljIHN5bWJvbHMuCisKK0ZyaSBKdWwgMTUgMDE6NDE6MzUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZmdyb2suYyAoZG9fd2hlcmUpOiBNYWtlIGRhdGEgd2l0aCBubyB0eXBlICdpbnQnLgorCShkb19kZWZpbmUpOiAgS2VlcCBpbmZvIG9uIHNvdXJjZSBmaWxlIG9mIGEgc3ltYm9sLgorCSogY29mZmdyb2suaCAoY29mZl9zeW1ib2wpOiBOZXcgZmllbGQuCisJKiBzcmNvbnYuYyAoUFJPR1JBTV9WRVJTSU9OKTogTm93IDEuMworCSh3cl9ybCk6IFVzZSBleHRlcm5hbCByZWYgbnVtYmVyIGZvciBzeW1ib2wuCisJKHdyX2R1cyk6IE9ubHkga2VlcCBvbmUgc291cmNlIGZpbGUgcGVyIGRlYnVnIHVuaXQuCisJKHdyX2Rsbik6IEFsd2F5cyBlbWl0IGxpbmUgbnVtYmVycyBmb3IgZmlyc3Qgc291cmNlIGZpbGUsCisJKHdyX2dsb2JhbHMpOiAgRW1pdCBnbG9iYWxzIGluIHRoZSBkdSBvZiB0aGVpciBvd25pbmcgc291cmNlIGZpbGUuCisKK01vbiBKdWwgMTEgMTU6NTk6MDMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBubG1oZWFkZXIueTogTnVsbCB0ZXJtaW5hdGUgdmFyX2hkci0+dGhyZWFkTmFtZS4KKworRnJpIEp1bCAgOCAxNzozMzoyMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc3lzbGV4Lm8sIHN5c2luZm8ubyk6IFBlcm1pdCBDIHNvdXJjZSBmaWxlcyB0byBiZQorCWluICQoc3JjZGlyKSwgYXMgdGhleSB3aWxsIGJlIGZvciBGU0YgcmVsZWFzZXMuCisKK1dlZCBKdWwgIDYgMDE6MTM6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogUHJlc2VydmUgZXhpc3Rpbmcgc2VjdGlvbiBmbGFncyB3aGVuCisJY29weWluZyBpbiBmbGFncyBmcm9tIGEgbmV3IHNlY3Rpb24uCisKK1R1ZSBKdWwgIDUgMTU6NTY6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisJKGNvcHlfZmlsZSk6IElmIG91dHB1dF90YXJnZXQgaXMgTlVMTCwgc2V0IGl0IHRvIHRoZSB0YXJnZXQgb2YgdGhlCisJaW5wdXQgZmlsZS4KKworV2VkIEp1biAyOSAxNzoxNzoxNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAobGlua19pbnB1dHMpOiBGaXhlZCBtZW1vcnkgYWxsb2NhdGlvbiBidWcuCisKK1RodSBKdW4gMjMgMTI6NTI6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgorCitUdWUgSnVuIDIxIDEyOjUzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHN5c2luZm8pOiBEb2VzIG5vdCBkZXBlbmQgdXBvbiAkKEFERExfTElCUykuCisKKwkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IERvbid0IGdlbmVyYXRlIHRoZSBQb3dlclBDCisJTmV0V2FyZSBjdXN0b20gaGVhZGVyOyBubyBsb25nZXIgbmVlZGVkLgorCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDb252ZXJ0IHJlbG9jcyBhZ2FpbnN0IHRoZSB1bmluaXRpYWxpemVkCisJZGF0YSBzZWN0aW9uIGludG8gcmVsb2NzIGFnYWluc3QgdGhlIGRhdGEgc2VjdGlvbi4KKworCSogY29uZmlndXJlLmluOiBTZXQgbmxtY29udl9kZWZzIHRvIC1ETkxNQ09OVl9jcHV0eXBlIGZvciBhbGwgdGhlCisJbmV0d2FyZSB0YXJnZXRzLiAgV3JpdGUgaXQgaW50byBNYWtlZmlsZSBhcyBOTE1DT05WX0RFRlMuCisJKiBNYWtlZmlsZS5pbiAobmxtY29udi5vKTogUGFzcyAkKE5MTUNPTlZfREVGUykgdG8gJChDQykuCisJKiBubG1jb252LmM6IE9ubHkgY29tcGlsZSBjb2RlIGZvciBzcGVjaWZpYyBDUFUgdHlwZXMgaWYKKwlOTE1DT05WX2NwdXR5cGUgaXMgZGVmaW5lZC4KKworCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHVzZXMgb2YgYmZkX2Fic19zZWN0aW9uLCBldGMuLCB0byB1c2UKKwliZmRfYWJzX3NlY3Rpb25fcHRyIG9yIGJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLgorCShpMzg2X21hbmdsZV9yZWxvY3MsIGFscGhhX21hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KKwkocG93ZXJwY19idWlsZF9zdHVicyk6IExpa2V3aXNlLgorCSogbm0uYyAoZmlsdGVyX3N5bWJvbHMsIHByaW50X3N5bWJvbHMpOiBMaWtld2lzZS4KKwkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBMaWtld2lzZS4KKwkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBMaWtld2lzZS4KKwkqIG9iamR1bXAuYyAocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scywgZHVtcF9yZWxvY3MpOiBMaWtld2lzZS4KKwkqIHNpemUuYyAoc3lzdl9pbnRlcm5hbF9wcmludGVyKTogTGlrZXdpc2UuCisKK01vbiBKdW4gMjAgMTY6NDM6MDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKE1BTlBBR0VTKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLgorCShpbnN0YWxsKTogSW5zdGFsbCBpdCBleHBsaWNpdGx5LCBmcm9tIGJ1aWxkIGRpciwgbm90IHNyY2Rpci4KKworTW9uIEp1biAyMCAxNjoyOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYzogRG9uJ3QgaW5jbHVkZSBlbGYvaW50ZXJuYWwuaC4KKwkoYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBEb24ndCBkZWNsYXJlLgorCShyZWFkX3NlY3Rpb25fc3RhYnMpOiBObyBzcGVjaWFsIGhhbmRsaW5nIGZvciBFTEYuICBBbHdheXMgcmVhZAorCXVzaW5nIEJGRCBzZWN0aW9ucy4KKworVGh1IEp1biAxNiAxNzoyNToyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IFVOREVSU0NPUkUgaW4gTWFrZWZpbGUgYmFzZWQgb24gcmVzdWx0IG9mCisJaW52b2tpbmcgY29uZmlnLmJmZCB3aXRoIGEgc2Vjb25kIGFyZ3VtZW50IG9mIGBgXycnLgorCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6IERlcGVuZCB1cG9uIE1ha2VmaWxlLiAgRG9uJ3QgdHJ5IHRvCisJcnVuICQoQ0MpIGFuZCAkKE5NKSwganVzdCB1c2UgJChVTkRFUlNDT1JFKS4gIENyZWF0ZSB2aWEgdGVtcG9yYXJ5CisJZmlsZS4KKwkoZGVtYW5nbGUubyk6IFJlbW92ZSB0YXJnZXQuCisJKCQoTk1fUFJPRykpOiBEb24ndCBkZXBlbmQgdXBvbiBkZW1hbmdsZS5vLCBhbmQJZG9uJ3QgbGluayBhZ2FpbnN0CisJZGVtYW5nbGUuby4gIEl0J3MgaW4gbGliaWJlcnR5IGFueWhvdy4KKwkoY3BsdXMtZGVtLm8pOiBEb24ndCBkZXBlbmQgdXBvbiBkZW1hbmdsZS5vLgorCSogYmludXRpbHMudGV4aTogTWVudGlvbiAtbiBhbmQgLS1uby1zdHJpcC11bmRlcnNjb3JlcyBhcmd1bWVudHMKKwl0byBjKytmaWx0LgorCitXZWQgSnVuIDE1IDEyOjEwOjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbm0uYyAobG9uZ19vcHRpb25zKTogQWRkIC0tbm8tZGVtYW5nbGUgdG8gdHVybiBvZmYgLS1kZW1hbmdsZSwKKwlhbmQgLS1uby1jcGx1cyBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KKwkodXNhZ2UpOiBNZW50aW9uIC0tbm8tZGVtYW5nbGUuCisJKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCAtLW5vLWRlbWFuZ2xlLgorCitGcmkgSnVuIDEwIDE1OjQxOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbm0uYzogSE9TVF82NF9CSVQgd2FzIHJlbmFtZWQgdG8gQkZEX0hPU1RfNjRfQklULgorCisJKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IE1ha2UgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gdGhlCisJc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG91dHB1dCBCRkQsIHNpbmNlIHdlIG1heSBub3QgaGF2ZSB3cml0ZQorCXBlcm1pc3Npb24gb24gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUKKwluZXcgZGlyZWN0b3J5IHRvIDA3MDAsIG5vdCAwNzc3LgorCitNb24gSnVuICA2IDIxOjM2OjQzIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBpZiB0aGlzIGlzIGFuIHJzNjAwMCAoYW5kIHdlJ3JlIG5vdCBidWlsZGluZyBmb3IKKwlhbnkgb3RoZXIgYmZkIHRhcmdldHMpIHRoZW4gYnVpbGQgb25seSBubSAoY29sbGVjdCBuZWVkcyBpdCBvbgorCXJzNjAwMC1seW54KS4KKworCSogTWFrZWZpbGUuaW46IGRlZmluZSBUT09MX1BST0dTIHdoaWNoIHRoZSBsaXN0IG9mIHByb2dyYW1lcyB0bworCWluc3RhbGwgaW4gJHRvb2xkaXIgLS0gcmVwbGFjZXMgYSBoYXJkLWNvZGVkIGxpc3QuCisKK0ZyaSBKdW4gIDMgMTA6NTk6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9rLgorCitUaHUgTWF5IDI2IDE4OjA1OjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1hbHBoYW9zZiAoQ0ZMQUdTKTogRG9uJ3Qgc3BlY2lmeSBib3RoIC1nIGFuZCAtTzsKKwl0aGV5J3JlIG5vdCBjb21wYXRpYmxlIHVuZGVyIG5hdGl2ZSBjYy4gIFVzZSAtTzEgaW5zdGVhZC4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjQuMS4KKworCUNoYW5nZXMgZnJvbSBiaW51dGlscy0yLjQgbmV0IHJlbGVhc2U6CisKKwkqIE1ha2VmaWxlLmluIChNQU5QQUdFUyk6IFVzZSAkKERFTUFOR0xFUl9QUk9HKS4KKwkoJChERU1BTkdMRVJfUFJPRykuMSk6IEJ1aWxkIGZyb20gY3h4ZmlsdC5tYW4sIHVzaW5nIHNlZC4KKwkqIGN4eGZpbHQubWFuOiBSZW5hbWVkIGZyb20gYysrZmlsdC4xLCByZXBsYWNlZCAiYysrZmlsdCIgd2l0aAorCW1hZ2ljIHRva2VuIHRvIGJlIHJlcGxhY2VkIGJ5IHNlZC4KKworCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQorCisJKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBtYWtlZmlsZS5pbgorCitGcmkgTWF5IDEzIDIzOjI1OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYnVjb21tLmM6IENoZWNrIEFOU0lfUFJPVE9UWVBFUyByYXRoZXIgdGhhbiBfX1NURENfXy4KKworVHVlIE1heSAxMCAxODoyMjowNiAxOTk0ICBKYXNvbiBNb2xlbmRhICAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogb2JqY29weS5jIChjb3B5X3NlY3Rpb24pOiBTZXQgc2VjdGlvbiBzaXplIGNvcnJlY3RseSBpZiB1c2luZworCWludGVybGVhdmUuCisKK1NhdCBNYXkgIDcgMTY6NDk6MzYgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBzeXNpbmZvLmgKKworRnJpIE1heSAgNiAxMjoxODozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoU1JDT05WX1BST0cpOiBEZWZpbmUuCisJKFBST0dTKTogVXNlICQoU1JDT05WX1BST0cpIHRvby4KKworVGh1IE1heSAgNSAxOTo0MTo0MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIHN5c2luZm8uYywgc3lzbGV4LmMsIGluIGNhc2UKKwlzb21lb25lIGNvbmZpZ3VyZXMgd2l0aCBgdGFyZ2V0cz1hbGwnLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgeS4qLgorCShzeXNsZXgubyk6IERlcGVuZCBvbiBzeXNpbmZvLmguCisJKHN5c2luZm8uYyk6IFJlbmFtZSB5LnRhYi5oIHRvIHN5c2luZm8uaC4KKwkoaW5zdGFsbC1pbmZvKTogRG9uJ3QgdHJ5IHRvIGluc3RhbGwgaW50byAkKGluZm9kaXIpLyQoc3JjZGlyKS4KKwkqIHN5c2xleC5sOiBJbmNsdWRlIHN5c2luZm8uaCwgbm90IHkudGFiLmguCisKK1RodSBNYXkgIDUgMTE6NTA6NTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIHN5c2xleC5sICh5eXdyYXApOiBEZWZpbmUgYXMgZnVuY3Rpb24gaWYgbm90IGRlZmluZWQgYXMgYSBtYWNyby4KKworCSogTWFrZWZpbGUuaW4gKG9iamR1bXAubyk6IERlbGV0ZWQgc3BlY2lhbCBydWxlLgorCSogY29uZmlndXJlLmluOiBEb24ndCBib3RoZXIgYnVpbGRpbmcgQVJDSERFRlMgdmFyaWFibGUgZm9yCisJTWFrZWZpbGUuCisJKiBvYmpkdW1wLmMgKEFSQ0hfKik6IERlbGV0ZWQgaGFuZGxpbmcuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIGBkaXNhc3NlbWJsZXInIGZyb20gb3Bjb2RlcyBsaWJyYXJ5LgorCitUaHUgTWF5ICA1IDEzOjI4OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBDb3JyZWN0IGhhbmRsaW5nIG9mICQodG9vbGRpcikgYW5kCisJJChiaW5kaXIpIGJlaW5nIG9uIGRpZmZlcmVudCBkZXZpY2VzLgorCitGcmkgQXByIDI5IDA5OjUwOjM4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIHN5c2R1bXAuYyAoaDgzMDAsIHNoKTogQWRkIGRlY2xhcmF0aW9ucy4KKworV2VkIEFwciAyNyAxMToyNToxOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc3lzbGV4LCBzeXNpbmZvKTogVXNlIENDX0ZPUl9CVUlMRC4KKwkqIGNvZmZkdW1wLmMsIGNvZmZncm9jLmMsIGNvZmZncm9nLmgsIHNyY29udi5jLCBzeXNkdW1wLmMsCisJc3lzcm9mZi5pbmZvOiBNYWpvciBjaGFuZ2VzLgorCitUdWUgQXByIDI2IDE4OjE4OjI0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChwcmludF9zZWN0aW9uX3N0YWJzKTogSW5kaWNhdGUgdGhlIHN0YWIgaGVhZGVyIHN5bWJvbAorCW1vcmUgY2xlYXJseSwgcHJpbnQgbnVtYmVycyBvZiB1bnJlY29nbml6ZWQgc3RhYiBuX3R5cGUgdmFsdWVzLgorCitUdWUgQXByIDI2IDE2OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbmxtY29udi5jIChjb3B5X3NlY3Rpb25zKTogQ29weSBhcmVsZW50IHBvaW50ZXJzLCBub3QgYXJlbGVudHMuCisKK01vbiBBcHIgMjUgMTY6MTQ6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICQoUFJPR1MpIGFuZCB1bmRlcnNjb3JlLmMuCisKK0ZyaSBBcHIgMjIgMTE6MTQ6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgLnJlZ2luZm8KKwlzZWN0aW9uLgorCShjb3B5X3NlY3Rpb25zKTogTGlrZXdpc2UuCisJKGFscGhhX21hbmdsZV9yZWxvY3MpOiBVc2UgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSByYXRoZXIgdGhhbiB0aGUKKwlzcGVjaWFsIEVDT0ZGIC5yZWdpbmZvIHNlY3Rpb24uCisKKwkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBDYWxsIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgYWZ0ZXIKKwljb3B5aW5nIGV2ZXJ5dGhpbmcgZWxzZSwgdG8gbGV0IGl0IGZpZGRsZSB3aXRoIHRoZSBmaWxlIGluIGl0cworCWZpbmFsIHN0YXRlLgorCisJKiBvYmpkdW1wLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisJKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBJZiBhIGZvcm1hdCBmYWlscywganVzdCBnbyBvbiB0byB0aGUgbmV4dAorCW9uZS4gIENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2V0X2Zvcm1hdC4KKwkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuICBEb24ndCBpbmNyZW1lbnQgbG9vcCB2YXJpYWJsZSBpbgorCWZvciBsb29wIHRlc3QsIHNpbmNlIHRoYXQgc2tpcHMgdGhlIGZpcnN0IGVsZW1lbnQuCisJKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyk6IFJld3JpdGUgbG9vcCBmb3IgY2xhcml0eS4gIEVuc3VyZSB0aGF0IGl0CisJYWx3YXlzIHByaW50cyBhdCBsZWFzdCBvbmUgZWxlbWVudC4KKworCSogbmxtY29udi5jIChtYWluKTogVXNlIEN5R25Vc0V4IHJhdGhlciB0aGFuIEN5R25Vc1NlQ3MgZm9yCisJc2VjdGlvbnMgaGVhZGVyLiAgUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb25zIHRvIGN5Z251c19leHQuCisKK1RodSBBcHIgMjEgMTI6MTI6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKF9EVU1NWV9OQU1FXyk6IERvbid0IGRlZmluZS4KKwkoZGlzcGxheV90YXJnZXRfbGlzdCk6IFVzZSB0bXBuYW0gdG8gZ2V0IGEgZmlsZSBuYW1lIHJhdGhlciB0aGFuCisJdXNpbmcgX0RVTU1ZX05BTUVfLiAgVW5saW5rIGl0IHdoZW4gZG9uZS4KKwkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCisKKwkqIG5sbWNvbnYuYyAoc2Vjc2VjKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWFpbik6IENyZWF0ZSAubmxtc2VjdGlvbnMgc2VjdGlvbiBpbiBvdXRwdXQgQkZELiAgU3RvcmUKKwlpbmZvcm1hdGlvbiBhYm91dCBpdCBpbiBzZWN0aW9ucyBoZWFkZXIuCisJKHNldHVwX3NlY3Rpb25zKTogQWxsb2NhdGUgc3BhY2UgaW4gc2VjdGlvbnMgaGVhZGVyLgorCShjb3B5X3NlY3Rpb25zKTogQ29weSB6ZXJvIHNpemVkIHNlY3Rpb25zLiAgUHV0IGluZm9ybWF0aW9uIGFib3V0CisJZWFjaCBzZWN0aW9uIGluIHRoZSBzZWN0aW9ucyBoZWFkZXIuCisKK1dlZCBBcHIgMjAgMTQ6MzQ6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBUYWtlIG5ldyBvdXRiZmQgYXJndW1lbnQuCisJQ2hhbmdlIGNhbGxlci4gIENyZWF0ZSBjdXN0b20gaGVhZGVyIGZvciBuZXcgUG93ZXJQQyBOZXRXYXJlCisJZm9ybWF0LgorCisJKiBNYWtlZmlsZS5pbiAobmxtaGVhZGVyLm8sIG5sbWNvbnYubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisJKiBubG1jb252LmM6IEluY2x1ZGUgYmZkLmggYW5kIGxpYmliZXJ0eS5oIHdpdGggIiIsIG5vdCA8Pi4KKwkqIG5sbWhlYWRlci55OiBJbmNsdWRlIGJmZC5oIHdpdGggIiIsIG5vdCA8Pi4KKworV2VkIEFwciAxMyAxMDo1Mjo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYzogRG8gYW4gaWZkZWYgb24gX19HTzMyX18sIG5vdCB1bml4LgorCitXZWQgQXByICA2IDIxOjU0OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUFkZGVkIC1EICgtLWR5bmFtaWMpIG9wdGlvbiB0byBubSBhbmQgLVQgKC0tZHluYW1pYy1zeW1zKSBhbmQgLVIKKwkoLS1keW5hbWljLXJlbG9jKSBhcmd1bWVudHMgdG8gb2JqZHVtcC4KKwkqIG5tLmMgKGR5bmFtaWMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShsb25nX29wdGlvbnMpOiBBZGRlZCAiZHluYW1pYyIuCisJKHVzYWdlKTogTWVudGlvbiAtRCBhbmQgLS1keW5hbWljLgorCShtYWluKTogQWRkIEQgdG8gZ2V0b3B0IHN0cmluZy4gIEhhbmRsZSAtRCBieSBzZXR0aW5nIGR5bmFtaWMuCisJKGRpc3BsYXlfcmVsX2ZpbGUpOiBJZiBkeW5hbWljIGlzIG5vbi16ZXJvLCByZWFkIGR5bmFtaWMgc3ltYm9scworCXJhdGhlciB0aGFuIG5vcm1hbCBzeW1ib2xzLgorCSogbm0uMTogVXBkYXRlZCBmb3IgLUQgKC0tZHluYW1pYykgb3B0aW9uLgorCSogb2JqZHVtcC5jIChkdW1wX2R5bmFtaWNfc3ltdGFiKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShkeW5zeW1zLCBkeW5zeW1jb3VudCk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgorCSh1c2FnZSk6IE1lbnRpb24gLVIsIC1ULCAtLWR5bmFtaWMtc3ltcyBhbmQgLS1keW5hbWljLXJlbG9jLgorCShsb25nX29wdGlvbnMpOiBBZGRlZCAiZHluYW1pYy1yZWxvYyIgYW5kICJkeW5hbWljLXN5bXMiLgorCShzbHVycF9zeW10YWIpOiBJZiBubyBzeW1ib2xzLCByZXR1cm4gcmF0aGVyIHRoYW4gZXhpdC4KKwkoc2x1cnBfZHluYW1pY19zeW10YWIpOiBOZXcgZnVuY3Rpb24uCisJKGRpc3BsYXlfYmZkKTogSGFuZGxlIGR1bXBfZHluYW1pY19zeW10YWIgYW5kCisJZHVtcF9keW5hbWljX3JlbG9jX2luZm8uCisJKGR1bXBfc3ltYm9scyk6IFRha2UgbmV3IGR5bmFtaWMgYXJndW1lbnQsIGluZGljYXRpbmcgd2hldGhlciB0bworCWRpc3BsYXkgZHluYW1pYyBzeW1ib2xzLgorCShkdW1wX3JlbG9jcyk6IE1vdmUgbW9zdCBwcmludGluZyBpbnRvIGR1bXBfcmVsb2Nfc2V0LgorCShkdW1wX2R5bmFtaWNfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgorCShkdW1wX3JlbG9jX3NldCk6IE5ldyBmdW5jdGlvbiwgZXh0cmFjdGVkIGZyb20gZHVtcF9yZWxvY3MuCisJKG1haW4pOiBBZGQgUiBhbmQgVCB0byBnZXRvcHQgc3RyaW5nLiAgSGFuZGxlIC1UIGJ5IHNldHRpbmcKKwlkdW1wX2R5bmFtaWNfc3ltdGFiIGFuZCAtUiBieSBzZXR0aW5nIGR1bXBfZHluYW1pY19yZWxvY19pbmZvLgorCSogb2JqZHVtcC4xOiBVcGRhdGVkIGZvciAtUiAoLS1keW5hbWljLXJlbG9jKSBhbmQgLVQKKwkoLS1keW5hbWljLXN5bXMpIG9wdGlvbnMuCisJKiBiaW51dGlscy50ZXhpOiBVcGRhdGVkIGZvciBuZXcgbm0gYW5kIG9iamR1bXAgb3B0aW9ucy4KKworV2VkIE1hciAzMCAxNTo1Mjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlVcGRhdGUgZm9yIHJlY2VudCBCRkQgY2hhbmdlcyB0byBzeW1ib2wgYW5kIHJlbG9jIHJlYWRpbmcuICBSZW5hbWUKKwlhbGwgdXNlcyBvZiBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLgorCUFsc286CisJKiBjb2ZmZ3Jvay5jIChzeW1jb3VudCk6IENoYW5nZSB0byBsb25nLgorCShkb19zZWN0aW9uc19wMSk6IENoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbQorCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQuICBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZywgYW5kIGNoZWNrIGZvcgorCWVycm9yIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KKwkoY29mZl9ncm9rKTogQ2hhbmdlIHN0b3JhZ2UgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvciBmcm9tCisJYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgorCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIHN5bWNvdW50LCBuZXdzeW1hbGxvYywgbmV3c3ltY291bnQsIGFuZAorCWkgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvciBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAorCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgorCShjb3B5X3NlY3Rpb25zKTogQ2hhbmdlIHJlbG9jX3NpemUgYW5kIHJlbG9jX2NvdW50IHRvIGxvbmcuICBDaGVjaworCWZvciBlcnJvciBmcm9tIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCisJYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KKwkobWFuZ2xlX3JlbG9jcywgaTM4Nl9tYW5nbGVfcmVsb2NzLCBhbHBoYV9tYW5nbGVfcmVsb2NzKTogQ2hhbmdlCisJcmVsb2NfY291bnRfcHRyIGFyZ3VtZW50IHRvIGxvbmcgKi4gIE1ha2UgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvCisJdmFyaWFibGVzIGxvYWRlZCBmcm9tICpyZWxvY19jb3VudF9wdHIuCisJKiBubS5jIChkaXNwbGF5X3JlbF9maWxlKTogQ2hhbmdlIHN0b3JhZ2UgYW5kIHN5bWNvdW50IHRvIGxvbmcuCisJQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAorCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgorCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IENoYW5nZSBzeW1jb3VudCwgc3JjX2NvdW50IGFuZAorCWRzdF9jb3VudCB0byBsb25nLgorCShjb3B5X29iamVjdCk6IENoYW5nZSBzeW1jb3VudCB0byBsb25nLiAgUGFzcyBhbm90aGVyIGFyZ3VtZW50IHRvCisJZnByaW50Zi4gIENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKKwliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KKwkoY29weV9zZWN0aW9uKTogQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KKwliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgorCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IENoYW5nZSByZWxjb3VudCBhbmQgaSB0byBsb25nLgorCUNoZWNrIGZvciBlcnJvcnMgZm9ybSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAorCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCisJKiBvYmpkdW1wLmMgKHN0b3JhZ2UpOiBSZW1vdmUgZ2xvYmFsIHZhcmlhYmxlLgorCShzeW1jb3VudCk6IENoYW5nZWQgdG8gbG9uZy4KKwkoc2x1cnBfc3ltdGFiKTogTmV3IGxvY2FsIHZhcmlhYmxlIHN0b3JhZ2UuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KKwliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCisJKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGFuZCBjb3VudCB0byBsb25nLgorCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDaGFuZ2UgbWluLCBtYXgsIHRoaXNwbGFjZSBhbmQgaSB0byBsb25nLgorCShkaXNhc3NlbWJsZV9kYXRhKTogQ2hhbmdlIGkgdG8gbG9uZy4KKwkoZHVtcF9zeW1ib2xzKTogQ2hhbmdlIGNvdW50IHRvIGxvbmcuCisJKGR1bXBfcmVsb2NzKTogQ2hhbmdlIHJlbGNvdW50IHRvIGxvbmcuICBDaGVjayBmb3IgZXJyb3JzIGZyb20KKwliZmRfcmV0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgorCShkaXNwbGF5X2luZm9fdGFibGUpOiBBZGQgY2FzdHMgd2hlbiBwYXNzaW5nIExPTkdFU1RfQVJDSCBmb3IKKwlwcmludGYgJSogYXJndW1lbnQuCisKK1R1ZSBNYXIgMjkgMTQ6NTk6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubS5jIChkaXNwbGF5X2FyY2hpdmUpOiBDbG9zZSBlYWNoIGFyY2hpdmUgZWxlbWVudCBhZnRlciBpdCBoYXMKKwliZWVuIGRpc3BsYXllZC4KKwkqIG9iamR1bXAuYyAoZGlzcGxheV9maWxlKTogTGlrZXdpc2UuCisKK01vbiBNYXIgMjggMTM6MDQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSBlcnJvciBtZXNzYWdlIHRvIHJlZmVyIHRvIGJmZC9jb25maWcuYmZkCisJcmF0aGVyIHRoYW4gYmZkL2NvbmZpZ3VyZS5pbi4KKworU3VuIE1hciAyNyAxNjoyMzozOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTW9yZSBmaXhlcyBmb3Igb2JqZWN0IGZvcm1hdHMgd2hpY2ggYWxsb3cgbXVsdGlwbGUgc2VjdGlvbnMKKwl3aXRoIHRoZSBzYW1lIG5hbWU6CisJKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBNYWtlIGEgbmV3IG91dHB1dCBzZWN0aW9uIGV2ZW4gaWYKKwlvbmUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkoY29weV9zZWN0aW9uKTogVXNlIGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiByYXRoZXIgdGhhbiB0cnlpbmcKKwl0byBsb29rIHRoZSBvdXRwdXQgc2VjdGlvbiB1cCBieSBpdHMgKHBvc3NpYmx5IG5vbi11bmlxdWUpIG5hbWUuCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBMb29rIGZvciBiaW51dGlscy5pbmZvIGluIHRoZQorCWN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluICQoc3JjZGlyKS4gIERvbid0IHVzZSAkPC4KKworTW9uIE1hciAyMSAxMjo1NTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHdpdGgKKwlwcm90b3R5cGUuICBDaGFuZ2UgdmFyZGlmZiBmcm9tIGludCB0byBiZmRfc2lnbmVkX3ZtYS4gIENvcnJlY3QKKwliaW5hcnkgc2VhcmNoIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4gIFdoZW4gbG9va2luZyBmb3Igc2FtZQorCXNlY3Rpb24gc3ltYm9sIGluIHJlbG9jYXRhYmxlIGZpbGUsIGhhbmRsZSBmaW5hbCBzeW1ib2wgY29ycmVjdGx5LgorCitTdW4gTWFyIDIwIDExOjI2OjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBNYWtlZmlsZS5pbjogQXZvaWQgYnVnIGluIGhwdXggc2VkLgorCisJKiBvYmpjb3B5LmM6IENoYW5nZXMgdG8ga2VlcCBpdCBmcm9tIHN0cmlwcGluZyBzeW1ib2xzIHVzZWQKKwlpbiBvdXRwdXQgcmVsb2NhdGlvbnMuCisJKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTmV3IGZ1bmN0aW9uLiAgTWFyayBzeW1ib2xzCisJdXNlZCBpbiBvdXRwdXQgcmVsb2NhdGlvbnMgd2l0aCBCU0ZfS0VFUC4KKwkoZmlsdGVyX3N5bWJvbHMpOiBEbyBub3Qgc3RyaXAgc3ltYm9scyBtYXJrZWQgd2l0aCBCU0ZfS0VFUC4KKwkoY29weV9vYmplY3QpOiBSZW9yZGVyIGFjdGlvbnMuICBGaXJzdCBzZXR1cCBzZWN0aW9ucywgdGhlbgorCWJ1aWxkIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLCB0aGVuIGNvcHkgdGhlIHNlY3Rpb24gY29udGVudHMuCisKK0ZyaSBNYXIgMTggMTA6NTM6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBudWxsIGJ5dGUuICBGcm9tCisJUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KKworVGh1IE1hciAxNyAxNjoyMDoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBCdWlsdCBubS5uZXcgYW5kIHN0cmlwLm5ldyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCisJY29sbGVjdCB3aGVuIC4gaXMgaW4gUEFUSC4KKwkoU1RSSVBfUFJPRyk6IENoYW5nZSBmcm9tIHN0cmlwIHRvIHN0cmlwLm5ldy4KKwkoTk1fUFJPRyk6IENoYW5nZSBmcm9tIG5tIHRvIG5tLm5ldy4KKwkoaW5zdGFsbCk6IFJlbW92ZSB0aGUgLm5ldyB3aGVuIGluc3RhbGxpbmcuCisKK1dlZCBNYXIgMTYgMTY6Mjc6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKHBvd2VycGNfYnVpbGRfc3R1YnMpOiBTZXQgQlNGX0RZTkFNSUMgZmxhZyBmb3IgZWFjaAorCXN5bWJvbCBmb3Igd2hpY2ggd2UgYnVpbGQgYSBzdHViLgorCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBPbmx5IHJlc2V0IFRPQyBwb2ludGVyIGZvciBhIGNhbGwgdG8gYQorCXN5bWJvbCB3aXRoIEJTRl9EWU5BTUlDIGZsYWcgc2V0LgorCitUdWUgTWFyIDE1IDIzOjA0OjEzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogVXNlIGJmZF9pc19sb2NhbF9sYWJlbCB0byBkZXRlcm1pbmUKKwlpZiBhIHN5bWJvbCByZXByZXNlbnRzIGEgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIGxhYmVsLgorCShjb3B5X29iamVjdCk6IEdpdmUgdGhlIEJGRCBiYWNrZW5kcyBhIGNoYW5jZSB0byBjb3B5IGFueSBwcml2YXRlCisJYmZkIGRhdGEgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELgorCShzZXR1cF9zZWN0aW9uKTogR2l2ZSB0aGUgQkZEIGJhY2tlbmRzIGEgY2hhbmNlIHRvIGNvcHkgYW55IHByaXZhdGUKKwlzZWN0aW9uIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24uCisKK01vbiBNYXIgMTQgMTE6MTU6NTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIG9iamNvcHkuYyAobWFuZ2xlX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgorCShzZXR1cF9zZWN0aW9uKTogU2V0IG9zZWN0aW9uIGhlcmUgaW5zdGVhZCBvZiBjYWxsaW5nCisJbWFuZ2xlIHNlY3Rpb24gdG8gZG8gaXQuCisKK01vbiBNYXIgMTQgMTI6MTE6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQ2xvc2UgaW5hcmNoIGJlZm9yZSB1bmxpbmtpbmcgaXQuCisKK0ZyaSBNYXIgMTEgMjI6MjA6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKG1haW4pOiBGb3IgUG93ZXJQQywgY2FsbCBwb3dlcnBjX2J1aWxkX3N0dWJzIGFuZAorCXBvd2VycGNfcmVzb2x2ZV9zdHVicy4gIFVzZSBfX0dPVDAsIG5vdCBfX3RvY19zdGFydC4gIEhhbmRsZSBpdCBpZgorCXRoZSBzdGFydCBhbmQgZW5kIHN5bWJvbHMgYXJlIG5vdCBpbiB0aGUgdGV4dCBzZWN0aW9uLgorCShzdHJ1Y3QgcG93ZXJwY19zdHViKTogTmV3IHN0cnVjdCBkZWZpbml0aW9uLgorCShwb3dlcnBjX3N0dWJzLCBwb3dlcnBjX3N0dWJfaW5zbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkocG93ZXJwY19pbml0aWFsX2dvdF9zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkocG93ZXJwY19idWlsZF9zdHVicyk6IE5ldyBmdW5jdGlvbi4KKwkocG93ZXJwY19yZXNvbHZlX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgorCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBDbGVhciBleHRyYW5lb3VzIGRhdGEgaW4gLmdvdCBzZWN0aW9uLgorCVJlYXJyYW5nZSByZWxvYyBoYW5kbGluZyB0byBoYW5kbGUgRUxGIHJlbG9jcyB0aGF0IGFyZSBub3QKKwlwYXJ0aWFsX2lucGxhY2UuICBSZXNvbHZlIFBDIHJlbGF0aXZlIHJlbG9jcy4KKworV2VkIE1hciAgOSAxMzo0ODoxMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBhci5jIChtb3ZlX21lbWJlcnMpOiBGaXggaXQgc28gdGhhdCB0aGUgYWJpIHBvc2l0aW9uYWwgbW9kaWZpZXJzCisJZG9uJ3QgZGVsZXRlIGFsbCBhcmNoaXZlIG1lbWJlcnMgZm9sbG93aW5nIHRoZSBpbnNlcnQgcG9pbnQuCisKK1R1ZSBNYXIgIDggMTM6MTQ6NDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29mZmdyb2suW2NoXTogTmV3IGZpbGVzLCB1bmRlcnN0YW5kIGNvZmYgb2JqZWN0cy4KKwkqIGNvZmZkdW1wLmM6IFVzZXMgY29mZmdyb2sgdG8gZHVtcCBvdXQgdGhlIGRlYnVnIGluZm8gb2YgYSBjb2ZmCisJZmlsZS4KKwkqIHN5c3JvZmYuaW5mbzogRGVzY3JpcHRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlLgorCSogc3lzaW5mby55LCBzeXNsZXgubDogUGFyc2UgaW5mbyBmaWxlLCBnZW5lcmF0ZSBhIHJlYWRlciwgd3JpdGVyLAorCWhlYWRlciBmaWxlcyBhbmQgYSBwcmludGVyLgorCSogc3Jjb252LmM6IFVzZXMgY29mZmdyb2suYyBhbmQgc3lzcm9mZi5pbmZvIHRvIGNvbnZlcnQgYSBjb2ZmCisJZmlsZSB0byBhIFNZU1JPRkYgZmlsZS4KKworU2F0IEZlYiAyNiAxMzozNToyNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGFyLmMgKGRvX3F1aWNrX2FwcGVuZCk6IFBhZCB3aXRoIGEgZ2VudWluZSBjaGFyYWN0ZXIgMTAsCisJcmF0aGVyIHRoYW4gd2hhdGV2ZXIgJ1xuJyBtaWdodCBoYXBwZW4gdG8gYmUuCisKK1R1ZSBGZWIgMjIgMTg6MjU6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKG1haW4pOiBJZ25vcmUgZGVidWdnaW5nIHN5bWJvbHMgd2hlbiBsb29raW5nIGZvcgorCXNwZWNpYWwgc3ltYm9scyBieSBuYW1lLgorCitTdW4gRmViIDIwIDE4OjQ3OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBubG1jb252LmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisKKwlTdXBwb3J0IGZvciBQb3dlclBDIE5ldFdhcmUuCisJKiBubG1jb252LmMgKG1haW4pOiBGb3IgUG93ZXJQQyBOZXRXYXJlLCBhdXRvbWF0aWNhbGx5IGRlZmluZSB0aGUKKwlzcGVjaWFsIHN5bWJvbHMgX190b2Nfc3RhcnQuCisJKHNlbGVjdF9vdXRwdXRfZm9ybWF0KTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMuCisJKG1hbmdsZV9yZWxvY3MpOiBMaWtld2lzZS4KKwkocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgorCitUaHUgRmViIDE3IDA5OjI4OjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYXIuYywgYnVjb21tLmMsIG5sbWNvbnYuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMsCisJc2l6ZS5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQgYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgorCitGcmkgRmViIDExIDE1OjU0OjUxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogb2JqY29weS5jIChzdHJpcF9tYWluLCBjb3B5X21haW4pOiBBZGQgbWlzc2luZyAnYnJlYWsnIGluIHN3aXRjaC4KKworTW9uIEZlYiAgNyAxOTo0NTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSBiZmRfYXJjaF9wb3dlcnBjLgorCitTdW4gRmViICA2IDIyOjA4OjIwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3RyaW5ncy5jIG9iamR1bXAuYyBubG1jb252LmMgb2JqY29weS5jIG5tLmMgYXIuYyBzaXplLmMgKG1haW4pOgorCUNhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLgorCitGcmkgRmViICA0IDEwOjQ2OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBNYWtlIE1FTUhVTksgYSBjaGFyICosIG5vdCBQVFIsIHNvIHdlCisJY2FuIGRvIGFyaXRobWV0aWMgb24gaXQuCisKK1RodSBGZWIgIDMgMTQ6MDY6NDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicywgcmVhZF9zZWN0aW9uX3N0YWJzLAorCXByaW50X3NlY3Rpb25fc3RhYnMpOiBGdW5jdGlvbnMgYnJva2VuIG91dCBvZiBkdW1wX3N0YWJzXzEuCisJRnJlZSB0aGUgc3RhYnMgYW5kIHN0cmluZ3Mgd2hlbiBkb25lIHdpdGggdGhlbS4KKworV2VkIEZlYiAgMiAxMzo0MjoyMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAobWFpbik6IFVzZSBiZmRfZ2V0X2ZsYXZvdXIgaW5zdGVhZCBvZiBzdHJ1Y3QgbWVtYmVyLgorCSogYXIuYyAocHJpbnRfY29udGVudHMsIGV4dHJhY3RfZmlsZSksIHNpemUuYworCShwcmludF9iZXJrZWxleV9mb3JtYXQsIHByaW50X3N5c3ZfZm9ybWF0KTogVXNlIGJmZF9nZXRfZmlsZW5hbWUgYW5kCisJYmZkX215X2FyY2hpdmUgaW5zdGVhZCBvZiBkZXJlZmVyZW5jaW5nIHRoZSBzdHJ1Y3RzIGRpcmVjdGx5LgorCisJKiBhci5jOiBVc2UgYmZkX2ZhdGFsIGFuZCBiZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBiZmRfcGVycm9yIGFuZCBleGl0LgorCUluZGVudC4gIFJlbW92ZSBERUZVTnMuCisKKwkqIG5sbWNvbnYuYyAobWFpbiksIG9iamNvcHkuYyAoY29weV9maWxlKTogUHJpbnQgbWF0Y2hpbmcgZm9ybWF0cworCWlmIGFtYmlndW91cyBtYXRjaC4KKwkqIG5tLmMgKGRpc3BsYXlfZmlsZSwgZGlzcGxheV9hcmNoaXZlKSwgc2l6ZS5jIChkaXNwbGF5X2JmZCk6CisJRWxpbWluYXRlIGdvdG9zLgorCVByaW50IG1hdGNoaW5nIGZvcm1hdHMgaWYgdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoLiAgVXNlCisJYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgaGFyZGNvZGVkIGVycm9yIG1lc3NhZ2UgaWYgbm90aGluZyBtYXRjaGVzLgorCisJKiBhcnN1cC5jLCBhci5jLCBvYmpkdW1wLmM6IFVzZSBiZmRfZ2V0X2ZpbGVuYW1lIGluc3RlYWQgb2YKKwlhYmZkLT5maWxlbmFtZS4KKworCSogbm0uYyAoZGlzcGxheV9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLCBmcm9tIGNvZGUgaW4gZGlzcGxheV9maWxlLgorCShkaXNwbGF5X3JlbF9maWxlKTogUmVuYW1lZCBmcm9tIGRvX29uZV9yZWxfZmlsZS4KKworCSogc2l6ZS5jOiBJbmRlbnQuCisJKGRpc3BsYXlfYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgaW4gZGlzcGxheV9maWxlLgorCShkaXNwbGF5X2ZpbGUpOiBDaGVjayBiZmRfY2xvc2UgZXJyb3IgcmV0dXJuLgorCisJKiBzdHJpbmdzLmMgKHN0cmluZ3Nfb2JqZWN0X2ZpbGUpOiBDaGVjayBiZmRfY2hlY2tfZm9ybWF0CisJZXJyb3IgcmV0dXJuLgorCisJKiBzdHJpbmdzLmMsIG9iamR1bXAuYywgc2l6ZS5jOiBVc2UgYmZkX25vbmZhdGFsIGluc3RlYWQgb2YgYmZkX3BlcnJvci4KKworCSogYnVjb21tLmM6IERlbGV0ZSByZWZlcmVuY2VzIHRvIGV4aXRfaGFuZGxlci4gIEl0IHdhc24ndCBzZXQKKwlhbnl3aGVyZSwgYW5kIG5vdyB0aGF0IHdlJ3JlIHVzaW5nIHRoZSBsaWJpYmVydHkgeG1hbGxvYywgaXQKKwl3b3VsZG4ndCBhbHdheXMgZ2V0IGNhbGxlZCBiZWZvcmUgZXhpdGluZy4KKwkobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogRnVuY3Rpb24gbW92ZWQgZnJvbSBvYmpkdW1wLmMuCisJKiBidWNvbW0uaDogRGVjbGFyZSBpdC4KKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTW92ZSBzb21lIHZhcmlhYmxlIGRlY2xzIGNsb3NlciB0bworCXRoZWlyIHVzZS4gIEFkZCBzb21lIGNvbW1lbnRzLiAgUmVwbGFjZSBhIG5lc3RlZCBibG9jayB3aXRoIGEKKwlyZXR1cm4uCisKK01vbiBKYW4gMzEgMTg6NTA6NDEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X2xpc3QsIGRpc3BsYXlfaW5mb190YWJsZSk6IENoZWNrIHRoYXQKKwl0aGUgYmZkIG9mIHRoZSBkdW1teSBvdXRwdXQgZmlsZSBpcyBub3QgbnVsbC4KKworV2VkIEphbiAyNiAxMzoxMzoxOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTmV3IGZ1bmN0aW9uLgorCShjb3B5X3NlY3Rpb24pOiBDYWxsIGl0LgorCShjb3B5X29wdGlvbnMsIGNvcHlfdXNhZ2UsIGNvcHlfbWFpbik6IEFkZCAtLWJ5dGUgb3B0aW9uIHRvCisJYWN0aXZhdGUgaXQuICBBcHByb3ByaWF0ZSB0aGUgLWIgb3B0aW9uICh3aGljaCB3YXMgYW4gdW5kb2N1bWVudGVkCisJc3lub255bSBmb3IgLUYpIGZvciBpdCwgYWxzby4gIEFkZCAtLWludGVybGVhdmUsIC1pIG9wdGlvbiBmb3IKKwlhZGRpdGlvbmFsIGNvbnRyb2wuCisJKHNldHVwX3NlY3Rpb24sIGNvcHlfc2VjdGlvbiwgbWFuZ2xlX3NlY3Rpb24pOiBSZW5hbWVkIHdpdGggbm8gYHMnCisJb24gdGhlIGVuZC4KKwkqIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgdGhlIG5ldyBvcHRpb25zLgorCisJKiBvYmpkdW1wLmMgKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcywgZGlzcGxheV90YXJnZXRfbGlzdCk6CisJTmV3IGZ1bmN0aW9ucyBicm9rZW4gb3V0IG9mIGRpc3BsYXlfaW5mby4KKwlFbGltaW5hdGUgc29tZSBtYWdpYyBjb25zdGFudHMuICBVc2UgbW9yZSBtZWFuaW5nZnVsIHZhcmlhYmxlIG5hbWVzLgorCShkdW1wX2JmZF9oZWFkZXIpOiBOZXcgZnVuY3Rpb24gYnJva2VuIG91dCBvZiBkaXNwbGF5X2JmZC4KKwkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIGR1bXBfaGVhZGVycy4KKwkocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6IERvbid0IHNoYWRvdyBnbG9iYWwgdmFyaWFibGUgbmFtZSB3aXRoCisJcGFyYW1ldGVyLgorCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBGaXggYmFja3dhcmQgdGVzdC4KKworVHVlIEphbiAyNSAxOTo0MDo1NCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENoYW5nZSBkZWNsIG9mIGB3aGVuJyB0byB0aW1lX3QuCisJKiBvYmpkdW1wLmg6IFJlbW92ZWQuCisKK01vbiBKYW4gMjQgMTM6Mjk6MDIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc3BsYXlfZmlsZSk6IFJlbW92ZSBjYWxsIHRvIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cy4KKwlJdCB3b3VsZCBuZXZlciBiZSBjYWxsZWQuCisJKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IFRha2UgYW4gYXJnIGdpdmluZyB0aGUgbGlzdCBvZiBtYXRjaGluZworCWZvcm1hdHMuCisJKGRpc3BsYXlfYmZkKTogUGFzcyB0aGUgYXJnLCBhbmQgZ2V0IGl0IGZpbGxlZCBpbiBieSBjYWxsaW5nCisJYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIGluc3RlYWQgb2YgYmZkX2NoZWNrX2Zvcm1hdC4KKwkoZGlzcGxheV9pbmZvLCBkaXNwbGF5X2luZm9fdGFibGUpOiB0YXJnZXRfdmVjdG9yIHdhcyByZW5hbWVkIHRvCisJYmZkX3RhcmdldF92ZWN0b3IuCisKKwkqIGJpbnV0aWxzLnRleGkgKG9iamR1bXApOiBOb3RlIHNvbWUgbGltaXRhdGlvbnMgb2YgLWggc2VjdGlvbgorCWFkZHJlc3MgcHJpbnRpbmcuCisKK1NhdCBKYW4gMjIgMTY6MjA6NDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTUFMTE9DKTogU2V0IHRvIGVtcHRpbmVzcyBieSBkZWZhdWx0LgorCShBTExfQ0ZMQUdTKTogQWRkIGFuZCB1c2UuCisJKGFycGFyc2UuaCk6IE1ha2UgaXQgZGVwZW5kIG9uIGFycGFyc2UueS4KKwkqIGFyLmMgKGxpYmJmZC5oKTogRG9uJ3QgcmVxdWlyZSB0byBiZSBpbiAuLi9iZmQuCisJKiBvYmpkdW1wLmMgKGNvbXApOiBSZW5hbWUgdG8gY29tcGFyZV9zeW1ib2xzLgorCitGcmkgSmFuIDIxIDIwOjIyOjMwIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBJZiB0aGUgZmlsZSBmb3JtYXQgaXMgYW1iaWd1b3VzLAorCXByaW50IHRoZSBtYXRjaGluZyBuYW1lcyBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIG9uZS4KKwkoZGlzcGxheV9iZmQpOiBDYWxsIGl0LgorCShkaXNwbGF5X2ZpbGUpOiBDYWxsIGl0LgorCitGcmkgSmFuIDIxIDE5OjE3OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU3VwcG9ydCBiZmRfYXJjaF9yczYwMDAuCisKK01vbiBKYW4gMTcgMTM6NTc6MjUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKHN0YWJfbmFtZSk6IEFsbG9jYXRlIGR5bmFtaWNhbGx5LgorCShzdGFiX3ByaW50KTogVXNlIHBvaW50ZXJzIHRvIHN0cmluZ3MgaW5zdGVhZCBvZiBjaGFyIGFycmF5cy4KKwkoZHVtcF9zdGFicyk6IENoYW5nZSBhbGxvYyBhbmQgaW5pdCBvZiBhcnJheXMgYXBwcm9wcmlhdGVseS4KKwkoZHVtcF9zdGFic18xKTogQWx3YXlzIGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHN0YWJfbmFtZSBvcgorCXRoZSBzdGFiJ3MgdHlwZSBudW1iZXIsIGlmIHVubmFtZWQuCisKK0ZyaSBKYW4gMTQgMTQ6NDI6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmMgKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IERvbid0IGNsb2JiZXIgdGhlIGlucHV0IGZpbGUKKwlpZiBjb3B5X2ZpbGUgZmFpbHMuCisKKwkqIG5sbWNvbnYuYyAobWFpbik6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdCB0byB1c2UgYSBzaGFyZWQgbGlicmFyeQorCXdpdGggdW5pbml0aWFsaXplZCBkYXRhLgorCisJKiBubG1jb252LmMgKHNldHVwX3NlY3Rpb25zKTogTWFrZSBzdXJlIHRoYXQgd2UgYWxpZ24gdGhlCisJb3V0cHV0X29mZnNldCBvZiBlYWNoIGlucHV0IHNlY3Rpb24gYXBwcm9wcmlhdGVseS4KKworVGh1IEphbiAxMyAxNzozMjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY3MpOiBEb24ndCBjcmFzaCBpZiBzZWN0aW9uIG5hbWUgaXMgTlVMTC4KKworVHVlIEphbiAxMSAxOTo0NjozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGZpbGVtb2RlLmMgKGZpbGVtb2Rlc3RyaW5nKTogQ29tbWVudGVkIG91dDsgbm90IHVzZWQuCisJKG1vZGVfc3RyaW5nKTogVXNlIFBPU0lYIGRlZmluaXRpb25zLgorCShmdHlwZWxldCk6IExpa2V3aXNlLgorCShyd3gpOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KKwkqIGJ1Y29tbS5jOiBJbmNsdWRlIGJ1Y29tbS5oLgorCShiZmRfbm9uZmF0YWwsIGJmZF9mYXRhbCk6IEFyZ3VtZW50IGlzIGNvbnN0LgorCShmYXRhbCk6IE1ha2UgX19TVERDX18gdmVyc2lvbi4KKwkqIGJ1Y29tbS5oIChtb2RlX3N0cmluZyk6IERlY2xhcmUuCisJKiBNYWtlZmlsZS5pbiAoYnVjb21tLm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaAorCitTdW4gSmFuICA5IDEyOjAzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKKworCSogYnVjb21tLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVsZXRlZC4KKwkqIGJ1Y29tbS5oICh4bWFsbG9jLCB4cmVhbGxvYyk6IEZpeCBwcm90b3R5cGVzLCB0byBjb3JyZXNwb25kIHRvCisJbGliaWJlcnR5IHZlcnNpb24gb2YgZnVuY3Rpb25zLgorCitUaHUgSmFuICA2IDA2OjE4OjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMudGV4aTogQWRkIGEgY2hhcHRlciBzdW1tYXJpemluZyB0aGUgd2F5cyB0byBzZWxlY3QKKwlhc3BlY3RzIG9mIHRoZSB0YXJnZXQgZm9yIGVhY2ggcHJvZ3JhbS4KKworCSogb2JqZHVtcC5jIChsb25nX29wdGlvbnMsIHVzYWdlKTogQWRkIGxvbmcgZXF1aXZhbGVudHMgZm9yIGFsbAorCXJlbWFpbmluZyBzaG9ydCBvcHRpb25zIHRoYXQgbGFja2VkIHRoZW0uCisJKiBiaW51dGlscy50ZXhpIG9iamR1bXAuMTogRG9jdW1lbnQgdGhlbS4KKworCSogc2l6ZS5jICh1c2FnZSk6IFR3ZWFrIHVzYWdlIG1lc3NhZ2UuCisJKiBzaXplLjE6IEFkZCBtaXNzaW5nIGA9JyBpbiBleGFtcGxlcy4KKworCSogYmludXRpbHMudGV4aSBzdHJpcC4xIG9iamNvcHkuMSBubG1jb252LjEgb2JqY29weS5jIG5sbWNvbnYuYzoKKwlVc2UgIi0tdGFyZ2V0PWJmZG5hbWUiIGFzIHRoZSBvcHRpb24gdG8gc2VsZWN0IHRoZSBCRkQgdGFyZ2V0LAorCWxpa2Ugbm0gYW5kIHNpemUgYWxyZWFkeSBkby4KKwlSZXNlcnZlICItLWZvcm1hdD1mb3JtYXQiIGZvciB0ZXh0dWFsIG91dHB1dCBzZWxlY3Rpb24gb3B0aW9ucywgYnV0CisJZm9yIG5vdyBrZWVwIG9sZCBvcHRpb24gbmFtZXMgYXMgb2Jzb2xldGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKKwkqIHN0cmluZ3MuYyAobWFpbiwgc3RyaW5nc19vYmplY3RfZmlsZSwgdXNhZ2UpOiBBZGQgLS10YXJnZXQgb3B0aW9uLgorCSogYmludXRpbHMudGV4aSBzdHJpbmdzLjE6IERvY3VtZW50IGl0LgorCitTYXQgSmFuICAxIDEzOjU4OjI0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYXIuYyAobWFpbik6IEFkZCBcbiBpbiBlcnJvciBtZXNzYWdlLgorCitUaHUgRGVjIDIzIDEyOjIzOjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCWdjYyAtV2FsbCBsaW50OgorCSogYXIuYyAobWFpbik6IFB1dCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KKwkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgUmV0dXJuIDAuCisJKGNvcHlfbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgUmV0dXJuIDAuCisJKiBvYmpkdW1wLmMgKGRpc3BsYXlfYmZkKTogRGVjbGFyZSByZXR1cm4gdmFsdWUgYXMgdm9pZC4KKwkoc3RhYl9wcmludCk6IFVzZSAiIiBpbnN0ZWFkIG9mIDAgdG8gaW5pdGlhbGl6ZSBhcnJheS4KKwkoZHVtcF9zdGFic18xKTogUHJpbnQgdm1hIHVzaW5nIHByaW50Zl92bWEuCisJKGRpc3BsYXlfaW5mbyk6IFB1dCBwYXJlbnMgYXJvdW5kIGFzc2lnbm1lbnQgdXNlZCBhcyB0cnV0aCB2YWx1ZS4KKwkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IENhc3QgcHJpbnRmIGFyZ3VtZW50cy4KKworCSogb2JqY29weS5jIChjb3B5X21haW4pOiBVc2UgY29weV9vcHRpb25zLCBub3Qgc3RyaXBfb3B0aW9ucy4KKworCSogbmxtaGVhZGVyLnkgKGNvbW1hbmQpOiBXYXJuIGFib3V0IGlsbGVnYWwgZGF0ZSB2YWx1ZXMuCisKK1dlZCBEZWMgMTUgMTE6MTg6MDMgMTk5MyAgRGF2aWQgSi4gTWFjS2VuemllICAoZGptQGZyb3N0eS5lbmcudW1kLmVkdSkKKworCSogYnVjb21tLmMgYnVjb21tLmg6IFJ1biB0aHJvdWdoIGluZGVudC4gIERlLWFuc2lkZWNsLWlmeS4KKwkoYmZkX25vbmZhdGFsKTogTmV3IGZ1bmN0aW9uLgorCShiZmRfZmF0YWwpOiBDYWxsIGl0LgorCisJKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IERvIGEgY29weSBpZiB0aGUgZGVzdCBmaWxlIGhhcworCW11bHRpcGxlIGhhcmQgbGlua3MuICBSZW1vdmUgc291cmNlIGZpbGUgb24gc3VjY2Vzc2Z1bCBjb3B5LgorCVRyeSB0byBwcmVzZXJ2ZSBtb2RlIGFuZCBvd25lciBvbiBzdWNjZXNzZnVsIHJlbmFtZS4KKworCSogb2JqY29weS5jOiBSdW4gdGhyb3VnaCBpbmRlbnQuICBDbGVhbiB1cCBhIGJpdC4KKwlNYWtlIGdsb2JhbCB2YXJpYWJsZXMgc3RhdGljLgorCU1ha2Uge2lucHV0LG91dHB1dH1fe3RhcmdldCxmaWxlbmFtZX0sIHNob3dfdmVyc2lvbiBsb2NhbAorCXRvIHZhcmlvdXMgZnVuY3Rpb25zLgorCU5ldyBnbG9iYWwgdmFyaWFibGUgYHN0YXR1cycgZm9yIGV4aXQgc3RhdHVzLgorCShzdHJpcF9tYWluLCBjb3B5X21haW4pOiBOZXcgZnVuY3Rpb25zIHdpdGggY29kZSBmcm9tIG1haW4uCisJKG5vbmZhdGFsKTogTmV3IG1hY3JvLiAgVXNlIGl0IGdsb2JhbGx5IGluc3RlYWQgb2YgYmZkX3BlcnJvciBhbmQKKwliZmRfZmF0YWwuCisKKwkoY29weV9vYmplY3QpOiBDYWxsIG1hbmdsZV9zZWN0aW9ucyB3aXRoIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KKwkobWFuZ2xlX3NlY3Rpb25zKTogQWRqdXN0IGZvciBuZXcgY2FsbGluZyBjb252ZW50aW9uLgorCitGcmkgRGVjIDEwIDExOjI4OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbmxtaGVhZGVyLnkgKGNvbW1hbmQpOiBBY2NlcHQgTUFQIGFuZCBGVUxMTUFQIHdpdGhvdXQgYXJndW1lbnRzLgorCSogbmxtY29udi5jIChtYWluKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgZm9yIE1BUCBhbmQgRlVMTE1BUC4KKworVGh1IERlYyAgOSAxNzo0NzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAobWFpbik6IFdhcm4gYWJvdXQgaW1wb3J0ZWQgc3ltYm9scyB0aGF0IGFyZSBub3QgaW4KKwl0aGUgSU1QT1JUIGxpc3QgZXZlbiBpZiB0aGUgSU1QT1JUIGtleXdvcmQgaXMgbm90IHVzZWQuCisKKwkqIG5sbWNvbnYuYyAoZGVidWcsIHVubGlua19vbl9leGl0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVidWciIGFuZCAibGlua2VyIi4KKwkobWFpbik6IEhhbmRsZSAtZCBhbmQgLWwgYXJndW1lbnRzLiAgTWFrZSBjb21tYW5kIGxpbmUgaW5wdXQgYW5kCisJb3V0cHV0IGZpbGVzIG9wdGlvbmFsLiAgUGFyc2UgdGhlIGNvbW1hbmQgZmlsZSBiZWZvcmUgb3BlbmluZyB0aGUKKwlCRkQncywgd2hpY2ggcmVxdWlyZXMgc3RvcmluZyBtb3JlIGluZm9ybWF0aW9uIGluIGxvY2FsIHZhcmlhYmxlcy4KKwlJZiBJTlBVVCBuYW1lcyBtdWx0aXBsZSBmaWxlcywgbGluayB0aGVtIHRvZ2V0aGVyLiAgVXNlIE9VVFBVVCBmb3IKKwl0aGUgb3V0cHV0IGZpbGUgbmFtZSBpZiBub3QgbmFtZWQgb24gY29tbWFuZCBsaW5lLgorCShzaG93X3VzYWdlKTogQ2hhbmdlZCBmb3IgbmV3IG9wdGlvbnMuCisJKGxpbmtfaW5wdXRzKTogTmV3IGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgaW52b2tlIGxpbmtlciB0bworCWhhbmRsZSBtdWx0aXBsZSBJTlBVVCBmaWxlcy4KKwkoY2hvb3NlX3RlbXBfYmFzZV90cnksIGNob29zZV90ZW1wX2Jhc2UsIHBleGVjdXRlKTogTmV3IGZ1bmN0aW9ucywKKwltb3N0bHkgY29waWVkIGZyb20gZ2NjL2djYy5jLgorCSogbmxtY29udi5oIChpbnB1dF9maWxlcywgb3V0cHV0X2ZpbGUpOiBEZWNsYXJlLgorCSogbmxtaGVhZGVyLnkgKGlucHV0X2ZpbGVzLCBvdXRwdXRfZmlsZSk6IERlZmluZS4KKwkoY29tbWFuZCk6IFN1cHBvcnQgSU5QVVQgd2l0aCBhIHN0cmluZ19saXN0IGFyZ3VtZW50LiAgU3VwcG9ydAorCU9VVFBVVC4KKwkoc3RyaW5nX2xpc3QpOiBSZW5hbWVkIGZyb20gbW9kdWxlX2xpc3QuCisJKiBNYWtlZmlsZS5pbiAobmxtY29udi5vKTogRGVmaW5lIExEX05BTUUgYmFzZWQgb24KKwlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgorCitXZWQgRGVjICA4IDEwOjA5OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbmxtaGVhZGVyLnkgKG5sbWhlYWRlcl9pZGVudGlmeSk6IE5ldyBmdW5jdGlvbi4gIFVzZSBpdCB0byBwcmludAorCXRoZSBwcm9ncmFtIG5hbWUganVzdCBvbmNlLCBpbnN0ZWFkIG9mIHdpdGggZXZlcnkgZXJyb3IgbWVzc2FnZS4KKworTW9uIERlYyAgNiAxNjoxMTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAobG9uZ19vcHRpb25zKTogQ2hhbmdlZCAtLWhlYWRlci1pbmZvIHRvIC0taGVhZGVyLWZpbGUKKwl0byBtYXRjaCBkb2N1bWVudGF0aW9uIGFuZCB1c2FnZSBtZXNzYWdlLgorCitTdW4gRGVjICA1IDAxOjMxOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBvYmpkdW1wLmMgKGR1bXBfcmVsb2NzKTogQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgc3ltX3B0cl9wdHIKKwlpbiBhIHJlbG9jYXRpb24uCisKK1RodSBEZWMgIDIgMTY6MDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgdmFyaW91cyB0eXBlcyBmcm9tIGJmZF9zaXplX3R5cGUgdG8KKwlzaXplX3QsIHNpbmNlIHRoZXkgaGF2ZSB0byBiZSBhcmd1bWVudHMgdG8gZnJlYWQgYW5kIGZ3cml0ZS4KKwlDaGFuZ2Ugc2V0IGZyb20gY2hhciAqIHRvIHVuc2lnbmVkIGNoYXIgKi4KKwkoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBNYWtlIG1hY2ggYXJndW1lbnQgdW5zaWduZWQuICBIYW5kbGUKKwliZmRfYXJjaF9hbHBoYS4KKwkoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBjb3B5IHRoZSAucmVnaW5mbyBzZWN0aW9uIG9mIGFuIEVDT0ZGCisJZmlsZS4gIENhbGwgYmZkX3NldF9yZWxvYyB0byBpbml0aWFsaXplIHRoZSByZWxvY2F0aW9uIGZpZWxkcy4KKwkoY29weV9zZWN0aW9ucyk6IERvbid0IGNvcHkgdGhlIC5yZWdpbmZvIHNlY3Rpb24gb2YgYW4gRUNPRkYgZmlsZS4KKwlDb21iaW5lIGFsbCByZWxvY3MgZm9yIGEgc2VjdGlvbi4KKwkobWFuZ2xlX3JlbG9jcyk6IENoYW5nZSB0eXBlIG9mIHJlbG9jcyB0byBwZXJtaXQgc3BlY2lmaWMKKwlmdW5jdGlvbnMgdG8gY2hhbmdlIGl0LiAgQ2FsbCBhbHBoYV9tYW5nbGVfcmVsb2NzIGZvciBhbHBoYSwKKwlkZWZhdWx0X21hbmdsZV9yZWxvY3MgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMuCisJKGRlZmF1bHRfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4gIEFkanVzdCB0aGUgYWRkcmVzcyBvZiBhbGwKKwlyZWxvY3MgYnkgdGhlIG91dHB1dF9vZmZzZXQuCisJKGkzODZfbWFuZ2xlX3JlbG9jcyk6IENoYW5nZSB0eXBlIG9mIHJlbG9jcyBhcmd1bWVudC4gIENhc3QgbGVuZ3RoCisJYXJndW1lbnQgdG8gbWVtbW92ZSB0byBzaXplX3QuCisJKGFscGhhX21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBVc2UgbmxtMzItc3BhcmMgZm9yCisJYmZkX2FyY2hfc3BhcmMuCisKK1dlZCBOb3YgMTcgMTQ6NDE6MzUgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBubG1jb252LjE6ICAgYWRkZWQgbWFuIHBhZ2UKKwkqIG9iamNvcHkuMTogICBmaXhlZCBmb3JtYXQgZXJyb3JzCisKK1dlZCBOb3YgMTcgMTI6MDM6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogVXNlIENGTEFHUyBhcyB3ZWxsIGFzIExERkxBR1Mgd2hlbiBsaW5raW5nLgorCitXZWQgTm92IDE3IDA0OjUwOjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3RyaW5ncy4xOiBGaXggdHlwby4KKworTW9uIE5vdiAxNSAxMjowMzoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBCdWlsZCAiaW5mbyIuCisJKFZFUlNJT04pOiBVcGRhdGVkIHRvIGN5Z251cy0yLjMuMTsgMi4zIGhhcyBnb25lIG91dC4KKworU3VuIE5vdiAxNCAwMDoyNzoyNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogb2JqZHVtcC5jIChkdW1wX3N0YWJzKTogSGFuZGxlIHN0YWJzLWluLXNvbSBhcyBpbXBsZW1lbnRlZAorCWJ5IHRoZSBuZXcgQkZEIFNPTSBhc3NlbWJsZXIuCisKK1NhdCBOb3YgMTMgMDc6MTQ6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBhci4xIGMrK2ZpbHQuMSBubS4xIG9iamNvcHkuMSBvYmpkdW1wLjEgcmFubGliLjEgc2l6ZS4xCisJc3RyaW5ncy4xIHN0cmlwLjE6IFJlcGxhY2UgXChlbSBpbiBOQU1FIHNlY3Rpb24gd2l0aCBcLSBzbworCW1ha2V3aGF0aXMgY2FuIGdyb2sgaXQuCisKK1R1ZSBOb3YgIDkgMTU6MjI6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKGkzODZfbWFuZ2xlX3JlbG9jcyk6IEFkanVzdCByZWxvYyBhZGRyZXNzIGJ5CisJc2VjdGlvbiBvdXRwdXRfb2Zmc2V0LgorCitGcmkgTm92ICA1IDEyOjExOjUyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiaW51dGlscy50ZXhpOiAgYWRkZWQgbmxtY29udiBjaGFwdGVyCisKK1dlZCBOb3YgIDMgMTY6MTA6NTAgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUworCitXZWQgTm92ICAzIDE1OjA5OjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgZ2V0IHJpZCBvZiBkdmkgb3IgaW5mbyBmaWxlcy4KKworVHVlIE5vdiAgMiAxMzoyOTo1OSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIG9iamNvcHkuYyAoU19JU0xOSyk6IERlZmluZSBhcyAwIGlmIHRoZXJlJ3Mgbm8gU19JRkxOSy4KKworRnJpIE9jdCAyOSAxNjowMjozNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLnRleGk6IE1vdmUgb2JqY29weSBkb2NzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLgorCisJKiBvYmpkdW1wLmM6IFVzZSB4bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jLgorCitGcmkgT2N0IDI5IDExOjExOjE0IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChpbmZvKTogUmVuYW1lIHRvIGZvcm1hdHNfaW5mby4KKwkoZHVtcF9zdGFic18xKTogQmV0dGVyIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nLgorCitUaHUgT2N0IDI4IDE5OjQzOjE2IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogYXIuYyAobWFpbik6IEFsd2F5cyBjcmVhdGUgdGhlIGFyY2hpdmUgd2hlbiBxdWljayBhcHBlbmRpbmcsCisJZXZlbiBpZiBubyBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gZ2l2ZW4uCisKK1dlZCBPY3QgMjcgMTI6MDM6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKG1haW4pOiBTZXQgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgYW5kCisJc2hhcmVkRGVidWdSZWNvcmRDb3VudCBmaWVsZHMgaW4gZXh0ZW5kZWQgaGVhZGVyLgorCisJKiBubG1jb252LmMgKG1haW4pOiBGb3JjZSBtb2R1bGVOYW1lIGZpZWxkIHRvIHVwcGVyIGNhc2UuCisKK01vbiBPY3QgMjUgMTY6NDU6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmMgKG1haW4pOiBHaXZlIGEgdXNhZ2UgbWVzc2FnZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkKKwlhcmd1bWVudHMuCisKK01vbiBPY3QgMjUgMTA6Mzc6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBSZXdyaXRlIHRvIHRha2UgYWR2YW50YWdlIG9mIFZQQVRILAorCXNvIEZTRiBkaXN0cmlidXRpb25zICh3aXRoIGluZm8gZmlsZXMgaW4gJChzcmNkaXIpKSBpbnN0YWxsCisJcHJvcGVybHkuCisJKERJU1RTVFVGRik6IEJ1aWxkIG5sbWhlYWRlci5jIHRvby4KKworRnJpIE9jdCAyMiAxMTo0MzoyMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogYXIuYyAocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVmaW5lIGhlcmUuCisJKiBvYmpkdW1wLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KKwkoeG1hbGxvYyk6IERvbid0IGRlY2xhcmUgaGVyZS4KKwkocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVmaW5lIGhlcmUuCisJKHByb2dyYW1fdmVyc2lvbik6IEZpeGVkIHR5cGUgaW4gZGVjbGFyYXRpb24uCisJKiBzaXplLmM6IEluY2x1ZGUgImJ1Y29tbS5oIi4KKwkocHJvZ3JhbV9uYW1lKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgorCitGcmkgT2N0IDIyIDE0OjEwOjQxIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZnByaW50Zik6IGhpZGUgZGVjbGFyYXRpb24gaW4gRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVECisKK0ZyaSBPY3QgIDEgMTI6NDM6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBubG1jb252LmMgKGkzODZfbWFuZ2xlX3JlbG9jcyk6IFJlc29sdmUgYW5kIHJlbW92ZSBQQyByZWxhdGl2ZQorCXJlbG9jcyBhZ2FpbnN0IGRlZmluZWQgc3ltYm9scyBpbiB0aGUgc2FtZSBzZWN0aW9uLgorCitUaHUgU2VwIDMwIDE2OjQ2OjI2IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChiaW51dGlscy5kdmkpOiB1c2UgVEVYSURJUiB0byBmaW5kIHRleGluZm8udGV4CisKK1NhdCBTZXAgMjUgMTg6MDk6MjkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmMgKHNpbXBsZV9jb3B5LCBzbWFydF9yZW5hbWUpOiBOZXcgZnVuY3Rpb25zLgorCShtYWluKTogVXNlIHRoZW0uCisKK0ZyaSBTZXAgMjQgMTU6Mzg6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlY3Vyc2UgaW50byB0ZXN0c3VpdGUuCisKK1RodSBTZXAgMjMgMDE6MDU6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb25zLCBjb3B5X3NlY3Rpb25zKTogSWYgc3RyaXBwaW5nLCBkb24ndAorCWNvcHkgU0VDX0RFQlVHR0lORyBzZWN0aW9ucy4KKwkqIG9iamR1bXAuYyAoZHVtcF9oZWFkZXJzKTogUHJpbnQgU0VDX0RFQlVHR0lORyBmbGFnLgorCisJKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiAtLXN0YWJzLgorCisJKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogQ29weSBhbGwgYXBwbGljYWJsZSBmaWxlIGZsYWdzLgorCShjb3B5X2ZpbGUpOiBEb24ndCBjb3B5IEVYRUNfUCBzcGVjaWFsbHkgaGVyZS4KKworTW9uIFNlcCAyMCAxOToyODo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAobWFpbik6IEFkanVzdCBkYXRhIHNlY3Rpb24gc2l6ZSB0byBjb3JyZXNwb25kIHRvIGJzcworCWFsaWdubWVudCBhZGp1c3RtZW50LiAgQ2xlYXIgQlNGX1NFQ1RJT05fU1lNIGlmIHN5bWJvbCBpcyBtb3ZlZCB0bworCWEgZGlmZmVyZW50IHNlY3Rpb24uICBVc2UgdGltZV90IGZvciB0aW1lIHZhcmlhYmxlLgorCShzZXR1cF9zZWN0aW9ucyk6IE9ubHkgcHV0IHNlY3Rpb25zIHdpdGggY29udGVudHMgaW4gb3V0cHV0IE5MTS4KKwkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogTm8gc3ltYm9scyBhcmUgY29tbW9uIGF0IHRoaXMgcG9pbnQuICBBZGQKKwljYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KKworRnJpIFNlcCAxMCAxMTowMDo0MCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYzogTWFkZSB0aGUgLS1zdGFicyBvcHRpb24gd29yayBmb3Igc3RhYnMtaW4tY29mZi4KKwkoRUxGX1NUQUJfRElTUExBWSk6IFJlbW92ZWQuCisJKGR1bXBfZWxmX3N0YWJzKTogUmVuYW1lZCB0byBkdW1wX3N0YWJzLCBjaGFuZ2VkIHRvIHJ1biBmb3IKKwlhbnkgb2JqZWN0IGZpbGUgZm9ybWF0LgorCShkdW1wX2VsZl9zdGFic18xKTogUmVuYW1lZCB0byBkdW1wX3N0YWJzXzEsIGFkZGVkIGNhbGxzIHRvCisJZ2VuZXJpYyBCRkQgcm91dGluZXMgZm9yIG5vbi1FTEYgY2FzZSwgY2hhbmdlZCBmb3JtYXQgb2YgbWVzc2FnZQorCWZvciBuby1zZWN0aW9uLWZvdW5kIGNhc2UuCisJKGRpc3BsYXlfYmZkKTogQWx3YXlzIGNhbGwgZHVtcF9zdGFicyBpZiByZXF1ZXN0ZWQuCisJKGR1bXBfZGF0YSk6IENhbGwgYmZkX3NlY3Rpb25fc2l6ZSB0byBnZXQgc2VjdGlvbiBzaXplLgorCitGcmkgU2VwIDEwIDA4OjEyOjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBwdXQgc3RyaW5ncyBpbiB0b29sZGlyL2Jpbi4KKworTW9uIFNlcCAgNiAxNTozOTowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAodG90YWxfYnNzX3NpemUpOiBSZW1vdmVkLgorCShtYWluKTogU2V0IHRoZSBic3Mgdm1hIHRvIGFsd2F5cyBmb2xsb3cgdGhlIGRhdGEgc2VjdGlvbi4gIE1vdmUKKwlzeW1ib2xzIGludG8gbmV3IHNlY3Rpb25zLCBhbmQgYWRqdXN0IHZhbHVlcyBieSBvdXRwdXRfb2Zmc2V0LgorCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGNvcHkgYWxsIHNlY3Rpb25zLCBidXQgaW5zdGVhZCBwb2ludCBhbGwKKwl0ZXh0IHNlY3Rpb25zIHRvIC50ZXh0LCBhbGwgZGF0YSBzZWN0aW9ucyB0byAuZGF0YSwgYW5kIGFsbCBic3MKKwlzZWN0aW9ucyB0byAuYnNzLgorCShjb3B5X3NlY3Rpb25zKTogQWRqdXN0IGFjY29yZGluZ2x5LgorCitUaHUgU2VwICAyIDEyOjM0OjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCU9ubHkgYnVpbGQgbmxtY29udiBpZiBjb25maWd1cmVkIGZvciBhIE5ldFdhcmUgdGFyZ2V0LgorCSogY29uZmlndXJlLmluOiBJZiB3ZSBoYXZlIHNvbWUgKi0qLW5ldHdhcmUqIHRhcmdldCwgb3IgYXJlIHVzaW5nCisJYWxsIHRhcmdldHMsIHNldCBCVUlMRF9OTE1DT05WIHRvICQoTkxNQ09OVl9QUk9HKSBpbiBNYWtlZmlsZS4KKwkqIE1ha2VmaWxlLmluIChQUk9HUyk6IFVzZSAkKEJVSUxEX05MTUNPTlYpIHJhdGhlciB0aGFuCisJJChOTE1DT05WX1BST0cpLgorCitUdWUgQXVnIDMxIDE0OjEzOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChBUkNIX2FsbCk6IERlZmluZSBBUkNIX2hwcGEgdG9vLgorCShkdW1wX2hlYWRlcnMpOiBEb24ndCB0ZXN0IGZvciBTRUNfQkFMSUdOIGlmIGl0J3Mgbm90IGRlZmluZWQgYnkKKwliZmQuaC4KKworVHVlIEF1ZyAzMSAxMzoyOToxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYyAobWFpbik6IEZvcmNlIGNyZWF0aW9uIG9mIC5ic3Mgc2VjdGlvbi4gIFNldCB1cCB0aGUKKwlzZWN0aW9ucyBiZWZvcmUgbG9va2luZyBhdCB0aGUgc3ltYm9scy4gIE1vdmUgYWxsIGNvbW1vbiBzeW1ib2xzCisJaW50byAuYnNzIHNlY3Rpb24uICBBdXRvbWF0aWNhbGx5IGRlZmluZSBfZWRhdGEgYW5kIF9lbmQuICBPbmx5CisJZXhwb3J0IHN5bWJvbHMgaW4gdGhlIGV4cG9ydCBsaXN0LCB3aXRoIG11bHRpcGxlIHByZWZpeGVzIGlmCisJbmVjZXNzYXJ5LiAgV2FybiBpZiBubyB2ZXJzaW9uLiAgQWx3YXlzIGNyZWF0ZSBleHRlbmRlZCBoZWFkZXIuCisJU2V0IGRhdGUgYXV0b21hdGljYWxseSBpZiBub3QgYWxyZWFkeSBzZXQuCisJKHNldHVwX3NlY3Rpb25zKTogQ291bnQgc2l6ZSBvZiBic3Mgc2VjdGlvbnMuCisJKG1hbmdsZV9yZWxvY3MsIGkzODZfbWFuZ2xlX3JlbG9jcyk6IEFjY2VwdCBzZWN0aW9uIGFyZ3VtZW50LCBhbmQKKwl0YWtlIHJlbG9jX2NvdW50IGFzIGEgY2hhbmdlYWJsZSBwb2ludGVyOyBjaGFuZ2VkIGNhbGxlcnMuCisJKGkzODZfbWFuZ2xlX3JlbG9jcyk6IFJlbW92ZSBQQyByZWxhdGl2ZSByZWxvY3Mgd2l0aGluIGEgc2VjdGlvbiwKKwlhcyB0aGV5IHJlcXVpcmUgbm8gYWRqdXN0bWVudC4KKwkqIG5sbWhlYWRlci55OiBGaXhlZCBtZW1vcnkgYWxsb2NhdGlvbiB0aHJvdWdob3V0OiB0b2tlbiBTVFJJTkcgaXMKKwlub3cgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBhbmQgZnJlZWQgaWYgbm90IG5lZWRlZC4gIE51bGwKKwl0ZXJtaW5hdGVkIGNvcHlyaWdodCBtZXNzYWdlLiAgQWNjZXB0IHZlcnNpb24gd2l0aCBvbmx5IHR3bworCXN0cmluZ3MuCisJKHN5bWJvbF9saXN0X29wdCk6IE5ldyBub250ZXJtaW5hbCwgZWl0aGVyIHN5bWJvbF9saXN0IG9yIGVtcHR5LgorCShzeW1ib2xfbGlzdCk6IFVzZSBsZWZ0IHJlY3Vyc2lvbiB0byBhdm9pZCBvdmVyZmxvd2luZyBwYXJzZXIKKwlzdGFjay4KKwkoeXlsZXgpOiBSZWFycmFuZ2VkIGJlZ2lubmluZyBvZiBsaW5lIGNoZWNrLiAgQWNjZXB0IHF1b3RlZAorCXN0cmluZ3MgdXNpbmcgc2luZ2xlIHF1b3Rlcy4gIEVuZCBnZW5lcmljIGFyZ3VtZW50IGF0IGNvbW1lbnQKKwljaGFyYWN0ZXIgb3IgcGFyZW50aGVzZXMuCisJKHN0cmluZ19saXN0X2FwcGVuZCk6IEZpeGVkLgorCShzdHJpbmdfbGlzdF9hcHBlbmQxKTogTmV3IGZ1bmN0aW9uLgorCisJKiBidWNvbW0uaDogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHhyZWFsbG9jIGlzIFBUUiwgbm90IGNoYXIgKi4KKwkqIGJ1Y29tbS5jICh4cmVhbGxvYyk6IFVzZSBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgorCSogTWFrZWZpbGUuaW4gKG9iamR1bXAubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5zdGF0dXMgdG8gbm90aWNlCisJLS13aXRoLXRhcmdldHMgY2hhbmdlcy4KKwkobmxtY29udi5vKTogRGVwZW5kIHVwb24gYnVjb21tLmguCisKK1R1ZSBBdWcgMTcgMDk6NDY6MDEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgY3B1IHRvIGNvbmZpZy5iZmQuCisKK1RodSBBdWcgMTIgMTY6NDM6MDQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoJChOTV9QUk9HKSk6IERlcGVuZCBvbiBkZW1hbmdsZS5vLgorCShkZW1hbmdsZS5vKTogTmV3IHRhcmdldC4KKwkoY3BsdXMtZGVtLm8pOiBEZXBlbmQgb24gaXQsIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9yZGVyIHdoZW4gZG9pbmcKKwlwYXJhbGxlbCBjb21waWxlcy4KKworCSogbm0uYyAocHJpbnRfc3ltYm9sX2luZm9fe2JzZCxzeXN2LHBvc2l4fSk6IFRha2UgYSBiZmQgYXJnLgorCShzdHJ1Y3Qgb3V0cHV0X2ZucyBwcmludF9zeW1ib2xfaW5mbyk6IERpdHRvLgorCShsb25nX29wdGlvbnMsIHVzYWdlLCBtYWluKTogQWRkIC1DIC0tZGVtYW5nbGUgb3B0aW9uLgorCShwcmludF9zeW1uYW1lKTogTmV3IGZ1bmN0aW9uLCBkZW1hbmdsaW5nIGlmIHJlcXVlc3RlZC4KKwkocHJpbnRfc3ltYm9scywgcHJpbnRfc3ltYm9sX2luZm9fe2JzZCxzeXN2LHBvc2l4fSk6IFVzZSBpdC4KKworV2VkIEF1ZyAxMSAyMjo1NzoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBQdXQgQ0ZMQUdTIGxhc3QgaW4gY29tcGlsYXRpb24gcnVsZXMgYW5kIG9taXQgZnJvbQorCWxpbmtpbmcgcnVsZXMuICBVc2UgQVJDSERFRlMgdG8gY29tcGlsZSBvYmpkdW1wLmMuCisJVXBkYXRlIGRlcGVuZGVuY2llcy4KKwkqIGNvbmZpZ3VyZS5pbjogQ29uc3RydWN0IEFSQ0hERUZTIGJhc2VkIG9uIHRoZSBCRkQgdGFyZ2V0IG1ha2VmaWxlCisJZnJhZ21lbnRzLgorCSogb2JqZHVtcC5jOiBDb25kaXRpb25hbGl6ZSBjYWxscyB0byB0aGUgcHJpbnRfaW5zbl9BUkNIIGZ1bmN0aW9ucworCWFjY29yZGluZyB0byBBUkNIREVGUy4KKworVGh1IEF1ZyAxMiAwODowNjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFyLmM6IFJlbW92ZWQgb2Jzb2xldGUgYW5kIG5vbi1mdW5jdGlvbmFsIEdOVTk2MCBjb2RlLgorCitXZWQgQXVnIDExIDEzOjA4OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogc2l6ZS5jIChiZXJrZWxleV9zdW0pOiBOZXcgZnVuY3Rpb24uCisJKGJzc3NpemUsIGRhdGFzaXplLCB0ZXh0c2l6ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGVzLgorCShic3Nfc2VjdGlvbl9uYW1lLCBkYXRhX3NlY3Rpb25fbmFtZSwgdGV4dF9zZWN0aW9uX25hbWUpOiBSZW1vdmVkLgorCShwcmludF9iZXJrZWxleV9mb3JtYXQpOiBNYXAgYmVya2VsZXlfc3VtIG92ZXIgYWxsIHRoZSBzZWN0aW9ucywKKwlyYXRoZXIgdGhhbiBvbmx5IHJlcG9ydGluZyBzaXplcyBvZiBzcGVjaWZpY2FsbHkgbmFtZWQgc2VjdGlvbnMuCisJKiBNYWtlZmlsZS5pbiAoJChPQkpEVU1QX1BST0cpKTogUmVtb3ZlZCBkZXBlbmRlbmN5IG9uIHNpemUuby4KKworVHVlIEF1ZyAxMCAxMDo0NjowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG5sbWNvbnYuYywgbmxtY29udi5oLCBubG1oZWFkZXIueTogTmV3IGZpbGVzIGZvciBwcm9ncmFtIHRvCisJY29udmVydCBvYmplY3QgZmlsZXMgaW50byBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCisJKiBNYWtlZmlsZS5pbiAoTkxNQ09OVl9QUk9HKTogTmV3IG1hY3JvLCBkZWZpbmUgdG8gYmUgbmxtY29udi4KKwkoUFJPR1MpOiBBZGQgTkxNQ09OVl9QUk9HLgorCShubG1oZWFkZXIuYywgbmxtaGVhZGVyLm8sIG5sbWNvbnYubywgJChOTE1DT05WX1BST0cpKTogTmV3CisJdGFyZ2V0cy4KKworVGh1IEF1ZyAgNSAxNTo0ODozMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBkZWZpbmUgTUFLRU9WRVJSSURFUyB0byBhbiBlbXB0eSBzdHJpbmcKKworV2VkIEF1ZyAgNCAxNzowODowOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG9iamNvcHkuYyAoY29weV9maWxlKTogTWFrZSBmYWlsdXJlcyB0byBwcm9jZXNzIGEgZmlsZSBub25mYXRhbC4KKworTW9uIEF1ZyAgMiAxMToyODoyMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG5tLmM6IEFkZCAtQiBvcHRpb24sIGxpa2UgLS1mb3JtYXQ9YnNkLgorCitUdWUgSnVsIDI3IDE2OjI5OjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogb2JqY29weS5jIChjb3B5X2ZpbGUpOiBJZiB0aGUgZmlsZSBpcyBuZWl0aGVyIGFuIG9iamVjdCBub3IgYW4KKwlhcmNoaXZlLCBnaXZlIGFuIGVycm9yIHJhdGhlciB0aGFuIHJldHVybmluZyBzdWNjZXNzLgorCitNb24gSnVsIDE5IDE2OjEzOjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBQcmVmZXIgbm9uLWxvY2FsIHN5bWJvbHMgb3ZlcgorCWxvY2FsIG9uZXMsIGFuZCBlc3BlY2lhbGx5IGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGRlYnVnZ2luZyBzeW1ib2xzLgorCUFsc28sIGZvciByZWxvY2F0ZWFibGUgZmlsZXMsIHRyeSB0byBmaW5kIGEgc3ltYm9sIGluIHRoZSBjdXJyZW50CisJc2VjdGlvbiwgaW5zdGVhZCBvZiBwaWNraW5nIG9uZSBmcm9tIHNvbWUgcmFuZG9tIHNlY3Rpb24gd2l0aCBhCisJY29udmVuaWVudCB2YWx1ZSAocmVhZCwgc2VjdGlvbiBvZmZzZXQpLgorCShkaXNhc3NlbWJsZV9kYXRhKTogQ2FzdCBhcmd1bWVudCB0byBtYWxsb2MgdG8gc2l6ZV90IGZpcnN0LgorCShkdW1wX2RhdGEpOiBMaWtld2lzZS4KKwkoZHVtcF9yZWxvY3MpOiBJZiBhIHNpbmdsZSBzZWN0aW9uIG5hbWUgaXMgc3BlY2lmaWVkLCBzaG93IHJlbG9jcworCW9ubHkgZm9yIHRoYXQgc2VjdGlvbi4gIE90aGVyd2lzZSwgc2lsZW50bHkgb21pdCBzZWN0aW9ucyB3aXRob3V0CisJcmVsb2NzLiAgRm9ybWF0IHRhYmxlIG5pY2VseSBldmVuIGlmIHZhbHVlcyBhcmUgcHJpbnRlZCB1c2luZyAxNgorCWRpZ2l0cyBpbnN0ZWFkIG9mIDguCisKK0ZyaSBKdWwgMTYgMTU6MTk6NTkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBubS5jOiBDaGFuZ2VzIGZvciBmaW5hbCB2ZXJzaW9uIG9mIFBPU0lYLjIuCisJKHByaW50X3N5bWJvbF9maWxlbmFtZV97YnNkLHN5c3YscG9zaXh9KTogTmV3IGZ1bmN0aW9ucy4KKwkoZm9ybWF0cyk6IEFkZCBhbiBlbGVtZW50IGZvciBhIHBvaW50ZXIgdG8gdGhlbS4KKwkocHJpbnRfc3ltYm9scyk6IENhbGwgaXQuCisJKHByaW50X29iamVjdF9maWxlbmFtZV9wb3NpeCwgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgpOiBQcm9kdWNlCisJb3V0cHV0IGFjY29yZGluZyB0byBuZXcgUE9TSVguMiBzcGVjLgorCisJKiBzdHJpbmdzLmMgKHByaW50X3N0cmluZ3MpOiBIYW5kbGUgU1RSRUFNIGJlaW5nIE5VTEwuCisJKHN0cmluZ3NfYV9zZWN0aW9uKTogUGFzcyBhIE5VTEwuCisJKG1haW4pOiBEb24ndCBvcGVuIC9kZXYvbnVsbC4KKworVGh1IEp1bCAxNSAxMjo0NDowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEhhbmRsZSB0aGUgbTg4ay4KKwkoZGlzcGxheV9iZmQpOiBVc2UgYmZkX2Vycm1zZywgcmF0aGVyIHRoYW4ganVzdCBjbGFpbWluZyB0aGF0IHRoZQorCWJmZCBpcyBub3QgYW4gb2JqZWN0IGZpbGUuCisKK01vbiBKdWwgMTIgMTc6NTU6MzQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIGFnYWluIGJ5IG5hbWluZyBkaXJlY3RvcmllcworCSAgZXhwbGljaXRseSByYXRoZXIgdGhhbiBkZXBlbmRpbmcgb24gdW5kZWZpbmVkIG1hY3Jvcy4KKwkgIChJTlNUQUxMX1hGT1JNKTogY29ycmVjdCBiYWQgaW5zdGFsbCB0YXJnZXQuCisKK0ZyaSBKdWwgIDIgMTY6NTg6MzQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzdHJpbmdzLmM6IERvYyBmaXhlcy4KKworU3VuIEp1biAyNyAxMzozNToyNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBOb3RlIGRlcGVuZGVuY2llcyBvbiBidWNvbW0uaC4KKwkoY3BsdXMtZGVtLm8pOiBMaW5rIGMrK2ZpbHQgd2l0aCB2ZXJzaW9uLm8uCisKKwkqIHN0cmluZ3MuYzogSW5jbHVkZSBidWNvbW0uaCBhbmQgYWRkIHByb3RvdHlwZXMgdG8gb3RoZXIgZGVjbHMuCisJUmVtb3ZlIC1oIG9wdGlvbi4KKworCSogYnVjb21tLmg6IERlY2xhcmUgeHJlYWxsb2MuCisKKwkqIG5tLmMsIG9iamNvcHkuYywgb2JqZHVtcC5jLCBzaXplLmMsIHN0cmluZ3MuYyAobWFpbiwgdXNhZ2UpOiBBZGQKKwktLWhlbHAgb3B0aW9uLiAgUHV0ICJHTlUiIGluIHRoZSB2ZXJzaW9uIG1lc3NhZ2UuCisJKHVzYWdlKTogVGFrZSBzdHJlYW0gYW5kIGV4aXQgc3RhdHVzIGFzIGFyZ3MuCisJKG1haW4pOiBQYXNzIG5ldyBhcmdzIHRvIHVzYWdlLgorCitGcmkgSnVuIDI1IDIzOjEyOjEyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3RyaW5ncy5jLCBzdHJpbmdzLjE6IE5ldyBmaWxlcy4KKwkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IHN0cmluZ3MuCisJKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGVzIGZvciBpdC4KKworRnJpIEp1biAyNSAyMDo0NDo0MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jOiBVc2Ugc2l6ZS1pbmRlcGVuZGVudCBiZmQgZWxmIHNlY3Rpb24gbmFtZXMuCisKK1N1biBKdW4gMjAgMjM6MDk6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSGFuZGxlIHdpZGUgb2Zmc2V0cyBieQorCWNhbGxpbmcgc3ByaW50Zl92bWEuCisKK0ZyaSBKdW4gMTggMTQ6Mjk6MTIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoc3ltczIpOiAgUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUuCisJKiBvYmpkdW1wLmMgKHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpOiAgTmV3IGZ1bmN0aW9uLgorCSogb2JqZHVtcC5jIChjb21wKTogIFNpbXBsaWZ5LgorCSogb2JqZHVtcC5jIChkaXMtYXNzZW1ibGVfZGF0YSk6ICBNYWtlIHNpbXBsZXIgYW5kIG1vcmUKKwllZmZpY2llbnQgaG93IHdlIGZpbHRlciBvdXQgdXNlbGVzcyBzeW1ib2xzOiAgSnVzdCBmaWx0ZXIKKwlCRUZPUkUgdGhlIHNvcnQgKHVzaW5nIHJlbW92ZV91c2VsZXNzX3N5bWJvbHMpLgorCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiAgU2ltcGxpZnkuCisJQ2hhbmdlIG91dHB1dCBzeW50YXggdG8gbWF0Y2ggZ2RiLgorCitUaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KKwl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCisKK01vbiBKdW4gMTQgMTI6MTM6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCwgaW5zdGFsbC1pbmZvKTogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0LAorCXVzZSBJTlNUQUxMX1hGT1JNOyBkZWZpbmUgSU5TVEFMTF9YRk9STQorCitUaHUgSnVuIDEwIDE3OjI5OjIxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEZpeCBiYWQgc2l6ZSBwYXNzZWQgdG8geG1hbGxvYygpLgorCitNb24gSnVuICA3IDEyOjQxOjEyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgorCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KKwkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgRml4IHN5bWJvbCB0YWJsZSBoYW5kbGluZy4KKworRnJpIEp1biAgNCAxNzoyMDowMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6ICBDYW5ub3QgZmlsdGVyIHRoZSBzeW1ib2xzCisJaW4gcGxhY2UsIGJlY2F1c2UgdGhhdCBjb25mdXNlcyB0aGUgcmVsb2NzLCBzbyB0YWtlIHNlcGFyYXRlCisJcGFyYW1ldGVyIGZvciBvdXRwdXQgYXJyYXkuCisJKiBvYmpjb3B5LmMgKHN5bXBwKTogIE1ha2UgdHdvIHZhcmlhYmxlczogaXN5bXBwIGFuZCBvc3ltcHAuCisJKiBvYmpjb3B5LmMgKGNvcHlfb2JqZWN0KTogIEFsbG9jYXRlIHNlcGFyYXRlIGFycmF5IChvc3ltcHApCisJZm9yIGZpbHRlcmVkIHN5bWJvbHMuCisKK0ZyaSBKdW4gIDQgMTA6NTE6NDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogY2hhbmdlIHJlY3Vyc2lvbiB0ZXN0IHRvIHByZXNlbmNlIG9mIGEgY29uZmlndXJlZAorCXRlc3RzdWl0ZSBkaXJlY3RvcnkKKworVGh1IEp1biAgMyAxNDowNTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiBIYWNrIHRoZSBiYWNrcXVvdGVkIGNvbW1hbmQgc28gaXQKKwlkb2Vzbid0IGNhdXNlIFNvbGFyaXMgbWFrZSB0byBib21iLgorCitUaHUgSnVuICAzIDEwOjQwOjE5IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgYWRkZWQgYysrZmlsdCBhbmQgb2JqY29weSB0byBNQU5QQUdFUyB2YXJpYWJsZQorCitUaHUgSnVuICAzIDAwOjMyOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbmFtZSBMT0FETElCRVMgdG8gRVhUUkFMSUJTCisKK1dlZCBKdW4gIDIgMTg6MzA6MjQgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKKworCSogYysrZmlsdC4xLCBvYmpjb3B5LjE6ICBuZXcgbWFuIHBhZ2VzCisKK0ZyaSBNYXkgMjggMTU6MDE6MjQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6ICBBbHNvIGluc3RhbGwgYXIgYW5kIHJhbmxpYiBpbgorCSQodG9vbGRpcikvYmluOyAgbmVlZGVkIGZvciBidWlsZGluZyBsaWJnY2MuYS4KKwkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF9hZGRyZXNzKTogIEZpeCB0aGUgY2hlY2sKKwkiY29pbmNpZGVudGFsIiBsYWJlbCBtYXRjaGVzIGJ5IGRpcy1hbGxvd2luZyB1bmRlZmluZWQKKwlvciBjb20gc3ltYm9scy4KKworVGh1IE1heSAyNyAxNjo1ODozMSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQorCisgICAgICAgICogYml1dGlscy50ZXhpOiAgcmV2aXNlZCBjKytmaWx0IGNoYXB0ZXIKKworV2VkIE1heSAyNiAxNzoyNDoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDIGFuZCBDRkxBR1MuCisKK1R1ZSBNYXkgMjUgMDA6MjY6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogUHJpbnQgd2FybmluZyBmb3IgYmFkIHN5bWJvbCB0YWJsZS4KKwkoYmZkX2VsZjMyX2ZpbmRfc2VjdGlvbiwgRWxmMzJfSW50ZXJuYWxfU2hkcik6IFVwZGF0ZWQKKwlkZWNsYXJhdGlvbnMgYW5kIHVzZXMuCisKKwkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBEb24ndCBidWlsZCBiaW51dGlscy5tbS4KKworRnJpIE1heSAyMSAxMDo1MToxOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIG5tLmM6IEFkZCAtZi8tLWZvcm1hdCwgLVAvLS1wb3J0YWJpbGl0eSwgLXQvLS1yYWRpeCBvcHRpb25zLgorCU1ha2UgZ2xvYmFsIHZhcmlhYmxlcyBzdGF0aWMuCisJKG1haW4pOiBNYWtlIC12IGxpa2UgLW4sIG5vdCAtViwgYW5kIG1ha2UgLUEgbGlrZSAtbywgZm9yIFBPU0lYLjIuCisJKHNldF9wcmludF9yYWRpeCwgc2V0X291dHB1dF9mb3JtYXQsCisJcHJpbnRfe29iamVjdF9maWxlbmFtZSxhcmNoaXZlX2ZpbGVuYW1lLGFyY2hpdmVfbWVtYmVyLHN5bWJvbF9pbmZvfQorCXtic2Qsc3lzdixwb3NpeH0pOiBOZXcgZnVuY3Rpb25zLgorCShkaXNwbGF5X2ZpbGUsIHByaW50X3N5bWJvbHMpOiBDYWxsIHRoZW0uCisKKwkqIGFyLmM6IEltcHJvdmUgZXJyb3IgbWVzc2FnZXMuCisKKwkqIG5tLmMgKG1haW4pOiBIYW5kbGUgbG9uZyBvcHRpb25zIHRoYXQganVzdCBzZXQgYSBmbGFnLgorCisJKiBubS5jIChtYWluKSwgYXIuYyAoZG9fc2hvd192ZXJzaW9uKSwgb2JqY29weS5jIChtYWluKSwgc2l6ZS5jCisJKG1haW4pOiBFeGl0IGFmdGVyIHByaW50aW5nIHRoZSB2ZXJzaW9uIG51bWJlciwgcGVyIHRoZSBHTlUgY29kaW5nCisJc3RhbmRhcmRzLgorCitNb24gTWF5IDE3IDEzOjIwOjI1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBSRUFETUUsIE1ha2VmaWxlLmluOiAgTWlub3IgdXBkYXRlcyBmb3IgMi4yLgorCitGcmkgTWF5IDE0IDExOjEyOjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUKKwkodXNpbmcgbm0pIGEgZmlsZSB3aXRoIHRoZSB2YXJpYWJsZSBwcmVwZW5kc191bmRlcnNjb3JlLgorCSogTWFrZWZpbGUuaW4gKGMrK2ZpbHQpOiAgTGluayB1bmRlcnNjb3JlLm8gd2l0aCBjcGx1cy1kZW0ubworCXNvIHRoYXQgaW5pdGlhbCB1bmRlcnNjb3JlcyBnZXQgcmVtb3ZlZCBpZmYgYXBwcm9wcmlhdGUuCisJKiBiaW51dGlscy50ZXhpOiAgUHJlbGltaW5hcnkgZG9jdW1lbnRhdGlvbiBmb3IgYysrZmlsdC4KKwkqIE1ha2VmaWxlLmluLCBiaW51dGlscy50ZXhpOiAgU2V0IHRvIHZlcnNpb24gMi4yLgorCisJKiBORVdTOiAgTWVudGlvbiBjb3B5LT5vYmpjb3B5IHJlbmFtaW5nIGFuZCBuZXcgYysrZmlsdCBwcm9ncmFtLgorCitXZWQgTWF5IDEyIDEyOjA1OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNwbHVzLWRlbS5vLCAkKERFTUFOR0xFUl9QUk9HKSk6IEJ1aWxkIHRoZQorCWRlbWFuZ2xlciB2aWEgY3BsdXMtZGVtLm8sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGZyb20gdGhlIC5jIGZpbGUuCisKKwkqIG9iamNvcHkuYzogUmVuYW1lZCBmcm9tIGNvcHkuYywgdXBkYXRlZCBjb21tZW50cyBhY2NvcmRpbmdseS4KKwkqIE1ha2VmaWxlLmluLCBiaW51dGlscy50ZXhpOiBSZW5hbWVkIGNvcHkgdG8gb2JqY29weS4KKwkqIGlzLXN0cmlwLmMsIG1heWJlLXN0cmlwLmMsIG5vdC1zdHJpcC5jOiBVcGRhdGVkIGNvbW1lbnRzIGZvcgorCXJlbmFtZSBvZiBjb3B5IHRvIG9iamNvcHkuCisKK01vbiBNYXkgMTAgMTc6MjA6MTggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLnRleGkgKHN0cmlwLCAtdiBvcHRpb24pOiAgRml4IHR5cG8uCisKK0ZyaSBNYXkgIDcgMTM6NTc6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IERlZmluZS4KKwkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBSVU5URVNULgorCitUdWUgTWF5ICA0IDEwOjA2OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKERFTUFOR0xFUl9QUk9HKTogTmFtZSBpdCBjKytmaWx0LgorCShQUk9HKTogQWxzbyBidWlsZCBhbmQgaW5zdGFsbCBDT1BZX1BST0cuCisKK01vbiBNYXkgIDMgMTk6MTE6NDggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGRlZmluaXRpb24gb2YgJCh0b29sZGlyKSB0byBtYXRjaCBGU0YuCisKK1dlZCBBcHIgMjggMjM6NDE6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBzaXplLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KKwkobWFpbik6IENsZWFuIHVwIG9wdGlvbiBwYXJzZXIuCisKKwkqIG9iamR1bXAuYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgorCShkaXNwbGF5X2ZpbGUpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKKwliZGZfcGVycm9yLgorCisJKiBubS5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCisJKG1haW4pOiBDbGVhbiB1cCBvcHRpb24gcGFyc2VyLgorCShkaXNwbGF5X2ZpbGUpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKKwliZGZfcGVycm9yLgorCisJKiBjb3B5LmMgKGNvcHlfdXNhZ2UsIHN0cmlwX3VzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KKworCSogYXIuYyAodXNhZ2UpOiBOZXcgZnVuY3Rpb24uCisJKG1haW4pOiBDYWxsIGl0LgorCShvcGVuX2luYXJjaCwgZG9fcXVpY2tfYXBwZW5kKTogUHJpbnQgcHJvZ3JhbSBuYW1lIGJlZm9yZSBjYWxsaW5nCisJYmRmX3BlcnJvci4KKworVGh1IEFwciAyMiAxNTowMTozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG5tLmMgKG1haW4pOiBBY2NlcHQgYW5kIGlnbm9yZSAtQSBhbmQgLUIgZm9yIE1JUFMgY29tcGF0aWJpbGl0eS4KKworTW9uIEFwciAxOSAxNDowNjo1OSAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGRlZCBGTEFHU19UT19QQVNTIHNvIHRlc3RzIGdldCBydW4gb24gZnJlc2hseQorCWJ1aWx0IGJpbmFyaWVzIGlmIHRoZXkgZXhpc3QuIChvdGhlcndpc2UgdGhlIHBhdGgpCisKK1dlZCBBcHIgIDcgMjI6MjI6NTAgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBjaGVjayB0YXJnZXQgdG8gdXNlIERlamFHbnUuCisKK1RodSBBcHIgIDEgMTI6Mzc6MTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgYW0yOWstcGluc24uYywgaTk2MC1waW5zbi5jLgorCW9iamR1bXAuYzogYTI5ayBhbmQgaTk2MCBhcmUgYGRpc2Fzc2VtYmxlJyBub3QgYHByaW50Jy4KKworCSogb2JqZHVtcC5jOiBSZW5hbWUgcHJpbnRfYWRkcmVzcyB0byBvYmpkdW1wX3ByaW50X2FkZHJlc3MKKwlhbmQgY2hhbmdlIHBhcmFtZXRlcnMuCisJKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2Ugb2JqZHVtcF9wcmludF9hZGRyZXNzLgorCitXZWQgTWFyIDMxIDEwOjI1OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBwcmludF9pbnNuX3NwYXJjIGlzIG5vdyBhCisJYGRpc2Fzc2VtYmxlJyBub3QgYSBgcHJpbnQnLgorCU1ha2VmaWxlLmluOiBSZW1vdmUgc3BhcmMtcGluc24uYyAobm93IGluIGxpYm9wY29kZXMuYSkuCisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBuZXcgcmVhZF9tZW1vcnlfZnVuYyBzdHVmZi4KKworVGh1IE1hciAyNSAxMDozODoxMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZnByaW50Zik6IERlY2xhcmF0aW9uIG9mIHZhcmlhZGljIGZ1bmN0aW9uIGhhZCBiZXR0ZXIKKwliZSBhIHByb3RvdHlwZSBmb3IgQU5TSSBDIHN5c3RlbXMuCisKK01vbiBNYXIgMjIgMjM6MTk6NDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVuYW1lIHRlc3QtaW5zdGFsbCB0byBpbnN0YWxsLWNoZWNrCisKK0ZyaSBNYXIgMTkgMTQ6NDA6MDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEFkZCBIODUwMC4KKworRnJpIE1hciAxOSAxMDo1Njo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jICh1c2FnZSk6IE1lbnRpb24gbG9uZyBvcHRpb25zLgorCitUaHUgTWFyIDE4IDE0OjIyOjE3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbm0uYzogIE1vZGlmeSBiZWhhdmlvciBvZiAtbyBmbGFnIGZvciBhcmNoaXZlcyB0byBtYXRjaAorCUJTRDQuNCBhbmQgU3Vub3MgNDogIFByZWZpeCBhcmNoaXZlIG5hbWUgYmVmb3JlIGVhY2ggbGluZS4KKworCSogbTY4ay1waW5zbi5jOiAgUmVtb3ZlZC4gIFN1YnN1bWVkIGJ5IC4uL29wY29kZXMvbTY4ay1kaXMuYy4KKwkqIGkzODYtcGluc24uYzogIFJlbW92ZWQuICBTdWJzdW1lZCBieSAuLi9vcGNvZGVzL2kzODYtZGlzLmMuCisJKiBNYWtlZmlsZS5pbjogIEFkanVzdCBhY2NvcmRpbmdseS4KKwkqIG9iamR1bXAuYzogIFN1cHBvcnQgbmV3LXN0eWxlIGRpc2Fzc2VtYmxlcnMgKG9uZXMgdGhhdCB1c2UKKwl0aGUgaW50ZXJmYWNlIG9mIC4uL2luY2x1ZGUvZGlzLWFzbS5oKS4KKworVGh1IEZlYiAyNSAxNTo1NzowMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgV2hlbiBtYWtpbmcgdGFyIGZpbGUsIHJlbW92ZSB0ZXhpbmZvLyosCisJZXhjZXB0IGZvciB0ZXhpbmZvL3RleGluZm8udGV4LgorCSogYXJkdXAuYzogIEFkZCBleHRlcm4gZGVjbGFyYXRpb24gb2Ygc3RyZHVwLgorCSogTWFrZWZpbGUuaW4gKHRlc3RzdWl0ZSk6ICBBZGQgJ2Vsc2UgdHJ1ZScgc2luY2Ugb3RoZXJ3aXNlCisJVWx0cml4IC9iaW4vc2ggY29tcGxhaW5zLgorCitXZWQgRmViIDI0IDE5OjQ0OjE4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBTZXQgVkVSU0lPTiB0byAyLjEuCisJKiBSRUFETUUsIE5FV1M6IFVwZGF0ZXMuCisJKiBubS5jOiAgQWRkIC12IGFzIGEgc3lub255bSBmb3IgLVYuCisKK1R1ZSBGZWIgMjMgMTk6MDA6NTAgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBhZGRlZCB0ZXN0c3VpdGUgdG8gY29uZmlnZGlycy4KKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdXBwb3J0IGZvciBidWlsZGluZyB0ZXN0c3VpdGUuCisKK01vbiBGZWIgMjIgMjI6NTI6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiAgUHJpbnQgZnVuY3Rpb24gbmFtZXMgd2hlbgorCWdpdmVuIGJ5IGJmZF9maW5kX25lYXJlc3RfbGluZS4gIElmIG5vdCAtIHN0aWxsIHByaW50CisJbGluZSBudW1iZXJzLgorCitNb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogbWFkZSBtb2RpZmljYXRpb25zIHRvIHRlc3RjYXNlcywgZXRjLiwgdG8gYWxsb3cKKyAgICAgICAgdGhlbSB0byB3b3JrIHByb3Blcmx5ICBnaXZlbiB0aGUgcmVvcmdhbml6YXRpb24gb2YgZGVqYS1nbnUgYW5kIHRoZQorCXJlbG9jYXRpb24gb2YgdGhlIHRlc3RjYXNlcyBmcm9tIGRlamEtZ251IHRvIGEgInRvb2wiIHN1YmRpcmVjdG9yeS4KKworTW9uIEZlYiAyMiAxMDoyNzoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZHVtcF9kYXRhKTogRnJlZSB1cCBzZWN0aW9uIGNvbnRlbnRzIGVhY2ggdGltZQorCXRocm91Z2ggdGhlIGxvb3AuICBSZXBvcnRlZCBieSBtaW55YXJkQGJuci5jYS4KKworU3VuIEZlYiAyMSAxMDo1NTo1NSAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBiaW51dGlscy90ZXN0c3VpdGU6IEluaXRpYWwgY3JlYXRpb24gb2YgYmludXRpbHMvdGVzdHN1aXRlLgorCU1pZ3JhdGVkIGRlamFnbnUgdGVzdGNhc2VzIGFuZCBzdXBwb3J0IGZpbGVzIGZvciB0ZXN0aW5nIG5tIHRvCisJYmludXRpbHMvdGVzdHN1aXRlIGZyb20gZGVqYS1nbnUuICBUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKKwl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuCVRoaXMgbWlncmF0aW9uIGlzIHBhcnQgb2YgYSBtYWpvciBvdmVyaGF1bAorCW9mIGRlamFnbnUuICBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGVzZSB0ZXN0Y2FzZXMsIGV0Yy4sIHdoaWNoCisJd2lsbCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgZGVqYWdudSB3aWxsIGJlCisJbWFkZSBpbiBhIGZ1dHVyZSB1cGRhdGUuCisKK0ZyaSBGZWIgMTIgMTA6MDU6MjAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChMSUJJQkVSVFlfU1JDX0RJUiwgTElCSUJFUlRZX0JJTl9ESVIpOiBOZXcgbWFjcm9zLgorCSogTWFrZWZpbGUuaW4gKExJQklCRVJUWSk6ICBVc2UgTElCSUJFUlRZX0JJTl9ESVIuCisJKiBNYWtlZmlsZS5pbiAoREVNQU5HTEVSX1BST0cpOiAgTmV3IHByb2dyYW0gdG8gYnVpbGQuICBBZGQgbWFjcm8KKwlhbmQgcnVsZS4KKwkqIE1ha2VmaWxlLmluIChQUk9HUyk6ICBBZGQgREVNQU5HTEVSX1BST0cuCisKK1R1ZSBKYW4gMjYgMTE6NTY6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb3B5LmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jOiBVc2UgbmV3IGJmZF9pc19jb21fc2VjdGlvbgorCW1hY3JvIHJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBlcXVhbGl0eSB0byBiZmRfY29tX3NlY3Rpb24uCisKK0ZyaSBKYW4gIDggMTU6NTA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBGaXggY29kZSB0byBmaW5kIGZpcnN0IHVzZWxlc3MKKwlzeW1ib2wuCisKK1RodSBKYW4gIDcgMTM6MTM6MzEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBVc2UgbWlwc19wcmludF9pbnNuIGZvciBNSVBTLgorCURvbid0IGNvcmUgZHVtcCBpZiBiZmRfZmluZF9uZWFyZXN0X2xpbmUgcmV0dXJucyBmYWxzZS4KKworV2VkIEphbiAgNiAxNzoxNDowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKToga25vdyBob3cgdG8gZGlzYXNzZW1ibGUgejgwMDBzCisJdG9vLgorCitXZWQgSmFuICA2IDE1OjE2OjI3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBhcnN1cC5oIChpbnRlcmFjdGl2ZSksIGJ1Y29tbS5oIChwcm9ncmFtX25hbWUpOiAgUHJlZml4CisJd2l0aCAnZXh0ZXJuJywgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBzb21lIGNvbXBpbGVycy4KKworV2VkIEphbiAgNiAxNToxNDoxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGFycGFyc2UueTogZml4IHVubmVjZXNzYXJ5IHNoaWZ0L3JlZHVjZQorCitUdWUgRGVjIDIyIDE1OjQ2OjU2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBNYWtlIGNoZWNrIGRlcGVuZCBvbiBhbGwuCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHN5c2RlcC5oLgorCSogc2l6ZS5jOiAgVXNlICV1IGZvcm1hdCB3aGVyZSBhcHByb3ByaWF0ZS4KKwkqIG9iamR1bXAuYzogIFN0YW5kYXJkaXplOiAgTF9TRVQgLT4gU0VFS19TRVQuCisJKiBvYmpkdW1wLmM6ICBVc2UgbmV3IG1hY3JvIGJmZF9hc3ltYm9sX2JmZC4KKwkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSBkZWZhdWx0ICR7bXlzX2hvc3R9LgorCitUaHUgRGVjIDE3IDE5OjM4OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZGVkIGR2aSB0YXJnZXQsIGRlZmluZSBhbmQgdXNlIFRFWEkyRFZJCisKK1R1ZSBEZWMgMTUgMTg6MDU6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChkaXN0KTogIEZpeCBwZXJtaXNzaW9ucyBiZWZvcmUgcmVsZWFzZS4KKwkqIHNpemUuYzogIFVzZSBiZmRfc2l6ZV90eXBlIChhbmQgbG9uZykgd2hlcmUgYXBwcm9wcmlhdGUuCisJKiBhci5jOiAgTWFrZSB3cml0aW5nIGEgbWFwIHRoZSBkZWZhdWx0LCB0byBiZSBjb21wYXRpYmxlCisJd2l0aCBTWVNWIGFuZCBQb3NpeC4yLiAgUmVtb3ZlIHNvbWUgYm9ndXMga2x1ZGdlcyB0aGF0CisJaGFuZGxlZCBfXy5TWU1ERUYgZGlyZWN0bHkuCisJKiBORVdTOiAgTmV3IGZpbGUuCisKK01vbiBOb3YgIDkgMTM6MzY6NTMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZmxleCBubyBsb25nZXIgbmVlZHMgdGhlIC1TIGZsYWcKKworU2F0IE5vdiAgNyAxNTowNjoxMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBhci5jIChleHRyYWN0X2ZpbGUpOiB1dGltZSBuZWVkcyBhIHBvaW50ZXIgdG8gYSB1dGltYnVmCisKKwkqIE1ha2VmaWxlLmluOiBoYW5kbGUgLUkgaW5jbHVkZXMgYmV0dGVyLCBhZGRpbmcgJChCQVNFRElSKS9iZmQgdG8KKwl0aGUgbGlzdCAoc2luY2Ugc29tZSBvZiB0aGUgYmZkL2hvc3RzLyouaCBmaWxlcyBpbmNsdWRlIG90aGVyCisJZmlsZXMgZnJvbSB0aGF0IGRpcmVjdG9yeSkKKworRnJpIE5vdiAgNiAwMDoxMjo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogaTk2MC1waW5zbi5jIChNRU1fTUFYLCBNRU1fU0laKTogIFNldCB1cHBlciBib3VuZCBwcm9wZXJseS4KKworVGh1IE5vdiAgNSAwMzozNzoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCUNsZWFuIHVwIHNvbWUgb2xkIEJGRCBhbnNpZmljYXRpb24gbWFjcm9zLgorCisJKiBhcnN1cC5oLCBidWNvbW0uaCwgb2JqZHVtcC5oOiAgUmVtb3ZlIEVYRlVOIGZyb20gYmludXRpbHMuCisJSXQgc3RpbGwgcmVtYWlucyBhcyBhIGxvY2FsIG1hY3JvIGluIGdtYWxsb2MuYywgd2hpY2ggaXMgZGVyaXZlZAorCWZyb20gc29tZSBvdGhlciBjb3B5IG9mIEdOVSBNYWxsb2Mgc29tZXdoZXJlIChGSVhNRSkuCisKKwkqIGFyLmMsIG9iamR1bXAuYywgc2l6ZS5jOiAgUmVwbGFjZSBFWEZVTiB3aXRoIFBST1RPLiAgTWFrZSBzdGF0aWMKKwlmbnMgcmVhbGx5IHN0YXRpYy4KKwkqIGFyc3VwLmg6ICBEZWNsYXJlIGV4dHJhY3RfZmlsZXMuCisKK01vbiBOb3YgIDIgMTI6NDI6MTEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhci5jIChleHRyYWN0X2ZpbGUpOiBpbnN0ZWFkIG9mIGNoZWNraW5nIFVTRzogaWYgUE9TSVhfVVRJTUUsCisJdXNlIHV0aW1lIGFuZCB1dGltYnVmIHN0cnVjdHVyZSwgb3RoZXJ3aXNlIGlmIFVTRV9VVElNRSB1c2UgdXRpbWUKKwlhbmQgYXJyYXkgb2YgdHdvIGxvbmdzLCBvdGhlcndpc2UgdXNlIHV0aW1lcy4KKworVGh1IE9jdCAxNSAxMzo1NzozNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMudGV4OiAgRG9jdW1lbnQgeWVzdGVyZGF5J3MgY2hhbmdlcyB0byBzdHJpcCBhbmQgY29weS4KKworV2VkIE9jdCAxNCAxMzoyMjoxNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogY29weS5jOiAgUmUtZG8gY29tbWFuZC1saW5lIHBhcnNpbmcgdG8gdXNlIGdldG9wdF9sb25nKCkuCisJQWRkIGxvbmcgb3B0aW9uIG5hbWVzLiAgUmUtdGhpbmsgb3B0aW9uIGxldHRlcnMgdG8gYmUgbW9yZQorCWNvbnNpc3RlbnQuCisJKiBjb3B5LmM6ICBOZXcgZnVuY3Rpb24gZmlsdGVyX3N5bWJvbHMoKSBmb3Igc3RyaXBwaW5nIG9ubHkKKwlkZWJ1Zy1zeW1ib2xzIGFuZC9vciBsb2NhbCBzeW1ib2xzLiAgVXNlIHRoZXNlIHRvIHN1cHBvcnQKKwl0aGUgcHJldmlvdXNseS1taXNzaW5nIG9wdGlvbnMgb2YgdGhlIG9sZCBGU0Ygc3RyaXAuCisKK1R1ZSBPY3QgMTMgMDE6MjQ6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdCk6ICBVc2UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdCByYXRoZXIKKwl0aGFuIHJlcGVhdGluZyBhIGNvcHkgb2YgaXQgaGVyZS4KKworV2VkIE9jdCAgNyAxMjo1Mzo1MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogY29weS5jIChtYWluKTogRXZlbiBpZiBpc19zdHJpcCwgYWNjZXB0IC1kIGFyZ3VtZW50IGluZGljYXRpbmcKKwlhbHRlcm5hdGUgb3V0cHV0IGZvcm1hdC4gIE5lZWRlZCBieSBnZGIgZm9yIE5pbmR5LgorCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyAiYCIgb3BlcmFuZCB0eXBlLgorCitUdWUgT2N0ICA2IDE2OjMzOjU2IDE5OTIgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLnRleGk6ICBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciAiY29weSIKKworVHVlIE9jdCAgNiAxNDoyMjo1NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgUGVyc1NvbnkpCisKKwkqIE1ha2VmaWxlLmluICgqY2xlYW4gcnVsZXMpOiBTb21lIGNsZWFuaW5nIHVwLgorCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBNYWtlIGRpc3RzdHVmZiBpbiBncHJvZiBmb3IgYSBkaXN0LgorCisJKiBhci5jIChkb19zaG93X3ZlcnNpb24pOiAgTmV3IGZ1bmN0aW9uLgorCSogYXIuYyAobWFpbik6ICBGaXggc28gImFyIC1WIiB3b3Jrcy4KKworVGh1IE9jdCAgMSAyMjo0NDo0NSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogbm93IHVzZXMgdGhlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YKKwluZXN0ZWQgY2FzZXMuCisKK0ZyaSBTZXAgMjUgMjI6NDE6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGk5NjAtcGluc24uYzogIENoYW5nZSBiemVybyB0byBtZW1zZXQuCisJKiBzcGFyYy1waW5zbi5jOiAgQ2hhbmdlIGluZGV4IHRvIHN0cmNoci4KKworTW9uIFNlcCAyMSAxNDozOTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG02OGstcGluc24gKHByaW50X2luc25fYXJnLCBmZXRjaF9hcmcpOiBhZGRlZCBzdXBwb3J0IGZvcgorCW9wZXJhbmRzIHRvIG1lbW9yeSBtYW5hZ2VtZW50IGluc3RydWN0aW9ucywgZnJvbSBXUlMuCisKK1R1ZSBTZXAgMTUgMTU6MjY6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIG5tIGFuZAorCXN0cmlwIGluICQodG9vbGRpcikvYmluLgorCitUaHUgU2VwICAzIDExOjU3OjQwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBMZXQncyBjYWxsIGl0IHZlcnNpb24gMi4wLgorCitXZWQgU2VwICAyIDAwOjI1OjEzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMC45OC4KKwkqIFRPRE8sIFJFQURNRTogIE1pbm9yIHVwZGF0ZXMuCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkZWQgbW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiBydWxlcywKKwlhbmQgY2xlYW5lZCB1cCBjbGVhbiwgcmVhbGNsZWFuLgorCitTdW4gQXVnIDMwIDIxOjE4OjU5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG1hcCBwcm9ncmFtIG5hbWVzIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorCXdoZW4gaW5zdGFsbGluZy4KKworU3VuIEF1ZyAzMCAxODowOTowMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9ucyAxLjk3LjkwLgorCSogY3BsdXMtZGVtLmM6ICBSZW1vdmVkLiAgV2FzIG5vd2hlcmUgdXNlZCAtIGFuZCBpZiBzb21lCisJcHJvZ3JhbXMgYXJlIGNoYW5nZWQgdG8gdG8gZGVtYW5nbGluZyBzaG91bGQgbm93IHVzZSB0aGUKKwl2ZXJzaW9ucyBpbiBsaWJpYmVydHkuCisKK1RodSBBdWcgMjcgMTI6NTg6MDkgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBhZGQgd2UzMmsKKworTW9uIEF1ZyAyNCAxNDo1Mzo0MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYXIuYyAobWFwX292ZXJfbWVtYmVycyk6IGlmIHRoZSBlbGVtZW50IG9mIHRoZSBhcmNoaXZlIGhhcyBhCisJbnVsbCBuYW1lLCBmaWxsIGl0IGluLgorCisJKiBubS5jIChkb19vbmVfcmVsX2ZpbGUpOiBvbmx5IHdhcm4gaWYgYSBiZmQncyBmbGFncyBzYXkgdGhlcmUKKwl3aWxsIGJlIHN5bWJvbHMgYW5kIHRoZXJlIGFyZW4ndCBhbnkuCisKK1dlZCBBdWcgMTkgMTE6MjA6MjUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtNjhrLXBpbnNuLmM6IGhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdyJywgaW50cm9kdWNlZCBmb3IgY2FzMi4KKworVHVlIEF1ZyAxOCAyMDo0NTo0OCAxOTkyICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCisKKwkqIG5tLmMgb2JqZHVtcC5jOiBBZGRlZCBzdXBwb3J0IGZvciBhICt2ZXJzaW9uICgtVikKKwl0byBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIuCisKKwkqIGFyLmMsIGNvcHkuYzogQWRkZWQgc3VwcG9ydCBmb3IgYSAtViBvcHRpb24gdG8gcHJpbnQKKwl0aGUgdmVyc2lvbiBudW1iZXIuCisKK1R1ZSBBdWcgMTggMTM6Mjg6NDQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtYXBvbGxvNjh2OiByZW1vdmVkIC1nIGZyb20gQ0MgZGVmaW5pdGlvbi4KKworCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgorCitNb24gQXVnIDE3IDE4OjMzOjQxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbTY4ay1waW5zbi5jOiAgTWlub3IgZml4IGluIHN0eWxlIG9mIG91dHB1dCAoZG9uJ3QgdXNlCisJcmFuZ2UgdG8gaW5kaWNhdGUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlcnMpLgorCitUdWUgQXVnIDExIDIzOjQyOjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBhci5jIChtYWluKTogIERvbid0ICphbHdheXMqIHNldCB0aGUgdmVyYm9zZSBmbGFnIQorCitXZWQgQXVnICA1IDExOjI1OjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY29weS5jOiAgV2hlbiBpc19zdHJpcCAoYmVjYXVzZSBpdCBpcyBpbnZva2VkIGFzIHRoZSBzdHJpcAorCXByb2dyYW0pLCBmb2xsb3cgdHJhZGl0aW9uYWwgYXJndiBwcm9jZXNzaW5nOgorCSdzdHJpcCBmaWxlMSBmaWxlMicgbm93IHN0cmlwcyBmaWxlMSBhbmQgZmlsZTIsIHJhdGhlcgorCXRoYW4gc3RyaXBwaW5nIGZpbGUxIChhcyBpbnB1dCksIGxlYXZpbmcgb3V0cHV0IGluIGZpbGUyLgorCitNb24gSnVsIDI3IDE2OjI4OjA4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8sIGRpc3BsYXlfaW5mb190YWJsZSk6ICBDYWxsCisJYmZkX3NldF9mb3JtYXQoKSBvbiBkdW1teSBiZmQgYmVmb3JlIHVzaW5nIGl0ICh0d2ljZSkuCisJKiBhci5jOiAgTWFrZSBzdXJlIGFyY2hpdmUgaXMgY3JlYXRlZCBvbiBjb21tYW5kICdyJworCWV2ZW4gd2hlbiBubyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQuICAoQ2xlYW4gdXAgYW5kCisJc2ltcGxpZnkgc29tZSBub24td29ya2luZyByZWxhdGVkIGNvZGUuKQorCitNb24gSnVsIDIwIDAyOjQ4OjM4IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBocHBhIHN1cHBvcnQgZG9lc24ndCBhc3N1bWUgaHAgT1MgKGZyb20gc2VmKS4KKworU2F0IEp1bCAxOCAxNDozNToyMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGhwcGEgaG9zdHMgKGJzZCAmIGhwdXgpLCBlcnJvciBtZXNzYWdlcworCXRvIHN0ZGVyciwgbm90IHN0ZG91dAorCitGcmkgSnVsIDE3IDE4OjM5OjQ0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogYXIuMSwgYmludXRpbHMudGV4aSwgaTk2MC1waW5zbi5jLCBubS4xLCBvYmpkdW1wLjEsIHJhbmxpYi4xLAorCSAgc2l6ZS4xLCBzcGFyYy1waW5zbi5jLCBzdHJpcC4xOiByZW1vdmVkIHJjc2lkJ3MuCisKK1RodSBKdWwgMTYgMTY6NTU6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5kb3M6IHJlbW92ZWQgcmNzaWQuCisKK1RodSBKdWwgMTYgMDg6MjM6MDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBwcmludCBzdGF0ZSBvZiBCRkRfSVNfUkVMQVhBQkxFIHRvbworCitUdWUgSnVuIDMwIDIwOjI2OjE1IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCisKK1RodSBKdW4gMjUgMDQ6NTI6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG5tLmMgKHNvcnRlcnMpOiAgTGludC4gIFJlbW92ZSBleGNlc3Mgd2hpdGVzcGFjZS4KKworV2VkIEp1biAyNCAxMzo0ODowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogbm0uYyAodmFsdWVvZiBtYWNybyk6ICBBZGQgbWlzc2luZyBwYXJlbnRoZXNlcy4KKwkoVGhlaXIgbGFjayBzY3Jld2VkIHVwIG51bWVyaWNfZm9yd2FyZCgpLikKKworU3VuIEp1biAxNCAxMDozMzoyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChkdW1wX2VsZl9zdGFicyk6ICBBbHNvIGR1bXAgLnN0YWIuaW5kZXggYW5kCisJLnN0YWIuZXhjbCBzZWN0aW9ucy4KKwkoZHVtcF9lbGZfc3RhYnNfMSk6ICBTcGxpdCBvdXQgbWFpbiBib2R5IG9mIG9sZCBkdW1wX2VsZl9zdGFicy4KKwkqIG9iamR1bXAuMSwgYmludXRpbHMudGV4aTogIERvY3VtZW50IG5ldyBzZWN0aW9ucyBkdW1wZWQuCisKK0ZyaSBKdW4gMTIgMjI6MjM6MzUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHNpemUuYywgb2JqZHVtcC5jLCBidWNvbW0uYzogIExpbnQuCisKK1RodSBKdW4gMTEgMDE6MTk6MDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZHVtcF9lbGZfc3RhYnMpOiBOZXcgZmVhdHVyZTogLS1zdGFicyBwcmludHMgb3V0IGEKKwkuc3RhYiBzZWN0aW9uIGZyb20gYW4gRUxGIGZpbGUuICBJbnN0YWxsZWQgdW5kZXIgI2lmZGVmCisJRUxGX1NUQUJfRElTUExBWSBzbyBpdCBjYW4gYmUgZWFzaWx5IGRpc2FibGVkLCBzaW5jZSBpdCByZXF1aXJlcworCWJmZC1pbnRlcm5hbHMgaGVhZGVyIGZpbGVzIGFuZCBzdWNoLgorCSogb2JqZHVtcC4xLCBiaW51dGlscy50ZXhpOiAgVXBkYXRlIGZvciAtLXN0YWJzLiAgQWxzbyBmaXgKKwlvYmpkdW1wJ3MgZG9jIHRvIHVzZSAtLSByYXRoZXIgdGhhbiArIGZvciBsb25nIG9wdGlvbnMuCisJKEZJWE1FOiAgTm90IHlldCBmaXhlZCBldmVyeXdoZXJlIGluIGJpbnV0aWxzLnRleGluZm8uKQorCitXZWQgSnVuIDEwIDA3OjUzOjI0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMoZGlzcGxheV9pbmZvKSwgcGF0Y2hlcyBmcm9tCisJbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlIHRvIHByaW50IHRoZSB0YWJsZSBtdWNoIG1vcmUKKwluaWNlbHkuCisKK1RodSBNYXkgMjggMTM6MzY6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmM6ICBBZGQgYW5vdGhlciBlbnVtLT5pbnQgY2FzdCwgZm9yIHRoZSBzYWtlIG9mCisJb2xkIGNvbXBpbGVycyAoc3VjaCBhcyBQQ0MpLgorCitXZWQgTWF5IDI3IDEzOjAxOjQ0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogYXJsZXgubDogIERvbid0IGluY2x1ZGUgPHN5c2RlcC5oPiAodW5uZWVkZWQgY29uZmxpY3RzKS4KKwlBZGQgZGVjbGFyYXRpb24gb2Ygc3RyZHVwKCkuCisKK0ZyaSBNYXkgMjIgMTM6NDA6MzcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgVXNlIHNyY2RpciBpbnN0ZWFkIG9mIFZQQVRIIGluIGxkZ3JhbS9sZGxleAorCXJ1bGVzLCBzaW5jZSB0aGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgZGlzdHJpYnV0aW9uLgorCSogTWFrZWZpbGUuaW4gKGFybGV4LmMpOiAgRG9uJ3QgcmUtZGlyZWN0IG91dHB1dCwgc2luY2UgdGhhdAorCWxlYXZlcyBhIGJvZ3VzIG91dHB1dCBmaWxlcyBpZiBpdCBmYWlscy4KKworCSogYXJsZXgubDogIE1ha2Ugd29yayB3aXRoIGxleCwgZm9yIHdoYXQgaXQncyB3b3J0aC4KKwkqIE1ha2VmaWxlLmluOiAgQmV0dGVyIGxleCBzdXBwb3J0LgorCSogTWFrZWZpbGUuaW4gKGRpc3QpOiAgR2VuZXJhdGUgZmxleCBhbmQgYmlzb24gb3V0cHV0cworCWZvciBkaXN0cmlidXRpb24uCisKK1RodSBNYXkgMTQgMTc6MTc6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZ2V0IEJJU09OIGRlZmluaXRpb24gcmlnaHQuCisKK0ZyaSBNYXkgIDggMDc6NDc6MDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIHNhbml0eS5zaDogZGVmYXVsdCBUTVBESVIgdG8gIi4iLgorCitUaHUgTWF5ICA3IDEyOjM0OjUwIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLnRleGk6IGFkZCBkb2MgZm9yIGFyIGNvbW1hbmQgbGFuZ3VhZ2UuCisKK1dlZCBNYXkgIDYgMTg6MDU6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFycGFyc2UueTogbWFrZSBFTkQgY2FsbCBhcl9lbmQKKwkqIGFyc3VwLmMgKGFyX2VuZCk6IGFkZGVkLCBkZWxldGVzIHRlbXAgZmlsZSBpZiBhcmNoaXZlIHNlc3Npb24KKwlhYm9ydGVkLgorCisKK1dlZCBNYXkgIDYgMTE6MDg6NTMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogdXNlIGJpc29uICYgZmxleCBmcm9tIC4uLyBpZiB0aGV5IGV4aXN0LiAgQWxzbywKKwkgIEZMRVgtPkxFWC4KKworCSogc2FuaXR5LnNoOiByZW1vdmUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aGVuIGZpbmlzaGVkLgorCitUdWUgTWF5ICA1IDEyOjAwOjU4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45Ny4KKwkqIGFyLmM6ICBEZWNsYXJlIGVycm5vIGZvciBtYWNoaW5lcyB0aGF0IG5lZWQgaXQuCisKK01vbiBNYXkgIDQgMjM6Mjk6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvKTogIEhhbmRsZSBlcnJvciBjYXNlcyB3aXRob3V0IGNvcmVkdW1wLgorCUNsb3NlIHRoZSBkdW1teSB0ZW1wb3JhcnkgZmlsZSB3ZSBvcGVuIGluIHRoZSBsb29wLgorCSogTWFrZWZpbGUuaW4gKGFyc3VwLm8pOiAgQWRkIGtsdWRnZSB0byBidWlsZCB3aXRoIFN1biBNYWtlLgorCitGcmkgTWF5ICAxIDE2OjIwOjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgdGVzdC1pbnN0YWxsIHRhcmdldC4KKworCSogc2FuaXR5LnNoOiBuZXcgZmlsZS4KKworCSogTWFrZWZpbGUuaW46IHVzZSBzYW5pdHkgdGVzdCBvbiBtYWtlIGNoZWNrLgorCitUdWUgQXByIDIxIDEzOjM4OjM3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBvbiB0aGUKKwkgIGNvbW1hbmQgbGluZSB0byBtYWtlLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KKworV2VkIEFwciAxNSAxNDozMzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYXJzdXAuYywgYXJzdXAuaCwgYXJwYXJzZS55LCBhcmxleC5sOiBzdXBwb3J0IGZvciBhcmNoaXZlCisJc2NyaXB0aW5nIGxhbmd1YWdlLgorCitGcmkgTWFyICA2IDIxOjU0OjUzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgorCitUaHUgTWFyICA1IDIxOjM1OjQ5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuCisKK1R1ZSBNYXIgIDMgMTU6MzY6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVtb3ZlICQoQ09QWV9QUk9HKSBmcm9tIFBST0dTLiAgSXQgc2hvdWxkbid0IGJlCisJICBpbnN0YWxsZWQuIGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgorCitXZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAorCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCisJICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KKworU3VuIEZlYiAxNiAxMjo1MzowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBCdW1wIHZlcnNpb24gdG8gMS45NiwgYW5kIHJlbW92ZSAtYmV0YQorCXN1ZmZpeCBmcm9tIGRpc3RyaWJ1dGlvbiBuYW1lLgorCSogbTY4ay1waW5zbi5jOiAgTmV3IG1hY3JvIENPRVJDRV9TSUdORURfQ0hBUiB0byBleHRyYWN0CisJdGhlIHNpZ25lZCB2YWx1ZSBvZiBhIGNoYXJhY3RlciAoZXZlbiBpZiBjaGFycyBhcmUgdW5zaWduZWQpLgorCSogc3BhcmMtcGluc24uYzogIEFkZCBuZXcgb3BlcmFuZCB0eXBlcy4KKworVGh1IEZlYiAgNiAxMjoxNDoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogZG9uJ3QgcHJpbnQgYSBzZWN0aW9uJ3MgY29udGVudHMKKwlpZiBpdCdzIG5vdCBsb2FkYWJsZSAoZWcgYnNzKQorCitUdWUgSmFuIDI4IDExOjExOjA2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogZml4ZWQgc28gdGhhdCAtdmUgYnJhbmNoCisJZGlzcGxhY2VtZW50cyBkb24ndCBnZXQgcHJpbnRlZCBhcyBsYXJnZSArdmUgb25lcy4KKworRnJpIEphbiAyNCAxNDo0Nzo1MyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY29weS5jLCBubS5jLCBvYmpkdW1wLmMsIHNpemUuYyA6IGNoYW5nZWQgdG8gdXNlIHRoZQorCW5ldyByZWxvYyBzY2hlbWUuCisKKworTW9uIERlYyAzMCAxODozNDo0MSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogIFR3ZWVrIHRoZSBvdXRwdXQgZm9ybWF0CisJc28gdGhhdCAnYXIgdHYnIG91dHB1dCBmb2xsb3dzIFBvc2l4IDEwMDMuMi9EMTEuCisJT3V0cHV0IGlzIG5vdyBhbHNvIGlkZW50aWNhbCB0byBTdW4ncyAoZXhjZXB0IF9fLlNZTURFRikuCisKK01vbiBEZWMgMzAgMDY6MDk6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgTWFrZSBgbWFrZScgb3V0cHV0IG1vcmUgcmVhZGFibGUuCisKK1dlZCBEZWMgMTggMTU6MDQ6NDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTQuCisKK1dlZCBEZWMgMTEgMTY6NDg6MDkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogYXIuYzogYWRkZWQgImIiIHRvIGZvcGVucyBmb3IgZG9zCisJKiBjb25maWdkai5iYXQsIG1ha2VmaWxlLmRvcyBuZXcgZmlsZXMgZnJvbSBESgorCitUdWUgRGVjIDEwIDA0OjA3OjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitTYXQgRGVjICA3IDE3OjA5OjM3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBidWNvbW0uaDogY3JlYXRlZCB0byBob2xkIHByb3RvdHlwZXMgb2YgYnVjb21tLmMKKwkqIG9iamR1bXAuaDogY3JlYXRlZCB0byBob2xkIHByb3RvdHllcyBvZiBvYmpkdW1wLmMKKwkqIGFtMjlrLXBpbnNuLmM6IGluY2x1ZGUgb2JqZHVtcC5oCisJKiBhci5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBnZXQgYXIuaCBmcm9tIHRoZSByaWdodCBwbGFjZSBhbmQKKwlpbmNsdWRlIGxpYmJmZC5oCisJKiBidWNvbW0uYzogZGVmdW5pemUgYmZkX2ZhdGFsCisJKiBjb3B5LmM6IGluY2x1ZGUgYnVjb21tLmgsIGxpbnQuCisJKiBpOTYwLXBpbnNuLmg6IGluY2x1ZGUgYnVjb21tLmgKKwkqIG02OGstcGluc24uaDogbGludAorCSogbm0uYzogaW5jbHVkZSBidWNvbW0uaCwgbGludAorCSogb2JqZHVtcC5jOiBsaW50CisJKiBzcGFyYy1waW5zbi5jOiBpbmNsdWRlIG9iamR1bXAuaAorCisKKworRnJpIERlYyAgNiAyMzowMjoxNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LiAgaW5zdGFsbCB1c2luZworCSAgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuCisKKwkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIG5vdyBkb2VzIGFsbCBvZiBpdCdzIHdvcmsgZnJvbSBvYmpkaXIgc28KKwkgIG1ha2UgZmlsZSBleGlzdGVuY2UgdGVzdHMgYWdhaW5zdCAke3NyY2Rpcn0uCisKK1RodSBEZWMgIDUgMjI6NDY6MjIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCisJICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCisJICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgorCitXZWQgRGVjICA0IDIyOjQyOjAzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjkzLgorCSogTWFrZWZpbGUuaW46ICBBZGQgbWFrZS1zdHJpcC5vOm1heWJlLXN0cmlwLmMgZGVwZW5kZW5jeQorCWZvciBtYWtlIHZlcnNpb25zIHRoYXQgcHJvdmlkZSBoYWxmLWJha2VkIFZQQVRILXN1cHBvcnQgKGUuZy4gU3VuJ3MpLgorCSogc2l6ZS5jOiAgSW1wcm92ZW1lbnRzIHN1Z2dlc3RlZCBieQorCSJkYXZpZCBkIFt6b29dIHp1aG4iIDx6b29AYXBzMS5zcGEudW1uLmVkdT46CisJLSBEb24ndCBlbWl0IChCZXJrZWxleSkgaGVhZGVycyBpZiBubyBmaWxlcyB3ZXJlIGZvdW5kLgorCS0gUmV0dXJuIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUgb24gZmFpbHVyZS4KKworU2F0IE5vdiAzMCAyMTozNDoxOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCUNoYW5nZXMgZHVlIHRvIGluY2x1ZGUgZmlsZSByZW5hbWluZzoKKwkqIGFtMjlrLXBpbnNuLmM6IGEyOWstb3Bjb2RlLmgJLT4gb3Bjb2RlL2EyOWsuaAorCSogc3BhcmMtcGluc24uYzogc3BhcmMtb3Bjb2RlLmgJLT4gb3Bjb2RlL3NwYXJjLmgKKwkqIG02OGstcGluc24uYzoJIG02OGstb3Bjb2RlLmgJLT4gb3Bjb2RlL202OGsuaAorCSogbm0uYzoJCSBzdGFiLmdudS5oCS0+IGFvdXQvc3RhYl9nbnUuaAorCitUdWUgTm92IDE5IDE5OjIwOjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBSRUFETUU6ICBNZW50aW9uIE1JTklNSVpFIGZsYWcgZm9yIGJmZCdzIG1ha2UuCisKK01vbiBOb3YgMTggMTI6MDU6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIFZhcmlvdXMgaW1wcm92ZW1lbnRzLgorCitTdW4gTm92IDE3IDIzOjQwOjU5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjkyLgorCSogdmVyc2lvbi5jLCBNYWtlZmlsZS5pbjogIEdldCB2ZXJzaW9uIHN0cmluZyBmcm9tIE1ha2VmaWxlLgorCSogY29weS5jLCBpcy1zdHJpcC5jLCBub3Qtc3RyaXAuYywgbWF5YmUtc3RyaXAuYywgTWFrZWZpbGUuaW46CisJTWFrZSB0aGUgc2FtZSBjaGFuZ2UgdGhhdCB3ZSBlYXJsaWVyIGRpZCBmb3IgYXIvcmFubGliOgorCUdlbmVyYXRlIHR3byBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIHN0cmlwIGFuZCBjb3B5IGFuZCB1c2UKKwlhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2gKKwlvc3RyaXAgZnJvbSBjb3B5LiAgKC0xIG1lYW5zIHRvIHVzZSBhcmd2WzBdIHRvIGRlY2lkZSwKKwlzbyB5b3UgY2FuIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBidXQgaXQgaXMgbm8gbG9uZ2VyIHRoZSBkZWZhdWx0KS4KKwkqIGNvcHkuYyAoY29weV9maWxlKTogIFNldCBFWEVDX1Agb2Ygb3V0cHV0IGJmZCBpZiBpbnB1dCBpcyBzby4KKwkqIGNvcHkuYyAobWFpbik6ICBJZiBpc19zdHJpcD09LTEsIGNvbXBhcmUgbGFzdCA1IGNoYXJzCisJb2YgYXJndlswXSwgbm90IHRoZSB3aG9sZSBwYXRoLgorCSogY29weS5jIChtYWluKTogUmV0dXJuIDAsIG5vdCAxLgorCSogY29weS5jIChzZXR1cF9zZWN0aW9ucyk6ICBGaXggZHVlIHRvIGNoYW5nZSBpbiBiZmRfbWFrZV9zZWN0aW9uCisJbm93IGZhaWxpbmcgaWYgYXNrZWQgZm9yIGEgZHVwbGljYXRlIHNlY3Rpb24uCisJKiBzdHJpcC5jLCBvc3RyaXAuYzogIFJlbW92ZWQgb2Jzb2xldGUgZmlsZXMuCisJKiBhci5jLCBub3QtcmFubGliLmMsIG1heWJlLXJhbmxpYi5jOgorCUNoYW5nZSBlbmNvZGluZyBvZiBpc19yYW5saWIgdmFyaWFibGUgdG8gYmUgY29uc2lzdGVudAorCXdpdGggaXNfc3RyaXAgZm9yIHN0cmlwLmNvcHkgKGkuZSAtMSB0byBtZWFucyB1c2UgYXJndlswXSkuCisKK1RodSBOb3YgMTQgMjA6MTE6MDIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIHZlcnNpb24uYyAocHJvZ3JhbV92ZXJzaW9uKTogVXBkYXRlIHRvIHZlcnNpb24gMS45Mi4KKworVHVlIE5vdiAxMiAxNjoxNzo1MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogYXIuYyAoZ2V0X3Bvc19iZmQpOiAgUHJldmlvdXMgZml4IHdhcyBtaXNzaW5nIGEgImJyZWFrIi4KKworVGh1IE5vdiAgNyAwODo1NTo1NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQorCisJKiBhbTI5ay1waW5zbi5jOiBGaXhlZCBidWcgaW4gbXRhY2MsIGRtYWMgYW5kIGZtYWMgaW5zdHJ1Y3Rpb24KKwllbmNvZGluZ3MuIChUaGFrcyB0byBEYXZpZCBXb29kKQorCitTdW4gTm92ICAzIDE0OjUwOjIzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoJChESVNUX05BTUUpLnRhci5aKSwgVE9ETzogIFZhcmlvdXMgZml4ZXMuCisJKiBhci5jIChnZXRfcG9zX2JmZCk6IEZpeCB0byBoYW5kbGluZyBvZiBiZWZvcmUvYWZ0ZXIKKwlwb3NpdGlvbmluZyBvcHRpb25zLgorCSogYnVjb21tLmMgKGZhdGFsKTogIE1JU1NJTkdfVkZQUklOVEYgaXMgbm8gbG9uZ2VyIGFuIGlzc3VlLAorCXNpbmNlIGxpYmliZXJ0eSBjb250YWlucyB2ZnByaW50ZiBldGMgaWYgb3RoZXJ3aXNlIG1pc3NpbmcuCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogIFN1cHBvcnQgQkIvQlcvQkwKKwl0eXBlIG9wZXJhbmRzLCBhcyB1c2VkIGJ5IGJyYW5jaCBpbnN0cnVjdGlvbnMuCisJKiBubS5jOiAgRGVsZWdhdGUgcHJpbnRpbmcgb2Ygc3ltYm9scyB0byBCRkQsCisJYnkgdXNpbmcgYmZkX3ByaW50X3N5bWJvbCB0byBkbyB0aGUgZm9ybWF0dGluZy4KKworTW9uIE9jdCAyOCAxMToyMDo0NyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIGFyLmMgKHdyaXRlX2FyY2hpdmUuYyk6IGFkZGVkIHVubGluayBiZWZvcmUgcmVuYW1lIHNpbmNlIHNvbWUKKwlzeXN0ZW1zIGNhbid0IHJlbmFtZSBvbnRvIGFuIGV4aXN0YW50IGZpbGUuCisKK01vbiBPY3QgMjEgMDk6NDc6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogbm0uYzogbm93IGRvZXNuJ3QgY3Jhc2ggaWYgYSBzeW1ib2wgd2l0aCBubyBzZWN0aW9uIGFuZCBubworCVNFQ19BQlMgYXBwZWFycy4KKworVGh1IE9jdCAxNyAxNToyNTo1MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIHZlcnNpb24uYzogIEJ1bXAgdG8gdmVyc2lvbiAxLjkxLgorCitXZWQgT2N0IDE2IDExOjQ1OjM2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgYXIuYywgYnVjb21tLmMsIGNvcHkuYywgY3BsdXMtZGVtLmMsIGZpbGVtb2RlLmMsCisJaTk2MC1waW5zbi5jLCBtNjhrLXBpbnNuLmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jLCBzcGFyYy1waW5zbi5jLAorCSogc3RyaXAuYzogQWRkIG9yIHVwZGF0ZSBDb3B5cmlnaHQgbm90aWNlLgorCSogVE9ETzogIEFkZCBub3RlIG9uICdubSAtYScuCisJKiB2ZXJzaW9uLmM6IFVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAxLjkwLgorCSogTWFrZWZpbGUuaW46IEZpeCBtYWtpbmcgb2YgZG9jdW1lbnRhdGlvbiBmb3IgZGlzdC4KKworVHVlIE9jdCAxNSAwMDoxNzoxNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluOiBOZXcga2x1ZGd5IHJ1bGVzIGZvciBtYWtpbmcgYSB0YXJmaWxlLgorCSogTWFrZWZpbGUuaW46IEZpeCBiaW5kaXIgcGF0aC4KKworTW9uIE9jdCAxNCAxNzozNDoyOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkIHRhcmdldHMgYmludXRpbHMubW0sIGJpbnV0aWxzLm1lCisKK0ZyaSBPY3QgMTEgMjI6NDQ6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncyBieSBhZGRpbmcgZGVwZW5kZW5jaWVzLgorCitGcmkgT2N0IDExIDEyOjUxOjMzIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgdGFyZ2V0ICJiaW51dGlscy5tcyIKKworCSogYmludXRpbHMudGV4aW5mbzogbWlub3IgcmVzdHJ1Y3R1cmluZyBmb3IgdGV4aTJyb2ZmIGNvbWZvcnQuCisKK0ZyaSBPY3QgMTEgMDQ6MTI6MjggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCisKKwkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCisJKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byAuLi9iZmQvaG9zdHMvaC14eHguaC4KKwlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KKwkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQorCWdldCBkZWZpbmVkIGZpcnN0LgorCSogTWFrZWZpbGUuaW46ICBVc2UgLUkuIHRvIGdldCBzeXNkZXAuaC4KKworV2VkIE9jdCAgOSAyMjo0Mjo1NiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbm0uYyAocHJpbnRfc3ltYm9scyk6ICBIYW5kbGUgTlVMTCBuYW1lIGZpZWxkIG9mIHN5bWJvbC4KKwkqIE1ha2VmaWxlLmluOiBSZW1vdmVkIHNwdXJpb3VzIGNvbW1lbnQuCisKK1R1ZSBPY3QgIDggMTY6NTU6MDMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMudGV4aW5mbzogbWlub3IgdHlwb3MsIHBocmFzaW5nLCBmb3JtYXR0aW5nIGZpeGVzLgorCitUdWUgT2N0ICA4IDE1OjEzOjIwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEdldCBob3N0IGZpbGUgZnJvbSAuLi9iZmQvY29uZmlnLCBub3QgY29uZmlnLgorCSogY29uZmlnLyo6IFJlbW92ZSBjb25maWcgZGlyZWN0b3J5IGFuZCBpdHMgZmlsZXMuCisKK1R1ZSBPY3QgIDggMTM6NTg6NTkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG5ldyB0YXJnZXRzIGJpbnV0aWxzLmR2aSwgYmludXRpbHMuaW5mbworCisJKiBiaW51dGlscy50ZXhpbmZvOiByZW1vdmUgbW9zdCByZW1haW5pbmcgRklYTUUncywgZGVsZXRlCisJcmVmZXJlbmNlcyB0byBfXy5TWU1ERUYgYnkgbmFtZQorCisKK1R1ZSBPY3QgIDggMTA6MjM6NDQgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCisJKiBvYmpkdW1wLmMgKHByaW50X2FkZHJlc3MpIFByaW50IGFkZHJlc3NlcyBuaWNlbHkuCisKK01vbiBPY3QgIDcgMTE6MzE6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGFyLmMsIE1ha2VmaWxlLmluLCBuZXcgZmlsZXMge2lzLG5vdCxtYXliZX0tcmFubGliLmM6CisJTWFrZSB0d28gZGlmZmVyZW50IGJpbmFyaWVzIGZvciBhciBhbmQgcmFubGliLCBpbnN0ZWFkIG9mCisJZGlzdGluZ3Vpc2hpbmcgdGhlbSBhdCBydW4gdGltZSB1c2luZyBhcmd2WzBdLgorCShPbGQgYmVoYXZpb3IgaXMgc3RpbGwgYXZhaWxhYmxlIGlmIHlvdSAibWFrZSBhcl93aXRoX3JhbmxpYiIsCisJYnV0IGl0IGlzIG5vdCB0aGUgZGVmYXVsdC4pCisJKiByYW5saWIuc2ggKG5ldyk6ICBBbiBhbHRlcm5hdGl2ZSBvbmUtbGluZQorCXNoZWxsIGltcGxlbWVudGF0aW9uIG9mIHJhbmxpYi4KKworRnJpIE9jdCAgNCAyMTo0OTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogb2JqZHVtcC5jOiAgQ29wZSB3aXRoIHJlbmFtZXMgb2YgYSBmZXcgQkZEIHR5cGVzICYgZW51bXMuCisKK0ZyaSBPY3QgIDQgMTk6MDg6MDkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMudGV4aW5mbzogYWRkIG5ldyBmaWxlIChydWRpbWVudGFyeSBkb2NuKQorCitNb24gU2VwIDMwIDEyOjMwOjM5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcvaG1ha2UtbmV3czogQWRkIG5ldyBmaWxlIChmb3IgU29ueSBORVdTT1MzKS4KKwkqIGJ1Y29tbS5jIChmYXRhbCk6ICBDb25kaXRpb25hbGx5IGNvbXBpbGUgZmF0YWwoKSBkZXBlbmRpbmcgb24KKwlNSVNTSU5HX1ZGUFJJTlRGLCBhbmQgZG9uJ3QgY29uZnVzZSB0aGUgaXNzdWUgd2l0aCBOT19WQVJBUkdTLgorCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiAgVHJpdmlhbCBvdXRwdXQgZm9ybWF0IGNoYW5nZS4KKwkqIG9iamR1bXAuYyAoZGlzcGxheV9pbmZvKTogTG9vcCBvdmVyIGludGVnZXJzLCBub3QgZW51bXMsCisJdG8gYXBwZWFzZSBvbGQgY29tcGlsZXJzLgorCitNb24gTWF5IDIwIDE2OjE0OjA3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKyAgICAgICAgKm9iamR1bXAuYyAqbm0uYyAqY29weS5jIDpoYW5nZWQgc29tZSB0eXBlcyB0byB3b3JrIHdpdGggNjQgYml0IG9iamVjdCBmaWxlcworCitUaHUgTWF5IDE2IDE2OjA2OjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCisgICAgIGZyb20gYm90aGVyCisJKiBvYmpkdW1wLmMgKHByaW50X2FkZHJlc3MpOiBNYWtlIGRpc2FzZW1ibGVkIG91dHB1dCBtb3JlCisJY29uc2lzdGVudCB3aXRoIGdkYiBhbmQgYXM6IEFkZCAweCB3aGVuIHByaW50aW5nIGhleC4KKwlEb24ndCBwcmludCBleHRyYSBsZWFkaW5nIHplcm9zLgorCUF0dGVtcHQgdG8gbm90IHByaW50ICJmaWxlbmFtZS5vIi4KKwkqIG9iamR1bXAuYzogQWRkIHNvbWUgZW51bS10by1pbnQgY2FzdHMgdG8gYWNjb21vZGF0ZSBvbGQgY29tcGlsZXJzLgorCisKK0ZyaSBNYXkgIDMgMjI6MjE6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBjb3B5LmM6ICBDaGFuZ2UgPSYgY29uc3RydWN0cyB0byA9ICYsIHNpbmNlIHRoZXkgY29uZnVzZSBvbGRlcgorCUMgY29tcGlsZXJzLgorCisMCitMb2NhbCBWYXJpYWJsZXM6Cittb2RlOiBjaGFuZ2UtbG9nCitsZWZ0LW1hcmdpbjogOAorZmlsbC1jb2x1bW46IDc0Cit2ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCitFbmQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9NYWtlZmlsZS5hbSBiL2JpbnV0aWxzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzAxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ5NSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgorCisjIyBGSVhNRTogV29yayBhcm91bmQgYXBwYXJlbnQgYnVnIGluIGF1dG9tYWtlLgorSU5UTExJQlMgPSBASU5UTExJQlNACisKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQorCitTVUJESVJTID0gcG8KKwordG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQorCisjIyBUaGVzZSBhcmVuJ3Qgc2V0IGJ5IGF1dG9tYWtlLCBiZWNhdXNlIHRoZXkgYXBwZWFyIGluCisjIyBiZmQvYWNpbmNsdWRlLm00LCB3aGljaCBpcyBpbmNsdWRlZCBieSBiaW51dGlscy9hY2luY2x1ZGUubTQsIGFuZAorIyMgdGh1cyBpcyBub3Qgc2VlbiBieSBhdXRvbWFrZS4KK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitFWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACisKK1lBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAorWUZMQUdTID0gLWQKK0xFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCisKKyMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQorQVJfUFJPRz1hcgorUkFOTElCX1BST0c9cmFubGliCisKKyMgb2JqY29weSBhbmQgc3RyaXAgc2hvdWxkIGJlIHRoZSBzYW1lIHByb2dyYW0KK09CSkNPUFlfUFJPRz1vYmpjb3B5CitTVFJJUF9QUk9HPXN0cmlwLW5ldworCitTVFJJTkdTX1BST0c9c3RyaW5ncworCitSRUFERUxGX1BST0c9cmVhZGVsZgorCisjIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCitTSVpFX1BST0c9c2l6ZQorTk1fUFJPRz1ubS1uZXcKK09CSkRVTVBfUFJPRz1vYmpkdW1wCisKKyMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KKyMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgorREVNQU5HTEVSX1BST0c9YysrZmlsdAorCitBRERSMkxJTkVfUFJPRz1hZGRyMmxpbmUKKworTkxNQ09OVl9QUk9HPW5sbWNvbnYKK0RMTFRPT0xfUFJPRz1kbGx0b29sCitXSU5EUkVTX1BST0c9d2luZHJlcworRExMV1JBUF9QUk9HPWRsbHdyYXAKKworU1JDT05WX1BST0c9c3Jjb252JChFWEVFWFQpIHN5c2R1bXAkKEVYRUVYVCkgY29mZmR1bXAkKEVYRUVYVCkgCisKK21hbl9NQU5TID0gYXIuMSBubS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEgc3RyaW5ncy4xIHN0cmlwLjEgb2JqY29weS4xIFwKKwlhZGRyMmxpbmUuMSBubG1jb252LjEgJChERU1BTkdMRVJfUFJPRykuMQorCitQUk9HUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChOTV9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFNUUklQX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAorCitiaW5fUFJPR1JBTVMgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAorCisjIyBXZSBuZWVkIGEgc3BlY2lhbCBydWxlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIHdoaWNoIGFyZSBidWlsdCB3aXRoIC1uZXcKK25vaW5zdF9QUk9HUkFNUyA9ICQoTk1fUFJPRykgJChTVFJJUF9QUk9HKQorCitFWFRSQV9QUk9HUkFNUyA9ICQoTkxNQ09OVl9QUk9HKSBzcmNvbnYgc3lzZHVtcCBjb2ZmZHVtcCAkKERMTFRPT0xfUFJPRykgJChXSU5EUkVTX1BST0cpICQoRExMV1JBUF9QUk9HKQorCisjIFN0dWZmIHRoYXQgZ29lcyBpbiB0b29sZGlyLyBpZiBhcHByb3ByaWF0ZQorVE9PTF9QUk9HUyA9IG5tLW5ldyBzdHJpcC1uZXcgYXIgcmFubGliIGRsbHRvb2wKKworQkFTRURJUiA9ICQoc3JjZGlyKS8uLgorQkZERElSID0gJChCQVNFRElSKS9iZmQKK0lOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQorCitERVAgPSBta2RlcAorCitJTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgorCitIRklMRVMgPSBhcnN1cC5oIGJ1Y29tbS5oIGJ1ZGJnLmggY29mZmdyb2suaCBkZWJ1Zy5oIG5sbWNvbnYuaCBkbGx0b29sLmggXAorCXdpbmRyZXMuaCB3aW5kdW5pLmggZHluLXN0cmluZy5oCisKK0dFTkVSQVRFRF9IRklMRVMgPSBhcnBhcnNlLmggc3lzcm9mZi5oIHN5c2luZm8uaCBkZWZwYXJzZS5oCisKK0NGSUxFUyA9IGFkZHIybGluZS5jIGFyLmMgYXJzdXAuYyBidWNvbW0uYyBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgZGVidWcuYyBcCisJZGxsdG9vbC5jIGZpbGVtb2RlLmMgaWVlZS5jIGlzLXJhbmxpYi5jIGlzLXN0cmlwLmMgbWF5YmUtcmFubGliLmMgXAorCW1heWJlLXN0cmlwLmMgbmxtY29udi5jIG5tLmMgbm90LXJhbmxpYi5jIG5vdC1zdHJpcC5jIFwKKwlvYmpjb3B5LmMgb2JqZHVtcC5jIHByZGJnLmMgcmRjb2ZmLmMgcmRkYmcuYyBzaXplLmMgc3Jjb252LmMgXAorCXN0YWJzLmMgc3RyaW5ncy5jIHN5c2R1bXAuYyB2ZXJzaW9uLmMgd3JzdGFicy5jIFwKKwl3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgd2luZHVuaS5jIHJlYWRlbGYuYyBcCisJcmVzcmVzLmMgZHluLXN0cmluZy5jIGRsbHdyYXAuYyByZW5hbWUuYworCitHRU5FUkFURURfQ0ZJTEVTID0gXAorCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKKwlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCisKK0RFQlVHX1NSQ1MgPSByZGRiZy5jIGRlYnVnLmMgc3RhYnMuYyBpZWVlLmMgcmRjb2ZmLmMKK1dSSVRFX0RFQlVHX1NSQ1MgPSAkKERFQlVHX1NSQ1MpIHdyc3RhYnMuYworCisjIENvZGUgc2hhcmVkIGJ5IGFsbCB0aGUgYmludXRpbHMuCitCVUxJQlMgPSBidWNvbW0uYyB2ZXJzaW9uLmMgZmlsZW1vZGUuYworCitCRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCisKK09QQ09ERVMgPSAuLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKKworTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCisKK1BPVEZJTEVTID0gJChDRklMRVMpICQoREVCVUdfU1JDUykgJChIRklMRVMpCitwby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQorCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAorCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgorCitFWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCisgICAgICAgICAgZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKKyAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCitSVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCisgICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKKyAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCisKK0NDX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAorICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCisgICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAorICAgIGVsc2UgXAorICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAorICAgIGZpOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDQyk7IFwKKyAgICBlbHNlIFwKKyAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCisgICAgZmk7IFwKKyAgZmlgCisKK2NoZWNrLURFSkFHTlU6IHNpdGUuZXhwCisJc3JjZGlyPWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY2RpcjsgXAorCXI9YHB3ZGA7IGV4cG9ydCByOyBcCisJRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAorCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCisJICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCisJICBleHBvcnQgVENMX0xJQlJBUlk7IFwKKwlmaTsgXAorCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAorCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAorCQlDQ19GT1JfVEFSR0VUPSIkKENDX0ZPUl9UQVJHRVQpIiBcCisJCUNGTEFHU19GT1JfVEFSR0VUPSIkKENGTEFHUykiICQoUlVOVEVTVEZMQUdTKTsgXAorCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCisJZmkKKworaW5zdGFsbGNoZWNrOgorCS9iaW4vc2ggJChzcmNkaXIpL3Nhbml0eS5zaCAkKGJpbmRpcikKKworaW5mb19URVhJTkZPUyA9IGJpbnV0aWxzLnRleGkKKworTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCisKK3NpemVfU09VUkNFUyA9IHNpemUuYyAkKEJVTElCUykKKworb2JqY29weV9TT1VSQ0VTID0gb2JqY29weS5jIG5vdC1zdHJpcC5jIHJlbmFtZS5jICQoV1JJVEVfREVCVUdfU1JDUykgJChCVUxJQlMpCisKK3N0cmluZ3NfU09VUkNFUyA9IHN0cmluZ3MuYyAkKEJVTElCUykKKworcmVhZGVsZl9TT1VSQ0VTID0gcmVhZGVsZi5jIHZlcnNpb24uYworcmVhZGVsZl9MREFERCAgID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCisKK3N0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKKworbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQorCitvYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQorb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQorCit1bmRlcnNjb3JlLmM6IHN0YW1wLXVuZGVyIDsgQHRydWUKKworc3RhbXAtdW5kZXI6IE1ha2VmaWxlCisJZWNobyAnLypXQVJOSU5HOiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQhKi8nID51bmRlcnNjb3JlLnQKKwllY2hvICJpbnQgcHJlcGVuZHNfdW5kZXJzY29yZSA9IEBVTkRFUlNDT1JFQDsiID4+dW5kZXJzY29yZS50CisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHVuZGVyc2NvcmUudCB1bmRlcnNjb3JlLmMKKwl0b3VjaCBzdGFtcC11bmRlcgorCitjcGx1cy1kZW0ubzogJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMgJChJTkNESVIpL2dldG9wdC5oCisJJChDT01QSUxFKSAtYyAtRE1BSU4gLURWRVJTSU9OPSciJChWRVJTSU9OKSInICQoQkFTRURJUikvbGliaWJlcnR5L2NwbHVzLWRlbS5jCisKK2NfX2ZpbHRfU09VUkNFUyA9CitjX19maWx0X0xEQUREID0gY3BsdXMtZGVtLm8gdW5kZXJzY29yZS5vICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQorCithcl9TT1VSQ0VTID0gYXJwYXJzZS55IGFybGV4LmwgYXIuYyBub3QtcmFubGliLmMgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKK2FyX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQorCityYW5saWJfU09VUkNFUyA9IGFyLmMgaXMtcmFubGliLmMgYXJwYXJzZS55IGFybGV4LmwgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKK3JhbmxpYl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKKworYWRkcjJsaW5lX1NPVVJDRVMgPSBhZGRyMmxpbmUuYyAkKEJVTElCUykKKworIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgorIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKKyMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgorIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgorIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQorIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KKyMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCisjCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQorIwktcm0gLWYgJChSQU5MSUJfUFJPRykKKyMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKKyMKKyMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KKyMKKyNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubworIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKKyMJLXJtIC1mICQoU1RSSVBfUFJPRykKKyMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCisKK3N5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAorCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYworCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKKwkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCisKK3N5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCisJLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCisKK3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KKwkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAorCitzeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCisJaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKKwkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCisJZWxzZSBcCisJICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKKwlmaQorCitzeXNpbmZvLm86IHN5c2luZm8uYworCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAorCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCisJZWxzZSBcCisJICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAorCWZpCisKK3NyY29udl9TT1VSQ0VTID0gc3Jjb252LmMgY29mZmdyb2suYyAkKEJVTElCUykKKworZGxsdG9vbF9TT1VSQ0VTID0gZGxsdG9vbC5jIGRlZnBhcnNlLnkgZGVmbGV4LmwgJChCVUxJQlMpCitkbGx0b29sX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQorCitkbGx0b29sLm86ZGxsdG9vbC5jCisJJChDT01QSUxFKSAtYyAkKERMTFRPT0xfREVGUykgJChzcmNkaXIpL2RsbHRvb2wuYworCitjb2ZmZHVtcF9TT1VSQ0VTID0gY29mZmR1bXAuYyBjb2ZmZ3Jvay5jICQoQlVMSUJTKQorCitzeXNkdW1wX1NPVVJDRVMgPSBzeXNkdW1wLmMgJChCVUxJQlMpCisKKyMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQorIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCitubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCisJbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAorCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYworCitubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCisKK3dpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCisJd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQord2luZHJlc19MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKKworZGxsd3JhcF9TT1VSQ0VTID0gZGxsd3JhcC5jIGR5bi1zdHJpbmcuYyAKK2RsbHdyYXBfTERBREQgPSAkKExJQklCRVJUWSkKKworCitESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCisJc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYworCitkaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCisKK0RJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCisJc2l0ZS5leHAgc2l0ZS5iYWsKKworIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCisjIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgorLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAorCXJtIC1mIC5kZXAxCisJJChNQUtFKSBERVA9JChERVApIC5kZXAxCisJc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCisKKyMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCisuZGVwMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKKwlybSAtZiAuZGVwMgorCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKKwkkKERFUCkgLWYgLmRlcDIgJChJTkNMVURFUykgJD8KKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKKworZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCisJb2JqZGlyPWBwd2RgOyBcCisJc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCisJCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKKwkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAorCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwlcCisJCS1lICJzIUBPQkpESVJAISQke29iamRpcn0hIgorCitkZXA6IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQorCitkZXAtaW46IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCisKK2RlcC1hbTogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KKworLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQorCisjIyMKKyMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCitjb25maWcudGV4aTogTWFrZWZpbGUKKwlybSAtZiBjb25maWcudGV4aQorCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+IGNvbmZpZy50ZXhpCisKK2JpbnV0aWxzLmR2aTogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKKworYmludXRpbHMuaW5mbzogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBjb25maWcudGV4aQorCiskKERFTUFOR0xFUl9QUk9HKS4xOiBjeHhmaWx0Lm1hbiBNYWtlZmlsZQorCXNlZCAtZSAncy9AUFJPR1JBTUAvJChERU1BTkdMRVJfUFJPRykvJyA8ICQoc3JjZGlyKS9jeHhmaWx0Lm1hbiBcCisJCT4gJChERU1BTkdMRVJfUFJPRykuMQorCitNT1NUTFlDTEVBTkZJTEVTID0gc3lzaW5mbyAkKERFTUFOR0xFUl9QUk9HKS4xIGJpbnV0aWxzLmxvZyBiaW51dGlscy5zdW0gXAorCWFiY2RlZmdoKgorbW9zdGx5Y2xlYW4tbG9jYWw6CisJLXJtIC1yZiB0bXBkaXIKKworQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQorCisuUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbAorCitpbnN0YWxsLWV4ZWMtbG9jYWw6ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKKwlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCisJICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWRvbmUKKwkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCisJZm9yIGkgaW4gJChUT09MX1BST0dTKTsgZG8gXAorCSAgaWYgWyAtZiAkJGkkKEVYRUVYVCkgXTsgdGhlbiBcCisJICAgIGo9YGVjaG8gJCRpIHwgc2VkIC1lICdzLy1uZXcvLydgOyBcCisJICAgIGs9YGVjaG8gJCRqIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAorCSAgICBpZiBbICIkKGJpbmRpcikvJCRrJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpIiBdOyB0aGVuIFwKKwkgICAgICBybSAtZiAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKKwkgICAgICBsbiAkKGJpbmRpcikvJCRrJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKKwkJfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRpJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAorCSAgICBmaTsgXAorCSAgZWxzZSB0cnVlOyBcCisJICBmaTsgXAorCWRvbmUKKworIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KKyMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KKworYWRkcjJsaW5lLm86IGFkZHIybGluZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2RlbWFuZ2xlLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCithci5vOiBhci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2FvdXQvYXIuaCAkKEJGRERJUikvbGliYmZkLmggYXJzdXAuaAorYXJzdXAubzogYXJzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBhcnN1cC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCitidWNvbW0ubzogYnVjb21tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKK2NvZmZkdW1wLm86IGNvZmZkdW1wLmMgY29mZmdyb2suaCBidWNvbW0uaCBjb25maWcuaCBcCisgICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKK2NvZmZncm9rLm86IGNvZmZncm9rLmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgY29mZmdyb2suaAorZGVidWcubzogZGVidWcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIGRlYnVnLmgKK2RsbHRvb2wubzogZGxsdG9vbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRsbHRvb2wuaAorZmlsZW1vZGUubzogZmlsZW1vZGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCitpZWVlLm86IGllZWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2llZWUuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgZGVidWcuaCBidWRiZy5oCitpcy1yYW5saWIubzogaXMtcmFubGliLmMKK2lzLXN0cmlwLm86IGlzLXN0cmlwLmMKK21heWJlLXJhbmxpYi5vOiBtYXliZS1yYW5saWIuYworbWF5YmUtc3RyaXAubzogbWF5YmUtc3RyaXAuYworbmxtY29udi5vOiBubG1jb252LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICAkKEJGRERJUikvbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtY29udi5oCitubS5vOiBubS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9yYW5saWIuaCBcCisgICQoSU5DRElSKS9kZW1hbmdsZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAorbm90LXJhbmxpYi5vOiBub3QtcmFubGliLmMKK25vdC1zdHJpcC5vOiBub3Qtc3RyaXAuYworb2JqY29weS5vOiBvYmpjb3B5LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVkYmcuaAorb2JqZHVtcC5vOiBvYmpkdW1wLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKKyAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorcHJkYmcubzogcHJkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIGRlYnVnLmggYnVkYmcuaAorcmRjb2ZmLm86IHJkY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIFwKKyAgYnVkYmcuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK3JkZGJnLm86IHJkZGJnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICBkZWJ1Zy5oIGJ1ZGJnLmgKK3NpemUubzogc2l6ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAorc3Jjb252Lm86IHNyY29udi5jIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICBzeXNyb2ZmLmggY29mZmdyb2suaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN5c3JvZmYuYworc3RhYnMubzogc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKK3N0cmluZ3Mubzogc3RyaW5ncy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCitzeXNkdW1wLm86IHN5c2R1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHN5c3JvZmYuaCBcCisgIHN5c3JvZmYuYwordmVyc2lvbi5vOiB2ZXJzaW9uLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAord3JzdGFicy5vOiB3cnN0YWJzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCit3aW5kcmVzLm86IHdpbmRyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvZ2V0b3B0LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvb2JzdGFjay5oIHdpbmRyZXMuaCBcCisgIHdpbmR1bmkuaAorcmVzcmMubzogcmVzcmMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIHdpbmRyZXMuaCB3aW5kdW5pLmgKK3Jlc2NvZmYubzogcmVzY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgd2luZHJlcy5oIHdpbmR1bmkuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCityZXNiaW4ubzogcmVzYmluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICB3aW5kcmVzLmggd2luZHVuaS5oCit3aW5kdW5pLm86IHdpbmR1bmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHdpbmR1bmkuaAorcmVhZGVsZi5vOiByZWFkZWxmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9kd2FyZjIuaCAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL21pcHMuaCBcCisgICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvbTY4ay5oIFwKKyAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvZDEwdi5oIFwKKyAgJChJTkNESVIpL2VsZi9kMzB2LmggJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvbW4xMDIwMC5oIFwKKyAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCisgICQoSU5DRElSKS9lbGYvZnIzMC5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICAkKElOQ0RJUikvZ2V0b3B0LmgKK3Jlc3Jlcy5vOiByZXNyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIHdpbmRyZXMuaCB3aW5kdW5pLmgKK2R5bi1zdHJpbmcubzogZHluLXN0cmluZy5jIGNvbmZpZy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgZHluLXN0cmluZy5oCitkbGx3cmFwLm86IGRsbHdyYXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoSU5DRElSKS9nZXRvcHQuaCBkeW4tc3RyaW5nLmgKK3JlbmFtZS5vOiByZW5hbWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCit1bmRlcnNjb3JlLm86IHVuZGVyc2NvcmUuYworYXJwYXJzZS5vOiBhcnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBhcnN1cC5oCithcmxleC5vOiBhcmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCBhcnBhcnNlLmgKK3N5c3JvZmYubzogc3lzcm9mZi5jCitzeXNpbmZvLm86IHN5c2luZm8uYworc3lzbGV4Lm86IHN5c2xleC5jIHN5c2luZm8uaAorZGVmcGFyc2UubzogZGVmcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGRsbHRvb2wuaAorZGVmbGV4Lm86IGRlZmxleC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGRlZnBhcnNlLmggZGxsdG9vbC5oCitubG1oZWFkZXIubzogbmxtaGVhZGVyLmMgLi4vYmZkL2JmZC5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKKyAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCisgIG5sbWNvbnYuaAorcmNwYXJzZS5vOiByY3BhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICB3aW5kcmVzLmggd2luZHVuaS5oCityY2xleC5vOiByY2xleC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgd2luZHJlcy5oIHdpbmR1bmkuaCByY3BhcnNlLmgKKworIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9iaW51dGlscy9NYWtlZmlsZS5pbiBiL2JpbnV0aWxzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmFlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDEzNTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKworU0hFTEwgPSBAU0hFTExACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2JpbmRpciA9IEBiaW5kaXJACitzYmluZGlyID0gQHNiaW5kaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2xpYmRpciA9IEBsaWJkaXJACitpbmZvZGlyID0gQGluZm9kaXJACittYW5kaXIgPSBAbWFuZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQorCitERVNURElSID0KKworcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKKwordG9wX2J1aWxkZGlyID0gLgorCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK3RyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK0FSID0gQEFSQAorQVMgPSBAQVNACitCVUlMRF9ETExUT09MID0gQEJVSUxEX0RMTFRPT0xACitCVUlMRF9ETExXUkFQID0gQEJVSUxEX0RMTFdSQVBACitCVUlMRF9NSVNDID0gQEJVSUxEX01JU0NACitCVUlMRF9OTE1DT05WID0gQEJVSUxEX05MTUNPTlZACitCVUlMRF9TUkNPTlYgPSBAQlVJTERfU1JDT05WQAorQlVJTERfV0lORFJFUyA9IEBCVUlMRF9XSU5EUkVTQAorQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorQ0MgPSBAQ0NACitEQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0RMTFRPT0xfREVGUyA9IEBETExUT09MX0RFRlNACitFWEVFWFQgPSBARVhFRVhUQAorR01PRklMRVMgPSBAR01PRklMRVNACitHTVNHRk1UID0gQEdNU0dGTVRACitHVF9OTyA9IEBHVF9OT0AKK0dUX1lFUyA9IEBHVF9ZRVNACitIREVGSU5FUyA9IEBIREVGSU5FU0AKK0lOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKK0lOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKK0lOVExERVBTID0gQElOVExERVBTQAorSU5UTE9CSlMgPSBASU5UTE9CSlNACitMRCA9IEBMREAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xOX1MgPSBATE5fU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitNU0dGTVQgPSBATVNHRk1UQAorTkxNQ09OVl9ERUZTID0gQE5MTUNPTlZfREVGU0AKK05NID0gQE5NQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUE9GSUxFUyA9IEBQT0ZJTEVTQAorUE9TVUIgPSBAUE9TVUJACitSQU5MSUIgPSBAUkFOTElCQAorVU5ERVJTQ09SRSA9IEBVTkRFUlNDT1JFQAorVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACitVU0VfTkxTID0gQFVTRV9OTFNACitVU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorbCA9IEBsQAorCitJTlRMTElCUyA9IEBJTlRMTElCU0AKKworQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251CisKK1NVQkRJUlMgPSBwbworCit0b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCisKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitFWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACisKK1lBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAorWUZMQUdTID0gLWQKK0xFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCisKKyMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQorQVJfUFJPRyA9IGFyCitSQU5MSUJfUFJPRyA9IHJhbmxpYgorCisjIG9iamNvcHkgYW5kIHN0cmlwIHNob3VsZCBiZSB0aGUgc2FtZSBwcm9ncmFtCitPQkpDT1BZX1BST0cgPSBvYmpjb3B5CitTVFJJUF9QUk9HID0gc3RyaXAtbmV3CisKK1NUUklOR1NfUFJPRyA9IHN0cmluZ3MKKworUkVBREVMRl9QUk9HID0gcmVhZGVsZgorCisjIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCitTSVpFX1BST0cgPSBzaXplCitOTV9QUk9HID0gbm0tbmV3CitPQkpEVU1QX1BST0cgPSBvYmpkdW1wCisKKyMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KKyMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgorREVNQU5HTEVSX1BST0cgPSBjKytmaWx0CisKK0FERFIyTElORV9QUk9HID0gYWRkcjJsaW5lCisKK05MTUNPTlZfUFJPRyA9IG5sbWNvbnYKK0RMTFRPT0xfUFJPRyA9IGRsbHRvb2wKK1dJTkRSRVNfUFJPRyA9IHdpbmRyZXMKK0RMTFdSQVBfUFJPRyA9IGRsbHdyYXAKKworU1JDT05WX1BST0cgPSBzcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKKworbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAorCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9QUk9HKS4xCisKKworUFJPR1MgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoTk1fUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChTVFJJUF9QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKKworYmluX1BST0dSQU1TID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKKworbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpCisKK0VYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCisKKyMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCitUT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAorCitCQVNFRElSID0gJChzcmNkaXIpLy4uCitCRkRESVIgPSAkKEJBU0VESVIpL2JmZAorSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCisKK0RFUCA9IG1rZGVwCisKK0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCisKK0hGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCisJd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKKworCitHRU5FUkFURURfSEZJTEVTID0gYXJwYXJzZS5oIHN5c3JvZmYuaCBzeXNpbmZvLmggZGVmcGFyc2UuaAorCitDRklMRVMgPSBhZGRyMmxpbmUuYyBhci5jIGFyc3VwLmMgYnVjb21tLmMgY29mZmR1bXAuYyBjb2ZmZ3Jvay5jIGRlYnVnLmMgXAorCWRsbHRvb2wuYyBmaWxlbW9kZS5jIGllZWUuYyBpcy1yYW5saWIuYyBpcy1zdHJpcC5jIG1heWJlLXJhbmxpYi5jIFwKKwltYXliZS1zdHJpcC5jIG5sbWNvbnYuYyBubS5jIG5vdC1yYW5saWIuYyBub3Qtc3RyaXAuYyBcCisJb2JqY29weS5jIG9iamR1bXAuYyBwcmRiZy5jIHJkY29mZi5jIHJkZGJnLmMgc2l6ZS5jIHNyY29udi5jIFwKKwlzdGFicy5jIHN0cmluZ3MuYyBzeXNkdW1wLmMgdmVyc2lvbi5jIHdyc3RhYnMuYyBcCisJd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHdpbmR1bmkuYyByZWFkZWxmLmMgXAorCXJlc3Jlcy5jIGR5bi1zdHJpbmcuYyBkbGx3cmFwLmMgcmVuYW1lLmMKKworCitHRU5FUkFURURfQ0ZJTEVTID0gXAorCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKKwlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCisKKworREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYworV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCisKKyMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KK0JVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCisKK0JGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKKworT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQorCitMSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKKworUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKKworRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAorICAgICAgICAgIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCisgICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAorCitSVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCisgICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKKyAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCisKKworQ0NfRk9SX1RBUkdFVCA9IGAgXAorICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCisgICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCisgICAgZmk7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAorICAgICAgZWNobyAkKENDKTsgXAorICAgIGVsc2UgXAorICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKKyAgICBmaTsgXAorICBmaWAKKworCitpbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQorCitMREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKKworc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQorCitvYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKKworc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQorCityZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCityZWFkZWxmX0xEQUREID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCisKK3N0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKKworbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQorCitvYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQorb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQorCitjX19maWx0X1NPVVJDRVMgPSAKK2NfX2ZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCisKK2FyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQorYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCisKK3JhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQorcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQorCithZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQorCitzcmNvbnZfU09VUkNFUyA9IHNyY29udi5jIGNvZmZncm9rLmMgJChCVUxJQlMpCisKK2RsbHRvb2xfU09VUkNFUyA9IGRsbHRvb2wuYyBkZWZwYXJzZS55IGRlZmxleC5sICQoQlVMSUJTKQorZGxsdG9vbF9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKKworY29mZmR1bXBfU09VUkNFUyA9IGNvZmZkdW1wLmMgY29mZmdyb2suYyAkKEJVTElCUykKKworc3lzZHVtcF9TT1VSQ0VTID0gc3lzZHVtcC5jICQoQlVMSUJTKQorCitubG1jb252X1NPVVJDRVMgPSBubG1jb252LmMgbmxtaGVhZGVyLnkgJChCVUxJQlMpCisKK3dpbmRyZXNfU09VUkNFUyA9IHdpbmRyZXMuYyByZXNyYy5jIHJlc2NvZmYuYyByZXNiaW4uYyByY3BhcnNlLnkgcmNsZXgubCBcCisJd2luZHVuaS5jIHJlc3Jlcy5jICQoQlVMSUJTKQorCit3aW5kcmVzX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQorCitkbGx3cmFwX1NPVVJDRVMgPSBkbGx3cmFwLmMgZHluLXN0cmluZy5jIAorZGxsd3JhcF9MREFERCA9ICQoTElCSUJFUlRZKQorCitESVNUU1RVRkYgPSBhcnBhcnNlLmMgYXJwYXJzZS5oIGFybGV4LmMgbmxtaGVhZGVyLmMgc3lzaW5mby5jIHN5c2luZm8uaCBcCisJc3lzbGV4LmMgZGVmbGV4LmMgZGVmcGFyc2UuaCBkZWZwYXJzZS5jIHJjbGV4LmMgcmNwYXJzZS5oIHJjcGFyc2UuYworCisKK0RJU1RDTEVBTkZJTEVTID0gc3RhbXAtdW5kZXIgc3lzaW5mbyB1bmRlcnNjb3JlLmMgc3lzcm9mZi5jIHN5c3JvZmYuaCBcCisJc2l0ZS5leHAgc2l0ZS5iYWsKKworCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IGNvbmZpZy50ZXhpCisKK01PU1RMWUNMRUFORklMRVMgPSBzeXNpbmZvICQoREVNQU5HTEVSX1BST0cpLjEgYmludXRpbHMubG9nIGJpbnV0aWxzLnN1bSBcCisJYWJjZGVmZ2gqCisKKworQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSAKK2Jpbl9QUk9HUkFNUyA9ICBzaXplJChFWEVFWFQpIG9iamR1bXAkKEVYRUVYVCkgYXIkKEVYRUVYVCkgXAorc3RyaW5ncyQoRVhFRVhUKSByYW5saWIkKEVYRUVYVCkgYysrZmlsdCQoRVhFRVhUKSBvYmpjb3B5JChFWEVFWFQpIFwKK0BCVUlMRF9OTE1DT05WQCBAQlVJTERfU1JDT05WQCBAQlVJTERfRExMVE9PTEAgQEJVSUxEX1dJTkRSRVNAIFwKK2FkZHIybGluZSQoRVhFRVhUKSByZWFkZWxmJChFWEVFWFQpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKK25vaW5zdF9QUk9HUkFNUyA9ICBubS1uZXckKEVYRUVYVCkgc3RyaXAtbmV3JChFWEVFWFQpCitQUk9HUkFNUyA9ICAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCisKKworREVGUyA9IEBERUZTQCAtSS4gLUkkKHNyY2RpcikgLUkuCitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQlMgPSBATElCU0AKK25sbWNvbnZfT0JKRUNUUyA9ICBubG1jb252Lm8gbmxtaGVhZGVyLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KK25sbWNvbnZfTERBREQgPSAkKExEQUREKQorbmxtY29udl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK25sbWNvbnZfTERGTEFHUyA9IAorc3Jjb252X09CSkVDVFMgPSAgc3Jjb252Lm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubworc3Jjb252X0xEQUREID0gJChMREFERCkKK3NyY29udl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK3NyY29udl9MREZMQUdTID0gCitzeXNkdW1wX09CSkVDVFMgPSAgc3lzZHVtcC5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCitzeXNkdW1wX0xEQUREID0gJChMREFERCkKK3N5c2R1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCitzeXNkdW1wX0xERkxBR1MgPSAKK2NvZmZkdW1wX09CSkVDVFMgPSAgY29mZmR1bXAubyBjb2ZmZ3Jvay5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCitjb2ZmZHVtcF9MREFERCA9ICQoTERBREQpCitjb2ZmZHVtcF9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK2NvZmZkdW1wX0xERkxBR1MgPSAKK2RsbHRvb2xfT0JKRUNUUyA9ICBkbGx0b29sLm8gZGVmcGFyc2UubyBkZWZsZXgubyBidWNvbW0ubyB2ZXJzaW9uLm8gXAorZmlsZW1vZGUubworZGxsdG9vbF9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK2RsbHRvb2xfTERGTEFHUyA9IAord2luZHJlc19PQkpFQ1RTID0gIHdpbmRyZXMubyByZXNyYy5vIHJlc2NvZmYubyByZXNiaW4ubyByY3BhcnNlLm8gXAorcmNsZXgubyB3aW5kdW5pLm8gcmVzcmVzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KK3dpbmRyZXNfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCit3aW5kcmVzX0xERkxBR1MgPSAKK2RsbHdyYXBfT0JKRUNUUyA9ICBkbGx3cmFwLm8gZHluLXN0cmluZy5vCitkbGx3cmFwX0RFUEVOREVOQ0lFUyA9ICAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK2RsbHdyYXBfTERGTEFHUyA9IAorc2l6ZV9PQkpFQ1RTID0gIHNpemUubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubworc2l6ZV9MREFERCA9ICQoTERBREQpCitzaXplX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQorc2l6ZV9MREZMQUdTID0gCitvYmpkdW1wX09CSkVDVFMgPSAgb2JqZHVtcC5vIHByZGJnLm8gcmRkYmcubyBkZWJ1Zy5vIHN0YWJzLm8gaWVlZS5vIFwKK3JkY29mZi5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCitvYmpkdW1wX0RFUEVOREVOQ0lFUyA9ICAuLi9vcGNvZGVzL2xpYm9wY29kZXMubGEgLi4vYmZkL2xpYmJmZC5sYSBcCisuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK29iamR1bXBfTERGTEFHUyA9IAorYXJfT0JKRUNUUyA9ICBhcnBhcnNlLm8gYXJsZXgubyBhci5vIG5vdC1yYW5saWIubyBhcnN1cC5vIHJlbmFtZS5vIFwKK2J1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCithcl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK2FyX0xERkxBR1MgPSAKK3N0cmluZ3NfT0JKRUNUUyA9ICBzdHJpbmdzLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KK3N0cmluZ3NfTERBREQgPSAkKExEQUREKQorc3RyaW5nc19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK3N0cmluZ3NfTERGTEFHUyA9IAorcmFubGliX09CSkVDVFMgPSAgYXIubyBpcy1yYW5saWIubyBhcnBhcnNlLm8gYXJsZXgubyBhcnN1cC5vIHJlbmFtZS5vIFwKK2J1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCityYW5saWJfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCityYW5saWJfTERGTEFHUyA9IAorY19fZmlsdF9PQkpFQ1RTID0gCitjX19maWx0X0RFUEVOREVOQ0lFUyA9ICBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gXAorLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCitjX19maWx0X0xERkxBR1MgPSAKK29iamNvcHlfT0JKRUNUUyA9ICBvYmpjb3B5Lm8gbm90LXN0cmlwLm8gcmVuYW1lLm8gcmRkYmcubyBkZWJ1Zy5vIFwKK3N0YWJzLm8gaWVlZS5vIHJkY29mZi5vIHdyc3RhYnMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubworb2JqY29weV9MREFERCA9ICQoTERBREQpCitvYmpjb3B5X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQorb2JqY29weV9MREZMQUdTID0gCithZGRyMmxpbmVfT0JKRUNUUyA9ICBhZGRyMmxpbmUubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubworYWRkcjJsaW5lX0xEQUREID0gJChMREFERCkKK2FkZHIybGluZV9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK2FkZHIybGluZV9MREZMQUdTID0gCityZWFkZWxmX09CSkVDVFMgPSAgcmVhZGVsZi5vIHZlcnNpb24ubworcmVhZGVsZl9ERVBFTkRFTkNJRVMgPSAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCityZWFkZWxmX0xERkxBR1MgPSAKK25tX25ld19PQkpFQ1RTID0gIG5tLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KK25tX25ld19MREFERCA9ICQoTERBREQpCitubV9uZXdfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCitubV9uZXdfTERGTEFHUyA9IAorc3RyaXBfbmV3X09CSkVDVFMgPSAgb2JqY29weS5vIGlzLXN0cmlwLm8gcmVuYW1lLm8gcmRkYmcubyBkZWJ1Zy5vIFwKK3N0YWJzLm8gaWVlZS5vIHJkY29mZi5vIHdyc3RhYnMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubworc3RyaXBfbmV3X0xEQUREID0gJChMREFERCkKK3N0cmlwX25ld19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK3N0cmlwX25ld19MREZMQUdTID0gCitMRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAorTEVYTElCID0gQExFWExJQkAKK1lMV1JBUCA9ICQodG9wX3NyY2RpcikvLi4veWx3cmFwCitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKK1RFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKK1RFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4CitJTkZPX0RFUFMgPSBiaW51dGlscy5pbmZvCitEVklTID0gYmludXRpbHMuZHZpCitURVhJTkZPUyA9IGJpbnV0aWxzLnRleGkKK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorTUFOUyA9ICQobWFuX01BTlMpCisKK05ST0ZGID0gbnJvZmYKK0RJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKK05FV1MgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgYXJsZXguYyBhcnBhcnNlLmMgY29uZmlnLmluIGNvbmZpZ3VyZSBcCitjb25maWd1cmUuaW4gZGVmbGV4LmMgZGVmcGFyc2UuYyBubG1oZWFkZXIuYyByY2xleC5jIHJjcGFyc2UuYworCisKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCisKK1RBUiA9IHRhcgorR1pJUF9FTlYgPSAtLWJlc3QKK1NPVVJDRVMgPSAkKG5sbWNvbnZfU09VUkNFUykgJChzcmNvbnZfU09VUkNFUykgJChzeXNkdW1wX1NPVVJDRVMpICQoY29mZmR1bXBfU09VUkNFUykgJChkbGx0b29sX1NPVVJDRVMpICQod2luZHJlc19TT1VSQ0VTKSAkKGRsbHdyYXBfU09VUkNFUykgJChzaXplX1NPVVJDRVMpICQob2JqZHVtcF9TT1VSQ0VTKSAkKGFyX1NPVVJDRVMpICQoc3RyaW5nc19TT1VSQ0VTKSAkKHJhbmxpYl9TT1VSQ0VTKSAkKGNfX2ZpbHRfU09VUkNFUykgJChvYmpjb3B5X1NPVVJDRVMpICQoYWRkcjJsaW5lX1NPVVJDRVMpICQocmVhZGVsZl9TT1VSQ0VTKSAkKG5tX25ld19TT1VSQ0VTKSAkKHN0cmlwX25ld19TT1VSQ0VTKQorT0JKRUNUUyA9ICQobmxtY29udl9PQkpFQ1RTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHN5c2R1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGRsbHRvb2xfT0JKRUNUUykgJCh3aW5kcmVzX09CSkVDVFMpICQoZGxsd3JhcF9PQkpFQ1RTKSAkKHNpemVfT0JKRUNUUykgJChvYmpkdW1wX09CSkVDVFMpICQoYXJfT0JKRUNUUykgJChzdHJpbmdzX09CSkVDVFMpICQocmFubGliX09CSkVDVFMpICQoY19fZmlsdF9PQkpFQ1RTKSAkKG9iamNvcHlfT0JKRUNUUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChyZWFkZWxmX09CSkVDVFMpICQobm1fbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X09CSkVDVFMpCisKK2FsbDogYWxsLXJlZGlyZWN0CisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKKwljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQorCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCisJY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCisKK2NvbmZpZy5oOiBzdGFtcC1oCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJCXJtIC1mIHN0YW1wLWg7IFwKKwkJJChNQUtFKSBzdGFtcC1oOyBcCisJZWxzZSA6OyBmaQorc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCisJICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKwlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAorJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCisJCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKKwllbHNlIDo7IGZpCiskKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKKwlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKKworbW9zdGx5Y2xlYW4taGRyOgorCitjbGVhbi1oZHI6CisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGNvbmZpZy5oCisKK21haW50YWluZXItY2xlYW4taGRyOgorCittb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKKworY2xlYW4tYmluUFJPR1JBTVM6CisJLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCisKK2Rpc3RjbGVhbi1iaW5QUk9HUkFNUzoKKworbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKKworaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAorCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCisJICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAorCWRvbmUKKworbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6CisKK2NsZWFuLW5vaW5zdFBST0dSQU1TOgorCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQorCitkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6CisKK21haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisKKy5jLm86CisJJChDT01QSUxFKSAtYyAkPAorCisucy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworLlMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoubyBjb3JlICouY29yZQorCitjbGVhbi1jb21waWxlOgorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCittYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6CisKKy5jLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAorCisucy5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKKworLlMubG86CisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCittYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6CisKK25sbWNvbnYkKEVYRUVYVCk6ICQobmxtY29udl9PQkpFQ1RTKSAkKG5sbWNvbnZfREVQRU5ERU5DSUVTKQorCUBybSAtZiBubG1jb252JChFWEVFWFQpCisJJChMSU5LKSAkKG5sbWNvbnZfTERGTEFHUykgJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9MREFERCkgJChMSUJTKQorCitzcmNvbnYkKEVYRUVYVCk6ICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0RFUEVOREVOQ0lFUykKKwlAcm0gLWYgc3Jjb252JChFWEVFWFQpCisJJChMSU5LKSAkKHNyY29udl9MREZMQUdTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHNyY29udl9MREFERCkgJChMSUJTKQorCitzeXNkdW1wJChFWEVFWFQpOiAkKHN5c2R1bXBfT0JKRUNUUykgJChzeXNkdW1wX0RFUEVOREVOQ0lFUykKKwlAcm0gLWYgc3lzZHVtcCQoRVhFRVhUKQorCSQoTElOSykgJChzeXNkdW1wX0xERkxBR1MpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfTERBREQpICQoTElCUykKKworY29mZmR1bXAkKEVYRUVYVCk6ICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9ERVBFTkRFTkNJRVMpCisJQHJtIC1mIGNvZmZkdW1wJChFWEVFWFQpCisJJChMSU5LKSAkKGNvZmZkdW1wX0xERkxBR1MpICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9MREFERCkgJChMSUJTKQorCitkbGx0b29sJChFWEVFWFQpOiAkKGRsbHRvb2xfT0JKRUNUUykgJChkbGx0b29sX0RFUEVOREVOQ0lFUykKKwlAcm0gLWYgZGxsdG9vbCQoRVhFRVhUKQorCSQoTElOSykgJChkbGx0b29sX0xERkxBR1MpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfTERBREQpICQoTElCUykKKword2luZHJlcyQoRVhFRVhUKTogJCh3aW5kcmVzX09CSkVDVFMpICQod2luZHJlc19ERVBFTkRFTkNJRVMpCisJQHJtIC1mIHdpbmRyZXMkKEVYRUVYVCkKKwkkKExJTkspICQod2luZHJlc19MREZMQUdTKSAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0xEQUREKSAkKExJQlMpCisKK2RsbHdyYXAkKEVYRUVYVCk6ICQoZGxsd3JhcF9PQkpFQ1RTKSAkKGRsbHdyYXBfREVQRU5ERU5DSUVTKQorCUBybSAtZiBkbGx3cmFwJChFWEVFWFQpCisJJChMSU5LKSAkKGRsbHdyYXBfTERGTEFHUykgJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9MREFERCkgJChMSUJTKQorCitzaXplJChFWEVFWFQpOiAkKHNpemVfT0JKRUNUUykgJChzaXplX0RFUEVOREVOQ0lFUykKKwlAcm0gLWYgc2l6ZSQoRVhFRVhUKQorCSQoTElOSykgJChzaXplX0xERkxBR1MpICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfTERBREQpICQoTElCUykKKworb2JqZHVtcCQoRVhFRVhUKTogJChvYmpkdW1wX09CSkVDVFMpICQob2JqZHVtcF9ERVBFTkRFTkNJRVMpCisJQHJtIC1mIG9iamR1bXAkKEVYRUVYVCkKKwkkKExJTkspICQob2JqZHVtcF9MREZMQUdTKSAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0xEQUREKSAkKExJQlMpCisKK2FyJChFWEVFWFQpOiAkKGFyX09CSkVDVFMpICQoYXJfREVQRU5ERU5DSUVTKQorCUBybSAtZiBhciQoRVhFRVhUKQorCSQoTElOSykgJChhcl9MREZMQUdTKSAkKGFyX09CSkVDVFMpICQoYXJfTERBREQpICQoTElCUykKKworc3RyaW5ncyQoRVhFRVhUKTogJChzdHJpbmdzX09CSkVDVFMpICQoc3RyaW5nc19ERVBFTkRFTkNJRVMpCisJQHJtIC1mIHN0cmluZ3MkKEVYRUVYVCkKKwkkKExJTkspICQoc3RyaW5nc19MREZMQUdTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0xEQUREKSAkKExJQlMpCisKK3JhbmxpYiQoRVhFRVhUKTogJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfREVQRU5ERU5DSUVTKQorCUBybSAtZiByYW5saWIkKEVYRUVYVCkKKwkkKExJTkspICQocmFubGliX0xERkxBR1MpICQocmFubGliX09CSkVDVFMpICQocmFubGliX0xEQUREKSAkKExJQlMpCisKK2MrK2ZpbHQkKEVYRUVYVCk6ICQoY19fZmlsdF9PQkpFQ1RTKSAkKGNfX2ZpbHRfREVQRU5ERU5DSUVTKQorCUBybSAtZiBjKytmaWx0JChFWEVFWFQpCisJJChMSU5LKSAkKGNfX2ZpbHRfTERGTEFHUykgJChjX19maWx0X09CSkVDVFMpICQoY19fZmlsdF9MREFERCkgJChMSUJTKQorCitvYmpjb3B5JChFWEVFWFQpOiAkKG9iamNvcHlfT0JKRUNUUykgJChvYmpjb3B5X0RFUEVOREVOQ0lFUykKKwlAcm0gLWYgb2JqY29weSQoRVhFRVhUKQorCSQoTElOSykgJChvYmpjb3B5X0xERkxBR1MpICQob2JqY29weV9PQkpFQ1RTKSAkKG9iamNvcHlfTERBREQpICQoTElCUykKKworYWRkcjJsaW5lJChFWEVFWFQpOiAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKGFkZHIybGluZV9ERVBFTkRFTkNJRVMpCisJQHJtIC1mIGFkZHIybGluZSQoRVhFRVhUKQorCSQoTElOSykgJChhZGRyMmxpbmVfTERGTEFHUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChhZGRyMmxpbmVfTERBREQpICQoTElCUykKKworcmVhZGVsZiQoRVhFRVhUKTogJChyZWFkZWxmX09CSkVDVFMpICQocmVhZGVsZl9ERVBFTkRFTkNJRVMpCisJQHJtIC1mIHJlYWRlbGYkKEVYRUVYVCkKKwkkKExJTkspICQocmVhZGVsZl9MREZMQUdTKSAkKHJlYWRlbGZfT0JKRUNUUykgJChyZWFkZWxmX0xEQUREKSAkKExJQlMpCisKK25tLW5ldyQoRVhFRVhUKTogJChubV9uZXdfT0JKRUNUUykgJChubV9uZXdfREVQRU5ERU5DSUVTKQorCUBybSAtZiBubS1uZXckKEVYRUVYVCkKKwkkKExJTkspICQobm1fbmV3X0xERkxBR1MpICQobm1fbmV3X09CSkVDVFMpICQobm1fbmV3X0xEQUREKSAkKExJQlMpCisKK3N0cmlwLW5ldyQoRVhFRVhUKTogJChzdHJpcF9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfREVQRU5ERU5DSUVTKQorCUBybSAtZiBzdHJpcC1uZXckKEVYRUVYVCkKKwkkKExJTkspICQoc3RyaXBfbmV3X0xERkxBR1MpICQoc3RyaXBfbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X0xEQUREKSAkKExJQlMpCisubC5jOgorCSQoU0hFTEwpICQoWUxXUkFQKSAiJChMRVgpIiAkPCAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQCAtLSAkKEFNX0xGTEFHUykgJChMRkxBR1MpCisueS5jOgorCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCithcnBhcnNlLmg6IGFycGFyc2UuYworZGVmcGFyc2UuaDogZGVmcGFyc2UuYworbmxtaGVhZGVyLmg6IG5sbWhlYWRlci5jCityY3BhcnNlLmg6IHJjcGFyc2UuYworCisKK2JpbnV0aWxzLmluZm86IGJpbnV0aWxzLnRleGkKK2JpbnV0aWxzLmR2aTogYmludXRpbHMudGV4aQorCisKK0RWSVBTID0gZHZpcHMKKworLnRleGkuaW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aS5kdmk6CisJVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCisJICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAorCisudGV4aToKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aW5mby5pbmZvOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50ZXhpbmZvOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50ZXhpbmZvLmR2aToKKwlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKKwkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8CisKKy50eGkuaW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudHhpLmR2aToKKwlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKKwkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8CisKKy50eGk6CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKy5kdmkucHM6CisJJChEVklQUykgJDwgLW8gJEAKKworaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCisJQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCisJICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAorCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCisJICAgIGVsc2UgOiA7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCUAkKFBPU1RfSU5TVEFMTCkKKwlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBsaXN0PSckKElORk9fREVQUyknOyBcCisJICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAorCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCisJICBkb25lOyBcCisJZWxzZSA6IDsgZmkKKwordW5pbnN0YWxsLWluZm86CisJJChQUkVfVU5JTlNUQUxMKQorCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGlpPXllczsgXAorCWVsc2UgaWk9OyBmaTsgXAorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgLXogIiRpaSIgXAorCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKKwlkb25lCisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKKwlkb25lCisKK2Rpc3QtaW5mbzogJChJTkZPX0RFUFMpCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKworbW9zdGx5Y2xlYW4tYW1pbmZvOgorCS1ybSAtZiBiaW51dGlscy5hdXggYmludXRpbHMuY3AgYmludXRpbHMuY3BzIGJpbnV0aWxzLmR2aSBiaW51dGlscy5mbiBcCisJICBiaW51dGlscy5mbnMgYmludXRpbHMua3kgYmludXRpbHMua3lzIGJpbnV0aWxzLnBzIFwKKwkgIGJpbnV0aWxzLmxvZyBiaW51dGlscy5wZyBiaW51dGlscy50b2MgYmludXRpbHMudHAgXAorCSAgYmludXRpbHMudHBzIGJpbnV0aWxzLnZyIGJpbnV0aWxzLnZycyBiaW51dGlscy5vcCBiaW51dGlscy50ciBcCisJICBiaW51dGlscy5jdiBiaW51dGlscy5jbgorCitjbGVhbi1hbWluZm86CisKK2Rpc3RjbGVhbi1hbWluZm86CisKK21haW50YWluZXItY2xlYW4tYW1pbmZvOgorCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAorCSAgcm0gLWYgJCRpOyBcCisJICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKKwkgICAgcm0gLWYgJCRpLVswLTldKjsgXAorCSAgZmk7IFwKKwlkb25lCitjbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KKworaW5zdGFsbC1tYW4xOgorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKKwlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAorCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKKwkgIGNhc2UgIiQkaSIgaW4gXAorCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAorCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKKwkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCisJZG9uZQorCit1bmluc3RhbGwtbWFuMToKKwlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAorCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKKwkgIGNhc2UgIiQkaSIgaW4gXAorCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCisJICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAorCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKKwkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAorCWRvbmUKK2luc3RhbGwtbWFuOiAkKE1BTlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCit1bmluc3RhbGwtbWFuOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKworQFNFVF9NQUtFQAorCithbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCitpbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKK2NoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKK21haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKKwlkb25lOyBcCisJdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCisJICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCisJICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisgICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorICAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKKwkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCisKK21vc3RseWNsZWFuLXRhZ3M6CisKK2NsZWFuLXRhZ3M6CisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElECisKK21haW50YWluZXItY2xlYW4tdGFnczoKKworZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQordG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCS1ybSAtcmYgJChkaXN0ZGlyKQorCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negorCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS89aW5zdAorCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCisJY2QgJChkaXN0ZGlyKS89YnVpbGQgXAorCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0CisJLXJtIC1yZiAkKGRpc3RkaXIpCisJQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKKwlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAorCWVjaG8gIiQkZGFzaGVzIjsgXAorCWVjaG8gIiQkYmFubmVyIjsgXAorCWVjaG8gIiQkZGFzaGVzIgorZGlzdDogZGlzdGRpcgorCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQorCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKKwktcm0gLXJmICQoZGlzdGRpcikKK2Rpc3QtYWxsOiBkaXN0ZGlyCisJLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQorCS1ybSAtcmYgJChkaXN0ZGlyKQorZGlzdGRpcjogJChESVNURklMRVMpCisJLXJtIC1yZiAkKGRpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKQorCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKKwkgIGZpOyBcCisJZG9uZQorCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KKworUlVOVEVTVEZMQUdTID0KKworREVKQVRPT0wgPSAkKFBBQ0tBR0UpCisKK1JVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKK3NpdGUuZXhwOiBNYWtlZmlsZQorCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKKwlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCisJQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10CisJQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAorCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAorCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAorCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAorCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10CisJQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKKwlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKKwlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKKwlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAorCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10CisJQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10CisJQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKKwlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCisJQG12ICRALXQgc2l0ZS5leHAKK2luZm8tYW06ICQoSU5GT19ERVBTKQoraW5mbzogaW5mby1yZWN1cnNpdmUKK2R2aS1hbTogJChEVklTKQorZHZpOiBkdmktcmVjdXJzaXZlCitjaGVjay1hbToKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCitjaGVjazogY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsY2hlY2stYW06CitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtaW5mby1hbTogCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKK2FsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1leGVjLWxvY2FsCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKK2FsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CisJJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKKworCittb3N0bHljbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKKwktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiYXJsZXhsZGVmbGV4bHJjbGV4bGFycGFyc2VoYXJwYXJzZWNkZWZwYXJzZWhkZWZwYXJzZWNubG1oZWFkZXJobmxtaGVhZGVyY3JjcGFyc2VocmNwYXJzZWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgYXJsZXhsIGRlZmxleGwgcmNsZXhsIGFycGFyc2VoIGFycGFyc2VjIGRlZnBhcnNlaCBkZWZwYXJzZWMgbmxtaGVhZGVyaCBubG1oZWFkZXJjIHJjcGFyc2VoIHJjcGFyc2VjICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCittb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCisJCW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCQltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIFwKKwkJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1sb2NhbAorCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwkJY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIGNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIFwKKwkJY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQorCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2Rpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIFwKKwkJZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKKwkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCisJCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCisJLXJtIC1mIGxpYnRvb2wKKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIGNvbmZpZy5zdGF0dXMKKworbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAorCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCisJCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCisJCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCisuUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCittb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAorbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCittb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAorY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCittb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAorbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAorY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKK21vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCittYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAordW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCitpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAordW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAoraW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAorZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKK2luZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAoraW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCitpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCitpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAoraW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgorCitwby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQorCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAorCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgorCitjaGVjay1ERUpBR05VOiBzaXRlLmV4cAorCXNyY2Rpcj1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKKwlyPWBwd2RgOyBleHBvcnQgcjsgXAorCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKKwlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAorCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAorCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCisJZmk7IFwKKwlydW50ZXN0PSQoUlVOVEVTVCk7IFwKKwlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKKwkJQ0NfRk9SX1RBUkdFVD0iJChDQ19GT1JfVEFSR0VUKSIgXAorCQlDRkxBR1NfRk9SX1RBUkdFVD0iJChDRkxBR1MpIiAkKFJVTlRFU1RGTEFHUyk7IFwKKwllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAorCWZpCisKK2luc3RhbGxjaGVjazoKKwkvYmluL3NoICQoc3JjZGlyKS9zYW5pdHkuc2ggJChiaW5kaXIpCisKK3VuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQorCitzdGFtcC11bmRlcjogTWFrZWZpbGUKKwllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAorCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYworCXRvdWNoIHN0YW1wLXVuZGVyCisKK2NwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKKwkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKKworIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgorIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKKyMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgorIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgorIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQorIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KKyMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCisjCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQorIwktcm0gLWYgJChSQU5MSUJfUFJPRykKKyMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKKyMKKyMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KKyMKKyNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubworIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKKyMJLXJtIC1mICQoU1RSSVBfUFJPRykKKyMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCisKK3N5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAorCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYworCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKKwkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCisKK3N5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCisJLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCisKK3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KKwkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAorCitzeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCisJaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKKwkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCisJZWxzZSBcCisJICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKKwlmaQorCitzeXNpbmZvLm86IHN5c2luZm8uYworCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAorCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCisJZWxzZSBcCisJICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAorCWZpCisKK2RsbHRvb2wubzpkbGx0b29sLmMKKwkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCisKKyMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQorIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCitubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCisJbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAorCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYworCisKK2Rpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KKworIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCisjIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgorLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAorCXJtIC1mIC5kZXAxCisJJChNQUtFKSBERVA9JChERVApIC5kZXAxCisJc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCisKKyMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCisuZGVwMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKKwlybSAtZiAuZGVwMgorCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKKwkkKERFUCkgLWYgLmRlcDIgJChJTkNMVURFUykgJD8KKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKKworZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCisJb2JqZGlyPWBwd2RgOyBcCisJc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCisJCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKKwkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAorCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwlcCisJCS1lICJzIUBPQkpESVJAISQke29iamRpcn0hIgorCitkZXA6IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQorCitkZXAtaW46IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCisKK2RlcC1hbTogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KKworLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQorCisjIyMKKyMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCitjb25maWcudGV4aTogTWFrZWZpbGUKKwlybSAtZiBjb25maWcudGV4aQorCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+IGNvbmZpZy50ZXhpCisKK2JpbnV0aWxzLmR2aTogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKKworYmludXRpbHMuaW5mbzogJChzcmNkaXIpL2JpbnV0aWxzLnRleGkgY29uZmlnLnRleGkKKworJChERU1BTkdMRVJfUFJPRykuMTogY3h4ZmlsdC5tYW4gTWFrZWZpbGUKKwlzZWQgLWUgJ3MvQFBST0dSQU1ALyQoREVNQU5HTEVSX1BST0cpLycgPCAkKHNyY2RpcikvY3h4ZmlsdC5tYW4gXAorCQk+ICQoREVNQU5HTEVSX1BST0cpLjEKK21vc3RseWNsZWFuLWxvY2FsOgorCS1ybSAtcmYgdG1wZGlyCisKKy5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsCisKK2luc3RhbGwtZXhlYy1sb2NhbDogJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKKwkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCSQobWtpbnN0YWxsZGlycykgJCh0b29sZGlyKS9iaW4KKwlmb3IgaSBpbiAkKFRPT0xfUFJPR1MpOyBkbyBcCisJICBpZiBbIC1mICQkaSQoRVhFRVhUKSBdOyB0aGVuIFwKKwkgICAgaj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvLW5ldy8vJ2A7IFwKKwkgICAgaz1gZWNobyAkJGogfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCisJICAgIGlmIFsgIiQoYmluZGlyKS8kJGskKEVYRUVYVCkiICE9ICIkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkiIF07IHRoZW4gXAorCSAgICAgIHJtIC1mICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAorCSAgICAgIGxuICQoYmluZGlyKS8kJGskKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAorCQl8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGkkKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCisJICAgIGZpOyBcCisJICBlbHNlIHRydWU7IFwKKwkgIGZpOyBcCisJZG9uZQorCisjIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgorIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgorCithZGRyMmxpbmUubzogYWRkcjJsaW5lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKK2FyLm86IGFyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICAkKElOQ0RJUikvYW91dC9hci5oICQoQkZERElSKS9saWJiZmQuaCBhcnN1cC5oCithcnN1cC5vOiBhcnN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGFyc3VwLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKK2J1Y29tbS5vOiBidWNvbW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAorY29mZmR1bXAubzogY29mZmR1bXAuYyBjb2ZmZ3Jvay5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKKyAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaAorY29mZmdyb2subzogY29mZmdyb2suYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBjb2ZmZ3Jvay5oCitkZWJ1Zy5vOiBkZWJ1Zy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgZGVidWcuaAorZGxsdG9vbC5vOiBkbGx0b29sLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZGxsdG9vbC5oCitmaWxlbW9kZS5vOiBmaWxlbW9kZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKK2llZWUubzogaWVlZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvaWVlZS5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICBkZWJ1Zy5oIGJ1ZGJnLmgKK2lzLXJhbmxpYi5vOiBpcy1yYW5saWIuYworaXMtc3RyaXAubzogaXMtc3RyaXAuYworbWF5YmUtcmFubGliLm86IG1heWJlLXJhbmxpYi5jCittYXliZS1zdHJpcC5vOiBtYXliZS1zdHJpcC5jCitubG1jb252Lm86IG5sbWNvbnYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoQkZERElSKS9saWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1jb252LmgKK25tLm86IG5tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oIFwKKyAgJChJTkNESVIpL2RlbWFuZ2xlLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCitub3QtcmFubGliLm86IG5vdC1yYW5saWIuYworbm90LXN0cmlwLm86IG5vdC1zdHJpcC5jCitvYmpjb3B5Lm86IG9iamNvcHkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWRiZy5oCitvYmpkdW1wLm86IG9iamR1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggXAorICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitwcmRiZy5vOiBwcmRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgZGVidWcuaCBidWRiZy5oCityZGNvZmYubzogcmRjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggXAorICBidWRiZy5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorcmRkYmcubzogcmRkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIGRlYnVnLmggYnVkYmcuaAorc2l6ZS5vOiBzaXplLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9nZXRvcHQuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCitzcmNvbnYubzogc3Jjb252LmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgIHN5c3JvZmYuaCBjb2ZmZ3Jvay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggc3lzcm9mZi5jCitzdGFicy5vOiBzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgorc3RyaW5ncy5vOiBzdHJpbmdzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKK3N5c2R1bXAubzogc3lzZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggc3lzcm9mZi5oIFwKKyAgc3lzcm9mZi5jCit2ZXJzaW9uLm86IHZlcnNpb24uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCit3cnN0YWJzLm86IHdyc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKK3dpbmRyZXMubzogd2luZHJlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9nZXRvcHQuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9vYnN0YWNrLmggd2luZHJlcy5oIFwKKyAgd2luZHVuaS5oCityZXNyYy5vOiByZXNyYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgd2luZHJlcy5oIHdpbmR1bmkuaAorcmVzY29mZi5vOiByZXNjb2ZmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICB3aW5kcmVzLmggd2luZHVuaS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK3Jlc2Jpbi5vOiByZXNiaW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIHdpbmRyZXMuaCB3aW5kdW5pLmgKK3dpbmR1bmkubzogd2luZHVuaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggd2luZHVuaS5oCityZWFkZWxmLm86IHJlYWRlbGYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICAkKElOQ0RJUikvZWxmL3Y4NTAuaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvbWlwcy5oIFwKKyAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9tNjhrLmggXAorICAkKElOQ0RJUikvZWxmL3NwYXJjLmggJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9kMTB2LmggXAorICAkKElOQ0RJUikvZWxmL2QzMHYuaCAkKElOQ0RJUikvZWxmL3NoLmggJChJTkNESVIpL2VsZi9tbjEwMjAwLmggXAorICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKKyAgJChJTkNESVIpL2VsZi9mcjMwLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgICQoSU5DRElSKS9nZXRvcHQuaAorcmVzcmVzLm86IHJlc3Jlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgd2luZHJlcy5oIHdpbmR1bmkuaAorZHluLXN0cmluZy5vOiBkeW4tc3RyaW5nLmMgY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBkeW4tc3RyaW5nLmgKK2RsbHdyYXAubzogZGxsd3JhcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgJChJTkNESVIpL2dldG9wdC5oIGR5bi1zdHJpbmcuaAorcmVuYW1lLm86IHJlbmFtZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKK3VuZGVyc2NvcmUubzogdW5kZXJzY29yZS5jCithcnBhcnNlLm86IGFycGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGFyc3VwLmgKK2FybGV4Lm86IGFybGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGFycGFyc2UuaAorc3lzcm9mZi5vOiBzeXNyb2ZmLmMKK3N5c2luZm8ubzogc3lzaW5mby5jCitzeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCitkZWZwYXJzZS5vOiBkZWZwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggZGxsdG9vbC5oCitkZWZsZXgubzogZGVmbGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgZGVmcGFyc2UuaCBkbGx0b29sLmgKK25sbWhlYWRlci5vOiBubG1oZWFkZXIuYyAuLi9iZmQvYmZkLmggYnVjb21tLmggY29uZmlnLmggXAorICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKKyAgbmxtY29udi5oCityY3BhcnNlLm86IHJjcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgIHdpbmRyZXMuaCB3aW5kdW5pLmgKK3JjbGV4Lm86IHJjbGV4LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICB3aW5kcmVzLmggd2luZHVuaS5oIHJjcGFyc2UuaAorCisjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvTkVXUyBiL2JpbnV0aWxzL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkY2ViZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL05FV1MKQEAgLTAsMCArMSwxNjMgQEAKKy0qLSB0ZXh0IC0qLQorCitDaGFuZ2VzIGluIGJpbnV0aWxzIDIuMTA6CisKKyogb2JqZHVtcCBzdXBwb3J0IGZvciAtbWkzODY6aW50ZWwgd2hpY2ggY2F1c2VzIGRpc2Fzc2VtYmx5IHRvIGJlIGRpc3BsYXllZCB3aXRoCisgIGludGVsIHN5bnRheC4KKworKiBOZXcgcHJvZ3JhbTogcmVhZGVsZi4gIFRoaXMgZGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMsCisgIHJlZ2FyZGxlc3Mgb2YgdGFyZ2V0IG1hY2hpbmUuCisKKyogb2JqY29weSBub3cgdGFrZXMgLS1jaGFuZ2Utc2VjdGlvbi1sbWEsIC0tY2hhbmdlLXNlY3Rpb24tdm1hLCBhbmQKKyAgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIG9wdGlvbnMuICBUaGUgb2xkIC0tYWRqdXN0LXNlY3Rpb24tdm1hIG9wdGlvbiBpcworICBlcXVpdmFsZW50IHRvIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcy4gIFRoZSBvdGhlciAtLWFkanVzdC0qIG9wdGlvbnMgYXJlIG5vdworICByZW5hbWVkIHRvIC0tY2hhbmdlLSosIGFsdGhvdWdoIC0tYWRqdXN0LSogY29udGludWVzIHRvIHdvcmsuCisKKyogZGxsdG9vbCBub3cgc3VwcG9ydHMgdGhlIElNUE9SVFMgY29tbWFuZC4KKworKiBkbGx0b29sIG5vdyB0YWtlcyAtLWV4cG9ydC1hbGwtc3ltYm9scywgLS1uby1leHBvcnQtYWxsLXN5bWJvbHMsCisgIC0tZXhjbHVkZS1zeW1ib2xzLCBhbmQgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzIG9wdGlvbnMuCisKK0NoYW5nZXMgaW4gYmludXRpbHMgMi45OgorCisqIEFkZGVkIHdpbmRyZXMgcHJvZ3JhbSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZXMgaW4gV0lOMzIKKyAgZmlsZXMgYXMgdXNlZCBvbiBXaW5kb3dzIDk1IGFuZCBXaW5kb3dzIE5ULgorCisqIFRoZSBvYmpjb3B5IC0tZ2FwLWZpbGwgYW5kIC0tcGFkLXRvIG9wdGlvbnMgb3BlcmF0ZSBvbiB0aGUgTE1BIHJhdGhlciB0aGFuCisgIHRoZSBWTUEgb2YgdGhlIHNlY3Rpb25zLgorCisqIEFkZGVkIFMgbW9kaWZpZXIgdG8gYXIgdG8gbm90IGJ1aWxkIGEgc3ltYm9sIHRhYmxlLgorCitDaGFuZ2VzIGluIGJpbnV0aWxzIDIuODoKKworKiBUaGUgb2JqZHVtcCBkaXNhc3NlbWJseSBmb3JtYXQgaGFzIGJlZW4gY2hhbmdlZCwgYW5kIGhvcGVmdWxseSBpbXByb3ZlZC4gIFVzZQorICB0aGUgbmV3IC0tcHJlZml4LWFkZHJlc3NlcyBvcHRpb24gdG8gZ2V0IHRoZSBvbGQgZm9ybWF0LiAgVGhlcmUgYXJlIGFsc28gbmV3CisgIC0tZGlzYXNzZW1ibGUtemVyb2VzIGFuZCAtLW5vLXNob3ctcmF3LWluc24gb3B0aW9ucyB3aGljaCBhZmZlY3QgZGlzYXNzZW1ibGVyCisgIG91dHB1dC4KKworKiBGb3JtYXRzIG1heSBub3cgYmUgc3BlY2lmaWVkIGFzIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMuICBGb3IgZXhhbXBsZSwKKyAgb2JqZHVtcCAtYiBpMzg2LXBjLWxpbnV4LiAgVGhlIHRyaXBsZXRzIGFyZSBub3QgcGFzc2VkIHRocm91Z2ggY29uZmlnLnN1YiwKKyAgc28gdGhleSBtdXN0IGJlIGluIGNhbm9uaWNhbCBmb3JtLgorCisqIEFkZGVkIG5ldyBhZGRyMmxpbmUgcHJvZ3JhbS4gIFRoaXMgdXNlcyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGNvbnZlcnQKKyAgYW4gYWRkcmVzcyBpbnRvIGEgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB3aXRoaW4gYSBwcm9ncmFtLgorCisqIEFkZGVkIC0tY2hhbmdlLWxlYWRpbmctY2hhciBhcmd1bWVudCB0byBvYmpjb3B5LgorCisqIEFkZGVkIC0td2Vha2VuIGFyZ3VtZW50IHRvIG9iamNvcHkuCisKKyogb2JqZHVtcCAtLWR5bmFtaWMtcmVsb2Mgbm93IHdvcmtzIG9uIEVMRiBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGxpYnJhcmllcy4KKworKiBBZGRlZCAtLWFkanVzdC12bWEgb3B0aW9uIHRvIG9iamR1bXAuCisKKyogQWRkZWQgLUMvLS1kZW1hbmdsZSBvcHRpb24gdG8gb2JqZHVtcC4KKworKiBBZGRlZCAtcC8tLXByZXNlcnZlLWRhdGVzIG9wdGlvbiB0byBzdHJpcCBhbmQgb2JqY29weS4KKworQ2hhbmdlcyBpbiBiaW51dGlscyAyLjc6CisKKyogQWRkZWQgLS1lbmFibGUtc2hhcmVkIGFuZCAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3B0aW9ucyB0byBjb25maWd1cmUuCisKKyogQWRkZWQgLS1kZWJ1Z2dpbmcgYXJndW1lbnQgdG8gb2JqZHVtcCBhbmQgb2JqY29weS4KKworKiBBZGRlZCAtLWRlZmluZWQtb25seSBhcmd1bWVudCB0byBubS4KKworKiBBZGRlZCAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgYXJndW1lbnQgdG8gb2JqY29weS4KKworKiBUaGUgb2JqZHVtcCAtLWxpbmUtbnVtYmVycyBvcHRpb24gaXMgbm93IG1lYW5pbmdmdWwgd2l0aCAtLXJlbG9jLgorCisqIEFkZGVkIC0tbGluZS1udW1iZXJzIG9wdGlvbiB0byBubS4KKworKiBBZGRlZCAtLWVuZGlhbi8tRUIvLUVMIG9wdGlvbiB0byBvYmpkdW1wLgorCisqIEFkZGVkIHN1cHBvcnQgZm9yIEFscGhhIE9wZW5WTVMvQVhQLgorCitDaGFuZ2VzIGluIGJpbnV0aWxzIDIuNjoKKworKiBBZGRlZCAtTi8tLXN0cmlwLXN5bWJvbCBhbmQgLUsvLS1rZWVwLXN5bWJvbCBhcmd1bWVudHMgdG8gc3RyaXAgYW5kIG9iamNvcHkuCisKKyogQWRkZWQgc2V2ZXJhbCBhcmd1bWVudHMgdG8gb2JqY29weSB0byBwcm92aWRlIHNvbWUgY29udHJvbCBvdmVyIGhvdyB0aGUgbmV3CisgIGZpbGUgaXMgbGFpZCBvdXQgaW4gbWVtb3J5LiAgQWxzbyBhZGRlZCBiaW5hcnkgb3V0cHV0IGZvcm1hdCB0byBCRkQgdG8gcGVybWl0CisgIGdlbmVyYXRpbmcgcGxhaW4gYmluYXJ5IGZpbGVzLgorCisqIEFkZGVkIC0tc3RhcnQtYWRkcmVzcyBhbmQgLS1zdG9wLWFkZHJlc3Mgb3B0aW9ucyB0byBvYmpkdW1wLgorCisqIGFyIGFuZCByYW5saWIgbm93IHdvcmsgb24gQUlYLiAgVGhlIHRvb2xzIGFyZSBub3cgYnVpbHQgYnkgZGVmYXVsdCBvbiBBSVguCisKK0NoYW5nZXMgaW4gYmludXRpbHMgMi41OgorCisqIENoYW5nZWQgb2JqZHVtcCAtZHIgdG8gZHVtcCB0aGUgcmVsb2NzIGludGVyc3BlcnNlZCB3aXRoIHRoZSBhc3NlbWJseQorICBsaXN0aW5nLCBmb3IgYSBtb3JlIHVzZWZ1bCBsaXN0aW5nIG9mIHJlbG9jYXRlYWJsZSBmaWxlcy4KKworKiBDaGFuZ2VkIG9iamR1bXAgLWQvLS1kaXNhc3NlbWJsZSB0byBvbmx5IGRpc2Fzc2VtYmxlIFNFQ19DT0RFIHNlY3Rpb25zLgorICBBZGRlZCAtRC8tLWRpc2Fzc2VtYmxlLWFsbCBvcHRpb24gdG8gZGlzYXNzZW1ibGUgYWxsIHNlY3Rpb25zLgorCisqIEFkZGVkIC0tc2l6ZS1zb3J0IG9wdGlvbiB0byBubS4KKworKiBzdHJpcCBhbmQgb2JqY29weSBzaG91bGQgbm93IGJlIGFibGUgdG8gaGFuZGxlIGR5bmFtaWNhbGx5IGxpbmtlZCBFTEYKKyAgZXhlY3V0YWJsZXMuCisKK0NoYW5nZXMgaW4gYmludXRpbHMgMi40OgorCisqIFN1cHBvcnQgZm9yIEhQLVBBIChieSBKZWZmIExhdyksIGkzODYgTWFjaCAoYnkgRGF2aWQgTWFja2VuemllKSwgUlMvNjAwMCBhbmQKKyAgUG93ZXJQQyAoZXhjZXB0IGFyIGFuZCByYW5saWI7IGJ5IElhbiBUYXlsb3IpLgorCisqIFN1cHBvcnQgZm9yIElyaXggNS4KKworKiBQcm9ncmFtcyBgc3RyaXAnIGFuZCBgb2JqY29weScgd2lsbCBub3QgYXR0ZW1wdCB0byB3cml0ZSBkeW5hbWljYWxseSBsaW5rZWQKKyAgRUxGIG91dHB1dCBmaWxlcywgc2luY2UgQkZEIGN1cnJlbnRseSBjYW4ndCBjcmVhdGUgdGhlbSBwcm9wZXJseS4KKworQ2hhbmdlcyBpbiBiaW51dGlscyAyLjM6CisKKyogQSBuZXcgLS1zdGFicyBhcmd1bWVudCBoYXMgYmVlbiBhZGRlZCB0byBvYmpkdW1wIHRvIGR1bXAgc3RhYnMgc2VjdGlvbnMgaW4KKyAgRUxGIGFuZCBDT0ZGIGZpbGVzLgorCisqIEEgbmV3IHByb2dyYW0sIG5sbWNvbnYsIGhhcyBiZWVuIGFkZGVkLiAgSXQgY2FuIGNvbnZlcnQgb2JqZWN0IGZpbGVzIGludG8KKyAgTm92ZWxsIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcy4KKworKiBUaGUgc3RyaW5ncyBwcm9ncmFtIGhhcyBiZWVuIGFkZGVkLgorCitDaGFuZ2VzIGluIGJpbnV0aWxzIDIuMjoKKworKiBUaGUgJ2NvcHknIHByb2dyYW0gaGFzIGJlZW4gcmVuYW1lZCB0byAnb2JqY29weScsIGZvciBjb25zaXN0ZW5jeSB3aXRoCisgICdvYmpkdW1wJywgYW5kIGJlY2F1c2UgJ2NvcHknIG1pZ2h0IG1vcmUgcGxhdXNpYmx5IGJlIHVzZWQgYXMgYSBzeW5vbnltIGZvcgorICAnY3AnLgorCisqIFRoZSBuZXcgc3RhbmQtYWxvbmUgcHJvZ3JhbSBjKytmaWx0IGlzIGEgZmlsdGVyIHRoYXQgY29udmVydHMgZW5jb2RlZAorICAobWFuZ2xlZCkgQysrIGFzc2VtYmx5LWxldmVsIGlkZW50aWZpZXJzIHRvIHVzZXItbGV2ZWwgbmFtZXMuICAoTm90ZTogVGhpcworICBtYXkgZ2V0IG1vdmVkIHRvIHRoZSBnY2MgZGlzdHJpYnV0aW9uLikKKworKiBubSAtbyBvbiBhbiBhcmNoaXZlIG5vdyBwcmVmaXhlcyBlYWNoIGxpbmUgd2l0aCB0aGUgYXJjaGl2ZSBuYW1lLCBtYXRjaGluZworICB0aGUgb3V0cHV0IGZyb20gQlNEIG5tLgorCisqIGFyIChhbmQgbGQpIGNhbiBub3cgcmVhZCAoYnV0IG5vdCB3cml0ZSkgQlNENC40LXN0eWxlIGFyY2hpdmVzLgorCisqIE5ldyBzdXBwb3J0IGZvciBIODUwMCwgWjgwMDAsIGFuZCB0aGUgSGl0YWNoIFNILgorCisqIERpcy1hc3NlbWJsZXIgaW50ZXJmYWNlIGNoYW5nZWQgdG8gYWxsb3cgc2hhcmluZyB3aXRoIGdkYi4KKworKiBUaGVyZSBpcyBuZXcgRWxmIGNvZGUsIGJ1dCBpdCBpcyBub3QgeWV0IHJlYWR5IGZvciBnZW5lcmFsIHVzZS4KKworKiBUaGVyZSBpcyB0aGUgYmVnaW5uaW5ncyBvZiBhIHRlc3Qgc3VpdGUuCisKK0NoYW5nZXMgaW4gYmludXRpbHMgMi4xOgorCisqIFRoZXJlIGlzIG5vdyBzdXBwb3J0IGZvciB3cml0aW5nIEVDT0ZGIGZpbGVzLCBzbyBsZCBhbmQgdGhlIG90aGVyIHV0aWxpdGllcworICBzaG91bGQgd29yayBvbiBSaXNjL1VsdHJpeCBhbmQgSXJpeC4gIFBsZWFzZSBsZXQgdXMga25vdyBob3cgd2VsbCB0aGlzIHdvcmtzLgorCisqIGFyIG5vdyBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBzeW1ib2wgdGFibGUgKGEgX18uU1lNREVGIG1lbWJlciwgaW4gdGhlIEJTRAorICB2ZXJzaW9uKSwgaWYgdGhlcmUgYXJlIGFueSBvYmplY3QgZmlsZXMgaW4gdGhlIGFyY2hpdmUuICBTbyBydW5uaW5nIHJhbmxpYiBpcworICBub3cgcmVkdW5kYW50ICh1bmxlc3MgdGhlIG5vbi1zdGFuZGFyZCBxIGNvbW1hbmQgaXMgdXNlZCkuICBUaGlzIGlzIHJlcXVpcmVkCisgIGZvciBQb3NpeC4yIGNvbmZvcm1hbmNlLgorCisqIFRoZSBhcmNoaXZlLXJlYWRpbmcgY29kZSBub3cgcmVhZHMgYm90aCBCU0Qtc3R5bGUgYW5kIFNZU1Ytc3R5bGUgYXJjaGl2ZXMKKyAgaW5kZXBlbmRlbnRseSBvZiB0aGUgc2VsZWN0ZWQgdGFyZ2V0IGZvcm1hdC4gIFRoaXMgaXMgdG8gZW5jb3VyYWdlIHBlb3BsZSB0bworICBzd2l0Y2ggdG8gU1lTVi1mb3JtYXQsIHdoaWNoIGhhcyBhIG51bWJlciBvZiBhZHZhbnRhZ2VzLgorCisqIFRoZSBzdHJpcCBhbmQgY29weSBwcm9ncmFtcyBub3cgaGF2ZSBvcHRpb25zIHRvIHJlbW92ZSBkZWJ1Zy1zeW1ib2xzIG9ubHkKKyAgYW5kL29yIGxvY2FsIHN5bWJvbHMgb25seS4gIFRoZXkgbm93IGFsc28gc3VwcG9ydCBsb25nIG9wdGlvbnMuCisKKwwKK0xvY2FsIHZhcmlhYmxlczoKK2ZpbGwtY29sdW1uOiA3OQorRW5kOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvUkVBRE1FIGIvYmludXRpbHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9SRUFETUUKQEAgLTAsMCArMSwxODkgQEAKK1RoZXNlIGFyZSB0aGUgR05VIGJpbnV0aWxzLiAgVGhlc2UgYXJlIHV0aWxpdGllcyBvZiB1c2Ugd2hlbiBkZWFsaW5nCit3aXRoIG9iamVjdCBmaWxlcy4KKworVGhlIGxpbmtlciAobGQpIGlzIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LCB3aGljaCBzaG91bGQgYmUgLi4vbGQuCitMaW5rZXItc3BlY2lmaWMgbm90ZXMgYXJlIGluIC4uL2xkL1JFQURNRS4KKworQXMgb2YgdmVyc2lvbiAyLjUsIHRoZSBhc3NlbWJsZXIgKGFzKSBpcyBhbHNvIGluY2x1ZGVkIGluIHRoaXMgcGFja2FnZSwgaW4KKy4uL2dhcy4gIEFzc2VtYmxlci1zcGVjaWZpYyBub3RlcyBjYW4gYmUgZm91bmQgaW4gLi4vZ2FzL1JFQURNRS4KKworUmVjZW50IGNoYW5nZXMgYXJlIGluIC4vTkVXUywgLi4vbGQvTkVXUywgYW5kIC4uL2dhcy9ORVdTLgorCitVbnBhY2tpbmcgYW5kIEluc3RhbGxhdGlvbiAtLSBxdWljayBvdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hlbiB5b3UgdW5wYWNrIHRoZSBiaW51dGlscy0yLjkudGFyLmd6IGZpbGUsIHlvdSdsbCBnZXQgYSBkaXJlY3RvcnkKK2NhbGxlZCBzb21ldGhpbmcgbGlrZSBgYmludXRpbHMtMi45Jywgd2hpY2ggY29udGFpbnMgdmFyaW91cyBmaWxlcyBhbmQKK2RpcmVjdG9yaWVzLiAgTW9zdCBvZiB0aGUgZmlsZXMgaW4gdGhlIHRvcCBkaXJlY3RvcnkgYXJlIGZvcgoraW5mb3JtYXRpb24gYW5kIGZvciBjb25maWd1cmF0aW9uLiAgVGhlIGFjdHVhbCBzb3VyY2UgY29kZSBpcyBpbgorc3ViZGlyZWN0b3JpZXMuCisKK1RvIGJ1aWxkIGJpbnV0aWxzLCB5b3UgY2FuIGp1c3QgZG86CisKKwljZCBiaW51dGlscy0yLjkKKwkuL2NvbmZpZ3VyZSBbb3B0aW9uc10KKwltYWtlCisJbWFrZSBpbnN0YWxsICMgY29waWVzIHRoZSBwcm9ncmFtcyBmaWxlcyBpbnRvIC91c3IvbG9jYWwvYmluCisJCSAgICAgIyBieSBkZWZhdWx0LgorCitUaGlzIHdpbGwgY29uZmlndXJlIGFuZCBidWlsZCBhbGwgdGhlIGxpYnJhcmllcyBhcyB3ZWxsIGFzIHRoZQorYXNzZW1ibGVyLCB0aGUgYmludXRpbHMsIGFuZCB0aGUgbGlua2VyLgorCitJZiB5b3UgaGF2ZSBHTlUgbWFrZSwgd2UgcmVjb21tZW5kIGJ1aWxkaW5nIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeToKKworCW1rZGlyIG9iamRpcgorCWNkIG9iamRpcgorCS4uL2JpbnV0aWxzLTIuOS9jb25maWd1cmUgW29wdGlvbnNdCisJbWFrZQorCW1ha2UgaW5zdGFsbAorCitUaGlzIHJlbGllcyBvbiB0aGUgVlBBVEggZmVhdHVyZSBvZiBHTlUgbWFrZS4KKworQnkgZGVmYXVsdCwgdGhlIGJpbnV0aWxzIHdpbGwgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IHRoZSBzeXN0ZW0gb24KK3doaWNoIHRoZXkgYXJlIGJ1aWx0LiAgV2hlbiBkb2luZyBjcm9zcyBkZXZlbG9wbWVudCwgdXNlIHRoZSAtLXRhcmdldAorY29uZmlndXJlIG9wdGlvbiB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IHRhcmdldC4KKworVGhlIC0tZW5hYmxlLXRhcmdldHMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgbW9yZSBiaW5hcnkgZmlsZSBmb3JtYXRzCitiZXNpZGVzIHRoZSBkZWZhdWx0LiAgTGlzdCB0aGVtIGFzIHRoZSBhcmd1bWVudCB0byAtLWVuYWJsZS10YXJnZXRzLAorc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEZvciBleGFtcGxlOgorCisJLi9jb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1zdW4zLHJzNjAwMC1haXgsZGVjc3RhdGlvbgorCitUaGUgbmFtZSAnYWxsJyBjb21waWxlcyBpbiBzdXBwb3J0IGZvciBhbGwgdmFsaWQgQkZEIHRhcmdldHMgKHRoaXMgd2FzCit0aGUgZGVmYXVsdCBpbiByZWxlYXNlcyBiZWZvcmUgMi4zKToKKworCS4vY29uZmlndXJlIC0tZW5hYmxlLXRhcmdldHM9YWxsCisKK1lvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSAtLWVuYWJsZS1zaGFyZWQgb3B0aW9uIHdoZW4geW91IHJ1bgorY29uZmlndXJlLiAgVGhpcyB3aWxsIGJ1aWxkIHRoZSBCRkQgYW5kIG9wY29kZXMgbGlicmFyaWVzIGFzIHNoYXJlZAorbGlicmFyaWVzLiAgWW91IGNhbiB1c2UgYXJndW1lbnRzIHdpdGggdGhlIC0tZW5hYmxlLXNoYXJlZCBvcHRpb24gdG8KK2luZGljYXRlIHRoYXQgb25seSBjZXJ0YWluIGxpYnJhcmllcyBzaG91bGQgYmUgYnVpbHQgc2hhcmVkOyBmb3IKK2V4YW1wbGUsIC0tZW5hYmxlLXNoYXJlZD1iZmQuICBUaGUgb25seSBwb3RlbnRpYWwgc2hhcmVkIGxpYnJhcmllcyBpbgorYSBiaW51dGlscyByZWxlYXNlIGFyZSBiZmQgYW5kIG9wY29kZXMuCisKK1RoZSBiaW51dGlscyB3aWxsIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIGJ1aWxkCitzdGVwIHdpbGwgYXR0ZW1wdCB0byBwbGFjZSB0aGUgY29ycmVjdCBsaWJyYXJ5IGluIHRoZSBydW50aW1lIHNlYXJjaAorcGF0aCBmb3IgdGhlIGJpbmFyaWVzLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcywgYWZ0ZXIgeW91IGluc3RhbGwgdGhlCitiaW5hcmllcywgeW91IG1heSBoYXZlIHRvIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgbm9ybWFsbHkKK0xEX0xJQlJBUllfUEFUSCwgc28gdGhhdCB0aGUgc3lzdGVtIGNhbiBmaW5kIHRoZSBpbnN0YWxsZWQgbGliYmZkCitzaGFyZWQgbGlicmFyeS4KKworVG8gYnVpbGQgdW5kZXIgb3BlblZNUy9BWFAsIHNlZSB0aGUgZmlsZSBtYWtlZmlsZS52bXMgaW4gdGhlIHRvcCBsZXZlbAorZGlyZWN0b3J5LgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhcgorPT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgYWxyZWFkeSBoYXZlIGFuIGFyIHByb2dyYW0sIHRoZSBub3JtYWwKK2JpbnV0aWxzIGJ1aWxkIHByb2Nlc3Mgd2lsbCBub3Qgd29yay4gIEluIHRoaXMgY2FzZSwgcnVuIGNvbmZpZ3VyZSBhcwordXN1YWwuICBCZWZvcmUgcnVubmluZyBtYWtlLCBydW4gdGhpcyBzY3JpcHQ6CisKKyMhL2Jpbi9zaAorTUFLRV9QUk9HPSIke01BS0UtbWFrZX0iCitNQUtFPSIke01BS0VfUFJPR30gQVI9dHJ1ZSBMSU5LPXRydWUiCitleHBvcnQgTUFLRQorJHtNQUtFfSAkKiBhbGwtbGliaWJlcnR5Ciske01BS0V9ICQqIGFsbC1pbnRsCiske01BS0V9ICQqIGFsbC1iZmQKK2NkIGJpbnV0aWxzCitNQUtFPSIke01BS0VfUFJPR30iCitleHBvcnQgTUFLRQorJHtNQUtFfSAkKiBhcl9ERVBFTkRFTkNJRVM9IGFyX0xEQUREPScuLi9iZmQvKi5vIGBjYXQgLi4vbGliaWJlcnR5L3JlcXVpcmVkLWxpc3QgLi4vbGliaWJlcnR5L25lZWRlZC1saXN0IHwgc2VkIC1lICJzLFwoW14gXVteIF0qXCksLi4vbGliaWJlcnR5L1wxLGciYCBgaWYgdGVzdCAtZiAuLi9pbnRsL2dldHRleHQubzsgdGhlbiBlY2hvICcuLi9pbnRsLyoubyc7IGZpYCcgYXIKKworVGhpcyBzY3JpcHQgd2lsbCBidWlsZCBhbiBhciBwcm9ncmFtIGluIGJpbnV0aWxzL2FyLiAgTW92ZSBiaW51dGlscy9hcgoraW50byBhIGRpcmVjdG9yeSBvbiB5b3VyIFBBVEguICBBZnRlciBkb2luZyB0aGlzLCB5b3UgY2FuIHJ1biBtYWtlIGFzCit1c3VhbCB0byBidWlsZCB0aGUgY29tcGxldGUgYmludXRpbHMgZGlzdHJpYnV0aW9uLiAgWW91IGRvIG5vdCBuZWVkCit0aGUgcmFubGliIHByb2dyYW0gaW4gb3JkZXIgdG8gYnVpbGQgdGhlIGRpc3RyaWJ1dGlvbi4KKworUG9ydGluZworPT09PT09PQorCitCaW51dGlscy0yLjkgc3VwcG9ydHMgbWFueSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcywgYnV0IHRoZXJlCithcmUgbWFueSBtb3JlIG5vdCBzdXBwb3J0ZWQsIGluY2x1ZGluZyBzb21lIHRoYXQgd2VyZSBzdXBwb3J0ZWQKK2J5IGVhcmxpZXIgdmVyc2lvbnMuICBXZSBhcmUgaG9waW5nIGZvciB2b2x1bnRlZXJzIHRvCitpbXByb3ZlIHRoaXMgc2l0dWF0aW9uLgorCitUaGUgbWFqb3IgZWZmb3J0IGluIHBvcnRpbmcgYmludXRpbHMgdG8gYSBuZXcgaG9zdCBhbmQvb3IgdGFyZ2V0CithcmNoaXRlY3R1cmUgaW52b2x2ZXMgdGhlIEJGRCBsaWJyYXJ5LiAgVGhlcmUgaXMgc29tZSBkb2N1bWVudGF0aW9uCitpbiAuLi9iZmQvZG9jLiAgVGhlIGZpbGUgLi4vZ2RiL2RvYy9nZGJpbnQudGV4aW5mbyAoZGlzdHJpYnV0ZWQKK3dpdGggZ2RiLTQueCkgbWF5IGFsc28gYmUgb2YgaGVscC4KKworUmVwb3J0aW5nIGJ1Z3MKKz09PT09PT09PT09PT09CisKK1NlbmQgYnVnIHJlcG9ydHMgYW5kIHBhdGNoZXMgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnLiAgQWx3YXlzIG1lbnRpb24KK3RoZSB2ZXJzaW9uIG51bWJlciB5b3UgYXJlIHJ1bm5pbmc7IHRoaXMgaXMgcHJpbnRlZCBieSBydW5uaW5nIGFueSBvZgordGhlIGJpbnV0aWxzIHdpdGggdGhlIC0tdmVyc2lvbiBvcHRpb24uICBXZSBhcHByZWNpYXRlIHJlcG9ydHMgYWJvdXQKK2J1Z3MsIGJ1dCB3ZSBkbyBub3QgcHJvbWlzZSB0byBmaXggdGhlbS4KKworVk1TCis9PT0KKworVGhpcyBzZWN0aW9uIHdhcyB3cml0dGVuIGJ5IEtsYXVzIEsiYW1wZiA8a2thZW1wZkBybWkuZGU+LiAgSXQKK2Rlc2NyaWJlcyBob3cgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIGJpbnV0aWxzIG9uIG9wZW5WTVMgKEFscGhhIGFuZAorVmF4KS4gIChUaGUgQkZEIGxpYnJhcnkgb25seSBzdXBwb3J0cyByZWFkaW5nIFZheCBvYmplY3QgZmlsZXMuKQorCitDb21waWxpbmcgdGhlIHJlbGVhc2U6CisKK1RvIGNvbXBpbGUgdGhlIGdudSBiaW5hcnkgdXRpbGl0aWVzIGFuZCB0aGUgZ251IGFzc2VtYmxlciwgeW91J2xsCituZWVkIERFQyBDIG9yIEdOVSBDIGZvciBvcGVuVk1TL0FscGhhLiBZb3UnbGwgbmVlZCAqYm90aCogY29tcGlsZXJzCitvbiBvcGVuVk1TL1ZheC4KKworQ29tcGlsaW5nIHdpdGggZWl0aGVyIERFQyBDIG9yIEdOVSBDIHdvcmtzIG9uIG9wZW5WTVMvQWxwaGEgb25seS4gU29tZQorb2YgdGhlIG9wY29kZXMgYW5kIGJpbnV0aWxzIGZpbGVzIHRyYXAgYSBidWcgaW4gdGhlIERFQyBDIG9wdGltaXplciwKK3NvIHRoZXNlIGZpbGVzIG11c3QgYmUgY29tcGlsZWQgd2l0aCAvbm9vcHQuCisKK0NvbXBpbGluZyBvbiBvcGVuVk1TL1ZheCBpcyBhIGJpdCBjb21wbGljYXRlZCwgYXMgdGhlIGJmZCBsaWJyYXJ5IHRyYXBzCithIGJ1ZyBpbiBHTlUgQyBhbmQgdGhlIGdudSBhc3NlbWJsZXIgYSBidWcgaW4gKG15IHZlcnNpb24gb2YpIERFQyBDLgorCitJIG5ldmVyIHRyaWVkIGNvbXBpbGluZyB3aXRoIFZBWCBDLgorCisKK1lvdSBmdXJ0aGVyIG5lZWQgR05VIE1ha2UgVmVyc2lvbiAzLjc2IG9yIGxhdGVyLiBUaGlzIGlzIGF2YWlsYWJsZQorYXQgZnRwLnByb2dpcy5kZSBvciBhbnkgR05VIGFyY2hpdmUgc2l0ZS4gVGhlIG1ha2VmaWxlcyBhc3N1bWUgdGhhdAorZ21ha2Ugc3RhcnRzIGdudSBtYWtlIGFzIGEgZm9yZWlnbiBjb21tYW5kLgorCitJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggREVDIEMgb3IgVkFYIEMsIHlvdSBtdXN0IHJ1bgorCisgICQgQHNldHVwCisKK2JlZm9yZSBzdGFydGluZyBnbnUtbWFrZS4gVGhpcyBpc24ndCBuZWVkZWQgd2l0aCBHTlUgQy4KKworT24gdGhlIEFscGhhIHlvdSBjYW4gY2hvb3NlIHRoZSBjb21waWxlciBieSBlZGl0aW5nIHRoZSB0b3BsZXZlbAorbWFrZWZpbGUudm1zLiBFaXRoZXIgc2VsZWN0IENDPWNjIChmb3IgREVDIEMpIG9yIENDPWdjYyAoZm9yIEdOVSBDKQorCisKK0luc3RhbGxpbmcgdGhlIHJlbGVhc2UKKworUHJvdmlkZWQgdGhhdCB5b3VyIGRpcmVjdG9yeSBzZXR1cCBjb25mb3JtcyB0byB0aGUgR05VIG9uIG9wZW5WTVMKK3N0YW5kYXJkLCB5b3UgYWxyZWFkeSBoYXZlIGEgY29uY2VhbGVkIGRldmljZWQgbmFtZWQgJ0dOVV9ST09UJy4KK0luIHRoaXMgY2FzZSwgYSBzaW1wbGUKKworICQgZ21ha2UgaW5zdGFsbAorCitzdWZmaWNlcyB0byBjb3B5IGFsbCBwcm9ncmFtcyBhbmQgbGlicmFyaWVzIHRvIHRoZSBwcm9wZXIgZGlyZWN0b3JpZXMuCisKK0RlZmluZSB0aGUgcHJvZ3JhbXMgYXMgZm9yZWlnbiBjb21tYW5kcyBieSBhZGRpbmcgdGhlc2UgbGluZXMgdG8geW91cgorbG9naW4uY29tOgorCisgICQgZ2FzIDo9PSAkR05VX1JPT1Q6W2Jpbl1hcy5leGUKKyAgJCBzaXplIDo9PSAkR05VX1JPT1Q6W2Jpbl1zaXplLmV4ZQorICAkIG5tIDo9PSAkR05VX1JPT1Q6W2Jpbl1ubS5leGUKKyAgJCBvYmpkdW1wIDo9PSAkR05VX1JPT1Q6W2Jpbl1vYmpkdW1wLmV4ZQorICAkIHN0cmluZ3MgOj09ICRHTlVfUk9PVDpbYmluXXN0cmluZ3MuZXhlCisKK0lmIHlvdSBoYXZlIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBzZXR1cCwgY29weSB0aGUgYmluYXJ5IHV0aWxpdGllcworKFsuYmludXRpbHNdc2l6ZS5leGUsIFsuYmludXRpbHNdbm0uZXhlLCBbLmJpbnV0aWxzXW9iamR1bXAuZXhlLAorYW5kIFsuYmludXRpbHNdc3RyaW5ncy5leGUpIGFuZCB0aGUgZ251IGFzc2VtYmxlciBhbmQgcHJlcHJvY2Vzc29yCisoWy5nYXNdYXMuZXhlIGFuZCBbLmdhc11nYXNwLmV4ZV0pIHRvIGEgZGlyZWN0b3J5IG9mIHlvdXIgY2hvaWNlCithbmQgZGVmaW5lIGFsbCBwcm9ncmFtcyBhcyBmb3JlaWduIGNvbW1hbmRzLgorCisKK0lmIHlvdSdyZSBzYXRpZXNmaWVkIHdpdGggdGhlIGNvbXBpbGF0aW9uLCB5b3UgbWF5IHdhbnQgdG8gcmVtb3ZlCit1bm5lZWRlZCBvYmplY3RzIGFuZCBsaWJyYXJpZXM6CisKKyAgJCBnbWFrZSBjbGVhbgorCisKK0lmIHlvdSBoYXZlIGFueSBwcm9ibGVtcyBvciBxdWVzdGlvbnMgYWJvdXQgdGhlIGJpbnV0aWxzIG9uIFZNUywgZmVlbAorZnJlZSB0byBtYWlsIG1lIGF0IGtrYWVtcGZAcm1pLmRlLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWNpbmNsdWRlLm00IGIvYmludXRpbHMvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjA5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSBAQAorc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FjbG9jYWwubTQgYi9iaW51dGlscy9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTE1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9hY2xvY2FsLm00CkBAIC0wLDAgKzEsMTEyMCBAQAorZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKKworZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitkbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKK2RubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKK2RubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2RubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK2RubCBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK3NpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCisKKyMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQorIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCisjIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIHNlcmlhbCAxCisKK2RubCBVc2FnZToKK2RubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCisKK0FDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCitbQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKK1BBQ0tBR0U9WyQxXQorQUNfU1VCU1QoUEFDS0FHRSkKK1ZFUlNJT049WyQyXQorQUNfU1VCU1QoVkVSU0lPTikKK2RubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKK2ZpCitpZmVsc2UoWyQzXSwsCitBQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCitBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKK0FDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCitBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCitkbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCisjCisKK0FDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKKyAgIGZpCisgICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKKyAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitybSAtZiBjb25mdGVzdCoKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKK2RubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQorZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KK0FDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKK1tBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAkMT0kMgorICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKK2Vsc2UKKyAgICQxPSIkMy9taXNzaW5nICQyIgorICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQorZmkKK0FDX1NVQlNUKCQxKV0pCisKKworIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCitBQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCitbQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCisKKyMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAorQUNfQ0FDSEVfU0FWRQorCisjIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgorQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCitMRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCitETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAorJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAorJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKK3x8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKKworIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZworQUNfQ0FDSEVfTE9BRAorCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKKyMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCitleGVjIDU+Pi4vY29uZmlnLmxvZworXSkKKworQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKK1tBQ19QUkVSRVEoMi4xMylkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCitBQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAorQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCitkbmwKKworIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KK2xpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKK3Rlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCit0ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgordGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKK3Rlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgordGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgordGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgorCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAiJGhvc3QiIGluCisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtMzIiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAorICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7OworCisqLSotY3lnd2luKikKKyAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCisgIDs7CisKK2VzYWMKKworIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCisKK0FDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAorWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKK25lZWRfbG9ja3M9JGVuYWJsZXZhbCwKK25lZWRfbG9ja3M9eWVzKQorCitpZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCisgIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgorZmkKK10pCisKKyMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKK0FDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCisKKyMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKKyMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQorIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bworIyAgIGB5ZXMnLgorQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKK1tkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShzaGFyZWQsCitjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCis8PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Oworbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyopCisgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc2hhcmVkPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjXSwKK2VuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAorXSkKKworIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCitBQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKK1tBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCisKKyMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKKyMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQorIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bworIyAgIGB5ZXMnLgorQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKK1tkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShzdGF0aWMsCitjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCis8PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfc3RhdGljPXllcyA7Oworbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyopCisgIGVuYWJsZV9zdGF0aWM9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc3RhdGljPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjXSwKK2VuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAorXSkKKworIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCitBQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKK1tBQ19FTkFCTEVfU1RBVElDKG5vKV0pCisKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAorW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAorY2hhbmdlcXVvdGUoWywgXSlkbmwKK1twPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKK25vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisqKQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhY10sCitlbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKK10pCisKKyMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCitBQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKK1tBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCisKKworIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihBQ19QUk9HX0xELAorW0FDX0FSR19XSVRIKGdudS1sZCwKK1sgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAordGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKKyAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAorICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KK2NoYW5nZXF1b3RlKCwpZG5sCisgICAgLyogfCBbQS1aYS16XTpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCitjaGFuZ2VxdW90ZShbLF0pZG5sCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisgICAgICBlbHNlCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpXSkKK0xEPSIkYWNfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTEQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQordGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKK0FDX1NVQlNUKExEKQorQUNfUFJPR19MRF9HTlUKK10pCisKK0FDX0RFRlVOKEFDX1BST0dfTERfR05VLAorW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAorWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitpZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCisgIGFjX2N2X3Byb2dfZ251X2xkPXllcworZWxzZQorICBhY19jdl9wcm9nX2dudV9sZD1ubworZmldKQorXSkKKworIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihBQ19QUk9HX05NLAorW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAorW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGFjX2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKKwlicmVhaworICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgorCWJyZWFrCisgICAgICBlbHNlCisJYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQorZmldKQorTk09IiRhY19jdl9wYXRoX05NIgorQUNfTVNHX1JFU1VMVChbJE5NXSkKK0FDX1NVQlNUKE5NKQorXSkKKworIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKKyMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgorQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAorIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK0FDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAorWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KKworY2hhbmdlcXVvdGUoLClkbmwKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK2FjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgorYWNfc3lteGZybT0nXDEgXDJcMyBcMycKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICBhY19zeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqKQorICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKKyAgOzsKK2hwdXgqKQorICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgOzsKK2lyaXgqKQorICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworc29sYXJpcyopCisgIGFjX3N5bWNvZGU9J1tCRFRdJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2lmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKK2ZpCitjaGFuZ2VxdW90ZShbLF0pZG5sCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgYWNfcGlwZV93b3Jrcz1ubworICBybSAtZiBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQorRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBhY19ubGlzdD1jb25mdGVzdC5ubQorICAKKyAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KKwltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJGFjX25saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCisKKwkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCitjb25zdCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdF9wdHJfdCBhZGRyZXNzOworfQorY2hhbmdlcXVvdGUoLClkbmwKK2x0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQorY2hhbmdlcXVvdGUoWyxdKWRubAoreworRU9GCisJc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCisJY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAorCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorCSAgICBhY19waXBlX3dvcmtzPXllcworCSAgZWxzZQorCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKKwkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQworCSAgZmkKKwkgIExJQlM9IiRhY19zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQworICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKKyAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgZWxzZQorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCisgICAgZmkKKyAgICBicmVhaworICBlbHNlCisgICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCisKK2FjX3Jlc3VsdD15ZXMKK2lmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICAgYWNfcmVzdWx0PW5vCitmaQorQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQorXSkKKworIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KK0FDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKK1tBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorXSkKKworIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPworQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAorQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKK1thY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQoraW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQorRU9GCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KKyAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKyAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCisgICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICBlbHNlCisgICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKKyAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQworZmkKK3JtIC1yZiBjb25mdGVzdCoKK10pCitBQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCitVU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99CitBQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCitdKQorCisjIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCitBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQorQUNfQ0hFQ0tfTElCKG0sIGNvcykKK10pCisKKyMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCisjIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bworIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKKyMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAorIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAorIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90CisjIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcworIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgorQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWworICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCisgIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OworICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7CisgIGVzYWMKKyAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCitdKQorCisjIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgorIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KKyMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCisjIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKKyMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKKyMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAorIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKKyMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KKyMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgorQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWworICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWworICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgorICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKKyAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKKyAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7CisgICAgZXNhYworICBdKQorICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCisgICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKKyAgZmkKK10pCisKK2RubCBvbGQgbmFtZXMKK0FDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCitBQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAorQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKK0FDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKK0FDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKK0FDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKK0FDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKK0FDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCitBQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAorQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKKworIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgorCitBQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAorW0FDX1BSRVJFUShbMi4xMl0pCitBQ19DT05GSUdfSEVBREVSKFskMV0pCitkbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KK2RubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKK2RubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCitkbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCitBQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCitpZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCis8PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAorPDxhbV9pbmR4PTEKK2ZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KKyAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgorICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgorICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4CisgICAgOzsKKyAgZXNhYworICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKK2RvbmU8PD4+ZG5sPj4pCitjaGFuZ2VxdW90ZShbLF0pKV0pCisKKworZG5sIEFNX1BST0dfTEVYCitkbmwgTG9vayBmb3IgZmxleCwgbGV4IG9yIG1pc3NpbmcsIHRoZW4gcnVuIEFDX1BST0dfTEVYIGFuZCBBQ19ERUNMX1lZVEVYVAorQUNfREVGVU4oQU1fUFJPR19MRVgsCitbbWlzc2luZ19kaXI9aWZlbHNlKFskMV0sLGBjZCAkYWNfYXV4X2RpciAmJiBwd2RgLCQxKQorQUNfQ0hFQ0tfUFJPR1MoTEVYLCBmbGV4IGxleCwgIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiKQorQUNfUFJPR19MRVgKK0FDX0RFQ0xfWVlURVhUXSkKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworQUNfREVGVU4oQ1lfV0lUSF9OTFMsCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKKyAgICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKKyAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICAgIEFDX1NVQlNUKFVTRV9OTFMpCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQorICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKwlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KKwlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKKwkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAorCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCisJICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKKwkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQorCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCisJCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKKwkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQorCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKwkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAorCQkgIFtDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCisJCSAgW0NBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliXSkKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCV0pCisKKwlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KKyAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KKworICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgorCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKKyAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorICAgICAgICBBQ19TVUJTVChNU0dGTVQpCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisJZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKwlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBBQ19NU0dfUkVTVUxUKAorCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKKyAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCisgICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKENBVEFMT0dTKQorICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKyAgICBBQ19TVUJTVChHTU9GSUxFUykKKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorICAgIEFDX1NVQlNUKElOVExERVBTKQorICAgIEFDX1NVQlNUKElOVExMSUJTKQorICAgIEFDX1NVQlNUKElOVExPQkpTKQorICAgIEFDX1NVQlNUKFBPRklMRVMpCisgICAgQUNfU1VCU1QoUE9TVUIpCisgIF0pCisKK0FDX0RFRlVOKENZX0dOVV9HRVRURVhULAorICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKworICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQorICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQorCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCisgICBmaQorCisgICBBTV9MQ19NRVNTQUdFUworICAgQ1lfV0lUSF9OTFMKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCisgICAgIGZpCisKKyAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCisgICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKKyAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKKworICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQorICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6CisgICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAorICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQorCisJIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcworICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCisJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCisgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKKyAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKKyAgIGRubCBwYWNrYWdlcy4KKyAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICBBQ19TVUJTVChHVF9OTykKKyAgIEFDX1NVQlNUKEdUX1lFUykKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKKworICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCisgICBsPQorICAgQUNfU1VCU1QobCkKKworICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKKyAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQorICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCisgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgXSkKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAorZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKK1sjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIFskM107IHRoZW4KKwlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAorZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCitpZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgorXSlkbmwKKyAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoWyRdJDEpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorQUNfU1VCU1QoJDEpZG5sCitdKQorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAorICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAorICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisJCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCisgICAgZmkKKyAgZmldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KKyMgRnJvbSBKaW0gTWV5ZXJpbmcKKworIyBzZXJpYWwgMQorCitBQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCisgIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKK1sgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQorICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQorICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICBBQ19TVUJTVChNQUlOVClkbmwKK10KKykKKworIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KKworQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCitbQUNfU1VCU1QoJDFfVFJVRSkKK0FDX1NVQlNUKCQxX0ZBTFNFKQoraWYgJDI7IHRoZW4KKyAgJDFfVFJVRT0KKyAgJDFfRkFMU0U9JyMnCitlbHNlCisgICQxX1RSVUU9JyMnCisgICQxX0ZBTFNFPQorZmldKQorCmRpZmYgLS1naXQgYS9iaW51dGlscy9hZGRyMmxpbmUuMSBiL2JpbnV0aWxzL2FkZHIybGluZS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2UxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9hZGRyMmxpbmUuMQpAQCAtMCwwICsxLDEyNyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy5cIiBTZWUgQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KKy5USCBhZGRyMmxpbmUgMSAiMjcgTWFyY2ggMTk5NyIgIkN5Z251cyBTb2x1dGlvbnMiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCisuZGUgQlAKKy5zcAorLnRpIFwtLjJpCitcKCoqCisuLgorCisuU0ggTkFNRQorYWRkcjJsaW5lIFwtIGNvbnZlcnQgYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzCisKKy5TSCBTWU5PUFNJUworLmh5IDAKKy5uYQorLlRQCisuQiBhZGRyMmxpbmUKKy5SQiAiW1x8IiAiXC1iXCAiXGMKKy5JIGJmZG5hbWVcYworLlJCICIgfCAiICJcLVwtdGFyZ2V0PSJcYworLkkgYmZkbmFtZVxjCitcJlx8XQorLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIgorLlJCICJbXHwiICJcLWVcICJcYworLkkgZmlsZW5hbWVcYworLlJCICIgfCAiICJcLVwtZXhlPSJcYworLkkgZmlsZW5hbWVcYworXCZcfF0KKy5SQiAiW1x8IiBcLWYgfCBcLVwtZnVuY3Rpb25zICJcfF0iCisuUkIgIltcfCIgXC1zIHwgXC1cLWJhc2VuYW1lcyAiXHxdIgorLlJCICJbXHwiIFwtSCB8IFwtXC1oZWxwICJcfF0iCisuUkIgIltcfCIgXC1WIHwgXC1cLXZlcnNpb24gIlx8XSIKKy5SQiAiW1x8IiBhZGRyIGFkZHIgLi4uICAiXHxdIgorLmFkIGIKKy5oeSAxCisuU0ggREVTQ1JJUFRJT04KK1xjCisuQiBhZGRyMmxpbmUKK3RyYW5zbGF0ZXMgcHJvZ3JhbSBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMuICBHaXZlbgorYW4gYWRkcmVzcyBhbmQgYW4gZXhlY3V0YWJsZSwgaXQgdXNlcyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZQorZXhlY3V0YWJsZSB0byBmaWd1cmUgb3V0IHdoaWNoIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCithc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhZGRyZXNzLgorCitUaGUgZXhlY3V0YWJsZSB0byB1c2UgaXMgc3BlY2lmaWVkIHdpdGggdGhlCisuQiBcLWUKK29wdGlvbi4gIFRoZSBkZWZhdWx0IGlzCisuQiBhLm91dFxjCitcJi4KKworLkIgYWRkcjJsaW5lCitoYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbi4KKworSW4gdGhlIGZpcnN0LCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLAorYW5kCisuQiBhZGRyMmxpbmUKK2Rpc3BsYXlzIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3MuCisKK0luIHRoZSBzZWNvbmQsCisuQiBhZGRyMmxpbmUKK3JlYWRzIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBmcm9tIHN0YW5kYXJkIGlucHV0LCBhbmQgcHJpbnRzIHRoZSBmaWxlCituYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaCBhZGRyZXNzIG9uIHN0YW5kYXJkIG91dHB1dC4gIEluIHRoaXMKK21vZGUsCisuQiBhZGRyMmxpbmUKK21heSBiZSB1c2VkIGluIGEgcGlwZSB0byBjb252ZXJ0IGR5bmFtaWNhbGx5IGNob3NlbiBhZGRyZXNzZXMuCisKK1RoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBpcyBGSUxFTkFNRTpMSU5FTk8uICBUaGUgZmlsZSBuYW1lIGFuZCBsaW5lCitudW1iZXIgZm9yIGVhY2ggYWRkcmVzcyBpcyBwcmludGVkIG9uIGEgc2VwYXJhdGUgbGluZS4gIElmIHRoZQorLkIgXC1mCitvcHRpb24gaXMgdXNlZCwgdGhlbiBlYWNoIEZJTEVOQU1FOkxJTkVOTyBsaW5lIGlzIHByZWNlZGVkIGJ5IGEKK0ZVTkNUSU9OTkFNRSBsaW5lIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZQorYWRkcmVzcy4KKworSWYgdGhlIGZpbGUgbmFtZSBvciBmdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwKKy5CIGFkZHIybGluZQord2lsbCBwcmludCB0d28gcXVlc3Rpb24gbWFya3MgaW4gdGhlaXIgcGxhY2UuICBJZiB0aGUgbGluZSBudW1iZXIgY2FuCitub3QgYmUgZGV0ZXJtaW5lZCwKKy5CIGFkZHIybGluZQord2lsbCBwcmludCAwLgorCisuU0ggT1BUSU9OUworLlRQCisuQkkgIlwtYiAiICJiZmRuYW1lIlxjCisuVFAKKy5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgorU3BlY2lmeSB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlCitcYworLkkgYmZkbmFtZVxjCitcJi4KKworLlRQCisuQiBcLUMKKy5UUAorLkIgXC1cLWRlbWFuZ2xlCitEZWNvZGUgKFxmSWRlbWFuZ2xlXGZQKSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KK0Jlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcworbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLgorCisuVFAKKy5CSSAiXC1lICIgImZpbGVuYW1lIlxjCisuVFAKKy5CSSAiXC1cLWV4ZT0iICJmaWxlbmFtZSIKK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZm9yIHdoaWNoIGFkZHJlc3NlcyBzaG91bGQgYmUKK3RyYW5zbGF0ZWQuICBUaGUgZGVmYXVsdCBmaWxlIGlzCisuQiBhLm91dFxjCitcJi4KKworLlRQCisuQiBcLWYKKy5UUAorLkIgXC1cLWZ1bmN0aW9ucworRGlzcGxheSBmdW5jdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgorCisuVFAKKy5CIFwtcworLlRQCisuQiBcLVwtYmFzZW5hbWVzCitEaXNwbGF5IG9ubHkgdGhlIGJhc2Ugb2YgZWFjaCBmaWxlIG5hbWUuCisKKy5TSCAiU0VFIEFMU08iCisuUkIgImBcfCIgYmludXRpbHMgIlx8JyIKK2VudHJ5IGluIAorLkIKK2luZm9cYworXCY7IAorLkkKK1RoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCitcJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWRkcjJsaW5lLmMgYi9iaW51dGlscy9hZGRyMmxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VlODY3Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYWRkcjJsaW5lLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qIGFkZHIybGluZS5jIC0tIGNvbnZlcnQgYWRkcmVzc2VzIHRvIGxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lCisgICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyIDxVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZT4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEZXJpdmVkIGZyb20gb2JqZHVtcC5jIGFuZCBubS5jIGJ5IFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlCisKKyAgIFVzYWdlOiAKKyAgIGFkZHIybGluZSBbb3B0aW9uc10gYWRkciBhZGRyIC4uLgorICAgb3IKKyAgIGFkZHIybGluZSBbb3B0aW9uc10gCisKKyAgIGJvdGggZm9ybXMgd3JpdGUgcmVzdWx0cyB0byBzdGRvdXQsIHRoZSBzZWNvbmQgZm9ybSByZWFkcyBhZGRyZXNzZXMKKyAgIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHN0ZGluLiAgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorCitleHRlcm4gY2hhciAqcHJvZ3JhbV92ZXJzaW9uOworCitzdGF0aWMgYm9vbGVhbiB3aXRoX2Z1bmN0aW9uczsJLyogLWYsIHNob3cgZnVuY3Rpb24gbmFtZXMuICAqLworc3RhdGljIGJvb2xlYW4gZG9fZGVtYW5nbGU7CS8qIC1DLCBkZW1hbmdsZSBuYW1lcy4gICovCitzdGF0aWMgYm9vbGVhbiBiYXNlX25hbWVzOwkvKiAtcywgc3RyaXAgZGlyZWN0b3J5IG5hbWVzLiAgKi8KKworc3RhdGljIGludCBuYWRkcjsJCS8qIE51bWJlciBvZiBhZGRyZXNzZXMgdG8gcHJvY2Vzcy4gICovCitzdGF0aWMgY2hhciAqKmFkZHI7CQkvKiBIZXggYWRkcmVzc2VzIHRvIHByb2Nlc3MuICAqLworCitzdGF0aWMgYXN5bWJvbCAqKnN5bXM7CQkvKiBTeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Cit7CisgIHsiYmFzZW5hbWVzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCisgIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKKyAgeyJleGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKKyAgeyJmdW5jdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKKyAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKKyAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCisgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAorICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Cit9OworCitzdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOworc3RhdGljIHZvaWQgc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CitzdGF0aWMgdm9pZCB0cmFuc2xhdGVfYWRkcmVzc2VzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKwwKKy8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSB0byBTVFJFQU0gYW5kIGV4aXQgd2l0aCBTVEFUVVMuICAqLworCitzdGF0aWMgdm9pZAordXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQorICAgICBGSUxFICpzdHJlYW07CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKKyAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuXAorICAgICAgIFstLWJhc2VuYW1lc10gWy0tZnVuY3Rpb25zXSBbYWRkciBhZGRyIC4uLl1cbiIpLAorCSAgIHByb2dyYW1fbmFtZSk7CisgIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7CisgIGV4aXQgKHN0YXR1cyk7Cit9CisMCisvKiBSZWFkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorc2x1cnBfc3ltdGFiIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGxvbmcgc3RvcmFnZTsKKyAgbG9uZyBzeW1jb3VudDsKKworICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykgPT0gMCkKKyAgICByZXR1cm47CisKKyAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKKyAgaWYgKHN0b3JhZ2UgPCAwKQorICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7CisKKyAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7CisgIGlmIChzeW1jb3VudCA8IDApCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Cit9CisMCisvKiBUaGVzZSBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbgorICAgdHJhbnNsYXRlX2FkZHJlc3NlcyBhbmQgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24uICAqLworCitzdGF0aWMgYmZkX3ZtYSBwYzsKK3N0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3N0YXRpYyBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7CitzdGF0aWMgdW5zaWduZWQgaW50IGxpbmU7CitzdGF0aWMgYm9vbGVhbiBmb3VuZDsKKworLyogTG9vayBmb3IgYW4gYWRkcmVzcyBpbiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKKyAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgUFRSIGRhdGE7Cit7CisgIGJmZF92bWEgdm1hOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisKKyAgaWYgKGZvdW5kKQorICAgIHJldHVybjsKKworICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfQUxMT0MpID09IDApCisgICAgcmV0dXJuOworCisgIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOworICBpZiAocGMgPCB2bWEpCisgICAgcmV0dXJuOworCisgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOworICBpZiAocGMgPj0gdm1hICsgc2l6ZSkKKyAgICByZXR1cm47CisKKyAgZm91bmQgPSBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bXMsIHBjIC0gdm1hLAorCQkJCSAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKTsKK30KKworLyogUmVhZCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbSBzdGRpbiwgdHJhbnNsYXRlIGludG8KKyAgIGZpbGVfbmFtZTpsaW5lX251bWJlciBhbmQgb3B0aW9uYWxseSBmdW5jdGlvbiBuYW1lLiAgKi8KKworc3RhdGljIHZvaWQKK3RyYW5zbGF0ZV9hZGRyZXNzZXMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IHJlYWRfc3RkaW4gPSAobmFkZHIgPT0gMCk7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAocmVhZF9zdGRpbikKKwl7CisJICBjaGFyIGFkZHJfaGV4WzEwMF07CisKKwkgIGlmIChmZ2V0cyAoYWRkcl9oZXgsIHNpemVvZiBhZGRyX2hleCwgc3RkaW4pID09IE5VTEwpCisJICAgIGJyZWFrOworCSAgcGMgPSBiZmRfc2Nhbl92bWEgKGFkZHJfaGV4LCBOVUxMLCAxNik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChuYWRkciA8PSAwKQorCSAgICBicmVhazsKKwkgIC0tbmFkZHI7CisJICBwYyA9IGJmZF9zY2FuX3ZtYSAoKmFkZHIrKywgTlVMTCwgMTYpOworCX0KKworICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24sIChQVFIpIE5VTEwpOworCisgICAgICBpZiAoISBmb3VuZCkKKwl7CisJICBpZiAod2l0aF9mdW5jdGlvbnMpCisJICAgIHByaW50ZiAoIj8/XG4iKTsKKwkgIHByaW50ZiAoIj8/OjBcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAod2l0aF9mdW5jdGlvbnMpCisJICAgIHsKKwkgICAgICBpZiAoZnVuY3Rpb25uYW1lID09IE5VTEwgfHwgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQorCQlwcmludGYgKCI/P1xuIik7CisJICAgICAgZWxzZSBpZiAoISBkb19kZW1hbmdsZSkKKwkJcHJpbnRmICgiJXNcbiIsIGZ1bmN0aW9ubmFtZSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgY2hhciAqcmVzOworCisJCSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKGZ1bmN0aW9ubmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOworCQkgIGlmIChyZXMgPT0gTlVMTCkKKwkJICAgIHByaW50ZiAoIiVzXG4iLCBmdW5jdGlvbm5hbWUpOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiJXNcbiIsIHJlcyk7CisJCSAgICAgIGZyZWUgKHJlcyk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICBpZiAoYmFzZV9uYW1lcyAmJiBmaWxlbmFtZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqaDsKKworCSAgICAgIGggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKKwkgICAgICBpZiAoaCAhPSBOVUxMKQorCQlmaWxlbmFtZSA9IGggKyAxOworCSAgICB9CisKKwkgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIj8/IiwgbGluZSk7CisJfQorCisgICAgICAvKiBmZmx1c2goKSBpcyBlc3NlbnRpYWwgZm9yIHVzaW5nIHRoaXMgY29tbWFuZCBhcyBhIHNlcnZlcgorICAgICAgICAgY2hpbGQgcHJvY2VzcyB0aGF0IHJlYWRzIGFkZHJlc3NlcyBmcm9tIGEgcGlwZSBhbmQgcmVzcG9uZHMKKyAgICAgICAgIHdpdGggbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIHByb2Nlc3Npbmcgb25lIGFkZHJlc3MgYXQgYQorICAgICAgICAgdGltZS4gICovCisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgfQorfQorCisvKiBQcm9jZXNzIGEgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpCisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Cit7CisgIGJmZCAqYWJmZDsKKyAgY2hhciAqKm1hdGNoaW5nOworCisgIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOworICBpZiAoYWJmZCA9PSBOVUxMKQorICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOworCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCisgICAgZmF0YWwgKF8oIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIiksIGZpbGVuYW1lKTsKKworICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQorCXsKKwkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOworCSAgZnJlZSAobWF0Y2hpbmcpOworCX0KKyAgICAgIHhleGl0ICgxKTsKKyAgICB9CisKKyAgc2x1cnBfc3ltdGFiIChhYmZkKTsKKworICB0cmFuc2xhdGVfYWRkcmVzc2VzIChhYmZkKTsKKworICBpZiAoc3ltcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKHN5bXMpOworICAgICAgc3ltcyA9IE5VTEw7CisgICAgfQorCisgIGJmZF9jbG9zZSAoYWJmZCk7Cit9CisMCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKnRhcmdldDsKKyAgaW50IGM7CisKKyNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKKyAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOworI2VuZGlmCisgIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOworICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKKworICBwcm9ncmFtX25hbWUgPSAqYXJndjsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIGJmZF9pbml0ICgpOworICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOworCisgIGZpbGVuYW1lID0gTlVMTDsKKyAgdGFyZ2V0ID0gTlVMTDsKKyAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOkNlOnNmSFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCisJICE9IEVPRikKKyAgICB7CisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgMDoKKwkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCisJY2FzZSAnYic6CisJICB0YXJnZXQgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdDJzoKKwkgIGRvX2RlbWFuZ2xlID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ2UnOgorCSAgZmlsZW5hbWUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdzJzoKKwkgIGJhc2VfbmFtZXMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnZic6CisJICB3aXRoX2Z1bmN0aW9ucyA9IHRydWU7CisJICBicmVhazsKKwljYXNlICdWJzoKKwkgIHByaW50X3ZlcnNpb24gKCJhZGRyMmxpbmUiKTsKKwkgIGJyZWFrOworCWNhc2UgJ0gnOgorCSAgdXNhZ2UgKHN0ZG91dCwgMCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgIGZpbGVuYW1lID0gImEub3V0IjsKKworICBhZGRyID0gYXJndiArIG9wdGluZDsKKyAgbmFkZHIgPSBhcmdjIC0gb3B0aW5kOworCisgIHByb2Nlc3NfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9hci4xIGIvYmludXRpbHMvYXIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU4Y2ZmCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYXIuMQpAQCAtMCwwICsxLDUwOSBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgorLlRIIGFyIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgorLmRlIEJQCisuc3AKKy50aSBcLS4yaQorXCgqKgorLi4KKworLlNIIE5BTUUKK2FyIFwtIGNyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzLgorCisuU0ggU1lOT1BTSVMKKy5oeSAwCisubmEKKy5CUiBhciAiIFtcfCIgIi0iICJcfF0iXGMKKy5JIHtkbXBxcnR4fVthYmNpbG9zU3V2Vl0gXGMKK1tcfFxjCisuSSBtZW1iZXJuYW1lXGMKK1wmXHxdIFxjCisuSSBhcmNoaXZlXGMKK1wmIFxjCisuSSBmaWxlc1xjCitcJi5cfC5cfC4KKworLmFkIGIKKy5oeSAxCisuU0ggREVTQ1JJUFRJT04KK1RoZSBHTlUgXGMKKy5CIGFyXGMKK1wmIHByb2dyYW0gY3JlYXRlcywgbW9kaWZpZXMsIGFuZCBleHRyYWN0cyBmcm9tCithcmNoaXZlcy4gIEFuIFxjCisuSSBhcmNoaXZlXGMKK1wmIGlzIGEgc2luZ2xlIGZpbGUgaG9sZGluZyBhIGNvbGxlY3Rpb24gb2YKK290aGVyIGZpbGVzIGluIGEgc3RydWN0dXJlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcmV0cmlldmUKK3RoZSBvcmlnaW5hbCBpbmRpdmlkdWFsIGZpbGVzIChjYWxsZWQgXGMKKy5JIG1lbWJlcnNcYworXCYgb2YgdGhlIGFyY2hpdmUpLgorCitUaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAorZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIG1heSBiZSByZWNvbnN0aXR1dGVkIG9uCitleHRyYWN0aW9uLiAgCisKK0dOVSBcYworLkIgYXJcYworXCYgY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKK2xlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBcYworLkIgYXJcYworXCYgaXMgY29uZmlndXJlZCBvbiB5b3VyCitzeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIChmb3IgY29tcGF0aWJpbGl0eQord2l0aCBhcmNoaXZlIGZvcm1hdHMgbWFpbnRhaW5lZCB3aXRoIG90aGVyIHRvb2xzKS4gIElmIGl0IGV4aXN0cywgdGhlCitsaW1pdCBpcyBvZnRlbiAxNSBjaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBhLm91dCkgb3IgMTYKK2NoYXJhY3RlcnMgKHR5cGljYWwgb2YgZm9ybWF0cyByZWxhdGVkIHRvIGNvZmYpLgorCitcYworLkIgYXJcYworXCYgaXMgY29uc2lkZXJlZCBhIGJpbmFyeSB1dGlsaXR5IGJlY2F1c2UgYXJjaGl2ZXMgb2YgdGhpcyBzb3J0CithcmUgbW9zdCBvZnRlbiB1c2VkIGFzIFxjCisuSSBsaWJyYXJpZXNcYworXCYgaG9sZGluZyBjb21tb25seSBuZWVkZWQKK3N1YnJvdXRpbmVzLgorCitcYworLkIgYXJcYworXCYgd2lsbCBjcmVhdGUgYW4gaW5kZXggdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiByZWxvY2F0YWJsZQorb2JqZWN0IG1vZHVsZXMgaW4gdGhlIGFyY2hpdmUgd2hlbiB5b3Ugc3BlY2lmeSB0aGUgbW9kaWZpZXIgYFx8XGMKKy5CIHNcYworXHwnLgorT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgXGMKKy5CIGFyXGMKK1wmCittYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBgXHxcYworLkIgcVxjCitcfCcgdXBkYXRlIG9wZXJhdGlvbikuCitBbiBhcmNoaXZlIHdpdGggc3VjaCBhbiBpbmRleCBzcGVlZHMgdXAgbGlua2luZyB0byB0aGUgbGlicmFyeSwgYW5kCithbGxvd3Mgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgdG8gY2FsbCBlYWNoIG90aGVyIHdpdGhvdXQgcmVnYXJkIHRvCit0aGVpciBwbGFjZW1lbnQgaW4gdGhlIGFyY2hpdmUuCisKK1lvdSBtYXkgdXNlIGBcfFxjCisuQiBubSBcLXNcYworXHwnIG9yIGBcfFxjCisuQiBubSBcLVwtcHJpbnRcLWFybWFwXGMKK1x8JyB0byBsaXN0IHRoaXMgaW5kZXgKK3RhYmxlLiAgSWYgYW4gYXJjaGl2ZSBsYWNrcyB0aGUgdGFibGUsIGFub3RoZXIgZm9ybSBvZiBcYworLkIgYXJcYworXCYgY2FsbGVkCitcYworLkIgcmFubGliXGMKK1wmIGNhbiBiZSB1c2VkIHRvIGFkZCBqdXN0IHRoZSB0YWJsZS4KKworXGMKKy5CIGFyXGMKK1wmIGluc2lzdHMgb24gYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyB0byBleGVjdXRlOiBvbmUKK2tleWxldHRlciBzcGVjaWZ5aW5nIHRoZSBcYworLkkgb3BlcmF0aW9uXGMKK1wmIChvcHRpb25hbGx5IGFjY29tcGFuaWVkIGJ5IG90aGVyCitrZXlsZXR0ZXJzIHNwZWNpZnlpbmcgXGMKKy5JIG1vZGlmaWVyc1xjCitcJiksIGFuZCB0aGUgYXJjaGl2ZSBuYW1lIHRvIGFjdCBvbi4KKworTW9zdCBvcGVyYXRpb25zIGNhbiBhbHNvIGFjY2VwdCBmdXJ0aGVyIFxjCisuSSBmaWxlc1xjCitcJiBhcmd1bWVudHMsCitzcGVjaWZ5aW5nIHBhcnRpY3VsYXIgZmlsZXMgdG8gb3BlcmF0ZSBvbi4KKworLlNIIE9QVElPTlMKK0dOVSBcYworLkIgYXJcYworXCYgYWxsb3dzIHlvdSB0byBtaXggdGhlIG9wZXJhdGlvbiBjb2RlIFxjCisuSSBwXGMKK1wmIGFuZCBtb2RpZmllcgorZmxhZ3MgXGMKKy5JIG1vZFxjCitcJiBpbiBhbnkgb3JkZXIsIHdpdGhpbiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50LgorCitJZiB5b3Ugd2lzaCwgeW91IG1heSBiZWdpbiB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50IHdpdGggYQorZGFzaC4KKworVGhlIFxjCisuSSBwXGMKK1wmIGtleWxldHRlciBzcGVjaWZpZXMgd2hhdCBvcGVyYXRpb24gdG8gZXhlY3V0ZTsgaXQgbWF5IGJlCithbnkgb2YgdGhlIGZvbGxvd2luZywgYnV0IHlvdSBtdXN0IHNwZWNpZnkgb25seSBvbmUgb2YgdGhlbToKKworLlRQCisuQiBkCitcYworLkkgRGVsZXRlXGMKK1wmIG1vZHVsZXMgZnJvbSB0aGUgYXJjaGl2ZS4gIFNwZWNpZnkgdGhlIG5hbWVzIG9mIG1vZHVsZXMgdG8KK2JlIGRlbGV0ZWQgYXMgXGMKKy5JIGZpbGVzXGMKK1wmOyB0aGUgYXJjaGl2ZSBpcyB1bnRvdWNoZWQgaWYgeW91CitzcGVjaWZ5IG5vIGZpbGVzIHRvIGRlbGV0ZS4KKworSWYgeW91IHNwZWNpZnkgdGhlIGBcfFxjCisuQiB2XGMKK1x8JyBtb2RpZmllciwgXGMKKy5CIGFyXGMKK1wmIHdpbGwgbGlzdCBlYWNoIG1vZHVsZQorYXMgaXQgaXMgZGVsZXRlZC4KKworLlRQCisuQiBtCitVc2UgdGhpcyBvcGVyYXRpb24gdG8gXGMKKy5JIG1vdmVcYworXCYgbWVtYmVycyBpbiBhbiBhcmNoaXZlLgorCitUaGUgb3JkZXJpbmcgb2YgbWVtYmVycyBpbiBhbiBhcmNoaXZlIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBpbiBob3cKK3Byb2dyYW1zIGFyZSBsaW5rZWQgdXNpbmcgdGhlIGxpYnJhcnksIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgaW4gbW9yZQordGhhbiBvbmUgbWVtYmVyLiAgCisKK0lmIG5vIG1vZGlmaWVycyBhcmUgdXNlZCB3aXRoIFxjCisuQiBtXGMKK1wmLCBhbnkgbWVtYmVycyB5b3UgbmFtZSBpbiB0aGUKK1xjCisuSSBmaWxlc1xjCitcJiBhcmd1bWVudHMgYXJlIG1vdmVkIHRvIHRoZSBcYworLkkgZW5kXGMKK1wmIG9mIHRoZSBhcmNoaXZlOworeW91IGNhbiB1c2UgdGhlIGBcfFxjCisuQiBhXGMKK1x8JywgYFx8XGMKKy5CIGJcYworXHwnLCBvciBgXHxcYworLkIgaVxjCitcfCcgbW9kaWZpZXJzIHRvIG1vdmUgdGhlbSB0byBhCitzcGVjaWZpZWQgcGxhY2UgaW5zdGVhZC4KKworLlRQCisuQiBwCitcYworLkkgUHJpbnRcYworXCYgdGhlIHNwZWNpZmllZCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLCB0byB0aGUgc3RhbmRhcmQKK291dHB1dCBmaWxlLiAgSWYgdGhlIGBcfFxjCisuQiB2XGMKK1x8JyBtb2RpZmllciBpcyBzcGVjaWZpZWQsIHNob3cgdGhlIG1lbWJlcgorbmFtZSBiZWZvcmUgY29weWluZyBpdHMgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgorCitJZiB5b3Ugc3BlY2lmeSBubyBcYworLkkgZmlsZXNcYworXCYsIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgYXJlIHByaW50ZWQuCisKKy5UUAorLkIgcQorXGMKKy5JIFF1aWNrIGFwcGVuZFxjCitcJjsgYWRkIFxjCisuSSBmaWxlc1xjCitcJiB0byB0aGUgZW5kIG9mIFxjCisuSSBhcmNoaXZlXGMKK1wmLAord2l0aG91dCBjaGVja2luZyBmb3IgcmVwbGFjZW1lbnQuICAKKworVGhlIG1vZGlmaWVycyBgXHxcYworLkIgYVxjCitcfCcsIGBcfFxjCisuQiBiXGMKK1x8JywgYW5kIGBcfFxjCisuQiBpXGMKK1x8JyBkbyBcYworLkkgbm90XGMKK1wmIGFmZmVjdCB0aGlzCitvcGVyYXRpb247IG5ldyBtZW1iZXJzIGFyZSBhbHdheXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuCisKK1RoZSBtb2RpZmllciBgXHxcYworLkIgdlxjCitcfCcgbWFrZXMgXGMKKy5CIGFyXGMKK1wmIGxpc3QgZWFjaCBmaWxlIGFzIGl0IGlzIGFwcGVuZGVkLgorCitTaW5jZSB0aGUgcG9pbnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgc3BlZWQsIHRoZSBhcmNoaXZlJ3Mgc3ltYm9sIHRhYmxlCitpbmRleCBpcyBub3QgdXBkYXRlZCwgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQ7IHlvdSBjYW4gdXNlIGBcfFxjCisuQiBhciBzXGMKK1x8JyBvcgorXGMKKy5CIHJhbmxpYlxjCitcJiBleHBsaWNpdGx5IHRvIHVwZGF0ZSB0aGUgc3ltYm9sIHRhYmxlIGluZGV4LgorCitIb3dldmVyLCB0b28gbWFueSBkaWZmZXJlbnQgc3lzdGVtcyBhc3N1bWUgcXVpY2sgYXBwZW5kIHJlYnVpbGRzIHRoZQoraW5kZXgsIHNvIEdOVQorLkIgYXIKK2ltcGxlbWVudHMgYFx8XGMKKy5CIHFcYworXHwnIGFzIGEgc3lub255bSBmb3IgYFx8XGMKKy5CIHJcYworXHwnLgorCisuVFAKKy5CIHIKK0luc2VydCBcYworLkkgZmlsZXNcYworXCYgaW50byBcYworLkkgYXJjaGl2ZVxjCitcJiAod2l0aCBcYworLkkgcmVwbGFjZW1lbnRcYworXCYpLiBUaGlzCitvcGVyYXRpb24gZGlmZmVycyBmcm9tIGBcfFxjCisuQiBxXGMKK1x8JyBpbiB0aGF0IGFueSBwcmV2aW91c2x5IGV4aXN0aW5nIG1lbWJlcnMKK2FyZSBkZWxldGVkIGlmIHRoZWlyIG5hbWVzIG1hdGNoIHRob3NlIGJlaW5nIGFkZGVkLgorCitJZiBvbmUgb2YgdGhlIGZpbGVzIG5hbWVkIGluIFxjCisuSSBmaWxlc1xjCitcJiBkb2Vzbid0IGV4aXN0LCBcYworLkIgYXJcYworXCYKK2Rpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCBsZWF2ZXMgdW5kaXN0dXJiZWQgYW55IGV4aXN0aW5nIG1lbWJlcnMKK29mIHRoZSBhcmNoaXZlIG1hdGNoaW5nIHRoYXQgbmFtZS4KKworQnkgZGVmYXVsdCwgbmV3IG1lbWJlcnMgYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IGJ1dCB5b3UgbWF5Cit1c2Ugb25lIG9mIHRoZSBtb2RpZmllcnMgYFx8XGMKKy5CIGFcYworXHwnLCBgXHxcYworLkIgYlxjCitcfCcsIG9yIGBcfFxjCisuQiBpXGMKK1x8JyB0byByZXF1ZXN0CitwbGFjZW1lbnQgcmVsYXRpdmUgdG8gc29tZSBleGlzdGluZyBtZW1iZXIuCisKK1RoZSBtb2RpZmllciBgXHxcYworLkIgdlxjCitcfCcgdXNlZCB3aXRoIHRoaXMgb3BlcmF0aW9uIGVsaWNpdHMgYSBsaW5lIG9mCitvdXRwdXQgZm9yIGVhY2ggZmlsZSBpbnNlcnRlZCwgYWxvbmcgd2l0aCBvbmUgb2YgdGhlIGxldHRlcnMgYFx8XGMKKy5CIGFcYworXHwnIG9yCitgXHxcYworLkIgclxjCitcfCcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZmlsZSB3YXMgYXBwZW5kZWQgKG5vIG9sZCBtZW1iZXIKK2RlbGV0ZWQpIG9yIHJlcGxhY2VkLgorCisuVFAKKy5CIHQKK0Rpc3BsYXkgYSBcYworLkkgdGFibGVcYworXCYgbGlzdGluZyB0aGUgY29udGVudHMgb2YgXGMKKy5JIGFyY2hpdmVcYworXCYsIG9yIHRob3NlCitvZiB0aGUgZmlsZXMgbGlzdGVkIGluIFxjCisuSSBmaWxlc1xjCitcJiB0aGF0IGFyZSBwcmVzZW50IGluIHRoZQorYXJjaGl2ZS4gIE5vcm1hbGx5IG9ubHkgdGhlIG1lbWJlciBuYW1lIGlzIHNob3duOyBpZiB5b3UgYWxzbyB3YW50IHRvCitzZWUgdGhlIG1vZGVzIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGdyb3VwLCBhbmQgc2l6ZSwgeW91IGNhbgorcmVxdWVzdCB0aGF0IGJ5IGFsc28gc3BlY2lmeWluZyB0aGUgYFx8XGMKKy5CIHZcYworXHwnIG1vZGlmaWVyLgorCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW55IFxjCisuSSBmaWxlc1xjCitcJiwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCithcmUgbGlzdGVkLgorCitJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIChzYXksIGBcfFxjCisuQiBmaWVcYworXHwnKSBpbgorYW4gYXJjaGl2ZSAoc2F5IGBcfFxjCisuQiBiLmFcYworXHwnKSwgYFx8XGMKKy5CIGFyIHQgYi5hIGZpZVxjCitcfCcgd2lsbCBsaXN0IG9ubHkgdGhlCitmaXJzdCBpbnN0YW5jZTsgdG8gc2VlIHRoZW0gYWxsLCB5b3UgbXVzdCBhc2sgZm9yIGEgY29tcGxldGUKK2xpc3RpbmdcKGVtXCZpbiBvdXIgZXhhbXBsZSwgYFx8XGMKKy5CIGFyIHQgYi5hXGMKK1x8Jy4KKworLlRQCisuQiB4CitcYworLkkgRXh0cmFjdFxjCitcJiBtZW1iZXJzIChuYW1lZCBcYworLkkgZmlsZXNcYworXCYpIGZyb20gdGhlIGFyY2hpdmUuICBZb3UgY2FuCit1c2UgdGhlIGBcfFxjCisuQiB2XGMKK1x8JyBtb2RpZmllciB3aXRoIHRoaXMgb3BlcmF0aW9uLCB0byByZXF1ZXN0IHRoYXQKK1xjCisuQiBhclxjCitcJiBsaXN0IGVhY2ggbmFtZSBhcyBpdCBleHRyYWN0cyBpdC4KKworSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBcYworLkkgZmlsZXNcYworXCYsIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQorYXJlIGV4dHJhY3RlZC4KKworLlBQCisKK0EgbnVtYmVyIG9mIG1vZGlmaWVycyAoXGMKKy5JIG1vZFxjCitcJikgbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgXGMKKy5JIHBcYworXCYKK2tleWxldHRlciwgdG8gc3BlY2lmeSB2YXJpYXRpb25zIG9uIGFuIG9wZXJhdGlvbidzIGJlaGF2aW9yOgorCisuVFAKKy5CIGEKK0FkZCBuZXcgZmlsZXMgXGMKKy5JIGFmdGVyXGMKK1wmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKK2FyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYworLkIgYVxjCitcJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQorbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKKy5JIG1lbWJlcm5hbWVcYworXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKK1xjCisuSSBhcmNoaXZlXGMKK1wmIHNwZWNpZmljYXRpb24uCisKKy5UUAorLkIgYgorQWRkIG5ldyBmaWxlcyBcYworLkkgYmVmb3JlXGMKK1wmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKK2FyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYworLkIgYlxjCitcJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQorbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKKy5JIG1lbWJlcm5hbWVcYworXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKK1xjCisuSSBhcmNoaXZlXGMKK1wmIHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBgXHxcYworLkIgaVxjCitcfCcpLgorCisuVFAKKy5CIGMKK1xjCisuSSBDcmVhdGVcYworXCYgdGhlIGFyY2hpdmUuICBUaGUgc3BlY2lmaWVkIFxjCisuSSBhcmNoaXZlXGMKK1wmIGlzIGFsd2F5cworY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QsIHdoZW4geW91IHJlcXVlc3QgYW4gdXBkYXRlLiAgQnV0IGEgd2FybmluZyBpcworaXNzdWVkIHVubGVzcyB5b3Ugc3BlY2lmeSBpbiBhZHZhbmNlIHRoYXQgeW91IGV4cGVjdCB0byBjcmVhdGUgaXQsIGJ5Cit1c2luZyB0aGlzIG1vZGlmaWVyLgorCisuVFAKKy5CIGYKK1RydW5jYXRlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAgCisuQiBhcgord2lsbCBub3JtYWxseSBwZXJtaXQgZmlsZSBuYW1lcyBvZiBhbnkgbGVuZ3RoLiAgVGhpcyB3aWxsIGNhdXNlIGl0IHRvCitjcmVhdGUgYXJjaGl2ZXMgd2hpY2ggYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5hdGl2ZSAKKy5CIGFyCitwcm9ncmFtIG9uIHNvbWUgc3lzdGVtcy4gIElmIHRoaXMgaXMgYSBjb25jZXJuLCB0aGUgCisuQiBmCittb2RpZmllciBtYXkgYmUgdXNlZCB0byB0cnVuY2F0ZSBmaWxlIG5hbWVzIHdoZW4gcHV0dGluZyB0aGVtIGluIHRoZQorYXJjaGl2ZS4KKworLlRQCisuQiBpCitJbnNlcnQgbmV3IGZpbGVzIFxjCisuSSBiZWZvcmVcYworXCYgYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQorYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIFxjCisuQiBpXGMKK1wmLCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCittZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBcYworLkkgbWVtYmVybmFtZVxjCitcJiBhcmd1bWVudCwgYmVmb3JlIHRoZQorXGMKKy5JIGFyY2hpdmVcYworXCYgc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIGBcfFxjCisuQiBiXGMKK1x8JykuCisKKy5UUAorLkIgbAorVGhpcyBtb2RpZmllciBpcyBhY2NlcHRlZCBidXQgbm90IHVzZWQuCisKKy5UUAorLkIgbworUHJlc2VydmUgdGhlIFxjCisuSSBvcmlnaW5hbFxjCitcJiBkYXRlcyBvZiBtZW1iZXJzIHdoZW4gZXh0cmFjdGluZyB0aGVtLiAgSWYKK3lvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIG1vZGlmaWVyLCBmaWxlcyBleHRyYWN0ZWQgZnJvbSB0aGUgYXJjaGl2ZQord2lsbCBiZSBzdGFtcGVkIHdpdGggdGhlIHRpbWUgb2YgZXh0cmFjdGlvbi4KKworLlRQCisuQiBzCitXcml0ZSBhbiBvYmplY3QtZmlsZSBpbmRleCBpbnRvIHRoZSBhcmNoaXZlLCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lLAorZXZlbiBpZiBubyBvdGhlciBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgYXJjaGl2ZS4gIFlvdSBtYXkgdXNlIHRoaXMgbW9kaWZpZXIKK2ZsYWcgZWl0aGVyIHdpdGggYW55IG9wZXJhdGlvbiwgb3IgYWxvbmUuICBSdW5uaW5nIGBcfFxjCisuQiBhciBzXGMKK1x8JyBvbiBhbgorYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgYFx8XGMKKy5CIHJhbmxpYlxjCitcfCcgb24gaXQuCisKKy5UUAorLkIgUworRG8gbm90IGdlbmVyYXRlIGFuIGFyY2hpdmUgc3ltYm9sIHRhYmxlLiAgVGhpcyBjYW4gc3BlZWQgdXAgYnVpbGRpbmcgYQorbGFyZ2UgbGlicmFyeSBpbiBzZXZlcmFsIHN0ZXBzLiAgVGhlIHJlc3VsdGluZyBhcmNoaXZlIGNhbiBub3QgYmUgdXNlZAord2l0aCB0aGUgbGlua2VyLiAgSW4gb3JkZXIgdG8gYnVpbGQgYSBzeW1ib2wgdGFibGUsIHlvdSBtdXN0IG9taXQgdGhlCitgXHxcYworLkIgU1xjCitcfCcgbW9kaWZpZXIgb24gdGhlIGxhc3QgZXhlY3V0aW9uIG9mIGBcfFxjCisuQiBhclxjCitcfCcsIG9yIHlvdSBtdXN0IHJ1biBgXHxcYworLkIgcmFubGliXGMKK1x8JyBvbiB0aGUgYXJjaGl2ZS4KKworLlRQCisuQiB1CitOb3JtYWxseSwgXGMKKy5CIGFyIHJcYworXCYuXHwuXHwuIGluc2VydHMgYWxsIGZpbGVzCitsaXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBcYworLkkgb25seVxjCitcJiB0aG9zZQorb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQorbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIGBcfFxjCisuQiB1XGMKK1x8JyBtb2RpZmllciBpcyBhbGxvd2VkIG9ubHkgZm9yIHRoZQorb3BlcmF0aW9uIGBcfFxjCisuQiByXGMKK1x8JyAocmVwbGFjZSkuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29tYmluYXRpb24gYFx8XGMKKy5CIHF1XGMKK1x8JyBpcworbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCithZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIGBcfFxjCisuQiBxXGMKK1x8Jy4KKworLlRQCisuQiB2CitUaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBcYworLkkgdmVyYm9zZVxjCitcJiB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKK29wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCit3aGVuIHRoZSBtb2RpZmllciBgXHxcYworLkIgdlxjCitcfCcgaXMgYXBwZW5kZWQuCisKKy5UUAorLkIgVgorVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKy5CUiBhciAuCisKKy5QUAorCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCitlbnRyeSBpbiAKKy5CCitpbmZvXGMKK1wmOyAKKy5JCitUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYworLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCisuQlIgbm0gKCAxIClcYworXCYsCisuQlIgcmFubGliICggMSApXGMKK1wmLgorCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9hci5jIGIvYmludXRpbHMvYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTUxZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYXIuYwpAQCAtMCwwICsxLDEzMzggQEAKKy8qIGFyLmMgLSBBcmNoaXZlIG1vZGlmeSBhbmQgZXh0cmFjdC4KKyAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwwKKy8qCisgICBCdWdzOiBzaG91bGQgdXNlIGdldG9wdCB0aGUgd2F5IHRhciBkb2VzIChjb21wbGV0ZSB3L29wdGlvbmFsIC0pIGFuZAorICAgc2hvdWxkIGhhdmUgbG9uZyBvcHRpb25zIHRvby4gR05VIGFyIHVzZWQgdG8gY2hlY2sgZmlsZSBhZ2FpbnN0IGZpbGVzeXN0ZW0KKyAgIGluIHF1aWNrX3VwZGF0ZSBhbmQgcmVwbGFjZSBvcGVyYXRpb25zICh3b3VsZCBjaGVjayBtdGltZSkuIERvZXNuJ3Qgd2FybgorICAgd2hlbiBuYW1lIHRydW5jYXRlZC4gTm8gd2F5IHRvIHNwZWNpZnkgcG9zX2VuZC4gRXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlCisgICBtb3JlIGNvbnNpc3RhbnQuCisqLworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAiYW91dC9hci5oIgorI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImFyc3VwLmgiCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIF9fR08zMl9fXworI2RlZmluZSBFWFRfTkFNRV9MRU4gMwkJLyogYnVmZmxlbiBvZiBhZGRpdGlvbiB0byBuYW1lIGlmIGl0J3MgTVMtRE9TICovCisjZWxzZQorI2RlZmluZSBFWFRfTkFNRV9MRU4gNgkJLyogZGl0dG8gZm9yICpOSVggKi8KKyNlbmRpZgorCisjZGVmaW5lIEJVRlNJWkUgODE5MgorCisvKiBLbHVkZ2UgZGVjbGFyYXRpb24gZnJvbSBCRkQhICBUaGlzIGlzIHVnbHkhICBGSVhNRSEgIFhYWCAqLworCitzdHJ1Y3QgYXJfaGRyICoKKyAgYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgUEFSQU1TICgoYmZkICogYWJmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKKworLyogU3RhdGljIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorbXJpX2VtdWwgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgY29uc3QgY2hhciAqCitub3JtYWxpemUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKikpOworCitzdGF0aWMgdm9pZAorcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCittYXBfb3Zlcl9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQgKiksIGNoYXIgKiosIGludCkpOworCitzdGF0aWMgdm9pZAorcHJpbnRfY29udGVudHMgUEFSQU1TICgoYmZkICogbWVtYmVyKSk7CisKK3N0YXRpYyB2b2lkCitkZWxldGVfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZSkpOworCisjaWYgMAorc3RhdGljIHZvaWQKK2RvX3F1aWNrX2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lLAorCQkJIGNoYXIgKipmaWxlc190b19hcHBlbmQpKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorbW92ZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fbW92ZSkpOworCitzdGF0aWMgdm9pZAorcmVwbGFjZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fcmVwbGFjZSwgYm9vbGVhbiBxdWljaykpOworCitzdGF0aWMgdm9pZAorcHJpbnRfZGVzY3IgUEFSQU1TICgoYmZkICogYWJmZCkpOworCitzdGF0aWMgdm9pZAord3JpdGVfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOworCitzdGF0aWMgdm9pZAorcmFubGliX29ubHkgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaG5hbWUpKTsKKworc3RhdGljIHZvaWQKK3JhbmxpYl90b3VjaCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNobmFtZSkpOworCitzdGF0aWMgdm9pZAordXNhZ2UgUEFSQU1TICgoaW50KSk7CisMCisvKiogR2xvYmFscyBhbmQgZmxhZ3MgKi8KKworaW50IG1yaV9tb2RlOworCisvKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWI6CisgICAxIG1lYW5zIHRoaXMgaXMgJ3JhbmxpYic7IDAgbWVhbnMgdGhpcyBpcyAnYXInLgorICAgLTEgbWVhbnMgaWYgd2Ugc2hvdWxkIHVzZSBhcmd2WzBdIHRvIGRlY2lkZS4gICovCitleHRlcm4gaW50IGlzX3JhbmxpYjsKKworLyogTm9uemVybyBtZWFucyBkb24ndCB3YXJuIGFib3V0IGNyZWF0aW5nIHRoZSBhcmNoaXZlIGZpbGUgaWYgbmVjZXNzYXJ5LiAgKi8KK2ludCBzaWxlbnRfY3JlYXRlID0gMDsKKworLyogTm9uemVybyBtZWFucyBkZXNjcmliZSBlYWNoIGFjdGlvbiBwZXJmb3JtZWQuICAqLworaW50IHZlcmJvc2UgPSAwOworCisvKiBOb256ZXJvIG1lYW5zIHByZXNlcnZlIGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICAqLworaW50IHByZXNlcnZlX2RhdGVzID0gMDsKKworLyogTm9uemVybyBtZWFucyBkb24ndCByZXBsYWNlIGV4aXN0aW5nIG1lbWJlcnMgd2hvc2UgZGF0ZXMgYXJlIG1vcmUgcmVjZW50CisgICB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzLiAgKi8KK2ludCBuZXdlcl9vbmx5ID0gMDsKKworLyogQ29udHJvbHMgdGhlIHdyaXRpbmcgb2YgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUgKGluIEJTRDogYSBfXy5TWU1ERUYKKyAgIG1lbWJlcikuICAtMSBtZWFucyB3ZSd2ZSBiZWVuIGV4cGxpY2l0bHkgYXNrZWQgdG8gbm90IHdyaXRlIGEgc3ltYm9sIHRhYmxlOworICAgKzEgbWVhbnMgd2UndmUgYmVlbiBleHBsaWN0bHkgYXNrZWQgdG8gd3JpdGUgaXQ7CisgICAwIGlzIHRoZSBkZWZhdWx0LgorICAgVHJhZGl0aW9uYWxseSwgdGhlIGRlZmF1bHQgaW4gQlNEIGhhcyBiZWVuIHRvIG5vdCB3cml0ZSB0aGUgdGFibGUuCisgICBIb3dldmVyLCBmb3IgUE9TSVguMiBjb21wbGlhbmNlIHRoZSBkZWZhdWx0IGlzIG5vdyB0byB3cml0ZSBhIHN5bWJvbCB0YWJsZQorICAgaWYgYW55IG9mIHRoZSBtZW1iZXJzIGFyZSBvYmplY3QgZmlsZXMuICAqLworaW50IHdyaXRlX2FybWFwID0gMDsKKworLyogTm9uemVybyBtZWFucyBpdCdzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1lbWJlcjsgcG9zaXRpb24gbmV3IG9yIG1vdmVkCisgICBmaWxlcyB3aXRoIHJlc3BlY3QgdG8gdGhpcyBvbmUuICAqLworY2hhciAqcG9zbmFtZSA9IE5VTEw7CisKKy8qIFNleiBob3cgdG8gdXNlIGBwb3NuYW1lJzogcG9zX2JlZm9yZSBtZWFucyBwb3NpdGlvbiBiZWZvcmUgdGhhdCBtZW1iZXIuCisgICBwb3NfYWZ0ZXIgbWVhbnMgcG9zaXRpb24gYWZ0ZXIgdGhhdCBtZW1iZXIuIHBvc19lbmQgbWVhbnMgYWx3YXlzIGF0IGVuZC4KKyAgIHBvc19kZWZhdWx0IG1lYW5zIGRlZmF1bHQgYXBwcm9wcmlhdGVseS4gRm9yIHRoZSBsYXR0ZXIgdHdvLCBgcG9zbmFtZScKKyAgIHNob3VsZCBhbHNvIGJlIHplcm8uICAqLworZW51bSBwb3MKKyAgeworICAgIHBvc19kZWZhdWx0LCBwb3NfYmVmb3JlLCBwb3NfYWZ0ZXIsIHBvc19lbmQKKyAgfSBwb3N0eXBlID0gcG9zX2RlZmF1bHQ7CisKK3N0YXRpYyBiZmQgKioKK2dldF9wb3NfYmZkIFBBUkFNUyAoKGJmZCAqKiwgZW51bSBwb3MsIGNvbnN0IGNoYXIgKikpOworCisvKiBXaGV0aGVyIHRvIHRydW5jYXRlIG5hbWVzIG9mIGZpbGVzIHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4gICovCitzdGF0aWMgYm9vbGVhbiBhcl90cnVuY2F0ZSA9IGZhbHNlOworCitpbnQgaW50ZXJhY3RpdmUgPSAwOworCitzdGF0aWMgdm9pZAorbXJpX2VtdWwgKCkKK3sKKyAgaW50ZXJhY3RpdmUgPSBpc2F0dHkgKGZpbGVubyAoc3RkaW4pKTsKKyAgeXlwYXJzZSAoKTsKK30KKworLyogSWYgQ09VTlQgaXMgMCwgdGhlbiBGVU5DVElPTiBpcyBjYWxsZWQgb25jZSBvbiBlYWNoIGVudHJ5LiAgSWYgbm9uemVybywKKyAgIENPVU5UIGlzIHRoZSBsZW5ndGggb2YgdGhlIEZJTEVTIGNoYWluOyBGVU5DVElPTiBpcyBjYWxsZWQgb24gZWFjaCBlbnRyeQorICAgd2hvc2UgbmFtZSBtYXRjaGVzIG9uZSBpbiBGSUxFUy4gICovCisKK3N0YXRpYyB2b2lkCittYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBmdW5jdGlvbiwgZmlsZXMsIGNvdW50KQorICAgICBiZmQgKmFyY2g7CisgICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoYmZkICopKTsKKyAgICAgY2hhciAqKmZpbGVzOworICAgICBpbnQgY291bnQ7Cit7CisgIGJmZCAqaGVhZDsKKworICBpZiAoY291bnQgPT0gMCkKKyAgICB7CisgICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKKwl7CisJICBQUk9HUkVTUyAoMSk7CisJICBmdW5jdGlvbiAoaGVhZCk7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgLyogVGhpcyBtYXkgYXBwZWFyIHRvIGJlIGEgYmFyb3F1ZSB3YXkgb2YgYWNjb21wbGlzaGluZyB3aGF0IHdlIHdhbnQuCisgICAgIEhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlciB0byBub3RpY2Ugd2hlcmUKKyAgICAgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlLiAgRGl0dG8KKyAgICAgbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2Ugd2FudCB0byBoYWNrIG11bHRpcGxlCisgICAgIHJlZmVyZW5jZXMuICAqLworCisgIGZvciAoOyBjb3VudCA+IDA7IGZpbGVzKyssIGNvdW50LS0pCisgICAgeworICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCisgICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKKwl7CisJICBQUk9HUkVTUyAoMSk7CisJICBpZiAoaGVhZC0+ZmlsZW5hbWUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFNvbWUgYXJjaGl2ZSBmb3JtYXRzIGRvbid0IGdldCB0aGUgZmlsZW5hbWVzIGZpbGxlZCBpbgorCQkgdW50aWwgdGhlIGVsZW1lbnRzIGFyZSBvcGVuZWQuICAqLworCSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKwkgICAgICBiZmRfc3RhdF9hcmNoX2VsdCAoaGVhZCwgJmJ1Zik7CisJICAgIH0KKwkgIGlmICgoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTCkgJiYKKwkgICAgICAoIXN0cmNtcCAoKmZpbGVzLCBoZWFkLT5maWxlbmFtZSkpKQorCSAgICB7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICAgIGZ1bmN0aW9uIChoZWFkKTsKKwkgICAgfQorCX0KKyAgICAgIGlmICghZm91bmQpCisJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwlmcHJpbnRmIChzdGRlcnIsIF8oIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIpLCAqZmlsZXMpOworICAgIH0KK30KKwwKK2Jvb2xlYW4gb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaGVscCkKKyAgICAgaW50IGhlbHA7Cit7CisgIEZJTEUgKnM7CisKKyAgcyA9IGhlbHAgPyBzdGRvdXQgOiBzdGRlcnI7CisgIAorICBpZiAoISBpc19yYW5saWIpCisgICAgeworICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHMsIF8oIlVzYWdlOiAlcyBbLV17ZG1wcXJzdHh9W2FiY2lsb3NTdXZWXSBbbWVtYmVyLW5hbWVdIGFyY2hpdmUtZmlsZSBmaWxlLi4uXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzLCBfKCIgICAgICAgJXMgLU0gWzxtcmktc2NyaXB0XVxuIiksIHByb2dyYW1fbmFtZSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgY29tbWFuZHM6XG4iKSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iKSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgclthYl1bZl1bdV0gIC0gcmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUocykgaW50byB0aGUgYXJjaGl2ZVxuIikpOworICAgICAgZnByaW50ZiAocywgXygiICB0ICAgICAgICAgICAgLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFyY2hpdmVcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgeFtvXSAgICAgICAgIC0gZXh0cmFjdCBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiBjb21tYW5kIHNwZWNpZmljIG1vZGlmaWVyczpcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgW2FdICAgICAgICAgIC0gcHV0IGZpbGUocykgYWZ0ZXIgW21lbWJlci1uYW1lXVxuIikpOworICAgICAgZnByaW50ZiAocywgXygiICBbYl0gICAgICAgICAgLSBwdXQgZmlsZShzKSBiZWZvcmUgW21lbWJlci1uYW1lXSAoc2FtZSBhcyBbaV0pXG4iKSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgIFtmXSAgICAgICAgICAtIHRydW5jYXRlIGluc2VydGVkIGZpbGUgbmFtZXNcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgW29dICAgICAgICAgIC0gcHJlc2VydmUgb3JpZ2luYWwgZGF0ZXNcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgW3VdICAgICAgICAgIC0gb25seSByZXBsYWNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gY3VycmVudCBhcmNoaXZlIGNvbnRlbnRzXG4iKSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iKSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iKSk7CisgICAgICBmcHJpbnRmIChzLCBfKCIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIikpOworICAgICAgZnByaW50ZiAocywgXygiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIpKTsKKyAgICAgIGZwcmludGYgKHMsIF8oIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIikpOworICAgICAgZnByaW50ZiAocywgXygiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIikpOworICAgIH0KKyAgZWxzZQorICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgZnByaW50ZiAocywgXygiVXNhZ2U6ICVzIFstdlZdIGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOworCisgIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RkZXJyKTsKKworICBpZiAoaGVscCkKKyAgICBmcHJpbnRmIChzLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKKworICB4ZXhpdCAoaGVscCA/IDAgOiAxKTsKK30KKworLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gYSBmaWxlCisgICBuYW1lIHdoaWNoIHdlIHdpbGwgdXNlIGluIGFuIGFyY2hpdmUuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitub3JtYWxpemUgKGZpbGUsIGFiZmQpCisgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisKKyAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOworICBpZiAoZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKKyAgICBmaWxlbmFtZSsrOworICBlbHNlCisgICAgZmlsZW5hbWUgPSBmaWxlOworCisgIGlmIChhcl90cnVuY2F0ZQorICAgICAgJiYgYWJmZCAhPSBOVUxMCisgICAgICAmJiBzdHJsZW4gKGZpbGVuYW1lKSA+IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuKQorICAgIHsKKyAgICAgIGNoYXIgKnM7CisKKyAgICAgIC8qIFNwYWNlIGxlYWsuICAqLworICAgICAgcyA9IChjaGFyICopIHhtYWxsb2MgKGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuICsgMSk7CisgICAgICBtZW1jcHkgKHMsIGZpbGVuYW1lLCBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbik7CisgICAgICBzW2FiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuXSA9ICdcMCc7CisgICAgICBmaWxlbmFtZSA9IHM7CisgICAgfQorCisgIHJldHVybiBmaWxlbmFtZTsKK30KKworLyogUmVtb3ZlIGFueSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgb25seSBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLworCitzdGF0aWMgY2hhciAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKK3N0YXRpYyBGSUxFICpvdXRwdXRfZmlsZSA9IE5VTEw7CitzdGF0aWMgYmZkICpvdXRwdXRfYmZkID0gTlVMTDsKKworc3RhdGljIHZvaWQKK3JlbW92ZV9vdXRwdXQgKCkKK3sKKyAgaWYgKG91dHB1dF9maWxlbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0gIT0gTlVMTCkKKwlmY2xvc2UgKChGSUxFICopIChvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOworICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCisJZmNsb3NlIChvdXRwdXRfZmlsZSk7CisgICAgICB1bmxpbmsgKG91dHB1dF9maWxlbmFtZSk7CisgICAgfQorfQorCisvKiBUaGUgb3B0aW9uIHBhcnNpbmcgc2hvdWxkIGJlIGluIGl0cyBvd24gZnVuY3Rpb24uCisgICBJdCB3aWxsIGJlIHdoZW4gSSBoYXZlIGdldG9wdCB3b3JraW5nLiAgKi8KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGNoYXIgKmFyZ19wdHI7CisgIGNoYXIgYzsKKyAgZW51bQorICAgIHsKKyAgICAgIG5vbmUgPSAwLCBkZWxldGUsIHJlcGxhY2UsIHByaW50X3RhYmxlLAorICAgICAgcHJpbnRfZmlsZXMsIGV4dHJhY3QsIG1vdmUsIHF1aWNrX2FwcGVuZAorICAgIH0gb3BlcmF0aW9uID0gbm9uZTsKKyAgaW50IGFyZ19pbmRleDsKKyAgY2hhciAqKmZpbGVzOworICBjaGFyICppbmFyY2hfZmlsZW5hbWU7CisgIGludCBzaG93X3ZlcnNpb247CisKKyNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKKyAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOworI2VuZGlmCisgIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOworICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKKworICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7CisKKyAgaWYgKGlzX3JhbmxpYiA8IDApCisgICAgeworICAgICAgY2hhciAqdGVtcDsKKworICAgICAgdGVtcCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisJdGVtcCA9IHByb2dyYW1fbmFtZTsKKyAgICAgIGVsc2UKKwkrK3RlbXA7CisgICAgICBpZiAoc3RybGVuICh0ZW1wKSA+PSA2CisJICAmJiBzdHJjbXAgKHRlbXAgKyBzdHJsZW4gKHRlbXApIC0gNiwgInJhbmxpYiIpID09IDApCisJaXNfcmFubGliID0gMTsKKyAgICAgIGVsc2UKKwlpc19yYW5saWIgPSAwOworICAgIH0KKworICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCisJdXNhZ2UgKDEpOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAiLS12ZXJzaW9uIikgPT0gMCkKKwl7CisJICBpZiAoaXNfcmFubGliKQorCSAgICBwcmludF92ZXJzaW9uICgicmFubGliIik7CisJICBlbHNlCisJICAgIHByaW50X3ZlcnNpb24gKCJhciIpOworCX0KKyAgICB9CisKKyAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7CisKKyAgYmZkX2luaXQgKCk7CisgIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7CisKKyAgc2hvd192ZXJzaW9uID0gMDsKKworICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKKworICBpZiAoaXNfcmFubGliKQorICAgIHsKKyAgICAgIGJvb2xlYW4gdG91Y2ggPSBmYWxzZTsKKworICAgICAgaWYgKGFyZ2MgPCAyIHx8IHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCisJdXNhZ2UgKDApOworICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi1WIikgPT0gMAorCSAgfHwgc3RyY21wIChhcmd2WzFdLCAiLXYiKSA9PSAwCisJICB8fCBzdHJuY21wIChhcmd2WzFdLCAiLS12IiwgMykgPT0gMCkKKwlwcmludF92ZXJzaW9uICgicmFubGliIik7CisgICAgICBhcmdfaW5kZXggPSAxOworICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkKKwl7CisJICArK2FyZ19pbmRleDsKKwkgIHRvdWNoID0gdHJ1ZTsKKwl9CisgICAgICB3aGlsZSAoYXJnX2luZGV4IDwgYXJnYykKKwl7CisJICBpZiAoISB0b3VjaCkKKwkgICAgcmFubGliX29ubHkgKGFyZ3ZbYXJnX2luZGV4XSk7CisJICBlbHNlCisJICAgIHJhbmxpYl90b3VjaCAoYXJndlthcmdfaW5kZXhdKTsKKwkgICsrYXJnX2luZGV4OworCX0KKyAgICAgIHhleGl0ICgwKTsKKyAgICB9CisKKyAgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItTSIpID09IDApCisgICAgeworICAgICAgbXJpX2VtdWwgKCk7CisgICAgICB4ZXhpdCAoMCk7CisgICAgfQorCisgIGlmIChhcmdjIDwgMikKKyAgICB1c2FnZSAoMCk7CisKKyAgYXJnX3B0ciA9IGFyZ3ZbMV07CisKKyAgaWYgKCphcmdfcHRyID09ICctJykKKyAgICArK2FyZ19wdHI7CQkJLyogY29tcGF0aWJpbGl0eSAqLworCisgIHdoaWxlICgoYyA9ICphcmdfcHRyKyspICE9ICdcMCcpCisgICAgeworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlICdkJzoKKwljYXNlICdtJzoKKwljYXNlICdwJzoKKwljYXNlICdxJzoKKwljYXNlICdyJzoKKwljYXNlICd0JzoKKwljYXNlICd4JzoKKwkgIGlmIChvcGVyYXRpb24gIT0gbm9uZSkKKwkgICAgZmF0YWwgKF8oInR3byBkaWZmZXJlbnQgb3BlcmF0aW9uIG9wdGlvbnMgc3BlY2lmaWVkIikpOworCSAgc3dpdGNoIChjKQorCSAgICB7CisJICAgIGNhc2UgJ2QnOgorCSAgICAgIG9wZXJhdGlvbiA9IGRlbGV0ZTsKKwkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdtJzoKKwkgICAgICBvcGVyYXRpb24gPSBtb3ZlOworCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3AnOgorCSAgICAgIG9wZXJhdGlvbiA9IHByaW50X2ZpbGVzOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdxJzoKKwkgICAgICBvcGVyYXRpb24gPSBxdWlja19hcHBlbmQ7CisJICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAncic6CisJICAgICAgb3BlcmF0aW9uID0gcmVwbGFjZTsKKwkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICd0JzoKKwkgICAgICBvcGVyYXRpb24gPSBwcmludF90YWJsZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAneCc6CisJICAgICAgb3BlcmF0aW9uID0gZXh0cmFjdDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCWNhc2UgJ2wnOgorCSAgYnJlYWs7CisJY2FzZSAnYyc6CisJICBzaWxlbnRfY3JlYXRlID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ28nOgorCSAgcHJlc2VydmVfZGF0ZXMgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnVic6CisJICBzaG93X3ZlcnNpb24gPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAncyc6CisJICB3cml0ZV9hcm1hcCA9IDE7CisJICBicmVhazsKKwljYXNlICdTJzoKKwkgIHdyaXRlX2FybWFwID0gLTE7CisJICBicmVhazsKKwljYXNlICd1JzoKKwkgIG5ld2VyX29ubHkgPSAxOworCSAgYnJlYWs7CisJY2FzZSAndic6CisJICB2ZXJib3NlID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2EnOgorCSAgcG9zdHlwZSA9IHBvc19hZnRlcjsKKwkgIGJyZWFrOworCWNhc2UgJ2InOgorCSAgcG9zdHlwZSA9IHBvc19iZWZvcmU7CisJICBicmVhazsKKwljYXNlICdpJzoKKwkgIHBvc3R5cGUgPSBwb3NfYmVmb3JlOworCSAgYnJlYWs7CisJY2FzZSAnTSc6CisJICBtcmlfbW9kZSA9IDE7CisJICBicmVhazsKKwljYXNlICdmJzoKKwkgIGFyX3RydW5jYXRlID0gdHJ1ZTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIpLCBwcm9ncmFtX25hbWUsIGMpOworCSAgdXNhZ2UgKDApOworCX0KKyAgICB9CisKKyAgaWYgKHNob3dfdmVyc2lvbikKKyAgICBwcmludF92ZXJzaW9uICgiYXIiKTsKKworICBpZiAoYXJnYyA8IDMpCisgICAgdXNhZ2UgKDApOworCisgIGlmIChtcmlfbW9kZSkKKyAgICB7CisgICAgICBtcmlfZW11bCAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiZmQgKmFyY2g7CisKKyAgICAgIC8qIFdlIGNhbid0IHdyaXRlIGFuIGFybWFwIHdoZW4gdXNpbmcgYXIgcSwgc28ganVzdCBkbyBhciByCisgICAgICAgICBpbnN0ZWFkLiAgKi8KKyAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kICYmIHdyaXRlX2FybWFwKQorCW9wZXJhdGlvbiA9IHJlcGxhY2U7CisKKyAgICAgIGlmICgob3BlcmF0aW9uID09IG5vbmUgfHwgb3BlcmF0aW9uID09IHByaW50X3RhYmxlKQorCSAgJiYgd3JpdGVfYXJtYXAgPT0gMSkKKwl7CisJICByYW5saWJfb25seSAoYXJndlsyXSk7CisJICB4ZXhpdCAoMCk7CisJfQorCisgICAgICBpZiAob3BlcmF0aW9uID09IG5vbmUpCisJZmF0YWwgKF8oIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiKSk7CisKKyAgICAgIGlmIChuZXdlcl9vbmx5ICYmIG9wZXJhdGlvbiAhPSByZXBsYWNlKQorCWZhdGFsIChfKCJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIikpOworCisgICAgICBhcmdfaW5kZXggPSAyOworCisgICAgICBpZiAocG9zdHlwZSAhPSBwb3NfZGVmYXVsdCkKKwlwb3NuYW1lID0gYXJndlthcmdfaW5kZXgrK107CisKKyAgICAgIGluYXJjaF9maWxlbmFtZSA9IGFyZ3ZbYXJnX2luZGV4KytdOworCisgICAgICBmaWxlcyA9IGFyZ19pbmRleCA8IGFyZ2MgPyBhcmd2ICsgYXJnX2luZGV4IDogTlVMTDsKKworI2lmIDAKKyAgICAgIC8qIFdlIGRvbid0IHVzZSBkb19xdWlja19hcHBlbmQgYW55IG1vcmUuICBUb28gbWFueSBzeXN0ZW1zCisgICAgICAgICBleHBlY3QgYXIgdG8gYWx3YXlzIHJlYnVpbGQgdGhlIHN5bWJvbCB0YWJsZSBldmVuIHdoZW4gcSBpcworICAgICAgICAgdXNlZC4gICovCisKKyAgICAgIC8qIFdlIGNhbid0IGRvIGEgcXVpY2sgYXBwZW5kIGlmIHdlIG5lZWQgdG8gY29uc3RydWN0IGFuCisJIGV4dGVuZGVkIG5hbWUgdGFibGUsIGJlY2F1c2UgZG9fcXVpY2tfYXBwZW5kIHdvbid0IGJlIGFibGUgdG8KKwkgcmVidWlsZCB0aGUgbmFtZSB0YWJsZS4gIFVuZm9ydHVuYXRlbHksIGF0IHRoaXMgcG9pbnQgd2UKKwkgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aCBwZXJtaXR0ZWQgYnkgdGhpcworCSBvYmplY3QgZmlsZSBmb3JtYXQuICBTbywgd2UgZ3Vlc3MuICBGSVhNRS4gICovCisgICAgICBpZiAob3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCAmJiAhIGFyX3RydW5jYXRlKQorCXsKKwkgIGNoYXIgKipjaGs7CisKKwkgIGZvciAoY2hrID0gZmlsZXM7IGNoayAhPSBOVUxMICYmICpjaGsgIT0gJ1wwJzsgY2hrKyspCisJICAgIHsKKwkgICAgICBpZiAoc3RybGVuIChub3JtYWxpemUgKCpjaGssIChiZmQgKikgTlVMTCkpID4gMTQpCisJCXsKKwkJICBvcGVyYXRpb24gPSByZXBsYWNlOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kKQorCXsKKwkgIC8qIE5vdGUgdGhhdCBxdWljayBhcHBlbmRpbmcgdG8gYSBub24tZXhpc3RlbnQgYXJjaGl2ZSBjcmVhdGVzIGl0LAorCSAgICAgZXZlbiBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgdG8gYXBwZW5kLiAqLworCSAgZG9fcXVpY2tfYXBwZW5kIChpbmFyY2hfZmlsZW5hbWUsIGZpbGVzKTsKKwkgIHhleGl0ICgwKTsKKwl9CisjZW5kaWYKKworICAgICAgYXJjaCA9IG9wZW5faW5hcmNoIChpbmFyY2hfZmlsZW5hbWUsCisJCQkgIGZpbGVzID09IE5VTEwgPyAoY2hhciAqKSBOVUxMIDogZmlsZXNbMF0pOworCisgICAgICBzd2l0Y2ggKG9wZXJhdGlvbikKKwl7CisJY2FzZSBwcmludF90YWJsZToKKwkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIHByaW50X2Rlc2NyLCBmaWxlcywgYXJnYyAtIDMpOworCSAgYnJlYWs7CisKKwljYXNlIHByaW50X2ZpbGVzOgorCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgcHJpbnRfY29udGVudHMsIGZpbGVzLCBhcmdjIC0gMyk7CisJICBicmVhazsKKworCWNhc2UgZXh0cmFjdDoKKwkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIGV4dHJhY3RfZmlsZSwgZmlsZXMsIGFyZ2MgLSAzKTsKKwkgIGJyZWFrOworCisJY2FzZSBkZWxldGU6CisJICBpZiAoZmlsZXMgIT0gTlVMTCkKKwkgICAgZGVsZXRlX21lbWJlcnMgKGFyY2gsIGZpbGVzKTsKKwkgIGJyZWFrOworCisJY2FzZSBtb3ZlOgorCSAgaWYgKGZpbGVzICE9IE5VTEwpCisJICAgIG1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXMpOworCSAgYnJlYWs7CisKKwljYXNlIHJlcGxhY2U6CisJY2FzZSBxdWlja19hcHBlbmQ6CisJICBpZiAoZmlsZXMgIT0gTlVMTCB8fCB3cml0ZV9hcm1hcCA+IDApCisJICAgIHJlcGxhY2VfbWVtYmVycyAoYXJjaCwgZmlsZXMsIG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQpOworCSAgYnJlYWs7CisKKwkgIC8qIFNob3VsZG4ndCBoYXBwZW4hICovCisJZGVmYXVsdDoKKwkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpLAorCQkgICBwcm9ncmFtX25hbWUpOworCSAgeGV4aXQgKDEpOworCX0KKyAgICB9CisKKyAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOworCisgIHhleGl0ICgwKTsKKyAgcmV0dXJuIDA7Cit9CisKK2JmZCAqCitvcGVuX2luYXJjaCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZSkKKyAgICAgY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZTsKKyAgICAgY29uc3QgY2hhciAqZmlsZTsKK3sKKyAgY29uc3QgY2hhciAqdGFyZ2V0OworICBiZmQgKipsYXN0X29uZTsKKyAgYmZkICpuZXh0X29uZTsKKyAgc3RydWN0IHN0YXQgc2J1ZjsKKyAgYmZkICphcmNoOworICBjaGFyICoqbWF0Y2hpbmc7CisKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKKworICB0YXJnZXQgPSBOVUxMOworCisgIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKKyAgICB7CisjaWZuZGVmIF9fR08zMl9fCisKKy8qIEtMVURHRSBBTEVSVCEgVGVtcG9yYXJ5IGZpeCB1bnRpbCBJIGZpZ2dlciB3aHkKKyAqIHN0YXQoKSBpcyB3cm9uZyAuLi4gdGhpbmsgaXQncyBidXJpZWQgaW4gR08zMidzIElEVAorICogLSBKYXgKKyAqLworICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKKwliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOworI2VuZGlmCisKKyAgICAgIGlmICghb3BlcmF0aW9uX2FsdGVyc19hcmNoKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOworCSAgcGVycm9yIChhcmNoaXZlX2ZpbGVuYW1lKTsKKwkgIG1heWJlcXVpdCAoKTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgLyogVHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHRhcmdldCB0byB1c2UgZm9yIHRoZSBhcmNoaXZlIGZyb20gdGhlCisgICAgICAgICBmaXJzdCBvYmplY3Qgb24gdGhlIGxpc3QuICAqLworICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKKwl7CisJICBiZmQgKm9iajsKKworCSAgb2JqID0gYmZkX29wZW5yIChmaWxlLCBOVUxMKTsKKwkgIGlmIChvYmogIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChvYmosIGJmZF9vYmplY3QpKQorCQl0YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAob2JqKTsKKwkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChvYmopOworCSAgICB9CisJfQorCisgICAgICAvKiBDcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4gICovCisgICAgICBhcmNoID0gYmZkX29wZW53IChhcmNoaXZlX2ZpbGVuYW1lLCB0YXJnZXQpOworICAgICAgaWYgKGFyY2ggPT0gTlVMTAorCSAgfHwgISBiZmRfc2V0X2Zvcm1hdCAoYXJjaCwgYmZkX2FyY2hpdmUpCisJICB8fCAhIGJmZF9jbG9zZSAoYXJjaCkpCisJYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKKyAgICB9CisKKyAgYXJjaCA9IGJmZF9vcGVuciAoYXJjaGl2ZV9maWxlbmFtZSwgdGFyZ2V0KTsKKyAgaWYgKGFyY2ggPT0gTlVMTCkKKyAgICB7CisgICAgYmxvc2VyOgorICAgICAgYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKKyAgICB9CisKKyAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKKyAgICB7CisgICAgICBiZmRfbm9uZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKKwl7CisJICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKKwkgIGZyZWUgKG1hdGNoaW5nKTsKKwl9CisgICAgICB4ZXhpdCAoMSk7CisgICAgfQorCisgIGxhc3Rfb25lID0gJihhcmNoLT5uZXh0KTsKKyAgLyogUmVhZCBhbGwgdGhlIGNvbnRlbnRzIHJpZ2h0IGF3YXksIHJlZ2FyZGxlc3MuICAqLworICBmb3IgKG5leHRfb25lID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgTlVMTCk7CisgICAgICAgbmV4dF9vbmU7CisgICAgICAgbmV4dF9vbmUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBuZXh0X29uZSkpCisgICAgeworICAgICAgUFJPR1JFU1MgKDEpOworICAgICAgKmxhc3Rfb25lID0gbmV4dF9vbmU7CisgICAgICBsYXN0X29uZSA9ICZuZXh0X29uZS0+bmV4dDsKKyAgICB9CisgICpsYXN0X29uZSA9IChiZmQgKikgTlVMTDsKKyAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCisgICAgZ290byBibG9zZXI7CisgIHJldHVybiBhcmNoOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfY29udGVudHMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaW50IG5jb3BpZWQgPSAwOworICBjaGFyICpjYnVmID0geG1hbGxvYyAoQlVGU0laRSk7CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgbG9uZyBzaXplOworICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpICE9IDApCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBwcmludGYgKF8oIlxuPG1lbWJlciAlcz5cblxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOworCisgIHNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgd2hpbGUgKG5jb3BpZWQgPCBzaXplKQorICAgIHsKKworICAgICAgaW50IG5yZWFkOworICAgICAgaW50IHRvY29weSA9IHNpemUgLSBuY29waWVkOworICAgICAgaWYgKHRvY29weSA+IEJVRlNJWkUpCisJdG9jb3B5ID0gQlVGU0laRTsKKworICAgICAgbnJlYWQgPSBiZmRfcmVhZCAoY2J1ZiwgMSwgdG9jb3B5LCBhYmZkKTsJLyogb29wcyAtLSBicm9rZQorCQkJCQkJCSAgIGFic3RyYWN0aW9uISAgKi8KKyAgICAgIGlmIChucmVhZCAhPSB0b2NvcHkpCisJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwlmYXRhbCAoXygiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIpLAorCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKKyAgICAgIGZ3cml0ZSAoY2J1ZiwgMSwgbnJlYWQsIHN0ZG91dCk7CisgICAgICBuY29waWVkICs9IHRvY29weTsKKyAgICB9CisgIGZyZWUgKGNidWYpOworfQorCisvKiBFeHRyYWN0IGEgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGludG8gaXRzIG93biBmaWxlLgorCisgICBXZSBkZWZlciBvcGVuaW5nIHRoZSBuZXcgZmlsZSB1bnRpbCBhZnRlciB3ZSBoYXZlIHJlYWQgYSBCVUZTSVogY2h1bmsgb2YgdGhlCisgICBvbGQgb25lLCBzaW5jZSB3ZSBrbm93IHdlIGhhdmUganVzdCByZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIG9sZAorICAgb25lLiAgU2luY2UgbW9zdCBtZW1iZXJzIGFyZSBzaG9ydGVyIHRoYW4gQlVGU0laLCB0aGlzIG1lYW5zIHdlIHdpbGwgcmVhZAorICAgdGhlIG9sZCBoZWFkZXIsIHJlYWQgdGhlIG9sZCBkYXRhLCB3cml0ZSBhIG5ldyBpbm9kZSBmb3IgdGhlIG5ldyBmaWxlLCBhbmQKKyAgIHdyaXRlIHRoZSBuZXcgZGF0YSwgYW5kIGJlIGRvbmUuIFRoaXMgJ29wdGltaXphdGlvbicgaXMgd2hhdCBjb21lcyBmcm9tCisgICBzaXR0aW5nIG5leHQgdG8gYSBiYXJlIGRpc2sgYW5kIGhlYXJpbmcgaXQgZXZlcnkgdGltZSBpdCBzZWVrcy4gIC0tIEdudQorICAgR2lsbW9yZSAgKi8KKwordm9pZAorZXh0cmFjdF9maWxlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIEZJTEUgKm9zdHJlYW07CisgIGNoYXIgKmNidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKKyAgaW50IG5yZWFkLCB0b2NvcHk7CisgIGxvbmcgbmNvcGllZCA9IDA7CisgIGxvbmcgc2l6ZTsKKyAgc3RydWN0IHN0YXQgYnVmOworICAKKyAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSAhPSAwKQorICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICBzaXplID0gYnVmLnN0X3NpemU7CisKKyAgaWYgKHNpemUgPCAwKQorICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgZmF0YWwgKF8oInN0YXQgcmV0dXJucyBuZWdhdGl2ZSBzaXplIGZvciAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgIAorICBpZiAodmVyYm9zZSkKKyAgICBwcmludGYgKCJ4IC0gJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOworCisgIG9zdHJlYW0gPSBOVUxMOworICBpZiAoc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIC8qIFNlZW1zIGxpa2UgYW4gYWJzdHJhY3Rpb24gdmlvbGF0aW9uLCBlaD8gIFdlbGwgaXQncyBPSyEgKi8KKyAgICAgIG91dHB1dF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOworCisgICAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7CisgICAgICBpZiAob3N0cmVhbSA9PSBOVUxMKQorCXsKKwkgIHBlcnJvciAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCSAgeGV4aXQgKDEpOworCX0KKworICAgICAgb3V0cHV0X2ZpbGUgPSBvc3RyZWFtOworICAgIH0KKyAgZWxzZQorICAgIHdoaWxlIChuY29waWVkIDwgc2l6ZSkKKyAgICAgIHsKKwl0b2NvcHkgPSBzaXplIC0gbmNvcGllZDsKKwlpZiAodG9jb3B5ID4gQlVGU0laRSkKKwkgIHRvY29weSA9IEJVRlNJWkU7CisKKwlucmVhZCA9IGJmZF9yZWFkIChjYnVmLCAxLCB0b2NvcHksIGFiZmQpOworCWlmIChucmVhZCAhPSB0b2NvcHkpCisJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgZmF0YWwgKF8oIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiKSwKKwkJIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOworCisJLyogU2VlIGNvbW1lbnQgYWJvdmU7IHRoaXMgc2F2ZXMgZGlzayBhcm0gbW90aW9uICovCisJaWYgKG9zdHJlYW0gPT0gTlVMTCkKKwkgIHsKKwkgICAgLyogU2VlbXMgbGlrZSBhbiBhYnN0cmFjdGlvbiB2aW9sYXRpb24sIGVoPyAgV2VsbCBpdCdzIE9LISAqLworCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKKworCSAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7CisJICAgIGlmIChvc3RyZWFtID09IE5VTEwpCisJICAgICAgeworCQlwZXJyb3IgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKwkJeGV4aXQgKDEpOworCSAgICAgIH0KKworCSAgICBvdXRwdXRfZmlsZSA9IG9zdHJlYW07CisJICB9CisJZndyaXRlIChjYnVmLCAxLCBucmVhZCwgb3N0cmVhbSk7CisJbmNvcGllZCArPSB0b2NvcHk7CisgICAgICB9CisKKyAgaWYgKG9zdHJlYW0gIT0gTlVMTCkKKyAgICBmY2xvc2UgKG9zdHJlYW0pOworCisgIG91dHB1dF9maWxlID0gTlVMTDsKKyAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKKworICBjaG1vZCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJ1Zi5zdF9tb2RlKTsKKworICBpZiAocHJlc2VydmVfZGF0ZXMpCisgICAgc2V0X3RpbWVzIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgJmJ1Zik7CisKKyAgZnJlZSAoY2J1Zik7Cit9CisKKyNpZiAwCisKKy8qIFdlIGRvbid0IHVzZSB0aGlzIGFueW1vcmUuICBUb28gbWFueSBzeXN0ZW1zIGV4cGVjdCBhciB0byByZWJ1aWxkCisgICB0aGUgc3ltYm9sIHRhYmxlIGV2ZW4gd2hlbiBxIGlzIHVzZWQuICAqLworCisvKiBKdXN0IGRvIGl0IHF1aWNrbHk7IGRvbid0IHdvcnJ5IGFib3V0IGR1cHMsIGFybWFwLCBvciBhbnl0aGluZyBsaWtlIHRoYXQgKi8KKworc3RhdGljIHZvaWQKK2RvX3F1aWNrX2FwcGVuZCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZXNfdG9fYXBwZW5kKQorICAgICBjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lOworICAgICBjaGFyICoqZmlsZXNfdG9fYXBwZW5kOworeworICBGSUxFICpvZmlsZSwgKmlmaWxlOworICBjaGFyICpidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKKyAgbG9uZyB0b2NvcHksIHRoaXN0aW1lOworICBiZmQgKnRlbXA7CisgIHN0cnVjdCBzdGF0IHNidWY7CisgIGJvb2xlYW4gbmV3ZmlsZSA9IGZhbHNlOworICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOworCisgIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKKyAgICB7CisKKyNpZm5kZWYgX19HTzMyX18KKworLyogS0xVREdFIEFMRVJUISBUZW1wb3JhcnkgZml4IHVudGlsIEkgZmlnZ2VyIHdoeQorICogc3RhdCgpIGlzIHdyb25nIC4uLiB0aGluayBpdCdzIGJ1cmllZCBpbiBHTzMyJ3MgSURUCisgKiAtIEpheAorICovCisKKyAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCisJYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKKyNlbmRpZgorCisgICAgICBuZXdmaWxlID0gdHJ1ZTsKKyAgICB9CisKKyAgb2ZpbGUgPSBmb3BlbiAoYXJjaGl2ZV9maWxlbmFtZSwgRk9QRU5fQVVCKTsKKyAgaWYgKG9maWxlID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yIChwcm9ncmFtX25hbWUpOworICAgICAgeGV4aXQgKDEpOworICAgIH0KKworICB0ZW1wID0gYmZkX29wZW5yIChhcmNoaXZlX2ZpbGVuYW1lLCBOVUxMKTsKKyAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOworICAgIH0KKyAgaWYgKG5ld2ZpbGUgPT0gZmFsc2UpCisgICAgeworICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRlbXAsIGJmZF9hcmNoaXZlKSAhPSB0cnVlKQorCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJZmF0YWwgKF8oIiVzIGlzIG5vdCBhbiBhcmNoaXZlIiksIGFyY2hpdmVfZmlsZW5hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZ3cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgb2ZpbGUpOworICAgICAgaWYgKCFzaWxlbnRfY3JlYXRlKQorCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY3JlYXRpbmcgJXNcbiIpLAorCQkgcHJvZ3JhbV9uYW1lLCBhcmNoaXZlX2ZpbGVuYW1lKTsKKyAgICB9CisKKyAgaWYgKGFyX3RydW5jYXRlKQorICAgIHRlbXAtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7CisKKyAgLyogYXNzdW1lIGl0J3MgYW4gYWNoaXZlLCBnbyBzdHJhaWdodCB0byB0aGUgZW5kLCBzYW5zICQyMDAgKi8KKyAgZnNlZWsgKG9maWxlLCAwLCAyKTsKKworICBmb3IgKDsgZmlsZXNfdG9fYXBwZW5kICYmICpmaWxlc190b19hcHBlbmQ7ICsrZmlsZXNfdG9fYXBwZW5kKQorICAgIHsKKyAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlICh0ZW1wLCAqZmlsZXNfdG9fYXBwZW5kKTsKKyAgICAgIGlmIChoZHIgPT0gTlVMTCkKKwl7CisJICBiZmRfZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOworCX0KKworICAgICAgQkZEX1NFTkQgKHRlbXAsIF9iZmRfdHJ1bmNhdGVfYXJuYW1lLCAodGVtcCwgKmZpbGVzX3RvX2FwcGVuZCwgKGNoYXIgKikgaGRyKSk7CisKKyAgICAgIGlmaWxlID0gZm9wZW4gKCpmaWxlc190b19hcHBlbmQsIEZPUEVOX1JCKTsKKyAgICAgIGlmIChpZmlsZSA9PSBOVUxMKQorCXsKKwkgIGJmZF9ub25mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7CisJfQorCisgICAgICBpZiAoc3RhdCAoKmZpbGVzX3RvX2FwcGVuZCwgJnNidWYpICE9IDApCisJeworCSAgYmZkX25vbmZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKKwl9CisKKyAgICAgIHRvY29weSA9IHNidWYuc3Rfc2l6ZTsKKworICAgICAgLyogWFhYIHNob3VsZCBkbyBlcnJvci1jaGVja2luZyEgKi8KKyAgICAgIGZ3cml0ZSAoaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBvZmlsZSk7CisKKyAgICAgIHdoaWxlICh0b2NvcHkgPiAwKQorCXsKKwkgIHRoaXN0aW1lID0gdG9jb3B5OworCSAgaWYgKHRoaXN0aW1lID4gQlVGU0laRSkKKwkgICAgdGhpc3RpbWUgPSBCVUZTSVpFOworCSAgZnJlYWQgKGJ1ZiwgMSwgdGhpc3RpbWUsIGlmaWxlKTsKKwkgIGZ3cml0ZSAoYnVmLCAxLCB0aGlzdGltZSwgb2ZpbGUpOworCSAgdG9jb3B5IC09IHRoaXN0aW1lOworCX0KKyAgICAgIGZjbG9zZSAoaWZpbGUpOworICAgICAgaWYgKChzYnVmLnN0X3NpemUgJSAyKSA9PSAxKQorCXB1dGMgKCdcMDEyJywgb2ZpbGUpOworICAgIH0KKyAgZmNsb3NlIChvZmlsZSk7CisgIGJmZF9jbG9zZSAodGVtcCk7CisgIGZyZWUgKGJ1Zik7Cit9CisKKyNlbmRpZiAvKiAwICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9hcmNoaXZlIChpYXJjaCkKKyAgICAgYmZkICppYXJjaDsKK3sKKyAgYmZkICpvYmZkOworICBjaGFyICpvbGRfbmFtZSwgKm5ld19uYW1lOworICBiZmQgKmNvbnRlbnRzX2hlYWQgPSBpYXJjaC0+bmV4dDsKKworICBvbGRfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoaWFyY2gpKSArIDEpOworICBzdHJjcHkgKG9sZF9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYXJjaCkpOworICBuZXdfbmFtZSA9IG1ha2VfdGVtcG5hbWUgKG9sZF9uYW1lKTsKKworICBvdXRwdXRfZmlsZW5hbWUgPSBuZXdfbmFtZTsKKworICBvYmZkID0gYmZkX29wZW53IChuZXdfbmFtZSwgYmZkX2dldF90YXJnZXQgKGlhcmNoKSk7CisKKyAgaWYgKG9iZmQgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKKworICBvdXRwdXRfYmZkID0gb2JmZDsKKworICBiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2FyY2hpdmUpOworCisgIC8qIFJlcXVlc3Qgd3JpdGluZyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdW5sZXNzIHdlJ3ZlCisgICAgIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgbm90IHRvLiAgKi8KKyAgb2JmZC0+aGFzX2FybWFwID0gd3JpdGVfYXJtYXAgPj0gMDsKKworICBpZiAoYXJfdHJ1bmNhdGUpCisgICAgeworICAgICAgLyogVGhpcyBzaG91bGQgcmVhbGx5IHVzZSBiZmRfc2V0X2ZpbGVfZmxhZ3MsIGJ1dCB0aGF0IHJlamVjdHMKKyAgICAgICAgIGFyY2hpdmVzLiAgKi8KKyAgICAgIG9iZmQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7CisgICAgfQorCisgIGlmIChiZmRfc2V0X2FyY2hpdmVfaGVhZCAob2JmZCwgY29udGVudHNfaGVhZCkgIT0gdHJ1ZSkKKyAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKKworICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCisgICAgYmZkX2ZhdGFsIChvbGRfbmFtZSk7CisKKyAgb3V0cHV0X2JmZCA9IE5VTEw7CisgIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7CisKKyAgLyogV2UgZG9uJ3QgY2FyZSBpZiB0aGlzIGZhaWxzOyB3ZSBtaWdodCBiZSBjcmVhdGluZyB0aGUgYXJjaGl2ZS4gICovCisgIGJmZF9jbG9zZSAoaWFyY2gpOworCisgIGlmIChzbWFydF9yZW5hbWUgKG5ld19uYW1lLCBvbGRfbmFtZSwgMCkgIT0gMCkKKyAgICB4ZXhpdCAoMSk7Cit9CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHdoaWNoIHNob3VsZCBiZSBycGxhY2QnZAorICAgaW50byB3aGVuIGFsdGVyaW5nLiAgREVGQVVMVF9QT1Mgc2hvdWxkIGJlIGhvdyB0byBpbnRlcnByZXQgcG9zX2RlZmF1bHQsCisgICBhbmQgc2hvdWxkIGJlIGEgcG9zIHZhbHVlLiAgKi8KKworc3RhdGljIGJmZCAqKgorZ2V0X3Bvc19iZmQgKGNvbnRlbnRzLCBkZWZhdWx0X3BvcywgZGVmYXVsdF9wb3NuYW1lKQorICAgICBiZmQgKipjb250ZW50czsKKyAgICAgZW51bSBwb3MgZGVmYXVsdF9wb3M7CisgICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9zbmFtZTsKK3sKKyAgYmZkICoqYWZ0ZXJfYmZkID0gY29udGVudHM7CisgIGVudW0gcG9zIHJlYWxwb3M7CisgIGNvbnN0IGNoYXIgKnJlYWxwb3NuYW1lOworCisgIGlmIChwb3N0eXBlID09IHBvc19kZWZhdWx0KQorICAgIHsKKyAgICAgIHJlYWxwb3MgPSBkZWZhdWx0X3BvczsKKyAgICAgIHJlYWxwb3NuYW1lID0gZGVmYXVsdF9wb3NuYW1lOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlYWxwb3MgPSBwb3N0eXBlOworICAgICAgcmVhbHBvc25hbWUgPSBwb3NuYW1lOworICAgIH0KKworICBpZiAocmVhbHBvcyA9PSBwb3NfZW5kKQorICAgIHsKKyAgICAgIHdoaWxlICgqYWZ0ZXJfYmZkKQorCWFmdGVyX2JmZCA9ICYoKCphZnRlcl9iZmQpLT5uZXh0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKDsgKmFmdGVyX2JmZDsgYWZ0ZXJfYmZkID0gJigqYWZ0ZXJfYmZkKS0+bmV4dCkKKwlpZiAoc3RyY21wICgoKmFmdGVyX2JmZCktPmZpbGVuYW1lLCByZWFscG9zbmFtZSkgPT0gMCkKKwkgIHsKKwkgICAgaWYgKHJlYWxwb3MgPT0gcG9zX2FmdGVyKQorCSAgICAgIGFmdGVyX2JmZCA9ICYoKmFmdGVyX2JmZCktPm5leHQ7CisJICAgIGJyZWFrOworCSAgfQorICAgIH0KKyAgcmV0dXJuIGFmdGVyX2JmZDsKK30KKworc3RhdGljIHZvaWQKK2RlbGV0ZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19kZWxldGUpCisgICAgIGJmZCAqYXJjaDsKKyAgICAgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZTsKK3sKKyAgYmZkICoqY3VycmVudF9wdHJfcHRyOworICBib29sZWFuIGZvdW5kOworICBib29sZWFuIHNvbWV0aGluZ19jaGFuZ2VkID0gZmFsc2U7CisgIGZvciAoOyAqZmlsZXNfdG9fZGVsZXRlICE9IE5VTEw7ICsrZmlsZXNfdG9fZGVsZXRlKQorICAgIHsKKyAgICAgIC8qIEluIGEub3V0IHN5c3RlbXMsIHRoZSBhcm1hcCBpcyBvcHRpb25hbC4gIEl0J3MgYWxzbyBjYWxsZWQKKwkgX18uU1lNREVGLiAgU28gaWYgdGhlIHVzZXIgYXNrZWQgdG8gZGVsZXRlIGl0LCB3ZSBzaG91bGQgcmVtZW1iZXIKKwkgdGhhdCBmYWN0LiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0IGZvciBDT0ZGIHN5c3RlbXMgKHdoZXJlCisJIF9fLlNZTURFRiBtaWdodCBiZSByZWd1bGFyIG1lbWJlciksIGJ1dCBpdCdzIHZlcnkgdW5saWtlbHkKKwkgdG8gYmUgYSBwcm9ibGVtLiAgRklYTUUgKi8KKworICAgICAgaWYgKCFzdHJjbXAgKCpmaWxlc190b19kZWxldGUsICJfXy5TWU1ERUYiKSkKKwl7CisJICBhcmNoLT5oYXNfYXJtYXAgPSBmYWxzZTsKKwkgIHdyaXRlX2FybWFwID0gLTE7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKGFyY2gtPm5leHQpOworICAgICAgd2hpbGUgKCpjdXJyZW50X3B0cl9wdHIpCisJeworCSAgaWYgKHN0cmNtcCAoKmZpbGVzX3RvX2RlbGV0ZSwgKCpjdXJyZW50X3B0cl9wdHIpLT5maWxlbmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7CisJICAgICAgaWYgKHZlcmJvc2UpCisJCXByaW50ZiAoImQgLSAlc1xuIiwKKwkJCSpmaWxlc190b19kZWxldGUpOworCSAgICAgICpjdXJyZW50X3B0cl9wdHIgPSAoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKKwkgICAgICBnb3RvIG5leHRfZmlsZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY3VycmVudF9wdHJfcHRyID0gJigoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOworCSAgICB9CisJfQorCisgICAgICBpZiAodmVyYm9zZSAmJiBmb3VuZCA9PSBmYWxzZSkKKwl7CisJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgcHJpbnRmIChfKCJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIiksICpmaWxlc190b19kZWxldGUpOworCX0KKyAgICBuZXh0X2ZpbGU6CisgICAgICA7CisgICAgfQorCisgIGlmIChzb21ldGhpbmdfY2hhbmdlZCA9PSB0cnVlKQorICAgIHsKKyAgICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOworICAgIH0KK30KKworCisvKiBSZXBvc2l0aW9uIGV4aXN0aW5nIG1lbWJlcnMgd2l0aGluIGFuIGFyY2hpdmUgKi8KKworc3RhdGljIHZvaWQKK21vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXNfdG9fbW92ZSkKKyAgICAgYmZkICphcmNoOworICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKK3sKKyAgYmZkICoqYWZ0ZXJfYmZkOwkJLyogTmV3IGVudHJpZXMgZ28gYWZ0ZXIgdGhpcyBvbmUgKi8KKyAgYmZkICoqY3VycmVudF9wdHJfcHRyOwkvKiBjZHIgcG9pbnRlciBpbnRvIGNvbnRlbnRzICovCisKKyAgZm9yICg7ICpmaWxlc190b19tb3ZlOyArK2ZpbGVzX3RvX21vdmUpCisgICAgeworICAgICAgY3VycmVudF9wdHJfcHRyID0gJihhcmNoLT5uZXh0KTsKKyAgICAgIHdoaWxlICgqY3VycmVudF9wdHJfcHRyKQorCXsKKwkgIGJmZCAqY3VycmVudF9wdHIgPSAqY3VycmVudF9wdHJfcHRyOworCSAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fbW92ZSwgYXJjaCksCisJCSAgICAgIGN1cnJlbnRfcHRyLT5maWxlbmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIE1vdmUgdGhpcyBmaWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgLSBmaXJzdCBjdXQgZnJvbQorCQkgd2hlcmUgaXQgaXMuICAqLworCSAgICAgIGJmZCAqbGluazsKKwkgICAgICAqY3VycmVudF9wdHJfcHRyID0gY3VycmVudF9wdHItPm5leHQ7CisKKwkgICAgICAvKiBOb3cgZ2x1ZSB0byBlbmQgKi8KKwkgICAgICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19lbmQsIE5VTEwpOworCSAgICAgIGxpbmsgPSAqYWZ0ZXJfYmZkOworCSAgICAgICphZnRlcl9iZmQgPSBjdXJyZW50X3B0cjsKKwkgICAgICBjdXJyZW50X3B0ci0+bmV4dCA9IGxpbms7CisKKwkgICAgICBpZiAodmVyYm9zZSkKKwkJcHJpbnRmICgibSAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7CisKKwkgICAgICBnb3RvIG5leHRfZmlsZTsKKwkgICAgfQorCisJICBjdXJyZW50X3B0cl9wdHIgPSAmKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7CisJfQorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUgJXMhXG4iKSwKKwkgICAgICAgcHJvZ3JhbV9uYW1lLCAqZmlsZXNfdG9fbW92ZSwgYXJjaC0+ZmlsZW5hbWUpOworICAgICAgeGV4aXQgKDEpOworICAgIG5leHRfZmlsZTo7CisgICAgfQorCisgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOworfQorCisvKiBPdWdodCB0byBkZWZhdWx0IHRvIHJlcGxhY2luZyBpbiBwbGFjZSwgYnV0IHRoaXMgaXMgZXhpc3RpbmcgcHJhY3RpY2UhICAqLworCitzdGF0aWMgdm9pZAorcmVwbGFjZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19tb3ZlLCBxdWljaykKKyAgICAgYmZkICphcmNoOworICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKKyAgICAgYm9vbGVhbiBxdWljazsKK3sKKyAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgIGJmZCAqKmFmdGVyX2JmZDsJCS8qIE5ldyBlbnRyaWVzIGdvIGFmdGVyIHRoaXMgb25lICovCisgIGJmZCAqY3VycmVudDsKKyAgYmZkICoqY3VycmVudF9wdHI7CisgIGJmZCAqdGVtcDsKKworICB3aGlsZSAoZmlsZXNfdG9fbW92ZSAmJiAqZmlsZXNfdG9fbW92ZSkKKyAgICB7CisgICAgICBpZiAoISBxdWljaykKKwl7CisJICBjdXJyZW50X3B0ciA9ICZhcmNoLT5uZXh0OworCSAgd2hpbGUgKCpjdXJyZW50X3B0cikKKwkgICAgeworCSAgICAgIGN1cnJlbnQgPSAqY3VycmVudF9wdHI7CisKKwkgICAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFyIHByb2dyYW1zLCB3ZQorCQkgcGVybWl0IHRoZSBzYW1lIGZpbGUgdG8gYmUgYWRkZWQgbXVsdGlwbGUgdGltZXMuICAqLworCSAgICAgIGlmIChzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzX3RvX21vdmUsIGFyY2gpLAorCQkJICBub3JtYWxpemUgKGN1cnJlbnQtPmZpbGVuYW1lLCBhcmNoKSkgPT0gMAorCQkgICYmIGN1cnJlbnQtPmFyZWx0X2RhdGEgIT0gTlVMTCkKKwkJeworCQkgIGlmIChuZXdlcl9vbmx5KQorCQkgICAgeworCQkgICAgICBzdHJ1Y3Qgc3RhdCBmc2J1ZiwgYXNidWY7CisKKwkJICAgICAgaWYgKHN0YXQgKCpmaWxlc190b19tb3ZlLCAmZnNidWYpICE9IDApCisJCQl7CisJCQkgIGlmIChlcnJubyAhPSBFTk9FTlQpCisJCQkgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7CisJCQkgIGdvdG8gbmV4dF9maWxlOworCQkJfQorCQkgICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGN1cnJlbnQsICZhc2J1ZikgIT0gMCkKKwkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJCQlmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBjdXJyZW50LT5maWxlbmFtZSk7CisKKwkJICAgICAgaWYgKGZzYnVmLnN0X210aW1lIDw9IGFzYnVmLnN0X210aW1lKQorCQkJZ290byBuZXh0X2ZpbGU7CisJCSAgICB9CisKKwkJICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19hZnRlciwKKwkJCQkJICAgY3VycmVudC0+ZmlsZW5hbWUpOworCQkgIHRlbXAgPSAqYWZ0ZXJfYmZkOworCisJCSAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOworCQkgIGlmICgqYWZ0ZXJfYmZkID09IChiZmQgKikgTlVMTCkKKwkJICAgIHsKKwkJICAgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7CisJCSAgICB9CisJCSAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKKworCQkgIC8qIHNuaXAgb3V0IHRoaXMgZW50cnkgZnJvbSB0aGUgY2hhaW4gKi8KKwkJICAqY3VycmVudF9wdHIgPSAoKmN1cnJlbnRfcHRyKS0+bmV4dDsKKworCQkgIGlmICh2ZXJib3NlKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCJyIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKKwkJICAgIH0KKworCQkgIGNoYW5nZWQgPSB0cnVlOworCisJCSAgZ290byBuZXh0X2ZpbGU7CisJCX0KKwkgICAgICBjdXJyZW50X3B0ciA9ICYoY3VycmVudC0+bmV4dCk7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEFkZCB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiAgKi8KKworICAgICAgYWZ0ZXJfYmZkID0gZ2V0X3Bvc19iZmQgKCZhcmNoLT5uZXh0LCBwb3NfZW5kLCBOVUxMKTsKKyAgICAgIHRlbXAgPSAqYWZ0ZXJfYmZkOworICAgICAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOworICAgICAgaWYgKCphZnRlcl9iZmQgPT0gKGJmZCAqKSBOVUxMKQorCXsKKwkgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX21vdmUpOworCX0KKyAgICAgIGlmICh2ZXJib3NlKQorCXsKKwkgIHByaW50ZiAoImEgLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOworCX0KKworICAgICAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKKworICAgICAgY2hhbmdlZCA9IHRydWU7CisKKyAgICBuZXh0X2ZpbGU6OworCisgICAgICBmaWxlc190b19tb3ZlKys7CisgICAgfQorCisgIGlmIChjaGFuZ2VkKQorICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOworfQorCitzdGF0aWMgdm9pZAorcmFubGliX29ubHkgKGFyY2huYW1lKQorICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKK3sKKyAgYmZkICphcmNoOworCisgIHdyaXRlX2FybWFwID0gMTsKKyAgYXJjaCA9IG9wZW5faW5hcmNoIChhcmNobmFtZSwgKGNoYXIgKikgTlVMTCk7CisgIGlmIChhcmNoID09IE5VTEwpCisgICAgeGV4aXQgKDEpOworICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKK30KKworLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHN5bWJvbCBtYXAgb2YgYW4gYXJjaGl2ZS4gICovCisKK3N0YXRpYyB2b2lkCityYW5saWJfdG91Y2ggKGFyY2huYW1lKQorICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKK3sKKyNpZmRlZiBfX0dPMzJfXworICAvKiBJIGRvbid0IHRoaW5rIHVwZGF0aW5nIHdvcmtzIG9uIGdvMzIuICAqLworICByYW5saWJfb25seSAoYXJjaG5hbWUpOworI2Vsc2UKKyAgaW50IGY7CisgIGJmZCAqYXJjaDsKKyAgY2hhciAqKm1hdGNoaW5nOworCisgIGYgPSBvcGVuIChhcmNobmFtZSwgT19SRFdSLCAwKTsKKyAgaWYgKGYgPCAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKKyAgICB9CisKKyAgYXJjaCA9IGJmZF9mZG9wZW5yIChhcmNobmFtZSwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZik7CisgIGlmIChhcmNoID09IE5VTEwpCisgICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7CisgIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJjaCwgYmZkX2FyY2hpdmUsICZtYXRjaGluZykpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChhcmNobmFtZSk7CisgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQorCXsKKwkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOworCSAgZnJlZSAobWF0Y2hpbmcpOworCX0KKyAgICAgIHhleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKCEgYmZkX2hhc19tYXAgKGFyY2gpKQorICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgZmF0YWwgKF8oIiVzOiBubyBhcmNoaXZlIG1hcCB0byB1cGRhdGUiKSwgYXJjaG5hbWUpOworCisgIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKTsKKworICBpZiAoISBiZmRfY2xvc2UgKGFyY2gpKQorICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOworI2VuZGlmCit9CisKKy8qIFRoaW5ncyB3aGljaCBhcmUgaW50ZXJlc3RpbmcgdG8gbWFwIG92ZXIgYWxsIG9yIHNvbWUgb2YgdGhlIGZpbGVzOiAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfZGVzY3IgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdmVyYm9zZSk7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcmxleC5sIGIvYmludXRpbHMvYXJsZXgubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGUxM2QxCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYXJsZXgubApAQCAtMCwwICsxLDgzIEBACisleworLyogYXJsZXgubCAtIFN0cmFuZ2Ugc2NyaXB0IGxhbmd1YWdlIGxleGVyICovCisKKy8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCisgICAJCSAgc2FjQGN5Z251cy5jb20KKworKi8KKyNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJhcnBhcnNlLmgiCisKK2ludCBsaW5lbnVtYmVyOworJX0KKyUlCisKKyJBRERMSUIiICAgCXsgcmV0dXJuIEFERExJQjsgfQorIkFERE1PRCIgICAJeyByZXR1cm4gQURETU9EOyB9CisiQ0xFQVIiICAgCXsgcmV0dXJuIENMRUFSOyB9CisiQ1JFQVRFIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KKyJERUxFVEUiICAgCXsgcmV0dXJuIERFTEVURTsgfQorIkRJUkVDVE9SWSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9CisiRU5EIiAgIAl7IHJldHVybiBFTkQ7IH0KKyJFWFRSQUNUIiAgIAl7IHJldHVybiBFWFRSQUNUOyB9CisiRlVMTERJUiIgICAJeyByZXR1cm4gRlVMTERJUjsgfQorIkhFTFAiICAgCXsgcmV0dXJuIEhFTFA7IH0KKyJMSVNUIgkJeyByZXR1cm4gTElTVDsgfQorIk9QRU4iICAgCXsgcmV0dXJuIE9QRU47IH0KKyJSRVBMQUNFIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9CisiVkVSQk9TRSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQorIlNBVkUiICAgCXsgcmV0dXJuIFNBVkU7IH0KKyJhZGRsaWIiICAgCXsgcmV0dXJuIEFERExJQjsgfQorImFkZG1vZCIgICAJeyByZXR1cm4gQURETU9EOyB9CisiY2xlYXIiICAgCXsgcmV0dXJuIENMRUFSOyB9CisiY3JlYXRlIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KKyJkZWxldGUiICAgCXsgcmV0dXJuIERFTEVURTsgfQorImRpcmVjdG9yeSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9CisiZW5kIiAgIAl7IHJldHVybiBFTkQ7IH0KKyJleHRyYWN0IiAgIAl7IHJldHVybiBFWFRSQUNUOyB9CisiZnVsbGRpciIgICAJeyByZXR1cm4gRlVMTERJUjsgfQorImhlbHAiICAgCXsgcmV0dXJuIEhFTFA7IH0KKyJsaXN0IgkJeyByZXR1cm4gTElTVDsgfQorIm9wZW4iICAgCXsgcmV0dXJuIE9QRU47IH0KKyJyZXBsYWNlIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9CisidmVyYm9zZSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQorInNhdmUiICAgCXsgcmV0dXJuIFNBVkU7IH0KKyIrXG4iICAgICAgICAgICB7IGxpbmVudW1iZXIgKys7IH0KKyIoIiAgICAgICAgICAgICB7IHJldHVybiAnKCc7IH0KKyIpIiAgICAgICAgICAgICB7IHJldHVybiAnKSc7IH0KKyIsIiAgICAgICAgICAgICB7IHJldHVybiAnLCc7IH0KK1tBLVphLXowLTkvJDouXC1cX10rICB7IAkKKwkJeXlsdmFsLm5hbWUgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKKwkJcmV0dXJuIEZJTEVOQU1FOworCQl9CisiKiIuKiAJCXsgfQorIjsiLiogCQl7IH0KKyIgIgkJeyB9CisiXG4iCSAJIHsgbGluZW51bWJlciArKzsgcmV0dXJuIE5FV0xJTkU7IH0JCisKKyUlCisjaWZuZGVmIHl5d3JhcAorLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KK2ludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FycGFyc2UueSBiL2JpbnV0aWxzL2FycGFyc2UueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmM3NjAwCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYXJwYXJzZS55CkBAIC0wLDAgKzEsMjAyIEBACisleworLyogYXJwYXJzZS55IC0gU3RhbmdlIHNjcmlwdCBsYW5ndWFnZSBwYXJzZXIgKi8KKworLyogICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgIAkJICBzYWNAY3lnbnVzLmNvbQorCisqLworI2RlZmluZSBET05UREVDTEFSRV9NQUxMT0MKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJhcnN1cC5oIgorZXh0ZXJuIGludCB2ZXJib3NlOworZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CislfQorCisldW5pb24geworICBjaGFyICpuYW1lOworc3RydWN0IGxpc3QgKmxpc3QgOworCit9OworCisldG9rZW4gTkVXTElORQorJXRva2VuIFZFUkJPU0UKKyV0b2tlbiA8bmFtZT4gRklMRU5BTUUKKyV0b2tlbiBBRERMSUIKKyV0b2tlbiBMSVNUCisldG9rZW4gQURETU9ECisldG9rZW4gQ0xFQVIKKyV0b2tlbiBDUkVBVEUKKyV0b2tlbiBERUxFVEUKKyV0b2tlbiBESVJFQ1RPUlkKKyV0b2tlbiBFTkQKKyV0b2tlbiBFWFRSQUNUCisldG9rZW4gRlVMTERJUgorJXRva2VuIEhFTFAKKyV0b2tlbiBRVUlUCisldG9rZW4gUkVQTEFDRQorJXRva2VuIFNBVkUKKyV0b2tlbiBPUEVOCisKKyV0eXBlIDxsaXN0PiBtb2R1bGVsaXN0IAorJXR5cGUgPGxpc3Q+IG1vZHVsZW5hbWUKKyV0eXBlIDxuYW1lPiBvcHRpb25hbF9maWxlbmFtZQorJSUKKworc3RhcnQ6CisJeyBwcm9tcHQoKTsgfSBzZXNzaW9uCisJOworCitzZXNzaW9uOgorCSAgICBzZXNzaW9uIGNvbW1hbmRfbGluZQorCXwKKwk7CisKK2NvbW1hbmRfbGluZToKKwkJY29tbWFuZCBORVdMSU5FIHsgcHJvbXB0KCk7IH0KKworY29tbWFuZDoKKwkJb3Blbl9jb21tYW5kCQorCXwJY3JlYXRlX2NvbW1hbmQJCisJfCAJdmVyYm9zZV9jb21tYW5kCisJfAlkaXJlY3RvcnlfY29tbWFuZAorCXwJYWRkbGliX2NvbW1hbmQKKwl8CWNsZWFyX2NvbW1hbmQKKwl8CWFkZG1vZF9jb21tYW5kCisJfCAJc2F2ZV9jb21tYW5kCisgICAgICAgIHwgICAgICAgZXh0cmFjdF9jb21tYW5kCisJfAlyZXBsYWNlX2NvbW1hbmQKKwl8CWRlbGV0ZV9jb21tYW5kCisJfAlsaXN0X2NvbW1hbmQKKwl8IAlFTkQJIHsgYXJfZW5kKCk7IHJldHVybiAwOyB9CisJfCAJZXJyb3IKKwl8ICAgICAgIEZJTEVOQU1FIHsgeXllcnJvcigiZm9vIik7IH0KKwl8CisJOworCisKK2V4dHJhY3RfY29tbWFuZDoKKyAgICAgICAgICAgICAgICBFWFRSQUNUIG1vZHVsZW5hbWUKKwkJeyBhcl9leHRyYWN0KCQyKTsgfQorCTsKKworcmVwbGFjZV9jb21tYW5kOgkKKwkJUkVQTEFDRSBtb2R1bGVuYW1lCisJCXsgYXJfcmVwbGFjZSgkMik7IH0KKwk7CisJCitjbGVhcl9jb21tYW5kOgorCQlDTEVBUgorCQl7IGFyX2NsZWFyKCk7IH0KKwk7CisKK2RlbGV0ZV9jb21tYW5kOgorCQlERUxFVEUgbW9kdWxlbmFtZQorCQl7IGFyX2RlbGV0ZSgkMik7IH0KKwk7CithZGRtb2RfY29tbWFuZDoKKwlBRERNT0QgbW9kdWxlbmFtZQorCQl7IGFyX2FkZG1vZCgkMik7IH0KKwk7CisKK2xpc3RfY29tbWFuZDoJCisJCUxJU1QKKwkJeyBhcl9saXN0KCk7IH0KKwk7CisKK3NhdmVfY29tbWFuZDoJCisJCVNBVkUKKwkJeyBhcl9zYXZlKCk7IH0KKwk7CisKKworCitvcGVuX2NvbW1hbmQ6CisJCU9QRU4gRklMRU5BTUUgCisJCXsgYXJfb3BlbigkMiwwKTsgfQorCTsKKworY3JlYXRlX2NvbW1hbmQ6CisJCUNSRUFURSBGSUxFTkFNRSAKKwkJeyBhcl9vcGVuKCQyLDEpOyB9CisJOworCisKK2FkZGxpYl9jb21tYW5kOgorCQlBRERMSUIgRklMRU5BTUUgbW9kdWxlbGlzdAorCQl7IGFyX2FkZGxpYigkMiwkMyk7IH0KKwk7CitkaXJlY3RvcnlfY29tbWFuZDoKKwkJRElSRUNUT1JZIEZJTEVOQU1FIG1vZHVsZWxpc3Qgb3B0aW9uYWxfZmlsZW5hbWUKKwkJeyBhcl9kaXJlY3RvcnkoJDIsICQzLCAkNCk7IH0KKwk7CisKKworCitvcHRpb25hbF9maWxlbmFtZToKKwkJRklMRU5BTUUKKwkJeyAkJCA9ICQxOyB9CisJfAl7ICQkID0gMDsgfQorCTsKKworbW9kdWxlbGlzdDoKKwknKCcgbW9kdWxlbmFtZSAnKScgCisJCXsgJCQgPSAkMjsgfQorCXwKKwkJeyAkJCA9IDA7IH0KKwk7CisKK21vZHVsZW5hbWU6CisJCW1vZHVsZW5hbWUgb3B0Y29tbWEgRklMRU5BTUUKKwkJeyAJc3RydWN0IGxpc3QgKm4gID0gKHN0cnVjdCBsaXN0ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3QpKTsKKwkJCW4tPm5leHQgPSAkMTsgCisJCQluLT5uYW1lID0gJDM7CisJCQkkJCA9IG47CisJCSB9CisJfAl7ICQkID0gMDsgfQorCTsKKwkKKworb3B0Y29tbWE6CisJCScsJworCXwKKwk7CisJCisJCQordmVyYm9zZV9jb21tYW5kOgorCVZFUkJPU0UgCisJCXsgdmVyYm9zZSA9ICF2ZXJib3NlOyB9CisJOworCisKKyUlCisKK3N0YXRpYyBpbnQKK3l5ZXJyb3IgKHgpCisgICAgIGNvbnN0IGNoYXIgKng7Cit7CisgIGV4dGVybiBpbnQgbGluZW51bWJlcjsKKworICBwcmludGYgKF8oIlN5bnRheCBlcnJvciBpbiBhcmNoaXZlIHNjcmlwdCwgbGluZSAlZFxuIiksIGxpbmVudW1iZXIgKyAxKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnN1cC5jIGIvYmludXRpbHMvYXJzdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZkNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYXJzdXAuYwpAQCAtMCwwICsxLDQ1NiBAQAorLyogYXJzdXAuYyAtIEFyY2hpdmUgc3VwcG9ydCBmb3IgTVJJIGNvbXBhdGliaWxpdHkKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgorICAgCQkgIHNhY0BjeWdudXMuY29tCisKK1RoaXMgZmlsZSBsb29rcyBhZnRlciByZXF1ZXN0cyBmcm9tIGFycGFyc2UueSwgdG8gcHJvdmlkZSB0aGUgTVJJCitzdHlsZSBsaWJyYXJpYW4gY29tbWFuZCBzeW50YXggKyAxIHdvcmQgTElTVAorCisqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYXJzdXAuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKworc3RhdGljIHZvaWQgbWFwX292ZXJfbGlzdAorICBQQVJBTVMgKChiZmQgKiwgdm9pZCAoKmZ1bmN0aW9uKSAoYmZkICosIGJmZCAqKSwgc3RydWN0IGxpc3QgKikpOworc3RhdGljIHZvaWQgYXJfZGlyZWN0b3J5X2RvZXIgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgdm9pZCBhcl9hZGRsaWJfZG9lciBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKworZXh0ZXJuIGludCB2ZXJib3NlOworCitzdGF0aWMgdm9pZAorbWFwX292ZXJfbGlzdCAoYXJjaCwgZnVuY3Rpb24sIGxpc3QpCisgICAgIGJmZCAqYXJjaDsKKyAgICAgdm9pZCAoKmZ1bmN0aW9uKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKyAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Cit7CisgIGJmZCAqaGVhZDsKKworICBpZiAobGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZCAqbmV4dDsKKworICAgICAgaGVhZCA9IGFyY2gtPm5leHQ7CisgICAgICB3aGlsZSAoaGVhZCAhPSBOVUxMKQorCXsKKwkgIG5leHQgPSBoZWFkLT5uZXh0OworCSAgZnVuY3Rpb24gKGhlYWQsIChiZmQgKikgTlVMTCk7CisJICBoZWFkID0gbmV4dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IGxpc3QgKnB0cjsKKworICAgICAgLyogVGhpcyBtYXkgYXBwZWFyIHRvIGJlIGEgYmFyb3F1ZSB3YXkgb2YgYWNjb21wbGlzaGluZyB3aGF0IHdlCisJIHdhbnQuICBob3dldmVyIHdlIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBmaWxlbmFtZXMgaW4gb3JkZXIKKwkgdG8gbm90aWNlIHdoZXJlIGEgZmlsZW5hbWUgaXMgcmVxdWVzdGVkIGJ1dCBkb2VzIG5vdCBleGlzdCBpbgorCSB0aGUgYXJjaGl2ZS4gIERpdHRvIG1hcHBpbmcgb3ZlciBlYWNoIGZpbGUgZWFjaCB0aW1lIC0tIHdlCisJIHdhbnQgdG8gaGFjayBtdWx0aXBsZSByZWZlcmVuY2VzLiAgKi8KKyAgICAgIGZvciAocHRyID0gbGlzdDsgcHRyOyBwdHIgPSBwdHItPm5leHQpCisJeworCSAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCSAgYmZkICpwcmV2ID0gYXJjaDsKKworCSAgZm9yIChoZWFkID0gYXJjaC0+bmV4dDsgaGVhZDsgaGVhZCA9IGhlYWQtPm5leHQpIAorCSAgICB7CisJICAgICAgaWYgKGhlYWQtPmZpbGVuYW1lICE9IE5VTEwKKwkJICAmJiBzdHJjbXAgKHB0ci0+bmFtZSwgaGVhZC0+ZmlsZW5hbWUpID09IDApCisJCXsKKwkJICBmb3VuZCA9IHRydWU7CisJCSAgZnVuY3Rpb24gKGhlYWQsIHByZXYpOworCQl9CisJICAgICAgcHJldiA9IGhlYWQ7CisJICAgIH0KKwkgIGlmICghIGZvdW5kKQorCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk5vIGVudHJ5ICVzIGluIGFyY2hpdmUuXG4iKSwgcHRyLT5uYW1lKTsKKwl9CisgICAgfQorfQorCisKK0ZJTEUgKm91dGZpbGU7CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2FyX2RpcmVjdG9yeV9kb2VyIChhYmZkLCBpZ25vcmUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYmZkICppZ25vcmU7Cit7CisgICAgcHJpbnRfYXJlbHRfZGVzY3Iob3V0ZmlsZSwgYWJmZCwgdmVyYm9zZSk7Cit9CisKK3ZvaWQKK2FyX2RpcmVjdG9yeSAoYXJfbmFtZSwgbGlzdCwgb3V0cHV0KQorICAgICBjaGFyICphcl9uYW1lOworICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKKyAgICAgY2hhciAqb3V0cHV0OworeworICBiZmQgKmFyY2g7CisKKyAgYXJjaCA9IG9wZW5faW5hcmNoIChhcl9uYW1lLCAoY2hhciAqKSBOVUxMKTsKKyAgaWYgKG91dHB1dCkKKyAgICB7CisgICAgICBvdXRmaWxlID0gZm9wZW4ob3V0cHV0LCJ3Iik7CisgICAgICBpZiAob3V0ZmlsZSA9PSAwKQorCXsKKwkgIG91dGZpbGUgPSBzdGRvdXQ7CisJICBmcHJpbnRmIChzdGRlcnIsXygiQ2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgb3V0cHV0KTsKKwkgIG91dHB1dCA9IDA7CisJfQorICAgIH0KKyAgZWxzZSAKKyAgICBvdXRmaWxlID0gc3Rkb3V0OworCisgIG1hcF9vdmVyX2xpc3QgKGFyY2gsIGFyX2RpcmVjdG9yeV9kb2VyLCBsaXN0KTsKKworICBiZmRfY2xvc2UgKGFyY2gpOworCisgIGlmIChvdXRwdXQpCisgICBmY2xvc2UgKG91dGZpbGUpOworfQorCit2b2lkCitERUZVTl9WT0lEKHByb21wdCkKK3sKKyAgZXh0ZXJuIGludCBpbnRlcmFjdGl2ZTsKKyAgaWYgKGludGVyYWN0aXZlKSAKKyAgeworICAgIHByaW50ZigiQVIgPiIpOworICAgIGZmbHVzaChzdGRvdXQpOyAKKyAgfQorfQorCit2b2lkCittYXliZXF1aXQgKCkKK3sKKyAgaWYgKCEgaW50ZXJhY3RpdmUpIAorICAgIHhleGl0ICg5KTsKK30KKworCitiZmQgKm9iZmQ7CitjaGFyICpyZWFsX25hbWUgOyAKK3ZvaWQKK0RFRlVOKGFyX29wZW4sKG5hbWUsIHQpLAorICAgICAgY2hhciAqbmFtZSBBTkQKKyAgICAgIGludCB0KQorCit7CisgIGNoYXIgKnRuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKKyAgcmVhbF9uYW1lID0gbmFtZTsKKyAgc3ByaW50Zih0bmFtZSwgIiVzLXRtcCIsIG5hbWUpOworICBvYmZkID0gYmZkX29wZW53KHRuYW1lLCBOVUxMKTsKKworICBpZiAoIW9iZmQpIHsKKyAgICBmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgYXJjaGl2ZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKKwkgICAgdG5hbWUpOworCisgICAgbWF5YmVxdWl0KCk7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCF0KSB7CisgICAgICBiZmQgKipwdHI7CisgICAgICBiZmQgKmVsZW1lbnQ7CisgICAgICBiZmQgKmliZmQ7CisgICAgICBpYmZkID0gYmZkX29wZW5yKG5hbWUsIE5VTEwpOworICAgICAgaWYgKCFpYmZkKSB7CisJZnByaW50ZihzdGRlcnIsXygiJXM6IENhbid0IG9wZW4gaW5wdXQgYXJjaGl2ZSAlc1xuIiksCisJCXByb2dyYW1fbmFtZSwgbmFtZSk7CisJbWF5YmVxdWl0KCk7CisJcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQoaWJmZCwgYmZkX2FyY2hpdmUpICE9IHRydWUpIHsKKwlmcHJpbnRmKHN0ZGVycixfKCIlczogZmlsZSAlcyBpcyBub3QgYW4gYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSwKKwkJbmFtZSk7CisJbWF5YmVxdWl0KCk7CisJcmV0dXJuOworICAgICAgfQorICAgICAgcHRyID0gJihvYmZkLT5hcmNoaXZlX2hlYWQpOworICAgICAgZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUoaWJmZCwgTlVMTCk7CisKKyAgICAgIHdoaWxlIChlbGVtZW50KSB7CisJKnB0ciA9IGVsZW1lbnQ7CisJcHRyID0gJmVsZW1lbnQtPm5leHQ7CisJZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUoaWJmZCwgZWxlbWVudCk7CisgICAgICB9CisgICAgfQorCisgICAgYmZkX3NldF9mb3JtYXQob2JmZCwgYmZkX2FyY2hpdmUpOworCisgICAgb2JmZC0+aGFzX2FybWFwID0gMTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCithcl9hZGRsaWJfZG9lciAoYWJmZCwgcHJldikKKyAgICAgYmZkICphYmZkOworICAgICBiZmQgKnByZXY7Cit7CisgIC8qIEFkZCB0aGlzIG1vZHVsZSB0byB0aGUgb3V0cHV0IGJmZCAqLworICBpZiAocHJldiAhPSBOVUxMKQorICAgIHByZXYtPm5leHQgPSBhYmZkLT5uZXh0OworICBhYmZkLT5uZXh0ID0gb2JmZC0+YXJjaGl2ZV9oZWFkOworICBvYmZkLT5hcmNoaXZlX2hlYWQgPSBhYmZkOworfQorCit2b2lkCithcl9hZGRsaWIgKG5hbWUsIGxpc3QpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBsaXN0ICpsaXN0OworeworICBpZiAob2JmZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIG91dHB1dCBhcmNoaXZlIHNwZWNpZmllZCB5ZXRcbiIpLCBwcm9ncmFtX25hbWUpOworICAgICAgbWF5YmVxdWl0ICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZCAqYXJjaDsKKworICAgICAgYXJjaCA9IG9wZW5faW5hcmNoIChuYW1lLCAoY2hhciAqKSBOVUxMKTsKKyAgICAgIGlmIChhcmNoICE9IE5VTEwpCisJbWFwX292ZXJfbGlzdCAoYXJjaCwgYXJfYWRkbGliX2RvZXIsIGxpc3QpOworCisgICAgICAvKiBEb24ndCBjbG9zZSB0aGUgYmZkLCBzaW5jZSBpdCB3aWxsIG1ha2UgdGhlIGVsZW1lbnRzIGRpc2FzcHBlYXIgKi8KKyAgICB9Cit9CisKK3ZvaWQKK0RFRlVOKGFyX2FkZG1vZCwgKGxpc3QpLAorICAgICAgc3RydWN0IGxpc3QgKmxpc3QpCit7CisgIGlmICghb2JmZCkgeworICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7CisgICAgbWF5YmVxdWl0KCk7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBiZmQgKmFiZmQgPSBiZmRfb3BlbnIobGlzdC0+bmFtZSwgTlVMTCk7CisgICAgICBpZiAoIWFiZmQpICB7CisJZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKKwkJbGlzdC0+bmFtZSk7CisJbWF5YmVxdWl0KCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlhYmZkLT5uZXh0ID0gb2JmZC0+YXJjaGl2ZV9oZWFkOworCW9iZmQtPmFyY2hpdmVfaGVhZCA9IGFiZmQ7CisgICAgICB9CisgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9CisgIH0KK30KKworCisKK3ZvaWQKK0RFRlVOX1ZPSUQoYXJfY2xlYXIpCit7CitpZiAob2JmZCkgCisgb2JmZC0+YXJjaGl2ZV9oZWFkID0gMDsKK30KKwordm9pZAorREVGVU4oYXJfZGVsZXRlLCAobGlzdCksCisgICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKK3sKKyAgaWYgKCFvYmZkKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICBtYXliZXF1aXQoKTsKKyAgfQorICBlbHNlIAorICB7CisgICAgd2hpbGUgKGxpc3QpIHsKKyAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCisgICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKKyAgICAgIGJmZCAqKnByZXYgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7CisgICAgICBpbnQgZm91bmQgPSAwOworICAgICAgd2hpbGUgKG1lbWJlcikgeworCWlmIChzdHJjbXAobWVtYmVyLT5maWxlbmFtZSwgbGlzdC0+bmFtZSkgPT0gMCkgeworCSAgKnByZXYgPSBtZW1iZXItPm5leHQ7CisJICBmb3VuZCA9IDE7CisJfQorCWVsc2UgeworCSAgcHJldiA9ICYobWVtYmVyLT5uZXh0KTsKKwl9CisJICBtZW1iZXIgPSBtZW1iZXItPm5leHQ7CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKSAgeworCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAorCQlsaXN0LT5uYW1lKTsKKwltYXliZXF1aXQoKTsKKyAgICAgIH0KKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgfQorfQorCisKK3ZvaWQKK0RFRlVOX1ZPSUQoYXJfc2F2ZSkKK3sKKworICBpZiAoIW9iZmQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOworICAgIG1heWJlcXVpdCgpOworICB9CisgIGVsc2UgeworICAgIGNoYXIgKm9maWxlbmFtZSA9IHhzdHJkdXAgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKKyAgICBiZmRfY2xvc2Uob2JmZCk7CisgICAgCisgICAgcmVuYW1lIChvZmlsZW5hbWUsIHJlYWxfbmFtZSk7CisgICAgb2JmZCA9IDA7CisgICAgZnJlZShvZmlsZW5hbWUpOworICB9Cit9CisKKworCit2b2lkCitERUZVTihhcl9yZXBsYWNlLCAobGlzdCksCisgICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKK3sKKyAgaWYgKCFvYmZkKSB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICBtYXliZXF1aXQoKTsKKyAgfQorICBlbHNlIAorICB7CisgICAgd2hpbGUgKGxpc3QpIHsKKyAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCisgICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKKyAgICAgIGJmZCAqKnByZXYgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7CisgICAgICBpbnQgZm91bmQgPSAwOworICAgICAgd2hpbGUgKG1lbWJlcikgCisgICAgICB7CisJaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSAKKwl7CisJICAvKiBGb3VuZCB0aGUgb25lIHRvIHJlcGxhY2UgKi8KKwkgIGJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKKwkgIGlmICghYWJmZCkgCisJICB7CisJICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBsaXN0LT5uYW1lKTsKKwkgICAgbWF5YmVxdWl0KCk7CisJICB9CisJICBlbHNlIHsKKwkgICAgKnByZXYgPSBhYmZkOworCSAgICBhYmZkLT5uZXh0ID0gbWVtYmVyLT5uZXh0OworCSAgICBmb3VuZCA9IDE7CisJICB9CisJfQorCWVsc2UgeworCSAgcHJldiA9ICYobWVtYmVyLT5uZXh0KTsKKwl9CisJbWVtYmVyID0gbWVtYmVyLT5uZXh0OworICAgICAgfQorICAgICAgaWYgKCFmb3VuZCkgIHsKKwliZmQgKmFiZmQgPSBiZmRfb3BlbnIobGlzdC0+bmFtZSwgMCk7CisJZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCisJCWxpc3QtPm5hbWUpOworCWlmICghYWJmZCkgCisJeworCSAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsIGxpc3QtPm5hbWUpOworCSAgbWF5YmVxdWl0KCk7CisJfQorCWVsc2UgCisJeworCSAgKnByZXYgPSBhYmZkOworCX0KKyAgICAgIH0KKworICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgfQorfQorCisvKiBBbmQgSSBhZGRlZCB0aGlzIG9uZSAqLwordm9pZAorREVGVU5fVk9JRChhcl9saXN0KQoreworICBpZiAoIW9iZmQpIAorICB7CisgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICBtYXliZXF1aXQoKTsKKyAgfQorICBlbHNlIHsKKyAgICBiZmQgKmFiZmQ7CisgICAgb3V0ZmlsZSA9IHN0ZG91dDsKKyAgICB2ZXJib3NlID0xIDsKKyAgICBwcmludGYoXygiQ3VycmVudCBvcGVuIGFyY2hpdmUgaXMgJXNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisgICAgZm9yIChhYmZkID0gb2JmZC0+YXJjaGl2ZV9oZWFkOworCSBhYmZkICE9IChiZmQgKilOVUxMOworCSBhYmZkID0gYWJmZC0+bmV4dCkgCisgICAgeworICAgICAgYXJfZGlyZWN0b3J5X2RvZXIgKGFiZmQsIChiZmQgKikgTlVMTCk7CisgICAgfQorICB9Cit9CisKKwordm9pZCAKK0RFRlVOX1ZPSUQoYXJfZW5kKQoreworICBpZiAob2JmZCkKKyAgeworICAgIGZjbG9zZSgoRklMRSAqKShvYmZkLT5pb3N0cmVhbSkpOworICAgIHVubGluayhiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisgIH0KK30KK3ZvaWQKK0RFRlVOKGFyX2V4dHJhY3QsKGxpc3QpLAorICAgICAgc3RydWN0IGxpc3QgKmxpc3QpCit7CisgIGlmICghb2JmZCkgCisgIHsKKworICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiAgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7CisgICAgbWF5YmVxdWl0KCk7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICAvKiBGaW5kIHRoaXMgbmFtZSBpbiB0aGUgYXJjaGl2ZSAqLworICAgICAgYmZkICptZW1iZXIgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7CisgICAgICBpbnQgZm91bmQgPSAwOworICAgICAgd2hpbGUgKG1lbWJlciAmJiAhZm91bmQpIAorICAgICAgeworCWlmIChzdHJjbXAobWVtYmVyLT5maWxlbmFtZSwgbGlzdC0+bmFtZSkgPT0gMCkgCisJeworCSAgZXh0cmFjdF9maWxlKG1lbWJlcik7CisJICBmb3VuZCA9IDE7CisJICB9CisKKwltZW1iZXIgPSBtZW1iZXItPm5leHQ7CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKSAgeworCWJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKKwlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKKwkJbGlzdC0+bmFtZSk7CisKKyAgICAgIH0KKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJzdXAuaCBiL2JpbnV0aWxzL2Fyc3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0YTM0YgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2Fyc3VwLmgKQEAgLTAsMCArMSw3NSBAQAorLyogYXJzdXAuaCAtIGFyY2hpdmUgc3VwcG9ydCBoZWFkZXIgZmlsZQorICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworc3RydWN0IGxpc3QgeworCWNoYXIgKm5hbWU7CQorCXN0cnVjdCBsaXN0ICpuZXh0OworfTsKKwordm9pZAorbWF5YmVxdWl0IFBBUkFNUyAoKHZvaWQpKTsKKwordm9pZAorcHJvbXB0IFBBUkFNUyAoKHZvaWQpKTsKKwordm9pZAorYXJfY2xlYXIgUEFSQU1TICgodm9pZCkpOworCit2b2lkCithcl9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKKwordm9pZAorYXJfZGVsZXRlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKKwordm9pZAorYXJfc2F2ZSBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQKK2FyX2xpc3QgUEFSQU1TICgodm9pZCkpOworCit2b2lkCithcl9vcGVuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQKK2FyX2RpcmVjdG9yeSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBsaXN0ICosIGNoYXIgKikpOworCit2b2lkCithcl9hZGRtb2QgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOworCit2b2lkCithcl9hZGRsaWIgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGlzdCAqKSk7CisKK3ZvaWQgCithcl9lbmQgUEFSQU1TICgodm9pZCkpOworCit2b2lkCithcl9leHRyYWN0IFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKKworYmZkICoKK29wZW5faW5hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKikpOworCitpbnQKK3l5cGFyc2UgUEFSQU1TICgodm9pZCkpOworCisvKiBGdW5jdGlvbnMgZnJvbSBhci5jICovCisKK3ZvaWQKK2V4dHJhY3RfZmlsZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7CisKK2V4dGVybiBpbnQgaW50ZXJhY3RpdmU7CmRpZmYgLS1naXQgYS9iaW51dGlscy9iaW51dGlscy50ZXhpIGIvYmludXRpbHMvYmludXRpbHMudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdjNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvYmludXRpbHMudGV4aQpAQCAtMCwwICsxLDI5MDQgQEAKK1xpbnB1dCB0ZXhpbmZvICAgICAgIEBjICAgICAgICAgICAgICAgICAgICAtKi0gVGV4aW5mbyAtKi0KK0BzZXRmaWxlbmFtZSBiaW51dGlscy5pbmZvCitAaW5jbHVkZSBjb25maWcudGV4aQorCitAaWZpbmZvCitAZm9ybWF0CitTVEFSVC1JTkZPLURJUi1FTlRSWQorKiBCaW51dGlsczogKGJpbnV0aWxzKS4gICAgICAgICBUaGUgR05VIGJpbmFyeSB1dGlsaXRpZXMgImFyIiwgIm9iamNvcHkiLAorCQkJCSJvYmpkdW1wIiwgIm5tIiwgIm5sbWNvbnYiLCAic2l6ZSIsICJyZWFkZWxmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyIsICJzdHJpcCIsICJyYW5saWIiIGFuZCAiZGxsdG9vbCIuCitFTkQtSU5GTy1ESVItRU5UUlkKK0BlbmQgZm9ybWF0CitAZW5kIGlmaW5mbworCitAaWZpbmZvCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGEgY29weWluZyBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKKyh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworQGVuZCBpZ25vcmUKKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKK3RoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQorcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgorQGVuZCBpZmluZm8KKworQHN5bmluZGV4IGt5IGNwCitAYworQGMgVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgR05VIGJpbmFyeSB1dGlsaXRpZXMgImFyIiwgImxkIiwgIm9iamNvcHkiLAorQGMgICJvYmpkdW1wIiwgIm5tIiwgInNpemUiLCAic3RyaW5ncyIsICJzdHJpcCIsICJyZWFkZWxmIiBhbmQgInJhbmxpYiIuCitAYworQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIAorQGMgVGhpcyB0ZXh0IG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK0BjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitAYworCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCitAc2V0dGl0bGUgQHNje2dudX0gQmluYXJ5IFV0aWxpdGllcworQHRpdGxlcGFnZQorQGZpbmFsb3V0CitAdGl0bGUgVGhlIEBzY3tnbnV9IEJpbmFyeSBVdGlsaXRpZXMKK0BzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQorQHNwIDEKK0BzdWJ0aXRsZSBNYXkgMTk5MworQGF1dGhvciBSb2xhbmQgSC4gUGVzY2gKK0BhdXRob3IgSmVmZnJleSBNLiBPc2llcgorQGF1dGhvciBDeWdudXMgU3VwcG9ydAorQHBhZ2UKKworQHRleAore1xwYXJza2lwPTBwdCBcaGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyIFxoZmlsbAorXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyIH0KK0BlbmQgdGV4CisKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAordGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorCitAbm9kZSBUb3AKK0B0b3AgSW50cm9kdWN0aW9uCisKK0BjaW5kZXggdmVyc2lvbgorVGhpcyBicmllZiBtYW51YWwgY29udGFpbnMgcHJlbGltaW5hcnkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEBzY3tnbnV9IGJpbmFyeQordXRpbGl0aWVzIChjb2xsZWN0aXZlbHkgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0pOiAKKworQGlmdGV4CitAdGFibGUgQGNvZGUKK0BpdGVtIGFyCitDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcworCitAaXRlbSBubQorTGlzdCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzCisKK0BpdGVtIG9iamNvcHkKK0NvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKKworQGl0ZW0gb2JqZHVtcAorRGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tIG9iamVjdCBmaWxlcworCitAaXRlbSByYW5saWIKK0dlbmVyYXRlIGluZGV4IHRvIGFyY2hpdmUgY29udGVudHMKKworQGl0ZW0gcmVhZGVsZgorRGlzcGxheSB0aGUgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlcy4KKworQGl0ZW0gc2l6ZQorTGlzdCBmaWxlIHNlY3Rpb24gc2l6ZXMgYW5kIHRvdGFsIHNpemUKKworQGl0ZW0gc3RyaW5ncworTGlzdCBwcmludGFibGUgc3RyaW5ncyBmcm9tIGZpbGVzCisKK0BpdGVtIHN0cmlwCitEaXNjYXJkIHN5bWJvbHMKKworQGl0ZW0gYysrZmlsdAorRGVtYW5nbGUgZW5jb2RlZCBDKysgc3ltYm9scworCitAaXRlbSBhZGRyMmxpbmUKK0NvbnZlcnQgYWRkcmVzc2VzIGludG8gZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzCisKK0BpdGVtIG5sbWNvbnYKK0NvbnZlcnQgb2JqZWN0IGNvZGUgaW50byBhIE5ldHdhcmUgTG9hZGFibGUgTW9kdWxlCisKK0BpdGVtIHdpbmRyZXMKK01hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKKworQGl0ZW0gZGxsdG9vbAorQ3JlYXRlIHRoZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZSBEeW5hbWljIExpbmsgTGlicmFyaWVzCitAZW5kIHRhYmxlCitAZW5kIGlmdGV4CisKK0BtZW51CisqIGFyOjogICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSwgbW9kaWZ5LCBhbmQgZXh0cmFjdCBmcm9tIGFyY2hpdmVzCisqIG5tOjogICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcworKiBvYmpjb3B5OjoJCQlDb3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCisqIG9iamR1bXA6OiAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMKKyogcmFubGliOjogICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZSBjb250ZW50cworKiByZWFkZWxmOjoJCQlEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLgorKiBzaXplOjogICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHNlY3Rpb24gc2l6ZXMgYW5kIHRvdGFsIHNpemUKKyogc3RyaW5nczo6ICAgICAgICAgICAgICAgICAgICAgTGlzdCBwcmludGFibGUgc3RyaW5ncyBmcm9tIGZpbGVzCisqIHN0cmlwOjogICAgICAgICAgICAgICAgICAgICAgIERpc2NhcmQgc3ltYm9scworKiBjKytmaWx0OjoJCQlGaWx0ZXIgdG8gZGVtYW5nbGUgZW5jb2RlZCBDKysgc3ltYm9scworKiBhZGRyMmxpbmU6OgkJCUNvbnZlcnQgYWRkcmVzc2VzIHRvIGZpbGUgYW5kIGxpbmUKKyogbmxtY29udjo6ICAgICAgICAgICAgICAgICAgICAgQ29udmVydHMgb2JqZWN0IGNvZGUgaW50byBhbiBOTE0KKyogd2luZHJlczo6CQkJTWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcworKiBkbGx0b29sOjoJCQlDcmVhdGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRExMcworKiBTZWxlY3RpbmcgVGhlIFRhcmdldCBTeXN0ZW06OiBIb3cgdGhlc2UgdXRpbGl0aWVzIGRldGVybWluZSB0aGUgdGFyZ2V0LgorKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncworKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleAorQGVuZCBtZW51CisKK0Bub2RlIGFyCitAY2hhcHRlciBhcgorCitAa2luZGV4IGFyCitAY2luZGV4IGFyY2hpdmVzCitAY2luZGV4IGNvbGxlY3Rpb25zIG9mIGZpbGVzCitAc21hbGxleGFtcGxlCithciBbLV1AdmFye3B9W0B2YXJ7bW9kfSBbQHZhcntyZWxwb3N9XV0gQHZhcnthcmNoaXZlfSBbQHZhcnttZW1iZXJ9QGRvdHN7fV0KK2FyIC1NIFsgPG1yaS1zY3JpcHQgXQorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIEBzY3tnbnV9IEBjb2Rle2FyfSBwcm9ncmFtIGNyZWF0ZXMsIG1vZGlmaWVzLCBhbmQgZXh0cmFjdHMgZnJvbQorYXJjaGl2ZXMuICBBbiBAZGZue2FyY2hpdmV9IGlzIGEgc2luZ2xlIGZpbGUgaG9sZGluZyBhIGNvbGxlY3Rpb24gb2YKK290aGVyIGZpbGVzIGluIGEgc3RydWN0dXJlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcmV0cmlldmUKK3RoZSBvcmlnaW5hbCBpbmRpdmlkdWFsIGZpbGVzIChjYWxsZWQgQGRmbnttZW1iZXJzfSBvZiB0aGUgYXJjaGl2ZSkuCisKK1RoZSBvcmlnaW5hbCBmaWxlcycgY29udGVudHMsIG1vZGUgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgYW5kCitncm91cCBhcmUgcHJlc2VydmVkIGluIHRoZSBhcmNoaXZlLCBhbmQgY2FuIGJlIHJlc3RvcmVkIG9uCitleHRyYWN0aW9uLiAgCisKK0BjaW5kZXggbmFtZSBsZW5ndGgKK0BzY3tnbnV9IEBjb2Rle2FyfSBjYW4gbWFpbnRhaW4gYXJjaGl2ZXMgd2hvc2UgbWVtYmVycyBoYXZlIG5hbWVzIG9mIGFueQorbGVuZ3RoOyBob3dldmVyLCBkZXBlbmRpbmcgb24gaG93IEBjb2Rle2FyfSBpcyBjb25maWd1cmVkIG9uIHlvdXIKK3N5c3RlbSwgYSBsaW1pdCBvbiBtZW1iZXItbmFtZSBsZW5ndGggbWF5IGJlIGltcG9zZWQgZm9yIGNvbXBhdGliaWxpdHkKK3dpdGggYXJjaGl2ZSBmb3JtYXRzIG1haW50YWluZWQgd2l0aCBvdGhlciB0b29scy4gIElmIGl0IGV4aXN0cywgdGhlCitsaW1pdCBpcyBvZnRlbiAxNSBjaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBhLm91dCkgb3IgMTYKK2NoYXJhY3RlcnMgKHR5cGljYWwgb2YgZm9ybWF0cyByZWxhdGVkIHRvIGNvZmYpLgorCitAY2luZGV4IGxpYnJhcmllcworQGNvZGV7YXJ9IGlzIGNvbnNpZGVyZWQgYSBiaW5hcnkgdXRpbGl0eSBiZWNhdXNlIGFyY2hpdmVzIG9mIHRoaXMgc29ydAorYXJlIG1vc3Qgb2Z0ZW4gdXNlZCBhcyBAZGZue2xpYnJhcmllc30gaG9sZGluZyBjb21tb25seSBuZWVkZWQKK3N1YnJvdXRpbmVzLgorCitAY2luZGV4IHN5bWJvbCBpbmRleAorQGNvZGV7YXJ9IGNyZWF0ZXMgYW4gaW5kZXggdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiByZWxvY2F0YWJsZQorb2JqZWN0IG1vZHVsZXMgaW4gdGhlIGFyY2hpdmUgd2hlbiB5b3Ugc3BlY2lmeSB0aGUgbW9kaWZpZXIgQHNhbXB7c30uCitPbmNlIGNyZWF0ZWQsIHRoaXMgaW5kZXggaXMgdXBkYXRlZCBpbiB0aGUgYXJjaGl2ZSB3aGVuZXZlciBAY29kZXthcn0KK21ha2VzIGEgY2hhbmdlIHRvIGl0cyBjb250ZW50cyAoc2F2ZSBmb3IgdGhlIEBzYW1we3F9IHVwZGF0ZSBvcGVyYXRpb24pLgorQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAorYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwordGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgorCitZb3UgbWF5IHVzZSBAc2FtcHtubSAtc30gb3IgQHNhbXB7bm0gLS1wcmludC1hcm1hcH0gdG8gbGlzdCB0aGlzIGluZGV4Cit0YWJsZS4gIElmIGFuIGFyY2hpdmUgbGFja3MgdGhlIHRhYmxlLCBhbm90aGVyIGZvcm0gb2YgQGNvZGV7YXJ9IGNhbGxlZAorQGNvZGV7cmFubGlifSBjYW4gYmUgdXNlZCB0byBhZGQganVzdCB0aGUgdGFibGUuCisKK0BjaW5kZXggY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9CitAY2luZGV4IEBjb2Rle2FyfSBjb21wYXRpYmlsaXR5CitAc2N7Z251fSBAY29kZXthcn0gaXMgZGVzaWduZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHR3byBkaWZmZXJlbnQKK2ZhY2lsaXRpZXMuICBZb3UgY2FuIGNvbnRyb2wgaXRzIGFjdGl2aXR5IHVzaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zLAorbGlrZSB0aGUgZGlmZmVyZW50IHZhcmlldGllcyBvZiBAY29kZXthcn0gb24gVW5peCBzeXN0ZW1zOyBvciwgaWYgeW91CitzcGVjaWZ5IHRoZSBzaW5nbGUgY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0sIHlvdSBjYW4gY29udHJvbCBpdAord2l0aCBhIHNjcmlwdCBzdXBwbGllZCB2aWEgc3RhbmRhcmQgaW5wdXQsIGxpa2UgdGhlIE1SSSBgYGxpYnJhcmlhbicnCitwcm9ncmFtLgorCitAbWVudQorKiBhciBjbWRsaW5lOjogICAgICAgICAgICAgICAgICBDb250cm9sbGluZyBAY29kZXthcn0gb24gdGhlIGNvbW1hbmQgbGluZQorKiBhciBzY3JpcHRzOjogICAgICAgICAgICAgICAgICBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAorQGVuZCBtZW51CisKK0BwYWdlCitAbm9kZSBhciBjbWRsaW5lCitAc2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gb24gdGhlIGNvbW1hbmQgbGluZQorCitAc21hbGxleGFtcGxlCithciBbLV1AdmFye3B9W0B2YXJ7bW9kfSBbQHZhcntyZWxwb3N9XV0gQHZhcnthcmNoaXZlfSBbQHZhcnttZW1iZXJ9QGRvdHN7fV0KK0BlbmQgc21hbGxleGFtcGxlCisKK0BjaW5kZXggVW5peCBjb21wYXRpYmlsaXR5LCBAY29kZXthcn0KK1doZW4geW91IHVzZSBAY29kZXthcn0gaW4gdGhlIFVuaXggc3R5bGUsIEBjb2Rle2FyfSBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3bworYXJndW1lbnRzIHRvIGV4ZWN1dGU6IG9uZSBrZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgQGVtcGh7b3BlcmF0aW9ufQorKG9wdGlvbmFsbHkgYWNjb21wYW5pZWQgYnkgb3RoZXIga2V5bGV0dGVycyBzcGVjaWZ5aW5nCitAZW1waHttb2RpZmllcnN9KSwgYW5kIHRoZSBhcmNoaXZlIG5hbWUgdG8gYWN0IG9uLgorCitNb3N0IG9wZXJhdGlvbnMgY2FuIGFsc28gYWNjZXB0IGZ1cnRoZXIgQHZhcnttZW1iZXJ9IGFyZ3VtZW50cywKK3NwZWNpZnlpbmcgcGFydGljdWxhciBmaWxlcyB0byBvcGVyYXRlIG9uLgorCitAc2N7Z251fSBAY29kZXthcn0gYWxsb3dzIHlvdSB0byBtaXggdGhlIG9wZXJhdGlvbiBjb2RlIEB2YXJ7cH0gYW5kIG1vZGlmaWVyCitmbGFncyBAdmFye21vZH0gaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKworSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKK2Rhc2guCisKK0BjaW5kZXggb3BlcmF0aW9ucyBvbiBhcmNoaXZlCitUaGUgQHZhcntwfSBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQorYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZAorQGNpbmRleCBkZWxldGluZyBmcm9tIGFyY2hpdmUKK0BlbXBoe0RlbGV0ZX0gbW9kdWxlcyBmcm9tIHRoZSBhcmNoaXZlLiAgU3BlY2lmeSB0aGUgbmFtZXMgb2YgbW9kdWxlcyB0bworYmUgZGVsZXRlZCBhcyBAdmFye21lbWJlcn1AZG90c3t9OyB0aGUgYXJjaGl2ZSBpcyB1bnRvdWNoZWQgaWYgeW91CitzcGVjaWZ5IG5vIGZpbGVzIHRvIGRlbGV0ZS4KKworSWYgeW91IHNwZWNpZnkgdGhlIEBzYW1we3Z9IG1vZGlmaWVyLCBAY29kZXthcn0gbGlzdHMgZWFjaCBtb2R1bGUKK2FzIGl0IGlzIGRlbGV0ZWQuCisKK0BpdGVtIG0KK0BjaW5kZXggbW92aW5nIGluIGFyY2hpdmUKK1VzZSB0aGlzIG9wZXJhdGlvbiB0byBAZW1waHttb3ZlfSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCisKK1RoZSBvcmRlcmluZyBvZiBtZW1iZXJzIGluIGFuIGFyY2hpdmUgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGluIGhvdworcHJvZ3JhbXMgYXJlIGxpbmtlZCB1c2luZyB0aGUgbGlicmFyeSwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBtb3JlCit0aGFuIG9uZSBtZW1iZXIuICAKKworSWYgbm8gbW9kaWZpZXJzIGFyZSB1c2VkIHdpdGggQGNvZGV7bX0sIGFueSBtZW1iZXJzIHlvdSBuYW1lIGluIHRoZQorQHZhcnttZW1iZXJ9IGFyZ3VtZW50cyBhcmUgbW92ZWQgdG8gdGhlIEBlbXBoe2VuZH0gb2YgdGhlIGFyY2hpdmU7Cit5b3UgY2FuIHVzZSB0aGUgQHNhbXB7YX0sIEBzYW1we2J9LCBvciBAc2FtcHtpfSBtb2RpZmllcnMgdG8gbW92ZSB0aGVtIHRvIGEKK3NwZWNpZmllZCBwbGFjZSBpbnN0ZWFkLgorCitAaXRlbSBwCitAY2luZGV4IHByaW50aW5nIGZyb20gYXJjaGl2ZQorQGVtcGh7UHJpbnR9IHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCitvdXRwdXQgZmlsZS4gIElmIHRoZSBAc2FtcHt2fSBtb2RpZmllciBpcyBzcGVjaWZpZWQsIHNob3cgdGhlIG1lbWJlcgorbmFtZSBiZWZvcmUgY29weWluZyBpdHMgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgorCitJZiB5b3Ugc3BlY2lmeSBubyBAdmFye21lbWJlcn0gYXJndW1lbnRzLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZQorcHJpbnRlZC4KKworQGl0ZW0gcQorQGNpbmRleCBxdWljayBhcHBlbmQgdG8gYXJjaGl2ZQorQGVtcGh7UXVpY2sgYXBwZW5kfTsgSGlzdG9yaWNhbGx5LCBhZGQgdGhlIGZpbGVzIEB2YXJ7bWVtYmVyfUBkb3Rze30gdG8gdGhlIGVuZCBvZgorQHZhcnthcmNoaXZlfSwgd2l0aG91dCBjaGVja2luZyBmb3IgcmVwbGFjZW1lbnQuCisKK1RoZSBtb2RpZmllcnMgQHNhbXB7YX0sIEBzYW1we2J9LCBhbmQgQHNhbXB7aX0gZG8gQGVtcGh7bm90fSBhZmZlY3QgdGhpcworb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgorCitUaGUgbW9kaWZpZXIgQHNhbXB7dn0gbWFrZXMgQGNvZGV7YXJ9IGxpc3QgZWFjaCBmaWxlIGFzIGl0IGlzIGFwcGVuZGVkLgorCitTaW5jZSB0aGUgcG9pbnQgb2YgdGhpcyBvcGVyYXRpb24gaXMgc3BlZWQsIHRoZSBhcmNoaXZlJ3Mgc3ltYm9sIHRhYmxlCitpbmRleCBpcyBub3QgdXBkYXRlZCwgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQ7IHlvdSBjYW4gdXNlIEBzYW1we2FyIHN9IG9yCitAY29kZXtyYW5saWJ9IGV4cGxpY2l0bHkgdG8gdXBkYXRlIHRoZSBzeW1ib2wgdGFibGUgaW5kZXguCisKK0hvd2V2ZXIsIHRvbyBtYW55IGRpZmZlcmVudCBzeXN0ZW1zIGFzc3VtZSBxdWljayBhcHBlbmQgcmVidWlsZHMgdGhlCitpbmRleCwgc28gR05VIGFyIGltcGxlbWVudHMgQGNvZGV7cX0gYXMgYSBzeW5vbnltIGZvciBAY29kZXtyfS4KKworQGl0ZW0gcgorQGNpbmRleCByZXBsYWNlbWVudCBpbiBhcmNoaXZlCitJbnNlcnQgdGhlIGZpbGVzIEB2YXJ7bWVtYmVyfUBkb3Rze30gaW50byBAdmFye2FyY2hpdmV9ICh3aXRoCitAZW1waHtyZXBsYWNlbWVudH0pLiBUaGlzIG9wZXJhdGlvbiBkaWZmZXJzIGZyb20gQHNhbXB7cX0gaW4gdGhhdCBhbnkKK3ByZXZpb3VzbHkgZXhpc3RpbmcgbWVtYmVycyBhcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZworYWRkZWQuCisKK0lmIG9uZSBvZiB0aGUgZmlsZXMgbmFtZWQgaW4gQHZhcnttZW1iZXJ9QGRvdHN7fSBkb2VzIG5vdCBleGlzdCwgQGNvZGV7YXJ9CitkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCitvZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCisKK0J5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQordXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIEBzYW1we2F9LCBAc2FtcHtifSwgb3IgQHNhbXB7aX0gdG8gcmVxdWVzdAorcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgorCitUaGUgbW9kaWZpZXIgQHNhbXB7dn0gdXNlZCB3aXRoIHRoaXMgb3BlcmF0aW9uIGVsaWNpdHMgYSBsaW5lIG9mCitvdXRwdXQgZm9yIGVhY2ggZmlsZSBpbnNlcnRlZCwgYWxvbmcgd2l0aCBvbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7YX0gb3IKK0BzYW1we3J9IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCitkZWxldGVkKSBvciByZXBsYWNlZC4KKworQGl0ZW0gdAorQGNpbmRleCBjb250ZW50cyBvZiBhcmNoaXZlCitEaXNwbGF5IGEgQGVtcGh7dGFibGV9IGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7YXJjaGl2ZX0sIG9yIHRob3NlCitvZiB0aGUgZmlsZXMgbGlzdGVkIGluIEB2YXJ7bWVtYmVyfUBkb3Rze30gdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKK2FyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bworc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KK3JlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIEBzYW1we3Z9IG1vZGlmaWVyLgorCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBAdmFye21lbWJlcn0sIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQorYXJlIGxpc3RlZC4KKworQGNpbmRleCByZXBlYXRlZCBuYW1lcyBpbiBhcmNoaXZlCitAY2luZGV4IG5hbWUgZHVwbGljYXRpb24gaW4gYXJjaGl2ZQorSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBAc2FtcHtmaWV9KSBpbgorYW4gYXJjaGl2ZSAoc2F5IEBzYW1we2IuYX0pLCBAc2FtcHthciB0IGIuYSBmaWV9IGxpc3RzIG9ubHkgdGhlCitmaXJzdCBpbnN0YW5jZTsgdG8gc2VlIHRoZW0gYWxsLCB5b3UgbXVzdCBhc2sgZm9yIGEgY29tcGxldGUKK2xpc3RpbmctLS1pbiBvdXIgZXhhbXBsZSwgQHNhbXB7YXIgdCBiLmF9LgorQGMgV1JTIG9ubHk7IHBlciBHdW1ieSwgdGhpcyBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQsIGFuZCBpbiBhIG1vcmUKK0BjIHJlY2VudCBjYXNlIGluIGZhY3Qgd29ya3MgdGhlIG90aGVyIHdheS4KKworQGl0ZW0geAorQGNpbmRleCBleHRyYWN0IGZyb20gYXJjaGl2ZQorQGVtcGh7RXh0cmFjdH0gbWVtYmVycyAobmFtZWQgQHZhcnttZW1iZXJ9KSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgordXNlIHRoZSBAc2FtcHt2fSBtb2RpZmllciB3aXRoIHRoaXMgb3BlcmF0aW9uLCB0byByZXF1ZXN0IHRoYXQKK0Bjb2Rle2FyfSBsaXN0IGVhY2ggbmFtZSBhcyBpdCBleHRyYWN0cyBpdC4KKworSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgQHZhcnttZW1iZXJ9LCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKK2FyZSBleHRyYWN0ZWQuCisKK0BlbmQgdGFibGUKKworQSBudW1iZXIgb2YgbW9kaWZpZXJzIChAdmFye21vZH0pIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEB2YXJ7cH0KK2tleWxldHRlciwgdG8gc3BlY2lmeSB2YXJpYXRpb25zIG9uIGFuIG9wZXJhdGlvbidzIGJlaGF2aW9yOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGEKK0BjaW5kZXggcmVsYXRpdmUgcGxhY2VtZW50IGluIGFyY2hpdmUKK0FkZCBuZXcgZmlsZXMgQGVtcGh7YWZ0ZXJ9IGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKK2FyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBAc2FtcHthfSwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQorbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgQHZhcntyZWxwb3N9IGFyZ3VtZW50LCBiZWZvcmUgdGhlCitAdmFye2FyY2hpdmV9IHNwZWNpZmljYXRpb24uCisKK0BpdGVtIGIKK0FkZCBuZXcgZmlsZXMgQGVtcGh7YmVmb3JlfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCithcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7Yn0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKK21lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQorQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgQHNhbXB7aX0pLgorCitAaXRlbSBjCitAY2luZGV4IGNyZWF0aW5nIGFyY2hpdmVzCitAZW1waHtDcmVhdGV9IHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBAdmFye2FyY2hpdmV9IGlzIGFsd2F5cworY3JlYXRlZCBpZiBpdCBkaWQgbm90IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKK2lzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQordXNpbmcgdGhpcyBtb2RpZmllci4KKworQGl0ZW0gZgorVHJ1bmNhdGUgbmFtZXMgaW4gdGhlIGFyY2hpdmUuICBAc2N7Z251fSBAY29kZXthcn0gd2lsbCBub3JtYWxseSBwZXJtaXQgZmlsZQorbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBjcmVhdGUgYXJjaGl2ZXMgd2hpY2ggYXJlCitub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgQGNvZGV7YXJ9IHByb2dyYW0gb24gc29tZSBzeXN0ZW1zLiAgSWYKK3RoaXMgaXMgYSBjb25jZXJuLCB0aGUgQHNhbXB7Zn0gbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZQorbmFtZXMgd2hlbiBwdXR0aW5nIHRoZW0gaW4gdGhlIGFyY2hpdmUuCisKK0BpdGVtIGkKK0luc2VydCBuZXcgZmlsZXMgQGVtcGh7YmVmb3JlfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCithcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7aX0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKK21lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQorQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgQHNhbXB7Yn0pLgorCitAaXRlbSBsCitUaGlzIG1vZGlmaWVyIGlzIGFjY2VwdGVkIGJ1dCBub3QgdXNlZC4KK0BjIHdoYWZmb3IgYXIgbCBtb2RpZmllcj8/PyBwcmVzdW1hYmx5IGNvbXBhdDsgd2l0aAorQGMgd2hhdD8/Py0tLWRvY0BAY3lnbnVzLmNvbSwgMjVqYW45MSAKKworQGl0ZW0gbworQGNpbmRleCBkYXRlcyBpbiBhcmNoaXZlCitQcmVzZXJ2ZSB0aGUgQGVtcGh7b3JpZ2luYWx9IGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICBJZgoreW91IGRvIG5vdCBzcGVjaWZ5IHRoaXMgbW9kaWZpZXIsIGZpbGVzIGV4dHJhY3RlZCBmcm9tIHRoZSBhcmNoaXZlCithcmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCisKK0BpdGVtIHMKK0BjaW5kZXggd3JpdGluZyBhcmNoaXZlIGluZGV4CitXcml0ZSBhbiBvYmplY3QtZmlsZSBpbmRleCBpbnRvIHRoZSBhcmNoaXZlLCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lLAorZXZlbiBpZiBubyBvdGhlciBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgYXJjaGl2ZS4gIFlvdSBtYXkgdXNlIHRoaXMgbW9kaWZpZXIKK2ZsYWcgZWl0aGVyIHdpdGggYW55IG9wZXJhdGlvbiwgb3IgYWxvbmUuICBSdW5uaW5nIEBzYW1we2FyIHN9IG9uIGFuCithcmNoaXZlIGlzIGVxdWl2YWxlbnQgdG8gcnVubmluZyBAc2FtcHtyYW5saWJ9IG9uIGl0LgorCitAaXRlbSBTCitAY2luZGV4IG5vdCB3cml0aW5nIGFyY2hpdmUgaW5kZXgKK0RvIG5vdCBnZW5lcmF0ZSBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY2FuIHNwZWVkIHVwIGJ1aWxkaW5nIGEKK2xhcmdlIGxpYnJhcnkgaW4gc2V2ZXJhbCBzdGVwcy4gIFRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gbm90IGJlIHVzZWQKK3dpdGggdGhlIGxpbmtlci4gIEluIG9yZGVyIHRvIGJ1aWxkIGEgc3ltYm9sIHRhYmxlLCB5b3UgbXVzdCBvbWl0IHRoZQorQHNhbXB7U30gbW9kaWZpZXIgb24gdGhlIGxhc3QgZXhlY3V0aW9uIG9mIEBzYW1we2FyfSwgb3IgeW91IG11c3QgcnVuCitAc2FtcHtyYW5saWJ9IG9uIHRoZSBhcmNoaXZlLgorCitAaXRlbSB1CitAY2luZGV4IHVwZGF0aW5nIGFuIGFyY2hpdmUKK05vcm1hbGx5LCBAc2FtcHthciByfUBkb3Rze30gaW5zZXJ0cyBhbGwgZmlsZXMKK2xpc3RlZCBpbnRvIHRoZSBhcmNoaXZlLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5zZXJ0IEBlbXBoe29ubHl9IHRob3NlCitvZiB0aGUgZmlsZXMgeW91IGxpc3QgdGhhdCBhcmUgbmV3ZXIgdGhhbiBleGlzdGluZyBtZW1iZXJzIG9mIHRoZSBzYW1lCituYW1lcywgdXNlIHRoaXMgbW9kaWZpZXIuICBUaGUgQHNhbXB7dX0gbW9kaWZpZXIgaXMgYWxsb3dlZCBvbmx5IGZvciB0aGUKK29wZXJhdGlvbiBAc2FtcHtyfSAocmVwbGFjZSkuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29tYmluYXRpb24gQHNhbXB7cXV9IGlzCitub3QgYWxsb3dlZCwgc2luY2UgY2hlY2tpbmcgdGhlIHRpbWVzdGFtcHMgd291bGQgbG9zZSBhbnkgc3BlZWQKK2FkdmFudGFnZSBmcm9tIHRoZSBvcGVyYXRpb24gQHNhbXB7cX0uCisKK0BpdGVtIHYKK1RoaXMgbW9kaWZpZXIgcmVxdWVzdHMgdGhlIEBlbXBoe3ZlcmJvc2V9IHZlcnNpb24gb2YgYW4gb3BlcmF0aW9uLiAgTWFueQorb3BlcmF0aW9ucyBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMgZmlsZW5hbWVzIHByb2Nlc3NlZCwKK3doZW4gdGhlIG1vZGlmaWVyIEBzYW1we3Z9IGlzIGFwcGVuZGVkLgorCitAaXRlbSBWCitUaGlzIG1vZGlmaWVyIHNob3dzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXthcn0uCitAZW5kIHRhYmxlCisKK0Bub2RlIGFyIHNjcmlwdHMKK0BzZWN0aW9uIENvbnRyb2xsaW5nIEBjb2Rle2FyfSB3aXRoIGEgc2NyaXB0CisKK0BzbWFsbGV4YW1wbGUKK2FyIC1NIFsgPEB2YXJ7c2NyaXB0fSBdCitAZW5kIHNtYWxsZXhhbXBsZQorCitAY2luZGV4IE1SSSBjb21wYXRpYmlsaXR5LCBAY29kZXthcn0KK0BjaW5kZXggc2NyaXB0cywgQGNvZGV7YXJ9CitJZiB5b3UgdXNlIHRoZSBzaW5nbGUgY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0gd2l0aCBAY29kZXthcn0sIHlvdQorY2FuIGNvbnRyb2wgaXRzIG9wZXJhdGlvbiB3aXRoIGEgcnVkaW1lbnRhcnkgY29tbWFuZCBsYW5ndWFnZS4gIFRoaXMKK2Zvcm0gb2YgQGNvZGV7YXJ9IG9wZXJhdGVzIGludGVyYWN0aXZlbHkgaWYgc3RhbmRhcmQgaW5wdXQgaXMgY29taW5nCitkaXJlY3RseSBmcm9tIGEgdGVybWluYWwuICBEdXJpbmcgaW50ZXJhY3RpdmUgdXNlLCBAY29kZXthcn0gcHJvbXB0cyBmb3IKK2lucHV0ICh0aGUgcHJvbXB0IGlzIEBzYW1we0FSID59KSwgYW5kIGNvbnRpbnVlcyBleGVjdXRpbmcgZXZlbiBhZnRlcgorZXJyb3JzLiAgSWYgeW91IHJlZGlyZWN0IHN0YW5kYXJkIGlucHV0IHRvIGEgc2NyaXB0IGZpbGUsIG5vIHByb21wdHMgYXJlCitpc3N1ZWQsIGFuZCBAY29kZXthcn0gYWJhbmRvbnMgZXhlY3V0aW9uICh3aXRoIGEgbm9uemVybyBleGl0IGNvZGUpCitvbiBhbnkgZXJyb3IuCisKK1RoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBAZW1waHtub3R9IGRlc2lnbmVkIHRvIGJlIGVxdWl2YWxlbnQKK3RvIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uczsgaW4gZmFjdCwgaXQgcHJvdmlkZXMgc29tZXdoYXQgbGVzcyBjb250cm9sCitvdmVyIGFyY2hpdmVzLiAgVGhlIG9ubHkgcHVycG9zZSBvZiB0aGUgY29tbWFuZCBsYW5ndWFnZSBpcyB0byBlYXNlIHRoZQordHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXthcn0gZm9yIGRldmVsb3BlcnMgd2hvIGFscmVhZHkgaGF2ZSBzY3JpcHRzCit3cml0dGVuIGZvciB0aGUgTVJJIGBgbGlicmFyaWFuJycgcHJvZ3JhbS4KKworVGhlIHN5bnRheCBmb3IgdGhlIEBjb2Rle2FyfSBjb21tYW5kIGxhbmd1YWdlIGlzIHN0cmFpZ2h0Zm9yd2FyZDoKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitjb21tYW5kcyBhcmUgcmVjb2duaXplZCBpbiB1cHBlciBvciBsb3dlciBjYXNlOyBmb3IgZXhhbXBsZSwgQGNvZGV7TElTVH0KK2lzIHRoZSBzYW1lIGFzIEBjb2Rle2xpc3R9LiAgSW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbnMsIGNvbW1hbmRzIGFyZQorc2hvd24gaW4gdXBwZXIgY2FzZSBmb3IgY2xhcml0eS4KKworQGl0ZW0KK2Egc2luZ2xlIGNvbW1hbmQgbWF5IGFwcGVhciBvbiBlYWNoIGxpbmU7IGl0IGlzIHRoZSBmaXJzdCB3b3JkIG9uIHRoZQorbGluZS4KKworQGl0ZW0KK2VtcHR5IGxpbmVzIGFyZSBhbGxvd2VkLCBhbmQgaGF2ZSBubyBlZmZlY3QuCisKK0BpdGVtCitjb21tZW50cyBhcmUgYWxsb3dlZDsgdGV4dCBhZnRlciBlaXRoZXIgb2YgdGhlIGNoYXJhY3RlcnMgQHNhbXB7Kn0KK29yIEBzYW1wezt9IGlzIGlnbm9yZWQuCisKK0BpdGVtCitXaGVuZXZlciB5b3UgdXNlIGEgbGlzdCBvZiBuYW1lcyBhcyBwYXJ0IG9mIHRoZSBhcmd1bWVudCB0byBhbiBAY29kZXthcn0KK2NvbW1hbmQsIHlvdSBjYW4gc2VwYXJhdGUgdGhlIGluZGl2aWR1YWwgbmFtZXMgd2l0aCBlaXRoZXIgY29tbWFzIG9yCitibGFua3MuICBDb21tYXMgYXJlIHNob3duIGluIHRoZSBleHBsYW5hdGlvbnMgYmVsb3csIGZvciBjbGFyaXR5LgorCitAaXRlbQorQHNhbXB7K30gaXMgdXNlZCBhcyBhIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlcjsgaWYgQHNhbXB7K30gYXBwZWFycworYXQgdGhlIGVuZCBvZiBhIGxpbmUsIHRoZSB0ZXh0IG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb25zaWRlcmVkIHBhcnQKK29mIHRoZSBjdXJyZW50IGNvbW1hbmQuCitAZW5kIGl0ZW1pemUKKworSGVyZSBhcmUgdGhlIGNvbW1hbmRzIHlvdSBjYW4gdXNlIGluIEBjb2Rle2FyfSBzY3JpcHRzLCBvciB3aGVuIHVzaW5nCitAY29kZXthcn0gaW50ZXJhY3RpdmVseS4gIFRocmVlIG9mIHRoZW0gaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZToKKworQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfSBzcGVjaWZ5IGEgQGRmbntjdXJyZW50IGFyY2hpdmV9LCB3aGljaCBpcworYSB0ZW1wb3JhcnkgZmlsZSByZXF1aXJlZCBmb3IgbW9zdCBvZiB0aGUgb3RoZXIgY29tbWFuZHMuCisKK0Bjb2Rle1NBVkV9IGNvbW1pdHMgdGhlIGNoYW5nZXMgc28gZmFyIHNwZWNpZmllZCBieSB0aGUgc2NyaXB0LiAgUHJpb3IKK3RvIEBjb2Rle1NBVkV9LCBjb21tYW5kcyBhZmZlY3Qgb25seSB0aGUgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIGN1cnJlbnQKK2FyY2hpdmUuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQURETElCIEB2YXJ7YXJjaGl2ZX0gCitAaXRlbXggQURETElCIEB2YXJ7YXJjaGl2ZX0gKEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfSkKK0FkZCBhbGwgdGhlIGNvbnRlbnRzIG9mIEB2YXJ7YXJjaGl2ZX0gKG9yLCBpZiBzcGVjaWZpZWQsIGVhY2ggbmFtZWQKK0B2YXJ7bW9kdWxlfSBmcm9tIEB2YXJ7YXJjaGl2ZX0pIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUuCisKK1JlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgorCitAaXRlbSBBRERNT0QgQHZhcnttZW1iZXJ9LCBAdmFye21lbWJlcn0sIEBkb3Rze30gQHZhcnttZW1iZXJ9CitAYyBGSVhNRSEgdy9SZXBsYWNlbWVudD8/ICBJZiBzbywgbGlrZSAiYXIgciBAdmFye2FyY2hpdmV9IEB2YXJ7bmFtZXN9IgorQGMgICAgICAgIGVsc2UgbGlrZSAiYXIgcS4uLiIKK0FkZCBlYWNoIG5hbWVkIEB2YXJ7bWVtYmVyfSBhcyBhIG1vZHVsZSBpbiB0aGUgY3VycmVudCBhcmNoaXZlLgorCitSZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KKworQGl0ZW0gQ0xFQVIKK0Rpc2NhcmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFyY2hpdmUsIGNhbmNlbGluZyB0aGUgZWZmZWN0IG9mCithbnkgb3BlcmF0aW9ucyBzaW5jZSB0aGUgbGFzdCBAY29kZXtTQVZFfS4gIE1heSBiZSBleGVjdXRlZCAod2l0aCBubworZWZmZWN0KSBldmVuIGlmICBubyBjdXJyZW50IGFyY2hpdmUgaXMgc3BlY2lmaWVkLgorCitAaXRlbSBDUkVBVEUgQHZhcnthcmNoaXZlfQorQ3JlYXRlcyBhbiBhcmNoaXZlLCBhbmQgbWFrZXMgaXQgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yIG1hbnkKK290aGVyIGNvbW1hbmRzKS4gIFRoZSBuZXcgYXJjaGl2ZSBpcyBjcmVhdGVkIHdpdGggYSB0ZW1wb3JhcnkgbmFtZTsgaXQKK2lzIG5vdCBhY3R1YWxseSBzYXZlZCBhcyBAdmFye2FyY2hpdmV9IHVudGlsIHlvdSB1c2UgQGNvZGV7U0FWRX0uCitZb3UgY2FuIG92ZXJ3cml0ZSBleGlzdGluZyBhcmNoaXZlczsgc2ltaWxhcmx5LCB0aGUgY29udGVudHMgb2YgYW55CitleGlzdGluZyBmaWxlIG5hbWVkIEB2YXJ7YXJjaGl2ZX0gd2lsbCBub3QgYmUgZGVzdHJveWVkIHVudGlsIEBjb2Rle1NBVkV9LgorCitAaXRlbSBERUxFVEUgQHZhcnttb2R1bGV9LCBAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9CitEZWxldGUgZWFjaCBsaXN0ZWQgQHZhcnttb2R1bGV9IGZyb20gdGhlIGN1cnJlbnQgYXJjaGl2ZTsgZXF1aXZhbGVudCB0bworQHNhbXB7YXIgLWQgQHZhcnthcmNoaXZlfSBAdmFye21vZHVsZX0gQGRvdHN7fSBAdmFye21vZHVsZX19LgorCitSZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KKworQGl0ZW0gRElSRUNUT1JZIEB2YXJ7YXJjaGl2ZX0gKEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCitAaXRlbXggRElSRUNUT1JZIEB2YXJ7YXJjaGl2ZX0gKEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pIEB2YXJ7b3V0cHV0ZmlsZX0KK0xpc3QgZWFjaCBuYW1lZCBAdmFye21vZHVsZX0gcHJlc2VudCBpbiBAdmFye2FyY2hpdmV9LiAgVGhlIHNlcGFyYXRlCitjb21tYW5kIEBjb2Rle1ZFUkJPU0V9IHNwZWNpZmllcyB0aGUgZm9ybSBvZiB0aGUgb3V0cHV0OiB3aGVuIHZlcmJvc2UKK291dHB1dCBpcyBvZmYsIG91dHB1dCBpcyBsaWtlIHRoYXQgb2YgQHNhbXB7YXIgLXQgQHZhcnthcmNoaXZlfQorQHZhcnttb2R1bGV9QGRvdHN7fX0uICBXaGVuIHZlcmJvc2Ugb3V0cHV0IGlzIG9uLCB0aGUgbGlzdGluZyBpcyBsaWtlCitAc2FtcHthciAtdHYgQHZhcnthcmNoaXZlfSBAdmFye21vZHVsZX1AZG90c3t9fS4KKworT3V0cHV0IG5vcm1hbGx5IGdvZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW07IGhvd2V2ZXIsIGlmIHlvdQorc3BlY2lmeSBAdmFye291dHB1dGZpbGV9IGFzIGEgZmluYWwgYXJndW1lbnQsIEBjb2Rle2FyfSBkaXJlY3RzIHRoZQorb3V0cHV0IHRvIHRoYXQgZmlsZS4KKworQGl0ZW0gRU5ECitFeGl0IGZyb20gQGNvZGV7YXJ9LCB3aXRoIGEgQGNvZGV7MH0gZXhpdCBjb2RlIHRvIGluZGljYXRlIHN1Y2Nlc3NmdWwKK2NvbXBsZXRpb24uICBUaGlzIGNvbW1hbmQgZG9lcyBub3Qgc2F2ZSB0aGUgb3V0cHV0IGZpbGU7IGlmIHlvdSBoYXZlCitjaGFuZ2VkIHRoZSBjdXJyZW50IGFyY2hpdmUgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0gY29tbWFuZCwgdGhvc2UKK2NoYW5nZXMgYXJlIGxvc3QuCisKK0BpdGVtIEVYVFJBQ1QgQHZhcnttb2R1bGV9LCBAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9CitFeHRyYWN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IGZyb20gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgd3JpdGluZyB0aGVtCitpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBzZXBhcmF0ZSBmaWxlcy4gIEVxdWl2YWxlbnQgdG8gQHNhbXB7YXIgLXgKK0B2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCisKK1JlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgorCitAaWdub3JlCitAYyBGSVhNRSBUb2tlbnMgYnV0IG5vIGNvbW1hbmRzPz8/CitAaXRlbSBGVUxMRElSCisKK0BpdGVtIEhFTFAKK0BlbmQgaWdub3JlCisKK0BpdGVtIExJU1QKK0Rpc3BsYXkgZnVsbCBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBpbiBgYHZlcmJvc2UnJyBzdHlsZQorcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgQGNvZGV7VkVSQk9TRX0uICBUaGUgZWZmZWN0IGlzIGxpa2UgQHNhbXB7YXIKK3R2IEB2YXJ7YXJjaGl2ZX19KS4gIChUaGlzIHNpbmdsZSBjb21tYW5kIGlzIGEgQHNje2dudX0gQGNvZGV7bGR9CitlbmhhbmNlbWVudCwgcmF0aGVyIHRoYW4gcHJlc2VudCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuKQorCitSZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KKworQGl0ZW0gT1BFTiBAdmFye2FyY2hpdmV9CitPcGVucyBhbiBleGlzdGluZyBhcmNoaXZlIGZvciB1c2UgYXMgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yCittYW55IG90aGVyIGNvbW1hbmRzKS4gIEFueSBjaGFuZ2VzIGFzIHRoZSByZXN1bHQgb2Ygc3Vic2VxdWVudCBjb21tYW5kcword2lsbCBub3QgYWN0dWFsbHkgYWZmZWN0IEB2YXJ7YXJjaGl2ZX0gdW50aWwgeW91IG5leHQgdXNlIEBjb2Rle1NBVkV9LgorCitAaXRlbSBSRVBMQUNFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQorSW4gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgcmVwbGFjZSBlYWNoIGV4aXN0aW5nIEB2YXJ7bW9kdWxlfSAobmFtZWQgaW4KK3RoZSBAY29kZXtSRVBMQUNFfSBhcmd1bWVudHMpIGZyb20gZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCitUbyBleGVjdXRlIHRoaXMgY29tbWFuZCB3aXRob3V0IGVycm9ycywgYm90aCB0aGUgZmlsZSwgYW5kIHRoZSBtb2R1bGUgaW4KK3RoZSBjdXJyZW50IGFyY2hpdmUsIG11c3QgZXhpc3QuIAorCitSZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KKworQGl0ZW0gVkVSQk9TRQorVG9nZ2xlIGFuIGludGVybmFsIGZsYWcgZ292ZXJuaW5nIHRoZSBvdXRwdXQgZnJvbSBAY29kZXtESVJFQ1RPUll9LgorV2hlbiB0aGUgZmxhZyBpcyBvbiwgQGNvZGV7RElSRUNUT1JZfSBvdXRwdXQgbWF0Y2hlcyBvdXRwdXQgZnJvbQorQHNhbXB7YXIgLXR2IH1AZG90c3t9LgorCitAaXRlbSBTQVZFCitDb21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUsIGFuZCBhY3R1YWxseSBzYXZlIGl0IGFzIGEKK2ZpbGUgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGxhc3QgQGNvZGV7Q1JFQVRFfSBvciBAY29kZXtPUEVOfQorY29tbWFuZC4gCisKK1JlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgorCitAZW5kIHRhYmxlCisKK0BpZnRleAorQG5vZGUgbGQKK0BjaGFwdGVyIGxkCitAY2luZGV4IGxpbmtlcgorQGtpbmRleCBsZAorVGhlIEBzY3tnbnV9IGxpbmtlciBAY29kZXtsZH0gaXMgbm93IGRlc2NyaWJlZCBpbiBhIHNlcGFyYXRlIG1hbnVhbC4KK0B4cmVme1RvcCwsIE92ZXJ2aWV3LCwgVXNpbmcgTEQ6IHRoZSBAc2N7Z251fSBsaW5rZXJ9LgorQGVuZCBpZnRleAorCitAbm9kZSBubQorQGNoYXB0ZXIgbm0KK0BjaW5kZXggc3ltYm9scworQGtpbmRleCBubQorCitAc21hbGxleGFtcGxlCitubSBbIC1hIHwgLS1kZWJ1Zy1zeW1zIF0gIFsgLWcgfCAtLWV4dGVybi1vbmx5IF0KKyAgIFsgLUIgXSAgWyAtQyB8IC0tZGVtYW5nbGUgXSBbIC1EIHwgLS1keW5hbWljIF0KKyAgIFsgLXMgfCAtLXByaW50LWFybWFwIF0gIFsgLUEgfCAtbyB8IC0tcHJpbnQtZmlsZS1uYW1lIF0KKyAgIFsgLW4gfCAtdiB8IC0tbnVtZXJpYy1zb3J0IF0gIFsgLXAgfCAtLW5vLXNvcnQgXQorICAgWyAtciB8IC0tcmV2ZXJzZS1zb3J0IF0gIFsgLS1zaXplLXNvcnQgXSBbIC11IHwgLS11bmRlZmluZWQtb25seSBdCisgICBbIC10IEB2YXJ7cmFkaXh9IHwgLS1yYWRpeD1AdmFye3JhZGl4fSBdIFsgLVAgfCAtLXBvcnRhYmlsaXR5IF0KKyAgIFsgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIFsgLWYgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KKyAgIFsgLS1kZWZpbmVkLW9ubHkgXSBbLWwgfCAtLWxpbmUtbnVtYmVycyBdCisgICBbIC0tbm8tZGVtYW5nbGUgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0gIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQorQGVuZCBzbWFsbGV4YW1wbGUKKworQHNje2dudX0gQGNvZGV7bm19IGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIEB2YXJ7b2JqZmlsZX1AZG90c3t9LgorSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBsaXN0ZWQgYXMgYXJndW1lbnRzLCBAY29kZXtubX0gYXNzdW1lcworQGZpbGV7YS5vdXR9LgorCitGb3IgZWFjaCBzeW1ib2wsIEBjb2Rle25tfSBzaG93czoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1RoZSBzeW1ib2wgdmFsdWUsIGluIHRoZSByYWRpeCBzZWxlY3RlZCBieSBvcHRpb25zIChzZWUgYmVsb3cpLCBvcgoraGV4YWRlY2ltYWwgYnkgZGVmYXVsdC4KKworQGl0ZW0KK1RoZSBzeW1ib2wgdHlwZS4gIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHVzZWQ7IG90aGVycyBhcmUsIGFzCit3ZWxsLCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIElmIGxvd2VyY2FzZSwgdGhlIHN5bWJvbCBpcworbG9jYWw7IGlmIHVwcGVyY2FzZSwgdGhlIHN5bWJvbCBpcyBnbG9iYWwgKGV4dGVybmFsKS4KKworQGMgU29tZSBtb3JlIGRldGFpbCBvbiBleGFjdGx5IHdoYXQgdGhlc2Ugc3ltYm9sIHR5cGVzIGFyZSB1c2VkIGZvcgorQGMgd291bGQgYmUgbmljZS4KK0B0YWJsZSBAY29kZQorQGl0ZW0gQQorVGhlIHN5bWJvbCdzIHZhbHVlIGlzIGFic29sdXRlLCBhbmQgd2lsbCBub3QgYmUgY2hhbmdlZCBieSBmdXJ0aGVyCitsaW5raW5nLgorCitAaXRlbSBCCitUaGUgc3ltYm9sIGlzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiAoa25vd24gYXMgQlNTKS4KKworQGl0ZW0gQworVGhlIHN5bWJvbCBpcyBjb21tb24uICBDb21tb24gc3ltYm9scyBhcmUgdW5pbml0aWFsaXplZCBkYXRhLiAgV2hlbgorbGlua2luZywgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgbWF5IGFwcGVhciB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUKK3N5bWJvbCBpcyBkZWZpbmVkIGFueXdoZXJlLCB0aGUgY29tbW9uIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkCityZWZlcmVuY2VzLiAgRm9yIG1vcmUgZGV0YWlscyBvbiBjb21tb24gc3ltYm9scywgc2VlIHRoZSBkaXNjdXNzaW9uIG9mCistLXdhcm4tY29tbW9uIGluIEByZWZ7T3B0aW9ucywsTGlua2VyIG9wdGlvbnMsbGQuaW5mbyxUaGUgR05VIGxpbmtlcn0uCisKK0BpdGVtIEQKK1RoZSBzeW1ib2wgaXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4KKworQGl0ZW0gRworVGhlIHN5bWJvbCBpcyBpbiBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gZm9yIHNtYWxsIG9iamVjdHMuICBTb21lCitvYmplY3QgZmlsZSBmb3JtYXRzIHBlcm1pdCBtb3JlIGVmZmljaWVudCBhY2Nlc3MgdG8gc21hbGwgZGF0YSBvYmplY3RzLAorc3VjaCBhcyBhIGdsb2JhbCBpbnQgdmFyaWFibGUgYXMgb3Bwb3NlZCB0byBhIGxhcmdlIGdsb2JhbCBhcnJheS4KKworQGl0ZW0gSQorVGhlIHN5bWJvbCBpcyBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGlzIGlzIGEgR05VCitleHRlbnNpb24gdG8gdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBpcyByYXJlbHkgdXNlZC4KKworQGl0ZW0gTgorVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuCisKK0BpdGVtIFIKK1RoZSBzeW1ib2wgaXMgaW4gYSByZWFkIG9ubHkgZGF0YSBzZWN0aW9uLgorCitAaXRlbSBTCitUaGUgc3ltYm9sIGlzIGluIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGZvciBzbWFsbCBvYmplY3RzLgorCitAaXRlbSBUCitUaGUgc3ltYm9sIGlzIGluIHRoZSB0ZXh0IChjb2RlKSBzZWN0aW9uLgorCitAaXRlbSBVCitUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KKworQGl0ZW0gVworVGhlIHN5bWJvbCBpcyB3ZWFrLiAgV2hlbiBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIHdpdGggYSBub3JtYWwKK2RlZmluZWQgc3ltYm9sLCB0aGUgbm9ybWFsIGRlZmluZWQgc3ltYm9sIGlzIHVzZWQgd2l0aCBubyBlcnJvci4gIFdoZW4gYQord2VhayB1bmRlZmluZWQgc3ltYm9sIGlzIGxpbmtlZCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCwgdGhlIHZhbHVlCitvZiB0aGUgd2VhayBzeW1ib2wgYmVjb21lcyB6ZXJvIHdpdGggbm8gZXJyb3IuCisKK0BpdGVtIC0KK1RoZSBzeW1ib2wgaXMgYSBzdGFicyBzeW1ib2wgaW4gYW4gYS5vdXQgb2JqZWN0IGZpbGUuICBJbiB0aGlzIGNhc2UsIHRoZQorbmV4dCB2YWx1ZXMgcHJpbnRlZCBhcmUgdGhlIHN0YWJzIG90aGVyIGZpZWxkLCB0aGUgc3RhYnMgZGVzYyBmaWVsZCwgYW5kCit0aGUgc3RhYiB0eXBlLiAgU3RhYnMgc3ltYm9scyBhcmUgdXNlZCB0byBob2xkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjsKK2ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMgT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlCitgYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KKworQGl0ZW0gPworVGhlIHN5bWJvbCB0eXBlIGlzIHVua25vd24sIG9yIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYy4KK0BlbmQgdGFibGUKKworQGl0ZW0KK1RoZSBzeW1ib2wgbmFtZS4KK0BlbmQgaXRlbWl6ZQorCitUaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQorZXF1aXZhbGVudC4KKworQHRhYmxlIEBjb2RlCitAaXRlbSAtQQorQGl0ZW14IC1vCitAaXRlbXggLS1wcmludC1maWxlLW5hbWUgCitAY2luZGV4IGlucHV0IGZpbGUgbmFtZQorQGNpbmRleCBmaWxlIG5hbWUKK0BjaW5kZXggc291cmNlIGZpbGUgbmFtZQorUHJlY2VkZSBlYWNoIHN5bWJvbCBieSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSAob3IgYXJjaGl2ZSBlbGVtZW50KQoraW4gd2hpY2ggaXQgd2FzIGZvdW5kLCByYXRoZXIgdGhhbiBpZGVudGlmeWluZyB0aGUgaW5wdXQgZmlsZSBvbmNlIG9ubHksCitiZWZvcmUgYWxsIG9mIGl0cyBzeW1ib2xzLgorCitAaXRlbSAtYQorQGl0ZW14IC0tZGVidWctc3ltcyAKK0BjaW5kZXggZGVidWdnaW5nIHN5bWJvbHMKK0Rpc3BsYXkgYWxsIHN5bWJvbHMsIGV2ZW4gZGVidWdnZXItb25seSBzeW1ib2xzOyBub3JtYWxseSB0aGVzZSBhcmUgbm90CitsaXN0ZWQuCisKK0BpdGVtIC1CCitAY2luZGV4IEBjb2Rle25tfSBmb3JtYXQKK0BjaW5kZXggQGNvZGV7bm19IGNvbXBhdGliaWxpdHkKK1RoZSBzYW1lIGFzIEBzYW1wey0tZm9ybWF0PWJzZH0gKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgQGNvZGV7bm19KS4KKworQGl0ZW0gLUMKK0BpdGVteCAtLWRlbWFuZ2xlCitAY2luZGV4IGRlbWFuZ2xpbmcgaW4gbm0KK0RlY29kZSAoQGRmbntkZW1hbmdsZX0pIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgorQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCittYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuICBAeHJlZntjKytmaWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24KK29uIGRlbWFuZ2xpbmcuCisKK0BpdGVtIC0tbm8tZGVtYW5nbGUKK0RvIG5vdCBkZW1hbmdsZSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KKworQGl0ZW0gLUQKK0BpdGVteCAtLWR5bmFtaWMKK0BjaW5kZXggZHluYW1pYyBzeW1ib2xzCitEaXNwbGF5IHRoZSBkeW5hbWljIHN5bWJvbHMgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBzeW1ib2xzLiAgVGhpcyBpcworb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKK2xpYnJhcmllcy4KKworQGl0ZW0gLWYgQHZhcntmb3JtYXR9CitAaXRlbXggLS1mb3JtYXQ9QHZhcntmb3JtYXR9CitAY2luZGV4IEBjb2Rle25tfSBmb3JtYXQKK0BjaW5kZXggQGNvZGV7bm19IGNvbXBhdGliaWxpdHkKK1VzZSB0aGUgb3V0cHV0IGZvcm1hdCBAdmFye2Zvcm1hdH0sIHdoaWNoIGNhbiBiZSBAY29kZXtic2R9LAorQGNvZGV7c3lzdn0sIG9yIEBjb2Rle3Bvc2l4fS4gIFRoZSBkZWZhdWx0IGlzIEBjb2Rle2JzZH0uCitPbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgQHZhcntmb3JtYXR9IGlzIHNpZ25pZmljYW50OyBpdCBjYW4gYmUKK2VpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLgorCitAaXRlbSAtZworQGl0ZW14IC0tZXh0ZXJuLW9ubHkgCitAY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKK0Rpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzLgorCitAaXRlbSAtbAorQGl0ZW14IC0tbGluZS1udW1iZXJzCitAY2luZGV4IHN5bWJvbCBsaW5lIG51bWJlcnMKK0ZvciBlYWNoIHN5bWJvbCwgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0cnkgdG8gZmluZCBhIGZpbGVuYW1lIGFuZAorbGluZSBudW1iZXIuICBGb3IgYSBkZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQorYWRkcmVzcyBvZiB0aGUgc3ltYm9sLiAgRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lCitudW1iZXIgb2YgYSByZWxvY2F0aW9uIGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sLiAgSWYgbGluZSBudW1iZXIKK2luZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCwgcHJpbnQgaXQgYWZ0ZXIgdGhlIG90aGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLW4KK0BpdGVteCAtdgorQGl0ZW14IC0tbnVtZXJpYy1zb3J0IAorU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3NlcywgcmF0aGVyIHRoYW4gYWxwaGFiZXRpY2FsbHkKK2J5IHRoZWlyIG5hbWVzLiAKKworQGl0ZW0gLXAKK0BpdGVteCAtLW5vLXNvcnQgCitAY2luZGV4IHNvcnRpbmcgc3ltYm9scworRG8gbm90IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsgcHJpbnQgdGhlbSBpbiB0aGUgb3JkZXIKK2VuY291bnRlcmVkLgorCitAaXRlbSAtUAorQGl0ZW14IC0tcG9ydGFiaWxpdHkKK1VzZSB0aGUgUE9TSVguMiBzdGFuZGFyZCBvdXRwdXQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9ybWF0LgorRXF1aXZhbGVudCB0byBAc2FtcHstZiBwb3NpeH0uCisKK0BpdGVtIC1zCitAaXRlbXggLS1wcmludC1hcm1hcAorQGNpbmRleCBzeW1ib2wgaW5kZXgsIGxpc3RpbmcKK1doZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCisoc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IEBjb2Rle2FyfSBvciBAY29kZXtyYW5saWJ9KSBvZiB3aGljaCBtb2R1bGVzCitjb250YWluIGRlZmluaXRpb25zIGZvciB3aGljaCBuYW1lcy4KKworQGl0ZW0gLXIKK0BpdGVteCAtLXJldmVyc2Utc29ydCAKK1JldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0ICh3aGV0aGVyIG51bWVyaWMgb3IgYWxwaGFiZXRpYyk7IGxldCB0aGUKK2xhc3QgY29tZSBmaXJzdC4KKworQGl0ZW0gLS1zaXplLXNvcnQKK1NvcnQgc3ltYm9scyBieSBzaXplLiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgordGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHdpdGggdGhlIG5leHQgaGlnaGVyCit2YWx1ZS4gIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaXMgcHJpbnRlZCwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlLgorCitAaXRlbSAtdCBAdmFye3JhZGl4fQorQGl0ZW14IC0tcmFkaXg9QHZhcntyYWRpeH0KK1VzZSBAdmFye3JhZGl4fSBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQorQHNhbXB7ZH0gZm9yIGRlY2ltYWwsIEBzYW1we299IGZvciBvY3RhbCwgb3IgQHNhbXB7eH0gZm9yIGhleGFkZWNpbWFsLgorCitAaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9CitAY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAorU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgorQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAaXRlbSAtdQorQGl0ZW14IC0tdW5kZWZpbmVkLW9ubHkgCitAY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKK0BjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMKK0Rpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCisKK0BpdGVtIC0tZGVmaW5lZC1vbmx5CitAY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKK0BjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMKK0Rpc3BsYXkgb25seSBkZWZpbmVkIHN5bWJvbHMgZm9yIGVhY2ggb2JqZWN0IGZpbGUuCisKK0BpdGVtIC1WCitAaXRlbXggLS12ZXJzaW9uCitTaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtubX0gYW5kIGV4aXQuCisKK0BpdGVtIC0taGVscAorU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7bm19IGFuZCBleGl0LgorQGVuZCB0YWJsZQorCitAbm9kZSBvYmpjb3B5CitAY2hhcHRlciBvYmpjb3B5CisKK0BzbWFsbGV4YW1wbGUKK29iamNvcHkgWyAtRiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCisgICAgICAgIFsgLUkgQHZhcntiZmRuYW1lfSB8IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQorICAgICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCisgICAgICAgIFsgLVMgfCAtLXN0cmlwLWFsbCBdICBbIC1nIHwgLS1zdHJpcC1kZWJ1ZyBdCisgICAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCisgICAgICAgIFsgLU4gQHZhcntzeW1ib2xuYW1lfSB8IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQorICAgICAgICBbIC1MIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWxvY2FsaXplLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KKyAgICAgICAgWyAtVyBAdmFye3N5bWJvbG5hbWV9IHwgLS13ZWFrZW4tc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQorICAgICAgICBbIC14IHwgLS1kaXNjYXJkLWFsbCBdICBbIC1YIHwgLS1kaXNjYXJkLWxvY2FscyBdCisgICAgICAgIFsgLWIgQHZhcntieXRlfSB8IC0tYnl0ZT1AdmFye2J5dGV9IF0KKyAgICAgICAgWyAtaSBAdmFye2ludGVybGVhdmV9IHwgLS1pbnRlcmxlYXZlPUB2YXJ7aW50ZXJsZWF2ZX0gXQorICAgICAgICBbIC1SIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfSBdCisgICAgICAgIFsgLXAgfCAtLXByZXNlcnZlLWRhdGVzIF0gWyAtLWRlYnVnZ2luZyBdCisgICAgICAgIFsgLS1nYXAtZmlsbD1AdmFye3ZhbH0gXSBbIC0tcGFkLXRvPUB2YXJ7YWRkcmVzc30gXQorICAgICAgICBbIC0tc2V0LXN0YXJ0PUB2YXJ7dmFsfSBdIFsgLS1hZGp1c3Qtc3RhcnQ9QHZhcntpbmNyfSBdCisgICAgICAgIFsgLS1jaGFuZ2UtYWRkcmVzc2VzPUB2YXJ7aW5jcn0gXQorICAgICAgICBbIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcz1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KKyAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLWxtYT1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KKyAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLXZtYT1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KKyAgICAgICAgWyAtLWNoYW5nZS13YXJuaW5ncyBdIFsgLS1uby1jaGFuZ2Utd2FybmluZ3MgXQorICAgICAgICBbIC0tc2V0LXNlY3Rpb24tZmxhZ3M9QHZhcntzZWN0aW9ufT1AdmFye2ZsYWdzfSBdCisgICAgICAgIFsgLS1hZGQtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfT1AdmFye2ZpbGVuYW1lfSBdCisgICAgICAgIFsgLS1jaGFuZ2UtbGVhZGluZy1jaGFyIF0gWyAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgXQorICAgICAgICBbIC0td2Vha2VuIF0KKyAgICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdIFsgLVYgfCAtLXZlcnNpb24gXSAgWyAtLWhlbHAgXQorICAgICAgICBAdmFye2luZmlsZX0gW0B2YXJ7b3V0ZmlsZX1dCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgQHNje2dudX0gQGNvZGV7b2JqY29weX0gdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdAorZmlsZSB0byBhbm90aGVyLiAgQGNvZGV7b2JqY29weX0gdXNlcyB0aGUgQHNje2dudX0gQHNje2JmZH0gTGlicmFyeSB0bworcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbiB3cml0ZSB0aGUgZGVzdGluYXRpb24gb2JqZWN0CitmaWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgdGhlIHNvdXJjZSBvYmplY3QgZmlsZS4gIFRoZQorZXhhY3QgYmVoYXZpb3Igb2YgQGNvZGV7b2JqY29weX0gaXMgY29udHJvbGxlZCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKworQGNvZGV7b2JqY29weX0gY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMgdG8gZG8gaXRzIHRyYW5zbGF0aW9ucyBhbmQKK2RlbGV0ZXMgdGhlbSBhZnRlcndhcmQuICBAY29kZXtvYmpjb3B5fSB1c2VzIEBzY3tiZmR9IHRvIGRvIGFsbCBpdHMKK3RyYW5zbGF0aW9uIHdvcms7IGl0IGhhcyBhY2Nlc3MgdG8gYWxsIHRoZSBmb3JtYXRzIGRlc2NyaWJlZCBpbiBAc2N7YmZkfQorYW5kIHRodXMgaXMgYWJsZSB0byByZWNvZ25pemUgbW9zdCBmb3JtYXRzIHdpdGhvdXQgYmVpbmcgdG9sZAorZXhwbGljaXRseS4gIEB4cmVme0JGRCwsQkZELGxkLmluZm8sVXNpbmcgTER9LgorCitAY29kZXtvYmpjb3B5fSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBTLXJlY29yZHMgYnkgdXNpbmcgYW4gb3V0cHV0Cit0YXJnZXQgb2YgQHNhbXB7c3JlY30gKGUuZy4sIHVzZSBAc2FtcHstTyBzcmVjfSkuCisKK0Bjb2Rle29iamNvcHl9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcmF3IGJpbmFyeSBmaWxlIGJ5IHVzaW5nIGFuCitvdXRwdXQgdGFyZ2V0IG9mIEBzYW1we2JpbmFyeX0gKGUuZy4sIHVzZSBAc2FtcHstTyBiaW5hcnl9KS4gIFdoZW4KK0Bjb2Rle29iamNvcHl9IGdlbmVyYXRlcyBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgd2lsbCBlc3NlbnRpYWxseSBwcm9kdWNlCithIG1lbW9yeSBkdW1wIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBBbGwgc3ltYm9scyBhbmQKK3JlbG9jYXRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNjYXJkZWQuICBUaGUgbWVtb3J5IGR1bXAgd2lsbCBzdGFydCBhdAordGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLgorCitXaGVuIGdlbmVyYXRpbmcgYW4gUy1yZWNvcmQgb3IgYSByYXcgYmluYXJ5IGZpbGUsIGl0IG1heSBiZSBoZWxwZnVsIHRvCit1c2UgQHNhbXB7LVN9IHRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluCitzb21lIGNhc2VzIEBzYW1wey1SfSB3aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbgoraW5mb3JtYXRpb24gd2hpY2ggaXMgbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQHZhcntpbmZpbGV9CitAaXRlbXggQHZhcntvdXRmaWxlfQorVGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzLCByZXNwZWN0aXZlbHkuCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgQHZhcntvdXRmaWxlfSwgQGNvZGV7b2JqY29weX0gY3JlYXRlcyBhCit0ZW1wb3JhcnkgZmlsZSBhbmQgZGVzdHJ1Y3RpdmVseSByZW5hbWVzIHRoZSByZXN1bHQgd2l0aAordGhlIG5hbWUgb2YgQHZhcntpbmZpbGV9LgorCitAaXRlbSAtSSBAdmFye2JmZG5hbWV9CQorQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KK0NvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgQHZhcntiZmRuYW1lfSwgcmF0aGVyIHRoYW4KK2F0dGVtcHRpbmcgdG8gZGVkdWNlIGl0LiAgQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAaXRlbSAtTyBAdmFye2JmZG5hbWV9CitAaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KK1dyaXRlIHRoZSBvdXRwdXQgZmlsZSB1c2luZyB0aGUgb2JqZWN0IGZvcm1hdCBAdmFye2JmZG5hbWV9LgorQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAaXRlbSAtRiBAdmFye2JmZG5hbWV9CitAaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQorVXNlIEB2YXJ7YmZkbmFtZX0gYXMgdGhlIG9iamVjdCBmb3JtYXQgZm9yIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0CitmaWxlOyBpLmUuLCBzaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vCit0cmFuc2xhdGlvbi4gIEB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLVIgQHZhcntzZWN0aW9ubmFtZX0KK0BpdGVteCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9CitSZW1vdmUgYW55IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gZnJvbSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzCitvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCitpbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgorCitAaXRlbSAtUworQGl0ZW14IC0tc3RyaXAtYWxsCitEbyBub3QgY29weSByZWxvY2F0aW9uIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgc291cmNlIGZpbGUuCisKK0BpdGVtIC1nCitAaXRlbXggLS1zdHJpcC1kZWJ1ZworRG8gbm90IGNvcHkgZGVidWdnaW5nIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCisKK0BpdGVtIC0tc3RyaXAtdW5uZWVkZWQKK1N0cmlwIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KKworQGl0ZW0gLUsgQHZhcntzeW1ib2xuYW1lfQorQGl0ZW14IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQorQ29weSBvbmx5IHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5CitiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KKworQGl0ZW0gLU4gQHZhcntzeW1ib2xuYW1lfQorQGl0ZW14IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KK0RvIG5vdCBjb3B5IHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBvcHRpb24KK21heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KKworQGl0ZW0gLUwgQHZhcntzeW1ib2xuYW1lfQorQGl0ZW14IC0tbG9jYWxpemUtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KK01ha2Ugc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gbG9jYWwgdG8gdGhlIGZpbGUsIHNvIHRoYXQgaXQgaXMgbm90Cit2aXNpYmxlIGV4dGVybmFsbHkuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCisKK0BpdGVtIC1XIEB2YXJ7c3ltYm9sbmFtZX0KK0BpdGVteCAtLXdlYWtlbi1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQorTWFrZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSB3ZWFrLiBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCisKK0BpdGVtIC14CitAaXRlbXggLS1kaXNjYXJkLWFsbAorRG8gbm90IGNvcHkgbm9uLWdsb2JhbCBzeW1ib2xzIGZyb20gdGhlIHNvdXJjZSBmaWxlLgorQGMgRklYTUUgYW55IHJlYXNvbiB0byBwcmVmZXIgIm5vbi1nbG9iYWwiIHRvICJsb2NhbCIgaGVyZT8KKworQGl0ZW0gLVgKK0BpdGVteCAtLWRpc2NhcmQtbG9jYWxzCitEbyBub3QgY29weSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4KKyhUaGVzZSB1c3VhbGx5IHN0YXJ0IHdpdGggQHNhbXB7TH0gb3IgQHNhbXB7Ln0uKQorCitAaXRlbSAtYiBAdmFye2J5dGV9CitAaXRlbXggLS1ieXRlPUB2YXJ7Ynl0ZX0KK0tlZXAgb25seSBldmVyeSBAdmFye2J5dGV9dGggYnl0ZSBvZiB0aGUgaW5wdXQgZmlsZSAoaGVhZGVyIGRhdGEgaXMgbm90CithZmZlY3RlZCkuICBAdmFye2J5dGV9IGNhbiBiZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIEB2YXJ7aW50ZXJsZWF2ZX0tMSwKK3doZXJlIEB2YXJ7aW50ZXJsZWF2ZX0gaXMgZ2l2ZW4gYnkgdGhlIEBzYW1wey1pfSBvciBAc2FtcHstLWludGVybGVhdmV9CitvcHRpb24sIG9yIHRoZSBkZWZhdWx0IG9mIDQuICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGZpbGVzCit0byBwcm9ncmFtIEBzY3tyb219LiAgSXQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBhbiBAY29kZXtzcmVjfSBvdXRwdXQKK3RhcmdldC4KKworQGl0ZW0gLWkgQHZhcntpbnRlcmxlYXZlfQorQGl0ZW14IC0taW50ZXJsZWF2ZT1AdmFye2ludGVybGVhdmV9CitPbmx5IGNvcHkgb25lIG91dCBvZiBldmVyeSBAdmFye2ludGVybGVhdmV9IGJ5dGVzLiAgU2VsZWN0IHdoaWNoIGJ5dGUgdG8KK2NvcHkgd2l0aCB0aGUgQHZhcnstYn0gb3IgQHNhbXB7LS1ieXRlfSBvcHRpb24uICBUaGUgZGVmYXVsdCBpcyA0LgorQGNvZGV7b2JqY29weX0gaWdub3JlcyB0aGlzIG9wdGlvbiBpZiB5b3UgZG8gbm90IHNwZWNpZnkgZWl0aGVyIEBzYW1wey1ifSBvcgorQHNhbXB7LS1ieXRlfS4KKworQGl0ZW0gLXAKK0BpdGVteCAtLXByZXNlcnZlLWRhdGVzCitTZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBiZSB0aGUgc2FtZQorYXMgdGhvc2Ugb2YgdGhlIGlucHV0IGZpbGUuCisKK0BpdGVtIC0tZGVidWdnaW5nCitDb252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgcG9zc2libGUuICBUaGlzIGlzIG5vdCB0aGUgZGVmYXVsdAorYmVjYXVzZSBvbmx5IGNlcnRhaW4gZGVidWdnaW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgYW5kIHRoZQorY29udmVyc2lvbiBwcm9jZXNzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4KKworQGl0ZW0gLS1nYXAtZmlsbCBAdmFye3ZhbH0KK0ZpbGwgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHdpdGggQHZhcnt2YWx9LiAgVGhpcyBvcGVyYXRpb24gYXBwbGllcyB0bwordGhlIEBlbXBoe2xvYWQgYWRkcmVzc30gKExNQSkgb2YgdGhlIHNlY3Rpb25zLiAgSXQgaXMgZG9uZSBieSBpbmNyZWFzaW5nCit0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aXRoIHRoZSBsb3dlciBhZGRyZXNzLCBhbmQgZmlsbGluZyBpbiB0aGUgZXh0cmEKK3NwYWNlIGNyZWF0ZWQgd2l0aCBAdmFye3ZhbH0uCisKK0BpdGVtIC0tcGFkLXRvIEB2YXJ7YWRkcmVzc30KK1BhZCB0aGUgb3V0cHV0IGZpbGUgdXAgdG8gdGhlIGxvYWQgYWRkcmVzcyBAdmFye2FkZHJlc3N9LiAgVGhpcyBpcworZG9uZSBieSBpbmNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSBsYXN0IHNlY3Rpb24uICBUaGUgZXh0cmEgc3BhY2UgaXMKK2ZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgQHNhbXB7LS1nYXAtZmlsbH0gKGRlZmF1bHQgemVybykuCisKK0BpdGVtIC0tc2V0LXN0YXJ0IEB2YXJ7dmFsfQorU2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgZmlsZSB0byBAdmFye3ZhbH0uICBOb3QgYWxsIG9iamVjdCBmaWxlCitmb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KKworQGl0ZW0gLS1jaGFuZ2Utc3RhcnQgQHZhcntpbmNyfQorQGl0ZW14IC0tYWRqdXN0LXN0YXJ0IEB2YXJ7aW5jcn0KK0BjaW5kZXggY2hhbmdpbmcgc3RhcnQgYWRkcmVzcworQ2hhbmdlIHRoZSBzdGFydCBhZGRyZXNzIGJ5IGFkZGluZyBAdmFye2luY3J9LiAgTm90IGFsbCBvYmplY3QgZmlsZQorZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCisKK0BpdGVtIC0tY2hhbmdlLWFkZHJlc3NlcyBAdmFye2luY3J9CitAaXRlbXggLS1hZGp1c3Qtdm1hIEB2YXJ7aW5jcn0KK0BjaW5kZXggY2hhbmdpbmcgb2JqZWN0IGFkZHJlc3NlcworQ2hhbmdlIHRoZSBWTUEgYW5kIExNQSBhZGRyZXNzZXMgb2YgYWxsIHNlY3Rpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdGFydAorYWRkcmVzcywgYnkgYWRkaW5nIEB2YXJ7aW5jcn0uICBTb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgZG8gbm90IHBlcm1pdAorc2VjdGlvbiBhZGRyZXNzZXMgdG8gYmUgY2hhbmdlZCBhcmJpdHJhcmlseS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CityZWxvY2F0ZSB0aGUgc2VjdGlvbnM7IGlmIHRoZSBwcm9ncmFtIGV4cGVjdHMgc2VjdGlvbnMgdG8gYmUgbG9hZGVkIGF0IGEKK2NlcnRhaW4gYWRkcmVzcywgYW5kIHRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBzZWN0aW9ucyBzdWNoCit0aGF0IHRoZXkgYXJlIGxvYWRlZCBhdCBhIGRpZmZlcmVudCBhZGRyZXNzLCB0aGUgcHJvZ3JhbSBtYXkgZmFpbC4gCisKK0BpdGVtIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9CitAaXRlbXggLS1hZGp1c3Qtc2VjdGlvbi12bWEgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQorQGNpbmRleCBjaGFuZ2luZyBzZWN0aW9uIGFkZHJlc3MKK1NldCBvciBjaGFuZ2UgYm90aCB0aGUgVk1BIGFkZHJlc3MgYW5kIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQKK0B2YXJ7c2VjdGlvbn0uICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0bworQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZQorc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBAc2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LAorYWJvdmUuIElmIEB2YXJ7c2VjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsCitiZSBpc3N1ZWQsIHVubGVzcyBAc2FtcHstLW5vLWNoYW5nZS13YXJuaW5nc30gaXMgdXNlZC4KKworQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi1sbWEgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQorQGNpbmRleCBjaGFuZ2luZyBzZWN0aW9uIExNQQorU2V0IG9yIGNoYW5nZSB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGUgTE1BCithZGRyZXNzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9hZGVkIGludG8gbWVtb3J5IGF0Citwcm9ncmFtIGxvYWQgdGltZS4gIE5vcm1hbGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFZNQSBhZGRyZXNzLCB3aGljaAoraXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gYXQgcHJvZ3JhbSBydW4gdGltZSwgYnV0IG9uIHNvbWUgc3lzdGVtcywKK2VzcGVjaWFsbHkgdGhvc2Ugd2hlcmUgYSBwcm9ncmFtIGlzIGhlbGQgaW4gUk9NLCB0aGUgdHdvIGNhbiBiZQorZGlmZmVyZW50LiAgSWYgQHNhbXB7PX0gaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8KK0B2YXJ7dmFsfS4gIE90aGVyd2lzZSwgQHZhcnt2YWx9IGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUKK3NlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwKK2Fib3ZlLiAgSWYgQHZhcntzZWN0aW9ufSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nCit3aWxsIGJlIGlzc3VlZCwgdW5sZXNzIEBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLiAgCisKK0BpdGVtIC0tY2hhbmdlLXNlY3Rpb24tdm1hIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KK0BjaW5kZXggY2hhbmdpbmcgc2VjdGlvbiBWTUEKK1NldCBvciBjaGFuZ2UgdGhlIFZNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBAdmFye3NlY3Rpb259LiAgVGhlIFZNQQorYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsIGJlIGxvY2F0ZWQgb25jZSB0aGUKK3Byb2dyYW0gaGFzIHN0YXJ0ZWQgZXhlY3V0aW5nLiAgTm9ybWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgTE1BCithZGRyZXNzLCB3aGljaCBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsIGJlIGxvYWRlZCBpbnRvCittZW1vcnksIGJ1dCBvbiBzb21lIHN5c3RlbXMsIGVzcGVjaWFsbHkgdGhvc2Ugd2hlcmUgYSBwcm9ncmFtIGlzIGhlbGQgaW4KK1JPTSwgdGhlIHR3byBjYW4gYmUgZGlmZmVyZW50LiAgSWYgQHNhbXB7PX0gaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcworaXMgc2V0IHRvIEB2YXJ7dmFsfS4gIE90aGVyd2lzZSwgQHZhcnt2YWx9IGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQKK2Zyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIKK0BzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sIGFib3ZlLiAgSWYgQHZhcntzZWN0aW9ufSBkb2VzIG5vdCBleGlzdCBpbgordGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCwgdW5sZXNzCitAc2FtcHstLW5vLWNoYW5nZS13YXJuaW5nc30gaXMgdXNlZC4gICAKKworQGl0ZW0gLS1jaGFuZ2Utd2FybmluZ3MKK0BpdGVteCAtLWFkanVzdC13YXJuaW5ncworSWYgQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzfSBvciBAc2FtcHstLWNoYW5nZS1zZWN0aW9uLWxtYX0gb3IKK0BzYW1wey0tY2hhbmdlLXNlY3Rpb24tdm1hfSBpcyB1c2VkLCBhbmQgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QKK2V4aXN0LCBpc3N1ZSBhIHdhcm5pbmcuICBUaGlzIGlzIHRoZSBkZWZhdWx0LiAKKworQGl0ZW0gLS1uby1jaGFuZ2Utd2FybmluZ3MKK0BpdGVteCAtLW5vLWFkanVzdC13YXJuaW5ncworRG8gbm90IGlzc3VlIGEgd2FybmluZyBpZiBAc2FtcHstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3N9IG9yCitAc2FtcHstLWFkanVzdC1zZWN0aW9uLWxtYX0gb3IgQHNhbXB7LS1hZGp1c3Qtc2VjdGlvbi12bWF9IGlzIHVzZWQsIGV2ZW4KK2lmIHRoZSBuYW1lZCBzZWN0aW9uIGRvZXMgbm90IGV4aXN0LiAKKworQGl0ZW0gLS1zZXQtc2VjdGlvbi1mbGFncyBAdmFye3NlY3Rpb259PUB2YXJ7ZmxhZ3N9CitTZXQgdGhlIGZsYWdzIGZvciB0aGUgbmFtZWQgc2VjdGlvbi4gIFRoZSBAdmFye2ZsYWdzfSBhcmd1bWVudCBpcyBhCitjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGZsYWcgbmFtZXMuICBUaGUgcmVjb2duaXplZCBuYW1lcyBhcmUKK0BzYW1we2FsbG9jfSwgQHNhbXB7Y29udGVudHN9LCBAc2FtcHtsb2FkfSwgQHNhbXB7cmVhZG9ubHl9LAorQHNhbXB7Y29kZX0sIEBzYW1we2RhdGF9LCBhbmQgQHNhbXB7cm9tfS4gIFlvdSBjYW4gc2V0IHRoZQorQHNhbXB7Y29udGVudHN9IGZsYWcgZm9yIGEgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBoYXZlIGNvbnRlbnRzLCBidXQgaXQKK2lzIG5vdCBtZWFuaW5nZnVsIHRvIGNsZWFyIHRoZSBAc2FtcHtjb250ZW50c30gZmxhZyBvZiBhIHNlY3Rpb24gd2hpY2gKK2RvZXMgaGF2ZSBjb250ZW50cy0tanVzdCByZW1vdmUgdGhlIHNlY3Rpb24gaW5zdGVhZC4gIE5vdCBhbGwgZmxhZ3MgYXJlCittZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cy4KKworQGl0ZW0gLS1hZGQtc2VjdGlvbiBAdmFye3NlY3Rpb25uYW1lfT1AdmFye2ZpbGVuYW1lfQorQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gd2hpbGUgY29weWluZyB0aGUgZmlsZS4gIFRoZQorY29udGVudHMgb2YgdGhlIG5ldyBzZWN0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LiAgVGhlCitzaXplIG9mIHRoZSBzZWN0aW9uIHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBvbmx5Cit3b3JrcyBvbiBmaWxlIGZvcm1hdHMgd2hpY2ggY2FuIHN1cHBvcnQgc2VjdGlvbnMgd2l0aCBhcmJpdHJhcnkgbmFtZXMuCisKK0BpdGVtIC0tY2hhbmdlLWxlYWRpbmctY2hhcgorU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mCitzeW1ib2xzLiAgVGhlIG1vc3QgY29tbW9uIHN1Y2ggY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUsIHdoaWNoIGNvbXBpbGVycworb2Z0ZW4gYWRkIGJlZm9yZSBldmVyeSBzeW1ib2wuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtvYmpjb3B5fSB0bworY2hhbmdlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiBldmVyeSBzeW1ib2wgd2hlbiBpdCBjb252ZXJ0cyBiZXR3ZWVuCitvYmplY3QgZmlsZSBmb3JtYXRzLiAgSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHRoZSBzYW1lIGxlYWRpbmcKK2NoYXJhY3RlciwgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdC4gIE90aGVyd2lzZSwgaXQgd2lsbCBhZGQgYQorY2hhcmFjdGVyLCBvciByZW1vdmUgYSBjaGFyYWN0ZXIsIG9yIGNoYW5nZSBhIGNoYXJhY3RlciwgYXMKK2FwcHJvcHJpYXRlLgorCitAaXRlbSAtLXJlbW92ZS1sZWFkaW5nLWNoYXIKK0lmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBnbG9iYWwgc3ltYm9sIGlzIGEgc3BlY2lhbCBzeW1ib2wgbGVhZGluZworY2hhcmFjdGVyIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIuICBUaGUKK21vc3QgY29tbW9uIHN5bWJvbCBsZWFkaW5nIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLiAgVGhpcyBvcHRpb24gd2lsbAorcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gYWxsIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUgdXNlZnVsCitpZiB5b3Ugd2FudCB0byBsaW5rIHRvZ2V0aGVyIG9iamVjdHMgb2YgZGlmZmVyZW50IGZpbGUgZm9ybWF0cyB3aXRoCitkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KK0Bjb2Rley0tY2hhbmdlLWxlYWRpbmctY2hhcn0gYmVjYXVzZSBpdCBhbHdheXMgY2hhbmdlcyB0aGUgc3ltYm9sIG5hbWUKK3doZW4gYXBwcm9wcmlhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0CitmaWxlLgorCitAaXRlbSAtLXdlYWtlbgorQ2hhbmdlIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgZmlsZSB0byBiZSB3ZWFrLiAgVGhpcyBjYW4gYmUgdXNlZnVsCit3aGVuIGJ1aWxkaW5nIGFuIG9iamVjdCB3aGljaCB3aWxsIGJlIGxpbmtlZCBhZ2FpbnN0IG90aGVyIG9iamVjdHMgdXNpbmcKK3RoZSBAY29kZXstUn0gb3B0aW9uIHRvIHRoZSBsaW5rZXIuICBUaGlzIG9wdGlvbiBpcyBvbmx5IGVmZmVjdGl2ZSB3aGVuCit1c2luZyBhbiBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgd2VhayBzeW1ib2xzLgorCitAaXRlbSAtVgorQGl0ZW14IC0tdmVyc2lvbgorU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7b2JqY29weX0uCisKK0BpdGVtIC12CitAaXRlbXggLS12ZXJib3NlCitWZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKK2FyY2hpdmVzLCBAc2FtcHtvYmpjb3B5IC1WfSBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KKworQGl0ZW0gLS1oZWxwCitTaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtvYmpjb3B5fS4KK0BlbmQgdGFibGUKKworQG5vZGUgb2JqZHVtcAorQGNoYXB0ZXIgb2JqZHVtcAorCitAY2luZGV4IG9iamVjdCBmaWxlIGluZm9ybWF0aW9uCitAa2luZGV4IG9iamR1bXAKKworQHNtYWxsZXhhbXBsZQorb2JqZHVtcCBbIC1hIHwgLS1hcmNoaXZlLWhlYWRlcnMgXSAKKyAgICAgICAgWyAtYiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIFsgLS1kZWJ1Z2dpbmcgXQorICAgICAgICBbIC1DIHwgLS1kZW1hbmdsZSBdIFsgLWQgfCAtLWRpc2Fzc2VtYmxlIF0KKyAgICAgICAgWyAtRCB8IC0tZGlzYXNzZW1ibGUtYWxsIF0gWyAtLWRpc2Fzc2VtYmxlLXplcm9lcyBdCisgICAgICAgIFsgLUVCIHwgLUVMIHwgLS1lbmRpYW49QHtiaWcgfCBsaXR0bGUgQH0gXQorICAgICAgICBbIC1mIHwgLS1maWxlLWhlYWRlcnMgXQorICAgICAgICBbIC1oIHwgLS1zZWN0aW9uLWhlYWRlcnMgfCAtLWhlYWRlcnMgXSAgWyAtaSB8IC0taW5mbyBdCisgICAgICAgIFsgLWogQHZhcntzZWN0aW9ufSB8IC0tc2VjdGlvbj1AdmFye3NlY3Rpb259IF0KKyAgICAgICAgWyAtbCB8IC0tbGluZS1udW1iZXJzIF0gWyAtUyB8IC0tc291cmNlIF0KKyAgICAgICAgWyAtbSBAdmFye21hY2hpbmV9IHwgLS1hcmNoaXRlY3R1cmU9QHZhcnttYWNoaW5lfSBdCisgICAgICAgIFsgLXAgfCAtLXByaXZhdGUtaGVhZGVycyBdCisgICAgICAgIFsgLXIgfCAtLXJlbG9jIF0gWyAtUiB8IC0tZHluYW1pYy1yZWxvYyBdCisgICAgICAgIFsgLXMgfCAtLWZ1bGwtY29udGVudHMgXSAgWyAtLXN0YWJzIF0KKyAgICAgICAgWyAtdCB8IC0tc3ltcyBdIFsgLVQgfCAtLWR5bmFtaWMtc3ltcyBdIFsgLXggfCAtLWFsbC1oZWFkZXJzIF0KKyAgICAgICAgWyAtdyB8IC0td2lkZSBdIFsgLS1zdGFydC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30gXQorICAgICAgICBbIC0tc3RvcC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30gXQorICAgICAgICBbIC0tcHJlZml4LWFkZHJlc3Nlc10gWyAtLVtuby1dc2hvdy1yYXctaW5zbiBdCisgICAgICAgIFsgLS1hZGp1c3Qtdm1hPUB2YXJ7b2Zmc2V0fSBdCisgICAgICAgIFsgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KKyAgICAgICAgQHZhcntvYmpmaWxlfUBkb3Rze30KK0BlbmQgc21hbGxleGFtcGxlCisKK0Bjb2Rle29iamR1bXB9IGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIG9iamVjdCBmaWxlcy4KK1RoZSBvcHRpb25zIGNvbnRyb2wgd2hhdCBwYXJ0aWN1bGFyIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkuICBUaGlzCitpbmZvcm1hdGlvbiBpcyBtb3N0bHkgdXNlZnVsIHRvIHByb2dyYW1tZXJzIHdobyBhcmUgd29ya2luZyBvbiB0aGUKK2NvbXBpbGF0aW9uIHRvb2xzLCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tZXJzIHdobyBqdXN0IHdhbnQgdGhlaXIKK3Byb2dyYW0gdG8gY29tcGlsZSBhbmQgd29yay4KKworQHZhcntvYmpmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBXaGVuIHlvdQorc3BlY2lmeSBhcmNoaXZlcywgQGNvZGV7b2JqZHVtcH0gc2hvd3MgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGUgbWVtYmVyCitvYmplY3QgZmlsZXMuCisKK1RoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCitlcXVpdmFsZW50LiAgQXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzIEBzYW1wey1sfSBtdXN0IGJlIGdpdmVuLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1hCitAaXRlbXggLS1hcmNoaXZlLWhlYWRlcgorQGNpbmRleCBhcmNoaXZlIGhlYWRlcnMKK0lmIGFueSBvZiB0aGUgQHZhcntvYmpmaWxlfSBmaWxlcyBhcmUgYXJjaGl2ZXMsIGRpc3BsYXkgdGhlIGFyY2hpdmUKK2hlYWRlciBpbmZvcm1hdGlvbiAoaW4gYSBmb3JtYXQgc2ltaWxhciB0byBAc2FtcHtscyAtbH0pLiAgQmVzaWRlcyB0aGUKK2luZm9ybWF0aW9uIHlvdSBjb3VsZCBsaXN0IHdpdGggQHNhbXB7YXIgdHZ9LCBAc2FtcHtvYmpkdW1wIC1hfSBzaG93cwordGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiBlYWNoIGFyY2hpdmUgbWVtYmVyLgorCitAaXRlbSAtLWFkanVzdC12bWE9QHZhcntvZmZzZXR9CitAY2luZGV4IHNlY3Rpb24gYWRkcmVzc2VzIGluIG9iamR1bXAKK0BjaW5kZXggVk1BIGluIG9iamR1bXAKK1doZW4gZHVtcGluZyBpbmZvcm1hdGlvbiwgZmlyc3QgYWRkIEB2YXJ7b2Zmc2V0fSB0byBhbGwgdGhlIHNlY3Rpb24KK2FkZHJlc3Nlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBkbyBub3QgY29ycmVzcG9uZCB0bwordGhlIHN5bWJvbCB0YWJsZSwgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHB1dHRpbmcgc2VjdGlvbnMgYXQgcGFydGljdWxhcgorYWRkcmVzc2VzIHdoZW4gdXNpbmcgYSBmb3JtYXQgd2hpY2ggY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBhZGRyZXNzZXMsCitzdWNoIGFzIGEub3V0LgorCitAaXRlbSAtYiBAdmFye2JmZG5hbWV9CitAaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQorQGNpbmRleCBvYmplY3QgY29kZSBmb3JtYXQKK1NwZWNpZnkgdGhhdCB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIGlzCitAdmFye2JmZG5hbWV9LiAgVGhpcyBvcHRpb24gbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IEB2YXJ7b2JqZHVtcH0gY2FuCithdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuCisKK0ZvciBleGFtcGxlLAorQGV4YW1wbGUKK29iamR1bXAgLWIgb2FzeXMgLW0gdmF4IC1oIGZ1Lm8KK0BlbmQgZXhhbXBsZQorQG5vaW5kZW50CitkaXNwbGF5cyBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyAoQHNhbXB7LWh9KSBvZgorQGZpbGV7ZnUub30sIHdoaWNoIGlzIGV4cGxpY2l0bHkgaWRlbnRpZmllZCAoQHNhbXB7LW19KSBhcyBhIFZBWCBvYmplY3QKK2ZpbGUgaW4gdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBPYXN5cyBjb21waWxlcnMuICBZb3UgY2FuIGxpc3QgdGhlCitmb3JtYXRzIGF2YWlsYWJsZSB3aXRoIHRoZSBAc2FtcHstaX0gb3B0aW9uLgorQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAaXRlbSAtQworQGl0ZW14IC0tZGVtYW5nbGUKK0BjaW5kZXggZGVtYW5nbGluZyBpbiBvYmpkdW1wCitEZWNvZGUgKEBkZm57ZGVtYW5nbGV9KSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzIGludG8gdXNlci1sZXZlbCBuYW1lcy4KK0Jlc2lkZXMgcmVtb3ZpbmcgYW55IGluaXRpYWwgdW5kZXJzY29yZSBwcmVwZW5kZWQgYnkgdGhlIHN5c3RlbSwgdGhpcworbWFrZXMgQysrIGZ1bmN0aW9uIG5hbWVzIHJlYWRhYmxlLiAgQHhyZWZ7YysrZmlsdH0sIGZvciBtb3JlIGluZm9ybWF0aW9uCitvbiBkZW1hbmdsaW5nLgorCitAaXRlbSAtLWRlYnVnZ2luZworRGlzcGxheSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGF0dGVtcHRzIHRvIHBhcnNlIGRlYnVnZ2luZworaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBmaWxlIGFuZCBwcmludCBpdCBvdXQgdXNpbmcgYSBDIGxpa2Ugc3ludGF4LgorT25seSBjZXJ0YWluIHR5cGVzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCisKK0BpdGVtIC1kCitAaXRlbXggLS1kaXNhc3NlbWJsZQorQGNpbmRleCBkaXNhc3NlbWJsaW5nIG9iamVjdCBjb2RlCitAY2luZGV4IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zCitEaXNwbGF5IHRoZSBhc3NlbWJsZXIgbW5lbW9uaWNzIGZvciB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgZnJvbQorQHZhcntvYmpmaWxlfS4gIFRoaXMgb3B0aW9uIG9ubHkgZGlzYXNzZW1ibGVzIHRob3NlIHNlY3Rpb25zIHdoaWNoIGFyZQorZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCisKK0BpdGVtIC1ECitAaXRlbXggLS1kaXNhc3NlbWJsZS1hbGwKK0xpa2UgQHNhbXB7LWR9LCBidXQgZGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIGFsbCBzZWN0aW9ucywgbm90IGp1c3QKK3Rob3NlIGV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgorCitAaXRlbSAtLXByZWZpeC1hZGRyZXNzZXMKK1doZW4gZGlzYXNzZW1ibGluZywgcHJpbnQgdGhlIGNvbXBsZXRlIGFkZHJlc3Mgb24gZWFjaCBsaW5lLiAgVGhpcyBpcwordGhlIG9sZGVyIGRpc2Fzc2VtYmx5IGZvcm1hdC4KKworQGl0ZW0gLS1kaXNhc3NlbWJsZS16ZXJvZXMKK05vcm1hbGx5IHRoZSBkaXNhc3NlbWJseSBvdXRwdXQgd2lsbCBza2lwIGJsb2NrcyBvZiB6ZXJvZXMuICBUaGlzCitvcHRpb24gZGlyZWN0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIGRpc2Fzc2VtYmxlIHRob3NlIGJsb2NrcywganVzdCBsaWtlCithbnkgb3RoZXIgZGF0YS4KKworQGl0ZW0gLUVCCitAaXRlbXggLUVMCitAaXRlbXggLS1lbmRpYW49QHtiaWd8bGl0dGxlQH0KK0BjaW5kZXggZW5kaWFubmVzcworQGNpbmRleCBkaXNhc3NlbWJseSBlbmRpYW5uZXNzCitTcGVjaWZ5IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvYmplY3QgZmlsZXMuICBUaGlzIG9ubHkgYWZmZWN0cworZGlzYXNzZW1ibHkuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIGEgZmlsZSBmb3JtYXQgd2hpY2gKK2RvZXMgbm90IGRlc2NyaWJlIGVuZGlhbm5lc3MgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLgorCitAaXRlbSAtZgorQGl0ZW14IC0tZmlsZS1oZWFkZXIKK0BjaW5kZXggb2JqZWN0IGZpbGUgaGVhZGVyCitEaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3ZlcmFsbCBoZWFkZXIgb2YKK2VhY2ggb2YgdGhlIEB2YXJ7b2JqZmlsZX0gZmlsZXMuCisKK0BpdGVtIC1oCitAaXRlbXggLS1zZWN0aW9uLWhlYWRlcgorQGl0ZW14IC0taGVhZGVyCitAY2luZGV4IHNlY3Rpb24gaGVhZGVycworRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyBvZiB0aGUKK29iamVjdCBmaWxlLgorCitGaWxlIHNlZ21lbnRzIG1heSBiZSByZWxvY2F0ZWQgdG8gbm9uc3RhbmRhcmQgYWRkcmVzc2VzLCBmb3IgZXhhbXBsZSBieQordXNpbmcgdGhlIEBzYW1wey1UdGV4dH0sIEBzYW1wey1UZGF0YX0sIG9yIEBzYW1wey1UYnNzfSBvcHRpb25zIHRvCitAY29kZXtsZH0uICBIb3dldmVyLCBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIHN1Y2ggYXMgYS5vdXQsIGRvIG5vdAorc3RvcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZpbGUgc2VnbWVudHMuICBJbiB0aG9zZSBzaXR1YXRpb25zLAorYWx0aG91Z2ggQGNvZGV7bGR9IHJlbG9jYXRlcyB0aGUgc2VjdGlvbnMgY29ycmVjdGx5LCB1c2luZyBAc2FtcHtvYmpkdW1wCistaH0gdG8gbGlzdCB0aGUgZmlsZSBzZWN0aW9uIGhlYWRlcnMgY2Fubm90IHNob3cgdGhlIGNvcnJlY3QgYWRkcmVzc2VzLgorSW5zdGVhZCwgaXQgc2hvd3MgdGhlIHVzdWFsIGFkZHJlc3Nlcywgd2hpY2ggYXJlIGltcGxpY2l0IGZvciB0aGUKK3RhcmdldC4KKworQGl0ZW0gLS1oZWxwCitQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7b2JqZHVtcH0gYW5kIGV4aXQuCisKK0BpdGVtIC1pCitAaXRlbXggLS1pbmZvCitAY2luZGV4IGFyY2hpdGVjdHVyZXMgYXZhaWxhYmxlCitAY2luZGV4IG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQorRGlzcGxheSBhIGxpc3Qgc2hvd2luZyBhbGwgYXJjaGl0ZWN0dXJlcyBhbmQgb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCitmb3Igc3BlY2lmaWNhdGlvbiB3aXRoIEBzYW1wey1ifSBvciBAc2FtcHstbX0uCisKK0BpdGVtIC1qIEB2YXJ7bmFtZX0KK0BpdGVteCAtLXNlY3Rpb249QHZhcntuYW1lfQorQGNpbmRleCBzZWN0aW9uIGluZm9ybWF0aW9uCitEaXNwbGF5IGluZm9ybWF0aW9uIG9ubHkgZm9yIHNlY3Rpb24gQHZhcntuYW1lfS4KKworQGl0ZW0gLWwKK0BpdGVteCAtLWxpbmUtbnVtYmVycworQGNpbmRleCBzb3VyY2UgZmlsZW5hbWVzIGZvciBvYmplY3QgZmlsZXMKK0xhYmVsIHRoZSBkaXNwbGF5ICh1c2luZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24pIHdpdGggdGhlIGZpbGVuYW1lIGFuZAorc291cmNlIGxpbmUgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgY29kZSBvciByZWxvY3Mgc2hvd24uCitPbmx5IHVzZWZ1bCB3aXRoIEBzYW1wey1kfSwgQHNhbXB7LUR9LCBvciBAc2FtcHstcn0uCisKK0BpdGVtIC1tIEB2YXJ7bWFjaGluZX0KK0BpdGVteCAtLWFyY2hpdGVjdHVyZT1AdmFye21hY2hpbmV9CitAY2luZGV4IGFyY2hpdGVjdHVyZQorQGNpbmRleCBkaXNhc3NlbWJseSBhcmNoaXRlY3R1cmUKK1NwZWNpZnkgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2Ugd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcy4gIFRoaXMKK2NhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyB3aGljaCBkbyBub3QgZGVzY3JpYmUKK2FyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZQorYXJjaGl0ZWN0dXJlcyB3aXRoIHRoZSBAc2FtcHstaX0gb3B0aW9uLgorCitAaXRlbSAtcAorQGl0ZW14IC0tcHJpdmF0ZS1oZWFkZXJzCitQcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgZXhhY3QKK2luZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3Igc29tZQorb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgorCitAaXRlbSAtcgorQGl0ZW14IC0tcmVsb2MKK0BjaW5kZXggcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQorUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBAc2FtcHstZH0gb3IKK0BzYW1wey1EfSwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQorZGlzYXNzZW1ibHkuCisKK0BpdGVtIC1SCitAaXRlbXggLS1keW5hbWljLXJlbG9jCitAY2luZGV4IGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQorUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5CittZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKK2xpYnJhcmllcy4KKworQGl0ZW0gLXMKK0BpdGVteCAtLWZ1bGwtY29udGVudHMKK0BjaW5kZXggc2VjdGlvbnMsIGZ1bGwgY29udGVudHMKK0BjaW5kZXggb2JqZWN0IGZpbGUgc2VjdGlvbnMKK0Rpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KKworQGl0ZW0gLVMKK0BpdGVteCAtLXNvdXJjZQorQGNpbmRleCBzb3VyY2UgZGlzYXNzZW1ibHkKK0BjaW5kZXggZGlzYXNzZW1ibHksIHdpdGggc291cmNlCitEaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCitAc2FtcHstZH0uCisKK0BpdGVtIC0tc2hvdy1yYXctaW5zbgorV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCitpbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgorQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgorCitAaXRlbSAtLW5vLXNob3ctcmF3LWluc24KK1doZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCitUaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4gQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgorCitAaXRlbSAtLXN0YWJzCitAY2luZGV4IHN0YWIKK0BjaW5kZXggLnN0YWIKK0BjaW5kZXggZGVidWcgc3ltYm9scworQGNpbmRleCBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0CitEaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuICBEaXNwbGF5IHRoZQorY29udGVudHMgb2YgdGhlIC5zdGFiIGFuZCAuc3RhYi5pbmRleCBhbmQgLnN0YWIuZXhjbCBzZWN0aW9ucyBmcm9tIGFuCitFTEYgZmlsZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgb24gc3lzdGVtcyAoc3VjaCBhcyBTb2xhcmlzIDIuMCkgaW4gd2hpY2gKK0Bjb2Rley5zdGFifSBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlIGNhcnJpZWQgaW4gYW4gRUxGCitzZWN0aW9uLiAgSW4gbW9zdCBvdGhlciBmaWxlIGZvcm1hdHMsIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUgZW50cmllcyBhcmUKK2ludGVybGVhdmVkIHdpdGggbGlua2FnZSBzeW1ib2xzLCBhbmQgYXJlIHZpc2libGUgaW4gdGhlIEBzYW1wey0tc3ltc30KK291dHB1dC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN0YWJzIHN5bWJvbHMsIHNlZSBAcmVme1RvcCxTdGFicyxTdGFicworT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlIGBgc3RhYnMnJyBkZWJ1ZyBmb3JtYXR9LgorCitAaXRlbSAtLXN0YXJ0LWFkZHJlc3M9QHZhcnthZGRyZXNzfQorQGNpbmRleCBzdGFydC1hZGRyZXNzCitTdGFydCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKK29mIHRoZSBAY29kZXstZH0sIEBjb2Rley1yfSBhbmQgQGNvZGV7LXN9IG9wdGlvbnMuCisKK0BpdGVtIC0tc3RvcC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30KK0BjaW5kZXggc3RvcC1hZGRyZXNzCitTdG9wIGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAorb2YgdGhlIEBjb2Rley1kfSwgQGNvZGV7LXJ9IGFuZCBAY29kZXstc30gb3B0aW9ucy4KKworQGl0ZW0gLXQKK0BpdGVteCAtLXN5bXMKK0BjaW5kZXggc3ltYm9sIHRhYmxlIGVudHJpZXMsIHByaW50aW5nCitQcmludCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuCitUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBAc2FtcHtubX0gcHJvZ3JhbS4KKworQGl0ZW0gLVQKK0BpdGVteCAtLWR5bmFtaWMtc3ltcworQGNpbmRleCBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBwcmludGluZworUHJpbnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG9ubHkKK21lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAorbGlicmFyaWVzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgQHNhbXB7bm19Citwcm9ncmFtIHdoZW4gZ2l2ZW4gdGhlIEBzYW1wey1EfSAoQHNhbXB7LS1keW5hbWljfSkgb3B0aW9uLgorCitAaXRlbSAtLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtvYmpkdW1wfSBhbmQgZXhpdC4KKworQGl0ZW0gLXgKK0BpdGVteCAtLWFsbC1oZWFkZXIKK0BjaW5kZXggYWxsIGhlYWRlciBpbmZvcm1hdGlvbiwgb2JqZWN0IGZpbGUKK0BjaW5kZXggaGVhZGVyIGluZm9ybWF0aW9uLCBhbGwKK0Rpc3BsYXkgYWxsIGF2YWlsYWJsZSBoZWFkZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgc3ltYm9sIHRhYmxlIGFuZAorcmVsb2NhdGlvbiBlbnRyaWVzLiAgVXNpbmcgQHNhbXB7LXh9IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbGwgb2YKK0BzYW1wey1hIC1mIC1oIC1yIC10fS4KKworQGl0ZW0gLXcKK0BpdGVteCAtLXdpZGUKK0BjaW5kZXggd2lkZSBvdXRwdXQsIHByaW50aW5nCitGb3JtYXQgc29tZSBsaW5lcyBmb3Igb3V0cHV0IGRldmljZXMgdGhhdCBoYXZlIG1vcmUgdGhhbiA4MCBjb2x1bW5zLgorQGVuZCB0YWJsZQorCitAbm9kZSByYW5saWIKK0BjaGFwdGVyIHJhbmxpYgorCitAa2luZGV4IHJhbmxpYgorQGNpbmRleCBhcmNoaXZlIGNvbnRlbnRzCitAY2luZGV4IHN5bWJvbCBpbmRleAorCitAc21hbGxleGFtcGxlCityYW5saWIgWy12Vl0gQHZhcnthcmNoaXZlfQorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNvZGV7cmFubGlifSBnZW5lcmF0ZXMgYW4gaW5kZXggdG8gdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgYW5kCitzdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCittZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKKworWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleC4KKworQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnkgYW5kCithbGxvd3Mgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgdG8gY2FsbCBlYWNoIG90aGVyIHdpdGhvdXQgcmVnYXJkIHRvCit0aGVpciBwbGFjZW1lbnQgaW4gdGhlIGFyY2hpdmUuCisKK1RoZSBAc2N7Z251fSBAY29kZXtyYW5saWJ9IHByb2dyYW0gaXMgYW5vdGhlciBmb3JtIG9mIEBzY3tnbnV9IEBjb2Rle2FyfTsgcnVubmluZworQGNvZGV7cmFubGlifSBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8gZXhlY3V0aW5nIEBzYW1we2FyIC1zfS4KK0B4cmVme2FyfS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSAtdgorQGl0ZW14IC1WCitTaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtyYW5saWJ9LgorQGVuZCB0YWJsZQorCitAbm9kZSBzaXplCitAY2hhcHRlciBzaXplCisKK0BraW5kZXggc2l6ZQorQGNpbmRleCBzZWN0aW9uIHNpemVzCisKK0BzbWFsbGV4YW1wbGUKK3NpemUgWyAtQSB8IC1CIHwgLS1mb3JtYXQ9QHZhcntjb21wYXRpYmlsaXR5fSBdCisgICAgIFsgLS1oZWxwIF0gIFsgLWQgfCAtbyB8IC14IHwgLS1yYWRpeD1AdmFye251bWJlcn0gXQorICAgICBbIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXSAgWyAtViB8IC0tdmVyc2lvbiBdICAKKyAgICAgWyBAdmFye29iamZpbGV9QGRvdHN7fSBdCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgQHNje2dudX0gQGNvZGV7c2l6ZX0gdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplcy0tLWFuZCB0aGUgdG90YWwKK3NpemUtLS1mb3IgZWFjaCBvZiB0aGUgb2JqZWN0IG9yIGFyY2hpdmUgZmlsZXMgQHZhcntvYmpmaWxlfSBpbiBpdHMKK2FyZ3VtZW50IGxpc3QuICBCeSBkZWZhdWx0LCBvbmUgbGluZSBvZiBvdXRwdXQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoCitvYmplY3QgZmlsZSBvciBlYWNoIG1vZHVsZSBpbiBhbiBhcmNoaXZlLgorCitAdmFye29iamZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4KK0lmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlIGZpbGUgQGNvZGV7YS5vdXR9IHdpbGwgYmUgdXNlZC4KKworVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAtQQorQGl0ZW14IC1CCitAaXRlbXggLS1mb3JtYXQ9QHZhcntjb21wYXRpYmlsaXR5fQorQGNpbmRleCBAY29kZXtzaXplfSBkaXNwbGF5IGZvcm1hdAorVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdGhlIG91dHB1dCBmcm9tIEBzY3tnbnV9CitAY29kZXtzaXplfSByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgQGNvZGV7c2l6ZX0gKHVzaW5nIEBzYW1wey1BfSwKK29yIEBzYW1wey0tZm9ybWF0PXN5c3Z9KSwgb3IgQmVya2VsZXkgQGNvZGV7c2l6ZX0gKHVzaW5nIEBzYW1wey1CfSwgb3IKK0BzYW1wey0tZm9ybWF0PWJlcmtlbGV5fSkuICBUaGUgZGVmYXVsdCBpcyB0aGUgb25lLWxpbmUgZm9ybWF0IHNpbWlsYXIgdG8KK0JlcmtlbGV5J3MuICAKK0BjIEJvbnVzIGZvciBkb2Mtc291cmNlIHJlYWRlcnM6IHlvdSBjYW4gYWxzbyBzYXkgLS1mb3JtYXQ9c3RyYW5nZSAob3IKK0BjIGFueXRoaW5nIGVsc2UgdGhhdCBzdGFydHMgd2l0aCAncycpIGZvciBzeXN2LCBhbmQgLS1mb3JtYXQ9Ym9yaW5nIChvcgorQGMgYW55dGhpbmcgZWxzZSB0aGF0IHN0YXJ0cyB3aXRoICdiJykgZm9yIEJlcmtlbGV5LgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIEJlcmtlbGV5IChkZWZhdWx0KSBmb3JtYXQgb2Ygb3V0cHV0IGZyb20KK0Bjb2Rle3NpemV9OiAKK0BzbWFsbGV4YW1wbGUKK3NpemUgLS1mb3JtYXQ9QmVya2VsZXkgcmFubGliIHNpemUKK3RleHQgICAgZGF0YSAgICBic3MgICAgIGRlYyAgICAgaGV4ICAgICBmaWxlbmFtZQorMjk0ODgwICA4MTkyMCAgIDExNTkyICAgMzg4MzkyICA1ZWQyOCAgIHJhbmxpYgorMjk0ODgwICA4MTkyMCAgIDExODg4ICAgMzg4Njg4ICA1ZWU1MCAgIHNpemUKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorVGhpcyBpcyB0aGUgc2FtZSBkYXRhLCBidXQgZGlzcGxheWVkIGNsb3NlciB0byBTeXN0ZW0gViBjb252ZW50aW9uczoKKworQHNtYWxsZXhhbXBsZQorc2l6ZSAtLWZvcm1hdD1TeXNWIHJhbmxpYiBzaXplCityYW5saWIgIDoKK3NlY3Rpb24gICAgICAgICBzaXplICAgICAgICAgYWRkcgorLnRleHQgICAgICAgICAyOTQ4ODAgICAgICAgICA4MTkyICAgICAgIAorLmRhdGEgICAgICAgICAgODE5MjAgICAgICAgMzAzMTA0ICAgICAgIAorLmJzcyAgICAgICAgICAgMTE1OTIgICAgICAgMzg1MDI0ICAgICAgIAorVG90YWwgICAgICAgICAzODgzOTIgICAgCisKKworc2l6ZSAgOgorc2VjdGlvbiAgICAgICAgIHNpemUgICAgICAgICBhZGRyCisudGV4dCAgICAgICAgIDI5NDg4MCAgICAgICAgIDgxOTIgICAgICAgCisuZGF0YSAgICAgICAgICA4MTkyMCAgICAgICAzMDMxMDQgICAgICAgCisuYnNzICAgICAgICAgICAxMTg4OCAgICAgICAzODUwMjQgICAgICAgCitUb3RhbCAgICAgICAgIDM4ODY4OCAgICAKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIC0taGVscAorU2hvdyBhIHN1bW1hcnkgb2YgYWNjZXB0YWJsZSBhcmd1bWVudHMgYW5kIG9wdGlvbnMuCisKK0BpdGVtIC1kCitAaXRlbXggLW8KK0BpdGVteCAteAorQGl0ZW14IC0tcmFkaXg9QHZhcntudW1iZXJ9CitAY2luZGV4IEBjb2Rle3NpemV9IG51bWJlciBmb3JtYXQKK0BjaW5kZXggcmFkaXggZm9yIHNlY3Rpb24gc2l6ZXMKK1VzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCitzZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKEBzYW1wey1kfSwgb3IgQHNhbXB7LS1yYWRpeD0xMH0pOyBvY3RhbAorKEBzYW1wey1vfSwgb3IgQHNhbXB7LS1yYWRpeD04fSk7IG9yIGhleGFkZWNpbWFsIChAc2FtcHsteH0sIG9yCitAc2FtcHstLXJhZGl4PTE2fSkuICBJbiBAc2FtcHstLXJhZGl4PUB2YXJ7bnVtYmVyfX0sIG9ubHkgdGhlIHRocmVlCit2YWx1ZXMgKDgsIDEwLCAxNikgYXJlIHN1cHBvcnRlZC4gIFRoZSB0b3RhbCBzaXplIGlzIGFsd2F5cyBnaXZlbiBpbiB0d28KK3JhZGljZXM7IGRlY2ltYWwgYW5kIGhleGFkZWNpbWFsIGZvciBAc2FtcHstZH0gb3IgQHNhbXB7LXh9IG91dHB1dCwgb3IKK29jdGFsIGFuZCBoZXhhZGVjaW1hbCBpZiB5b3UncmUgdXNpbmcgQHNhbXB7LW99LgorCitAaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9CitAY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAorU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIEB2YXJ7b2JqZmlsZX0gaXMKK0B2YXJ7YmZkbmFtZX0uICBUaGlzIG9wdGlvbiBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgQGNvZGV7c2l6ZX0gY2FuCithdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuCitAeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0BpdGVtIC1WCitAaXRlbXggLS12ZXJzaW9uCitEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtzaXplfS4KK0BlbmQgdGFibGUKKworQG5vZGUgc3RyaW5ncworQGNoYXB0ZXIgc3RyaW5ncworQGtpbmRleCBzdHJpbmdzCitAY2luZGV4IGxpc3RpbmdzIHN0cmluZ3MKK0BjaW5kZXggcHJpbnRpbmcgc3RyaW5ncworQGNpbmRleCBzdHJpbmdzLCBwcmludGluZworCitAc21hbGxleGFtcGxlCitzdHJpbmdzIFstYWZvdl0gWy1AdmFye21pbi1sZW59XSBbLW4gQHZhcnttaW4tbGVufV0gWy10IEB2YXJ7cmFkaXh9XSBbLV0KKyAgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPUB2YXJ7bWluLWxlbn1dCisgICAgICAgIFstLXJhZGl4PUB2YXJ7cmFkaXh9XSBbLS10YXJnZXQ9QHZhcntiZmRuYW1lfV0KKyAgICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl0gQHZhcntmaWxlfUBkb3Rze30KK0BlbmQgc21hbGxleGFtcGxlCisKK0ZvciBlYWNoIEB2YXJ7ZmlsZX0gZ2l2ZW4sIEBzY3tnbnV9IEBjb2Rle3N0cmluZ3N9IHByaW50cyB0aGUgcHJpbnRhYmxlCitjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyBsb25nIChvciB0aGUgbnVtYmVyCitnaXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlIGZvbGxvd2VkIGJ5IGFuIHVucHJpbnRhYmxlCitjaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSBpbml0aWFsaXplZAorYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvciBvdGhlciB0eXBlcyBvZiBmaWxlcywgaXQgcHJpbnRzCit0aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgorCitAY29kZXtzdHJpbmdzfSBpcyBtYWlubHkgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudHMgb2Ygbm9uLXRleHQKK2ZpbGVzLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1hCitAaXRlbXggLS1hbGwKK0BpdGVteCAtCitEbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKK3NjYW4gdGhlIHdob2xlIGZpbGVzLgorCitAaXRlbSAtZgorQGl0ZW14IC0tcHJpbnQtZmlsZS1uYW1lCitQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCisKK0BpdGVtIC0taGVscAorUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwcm9ncmFtIHVzYWdlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCisKK0BpdGVtIC1AdmFye21pbi1sZW59CitAaXRlbXggLW4gQHZhcnttaW4tbGVufQorQGl0ZW14IC0tYnl0ZXM9QHZhcnttaW4tbGVufQorUHJpbnQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYXQgbGVhc3QgQHZhcnttaW4tbGVufSBjaGFyYWN0ZXJzCitsb25nLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQuCisKK0BpdGVtIC1vCitMaWtlIEBzYW1wey10IG99LiAgU29tZSBvdGhlciB2ZXJzaW9ucyBvZiBAY29kZXtzdHJpbmdzfSBoYXZlIEBzYW1wey1vfQorYWN0IGxpa2UgQHNhbXB7LXQgZH0gaW5zdGVhZC4gIFNpbmNlIHdlIGNhbiBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGgKK3dheXMsIHdlIHNpbXBseSBjaG9zZSBvbmUuCisKK0BpdGVtIC10IEB2YXJ7cmFkaXh9CitAaXRlbXggLS1yYWRpeD1AdmFye3JhZGl4fQorUHJpbnQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiAgVGhlIHNpbmdsZQorY2hhcmFjdGVyIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggb2YgdGhlIG9mZnNldC0tLUBzYW1we299IGZvcgorb2N0YWwsIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbCwgb3IgQHNhbXB7ZH0gZm9yIGRlY2ltYWwuCisKK0BpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KK0BjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0CitTcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCitAeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0BpdGVtIC12CitAaXRlbXggLS12ZXJzaW9uCitQcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlciBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorQGVuZCB0YWJsZQorCitAbm9kZSBzdHJpcAorQGNoYXB0ZXIgc3RyaXAKKworQGtpbmRleCBzdHJpcAorQGNpbmRleCByZW1vdmluZyBzeW1ib2xzCitAY2luZGV4IGRpc2NhcmRpbmcgc3ltYm9scworQGNpbmRleCBzeW1ib2xzLCBkaXNjYXJkaW5nCisKK0BzbWFsbGV4YW1wbGUKK3N0cmlwIFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQorICAgICAgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCisgICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCisgICAgICBbIC1zIHwgLS1zdHJpcC1hbGwgXSBbIC1TIHwgLWcgfCAtLXN0cmlwLWRlYnVnIF0KKyAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCisgICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KKyAgICAgIFsgLXggfCAtLWRpc2NhcmQtYWxsIF0gWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQorICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQorICAgICAgWyAtbyBAdmFye2ZpbGV9IF0gWyAtcCB8IC0tcHJlc2VydmUtZGF0ZXMgXQorICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdICBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KKyAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9CitAZW5kIHNtYWxsZXhhbXBsZQorCitAc2N7Z251fSBAY29kZXtzdHJpcH0gZGlzY2FyZHMgYWxsIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKK0B2YXJ7b2JqZmlsZX0uICBUaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgbWF5IGluY2x1ZGUgYXJjaGl2ZXMuCitBdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUgbXVzdCBiZSBnaXZlbi4KKworQGNvZGV7c3RyaXB9IG1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCityYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLUYgQHZhcntiZmRuYW1lfQorQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KK1RyZWF0IHRoZSBvcmlnaW5hbCBAdmFye29iamZpbGV9IGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKK2NvZGUgZm9ybWF0IEB2YXJ7YmZkbmFtZX0sIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KK0B4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLS1oZWxwCitTaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtzdHJpcH0gYW5kIGV4aXQuCisKK0BpdGVtIC1JIEB2YXJ7YmZkbmFtZX0JCitAaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQorVHJlYXQgdGhlIG9yaWdpbmFsIEB2YXJ7b2JqZmlsZX0gYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAorY29kZSBmb3JtYXQgQHZhcntiZmRuYW1lfS4KK0B4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQorQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9CitSZXBsYWNlIEB2YXJ7b2JqZmlsZX0gd2l0aCBhIGZpbGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgQHZhcntiZmRuYW1lfS4KK0B4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLVIgQHZhcntzZWN0aW9ubmFtZX0KK0BpdGVteCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9CitSZW1vdmUgYW55IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gZnJvbSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzCitvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCitpbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgorCitAaXRlbSAtcworQGl0ZW14IC0tc3RyaXAtYWxsCitSZW1vdmUgYWxsIHN5bWJvbHMuCisKK0BpdGVtIC1nCitAaXRlbXggLVMKK0BpdGVteCAtLXN0cmlwLWRlYnVnCitSZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KKworQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAorUmVtb3ZlIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KKworQGl0ZW0gLUsgQHZhcntzeW1ib2xuYW1lfQorQGl0ZW14IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQorS2VlcCBvbmx5IHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5CitiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KKworQGl0ZW0gLU4gQHZhcntzeW1ib2xuYW1lfQorQGl0ZW14IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KK1JlbW92ZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24gbWF5IGJlCitnaXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIHN0cmlwIG9wdGlvbnMgb3RoZXIgdGhhbgorQGNvZGV7LUt9LgorCitAaXRlbSAtbyBAdmFye2ZpbGV9CitQdXQgdGhlIHN0cmlwcGVkIG91dHB1dCBpbiBAdmFye2ZpbGV9LCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlCitleGlzdGluZyBmaWxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQsIG9ubHkgb25lIEB2YXJ7b2JqZmlsZX0KK2FyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQuCisKK0BpdGVtIC1wCitAaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcworUHJlc2VydmUgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBmaWxlLgorCitAaXRlbSAteAorQGl0ZW14IC0tZGlzY2FyZC1hbGwKK1JlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCisKK0BpdGVtIC1YCitAaXRlbXggLS1kaXNjYXJkLWxvY2FscworUmVtb3ZlIGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgorKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCisKK0BpdGVtIC1WCitAaXRlbXggLS12ZXJzaW9uCitTaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7c3RyaXB9LgorCitAaXRlbSAtdgorQGl0ZW14IC0tdmVyYm9zZQorVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCithcmNoaXZlcywgQHNhbXB7c3RyaXAgLXZ9IGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgorQGVuZCB0YWJsZQorCitAbm9kZSBjKytmaWx0CitAY2hhcHRlciBjKytmaWx0CisKK0BraW5kZXggYysrZmlsdAorQGNpbmRleCBkZW1hbmdsaW5nIEMrKyBzeW1ib2xzCisKK0BzbWFsbGV4YW1wbGUKK2MrK2ZpbHQgWyAtXyB8IC0tc3RyaXAtdW5kZXJzY29yZXMgXQorICAgICAgICBbIC1qIHwgLS1qYXZhIF0KKwlbIC1uIHwgLS1uby1zdHJpcC11bmRlcnNjb3JlcyBdCisgICAgICAgIFsgLXMgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KKyAgICAgICAgWyAtLWhlbHAgXSAgWyAtLXZlcnNpb24gXSAgWyBAdmFye3N5bWJvbH1AZG90c3t9IF0KK0BlbmQgc21hbGxleGFtcGxlCisKK1RoZSBDKysgYW5kIEphdmEgbGFuZ3VhZ2VzIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucwordGhhdCB5b3UgY2FuIHdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2gKK3Rha2VzIHBhcmFtZXRlcnMgb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgYW5kIEphdmEgZnVuY3Rpb24gbmFtZXMKK2FyZSBlbmNvZGVkIGludG8gYSBsb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcworQGRmbnttYW5nbGluZ30pLiBUaGUgQGNvZGV7YysrZmlsdH0gcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0CitkZWNvZGVzIChAZGZue2RlbWFuZ2xlc30pIGxvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdAordGhlIGxpbmtlciBjYW4ga2VlcCB0aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgorCitFdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAorZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKK2xhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAorbmFtZSBpbiB0aGUgb3V0cHV0LgorCitZb3UgY2FuIHVzZSBAY29kZXtjKytmaWx0fSB0byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHM6CisKK0BleGFtcGxlCitjKytmaWx0IEB2YXJ7c3ltYm9sfQorQGVuZCBleGFtcGxlCisKK0lmIG5vIEB2YXJ7c3ltYm9sfSBhcmd1bWVudHMgYXJlIGdpdmVuLCBAY29kZXtjKytmaWx0fSByZWFkcyBzeW1ib2wKK25hbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgdGhlIGRlbWFuZ2xlZCBuYW1lcyB0byB0aGUKK3N0YW5kYXJkIG91dHB1dC4gIEFsbCByZXN1bHRzIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLV8KK0BpdGVteCAtLXN0cmlwLXVuZGVyc2NvcmVzCitPbiBzb21lIHN5c3RlbXMsIGJvdGggdGhlIEMgYW5kIEMrKyBjb21waWxlcnMgcHV0IGFuIHVuZGVyc2NvcmUgaW4gZnJvbnQKK29mIGV2ZXJ5IG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIEMgbmFtZSBAY29kZXtmb299IGdldHMgdGhlIGxvdy1sZXZlbAorbmFtZSBAY29kZXtfZm9vfS4gIFRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIGluaXRpYWwgdW5kZXJzY29yZS4gIFdoZXRoZXIKK0Bjb2Rle2MrK2ZpbHR9IHJlbW92ZXMgdGhlIHVuZGVyc2NvcmUgYnkgZGVmYXVsdCBpcyB0YXJnZXQgZGVwZW5kZW50LgorCitAaXRlbSAtagorQGl0ZW14IC0tamF2YQorUHJpbnRzIGRlbWFuZ2xlZCBuYW1lcyB1c2luZyBKYXZhIHN5bnRheC4gIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBDKysKK3N5bnRheC4KKworQGl0ZW0gLW4KK0BpdGVteCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzCitEbyBub3QgcmVtb3ZlIHRoZSBpbml0aWFsIHVuZGVyc2NvcmUuCisKK0BpdGVtIC1zIEB2YXJ7Zm9ybWF0fQorQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQorQHNje2dudX0gQGNvZGV7bm19IGNhbiBkZWNvZGUgdGhyZWUgZGlmZmVyZW50IG1ldGhvZHMgb2YgbWFuZ2xpbmcsIHVzZWQgYnkKK2RpZmZlcmVudCBDKysgY29tcGlsZXJzLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgb3B0aW9uIHNlbGVjdHMgd2hpY2gKK21ldGhvZCBpdCB1c2VzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGdudQordGhlIG9uZSB1c2VkIGJ5IHRoZSBAc2N7Z251fSBjb21waWxlciAodGhlIGRlZmF1bHQgbWV0aG9kKQorQGl0ZW0gbHVjaWQKK3RoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIKK0BpdGVtIGFybQordGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIEMrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbAorQGl0ZW0gaHAKK3RoZSBvbmUgdXNlZCBieSB0aGUgSFAgY29tcGlsZXIKK0BpdGVtIGVkZwordGhlIG9uZSB1c2VkIGJ5IHRoZSBFREcgY29tcGlsZXIKK0BlbmQgdGFibGUKKworQGl0ZW0gLS1oZWxwCitQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7YysrZmlsdH0gYW5kIGV4aXQuCisKK0BpdGVtIC0tdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle2MrK2ZpbHR9IGFuZCBleGl0LgorQGVuZCB0YWJsZQorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gQGNvZGV7YysrZmlsdH0gaXMgYSBuZXcgdXRpbGl0eSwgYW5kIHRoZSBkZXRhaWxzIG9mIGl0cwordXNlciBpbnRlcmZhY2UgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIEluIHBhcnRpY3VsYXIsCithIGNvbW1hbmQtbGluZSBvcHRpb24gbWF5IGJlIHJlcXVpcmVkIGluIHRoZSB0aGUgZnV0dXJlIHRvIGRlY29kZSBhIG5hbWUKK3Bhc3NlZCBhcyBhbiBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lOyBpbiBvdGhlciB3b3JkcywgCisKK0BleGFtcGxlCitjKytmaWx0IEB2YXJ7c3ltYm9sfQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorbWF5IGluIGEgZnV0dXJlIHJlbGVhc2UgYmVjb21lCisKK0BleGFtcGxlCitjKytmaWx0IEB2YXJ7b3B0aW9ufSBAdmFye3N5bWJvbH0KK0BlbmQgZXhhbXBsZQorQGVuZCBxdW90YXRpb24KKworQG5vZGUgYWRkcjJsaW5lCitAY2hhcHRlciBhZGRyMmxpbmUKKworQGtpbmRleCBhZGRyMmxpbmUKK0BjaW5kZXggYWRkcmVzcyB0byBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisKK0BzbWFsbGV4YW1wbGUKK2FkZHIybGluZSBbIC1iIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0KKyAgICAgICAgICBbIC1DIHwgLS1kZW1hbmdsZSBdCisgICAgICAgICAgWyAtZSBAdmFye2ZpbGVuYW1lfSB8IC0tZXhlPUB2YXJ7ZmlsZW5hbWV9IF0KKyAgICAgICAgICBbIC1mIHwgLS1mdW5jdGlvbnMgXSBbIC1zIHwgLS1iYXNlbmFtZSBdCisgICAgICAgICAgWyAtSCB8IC0taGVscCBdIFsgLVYgfCAtLXZlcnNpb24gXQorICAgICAgICAgIFsgYWRkciBhZGRyIC4uLiBdCitAZW5kIHNtYWxsZXhhbXBsZQorCitAY29kZXthZGRyMmxpbmV9IHRyYW5zbGF0ZXMgcHJvZ3JhbSBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lCitudW1iZXJzLiAgR2l2ZW4gYW4gYWRkcmVzcyBhbmQgYW4gZXhlY3V0YWJsZSwgaXQgdXNlcyB0aGUgZGVidWdnaW5nCitpbmZvcm1hdGlvbiBpbiB0aGUgZXhlY3V0YWJsZSB0byBmaWd1cmUgb3V0IHdoaWNoIGZpbGUgbmFtZSBhbmQgbGluZQorbnVtYmVyIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhZGRyZXNzLgorCitUaGUgZXhlY3V0YWJsZSB0byB1c2UgaXMgc3BlY2lmaWVkIHdpdGggdGhlIEBjb2Rley1lfSBvcHRpb24uICBUaGUKK2RlZmF1bHQgaXMgQGZpbGV7YS5vdXR9LgorCitAY29kZXthZGRyMmxpbmV9IGhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgorCitJbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCithbmQgQGNvZGV7YWRkcjJsaW5lfSBkaXNwbGF5cyB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaAorYWRkcmVzcy4KKworSW4gdGhlIHNlY29uZCwgQGNvZGV7YWRkcjJsaW5lfSByZWFkcyBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbQorc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2gKK2FkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcyBtb2RlLCBAY29kZXthZGRyMmxpbmV9IG1heSBiZSB1c2VkCitpbiBhIHBpcGUgdG8gY29udmVydCBkeW5hbWljYWxseSBjaG9zZW4gYWRkcmVzc2VzLgorCitUaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgaXMgQHNhbXB7RklMRU5BTUU6TElORU5PfS4gIFRoZSBmaWxlIG5hbWUgYW5kCitsaW5lIG51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCitAY29kZXstZn0gb3B0aW9uIGlzIHVzZWQsIHRoZW4gZWFjaCBAc2FtcHtGSUxFTkFNRTpMSU5FTk99IGxpbmUgaXMKK3ByZWNlZGVkIGJ5IGEgQHNhbXB7RlVOQ1RJT05OQU1FfSBsaW5lIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorY29udGFpbmluZyB0aGUgYWRkcmVzcy4KKworSWYgdGhlIGZpbGUgbmFtZSBvciBmdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwKK0Bjb2Rle2FkZHIybGluZX0gd2lsbCBwcmludCB0d28gcXVlc3Rpb24gbWFya3MgaW4gdGhlaXIgcGxhY2UuICBJZiB0aGUKK2xpbmUgbnVtYmVyIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwgQGNvZGV7YWRkcjJsaW5lfSB3aWxsIHByaW50IDAuCisKK1RoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCitlcXVpdmFsZW50LgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1iIEB2YXJ7YmZkbmFtZX0KK0BpdGVteCAtLXRhcmdldD1AdmFye2JmZG5hbWV9CitAY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAorU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgaXMKK0B2YXJ7YmZkbmFtZX0uCisKK0BpdGVtIC1DCitAaXRlbXggLS1kZW1hbmdsZQorQGNpbmRleCBkZW1hbmdsaW5nIGluIG9iamR1bXAKK0RlY29kZSAoQGRmbntkZW1hbmdsZX0pIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgorQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCittYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuICBAeHJlZntjKytmaWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24KK29uIGRlbWFuZ2xpbmcuCisKK0BpdGVtIC1lIEB2YXJ7ZmlsZW5hbWV9CitAaXRlbXggLS1leGU9QHZhcntmaWxlbmFtZX0KK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZm9yIHdoaWNoIGFkZHJlc3NlcyBzaG91bGQgYmUKK3RyYW5zbGF0ZWQuICBUaGUgZGVmYXVsdCBmaWxlIGlzIEBmaWxle2Eub3V0fS4KKworQGl0ZW0gLWYKK0BpdGVteCAtLWZ1bmN0aW9ucworRGlzcGxheSBmdW5jdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgorCitAaXRlbSAtcworQGl0ZW14IC0tYmFzZW5hbWVzCitEaXNwbGF5IG9ubHkgdGhlIGJhc2Ugb2YgZWFjaCBmaWxlIG5hbWUuCitAZW5kIHRhYmxlCisKK0Bub2RlIG5sbWNvbnYKK0BjaGFwdGVyIG5sbWNvbnYKKworQGNvZGV7bmxtY29udn0gY29udmVydHMgYSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZQorTG9hZGFibGUgTW9kdWxlLgorCitAaWdub3JlCitAY29kZXtubG1jb252fSBjdXJyZW50bHkgd29ya3Mgd2l0aCBAc2FtcHtpMzg2fSBvYmplY3QKK2ZpbGVzIGluIEBjb2Rle2NvZmZ9LCBAc2N7ZWxmfSwgb3IgQGNvZGV7YS5vdXR9IGZvcm1hdCwgYW5kIEBzY3tTUEFSQ30KK29iamVjdCBmaWxlcyBpbiBAc2N7ZWxmfSwgb3IgQGNvZGV7YS5vdXR9IGZvcm1hdEBmb290bm90ZXsKK0Bjb2Rle25sbWNvbnZ9IHNob3VsZCB3b3JrIHdpdGggYW55IEBzYW1we2kzODZ9IG9yIEBzY3tzcGFyY30gb2JqZWN0Citmb3JtYXQgaW4gdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4gIEl0IGhhcyBvbmx5IGJlZW4gdGVzdGVkCit3aXRoIHRoZSBhYm92ZSBmb3JtYXRzLn0uCitAZW5kIGlnbm9yZQorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gQGNvZGV7bmxtY29udn0gaXMgbm90IGFsd2F5cyBidWlsdCBhcyBwYXJ0IG9mIHRoZSBiaW5hcnkKK3V0aWxpdGllcywgc2luY2UgaXQgaXMgb25seSB1c2VmdWwgZm9yIE5MTSB0YXJnZXRzLgorQGVuZCBxdW90YXRpb24KKworQHNtYWxsZXhhbXBsZQorbmxtY29udiBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KKyAgICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQorICAgICAgICBbIC1UIEB2YXJ7aGVhZGVyZmlsZX0gfCAtLWhlYWRlci1maWxlPUB2YXJ7aGVhZGVyZmlsZX0gXQorICAgICAgICBbIC1kIHwgLS1kZWJ1Z10gIFsgLWwgQHZhcntsaW5rZXJ9IHwgLS1saW5rZXI9QHZhcntsaW5rZXJ9IF0KKyAgICAgICAgWyAtaCB8IC0taGVscCBdICBbIC1WIHwgLS12ZXJzaW9uIF0KKyAgICAgICAgQHZhcntpbmZpbGV9IEB2YXJ7b3V0ZmlsZX0KK0BlbmQgc21hbGxleGFtcGxlCisKK0Bjb2Rle25sbWNvbnZ9IGNvbnZlcnRzIHRoZSByZWxvY2F0YWJsZSBAc2FtcHtpMzg2fSBvYmplY3QgZmlsZQorQHZhcntpbmZpbGV9IGludG8gdGhlIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlIEB2YXJ7b3V0ZmlsZX0sIG9wdGlvbmFsbHkKK3JlYWRpbmcgQHZhcntoZWFkZXJmaWxlfSBmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMKK29uIHdyaXRpbmcgdGhlIE5MTSBjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZSB0aGUKK0BzYW1we2xpbmtlcnN9IHNlY3Rpb24sIEBzYW1we05MTUxJTkt9IGluIHBhcnRpY3VsYXIsIG9mIHRoZSBAY2l0ZXtOTE0KK0RldmVsb3BtZW50IGFuZCBUb29scyBPdmVydmlld30sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIE5MTSBTb2Z0d2FyZQorRGV2ZWxvcGVyJ3MgS2l0IChgYE5MTSBTREsnJyksIGF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgorQGNvZGV7bmxtY29udn0gdXNlcyB0aGUgQHNje2dudX0gQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5IHRvIHJlYWQKK0B2YXJ7aW5maWxlfTsgc2VlIEByZWZ7QkZELCxCRkQsbGQuaW5mbyxVc2luZyBMRH0sIGZvcgorbW9yZSBpbmZvcm1hdGlvbi4KKworQGNvZGV7bmxtY29udn0gY2FuIHBlcmZvcm0gYSBsaW5rIHN0ZXAuICBJbiBvdGhlciB3b3JkcywgeW91IGNhbiBsaXN0Cittb3JlIHRoYW4gb25lIG9iamVjdCBmaWxlIGZvciBpbnB1dCBpZiB5b3UgbGlzdCB0aGVtIGluIHRoZSBkZWZpbml0aW9ucworZmlsZSAocmF0aGVyIHRoYW4gc2ltcGx5IHNwZWNpZnlpbmcgb25lIGlucHV0IGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSkuCitJbiB0aGlzIGNhc2UsIEBjb2Rle25sbWNvbnZ9IGNhbGxzIHRoZSBsaW5rZXIgZm9yIHlvdS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSAtSSBAdmFye2JmZG5hbWV9CitAaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQorT2JqZWN0IGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4gIEBjb2Rle25sbWNvbnZ9IGNhbiB1c3VhbGx5IGRldGVybWluZQordGhlIGZvcm1hdCBvZiBhIGdpdmVuIGZpbGUgKHNvIG5vIGRlZmF1bHQgaXMgbmVjZXNzYXJ5KS4KK0B4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQorQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9CitPYmplY3QgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gIEBjb2Rle25sbWNvbnZ9IGluZmVycyB0aGUgb3V0cHV0Citmb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGZvcm1hdCwgZS5nLiBmb3IgYSBAc2FtcHtpMzg2fSBpbnB1dCBmaWxlIHRoZQorb3V0cHV0IGZvcm1hdCBpcyBAc2FtcHtubG0zMi1pMzg2fS4KK0B4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLVQgQHZhcntoZWFkZXJmaWxlfQorQGl0ZW14IC0taGVhZGVyLWZpbGU9QHZhcntoZWFkZXJmaWxlfQorUmVhZHMgQHZhcntoZWFkZXJmaWxlfSBmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMgb24KK3dyaXRpbmcgdGhlIE5MTSBjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZUAgc2VlIHRoZQorQHNhbXB7bGlua2Vyc30gc2VjdGlvbiwgb2YgdGhlIEBjaXRle05MTSBEZXZlbG9wbWVudCBhbmQgVG9vbHMKK092ZXJ2aWV3fSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgTkxNIFNvZnR3YXJlIERldmVsb3BlcidzIEtpdCwgYXZhaWxhYmxlCitmcm9tIE5vdmVsbCwgSW5jLgorCitAaXRlbSAtZAorQGl0ZW14IC0tZGVidWcKK0Rpc3BsYXlzIChvbiBzdGFuZGFyZCBlcnJvcikgdGhlIGxpbmtlciBjb21tYW5kIGxpbmUgdXNlZCBieSBAY29kZXtubG1jb252fS4KKworQGl0ZW0gLWwgQHZhcntsaW5rZXJ9CitAaXRlbXggLS1saW5rZXI9QHZhcntsaW5rZXJ9CitVc2UgQHZhcntsaW5rZXJ9IGZvciBhbnkgbGlua2luZy4gIEB2YXJ7bGlua2VyfSBjYW4gYmUgYW4gYWJzb2x1dGUgb3IgYQorcmVsYXRpdmUgcGF0aG5hbWUuCisKK0BpdGVtIC1oCitAaXRlbXggLS1oZWxwCitQcmludHMgYSB1c2FnZSBzdW1tYXJ5LgorCitAaXRlbSAtVgorQGl0ZW14IC0tdmVyc2lvbgorUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bmxtY29udn0uCitAZW5kIHRhYmxlCisKK0Bub2RlIHdpbmRyZXMKK0BjaGFwdGVyIHdpbmRyZXMKKworQGNvZGV7d2luZHJlc30gbWF5IGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcy4KKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IEBjb2Rle3dpbmRyZXN9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Cit1dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBXaW5kb3dzIHRhcmdldHMuCitAZW5kIHF1b3RhdGlvbgorCitAc21hbGxleGFtcGxlCit3aW5kcmVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXQorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNvZGV7d2luZHJlc30gcmVhZHMgcmVzb3VyY2VzIGZyb20gYW4gaW5wdXQgZmlsZSBhbmQgY29waWVzIHRoZW0gaW50bworYW4gb3V0cHV0IGZpbGUuICBFaXRoZXIgZmlsZSBtYXkgYmUgaW4gb25lIG9mIHRocmVlIGZvcm1hdHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gcmMKK0EgdGV4dCBmb3JtYXQgcmVhZCBieSB0aGUgUmVzb3VyY2UgQ29tcGlsZXIuCisKK0BpdGVtIHJlcworQSBiaW5hcnkgZm9ybWF0IGdlbmVyYXRlZCBieSB0aGUgUmVzb3VyY2UgQ29tcGlsZXIuCisKK0BpdGVtIGNvZmYKK0EgQ09GRiBvYmplY3Qgb3IgZXhlY3V0YWJsZS4KK0BlbmQgdGFibGUKKworVGhlIGV4YWN0IGRlc2NyaXB0aW9uIG9mIHRoZXNlIGRpZmZlcmVudCBmb3JtYXRzIGlzIGF2YWlsYWJsZSBpbgorZG9jdW1lbnRhdGlvbiBmcm9tIE1pY3Jvc29mdC4KKworV2hlbiBAY29kZXt3aW5kcmVzfSBjb252ZXJ0cyBmcm9tIHRoZSBAY29kZXtyY30gZm9ybWF0IHRvIHRoZSBAY29kZXtyZXN9Citmb3JtYXQsIGl0IGlzIGFjdGluZyBsaWtlIHRoZSBXaW5kb3dzIFJlc291cmNlIENvbXBpbGVyLiAgV2hlbgorQGNvZGV7d2luZHJlc30gY29udmVydHMgZnJvbSB0aGUgQGNvZGV7cmVzfSBmb3JtYXQgdG8gdGhlIEBjb2Rle2NvZmZ9Citmb3JtYXQsIGl0IGlzIGFjdGluZyBsaWtlIHRoZSBXaW5kb3dzIEBjb2Rle0NWVFJFU30gcHJvZ3JhbS4KKworV2hlbiBAY29kZXt3aW5kcmVzfSBnZW5lcmF0ZXMgYW4gQGNvZGV7cmN9IGZpbGUsIHRoZSBvdXRwdXQgaXMgc2ltaWxhcgorYnV0IG5vdCBpZGVudGljYWwgdG8gdGhlIGZvcm1hdCBleHBlY3RlZCBmb3IgdGhlIGlucHV0LiAgV2hlbiBhbiBpbnB1dAorQGNvZGV7cmN9IGZpbGUgcmVmZXJzIHRvIGFuIGV4dGVybmFsIGZpbGVuYW1lLCBhbiBvdXRwdXQgQGNvZGV7cmN9IGZpbGUKK3dpbGwgaW5zdGVhZCBpbmNsdWRlIHRoZSBmaWxlIGNvbnRlbnRzLgorCitJZiB0aGUgaW5wdXQgb3Igb3V0cHV0IGZvcm1hdCBpcyBub3Qgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsCitndWVzcyBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lLCBvciwgZm9yIHRoZSBpbnB1dCBmaWxlLCB0aGUgZmlsZSBjb250ZW50cy4KK0EgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsucmN9IHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBAY29kZXtyY30KK2ZpbGUsIGEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsucmVzfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYQorQGNvZGV7cmVzfSBmaWxlLCBhbmQgYSBmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5vfSBvcgorQGZpbGV7LmV4ZX0gd2lsbCBiZSB0cmVhdGVkIGFzIGEgQGNvZGV7Y29mZn0gZmlsZS4KKworSWYgbm8gb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsIHByaW50IHRoZSByZXNvdXJjZXMKK2luIEBjb2Rle3JjfSBmb3JtYXQgdG8gc3RhbmRhcmQgb3V0cHV0LgorCitUaGUgbm9ybWFsIHVzZSBpcyBmb3IgeW91IHRvIHdyaXRlIGFuIEBjb2Rle3JjfSBmaWxlLCB1c2UgQGNvZGV7d2luZHJlc30KK3RvIGNvbnZlcnQgaXQgdG8gYSBDT0ZGIG9iamVjdCBmaWxlLCBhbmQgdGhlbiBsaW5rIHRoZSBDT0ZGIGZpbGUgaW50bworeW91ciBhcHBsaWNhdGlvbi4gIFRoaXMgd2lsbCBtYWtlIHRoZSByZXNvdXJjZXMgZGVzY3JpYmVkIGluIHRoZQorQGNvZGV7cmN9IGZpbGUgYXZhaWxhYmxlIHRvIFdpbmRvd3MuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLWkgQHZhcntmaWxlbmFtZX0KK0BpdGVteCAtLWlucHV0IEB2YXJ7ZmlsZW5hbWV9CitUaGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuCitAY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCBhcyB0aGUgaW5wdXQgZmlsZQorbmFtZS4gIElmIHRoZXJlIGFyZSBubyBub24tb3B0aW9uIGFyZ3VtZW50cywgdGhlbiBAY29kZXt3aW5kcmVzfSB3aWxsCityZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICBAY29kZXt3aW5kcmVzfSBjYW4gbm90IHJlYWQgYSBDT0ZGIGZpbGUgZnJvbQorc3RhbmRhcmQgaW5wdXQuCisKK0BpdGVtIC1vIEB2YXJ7ZmlsZW5hbWV9CitAaXRlbXggLS1vdXRwdXQgQHZhcntmaWxlbmFtZX0KK1RoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuCitAY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCwgYWZ0ZXIgYW55IHVzZWQKK2ZvciB0aGUgaW5wdXQgZmlsZSBuYW1lLCBhcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gIElmIHRoZXJlIGlzIG5vCitub24tb3B0aW9uIGFyZ3VtZW50LCB0aGVuIEBjb2Rle3dpbmRyZXN9IHdpbGwgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0LgorQGNvZGV7d2luZHJlc30gY2FuIG5vdCB3cml0ZSBhIENPRkYgZmlsZSB0byBzdGFuZGFyZCBvdXRwdXQuCisKK0BpdGVtIC1JIEB2YXJ7Zm9ybWF0fQorQGl0ZW14IC0taW5wdXQtZm9ybWF0IEB2YXJ7Zm9ybWF0fQorVGhlIGlucHV0IGZvcm1hdCB0byByZWFkLiAgQHZhcntmb3JtYXR9IG1heSBiZSBAc2FtcHtyZXN9LCBAc2FtcHtyY30sIG9yCitAc2FtcHtjb2ZmfS4gIElmIG5vIGlucHV0IGZvcm1hdCBpcyBzcGVjaWZpZWQsIEBjb2Rle3dpbmRyZXN9IHdpbGwKK2d1ZXNzLCBhcyBkZXNjcmliZWQgYWJvdmUuCisKK0BpdGVtIC1PIEB2YXJ7Zm9ybWF0fQorQGl0ZW14IC0tb3V0cHV0LWZvcm1hdCBAdmFye2Zvcm1hdH0KK1RoZSBvdXRwdXQgZm9ybWF0IHRvIGdlbmVyYXRlLiAgQHZhcntmb3JtYXR9IG1heSBiZSBAc2FtcHtyZXN9LAorQHNhbXB7cmN9LCBvciBAc2FtcHtjb2ZmfS4gIElmIG5vIG91dHB1dCBmb3JtYXQgaXMgc3BlY2lmaWVkLAorQGNvZGV7d2luZHJlc30gd2lsbCBndWVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgorCitAaXRlbSAtRiBAdmFye3RhcmdldH0KK0BpdGVteCAtLXRhcmdldCBAdmFye3RhcmdldH0KK1NwZWNpZnkgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciBhIENPRkYgZmlsZSBhcyBpbnB1dCBvciBvdXRwdXQuICBUaGlzCitpcyBhIEJGRCB0YXJnZXQgbmFtZTsgeW91IGNhbiB1c2UgdGhlIEBjb2Rley0taGVscH0gb3B0aW9uIHRvIHNlZSBhIGxpc3QKK29mIHN1cHBvcnRlZCB0YXJnZXRzLiAgTm9ybWFsbHkgQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGRlZmF1bHQKK2Zvcm1hdCwgd2hpY2ggaXMgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgYnkgdGhlIEBjb2Rley0taGVscH0gb3B0aW9uLgorQHJlZntUYXJnZXQgU2VsZWN0aW9ufS4KKworQGl0ZW0gLS1wcmVwcm9jZXNzb3IgQHZhcntwcm9ncmFtfQorV2hlbiBAY29kZXt3aW5kcmVzfSByZWFkcyBhbiBAY29kZXtyY30gZmlsZSwgaXQgcnVucyBpdCB0aHJvdWdoIHRoZSBDCitwcmVwcm9jZXNzb3IgZmlyc3QuICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcmVwcm9jZXNzb3IKK3RvIHVzZSwgaW5jbHVkaW5nIGFueSBsZWFkaW5nIGFyZ3VtZW50cy4gIFRoZSBkZWZhdWx0IHByZXByb2Nlc3NvcgorYXJndW1lbnQgaXMgQGNvZGV7Z2NjIC1FIC14Yy1oZWFkZXIgLURSQ19JTlZPS0VEfS4KKworQGl0ZW0gLS1pbmNsdWRlLWRpciBAdmFye2RpcmVjdG9yeX0KK1NwZWNpZnkgYW4gaW5jbHVkZSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcmVhZGluZyBhbiBAY29kZXtyY30gZmlsZS4KK0Bjb2Rle3dpbmRyZXN9IHdpbGwgcGFzcyB0aGlzIHRvIHRoZSBwcmVwcm9jZXNzb3IgYXMgYW4gQGNvZGV7LUl9CitvcHRpb24uICBAY29kZXt3aW5kcmVzfSB3aWxsIGFsc28gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IHdoZW4gbG9va2luZyBmb3IKK2ZpbGVzIG5hbWVkIGluIHRoZSBAY29kZXtyY30gZmlsZS4KKworQGl0ZW0gLS1kZWZpbmUgQHZhcntzeW1bPXZhbF19CitTcGVjaWZ5IGEgQGNvZGV7LUR9IG9wdGlvbiB0byBwYXNzIHRvIHRoZSBwcmVwcm9jZXNzb3Igd2hlbiByZWFkaW5nIGFuCitAY29kZXtyY30gZmlsZS4KKworQGl0ZW0gLS1sYW5ndWFnZSBAdmFye3ZhbH0KK1NwZWNpZnkgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdG8gdXNlIHdoZW4gcmVhZGluZyBhbiBAY29kZXtyY30gZmlsZS4KK0B2YXJ7dmFsfSBzaG91bGQgYmUgYSBoZXhhZGVjaW1hbCBsYW5ndWFnZSBjb2RlLiAgVGhlIGxvdyBlaWdodCBiaXRzIGFyZQordGhlIGxhbmd1YWdlLCBhbmQgdGhlIGhpZ2ggZWlnaHQgYml0cyBhcmUgdGhlIHN1Ymxhbmd1YWdlLgorCitAaXRlbSAtLWhlbHAKK1ByaW50cyBhIHVzYWdlIHN1bW1hcnkuCisKK0BpdGVtIC0tdmVyc2lvbgorUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7d2luZHJlc30uCisKK0BpdGVtIC0teXlkZWJ1ZworSWYgQGNvZGV7d2luZHJlc30gaXMgY29tcGlsZWQgd2l0aCBAY29kZXtZWURFQlVHfSBkZWZpbmVkIGFzIEBjb2RlezF9LAordGhpcyB3aWxsIHR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZy4KK0BlbmQgdGFibGUKKworCitAbm9kZSBkbGx0b29sCitAY2hhcHRlciBDcmVhdGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRExMcworQGNpbmRleCBETEwKK0BraW5kZXggZGxsdG9vbAorCitAY29kZXtkbGx0b29sfSBtYXkgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlCitkeW5hbWljIGxpbmsgbGlicmFyaWVzIChETExzKS4KKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IEBjb2Rle2RsbHRvb2x9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Cit1dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciB0aG9zZSB0YXJnZXRzIHdoaWNoIHN1cHBvcnQgRExMcy4KK0BlbmQgcXVvdGF0aW9uCisKK0BzbWFsbGV4YW1wbGUKK2RsbHRvb2wgWy1kfC0taW5wdXQtZGVmIEB2YXJ7ZGVmLWZpbGUtbmFtZX1dCisgICAgICAgIFstYnwtLWJhc2UtZmlsZSBAdmFye2Jhc2UtZmlsZS1uYW1lfV0KKyAgICAgICAgWy1lfC0tb3V0cHV0LWV4cCBAdmFye2V4cG9ydHMtZmlsZS1uYW1lfV0KKyAgICAgICAgWy16fC0tb3V0cHV0LWRlZiBAdmFye2RlZi1maWxlLW5hbWV9XQorICAgICAgICBbLWx8LS1vdXRwdXQtbGliIEB2YXJ7bGlicmFyeS1maWxlLW5hbWV9XSAgICAgICAgCisgICAgICAgIFstLWV4cG9ydC1hbGwtc3ltYm9sc10gWy0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzXQorICAgICAgICBbLS1leGNsdWRlLXN5bWJvbHMgQHZhcntsaXN0fV0KKyAgICAgICAgWy0tbm8tZGVmYXVsdC1leGNsdWRlc10KKyAgICAgICAgWy1TfC0tYXMgQHZhcntwYXRoLXRvLWFzc2VtYmxlcn1dIFstZnwtLWFzLWZsYWdzIEB2YXJ7b3B0aW9uc31dCisgICAgICAgIFstRHwtLWRsbG5hbWUgQHZhcntuYW1lfV0gWy1tfC0tbWFjaGluZSBAdmFye21hY2hpbmV9XQorICAgICAgICBbLWF8LS1hZGQtaW5kaXJlY3RdIFstVXwtLWFkZC11bmRlcnNjb3JlXSBbLWt8LS1raWxsLWF0XQorICAgICAgICBbLUF8LS1hZGQtc3RkY2FsbC1hbGlhc10KKyAgICAgICAgWy14fC0tbm8taWRhdGE0XSBbLWN8LS1uby1pZGF0YTVdIFstaXwtLWludGVyd29ya10KKyAgICAgICAgWy1ufC0tbm9kZWxldGVdIFstdnwtLXZlcmJvc2VdIFstaHwtLWhlbHBdIFstVnwtLXZlcnNpb25dCisgICAgICAgIFtvYmplY3QtZmlsZSBAZG90c3t9XQorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNvZGV7ZGxsdG9vbH0gcmVhZHMgaXRzIGlucHV0cywgd2hpY2ggY2FuIGNvbWUgZnJvbSB0aGUgQHNhbXB7LWR9IGFuZAorQHNhbXB7LWJ9IG9wdGlvbnMgYXMgd2VsbCBhcyBvYmplY3QgZmlsZXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCitsaW5lLiAgSXQgdGhlbiBwcm9jZXNzZXMgdGhlc2UgaW5wdXRzIGFuZCBpZiB0aGUgQHNhbXB7LWV9IG9wdGlvbiBoYXMKK2JlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBleHBvcnRzIGZpbGUuICBJZiB0aGUgQHNhbXB7LWx9IG9wdGlvbgoraGFzIGJlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBsaWJyYXJ5IGZpbGUgYW5kIGlmIHRoZSBAc2FtcHsten0gb3B0aW9uCitoYXMgYmVlbiBzcGVjaWZpZWQgaXQgY3JlYXRlcyBhIGRlZiBmaWxlLiAgQW55IG9yIGFsbCBvZiB0aGUgLWUsIC1sCithbmQgLXogb3B0aW9ucyBjYW4gYmUgcHJlc2VudCBpbiBvbmUgaW52b2NhdGlvbiBvZiBkbGx0b29sLgorCitXaGVuIGNyZWF0aW5nIGEgRExMLCBhbG9uZyB3aXRoIHRoZSBzb3VyY2UgZm9yIHRoZSBETEwsIGl0IGlzIG5lY2Vzc2FyeQordG8gaGF2ZSB0aHJlZSBvdGhlciBmaWxlcy4gIEBjb2Rle2RsbHRvb2x9IGNhbiBoZWxwIHdpdGggdGhlIGNyZWF0aW9uIG9mCit0aGVzZSBmaWxlcy4KKworVGhlIGZpcnN0IGZpbGUgaXMgYSBAc2FtcHsuZGVmfSBmaWxlIHdoaWNoIHNwZWNpZmllcyB3aGljaCBmdW5jdGlvbnMgYXJlCitleHBvcnRlZCBmcm9tIHRoZSBETEwsIHdoaWNoIGZ1bmN0aW9ucyB0aGUgRExMIGltcG9ydHMsIGFuZCBzbyBvbi4gIFRoaXMKK2lzIGEgdGV4dCBmaWxlIGFuZCBjYW4gYmUgY3JlYXRlZCBieSBoYW5kLCBvciBAY29kZXtkbGx0b29sfSBjYW4gYmUgdXNlZAordG8gY3JlYXRlIGl0IHVzaW5nIHRoZSBAc2FtcHsten0gb3B0aW9uLiAgSW4gdGhpcyBjYXNlIEBjb2Rle2RsbHRvb2x9Cit3aWxsIHNjYW4gdGhlIG9iamVjdCBmaWxlcyBzcGVjaWZpZWQgb24gaXRzIGNvbW1hbmQgbGluZSBsb29raW5nIGZvcgordGhvc2UgZnVuY3Rpb25zIHdoaWNoIGhhdmUgYmVlbiBzcGVjaWFsbHkgbWFya2VkIGFzIGJlaW5nIGV4cG9ydGVkIGFuZAorcHV0IGVudHJpZXMgZm9yIHRoZW0gaW4gdGhlIC5kZWYgZmlsZSBpdCBjcmVhdGVzLgorCitJbiBvcmRlciB0byBtYXJrIGEgZnVuY3Rpb24gYXMgYmVpbmcgZXhwb3J0ZWQgZnJvbSBhIERMTCwgaXQgbmVlZHMgdG8KK2hhdmUgYW4gQHNhbXB7LWV4cG9ydDo8bmFtZV9vZl9mdW5jdGlvbj59IGVudHJ5IGluIHRoZSBAc2FtcHsuZHJlY3R2ZX0KK3NlY3Rpb24gb2YgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBjYW4gYmUgZG9uZSBpbiBDIGJ5IHVzaW5nIHRoZQorYXNtKCkgb3BlcmF0b3I6CisKK0BzbWFsbGV4YW1wbGUKKyAgYXNtICgiLnNlY3Rpb24gLmRyZWN0dmUiKTsgIAorICBhc20gKCIuYXNjaWkgXCItZXhwb3J0Om15X2Z1bmNcIiIpOworCisgIGludCBteV9mdW5jICh2b2lkKSBAeyBAZG90c3t9IEB9CitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgc2Vjb25kIGZpbGUgbmVlZGVkIGZvciBETEwgY3JlYXRpb24gaXMgYW4gZXhwb3J0cyBmaWxlLiAgVGhpcyBmaWxlCitpcyBsaW5rZWQgd2l0aCB0aGUgb2JqZWN0IGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgYm9keSBvZiB0aGUgRExMIGFuZCBpdAoraGFuZGxlcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIERMTCBhbmQgdGhlIG91dHNpZGUgd29ybGQuICBUaGlzIGlzIGEKK2JpbmFyeSBmaWxlIGFuZCBpdCBjYW4gYmUgY3JlYXRlZCBieSBnaXZpbmcgdGhlIEBzYW1wey1lfSBvcHRpb24gdG8KK0Bjb2Rle2RsbHRvb2x9IHdoZW4gaXQgaXMgY3JlYXRpbmcgb3IgcmVhZGluZyBpbiBhIC5kZWYgZmlsZS4gCisKK1RoZSB0aGlyZCBmaWxlIG5lZWRlZCBmb3IgRExMIGNyZWF0aW9uIGlzIHRoZSBsaWJyYXJ5IGZpbGUgdGhhdCBwcm9ncmFtcword2lsbCBsaW5rIHdpdGggaW4gb3JkZXIgdG8gYWNjZXNzIHRoZSBmdW5jdGlvbnMgaW4gdGhlIERMTC4gIFRoaXMgZmlsZQorY2FuIGJlIGNyZWF0ZWQgYnkgZ2l2aW5nIHRoZSBAc2FtcHstbH0gb3B0aW9uIHRvIGRsbHRvb2wgd2hlbiBpdAoraXMgY3JlYXRpbmcgb3IgcmVhZGluZyBpbiBhIC5kZWYgZmlsZS4KKworQGNvZGV7ZGxsdG9vbH0gYnVpbGRzIHRoZSBsaWJyYXJ5IGZpbGUgYnkgaGFuZCwgYnV0IGl0IGJ1aWxkcyB0aGUKK2V4cG9ydHMgZmlsZSBieSBjcmVhdGluZyB0ZW1wb3JhcnkgZmlsZXMgY29udGFpbmluZyBhc3NlbWJsZXIgc3RhdGVtZW50cworYW5kIHRoZW4gYXNzZW1ibGluZyB0aGVzZS4gIFRoZSBAc2FtcHstU30gY29tbWFuZCBsaW5lIG9wdGlvbiBjYW4gYmUKK3VzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgYXNzZW1ibGVyIHRoYXQgZGxsdG9vbCB3aWxsIHVzZSwKK2FuZCB0aGUgQHNhbXB7LWZ9IG9wdGlvbiBjYW4gYmUgdXNlZCB0byBwYXNzIHNwZWNpZmljIGZsYWdzIHRvIHRoYXQKK2Fzc2VtYmxlci4gIFRoZSBAc2FtcHstbn0gY2FuIGJlIHVzZWQgdG8gcHJldmVudCBkbGx0b29sIGZyb20gZGVsZXRpbmcKK3RoZXNlIHRlbXBvcmFyeSBhc3NlbWJsZXIgZmlsZXMgd2hlbiBpdCBpcyBkb25lLCBhbmQgaWYgQHNhbXB7LW59IGlzCitzcGVjaWZpZWQgdHdpY2UgdGhlbiB0aGlzIHdpbGwgcHJldmVudCBkbGx0b29sIGZyb20gZGVsZXRpbmcgdGhlCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGVzIGl0IHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBjcmVhdGluZyBhIERMTCBmcm9tIGEgc291cmNlIGZpbGUgQHNhbXB7ZGxsLmN9IGFuZAorYWxzbyBjcmVhdGluZyBhIHByb2dyYW0gKGZyb20gYW4gb2JqZWN0IGZpbGUgY2FsbGVkIEBzYW1we3Byb2dyYW0ub30pCit0aGF0IHVzZXMgdGhhdCBETEw6CisKK0BzbWFsbGV4YW1wbGUKKyAgZ2NjIC1jIGRsbC5jCisgIGRsbHRvb2wgLWUgZXhwb3J0cy5vIC1sIGRsbC5saWIgZGxsLm8KKyAgZ2NjIGRsbC5vIGV4cG9ydHMubyAtbyBkbGwuZGxsCisgIGdjYyBwcm9ncmFtLm8gZGxsLmxpYiAtbyBwcm9ncmFtCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gLWQgQHZhcntmaWxlbmFtZX0KK0BpdGVteCAtLWlucHV0LWRlZiBAdmFye2ZpbGVuYW1lfQorQGNpbmRleCBpbnB1dCAuZGVmIGZpbGUKK1NwZWNpZmllcyB0aGUgbmFtZSBvZiBhIC5kZWYgZmlsZSB0byBiZSByZWFkIGluIGFuZCBwcm9jZXNzZWQuCisKK0BpdGVtIC1iIEB2YXJ7ZmlsZW5hbWV9CitAaXRlbXggLS1iYXNlLWZpbGUgQHZhcntmaWxlbmFtZX0KK0BjaW5kZXggYmFzZSBmaWxlcworU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgYmFzZSBmaWxlIHRvIGJlIHJlYWQgaW4gYW5kIHByb2Nlc3NlZC4gIFRoZQorY29udGVudHMgb2YgdGhpcyBmaWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBpbiB0aGUKK2V4cG9ydHMgZmlsZSBnZW5lcmF0ZWQgYnkgZGxsdG9vbC4KKworQGl0ZW0gLWUgQHZhcntmaWxlbmFtZX0KK0BpdGVteCAtLW91dHB1dC1leHAgQHZhcntmaWxlbmFtZX0KK1NwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0IGZpbGUgdG8gYmUgY3JlYXRlZCBieSBkbGx0b29sLgorCitAaXRlbSAteiBAdmFye2ZpbGVuYW1lfQorQGl0ZW14IC0tb3V0cHV0LWRlZiBAdmFye2ZpbGVuYW1lfQorU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZCBieSBkbGx0b29sLgorCitAaXRlbSAtbCBAdmFye2ZpbGVuYW1lfQorQGl0ZW14IC0tb3V0cHV0LWxpYiBAdmFye2ZpbGVuYW1lfQorU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IGZpbGUgdG8gYmUgY3JlYXRlZCBieSBkbGx0b29sLgorCitAaXRlbSAtLWV4cG9ydC1hbGwtc3ltYm9scworVHJlYXQgYWxsIGdsb2JhbCBhbmQgd2VhayBkZWZpbmVkIHN5bWJvbHMgZm91bmQgaW4gdGhlIGlucHV0IG9iamVjdAorZmlsZXMgYXMgc3ltYm9scyB0byBiZSBleHBvcnRlZC4gIFRoZXJlIGlzIGEgc21hbGwgbGlzdCBvZiBzeW1ib2xzIHdoaWNoCithcmUgbm90IGV4cG9ydGVkIGJ5IGRlZmF1bHQ7IHNlZSB0aGUgQGNvZGV7LS1uby1kZWZhdWx0LWV4Y2x1ZGVzfQorb3B0aW9uLiAgWW91IG1heSBhZGQgdG8gdGhlIGxpc3Qgb2Ygc3ltYm9scyB0byBub3QgZXhwb3J0IGJ5IHVzaW5nIHRoZQorQGNvZGV7LS1leGNsdWRlLXN5bWJvbHN9IG9wdGlvbi4KKworQGl0ZW0gLS1uby1leHBvcnQtYWxsLXN5bWJvbHMKK09ubHkgZXhwb3J0IHN5bWJvbHMgZXhwbGljaXRseSBsaXN0ZWQgaW4gYW4gaW5wdXQgLmRlZiBmaWxlIG9yIGluCitAc2FtcHsuZHJlY3R2ZX0gc2VjdGlvbnMgaW4gdGhlIGlucHV0IG9iamVjdCBmaWxlcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKK2JlaGF2aW91ci4gIFRoZSBAc2FtcHsuZHJlY3R2ZX0gc2VjdGlvbnMgYXJlIGNyZWF0ZWQgYnkgQHNhbXB7ZGxsZXhwb3J0fQorYXR0cmlidXRlcyBpbiB0aGUgc291cmNlIGNvZGUuCisKK0BpdGVtIC0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7bGlzdH0KK0RvIG5vdCBleHBvcnQgdGhlIHN5bWJvbHMgaW4gQHZhcntsaXN0fS4gIFRoaXMgaXMgYSBsaXN0IG9mIHN5bWJvbCBuYW1lcworc2VwYXJhdGVkIGJ5IGNvbW1hIG9yIGNvbG9uIGNoYXJhY3RlcnMuICBUaGUgc3ltYm9sIG5hbWVzIHNob3VsZCBub3QKK2NvbnRhaW4gYSBsZWFkaW5nIHVuZGVyc2NvcmUuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCitAY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZC4KKworQGl0ZW0gLS1uby1kZWZhdWx0LWV4Y2x1ZGVzCitXaGVuIEBjb2Rley0tZXhwb3J0LWFsbC1zeW1ib2xzfSBpcyB1c2VkLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYXZvaWQKK2V4cG9ydGluZyBjZXJ0YWluIHNwZWNpYWwgc3ltYm9scy4gIFRoZSBjdXJyZW50IGxpc3Qgb2Ygc3ltYm9scyB0byBhdm9pZAorZXhwb3J0aW5nIGlzIEBzYW1we0RsbE1haW5AQDEyfSwgQHNhbXB7RGxsRW50cnlQb2ludEBAMH0sCitAc2FtcHtpbXB1cmVfcHRyfS4gIFlvdSBtYXkgdXNlIHRoZSBAY29kZXstLW5vLWRlZmF1bHQtZXhjbHVkZXN9IG9wdGlvbgordG8gZ28gYWhlYWQgYW5kIGV4cG9ydCB0aGVzZSBzcGVjaWFsIHN5bWJvbHMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bAord2hlbiBAY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZC4KKworQGl0ZW0gLVMgQHZhcntwYXRofQorQGl0ZW14IC0tYXMgQHZhcntwYXRofQorU3BlY2lmaWVzIHRoZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGZpbGVuYW1lLCBvZiB0aGUgYXNzZW1ibGVyIHRvIGJlIHVzZWQKK3RvIGNyZWF0ZSB0aGUgZXhwb3J0cyBmaWxlLgorCitAaXRlbSAtZiBAdmFye3N3aXRjaGVzfQorQGl0ZW14IC0tYXMtZmxhZ3MgQHZhcntzd2l0Y2hlc30KK1NwZWNpZmllcyBhbnkgc3BlY2lmaWMgY29tbWFuZCBsaW5lIHN3aXRjaGVzIHRvIGJlIHBhc3NlZCB0byB0aGUKK2Fzc2VtYmxlciB3aGVuIGJ1aWxkaW5nIHRoZSBleHBvcnRzIGZpbGUuICBUaGlzIG9wdGlvbiB3aWxsIHdvcmsgZXZlbiBpZgordGhlIEBzYW1wey1TfSBvcHRpb24gaXMgbm90IHVzZWQuICBUaGlzIG9wdGlvbiBvbmx5IHRha2VzIG9uZSBhcmd1bWVudCwKK2FuZCBpZiBpdCBvY2N1cnMgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiBsYXRlcgorb2NjdXJyZW5jZXMgd2lsbCBvdmVycmlkZSBlYXJsaWVyIG9jY3VycmVuY2VzLiAgU28gaWYgaXQgaXMgbmVjZXNzYXJ5IHRvCitwYXNzIG11bHRpcGxlIHN3aXRjaGVzIHRvIHRoZSBhc3NlbWJsZXIgdGhleSBzaG91bGQgYmUgZW5jbG9zZWQgaW4KK2RvdWJsZSBxdW90ZXMuCisKK0BpdGVtIC1EIEB2YXJ7bmFtZX0KK0BpdGVteCAtLWRsbC1uYW1lIEB2YXJ7bmFtZX0KK1NwZWNpZmllcyB0aGUgbmFtZSB0byBiZSBzdG9yZWQgaW4gdGhlIC5kZWYgZmlsZSBhcyB0aGUgbmFtZSBvZiB0aGUgRExMCit3aGVuIHRoZSBAc2FtcHstZX0gb3B0aW9uIGlzIHVzZWQuICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgcHJlc2VudCwgdGhlbgordGhlIGZpbGVuYW1lIGdpdmVuIHRvIHRoZSBAc2FtcHstZX0gb3B0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZgordGhlIERMTC4KKworQGl0ZW0gLW0gQHZhcnttYWNoaW5lfQorQGl0ZW14IC1tYWNoaW5lIEB2YXJ7bWFjaGluZX0KK1NwZWNpZmllcyB0aGUgdHlwZSBvZiBtYWNoaW5lIGZvciB3aGljaCB0aGUgbGlicmFyeSBmaWxlIHNob3VsZCBiZQorYnVpbHQuICBAY29kZXtkbGx0b29sfSBoYXMgYSBidWlsdCBpbiBkZWZhdWx0IHR5cGUsIGRlcGVuZGluZyB1cG9uIGhvdworaXQgd2FzIGNyZWF0ZWQsIGJ1dCB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGF0LiAgVGhpcyBpcworbm9ybWFsbHkgb25seSB1c2VmdWwgd2hlbiBjcmVhdGluZyBETExzIGZvciBhbiBBUk0gcHJvY2Vzc29yLCB3aGVuIHRoZQorY29udGVudHMgb2YgdGhlIERMTCBhcmUgYWN0dWFsbHkgZW5jb2RlIHVzaW5nIFRIVU1CIGluc3RydWN0aW9ucy4KKworQGl0ZW0gLWEKK0BpdGVteCAtLWFkZC1pbmRpcmVjdAorU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0CitzaG91bGQgYWRkIGEgc2VjdGlvbiB3aGljaCBhbGxvd3MgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyB0byBiZQorcmVmZXJlbmNlZCB3aXRob3V0IHVzaW5nIHRoZSBpbXBvcnQgbGlicmFyeS4gIFdoYXRldmVyIHRoZSBoZWxsIHRoYXQKK21lYW5zISAKKworQGl0ZW0gLVUKK0BpdGVteCAtLWFkZC11bmRlcnNjb3JlCitTcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKK3Nob3VsZCBwcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8gdGhlIG5hbWVzIG9mIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMuIAorCitAaXRlbSAtaworQGl0ZW14IC0ta2lsbC1hdAorU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0CitzaG91bGQgbm90IGFwcGVuZCB0aGUgc3RyaW5nIEBzYW1we0BAIDxudW1iZXI+fS4gIFRoZXNlIG51bWJlcnMgYXJlCitjYWxsZWQgb3JkaW5hbCBudW1iZXJzIGFuZCB0aGV5IHJlcHJlc2VudCBhbm90aGVyIHdheSBvZiBhY2Nlc3NpbmcgdGhlCitmdW5jdGlvbiBpbiBhIERMTCwgb3RoZXIgdGhhbiBieSBuYW1lLgorCitAaXRlbSAtQQorQGl0ZW14IC0tYWRkLXN0ZGNhbGwtYWxpYXMKK1NwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAorc2hvdWxkIGFkZCBhbGlhc2VzIGZvciBzdGRjYWxsIHN5bWJvbHMgd2l0aG91dCBAc2FtcHtAQCA8bnVtYmVyPn0KK2luIGFkZGl0aW9uIHRvIHRoZSBzeW1ib2xzIHdpdGggQHNhbXB7QEAgPG51bWJlcj59LgorCitAaXRlbSAteAorQGl0ZW14IC0tbm8taWRhdGE0CitTcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGFuZCBsaWJyYXJ5CitmaWxlcyBpdCBzaG91bGQgb21pdCB0aGUgLmlkYXRhNCBzZWN0aW9uLiAgVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eQord2l0aCBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitAaXRlbSAtYworQGl0ZW14IC0tbm8taWRhdGE1CitTcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGFuZCBsaWJyYXJ5CitmaWxlcyBpdCBzaG91bGQgb21pdCB0aGUgLmlkYXRhNSBzZWN0aW9uLiAgVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eQord2l0aCBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitAaXRlbSAtaQorQGl0ZW14IC0taW50ZXJ3b3JrCitTcGVjaWZpZXMgdGhhdCBAY29kZXtkbGx0b29sfSBzaG91bGQgbWFyayB0aGUgb2JqZWN0cyBpbiB0aGUgbGlicmFyeQorZmlsZSBhbmQgZXhwb3J0cyBmaWxlIHRoYXQgaXQgcHJvZHVjZXMgYXMgc3VwcG9ydGluZyBpbnRlcndvcmtpbmcKK2JldHdlZW4gQVJNIGFuZCBUSFVNQiBjb2RlLgorCitAaXRlbSAtbgorQGl0ZW14IC0tbm9kZWxldGUKK01ha2VzIEBjb2Rle2RsbHRvb2x9IHByZXNlcnZlIHRoZSB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGVzIGl0IHVzZWQgdG8KK2NyZWF0ZSB0aGUgZXhwb3J0cyBmaWxlLiAgSWYgdGhpcyBvcHRpb24gaXMgcmVwZWF0ZWQgdGhlbiBkbGx0b29sIHdpbGwKK2Fsc28gcHJlc2VydmUgdGhlIHRlbXBvcmFyeSBvYmplY3QgZmlsZXMgaXQgdXNlcyB0byBjcmVhdGUgdGhlIGxpYnJhcnkKK2ZpbGUuIAorCitAaXRlbSAtdgorQGl0ZW14IC0tdmVyYm9zZQorTWFrZSBkbGx0b29sIGRlc2NyaWJlIHdoYXQgaXQgaXMgZG9pbmcuCisKK0BpdGVtIC1oCitAaXRlbXggLS1oZWxwCitEaXNwbGF5cyBhIGxpc3Qgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZW4gZXhpdHMuCisKK0BpdGVtIC1WCitAaXRlbXggLS12ZXJzaW9uCitEaXNwbGF5cyBkbGx0b29sJ3MgdmVyc2lvbiBudW1iZXIgYW5kIHRoZW4gZXhpdHMuCisKK0BlbmQgdGFibGUKKworQG5vZGUgcmVhZGVsZgorQGNoYXB0ZXIgcmVhZGVsZgorCitAY2luZGV4IEVMRiBmaWxlIGluZm9ybWF0aW9uCitAa2luZGV4IHJlYWRlbGYKKworQHNtYWxsZXhhbXBsZQorcmVhZGVsZiBbIC1hIHwgLS1hbGwgXSAKKyAgICAgICAgWyAtaCB8IC0tZmlsZS1oZWFkZXJdCisgICAgICAgIFsgLWwgfCAtLXByb2dyYW0taGVhZGVycyB8IC0tc2VnbWVudHNdCisgICAgICAgIFsgLVMgfCAtLXNlY3Rpb24taGVhZGVycyB8IC0tc2VjdGlvbnNdCisgICAgICAgIFsgLWUgfCAtLWhlYWRlcnNdCisgICAgICAgIFsgLXMgfCAtLXN5bXMgfCAtLXN5bWJvbHNdCisgICAgICAgIFsgLXIgfCAtLXJlbG9jc10KKyAgICAgICAgWyAtZCB8IC0tZHluYW1pY10KKyAgICAgICAgWyAtViB8IC0tdmVyc2lvbi1pbmZvXQorICAgICAgICBbIC1EIHwgLS11c2UtZHluYW1pY10KKyAgICAgICAgWyAteCA8bnVtYmVyPiB8IC0taGV4LWR1bXA9PG51bWJlcj5dCisgICAgICAgIFsgLXdbbGlhcHJdIHwgLS1kZWJ1Zy1kdW1wWz1pbmZvLD1saW5lLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdXQorICAgICAgICBbICAgICAgLS1oaXN0b2dyYW1dCisgICAgICAgIFsgLXYgfCAtLXZlcnNpb25dCisgICAgICAgIFsgLUggfCAtLWhlbHBdCisgICAgICAgIEB2YXJ7ZWxmZmlsZX1AZG90c3t9CitAZW5kIHNtYWxsZXhhbXBsZQorCitAY29kZXtyZWFkZWxmfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBFTEYgZm9ybWF0IG9iamVjdAorZmlsZXMuICBUaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LgorCitAdmFye2VsZmZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIEF0IHRoZQorbW9tZW50LCBAY29kZXtyZWFkZWxmfSBkb2VzIG5vdCBzdXBwb3J0IGV4YW1pbmluZyBhcmNoaXZlcywgbm9yIGRvZXMgaXQKK3N1cHBvcnQgZXhhbWluZyA2NCBiaXQgRUxGIGZpbGVzLgorCitUaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQorZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyBAc2FtcHstdn0gb3IgQHNhbXB7LUh9IG11c3QgYmUKK2dpdmVuLiAKKworQHRhYmxlIEBjb2RlCitAaXRlbSAtYQorQGl0ZW14IC0tYWxsCitFcXVpdmFsZW50IHRvIHNwZWNpZml5aW5nIEBzYW1wey0tZmlsZS1oZWFkZXJ9LAorQHNhbXB7LS1wcm9ncmFtLWhlYWRlcnN9LCBAc2FtcHstLXNlY3Rpb25zfSwgQHNhbXB7LS1zeW1ib2xzfSwKK0BzYW1wey0tcmVsb2NzfSwgQHNhbXB7LS1keW5hbWljfSBhbmQgQHNhbXB7LS12ZXJzaW9uLWluZm99LgorCitAaXRlbSAtaAorQGl0ZW14IC0tZmlsZS1oZWFkZXIKK0BjaW5kZXggRUxGIGZpbGUgaGVhZGVyIGluZm9ybWF0aW9uCitEaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBFTEYgaGVhZGVyIGF0IHRoZSBzdGFydCBvZiB0aGUKK2ZpbGUuCisKK0BpdGVtIC1sCitAaXRlbXggLS1wcm9ncmFtLWhlYWRlcnMKK0BpdGVteCAtLXNlZ21lbnRzCitAY2luZGV4IEVMRiBwcm9ncmFtIGhlYWRlciBpbmZvcm1hdGlvbgorQGNpbmRleCBFTEYgc2VnbWVudCBpbmZvcm1hdGlvbgorRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlZ21lbnQgaGVhZGVycywgaWYgaXQKK2hhcyBhbnkuCisKK0BpdGVtIC1TCitAaXRlbXggLS1zZWN0aW9ucworQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXJzCitAY2luZGV4IEVMRiBzZWN0aW9uIGluZm9ybWF0aW9uCitEaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBmaWxlJ3Mgc2VjdGlvbiBoZWFkZXJzLCBpZiBpdAoraGFzIGFueS4KKworQGl0ZW0gLXMKK0BpdGVteCAtLXN5bWJvbHMKK0BpdGVteCAtLXN5bXMKK0BjaW5kZXggRUxGIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbgorRGlzcGxheXMgdGhlIGVudHJpZXMgaW4gc3ltYm9sIHRhYmxlIHNlY3Rpb24gb2YgdGhlIGZpbGUsIGlmIGl0IGhhcyBvbmUuCisKK0BpdGVtIC1lCitAaXRlbXggLS1oZWFkZXJzCitEaXNwbGF5IGFsbCB0aGUgaGVhZGVycyBpbiB0aGUgZmlsZS4gIEVxdWl2YWxlbnQgdG8gQHNhbXB7LWggLWwgLVN9LgorCitAaXRlbSAtcgorQGl0ZW14IC0tcmVsb2NzCitAY2luZGV4IEVMRiByZWxvYyBpbmZvcm1hdGlvbgorRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlJ3MgcmVsb2NhdGlvbiBzZWN0aW9uLCBpZiBpdCBoYSBvbmUuCisKK0BpdGVtIC1kCitAaXRlbXggLS1keW5hbWljCitAY2luZGV4IEVMRiBkeW5hbWljIHNlY3Rpb24gaW5mb3JtYXRpb24KK0Rpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSdzIGR5bmFtaWMgc2VjdGlvbiwgaWYgaXQgaGFzIG9uZS4KKworQGl0ZW0gLVYKK0BpdGVteCAtLXZlcnNpb24taW5mbworQGNpbmRleCBFTEYgdmVyc2lvbiBzZWN0aW9ucyBpbmZvcm1hdGlvbnMKK0Rpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgdmVyc2lvbiBzZWN0aW9ucyBpbiB0aGUgZmlsZSwgaXQgdGhleQorZXhpc3QuCisKK0BpdGVtIC1ECitAaXRlbXggLS11c2UtZHluYW1pYworV2hlbiBkaXNwbGF5aW5nIHN5bWJvbHMsIHRoaXMgb3B0aW9uIG1ha2VzIEBjb2Rle3JlYWRlbGZ9IHVzZSB0aGUKK3N5bWJsb2wgdGFibGUgaW4gdGhlIGZpbGUncyBkeW5hbWljIHNlY3Rpb24sIHJhdGhlciB0aGFuIHRoZSBvbmUgaW4gdGhlCitzeW1ib2xzIHNlY3Rpb24uCisKK0BpdGVtIC14IDxudW1iZXI+CitAaXRlbXggLS1oZXgtZHVtcD08bnVtYmVyPgorRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmRpY2F0ZWQgc2VjdGlvbiBhcyBhIGhleGFkZWNpbWFsIGR1bXAuCisKK0BpdGVtIC13W2xpYXByXQorQGl0ZW14IC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXQorRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZWJ1ZyBzZWN0aW9ucyBpbiB0aGUgZmlsZSwgaWYgYW55IGFyZQorcHJlc2VudC4gIElmIG9uZSBvZiB0aGUgb3B0aW9uYWwgbGV0dGVycyBvciB3b3JkcyBmb2xsb3dzIHRoZSBzd2l0Y2gKK3RoZW4gb25seSBkYXRhIGZvdW5kIGluIHRob3NlIHNwZWNpZmljIHNlY3Rpb25zIHdpbGwgYmUgZHVtcGVkLgorCitAaXRlbSAtLWhpc3RvZ3JhbQorRGlzcGxheSBhIGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzIHdoZW4gZGlzcGxheWluZyB0aGUgY29udGVudHMKK29mIHRoZSBzeW1ib2wgdGFibGVzLgorCitAaXRlbSAtdgorQGl0ZW14IC0tdmVyc2lvbgorRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgcmVhZGVsZi4KKworQGl0ZW0gLUgKK0BpdGVteCAtLWhlbHAKK0Rpc3BsYXkgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIHVuZGVyc3Rvb2QgYnkgQGNvZGV7cmVhZGVsZn0uCisKK0BlbmQgdGFibGUKKworCitAbm9kZSBTZWxlY3RpbmcgVGhlIFRhcmdldCBTeXN0ZW0KK0BjaGFwdGVyIFNlbGVjdGluZyB0aGUgdGFyZ2V0IHN5c3RlbQorCitZb3UgY2FuIHNwZWNpZnkgdGhyZWUgYXNwZWN0cyBvZiB0aGUgdGFyZ2V0IHN5c3RlbSB0byB0aGUgQHNje2dudX0KK2JpbmFyeSBmaWxlIHV0aWxpdGllcywgZWFjaCBpbiBzZXZlcmFsIHdheXM6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCit0aGUgdGFyZ2V0CisKK0BpdGVtCit0aGUgYXJjaGl0ZWN0dXJlCisKK0BpdGVtCit0aGUgbGlua2VyIGVtdWxhdGlvbiAod2hpY2ggYXBwbGllcyB0byB0aGUgbGlua2VyIG9ubHkpCitAZW5kIGl0ZW1pemUKKworSW4gdGhlIGZvbGxvd2luZyBzdW1tYXJpZXMsIHRoZSBsaXN0cyBvZiB3YXlzIHRvIHNwZWNpZnkgdmFsdWVzIGFyZSBpbgorb3JkZXIgb2YgZGVjcmVhc2luZyBwcmVjZWRlbmNlLiAgVGhlIHdheXMgbGlzdGVkIGZpcnN0IG92ZXJyaWRlIHRob3NlCitsaXN0ZWQgbGF0ZXIuCisKK1RoZSBjb21tYW5kcyB0byBsaXN0IHZhbGlkIHZhbHVlcyBvbmx5IGxpc3QgdGhlIHZhbHVlcyBmb3Igd2hpY2ggdGhlCitwcm9ncmFtcyB5b3UgYXJlIHJ1bm5pbmcgd2VyZSBjb25maWd1cmVkLiAgSWYgdGhleSB3ZXJlIGNvbmZpZ3VyZWQgd2l0aAorQHNhbXB7LS1lbmFibGUtdGFyZ2V0cz1hbGx9LCB0aGUgY29tbWFuZHMgbGlzdCBtb3N0IG9mIHRoZSBhdmFpbGFibGUKK3ZhbHVlcywgYnV0IGEgZmV3IGFyZSBsZWZ0IG91dDsgbm90IGFsbCB0YXJnZXRzIGNhbiBiZSBjb25maWd1cmVkIGluIGF0CitvbmNlIGJlY2F1c2Ugc29tZSBvZiB0aGVtIGNhbiBvbmx5IGJlIGNvbmZpZ3VyZWQgQGRmbntuYXRpdmV9IChvbiBob3N0cword2l0aCB0aGUgc2FtZSB0eXBlIGFzIHRoZSB0YXJnZXQgc3lzdGVtKS4KKworQG1lbnUKKyogVGFyZ2V0IFNlbGVjdGlvbjo6ICAgICAgICAgICAgCisqIEFyY2hpdGVjdHVyZSBTZWxlY3Rpb246OiAgICAgIAorKiBMaW5rZXIgRW11bGF0aW9uIFNlbGVjdGlvbjo6ICAKK0BlbmQgbWVudQorCitAbm9kZSBUYXJnZXQgU2VsZWN0aW9uCitAc2VjdGlvbiBUYXJnZXQgU2VsZWN0aW9uCisKK0EgQGRmbnt0YXJnZXR9IGlzIGFuIG9iamVjdCBmaWxlIGZvcm1hdC4gIEEgZ2l2ZW4gdGFyZ2V0IG1heSBiZQorc3VwcG9ydGVkIGZvciBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIChAcHhyZWZ7QXJjaGl0ZWN0dXJlIFNlbGVjdGlvbn0pLgorQSB0YXJnZXQgc2VsZWN0aW9uIG1heSBhbHNvIGhhdmUgdmFyaWF0aW9ucyBmb3IgZGlmZmVyZW50IG9wZXJhdGluZworc3lzdGVtcyBvciBhcmNoaXRlY3R1cmVzLgorCitUaGUgY29tbWFuZCB0byBsaXN0IHZhbGlkIHRhcmdldCB2YWx1ZXMgaXMgQHNhbXB7b2JqZHVtcCAtaX0KKyh0aGUgZmlyc3QgY29sdW1uIG9mIG91dHB1dCBjb250YWlucyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24pLgorCitTb21lIHNhbXBsZSB2YWx1ZXMgYXJlOiBAc2FtcHthLm91dC1ocDMwMGJzZH0sIEBzYW1we2Vjb2ZmLWxpdHRsZW1pcHN9LAorQHNhbXB7YS5vdXQtc3Vub3MtYmlnfS4KKworWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB0YXJnZXQgdXNpbmcgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuICBUaGlzIGlzCit0aGUgc2FtZSBzb3J0IG9mIG5hbWUgdGhhdCBpcyBwYXNzZWQgdG8gY29uZmlndXJlIHRvIHNwZWNpZnkgYSB0YXJnZXQuCitXaGVuIHlvdSB1c2UgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQgYXMgYW4gYXJndW1lbnQsIGl0IG11c3QgYmUgZnVsbHkKK2Nhbm9uaWNhbGl6ZWQuICBZb3UgY2FuIHNlZSB0aGUgY2Fub25pY2FsIHZlcnNpb24gb2YgYSB0cmlwbGV0IGJ5CitydW5uaW5nIHRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7Y29uZmlnLnN1Yn0gd2hpY2ggaXMgaW5jbHVkZWQgd2l0aCB0aGUKK3NvdXJjZXMuCisKK1NvbWUgc2FtcGxlIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYXJlOiBAc2FtcHttNjhrLWhwLWJzZH0sCitAc2FtcHttaXBzLWRlYy11bHRyaXh9LCBAc2FtcHtzcGFyYy1zdW4tc3Vub3N9LgorCitAc3ViaGVhZGluZyBAY29kZXtvYmpkdW1wfSBUYXJnZXQKKworV2F5cyB0byBzcGVjaWZ5OgorCitAZW51bWVyYXRlCitAaXRlbQorY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LWJ9IG9yIEBzYW1wey0tdGFyZ2V0fQorCitAaXRlbQorZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQorCitAaXRlbQorZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCitAZW5kIGVudW1lcmF0ZQorCitAc3ViaGVhZGluZyBAY29kZXtvYmpjb3B5fSBhbmQgQGNvZGV7c3RyaXB9IElucHV0IFRhcmdldAorCitXYXlzIHRvIHNwZWNpZnk6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitjb21tYW5kIGxpbmUgb3B0aW9uczogQHNhbXB7LUl9IG9yIEBzYW1wey0taW5wdXQtdGFyZ2V0fSwgb3IgQHNhbXB7LUZ9IG9yIEBzYW1wey0tdGFyZ2V0fQorCitAaXRlbQorZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQorCitAaXRlbQorZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCitAZW5kIGVudW1lcmF0ZQorCitAc3ViaGVhZGluZyBAY29kZXtvYmpjb3B5fSBhbmQgQGNvZGV7c3RyaXB9IE91dHB1dCBUYXJnZXQKKworV2F5cyB0byBzcGVjaWZ5OgorCitAZW51bWVyYXRlCitAaXRlbQorY29tbWFuZCBsaW5lIG9wdGlvbnM6IEBzYW1wey1PfSBvciBAc2FtcHstLW91dHB1dC10YXJnZXR9LCBvciBAc2FtcHstRn0gb3IgQHNhbXB7LS10YXJnZXR9CisKK0BpdGVtCit0aGUgaW5wdXQgdGFyZ2V0IChzZWUgYGBAY29kZXtvYmpjb3B5fSBhbmQgQGNvZGV7c3RyaXB9IElucHV0IFRhcmdldCcnIGFib3ZlKQorCitAaXRlbQorZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQorCitAaXRlbQorZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCitAZW5kIGVudW1lcmF0ZQorCitAc3ViaGVhZGluZyBAY29kZXtubX0sIEBjb2Rle3NpemV9LCBhbmQgQGNvZGV7c3RyaW5nc30gVGFyZ2V0CisKK1dheXMgdG8gc3BlY2lmeToKKworQGVudW1lcmF0ZQorQGl0ZW0KK2NvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey0tdGFyZ2V0fQorCitAaXRlbQorZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQorCitAaXRlbQorZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCitAZW5kIGVudW1lcmF0ZQorCitAc3ViaGVhZGluZyBMaW5rZXIgSW5wdXQgVGFyZ2V0CisKK1dheXMgdG8gc3BlY2lmeToKKworQGVudW1lcmF0ZQorQGl0ZW0KK2NvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1ifSBvciBAc2FtcHstLWZvcm1hdH0KKyhAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKKworQGl0ZW0KK3NjcmlwdCBjb21tYW5kIEBjb2Rle1RBUkdFVH0KKyhAcHhyZWZ7T3B0aW9uIENvbW1hbmRzLCxPcHRpb24gQ29tbWFuZHMsbGQuaW5mbyxVc2luZyBMRH0pCisKK0BpdGVtCitlbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtHTlVUQVJHRVR9CisoQHB4cmVme0Vudmlyb25tZW50LCxFbnZpcm9ubWVudCxsZC5pbmZvLFVzaW5nIExEfSkKKworQGl0ZW0KK3RoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgc2VsZWN0ZWQgbGlua2VyIGVtdWxhdGlvbgorKEBweHJlZntMaW5rZXIgRW11bGF0aW9uIFNlbGVjdGlvbn0pCitAZW5kIGVudW1lcmF0ZQorCitAc3ViaGVhZGluZyBMaW5rZXIgT3V0cHV0IFRhcmdldAorCitXYXlzIHRvIHNwZWNpZnk6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitjb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstb2Zvcm1hdH0KKyhAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKKworQGl0ZW0KK3NjcmlwdCBjb21tYW5kIEBjb2Rle09VVFBVVF9GT1JNQVR9CisoQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQorCitAaXRlbQordGhlIGxpbmtlciBpbnB1dCB0YXJnZXQgKHNlZSBgYExpbmtlciBJbnB1dCBUYXJnZXQnJyBhYm92ZSkKK0BlbmQgZW51bWVyYXRlCisKK0Bub2RlIEFyY2hpdGVjdHVyZSBTZWxlY3Rpb24KK0BzZWN0aW9uIEFyY2hpdGVjdHVyZSBzZWxlY3Rpb24KKworQW4gQGRmbnthcmNoaXRlY3R1cmV9IGlzIGEgdHlwZSBvZiBAc2N7Y3B1fSBvbiB3aGljaCBhbiBvYmplY3QgZmlsZSBpcwordG8gcnVuLiAgSXRzIG5hbWUgbWF5IGNvbnRhaW4gYSBjb2xvbiwgc2VwYXJhdGluZyB0aGUgbmFtZSBvZiB0aGUKK3Byb2Nlc3NvciBmYW1pbHkgZnJvbSB0aGUgbmFtZSBvZiB0aGUgcGFydGljdWxhciBAc2N7Y3B1fS4KKworVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCBhcmNoaXRlY3R1cmUgdmFsdWVzIGlzIEBzYW1we29iamR1bXAgLWl9ICh0aGUKK3NlY29uZCBjb2x1bW4gY29udGFpbnMgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uKS4KKworU2FtcGxlIHZhbHVlczogQHNhbXB7bTY4azo2ODAyMH0sIEBzYW1we21pcHM6MzAwMH0sIEBzYW1we3NwYXJjfS4KKworQHN1YmhlYWRpbmcgQGNvZGV7b2JqZHVtcH0gQXJjaGl0ZWN0dXJlCisKK1dheXMgdG8gc3BlY2lmeToKKworQGVudW1lcmF0ZQorQGl0ZW0KK2NvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1tfSBvciBAc2FtcHstLWFyY2hpdGVjdHVyZX0KKworQGl0ZW0KK2RlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQorQGVuZCBlbnVtZXJhdGUKKworQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0sIEBjb2Rle25tfSwgQGNvZGV7c2l6ZX0sIEBjb2Rle3N0cmluZ3N9IEFyY2hpdGVjdHVyZQorCitXYXlzIHRvIHNwZWNpZnk6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitkZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKK0BlbmQgZW51bWVyYXRlCisKK0BzdWJoZWFkaW5nIExpbmtlciBJbnB1dCBBcmNoaXRlY3R1cmUKKworV2F5cyB0byBzcGVjaWZ5OgorCitAZW51bWVyYXRlCitAaXRlbQorZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCitAZW5kIGVudW1lcmF0ZQorCitAc3ViaGVhZGluZyBMaW5rZXIgT3V0cHV0IEFyY2hpdGVjdHVyZQorCitXYXlzIHRvIHNwZWNpZnk6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitzY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVRfQVJDSH0KKyhAcHhyZWZ7T3B0aW9uIENvbW1hbmRzLCxPcHRpb24gQ29tbWFuZHMsbGQuaW5mbyxVc2luZyBMRH0pCisKK0BpdGVtCit0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgZnJvbSB0aGUgbGlua2VyIG91dHB1dCB0YXJnZXQKKyhAcHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0pCitAZW5kIGVudW1lcmF0ZQorCitAbm9kZSBMaW5rZXIgRW11bGF0aW9uIFNlbGVjdGlvbgorQHNlY3Rpb24gTGlua2VyIGVtdWxhdGlvbiBzZWxlY3Rpb24KKworQSBsaW5rZXIgQGRmbntlbXVsYXRpb259IGlzIGEgYGBwZXJzb25hbGl0eScnIG9mIHRoZSBsaW5rZXIsIHdoaWNoIGdpdmVzCit0aGUgbGlua2VyIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgdGFyZ2V0IHN5c3RlbS4KK0luIHBhcnRpY3VsYXIsIGl0IGNvbnNpc3RzIG9mCisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCit0aGUgbGlua2VyIHNjcmlwdAorCitAaXRlbQordGhlIHRhcmdldAorCitAaXRlbQorc2V2ZXJhbCBgYGhvb2snJyBmdW5jdGlvbnMgdGhhdCBhcmUgcnVuIGF0IGNlcnRhaW4gc3RhZ2VzIG9mIHRoZSBsaW5raW5nCitwcm9jZXNzIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHRoYXQgc29tZSB0YXJnZXRzIHJlcXVpcmUKK0BlbmQgaXRlbWl6ZQorCitUaGUgY29tbWFuZCB0byBsaXN0IHZhbGlkIGxpbmtlciBlbXVsYXRpb24gdmFsdWVzIGlzIEBzYW1we2xkIC1WfS4KKworU2FtcGxlIHZhbHVlczogQHNhbXB7aHAzMDBic2R9LCBAc2FtcHttaXBzbGl0fSwgQHNhbXB7c3VuNH0uCisKK1dheXMgdG8gc3BlY2lmeToKKworQGVudW1lcmF0ZQorQGl0ZW0KK2NvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1tfQorKEBweHJlZntPcHRpb25zLCxPcHRpb25zLGxkLmluZm8sVXNpbmcgTER9KQorCitAaXRlbQorZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7TERFTVVMQVRJT059CisKK0BpdGVtCitjb21waWxlZC1pbiBAY29kZXtERUZBVUxUX0VNVUxBVElPTn0gZnJvbSBAZmlsZXtNYWtlZmlsZX0sCit3aGljaCBjb21lcyBmcm9tIEBjb2Rle0VNVUx9IGluIEBmaWxle2NvbmZpZy9AdmFye3RhcmdldH0ubXR9CitAZW5kIGVudW1lcmF0ZQorCitAbm9kZSBSZXBvcnRpbmcgQnVncworQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKK0BjaW5kZXggYnVncworQGNpbmRleCByZXBvcnRpbmcgYnVncworCitZb3VyIGJ1ZyByZXBvcnRzIHBsYXkgYW4gZXNzZW50aWFsIHJvbGUgaW4gbWFraW5nIHRoZSBiaW5hcnkgdXRpbGl0aWVzCityZWxpYWJsZS4KKworUmVwb3J0aW5nIGEgYnVnIG1heSBoZWxwIHlvdSBieSBicmluZ2luZyBhIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbSwgb3IKK2l0IG1heSBub3QuICBCdXQgaW4gYW55IGNhc2UgdGhlIHByaW5jaXBhbCBmdW5jdGlvbiBvZiBhIGJ1ZyByZXBvcnQgaXMKK3RvIGhlbHAgdGhlIGVudGlyZSBjb21tdW5pdHkgYnkgbWFraW5nIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIGJpbmFyeQordXRpbGl0aWVzIHdvcmsgYmV0dGVyLiAgQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZWlyCittYWludGVuYW5jZS4KKworSW4gb3JkZXIgZm9yIGEgYnVnIHJlcG9ydCB0byBzZXJ2ZSBpdHMgcHVycG9zZSwgeW91IG11c3QgaW5jbHVkZSB0aGUKK2luZm9ybWF0aW9uIHRoYXQgZW5hYmxlcyB1cyB0byBmaXggdGhlIGJ1Zy4KKworQG1lbnUKKyogQnVnIENyaXRlcmlhOjogICAgICAgICAgICAgICAgSGF2ZSB5b3UgZm91bmQgYSBidWc/CisqIEJ1ZyBSZXBvcnRpbmc6OiAgICAgICAgICAgICAgIEhvdyB0byByZXBvcnQgYnVncworQGVuZCBtZW51CisKK0Bub2RlIEJ1ZyBDcml0ZXJpYQorQHNlY3Rpb24gSGF2ZSB5b3UgZm91bmQgYSBidWc/CitAY2luZGV4IGJ1ZyBjcml0ZXJpYQorCitJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgeW91IGhhdmUgZm91bmQgYSBidWcsIGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGNpbmRleCBmYXRhbCBzaWduYWwKK0BjaW5kZXggY3Jhc2gKK0BpdGVtCitJZiBhIGJpbmFyeSB1dGlsaXR5IGdldHMgYSBmYXRhbCBzaWduYWwsIGZvciBhbnkgaW5wdXQgd2hhdGV2ZXIsIHRoYXQgaXMKK2EgYnVnLiAgUmVsaWFibGUgdXRpbGl0aWVzIG5ldmVyIGNyYXNoLgorCitAY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0CitAaXRlbQorSWYgYSBiaW5hcnkgdXRpbGl0eSBwcm9kdWNlcyBhbiBlcnJvciBtZXNzYWdlIGZvciB2YWxpZCBpbnB1dCwgdGhhdCBpcyBhCitidWcuCisKK0BpdGVtCitJZiB5b3UgYXJlIGFuIGV4cGVyaWVuY2VkIHVzZXIgb2YgYmluYXJ5IHV0aWxpdGllcywgeW91ciBzdWdnZXN0aW9ucyBmb3IKK2ltcHJvdmVtZW50IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIEJ1ZyBSZXBvcnRpbmcKK0BzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncworQGNpbmRleCBidWcgcmVwb3J0cworQGNpbmRleCBidWdzLCByZXBvcnRpbmcKKworQSBudW1iZXIgb2YgY29tcGFuaWVzIGFuZCBpbmRpdmlkdWFscyBvZmZlciBzdXBwb3J0IGZvciBAc2N7Z251fQorcHJvZHVjdHMuICBJZiB5b3Ugb2J0YWluZWQgdGhlIGJpbmFyeSB1dGlsaXRpZXMgZnJvbSBhIHN1cHBvcnQKK29yZ2FuaXphdGlvbiwgd2UgcmVjb21tZW5kIHlvdSBjb250YWN0IHRoYXQgb3JnYW5pemF0aW9uIGZpcnN0LgorCitZb3UgY2FuIGZpbmQgY29udGFjdCBpbmZvcm1hdGlvbiBmb3IgbWFueSBzdXBwb3J0IGNvbXBhbmllcyBhbmQKK2luZGl2aWR1YWxzIGluIHRoZSBmaWxlIEBmaWxle2V0Yy9TRVJWSUNFfSBpbiB0aGUgQHNje2dudX0gRW1hY3MKK2Rpc3RyaWJ1dGlvbi4KKworSW4gYW55IGV2ZW50LCB3ZSBhbHNvIHJlY29tbWVuZCB0aGF0IHlvdSBzZW5kIGJ1ZyByZXBvcnRzIGZvciB0aGUgYmluYXJ5Cit1dGlsaXRpZXMgdG8gQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCisKK1RoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKK0BzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKK2ZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKKworT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUKK3Byb2JsZW0gYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0Cithc3N1bWUgdGhhdCB0aGUgbmFtZSBvZiBhIGZpbGUgeW91IHVzZSBpbiBhbiBleGFtcGxlIGRvZXMgbm90IG1hdHRlci4KK1dlbGwsIHByb2JhYmx5IGl0IGRvZXMgbm90LCBidXQgb25lIGNhbm5vdCBiZSBzdXJlLiAgUGVyaGFwcyB0aGUgYnVnIGlzCithIHN0cmF5IG1lbW9yeSByZWZlcmVuY2Ugd2hpY2ggaGFwcGVucyB0byBmZXRjaCBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZQordGhhdCBwYXRobmFtZSBpcyBzdG9yZWQgaW4gbWVtb3J5OyBwZXJoYXBzLCBpZiB0aGUgcGF0aG5hbWUgd2VyZQorZGlmZmVyZW50LCB0aGUgY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSB1dGlsaXR5IGludG8KK2RvaW5nIHRoZSByaWdodCB0aGluZyBkZXNwaXRlIHRoZSBidWcuICBQbGF5IGl0IHNhZmUgYW5kIGdpdmUgYQorc3BlY2lmaWMsIGNvbXBsZXRlIGV4YW1wbGUuICBUaGF0IGlzIHRoZSBlYXNpZXN0IHRoaW5nIGZvciB5b3UgdG8gZG8sCithbmQgdGhlIG1vc3QgaGVscGZ1bC4KKworS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHB1cnBvc2Ugb2YgYSBidWcgcmVwb3J0IGlzIHRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZyBpZgoraXQgaXMgbmV3IHRvIHVzLiAgVGhlcmVmb3JlLCBhbHdheXMgd3JpdGUgeW91ciBidWcgcmVwb3J0cyBvbiB0aGUgYXNzdW1wdGlvbgordGhhdCB0aGUgYnVnIGhhcyBub3QgYmVlbiByZXBvcnRlZCBwcmV2aW91c2x5LgorCitTb21ldGltZXMgcGVvcGxlIGdpdmUgYSBmZXcgc2tldGNoeSBmYWN0cyBhbmQgYXNrLCBgYERvZXMgdGhpcyByaW5nIGEKK2JlbGw/JycgIFRob3NlIGJ1ZyByZXBvcnRzIGFyZSB1c2VsZXNzLCBhbmQgd2UgdXJnZSBldmVyeW9uZSB0bworQGVtcGh7cmVmdXNlIHRvIHJlc3BvbmQgdG8gdGhlbX0gZXhjZXB0IHRvIGNoaWRlIHRoZSBzZW5kZXIgdG8gcmVwb3J0CitidWdzIHByb3Blcmx5LgorCitUbyBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcsIHlvdSBzaG91bGQgaW5jbHVkZSBhbGwgdGhlc2UgdGhpbmdzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVGhlIHZlcnNpb24gb2YgdGhlIHV0aWxpdHkuICBFYWNoIHV0aWxpdHkgYW5ub3VuY2VzIGl0IGlmIHlvdSBzdGFydCBpdAord2l0aCB0aGUgQHNhbXB7LS12ZXJzaW9ufSBhcmd1bWVudC4KKworV2l0aG91dCB0aGlzLCB3ZSB3aWxsIG5vdCBrbm93IHdoZXRoZXIgdGhlcmUgaXMgYW55IHBvaW50IGluIGxvb2tpbmcgZm9yCit0aGUgYnVnIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGJpbmFyeSB1dGlsaXRpZXMuCisKK0BpdGVtCitBbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgc291cmNlLCBpbmNsdWRpbmcgYW55IHBhdGNoZXMKK21hZGUgdG8gdGhlIEBjb2Rle0JGRH0gbGlicmFyeS4KKworQGl0ZW0KK1RoZSB0eXBlIG9mIG1hY2hpbmUgeW91IGFyZSB1c2luZywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgYW5kCit2ZXJzaW9uIG51bWJlci4KKworQGl0ZW0KK1doYXQgY29tcGlsZXIgKGFuZCBpdHMgdmVyc2lvbikgd2FzIHVzZWQgdG8gY29tcGlsZSB0aGUgdXRpbGl0aWVzLS0tZS5nLgorYGBAY29kZXtnY2MtMi43fScnLgorCitAaXRlbQorVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSB1dGlsaXR5IHRvIG9ic2VydmUgdGhlIGJ1Zy4gIFRvCitndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwgbGlzdCB0aGVtIGFsbC4gIEEgY29weQorb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMgc3VmZmljaWVudC4KKworSWYgd2Ugd2VyZSB0byB0cnkgdG8gZ3Vlc3MgdGhlIGFyZ3VtZW50cywgd2Ugd291bGQgcHJvYmFibHkgZ3Vlc3Mgd3JvbmcKK2FuZCB0aGVuIHdlIG1pZ2h0IG5vdCBlbmNvdW50ZXIgdGhlIGJ1Zy4KKworQGl0ZW0KK0EgY29tcGxldGUgaW5wdXQgZmlsZSwgb3Igc2V0IG9mIGlucHV0IGZpbGVzLCB0aGF0IHdpbGwgcmVwcm9kdWNlIHRoZQorYnVnLiAgSWYgdGhlIHV0aWxpdHkgaXMgcmVhZGluZyBhbiBvYmplY3QgZmlsZSBvciBmaWxlcywgdGhlbiBpdCBpcworZ2VuZXJhbGx5IG1vc3QgaGVscGZ1bCB0byBzZW5kIHRoZSBhY3R1YWwgb2JqZWN0IGZpbGVzLCB1dWVuY29kZWQgaWYKK25lY2Vzc2FyeSB0byBnZXQgdGhlbSB0aHJvdWdoIHRoZSBtYWlsIHN5c3RlbS4gIE1ha2luZyB0aGVtIGF2YWlsYWJsZQorZm9yIGFub255bW91cyBGVFAgaXMgbm90IGFzIGdvb2QsIGJ1dCBtYXkgYmUgdGhlIG9ubHkgcmVhc29uYWJsZSBjaG9pY2UKK2ZvciBsYXJnZSBvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBzb3VyY2UgZmlsZXMgd2VyZSBwcm9kdWNlZCBleGNsdXNpdmVseSB1c2luZyBAc2N7Z251fSBwcm9ncmFtcworKGUuZy4sIEBjb2Rle2djY30sIEBjb2Rle2dhc30sIGFuZC9vciB0aGUgQHNje2dudX0gQGNvZGV7bGR9KSwgdGhlbiBpdAorbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUgb2JqZWN0IGZpbGVzLiAgSW4KK3RoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YgQGNvZGV7Z2NjfSwgb3IKK3doYXRldmVyLCB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheSBob3cKK0Bjb2Rle2djY30sIG9yIHdoYXRldmVyLCB3YXMgY29uZmlndXJlZC4KKworQGl0ZW0KK0EgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCitpbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCisKK09mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IHRoZSB1dGlsaXR5IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKK3dpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0Citub3Qgbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cworYSBjaGFuY2UgdG8gbWFrZSBhIG1pc3Rha2UuCisKK0V2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwKK3NheSBzbyBleHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcywgeW91cgorY29weSBvZiB0aGUgdXRpbGl0eSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluCit0aGUgQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodAorY3Jhc2ggYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbgorb3VycyBmYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yCit1cy4gIElmIHlvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUKK3RvIGRyYXcgYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgorCitAaXRlbQorSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UsIHNlbmQgdXMgY29udGV4dCBkaWZmcywgYXMKK2dlbmVyYXRlZCBieSBAY29kZXtkaWZmfSB3aXRoIHRoZSBAc2FtcHstdX0sIEBzYW1wey1jfSwgb3IgQHNhbXB7LXB9CitvcHRpb24uICBBbHdheXMgc2VuZCBkaWZmcyBmcm9tIHRoZSBvbGQgZmlsZSB0byB0aGUgbmV3IGZpbGUuICBJZiB5b3UKK2V2ZW4gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5IGNvbnRleHQsCitub3QgYnkgbGluZSBudW1iZXIuCisKK1RoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgorc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCitAZW5kIGl0ZW1pemUKKworSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0EgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCisKK09mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZword2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAorY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCisKK1RoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCit3aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCit3aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KK1dlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCisKK09mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQorb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKK291dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKK2xlc3MgdGltZSwgYW5kIHNvIG9uLgorCitIb3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAorcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgorCitAaXRlbQorQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KKworQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAordGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CithIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCit0byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KKworU29tZXRpbWVzIHdpdGggcHJvZ3JhbXMgYXMgY29tcGxpY2F0ZWQgYXMgdGhlIGJpbmFyeSB1dGlsaXRpZXMgaXQgaXMKK3ZlcnkgaGFyZCB0byBjb25zdHJ1Y3QgYW4gZXhhbXBsZSB0aGF0IHdpbGwgbWFrZSB0aGUgcHJvZ3JhbSBmb2xsb3cgYQorY2VydGFpbiBwYXRoIHRocm91Z2ggdGhlIGNvZGUuICBJZiB5b3UgZG8gbm90IHNlbmQgdXMgdGhlIGV4YW1wbGUsIHdlCit3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnN0cnVjdCBvbmUsIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gdmVyaWZ5IHRoYXQKK3RoZSBidWcgaXMgZml4ZWQuCisKK0FuZCBpZiB3ZSBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGJ1ZyB5b3UgYXJlIHRyeWluZyB0byBmaXgsIG9yIHdoeSB5b3VyCitwYXRjaCBzaG91bGQgYmUgYW4gaW1wcm92ZW1lbnQsIHdlIHdpbGwgbm90IGluc3RhbGwgaXQuICBBIHRlc3QgY2FzZSB3aWxsCitoZWxwIHVzIHRvIHVuZGVyc3RhbmQuCisKK0BpdGVtCitBIGd1ZXNzIGFib3V0IHdoYXQgdGhlIGJ1ZyBpcyBvciB3aGF0IGl0IGRlcGVuZHMgb24uCisKK1N1Y2ggZ3Vlc3NlcyBhcmUgdXN1YWxseSB3cm9uZy4gIEV2ZW4gd2UgY2Fubm90IGd1ZXNzIHJpZ2h0IGFib3V0IHN1Y2gKK3RoaW5ncyB3aXRob3V0IGZpcnN0IHVzaW5nIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBmYWN0cy4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBJbmRleAorQHVubnVtYmVyZWQgSW5kZXgKKworQHByaW50aW5kZXggY3AKKworQGNvbnRlbnRzCitAYnllCmRpZmYgLS1naXQgYS9iaW51dGlscy9idWNvbW0uYyBiL2JpbnV0aWxzL2J1Y29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YjAwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9idWNvbW0uYwpAQCAtMCwwICsxLDI2NiBAQAorLyogYnVjb21tLmMgLS0gQmluIFV0aWxzIENPTW1vbiBjb2RlLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwwKKy8qIFdlIG1pZ2h0IHB1dCB0aGlzIGluIGEgbGlicmFyeSBzb21lZGF5IHNvIGl0IGNvdWxkIGJlIGR5bmFtaWNhbGx5CisgICBsb2FkZWQsIGJ1dCBmb3Igbm93IGl0J3Mgbm90IG5lY2Vzc2FyeS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgkJLyogY3RpbWUsIG1heWJlIHRpbWVfdCAqLworCisjaWZuZGVmIEhBVkVfVElNRV9UX0lOX1RJTUVfSAorI2lmbmRlZiBIQVZFX1RJTUVfVF9JTl9UWVBFU19ICit0eXBlZGVmIGxvbmcgdGltZV90OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKwwKKy8qIEVycm9yIHJlcG9ydGluZyAqLworCitjaGFyICpwcm9ncmFtX25hbWU7CisKK3ZvaWQKK2JmZF9ub25mYXRhbCAoc3RyaW5nKQorICAgICBDT05TVCBjaGFyICpzdHJpbmc7Cit7CisgIENPTlNUIGNoYXIgKmVycm1zZyA9IGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpOworCisgIGlmIChzdHJpbmcpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHJpbmcsIGVycm1zZyk7CisgIGVsc2UKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgZXJybXNnKTsKK30KKwordm9pZAorYmZkX2ZhdGFsIChzdHJpbmcpCisgICAgIENPTlNUIGNoYXIgKnN0cmluZzsKK3sKKyAgYmZkX25vbmZhdGFsIChzdHJpbmcpOworICB4ZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCityZXBvcnQgKGZvcm1hdCwgYXJncykKKyAgICAgY29uc3QgY2hhciAqIGZvcm1hdDsKKyAgICAgdmFfbGlzdCBhcmdzOworeworICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKK30KKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwordm9pZAorZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJlcG9ydCAoZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgeGV4aXQgKDEpOworfQorCit2b2lkCitub25fZmF0YWwgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJlcG9ydCAoZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKK30KKyNlbHNlCit2b2lkIAorZmF0YWwgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKK3sKKyAgY2hhciAqRm9ybWF0OworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBGb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisgIHJlcG9ydCAoRm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgeGV4aXQgKDEpOworfQorCit2b2lkIAorbm9uX2ZhdGFsICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCit7CisgIGNoYXIgKkZvcm1hdDsKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgRm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworICByZXBvcnQgKEZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7Cit9CisjZW5kaWYKKworLyogU2V0IHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0LiAgRG9pbmcKKyAgIHRoaXMgcGVybWl0cyB0aGUgYmludXRpbHMgdG8gYmUgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCwKKyAgIGFuZCBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBCRkQgbGlicmFyeSB3aGljaCB3YXMgY29uZmlndXJlZCBmb3IgYQorICAgZGlmZmVyZW50IHRhcmdldC4gICovCisKK3ZvaWQKK3NldF9kZWZhdWx0X2JmZF90YXJnZXQgKCkKK3sKKyAgLyogVGhlIG1hY3JvIFRBUkdFVCBpcyBkZWZpbmVkIGJ5IE1ha2VmaWxlLiAgKi8KKyAgY29uc3QgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOworCisgIGlmICghIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKHRhcmdldCkpCisgICAgZmF0YWwgKF8oImNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJXMiKSwKKwkgICB0YXJnZXQsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKK30KKworLyogQWZ0ZXIgYSBmYWxzZSByZXR1cm4gZnJvbSBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgd2l0aAorICAgYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkLCBwcmludAorICAgdGhlIHBvc3NpYmxlIG1hdGNoaW5nIHRhcmdldHMuICAqLworCit2b2lkCitsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKHApCisgICAgIGNoYXIgKipwOworeworICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBNYXRjaGluZyBmb3JtYXRzOiIpLCBwcm9ncmFtX25hbWUpOworICB3aGlsZSAoKnApCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgKnArKyk7CisgIGZwdXRjICgnXG4nLCBzdGRlcnIpOworfQorCisvKiBMaXN0IHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cy4gICovCisKK3ZvaWQKK2xpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKG5hbWUsIGYpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIEZJTEUgKmY7Cit7CisgIGV4dGVybiBiZmRfdGFyZ2V0ICpiZmRfdGFyZ2V0X3ZlY3RvcltdOworICBpbnQgdDsKKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIGZwcmludGYgKGYsIF8oIlN1cHBvcnRlZCB0YXJnZXRzOiIpKTsKKyAgZWxzZQorICAgIGZwcmludGYgKGYsIF8oIiVzOiBzdXBwb3J0ZWQgdGFyZ2V0czoiKSwgbmFtZSk7CisgIGZvciAodCA9IDA7IGJmZF90YXJnZXRfdmVjdG9yW3RdICE9IE5VTEw7IHQrKykKKyAgICBmcHJpbnRmIChmLCAiICVzIiwgYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpOworICBmcHJpbnRmIChmLCAiXG4iKTsKK30KKwwKKy8qIERpc3BsYXkgdGhlIGFyY2hpdmUgaGVhZGVyIGZvciBhbiBlbGVtZW50IGFzIGlmIGl0IHdlcmUgYW4gbHMgLWwgbGlzdGluZzoKKworICAgTW9kZSAgICAgICBVc2VyXHRHcm91cFx0U2l6ZVx0RGF0ZSAgICAgICAgICAgICAgIE5hbWUgKi8KKwordm9pZAorcHJpbnRfYXJlbHRfZGVzY3IgKGZpbGUsIGFiZmQsIHZlcmJvc2UpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiB2ZXJib3NlOworeworICBzdHJ1Y3Qgc3RhdCBidWY7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgeworICAgICAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSA9PSAwKQorCXsKKwkgIGNoYXIgbW9kZWJ1ZlsxMV07CisJICBjaGFyIHRpbWVidWZbNDBdOworCSAgdGltZV90IHdoZW4gPSBidWYuc3RfbXRpbWU7CisJICBDT05TVCBjaGFyICpjdGltZV9yZXN1bHQgPSAoQ09OU1QgY2hhciAqKSBjdGltZSAoJndoZW4pOworCisJICAvKiBQT1NJWCBmb3JtYXQ6ICBza2lwIHdlZWtkYXkgYW5kIHNlY29uZHMgZnJvbSBjdGltZSBvdXRwdXQuICAqLworCSAgc3ByaW50ZiAodGltZWJ1ZiwgIiUuMTJzICUuNHMiLCBjdGltZV9yZXN1bHQgKyA0LCBjdGltZV9yZXN1bHQgKyAyMCk7CisKKwkgIG1vZGVfc3RyaW5nIChidWYuc3RfbW9kZSwgbW9kZWJ1Zik7CisJICBtb2RlYnVmWzEwXSA9ICdcMCc7CisJICAvKiBQT1NJWCAxMDAzLjIvRDExIHNheXMgdG8gc2tpcCBmaXJzdCBjaGFyYWN0ZXIgKGVudHJ5IHR5cGUpLiAgKi8KKwkgIGZwcmludGYgKGZpbGUsICIlcyAlbGQvJWxkICU2bGQgJXMgIiwgbW9kZWJ1ZiArIDEsCisJCSAgIChsb25nKSBidWYuc3RfdWlkLCAobG9uZykgYnVmLnN0X2dpZCwKKwkJICAgKGxvbmcpIGJ1Zi5zdF9zaXplLCB0aW1lYnVmKTsKKwl9CisgICAgfQorCisgIGZwcmludGYgKGZpbGUsICIlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworfQorCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgRklMRU5BTUUuICAqLworCitjaGFyICoKK21ha2VfdGVtcG5hbWUgKGZpbGVuYW1lKQorICAgICBjaGFyICpmaWxlbmFtZTsKK3sKKyAgc3RhdGljIGNoYXIgdGVtcGxhdGVbXSA9ICJzdFhYWFhYWCI7CisgIGNoYXIgKnRtcG5hbWU7CisgIGNoYXIgKnNsYXNoID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7CisKKyNpZiBkZWZpbmVkIChfX0RKR1BQX18pIHx8IGRlZmluZWQgKF9fR08zMl9fKSB8fCBkZWZpbmVkIChfV0lOMzIpCisgIGlmIChzbGFzaCA9PSBOVUxMKQorICAgIHNsYXNoID0gc3RycmNociAoZmlsZW5hbWUsICdcXCcpOworI2VuZGlmCisKKyAgaWYgKHNsYXNoICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgY2hhciBjOworCisgICAgICBjID0gKnNsYXNoOworICAgICAgKnNsYXNoID0gMDsKKyAgICAgIHRtcG5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKSArIHNpemVvZiAodGVtcGxhdGUpICsgMSk7CisgICAgICBzdHJjcHkgKHRtcG5hbWUsIGZpbGVuYW1lKTsKKyAgICAgIHN0cmNhdCAodG1wbmFtZSwgIi8iKTsKKyAgICAgIHN0cmNhdCAodG1wbmFtZSwgdGVtcGxhdGUpOworICAgICAgbWt0ZW1wICh0bXBuYW1lKTsKKyAgICAgICpzbGFzaCA9IGM7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wbmFtZSA9IHhtYWxsb2MgKHNpemVvZiAodGVtcGxhdGUpKTsKKyAgICAgIHN0cmNweSAodG1wbmFtZSwgdGVtcGxhdGUpOworICAgICAgbWt0ZW1wICh0bXBuYW1lKTsKKyAgICB9CisgIHJldHVybiB0bXBuYW1lOworfQorCisvKiBQYXJzZSBhIHN0cmluZyBpbnRvIGEgVk1BLCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgaXQgY2FuJ3QgYmUKKyAgIHBhcnNlZC4gICovCisKK2JmZF92bWEKK3BhcnNlX3ZtYSAocywgYXJnKQorICAgICBjb25zdCBjaGFyICpzOworICAgICBjb25zdCBjaGFyICphcmc7Cit7CisgIGJmZF92bWEgcmV0OworICBjb25zdCBjaGFyICplbmQ7CisKKyAgcmV0ID0gYmZkX3NjYW5fdm1hIChzLCAmZW5kLCAwKTsKKyAgCisgIGlmICgqZW5kICE9ICdcMCcpCisgICAgZmF0YWwgKF8oIiVzOiBiYWQgbnVtYmVyOiAlcyIpLCBhcmcsIHMpOworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9idWNvbW0uaCBiL2JpbnV0aWxzL2J1Y29tbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZTZhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9idWNvbW0uaApAQCAtMCwwICsxLDE4MyBAQAorLyogYnVjb21tLmggLS0gYmludXRpbHMgY29tbW9uIGluY2x1ZGUgZmlsZS4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwwKKyNpZm5kZWYgX0JVQ09NTV9ICisjZGVmaW5lIF9CVUNPTU1fSAorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCisjaW5jbHVkZSAiZm9wZW4tYmluLmgiCisjZWxzZQorI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZm5kZWYgZXJybm8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbHNlCitleHRlcm4gY2hhciAqc3RyY2hyICgpOworZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NZU19GSUxFX0gKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCitleHRlcm4gY2hhciAqc3Ryc3RyICgpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NCUksKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKK2V4dGVybiBjaGFyICpzYnJrICgpOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCitleHRlcm4gY2hhciAqZ2V0ZW52ICgpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisjaWZuZGVmIE9fUkRPTkxZCisjZGVmaW5lIE9fUkRPTkxZIDAKKyNlbmRpZgorCisjaWZuZGVmIE9fUkRXUgorI2RlZmluZSBPX1JEV1IgMgorI2VuZGlmCisKKyNpZm5kZWYgU0VFS19TRVQKKyNkZWZpbmUgU0VFS19TRVQgMAorI2VuZGlmCisjaWZuZGVmIFNFRUtfQ1VSCisjZGVmaW5lIFNFRUtfQ1VSIDEKKyNlbmRpZgorI2lmbmRlZiBTRUVLX0VORAorI2RlZmluZSBTRUVLX0VORCAyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKENfQUxMT0NBKQorIyB1bmRlZiBhbGxvY2EKKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQorIyAgaW5jbHVkZSA8YWxsb2NhLmg+CisjIGVsc2UKKyMgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCisjICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQorY2hhciAqYWxsb2NhICgpOworIyAgIGVsc2UKK3ZvaWQgKmFsbG9jYSAoKTsKKyMgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCisjICBlbmRpZiAvKiBhbGxvY2EgKi8KKyMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xPQ0FMRV9ICisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTkxTCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCisjIGlmZGVmIGdldHRleHRfbm9vcAorIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCisjIGVsc2UKKyMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCisjIGVuZGlmCisjZWxzZQorLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KKyMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCisjIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCisjIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQorIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCisjIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCisjZW5kaWYKKworLyogYnVjb21tLmMgKi8KK3ZvaWQgYmZkX25vbmZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOworCit2b2lkIGJmZF9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKKwordm9pZCBmYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOworCit2b2lkIG5vbl9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOworCit2b2lkIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgUEFSQU1TICgodm9pZCkpOworCit2b2lkIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyBQQVJBTVMgKChjaGFyICoqcCkpOworCit2b2lkIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBGSUxFICopKTsKKwordm9pZCBwcmludF9hcmVsdF9kZXNjciBQQVJBTVMgKChGSUxFICpmaWxlLCBiZmQgKmFiZmQsIGJvb2xlYW4gdmVyYm9zZSkpOworCitjaGFyICptYWtlX3RlbXBuYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCitiZmRfdm1hIHBhcnNlX3ZtYSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworCitleHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOworCisvKiBmaWxlbW9kZS5jICovCit2b2lkIG1vZGVfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbW9kZSwgY2hhciAqYnVmKSk7CisKKy8qIHZlcnNpb24uYyAqLworZXh0ZXJuIHZvaWQgcHJpbnRfdmVyc2lvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworLyogcmVuYW1lLmMgKi8KK2V4dGVybiB2b2lkIHNldF90aW1lcyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBzdGF0ICopKTsKKworZXh0ZXJuIGludCBzbWFydF9yZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOworCisvKiBsaWJpYmVydHkgKi8KK1BUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworCitQVFIgeHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKKworI2VuZGlmIC8qIF9CVUNPTU1fSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVkYmcuaCBiL2JpbnV0aWxzL2J1ZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZTg4OQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2J1ZGJnLmgKQEAgLTAsMCArMSw1OCBAQAorLyogYnVkYmcuYyAtLSBJbnRlcmZhY2VzIHRvIHRoZSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiByb3V0aW5lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIEJVREJHX0gKKyNkZWZpbmUgQlVEQkdfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogUm91dGluZSB1c2VkIHRvIHJlYWQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCitleHRlcm4gUFRSIHJlYWRfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcpKTsKKworLyogUm91dGluZSB1c2VkIHRvIHByaW50IGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gcHJpbnRfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoRklMRSAqLCBQVFIpKTsKKworLyogUm91dGluZXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBzdGFicyBpbmZvcm1hdGlvbi4gICovCisKK2V4dGVybiBQVFIgc3RhcnRfc3RhYiBQQVJBTVMgKChQVFIsIGJmZCAqLCBib29sZWFuLCBhc3ltYm9sICoqLCBsb25nKSk7CisKK2V4dGVybiBib29sZWFuIGZpbmlzaF9zdGFiIFBBUkFNUyAoKFBUUiwgUFRSKSk7CisKK2V4dGVybiBib29sZWFuIHBhcnNlX3N0YWIgUEFSQU1TICgoUFRSLCBQVFIsIGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKKworZXh0ZXJuIGJvb2xlYW4gd3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8KKyAgUEFSQU1TICgoYmZkICosIFBUUiwgYmZkX2J5dGUgKiosIGJmZF9zaXplX3R5cGUgKiwgYmZkX2J5dGUgKiosCisJICAgYmZkX3NpemVfdHlwZSAqKSk7CisKKy8qIFJvdXRpbmVzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCitleHRlcm4gYm9vbGVhbiBwYXJzZV9pZWVlCisgIFBBUkFNUyAoKFBUUiwgYmZkICosIGNvbnN0IGJmZF9ieXRlICosIGJmZF9zaXplX3R5cGUpKTsKKworZXh0ZXJuIGJvb2xlYW4gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSKSk7CisKKy8qIFJvdXRpbmUgdXNlZCB0byByZWFkIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gcGFyc2VfY29mZiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmR1bXAuYyBiL2JpbnV0aWxzL2NvZmZkdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4NGQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2NvZmZkdW1wLmMKQEAgLTAsMCArMSw1NDEgQEAKKy8qIENvZmYgZmlsZSBkdW1wZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+CisKKyAgIFRoaXMgbW9kdWxlIHJlYWRzIGEgdHlwZSB0cmVlIGdlbmVyYXRlZCBieSBjb2ZmZ3JvayBhbmQgcHJpbnRzCisgICBpdCBvdXQgc28gd2UgY2FuIHRlc3QgdGhlIGdyb2trZXIuCisqLworCisjaW5jbHVkZSA8YmZkLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bGliaWJlcnR5Lmg+CisKKyNpbmNsdWRlICJjb2ZmZ3Jvay5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorCisjZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS4wIgorCitzdGF0aWMgaW50IGF0bmw7CitzdGF0aWMgdm9pZCBkdW1wX2NvZmZfc2NvcGUgKCk7CisKK3N0YXRpYyB2b2lkCit0YWIgKHgpCitpbnQgeDsKK3sKKyAgc3RhdGljIGludCBpbmRlbnQ7CisgIGludCBpOworCisgIGlmIChhdG5sKQorICAgIHsKKyAgICAgIGlmICh4IDwgMCkKKwl7CisJICBwcmludGYgKCIpIik7CisJICBpbmRlbnQgKz0geDsKKworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKCJcbiIpOworCSAgYXRubCA9IDA7CisJfQorICAgIH0KKworICBpZiAoeCA9PSAtMSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCisJcHJpbnRmICgiICAgIik7CisKKyAgICAgIGluZGVudCArPSB4OworICAgICAgcHJpbnRmICgiKSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbmRlbnQgKz0geDsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCisgICAgcHJpbnRmICgiICAgIik7CisKKyAgaWYgKHgpCisgICAgeworICAgICAgcHJpbnRmICgiKCIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbmwgKCkKK3sKKyAgYXRubCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2NvZmZfbGluZXMgKHApCisgICAgIHN0cnVjdCBjb2ZmX2xpbmUgKnA7Cit7CisgIGludCBpOworICBpbnQgb25saW5lID0gMDsKKyAgdGFiKDEpOworICBwcmludGYoXygiI2xpbmVzICVkICIpLHAtPm5saW5lcyk7CisgIGZvciAoaSA9IDA7IGkgPCBwLT5ubGluZXM7IGkrKykgCisgICAgeworICAgICAgcHJpbnRmKCIoJWQgMHgleCkiLCBwLT5saW5lc1tpXSwgcC0+YWRkcmVzc2VzW2ldKTsKKyAgICAgIG9ubGluZSsrOworICAgICAgaWYgKG9ubGluZSA+IDYpCisJeworCSAgbmwoKTsKKwkgIHRhYigwKTsKKwkgIG9ubGluZSA9IDA7CisJfQorICAgIH0KKyAgbmwoKTsKKyAgdGFiKC0xKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfY29mZl90eXBlIChwKQorICAgICBzdHJ1Y3QgY29mZl90eXBlICpwOworeworICB0YWIgKDEpOworICBwcmludGYgKCJzaXplICVkICIsIHAtPnNpemUpOworICBzd2l0Y2ggKHAtPnR5cGUpCisgICAgeworICAgIGNhc2UgY29mZl9zZWNkZWZfdHlwZToKKyAgICAgIHByaW50ZiAoInNlY3Rpb24gZGVmaW5pdGlvbiBhdCAleCBzaXplICV4XG4iLCAKKwkgICAgICBwLT51LmFzZWNkZWYuYWRkcmVzcywKKwkgICAgICBwLT51LmFzZWNkZWYuc2l6ZSk7CisgICAgICBubCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKKyAgICAgIHByaW50ZiAoInBvaW50ZXIgdG8iKTsKKyAgICAgIG5sICgpOworICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnUucG9pbnRlci5wb2ludHNfdG8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX2FycmF5X3R5cGU6CisgICAgICBwcmludGYgKCJhcnJheSBbJWRdIG9mIiwgcC0+dS5hcnJheS5kaW0pOworICAgICAgbmwgKCk7CisgICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5hcnJheS5hcnJheV9vZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKKyAgICAgIHByaW50ZiAoImZ1bmN0aW9uIHJldHVybmluZyIpOworICAgICAgbmwgKCk7CisgICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5mdW5jdGlvbi5mdW5jdGlvbl9yZXR1cm5zKTsKKyAgICAgIGR1bXBfY29mZl9saW5lcyAocC0+dS5mdW5jdGlvbi5saW5lcyk7CisgICAgICBwcmludGYgKCJhcmd1bWVudHMiKTsKKyAgICAgIG5sICgpOworICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMpOworICAgICAgdGFiICgwKTsKKyAgICAgIHByaW50ZiAoImNvZGUiKTsKKyAgICAgIG5sICgpOworICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmZ1bmN0aW9uLmNvZGUpOworICAgICAgdGFiKDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3N0cnVjdGRlZl90eXBlOgorICAgICAgcHJpbnRmICgic3RydWN0dXJlIGRlZmluaXRpb24iKTsKKyAgICAgIG5sICgpOworICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3N0cnVjdHJlZl90eXBlOgorICAgICAgaWYgKCFwLT51LmFlbnVtcmVmLnJlZikKKwlwcmludGYgKCJzdHJ1Y3R1cmUgcmVmIHRvIFVOS05PV04gc3RydWN0Iik7CisgICAgICBlbHNlCisJcHJpbnRmICgic3RydWN0dXJlIHJlZiB0byAlcyIsIHAtPnUuYWVudW1yZWYucmVmLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl9lbnVtcmVmX3R5cGU6CisgICAgICBwcmludGYgKCJlbnVtIHJlZiB0byAlcyIsIHAtPnUuYXN0cnVjdHJlZi5yZWYtPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX2VudW1kZWZfdHlwZToKKyAgICAgIHByaW50ZiAoImVudW0gZGVmaW5pdGlvbiIpOworICAgICAgbmwgKCk7CisgICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuYWVudW1kZWYuZWxlbWVudHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6CisgICAgICBzd2l0Y2ggKHAtPnUuYmFzaWMpCisJeworCWNhc2UgVF9OVUxMOgorCSAgcHJpbnRmICgiTlVMTCIpOworCSAgYnJlYWs7CisJY2FzZSBUX1ZPSUQ6CisJICBwcmludGYgKCJWT0lEIik7CisJICBicmVhazsKKwljYXNlIFRfQ0hBUjoKKwkgIHByaW50ZiAoIkNIQVIiKTsKKwkgIGJyZWFrOworCWNhc2UgVF9TSE9SVDoKKwkgIHByaW50ZiAoIlNIT1JUIik7CisJICBicmVhazsKKwljYXNlIFRfSU5UOgorCSAgcHJpbnRmICgiSU5UICIpOworCSAgYnJlYWs7CisJY2FzZSBUX0xPTkc6CisJICBwcmludGYgKCJMT05HIik7CisJICBicmVhazsKKwljYXNlIFRfRkxPQVQ6CisJICBwcmludGYgKCJGTE9BVCIpOworCSAgYnJlYWs7CisJY2FzZSBUX0RPVUJMRToKKwkgIHByaW50ZiAoIkRPVUJMRSIpOworCSAgYnJlYWs7CisJY2FzZSBUX1NUUlVDVDoKKwkgIHByaW50ZiAoIlNUUlVDVCIpOworCSAgYnJlYWs7CisJY2FzZSBUX1VOSU9OOgorCSAgcHJpbnRmICgiVU5JT04iKTsKKwkgIGJyZWFrOworCWNhc2UgVF9FTlVNOgorCSAgcHJpbnRmICgiRU5VTSIpOworCSAgYnJlYWs7CisJY2FzZSBUX01PRToKKwkgIHByaW50ZiAoIk1PRSAiKTsKKwkgIGJyZWFrOworCWNhc2UgVF9VQ0hBUjoKKwkgIHByaW50ZiAoIlVDSEFSIik7CisJICBicmVhazsKKwljYXNlIFRfVVNIT1JUOgorCSAgcHJpbnRmICgiVVNIT1JUIik7CisJICBicmVhazsKKwljYXNlIFRfVUlOVDoKKwkgIHByaW50ZiAoIlVJTlQiKTsKKwkgIGJyZWFrOworCWNhc2UgVF9VTE9ORzoKKwkgIHByaW50ZiAoIlVMT05HIik7CisJICBicmVhazsKKwljYXNlIFRfTE5HREJMOgorCSAgcHJpbnRmICgiTE5HREJMIik7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKyAgbmwgKCk7CisgIHRhYiAoLTEpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9jb2ZmX3doZXJlIChwKQorICAgICBzdHJ1Y3QgY29mZl93aGVyZSAqcDsKK3sKKyAgdGFiICgxKTsKKyAgc3dpdGNoIChwLT53aGVyZSkKKyAgICB7CisgICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgorICAgICAgcHJpbnRmICgiU3RhY2sgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6CisgICAgICBwcmludGYgKCJNZW1vcnkgc2VjdGlvbiAlcysleCIsIHAtPnNlY3Rpb24tPm5hbWUsIHAtPm9mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6CisgICAgICBwcmludGYgKCJSZWdpc3RlciAlZCIsIHAtPm9mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKKyAgICAgIHByaW50ZiAoIlN0cnVjdCBNZW1iZXIgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKKyAgICAgIHByaW50ZiAoIkVudW0gTWVtYmVyIG9mZnNldCAleCIsIHAtPm9mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfd2hlcmVfdW5rbm93bjoKKyAgICAgIHByaW50ZiAoIlVuZGVmaW5lZCBzeW1ib2wiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6CisgICAgICBwcmludGYgKCJTVFJUQUciKTsKKyAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6CisgICAgICBwcmludGYgKCJFTlRBRyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6CisgICAgICBwcmludGYgKCJUWVBFREVGIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICBubCAoKTsKKyAgdGFiICgtMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2NvZmZfdmlzaWJsZSAocCkKKyAgICAgc3RydWN0IGNvZmZfdmlzaWJsZSAqcDsKK3sKKyAgdGFiICgxKTsKKyAgc3dpdGNoIChwLT50eXBlKQorICAgIHsKKyAgICBjYXNlIGNvZmZfdmlzX2V4dF9kZWY6CisgICAgICBwcmludGYgKCJjb2ZmX3Zpc19leHRfZGVmIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6CisgICAgICBwcmludGYgKCJjb2ZmX3Zpc19leHRfcmVmIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6CisgICAgICBwcmludGYgKCJjb2ZmX3Zpc19pbnRfZGVmIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKKyAgICAgIHByaW50ZiAoImNvZmZfdmlzX2NvbW1vbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgorICAgICAgcHJpbnRmICgiY29mZl92aXNfYXV0byIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19hdXRvcGFyYW06CisgICAgICBwcmludGYgKCJjb2ZmX3Zpc19hdXRvcGFyYW0iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl92aXNfcmVncGFyYW06CisgICAgICBwcmludGYgKCJjb2ZmX3Zpc19yZWdwYXJhbSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKKyAgICAgIHByaW50ZiAoImNvZmZfdmlzX3JlZ2lzdGVyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfdmlzX3RhZzoKKyAgICAgIHByaW50ZiAoImNvZmZfdmlzX3RhZyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgorICAgICAgcHJpbnRmICgiY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKKyAgICAgIHByaW50ZiAoImNvZmZfdmlzX21lbWJlcl9vZl9lbnVtIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICBubCAoKTsKKyAgdGFiICgtMSk7Cit9CisKKwordm9pZAorZHVtcF9jb2ZmX3N5bWJvbCAocCkKKyAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpwOworeworICB0YWIgKDEpOworICBwcmludGYgKCJMaXN0IG9mIHN5bWJvbHMiKTsKKyAgbmwgKCk7CisgIHdoaWxlIChwKQorICAgIHsKKyAgICAgIHRhYiAoMSk7CisgICAgICB0YWIgKDEpOworICAgICAgcHJpbnRmICgiU3ltYm9sICAlcywgdGFnICVkLCBudW1iZXIgJWQiLCBwLT5uYW1lLCBwLT50YWcsIHAtPm51bWJlcik7CisgICAgICBubCAoKTsKKyAgICAgIHRhYiAoLTEpOworICAgICAgdGFiICgxKTsKKyAgICAgIHByaW50ZiAoIlR5cGUiKTsKKyAgICAgIG5sICgpOworICAgICAgZHVtcF9jb2ZmX3R5cGUgKHAtPnR5cGUpOworICAgICAgdGFiICgtMSk7CisgICAgICB0YWIgKDEpOworICAgICAgcHJpbnRmICgiV2hlcmUiKTsKKyAgICAgIGR1bXBfY29mZl93aGVyZSAocC0+d2hlcmUpOworICAgICAgdGFiICgtMSk7CisgICAgICB0YWIgKDEpOworICAgICAgcHJpbnRmICgiVmlzaWJsZSIpOworICAgICAgZHVtcF9jb2ZmX3Zpc2libGUgKHAtPnZpc2libGUpOworICAgICAgdGFiICgtMSk7CisgICAgICBwID0gcC0+bmV4dDsKKyAgICAgIHRhYiAoLTEpOworICAgIH0KKyAgdGFiICgtMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2NvZmZfc2NvcGUgKHApCisgICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpwOworeworaWYgKHApIHsKKyAgdGFiICgxKTsKKyAgcHJpbnRmICgiTGlzdCBvZiBibG9ja3MgJWx4ICIsKHVuc2lnbmVkIGxvbmcpIHApOworCisgIGlmIChwLT5zZWMpIHsKKyAgICBwcmludGYoICIgICVzICV4Li4leCIsICBwLT5zZWMtPm5hbWUscC0+b2Zmc2V0LCBwLT5vZmZzZXQgKyBwLT5zaXplIC0xKTsKKyAgfQorICBubCAoKTsKKyAgdGFiICgwKTsKKyAgcHJpbnRmICgiKioqKioqKioqKioqKioqKioiKTsKKyAgbmwgKCk7CisgIHdoaWxlIChwKQorICAgIHsKKyAgICAgIHRhYiAoMCk7CisgICAgICBwcmludGYgKCJ2YXJzICVkIiwgcC0+bnZhcnMpOworICAgICAgbmwgKCk7CisgICAgICBkdW1wX2NvZmZfc3ltYm9sIChwLT52YXJzX2hlYWQpOworICAgICAgcHJpbnRmICgiYmxvY2tzIik7CisgICAgICBubCAoKTsKKyAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+bGlzdF9oZWFkKTsKKyAgICAgIG5sICgpOworICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorCisgIHRhYiAoMCk7CisgIHByaW50ZiAoIioqKioqKioqKioqKioqKioqIik7CisgIG5sICgpOworICB0YWIgKC0xKTsKK30KK30KKworc3RhdGljIHZvaWQKK2R1bXBfY29mZl9zZmlsZSAocCkKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnA7Cit7CisgIHRhYiAoMSk7CisgIHByaW50ZiAoIkxpc3Qgb2Ygc291cmNlIGZpbGVzIik7CisgIG5sICgpOworICB3aGlsZSAocCkKKyAgICB7CisgICAgICB0YWIgKDApOworICAgICAgcHJpbnRmICgiU291cmNlIGZpbGUgJXMiLCBwLT5uYW1lKTsKKyAgICAgIG5sICgpOworICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT5zY29wZSk7CisgICAgICBwID0gcC0+bmV4dDsKKyAgICB9CisgIHRhYiAoLTEpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9jb2ZmX3NlY3Rpb24ocHRyKQorc3RydWN0IGNvZmZfc2VjdGlvbiAqcHRyOworeworICBpbnQgaTsKKyAgdGFiKDEpOworICBwcmludGYoInNlY3Rpb24gJXMgJWQgJWQgYWRkcmVzcyAleCBzaXplICV4IG51bWJlciAlZCBucmVsb2NzICVkIiwgCisJIHB0ci0+bmFtZSwgcHRyLT5jb2RlLCBwdHItPmRhdGEsIHB0ci0+YWRkcmVzcyxwdHItPnNpemUsIHB0ci0+bnVtYmVyLCBwdHItPm5yZWxvY3MpOworICBubCgpOworCisgIGZvciAoaSA9IDA7IGkgPCBwdHItPm5yZWxvY3M7IGkrKykgCisgICAgeworICAgICAgdGFiKDApOyAgICAKKyAgICAgIHByaW50ZigiKCV4ICVzICV4KSIsCisJICAgICBwdHItPnJlbG9jc1tpXS5vZmZzZXQsCisJICAgICBwdHItPnJlbG9jc1tpXS5zeW1ib2wtPm5hbWUsCisJICAgICBwdHItPnJlbG9jc1tpXS5hZGRlbmQpOworICAgICAgbmwoKTsKKyAgICB9CisgIHRhYigtMSk7CisKK30KKwordm9pZAorY29mZl9kdW1wIChwdHIpCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Cit7CisgIGludCBpOworICBwcmludGYgKCJDb2ZmIGR1bXAiKTsKKyAgbmwgKCk7CisgIHByaW50ZiAoIiNzb3VjZXMgJWQiLCBwdHItPm5zb3VyY2VzKTsKKyAgbmwgKCk7CisgIGR1bXBfY29mZl9zZmlsZSAocHRyLT5zb3VyY2VfaGVhZCk7CisgIGZvciAoaSA9IDA7IGkgPCBwdHItPm5zZWN0aW9uczsgaSsrKQorICAgIGR1bXBfY29mZl9zZWN0aW9uKHB0ci0+c2VjdGlvbnMgKyBpKTsKK30KKworCisKK2NoYXIgKiBwcm9ncmFtX25hbWU7CisKK3N0YXRpYyB2b2lkCitzaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKGZpbGUsICJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIiwgICBwcm9ncmFtX25hbWUpOworICBleGl0IChzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAorc2hvd19oZWxwICgpCit7CisgIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKKwkgIHByb2dyYW1fbmFtZSk7CisgIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Cit9CisKKworaW50CittYWluIChhYywgYXYpCisgICAgIGludCBhYzsKKyAgICAgY2hhciAqYXZbXTsKK3sKKyAgYmZkICphYmZkOworICBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKKyAgY2hhciAqKm1hdGNoaW5nOworICBjaGFyICppbnB1dF9maWxlID0gTlVMTDsKKyAgaW50IG9wdDsKKyAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQorICAgIHsKKyAgICAgIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCisgICAgICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJyB9LAorICAgICAgeyBOVUxMLCBub19hcmd1bWVudCwgMCwgMCB9CisgICAgfTsKKworI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQorICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7CisjZW5kaWYKKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisgIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIHByb2dyYW1fbmFtZSA9IGF2WzBdOworICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7CisKKyAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsCisJCQkgICAgIChpbnQgKikgTlVMTCkpCisJICE9IEVPRikKKyAgICB7CisgICAgICBzd2l0Y2ggKG9wdCkKKwl7CisJY2FzZSAnaCc6CisJICBzaG93X2hlbHAgKCk7CisJICAvKk5PVFJFQUNIRUQqLworCWNhc2UgJ1YnOgorCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKKwkgIGV4aXQgKDApOworCSAgLypOT1RSRUFDSEVEKi8KKwljYXNlIDA6CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKKwkgIC8qTk9UUkVBQ0hFRCovCisJfQorICAgIH0KKworICBpZiAob3B0aW5kIDwgYWMpCisgICAgeworICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07CisgICAgfQorCisgIGlmICghaW5wdXRfZmlsZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsXygiJXM6IG5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKSwKKwkgICAgICAgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICBhYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCAwKTsKKworICBpZiAoIWFiZmQpCisgICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKKworICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisJeworCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7CisJICBmcmVlIChtYXRjaGluZyk7CisJfQorICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHRyZWUgPSBjb2ZmX2dyb2sgKGFiZmQpOworCisgIGNvZmZfZHVtcCh0cmVlKTsKKyAgcHJpbnRmKCJcbiIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZncm9rLmMgYi9iaW51dGlscy9jb2ZmZ3Jvay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNGU2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9jb2ZmZ3Jvay5jCkBAIC0wLDAgKzEsNzM3IEBACisvKiBjb2ZmZ3Jvay5jCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKKworICAgVGhpcyBtb2R1bGUgcmVhZHMgYSBjb2ZmIGZpbGUgYW5kIGJ1aWxkcyBhIHJlYWxseSBzaW1wbGUgdHlwZSB0cmVlCisgICB3aGljaCBjYW4gYmUgcmVhZCBieSBvdGhlciBwcm9ncmFtcy4gIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBpcyBhCisgICBjb2ZmLT5zeXNyb2ZmIGNvbnZlcnRlci4gIEl0IGNhbiBiZSB0ZXN0ZWQgd2l0aCBjb2ZmZHVtcC5jLgorCisqLworCisjaW5jbHVkZSA8YmZkLmg+CisjaW5jbHVkZSAiYnVjb21tLmgiCisKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKKyNpbmNsdWRlICJjb2ZmZ3Jvay5oIgoraW50IGxvZmlsZSA9IDE7CitzdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKnRvcF9zY29wZTsKK3N0YXRpYyBzdHJ1Y3QgY29mZl9zY29wZSAqZmlsZV9zY29wZTsKK3N0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqb2ZpbGU7CisKK3N0cnVjdCBjb2ZmX3N5bWJvbCAqbGFzdF9mdW5jdGlvbl9zeW1ib2w7CitzdHJ1Y3QgY29mZl90eXBlICpsYXN0X2Z1bmN0aW9uX3R5cGU7CitzdHJ1Y3QgY29mZl90eXBlICpsYXN0X3N0cnVjdDsKK3N0cnVjdCBjb2ZmX3R5cGUgKmxhc3RfZW51bTsKK3N0cnVjdCBjb2ZmX3NmaWxlICpjdXJfc2ZpbGU7CisKK3N0YXRpYyBzdHJ1Y3QgY29mZl9zeW1ib2wgKip0aW5kZXg7CisKKworc3RhdGljIGFzeW1ib2wgKipzeW1zOworc3RhdGljIGxvbmcgc3ltY291bnQ7CisKKyNkZWZpbmUgTih4KSAoKHgpLT5fbi5fbl9ucHRyWzFdKQorCitzdGF0aWMgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3c3ltczsKK3N0YXRpYyBpbnQgcmF3Y291bnQ7CitzdGF0aWMgYmZkICphYmZkOworZXh0ZXJuIGNoYXIgKnhjYWxsb2MgKCk7CisjZGVmaW5lIFBUUl9TSVpFIAk0CisjZGVmaW5lIFNIT1JUX1NJWkUgCTIKKyNkZWZpbmUgSU5UX1NJWkUgCTQKKyNkZWZpbmUgTE9OR19TSVpFIAk0CisjZGVmaW5lIEZMT0FUX1NJWkUgCTQKKyNkZWZpbmUgRE9VQkxFX1NJWkUgCTgKKworI2RlZmluZSBJTkRFWE9GKHApICAoKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikocCktKHJhd3N5bXMpKQorCitzdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKgorZW1wdHlfc2NvcGUgKCkKK3sKKyAgc3RydWN0IGNvZmZfc2NvcGUgKmw7CisgIGwgPSAoc3RydWN0IGNvZmZfc2NvcGUgKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc2NvcGUpLCAxKSk7CisgIHJldHVybiBsOworfQorCitzdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sICoKK2VtcHR5X3N5bWJvbCAoKQoreworICByZXR1cm4gKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wpLCAxKSk7Cit9CisKKy8qaW50IGw7Ki8KK3N0YXRpYyB2b2lkCitwdXNoX3Njb3BlIChsaW5rKQorICAgICBpbnQgbGluazsKK3sKKyAgc3RydWN0IGNvZmZfc2NvcGUgKm4gPSBlbXB0eV9zY29wZSAoKTsKKyAgaWYgKGxpbmspCisgICAgeworICAgICAgaWYgKHRvcF9zY29wZSkKKwl7CisJICBpZiAodG9wX3Njb3BlLT5saXN0X3RhaWwpCisJICAgIHsKKwkgICAgICB0b3Bfc2NvcGUtPmxpc3RfdGFpbC0+bmV4dCA9IG47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHRvcF9zY29wZS0+bGlzdF9oZWFkID0gbjsKKwkgICAgfQorCSAgdG9wX3Njb3BlLT5saXN0X3RhaWwgPSBuOworCX0KKyAgICB9CisgIG4tPnBhcmVudCA9IHRvcF9zY29wZTsKKworICB0b3Bfc2NvcGUgPSBuOworfQorCitzdGF0aWMgdm9pZAorcG9wX3Njb3BlICgpCit7CisgIHRvcF9zY29wZSA9IHRvcF9zY29wZS0+cGFyZW50OworfQorCitzdGF0aWMgdm9pZAorZG9fc2VjdGlvbnNfcDEgKGhlYWQpCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOworeworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgaW50IGlkeDsKKyAgc3RydWN0IGNvZmZfc2VjdGlvbiAqYWxsID0gKHN0cnVjdCBjb2ZmX3NlY3Rpb24gKikgKHhjYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxLAorCQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbikpKTsKKyAgaGVhZC0+bnNlY3Rpb25zID0gYWJmZC0+c2VjdGlvbl9jb3VudCArIDE7CisgIGhlYWQtPnNlY3Rpb25zID0gYWxsOworCisgIGZvciAoaWR4ID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCwgaWR4KyspCisgICAgeworICAgICAgbG9uZyByZWxzaXplOworICAgICAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7CisgICAgICBhcmVsZW50ICoqcmVscHA7CisgICAgICBsb25nIHJlbGNvdW50OworCisgICAgICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7CisgICAgICBpZiAocmVsc2l6ZSA8IDApCisJYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBpZiAocmVsc2l6ZSA9PSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOworICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwcCwgc3ltcyk7CisgICAgICBpZiAocmVsY291bnQgPCAwKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgICAgICBoZWFkLT5zZWN0aW9uc1tpXS5uYW1lID0gKGNoYXIgKikgKHNlY3Rpb24tPm5hbWUpOworICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uY29kZSA9IHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREU7CisgICAgICBoZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQTsKKyAgICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKKwloZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gMTsKKyAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmFkZHJlc3MgPSBzZWN0aW9uLT5sbWE7CisgICAgICBoZWFkLT5zZWN0aW9uc1tpXS5zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOworICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnVtYmVyID0gaWR4OworICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnJlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OworICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ucmVsb2NzID0KKwkoc3RydWN0IGNvZmZfcmVsb2MgKikgKHhjYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50LAorCQkJCQlzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jKSkpOworICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uYmZkX3NlY3Rpb24gPSBzZWN0aW9uOworICAgIH0KKyAgaGVhZC0+c2VjdGlvbnNbMF0ubmFtZSA9ICJBQlNPTFVURSI7CisgIGhlYWQtPnNlY3Rpb25zWzBdLmNvZGUgPSAwOworICBoZWFkLT5zZWN0aW9uc1swXS5kYXRhID0gMDsKKyAgaGVhZC0+c2VjdGlvbnNbMF0uYWRkcmVzcyA9IDA7CisgIGhlYWQtPnNlY3Rpb25zWzBdLnNpemUgPSAwOworICBoZWFkLT5zZWN0aW9uc1swXS5udW1iZXIgPSAwOworfQorCitzdGF0aWMgdm9pZAorZG9fc2VjdGlvbnNfcDIgKGhlYWQpCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOworeworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBqOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKKwl7CisJICBpbnQgaWR4OworCSAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7CisJICBzdHJ1Y3QgY29mZl9yZWxvYyAqciA9IGhlYWQtPnNlY3Rpb25zW2ldLnJlbG9jcyArIGo7CisJICBhcmVsZW50ICpzciA9IHNlY3Rpb24tPnJlbG9jYXRpb24gKyBqOworCSAgci0+b2Zmc2V0ID0gc3ItPmFkZHJlc3M7CisJICByLT5hZGRlbmQgPSBzci0+YWRkZW5kOworCSAgaWR4ID0gKChjb2ZmX3N5bWJvbF90eXBlICopIChzci0+c3ltX3B0cl9wdHJbMF0pKS0+bmF0aXZlIC0gcmF3c3ltczsKKwkgIHItPnN5bWJvbCA9IHRpbmRleFtpZHhdOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29mZl93aGVyZSAqCitkb193aGVyZSAoaSkKKyAgICAgaW50IGk7Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OworICBzdHJ1Y3QgY29mZl93aGVyZSAqd2hlcmUgPQorICAgIChzdHJ1Y3QgY29mZl93aGVyZSAqKSAoeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl93aGVyZSkpKTsKKyAgd2hlcmUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKKworICBpZiAoc3ltLT5uX3NjbnVtID09IC0xKQorICAgIHN5bS0+bl9zY251bSA9IDA7CisKKyAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQorICAgIHsKKyAgICBjYXNlIENfRklFTEQ6CisgICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q7CisgICAgICB3aGVyZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlIC8gODsKKyAgICAgIHdoZXJlLT5iaXRvZmZzZXQgPSBzeW0tPm5fdmFsdWUgJSA4OworICAgICAgd2hlcmUtPmJpdHNpemUgPSByYXdzeW1zW2kgKyAxXS51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ19NT0U6CisgICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDX01PUzoKKyAgICBjYXNlIENfTU9VOgorICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBDX0FVVE86CisgICAgY2FzZSBDX0FSRzoKKyAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfc3RhY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIENfRVhUOgorICAgIGNhc2UgQ19TVEFUOgorICAgIGNhc2UgQ19FWFRERUY6CisgICAgY2FzZSBDX0xBQkVMOgorICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1vcnk7CisgICAgICB3aGVyZS0+c2VjdGlvbiA9ICZvZmlsZS0+c2VjdGlvbnNbc3ltLT5uX3NjbnVtXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ19SRUc6CisgICAgY2FzZSBDX1JFR1BBUk06CisgICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDX0VOVEFHOgorICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9lbnRhZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ19TVFJUQUc6CisgICAgY2FzZSBDX1VOVEFHOgorICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9zdHJ0YWc7CisgICAgICBicmVhazsKKyAgICBjYXNlIENfVFBERUY6CisgICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3R5cGVkZWY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiB3aGVyZTsKK30KKworc3RhdGljCitzdHJ1Y3QgY29mZl9saW5lICoKK2RvX2xpbmVzIChpLCBuYW1lKQorICAgICBpbnQgaTsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IGNvZmZfbGluZSAqcmVzID0gKHN0cnVjdCBjb2ZmX2xpbmUgKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5lKSwgMSk7CisgIGFzZWN0aW9uICpzOworICB1bnNpZ25lZCBpbnQgbDsKKworICAvKiBGaW5kIG91dCBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbnkgbGluZSBudW1iZXJzIGluIHRoZSB0YWJsZSAqLworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgZm9yIChsID0gMDsgbCA8IHMtPmxpbmVub19jb3VudDsgbCsrKQorCXsKKwkgIGlmIChzLT5saW5lbm9bbF0ubGluZV9udW1iZXIgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChyYXdzeW1zICsgaSA9PSAoKGNvZmZfc3ltYm9sX3R5cGUgKikgKCYocy0+bGluZW5vW2xdLnUuc3ltWzBdKSkpLT5uYXRpdmUpCisJCXsKKwkJICAvKiBUaGVzZSBsaW5lcyBhcmUgZm9yIHRoaXMgZnVuY3Rpb24gLSBzbyBjb3VudCB0aGVtIGFuZCBzdGljayB0aGVtIG9uICovCisJCSAgaW50IGMgPSAwOworCQkgIC8qIEZpbmQgdGhlIGxpbmVudW1iZXIgb2YgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24sIHNpbmNlIGNvZmYgbGluZW51bWJlcnMKKwkJICAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gKi8KKwkJICBpbnQgc3RhcnRfbGluZSA9IHJhd3N5bXNbaSArIDNdLnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOworCisJCSAgbCsrOworCQkgIGZvciAoYyA9IDA7IHMtPmxpbmVub1tsICsgYyArIDFdLmxpbmVfbnVtYmVyOyBjKyspCisJCSAgICA7CisKKwkJICAvKiBBZGQgdHdvIGV4dHJhIHJlY29yZHMsIG9uZSBmb3IgdGhlIHByb2xvZ3VlIGFuZCBvbmUgZm9yIHRoZSBlcGlsb2d1ZSAqLworCQkgIGMgKz0gMTsKKwkJICByZXMtPm5saW5lcyA9IGM7CisJCSAgcmVzLT5saW5lcyA9IChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgYykpOworCQkgIHJlcy0+YWRkcmVzc2VzID0gKGludCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBjKSk7CisJCSAgcmVzLT5saW5lc1swXSA9IHN0YXJ0X2xpbmU7CisJCSAgcmVzLT5hZGRyZXNzZXNbMF0gPSByYXdzeW1zW2ldLnUuc3ltZW50Lm5fdmFsdWUgLSBzLT52bWE7CisJCSAgZm9yIChjID0gMDsgcy0+bGluZW5vW2wgKyBjICsgMV0ubGluZV9udW1iZXI7IGMrKykKKwkJICAgIHsKKwkJICAgICAgcmVzLT5saW5lc1tjICsgMV0gPSBzLT5saW5lbm9bbCArIGNdLmxpbmVfbnVtYmVyICsgc3RhcnRfbGluZSAtIDE7CisJCSAgICAgIHJlcy0+YWRkcmVzc2VzW2MgKyAxXSA9IHMtPmxpbmVub1tsICsgY10udS5vZmZzZXQ7CisJCSAgICB9CisJCSAgcmV0dXJuIHJlczsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljCitzdHJ1Y3QgY29mZl90eXBlICoKK2RvX3R5cGUgKGkpCisgICAgIGludCBpOworeworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmcmF3c3ltc1tpICsgMV0udS5hdXhlbnQ7CisgIHN0cnVjdCBjb2ZmX3R5cGUgKnJlcyA9CisgICAgKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7CisgIGludCB0eXBlID0gc3ltLT5uX3R5cGU7CisgIGludCB3aGljaF9kdCA9IDA7CisgIGludCBkaW1pbmQgPSAwOworCisgIHJlcy0+dHlwZSA9IGNvZmZfYmFzaWNfdHlwZTsKKyAgcmVzLT51LmJhc2ljID0gdHlwZSAmIDB4ZjsKKworICBzd2l0Y2ggKHR5cGUgJiAweGYpCisgICAgeworICAgIGNhc2UgVF9OVUxMOgorICAgIGNhc2UgVF9WT0lEOgorICAgICAgaWYgKHN5bS0+bl9udW1hdXggJiYgc3ltLT5uX3NjbGFzcyA9PSBDX1NUQVQpCisJeworCSAgLyogVGhpcyBpcyBwcm9iYWJseSBhIHNlY3Rpb24gZGVmaW5pdGlvbiAqLworCSAgcmVzLT50eXBlID0gY29mZl9zZWNkZWZfdHlwZTsKKwkgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zY24ueF9zY25sZW47CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICh0eXBlID09IDApCisJICAgIHsKKwkgICAgICAvKiBEb24ndCBrbm93IHdoYXQgdGhpcyBpcywgbGV0J3MgbWFrZSBpdCBhIHNpbXBsZSBpbnQgKi8KKwkgICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKKwkgICAgICByZXMtPnUuYmFzaWMgPSBUX1VJTlQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEVsc2UgaXQgY291bGQgYmUgYSBmdW5jdGlvbiBvciBwb2ludGVyIHRvIHZvaWQgKi8KKwkgICAgICByZXMtPnNpemUgPSAwOworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VDSEFSOgorICAgIGNhc2UgVF9DSEFSOgorICAgICAgcmVzLT5zaXplID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9VU0hPUlQ6CisgICAgY2FzZSBUX1NIT1JUOgorICAgICAgcmVzLT5zaXplID0gU0hPUlRfU0laRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9VSU5UOgorICAgIGNhc2UgVF9JTlQ6CisgICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9VTE9ORzoKKyAgICBjYXNlIFRfTE9ORzoKKyAgICAgIHJlcy0+c2l6ZSA9IExPTkdfU0laRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9GTE9BVDoKKyAgICAgIHJlcy0+c2l6ZSA9IEZMT0FUX1NJWkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfRE9VQkxFOgorICAgICAgcmVzLT5zaXplID0gRE9VQkxFX1NJWkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSVUNUOgorICAgIGNhc2UgVF9VTklPTjoKKyAgICAgIGlmIChzeW0tPm5fbnVtYXV4KQorCXsKKwkgIGlmIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApCisJICAgIHsKKwkgICAgICAvKiBSZWZlcmluZyB0byBhIHN0cnVjdCBkZWZpbmVkIGVsc2V3aGVyZSAqLworCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0cmVmX3R5cGU7CisJICAgICAgcmVzLT51LmFzdHJ1Y3RyZWYucmVmID0gdGluZGV4W0lOREVYT0YgKGF1eC0+eF9zeW0ueF90YWduZHgucCldOworCSAgICAgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hc3RydWN0cmVmLnJlZiA/CisJCXJlcy0+dS5hc3RydWN0cmVmLnJlZi0+dHlwZS0+c2l6ZSA6IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEEgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdCAqLworCSAgICAgIGxhc3Rfc3RydWN0ID0gcmVzOworCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0ZGVmX3R5cGU7CisJICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMgPSBlbXB0eV9zY29wZSAoKTsKKwkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5pZHggPSAwOworCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmlzc3RydWN0ID0gKHR5cGUgJiAweGYpID09IFRfU1RSVUNUOworCSAgICAgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTm8gYXV4ZW50cyAtIGl0J3MgYW5vbnlubW91cyAqLworCSAgcmVzLT50eXBlID0gY29mZl9zdHJ1Y3RyZWZfdHlwZTsKKwkgIHJlcy0+dS5hc3RydWN0cmVmLnJlZiA9IDA7CisJICByZXMtPnNpemUgPSAwOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9FTlVNOgorICAgICAgaWYgKGF1eC0+eF9zeW0ueF90YWduZHgucCkKKwl7CisJICAvKiBSZWZlcmluZyB0byBhIGVudW0gZGVmaW5lZCBlbHNld2hlcmUgKi8KKwkgIHJlcy0+dHlwZSA9IGNvZmZfZW51bXJlZl90eXBlOworCSAgcmVzLT51LmFlbnVtcmVmLnJlZiA9IHRpbmRleFtJTkRFWE9GIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApXTsKKwkgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hZW51bXJlZi5yZWYtPnR5cGUtPnNpemU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEEgZGVmaW5pdGlvbiBvZiBhbiBlbnVtICovCisJICBsYXN0X2VudW0gPSByZXM7CisJICByZXMtPnR5cGUgPSBjb2ZmX2VudW1kZWZfdHlwZTsKKwkgIHJlcy0+dS5hZW51bWRlZi5lbGVtZW50cyA9IGVtcHR5X3Njb3BlICgpOworCSAgcmVzLT5zaXplID0gYXV4LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfTU9FOgorICAgICAgYnJlYWs7CisgICAgfQorCisgIGZvciAod2hpY2hfZHQgPSA1OyB3aGljaF9kdCA+PSAwOyB3aGljaF9kdC0tKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKHR5cGUgPj4gKCh3aGljaF9kdCAqIDIpICsgNCkpICYgMHgzKQorCXsKKwljYXNlIDA6CisJICBicmVhazsKKwljYXNlIERUX0FSWToKKwkgIHsKKwkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0gKChzdHJ1Y3QgY29mZl90eXBlICopCisJCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKSk7CisJICAgIGludCBlbHMgPSAoZGltaW5kIDwgRElNTlVNCisJCSAgICAgICA/IGF1eC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbltkaW1pbmRdCisJCSAgICAgICA6IDApOworCSAgICArK2RpbWluZDsKKwkgICAgcHRyLT50eXBlID0gY29mZl9hcnJheV90eXBlOworCSAgICBwdHItPnNpemUgPSBlbHMgKiByZXMtPnNpemU7CisJICAgIHB0ci0+dS5hcnJheS5kaW0gPSBlbHM7CisJICAgIHB0ci0+dS5hcnJheS5hcnJheV9vZiA9IHJlczsKKwkgICAgcmVzID0gcHRyOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIERUX1BUUjoKKwkgIHsKKwkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0KKwkgICAgICAoc3RydWN0IGNvZmZfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKTsKKwkgICAgcHRyLT5zaXplID0gUFRSX1NJWkU7CisJICAgIHB0ci0+dHlwZSA9IGNvZmZfcG9pbnRlcl90eXBlOworCSAgICBwdHItPnUucG9pbnRlci5wb2ludHNfdG8gPSByZXM7CisJICAgIHJlcyA9IHB0cjsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBEVF9GQ046CisJICB7CisJICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0cgorCSAgICAgID0gKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7CisJICAgIHB0ci0+c2l6ZSA9IDA7CisJICAgIHB0ci0+dHlwZSA9IGNvZmZfZnVuY3Rpb25fdHlwZTsKKwkgICAgcHRyLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMgPSByZXM7CisJICAgIHB0ci0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzID0gZW1wdHlfc2NvcGUgKCk7CisJICAgIHB0ci0+dS5mdW5jdGlvbi5saW5lcyA9IGRvX2xpbmVzIChpLCBzeW0tPl9uLl9uX25wdHJbMV0pOworCSAgICBwdHItPnUuZnVuY3Rpb24uY29kZSA9IDA7CisJICAgIGxhc3RfZnVuY3Rpb25fdHlwZSA9IHB0cjsKKwkgICAgcmVzID0gcHRyOworCSAgICBicmVhazsKKwkgIH0KKwl9CisgICAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IGNvZmZfdmlzaWJsZSAqCitkb192aXNpYmxlIChpKQorICAgICBpbnQgaTsKK3sKKyAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7CisgIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnZpc2libGUgPQorICAgIChzdHJ1Y3QgY29mZl92aXNpYmxlICopICh4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3Zpc2libGUpKSk7CisgIGVudW0gY29mZl92aXNfdHlwZSB0OworICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCisgICAgeworICAgIGNhc2UgQ19NT1M6CisgICAgY2FzZSBDX01PVToKKyAgICBjYXNlIENfRklFTEQ6CisgICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ19NT0U6CisgICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX2VudW07CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ19SRUdQQVJNOgorICAgICAgdCA9IGNvZmZfdmlzX3JlZ3BhcmFtOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENfUkVHOgorICAgICAgdCA9IGNvZmZfdmlzX3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDX1NUUlRBRzoKKyAgICBjYXNlIENfVU5UQUc6CisgICAgY2FzZSBDX0VOVEFHOgorICAgIGNhc2UgQ19UUERFRjoKKyAgICAgIHQgPSBjb2ZmX3Zpc190YWc7CisgICAgICBicmVhazsKKyAgICBjYXNlIENfQVVUT0FSRzoKKyAgICBjYXNlIENfQVJHOgorICAgICAgdCA9IGNvZmZfdmlzX2F1dG9wYXJhbTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ19BVVRPOgorCisKKyAgICAgIHQgPSBjb2ZmX3Zpc19hdXRvOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDX0xBQkVMOgorICAgIGNhc2UgQ19TVEFUOgorICAgICAgdCA9IGNvZmZfdmlzX2ludF9kZWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIENfRVhUOgorICAgICAgaWYgKHN5bS0+bl9zY251bSA9PSBOX1VOREVGKQorCXsKKwkgIGlmIChzeW0tPm5fdmFsdWUpCisJICAgIHQgPSBjb2ZmX3Zpc19jb21tb247CisJICBlbHNlCisJICAgIHQgPSBjb2ZmX3Zpc19leHRfcmVmOworCX0KKyAgICAgIGVsc2UKKwl0ID0gY29mZl92aXNfZXh0X2RlZjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIGJyZWFrOworCisgICAgfQorICB2aXNpYmxlLT50eXBlID0gdDsKKyAgcmV0dXJuIHZpc2libGU7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2RlZmluZSAoaSwgYikKKyAgICAgaW50IGk7CisgICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpiOworeworICBzdGF0aWMgaW50IHN5bWJvbF9pbmRleDsKKyAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7CisKKyAgLyogRGVmaW5lIGEgc3ltYm9sIGFuZCBhdHRhY2ggdG8gYmxvY2sgYiAqLworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnMgPSBlbXB0eV9zeW1ib2wgKCk7CisKKyAgcy0+bnVtYmVyID0gKytzeW1ib2xfaW5kZXg7CisgIHMtPm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07CisgIHMtPnNmaWxlID0gY3VyX3NmaWxlOworICAvKiBHbHVlIG9udG8gdGhlIG9maWxlIGxpc3QgKi8KKyAgaWYgKGxvZmlsZSA+PSAwKQorICAgIHsKKyAgICAgIGlmIChvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCkKKwlvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbC0+bmV4dF9pbl9vZmlsZV9saXN0ID0gczsKKyAgICAgIGVsc2UKKwlvZmlsZS0+c3ltYm9sX2xpc3RfaGVhZCA9IHM7CisgICAgICBvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCA9IHM7CisgICAgICAvKiBBbmQgdGhlIGJsb2NrIGxpc3QgKi8KKyAgICB9CisgIGlmIChiLT52YXJzX3RhaWwpCisgICAgYi0+dmFyc190YWlsLT5uZXh0ID0gczsKKyAgZWxzZQorICAgIGItPnZhcnNfaGVhZCA9IHM7CisKKyAgYi0+dmFyc190YWlsID0gczsKKyAgYi0+bnZhcnMrKzsKKyAgcy0+dHlwZSA9IGRvX3R5cGUgKGkpOworICBzLT53aGVyZSA9IGRvX3doZXJlIChpKTsKKyAgcy0+dmlzaWJsZSA9IGRvX3Zpc2libGUgKGkpOworCisgIHRpbmRleFtpXSA9IHM7CisKKyAgLyogV2UgcmVtZW1iZXIgdGhlIGxvd2VzdCBhZGRyZXNzIGluIGVhY2ggc2VjdGlvbiBmb3IgZWFjaCBzb3VyY2UgZmlsZSAqLworCisgIGlmIChzLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1vcnkKKyAgICAgICYmIHMtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKKyAgICB7CisgICAgICBzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqaXMgPSBjdXJfc2ZpbGUtPnNlY3Rpb24gKyBzLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOworCisgICAgICBpZiAoIWlzLT5pbml0KQorCXsKKwkgIGlzLT5sb3cgPSBzLT53aGVyZS0+b2Zmc2V0OworCSAgaXMtPmhpZ2ggPSBzLT53aGVyZS0+b2Zmc2V0ICsgcy0+dHlwZS0+c2l6ZTsKKwkgIGlzLT5pbml0ID0gMTsKKwkgIGlzLT5wYXJlbnQgPSBzLT53aGVyZS0+c2VjdGlvbjsKKwl9CisKKyAgICB9CisKKyAgaWYgKHMtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQorICAgIGxhc3RfZnVuY3Rpb25fc3ltYm9sID0gczsKKworICByZXR1cm4gaSArIHN5bS0+bl9udW1hdXggKyAxOworfQorCisKK3N0YXRpYworc3RydWN0IGNvZmZfb2ZpbGUgKgorZG9pdCAoKQoreworICBpbnQgaTsKKyAgaW50IGluZmlsZSA9IDA7CisgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkID0KKyAgKHN0cnVjdCBjb2ZmX29maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfb2ZpbGUpKTsKKyAgb2ZpbGUgPSBoZWFkOworICBoZWFkLT5zb3VyY2VfaGVhZCA9IDA7CisgIGhlYWQtPnNvdXJjZV90YWlsID0gMDsKKyAgaGVhZC0+bnNvdXJjZXMgPSAwOworICBoZWFkLT5zeW1ib2xfbGlzdF90YWlsID0gMDsKKyAgaGVhZC0+c3ltYm9sX2xpc3RfaGVhZCA9IDA7CisgIGRvX3NlY3Rpb25zX3AxIChoZWFkKTsKKyAgcHVzaF9zY29wZSAoMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJhd2NvdW50OykKKyAgICB7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKKyAgICAgIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKKwl7CisJY2FzZSBDX0ZJTEU6CisJICB7CisJICAgIC8qIG5ldyBzb3VyY2UgZmlsZSBhbm5vdW5jZWQgKi8KKwkgICAgc3RydWN0IGNvZmZfc2ZpbGUgKm4gPQorCSAgICAgIChzdHJ1Y3QgY29mZl9zZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3NmaWxlKSk7CisJICAgIG4tPnNlY3Rpb24gPSAoc3RydWN0IGNvZmZfaXNlY3Rpb24gKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9pc2VjdGlvbiksIGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKTsKKwkgICAgY3VyX3NmaWxlID0gbjsKKwkgICAgbi0+bmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKKwkgICAgbi0+bmV4dCA9IDA7CisKKwkgICAgaWYgKGluZmlsZSkKKwkgICAgICB7CisJCXBvcF9zY29wZSAoKTsKKwkgICAgICB9CisJICAgIGluZmlsZSA9IDE7CisJICAgIHB1c2hfc2NvcGUgKDEpOworCSAgICBmaWxlX3Njb3BlID0gbi0+c2NvcGUgPSB0b3Bfc2NvcGU7CisKKwkgICAgaWYgKGhlYWQtPnNvdXJjZV90YWlsKQorCSAgICAgIGhlYWQtPnNvdXJjZV90YWlsLT5uZXh0ID0gbjsKKwkgICAgZWxzZQorCSAgICAgIGhlYWQtPnNvdXJjZV9oZWFkID0gbjsKKwkgICAgaGVhZC0+c291cmNlX3RhaWwgPSBuOworCSAgICBoZWFkLT5uc291cmNlcysrOworCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBDX0ZDTjoKKwkgIHsKKwkgICAgY2hhciAqbmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKKwkgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQorCSAgICAgIHsKKwkJLyogRnVuY3Rpb24gc3RhcnQgKi8KKwkJcHVzaF9zY29wZSAoMCk7CisJCWxhc3RfZnVuY3Rpb25fdHlwZS0+dS5mdW5jdGlvbi5jb2RlID0gdG9wX3Njb3BlOworCQl0b3Bfc2NvcGUtPnNlYyA9IG9maWxlLT5zZWN0aW9ucyArIHN5bS0+bl9zY251bTsKKwkJdG9wX3Njb3BlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7CisJCXBvcF9zY29wZSAoKTsKKworCSAgICAgIH0KKwkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBDX0JMT0NLOgorCSAgeworCSAgICBjaGFyICpuYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOworCSAgICBpZiAobmFtZVsxXSA9PSAnYicpCisJICAgICAgeworCQkvKiBCbG9jayBzdGFydCAqLworCQlwdXNoX3Njb3BlICgxKTsKKwkJdG9wX3Njb3BlLT5zZWMgPSBvZmlsZS0+c2VjdGlvbnMgKyBzeW0tPm5fc2NudW07CisJCXRvcF9zY29wZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOworCisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7CisJCXBvcF9zY29wZSAoKTsKKwkgICAgICB9CisJICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7CisJICB9CisJICBicmVhazsKKwljYXNlIENfUkVHUEFSTToKKwljYXNlIENfQVJHOgorCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9mdW5jdGlvbl9zeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7CisJICBicmVhazsKKwljYXNlIENfTU9TOgorCWNhc2UgQ19NT1U6CisJY2FzZSBDX0ZJRUxEOgorCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9zdHJ1Y3QtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7CisJICBicmVhazsKKwljYXNlIENfTU9FOgorCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9lbnVtLT51LmFlbnVtZGVmLmVsZW1lbnRzKTsKKwkgIGJyZWFrOworCWNhc2UgQ19TVFJUQUc6CisJY2FzZSBDX0VOVEFHOgorCWNhc2UgQ19VTlRBRzoKKwkgIC8qIFZhcmlvdXMgZGVmaW5pdGlvbiAqLworCSAgaSA9IGRvX2RlZmluZSAoaSwgdG9wX3Njb3BlKTsKKwkgIGJyZWFrOworCWNhc2UgQ19FWFQ6CisJY2FzZSBDX0xBQkVMOgorCSAgaSA9IGRvX2RlZmluZSAoaSwgZmlsZV9zY29wZSk7CisJICBicmVhazsKKwljYXNlIENfU1RBVDoKKwljYXNlIENfVFBERUY6CisJY2FzZSBDX0FVVE86CisJY2FzZSBDX1JFRzoKKwkgIGkgPSBkb19kZWZpbmUgKGksIHRvcF9zY29wZSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJY2FzZSBDX0VPUzoKKwkgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7CisJICBicmVhazsKKwl9CisgICAgfQorICBkb19zZWN0aW9uc19wMiAoaGVhZCk7CisgIHJldHVybiBoZWFkOworfQorCitzdHJ1Y3QgY29mZl9vZmlsZSAqCitjb2ZmX2dyb2sgKGluYWJmZCkKKyAgICAgYmZkICppbmFiZmQ7Cit7CisgIGxvbmcgc3RvcmFnZTsKKyAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7CisgIGFiZmQgPSBpbmFiZmQ7CisgIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7CisKKyAgaWYgKHN0b3JhZ2UgPCAwKQorICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOworCisgIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7CisgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOworICBpZiAoc3ltY291bnQgPCAwKQorICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOworICByYXdzeW1zID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKKyAgcmF3Y291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7OworICB0aW5kZXggPSAoc3RydWN0IGNvZmZfc3ltYm9sICoqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wgKiksIHJhd2NvdW50KSk7CisKKyAgcCA9IGRvaXQgKCk7CisgIHJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suaCBiL2JpbnV0aWxzL2NvZmZncm9rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhZGU0MgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2NvZmZncm9rLmgKQEAgLTAsMCArMSwyMDYgQEAKKyNkZWZpbmUgVF9OVUxMCQkwCisjZGVmaW5lIFRfVk9JRAkJMQkvKiBmdW5jdGlvbiBhcmd1bWVudCAob25seSB1c2VkIGJ5IGNvbXBpbGVyKSAqLworI2RlZmluZSBUX0NIQVIJCTIJLyogY2hhcmFjdGVyCQkqLworI2RlZmluZSBUX1NIT1JUCQkzCS8qIHNob3J0IGludGVnZXIJKi8KKyNkZWZpbmUgVF9JTlQJCTQJLyogaW50ZWdlcgkJKi8KKyNkZWZpbmUgVF9MT05HCQk1CS8qIGxvbmcgaW50ZWdlcgkJKi8KKyNkZWZpbmUgVF9GTE9BVAkJNgkvKiBmbG9hdGluZyBwb2ludAkqLworI2RlZmluZSBUX0RPVUJMRQk3CS8qIGRvdWJsZSB3b3JkCQkqLworI2RlZmluZSBUX1NUUlVDVAk4CS8qIHN0cnVjdHVyZSAJCSovCisjZGVmaW5lIFRfVU5JT04JCTkJLyogdW5pb24gCQkqLworI2RlZmluZSBUX0VOVU0JCTEwCS8qIGVudW1lcmF0aW9uIAkJKi8KKyNkZWZpbmUgVF9NT0UJCTExCS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbiovCisjZGVmaW5lIFRfVUNIQVIJCTEyCS8qIHVuc2lnbmVkIGNoYXJhY3RlcgkqLworI2RlZmluZSBUX1VTSE9SVAkxMwkvKiB1bnNpZ25lZCBzaG9ydAkqLworI2RlZmluZSBUX1VJTlQJCTE0CS8qIHVuc2lnbmVkIGludGVnZXIJKi8KKyNkZWZpbmUgVF9VTE9ORwkJMTUJLyogdW5zaWduZWQgbG9uZwkqLworI2RlZmluZSBUX0xOR0RCTAkxNgkvKiBsb25nIGRvdWJsZQkJKi8KKworCisgc3RydWN0IGNvZmZfcmVsb2MKKyB7CisgICBpbnQgb2Zmc2V0OworICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7CisgICBpbnQgYWRkZW5kOworIH07CisKKyBzdHJ1Y3QgY29mZl9zZWN0aW9uIAorIHsKKyAgIGNoYXIgKm5hbWU7CisgICBpbnQgY29kZTsKKyAgIGludCBkYXRhOworICAgaW50IGFkZHJlc3M7CisgICBpbnQgbnVtYmVyOyAgLyogMC4ubiwgLnRleHQgPSAwICovCisgICBpbnQgbnJlbG9jczsKKyAgIGludCBzaXplOworICAgc3RydWN0IGNvZmZfcmVsb2MgKnJlbG9jczsKKyAgIHN0cnVjdCBzZWMgKmJmZF9zZWN0aW9uOworIH07CisKK3N0cnVjdCBjb2ZmX29maWxlCit7CisgIGludCBuc291cmNlczsKKyAgc3RydWN0IGNvZmZfc2ZpbGUgKnNvdXJjZV9oZWFkOworICBzdHJ1Y3QgY29mZl9zZmlsZSAqc291cmNlX3RhaWw7CisgIGludCBuc2VjdGlvbnM7CisgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb25zOworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbF9saXN0X2hlYWQ7CisgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sX2xpc3RfdGFpbDsKK307CisKK3N0cnVjdCBjb2ZmX2lzZWN0aW9uIHsKKyAgaW50IGxvdzsKKyAgaW50IGhpZ2g7CisgIGludCBpbml0OworICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpwYXJlbnQ7Cit9OworCitzdHJ1Y3QgY29mZl9zZmlsZQoreworICBjaGFyICpuYW1lOworICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7CisgIHN0cnVjdCBjb2ZmX3NmaWxlICpuZXh0OworCisgIC8qIFZlY3RvciB3aGljaCBtYXBzIHdoZXJlIGluIGVhY2ggb3V0cHV0IHNlY3Rpb24KKyAgICAgdGhlIGlucHV0IGZpbGUgaGFzIGl0J3MgZGF0YSAqLworICBzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqc2VjdGlvbjsgCisKK307CisKKworIHN0cnVjdCBjb2ZmX3R5cGUKK3sKKyAgaW50IHNpemU7CisgIGVudW0KKyAgICB7CisgICAgICBjb2ZmX3BvaW50ZXJfdHlwZSwgY29mZl9mdW5jdGlvbl90eXBlLCBjb2ZmX2FycmF5X3R5cGUsIGNvZmZfc3RydWN0ZGVmX3R5cGUsIGNvZmZfYmFzaWNfdHlwZSwKKyAgICAgIGNvZmZfc3RydWN0cmVmX3R5cGUsIGNvZmZfZW51bXJlZl90eXBlLCBjb2ZmX2VudW1kZWZfdHlwZSwgY29mZl9zZWNkZWZfdHlwZQorICAgICAgfSB0eXBlOworICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdCAKKwl7CisJaW50IGFkZHJlc3M7CisJaW50IHNpemU7CisgICAgICB9IGFzZWNkZWY7CisKKyAgICAgIHN0cnVjdAorCXsKKwkgIGludCBpc3N0cnVjdDsKKwkgIHN0cnVjdCBjb2ZmX3Njb3BlICplbGVtZW50czsKKwkgIGludCBpZHg7CisJfQorICAgICAgYXN0cnVjdGRlZjsKKyAgICAgIHN0cnVjdAorCXsKKwkgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcmVmOworCX0gYXN0cnVjdHJlZjsKKworICAgICAgc3RydWN0CisJeworCSAgc3RydWN0IGNvZmZfc2NvcGUgKmVsZW1lbnRzOworCSAgaW50IGlkeDsKKwl9IGFlbnVtZGVmOworICAgICAgc3RydWN0CisJeworCSAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7CisJfSBhZW51bXJlZjsKKworICAgICAgc3RydWN0CisJeworCSAgc3RydWN0IGNvZmZfdHlwZSAqcG9pbnRzX3RvOworCX0gcG9pbnRlcjsKKyAgICAgIHN0cnVjdAorCXsKKwkgIGludCBkaW07CisJICBzdHJ1Y3QgY29mZl90eXBlICphcnJheV9vZjsKKwl9IGFycmF5OworCisgICAgICBzdHJ1Y3QKKwl7CisJICBzdHJ1Y3QgY29mZl90eXBlICpmdW5jdGlvbl9yZXR1cm5zOworCSAgc3RydWN0IGNvZmZfc2NvcGUgKnBhcmFtZXRlcnM7CisJICBzdHJ1Y3QgY29mZl9zY29wZSAqY29kZTsKKwkgIHN0cnVjdCBjb2ZmX2xpbmUgKmxpbmVzOworCX0gZnVuY3Rpb247CisgICAgICBpbnQgYmFzaWM7CQkvKiBPbmUgb2YgVF9WT0lELi4gVF9VSU5UICovCisgICAgfSAgdTsKK307CisKKworIHN0cnVjdCBjb2ZmX2xpbmUgCisgeworICAgaW50IG5saW5lczsKKyAgIGludCAqbGluZXM7CisgICBpbnQgKmFkZHJlc3NlczsKKyB9OworCisKKyBzdHJ1Y3QgY29mZl9zY29wZQorICAgeworICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7IC8qIFdoYXQgc2VjdGlvbiAqLworICAgICBpbnQgb2Zmc2V0OyAvKiB3aGVyZSAqLworICAgICBpbnQgc2l6ZTsgLyogSG93IGJpZyAqLworICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqcGFyZW50OwkvKiBvbmUgdXAgKi8KKworICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbmV4dDsJLypuZXh0IGFsb25nICovCisKKyAgICAgaW50IG52YXJzOworCisgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqdmFyc19oZWFkOwkvKiBzeW1ib2xzICovCisgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqdmFyc190YWlsOworCisgICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpsaXN0X2hlYWQ7CS8qIGNoaWxkcmVuICovCisgICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpsaXN0X3RhaWw7CisKKyAgIH07CisKKworIHN0cnVjdCBjb2ZmX3Zpc2libGUKKyAgIHsKKyAgICAgZW51bSBjb2ZmX3Zpc190eXBlCisgICAgICAgeworCSBjb2ZmX3Zpc19leHRfZGVmLAorCSBjb2ZmX3Zpc19leHRfcmVmLAorCSBjb2ZmX3Zpc19pbnRfZGVmLAorCSBjb2ZmX3Zpc19jb21tb24sCisJIGNvZmZfdmlzX2F1dG8sCisJIGNvZmZfdmlzX3JlZ2lzdGVyLAorCSBjb2ZmX3Zpc190YWcsCisJIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3QsCisJIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtLAorCSBjb2ZmX3Zpc19hdXRvcGFyYW0sCQorCSBjb2ZmX3Zpc19yZWdwYXJhbSwKKyAgICAgICB9IHR5cGU7CisgICB9OworCisgc3RydWN0IGNvZmZfd2hlcmUKKyAgIHsKKyAgICAgZW51bQorICAgICAgIHsKKwkgY29mZl93aGVyZV9zdGFjaywgY29mZl93aGVyZV9tZW1vcnksIGNvZmZfd2hlcmVfcmVnaXN0ZXIsIGNvZmZfd2hlcmVfdW5rbm93biwKKwkgY29mZl93aGVyZV9zdHJ0YWcsIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdCwKKwkgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bSwgY29mZl93aGVyZV9lbnRhZywgY29mZl93aGVyZV90eXBlZGVmCisKKyAgICAgICB9IHdoZXJlOworICAgICBpbnQgb2Zmc2V0OworICAgICBpbnQgYml0b2Zmc2V0OworICAgICBpbnQgYml0c2l6ZTsKKyAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKKyAgIH07CisKKyBzdHJ1Y3QgY29mZl9zeW1ib2wKKyAgIHsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IHRhZzsKKyAgICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IGNvZmZfd2hlcmUgKndoZXJlOworICAgICBzdHJ1Y3QgY29mZl92aXNpYmxlICp2aXNpYmxlOworICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKm5leHQ7CisgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqbmV4dF9pbl9vZmlsZV9saXN0OyAvKiBGb3IgdGhlIG9maWxlIGxpc3QgKi8KKyAgICAgaW50IG51bWJlcjsKKyAgICAgaW50IGVyX251bWJlcjsKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworICB9OworCitzdHJ1Y3QgY29mZl9vZmlsZSAqY29mZl9ncm9rKCk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWcuaW4gYi9iaW51dGlscy9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNzJkZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE4MyBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAorCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLworI3VuZGVmIGlubGluZQorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLworI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KKyN1bmRlZiBZWVRFWFRfUE9JTlRFUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0JSSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVVRJTUVTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19GSUxFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbiAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHRpbWUuaD4/ICovCisjdW5kZWYgSEFWRV9USU1FX1RfSU5fVElNRV9ICisKKy8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/ICovCisjdW5kZWYgSEFWRV9USU1FX1RfSU5fVFlQRVNfSAorCisvKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICovCisjdW5kZWYgSEFWRV9HT09EX1VUSU1FX0gKKworLyogRGVmaW5lIGlmIGZwcmludGYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGCisKKy8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKKworLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCisKKy8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKKworLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCisKKy8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCisjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgorCisvKiBDb25maWd1cmVkIHRhcmdldCBuYW1lLiAqLworI3VuZGVmIFRBUkdFVAorCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUgYi9iaW51dGlscy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTk0ZTE1NAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDU1NjcgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWFyLmMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTk0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxNTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjMzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY2ODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MjE6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCisgICBmaQorICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KKyAgIGZpCisKKyAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIieWVzIiAxPiY2CitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzc4OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKKworUEFDS0FHRT1iaW51dGlscworCitWRVJTSU9OPTIuOS40CisKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQorZmkKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorRU9GCisKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorRU9GCisKKworCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODI0OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQUNMT0NBTD1hY2xvY2FsCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgzNzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT0NPTkY9YXV0b2NvbmYKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9NQUtFPWF1dG9tYWtlCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODc2OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBNQUtFSU5GTz1tYWtlaW5mbworICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CitubykgZW5hYmxlX3N0YXRpYz1ubyA7OworKikKKyAgZW5hYmxlX3N0YXRpYz1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3N0YXRpYz15ZXMKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CitubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworKikKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTA1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorCisjbGluZSAxMTE2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTQ3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE1MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTgwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgorICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMzogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKKyAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAorICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjQ3OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKK2Vsc2UKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNTA6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworICAgICAgZWxzZQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitlbHNlCisgIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRhY19jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJExEIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3Rlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjg2OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICBhY19jdl9wcm9nX2dudV9sZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2CisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzAyOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBhY19jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCisJYnJlYWsKKyAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKKwlicmVhaworICAgICAgZWxzZQorCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KK2ZpCitmaQorCitOTT0iJGFjX2N2X3BhdGhfTk0iCitlY2hvICIkYWNfdCIiJE5NIiAxPiY2CisKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM0MDogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCithY19zeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK2FjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK2FjX3N5bXhmcm09J1wxIFwyXDMgXDMnCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2FjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4KikKKyAgYWNfc3ltY29kZT0nW0JDRFRdJworICA7OworY3lnd2luKiB8IG1pbmd3KikKKyAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikKKyAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgIDs7Citpcml4KikKKyAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK3NvbGFyaXMqKQorICBhY19zeW1jb2RlPSdbQkRUXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitpZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKyAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCitmaQorCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIGFjX3BpcGVfd29ya3M9bm8KKyAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmMoKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgorCisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgIAorICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwNzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKworICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRhY19ubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJworCisJICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyX3QgYWRkcmVzczsKK30KK2x0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQoreworRU9GCisJc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCisJY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAorCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKwkgICAgYWNfcGlwZV93b3Jrcz15ZXMKKwkgIGVsc2UKKwkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKwkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisJICBmaQorCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgZWxzZQorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCisgICAgZmkKKyAgICBicmVhaworICBlbHNlCisgICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworCithY19yZXN1bHQ9eWVzCitpZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgIGFjX3Jlc3VsdD1ubworZmkKK2VjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTA1OiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCit2b2lkIG5tX3Rlc3RfZnVuYygpe30KK2ludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICBhY19ubGlzdD1jb25mdGVzdC5ubQorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTc6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisgICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgorICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgZWxzZQorICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC5jID4mNQorZmkKK3JtIC1yZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKK1VTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTU0MzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgcm0gLWYgY29uZnRlc3RkYXRhCitpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAordGhlbgorICBybSAtZiBjb25mdGVzdGRhdGEKKyAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19MTl9TPWxuCitmaQorZmkKK0xOX1M9IiRhY19jdl9wcm9nX0xOX1MiCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCisgIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCitlbHNlCisgIGFjX3Rvb2xfcHJlZml4PQorZmkKKworCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgorbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKK3Rlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCit0ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgordGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICIkaG9zdCIgaW4KKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnI2xpbmUgMTU4NSAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjA3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYxMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2CisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CisKKyotKi1jeWd3aW4qKQorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgorZmkKK2ZpCitETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgoraWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2Vsc2UKKyAgRExMVE9PTD0iZmFsc2UiCitmaQorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQVM9IiRhY19jdl9wcm9nX0FTIgoraWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0FTPSJhcyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgorZmkKK2ZpCitBUz0iJGFjX2N2X3Byb2dfQVMiCitpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIEFTPSJmYWxzZSIKK2ZpCitmaQorCisKKyAgOzsKKworZXNhYworCisjIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKK2Vsc2UKKyAgbmVlZF9sb2Nrcz15ZXMKK2ZpCisKKworaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgorICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKK2ZpCisKKworIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCisKKyMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCitDQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKK0xEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKK0RMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCiske0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCiskbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAorfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQorCisjIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisjIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAorIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KK2V4ZWMgNT4+Li9jb25maWcubG9nCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9CisgICAgICAgICAgICA7OworICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7CisgICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Citlc2FjCitmaQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiBvciAtLWRpc2FibGUtY29tbW9uYmZkbGliIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NvbW1vbmJmZGxpYitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfY29tbW9uYmZkbGliIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKKyAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKKyAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKK2ZpCisKKworCisKKworaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2lmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTM2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKyA7OworICAgIGVzYWMKKyAgZmkKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAxOTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKKworI2xpbmUgMjAzMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwMzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA2MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNjY6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNzU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKKworYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCithY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA5NDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworCitmb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCitkbworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjEzMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK1lBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCitpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwordGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNjI6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE3NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjE4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE5NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjIwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorZm9yIGFjX3Byb2cgaW4gZmxleCBsZXgKK2RvCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjQ3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0xFWD0iJGFjX3Byb2ciCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0xFWD0iJGFjX2N2X3Byb2dfTEVYIgoraWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCit0ZXN0IC1uICIkTEVYIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJExFWCIgfHwgTEVYPSIiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0xFWD0iZmxleCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfTEVYIiAmJiBhY19jdl9wcm9nX0xFWD0ibGV4IgorZmkKK2ZpCitMRVg9IiRhY19jdl9wcm9nX0xFWCIKK2lmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJExFWExJQiIKK3RoZW4KKyAgY2FzZSAiJExFWCIgaW4KKyAgZmxleCopIGFjX2xpYj1mbCA7OworICAqKSBhY19saWI9bCA7OworICBlc2FjCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzE0OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1CithY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzIyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgeXl3cmFwKCk7CisKK2ludCBtYWluKCkgeworeXl3cmFwKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBMRVhMSUI9Ii1sJGFjX2xpYiIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM1NjogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3Jvb3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKKyMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KK2VjaG8gJyUlCislJScgfCAkTEVYCitpZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCisgIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5CitlbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgorICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5CitlbHNlCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKK0xFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNzc6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKKyMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCisjIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgorYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KK2VjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYworYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9IiRMSUJTICRMRVhMSUIiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2BjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAoraW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQorRU9GCisKK2ZpCisKKworQUxMX0xJTkdVQVM9CitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQyMDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ0MTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDcxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0ODkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjUxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1NDU6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjU1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MjA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjYyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjYwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNjY1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2OTM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjY5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjcyODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3MzMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NjE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjc2NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgyNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODU2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODYxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4ODQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjkxMTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTYzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk2OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk3MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDAyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDA3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNTU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjMxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzIzNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzI0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyNzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMyNzYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMyODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzMzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzOTA6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDIzOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0NDM6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQ2MjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzQ2NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQ4OTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDk0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1MTc6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzU1MjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTU3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM2MjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2MzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzc0OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmUKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWIKK2ZpCitybSAtZiBjb25mdGVzdCoKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCSAgICAgICAgCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3ODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzg1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk0OTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk3NzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzk4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwNTA6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKKyAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCitmaQorCisgIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgorICAKKworaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgorICBNQUlOVEFJTkVSX01PREVfVFJVRT0KKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJworZWxzZQorICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQorZmkKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisgIAorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDczOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MDc4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKyNpZm5kZWYgX19DWUdXSU5fXworI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworI2VuZGlmCityZXR1cm4gX19DWUdXSU5fXzsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDg5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY3lnd2luPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jeWd3aW49bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKK0NZR1dJTj0KK3Rlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTA2OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQxMTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiBfX01JTkdXMzJfXzsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTE4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfbWluZ3czMj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfbWluZ3czMj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0Kgorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKK01JTkdXMzI9Cit0ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQxMzc6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCisgIGFjX2N2X2V4ZWV4dD0uZXhlCitlbHNlCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfY3ZfZXhlZXh0PQorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KKyAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OworICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqCisgIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KK2ZpCitmaQorCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2CithY19leGVleHQ9JEVYRUVYVAorCisKKyMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKKworSERFRklORVM9CisKKy4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAorCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDE4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDIxOTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0IC16ICIkQ0NfRk9SX0JVSUxEIjsgdGhlbgorICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICAgIENDX0ZPUl9CVUlMRD0nJChDQyknCisgIGVsc2UKKyAgICBDQ19GT1JfQlVJTEQ9Z2NjCisgIGZpCitmaQorCisjIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCitlbHNlCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQyODY6IGNoZWNraW5nIGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9idWlsZF9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBhY19jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyAgICAke0NDX0ZPUl9CVUlMRH0gLW8gYWNfY190ZXN0IGFtX2NfdGVzdC5jIDE+JjUgMj4mNQorICAgIGJmZF9jdl9idWlsZF9leGVleHQ9YGVjaG8gYWNfY190ZXN0LiogfCBncmVwIC12IGFjX2NfdGVzdC5jIHwgc2VkIC1lIHMvYWNfY190ZXN0Ly9gCisgICAgcm0gLWYgYWNfY190ZXN0KgorICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ubworZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfYnVpbGRfZXhlZXh0IiAxPiY2CisgIEVYRUVYVF9GT1JfQlVJTEQ9IiIKKyAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KK2ZpCisKKworZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmggZmNudGwuaCBzeXMvZmlsZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDMxMTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQzMTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMjE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDM0ODogY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDM1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpZm5kZWYgV0VYSVRTVEFUVVMKKyNkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQpKHN0YXRfdmFsKSA+PiA4KQorI2VuZGlmCisjaWZuZGVmIFdJRkVYSVRFRAorI2RlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKKyNlbmRpZgoraW50IG1haW4oKSB7CitpbnQgczsKK3dhaXQgKCZzKTsKK3MgPSBXSUZFWElURUQgKHMpID8gV0VYSVRTVEFUVVMgKHMpIDogMTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MzkyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDM5NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDQyNTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NDMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDX0FMTE9DQSAxCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NDkwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDQ5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1MjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ1MjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworRU9GCisKKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitkb25lCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NTc1OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDU4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CittYWluICgpCit7CisgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitFT0YKKworZmkKKworZm9yIGFjX2Z1bmMgaW4gc2JyayB1dGltZXMKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ2MjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ2MzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGltZV90IGluIHRpbWUuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDY4MDogY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiB0aW1lLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2J1X2N2X2RlY2xfdGltZV90X3RpbWVfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ2ODUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHRpbWUuaD4KK2ludCBtYWluKCkgewordGltZV90IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY5MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCIgMT4mNgoraWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9USU1FX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lX3QgaW4gc3lzL3R5cGVzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ3MTM6IGNoZWNraW5nIGZvciB0aW1lX3QgaW4gc3lzL3R5cGVzLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2J1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NzE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludCBtYWluKCkgewordGltZV90IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcyNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCIgMT4mNgoraWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVFlQRVNfSCAxCitFT0YKKworZmkKKworIyBVbmRlciBOZXh0IDMuMiA8dXRpbWUuaD4gYXBwYXJlbnRseSBkb2VzIG5vdCBkZWZpbmUgc3RydWN0IHV0aW1idWYKKyMgYnkgZGVmYXVsdC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB1dGltZS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NzQ4OiBjaGVja2luZyBmb3IgdXRpbWUuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfaGVhZGVyX3V0aW1lX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NzUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1RJTUVfSAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHV0aW1lLmg+CitpbnQgbWFpbigpIHsKK3N0cnVjdCB1dGltYnVmIHM7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc2NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJ1X2N2X2hlYWRlcl91dGltZV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBidV9jdl9oZWFkZXJfdXRpbWVfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRidV9jdl9oZWFkZXJfdXRpbWVfaCIgMT4mNgoraWYgdGVzdCAkYnVfY3ZfaGVhZGVyX3V0aW1lX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR09PRF9VVElNRV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDc4NTogY2hlY2tpbmcgd2hldGhlciBmcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDc5MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcHJpbnRmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDgxMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50ZiIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlBSSU5URiAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDgzMjogY2hlY2tpbmcgd2hldGhlciBzdHJzdHIgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ4MzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3Ryc3RyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg1ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0ODc5OiBjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0ODg0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHNicmsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTA1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrIiAxPiY2CitpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TQlJLIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0OTI2OiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDkzMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTUyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2CitpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ5NzM6IGNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ5NzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZW52aXJvbgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5OTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24iIDE+JjYKK2lmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04gMQorRU9GCisKK2ZpCisKKworCitjYXNlICIke2hvc3R9IiBpbgorKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKK0VPRgorIDs7Citlc2FjCisKKyMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgorCisjIENhbm9uaWNhbGl6ZSB0aGUgc2Vjb25kYXJ5IHRhcmdldCBuYW1lcy4KK2lmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyI7IHRoZW4KKyAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAorICAgIGRvCisJcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKKwlpZiB0ZXN0IC1uICIkcmVzdWx0IjsgdGhlbgorCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgorCWVsc2UKKwkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KKwkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCisJZmkKKyAgICBkb25lCitmaQorCithbGxfdGFyZ2V0cz1mYWxzZQorQlVJTERfTkxNQ09OVj0KK05MTUNPTlZfREVGUz0KK0JVSUxEX1NSQ09OVj0KK0JVSUxEX0RMTFRPT0w9CitETExUT09MX0RFRlM9CitCVUlMRF9XSU5EUkVTPQorQlVJTERfRExMV1JBUD0KK0JVSUxEX01JU0M9CisKK2ZvciB0YXJnIGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMKK2RvCisgICAgaWYgdGVzdCAieCR0YXJnIiA9ICJ4YWxsIjsgdGhlbgorICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCisJQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJworCUJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknCisJTkxNQ09OVl9ERUZTPSItRE5MTUNPTlZfSTM4NiAtRE5MTUNPTlZfQUxQSEEgLUROTE1DT05WX1BPV0VSUEMgLUROTE1DT05WX1NQQVJDIgorICAgIGVsc2UKKwljYXNlICR0YXJnIGluCisJaVszNDU2XTg2Ki0qLW5ldHdhcmUqKSAKKwkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKKwkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfSTM4NiIKKwkgIDs7CisJYWxwaGEqLSotbmV0d2FyZSopCisJICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCisJICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0FMUEhBIgorCSAgOzsKKwlwb3dlcnBjKi0qLW5ldHdhcmUqKQorCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJworCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9QT1dFUlBDIgorCSAgOzsKKwlzcGFyYyotKi1uZXR3YXJlKikKKwkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKKwkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfU1BBUkMiCisJICA7OworCWVzYWMKKwljYXNlICR0YXJnIGluCisJKi0qLWhtcyopIEJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknIDs7CisJZXNhYworCWNhc2UgJHRhcmcgaW4KKwlhcm0tKnBlKikKKyAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJworCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCisJICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCisJIDs7CisJdGh1bWItKnBlKikKKyAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJworCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCisJICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCisJIDs7CisJaVszLTZdODYtKnBlKiB8IGlbMy02XTg2LSotY3lnd2luKiB8IGlbMy02XTg2LSotbWluZ3czMiopCisgIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKKwkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfSTM4NiIKKwkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKKwkgIEJVSUxEX0RMTFdSQVA9JyQoRExMV1JBUF9QUk9HKSQoRVhFRVhUKScKKwkgOzsKKwlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCisgIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKKwkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgorCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJworCSA7OworCWVzYWMKKyAgICBmaQorZG9uZQorCisKKworCisKKworCisKKworCitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBUQVJHRVQgIiR7dGFyZ2V0fSIKK0VPRgorCisKK3Rhcmc9JHRhcmdldAorLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCitpZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KKyAgICBVTkRFUlNDT1JFPTEKK2Vsc2UKKyAgICBVTkRFUlNDT1JFPTAKK2ZpCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBGRkxBR1NAJSRGRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZworcyVAVkVSU0lPTkAlJFZFUlNJT04lZworcyVAQUNMT0NBTEAlJEFDTE9DQUwlZworcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCitzJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKK3MlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKK3MlQE1BS0VJTkZPQCUkTUFLRUlORk8lZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAQ0NAJSRDQyVnCitzJUBMREAlJExEJWcKK3MlQE5NQCUkTk0lZworcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKK3MlQExOX1NAJSRMTl9TJWcKK3MlQERMTFRPT0xAJSRETExUT09MJWcKK3MlQEFTQCUkQVMlZworcyVATElCVE9PTEAlJExJQlRPT0wlZworcyVAWUFDQ0AlJFlBQ0MlZworcyVATEVYQCUkTEVYJWcKK3MlQExFWExJQkAlJExFWExJQiVnCitzJUBDUFBAJSRDUFAlZworcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKK3MlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZworcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVARVhFRVhUX0ZPUl9CVUlMREAlJEVYRUVYVF9GT1JfQlVJTEQlZworcyVATkxNQ09OVl9ERUZTQCUkTkxNQ09OVl9ERUZTJWcKK3MlQEJVSUxEX05MTUNPTlZAJSRCVUlMRF9OTE1DT05WJWcKK3MlQEJVSUxEX1NSQ09OVkAlJEJVSUxEX1NSQ09OViVnCitzJUBCVUlMRF9ETExUT09MQCUkQlVJTERfRExMVE9PTCVnCitzJUBETExUT09MX0RFRlNAJSRETExUT09MX0RFRlMlZworcyVAQlVJTERfV0lORFJFU0AlJEJVSUxEX1dJTkRSRVMlZworcyVAQlVJTERfRExMV1JBUEAlJEJVSUxEX0RMTFdSQVAlZworcyVAQlVJTERfTUlTQ0AlJEJVSUxEX01JU0MlZworcyVAVU5ERVJTQ09SRUAlJFVOREVSU0NPUkUlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3Rlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCisKK2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Citlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuYmF0IGIvYmludXRpbHMvY29uZmlndXJlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mN2Q3MGYxCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvY29uZmlndXJlLmJhdApAQCAtMCwwICsxLDYzIEBACitAZWNobyBvZmYNCitpZiAiJTEiID09ICJoOC8zMDAiIGdvdG8gaDgzMDANCisNCitlY2hvIENvbmZpZ3VyaW5nIGJpbnV0aWxzIGZvciBnbzMyDQordXBkYXRlIC4uL2JmZC9ob3N0cy9nbzMyLmggc3lzZGVwLmgNCitnb3RvIGNvbW1vbg0KKw0KKzpoODMwMA0KK2VjaG8gQ29uZmlndXJpbmcgYmludXRpbHMgZm9yIEg4LzMwMA0KK3VwZGF0ZSAuLlxiZmRcaG9zdHNcaC1nbzMyLmggc3lzZGVwLmgNCisNCis6Y29tbW9uDQorDQorZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQorDQoraWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KKw0KK3NlZCAtbiAiL15WRVJTSU9OPS8gcCIgTWFrZWZpbGUuaW4gfCBzZWQgLWUgInMvXi9zXi8iIC1lICJzLz0vXlwiLyIgLWUgInMvJC9cIl4vIiA+IGNvbmZpZy5zZWQNCitzZWQgLWYgY29uZmlnLnNlZCB2ZXJzaW9uLmMgPiB2ZXJzaW9uMi5jDQorDQoraWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KKw0KK2VjaG8gInMvdmVyc2lvblwuL3ZlcnNpb24yXC4vZwkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvLURWRVJTSU9OPVteIF0qIC8vCQkJCSI+PiBjb25maWcuc2VkDQorDQorZWNobyAicy9eCVwkKHNyY2RpcilcL21vdmUtaWYtY2hhbmdlLwl1cGRhdGUvCSI+PiBjb25maWcuc2VkDQorZWNobyAiL14jIyMkLyBpXAkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJDQyA9IGdjYwkJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy86XChbXiAJXVwpLzogXDEvZwkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvXglcICpcLlwvLwlnbzMyIC8JCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvYGVjaG8gXCQoc3JjZGlyKVwvLy9nCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy8gfCBzZWQgJ3MsXF5cXFwuXC8sLCdgLy9nCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL14JY2QgXCQoc3JjZGlyKVsgCV0qOy8vCQkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICIvXmFycGFyc2VcLmMvIGlcCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gImFycGFyc2UubzogYXJwYXJzZS5jXAkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIgkkKENDKSAtYyAkKENGTEFHUykgJChJTkNMVURFUykgJChIREVGSU5FUykgJChUREVGSU5FUykgYXJwYXJzZS5jICI+PiBjb25maWcuc2VkDQorZWNobyAiL1wkKEJJU09OKS8gY1wJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAiCWJpc29uICQoQklTT05GTEFHUykgLW8gJEAgYXJwYXJzZS55CQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIi95XC50YWJcLi8gZAkJCQkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICIvXmFybGV4LmMvIHsJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAiIGlcCQkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJhcmxleC5vOiBhcmxleC5jCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIiBpXAkJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAiCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKElOQ0xVREVTKSAkKEhERUZJTkVTKSAkKFRERUZJTkVTKSBhcmxleC5jICI+PiBjb25maWcuc2VkDQorZWNobyAifQkJCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIi9cJChMRVgpLyBjXAkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICIJZmxleCAkKExFWF9PUFRJT05TKSBhcmxleC5sCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL2xleFwueXlcLi9sZXh5eS4vZwkJCQkiPj4gY29uZmlnLnNlZA0KKw0KK2VjaG8gInMvJyIvXFwiL2cJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy8iJy9cXCIvZwkJCQkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICJzL2MrK2ZpbHQvY3h4ZmlsdC9nCQkJCSI+PiBjb25maWcuc2VkDQorDQorc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KK3NlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KK2RlbCBjb25maWcuc2VkDQorZGVsIGNvbmZpZzIuc2VkDQorDQorZWNobyBpbnQgcHJlcGVuZHNfdW5kZXJzY29yZSA9IDE7ID4gdW5kZXJzY29yZS5jDQorDQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29uZmlndXJlLmNvbSBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0NjNkNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20KQEAgLTAsMCArMSw3NiBAQAorJCEKKyQhIFRoaXMgZmlsZSBjb25maWd1cmVzIGJpbnV0aWxzIGZvciB1c2Ugd2l0aCBvcGVuVk1TL0FscGhhCiskISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiskISB0byBleGVjdXRlIGl0LgorJCEKKyQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKKyQhCiskYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCiskYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCiskIQorJCEKKyQhIEdlbmVyYXRlIGNvbmZpZy5oCiskIQorJCBjcmVhdGUgW11jb25maWcuaAorLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLworLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisvKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gICovCisjZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCisvKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+PyAgKi8KKyNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVFlQRVNfSCAxCisvKiBEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/ICAqLworI2RlZmluZSBIQVZFX0dPT0RfVVRJTUVfSCAxCisvKiBXaGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRpby5oPiBpcyBpbmNsdWRlZC4gICovCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlBSSU5URiAxCisvKiBXaGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDx1bmlzdGQuaD4gaXMgaW5jbHVkZWQuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSworLyogRG8gd2UgbmVlZCB0byB1c2UgdGhlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gICovCisvKiAjdW5kZWYgVVNFX0JJTkFSWV9GT1BFTiAqLworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KKy8qICN1bmRlZiBIQVZFX1NCUksgMSAqLworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1dGltZXMgZnVuY3Rpb24uICAqLworI2RlZmluZSBIQVZFX1VUSU1FUyAxCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRkNOVExfSCAxCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9TWVNfRklMRV9IIDEKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKKyQhCiskIQorJCEgRWRpdCBWRVJTSU9OIGluIG1ha2VmaWxlLnZtcy1pbgorJCEKKyQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQorICAgICAgICBbXW1ha2VmaWxlLnZtcy1pbiAvb3V0cHV0PVtdbWFrZWZpbGUudm1zCiskREVDSworIQorISBHZXQgVkVSU0lPTiBmcm9tIGNvbmZpZ3VyZS5pbgorIQorICAgbWZpbGUgOj0gQ1JFQVRFX0JVRkZFUigibWZpbGUiLCAiQ09ORklHVVJFLklOIik7CisgICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YobWZpbGUpLCBFTkRfT0YobWZpbGUpKTsKKyAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiaW51dGlscywgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOworICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKKyAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOworICAgICBFUkFTRShtYXRjaF9wb3MpOworICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7CisgICBFTFNFOworICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKKyAgIEVORElGOworCisgICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CisgICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7CisgICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKKyAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKKyAgIEVSQVNFKG1hdGNoX3Bvcyk7CisgICBDT1BZX1RFWFQodmVycyk7CisgICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOworICAgUVVJVAorJCAgRU9ECiskIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0ZWQgYG1ha2VmaWxlLnZtcyciCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuaW4gYi9iaW51dGlscy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4ZGNkOAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDIyMSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwKK0FDX1BSRVJFUSgyLjEzKQorQUNfSU5JVChhci5jKQorCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FNX0lOSVRfQVVUT01BS0UoYmludXRpbHMsIDIuOS40KQorCitBTV9QUk9HX0xJQlRPT0wKKworQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAorWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKKyAgICAgICAgICAgIDs7CisgIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWNdKWRubAorQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCitbICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OworICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OworICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OworZXNhY10pZG5sCisKK0FNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQorCitpZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQorZmkKK2lmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKK2ZpCisKK0FDX1BST0dfQ0MKKworQUNfUFJPR19ZQUNDCitBTV9QUk9HX0xFWAorCitBTExfTElOR1VBUz0KK0NZX0dOVV9HRVRURVhUCisKK0FNX01BSU5UQUlORVJfTU9ERQorQUNfRVhFRVhUCisKKyMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKKworSERFRklORVM9CisKKy4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAorCitBQ19TVUJTVChIREVGSU5FUykKK0FSPSR7QVItYXJ9CitBQ19TVUJTVChBUikKK0FDX1BST0dfUkFOTElCCitBQ19QUk9HX0lOU1RBTEwKKworQkZEX0NDX0ZPUl9CVUlMRAorCitBQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaCBmY250bC5oIHN5cy9maWxlLmgpCitBQ19IRUFERVJfU1lTX1dBSVQKK0FDX0ZVTkNfQUxMT0NBCitBQ19DSEVDS19GVU5DUyhzYnJrIHV0aW1lcykKKworQUNfTVNHX0NIRUNLSU5HKGZvciB0aW1lX3QgaW4gdGltZS5oKQorQUNfQ0FDSEVfVkFMKGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaCwKK1tBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHRpbWUuaD5dLCBbdGltZV90IGk7XSwKK2J1X2N2X2RlY2xfdGltZV90X3RpbWVfaD15ZXMsIGJ1X2N2X2RlY2xfdGltZV90X3RpbWVfaD1ubyldKQorQUNfTVNHX1JFU1VMVCgkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oKQoraWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oID0geWVzOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9USU1FX1RfSU5fVElNRV9IXSwgMSwKKwkgICAgW0lzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDx0aW1lLmg+P10pCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCkKK0FDX0NBQ0hFX1ZBTChidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oLAorW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwgW3RpbWVfdCBpO10sCitidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPXllcywgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD1ubyldKQorQUNfTVNHX1JFU1VMVCgkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCkKK2lmIHRlc3QgJGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2ggPSB5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKFtIQVZFX1RJTUVfVF9JTl9UWVBFU19IXSwgMSwKKwkgICAgW0lzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/XSkKK2ZpCisKKyMgVW5kZXIgTmV4dCAzLjIgPHV0aW1lLmg+IGFwcGFyZW50bHkgZG9lcyBub3QgZGVmaW5lIHN0cnVjdCB1dGltYnVmCisjIGJ5IGRlZmF1bHQuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB1dGltZS5oXSkKK0FDX0NBQ0hFX1ZBTChidV9jdl9oZWFkZXJfdXRpbWVfaCwKK1tBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfVElNRV9ICisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dXRpbWUuaD5dLAorW3N0cnVjdCB1dGltYnVmIHM7XSwKK2J1X2N2X2hlYWRlcl91dGltZV9oPXllcywgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9bm8pXSkKK0FDX01TR19SRVNVTFQoJGJ1X2N2X2hlYWRlcl91dGltZV9oKQoraWYgdGVzdCAkYnVfY3ZfaGVhZGVyX3V0aW1lX2ggPSB5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfR09PRF9VVElNRV9ILCAxLCBbRG9lcyA8dXRpbWUuaD4gZGVmaW5lIHN0cnVjdCB1dGltYnVmP10pCitmaQorCitCRkRfTkVFRF9ERUNMQVJBVElPTihmcHJpbnRmKQorQkZEX05FRURfREVDTEFSQVRJT04oc3Ryc3RyKQorQkZEX05FRURfREVDTEFSQVRJT04oc2JyaykKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKGVudmlyb24pCisKK0JGRF9CSU5BUllfRk9QRU4KKworIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6CisKKyMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgoraWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIjsgdGhlbgorICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCisgICAgZG8KKwlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAorCWlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCisJICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCisJZWxzZQorCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgorCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKKwlmaQorICAgIGRvbmUKK2ZpCisKK2FsbF90YXJnZXRzPWZhbHNlCitCVUlMRF9OTE1DT05WPQorTkxNQ09OVl9ERUZTPQorQlVJTERfU1JDT05WPQorQlVJTERfRExMVE9PTD0KK0RMTFRPT0xfREVGUz0KK0JVSUxEX1dJTkRSRVM9CitCVUlMRF9ETExXUkFQPQorQlVJTERfTUlTQz0KKworZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cworZG8KKyAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCisgICAgICAgIGFsbF90YXJnZXRzPXRydWUKKwlCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCisJQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScKKwlOTE1DT05WX0RFRlM9Ii1ETkxNQ09OVl9JMzg2IC1ETkxNQ09OVl9BTFBIQSAtRE5MTUNPTlZfUE9XRVJQQyAtRE5MTUNPTlZfU1BBUkMiCisgICAgZWxzZQorCWNhc2UgJHRhcmcgaW4KK2NoYW5nZXF1b3RlKCwpZG5sCisJaVszNDU2XTg2Ki0qLW5ldHdhcmUqKSAKK2NoYW5nZXF1b3RlKFssXSlkbmwKKwkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKKwkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfSTM4NiIKKwkgIDs7CisJYWxwaGEqLSotbmV0d2FyZSopCisJICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCisJICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX0FMUEhBIgorCSAgOzsKKwlwb3dlcnBjKi0qLW5ldHdhcmUqKQorCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJworCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9QT1dFUlBDIgorCSAgOzsKKwlzcGFyYyotKi1uZXR3YXJlKikKKwkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKKwkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfU1BBUkMiCisJICA7OworCWVzYWMKKwljYXNlICR0YXJnIGluCisJKi0qLWhtcyopIEJVSUxEX1NSQ09OVj0nJChTUkNPTlZfUFJPRyknIDs7CisJZXNhYworCWNhc2UgJHRhcmcgaW4KKwlhcm0tKnBlKikKKyAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJworCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCisJICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCisJIDs7CisJdGh1bWItKnBlKikKKyAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJworCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9BUk0iCisJICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCisJIDs7CitjaGFuZ2VxdW90ZSgsKWRubAorCWlbMy02XTg2LSpwZSogfCBpWzMtNl04Ni0qLWN5Z3dpbiogfCBpWzMtNl04Ni0qLW1pbmd3MzIqKQorY2hhbmdlcXVvdGUoWyxdKWRubAorICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCisJICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0kzODYiCisJICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCisJICBCVUlMRF9ETExXUkFQPSckKERMTFdSQVBfUFJPRykkKEVYRUVYVCknCisJIDs7CisJcG93ZXJwYyotKi0qcGUqIHwgcG93ZXJwYyotKi1jeWd3aW4qKQorICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCisJICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX1BQQyIKKwkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKKwkgOzsKKwllc2FjCisgICAgZmkKK2RvbmUKKworQUNfU1VCU1QoTkxNQ09OVl9ERUZTKQorQUNfU1VCU1QoQlVJTERfTkxNQ09OVikKK0FDX1NVQlNUKEJVSUxEX1NSQ09OVikKK0FDX1NVQlNUKEJVSUxEX0RMTFRPT0wpCitBQ19TVUJTVChETExUT09MX0RFRlMpCitBQ19TVUJTVChCVUlMRF9XSU5EUkVTKQorQUNfU1VCU1QoQlVJTERfRExMV1JBUCkKK0FDX1NVQlNUKEJVSUxEX01JU0MpCisKK0FDX0RFRklORV9VTlFVT1RFRChUQVJHRVQsICIke3RhcmdldH0iLCBbQ29uZmlndXJlZCB0YXJnZXQgbmFtZS5dKQorCit0YXJnPSR0YXJnZXQKKy4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAoraWYgdGVzdCAieCR0YXJnX3VuZGVyc2NvcmUiID0gInh5ZXMiOyB0aGVuCisgICAgVU5ERVJTQ09SRT0xCitlbHNlCisgICAgVU5ERVJTQ09SRT0wCitmaQorQUNfU1VCU1QoVU5ERVJTQ09SRSkKKworQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCitbCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyopIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZSA7OworZXNhYworXSkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2N4eGZpbHQubWFuIGIvYmludXRpbHMvY3h4ZmlsdC5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkNWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2N4eGZpbHQubWFuCkBAIC0wLDAgKzEsMTE0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggQFBST0dSQU1AIDEgIkp1bmUgMTk5MyIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgorLmRlIEJQCisuc3AKKy50aSBcLS4yaQorXCgqKgorLi4KKworLlNIIE5BTUUKK0BQUk9HUkFNQCBcLSBkZW1hbmdsZSBDKysgc3ltYm9scworCisuU0ggU1lOT1BTSVMKKy5oeSAwCisubmEKKy5UUAorLkIgQFBST0dSQU1ACisuUkIgIltcfCIgXC1fIHwgXC1cLXN0cmlwLXVuZGVyc2NvcmVzICJcfF0iCisuUkIgIltcfCIgIlwtcyB7Z251LGx1Y2lkLGFybX0gIiB8ICIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0iICJcfF0iCisuUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKKy5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgorLlJCICJbXHwiIHN5bWJvbCAiLi4uXHxdIgorLlNIIERFU0NSSVBUSU9OCitUaGUgQysrIGxhbmd1YWdlIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucyB0aGF0IHlvdSBjYW4KK3dyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2ggdGFrZXMgcGFyYW1ldGVycworb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgZnVuY3Rpb24gbmFtZXMgYXJlIGVuY29kZWQgaW50byBhCitsb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcworLkkgbWFuZ2xpbmdcYworKS4gIFRoZSAKKy5CIEBQUk9HUkFNQAorcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0IGRlY29kZXMgKFxmSWRlbWFuZ2xlc1xmUikKK2xvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdCB0aGUgbGlua2VyIGNhbiBrZWVwCit0aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgorLlBQCitFdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAorZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKK2xhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAorbmFtZSBpbiB0aGUgb3V0cHV0LgorLlBQCitZb3UgY2FuIHVzZQorLkIgQFBST0dSQU1ACit0byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHMgYnkgc3BlY2lmeWluZyB0aGVzZSBzeW1ib2xzIG9uIHRoZQorY29tbWFuZCBsaW5lLgorLlBQCitJZiBubworLkIgc3ltYm9sCithcmd1bWVudHMgYXJlIGdpdmVuLAorLkIgQFBST0dSQU1ACityZWFkcyBzeW1ib2wgbmFtZXMgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyB0aGUgZGVtYW5nbGVkCituYW1lcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAgQWxsIHJlc3VsdHMgYXJlIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkCitvdXRwdXQuCisuU0ggT1BUSU9OUworLlRQCisuQiBcLV8KKy5UUAorLkIgXC1cLXN0cmlwXC11bmRlcnNjb3JlcworT24gc29tZSBzeXN0ZW1zLCBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHB1dCBhbgordW5kZXJzY29yZSBpbiBmcm9udCBvZiBldmVyeSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBDIG5hbWUgCisuQiBmb28KK2dldHMgdGhlIGxvdy1sZXZlbCBuYW1lIAorLkJSIF9mb28gLgorVGhpcyBvcHRpb24gcmVtb3ZlcyB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLgorCisuVFAKKy5CICJcLXMge2dudSxsdWNpZCxhcm19IgorLlRQCisuQiBcLVwtZm9ybWF0PXtnbnUsbHVjaWQsYXJtfQorR05VCisuQiBubQorY2FuIGRlY29kZSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcyBvZiBtYW5nbGluZywgdXNlZCBieSBkaWZmZXJlbnQgQysrCitjb21waWxlcnMuICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoaWNoIG1ldGhvZCBpdCB1c2VzOiB0aGUgb25lIHVzZWQgYnkKK3RoZSBHTlUgY29tcGlsZXIsIHRoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIsIG9yIHRoZSBvbmUKK3NwZWNpZmllZCBieSB0aGUgQysrIEFubm90YXRlZCBSZWZlcmVuY2UgTWFudWFsLiAgVGhlIGRlZmF1bHQgaXMgdGhlCitHTlUgc3R5bGUuCisKKy5UUAorLkIgXC1cLWhlbHAKK1ByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bworLkIgQFBST0dSQU1ACithbmQgZXhpdC4KKworLlRQCisuQiBcLVwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCisuQiBAUFJPR1JBTUAKK2FuZCBleGl0LgorCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAorZW50cnkgaW4gCisuQgoraW5mb1xjCitcJjsgCisuSQorVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKK1wmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCisKKy5TSCBDT1BZSU5HCitDb3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKK21hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAordmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCit0cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCit0aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlYnVnLmMgYi9iaW51dGlscy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3M2Q2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9kZWJ1Zy5jCkBAIC0wLDAgKzEsMzU2OCBAQAorLyogZGVidWcuYyAtLSBIYW5kbGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGltcGxlbWVudHMgYSBnZW5lcmljIGRlYnVnZ2luZyBmb3JtYXQuICBXZSBtYXkgZXZlbnR1YWxseQorICAgaGF2ZSByZWFkZXJzIHdoaWNoIGNvbnZlcnQgZGlmZmVyZW50IGZvcm1hdHMgaW50byB0aGlzIGdlbmVyaWMKKyAgIGZvcm1hdCwgYW5kIHdyaXRlcnMgd2hpY2ggd3JpdGUgaXQgb3V0LiAgVGhlIGluaXRpYWwgaW1wZXR1cyBmb3IKKyAgIHRoaXMgd2FzIHdyaXRpbmcgYSBjb252ZXJ0b3IgZnJvbSBzdGFicyB0byBIUCBJRUVFLTY5NSBkZWJ1Z2dpbmcKKyAgIGZvcm1hdC4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworLyogR2xvYmFsIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGRlYnVnZ2luZy4gIEEgcG9pbnRlciB0byB0aGlzCisgICBzdHJ1Y3R1cmUgaXMgdGhlIGRlYnVnZ2luZyBoYW5kbGUgcGFzc2VkIHRvIGFsbCB0aGUgcm91dGluZXMuICAqLworCitzdHJ1Y3QgZGVidWdfaGFuZGxlCit7CisgIC8qIEEgbGlua2VkIGxpc3Qgb2YgY29tcGlsYXRpb24gdW5pdHMuICAqLworICBzdHJ1Y3QgZGVidWdfdW5pdCAqdW5pdHM7CisgIC8qIFRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLworICBzdHJ1Y3QgZGVidWdfdW5pdCAqY3VycmVudF91bml0OworICAvKiBUaGUgY3VycmVudCBzb3VyY2UgZmlsZS4gICovCisgIHN0cnVjdCBkZWJ1Z19maWxlICpjdXJyZW50X2ZpbGU7CisgIC8qIFRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KKyAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpjdXJyZW50X2Z1bmN0aW9uOworICAvKiBUaGUgY3VycmVudCBibG9jay4gICovCisgIHN0cnVjdCBkZWJ1Z19ibG9jayAqY3VycmVudF9ibG9jazsKKyAgLyogVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHVuaXQuICAqLworICBzdHJ1Y3QgZGVidWdfbGluZW5vICpjdXJyZW50X2xpbmVubzsKKyAgLyogTWFyay4gIFRoaXMgaXMgdXNlZCBieSBkZWJ1Z193cml0ZS4gICovCisgIHVuc2lnbmVkIGludCBtYXJrOworICAvKiBBIHN0cnVjdC9jbGFzcyBJRCB1c2VkIGJ5IGRlYnVnX3dyaXRlLiAgKi8KKyAgdW5zaWduZWQgaW50IGNsYXNzX2lkOworICAvKiBUaGUgYmFzZSBmb3IgY2xhc3NfaWQgZm9yIHRoaXMgY2FsbCB0byBkZWJ1Z193cml0ZS4gICovCisgIHVuc2lnbmVkIGludCBiYXNlX2lkOworICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciBpbiBkZWJ1Z193cml0ZS4gICovCisgIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmN1cnJlbnRfd3JpdGVfbGluZW5vOworICB1bnNpZ25lZCBpbnQgY3VycmVudF93cml0ZV9saW5lbm9faW5kZXg7CisgIC8qIEEgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIGhhdmUgYXNzaWduZWQgSUQncyBkdXJpbmcgZGVidWdfd3JpdGUuCisgICAgIFRoaXMgaXMgbGlua2VkIHRocm91Z2ggdGhlIG5leHRfaWQgZmllbGQgb2YgZGVidWdfY2xhc3NfdHlwZS4gICovCisgIHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqaWRfbGlzdDsKKyAgLyogQSBsaXN0IHVzZWQgdG8gYXZvaWQgcmVjdXJzaW9uIGR1cmluZyBkZWJ1Z190eXBlX3NhbWVwLiAgKi8KKyAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0ICpjb21wYXJlX2xpc3Q7Cit9OworCisvKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiAgKi8KKworc3RydWN0IGRlYnVnX3VuaXQKK3sKKyAgLyogVGhlIG5leHQgY29tcGlsYXRpb24gdW5pdC4gICovCisgIHN0cnVjdCBkZWJ1Z191bml0ICpuZXh0OworICAvKiBBIGxpc3Qgb2YgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LiAgVGhlIGZpcnN0CisgICAgIGZpbGUgaXMgYWx3YXlzIHRoZSBtYWluIG9uZSwgYW5kIHRoYXQgaXMgd2hlcmUgdGhlIG1haW4gZmlsZSBuYW1lCisgICAgIGlzIHN0b3JlZC4gICovCisgIHN0cnVjdCBkZWJ1Z19maWxlICpmaWxlczsKKyAgLyogTGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gIFRoaXMgaXMgbm90CisgICAgIHN0b3JlZCBieSBmdW5jdGlvbiwgYmVjYXVzZSBhc3NlbWJsZXIgY29kZSBtYXkgaGF2ZSBsaW5lIG51bWJlcgorICAgICBpbmZvcm1hdGlvbiB3aXRob3V0IGZ1bmN0aW9uIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGRlYnVnX2xpbmVubyAqbGluZW5vczsKK307CisKKy8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgc2luZ2xlIHNvdXJjZSBmaWxlLiAgKi8KKworc3RydWN0IGRlYnVnX2ZpbGUKK3sKKyAgLyogVGhlIG5leHQgc291cmNlIGZpbGUgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LiAgKi8KKyAgc3RydWN0IGRlYnVnX2ZpbGUgKm5leHQ7CisgIC8qIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS4gICovCisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAvKiBHbG9iYWwgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIHR5cGVzLCBldGMuICAqLworICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICpnbG9iYWxzOworfTsKKworLyogQSB0eXBlLiAgKi8KKworc3RydWN0IGRlYnVnX3R5cGUKK3sKKyAgLyogS2luZCBvZiB0eXBlLiAgKi8KKyAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKKyAgLyogU2l6ZSBvZiB0eXBlICgwIGlmIG5vdCBrbm93bikuICAqLworICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgLyogVHlwZSB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhpcyB0eXBlLiAgKi8KKyAgZGVidWdfdHlwZSBwb2ludGVyOworICAvKiBUYWdnZWQgdW5pb24gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlLiAgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICAvKiBERUJVR19LSU5EX0lORElSRUNULiAgKi8KKyAgICAgIHN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlICpraW5kaXJlY3Q7CisgICAgICAvKiBERUJVR19LSU5EX0lOVC4gICovCisgICAgICAvKiBXaGV0aGVyIHRoZSBpbnRlZ2VyIGlzIHVuc2lnbmVkLiAgKi8KKyAgICAgIGJvb2xlYW4ga2ludDsKKyAgICAgIC8qIERFQlVHX0tJTkRfU1RSVUNULCBERUJVR19LSU5EX1VOSU9OLCBERUJVR19LSU5EX0NMQVNTLAorICAgICAgICAgREVCVUdfS0lORF9VTklPTl9DTEFTUy4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqa2NsYXNzOworICAgICAgLyogREVCVUdfS0lORF9FTlVNLiAgKi8KKyAgICAgIHN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUgKmtlbnVtOworICAgICAgLyogREVCVUdfS0lORF9QT0lOVEVSLiAgKi8KKyAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprcG9pbnRlcjsKKyAgICAgIC8qIERFQlVHX0tJTkRfRlVOQ1RJT04uICAqLworICAgICAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUgKmtmdW5jdGlvbjsKKyAgICAgIC8qIERFQlVHX0tJTkRfUkVGRVJFTkNFLiAgKi8KKyAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprcmVmZXJlbmNlOworICAgICAgLyogREVCVUdfS0lORF9SQU5HRS4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZSAqa3JhbmdlOworICAgICAgLyogREVCVUdfS0lORF9BUlJBWS4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZSAqa2FycmF5OworICAgICAgLyogREVCVUdfS0lORF9TRVQuICAqLworICAgICAgc3RydWN0IGRlYnVnX3NldF90eXBlICprc2V0OworICAgICAgLyogREVCVUdfS0lORF9PRkZTRVQuICAqLworICAgICAgc3RydWN0IGRlYnVnX29mZnNldF90eXBlICprb2Zmc2V0OworICAgICAgLyogREVCVUdfS0lORF9NRVRIT0QuICAqLworICAgICAgc3RydWN0IGRlYnVnX21ldGhvZF90eXBlICprbWV0aG9kOworICAgICAgLyogREVCVUdfS0lORF9DT05TVC4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa2NvbnN0OworICAgICAgLyogREVCVUdfS0lORF9WT0xBVElMRS4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqa3ZvbGF0aWxlOworICAgICAgLyogREVCVUdfS0lORF9OQU1FRCwgREVCVUdfS0lORF9UQUdHRUQuICAqLworICAgICAgc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKmtuYW1lZDsKKyAgICB9IHU7Cit9OworCisvKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KKworc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUKK3sKKyAgLyogU2xvdCB3aGVyZSB0aGUgZmluYWwgdHlwZSB3aWxsIGFwcGVhci4gICovCisgIGRlYnVnX3R5cGUgKnNsb3Q7CisgIC8qIFRhZy4gICovCisgIGNvbnN0IGNoYXIgKnRhZzsKK307CisKKy8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgc3RydWN0LCB1bmlvbiwgb3IgY2xhc3MuICAqLworCitzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZQoreworICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KKyAgZGVidWdfZmllbGQgKmZpZWxkczsKKyAgLyogQSBtYXJrIGZpZWxkIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJ1Y3QgaGFzIGFscmVhZHkgYmVlbgorICAgICBwcmludGVkLiAgKi8KKyAgdW5zaWduZWQgaW50IG1hcms7CisgIC8qIFRoaXMgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB1bm5hbWVkIHN0cnVjdHMgd2hlbiBwcmludGluZy4gICovCisgIHVuc2lnbmVkIGludCBpZDsKKyAgLyogVGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBmb3IgREVCVUdfS0lORF9DTEFTUyBhbmQKKyAgICAgREVCVUdfS0lORF9VTklPTl9DTEFTUy4gICovCisgIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBiYXNlIGNsYXNzZXMuICAqLworICBkZWJ1Z19iYXNlY2xhc3MgKmJhc2VjbGFzc2VzOworICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbWV0aG9kcy4gICovCisgIGRlYnVnX21ldGhvZCAqbWV0aG9kczsKKyAgLyogVGhlIHR5cGUgb2YgdGhlIGNsYXNzIHByb3ZpZGluZyB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBmb3IKKyAgICAgdGhpcyBjbGFzcy4gIFRoaXMgbWF5IHBvaW50IHRvIHRoZSB0eXBlIGl0c2VsZi4gICovCisgIGRlYnVnX3R5cGUgdnB0cmJhc2U7Cit9OworCisvKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhbiBlbnVtLiAgKi8KKworc3RydWN0IGRlYnVnX2VudW1fdHlwZQoreworICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbmFtZXMuICAqLworICBjb25zdCBjaGFyICoqbmFtZXM7CisgIC8qIEFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KKyAgYmZkX3NpZ25lZF92bWEgKnZhbHVlczsKK307CisKKy8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgZnVuY3Rpb24uICBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8KKyAgIHJlY29yZCB0aGUgcGFyYW1ldGVyIHR5cGVzLiAgKi8KKworc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUKK3sKKyAgLyogUmV0dXJuIHR5cGUuICAqLworICBkZWJ1Z190eXBlIHJldHVybl90eXBlOworICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLworICBkZWJ1Z190eXBlICphcmdfdHlwZXM7CisgIC8qIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisgIGJvb2xlYW4gdmFyYXJnczsKK307CisKKy8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgcmFuZ2UuICAqLworCitzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZQoreworICAvKiBSYW5nZSBiYXNlIHR5cGUuICAqLworICBkZWJ1Z190eXBlIHR5cGU7CisgIC8qIExvd2VyIGJvdW5kLiAgKi8KKyAgYmZkX3NpZ25lZF92bWEgbG93ZXI7CisgIC8qIFVwcGVyIGJvdW5kLiAgKi8KKyAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Cit9OworCisvKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhbiBhcnJheS4gICovCisKK3N0cnVjdCBkZWJ1Z19hcnJheV90eXBlCit7CisgIC8qIEVsZW1lbnQgdHlwZS4gICovCisgIGRlYnVnX3R5cGUgZWxlbWVudF90eXBlOworICAvKiBSYW5nZSB0eXBlLiAgKi8KKyAgZGVidWdfdHlwZSByYW5nZV90eXBlOworICAvKiBMb3dlciBib3VuZC4gICovCisgIGJmZF9zaWduZWRfdm1hIGxvd2VyOworICAvKiBVcHBlciBib3VuZC4gICovCisgIGJmZF9zaWduZWRfdm1hIHVwcGVyOworICAvKiBXaGV0aGVyIHRoaXMgYXJyYXkgaXMgcmVhbGx5IGEgc3RyaW5nLiAgKi8KKyAgYm9vbGVhbiBzdHJpbmdwOworfTsKKworLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzZXQuICAqLworCitzdHJ1Y3QgZGVidWdfc2V0X3R5cGUKK3sKKyAgLyogQmFzZSB0eXBlLiAgKi8KKyAgZGVidWdfdHlwZSB0eXBlOworICAvKiBXaGV0aGVyIHRoaXMgc2V0IGlzIHJlYWxseSBhIGJpdHN0cmluZy4gICovCisgIGJvb2xlYW4gYml0c3RyaW5ncDsKK307CisKKy8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIG9mZnNldCB0eXBlIChhIGJhc2VkIHBvaW50ZXIpLiAgKi8KKworc3RydWN0IGRlYnVnX29mZnNldF90eXBlCit7CisgIC8qIFRoZSB0eXBlIHRoZSBwb2ludGVyIGlzIGFuIG9mZnNldCBmcm9tLiAgKi8KKyAgZGVidWdfdHlwZSBiYXNlX3R5cGU7CisgIC8qIFRoZSB0eXBlIHRoZSBwb2ludGVyIHBvaW50cyB0by4gICovCisgIGRlYnVnX3R5cGUgdGFyZ2V0X3R5cGU7Cit9OworCisvKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIG1ldGhvZCB0eXBlLiAgKi8KKworc3RydWN0IGRlYnVnX21ldGhvZF90eXBlCit7CisgIC8qIFRoZSByZXR1cm4gdHlwZS4gICovCisgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7CisgIC8qIFRoZSBvYmplY3QgdHlwZSB3aGljaCB0aGlzIG1ldGhvZCBpcyBmb3IuICAqLworICBkZWJ1Z190eXBlIGRvbWFpbl90eXBlOworICAvKiBBIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCisgIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKKyAgLyogV2hldGhlciB0aGUgbWV0aG9kIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisgIGJvb2xlYW4gdmFyYXJnczsKK307CisKKy8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgbmFtZWQgdHlwZS4gICovCisKK3N0cnVjdCBkZWJ1Z19uYW1lZF90eXBlCit7CisgIC8qIE5hbWUuICAqLworICBzdHJ1Y3QgZGVidWdfbmFtZSAqbmFtZTsKKyAgLyogUmVhbCB0eXBlLiAgKi8KKyAgZGVidWdfdHlwZSB0eXBlOworfTsKKworLyogQSBmaWVsZCBpbiBhIHN0cnVjdCBvciB1bmlvbi4gICovCisKK3N0cnVjdCBkZWJ1Z19maWVsZAoreworICAvKiBOYW1lIG9mIHRoZSBmaWVsZC4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIFR5cGUgb2YgdGhlIGZpZWxkLiAgKi8KKyAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7CisgIC8qIFZpc2liaWxpdHkgb2YgdGhlIGZpZWxkLiAgKi8KKyAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgIC8qIFdoZXRoZXIgdGhpcyBpcyBhIHN0YXRpYyBtZW1iZXIuICAqLworICBib29sZWFuIHN0YXRpY19tZW1iZXI7CisgIHVuaW9uCisgICAgeworICAgICAgLyogSWYgc3RhdGljX21lbWJlciBpcyBmYWxzZS4gICovCisgICAgICBzdHJ1Y3QKKwl7CisJICAvKiBCaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkIGluIHRoZSBzdHJ1Y3QuICAqLworCSAgdW5zaWduZWQgaW50IGJpdHBvczsKKwkgIC8qIFNpemUgb2YgdGhlIGZpZWxkIGluIGJpdHMuICAqLworCSAgdW5zaWduZWQgaW50IGJpdHNpemU7CisJfSBmOworICAgICAgLyogSWYgc3RhdGljX21lbWJlciBpcyB0cnVlLiAgKi8KKyAgICAgIHN0cnVjdAorCXsKKwkgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOworCX0gczsKKyAgICB9IHU7Cit9OworCisvKiBBIGJhc2UgY2xhc3MgZm9yIGFuIG9iamVjdC4gICovCisKK3N0cnVjdCBkZWJ1Z19iYXNlY2xhc3MKK3sKKyAgLyogVHlwZSBvZiB0aGUgYmFzZSBjbGFzcy4gICovCisgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOworICAvKiBCaXQgcG9zaXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgaW4gdGhlIG9iamVjdC4gICovCisgIHVuc2lnbmVkIGludCBiaXRwb3M7CisgIC8qIFdoZXRoZXIgdGhlIGJhc2UgY2xhc3MgaXMgdmlydHVhbC4gICovCisgIGJvb2xlYW4gdmlydHVhbDsKKyAgLyogVmlzaWJpbGl0eSBvZiB0aGUgYmFzZSBjbGFzcy4gICovCisgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworfTsKKworLyogQSBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgKi8KKworc3RydWN0IGRlYnVnX21ldGhvZAoreworICAvKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogQSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhbnRzLiAgKi8KKyAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICoqdmFyaWFudHM7Cit9OworCisvKiBUaGUgdmFyaWFudHMgb2YgYSBtZXRob2QgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LiAgVGhlc2UgaW5kaWNhdGUKKyAgIHdoaWNoIG1ldGhvZCB0byBydW4uICAqLworCitzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQKK3sKKyAgLyogVGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KKyAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgIC8qIFRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbi4gICovCisgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOworICAvKiBUaGUgdmlzaWJpbGl0eSBvZiB0aGUgZnVuY3Rpb24uICAqLworICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKyAgLyogV2hldGhlciB0aGUgZnVuY3Rpb24gaXMgY29uc3QuICAqLworICBib29sZWFuIGNvbnN0cDsKKyAgLyogV2hldGhlciB0aGUgZnVuY3Rpb24gaXMgdm9sYXRpbGUuICAqLworICBib29sZWFuIHZvbGF0aWxlcDsKKyAgLyogVGhlIG9mZnNldCB0byB0aGUgZnVuY3Rpb24gaW4gdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICAqLworICBiZmRfdm1hIHZvZmZzZXQ7CisgIC8qIElmIHZvZmZzZXQgaXMgVk9GRlNFVF9TVEFUSUNfTUVUSE9ELCB0aGlzIGlzIGEgc3RhdGljIG1ldGhvZC4gICovCisjZGVmaW5lIFZPRkZTRVRfU1RBVElDX01FVEhPRCAoKGJmZF92bWEpIC0xKQorICAvKiBDb250ZXh0IG9mIGEgdmlydHVhbCBtZXRob2QgZnVuY3Rpb24uICAqLworICBzdHJ1Y3QgZGVidWdfdHlwZSAqY29udGV4dDsKK307CisKKy8qIEEgdmFyaWFibGUuICBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHZhcmlhYmxlIG9iamVjdC4KKyAgIFRoaXMgaGFzIG5vIG5hbWU7IGEgbmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2YXJpYWJsZSBpbiBhCisgICBkZWJ1Z19uYW1lIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBkZWJ1Z192YXJpYWJsZQoreworICAvKiBLaW5kIG9mIHZhcmlhYmxlLiAgKi8KKyAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOworICAvKiBUeXBlLiAgKi8KKyAgZGVidWdfdHlwZSB0eXBlOworICAvKiBWYWx1ZS4gIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgdmFsdWUgZGVwZW5kcyB1cG9uIGtpbmQuICAqLworICBiZmRfdm1hIHZhbDsKK307CisKKy8qIEEgZnVuY3Rpb24uICBUaGlzIGhhcyBubyBuYW1lOyBhIG5hbWUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24KKyAgIGluIGEgZGVidWdfbmFtZSBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgZGVidWdfZnVuY3Rpb24KK3sKKyAgLyogUmV0dXJuIHR5cGUuICAqLworICBkZWJ1Z190eXBlIHJldHVybl90eXBlOworICAvKiBQYXJhbWV0ZXIgaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpwYXJhbWV0ZXJzOworICAvKiBCbG9jayBpbmZvcm1hdGlvbi4gIFRoZSBmaXJzdCBzdHJ1Y3R1cmUgb24gdGhlIGxpc3QgaXMgdGhlIG1haW4KKyAgICAgYmxvY2sgb2YgdGhlIGZ1bmN0aW9uLCBhbmQgZGVzY3JpYmVzIGZ1bmN0aW9uIGxvY2FsIHZhcmlhYmxlcy4gICovCisgIHN0cnVjdCBkZWJ1Z19ibG9jayAqYmxvY2tzOworfTsKKworLyogQSBmdW5jdGlvbiBwYXJhbWV0ZXIuICAqLworCitzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyCit7CisgIC8qIE5leHQgcGFyYW1ldGVyLiAgKi8KKyAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqbmV4dDsKKyAgLyogTmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIFR5cGUuICAqLworICBkZWJ1Z190eXBlIHR5cGU7CisgIC8qIEtpbmQuICAqLworICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOworICAvKiBWYWx1ZSAobWVhbmluZyBkZXBlbmRzIHVwb24ga2luZCkuICAqLworICBiZmRfdm1hIHZhbDsKK307CisKKy8qIEEgdHlwZWQgY29uc3RhbnQuICAqLworCitzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQKK3sKKyAgLyogVHlwZS4gICovCisgIGRlYnVnX3R5cGUgdHlwZTsKKyAgLyogVmFsdWUuICBGSVhNRTogV2UgbWF5IGV2ZW50dWFsbHkgbmVlZCB0byBzdXBwb3J0IG5vbi1pbnRlZ3JhbAorICAgICB2YWx1ZXMuICAqLworICBiZmRfdm1hIHZhbDsKK307CisKKy8qIEluZm9ybWF0aW9uIGFib3V0IGEgYmxvY2sgd2l0aGluIGEgZnVuY3Rpb24uICAqLworCitzdHJ1Y3QgZGVidWdfYmxvY2sKK3sKKyAgLyogTmV4dCBibG9jayB3aXRoIHRoZSBzYW1lIHBhcmVudC4gICovCisgIHN0cnVjdCBkZWJ1Z19ibG9jayAqbmV4dDsKKyAgLyogUGFyZW50IGJsb2NrLiAgKi8KKyAgc3RydWN0IGRlYnVnX2Jsb2NrICpwYXJlbnQ7CisgIC8qIExpc3Qgb2YgY2hpbGQgYmxvY2tzLiAgKi8KKyAgc3RydWN0IGRlYnVnX2Jsb2NrICpjaGlsZHJlbjsKKyAgLyogU3RhcnQgYWRkcmVzcyBvZiB0aGUgYmxvY2suICAqLworICBiZmRfdm1hIHN0YXJ0OworICAvKiBFbmQgYWRkcmVzcyBvZiB0aGUgYmxvY2suICAqLworICBiZmRfdm1hIGVuZDsKKyAgLyogTG9jYWwgdmFyaWFibGVzLiAgKi8KKyAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqbG9jYWxzOworfTsKKworLyogTGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBjb21waWxhdGlvbiB1bml0LiAgRklYTUU6CisgICBUaGlzIHN0cnVjdHVyZSBpcyBlYXN5IHRvIGNyZWF0ZSwgYnV0IGNhbiBiZSB2ZXJ5IHNwYWNlCisgICBpbmVmZmljaWVudC4gICovCisKK3N0cnVjdCBkZWJ1Z19saW5lbm8KK3sKKyAgLyogTW9yZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9jay4gICovCisgIHN0cnVjdCBkZWJ1Z19saW5lbm8gKm5leHQ7CisgIC8qIFNvdXJjZSBmaWxlLiAgKi8KKyAgc3RydWN0IGRlYnVnX2ZpbGUgKmZpbGU7CisgIC8qIExpbmUgbnVtYmVycywgdGVybWluYXRlZCBieSBhIC0xIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5LiAgKi8KKyNkZWZpbmUgREVCVUdfTElORU5PX0NPVU5UIDEwCisgIHVuc2lnbmVkIGxvbmcgbGluZW5vc1tERUJVR19MSU5FTk9fQ09VTlRdOworICAvKiBBZGRyZXNzZXMgZm9yIHRoZSBsaW5lIG51bWJlcnMuICAqLworICBiZmRfdm1hIGFkZHJzW0RFQlVHX0xJTkVOT19DT1VOVF07Cit9OworCisvKiBBIG5hbWVzcGFjZS4gIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gb2JqZWN0cy4gIEZJWE1FOiBUaGlzCisgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYXMgYSBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IGRlYnVnX25hbWVzcGFjZQoreworICAvKiBMaXN0IG9mIGl0ZW1zIGluIHRoaXMgbmFtZXNwYWNlLiAgKi8KKyAgc3RydWN0IGRlYnVnX25hbWUgKmxpc3Q7CisgIC8qIFBvaW50ZXIgdG8gd2hlcmUgdGhlIG5leHQgaXRlbSBpbiB0aGlzIG5hbWVzcGFjZSBzaG91bGQgZ28uICAqLworICBzdHJ1Y3QgZGVidWdfbmFtZSAqKnRhaWw7Cit9OworCisvKiBLaW5kcyBvZiBvYmplY3RzIHRoYXQgYXBwZWFyIGluIGEgbmFtZXNwYWNlLiAgKi8KKworZW51bSBkZWJ1Z19vYmplY3Rfa2luZAoreworICAvKiBBIHR5cGUuICAqLworICBERUJVR19PQkpFQ1RfVFlQRSwKKyAgLyogQSB0YWdnZWQgdHlwZSAocmVhbGx5IGEgZGlmZmVyZW50IHNvcnQgb2YgbmFtZXNwYWNlKS4gICovCisgIERFQlVHX09CSkVDVF9UQUcsCisgIC8qIEEgdmFyaWFibGUuICAqLworICBERUJVR19PQkpFQ1RfVkFSSUFCTEUsCisgIC8qIEEgZnVuY3Rpb24uICAqLworICBERUJVR19PQkpFQ1RfRlVOQ1RJT04sCisgIC8qIEFuIGludGVnZXIgY29uc3RhbnQuICAqLworICBERUJVR19PQkpFQ1RfSU5UX0NPTlNUQU5ULAorICAvKiBBIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KKyAgREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5ULAorICAvKiBBIHR5cGVkIGNvbnN0YW50LiAgKi8KKyAgREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5UCit9OworCisvKiBMaW5rYWdlIG9mIGFuIG9iamVjdCB0aGF0IGFwcGVhcnMgaW4gYSBuYW1lc3BhY2UuICAqLworCitlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlCit7CisgIC8qIExvY2FsIHZhcmlhYmxlLiAgKi8KKyAgREVCVUdfTElOS0FHRV9BVVRPTUFUSUMsCisgIC8qIFN0YXRpYy0tZWl0aGVyIGZpbGUgc3RhdGljIG9yIGZ1bmN0aW9uIHN0YXRpYywgZGVwZW5kaW5nIHVwb24gdGhlCisgICAgIG5hbWVzcGFjZSBpcy4gICovCisgIERFQlVHX0xJTktBR0VfU1RBVElDLAorICAvKiBHbG9iYWwuICAqLworICBERUJVR19MSU5LQUdFX0dMT0JBTCwKKyAgLyogTm8gbGlua2FnZS4gICovCisgIERFQlVHX0xJTktBR0VfTk9ORQorfTsKKworLyogQSBuYW1lIGluIGEgbmFtZXNwYWNlLiAgKi8KKworc3RydWN0IGRlYnVnX25hbWUKK3sKKyAgLyogTmV4dCBuYW1lIGluIHRoaXMgbmFtZXNwYWNlLiAgKi8KKyAgc3RydWN0IGRlYnVnX25hbWUgKm5leHQ7CisgIC8qIE5hbWUuICAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBNYXJrLiAgVGhpcyBpcyB1c2VkIGJ5IGRlYnVnX3dyaXRlLiAgKi8KKyAgdW5zaWduZWQgaW50IG1hcms7CisgIC8qIEtpbmQgb2Ygb2JqZWN0LiAgKi8KKyAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCBraW5kOworICAvKiBMaW5rYWdlIG9mIG9iamVjdC4gICovCisgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKKyAgLyogVGFnZ2VkIHVuaW9uIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0LiAgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICAvKiBERUJVR19PQkpFQ1RfVFlQRS4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKKyAgICAgIC8qIERFQlVHX09CSkVDVF9UQUcuICAqLworICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnRhZzsKKyAgICAgIC8qIERFQlVHX09CSkVDVF9WQVJJQUJMRS4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKnZhcmlhYmxlOworICAgICAgLyogREVCVUdfT0JKRUNUX0ZVTkNUSU9OLiAgKi8KKyAgICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZnVuY3Rpb247CisgICAgICAvKiBERUJVR19PQkpFQ1RfSU5UX0NPTlNUQU5ULiAgKi8KKyAgICAgIGJmZF92bWEgaW50X2NvbnN0YW50OworICAgICAgLyogREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5ULiAgKi8KKyAgICAgIGRvdWJsZSBmbG9hdF9jb25zdGFudDsKKyAgICAgIC8qIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVC4gICovCisgICAgICBzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQgKnR5cGVkX2NvbnN0YW50OworICAgIH0gdTsKK307CisKKy8qIER1cmluZyBkZWJ1Z193cml0ZSwgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8KKyAgIGtlZXAgdHJhY2sgb2YgSUQgbnVtYmVycyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBjbGFzc2VzLiAgKi8KKworc3RydWN0IGRlYnVnX2NsYXNzX2lkCit7CisgIC8qIE5leHQgSUQgbnVtYmVyLiAgKi8KKyAgc3RydWN0IGRlYnVnX2NsYXNzX2lkICpuZXh0OworICAvKiBUaGUgdHlwZSB3aXRoIHRoZSBJRC4gICovCisgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOworICAvKiBUaGUgdGFnOyBOVUxMIGlmIG5vIHRhZy4gICovCisgIGNvbnN0IGNoYXIgKnRhZzsKK307CisKKy8qIER1cmluZyBkZWJ1Z190eXBlX3NhbWVwLCBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMga2VwdAorICAgb24gdGhlIHN0YWNrIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4gICovCisKK3N0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdAoreworICAvKiBOZXh0IHR5cGUgb24gbGlzdC4gICovCisgIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCAqbmV4dDsKKyAgLyogVGhlIHR5cGVzIHdlIGFyZSBjb21wYXJpbmcuICAqLworICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDE7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0MjsKK307CisKKy8qIER1cmluZyBkZWJ1Z19nZXRfcmVhbF90eXBlLCBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMKKyAgIGtlcHQgb24gdGhlIHN0YWNrIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4gICovCisKK3N0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdAoreworICAvKiBOZXh0IHR5cGUgb24gbGlzdC4gICovCisgIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCAqbmV4dDsKKyAgLyogVGhlIHR5cGUgd2UgYXJlIGNoZWNraW5nLiAgKi8KKyAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Cit9OworCisvKiBMb2NhbCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgdm9pZCBkZWJ1Z19lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqZGVidWdfYWRkX3RvX25hbWVzcGFjZQorICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKiosIGNvbnN0IGNoYXIgKiwKKwkgICBlbnVtIGRlYnVnX29iamVjdF9raW5kLCBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlKSk7CitzdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKmRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZQorICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCwKKwkgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlKSk7CitzdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKmRlYnVnX21ha2VfdHlwZQorICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGVudW0gZGVidWdfdHlwZV9raW5kLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfZ2V0X3JlYWxfdHlwZQorICBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCAqKSk7CitzdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9uYW1lCisgIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCisJICAgc3RydWN0IGRlYnVnX25hbWUgKikpOworc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfdHlwZQorICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAorCSAgIHN0cnVjdCBkZWJ1Z190eXBlICosIHN0cnVjdCBkZWJ1Z19uYW1lICopKTsKK3N0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUKKyAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKKwkgICBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX2Z1bmN0aW9uCisgIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCisJICAgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlLCBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKikpOworc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfYmxvY2sKKyAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKKwkgICBzdHJ1Y3QgZGVidWdfYmxvY2sgKikpOworc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfbGluZW5vcworICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAorCSAgIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGRlYnVnX3NldF9jbGFzc19pZAorICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gZGVidWdfdHlwZV9zYW1lcAorICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIHN0cnVjdCBkZWJ1Z190eXBlICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKK3N0YXRpYyBib29sZWFuIGRlYnVnX2NsYXNzX3R5cGVfc2FtZXAKKyAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7CisMCisvKiBJc3N1ZSBhbiBlcnJvciBtZXNzYWdlLiAgKi8KKworc3RhdGljIHZvaWQKK2RlYnVnX2Vycm9yIChtZXNzYWdlKQorICAgICBjb25zdCBjaGFyICptZXNzYWdlOworeworICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgbWVzc2FnZSk7Cit9CisKKy8qIEFkZCBhbiBvYmplY3QgdG8gYSBuYW1lc3BhY2UuICAqLworCitzdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKgorZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBraW5kLCBsaW5rYWdlKQorICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOworICAgICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICoqbnNwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7CisgICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKK3sKKyAgc3RydWN0IGRlYnVnX25hbWUgKm47CisgIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKm5zOworCisgIG4gPSAoc3RydWN0IGRlYnVnX25hbWUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOworCisgIG4tPm5hbWUgPSBuYW1lOworICBuLT5raW5kID0ga2luZDsKKyAgbi0+bGlua2FnZSA9IGxpbmthZ2U7CisKKyAgbnMgPSAqbnNwOworICBpZiAobnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBucyA9IChzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICopIHhtYWxsb2MgKHNpemVvZiAqbnMpOworICAgICAgbWVtc2V0IChucywgMCwgc2l6ZW9mICpucyk7CisKKyAgICAgIG5zLT50YWlsID0gJm5zLT5saXN0OworCisgICAgICAqbnNwID0gbnM7CisgICAgfQorCisgICpucy0+dGFpbCA9IG47CisgIG5zLT50YWlsID0gJm4tPm5leHQ7CisKKyAgcmV0dXJuIG47Cit9CisKKy8qIEFkZCBhbiBvYmplY3QgdG8gdGhlIGN1cnJlbnQgbmFtZXNwYWNlLiAgKi8KKworc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICoKK2RlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwga2luZCwgbGlua2FnZSkKKyAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZW51bSBkZWJ1Z19vYmplY3Rfa2luZCBraW5kOworICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Cit7CisgIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKipuc3A7CisKKyAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCisgICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlOiBubyBjdXJyZW50IGZpbGUiKSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGluZm8tPmN1cnJlbnRfYmxvY2sgIT0gTlVMTCkKKyAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+bG9jYWxzOworICBlbHNlCisgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFsczsKKworICByZXR1cm4gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgbnNwLCBuYW1lLCBraW5kLCBsaW5rYWdlKTsKK30KKwwKKy8qIFJldHVybiBhIGhhbmRsZSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworUFRSCitkZWJ1Z19pbml0ICgpCit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKnJldDsKKworICByZXQgPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7CisgIG1lbXNldCAocmV0LCAwLCBzaXplb2YgKnJldCk7CisgIHJldHVybiAoUFRSKSByZXQ7Cit9CisKKy8qIFNldCB0aGUgc291cmNlIGZpbGVuYW1lLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIG5ldyBjb21waWxhdGlvbgorICAgdW5pdC4gICovCisKK2Jvb2xlYW4KK2RlYnVnX3NldF9maWxlbmFtZSAoaGFuZGxlLCBuYW1lKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfZmlsZSAqbmZpbGU7CisgIHN0cnVjdCBkZWJ1Z191bml0ICpudW5pdDsKKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIG5hbWUgPSAiIjsKKworICBuZmlsZSA9IChzdHJ1Y3QgZGVidWdfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKm5maWxlKTsKKyAgbWVtc2V0IChuZmlsZSwgMCwgc2l6ZW9mICpuZmlsZSk7CisKKyAgbmZpbGUtPmZpbGVuYW1lID0gbmFtZTsKKworICBudW5pdCA9IChzdHJ1Y3QgZGVidWdfdW5pdCAqKSB4bWFsbG9jIChzaXplb2YgKm51bml0KTsKKyAgbWVtc2V0IChudW5pdCwgMCwgc2l6ZW9mICpudW5pdCk7CisKKyAgbnVuaXQtPmZpbGVzID0gbmZpbGU7CisgIGluZm8tPmN1cnJlbnRfZmlsZSA9IG5maWxlOworCisgIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgIT0gTlVMTCkKKyAgICBpbmZvLT5jdXJyZW50X3VuaXQtPm5leHQgPSBudW5pdDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydCAoaW5mby0+dW5pdHMgPT0gTlVMTCk7CisgICAgICBpbmZvLT51bml0cyA9IG51bml0OworICAgIH0KKworICBpbmZvLT5jdXJyZW50X3VuaXQgPSBudW5pdDsKKworICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKKyAgaW5mby0+Y3VycmVudF9ibG9jayA9IE5VTEw7CisgIGluZm8tPmN1cnJlbnRfbGluZW5vID0gTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ2hhbmdlIHNvdXJjZSBmaWxlcyB0byB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkIGZvcgorICAgaW5jbHVkZSBmaWxlcyBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LiAgKi8KKworYm9vbGVhbgorZGVidWdfc3RhcnRfc291cmNlIChoYW5kbGUsIG5hbWUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z19maWxlICpmLCAqKnBmOworCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgbmFtZSA9ICIiOworCisgIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfc3RhcnRfc291cmNlOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZm9yIChmID0gaW5mby0+Y3VycmVudF91bml0LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoZi0+ZmlsZW5hbWVbMF0gPT0gbmFtZVswXQorCSAgJiYgZi0+ZmlsZW5hbWVbMV0gPT0gbmFtZVsxXQorCSAgJiYgc3RyY21wIChmLT5maWxlbmFtZSwgbmFtZSkgPT0gMCkKKwl7CisJICBpbmZvLT5jdXJyZW50X2ZpbGUgPSBmOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH0KKworICBmID0gKHN0cnVjdCBkZWJ1Z19maWxlICopIHhtYWxsb2MgKHNpemVvZiAqZik7CisgIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKKworICBmLT5maWxlbmFtZSA9IG5hbWU7CisKKyAgZm9yIChwZiA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPm5leHQ7CisgICAgICAgKnBmICE9IE5VTEw7CisgICAgICAgcGYgPSAmKCpwZiktPm5leHQpCisgICAgOworICAqcGYgPSBmOworCisgIGluZm8tPmN1cnJlbnRfZmlsZSA9IGY7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlY29yZCBhIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgZnVuY3Rpb24KKyAgIGJsb2NrLiAgVGhlIGRlYnVnX3R5cGUgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBnbG9iYWxseSB2aXNpYmxlLgorICAgVGhlIGJmZF92bWEgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gIEN1cnJlbnRseQorICAgdGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgc3BlY2lmaWVkIGJ5IGNhbGxzIHRvCisgICBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyLiAgRklYTUU6IFRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IG5lc3RlZAorICAgZnVuY3Rpb25zLiAgKi8KKworYm9vbGVhbgorZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChoYW5kbGUsIG5hbWUsIHJldHVybl90eXBlLCBnbG9iYWwsIGFkZHIpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7CisgICAgIGJvb2xlYW4gZ2xvYmFsOworICAgICBiZmRfdm1hIGFkZHI7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZjsKKyAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOworICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIG5hbWUgPSAiIjsKKyAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2Z1bmN0aW9uOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZiA9IChzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKKyAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOworCisgIGYtPnJldHVybl90eXBlID0gcmV0dXJuX3R5cGU7CisKKyAgYiA9IChzdHJ1Y3QgZGVidWdfYmxvY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKKyAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOworCisgIGItPnN0YXJ0ID0gYWRkcjsKKyAgYi0+ZW5kID0gKGJmZF92bWEpIC0xOworCisgIGYtPmJsb2NrcyA9IGI7CisKKyAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IGY7CisgIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBiOworCisgIC8qIEZJWE1FOiBJZiB3ZSBjb3VsZCBoYW5kbGUgbmVzdGVkIGZ1bmN0aW9ucywgdGhpcyB3b3VsZCBiZSB0aGUKKyAgICAgcGxhY2U6IHdlIHdvdWxkIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG5hbWVzcGFjZS4gICovCisgIG4gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLAorCQkJICAgICAgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywKKwkJCSAgICAgIG5hbWUsCisJCQkgICAgICBERUJVR19PQkpFQ1RfRlVOQ1RJT04sCisJCQkgICAgICAoZ2xvYmFsCisJCQkgICAgICAgPyBERUJVR19MSU5LQUdFX0dMT0JBTAorCQkJICAgICAgIDogREVCVUdfTElOS0FHRV9TVEFUSUMpKTsKKyAgaWYgKG4gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbi0+dS5mdW5jdGlvbiA9IGY7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlY29yZCBhIHBhcmFtZXRlciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLworCitib29sZWFuCitkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqcCwgKipwcDsKKworICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCisgICAgICB8fCBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9wYXJhbWV0ZXI6IG5vIGN1cnJlbnQgZnVuY3Rpb24iKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHAgPSAoc3RydWN0IGRlYnVnX3BhcmFtZXRlciAqKSB4bWFsbG9jIChzaXplb2YgKnApOworICBtZW1zZXQgKHAsIDAsIHNpemVvZiAqcCk7CisKKyAgcC0+bmFtZSA9IG5hbWU7CisgIHAtPnR5cGUgPSB0eXBlOworICBwLT5raW5kID0ga2luZDsKKyAgcC0+dmFsID0gdmFsOworCisgIGZvciAocHAgPSAmaW5mby0+Y3VycmVudF9mdW5jdGlvbi0+cGFyYW1ldGVyczsKKyAgICAgICAqcHAgIT0gTlVMTDsKKyAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCkKKyAgICA7CisgICpwcCA9IHA7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEVuZCBhIGZ1bmN0aW9uLiAgRklYTUU6IFRoaXMgc2hvdWxkIGhhbmRsZSBmdW5jdGlvbiBuZXN0aW5nLiAgKi8KKworYm9vbGVhbgorZGVidWdfZW5kX2Z1bmN0aW9uIChoYW5kbGUsIGFkZHIpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKworICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKKyAgICAgIHx8IGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTAorICAgICAgfHwgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfZnVuY3Rpb246IG5vIGN1cnJlbnQgZnVuY3Rpb24iKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChpbmZvLT5jdXJyZW50X2Jsb2NrLT5wYXJlbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2Z1bmN0aW9uOiBzb21lIGJsb2NrcyB3ZXJlIG5vdCBjbG9zZWQiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGluZm8tPmN1cnJlbnRfYmxvY2stPmVuZCA9IGFkZHI7CisKKyAgaW5mby0+Y3VycmVudF9mdW5jdGlvbiA9IE5VTEw7CisgIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBOVUxMOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFydCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBBbGwgbG9jYWwgaW5mb3JtYXRpb24gd2lsbCBiZQorICAgcmVjb3JkZWQgaW4gdGhpcyBibG9jaywgdW50aWwgdGhlIG1hdGNoaW5nIGNhbGwgdG8gZGVidWdfZW5kX2Jsb2NrLgorICAgZGVidWdfc3RhcnRfYmxvY2sgYW5kIGRlYnVnX2VuZF9ibG9jayBtYXkgYmUgbmVzdGVkLiAgVGhlIGJmZF92bWEKKyAgIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KKworYm9vbGVhbgorZGVidWdfc3RhcnRfYmxvY2sgKGhhbmRsZSwgYWRkcikKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmIsICoqcGI7CisKKyAgLyogV2UgbXVzdCBhbHdheXMgaGF2ZSBhIGN1cnJlbnQgYmxvY2s6IGRlYnVnX3JlY29yZF9mdW5jdGlvbiBzZXRzCisgICAgIG9uZSB1cC4gICovCisgIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAorICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9ibG9jazogbm8gY3VycmVudCBibG9jayIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYiA9IChzdHJ1Y3QgZGVidWdfYmxvY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKKyAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOworCisgIGItPnBhcmVudCA9IGluZm8tPmN1cnJlbnRfYmxvY2s7CisgIGItPnN0YXJ0ID0gYWRkcjsKKyAgYi0+ZW5kID0gKGJmZF92bWEpIC0xOworCisgIC8qIFRoaXMgbmV3IGJsb2NrIGlzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICAqLworICBmb3IgKHBiID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmNoaWxkcmVuOworICAgICAgICpwYiAhPSBOVUxMOworICAgICAgIHBiID0gJigqcGIpLT5uZXh0KQorICAgIDsKKyAgKnBiID0gYjsKKworICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gYjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIFRoaXMgbWF0Y2hlcyB0aGUgY2FsbCB0bworICAgZGVidWdfc3RhcnRfYmxvY2suICBUaGUgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jaworICAgZW5kcy4gICovCisKK2Jvb2xlYW4KK2RlYnVnX2VuZF9ibG9jayAoaGFuZGxlLCBhZGRyKQorICAgICBQVFIgaGFuZGxlOworICAgICBiZmRfdm1hIGFkZHI7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z19ibG9jayAqcGFyZW50OworCisgIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAorICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfYmxvY2s6IG5vIGN1cnJlbnQgYmxvY2siKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHBhcmVudCA9IGluZm8tPmN1cnJlbnRfYmxvY2stPnBhcmVudDsKKyAgaWYgKHBhcmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfYmxvY2s6IGF0dGVtcHQgdG8gY2xvc2UgdG9wIGxldmVsIGJsb2NrIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpbmZvLT5jdXJyZW50X2Jsb2NrLT5lbmQgPSBhZGRyOworCisgIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBwYXJlbnQ7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGFuZCBmdW5jdGlvbgorICAgd2l0aCBhIGdpdmVuIGFkZHJlc3MuICAqLworCitib29sZWFuCitkZWJ1Z19yZWNvcmRfbGluZSAoaGFuZGxlLCBsaW5lbm8sIGFkZHIpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOworICAgICBiZmRfdm1hIGFkZHI7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmw7CisgIHVuc2lnbmVkIGludCBpOworCisgIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2xpbmU6IG5vIGN1cnJlbnQgdW5pdCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgbCA9IGluZm8tPmN1cnJlbnRfbGluZW5vOworICBpZiAobCAhPSBOVUxMICYmIGwtPmZpbGUgPT0gaW5mby0+Y3VycmVudF9maWxlKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBERUJVR19MSU5FTk9fQ09VTlQ7IGkrKykKKwl7CisJICBpZiAobC0+bGluZW5vc1tpXSA9PSAodW5zaWduZWQgbG9uZykgLTEpCisJICAgIHsKKwkgICAgICBsLT5saW5lbm9zW2ldID0gbGluZW5vOworCSAgICAgIGwtPmFkZHJzW2ldID0gYWRkcjsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gZWl0aGVyIDEpIHRoZXJlIGlzIG5vIGN1cnJlbnRfbGluZW5vCisgICAgIHN0cnVjdHVyZSwgd2hpY2ggbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgaW4gdGhpcworICAgICBjb21waWxhdGlvbiB1bml0LCAyKSB0aGUgY3VycmVudF9saW5lbm8gc3RydWN0dXJlIGlzIGZvciBhCisgICAgIGRpZmZlcmVudCBmaWxlLCBvciAzKSB0aGUgY3VycmVudF9saW5lbm8gc3RydWN0dXJlIGlzIGZ1bGwuCisgICAgIFJlZ2FyZGxlc3MsIHdlIHdhbnQgdG8gYWxsb2NhdGUgYSBuZXcgZGVidWdfbGluZW5vIHN0cnVjdHVyZSwgcHV0CisgICAgIGl0IGluIHRoZSByaWdodCBwbGFjZSwgYW5kIG1ha2UgaXQgdGhlIG5ldyBjdXJyZW50X2xpbmVubworICAgICBzdHJ1Y3R1cmUuICAqLworCisgIGwgPSAoc3RydWN0IGRlYnVnX2xpbmVubyAqKSB4bWFsbG9jIChzaXplb2YgKmwpOworICBtZW1zZXQgKGwsIDAsIHNpemVvZiAqbCk7CisKKyAgbC0+ZmlsZSA9IGluZm8tPmN1cnJlbnRfZmlsZTsKKyAgbC0+bGluZW5vc1swXSA9IGxpbmVubzsKKyAgbC0+YWRkcnNbMF0gPSBhZGRyOworICBmb3IgKGkgPSAxOyBpIDwgREVCVUdfTElORU5PX0NPVU5UOyBpKyspCisgICAgbC0+bGluZW5vc1tpXSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKKworICBpZiAoaW5mby0+Y3VycmVudF9saW5lbm8gIT0gTlVMTCkKKyAgICBpbmZvLT5jdXJyZW50X2xpbmVuby0+bmV4dCA9IGw7CisgIGVsc2UKKyAgICBpbmZvLT5jdXJyZW50X3VuaXQtPmxpbmVub3MgPSBsOworCisgIGluZm8tPmN1cnJlbnRfbGluZW5vID0gbDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgYSBuYW1lZCBjb21tb24gYmxvY2suICBUaGlzIGlzIGEgYmxvY2sgb2YgdmFyaWFibGVzIHRoYXQgbWF5CisgICBtb3ZlIGluIG1lbW9yeS4gICovCisKK2Jvb2xlYW4KK2RlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jayAoaGFuZGxlLCBuYW1lKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICAvKiBGSVhNRSAqLworICBkZWJ1Z19lcnJvciAoXygiZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogRW5kIGEgbmFtZWQgY29tbW9uIGJsb2NrLiAgKi8KKworYm9vbGVhbgorZGVidWdfZW5kX2NvbW1vbl9ibG9jayAoaGFuZGxlLCBuYW1lKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICAvKiBGSVhNRSAqLworICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZW5kX2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIikpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFJlY29yZCBhIG5hbWVkIGludGVnZXIgY29uc3RhbnQuICAqLworCitib29sZWFuCitkZWJ1Z19yZWNvcmRfaW50X2NvbnN0IChoYW5kbGUsIG5hbWUsIHZhbCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOworCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG4gPSBkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2UgKGluZm8sIG5hbWUsIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQsCisJCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKKyAgaWYgKG4gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbi0+dS5pbnRfY29uc3RhbnQgPSB2YWw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlY29yZCBhIG5hbWVkIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KKworYm9vbGVhbgorZGVidWdfcmVjb3JkX2Zsb2F0X2NvbnN0IChoYW5kbGUsIG5hbWUsIHZhbCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZG91YmxlIHZhbDsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX25hbWUgKm47CisKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5ULAorCQkJCSAgICAgIERFQlVHX0xJTktBR0VfTk9ORSk7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG4tPnUuZmxvYXRfY29uc3RhbnQgPSB2YWw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlY29yZCBhIHR5cGVkIGNvbnN0YW50IHdpdGggYW4gaW50ZWdyYWwgdmFsdWUuICAqLworCitib29sZWFuCitkZWJ1Z19yZWNvcmRfdHlwZWRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdHlwZSwgdmFsKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBkZWJ1Z190eXBlIHR5cGU7CisgICAgIGJmZF92bWEgdmFsOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKKyAgc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICp0YzsKKworICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5ULAorCQkJCSAgICAgIERFQlVHX0xJTktBR0VfTk9ORSk7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHRjID0gKHN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudCAqKSB4bWFsbG9jIChzaXplb2YgKnRjKTsKKyAgbWVtc2V0ICh0YywgMCwgc2l6ZW9mICp0Yyk7CisKKyAgdGMtPnR5cGUgPSB0eXBlOworICB0Yy0+dmFsID0gdmFsOworCisgIG4tPnUudHlwZWRfY29uc3RhbnQgPSB0YzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVjb3JkIGEgbGFiZWwuICAqLworCitib29sZWFuCitkZWJ1Z19yZWNvcmRfbGFiZWwgKGhhbmRsZSwgbmFtZSwgdHlwZSwgYWRkcikKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBiZmRfdm1hIGFkZHI7Cit7CisgIC8qIEZJWE1FLiAgKi8KKyAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3JlY29yZF9sYWJlbCBub3QgaW1wbGVtZW50ZWQiKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogUmVjb3JkIGEgdmFyaWFibGUuICAqLworCitib29sZWFuCitkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGhhbmRsZSwgbmFtZSwgdHlwZSwga2luZCwgdmFsKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBkZWJ1Z190eXBlIHR5cGU7CisgICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKipuc3A7CisgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKKyAgc3RydWN0IGRlYnVnX25hbWUgKm47CisgIHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqdjsKKworICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCisgICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX3ZhcmlhYmxlOiBubyBjdXJyZW50IGZpbGUiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChraW5kID09IERFQlVHX0dMT0JBTCB8fCBraW5kID09IERFQlVHX1NUQVRJQykKKyAgICB7CisgICAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzOworICAgICAgaWYgKGtpbmQgPT0gREVCVUdfR0xPQkFMKQorCWxpbmthZ2UgPSBERUJVR19MSU5LQUdFX0dMT0JBTDsKKyAgICAgIGVsc2UKKwlsaW5rYWdlID0gREVCVUdfTElOS0FHRV9TVEFUSUM7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGluZm8tPmN1cnJlbnRfYmxvY2sgPT0gTlVMTCkKKwl7CisJICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX3ZhcmlhYmxlOiBubyBjdXJyZW50IGJsb2NrIikpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2Jsb2NrLT5sb2NhbHM7CisgICAgICBsaW5rYWdlID0gREVCVUdfTElOS0FHRV9BVVRPTUFUSUM7CisgICAgfQorCisgIG4gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCBuc3AsIG5hbWUsIERFQlVHX09CSkVDVF9WQVJJQUJMRSwgbGlua2FnZSk7CisgIGlmIChuID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHYgPSAoc3RydWN0IGRlYnVnX3ZhcmlhYmxlICopIHhtYWxsb2MgKHNpemVvZiAqdik7CisgIG1lbXNldCAodiwgMCwgc2l6ZW9mICp2KTsKKworICB2LT5raW5kID0ga2luZDsKKyAgdi0+dHlwZSA9IHR5cGU7CisgIHYtPnZhbCA9IHZhbDsKKworICBuLT51LnZhcmlhYmxlID0gdjsKKworICByZXR1cm4gdHJ1ZTsgIAorfQorCisvKiBNYWtlIGEgdHlwZSB3aXRoIGEgZ2l2ZW4ga2luZCBhbmQgc2l6ZS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICoKK2RlYnVnX21ha2VfdHlwZSAoaW5mbywga2luZCwgc2l6ZSkKKyAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKKyAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworCisgIHQgPSAoc3RydWN0IGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICp0KTsKKyAgbWVtc2V0ICh0LCAwLCBzaXplb2YgKnQpOworCisgIHQtPmtpbmQgPSBraW5kOworICB0LT5zaXplID0gc2l6ZTsKKworICByZXR1cm4gdDsKK30KKworLyogTWFrZSBhbiBpbmRpcmVjdCB0eXBlIHdoaWNoIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGEgdHlwZQorICAgd2hpY2ggaXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoaGFuZGxlLCBzbG90LCB0YWcpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgKnNsb3Q7CisgICAgIGNvbnN0IGNoYXIgKnRhZzsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7CisgIHN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlICppOworCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfSU5ESVJFQ1QsIDApOworICBpZiAodCA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgaSA9IChzdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmkpOworICBtZW1zZXQgKGksIDAsIHNpemVvZiAqaSk7CisKKyAgaS0+c2xvdCA9IHNsb3Q7CisgIGktPnRhZyA9IHRhZzsKKworICB0LT51LmtpbmRpcmVjdCA9IGk7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYSB2b2lkIHR5cGUuICBUaGVyZSBpcyBvbmx5IG9uZSBvZiB0aGVzZS4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2Vfdm9pZF90eXBlIChoYW5kbGUpCisgICAgIFBUUiBoYW5kbGU7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisKKyAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9WT0lELCAwKTsKK30KKworLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgVGhlIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZQorICAgaWYgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX2ludF90eXBlIChoYW5kbGUsIHNpemUsIHVuc2lnbmVkcCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgIGJvb2xlYW4gdW5zaWduZWRwOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKKworICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0lOVCwgc2l6ZSk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICB0LT51LmtpbnQgPSB1bnNpZ25lZHA7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYSBmbG9hdGluZyBwb2ludCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gIEZJWE1FOiBPbiBzb21lCisgICBwbGF0Zm9ybXMsIGxpa2UgYW4gQWxwaGEsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGJlIGFibGUgdG8gc3BlY2lmeQorICAgdGhlIGZvcm1hdC4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2VfZmxvYXRfdHlwZSAoaGFuZGxlLCBzaXplKQorICAgICBQVFIgaGFuZGxlOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKworICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0ZMT0FULCBzaXplKTsKK30KKworLyogTWFrZSBhIGJvb2xlYW4gdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoaGFuZGxlLCBzaXplKQorICAgICBQVFIgaGFuZGxlOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKworICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0JPT0wsIHNpemUpOworfQorCisvKiBNYWtlIGEgY29tcGxleCB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2VfY29tcGxleF90eXBlIChoYW5kbGUsIHNpemUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworCisgIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQ09NUExFWCwgc2l6ZSk7Cit9CisKKy8qIE1ha2UgYSBzdHJ1Y3R1cmUgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdHJ1ZSBmb3IgYSBzdHJ1Y3QsCisgICBmYWxzZSBmb3IgYSB1bmlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0LgorICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcykKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgYm9vbGVhbiBzdHJ1Y3RwOworICAgICBiZmRfdm1hIHNpemU7CisgICAgIGRlYnVnX2ZpZWxkICpmaWVsZHM7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKKworICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLAorCQkgICAgICAgc3RydWN0cCA/IERFQlVHX0tJTkRfU1RSVUNUIDogREVCVUdfS0lORF9VTklPTiwKKwkJICAgICAgIHNpemUpOworICBpZiAodCA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgYyA9IChzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmMpOworICBtZW1zZXQgKGMsIDAsIHNpemVvZiAqYyk7CisKKyAgYy0+ZmllbGRzID0gZmllbGRzOworCisgIHQtPnUua2NsYXNzID0gYzsKKworICByZXR1cm4gdDsKK30KKworLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQorICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQorICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgorICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCisgICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzLCBiYXNlY2xhc3NlcywKKwkJCW1ldGhvZHMsIHZwdHJiYXNlLCBvd252cHRyKQorICAgICBQVFIgaGFuZGxlOworICAgICBib29sZWFuIHN0cnVjdHA7CisgICAgIGJmZF92bWEgc2l6ZTsKKyAgICAgZGVidWdfZmllbGQgKmZpZWxkczsKKyAgICAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKKyAgICAgZGVidWdfbWV0aG9kICptZXRob2RzOworICAgICBkZWJ1Z190eXBlIHZwdHJiYXNlOworICAgICBib29sZWFuIG93bnZwdHI7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKKworICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLAorCQkgICAgICAgc3RydWN0cCA/IERFQlVHX0tJTkRfQ0xBU1MgOiBERUJVR19LSU5EX1VOSU9OX0NMQVNTLAorCQkgICAgICAgc2l6ZSk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICBjID0gKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYyk7CisgIG1lbXNldCAoYywgMCwgc2l6ZW9mICpjKTsKKworICBjLT5maWVsZHMgPSBmaWVsZHM7CisgIGMtPmJhc2VjbGFzc2VzID0gYmFzZWNsYXNzZXM7CisgIGMtPm1ldGhvZHMgPSBtZXRob2RzOworICBpZiAob3dudnB0cikKKyAgICBjLT52cHRyYmFzZSA9IHQ7CisgIGVsc2UKKyAgICBjLT52cHRyYmFzZSA9IHZwdHJiYXNlOworCisgIHQtPnUua2NsYXNzID0gYzsKKworICByZXR1cm4gdDsKK30KKworLyogTWFrZSBhbiBlbnVtZXJhdGlvbiB0eXBlLiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBudWxsIHRlcm1pbmF0ZWQKKyAgIGFycmF5IG9mIHN0cmluZ3MsIGFuZCBhbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2VfZW51bV90eXBlIChoYW5kbGUsIG5hbWVzLCB2YWx1ZXMpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKipuYW1lczsKKyAgICAgYmZkX3NpZ25lZF92bWEgKnZhbHVlczsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7CisgIHN0cnVjdCBkZWJ1Z19lbnVtX3R5cGUgKmU7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9FTlVNLCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIGUgPSAoc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOworICBtZW1zZXQgKGUsIDAsIHNpemVvZiAqZSk7CisKKyAgZS0+bmFtZXMgPSBuYW1lczsKKyAgZS0+dmFsdWVzID0gdmFsdWVzOworCisgIHQtPnUua2VudW0gPSBlOworCisgIHJldHVybiB0OworfQorCisvKiBNYWtlIGEgcG9pbnRlciB0byBhIGdpdmVuIHR5cGUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoaGFuZGxlLCB0eXBlKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z190eXBlIHR5cGU7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworCisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICBpZiAodHlwZS0+cG9pbnRlciAhPSBERUJVR19UWVBFX05VTEwpCisgICAgcmV0dXJuIHR5cGUtPnBvaW50ZXI7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9QT0lOVEVSLCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHQtPnUua3BvaW50ZXIgPSB0eXBlOworCisgIHR5cGUtPnBvaW50ZXIgPSB0OworCisgIHJldHVybiB0OworfQorCisvKiBNYWtlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgZ2l2ZW4gdHlwZS4gIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZQorICAgdG8gcmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGhhbmRsZSwgdHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z190eXBlIHR5cGU7CisgICAgIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKKyAgICAgYm9vbGVhbiB2YXJhcmdzOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKKyAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uX3R5cGUgKmY7CisKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRlVOQ1RJT04sIDApOworICBpZiAodCA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgZiA9IChzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmYpOworICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7CisKKyAgZi0+cmV0dXJuX3R5cGUgPSB0eXBlOworICBmLT5hcmdfdHlwZXMgPSBhcmdfdHlwZXM7CisgIGYtPnZhcmFyZ3MgPSB2YXJhcmdzOworCisgIHQtPnUua2Z1bmN0aW9uID0gZjsKKworICByZXR1cm4gdDsKK30KKworLyogTWFrZSBhIHJlZmVyZW5jZSB0byBhIGdpdmVuIHR5cGUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChoYW5kbGUsIHR5cGUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7CisKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfUkVGRVJFTkNFLCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHQtPnUua3JlZmVyZW5jZSA9IHR5cGU7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYSByYW5nZSBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxvd2VyIHRvIGFuIHVwcGVyIGJvdW5kLiAgKi8KKworZGVidWdfdHlwZQorZGVidWdfbWFrZV9yYW5nZV90eXBlIChoYW5kbGUsIHR5cGUsIGxvd2VyLCB1cHBlcikKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKKyAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworICBzdHJ1Y3QgZGVidWdfcmFuZ2VfdHlwZSAqcjsKKworICBpZiAodHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9SQU5HRSwgMCk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICByID0gKHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcik7CisgIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKKworICByLT50eXBlID0gdHlwZTsKKyAgci0+bG93ZXIgPSBsb3dlcjsKKyAgci0+dXBwZXIgPSB1cHBlcjsKKworICB0LT51LmtyYW5nZSA9IHI7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYW4gYXJyYXkgdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYW4gZWxlbWVudAorICAgb2YgdGhlIGFycmF5LiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIGEgcmFuZ2Ugb2YgdGhlCisgICBhcnJheS4gIFRoZSBmb3VydGggYW5kIGZpZnRoIGFyZ3VtZW50IGFyZSB0aGUgbG93ZXIgYW5kIHVwcGVyCisgICBib3VuZHMsIHJlc3BlY3RpdmVseS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgYXJyYXkgaXMKKyAgIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KKworZGVidWdfdHlwZQorZGVidWdfbWFrZV9hcnJheV90eXBlIChoYW5kbGUsIGVsZW1lbnRfdHlwZSwgcmFuZ2VfdHlwZSwgbG93ZXIsIHVwcGVyLAorCQkgICAgICAgc3RyaW5ncCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7CisgICAgIGRlYnVnX3R5cGUgcmFuZ2VfdHlwZTsKKyAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7CisgICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOworICAgICBib29sZWFuIHN0cmluZ3A7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworICBzdHJ1Y3QgZGVidWdfYXJyYXlfdHlwZSAqYTsKKworICBpZiAoZWxlbWVudF90eXBlID09IE5VTEwgfHwgcmFuZ2VfdHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9BUlJBWSwgMCk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICBhID0gKHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYSk7CisgIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKKworICBhLT5lbGVtZW50X3R5cGUgPSBlbGVtZW50X3R5cGU7CisgIGEtPnJhbmdlX3R5cGUgPSByYW5nZV90eXBlOworICBhLT5sb3dlciA9IGxvd2VyOworICBhLT51cHBlciA9IHVwcGVyOworICBhLT5zdHJpbmdwID0gc3RyaW5ncDsKKworICB0LT51LmthcnJheSA9IGE7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYSBzZXQgb2YgYSBnaXZlbiB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgUGFzY2FsIHNldCB0eXBlLiAgVGhlCisgICBib29sZWFuIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBzZXQgaXMgYWN0dWFsbHkgYSBiaXRzdHJpbmcsIGFzIGluCisgICBDSElMTC4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2Vfc2V0X3R5cGUgKGhhbmRsZSwgdHlwZSwgYml0c3RyaW5ncCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBib29sZWFuIGJpdHN0cmluZ3A7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworICBzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKnM7CisKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfU0VULCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHMgPSAoc3RydWN0IGRlYnVnX3NldF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcyk7CisgIG1lbXNldCAocywgMCwgc2l6ZW9mICpzKTsKKworICBzLT50eXBlID0gdHlwZTsKKyAgcy0+Yml0c3RyaW5ncCA9IGJpdHN0cmluZ3A7CisKKyAgdC0+dS5rc2V0ID0gczsKKworICByZXR1cm4gdDsKK30KKworLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKKyAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCisgICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cworICAgdG8uICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX29mZnNldF90eXBlIChoYW5kbGUsIGJhc2VfdHlwZSwgdGFyZ2V0X3R5cGUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgYmFzZV90eXBlOworICAgICBkZWJ1Z190eXBlIHRhcmdldF90eXBlOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKKyAgc3RydWN0IGRlYnVnX29mZnNldF90eXBlICpvOworCisgIGlmIChiYXNlX3R5cGUgPT0gTlVMTCB8fCB0YXJnZXRfdHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9PRkZTRVQsIDApOworICBpZiAodCA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgbyA9IChzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpvKTsKKyAgbWVtc2V0IChvLCAwLCBzaXplb2YgKm8pOworCisgIG8tPmJhc2VfdHlwZSA9IGJhc2VfdHlwZTsKKyAgby0+dGFyZ2V0X3R5cGUgPSB0YXJnZXRfdHlwZTsKKworICB0LT51LmtvZmZzZXQgPSBvOworCisgIHJldHVybiB0OworfQorCisvKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQorICAgcmV0dXJuIHR5cGUsIHRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgZG9tYWluLCBhbmQgdGhlIGZvdXJ0aAorICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChoYW5kbGUsIHJldHVybl90eXBlLCBkb21haW5fdHlwZSwgYXJnX3R5cGVzLCB2YXJhcmdzKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOworICAgICBkZWJ1Z190eXBlIGRvbWFpbl90eXBlOworICAgICBkZWJ1Z190eXBlICphcmdfdHlwZXM7CisgICAgIGJvb2xlYW4gdmFyYXJnczsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7CisgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdHlwZSAqbTsKKworICBpZiAocmV0dXJuX3R5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfTUVUSE9ELCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbSk7CisgIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKKworICBtLT5yZXR1cm5fdHlwZSA9IHJldHVybl90eXBlOworICBtLT5kb21haW5fdHlwZSA9IGRvbWFpbl90eXBlOworICBtLT5hcmdfdHlwZXMgPSBhcmdfdHlwZXM7CisgIG0tPnZhcmFyZ3MgPSB2YXJhcmdzOworCisgIHQtPnUua21ldGhvZCA9IG07CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGhhbmRsZSwgdHlwZSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKKworICBpZiAodHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9DT05TVCwgMCk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICB0LT51Lmtjb25zdCA9IHR5cGU7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdmVyc2lvbiBvZiBhIGdpdmVuIHR5cGUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKGhhbmRsZSwgdHlwZSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworeworICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKKworICBpZiAodHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9WT0xBVElMRSwgMCk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICB0LT51Lmt2b2xhdGlsZSA9IHR5cGU7CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIE1ha2UgYW4gdW5kZWZpbmVkIHRhZ2dlZCB0eXBlLiAgRm9yIGV4YW1wbGUsIGEgc3RydWN0IHdoaWNoIGhhcworICAgYmVlbiBtZW50aW9uZWQsIGJ1dCBub3QgZGVmaW5lZC4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX21ha2VfdW5kZWZpbmVkX3RhZ2dlZF90eXBlIChoYW5kbGUsIG5hbWUsIGtpbmQpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICBzd2l0Y2ggKGtpbmQpCisgICAgeworICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6CisgICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgorICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKKyAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6CisgICAgY2FzZSBERUJVR19LSU5EX0VOVU06CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfbWFrZV91bmRlZmluZWRfdHlwZTogdW5zdXBwb3J0ZWQga2luZCIpKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIGtpbmQsIDApOworICBpZiAodCA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgcmV0dXJuIGRlYnVnX3RhZ190eXBlIChoYW5kbGUsIG5hbWUsIHQpOworfQorCisvKiBNYWtlIGEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYmFzZQorICAgY2xhc3MgdHlwZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgYml0IHBvc2l0aW9uIG9mIHRoaXMgYmFzZQorICAgY2xhc3MgaW4gdGhlIG9iamVjdCAoYWx3YXlzIDAgdW5sZXNzIGRvaW5nIG11bHRpcGxlIGluaGVyaXRhbmNlKS4KKyAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzIGEgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aAorICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGJhc2UgY2xhc3MuICAqLworCisvKkFSR1NVU0VEKi8KK2RlYnVnX2Jhc2VjbGFzcworZGVidWdfbWFrZV9iYXNlY2xhc3MgKGhhbmRsZSwgdHlwZSwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z190eXBlIHR5cGU7CisgICAgIGJmZF92bWEgYml0cG9zOworICAgICBib29sZWFuIHZpcnR1YWw7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeyAgICAgCisgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmI7CisKKyAgYiA9IChzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICopIHhtYWxsb2MgKHNpemVvZiAqYik7CisgIG1lbXNldCAoYiwgMCwgc2l6ZW9mICpiKTsKKworICBiLT50eXBlID0gdHlwZTsKKyAgYi0+Yml0cG9zID0gYml0cG9zOworICBiLT52aXJ0dWFsID0gdmlydHVhbDsKKyAgYi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7CisKKyAgcmV0dXJuIGI7Cit9CisKKy8qIE1ha2UgYSBmaWVsZCBmb3IgYSBzdHJ1Y3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLiAgVGhlCisgICB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzCisgICB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZC4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZgorICAgdGhlIGZpZWxkIChpdCBtYXkgYmUgemVybykuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkKKyAgIG9mIHRoZSBmaWVsZC4gICovCisKKy8qQVJHU1VTRUQqLworZGVidWdfZmllbGQKK2RlYnVnX21ha2VfZmllbGQgKGhhbmRsZSwgbmFtZSwgdHlwZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBkZWJ1Z190eXBlIHR5cGU7CisgICAgIGJmZF92bWEgYml0cG9zOworICAgICBiZmRfdm1hIGJpdHNpemU7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeworICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7CisKKyAgZiA9IChzdHJ1Y3QgZGVidWdfZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKKyAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOworCisgIGYtPm5hbWUgPSBuYW1lOworICBmLT50eXBlID0gdHlwZTsKKyAgZi0+c3RhdGljX21lbWJlciA9IGZhbHNlOworICBmLT51LmYuYml0cG9zID0gYml0cG9zOworICBmLT51LmYuYml0c2l6ZSA9IGJpdHNpemU7CisgIGYtPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OworCisgIHJldHVybiBmOworfQorCisvKiBNYWtlIGEgc3RhdGljIG1lbWJlciBvZiBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQorICAgbmFtZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyLiAgVGhlIGZvdXJ0aAorICAgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIG1lbWJlciAoaS5lLiwgdGhlIG5hbWUgYXMgYQorICAgZ2xvYmFsIHZhcmlhYmxlKS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKKyAgIG1lbWJlci4gICovCisKKy8qQVJHU1VTRUQqLworZGVidWdfZmllbGQKK2RlYnVnX21ha2Vfc3RhdGljX21lbWJlciAoaGFuZGxlLCBuYW1lLCB0eXBlLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Cit7CisgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKKworICBmID0gKHN0cnVjdCBkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKmYpOworICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7CisKKyAgZi0+bmFtZSA9IG5hbWU7CisgIGYtPnR5cGUgPSB0eXBlOworICBmLT5zdGF0aWNfbWVtYmVyID0gdHJ1ZTsKKyAgZi0+dS5zLnBoeXNuYW1lID0gcGh5c25hbWU7CisgIGYtPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OworCisgIHJldHVybiBmOworfQorCisvKiBNYWtlIGEgbWV0aG9kLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSwgYW5kIHRoZSB0aGlyZAorICAgYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbWV0aG9kIHZhcmlhbnRzLiAgKi8KKworLypBUkdTVVNFRCovCitkZWJ1Z19tZXRob2QKK2RlYnVnX21ha2VfbWV0aG9kIChoYW5kbGUsIG5hbWUsIHZhcmlhbnRzKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdmFyaWFudHM7Cit7CisgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKm07CisKKyAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kICopIHhtYWxsb2MgKHNpemVvZiAqbSk7CisgIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKKworICBtLT5uYW1lID0gbmFtZTsKKyAgbS0+dmFyaWFudHMgPSB2YXJpYW50czsKKworICByZXR1cm4gbTsKK30KKworLyogTWFrZSBhIG1ldGhvZCBhcmd1bWVudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJlYWwgbmFtZSBvZgorICAgdGhlIGZ1bmN0aW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbi4gIFRoZQorICAgZm91cnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5LiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHdoZXRoZXIKKyAgIHRoaXMgaXMgYSBjb25zdCBmdW5jdGlvbi4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYQorICAgdm9sYXRpbGUgZnVuY3Rpb24uICBUaGUgc2V2ZW50aCBhcmd1bWVudCBpcyB0aGUgb2Zmc2V0IGluIHRoZQorICAgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSwgaWYgYW55LiAgVGhlIGVpZ2h0aCBhcmd1bWVudCBpcyB0aGUgdmlydHVhbAorICAgZnVuY3Rpb24gY29udGV4dC4gIEZJWE1FOiBBcmUgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBhcmd1bWVudHMKKyAgIG5lY2Vzc2FyeT8gIENvdWxkIHdlIGp1c3QgdXNlIGRlYnVnX21ha2VfY29uc3RfdHlwZT8gICovCisKKy8qQVJHU1VTRUQqLworZGVidWdfbWV0aG9kX3ZhcmlhbnQKK2RlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQgKGhhbmRsZSwgcGh5c25hbWUsIHR5cGUsIHZpc2liaWxpdHksIGNvbnN0cCwKKwkJCSAgIHZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKKyAgICAgYmZkX3ZtYSB2b2Zmc2V0OworICAgICBkZWJ1Z190eXBlIGNvbnRleHQ7Cit7CisgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqbTsKKworICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSB4bWFsbG9jIChzaXplb2YgKm0pOworICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7CisKKyAgbS0+cGh5c25hbWUgPSBwaHlzbmFtZTsKKyAgbS0+dHlwZSA9IHR5cGU7CisgIG0tPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OworICBtLT5jb25zdHAgPSBjb25zdHA7CisgIG0tPnZvbGF0aWxlcCA9IHZvbGF0aWxlcDsKKyAgbS0+dm9mZnNldCA9IHZvZmZzZXQ7CisgIG0tPmNvbnRleHQgPSBjb250ZXh0OworCisgIHJldHVybiBtOworfQorCisvKiBNYWtlIGEgc3RhdGljIG1ldGhvZCBhcmd1bWVudC4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvcgorICAgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCwgZXhjZXB0IHRoYXQgdGhlIGxhc3QgdHdvIGFyZSBvbWl0dGVkCisgICBzaW5jZSBhIHN0YXRpYyBtZXRob2QgY2FuIG5vdCBhbHNvIGJlIHZpcnR1YWwuICAqLworCitkZWJ1Z19tZXRob2RfdmFyaWFudAorZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKGhhbmRsZSwgcGh5c25hbWUsIHR5cGUsIHZpc2liaWxpdHksCisJCQkJICBjb25zdHAsIHZvbGF0aWxlcCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKK3sKKyAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICptOworCisgIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICopIHhtYWxsb2MgKHNpemVvZiAqbSk7CisgIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKKworICBtLT5waHlzbmFtZSA9IHBoeXNuYW1lOworICBtLT50eXBlID0gdHlwZTsKKyAgbS0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7CisgIG0tPmNvbnN0cCA9IGNvbnN0cDsKKyAgbS0+dm9sYXRpbGVwID0gdm9sYXRpbGVwOworICBtLT52b2Zmc2V0ID0gVk9GRlNFVF9TVEFUSUNfTUVUSE9EOworCisgIHJldHVybiBtOworfQorCisvKiBOYW1lIGEgdHlwZS4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX25hbWVfdHlwZSAoaGFuZGxlLCBuYW1lLCB0eXBlKQorICAgICBQVFIgaGFuZGxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBkZWJ1Z190eXBlIHR5cGU7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp0OworICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqbjsKKyAgc3RydWN0IGRlYnVnX25hbWUgKm5tOworCisgIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCisgICAgICB8fCBpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfbmFtZV90eXBlOiBubyBjdXJyZW50IGZpbGUiKSk7CisgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworICAgIH0KKworICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX05BTUVELCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIG4gPSAoc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOworCisgIG4tPnR5cGUgPSB0eXBlOworCisgIHQtPnUua25hbWVkID0gbjsKKworICAvKiBXZSBhbHdheXMgYWRkIHRoZSBuYW1lIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgVGhpcyBpcyBwcm9iYWJseQorICAgICB3cm9uZyBpbiBzb21lIGNhc2VzLCBidXQgaXQgc2VlbXMgdG8gYmUgcmlnaHQgZm9yIHN0YWJzLiAgRklYTUUuICAqLworCisgIG5tID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywgbmFtZSwKKwkJCSAgICAgICBERUJVR19PQkpFQ1RfVFlQRSwgREVCVUdfTElOS0FHRV9OT05FKTsKKyAgaWYgKG5tID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG5tLT51LnR5cGUgPSB0OworCisgIG4tPm5hbWUgPSBubTsKKworICByZXR1cm4gdDsKK30KKworLyogVGFnIGEgdHlwZS4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX3RhZ190eXBlIChoYW5kbGUsIG5hbWUsIHR5cGUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7CisgIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICpuOworICBzdHJ1Y3QgZGVidWdfbmFtZSAqbm07CisKKyAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICBpZiAoaW5mby0+Y3VycmVudF9maWxlID09IE5VTEwpCisgICAgeworICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3RhZ190eXBlOiBubyBjdXJyZW50IGZpbGUiKSk7CisgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworICAgIH0KKworICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wICh0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwgbmFtZSkgPT0gMCkKKwlyZXR1cm4gdHlwZTsKKyAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z190YWdfdHlwZTogZXh0cmEgdGFnIGF0dGVtcHRlZCIpKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorCisgIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfVEFHR0VELCAwKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIG4gPSAoc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOworCisgIG4tPnR5cGUgPSB0eXBlOworCisgIHQtPnUua25hbWVkID0gbjsKKworICAvKiBXZSBrZWVwIGEgZ2xvYmFsIG5hbWVzcGFjZSBvZiB0YWdzIGZvciBlYWNoIGNvbXBpbGF0aW9uIHVuaXQuICBJCisgICAgIGRvbid0IGtub3cgaWYgdGhhdCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICAqLworCisgIG5tID0gZGVidWdfYWRkX3RvX25hbWVzcGFjZSAoaW5mbywgJmluZm8tPmN1cnJlbnRfZmlsZS0+Z2xvYmFscywgbmFtZSwKKwkJCSAgICAgICBERUJVR19PQkpFQ1RfVEFHLCBERUJVR19MSU5LQUdFX05PTkUpOworICBpZiAobm0gPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbm0tPnUudGFnID0gdDsKKworICBuLT5uYW1lID0gbm07CisKKyAgcmV0dXJuIHQ7Cit9CisKKy8qIFJlY29yZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR5cGUuICAqLworCisvKkFSR1NVU0VEKi8KK2Jvb2xlYW4KK2RlYnVnX3JlY29yZF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZSwgc2l6ZSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgaWYgKHR5cGUtPnNpemUgIT0gMCAmJiB0eXBlLT5zaXplICE9IHNpemUpCisgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJXYXJuaW5nOiBjaGFuZ2luZyB0eXBlIHNpemUgZnJvbSAlZCB0byAlZFxuIiksCisJICAgICB0eXBlLT5zaXplLCBzaXplKTsKKworICB0eXBlLT5zaXplID0gc2l6ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluZCBhIG5hbWVkIHR5cGUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19maW5kX25hbWVkX3R5cGUgKGhhbmRsZSwgbmFtZSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX2Jsb2NrICpiOworICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKKworICAvKiBXZSBvbmx5IHNlYXJjaCB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgSSBkb24ndCBrbm93IGlmCisgICAgIHRoaXMgaXMgcmlnaHQgb3Igbm90LiAgKi8KKworICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwpCisgICAgeworICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2ZpbmRfbmFtZWRfdHlwZTogbm8gY3VycmVudCBjb21waWxhdGlvbiB1bml0IikpOworICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICB9CisKKyAgZm9yIChiID0gaW5mby0+Y3VycmVudF9ibG9jazsgYiAhPSBOVUxMOyBiID0gYi0+cGFyZW50KQorICAgIHsKKyAgICAgIGlmIChiLT5sb2NhbHMgIT0gTlVMTCkKKwl7CisJICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKKworCSAgZm9yIChuID0gYi0+bG9jYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RZUEUKKwkJICAmJiBuLT5uYW1lWzBdID09IG5hbWVbMF0KKwkJICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCisJCXJldHVybiBuLT51LnR5cGU7CisJICAgIH0KKwl9CisgICAgfQorCisgIGZvciAoZiA9IGluZm8tPmN1cnJlbnRfdW5pdC0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCisgICAgeworICAgICAgaWYgKGYtPmdsb2JhbHMgIT0gTlVMTCkKKwl7CisJICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKKworCSAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmIChuLT5raW5kID09IERFQlVHX09CSkVDVF9UWVBFCisJCSAgJiYgbi0+bmFtZVswXSA9PSBuYW1lWzBdCisJCSAgJiYgc3RyY21wIChuLT5uYW1lLCBuYW1lKSA9PSAwKQorCQlyZXR1cm4gbi0+dS50eXBlOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwkgIAorfQorCisvKiBGaW5kIGEgdGFnZ2VkIHR5cGUuICAqLworCitkZWJ1Z190eXBlCitkZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChoYW5kbGUsIG5hbWUsIGtpbmQpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Cit7CisgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7CisgIHN0cnVjdCBkZWJ1Z191bml0ICp1OworCisgIC8qIFdlIHNlYXJjaCB0aGUgZ2xvYmFscyBvZiBhbGwgdGhlIGNvbXBpbGF0aW9uIHVuaXRzLiAgSSBkb24ndCBrbm93CisgICAgIGlmIHRoaXMgaXMgY29ycmVjdCBvciBub3QuICBJdCB3b3VsZCBiZSBlYXN5IHRvIGNoYW5nZS4gICovCisKKyAgZm9yICh1ID0gaW5mby0+dW5pdHM7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGRlYnVnX2ZpbGUgKmY7CisKKyAgICAgIGZvciAoZiA9IHUtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorCXsKKwkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOworCisJICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKKwkJeworCQkgIGlmIChuLT5raW5kID09IERFQlVHX09CSkVDVF9UQUcKKwkJICAgICAgJiYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMCisJCQkgIHx8IG4tPnUudGFnLT5raW5kID09IGtpbmQpCisJCSAgICAgICYmIG4tPm5hbWVbMF0gPT0gbmFtZVswXQorCQkgICAgICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCisJCSAgICByZXR1cm4gbi0+dS50YWc7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKK30KKworLyogR2V0IGEgYmFzZSB0eXBlLiAgV2UgYnVpbGQgYSBsaW5rZWQgbGlzdCBvbiB0aGUgc3RhY2sgdG8gYXZvaWQKKyAgIGNyYXNoaW5nIGlmIHRoZSB0eXBlIGlzIGRlZmluZWQgY2lyY3VsYXJseS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqCitkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUsIGxpc3QpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKKyAgICAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICpsaXN0OworeworICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKmw7CisgIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCBybDsKKworICBzd2l0Y2ggKHR5cGUtPmtpbmQpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHlwZTsKKworICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKKyAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6CisgICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmb3IgKGwgPSBsaXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChsLT50ID09IHR5cGUpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLAorCQkgICBfKCJkZWJ1Z19nZXRfcmVhbF90eXBlOiBjaXJjdWxhciBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgJXNcbiIpLAorCQkgICBkZWJ1Z19nZXRfdHlwZV9uYW1lIChoYW5kbGUsIHR5cGUpKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgcmwubmV4dCA9IGxpc3Q7CisgIHJsLnQgPSB0eXBlOworCisgIHN3aXRjaCAodHlwZS0+a2luZCkKKyAgICB7CisgICAgICAvKiBUaGUgZGVmYXVsdCBjYXNlIGlzIGp1c3QgaGVyZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCisgICAgZGVmYXVsdDoKKyAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6CisgICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ICE9IE5VTEwpCisJcmV0dXJuIGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90LCAmcmwpOworICAgICAgcmV0dXJuIHR5cGU7CisgICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgorICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6CisgICAgICByZXR1cm4gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwgJnJsKTsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKy8qIEdldCB0aGUga2luZCBvZiBhIHR5cGUuICAqLworCitlbnVtIGRlYnVnX3R5cGVfa2luZAorZGVidWdfZ2V0X3R5cGVfa2luZCAoaGFuZGxlLCB0eXBlKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z190eXBlIHR5cGU7Cit7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX0tJTkRfSUxMRUdBTDsKKyAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX0tJTkRfSUxMRUdBTDsKKyAgcmV0dXJuIHR5cGUtPmtpbmQ7Cit9CisKKy8qIEdldCB0aGUgbmFtZSBvZiBhIHR5cGUuICAqLworCitjb25zdCBjaGFyICoKK2RlYnVnX2dldF90eXBlX25hbWUgKGhhbmRsZSwgdHlwZSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworeworICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0lORElSRUNUKQorICAgIHsKKyAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgIT0gTlVMTCkKKwlyZXR1cm4gZGVidWdfZ2V0X3R5cGVfbmFtZSAoaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QpOworICAgICAgcmV0dXJuIHR5cGUtPnUua2luZGlyZWN0LT50YWc7CisgICAgfQorICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVECisgICAgICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQorICAgIHJldHVybiB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdldCB0aGUgc2l6ZSBvZiBhIHR5cGUuICAqLworCitiZmRfdm1hCitkZWJ1Z19nZXRfdHlwZV9zaXplIChoYW5kbGUsIHR5cGUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKK3sKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICAvKiBXZSBkb24ndCBjYWxsIGRlYnVnX2dldF9yZWFsX3R5cGUsIGJlY2F1c2Ugc29tZWJvZHkgbWlnaHQgaGF2ZQorICAgICBjYWxsZWQgZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSBvbiBhIG5hbWVkIG9yIGluZGlyZWN0IHR5cGUuICAqLworCisgIGlmICh0eXBlLT5zaXplICE9IDApCisgICAgcmV0dXJuIHR5cGUtPnNpemU7CisKKyAgc3dpdGNoICh0eXBlLT5raW5kKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgorICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCAhPSBOVUxMKQorCXJldHVybiBkZWJ1Z19nZXRfdHlwZV9zaXplIChoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCk7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6CisgICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKKyAgICAgIHJldHVybiBkZWJ1Z19nZXRfdHlwZV9zaXplIChoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlKTsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKy8qIEdldCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZS4gICovCisKK2RlYnVnX3R5cGUKK2RlYnVnX2dldF9yZXR1cm5fdHlwZSAoaGFuZGxlLCB0eXBlKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z190eXBlIHR5cGU7Cit7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgc3dpdGNoICh0eXBlLT5raW5kKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046CisgICAgICByZXR1cm4gdHlwZS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlOworICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6CisgICAgICByZXR1cm4gdHlwZS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZTsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovICAgICAgCit9CisKKy8qIEdldCB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHR5cGUgKGV4Y2VwdCB0aGF0CisgICB3ZSBkb24ndCBjdXJyZW50bHkgc3RvcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiBhIGZ1bmN0aW9uKS4gICovCisKK2NvbnN0IGRlYnVnX3R5cGUgKgorZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyAoaGFuZGxlLCB0eXBlLCBwdmFyYXJncykKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBib29sZWFuICpwdmFyYXJnczsKK3sKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHN3aXRjaCAodHlwZS0+a2luZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKKyAgICAgICpwdmFyYXJncyA9IHR5cGUtPnUua2Z1bmN0aW9uLT52YXJhcmdzOworICAgICAgcmV0dXJuIHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7CisgICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKKyAgICAgICpwdmFyYXJncyA9IHR5cGUtPnUua21ldGhvZC0+dmFyYXJnczsKKyAgICAgIHJldHVybiB0eXBlLT51LmttZXRob2QtPmFyZ190eXBlczsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKy8qIEdldCB0aGUgdGFyZ2V0IHR5cGUgb2YgYSB0eXBlLiAgKi8KKworZGVidWdfdHlwZQorZGVidWdfZ2V0X3RhcmdldF90eXBlIChoYW5kbGUsIHR5cGUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKK3sKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHN3aXRjaCAodHlwZS0+a2luZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgREVCVUdfS0lORF9QT0lOVEVSOgorICAgICAgcmV0dXJuIHR5cGUtPnUua3BvaW50ZXI7CisgICAgY2FzZSBERUJVR19LSU5EX1JFRkVSRU5DRToKKyAgICAgIHJldHVybiB0eXBlLT51LmtyZWZlcmVuY2U7CisgICAgY2FzZSBERUJVR19LSU5EX0NPTlNUOgorICAgICAgcmV0dXJuIHR5cGUtPnUua2NvbnN0OworICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKKyAgICAgIHJldHVybiB0eXBlLT51Lmt2b2xhdGlsZTsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKy8qIEdldCB0aGUgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorICAgY2xhc3MuICAqLworCitjb25zdCBkZWJ1Z19maWVsZCAqCitkZWJ1Z19nZXRfZmllbGRzIChoYW5kbGUsIHR5cGUpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKK3sKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgdHlwZSA9IGRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgTlVMTCk7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHN3aXRjaCAodHlwZS0+a2luZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6CisgICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgorICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKKyAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6CisgICAgICByZXR1cm4gdHlwZS0+dS5rY2xhc3MtPmZpZWxkczsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKy8qIEdldCB0aGUgdHlwZSBvZiBhIGZpZWxkLiAgKi8KKworLypBUkdTVVNFRCovCitkZWJ1Z190eXBlCitkZWJ1Z19nZXRfZmllbGRfdHlwZSAoaGFuZGxlLCBmaWVsZCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfZmllbGQgZmllbGQ7Cit7CisgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gZmllbGQtPnR5cGU7Cit9CisKKy8qIEdldCB0aGUgbmFtZSBvZiBhIGZpZWxkLiAgKi8KKworLypBUkdTVVNFRCovCitjb25zdCBjaGFyICoKK2RlYnVnX2dldF9maWVsZF9uYW1lIChoYW5kbGUsIGZpZWxkKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKK3sKKyAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBmaWVsZC0+bmFtZTsKK30KKworLyogR2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgYSBmaWVsZC4gICovCisKKy8qQVJHU1VTRUQqLworYmZkX3ZtYQorZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyAoaGFuZGxlLCBmaWVsZCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfZmllbGQgZmllbGQ7Cit7CisgIGlmIChmaWVsZCA9PSBOVUxMIHx8IGZpZWxkLT5zdGF0aWNfbWVtYmVyKQorICAgIHJldHVybiAoYmZkX3ZtYSkgLTE7CisgIHJldHVybiBmaWVsZC0+dS5mLmJpdHBvczsKK30KKworLyogR2V0IHRoZSBiaXQgc2l6ZSBvZiBhIGZpZWxkLiAgKi8KKworLypBUkdTVVNFRCovCitiZmRfdm1hCitkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSAoaGFuZGxlLCBmaWVsZCkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgZGVidWdfZmllbGQgZmllbGQ7Cit7CisgIGlmIChmaWVsZCA9PSBOVUxMIHx8IGZpZWxkLT5zdGF0aWNfbWVtYmVyKQorICAgIHJldHVybiAoYmZkX3ZtYSkgLTE7CisgIHJldHVybiBmaWVsZC0+dS5mLmJpdHNpemU7Cit9CisKKy8qIEdldCB0aGUgdmlzaWJpbGl0eSBvZiBhIGZpZWxkLiAgKi8KKworLypBUkdTVVNFRCovCitlbnVtIGRlYnVnX3Zpc2liaWxpdHkKK2RlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5IChoYW5kbGUsIGZpZWxkKQorICAgICBQVFIgaGFuZGxlOworICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKK3sKKyAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOworICByZXR1cm4gZmllbGQtPnZpc2liaWxpdHk7Cit9CisKKy8qIEdldCB0aGUgcGh5c2ljYWwgbmFtZSBvZiBhIGZpZWxkLiAgKi8KKworY29uc3QgY2hhciAqCitkZWJ1Z19nZXRfZmllbGRfcGh5c25hbWUgKGhhbmRsZSwgZmllbGQpCisgICAgIFBUUiBoYW5kbGU7CisgICAgIGRlYnVnX2ZpZWxkIGZpZWxkOworeworICBpZiAoZmllbGQgPT0gTlVMTCB8fCAhIGZpZWxkLT5zdGF0aWNfbWVtYmVyKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gZmllbGQtPnUucy5waHlzbmFtZTsKK30KKwwKKy8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBnaXZlbiBhIGhhbmRsZSB0bworICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBhbmQgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY2FsbC4gICovCisKK2Jvb2xlYW4KK2RlYnVnX3dyaXRlIChoYW5kbGUsIGZucywgZmhhbmRsZSkKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOworICAgICBQVFIgZmhhbmRsZTsKK3sKKyAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKKyAgc3RydWN0IGRlYnVnX3VuaXQgKnU7CisKKyAgLyogV2UgdXNlIGEgbWFyayB0byB0ZWxsIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGEKKyAgICAgcGFydGljdWxhciBuYW1lLiAgV2UgdXNlIGFuIGludGVnZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0bworICAgICBjbGVhciB0aGUgbWFyayBmaWVsZHMgaWYgd2UgaGFwcGVuIHRvIHdyaXRlIG91dCB0aGUgc2FtZQorICAgICBpbmZvcm1hdGlvbiBtb3JlIHRoYW4gb25jZS4gICovCisgICsraW5mby0+bWFyazsKKworICAvKiBUaGUgYmFzZV9pZCBmaWVsZCBob2xkcyBhbiBJRCB2YWx1ZSB3aGljaCB3aWxsIG5ldmVyIGJlIHVzZWQsIHNvCisgICAgIHRoYXQgd2UgY2FuIHRlbGwgd2hldGhlciB3ZSBoYXZlIGFzc2lnbmVkIGFuIElEIGR1cmluZyB0aGlzIGNhbGwKKyAgICAgdG8gZGVidWdfd3JpdGUuICAqLworICBpbmZvLT5iYXNlX2lkID0gaW5mby0+Y2xhc3NfaWQ7CisKKyAgLyogV2Uga2VlcCBhIGxpbmtlZCBsaXN0IG9mIGNsYXNzZXMgZm9yIHdoaWNoIHdhcyBoYXZlIGFzc2lnbmVkIElEJ3MKKyAgICAgZHVyaW5nIHRoaXMgY2FsbCB0byBkZWJ1Z193cml0ZS4gICovCisgIGluZm8tPmlkX2xpc3QgPSBOVUxMOworCisgIGZvciAodSA9IGluZm8tPnVuaXRzOyB1ICE9IE5VTEw7IHUgPSB1LT5uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCBkZWJ1Z19maWxlICpmOworICAgICAgYm9vbGVhbiBmaXJzdF9maWxlOworCisgICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVubyA9IHUtPmxpbmVub3M7CisgICAgICBpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA9IDA7CisKKyAgICAgIGlmICghICgqZm5zLT5zdGFydF9jb21waWxhdGlvbl91bml0KSAoZmhhbmRsZSwgdS0+ZmlsZXMtPmZpbGVuYW1lKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGZpcnN0X2ZpbGUgPSB0cnVlOworICAgICAgZm9yIChmID0gdS0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCisJeworCSAgc3RydWN0IGRlYnVnX25hbWUgKm47CisKKwkgIGlmIChmaXJzdF9maWxlKQorCSAgICBmaXJzdF9maWxlID0gZmFsc2U7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISAoKmZucy0+c3RhcnRfc291cmNlKSAoZmhhbmRsZSwgZi0+ZmlsZW5hbWUpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaWYgKGYtPmdsb2JhbHMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZvciAobiA9IGYtPmdsb2JhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCisJCXsKKwkJICBpZiAoISBkZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIC8qIE91dHB1dCBhbnkgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2hpY2ggaGFzbid0IGFscmVhZHkgYmVlbgorICAgICAgICAgaGFuZGxlZC4gICovCisgICAgICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIChiZmRfdm1hKSAtMSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgb3V0IGFuIGVsZW1lbnQgaW4gYSBuYW1lc3BhY2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKQorICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOworICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7CisgICAgIFBUUiBmaGFuZGxlOworICAgICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKK3sKKyAgc3dpdGNoIChuLT5raW5kKQorICAgIHsKKyAgICBjYXNlIERFQlVHX09CSkVDVF9UWVBFOgorICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnR5cGUsIG4pCisJICB8fCAhICgqZm5zLT50eXBkZWYpIChmaGFuZGxlLCBuLT5uYW1lKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIERFQlVHX09CSkVDVF9UQUc6CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudGFnLCBuKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gKCpmbnMtPnRhZykgKGZoYW5kbGUsIG4tPm5hbWUpOworICAgIGNhc2UgREVCVUdfT0JKRUNUX1ZBUklBQkxFOgorICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnZhcmlhYmxlLT50eXBlLAorCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+dmFyaWFibGUpIChmaGFuZGxlLCBuLT5uYW1lLCBuLT51LnZhcmlhYmxlLT5raW5kLAorCQkJICAgICAgIG4tPnUudmFyaWFibGUtPnZhbCk7CisgICAgY2FzZSBERUJVR19PQkpFQ1RfRlVOQ1RJT046CisgICAgICByZXR1cm4gZGVidWdfd3JpdGVfZnVuY3Rpb24gKGluZm8sIGZucywgZmhhbmRsZSwgbi0+bmFtZSwKKwkJCQkgICBuLT5saW5rYWdlLCBuLT51LmZ1bmN0aW9uKTsKKyAgICBjYXNlIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQ6CisgICAgICByZXR1cm4gKCpmbnMtPmludF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUuaW50X2NvbnN0YW50KTsKKyAgICBjYXNlIERFQlVHX09CSkVDVF9GTE9BVF9DT05TVEFOVDoKKyAgICAgIHJldHVybiAoKmZucy0+ZmxvYXRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLCBuLT51LmZsb2F0X2NvbnN0YW50KTsKKyAgICBjYXNlIERFQlVHX09CSkVDVF9UWVBFRF9DT05TVEFOVDoKKyAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50eXBlZF9jb25zdGFudC0+dHlwZSwKKwkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gKCpmbnMtPnR5cGVkX2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwKKwkJCQkgICAgIG4tPnUudHlwZWRfY29uc3RhbnQtPnZhbCk7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKworLyogV3JpdGUgb3V0IGEgdHlwZS4gIElmIHRoZSB0eXBlIGlzIERFQlVHX0tJTkRfTkFNRUQgb3IKKyAgIERFQlVHX0tJTkRfVEFHR0VELCB0aGVuIHRoZSBuYW1lIGFyZ3VtZW50IGlzIHRoZSBuYW1lIGZvciB3aGljaCB3ZQorICAgYXJlIGFib3V0IHRvIGNhbGwgdHlwZWRlZiBvciB0YWcuICBJZiB0aGUgdHlwZSBpcyBhbnl0aGluZyBlbHNlLAorICAgdGhlbiB0aGUgbmFtZSBhcmd1bWVudCBpcyBhIHRhZyBmcm9tIGEgREVCVUdfS0lORF9UQUdHRUQgdHlwZSB3aGljaAorICAgcG9pbnRzIHRvIHRoaXMgb25lLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2RlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZSwgbmFtZSkKKyAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOworICAgICBQVFIgZmhhbmRsZTsKKyAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7CisgICAgIHN0cnVjdCBkZWJ1Z19uYW1lICpuYW1lOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IGlzOworICBjb25zdCBjaGFyICp0YWc7CisKKyAgLyogSWYgd2UgaGF2ZSBhIG5hbWUgZm9yIHRoaXMgdHlwZSwganVzdCBvdXRwdXQgaXQuICBXZSBvbmx5IG91dHB1dAorICAgICB0eXBlZGVmIG5hbWVzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGRlZmluZWQuICBXZSBvdXRwdXQgdHlwZSB0YWdzCisgICAgIHdoZW5ldmVyIHdlIGFyZSBub3QgYWN0dWFsbHkgZGVmaW5pbmcgdGhlbS4gICovCisgIGlmICgodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVECisgICAgICAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKKyAgICAgICYmICh0eXBlLT51LmtuYW1lZC0+bmFtZS0+bWFyayA9PSBpbmZvLT5tYXJrCisJICB8fCAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRAorCSAgICAgICYmIHR5cGUtPnUua25hbWVkLT5uYW1lICE9IG5hbWUpKSkKKyAgICB7CisgICAgICBpZiAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVEKQorCXJldHVybiAoKmZucy0+dHlwZWRlZl90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUpOworICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCBkZWJ1Z190eXBlICpyZWFsOworCSAgdW5zaWduZWQgaW50IGlkOworCisJICByZWFsID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywgdHlwZSwgTlVMTCk7CisJICBpZiAocmVhbCA9PSBOVUxMKQorCSAgICByZXR1cm4gKCpmbnMtPmVtcHR5X3R5cGUpIChmaGFuZGxlKTsKKwkgIGlkID0gMDsKKwkgIGlmICgocmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1NUUlVDVAorCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfVU5JT04KKwkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTCisJICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTl9DTEFTUykKKwkgICAgICAmJiByZWFsLT51LmtjbGFzcyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKHJlYWwtPnUua2NsYXNzLT5pZCA8PSBpbmZvLT5iYXNlX2lkKQorCQl7CisJCSAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLAorCQkJCQkgICAgdHlwZS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsCisJCQkJCSAgICByZWFsKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICAgIGlkID0gcmVhbC0+dS5rY2xhc3MtPmlkOworCSAgICB9CisKKwkgIHJldHVybiAoKmZucy0+dGFnX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwgaWQsCisJCQkJICAgcmVhbC0+a2luZCk7CisJfQorICAgIH0KKworICAvKiBNYXJrIHRoZSBuYW1lIGFmdGVyIHdlIGhhdmUgYWxyZWFkeSBsb29rZWQgZm9yIGEga25vd24gbmFtZSwgc28KKyAgICAgdGhhdCB3ZSBkb24ndCBqdXN0IGRlZmluZSBhIHR5cGUgaW4gdGVybXMgb2YgaXRzZWxmLiAgV2UgbmVlZCB0bworICAgICBtYXJrIHRoZSBuYW1lIGhlcmUgc28gdGhhdCBhIHN0cnVjdCBjb250YWluaW5nIGEgcG9pbnRlciB0bworICAgICBpdHNlbGYgd2lsbCB3b3JrLiAgKi8KKyAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICBuYW1lLT5tYXJrID0gaW5mby0+bWFyazsKKworICB0YWcgPSBOVUxMOworICBpZiAobmFtZSAhPSBOVUxMCisgICAgICAmJiB0eXBlLT5raW5kICE9IERFQlVHX0tJTkRfTkFNRUQKKyAgICAgICYmIHR5cGUtPmtpbmQgIT0gREVCVUdfS0lORF9UQUdHRUQpCisgICAgeworICAgICAgYXNzZXJ0IChuYW1lLT5raW5kID09IERFQlVHX09CSkVDVF9UQUcpOworICAgICAgdGFnID0gbmFtZS0+bmFtZTsKKyAgICB9CisKKyAgc3dpdGNoICh0eXBlLT5raW5kKQorICAgIHsKKyAgICBjYXNlIERFQlVHX0tJTkRfSUxMRUdBTDoKKyAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z193cml0ZV90eXBlOiBpbGxlZ2FsIHR5cGUgZW5jb3VudGVyZWQiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgorICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuICgqZm5zLT5lbXB0eV90eXBlKSAoZmhhbmRsZSk7CisgICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QsCisJCQkgICAgICAgbmFtZSk7CisgICAgY2FzZSBERUJVR19LSU5EX1ZPSUQ6CisgICAgICByZXR1cm4gKCpmbnMtPnZvaWRfdHlwZSkgKGZoYW5kbGUpOworICAgIGNhc2UgREVCVUdfS0lORF9JTlQ6CisgICAgICByZXR1cm4gKCpmbnMtPmludF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSwgdHlwZS0+dS5raW50KTsKKyAgICBjYXNlIERFQlVHX0tJTkRfRkxPQVQ6CisgICAgICByZXR1cm4gKCpmbnMtPmZsb2F0X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfQ09NUExFWDoKKyAgICAgIHJldHVybiAoKmZucy0+Y29tcGxleF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7CisgICAgY2FzZSBERUJVR19LSU5EX0JPT0w6CisgICAgICByZXR1cm4gKCpmbnMtPmJvb2xfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOworICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6CisgICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgorICAgICAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwpCisJeworCSAgaWYgKHR5cGUtPnUua2NsYXNzLT5pZCA8PSBpbmZvLT5iYXNlX2lkKQorCSAgICB7CisJICAgICAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaWYgKGluZm8tPm1hcmsgPT0gdHlwZS0+dS5rY2xhc3MtPm1hcmspCisJICAgIHsKKwkgICAgICAvKiBXZSBhcmUgY3VycmVudGx5IG91dHB1dHRpbmcgdGhpcyBzdHJ1Y3QsIG9yIHdlIGhhdmUKKwkJIGFscmVhZHkgb3V0cHV0IGl0LiAgSSBkb24ndCBrbm93IGlmIHRoaXMgY2FuIGhhcHBlbiwKKwkJIGJ1dCBpdCBjYW4gaGFwcGVuIGZvciBhIGNsYXNzLiAgKi8KKwkgICAgICBhc3NlcnQgKHR5cGUtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQpOworCSAgICAgIHJldHVybiAoKmZucy0+dGFnX3R5cGUpIChmaGFuZGxlLCB0YWcsIHR5cGUtPnUua2NsYXNzLT5pZCwKKwkJCQkgICAgICAgdHlwZS0+a2luZCk7CisJICAgIH0KKwkgIHR5cGUtPnUua2NsYXNzLT5tYXJrID0gaW5mby0+bWFyazsKKwl9CisKKyAgICAgIGlmICghICgqZm5zLT5zdGFydF9zdHJ1Y3RfdHlwZSkgKGZoYW5kbGUsIHRhZywKKwkJCQkgICAgICAgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwKKwkJCQkJPyB0eXBlLT51LmtjbGFzcy0+aWQKKwkJCQkJOiAwKSwKKwkJCQkgICAgICAgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1NUUlVDVCwKKwkJCQkgICAgICAgdHlwZS0+c2l6ZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwKKwkgICYmIHR5cGUtPnUua2NsYXNzLT5maWVsZHMgIT0gTlVMTCkKKwl7CisJICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldICE9IE5VTEw7IGkrKykKKwkgICAgeworCSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKKworCSAgICAgIGYgPSB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldOworCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZi0+dHlwZSwKKwkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKKwkJICB8fCAhICgqZm5zLT5zdHJ1Y3RfZmllbGQpIChmaGFuZGxlLCBmLT5uYW1lLCBmLT51LmYuYml0cG9zLAorCQkJCQkgICAgIGYtPnUuZi5iaXRzaXplLCBmLT52aXNpYmlsaXR5KSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgcmV0dXJuICgqZm5zLT5lbmRfc3RydWN0X3R5cGUpIChmaGFuZGxlKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6CisgICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgorICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZSwgdGFnKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKKyAgICAgIGlmICh0eXBlLT51LmtlbnVtID09IE5VTEwpCisJcmV0dXJuICgqZm5zLT5lbnVtX3R5cGUpIChmaGFuZGxlLCB0YWcsIChjb25zdCBjaGFyICoqKSBOVUxMLAorCQkJCSAgKGJmZF9zaWduZWRfdm1hICopIE5VTEwpOworICAgICAgcmV0dXJuICgqZm5zLT5lbnVtX3R5cGUpIChmaGFuZGxlLCB0YWcsIHR5cGUtPnUua2VudW0tPm5hbWVzLAorCQkJCXR5cGUtPnUua2VudW0tPnZhbHVlcyk7CisgICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3BvaW50ZXIsCisJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuICgqZm5zLT5wb2ludGVyX3R5cGUpIChmaGFuZGxlKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCisJCQkgICAgICB0eXBlLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCisJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkKKwlpcyA9IC0xOworICAgICAgZWxzZQorCXsKKwkgIGZvciAoaXMgPSAwOyB0eXBlLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzW2lzXSAhPSBOVUxMOyBpcysrKQorCSAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCisJCQkJICAgIHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXNbaXNdLAorCQkJCSAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiAoKmZucy0+ZnVuY3Rpb25fdHlwZSkgKGZoYW5kbGUsIGlzLAorCQkJCSAgICB0eXBlLT51LmtmdW5jdGlvbi0+dmFyYXJncyk7CisgICAgY2FzZSBERUJVR19LSU5EX1JFRkVSRU5DRToKKyAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcmVmZXJlbmNlLAorCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+cmVmZXJlbmNlX3R5cGUpIChmaGFuZGxlKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfUkFOR0U6CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3JhbmdlLT50eXBlLAorCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+cmFuZ2VfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua3JhbmdlLT5sb3dlciwKKwkJCQkgdHlwZS0+dS5rcmFuZ2UtPnVwcGVyKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfQVJSQVk6CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua2FycmF5LT5lbGVtZW50X3R5cGUsCisJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKKwkgIHx8ICEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAorCQkJCSB0eXBlLT51LmthcnJheS0+cmFuZ2VfdHlwZSwKKwkJCQkgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+YXJyYXlfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua2FycmF5LT5sb3dlciwKKwkJCQkgdHlwZS0+dS5rYXJyYXktPnVwcGVyLAorCQkJCSB0eXBlLT51LmthcnJheS0+c3RyaW5ncCk7CisgICAgY2FzZSBERUJVR19LSU5EX1NFVDoKKyAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rc2V0LT50eXBlLAorCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+c2V0X3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtzZXQtPmJpdHN0cmluZ3ApOworICAgIGNhc2UgREVCVUdfS0lORF9PRkZTRVQ6CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua29mZnNldC0+YmFzZV90eXBlLAorCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCisJICB8fCAhIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKKwkJCQkgdHlwZS0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSwKKwkJCQkgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+b2Zmc2V0X3R5cGUpIChmaGFuZGxlKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgorICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAorCQkJICAgICAgdHlwZS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSwKKwkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAodHlwZS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKKwlpcyA9IC0xOworICAgICAgZWxzZQorCXsKKwkgIGZvciAoaXMgPSAwOyB0eXBlLT51LmttZXRob2QtPmFyZ190eXBlc1tpc10gIT0gTlVMTDsgaXMrKykKKwkgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAorCQkJCSAgICB0eXBlLT51LmttZXRob2QtPmFyZ190eXBlc1tpc10sCisJCQkJICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaWYgKHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUgIT0gTlVMTCkKKwl7CisJICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCisJCQkJICB0eXBlLT51LmttZXRob2QtPmRvbWFpbl90eXBlLAorCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgcmV0dXJuICgqZm5zLT5tZXRob2RfdHlwZSkgKGZoYW5kbGUsCisJCQkJICB0eXBlLT51LmttZXRob2QtPmRvbWFpbl90eXBlICE9IE5VTEwsCisJCQkJICBpcywKKwkJCQkgIHR5cGUtPnUua21ldGhvZC0+dmFyYXJncyk7CisgICAgY2FzZSBERUJVR19LSU5EX0NPTlNUOgorICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51Lmtjb25zdCwKKwkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gKCpmbnMtPmNvbnN0X3R5cGUpIChmaGFuZGxlKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfVk9MQVRJTEU6CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua3ZvbGF0aWxlLAorCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiAoKmZucy0+dm9sYXRpbGVfdHlwZSkgKGZoYW5kbGUpOworICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKKyAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLAorCQkJICAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKTsKKyAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgorICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUsCisJCQkgICAgICAgdHlwZS0+dS5rbmFtZWQtPm5hbWUpOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFdyaXRlIG91dCBhIGNsYXNzIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorZGVidWdfd3JpdGVfY2xhc3NfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCB0YWcpCisgICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKKyAgICAgUFRSIGZoYW5kbGU7CisgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOworICAgICBjb25zdCBjaGFyICp0YWc7Cit7CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgaWQ7CisgIHN0cnVjdCBkZWJ1Z190eXBlICp2cHRyYmFzZTsKKworICBpZiAodHlwZS0+dS5rY2xhc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZCA9IDA7CisgICAgICB2cHRyYmFzZSA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5pZCA8PSBpbmZvLT5iYXNlX2lkKQorCXsKKwkgIGlmICghIGRlYnVnX3NldF9jbGFzc19pZCAoaW5mbywgdGFnLCB0eXBlKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKGluZm8tPm1hcmsgPT0gdHlwZS0+dS5rY2xhc3MtPm1hcmspCisJeworCSAgLyogV2UgYXJlIGN1cnJlbnRseSBvdXRwdXR0aW5nIHRoaXMgY2xhc3MsIG9yIHdlIGhhdmUKKwkgICAgIGFscmVhZHkgb3V0cHV0IGl0LiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgYXJlCisJICAgICBtZXRob2RzIGZvciBhbiBhbm9ueW1vdXMgY2xhc3MuICAqLworCSAgYXNzZXJ0ICh0eXBlLT51LmtjbGFzcy0+aWQgPiBpbmZvLT5iYXNlX2lkKTsKKwkgIHJldHVybiAoKmZucy0+dGFnX3R5cGUpIChmaGFuZGxlLCB0YWcsIHR5cGUtPnUua2NsYXNzLT5pZCwKKwkJCQkgICB0eXBlLT5raW5kKTsKKwl9CisgICAgICB0eXBlLT51LmtjbGFzcy0+bWFyayA9IGluZm8tPm1hcms7CisgICAgICBpZCA9IHR5cGUtPnUua2NsYXNzLT5pZDsKKworICAgICAgdnB0cmJhc2UgPSB0eXBlLT51LmtjbGFzcy0+dnB0cmJhc2U7CisgICAgICBpZiAodnB0cmJhc2UgIT0gTlVMTCAmJiB2cHRyYmFzZSAhPSB0eXBlKQorCXsKKwkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdnB0cmJhc2UsCisJCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGlmICghICgqZm5zLT5zdGFydF9jbGFzc190eXBlKSAoZmhhbmRsZSwgdGFnLCBpZCwKKwkJCQkgIHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUywKKwkJCQkgIHR5cGUtPnNpemUsCisJCQkJICB2cHRyYmFzZSAhPSBOVUxMLAorCQkJCSAgdnB0cmJhc2UgPT0gdHlwZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICh0eXBlLT51LmtjbGFzcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+ZmllbGRzICE9IE5VTEwpCisJeworCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXSAhPSBOVUxMOyBpKyspCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZGVidWdfZmllbGQgKmY7CisKKwkgICAgICBmID0gdHlwZS0+dS5rY2xhc3MtPmZpZWxkc1tpXTsKKwkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGYtPnR5cGUsCisJCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgaWYgKGYtPnN0YXRpY19tZW1iZXIpCisJCXsKKwkJICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhdGljX21lbWJlcikgKGZoYW5kbGUsIGYtPm5hbWUsCisJCQkJCQkgICAgIGYtPnUucy5waHlzbmFtZSwKKwkJCQkJCSAgICAgZi0+dmlzaWJpbGl0eSkpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoISAoKmZucy0+c3RydWN0X2ZpZWxkKSAoZmhhbmRsZSwgZi0+bmFtZSwgZi0+dS5mLmJpdHBvcywKKwkJCQkJICAgICAgZi0+dS5mLmJpdHNpemUsIGYtPnZpc2liaWxpdHkpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmICh0eXBlLT51LmtjbGFzcy0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKKwl7CisJICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+YmFzZWNsYXNzZXNbaV0gIT0gTlVMTDsgaSsrKQorCSAgICB7CisJICAgICAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjsKKworCSAgICAgIGIgPSB0eXBlLT51LmtjbGFzcy0+YmFzZWNsYXNzZXNbaV07CisJICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBiLT50eXBlLAorCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19iYXNlY2xhc3MpIChmaGFuZGxlLCBiLT5iaXRwb3MsIGItPnZpcnR1YWwsCisJCQkJCSAgICAgYi0+dmlzaWJpbGl0eSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5tZXRob2RzICE9IE5VTEwpCisJeworCSAgZm9yIChpID0gMDsgdHlwZS0+dS5rY2xhc3MtPm1ldGhvZHNbaV0gIT0gTlVMTDsgaSsrKQorCSAgICB7CisJICAgICAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTsKKwkgICAgICB1bnNpZ25lZCBpbnQgajsKKworCSAgICAgIG0gPSB0eXBlLT51LmtjbGFzcy0+bWV0aG9kc1tpXTsKKwkgICAgICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhcnRfbWV0aG9kKSAoZmhhbmRsZSwgbS0+bmFtZSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBmb3IgKGogPSAwOyBtLT52YXJpYW50c1tqXSAhPSBOVUxMOyBqKyspCisJCXsKKwkJICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnY7CisKKwkJICB2ID0gbS0+dmFyaWFudHNbal07CisJCSAgaWYgKHYtPmNvbnRleHQgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2LT5jb250ZXh0LAorCQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2LT50eXBlLAorCQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICBpZiAodi0+dm9mZnNldCAhPSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QpCisJCSAgICB7CisJCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19tZXRob2RfdmFyaWFudCkgKGZoYW5kbGUsIHYtPnBoeXNuYW1lLAorCQkJCQkJCSAgdi0+dmlzaWJpbGl0eSwKKwkJCQkJCQkgIHYtPmNvbnN0cCwKKwkJCQkJCQkgIHYtPnZvbGF0aWxlcCwKKwkJCQkJCQkgIHYtPnZvZmZzZXQsCisJCQkJCQkJICB2LT5jb250ZXh0ICE9IE5VTEwpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCkgKGZoYW5kbGUsCisJCQkJCQkJCSB2LT5waHlzbmFtZSwKKwkJCQkJCQkJIHYtPnZpc2liaWxpdHksCisJCQkJCQkJCSB2LT5jb25zdHAsCisJCQkJCQkJCSB2LT52b2xhdGlsZXApKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX2VuZF9tZXRob2QpIChmaGFuZGxlKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gKCpmbnMtPmVuZF9jbGFzc190eXBlKSAoZmhhbmRsZSk7Cit9CisKKy8qIFdyaXRlIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitkZWJ1Z193cml0ZV9mdW5jdGlvbiAoaW5mbywgZm5zLCBmaGFuZGxlLCBuYW1lLCBsaW5rYWdlLCBmdW5jdGlvbikKKyAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOworICAgICBQVFIgZmhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOworICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmZ1bmN0aW9uOworeworICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpwOworICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7CisKKyAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBmdW5jdGlvbi0+YmxvY2tzLT5zdGFydCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZnVuY3Rpb24tPnJldHVybl90eXBlLAorCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghICgqZm5zLT5zdGFydF9mdW5jdGlvbikgKGZoYW5kbGUsIG5hbWUsCisJCQkJbGlua2FnZSA9PSBERUJVR19MSU5LQUdFX0dMT0JBTCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAocCA9IGZ1bmN0aW9uLT5wYXJhbWV0ZXJzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgcC0+dHlwZSwKKwkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQorCSAgfHwgISAoKmZucy0+ZnVuY3Rpb25fcGFyYW1ldGVyKSAoZmhhbmRsZSwgcC0+bmFtZSwgcC0+a2luZCwgcC0+dmFsKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGZvciAoYiA9IGZ1bmN0aW9uLT5ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCisgICAgeworICAgICAgaWYgKCEgZGVidWdfd3JpdGVfYmxvY2sgKGluZm8sIGZucywgZmhhbmRsZSwgYikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gKCpmbnMtPmVuZF9mdW5jdGlvbikgKGZoYW5kbGUpOworfQorCisvKiBXcml0ZSBvdXQgaW5mb3JtYXRpb24gZm9yIGEgYmxvY2suICAqLworCitzdGF0aWMgYm9vbGVhbgorZGVidWdfd3JpdGVfYmxvY2sgKGluZm8sIGZucywgZmhhbmRsZSwgYmxvY2spCisgICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKKyAgICAgUFRSIGZoYW5kbGU7CisgICAgIHN0cnVjdCBkZWJ1Z19ibG9jayAqYmxvY2s7Cit7CisgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOworICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7CisKKyAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jay0+c3RhcnQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJIGNhbid0IHNlZSBhbnkgcG9pbnQgdG8gd3JpdGluZyBvdXQgYSBibG9jayB3aXRoIG5vIGxvY2FsCisgICAgIHZhcmlhYmxlcywgc28gd2UgZG9uJ3QgYm90aGVyLCBleGNlcHQgZm9yIHRoZSB0b3AgbGV2ZWwgYmxvY2suICAqLworICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMIHx8IGJsb2NrLT5wYXJlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISAoKmZucy0+c3RhcnRfYmxvY2spIChmaGFuZGxlLCBibG9jay0+c3RhcnQpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKG4gPSBibG9jay0+bG9jYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQorCXsKKwkgIGlmICghIGRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGZvciAoYiA9IGJsb2NrLT5jaGlsZHJlbjsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoISBkZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYmxvY2stPmVuZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwgfHwgYmxvY2stPnBhcmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghICgqZm5zLT5lbmRfYmxvY2spIChmaGFuZGxlLCBibG9jay0+ZW5kKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gdXAgdG8gQUREUkVTUy4gICovCisKK3N0YXRpYyBib29sZWFuCitkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGFkZHJlc3MpCisgICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKKyAgICAgUFRSIGZoYW5kbGU7CisgICAgIGJmZF92bWEgYWRkcmVzczsKK3sKKyAgd2hpbGUgKGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGRlYnVnX2xpbmVubyAqbDsKKworICAgICAgbCA9IGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vOworCisgICAgICB3aGlsZSAoaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPCBERUJVR19MSU5FTk9fQ09VTlQpCisJeworCSAgaWYgKGwtPmxpbmVub3NbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdCisJICAgICAgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQorCSAgICBicmVhazsKKworCSAgaWYgKGwtPmFkZHJzW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XSA+PSBhZGRyZXNzKQorCSAgICByZXR1cm4gdHJ1ZTsKKworCSAgaWYgKCEgKCpmbnMtPmxpbmVubykgKGZoYW5kbGUsIGwtPmZpbGUtPmZpbGVuYW1lLAorCQkJCWwtPmxpbmVub3NbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdLAorCQkJCWwtPmFkZHJzW2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4XSkpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgKytpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleDsKKwl9CisKKyAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vID0gbC0+bmV4dDsKKyAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4ID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEdldCB0aGUgSUQgbnVtYmVyIGZvciBhIGNsYXNzLiAgSWYgZHVyaW5nIHRoZSBzYW1lIGNhbGwgdG8KKyAgIGRlYnVnX3dyaXRlIHdlIGZpbmQgYSBzdHJ1Y3Qgd2l0aCB0aGUgc2FtZSBkZWZpbml0aW9uIHdpdGggdGhlIHNhbWUKKyAgIG5hbWUsIHdlIHVzZSB0aGUgc2FtZSBJRC4gIFRoaXMgdHlwZSBvZiB0aGluZ3MgaGFwcGVucyBiZWNhdXNlIHRoZQorICAgc2FtZSBzdHJ1Y3Qgd2lsbCBiZSBkZWZpbmVkIGJ5IG11bHRpcGxlIGNvbXBpbGF0aW9uIHVuaXRzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2RlYnVnX3NldF9jbGFzc19pZCAoaW5mbywgdGFnLCB0eXBlKQorICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICp0YWc7CisgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOworeworICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzsKKyAgc3RydWN0IGRlYnVnX2NsYXNzX2lkICpsOworCisgIGFzc2VydCAodHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1NUUlVDVAorCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OCisJICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MKKwkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTl9DTEFTUyk7CisKKyAgYyA9IHR5cGUtPnUua2NsYXNzOworCisgIGlmIChjLT5pZCA+IGluZm8tPmJhc2VfaWQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgZm9yIChsID0gaW5mby0+aWRfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAobC0+dHlwZS0+a2luZCAhPSB0eXBlLT5raW5kKQorCWNvbnRpbnVlOworCisgICAgICBpZiAodGFnID09IE5VTEwpCisJeworCSAgaWYgKGwtPnRhZyAhPSBOVUxMKQorCSAgICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGwtPnRhZyA9PSBOVUxMCisJICAgICAgfHwgbC0+dGFnWzBdICE9IHRhZ1swXQorCSAgICAgIHx8IHN0cmNtcCAobC0+dGFnLCB0YWcpICE9IDApCisJICAgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIGwtPnR5cGUsIHR5cGUpKQorCXsKKwkgIGMtPmlkID0gbC0+dHlwZS0+dS5rY2xhc3MtPmlkOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH0KKworICAvKiBUaGVyZSBhcmUgbm8gaWRlbnRpY2FsIHR5cGVzLiAgVXNlIGEgbmV3IElELCBhbmQgYWRkIGl0IHRvIHRoZQorICAgICBsaXN0LiAgKi8KKyAgKytpbmZvLT5jbGFzc19pZDsKKyAgYy0+aWQgPSBpbmZvLT5jbGFzc19pZDsKKworICBsID0gKHN0cnVjdCBkZWJ1Z19jbGFzc19pZCAqKSB4bWFsbG9jIChzaXplb2YgKmwpOworICBtZW1zZXQgKGwsIDAsIHNpemVvZiAqbCk7CisKKyAgbC0+dHlwZSA9IHR5cGU7CisgIGwtPnRhZyA9IHRhZzsKKworICBsLT5uZXh0ID0gaW5mby0+aWRfbGlzdDsKKyAgaW5mby0+aWRfbGlzdCA9IGw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNlZSBpZiB0d28gdHlwZXMgYXJlIHRoZSBzYW1lLiAgQXQgdGhpcyBwb2ludCwgd2UgZG9uJ3QgY2FyZSBhYm91dAorICAgdGFncyBhbmQgdGhlIGxpa2UuICAqLworCitzdGF0aWMgYm9vbGVhbgorZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKQorICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOworICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDE7CisgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MjsKK3sKKyAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0ICpsOworICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgdG9wOworICBib29sZWFuIHJldDsKKworICBpZiAodDEgPT0gTlVMTCkKKyAgICByZXR1cm4gdDIgPT0gTlVMTDsKKyAgaWYgKHQyID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHdoaWxlICh0MS0+a2luZCA9PSBERUJVR19LSU5EX0lORElSRUNUKQorICAgIHsKKyAgICAgIHQxID0gKnQxLT51LmtpbmRpcmVjdC0+c2xvdDsKKyAgICAgIGlmICh0MSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIHdoaWxlICh0Mi0+a2luZCA9PSBERUJVR19LSU5EX0lORElSRUNUKQorICAgIHsKKyAgICAgIHQyID0gKnQyLT51LmtpbmRpcmVjdC0+c2xvdDsKKyAgICAgIGlmICh0MiA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKHQxID09IHQyKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIEFzIGEgc3BlY2lhbCBjYXNlLCBwZXJtaXQgYSB0eXBlZGVmIHRvIG1hdGNoIGEgdGFnLCBzaW5jZSBDKysKKyAgICAgZGVidWdnaW5nIG91dHB1dCB3aWxsIHNvbWV0aW1lcyBhZGQgYSB0eXBlZGVmIHdoZXJlIEMgZGVidWdnaW5nCisgICAgIG91dHB1dCB3aWxsIG5vdC4gICovCisgIGlmICh0MS0+a2luZCA9PSBERUJVR19LSU5EX05BTUVECisgICAgICAmJiB0Mi0+a2luZCA9PSBERUJVR19LSU5EX1RBR0dFRCkKKyAgICByZXR1cm4gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua25hbWVkLT50eXBlLCB0Mik7CisgIGVsc2UgaWYgKHQxLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VECisJICAgJiYgdDItPmtpbmQgPT0gREVCVUdfS0lORF9OQU1FRCkKKyAgICByZXR1cm4gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyLT51LmtuYW1lZC0+dHlwZSk7CisKKyAgaWYgKHQxLT5raW5kICE9IHQyLT5raW5kCisgICAgICB8fCB0MS0+c2l6ZSAhPSB0Mi0+c2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogR2V0IHJpZCBvZiB0aGUgdHJpdmlhbCBjYXNlcyBmaXJzdC4gICovCisgIHN3aXRjaCAodDEtPmtpbmQpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX0tJTkRfVk9JRDoKKyAgICBjYXNlIERFQlVHX0tJTkRfRkxPQVQ6CisgICAgY2FzZSBERUJVR19LSU5EX0NPTVBMRVg6CisgICAgY2FzZSBERUJVR19LSU5EX0JPT0w6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIERFQlVHX0tJTkRfSU5UOgorICAgICAgcmV0dXJuIHQxLT51LmtpbnQgPT0gdDItPnUua2ludDsKKyAgICB9CisKKyAgLyogV2UgaGF2ZSB0byBhdm9pZCBhbiBpbmZpbml0ZSByZWN1cnNpb24uICBXZSBkbyB0aGlzIGJ5IGtlZXBpbmcgYQorICAgICBsaXN0IG9mIHR5cGVzIHdoaWNoIHdlIGFyZSBjb21wYXJpbmcuICBXZSBqdXN0IGtlZXAgdGhlIGxpc3Qgb24KKyAgICAgdGhlIHN0YWNrLiAgSWYgd2UgZW5jb3VudGVyIGEgcGFpciBvZiB0eXBlcyB3ZSBhcmUgY3VycmVudGx5CisgICAgIGNvbXBhcmluZywgd2UganVzdCBhc3N1bWUgdGhhdCB0aGV5IGFyZSBlcXVhbC4gICovCisgIGZvciAobCA9IGluZm8tPmNvbXBhcmVfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAobC0+dDEgPT0gdDEgJiYgbC0+dDIgPT0gdDIpCisJcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRvcC50MSA9IHQxOworICB0b3AudDIgPSB0MjsKKyAgdG9wLm5leHQgPSBpbmZvLT5jb21wYXJlX2xpc3Q7CisgIGluZm8tPmNvbXBhcmVfbGlzdCA9ICZ0b3A7CisKKyAgc3dpdGNoICh0MS0+a2luZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgcmV0ID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6CisgICAgY2FzZSBERUJVR19LSU5EX1VOSU9OOgorICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKKyAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6CisgICAgICBpZiAodDEtPnUua2NsYXNzID09IE5VTEwpCisJcmV0ID0gdDItPnUua2NsYXNzID09IE5VTEw7CisgICAgICBlbHNlIGlmICh0Mi0+dS5rY2xhc3MgPT0gTlVMTCkKKwlyZXQgPSBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKHQxLT51LmtjbGFzcy0+aWQgPiBpbmZvLT5iYXNlX2lkCisJICAgICAgICYmIHQxLT51LmtjbGFzcy0+aWQgPT0gdDItPnUua2NsYXNzLT5pZCkKKwlyZXQgPSB0cnVlOworICAgICAgZWxzZQorCXJldCA9IGRlYnVnX2NsYXNzX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0Mik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgorICAgICAgaWYgKHQxLT51LmtlbnVtID09IE5VTEwpCisJcmV0ID0gdDItPnUua2VudW0gPT0gTlVMTDsKKyAgICAgIGVsc2UgaWYgKHQyLT51LmtlbnVtID09IE5VTEwpCisJcmV0ID0gZmFsc2U7CisgICAgICBlbHNlCisJeworCSAgY29uc3QgY2hhciAqKnBuMSwgKipwbjI7CisJICBiZmRfc2lnbmVkX3ZtYSAqcHYxLCAqcHYyOworCisJICBwbjEgPSB0MS0+dS5rZW51bS0+bmFtZXM7CisJICBwbjIgPSB0Mi0+dS5rZW51bS0+bmFtZXM7CisJICBwdjEgPSB0MS0+dS5rZW51bS0+dmFsdWVzOworCSAgcHYyID0gdDItPnUua2VudW0tPnZhbHVlczsKKwkgIHdoaWxlICgqcG4xICE9IE5VTEwgJiYgKnBuMiAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKCoqcG4xICE9ICoqcG4yCisJCSAgfHwgKnB2MSAhPSAqcHYyCisJCSAgfHwgc3RyY21wICgqcG4xLCAqcG4yKSAhPSAwKQorCQlicmVhazsKKwkgICAgICArK3BuMTsKKwkgICAgICArK3BuMjsKKwkgICAgICArK3B2MTsKKwkgICAgICArK3B2MjsKKwkgICAgfQorCSAgcmV0ID0gKnBuMSA9PSBOVUxMICYmICpwbjIgPT0gTlVMTDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfS0lORF9QT0lOVEVSOgorICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3BvaW50ZXIsIHQyLT51Lmtwb2ludGVyKTsKKyAgICAgIGJyZWFrOworCSAgICAgCisgICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgorICAgICAgaWYgKHQxLT51LmtmdW5jdGlvbi0+dmFyYXJncyAhPSB0Mi0+dS5rZnVuY3Rpb24tPnZhcmFyZ3MKKwkgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSwKKwkJCQkgdDItPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSkKKwkgIHx8ICgodDEtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkKKwkgICAgICAhPSAodDItPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkpKQorCXJldCA9IGZhbHNlOworICAgICAgZWxzZSBpZiAodDEtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXMgPT0gTlVMTCkKKwlyZXQgPSB0cnVlOworICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCBkZWJ1Z190eXBlICoqYTEsICoqYTI7CisKKwkgIGExID0gdDEtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7CisJICBhMiA9IHQyLT51LmtmdW5jdGlvbi0+YXJnX3R5cGVzOworCSAgd2hpbGUgKCphMSAhPSBOVUxMICYmICphMiAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgKmExLCAqYTIpKQorCQlicmVhazsKKwkgICAgICArK2ExOworCSAgICAgICsrYTI7CisJICAgIH0KKwkgIHJldCA9ICphMSA9PSBOVUxMICYmICphMiA9PSBOVUxMOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19LSU5EX1JFRkVSRU5DRToKKyAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtyZWZlcmVuY2UsIHQyLT51LmtyZWZlcmVuY2UpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX0tJTkRfUkFOR0U6CisgICAgICByZXQgPSAodDEtPnUua3JhbmdlLT5sb3dlciA9PSB0Mi0+dS5rcmFuZ2UtPmxvd2VyCisJICAgICAmJiB0MS0+dS5rcmFuZ2UtPnVwcGVyID09IHQyLT51LmtyYW5nZS0+dXBwZXIKKwkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtyYW5nZS0+dHlwZSwKKwkJCQkgIHQyLT51LmtyYW5nZS0+dHlwZSkpOworCisgICAgY2FzZSBERUJVR19LSU5EX0FSUkFZOgorICAgICAgcmV0ID0gKHQxLT51LmthcnJheS0+bG93ZXIgPT0gdDItPnUua2FycmF5LT5sb3dlcgorCSAgICAgJiYgdDEtPnUua2FycmF5LT51cHBlciA9PSB0Mi0+dS5rYXJyYXktPnVwcGVyCisJICAgICAmJiB0MS0+dS5rYXJyYXktPnN0cmluZ3AgPT0gdDItPnUua2FycmF5LT5zdHJpbmdwCisJICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSwKKwkJCQkgIHQyLT51LmthcnJheS0+ZWxlbWVudF90eXBlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfS0lORF9TRVQ6CisgICAgICByZXQgPSAodDEtPnUua3NldC0+Yml0c3RyaW5ncCA9PSB0Mi0+dS5rc2V0LT5iaXRzdHJpbmdwCisJICAgICAmJiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rc2V0LT50eXBlLCB0Mi0+dS5rc2V0LT50eXBlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfS0lORF9PRkZTRVQ6CisgICAgICByZXQgPSAoZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua29mZnNldC0+YmFzZV90eXBlLAorCQkJICAgICAgIHQyLT51LmtvZmZzZXQtPmJhc2VfdHlwZSkKKwkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtvZmZzZXQtPnRhcmdldF90eXBlLAorCQkJCSAgdDItPnUua29mZnNldC0+dGFyZ2V0X3R5cGUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKKyAgICAgIGlmICh0MS0+dS5rbWV0aG9kLT52YXJhcmdzICE9IHQyLT51LmttZXRob2QtPnZhcmFyZ3MKKwkgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua21ldGhvZC0+cmV0dXJuX3R5cGUsCisJCQkJIHQyLT51LmttZXRob2QtPnJldHVybl90eXBlKQorCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSwKKwkJCQkgdDItPnUua21ldGhvZC0+ZG9tYWluX3R5cGUpCisJICB8fCAoKHQxLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQorCSAgICAgICE9ICh0Mi0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkpKQorCXJldCA9IGZhbHNlOworICAgICAgZWxzZSBpZiAodDEtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCisJcmV0ID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3QgZGVidWdfdHlwZSAqKmExLCAqKmEyOworCisJICBhMSA9IHQxLT51LmttZXRob2QtPmFyZ190eXBlczsKKwkgIGEyID0gdDItPnUua21ldGhvZC0+YXJnX3R5cGVzOworCSAgd2hpbGUgKCphMSAhPSBOVUxMICYmICphMiAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgKmExLCAqYTIpKQorCQlicmVhazsKKwkgICAgICArK2ExOworCSAgICAgICsrYTI7CisJICAgIH0KKwkgIHJldCA9ICphMSA9PSBOVUxMICYmICphMiA9PSBOVUxMOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19LSU5EX0NPTlNUOgorICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua2NvbnN0LCB0Mi0+dS5rY29uc3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX0tJTkRfVk9MQVRJTEU6CisgICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rdm9sYXRpbGUsIHQyLT51Lmt2b2xhdGlsZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKKyAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgorICAgICAgcmV0ID0gKHN0cmNtcCAodDEtPnUua25hbWVkLT5uYW1lLT5uYW1lLCB0Mi0+dS5rbmFtZWQtPm5hbWUtPm5hbWUpID09IDAKKwkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtuYW1lZC0+dHlwZSwKKwkJCQkgIHQyLT51LmtuYW1lZC0+dHlwZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGluZm8tPmNvbXBhcmVfbGlzdCA9IHRvcC5uZXh0OworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIFNlZSBpZiB0d28gY2xhc3NlcyBhcmUgdGhlIHNhbWUuICBUaGlzIGlzIGEgc3Vicm91dGluZSBvZgorICAgZGVidWdfdHlwZV9zYW1lcC4gICovCisKK3N0YXRpYyBib29sZWFuCitkZWJ1Z19jbGFzc190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpCisgICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87CisgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKKyAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOworeworICBzdHJ1Y3QgZGVidWdfY2xhc3NfdHlwZSAqYzEsICpjMjsKKworICBjMSA9IHQxLT51LmtjbGFzczsKKyAgYzIgPSB0Mi0+dS5rY2xhc3M7CisKKyAgaWYgKChjMS0+ZmllbGRzID09IE5VTEwpICE9IChjMi0+ZmllbGRzID09IE5VTEwpCisgICAgICB8fCAoYzEtPmJhc2VjbGFzc2VzID09IE5VTEwpICE9IChjMi0+YmFzZWNsYXNzZXMgPT0gTlVMTCkKKyAgICAgIHx8IChjMS0+bWV0aG9kcyA9PSBOVUxMKSAhPSAoYzItPm1ldGhvZHMgPT0gTlVMTCkKKyAgICAgIHx8IChjMS0+dnB0cmJhc2UgPT0gTlVMTCkgIT0gKGMyLT52cHRyYmFzZSA9PSBOVUxMKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGMxLT5maWVsZHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgZGVidWdfZmllbGQgKipwZjEsICoqcGYyOworCisgICAgICBmb3IgKHBmMSA9IGMxLT5maWVsZHMsIHBmMiA9IGMyLT5maWVsZHM7CisJICAgKnBmMSAhPSBOVUxMICYmICpwZjIgIT0gTlVMTDsKKwkgICBwZjErKywgcGYyKyspCisJeworCSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmMSwgKmYyOworCisJICBmMSA9ICpwZjE7CisJICBmMiA9ICpwZjI7CisJICBpZiAoZjEtPm5hbWVbMF0gIT0gZjItPm5hbWVbMF0KKwkgICAgICB8fCBmMS0+dmlzaWJpbGl0eSAhPSBmMi0+dmlzaWJpbGl0eQorCSAgICAgIHx8IGYxLT5zdGF0aWNfbWVtYmVyICE9IGYyLT5zdGF0aWNfbWVtYmVyKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoZjEtPnN0YXRpY19tZW1iZXIpCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wIChmMS0+dS5zLnBoeXNuYW1lLCBmMi0+dS5zLnBoeXNuYW1lKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChmMS0+dS5mLmJpdHBvcyAhPSBmMi0+dS5mLmJpdHBvcworCQkgIHx8IGYxLT51LmYuYml0c2l6ZSAhPSBmMi0+dS5mLmJpdHNpemUpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgLyogV2UgZG8gdGhlIGNoZWNrcyB3aGljaCByZXF1aXJlIGZ1bmN0aW9uIGNhbGxzIGxhc3QuICBXZQorICAgICAgICAgICAgIGRvbid0IHJlcXVpcmUgdGhhdCB0aGUgdHlwZXMgb2YgZmllbGRzIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgICAgICBuYW1lcywgc2luY2UgdGhhdCBzb21ldGltZXMgZmFpbHMgaW4gdGhlIHByZXNlbmNlIG9mCisgICAgICAgICAgICAgdHlwZWRlZnMgYW5kIHdlIHJlYWxseSBkb24ndCBjYXJlLiAgKi8KKwkgIGlmIChzdHJjbXAgKGYxLT5uYW1lLCBmMi0+bmFtZSkgIT0gMAorCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywKKwkJCQkgICAgIGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sCisJCQkJCQkJICBmMS0+dHlwZSwgTlVMTCksCisJCQkJICAgICBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLAorCQkJCQkJCSAgZjItPnR5cGUsIE5VTEwpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmICgqcGYxICE9IE5VTEwgfHwgKnBmMiAhPSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGMxLT52cHRyYmFzZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIGMxLT52cHRyYmFzZSwgYzItPnZwdHJiYXNlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChjMS0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICoqcGIxLCAqKnBiMjsKKworICAgICAgZm9yIChwYjEgPSBjMS0+YmFzZWNsYXNzZXMsIHBiMiA9IGMyLT5iYXNlY2xhc3NlczsKKwkgICAqcGIxICE9IE5VTEwgJiYgKnBiMiAhPSBOVUxMOworCSAgICsrcGIxLCArK3BiMikKKwl7CisJICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpiMSwgKmIyOworCisJICBiMSA9ICpwYjE7CisJICBiMiA9ICpwYjI7CisJICBpZiAoYjEtPmJpdHBvcyAhPSBiMi0+Yml0cG9zCisJICAgICAgfHwgYjEtPnZpcnR1YWwgIT0gYjItPnZpcnR1YWwKKwkgICAgICB8fCBiMS0+dmlzaWJpbGl0eSAhPSBiMi0+dmlzaWJpbGl0eQorCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgYjEtPnR5cGUsIGIyLT50eXBlKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGlmICgqcGIxICE9IE5VTEwgfHwgKnBiMiAhPSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGMxLT5tZXRob2RzICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGRlYnVnX21ldGhvZCAqKnBtMSwgKipwbTI7CisKKyAgICAgIGZvciAocG0xID0gYzEtPm1ldGhvZHMsIHBtMiA9IGMyLT5tZXRob2RzOworCSAgICpwbTEgIT0gTlVMTCAmJiAqcG0yICE9IE5VTEw7CisJICAgKytwbTEsICsrcG0yKQorCXsKKwkgIHN0cnVjdCBkZWJ1Z19tZXRob2QgKm0xLCAqbTI7CisKKwkgIG0xID0gKnBtMTsKKwkgIG0yID0gKnBtMjsKKwkgIGlmIChtMS0+bmFtZVswXSAhPSBtMi0+bmFtZVswXQorCSAgICAgIHx8IHN0cmNtcCAobTEtPm5hbWUsIG0yLT5uYW1lKSAhPSAwCisJICAgICAgfHwgKG0xLT52YXJpYW50cyA9PSBOVUxMKSAhPSAobTItPnZhcmlhbnRzID09IE5VTEwpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAobTEtPnZhcmlhbnRzID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKipwdjEsICoqcHYyOworCisJICAgICAgZm9yIChwdjEgPSBtMS0+dmFyaWFudHMsIHB2MiA9IG0yLT52YXJpYW50czsKKwkJICAgKnB2MSAhPSBOVUxMICYmICpwdjIgIT0gTlVMTDsKKwkJICAgKytwdjEsICsrcHYyKQorCQl7CisJCSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICp2MSwgKnYyOworCisJCSAgdjEgPSAqcHYxOworCQkgIHYyID0gKnB2MjsKKwkJICBpZiAodjEtPnBoeXNuYW1lWzBdICE9IHYyLT5waHlzbmFtZVswXQorCQkgICAgICB8fCB2MS0+dmlzaWJpbGl0eSAhPSB2Mi0+dmlzaWJpbGl0eQorCQkgICAgICB8fCB2MS0+Y29uc3RwICE9IHYyLT5jb25zdHAKKwkJICAgICAgfHwgdjEtPnZvbGF0aWxlcCAhPSB2Mi0+dm9sYXRpbGVwCisJCSAgICAgIHx8IHYxLT52b2Zmc2V0ICE9IHYyLT52b2Zmc2V0CisJCSAgICAgIHx8ICh2MS0+Y29udGV4dCA9PSBOVUxMKSAhPSAodjItPmNvbnRleHQgPT0gTlVMTCkKKwkJICAgICAgfHwgc3RyY21wICh2MS0+cGh5c25hbWUsIHYyLT5waHlzbmFtZSkgIT0gMAorCQkgICAgICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHYxLT50eXBlLCB2Mi0+dHlwZSkpCisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgaWYgKHYxLT5jb250ZXh0ICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGlmICghIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHYxLT5jb250ZXh0LAorCQkJCQkgICAgICB2Mi0+Y29udGV4dCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCX0KKwkgICAgICBpZiAoKnB2MSAhPSBOVUxMIHx8ICpwdjIgIT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgaWYgKCpwbTEgIT0gTlVMTCB8fCAqcG0yICE9IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlYnVnLmggYi9iaW51dGlscy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODkwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9kZWJ1Zy5oCkBAIC0wLDAgKzEsNzk4IEBACisvKiBkZWJ1Zy5oIC0tIERlc2NyaWJlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgREVCVUdfSAorI2RlZmluZSBERUJVR19ICisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgZGVzY3JpYmVzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgorICAgV2UgbWF5IGV2ZW50dWFsbHkgaGF2ZSByZWFkZXJzIHdoaWNoIGNvbnZlcnQgZGlmZmVyZW50IGZvcm1hdHMgaW50bworICAgdGhpcyBnZW5lcmljIGZvcm1hdCwgYW5kIHdyaXRlcnMgd2hpY2ggd3JpdGUgaXQgb3V0LiAgVGhlIGluaXRpYWwKKyAgIGltcGV0dXMgZm9yIHRoaXMgd2FzIHdyaXRpbmcgYSBjb252ZXJ0b3IgZnJvbSBzdGFicyB0byBIUCBJRUVFLTY5NQorICAgZGVidWdnaW5nIGZvcm1hdC4gICovCisKKy8qIERpZmZlcmVudCBraW5kcyBvZiB0eXBlcy4gICovCisKK2VudW0gZGVidWdfdHlwZV9raW5kCit7CisgIC8qIE5vdCB1c2VkLiAgKi8KKyAgREVCVUdfS0lORF9JTExFR0FMLAorICAvKiBJbmRpcmVjdCB2aWEgYSBwb2ludGVyLiAgKi8KKyAgREVCVUdfS0lORF9JTkRJUkVDVCwKKyAgLyogVm9pZC4gICovCisgIERFQlVHX0tJTkRfVk9JRCwKKyAgLyogSW50ZWdlci4gICovCisgIERFQlVHX0tJTkRfSU5ULAorICAvKiBGbG9hdGluZyBwb2ludC4gICovCisgIERFQlVHX0tJTkRfRkxPQVQsCisgIC8qIENvbXBsZXguICAqLworICBERUJVR19LSU5EX0NPTVBMRVgsCisgIC8qIEJvb2xlYW4uICAqLworICBERUJVR19LSU5EX0JPT0wsCisgIC8qIFN0cnVjdC4gICovCisgIERFQlVHX0tJTkRfU1RSVUNULAorICAvKiBVbmlvbi4gICovCisgIERFQlVHX0tJTkRfVU5JT04sCisgIC8qIENsYXNzLiAgKi8KKyAgREVCVUdfS0lORF9DTEFTUywKKyAgLyogVW5pb24gY2xhc3MgKGNhbiB0aGlzIHJlYWxseSBoYXBwZW4/KS4gICovCisgIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MsCisgIC8qIEVudW1lcmF0aW9uIHR5cGUuICAqLworICBERUJVR19LSU5EX0VOVU0sCisgIC8qIFBvaW50ZXIuICAqLworICBERUJVR19LSU5EX1BPSU5URVIsCisgIC8qIEZ1bmN0aW9uLiAgKi8KKyAgREVCVUdfS0lORF9GVU5DVElPTiwKKyAgLyogUmVmZXJlbmNlLiAgKi8KKyAgREVCVUdfS0lORF9SRUZFUkVOQ0UsCisgIC8qIFJhbmdlLiAgKi8KKyAgREVCVUdfS0lORF9SQU5HRSwKKyAgLyogQXJyYXkuICAqLworICBERUJVR19LSU5EX0FSUkFZLAorICAvKiBTZXQuICAqLworICBERUJVR19LSU5EX1NFVCwKKyAgLyogQmFzZWQgcG9pbnRlci4gICovCisgIERFQlVHX0tJTkRfT0ZGU0VULAorICAvKiBNZXRob2QuICAqLworICBERUJVR19LSU5EX01FVEhPRCwKKyAgLyogQ29uc3QgcXVhbGlmaWVkIHR5cGUuICAqLworICBERUJVR19LSU5EX0NPTlNULAorICAvKiBWb2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCisgIERFQlVHX0tJTkRfVk9MQVRJTEUsCisgIC8qIE5hbWVkIHR5cGUuICAqLworICBERUJVR19LSU5EX05BTUVELAorICAvKiBUYWdnZWQgdHlwZS4gICovCisgIERFQlVHX0tJTkRfVEFHR0VECit9OworCisvKiBEaWZmZXJlbnQga2luZHMgb2YgdmFyaWFibGVzLiAgKi8KKworZW51bSBkZWJ1Z192YXJfa2luZAoreworICAvKiBOb3QgdXNlZC4gICovCisgIERFQlVHX1ZBUl9JTExFR0FMLAorICAvKiBBIGdsb2JhbCB2YXJpYWJsZS4gICovCisgIERFQlVHX0dMT0JBTCwKKyAgLyogQSBzdGF0aWMgdmFyaWFibGUuICAqLworICBERUJVR19TVEFUSUMsCisgIC8qIEEgbG9jYWwgc3RhdGljIHZhcmlhYmxlLiAgKi8KKyAgREVCVUdfTE9DQUxfU1RBVElDLAorICAvKiBBIGxvY2FsIHZhcmlhYmxlLiAgKi8KKyAgREVCVUdfTE9DQUwsCisgIC8qIEEgcmVnaXN0ZXIgdmFyaWFibGUuICAqLworICBERUJVR19SRUdJU1RFUgorfTsKKworLyogRGlmZmVyZW50IGtpbmRzIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLworCitlbnVtIGRlYnVnX3Bhcm1fa2luZAoreworICAvKiBOb3QgdXNlZC4gICovCisgIERFQlVHX1BBUk1fSUxMRUdBTCwKKyAgLyogQSBzdGFjayBiYXNlZCBwYXJhbWV0ZXIuICAqLworICBERUJVR19QQVJNX1NUQUNLLAorICAvKiBBIHJlZ2lzdGVyIHBhcmFtZXRlci4gICovCisgIERFQlVHX1BBUk1fUkVHLAorICAvKiBBIHN0YWNrIGJhc2VkIHJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLworICBERUJVR19QQVJNX1JFRkVSRU5DRSwKKyAgLyogQSByZWdpc3RlciByZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KKyAgREVCVUdfUEFSTV9SRUZfUkVHCit9OworCisvKiBEaWZmZXJlbnQga2luZHMgb2YgdmlzaWJpbGl0eS4gICovCisKK2VudW0gZGVidWdfdmlzaWJpbGl0eQoreworICAvKiBBIHB1YmxpYyBmaWVsZCAoZS5nLiwgYSBmaWVsZCBpbiBhIEMgc3RydWN0KS4gICovCisgIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDLAorICAvKiBBIHByb3RlY3RlZCBmaWVsZC4gICovCisgIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVELAorICAvKiBBIHByaXZhdGUgZmllbGQuICAqLworICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUsCisgIC8qIEEgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQuICAqLworICBERUJVR19WSVNJQklMSVRZX0lHTk9SRQorfTsKKworLyogQSB0eXBlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfdHlwZTsKKworI2RlZmluZSBERUJVR19UWVBFX05VTEwgKChkZWJ1Z190eXBlKSBOVUxMKQorCisvKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGVidWdfZmllbGQgKmRlYnVnX2ZpZWxkOworCisjZGVmaW5lIERFQlVHX0ZJRUxEX05VTEwgKChkZWJ1Z19maWVsZCkgTlVMTCkKKworLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLworCit0eXBlZGVmIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmRlYnVnX2Jhc2VjbGFzczsKKworI2RlZmluZSBERUJVR19CQVNFQ0xBU1NfTlVMTCAoKGRlYnVnX2Jhc2VjbGFzcykgTlVMTCkKKworLyogQSBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGVidWdfbWV0aG9kICpkZWJ1Z19tZXRob2Q7CisKKyNkZWZpbmUgREVCVUdfTUVUSE9EX05VTEwgKChkZWJ1Z19tZXRob2QpIE5VTEwpCisKKy8qIFRoZSBhcmd1bWVudHMgdG8gYSBtZXRob2QgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LiAgVGhlc2UgaW5kaWNhdGUKKyAgIHdoaWNoIG1ldGhvZCB0byBydW4uICAqLworCit0eXBlZGVmIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqZGVidWdfbWV0aG9kX3ZhcmlhbnQ7CisKKyNkZWZpbmUgREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCAoKGRlYnVnX21ldGhvZF92YXJpYW50KSBOVUxMKQorCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gZGVidWdfd3JpdGUuICBJdCBob2xkcyBmdW5jdGlvbgorICAgcG9pbnRlcnMgdGhhdCBkZWJ1Z193cml0ZSB3aWxsIGNhbGwgYmFzZWQgb24gdGhlIGFjY3VtdWxhdGVkCisgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zCit7CisgIC8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIG5ldyBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlCisgICAgIG5hbWUgb2YgdGhlIG1haW4gZmlsZSBpbiB0aGUgbmV3IHVuaXQuICAqLworICBib29sZWFuICgqc3RhcnRfY29tcGlsYXRpb25fdW5pdCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKKworICAvKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB3aXRoaW4gYQorICAgICBjb21waWxhdGlvbiB1bml0LCBiZWZvcmUgb3V0cHV0dGluZyBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGZvcgorICAgICB0aGF0IGZpbGUuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLworICBib29sZWFuICgqc3RhcnRfc291cmNlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworCisgIC8qIEVhY2ggd3JpdGVyIG11c3Qga2VlcCBhIHN0YWNrIG9mIHR5cGVzLiAgKi8KKworICAvKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgdHlwZSBjYW4gYXBwZWFyIGlmCisgICAgIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGljaCBpcyBuZXZlciBkZWZpbmVkLiAgKi8KKyAgYm9vbGVhbiAoKmVtcHR5X3R5cGUpIFBBUkFNUyAoKFBUUikpOworCisgIC8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisgIGJvb2xlYW4gKCp2b2lkX3R5cGUpIFBBUkFNUyAoKFBUUikpOworCisgIC8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplIGFuZAorICAgICB3aGV0aGVyIGl0IGlzIHVuc2lnbmVkLiAgKi8KKyAgYm9vbGVhbiAoKmludF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOworCisgIC8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KKyAgYm9vbGVhbiAoKmZsb2F0X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CisKKyAgLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCisgIGJvb2xlYW4gKCpjb21wbGV4X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CisKKyAgLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCisgIGJvb2xlYW4gKCpib29sX3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CisKKyAgLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHRhZywgYSBOVUxMCisgICAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbmFtZXMgYW5kIHRoZSBhc3NvY2lhdGVkIHZhbHVlcy4gIElmIHRoZXJlIGlzCisgICAgIG5vIHRhZywgdGhlIHRhZyBhcmd1bWVudCB3aWxsIGJlIE5VTEwuICBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZAorICAgICBlbnVtLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBhcmd1bWVudHMgd2lsbCBiZSBOVUxMLiAgKi8KKyAgYm9vbGVhbiAoKmVudW1fdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCisJCQkJYmZkX3NpZ25lZF92bWEgKikpOworCisgIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcG9pbnRlciB0byB0aGF0CisgICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisgIGJvb2xlYW4gKCpwb2ludGVyX3R5cGUpIFBBUkFNUyAoKFBUUikpOworCisgIC8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgc2Vjb25kIGFyZ3VtZW50CisgICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHR5cGVzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvCisgICAgIHRoZSBzdGFjay4gIElmIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXMgaXMgcGFzc2VkIGFzIC0xLCB0aGVuCisgICAgIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZnVuY3Rpb24gYXJlIHVua25vd24sIGFuZCBubyB0eXBlcyBoYXZlCisgICAgIGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlCisgICAgIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSByZXR1cm4gdHlwZQorICAgICBvZiB0aGUgZnVuY3Rpb24gaXMgcHVzaGVkIG9udG8gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGFyZ3VtZW50CisgICAgIHR5cGVzLCBpZiBhbnkuICAqLworICBib29sZWFuICgqZnVuY3Rpb25fdHlwZSkgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKKworICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHJlZmVyZW5jZSB0byB0aGF0CisgICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisgIGJvb2xlYW4gKCpyZWZlcmVuY2VfdHlwZSkgUEFSQU1TICgoUFRSKSk7CisKKyAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSByYW5nZSBvZiB0aGF0IHR5cGUKKyAgICAgd2l0aCB0aGUgZ2l2ZW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KKyAgYm9vbGVhbiAoKnJhbmdlX3R5cGUpIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7CisKKyAgLyogUHVzaCBhbiBhcnJheSB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlIHR5cGUKKyAgICAgc3RhY2sgaXMgdGhlIHJhbmdlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZSBzdGFjayBpcyB0aGUKKyAgICAgZWxlbWVudCB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIGFycmF5IHR5cGUgaXMKKyAgICAgcHVzaGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGxvd2VyIGJvdW5kLCB0aGUgdXBwZXIgYm91bmQsIGFuZAorICAgICB3aGV0aGVyIHRoZSBhcnJheSBpcyBhIHN0cmluZy4gICovCisgIGJvb2xlYW4gKCphcnJheV90eXBlKSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwKKwkJCQkgYm9vbGVhbikpOworCisgIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgc2V0IG9mIHRoYXQgdHlwZQorICAgICBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgc2V0IGlzCisgICAgIGEgYml0c3RyaW5nLiAgKi8KKyAgYm9vbGVhbiAoKnNldF90eXBlKSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKKworICAvKiBQdXNoIGFuIG9mZnNldCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlCisgICAgIHR5cGUgc3RhY2sgaXMgdGhlIHRhcmdldCB0eXBlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZQorICAgICBzdGFjayBpcyB0aGUgYmFzZSB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIG9mZnNldAorICAgICB0eXBlIGlzIHB1c2hlZC4gICovCisgIGJvb2xlYW4gKCpvZmZzZXRfdHlwZSkgUEFSQU1TICgoUFRSKSk7CisKKyAgLyogUHVzaCBhIG1ldGhvZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgIGlzIHRydWUsIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZQorICAgICBtZXRob2QgYmVsb25nczsgb3RoZXJ3aXNlLCB0aGUgY2xhc3MgbXVzdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICBjbGFzcyB0byB3aGljaCB0aGUgbWV0aG9kIGlzIGF0dGFjaGVkLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZQorICAgICBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXM7IHRoZXNlIGFyZSBwdXNoZWQgb250byB0aGUgdHlwZSBzdGFjayBpbgorICAgICByZXZlcnNlIG9yZGVyICh0aGUgZmlyc3QgdHlwZSBwb3BwZWQgaXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlCisgICAgIG1ldGhvZCkuICBBIHZhbHVlIG9mIC0xIGZvciB0aGUgdGhpcmQgYXJndW1lbnQgbWVhbnMgdGhhdCBubworICAgICBhcmd1bWVudCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUKKyAgICAgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSBuZXh0CisgICAgIHR5cGUgb24gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IHR5cGVzIGlzCisgICAgIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kLiAgQWxsIHRoZXNlIHR5cGVzIG11c3QgYmUgcG9wcGVkLAorICAgICBhbmQgdGhlbiB0aGUgbWV0aG9kIHR5cGUgbXVzdCBiZSBwdXNoZWQuICAqLworICBib29sZWFuICgqbWV0aG9kX3R5cGUpIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7CisKKyAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgY29uc3QgcXVhbGlmaWVkCisgICAgIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLworICBib29sZWFuICgqY29uc3RfdHlwZSkgUEFSQU1TICgoUFRSKSk7CisKKyAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgdm9sYXRpbGUKKyAgICAgcXVhbGlmaWVkIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLworICBib29sZWFuICgqdm9sYXRpbGVfdHlwZSkgUEFSQU1TICgoUFRSKSk7CisKKyAgLyogU3RhcnQgYnVpbGRpbmcgYSBzdHJ1Y3QuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHRoZQorICAgICBzdHJ1Y3RfZmllbGQgZnVuY3Rpb24sIGFuZCBmaW5pc2hlZCBieSBhIGNhbGwgdG8gdGhlCisgICAgIGVuZF9zdHJ1Y3RfdHlwZSBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHRhZzsgdGhpcworICAgICB3aWxsIGJlIE5VTEwgaWYgdGhlcmUgaXNuJ3Qgb25lLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBOVUxMLAorICAgICB0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBjb25zdGFudCBpZGVudGlmeWluZyB0aGlzIHN0cnVjdCBmb3IgdXNlCisgICAgIHdpdGggdGFnX3R5cGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LCBmYWxzZQorICAgICBmb3IgYSB1bmlvbi4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZS4gIElmIHRoaXMgaXMgYW4KKyAgICAgdW5kZWZpbmVkIHN0cnVjdCBvciB1bmlvbiwgdGhlIHNpemUgd2lsbCBiZSAwIGFuZCBzdHJ1Y3RfZmllbGQKKyAgICAgd2lsbCBub3QgYmUgY2FsbGVkIGJlZm9yZSBlbmRfc3RydWN0X3R5cGUgaXMgY2FsbGVkLiAgKi8KKyAgYm9vbGVhbiAoKnN0YXJ0X3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAorCQkJCQlib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKKworICAvKiBBZGQgYSBmaWVsZCB0byB0aGUgc3RydWN0IHR5cGUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlIHR5cGUKKyAgICAgb2YgdGhlIGZpZWxkIHNob3VsZCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cworICAgICBhcmUgdGhlIG5hbWUsIHRoZSBiaXQgcG9zaXRpb24sIHRoZSBiaXQgc2l6ZSAobWF5IGJlIHplcm8gaWYgdGhlCisgICAgIGZpZWxkIGlzIG5vdCBwYWNrZWQpLCBhbmQgdGhlIHZpc2liaWxpdHkuICAqLworICBib29sZWFuICgqc3RydWN0X2ZpZWxkKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwKKwkJCQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKKworICAvKiBGaW5pc2ggYnVpbGRpbmcgYSBzdHJ1Y3QsIGFuZCBwdXNoIGl0IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLworICBib29sZWFuICgqZW5kX3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIpKTsKKworICAvKiBTdGFydCBidWlsZGluZyBhIGNsYXNzLiAgVGhpcyBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBzZXZlcmFsCisgICAgIGZ1bmN0aW9uczogc3RydWN0X2ZpZWxkLCBjbGFzc19zdGF0aWNfbWVtYmVyLCBjbGFzc19iYXNlY2xhc3MsCisgICAgIGNsYXNzX3N0YXJ0X21ldGhvZCwgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCisgICAgIGNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwgYW5kIGNsYXNzX2VuZF9tZXRob2QuICBUaGUgY2xhc3MgaXMKKyAgICAgZmluaXNoZWQgYnkgYSBjYWxsIHRvIGVuZF9jbGFzc190eXBlLiAgVGhlIGZpcnN0IGZpdmUgYXJndW1lbnRzCisgICAgIGFyZSB0aGUgc2FtZSBhcyBmb3Igc3RhcnRfc3RydWN0X3R5cGUuICBUaGUgc2l4dGggYXJndW1lbnQgaXMKKyAgICAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZpcnR1YWwgZnVuY3Rpb24gdGFibGU7IGlmIHRoZXJlIGlzLCB0aGUKKyAgICAgc2V2ZW50aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGNhbiBiZQorICAgICBmb3VuZCBpbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCBpcyBmYWxzZSBpZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0CisgICAgIGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgc2hvdWxkIGJlIHBvcHBlZCBmcm9tIHRoZSB0eXBlCisgICAgIHN0YWNrLiAgKi8KKyAgYm9vbGVhbiAoKnN0YXJ0X2NsYXNzX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkJICAgICAgIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKKwkJCQkgICAgICAgYm9vbGVhbikpOworCisgIC8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZQorICAgICBhcmd1bWVudHMgYXJlIHRoZSBmaWVsZCBuYW1lLCB0aGUgcGh5c2ljYWwgbmFtZSwgYW5kIHRoZQorICAgICB2aXNpYmlsaXR5LiAgVGhlIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KKyAgYm9vbGVhbiAoKmNsYXNzX3N0YXRpY19tZW1iZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7CisgIAorICAvKiBBZGQgYSBiYXNlY2xhc3MgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZSB0eXBlIG9mCisgICAgIHRoZSBiYXNlY2xhc3MgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cworICAgICBhcmUgdGhlIGJpdCBwb3NpdGlvbiwgd2hldGhlciB0aGUgY2xhc3MgaXMgdmlydHVhbCwgYW5kIHRoZQorICAgICB2aXNpYmlsaXR5LiAgKi8KKyAgYm9vbGVhbiAoKmNsYXNzX2Jhc2VjbGFzcykgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLAorCQkJCSAgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOworCisgIC8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhpcworICAgICBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBjbGFzc19tZXRob2RfdmFyaWFudCBhbmQKKyAgICAgY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IHRvIGRlc2NyaWJlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKKyAgICAgbWV0aG9kIHdoaWNoIHRha2UgZGlmZmVyZW50IGFyZ3VtZW50cy4gIFRoZSBtZXRob2QgaXMgZmluaXNoZWQKKyAgICAgd2l0aCBhIGNhbGwgdG8gY2xhc3NfZW5kX21ldGhvZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbWV0aG9kCisgICAgIG5hbWUuICAqLworICBib29sZWFuICgqY2xhc3Nfc3RhcnRfbWV0aG9kKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworCisgIC8qIERlc2NyaWJlIGEgdmFyaWFudCB0byB0aGUgY2xhc3MgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBidWlsdC4KKyAgICAgVGhlIHR5cGUgb2YgdGhlIHZhcmlhbnQgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlCisgICAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGUKKyAgICAgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgdGhlIHZpc2liaWxpdHksIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMKKyAgICAgY29uc3QsIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMgdm9sYXRpbGUsIHRoZSBvZmZzZXQgaW4gdGhlIHZpcnR1YWwKKyAgICAgZnVuY3Rpb24gdGFibGUsIGFuZCB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIG9uIHRoZSB0eXBlIHN0YWNrCisgICAgIChiZWxvdyB0aGUgdmFyaWFudCB0eXBlKS4gICovCisgIGJvb2xlYW4gKCpjbGFzc19tZXRob2RfdmFyaWFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCisJCQkJCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKKwkJCQkJICAgYm9vbGVhbiwgYm9vbGVhbiwKKwkJCQkJICAgYmZkX3ZtYSwgYm9vbGVhbikpOworCisgIC8qIERlc2NyaWJlIGEgc3RhdGljIHZhcmlhbnQgdG8gdGhlIGNsYXNzIG1ldGhvZCBjdXJyZW50bHkgYmVpbmcKKyAgICAgYnVpbHQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCisgICAgIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmd1bWVudHMgYXJlIG9taXR0ZWQuICBUaGUgdHlwZSBvZiB0aGUKKyAgICAgdmFyaWFudCBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLworICBib29sZWFuICgqY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKKwkJCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAorCQkJCQkJICBib29sZWFuLCBib29sZWFuKSk7CisKKyAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcyBtZXRob2QuICAqLworICBib29sZWFuICgqY2xhc3NfZW5kX21ldGhvZCkgUEFSQU1TICgoUFRSKSk7CisKKyAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcywgYW5kIHB1c2ggaXQgb250byB0aGUgdHlwZSBzdGFjay4gICovCisgIGJvb2xlYW4gKCplbmRfY2xhc3NfdHlwZSkgUEFSQU1TICgoUFRSKSk7CisKKyAgLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHdoaWNoIHdhcyBnaXZlbiBhIG5hbWUgYnkgYW4gZWFybGllcgorICAgICBjYWxsIHRvIHR5cGRlZi4gICovCisgIGJvb2xlYW4gKCp0eXBlZGVmX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CisKKyAgLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9uIHRoZSBzdGFjayB3aGljaCB3YXMgZGVmaW5lZCBlYXJsaWVyLiAgSWYKKyAgICAgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkgYSBjYWxsCisgICAgIHRvIHRhZy4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkKKyAgICAgYSBjYWxsIHRvIHN0YXJ0X3N0cnVjdF90eXBlIG9yIHN0YXJ0X2NsYXNzX3R5cGUgd2l0aCBhIHRhZyBvZgorICAgICBOVUxMIGFuZCB0aGUgbnVtYmVyIG9mIHRoZSB0aGlyZCBhcmd1bWVudC4gIEVpdGhlciB3YXksIHRoZQorICAgICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHRhZyBraW5kLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZAorICAgICBmb3IgYSBzdHJ1Y3QgKGNsYXNzKSBiZWluZyBkZWZpbmVkLCBpbiBiZXR3ZWVuIHRoZSBjYWxsIHRvCisgICAgIHN0YXJ0X3N0cnVjdF90eXBlIChzdGFydF9jbGFzc190eXBlKSBhbmQgdGhlIGNhbGwgdG8KKyAgICAgZW5kX3N0cnVjdF90eXBlIChlbmRfY2xhc3NfdHlwZSkuICAqLworICBib29sZWFuICgqdGFnX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkgICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKKworICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCB0eXBlZGVmIGl0IHRvIHRoZSBnaXZlbiBuYW1lLiAgKi8KKyAgYm9vbGVhbiAoKnR5cGRlZikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKKworICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCBkZWNsYXJlIGl0IGFzIGEgdGFnZ2VkIHN0cnVjdCBvciB1bmlvbiBvcgorICAgICBlbnVtIG9yIHdoYXRldmVyLiAgVGhlIHRhZyBwYXNzZWQgZG93biBoZXJlIGlzIHJlZHVuZGFudCwgc2luY2UKKyAgICAgd2FzIGFsc28gcGFzc2VkIHdoZW4gZW51bV90eXBlLCBzdGFydF9zdHJ1Y3RfdHlwZSwgb3IKKyAgICAgc3RhcnRfY2xhc3NfdHlwZSB3YXMgY2FsbGVkLiAgKi8KKyAgYm9vbGVhbiAoKnRhZykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKKworICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KKyAgYm9vbGVhbiAoKmludF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKKworICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCisgIGJvb2xlYW4gKCpmbG9hdF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOworCisgIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHR5cGVkIGludGVnZXIgY29uc3RhbnQuICBUaGUgdHlwZSBpcworICAgICBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KKyAgYm9vbGVhbiAoKnR5cGVkX2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOworCisgIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHZhcmlhYmxlLiAgVGhlIHR5cGUgaXMgcG9wcGVkIG9mZiB0aGUKKyAgICAgdHlwZSBzdGFjay4gICovCisgIGJvb2xlYW4gKCp2YXJpYWJsZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsCisJCQkgICAgICAgYmZkX3ZtYSkpOworCisgIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgZnVuY3Rpb24uICBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmCisgICAgIHRoZSBzdGFjay4gIFRoZSBib29sZWFuIGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbC4gIFRoaXMKKyAgICAgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gZnVuY3Rpb25fcGFyYW1ldGVyLCBmb2xsb3dlZCBieSBibG9jaworICAgICBpbmZvcm1hdGlvbi4gICovCisgIGJvb2xlYW4gKCpzdGFydF9mdW5jdGlvbikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKKworICAvKiBSZWNvcmQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIHR5cGUKKyAgICAgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjay4gICovCisgIGJvb2xlYW4gKCpmdW5jdGlvbl9wYXJhbWV0ZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAorCQkJCQkgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKKworICAvKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRvcCBsZXZlbCBibG9jaworICAgICBwZXIgZnVuY3Rpb24uICBCbG9ja3MgbWF5IGJlIG5lc3RlZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUKKyAgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgYmxvY2suICAqLworICBib29sZWFuICgqc3RhcnRfYmxvY2spIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOworCisgIC8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBlbmRpbmcgYWRkcmVzcworICAgICBvZiB0aGUgYmxvY2suICAqLworICBib29sZWFuICgqZW5kX2Jsb2NrKSBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKKworICAvKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCisgIGJvb2xlYW4gKCplbmRfZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOworCisgIC8qIFJlY29yZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCisgIGJvb2xlYW4gKCpsaW5lbm8pIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Cit9OworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMuICAqLworCisvKiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgYSBoYW5kbGUuICBUaGlzCisgICBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIGRlYnVnX2luaXQgZnVuY3Rpb24uICBUaGUgcHVycG9zZSBvZiB0aGUKKyAgIGhhbmRsZSBpcyB0byBwZXJtaXQgdGhlIGRlYnVnZ2luZyByb3V0aW5lcyB0byBub3QgdXNlIHN0YXRpYworICAgdmFyaWFibGVzLCBhbmQgaGVuY2UgdG8gYmUgcmVlbnRyYW50LiAgVGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEKKyAgIHByb2dyYW0gd2hpY2ggd2FudGVkIHRvIGhhbmRsZSB0d28gZXhlY3V0YWJsZXMgc2ltdWx0YW5lb3VzbHkuICAqLworCisvKiBSZXR1cm4gYSBkZWJ1Z2dpbmcgaGFuZGxlLiAgKi8KKworZXh0ZXJuIFBUUiBkZWJ1Z19pbml0IFBBUkFNUyAoKHZvaWQpKTsKKworLyogU2V0IHRoZSBzb3VyY2UgZmlsZW5hbWUuICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgbmV3IGNvbXBpbGF0aW9uCisgICB1bml0LiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfc2V0X2ZpbGVuYW1lIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CisKKy8qIENoYW5nZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGdpdmVuIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZCBmb3IKKyAgIGluY2x1ZGUgZmlsZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCisKK2V4dGVybiBib29sZWFuIGRlYnVnX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworCisvKiBSZWNvcmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIGZ1bmN0aW9uCisgICBibG9jay4gIFRoZSBkZWJ1Z190eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCisgICBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZS4KKyAgIFRoZSBiZmRfdm1hIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBDdXJyZW50bHkKKyAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHNwZWNpZmllZCBieSBjYWxscyB0bworICAgZGVidWdfcmVjb3JkX3BhcmFtZXRlci4gICovCisKK2V4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9mdW5jdGlvbgorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYm9vbGVhbiwgYmZkX3ZtYSkpOworCisvKiBSZWNvcmQgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3BhcmFtZXRlcgorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKKworLyogRW5kIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUKKyAgIGZ1bmN0aW9uIGVuZHMuICAqLworCitleHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7CisKKy8qIFN0YXJ0IGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIEFsbCBsb2NhbCBpbmZvcm1hdGlvbiB3aWxsIGJlCisgICByZWNvcmRlZCBpbiB0aGlzIGJsb2NrLCB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0byBkZWJ1Z19lbmRfYmxvY2suCisgICBkZWJ1Z19zdGFydF9ibG9jayBhbmQgZGVidWdfZW5kX2Jsb2NrIG1heSBiZSBuZXN0ZWQuICBUaGUgYXJndW1lbnQKKyAgIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7CisKKy8qIEZpbmlzaCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBUaGlzIG1hdGNoZXMgdGhlIGNhbGwgdG8KKyAgIGRlYnVnX3N0YXJ0X2Jsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sKKyAgIGVuZHMuICAqLworCitleHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7CisKKy8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdpdGggYSBnaXZlbgorICAgYWRkcmVzcy4gICovCisKK2V4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9saW5lIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOworCisvKiBTdGFydCBhIG5hbWVkIGNvbW1vbiBibG9jay4gIFRoaXMgaXMgYSBibG9jayBvZiB2YXJpYWJsZXMgdGhhdCBtYXkKKyAgIG1vdmUgaW4gbWVtb3J5LiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CisKKy8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCisKK2V4dGVybiBib29sZWFuIGRlYnVnX2VuZF9jb21tb25fYmxvY2sgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKKworLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCisKK2V4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9pbnRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKKworLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLworCitleHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOworCisvKiBSZWNvcmQgYSB0eXBlZCBjb25zdGFudCB3aXRoIGFuIGludGVncmFsIHZhbHVlLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0CisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7CisKKy8qIFJlY29yZCBhIGxhYmVsLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2xhYmVsCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7CisKKy8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7CisKKy8qIE1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlCisgICBsb2NhdGlvbiB3aGVyZSB0aGUgcmVhbCB0eXBlIHdpbGwgYmUgcGxhY2VkLiAgVGhlIHNlY29uZCBhcmd1bWVudAorICAgaXMgdGhlIHR5cGUgdGFnLCBpZiB0aGVyZSBpcyBvbmU7IHRoaXMgbWF5IGJlIE5VTEw7IHRoZSBvbmx5CisgICBwdXJwb3NlIG9mIHRoaXMgYXJndW1lbnQgaXMgc28gdGhhdCBkZWJ1Z19nZXRfdHlwZV9uYW1lIGNhbiByZXR1cm4KKyAgIHNvbWV0aGluZyB1c2VmdWwuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gYSB0eXBlIGlzCisgICByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlCisgIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKKworLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOworCisvKiBNYWtlIGFuIGludGVnZXIgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBUaGUgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlCisgICBpZiB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKKworLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgRklYTUU6IE9uIHNvbWUKKyAgIHBsYXRmb3JtcywgbGlrZSBhbiBBbHBoYSwgeW91IHByb2JhYmx5IG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5CisgICB0aGUgZm9ybWF0LiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CisKKy8qIE1ha2UgYSBib29sZWFuIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKKworLyogTWFrZSBhIGNvbXBsZXggdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLworCitleHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOworCisvKiBNYWtlIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LAorICAgZmFsc2UgZm9yIGEgdW5pb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdC4KKyAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZQorICBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX2ZpZWxkICopKTsKKworLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQorICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQorICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgorICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCisgICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUKKyAgUEFSQU1TICgoUFRSLCBib29sZWFuLCBiZmRfdm1hLCBkZWJ1Z19maWVsZCAqLCBkZWJ1Z19iYXNlY2xhc3MgKiwKKwkgICBkZWJ1Z19tZXRob2QgKiwgZGVidWdfdHlwZSwgYm9vbGVhbikpOworCisvKiBNYWtlIGFuIGVudW1lcmF0aW9uIHR5cGUuICBUaGUgYXJndW1lbnRzIGFyZSBhIG51bGwgdGVybWluYXRlZAorICAgYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9lbnVtX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7CisKKy8qIE1ha2UgYSBwb2ludGVyIHRvIGEgZ2l2ZW4gdHlwZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcG9pbnRlcl90eXBlCisgIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOworCisvKiBNYWtlIGEgZnVuY3Rpb24gdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJldHVybiB0eXBlLiAgVGhlCisgICB0aGlyZCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gIFRoZQorICAgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgICBhcmd1bWVudHMuICBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlbiB0aGUgYXJndW1lbnQgdHlwZXMKKyAgIGFyZSB1bmtub3duLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCisgIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSAqLCBib29sZWFuKSk7CisKKy8qIE1ha2UgYSByZWZlcmVuY2UgdG8gYSBnaXZlbiB0eXBlLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogTWFrZSBhIHJhbmdlIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbG93ZXIgdG8gYW4gdXBwZXIgYm91bmQuICAqLworCitleHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKKworLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50CisgICBvZiB0aGUgYXJyYXkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYSByYW5nZSBvZiB0aGUKKyAgIGFycmF5LiAgVGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJndW1lbnQgYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIKKyAgIGJvdW5kcywgcmVzcGVjdGl2ZWx5IChpZiB0aGUgYm91bmRzIGFyZSBub3Qga25vd24sIGxvd2VyIHNob3VsZCBiZQorICAgMCBhbmQgdXBwZXIgc2hvdWxkIGJlIC0xKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMKKyAgIGFycmF5IGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9hcnJheV90eXBlCisgIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAorCSAgIGJvb2xlYW4pKTsKKworLyogTWFrZSBhIHNldCBvZiBhIGdpdmVuIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBQYXNjYWwgc2V0IHR5cGUuICBUaGUKKyAgIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIHNldCBpcyBhY3R1YWxseSBhIGJpdHN0cmluZywgYXMgaW4KKyAgIENISUxMLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKKworLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKKyAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCisgICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cworICAgdG8uICAqLworCitleHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX29mZnNldF90eXBlCisgIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSkpOworCisvKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQorICAgcmV0dXJuIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGRvbWFpbi4gIFRoZSBmb3VydGgKKyAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgVGhlIGZpZnRoCisgICBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgYXJndW1lbnRzLCBpbiB3aGljaCBjYXNlIHRoZSBhcnJheSBvZiBhcmd1bWVudCB0eXBlcyBpbmRpY2F0ZXMgdGhlCisgICB0eXBlcyBvZiB0aGUgZmlyc3QgYXJndW1lbnRzLiAgVGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IGFycmF5CisgICBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGEgc3R1YiBtZXRob2QgYW5kIHRoYXQKKyAgIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBTdGFicyBkZWJ1Z2dpbmcgdXNlcyB0aGlzLCBhbmQgZ2V0cworICAgdGhlIGFyZ3VtZW50IHR5cGVzIGZyb20gdGhlIG1hbmdsZWQgbmFtZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlICosIGJvb2xlYW4pKTsKKworLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogTWFrZSBhbiB1bmRlZmluZWQgdGFnZ2VkIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCisgICBiZWVuIG1lbnRpb25lZCwgYnV0IG5vdCBkZWZpbmVkLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7CisKKy8qIE1ha2UgYSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBiYXNlCisgICBjbGFzcyB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhpcyBiYXNlCisgICBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYQorICAgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYmFzZQorICAgY2xhc3MuICAqLworCitleHRlcm4gZGVidWdfYmFzZWNsYXNzIGRlYnVnX21ha2VfYmFzZWNsYXNzCisgIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7CisKKy8qIE1ha2UgYSBmaWVsZCBmb3IgYSBzdHJ1Y3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLiAgVGhlCisgICB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzCisgICB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZC4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZgorICAgdGhlIGZpZWxkIChpdCBtYXkgYmUgemVybykuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkKKyAgIG9mIHRoZSBmaWVsZC4gICovCisKK2V4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX2ZpZWxkCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hLCBiZmRfdm1hLAorCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOworCisvKiBNYWtlIGEgc3RhdGljIG1lbWJlciBvZiBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQorICAgbmFtZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyLiAgVGhlIGZvdXJ0aAorICAgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIG1lbWJlciAoaS5lLiwgdGhlIG5hbWUgYXMgYQorICAgZ2xvYmFsIHZhcmlhYmxlKS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKKyAgIG1lbWJlci4gICovCisKK2V4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwKKwkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKKworLyogTWFrZSBhIG1ldGhvZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUsIGFuZCB0aGUgdGhpcmQKKyAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZCB2YXJpYW50cy4gIEVhY2gKKyAgIG1ldGhvZCB2YXJpYW50IGlzIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIGJ1dCB3aXRoIGRpZmZlcmVudAorICAgYXJndW1lbnQgdHlwZXMuICAqLworCitleHRlcm4gZGVidWdfbWV0aG9kIGRlYnVnX21ha2VfbWV0aG9kCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSk7CisKKy8qIE1ha2UgYSBtZXRob2QgdmFyaWFudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YKKyAgIHRoZSBmdW5jdGlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24sCisgICBwcm9iYWJseSBjb25zdHJ1Y3RlZCBieSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlLiAgVGhlIGZvdXJ0aAorICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzCisgICBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlCisgICBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBpbmRleCBpbiB0aGUgdmlydHVhbAorICAgZnVuY3Rpb24gdGFibGUsIGlmIGFueS4gIFRoZSBlaWdodGggYXJndW1lbnQgaXMgdGhlIHZpcnR1YWwKKyAgIGZ1bmN0aW9uIGNvbnRleHQuICAqLworCitleHRlcm4gZGVidWdfbWV0aG9kX3ZhcmlhbnQgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudAorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLAorCSAgIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX3R5cGUpKTsKKworLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKKyAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAorICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KKworZXh0ZXJuIGRlYnVnX21ldGhvZF92YXJpYW50IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50CisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCisJICAgYm9vbGVhbikpOworCisvKiBOYW1lIGEgdHlwZS4gIFRoaXMgcmV0dXJucyBhIG5ldyB0eXBlIHdpdGggYW4gYXR0YWNoZWQgbmFtZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX25hbWVfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSkpOworCisvKiBHaXZlIGEgdGFnIHRvIGEgdHlwZSwgc3VjaCBhcyBhIHN0cnVjdCBvciB1bmlvbi4gIFRoaXMgcmV0dXJucyBhCisgICBuZXcgdHlwZSB3aXRoIGFuIGF0dGFjaGVkIHRhZy4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX3RhZ190eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlKSk7CisKKy8qIFJlY29yZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR5cGUuICAqLworCitleHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgdW5zaWduZWQgaW50KSk7CisKKy8qIEZpbmQgYSBuYW1lZCB0eXBlLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZmluZF9uYW1lZF90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CisKKy8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7CisKKy8qIEdldCB0aGUga2luZCBvZiBhIHR5cGUuICAqLworCitleHRlcm4gZW51bSBkZWJ1Z190eXBlX2tpbmQgZGVidWdfZ2V0X3R5cGVfa2luZCBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCisKK2V4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfdHlwZV9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOworCisvKiBHZXQgdGhlIHNpemUgb2YgYSB0eXBlLiAgKi8KKworZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X3R5cGVfc2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KKworZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X3JldHVybl90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOworCisvKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgZm9yIGEgZnVuY3Rpb24gb3IKKyAgIG1ldGhvZCB0eXBlIChhY3R1YWxseSwgcGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgY3VycmVudGx5IHN0b3JlZCBmb3IKKyAgIGZ1bmN0aW9uIHR5cGVzKS4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtZXRob2QKKyAgIHR5cGUgaXMgYSBzdHViIG1ldGhvZCBvciBub3QuICBUaGUgbGFzdCBhcmd1bWVudCBwb2ludHMgdG8gYQorICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZQorICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisKK2V4dGVybiBjb25zdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIFBBUkFNUyAoKFBUUiwKKwkJCQkJCQkgICAgZGVidWdfdHlwZSwKKwkJCQkJCQkgICAgYm9vbGVhbiAqKSk7CisKKy8qIEdldCB0aGUgdGFyZ2V0IHR5cGUgb2YgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSBvciBjb25zdCBvciB2b2xhdGlsZQorICAgdHlwZS4gICovCisKK2V4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF90YXJnZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCisgICBjbGFzcy4gICovCisKK2V4dGVybiBjb25zdCBkZWJ1Z19maWVsZCAqZGVidWdfZ2V0X2ZpZWxkcyBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKKworLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLworCitleHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfZmllbGRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7CisKKy8qIEdldCB0aGUgbmFtZSBvZiBhIGZpZWxkLiAgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF9maWVsZF9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKKworLyogR2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgYSBmaWVsZCB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlLgorICAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcyB3aWxsIHJldHVybiAoYmZkX3ZtYSkgLTEuICAqLworCitleHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKKworLyogR2V0IHRoZSBiaXQgc2l6ZSBvZiBhIGZpZWxkLiAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcworICAgd2lsbCByZXR1cm4gKGJmZF92bWEpIC0xLiAgKi8KKworZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOworCisvKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZC4gICovCisKK2V4dGVybiBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkKKyAgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOworCisvKiBHZXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSBmaWVsZCwgaWYgaXQgaXMgYSBzdGF0aWMgbWVtYmVyLiAgSWYgdGhlCisgICBmaWVsZCBpcyBub3QgYSBzdGF0aWMgbWVtYmVyLCB0aGlzIHdpbGwgcmV0dXJuIE5VTEwuICAqLworCitleHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKKworLyogV3JpdGUgb3V0IHRoZSByZWNvcmRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHRha2VzIGEgc2V0IG9mCisgICBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBhcmUgY2FsbGVkIHRvIGRvIHRoZSBhY3R1YWwgd3JpdGluZy4gIFRoZQorICAgZmlyc3QgUFRSIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlLiAgVGhlIHNlY29uZCBQVFIgaXMgYSBoYW5kbGUKKyAgIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAgKi8KKworZXh0ZXJuIGJvb2xlYW4gZGVidWdfd3JpdGUgUEFSQU1TICgoUFRSLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUikpOworCisjZW5kaWYgLyogREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmbGV4LmwgYi9iaW51dGlscy9kZWZsZXgubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZhMzYyCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvZGVmbGV4LmwKQEAgLTAsMCArMSw4NiBAQAorJXsvKiBkZWZsZXgubCAtIExleGVyIGZvciAuZGVmIGZpbGVzICovCisKKy8qICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworLyogQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgIAkJICBzYWNAY3lnbnVzLmNvbQorCisqLworI2RlZmluZSBET05UREVDTEFSRV9NQUxMT0MKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJkZWZwYXJzZS5oIgorI2luY2x1ZGUgImRsbHRvb2wuaCIKKworaW50IGxpbmVudW1iZXI7CisKKyV9CislJQorIk5BTUUiIAkJeyByZXR1cm4gTkFNRTt9CisiTElCUkFSWSIJeyByZXR1cm4gTElCUkFSWTt9CisiREVTQ1JJUFRJT04iIAl7IHJldHVybiBERVNDUklQVElPTjt9CisiU1RBQ0tTSVpFIgl7IHJldHVybiBTVEFDS1NJWkU7fQorIkhFQVBTSVpFIiAJeyByZXR1cm4gSEVBUFNJWkU7fQorIkNPREUiIAkJeyByZXR1cm4gQ09ERTt9CisiREFUQSIJCXsgcmV0dXJuIERBVEE7fQorIlNFQ1RJT05TIgl7IHJldHVybiBTRUNUSU9OUzt9CisiRVhQT1JUUyIJeyByZXR1cm4gRVhQT1JUUzt9CisiSU1QT1JUUyIJeyByZXR1cm4gSU1QT1JUUzt9CisiVkVSU0lPTiIJeyByZXR1cm4gVkVSU0lPTks7fQorIkJBU0UiCQl7IHJldHVybiBCQVNFO30KKyJDT05TVEFOVCIJeyByZXR1cm4gQ09OU1RBTlQ7IH0KKyJOT05BTUUiCXsgcmV0dXJuIE5PTkFNRTsgfQorIlJFQUQiCQl7IHJldHVybiBSRUFEO30KKyJXUklURSIJCXsgcmV0dXJuIFdSSVRFO30KKyJFWEVDVVRFIgl7IHJldHVybiBFWEVDVVRFO30KKyJTSEFSRUQiCXsgcmV0dXJuIFNIQVJFRDt9CisKK1swLTldW3gwLTlBLUZhLWZdKiB7IHl5bHZhbC5udW1iZXIgPSBzdHJ0b2wgKHl5dGV4dCwwLDApOyAKKwkJcmV0dXJuIE5VTUJFUjsgfQorCitbQS1aYS16JDpcLVxfP11bQS1aYS16MC05LyQ6XC1cX0A/XSsgeyAJCisJCXl5bHZhbC5pZCA9ICB4c3RyZHVwICh5eXRleHQpOworCQlyZXR1cm4gSUQ7CisJCX0KKworIlwiIlteXCJdKiJcIiIgeworCQl5eWx2YWwuaWQgPSB4c3RyZHVwICh5eXRleHQrMSk7CisJCXl5bHZhbC5pZFt5eWxlbmctMl0gPSAwOworCQlyZXR1cm4gSUQ7CisJCX0KKworIlwnIlteXCddKiJcJyIgeworCQl5eWx2YWwuaWQgPSB4c3RyZHVwICh5eXRleHQrMSk7CisJCXl5bHZhbC5pZFt5eWxlbmctMl0gPSAwOworCQlyZXR1cm4gSUQ7CisJCX0KKyIqIi4qIAkJeyB9CisiOyIuKiAJCXsgfQorIiAiCQl7IH0KKyJcdCIJCXsgfQorIlxuIgkgCXsgbGluZW51bWJlciArKyA7fQorIj0iIAkJeyByZXR1cm4gJz0nO30KKyIuIiAJCXsgcmV0dXJuICcuJzt9CisiQCIJIAl7IHJldHVybiAnQCc7fQorIiwiCQl7IHJldHVybiAnLCc7fQorJSUKKyNpZm5kZWYgeXl3cmFwCisvKiBOZWVkZWQgZm9yIGxleCwgdGhvdWdoIG5vdCBmbGV4LiAqLworaW50IHl5d3JhcCgpIHsgcmV0dXJuIDE7IH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmcGFyc2UueSBiL2JpbnV0aWxzL2RlZnBhcnNlLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiNjM2MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2RlZnBhcnNlLnkKQEAgLTAsMCArMSwxNTcgQEAKKyV7IC8qIGRlZnBhcnNlLnkgLSBwYXJzZXIgZm9yIC5kZWYgZmlsZXMgKi8KKworLyogICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImRsbHRvb2wuaCIKKyV9CisKKyV1bmlvbiB7CisgIGNoYXIgKmlkOworICBpbnQgbnVtYmVyOworfTsKKworJXRva2VuIE5BTUUsIExJQlJBUlksIERFU0NSSVBUSU9OLCBTVEFDS1NJWkUsIEhFQVBTSVpFLCBDT0RFLCBEQVRBCisldG9rZW4gU0VDVElPTlMsIEVYUE9SVFMsIElNUE9SVFMsIFZFUlNJT05LLCBCQVNFLCBDT05TVEFOVAorJXRva2VuIFJFQUQgV1JJVEUgRVhFQ1VURSBTSEFSRUQgTk9OQU1FCisldG9rZW4gPGlkPiBJRAorJXRva2VuIDxudW1iZXI+IE5VTUJFUgorJXR5cGUgIDxudW1iZXI+IG9wdF9iYXNlIG9wdF9vcmRpbmFsIG9wdF9OT05BTUUgb3B0X0NPTlNUQU5UIG9wdF9EQVRBCisldHlwZSAgPG51bWJlcj4gYXR0ciBhdHRyX2xpc3Qgb3B0X251bWJlcgorJXR5cGUgIDxpZD4gb3B0X25hbWUgb3B0X2VxdWFsX25hbWUgCisKKyUlCisKK3N0YXJ0OiBzdGFydCBjb21tYW5kCisJfCBjb21tYW5kCisJOworCitjb21tYW5kOiAKKwkJTkFNRSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9uYW1lICgkMiwgJDMpOyB9CisJfAlMSUJSQVJZIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX2xpYnJhcnkgKCQyLCAkMyk7IH0KKwl8CUVYUE9SVFMgZXhwbGlzdCAKKwl8CURFU0NSSVBUSU9OIElEIHsgZGVmX2Rlc2NyaXB0aW9uICgkMik7fQorCXwJU1RBQ0tTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX3N0YWNrc2l6ZSAoJDIsICQzKTt9CisJfAlIRUFQU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9oZWFwc2l6ZSAoJDIsICQzKTt9CisJfAlDT0RFIGF0dHJfbGlzdCB7IGRlZl9jb2RlICgkMik7fQorCXwJREFUQSBhdHRyX2xpc3QgIHsgZGVmX2RhdGEgKCQyKTt9CisJfAlTRUNUSU9OUyBzZWNsaXN0CisJfAlJTVBPUlRTIGltcGxpc3QKKwl8CVZFUlNJT05LIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwwKTt9CisJfAlWRVJTSU9OSyBOVU1CRVIgJy4nIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwkNCk7fQorCTsKKworCitleHBsaXN0OgorCQkvKiBFTVBUWSAqLworCXwJZXhwbGluZQorCXwJZXhwbGlzdCBleHBsaW5lCisJOworCitleHBsaW5lOgorCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBvcHRfTk9OQU1FIG9wdF9DT05TVEFOVCBvcHRfREFUQQorCQkJeyBkZWZfZXhwb3J0cyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNik7fQorCTsKK2ltcGxpc3Q6CQorCQlpbXBsaXN0IGltcGxpbmUKKwl8CWltcGxpbmUKKwk7CisKK2ltcGxpbmU6CisgICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywkNSwkNywgMCk7IH0KKyAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIE5VTUJFUiB7IGRlZl9pbXBvcnQgKCQxLCQzLCQ1LCAwLCQ3KTsgfQorICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsIDAsJDUsIDApOyB9CisgICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywgMCwgMCwkNSk7IH0KKyAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCQzLCQ1LCAwKTsgfQorICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsJDMsIDAsJDUpOyB9CisgICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwgMCwkMywgMCk7IH0KKyAgICAgICB8ICAgICAgIElEICcuJyBOVU1CRVIgICAgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCAwLCAwLCQzKTsgfQorOworCitzZWNsaXN0OgorCQlzZWNsaXN0IHNlY2xpbmUKKwl8CXNlY2xpbmUKKwk7CisKK3NlY2xpbmU6CisJSUQgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCQxLCQyKTt9CisJOworCithdHRyX2xpc3Q6CisJYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyCisJfCBhdHRyCisJOworCitvcHRfY29tbWE6CisJJywnCisJfCAKKwk7CitvcHRfbnVtYmVyOiAnLCcgTlVNQkVSIHsgJCQ9JDI7fQorCXwJICAgeyAkJD0tMTt9CisJOworCQorYXR0cjoKKwkJUkVBRCB7ICQkID0gMTt9CisJfAlXUklURSB7ICQkID0gMjt9CQorCXwJRVhFQ1VURSB7ICQkPTQ7fQorCXwJU0hBUkVEIHsgJCQ9ODt9CisJOworCitvcHRfQ09OU1RBTlQ6CisJCUNPTlNUQU5UIHskJD0xO30KKwl8CQkgeyQkPTA7fQorCTsKKworb3B0X05PTkFNRToKKwkJTk9OQU1FIHskJD0xO30KKwl8CQkgeyQkPTA7fQorCTsKKworb3B0X0RBVEE6CisJCURBVEEgeyAkJCA9IDE7IH0KKwl8CSAgICAgeyAkJCA9IDA7IH0KKwk7CisKK29wdF9uYW1lOiBJRAkJeyAkJCA9JDE7IH0KKwl8IElEICcuJyBJRAkKKwkgIHsgCisJICAgIGNoYXIgKm5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKCQxKSArIDEgKyBzdHJsZW4gKCQzKSArIDEpOworCSAgICBzcHJpbnRmIChuYW1lLCAiJXMuJXMiLCAkMSwgJDMpOworCSAgICAkJCA9IG5hbWU7CisJICB9CisJfAkJeyAkJD0iIjsgfQorCTsKKworb3B0X29yZGluYWw6IAorCSAgJ0AnIE5VTUJFUiAgICAgeyAkJD0kMjt9CisJfCAgICAgICAgICAgICAgICB7ICQkPS0xO30KKwk7CisKK29wdF9lcXVhbF9uYW1lOgorICAgICAgICAgICc9JyBJRAl7ICQkID0gJDI7IH0KKyAgICAgICAgfCAJCXsgJCQgPSAgMDsgfQkJCSAKKwk7CisKK29wdF9iYXNlOiBCQVNFCSc9JyBOVU1CRVIJeyAkJD0gJDM7fQorCXwJeyAkJD0tMTt9CisJOworCisJCisKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlcC1pbi5zZWQgYi9iaW51dGlscy9kZXAtaW4uc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTkyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9kZXAtaW4uc2VkCkBAIC0wLDAgKzEsMTcgQEAKKzpsb29wCisvXFwkL04KKy9cXCQvYiBsb29wCisKK3MhQElOQ0RJUkAhJChJTkNESVIpIWcKK3MhQEJGRERJUkAhJChCRkRESVIpIWcKK3MhQFNSQ0RJUkAvISFnCitzIUBPQkpESVJALyEhZworCitzL1xcXG4gKi8gL2cKKworcy8gKiQvLworcy8gICovIC9nCisvOiQvZAorCitzL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAorICAvZwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5jIGIvYmludXRpbHMvZGxsdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNWNmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9kbGx0b29sLmMKQEAgLTAsMCArMSwzMTk5IEBACisvKiBkbGx0b29sLmMgLS0gdG9vbCB0byBnZW5lcmF0ZSBzdHVmZiBmb3IgUEUgc3R5bGUgRExMcworICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qCisgICBUaGlzIHByb2dyYW0gYWxsb3dzIHlvdSB0byBidWlsZCB0aGUgZmlsZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZQorICAgRExMcyB0byBydW4gb24gYSBzeXN0ZW0gd2hpY2ggdW5kZXJzdGFuZHMgUEUgZm9ybWF0IGltYWdlIGZpbGVzLgorICAgKGVnLCBXaW5kb3dzIE5UKQorCisgICBTZWUgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCisgICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgIEFsc28gc2VlICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCwKKyAgIFNwZWNpZmljYXRpb24gNC4xIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgQSBETEwgY29udGFpbnMgYW4gZXhwb3J0IHRhYmxlIHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgorICAgd2hpY2ggdGhlIHJ1bnRpbWUgbG9hZGVyIG5lZWRzIHRvIHRpZSB1cCByZWZlcmVuY2VzIGZyb20gYQorICAgcmVmZXJlbmNpbmcgcHJvZ3JhbS4KKworICAgVGhlIGV4cG9ydCB0YWJsZSBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtIGJ5IHJlYWRpbmcKKyAgIGluIGEgLkRFRiBmaWxlIG9yIHNjYW5uaW5nIHRoZSAuYSBhbmQgLm8gZmlsZXMgd2hpY2ggd2lsbCBiZSBpbiB0aGUKKyAgIERMTC4gIEEgLm8gZmlsZSBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBpbiBzcGVjaWFsICAiLmRyZWN0dmUiIHNlY3Rpb25zCisgICB3aXRoIGV4cG9ydCBpbmZvcm1hdGlvbi4KKworICAgQSBERUYgZmlsZSBjb250YWlucyBhbnkgbnVtYmVyIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKworICAgTkFNRSA8bmFtZT4gWyAsIDxiYXNlPiBdCisgICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5FWEUKKworICAgTElCUkFSWSA8bmFtZT4gWyAsIDxiYXNlPiBdCisgICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5ETEwKKworICAgRVhQT1JUUyAgKCA8bmFtZTE+IFsgPSA8bmFtZTI+IF0gWyBAIDxpbnRlZ2VyPiBdIFsgTk9OQU1FIF0gW0NPTlNUQU5UXSBbREFUQV0gKSAqCisgICBEZWNsYXJlcyBuYW1lMSBhcyBhbiBleHBvcnRlZCBzeW1ib2wgZnJvbSB0aGUKKyAgIERMTCwgd2l0aCBvcHRpb25hbCBvcmRpbmFsIG51bWJlciA8aW50ZWdlcj4KKworICAgSU1QT1JUUyAgKCAgKCAgIDxpbnRlcm5hbC1uYW1lPiA9ICAgPG1vZHVsZS1uYW1lPiAuIDxpbnRlZ2VyPiApCisgICAgICAgICAgICAgfCAoIFsgPGludGVybmFsLW5hbWU+ID0gXSA8bW9kdWxlLW5hbWU+IC4gPGV4dGVybmFsLW5hbWU+ICkpICoKKyAgIERlY2xhcmVzIHRoYXQgPGV4dGVybmFsLW5hbWU+IG9yIHRoZSBleHBvcnRlZCBmdW5jdGlvbiB3aG9lcyBvcmRpbmFsIG51bWJlcgorICAgaXMgPGludGVnZXI+IGlzIHRvIGJlIGltcG9ydGVkIGZyb20gdGhlIGZpbGUgPG1vZHVsZS1uYW1lPi4gIElmCisgICA8aW50ZXJuYWwtbmFtZT4gaXMgc3BlY2lmaWVkIHRoZW4gdGhpcyBpcyB0aGUgbmFtZSB0aGF0IHRoZSBpbXBvcnRlZAorICAgZnVuY3Rpb24gd2lsbCBiZSByZWZlcmVkIHRvIGluIHRoZSBib2R5IG9mIHRoZSBETEwuCisKKyAgIERFU0NSSVBUSU9OIDxzdHJpbmc+CisgICBQdXRzIDxzdHJpbmc+IGludG8gb3V0cHV0IC5leHAgZmlsZSBpbiB0aGUgLnJkYXRhIHNlY3Rpb24KKworICAgW1NUQUNLU0laRXxIRUFQU0laRV0gPG51bWJlci1yZXNlcnZlPiBbICwgPG51bWJlci1jb21taXQ+IF0KKyAgIEdlbmVyYXRlcyAtLXN0YWNrfC0taGVhcCA8bnVtYmVyLXJlc2VydmU+LDxudW1iZXItY29tbWl0PgorICAgaW4gdGhlIG91dHB1dCAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGxpbmtlciB3aWxsCisgICBzZWUgdGhpcyBhbmQgYWN0IHVwb24gaXQuCisKKyAgIFtDT0RFfERBVEFdIDxhdHRyPisKKyAgIFNFQ1RJT05TICggPHNlY3Rpb25uYW1lPiA8YXR0cj4rICkqCisgICA8YXR0cj4gPSBSRUFEIHwgV1JJVEUgfCBFWEVDVVRFIHwgU0hBUkVECisgICBHZW5lcmF0ZXMgLS1hdHRyIDxzZWN0aW9ubmFtZT4gPGF0dHI+IGluIHRoZSBvdXRwdXQKKyAgIC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgbGlua2VyIHdpbGwgc2VlIHRoaXMgYW5kIGFjdAorICAgdXBvbiBpdC4KKworCisgICBBIC1leHBvcnQ6PG5hbWU+IGluIGEgLmRyZWN0dmUgc2VjdGlvbiBpbiBhbiBpbnB1dCAubyBvciAuYQorICAgZmlsZSB0byB0aGlzIHByb2dyYW0gaXMgZXF1aXZhbGVudCB0byBhIEVYUE9SVFMgPG5hbWU+CisgICBpbiBhIC5ERUYgZmlsZS4KKworCisKKyAgIFRoZSBwcm9ncmFtIGdlbmVyYXRlcyBvdXRwdXQgZmlsZXMgd2l0aCB0aGUgcHJlZml4IHN1cHBsaWVkCisgICBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBpbiB0aGUgZGVmIGZpbGUsIG9yIHRha2VuIGZyb20gdGhlIGZpcnN0CisgICBzdXBwbGllZCBhcmd1bWVudC4KKworICAgVGhlIC5leHAucyBmaWxlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZXhwb3J0CisgICB0aGUgcm91dGluZXMgaW4gdGhlIERMTC4gIFRoZSAubGliLnMgZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KKyAgIG5lY2Vzc2FyeSB0byB1c2UgdGhlIERMTCdzIHJvdXRpbmVzIGZyb20gYSByZWZlcmVuY2luZyBwcm9ncmFtLgorCisKKworICAgRXhhbXBsZToKKworIGZpbGUxLmM6CisgICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOworICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDphZGVmXCIiKTsKKworICAgdm9pZCBhZGVmIChjaGFyICogcykKKyAgIHsKKyAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKKyAgIH0KKworICAgdm9pZCBiZGVmIChjaGFyICogcykKKyAgIHsKKyAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOworICAgfQorCisgZmlsZTIuYzoKKyAgIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7CisgICBhc20gKCIuYXNjaWkgXCItZXhwb3J0OmNkZWZcIiIpOworICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpkZGVmXCIiKTsKKyAgIAorICAgdm9pZCBjZGVmIChjaGFyICogcykKKyAgIHsKKyAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKKyAgIH0KKworICAgdm9pZCBkZGVmIChjaGFyICogcykKKyAgIHsKKyAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOworICAgfQorCisgICBwcmludGYoKQorICAgeworICAgICByZXR1cm4gOTsKKyAgIH0KKworIG1haW4uYworCisgICB2b2lkIG1haW4oKQorICAgeworICAgICBjZGVmKCk7CisgICB9CisKKyB0aGVkbGwuZGVmCisKKyAgIExJQlJBUlkgdGhlZGxsCisgICBIRUFQU0laRSAweDQwMDAwLCAweDIwMDAKKyAgIEVYUE9SVFMgYmRlZiBAIDIwCisgICAgICAgICAgIGNkZWYgQCAzMCBOT05BTUUKKworICAgU0VDVElPTlMgZG9ua2V5IFJFQUQgV1JJVEUKKyAgIGFhcmR2YXJrIEVYRUNVVEUKKworICMgY29tcGlsZSB1cCB0aGUgcGFydHMgb2YgdGhlIGRsbAorCisgICBnY2MgLWMgZmlsZTEuYworICAgZ2NjIC1jIGZpbGUyLmMKKworICMgcHV0IHRoZW0gaW4gYSBsaWJyYXJ5ICh5b3UgZG9uJ3QgaGF2ZSB0bywgeW91CisgIyBjb3VsZCBuYW1lIGFsbCB0aGUgLm9zIG9uIHRoZSBkbGx0b29sIGxpbmUpCisKKyAgIGFyICBxY3YgdGhlZGxsLmluIGZpbGUxLm8gZmlsZTIubworICAgcmFubGliIHRoZWRsbC5pbgorCisgIyBydW4gdGhpcyB0b29sIG92ZXIgdGhlIGxpYnJhcnkgYW5kIHRoZSBkZWYgZmlsZQorICAgLi9kbGx0b29sIC0tZGVmIHRoZWRsbC5kZWYgLS1vdXRwdXQtZXhwIHRoZWRsbC5vIC0tb3V0cHV0LWxpYiB0aGVkbGwuYQorCisgIyBidWlsZCB0aGUgZGxsIHdpdGggdGhlIGxpYnJhcnkgd2l0aCBmaWxlMS5vLCBmaWxlMi5vIGFuZCB0aGUgZXhwb3J0IHRhYmxlCisgICBsZCAtbyB0aGVkbGwuZGxsIHRoZWRsbC5vIHRoZWRsbC5pbgorCisgIyBidWlsZCB0aGUgbWFpbmxpbmUKKyAgIGdjYyAtYyB0aGVtYWluLmMKKworICMgbGluayB0aGUgZXhlY3V0YWJsZSB3aXRoIHRoZSBpbXBvcnQgbGlicmFyeQorICAgbGQgLWUgbWFpbiAtVHRoZW1haW4ubGQgLW8gdGhlbWFpbi5leGUgdGhlbWFpbi5vIHRoZWRsbC5hCisKKyAqLworCisvKiAuaWRhdGEgc2VjdGlvbiBkZXNjcmlwdGlvbgorCisgICBUaGUgLmlkYXRhIHNlY3Rpb24gaXMgdGhlIGltcG9ydCB0YWJsZS4gIEl0IGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsCisgICBzdWJzZWN0aW9ucyB1c2VkIHRvIGtlZXAgdGhlIHBpZWNlcyBmb3IgZWFjaCBkbGwgdG9nZXRoZXI6IC5pZGF0YSRbMjM0NTY3XS4KKyAgIElFOiBFYWNoIGRsbCdzIC5pZGF0YSQyJ3MgYXJlIGNhdGVuYXRlZCB0b2dldGhlciwgZWFjaCAuaWRhdGEkMydzLCBldGMuCisKKyAgIC5pZGF0YSQyID0gSW1wb3J0IERpcmVjdG9yeSBUYWJsZQorICAgPSBhcnJheSBvZiBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUidzLgorCisJRFdPUkQgICBJbXBvcnQgTG9va3VwIFRhYmxlOyAgLSBwb2ludGVyIHRvIC5pZGF0YSQ0CisJRFdPUkQgICBUaW1lRGF0ZVN0YW1wOyAgICAgICAgLSBjdXJyZW50bHkgYWx3YXlzIDAKKwlEV09SRCAgIEZvcndhcmRlckNoYWluOyAgICAgICAtIGN1cnJlbnRseSBhbHdheXMgMAorCURXT1JEICAgTmFtZTsgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBkbGwncyBuYW1lCisJUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsgLSBwb2ludGVyIHRvIC5pZGF0YSQ1CisKKyAgIC5pZGF0YSQzID0gbnVsbCB0ZXJtaW5hdGluZyBlbnRyeSBmb3IgLmlkYXRhJDIuCisKKyAgIC5pZGF0YSQ0ID0gSW1wb3J0IExvb2t1cCBUYWJsZQorICAgPSBhcnJheSBvZiBhcnJheSBvZiBwb2ludGVycyB0byBoaW50IG5hbWUgdGFibGUuCisgICBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggZGxsIGJlaW5nIGltcG9ydGVkIGZyb20sIGFuZCBlYWNoIGRsbCdzIHNldCBpcworICAgdGVybWluYXRlZCBieSBhIHRyYWlsaW5nIE5VTEwuCisKKyAgIC5pZGF0YSQ1ID0gSW1wb3J0IEFkZHJlc3MgVGFibGUKKyAgID0gYXJyYXkgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGludCBuYW1lIHRhYmxlLgorICAgVGhlcmUgaXMgb25lIGZvciBlYWNoIGRsbCBiZWluZyBpbXBvcnRlZCBmcm9tLCBhbmQgZWFjaCBkbGwncyBzZXQgaXMKKyAgIHRlcm1pbmF0ZWQgYnkgYSB0cmFpbGluZyBOVUxMLgorICAgSW5pdGlhbGx5LCB0aGlzIHRhYmxlIGlzIGlkZW50aWNhbCB0byB0aGUgSW1wb3J0IExvb2t1cCBUYWJsZS4gIEhvd2V2ZXIsCisgICBhdCBsb2FkIHRpbWUsIHRoZSBsb2FkZXIgb3ZlcndyaXRlcyB0aGUgZW50cmllcyB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgZnVuY3Rpb24uCisKKyAgIC5pZGF0YSQ2ID0gSGludCBOYW1lIFRhYmxlCisgICA9IEFycmF5IG9mIHsgc2hvcnQsIGFzY2l6IH0gZW50cmllcywgb25lIGZvciBlYWNoIGltcG9ydGVkIGZ1bmN0aW9uLgorICAgVGhlIGBzaG9ydCcgaXMgdGhlIGZ1bmN0aW9uJ3Mgb3JkaW5hbCBudW1iZXIuCisKKyAgIC5pZGF0YSQ3ID0gZGxsIG5hbWUgKGVnOiAia2VybmVsMzIuZGxsIikuICguaWRhdGEkNiBmb3IgcHBjKQorKi8KKworLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KKyNpZm5kZWYgX19HTlVDX18KKyMgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIHNob3dfYWxsbmFtZXMgMAorCisjZGVmaW5lIFBBR0VfU0laRSA0MDk2CisjZGVmaW5lIFBBR0VfTUFTSyAoLVBBR0VfU0laRSkKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImRsbHRvb2wuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisjaWZkZWYgRExMVE9PTF9BUk0KKyNpbmNsdWRlICJjb2ZmL2FybS5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfV0FJVF9ICisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbHNlIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCisjaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKKyNpZm5kZWYgV0lGRVhJVEVECisjZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSYwMzc3KSA9PSAwKQorI2VuZGlmCisjaWZuZGVmIFdJRlNJR05BTEVECisjZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpJjAzNzcpICE9IDAxNzcgJiYgKCh3KSZ+MDM3NykgPT0gMCkKKyNlbmRpZgorI2lmbmRlZiBXVEVSTVNJRworI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMDE3NykKKyNlbmRpZgorI2lmbmRlZiBXRVhJVFNUQVRVUworI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSA+PiA4KSAmIDAzNzcpCisjZW5kaWYKKyNlbHNlIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCisjaWZuZGVmIFdJRkVYSVRFRAorI2RlZmluZSBXSUZFWElURUQodykJKCgodykgJiAweGZmKSA9PSAwKQorI2VuZGlmCisjaWZuZGVmIFdJRlNJR05BTEVECisjZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpICYgMHhmZikgIT0gMCAmJiAoKHcpICYgMHhmZikgIT0gMHg3ZikKKyNlbmRpZgorI2lmbmRlZiBXVEVSTVNJRworI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMHg3ZikKKyNlbmRpZgorI2lmbmRlZiBXRVhJVFNUQVRVUworI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSAmIDB4ZmYwMCkgPj4gOCkKKyNlbmRpZgorI2VuZGlmIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCisjZW5kaWYgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KKworLyogaWZ1bmMgYW5kIGloZWFkIGRhdGEgc3RydWN0dXJlczogdHRrQGN5Z251cy5jb20gMTk5NworCisgICBXaGVuIElNUE9SVCBkZWNsYXJhdGlvbnMgYXJlIGVuY291bnRlcmVkIGluIGEgLmRlZiBmaWxlIHRoZQorICAgZnVuY3Rpb24gaW1wb3J0IGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhIHN0cnVjdHVyZSByZWZlcmVuY2VkIGJ5CisgICB0aGUgZ2xvYmFsIHZhcmlhYmxlIElNUE9SVF9MSVNULiAgVGhlIHN0cnVjdHVyZSBpcyBhIGxpbmtlZCBsaXN0CisgICBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgZGxsIGZpbGVzIGVhY2ggZnVuY3Rpb24gaXMgaW1wb3J0ZWQKKyAgIGZyb20gYW5kIGEgbGlua2VkIGxpc3Qgb2YgZnVuY3Rpb25zIGJlaW5nIGltcG9ydGVkIGZyb20gdGhhdCBkbGwKKyAgIGZpbGUuICBUaGlzIHJvdWdobHkgcGFyYWxsZWxzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIC5pZGF0YSBzZWN0aW9uCisgICBpbiB0aGUgUEUgb2JqZWN0IGZpbGUuCisKKyAgIFRoZSBjb250ZW50cyBvZiAuZGVmIGZpbGUgYXJlIGludGVycHJldGVkIGZyb20gd2l0aGluIHRoZQorICAgcHJvY2Vzc19kZWZfZmlsZSBmdW5jdGlvbi4gIEV2ZXJ5IHRpbWUgYW4gSU1QT1JUIGRlY2xhcmF0aW9uIGlzCisgICBlbmNvdW50ZXJlZCwgaXQgaXMgYnJva2VuIHVwIGludG8gaXRzIGNvbXBvbmVudCBwYXJ0cyBhbmQgcGFzc2VkIHRvCisgICBkZWZfaW1wb3J0LiAgSU1QT1JUX0xJU1QgaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCBpbiBmdW5jdGlvbiBtYWluLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaWZ1bmN0Cit7CisgIGNoYXIgICAgICAgICAgKm5hbWU7ICAgLyogbmFtZSBvZiBmdW5jdGlvbiBiZWluZyBpbXBvcnRlZCAqLworICBpbnQgICAgICAgICAgICBvcmQ7ICAgIC8qIHR3by1ieXRlIG9yZGluYWwgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGZ1bmN0aW9uICovCisgIHN0cnVjdCBpZnVuY3QgKm5leHQ7Cit9IGlmdW5jdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgaWhlYWR0Cit7CisgIGNoYXIgICAgICAgICAgKmRsbG5hbWU7ICAvKiBuYW1lIG9mIGRsbCBmaWxlIGltcG9ydGVkIGZyb20gKi8KKyAgbG9uZyAgICAgICAgICAgbmZ1bmNzOyAgIC8qIG51bWJlciBvZiBmdW5jdGlvbnMgaW4gbGlzdCAqLworICBzdHJ1Y3QgaWZ1bmN0ICpmdW5jaGVhZDsgLyogZmlyc3QgZnVuY3Rpb24gaW4gbGlzdCAqLworICBzdHJ1Y3QgaWZ1bmN0ICpmdW5jdGFpbDsgLyogbGFzdCAgZnVuY3Rpb24gaW4gbGlzdCAqLworICBzdHJ1Y3QgaWhlYWR0ICpuZXh0OyAgICAgLyogbmV4dCBkbGwgZmlsZSBpbiBsaXN0ICovCit9IGloZWFkdHlwZTsKKworLyogU3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGltcG9ydCBpbmZvcm1hdGlvbiBhcyBkZWZpbmVkIGluIC5kZWYgZmlsZQorICAgKHF2ICJpaGVhZCBzdHJ1Y3R1cmUiKS4gICovCisKK3N0YXRpYyBpaGVhZHR5cGUgKmltcG9ydF9saXN0ID0gTlVMTDsKKworc3RhdGljIGNoYXIgKmFzX25hbWUgPSAiYXMiOworc3RhdGljIGNoYXIgKiBhc19mbGFncyA9ICIiOworCitzdGF0aWMgaW50IG5vX2lkYXRhNDsKK3N0YXRpYyBpbnQgbm9faWRhdGE1Oworc3RhdGljIGNoYXIgKmV4cF9uYW1lOworc3RhdGljIGNoYXIgKmltcF9uYW1lOworc3RhdGljIGNoYXIgKmhlYWRfbGFiZWw7CitzdGF0aWMgY2hhciAqaW1wX25hbWVfbGFiOworc3RhdGljIGNoYXIgKmRsbF9uYW1lOworCitzdGF0aWMgaW50IGFkZF9pbmRpcmVjdCA9IDA7CitzdGF0aWMgaW50IGFkZF91bmRlcnNjb3JlID0gMDsKK3N0YXRpYyBpbnQgZG9udGRlbHRlbXBzID0gMDsKKworI2lmZGVmIERMTFRPT0xfQVJNCitzdGF0aWMgaW50IGludGVyd29yayA9IDA7CisjZW5kaWYgCisKKy8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4cG9ydCBhbGwgc3ltYm9scy4gIE90aGVyd2lzZSwgd2Ugb25seSBleHBvcnQKKyAgIHN5bWJvbHMgbGlzdGVkIGluIC5kcmVjdHZlIHNlY3Rpb25zIG9yIGluIHRoZSBkZWYgZmlsZS4gICovCitzdGF0aWMgYm9vbGVhbiBleHBvcnRfYWxsX3N5bWJvbHM7CisKKy8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgaW4gREVGQVVMVF9FWENMVURFUyB3aGVuCisgICBleHBvcnRpbmcgYWxsIHN5bWJvbHMuICAqLworc3RhdGljIGJvb2xlYW4gZG9fZGVmYXVsdF9leGNsdWRlczsKKworLyogRGVmYXVsdCBzeW1ib2xzIHRvIGV4Y2x1ZGUgd2hlbiBleHBvcnRpbmcgYWxsIHRoZSBzeW1ib2xzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2V4Y2x1ZGVzID0gIkRsbE1haW5AMTIsRGxsRW50cnlQb2ludEAwLGltcHVyZV9wdHIiOworCitzdGF0aWMgY2hhciAqZGVmX2ZpbGU7CisKK2V4dGVybiBjaGFyICogcHJvZ3JhbV9uYW1lOworCitzdGF0aWMgaW50IG1hY2hpbmU7CitzdGF0aWMgaW50IGtpbGxhdDsKK3N0YXRpYyBpbnQgYWRkX3N0ZGNhbGxfYWxpYXM7CitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgRklMRSAqb3V0cHV0X2RlZjsKK3N0YXRpYyBGSUxFICpiYXNlX2ZpbGU7CisKKyNpZmRlZiBETExUT09MX0JFT1MKK3N0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJiZW9zIjsKKyNlbmRpZgorCisjaWZkZWYgRExMVE9PTF9BUk0KK3N0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJhcm0iOworI2VuZGlmCisKKyNpZmRlZiBETExUT09MX0kzODYKK3N0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJpMzg2IjsKKyNlbmRpZgorCisjaWZkZWYgRExMVE9PTF9QUEMKK3N0YXRpYyBjb25zdCBjaGFyICptbmFtZSA9ICJwcGMiOworI2VuZGlmCisKKyNkZWZpbmUgUEFUSE1BWCAyNTAJCS8qIFdoYXQncyB0aGUgcmlnaHQgbmFtZSBmb3IgdGhpcyA/ICovCisKKyNkZWZpbmUgVE1QX0FTTQkJImRjLnMiCisjZGVmaW5lIFRNUF9IRUFEX1MJImRoLnMiCisjZGVmaW5lIFRNUF9IRUFEX08JImRoLm8iCisjZGVmaW5lIFRNUF9UQUlMX1MJImR0LnMiCisjZGVmaW5lIFRNUF9UQUlMX08JImR0Lm8iCisjZGVmaW5lIFRNUF9TVFVCCSJkcyIKKworLyogVGhpcyBiaXQgb2YgYXNzZW1seSBkb2VzIGptcCAqIC4uLi4KK3Mgc2V0IGhvd19qdGFiX3JvZmYgdG8gbWFyayB3aGVyZSB0aGUgMzJiaXQgYWJzIGJyYW5jaCBzaG91bGQgZ28gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGkzODZfanRhYltdID0KK3sKKyAgMHhmZiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXJtX2p0YWJbXSA9Cit7CisgIDB4MDAsIDB4YzAsIDB4OWYsIDB4ZTUsCisgIDB4MDAsIDB4ZjAsIDB4OWMsIDB4ZTUsCisgIDAsICAgIDAsICAgIDAsICAgIDAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRodW1iX2p0YWJbXSA9Cit7CisgIDB4YzAsIDB4YjQsCisgIDB4MDIsIDB4NGUsCisgIDB4MzYsIDB4NjgsCisgIDB4MDEsIDB4OTYsCisgIDB4NDAsIDB4YmQsCisgIDB4YzAsIDB4NDYsCisgIDAsICAgIDAsICAgIDAsICAgIDAKK307CisKKy8qIFRoaXMgaXMgdGhlIGdsdWUgc2VxdWVuY2UgZm9yIFBvd2VyUEMgUEUuIFRoZXJlIGlzIGEgICovCisvKiB0b2NyZWwxNi10b2NkZWZuIHJlbG9jIGFnYWluc3QgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAqLworLyogV2UgYWxzbyBuZWVkIGEgSU1HTFVFIHJlbG9jIGFnYWluc3QgdGhlIGdsdWUgZnVuY3Rpb24gKi8KKy8qIHRvIHJlc3RvcmUgdGhlIHRvYyBzYXZlZCBieSB0aGUgdGhpcmQgaW5zdHJ1Y3Rpb24gaW4gICovCisvKiB0aGUgZ2x1ZS4gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwY19qdGFiW10gPQoreworICAweDAwLCAweDAwLCAweDYyLCAweDgxLCAvKiBsd3ogcjExLDAocjIpICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBSZWxvYyBUT0NSRUwxNiBfX2ltcF94eHggICovCisgIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODEsIC8qIGx3eiByMTIsMChyMTEpICAgICAgICAgICAgICAqLworICAweDA0LCAweDAwLCAweDQxLCAweDkwLCAvKiBzdHcgcjIsNChyMSkgICAgICAgICAgICAgICAgKi8KKyAgMHhBNiwgMHgwMywgMHg4OSwgMHg3RCwgLyogbXRjdHIgcjEyICAgICAgICAgICAgICAgICAgICovCisgIDB4MDQsIDB4MDAsIDB4NEIsIDB4ODAsIC8qIGx3eiByMiw0KHIxMSkgICAgICAgICAgICAgICAqLworICAweDIwLCAweDA0LCAweDgwLCAweDRFICAvKiBiY3RyICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKKyNpZmRlZiBETExUT09MX1BQQworLyogdGhlIGdsdWUgaW5zdHJ1Y3Rpb24sIHBpY2tzIHVwIHRoZSB0b2MgZnJvbSB0aGUgc3R3IGluICovCisvKiB0aGUgYWJvdmUgY29kZTogImx3eiByMiw0KHIxKSIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBiZmRfdm1hIHBwY19nbHVlX2luc24gPSAweDgwNDEwMDA0OworI2VuZGlmCisKKy8qIFRoZSBvdXRmaWxlIGFycmF5IG11c3QgYmUgYmlnIGVub3VnaCB0byBjb250YWluIGEgZnVsbHkKKyAgIHF1YWxpZmllZCBwYXRoIG5hbWUsIHBsdXMgYW4gYXJiaXRhcnkgc2VyaWVzIG9mIGNvbW1hbmQKKyAgIGxpbmUgc3dpdGNoZXMuICBXZSBob3BlIHRoYXQgUEFUSF9NQVggdGltZXMgdHdvIHdpbGwgYmUKKyAgIGVub3VnaC4gICovCitzdGF0aWMgY2hhciBvdXRmaWxlIFtQQVRITUFYICogMl07CisKK3N0cnVjdCBtYWMKKyAgeworICAgIGNvbnN0IGNoYXIgKnR5cGU7CisgICAgY29uc3QgY2hhciAqaG93X2J5dGU7CisgICAgY29uc3QgY2hhciAqaG93X3Nob3J0OworICAgIGNvbnN0IGNoYXIgKmhvd19sb25nOworICAgIGNvbnN0IGNoYXIgKmhvd19hc2NpejsKKyAgICBjb25zdCBjaGFyICpob3dfY29tbWVudDsKKyAgICBjb25zdCBjaGFyICpob3dfanVtcDsKKyAgICBjb25zdCBjaGFyICpob3dfZ2xvYmFsOworICAgIGNvbnN0IGNoYXIgKmhvd19zcGFjZTsKKyAgICBjb25zdCBjaGFyICpob3dfYWxpZ25fc2hvcnQ7CisgICAgY29uc3QgY2hhciAqaG93X2FsaWduX2xvbmc7CisgICAgY29uc3QgY2hhciAqaG93X2JmZF90YXJnZXQ7CisgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGhvd19iZmRfYXJjaDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3dfanRhYjsKKyAgICBpbnQgaG93X2p0YWJfc2l6ZTsgLyogc2l6ZSBvZiB0aGUganRhYiBlbnRyeSAqLworICAgIGludCBob3dfanRhYl9yb2ZmOyAvKiBvZmZzZXQgaW50byBpdCBmb3IgdGhlIGluZCAzMiByZWxvYyBpbnRvIGlkYXRhIDUgKi8KKyAgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYWMKK210YWJsZVtdID0KK3sKKyAgeworI2RlZmluZSBNQVJNIDAKKyAgICAiYXJtIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCisgICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdHBjLFtpcF1cblx0LmxvbmciLAorICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAorICAgIGFybV9qdGFiLCBzaXplb2YgKGFybV9qdGFiKSwgOAorICB9CisgICwKKyAgeworI2RlZmluZSBNMzg2IDEKKyAgICAiaTM4NiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIiMiLCAiam1wICoiLCAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtaTM4NiIsYmZkX2FyY2hfaTM4NiwKKyAgIGkzODZfanRhYiwgc2l6ZW9mIChpMzg2X2p0YWIpLCAyCisgIH0KKyAgLAorICB7CisjZGVmaW5lIE1QUEMgMgorICAgICJwcGMiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIjIiwgImptcCAqIiwgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLXBvd2VycGNsZSIsYmZkX2FyY2hfcG93ZXJwYywKKyAgIHBwY19qdGFiLCBzaXplb2YgKHBwY19qdGFiKSwgMAorICB9CisgICwKKyAgeworI2RlZmluZSBNVEhVTUIgMworICAgICJ0aHVtYiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAorICAgICJwdXNoXHR7cjYsIHI3fVxuXHRsZHJcdHI2LCBbcGMsICM4XVxuXHRsZHJcdHI2LCBbcjZdXG5cdHN0clx0cjYsIFtzcCwgIzRdXG5cdHBvcFx0e3I2LCBwY31cblx0bm9wIiwKKyAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKKyAgICB0aHVtYl9qdGFiLCBzaXplb2YgKHRodW1iX2p0YWIpLCAxMgorICB9CisgICwKK3sgICAgMH0KK307CisKK3R5cGVkZWYgc3RydWN0IGRsaXN0Cit7CisgIGNoYXIgKnRleHQ7CisgIHN0cnVjdCBkbGlzdCAqbmV4dDsKK30KK2RsaXN0X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IGV4cG9ydAorICB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOworICAgIGludCBvcmRpbmFsOworICAgIGludCBjb25zdGFudDsKKyAgICBpbnQgbm9uYW1lOworICAgIGludCBkYXRhOworICAgIGludCBoaW50OworICAgIHN0cnVjdCBleHBvcnQgKm5leHQ7CisgIH0KK2V4cG9ydF90eXBlOworCisvKiBBIGxpc3Qgb2Ygc3ltYm9scyB3aGljaCB3ZSBzaG91bGQgbm90IGV4cG9ydC4gICovCisgCitzdHJ1Y3Qgc3RyaW5nX2xpc3QKK3sKKyAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OworICBjaGFyICpzdHJpbmc7Cit9OworCitzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpleGNsdWRlczsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWFmdGVyIFBBUkFNUyAoKGludCkpOworc3RhdGljIGNvbnN0IGNoYXIgKnJ2YWJlZm9yZSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBjb25zdCBjaGFyICphc21fcHJlZml4IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgYXBwZW5kX2ltcG9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBydW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZCBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgdm9pZCBhZGRfZXhjbHVkZXMgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBtYXRjaF9leGNsdWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZXhjbHVkZXMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGxvbmcgZmlsdGVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZywgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgdm9pZCBzY2FuX2FsbF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZCBzY2FuX29wZW5fb2JqX2ZpbGUgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIHNjYW5fb2JqX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBkdW1wX2RlZl9pbmZvIFBBUkFNUyAoKEZJTEUgKikpOworc3RhdGljIGludCBzZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworc3RhdGljIHZvaWQgZmx1c2hfcGFnZSBQQVJBTVMgKChGSUxFICosIGxvbmcgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIGdlbl9kZWZfZmlsZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9pZGF0YV9vZmlsZSBQQVJBTVMgKChGSUxFICopKTsKK3N0YXRpYyB2b2lkIGdlbl9leHBfZmlsZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgY29uc3QgY2hhciAqeGxhdGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisjaWYgMAorc3RhdGljIHZvaWQgZHVtcF9pYXQgUEFSQU1TICgoRklMRSAqLCBleHBvcnRfdHlwZSAqKSk7CisjZW5kaWYKK3N0YXRpYyBjaGFyICptYWtlX2xhYmVsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYmZkICptYWtlX29uZV9saWJfZmlsZSBQQVJBTVMgKChleHBvcnRfdHlwZSAqLCBpbnQpKTsKK3N0YXRpYyBiZmQgKm1ha2VfaGVhZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYmZkICptYWtlX3RhaWwgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZ2VuX2xpYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgcGZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3N0YXRpYyBpbnQgbmZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9udWxsX25hbWVzIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7CitzdGF0aWMgdm9pZCBkdGFiIFBBUkFNUyAoKGV4cG9ydF90eXBlICoqKSk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX2R1cGxpY2F0ZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKK3N0YXRpYyB2b2lkIGZpbGxfb3JkaW5hbHMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKK3N0YXRpYyBpbnQgYWxwaGFmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CitzdGF0aWMgdm9pZCBtYW5nbGVfZGVmcyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOworc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKK3N0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOworc3RhdGljIHZvaWQgd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOworCitzdGF0aWMgdm9pZAorZGlzcGxheSAobWVzc2FnZSwgYXJncykKKyAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7CisgICAgIHZhX2xpc3QgICAgICBhcmdzOworeworICBpZiAocHJvZ3JhbV9uYW1lICE9IE5VTEwpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7CisKKyAgaWYgKG1lc3NhZ2UgW3N0cmxlbiAobWVzc2FnZSkgLSAxXSAhPSAnXG4nKQorICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOworfSAgCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworaW5mb3JtIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQorI2Vsc2UKK2luZm9ybSAobWVzc2FnZSwgdmFfYWxpc3QpCisgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOworICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisgIAorICBpZiAoIXZlcmJvc2UpCisgICAgcmV0dXJuOworCisjaWZkZWYgX19TVERDX18KKyAgdmFfc3RhcnQgKGFyZ3MsIG1lc3NhZ2UpOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZ3MpOworI2VuZGlmCisKKyAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7CisgIAorICB2YV9lbmQgKGFyZ3MpOworfQorCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCit3YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQorI2Vsc2UKK3dhcm4gKG1lc3NhZ2UsIHZhX2FsaXN0KQorICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworICAKKyNpZmRlZiBfX1NURENfXworICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7CisjZWxzZQorICB2YV9zdGFydCAoYXJncyk7CisjZW5kaWYKKyAgCisgIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3J2YWFmdGVyIChtYWNoaW5lKQorICAgICBpbnQgbWFjaGluZTsKK3sKKyAgc3dpdGNoIChtYWNoaW5lKQorICAgIHsKKyAgICBjYXNlIE1BUk06CisgICAgY2FzZSBNMzg2OgorICAgIGNhc2UgTVBQQzoKKyAgICBjYXNlIE1USFVNQjoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIpLCBtYWNoaW5lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitydmFiZWZvcmUgKG1hY2hpbmUpCisgICAgIGludCBtYWNoaW5lOworeworICBzd2l0Y2ggKG1hY2hpbmUpCisgICAgeworICAgIGNhc2UgTUFSTToKKyAgICBjYXNlIE0zODY6CisgICAgY2FzZSBNUFBDOgorICAgIGNhc2UgTVRIVU1COgorICAgICAgcmV0dXJuICIucnZhXHQiOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIpLCBtYWNoaW5lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICIiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCithc21fcHJlZml4IChtYWNoaW5lKQorICAgICBpbnQgbWFjaGluZTsKK3sKKyAgc3dpdGNoIChtYWNoaW5lKQorICAgIHsKKyAgICBjYXNlIE1BUk06CisgICAgY2FzZSBNUFBDOgorICAgIGNhc2UgTVRIVU1COgorICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzg2OgorICAgICAgcmV0dXJuICJfIjsKKyAgICBkZWZhdWx0OgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAiIjsKK30KKworI2RlZmluZSBBU01fQllURSAJbXRhYmxlW21hY2hpbmVdLmhvd19ieXRlCisjZGVmaW5lIEFTTV9TSE9SVCAJbXRhYmxlW21hY2hpbmVdLmhvd19zaG9ydAorI2RlZmluZSBBU01fTE9ORwltdGFibGVbbWFjaGluZV0uaG93X2xvbmcKKyNkZWZpbmUgQVNNX1RFWFQJbXRhYmxlW21hY2hpbmVdLmhvd19hc2NpegorI2RlZmluZSBBU01fQyAJCW10YWJsZVttYWNoaW5lXS5ob3dfY29tbWVudAorI2RlZmluZSBBU01fSlVNUCAJbXRhYmxlW21hY2hpbmVdLmhvd19qdW1wCisjZGVmaW5lIEFTTV9HTE9CQUwJbXRhYmxlW21hY2hpbmVdLmhvd19nbG9iYWwKKyNkZWZpbmUgQVNNX1NQQUNFCW10YWJsZVttYWNoaW5lXS5ob3dfc3BhY2UKKyNkZWZpbmUgQVNNX0FMSUdOX1NIT1JUIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fc2hvcnQKKyNkZWZpbmUgQVNNX1JWQV9CRUZPUkUgCXJ2YWJlZm9yZShtYWNoaW5lKQorI2RlZmluZSBBU01fUlZBX0FGVEVSICAJcnZhYWZ0ZXIobWFjaGluZSkKKyNkZWZpbmUgQVNNX1BSRUZJWAlhc21fcHJlZml4KG1hY2hpbmUpCisjZGVmaW5lIEFTTV9BTElHTl9MT05HIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fbG9uZworI2RlZmluZSBIT1dfQkZEX1RBUkdFVCAgMCAgLyogYWx3YXlzIGRlZmF1bHQqLworI2RlZmluZSBIT1dfQkZEX0FSQ0ggICBtdGFibGVbbWFjaGluZV0uaG93X2JmZF9hcmNoCisjZGVmaW5lIEhPV19KVEFCICAgICAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYgorI2RlZmluZSBIT1dfSlRBQl9TSVpFICAgICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3NpemUKKyNkZWZpbmUgSE9XX0pUQUJfUk9GRiAgICAgIG10YWJsZVttYWNoaW5lXS5ob3dfanRhYl9yb2ZmCitzdGF0aWMgY2hhciAqKm9hdjsKKwordm9pZAorcHJvY2Vzc19kZWZfZmlsZSAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgRklMRSAqZiA9IGZvcGVuIChuYW1lLCBGT1BFTl9SVCk7CisgIAorICBpZiAoIWYpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBmYXRhbCAoXygiQ2FuJ3Qgb3BlbiBkZWYgZmlsZTogJXMiKSwgbmFtZSk7CisKKyAgeXlpbiA9IGY7CisKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgaW5mb3JtIChfKCJQcm9jZXNzaW5nIGRlZiBmaWxlOiAlcyIpLCBuYW1lKTsKKyAgCisgIHl5cGFyc2UgKCk7CisKKyAgaW5mb3JtIChfKCJQcm9jZXNzZWQgZGVmIGZpbGUiKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBwYXJzZXIgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmRfbmFtZTsJLyogQXJnIHRvIE5BTUUgb3IgTElCUkFSWSAqLworc3RhdGljIGludCBkX25mdW5jczsJCS8qIE51bWJlciBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgKi8KK3N0YXRpYyBpbnQgZF9uYW1lZF9uZnVuY3M7CS8qIE51bWJlciBvZiBuYW1lZCBmdW5jdGlvbnMgZXhwb3J0ZWQgKi8KK3N0YXRpYyBpbnQgZF9sb3dfb3JkOwkJLyogTG93ZXN0IG9yZGluYWwgaW5kZXggKi8KK3N0YXRpYyBpbnQgZF9oaWdoX29yZDsJCS8qIEhpZ2hlc3Qgb3JkaW5hbCBpbmRleCAqLworc3RhdGljIGV4cG9ydF90eXBlICpkX2V4cG9ydHM7CS8qbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBleHBvcnRfdHlwZSAqKmRfZXhwb3J0c19sZXhpY2FsbHk7CS8qIHZlY3RvciBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gYWxwaGEgb3JkZXIgKi8KK3N0YXRpYyBkbGlzdF90eXBlICpkX2xpc3Q7CS8qIERlc2NyaXB0aW9ucyAqLworc3RhdGljIGRsaXN0X3R5cGUgKmFfbGlzdDsJLyogU3R1ZmYgdG8gZ28gaW4gZGlyZWN0aXZlcyAqLworCitzdGF0aWMgaW50IGRfaXNfZGxsOworc3RhdGljIGludCBkX2lzX2V4ZTsKKworaW50Cit5eWVycm9yIChlcnIpCisgICAgIGNvbnN0IGNoYXIgKmVycjsKK3sKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgd2FybiAoXygiU3ludGF4IGVycm9yIGluIGRlZiBmaWxlICVzOiVkXG4iKSwgZGVmX2ZpbGUsIGxpbmVudW1iZXIpOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2RlZl9leHBvcnRzIChuYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsLCBub25hbWUsIGNvbnN0YW50LCBkYXRhKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOworICAgICBpbnQgb3JkaW5hbDsKKyAgICAgaW50IG5vbmFtZTsKKyAgICAgaW50IGNvbnN0YW50OworICAgICBpbnQgZGF0YTsKK3sKKyAgc3RydWN0IGV4cG9ydCAqcCA9IChzdHJ1Y3QgZXhwb3J0ICopIHhtYWxsb2MgKHNpemVvZiAoKnApKTsKKworICBwLT5uYW1lID0gbmFtZTsKKyAgcC0+aW50ZXJuYWxfbmFtZSA9IGludGVybmFsX25hbWUgPyBpbnRlcm5hbF9uYW1lIDogbmFtZTsKKyAgcC0+b3JkaW5hbCA9IG9yZGluYWw7CisgIHAtPmNvbnN0YW50ID0gY29uc3RhbnQ7CisgIHAtPm5vbmFtZSA9IG5vbmFtZTsKKyAgcC0+ZGF0YSA9IGRhdGE7CisgIHAtPm5leHQgPSBkX2V4cG9ydHM7CisgIGRfZXhwb3J0cyA9IHA7CisgIGRfbmZ1bmNzKys7Cit9CisKK3ZvaWQKK2RlZl9uYW1lIChuYW1lLCBiYXNlKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgYmFzZTsKK3sKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgaW5mb3JtIChfKCJOQU1FOiAlcyBiYXNlOiAleCIpLCBuYW1lLCBiYXNlKTsKKyAgCisgIGlmIChkX2lzX2RsbCkKKyAgICB3YXJuIChfKCJDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIpKTsKKyAgCisgIGRfbmFtZSA9IG5hbWU7CisgIC8qIGlmIC0tZGxsbmFtZSBub3QgcHJvdmlkZWQsIHVzZSB0aGUgb25lIGluIHRoZSBERUYgZmlsZS4KKyAgICAgRklYTUU6IElzIHRoaXMgYXBwcm9wcmlhdGUgZm9yIGV4ZWN1dGFibGVzPyAqLworICBpZiAoISBkbGxfbmFtZSkKKyAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG5hbWUpOworICBkX2lzX2V4ZSA9IDE7Cit9CisKK3ZvaWQKK2RlZl9saWJyYXJ5IChuYW1lLCBiYXNlKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgYmFzZTsKK3sKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgaW5mb3JtIChfKCJMSUJSQVJZOiAlcyBiYXNlOiAleCIpLCBuYW1lLCBiYXNlKTsKKyAgCisgIGlmIChkX2lzX2V4ZSkKKyAgICB3YXJuIChfKCIlczogQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgCisgIGRfbmFtZSA9IG5hbWU7CisgIC8qIGlmIC0tZGxsbmFtZSBub3QgcHJvdmlkZWQsIHVzZSB0aGUgb25lIGluIHRoZSBERUYgZmlsZS4gKi8KKyAgaWYgKCEgZGxsX25hbWUpCisgICAgZGxsX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKKyAgZF9pc19kbGwgPSAxOworfQorCit2b2lkCitkZWZfZGVzY3JpcHRpb24gKGRlc2MpCisgICAgIGNvbnN0IGNoYXIgKmRlc2M7Cit7CisgIGRsaXN0X3R5cGUgKmQgPSAoZGxpc3RfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGRsaXN0X3R5cGUpKTsKKyAgZC0+dGV4dCA9IHhzdHJkdXAgKGRlc2MpOworICBkLT5uZXh0ID0gZF9saXN0OworICBkX2xpc3QgPSBkOworfQorCit2b2lkCituZXdfZGlyZWN0aXZlIChkaXIpCisgICAgIGNoYXIgKmRpcjsKK3sKKyAgZGxpc3RfdHlwZSAqZCA9IChkbGlzdF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoZGxpc3RfdHlwZSkpOworICBkLT50ZXh0ID0geHN0cmR1cCAoZGlyKTsKKyAgZC0+bmV4dCA9IGFfbGlzdDsKKyAgYV9saXN0ID0gZDsKK30KKwordm9pZAorZGVmX2hlYXBzaXplIChyZXNlcnZlLCBjb21taXQpCisgICAgIGludCByZXNlcnZlOworICAgICBpbnQgY29tbWl0OworeworICBjaGFyIGJbMjAwXTsKKyAgaWYgKGNvbW1pdCA+IDApCisgICAgc3ByaW50ZiAoYiwgIi1oZWFwIDB4JXgsMHgleCAiLCByZXNlcnZlLCBjb21taXQpOworICBlbHNlCisgICAgc3ByaW50ZiAoYiwgIi1oZWFwIDB4JXggIiwgcmVzZXJ2ZSk7CisgIG5ld19kaXJlY3RpdmUgKHhzdHJkdXAgKGIpKTsKK30KKwordm9pZAorZGVmX3N0YWNrc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQorICAgICBpbnQgcmVzZXJ2ZTsKKyAgICAgaW50IGNvbW1pdDsKK3sKKyAgY2hhciBiWzIwMF07CisgIGlmIChjb21taXQgPiAwKQorICAgIHNwcmludGYgKGIsICItc3RhY2sgMHgleCwweCV4ICIsIHJlc2VydmUsIGNvbW1pdCk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChiLCAiLXN0YWNrIDB4JXggIiwgcmVzZXJ2ZSk7CisgIG5ld19kaXJlY3RpdmUgKHhzdHJkdXAgKGIpKTsKK30KKworLyogYXBwZW5kX2ltcG9ydCBzaW1wbHkgYWRkcyB0aGUgZ2l2ZW4gaW1wb3J0IGRlZmluaXRpb24gdG8gdGhlIGdsb2JhbAorICAgaW1wb3J0X2xpc3QuICBJdCBpcyB1c2VkIGJ5IGRlZl9pbXBvcnQuICAqLworCitzdGF0aWMgdm9pZAorYXBwZW5kX2ltcG9ydCAoc3ltYm9sX25hbWUsIGRsbF9uYW1lLCBmdW5jX29yZGluYWwpCisgICAgIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lOworICAgICBjb25zdCBjaGFyICpkbGxfbmFtZTsKKyAgICAgaW50IGZ1bmNfb3JkaW5hbDsKK3sKKyAgaWhlYWR0eXBlICoqcHE7CisgIGloZWFkdHlwZSAqcTsKKworICBmb3IgKHBxID0gJmltcG9ydF9saXN0OyAqcHEgIT0gTlVMTDsgcHEgPSAmKCpwcSktPm5leHQpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoKCpwcSktPmRsbG5hbWUsIGRsbF9uYW1lKSA9PSAwKQorCXsKKwkgIHEgPSAqcHE7CisJICBxLT5mdW5jdGFpbC0+bmV4dCA9IHhtYWxsb2MgKHNpemVvZiAoaWZ1bmN0eXBlKSk7CisJICBxLT5mdW5jdGFpbCA9IHEtPmZ1bmN0YWlsLT5uZXh0OworCSAgcS0+ZnVuY3RhaWwtPm9yZCAgPSBmdW5jX29yZGluYWw7CisJICBxLT5mdW5jdGFpbC0+bmFtZSA9IHhzdHJkdXAgKHN5bWJvbF9uYW1lKTsKKwkgIHEtPmZ1bmN0YWlsLT5uZXh0ID0gTlVMTDsKKwkgIHEtPm5mdW5jcysrOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgcSA9IHhtYWxsb2MgKHNpemVvZiAoaWhlYWR0eXBlKSk7CisgIHEtPmRsbG5hbWUgPSB4c3RyZHVwIChkbGxfbmFtZSk7CisgIHEtPm5mdW5jcyA9IDE7CisgIHEtPmZ1bmNoZWFkID0geG1hbGxvYyAoc2l6ZW9mIChpZnVuY3R5cGUpKTsKKyAgcS0+ZnVuY3RhaWwgPSBxLT5mdW5jaGVhZDsKKyAgcS0+bmV4dCA9IE5VTEw7CisgIHEtPmZ1bmN0YWlsLT5uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOworICBxLT5mdW5jdGFpbC0+b3JkICA9IGZ1bmNfb3JkaW5hbDsKKyAgcS0+ZnVuY3RhaWwtPm5leHQgPSBOVUxMOworCisgICpwcSA9IHE7Cit9CisKKy8qIGRlZl9pbXBvcnQgaXMgY2FsbGVkIGZyb20gd2l0aGluIGRlZnBhcnNlLnkgd2hlbiBhbiBJTVBPUlQKKyAgIGRlY2xhcmF0aW9uIGlzIGVuY291bnRlcmVkLiAgRGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZQorICAgZGVjbGFyYXRpb24sIHRoZSBtb2R1bGUgbmFtZSBtYXkgb3IgbWF5IG5vdCBuZWVkICIuZGxsIiB0byBiZQorICAgYXBwZW5kZWQgdG8gaXQsIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBtYXkgYmUgc3RvcmVkIGluIGludGVybmFsCisgICBvciBlbnRyeSwgYW5kIHRoZXJlIG1heSBvciBtYXkgbm90IGJlIGFuIG9yZGluYWwgdmFsdWUgYXNzb2NpYXRlZAorICAgd2l0aCBpdC4gICovCisKKy8qIEEgbm90ZSByZWdhcmRpbmcgdGhlIHBhcnNlIG1vZGVzOgorICAgSW4gZGVmcGFyc2UueSB3ZSBoYXZlIHRvIGFjY2VwdCBpbXBvcnQgZGVjbGFyYXRpb25zIHdoaWNoIGZvbGxvdworICAgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgorICAgICA8ZnVuY19uYW1lX2luX2FwcD4gPSA8ZGxsX25hbWU+LjxmdW5jX25hbWVfaW5fZGxsPgorICAgICA8ZnVuY19uYW1lX2luX2FwcD4gPSA8ZGxsX25hbWU+LjxudW1iZXI+CisgICAgIDxkbGxfbmFtZT4uPGZ1bmNfbmFtZV9pbl9kbGw+CisgICAgIDxkbGxfbmFtZT4uPG51bWJlcj4KKyAgIEZ1cnRoZXJtb3JlLCB0aGUgZGxsJ3MgbmFtZSBtYXkgb3IgbWF5IG5vdCBlbmQgd2l0aCAiLmRsbCIsIHdoaWNoCisgICBjb21wbGljYXRlcyB0aGUgcGFyc2luZyBhIGxpdHRsZS4gIE5vcm1hbGx5IHRoZSBkbGwncyBuYW1lIGlzCisgICBwYXNzZWQgdG8gZGVmX2ltcG9ydCgpIGluIHRoZSAibW9kdWxlIiBwYXJhbWV0ZXIsIGJ1dCB3aGVuIGl0IGVuZHMKKyAgIHdpdGggIi5kbGwiIGl0IGdldHMgcGFzc2VkIGluICJtb2R1bGUiIHNhbnMgIi5kbGwiIGFuZCB0aGF0IG5lZWRzCisgICB0byBiZSByZWFwcGVuZGVkLgorCisgIGRlZl9pbXBvcnQgZ2V0cyBmaXZlIHBhcmFtZXRlcnM6CisgIEFQUF9OQU1FIC0gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBhcHBsaWNhdGlvbiwgaWYKKyAgICAgICAgICAgICBwcmVzZW50LCBvciBOVUxMIGlmIG5vdCBwcmVzZW50LgorICBNT0RVTEUgICAtIHRoZSBuYW1lIG9mIHRoZSBkbGwsIHBvc3NpYmx5IHNhbnMgZXh0ZW5zaW9uIChpZSwgJy5kbGwnKS4KKyAgRExMRVhUICAgLSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBkbGwsIGlmIHByZXNlbnQsIE5VTEwgaWYgbm90IHByZXNlbnQuCisgIEVOVFJZICAgIC0gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBkbGwsIGlmIHByZXNlbnQsIG9yIE5VTEwuCisgIE9SRF9WQUwgIC0gdGhlIG51bWVyaWNhbCB0YWcgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBkbGwsIGlmIHByZXNlbnQsCisgICAgICAgICAgICAgb3IgTlVMTC4gIEV4YWN0bHkgb25lIG9mIDxlbnRyeT4gb3IgPG9yZF92YWw+IG11c3QgYmUKKyAgICAgICAgICAgICBwcmVzZW50IChpLmUuLCBub3QgTlVMTCkuICAqLworCit2b2lkCitkZWZfaW1wb3J0IChhcHBfbmFtZSwgbW9kdWxlLCBkbGxleHQsIGVudHJ5LCBvcmRfdmFsKQorICAgICBjb25zdCBjaGFyICphcHBfbmFtZTsKKyAgICAgY29uc3QgY2hhciAqbW9kdWxlOworICAgICBjb25zdCBjaGFyICpkbGxleHQ7CisgICAgIGNvbnN0IGNoYXIgKmVudHJ5OworICAgICBpbnQgb3JkX3ZhbDsKK3sKKyAgY29uc3QgY2hhciAqYXBwbGljYXRpb25fbmFtZTsKKyAgY2hhciAqYnVmOworCisgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgIGFwcGxpY2F0aW9uX25hbWUgPSBlbnRyeTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhcHBfbmFtZSAhPSBOVUxMKQorCWFwcGxpY2F0aW9uX25hbWUgPSBhcHBfbmFtZTsKKyAgICAgIGVsc2UKKwlhcHBsaWNhdGlvbl9uYW1lID0gIiI7CisgICAgfQorICAKKyAgaWYgKGRsbGV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChtb2R1bGUpICsgc3RybGVuIChkbGxleHQpICsgMik7CisgICAgICBzcHJpbnRmIChidWYsICIlcy4lcyIsIG1vZHVsZSwgZGxsZXh0KTsKKyAgICAgIG1vZHVsZSA9IGJ1ZjsKKyAgICB9CisKKyAgYXBwZW5kX2ltcG9ydCAoYXBwbGljYXRpb25fbmFtZSwgbW9kdWxlLCBvcmRfdmFsKTsKK30KKwordm9pZAorZGVmX3ZlcnNpb24gKG1ham9yLCBtaW5vcikKKyAgICAgaW50IG1ham9yOworICAgICBpbnQgbWlub3I7Cit7CisgIHByaW50ZiAoIlZFUlNJT04gJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7Cit9CisKK3ZvaWQKK2RlZl9zZWN0aW9uIChuYW1lLCBhdHRyKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgYXR0cjsKK3sKKyAgY2hhciBidWZbMjAwXTsKKyAgY2hhciBhdHRzWzVdOworICBjaGFyICpkID0gYXR0czsKKyAgaWYgKGF0dHIgJiAxKQorICAgICpkKysgPSAnUic7CisKKyAgaWYgKGF0dHIgJiAyKQorICAgICpkKysgPSAnVyc7CisgIGlmIChhdHRyICYgNCkKKyAgICAqZCsrID0gJ1gnOworICBpZiAoYXR0ciAmIDgpCisgICAgKmQrKyA9ICdTJzsKKyAgKmQrKyA9IDA7CisgIHNwcmludGYgKGJ1ZiwgIi1hdHRyICVzICVzIiwgbmFtZSwgYXR0cyk7CisgIG5ld19kaXJlY3RpdmUgKHhzdHJkdXAgKGJ1ZikpOworfQorCit2b2lkCitkZWZfY29kZSAoYXR0cikKKyAgICAgaW50IGF0dHI7Cit7CisKKyAgZGVmX3NlY3Rpb24gKCJDT0RFIiwgYXR0cik7Cit9CisKK3ZvaWQKK2RlZl9kYXRhIChhdHRyKQorICAgICBpbnQgYXR0cjsKK3sKKyAgZGVmX3NlY3Rpb24gKCJEQVRBIiwgYXR0cik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorcnVuICh3aGF0LCBhcmdzKQorICAgICBjb25zdCBjaGFyICp3aGF0OworICAgICBjaGFyICphcmdzOworeworICBjaGFyICpzOworICBpbnQgcGlkLCB3YWl0X3N0YXR1czsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKiphcmd2OworICBjaGFyICplcnJtc2dfZm10LCAqZXJybXNnX2FyZzsKKyAgY2hhciAqdGVtcF9iYXNlID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKKworICBpbmZvcm0gKCJydW46ICVzICVzXG4iLCB3aGF0LCBhcmdzKTsKKworICAvKiBDb3VudCB0aGUgYXJncyAqLworICBpID0gMDsKKyAgZm9yIChzID0gYXJnczsgKnM7IHMrKykKKyAgICBpZiAoKnMgPT0gJyAnKQorICAgICAgaSsrOworICBpKys7CisgIGFyZ3YgPSBhbGxvY2EgKHNpemVvZiAoY2hhciAqKSAqIChpICsgMykpOworICBpID0gMDsKKyAgYXJndltpKytdID0gd2hhdDsKKyAgcyA9IGFyZ3M7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHdoaWxlICgqcyA9PSAnICcpCisJKytzOworICAgICAgYXJndltpKytdID0gczsKKyAgICAgIHdoaWxlICgqcyAhPSAnICcgJiYgKnMgIT0gMCkKKwlzKys7CisgICAgICBpZiAoKnMgPT0gMCkKKwlicmVhazsKKyAgICAgICpzKysgPSAwOworICAgIH0KKyAgYXJndltpKytdID0gTlVMTDsKKworICBwaWQgPSBwZXhlY3V0ZSAoYXJndlswXSwgKGNoYXIgKiBjb25zdCAqKSBhcmd2LCBwcm9ncmFtX25hbWUsIHRlbXBfYmFzZSwKKwkJICAmZXJybXNnX2ZtdCwgJmVycm1zZ19hcmcsIFBFWEVDVVRFX09ORSB8IFBFWEVDVVRFX1NFQVJDSCk7CisKKyAgaWYgKHBpZCA9PSAtMSkKKyAgICB7CisgICAgICBpbmZvcm0gKHN0cmVycm9yIChlcnJubykpOworICAgICAgCisgICAgICBmYXRhbCAoZXJybXNnX2ZtdCwgZXJybXNnX2FyZyk7CisgICAgfQorCisgIHBpZCA9IHB3YWl0IChwaWQsICYgd2FpdF9zdGF0dXMsIDApOworICAKKyAgaWYgKHBpZCA9PSAtMSkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZmF0YWwgKF8oIndhaXQ6ICVzIiksIHN0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHdhaXRfc3RhdHVzKSkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZmF0YWwgKF8oInN1YnByb2Nlc3MgZ290IGZhdGFsIHNpZ25hbCAlZCIpLCBXVEVSTVNJRyAod2FpdF9zdGF0dXMpKTsKKyAgICB9CisgIGVsc2UgaWYgKFdJRkVYSVRFRCAod2FpdF9zdGF0dXMpKQorICAgIHsKKyAgICAgIGlmIChXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpICE9IDApCisJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwl3YXJuIChfKCIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIpLAorCSAgICAgIHdoYXQsIFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykpOworICAgIH0KKyAgZWxzZQorICAgIGFib3J0ICgpOworfQorCisvKiBMb29rIGZvciBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQgaW4gdGhlIC5kcmVjdHZlIHNlY3Rpb24gb2YKKyAgIEFCRkQuICBQYXNzIGVhY2ggb25lIHRvIGRlZl9leHBvcnRzLiAgKi8KKworc3RhdGljIHZvaWQKK3NjYW5fZHJlY3R2ZV9zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzZWN0aW9uICogczsKKyAgaW50ICAgICAgICBzaXplOworICBjaGFyICogICAgIGJ1ZjsKKyAgY2hhciAqICAgICBwOworICBjaGFyICogICAgIGU7CisgIAorICAvKiBMb29rIGZvciAuZHJlY3R2ZSdzICovCisgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kcmVjdHZlIik7CisgIAorICBpZiAocyA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgICAgIAorICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKKyAgYnVmICA9IHhtYWxsb2MgKHNpemUpOworCisgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmLCAwLCBzaXplKTsKKyAgICAgIAorICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICBpbmZvcm0gKF8oIlN1Y2tpbmcgaW4gaW5mbyBmcm9tIC5kcmVjdGl2ZSBzZWN0aW9uIGluICVzXG4iKSwKKwkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICAvKiBTZWFyY2ggZm9yIC1leHBvcnQ6IHN0cmluZ3MgKi8KKyAgcCA9IGJ1ZjsKKyAgZSA9IGJ1ZiArIHNpemU7CisgIHdoaWxlIChwIDwgZSkKKyAgICB7CisgICAgICBpZiAocFswXSA9PSAnLScKKwkgICYmIHN0cm5jbXAgKHAsICItZXhwb3J0OiIsIDgpID09IDApCisJeworCSAgY2hhciAqIG5hbWU7CisJICBjaGFyICogYzsKKwkgIAorCSAgcCArPSA4OworCSAgbmFtZSA9IHA7CisJICB3aGlsZSAocCA8IGUgJiYgKnAgIT0gJyAnICYmICpwICE9ICctJykKKwkgICAgcCsrOworCSAgYyA9IHhtYWxsb2MgKHAgLSBuYW1lICsgMSk7CisJICBtZW1jcHkgKGMsIG5hbWUsIHAgLSBuYW1lKTsKKwkgIGNbcCAtIG5hbWVdID0gMDsKKworCSAgLyogRklYTUU6IFRoZSA1dGggYXJnIGlzIGZvciB0aGUgYGNvbnN0YW50JyBmaWVsZC4KKwkgICAgIFdoYXQgc2hvdWxkIGl0IGJlPyAgTm90IHRoYXQgaXQgbWF0dGVycyBzaW5jZSBpdCdzIG5vdAorCSAgICAgY3VycmVudGx5IHVzZWZ1bC4gICovCisJICBkZWZfZXhwb3J0cyAoYywgMCwgLTEsIDAsIDAsIDApOworCisJICBpZiAoYWRkX3N0ZGNhbGxfYWxpYXMgJiYgc3RyY2hyIChjLCAnQCcpKQorCSAgICB7CisJICAgICAgY2hhciAqZXhwb3J0ZWRfbmFtZSA9IHhzdHJkdXAgKGMpOworCSAgICAgIGNoYXIgKmF0c3ltID0gc3RyY2hyIChleHBvcnRlZF9uYW1lLCAnQCcpOworCSAgICAgICphdHN5bSA9ICdcMCc7CisJICAgICAgZGVmX2V4cG9ydHMgKGV4cG9ydGVkX25hbWUsIHhzdHJkdXAgKGMpLCAtMSwgMCwgMCwgMCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJcCsrOworICAgIH0KKyAgZnJlZSAoYnVmKTsKK30KKworLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIGluIE1JTklTWU1TLCBhbmQgYWRkIGVhY2ggb25lIHRvIGxpc3Qgb2YKKyAgIHN5bWJvbHMgdG8gZXhwb3J0LiAgKi8KKworc3RhdGljIHZvaWQKK3NjYW5fZmlsdGVyZWRfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBtaW5pc3ltczsKKyAgICAgbG9uZyBzeW1jb3VudDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIGFzeW1ib2wgKnN0b3JlOworICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7CisKKyAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOworICBpZiAoc3RvcmUgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOworICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKKyAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltOworICAgICAgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7CisKKyAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZmFsc2UsIGZyb20sIHN0b3JlKTsKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICAgICAgc3ltYm9sX25hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOworICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gc3ltYm9sX25hbWVbMF0pCisJKytzeW1ib2xfbmFtZTsKKworICAgICAgZGVmX2V4cG9ydHMgKHhzdHJkdXAgKHN5bWJvbF9uYW1lKSAsIDAsIC0xLCAwLCAwLCAwKTsKKworICAgICAgaWYgKGFkZF9zdGRjYWxsX2FsaWFzICYmIHN0cmNociAoc3ltYm9sX25hbWUsICdAJykpCisgICAgICAgIHsKKwkgIGNoYXIgKmV4cG9ydGVkX25hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7CisJICBjaGFyICphdHN5bSA9IHN0cmNociAoZXhwb3J0ZWRfbmFtZSwgJ0AnKTsKKwkgICphdHN5bSA9ICdcMCc7CisJICBkZWZfZXhwb3J0cyAoZXhwb3J0ZWRfbmFtZSwgeHN0cmR1cCAoc3ltYm9sX25hbWUpLCAtMSwgMCwgMCwgMCk7CisJfQorICAgIH0KK30KKworLyogQWRkIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLworCitzdGF0aWMgdm9pZAorYWRkX2V4Y2x1ZGVzIChuZXdfZXhjbHVkZXMpCisgICAgIGNvbnN0IGNoYXIgKm5ld19leGNsdWRlczsKK3sKKyAgY2hhciAqbG9jYWxfY29weTsKKyAgY2hhciAqZXhjbHVkZV9zdHJpbmc7CisKKyAgbG9jYWxfY29weSA9IHhzdHJkdXAgKG5ld19leGNsdWRlcyk7CisKKyAgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKGxvY2FsX2NvcHksICIsOiIpOworICBmb3IgKDsgZXhjbHVkZV9zdHJpbmc7IGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChOVUxMLCAiLDoiKSkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5ld19leGNsdWRlOworICAgICAgCisgICAgICBuZXdfZXhjbHVkZSA9ICgoc3RydWN0IHN0cmluZ19saXN0ICopCisJCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2xpc3QpKSk7CisgICAgICBuZXdfZXhjbHVkZS0+c3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChleGNsdWRlX3N0cmluZykgKyAyKTsKKyAgICAgIC8qIEZJWE1FOiBJcyBpdCBhbHdheXMgcmlnaHQgdG8gYWRkIGEgbGVhZGluZyB1bmRlcnNjb3JlPyAgKi8KKyAgICAgIHNwcmludGYgKG5ld19leGNsdWRlLT5zdHJpbmcsICJfJXMiLCBleGNsdWRlX3N0cmluZyk7CisgICAgICBuZXdfZXhjbHVkZS0+bmV4dCA9IGV4Y2x1ZGVzOworICAgICAgZXhjbHVkZXMgPSBuZXdfZXhjbHVkZTsKKworICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGluZm9ybSAoXygiRXhjbHVkaW5nIHN5bWJvbDogJXNcbiIpLCBleGNsdWRlX3N0cmluZyk7CisgICAgfQorCisgIGZyZWUgKGxvY2FsX2NvcHkpOworfQorCisvKiBTZWUgaWYgU1RSSU5HIGlzIG9uIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4gICovCisKK3N0YXRpYyBib29sZWFuCittYXRjaF9leGNsdWRlIChzdHJpbmcpCisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IHN0cmluZ19saXN0ICpleGNsX2l0ZW07CisKKyAgZm9yIChleGNsX2l0ZW0gPSBleGNsdWRlczsgZXhjbF9pdGVtOyBleGNsX2l0ZW0gPSBleGNsX2l0ZW0tPm5leHQpCisgICAgaWYgKHN0cmNtcCAoc3RyaW5nLCBleGNsX2l0ZW0tPnN0cmluZykgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIEFkZCB0aGUgZGVmYXVsdCBsaXN0IG9mIHN5bWJvbHMgdG8gZXhjbHVkZS4gICovCisKK3N0YXRpYyB2b2lkCitzZXRfZGVmYXVsdF9leGNsdWRlcyAodm9pZCkKK3sKKyAgYWRkX2V4Y2x1ZGVzIChkZWZhdWx0X2V4Y2x1ZGVzKTsKK30KKworLyogQ2hvb3NlIHdoaWNoIHN5bWJvbHMgdG8gZXhwb3J0LiAgKi8KKworc3RhdGljIGxvbmcKK2ZpbHRlcl9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIG1pbmlzeW1zOworICAgICBsb25nIHN5bWNvdW50OworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kLCAqdG87CisgIGFzeW1ib2wgKnN0b3JlOworCisgIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKKyAgaWYgKHN0b3JlID09IE5VTEwpCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisKKyAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKKyAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7CisgIHRvID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOworCisgIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQorICAgIHsKKyAgICAgIGludCBrZWVwID0gMDsKKyAgICAgIGFzeW1ib2wgKnN5bTsKKworICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBmYWxzZSwgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOworICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgICAgICAvKiBDaGVjayBmb3IgZXh0ZXJuYWwgYW5kIGRlZmluZWQgb25seSBzeW1ib2xzLiAgKi8KKyAgICAgIGtlZXAgPSAoKChzeW0tPmZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAorCSAgICAgICB8fCAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwCisJICAgICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKKwkgICAgICAmJiAhIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7CisgICAgICAKKyAgICAgIGtlZXAgPSBrZWVwICYmICEgbWF0Y2hfZXhjbHVkZSAoc3ltLT5uYW1lKTsKKworICAgICAgaWYgKGtlZXApCisJeworCSAgbWVtY3B5ICh0bywgZnJvbSwgc2l6ZSk7CisJICB0byArPSBzaXplOworCX0KKyAgICB9CisKKyAgcmV0dXJuICh0byAtIChiZmRfYnl0ZSAqKSBtaW5pc3ltcykgLyBzaXplOworfQorCisvKiBFeHBvcnQgYWxsIHN5bWJvbHMgaW4gQUJGRCwgZXhjZXB0IGZvciBvbmVzIHdlIHdlcmUgdG9sZCBub3QgdG8KKyAgIGV4cG9ydC4gICovCisKK3N0YXRpYyB2b2lkCitzY2FuX2FsbF9zeW1ib2xzIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGxvbmcgc3ltY291bnQ7CisgIFBUUiBtaW5pc3ltczsKKyAgdW5zaWduZWQgaW50IHNpemU7CisKKyAgLyogSWdub3JlIGJmZHMgd2l0aCBhbiBpbXBvcnQgZGVzY3JpcHRvciB0YWJsZS4gIFdlIGFzc3VtZSB0aGF0IGFueQorICAgICBzdWNoIEJGRCBjb250YWlucyBzeW1ib2xzIHdoaWNoIGFyZSBleHBvcnRlZCBmcm9tIGFub3RoZXIgRExMLAorICAgICBhbmQgd2UgZG9uJ3Qgd2FudCB0byByZWV4cG9ydCB0aGVtIGZyb20gaGVyZS4gICovCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pZGF0YSQ0IikpCisgICAgcmV0dXJuOworCisgIGlmICghIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQorICAgIHsKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICB3YXJuIChfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3ltY291bnQgPSBiZmRfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZmFsc2UsICZtaW5pc3ltcywgJnNpemUpOworICBpZiAoc3ltY291bnQgPCAwKQorICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgIGlmIChzeW1jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICB3YXJuIChfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogRGlzY2FyZCB0aGUgc3ltYm9scyB3ZSBkb24ndCB3YW50IHRvIGV4cG9ydC4gIEl0J3MgT0sgdG8gZG8gdGhpcworICAgICBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkuICAqLworCisgIHN5bWNvdW50ID0gZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSk7CisgIHNjYW5fZmlsdGVyZWRfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKKworICBmcmVlIChtaW5pc3ltcyk7Cit9CisKKy8qIExvb2sgYXQgdGhlIG9iamVjdCBmaWxlIHRvIGRlY2lkZSB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gICovCisKK3N0YXRpYyB2b2lkCitzY2FuX29wZW5fb2JqX2ZpbGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGV4cG9ydF9hbGxfc3ltYm9scykKKyAgICBzY2FuX2FsbF9zeW1ib2xzIChhYmZkKTsKKyAgZWxzZQorICAgIHNjYW5fZHJlY3R2ZV9zeW1ib2xzIChhYmZkKTsKKyAKKyAgLyogRklYTUU6IHdlIG91Z2h0IHRvIHJlYWQgaW4gYW5kIGJsb2NrIG91dCB0aGUgYmFzZSByZWxvY2F0aW9ucyAqLworCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIGluZm9ybSAoXygiJXM6IERvbmUgcmVhZGluZyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKK30KKworc3RhdGljIHZvaWQKK3NjYW5fb2JqX2ZpbGUgKGZpbGVuYW1lKQorICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgYmZkICogZiA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIDApOworCisgIGlmICghZikKKyAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiKSwgZmlsZW5hbWUpOworCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIGluZm9ybSAoXygiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiKSwgZmlsZW5hbWUpOworICAKKyAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGYsIGJmZF9hcmNoaXZlKSkKKyAgICB7CisgICAgICBiZmQgKmFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYsIDApOworICAgICAgd2hpbGUgKGFyZmlsZSkKKwl7CisJICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYXJmaWxlLCBiZmRfb2JqZWN0KSkKKwkgICAgc2Nhbl9vcGVuX29ial9maWxlIChhcmZpbGUpOworCSAgYmZkX2Nsb3NlIChhcmZpbGUpOworCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZiwgYXJmaWxlKTsKKwl9CisgICAgfQorICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBzY2FuX29wZW5fb2JqX2ZpbGUgKGYpOworICAgIH0KKworICBiZmRfY2xvc2UgKGYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2R1bXBfZGVmX2luZm8gKGYpCisgICAgIEZJTEUgKmY7Cit7CisgIGludCBpOworICBleHBvcnRfdHlwZSAqZXhwOworICBmcHJpbnRmIChmLCAiJXMgIiwgQVNNX0MpOworICBmb3IgKGkgPSAwOyBvYXZbaV07IGkrKykKKyAgICBmcHJpbnRmIChmLCAiJXMgIiwgb2F2W2ldKTsKKyAgZnByaW50ZiAoZiwgIlxuIik7CisgIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiJXMgICVkID0gJXMgJXMgQCAlZCAlcyVzJXNcbiIsCisJICAgICAgIEFTTV9DLAorCSAgICAgICBpLAorCSAgICAgICBleHAtPm5hbWUsCisJICAgICAgIGV4cC0+aW50ZXJuYWxfbmFtZSwKKwkgICAgICAgZXhwLT5vcmRpbmFsLAorCSAgICAgICBleHAtPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAorCSAgICAgICBleHAtPmNvbnN0YW50ID8gIkNPTlNUQU5UIiA6ICIiLAorCSAgICAgICBleHAtPmRhdGEgPyAiREFUQSIgOiAiIik7CisgICAgfQorfQorCisvKiBHZW5lcmF0ZSB0aGUgLmV4cCBmaWxlICovCisKK3N0YXRpYyBpbnQKK3NmdW5jIChhLCBiKQorICAgICBjb25zdCB2b2lkICphOworICAgICBjb25zdCB2b2lkICpiOworeworICByZXR1cm4gKihjb25zdCBsb25nICopIGEgLSAqKGNvbnN0IGxvbmcgKikgYjsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX3BhZ2UgKGYsIG5lZWQsIHBhZ2VfYWRkciwgb25fcGFnZSkKKyAgICAgRklMRSAqZjsKKyAgICAgbG9uZyAqbmVlZDsKKyAgICAgaW50IHBhZ2VfYWRkcjsKKyAgICAgaW50IG9uX3BhZ2U7Cit7CisgIGludCBpOworCisgIC8qIEZsdXNoIHRoaXMgcGFnZSAqLworICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XHQlcyBTdGFydGluZyBSVkEgZm9yIGNodW5rXG4iLAorCSAgIEFTTV9MT05HLAorCSAgIHBhZ2VfYWRkciwKKwkgICBBU01fQyk7CisgIGZwcmludGYgKGYsICJcdCVzXHQweCV4XHQlcyBTaXplIG9mIGJsb2NrXG4iLAorCSAgIEFTTV9MT05HLAorCSAgIChvbl9wYWdlICogMikgKyAob25fcGFnZSAmIDEpICogMiArIDgsCisJICAgQVNNX0MpOworICBmb3IgKGkgPSAwOyBpIDwgb25fcGFnZTsgaSsrKQorICAgIHsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzXHQweCVseFxuIiwgQVNNX1NIT1JULCAobmVlZFtpXSAtIHBhZ2VfYWRkcikgfCAweDMwMDApOworICAgIH0KKyAgLyogQW5kIHBhZGRpbmcgKi8KKyAgaWYgKG9uX3BhZ2UgJiAxKQorICAgIGZwcmludGYgKGYsICJcdCVzXHQweCV4XG4iLCBBU01fU0hPUlQsIDAgfCAweDAwMDApOworfQorCitzdGF0aWMgdm9pZAorZ2VuX2RlZl9maWxlICgpCit7CisgIGludCBpOworICBleHBvcnRfdHlwZSAqZXhwOworCisgIGluZm9ybSAoXygiQWRkaW5nIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiKSk7CisgIAorICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiOyIpOworICBmb3IgKGkgPSAwOyBvYXZbaV07IGkrKykKKyAgICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiICVzIiwgb2F2W2ldKTsKKworICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXG5FWFBPUlRTXG4iKTsKKworICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCisgICAgeworICAgICAgY2hhciAqcXVvdGUgPSBzdHJjaHIgKGV4cC0+bmFtZSwgJy4nKSA/ICJcIiIgOiAiIjsKKyAgICAgIGNoYXIgKnJlcyA9IGNwbHVzX2RlbWFuZ2xlIChleHAtPmludGVybmFsX25hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKworICAgICAgaWYgKHN0cmNtcCAoZXhwLT5uYW1lLCBleHAtPmludGVybmFsX25hbWUpID09IDApCisgICAgICAgIHsKKworCSAgZnByaW50ZiAob3V0cHV0X2RlZiwgIlx0JXMlcyVzIEAgJWQlcyVzIDsgJXNcbiIsCisJCSAgIHF1b3RlLAorCQkgICBleHAtPm5hbWUsCisJCSAgIHF1b3RlLAorCQkgICBleHAtPm9yZGluYWwsCisJCSAgIGV4cC0+bm9uYW1lID8gIiBOT05BTUUiIDogIiIsCisJCSAgIGV4cC0+ZGF0YSA/ICIgREFUQSIgOiAiIiwKKwkJICAgcmVzID8gcmVzIDogIiIpOworCX0KKyAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpxdW90ZTEgPSBzdHJjaHIgKGV4cC0+aW50ZXJuYWxfbmFtZSwgJy4nKSA/ICJcIiIgOiAiIjsKKwkgIC8qIGNoYXIgKmFsaWFzID0gICovCisJICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXHQlcyVzJXMgPSAlcyVzJXMgQCAlZCVzJXMgOyAlc1xuIiwKKwkJICAgcXVvdGUsCisJCSAgIGV4cC0+bmFtZSwKKwkJICAgcXVvdGUsCisJCSAgIHF1b3RlMSwKKwkJICAgZXhwLT5pbnRlcm5hbF9uYW1lLAorCQkgICBxdW90ZTEsCisJCSAgIGV4cC0+b3JkaW5hbCwKKwkJICAgZXhwLT5ub25hbWUgPyAiIE5PTkFNRSIgOiAiIiwKKwkJICAgZXhwLT5kYXRhID8gIiBEQVRBIiA6ICIiLAorCQkgICByZXMgPyByZXMgOiAiIik7CisJfQorICAgICAgaWYgKHJlcykKKyAgICAgICAgZnJlZSAocmVzKTsKKyAgICB9CisgIAorICBpbmZvcm0gKF8oIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiKSk7Cit9CisKKy8qIGdlbmVyYXRlX2lkYXRhX29maWxlIGdlbmVyYXRlcyB0aGUgcG9ydGFibGUgYXNzZW1ibHkgc291cmNlIGNvZGUKKyAgIGZvciB0aGUgaWRhdGEgc2VjdGlvbnMuICBJdCBhcHBlbmRzIHRoZSBzb3VyY2UgY29kZSB0byB0aGUgZW5kIG9mCisgICB0aGUgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitnZW5lcmF0ZV9pZGF0YV9vZmlsZSAoZmlsdmFyKQorICAgICBGSUxFICpmaWx2YXI7Cit7CisgIGloZWFkdHlwZSAqaGVhZHB0cjsKKyAgaWZ1bmN0eXBlICpmdW5jcHRyOworICBpbnQgICAgICAgIGhlYWRpbmRleDsKKyAgaW50ICAgICAgICBmdW5jaW5kZXg7CisgIGludAkgICAgIG5oZWFkczsKKworICBpZiAoaW1wb3J0X2xpc3QgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZnByaW50ZiAoZmlsdmFyLCAiJXMgSW1wb3J0IGRhdGEgc2VjdGlvbnNcbiIsIEFTTV9DKTsKKyAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkMlxuIik7CisgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdGRvaV9pZGF0YVxuIiwgQVNNX0dMT0JBTCk7CisgIGZwcmludGYgKGZpbHZhciwgImRvaV9pZGF0YTpcbiIpOworCisgIG5oZWFkcyA9IDA7CisgIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQorICAgIHsKKyAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNsaXN0b25lJWQlc1x0JXMgJXNcbiIsCisJICAgICAgIEFTTV9SVkFfQkVGT1JFLCBuaGVhZHMsIEFTTV9SVkFfQUZURVIsCisJICAgICAgIEFTTV9DLCBoZWFkcHRyLT5kbGxuYW1lKTsKKyAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKKyAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKKyAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNkbGxuYW1lJWQlc1xuIiwKKwkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUik7CisgICAgICBmcHJpbnRmIChmaWx2YXIsICJcdCVzbGlzdHR3byVkJXNcblxuIiwKKwkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUik7CisgICAgICBuaGVhZHMrKzsKKyAgICB9CisKKyAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHJlY29yZCBhdCAqLworICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIGVuZCBvZiBpZGF0YSQyICovCisgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogc2VjdGlvbiAgICAgICAgKi8KKyAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOworICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisKKyAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNFxuIik7CisgIGhlYWRpbmRleCA9IDA7CisgIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQorICAgIHsKKyAgICAgIGZwcmludGYgKGZpbHZhciwgImxpc3RvbmUlZDpcbiIsIGhlYWRpbmRleCk7CisgICAgICBmb3IgKCBmdW5jaW5kZXggPSAwOyBmdW5jaW5kZXggPCBoZWFkcHRyLT5uZnVuY3M7IGZ1bmNpbmRleCsrICkKKwlmcHJpbnRmIChmaWx2YXIsICJcdCVzZnVuY3B0ciVkXyVkJXNcbiIsCisJCSBBU01fUlZBX0JFRk9SRSwgaGVhZGluZGV4LCBmdW5jaW5kZXgsIEFTTV9SVkFfQUZURVIpOworICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgdGVybWluYXRpbmcgbGlzdCAqLworICAgICAgaGVhZGluZGV4Kys7CisgICAgfQorCisgIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDVcbiIpOworICBoZWFkaW5kZXggPSAwOworICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKKyAgICB7CisgICAgICBmcHJpbnRmIChmaWx2YXIsICJsaXN0dHdvJWQ6XG4iLCBoZWFkaW5kZXgpOworICAgICAgZm9yICggZnVuY2luZGV4ID0gMDsgZnVuY2luZGV4IDwgaGVhZHB0ci0+bmZ1bmNzOyBmdW5jaW5kZXgrKyApCisJZnByaW50ZiAoZmlsdmFyLCAiXHQlc2Z1bmNwdHIlZF8lZCVzXG4iLAorCQkgQVNNX1JWQV9CRUZPUkUsIGhlYWRpbmRleCwgZnVuY2luZGV4LCBBU01fUlZBX0FGVEVSKTsKKyAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCB0ZXJtaW5hdGluZyBsaXN0ICovCisgICAgICBoZWFkaW5kZXgrKzsKKyAgICB9CisKKyAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNlxuIik7CisgIGhlYWRpbmRleCA9IDA7CisgIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQorICAgIHsKKyAgICAgIGZ1bmNpbmRleCA9IDA7CisgICAgICBmb3IgKGZ1bmNwdHIgPSBoZWFkcHRyLT5mdW5jaGVhZDsgZnVuY3B0ciAhPSBOVUxMOworCSAgIGZ1bmNwdHIgPSBmdW5jcHRyLT5uZXh0KQorCXsKKwkgIGZwcmludGYgKGZpbHZhciwiZnVuY3B0ciVkXyVkOlxuIiwgaGVhZGluZGV4LCBmdW5jaW5kZXgpOworCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQlZFxuIiwgQVNNX1NIT1JULAorCQkgICAoKGZ1bmNwdHItPm9yZCkgJiAweEZGRkYpKTsKKwkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0XCIlc1wiXG4iLCBBU01fVEVYVCwgZnVuY3B0ci0+bmFtZSk7CisJICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9CWVRFKTsKKwkgIGZ1bmNpbmRleCsrOworCX0KKyAgICAgIGhlYWRpbmRleCsrOworICAgIH0KKworICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ3XG4iKTsKKyAgaGVhZGluZGV4ID0gMDsKKyAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCisgICAgeworICAgICAgZnByaW50ZiAoZmlsdmFyLCJkbGxuYW1lJWQ6XG4iLCBoZWFkaW5kZXgpOworICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBoZWFkcHRyLT5kbGxuYW1lKTsKKyAgICAgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0JZVEUpOworICAgICAgaGVhZGluZGV4Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZ2VuX2V4cF9maWxlICgpCit7CisgIEZJTEUgKmY7CisgIGludCBpOworICBleHBvcnRfdHlwZSAqZXhwOworICBkbGlzdF90eXBlICpkbDsKKworICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICBpbmZvcm0gKF8oIkdlbmVyYXRpbmcgZXhwb3J0IGZpbGU6ICVzXG4iKSwgZXhwX25hbWUpOworICAKKyAgZiA9IGZvcGVuIChUTVBfQVNNLCBGT1BFTl9XVCk7CisgIGlmICghZikKKyAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIiksIFRNUF9BU00pOworICAKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgaW5mb3JtIChfKCJPcGVuZWQgdGVtcG9yYXJ5IGZpbGU6ICVzIiksIFRNUF9BU00pOworCisgIGR1bXBfZGVmX2luZm8gKGYpOworICAKKyAgaWYgKGRfZXhwb3J0cykKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuZWRhdGFcblxuIik7CisgICAgICBmcHJpbnRmIChmLCAiXHQlcwkwCSVzIEFsbHdheXMgMFxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzCTB4JWx4CSVzIFRpbWUgYW5kIGRhdGVcbiIsIEFTTV9MT05HLCAobG9uZykgdGltZSgwKSwKKwkgICAgICAgQVNNX0MpOworICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMAklcyBNYWpvciBhbmQgTWlub3IgdmVyc2lvblxuIiwgQVNNX0xPTkcsIEFTTV9DKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzbmFtZSVzCSVzIFB0ciB0byBuYW1lIG9mIGRsbFxuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIFN0YXJ0aW5nIG9yZGluYWwgb2YgZXhwb3J0c1xuIiwgQVNNX0xPTkcsIGRfbG93X29yZCwgQVNNX0MpOworCisKKyAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIE51bWJlciBvZiBmdW5jdGlvbnNcbiIsIEFTTV9MT05HLCBkX2hpZ2hfb3JkIC0gZF9sb3dfb3JkICsgMSwgQVNNX0MpOworICAgICAgZnByaW50ZihmLCJcdCVzIG5hbWVkIGZ1bmNzICVkLCBsb3cgb3JkICVkLCBoaWdoIG9yZCAlZFxuIiwKKwkgICAgICBBU01fQywKKwkgICAgICBkX25hbWVkX25mdW5jcywgZF9sb3dfb3JkLCBkX2hpZ2hfb3JkKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzCSVkCSVzIE51bWJlciBvZiBuYW1lc1xuIiwgQVNNX0xPTkcsCisJICAgICAgIHNob3dfYWxsbmFtZXMgPyBkX2hpZ2hfb3JkIC0gZF9sb3dfb3JkICsgMSA6IGRfbmFtZWRfbmZ1bmNzLCBBU01fQyk7CisgICAgICBmcHJpbnRmIChmLCAiXHQlc2FmdW5jcyVzICAlcyBBZGRyZXNzIG9mIGZ1bmN0aW9uc1xuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKKworICAgICAgZnByaW50ZiAoZiwgIlx0JXNhbmFtZXMlcwklcyBBZGRyZXNzIG9mIE5hbWUgUG9pbnRlciBUYWJsZVxuIiwKKwkgICAgICAgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKKworICAgICAgZnByaW50ZiAoZiwgIlx0JXNhbm9yZHMlcwklcyBBZGRyZXNzIG9mIG9yZGluYWxzXG4iLCBBU01fUlZBX0JFRk9SRSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MpOworCisgICAgICBmcHJpbnRmIChmLCAibmFtZToJJXMJXCIlc1wiXG4iLCBBU01fVEVYVCwgZGxsX25hbWUpOworCisKKyAgICAgIGZwcmludGYoZiwiJXMgRXhwb3J0IGFkZHJlc3MgVGFibGVcbiIsIEFTTV9DKTsKKyAgICAgIGZwcmludGYoZiwiXHQlc1xuIiwgQVNNX0FMSUdOX0xPTkcpOworICAgICAgZnByaW50ZiAoZiwgImFmdW5jczpcbiIpOworICAgICAgaSA9IGRfbG93X29yZDsKKworICAgICAgZm9yIChleHAgPSBkX2V4cG9ydHM7IGV4cDsgZXhwID0gZXhwLT5uZXh0KQorCXsKKwkgIGlmIChleHAtPm9yZGluYWwgIT0gaSkKKwkgICAgeworI2lmIDAKKwkgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JWRcdCVzICVkLi4lZCBtaXNzaW5nXG4iLAorCQkgICAgICAgQVNNX1NQQUNFLAorCQkgICAgICAgKGV4cC0+b3JkaW5hbCAtIGkpICogNCwKKwkJICAgICAgIEFTTV9DLAorCQkgICAgICAgaSwgZXhwLT5vcmRpbmFsIC0gMSk7CisJICAgICAgaSA9IGV4cC0+b3JkaW5hbDsKKyNlbmRpZgorCSAgICAgIHdoaWxlIChpIDwgZXhwLT5vcmRpbmFsKQorCQl7CisJCSAgZnByaW50ZihmLCJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisJCSAgaSsrOworCQl9CisJICAgIH0KKwkgIGZwcmludGYgKGYsICJcdCVzJXMlcyVzXHQlcyAlZFxuIiwgQVNNX1JWQV9CRUZPUkUsCisJCSAgIEFTTV9QUkVGSVgsCisJCSAgIGV4cC0+aW50ZXJuYWxfbmFtZSwgQVNNX1JWQV9BRlRFUiwgQVNNX0MsIGV4cC0+b3JkaW5hbCk7CisJICBpKys7CisJfQorCisgICAgICBmcHJpbnRmIChmLCIlcyBFeHBvcnQgTmFtZSBQb2ludGVyIFRhYmxlXG4iLCBBU01fQyk7CisgICAgICBmcHJpbnRmIChmLCAiYW5hbWVzOlxuIik7CisKKyAgICAgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQorCXsKKwkgIGlmICghZXhwLT5ub25hbWUgfHwgc2hvd19hbGxuYW1lcykKKwkgICAgZnByaW50ZiAoZiwgIlx0JXNuJWQlc1xuIiwKKwkJICAgICBBU01fUlZBX0JFRk9SRSwgZXhwLT5vcmRpbmFsLCBBU01fUlZBX0FGVEVSKTsKKwl9CisKKyAgICAgIGZwcmludGYgKGYsIiVzIEV4cG9ydCBPcmlkaW5hbCBUYWJsZVxuIiwgQVNNX0MpOworICAgICAgZnByaW50ZiAoZiwgImFub3JkczpcbiIpOworICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCisJeworCSAgaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQorCSAgICBmcHJpbnRmIChmLCAiXHQlcwklZFxuIiwgQVNNX1NIT1JULCBleHAtPm9yZGluYWwgLSBkX2xvd19vcmQpOworCX0KKworICAgICAgZnByaW50ZihmLCIlcyBFeHBvcnQgTmFtZSBUYWJsZVxuIiwgQVNNX0MpOworICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCisJaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQorCSAgZnByaW50ZiAoZiwgIm4lZDoJJXMJXCIlc1wiXG4iLAorCQkgICBleHAtPm9yZGluYWwsIEFTTV9URVhULCBleHAtPm5hbWUpOworCisgICAgICBpZiAoYV9saXN0KQorCXsKKwkgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uIC5kcmVjdHZlXG4iKTsKKwkgIGZvciAoZGwgPSBhX2xpc3Q7IGRsOyBkbCA9IGRsLT5uZXh0KQorCSAgICB7CisJICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsLT50ZXh0KTsKKwkgICAgfQorCX0KKyAgICAgIGlmIChkX2xpc3QpCisJeworCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24gLnJkYXRhXG4iKTsKKwkgIGZvciAoZGwgPSBkX2xpc3Q7IGRsOyBkbCA9IGRsLT5uZXh0KQorCSAgICB7CisJICAgICAgY2hhciAqcDsKKwkgICAgICBpbnQgbDsKKwkgICAgICAvKiBXZSBkb250IG91dHB1dCBhcyBhc2NpaSAnY2F1c2UgdGhlcmUgY2FuCisJICAgICAgICAgYmUgcXVvdGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nICovCisKKwkgICAgICBsID0gMDsKKwkgICAgICBmb3IgKHAgPSBkbC0+dGV4dDsgKnA7IHArKykKKwkJeworCQkgIGlmIChsID09IDApCisJCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0IiwgQVNNX0JZVEUpOworCQkgIGVsc2UKKwkJICAgIGZwcmludGYgKGYsICIsIik7CisJCSAgZnByaW50ZiAoZiwgIiVkIiwgKnApOworCQkgIGlmIChwWzFdID09IDApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYgKGYsICIsMFxuIik7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGlmICgrK2wgPT0gMTApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYgKGYsICJcbiIpOworCQkgICAgICBsID0gMDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworCisgIC8qIEFkZCB0byB0aGUgb3V0cHV0IGZpbGUgYSB3YXkgb2YgZ2V0dGluZyB0byB0aGUgZXhwb3J0ZWQgbmFtZXMKKyAgICAgd2l0aG91dCB1c2luZyB0aGUgaW1wb3J0IGxpYnJhcnkuICovCisgIGlmIChhZGRfaW5kaXJlY3QpCisgICAgeworICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5yZGF0YVxuIik7CisgICAgICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCisJaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQorCSAgeworCSAgICAvKiBXZSB1c2UgYSBzaW5nbGUgdW5kZXJzY29yZSBmb3IgTVMgY29tcGF0aWJpbGl0eSwgYW5kIGEKKyAgICAgICAgICAgICAgIGRvdWJsZSB1bmRlcnNjb3JlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkCisgICAgICAgICAgICAgICBjeWd3aW4gcmVsZWFzZXMuICAqLworCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9HTE9CQUwsIGV4cC0+bmFtZSk7CisJICAgIGZwcmludGYgKGYsICJcdCVzXHRfaW1wX18lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKKwkgICAgZnByaW50ZiAoZiwgIl9faW1wXyVzOlxuIiwgZXhwLT5uYW1lKTsKKwkgICAgZnByaW50ZiAoZiwgIl9pbXBfXyVzOlxuIiwgZXhwLT5uYW1lKTsKKwkgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVzXG4iLCBBU01fTE9ORywgZXhwLT5uYW1lKTsKKwkgIH0KKyAgICB9CisKKyAgLyogRHVtcCB0aGUgcmVsb2Mgc2VjdGlvbiBpZiBhIGJhc2UgZmlsZSBpcyBwcm92aWRlZCAqLworICBpZiAoYmFzZV9maWxlKQorICAgIHsKKyAgICAgIGludCBhZGRyOworICAgICAgbG9uZyBuZWVkW1BBR0VfU0laRV07CisgICAgICBsb25nIHBhZ2VfYWRkcjsKKyAgICAgIGludCBudW1ieXRlczsKKyAgICAgIGludCBudW1fZW50cmllczsKKyAgICAgIGxvbmcgKmNvcHk7CisgICAgICBpbnQgajsKKyAgICAgIGludCBvbl9wYWdlOworICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pbml0XG4iKTsKKyAgICAgIGZwcmludGYgKGYsICJsYWI6XG4iKTsKKworICAgICAgZnNlZWsgKGJhc2VfZmlsZSwgMCwgU0VFS19FTkQpOworICAgICAgbnVtYnl0ZXMgPSBmdGVsbCAoYmFzZV9maWxlKTsKKyAgICAgIGZzZWVrIChiYXNlX2ZpbGUsIDAsIFNFRUtfU0VUKTsKKyAgICAgIGNvcHkgPSB4bWFsbG9jIChudW1ieXRlcyk7CisgICAgICBmcmVhZCAoY29weSwgMSwgbnVtYnl0ZXMsIGJhc2VfZmlsZSk7CisgICAgICBudW1fZW50cmllcyA9IG51bWJ5dGVzIC8gc2l6ZW9mIChsb25nKTsKKworCisgICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LnJlbG9jXG4iKTsKKyAgICAgIGlmIChudW1fZW50cmllcykKKwl7CisJICBpbnQgc3JjOworCSAgaW50IGRzdCA9IDA7CisJICBpbnQgbGFzdCA9IC0xOworCSAgaW50IHRvdHNpemUgPSAwOworCisJICBxc29ydCAoY29weSwgbnVtX2VudHJpZXMsIHNpemVvZiAobG9uZyksIHNmdW5jKTsKKwkgIC8qIERlbGV0ZSBkdXBsY2F0ZXMgKi8KKwkgIGZvciAoc3JjID0gMDsgc3JjIDwgbnVtX2VudHJpZXM7IHNyYysrKQorCSAgICB7CisJICAgICAgaWYgKGxhc3QgIT0gY29weVtzcmNdKQorCQlsYXN0ID0gY29weVtkc3QrK10gPSBjb3B5W3NyY107CisJICAgIH0KKwkgIG51bV9lbnRyaWVzID0gZHN0OworCSAgYWRkciA9IGNvcHlbMF07CisJICBwYWdlX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwkJLyogd29yayBvdXQgdGhlIHBhZ2UgYWRkciAqLworCSAgb25fcGFnZSA9IDA7CisJICBmb3IgKGogPSAwOyBqIDwgbnVtX2VudHJpZXM7IGorKykKKwkgICAgeworCSAgICAgIHRvdHNpemUgKz0gMjsKKwkgICAgICBhZGRyID0gY29weVtqXTsKKwkgICAgICBpZiAoKGFkZHIgJiBQQUdFX01BU0spICE9IHBhZ2VfYWRkcikKKwkJeworCQkgIHRvdHNpemUgKz0gOCArIChvbl9wYWdlICYgMSkqMjsKKwkJICBmbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpOworCQkgIG9uX3BhZ2UgPSAwOworCQkgIHBhZ2VfYWRkciA9IGFkZHIgJiBQQUdFX01BU0s7CisJCX0KKwkgICAgICBuZWVkW29uX3BhZ2UrK10gPSBhZGRyOworCSAgICB9CisKKwkgIC8qIFBhZCB0aGUgc2VjdGlvbiB0byBhbiBldmVuIDMyLWJ5dGUgYm91bmRhcnkuICBUaGlzIHdpbGwgbWFrZQorCSAgICAgdGhlIEJlT1MgbG9hZGVyIG11Y2ggaGFwcGllciwgYW5kIHNob3VsZG4ndCBtYXR0ZXIgZm9yIG90aGVyCisJICAgICBPU2VzLiAqLworCSAgd2hpbGUgKCh0b3RzaXplICsgOCArIChvbl9wYWdlICYgMSkqMikgJSAzMiAhPSAwKQorCSAgICB7CisJICAgICAgLyogMHgwMDAwIGlzIGFuIGFic29sdXRlIHJlbG9jYXRpb24gdGhhdCBzaG91bGQgYmUgaWdub3JlZC4gICovCisJICAgICAgbmVlZFtvbl9wYWdlKytdID0gMHgwMDAwOworCSAgICAgIHRvdHNpemUgKz0gMjsKKwkgICAgfQorCisJICBmbHVzaF9wYWdlIChmLCBuZWVkLCBwYWdlX2FkZHIsIG9uX3BhZ2UpOworCisJICAvKiBmcHJpbnRmIChmLCAiXHQlc1x0MCwwXHQlcyBFbmRcbiIsIEFTTV9MT05HLCBBU01fQyk7Ki8KKwl9CisgICAgfQorCisgIGdlbmVyYXRlX2lkYXRhX29maWxlIChmKTsKKworICBmY2xvc2UgKGYpOworCisgIC8qIGFzc2VtYmxlIHRoZSBmaWxlICovCisgIHNwcmludGYgKG91dGZpbGUsICIlcyAtbyAlcyAlcyIsIGFzX2ZsYWdzLCBleHBfbmFtZSwgVE1QX0FTTSk7CisKKyNpZmRlZiBETExUT09MX0FSTQorICBpZiAoaW50ZXJ3b3JrKQorICAgIHN0cmNhdCAob3V0ZmlsZSwgIiAtbXRodW1iLWludGVyd29yayIpOworI2VuZGlmCisgIAorICBydW4gKGFzX25hbWUsIG91dGZpbGUpOworICAKKyAgaWYgKGRvbnRkZWx0ZW1wcyA9PSAwKQorICAgIHVubGluayAoVE1QX0FTTSk7CisgIAorICBpbmZvcm0gKF8oIkdlbmVyYXRlZCBleHBvcnRzIGZpbGUiKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3hsYXRlIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpZiAoYWRkX3VuZGVyc2NvcmUpCisgICAgeworICAgICAgY2hhciAqY29weSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyKTsKKyAgICAgIGNvcHlbMF0gPSAnXyc7CisgICAgICBzdHJjcHkgKGNvcHkgKyAxLCBuYW1lKTsKKyAgICAgIG5hbWUgPSBjb3B5OworICAgIH0KKworICBpZiAoa2lsbGF0KQorICAgIHsKKyAgICAgIGNoYXIgKnA7CisgICAgICBwID0gc3RyY2hyIChuYW1lLCAnQCcpOworICAgICAgaWYgKHApCisJKnAgPSAwOworICAgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorCitzdGF0aWMgdm9pZAorZHVtcF9pYXQgKGYsIGV4cCkKKyAgICAgRklMRSAqZjsKKyAgICAgZXhwb3J0X3R5cGUgKmV4cDsKK3sKKyAgaWYgKGV4cC0+bm9uYW1lICYmICFzaG93X2FsbG5hbWVzICkKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XG4iLAorCSAgICAgICBBU01fTE9ORywKKwkgICAgICAgZXhwLT5vcmRpbmFsIHwgMHg4MDAwMDAwMCk7IC8qIGhpbnQgb3Igb3JpbmRhbCA/PyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzSUQlZCVzXG4iLCBBU01fUlZBX0JFRk9SRSwKKwkgICAgICAgZXhwLT5vcmRpbmFsLAorCSAgICAgICBBU01fUlZBX0FGVEVSKTsKKyAgICB9Cit9CisKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgaWQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCBmbGFnczsKKyAgaW50IGFsaWduOworICBhc2VjdGlvbiAqc2VjOworICBhc3ltYm9sICpzeW07CisgIGFzeW1ib2wgKipzeW1wcDsKKyAgaW50IHNpemU7CisgIHVuc2lnbmVkICAgY2hhciAqZGF0YTsKK30gc2luZm87CisKKyNpZm5kZWYgRExMVE9PTF9QUEMKKworI2RlZmluZSBURVhUIDAKKyNkZWZpbmUgREFUQSAxCisjZGVmaW5lIEJTUyAyCisjZGVmaW5lIElEQVRBNyAzCisjZGVmaW5lIElEQVRBNSA0CisjZGVmaW5lIElEQVRBNCA1CisjZGVmaW5lIElEQVRBNiA2CisKKyNkZWZpbmUgTlNFQ1MgNworCitzdGF0aWMgc2luZm8gc2VjZGF0YVtOU0VDU10gPQoreworICB7IFRFWFQsICAgIi50ZXh0IiwgICAgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTLCAyfSwKKyAgeyBEQVRBLCAgICIuZGF0YSIsICAgIFNFQ19EQVRBLCAgICAgICAgICAgICAgICAgICAgMn0sCisgIHsgQlNTLCAgICAiLmJzcyIsICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDJ9LAorICB7IElEQVRBNywgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKKyAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCisgIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAorICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfQorfTsKKworI2Vsc2UKKworLyogU2VjdGlvbnMgbnVtYmVyZWQgdG8gbWFrZSB0aGUgb3JkZXIgdGhlIHNhbWUgYXMgb3RoZXIgUG93ZXJQQyBOVCAgICAqLworLyogY29tcGlsZXJzLiBUaGlzIGFsc28ga2VlcHMgZnVubnkgYWxpZ25tZW50IHRoaW5naWVzIGZyb20gaGFwcGVuaW5nLiAqLworI2RlZmluZSBURVhUICAgMAorI2RlZmluZSBQREFUQSAgMQorI2RlZmluZSBSREFUQSAgMgorI2RlZmluZSBJREFUQTUgMworI2RlZmluZSBJREFUQTQgNAorI2RlZmluZSBJREFUQTYgNQorI2RlZmluZSBJREFUQTcgNgorI2RlZmluZSBEQVRBICAgNworI2RlZmluZSBCU1MgICAgOAorCisjZGVmaW5lIE5TRUNTIDkKKworc3RhdGljIHNpbmZvIHNlY2RhdGFbTlNFQ1NdID0KK3sKKyAgeyBURVhULCAgICIudGV4dCIsICAgIFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUywgM30sCisgIHsgUERBVEEsICAiLnBkYXRhIiwgICBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAorICB7IFJEQVRBLCAgIi5yZWxkYXRhIiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKKyAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCisgIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAorICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfSwKKyAgeyBJREFUQTcsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCisgIHsgREFUQSwgICAiLmRhdGEiLCAgICBTRUNfREFUQSwgICAgICAgICAgICAgICAgICAgIDJ9LAorICB7IEJTUywgICAgIi5ic3MiLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAyfQorfTsKKworI2VuZGlmCisKKy8qCitUaGlzIGlzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIG1ha2UuICBXZSBnZW5lcmF0ZSB0aGUgaW1wIHN5bWJvbHMgd2l0aAorYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB1bmRlcnNjb3JlcywgZm9yIGNvbXBhdGliaWxpdHkuCisKKwkudGV4dAorCS5nbG9iYWwJX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKKwkuZ2xvYmFsCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKK19HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4OgorCWptcCAqCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKKwkuc2VjdGlvbgkuaWRhdGEkNwkjIFRvIGZvcmNlIGxvYWRpbmcgb2YgaGVhZAorCS5sb25nCV9fdmVyc2lvbl9hX2hlYWQKKyMgSW1wb3J0IEFkZHJlc3MgVGFibGUKKwkuc2VjdGlvbgkuaWRhdGEkNQorX19pbXBfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAODoKKwkucnZhCUlEMgorCisjIEltcG9ydCBMb29rdXAgVGFibGUKKwkuc2VjdGlvbgkuaWRhdGEkNAorCS5ydmEJSUQyCisjIEhpbnQvTmFtZSB0YWJsZQorCS5zZWN0aW9uCS5pZGF0YSQ2CitJRDI6CS5zaG9ydAkyCisJLmFzY2l6CSJHZXRGaWxlVmVyc2lvbkluZm9TaXplVyIKKworCitGb3IgdGhlIFBvd2VyUEMsIGhlcmUncyB0aGUgdmFyaWF0aW9uIG9uIHRoZSBhYm92ZSBzY2hlbWU6CisKKyMgUmF0aGVyIHRoYW4gYSBzaW1wbGUgImptcCAqIiwgdGhlIGNvZGUgdG8gZ2V0IHRvIHRoZSBkbGwgZnVuY3Rpb24KKyMgbG9va3MgbGlrZToKKyAgICAgICAgIC50ZXh0CisgICAgICAgICBsd3oJcjExLFt0b2N2XV9faW1wX2Z1bmN0aW9uX25hbWUocjIpCisjCQkgICBSRUxPQzogMDAwMDAwMDAgVE9DUkVMMTYsVE9DREVGTiBfX2ltcF9mdW5jdGlvbl9uYW1lCisgICAgICAgICBsd3oJcjEyLDAocjExKQorCSBzdHcJcjIsNChyMSkKKwkgbXRjdHIJcjEyCisJIGx3eglyMiw0KHIxMSkKKwkgYmN0cgorKi8KKworc3RhdGljIGNoYXIgKgorbWFrZV9sYWJlbCAocHJlZml4LCBuYW1lKQorICAgICBjb25zdCBjaGFyICpwcmVmaXg7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGludCBsZW4gPSBzdHJsZW4gKEFTTV9QUkVGSVgpICsgc3RybGVuIChwcmVmaXgpICsgc3RybGVuIChuYW1lKTsKKyAgY2hhciAqY29weSA9IHhtYWxsb2MgKGxlbiArMSApOworICBzdHJjcHkgKGNvcHksIEFTTV9QUkVGSVgpOworICBzdHJjYXQgKGNvcHksIHByZWZpeCk7CisgIHN0cmNhdCAoY29weSwgbmFtZSk7CisgIHJldHVybiBjb3B5OworfQorCitzdGF0aWMgYmZkICoKK21ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpCisgICAgIGV4cG9ydF90eXBlICpleHA7CisgICAgIGludCBpOworeworI2lmIDAKKyAgICB7CisgICAgICBGSUxFICpmOworICAgICAgY2hhciAqcHJlZml4PSJkIjsKKyAgICAgIHNwcmludGYgKG91dGZpbGUsICIlc3MlMDVkLnMiLCBwcmVmaXgsIGkpOworICAgICAgZiA9IGZvcGVuIChvdXRmaWxlLCBGT1BFTl9XVCk7CisgICAgICBmcHJpbnRmIChmLCAiXHQudGV4dFxuIik7CisgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JXMlc1xuIiwgQVNNX0dMT0JBTCwgQVNNX1BSRUZJWCwgZXhwLT5uYW1lKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzXHRfX2ltcF8lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzXHRfaW1wX18lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKKyAgICAgIGZwcmludGYgKGYsICIlcyVzOlxuXHQlc1x0X19pbXBfJXNcbiIsIEFTTV9QUkVGSVgsCisJICAgICAgIGV4cC0+bmFtZSwgQVNNX0pVTVAsIGV4cC0+bmFtZSk7CisKKyAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkN1x0JXMgVG8gZm9yY2UgbG9hZGluZyBvZiBoZWFkXG4iLCBBU01fQyk7CisgICAgICBmcHJpbnRmIChmLCAiXHQlc1x0JXNcbiIsIEFTTV9MT05HLCBoZWFkX2xhYmVsKTsKKworCisgICAgICBmcHJpbnRmIChmLCIlcyBJbXBvcnQgQWRkcmVzcyBUYWJsZVxuIiwgQVNNX0MpOworCisgICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNVxuIik7CisgICAgICBmcHJpbnRmIChmLCAiX19pbXBfJXM6XG4iLCBleHAtPm5hbWUpOworICAgICAgZnByaW50ZiAoZiwgIl9pbXBfXyVzOlxuIiwgZXhwLT5uYW1lKTsKKworICAgICAgZHVtcF9pYXQgKGYsIGV4cCk7CisKKyAgICAgIGZwcmludGYgKGYsICJcbiVzIEltcG9ydCBMb29rdXAgVGFibGVcbiIsIEFTTV9DKTsKKyAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ0XG4iKTsKKworICAgICAgZHVtcF9pYXQgKGYsIGV4cCk7CisKKyAgICAgIGlmKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQorCXsKKwkgIGZwcmludGYgKGYsICIlcyBIaW50L05hbWUgdGFibGVcbiIsIEFTTV9DKTsKKwkgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ2XG4iKTsKKwkgIGZwcmludGYgKGYsICJJRCVkOlx0JXNcdCVkXG4iLCBleHAtPm9yZGluYWwsIEFTTV9TSE9SVCwgZXhwLT5oaW50KTsKKwkgIGZwcmludGYgKGYsICJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCB4bGF0ZSAoZXhwLT5uYW1lKSk7CisJfQorCisgICAgICBmY2xvc2UgKGYpOworCisgICAgICBzcHJpbnRmIChvdXRmaWxlLCAiJXMgLW8gJXNzJTA1ZC5vICVzcyVkLnMiLAorCSAgICAgICBhc19mbGFncywgcHJlZml4LCBpLCBwcmVmaXgsIGkpOworCisjaWZkZWYgRExMVE9PTF9BUk0KKyAgICAgIGlmIChpbnRlcndvcmspCisJc3RyY2F0IChvdXRmaWxlLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7CisjZW5kaWYKKyAgCisgICAgICBydW4gKGFzX25hbWUsIG91dGZpbGUpOworICAgIH0KKyNlbHNlIC8qIGlmIDAgKi8KKyAgICB7CisgICAgICBiZmQgKiAgICAgIGFiZmQ7CisgICAgICBhc3ltYm9sICogIGV4cF9sYWJlbDsKKyAgICAgIGFzeW1ib2wgKiAgaW5hbWU7CisgICAgICBhc3ltYm9sICogIGluYW1lMjsKKyAgICAgIGFzeW1ib2wgKiAgaW5hbWVfbGFiOworICAgICAgYXN5bWJvbCAqKiBpbmFtZV9sYWJfcHA7CisgICAgICBhc3ltYm9sICoqIGluYW1lX3BwOworI2lmZGVmIERMTFRPT0xfUFBDCisgICAgICBhc3ltYm9sICoqIGZuX3BwOworICAgICAgYXN5bWJvbCAqKiB0b2NfcHA7CisjZGVmaW5lIEVYVFJBCSAyCisjZW5kaWYKKyNpZm5kZWYgRVhUUkEKKyNkZWZpbmUgRVhUUkEgICAgMAorI2VuZGlmCisgICAgICBhc3ltYm9sICogIHB0cnNbTlNFQ1MgKyA0ICsgRVhUUkEgKyAxXTsKKworICAgICAgY2hhciAqICAgICBvdXRuYW1lID0geG1hbGxvYyAoMTApOworICAgICAgaW50ICAgICAgICBvaWR4ID0gMDsKKworICAgICAgCisgICAgICBzcHJpbnRmIChvdXRuYW1lLCAiJXMlMDVkLm8iLCBUTVBfU1RVQiwgaSk7CisgICAgICAKKyAgICAgIGFiZmQgPSBiZmRfb3BlbncgKG91dG5hbWUsIEhPV19CRkRfVEFSR0VUKTsKKyAgICAgIAorICAgICAgaWYgKCFhYmZkKQorCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJZmF0YWwgKF8oImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiKSwgb3V0bmFtZSk7CisKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBpbmZvcm0gKF8oIkNyZWF0aW5nIHN0dWIgZmlsZTogJXMiKSwgb3V0bmFtZSk7CisgICAgICAKKyAgICAgIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKKyAgICAgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBIT1dfQkZEX0FSQ0gsIDApOworCisjaWZkZWYgRExMVE9PTF9BUk0KKyAgICAgIGlmIChpbnRlcndvcmspCisJYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBGX0lOVEVSV09SSyk7CisjZW5kaWYKKyAgICAgIAorICAgICAgLyogRmlyc3QgbWFrZSBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQorCXsKKwkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOworCSAgaWYgKHNpLT5pZCAhPSBpKQorCSAgICBhYm9ydCgpOworCSAgc2ktPnNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgc2ktPm5hbWUpOworCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAorCQkJCSBzaS0+c2VjLAorCQkJCSBzaS0+ZmxhZ3MpOworCisJICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNpLT5zZWMsIHNpLT5hbGlnbik7CisJICBzaS0+c2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNpLT5zZWM7CisJICBzaS0+c3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOworCSAgc2ktPnN5bS0+bmFtZSA9IHNpLT5zZWMtPm5hbWU7CisJICBzaS0+c3ltLT5zZWN0aW9uID0gc2ktPnNlYzsKKwkgIHNpLT5zeW0tPmZsYWdzID0gQlNGX0xPQ0FMOworCSAgc2ktPnN5bS0+dmFsdWUgPSAwOworCSAgcHRyc1tvaWR4XSA9IHNpLT5zeW07CisJICBzaS0+c3ltcHAgPSBwdHJzICsgb2lkeDsKKwkgIHNpLT5zaXplID0gMDsKKwkgIHNpLT5kYXRhID0gTlVMTDsKKworCSAgb2lkeCsrOworCX0KKworICAgICAgaWYgKCEgZXhwLT5kYXRhKQorCXsKKwkgIGV4cF9sYWJlbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7CisJICBleHBfbGFiZWwtPm5hbWUgPSBtYWtlX2xhYmVsICgiIiwgZXhwLT5uYW1lKTsKKworCSAgLyogT24gUG93ZXJQQywgdGhlIGZ1bmN0aW9uIG5hbWUgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBpbgorCSAgICAgdGhlIHJkYXRhIHNlY3Rpb24sIHRoZSBmaXJzdCBlbGVtZW50IG9mIHdoaWNoIGlzIGEKKwkgICAgIHBvaW50ZXIgdG8gdGhlIGNvZGUgKC4uZnVuY3Rpb25fbmFtZSksIGFuZCB0aGUgc2Vjb25kCisJICAgICBwb2ludHMgdG8gdGhlIC50b2MgKi8KKyNpZmRlZiBETExUT09MX1BQQworCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKKwkgICAgZXhwX2xhYmVsLT5zZWN0aW9uID0gc2VjZGF0YVtSREFUQV0uc2VjOworCSAgZWxzZQorI2VuZGlmCisJICAgIGV4cF9sYWJlbC0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOworCisJICBleHBfbGFiZWwtPmZsYWdzID0gQlNGX0dMT0JBTDsKKwkgIGV4cF9sYWJlbC0+dmFsdWUgPSAwOworCisjaWZkZWYgRExMVE9PTF9BUk0KKwkgIGlmIChtYWNoaW5lID09IE1USFVNQikKKwkgICAgYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoYWJmZCwgZXhwX2xhYmVsLCBDX1RIVU1CRVhURlVOQyk7CisjZW5kaWYKKwkgIHB0cnNbb2lkeCsrXSA9IGV4cF9sYWJlbDsKKwl9CisKKyAgICAgIC8qIEdlbmVyYXRlIGltcCBzeW1ib2xzIHdpdGggb25lIHVuZGVyc2NvcmUgZm9yIE1pY3Jvc29mdAorICAgICAgICAgY29tcGF0aWJpbGl0eSwgYW5kIHdpdGggdHdvIHVuZGVyc2NvcmVzIGZvciBiYWNrd2FyZAorICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBjeWd3aW4uICAqLworICAgICAgaW5hbWUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7CisgICAgICBpbmFtZS0+bmFtZSA9IG1ha2VfbGFiZWwgKCJfX2ltcF8iLCBleHAtPm5hbWUpOworICAgICAgaW5hbWUtPnNlY3Rpb24gPSBzZWNkYXRhW0lEQVRBNV0uc2VjOworICAgICAgaW5hbWUtPmZsYWdzID0gQlNGX0dMT0JBTDsKKyAgICAgIGluYW1lLT52YWx1ZSA9IDA7CisKKyAgICAgIGluYW1lMiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKKyAgICAgIGluYW1lMi0+bmFtZSA9IG1ha2VfbGFiZWwgKCJfaW1wX18iLCBleHAtPm5hbWUpOworICAgICAgaW5hbWUyLT5zZWN0aW9uID0gc2VjZGF0YVtJREFUQTVdLnNlYzsKKyAgICAgIGluYW1lMi0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOworICAgICAgaW5hbWUyLT52YWx1ZSA9IDA7CisKKyAgICAgIGluYW1lX2xhYiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKKworICAgICAgaW5hbWVfbGFiLT5uYW1lID0gaGVhZF9sYWJlbDsKKyAgICAgIGluYW1lX2xhYi0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSZiZmRfdW5kX3NlY3Rpb247CisgICAgICBpbmFtZV9sYWItPmZsYWdzID0gMDsKKyAgICAgIGluYW1lX2xhYi0+dmFsdWUgPSAwOworCisKKyAgICAgIGluYW1lX3BwID0gcHRycyArIG9pZHg7CisgICAgICBwdHJzW29pZHgrK10gPSBpbmFtZTsKKyAgICAgIHB0cnNbb2lkeCsrXSA9IGluYW1lMjsKKworICAgICAgaW5hbWVfbGFiX3BwID0gcHRycyArIG9pZHg7CisgICAgICBwdHJzW29pZHgrK10gPSBpbmFtZV9sYWI7CisKKyNpZmRlZiBETExUT09MX1BQQworICAgICAgLyogVGhlIHN5bWJvbCByZWZlcmluZyB0byB0aGUgY29kZSAoLnRleHQpICovCisgICAgICB7CisJYXN5bWJvbCAqZnVuY3Rpb25fbmFtZTsKKworCWZ1bmN0aW9uX25hbWUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7CisJZnVuY3Rpb25fbmFtZS0+bmFtZSA9IG1ha2VfbGFiZWwgKCIuLiIsIGV4cC0+bmFtZSk7CisJZnVuY3Rpb25fbmFtZS0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOworCWZ1bmN0aW9uX25hbWUtPmZsYWdzID0gQlNGX0dMT0JBTDsKKwlmdW5jdGlvbl9uYW1lLT52YWx1ZSA9IDA7CisKKwlmbl9wcCA9IHB0cnMgKyBvaWR4OworCXB0cnNbb2lkeCsrXSA9IGZ1bmN0aW9uX25hbWU7CisgICAgICB9CisKKyAgICAgIC8qIFRoZSAudG9jIHN5bWJvbCAqLworICAgICAgeworCWFzeW1ib2wgKnRvY19zeW1ib2w7ICAgIC8qIFRoZSAudG9jIHN5bWJvbCAqLworCisJdG9jX3N5bWJvbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7CisJdG9jX3N5bWJvbC0+bmFtZSA9IG1ha2VfbGFiZWwgKCIuIiwgInRvYyIpOworCXRvY19zeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikmYmZkX3VuZF9zZWN0aW9uOworCXRvY19zeW1ib2wtPmZsYWdzID0gQlNGX0dMT0JBTDsKKwl0b2Nfc3ltYm9sLT52YWx1ZSA9IDA7CisKKwl0b2NfcHAgPSBwdHJzICsgb2lkeDsKKwlwdHJzW29pZHgrK10gPSB0b2Nfc3ltYm9sOworICAgICAgfQorI2VuZGlmCisgICAgICAKKyAgICAgIHB0cnNbb2lkeF0gPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKKwl7CisJICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKKwkgIGFzZWN0aW9uICpzZWMgPSBzaS0+c2VjOworCSAgYXJlbGVudCAqcmVsOworCSAgYXJlbGVudCAqKnJwcDsKKworCSAgc3dpdGNoIChpKQorCSAgICB7CisJICAgIGNhc2UgVEVYVDoKKwkgICAgICBpZiAoISBleHAtPmRhdGEpCisJCXsKKwkJICBzaS0+c2l6ZSA9IEhPV19KVEFCX1NJWkU7CisJCSAgc2ktPmRhdGEgPSB4bWFsbG9jIChIT1dfSlRBQl9TSVpFKTsKKwkJICBtZW1jcHkgKHNpLT5kYXRhLCBIT1dfSlRBQiwgSE9XX0pUQUJfU0laRSk7CisKKwkJICAvKiBhZGQgdGhlIHJlbG9jIGludG8gaWRhdGEkNSAqLworCQkgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCQkgIAorCQkgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOworCQkgIHJwcFswXSA9IHJlbDsKKwkJICBycHBbMV0gPSAwOworCQkgIAorCQkgIHJlbC0+YWRkcmVzcyA9IEhPV19KVEFCX1JPRkY7CisJCSAgcmVsLT5hZGRlbmQgPSAwOworCisJCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKKwkJICAgIHsKKwkJICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwKKwkJCQkJCQkgIEJGRF9SRUxPQ18xNl9HT1RPRkYpOworCQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gaW5hbWVfcHA7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOworCQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gc2VjZGF0YVtJREFUQTVdLnN5bXBwOworCQkgICAgfQorCQkgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7CisJCSAgc2VjLT5yZWxvY19jb3VudCA9IDE7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJREFUQTQ6CisJICAgIGNhc2UgSURBVEE1OgorCSAgICAgIC8qIEFuIGlkYXRhJDQgb3IgaWRhdGEkNSBpcyBvbmUgd29yZCBsb25nLCBhbmQgaGFzIGFuCisJCSBydmEgdG8gaWRhdGEkNiAqLworCisJICAgICAgc2ktPmRhdGEgPSB4bWFsbG9jICg0KTsKKwkgICAgICBzaS0+c2l6ZSA9IDQ7CisKKwkgICAgICBpZiAoZXhwLT5ub25hbWUpCisJCXsKKwkJICBzaS0+ZGF0YVswXSA9IGV4cC0+b3JkaW5hbCA7CisJCSAgc2ktPmRhdGFbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKKwkJICBzaS0+ZGF0YVsyXSA9IGV4cC0+b3JkaW5hbCA+PiAxNjsKKwkJICBzaS0+ZGF0YVszXSA9IDB4ODA7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKKwkJICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7CisJCSAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisJCSAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7CisJCSAgcnBwWzBdID0gcmVsOworCQkgIHJwcFsxXSA9IDA7CisJCSAgcmVsLT5hZGRyZXNzID0gMDsKKwkJICByZWwtPmFkZGVuZCA9IDA7CisJCSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX1JWQSk7CisJCSAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlY2RhdGFbSURBVEE2XS5zeW1wcDsKKwkJICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOworCQl9CisKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIElEQVRBNjoKKwkgICAgICBpZiAoIWV4cC0+bm9uYW1lKQorCQl7CisJCSAgLyogVGhpcyB1c2VkIHRvIGFkZCAxIHRvIGV4cC0+aGludC4gIEkgZG9uJ3Qga25vdworICAgICAgICAgICAgICAgICAgICAgd2h5IGl0IGRpZCB0aGF0LCBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggd2hhdCBJIHNlZQorICAgICAgICAgICAgICAgICAgICAgaW4gcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCB0aGUgTVMgdG9vbHMuICAqLworCQkgIGludCBpZHggPSBleHAtPmhpbnQ7CisJCSAgc2ktPnNpemUgPSBzdHJsZW4gKHhsYXRlIChleHAtPm5hbWUpKSArIDM7CisJCSAgc2ktPmRhdGEgPSB4bWFsbG9jIChzaS0+c2l6ZSk7CisJCSAgc2ktPmRhdGFbMF0gPSBpZHggJiAweGZmOworCQkgIHNpLT5kYXRhWzFdID0gaWR4ID4+IDg7CisJCSAgc3RyY3B5IChzaS0+ZGF0YSArIDIsIHhsYXRlIChleHAtPm5hbWUpKTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIElEQVRBNzoKKwkgICAgICBzaS0+c2l6ZSA9IDQ7CisJICAgICAgc2ktPmRhdGEgPXhtYWxsb2MoNCk7CisJICAgICAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOworCSAgICAgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCSAgICAgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOworCSAgICAgIHJwcFswXSA9IHJlbDsKKwkgICAgICByZWwtPmFkZHJlc3MgPSAwOworCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKKwkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfUlZBKTsKKwkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gaW5hbWVfbGFiX3BwOworCSAgICAgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7CisJICAgICAgc2VjLT5yZWxvY19jb3VudCA9IDE7CisJICAgICAgYnJlYWs7CisKKyNpZmRlZiBETExUT09MX1BQQworCSAgICBjYXNlIFBEQVRBOgorCSAgICAgIHsKKwkJLyogVGhlIC5wZGF0YSBzZWN0aW9uIGlzIDUgd29yZHMgbG9uZy4gKi8KKwkJLyogVGhpbmsgb2YgaXQgYXM6ICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogICBiZmRfdm1hIEJlZ2luQWRkcmVzcywgICAgIFsweDAwXSAgKi8KKwkJLyogICAgICAgICAgIEVuZEFkZHJlc3MsICAgICAgIFsweDA0XSAgKi8KKwkJLyoJICAgICBFeGNlcHRpb25IYW5kbGVyLCBbMHgwOF0gICovCisJCS8qCSAgICAgSGFuZGxlckRhdGEsICAgICAgWzB4MGNdICAqLworCQkvKgkgICAgIFByb2xvZ0VuZEFkZHJlc3M7IFsweDEwXSAgKi8KKwkJLyogfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkvKiBTbyB0aGlzIHBkYXRhIHNlY3Rpb24gc2V0dXBzIHVwIHRoaXMgYXMgYSBnbHVlIGxpbmthZ2UgdG8KKwkJICAgYSBkbGwgcm91dGluZS4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvdXNlIGtlZXBpbmcgdGhpbmdzCisJCSAgIHdlIG5lZWQgdG8gZG86CisKKwkJICAgMS4gSW4gdGhlIG5hbWUgb2YgZ2x1ZSB0cmlja2VyeSwgdGhlIEFERFIzMiByZWxvY3MgZm9yIDAsCisJCSAgICAgIDQsIGFuZCAweDEwIGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlIHNhbWUgcGxhY2U6CisJCSAgICAgICIuLmZ1bmN0aW9uX25hbWUiLgorCQkgICAyLiBUaGVyZSBpcyBvbmUgbW9yZSByZWxvYyBuZWVkZWQgaW4gdGhlIHBkYXRhIHNlY3Rpb24uCisJCSAgICAgIFRoZSBhY3R1YWwgZ2x1ZSBpbnN0cnVjdGlvbiB0byByZXN0b3JlIHRoZSB0b2Mgb24KKwkJICAgICAgcmV0dXJuIGlzIHNhdmVkIGFzIHRoZSBvZmZzZXQgaW4gYW4gSU1HTFVFIHJlbG9jLgorCQkgICAgICBTbyB3ZSBuZWVkIGEgdG90YWwgb2YgZm91ciByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4KKworCQkgICAzLiBMYXN0bHksIHRoZSBIYW5kbGVyRGF0YSBmaWVsZCBpcyBzZXQgdG8gMHgwMywgdG8gaW5kaWNhdGUKKwkJICAgICAgdGhhdCB0aGlzIGlzIGEgZ2x1ZSByb3V0aW5lLgorCQkqLworCQlhcmVsZW50ICppbWdsdWUsICpiYV9yZWwsICplYV9yZWwsICpwZWFfcmVsOworCisJCS8qIGFsaWdubWVudCBtdXN0IGJlIHNldCB0byAyKioyIG9yIHlvdSBnZXQgZXh0cmEgc3R1ZmYgKi8KKwkJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzZWMsIDIpOworCisJCXNpLT5zaXplID0gNCAqIDU7CisJCXNpLT5kYXRhID14bWFsbG9jKDQgKiA1KTsKKwkJbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOworCQlycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiA1KTsKKwkJcnBwWzBdID0gaW1nbHVlICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCQlycHBbMV0gPSBiYV9yZWwgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisJCXJwcFsyXSA9IGVhX3JlbCAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKwkJcnBwWzNdID0gcGVhX3JlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCQlycHBbNF0gPSAwOworCisJCS8qIHN0aWNrIHRoZSB0b2MgcmVsb2FkIGluc3RydWN0aW9uIGluIHRoZSBnbHVlIHJlbG9jICovCisJCWJmZF9wdXRfMzIoYWJmZCwgcHBjX2dsdWVfaW5zbiwgKGNoYXIgKikgJmltZ2x1ZS0+YWRkcmVzcyk7CisKKwkJaW1nbHVlLT5hZGRlbmQgPSAwOworCQlpbWdsdWUtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLAorCQkJCQkJICAgICAgIEJGRF9SRUxPQ18zMl9HT1RPRkYpOworCQlpbWdsdWUtPnN5bV9wdHJfcHRyID0gZm5fcHA7CisKKwkJYmFfcmVsLT5hZGRyZXNzID0gMDsKKwkJYmFfcmVsLT5hZGRlbmQgPSAwOworCQliYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOworCQliYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7CisKKwkJYmZkX3B1dF8zMihhYmZkLCAweDE4LCBzaS0+ZGF0YSArIDB4MDQpOworCQllYV9yZWwtPmFkZHJlc3MgPSA0OworCQllYV9yZWwtPmFkZGVuZCA9IDA7CisJCWVhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7CisJCWVhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKKworCQkvKiBtYXJrIGl0IGFzIGdsdWUgKi8KKwkJYmZkX3B1dF8zMihhYmZkLCAweDAzLCBzaS0+ZGF0YSArIDB4MGMpOworCisJCS8qIG1hcmsgdGhlIHByb2xvZyBlbmQgYWRkcmVzcyAqLworCQliZmRfcHV0XzMyKGFiZmQsIDB4MEQsIHNpLT5kYXRhICsgMHgxMCk7CisJCXBlYV9yZWwtPmFkZHJlc3MgPSAweDEwOworCQlwZWFfcmVsLT5hZGRlbmQgPSAwOworCQlwZWFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKKwkJcGVhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKKworCQlzZWMtPm9yZWxvY2F0aW9uID0gcnBwOworCQlzZWMtPnJlbG9jX2NvdW50ID0gNDsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBjYXNlIFJEQVRBOgorCSAgICAgIC8qIEVhY2ggZXh0ZXJuYWwgZnVuY3Rpb24gaW4gYSBQb3dlclBDIFBFIGZpbGUgaGFzIGEgdHdvIHdvcmQKKwkJIGRlc2NyaXB0b3IgY29uc2lzdGluZyBvZjoKKwkJIDEuIFRoZSBhZGRyZXNzIG9mIHRoZSBjb2RlLgorCQkgMi4gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvcHJpYXRlIC50b2MKKwkgICAgICAgICBXZSB1c2UgcmVsb2NzIHRvIGJ1aWxkIHRoaXMuCisJICAgICAgKi8KKworCSAgICAgIHNpLT5zaXplID0gODsKKwkgICAgICBzaS0+ZGF0YSA9IHhtYWxsb2MgKDgpOworCSAgICAgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKKworCSAgICAgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDMpOworCSAgICAgIHJwcFswXSA9IHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCSAgICAgIHJwcFsxXSA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCSAgICAgIHJwcFsyXSA9IDA7CisKKwkgICAgICByZWwtPmFkZHJlc3MgPSAwOworCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKKwkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOworCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKKworCSAgICAgIHJlbCA9IHJwcFsxXTsKKworCSAgICAgIHJlbC0+YWRkcmVzcyA9IDQ7CisJICAgICAgcmVsLT5hZGRlbmQgPSAwOworCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7CisJICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHRvY19wcDsKKworCSAgICAgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7CisJICAgICAgc2VjLT5yZWxvY19jb3VudCA9IDI7CisJICAgICAgYnJlYWs7CisjZW5kaWYgLyogRExMVE9PTF9QUEMgKi8KKwkgICAgfQorCX0KKworICAgICAgeworCWJmZF92bWEgdm1hID0gMDsKKwkvKiBTaXplIHVwIGFsbCB0aGUgc2VjdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKKwkgIHsKKwkgICAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7CisKKwkgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNpLT5zZWMsIHNpLT5zaXplKTsKKwkgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2ktPnNlYywgdm1hKTsKKworLyoJICAgIHZtYSArPSBzaS0+c2l6ZTsqLworCSAgfQorICAgICAgfQorICAgICAgLyogV3JpdGUgdGhlbSBvdXQgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQorCXsKKwkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOworCisJICBpZiAoaSA9PSBJREFUQTUgJiYgbm9faWRhdGE1KQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKGkgPT0gSURBVEE0ICYmIG5vX2lkYXRhNCkKKwkgICAgY29udGludWU7CisKKwkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2ktPnNlYywKKwkJCQkgICAgc2ktPmRhdGEsIDAsCisJCQkJICAgIHNpLT5zaXplKTsKKwl9CisKKyAgICAgIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBwdHJzLCBvaWR4KTsKKyAgICAgIGJmZF9jbG9zZSAoYWJmZCk7CisgICAgICBhYmZkID0gYmZkX29wZW5yIChvdXRuYW1lLCBIT1dfQkZEX1RBUkdFVCk7CisgICAgICByZXR1cm4gYWJmZDsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIGJmZCAqCittYWtlX2hlYWQgKCkKK3sKKyAgRklMRSAqICBmID0gZm9wZW4gKFRNUF9IRUFEX1MsIEZPUEVOX1dUKTsKKworICBmcHJpbnRmIChmLCAiJXMgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1JcbiIsIEFTTV9DKTsKKyAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDJcbiIpOworCisgIGZwcmludGYoZiwiXHQlc1x0JXNcbiIsIEFTTV9HTE9CQUwsaGVhZF9sYWJlbCk7CisKKyAgZnByaW50ZiAoZiwgIiVzOlxuIiwgaGVhZF9sYWJlbCk7CisKKyAgZnByaW50ZiAoZiwgIlx0JXNobmFtZSVzXHQlc1B0ciB0byBpbWFnZSBpbXBvcnQgYnkgbmFtZSBsaXN0XG4iLAorCSAgIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7CisKKyAgZnByaW50ZiAoZiwgIlx0JXN0aGlzIHNob3VsZCBiZSB0aGUgdGltZXN0YW1wLCBidXQgTlQgc29tZXRpbWVzXG4iLCBBU01fQyk7CisgIGZwcmludGYgKGYsICJcdCVzZG9lc24ndCBsb2FkIERMTHMgd2hlbiB0aGlzIGlzIHNldC5cbiIsIEFTTV9DKTsKKyAgZnByaW50ZiAoZiwgIlx0JXNcdDBcdCVzIGxvYWRlZCB0aW1lXG4iLCBBU01fTE9ORywgQVNNX0MpOworICBmcHJpbnRmIChmLCAiXHQlc1x0MFx0JXMgRm9yd2FyZGVyIGNoYWluXG4iLCBBU01fTE9ORywgQVNNX0MpOworICBmcHJpbnRmIChmLCAiXHQlc19fJXNfaW5hbWUlc1x0JXMgaW1wb3J0ZWQgZGxsJ3MgbmFtZVxuIiwKKwkgICBBU01fUlZBX0JFRk9SRSwKKwkgICBpbXBfbmFtZV9sYWIsCisJICAgQVNNX1JWQV9BRlRFUiwKKwkgICBBU01fQyk7CisgIGZwcmludGYgKGYsICJcdCVzZnRodW5rJXNcdCVzIHBvaW50ZXIgdG8gZmlyc3R0aHVua1xuIiwKKwkgICBBU01fUlZBX0JFRk9SRSwKKwkgICBBU01fUlZBX0FGVEVSLCBBU01fQyk7CisKKyAgZnByaW50ZiAoZiwgIiVzU3R1ZmYgZm9yIGNvbXBhdGliaWxpdHlcbiIsIEFTTV9DKTsKKworICBpZiAoIW5vX2lkYXRhNSkKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmlkYXRhJDVcbiIpOworICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKKyAgICAgIGZwcmludGYgKGYsICJmdGh1bms6XG4iKTsKKyAgICB9CisgIGlmICghbm9faWRhdGE0KQorICAgIHsKKyAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkNFxuIik7CisKKyAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisgICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNFxuIik7CisgICAgICBmcHJpbnRmIChmLCAiaG5hbWU6XG4iKTsKKyAgICB9CisgIGZjbG9zZSAoZik7CisKKyAgc3ByaW50ZiAob3V0ZmlsZSwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9IRUFEX08sIFRNUF9IRUFEX1MpOworICAKKyNpZmRlZiBETExUT09MX0FSTQorICBpZiAoaW50ZXJ3b3JrKQorICAgIHN0cmNhdCAob3V0ZmlsZSwgIiAtbXRodW1iLWludGVyd29yayIpOworI2VuZGlmCisgIAorICBydW4gKGFzX25hbWUsIG91dGZpbGUpOworCisgIHJldHVybiAgYmZkX29wZW5yIChUTVBfSEVBRF9PLCBIT1dfQkZEX1RBUkdFVCk7Cit9CisKK3N0YXRpYyBiZmQgKgorbWFrZV90YWlsICgpCit7CisgIEZJTEUgKiAgZiA9IGZvcGVuIChUTVBfVEFJTF9TLCBGT1BFTl9XVCk7CisKKyAgaWYgKCFub19pZGF0YTQpCisgICAgeworICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOworICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKKyAgICB9CisgIGlmICghbm9faWRhdGE1KQorICAgIHsKKyAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ1XG4iKTsKKyAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisgICAgfQorCisjaWZkZWYgRExMVE9PTF9QUEMKKyAgLyogTm9ybWFsbHksIHdlIG5lZWQgdG8gc2VlIGEgbnVsbCBkZXNjcmlwdG9yIGJ1aWx0IGluIGlkYXRhJDMgdG8KKyAgICAgYWN0IGFzIHRoZSB0ZXJtaW5hdG9yIGZvciB0aGUgbGlzdC4gVGhlIGlkZWFsIHdheSwgSSBzdXBwb3NlLAorICAgICB3b3VsZCBiZSB0byBtYXJrIHRoaXMgc2VjdGlvbiBhcyBhIGNvbWRhdCB0eXBlIDIgc2VjdGlvbiwgc28KKyAgICAgb25seSBvbmUgd291bGQgYXBwZWFyIGluIHRoZSBmaW5hbCAuZXhlIChpZiBvdXIgbGlua2VyIHN1cHBvcnRlZAorICAgICBjb21kYXQsIHRoYXQgaXMpIG9yIGNhdXNlIGl0IHRvIGJlIGluc2VydGVkIGJ5IHNvbWV0aGluZyBlbHNlIChzYXkKKyAgICAgY3J0MCkKKyAgKi8KKworICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkM1xuIik7CisgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7CisjZW5kaWYKKworI2lmZGVmIERMTFRPT0xfUFBDCisgIC8qIE90aGVyIFBvd2VyUEMgTlQgY29tcGlsZXJzIHVzZSBpZGF0YSQ2IGZvciB0aGUgZGxsbmFtZSwgc28gSQorICAgICBkbyB0b28uIE9yaWdpbmFsLCBodWg/ICovCisgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ2XG4iKTsKKyNlbHNlCisgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ3XG4iKTsKKyNlbmRpZgorCisgIGZwcmludGYgKGYsICJcdCVzXHRfXyVzX2luYW1lXG4iLCBBU01fR0xPQkFMLCBpbXBfbmFtZV9sYWIpOworICBmcHJpbnRmIChmLCAiX18lc19pbmFtZTpcdCVzXHRcIiVzXCJcbiIsCisJICAgaW1wX25hbWVfbGFiLCBBU01fVEVYVCwgZGxsX25hbWUpOworCisgIGZjbG9zZSAoZik7CisKKyAgc3ByaW50ZiAob3V0ZmlsZSwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9UQUlMX08sIFRNUF9UQUlMX1MpOworICAKKyNpZmRlZiBETExUT09MX0FSTQorICBpZiAoaW50ZXJ3b3JrKQorICAgIHN0cmNhdCAob3V0ZmlsZSwgIiAtbXRodW1iLWludGVyd29yayIpOworI2VuZGlmCisgIAorICBydW4gKGFzX25hbWUsIG91dGZpbGUpOworICAKKyAgcmV0dXJuICBiZmRfb3BlbnIgKFRNUF9UQUlMX08sIEhPV19CRkRfVEFSR0VUKTsKK30KKworc3RhdGljIHZvaWQKK2dlbl9saWJfZmlsZSAoKQoreworICBpbnQgaTsKKyAgZXhwb3J0X3R5cGUgKmV4cDsKKyAgYmZkICphcl9oZWFkOworICBiZmQgKmFyX3RhaWw7CisgIGJmZCAqb3V0YXJjaDsKKyAgYmZkICogaGVhZCAgPSAwOworCisgIHVubGluayAoaW1wX25hbWUpOworCisgIG91dGFyY2ggPSBiZmRfb3BlbncgKGltcF9uYW1lLCBIT1dfQkZEX1RBUkdFVCk7CisKKyAgaWYgKCFvdXRhcmNoKQorICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgZmF0YWwgKF8oIkNhbid0IG9wZW4gLmxpYiBmaWxlOiAlcyIpLCBpbXBfbmFtZSk7CisKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgaW5mb3JtIChfKCJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iKSwgaW1wX25hbWUpOworICAKKyAgYmZkX3NldF9mb3JtYXQgKG91dGFyY2gsIGJmZF9hcmNoaXZlKTsKKyAgb3V0YXJjaC0+aGFzX2FybWFwID0gMTsKKworICAvKiBXb3JrIG91dCBhIHJlYXNvbmFibGUgc2l6ZSBvZiB0aGluZ3MgdG8gcHV0IG9udG8gb25lIGxpbmUuICovCisKKyAgYXJfaGVhZCA9IG1ha2VfaGVhZCAoKTsKKyAgYXJfdGFpbCA9IG1ha2VfdGFpbCgpOworCisgIGlmIChhcl9oZWFkID09IE5VTEwgfHwgYXJfdGFpbCA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgCisgIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQorICAgIHsKKyAgICAgIGJmZCAqbiA9IG1ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpOworICAgICAgbi0+bmV4dCA9IGhlYWQ7CisgICAgICBoZWFkID0gbjsKKyAgICB9CisKKyAgLyogTm93IHN0aWNrIHRoZW0gYWxsIGludG8gdGhlIGFyY2hpdmUgKi8KKworICBhcl9oZWFkLT5uZXh0ID0gaGVhZDsKKyAgYXJfdGFpbC0+bmV4dCA9IGFyX2hlYWQ7CisgIGhlYWQgPSBhcl90YWlsOworCisgIGlmICghIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRhcmNoLCBoZWFkKSkKKyAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2FyY2hpdmVfaGVhZCIpOworICAKKyAgaWYgKCEgYmZkX2Nsb3NlIChvdXRhcmNoKSkKKyAgICBiZmRfZmF0YWwgKGltcF9uYW1lKTsKKworICB3aGlsZSAoaGVhZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJmZCAqbiA9IGhlYWQtPm5leHQ7CisgICAgICBiZmRfY2xvc2UgKGhlYWQpOworICAgICAgaGVhZCA9IG47CisgICAgfQorCisgIC8qIERlbGV0ZSBhbGwgdGhlIHRlbXAgZmlsZXMgKi8KKworICBpZiAoZG9udGRlbHRlbXBzID09IDApCisgICAgeworICAgICAgdW5saW5rIChUTVBfSEVBRF9PKTsKKyAgICAgIHVubGluayAoVE1QX0hFQURfUyk7CisgICAgICB1bmxpbmsgKFRNUF9UQUlMX08pOworICAgICAgdW5saW5rIChUTVBfVEFJTF9TKTsKKyAgICB9CisKKyAgaWYgKGRvbnRkZWx0ZW1wcyA8IDIpCisgICAgeworICAgICAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQorCXsKKwkgIHNwcmludGYgKG91dGZpbGUsICIlcyUwNWQubyIsIFRNUF9TVFVCLCBpKTsKKwkgIGlmICh1bmxpbmsgKG91dGZpbGUpIDwgMCkKKwkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgICAgd2FybiAoXygiY2Fubm90IGRlbGV0ZSAlczogJXNcbiIpLCBvdXRmaWxlLCBzdHJlcnJvciAoZXJybm8pKTsKKwl9CisgICAgfQorICAKKyAgaW5mb3JtIChfKCJDcmVhdGVkIGxpYiBmaWxlIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUnVuIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIC5vIGZpbGVzIGFuZCB0aGUKKyAgIC5kZWYgZmlsZSBhbmQgd29yayBvdXQgdGhlIGJlc3Qgc3R1ZmYgKi8KK3N0YXRpYyBpbnQKK3BmdW5jIChhLCBiKQorICAgICBjb25zdCB2b2lkICphOworICAgICBjb25zdCB2b2lkICpiOworeworICBleHBvcnRfdHlwZSAqYXAgPSAqKGV4cG9ydF90eXBlICoqKSBhOworICBleHBvcnRfdHlwZSAqYnAgPSAqKGV4cG9ydF90eXBlICoqKSBiOworICBpZiAoYXAtPm9yZGluYWwgPT0gYnAtPm9yZGluYWwpCisgICAgcmV0dXJuIDA7CisKKyAgLyogdW5zZXQgb3JkaW5hbHMgZ28gdG8gdGhlIGJvdHRvbSAqLworICBpZiAoYXAtPm9yZGluYWwgPT0gLTEpCisgICAgcmV0dXJuIDE7CisgIGlmIChicC0+b3JkaW5hbCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAoYXAtPm9yZGluYWwgLSBicC0+b3JkaW5hbCk7Cit9CisKK3N0YXRpYyBpbnQKK25mdW5jIChhLCBiKQorICAgICBjb25zdCB2b2lkICphOworICAgICBjb25zdCB2b2lkICpiOworeworICBleHBvcnRfdHlwZSAqYXAgPSAqKGV4cG9ydF90eXBlICoqKSBhOworICBleHBvcnRfdHlwZSAqYnAgPSAqKGV4cG9ydF90eXBlICoqKSBiOworCisgIHJldHVybiAoc3RyY21wIChhcC0+bmFtZSwgYnAtPm5hbWUpKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9udWxsX25hbWVzIChwdHIpCisgICAgIGV4cG9ydF90eXBlICoqcHRyOworeworICBpbnQgc3JjOworICBpbnQgZHN0OworICBmb3IgKGRzdCA9IHNyYyA9IDA7IHNyYyA8IGRfbmZ1bmNzOyBzcmMrKykKKyAgICB7CisgICAgICBpZiAocHRyW3NyY10pCisJeworCSAgcHRyW2RzdF0gPSBwdHJbc3JjXTsKKwkgIGRzdCsrOworCX0KKyAgICB9CisgIGRfbmZ1bmNzID0gZHN0OworfQorCitzdGF0aWMgdm9pZAorZHRhYiAocHRyKQorICAgICBleHBvcnRfdHlwZSAqKnB0cjsKK3sKKyNpZmRlZiBTQUNERUJVRworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCisgICAgeworICAgICAgaWYgKHB0cltpXSkKKwl7CisJICBwcmludGYgKCIlZCAlcyBAICVkICVzJXMlc1xuIiwKKwkJICBpLCBwdHJbaV0tPm5hbWUsIHB0cltpXS0+b3JkaW5hbCwKKwkJICBwdHJbaV0tPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAorCQkgIHB0cltpXS0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCisJCSAgcHRyW2ldLT5kYXRhID8gIkRBVEEiIDogIiIpOworCX0KKyAgICAgIGVsc2UKKwlwcmludGYgKCJlbXB0eVxuIik7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYykKKyAgICAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWM7Cit7CisgIGludCBtb3JlID0gMTsKKyAgaW50IGk7CisgIHdoaWxlIChtb3JlKQorICAgIHsKKworICAgICAgbW9yZSA9IDA7CisgICAgICAvKiBSZW1vdmUgZHVwbGljYXRlcyAqLworICAgICAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIG5mdW5jKTsKKworICAgICAgZHRhYiAoZF9leHBvcnRfdmVjKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jcyAtIDE7IGkrKykKKwl7CisJICBpZiAoc3RyY21wIChkX2V4cG9ydF92ZWNbaV0tPm5hbWUsCisJCSAgICAgIGRfZXhwb3J0X3ZlY1tpICsgMV0tPm5hbWUpID09IDApCisJICAgIHsKKworCSAgICAgIGV4cG9ydF90eXBlICphID0gZF9leHBvcnRfdmVjW2ldOworCSAgICAgIGV4cG9ydF90eXBlICpiID0gZF9leHBvcnRfdmVjW2kgKyAxXTsKKworCSAgICAgIG1vcmUgPSAxOworCSAgICAgIAorCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICAgICAgaW5mb3JtIChfKCJXYXJuaW5nLCBpZ25vcmluZyBkdXBsaWNhdGUgRVhQT1JUICVzICVkLCVkXG4iKSwKKwkJICAgICAgYS0+bmFtZSwgYS0+b3JkaW5hbCwgYi0+b3JkaW5hbCk7CisJICAgICAgCisJICAgICAgaWYgKGEtPm9yZGluYWwgIT0gLTEKKwkJICAmJiBiLT5vcmRpbmFsICE9IC0xKQorCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQlmYXRhbCAoXygiRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzIiksCisJCSAgICAgIGEtPm5hbWUpOworCisJICAgICAgLyogTWVyZ2UgYXR0cmlidXRlcyAqLworCSAgICAgIGItPm9yZGluYWwgPSBhLT5vcmRpbmFsID4gMCA/IGEtPm9yZGluYWwgOiBiLT5vcmRpbmFsOworCSAgICAgIGItPmNvbnN0YW50IHw9IGEtPmNvbnN0YW50OworCSAgICAgIGItPm5vbmFtZSB8PSBhLT5ub25hbWU7CisJICAgICAgYi0+ZGF0YSB8PSBhLT5kYXRhOworCSAgICAgIGRfZXhwb3J0X3ZlY1tpXSA9IDA7CisJICAgIH0KKworCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKKwkgIHJlbW92ZV9udWxsX25hbWVzIChkX2V4cG9ydF92ZWMpOworCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKKwl9CisgICAgfQorCisKKyAgLyogQ291bnQgdGhlIG5hbWVzICovCisgIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQorICAgIHsKKyAgICAgIGlmICghZF9leHBvcnRfdmVjW2ldLT5ub25hbWUpCisJZF9uYW1lZF9uZnVuY3MrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX29yZGluYWxzIChkX2V4cG9ydF92ZWMpCisgICAgIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjOworeworICBpbnQgbG93ZXN0ID0gLTE7CisgIGludCBpOworICBjaGFyICpwdHI7CisgIGludCBzaXplID0gNjU1MzY7CisKKyAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKKworICAvKiBmaWxsIGluIHRoZSB1bnNldCBvcmRpbmFscyB3aXRoIG9uZXMgZnJvbSBvdXIgcmFuZ2UgKi8KKworICBwdHIgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplKTsKKworICBtZW1zZXQgKHB0ciwgMCwgc2l6ZSk7CisKKyAgLyogTWFyayBpbiBvdXIgbGFyZ2UgdmVjdG9yIGFsbCB0aGUgbnVtYmVycyB0aGF0IGFyZSB0YWtlbiAqLworICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKKyAgICB7CisgICAgICBpZiAoZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsICE9IC0xKQorCXsKKwkgIHB0cltkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWxdID0gMTsKKwkgIGlmIChsb3dlc3QgPT0gLTEgfHwgZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsIDwgbG93ZXN0KQorCSAgICB7CisJICAgICAgbG93ZXN0ID0gZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBTdGFydCBhdCAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTVMgdG9vbGNoYWluLiAgKi8KKyAgaWYgKGxvd2VzdCA9PSAtMSkKKyAgICBsb3dlc3QgPSAxOworCisgIC8qIE5vdyBmaWxsIGluIG9yZGluYWxzIHdoZXJlIHRoZSB1c2VyIHdhbnRzIHVzIHRvIGNob29zZS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCisgICAgeworICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9PSAtMSkKKwl7CisJICByZWdpc3RlciBpbnQgajsKKworCSAgLyogRmlyc3QgdHJ5IHdpdGhpbiBvciBhZnRlciBhbnkgdXNlciBzdXBwbGllZCByYW5nZS4gKi8KKwkgIGZvciAoaiA9IGxvd2VzdDsgaiA8IHNpemU7IGorKykKKwkgICAgaWYgKHB0cltqXSA9PSAwKQorCSAgICAgIHsKKwkJcHRyW2pdID0gMTsKKwkJZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID0gajsKKwkJZ290byBkb25lOworCSAgICAgIH0KKworCSAgLyogVGhlbiB0cnkgYmVmb3JlIHRoZSByYW5nZS4gKi8KKwkgIGZvciAoaiA9IGxvd2VzdDsgaiA+MDsgai0tKQorCSAgICBpZiAocHRyW2pdID09IDApCisJICAgICAgeworCQlwdHJbal0gPSAxOworCQlkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPSBqOworCQlnb3RvIGRvbmU7CisJICAgICAgfQorCWRvbmU6OworCX0KKyAgICB9CisKKyAgZnJlZSAocHRyKTsKKworICAvKiBBbmQgcmVzb3J0ICovCisKKyAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKKworICAvKiBXb3JrIG91dCB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IG9yZGluYWwgbnVtYmVycy4gICovCisgIGlmIChkX25mdW5jcykKKyAgICB7CisgICAgICBpZiAoZF9leHBvcnRfdmVjWzBdKQorCWRfbG93X29yZCA9IGRfZXhwb3J0X3ZlY1swXS0+b3JkaW5hbDsKKyAgICAgIGlmIChkX2V4cG9ydF92ZWNbZF9uZnVuY3MtMV0pCisJZF9oaWdoX29yZCA9IGRfZXhwb3J0X3ZlY1tkX25mdW5jcy0xXS0+b3JkaW5hbDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2FscGhhZnVuYyAoYXYsYnYpCisgICAgIGNvbnN0IHZvaWQgKmF2OworICAgICBjb25zdCB2b2lkICpidjsKK3sKKyAgY29uc3QgZXhwb3J0X3R5cGUgKiphID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBhdjsKKyAgY29uc3QgZXhwb3J0X3R5cGUgKipiID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBidjsKKworICByZXR1cm4gc3RyY21wICgoKmEpLT5uYW1lLCAoKmIpLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQKK21hbmdsZV9kZWZzICgpCit7CisgIC8qIEZpcnN0IHdvcmsgb3V0IHRoZSBtaW5pbXVtIG9yZGluYWwgY2hvc2VuICovCisKKyAgZXhwb3J0X3R5cGUgKmV4cDsKKworICBpbnQgaTsKKyAgaW50IGhpbnQgPSAwOworICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYworICA9IChleHBvcnRfdHlwZSAqKikgeG1hbGxvYyAoc2l6ZW9mIChleHBvcnRfdHlwZSAqKSAqIGRfbmZ1bmNzKTsKKworICBpbmZvcm0gKF8oIlByb2Nlc3NpbmcgZGVmaW5pdGlvbnMiKSk7CisgIAorICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCisgICAgeworICAgICAgZF9leHBvcnRfdmVjW2ldID0gZXhwOworICAgIH0KKworICBwcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYyk7CisgIGZpbGxfb3JkaW5hbHMgKGRfZXhwb3J0X3ZlYyk7CisKKyAgLyogUHV0IGJhY2sgdGhlIGxpc3QgaW4gdGhlIG5ldyBvcmRlciAqLworICBkX2V4cG9ydHMgPSAwOworICBmb3IgKGkgPSBkX25mdW5jcyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGRfZXhwb3J0X3ZlY1tpXS0+bmV4dCA9IGRfZXhwb3J0czsKKyAgICAgIGRfZXhwb3J0cyA9IGRfZXhwb3J0X3ZlY1tpXTsKKyAgICB9CisKKyAgLyogQnVpbGQgbGlzdCBpbiBhbHBoYSBvcmRlciAqLworICBkX2V4cG9ydHNfbGV4aWNhbGx5ID0gKGV4cG9ydF90eXBlICoqKQorICAgIHhtYWxsb2MgKHNpemVvZiAoZXhwb3J0X3R5cGUgKikgKiAoZF9uZnVuY3MgKyAxKSk7CisKKyAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQorICAgIHsKKyAgICAgIGRfZXhwb3J0c19sZXhpY2FsbHlbaV0gPSBleHA7CisgICAgfQorICBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldID0gMDsKKworICBxc29ydCAoZF9leHBvcnRzX2xleGljYWxseSwgaSwgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgYWxwaGFmdW5jKTsKKworICAvKiBGaWxsIGV4cCBlbnRyaWVzIHdpdGggdGhlaXIgaGludCB2YWx1ZXMgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKKyAgICB7CisgICAgICBpZiAoIWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQorCWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPmhpbnQgPSBoaW50Kys7CisgICAgfQorICAKKyAgaW5mb3JtIChfKCJQcm9jZXNzZWQgZGVmaW5pdGlvbnMiKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAordXNhZ2UgKGZpbGUsIHN0YXR1cykKKyAgICAgRklMRSAqZmlsZTsKKyAgICAgaW50IHN0YXR1czsKK3sKKyAgLyogeGdldGV4dDpjLWZvcm1hdCAqLworICBmcHJpbnRmIChmaWxlLCBfKCJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIpLCBwcm9ncmFtX25hbWUpOworICAvKiB4Z2V0ZXh0OmMtZm9ybWF0ICovCisgIGZwcmludGYgKGZpbGUsIF8oIiAgIC1tIC0tbWFjaGluZSA8bWFjaGluZT4gICAgQ3JlYXRlIHthcm0sIGkzODYsIHBwYywgdGh1bWJ9IERMTC4gW2RlZmF1bHQ6ICVzXVxuIiksIG1uYW1lKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLWwgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBpbnRlcmZhY2UgbGlicmFyeS5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLWEgLS1hZGQtaW5kaXJlY3QgICAgICAgICBBZGQgZGxsIGluZGlyZWN0cyB0byBleHBvcnQgZmlsZS5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLUQgLS1kbGxuYW1lIDxuYW1lPiAgICAgICBOYW1lIG9mIGlucHV0IGRsbCB0byBwdXQgaW50byBpbnRlcmZhY2UgbGliLlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtZCAtLWlucHV0LWRlZiA8ZGVmZmlsZT4gIE5hbWUgb2YgLmRlZiBmaWxlIHRvIGJlIHJlYWQgaW4uXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgICBFeHBvcnQgYWxsIHN5bWJvbHMgdG8gLmRlZlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtLW5vLWV4cG9ydC1hbGwtc3ltYm9scyAgIE9ubHkgZXhwb3J0IGxpc3RlZCBzeW1ib2xzXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiAgRG9uJ3QgZXhwb3J0IDxsaXN0PlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgICAgIENsZWFyIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLXggLS1uby1pZGF0YTQgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ0IHNlY3Rpb24uXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgIC1jIC0tbm8taWRhdGE1ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uLlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtVSAtLWFkZC11bmRlcnNjb3JlICAgICAgIEFkZCB1bmRlcnNjb3JlcyB0byBzeW1ib2xzIGluIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtQSAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPi5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLVMgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXIuXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iKSk7CisjaWZkZWYgRExMVE9PTF9BUk0KKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLWkgLS1pbnRlcndvcmsgICAgICAgICAgICBTdXBwb3J0IEFSTS9UaHVtYiBpbnRlcndvcmtpbmcuXG4iKSk7CisjZW5kaWYKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgcHJlc2VydmF0aW9uKS5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLXYgLS12ZXJib3NlICAgICAgICAgICAgICBCZSB2ZXJib3NlLlxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAgLWggLS1oZWxwICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb24uXG4iKSk7CisgIAorICBleGl0IChzdGF0dXMpOworfQorCisjZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJCTE1MAorI2RlZmluZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TCShPUFRJT05fRVhQT1JUX0FMTF9TWU1TICsgMSkKKyNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNUwkJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQorI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUwkoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCisjZGVmaW5lIE9QVElPTl9OT19JREFUQTQJCSd4JworI2RlZmluZSBPUFRJT05fTk9fSURBVEE1CQknYycKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQoreworICB7Im5vLWRlbGV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbid9LAorICB7ImRsbG5hbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0QnfSwKKyAgeyJuby1pZGF0YTQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0lEQVRBNH0sCisgIHsibm8taWRhdGE1Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTV9LAorICB7Im91dHB1dC1leHAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKKyAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd6J30sCisgIHsiZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlRfQUxMX1NZTVN9LAorICB7Im5vLWV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TfSwKKyAgeyJleGNsdWRlLXN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYQ0xVREVfU1lNU30sCisgIHsibm8tZGVmYXVsdC1leGNsdWRlcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFU30sCisgIHsib3V0cHV0LWxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAorICB7ImRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCd9LCAvKiBmb3IgY29tcGF0aWJsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgKi8KKyAgeyJpbnB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2QnfSwKKyAgeyJhZGQtdW5kZXJzY29yZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVSd9LAorICB7ImtpbGwtYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKKyAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAorICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3YnfSwKKyAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICdWJ30sCisgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAorICB7Im1hY2hpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKKyAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKKyAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKKyAgeyJhcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAorICB7ImFzLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCisjaWZkZWYgRExMVE9PTF9BUk0KKyAgeyJpbnRlcndvcmsiLCBub19hcmd1bWVudCwgTlVMTCwgJ2knfSwKKyNlbmRpZgorICB7MH0KK307CisKK2ludAorbWFpbiAoYWMsIGF2KQorICAgICBpbnQgYWM7CisgICAgIGNoYXIgKiphdjsKK3sKKyAgaW50IGM7CisgIGludCBpOworICBjaGFyICpmaXJzdGFyZyA9IDA7CisgIHByb2dyYW1fbmFtZSA9IGF2WzBdOworICBvYXYgPSBhdjsKKworI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQorICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7CisjZW5kaWYKKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisgIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhYywgYXYsICJ4Y3o6UzphRDpsOmU6bmtBdlZiOlVoP206ZDpmOmkiLAorCQkJICAgbG9uZ19vcHRpb25zLCAwKSkKKwkgIT0gRU9GKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSBPUFRJT05fTk9fSURBVEE0OgorCSAgbm9faWRhdGE0ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX05PX0lEQVRBNToKKwkgIG5vX2lkYXRhNSA9IDE7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9FWFBPUlRfQUxMX1NZTVM6CisJICBleHBvcnRfYWxsX3N5bWJvbHMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TOgorCSAgZXhwb3J0X2FsbF9zeW1ib2xzID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9FWENMVURFX1NZTVM6CisJICBhZGRfZXhjbHVkZXMgKG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTOgorCSAgZG9fZGVmYXVsdF9leGNsdWRlcyA9IGZhbHNlOworCSAgYnJlYWs7CisJY2FzZSAnUyc6CisJICBhc19uYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnZic6CisJICBhc19mbGFncyA9IG9wdGFyZzsKKwkgIGJyZWFrOworCisJICAvKiBpZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5ICovCisJY2FzZSAndSc6CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIGFkZF9pbmRpcmVjdCA9IDE7CisJICBicmVhazsKKwljYXNlICd6JzoKKwkgIG91dHB1dF9kZWYgPSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XVCk7CisJICBicmVhazsKKwljYXNlICdEJzoKKwkgIGRsbF9uYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJICBpbXBfbmFtZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ2UnOgorCSAgZXhwX25hbWUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdoJzoKKwkgIHVzYWdlIChzdGRvdXQsIDApOworCSAgYnJlYWs7CisJY2FzZSAnbSc6CisJICBtbmFtZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ3YnOgorCSAgdmVyYm9zZSA9IDE7CisJICBicmVhazsKKwljYXNlICdWJzoKKwkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7CisJICBicmVhazsKKyNpZmRlZiBETExUT09MX0FSTQorCWNhc2UgJ2knOgorCSAgaW50ZXJ3b3JrID0gMTsKKwkgIGJyZWFrOworI2VuZGlmCisJY2FzZSAneSc6CisjaWYgMAorCSAgLyogV2UgZG9uJ3QgY3VycmVudGx5IGRlZmluZSBZWURFQlVHIHdoZW4gYnVpbGRpbmcKKyAgICAgICAgICAgICBkZWZwYXJzZS55LiAgKi8KKwkgIHl5ZGVidWcgPSAxOworI2VuZGlmCisJICBicmVhazsKKwljYXNlICdVJzoKKwkgIGFkZF91bmRlcnNjb3JlID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2snOgorCSAga2lsbGF0ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ0EnOgorCSAgYWRkX3N0ZGNhbGxfYWxpYXMgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBkZWZfZmlsZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ24nOgorCSAgZG9udGRlbHRlbXBzKys7CisJICBicmVhazsKKwljYXNlICdiJzoKKwkgIGJhc2VfZmlsZSA9IGZvcGVuIChvcHRhcmcsIEZPUEVOX1JCKTsKKwkgIAorCSAgaWYgKCFiYXNlX2ZpbGUpCisJICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiBiYXNlLWZpbGU6ICVzIiksIG9wdGFyZyk7CisKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB1c2FnZSAoc3RkZXJyLCAxKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgZm9yIChpID0gMDsgbXRhYmxlW2ldLnR5cGU7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChtdGFibGVbaV0udHlwZSwgbW5hbWUpID09IDApCisJYnJlYWs7CisgICAgfQorCisgIGlmICghbXRhYmxlW2ldLnR5cGUpCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBmYXRhbCAoXygiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiKSwgbW5hbWUpOworCisgIG1hY2hpbmUgPSBpOworCisjaWZkZWYgRExMVE9PTF9BUk0KKyAgLyogQWx3YXlzIGVuYWJsZSBpbnRlcndvcmtpbmcgZm9yIFRodW1iIHRhcmdldHMuICAqLworICBpZiAobWFjaGluZSA9PSBNVEhVTUIgJiYgKCEgaW50ZXJ3b3JrKSkKKyAgICBpbnRlcndvcmsgPSAxOworI2VuZGlmCisgIAorICBpZiAoIWRsbF9uYW1lICYmIGV4cF9uYW1lKQorICAgIHsKKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKGV4cF9uYW1lKSArIDU7CisgICAgICBkbGxfbmFtZSA9IHhtYWxsb2MgKGxlbik7CisgICAgICBzdHJjcHkgKGRsbF9uYW1lLCBleHBfbmFtZSk7CisgICAgICBzdHJjYXQgKGRsbF9uYW1lLCAiLmRsbCIpOworICAgIH0KKworICAvKiBEb24ndCB1c2UgdGhlIGRlZmF1bHQgZXhjbHVkZSBsaXN0IGlmIHdlJ3JlIHJlYWRpbmcgb25seSB0aGUKKyAgICAgc3ltYm9scyBpbiB0aGUgLmRyZWN0dmUgc2VjdGlvbi4gIFRoZSBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSBtZWFudAorICAgICB0byBhdm9pZCBleHBvcnRpbmcgRExMIGVudHJ5IHBvaW50IGFuZCBDeWd3aW4zMiBpbXB1cmVfcHRyLiAgKi8KKyAgaWYgKCEgZXhwb3J0X2FsbF9zeW1ib2xzKQorICAgIGRvX2RlZmF1bHRfZXhjbHVkZXMgPSBmYWxzZTsKKyAgCisgIGlmIChkb19kZWZhdWx0X2V4Y2x1ZGVzKQorICAgIHNldF9kZWZhdWx0X2V4Y2x1ZGVzICgpOworCisgIGlmIChkZWZfZmlsZSkKKyAgICBwcm9jZXNzX2RlZl9maWxlIChkZWZfZmlsZSk7CisKKyAgd2hpbGUgKG9wdGluZCA8IGFjKQorICAgIHsKKyAgICAgIGlmICghZmlyc3RhcmcpCisJZmlyc3RhcmcgPSBhdltvcHRpbmRdOworICAgICAgc2Nhbl9vYmpfZmlsZSAoYXZbb3B0aW5kXSk7CisgICAgICBvcHRpbmQrKzsKKyAgICB9CisKKyAgbWFuZ2xlX2RlZnMgKCk7CisKKyAgaWYgKGV4cF9uYW1lKQorICAgIGdlbl9leHBfZmlsZSAoKTsKKyAgCisgIGlmIChpbXBfbmFtZSkKKyAgICB7CisgICAgICAvKiBNYWtlIGltcF9uYW1lIHNhZmUgZm9yIHVzZSBhcyBhIGxhYmVsLiAqLworICAgICAgY2hhciAqcDsKKworICAgICAgaW1wX25hbWVfbGFiID0geHN0cmR1cCAoaW1wX25hbWUpOworICAgICAgZm9yIChwID0gaW1wX25hbWVfbGFiOyAqcDsgcCsrKQorCXsKKwkgIGlmICghaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpICpwKSAmJiAhaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSkKKwkgICAgKnAgPSAnXyc7CisJfQorICAgICAgaGVhZF9sYWJlbCA9IG1ha2VfbGFiZWwoIl9oZWFkXyIsIGltcF9uYW1lX2xhYik7CisgICAgICBnZW5fbGliX2ZpbGUgKCk7CisgICAgfQorICAKKyAgaWYgKG91dHB1dF9kZWYpCisgICAgZ2VuX2RlZl9maWxlICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5oIGIvYmludXRpbHMvZGxsdG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTY3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9kbGx0b29sLmgKQEAgLTAsMCArMSw0MiBAQAorLyogZGxsdG9vbC5oIC0tIGhlYWRlciBmaWxlIGZvciBkbGx0b29sCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2V4dGVybiB2b2lkIGRlZl9jb2RlIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZGVmX2RhdGEgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBkZWZfZGVzY3JpcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBkZWZfZXhwb3J0cworICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCwgaW50KSk7CitleHRlcm4gdm9pZCBkZWZfaGVhcHNpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKK2V4dGVybiB2b2lkIGRlZl9pbXBvcnQKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIGRlZl9saWJyYXJ5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CitleHRlcm4gdm9pZCBkZWZfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworZXh0ZXJuIHZvaWQgZGVmX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIGRlZl9zdGFja3NpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKK2V4dGVybiB2b2lkIGRlZl92ZXJzaW9uIFBBUkFNUyAoKGludCwgaW50KSk7CitleHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGludCB5eWRlYnVnOworZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gRklMRSAqeXlpbjsKK2V4dGVybiBpbnQgbGluZW51bWJlcjsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RsbHdyYXAuYyBiL2JpbnV0aWxzL2RsbHdyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ2MTFiCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvZGxsd3JhcC5jCkBAIC0wLDAgKzEsMTA1MCBAQAorLyogZGxsd3JhcC5jIC0tIHdyYXBwZXIgZm9yIERMTFRPT0wgYW5kIEdDQyB0byBnZW5lcmF0ZSBQRSBzdHlsZSBETExzCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBNdW1pdCBLaGFuIChraGFuQHhyYXlsaXRoLndpc2MuZWR1KS4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KKyNpZm5kZWYgX19HTlVDX18KKyMgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImdldG9wdC5oIgorI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9TWVNfV0FJVF9ICisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbHNlIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCisjaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKKyNpZm5kZWYgV0lGRVhJVEVECisjZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSYwMzc3KSA9PSAwKQorI2VuZGlmCisjaWZuZGVmIFdJRlNJR05BTEVECisjZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpJjAzNzcpICE9IDAxNzcgJiYgKCh3KSZ+MDM3NykgPT0gMCkKKyNlbmRpZgorI2lmbmRlZiBXVEVSTVNJRworI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMDE3NykKKyNlbmRpZgorI2lmbmRlZiBXRVhJVFNUQVRVUworI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSA+PiA4KSAmIDAzNzcpCisjZW5kaWYKKyNlbHNlIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCisjaWZuZGVmIFdJRkVYSVRFRAorI2RlZmluZSBXSUZFWElURUQodykJKCgodykgJiAweGZmKSA9PSAwKQorI2VuZGlmCisjaWZuZGVmIFdJRlNJR05BTEVECisjZGVmaW5lIFdJRlNJR05BTEVEKHcpCSgoKHcpICYgMHhmZikgIT0gMCAmJiAoKHcpICYgMHhmZikgIT0gMHg3ZikKKyNlbmRpZgorI2lmbmRlZiBXVEVSTVNJRworI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMHg3ZikKKyNlbmRpZgorI2lmbmRlZiBXRVhJVFNUQVRVUworI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSAmIDB4ZmYwMCkgPj4gOCkKKyNlbmRpZgorI2VuZGlmIC8qIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pICovCisjZW5kaWYgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KKworc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIwLjIuNCI7CitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAiZ2NjIjsKK3N0YXRpYyBjaGFyICpjeWd3aW5fZHJpdmVyX2ZsYWdzID0gCisgICItV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyI7CitzdGF0aWMgY2hhciAqbWluZ3czMl9kcml2ZXJfZmxhZ3MgPSAiLW1kbGwiOworc3RhdGljIGNoYXIgKmdlbmVyaWNfZHJpdmVyX2ZsYWdzID0gIi1XbCwtLWRsbCI7CisKK3N0YXRpYyBjaGFyICplbnRyeV9wb2ludDsKKworc3RhdGljIGNoYXIgKmRsbHRvb2xfbmFtZSA9ICJkbGx0b29sIjsKKworc3RhdGljIGNoYXIgKnRhcmdldCA9IFRBUkdFVDsKKwordHlwZWRlZiBlbnVtIHsKKyAgVU5LTk9XTl9UQVJHRVQsIAorICBDWUdXSU5fVEFSR0VULCAKKyAgTUlOR1czMl9UQVJHRVQKK30gCit0YXJnZXRfdHlwZTsKKworc3RhdGljIHRhcmdldF90eXBlIHdoaWNoX3RhcmdldCA9IFVOS05PV05fVEFSR0VUOworCitzdGF0aWMgaW50IGRvbnRkZWx0ZW1wcyA9IDA7CitzdGF0aWMgaW50IGRyeV9ydW4gPSAwOworCitzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOworCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworCitzdGF0aWMgY2hhciAqZGxsX2ZpbGVfbmFtZTsKK3N0YXRpYyBjaGFyICpkbGxfbmFtZTsKK3N0YXRpYyBjaGFyICpiYXNlX2ZpbGVfbmFtZTsKK3N0YXRpYyBjaGFyICpleHBfZmlsZV9uYW1lOworc3RhdGljIGNoYXIgKmRlZl9maWxlX25hbWU7CitzdGF0aWMgaW50IGRlbGV0ZV9iYXNlX2ZpbGUgPSAxOworc3RhdGljIGludCBkZWxldGVfZXhwX2ZpbGUgPSAxOworc3RhdGljIGludCBkZWxldGVfZGVmX2ZpbGUgPSAxOworCitzdGF0aWMgaW50IHJ1biBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKikpOworc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGRlbGV0ZV90ZW1wX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNsZWFudXBfYW5kX2V4aXQgUEFSQU1TICgoaW50IHN0YXR1cykpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2RlbGV0ZV90ZW1wX2ZpbGVzICgpCit7CisgIGlmIChkZWxldGVfYmFzZV9maWxlICYmIGJhc2VfZmlsZV9uYW1lKQorICAgIHsKKyAgICAgIGlmICh2ZXJib3NlKQorCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBiYXNlIGZpbGUgJXNcbiIsCisJCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAorCSAgICAgICAgIGJhc2VfZmlsZV9uYW1lKTsKKyAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKKyAgICAgICAgeworICAgICAgICAgIHVubGluayAoYmFzZV9maWxlX25hbWUpOworCSAgZnJlZSAoYmFzZV9maWxlX25hbWUpOworCX0KKyAgICB9CisgIAorICBpZiAoZGVsZXRlX2V4cF9maWxlICYmIGV4cF9maWxlX25hbWUpCisgICAgeworICAgICAgaWYgKHZlcmJvc2UpCisJZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGV4cCBmaWxlICVzXG4iLAorCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKKwkgICAgICAgICBleHBfZmlsZV9uYW1lKTsKKyAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKKyAgICAgICAgeworICAgICAgICAgIHVubGluayAoZXhwX2ZpbGVfbmFtZSk7CisgICAgICAgICAgZnJlZSAoZXhwX2ZpbGVfbmFtZSk7CisJfQorICAgIH0KKyAgaWYgKGRlbGV0ZV9kZWZfZmlsZSAmJiBkZWZfZmlsZV9uYW1lKQorICAgIHsKKyAgICAgIGlmICh2ZXJib3NlKQorCWZwcmludGYgKHN0ZGVyciwgIiVzIHRlbXBvcmFyeSBkZWYgZmlsZSAlc1xuIiwKKwkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCisJICAgICAgICAgZGVmX2ZpbGVfbmFtZSk7CisgICAgICBpZiAoISBkb250ZGVsdGVtcHMpCisgICAgICAgIHsKKyAgICAgICAgICB1bmxpbmsgKGRlZl9maWxlX25hbWUpOworICAgICAgICAgIGZyZWUgKGRlZl9maWxlX25hbWUpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIAorY2xlYW51cF9hbmRfZXhpdCAoaW50IHN0YXR1cykKK3sKKyAgZGVsZXRlX3RlbXBfZmlsZXMgKCk7CisgIGV4aXQgKHN0YXR1cyk7Cit9CisgIAorc3RhdGljIGludAorcnVuICh3aGF0LCBhcmdzKQorICAgICBjb25zdCBjaGFyICp3aGF0OworICAgICBjaGFyICphcmdzOworeworICBjaGFyICpzOworICBpbnQgcGlkLCB3YWl0X3N0YXR1cywgcmV0Y29kZTsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKiphcmd2OworICBjaGFyICplcnJtc2dfZm10LCAqZXJybXNnX2FyZzsKKyAgY2hhciAqdGVtcF9iYXNlID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKKyAgaW50IGluX3F1b3RlOworICBjaGFyIHNlcDsKKworICBpZiAodmVyYm9zZSB8fCBkcnlfcnVuKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzICVzXG4iLCB3aGF0LCBhcmdzKTsKKworICAvKiBDb3VudCB0aGUgYXJncyAqLworICBpID0gMDsKKyAgZm9yIChzID0gYXJnczsgKnM7IHMrKykKKyAgICBpZiAoKnMgPT0gJyAnKQorICAgICAgaSsrOworICBpKys7CisgIGFyZ3YgPSBhbGxvY2EgKHNpemVvZiAoY2hhciAqKSAqIChpICsgMykpOworICBpID0gMDsKKyAgYXJndltpKytdID0gd2hhdDsKKyAgcyA9IGFyZ3M7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHdoaWxlICgqcyA9PSAnICcgJiYgKnMgIT0gMCkKKwlzKys7CisgICAgICBpZiAoKnMgPT0gMCkKKwlicmVhazsKKyAgICAgIGluX3F1b3RlID0gKCpzID09ICdcJycgfHwgKnMgPT0gJyInKTsKKyAgICAgIHNlcCA9IChpbl9xdW90ZSkgPyAqcysrIDogJyAnOworICAgICAgYXJndltpKytdID0gczsKKyAgICAgIHdoaWxlICgqcyAhPSBzZXAgJiYgKnMgIT0gMCkKKwlzKys7CisgICAgICBpZiAoKnMgPT0gMCkKKwlicmVhazsKKyAgICAgICpzKysgPSAwOworICAgICAgaWYgKGluX3F1b3RlKQorICAgICAgICBzKys7CisgICAgfQorICBhcmd2W2krK10gPSBOVUxMOworCisgIGlmIChkcnlfcnVuKQorICAgIHJldHVybiAwOworCisgIHBpZCA9IHBleGVjdXRlIChhcmd2WzBdLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YsIHByb2dyYW1fbmFtZSwgdGVtcF9iYXNlLAorCQkgICZlcnJtc2dfZm10LCAmZXJybXNnX2FyZywgUEVYRUNVVEVfT05FIHwgUEVYRUNVVEVfU0VBUkNIKTsKKworICBpZiAocGlkID09IC0xKQorICAgIHsKKyAgICAgIGludCBlcnJub192YWwgPSBlcnJubzsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vX3ZhbCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldGNvZGUgPSAwOworICBwaWQgPSBwd2FpdCAocGlkLCAmd2FpdF9zdGF0dXMsIDApOworICBpZiAocGlkID09IC0xKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3YWl0OiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldGNvZGUgPSAxOworICAgIH0KKyAgZWxzZSBpZiAoV0lGU0lHTkFMRUQgKHdhaXRfc3RhdHVzKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogc3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkXG4iLAorCSAgICAgICBwcm9ncmFtX25hbWUsIFdURVJNU0lHICh3YWl0X3N0YXR1cykpOworICAgICAgcmV0Y29kZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKKyAgICB7CisgICAgICBpZiAoV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSAhPSAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJICAJICAgcHJvZ3JhbV9uYW1lLCB3aGF0LCBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpKTsKKwkgIHJldGNvZGUgPSAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICByZXRjb2RlID0gMTsKKyAgCisgIHJldHVybiByZXRjb2RlOworfQorCitzdGF0aWMgY2hhciAqCitteWJhc2VuYW1lIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBjb25zdCBjaGFyICpiYXNlID0gbmFtZTsKKworICB3aGlsZSAoKm5hbWUpCisgICAgeworICAgICAgaWYgKCpuYW1lID09ICcvJyB8fCAqbmFtZSA9PSAnXFwnKQorCXsKKwkgIGJhc2UgPSBuYW1lICsgMTsKKwl9CisgICAgICArK25hbWU7CisgICAgfQorICByZXR1cm4gKGNoYXIgKikgYmFzZTsKK30KKworc3RhdGljIGludCAKK3N0cmhhc2ggKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgdW5zaWduZWQgbG9uZyBoYXNoOworICB1bnNpZ25lZCBpbnQgYzsKKyAgdW5zaWduZWQgaW50IGxlbjsKKworICBoYXNoID0gMDsKKyAgbGVuID0gMDsKKyAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0cjsKKyAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykKKyAgICB7CisgICAgICBoYXNoICs9IGMgKyAoYyA8PCAxNyk7CisgICAgICBoYXNoIF49IGhhc2ggPj4gMjsKKyAgICAgICsrbGVuOworICAgIH0KKyAgaGFzaCArPSBsZW4gKyAobGVuIDw8IDE3KTsKKyAgaGFzaCBePSBoYXNoID4+IDI7CisKKyAgcmV0dXJuIGhhc2g7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitwcmludF92ZXJzaW9uIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLworICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICBwcmludGYgKCJHTlUgJXMgJXNcbiIsIG5hbWUsIHByb2dyYW1fdmVyc2lvbik7CisgIHByaW50ZiAoIkNvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIik7CisgIHByaW50ZiAoIlwKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpOworICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlIChmaWxlLCBzdGF0dXMpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKGZpbGUsICJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIsIHByb2dyYW1fbmFtZSk7CisgIGZwcmludGYgKGZpbGUsICIgIEdlbmVyaWMgb3B0aW9uczpcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1xdWlldCwgLXEgICAgICAgICAgICBXb3JrIHF1aWV0bHlcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS12ZXJib3NlLCAtdiAgICAgICAgICBWZXJib3NlXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgUHJpbnQgZGxsd3JhcCB2ZXJzaW9uXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0taW1wbGliIDxvdXRuYW1lPiAgICAgU3lub255bSBmb3IgLS1vdXRwdXQtbGliXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgT3B0aW9ucyBmb3IgJXM6XG4iLCBwcm9ncmFtX25hbWUpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcml2ZXItbmFtZSA8ZHJpdmVyPiBEZWZhdWx0cyB0byBcImdjY1wiXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJpdmVyLWZsYWdzIDxmbGFncz4gT3ZlcnJpZGUgZGVmYXVsdCBsZCBmbGFnc1xuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLWRsbHRvb2wtbmFtZSA8ZGxsdG9vbD4gRGVmYXVsdHMgdG8gXCJkbGx0b29sXCJcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1lbnRyeSA8ZW50cnk+ICAgICAgICBTcGVjaWZ5IGFsdGVybmF0ZSBETEwgZW50cnkgcG9pbnRcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1pbWFnZS1iYXNlIDxiYXNlPiAgICBTcGVjaWZ5IGltYWdlIGJhc2UgYWRkcmVzc1xuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLXRhcmdldCA8bWFjaGluZT4gICAgIGkzODYtY3lnd2luMzIgb3IgaTM4Ni1taW5ndzMyXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZHJ5LXJ1biAgICAgICAgICAgICAgU2hvdyB3aGF0IG5lZWRzIHRvIGJlIHJ1blxuIik7CisgIGZwcmludGYgKGZpbGUsICIgIE9wdGlvbnMgcGFzc2VkIHRvIERMTFRPT0w6XG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbWFjaGluZSA8bWFjaGluZT5cbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBleHBvcnQgZmlsZS5cbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBpbnB1dCBsaWJyYXJ5LlxuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIG91dHB1dCBsaWIuXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGVmIDxkZWZmaWxlPiAgICAgICAgTmFtZSBpbnB1dCAuZGVmIGZpbGVcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG91dHB1dCAuZGVmIGZpbGVcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCAuZHJlY3R2ZSBzeW1ib2xzXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBFeGNsdWRlIDxsaXN0PiBmcm9tIC5kZWZcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICAgIFphcCBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGVcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1pZGF0YTQgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvblxuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWlkYXRhNSAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAgIC1VICAgICAgICAgICAgICAgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIC5saWJcbiIpOworICBmcHJpbnRmIChmaWxlLCAiICAgLWsgICAgICAgICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lc1xuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPlxuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlclxuIik7CisgIGZwcmludGYgKGZpbGUsICIgICAtLW5vZGVsZXRlICAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcy5cbiIpOworICBmcHJpbnRmIChmaWxlLCAiICBSZXN0IGFyZSBwYXNzZWQgdW5tb2RpZmllZCB0byB0aGUgbGFuZ3VhZ2UgZHJpdmVyXG4iKTsKKyAgZnByaW50ZiAoZmlsZSwgIlxuXG4iKTsKKyAgZXhpdCAoc3RhdHVzKTsKK30KKworI2RlZmluZSBPUFRJT05fU1RBUlQJCTE0OQorCisvKiBHRU5FUklDIG9wdGlvbnMuICovCisjZGVmaW5lIE9QVElPTl9RVUlFVAkJKE9QVElPTl9TVEFSVCArIDEpCisjZGVmaW5lIE9QVElPTl9WRVJCT1NFCQkoT1BUSU9OX1FVSUVUICsgMSkKKyNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCShPUFRJT05fVkVSQk9TRSArIDEpCisKKy8qIERMTFdSQVAgb3B0aW9ucy4gKi8KKyNkZWZpbmUgT1BUSU9OX0RSWV9SVU4JCShPUFRJT05fVkVSU0lPTiArIDEpCisjZGVmaW5lIE9QVElPTl9EUklWRVJfTkFNRQkoT1BUSU9OX0RSWV9SVU4gKyAxKQorI2RlZmluZSBPUFRJT05fRFJJVkVSX0ZMQUdTCShPUFRJT05fRFJJVkVSX05BTUUgKyAxKQorI2RlZmluZSBPUFRJT05fRExMVE9PTF9OQU1FCShPUFRJT05fRFJJVkVSX0ZMQUdTICsgMSkKKyNkZWZpbmUgT1BUSU9OX0VOVFJZCQkoT1BUSU9OX0RMTFRPT0xfTkFNRSArIDEpCisjZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCShPUFRJT05fRU5UUlkgKyAxKQorI2RlZmluZSBPUFRJT05fVEFSR0VUCQkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQorCisvKiBETExUT09MIG9wdGlvbnMuICovCisjZGVmaW5lIE9QVElPTl9OT0RFTEVURQkJKE9QVElPTl9UQVJHRVQgKyAxKQorI2RlZmluZSBPUFRJT05fRExMTkFNRQkJKE9QVElPTl9OT0RFTEVURSArIDEpCisjZGVmaW5lIE9QVElPTl9OT19JREFUQTQgCShPUFRJT05fRExMTkFNRSArIDEpCisjZGVmaW5lIE9QVElPTl9OT19JREFUQTUJKE9QVElPTl9OT19JREFUQTQgKyAxKQorI2RlZmluZSBPUFRJT05fT1VUUFVUX0VYUAkoT1BUSU9OX05PX0lEQVRBNSArIDEpCisjZGVmaW5lIE9QVElPTl9PVVRQVVRfREVGCShPUFRJT05fT1VUUFVUX0VYUCArIDEpCisjZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9PVVRQVVRfREVGICsgMSkKKyNkZWZpbmUgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyAoT1BUSU9OX0VYUE9SVF9BTExfU1lNUyArIDEpCisjZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTVMJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQorI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyAoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCisjZGVmaW5lIE9QVElPTl9PVVRQVVRfTElCCShPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyArIDEpCisjZGVmaW5lIE9QVElPTl9ERUYJCShPUFRJT05fT1VUUFVUX0xJQiArIDEpCisjZGVmaW5lIE9QVElPTl9BRERfVU5ERVJTQ09SRQkoT1BUSU9OX0RFRiArIDEpCisjZGVmaW5lIE9QVElPTl9LSUxMQVQJCShPUFRJT05fQUREX1VOREVSU0NPUkUgKyAxKQorI2RlZmluZSBPUFRJT05fSEVMUAkJKE9QVElPTl9LSUxMQVQgKyAxKQorI2RlZmluZSBPUFRJT05fTUFDSElORQkJKE9QVElPTl9IRUxQICsgMSkKKyNkZWZpbmUgT1BUSU9OX0FERF9JTkRJUkVDVAkoT1BUSU9OX01BQ0hJTkUgKyAxKQorI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCShPUFRJT05fQUREX0lORElSRUNUICsgMSkKKyNkZWZpbmUgT1BUSU9OX0FTCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KK3sKKyAgLyogZ2VuZXJpYyBvcHRpb25zLiAqLworICB7InF1aWV0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdxJ30sCisgIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAorICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAorICB7ImltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0xJQn0sCisKKyAgLyogZGxsd3JhcCBvcHRpb25zLiAqLworICB7ImRyeS1ydW4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSWV9SVU59LAorICB7ImRyaXZlci1uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfTkFNRX0sCisgIHsiZHJpdmVyLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfRkxBR1N9LAorICB7ImRsbHRvb2wtbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMVE9PTF9OQU1FfSwKKyAgeyJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAorICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAorICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFSR0VUfSwKKworICAvKiBkbGx0b29sIG9wdGlvbnMuICovCisgIHsibm8tZGVsZXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCisgIHsiZGxsbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMTkFNRX0sCisgIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTR9LAorICB7Im5vLWlkYXRhNSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fSURBVEE1fSwKKyAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfRVhQfSwKKyAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfREVGfSwKKyAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCisgIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAorICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKKyAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKKyAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfTElCfSwKKyAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRn0sCisgIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKKyAgeyJraWxsYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKKyAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAorICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKKyAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUNISU5FfSwKKyAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FERF9JTkRJUkVDVH0sCisgIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAorICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU30sCisgIHswfQorfTsKKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBjOworICBpbnQgaTsKKworICBjaGFyICoqc2F2ZWRfYXJndiA9IDA7CisgIGludCBjbWRsaW5lX2xlbiA9IDA7CisKKyAgaW50IGV4cG9ydF9hbGwgPSAwOworCisgIGludCAqZGxsdG9vbF9hcmdfaW5kaWNlczsKKyAgaW50ICpkcml2ZXJfYXJnX2luZGljZXM7CisKKyAgY2hhciAqZHJpdmVyX2ZsYWdzID0gMDsKKyAgY2hhciAqb3V0cHV0X2xpYl9maWxlX25hbWUgPSAwOworCisgIGR5bl9zdHJpbmdfdCBkbGx0b29sX2NtZGxpbmU7CisgIGR5bl9zdHJpbmdfdCBkcml2ZXJfY21kbGluZTsKKworICBpbnQgZGVmX2ZpbGVfc2VlbiA9IDA7CisKKyAgY2hhciAqaW1hZ2VfYmFzZV9zdHIgPSAwOworCisgIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07CisKKyAgc2F2ZWRfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChjaGFyKikpOworICBkbGx0b29sX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKKyAgZHJpdmVyX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgCisgICAgeworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJndltpXSk7CisgICAgICBjaGFyICphcmcgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgICAgIHN0cmNweSAoYXJnLCBhcmd2W2ldKTsKKyAgICAgIGNtZGxpbmVfbGVuICs9IGxlbjsKKyAgICAgIHNhdmVkX2FyZ3ZbaV0gPSBhcmc7CisgICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW2ldID0gMDsKKyAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tpXSA9IDE7CisgICAgfQorICBjbWRsaW5lX2xlbisrOworCisgIC8qIFdlIHJlY29nbml6ZSBkbGx3cmFwIGFuZCBkbGx0b29sIG9wdGlvbnMsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMKKyAgICAgcGFzc2VkIG9udG8gdGhlIGxhbmd1YWdlIGRyaXZlciAoZWcuLCB0byBHQ0MpLiBXZSBjb2xsZWN0IG9wdGlvbnMKKyAgICAgdG8gZGxsdG9vbCBhbmQgZHJpdmVyIGluIGRsbHRvb2xfYXJncyBhbmQgZHJpdmVyX2FyZ3MuICovCisgICAKKyAgb3B0ZXJyID0gMDsKKyAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIm5rQXF2ZTpVaG86bDpMOkk6IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIGludCBkbGx0b29sX2FyZzsKKyAgICAgIGludCBkcml2ZXJfYXJnOworICAgICAgaW50IHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyOworCisgICAgICBkbGx0b29sX2FyZyA9IDA7CisgICAgICBkcml2ZXJfYXJnID0gMTsKKyAgICAgIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMDsKKworICAgICAgaWYgKGMgIT0gJz8nKQorICAgICAgICB7CisJICAvKiBXZSByZWNvZ25pemUgdGhpcyBvcHRpb24sIHNvIGl0IGhhcyB0byBiZSBlaXRoZXIgZGxsd3JhcCBvcgorCSAgICAgZGxsdG9vbCBvcHRpb24uIERvIG5vdCBwYXNzIHRvIGRyaXZlciB1bmxlc3MgaXQncyBvbmUgb2YgdGhlCisJICAgICBnZW5lcmljIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIGFsbCB0aGUgdG9vbHMgKHN1Y2ggYXMgLXYpCisJICAgICB3aGljaCBhcmUgZGVhbHQgd2l0aCBsYXRlci4gKi8KKwkgIGRyaXZlcl9hcmcgPSAwOworCX0KKworICAgICAgLyogZGVhbCB3aXRoIGdlbmVyaWMgYW5kIGRsbHdyYXAgb3B0aW9ucyBmaXJzdC4gKi8KKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnaCc6CisJICB1c2FnZSAoc3Rkb3V0LCAwKTsKKwkgIGJyZWFrOworCWNhc2UgJ3EnOgorCSAgdmVyYm9zZSA9IDA7CisJICBicmVhazsKKwljYXNlICd2JzoKKwkgIHZlcmJvc2UgPSAxOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fVkVSU0lPTjoKKwkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7CisJICBicmVhazsKKwljYXNlICdlJzoKKwkgIGVudHJ5X3BvaW50ID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKKwkgIGltYWdlX2Jhc2Vfc3RyID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fREVGOgorCSAgZGVmX2ZpbGVfbmFtZSA9IG9wdGFyZzsKKwkgIGRlZl9maWxlX3NlZW4gPSAxOworCSAgZGVsZXRlX2RlZl9maWxlID0gMDsKKwkgIGJyZWFrOworCWNhc2UgJ24nOgorCSAgZG9udGRlbHRlbXBzID0gMTsKKwkgIGRsbHRvb2xfYXJnID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ28nOgorCSAgZGxsX2ZpbGVfbmFtZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ0knOgorCWNhc2UgJ2wnOgorCWNhc2UgJ0wnOgorCSAgZHJpdmVyX2FyZyA9IDE7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9ETExOQU1FOgorCSAgZGxsX25hbWUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9EUllfUlVOOgorCSAgZHJ5X3J1biA9IDE7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9EUklWRVJfTkFNRToKKwkgIGRyaXZlcl9uYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fRFJJVkVSX0ZMQUdTOgorCSAgZHJpdmVyX2ZsYWdzID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fRExMVE9PTF9OQU1FOgorCSAgZGxsdG9vbF9uYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fVEFSR0VUOgorCSAgdGFyZ2V0ID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fQkFTRV9GSUxFOgorCSAgYmFzZV9maWxlX25hbWUgPSBvcHRhcmc7CisJICBkZWxldGVfYmFzZV9maWxlID0gMDsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX09VVFBVVF9FWFA6CisJICBleHBfZmlsZV9uYW1lID0gb3B0YXJnOworCSAgZGVsZXRlX2V4cF9maWxlID0gMDsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKKwkgIGV4cG9ydF9hbGwgPSAxOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fT1VUUFVUX0xJQjoKKwkgIG91dHB1dF9saWJfZmlsZV9uYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnPyc6CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZGxsdG9vbF9hcmcgPSAxOworCSAgYnJlYWs7CisJfQorICAgICAgCisgICAgICAvKiBIYW5kbGUgcGFzc2luZyB0aHJvdWdoIC0tb3B0aW9uPXZhbHVlIGNhc2UuICovCisgICAgICBpZiAob3B0YXJnIAorICAgICAgICAgICYmIHNhdmVkX2FyZ3Zbb3B0aW5kLTFdWzBdID09ICctJyAKKyAgICAgICAgICAmJiBzYXZlZF9hcmd2W29wdGluZC0xXVsxXSA9PSAnLScgCisJICAmJiBzdHJjaHIgKHNhdmVkX2FyZ3Zbb3B0aW5kLTFdLCAnPScpKQorCXNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMTsKKworICAgICAgaWYgKGRsbHRvb2xfYXJnKQorICAgICAgICB7CisJICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0xXSA9IDE7CisJICBpZiAob3B0YXJnICYmICEgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIpCisJICAgIHsKKwkgICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0yXSA9IDE7CisJICAgIH0gCisJfQorCisgICAgICBpZiAoISBkcml2ZXJfYXJnKQorICAgICAgICB7CisJICBkcml2ZXJfYXJnX2luZGljZXNbb3B0aW5kLTFdID0gMDsKKwkgIGlmIChvcHRhcmcgJiYgISBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcikKKwkgICAgeworCSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tvcHRpbmQtMl0gPSAwOworCSAgICB9IAorCX0KKyAgICB9CisgIAorICAvKiBzYW5pdHkgY2hlY2tzLiAqLworICBpZiAoISBkbGxfbmFtZSAmJiAhIGRsbF9maWxlX25hbWUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgIiVzOiBNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIG9mIC1vIG9yIC0tZGxsbmFtZSBvcHRpb25zXG4iLAorICAgICAgICAgICAgICAgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZSBpZiAoISBkbGxfbmFtZSkKKyAgICB7CisgICAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG15YmFzZW5hbWUgKGRsbF9maWxlX25hbWUpKTsKKyAgICB9CisgIGVsc2UgaWYgKCEgZGxsX2ZpbGVfbmFtZSkKKyAgICB7CisgICAgICBkbGxfZmlsZV9uYW1lID0geHN0cmR1cCAoZGxsX25hbWUpOworICAgIH0KKyAgCisgIGlmICghIGRlZl9maWxlX3NlZW4pCisgICAgeworICAgICAgY2hhciAqZmlsZXByZWZpeCA9IGNob29zZV90ZW1wX2Jhc2UgKCk7CisgICAgICBkZWZfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDUpOworICAgICAgc3ByaW50ZiAoZGVmX2ZpbGVfbmFtZSwgIiVzLmRlZiIsIAorICAgICAgICAgICAgICAgKGRvbnRkZWx0ZW1wcykgPyBteWJhc2VuYW1lIChmaWxlcHJlZml4KSA6IGZpbGVwcmVmaXgpOworICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKKyAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOworICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG5vIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgcHJvdmlkZWRcbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAKKyAgICAgICAgICAgICAgICJkbGx3cmFwIHdpbGwgY3JlYXRlIG9uZSwgYnV0IG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudFxuIik7CisgICAgfQorICAKKyAgLyogc2V0IHRoZSB0YXJnZXQgcGxhdGZvcm0uICovCisgIGlmIChzdHJzdHIgKHRhcmdldCwgImN5Z3dpbjMyIikpCisgICAgd2hpY2hfdGFyZ2V0ID0gQ1lHV0lOX1RBUkdFVDsKKyAgZWxzZSBpZiAoc3Ryc3RyICh0YXJnZXQsICJtaW5ndzMyIikpCisgICAgd2hpY2hfdGFyZ2V0ID0gTUlOR1czMl9UQVJHRVQ7CisgIGVsc2UgCisgICAgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7CisKKyAgLyogcmUtY3JlYXRlIHRoZSBjb21tYW5kIGxpbmVzIGFzIGEgc3RyaW5nLCB0YWtpbmcgY2FyZSB0byBxdW90ZSBzdHVmZi4gKi8KKyAgZGxsdG9vbF9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKKyAgaWYgKHZlcmJvc2UpCisgICAgeworICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtdiIpOworICAgIH0KKyAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtLWRsbG5hbWUgIik7CisgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGRsbF9uYW1lKTsKKworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQorICAgIHsKKyAgICAgIGlmIChkbGx0b29sX2FyZ19pbmRpY2VzW2ldKQorICAgICAgICB7CisJICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOworICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOworCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCisJICAgICAgICAgICAgICAgICAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKKwkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGFyZyk7CisJICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAKKwkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKKwl9CisgICAgfQorCisgIGRyaXZlcl9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKKyAgaWYgKCEgZHJpdmVyX2ZsYWdzIHx8IHN0cmxlbiAoZHJpdmVyX2ZsYWdzKSA9PSAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAod2hpY2hfdGFyZ2V0KQorICAgICAgICB7CisJY2FzZSBDWUdXSU5fVEFSR0VUOgorICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGN5Z3dpbl9kcml2ZXJfZmxhZ3M7CisJICBicmVhazsKKwkKKwljYXNlIE1JTkdXMzJfVEFSR0VUOgorICAgICAgICAgIGRyaXZlcl9mbGFncyA9IG1pbmd3MzJfZHJpdmVyX2ZsYWdzOworCSAgYnJlYWs7CisJCisJZGVmYXVsdDoKKyAgICAgICAgICBkcml2ZXJfZmxhZ3MgPSBnZW5lcmljX2RyaXZlcl9mbGFnczsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZHJpdmVyX2ZsYWdzKTsKKyAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1vICIpOworICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGRsbF9maWxlX25hbWUpOworCisgIGlmICghIGVudHJ5X3BvaW50IHx8IHN0cmxlbiAoZW50cnlfcG9pbnQpID09IDApCisgICAgeworICAgICAgc3dpdGNoICh3aGljaF90YXJnZXQpCisgICAgICAgIHsKKwljYXNlIENZR1dJTl9UQVJHRVQ6CisJICBlbnRyeV9wb2ludCA9ICJfX2N5Z3dpbl9kbGxfZW50cnlAMTIiOworCSAgYnJlYWs7CisJCisJY2FzZSBNSU5HVzMyX1RBUkdFVDoKKwkgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQ1JUU3RhcnR1cEAxMiI7CisJICBicmVhazsKKwkKKwlkZWZhdWx0OgorICAgICAgICAgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQDEyIjsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLWUsIik7CisgIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZW50cnlfcG9pbnQpOworICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZXhjbHVkZS1zeW1ib2w9Iik7CisgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAorICAgICAgICAgICAgICAgICAgICAgKGVudHJ5X3BvaW50WzBdID09ICdfJykgPyBlbnRyeV9wb2ludCsxIDogZW50cnlfcG9pbnQpOworCisgIGlmICghIGltYWdlX2Jhc2Vfc3RyIHx8IHN0cmxlbiAoaW1hZ2VfYmFzZV9zdHIpID09IDApCisgICAgeworICAgICAgY2hhciAqdG1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICgiMHgxMjM0NTY3OCIpICsgMSk7CisgICAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBzdHJoYXNoIChkbGxfZmlsZV9uYW1lKTsKKyAgICAgIHNwcmludGYgKHRtcGJ1ZiwgIjB4JS44bFgiLCAweDYwMDAwMDAwfCgoaGFzaDw8MTYpJjB4RkZDMDAwMCkpOworICAgICAgaW1hZ2VfYmFzZV9zdHIgPSB0bXBidWY7CisgICAgfQorCisgIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLS1pbWFnZS1iYXNlLCIpOworICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGltYWdlX2Jhc2Vfc3RyKTsKKworICBpZiAodmVyYm9zZSkKKyAgICB7CisgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLXYiKTsKKyAgICB9CisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKKyAgICB7CisgICAgICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQorICAgICAgICB7CisJICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOworICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOworCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKKwkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOworCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBhcmcpOworCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKKwkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKKwl9CisgICAgfQorICAKKyAgLyoKKyAgICogU3RlcCBwcmUtMS4gSWYgbm8gLS1kZWYgPEVYUE9SVF9ERUY+IGlzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgaXQKKyAgICogYW5kIHRoZW4gcGFzcyBpdCBvbi4KKyAgICovCisgIAorICBpZiAoISBkZWZfZmlsZV9zZWVuKSAKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGR5bl9zdHJpbmdfdCBzdGVwX3ByZTE7CisKKyAgICAgIHN0ZXBfcHJlMSA9IGR5bl9zdHJpbmdfbmV3ICgxMDI0KTsKKworICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKKyAgICAgIGlmIChleHBvcnRfYWxsKQorCXsKKyAgICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCAiIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9sPSIpOworICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIAorCSAgIl9jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbE1haW5AMTIsRGxsRW50cnlQb2ludEAxMiIpOworCX0KKyAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1vdXRwdXQtZGVmICIpOworICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGVmX2ZpbGVfbmFtZSk7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCisJeworCSAgaWYgKGRyaXZlcl9hcmdfaW5kaWNlc1tpXSkKKwkgICAgeworCSAgICAgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07CisJICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJnKTsKKwkgICAgICBpZiAobGVuID49IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicgCisJICAgICAgICAgICYmIChhcmdbbGVuLTFdID09ICdvJyB8fCBhcmdbbGVuLTFdID09ICdhJykpCisJCXsKKwkJICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKKwkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLAorCQkJCSAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKKwkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBhcmcpOworCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCisJCQkJICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXBfcHJlMS0+cykpCisJY2xlYW51cF9hbmRfZXhpdCAoMSk7CisgICAgICAKKyAgICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwX3ByZTEpOworICAgIH0KKworICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGVmICIpOworICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkZWZfZmlsZV9uYW1lKTsKKworICBpZiAodmVyYm9zZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJETExUT09MIG5hbWUgICAgOiAlc1xuIiwgZGxsdG9vbF9uYW1lKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgb3B0aW9ucyA6ICVzXG4iLCBkbGx0b29sX2NtZGxpbmUtPnMpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG5hbWUgICAgIDogJXNcbiIsIGRyaXZlcl9uYW1lKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRSSVZFUiBvcHRpb25zICA6ICVzXG4iLCBkcml2ZXJfY21kbGluZS0+cyk7CisgICAgfQorIAorICAvKgorICAgKiBTdGVwIDEuIENhbGwgR0NDL0xEIHRvIGNyZWF0ZSBiYXNlIHJlbG9jYXRpb24gZmlsZS4gSWYgdXNpbmcgR0NDLCB0aGUKKyAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorICAgKiAgICAKKyAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQorICAgKgorICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0CisgICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KKyAgICoKKyAgICovCisgIAorICBpZiAoISBiYXNlX2ZpbGVfbmFtZSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKKyAgICAgIGJhc2VfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDYpOworICAgICAgc3ByaW50ZiAoYmFzZV9maWxlX25hbWUsICIlcy5iYXNlIiwgCisgICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7CisgICAgICBkZWxldGVfYmFzZV9maWxlID0gMTsKKyAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOworICAgIH0KKyAgCisgIHsKKyAgICBpbnQgcXVvdGU7CisKKyAgICBkeW5fc3RyaW5nX3Qgc3RlcDEgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQorCQkJCSAgICAgICAgICsgMjApOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIi1XbCwtLWJhc2UtZmlsZSwiKTsKKyAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAorICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIAorCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgYmFzZV9maWxlX25hbWUpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7CisgICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCisgICAgICB7CisgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIiAiKTsKKyAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBkcml2ZXJfY21kbGluZS0+cyk7CisgICAgICB9CisKKyAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDEtPnMpKQorICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7CisgICAgCisgICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAxKTsKKyAgfQorCisKKworICAvKgorICAgKiBTdGVwIDIuIGdlbmVyYXRlIHRoZSBleHAgZmlsZSBieSBydW5uaW5nIGRsbHRvb2wuIAorICAgKiBkbGx0b29sIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorICAgKiAgICAKKyAgICogICAgJSBkbGx0b29sIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIFtyZXN0IG9mIGNvbW1hbmQgbGluZV0KKyAgICoKKyAgICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGJhc2UgbmFtZSwgY3JlYXRlIHRlbXBvcmFyeSBvbmUgdGhhdAorICAgKiBpcyBkZWxldGVkIGF0IGV4aXQuCisgICAqCisgICAqLworICAKKyAgaWYgKCEgZXhwX2ZpbGVfbmFtZSkKKyAgICB7CisgICAgICBjaGFyICpwID0gc3RycmNociAoZGxsX25hbWUsICcuJyk7CisgICAgICBzaXplX3QgcHJlZml4X2xlbiA9IChwKSA/IHAgLSBkbGxfbmFtZSA6IHN0cmxlbiAoZGxsX25hbWUpOworICAgICAgZXhwX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHByZWZpeF9sZW4gKyA0ICsgMSk7CisgICAgICBzdHJuY3B5IChleHBfZmlsZV9uYW1lLCBkbGxfbmFtZSwgcHJlZml4X2xlbik7CisgICAgICBleHBfZmlsZV9uYW1lW3ByZWZpeF9sZW5dID0gJ1wwJzsKKyAgICAgIHN0cmNhdCAoZXhwX2ZpbGVfbmFtZSwgIi5leHAiKTsKKyAgICAgIGRlbGV0ZV9leHBfZmlsZSA9IDE7CisgICAgfQorICAKKyAgeworICAgIGludCBxdW90ZTsKKyAgICBkeW5fc3RyaW5nX3Qgc3RlcDIgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCisJCQkJICAgICAgICAgKyAyMCk7CisKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsICItLWJhc2UtZmlsZSAiKTsKKyAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAorICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAorCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgYmFzZV9maWxlX25hbWUpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKKworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tb3V0cHV0LWV4cCAiKTsKKyAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCisgICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKKwkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGV4cF9maWxlX25hbWUpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7CisKKyAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCisgICAgICB7CisgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIiAiKTsKKyAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBkbGx0b29sX2NtZGxpbmUtPnMpOworICAgICAgfQorCisgICAgaWYgKHJ1biAoZGxsdG9vbF9uYW1lLCBzdGVwMi0+cykpCisgICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKKyAgICAKKyAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDIpOworICB9CisKKyAgLyoKKyAgICogU3RlcCAzLiBDYWxsIEdDQy9MRCB0byBhZ2FpbiwgYWRkaW5nIHRoZSBleHAgZmlsZSB0aGlzIHRpbWUuCisgICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICogICAgCisgICAqICAgICUgZ2NjIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIGZvby5leHAgW3Jlc3QgLi4uXQorICAgKi8KKworICB7CisgICAgaW50IHF1b3RlOworCisgICAgZHluX3N0cmluZ190IHN0ZXAzID0gZHluX3N0cmluZ19uZXcgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCisJCQkJICAgICAgICAgKyAyMCk7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiLVdsLC0tYmFzZS1maWxlLCIpOworICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCisgICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBiYXNlX2ZpbGVfbmFtZSk7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKKwkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOworCisgICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAorICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBleHBfZmlsZV9uYW1lKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAorCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOworCisgICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCisgICAgICB7CisgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgIiAiKTsKKyAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBkcml2ZXJfY21kbGluZS0+cyk7CisgICAgICB9CisKKyAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDMtPnMpKQorICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7CisgICAgCisgICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAzKTsKKyAgfQorCisKKyAgLyoKKyAgICogU3RlcCA0LiBSdW4gRExMVE9PTCBhZ2FpbiB1c2luZyB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCisgICAqLworCisgIHsKKyAgICBpbnQgcXVvdGU7CisgICAgZHluX3N0cmluZ190IHN0ZXA0ID0gZHluX3N0cmluZ19uZXcgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQorCQkJCSAgICAgICAgICsgMjApOworCisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiLS1iYXNlLWZpbGUgIik7CisgICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKKyAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKKwkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGJhc2VfZmlsZV9uYW1lKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAorCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7CisKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLW91dHB1dC1leHAgIik7CisgICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAorICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBleHBfZmlsZV9uYW1lKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAorCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOworCisgICAgaWYgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoKQorICAgICAgeworICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgIik7CisgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKKyAgICAgIH0KKworICAgIGlmIChvdXRwdXRfbGliX2ZpbGVfbmFtZSkKKyAgICAgIHsKKyAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiIC0tb3V0cHV0LWxpYiAiKTsKKyAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBvdXRwdXRfbGliX2ZpbGVfbmFtZSk7CisgICAgICB9CisKKyAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXA0LT5zKSkKKyAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOworICAgIAorICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwNCk7CisgIH0KKyAgCisKKyAgLyoKKyAgICogU3RlcCA1LiBMaW5rIGl0IGFsbCB0b2dldGhlciBhbmQgYmUgZG9uZSB3aXRoIGl0LgorICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6CisgICAqICAgIAorICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgZm9vLmV4cCBbcmVzdCAuLi5dCisgICAqCisgICAqLworCisgIHsKKyAgICBpbnQgcXVvdGU7CisKKyAgICBkeW5fc3RyaW5nX3Qgc3RlcDUgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCisJCQkJICAgICAgICAgKyAyMCk7CisgICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAorICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOworICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCisJICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7CisgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBleHBfZmlsZV9uYW1lKTsKKyAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIAorCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOworCisgICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCisgICAgICB7CisgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgIiAiKTsKKyAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBkcml2ZXJfY21kbGluZS0+cyk7CisgICAgICB9CisKKyAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDUtPnMpKQorICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7CisgICAgCisgICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA1KTsKKyAgfQorCisgIGNsZWFudXBfYW5kX2V4aXQgKDApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5jIGIvYmludXRpbHMvZHluLXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTMwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9keW4tc3RyaW5nLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KKyAgIAorICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCisgICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmZGVmIElOX0dDQworI2luY2x1ZGUgInN5c3RlbS5oIgorI2luY2x1ZGUgImdhbnNpZGVjbC5oIgorI2Vsc2UKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2VuZGlmCisjaW5jbHVkZSAiZHluLXN0cmluZy5oIgorCitleHRlcm4gY2hhciAqeG1hbGxvYyAoKTsKK2V4dGVybiBjaGFyICp4cmVhbGxvYyAoKTsKKworLyogQ3JlYXRlIGEgbmV3IGR5bmFtaWMgc3RyaW5nIGNhcGFibGUgb2YgaG9sZGluZyBhdCBsZWFzdCBTUEFDRQorICAgY2hhcmFjdGVycywgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwuICBJZiBTUEFDRSBpcyAwLCBpdAorICAgd2lsbCBiZSBzaWxlbnRseSBpbmNyZWFzZWQgdG8gMS4gICovCisKK2R5bl9zdHJpbmdfdCAKK2R5bl9zdHJpbmdfbmV3IChzcGFjZSkKKyAgICAgaW50IHNwYWNlOworeworICBkeW5fc3RyaW5nX3QgcmVzdWx0ID0gKGR5bl9zdHJpbmdfdCkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZHluX3N0cmluZykpOworIAorICBpZiAoc3BhY2UgPT0gMCkKKyAgICAvKiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBieXRlIGluIHdoaWNoIHRvIHN0b3JlIHRoZSB0ZXJtaW5hdGluZworICAgICAgIE5VTC4gICovCisgICAgc3BhY2UgPSAxOworCisgIHJlc3VsdC0+YWxsb2NhdGVkID0gc3BhY2U7CisgIHJlc3VsdC0+cyA9IChjaGFyKikgeG1hbGxvYyAoc3BhY2UpOworICByZXN1bHQtPmxlbmd0aCA9IDA7CisgIHJlc3VsdC0+c1swXSA9ICdcMCc7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogRnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgRFMuICAqLworCit2b2lkIAorZHluX3N0cmluZ19kZWxldGUgKGRzKQorICAgICBkeW5fc3RyaW5nX3QgZHM7Cit7CisgIGZyZWUgKGRzLT5zKTsKKyAgZnJlZSAoZHMpOworfQorCisvKiBBcHBlbmQgdGhlIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBTIHRvIERTLCByZXNpemluZyBEUyBpZgorICAgbmVjZXNzYXJ5LiAgKi8KKworZHluX3N0cmluZ190IAorZHluX3N0cmluZ19hcHBlbmQgKGRzLCBzKQorICAgICBkeW5fc3RyaW5nX3QgZHM7CisgICAgIGNoYXIgKnM7Cit7CisgIGludCBsZW4gPSBzdHJsZW4gKHMpOworICBkeW5fc3RyaW5nX3Jlc2l6ZSAoZHMsIGRzLT5sZW5ndGggKyBsZW4gKyAxIC8qICdcMCcgKi8pOworICBzdHJjcHkgKGRzLT5zICsgZHMtPmxlbmd0aCwgcyk7CisgIGRzLT5sZW5ndGggKz0gbGVuOworCisgIHJldHVybiBkczsKK30KKworLyogSW5jcmVhc2UgdGhlIGNhcGFjaXR5IG9mIERTIHNvIHRoYXQgaXQgY2FuIGhvbGQgYXQgbGVhc3QgU1BBQ0UKKyAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdAorICAgKGF0IHByZXNlbnQpIHJlZHVjZSB0aGUgY2FwYWNpdHkgb2YgRFMuICAqLworCitkeW5fc3RyaW5nX3QgCitkeW5fc3RyaW5nX3Jlc2l6ZSAoZHMsIHNwYWNlKQorICAgICBkeW5fc3RyaW5nX3QgZHM7CisgICAgIGludCBzcGFjZTsKK3sKKyAgaW50IG5ld19hbGxvY2F0ZWQgPSBkcy0+YWxsb2NhdGVkOworCisgIHdoaWxlIChzcGFjZSA+IG5ld19hbGxvY2F0ZWQpCisgICAgbmV3X2FsbG9jYXRlZCAqPSAyOworICAgIAorICBpZiAobmV3X2FsbG9jYXRlZCAhPSBkcy0+YWxsb2NhdGVkKQorICAgIHsKKyAgICAgIC8qIFdlIGFjdHVhbGx5IG5lZWQgbW9yZSBzcGFjZS4gICovCisgICAgICBkcy0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKKyAgICAgIGRzLT5zID0gKGNoYXIqKSB4cmVhbGxvYyAoZHMtPnMsIGRzLT5hbGxvY2F0ZWQpOworICAgIH0KKworICByZXR1cm4gZHM7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9keW4tc3RyaW5nLmggYi9iaW51dGlscy9keW4tc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyYmJiZgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2R5bi1zdHJpbmcuaApAQCAtMCwwICsxLDM0IEBACisvKiBBbiBhYnN0cmFjdCBzdHJpbmcgZGF0YXR5cGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCisgICAKKyAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBiaW51dGlscyBhbmQgZ2NjLgorICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCisKK3R5cGVkZWYgc3RydWN0IGR5bl9zdHJpbmcKK3sKKyAgaW50IGFsbG9jYXRlZDsgLyogVGhlIGFtb3VudCBvZiBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBzdHJpbmcuICAqLworICBpbnQgbGVuZ3RoOyAvKiBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAgKi8KKyAgY2hhciAqczsgLyogVGhlIHN0cmluZyBpdHNlbGYsIE5VTC10ZXJtaW5hdGVkLiAgKi8KK30qIGR5bl9zdHJpbmdfdDsKKworZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX25ldyAgICAgIFBBUkFNUygoaW50KSk7CitleHRlcm4gdm9pZCBkeW5fc3RyaW5nX2RlbGV0ZSAgICAgICAgICAgUEFSQU1TKChkeW5fc3RyaW5nX3QpKTsKK2V4dGVybiBkeW5fc3RyaW5nX3QgZHluX3N0cmluZ19hcHBlbmQgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCwgY2hhciopKTsKK2V4dGVybiBkeW5fc3RyaW5nX3QgZHluX3N0cmluZ19yZXNpemUgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCwgaW50KSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9maWxlbW9kZS5jIGIvYmludXRpbHMvZmlsZW1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGI1MmJhCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvZmlsZW1vZGUuYwpAQCAtMCwwICsxLDI2NiBAQAorLyogZmlsZW1vZGUuYyAtLSBtYWtlIGEgc3RyaW5nIGRlc2NyaWJpbmcgZmlsZSBtb2RlcworICAgQ29weXJpZ2h0IChDKSAxOTg1LCA5MCwgOTEsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisMCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisKK3N0YXRpYyBjaGFyIGZ0eXBlbGV0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyB2b2lkIHNldHN0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNoYXIgKikpOworCisvKiBmaWxlbW9kZXN0cmluZyAtIGZpbGwgaW4gc3RyaW5nIFNUUiB3aXRoIGFuIGxzLXN0eWxlIEFTQ0lJCisgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RfbW9kZSBmaWVsZCBvZiBmaWxlIHN0YXRzIGJsb2NrIFNUQVRQLgorICAgMTAgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIFNUUjsgbm8gdGVybWluYXRpbmcgbnVsbCBpcyBhZGRlZC4KKyAgIFRoZSBjaGFyYWN0ZXJzIHN0b3JlZCBpbiBTVFIgYXJlOgorCisgICAwCUZpbGUgdHlwZS4gICdkJyBmb3IgZGlyZWN0b3J5LCAnYycgZm9yIGNoYXJhY3RlcgorCXNwZWNpYWwsICdiJyBmb3IgYmxvY2sgc3BlY2lhbCwgJ20nIGZvciBtdWx0aXBsZXgsCisJJ2wnIGZvciBzeW1ib2xpYyBsaW5rLCAncycgZm9yIHNvY2tldCwgJ3AnIGZvciBmaWZvLAorCSctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZQorCisgICAxCSdyJyBpZiB0aGUgb3duZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCisKKyAgIDIJJ3cnIGlmIHRoZSBvd25lciBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCisKKyAgIDMJJ3gnIGlmIHRoZSBvd25lciBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCisJc2V0LXVzZXItaWQsICctJyBvdGhlcndpc2UuCisJJ1MnIGlmIHRoZSBmaWxlIGlzIHNldC11c2VyLWlkLCBidXQgdGhlIGV4ZWN1dGUKKwliaXQgaXNuJ3Qgc2V0LgorCisgICA0CSdyJyBpZiBncm91cCBtZW1iZXJzIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgorCisgICA1CSd3JyBpZiBncm91cCBtZW1iZXJzIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KKworICAgNgkneCcgaWYgZ3JvdXAgbWVtYmVycyBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCisJc2V0LWdyb3VwLWlkLCAnLScgb3RoZXJ3aXNlLgorCSdTJyBpZiBpdCBpcyBzZXQtZ3JvdXAtaWQgYnV0IG5vdCBleGVjdXRhYmxlLgorCisgICA3CSdyJyBpZiBhbnkgdXNlciBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KKworICAgOAkndycgaWYgYW55IHVzZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgorCisgICA5CSd4JyBpZiBhbnkgdXNlciBtYXkgZXhlY3V0ZSwgJ3QnIGlmIHRoZSBmaWxlIGlzICJzdGlja3kiCisJKHdpbGwgYmUgcmV0YWluZWQgaW4gc3dhcCBzcGFjZSBhZnRlciBleGVjdXRpb24pLCAnLScKKwlvdGhlcndpc2UuCisJJ1QnIGlmIHRoZSBmaWxlIGlzIHN0aWNreSBidXQgbm90IGV4ZWN1dGFibGUuICovCisKKyNpZiAwCisKKy8qIFRoaXMgaXMgbm90IHVzZWQ7IG9ubHkgbW9kZV9zdHJpbmcgaXMgdXNlZC4gICovCisKK3ZvaWQKK2ZpbGVtb2Rlc3RyaW5nIChzdGF0cCwgc3RyKQorICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdHA7CisgICAgIGNoYXIgKnN0cjsKK3sKKyAgbW9kZV9zdHJpbmcgKCh1bnNpZ25lZCBsb25nKSBzdGF0cC0+c3RfbW9kZSwgc3RyKTsKK30KKworI2VuZGlmCisKKy8qIEdldCBkZWZpbml0aW9ucyBmb3IgdGhlIGZpbGUgcGVybWlzc2lvbiBiaXRzLiAgKi8KKworI2lmbmRlZiBTX0lSV1hVCisjZGVmaW5lIFNfSVJXWFUgMDcwMAorI2VuZGlmCisjaWZuZGVmIFNfSVJVU1IKKyNkZWZpbmUgU19JUlVTUiAwNDAwCisjZW5kaWYKKyNpZm5kZWYgU19JV1VTUgorI2RlZmluZSBTX0lXVVNSIDAyMDAKKyNlbmRpZgorI2lmbmRlZiBTX0lYVVNSCisjZGVmaW5lIFNfSVhVU1IgMDEwMAorI2VuZGlmCisKKyNpZm5kZWYgU19JUldYRworI2RlZmluZSBTX0lSV1hHIDAwNzAKKyNlbmRpZgorI2lmbmRlZiBTX0lSR1JQCisjZGVmaW5lIFNfSVJHUlAgMDA0MAorI2VuZGlmCisjaWZuZGVmIFNfSVdHUlAKKyNkZWZpbmUgU19JV0dSUCAwMDIwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorI2RlZmluZSBTX0lYR1JQIDAwMTAKKyNlbmRpZgorCisjaWZuZGVmIFNfSVJXWE8KKyNkZWZpbmUgU19JUldYTyAwMDA3CisjZW5kaWYKKyNpZm5kZWYgU19JUk9USAorI2RlZmluZSBTX0lST1RIIDAwMDQKKyNlbmRpZgorI2lmbmRlZiBTX0lXT1RICisjZGVmaW5lIFNfSVdPVEggMDAwMgorI2VuZGlmCisjaWZuZGVmIFNfSVhPVEgKKyNkZWZpbmUgU19JWE9USCAwMDAxCisjZW5kaWYKKworLyogTGlrZSBmaWxlbW9kZXN0cmluZywgYnV0IG9ubHkgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGBzdHJ1Y3Qgc3RhdCcKKyAgIGlzIGdpdmVuIGFzIGFuIGFyZ3VtZW50LiAqLworCit2b2lkCittb2RlX3N0cmluZyAobW9kZSwgc3RyKQorICAgICB1bnNpZ25lZCBsb25nIG1vZGU7CisgICAgIGNoYXIgKnN0cjsKK3sKKyAgc3RyWzBdID0gZnR5cGVsZXQgKCh1bnNpZ25lZCBsb25nKSBtb2RlKTsKKyAgc3RyWzFdID0gKG1vZGUgJiBTX0lSVVNSKSAhPSAwID8gJ3InIDogJy0nOworICBzdHJbMl0gPSAobW9kZSAmIFNfSVdVU1IpICE9IDAgPyAndycgOiAnLSc7CisgIHN0clszXSA9IChtb2RlICYgU19JWFVTUikgIT0gMCA/ICd4JyA6ICctJzsKKyAgc3RyWzRdID0gKG1vZGUgJiBTX0lSR1JQKSAhPSAwID8gJ3InIDogJy0nOworICBzdHJbNV0gPSAobW9kZSAmIFNfSVdHUlApICE9IDAgPyAndycgOiAnLSc7CisgIHN0cls2XSA9IChtb2RlICYgU19JWEdSUCkgIT0gMCA/ICd4JyA6ICctJzsKKyAgc3RyWzddID0gKG1vZGUgJiBTX0lST1RIKSAhPSAwID8gJ3InIDogJy0nOworICBzdHJbOF0gPSAobW9kZSAmIFNfSVdPVEgpICE9IDAgPyAndycgOiAnLSc7CisgIHN0cls5XSA9IChtb2RlICYgU19JWE9USCkgIT0gMCA/ICd4JyA6ICctJzsKKyAgc2V0c3QgKCh1bnNpZ25lZCBsb25nKSBtb2RlLCBzdHIpOworfQorCisvKiBSZXR1cm4gYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBmaWxlIGRlc2NyaWJlZCBieQorICAgZmlsZSBtb2RlIEJJVFM6CisgICAnZCcgZm9yIGRpcmVjdG9yaWVzCisgICAnYicgZm9yIGJsb2NrIHNwZWNpYWwgZmlsZXMKKyAgICdjJyBmb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMKKyAgICdtJyBmb3IgbXVsdGlwbGV4b3IgZmlsZXMKKyAgICdsJyBmb3Igc3ltYm9saWMgbGlua3MKKyAgICdzJyBmb3Igc29ja2V0cworICAgJ3AnIGZvciBmaWZvcworICAgJy0nIGZvciBhbnkgb3RoZXIgZmlsZSB0eXBlLiAqLworCisjaWZuZGVmIFNfSVNESVIKKyNpZmRlZiBTX0lGRElSCisjZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZESVIpICovCisjZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiAwMTcwMDAwKSA9PSAwNDAwMDApCisjZW5kaWYgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLworI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0RJUikgKi8KKworI2lmbmRlZiBTX0lTQkxLCisjaWZkZWYgU19JRkJMSworI2RlZmluZSBTX0lTQkxLKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQkxLKQorI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLworI2RlZmluZSBTX0lTQkxLKGkpIDAKKyNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZCTEspICovCisjZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQkxLKSAqLworCisjaWZuZGVmIFNfSVNDSFIKKyNpZmRlZiBTX0lGQ0hSCisjZGVmaW5lIFNfSVNDSFIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCisjZGVmaW5lIFNfSVNDSFIoaSkgMAorI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkNIUikgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNDSFIpICovCisKKyNpZm5kZWYgU19JU0ZJRk8KKyNpZmRlZiBTX0lGSUZPCisjZGVmaW5lIFNfSVNGSUZPKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLworI2RlZmluZSBTX0lTRklGTyhpKSAwCisjZW5kaWYgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLworI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0ZJRk8pICovCisKKyNpZm5kZWYgU19JU1NPQ0sKKyNpZmRlZiBTX0lGU09DSworI2RlZmluZSBTX0lTU09DSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisjZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZTT0NLKSAqLworI2RlZmluZSBTX0lTU09DSyhpKSAwCisjZW5kaWYgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNTT0NLKSAqLworCisjaWZuZGVmIFNfSVNMTksKKyNpZmRlZiBTX0lGTE5LCisjZGVmaW5lIFNfSVNMTksoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZMTkspCisjZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCisjZGVmaW5lIFNfSVNMTksoaSkgMAorI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkxOSykgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNMTkspICovCisKK3N0YXRpYyBjaGFyCitmdHlwZWxldCAoYml0cykKKyAgICAgdW5zaWduZWQgbG9uZyBiaXRzOworeworICBpZiAoU19JU0RJUiAoYml0cykpCisgICAgcmV0dXJuICdkJzsKKyAgaWYgKFNfSVNMTksgKGJpdHMpKQorICAgIHJldHVybiAnbCc7CisgIGlmIChTX0lTQkxLIChiaXRzKSkKKyAgICByZXR1cm4gJ2InOworICBpZiAoU19JU0NIUiAoYml0cykpCisgICAgcmV0dXJuICdjJzsKKyAgaWYgKFNfSVNTT0NLIChiaXRzKSkKKyAgICByZXR1cm4gJ3MnOworICBpZiAoU19JU0ZJRk8gKGJpdHMpKQorICAgIHJldHVybiAncCc7CisKKyNpZmRlZiBTX0lGTVQKKyNpZmRlZiBTX0lGTVBDCisgIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk1QQworICAgICAgfHwgKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEIpCisgICAgcmV0dXJuICdtJzsKKyNlbmRpZgorI2lmZGVmIFNfSUZOV0sKKyAgaWYgKChiaXRzICYgU19JRk1UKSA9PSBTX0lGTldLKQorICAgIHJldHVybiAnbic7CisjZW5kaWYKKyNlbmRpZgorCisgIHJldHVybiAnLSc7Cit9CisKKy8qIFNldCB0aGUgJ3MnIGFuZCAndCcgZmxhZ3MgaW4gZmlsZSBhdHRyaWJ1dGVzIHN0cmluZyBDSEFSUywKKyAgIGFjY29yZGluZyB0byB0aGUgZmlsZSBtb2RlIEJJVFMuICovCisKK3N0YXRpYyB2b2lkCitzZXRzdCAoYml0cywgY2hhcnMpCisgICAgIHVuc2lnbmVkIGxvbmcgYml0czsKKyAgICAgY2hhciAqY2hhcnM7Cit7CisjaWZkZWYgU19JU1VJRAorICBpZiAoYml0cyAmIFNfSVNVSUQpCisgICAgeworICAgICAgaWYgKGNoYXJzWzNdICE9ICd4JykKKwkvKiBTZXQtdWlkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgb3duZXIuICovCisJY2hhcnNbM10gPSAnUyc7CisgICAgICBlbHNlCisJY2hhcnNbM10gPSAncyc7CisgICAgfQorI2VuZGlmCisjaWZkZWYgU19JU0dJRAorICBpZiAoYml0cyAmIFNfSVNHSUQpCisgICAgeworICAgICAgaWYgKGNoYXJzWzZdICE9ICd4JykKKwkvKiBTZXQtZ2lkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgZ3JvdXAuICovCisJY2hhcnNbNl0gPSAnUyc7CisgICAgICBlbHNlCisJY2hhcnNbNl0gPSAncyc7CisgICAgfQorI2VuZGlmCisjaWZkZWYgU19JU1ZUWAorICBpZiAoYml0cyAmIFNfSVNWVFgpCisgICAgeworICAgICAgaWYgKGNoYXJzWzldICE9ICd4JykKKwkvKiBTdGlja3ksIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBvdGhlcnMuICovCisJY2hhcnNbOV0gPSAnVCc7CisgICAgICBlbHNlCisJY2hhcnNbOV0gPSAndCc7CisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9pZWVlLmMgYi9iaW51dGlscy9pZWVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhNWI4OAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL2llZWUuYwpAQCAtMCwwICsxLDc2MDkgQEAKKy8qIGllZWUuYyAtLSBSZWFkIGFuZCB3cml0ZSBJRUVFLTY5NSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHJlYWRzIGFuZCB3cml0ZXMgSUVFRS02OTUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJpZWVlLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJidWRiZy5oIgorCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbiBlbnRyeSBvbiB0aGUgYmxvY2sgc3RhY2suICAqLworCitzdHJ1Y3QgaWVlZV9ibG9jaworeworICAvKiBUaGUga2luZCBvZiBibG9jay4gICovCisgIGludCBraW5kOworICAvKiBUaGUgc291cmNlIGZpbGUgbmFtZSwgZm9yIGEgQkI1IGJsb2NrLiAgKi8KKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIC8qIFRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gdHlwZSwgZm9yIGEgQkI0IG9yIEJCNiBibG9jay4gICovCisgIHVuc2lnbmVkIGludCBmbmluZHg7CisgIC8qIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBza2lwcGVkLiAgKi8KKyAgYm9vbGVhbiBza2lwOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGJsb2NrIHN0YWNrLiAgKi8KKworI2RlZmluZSBCTE9DS1NUQUNLX1NJWkUgKDE2KQorCitzdHJ1Y3QgaWVlZV9ibG9ja3N0YWNrCit7CisgIC8qIFRoZSBzdGFjayBwb2ludGVyLiAgKi8KKyAgc3RydWN0IGllZWVfYmxvY2sgKmJzcDsKKyAgLyogVGhlIHN0YWNrLiAgKi8KKyAgc3RydWN0IGllZWVfYmxvY2sgc3RhY2tbQkxPQ0tTVEFDS19TSVpFXTsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHZhcmlhYmxlLiAgKi8KKworc3RydWN0IGllZWVfdmFyCit7CisgIC8qIFN0YXJ0IG9mIG5hbWUuICAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBMZW5ndGggb2YgbmFtZS4gICovCisgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOworICAvKiBUeXBlLiAgKi8KKyAgZGVidWdfdHlwZSB0eXBlOworICAvKiBTbG90IGlmIHdlIG1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gICovCisgIGRlYnVnX3R5cGUgKnBzbG90OworICAvKiBLaW5kIG9mIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLiAgKi8KKyAgZW51bQorICAgIHsKKyAgICAgIElFRUVfVU5LTk9XTiwKKyAgICAgIElFRUVfRVhURVJOQUwsCisgICAgICBJRUVFX0dMT0JBTCwKKyAgICAgIElFRUVfU1RBVElDLAorICAgICAgSUVFRV9MT0NBTCwKKyAgICAgIElFRUVfRlVOQ1RJT04KKyAgICB9IGtpbmQ7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgdGhlIHZhcmlhYmxlcy4gICovCisKK3N0cnVjdCBpZWVlX3ZhcnMKK3sKKyAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZC4gICovCisgIHVuc2lnbmVkIGludCBhbGxvYzsKKyAgLyogVmFyaWFibGVzLiAgKi8KKyAgc3RydWN0IGllZWVfdmFyICp2YXJzOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgdHlwZS4gIFdlIG5lZWQgdGhpcyBiZWNhdXNlCisgICB3ZSBkb24ndCB3YW50IHRvIHJlcHJlc2VudCBiaXRmaWVsZHMgYXMgcmVhbCB0eXBlcy4gICovCisKK3N0cnVjdCBpZWVlX3R5cGUKK3sKKyAgLyogVHlwZS4gICovCisgIGRlYnVnX3R5cGUgdHlwZTsKKyAgLyogU2xvdCBpZiB0aGlzIGlzIHR5cGUgaXMgcmVmZXJlbmNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4gICovCisgIGRlYnVnX3R5cGUgKnBzbG90OworICAvKiBTbG90cyBmb3IgYXJndW1lbnRzIGlmIHdlIG1ha2UgaW5kaXJlY3QgdHlwZXMgZm9yIHRoZW0uICAqLworICBkZWJ1Z190eXBlICphcmdfc2xvdHM7CisgIC8qIElmIHRoaXMgaXMgYSBiaXRmaWVsZCwgdGhpcyBpcyB0aGUgc2l6ZSBpbiBiaXRzLiAgSWYgdGhpcyBpcyBub3QKKyAgICAgYSBiaXRmaWVsZCwgdGhpcyBpcyB6ZXJvLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBiaXRzaXplOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KKworc3RydWN0IGllZWVfdHlwZXMKK3sKKyAgLyogTnVtYmVyIG9mIHNsb3RzIGFsbG9jYXRlZC4gICovCisgIHVuc2lnbmVkIGludCBhbGxvYzsKKyAgLyogVHlwZXMuICAqLworICBzdHJ1Y3QgaWVlZV90eXBlICp0eXBlczsKKyAgLyogQnVpbHRpbiB0eXBlcy4gICovCisjZGVmaW5lIEJVSUxUSU5fVFlQRV9DT1VOVCAoNjApCisgIGRlYnVnX3R5cGUgYnVpbHRpbnNbQlVJTFRJTl9UWVBFX0NPVU5UXTsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGEgbGlua2VkIGxhc3Qgb2Ygc3RydWN0cyB3aXRoIHRoZWlyIHRhZyBuYW1lcywKKyAgIHNvIHRoYXQgd2UgY2FuIGNvbnZlcnQgdGhlbSB0byBDKysgY2xhc3NlcyBpZiBuZWNlc3NhcnkuICAqLworCitzdHJ1Y3QgaWVlZV90YWcKK3sKKyAgLyogTmV4dCB0YWcuICAqLworICBzdHJ1Y3QgaWVlZV90YWcgKm5leHQ7CisgIC8qIFRoaXMgdGFnIG5hbWUuICAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBUaGUgdHlwZSBvZiB0aGUgdGFnLiAgKi8KKyAgZGVidWdfdHlwZSB0eXBlOworICAvKiBUaGUgdGFnZ2VkIHR5cGUgaXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyBhdCB0aGlzIHNsb3QuICAqLworICBkZWJ1Z190eXBlIHNsb3Q7CisgIC8qIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc2xvdHMgdXNlZCB3aGVuIGEgZmllbGQgdHlwZSBpcyBjb252ZXJ0ZWQKKyAgICAgaW50byBhIGluZGlyZWN0IHR5cGUsIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgbGF0ZXIgY29udmVydGVkIGludG8KKyAgICAgYSByZWZlcmVuY2UgdHlwZS4gICovCisgIGRlYnVnX3R5cGUgKmZzbG90czsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB3ZSBwYXNzIGFyb3VuZCB0byB0aGUgcGFyc2luZworICAgZnVuY3Rpb25zLiAgKi8KKworc3RydWN0IGllZWVfaW5mbworeworICAvKiBUaGUgZGVidWdnaW5nIGhhbmRsZS4gICovCisgIFBUUiBkaGFuZGxlOworICAvKiBUaGUgQkZELiAgKi8KKyAgYmZkICphYmZkOworICAvKiBUaGUgc3RhcnQgb2YgdGhlIGJ5dGVzIHRvIGJlIHBhcnNlZC4gICovCisgIGNvbnN0IGJmZF9ieXRlICpieXRlczsKKyAgLyogVGhlIGVuZCBvZiB0aGUgYnl0ZXMgdG8gYmUgcGFyc2VkLiAgKi8KKyAgY29uc3QgYmZkX2J5dGUgKnBlbmQ7CisgIC8qIFRoZSBibG9jayBzdGFjay4gICovCisgIHN0cnVjdCBpZWVlX2Jsb2Nrc3RhY2sgYmxvY2tzdGFjazsKKyAgLyogV2hldGhlciB3ZSBoYXZlIHNlZW4gYSBCQjEgb3IgQkIyLiAgKi8KKyAgYm9vbGVhbiBzYXdfZmlsZW5hbWU7CisgIC8qIFRoZSB2YXJpYWJsZXMuICAqLworICBzdHJ1Y3QgaWVlZV92YXJzIHZhcnM7CisgIC8qIFRoZSBnbG9iYWwgdmFyaWFibGVzLCBhZnRlciBhIGdsb2JhbCB0eXBlZGVmIGJsb2NrLiAgKi8KKyAgc3RydWN0IGllZWVfdmFycyAqZ2xvYmFsX3ZhcnM7CisgIC8qIFRoZSB0eXBlcy4gICovCisgIHN0cnVjdCBpZWVlX3R5cGVzIHR5cGVzOworICAvKiBUaGUgZ2xvYmFsIHR5cGVzLCBhZnRlciBhIGdsb2JhbCB0eXBlZGVmIGJsb2NrLiAgKi8KKyAgc3RydWN0IGllZWVfdHlwZXMgKmdsb2JhbF90eXBlczsKKyAgLyogVGhlIGxpc3Qgb2YgdGFnZ2VkIHN0cnVjdHMuICAqLworICBzdHJ1Y3QgaWVlZV90YWcgKnRhZ3M7Cit9OworCisvKiBCYXNpYyBidWlsdGluIHR5cGVzLCBub3QgaW5jbHVkaW5nIHRoZSBwb2ludGVycy4gICovCisKK2VudW0gYnVpbHRpbl90eXBlcworeworICBidWlsdGluX3Vua25vd24gPSAwLAorICBidWlsdGluX3ZvaWQgPSAxLAorICBidWlsdGluX3NpZ25lZF9jaGFyID0gMiwKKyAgYnVpbHRpbl91bnNpZ25lZF9jaGFyID0gMywKKyAgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50ID0gNCwKKyAgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQgPSA1LAorICBidWlsdGluX3NpZ25lZF9sb25nID0gNiwKKyAgYnVpbHRpbl91bnNpZ25lZF9sb25nID0gNywKKyAgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nID0gOCwKKyAgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmcgPSA5LAorICBidWlsdGluX2Zsb2F0ID0gMTAsCisgIGJ1aWx0aW5fZG91YmxlID0gMTEsCisgIGJ1aWx0aW5fbG9uZ19kb3VibGUgPSAxMiwKKyAgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlID0gMTMsCisgIGJ1aWx0aW5fcXVvdGVkX3N0cmluZyA9IDE0LAorICBidWlsdGluX2luc3RydWN0aW9uX2FkZHJlc3MgPSAxNSwKKyAgYnVpbHRpbl9pbnQgPSAxNiwKKyAgYnVpbHRpbl91bnNpZ25lZCA9IDE3LAorICBidWlsdGluX3Vuc2lnbmVkX2ludCA9IDE4LAorICBidWlsdGluX2NoYXIgPSAxOSwKKyAgYnVpbHRpbl9sb25nID0gMjAsCisgIGJ1aWx0aW5fc2hvcnQgPSAyMSwKKyAgYnVpbHRpbl91bnNpZ25lZF9zaG9ydCA9IDIyLAorICBidWlsdGluX3Nob3J0X2ludCA9IDIzLAorICBidWlsdGluX3NpZ25lZF9zaG9ydCA9IDI0LAorICBidWlsdGluX2JjZF9mbG9hdCA9IDI1Cit9OworCisvKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgZGVyaXZhdGlvbiBmbGFncyBvZiBhICdiJworICAgY29tcG9uZW50IHJlY29yZCBvZiBhICdUJyB0eXBlIGV4dGVuc2lvbiByZWNvcmQgaW4gYSBDKysgcG1pc2MKKyAgIHJlY29yZC4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCisKKy8qIFNldCBmb3IgYSBwcml2YXRlIGJhc2UgY2xhc3MsIGNsZWFyIGZvciBhIHB1YmxpYyBiYXNlIGNsYXNzLgorICAgUHJvdGVjdGVkIGJhc2UgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4gICovCisjZGVmaW5lIEJBU0VGTEFHU19QUklWQVRFICgweDEpCisvKiBTZXQgZm9yIGEgdmlydHVhbCBiYXNlIGNsYXNzLiAgKi8KKyNkZWZpbmUgQkFTRUZMQUdTX1ZJUlRVQUwgKDB4MikKKy8qIFNldCBmb3IgYSBmcmllbmQgY2xhc3MsIGNsZWFyIGZvciBhIGJhc2UgY2xhc3MuICAqLworI2RlZmluZSBCQVNFRkxBR1NfRlJJRU5EICgweDEwKQorCisvKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgc3BlY3MgZmxhZ3Mgb2YgYSAnZCcsICdtJywgb3IgJ3YnCisgICBjb21wb25lbnQgcmVjb3JkIG9mIGEgJ1QnIHR5cGUgZXh0ZW5zaW9uIHJlY29yZCBpbiBhIEMrKyBwbWlzYworICAgcmVjb3JkLiAgVGhlIHNhbWUgZmxhZ3MgYXJlIHVzZWQgZm9yIGEgJ00nIHJlY29yZCBpbiBhIEMrKyBwbWlzYworICAgcmVjb3JkLiAgKi8KKworLyogVGhlIGxvd2VyIHR3byBiaXRzIGhvbGQgdmlzaWJpbGl0eSBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIENYWEZMQUdTX1ZJU0lCSUxJVFkgKDB4MykKKy8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHB1YmxpYyBtZW1iZXIuICAqLworI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQyAoMHgwKQorLyogVGhpcyB2YWx1ZSBpbiB0aGUgbG93ZXIgdHdvIGJpdHMgaW5kaWNhdGVzIGEgcHJpdmF0ZSBtZW1iZXIuICAqLworI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEUgKDB4MSkKKy8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHByb3RlY3RlZCBtZW1iZXIuICAqLworI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRCAoMHgyKQorLyogU2V0IGZvciBhIHN0YXRpYyBtZW1iZXIuICAqLworI2RlZmluZSBDWFhGTEFHU19TVEFUSUMgKDB4NCkKKy8qIFNldCBmb3IgYSB2aXJ0dWFsIG92ZXJyaWRlLiAgKi8KKyNkZWZpbmUgQ1hYRkxBR1NfT1ZFUlJJREUgKDB4OCkKKy8qIFNldCBmb3IgYSBmcmllbmQgZnVuY3Rpb24uICAqLworI2RlZmluZSBDWFhGTEFHU19GUklFTkQgKDB4MTApCisvKiBTZXQgZm9yIGEgY29uc3QgZnVuY3Rpb24uICAqLworI2RlZmluZSBDWFhGTEFHU19DT05TVCAoMHgyMCkKKy8qIFNldCBmb3IgYSB2b2xhdGlsZSBmdW5jdGlvbi4gICovCisjZGVmaW5lIENYWEZMQUdTX1ZPTEFUSUxFICgweDQwKQorLyogU2V0IGZvciBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgQ1hYRkxBR1NfT1ZFUkxPQURFRCAoMHg4MCkKKy8qIFNldCBmb3IgYW4gb3BlcmF0b3IgZnVuY3Rpb24uICAqLworI2RlZmluZSBDWFhGTEFHU19PUEVSQVRPUiAoMHgxMDApCisvKiBTZXQgZm9yIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICovCisjZGVmaW5lIENYWEZMQUdTX0NUT1JEVE9SICgweDQwMCkKKy8qIFNldCBmb3IgYSBjb25zdHJ1Y3Rvci4gICovCisjZGVmaW5lIENYWEZMQUdTX0NUT1IgKDB4MjAwKQorLyogU2V0IGZvciBhbiBpbmxpbmUgZnVuY3Rpb24uICAqLworI2RlZmluZSBDWFhGTEFHU19JTkxJTkUgKDB4ODAwKQorCisvKiBMb2NhbCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgdm9pZCBpZWVlX2Vycm9yCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBpZWVlX2VvZiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICopKTsKK3N0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX251bWJlcgorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcmVhZF9pZAorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAorCSAgIHVuc2lnbmVkIGxvbmcgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX29wdGlvbmFsX2lkCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGNvbnN0IGNoYXIgKiosCisJICAgdW5zaWduZWQgbG9uZyAqLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcmVhZF9leHByZXNzaW9uCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKikpOworc3RhdGljIGRlYnVnX3R5cGUgaWVlZV9idWlsdGluX3R5cGUKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfYWxsb2NfdHlwZQorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX3R5cGVfaW5kZXgKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgZGVidWdfdHlwZSAqKSk7CitzdGF0aWMgaW50IGllZWVfcmVnbm9fdG9fZ2VucmVnIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgaWVlZV9nZW5yZWdfdG9fcmVnbm8gUEFSQU1TICgoYmZkICosIGludCkpOworc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9iYiBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7CitzdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2JlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKK3N0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfbm4gUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOworc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV90eSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7CitzdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX2F0biBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X21pc2MKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9jbGFzcworICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfY3h4X2RlZmF1bHRzCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcmVhZF9yZWZlcmVuY2UKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZXF1aXJlX2FzbgorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcmVxdWlyZV9hdG42NQorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAorCSAgIHVuc2lnbmVkIGxvbmcgKikpOworCisvKiBSZXBvcnQgYW4gZXJyb3IgaW4gdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2llZWVfZXJyb3IgKGluZm8sIHAsIHMpCisgICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87CisgICAgIGNvbnN0IGJmZF9ieXRlICpwOworICAgICBjb25zdCBjaGFyICpzOworeworICBpZiAocCAhPSBOVUxMKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAweCVseDogJXMgKDB4JXgpXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwKKwkgICAgICh1bnNpZ25lZCBsb25nKSAocCAtIGluZm8tPmJ5dGVzKSwgcywgKnApOworICBlbHNlCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgcyk7Cit9CisKKy8qIFJlcG9ydCBhbiB1bmV4cGVjdGVkIEVPRiBpbiB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgdm9pZAoraWVlZV9lb2YgKGluZm8pCisgICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Cit7CisgIGllZWVfZXJyb3IgKGluZm8sIChjb25zdCBiZmRfYnl0ZSAqKSBOVUxMLAorCSAgICAgIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpKTsKK30KKworLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLworCitzdGF0aWMgY2hhciAqCitzYXZlc3RyaW5nIChzdGFydCwgbGVuKQorICAgICBjb25zdCBjaGFyICpzdGFydDsKKyAgICAgdW5zaWduZWQgbG9uZyBsZW47Cit7CisgIGNoYXIgKnJldDsKKworICByZXQgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgbWVtY3B5IChyZXQsIHN0YXJ0LCBsZW4pOworICByZXRbbGVuXSA9ICdcMCc7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIFJlYWQgYSBudW1iZXIgd2hpY2ggbXVzdCBiZSBwcmVzZW50IGluIGFuIElFRUUgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgcHYpCisgICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87CisgICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7CisgICAgIGJmZF92bWEgKnB2OworeworICByZXR1cm4gaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsIHB2LCAoYm9vbGVhbiAqKSBOVUxMKTsKK30KKworLyogUmVhZCBhIG51bWJlciBpbiBhbiBJRUVFIGZpbGUuICBJZiBwcHJlc2VudCBpcyBub3QgTlVMTCwgdGhlIG51bWJlcgorICAgbmVlZCBub3QgYmUgdGhlcmUuICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgcHYsIHBwcmVzZW50KQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICBiZmRfdm1hICpwdjsKKyAgICAgYm9vbGVhbiAqcHByZXNlbnQ7Cit7CisgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBiOworCisgIGlmICgqcHAgPj0gaW5mby0+cGVuZCkKKyAgICB7CisgICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKKwl7CisJICAqcHByZXNlbnQgPSBmYWxzZTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGllZWVfZW9mIChpbmZvKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYiA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7CisgICsrKnBwOworCisgIGlmIChiIDw9IGllZWVfbnVtYmVyX2VuZF9lbnVtKQorICAgIHsKKyAgICAgICpwdiA9IChiZmRfdm1hKSBiOworICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCisJKnBwcmVzZW50ID0gdHJ1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoYiA+PSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSAmJiBiIDw9IGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgaSA9IChpbnQpIGIgLSAoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bTsKKyAgICAgIGlmICgqcHAgKyBpIC0gMSA+PSBpbmZvLT5wZW5kKQorCXsKKwkgIGllZWVfZW9mIChpbmZvKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgICpwdiA9IDA7CisgICAgICBmb3IgKDsgaSA+IDA7IGktLSkKKwl7CisJICAqcHYgPDw9IDg7CisJICAqcHYgKz0gKipwcDsKKwkgICsrKnBwOworCX0KKworICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCisJKnBwcmVzZW50ID0gdHJ1ZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGlmIChwcHJlc2VudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC0tKnBwOworICAgICAgKnBwcmVzZW50ID0gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWVlZV9lcnJvciAoaW5mbywgKnBwIC0gMSwgXygiaW52YWxpZCBudW1iZXIiKSk7CisgIHJldHVybiBmYWxzZTsgIAorfQorCisvKiBSZWFkIGEgcmVxdWlyZWQgc3RyaW5nIGZyb20gYW4gSUVFRSBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfcmVhZF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICBjb25zdCBjaGFyICoqcG5hbWU7CisgICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Cit7CisgIHJldHVybiBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbiwgKGJvb2xlYW4gKikgTlVMTCk7Cit9CisKKy8qIFJlYWQgYSBzdHJpbmcgZnJvbSBhbiBJRUVFIGZpbGUuICBJZiBwcHJlc2VudCBpcyBub3QgTlVMTCwgdGhlCisgICBzdHJpbmcgaXMgb3B0aW9uYWwuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4sIHBwcmVzZW50KQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICBjb25zdCBjaGFyICoqcG5hbWU7CisgICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47CisgICAgIGJvb2xlYW4gKnBwcmVzZW50OworeworICBiZmRfYnl0ZSBiOworICB1bnNpZ25lZCBsb25nIGxlbjsKKworICBpZiAoKnBwID49IGluZm8tPnBlbmQpCisgICAgeworICAgICAgaWVlZV9lb2YgKGluZm8pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBiID0gKipwcDsKKyAgKysqcHA7CisKKyAgaWYgKGIgPD0gMHg3ZikKKyAgICBsZW4gPSBiOworICBlbHNlIGlmICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSBiID09IGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCisgICAgeworICAgICAgbGVuID0gKipwcDsKKyAgICAgICsrKnBwOworICAgIH0KKyAgZWxzZSBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgYiA9PSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQorICAgIHsKKyAgICAgIGxlbiA9ICgqKnBwIDw8IDgpICsgKCpwcClbMV07CisgICAgICAqcHAgKz0gMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocHByZXNlbnQgIT0gTlVMTCkKKwl7CisJICAtLSpwcDsKKwkgICpwcHJlc2VudCA9IGZhbHNlOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwIC0gMSwgXygiaW52YWxpZCBzdHJpbmcgbGVuZ3RoIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5wZW5kIC0gKnBwKSA8IGxlbikKKyAgICB7CisgICAgICBpZWVlX2VvZiAoaW5mbyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICpwbmFtZSA9IChjb25zdCBjaGFyICopICpwcDsKKyAgKnBuYW1sZW4gPSBsZW47CisgICpwcCArPSBsZW47CisKKyAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCisgICAgKnBwcmVzZW50ID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBhbiBleHByZXNzaW9uIGZyb20gYW4gSUVFRSBmaWxlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG9ubHkgdXNlZAorICAgdG8gcGFyc2UgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBJIGhhdmVuJ3QgYm90aGVyZWQgdG8gd3JpdGUgYSBmdWxsCisgICBibG93biBJRUVFIGV4cHJlc3Npb24gcGFyc2VyLiAgSSd2ZSBvbmx5IHRocm93biBpbiB0aGUgdGhpbmdzIEkndmUKKyAgIHNlZW4gaW4gZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gYmUgZWFzaWx5IGV4dGVuZGVkIGlmCisgICBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdikKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKKyAgICAgYmZkX3ZtYSAqcHY7Cit7CisgIGNvbnN0IGJmZF9ieXRlICpleHByX3N0YXJ0OworI2RlZmluZSBFWFBSX1NUQUNLX1NJWkUgKDEwKQorICBiZmRfdm1hIGV4cHJfc3RhY2tbRVhQUl9TVEFDS19TSVpFXTsKKyAgYmZkX3ZtYSAqZXNwOworCisgIGV4cHJfc3RhcnQgPSAqcHA7CisKKyAgZXNwID0gZXhwcl9zdGFjazsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7CisgICAgICBiZmRfdm1hIHZhbDsKKyAgICAgIGJvb2xlYW4gcHJlc2VudDsKKyAgICAgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOworCisgICAgICBzdGFydCA9ICpwcDsKKworICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2YWwsICZwcmVzZW50KSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChwcmVzZW50KQorCXsKKwkgIGlmIChlc3AgLSBleHByX3N0YWNrID49IEVYUFJfU1RBQ0tfU0laRSkKKwkgICAgeworCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IikpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgKmVzcCsrID0gdmFsOworCSAgY29udGludWU7CisJfQorCisgICAgICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKKworICAgICAgaWYgKGMgPj0gaWVlZV9tb2R1bGVfYmVnaW5uaW5nX2VudW0pCisJYnJlYWs7CisKKyAgICAgICsrKnBwOworCisgICAgICBpZiAoYyA9PSBpZWVlX2NvbW1hKQorCWJyZWFrOworCisgICAgICBzd2l0Y2ggKGMpCisJeworCWRlZmF1bHQ6CisJICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5zdXBwb3J0ZWQgSUVFRSBleHByZXNzaW9uIG9wZXJhdG9yIikpOworCSAgYnJlYWs7CisKKwljYXNlIGllZWVfdmFyaWFibGVfUl9lbnVtOgorCSAgeworCSAgICBiZmRfdm1hIGluZHg7CisJICAgIGFzZWN0aW9uICpzOworCisJICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaW5keCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICBmb3IgKHMgPSBpbmZvLT5hYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwkgICAgICBpZiAoKGJmZF92bWEpIHMtPnRhcmdldF9pbmRleCA9PSBpbmR4KQorCQlicmVhazsKKwkgICAgaWYgKHMgPT0gTlVMTCkKKwkgICAgICB7CisJCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmtub3duIHNlY3Rpb24iKSk7CisJCXJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICAgIAorCSAgICBpZiAoZXNwIC0gZXhwcl9zdGFjayA+PSBFWFBSX1NUQUNLX1NJWkUpCisJICAgICAgeworCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIpKTsKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKworCSAgICAqZXNwKysgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKKwljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKKwkgIHsKKwkgICAgYmZkX3ZtYSB2MSwgdjI7CisKKwkgICAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPCAyKQorCSAgICAgIHsKKwkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgdW5kZXJmbG93IikpOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCisJICAgIHYxID0gKi0tZXNwOworCSAgICB2MiA9ICotLWVzcDsKKwkgICAgKmVzcCsrID0gdjEgKyB2MjsKKwkgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGVzcCAtIDEgIT0gZXhwcl9zdGFjaykKKyAgICB7CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCBleHByX3N0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIG1pc21hdGNoIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAqcHYgPSAqLS1lc3A7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiBhbiBJRUVFIGJ1aWx0aW4gdHlwZS4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwgaW5keCkKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKnA7CisgICAgIHVuc2lnbmVkIGludCBpbmR4OworeworICBQVFIgZGhhbmRsZTsKKyAgZGVidWdfdHlwZSB0eXBlOworICBjb25zdCBjaGFyICpuYW1lOworCisgIGlmIChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UCisgICAgICAmJiBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSAhPSBERUJVR19UWVBFX05VTEwpCisgICAgcmV0dXJuIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdOworCisgIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOworCisgIGlmIChpbmR4ID49IDMyICYmIGluZHggPCA2NCkKKyAgICB7CisgICAgICB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsCisJCQkJICAgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsIGluZHggLSAzMikpOworICAgICAgYXNzZXJ0IChpbmR4IDwgQlVJTFRJTl9UWVBFX0NPVU5UKTsKKyAgICAgIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICBzd2l0Y2ggKChlbnVtIGJ1aWx0aW5fdHlwZXMpIGluZHgpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCBwLCBfKCJ1bmtub3duIGJ1aWx0aW4gdHlwZSIpKTsKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgY2FzZSBidWlsdGluX3Vua25vd246CisgICAgICB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOworICAgICAgbmFtZSA9IE5VTEw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl92b2lkOgorICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKKyAgICAgIG5hbWUgPSAidm9pZCI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfY2hhcjoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7CisgICAgICBuYW1lID0gInNpZ25lZCBjaGFyIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2NoYXI6CisgICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7CisgICAgICBuYW1lID0gInVuc2lnbmVkIGNoYXIiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7CisgICAgICBuYW1lID0gInNpZ25lZCBzaG9ydCBpbnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OgorICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOworICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCBpbnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmc6CisgICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOworICAgICAgbmFtZSA9ICJzaWduZWQgbG9uZyI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nOgorICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc6CisgICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOworICAgICAgbmFtZSA9ICJzaWduZWQgbG9uZyBsb25nIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX2xvbmdfbG9uZzoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKKyAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX2Zsb2F0OgorICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7CisgICAgICBuYW1lID0gImZsb2F0IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX2RvdWJsZToKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOworICAgICAgbmFtZSA9ICJkb3VibGUiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fbG9uZ19kb3VibGU6CisgICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCisgICAgICAgICBwcm9jZXNzb3IuICAqLworICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOworICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOgorICAgICAgdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTYpOworICAgICAgbmFtZSA9ICJsb25nIGxvbmcgZG91YmxlIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX3F1b3RlZF9zdHJpbmc6CisgICAgICB0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLAorCQkJCSAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgcCwKKwkJCQkJCSAgICAgICAoKHVuc2lnbmVkIGludCkKKwkJCQkJCQlidWlsdGluX2NoYXIpKSwKKwkJCQkgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsCisJCQkJCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpCisJCQkJCQkJYnVpbHRpbl9pbnQpKSwKKwkJCQkgICAgMCwgLTEsIHRydWUpOworICAgICAgbmFtZSA9ICJRVU9URUQgU1RSSU5HIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX2luc3RydWN0aW9uX2FkZHJlc3M6CisgICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBjb2RlIGFkZHJlc3MuICAqLworICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworICAgICAgbmFtZSA9ICJpbnN0cnVjdGlvbiBhZGRyZXNzIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX2ludDoKKyAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBmb3IgdGhpcyB0eXBlIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUKKyAgICAgICAgIHByb2Nlc3Nvci4gICovCisgICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOworICAgICAgbmFtZSA9ICJpbnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWQ6CisgICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCisgICAgICAgICBwcm9jZXNzb3IuICAqLworICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9pbnQ6CisgICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCisgICAgICAgICBwcm9jZXNzb3IuICAqLworICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fY2hhcjoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7CisgICAgICBuYW1lID0gImNoYXIiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fbG9uZzoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7CisgICAgICBuYW1lID0gImxvbmciOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fc2hvcnQ6CisgICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOworICAgICAgbmFtZSA9ICJzaG9ydCI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydDoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKKyAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJ1aWx0aW5fc2hvcnRfaW50OgorICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKKyAgICAgIG5hbWUgPSAic2hvcnQgaW50IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydDoKKyAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7CisgICAgICBuYW1lID0gInNpZ25lZCBzaG9ydCI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnVpbHRpbl9iY2RfZmxvYXQ6CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCBwLCBfKCJCQ0QgZmxvYXQgdHlwZSBub3Qgc3VwcG9ydGVkIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOworCisgIGFzc2VydCAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVCk7CisKKyAgaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF0gPSB0eXBlOworCisgIHJldHVybiB0eXBlOworfQorCisvKiBBbGxvY2F0ZSBtb3JlIHNwYWNlIGluIHRoZSB0eXBlIHRhYmxlLiAgSWYgcmVmIGlzIHRydWUsIHRoaXMgaXMgYQorICAgcmVmZXJlbmNlIHRvIHRoZSB0eXBlOyBpZiBpdCBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCB3ZSBzaG91bGQgc2V0CisgICB1cCBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfYWxsb2NfdHlwZSAoaW5mbywgaW5keCwgcmVmKQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICB1bnNpZ25lZCBpbnQgaW5keDsKKyAgICAgYm9vbGVhbiByZWY7Cit7CisgIHVuc2lnbmVkIGludCBuYWxsb2M7CisgIHJlZ2lzdGVyIHN0cnVjdCBpZWVlX3R5cGUgKnQ7CisgIHN0cnVjdCBpZWVlX3R5cGUgKnRlbmQ7CisKKyAgaWYgKGluZHggPj0gaW5mby0+dHlwZXMuYWxsb2MpCisgICAgeworICAgICAgbmFsbG9jID0gaW5mby0+dHlwZXMuYWxsb2M7CisgICAgICBpZiAobmFsbG9jID09IDApCisJbmFsbG9jID0gNDsKKyAgICAgIHdoaWxlIChpbmR4ID49IG5hbGxvYykKKwluYWxsb2MgKj0gMjsKKworICAgICAgaW5mby0+dHlwZXMudHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGUgKikKKwkJCSAgIHhyZWFsbG9jIChpbmZvLT50eXBlcy50eXBlcywKKwkJCQkgICAgIG5hbGxvYyAqIHNpemVvZiAqaW5mby0+dHlwZXMudHlwZXMpKTsKKworICAgICAgbWVtc2V0IChpbmZvLT50eXBlcy50eXBlcyArIGluZm8tPnR5cGVzLmFsbG9jLCAwLAorCSAgICAgIChuYWxsb2MgLSBpbmZvLT50eXBlcy5hbGxvYykgKiBzaXplb2YgKmluZm8tPnR5cGVzLnR5cGVzKTsKKworICAgICAgdGVuZCA9IGluZm8tPnR5cGVzLnR5cGVzICsgbmFsbG9jOworICAgICAgZm9yICh0ID0gaW5mby0+dHlwZXMudHlwZXMgKyBpbmZvLT50eXBlcy5hbGxvYzsgdCA8IHRlbmQ7IHQrKykKKwl0LT50eXBlID0gREVCVUdfVFlQRV9OVUxMOworCisgICAgICBpbmZvLT50eXBlcy5hbGxvYyA9IG5hbGxvYzsKKyAgICB9CisKKyAgaWYgKHJlZikKKyAgICB7CisgICAgICB0ID0gaW5mby0+dHlwZXMudHlwZXMgKyBpbmR4OworICAgICAgaWYgKHQtPnR5cGUgPT0gTlVMTCkKKwl7CisJICB0LT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqdC0+cHNsb3QpOworCSAgKnQtPnBzbG90ID0gREVCVUdfVFlQRV9OVUxMOworCSAgdC0+dHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoaW5mby0+ZGhhbmRsZSwgdC0+cHNsb3QsCisJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOworCSAgaWYgKHQtPnR5cGUgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgYSB0eXBlIGluZGV4IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsIHB0eXBlKQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICBkZWJ1Z190eXBlICpwdHlwZTsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OworICBiZmRfdm1hIGluZHg7CisKKyAgc3RhcnQgPSAqcHA7CisKKyAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZpbmR4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGluZHggPCAyNTYpCisgICAgeworICAgICAgKnB0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHN0YXJ0LCBpbmR4KTsKKyAgICAgIGlmICgqcHR5cGUgPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaW5keCAtPSAyNTY7CisgIGlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgaW5keCwgdHJ1ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgICpwdHlwZSA9IGluZm8tPnR5cGVzLnR5cGVzW2luZHhdLnR5cGU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFBhcnNlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIGZpbGUuICBUaGlzIGlzIHBhc3NlZCB0aGUKKyAgIGJ5dGVzIHdoaWNoIGNvbXBvc2UgdGhlIERlYnVnIEluZm9ybWF0aW9uIFBhcnQgb2YgYW4gSUVFRSBmaWxlLiAgKi8KKworYm9vbGVhbgorcGFyc2VfaWVlZSAoZGhhbmRsZSwgYWJmZCwgYnl0ZXMsIGxlbikKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgYmZkX2J5dGUgKmJ5dGVzOworICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKK3sKKyAgc3RydWN0IGllZWVfaW5mbyBpbmZvOworICB1bnNpZ25lZCBpbnQgaTsKKyAgY29uc3QgYmZkX2J5dGUgKnAsICpwZW5kOworCisgIGluZm8uZGhhbmRsZSA9IGRoYW5kbGU7CisgIGluZm8uYWJmZCA9IGFiZmQ7CisgIGluZm8uYnl0ZXMgPSBieXRlczsKKyAgaW5mby5wZW5kID0gYnl0ZXMgKyBsZW47CisgIGluZm8uYmxvY2tzdGFjay5ic3AgPSBpbmZvLmJsb2Nrc3RhY2suc3RhY2s7CisgIGluZm8uc2F3X2ZpbGVuYW1lID0gZmFsc2U7CisgIGluZm8udmFycy5hbGxvYyA9IDA7CisgIGluZm8udmFycy52YXJzID0gTlVMTDsKKyAgaW5mby5nbG9iYWxfdmFycyA9IE5VTEw7CisgIGluZm8udHlwZXMuYWxsb2MgPSAwOworICBpbmZvLnR5cGVzLnR5cGVzID0gTlVMTDsKKyAgaW5mby5nbG9iYWxfdHlwZXMgPSBOVUxMOworICBpbmZvLnRhZ3MgPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgQlVJTFRJTl9UWVBFX0NPVU5UOyBpKyspCisgICAgaW5mby50eXBlcy5idWlsdGluc1tpXSA9IERFQlVHX1RZUEVfTlVMTDsKKworICBwID0gYnl0ZXM7CisgIHBlbmQgPSBpbmZvLnBlbmQ7CisgIHdoaWxlIChwIDwgcGVuZCkKKyAgICB7CisgICAgICBjb25zdCBiZmRfYnl0ZSAqcmVjb3JkX3N0YXJ0OworICAgICAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7CisKKyAgICAgIHJlY29yZF9zdGFydCA9IHA7CisKKyAgICAgIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqcCsrOworCisgICAgICBpZiAoYyA9PSBpZWVlX2F0X3JlY29yZF9lbnVtKQorCWMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAoKCh1bnNpZ25lZCBpbnQpIGMgPDwgOCkgfCAqcCsrKTsKKworICAgICAgaWYgKGMgPD0gaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtKQorCXsKKwkgIGllZWVfZXJyb3IgKCZpbmZvLCByZWNvcmRfc3RhcnQsIF8oInVuZXhwZWN0ZWQgbnVtYmVyIikpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgc3dpdGNoIChjKQorCXsKKwlkZWZhdWx0OgorCSAgaWVlZV9lcnJvciAoJmluZm8sIHJlY29yZF9zdGFydCwgXygidW5leHBlY3RlZCByZWNvcmQgdHlwZSIpKTsKKwkgIHJldHVybiBmYWxzZTsKKworCWNhc2UgaWVlZV9iYl9yZWNvcmRfZW51bToKKwkgIGlmICghIHBhcnNlX2llZWVfYmIgKCZpbmZvLCAmcCkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSBpZWVlX2JlX3JlY29yZF9lbnVtOgorCSAgaWYgKCEgcGFyc2VfaWVlZV9iZSAoJmluZm8sICZwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwljYXNlIGllZWVfbm5fcmVjb3JkOgorCSAgaWYgKCEgcGFyc2VfaWVlZV9ubiAoJmluZm8sICZwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisKKwljYXNlIGllZWVfdHlfcmVjb3JkX2VudW06CisJICBpZiAoISBwYXJzZV9pZWVlX3R5ICgmaW5mbywgJnApKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCWNhc2UgaWVlZV9hdG5fcmVjb3JkX2VudW06CisJICBpZiAoISBwYXJzZV9pZWVlX2F0biAoJmluZm8sICZwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoaW5mby5ibG9ja3N0YWNrLmJzcCAhPSBpbmZvLmJsb2Nrc3RhY2suc3RhY2spCisgICAgeworICAgICAgaWVlZV9lcnJvciAoJmluZm8sIChjb25zdCBiZmRfYnl0ZSAqKSBOVUxMLAorCQkgIF8oImJsb2NrcyBsZWZ0IG9uIHN0YWNrIGF0IGVuZCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEhhbmRsZSBhbiBJRUVFIEJCIHJlY29yZC4gICovCisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9pZWVlX2JiIChpbmZvLCBwcCkKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKmJsb2NrX3N0YXJ0OworICBiZmRfYnl0ZSBiOworICBiZmRfdm1hIHNpemU7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOworICBjaGFyICpuYW1jb3B5ID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGZuaW5keDsKKyAgYm9vbGVhbiBza2lwOworCisgIGJsb2NrX3N0YXJ0ID0gKnBwOworCisgIGIgPSAqKnBwOworICArKypwcDsKKworICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpCisgICAgICB8fCAhIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm5pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7CisgIHNraXAgPSBmYWxzZTsKKworICBzd2l0Y2ggKGIpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIC8qIEJCMTogVHlwZSBkZWZpbml0aW9ucyBsb2NhbCB0byBhIG1vZHVsZS4gICovCisgICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKKyAgICAgIGlmIChuYW1jb3B5ID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpbmZvLT5zYXdfZmlsZW5hbWUgPSB0cnVlOworCisgICAgICAvKiBEaXNjYXJkIGFueSB2YXJpYWJsZXMgb3IgdHlwZXMgd2UgbWF5IGhhdmUgc2VlbiBiZWZvcmUuICAqLworICAgICAgaWYgKGluZm8tPnZhcnMudmFycyAhPSBOVUxMKQorCWZyZWUgKGluZm8tPnZhcnMudmFycyk7CisgICAgICBpbmZvLT52YXJzLnZhcnMgPSBOVUxMOworICAgICAgaW5mby0+dmFycy5hbGxvYyA9IDA7CisgICAgICBpZiAoaW5mby0+dHlwZXMudHlwZXMgIT0gTlVMTCkKKwlmcmVlIChpbmZvLT50eXBlcy50eXBlcyk7CisgICAgICBpbmZvLT50eXBlcy50eXBlcyA9IE5VTEw7CisgICAgICBpbmZvLT50eXBlcy5hbGxvYyA9IDA7CisKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHR5cGVzIHRvIHRoZSBnbG9iYWwgdHlwZXMuICAqLworICAgICAgaWYgKGluZm8tPmdsb2JhbF90eXBlcyAhPSBOVUxMKQorCXsKKwkgIGluZm8tPnR5cGVzLmFsbG9jID0gaW5mby0+Z2xvYmFsX3R5cGVzLT5hbGxvYzsKKwkgIGluZm8tPnR5cGVzLnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCisJCQkgICAgICAgeG1hbGxvYyAoaW5mby0+dHlwZXMuYWxsb2MKKwkJCQkJKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpKTsKKwkgIG1lbWNweSAoaW5mby0+dHlwZXMudHlwZXMsIGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMsCisJCSAgaW5mby0+dHlwZXMuYWxsb2MgKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpOworCX0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICAvKiBCQjI6IEdsb2JhbCB0eXBlIGRlZmluaXRpb25zLiAgVGhlIG5hbWUgaXMgc3VwcG9zZWQgdG8gYmUKKwkgZW1wdHksIGJ1dCB3ZSBkb24ndCBjaGVjay4gKi8KKyAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoaW5mby0+ZGhhbmRsZSwgIipnbG9iYWwqIikpCisJcmV0dXJuIGZhbHNlOworICAgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgLyogQkIzOiBIaWdoIGxldmVsIG1vZHVsZSBibG9jayBiZWdpbi4gIFdlIGRvbid0IGhhdmUgdG8gZG8KKwkgYW55dGhpbmcgaGVyZS4gIFRoZSBuYW1lIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGFzIGZvcgorCSB0aGUgQkIxLCBidXQgd2UgZG9uJ3QgY2hlY2suICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQ6CisgICAgICAvKiBCQjQ6IEdsb2JhbCBmdW5jdGlvbi4gICovCisgICAgICB7CisJYmZkX3ZtYSBzdGFja3NwYWNlLCB0eXBpbmR4LCBvZmZzZXQ7CisJZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKKworCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc3RhY2tzcGFjZSkKKwkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGluZHgpCisJICAgIHx8ICEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKKwkgIHJldHVybiBmYWxzZTsKKworCS8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgc3RhY2sgc3BhY2UuICBGSVhNRS4gICovCisKKwlpZiAodHlwaW5keCA8IDI1NikKKwkgIHsKKwkgICAgcmV0dXJuX3R5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgYmxvY2tfc3RhcnQsIHR5cGluZHgpOworCSAgICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHR5cGluZHggLT0gMjU2OworCSAgICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGluZHgsIHRydWUpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgZm5pbmR4ID0gdHlwaW5keDsKKwkgICAgcmV0dXJuX3R5cGUgPSBpbmZvLT50eXBlcy50eXBlc1t0eXBpbmR4XS50eXBlOworCSAgICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoaW5mby0+ZGhhbmRsZSwgcmV0dXJuX3R5cGUpCisJCT09IERFQlVHX0tJTkRfRlVOQ1RJT04pCisJICAgICAgcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGluZm8tPmRoYW5kbGUsCisJCQkJCQkgICByZXR1cm5fdHlwZSk7CisJICB9CisKKwluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKKwlpZiAobmFtY29weSA9PSBOVUxMKQorCSAgcmV0dXJuIGZhbHNlOworCWlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSwgcmV0dXJuX3R5cGUsCisJCQkJICAgICB0cnVlLCBvZmZzZXQpKQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDU6CisgICAgICAvKiBCQjU6IEZpbGUgbmFtZSBmb3Igc291cmNlIGxpbmUgbnVtYmVycy4gICovCisgICAgICB7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBXZSBpZ25vcmUgdGhlIGRhdGUgYW5kIHRpbWUuICBGSVhNRS4gICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkgIHsKKwkgICAgYmZkX3ZtYSBpZ25vcmU7CisJICAgIGJvb2xlYW4gcHJlc2VudDsKKworCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmlnbm9yZSwgJnByZXNlbnQpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgaWYgKCEgcHJlc2VudCkKKwkgICAgICBicmVhazsKKwkgIH0KKworCW5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOworCWlmIChuYW1jb3B5ID09IE5VTEwpCisJICByZXR1cm4gZmFsc2U7CisJaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA2OgorICAgICAgLyogQkI2OiBMb2NhbCBmdW5jdGlvbiBvciBibG9jay4gICovCisgICAgICB7CisJYmZkX3ZtYSBzdGFja3NwYWNlLCB0eXBpbmR4LCBvZmZzZXQ7CisKKwlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnN0YWNrc3BhY2UpCisJICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBpbmR4KQorCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCisJICByZXR1cm4gZmFsc2U7CisKKwkvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIHN0YWNrIHNwYWNlLiAgRklYTUUuICAqLworCisJaWYgKG5hbWxlbiA9PSAwKQorCSAgeworCSAgICBpZiAoISBkZWJ1Z19zdGFydF9ibG9jayAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0KSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIC8qIENoYW5nZSBiIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGJsb2NrCisJICAgICAgIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24uICAqLworCSAgICBiID0gMHg4NjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIFRoZSBNUkkgQysrIGNvbXBpbGVyIHdpbGwgb3V0cHV0IGEgZmFrZSBmdW5jdGlvbiBuYW1lZAorCSAgICAgICBfX1hSWUNQUCB0byBob2xkIEMrKyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZSBza2lwCisJICAgICAgIHRoYXQgZnVuY3Rpb24uICBUaGlzIGlzIG5vdCBjcnVjaWFsLCBidXQgaXQgbWFrZXMKKwkgICAgICAgY29udmVydGluZyBmcm9tIElFRUUgdG8gb3RoZXIgZGVidWcgZm9ybWF0cyB3b3JrCisJICAgICAgIGJldHRlci4gICovCisJICAgIGlmIChzdHJuY21wIChuYW1lLCAiX19YUllDUFAiLCBuYW1sZW4pID09IDApCisJICAgICAgc2tpcCA9IHRydWU7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7CisKKwkJaWYgKHR5cGluZHggPCAyNTYpCisJCSAgeworCQkgICAgcmV0dXJuX3R5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgYmxvY2tfc3RhcnQsCisJCQkJCQkgICAgIHR5cGluZHgpOworCQkgICAgaWYgKHJldHVybl90eXBlID09IE5VTEwpCisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICB0eXBpbmR4IC09IDI1NjsKKwkJICAgIGlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgdHlwaW5keCwgdHJ1ZSkpCisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIGZuaW5keCA9IHR5cGluZHg7CisJCSAgICByZXR1cm5fdHlwZSA9IGluZm8tPnR5cGVzLnR5cGVzW3R5cGluZHhdLnR5cGU7CisJCSAgICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoaW5mby0+ZGhhbmRsZSwgcmV0dXJuX3R5cGUpCisJCQk9PSBERUJVR19LSU5EX0ZVTkNUSU9OKQorCQkgICAgICByZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoaW5mby0+ZGhhbmRsZSwKKwkJCQkJCQkgICByZXR1cm5fdHlwZSk7CisJCSAgfQorCisJCW5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOworCQlpZiAobmFtY29weSA9PSBOVUxMKQorCQkgIHJldHVybiBmYWxzZTsKKwkJaWYgKCEgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5LAorCQkJCQkgICAgIHJldHVybl90eXBlLCBmYWxzZSwgb2Zmc2V0KSkKKwkJICByZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDEwOgorICAgICAgLyogQkIxMDogQXNzZW1ibGVyIG1vZHVsZSBzY29wZS4gIEluIHRoZSBub3JtYWwgY2FzZSwgd2UKKwkgY29tcGxldGVseSBpZ25vcmUgYWxsIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCisgICAgICB7CisJY29uc3QgY2hhciAqaW5hbSwgKnZzdHI7CisJdW5zaWduZWQgbG9uZyBpbmFtbGVuLCB2c3RybGVuOworCWJmZF92bWEgdG9vbF90eXBlOworCWJvb2xlYW4gcHJlc2VudDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghIGluZm8tPnNhd19maWxlbmFtZSkKKwkgIHsKKwkgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7CisJICAgIGlmIChuYW1jb3B5ID09IE5VTEwpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGluZm8tPmRoYW5kbGUsIG5hbWNvcHkpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKKwkgIH0KKworCWlmICghIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZpbmFtLCAmaW5hbWxlbikKKwkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnRvb2xfdHlwZSkKKwkgICAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmdnN0ciwgJnZzdHJsZW4sICZwcmVzZW50KSkKKwkgIHJldHVybiBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCSAgeworCSAgICBiZmRfdm1hIGlnbm9yZTsKKworCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmlnbm9yZSwgJnByZXNlbnQpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgaWYgKCEgcHJlc2VudCkKKwkgICAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxMToKKyAgICAgIC8qIEJCMTE6IE1vZHVsZSBzZWN0aW9uLiAgV2UgY29tcGxldGVseSBpZ25vcmUgYWxsIHRoaXMKKwkgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCisgICAgICB7CisJYmZkX3ZtYSBzZWN0eXBlLCBzZWNpbmR4LCBvZmZzZXQsIG1hcDsKKwlib29sZWFuIHByZXNlbnQ7CisKKwlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNlY3R5cGUpCisJICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzZWNpbmR4KQorCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkKKwkgICAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJm1hcCwgJnByZXNlbnQpKQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWVlZV9lcnJvciAoaW5mbywgYmxvY2tfc3RhcnQsIF8oInVua25vd24gQkIgdHlwZSIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAvKiBQdXNoIHRoaXMgYmxvY2sgb24gdGhlIGJsb2NrIHN0YWNrLiAgKi8KKworICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPj0gaW5mby0+YmxvY2tzdGFjay5zdGFjayArIEJMT0NLU1RBQ0tfU0laRSkKKyAgICB7CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwgXygic3RhY2sgb3ZlcmZsb3ciKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5raW5kID0gYjsKKyAgaWYgKGIgPT0gNSkKKyAgICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+ZmlsZW5hbWUgPSBuYW1jb3B5OworICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+Zm5pbmR4ID0gZm5pbmR4OworICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+c2tpcCA9IHNraXA7CisgICsraW5mby0+YmxvY2tzdGFjay5ic3A7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEhhbmRsZSBhbiBJRUVFIEJFIHJlY29yZC4gICovCisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9pZWVlX2JlIChpbmZvLCBwcCkKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKK3sKKyAgYmZkX3ZtYSBvZmZzZXQ7CisKKyAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwIDw9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2spCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwLCBfKCJzdGFjayB1bmRlcmZsb3ciKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAtLWluZm8tPmJsb2Nrc3RhY2suYnNwOworCisgIHN3aXRjaCAoaW5mby0+YmxvY2tzdGFjay5ic3AtPmtpbmQpCisgICAgeworICAgIGNhc2UgMjoKKyAgICAgIC8qIFdoZW4gd2UgZW5kIHRoZSBnbG9iYWwgdHlwZWRlZnMgYmxvY2ssIHdlIGNvcHkgb3V0IHRoZSB0aGUKKyAgICAgICAgIGNvbnRlbnRzIG9mIGluZm8tPnZhcnMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHZhcmlhYmxlIGluZGljZXMKKyAgICAgICAgIG1heSBiZSByZXVzZWQgaW4gdGhlIGxvY2FsIGJsb2Nrcy4gIEhvd2V2ZXIsIHdlIG5lZWQgdG8KKyAgICAgICAgIHByZXNlcnZlIHRoZW0gc28gdGhhdCB3ZSBjYW4gbG9jYXRlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEKKyAgICAgICAgIHJlZmVyZW5jZSB2YXJpYWJsZSB3aG9zZSB0eXBlIGlzIG5hbWVkIGluIHRoZSBnbG9iYWwgdHlwZWRlZgorICAgICAgICAgYmxvY2suICAqLworICAgICAgaW5mby0+Z2xvYmFsX3ZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhcnMgKikKKwkJCSAgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+Z2xvYmFsX3ZhcnMpKTsKKyAgICAgIGluZm8tPmdsb2JhbF92YXJzLT5hbGxvYyA9IGluZm8tPnZhcnMuYWxsb2M7CisgICAgICBpbmZvLT5nbG9iYWxfdmFycy0+dmFycyA9ICgoc3RydWN0IGllZWVfdmFyICopCisJCQkJIHhtYWxsb2MgKGluZm8tPnZhcnMuYWxsb2MKKwkJCQkJICAqIHNpemVvZiAoKmluZm8tPnZhcnMudmFycykpKTsKKyAgICAgIG1lbWNweSAoaW5mby0+Z2xvYmFsX3ZhcnMtPnZhcnMsIGluZm8tPnZhcnMudmFycywKKwkgICAgICBpbmZvLT52YXJzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dmFycy52YXJzKSk7CisKKyAgICAgIC8qIFdlIGFsc28gY29weSBvdXQgdGhlIG5vbiBidWlsdGluIHBhcnRzIG9mIGluZm8tPnR5cGVzLCBzaW5jZQorICAgICAgICAgdGhlIHR5cGVzIGFyZSBkaXNjYXJkZWQgd2hlbiB3ZSBzdGFydCBhIG5ldyBibG9jay4gICovCisgICAgICBpbmZvLT5nbG9iYWxfdHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGVzICopCisJCQkgICAgeG1hbGxvYyAoc2l6ZW9mICppbmZvLT5nbG9iYWxfdHlwZXMpKTsKKyAgICAgIGluZm8tPmdsb2JhbF90eXBlcy0+YWxsb2MgPSBpbmZvLT50eXBlcy5hbGxvYzsKKyAgICAgIGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMgPSAoKHN0cnVjdCBpZWVlX3R5cGUgKikKKwkJCQkgICB4bWFsbG9jIChpbmZvLT50eXBlcy5hbGxvYworCQkJCQkgICAgKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpKTsKKyAgICAgIG1lbWNweSAoaW5mby0+Z2xvYmFsX3R5cGVzLT50eXBlcywgaW5mby0+dHlwZXMudHlwZXMsCisJICAgICAgaW5mby0+dHlwZXMuYWxsb2MgKiBzaXplb2YgKCppbmZvLT50eXBlcy50eXBlcykpOworICAgICAgbWVtc2V0IChpbmZvLT5nbG9iYWxfdHlwZXMtPmJ1aWx0aW5zLCAwLAorCSAgICAgIHNpemVvZiAoaW5mby0+Z2xvYmFsX3R5cGVzLT5idWlsdGlucykpOworCisgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICBjYXNlIDY6CisgICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmICghIGluZm8tPmJsb2Nrc3RhY2suYnNwLT5za2lwKQorCXsKKwkgIGlmICghIGRlYnVnX2VuZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0ICsgMSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHg4NjoKKyAgICAgIC8qIFRoaXMgaXMgQkU2IHdoZW4gQkI2IHN0YXJ0ZWQgYSBibG9jayByYXRoZXIgdGhhbiBhIGxvY2FsCisJIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGlmICghIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChpbmZvLT5kaGFuZGxlLCBvZmZzZXQgKyAxKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgNToKKyAgICAgIC8qIFdoZW4gd2UgZW5kIGEgQkI1LCB3ZSBsb29rIHVwIHRoZSBzdGFjayBmb3IgdGhlIGxhc3QgQkI1LCBpZgorICAgICAgICAgdGhlcmUgaXMgb25lLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGRlYnVnX3N0YXJ0X3NvdXJjZS4gICovCisgICAgICBpZiAoaW5mby0+YmxvY2tzdGFjay5ic3AgPiBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQorCXsKKwkgIHN0cnVjdCBpZWVlX2Jsb2NrICpibDsKKworCSAgYmwgPSBpbmZvLT5ibG9ja3N0YWNrLmJzcDsKKwkgIGRvCisJICAgIHsKKwkgICAgICAtLWJsOworCSAgICAgIGlmIChibC0+a2luZCA9PSA1KQorCQl7CisJCSAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChpbmZvLT5kaGFuZGxlLCBibC0+ZmlsZW5hbWUpKQorCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIHdoaWxlIChibCAhPSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMTE6CisgICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSBtb2R1bGUgc2l6ZS4gIEZJWE1FLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIE90aGVyIGJsb2NrIHR5cGVzIGRvIG5vdCBoYXZlIGFueSB0cmFpbGluZyBpbmZvcm1hdGlvbi4gICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFBhcnNlIGFuIE5OIHJlY29yZC4gICovCisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9pZWVlX25uIChpbmZvLCBwcCkKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKm5uX3N0YXJ0OworICBiZmRfdm1hIHZhcmluZHg7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOworCisgIG5uX3N0YXJ0ID0gKnBwOworCisgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkKKyAgICAgIHx8ICEgaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAodmFyaW5keCA8IDMyKQorICAgIHsKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIG5uX3N0YXJ0LCBfKCJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgdmFyaW5keCAtPSAzMjsKKworICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBhbGxvYzsKKworICAgICAgYWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOworICAgICAgaWYgKGFsbG9jID09IDApCisJYWxsb2MgPSA0OworICAgICAgd2hpbGUgKHZhcmluZHggPj0gYWxsb2MpCisJYWxsb2MgKj0gMjsKKyAgICAgIGluZm8tPnZhcnMudmFycyA9ICgoc3RydWN0IGllZWVfdmFyICopCisJCQkgeHJlYWxsb2MgKGluZm8tPnZhcnMudmFycywKKwkJCQkgICBhbGxvYyAqIHNpemVvZiAqaW5mby0+dmFycy52YXJzKSk7CisgICAgICBtZW1zZXQgKGluZm8tPnZhcnMudmFycyArIGluZm8tPnZhcnMuYWxsb2MsIDAsCisJICAgICAgKGFsbG9jIC0gaW5mby0+dmFycy5hbGxvYykgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycyk7CisgICAgICBpbmZvLT52YXJzLmFsbG9jID0gYWxsb2M7CisgICAgfQorCisgIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID0gbmFtZTsKKyAgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWxlbiA9IG5hbWxlbjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUGFyc2UgYSBUWSByZWNvcmQuICAqLworCitzdGF0aWMgYm9vbGVhbgorcGFyc2VfaWVlZV90eSAoaW5mbywgcHApCisgICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87CisgICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Cit7CisgIGNvbnN0IGJmZF9ieXRlICp0eV9zdGFydCwgKnR5X3Zhcl9zdGFydCwgKnR5X2NvZGVfc3RhcnQ7CisgIGJmZF92bWEgdHlwZWluZHgsIHZhcmluZHgsIHRjOworICBQVFIgZGhhbmRsZTsKKyAgYm9vbGVhbiB0YWcsIHR5cGRlZjsKKyAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOworICB1bnNpZ25lZCBsb25nIHR5cGVfYml0c2l6ZTsKKyAgZGVidWdfdHlwZSB0eXBlOworCisgIHR5X3N0YXJ0ID0gKnBwOworCisgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwZWluZHgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAodHlwZWluZHggPCAyNTYpCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfc3RhcnQsIF8oImlsbGVnYWwgdHlwZSBpbmRleCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdHlwZWluZHggLT0gMjU2OworICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGVpbmR4LCBmYWxzZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgqKnBwICE9IDB4Y2UpCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwLCBfKCJ1bmtub3duIFRZIGNvZGUiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICB0eV92YXJfc3RhcnQgPSAqcHA7CisKKyAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YXJpbmR4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHZhcmluZHggPCAzMikKKyAgICB7CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV92YXJfc3RhcnQsIF8oImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB2YXJpbmR4IC09IDMyOworCisgIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MgfHwgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV92YXJfc3RhcnQsIF8oInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBUWSIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdHlfY29kZV9zdGFydCA9ICpwcDsKKworICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnRjKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7CisKKyAgdGFnID0gZmFsc2U7CisgIHR5cGRlZiA9IGZhbHNlOworICBhcmdfc2xvdHMgPSBOVUxMOworICB0eXBlX2JpdHNpemUgPSAwOworICBzd2l0Y2ggKHRjKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfY29kZV9zdGFydCwgXygidW5rbm93biBUWSBjb2RlIikpOworICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSAnISc6CisgICAgICAvKiBVbmtub3duIHR5cGUsIHdpdGggc2l6ZS4gIFdlIHRyZWF0IGl0IGFzIGludC4gIEZJWE1FLiAgKi8KKyAgICAgIHsKKwliZmRfdm1hIHNpemU7CisKKwlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQorCSAgcmV0dXJuIGZhbHNlOworCXR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBzaXplLCBmYWxzZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0EnOiAvKiBBcnJheS4gICovCisgICAgY2FzZSAnYSc6IC8qIEZPUlRSQU4gYXJyYXkgaW4gY29sdW1uL3JvdyBvcmRlci4gIEZJWE1FOiBOb3QKKwkJIGRpc3Rpbmd1aXNoZWQgZnJvbSBub3JtYWwgYXJyYXkuICAqLworICAgICAgeworCWRlYnVnX3R5cGUgZWxlX3R5cGU7CisJYmZkX3ZtYSBsb3dlciwgdXBwZXI7CisKKwlpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZlbGVfdHlwZSkKKwkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmxvd2VyKQorCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdXBwZXIpKQorCSAgcmV0dXJuIGZhbHNlOworCXR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGVsZV90eXBlLAorCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LAorCQkJCQkJCSAoKHVuc2lnbmVkIGludCkKKwkJCQkJCQkgIGJ1aWx0aW5faW50KSksCisJCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBsb3dlciwKKwkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIHVwcGVyLAorCQkJCSAgICAgIGZhbHNlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRSc6CisgICAgICAvKiBTaW1wbGUgZW51bWVyYXRpb24uICAqLworICAgICAgeworCWJmZF92bWEgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYWxsb2M7CisJY29uc3QgY2hhciAqKm5hbWVzOworCXVuc2lnbmVkIGludCBjOworCWJmZF9zaWduZWRfdm1hICp2YWxzOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKKwkgIHJldHVybiBmYWxzZTsKKwkvKiBGSVhNRTogd2UgaWdub3JlIHRoZSBlbnVtZXJhdGlvbiBzaXplLiAgKi8KKworCWFsbG9jID0gMTA7CisJbmFtZXMgPSAoY29uc3QgY2hhciAqKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKKwltZW1zZXQgKG5hbWVzLCAwLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpOworCWMgPSAwOworCXdoaWxlICgxKQorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKKwkgICAgYm9vbGVhbiBwcmVzZW50OworCisJICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICBpZiAoISBwcmVzZW50KQorCSAgICAgIGJyZWFrOworCisJICAgIGlmIChjICsgMSA+PSBhbGxvYykKKwkgICAgICB7CisJCWFsbG9jICs9IDEwOworCQluYW1lcyA9ICgoY29uc3QgY2hhciAqKikKKwkJCSB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOworCSAgICAgIH0KKworCSAgICBuYW1lc1tjXSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7CisJICAgIGlmIChuYW1lc1tjXSA9PSBOVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgKytjOworCSAgfQorCisJbmFtZXNbY10gPSBOVUxMOworCisJdmFscyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChjICogc2l6ZW9mICp2YWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQorCSAgdmFsc1tpXSA9IGk7CisKKwl0eXBlID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKKwl0YWcgPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdHJzoKKyAgICAgIC8qIFN0cnVjdCB3aXRoIGJpdCBmaWVsZHMuICAqLworICAgICAgeworCWJmZF92bWEgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYWxsb2M7CisJZGVidWdfZmllbGQgKmZpZWxkczsKKwl1bnNpZ25lZCBpbnQgYzsKKworCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCisJICByZXR1cm4gZmFsc2U7CisKKwlhbGxvYyA9IDEwOworCWZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKKwljID0gMDsKKwl3aGlsZSAoMSkKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqbmFtZTsKKwkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47CisJICAgIGJvb2xlYW4gcHJlc2VudDsKKwkgICAgZGVidWdfdHlwZSBmdHlwZTsKKwkgICAgYmZkX3ZtYSBiaXRwb3MsIGJpdHNpemU7CisKKwkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIGlmICghIHByZXNlbnQpCisJICAgICAgYnJlYWs7CisJICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmZ0eXBlKQorCQl8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0cG9zKQorCQl8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0c2l6ZSkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIGlmIChjICsgMSA+PSBhbGxvYykKKwkgICAgICB7CisJCWFsbG9jICs9IDEwOworCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCisJCQkgIHhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKKwkgICAgICB9CisKKwkgICAgZmllbGRzW2NdID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKSwKKwkJCQkJICBmdHlwZSwgYml0cG9zLCBiaXRzaXplLAorCQkJCQkgIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDKTsKKwkgICAgaWYgKGZpZWxkc1tjXSA9PSBOVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgKytjOworCSAgfQorCisJZmllbGRzW2NdID0gTlVMTDsKKworCXR5cGUgPSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCB0cnVlLCBzaXplLCBmaWVsZHMpOworCXRhZyA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ04nOgorICAgICAgLyogRW51bWVyYXRpb24uICAqLworICAgICAgeworCXVuc2lnbmVkIGludCBhbGxvYzsKKwljb25zdCBjaGFyICoqbmFtZXM7CisJYmZkX3NpZ25lZF92bWEgKnZhbHM7CisJdW5zaWduZWQgaW50IGM7CisKKwlhbGxvYyA9IDEwOworCW5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7CisJdmFscyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOworCWMgPSAwOworCXdoaWxlICgxKQorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKKwkgICAgYm9vbGVhbiBwcmVzZW50OworCSAgICBiZmRfdm1hIHZhbDsKKworCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgaWYgKCEgcHJlc2VudCkKKwkgICAgICBicmVhazsKKwkgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YWwpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKworCSAgICAvKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzIHplcm8sIHRoZW4gdGhlIHZhbHVlIGlzCisgICAgICAgICAgICAgICBhY3R1YWxseSB0aGUgc2l6ZSBvZiB0aGUgZW51bS4gIFdlIGlnbm9yZSB0aGlzCisgICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KKwkgICAgaWYgKG5hbWxlbiA9PSAwKQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIGlmIChjICsgMSA+PSBhbGxvYykKKwkgICAgICB7CisJCWFsbG9jICs9IDEwOworCQluYW1lcyA9ICgoY29uc3QgY2hhciAqKikKKwkJCSB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOworCQl2YWxzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQorCQkJeHJlYWxsb2MgKHZhbHMsIGFsbG9jICogc2l6ZW9mICp2YWxzKSk7CisJICAgICAgfQorCisJICAgIG5hbWVzW2NdID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKKwkgICAgaWYgKG5hbWVzW2NdID09IE5VTEwpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB2YWxzW2NdID0gKGJmZF9zaWduZWRfdm1hKSB2YWw7CisJICAgICsrYzsKKwkgIH0KKworCW5hbWVzW2NdID0gTlVMTDsKKworCXR5cGUgPSBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHMpOworCXRhZyA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ08nOiAvKiBTbWFsbCBwb2ludGVyLiAgV2UgZG9uJ3QgZGlzdGluZ3Vpc2ggc21hbGwgYW5kIGxhcmdlCisJCSBwb2ludGVycy4gIEZJWE1FLiAgKi8KKyAgICBjYXNlICdQJzogLyogTGFyZ2UgcG9pbnRlci4gICovCisgICAgICB7CisJZGVidWdfdHlwZSB0OworCisJaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdCkpCisJICByZXR1cm4gZmFsc2U7CisJdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUic6CisgICAgICAvKiBSYW5nZS4gICovCisgICAgICB7CisJYmZkX3ZtYSBsb3csIGhpZ2gsIHNpZ25lZHAsIHNpemU7CisKKwlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmxvdykKKwkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmhpZ2gpCisJICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaWduZWRwKQorCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCisJICByZXR1cm4gZmFsc2U7CisKKwl0eXBlID0gZGVidWdfbWFrZV9yYW5nZV90eXBlIChkaGFuZGxlLAorCQkJCSAgICAgIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIHNpemUsCisJCQkJCQkJICAgISBzaWduZWRwKSwKKwkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIGxvdywKKwkJCQkgICAgICAoYmZkX3NpZ25lZF92bWEpIGhpZ2gpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdTJzogLyogU3RydWN0LiAgKi8KKyAgICBjYXNlICdVJzogLyogVW5pb24uICAqLworICAgICAgeworCWJmZF92bWEgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYWxsb2M7CisJZGVidWdfZmllbGQgKmZpZWxkczsKKwl1bnNpZ25lZCBpbnQgYzsKKworCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCisJICByZXR1cm4gZmFsc2U7CisKKwlhbGxvYyA9IDEwOworCWZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKKwljID0gMDsKKwl3aGlsZSAoMSkKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqbmFtZTsKKwkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47CisJICAgIGJvb2xlYW4gcHJlc2VudDsKKwkgICAgYmZkX3ZtYSB0aW5keDsKKwkgICAgYmZkX3ZtYSBvZmZzZXQ7CisJICAgIGRlYnVnX3R5cGUgZnR5cGU7CisJICAgIGJmZF92bWEgYml0c2l6ZTsKKworCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgaWYgKCEgcHJlc2VudCkKKwkgICAgICBicmVhazsKKwkgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0aW5keCkKKwkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm9mZnNldCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIGlmICh0aW5keCA8IDI1NikKKwkgICAgICB7CisJCWZ0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHR5X2NvZGVfc3RhcnQsIHRpbmR4KTsKKwkJYml0c2l6ZSA9IDA7CisJCW9mZnNldCAqPSA4OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJc3RydWN0IGllZWVfdHlwZSAqdDsKKworCQl0aW5keCAtPSAyNTY7CisJCWlmICghIGllZWVfYWxsb2NfdHlwZSAoaW5mbywgdGluZHgsIHRydWUpKQorCQkgIHJldHVybiBmYWxzZTsKKwkJdCA9IGluZm8tPnR5cGVzLnR5cGVzICsgdGluZHg7CisJCWZ0eXBlID0gdC0+dHlwZTsKKwkJYml0c2l6ZSA9IHQtPmJpdHNpemU7CisJCWlmIChiaXRzaXplID09IDApCisJCSAgb2Zmc2V0ICo9IDg7CisJICAgICAgfQorCisJICAgIGlmIChjICsgMSA+PSBhbGxvYykKKwkgICAgICB7CisJCWFsbG9jICs9IDEwOworCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCisJCQkgIHhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKKwkgICAgICB9CisKKwkgICAgZmllbGRzW2NdID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKSwKKwkJCQkJICBmdHlwZSwgb2Zmc2V0LCBiaXRzaXplLAorCQkJCQkgIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDKTsKKwkgICAgaWYgKGZpZWxkc1tjXSA9PSBOVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgKytjOworCSAgfQorCisJZmllbGRzW2NdID0gTlVMTDsKKworCXR5cGUgPSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCB0YyA9PSAnUycsIHNpemUsIGZpZWxkcyk7CisJdGFnID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVCc6CisgICAgICAvKiBUeXBlZGVmLiAgKi8KKyAgICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnR5cGUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHR5cGRlZiA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1gnOgorICAgICAgLyogUHJvY2VkdXJlLiAgRklYTUU6IFRoaXMgaXMgYW4gZXh0ZXJuIGRlY2xhcmF0aW9uLCB3aGljaCB3ZQorICAgICAgICAgaGF2ZSBubyB3YXkgb2YgcmVwcmVzZW50aW5nLiAgKi8KKyAgICAgIHsKKwliZmRfdm1hIGF0dHI7CisJZGVidWdfdHlwZSBydHlwZTsKKwliZmRfdm1hIG5hcmdzOworCWJvb2xlYW4gcHJlc2VudDsKKwlzdHJ1Y3QgaWVlZV92YXIgKnB2OworCisJLyogRklYTUU6IFdlIGlnbm9yZSB0aGUgYXR0cmlidXRlIGFuZCB0aGUgYXJndW1lbnQgbmFtZXMuICAqLworCisJaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdHRyKQorCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnJ0eXBlKQorCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFyZ3MpKQorCSAgcmV0dXJuIGZhbHNlOworCWRvCisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWU7CisJICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOworCisJICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCXdoaWxlIChwcmVzZW50KTsKKworCXB2ID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKKwlwdi0+a2luZCA9IElFRUVfRVhURVJOQUw7CisJaWYgKHB2LT5uYW1sZW4gPiAwCisJICAgICYmIGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHJ0eXBlKSA9PSBERUJVR19LSU5EX1BPSU5URVIpCisJICB7CisJICAgIC8qIFNldCB1cCB0aGUgcmV0dXJuIHR5cGUgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyB0bworICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIHNsb3QsIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSBpdCB0byBhCisgICAgICAgICAgICAgICByZWZlcmVuY2UgbGF0ZXIgaWYgYXBwcm9wcmlhdGUuICAqLworCSAgICBwdi0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnB2LT5wc2xvdCk7CisJICAgICpwdi0+cHNsb3QgPSBydHlwZTsKKwkgICAgcnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHB2LT5wc2xvdCwKKwkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7CisJICB9CisKKwl0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChkaGFuZGxlLCBydHlwZSwgKGRlYnVnX3R5cGUgKikgTlVMTCwKKwkJCQkJIGZhbHNlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVic6CisgICAgICAvKiBWb2lkLiAgVGhpcyBpcyBub3QgZG9jdW1lbnRlZCwgYnV0IHRoZSBNUkkgY29tcGlsZXIgZW1pdHMgaXQuICAqLworICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWic6CisgICAgICAvKiBBcnJheSB3aXRoIDAgbG93ZXIgYm91bmQuICAqLworICAgICAgeworCWRlYnVnX3R5cGUgZXR5cGU7CisJYmZkX3ZtYSBoaWdoOworCisJaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZXR5cGUpCisJICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZoaWdoKSkKKwkgIHJldHVybiBmYWxzZTsKKworCXR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGV0eXBlLAorCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LAorCQkJCQkJCSAoKHVuc2lnbmVkIGludCkKKwkJCQkJCQkgIGJ1aWx0aW5faW50KSksCisJCQkJICAgICAgMCwgKGJmZF9zaWduZWRfdm1hKSBoaWdoLCBmYWxzZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2MnOiAvKiBDb21wbGV4LiAgKi8KKyAgICBjYXNlICdkJzogLyogRG91YmxlIGNvbXBsZXguICAqLworICAgICAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyBuYW1sZW47CisKKwkvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQgdGhlIG5hbWUgbWVhbnMuICAqLworCisJaWYgKCEgaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQorCSAgcmV0dXJuIGZhbHNlOworCisJdHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCB0YyA9PSAnYycgPyA0IDogOCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2YnOgorICAgICAgLyogUGFzY2FsIGZpbGUgbmFtZS4gIEZJWE1FLiAgKi8KKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X2NvZGVfc3RhcnQsIF8oIlBhc2NhbCBmaWxlIG5hbWUgbm90IHN1cHBvcnRlZCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgJ2cnOgorICAgICAgLyogQml0ZmllbGQgdHlwZS4gICovCisgICAgICB7CisJYmZkX3ZtYSBzaWduZWRwLCBiaXRzaXplLCBkdW1teTsKKwljb25zdCBiZmRfYnl0ZSAqaG9sZDsKKwlib29sZWFuIHByZXNlbnQ7CisKKwlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpZ25lZHApCisJICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZiaXRzaXplKSkKKwkgIHJldHVybiBmYWxzZTsKKworCS8qIEkgdGhpbmsgdGhlIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IHRoZXJlIGlzIGEgdHlwZSBpbmRleCwKKyAgICAgICAgICAgYnV0IHNvbWUgYWN0dWFsIGZpbGVzIGRvIG5vdCBoYXZlIG9uZS4gICovCisJaG9sZCA9ICpwcDsKKwlpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmR1bW15LCAmcHJlc2VudCkpCisJICByZXR1cm4gZmFsc2U7CisJaWYgKCEgcHJlc2VudCkKKwkgIHsKKwkgICAgLyogRklYTUU6IFRoaXMgaXMganVzdCBhIGd1ZXNzLiAgKi8KKwkgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsCisJCQkJCXNpZ25lZHAgPyBmYWxzZSA6IHRydWUpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgKnBwID0gaG9sZDsKKwkgICAgaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdHlwZSkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCXR5cGVfYml0c2l6ZSA9IGJpdHNpemU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ24nOgorICAgICAgLyogUXVhbGlmaWVyLiAgKi8KKyAgICAgIHsKKwliZmRfdm1hIGtpbmQ7CisJZGVidWdfdHlwZSB0OworCisJaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZraW5kKQorCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnQpKQorCSAgcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChraW5kKQorCSAgeworCSAgZGVmYXVsdDoKKwkgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfc3RhcnQsIF8oInVuc3VwcG9ydGVkIHF1YWxpZmVyIikpOworCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGNhc2UgMToKKwkgICAgdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAoZGhhbmRsZSwgdCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIDI6CisJICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUgKGRoYW5kbGUsIHQpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncyc6CisgICAgICAvKiBTZXQuICAqLworICAgICAgeworCWJmZF92bWEgc2l6ZTsKKwlkZWJ1Z190eXBlIGV0eXBlOworCisJaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKQorCSAgICB8fCAhIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmV0eXBlKSkKKwkgIHJldHVybiBmYWxzZTsKKworCS8qIEZJWE1FOiBXZSBpZ25vcmUgdGhlIHNpemUuICAqLworCisJdHlwZSA9IGRlYnVnX21ha2Vfc2V0X3R5cGUgKGRoYW5kbGUsIGV0eXBlLCBmYWxzZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgICAgLyogUHJvY2VkdXJlIHdpdGggY29tcGlsZXIgZGVwZW5kZW5jaWVzLiAgKi8KKyAgICAgIHsKKwlzdHJ1Y3QgaWVlZV92YXIgKnB2OworCWJmZF92bWEgYXR0ciwgZnJhbWVfdHlwZSwgcHVzaF9tYXNrLCBuYXJncywgbGV2ZWwsIGZhdGhlcjsKKwlkZWJ1Z190eXBlIHJ0eXBlOworCWRlYnVnX3R5cGUgKmFyZ190eXBlczsKKwlib29sZWFuIHZhcmFyZ3M7CisJYm9vbGVhbiBwcmVzZW50OworCisJLyogRklYTUU6IFdlIGlnbm9yZSBzb21lIG9mIHRoaXMgaW5mb3JtYXRpb24uICAqLworCisJcHYgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OworCisJaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdHRyKQorCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmZnJhbWVfdHlwZSkKKwkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnB1c2hfbWFzaykKKwkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZydHlwZSkKKwkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm5hcmdzKSkKKwkgIHJldHVybiBmYWxzZTsKKwlpZiAobmFyZ3MgPT0gKGJmZF92bWEpIC0xKQorCSAgeworCSAgICBhcmdfdHlwZXMgPSBOVUxMOworCSAgICB2YXJhcmdzID0gZmFsc2U7CisJICB9CisJZWxzZQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgaTsKKworCSAgICBhcmdfdHlwZXMgPSAoKGRlYnVnX3R5cGUgKikKKwkJCSB4bWFsbG9jICgobmFyZ3MgKyAxKSAqIHNpemVvZiAqYXJnX3R5cGVzKSk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorCSAgICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgYXJnX3R5cGVzICsgaSkpCisJCXJldHVybiBmYWxzZTsKKworCSAgICAvKiBJZiB0aGUgbGFzdCB0eXBlIGlzIHBvaW50ZXIgdG8gdm9pZCwgdGhpcyBpcyByZWFsbHkgYQorICAgICAgICAgICAgICAgdmFyYXJncyBmdW5jdGlvbi4gICovCisJICAgIHZhcmFyZ3MgPSBmYWxzZTsKKwkgICAgaWYgKG5hcmdzID4gMCkKKwkgICAgICB7CisJCWRlYnVnX3R5cGUgbGFzdDsKKworCQlsYXN0ID0gYXJnX3R5cGVzW25hcmdzIC0gMV07CisJCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBsYXN0KSA9PSBERUJVR19LSU5EX1BPSU5URVIKKwkJICAgICYmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLAorCQkJCQkgICAgIGRlYnVnX2dldF90YXJnZXRfdHlwZSAoZGhhbmRsZSwKKwkJCQkJCQkJICAgIGxhc3QpKQorCQkJPT0gREVCVUdfS0lORF9WT0lEKSkKKwkJICB7CisJCSAgICAtLW5hcmdzOworCQkgICAgdmFyYXJncyA9IHRydWU7CisJCSAgfQorCSAgICAgIH0KKworCSAgICAvKiBJZiB0aGVyZSBhcmUgYW55IHBvaW50ZXIgYXJndW1lbnRzLCB0dXJuIHRoZW0gaW50bworICAgICAgICAgICAgICAgaW5kaXJlY3QgdHlwZXMgaW4gY2FzZSB3ZSBsYXRlciBuZWVkIHRvIGNvbnZlcnQgdGhlbSB0bworICAgICAgICAgICAgICAgcmVmZXJlbmNlIHR5cGVzLiAgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJICAgICAgeworCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnX3R5cGVzW2ldKQorCQkgICAgPT0gREVCVUdfS0lORF9QT0lOVEVSKQorCQkgIHsKKwkJICAgIGlmIChhcmdfc2xvdHMgPT0gTlVMTCkKKwkJICAgICAgeworCQkJYXJnX3Nsb3RzID0gKChkZWJ1Z190eXBlICopCisJCQkJICAgICB4bWFsbG9jIChuYXJncyAqIHNpemVvZiAqYXJnX3Nsb3RzKSk7CisJCQltZW1zZXQgKGFyZ19zbG90cywgMCwgbmFyZ3MgKiBzaXplb2YgKmFyZ19zbG90cyk7CisJCSAgICAgIH0KKwkJICAgIGFyZ19zbG90c1tpXSA9IGFyZ190eXBlc1tpXTsKKwkJICAgIGFyZ190eXBlc1tpXSA9CisJCSAgICAgIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwKKwkJCQkJCWFyZ19zbG90cyArIGksCisJCQkJCQkoY29uc3QgY2hhciAqKSBOVUxMKTsKKwkJICB9CisJICAgICAgfQorCisJICAgIGFyZ190eXBlc1tuYXJnc10gPSBERUJVR19UWVBFX05VTEw7CisJICB9CisJaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsZXZlbCkKKwkgICAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJmZhdGhlciwgJnByZXNlbnQpKQorCSAgcmV0dXJuIGZhbHNlOworCisJLyogV2UgY2FuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGdsb2JhbCBmdW5jdGlvbiBhbmQgYSBzdGF0aWMKKyAgICAgICAgICAgZnVuY3Rpb24uICAqLworCXB2LT5raW5kID0gSUVFRV9GVU5DVElPTjsKKworCWlmIChwdi0+bmFtbGVuID4gMAorCSAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBydHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQorCSAgeworCSAgICAvKiBTZXQgdXAgdGhlIHJldHVybiB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgdG8KKyAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSBzbG90LCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgdG8gYQorICAgICAgICAgICAgICAgcmVmZXJlbmNlIGxhdGVyIGlmIGFwcHJvcHJpYXRlLiAgKi8KKwkgICAgcHYtPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdi0+cHNsb3QpOworCSAgICAqcHYtPnBzbG90ID0gcnR5cGU7CisJICAgIHJ0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdi0+cHNsb3QsCisJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOworCSAgfQorCisJdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgcnR5cGUsIGFyZ190eXBlcywgdmFyYXJncyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogUmVjb3JkIHRoZSB0eXBlIGluIHRoZSB0YWJsZS4gICovCisKKyAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0udHlwZSA9IHR5cGU7CisKKyAgaWYgKCh0YWcgfHwgdHlwZGVmKQorICAgICAgJiYgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWxlbiA+IDApCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICAgbmFtZSA9IHNhdmVzdHJpbmcgKGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lLAorCQkJIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4pOworICAgICAgaWYgKHR5cGRlZikKKwl0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKKyAgICAgIGVsc2UgaWYgKHRjID09ICdFJyB8fCB0YyA9PSAnTicpCisJdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3QgaWVlZV90YWcgKml0OworCisJICAvKiBXZSBtdXN0IGFsbG9jYXRlIGFsbCBzdHJ1Y3QgdGFncyBhcyBpbmRpcmVjdCB0eXBlcywgc28KKyAgICAgICAgICAgICB0aGF0IGlmIHdlIGxhdGVyIHNlZSBhIGRlZmluaXRpb24gb2YgdGhlIHRhZyBhcyBhIEMrKworICAgICAgICAgICAgIHJlY29yZCB3ZSBjYW4gdXBkYXRlIHRoZSBpbmRpcmVjdCBzbG90IGFuZCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAgY2hhbmdlIGFsbCB0aGUgZXhpc3RpbmcgcmVmZXJlbmNlcy4gICovCisJICBpdCA9IChzdHJ1Y3QgaWVlZV90YWcgKikgeG1hbGxvYyAoc2l6ZW9mICppdCk7CisJICBtZW1zZXQgKGl0LCAwLCBzaXplb2YgKml0KTsKKwkgIGl0LT5uZXh0ID0gaW5mby0+dGFnczsKKwkgIGluZm8tPnRhZ3MgPSBpdDsKKwkgIGl0LT5uYW1lID0gbmFtZTsKKwkgIGl0LT5zbG90ID0gdHlwZTsKKworCSAgdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgJml0LT5zbG90LCBuYW1lKTsKKwkgIHR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7CisKKwkgIGl0LT50eXBlID0gdHlwZTsKKwl9CisgICAgICBpZiAodHlwZSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLnR5cGUgPSB0eXBlOworICBpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0uYXJnX3Nsb3RzID0gYXJnX3Nsb3RzOworICBpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0uYml0c2l6ZSA9IHR5cGVfYml0c2l6ZTsKKworICAvKiBXZSBtYXkgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcKKyAgICAgdG8gc2xvdC4gIEl0IGRvZXMgbm8gaGFybSB0byByZXBsYWNlIHRoZSBpbmRpcmVjdCB0eXBlIHdpdGggdGhlCisgICAgIHJlYWwgdHlwZS4gIEZpbGxpbmcgaW4gc2xvdCBhcyB3ZWxsIGhhbmRsZXMgdGhlIGluZGlyZWN0IHR5cGVzCisgICAgIHdoaWNoIGFyZSBhbHJlYWR5IGhhbmdpbmcgYXJvdW5kLiAgKi8KKyAgaWYgKGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS5wc2xvdCAhPSBOVUxMKQorICAgICppbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0ucHNsb3QgPSB0eXBlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQYXJzZSBhbiBBVE4gcmVjb3JkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BhcnNlX2llZWVfYXRuIChpbmZvLCBwcCkKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKmF0bl9zdGFydCwgKmF0bl9jb2RlX3N0YXJ0OworICBiZmRfdm1hIHZhcmluZHg7CisgIHN0cnVjdCBpZWVlX3ZhciAqcHZhcjsKKyAgZGVidWdfdHlwZSB0eXBlOworICBiZmRfdm1hIGF0bl9jb2RlOworICBQVFIgZGhhbmRsZTsKKyAgYmZkX3ZtYSB2LCB2MiwgdjMsIHY0LCB2NTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgbG9uZyBuYW1sZW47CisgIGNoYXIgKm5hbWNvcHk7CisgIGJvb2xlYW4gcHJlc2VudDsKKyAgaW50IGJsb2NrdHlwZTsKKworICBhdG5fc3RhcnQgPSAqcHA7CisKKyAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2YXJpbmR4KQorICAgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0eXBlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXRuX2NvZGVfc3RhcnQgPSAqcHA7CisKKyAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdG5fY29kZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICh2YXJpbmR4ID09IDApCisgICAgeworICAgICAgcHZhciA9IE5VTEw7CisgICAgICBuYW1lID0gIiI7CisgICAgICBuYW1sZW4gPSAwOworICAgIH0KKyAgZWxzZSBpZiAodmFyaW5keCA8IDMyKQorICAgIHsKKyAgICAgIC8qIFRoZSBNUkkgY29tcGlsZXIgcmVwb3J0ZWRseSBzb21ldGltZXMgZW1pdHMgdmFyaWFibGUgbGlmZXRpbWUKKyAgICAgICAgIGluZm9ybWF0aW9uIGZvciBhIHJlZ2lzdGVyLiAgV2UganVzdCBpZ25vcmUgaXQuICAqLworICAgICAgaWYgKGF0bl9jb2RlID09IDkpCisJcmV0dXJuIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdik7CisKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9zdGFydCwgXygiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2YXJpbmR4IC09IDMyOworICAgICAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYworCSAgfHwgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLm5hbWUgPT0gTlVMTCkKKwl7CisJICAvKiBUaGUgTVJJIGNvbXBpbGVyIG9yIGxpbmtlciBzb21ldGltZXMgb21pdHMgdGhlIE5OIHJlY29yZAorICAgICAgICAgICAgIGZvciBhIHBtaXNjIHJlY29yZC4gICovCisJICBpZiAoYXRuX2NvZGUgPT0gNjIpCisJICAgIHsKKwkgICAgICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jKQorCQl7CisJCSAgdW5zaWduZWQgaW50IGFsbG9jOworCisJCSAgYWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOworCQkgIGlmIChhbGxvYyA9PSAwKQorCQkgICAgYWxsb2MgPSA0OworCQkgIHdoaWxlICh2YXJpbmR4ID49IGFsbG9jKQorCQkgICAgYWxsb2MgKj0gMjsKKwkJICBpbmZvLT52YXJzLnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQorCQkJCSAgICAgeHJlYWxsb2MgKGluZm8tPnZhcnMudmFycywKKwkJCQkJICAgICAgIChhbGxvYworCQkJCQkJKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpKTsKKwkJICBtZW1zZXQgKGluZm8tPnZhcnMudmFycyArIGluZm8tPnZhcnMuYWxsb2MsIDAsCisJCQkgICgoYWxsb2MgLSBpbmZvLT52YXJzLmFsbG9jKQorCQkJICAgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpOworCQkgIGluZm8tPnZhcnMuYWxsb2MgPSBhbGxvYzsKKwkJfQorCisJICAgICAgcHZhciA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7CisJICAgICAgcHZhci0+bmFtZSA9ICIiOworCSAgICAgIHB2YXItPm5hbWxlbiA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9zdGFydCwgXygidW5kZWZpbmVkIHZhcmlhYmxlIGluIEFUTiIpKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisKKyAgICAgIHB2YXIgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OworCisgICAgICBwdmFyLT50eXBlID0gdHlwZTsKKworICAgICAgbmFtZSA9IHB2YXItPm5hbWU7CisgICAgICBuYW1sZW4gPSBwdmFyLT5uYW1sZW47CisgICAgfQorCisgIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOworCisgIC8qIElmIHdlIGFyZSBnb2luZyB0byBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSB3aXRoIGEgcG9pbnRlcgorICAgICB0eXBlLCBjaGFuZ2UgdGhlIHR5cGUgdG8gYW4gaW5kaXJlY3QgdHlwZSBzbyB0aGF0IHdlIGNhbiBsYXRlcgorICAgICBjaGFuZ2UgaXQgdG8gYSByZWZlcmVuY2UgdHlwZSBpZiB3ZSBlbmNvdW50ZXIgYSBDKysgcG1pc2MgJ1InCisgICAgIHJlY29yZC4gICovCisgIGlmIChwdmFyICE9IE5VTEwKKyAgICAgICYmIHR5cGUgIT0gREVCVUdfVFlQRV9OVUxMCisgICAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCB0eXBlKSA9PSBERUJVR19LSU5EX1BPSU5URVIpCisgICAgeworICAgICAgc3dpdGNoIChhdG5fY29kZSkKKwl7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA1OgorCWNhc2UgODoKKwljYXNlIDEwOgorCSAgcHZhci0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnB2YXItPnBzbG90KTsKKwkgICpwdmFyLT5wc2xvdCA9IHR5cGU7CisJICB0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdmFyLT5wc2xvdCwKKwkJCQkJICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7CisJICBwdmFyLT50eXBlID0gdHlwZTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgc3dpdGNoIChhdG5fY29kZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LCBfKCJ1bmtub3duIEFUTiB0eXBlIikpOworICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2FzZSAxOgorICAgICAgLyogQXV0b21hdGljIHZhcmlhYmxlLiAgKi8KKyAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikpCisJcmV0dXJuIGZhbHNlOworICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7CisgICAgICBpZiAodHlwZSA9PSBOVUxMKQorCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7CisgICAgICBpZiAocHZhciAhPSBOVUxMKQorCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOworICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfTE9DQUwsIHYpOworCisgICAgY2FzZSAyOgorICAgICAgLyogUmVnaXN0ZXIgdmFyaWFibGUuICAqLworICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKKyAgICAgIGlmICh0eXBlID09IE5VTEwpCisJdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKKyAgICAgIGlmIChwdmFyICE9IE5VTEwpCisJcHZhci0+a2luZCA9IElFRUVfTE9DQUw7CisgICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19SRUdJU1RFUiwKKwkJCQkgICAgaWVlZV9yZWdub190b19nZW5yZWcgKGluZm8tPmFiZmQsIHYpKTsKKworICAgIGNhc2UgMzoKKyAgICAgIC8qIFN0YXRpYyB2YXJpYWJsZS4gICovCisgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOworICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKKwl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOworICAgICAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwIDw9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2spCisJYmxvY2t0eXBlID0gMDsKKyAgICAgIGVsc2UKKwlibG9ja3R5cGUgPSBpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0ua2luZDsKKyAgICAgIGlmIChwdmFyICE9IE5VTEwpCisJeworCSAgaWYgKGJsb2NrdHlwZSA9PSA0IHx8IGJsb2NrdHlwZSA9PSA2KQorCSAgICBwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKKwkgIGVsc2UKKwkgICAgcHZhci0+a2luZCA9IElFRUVfU1RBVElDOworCX0KKyAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsCisJCQkJICAgIChibG9ja3R5cGUgPT0gNCB8fCBibG9ja3R5cGUgPT0gNgorCQkJCSAgICAgPyBERUJVR19MT0NBTF9TVEFUSUMKKwkJCQkgICAgIDogREVCVUdfU1RBVElDKSwKKwkJCQkgICAgdik7CisKKyAgICBjYXNlIDQ6CisgICAgICAvKiBFeHRlcm5hbCBmdW5jdGlvbi4gIFdlIGRvbid0IGN1cnJlbnRseSByZWNvcmQgdGhlc2UuICBGSVhNRS4gICovCisgICAgICBpZiAocHZhciAhPSBOVUxMKQorCXB2YXItPmtpbmQgPSBJRUVFX0VYVEVSTkFMOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIDU6CisgICAgICAvKiBFeHRlcm5hbCB2YXJpYWJsZS4gIFdlIGRvbid0IGN1cnJlbnRseSByZWNvcmQgdGhlc2UuICBGSVhNRS4gICovCisgICAgICBpZiAocHZhciAhPSBOVUxMKQorCXB2YXItPmtpbmQgPSBJRUVFX0VYVEVSTkFMOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIDc6CisgICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCisJICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdjIpCisJICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjMsICZwcmVzZW50KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAocHJlc2VudCkKKwl7CisJICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnY0LCAmcHJlc2VudCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSB0d28gb3B0aW9uYWwgZmllbGRzIGluIHYzIGFuZCB2NCwgc2luY2UKKyAgICAgICAgIHRoZXkgYXJlIG5vdCBkZWZpbmVkLiAgKi8KKworICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2MykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGNvbHVtbiBudW1iZXIuICBGSVhNRS4gICovCisKKyAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfbGluZSAoZGhhbmRsZSwgdiwgdjMpOworCisgICAgY2FzZSA4OgorICAgICAgLyogR2xvYmFsIHZhcmlhYmxlLiAgKi8KKyAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdikpCisJcmV0dXJuIGZhbHNlOworICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7CisgICAgICBpZiAodHlwZSA9PSBOVUxMKQorCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7CisgICAgICBpZiAocHZhciAhPSBOVUxMKQorCXB2YXItPmtpbmQgPSBJRUVFX0dMT0JBTDsKKyAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX0dMT0JBTCwgdik7CisKKyAgICBjYXNlIDk6CisgICAgICAvKiBWYXJpYWJsZSBsaWZldGltZSBpbmZvcm1hdGlvbi4gICovCisgICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgMTA6CisgICAgICAvKiBMb2NrZWQgcmVnaXN0ZXIuICBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlcmUgYXJlIHR3byByZXF1aXJlZAorICAgICAgICAgZmllbGRzLCBidXQgYXQgbGVhc3Qgb24gb2NjYXNpb24gdGhlIE1SSSBjb21waWxlciBvbmx5IGVtaXRzCisgICAgICAgICBvbmUuICAqLworICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQorCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBJIHRoaW5rIHRoaXMgbWVhbnMgYSB2YXJpYWJsZSB0aGF0IGlzIGJvdGggaW4gYSByZWdpc3RlciBhbmQKKyAgICAgICAgIGEgZnJhbWUgc2xvdC4gIFdlIGlnbm9yZSB0aGUgZnJhbWUgc2xvdC4gIEZJWE1FLiAgKi8KKworICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7CisgICAgICBpZiAodHlwZSA9PSBOVUxMKQorCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7CisgICAgICBpZiAocHZhciAhPSBOVUxMKQorCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOworICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfUkVHSVNURVIsIHYpOworCisgICAgY2FzZSAxMToKKyAgICAgIC8qIFJlc2VydmVkIGZvciBGT1JUUkFOIGNvbW1vbi4gICovCisgICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwgXygidW5zdXBwb3J0ZWQgQVROMTEiKSk7CisKKyAgICAgIC8qIFJldHVybiB0cnVlIHRvIGtlZXAgZ29pbmcuICAqLworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIDEyOgorICAgICAgLyogQmFzZWQgdmFyaWFibGUuICAqLworICAgICAgdjMgPSAwOworICAgICAgdjQgPSAweDgwOworICAgICAgdjUgPSAwOworICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQorCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQorCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYzLCAmcHJlc2VudCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHByZXNlbnQpCisJeworCSAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2NCwgJnByZXNlbnQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAocHJlc2VudCkKKwkgICAgeworCSAgICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjUsICZwcmVzZW50KSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KKworICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsIF8oInVuc3VwcG9ydGVkIEFUTjEyIikpOworCisgICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBrZWVwIGdvaW5nLiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSAxNjoKKyAgICAgIC8qIENvbnN0YW50LiAgVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgdGhhdCBJIGhhdmUgaXMgYW1iaWd1b3VzLAorICAgICAgICAgc28gSSdtIG5vdCBnb2luZyB0byB0cnkgdG8gaW1wbGVtZW50IGl0LiAgKi8KKyAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKKwkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChwcmVzZW50KQorCXsKKwkgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKHByZXNlbnQpCisJICAgIHsKKwkgICAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwID09IGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtKQorCXsKKwkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgMTk6CisgICAgICAvKiBTdGF0aWMgdmFyaWFibGUgZnJvbSBhc3NlbWJsZXIuICAqLworICAgICAgdjIgPSAwOworICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQorCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkKKwkgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2MykpCisJcmV0dXJuIGZhbHNlOworICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7CisgICAgICAvKiBXZSBkb24ndCByZWFsbHkgaGFuZGxlIHRoaXMgY29ycmVjdGx5LiAgRklYTUUuICAqLworICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwKKwkJCQkgICAgZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpLAorCQkJCSAgICB2MiAhPSAwID8gREVCVUdfR0xPQkFMIDogREVCVUdfU1RBVElDLAorCQkJCSAgICB2Myk7CisKKyAgICBjYXNlIDYyOgorICAgICAgLyogUHJvY2VkdXJlIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24uICAqLworICAgIGNhc2UgNjM6CisgICAgICAvKiBWYXJpYWJsZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KKyAgICBjYXNlIDY0OgorICAgICAgLyogTW9kdWxlIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24uICAqLworICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQorCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQorCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKGF0bl9jb2RlID09IDYyICYmIHYgPT0gODApCisJeworCSAgaWYgKHByZXNlbnQpCisJICAgIHsKKwkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwKKwkJCSAgXygidW5leHBlY3RlZCBzdHJpbmcgaW4gQysrIG1pc2MiKSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICByZXR1cm4gaWVlZV9yZWFkX2N4eF9taXNjIChpbmZvLCBwcCwgdjIpOworCX0KKworICAgICAgLyogV2UganVzdCBpZ25vcmUgYWxsIG9mIHRoaXMgc3R1ZmYuICBGSVhNRS4gICovCisKKyAgICAgIGZvciAoOyB2MiA+IDA7IC0tdjIpCisJeworCSAgc3dpdGNoICgoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgaWVlZV9lcnJvciAoaW5mbywgKnBwLCBfKCJiYWQgbWlzYyByZWNvcmQiKSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIGNhc2UgaWVlZV9hdF9yZWNvcmRfZW51bToKKwkgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCisJCXJldHVybiBmYWxzZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgorCSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKk5PVFJFQUNIRUQqLworfQorCisvKiBIYW5kbGUgQysrIGRlYnVnZ2luZyBtaXNjZWxsYW5lb3VzIHJlY29yZHMuICBUaGlzIGlzIGNhbGxlZCBmb3IKKyAgIHByb2NlZHVyZSBtaXNjZWxsYW5lb3VzIHJlY29yZHMgb2YgdHlwZSA4MC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3JlYWRfY3h4X21pc2MgKGluZm8sIHBwLCBjb3VudCkKKyAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKKyAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OworICBiZmRfdm1hIGNhdGVnb3J5OworCisgIHN0YXJ0ID0gKnBwOworCisgIC8qIEdldCB0aGUgY2F0ZWdvcnkgb2YgQysrIG1pc2MgcmVjb3JkLiAgKi8KKyAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjYXRlZ29yeSkpCisgICAgcmV0dXJuIGZhbHNlOworICAtLWNvdW50OworCisgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5yZWNvZ25pemVkIEMrKyBtaXNjIHJlY29yZCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgJ1QnOgorICAgICAgaWYgKCEgaWVlZV9yZWFkX2N4eF9jbGFzcyAoaW5mbywgcHAsIGNvdW50KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ00nOgorICAgICAgeworCWJmZF92bWEgZmxhZ3M7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIG5hbWxlbjsKKworCS8qIFRoZSBJRUVFIHNwZWMgaW5kaWNhdGVzIHRoYXQgdGhlICdNJyByZWNvcmQgb25seSBoYXMgYQorICAgICAgICAgICBmbGFncyBmaWVsZC4gIFRoZSBNUkkgY29tcGlsZXIgYWxzbyBlbWl0cyB0aGUgbmFtZSBvZiB0aGUKKyAgICAgICAgICAgZnVuY3Rpb24uICAqLworCisJaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykpCisJICByZXR1cm4gZmFsc2U7CisJaWYgKCpwcCA8IGluZm8tPnBlbmQKKwkgICAgJiYgKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCA9PSBpZWVlX2F0X3JlY29yZF9lbnVtKQorCSAgeworCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCisJLyogVGhpcyBpcyBlbWl0dGVkIGZvciBtZXRob2QgZnVuY3Rpb25zLCBidXQgSSBkb24ndCB0aGluayB3ZQorICAgICAgICAgICBjYXJlIHZlcnkgbXVjaC4gIEl0IG1pZ2h0IGhlbHAgaWYgaXQgdG9sZCB1cyB1c2VmdWwKKyAgICAgICAgICAgaW5mb3JtYXRpb24gbGlrZSB0aGUgY2xhc3Mgd2l0aCB3aGljaCB0aGlzIGZ1bmN0aW9uIGlzCisgICAgICAgICAgIGFzc29jaWF0ZWQsIGJ1dCBpdCBkb2Vzbid0LCBzbyBpdCBpc24ndCBoZWxwZnVsLiAgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQic6CisgICAgICBpZiAoISBpZWVlX3JlYWRfY3h4X2RlZmF1bHRzIChpbmZvLCBwcCwgY291bnQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneic6CisgICAgICB7CisJY29uc3QgY2hhciAqbmFtZSwgKm1hbmdsZWQsICpjbGFzczsKKwl1bnNpZ25lZCBsb25nIG5hbWxlbiwgbWFuZ2xlZGxlbiwgY2xhc3NsZW47CisJYmZkX3ZtYSBjb250cm9sOworCisJLyogUG9pbnRlciB0byBtZW1iZXIuICAqLworCisJaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pCisJICAgIHx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKQorCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZjbGFzcywgJmNsYXNzbGVuKQorCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY29udHJvbCkpCisJICByZXR1cm4gZmFsc2U7CisKKwkvKiBGSVhNRTogV2Ugc2hvdWxkIG5vdyB0cmFjayBkb3duIG5hbWUgYW5kIGNoYW5nZSBpdHMgdHlwZS4gICovCisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1InOgorICAgICAgaWYgKCEgaWVlZV9yZWFkX3JlZmVyZW5jZSAoaW5mbywgcHApKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgVGhpcyBpcyBhIHBtaXNjIHR5cGUgODAgcmVjb3JkIG9mCisgICBjYXRlZ29yeSAnVCcuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWFkX2N4eF9jbGFzcyAoaW5mbywgcHAsIGNvdW50KQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICB1bnNpZ25lZCBsb25nIGNvdW50OworeworICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7CisgIGJmZF92bWEgY2xhc3M7CisgIGNvbnN0IGNoYXIgKnRhZzsKKyAgdW5zaWduZWQgbG9uZyB0YWdsZW47CisgIHN0cnVjdCBpZWVlX3RhZyAqaXQ7CisgIFBUUiBkaGFuZGxlOworICBkZWJ1Z19maWVsZCAqZmllbGRzOworICB1bnNpZ25lZCBpbnQgZmllbGRfY291bnQsIGZpZWxkX2FsbG9jOworICBkZWJ1Z19iYXNlY2xhc3MgKmJhc2VjbGFzc2VzOworICB1bnNpZ25lZCBpbnQgYmFzZWNsYXNzZXNfY291bnQsIGJhc2VjbGFzc2VzX2FsbG9jOworICBjb25zdCBkZWJ1Z19maWVsZCAqc3RydWN0ZmllbGRzOworICBzdHJ1Y3QgaWVlZV9tZXRob2QKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47CisgICAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdmFyaWFudHM7CisgICAgICB1bnNpZ25lZCBjb3VudDsKKyAgICAgIHVuc2lnbmVkIGludCBhbGxvYzsKKyAgICB9ICptZXRob2RzOworICB1bnNpZ25lZCBpbnQgbWV0aG9kc19jb3VudCwgbWV0aG9kc19hbGxvYzsKKyAgZGVidWdfdHlwZSB2cHRyYmFzZTsKKyAgYm9vbGVhbiBvd252cHRyOworICBkZWJ1Z19tZXRob2QgKmRtZXRob2RzOworCisgIHN0YXJ0ID0gKnBwOworCisgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2xhc3MpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLS1jb3VudDsKKworICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmdGFnLCAmdGFnbGVuKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC0tY291bnQ7CisKKyAgLyogRmluZCB0aGUgQyBzdHJ1Y3Qgd2l0aCB0aGlzIG5hbWUuICAqLworICBmb3IgKGl0ID0gaW5mby0+dGFnczsgaXQgIT0gTlVMTDsgaXQgPSBpdC0+bmV4dCkKKyAgICBpZiAoaXQtPm5hbWVbMF0gPT0gdGFnWzBdCisJJiYgc3RybmNtcCAoaXQtPm5hbWUsIHRhZywgdGFnbGVuKSA9PSAwCisJJiYgc3RybGVuIChpdC0+bmFtZSkgPT0gdGFnbGVuKQorICAgICAgYnJlYWs7CisgIGlmIChpdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmRlZmluZWQgQysrIG9iamVjdCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7CisKKyAgZmllbGRzID0gTlVMTDsKKyAgZmllbGRfY291bnQgPSAwOworICBmaWVsZF9hbGxvYyA9IDA7CisgIGJhc2VjbGFzc2VzID0gTlVMTDsKKyAgYmFzZWNsYXNzZXNfY291bnQgPSAwOworICBiYXNlY2xhc3Nlc19hbGxvYyA9IDA7CisgIG1ldGhvZHMgPSBOVUxMOworICBtZXRob2RzX2NvdW50ID0gMDsKKyAgbWV0aG9kc19hbGxvYyA9IDA7CisgIHZwdHJiYXNlID0gREVCVUdfVFlQRV9OVUxMOworICBvd252cHRyID0gZmFsc2U7CisKKyAgc3RydWN0ZmllbGRzID0gZGVidWdfZ2V0X2ZpZWxkcyAoZGhhbmRsZSwgaXQtPnR5cGUpOworCisgIHdoaWxlIChjb3VudCA+IDApCisgICAgeworICAgICAgYmZkX3ZtYSBpZDsKKyAgICAgIGNvbnN0IGJmZF9ieXRlICpzcGVjX3N0YXJ0OworCisgICAgICBzcGVjX3N0YXJ0ID0gKnBwOworCisgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmlkKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICAtLWNvdW50OworCisgICAgICBzd2l0Y2ggKGlkKQorCXsKKwlkZWZhdWx0OgorCSAgaWVlZV9lcnJvciAoaW5mbywgc3BlY19zdGFydCwgXygidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgc3BlYyIpKTsKKwkgIHJldHVybiBmYWxzZTsKKworCWNhc2UgJ2InOgorCSAgeworCSAgICBiZmRfdm1hIGZsYWdzLCBjaW5saW5lOworCSAgICBjb25zdCBjaGFyICpiYXNlbmFtZSwgKmZpZWxkbmFtZTsKKwkgICAgdW5zaWduZWQgbG9uZyBiYXNlbGVuLCBmaWVsZGxlbjsKKwkgICAgY2hhciAqYmFzZWNvcHk7CisJICAgIGRlYnVnX3R5cGUgYmFzZXR5cGU7CisJICAgIGJmZF92bWEgYml0cG9zOworCSAgICBib29sZWFuIHZpcnR1YWxwOworCSAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKwkgICAgZGVidWdfYmFzZWNsYXNzIGJhc2VjbGFzczsKKworCSAgICAvKiBUaGlzIHJlcHJlc2VudHMgYSBiYXNlIG9yIGZyaWVuZCBjbGFzcy4gICovCisKKwkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykKKwkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmYmFzZW5hbWUsICZiYXNlbGVuKQorCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2lubGluZSkKKwkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZmllbGRuYW1lLCAmZmllbGRsZW4pKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgY291bnQgLT0gNDsKKworCSAgICAvKiBXZSBoYXZlIG5vIHdheSBvZiByZWNvcmRpbmcgZnJpZW5kIGluZm9ybWF0aW9uLCBzbyB3ZQorICAgICAgICAgICAgICAganVzdCBpZ25vcmUgaXQuICAqLworCSAgICBpZiAoKGZsYWdzICYgQkFTRUZMQUdTX0ZSSUVORCkgIT0gMCkKKwkgICAgICBicmVhazsKKworCSAgICAvKiBJIGFzc3VtZSB0aGF0IGVpdGhlciBhbGwgb2YgdGhlIG1lbWJlcnMgb2YgdGhlCisgICAgICAgICAgICAgICBiYXNlY2xhc3MgYXJlIGluY2x1ZGVkIGluIHRoZSBvYmplY3QsIHN0YXJ0aW5nIGF0IHRoZQorICAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QsIG9yIHRoYXQgbm9uZSBvZiB0aGVtIGFyZQorICAgICAgICAgICAgICAgaW5jbHVkZWQuICAqLworCisJICAgIGlmICgoZmllbGRsZW4gPT0gMCkgPT0gKGNpbmxpbmUgPT0gMCkpCisJICAgICAgeworCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5zdXBwb3J0ZWQgQysrIG9iamVjdCB0eXBlIikpOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCisJICAgIGJhc2Vjb3B5ID0gc2F2ZXN0cmluZyAoYmFzZW5hbWUsIGJhc2VsZW4pOworCSAgICBiYXNldHlwZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGJhc2Vjb3B5LAorCQkJCQkgICAgICAgREVCVUdfS0lORF9JTExFR0FMKTsKKwkgICAgZnJlZSAoYmFzZWNvcHkpOworCSAgICBpZiAoYmFzZXR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICAgIHsKKwkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBiYXNlIGNsYXNzIG5vdCBkZWZpbmVkIikpOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCisJICAgIGlmIChmaWVsZGxlbiA9PSAwKQorCSAgICAgIGJpdHBvcyA9IDA7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNvbnN0IGRlYnVnX2ZpZWxkICpwZjsKKworCQlpZiAoc3RydWN0ZmllbGRzID09IE5VTEwpCisJCSAgeworCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIpKTsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICB9CisKKwkJZm9yIChwZiA9IHN0cnVjdGZpZWxkczsgKnBmICE9IERFQlVHX0ZJRUxEX05VTEw7IHBmKyspCisJCSAgeworCQkgICAgY29uc3QgY2hhciAqZm5hbWU7CisKKwkJICAgIGZuYW1lID0gZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGRoYW5kbGUsICpwZik7CisJCSAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgaWYgKGZuYW1lWzBdID09IGZpZWxkbmFtZVswXQorCQkJJiYgc3RybmNtcCAoZm5hbWUsIGZpZWxkbmFtZSwgZmllbGRsZW4pID09IDAKKwkJCSYmIHN0cmxlbiAoZm5hbWUpID09IGZpZWxkbGVuKQorCQkgICAgICBicmVhazsKKwkJICB9CisJCWlmICgqcGYgPT0gREVCVUdfRklFTERfTlVMTCkKKwkJICB7CisJCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKKwkJCQlfKCJDKysgYmFzZSBjbGFzcyBub3QgZm91bmQgaW4gY29udGFpbmVyIikpOworCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIH0KKworCQliaXRwb3MgPSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIChkaGFuZGxlLCAqcGYpOworCSAgICAgIH0KKworCSAgICBpZiAoKGZsYWdzICYgQkFTRUZMQUdTX1ZJUlRVQUwpICE9IDApCisJICAgICAgdmlydHVhbHAgPSB0cnVlOworCSAgICBlbHNlCisJICAgICAgdmlydHVhbHAgPSBmYWxzZTsKKwkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19QUklWQVRFKSAhPSAwKQorCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7CisJICAgIGVsc2UKKwkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7CisKKwkgICAgYmFzZWNsYXNzID0gZGVidWdfbWFrZV9iYXNlY2xhc3MgKGRoYW5kbGUsIGJhc2V0eXBlLCBiaXRwb3MsCisJCQkJCSAgICAgIHZpcnR1YWxwLCB2aXNpYmlsaXR5KTsKKwkgICAgaWYgKGJhc2VjbGFzcyA9PSBERUJVR19CQVNFQ0xBU1NfTlVMTCkKKwkgICAgICByZXR1cm4gZmFsc2U7CisKKwkgICAgaWYgKGJhc2VjbGFzc2VzX2NvdW50ICsgMSA+PSBiYXNlY2xhc3Nlc19hbGxvYykKKwkgICAgICB7CisJCWJhc2VjbGFzc2VzX2FsbG9jICs9IDEwOworCQliYXNlY2xhc3NlcyA9ICgoZGVidWdfYmFzZWNsYXNzICopCisJCQkgICAgICAgeHJlYWxsb2MgKGJhc2VjbGFzc2VzLAorCQkJCQkgKGJhc2VjbGFzc2VzX2FsbG9jCisJCQkJCSAgKiBzaXplb2YgKmJhc2VjbGFzc2VzKSkpOworCSAgICAgIH0KKworCSAgICBiYXNlY2xhc3Nlc1tiYXNlY2xhc3Nlc19jb3VudF0gPSBiYXNlY2xhc3M7CisJICAgICsrYmFzZWNsYXNzZXNfY291bnQ7CisJICAgIGJhc2VjbGFzc2VzW2Jhc2VjbGFzc2VzX2NvdW50XSA9IERFQlVHX0JBU0VDTEFTU19OVUxMOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICdkJzoKKwkgIHsKKwkgICAgYmZkX3ZtYSBmbGFnczsKKwkgICAgY29uc3QgY2hhciAqZmllbGRuYW1lLCAqbWFuZ2xlZG5hbWU7CisJICAgIHVuc2lnbmVkIGxvbmcgZmllbGRsZW4sIG1hbmdsZWRsZW47CisJICAgIGNoYXIgKmZpZWxkY29weTsKKwkgICAgYm9vbGVhbiBzdGF0aWNwOworCSAgICBkZWJ1Z190eXBlIGZ0eXBlOworCSAgICBjb25zdCBkZWJ1Z19maWVsZCAqcGYgPSBOVUxMOworCSAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKwkgICAgZGVidWdfZmllbGQgZmllbGQ7CisKKwkgICAgLyogVGhpcyByZXByZXNlbnRzIGEgZGF0YSBtZW1iZXIuICAqLworCisJICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCisJCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZpZWxkbmFtZSwgJmZpZWxkbGVuKQorCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkbmFtZSwgJm1hbmdsZWRsZW4pKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgY291bnQgLT0gMzsKKworCSAgICBmaWVsZGNvcHkgPSBzYXZlc3RyaW5nIChmaWVsZG5hbWUsIGZpZWxkbGVuKTsKKworCSAgICBzdGF0aWNwID0gKGZsYWdzICYgQ1hYRkxBR1NfU1RBVElDKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOworCisJICAgIGlmIChzdGF0aWNwKQorCSAgICAgIHsKKwkJc3RydWN0IGllZWVfdmFyICpwdiwgKnB2ZW5kOworCisJCS8qIFNlZSBpZiB3ZSBjYW4gZmluZCBhIGRlZmluaXRpb24gZm9yIHRoaXMgdmFyaWFibGUuICAqLworCQlwdiA9IGluZm8tPnZhcnMudmFyczsKKwkJcHZlbmQgPSBwdiArIGluZm8tPnZhcnMuYWxsb2M7CisJCWZvciAoOyBwdiA8IHB2ZW5kOyBwdisrKQorCQkgIGlmIChwdi0+bmFtbGVuID09IG1hbmdsZWRsZW4KKwkJICAgICAgJiYgc3RybmNtcCAocHYtPm5hbWUsIG1hbmdsZWRuYW1lLCBtYW5nbGVkbGVuKSA9PSAwKQorCQkgICAgYnJlYWs7CisJCWlmIChwdiA8IHB2ZW5kKQorCQkgIGZ0eXBlID0gcHYtPnR5cGU7CisJCWVsc2UKKwkJICB7CisJCSAgICAvKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHZhcmlhYmxlIGlzIG5ldmVyIHVzZWQuICAqLworCQkgICAgZnR5cGUgPSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgc3RhcnQsCisJCQkJCSAgICAgICAodW5zaWduZWQgaW50KSBidWlsdGluX3ZvaWQpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXVuc2lnbmVkIGludCBmaW5keDsKKworCQlpZiAoc3RydWN0ZmllbGRzID09IE5VTEwpCisJCSAgeworCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIpKTsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICB9CisKKwkJZm9yIChwZiA9IHN0cnVjdGZpZWxkcywgZmluZHggPSAwOworCQkgICAgICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOworCQkgICAgIHBmKyssIGZpbmR4KyspCisJCSAgeworCQkgICAgY29uc3QgY2hhciAqZm5hbWU7CisKKwkJICAgIGZuYW1lID0gZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGRoYW5kbGUsICpwZik7CisJCSAgICBpZiAoZm5hbWUgPT0gTlVMTCkKKwkJICAgICAgcmV0dXJuIGZhbHNlOworCQkgICAgaWYgKGZuYW1lWzBdID09IG1hbmdsZWRuYW1lWzBdCisJCQkmJiBzdHJuY21wIChmbmFtZSwgbWFuZ2xlZG5hbWUsIG1hbmdsZWRsZW4pID09IDAKKwkJCSYmIHN0cmxlbiAoZm5hbWUpID09IG1hbmdsZWRsZW4pCisJCSAgICAgIGJyZWFrOworCQkgIH0KKwkJaWYgKCpwZiA9PSBERUJVR19GSUVMRF9OVUxMKQorCQkgIHsKKwkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAorCQkJCV8oIkMrKyBkYXRhIG1lbWJlciBub3QgZm91bmQgaW4gY29udGFpbmVyIikpOworCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIH0KKworCQlmdHlwZSA9IGRlYnVnX2dldF9maWVsZF90eXBlIChkaGFuZGxlLCAqcGYpOworCisJCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBmdHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQorCQkgIHsKKwkJICAgIC8qIFdlIG1pZ2h0IG5lZWQgdG8gY29udmVydCB0aGlzIGZpZWxkIGludG8gYQorICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdHlwZSBsYXRlciBvbiwgc28gbWFrZSBpdCBhbiBpbmRpcmVjdAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlLiAgKi8KKwkJICAgIGlmIChpdC0+ZnNsb3RzID09IE5VTEwpCisJCSAgICAgIHsKKwkJCXVuc2lnbmVkIGludCBmY250OworCQkJY29uc3QgZGVidWdfZmllbGQgKnBmY250OworCisJCQlmY250ID0gMDsKKwkJCWZvciAocGZjbnQgPSBzdHJ1Y3RmaWVsZHM7CisJCQkgICAgICpwZmNudCAhPSBERUJVR19GSUVMRF9OVUxMOworCQkJICAgICBwZmNudCsrKQorCQkJICArK2ZjbnQ7CisJCQlpdC0+ZnNsb3RzID0gKChkZWJ1Z190eXBlICopCisJCQkJICAgICAgeG1hbGxvYyAoZmNudCAqIHNpemVvZiAqaXQtPmZzbG90cykpOworCQkJbWVtc2V0IChpdC0+ZnNsb3RzLCAwLAorCQkJCWZjbnQgKiBzaXplb2YgKml0LT5mc2xvdHMpOworCQkgICAgICB9CisKKwkJICAgIGlmIChmdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJCSAgICAgIHJldHVybiBmYWxzZTsKKwkJICAgIGl0LT5mc2xvdHNbZmluZHhdID0gZnR5cGU7CisJCSAgICBmdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwKKwkJCQkJCSAgICAgIGl0LT5mc2xvdHMgKyBmaW5keCwKKwkJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmIChmdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIHN3aXRjaCAoZmxhZ3MgJiBDWFhGTEFHU19WSVNJQklMSVRZKQorCSAgICAgIHsKKwkgICAgICBkZWZhdWx0OgorCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBDKysgdmlzaWJpbGl0eSIpKTsKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzoKKwkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOworCQlicmVhazsKKworCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFOgorCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOworCQlicmVhazsKKworCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQ6CisJCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIGlmIChzdGF0aWNwKQorCSAgICAgIHsKKwkJY2hhciAqbWFuZ2xlZGNvcHk7CisKKwkJbWFuZ2xlZGNvcHkgPSBzYXZlc3RyaW5nIChtYW5nbGVkbmFtZSwgbWFuZ2xlZGxlbik7CisKKwkJZmllbGQgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGRoYW5kbGUsIGZpZWxkY29weSwKKwkJCQkJCSAgZnR5cGUsIG1hbmdsZWRjb3B5LAorCQkJCQkJICB2aXNpYmlsaXR5KTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWJmZF92bWEgYml0cG9zLCBiaXRzaXplOworCisJCWJpdHBvcyA9IGRlYnVnX2dldF9maWVsZF9iaXRwb3MgKGRoYW5kbGUsICpwZik7CisJCWJpdHNpemUgPSBkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSAoZGhhbmRsZSwgKnBmKTsKKwkJaWYgKGJpdHBvcyA9PSAoYmZkX3ZtYSkgLTEgfHwgYml0c2l6ZSA9PSAoYmZkX3ZtYSkgLTEpCisJCSAgeworCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImJhZCBDKysgZmllbGQgYml0IHBvcyBvciBzaXplIikpOworCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIH0KKwkJZmllbGQgPSBkZWJ1Z19tYWtlX2ZpZWxkIChkaGFuZGxlLCBmaWVsZGNvcHksIGZ0eXBlLCBiaXRwb3MsCisJCQkJCSAgYml0c2l6ZSwgdmlzaWJpbGl0eSk7CisJICAgICAgfQorCisJICAgIGlmIChmaWVsZCA9PSBERUJVR19GSUVMRF9OVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKworCSAgICBpZiAoZmllbGRfY291bnQgKyAxID49IGZpZWxkX2FsbG9jKQorCSAgICAgIHsKKwkJZmllbGRfYWxsb2MgKz0gMTA7CisJCWZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKKwkJCSAgeHJlYWxsb2MgKGZpZWxkcywgZmllbGRfYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOworCSAgICAgIH0KKworCSAgICBmaWVsZHNbZmllbGRfY291bnRdID0gZmllbGQ7CisJICAgICsrZmllbGRfY291bnQ7CisJICAgIGZpZWxkc1tmaWVsZF9jb3VudF0gPSBERUJVR19GSUVMRF9OVUxMOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICdtJzoKKwljYXNlICd2JzoKKwkgIHsKKwkgICAgYmZkX3ZtYSBmbGFncywgdm9mZnNldCwgY29udHJvbDsKKwkgICAgY29uc3QgY2hhciAqbmFtZSwgKm1hbmdsZWQ7CisJICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuLCBtYW5nbGVkbGVuOworCSAgICBzdHJ1Y3QgaWVlZV92YXIgKnB2LCAqcHZlbmQ7CisJICAgIGRlYnVnX3R5cGUgdHlwZTsKKwkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisJICAgIGJvb2xlYW4gY29uc3RwLCB2b2xhdGlsZXA7CisJICAgIGNoYXIgKm1hbmdsZWRjb3B5OworCSAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCBtdjsKKwkgICAgc3RydWN0IGllZWVfbWV0aG9kICptZXRoOworCSAgICB1bnNpZ25lZCBpbnQgaW07CisKKwkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykKKwkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikKKwkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZCwgJm1hbmdsZWRsZW4pKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgY291bnQgLT0gMzsKKwkgICAgaWYgKGlkICE9ICd2JykKKwkgICAgICB2b2Zmc2V0ID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2b2Zmc2V0KSkKKwkJICByZXR1cm4gZmFsc2U7CisJCS0tY291bnQ7CisJICAgICAgfQorCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgLS1jb3VudDsKKworCSAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgY29udHJvbCBpbmZvcm1hdGlvbi4gICovCisKKwkgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVwcmVzZW50IGZyaWVuZCBpbmZvcm1hdGlvbiwgc28gd2UKKyAgICAgICAgICAgICAgIGp1c3QgaWdub3JlIGl0LiAgKi8KKwkgICAgaWYgKChmbGFncyAmIENYWEZMQUdTX0ZSSUVORCkgIT0gMCkKKwkgICAgICBicmVhazsKKworCSAgICAvKiBXZSBzaG91bGQgYWxyZWFkeSBoYXZlIHNlZW4gYSB0eXBlIGZvciB0aGUgZnVuY3Rpb24uICAqLworCSAgICBwdiA9IGluZm8tPnZhcnMudmFyczsKKwkgICAgcHZlbmQgPSBwdiArIGluZm8tPnZhcnMuYWxsb2M7CisJICAgIGZvciAoOyBwdiA8IHB2ZW5kOyBwdisrKQorCSAgICAgIGlmIChwdi0+bmFtbGVuID09IG1hbmdsZWRsZW4KKwkJICAmJiBzdHJuY21wIChwdi0+bmFtZSwgbWFuZ2xlZCwgbWFuZ2xlZGxlbikgPT0gMCkKKwkJYnJlYWs7CisKKwkgICAgaWYgKHB2ID49IHB2ZW5kKQorCSAgICAgIHsKKwkJLyogV2Ugd29uJ3QgaGF2ZSB0eXBlIGluZm9ybWF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uIGlmCisJCSAgIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGZpbGUuICBXZSBkb24ndCB0cnkgdG8KKwkJICAgaGFuZGxlIHRoaXMgY2FzZS4gIEZJWE1FLiAgKi8KKwkJdHlwZSA9IChkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUKKwkJCShkaGFuZGxlLAorCQkJIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBzdGFydCwKKwkJCQkJICAgICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fdm9pZCksCisJCQkgKGRlYnVnX3R5cGUgKikgTlVMTCwKKwkJCSBmYWxzZSkpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKKwkJY29uc3QgZGVidWdfdHlwZSAqYXJnX3R5cGVzOworCQlib29sZWFuIHZhcmFyZ3M7CisKKwkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIHB2LT50eXBlKQorCQkgICAgIT0gREVCVUdfS0lORF9GVU5DVElPTikKKwkJICB7CisJCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKKwkJCQlfKCJiYWQgdHlwZSBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIpKTsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJICB9CisKKwkJcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGRoYW5kbGUsIHB2LT50eXBlKTsKKwkJYXJnX3R5cGVzID0gZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyAoZGhhbmRsZSwgcHYtPnR5cGUsCisJCQkJCQkgICAgICAgJnZhcmFyZ3MpOworCQlpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMIHx8IGFyZ190eXBlcyA9PSBOVUxMKQorCQkgIHsKKwkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAorCQkJCV8oIm5vIHR5cGUgaW5mb3JtYXRpb24gZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iKSk7CisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgfQorCisJCXR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChkaGFuZGxlLCByZXR1cm5fdHlwZSwgaXQtPnR5cGUsCisJCQkJCSAgICAgICAoZGVidWdfdHlwZSAqKSBhcmdfdHlwZXMsCisJCQkJCSAgICAgICB2YXJhcmdzKTsKKwkgICAgICB9CisJICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgICByZXR1cm4gZmFsc2U7CisKKwkgICAgc3dpdGNoIChmbGFncyAmIENYWEZMQUdTX1ZJU0lCSUxJVFkpCisJICAgICAgeworCSAgICAgIGRlZmF1bHQ6CisJCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmtub3duIEMrKyB2aXNpYmlsaXR5IikpOworCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFVCTElDOgorCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEU6CisJCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRDoKKwkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgY29uc3RwID0gKGZsYWdzICYgQ1hYRkxBR1NfQ09OU1QpICE9IDAgPyB0cnVlIDogZmFsc2U7CisJICAgIHZvbGF0aWxlcCA9IChmbGFncyAmIENYWEZMQUdTX1ZPTEFUSUxFKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOworCisJICAgIG1hbmdsZWRjb3B5ID0gc2F2ZXN0cmluZyAobWFuZ2xlZCwgbWFuZ2xlZGxlbik7CisKKwkgICAgaWYgKChmbGFncyAmIENYWEZMQUdTX1NUQVRJQykgIT0gMCkKKwkgICAgICB7CisJCWlmIChpZCA9PSAndicpCisJCSAgeworCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBzdGF0aWMgdmlydHVhbCBtZXRob2QiKSk7CisJCSAgICByZXR1cm4gZmFsc2U7CisJCSAgfQorCQltdiA9IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChkaGFuZGxlLCBtYW5nbGVkY29weSwKKwkJCQkJCSAgICAgICB0eXBlLCB2aXNpYmlsaXR5LAorCQkJCQkJICAgICAgIGNvbnN0cCwgdm9sYXRpbGVwKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWRlYnVnX3R5cGUgdmNvbnRleHQ7CisKKwkJaWYgKGlkICE9ICd2JykKKwkJICB2Y29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKKwkJZWxzZQorCQkgIHsKKwkJICAgIC8qIEZJWE1FOiBIb3cgY2FuIHdlIGNhbGN1bGF0ZSB0aGlzIGNvcnJlY3RseT8gICovCisJCSAgICB2Y29udGV4dCA9IGl0LT50eXBlOworCQkgIH0KKwkJbXYgPSBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50IChkaGFuZGxlLCBtYW5nbGVkY29weSwgdHlwZSwKKwkJCQkJCXZpc2liaWxpdHksIGNvbnN0cCwKKwkJCQkJCXZvbGF0aWxlcCwgdm9mZnNldCwKKwkJCQkJCXZjb250ZXh0KTsKKwkgICAgICB9CisJICAgIGlmIChtdiA9PSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMKQorCSAgICAgIHJldHVybiBmYWxzZTsKKworCSAgICBmb3IgKG1ldGggPSBtZXRob2RzLCBpbSA9IDA7IGltIDwgbWV0aG9kc19jb3VudDsgbWV0aCsrLCBpbSsrKQorCSAgICAgIGlmIChtZXRoLT5uYW1sZW4gPT0gbmFtbGVuCisJCSAgJiYgc3RybmNtcCAobWV0aC0+bmFtZSwgbmFtZSwgbmFtbGVuKSA9PSAwKQorCQlicmVhazsKKwkgICAgaWYgKGltID49IG1ldGhvZHNfY291bnQpCisJICAgICAgeworCQlpZiAobWV0aG9kc19jb3VudCA+PSBtZXRob2RzX2FsbG9jKQorCQkgIHsKKwkJICAgIG1ldGhvZHNfYWxsb2MgKz0gMTA7CisJCSAgICBtZXRob2RzID0gKChzdHJ1Y3QgaWVlZV9tZXRob2QgKikKKwkJCSAgICAgICB4cmVhbGxvYyAobWV0aG9kcywKKwkJCQkJIG1ldGhvZHNfYWxsb2MgKiBzaXplb2YgKm1ldGhvZHMpKTsKKwkJICB9CisJCW1ldGhvZHNbbWV0aG9kc19jb3VudF0ubmFtZSA9IG5hbWU7CisJCW1ldGhvZHNbbWV0aG9kc19jb3VudF0ubmFtbGVuID0gbmFtbGVuOworCQltZXRob2RzW21ldGhvZHNfY291bnRdLnZhcmlhbnRzID0gTlVMTDsKKwkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS5jb3VudCA9IDA7CisJCW1ldGhvZHNbbWV0aG9kc19jb3VudF0uYWxsb2MgPSAwOworCQltZXRoID0gbWV0aG9kcyArIG1ldGhvZHNfY291bnQ7CisJCSsrbWV0aG9kc19jb3VudDsKKwkgICAgICB9CisKKwkgICAgaWYgKG1ldGgtPmNvdW50ICsgMSA+PSBtZXRoLT5hbGxvYykKKwkgICAgICB7CisJCW1ldGgtPmFsbG9jICs9IDEwOworCQltZXRoLT52YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKKwkJCQkgIHhyZWFsbG9jIChtZXRoLT52YXJpYW50cywKKwkJCQkJICAgIChtZXRoLT5hbGxvYworCQkJCQkgICAgICogc2l6ZW9mICptZXRoLT52YXJpYW50cykpKTsKKwkgICAgICB9CisKKwkgICAgbWV0aC0+dmFyaWFudHNbbWV0aC0+Y291bnRdID0gbXY7CisJICAgICsrbWV0aC0+Y291bnQ7CisJICAgIG1ldGgtPnZhcmlhbnRzW21ldGgtPmNvdW50XSA9IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEw7CisJICB9CisJICBicmVhazsKKworCWNhc2UgJ28nOgorCSAgeworCSAgICBiZmRfdm1hIHNwZWM7CisKKwkgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiwgc28gd2UganVzdAorCSAgICAgICBpZ25vcmUgaXQuICAqLworCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnNwZWMpKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgLS1jb3VudDsKKwkgICAgaWYgKChzcGVjICYgNCkgIT0gMCkKKwkgICAgICB7CisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCQl1bnNpZ25lZCBsb25nIGZpbGVuYW1sZW47CisJCWJmZF92bWEgbGluZW5vOworCisJCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmaWxlbmFtZSwgJmZpbGVuYW1sZW4pCisJCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmbGluZW5vKSkKKwkJICByZXR1cm4gZmFsc2U7CisJCWNvdW50IC09IDI7CisJICAgICAgfQorCSAgICBlbHNlIGlmICgoc3BlYyAmIDgpICE9IDApCisJICAgICAgeworCQljb25zdCBjaGFyICptYW5nbGVkOworCQl1bnNpZ25lZCBsb25nIG1hbmdsZWRsZW47CisKKwkJaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKSkKKwkJICByZXR1cm4gZmFsc2U7CisJCS0tY291bnQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKKwkJCSAgICBfKCJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBvdmVyaGVhZCBzcGVjIikpOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICd6JzoKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqdm5hbWUsICpiYXNlbmFtZTsKKwkgICAgdW5zaWduZWQgbG9uZyB2bmFtZWxlbiwgYmFzZWxlbjsKKwkgICAgYmZkX3ZtYSB2c2l6ZSwgY29udHJvbDsKKworCSAgICAvKiBBIHZpcnR1YWwgdGFibGUgcG9pbnRlci4gICovCisKKwkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnZuYW1lLCAmdm5hbWVsZW4pCisJCXx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2c2l6ZSkKKwkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmYmFzZW5hbWUsICZiYXNlbGVuKQorCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY29udHJvbCkpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICBjb3VudCAtPSA0OworCisJICAgIC8qIFdlIGp1c3QgaWdub3JlIHRoZSBjb250cm9sIG51bWJlci4gIFdlIGRvbid0IGNhcmUgd2hhdAorCSAgICAgICB0aGUgdmlydHVhbCB0YWJsZSBuYW1lIGlzLiAgV2UgaGF2ZSBubyB3YXkgdG8gc3RvcmUgdGhlCisJICAgICAgIHZpcnR1YWwgdGFibGUgc2l6ZSwgYW5kIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhbnlob3cuICAqLworCisJICAgIC8qIEZJWE1FOiBXZSBjYW4ndCBoYW5kbGUgbXVsdGlwbGUgdmlydHVhbCB0YWJsZSBwb2ludGVycy4gICovCisKKwkgICAgaWYgKGJhc2VsZW4gPT0gMCkKKwkgICAgICBvd252cHRyID0gdHJ1ZTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY2hhciAqYmFzZWNvcHk7CisKKwkJYmFzZWNvcHkgPSBzYXZlc3RyaW5nIChiYXNlbmFtZSwgYmFzZWxlbik7CisJCXZwdHJiYXNlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgYmFzZWNvcHksCisJCQkJCQkgICBERUJVR19LSU5EX0lMTEVHQUwpOworCQlmcmVlIChiYXNlY29weSk7CisJCWlmICh2cHRyYmFzZSA9PSBERUJVR19UWVBFX05VTEwpCisJCSAgeworCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuZGVmaW5lZCBDKysgdnRhYmxlIikpOworCQkgICAgcmV0dXJuIGZhbHNlOworCQkgIH0KKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIE5vdyB0aGF0IHdlIGhhdmUgc2VlbiBhbGwgdGhlIG1ldGhvZCB2YXJpYW50cywgd2UgY2FuIGNhbGwKKyAgICAgZGVidWdfbWFrZV9tZXRob2QgZm9yIGVhY2ggb25lLiAgKi8KKworICBpZiAobWV0aG9kc19jb3VudCA9PSAwKQorICAgIGRtZXRob2RzID0gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBkbWV0aG9kcyA9ICgoZGVidWdfbWV0aG9kICopCisJCSAgeG1hbGxvYyAoKG1ldGhvZHNfY291bnQgKyAxKSAqIHNpemVvZiAqZG1ldGhvZHMpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtZXRob2RzX2NvdW50OyBpKyspCisJeworCSAgY2hhciAqbmFtY29weTsKKworCSAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG1ldGhvZHNbaV0ubmFtZSwgbWV0aG9kc1tpXS5uYW1sZW4pOworCSAgZG1ldGhvZHNbaV0gPSBkZWJ1Z19tYWtlX21ldGhvZCAoZGhhbmRsZSwgbmFtY29weSwKKwkJCQkJICAgbWV0aG9kc1tpXS52YXJpYW50cyk7CisJICBpZiAoZG1ldGhvZHNbaV0gPT0gREVCVUdfTUVUSE9EX05VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBkbWV0aG9kc1tpXSA9IERFQlVHX01FVEhPRF9OVUxMOworICAgICAgZnJlZSAobWV0aG9kcyk7CisgICAgfQorCisgIC8qIFRoZSBzdHJ1Y3QgdHlwZSB3YXMgY3JlYXRlZCBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIGF0CisgICAgIGl0LT5zbG90LiAgV2UgdXBkYXRlIGl0LT5zbG90IHRvIGF1dG9tYXRpY2FsbHkgdXBkYXRlIGFsbAorICAgICByZWZlcmVuY2VzIHRvIHRoaXMgc3RydWN0LiAgKi8KKyAgaXQtPnNsb3QgPSBkZWJ1Z19tYWtlX29iamVjdF90eXBlIChkaGFuZGxlLAorCQkJCSAgICAgY2xhc3MgIT0gJ3UnLAorCQkJCSAgICAgZGVidWdfZ2V0X3R5cGVfc2l6ZSAoZGhhbmRsZSwKKwkJCQkJCQkgIGl0LT5zbG90KSwKKwkJCQkgICAgIGZpZWxkcywgYmFzZWNsYXNzZXMsIGRtZXRob2RzLAorCQkJCSAgICAgdnB0cmJhc2UsIG93bnZwdHIpOworICBpZiAoaXQtPnNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBDKysgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZSBhbmQgcmVmZXJlbmNlIHR5cGUgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWFkX2N4eF9kZWZhdWx0cyAoaW5mbywgcHAsIGNvdW50KQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICB1bnNpZ25lZCBsb25nIGNvdW50OworeworICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7CisgIGNvbnN0IGNoYXIgKmZubmFtZTsKKyAgdW5zaWduZWQgbG9uZyBmbmxlbjsKKyAgYmZkX3ZtYSBkZWZjb3VudDsKKworICBzdGFydCA9ICpwcDsKKworICAvKiBHaXZpbmcgdGhlIGZ1bmN0aW9uIG5hbWUgYmVmb3JlIHRoZSBhcmd1bWVudCBjb3VudCBpcyBhbiBhZGRlbmR1bQorICAgICB0byB0aGUgc3BlYy4gIFRoZSBmdW5jdGlvbiBuYW1lIGlzIGRlbWFuZ2xlZCwgdGhvdWdoLCBzbyB0aGlzCisgICAgIHJlY29yZCBtdXN0IGFsd2F5cyByZWZlciB0byB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCisKKyAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwIDw9IGluZm8tPmJsb2Nrc3RhY2suc3RhY2sKKyAgICAgIHx8IGluZm8tPmJsb2Nrc3RhY2suYnNwWy0xXS5mbmluZHggPT0gKHVuc2lnbmVkIGludCkgLTEpCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyBkZWZhdWx0IHZhbHVlcyBub3QgaW4gYSBmdW5jdGlvbiIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZubmFtZSwgJmZubGVuKQorICAgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmRlZmNvdW50KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGNvdW50IC09IDI7CisKKyAgd2hpbGUgKGRlZmNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIGJmZF92bWEgdHlwZSwgdmFsOworICAgICAgY29uc3QgY2hhciAqc3RydmFsOworICAgICAgdW5zaWduZWQgbG9uZyBzdHJ2YWxsZW47CisKKyAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdHlwZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgLS1jb3VudDsKKworICAgICAgc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIDA6CisJY2FzZSA0OgorCSAgYnJlYWs7CisKKwljYXNlIDE6CisJY2FzZSAyOgorCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2YWwpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICAtLWNvdW50OworCSAgYnJlYWs7CisKKwljYXNlIDM6CisJY2FzZSA3OgorCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnN0cnZhbCwgJnN0cnZhbGxlbikpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC0tY291bnQ7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5yZWNvZ25pemVkIEMrKyBkZWZhdWx0IHR5cGUiKSk7CisJICByZXR1cm4gZmFsc2U7CisJfQorCisgICAgICAvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzLCBzbyB3ZQorICAgICAgICAganVzdCBpZ25vcmUgdGhlbS4gIEZJWE1FLiAgKi8KKyAgICB9CisKKyAgLyogQW55IHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGluZGljZXMgb2YgcGFyYW1ldGVycyB0aGF0IGFyZSByZWFsbHkKKyAgICAgcmVmZXJlbmNlIHR5cGUuICAqLworICBpZiAoY291bnQgPiAwKQorICAgIHsKKyAgICAgIFBUUiBkaGFuZGxlOworICAgICAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOworCisgICAgICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKKyAgICAgIGFyZ19zbG90cyA9IGluZm8tPnR5cGVzLnR5cGVzW2luZm8tPmJsb2Nrc3RhY2suYnNwWy0xXS5mbmluZHhdLmFyZ19zbG90czsKKyAgICAgIHdoaWxlIChjb3VudC0tID4gMCkKKwl7CisJICBiZmRfdm1hIGluZHg7CisJICBkZWJ1Z190eXBlIHRhcmdldDsKKworCSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZpbmR4KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgLyogVGhlIGluZGV4IGlzIDEgYmFzZWQuICAqLworCSAgLS1pbmR4OworCSAgaWYgKGFyZ19zbG90cyA9PSBOVUxMCisJICAgICAgfHwgYXJnX3Nsb3RzW2luZHhdID09IERFQlVHX1RZUEVfTlVMTAorCSAgICAgIHx8IChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBhcmdfc2xvdHNbaW5keF0pCisJCSAgIT0gREVCVUdfS0lORF9QT0lOVEVSKSkKKwkgICAgeworCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJyZWZlcmVuY2UgcGFyYW1ldGVyIGlzIG5vdCBhIHBvaW50ZXIiKSk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIHRhcmdldCA9IGRlYnVnX2dldF90YXJnZXRfdHlwZSAoZGhhbmRsZSwgYXJnX3Nsb3RzW2luZHhdKTsKKwkgIGFyZ19zbG90c1tpbmR4XSA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGRoYW5kbGUsIHRhcmdldCk7CisJICBpZiAoYXJnX3Nsb3RzW2luZHhdID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgYSBDKysgcmVmZXJlbmNlIGRlZmluaXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWFkX3JlZmVyZW5jZSAoaW5mbywgcHApCisgICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87CisgICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Cit7CisgIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKKyAgYmZkX3ZtYSBmbGFnczsKKyAgY29uc3QgY2hhciAqY2xhc3MsICpuYW1lOworICB1bnNpZ25lZCBsb25nIGNsYXNzbGVuLCBuYW1sZW47CisgIGRlYnVnX3R5cGUgKnBzbG90OworICBkZWJ1Z190eXBlIHRhcmdldDsKKworICBzdGFydCA9ICpwcDsKKworICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogR2l2aW5nIHRoZSBjbGFzcyBuYW1lIGJlZm9yZSB0aGUgbWVtYmVyIG5hbWUgaXMgaW4gYW4gYWRkZW5kdW0gdG8KKyAgICAgdGhlIHNwZWMuICAqLworICBpZiAoZmxhZ3MgPT0gMykKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmY2xhc3MsICZjbGFzc2xlbikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBzbG90ID0gTlVMTDsKKyAgaWYgKGZsYWdzICE9IDMpCisgICAgeworICAgICAgaW50IHBhc3M7CisKKyAgICAgIC8qIFdlIHNlYXJjaCBmcm9tIHRoZSBsYXN0IHZhcmlhYmxlIGluZGljZXMgdG8gdGhlIGZpcnN0IGluCisJIGhvcGVzIG9mIGZpbmRpbmcgbG9jYWwgdmFyaWFibGVzIGNvcnJlY3RseS4gIFdlIHNlYXJjaCB0aGUKKwkgbG9jYWwgdmFyaWFibGVzIG9uIHRoZSBmaXJzdCBwYXNzLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZXMKKwkgb24gdGhlIHNlY29uZC4gIEZJWE1FOiBUaGlzIHByb2JhYmx5IHdvbid0IHdvcmsgaW4gYWxsIGNhc2VzLgorCSBPbiB0aGUgb3RoZXIgaGFuZCwgSSBkb24ndCBrbm93IHdoYXQgd2lsbC4gICovCisgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQorCXsKKwkgIHN0cnVjdCBpZWVlX3ZhcnMgKnZhcnM7CisJICBpbnQgaTsKKwkgIHN0cnVjdCBpZWVlX3ZhciAqcHYgPSBOVUxMOworCisJICBpZiAocGFzcyA9PSAwKQorCSAgICB2YXJzID0gJmluZm8tPnZhcnM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB2YXJzID0gaW5mby0+Z2xvYmFsX3ZhcnM7CisJICAgICAgaWYgKHZhcnMgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIH0KKworCSAgZm9yIChpID0gKGludCkgdmFycy0+YWxsb2MgLSAxOyBpID49IDA7IGktLSkKKwkgICAgeworCSAgICAgIGJvb2xlYW4gZm91bmQ7CisKKwkgICAgICBwdiA9IHZhcnMtPnZhcnMgKyBpOworCisJICAgICAgaWYgKHB2LT5wc2xvdCA9PSBOVUxMCisJCSAgfHwgcHYtPm5hbWxlbiAhPSBuYW1sZW4KKwkJICB8fCBzdHJuY21wIChwdi0+bmFtZSwgbmFtZSwgbmFtbGVuKSAhPSAwKQorCQljb250aW51ZTsKKworCSAgICAgIGZvdW5kID0gZmFsc2U7CisJICAgICAgc3dpdGNoIChmbGFncykKKwkJeworCQlkZWZhdWx0OgorCQkgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAorCQkJICAgICAgXygidW5yZWNvZ25pemVkIEMrKyByZWZlcmVuY2UgdHlwZSIpKTsKKwkJICByZXR1cm4gZmFsc2U7CisKKwkJY2FzZSAwOgorCQkgIC8qIEdsb2JhbCB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCisJCSAgaWYgKHB2LT5raW5kID09IElFRUVfR0xPQkFMCisJCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRVhURVJOQUwKKwkJICAgICAgfHwgcHYtPmtpbmQgPT0gSUVFRV9GVU5DVElPTikKKwkJICAgIGZvdW5kID0gdHJ1ZTsKKwkJICBicmVhazsKKworCQljYXNlIDE6CisJCSAgLyogR2xvYmFsIHN0YXRpYyB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCisJCSAgaWYgKHB2LT5raW5kID09IElFRUVfU1RBVElDCisJCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRlVOQ1RJT04pCisJCSAgICBmb3VuZCA9IHRydWU7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAyOgorCQkgIC8qIExvY2FsIHZhcmlhYmxlLiAgKi8KKwkJICBpZiAocHYtPmtpbmQgPT0gSUVFRV9MT0NBTCkKKwkJICAgIGZvdW5kID0gdHJ1ZTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgaWYgKGZvdW5kKQorCQlicmVhazsKKwkgICAgfQorCisJICBpZiAoaSA+PSAwKQorCSAgICB7CisJICAgICAgcHNsb3QgPSBwdi0+cHNsb3Q7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IGllZWVfdGFnICppdDsKKworICAgICAgZm9yIChpdCA9IGluZm8tPnRhZ3M7IGl0ICE9IE5VTEw7IGl0ID0gaXQtPm5leHQpCisJeworCSAgaWYgKGl0LT5uYW1lWzBdID09IGNsYXNzWzBdCisJICAgICAgJiYgc3RybmNtcCAoaXQtPm5hbWUsIGNsYXNzLCBjbGFzc2xlbikgPT0gMAorCSAgICAgICYmIHN0cmxlbiAoaXQtPm5hbWUpID09IGNsYXNzbGVuKQorCSAgICB7CisJICAgICAgaWYgKGl0LT5mc2xvdHMgIT0gTlVMTCkKKwkJeworCQkgIGNvbnN0IGRlYnVnX2ZpZWxkICpwZjsKKwkJICB1bnNpZ25lZCBpbnQgZmluZHg7CisKKwkJICBwZiA9IGRlYnVnX2dldF9maWVsZHMgKGluZm8tPmRoYW5kbGUsIGl0LT50eXBlKTsKKwkJICBpZiAocGYgPT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCisJCQkJICAiQysrIHJlZmVyZW5jZSBpbiBjbGFzcyB3aXRoIG5vIGZpZWxkcyIpOworCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICB9CisKKwkJICBmb3IgKGZpbmR4ID0gMDsgKnBmICE9IERFQlVHX0ZJRUxEX05VTEw7IHBmKyssIGZpbmR4KyspCisJCSAgICB7CisJCSAgICAgIGNvbnN0IGNoYXIgKmZuYW1lOworCisJCSAgICAgIGZuYW1lID0gZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGluZm8tPmRoYW5kbGUsICpwZik7CisJCSAgICAgIGlmIChmbmFtZSA9PSBOVUxMKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgICBpZiAoc3RybmNtcCAoZm5hbWUsIG5hbWUsIG5hbWxlbikgPT0gMAorCQkJICAmJiBzdHJsZW4gKGZuYW1lKSA9PSBuYW1sZW4pCisJCQl7CisJCQkgIHBzbG90ID0gaXQtPmZzbG90cyArIGZpbmR4OworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChwc2xvdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgcmVmZXJlbmNlIG5vdCBmb3VuZCIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogV2UgYWxsb2NhdGVkIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZworICAgICB0byAqcHNsb3QsIHdoaWNoIHdlIGNhbiBub3cgdXBkYXRlIHRvIGJlIGEgcmVmZXJlbmNlIHR5cGUuICAqLworICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoaW5mby0+ZGhhbmRsZSwgKnBzbG90KSAhPSBERUJVR19LSU5EX1BPSU5URVIpCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIkMrKyByZWZlcmVuY2UgaXMgbm90IHBvaW50ZXIiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRhcmdldCA9IGRlYnVnX2dldF90YXJnZXRfdHlwZSAoaW5mby0+ZGhhbmRsZSwgKnBzbG90KTsKKyAgKnBzbG90ID0gZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSAoaW5mby0+ZGhhbmRsZSwgdGFyZ2V0KTsKKyAgaWYgKCpwc2xvdCA9PSBERUJVR19UWVBFX05VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZXF1aXJlIGFuIEFTTiByZWNvcmQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsIHB2KQorICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOworICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOworICAgICBiZmRfdm1hICpwdjsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OworICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKKyAgYmZkX3ZtYSB2YXJpbmR4OworCisgIHN0YXJ0ID0gKnBwOworCisgIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOworICBpZiAoYyAhPSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bSkKKyAgICB7CisgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBU04iKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKipwcCk7CisgIGlmIChjICE9IGllZWVfYXNuX3JlY29yZF9lbnVtKQorICAgIHsKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFTTiIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICsrKnBwOworCisgIC8qIEp1c3QgaWdub3JlIHRoZSB2YXJpYWJsZSBpbmRleC4gICovCisgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsIHB2KTsKK30KKworLyogUmVxdWlyZSBhbiBBVE42NSByZWNvcmQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pCisgICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87CisgICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7CisgICAgIGNvbnN0IGNoYXIgKipwbmFtZTsKKyAgICAgdW5zaWduZWQgbG9uZyAqcG5hbWxlbjsKK3sKKyAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OworICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKKyAgYmZkX3ZtYSBuYW1lX2luZHgsIHR5cGVfaW5keCwgYXRuX2NvZGU7CisKKyAgc3RhcnQgPSAqcHA7CisKKyAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7CisgIGlmIChjICE9IGllZWVfYXRfcmVjb3JkX2VudW0pCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVRONjUiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKipwcCk7CisgIGlmIChjICE9IGllZWVfYXRuX3JlY29yZF9lbnVtKQorICAgIHsKKyAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgKysqcHA7CisKKyAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZuYW1lX2luZHgpCisgICAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwZV9pbmR4KQorICAgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmF0bl9jb2RlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogSnVzdCBpZ25vcmUgbmFtZV9pbmR4LiAgKi8KKworICBpZiAodHlwZV9pbmR4ICE9IDAgfHwgYXRuX2NvZGUgIT0gNjUpCisgICAgeworICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImJhZCBBVE42NSByZWNvcmQiKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbik7Cit9CisMCisvKiBDb252ZXJ0IGEgcmVnaXN0ZXIgbnVtYmVyIGluIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYQorICAgZ2VuZXJpYyByZWdpc3RlciBudW1iZXIuICAqLworCitzdGF0aWMgaW50CitpZWVlX3JlZ25vX3RvX2dlbnJlZyAoYWJmZCwgcikKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgcjsKK3sKKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgICAvKiBGb3Igc29tZSByZWFzb25zIHN0YWJzIGFkZHMgMiB0byB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIKKyAgICAgICAgIG51bWJlcnMuICAqLworICAgICAgaWYgKHIgPj0gMTYpCisJciArPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9hcmNoX2k5NjA6CisgICAgICAvKiBTdGFicyB1c2VzIDAgdG8gMTUgZm9yIHIwIHRvIHIxNSwgMTYgdG8gMzEgZm9yIGcwIHRvIGcxNSwgYW5kCisgICAgICAgICAzMiB0byAzNSBmb3IgZnAwIHRvIGZwMy4gICovCisgICAgICAtLXI7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHI7Cit9CisKKy8qIENvbnZlcnQgYSBnZW5lcmljIHJlZ2lzdGVyIG51bWJlciB0byBhbiBJRUVFIHNwZWNpZmljIG9uZS4gICovCisKK3N0YXRpYyBpbnQKK2llZWVfZ2VucmVnX3RvX3JlZ25vIChhYmZkLCByKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCByOworeworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCisgICAgeworICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKKyAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBzdGFicyBhZGQgMiB0byB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIKKyAgICAgICAgIG51bWJlcnMuICAqLworICAgICAgaWYgKHIgPj0gMTgpCisJciAtPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9hcmNoX2k5NjA6CisgICAgICAvKiBTdGFicyB1c2VzIDAgdG8gMTUgZm9yIHIwIHRvIHIxNSwgMTYgdG8gMzEgZm9yIGcwIHRvIGcxNSwgYW5kCisgICAgICAgICAzMiB0byAzNSBmb3IgZnAwIHRvIGZwMy4gICovCisgICAgICArK3I7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHI7Cit9CisMCisvKiBUaGVzZSByb3V0aW5lcyBidWlsZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvdXQgb2YgdGhlIGdlbmVyaWMKKyAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKKy8qIFdlIGJ1aWxkIHRoZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBieXRlIGJ5IGJ5dGUuICBSYXRoZXIgdGhhbgorICAgd2FzdGUgdGltZSBjb3B5aW5nIGRhdGEgYXJvdW5kLCB3ZSB1c2UgYSBsaW5rZWQgbGlzdCBvZiBidWZmZXJzIHRvCisgICBob2xkIHRoZSBkYXRhLiAgKi8KKworI2RlZmluZSBJRUVFX0JVRlNJWkUgKDQ5MCkKKworc3RydWN0IGllZWVfYnVmCit7CisgIC8qIE5leHQgYnVmZmVyLiAgKi8KKyAgc3RydWN0IGllZWVfYnVmICpuZXh0OworICAvKiBOdW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGlzIGJ1ZmZlci4gICovCisgIHVuc2lnbmVkIGludCBjOworICAvKiBCeXRlcy4gICovCisgIGJmZF9ieXRlIGJ1ZltJRUVFX0JVRlNJWkVdOworfTsKKworLyogQSBsaXN0IG9mIGJ1ZmZlcnMuICAqLworCitzdHJ1Y3QgaWVlZV9idWZsaXN0Cit7CisgIC8qIEhlYWQgb2YgbGlzdC4gICovCisgIHN0cnVjdCBpZWVlX2J1ZiAqaGVhZDsKKyAgLyogVGFpbC0tbGFzdCBidWZmZXIgb24gbGlzdC4gICovCisgIHN0cnVjdCBpZWVlX2J1ZiAqdGFpbDsKK307CisKKy8qIEluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBCQjExIGJsb2NrcyByZXF1aXJlZCBieSB0aGUgSFAgZW11bGF0b3IsCisgICB3ZSBrZWVwIHRyYWNrIG9mIHJhbmdlcyBvZiBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZCB0byBhIGdpdmVuCisgICBjb21waWxhdGlvbiB1bml0LiAgKi8KKworc3RydWN0IGllZWVfcmFuZ2UKK3sKKyAgLyogTmV4dCByYW5nZS4gICovCisgIHN0cnVjdCBpZWVlX3JhbmdlICpuZXh0OworICAvKiBMb3cgYWRkcmVzcy4gICovCisgIGJmZF92bWEgbG93OworICAvKiBIaWdoIGFkZHJlc3MuICAqLworICBiZmRfdm1hIGhpZ2g7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0cnVjdCBpZWVlX3R5cGVfY2xhc3MKK3sKKyAgLyogVGhlIG5hbWUgaW5kZXggaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgIHVuc2lnbmVkIGludCBpbmR4OworICAvKiBUaGUgcG1pc2MgcmVjb3JkcyBmb3IgdGhlIGNsYXNzLiAgKi8KKyAgc3RydWN0IGllZWVfYnVmbGlzdCBwbWlzY2J1ZjsKKyAgLyogVGhlIG51bWJlciBvZiBwbWlzYyByZWNvcmRzLiAgKi8KKyAgdW5zaWduZWQgaW50IHBtaXNjY291bnQ7CisgIC8qIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBob2xkaW5nIHRoZSB2aXJ0dWFsIHRhYmxlLCBpZiBub3QgdGhpcworICAgICBjbGFzcy4gICovCisgIGNvbnN0IGNoYXIgKnZjbGFzczsKKyAgLyogV2hldGhlciB0aGlzIGNsYXNzIGhvbGRzIGl0cyBvd24gdmlydHVhbCB0YWJsZS4gICovCisgIGJvb2xlYW4gb3dudnB0cjsKKyAgLyogVGhlIGxhcmdlc3QgdmlydHVhbCB0YWJsZSBvZmZzZXQgc2VlbiBzbyBmYXIuICAqLworICBiZmRfdm1hIHZvZmZzZXQ7CisgIC8qIFRoZSBjdXJyZW50IG1ldGhvZC4gICovCisgIGNvbnN0IGNoYXIgKm1ldGhvZDsKKyAgLyogQWRkaXRpb25hbCBwbWlzYyByZWNvcmRzIHVzZWQgdG8gcmVjb3JkIGZpZWxkcyBvZiByZWZlcmVuY2UgdHlwZS4gICovCisgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcmVmczsKK307CisKKy8qIFRoaXMgaXMgaG93IHdlIHN0b3JlIHR5cGVzIGZvciB0aGUgd3JpdGluZyByb3V0aW5lcy4gIE1vc3QgdHlwZXMKKyAgIGFyZSBzaW1wbHkgcmVwcmVzZW50ZWQgYnkgYSB0eXBlIGluZGV4LiAgKi8KKworc3RydWN0IGllZWVfd3JpdGVfdHlwZQoreworICAvKiBUeXBlIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgaW50IGluZHg7CisgIC8qIFRoZSBzaXplIG9mIHRoZSB0eXBlLCBpZiBrbm93bi4gICovCisgIHVuc2lnbmVkIGludCBzaXplOworICAvKiBUaGUgbmFtZSBvZiB0aGUgdHlwZSwgaWYgYW55LiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLCB3ZSBidWlsZCB0aGUgdHlwZSBoZXJlLCBhbmQKKyAgICAgb25seSBhZGQgaXQgdG8gdGhlIG91dHB1dCBidWZmZXJzIGlmIHdlIG5lZWQgaXQuICAqLworICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZuZGVmOworICAvKiBJZiB0aGlzIGlzIGEgc3RydWN0LCB0aGlzIGlzIHdoZXJlIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiBpcworICAgICBidWlsdC4gICovCisgIHN0cnVjdCBpZWVlX2J1Zmxpc3Qgc3RyZGVmOworICAvKiBJZiB0aGlzIGlzIGEgY2xhc3MsIHRoaXMgaXMgd2hlcmUgdGhlIGNsYXNzIGluZm9ybWF0aW9uIGlzIGJ1aWx0LiAgKi8KKyAgc3RydWN0IGllZWVfdHlwZV9jbGFzcyAqY2xhc3NkZWY7CisgIC8qIFdoZXRoZXIgdGhlIHR5cGUgaXMgdW5zaWduZWQuICAqLworICB1bnNpZ25lZCBpbnQgdW5zaWduZWRwIDogMTsKKyAgLyogV2hldGhlciB0aGlzIGlzIGEgcmVmZXJlbmNlIHR5cGUuICAqLworICB1bnNpZ25lZCBpbnQgcmVmZXJlbmNlcCA6IDE7CisgIC8qIFdoZXRoZXIgdGhpcyBpcyBpbiB0aGUgbG9jYWwgdHlwZSBibG9jay4gICovCisgIHVuc2lnbmVkIGludCBsb2NhbHAgOiAxOworICAvKiBXaGV0aGVyIHRoaXMgaXMgYSBkdXBsaWNhdGUgc3RydWN0IGRlZmluaXRpb24gd2hpY2ggd2UgYXJlCisgICAgIGlnbm9yaW5nLiAgKi8KKyAgdW5zaWduZWQgaW50IGlnbm9yZXAgOiAxOworfTsKKworLyogVGhpcyBpcyB0aGUgdHlwZSBzdGFjayB1c2VkIGJ5IHRoZSBkZWJ1ZyB3cml0aW5nIHJvdXRpbmVzLiAgRklYTUU6CisgICBXZSBjb3VsZCBnZW5lcmF0ZSBtb3JlIGVmZmljaWVudCBvdXRwdXQgaWYgd2UgcmVtZW1iZXJlZCB3aGVuIHdlCisgICBoYXZlIG91dHB1dCBhIHBhcnRpY3VsYXIgdHlwZSBiZWZvcmUuICAqLworCitzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrCit7CisgIC8qIE5leHQgZW50cnkgb24gc3RhY2suICAqLworICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICpuZXh0OworICAvKiBUeXBlIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOworfTsKKworLyogVGhpcyBpcyBhIGxpc3Qgb2YgYXNzb2NpYXRpb25zIGJldHdlZW4gYSBuYW1lIGFuZCBzb21lIHR5cGVzLgorICAgVGhlc2UgYXJlIHVzZWQgZm9yIHR5cGVkZWZzIGFuZCB0YWdzLiAgKi8KKworc3RydWN0IGllZWVfbmFtZV90eXBlCit7CisgIC8qIE5leHQgdHlwZSBmb3IgdGhpcyBuYW1lLiAgKi8KKyAgc3RydWN0IGllZWVfbmFtZV90eXBlICpuZXh0OworICAvKiBJRCBudW1iZXIuICBGb3IgYSB0eXBlZGVmLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgdHlwZSB0byB3aGljaAorICAgICB0aGlzIG5hbWUgaXMgdHlwZWRlZmVkLiAgKi8KKyAgdW5zaWduZWQgaW50IGlkOworICAvKiBUeXBlLiAgKi8KKyAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOworICAvKiBJZiB0aGlzIGlzIGEgdGFnIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCwgdGhpcyBpcyB0aGUKKyAgICAga2luZC4gIElmIHRoZSB0YWcgaGFzIGJlZW4gZGVmaW5lZCwgdGhpcyBpcyBERUJVR19LSU5EX0lMTEVHQUwuICAqLworICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOworfTsKKworLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBhc3NvY2lhdGUgbmFtZXMgYW5kIHR5cGVzLiAgKi8KKworc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Cit9OworCitzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKKyAgLyogSW5mb3JtYXRpb24gZm9yIHRoaXMgbmFtZS4gICovCisgIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqdHlwZXM7Cit9OworCisvKiBUaGlzIGlzIGEgbGlzdCBvZiBlbnVtcy4gICovCisKK3N0cnVjdCBpZWVlX2RlZmluZWRfZW51bQoreworICAvKiBOZXh0IGVudW0uICAqLworICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKm5leHQ7CisgIC8qIFR5cGUgaW5kZXguICAqLworICB1bnNpZ25lZCBpbnQgaW5keDsKKyAgLyogV2hldGhlciB0aGlzIGVudW0gaGFzIGJlZW4gZGVmaW5lZC4gICovCisgIGJvb2xlYW4gZGVmaW5lZDsKKyAgLyogVGFnLiAgKi8KKyAgY29uc3QgY2hhciAqdGFnOworICAvKiBOYW1lcy4gICovCisgIGNvbnN0IGNoYXIgKipuYW1lczsKKyAgLyogVmFsdWVzLiAgKi8KKyAgYmZkX3NpZ25lZF92bWEgKnZhbHM7Cit9OworCisvKiBXZSBrZWVwIGEgbGlzdCBvZiBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0eXBlcywgc28gdGhhdCB3ZSBkb24ndAorICAgb3V0cHV0IHRoZW0gbW9yZSB0aGFuIG9uY2UuICAqLworCitzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlCit7CisgIC8qIFBvaW50ZXIgdG8gdGhpcyB0eXBlLiAgKi8KKyAgdW5zaWduZWQgaW50IHBvaW50ZXI7CisgIC8qIEZ1bmN0aW9uIHdpdGggdW5rbm93biBhcmd1bWVudHMgcmV0dXJuaW5nIHRoaXMgdHlwZS4gICovCisgIHVuc2lnbmVkIGludCBmdW5jdGlvbjsKKyAgLyogQ29uc3QgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICAqLworICB1bnNpZ25lZCBpbnQgY29uc3RfcXVhbGlmaWVkOworICAvKiBWb2xhdGlsZSB2ZXJzaW9uIG9mIHRoaXMgdHlwZS4gICovCisgIHVuc2lnbmVkIGludCB2b2xhdGlsZV9xdWFsaWZpZWQ7CisgIC8qIExpc3Qgb2YgYXJyYXlzIG9mIHRoaXMgdHlwZSBvZiB2YXJpb3VzIGJvdW5kcy4gICovCisgIHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKmFycmF5czsKK307CisKKy8qIEEgbGlzdCBvZiBhcnJheXMgYm91bmRzLiAgKi8KKworc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZQoreworICAvKiBOZXh0IGFycmF5IGJvdW5kcy4gICovCisgIHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKm5leHQ7CisgIC8qIFR5cGUgaW5kZXggd2l0aCB0aGVzZSBib3VuZHMuICAqLworICB1bnNpZ25lZCBpbnQgaW5keDsKKyAgLyogTG93IGJvdW5kLiAgKi8KKyAgYmZkX3NpZ25lZF92bWEgbG93OworICAvKiBIaWdoIGJvdW5kLiAgKi8KKyAgYmZkX3NpZ25lZF92bWEgaGlnaDsKK307CisKKy8qIFRoaXMgaXMgYSBsaXN0IG9mIHBlbmRpbmcgZnVuY3Rpb24gcGFyYW1ldGVyIGluZm9ybWF0aW9uLiAgV2UgZG9uJ3QKKyAgIG91dHB1dCB0aGVtIHVudGlsIHdlIHNlZSB0aGUgZmlyc3QgYmxvY2suICAqLworCitzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0KK3sKKyAgLyogTmV4dCBwZW5kaW5nIHBhcmFtZXRlci4gICovCisgIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqbmV4dDsKKyAgLyogTmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIFR5cGUgaW5kZXguICAqLworICB1bnNpZ25lZCBpbnQgdHlwZTsKKyAgLyogV2hldGhlciB0aGUgdHlwZSBpcyBhIHJlZmVyZW5jZS4gICovCisgIGJvb2xlYW4gcmVmZXJlbmNlcDsKKyAgLyogS2luZC4gICovCisgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7CisgIC8qIFZhbHVlLiAgKi8KKyAgYmZkX3ZtYSB2YWw7Cit9OworCisvKiBUaGlzIGlzIHRoZSBoYW5kbGUgcGFzc2VkIGRvd24gYnkgZGVidWdfd3JpdGUuICAqLworCitzdHJ1Y3QgaWVlZV9oYW5kbGUKK3sKKyAgLyogQkZEIHdlIGFyZSB3cml0aW5nIHRvLiAgKi8KKyAgYmZkICphYmZkOworICAvKiBXaGV0aGVyIHdlIGdvdCBhbiBlcnJvciBpbiBhIHN1YnJvdXRpbmUgY2FsbGVkIHZpYSB0cmF2ZXJzZSBvcgorICAgICBtYXBfb3Zlcl9zZWN0aW9ucy4gICovCisgIGJvb2xlYW4gZXJyb3I7CisgIC8qIEN1cnJlbnQgZGF0YSBidWZmZXIgbGlzdC4gICovCisgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmN1cnJlbnQ7CisgIC8qIEN1cnJlbnQgZGF0YSBidWZmZXIuICAqLworICBzdHJ1Y3QgaWVlZV9idWYgKmN1cmJ1ZjsKKyAgLyogRmlsZW5hbWUgb2YgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIC8qIE1vZHVsZSBuYW1lIG9mIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCisgIGNvbnN0IGNoYXIgKm1vZG5hbWU7CisgIC8qIExpc3Qgb2YgYnVmZmVyIGZvciBnbG9iYWwgdHlwZXMuICAqLworICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGdsb2JhbF90eXBlczsKKyAgLyogTGlzdCBvZiBmaW5pc2hlZCBkYXRhIGJ1ZmZlcnMuICAqLworICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGRhdGE7CisgIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdHlwZWRlZnMgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCisgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgdHlwZXM7CisgIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW4gdGhlIGN1cnJlbnQKKyAgICAgY29tcGlsYXRpb24gdW5pdC4gICovCisgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgdmFyczsKKyAgLyogTGlzdCBvZiBidWZmZXJzIGZvciBDKysgY2xhc3MgZGVmaW5pdGlvbnMgaW4gdGhlIGN1cnJlbnQKKyAgICAgY29tcGlsYXRpb24gdW5pdC4gICovCisgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgY3h4OworICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIGxpbmUgbnVtYmVycyBpbiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KKyAgc3RydWN0IGllZWVfYnVmbGlzdCBsaW5lbm9zOworICAvKiBSYW5nZXMgZm9yIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLworICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcmFuZ2VzOworICAvKiBSYW5nZXMgZm9yIGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworICBzdHJ1Y3QgaWVlZV9yYW5nZSAqZ2xvYmFsX3JhbmdlczsKKyAgLyogTmVzdGVkIHBlbmRpbmcgcmFuZ2VzLiAgKi8KKyAgc3RydWN0IGllZWVfcmFuZ2UgKnBlbmRpbmdfcmFuZ2VzOworICAvKiBUeXBlIHN0YWNrLiAgKi8KKyAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqdHlwZV9zdGFjazsKKyAgLyogTmV4dCB1bmFsbG9jYXRlZCB0eXBlIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKKyAgLyogTmV4dCB1bmFsbG9jYXRlZCBuYW1lIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKKyAgLyogVHlwZWRlZnMuICAqLworICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZSB0eXBlZGVmczsKKyAgLyogVGFncy4gICovCisgIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlIHRhZ3M7CisgIC8qIEVudW1zLiAgKi8KKyAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICplbnVtczsKKyAgLyogTW9kaWZpZWQgdmVyc2lvbnMgb2YgdHlwZXMuICAqLworICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptb2RpZmllZDsKKyAgLyogTnVtYmVyIG9mIGVudHJpZXMgYWxsb2NhdGVkIGluIG1vZGlmaWVkLiAgKi8KKyAgdW5zaWduZWQgaW50IG1vZGlmaWVkX2FsbG9jOworICAvKiA0IGJ5dGUgY29tcGxleCB0eXBlLiAgKi8KKyAgdW5zaWduZWQgaW50IGNvbXBsZXhfZmxvYXRfaW5kZXg7CisgIC8qIDggYnl0ZSBjb21wbGV4IHR5cGUuICAqLworICB1bnNpZ25lZCBpbnQgY29tcGxleF9kb3VibGVfaW5kZXg7CisgIC8qIFRoZSBkZXB0aCBvZiBibG9jayBuZXN0aW5nLiAgVGhpcyBpcyAwIG91dHNpZGUgYSBmdW5jdGlvbiwgYW5kIDEKKyAgICAganVzdCBhZnRlciBzdGFydF9mdW5jdGlvbiBpcyBjYWxsZWQuICAqLworICB1bnNpZ25lZCBpbnQgYmxvY2tfZGVwdGg7CisgIC8qIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KKyAgY29uc3QgY2hhciAqZm5uYW1lOworICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiB3ZSBhcmUgY3VycmVudGx5CisgICAgIHdyaXRpbmcgb3V0LiAgKi8KKyAgc3RydWN0IGllZWVfYnVmbGlzdCBmbnR5cGU7CisgIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGZ1bmN0aW9uIHdlIGFyZQorICAgICBjdXJyZW50bHkgd3JpdGluZyBvdXQuICAqLworICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZuYXJnczsKKyAgLyogTnVtYmVyIG9mIGFyZ3VtZW50cyB3cml0dGVuIHRvIGZuYXJncy4gICovCisgIHVuc2lnbmVkIGludCBmbmFyZ2NvdW50OworICAvKiBQZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLworICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKnBlbmRpbmdfcGFybXM7CisgIC8qIEN1cnJlbnQgbGluZSBudW1iZXIgZmlsZW5hbWUuICAqLworICBjb25zdCBjaGFyICpsaW5lbm9fZmlsZW5hbWU7CisgIC8qIExpbmUgbnVtYmVyIG5hbWUgaW5kZXguICAqLworICB1bnNpZ25lZCBpbnQgbGluZW5vX25hbWVfaW5keDsKKyAgLyogRmlsZW5hbWUgb2YgcGVuZGluZyBsaW5lIG51bWJlci4gICovCisgIGNvbnN0IGNoYXIgKnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lOworICAvKiBQZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBwZW5kaW5nX2xpbmVubzsKKyAgLyogQWRkcmVzcyBvZiBwZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KKyAgYmZkX3ZtYSBwZW5kaW5nX2xpbmVub19hZGRyOworICAvKiBIaWdoZXN0IGFkZHJlc3Mgc2VlbiBhdCBlbmQgb2YgcHJvY2VkdXJlLiAgKi8KKyAgYmZkX3ZtYSBoaWdoYWRkcjsKK307CisKK3N0YXRpYyBib29sZWFuIGllZWVfaW5pdF9idWZmZXIKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9jaGFuZ2VfYnVmZmVyCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfYXBwZW5kX2J1ZmZlcgorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqLAorCSAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFsX3dyaXRlX2J5dGUgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGludCkpOworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGludCkpOworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9udW1iZXIgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9hc24KKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9hdG42NQorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcHVzaF90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKKwkgICBib29sZWFuKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGllZWVfcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICopKTsKK3N0YXRpYyB2b2lkIGllZWVfcG9wX3VudXNlZF90eXBlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGllZWVfcG9wX3R5cGVfdXNlZAorICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9hZGRfcmFuZ2UKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJvb2xlYW4sIGJmZF92bWEsIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfcmFuZ2UgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZW5kX3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2RlZmluZV90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZGVmaW5lX25hbWVkX3R5cGUKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJICAgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7CitzdGF0aWMgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqaWVlZV9nZXRfbW9kaWZpZWRfaW5mbworICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICppZWVlX25hbWVfdHlwZV9uZXdmdW5jCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX3VuZGVmaW5lZF90YWcKKyAgUEFSQU1TICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7CitzdGF0aWMgdm9pZCBpZWVlX2FkZF9iYjExX2Jsb2NrcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2FkZF9iYjExCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX291dHB1dF9wZW5kaW5nX3Bhcm1zIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGllZWVfdmlzX3RvX2ZsYWdzIFBBUkFNUyAoKGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOworc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19tZXRob2RfdmFyCisgIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwKKwkgICBib29sZWFuLCBib29sZWFuLCBiZmRfdm1hLCBib29sZWFuKSk7CisKK3N0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZW1wdHlfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOworc3RhdGljIGJvb2xlYW4gaWVlZV9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZW51bV90eXBlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gaWVlZV9hcnJheV90eXBlCisgIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3NldF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIGllZWVfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfc3RydWN0X3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3N0cnVjdF9maWVsZAorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfY2xhc3NfdHlwZQorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCisJICAgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19zdGF0aWNfbWVtYmVyCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOworc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19iYXNlY2xhc3MKKyAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50CisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4sCisJICAgYmZkX3ZtYSwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfY2xhc3NfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3RhZ190eXBlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGRlZiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gaWVlZV90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGllZWVfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2Zsb2F0X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkb3VibGUpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfdmFyaWFibGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZnVuY3Rpb25fcGFyYW1ldGVyCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gaWVlZV9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIGllZWVfZW5kX2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBpZWVlX2xpbmVubworICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBpZWVlX2ZucyA9Cit7CisgIGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKKyAgaWVlZV9zdGFydF9zb3VyY2UsCisgIGllZWVfZW1wdHlfdHlwZSwKKyAgaWVlZV92b2lkX3R5cGUsCisgIGllZWVfaW50X3R5cGUsCisgIGllZWVfZmxvYXRfdHlwZSwKKyAgaWVlZV9jb21wbGV4X3R5cGUsCisgIGllZWVfYm9vbF90eXBlLAorICBpZWVlX2VudW1fdHlwZSwKKyAgaWVlZV9wb2ludGVyX3R5cGUsCisgIGllZWVfZnVuY3Rpb25fdHlwZSwKKyAgaWVlZV9yZWZlcmVuY2VfdHlwZSwKKyAgaWVlZV9yYW5nZV90eXBlLAorICBpZWVlX2FycmF5X3R5cGUsCisgIGllZWVfc2V0X3R5cGUsCisgIGllZWVfb2Zmc2V0X3R5cGUsCisgIGllZWVfbWV0aG9kX3R5cGUsCisgIGllZWVfY29uc3RfdHlwZSwKKyAgaWVlZV92b2xhdGlsZV90eXBlLAorICBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlLAorICBpZWVlX3N0cnVjdF9maWVsZCwKKyAgaWVlZV9lbmRfc3RydWN0X3R5cGUsCisgIGllZWVfc3RhcnRfY2xhc3NfdHlwZSwKKyAgaWVlZV9jbGFzc19zdGF0aWNfbWVtYmVyLAorICBpZWVlX2NsYXNzX2Jhc2VjbGFzcywKKyAgaWVlZV9jbGFzc19zdGFydF9tZXRob2QsCisgIGllZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCisgIGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAorICBpZWVlX2NsYXNzX2VuZF9tZXRob2QsCisgIGllZWVfZW5kX2NsYXNzX3R5cGUsCisgIGllZWVfdHlwZWRlZl90eXBlLAorICBpZWVlX3RhZ190eXBlLAorICBpZWVlX3R5cGRlZiwKKyAgaWVlZV90YWcsCisgIGllZWVfaW50X2NvbnN0YW50LAorICBpZWVlX2Zsb2F0X2NvbnN0YW50LAorICBpZWVlX3R5cGVkX2NvbnN0YW50LAorICBpZWVlX3ZhcmlhYmxlLAorICBpZWVlX3N0YXJ0X2Z1bmN0aW9uLAorICBpZWVlX2Z1bmN0aW9uX3BhcmFtZXRlciwKKyAgaWVlZV9zdGFydF9ibG9jaywKKyAgaWVlZV9lbmRfYmxvY2ssCisgIGllZWVfZW5kX2Z1bmN0aW9uLAorICBpZWVlX2xpbmVubworfTsKKworLyogSW5pdGlhbGl6ZSBhIGJ1ZmZlciB0byBiZSBlbXB0eS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK2llZWVfaW5pdF9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKKyAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKK3sKKyAgYnVmbGlzdC0+aGVhZCA9IE5VTEw7CisgIGJ1Zmxpc3QtPnRhaWwgPSBOVUxMOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2VlIHdoZXRoZXIgYSBidWZmZXIgbGlzdCBoYXMgYW55IGRhdGEuICAqLworCisjZGVmaW5lIGllZWVfYnVmZmVyX2VtcHR5cChidWZsaXN0KSAoKGJ1Zmxpc3QpLT5oZWFkID09IE5VTEwpCisKKy8qIENoYW5nZSB0aGUgY3VycmVudCBidWZmZXIgdG8gYSBzcGVjaWZpZWQgYnVmZmVyIGNoYWluLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgYnVmbGlzdCkKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OworeworICBpZiAoYnVmbGlzdC0+aGVhZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBpZWVlX2J1ZiAqYnVmOworCisgICAgICBidWYgPSAoc3RydWN0IGllZWVfYnVmICopIHhtYWxsb2MgKHNpemVvZiAqYnVmKTsKKyAgICAgIGJ1Zi0+bmV4dCA9IE5VTEw7CisgICAgICBidWYtPmMgPSAwOworICAgICAgYnVmbGlzdC0+aGVhZCA9IGJ1ZjsKKyAgICAgIGJ1Zmxpc3QtPnRhaWwgPSBidWY7CisgICAgfQorCisgIGluZm8tPmN1cnJlbnQgPSBidWZsaXN0OworICBpbmZvLT5jdXJidWYgPSBidWZsaXN0LT50YWlsOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBcHBlbmQgYSBidWZmZXIgY2hhaW4uICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIG1haW5idWYsIG5ld2J1ZikKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICptYWluYnVmOworICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpuZXdidWY7Cit7CisgIGlmIChuZXdidWYtPmhlYWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobWFpbmJ1Zi0+aGVhZCA9PSBOVUxMKQorCW1haW5idWYtPmhlYWQgPSBuZXdidWYtPmhlYWQ7CisgICAgICBlbHNlCisJbWFpbmJ1Zi0+dGFpbC0+bmV4dCA9IG5ld2J1Zi0+aGVhZDsKKyAgICAgIG1haW5idWYtPnRhaWwgPSBuZXdidWYtPnRhaWw7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogV3JpdGUgYSBieXRlIGludG8gdGhlIGJ1ZmZlci4gIFdlIHVzZSBhIG1hY3JvIGZvciBzcGVlZCBhbmQgYQorICAgZnVuY3Rpb24gZm9yIHRoZSBjb21wbGV4IGNhc2VzLiAgKi8KKworI2RlZmluZSBpZWVlX3dyaXRlX2J5dGUoaW5mbywgYikJCQkJXAorICAoKGluZm8pLT5jdXJidWYtPmMgPCBJRUVFX0JVRlNJWkUJCQkJXAorICAgPyAoKGluZm8pLT5jdXJidWYtPmJ1ZlsoaW5mbyktPmN1cmJ1Zi0+YysrXSA9IChiKSwgdHJ1ZSkJXAorICAgOiBpZWVlX3JlYWxfd3JpdGVfYnl0ZSAoKGluZm8pLCAoYikpKQorCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWFsX3dyaXRlX2J5dGUgKGluZm8sIGIpCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKKyAgICAgaW50IGI7Cit7CisgIGlmIChpbmZvLT5jdXJidWYtPmMgPj0gSUVFRV9CVUZTSVpFKQorICAgIHsKKyAgICAgIHN0cnVjdCBpZWVlX2J1ZiAqbjsKKworICAgICAgbiA9IChzdHJ1Y3QgaWVlZV9idWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgICAgIG4tPm5leHQgPSBOVUxMOworICAgICAgbi0+YyA9IDA7CisgICAgICBpZiAoaW5mby0+Y3VycmVudC0+aGVhZCA9PSBOVUxMKQorCWluZm8tPmN1cnJlbnQtPmhlYWQgPSBuOworICAgICAgZWxzZQorCWluZm8tPmN1cnJlbnQtPnRhaWwtPm5leHQgPSBuOworICAgICAgaW5mby0+Y3VycmVudC0+dGFpbCA9IG47CisgICAgICBpbmZvLT5jdXJidWYgPSBuOworICAgIH0KKworICBpbmZvLT5jdXJidWYtPmJ1ZltpbmZvLT5jdXJidWYtPmNdID0gYjsKKyAgKytpbmZvLT5jdXJidWYtPmM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCB0d28gYnl0ZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIGkpCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiAoaWVlZV93cml0ZV9ieXRlIChpbmZvLCBpID4+IDgpCisJICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGkgJiAweGZmKSk7Cit9CisKKy8qIFdyaXRlIG91dCBhbiBpbnRlZ2VyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2KQorICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87CisgICAgIGJmZF92bWEgdjsKK3sKKyAgYmZkX3ZtYSB0OworICBiZmRfYnl0ZSBhYlsyMF07CisgIGJmZF9ieXRlICpwOworICB1bnNpZ25lZCBpbnQgYzsKKworICBpZiAodiA8PSAoYmZkX3ZtYSkgaWVlZV9udW1iZXJfZW5kX2VudW0pCisgICAgcmV0dXJuIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgdik7CisKKyAgdCA9IHY7CisgIHAgPSBhYiArIHNpemVvZiBhYjsKKyAgd2hpbGUgKHQgIT0gMCkKKyAgICB7CisgICAgICAqLS1wID0gdCAmIDB4ZmY7CisgICAgICB0ID4+PSA4OworICAgIH0KKyAgYyA9IChhYiArIDIwKSAtIHA7CisKKyAgaWYgKGMgPiAodW5zaWduZWQgaW50KSAoaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtCisJCQkgIC0gaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0pKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSBudW1lcmljIG92ZXJmbG93OiAweCIpKTsKKyAgICAgIGZwcmludGZfdm1hIChzdGRlcnIsIHYpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSArIGMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yICg7IGMgPiAwOyAtLWMsICsrcCkKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sICpwKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgYSBzdHJpbmcuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV9pZCAoaW5mbywgcykKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICpzOworeworICB1bnNpZ25lZCBpbnQgbGVuOworCisgIGxlbiA9IHN0cmxlbiAocyk7CisgIGlmIChsZW4gPD0gMHg3ZikKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGxlbikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZSBpZiAobGVuIDw9IDB4ZmYpCisgICAgeworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGxlbikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZSBpZiAobGVuIDw9IDB4ZmZmZikKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCBsZW4pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgc3RyaW5nIGxlbmd0aCBvdmVyZmxvdzogJXVcbiIpLCBsZW4pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBmb3IgKDsgKnMgIT0gJ1wwJzsgcysrKQorICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKnMpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgYW4gQVNOIHJlY29yZC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2FzbiAoaW5mbywgaW5keCwgdmFsKQorICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87CisgICAgIHVuc2lnbmVkIGludCBpbmR4OworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgcmV0dXJuIChpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hc25fcmVjb3JkX2VudW0pCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKKwkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2YWwpKTsKK30KKworLyogV3JpdGUgb3V0IGFuIEFUTjY1IHJlY29yZC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBpbmR4LCBzKQorICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87CisgICAgIHVuc2lnbmVkIGludCBpbmR4OworICAgICBjb25zdCBjaGFyICpzOworeworICByZXR1cm4gKGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKKwkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjUpCisJICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBzKSk7Cit9CisKKy8qIFB1c2ggYSB0eXBlIGluZGV4IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQorICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87CisgICAgIHVuc2lnbmVkIGludCBpbmR4OworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB1bnNpZ25lZHA7CisgICAgIGJvb2xlYW4gbG9jYWxwOworeworICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICp0czsKKworICB0cyA9IChzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAqdHMpOworICBtZW1zZXQgKHRzLCAwLCBzaXplb2YgKnRzKTsKKworICB0cy0+dHlwZS5pbmR4ID0gaW5keDsKKyAgdHMtPnR5cGUuc2l6ZSA9IHNpemU7CisgIHRzLT50eXBlLnVuc2lnbmVkcCA9IHVuc2lnbmVkcDsKKyAgdHMtPnR5cGUubG9jYWxwID0gbG9jYWxwOworCisgIHRzLT5uZXh0ID0gaW5mby0+dHlwZV9zdGFjazsKKyAgaW5mby0+dHlwZV9zdGFjayA9IHRzOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQb3AgYSB0eXBlIGluZGV4IG9mZiB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2llZWVfcG9wX3R5cGUgKGluZm8pCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKK3sKKyAgcmV0dXJuIGllZWVfcG9wX3R5cGVfdXNlZCAoaW5mbywgdHJ1ZSk7Cit9CisKKy8qIFBvcCBhbiB1bnVzZWQgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgdm9pZAoraWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKK3sKKyAgKHZvaWQpIGllZWVfcG9wX3R5cGVfdXNlZCAoaW5mbywgZmFsc2UpOworfQorCisvKiBQb3AgYSB1c2VkIG9yIHVudXNlZCB0eXBlIGluZGV4IG9mZiB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2llZWVfcG9wX3R5cGVfdXNlZCAoaW5mbywgdXNlZCkKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICBib29sZWFuIHVzZWQ7Cit7CisgIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnRzOworICB1bnNpZ25lZCBpbnQgcmV0OworCisgIHRzID0gaW5mby0+dHlwZV9zdGFjazsKKyAgYXNzZXJ0ICh0cyAhPSBOVUxMKTsKKworICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24gdHlwZSwgYW5kIHdlIG5lZWQgaXQsIHdlIG5lZWQgdG8gYXBwZW5kIHRoZQorICAgICBhY3R1YWwgZGVmaW5pdGlvbiB0byB0aGUgdHlwZWRlZiBibG9jayBub3cuICAqLworICBpZiAodXNlZCAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJnRzLT50eXBlLmZuZGVmKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OworCisgICAgICBpZiAodHMtPnR5cGUubG9jYWxwKQorCXsKKwkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHN0YXJ0ZWQgdGhlIHR5cGVzIGJsb2NrLiAgKi8KKwkgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCisJICAgIHsKKwkgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKKwkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKwkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKKwkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgYnVmbGlzdCA9ICZpbmZvLT50eXBlczsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTWFrZSBzdXJlIHdlIHN0YXJ0ZWQgdGhlIGdsb2JhbCB0eXBlIGJsb2NrLiAgKi8KKwkgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQorCSAgICB7CisJICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQorCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQorCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgYnVmbGlzdCA9ICZpbmZvLT5nbG9iYWxfdHlwZXM7CisJfQorCisgICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIGJ1Zmxpc3QsICZ0cy0+dHlwZS5mbmRlZikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXQgPSB0cy0+dHlwZS5pbmR4OworICBpbmZvLT50eXBlX3N0YWNrID0gdHMtPm5leHQ7CisgIGZyZWUgKHRzKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogQWRkIGEgcmFuZ2Ugb2YgYnl0ZXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2FkZF9yYW5nZSAoaW5mbywgZ2xvYmFsLCBsb3csIGhpZ2gpCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKKyAgICAgYm9vbGVhbiBnbG9iYWw7CisgICAgIGJmZF92bWEgbG93OworICAgICBiZmRfdm1hIGhpZ2g7Cit7CisgIHN0cnVjdCBpZWVlX3JhbmdlICoqcGxpc3QsICpyLCAqKnByOworCisgIGlmIChsb3cgPT0gKGJmZF92bWEpIC0xIHx8IGhpZ2ggPT0gKGJmZF92bWEpIC0xIHx8IGxvdyA9PSBoaWdoKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChnbG9iYWwpCisgICAgcGxpc3QgPSAmaW5mby0+Z2xvYmFsX3JhbmdlczsKKyAgZWxzZQorICAgIHBsaXN0ID0gJmluZm8tPnJhbmdlczsKKworICBmb3IgKHIgPSAqcGxpc3Q7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCisgICAgeworICAgICAgaWYgKGhpZ2ggPj0gci0+bG93ICYmIGxvdyA8PSByLT5oaWdoKQorCXsKKwkgIC8qIFRoZSBuZXcgcmFuZ2Ugb3ZlcmxhcHMgci4gICovCisJICBpZiAobG93IDwgci0+bG93KQorCSAgICByLT5sb3cgPSBsb3c7CisJICBpZiAoaGlnaCA+IHItPmhpZ2gpCisJICAgIHItPmhpZ2ggPSBoaWdoOworCSAgcHIgPSAmci0+bmV4dDsKKwkgIHdoaWxlICgqcHIgIT0gTlVMTCAmJiAoKnByKS0+bG93IDw9IHItPmhpZ2gpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgaWVlZV9yYW5nZSAqbjsKKworCSAgICAgIGlmICgoKnByKS0+aGlnaCA+IHItPmhpZ2gpCisJCXItPmhpZ2ggPSAoKnByKS0+aGlnaDsKKwkgICAgICBuID0gKCpwciktPm5leHQ7CisJICAgICAgZnJlZSAoKnByKTsKKwkgICAgICAqcHIgPSBuOworCSAgICB9CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorCisgIHIgPSAoc3RydWN0IGllZWVfcmFuZ2UgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKKyAgbWVtc2V0IChyLCAwLCBzaXplb2YgKnIpOworCisgIHItPmxvdyA9IGxvdzsKKyAgci0+aGlnaCA9IGhpZ2g7CisKKyAgLyogU3RvcmUgdGhlIHJhbmdlcyBzb3J0ZWQgYnkgYWRkcmVzcy4gICovCisgIGZvciAocHIgPSBwbGlzdDsgKnByICE9IE5VTEw7IHByID0gJigqcHIpLT5uZXh0KQorICAgIGlmICgoKnByKS0+bG93ID4gaGlnaCkKKyAgICAgIGJyZWFrOworICByLT5uZXh0ID0gKnByOworICAqcHIgPSByOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFydCBhIG5ldyByYW5nZSBmb3Igd2hpY2ggd2Ugb25seSBoYXZlIHRoZSBsb3cgYWRkcmVzcy4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3N0YXJ0X3JhbmdlIChpbmZvLCBsb3cpCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKKyAgICAgYmZkX3ZtYSBsb3c7Cit7CisgIHN0cnVjdCBpZWVlX3JhbmdlICpyOworCisgIHIgPSAoc3RydWN0IGllZWVfcmFuZ2UgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKKyAgbWVtc2V0IChyLCAwLCBzaXplb2YgKnIpOworICByLT5sb3cgPSBsb3c7CisgIHItPm5leHQgPSBpbmZvLT5wZW5kaW5nX3JhbmdlczsKKyAgaW5mby0+cGVuZGluZ19yYW5nZXMgPSByOworICByZXR1cm4gdHJ1ZTsKK30gIAorCisvKiBGaW5pc2ggYSByYW5nZSBzdGFydGVkIGJ5IGllZWVfc3RhcnRfcmFuZ2UuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9lbmRfcmFuZ2UgKGluZm8sIGhpZ2gpCisgICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKKyAgICAgYmZkX3ZtYSBoaWdoOworeworICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKKyAgYmZkX3ZtYSBsb3c7CisKKyAgYXNzZXJ0IChpbmZvLT5wZW5kaW5nX3JhbmdlcyAhPSBOVUxMKTsKKyAgciA9IGluZm8tPnBlbmRpbmdfcmFuZ2VzOworICBsb3cgPSByLT5sb3c7CisgIGluZm8tPnBlbmRpbmdfcmFuZ2VzID0gci0+bmV4dDsKKyAgZnJlZSAocik7CisgIHJldHVybiBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIGxvdywgaGlnaCk7Cit9CisKKy8qIFN0YXJ0IGRlZmluaW5nIGEgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB1bnNpZ25lZHA7CisgICAgIGJvb2xlYW4gbG9jYWxwOworeworICByZXR1cm4gaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkgKHVuc2lnbmVkIGludCkgLTEsIHNpemUsIHVuc2lnbmVkcCwKKwkJCQkgbG9jYWxwLCAoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKTsKK30KKworLyogU3RhcnQgZGVmaW5pbmcgYSBuYW1lZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIG5hbWUsIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwLCBidWZsaXN0KQorICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHVuc2lnbmVkIGludCBpbmR4OworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB1bnNpZ25lZHA7CisgICAgIGJvb2xlYW4gbG9jYWxwOworICAgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpidWZsaXN0OworeworICB1bnNpZ25lZCBpbnQgdHlwZV9pbmR4OworICB1bnNpZ25lZCBpbnQgbmFtZV9pbmR4OworCisgIGlmIChpbmR4ICE9ICh1bnNpZ25lZCBpbnQpIC0xKQorICAgIHR5cGVfaW5keCA9IGluZHg7CisgIGVsc2UKKyAgICB7CisgICAgICB0eXBlX2luZHggPSBpbmZvLT50eXBlX2luZHg7CisgICAgICArK2luZm8tPnR5cGVfaW5keDsKKyAgICB9CisKKyAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OworICArK2luZm8tPm5hbWVfaW5keDsKKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIG5hbWUgPSAiIjsKKworICAvKiBJZiB3ZSB3ZXJlIGdpdmVuIGEgYnVmZmVyLCB1c2UgaXQ7IG90aGVyd2lzZSwgdXNlIGVpdGhlciB0aGUKKyAgICAgbG9jYWwgb3IgdGhlIGdsb2JhbCB0eXBlIGluZm9ybWF0aW9uLCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHR5cGUKKyAgICAgYmxvY2sgaXMgc3RhcnRlZC4gICovCisgIGlmIChidWZsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCBidWZsaXN0KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsb2NhbHApCisgICAgeworICAgICAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQorCXsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKKwl7CisJICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBQdXNoIHRoZSBuZXcgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgd3JpdGUgb3V0IGFuIE5OIHJlY29yZCwgYW5kCisgICAgIHdyaXRlIG91dCB0aGUgc3RhcnQgb2YgYSBUWSByZWNvcmQuICBUaGUgY2FsbGVyIHdpbGwgdGhlbiBmaW5pc2gKKyAgICAgdGhlIFRZIHJlY29yZC4gICovCisgIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCB0eXBlX2luZHgsIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIChpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkKKwkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCisJICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdHlwZV9pbmR4KQorCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAweGNlKQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkpOworfQorCisvKiBHZXQgYW4gZW50cnkgdG8gdGhlIGxpc3Qgb2YgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSB0eXBlLiAgKi8KKworc3RhdGljIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKgoraWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAoaW5mbywgaW5keCkKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICB1bnNpZ25lZCBpbnQgaW5keDsKK3sKKyAgaWYgKGluZHggPj0gaW5mby0+bW9kaWZpZWRfYWxsb2MpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG5hbGxvYzsKKworICAgICAgbmFsbG9jID0gaW5mby0+bW9kaWZpZWRfYWxsb2M7CisgICAgICBpZiAobmFsbG9jID09IDApCisJbmFsbG9jID0gMTY7CisgICAgICB3aGlsZSAoaW5keCA+PSBuYWxsb2MpCisJbmFsbG9jICo9IDI7CisgICAgICBpbmZvLT5tb2RpZmllZCA9ICgoc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqKQorCQkJeHJlYWxsb2MgKGluZm8tPm1vZGlmaWVkLAorCQkJCSAgbmFsbG9jICogc2l6ZW9mICppbmZvLT5tb2RpZmllZCkpOworICAgICAgbWVtc2V0IChpbmZvLT5tb2RpZmllZCArIGluZm8tPm1vZGlmaWVkX2FsbG9jLCAwLAorCSAgICAgIChuYWxsb2MgLSBpbmZvLT5tb2RpZmllZF9hbGxvYykgKiBzaXplb2YgKmluZm8tPm1vZGlmaWVkKTsKKyAgICAgIGluZm8tPm1vZGlmaWVkX2FsbG9jID0gbmFsbG9jOworICAgIH0KKworICByZXR1cm4gaW5mby0+bW9kaWZpZWQgKyBpbmR4OworfQorDAorLyogUm91dGluZXMgZm9yIHRoZSBoYXNoIHRhYmxlIG1hcHBpbmcgbmFtZXMgdG8gdHlwZXMuICAqLworCisvKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCitpZWVlX25hbWVfdHlwZV9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKKyAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqcmV0ID0KKyAgICAoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikgZW50cnk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQorICAgICBzdWJjbGFzcy4gICovCisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXQgPSAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKnJldCkpOworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopCisJIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7CisgIGlmIChyZXQpCisgICAgeworICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPnR5cGVzID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKKyAgKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKSBcCisgICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCisKKy8qIFRyYXZlcnNlIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKKyAgKGJmZF9oYXNoX3RyYXZlcnNlCQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisMCisvKiBUaGUgZ2VuZXJhbCByb3V0aW5lIHRvIHdyaXRlIG91dCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKK2Jvb2xlYW4KK3dyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgUFRSIGRoYW5kbGU7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSBpbmZvOworICBhc2VjdGlvbiAqczsKKyAgY29uc3QgY2hhciAqZXJyOworICBzdHJ1Y3QgaWVlZV9idWYgKmI7CisKKyAgbWVtc2V0ICgmaW5mbywgMCwgc2l6ZW9mIGluZm8pOworICBpbmZvLmFiZmQgPSBhYmZkOworICBpbmZvLnR5cGVfaW5keCA9IDI1NjsKKyAgaW5mby5uYW1lX2luZHggPSAzMjsKKworICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby50eXBlZGVmcy5yb290LCBpZWVlX25hbWVfdHlwZV9uZXdmdW5jKQorICAgICAgfHwgISBiZmRfaGFzaF90YWJsZV9pbml0ICgmaW5mby50YWdzLnJvb3QsIGllZWVfbmFtZV90eXBlX25ld2Z1bmMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZ2xvYmFsX3R5cGVzKQorICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZGF0YSkKKyAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnR5cGVzKQorICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8udmFycykKKyAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmN4eCkKKyAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmxpbmVub3MpCisgICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5mbnR5cGUpCisgICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5mbmFyZ3MpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBkZWJ1Z193cml0ZSAoZGhhbmRsZSwgJmllZWVfZm5zLCAoUFRSKSAmaW5mbykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChpbmZvLmZpbGVuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoJmluZm8pKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogUHV0IGFueSB1bmRlZmluZWQgdGFncyBpbiB0aGUgZ2xvYmFsIHR5cGVkZWYgaW5mb3JtYXRpb24uICAqLworICBpbmZvLmVycm9yID0gZmFsc2U7CisgIGllZWVfbmFtZV90eXBlX2hhc2hfdHJhdmVyc2UgKCZpbmZvLnRhZ3MsCisJCQkJaWVlZV93cml0ZV91bmRlZmluZWRfdGFnLAorCQkJCShQVFIpICZpbmZvKTsKKyAgaWYgKGluZm8uZXJyb3IpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFByZXBlbmQgdGhlIGdsb2JhbCB0eXBlZGVmIGluZm9ybWF0aW9uIHRvIHRoZSBvdGhlciBkYXRhLiAgKi8KKyAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby5nbG9iYWxfdHlwZXMpKQorICAgIHsKKyAgICAgIC8qIFRoZSBIUCBkZWJ1Z2dlciBzZWVtcyB0byBoYXZlIGEgYnVnIGluIHdoaWNoIGl0IGlnbm9yZXMgdGhlCisgICAgICAgICBsYXN0IGVudHJ5IGluIHRoZSBnbG9iYWwgdHlwZXMsIHNvIHdlIGFkZCBhIGR1bW15IGVudHJ5LiAgKi8KKyAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcykKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby5uYW1lX2luZHgpCisJICB8fCAhIGllZWVfd3JpdGVfaWQgKCZpbmZvLCAiIikKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV90eV9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCBpbmZvLnR5cGVfaW5keCkKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgMHhjZSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCBpbmZvLm5hbWVfaW5keCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKCZpbmZvLCAnUCcpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgKGludCkgYnVpbHRpbl92b2lkICsgMzIpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyICgmaW5mbywgJmluZm8uZ2xvYmFsX3R5cGVzLCAmaW5mby5kYXRhKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpbmZvLmRhdGEgPSBpbmZvLmdsb2JhbF90eXBlczsKKyAgICB9CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBkZWNsYXJlIEJCMTEgYmxvY2tzIGZvciBlYWNoIHJhbmdlIGluIHRoZQorICAgICBmaWxlLiAgVGhleSBhcmUgYWRkZWQgdG8gaW5mby0+dmFycy4gICovCisgIGluZm8uZXJyb3IgPSBmYWxzZTsKKyAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBpZWVlX2FkZF9iYjExX2Jsb2NrcywgKFBUUikgJmluZm8pOworICBpZiAoaW5mby5lcnJvcikKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8udmFycykpCisgICAgeworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyICgmaW5mbywgJmluZm8udmFycykKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlICgmaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKCZpbmZvLCAmaW5mby5kYXRhLCAmaW5mby52YXJzKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIE5vdyBhbGwgdGhlIGRhdGEgaXMgaW4gaW5mby5kYXRhLiAgV3JpdGUgaXQgb3V0IHRvIHRoZSBCRkQuICBXZQorICAgICBub3JtYWxseSB3b3VsZCBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoZXRoZXIgYWxsIHRoZSBvdGhlciBzZWN0aW9ucworICAgICBhcmUgc2V0IHVwIHlldCwgYnV0IHRoZSBJRUVFIGJhY2tlbmQgd2lsbCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyCisgICAgIGNhc2UgY29ycmVjdGx5IHJlZ2FyZGxlc3MuICAqLworICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby5kYXRhKSkKKyAgICB7CisgICAgICAvKiBUaGVyZSBpcyBubyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlcnIgPSBOVUxMOworICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kZWJ1ZyIpOworICBpZiAocyA9PSBOVUxMKQorICAgIGVyciA9ICJiZmRfbWFrZV9zZWN0aW9uIjsKKyAgaWYgKGVyciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgU0VDX0RFQlVHR0lORyB8IFNFQ19IQVNfQ09OVEVOVFMpKQorCWVyciA9ICJiZmRfc2V0X3NlY3Rpb25fZmxhZ3MiOworICAgIH0KKyAgaWYgKGVyciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworICAgICAgc2l6ZSA9IDA7CisgICAgICBmb3IgKGIgPSBpbmZvLmRhdGEuaGVhZDsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKKwlzaXplICs9IGItPmM7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcywgc2l6ZSkpCisJZXJyID0gImJmZF9zZXRfc2VjdGlvbl9zaXplIjsKKyAgICB9CisgIGlmIChlcnIgPT0gTlVMTCkKKyAgICB7CisgICAgICBmaWxlX3B0ciBvZmZzZXQ7CisKKyAgICAgIG9mZnNldCA9IDA7CisgICAgICBmb3IgKGIgPSBpbmZvLmRhdGEuaGVhZDsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKKwl7CisJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIGItPmJ1Ziwgb2Zmc2V0LCBiLT5jKSkKKwkgICAgeworCSAgICAgIGVyciA9ICJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBvZmZzZXQgKz0gYi0+YzsKKwl9CisgICAgfQorCisgIGlmIChlcnIgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgZXJyLAorCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZpbmZvLnR5cGVkZWZzLnJvb3QpOworICBiZmRfaGFzaF90YWJsZV9mcmVlICgmaW5mby50YWdzLnJvb3QpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBXcml0ZSBvdXQgaW5mb3JtYXRpb24gZm9yIGFuIHVuZGVmaW5lZCB0YWcuICBUaGlzIGlzIGNhbGxlZCB2aWEKKyAgIGllZWVfbmFtZV90eXBlX2hhc2hfdHJhdmVyc2UuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV93cml0ZV91bmRlZmluZWRfdGFnIChoLCBwKQorICAgICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqaDsKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgc3RydWN0IGllZWVfbmFtZV90eXBlICpudDsKKworICBmb3IgKG50ID0gaC0+dHlwZXM7IG50ICE9IE5VTEw7IG50ID0gbnQtPm5leHQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKKyAgICAgIGNoYXIgY29kZTsKKworICAgICAgaWYgKG50LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKKwljb250aW51ZTsKKworICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCisJeworCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCisJICAgIHsKKwkgICAgICBpbmZvLT5lcnJvciA9IHRydWU7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykpCisJICAgIHsKKwkgICAgICBpbmZvLT5lcnJvciA9IHRydWU7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCisgICAgICBuYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7CisgICAgICArK2luZm8tPm5hbWVfaW5keDsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCisJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIG50LT50eXBlLm5hbWUpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV90eV9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG50LT50eXBlLmluZHgpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMHhjZSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkpCisJeworCSAgaW5mby0+ZXJyb3IgPSB0cnVlOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgc3dpdGNoIChudC0+a2luZCkKKwl7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCSAgaW5mby0+ZXJyb3IgPSB0cnVlOworCSAgcmV0dXJuIGZhbHNlOworCWNhc2UgREVCVUdfS0lORF9TVFJVQ1Q6CisJY2FzZSBERUJVR19LSU5EX0NMQVNTOgorCSAgY29kZSA9ICdTJzsKKwkgIGJyZWFrOworCWNhc2UgREVCVUdfS0lORF9VTklPTjoKKwljYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6CisJICBjb2RlID0gJ1UnOworCSAgYnJlYWs7CisJY2FzZSBERUJVR19LSU5EX0VOVU06CisJICBjb2RlID0gJ0UnOworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGNvZGUpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKSkKKwl7CisJICBpbmZvLT5lcnJvciA9IHRydWU7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgd3JpdGluZyBvdXQgaW5mb3JtYXRpb24gZm9yIGEgY29tcGlsYXRpb24gdW5pdC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgKHAsIGZpbGVuYW1lKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgY29uc3QgY2hhciAqbW9kbmFtZTsKKyAgY2hhciAqYywgKnM7CisgIHVuc2lnbmVkIGludCBuaW5keDsKKworICBpZiAoaW5mby0+ZmlsZW5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0IChpbmZvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGluZm8tPmZpbGVuYW1lID0gZmlsZW5hbWU7CisgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKKyAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKKyAgICArK21vZG5hbWU7CisgIGVsc2UKKyAgICB7CisgICAgICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICdcXCcpOworICAgICAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKKwkrK21vZG5hbWU7CisgICAgICBlbHNlCisJbW9kbmFtZSA9IGZpbGVuYW1lOworICAgIH0KKyAgYyA9IHhzdHJkdXAgKG1vZG5hbWUpOworICBzID0gc3RycmNociAoYywgJy4nKTsKKyAgaWYgKHMgIT0gTlVMTCkKKyAgICAqcyA9ICdcMCc7CisgIGluZm8tPm1vZG5hbWUgPSBjOworCisgIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKKyAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCisgICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpCisgICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGluZm8tPnJhbmdlcyA9IE5VTEw7CisKKyAgLyogQWx3YXlzIGluY2x1ZGUgYSBCQjEgYW5kIGEgQkIzIGJsb2NrLiAgVGhhdCBpcyB3aGF0IHRoZSBvdXRwdXQgb2YKKyAgICAgdGhlIE1SSSBsaW5rZXIgc2VlbXMgdG8gbG9vayBsaWtlLiAgKi8KKyAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OworICArK2luZm8tPm5hbWVfaW5keDsKKyAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDMpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCB1cCBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoaW5mbykKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworeworICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKKworICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCisgICAgeworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5jeHgpKQorICAgIHsKKyAgICAgIC8qIEFwcGVuZCBhbnkgQysrIGluZm9ybWF0aW9uIHRvIHRoZSBnbG9iYWwgZnVuY3Rpb24gYW5kCisgICAgICAgICB2YXJpYWJsZSBpbmZvcm1hdGlvbi4gICovCisgICAgICBhc3NlcnQgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpOworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBXZSBwdXQgdGhlIHBtaXNjIHJlY29yZHMgaW4gYSBkdW1teSBwcm9jZWR1cmUsIGp1c3QgYXMgdGhlCisgICAgICAgICBNUkkgY29tcGlsZXIgZG9lcy4gICovCisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNikKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJfX1hSWUNQUCIpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmhpZ2hhZGRyIC0gMSkKKwkgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycywgJmluZm8tPmN4eCkKKwkgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+aGlnaGFkZHIgLSAxKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBGb3JjZSBvdXQgdGhlIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLworICAgICAgaWYgKCEgaWVlZV9saW5lbm8gKChQVFIpIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIDAsIChiZmRfdm1hKSAtMSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+bGluZW5vcykpCisgICAgeworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQorCXsKKwkgIC8qIFdlIHdlcmUgbm90IGluIHRoZSBtYWluIGZpbGUuICBXZSBqdXN0IGNsb3NlZCB0aGUKKyAgICAgICAgICAgICBpbmNsdWRlZCBsaW5lIG51bWJlciBibG9jaywgYW5kIG5vdyB3ZSBtdXN0IGNsb3NlIHRoZQorICAgICAgICAgICAgIG1haW4gbGluZSBudW1iZXIgYmxvY2suICAqLworCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPnR5cGVzKQorICAgICAgfHwgISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5kYXRhLCAmaW5mby0+dmFycykKKyAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPmxpbmVub3MpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBCdWlsZCBCQjEwL0JCMTEgYmxvY2tzIGJhc2VkIG9uIHRoZSByYW5nZXMgd2UgcmVjb3JkZWQuICAqLworICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5kYXRhKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiR05VIG9iamNvcHkiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChyID0gaW5mby0+cmFuZ2VzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQorICAgIHsKKyAgICAgIGJmZF92bWEgbG93LCBoaWdoOworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBpbnQga2luZDsKKworICAgICAgbG93ID0gci0+bG93OworICAgICAgaGlnaCA9IHItPmhpZ2g7CisKKyAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGlzIHJhbmdlLiAgKi8KKyAgICAgIGZvciAocyA9IGluZm8tPmFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKSA8PSBsb3cKKwkgICAgICAmJiBoaWdoIDw9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKQorCQkJICArIGJmZF9zZWN0aW9uX3NpemUgKGluZm8tPmFiZmQsIHMpKSkKKwkgICAgYnJlYWs7CisJfQorCisgICAgICBpZiAocyA9PSBOVUxMKQorCXsKKwkgIC8qIEp1c3QgaWdub3JlIHRoaXMgcmFuZ2UuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBDb2FsZXNjZSByYW5nZXMgaWYgaXQgc2VlbXMgcmVhc29uYWJsZS4gICovCisgICAgICB3aGlsZSAoci0+bmV4dCAhPSBOVUxMCisJICAgICAmJiBoaWdoICsgMHgxMDAwID49IHItPm5leHQtPmxvdworCSAgICAgJiYgKHItPm5leHQtPmhpZ2gKKwkJIDw9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChpbmZvLT5hYmZkLCBzKQorCQkgICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoaW5mby0+YWJmZCwgcykpKSkKKwl7CisJICByID0gci0+bmV4dDsKKwkgIGhpZ2ggPSByLT5oaWdoOworCX0KKworICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQorCWtpbmQgPSAxOworICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQorCWtpbmQgPSAzOworICAgICAgZWxzZQorCWtpbmQgPSAyOworCisgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTEpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGtpbmQpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGxvdykKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaGlnaCAtIGxvdykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBBZGQgdGhpcyByYW5nZSB0byB0aGUgbGlzdCBvZiBnbG9iYWwgcmFuZ2VzLiAgKi8KKyAgICAgIGlmICghIGllZWVfYWRkX3JhbmdlIChpbmZvLCB0cnVlLCBsb3csIGhpZ2gpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBCQjExIGJsb2NrcyBkZXNjcmliaW5nIGVhY2ggcmFuZ2UgdGhhdCB3ZSBoYXZlIG5vdCBhbHJlYWR5CisgICBkZXNjcmliZWQuICAqLworCitzdGF0aWMgdm9pZAoraWVlZV9hZGRfYmIxMV9ibG9ja3MgKGFiZmQsIHNlYywgZGF0YSkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBkYXRhOworICBiZmRfdm1hIGxvdywgaGlnaDsKKyAgc3RydWN0IGllZWVfcmFuZ2UgKnI7CisKKyAgbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKKyAgaGlnaCA9IGxvdyArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7CisKKyAgLyogRmluZCB0aGUgZmlyc3QgcmFuZ2UgYXQgb3IgYWZ0ZXIgdGhpcyBzZWN0aW9uLiAgVGhlIHJhbmdlcyBhcmUKKyAgICAgc29ydGVkIGJ5IGFkZHJlc3MuICAqLworICBmb3IgKHIgPSBpbmZvLT5nbG9iYWxfcmFuZ2VzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQorICAgIGlmIChyLT5oaWdoID4gbG93KQorICAgICAgYnJlYWs7CisKKyAgd2hpbGUgKGxvdyA8IGhpZ2gpCisgICAgeworICAgICAgaWYgKHIgPT0gTlVMTCB8fCByLT5sb3cgPj0gaGlnaCkKKwl7CisJICBpZiAoISBpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgaGlnaCkpCisJICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChsb3cgPCByLT5sb3cKKwkgICYmIHItPmxvdyAtIGxvdyA+IDB4MTAwKQorCXsKKwkgIGlmICghIGllZWVfYWRkX2JiMTEgKGluZm8sIHNlYywgbG93LCByLT5sb3cpKQorCSAgICB7CisJICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIGxvdyA9IHItPmhpZ2g7CisKKyAgICAgIHIgPSByLT5uZXh0OworICAgIH0KK30KKworLyogQWRkIGEgc2luZ2xlIEJCMTEgYmxvY2sgZm9yIGEgcmFuZ2UuICBXZSBhZGQgaXQgdG8gaW5mby0+dmFycy4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgaGlnaCkKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBiZmRfdm1hIGxvdzsKKyAgICAgYmZkX3ZtYSBoaWdoOworeworICBpbnQga2luZDsKKworICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSkKKyAgICB7CisgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICptb2RuYW1lOworICAgICAgY2hhciAqYywgKnM7CisKKyAgICAgIC8qIFN0YXJ0IHRoZSBlbmNsb3NpbmcgQkIxMCBibG9jay4gICovCisgICAgICBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGluZm8tPmFiZmQpOworICAgICAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOworICAgICAgaWYgKG1vZG5hbWUgIT0gTlVMTCkKKwkrK21vZG5hbWU7CisgICAgICBlbHNlCisJeworCSAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnXFwnKTsKKwkgIGlmIChtb2RuYW1lICE9IE5VTEwpCisJICAgICsrbW9kbmFtZTsKKwkgIGVsc2UKKwkgICAgbW9kbmFtZSA9IGZpbGVuYW1lOworCX0KKyAgICAgIGMgPSB4c3RyZHVwIChtb2RuYW1lKTsKKyAgICAgIHMgPSBzdHJyY2hyIChjLCAnLicpOworICAgICAgaWYgKHMgIT0gTlVMTCkKKwkqcyA9ICdcMCc7CisKKyAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGMpCisJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIkdOVSBvYmpjb3B5IikpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBmcmVlIChjKTsKKyAgICB9CisKKyAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0NPREUpICE9IDApCisgICAga2luZCA9IDE7CisgIGVsc2UgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwKQorICAgIGtpbmQgPSAzOworICBlbHNlCisgICAga2luZCA9IDI7CisKKyAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDExKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBraW5kKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2VjLT5pbmRleCArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGxvdykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaGlnaCAtIGxvdykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFydCByZWNvcmRpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHBhcnRpY3VsYXIgc291cmNlIGZpbGUuICBUaGlzIGlzCisgICB1c2VkIHRvIHJlY29yZCB3aGljaCBmaWxlIGRlZmluZWQgd2hpY2ggdHlwZXMsIHZhcmlhYmxlcywgZXRjLiAgSXQKKyAgIGlzIG5vdCB1c2VkIGZvciBsaW5lIG51bWJlcnMsIHNpbmNlIHRoZSBsaW5lbm8gZW50cnkgcG9pbnQgcGFzc2VzCisgICBkb3duIHRoZSBmaWxlIG5hbWUgYW55aG93LiAgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZG9lc24ndCBzZWVtCisgICB0byBzdG9yZSB0aGlzIGluZm9ybWF0aW9uIGFueXdoZXJlLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgoraWVlZV9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIHJldHVybiB0cnVlOworfQorCisvKiBNYWtlIGFuIGVtcHR5IHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9lbXB0eV90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworCisgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgKGludCkgYnVpbHRpbl91bmtub3duLCAwLCBmYWxzZSwgZmFsc2UpOworfQorCisvKiBNYWtlIGEgdm9pZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfdm9pZF90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworCisgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgKGludCkgYnVpbHRpbl92b2lkLCAwLCBmYWxzZSwgZmFsc2UpOworfQorCisvKiBNYWtlIGFuIGludGVnZXIgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCisgICAgIFBUUiBwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IGluZHg7CisKKyAgc3dpdGNoIChzaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfY2hhcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGluZHggPSAoaW50KSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfbG9uZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIGluZHggPSAoaW50KSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGludGVnZXIgdHlwZSBzaXplICV1XG4iKSwgc2l6ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICh1bnNpZ25lZHApCisgICAgKytpbmR4OworCisgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCwgc2l6ZSwgdW5zaWduZWRwLCBmYWxzZSk7Cit9CisKKy8qIE1ha2UgYSBmbG9hdGluZyBwb2ludCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfZmxvYXRfdHlwZSAocCwgc2l6ZSkKKyAgICAgUFRSIHA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIHVuc2lnbmVkIGludCBpbmR4OworCisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSA0OgorICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fZmxvYXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9kb3VibGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgLyogRklYTUU6IFRoaXMgc2l6ZSByZWFsbHkgZGVwZW5kcyB1cG9uIHRoZSBwcm9jZXNzb3IuICAqLworICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fbG9uZ19kb3VibGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgdW5zdXBwb3J0ZWQgZmxvYXQgdHlwZSBzaXplICV1XG4iKSwgc2l6ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCwgc2l6ZSwgZmFsc2UsIGZhbHNlKTsKK30KKworLyogTWFrZSBhIGNvbXBsZXggdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKKyAgICAgUFRSIHA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIGNoYXIgY29kZTsKKworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgNDoKKyAgICAgIGlmIChpbmZvLT5jb21wbGV4X2Zsb2F0X2luZGV4ICE9IDApCisJcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmZvLT5jb21wbGV4X2Zsb2F0X2luZGV4LCBzaXplICogMiwKKwkJCSAgICAgICBmYWxzZSwgZmFsc2UpOworICAgICAgY29kZSA9ICdjJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgY2FzZSAxNjoKKyAgICAgIC8qIFRoZXNlIGNhc2VzIGNhbiBiZSBvdXRwdXQgYnkgZ2NjIC1nc3RhYnMuICBPdXRwdXR0aW5nIHRoZQorICAgICAgICAgd3JvbmcgdHlwZSBpcyBiZXR0ZXIgdGhhbiBjcmFzaGluZy4gICovCisgICAgY2FzZSA4OgorICAgICAgaWYgKGluZm8tPmNvbXBsZXhfZG91YmxlX2luZGV4ICE9IDApCisJcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCwgc2l6ZSAqIDIsCisJCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGNvZGUgPSAnZCc7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGNvbXBsZXggdHlwZSBzaXplICV1XG4iKSwgc2l6ZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIEZJWE1FOiBJIGRvbid0IGtub3cgd2hhdCB0aGUgc3RyaW5nIGlzIGZvci4gICovCisgIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUgKiAyLCBmYWxzZSwgZmFsc2UpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBjb2RlKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChzaXplID09IDQpCisgICAgaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKKyAgZWxzZQorICAgIGluZm8tPmNvbXBsZXhfZG91YmxlX2luZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBNYWtlIGEgYm9vbGVhbiB0eXBlLiAgSUVFRSBkb2Vzbid0IHN1cHBvcnQgdGhlc2UsIHNvIHdlIGp1c3QgbWFrZQorICAgYW4gaW50ZWdlciB0eXBlIGluc3RlYWQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9ib29sX3R5cGUgKHAsIHNpemUpCisgICAgIFBUUiBwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgcmV0dXJuIGllZWVfaW50X3R5cGUgKHAsIHNpemUsIHRydWUpOworfQorCisvKiBNYWtlIGFuIGVudW1lcmF0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfZW51bV90eXBlIChwLCB0YWcsIG5hbWVzLCB2YWxzKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqdGFnOworICAgICBjb25zdCBjaGFyICoqbmFtZXM7CisgICAgIGJmZF9zaWduZWRfdm1hICp2YWxzOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZTsKKyAgYm9vbGVhbiBsb2NhbHAsIHNpbXBsZTsKKyAgdW5zaWduZWQgaW50IGluZHg7CisgIGludCBpID0gMDsKKworICBsb2NhbHAgPSBmYWxzZTsKKyAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOworICBmb3IgKGUgPSBpbmZvLT5lbnVtczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAodGFnID09IE5VTEwpCisJeworCSAgaWYgKGUtPnRhZyAhPSBOVUxMKQorCSAgICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGUtPnRhZyA9PSBOVUxMCisJICAgICAgfHwgdGFnWzBdICE9IGUtPnRhZ1swXQorCSAgICAgIHx8IHN0cmNtcCAodGFnLCBlLT50YWcpICE9IDApCisJICAgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKCEgZS0+ZGVmaW5lZCkKKwl7CisJICAvKiBUaGlzIGVudW0gdGFnIGhhcyBiZWVuIHNlZW4gYnV0IG5vdCBkZWZpbmVkLiAgKi8KKwkgIGluZHggPSBlLT5pbmR4OworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAobmFtZXMgIT0gTlVMTCAmJiBlLT5uYW1lcyAhPSBOVUxMKQorCXsKKwkgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEwgJiYgZS0+bmFtZXNbaV0gIT0gTlVMTDsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVzW2ldWzBdICE9IGUtPm5hbWVzW2ldWzBdCisJCSAgfHwgdmFsc1tpXSAhPSBlLT52YWxzW2ldCisJCSAgfHwgc3RyY21wIChuYW1lc1tpXSwgZS0+bmFtZXNbaV0pICE9IDApCisJCWJyZWFrOworCSAgICB9CisJfQorCisgICAgICBpZiAoKG5hbWVzID09IE5VTEwgJiYgZS0+bmFtZXMgPT0gTlVMTCkKKwkgIHx8IChuYW1lcyAhPSBOVUxMCisJICAgICAgJiYgZS0+bmFtZXMgIT0gTlVMTAorCSAgICAgICYmIG5hbWVzW2ldID09IE5VTEwKKwkgICAgICAmJiBlLT5uYW1lc1tpXSA9PSBOVUxMKSkKKwl7CisJICAvKiBXZSd2ZSBzZWVuIHRoaXMgZW51bSBiZWZvcmUuICAqLworCSAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBlLT5pbmR4LCAwLCB0cnVlLCBmYWxzZSk7CisJfQorCisgICAgICBpZiAodGFnICE9IE5VTEwpCisJeworCSAgLyogV2UndmUgYWxyZWFkeSBzZWVuIGFuIGVudW0gb2YgdGhlIHNhbWUgbmFtZSwgc28gd2UgbXVzdCBtYWtlCisJICAgICBzdXJlIHRvIG91dHB1dCB0aGlzIG9uZSBsb2NhbGx5LiAgKi8KKwkgIGxvY2FscCA9IHRydWU7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSBzaW1wbGUgZW51bWVyYXRpb24sIGluIHdoaWNoIHRoZSB2YWx1ZXMgc3RhcnQgYXQgMAorICAgICBhbmQgYWx3YXlzIGluY3JlbWVudCBieSAxLCB3ZSBjYW4gdXNlIHR5cGUgRS4gIE90aGVyd2lzZSB3ZSBtdXN0CisgICAgIHVzZSB0eXBlIE4uICAqLworCisgIHNpbXBsZSA9IHRydWU7CisgIGlmIChuYW1lcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEw7IGkrKykKKwl7CisJICBpZiAodmFsc1tpXSAhPSBpKQorCSAgICB7CisJICAgICAgc2ltcGxlID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmICghIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIHRhZywgaW5keCwgMCwgdHJ1ZSwgbG9jYWxwLAorCQkJCShzdHJ1Y3QgaWVlZV9idWZsaXN0ICopIE5VTEwpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzaW1wbGUgPyAnRScgOiAnTicpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHNpbXBsZSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogVGhpcyBpcyBzdXBwb3NlZCB0byBiZSB0aGUgZW51bWVyYXRpb24gc2l6ZSwgYnV0IHdlCisgICAgICAgICBkb24ndCBzdG9yZSB0aGF0LiAgKi8KKyAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA0KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAobmFtZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMOyBpKyspCisJeworCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZXNbaV0pKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoISBzaW1wbGUpCisJICAgIHsKKwkgICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsc1tpXSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKCEgbG9jYWxwKQorICAgIHsKKyAgICAgIGlmIChpbmR4ID09ICh1bnNpZ25lZCBpbnQpIC0xKQorCXsKKwkgIGUgPSAoc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICopIHhtYWxsb2MgKHNpemVvZiAqZSk7CisJICBtZW1zZXQgKGUsIDAsIHNpemVvZiAqZSk7CisJICBlLT5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OworCSAgZS0+dGFnID0gdGFnOworCisJICBlLT5uZXh0ID0gaW5mby0+ZW51bXM7CisJICBpbmZvLT5lbnVtcyA9IGU7CisJfQorCisgICAgICBlLT5uYW1lcyA9IG5hbWVzOworICAgICAgZS0+dmFscyA9IHZhbHM7CisgICAgICBlLT5kZWZpbmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE1ha2UgYSBwb2ludGVyIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9wb2ludGVyX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIGJvb2xlYW4gbG9jYWxwOworICB1bnNpZ25lZCBpbnQgaW5keDsKKyAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7CisKKyAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7CisgIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKworICAvKiBBIHBvaW50ZXIgdG8gYSBzaW1wbGUgYnVpbHRpbiB0eXBlIGNhbiBiZSBvYnRhaW5lZCBieSBhZGRpbmcgMzIuCisgICAgIEZJWE1FOiBXaWxsIHRoaXMgYmUgYSBzaG9ydCBwb2ludGVyLCBhbmQgd2lsbCB0aGF0IG1hdHRlcj8gICovCisgIGlmIChpbmR4IDwgMzIpCisgICAgcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4ICsgMzIsIDAsIHRydWUsIGZhbHNlKTsKKworICBpZiAoISBsb2NhbHApCisgICAgeworICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKHAsIGluZHgpOworICAgICAgaWYgKG0gPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCisgICAgICBpZiAobS0+cG9pbnRlciA+IDApCisJcmV0dXJuIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT5wb2ludGVyLCA0LCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDQsIHRydWUsIGxvY2FscCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdQJykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBsb2NhbHApCisgICAgbS0+cG9pbnRlciA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFrZSBhIGZ1bmN0aW9uIHR5cGUuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGZvciBhIG1ldGhvZCwgYnV0IHdlCisgICBkb24ndCB3YW50IHRvIGFjdHVhbGx5IGFkZCBpdCB0byB0aGUgdHlwZSB0YWJsZSBpbiB0aGF0IGNhc2UuICBXZQorICAgaGFuZGxlIHRoaXMgYnkgZGVmaW5pbmcgdGhlIHR5cGUgaW4gYSBwcml2YXRlIGJ1ZmZlciwgYW5kIG9ubHkKKyAgIGFkZGluZyB0aGF0IGJ1ZmZlciB0byB0aGUgdHlwZWRlZiBibG9jayBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGl0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCisgICAgIFBUUiBwOworICAgICBpbnQgYXJnY291bnQ7CisgICAgIGJvb2xlYW4gdmFyYXJnczsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworICBib29sZWFuIGxvY2FscDsKKyAgdW5zaWduZWQgaW50ICphcmdzID0gTlVMTDsKKyAgaW50IGk7CisgIHVuc2lnbmVkIGludCByZXRpbmR4OworICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGZuZGVmOworICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptOworCisgIGxvY2FscCA9IGZhbHNlOworCisgIGlmIChhcmdjb3VudCA+IDApCisgICAgeworICAgICAgYXJncyA9ICh1bnNpZ25lZCBpbnQgKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ3MpOworICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCisJICAgIGxvY2FscCA9IHRydWU7CisJICBhcmdzW2ldID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoYXJnY291bnQgPCAwKQorICAgIHZhcmFyZ3MgPSBmYWxzZTsKKworICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCisgICAgbG9jYWxwID0gdHJ1ZTsKKyAgcmV0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIG0gPSBOVUxMOworICBpZiAoYXJnY291bnQgPCAwICYmICEgbG9jYWxwKQorICAgIHsKKyAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChwLCByZXRpbmR4KTsKKyAgICAgIGlmIChtID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAobS0+ZnVuY3Rpb24gPiAwKQorCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+ZnVuY3Rpb24sIDAsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgLyogQW4gYXR0cmlidXRlIG9mIDB4NDEgbWVhbnMgdGhhdCB0aGUgZnJhbWUgYW5kIHB1c2ggbWFzayBhcmUKKyAgICAgdW5rbm93bi4gICovCisgIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZmbmRlZikKKyAgICAgIHx8ICEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkgICAodW5zaWduZWQgaW50KSAtMSwgMCwgdHJ1ZSwgbG9jYWxwLAorCQkJCSAgICZmbmRlZikKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICd4JykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDB4NDEpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHJldGluZHgpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgYXJnY291bnQgKyAodmFyYXJncyA/IDEgOiAwKSkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYXJnY291bnQgPiAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQorCWlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhcmdzW2ldKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIGZyZWUgKGFyZ3MpOworICAgIH0KKyAgaWYgKHZhcmFyZ3MpCisgICAgeworICAgICAgLyogQSB2YXJhcmdzIGZ1bmN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IHdyaXRpbmcgb3V0IHRoZSBsYXN0CisgICAgICAgICBhcmd1bWVudCBhcyB0eXBlIHZvaWQgKiwgYWx0aG91Z2ggdGhpcyBtYWtlcyBsaXR0bGUgc2Vuc2UuICAqLworICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBidWlsdGluX3ZvaWQgKyAzMikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFdlIHdyb3RlIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGZuZGVmLCBpbiBjYXNlIHdlIGRvbid0IG5lZWQgaXQuCisgICAgIEl0IHdpbGwgYmUgYXBwZW5kZWQgdG8gaW5mby0+dHlwZXMgYnkgaWVlZV9wb3BfdHlwZS4gICovCisgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuZm5kZWYgPSBmbmRlZjsKKworICBpZiAobSAhPSBOVUxMKQorICAgIG0tPmZ1bmN0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBNYWtlIGEgcmVmZXJlbmNlIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yZWZlcmVuY2VfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKworICAvKiBJRUVFIGFwcGVhcnMgdG8gcmVjb3JkIGEgbm9ybWFsIHBvaW50ZXIgdHlwZSwgYW5kIHRoZW4gdXNlIGEKKyAgICAgcG1pc2MgcmVjb3JkIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgcmVhbGx5IGEgcmVmZXJlbmNlLiAgKi8KKworICBpZiAoISBpZWVlX3BvaW50ZXJfdHlwZSAocCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXAgPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFrZSBhIHJhbmdlIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9yYW5nZV90eXBlIChwLCBsb3csIGhpZ2gpCisgICAgIFBUUiBwOworICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7CisgICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIGJvb2xlYW4gdW5zaWduZWRwLCBsb2NhbHA7CisKKyAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKKyAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7CisgIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOworICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7CisgIHJldHVybiAoaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ1InKQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBsb3cpCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGhpZ2gpCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdW5zaWduZWRwID8gMCA6IDEpCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2l6ZSkpOworfQorCisvKiBNYWtlIGFuIGFycmF5IHR5cGUuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitpZWVlX2FycmF5X3R5cGUgKHAsIGxvdywgaGlnaCwgc3RyaW5ncCkKKyAgICAgUFRSIHA7CisgICAgIGJmZF9zaWduZWRfdm1hIGxvdzsKKyAgICAgYmZkX3NpZ25lZF92bWEgaGlnaDsKKyAgICAgYm9vbGVhbiBzdHJpbmdwOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIHVuc2lnbmVkIGludCBlbGVpbmR4OworICBib29sZWFuIGxvY2FscDsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOworICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICphOworCisgIC8qIElFRUUgZG9lcyBub3Qgc3RvcmUgdGhlIHJhbmdlLCBzbyB3ZSBqdXN0IGlnbm9yZSBpdC4gICovCisgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKKyAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7CisgIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7CisgIGVsZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKworICAvKiBJZiB3ZSBkb24ndCBrbm93IHRoZSByYW5nZSwgdHJlYXQgdGhlIHNpemUgYXMgZXhhY3RseSBvbmUKKyAgICAgZWxlbWVudC4gICovCisgIGlmIChsb3cgPCBoaWdoKQorICAgIHNpemUgKj0gKGhpZ2ggLSBsb3cpICsgMTsKKworICBpZiAoISBsb2NhbHApCisgICAgeworICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGVsZWluZHgpOworICAgICAgaWYgKG0gPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoYSA9IG0tPmFycmF5czsgYSAhPSBOVUxMOyBhID0gYS0+bmV4dCkKKwl7CisJICBpZiAoYS0+bG93ID09IGxvdyAmJiBhLT5oaWdoID09IGhpZ2gpCisJICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgYS0+aW5keCwgc2l6ZSwgZmFsc2UsIGZhbHNlKTsKKwl9CisgICAgfQorCisgIGlmICghIGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIGZhbHNlLCBsb2NhbHApCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cgPT0gMCA/ICdaJyA6ICdDJykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGVsZWluZHgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGxvdyAhPSAwKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggKyAxKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgbG9jYWxwKQorICAgIHsKKyAgICAgIGEgPSAoc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmEpOworICAgICAgbWVtc2V0IChhLCAwLCBzaXplb2YgKmEpOworCisgICAgICBhLT5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pbmR4OworICAgICAgYS0+bG93ID0gbG93OworICAgICAgYS0+aGlnaCA9IGhpZ2g7CisKKyAgICAgIGEtPm5leHQgPSBtLT5hcnJheXM7CisgICAgICBtLT5hcnJheXMgPSBhOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFrZSBhIHNldCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfc2V0X3R5cGUgKHAsIGJpdHN0cmluZ3ApCisgICAgIFBUUiBwOworICAgICBib29sZWFuIGJpdHN0cmluZ3A7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgYm9vbGVhbiBsb2NhbHA7CisgIHVuc2lnbmVkIGludCBlbGVpbmR4OworCisgIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOworICBlbGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7CisKKyAgLyogRklYTUU6IFdlIGRvbid0IGtub3cgdGhlIHNpemUsIHNvIHdlIGp1c3QgdXNlIDQuICAqLworCisgIHJldHVybiAoaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgMCwgdHJ1ZSwgbG9jYWxwKQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdzJykKKwkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA0KQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGVsZWluZHgpKTsKK30KKworLyogTWFrZSBhbiBvZmZzZXQgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX29mZnNldF90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworICB1bnNpZ25lZCBpbnQgdGFyZ2V0aW5keCwgYmFzZWluZHg7CisKKyAgdGFyZ2V0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworICBiYXNlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIC8qIEZJWE1FOiBUaGUgTVJJIEMrKyBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgdG8gZ2VuZXJhdGUgYW55CisgICAgIHVzZWZ1bCB0eXBlIGluZm9ybWF0aW9uIGFib3V0IGFuIG9mZnNldCB0eXBlLiAgSXQganVzdCByZWNvcmRzIGEKKyAgICAgcG9pbnRlciB0byBtZW1iZXIgYXMgYW4gaW50ZWdlci4gIFRoZSBNUkkvSFAgSUVFRSBzcGVjIGRvZXMKKyAgICAgZGVzY3JpYmUgYSBwbWlzYyByZWNvcmQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGEgcG9pbnRlciB0bworICAgICBtZW1iZXIuICBVbmZvcnR1bmF0ZWx5LCBpdCBkb2VzIG5vdCBkZXNjcmliZSB0aGUgdGFyZ2V0IHR5cGUsCisgICAgIHdoaWNoIHNlZW1zIHByZXR0eSBpbXBvcnRhbnQuICBJJ20gZ29pbmcgdG8gcHVudCB0aGlzIGZvciBub3cuICAqLworCisgIHJldHVybiBpZWVlX2ludF90eXBlIChwLCA0LCB0cnVlKTsKK30gIAorCisvKiBNYWtlIGEgbWV0aG9kIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9tZXRob2RfdHlwZSAocCwgZG9tYWluLCBhcmdjb3VudCwgdmFyYXJncykKKyAgICAgUFRSIHA7CisgICAgIGJvb2xlYW4gZG9tYWluOworICAgICBpbnQgYXJnY291bnQ7CisgICAgIGJvb2xlYW4gdmFyYXJnczsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworCisgIC8qIEZJWE1FOiBUaGUgTVJJL0hQIElFRUUgc3BlYyBkZWZpbmVzIGEgcG1pc2MgcmVjb3JkIHRvIHVzZSBmb3IgYQorICAgICBtZXRob2QsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpcyBpbmNvbXBsZXRlLiAgV2UganVzdCBvdXRwdXQgYW4gJ3gnCisgICAgIHR5cGUuICAqLworCisgIGlmIChkb21haW4pCisgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOworCisgIHJldHVybiBpZWVlX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKTsKK30KKworLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfY29uc3RfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIGJvb2xlYW4gdW5zaWduZWRwLCBsb2NhbHA7CisgIHVuc2lnbmVkIGludCBpbmR4OworICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKKworICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOworICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKKyAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7CisgIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKworICBpZiAoISBsb2NhbHApCisgICAgeworICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpOworICAgICAgaWYgKG0gPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChtLT5jb25zdF9xdWFsaWZpZWQgPiAwKQorCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+Y29uc3RfcXVhbGlmaWVkLCBzaXplLCB1bnNpZ25lZHAsCisJCQkgICAgICAgZmFsc2UpOworICAgIH0KKworICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICduJykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDEpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgbG9jYWxwKQorICAgIG0tPmNvbnN0X3F1YWxpZmllZCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfdm9sYXRpbGVfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIGJvb2xlYW4gdW5zaWduZWRwLCBsb2NhbHA7CisgIHVuc2lnbmVkIGludCBpbmR4OworICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKKworICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOworICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKKyAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7CisgIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKworICBpZiAoISBsb2NhbHApCisgICAgeworICAgICAgbSA9IGllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpOworICAgICAgaWYgKG0gPT0gTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChtLT52b2xhdGlsZV9xdWFsaWZpZWQgPiAwKQorCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+dm9sYXRpbGVfcXVhbGlmaWVkLCBzaXplLCB1bnNpZ25lZHAsCisJCQkgICAgICAgZmFsc2UpOworICAgIH0KKworICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICduJykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDIpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgbG9jYWxwKQorICAgIG0tPnZvbGF0aWxlX3F1YWxpZmllZCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQ29udmVydCBhbiBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgaW50byBhIENYWEZMQUdTIHZhbHVlLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAoraWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpCisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeworICBzd2l0Y2ggKHZpc2liaWxpdHkpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgorICAgICAgcmV0dXJuIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFVCTElDOworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgorICAgICAgcmV0dXJuIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURTsKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgorICAgICAgcmV0dXJuIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKworLyogU3RhcnQgZGVmaW5pbmcgYSBzdHJ1Y3QgdHlwZS4gIFdlIGJ1aWxkIGl0IGluIHRoZSBzdHJkZWYgZmllbGQgb24KKyAgIHRoZSBzdGFjaywgdG8gYXZvaWQgY29uZnVzaW5nIHR5cGUgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgdGhlCisgICBmaWVsZHMgd2l0aCB0aGUgc3RydWN0IHR5cGUgaXRzZWxmLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICp0YWc7CisgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgYm9vbGVhbiBzdHJ1Y3RwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworICBib29sZWFuIGxvY2FscCwgaWdub3JlcDsKKyAgYm9vbGVhbiBjb3B5OworICBjaGFyIGFiWzIwXTsKKyAgY29uc3QgY2hhciAqbG9vazsKKyAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQsICpudGxvb2s7CisgIHN0cnVjdCBpZWVlX2J1Zmxpc3Qgc3RyZGVmOworCisgIGxvY2FscCA9IGZhbHNlOworICBpZ25vcmVwID0gZmFsc2U7CisKKyAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSB0YWcgZm9yIGludGVybmFsIHVzZSBldmVuIGlmIHdlIGRvbid0IHdhbnQKKyAgICAgb25lIGZvciBleHRlcm5hbCB1c2UuICBUaGlzIHdpbGwgbGV0IHVzIHJlZmVyIHRvIGFuIGFub255bW91cworICAgICBzdHJ1Y3QuICAqLworICBpZiAodGFnICE9IE5VTEwpCisgICAgeworICAgICAgbG9vayA9IHRhZzsKKyAgICAgIGNvcHkgPSBmYWxzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzcHJpbnRmIChhYiwgIl9fYW5vbiV1IiwgaWQpOworICAgICAgbG9vayA9IGFiOworICAgICAgY29weSA9IHRydWU7CisgICAgfQorCisgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSB0YWcsIHdlIG11c3QgdXNlIHRoZQorICAgICBleGlzdGluZyB0eXBlIGluZGV4LiAgKi8KKyAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dGFncywgbG9vaywgdHJ1ZSwgY29weSk7CisgIGlmIChoID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG50ID0gTlVMTDsKKyAgZm9yIChudGxvb2sgPSBoLT50eXBlczsgbnRsb29rICE9IE5VTEw7IG50bG9vayA9IG50bG9vay0+bmV4dCkKKyAgICB7CisgICAgICBpZiAobnRsb29rLT5pZCA9PSBpZCkKKwludCA9IG50bG9vazsKKyAgICAgIGVsc2UgaWYgKCEgbnRsb29rLT50eXBlLmxvY2FscCkKKwl7CisJICAvKiBXZSBhcmUgY3JlYXRpbmcgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBhIGdsb2JhbGx5CisJICAgICBkZWZpbmVkIHRhZy4gIEZvcmNlIGl0IHRvIGJlIGxvY2FsIHRvIGF2b2lkCisJICAgICBjb25mdXNpb24uICAqLworCSAgbG9jYWxwID0gdHJ1ZTsKKwl9CisgICAgfQorCisgIGlmIChudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzc2VydCAobG9jYWxwID09IG50LT50eXBlLmxvY2FscCk7CisgICAgICBpZiAobnQtPmtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMICYmICEgbG9jYWxwKQorCXsKKwkgIC8qIFdlJ3ZlIGFscmVhZHkgc2VlbiBhIGdsb2JhbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLgorICAgICAgICAgICAgIElnbm9yZSB0aGlzIG5ldyBkZWZpbml0aW9uLiAgKi8KKwkgIGlnbm9yZXAgPSB0cnVlOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBudCA9IChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpudCk7CisgICAgICBtZW1zZXQgKG50LCAwLCBzaXplb2YgKm50KTsKKyAgICAgIG50LT5pZCA9IGlkOworICAgICAgbnQtPnR5cGUubmFtZSA9IGgtPnJvb3Quc3RyaW5nOworICAgICAgbnQtPm5leHQgPSBoLT50eXBlczsKKyAgICAgIGgtPnR5cGVzID0gbnQ7CisgICAgICBudC0+dHlwZS5pbmR4ID0gaW5mby0+dHlwZV9pbmR4OworICAgICAgKytpbmZvLT50eXBlX2luZHg7CisgICAgfQorCisgIG50LT5raW5kID0gREVCVUdfS0lORF9JTExFR0FMOworCisgIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZzdHJkZWYpCisgICAgICB8fCAhIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIHRhZywgbnQtPnR5cGUuaW5keCwgc2l6ZSwgdHJ1ZSwKKwkJCQkgICBsb2NhbHAsICZzdHJkZWYpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBzdHJ1Y3RwID8gJ1MnIDogJ1UnKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIGlnbm9yZXApCisgICAgeworICAgICAgY29uc3QgY2hhciAqaG9sZDsKKworICAgICAgLyogV2UgbmV2ZXIgd2FudCBudC0+dHlwZS5uYW1lIHRvIGJlIE5VTEwuICBXZSB3YW50IHRoZSByZXN0IG9mCisJIHRoZSB0eXBlIHRvIGJlIHRoZSBvYmplY3Qgc2V0IHVwIG9uIHRoZSB0eXBlIHN0YWNrOyBpdCB3aWxsCisJIGhhdmUgYSBOVUxMIG5hbWUgaWYgdGFnIGlzIE5VTEwuICAqLworICAgICAgaG9sZCA9IG50LT50eXBlLm5hbWU7CisgICAgICBudC0+dHlwZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGU7CisgICAgICBudC0+dHlwZS5uYW1lID0gaG9sZDsKKyAgICB9CisKKyAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lID0gdGFnOworICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZiA9IHN0cmRlZjsKKyAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pZ25vcmVwID0gaWdub3JlcDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRkIGEgZmllbGQgdG8gYSBzdHJ1Y3QuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9zdHJ1Y3RfZmllbGQgKHAsIG5hbWUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZF92bWEgYml0cG9zOworICAgICBiZmRfdm1hIGJpdHNpemU7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIHVuc2lnbmVkIGludCBzaXplOworICBib29sZWFuIHVuc2lnbmVkcDsKKyAgYm9vbGVhbiByZWZlcmVuY2VwOworICBib29sZWFuIGxvY2FscDsKKyAgdW5zaWduZWQgaW50IGluZHg7CisgIGJmZF92bWEgb2Zmc2V0OworCisgIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCisJICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0ICE9IE5VTEwKKwkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5zdHJkZWYpKTsKKworICAvKiBJZiB3ZSBhcmUgaWdub3JpbmcgdGhpcyBzdHJ1Y3QgZGVmaW5pdGlvbiwganVzdCBwb3AgYW5kIGlnbm9yZQorICAgICB0aGUgdHlwZS4gICovCisgIGlmIChpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLmlnbm9yZXApCisgICAgeworICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7CisgIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOworICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOworICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKKyAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIGlmIChsb2NhbHApCisgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHAgPSB0cnVlOworCisgIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGZsYWdzOworICAgICAgdW5zaWduZWQgaW50IG5pbmR4OworCisgICAgICAvKiBUaGlzIGlzIGEgY2xhc3MuICBXZSBtdXN0IGFkZCBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmllbGQgdG8KKyAgICAgICAgIHRoZSBjbGFzcyByZWNvcmRzIHdlIGFyZSBidWlsZGluZy4gICovCisKKyAgICAgIGZsYWdzID0gaWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpOworICAgICAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAorCQkJCSZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKKwkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnZCcpCisJICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCisJICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKQorCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA0OworCisgICAgICBpZiAocmVmZXJlbmNlcCkKKwl7CisJICB1bnNpZ25lZCBpbnQgbmluZHg7CisKKwkgIC8qIFdlIG5lZWQgdG8gb3V0cHV0IGEgcmVjb3JkIHJlY29yZGluZyB0aGF0IHRoaXMgZmllbGQgaXMKKyAgICAgICAgICAgICByZWFsbHkgb2YgcmVmZXJlbmNlIHR5cGUuICBXZSBwdXQgdGhpcyBvbiB0aGUgcmVmcyBmaWVsZAorICAgICAgICAgICAgIG9mIGNsYXNzZGVmLCBzbyB0aGF0IGl0IGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgQysrCisgICAgICAgICAgICAgcmVjb3JkcyBhZnRlciB0aGUgY2xhc3MgaXMgZGVmaW5lZC4gICovCisKKwkgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OworCSAgKytpbmZvLT5uYW1lX2luZHg7CisKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKKwkJCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCisJICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCisJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA0KQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDMpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBJZiB0aGUgYml0c2l6ZSBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBzaXplLCB3ZSBuZWVkIHRvIG91dHB1dAorICAgICBhIGJpdGZpZWxkIHR5cGUuICAqLworICBpZiAoc2l6ZSA9PSAwIHx8IGJpdHNpemUgPT0gMCB8fCBiaXRzaXplID09IHNpemUgKiA4KQorICAgIG9mZnNldCA9IGJpdHBvcyAvIDg7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCAwLCB1bnNpZ25lZHAsCisJCQkgICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdnJykKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHVuc2lnbmVkcCA/IDAgOiAxKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYml0c2l6ZSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKyAgICAgIG9mZnNldCA9IGJpdHBvczsKKyAgICB9CisKKyAgLyogU3dpdGNoIHRvIHRoZSBzdHJ1Y3Qgd2UgYXJlIGJ1aWxkaW5nIGluIG9yZGVyIHRvIG91dHB1dCB0aGlzCisgICAgIGZpZWxkIGRlZmluaXRpb24uICAqLworICByZXR1cm4gKGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKQorCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgbmFtZSkKKwkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KQorCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG9mZnNldCkpOworfQorCisvKiBGaW5pc2ggdXAgYSBzdHJ1Y3QgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2VuZF9zdHJ1Y3RfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgc3RydWN0IGllZWVfYnVmbGlzdCAqcGI7CisKKyAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKKwkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpKTsKKworICAvKiBJZiB3ZSB3ZXJlIGlnbm9yaW5nIHRoaXMgc3RydWN0IGRlZmluaXRpb24gYmVjYXVzZSBpdCB3YXMgYQorICAgICBkdXBsaWNhdGUgZGVmaW50aW9uLCBqdXN0IHRocm91Z2ggYXdheSB3aGF0ZXZlciBieXRlcyB3ZSBoYXZlCisgICAgIGFjY3VtdWxhdGVkLiAgTGVhdmUgdGhlIHR5cGUgb24gdGhlIHN0YWNrLiAqLworICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5pZ25vcmVwKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIElmIHRoaXMgaXMgbm90IGEgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgdGhpcyB0YWcsIHRoZW4gbG9jYWxwCisgICAgIHdpbGwgYmUgZmFsc2UsIGFuZCB3ZSBjYW4gcHV0IGl0IGluIHRoZSBnbG9iYWwgdHlwZSBibG9jay4KKyAgICAgRklYTUU6IFdlIHNob3VsZCBhdm9pZCBvdXRwdXR0aW5nIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyB3aGljaCBhcmUKKyAgICAgdGhlIHNhbWUuICAqLworICBpZiAoISBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCkKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSBnbG9iYWwgdHlwZSBibG9jay4gICovCisgICAgICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKKwl7CisJICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHBiID0gJmluZm8tPmdsb2JhbF90eXBlczsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSB0eXBlcyBibG9jay4gICovCisgICAgICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQorCXsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5tb2RuYW1lKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHBiID0gJmluZm8tPnR5cGVzOworICAgIH0KKworICAvKiBBcHBlbmQgdGhlIHN0cnVjdCBkZWZpbml0aW9uIHRvIHRoZSB0eXBlcy4gICovCisgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgcGIsICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKKyAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTGVhdmUgdGhlIHN0cnVjdCBvbiB0aGUgdHlwZSBzdGFjay4gICovCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0YXJ0IGEgY2xhc3MgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3N0YXJ0X2NsYXNzX3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUsIHZwdHIsIG93bnZwdHIpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICp0YWc7CisgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgYm9vbGVhbiBzdHJ1Y3RwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB2cHRyOworICAgICBib29sZWFuIG93bnZwdHI7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgY29uc3QgY2hhciAqdmNsYXNzOworICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHBtaXNjYnVmOworICB1bnNpZ25lZCBpbnQgaW5keDsKKyAgc3RydWN0IGllZWVfdHlwZV9jbGFzcyAqY2xhc3NkZWY7CisKKyAgLyogQSBDKysgY2xhc3MgaXMgb3V0cHV0IGFzIGEgQysrIHN0cnVjdCBhbG9uZyB3aXRoIGEgc2V0IG9mIHBtaXNjCisgICAgIHJlY29yZHMgZGVzY3JpYmluZyB0aGUgY2xhc3MuICAqLworCisgIC8qIFdlIG5lZWQgdG8gaGF2ZSBhIG5hbWUgc28gdGhhdCB3ZSBjYW4gYXNzb2NpYXRlIHRoZSBzdHJ1Y3QgYW5kCisgICAgIHRoZSBjbGFzcy4gICovCisgIGlmICh0YWcgPT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICp0OworCisgICAgICB0ID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOworICAgICAgc3ByaW50ZiAodCwgIl9fYW5vbiV1IiwgaWQpOworICAgICAgdGFnID0gdDsKKyAgICB9CisKKyAgLyogV2UgY2FuJ3Qgd3JpdGUgb3V0IHRoZSB2aXJ0dWFsIHRhYmxlIGluZm9ybWF0aW9uIHVudGlsIHdlIGhhdmUKKyAgICAgZmluaXNoZWQgdGhlIGNsYXNzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHZpcnR1YWwgdGFibGUgc2l6ZS4KKyAgICAgV2UgZ2V0IHRoZSBzaXplIGZyb20gdGhlIGxhcmdlc3Qgdm9mZnNldCB3ZSBzZWUuICAqLworICB2Y2xhc3MgPSBOVUxMOworICBpZiAodnB0ciAmJiAhIG93bnZwdHIpCisgICAgeworICAgICAgdmNsYXNzID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lOworICAgICAgYXNzZXJ0ICh2Y2xhc3MgIT0gTlVMTCk7CisgICAgICAvKiBXZSBkb24ndCBjYWxsIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB0aGUgY2xhc3Mgc2hvdWxkCisgICAgICAgICBnZXQgZGVmaW5lZC4gICovCisgICAgICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7CisgICAgfQorCisgIGlmICghIGllZWVfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbmR4ID0gaW5mby0+bmFtZV9pbmR4OworICArK2luZm8tPm5hbWVfaW5keDsKKworICAvKiBXZSB3cml0ZSBvdXQgcG1pc2MgcmVjb3JkcyBpbnRvIHRoZSBjbGFzc2RlZiBmaWVsZC4gIFdlIHdpbGwKKyAgICAgd3JpdGUgb3V0IHRoZSBwbWlzYyBzdGFydCBhZnRlciB3ZSBrbm93IHRoZSBudW1iZXIgb2YgcmVjb3JkcyB3ZQorICAgICBuZWVkLiAgKi8KKyAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJnBtaXNjYnVmKQorICAgICAgfHwgISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZwbWlzY2J1ZikKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsICdUJykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsIHN0cnVjdHAgPyAnbycgOiAndScpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIGluZHgsIHRhZykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNsYXNzZGVmID0gKHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKikgeG1hbGxvYyAoc2l6ZW9mICpjbGFzc2RlZik7CisgIG1lbXNldCAoY2xhc3NkZWYsIDAsIHNpemVvZiAqY2xhc3NkZWYpOworCisgIGNsYXNzZGVmLT5pbmR4ID0gaW5keDsKKyAgY2xhc3NkZWYtPnBtaXNjYnVmID0gcG1pc2NidWY7CisgIGNsYXNzZGVmLT5wbWlzY2NvdW50ID0gMzsKKyAgY2xhc3NkZWYtPnZjbGFzcyA9IHZjbGFzczsKKyAgY2xhc3NkZWYtPm93bnZwdHIgPSBvd252cHRyOworCisgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgPSBjbGFzc2RlZjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byBhIGNsYXNzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfY2xhc3Nfc3RhdGljX21lbWJlciAocCwgbmFtZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IGZsYWdzOworICB1bnNpZ25lZCBpbnQgbmluZHg7CisKKyAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdHlwZS4gIEhvcGVmdWxseSB0aGVyZSB3aWxsIGJlIGEgY2FsbCB0bworICAgICBpZWVlX3ZhcmlhYmxlIGRlY2xhcmluZyB0aGUgcGh5c2ljYWwgbmFtZSBhbmQgdGhlIHR5cGUsIHNpbmNlCisgICAgIHRoYXQgaXMgd2hlcmUgYW4gSUVFRSBjb25zdW1lciBtdXN0IGdldCB0aGUgdHlwZS4gICovCisgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAorCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKTsKKworICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKKyAgZmxhZ3MgfD0gQ1hYRkxBR1NfU1RBVElDOworCisgIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKKworICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnZCcpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgcGh5c25hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA0OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYSBiYXNlIGNsYXNzIHRvIGEgY2xhc3MuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9jbGFzc19iYXNlY2xhc3MgKHAsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKKyAgICAgUFRSIHA7CisgICAgIGJmZF92bWEgYml0cG9zOworICAgICBib29sZWFuIHZpcnR1YWw7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIGNvbnN0IGNoYXIgKmJuYW1lOworICBib29sZWFuIGxvY2FscDsKKyAgdW5zaWduZWQgaW50IGJpbmR4OworICBjaGFyICpmbmFtZTsKKyAgdW5zaWduZWQgaW50IGZsYWdzOworICB1bnNpZ25lZCBpbnQgbmluZHg7CisKKyAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKKwkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSAhPSBOVUxMCisJICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0ICE9IE5VTEwKKwkgICYmIGluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAorCSAgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLnN0cmRlZikpOworCisgIGJuYW1lID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5uYW1lOworICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKKyAgYmluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKworICAvKiBXZSBhcmUgY3VycmVudGx5IGRlZmluaW5nIGJvdGggYSBzdHJ1Y3QgYW5kIGEgY2xhc3MuICBXZSBtdXN0CisgICAgIHdyaXRlIG91dCBhIGZpZWxkIGRlZmluaXRpb24gaW4gdGhlIHN0cnVjdCB3aGljaCBob2xkcyB0aGUgYmFzZQorICAgICBjbGFzcy4gIFRoZSBzdGFicyBkZWJ1Z2dpbmcgcmVhZGVyIHdpbGwgY3JlYXRlIGEgZmllbGQgbmFtZWQKKyAgICAgX3ZiJENMQVNTIGZvciBhIHZpcnR1YWwgYmFzZSBjbGFzcywgc28gd2UganVzdCB1c2UgdGhhdC4gIEZJWE1FOgorICAgICB3ZSBzaG91bGQgbm90IGRlcGVuZCB1cG9uIGEgZGV0YWlsIG9mIHN0YWJzIGRlYnVnZ2luZy4gICovCisgIGlmICh2aXJ0dWFsKQorICAgIHsKKyAgICAgIGZuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChibmFtZSkgKyBzaXplb2YgIl92YiQiKTsKKyAgICAgIHNwcmludGYgKGZuYW1lLCAiX3ZiJCVzIiwgYm5hbWUpOworICAgICAgZmxhZ3MgPSBCQVNFRkxBR1NfVklSVFVBTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobG9jYWxwKQorCWluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwID0gdHJ1ZTsKKworICAgICAgZm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGJuYW1lKSArIHNpemVvZiAiX2IkIik7CisgICAgICBzcHJpbnRmIChmbmFtZSwgIl9iJCVzIiwgYm5hbWUpOworCisgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKKwkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgZm5hbWUpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBiaW5keCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGJpdHBvcyAvIDgpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGZsYWdzID0gMDsKKyAgICB9CisKKyAgaWYgKHZpc2liaWxpdHkgPT0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFKQorICAgIGZsYWdzIHw9IEJBU0VGTEFHU19QUklWQVRFOworCisgIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKKworICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnYicpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBibmFtZSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgZm5hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2Njb3VudCArPSA1OworCisgIGZyZWUgKGZuYW1lKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgYnVpbGRpbmcgYSBtZXRob2QgZm9yIGEgY2xhc3MuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9jbGFzc19zdGFydF9tZXRob2QgKHAsIG5hbWUpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisKKyAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKKwkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAorCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kID09IE5VTEwpOworCisgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9IG5hbWU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERlZmluZSBhIG5ldyBtZXRob2QgdmFyaWFudCwgZWl0aGVyIHN0YXRpYyBvciBub3QuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgc3RhdGljcCwgY29uc3RwLAorCQkgICAgICAgdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KQorICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOworICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKyAgICAgYm9vbGVhbiBzdGF0aWNwOworICAgICBib29sZWFuIGNvbnN0cDsKKyAgICAgYm9vbGVhbiB2b2xhdGlsZXA7CisgICAgIGJmZF92bWEgdm9mZnNldDsKKyAgICAgYm9vbGVhbiBjb250ZXh0OworeworICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisgIHVuc2lnbmVkIGludCBuaW5keDsKKyAgYm9vbGVhbiB2aXJ0dWFsOworCisgIC8qIFdlIGRvbid0IG5lZWQgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZC4gIEFuIElFRUUgY29uc3VtZXIgd2hpY2gKKyAgICAgd2FudHMgdGhlIHR5cGUgbXVzdCB0cmFjayBkb3duIHRoZSBmdW5jdGlvbiBieSB0aGUgcGh5c2ljYWwgbmFtZQorICAgICBhbmQgZ2V0IHRoZSB0eXBlIGZyb20gdGhhdC4gICovCisgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKKworICAvKiBXZSBkb24ndCB1c2UgdGhlIGNvbnRleHQuICBGSVhNRTogV2UgcHJvYmFibHkgb3VnaHQgdG8gdXNlIGl0IHRvCisgICAgIGFkanVzdCB0aGUgdm9mZnNldCBzb21laG93LCBidXQgSSBkb24ndCByZWFsbHkga25vdyBob3cuICAqLworICBpZiAoY29udGV4dCkKKyAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7CisKKyAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKKwkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAorCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kICE9IE5VTEwpOworCisgIGZsYWdzID0gaWVlZV92aXNfdG9fZmxhZ3MgKHZpc2liaWxpdHkpOworCisgIC8qIEZJWE1FOiBXZSBuZXZlciBzZXQgQ1hYRkxBR1NfT1ZFUlJJREUsIENYWEZMQUdTX09QRVJBVE9SLAorICAgICBDWFhGTEFHU19DVE9SRFRPUiwgQ1hYRkxBR1NfQ1RPUiwgb3IgQ1hYRkxBR1NfSU5MSU5FLiAgKi8KKworICBpZiAoc3RhdGljcCkKKyAgICBmbGFncyB8PSBDWFhGTEFHU19TVEFUSUM7CisgIGlmIChjb25zdHApCisgICAgZmxhZ3MgfD0gQ1hYRkxBR1NfQ09OU1Q7CisgIGlmICh2b2xhdGlsZXApCisgICAgZmxhZ3MgfD0gQ1hYRkxBR1NfVk9MQVRJTEU7CisKKyAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OworCisgIHZpcnR1YWwgPSBjb250ZXh0IHx8IHZvZmZzZXQgPiAwOworCisgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKKwkJCSAgICAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdmlydHVhbCA/ICd2JyA6ICdtJykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBmbGFncykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsCisJCQkgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIHBoeXNuYW1lKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHZpcnR1YWwpCisgICAgeworICAgICAgaWYgKHZvZmZzZXQgPiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52b2Zmc2V0KQorCWluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZvZmZzZXQgPSB2b2Zmc2V0OworICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCB2b2Zmc2V0KSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICArK2luZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQ7CisgICAgfQorCisgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRGVmaW5lIGEgbmV3IG1ldGhvZCB2YXJpYW50LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfY2xhc3NfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCwKKwkJCSAgIHZvZmZzZXQsIGNvbnRleHQpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKKyAgICAgYmZkX3ZtYSB2b2Zmc2V0OworICAgICBib29sZWFuIGNvbnRleHQ7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKworICByZXR1cm4gaWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgZmFsc2UsIGNvbnN0cCwKKwkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsIGNvbnRleHQpOworfQorCisvKiBEZWZpbmUgYSBuZXcgc3RhdGljIG1ldGhvZCB2YXJpYW50LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworCisgIHJldHVybiBpZWVlX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCB0cnVlLCBjb25zdHAsCisJCQkJdm9sYXRpbGVwLCAwLCBmYWxzZSk7Cit9CisKKy8qIEZpbmlzaCB1cCBhIG1ldGhvZC4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2NsYXNzX2VuZF9tZXRob2QgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisKKyAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKKwkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTAorCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+bWV0aG9kICE9IE5VTEwpOworCisgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfZW5kX2NsYXNzX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIHVuc2lnbmVkIGludCBuaW5keDsKKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAorCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKTsKKworICAvKiBJZiB3ZSB3ZXJlIGlnbm9yaW5nIHRoaXMgY2xhc3MgZGVmaW5pdGlvbiBiZWNhdXNlIGl0IHdhcyBhCisgICAgIGR1cGxpY2F0ZSBkZWZpbml0aW9uLCBqdXN0IHRocm91Z2ggYXdheSB3aGF0ZXZlciBieXRlcyB3ZSBoYXZlCisgICAgIGFjY3VtdWxhdGVkLiAgTGVhdmUgdGhlIHR5cGUgb24gdGhlIHN0YWNrLiAgKi8KKyAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7CisKKyAgLyogSWYgd2UgaGF2ZSBhIHZpcnR1YWwgdGFibGUsIHdlIGNhbiB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIG5vdy4gICovCisgIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52Y2xhc3MgIT0gTlVMTAorICAgICAgfHwgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+b3dudnB0cikKKyAgICB7CisgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCisJCQkJJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQorCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICd6JykKKwkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsICIiKQorCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsCisJCQkgICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dm9mZnNldCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm93bnZwdHIpCisJeworCSAgaWYgKCEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsICIiKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwKKwkJCQkgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZjbGFzcykpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKKyAgICB9CisKKyAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgbnVtYmVyIG9mIHBtaXNjIHJlY29yZHMsIHdlIGNhbiB3cml0ZSBvdXQKKyAgICAgdGhlIGF0bjYyIHdoaWNoIHN0YXJ0cyB0aGUgcG1pc2MgcmVjb3JkcywgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZQorICAgICBDKysgYnVmZmVycy4gICovCisKKyAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQorICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCisgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQorICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywKKwkJCSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgsCisJCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCwKKwkJCQkmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cmVmcykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gaWVlZV9lbmRfc3RydWN0X3R5cGUgKHApOworfQorCisvKiBQdXNoIGEgcHJldmlvdXNseSBzZWVuIHR5cGVkZWYgb250byB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3R5cGVkZWZfdHlwZSAocCwgbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7CisKKyAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dHlwZWRlZnMsIG5hbWUsIGZhbHNlLCBmYWxzZSk7CisKKyAgLyogaCBzaG91bGQgbmV2ZXIgYmUgTlVMTCwgc2luY2UgdGhhdCB3b3VsZCBpbXBseSB0aGF0IHRoZSBnZW5lcmljCisgICAgIGRlYnVnZ2luZyBjb2RlIGhhcyBhc2tlZCBmb3IgYSB0eXBlZGVmIHdoaWNoIGl0IGhhcyBub3QgeWV0CisgICAgIGRlZmluZWQuICAqLworICBhc3NlcnQgKGggIT0gTlVMTCk7CisKKyAgLyogV2UgYWx3YXlzIHVzZSB0aGUgbW9zdCByZWNlbnRseSBkZWZpbmVkIHR5cGUgZm9yIHRoaXMgbmFtZSwgd2hpY2gKKyAgICAgd2lsbCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBsaXN0LiAgKi8KKworICBudCA9IGgtPnR5cGVzOworICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbnQtPnR5cGUuaW5keCwgbnQtPnR5cGUuc2l6ZSwKKwkJCW50LT50eXBlLnVuc2lnbmVkcCwgbnQtPnR5cGUubG9jYWxwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogQ29weSBvdmVyIGFueSBvdGhlciB0eXBlIGluZm9ybWF0aW9uIHdlIG1heSBoYXZlLiAgKi8KKyAgaW5mby0+dHlwZV9zdGFjay0+dHlwZSA9IG50LT50eXBlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQdXNoIGEgdGFnZ2VkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3RhZ190eXBlIChwLCBuYW1lLCBpZCwga2luZCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworICBib29sZWFuIGxvY2FscDsKKyAgYm9vbGVhbiBjb3B5OworICBjaGFyIGFiWzIwXTsKKyAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7CisKKyAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9FTlVNKQorICAgIHsKKyAgICAgIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlhYm9ydCAoKTsKKyAgICAgIGZvciAoZSA9IGluZm8tPmVudW1zOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQorCWlmIChlLT50YWcgIT0gTlVMTCAmJiBzdHJjbXAgKGUtPnRhZywgbmFtZSkgPT0gMCkKKwkgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICBlID0gKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOworICAgICAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOworCisgICAgICBlLT5pbmR4ID0gaW5mby0+dHlwZV9pbmR4OworICAgICAgKytpbmZvLT50eXBlX2luZHg7CisgICAgICBlLT50YWcgPSBuYW1lOworICAgICAgZS0+ZGVmaW5lZCA9IGZhbHNlOworCisgICAgICBlLT5uZXh0ID0gaW5mby0+ZW51bXM7CisgICAgICBpbmZvLT5lbnVtcyA9IGU7CisKKyAgICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICBsb2NhbHAgPSBmYWxzZTsKKworICBjb3B5ID0gZmFsc2U7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgeworICAgICAgc3ByaW50ZiAoYWIsICJfX2Fub24ldSIsIGlkKTsKKyAgICAgIG5hbWUgPSBhYjsKKyAgICAgIGNvcHkgPSB0cnVlOworICAgIH0KKworICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50YWdzLCBuYW1lLCB0cnVlLCBjb3B5KTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChudC0+aWQgPT0gaWQpCisJeworCSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIG50LT50eXBlLnNpemUsCisJCQkJbnQtPnR5cGUudW5zaWduZWRwLCBudC0+dHlwZS5sb2NhbHApKQorCSAgICByZXR1cm4gZmFsc2U7CisJICAvKiBDb3B5IG92ZXIgYW55IG90aGVyIHR5cGUgaW5mb3JtYXRpb24gd2UgbWF5IGhhdmUuICAqLworCSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZSA9IG50LT50eXBlOworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBpZiAoISBudC0+dHlwZS5sb2NhbHApCisJeworCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiBhIGdsb2JhbCB0eXBlLCBzbyBpdCBtdXN0IGJlCisgICAgICAgICAgICAgbG9jYWwuICovCisJICBsb2NhbHAgPSB0cnVlOworCX0KKyAgICB9CisKKyAgbnQgPSAoc3RydWN0IGllZWVfbmFtZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbnQpOworICBtZW1zZXQgKG50LCAwLCBzaXplb2YgKm50KTsKKworICBudC0+aWQgPSBpZDsKKyAgbnQtPnR5cGUubmFtZSA9IGgtPnJvb3Quc3RyaW5nOworICBudC0+dHlwZS5pbmR4ID0gaW5mby0+dHlwZV9pbmR4OworICBudC0+dHlwZS5sb2NhbHAgPSBsb2NhbHA7CisgICsraW5mby0+dHlwZV9pbmR4OworICBudC0+a2luZCA9IGtpbmQ7CisKKyAgbnQtPm5leHQgPSBoLT50eXBlczsKKyAgaC0+dHlwZXMgPSBudDsKKworICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbnQtPnR5cGUuaW5keCwgMCwgZmFsc2UsIGxvY2FscCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSA9IGgtPnJvb3Quc3RyaW5nOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBPdXRwdXQgYSB0eXBlZGVmLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfdHlwZGVmIChwLCBuYW1lKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworICBzdHJ1Y3QgaWVlZV93cml0ZV90eXBlIHR5cGU7CisgIHVuc2lnbmVkIGludCBpbmR4OworICBib29sZWFuIGZvdW5kOworICBib29sZWFuIGxvY2FscDsKKyAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7CisKKyAgdHlwZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGU7CisgIGluZHggPSB0eXBlLmluZHg7CisKKyAgLyogSWYgdGhpcyBpcyBhIHNpbXBsZSBidWlsdGluIHR5cGUgdXNpbmcgYSBidWlsdGluIG5hbWUsIHdlIGRvbid0CisgICAgIHdhbnQgdG8gb3V0cHV0IHRoZSB0eXBlZGVmIGl0c2VsZi4gIFdlIGFsc28gd2FudCB0byBjaGFuZ2UgdGhlCisgICAgIHR5cGUgaW5kZXggdG8gY29ycmVzcG9uZCB0byB0aGUgbmFtZSBiZWluZyB1c2VkLiAgV2UgcmVjb2duaXplCisgICAgIG5hbWVzIHVzZWQgaW4gc3RhYnMgZGVidWdnaW5nIG91dHB1dCBldmVuIGlmIHRoZXkgZG9uJ3QgZXhhY3RseQorICAgICBjb3JyZXNwb25kIHRvIHRoZSBuYW1lcyB1c2VkIGZvciB0aGUgSUVFRSBidWlsdGluIHR5cGVzLiAgKi8KKyAgZm91bmQgPSBmYWxzZTsKKyAgaWYgKGluZHggPD0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9iY2RfZmxvYXQpCisgICAgeworICAgICAgc3dpdGNoICgoZW51bSBidWlsdGluX3R5cGVzKSBpbmR4KQorCXsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisKKwljYXNlIGJ1aWx0aW5fdm9pZDoKKwkgIGlmIChzdHJjbXAgKG5hbWUsICJ2b2lkIikgPT0gMCkKKwkgICAgZm91bmQgPSB0cnVlOworCSAgYnJlYWs7CisKKwljYXNlIGJ1aWx0aW5fc2lnbmVkX2NoYXI6CisJY2FzZSBidWlsdGluX2NoYXI6CisJICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIGNoYXIiKSA9PSAwKQorCSAgICB7CisJICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2lnbmVkX2NoYXI7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJjaGFyIikgPT0gMCkKKwkgICAgeworCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX2NoYXI7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9jaGFyOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGNoYXIiKSA9PSAwKQorCSAgICBmb3VuZCA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OgorCWNhc2UgYnVpbHRpbl9zaG9ydDoKKwljYXNlIGJ1aWx0aW5fc2hvcnRfaW50OgorCWNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnQ6CisJICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIHNob3J0IGludCIpID09IDApCisJICAgIHsKKwkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OworCSAgICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2hvcnQiKSA9PSAwKQorCSAgICB7CisJICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2hvcnQ7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJzaG9ydCBpbnQiKSA9PSAwKQorCSAgICB7CisJICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2hvcnRfaW50OworCSAgICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIHNob3J0IikgPT0gMCkKKwkgICAgeworCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3NpZ25lZF9zaG9ydDsKKwkgICAgICBmb3VuZCA9IHRydWU7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludDoKKwljYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ6CisJICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgc2hvcnQgaW50IikgPT0gMAorCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgInNob3J0IHVuc2lnbmVkIGludCIpID09IDApCisJICAgIHsKKwkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQ7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBzaG9ydCIpID09IDApCisJICAgIHsKKwkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9zaG9ydDsKKwkgICAgICBmb3VuZCA9IHRydWU7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBidWlsdGluX3NpZ25lZF9sb25nOgorCWNhc2UgYnVpbHRpbl9pbnQ6IC8qIEZJWE1FOiBTaXplIGRlcGVuZHMgdXBvbiBhcmNoaXRlY3R1cmUuICAqLworCWNhc2UgYnVpbHRpbl9sb25nOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBsb25nIikgPT0gMCkKKwkgICAgeworCSAgICAgIGluZHggPSBidWlsdGluX3NpZ25lZF9sb25nOworCSAgICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiaW50IikgPT0gMCkKKwkgICAgeworCSAgICAgIGluZHggPSBidWlsdGluX2ludDsKKwkgICAgICBmb3VuZCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImxvbmciKSA9PSAwCisJCSAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgaW50IikgPT0gMCkKKwkgICAgeworCSAgICAgIGluZHggPSBidWlsdGluX2xvbmc7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nOgorCWNhc2UgYnVpbHRpbl91bnNpZ25lZDogLyogRklYTUU6IFNpemUgZGVwZW5kcyB1cG9uIGFyY2hpdGVjdHVyZS4gICovCisJY2FzZSBidWlsdGluX3Vuc2lnbmVkX2ludDogLyogRklYTUU6IExpa2UgYnVpbHRpbl91bnNpZ25lZC4gICovCisJICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgbG9uZyIpID09IDAKKwkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIHVuc2lnbmVkIGludCIpID09IDApCisJICAgIHsKKwkgICAgICBpbmR4ID0gYnVpbHRpbl91bnNpZ25lZF9sb25nOworCSAgICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQiKSA9PSAwKQorCSAgICB7CisJICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWQ7CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBpbnQiKSA9PSAwKQorCSAgICB7CisJICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfaW50OworCSAgICAgIGZvdW5kID0gdHJ1ZTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZzoKKwkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgbG9uZyBsb25nIikgPT0gMAorCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyBpbnQiKSA9PSAwKQorCSAgICBmb3VuZCA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmc6CisJICBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgbG9uZyBsb25nIikgPT0gMAorCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKSA9PSAwKQorCSAgICBmb3VuZCA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgYnVpbHRpbl9mbG9hdDoKKwkgIGlmIChzdHJjbXAgKG5hbWUsICJmbG9hdCIpID09IDApCisJICAgIGZvdW5kID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBidWlsdGluX2RvdWJsZToKKwkgIGlmIChzdHJjbXAgKG5hbWUsICJkb3VibGUiKSA9PSAwKQorCSAgICBmb3VuZCA9IHRydWU7CisJICBicmVhazsKKworCWNhc2UgYnVpbHRpbl9sb25nX2RvdWJsZToKKwkgIGlmIChzdHJjbXAgKG5hbWUsICJsb25nIGRvdWJsZSIpID09IDApCisJICAgIGZvdW5kID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU6CisJICBpZiAoc3RyY21wIChuYW1lLCAibG9uZyBsb25nIGRvdWJsZSIpID09IDApCisJICAgIGZvdW5kID0gdHJ1ZTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKGZvdW5kKQorCXR5cGUuaW5keCA9IGluZHg7CisgICAgfQorCisgIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZzLCBuYW1lLCB0cnVlLCBmYWxzZSk7CisgIGlmIChoID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgZGVmaW5lZCB0aGlzIHR5cGUgd2l0aCB0aGlzIG5hbWUuICAqLworICBsb2NhbHAgPSB0eXBlLmxvY2FscDsKKyAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChudC0+aWQgPT0gaW5keCkKKwl7CisJICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIGRlZmluaXRpb24sIHRoZW4gd2UgZG9uJ3QgbmVlZCB0bworCSAgICAgZG8gYW55dGhpbmcgaGVyZS4gICovCisJICBpZiAoISBudC0+dHlwZS5sb2NhbHApCisJICAgIHsKKwkgICAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uLCBzbyBtYWtlIHRoaXMgb25lIGxvY2FsLiAgKi8KKwkgIGxvY2FscCA9IHRydWU7CisJfQorICAgIH0KKworICAvKiBXZSBuZWVkIHRvIGFkZCBhIG5ldyB0eXBlZGVmIGZvciB0aGlzIHR5cGUuICAqLworCisgIG50ID0gKHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm50KTsKKyAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7CisgIG50LT5pZCA9IGluZHg7CisgIG50LT50eXBlID0gdHlwZTsKKyAgbnQtPnR5cGUubmFtZSA9IG5hbWU7CisgIG50LT50eXBlLmxvY2FscCA9IGxvY2FscDsKKyAgbnQtPmtpbmQgPSBERUJVR19LSU5EX0lMTEVHQUw7CisKKyAgbnQtPm5leHQgPSBoLT50eXBlczsKKyAgaC0+dHlwZXMgPSBudDsKKworICBpZiAoZm91bmQpCisgICAgeworICAgICAgLyogVGhpcyBpcyBvbmUgb2YgdGhlIGJ1aWx0aW4gdHlwZWRlZnMsIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgIGFjdHVhbGx5IGRlZmluZSBpdC4gICovCisgICAgICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIGlmICghIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIG5hbWUsICh1bnNpZ25lZCBpbnQpIC0xLCB0eXBlLnNpemUsCisJCQkJdHlwZS51bnNpZ25lZHAsCWxvY2FscCwKKwkJCQkoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgJ1QnKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFJlbW92ZSB0aGUgdHlwZSB3ZSBqdXN0IGFkZGVkIHRvIHRoZSB0eXBlIHN0YWNrLiAgVGhpcyBzaG91bGQgbm90CisgICAgIGJlIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB0aGUgdHlwZSBpcyB1c2VkLCB3ZSBqdXN0IGRvbid0CisgICAgIG5lZWQgaXQgbm93LiAgKi8KKyAgKHZvaWQpIGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBPdXRwdXQgYSB0YWcgZm9yIGEgdHlwZS4gIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgaGVyZS4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3RhZyAocCwgbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKworICAvKiBUaGlzIHNob3VsZCBub3QgYmUgaWVlZV9wb3BfdW51c2VkX3R5cGUsIHNpbmNlIHdlIHdhbnQgdGhlIHR5cGUKKyAgICAgdG8gYmUgZGVmaW5lZC4gICovCisgICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgLyogRklYTUUuICAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogT3V0cHV0IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9mbG9hdF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgZG91YmxlIHZhbDsKK3sKKyAgLyogRklYTUUuICAqLworICByZXR1cm4gdHJ1ZTsKK30KKworLyogT3V0cHV0IGEgdHlwZWQgY29uc3RhbnQuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKworICAvKiBGSVhNRS4gICovCisgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhIHZhcmlhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2llZWVfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIGJvb2xlYW4gcmVmZXJlbmNlcDsKKyAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKKyAgYm9vbGVhbiBhc247CisgIGludCByZWZmbGFnOworCisgIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7CisgIHJlZmVyZW5jZXAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXA7CisgIHR5cGVfaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIGFzc2VydCAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSk7CisgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBuYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7CisgICsraW5mby0+bmFtZV9pbmR4OworCisgIC8qIFdyaXRlIG91dCBhbiBOTiBhbmQgYW4gQVROIHJlY29yZCBmb3IgdGhpcyB2YXJpYWJsZS4gICovCisgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCisgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCisgICAgICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5hbWVfaW5keCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHR5cGVfaW5keCkpCisgICAgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGtpbmQpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIERFQlVHX0dMT0JBTDoKKyAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4KQorCSAgfHwgISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIHZhbCwgdmFsICsgc2l6ZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgcmVmZmxhZyA9IDA7CisgICAgICBhc24gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUJVR19TVEFUSUM6CisgICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKKwkgIHx8ICEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCB2YWwsIHZhbCArIHNpemUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJlZmZsYWcgPSAxOworICAgICAgYXNuID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgorICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCisJICB8fCAhIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgdmFsLCB2YWwgKyBzaXplKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICByZWZmbGFnID0gMjsKKyAgICAgIGFzbiA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX0xPQ0FMOgorICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDEpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB2YWwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJlZmZsYWcgPSAyOworICAgICAgYXNuID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX1JFR0lTVEVSOgorICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDIpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLAorCQkJCSAgaWVlZV9nZW5yZWdfdG9fcmVnbm8gKGluZm8tPmFiZmQsIHZhbCkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJlZmZsYWcgPSAyOworICAgICAgYXNuID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGFzbikKKyAgICB7CisgICAgICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmFtZV9pbmR4LCB2YWwpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyByZWFsbHkgYSByZWZlcmVuY2UgdHlwZSwgdGhlbiB3ZSBqdXN0IG91dHB1dCBpdCB3aXRoCisgICAgIHBvaW50ZXIgdHlwZSwgYW5kIG11c3Qgbm93IG91dHB1dCBhIEMrKyByZWNvcmQgaW5kaWNhdGluZyB0aGF0IGl0CisgICAgIGlzIHJlYWxseSByZWZlcmVuY2UgdHlwZS4gICovCisgIGlmIChyZWZlcmVuY2VwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBuaW5keDsKKworICAgICAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7CisgICAgICArK2luZm8tPm5hbWVfaW5keDsKKworICAgICAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZSwgd2Ugd2FudCB0byBvdXRwdXQgdGhlIG1pc2MKKyAgICAgICAgIHJlY29yZCBpbiB0aGUgQysrIG1pc2MgcmVjb3JkIGJsb2NrLiAgT3RoZXJ3aXNlLCB3ZSB3YW50IHRvCisgICAgICAgICBvdXRwdXQgaXQganVzdCBhZnRlciB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbiwgd2hpY2ggaXMgd2hlcmUKKyAgICAgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBpcy4gICovCisgICAgICBpZiAocmVmZmxhZyAhPSAyKQorCXsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKKwkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCisJICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQorCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdSJykKKwkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCByZWZmbGFnKQorCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgb3V0cHV0dGluZyBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWwpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBib29sZWFuIGdsb2JhbDsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworICBib29sZWFuIHJlZmVyZW5jZXA7CisgIHVuc2lnbmVkIGludCByZXRpbmR4LCB0eXBlaW5keDsKKworICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOworICByZXRpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7CisKKyAgLyogQmVzaWRlcyByZWNvcmRpbmcgYSBCQjQgb3IgQkI2IGJsb2NrLCB3ZSByZWNvcmQgdGhlIHR5cGUgb2YgdGhlCisgICAgIGZ1bmN0aW9uIGluIHRoZSBCQjEgdHlwZWRlZiBibG9jay4gIFdlIGNhbid0IHdyaXRlIG91dCB0aGUgZnVsbAorICAgICB0eXBlIHVudGlsIHdlIGhhdmUgc2VlbiBhbGwgdGhlIHBhcmFtZXRlcnMsIHNvIHdlIGFjY3VtdWxhdGUgaXQKKyAgICAgaW4gaW5mby0+Zm50eXBlIGFuZCBpbmZvLT5mbmFyZ3MuICAqLworICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5mbnR5cGUpKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBUaGlzIG1pZ2h0IGhhcHBlbiBzb21lZGF5IGlmIHdlIHN1cHBvcnQgbmVzdGVkCisgICAgICAgICBmdW5jdGlvbnMuICAqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGluZm8tPmZubmFtZSA9IG5hbWU7CisKKyAgLyogQW4gYXR0cmlidXRlIG9mIDB4NDAgbWVhbnMgdGhhdCB0aGUgcHVzaCBtYXNrIGlzIHVua25vd24uICAqLworICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCAodW5zaWduZWQgaW50KSAtMSwgMCwgZmFsc2UsIHRydWUsCisJCQkJJmluZm8tPmZudHlwZSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICd4JykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDB4NDApCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHJldGluZHgpKQorICAgIHJldHVybiBmYWxzZTsKKworICB0eXBlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOworCisgIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaW5mby0+Zm5hcmdjb3VudCA9IDA7CisKKyAgLyogSWYgdGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBpcyBhY3R1YWxseSBhIHJlZmVyZW5jZSB0eXBlLCB3ZQorICAgICBtdXN0IGFkZCBhIHJlY29yZCBpbmRpY2F0aW5nIHRoYXQuICAqLworICBpZiAocmVmZXJlbmNlcCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbmluZHg7CisKKyAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OworICAgICAgKytpbmZvLT5uYW1lX2luZHg7CisgICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKKwkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCisJICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQorCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdSJykKKwkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCBnbG9iYWwgPyAwIDogMSkKKwkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgYXNzZXJ0ICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKTsKKyAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFRoZSBhZGRyZXNzIGlzIHdyaXR0ZW4gb3V0IGFzIHRoZSBmaXJzdCBibG9jay4gICovCisKKyAgKytpbmZvLT5ibG9ja19kZXB0aDsKKworICByZXR1cm4gKGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKwkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgZ2xvYmFsID8gNCA6IDYpCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCisJICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB0eXBlaW5keCkpOworfQorCisvKiBBZGQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgY2FsbGVkIGJlZm9yZSB0aGUKKyAgIGZpcnN0IGJsb2NrLCBzbyB3ZSBwb3N0cG9uZSB0aGVtIHVudGlsIHdlIHNlZSB0aGUgYmxvY2suICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7CisgICAgIGJmZF92bWEgdmFsOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisgIHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqbSwgKipwbTsKKworICBhc3NlcnQgKGluZm8tPmJsb2NrX2RlcHRoID09IDEpOworCisgIG0gPSAoc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICopIHhtYWxsb2MgKHNpemVvZiAqbSk7CisgIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKKworICBtLT5uZXh0ID0gTlVMTDsKKyAgbS0+bmFtZSA9IG5hbWU7CisgIG0tPnJlZmVyZW5jZXAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXA7CisgIG0tPnR5cGUgPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKKyAgbS0+a2luZCA9IGtpbmQ7CisgIG0tPnZhbCA9IHZhbDsKKworICBmb3IgKHBtID0gJmluZm8tPnBlbmRpbmdfcGFybXM7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKKyAgICA7CisgICpwbSA9IG07CisKKyAgLyogQWRkIHRoZSB0eXBlIHRvIHRoZSBmbmFyZ3MgbGlzdC4gICovCisgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG0tPnR5cGUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgKytpbmZvLT5mbmFyZ2NvdW50OworCisgIHJldHVybiB0cnVlOyAgCit9CisKKy8qIE91dHB1dCBwZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyAoaW5mbykKKyAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOworeworICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm07CisgIHVuc2lnbmVkIGludCByZWZjb3VudDsKKworICByZWZjb3VudCA9IDA7CisgIGZvciAobSA9IGluZm8tPnBlbmRpbmdfcGFybXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCisgICAgeworICAgICAgZW51bSBkZWJ1Z192YXJfa2luZCB2a2luZDsKKworICAgICAgc3dpdGNoIChtLT5raW5kKQorCXsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJICByZXR1cm4gZmFsc2U7CisJY2FzZSBERUJVR19QQVJNX1NUQUNLOgorCWNhc2UgREVCVUdfUEFSTV9SRUZFUkVOQ0U6CisJICB2a2luZCA9IERFQlVHX0xPQ0FMOworCSAgYnJlYWs7CisJY2FzZSBERUJVR19QQVJNX1JFRzoKKwljYXNlIERFQlVHX1BBUk1fUkVGX1JFRzoKKwkgIHZraW5kID0gREVCVUdfUkVHSVNURVI7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBtLT50eXBlLCAwLCBmYWxzZSwgZmFsc2UpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcCA9IG0tPnJlZmVyZW5jZXA7CisgICAgICBpZiAobS0+cmVmZXJlbmNlcCkKKwkrK3JlZmNvdW50OworICAgICAgaWYgKCEgaWVlZV92YXJpYWJsZSAoKFBUUikgaW5mbywgbS0+bmFtZSwgdmtpbmQsIG0tPnZhbCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBJZiB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZSBwYXJhbWV0ZXJzLCB3ZSBuZWVkIHRvIG91dHB1dCBhCisgICAgIG1pc2NlbGxhbmVvdXMgcmVjb3JkIGluZGljYXRpbmcgdGhlbS4gICovCisgIGlmIChyZWZjb3VudCA+IDApCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG5pbmR4LCB2YXJpbmR4OworCisgICAgICAvKiBGSVhNRTogVGhlIE1SSSBjb21waWxlciBvdXRwdXRzIHRoZSBkZW1hbmdsZWQgZnVuY3Rpb24gbmFtZQorICAgICAgICAgaGVyZSwgYnV0IHdlIGFyZSBvdXRwdXR0aW5nIHRoZSBtYW5nbGVkIG5hbWUuICAqLworICAgICAgbmluZHggPSBpbmZvLT5uYW1lX2luZHg7CisgICAgICArK2luZm8tPm5hbWVfaW5keDsKKyAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKKwkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCisJICB8fCAhIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDYyKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZWZjb3VudCArIDMpCisJICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ0InKQorCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgaW5mby0+Zm5uYW1lKQorCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGZvciAobSA9IGluZm8tPnBlbmRpbmdfcGFybXMsIHZhcmluZHggPSAxOworCSAgIG0gIT0gTlVMTDsKKwkgICBtID0gbS0+bmV4dCwgdmFyaW5keCsrKQorCXsKKwkgIGlmIChtLT5yZWZlcmVuY2VwKQorCSAgICB7CisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCB2YXJpbmR4KSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICBtID0gaW5mby0+cGVuZGluZ19wYXJtczsKKyAgd2hpbGUgKG0gIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm5leHQ7CisKKyAgICAgIG5leHQgPSBtLT5uZXh0OworICAgICAgZnJlZSAobSk7CisgICAgICBtID0gbmV4dDsKKyAgICB9CisKKyAgaW5mby0+cGVuZGluZ19wYXJtcyA9IE5VTEw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0YXJ0IGEgYmxvY2suICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaywgd2Ugb3V0cHV0IHRoZSBhZGRyZXNzCisgICB0byBmaW5pc2ggdGhlIEJCNCBvciBCQjYsIGFuZCB0aGVuIG91dHB1dCB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQorICAgICBQVFIgcDsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7CisKKyAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKQorICAgIHsKKyAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhZGRyKQorCSAgfHwgISBpZWVlX291dHB1dF9wZW5kaW5nX3Bhcm1zIChpbmZvKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDYpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYWRkcikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBpZWVlX3N0YXJ0X3JhbmdlIChpbmZvLCBhZGRyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKytpbmZvLT5ibG9ja19kZXB0aDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRW5kIGEgYmxvY2suICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9lbmRfYmxvY2sgKHAsIGFkZHIpCisgICAgIFBUUiBwOworICAgICBiZmRfdm1hIGFkZHI7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKworICAvKiBUaGUgYWRkcmVzcyB3ZSBhcmUgZ2l2ZW4gaXMgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGJ1dCBJRUVFIHNlZW1zCisgICAgIHRvIHdhbnQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgYmxvY2ssIHNvIHdlCisgICAgIHN1YnRyYWN0IG9uZS4gICovCisgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCisgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKKyAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFkZHIgLSAxKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgaWVlZV9lbmRfcmFuZ2UgKGluZm8sIGFkZHIpKQorICAgIHJldHVybiBmYWxzZTsKKworICAtLWluZm8tPmJsb2NrX2RlcHRoOworCisgIGlmIChhZGRyID4gaW5mby0+aGlnaGFkZHIpCisgICAgaW5mby0+aGlnaGFkZHIgPSBhZGRyOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBFbmQgYSBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitpZWVlX2VuZF9mdW5jdGlvbiAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKKworICBhc3NlcnQgKGluZm8tPmJsb2NrX2RlcHRoID09IDEpOworCisgIC0taW5mby0+YmxvY2tfZGVwdGg7CisKKyAgLyogTm93IHdlIGNhbiBmaW5pc2ggdXAgZm50eXBlLCBhbmQgYWRkIGl0IHRvIHRoZSB0eXBkZWYgc2VjdGlvbi4KKyAgICAgQXQgdGhpcyBwb2ludCwgZm50eXBlIGlzIHRoZSAneCcgdHlwZSB1cCB0byB0aGUgYXJndW1lbnQgY291bnQsCisgICAgIGFuZCBmbmFyZ3MgaXMgdGhlIGFyZ3VtZW50IHR5cGVzLiAgV2UgbXVzdCBhZGQgdGhlIGFyZ3VtZW50CisgICAgIGNvdW50LCBhbmQgd2UgbXVzdCBhZGQgdGhlIGxldmVsLiAgRklYTUU6IFdlIGRvbid0IHJlY29yZCB2YXJhcmdzCisgICAgIGZ1bmN0aW9ucyBjb3JyZWN0bHkuICBJbiBmYWN0LCBzdGFicyBkZWJ1Z2dpbmcgZG9lcyBub3QgZ2l2ZSB1cworICAgICBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZG8gc28uICAqLworICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbnR5cGUpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5mbmFyZ2NvdW50KQorICAgICAgfHwgISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpCisgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogTWFrZSBzdXJlIHRoZSB0eXBkZWYgYmxvY2sgaGFzIGJlZW4gc3RhcnRlZC4gICovCisgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlcykpCisgICAgeworICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCisJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcywgJmluZm8tPmZudHlwZSkKKyAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMsICZpbmZvLT5mbmFyZ3MpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbmZvLT5mbm5hbWUgPSBOVUxMOworICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm50eXBlKQorICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGluZm8tPmZuYXJnY291bnQgPSAwOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWNvcmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgoraWVlZV9saW5lbm8gKHAsIGZpbGVuYW1lLCBsaW5lbm8sIGFkZHIpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOworCisgIGFzc2VydCAoaW5mby0+ZmlsZW5hbWUgIT0gTlVMTCk7CisKKyAgLyogVGhlIEhQIHNpbXVsYXRvciBzZWVtcyB0byBnZXQgY29uZnVzZWQgd2hlbiBtb3JlIHRoYW4gb25lIGxpbmUgaXMKKyAgICAgbGlzdGVkIGZvciB0aGUgc2FtZSBhZGRyZXNzLCBhdCBsZWFzdCBpZiB0aGV5IGFyZSBpbiBkaWZmZXJlbnQKKyAgICAgZmlsZXMuICBXZSBoYW5kbGUgdGhpcyBieSBhbHdheXMgbGlzdGluZyB0aGUgbGFzdCBsaW5lIGZvciBhCisgICAgIGdpdmVuIGFkZHJlc3MsIHNpbmNlIHRoYXQgc2VlbXMgdG8gYmUgdGhlIG9uZSB0aGF0IGdkYiB1c2VzLiAgKi8KKyAgaWYgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lICE9IE5VTEwKKyAgICAgICYmIGFkZHIgIT0gaW5mby0+cGVuZGluZ19saW5lbm9fYWRkcikKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGxpbmUgbnVtYmVyIGJsb2NrLiAgKi8KKyAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmxpbmVub3MpKQorCXsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7CisJICArK2luZm8tPm5hbWVfaW5keDsKKwkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCisJICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDUpCisJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPmZpbGVuYW1lKQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKKwkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQorCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKKwl9CisKKyAgICAgIGlmIChzdHJjbXAgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCisJeworCSAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFdlIHdlcmUgbm90IGluIHRoZSBtYWluIGZpbGUuICBDbG9zZSB0aGUgYmxvY2sgZm9yIHRoZQorCQkgaW5jbHVkZWQgZmlsZS4gICovCisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSkgPT0gMCkKKwkJeworCQkgIC8qIFdlIG5lZWQgYSBuZXcgTk4gcmVjb3JkLCBhbmQgd2UgYXJlbid0IGFib3V0IHRvCisJCSAgICAgb3V0cHV0IG9uZS4gICovCisJCSAgaW5mby0+bGluZW5vX25hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKKwkJICArK2luZm8tPm5hbWVfaW5keDsKKwkJICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQorCQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQorCQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisJICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpICE9IDApCisJICAgIHsKKwkgICAgICAvKiBXZSBhcmUgbm90IGNoYW5naW5nIHRvIHRoZSBtYWluIGZpbGUuICBPcGVuIGEgYmxvY2sgZm9yCisJCSB0aGUgbmV3IGluY2x1ZGVkIGZpbGUuICAqLworCSAgICAgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7CisJICAgICAgKytpbmZvLT5uYW1lX2luZHg7CisJICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQorCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA1KQorCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCisJCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSkKKwkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCisJCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKKwkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZTsKKwl9CisKKyAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCisJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNykKKwkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPnBlbmRpbmdfbGluZW5vKQorCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKKwkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgsCisJCQkgICAgICAgaW5mby0+cGVuZGluZ19saW5lbm9fYWRkcikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSA9IGZpbGVuYW1lOworICBpbmZvLT5wZW5kaW5nX2xpbmVubyA9IGxpbmVubzsKKyAgaW5mby0+cGVuZGluZ19saW5lbm9fYWRkciA9IGFkZHI7CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9pcy1yYW5saWIuYyBiL2JpbnV0aWxzL2lzLXJhbmxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTcyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9pcy1yYW5saWIuYwpAQCAtMCwwICsxLDMgQEAKKy8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAncmFubGliJyAobm90ICdhcicpLiAqLworCitpbnQgaXNfcmFubGliID0gMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2lzLXN0cmlwLmMgYi9iaW51dGlscy9pcy1zdHJpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTM0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9pcy1zdHJpcC5jCkBAIC0wLDAgKzEsNCBAQAorLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ3N0cmlwJyAobm90CisgICAnb2JqY29weScpLiAqLworCitpbnQgaXNfc3RyaXAgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIgYi9iaW51dGlscy9tYWMtYmludXRpbHMucgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFhMzAzCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIKQEAgLTAsMCArMSw0MiBAQAorLyogUmVzb3VyY2VzIGZvciBHTlUgYmludXRpbHMuICovCisKKyNpbmNsdWRlICJTeXNUeXBlcy5yIgorCisvKiBWZXJzaW9uIHJlc291cmNlcy4gKi8KKworcmVzb3VyY2UgJ3ZlcnMnICgxKSAgeworCTAsCisJMCwKKwkwLAorCTAsCisJdmVyVXMsCisJVkVSU0lPTl9TVFJJTkcsCisJVkVSU0lPTl9TVFJJTkcgICIgKEMpIDE5ODYtOTUgRlNGLCBJbmMuIgorfTsKKworcmVzb3VyY2UgJ3ZlcnMnICgyLCBwdXJnZWFibGUpICB7CisJMCwKKwkwLAorCTAsCisJMCwKKwl2ZXJVcywKKwlWRVJTSU9OX1NUUklORywKKwkiYmludXRpbHMgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCit9OworCisjaWZkZWYgV0FOVF9DRlJHCisKKyNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgorCityZXNvdXJjZSAnY2ZyZycgKDApIHsKKwl7CisJCWtQb3dlclBDLAorCQlrRnVsbExpYiwKKwkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKKwkJMCwwLAorCQlrSXNBcHAsIGtPbkRpc2tGbGF0LCBrWmVyb09mZnNldCwga1dob2xlRm9yaywKKwkJUFJPR19OQU1FCisJfQorfTsKKworI2VuZGlmIC8qIFdBTlRfQ0ZSRyAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWFrZWZpbGUudm1zLWluIGIvYmludXRpbHMvbWFrZWZpbGUudm1zLWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDlkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9tYWtlZmlsZS52bXMtaW4KQEAgLTAsMCArMSw5OCBAQAorIworIyBNYWtlZmlsZSBmb3IgYmludXRpbHMgdW5kZXIgb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKKyMKKyMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKKyMKKyMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcm1pLmRlCisjCisjCisKKyMgRGlzdHJpYnV0aW9uIHZlcnNpb24sIGZpbGxlZCBpbiBieSBjb25maWd1cmUuY29tCitWRVJTSU9OPUBWRVJTSU9OQAorCitpZmVxICgkKEFSQ0gpLEFMUEhBKQorVEFSR0VUPSIidm1zLWFscGhhIiIKK2Vsc2UKK1RBUkdFVD0iInZtcy12YXgiIgorZW5kaWYKKworaWZlcSAoJChDQyksZ2NjKQorQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUykKK0RFRlM9L2RlZmluZT0oIlRBUkdFVD0kKFRBUkdFVCkiKQorTElCUz0sZ251X2NjX2xpYnJhcnk6bGliZ2NjL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliLGdudV9jY19saWJyYXJ5OmNydDAub2JqCitlbHNlCitDRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKVwKKy93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxsb25nZXh0ZXJuKQorREVGUz0vZGVmaW5lPSgiVEFSR0VUPSQoVEFSR0VUKSIsImNvbnN0PSIsInVubGluaz1yZW1vdmUiKQorTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgorZW5kaWYKKworQkZETElCID0gWy0uYmZkXWxpYmJmZC5vbGIvbGliCitCRkRMSUJfREVQID0gWy0uYmZkXWxpYmJmZC5vbGIKK0xJQklCRVJUWV9ERVAgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYgorTElCSUJFUlRZID0gWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGIvbGliCitPUENPREVTX0RFUCA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIKK09QQ09ERVMgPSBbLS5vcGNvZGVzXWxpYm9wY29kZXMub2xiL2xpYgorCitERUJVR19PQkpTID0gcmRkYmcub2JqLGRlYnVnLm9iaixzdGFicy5vYmosaWVlZS5vYmoscmRjb2ZmLm9iagorCitXUklURV9ERUJVR19PQkpTID0gJChERUJVR19PQkpTKSx3cnN0YWJzLm9iagorCitCVUxJQlMgPSBbXWJ1Y29tbS5vYmosdmVyc2lvbi5vYmosZmlsZW1vZGUub2JqCisKK0FERExfREVQUyA9ICQoQlVMSUJTKSwkKEJGRExJQl9ERVApLCQoTElCSUJFUlRZX0RFUCkKK0FERExfTElCUyA9ICQoQlVMSUJTKSwkKEJGRExJQiksJChMSUJJQkVSVFkpCisKK1NJWkVPQkpTID0gJChBRERMX0RFUFMpLHNpemUub2JqCisKK1NUUklOR1NPQkpTID0gJChBRERMX0RFUFMpLHN0cmluZ3Mub2JqCisKK05NT0JKUyA9ICQoQURETF9ERVBTKSxubS5vYmoKKworT0JKRFVNUE9CSlMgPSAkKEFERExfREVQUyksb2JqZHVtcC5vYmoscHJkYmcub2JqLCQoREVCVUdfT0JKUyksJChPUENPREVTX0RFUCkKKworYWxsOiBjb25maWcuaCBzaXplLmV4ZSBzdHJpbmdzLmV4ZSBvYmpkdW1wLmV4ZSBubS5leGUKKworc2l6ZS5leGU6ICQoU0laRU9CSlMpCisJbGluay9leGU9JEAgc2l6ZS5vYmosJChBRERMX0xJQlMpJChMSUJTKQorCitzdHJpbmdzLmV4ZTogJChTVFJJTkdTT0JKUykKKwlsaW5rL2V4ZT0kQCBzdHJpbmdzLm9iaiwkKEFERExfTElCUykkKExJQlMpCisKK25tLmV4ZTogJChOTU9CSlMpCisJbGluay9leGU9JEAgbm0ub2JqLCQoQURETF9MSUJTKSQoTElCUykKKworb2JqZHVtcC5leGU6ICQoT0JKRFVNUE9CSlMpCisJbGluay9leGU9JEAgb2JqZHVtcC5vYmoscHJkYmcub2JqLCQoREVCVUdfT0JKUyksJChCRkRMSUIpLCQoT1BDT0RFUyksJChBRERMX0xJQlMpJChMSUJTKQorCisKK3ZlcnNpb24ub2JqOiB2ZXJzaW9uLmMKKwkkKENDKSAkKENGTEFHUykvZGVmaW5lPShWRVJTSU9OPSIiIiQoVkVSU0lPTikiIiIpICQ8CisKK2NvbmZpZy5oOgorCSQkIEBjb25maWd1cmUKKwkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCisKK1stLmJmZF1saWJiZmQub2xiOgorCSQoQ0QpIFstLmJmZF0KKwkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCisJJChDRCkgWy0uYmludXRpbHNdCisKK1stLmxpYmliZXJ0eV1saWJpYmVydHkub2xiOgorCSQoQ0QpIFstLmxpYmliZXJ0eV0KKwkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCisJJChDRCkgWy0uYmludXRpbHNdCisKK1stLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGI6CisJJChDRCkgWy0ub3Bjb2Rlc10KKwkkKE1BS0UpIC1mIG1ha2VmaWxlLnZtcyAiQ0M9JChDQykiCisJJChDRCkgWy0uYmludXRpbHNdCisKK2NsZWFuOgorCSQkIHB1cmdlCisJJChSTSkgKi5vYmo7CisJJChSTSkgKi5leGU7CisKK2Rpc3RjbGVhbjogY2xlYW4KKwkkKFJNKSBjb25maWcuaDsKKwkkKFJNKSBtYWtlZmlsZS52bXM7CmRpZmYgLS1naXQgYS9iaW51dGlscy9tYXliZS1yYW5saWIuYyBiL2JpbnV0aWxzL21heWJlLXJhbmxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2JjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9tYXliZS1yYW5saWIuYwpAQCAtMCwwICsxLDQgQEAKKy8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBkZWNpZGVzIGF0IHJ1bnRpbWUKKyAgICh1c2luZyBhcmd2WzBdIGlmIGl0IGlzIGlzICdhcicgb3IgJ3JhbmxpYicuICovCisKK2ludCBpc19yYW5saWIgPSAtMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMgYi9iaW51dGlscy9tYXliZS1zdHJpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjdjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9tYXliZS1zdHJpcC5jCkBAIC0wLDAgKzEsNCBAQAorLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gZGVjaWRlcyBhdCBydW50aW1lCisgICAodXNpbmcgYXJndlswXSBpZiBpdCBpcyBpcyAnc3RyaXAnIG9yICdvYmpjb3B5Jy4gKi8KKworaW50IGlzX3N0cmlwID0gLTE7CmRpZmYgLS1naXQgYS9iaW51dGlscy9tcHctY29uZmlnLmluIGIvYmludXRpbHMvbXB3LWNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWEwNjdkCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvbXB3LWNvbmZpZy5pbgpAQCAtMCwwICsxLDI3IEBACisjIENvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIGJpbnV0aWxzLgorCitTZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKKworIyAoc2hvdWxkIGNhbm9uaWNhbGl6ZSBhcmNoIG5hbWUpICovCisKK1NldCBhcmNobmFtZSBBUkNIX3t0YXJnZXRfYXJjaH0KKworU2V0IHVuZGVyc2NvcmUgMAorCitJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtaGl0YWNoaS1obXMvCisJU2V0IHVuZGVyc2NvcmUgMQorRW5kIElmCisKK0VjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAorRWNobyAiQVJDSERFRlMgPSAtZCIge2FyY2huYW1lfQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiVU5ERVJTQ09SRSA9ICIge3VuZGVyc2NvcmV9CQkJPj4gIntvfSJtay50bXAKK0VjaG8gIkJVSUxEX05MTUNPTlYgPSAiCQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiQlVJTERfU1JDT05WID0gIgkJCQkJPj4gIntvfSJtay50bXAKK0VjaG8gIlNZU0lORk9fUFJPRyA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICJCVUlMRF9ETExUT09MID0gIgkJCQkJPj4gIntvfSJtay50bXAKK0VjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKKworRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKK0VjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKKworTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCmRpZmYgLS1naXQgYS9iaW51dGlscy9tcHctbWFrZS5zZWQgYi9iaW51dGlscy9tcHctbWFrZS5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhYmZmZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL21wdy1tYWtlLnNlZApAQCAtMCwwICsxLDExNSBAQAorIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBiaW51dGlscyBVbml4IG1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KKworIyBBZGQgYSBydWxlLgorL14jIyMjIC4qL2FcCitcCisie299InVuZGVyc2NvcmUuYy5vIFxcT3B0aW9uLWYgIntvfSJ1bmRlcnNjb3JlLmNcCisKKyMgQ29tbWVudCBvdXQgYW55IGFsaWFzIHNldHRpbmdzLgorL15ob3N0X2FsaWFzID0vcy9eLyMvCisvXnRhcmdldF9hbGlhcyA9L3MvXi8jLworCisjIFdoYWNrIG91dCB1bnVzZWQgaG9zdCBkZWZpbmUgYml0cy4KKy9IREVGSU5FUy9zL0BIREVGSU5FU0AvLworCisjIERvbid0IGJ1aWxkIHNwZWNpYWxpemVkIHRvb2xzLgorL0JVSUxEX05MTUNPTlYvcy9AQlVJTERfTkxNQ09OVkAvLworL0JVSUxEX1NSQ09OVi9zL0BCVUlMRF9TUkNPTlZALy8KKy9CVUlMRF9ETExUT09ML3MvQEJVSUxEX0RMTFRPT0xALy8KKworL1VOREVSU0NPUkUvcy9AVU5ERVJTQ09SRUAve1VOREVSU0NPUkV9LworCisjIERvbid0IG5lZWQgdGhpcy4KKy9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCisKKyMgUG9pbnQgYXQgdGhlIGxpYnJhcmllcyBkaXJlY3RseS4KKy9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLworL0BPUENPREVTQC9zL0BPUENPREVTQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLworCisjIFdoYWNrIG91dCB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQuCisvdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50L3MvdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC8vCisKKyMgRml4IGFuZCBhZGQgdG8gdGhlIGluY2x1ZGUgcGF0aHMuCisvXklOQ0xVREVTID0gLiokL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCisvQkZERElSL3MvLWkge0JGRERJUn0gLy1pICJ7QkZERElSfSI6IC8KKy9JTkNESVIvcy8taSB7SU5DRElSfSAvLWkgIntJTkNESVJ9IjogLworCisjIFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uIChmb3Igbm93IGFueXdheSkuCisvQklTT04vcy9eQklTT04gPS4qJC9CSVNPTiA9IGJ5YWNjLworIy9CSVNPTkZMQUdTL3MvXkJJU09ORkxBR1MgPS4qJC9CSVNPTkZMQUdTID0gLworCisjIEVtYmVkIHRoZSB2ZXJzaW9uIGluIHN5bWJvbGljIGRvdWJsZXF1b3RlcyB0aGF0IHdpbGwgZXhwYW5kIHRvCisjIHRoZSByaWdodCB0aGluZyBmb3IgZWFjaCBjb21waWxlci4KKy9WRVJTSU9OL3MvJyJ7VkVSU0lPTn0iJy97ZHF9e1ZFUlNJT059e2RxfS8KKworIyAnKycgaXMgYSBzcGVjaWFsIGNoYXIgdG8gTVBXLCBkb24ndCB1c2UgaXQgZXZlci4KKy9jKytmaWx0L3MvYysrZmlsdC9jcGx1c2ZpbHQvCisKKyMgQWxsIG9mIHRoZSBiaW51dGlscyB1c2UgdGhlIHNhbWUgUmV6IGZpbGUsIGNoYW5nZSBuYW1lcyB0byByZWZlciB0byBpdC4KKy9ee1tBLVpdKl9QUk9HfS9zLyQvICJ7c30ibWFjLWJpbnV0aWxzLnIvCisve1tBLVpdKl9QUk9HfVwuci9zL3tbQS1aXSpfUFJPR31cLnIvbWFjLWJpbnV0aWxzLnIvCisKKyMgVGhlcmUgYXJlIGF1dG8tZ2VuZXJhdGVkIHJlZmVyZW5jZXMgdG8gQkZEIC5oIGZpbGVzIHRoYXQgYXJlIG5vdAorIyBpbiB0aGUgb2JqZGlyIChsaWtlIGJmZC5oKSBidXQgYXJlIGluIHRoZSBzb3VyY2UgZGlyLgorLzo6YmZkOmxpYi9zLzo6YmZkOmxpYlwoW2Etel0qXClcLmgve0JGRERJUn06bGliXDEuaC9nCisKKyMgRml4IHRoZSBsb2NhdGlvbnMgb2YgZ2VuZXJhdGVkIGZpbGVzLgorL2NvbmZpZy9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZworL2NvbmZpZy9zL15jb25maWdcLmgvIntvfSJjb25maWdcLmgvCisvdW5kZXJzY29yZS9zLyJ7c30idW5kZXJzY29yZVwuYy8ie299InVuZGVyc2NvcmUuYy9nCisvdW5kZXJzY29yZS9zL151bmRlcnNjb3JlXC5jLyJ7b30idW5kZXJzY29yZVwuYy8KKworIyBGaXggcGF0aHMgdG8gZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KKy9sZXgueXkuYy9zLyJ7c30ibGV4XC55eVwuYy8ie299ImxleC55eS5jL2cKKy9sZXgueXkuYy9zL15sZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvCisvYXJsZXguYy9zLyJ7c30iYXJsZXhcLmMvIntvfSJhcmxleC5jL2cKKy9hcmxleC5jL3MvXmFybGV4XC5jLyJ7b30iYXJsZXguYy8KKy95LnRhYi5jL3MvIntzfSJ5XC50YWJcLmMvIntvfSJ5LnRhYi5jL2cKKy95LnRhYi5jL3MvXnlcLnRhYlwuYy8ie299InkudGFiLmMvCisvYXJwYXJzZS5jL3MvIntzfSJhcnBhcnNlXC5jLyJ7b30iYXJwYXJzZS5jL2cKKy9hcnBhcnNlLmMvcy9eYXJwYXJzZVwuYy8ie299ImFycGFyc2UuYy8KKy95LnRhYi5oL3MvIntzfSJ5XC50YWJcLmgvIntvfSJ5LnRhYi5oL2cKKy95LnRhYi5oL3MvXnlcLnRhYlwuaC8ie299InkudGFiLmgvCisvYXJwYXJzZS5oL3MvIntzfSJhcnBhcnNlXC5oLyJ7b30iYXJwYXJzZS5oL2cKKy9hcnBhcnNlLmgvcy9eYXJwYXJzZVwuaC8ie299ImFycGFyc2UuaC8KKworLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZworCisjIFRoZSBnZW5lcmF0ZWQgbGV4ZXIgbWF5IGluY2x1ZGUgYW4gaWZkZWYgZm9yIG9sZGVyIE1hYyBjb21waWxlcnMgdGhhdAorIyBuZWVkcyB0byB3b3JrIHdpdGggbmV3ZXIgY29tcGlsZXJzIGFsc28uCisvbGV4Lnl5LmMvcy9SZW5hbWUgLXkgXChbXiBdKlwpIFwoW14gXSpcKSQvc2VkIC1lICdzLGlmZGVmIG1hY2ludG9zaCxpZiBkZWZpbmVkKG1hY2ludG9zaCkgfHwgZGVmaW5lZChfX01XRVJLU19fKSwnIFwxID4gXDIvCisKKyMgRml4IGFuIG92ZXItZWFnZXJuZXNzLgorL2VjaG8uKldBUk5JTkcuKlRoaXMgZmlsZS9zLycuKicvJyAnLworCisjIEFkZCBhICJzdGFtcHMiIHRhcmdldC4KKyRhXAorc3RhbXBzIFxcT3B0aW9uLWYgc3RhbXAtdW5kZXJcCisKKy9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCitpbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCitcCitpbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKKwlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKKwkjIE5lZWQgdG8gY29weSBhbGwgdGhlIHRvb2xzXAorCUZvciBwcm9nIGluIHtQUk9HU31cCisJCVNldCBwcm9nbmFtZSBgZWNobyB7cHJvZ30gfCBzZWQgLWUgJ3MvLm5ldy8vJ2BcCisJCUR1cGxpY2F0ZSAteSA6e3Byb2d9ICJ7YmluZGlyfSJ7cHJvZ25hbWV9XAorCUVuZCBGb3JcCisKKworL3RydWUvcy8gOyBAdHJ1ZSQvLworCisjIGRvdCBmaWxlcyBhcmUgdHJvdWJsZSwgcmVtb3ZlIHRoZW0gYW5kIHRoZWlyIGFjdGlvbnMuCisvXlwuZGVwLywvXiQvZAorCisjIFJlbW92ZSB1bi11c2VmdWwgdGFyZ2V0cy4KKy9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKKy9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAorL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCisKKyMgRG9uJ3QgdHJ5IHRvIG1ha2UgdGhlIGRlbWFuZ2xlcidzIG1hbiBwYWdlLCBpdCdzIHVzZWxlc3MuCisvXntERU1BTkdMRVJfUFJPR31cLjEgXFxPcHRpb24tZi8sL14kL2QKKyMgRG9uJ3QgZGVwZW5kIG9uIGl0IGVpdGhlci4KKy97REVNQU5HTEVSX1BST0d9L3MvIHtERU1BTkdMRVJfUFJPR31cLjEvLworCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LjEgYi9iaW51dGlscy9ubG1jb252LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjM2FlZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL25sbWNvbnYuMQpAQCAtMCwwICsxLDExMCBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5NiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisuXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KKy5USCBubG1jb252IDEgIk1hcmNoIDE5OTYiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKKy5kZSBCUAorLnNwCisudGkgXC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCitubG1jb252IFwtIGNvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCisKKy5TSCBTWU5PUFNJUworLmh5IDAKKy5uYQorLlRQCisuQiBubG1jb252CisuUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZCXCB8XCBcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAorLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmQlwgfFwgXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCisuUkIgIltcfCIgXC1UXCBcZkloZWFkZXJmaWxlXGZCXCB8XCBcLVwtaGVhZGVyXC1maWxlPVxmSWhlYWRlcmZpbGVcZlIgIlx8XSIgCisuUkIgIltcfCIgXC1WXCB8XCBcLVwtdmVyc2lvblxmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLVwtaGVscFxmUiAiXHxdIiAKKy5CIGluZmlsZQorLkIgb3V0ZmlsZQorLlNIIERFU0NSSVBUSU9OCisuQiBubG1jb252Citjb252ZXJ0cyB0aGUgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUgCisuQiBpbmZpbGUKK2ludG8gdGhlIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlIAorLkJSIG91dGZpbGUgLAorb3B0aW9uYWxseSByZWFkaW5nIAorLkkgaGVhZGVyZmlsZQorZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHdyaXRpbmcgdGhlIE5MTQorY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgCisuSVIgIlRoZSBOZXRXYXJlIFRvb2wgTWFrZXIgU3BlY2lmaWNhdGlvbiBNYW51YWwiICwKK2F2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgorLkIgbmxtY29udgorY3VycmVudGx5IHdvcmtzIHdpdGggaTM4NiBvYmplY3QgZmlsZXMgaW4gCisuQlIgQ09GRiAsCisuQlIgRUxGICwKK29yCisuQiBhLm91dAorZm9ybWF0LCBhbmQgd2l0aCBTUEFSQyBvYmplY3QgZmlsZXMgaW4KKy5CIEVMRgorb3IKKy5CIGEub3V0Citmb3JtYXQuCisuYnIKKy5CIG5sbWNvbnYKK3VzZXMgdGhlIEdOVSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkgdG8gcmVhZCAKKy5JUiBpbmZpbGUgLgorLlNIIE9QVElPTlMKKy5UUAorLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKK0NvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCisuSVIgYmZkbmFtZSAsCityYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KKy5UUAorLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCitXcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCisuSVIgYmZkbmFtZSAuCisuQiBubG1jb252CitpbmZlcnMgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGZvcm1hdCwgZS5nLiBmb3IgYW4gaTM4NgoraW5wdXQgZmlsZSB0aGUgb3V0cHV0IGZvcm1hdCBpcworLklSIG5sbTMyXC1pMzg2IC4KKy5UUAorLkIgXC1UIFxmSWhlYWRlcmZpbGVcZlIsIFxmQlwtXC1oZWFkZXJcLWZpbGU9XGZJaGVhZGVyZmlsZQorUmVhZHMgCisuSSBoZWFkZXJmaWxlCitmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMgb24gd3JpdGluZyB0aGUgTkxNCitjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZSAKKy5JUiAiVGhlIE5ldFdhcmUgVG9vbCBNYWtlciBTcGVjaWZpY2F0aW9uIE1hbnVhbCIgLAorYXZhaWxhYmxlIGZyb20gTm92ZWxsLCBJbmMuCisuVFAKKy5CIFwtVlxmUiwgXGZCXC1cLXZlcnNpb24KK1Nob3cgdGhlIHZlcnNpb24gbnVtYmVyIG9mCisuQiBubG1jb252CithbmQgZXhpdC4KKy5UUAorLkIgXC1oXGZSLCBcZkJcLVwtaGVscAorU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KKy5CIG5sbWNvbnYKK2FuZCBleGl0LgorLlNIICJTRUUgQUxTTyIKKy5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKK2VudHJ5IGluIAorLkIKK2luZm9cYworXCY7IAorLkkKK1RoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCitcJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgorCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LmMgYi9iaW51dGlscy9ubG1jb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjOGI2YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL25sbWNvbnYuYwpAQCAtMCwwICsxLDIyMTIgQEAKKy8qIG5sbWNvbnYuYyAtLSBOTE0gY29udmVyc2lvbiBwcm9ncmFtCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworICAgVGhpcyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYW55IGFwcHJvcHJpYXRlIG9iamVjdCBmaWxlCisgICBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUgKGFuIE5MTSkuICBJdCB3aWxsIGFjY2VwdCBhIGxpbmtlcgorICAgc3BlY2lmaWNhdGlvbiBmaWxlIHdoaWNoIGlzIGlkZW50aWNhbCB0byB0aGF0IGFjY2VwdGVkIGJ5IHRoZQorICAgTmV0V2FyZSBsaW5rZXIsIE5MTUxJTksuICAqLworCisvKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLworI2lmbmRlZiBfX0dOVUNfXworIyBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisvKiBJbnRlcm5hbCBCRkQgTkxNIGhlYWRlci4gICovCisjaW5jbHVkZSAibGlibmxtLmgiCisjaW5jbHVkZSAibmxtY29udi5oIgorCisjaWZkZWYgTkxNQ09OVl9BTFBIQQorI2luY2x1ZGUgImNvZmYvc3ltLmgiCisjaW5jbHVkZSAiY29mZi9lY29mZi5oIgorI2VuZGlmCisKKy8qIElmIHN0cmVycm9yIGlzIGp1c3QgYSBtYWNybywgd2Ugd2FudCB0byB1c2UgdGhlIG9uZSBmcm9tIGxpYmliZXJ0eQorICAgc2luY2UgaXQgd2lsbCBoYW5kbGUgdW5kZWZpbmVkIHZhbHVlcy4gICovCisjdW5kZWYgc3RyZXJyb3IKK2V4dGVybiBjaGFyICpzdHJlcnJvciAoKTsKKworI2lmbmRlZiBsb2NhbHRpbWUKK2V4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZSAoKTsKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCisjZGVmaW5lIFNFRUtfU0VUIDAKKyNlbmRpZgorCisjaWZuZGVmIFJfT0sKKyNkZWZpbmUgUl9PSyA0CisjZGVmaW5lIFdfT0sgMgorI2RlZmluZSBYX09LIDEKKyNlbmRpZgorDAorLyogR2xvYmFsIHZhcmlhYmxlcy4gICovCisKKy8qIFRoZSBuYW1lIHVzZWQgdG8gaW52b2tlIHRoZSBwcm9ncmFtLiAgKi8KK2NoYXIgKnByb2dyYW1fbmFtZTsKKworLyogTG9jYWwgdmFyaWFibGVzLiAgKi8KKworLyogV2hldGhlciB0byBwcmludCBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIChjdXJyZW50bHkganVzdCBjb250cm9scworICAgd2hldGhlciBpdCBwcmludHMgdGhlIGxpbmtlciBjb21tYW5kIGlmIHRoZXJlIGlzIG9uZSkuICAqLworc3RhdGljIGludCBkZWJ1ZzsKKworLyogVGhlIHN5bWJvbCB0YWJsZS4gICovCitzdGF0aWMgYXN5bWJvbCAqKnN5bWJvbHM7CisKKy8qIEEgc2VjdGlvbiB3ZSBjcmVhdGUgaW4gdGhlIG91dHB1dCBmaWxlIHRvIGhvbGQgcG9pbnRlcnMgdG8gd2hlcmUKKyAgIHRoZSBzZWN0aW9ucyBvZiB0aGUgaW5wdXQgZmlsZSBlbmQgdXAuICBXZSB3aWxsIHB1dCBhIHBvaW50ZXIgdG8KKyAgIHRoaXMgc2VjdGlvbiBpbiB0aGUgTkxNIGhlYWRlci4gIFRoZXNlIGlzIGFuIGVudHJ5IGZvciBlYWNoIGlucHV0CisgICBzZWN0aW9uLiAgVGhlIGZvcm1hdCBpcworICAgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKKyAgICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQorICAgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCisgICAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQorICAgV2UgZG9uJ3QgbmVlZCBhIHZlcnNpb24gbnVtYmVyLiAgVGhlIHdheSB3ZSBmaW5kIHRoaXMgaW5mb3JtYXRpb24KKyAgIGlzIGJ5IGZpbmRpbmcgYSBzdGFtcCBpbiB0aGUgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIElmIHdlIG5lZWQgdG8KKyAgIGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoaXMgaW5mb3JtYXRpb24sIHdlIGNhbiBzaW1wbHkgY2hhbmdlIHRoZQorICAgc3RhbXAuICAqLworc3RhdGljIGFzZWN0aW9uICpzZWNzZWM7CisKKy8qIEEgdGVtcG9yYXJ5IGZpbGUgbmFtZSB0byBiZSB1bmxpbmtlZCBvbiBleGl0LiAgQWN0dWFsbHksIGZvciBtb3N0CisgICBlcnJvcnMsIHdlIGxlYXZlIGl0IGFyb3VuZC4gIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgdGhhdCBpcyBoZWxwZnVsCisgICBvciBub3QuICAqLworc3RhdGljIGNoYXIgKnVubGlua19vbl9leGl0OworCisvKiBUaGUgbGlzdCBvZiBsb25nIG9wdGlvbnMuICAqLworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQoreworICB7ICJkZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZCcgfSwKKyAgeyAiaGVhZGVyLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1QnIH0sCisgIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCisgIHsgImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSScgfSwKKyAgeyAiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LCAvKiBPYnNvbGV0ZSAqLworICB7ICJsaW5rZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2wnIH0sCisgIHsgIm91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nIH0sCisgIHsgIm91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nIH0sIC8qIE9ic29sZXRlICovCisgIHsgInZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnIH0sCisgIHsgTlVMTCwgbm9fYXJndW1lbnQsIDAsIDAgfQorfTsKKworLyogTG9jYWwgcm91dGluZXMuICAqLworCitzdGF0aWMgdm9pZCBzaG93X2hlbHAgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOworc3RhdGljIGNvbnN0IGNoYXIgKnNlbGVjdF9vdXRwdXRfZm9ybWF0IFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKKwkJCQkJCSB1bnNpZ25lZCBsb25nLCBib29sZWFuKSk7CitzdGF0aWMgdm9pZCBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb3B5X3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIG1hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAorCQkJCSAgIGxvbmcgKiwgY2hhciAqLAorCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyB2b2lkIGRlZmF1bHRfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCisJCQkJCSAgIGxvbmcgKiwgY2hhciAqLAorCQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7CitzdGF0aWMgY2hhciAqbGlua19pbnB1dHMgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosIGNoYXIgKikpOworCisjaWZkZWYgTkxNQ09OVl9JMzg2CitzdGF0aWMgdm9pZCBpMzg2X21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAorCQkJCQlsb25nICosIGNoYXIgKiwKKwkJCQkJYmZkX3NpemVfdHlwZSkpOworI2VuZGlmCisKKyNpZmRlZiBOTE1DT05WX0FMUEhBCitzdGF0aWMgdm9pZCBhbHBoYV9tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKKwkJCQkJIGxvbmcgKiwgY2hhciAqLAorCQkJCQkgYmZkX3NpemVfdHlwZSkpOworI2VuZGlmCisKKyNpZmRlZiBOTE1DT05WX1BPV0VSUEMKK3N0YXRpYyB2b2lkIHBvd2VycGNfYnVpbGRfc3R1YnMgUEFSQU1TICgoYmZkICosIGJmZCAqLCBhc3ltYm9sICoqKiwgbG9uZyAqKSk7CitzdGF0aWMgdm9pZCBwb3dlcnBjX3Jlc29sdmVfc3R1YnMgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgdm9pZCBwb3dlcnBjX21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAorCQkJCQkgICBsb25nICosIGNoYXIgKiwKKwkJCQkJICAgYmZkX3NpemVfdHlwZSkpOworI2VuZGlmCisMCisvKiBUaGUgbWFpbiByb3V0aW5lLiAgKi8KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBvcHQ7CisgIGNoYXIgKmlucHV0X2ZpbGUgPSBOVUxMOworICBjb25zdCBjaGFyICppbnB1dF9mb3JtYXQgPSBOVUxMOworICBjb25zdCBjaGFyICpvdXRwdXRfZm9ybWF0ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqaGVhZGVyX2ZpbGUgPSBOVUxMOworICBjaGFyICpsZF9hcmcgPSBOVUxMOworICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyIGZpeGVkX2hkcl9zdHJ1Y3Q7CisgIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgdmFyX2hkcl9zdHJ1Y3Q7CisgIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciB2ZXJzaW9uX2hkcl9zdHJ1Y3Q7CisgIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIGNvcHlyaWdodF9oZHJfc3RydWN0OworICBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIGV4dGVuZGVkX2hkcl9zdHJ1Y3Q7CisgIGJmZCAqaW5iZmQ7CisgIGJmZCAqb3V0YmZkOworICBhc3ltYm9sICoqbmV3c3ltcywgKipvdXRzeW1zOworICBsb25nIHN5bWNvdW50LCBuZXdzeW1hbGxvYywgbmV3c3ltY291bnQ7CisgIGxvbmcgc3ltc2l6ZTsKKyAgYXNlY3Rpb24gKnRleHRfc2VjLCAqYnNzX3NlYywgKmRhdGFfc2VjOworICBiZmRfdm1hIHZtYTsKKyAgYmZkX3NpemVfdHlwZSBhbGlnbjsKKyAgYXN5bWJvbCAqZW5kc3ltOworICBsb25nIGk7CisgIGNoYXIgaW5sZWFkLCBvdXRsZWFkOworICBib29sZWFuIGdvdHN0YXJ0LCBnb3RleGl0LCBnb3RjaGVjazsKKyAgc3RydWN0IHN0YXQgc3Q7CisgIEZJTEUgKmN1c3RvbV9kYXRhID0gTlVMTDsKKyAgRklMRSAqaGVscF9kYXRhID0gTlVMTDsKKyAgRklMRSAqbWVzc2FnZV9kYXRhID0gTlVMTDsKKyAgRklMRSAqcnBjX2RhdGEgPSBOVUxMOworICBGSUxFICpzaGFyZWRfZGF0YSA9IE5VTEw7CisgIHNpemVfdCBjdXN0b21fc2l6ZSA9IDA7CisgIHNpemVfdCBoZWxwX3NpemUgPSAwOworICBzaXplX3QgbWVzc2FnZV9zaXplID0gMDsKKyAgc2l6ZV90IG1vZHVsZV9zaXplID0gMDsKKyAgc2l6ZV90IHJwY19zaXplID0gMDsKKyAgYXNlY3Rpb24gKmN1c3RvbV9zZWN0aW9uID0gTlVMTDsKKyAgYXNlY3Rpb24gKmhlbHBfc2VjdGlvbiA9IE5VTEw7CisgIGFzZWN0aW9uICptZXNzYWdlX3NlY3Rpb24gPSBOVUxMOworICBhc2VjdGlvbiAqbW9kdWxlX3NlY3Rpb24gPSBOVUxMOworICBhc2VjdGlvbiAqcnBjX3NlY3Rpb24gPSBOVUxMOworICBhc2VjdGlvbiAqc2hhcmVkX3NlY3Rpb24gPSBOVUxMOworICBiZmQgKnNoYXJlZGJmZDsKKyAgc2l6ZV90IHNoYXJlZF9vZmZzZXQgPSAwOworICBzaXplX3Qgc2hhcmVkX3NpemUgPSAwOworICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyIHNoYXJlZGhkcjsKKyAgaW50IGxlbjsKKyAgY2hhciAqbW9kbmFtZTsKKyAgY2hhciAqKm1hdGNoaW5nOworCisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIGJmZF9pbml0ICgpOworICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOworCisgIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJkaEk6bDpPOlQ6ViIsIGxvbmdfb3B0aW9ucywKKwkJCSAgICAgKGludCAqKSBOVUxMKSkKKwkgIT0gRU9GKQorICAgIHsKKyAgICAgIHN3aXRjaCAob3B0KQorCXsKKwljYXNlICdkJzoKKwkgIGRlYnVnID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgc2hvd19oZWxwICgpOworCSAgLypOT1RSRUFDSEVEKi8KKwljYXNlICdJJzoKKwkgIGlucHV0X2Zvcm1hdCA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ2wnOgorCSAgbGRfYXJnID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnTyc6CisJICBvdXRwdXRfZm9ybWF0ID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnVCc6CisJICBoZWFkZXJfZmlsZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ1YnOgorCSAgcHJpbnRfdmVyc2lvbiAoIm5sbWNvbnYiKTsKKwkgIC8qTk9UUkVBQ0hFRCovCisJY2FzZSAwOgorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7CisJICAvKk5PVFJFQUNIRUQqLworCX0KKyAgICB9CisKKyAgLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbWF5IGJlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLworICBvdXRwdXRfZmlsZSA9IE5VTEw7CisgIGlmIChvcHRpbmQgPCBhcmdjKQorICAgIHsKKyAgICAgIGlucHV0X2ZpbGUgPSBhcmd2W29wdGluZF07CisgICAgICArK29wdGluZDsKKyAgICAgIGlmIChvcHRpbmQgPCBhcmdjKQorCXsKKwkgIG91dHB1dF9maWxlID0gYXJndltvcHRpbmRdOworCSAgKytvcHRpbmQ7CisJICBpZiAob3B0aW5kIDwgYXJnYykKKwkgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKKwkgIGlmIChzdHJjbXAgKGlucHV0X2ZpbGUsIG91dHB1dF9maWxlKSA9PSAwKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAgXygiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIpLAorCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIHRvIGRlZmF1bHQgdmFsdWVzLiAgKi8KKyAgZml4ZWRfaGRyID0gJmZpeGVkX2hkcl9zdHJ1Y3Q7CisgIG1lbXNldCAoKFBUUikgJmZpeGVkX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBmaXhlZF9oZHJfc3RydWN0KTsKKyAgdmFyX2hkciA9ICZ2YXJfaGRyX3N0cnVjdDsKKyAgbWVtc2V0ICgoUFRSKSAmdmFyX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiB2YXJfaGRyX3N0cnVjdCk7CisgIHZlcnNpb25faGRyID0gJnZlcnNpb25faGRyX3N0cnVjdDsKKyAgbWVtc2V0ICgoUFRSKSAmdmVyc2lvbl9oZHJfc3RydWN0LCAwLCBzaXplb2YgdmVyc2lvbl9oZHJfc3RydWN0KTsKKyAgY29weXJpZ2h0X2hkciA9ICZjb3B5cmlnaHRfaGRyX3N0cnVjdDsKKyAgbWVtc2V0ICgoUFRSKSAmY29weXJpZ2h0X2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBjb3B5cmlnaHRfaGRyX3N0cnVjdCk7CisgIGV4dGVuZGVkX2hkciA9ICZleHRlbmRlZF9oZHJfc3RydWN0OworICBtZW1zZXQgKChQVFIpICZleHRlbmRlZF9oZHJfc3RydWN0LCAwLCBzaXplb2YgZXh0ZW5kZWRfaGRyX3N0cnVjdCk7CisgIGNoZWNrX3Byb2NlZHVyZSA9IE5VTEw7CisgIGN1c3RvbV9maWxlID0gTlVMTDsKKyAgZGVidWdfaW5mbyA9IGZhbHNlOworICBleGl0X3Byb2NlZHVyZSA9ICJfU3RvcCI7CisgIGV4cG9ydF9zeW1ib2xzID0gTlVMTDsKKyAgbWFwX2ZpbGUgPSBOVUxMOworICBmdWxsX21hcCA9IGZhbHNlOworICBoZWxwX2ZpbGUgPSBOVUxMOworICBpbXBvcnRfc3ltYm9scyA9IE5VTEw7CisgIG1lc3NhZ2VfZmlsZSA9IE5VTEw7CisgIG1vZHVsZXMgPSBOVUxMOworICBzaGFyZWxpYl9maWxlID0gTlVMTDsKKyAgc3RhcnRfcHJvY2VkdXJlID0gIl9QcmVsdWRlIjsKKyAgdmVyYm9zZSA9IGZhbHNlOworICBycGNfZmlsZSA9IE5VTEw7CisKKyAgcGFyc2VfZXJyb3JzID0gMDsKKworICAvKiBQYXJzZSB0aGUgaGVhZGVyIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuICAqLworICBpZiAoaGVhZGVyX2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBubG1sZXhfZmlsZSAoaGVhZGVyX2ZpbGUpCisJICB8fCB5eXBhcnNlICgpICE9IDAKKwkgIHx8IHBhcnNlX2Vycm9ycyAhPSAwKQorCWV4aXQgKDEpOworICAgIH0KKworICBpZiAoaW5wdXRfZmlsZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoaW5wdXRfZmlsZSAhPSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgXygiJXM6IGlucHV0IGZpbGUgbmFtZWQgYm90aCBvbiBjb21tYW5kIGxpbmUgYW5kIHdpdGggSU5QVVRcbiIpLAorCQkgICBwcm9ncmFtX25hbWUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgaWYgKGlucHV0X2ZpbGVzLT5uZXh0ID09IE5VTEwpCisJaW5wdXRfZmlsZSA9IGlucHV0X2ZpbGVzLT5zdHJpbmc7CisgICAgICBlbHNlCisJaW5wdXRfZmlsZSA9IGxpbmtfaW5wdXRzIChpbnB1dF9maWxlcywgbGRfYXJnKTsKKyAgICB9CisgIGVsc2UgaWYgKGlucHV0X2ZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBpbnB1dCBmaWxlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7CisgICAgfQorCisgIGluYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlLCBpbnB1dF9mb3JtYXQpOworICBpZiAoaW5iZmQgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOworCisgIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoaW5iZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisJeworCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7CisJICBmcmVlIChtYXRjaGluZyk7CisJfQorICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChvdXRwdXRfZm9ybWF0ID09IE5VTEwpCisgICAgb3V0cHV0X2Zvcm1hdCA9IHNlbGVjdF9vdXRwdXRfZm9ybWF0IChiZmRfZ2V0X2FyY2ggKGluYmZkKSwKKwkJCQkJICBiZmRfZ2V0X21hY2ggKGluYmZkKSwKKwkJCQkJICBiZmRfYmlnX2VuZGlhbiAoaW5iZmQpKTsKKworICBhc3NlcnQgKG91dHB1dF9mb3JtYXQgIT0gTlVMTCk7CisKKyAgLyogVXNlIHRoZSBvdXRwdXQgZmlsZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGlmIGl0IGV4aXN0cy4KKyAgICAgT3RoZXJ3aXNlIHVzZSB0aGUgZmlsZSBuYW1lZCBpbiB0aGUgT1VUUFVUIHN0YXRlbWVudC4gICovCisgIGlmIChvdXRwdXRfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iKSwKKwkgICAgICAgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7CisgICAgfQorCisgIG91dGJmZCA9IGJmZF9vcGVudyAob3V0cHV0X2ZpbGUsIG91dHB1dF9mb3JtYXQpOworICBpZiAob3V0YmZkID09IE5VTEwpCisgICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7CisgIGlmICghIGJmZF9zZXRfZm9ybWF0IChvdXRiZmQsIGJmZF9vYmplY3QpKQorICAgIGJmZF9mYXRhbCAob3V0cHV0X2ZpbGUpOworCisgIGFzc2VydCAoYmZkX2dldF9mbGF2b3VyIChvdXRiZmQpID09IGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIpOworCisgIGlmIChiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoaW5iZmQsIG91dGJmZCkgPT0gTlVMTCkKKyAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICBfKCIlczogd2FybmluZzppbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIG5vdCBjb21wYXRpYmxlXG4iKSwKKwkgICAgIHByb2dyYW1fbmFtZSk7CisKKyAgLyogTW92ZSB0aGUgdmFsdWVzIHJlYWQgZnJvbSB0aGUgY29tbWFuZCBmaWxlIGludG8gb3V0YmZkLiAgKi8KKyAgKm5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCkgPSBmaXhlZF9oZHJfc3RydWN0OworICAqbmxtX3ZhcmlhYmxlX2hlYWRlciAob3V0YmZkKSA9IHZhcl9oZHJfc3RydWN0OworICAqbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpID0gdmVyc2lvbl9oZHJfc3RydWN0OworICAqbmxtX2NvcHlyaWdodF9oZWFkZXIgKG91dGJmZCkgPSBjb3B5cmlnaHRfaGRyX3N0cnVjdDsKKyAgKm5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCkgPSBleHRlbmRlZF9oZHJfc3RydWN0OworCisgIC8qIFN0YXJ0IGNvcHlpbmcgdGhlIGlucHV0IEJGRCB0byB0aGUgb3V0cHV0IEJGRC4gICovCisgIGlmICghIGJmZF9zZXRfZmlsZV9mbGFncyAob3V0YmZkLCBiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGluYmZkKSkpCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChvdXRiZmQpKTsKKworICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGluYmZkKTsKKyAgaWYgKHN5bXNpemUgPCAwKQorICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7CisgIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7CisgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGluYmZkLCBzeW1ib2xzKTsKKyAgaWYgKHN5bWNvdW50IDwgMCkKKyAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgLmJzcyBzZWN0aW9uLiAgKi8KKyAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7CisgIGlmIChic3Nfc2VjID09IE5VTEwpCisgICAgeworICAgICAgYnNzX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgICAgIGlmIChic3Nfc2VjID09IE5VTEwKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIGJzc19zZWMsIFNFQ19BTExPQykKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob3V0YmZkLCBic3Nfc2VjLCAxKSkKKwliZmRfZmF0YWwgKF8oIm1ha2UgLmJzcyBzZWN0aW9uIikpOworICAgIH0KKworICAvKiBXZSBzdG9yZSB0aGUgb3JpZ2luYWwgc2VjdGlvbiBuYW1lcyBpbiB0aGUgLm5sbXNlY3Rpb25zIHNlY3Rpb24sCisgICAgIHNvIHRoYXQgcHJvZ3JhbXMgd2hpY2ggdW5kZXJzdGFuZCBpdCBjYW4gcmVzdXJyZWN0IHRoZSBvcmlnaW5hbAorICAgICBzZWN0aW9ucyBmcm9tIHRoZSBOTE0uICBXZSB3aWxsIHB1dCBhIHBvaW50ZXIgdG8gLm5sbXNlY3Rpb25zIGluCisgICAgIHRoZSBOTE0gaGVhZGVyIGFyZWEuICAqLworICBzZWNzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtc2VjdGlvbnMiKTsKKyAgaWYgKHNlY3NlYyA9PSBOVUxMKQorICAgIGJmZF9mYXRhbCAoXygibWFrZSAubmxtc2VjdGlvbnMgc2VjdGlvbiIpKTsKKyAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIHNlY3NlYywgU0VDX0hBU19DT05URU5UUykpCisgICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb25zIGZsYWdzIikpOworCisjaWZkZWYgTkxNQ09OVl9QT1dFUlBDCisgIC8qIEZvciBQb3dlclBDIE5ldFdhcmUgd2UgbmVlZCB0byBidWlsZCBzdHVicyBmb3IgY2FsbHMgdG8gdW5kZWZpbmVkCisgICAgIHN5bWJvbHMuICBCZWNhdXNlIGVhY2ggc3R1YiByZXF1aXJlcyBhbiBlbnRyeSBpbiB0aGUgVE9DIHNlY3Rpb24KKyAgICAgd2hpY2ggbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcyBvdGhlciBlbnRyaWVzIGluIHRoZSBUT0MKKyAgICAgc2VjdGlvbiwgd2UgbXVzdCBkbyB0aGlzIGJlZm9yZSBkZXRlcm1pbmluZyB3aGVyZSB0aGUgVE9DIHNlY3Rpb24KKyAgICAgZ29lcyBpbiBzZXR1cF9zZWN0aW9ucy4gICovCisgIGlmIChiZmRfZ2V0X2FyY2ggKGluYmZkKSA9PSBiZmRfYXJjaF9wb3dlcnBjKQorICAgIHBvd2VycGNfYnVpbGRfc3R1YnMgKGluYmZkLCBvdXRiZmQsICZzeW1ib2xzLCAmc3ltY291bnQpOworI2VuZGlmCisKKyAgLyogU2V0IHVwIHRoZSBzZWN0aW9ucy4gICovCisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaW5iZmQsIHNldHVwX3NlY3Rpb25zLCAoUFRSKSBvdXRiZmQpOworCisgIHRleHRfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgTkxNX0NPREVfTkFNRSk7CisKKyAgLyogVGhlIC5ic3Mgc2VjdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKKyAgaWYgKGRhdGFfc2VjICE9IE5VTEwpCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBhZGQ7CisKKyAgICAgIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOworICAgICAgYWxpZ24gPSAxIDw8IGJzc19zZWMtPmFsaWdubWVudF9wb3dlcjsKKyAgICAgIGFkZCA9ICgodm1hICsgYWxpZ24gLSAxKSAmfiAoYWxpZ24gLSAxKSkgLSB2bWE7CisgICAgICB2bWEgKz0gYWRkOworICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAob3V0YmZkLCBic3Nfc2VjLCB2bWEpKQorCWJmZF9mYXRhbCAoXygic2V0IC5ic3Mgdm1hIikpOworICAgICAgaWYgKGFkZCAhPSAwKQorCXsKKwkgIGJmZF9zaXplX3R5cGUgZGF0YV9zaXplOworCisJICBkYXRhX3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGRhdGFfc2VjKTsKKwkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGRhdGFfc2VjLCBkYXRhX3NpemUgKyBhZGQpKQorCSAgICBiZmRfZmF0YWwgKF8oInNldCAuZGF0YSBzaXplIikpOworCX0KKyAgICB9CisKKyAgLyogQWRqdXN0IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCisgIGlubGVhZCA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5iZmQpOworICBvdXRsZWFkID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvdXRiZmQpOworICBnb3RzdGFydCA9IGZhbHNlOworICBnb3RleGl0ID0gZmFsc2U7CisgIGdvdGNoZWNrID0gZmFsc2U7CisgIG5ld3N5bWFsbG9jID0gMTA7CisgIG5ld3N5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAobmV3c3ltYWxsb2MgKiBzaXplb2YgKGFzeW1ib2wgKikpOworICBuZXdzeW1jb3VudCA9IDA7CisgIGVuZHN5bSA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBzeW1jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGFzeW1ib2wgKnN5bTsKKworICAgICAgc3ltID0gc3ltYm9sc1tpXTsKKworICAgICAgLyogQWRkIG9yIHJlbW92ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4gICovCisgICAgICBpZiAoaW5sZWFkICE9IG91dGxlYWQpCisJeworCSAgaWYgKGlubGVhZCAhPSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gPT0gaW5sZWFkKQorCQl7CisJCSAgaWYgKG91dGxlYWQgPT0gJ1wwJykKKwkJICAgICsrc3ltLT5uYW1lOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgY2hhciAqbmV3OworCisJCSAgICAgIG5ldyA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgKyAxKTsKKwkJICAgICAgbmV3WzBdID0gb3V0bGVhZDsKKwkJICAgICAgc3RyY3B5IChuZXcgKyAxLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pICsgMSk7CisJCSAgICAgIHN5bS0+bmFtZSA9IG5ldzsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyICpuZXc7CisKKwkgICAgICBuZXcgPSB4bWFsbG9jIChzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpICsgMik7CisJICAgICAgbmV3WzBdID0gb3V0bGVhZDsKKwkgICAgICBzdHJjcHkgKG5ldyArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOworCSAgICAgIHN5bS0+bmFtZSA9IG5ldzsKKwkgICAgfQorCX0KKworICAgICAgLyogTkxNJ3MgaGF2ZSBhbiB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiwgYnV0IHRoZXkgZG8gbm90CisJIGhhdmUgYSBjb21tb24gc2VjdGlvbiBpbiB0aGUgVW5peCBzZW5zZS4gIE1vdmUgYWxsIGNvbW1vbgorCSBzeW1ib2xzIGludG8gdGhlIC5ic3Mgc2VjdGlvbiwgYW5kIG1hcmsgdGhlbSBhcyBleHBvcnRlZC4gICovCisgICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCXsKKwkgIGJmZF92bWEgc2l6ZTsKKworCSAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKKwkgIHNpemUgPSBzeW0tPnZhbHVlOworCSAgc3ltLT52YWx1ZSA9IGJzc19zZWMtPl9yYXdfc2l6ZTsKKwkgIGJzc19zZWMtPl9yYXdfc2l6ZSArPSBzaXplOworCSAgYWxpZ24gPSAxIDw8IGJzc19zZWMtPmFsaWdubWVudF9wb3dlcjsKKwkgIGJzc19zZWMtPl9yYXdfc2l6ZSA9IChic3Nfc2VjLT5fcmF3X3NpemUgKyBhbGlnbiAtIDEpICZ+IChhbGlnbiAtIDEpOworCSAgc3ltLT5mbGFncyB8PSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKKwl9CisgICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisJeworCSAgLyogTW92ZSB0aGUgc3ltYm9sIGludG8gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KKwkgIHN5bS0+dmFsdWUgKz0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vdXRwdXRfb2Zmc2V0OworCSAgc3ltLT5zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vdXRwdXRfc2VjdGlvbjsKKwkgIC8qIFRoaXMgaXMgbm8gbG9uZ2VyIGEgc2VjdGlvbiBzeW1ib2wuICAqLworCSAgc3ltLT5mbGFncyAmPX4gQlNGX1NFQ1RJT05fU1lNOworCX0KKworICAgICAgLyogRm9yY2UgX2VkYXRhIGFuZCBfZW5kIHRvIGJlIGRlZmluZWQuICBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlCisJIGRvbmUgYnkgdGhlIGxpbmtlciwgYnV0IHRoZSBtYW5pcHVsYXRpb24gb2YgdGhlIGNvbW1vbgorCSBzeW1ib2xzIHdpbGwgY29uZnVzZSBpdC4gICovCisgICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwCisJICAmJiBiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdID09ICdfJworCSAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCXsKKwkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJfZWRhdGEiKSA9PSAwKQorCSAgICB7CisJICAgICAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKKwkgICAgICBzeW0tPnZhbHVlID0gMDsKKwkgICAgfQorCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgIl9lbmQiKSA9PSAwKQorCSAgICB7CisJICAgICAgc3ltLT5zZWN0aW9uID0gYnNzX3NlYzsKKwkgICAgICBlbmRzeW0gPSBzeW07CisJICAgIH0KKworI2lmZGVmIE5MTUNPTlZfUE9XRVJQQworCSAgLyogRm9yIFBvd2VyUEMgTmV0V2FyZSwgd2UgZGVmaW5lIF9fR09UMC4gIFRoaXMgaXMgdGhlIHN0YXJ0CisJICAgICBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KKwkgIGlmIChiZmRfZ2V0X2FyY2ggKGluYmZkKSA9PSBiZmRfYXJjaF9wb3dlcnBjCisJICAgICAgJiYgc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiX19HT1QwIikgPT0gMCkKKwkgICAgeworCSAgICAgIGFzZWN0aW9uICpnb3Rfc2VjOworCisJICAgICAgZ290X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbmJmZCwgIi5nb3QiKTsKKwkgICAgICBhc3NlcnQgKGdvdF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpOworCSAgICAgIHN5bS0+dmFsdWUgPSBnb3Rfc2VjLT5vdXRwdXRfb2Zmc2V0OworCSAgICAgIHN5bS0+c2VjdGlvbiA9IGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uOworCSAgICB9CisjZW5kaWYKKyAJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGEgZ2xvYmFsIHN5bWJvbCwgY2hlY2sgdGhlIGV4cG9ydCBsaXN0LiAgKi8KKyAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTCkpICE9IDApCisJeworCSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICpsOworCSAgaW50IGZvdW5kX3NpbXBsZTsKKworCSAgLyogVW5mb3J0dW5hdGVseSwgYSBzeW1ib2wgY2FuIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBvbiB0aGUKKwkgICAgIGV4cG9ydCBsaXN0LCB3aXRoIGFuZCB3aXRob3V0IHByZWZpeGVzLiAgKi8KKwkgIGZvdW5kX3NpbXBsZSA9IDA7CisJICBmb3IgKGwgPSBleHBvcnRfc3ltYm9sczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmIChzdHJjbXAgKGwtPnN0cmluZywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKKwkJZm91bmRfc2ltcGxlID0gMTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBjaGFyICp6YmFzZTsKKworCQkgIHpiYXNlID0gc3RyY2hyIChsLT5zdHJpbmcsICdAJyk7CisJCSAgaWYgKHpiYXNlICE9IE5VTEwKKwkJICAgICAgJiYgc3RyY21wICh6YmFzZSArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCisJCSAgICB7CisJCSAgICAgIC8qIFdlIG11c3QgYWRkIGEgc3ltYm9sIHdpdGggdGhpcyBwcmVmaXguICAqLworCQkgICAgICBpZiAobmV3c3ltY291bnQgPj0gbmV3c3ltYWxsb2MpCisJCQl7CisJCQkgIG5ld3N5bWFsbG9jICs9IDEwOworCQkJICBuZXdzeW1zID0gKChhc3ltYm9sICoqKQorCQkJCSAgICAgeHJlYWxsb2MgKChQVFIpIG5ld3N5bXMsCisJCQkJCSAgICAgICAobmV3c3ltYWxsb2MKKwkJCQkJCSogc2l6ZW9mIChhc3ltYm9sICopKSkpOworCQkJfQorCQkgICAgICBuZXdzeW1zW25ld3N5bWNvdW50XSA9CisJCQkoYXN5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wpKTsKKwkJICAgICAgKm5ld3N5bXNbbmV3c3ltY291bnRdID0gKnN5bTsKKwkJICAgICAgbmV3c3ltc1tuZXdzeW1jb3VudF0tPm5hbWUgPSBsLT5zdHJpbmc7CisJCSAgICAgICsrbmV3c3ltY291bnQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgaWYgKCEgZm91bmRfc2ltcGxlKQorCSAgICB7CisJICAgICAgLyogVGhlIHVubW9kaWZpZWQgc3ltYm9sIGlzIGFjdHVhbGx5IG5vdCBleHBvcnRlZCBhdAorCQkgYWxsLiAgKi8KKwkgICAgICBzeW0tPmZsYWdzICY9fiAoQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpOworCSAgICAgIHN5bS0+ZmxhZ3MgfD0gQlNGX0xPQ0FMOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiBpdCdzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHNlZSBpZiBpdCdzIG9uIHRoZSBpbXBvcnQgbGlzdC4KKwkgQ2hhbmdlIHRoZSBwcmVmaXggaWYgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJeworCSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICpsOworCisJICBmb3IgKGwgPSBpbXBvcnRfc3ltYm9sczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmIChzdHJjbXAgKGwtPnN0cmluZywgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKKwkJYnJlYWs7CisJICAgICAgZWxzZQorCQl7CisJCSAgY2hhciAqemJhc2U7CisKKwkJICB6YmFzZSA9IHN0cmNociAobC0+c3RyaW5nLCAnQCcpOworCQkgIGlmICh6YmFzZSAhPSBOVUxMCisJCSAgICAgICYmIHN0cmNtcCAoemJhc2UgKyAxLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQorCQkgICAgeworCQkgICAgICBzeW0tPm5hbWUgPSBsLT5zdHJpbmc7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGlmIChsID09IE5VTEwpCisJICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICBfKCIlczogd2FybmluZzogc3ltYm9sICVzIGltcG9ydGVkIGJ1dCBub3QgaW4gaW1wb3J0IGxpc3RcbiIpLAorCQkgICAgIHByb2dyYW1fbmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7CisJfQorCQorICAgICAgLyogU2VlIGlmIGl0J3Mgb25lIG9mIHRoZSBzcGVjaWFsIG5hbWVkIHN5bWJvbHMuICAqLworICAgICAgaWYgKChzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykgPT0gMCkKKwl7CisJICBiZmRfdm1hIHZhbDsKKworCSAgLyogRklYTUU6IElmIHRoZXNlIHN5bWJvbHMgYXJlIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbiwgd2UKKwkgICAgIGFkZCB0aGUgLnRleHQgc2VjdGlvbiBzaXplIHRvIHRoZSB2YWx1ZS4gIFRoaXMgbWF5IG5vdCBiZQorCSAgICAgY29ycmVjdCBmb3IgYWxsIHRhcmdldHMuICBJJ20gbm90IHN1cmUgaG93IHRoaXMgc2hvdWxkCisJICAgICByZWFsbHkgYmUgaGFuZGxlZC4gICovCisJICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBzdGFydF9wcm9jZWR1cmUpID09IDApCisJICAgIHsKKwkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKKwkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCisJCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCisJCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKKwkgICAgICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dGJmZCwgdmFsKSkKKwkJYmZkX2ZhdGFsIChfKCJzZXQgc3RhcnQgYWRkcmVzcyIpKTsKKwkgICAgICBnb3RzdGFydCA9IHRydWU7CisJICAgIH0KKwkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGV4aXRfcHJvY2VkdXJlKSA9PSAwKQorCSAgICB7CisJICAgICAgdmFsID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7CisJICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBkYXRhX3NlYworCQkgICYmIHRleHRfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQorCQl2YWwgKz0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCB0ZXh0X3NlYyk7CisJICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+ZXhpdFByb2NlZHVyZU9mZnNldCA9IHZhbDsKKwkgICAgICBnb3RleGl0ID0gdHJ1ZTsKKwkgICAgfQorCSAgaWYgKGNoZWNrX3Byb2NlZHVyZSAhPSBOVUxMCisJICAgICAgJiYgc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBjaGVja19wcm9jZWR1cmUpID09IDApCisJICAgIHsKKwkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKKwkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCisJCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCisJCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKKwkgICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5jaGVja1VubG9hZFByb2NlZHVyZU9mZnNldCA9IHZhbDsKKwkgICAgICBnb3RjaGVjayA9IHRydWU7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChlbmRzeW0gIT0gTlVMTCkKKyAgICB7CisgICAgICBlbmRzeW0tPnZhbHVlID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChic3Nfc2VjKTsKKworICAgICAgLyogRklYTUU6IElmIGFueSByZWxvY3MgcmVmZXJyaW5nIHRvIF9lbmQgdXNlIGlucGxhY2UgYWRkZW5kcywKKwkgdGhlbiBJIHRoaW5rIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLiAgVGhpcyBpcyBoYW5kbGVkIGJ5CisJIGkzODZfbWFuZ2xlX3JlbG9jcy4gIElzIGl0IG5lZWRlZCBmb3IgYW55IG90aGVyIG9iamVjdAorCSBmb3JtYXRzPyAgKi8KKyAgICB9CisKKyAgaWYgKG5ld3N5bWNvdW50ID09IDApCisgICAgb3V0c3ltcyA9IHN5bWJvbHM7CisgIGVsc2UKKyAgICB7CisgICAgICBvdXRzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKChzeW1jb3VudCArIG5ld3N5bWNvdW50ICsgMSkKKwkJCQkgICAgICAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgICAgICBtZW1jcHkgKG91dHN5bXMsIHN5bWJvbHMsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKKyAgICAgIG1lbWNweSAob3V0c3ltcyArIHN5bWNvdW50LCBuZXdzeW1zLCBuZXdzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgICAgICBvdXRzeW1zW3N5bWNvdW50ICsgbmV3c3ltY291bnRdID0gTlVMTDsKKyAgICB9CisKKyAgYmZkX3NldF9zeW10YWIgKG91dGJmZCwgb3V0c3ltcywgc3ltY291bnQgKyBuZXdzeW1jb3VudCk7CisgICAgCisgIGlmICghIGdvdHN0YXJ0KQorICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IFNUQVJUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCisJICAgICBwcm9ncmFtX25hbWUsIHN0YXJ0X3Byb2NlZHVyZSk7CisgIGlmICghIGdvdGV4aXQpCisgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogRVhJVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIpLAorCSAgICAgcHJvZ3JhbV9uYW1lLCBleGl0X3Byb2NlZHVyZSk7CisgIGlmIChjaGVja19wcm9jZWR1cmUgIT0gTlVMTAorICAgICAgJiYgISBnb3RjaGVjaykKKyAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBDSEVDSyBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIpLAorCSAgICAgcHJvZ3JhbV9uYW1lLCBjaGVja19wcm9jZWR1cmUpOworCisgIC8qIEFkZCBhZGRpdGlvbmFsIHNlY3Rpb25zIHJlcXVpcmVkIGZvciB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGN1c3RvbV9maWxlICE9IE5VTEwpCisgICAgeworICAgICAgY3VzdG9tX2RhdGEgPSBmb3BlbiAoY3VzdG9tX2ZpbGUsICJyIik7CisgICAgICBpZiAoY3VzdG9tX2RhdGEgPT0gTlVMTAorCSAgfHwgZnN0YXQgKGZpbGVubyAoY3VzdG9tX2RhdGEpLCAmc3QpIDwgMCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgY3VzdG9tX2ZpbGUsCisJCSAgIHN0cmVycm9yIChlcnJubykpOworCSAgY3VzdG9tX2ZpbGUgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjdXN0b21fc2l6ZSA9IHN0LnN0X3NpemU7CisJICBjdXN0b21fc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1jdXN0b20iKTsKKwkgIGlmIChjdXN0b21fc2VjdGlvbiA9PSBOVUxMCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwgY3VzdG9tX3NpemUpCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgY3VzdG9tX3NlY3Rpb24sCisJCQkJCSAgU0VDX0hBU19DT05URU5UUykpCisJICAgIGJmZF9mYXRhbCAoXygiY3VzdG9tIHNlY3Rpb24iKSk7CisJfQorICAgIH0KKyAgaWYgKGhlbHBfZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGhlbHBfZGF0YSA9IGZvcGVuIChoZWxwX2ZpbGUsICJyIik7CisgICAgICBpZiAoaGVscF9kYXRhID09IE5VTEwKKwkgIHx8IGZzdGF0IChmaWxlbm8gKGhlbHBfZGF0YSksICZzdCkgPCAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBoZWxwX2ZpbGUsCisJCSAgIHN0cmVycm9yIChlcnJubykpOworCSAgaGVscF9maWxlID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaGVscF9zaXplID0gc3Quc3Rfc2l6ZTsKKwkgIGhlbHBfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1oZWxwIik7CisJICBpZiAoaGVscF9zZWN0aW9uID09IE5VTEwKKwkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwgaGVscF9zaXplKQorCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwKKwkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKKwkgICAgYmZkX2ZhdGFsIChfKCJoZWxwIHNlY3Rpb24iKSk7CisJICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7CisJfQorICAgIH0KKyAgaWYgKG1lc3NhZ2VfZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1lc3NhZ2VfZGF0YSA9IGZvcGVuIChtZXNzYWdlX2ZpbGUsICJyIik7CisgICAgICBpZiAobWVzc2FnZV9kYXRhID09IE5VTEwKKwkgIHx8IGZzdGF0IChmaWxlbm8gKG1lc3NhZ2VfZGF0YSksICZzdCkgPCAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBtZXNzYWdlX2ZpbGUsCisJCSAgIHN0cmVycm9yIChlcnJubykpOworCSAgbWVzc2FnZV9maWxlID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWVzc2FnZV9zaXplID0gc3Quc3Rfc2l6ZTsKKwkgIG1lc3NhZ2Vfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1tZXNzYWdlcyIpOworCSAgaWYgKG1lc3NhZ2Vfc2VjdGlvbiA9PSBOVUxMCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sIG1lc3NhZ2Vfc2l6ZSkKKwkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sCisJCQkJCSAgU0VDX0hBU19DT05URU5UUykpCisJICAgIGJmZF9mYXRhbCAoXygibWVzc2FnZSBzZWN0aW9uIikpOworCSAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOworCX0KKyAgICB9CisgIGlmIChtb2R1bGVzICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOworCisgICAgICBtb2R1bGVfc2l6ZSA9IDA7CisgICAgICBmb3IgKGwgPSBtb2R1bGVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorCW1vZHVsZV9zaXplICs9IHN0cmxlbiAobC0+c3RyaW5nKSArIDE7CisgICAgICBtb2R1bGVfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1tb2R1bGVzIik7CisgICAgICBpZiAobW9kdWxlX3NlY3Rpb24gPT0gTlVMTAorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwgbW9kdWxlX3NpemUpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwKKwkJCQkgICAgICBTRUNfSEFTX0NPTlRFTlRTKSkKKwliZmRfZmF0YWwgKF8oIm1vZHVsZSBzZWN0aW9uIikpOworICAgIH0KKyAgaWYgKHJwY19maWxlICE9IE5VTEwpCisgICAgeworICAgICAgcnBjX2RhdGEgPSBmb3BlbiAocnBjX2ZpbGUsICJyIik7CisgICAgICBpZiAocnBjX2RhdGEgPT0gTlVMTAorCSAgfHwgZnN0YXQgKGZpbGVubyAocnBjX2RhdGEpLCAmc3QpIDwgMCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgcnBjX2ZpbGUsCisJCSAgIHN0cmVycm9yIChlcnJubykpOworCSAgcnBjX2ZpbGUgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBycGNfc2l6ZSA9IHN0LnN0X3NpemU7CisJICBycGNfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1ycGMiKTsKKwkgIGlmIChycGNfc2VjdGlvbiA9PSBOVUxMCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBycGNfc2VjdGlvbiwgcnBjX3NpemUpCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgcnBjX3NlY3Rpb24sCisJCQkJCSAgU0VDX0hBU19DT05URU5UUykpCisJICAgIGJmZF9mYXRhbCAoXygicnBjIHNlY3Rpb24iKSk7CisJICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7CisJfQorICAgIH0KKyAgaWYgKHNoYXJlbGliX2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBzaGFyZWRiZmQgPSBiZmRfb3BlbnIgKHNoYXJlbGliX2ZpbGUsIG91dHB1dF9mb3JtYXQpOworICAgICAgaWYgKHNoYXJlZGJmZCA9PSBOVUxMCisJICB8fCAhIGJmZF9jaGVja19mb3JtYXQgKHNoYXJlZGJmZCwgYmZkX29iamVjdCkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUsCisJCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgIHNoYXJlbGliX2ZpbGUgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzaGFyZWRoZHIgPSAqbmxtX2ZpeGVkX2hlYWRlciAoc2hhcmVkYmZkKTsKKwkgIGJmZF9jbG9zZSAoc2hhcmVkYmZkKTsKKwkgIHNoYXJlZF9kYXRhID0gZm9wZW4gKHNoYXJlbGliX2ZpbGUsICJyIik7CisJICBpZiAoc2hhcmVkX2RhdGEgPT0gTlVMTAorCSAgICAgIHx8IChmc3RhdCAoZmlsZW5vIChzaGFyZWRfZGF0YSksICZzdCkgPCAwKSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlLAorCQkgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisJICAgICAgc2hhcmVsaWJfZmlsZSA9IE5VTEw7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIElmIHdlIHdlcmUgY2xldmVyLCB3ZSBjb3VsZCBqdXN0IGNvcHkgb3V0IHRoZQorCQkgc2VjdGlvbnMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHdoaWNoIHdlIGFjdHVhbGx5CisJCSBuZWVkLiAgSG93ZXZlciwgd2Ugd291bGQgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBzaXplcworCQkgb2YgdGhlIGV4dGVybmFsIGFuZCBwdWJsaWMgaW5mb3JtYXRpb24sIGFuZCB0aGF0IGNhbgorCQkgbm90IGJlIGRvbmUgd2l0aG91dCByZWFkaW5nIHRocm91Z2ggdGhlbS4gICovCisJICAgICAgaWYgKHNoYXJlZGhkci51bmluaXRpYWxpemVkRGF0YVNpemUgPiAwKQorCQl7CisJCSAgLyogVGhlcmUgaXMgbm8gcGxhY2UgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICAqLworCQkgIGZwcmludGYgKHN0ZGVyciwKKwkJCSAgIF8oIiVzOiVzOiB3YXJuaW5nOiBzaGFyZWQgbGlicmFyaWVzIGNhbiBub3QgaGF2ZSB1bmluaXRpYWxpemVkIGRhdGFcbiIpLAorCQkJICAgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlKTsKKwkJfQorCSAgICAgIHNoYXJlZF9vZmZzZXQgPSBzdC5zdF9zaXplOworCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLmNvZGVJbWFnZU9mZnNldCkKKwkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5jb2RlSW1hZ2VPZmZzZXQ7CisJICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0KQorCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmRhdGFJbWFnZU9mZnNldDsKKwkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQpCisJCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIucmVsb2NhdGlvbkZpeHVwT2Zmc2V0OworCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCkKKwkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQ7CisJICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIucHVibGljc09mZnNldCkKKwkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0OworCSAgICAgIHNoYXJlZF9zaXplID0gc3Quc3Rfc2l6ZSAtIHNoYXJlZF9vZmZzZXQ7CisJICAgICAgc2hhcmVkX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsICIubmxtc2hhcmVkIik7CisJICAgICAgaWYgKHNoYXJlZF9zZWN0aW9uID09IE5VTEwKKwkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLAorCQkJCQkgICAgIHNoYXJlZF9zaXplKQorCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLAorCQkJCQkgICAgICBTRUNfSEFTX0NPTlRFTlRTKSkKKwkJYmZkX2ZhdGFsIChfKCJzaGFyZWQgc2VjdGlvbiIpKTsKKwkgICAgICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIENoZWNrIHdoZXRoZXIgYSB2ZXJzaW9uIHdhcyBnaXZlbi4gICovCisgIGlmIChzdHJuY21wICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpICE9IDApCisgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogTm8gdmVyc2lvbiBudW1iZXIgZ2l2ZW5cbiIpLAorCSAgICAgcHJvZ3JhbV9uYW1lKTsKKworICAvKiBBdCBsZWFzdCBmb3Igbm93LCBhbHdheXMgY3JlYXRlIGFuIGV4dGVuZGVkIGhlYWRlciwgYmVjYXVzZSB0aGF0CisgICAgIGlzIHdoYXQgTkxNTElOSyBkb2VzLiAgKi8KKyAgc3RybmNweSAobmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJNZVNzQWdFcyIsIDgpOworCisgIHN0cm5jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAob3V0YmZkKS0+c3RhbXAsICJDeUduVXNFeCIsIDgpOworCisgIC8qIElmIHRoZSBkYXRlIHdhcyBub3QgZ2l2ZW4sIGZvcmNlIGl0IGluLiAgKi8KKyAgaWYgKG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+bW9udGggPT0gMAorICAgICAgJiYgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5kYXkgPT0gMAorICAgICAgJiYgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT55ZWFyID09IDApCisgICAgeworICAgICAgdGltZV90IG5vdzsKKyAgICAgIHN0cnVjdCB0bSAqcHRtOworCisgICAgICB0aW1lICgmbm93KTsKKyAgICAgIHB0bSA9IGxvY2FsdGltZSAoJm5vdyk7CisgICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPm1vbnRoID0gcHRtLT50bV9tb24gKyAxOworICAgICAgbmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5kYXkgPSBwdG0tPnRtX21kYXk7CisgICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPnllYXIgPSBwdG0tPnRtX3llYXIgKyAxOTAwOworICAgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKKyAgICB9CisKKyNpZmRlZiBOTE1DT05WX1BPV0VSUEMKKyAgLyogUmVzb2x2ZSB0aGUgc3R1YnMgd2UgYnVpbGQgZm9yIFBvd2VyUEMgTmV0V2FyZS4gICovCisgIGlmIChiZmRfZ2V0X2FyY2ggKGluYmZkKSA9PSBiZmRfYXJjaF9wb3dlcnBjKQorICAgIHBvd2VycGNfcmVzb2x2ZV9zdHVicyAoaW5iZmQsIG91dGJmZCk7CisjZW5kaWYKKworICAvKiBDb3B5IG92ZXIgdGhlIHNlY3Rpb25zLiAgKi8KKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpbmJmZCwgY29weV9zZWN0aW9ucywgKFBUUikgb3V0YmZkKTsKKworICAvKiBGaW5pc2ggdXAgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCisgIGlmIChjdXN0b21fZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIFBUUiBkYXRhOworCisgICAgICBkYXRhID0geG1hbGxvYyAoY3VzdG9tX3NpemUpOworICAgICAgaWYgKGZyZWFkIChkYXRhLCAxLCBjdXN0b21fc2l6ZSwgY3VzdG9tX2RhdGEpICE9IGN1c3RvbV9zaXplKQorCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBjdXN0b21fZmlsZSwKKwkJIHN0cmVycm9yIChlcnJubykpOworICAgICAgZWxzZQorCXsKKwkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwgZGF0YSwKKwkJCQkJICAoZmlsZV9wdHIpIDAsIGN1c3RvbV9zaXplKSkKKwkgICAgYmZkX2ZhdGFsIChfKCJjdXN0b20gc2VjdGlvbiIpKTsKKwkgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmN1c3RvbURhdGFPZmZzZXQgPQorCSAgICBjdXN0b21fc2VjdGlvbi0+ZmlsZXBvczsKKwkgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmN1c3RvbURhdGFTaXplID0gY3VzdG9tX3NpemU7CisJfQorICAgICAgZnJlZSAoZGF0YSk7CisgICAgfQorICBpZiAoISBkZWJ1Z19pbmZvKQorICAgIHsKKyAgICAgIC8qIEFzIGEgc3BlY2lhbCBoYWNrLCB0aGUgYmFja2VuZCByZWNvZ25pemVzIGEgZGVidWdJbmZvT2Zmc2V0CisJIG9mIC0xIHRvIG1lYW4gdGhhdCBpdCBzaG91bGQgbm90IG91dHB1dCBhbnkgZGVidWdnaW5nCisJIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gbm90IGJlIGhhbmRsaW5nIGJ5IGZpZGRsaW5nIHdpdGggdGhlCisJIHN5bWJvbCB0YWJsZSBiZWNhdXNlIGV4cG9ydGVkIHN5bWJvbHMgYXBwZWFyIGluIGJvdGggdGhlCisJIGV4cG9ydCBpbmZvcm1hdGlvbiBhbmQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSAoZmlsZV9wdHIpIC0xOworICAgIH0KKyAgaWYgKG1hcF9maWxlICE9IE5VTEwpCisgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgXygiJXM6IHdhcm5pbmc6IE1BUCBhbmQgRlVMTE1BUCBhcmUgbm90IHN1cHBvcnRlZDsgdHJ5IGxkIC1NXG4iKSwKKwkgICAgIHByb2dyYW1fbmFtZSk7CisgIGlmIChoZWxwX2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBQVFIgZGF0YTsKKworICAgICAgZGF0YSA9IHhtYWxsb2MgKGhlbHBfc2l6ZSk7CisgICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIGhlbHBfc2l6ZSwgaGVscF9kYXRhKSAhPSBoZWxwX3NpemUpCisJZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIGhlbHBfZmlsZSwKKwkJIHN0cmVycm9yIChlcnJubykpOworICAgICAgZWxzZQorCXsKKwkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBoZWxwX3NlY3Rpb24sIGRhdGEsCisJCQkJCSAgKGZpbGVfcHRyKSAwLCBoZWxwX3NpemUpKQorCSAgICBiZmRfZmF0YWwgKF8oImhlbHAgc2VjdGlvbiIpKTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPmhlbHBGaWxlT2Zmc2V0ID0KKwkgICAgaGVscF9zZWN0aW9uLT5maWxlcG9zOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+aGVscEZpbGVMZW5ndGggPSBoZWxwX3NpemU7CisJfQorICAgICAgZnJlZSAoZGF0YSk7CisgICAgfQorICBpZiAobWVzc2FnZV9maWxlICE9IE5VTEwpCisgICAgeworICAgICAgUFRSIGRhdGE7CisKKyAgICAgIGRhdGEgPSB4bWFsbG9jIChtZXNzYWdlX3NpemUpOworICAgICAgaWYgKGZyZWFkIChkYXRhLCAxLCBtZXNzYWdlX3NpemUsIG1lc3NhZ2VfZGF0YSkgIT0gbWVzc2FnZV9zaXplKQorCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBtZXNzYWdlX2ZpbGUsCisJCSBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgbWVzc2FnZV9zZWN0aW9uLCBkYXRhLAorCQkJCQkgIChmaWxlX3B0cikgMCwgbWVzc2FnZV9zaXplKSkKKwkgICAgYmZkX2ZhdGFsIChfKCJtZXNzYWdlIHNlY3Rpb24iKSk7CisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5tZXNzYWdlRmlsZU9mZnNldCA9CisJICAgIG1lc3NhZ2Vfc2VjdGlvbi0+ZmlsZXBvczsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VGaWxlTGVuZ3RoID0gbWVzc2FnZV9zaXplOworCisJICAvKiBGSVhNRTogQXJlIHRoZXNlIG9mZnNldHMgY29ycmVjdCBvbiBhbGwgcGxhdGZvcm1zPyAgQXJlCisJICAgICB0aGV5IDMyIGJpdHMgb24gYWxsIHBsYXRmb3Jtcz8gIFdoYXQgZW5kaWFubmVzcz8gICovCisJICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5sYW5ndWFnZUlEID0KKwkgICAgYmZkX2hfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgMTA2KTsKKwkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VDb3VudCA9CisJICAgIGJmZF9oX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIDExMCk7CisJfQorICAgICAgZnJlZSAoZGF0YSk7CisgICAgfQorICBpZiAobW9kdWxlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIFBUUiBkYXRhOworICAgICAgdW5zaWduZWQgY2hhciAqc2V0OworICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOworICAgICAgYmZkX3NpemVfdHlwZSBjOworCisgICAgICBkYXRhID0geG1hbGxvYyAobW9kdWxlX3NpemUpOworICAgICAgYyA9IDA7CisgICAgICBzZXQgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhOworICAgICAgZm9yIChsID0gbW9kdWxlczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKwl7CisJICAqc2V0ID0gc3RybGVuIChsLT5zdHJpbmcpOworCSAgc3RybmNweSAoc2V0ICsgMSwgbC0+c3RyaW5nLCAqc2V0KTsKKwkgIHNldCArPSAqc2V0ICsgMTsKKwkgICsrYzsKKwl9CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgbW9kdWxlX3NlY3Rpb24sIGRhdGEsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBtb2R1bGVfc2l6ZSkpCisJYmZkX2ZhdGFsIChfKCJtb2R1bGUgc2VjdGlvbiIpKTsKKyAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZURlcGVuZGVuY3lPZmZzZXQgPQorCW1vZHVsZV9zZWN0aW9uLT5maWxlcG9zOworICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMgPSBjOworICAgIH0KKyAgaWYgKHJwY19maWxlICE9IE5VTEwpCisgICAgeworICAgICAgUFRSIGRhdGE7CisKKyAgICAgIGRhdGEgPSB4bWFsbG9jIChycGNfc2l6ZSk7CisgICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIHJwY19zaXplLCBycGNfZGF0YSkgIT0gcnBjX3NpemUpCisJZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIHJwY19maWxlLAorCQkgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHJwY19zZWN0aW9uLCBkYXRhLAorCQkJCQkgIChmaWxlX3B0cikgMCwgcnBjX3NpemUpKQorCSAgICBiZmRfZmF0YWwgKF8oInJwYyBzZWN0aW9uIikpOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+UlBDRGF0YU9mZnNldCA9CisJICAgIHJwY19zZWN0aW9uLT5maWxlcG9zOworCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+UlBDRGF0YUxlbmd0aCA9IHJwY19zaXplOworCX0KKyAgICAgIGZyZWUgKGRhdGEpOworICAgIH0KKyAgaWYgKHNoYXJlbGliX2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBQVFIgZGF0YTsKKworICAgICAgZGF0YSA9IHhtYWxsb2MgKHNoYXJlZF9zaXplKTsKKyAgICAgIGlmIChmc2VlayAoc2hhcmVkX2RhdGEsIHNoYXJlZF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCisJICB8fCBmcmVhZCAoZGF0YSwgMSwgc2hhcmVkX3NpemUsIHNoYXJlZF9kYXRhKSAhPSBzaGFyZWRfc2l6ZSkKKwlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSwKKwkJIHN0cmVycm9yIChlcnJubykpOworICAgICAgZWxzZQorCXsKKwkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzaGFyZWRfc2VjdGlvbiwgZGF0YSwKKwkJCQkJICAoZmlsZV9wdHIpIDAsIHNoYXJlZF9zaXplKSkKKwkgICAgYmZkX2ZhdGFsIChfKCJzaGFyZWQgc2VjdGlvbiIpKTsKKwl9CisgICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRDb2RlT2Zmc2V0ID0KKwlzaGFyZWRoZHIuY29kZUltYWdlT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOworICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkQ29kZUxlbmd0aCA9CisJc2hhcmVkaGRyLmNvZGVJbWFnZVNpemU7CisgICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREYXRhT2Zmc2V0ID0KKwlzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOworICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9CisJc2hhcmVkaGRyLmRhdGFJbWFnZVNpemU7CisgICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQorCShzaGFyZWRoZHIucmVsb2NhdGlvbkZpeHVwT2Zmc2V0CisJIC0gc2hhcmVkX29mZnNldAorCSArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zKTsKKyAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50ID0KKwlzaGFyZWRoZHIubnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOworICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQorCShzaGFyZWRoZHIuZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0CisJIC0gc2hhcmVkX29mZnNldAorCSArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zKTsKKyAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQorCXNoYXJlZGhkci5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlczsKKyAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFB1YmxpY3NPZmZzZXQgPQorCXNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0IC0gc2hhcmVkX29mZnNldCArIHNoYXJlZF9zZWN0aW9uLT5maWxlcG9zOworICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUHVibGljc0NvdW50ID0KKwlzaGFyZWRoZHIubnVtYmVyT2ZQdWJsaWNzOworICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgPQorCXNoYXJlZGhkci5kZWJ1Z0luZm9PZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7CisgICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZENvdW50ID0KKwlzaGFyZWRoZHIubnVtYmVyT2ZEZWJ1Z1JlY29yZHM7CisgICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9CisJc2hhcmVkaGRyLmNvZGVTdGFydE9mZnNldDsKKyAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlNoYXJlZEV4aXRQcm9jZWR1cmVPZmZzZXQgPQorCXNoYXJlZGhkci5leGl0UHJvY2VkdXJlT2Zmc2V0OworICAgICAgZnJlZSAoZGF0YSk7CisgICAgfQorICBsZW4gPSBzdHJsZW4gKG91dHB1dF9maWxlKTsKKyAgaWYgKGxlbiA+IE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMikKKyAgICBsZW4gPSBOTE1fTU9EVUxFX05BTUVfU0laRSAtIDI7CisgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWVbMF0gPSBsZW47CisKKyAgc3RybmNweSAobmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZSArIDEsIG91dHB1dF9maWxlLAorCSAgIE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMik7CisgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWVbTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAxXSA9ICdcMCc7CisgIGZvciAobW9kbmFtZSA9IG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPm1vZHVsZU5hbWU7CisgICAgICAgKm1vZG5hbWUgIT0gJ1wwJzsKKyAgICAgICBtb2RuYW1lKyspCisgICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbW9kbmFtZSkpCisgICAgICAqbW9kbmFtZSA9IHRvdXBwZXIgKCptb2RuYW1lKTsKKworICBzdHJuY3B5IChubG1fdmFyaWFibGVfaGVhZGVyIChvdXRiZmQpLT5vbGRUaHJlYWROYW1lLCAiIExPTkciLAorCSAgIE5MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RIKTsKKworICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKG91dGJmZCktPm9mZnNldCA9IHNlY3NlYy0+ZmlsZXBvczsKKyAgbmxtX2N5Z251c19leHRfaGVhZGVyIChvdXRiZmQpLT5sZW5ndGggPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNlY3NlYyk7CisKKyAgaWYgKCEgYmZkX2Nsb3NlIChvdXRiZmQpKQorICAgIGJmZF9mYXRhbCAob3V0cHV0X2ZpbGUpOworICBpZiAoISBiZmRfY2xvc2UgKGluYmZkKSkKKyAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOworCisgIGlmICh1bmxpbmtfb25fZXhpdCAhPSBOVUxMKQorICAgIHVubGluayAodW5saW5rX29uX2V4aXQpOworCisgIHJldHVybiAwOworfQorDAorLyogRGlzcGxheSBhIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4gICovCisKK3N0YXRpYyB2b2lkCitzaG93X2hlbHAgKCkKK3sKKyAgcHJpbnRmIChfKCIlczogQ29udmVydCBhbiBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcbiIpLAorCSAgcHJvZ3JhbV9uYW1lKTsKKyAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKK30KKworLyogU2hvdyBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLworCitzdGF0aWMgdm9pZAorc2hvd191c2FnZSAoZmlsZSwgc3RhdHVzKQorICAgICBGSUxFICpmaWxlOworICAgICBpbnQgc3RhdHVzOworeworICBmcHJpbnRmIChmaWxlLCBfKCJcCitVc2FnZTogJXMgWy1kaFZdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1UIGhlYWRlci1maWxlXSBbLWwgbGlua2VyXVxuXAorICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdXG5cCisgICAgICAgWy0taGVhZGVyLWZpbGU9ZmlsZV0gWy0tbGlua2VyPWxpbmtlcl0gWy0tZGVidWddXG5cCisgICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl1cblwKKyAgICAgICBbaW4tZmlsZSBbb3V0LWZpbGVdXVxuIiksCisJICAgcHJvZ3JhbV9uYW1lKTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIGZwcmludGYgKGZpbGUsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOworICBleGl0IChzdGF0dXMpOworfQorDAorLyogU2VsZWN0IHRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBhcmNoaXRlY3R1cmUsIG1hY2hpbmUsCisgICBhbmQgZW5kaWFubmVzcy4gIFRoaXMgY2hvb3NlcyB0aGUgYXBwcm9wcmlhdGUgTkxNIHRhcmdldC4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NlbGVjdF9vdXRwdXRfZm9ybWF0IChhcmNoLCBtYWNoLCBiaWdlbmRpYW4pCisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2g7CisgICAgIGJvb2xlYW4gYmlnZW5kaWFuOworeworICBzd2l0Y2ggKGFyY2gpCisgICAgeworI2lmZGVmIE5MTUNPTlZfSTM4NgorICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKKyAgICAgIHJldHVybiAibmxtMzItaTM4NiI7CisjZW5kaWYKKyNpZmRlZiBOTE1DT05WX1NQQVJDCisgICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKKyAgICAgIHJldHVybiAibmxtMzItc3BhcmMiOworI2VuZGlmCisjaWZkZWYgTkxNQ09OVl9BTFBIQQorICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6CisgICAgICByZXR1cm4gIm5sbTMyLWFscGhhIjsKKyNlbmRpZgorI2lmZGVmIE5MTUNPTlZfUE9XRVJQQworICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKKyAgICAgIHJldHVybiAibmxtMzItcG93ZXJwYyI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogc3VwcG9ydCBub3QgY29tcGlsZWQgaW4gZm9yICVzXG4iKSwKKwkgICAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYXJjaCwgbWFjaCkpOworICAgICAgZXhpdCAoMSk7CisgICAgICAvKiBBdm9pZCB3YXJuaW5nLiAgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKwwKKy8qIFRoZSBCRkQgc2VjdGlvbnMgYXJlIGNvcGllZCBpbiB0d28gcGFzc2VzLiAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzCisgICB0aGUgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgc2VjdGlvbiwgYW5kIHNldHMgdXAgdGhlIHNlY3Rpb24KKyAgIG5hbWUsIHNpemUsIGV0Yy4gICovCisKK3N0YXRpYyB2b2lkCitzZXR1cF9zZWN0aW9ucyAoaW5iZmQsIGluc2VjLCBkYXRhX3B0cikKKyAgICAgYmZkICppbmJmZDsKKyAgICAgYXNlY3Rpb24gKmluc2VjOworICAgICBQVFIgZGF0YV9wdHI7Cit7CisgIGJmZCAqb3V0YmZkID0gKGJmZCAqKSBkYXRhX3B0cjsKKyAgZmxhZ3dvcmQgZjsKKyAgY29uc3QgY2hhciAqb3V0bmFtZTsKKyAgYXNlY3Rpb24gKm91dHNlYzsKKyAgYmZkX3ZtYSBvZmZzZXQ7CisgIGJmZF9zaXplX3R5cGUgYWxpZ247CisgIGJmZF9zaXplX3R5cGUgYWRkOworICBiZmRfc2l6ZV90eXBlIHNlY3NlY3NpemU7CisKKyAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGluc2VjKTsKKyAgaWYgKGYgJiBTRUNfQ09ERSkKKyAgICBvdXRuYW1lID0gTkxNX0NPREVfTkFNRTsKKyAgZWxzZSBpZiAoKGYgJiBTRUNfTE9BRCkgJiYgKGYgJiBTRUNfSEFTX0NPTlRFTlRTKSkKKyAgICBvdXRuYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKKyAgZWxzZSBpZiAoZiAmIFNFQ19BTExPQykKKyAgICBvdXRuYW1lID0gTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FOworICBlbHNlCisgICAgb3V0bmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYyk7CisKKyAgb3V0c2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgb3V0bmFtZSk7CisgIGlmIChvdXRzZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICBvdXRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRiZmQsIG91dG5hbWUpOworICAgICAgaWYgKG91dHNlYyA9PSBOVUxMKQorCWJmZF9mYXRhbCAoXygibWFrZSBzZWN0aW9uIikpOworICAgIH0KKworICBpbnNlYy0+b3V0cHV0X3NlY3Rpb24gPSBvdXRzZWM7CisKKyAgb2Zmc2V0ID0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBvdXRzZWMpOworICBhbGlnbiA9IDEgPDwgYmZkX3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgaW5zZWMpOworICBhZGQgPSAoKG9mZnNldCArIGFsaWduIC0gMSkgJn4gKGFsaWduIC0gMSkpIC0gb2Zmc2V0OworICBpbnNlYy0+b3V0cHV0X29mZnNldCA9IG9mZnNldCArIGFkZDsKKworICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBvdXRzZWMsCisJCQkgICAgICAoYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBvdXRzZWMpCisJCQkgICAgICAgKyBiZmRfc2VjdGlvbl9zaXplIChpbmJmZCwgaW5zZWMpCisJCQkgICAgICAgKyBhZGQpKSkKKyAgICBiZmRfZmF0YWwgKF8oInNldCBzZWN0aW9uIHNpemUiKSk7CisKKyAgaWYgKChiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYykKKyAgICAgICA+IGJmZF9zZWN0aW9uX2FsaWdubWVudCAob3V0YmZkLCBvdXRzZWMpKQorICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIG91dHNlYywKKwkJCQkgICAgICBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYykpKQorICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gYWxpZ25tZW50IikpOworCisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBvdXRzZWMsCisJCQkgICAgICAgZiB8IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBvdXRzZWMpKSkKKyAgICBiZmRfZmF0YWwgKF8oInNldCBzZWN0aW9uIGZsYWdzIikpOworCisgIGJmZF9zZXRfcmVsb2MgKG91dGJmZCwgb3V0c2VjLCAoYXJlbGVudCAqKikgTlVMTCwgMCk7CisKKyAgLyogRm9yIGVhY2ggaW5wdXQgc2VjdGlvbiB3ZSBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gZW50cnkgaW4KKyAgICAgLm5sbXNlY3Rpb25zLiAgKi8KKyAgc2Vjc2Vjc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2Vjc2VjKTsKKyAgc2Vjc2Vjc2l6ZSArPSBzdHJsZW4gKGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYykpICsgMTsKKyAgc2Vjc2Vjc2l6ZSA9IChzZWNzZWNzaXplICsgMykgJn4gMzsKKyAgc2Vjc2Vjc2l6ZSArPSA4OworICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzZWNzZWMsIHNlY3NlY3NpemUpKQorICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9ucyBzaXplIikpOworfQorCisvKiBDb3B5IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKworc3RhdGljIHZvaWQKK2NvcHlfc2VjdGlvbnMgKGluYmZkLCBpbnNlYywgZGF0YV9wdHIpCisgICAgIGJmZCAqaW5iZmQ7CisgICAgIGFzZWN0aW9uICppbnNlYzsKKyAgICAgUFRSIGRhdGFfcHRyOworeworICBzdGF0aWMgYmZkX3NpemVfdHlwZSBzZWNzZWNvZmYgPSAwOworICBiZmQgKm91dGJmZCA9IChiZmQgKikgZGF0YV9wdHI7CisgIGNvbnN0IGNoYXIgKmlubmFtZTsKKyAgYXNlY3Rpb24gKm91dHNlYzsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICBQVFIgY29udGVudHM7CisgIGxvbmcgcmVsb2Nfc2l6ZTsKKyAgYmZkX2J5dGUgYnVmWzRdOworICBiZmRfc2l6ZV90eXBlIGFkZDsKKworICBpbm5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbmJmZCwgaW5zZWMpOworCisgIG91dHNlYyA9IGluc2VjLT5vdXRwdXRfc2VjdGlvbjsKKyAgYXNzZXJ0IChvdXRzZWMgIT0gTlVMTCk7CisKKyAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoaW5zZWMpOworCisgIC8qIEZJWE1FOiBXaHkgYXJlIHRoZXNlIG5lY2Vzc2FyeT8gICovCisgIGluc2VjLT5fY29va2VkX3NpemUgPSBpbnNlYy0+X3Jhd19zaXplOworICBpbnNlYy0+cmVsb2NfZG9uZSA9IHRydWU7CisKKyAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGluYmZkLCBpbnNlYykgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQorICAgIGNvbnRlbnRzID0gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnRlbnRzID0geG1hbGxvYyAoc2l6ZSk7CisgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGluYmZkLCBpbnNlYywgY29udGVudHMsCisJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplKSkKKwliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7CisgICAgfQorCisgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbmJmZCwgaW5zZWMpOworICBpZiAocmVsb2Nfc2l6ZSA8IDApCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpbmJmZCkpOworICBpZiAocmVsb2Nfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIGFyZWxlbnQgKipyZWxvY3M7CisgICAgICBsb25nIHJlbG9jX2NvdW50OworCisgICAgICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsb2Nfc2l6ZSk7CisgICAgICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGluYmZkLCBpbnNlYywgcmVsb2NzLCBzeW1ib2xzKTsKKyAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCisJYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChpbmJmZCkpOworICAgICAgbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgJnJlbG9jcywgJnJlbG9jX2NvdW50LCAoY2hhciAqKSBjb250ZW50cywKKwkJICAgICBzaXplKTsKKworICAgICAgLyogRklYTUU6IHJlZmVycyB0byBpbnRlcm5hbCBCRkQgZmllbGRzLiAgKi8KKyAgICAgIGlmIChvdXRzZWMtPm9yZWxvY2F0aW9uICE9IChhcmVsZW50ICoqKSBOVUxMKQorCXsKKwkgIGJmZF9zaXplX3R5cGUgdG90YWxfY291bnQ7CisJICBhcmVsZW50ICoqY29tYmluZWQ7CisKKwkgIHRvdGFsX2NvdW50ID0gcmVsb2NfY291bnQgKyBvdXRzZWMtPnJlbG9jX2NvdW50OworCSAgY29tYmluZWQgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAodG90YWxfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOworCSAgbWVtY3B5IChjb21iaW5lZCwgb3V0c2VjLT5vcmVsb2NhdGlvbiwKKwkJICBvdXRzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKTsKKwkgIG1lbWNweSAoY29tYmluZWQgKyBvdXRzZWMtPnJlbG9jX2NvdW50LCByZWxvY3MsCisJCSAgKHNpemVfdCkgKHJlbG9jX2NvdW50ICogc2l6ZW9mIChhcmVsZW50ICopKSk7CisJICBmcmVlIChvdXRzZWMtPm9yZWxvY2F0aW9uKTsKKwkgIHJlbG9jX2NvdW50ID0gdG90YWxfY291bnQ7CisJICByZWxvY3MgPSBjb21iaW5lZDsKKwl9CisKKyAgICAgIGJmZF9zZXRfcmVsb2MgKG91dGJmZCwgb3V0c2VjLCByZWxvY3MsIHJlbG9jX2NvdW50KTsKKyAgICB9CisKKyAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIG91dHNlYywgY29udGVudHMsCisJCQkJICAgICAgaW5zZWMtPm91dHB1dF9vZmZzZXQsIHNpemUpKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0YmZkKSk7CisgICAgICBmcmVlIChjb250ZW50cyk7CisgICAgfQorCisgIC8qIEFkZCB0aGlzIHNlY3Rpb24gdG8gLm5sbXNlY3Rpb25zLiAgKi8KKyAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgKFBUUikgaW5uYW1lLCBzZWNzZWNvZmYsCisJCQkJICBzdHJsZW4gKGlubmFtZSkgKyAxKSkKKyAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKKyAgc2Vjc2Vjb2ZmICs9IHN0cmxlbiAoaW5uYW1lKSArIDE7CisKKyAgYWRkID0gKChzZWNzZWNvZmYgKyAzKSAmfiAzKSAtIHNlY3NlY29mZjsKKyAgaWYgKGFkZCAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMCwgYnVmKTsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCBhZGQpKQorCWJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOworICAgICAgc2Vjc2Vjb2ZmICs9IGFkZDsKKyAgICB9CisKKyAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCisgICAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBvdXRzZWMtPmZpbGVwb3MsIGJ1Zik7CisgIGVsc2UKKyAgICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIDAsIGJ1Zik7CisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCA0KSkKKyAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKKyAgc2Vjc2Vjb2ZmICs9IDQ7CisKKyAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBzaXplLCBidWYpOworICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCBidWYsIHNlY3NlY29mZiwgNCkpCisgICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7CisgIHNlY3NlY29mZiArPSA0OworfQorCisvKiBTb21lLCBwZXJoYXBzIGFsbCwgTmV0V2FyZSB0YXJnZXRzIHJlcXVpcmUgY2hhbmdpbmcgdGhlIHJlbG9jcyB1c2VkCisgICBieSB0aGUgaW5wdXQgZm9ybWF0cy4gICovCisKK3N0YXRpYyB2b2lkCittYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAorCSAgICAgICBjb250ZW50c19zaXplKQorICAgICBiZmQgKm91dGJmZDsKKyAgICAgYXNlY3Rpb24gKmluc2VjOworICAgICBhcmVsZW50ICoqKnJlbG9jc19wdHI7CisgICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKKyAgICAgY2hhciAqY29udGVudHM7CisgICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKK3sKKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKG91dGJmZCkpCisgICAgeworI2lmZGVmIE5MTUNPTlZfSTM4NgorICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKKyAgICAgIGkzODZfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAorCQkJICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIE5MTUNPTlZfQUxQSEEKKyAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgorICAgICAgYWxwaGFfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAorCQkJICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBOTE1DT05WX1BPV0VSUEMKKyAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6CisgICAgICBwb3dlcnBjX21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKKwkJCSAgICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgZGVmYXVsdF9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCisJCQkgICAgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogQnkgZGVmYXVsdCBhbGwgd2UgbmVlZCB0byBkbyBmb3IgcmVsb2NzIGlzIGNoYW5nZSB0aGUgYWRkcmVzcyBieQorICAgdGhlIG91dHB1dF9vZmZzZXQuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitkZWZhdWx0X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCisJCSAgICAgICBjb250ZW50c19zaXplKQorICAgICBiZmQgKm91dGJmZDsKKyAgICAgYXNlY3Rpb24gKmluc2VjOworICAgICBhcmVsZW50ICoqKnJlbG9jc19wdHI7CisgICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKKyAgICAgY2hhciAqY29udGVudHM7CisgICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKK3sKKyAgaWYgKGluc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCisgICAgeworICAgICAgbG9uZyByZWxvY19jb3VudDsKKyAgICAgIHJlZ2lzdGVyIGFyZWxlbnQgKipyZWxvY3M7CisgICAgICByZWdpc3RlciBsb25nIGk7CisKKyAgICAgIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKKyAgICAgIHJlbG9jcyA9ICpyZWxvY3NfcHRyOworICAgICAgZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyssIHJlbG9jcysrKQorCSgqcmVsb2NzKS0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKKyAgICB9Cit9CisMCisjaWZkZWYgTkxNQ09OVl9JMzg2CisKKy8qIE5ldFdhcmUgb24gdGhlIGkzODYgc3VwcG9ydHMgYSByZXN0cmljdGVkIHNldCBvZiByZWxvY3MsIHdoaWNoIGFyZQorICAgZGlmZmVyZW50IGZyb20gdGhvc2UgdXNlZCBvbiBvdGhlciBpMzg2IHRhcmdldHMuICBUaGlzIHJvdXRpbmUKKyAgIGNvbnZlcnRzIHRoZSByZWxvY3MuICBJdCBpcywgb2J2aW91c2x5LCB2ZXJ5IHRhcmdldCBkZXBlbmRlbnQuICBBdAorICAgdGhlIG1vbWVudCwgdGhlIG5sbTMyLWkzODYgYmFja2VuZCBwZXJmb3JtcyBzaW1pbGFyIHRyYW5zbGF0aW9uczsKKyAgIGhvd2V2ZXIsIGl0IGlzIG1vcmUgcmVsaWFibGUgYW5kIGVmZmljaWVudCB0byBkbyB0aGVtIGhlcmUuICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1faTM4Nl9wY3JlbF9ob3d0byA9CisgIEhPV1RPICgxLAkJCS8qIHR5cGUgKi8KKwkgMCwJCQkvKiByaWdodHNoaWZ0ICovCisJIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCisJIDMyLAkJCS8qIGJpdHNpemUgKi8KKwkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLworCSAwLAkJCS8qIGJpdHBvcyAqLworCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCisJIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLworCSAiRElTUDMyIiwJCS8qIG5hbWUgKi8KKwkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KKwkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCisJIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLworCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KKworc3RhdGljIHZvaWQKK2kzODZfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKKwkJICAgIGNvbnRlbnRzX3NpemUpCisgICAgIGJmZCAqb3V0YmZkOworICAgICBhc2VjdGlvbiAqaW5zZWM7CisgICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKKyAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOworICAgICBjaGFyICpjb250ZW50czsKKyAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOworeworICBsb25nIHJlbG9jX2NvdW50LCBpOworICBhcmVsZW50ICoqcmVsb2NzOworCisgIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKKyAgcmVsb2NzID0gKnJlbG9jc19wdHI7CisgIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGFyZWxlbnQgKnJlbDsKKyAgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKKyAgICAgIGJmZF92bWEgYWRkZW5kOworCisgICAgICByZWwgPSAqcmVsb2NzKys7CisgICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKKworICAgICAgLyogV2UncmUgbW92aW5nIHRoZSByZWxvY3MgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0CisJIHNlY3Rpb24sIHNvIHdlIG11c3QgYWRqdXN0IHRoZSBhZGRyZXNzIGFjY29yZGluZ2x5LiAgKi8KKyAgICAgIGFkZHJlc3MgPSByZWwtPmFkZHJlc3M7CisgICAgICByZWwtPmFkZHJlc3MgKz0gaW5zZWMtPm91dHB1dF9vZmZzZXQ7CisKKyAgICAgIC8qIE5vdGUgdGhhdCBubyBzZXJpb3VzIGhhcm0gd2lsbCBlbnN1ZSBpZiB3ZSBmYWlsIHRvIGNoYW5nZSBhCisJIHJlbG9jLiAgVGhlIGJhY2tlbmQgd2lsbCBmYWlsIHdoZW4gd3JpdGluZyBvdXQgdGhlIHJlbG9jLiAgKi8KKworICAgICAgLyogTWFrZSBzdXJlIHRoaXMgcmVsb2MgaXMgd2l0aGluIHRoZSBkYXRhIHdlIGhhdmUuICBXZSB1c2Ugb25seQorCSA0IGJ5dGUgcmVsb2NzIGhlcmUsIHNvIHdlIGluc2lzdCBvbiBoYXZpbmcgNCBieXRlcy4gICovCisgICAgICBpZiAoYWRkcmVzcyArIDQgPiBjb250ZW50c19zaXplKQorCWNvbnRpbnVlOworCisgICAgICAvKiBBIFBDIHJlbGF0aXZlIHJlbG9jIGVudGlyZWx5IHdpdGhpbiBhIHNpbmdsZSBzZWN0aW9uIGlzCisJIGNvbXBsZXRlbHkgdW5uZWNlc3NhcnkuICBUaGlzIGNhbiBiZSBnZW5lcmF0ZWQgYnkgbGQgLXIuICAqLworICAgICAgaWYgKHN5bSA9PSBpbnNlYy0+c3ltYm9sCisJICAmJiByZWwtPmhvd3RvICE9IE5VTEwKKwkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCisJICAmJiAhIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKKwl7CisJICAtLSpyZWxvY19jb3VudF9wdHI7CisJICAtLXJlbG9jczsKKwkgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKKwkJICAgKHNpemVfdCkgKChyZWxvY19jb3VudCAtIGkpICogc2l6ZW9mIChhcmVsZW50ICopKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgYW1vdW50IHRoZSByZWxvY2F0aW9uIHdpbGwgYWRkIGluLiAgKi8KKyAgICAgIGFkZGVuZCA9IHJlbC0+YWRkZW5kICsgc3ltLT52YWx1ZTsKKworICAgICAgLyogTmV0V2FyZSBkb2Vzbid0IHN1cHBvcnQgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3QgZGVmaW5lZAorCSBzeW1ib2xzLCBzbyB3ZSBoYXZlIHRvIGVsaW1pbmF0ZSB0aGVtIGJ5IGRvaW5nIHRoZSByZWxvY2F0aW9uCisJIG5vdy4gIFdlIGNhbiBvbmx5IGRvIHRoaXMgaWYgdGhlIHJlbG9jIGlzIHdpdGhpbiBhIHNpbmdsZQorCSBzZWN0aW9uLiAgKi8KKyAgICAgIGlmIChyZWwtPmhvd3RvICE9IE5VTEwKKwkgICYmIHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlCisJICAmJiBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gaW5zZWMtPm91dHB1dF9zZWN0aW9uKQorCXsKKwkgIGJmZF92bWEgdmFsOworCisJICBpZiAocmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQorCSAgICBhZGRlbmQgLT0gYWRkcmVzczsKKworCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKKwkgIHZhbCArPSBhZGRlbmQ7CisJICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7CisKKwkgIC0tKnJlbG9jX2NvdW50X3B0cjsKKwkgIC0tcmVsb2NzOworCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAorCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogTmV0V2FyZSBkb2Vzbid0IHN1cHBvcnQgcmVsb2MgYWRkZW5kcywgc28gd2UgZ2V0IHJpZCBvZiB0aGVtCisJIGhlcmUgYnkgc2ltcGx5IGFkZGluZyB0aGVtIGludG8gdGhlIG9iamVjdCBkYXRhLiAgV2UgaGFuZGxlCisJIHRoZSBzeW1ib2wgdmFsdWUsIGlmIGFueSwgdGhlIHNhbWUgd2F5LiAgKi8KKyAgICAgIGlmIChhZGRlbmQgIT0gMAorCSAgJiYgcmVsLT5ob3d0byAhPSBOVUxMCisJICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKKwkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgorCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgorCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKKwkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKKwkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCisJeworCSAgYmZkX3ZtYSB2YWw7CisKKwkgIHZhbCA9IGJmZF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7CisJICB2YWwgKz0gYWRkZW5kOworCSAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOworCisJICAvKiBBZGp1c3QgdGhlIHJlbG9jIGZvciB0aGUgY2hhbmdlcyB3ZSBqdXN0IG1hZGUuICAqLworCSAgcmVsLT5hZGRlbmQgPSAwOworCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCSAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2dldF9zZWN0aW9uIChzeW0pLT5zeW1ib2xfcHRyX3B0cjsKKwl9CisKKyAgICAgIC8qIE5ldFdhcmUgdXNlcyBhIHJlbG9jIHdpdGggcGNyZWxfb2Zmc2V0IHNldC4gIFdlIGFkanVzdAorCSBwY19yZWxhdGl2ZSByZWxvY3MgYWNjb3JkaW5nbHkuICBXZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZQorCSBob3d0byBmaWVsZCwgc28gd2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgY3VycmVudCBvbmUgaXMKKwkgY29tcGF0aWJsZS4gIFdlIHNob3VsZCBjaGVjayB0aGF0IHNwZWNpYWxfZnVuY3Rpb24gaXMgTlVMTAorCSBoZXJlLCBidXQgYXQgdGhlIG1vbWVudCBjb2ZmLWkzODYgdXNlcyBhIHNwZWNpYWxfZnVuY3Rpb24KKwkgd2hpY2ggZG9lcyBub3QgYWZmZWN0IHdoYXQgd2UgYXJlIGRvaW5nIGhlcmUuICAqLworICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAorCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKKwkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0CisJICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKKwkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgorCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgorCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKKwkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKKwkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCisJeworCSAgYmZkX3ZtYSB2YWw7CisKKwkgIC8qIFdoZW4gcGNyZWxfb2Zmc2V0IGlzIG5vdCBzZXQsIGl0IG1lYW5zIHRoYXQgdGhlIG5lZ2F0aXZlCisJICAgICBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUKKwkgICAgIG1lbW9yeSBsb2NhdGlvbi4gIFdlIG11c3QgYWRkIGl0IGJhY2sgaW4uICAqLworCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKKwkgIHZhbCArPSBhZGRyZXNzOworCSAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOworCisJICAvKiBXZSBtdXN0IGNoYW5nZSB0byBhIG5ldyBob3d0by4gICovCisJICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X3BjcmVsX2hvd3RvOworCX0KKyAgICB9Cit9CisKKyNlbmRpZiAvKiBOTE1DT05WX0kzODYgKi8KKwwKKyNpZmRlZiBOTE1DT05WX0FMUEhBCisKKy8qIE9uIHRoZSBBbHBoYSB0aGUgZmlyc3QgcmVsb2MgZm9yIGV2ZXJ5IHNlY3Rpb24gbXVzdCBiZSBhIHNwZWNpYWwKKyAgIHJlbG9jcyB3aGljaCBob2xkIHRoZSBHUCBhZGRyZXNzLiAgQWxzbywgdGhlIGZpcnN0IHJlbG9jIGluIHRoZQorICAgZmlsZSBtdXN0IGJlIGEgc3BlY2lhbCByZWxvYyB3aGljaCBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgLmxpdGEKKyAgIHNlY3Rpb24uICAqLworCitzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9hbHBoYV9ud19ob3d0byA9CisgIEhPV1RPIChBTFBIQV9SX05XX1JFTE9DLAkvKiB0eXBlICovCisJIDAsCQkJLyogcmlnaHRzaGlmdCAqLworCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLworCSAwLAkJCS8qIGJpdHNpemUgKi8KKwkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KKwkgMCwJCQkvKiBiaXRwb3MgKi8KKwkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KKwkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCisJICJOV19SRUxPQyIsCQkvKiBuYW1lICovCisJIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLworCSAwLAkJCS8qIHNyY19tYXNrICovCisJIDAsCQkJLyogZHN0X21hc2sgKi8KKwkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK2FscGhhX21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCisJCSAgICAgY29udGVudHNfc2l6ZSkKKyAgICAgYmZkICpvdXRiZmQ7CisgICAgIGFzZWN0aW9uICppbnNlYzsKKyAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKipyZWxvY3NfcHRyOworICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7CisgICAgIGNoYXIgKmNvbnRlbnRzOworICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Cit7CisgIGxvbmcgb2xkX3JlbG9jX2NvdW50OworICBhcmVsZW50ICoqb2xkX3JlbG9jczsKKyAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKKworICBvbGRfcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOworICBvbGRfcmVsb2NzID0gKnJlbG9jc19wdHI7CisgIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jICgob2xkX3JlbG9jX2NvdW50ICsgMykgKiBzaXplb2YgKGFyZWxlbnQgKikpOworICAqcmVsb2NzX3B0ciA9IHJlbG9jczsKKworICBpZiAobmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzID09IDApCisgICAgeworICAgICAgYmZkICppbmJmZDsKKyAgICAgIGFzZWN0aW9uICpsaXRhX3NlY3Rpb247CisKKyAgICAgIGluYmZkID0gaW5zZWMtPm93bmVyOworICAgICAgbGl0YV9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCBfTElUQSk7CisgICAgICBpZiAobGl0YV9zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQorCXsKKwkgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzcyA9CisJICAgIGJmZF9nZXRfc2VjdGlvbl92bWEgKGluYmZkLCBsaXRhX3NlY3Rpb24pOworCSAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9zaXplID0KKwkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGxpdGFfc2VjdGlvbik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEF2b2lkIG91dHB1dHRpbmcgdGhpcyByZWxvYyBhZ2Fpbi4gICovCisJICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3MgPSA0OworCX0KKworICAgICAgKnJlbG9jcyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworICAgICAgKCpyZWxvY3MpLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworICAgICAgKCpyZWxvY3MpLT5hZGRyZXNzID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzOworICAgICAgKCpyZWxvY3MpLT5hZGRlbmQgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX3NpemUgKyAxOworICAgICAgKCpyZWxvY3MpLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKKyAgICAgICsrcmVsb2NzOworICAgICAgKysoKnJlbG9jX2NvdW50X3B0cik7CisgICAgfQorCisgIC8qIEdldCB0aGUgR1AgdmFsdWUgZnJvbSBiZmQuICAqLworICBpZiAobmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+Z3AgPT0gMCkKKyAgICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncCA9CisgICAgICBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIChpbnNlYy0+b3duZXIpOworCisgICpyZWxvY3MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKyAgKCpyZWxvY3MpLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOworICAoKnJlbG9jcyktPmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncDsKKyAgKCpyZWxvY3MpLT5hZGRlbmQgPSAwOworICAoKnJlbG9jcyktPmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOworICArK3JlbG9jczsKKyAgKysoKnJlbG9jX2NvdW50X3B0cik7CisKKyAgbWVtY3B5ICgoUFRSKSByZWxvY3MsIChQVFIpIG9sZF9yZWxvY3MsCisJICAoc2l6ZV90KSBvbGRfcmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOworICByZWxvY3Nbb2xkX3JlbG9jX2NvdW50XSA9IChhcmVsZW50ICopIE5VTEw7CisKKyAgZnJlZSAob2xkX3JlbG9jcyk7CisKKyAgaWYgKGluc2VjLT5vdXRwdXRfb2Zmc2V0ICE9IDApCisgICAgeworICAgICAgcmVnaXN0ZXIgYmZkX3NpemVfdHlwZSBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGJmZF9zaXplX3R5cGUpIG9sZF9yZWxvY19jb3VudDsgaSsrLCByZWxvY3MrKykKKwkoKnJlbG9jcyktPmFkZHJlc3MgKz0gaW5zZWMtPm91dHB1dF9vZmZzZXQ7CisgICAgfQorfQorCisjZW5kaWYgLyogTkxNQ09OVl9BTFBIQSAqLworDAorI2lmZGVmIE5MTUNPTlZfUE9XRVJQQworCisvKiBXZSBrZWVwIGEgbGlua2VkIGxpc3Qgb2Ygc3R1YnMgd2hpY2ggd2UgbXVzdCBidWlsZC4gIEJlY2F1c2UgQkZECisgICByZXF1aXJlcyB1cyB0byBrbm93IHRoZSBzaXplcyBvZiBhbGwgc2VjdGlvbnMgYmVmb3JlIHdlIGNhbiBzZXQgdGhlCisgICBjb250ZW50cyBvZiBhbnksIHdlIG11c3QgZmlndXJlIG91dCB3aGljaCBzdHVicyB3ZSB3YW50IHRvIGJ1aWxkCisgICBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IGJ1aWxkIGFueSBvZiB0aGVtLiAgKi8KKworc3RydWN0IHBvd2VycGNfc3R1YgoreworICAvKiBOZXh0IHN0dWIgaW4gbGlua2VkIGxpc3QuICAqLworICBzdHJ1Y3QgcG93ZXJwY19zdHViICpuZXh0OworCisgIC8qIFN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHN0dWIuICBUaGlzIGlzIGEgc3ltYm9sCisgICAgIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYC4nLiAgKi8KKyAgYXN5bWJvbCAqc3RhcnQ7CisKKyAgLyogU3ltYm9sIHdlIGFyZSBnb2luZyB0byBjcmVhdGUgYSByZWxvYyBhZ2FpbnN0LiAgVGhpcyBpcyBhIHN5bWJvbAorICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgU1RBUlQgYnV0IHdpdGhvdXQgdGhlIGxlYWRpbmcgYC4nLiAgKi8KKyAgYXN5bWJvbCAqcmVsb2M7CisKKyAgLyogVGhlIFRPQyBpbmRleCBmb3IgdGhpcyBzdHViLiAgVGhpcyBpcyB0aGUgaW5kZXggaW50byB0aGUgVE9DCisgICAgIHNlY3Rpb24gYXQgd2hpY2ggdGhlIHJlbG9jIGlzIGNyZWF0ZWQuICAqLworICB1bnNpZ25lZCBpbnQgdG9jX2luZGV4OworfTsKKworLyogVGhlIGxpbmtlZCBsaXN0IG9mIHN0dWJzLiAgKi8KKworc3RhdGljIHN0cnVjdCBwb3dlcnBjX3N0dWIgKnBvd2VycGNfc3R1YnM7CisKKy8qIFRoaXMgaXMgd2hhdCBhIHN0dWIgbG9va3MgbGlrZS4gIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aWxsIGdldAorICAgYWRqdXN0ZWQgd2l0aCB0aGUgY29ycmVjdCBUT0MgaW5kZXguICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcnBjX3N0dWJfaW5zbnNbXSA9Cit7CisgIDB4ODE4MjAwMDAsCQkvKiBsd3oJIHIxMiwwKHIyKSAqLworICAweDkwNDEwMDE0LAkJLyogc3R3CSByMiwyMChyMSkgKi8KKyAgMHg4MDBjMDAwMCwJCS8qIGx3egkgcjAsMChyMTIpICovCisgIDB4ODA0YzAwMDQsCQkvKiBsd3oJIHIyLHIocjEyKSAqLworICAweDdjMDkwM2E2LAkJLyogbXRjdHIgcjAgKi8KKyAgMHg0ZTgwMDQyMCwJCS8qIGJjdHIgKi8KKyAgMCwJCQkvKiBUcmFjZWJhY2sgdGFibGUuICAqLworICAweGM4MDAwLAorICAwCit9OworCisjZGVmaW5lIFBPV0VSUENfU1RVQl9JTlNOX0NPVU5UIFwKKyAgKHNpemVvZiBwb3dlcnBjX3N0dWJfaW5zbnMgLyBzaXplb2YgcG93ZXJwY19zdHViX2luc25zWzBdKQorCisjZGVmaW5lIFBPV0VSUENfU1RVQl9TSVpFICg0ICogUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQpCisKKy8qIEVhY2ggc3R1YiB1c2VzIGEgZm91ciBieXRlIFRPQyBlbnRyeS4gICovCisjZGVmaW5lIFBPV0VSUENfU1RVQl9UT0NfRU5UUllfU0laRSAoNCkKKworLyogVGhlIG9yaWdpbmFsIHNpemUgb2YgdGhlIC5nb3Qgc2VjdGlvbi4gICovCitzdGF0aWMgYmZkX3NpemVfdHlwZSBwb3dlcnBjX2luaXRpYWxfZ290X3NpemU7CisKKy8qIExvb2sgZm9yIGFsbCB1bmRlZmluZWQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCBgLicsIGFuZCBwcmVwYXJlIHRvCisgICBidWlsZCBhIHN0dWIgZm9yIGVhY2ggb25lLiAgKi8KKworc3RhdGljIHZvaWQKK3Bvd2VycGNfYnVpbGRfc3R1YnMgKGluYmZkLCBvdXRiZmQsIHN5bWJvbHNfcHRyLCBzeW1jb3VudF9wdHIpCisgICAgIGJmZCAqaW5iZmQ7CisgICAgIGJmZCAqb3V0YmZkOworICAgICBhc3ltYm9sICoqKnN5bWJvbHNfcHRyOworICAgICBsb25nICpzeW1jb3VudF9wdHI7Cit7CisgIGFzZWN0aW9uICpzdHViX3NlYzsKKyAgYXNlY3Rpb24gKmdvdF9zZWM7CisgIHVuc2lnbmVkIGludCBnb3RfYmFzZTsKKyAgbG9uZyBpOworICBsb25nIHN5bWNvdW50OworICBsb25nIHN0dWJjb3VudDsKKworICAvKiBNYWtlIGEgc2VjdGlvbiB0byBob2xkIHN0dWJzLiAgV2UgZG9uJ3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZm9yCisgICAgIHRoZSBzZWN0aW9uIHRvIHByZXZlbnQgY29weV9zZWN0aW9ucyBmcm9tIHJlYWRpbmcgZnJvbSBpdC4gICovCisgIHN0dWJfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoaW5iZmQsICIuc3R1YnMiKTsKKyAgaWYgKHN0dWJfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIHN0dWJfc2VjLAorCQkJCSAgKFNFQ19DT0RFCisJCQkJICAgfCBTRUNfUkVMT0MKKwkJCQkgICB8IFNFQ19BTExPQworCQkJCSAgIHwgU0VDX0xPQUQpKQorICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChpbmJmZCwgc3R1Yl9zZWMsIDIpKQorICAgIGJmZF9mYXRhbCAoIi5zdHVicyIpOworCisgIC8qIEdldCB0aGUgVE9DIHNlY3Rpb24sIHdoaWNoIGlzIG5hbWVkIC5nb3QuICAqLworICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOworICBpZiAoZ290X3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKKyAgICB7CisgICAgICBnb3Rfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoaW5iZmQsICIuZ290Iik7CisgICAgICBpZiAoZ290X3NlYyA9PSAoYXNlY3Rpb24gKikgTlVMTAorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGluYmZkLCBnb3Rfc2VjLAorCQkJCSAgICAgIChTRUNfREFUQQorCQkJCSAgICAgICB8IFNFQ19SRUxPQworCQkJCSAgICAgICB8IFNFQ19BTExPQworCQkJCSAgICAgICB8IFNFQ19MT0FECisJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBnb3Rfc2VjLCAyKSkKKwliZmRfZmF0YWwgKCIuZ290Iik7CisgICAgfQorCisgIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGluYmZkLCBnb3Rfc2VjKTsKKyAgZ290X2Jhc2UgPSBwb3dlcnBjX2luaXRpYWxfZ290X3NpemU7CisgIGdvdF9iYXNlID0gKGdvdF9iYXNlICsgMykgJn4gMzsKKworICBzdHViY291bnQgPSAwOworCisgIHN5bWNvdW50ID0gKnN5bWNvdW50X3B0cjsKKyAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltOworICAgICAgYXN5bWJvbCAqbmV3c3ltOworICAgICAgY2hhciAqbmV3bmFtZTsKKyAgICAgIHN0cnVjdCBwb3dlcnBjX3N0dWIgKml0ZW07CisKKyAgICAgIHN5bSA9ICgqc3ltYm9sc19wdHIpW2ldOworCisgICAgICAvKiBXZSBtdXN0IG1ha2UgYSBzdHViIGZvciBldmVyeSB1bmRlZmluZWQgc3ltYm9sIHdob3NlIG5hbWUKKwkgc3RhcnRzIHdpdGggJy4nLiAgKi8KKyAgICAgIGlmIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdICE9ICcuJworCSAgfHwgISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJY29udGludWU7CisKKyAgICAgIC8qIE1ha2UgYSBuZXcgdW5kZWZpbmVkIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IHdpdGhvdXQKKwkgdGhlIGxlYWRpbmcgYC4nLiAgKi8KKyAgICAgIG5ld3N5bSA9IChhc3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCkpOworICAgICAgKm5ld3N5bSA9ICpzeW07CisgICAgICBuZXduYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSk7CisgICAgICBzdHJjcHkgKG5ld25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgKyAxKTsKKyAgICAgIG5ld3N5bS0+bmFtZSA9IG5ld25hbWU7CisKKyAgICAgIC8qIERlZmluZSB0aGUgYC4nIHN5bWJvbCB0byBiZSBpbiB0aGUgc3R1YiBzZWN0aW9uLiAgKi8KKyAgICAgIHN5bS0+c2VjdGlvbiA9IHN0dWJfc2VjOworICAgICAgc3ltLT52YWx1ZSA9IHN0dWJjb3VudCAqIFBPV0VSUENfU1RVQl9TSVpFOworICAgICAgLyogV2Ugc2V0IHRoZSBCU0ZfRFlOQU1JQyBmbGFnIGhlcmUgc28gdGhhdCB3ZSBjYW4gY2hlY2sgaXQgd2hlbgorCSB3ZSBhcmUgbWFuZ2xpbmcgcmVsb2NzLiAgRklYTUU6IFRoaXMgaXMgYSBoYWNrLiAgKi8KKyAgICAgIHN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUwgfCBCU0ZfRFlOQU1JQzsKKworICAgICAgLyogQWRkIHRoaXMgc3R1YiB0byB0aGUgbGlua2VkIGxpc3QuICAqLworICAgICAgaXRlbSA9IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHBvd2VycGNfc3R1YikpOworICAgICAgaXRlbS0+c3RhcnQgPSBzeW07CisgICAgICBpdGVtLT5yZWxvYyA9IG5ld3N5bTsKKyAgICAgIGl0ZW0tPnRvY19pbmRleCA9IGdvdF9iYXNlICsgc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1RPQ19FTlRSWV9TSVpFOworCisgICAgICBpdGVtLT5uZXh0ID0gcG93ZXJwY19zdHViczsKKyAgICAgIHBvd2VycGNfc3R1YnMgPSBpdGVtOworICAgICAgCisgICAgICArK3N0dWJjb3VudDsKKyAgICB9CisKKyAgaWYgKHN0dWJjb3VudCA+IDApCisgICAgeworICAgICAgYXN5bWJvbCAqKnM7CisgICAgICBzdHJ1Y3QgcG93ZXJwY19zdHViICpsOworCisgICAgICAvKiBBZGQgdGhlIG5ldyBzeW1ib2xzIHdlIGp1c3QgY3JlYXRlZCB0byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgICAgICpzeW1ib2xzX3B0ciA9IChhc3ltYm9sICoqKSB4cmVhbGxvYyAoKGNoYXIgKikgKnN5bWJvbHNfcHRyLAorCQkJCQkgICAgKChzeW1jb3VudCArIHN0dWJjb3VudCkKKwkJCQkJICAgICAqIHNpemVvZiAoYXN5bWJvbCkpKTsKKyAgICAgICpzeW1jb3VudF9wdHIgKz0gc3R1YmNvdW50OworICAgICAgcyA9ICYoKnN5bWJvbHNfcHRyKVtzeW1jb3VudF07CisgICAgICBmb3IgKGwgPSBwb3dlcnBjX3N0dWJzOyBsICE9IChzdHJ1Y3QgcG93ZXJwY19zdHViICopIE5VTEw7IGwgPSBsLT5uZXh0KQorCSpzKysgPSBsLT5yZWxvYzsKKworICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuc3R1YnMgc2VjdGlvbiBhbmQgaW5jcmVhc2UgdGhlIHNpemUgb2YKKwkgdGhlIC5nb3Qgc2VjdGlvbi4gICovCisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoaW5iZmQsIHN0dWJfc2VjLAorCQkJCSAgc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1NJWkUpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChpbmJmZCwgZ290X3NlYywKKwkJCQkgICAgIChnb3RfYmFzZQorCQkJCSAgICAgICsgKHN0dWJjb3VudAorCQkJCQkgKiBQT1dFUlBDX1NUVUJfVE9DX0VOVFJZX1NJWkUpKSkpCisJYmZkX2ZhdGFsIChfKCJzdHViIHNlY3Rpb24gc2l6ZXMiKSk7CisgICAgfQorfQorCisvKiBSZXNvbHZlIGFsbCB0aGUgc3R1YnMgZm9yIFBvd2VyUEMgTmV0V2FyZS4gIFdlIGZpbGwgaW4gdGhlIGNvbnRlbnRzCisgICBvZiB0aGUgb3V0cHV0IHNlY3Rpb24sIGFuZCBjcmVhdGUgbmV3IHJlbG9jcyBpbiB0aGUgVE9DLiAgKi8KKworc3RhdGljIHZvaWQKK3Bvd2VycGNfcmVzb2x2ZV9zdHVicyAoaW5iZmQsIG91dGJmZCkKKyAgICAgYmZkICppbmJmZDsKKyAgICAgYmZkICpvdXRiZmQ7Cit7CisgIGJmZF9ieXRlIGJ1ZltQT1dFUlBDX1NUVUJfU0laRV07CisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgc3R1YmNvdW50OworICBhcmVsZW50ICoqcmVsb2NzOworICBhc2VjdGlvbiAqZ290X3NlYzsKKyAgYXJlbGVudCAqKnI7CisgIHN0cnVjdCBwb3dlcnBjX3N0dWIgKmw7CisKKyAgaWYgKHBvd2VycGNfc3R1YnMgPT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yIChpID0gMDsgaSA8IFBPV0VSUENfU1RVQl9JTlNOX0NPVU5UOyBpKyspCisgICAgYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgcG93ZXJwY19zdHViX2luc25zW2ldLCBidWYgKyBpICogNCk7CisKKyAgZ290X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbmJmZCwgIi5nb3QiKTsKKyAgYXNzZXJ0IChnb3Rfc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKTsKKyAgYXNzZXJ0IChnb3Rfc2VjLT5vdXRwdXRfc2VjdGlvbi0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpOworCisgIHN0dWJjb3VudCA9IDA7CisgIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCisgICAgKytzdHViY291bnQ7CisgIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChzdHViY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOworCisgIHIgPSByZWxvY3M7CisgIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgYXJlbGVudCAqcmVsb2M7CisKKyAgICAgIC8qIEFkanVzdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gdXNlIHRoZSByaWdodCBUT0MgaW5kZXguICAqLworICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgcG93ZXJwY19zdHViX2luc25zWzBdICsgbC0+dG9jX2luZGV4LCBidWYpOworCisgICAgICAvKiBXcml0ZSB0aGlzIHN0dWIgb3V0LiAgKi8KKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLAorCQkJCSAgICAgIGJmZF9nZXRfc2VjdGlvbiAobC0+c3RhcnQpLAorCQkJCSAgICAgIGJ1ZiwKKwkJCQkgICAgICBsLT5zdGFydC0+dmFsdWUsCisJCQkJICAgICAgUE9XRVJQQ19TVFVCX1NJWkUpKQorCWJmZF9mYXRhbCAoXygid3JpdGluZyBzdHViIikpOworCisgICAgICAvKiBDcmVhdGUgYSBuZXcgcmVsb2MgZm9yIHRoZSBUT0MgZW50cnkuICAqLworICAgICAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKyAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZsLT5yZWxvYzsKKyAgICAgIHJlbG9jLT5hZGRyZXNzID0gbC0+dG9jX2luZGV4ICsgZ290X3NlYy0+b3V0cHV0X29mZnNldDsKKyAgICAgIHJlbG9jLT5hZGRlbmQgPSAwOworICAgICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChpbmJmZCwgQkZEX1JFTE9DXzMyKTsKKwkJCQkgICAgICAKKyAgICAgICpyKysgPSByZWxvYzsKKyAgICB9CisKKyAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBnb3Rfc2VjLT5vdXRwdXRfc2VjdGlvbiwgcmVsb2NzLCBzdHViY291bnQpOworfQorCisvKiBBZGp1c3QgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciBQb3dlclBDIE5ldFdhcmUuICBXZSBkbyBub3Qgb3V0cHV0CisgICBUT0MgcmVsb2NhdGlvbnMuICBUaGUgb2JqZWN0IGNvZGUgYWxyZWFkeSBjb250YWlucyB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBUT0MgcG9pbnRlci4gIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIFRPQyByZWdpc3RlciwKKyAgIHIyLCB3aWxsIGJlIHNldCB0byB0aGUgY29ycmVjdCBUT0MgdmFsdWUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yCisgICBhbnkgZnVydGhlciByZWxvYy4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3Bvd2VycGNfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKKwkJICAgICAgIGNvbnRlbnRzX3NpemUpCisgICAgIGJmZCAqb3V0YmZkOworICAgICBhc2VjdGlvbiAqaW5zZWM7CisgICAgIHJlZ2lzdGVyIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKKyAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOworICAgICBjaGFyICpjb250ZW50czsKKyAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOworeworICByZWxvY19ob3d0b190eXBlICp0b2NfaG93dG87CisgIGxvbmcgcmVsb2NfY291bnQ7CisgIHJlZ2lzdGVyIGFyZWxlbnQgKipyZWxvY3M7CisgIHJlZ2lzdGVyIGxvbmcgaTsKKworICB0b2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGluc2VjLT5vd25lciwgQkZEX1JFTE9DX1BQQ19UT0MxNik7CisgIGlmICh0b2NfaG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKKyAgICBhYm9ydCAoKTsKKworICAvKiBJZiB0aGlzIGlzIHRoZSAuZ290IHNlY3Rpb24sIGNsZWFyIG91dCBhbGwgdGhlIGNvbnRlbnRzIGJleW9uZAorICAgICB0aGUgaW5pdGlhbCBzaXplLiAgV2UgbXVzdCBkbyB0aGlzIGhlcmUgYmVjYXVzZSBjb3B5X3NlY3Rpb25zIGlzCisgICAgIGdvaW5nIHRvIHdyaXRlIG91dCB3aGF0ZXZlciB3ZSByZXR1cm4gaW4gdGhlIGNvbnRlbnRzIGZpZWxkLiAgKi8KKyAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGluc2VjLT5vd25lciwgaW5zZWMpLCAiLmdvdCIpID09IDApCisgICAgbWVtc2V0IChjb250ZW50cyArIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSwgMCwKKwkgICAgKHNpemVfdCkgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jIChpbnNlYykKKwkJICAgICAgLSBwb3dlcnBjX2luaXRpYWxfZ290X3NpemUpKTsKKworICByZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7CisgIHJlbG9jcyA9ICpyZWxvY3NfcHRyOworICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKKyAgICB7CisgICAgICBhcmVsZW50ICpyZWw7CisgICAgICBhc3ltYm9sICpzeW07CisgICAgICBiZmRfdm1hIHN5bV92YWx1ZTsKKworICAgICAgcmVsID0gKnJlbG9jcysrOworICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7CisKKyAgICAgIC8qIENvbnZlcnQgYW55IHJlbG9jcyBhZ2FpbnN0IHRoZSAuYnNzIHNlY3Rpb24gaW50byByZWxvY3MKKyAgICAgICAgIGFnYWluc3QgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgICAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dGJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSwKKwkJICBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpID09IDApCisJeworCSAgYXNlY3Rpb24gKmRhdGFzZWM7CisKKwkgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLAorCQkJCQkgICAgIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOworCSAgaWYgKGRhdGFzZWMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHJlbC0+YWRkZW5kICs9IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRiZmQsCisJCQkJCQkgICBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCisJCQkgICAgICArIHN5bS0+dmFsdWUpOworCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBkYXRhc2VjLT5zeW1ib2xfcHRyX3B0cjsKKwkgICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKKwkgICAgfQorCX0KKworICAgICAgLyogV2UgbXVzdCBiZSBhYmxlIHRvIHJlc29sdmUgYWxsIFBDIHJlbGF0aXZlIHJlbG9jcyBhdCB0aGlzCisJIHBvaW50LiAgSWYgd2UgZ2V0IGEgYnJhbmNoIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2UgYnVpbGQgYQorCSBzdHViLCBzaW5jZSBOZXRXYXJlIHdpbGwgcmVzb2x2ZSB1bmRlZmluZWQgc3ltYm9scyBpbnRvIGEKKwkgcG9pbnRlciB0byBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICAqLworICAgICAgaWYgKHJlbC0+aG93dG8tPnBjX3JlbGF0aXZlKQorCXsKKwkgIC8qIFRoaXMgY2hlY2sgZm9yIHdoZXRoZXIgYSBzeW1ib2wgaXMgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcworCSAgICAgdGhlIHJlbG9jIHdpbGwgYmUgd3JvbmcgaWYgdGhlcmUgaXMgYSBQQyByZWxhdGl2ZSByZWxvYworCSAgICAgYmV0d2VlbiB0d28gc2VjdGlvbnMgYm90aCBvZiB3aGljaCB3ZXJlIHBsYWNlZCBpbiB0aGUKKwkgICAgIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KKwkgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgIT0gaW5zZWMtPm91dHB1dF9zZWN0aW9uKQorCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlc29sdmVkIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgJXNcbiIpLAorCQkgICAgIHByb2dyYW1fbmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiZmRfdm1hIHZhbDsKKworCSAgICAgIGFzc2VydCAocmVsLT5ob3d0by0+c2l6ZSA9PSAyICYmIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCk7CisJICAgICAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOworCSAgICAgIHZhbCA9ICgodmFsICZ+IHJlbC0+aG93dG8tPmRzdF9tYXNrKQorCQkgICAgIHwgKCgodmFsICYgcmVsLT5ob3d0by0+c3JjX21hc2spCisJCQkgKyAoc3ltLT52YWx1ZSAtIHJlbC0+YWRkcmVzcykKKwkJCSArIHJlbC0+YWRkZW5kKQorCQkJJiByZWwtPmhvd3RvLT5kc3RfbWFzaykpOworCSAgICAgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOworCisJICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGFuIHN0dWJiZWQgc3ltYm9sIGFuZCB0aGUKKwkJIG5leHQgaW5zdHJ1Y3Rpb24gaXMKKwkJICAgICBjcm9yIDMxLDMxLDMxCisJCSB0aGVuIHdlIHJlcGxhY2UgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gd2l0aAorCQkgICAgIGx3eiAgcjIsMjAocjEpCisJCSBUaGlzIHJlbG9hZHMgdGhlIFRPQyBwb2ludGVyIGFmdGVyIGEgc3R1YiBjYWxsLiAgKi8KKwkgICAgICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSA9PSAnLicKKwkJICAmJiAoc3ltLT5mbGFncyAmIEJTRl9EWU5BTUlDKSAhPSAwCisJCSAgJiYgKGJmZF9nZXRfMzIgKG91dGJmZCwKKwkJCQkgIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyArIDQpCisJCSAgICAgID09IDB4NGZmZmZiODIpKSAvKiBjcm9yIDMxLDMxLDMxICovCisJCWJmZF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIDB4ODA0MTAwMTQsIC8qIGx3eiByMiwyMChyMSkgKi8KKwkJCSAgICAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MgKyA0KTsKKworCSAgICAgIC0tKnJlbG9jX2NvdW50X3B0cjsKKwkgICAgICAtLXJlbG9jczsKKwkgICAgICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCisJCSAgICAgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKworICAgICAgLyogV2hlbiBjb25zaWRlcmluZyBhIFRPQyByZWxvYywgd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSB0aGUKKwkgc3ltYm9sIHZhbHVlLiAgVGhlIHN5bWJvbCB3aWxsIGJlIHN0YXJ0IG9mIHRoZSBUT0Mgc2VjdGlvbgorCSAod2hpY2ggaXMgbmFtZWQgLmdvdCkuICBXZSBkbyB3YW50IHRvIGluY2x1ZGUgdGhlIGFkZGVuZC4gICovCisgICAgICBpZiAocmVsLT5ob3d0byA9PSB0b2NfaG93dG8pCisJc3ltX3ZhbHVlID0gMDsKKyAgICAgIGVsc2UKKwlzeW1fdmFsdWUgPSBzeW0tPnZhbHVlOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIHdpdGggYSB2YWx1ZSwgb3IKKwkgdGhlcmUgaXMgYSByZWxvYyBhZGRlbmQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhZGRlbmQgaW4gdGhlCisJIG9iamVjdCBmaWxlLiAgKi8KKyAgICAgIGlmIChzeW1fdmFsdWUgKyByZWwtPmFkZGVuZCAhPSAwKQorCXsKKwkgIGJmZF92bWEgdmFsOworCisJICBzd2l0Y2ggKHJlbC0+aG93dG8tPnNpemUpCisJICAgIHsKKwkgICAgY2FzZSAxOgorCSAgICAgIHZhbCA9IGJmZF9nZXRfMTYgKG91dGJmZCwKKwkJCQkoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOworCSAgICAgIHZhbCA9ICgodmFsICZ+IHJlbC0+aG93dG8tPmRzdF9tYXNrKQorCQkgICAgIHwgKCgodmFsICYgcmVsLT5ob3d0by0+c3JjX21hc2spCisJCQkgKyBzeW1fdmFsdWUKKwkJCSArIHJlbC0+YWRkZW5kKQorCQkJJiByZWwtPmhvd3RvLT5kc3RfbWFzaykpOworCSAgICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIHZhbCA8IC0gMHg4MDAwCisJCSAgfHwgKGJmZF9zaWduZWRfdm1hKSB2YWwgPj0gMHg4MDAwKQorCQlmcHJpbnRmIChzdGRlcnIsCisJCQkgXygiJXM6IG92ZXJmbG93IHdoZW4gYWRqdXN0aW5nIHJlbG9jYXRpb24gYWdhaW5zdCAlc1xuIiksCisJCQkgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKKwkgICAgICBiZmRfcHV0XzE2IChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIDI6CisJICAgICAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLAorCQkJCShiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7CisJICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCisJCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKKwkJCSArIHN5bV92YWx1ZQorCQkJICsgcmVsLT5hZGRlbmQpCisJCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7CisJICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCisJICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyOworCSAgcmVsLT5hZGRlbmQgPSAwOworCX0KKworICAgICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpbmNvcnBvcmF0ZWQgdGhlIGFkZGVuZCwgcmVtb3ZlIGFueSBUT0MKKwkgcmVsb2NzLiAgKi8KKyAgICAgIGlmIChyZWwtPmhvd3RvID09IHRvY19ob3d0bykKKwl7CisJICAtLSpyZWxvY19jb3VudF9wdHI7CisJICAtLXJlbG9jczsKKwkgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKKwkJICAgKHNpemVfdCkgKChyZWxvY19jb3VudCAtIGkpICogc2l6ZW9mIChhcmVsZW50ICopKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHJlbC0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBOTE1DT05WX1BPV0VSUEMgKi8KKwwKKy8qIE5hbWUgb2YgbGlua2VyLiAgKi8KKyNpZm5kZWYgTERfTkFNRQorI2RlZmluZSBMRF9OQU1FICJsZCIKKyNlbmRpZgorCisvKiBUZW1wb3JhcnkgZmlsZSBuYW1lIGJhc2UuICAqLworc3RhdGljIGNoYXIgKnRlbXBfZmlsZW5hbWU7CisKKy8qIFRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgc2V2ZXJhbCBpbnB1dCBmaWxlcy4gIEludm9rZSB0aGUgbGlua2VyIHRvCisgICBsaW5rIHRoZW0gYWxsIHRvZ2V0aGVyLCBhbmQgY29udmVydCBhbmQgZGVsZXRlIHRoZSByZXN1bHRpbmcgb3V0cHV0CisgICBmaWxlLiAgKi8KKworc3RhdGljIGNoYXIgKgorbGlua19pbnB1dHMgKGlucHV0cywgbGQpCisgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW5wdXRzOworICAgICBjaGFyICpsZDsKK3sKKyAgc2l6ZV90IGM7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqcTsKKyAgY2hhciAqKmFyZ3Y7CisgIHNpemVfdCBpOworICBpbnQgcGlkOworICBpbnQgc3RhdHVzOworICBjaGFyICplcnJmbXQ7CisgIGNoYXIgKmVycmFyZzsKKworICBjID0gMDsKKyAgZm9yIChxID0gaW5wdXRzOyBxICE9IE5VTEw7IHEgPSBxLT5uZXh0KQorICAgICsrYzsKKworICBhcmd2ID0gKGNoYXIgKiopIGFsbG9jYSAoKGMgKyA1KSAqIHNpemVvZihjaGFyICopKTsKKworI2lmbmRlZiBfX01TRE9TX18KKyAgaWYgKGxkID09IE5VTEwpCisgICAgeworICAgICAgY2hhciAqcDsKKworICAgICAgLyogRmluZCB0aGUgbGlua2VyIHRvIGludm9rZSBiYXNlZCBvbiBob3cgbmxtY29udiB3YXMgcnVuLiAgKi8KKyAgICAgIHAgPSBwcm9ncmFtX25hbWUgKyBzdHJsZW4gKHByb2dyYW1fbmFtZSk7CisgICAgICB3aGlsZSAocCAhPSBwcm9ncmFtX25hbWUpCisJeworCSAgaWYgKHBbLTFdID09ICcvJykKKwkgICAgeworCSAgICAgIGxkID0gKGNoYXIgKikgeG1hbGxvYyAocCAtIHByb2dyYW1fbmFtZSArIHN0cmxlbiAoTERfTkFNRSkgKyAxKTsKKwkgICAgICBtZW1jcHkgKGxkLCBwcm9ncmFtX25hbWUsIHAgLSBwcm9ncmFtX25hbWUpOworCSAgICAgIHN0cmNweSAobGQgKyAocCAtIHByb2dyYW1fbmFtZSksIExEX05BTUUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAtLXA7CisJfQorICAgIH0KKyNlbmRpZgorCisgIGlmIChsZCA9PSBOVUxMKQorICAgIGxkID0gKGNoYXIgKikgTERfTkFNRTsKKworICB0ZW1wX2ZpbGVuYW1lID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKKworICB1bmxpbmtfb25fZXhpdCA9IHhtYWxsb2MgKHN0cmxlbiAodGVtcF9maWxlbmFtZSkgKyAzKTsKKyAgc3ByaW50ZiAodW5saW5rX29uX2V4aXQsICIlcy5PIiwgdGVtcF9maWxlbmFtZSk7CisKKyAgYXJndlswXSA9IGxkOworICBhcmd2WzFdID0gKGNoYXIgKikgIi1VciI7CisgIGFyZ3ZbMl0gPSAoY2hhciAqKSAiLW8iOworICBhcmd2WzNdID0gdW5saW5rX29uX2V4aXQ7CisgIGkgPSA0OworICBmb3IgKHEgPSBpbnB1dHM7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQsIGkrKykKKyAgICBhcmd2W2ldID0gcS0+c3RyaW5nOworICBhcmd2W2ldID0gTlVMTDsKKworICBpZiAoZGVidWcpCisgICAgeworICAgICAgZm9yIChpID0gMDsgYXJndltpXSAhPSBOVUxMOyBpKyspCisJZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgYXJndltpXSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKworICBwaWQgPSBwZXhlY3V0ZSAobGQsIGFyZ3YsIHByb2dyYW1fbmFtZSwgKGNoYXIgKikgTlVMTCwgJmVycmZtdCwgJmVycmFyZywKKwkJICBQRVhFQ1VURV9TRUFSQ0ggfCBQRVhFQ1VURV9PTkUpOworICBpZiAocGlkID09IC0xKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGV4ZWN1dGlvbiBvZiAlcyBmYWlsZWQ6ICIpLCBwcm9ncmFtX25hbWUsIGxkKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgZXJyZm10LCBlcnJhcmcpOworICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHB3YWl0IChwaWQsICZzdGF0dXMsIDApIDwgMCkKKyAgICB7CisgICAgICBwZXJyb3IgKCJwd2FpdCIpOworICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IEV4ZWN1dGlvbiBvZiAlcyBmYWlsZWRcbiIpLCBwcm9ncmFtX25hbWUsIGxkKTsKKyAgICAgIHVubGluayAodW5saW5rX29uX2V4aXQpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIHJldHVybiB1bmxpbmtfb25fZXhpdDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25sbWNvbnYuaCBiL2JpbnV0aWxzL25sbWNvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJhNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvbmxtY29udi5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIG5sbWNvbnYuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCisgICBiZmQuaCwgbmxtL2NvbW1vbi5oIGFuZCBubG0vaW50ZXJuYWwuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzCisgICBmaWxlLiAgKi8KKworLyogQSBsaW5rZWQgbGlzdCBvZiBzdHJpbmdzLiAgKi8KKworc3RydWN0IHN0cmluZ19saXN0Cit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV4dDsKKyAgY2hhciAqc3RyaW5nOworfTsKKworLyogVGhlIE5MTSBoZWFkZXIgcGFyc2VyIGluIG5sbWhlYWRlci55IHN0b3JlcyBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgIGZvbGxvd2luZyB2YXJpYWJsZXMuICAqLworCitleHRlcm4gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZml4ZWRfaGRyOworZXh0ZXJuIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7CitleHRlcm4gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyICp2ZXJzaW9uX2hkcjsKK2V4dGVybiBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciAqY29weXJpZ2h0X2hkcjsKK2V4dGVybiBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7CisKKy8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCitleHRlcm4gY2hhciAqY2hlY2tfcHJvY2VkdXJlOworLyogRmlsZSBuYW1lZCBieSBDVVNUT00uICAqLworZXh0ZXJuIGNoYXIgKmN1c3RvbV9maWxlOworLyogV2hldGhlciB0byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKERFQlVHKS4gICovCitleHRlcm4gYm9vbGVhbiBkZWJ1Z19pbmZvOworLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLworZXh0ZXJuIGNoYXIgKmV4aXRfcHJvY2VkdXJlOworLyogRXhwb3J0ZWQgc3ltYm9scyAoRVhQT1JUKS4gICovCitleHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICpleHBvcnRfc3ltYm9sczsKKy8qIExpc3Qgb2YgZmlsZXMgZnJvbSBJTlBVVC4gICovCitleHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKKy8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLworZXh0ZXJuIGNoYXIgKm1hcF9maWxlOworLyogV2hldGhlciBhIGZ1bGwgbWFwIGhhcyBiZWVuIHJlcXVlc3RlZCAoRlVMTE1BUCkuICAqLworZXh0ZXJuIGJvb2xlYW4gZnVsbF9tYXA7CisvKiBGaWxlIG5hbWVkIGJ5IEhFTFAuICAqLworZXh0ZXJuIGNoYXIgKmhlbHBfZmlsZTsKKy8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLworZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW1wb3J0X3N5bWJvbHM7CisvKiBGaWxlIG5hbWVkIGJ5IE1FU1NBR0VTLiAgKi8KK2V4dGVybiBjaGFyICptZXNzYWdlX2ZpbGU7CisvKiBBdXRvbG9hZCBtb2R1bGUgbGlzdCAoTU9EVUxFKS4gICovCitleHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOworLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLworZXh0ZXJuIGNoYXIgKm91dHB1dF9maWxlOworLyogRmlsZSBuYW1lZCBieSBTSEFSRUxJQi4gICovCitleHRlcm4gY2hhciAqc2hhcmVsaWJfZmlsZTsKKy8qIFN0YXJ0IHByb2NlZHVyZSBuYW1lIChTVEFSVCkuICAqLworZXh0ZXJuIGNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKKy8qIFZFUkJPU0UuICAqLworZXh0ZXJuIGJvb2xlYW4gdmVyYm9zZTsKKy8qIFJQQyBkZXNjcmlwdGlvbiBmaWxlIChYRENEQVRBKS4gICovCitleHRlcm4gY2hhciAqcnBjX2ZpbGU7CisKKy8qIFRoZSBudW1iZXIgb2Ygc2VyaW91cyBwYXJzZSBlcnJvcnMuICAqLworZXh0ZXJuIGludCBwYXJzZV9lcnJvcnM7CisKKy8qIFRoZSBwYXJzZXIuICAqLworZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKKworLyogVGVsbCB0aGUgbGV4ZXIgd2hhdCBmaWxlIHRvIHJlYWQuICAqLworZXh0ZXJuIGJvb2xlYW4gbmxtbGV4X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1oZWFkZXIueSBiL2JpbnV0aWxzL25sbWhlYWRlci55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWUyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9ubG1oZWFkZXIueQpAQCAtMCwwICsxLDk3OCBAQAorJXsvKiBubG1oZWFkZXIueSAtIHBhcnNlIE5MTSBoZWFkZXIgc3BlY2lmaWNhdGlvbiBrZXl3b3Jkcy4KKyAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCisgICBUaGlzIGJpc29uIGZpbGUgcGFyc2VzIHRoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBOZXRXYXJlIE5MTQorICAgbGlua2VyLCBleGNlcHQgZm9yIGxpc3RzIG9mIG9iamVjdCBmaWxlcy4gIEl0IHN0b3JlcyB0aGUKKyAgIGluZm9ybWF0aW9uIGluIGdsb2JhbCB2YXJpYWJsZXMuCisKKyAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBOZXRXYXJlIFRvb2wKKyAgIE1ha2VyIFNwZWNpZmljYXRpb24gbWFudWFsLCBlZGl0aW9uIDEuMC4gICovCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJubG0vY29tbW9uLmgiCisjaW5jbHVkZSAibmxtL2ludGVybmFsLmgiCisjaW5jbHVkZSAibmxtY29udi5oIgorCisvKiBJbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHN0cnVjdHVyZXMgcG9pbnRlZCB0byBieSB0aGVzZQorICAgdmFyaWFibGVzLiAgKi8KKworTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZml4ZWRfaGRyOworTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciAqdmFyX2hkcjsKK05sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlciAqdmVyc2lvbl9oZHI7CitObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciAqY29weXJpZ2h0X2hkcjsKK05sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgKmV4dGVuZGVkX2hkcjsKKworLyogUHJvY2VkdXJlIG5hbWVkIGJ5IENIRUNLLiAgKi8KK2NoYXIgKmNoZWNrX3Byb2NlZHVyZTsKKy8qIEZpbGUgbmFtZWQgYnkgQ1VTVE9NLiAgKi8KK2NoYXIgKmN1c3RvbV9maWxlOworLyogV2hldGhlciB0byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKERFQlVHKS4gICovCitib29sZWFuIGRlYnVnX2luZm87CisvKiBQcm9jZWR1cmUgbmFtZWQgYnkgRVhJVC4gICovCitjaGFyICpleGl0X3Byb2NlZHVyZTsKKy8qIEV4cG9ydGVkIHN5bWJvbHMgKEVYUE9SVCkuICAqLworc3RydWN0IHN0cmluZ19saXN0ICpleHBvcnRfc3ltYm9sczsKKy8qIExpc3Qgb2YgZmlsZXMgZnJvbSBJTlBVVC4gICovCitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmlucHV0X2ZpbGVzOworLyogTWFwIGZpbGUgbmFtZSAoTUFQLCBGVUxMTUFQKS4gICovCitjaGFyICptYXBfZmlsZTsKKy8qIFdoZXRoZXIgYSBmdWxsIG1hcCBoYXMgYmVlbiByZXF1ZXN0ZWQgKEZVTExNQVApLiAgKi8KK2Jvb2xlYW4gZnVsbF9tYXA7CisvKiBGaWxlIG5hbWVkIGJ5IEhFTFAuICAqLworY2hhciAqaGVscF9maWxlOworLyogSW1wb3J0ZWQgc3ltYm9scyAoSU1QT1JUKS4gICovCitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmltcG9ydF9zeW1ib2xzOworLyogRmlsZSBuYW1lZCBieSBNRVNTQUdFUy4gICovCitjaGFyICptZXNzYWdlX2ZpbGU7CisvKiBBdXRvbG9hZCBtb2R1bGUgbGlzdCAoTU9EVUxFKS4gICovCitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm1vZHVsZXM7CisvKiBGaWxlIG5hbWVkIGJ5IE9VVFBVVC4gICovCitjaGFyICpvdXRwdXRfZmlsZTsKKy8qIEZpbGUgbmFtZWQgYnkgU0hBUkVMSUIuICAqLworY2hhciAqc2hhcmVsaWJfZmlsZTsKKy8qIFN0YXJ0IHByb2NlZHVyZSBuYW1lIChTVEFSVCkuICAqLworY2hhciAqc3RhcnRfcHJvY2VkdXJlOworLyogVkVSQk9TRS4gICovCitib29sZWFuIHZlcmJvc2U7CisvKiBSUEMgZGVzY3JpcHRpb24gZmlsZSAoWERDREFUQSkuICAqLworY2hhciAqcnBjX2ZpbGU7CisKKy8qIFRoZSBudW1iZXIgb2Ygc2VyaW91cyBlcnJvcnMgdGhhdCBoYXZlIG9jY3VycmVkLiAgKi8KK2ludCBwYXJzZV9lcnJvcnM7CisKKy8qIFRoZSBjdXJyZW50IHN5bWJvbCBwcmVmaXggd2hlbiByZWFkaW5nIGEgbGlzdCBvZiBpbXBvcnQgb3IgZXhwb3J0CisgICBzeW1ib2xzLiAgKi8KK3N0YXRpYyBjaGFyICpzeW1ib2xfcHJlZml4OworCisvKiBQYXJzZXIgZXJyb3IgbWVzc2FnZSBoYW5kbGVyLiAgKi8KKyNkZWZpbmUgeXllcnJvcihtc2cpIG5sbWhlYWRlcl9lcnJvciAobXNnKTsKKworLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbmxtbGV4X2ZpbGVfcHVzaCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIG5sbWxleF9maWxlX29wZW4gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IG5sbWxleF9idWZfaW5pdCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgY2hhciBubG1sZXhfYnVmX2FkZCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBsb25nIG5sbWxleF9nZXRfbnVtYmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgbmxtaGVhZGVyX2lkZW50aWZ5IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIG5sbWhlYWRlcl93YXJuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBubG1oZWFkZXJfZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICogc3RyaW5nX2xpc3RfY29ucyBQQVJBTVMgKChjaGFyICosCisJCQkJCQkgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikpOworc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2FwcGVuZCBQQVJBTVMgKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiwKKwkJCQkJCQlzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikpOworc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2FwcGVuZDEgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosCisJCQkJCQkJIGNoYXIgKikpOworc3RhdGljIGNoYXIgKnhzdHJkdXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKyV9CisKKyV1bmlvbgoreworICBjaGFyICpzdHJpbmc7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdDsKK307CisKKy8qIFRoZSByZXNlcnZlZCB3b3Jkcy4gICovCisKKyV0b2tlbiBDSEVDSyBDT0RFU1RBUlQgQ09QWVJJR0hUIENVU1RPTSBEQVRFIERFQlVHIERFU0NSSVBUSU9OIEVYSVQKKyV0b2tlbiBFWFBPUlQgRkxBR19PTiBGTEFHX09GRiBGVUxMTUFQIEhFTFAgSU1QT1JUIElOUFVUIE1BUCBNRVNTQUdFUworJXRva2VuIE1PRFVMRSBNVUxUSVBMRSBPU19ET01BSU4gT1VUUFVUIFBTRVVET1BSRUVNUFRJT04gUkVFTlRSQU5UCisldG9rZW4gU0NSRUVOTkFNRSBTSEFSRUxJQiBTVEFDSyBTVEFSVCBTWU5DSFJPTklaRQorJXRva2VuIFRIUkVBRE5BTUUgVFlQRSBWRVJCT1NFIFZFUlNJT05LIFhEQ0RBVEEKKworLyogQXJndW1lbnRzLiAgKi8KKworJXRva2VuIDxzdHJpbmc+IFNUUklORworJXRva2VuIDxzdHJpbmc+IFFVT1RFRF9TVFJJTkcKKworLyogVHlwZWQgbm9uLXRlcm1pbmFscy4gICovCisldHlwZSA8bGlzdD4gc3ltYm9sX2xpc3Rfb3B0IHN5bWJvbF9saXN0IHN0cmluZ19saXN0CisldHlwZSA8c3RyaW5nPiBzeW1ib2wKKworJSUKKworLyogS2V5d29yZHMgbXVzdCBzdGFydCBpbiB0aGUgbGVmdG1vc3QgY29sdW1uIG9mIHRoZSBmaWxlLiAgQXJndW1lbnRzCisgICBtYXkgYXBwZWFyIGFueXdoZXJlIGVsc2UuICBUaGUgbGV4ZXIgdXNlcyB0aGlzIHRvIGRldGVybWluZSB3aGF0CisgICB0b2tlbiB0byByZXR1cm4sIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQgaGVyZS4gICovCisKKy8qIFRoZSBlbnRpcmUgZmlsZSBpcyBqdXN0IGEgbGlzdCBvZiBjb21tYW5kcy4gICovCisKK2ZpbGU6CQorCSAgY29tbWFuZHMKKwk7CisKKy8qIEEgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBjb21tYW5kcy4gICovCisKK2NvbW1hbmRzOgorCSAgLyogTWF5IGJlIGVtcHR5LiAgKi8KKwl8IGNvbW1hbmQgY29tbWFuZHMKKwk7CisKKy8qIEEgc2luZ2xlIGNvbW1hbmQuICBUaGVyZSBpcyB3aGVyZSBtb3N0IG9mIHRoZSB3b3JrIHRha2VzIHBsYWNlLiAgKi8KKworY29tbWFuZDoKKwkgIENIRUNLIFNUUklORworCSAgeworCSAgICBjaGVja19wcm9jZWR1cmUgPSAkMjsKKwkgIH0KKwl8IENPREVTVEFSVCBTVFJJTkcKKwkgIHsKKwkgICAgbmxtaGVhZGVyX3dhcm4gKF8oIkNPREVTVEFSVCBpcyBub3QgaW1wbGVtZW50ZWQ7IHNvcnJ5IiksIC0xKTsKKwkgICAgZnJlZSAoJDIpOworCSAgfQorCXwgQ09QWVJJR0hUIFFVT1RFRF9TVFJJTkcKKwkgIHsKKwkgICAgaW50IGxlbjsKKworCSAgICBzdHJuY3B5IChjb3B5cmlnaHRfaGRyLT5zdGFtcCwgIkNvUHlSaUdoVD0iLCAxMCk7CisJICAgIGxlbiA9IHN0cmxlbiAoJDIpOworCSAgICBpZiAobGVuID49IE5MTV9NQVhfQ09QWVJJR0hUX01FU1NBR0VfTEVOR1RIKQorCSAgICAgIHsKKwkJbmxtaGVhZGVyX3dhcm4gKF8oImNvcHlyaWdodCBzdHJpbmcgaXMgdG9vIGxvbmciKSwKKwkJCQlOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCAtIDEpOworCQlsZW4gPSBOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCAtIDE7CisJICAgICAgfQorCSAgICBjb3B5cmlnaHRfaGRyLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoID0gbGVuOworCSAgICBzdHJuY3B5IChjb3B5cmlnaHRfaGRyLT5jb3B5cmlnaHRNZXNzYWdlLCAkMiwgbGVuKTsKKwkgICAgY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZVtsZW5dID0gJ1wwJzsKKwkgICAgZnJlZSAoJDIpOworCSAgfQorCXwgQ1VTVE9NIFNUUklORworCSAgeworCSAgICBjdXN0b21fZmlsZSA9ICQyOworCSAgfQorCXwgREFURSBTVFJJTkcgU1RSSU5HIFNUUklORworCSAgeworCSAgICAvKiBXZSBkb24ndCBzZXQgdGhlIHZlcnNpb24gc3RhbXAgaGVyZSwgYmVjYXVzZSB3ZSB1c2UgdGhlCisJICAgICAgIHZlcnNpb24gc3RhbXAgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHJlcXVpcmVkIFZFUlNJT04KKwkgICAgICAga2V5d29yZCB3YXMgZ2l2ZW4uICAqLworCSAgICB2ZXJzaW9uX2hkci0+bW9udGggPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOworCSAgICB2ZXJzaW9uX2hkci0+ZGF5ID0gbmxtbGV4X2dldF9udW1iZXIgKCQzKTsKKwkgICAgdmVyc2lvbl9oZHItPnllYXIgPSBubG1sZXhfZ2V0X251bWJlciAoJDQpOworCSAgICBmcmVlICgkMik7CisJICAgIGZyZWUgKCQzKTsKKwkgICAgZnJlZSAoJDQpOworCSAgICBpZiAodmVyc2lvbl9oZHItPm1vbnRoIDwgMSB8fCB2ZXJzaW9uX2hkci0+bW9udGggPiAxMikKKwkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCBtb250aCIpLCAtMSk7CisJICAgIGlmICh2ZXJzaW9uX2hkci0+ZGF5IDwgMSB8fCB2ZXJzaW9uX2hkci0+ZGF5ID4gMzEpCisJICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgZGF5IiksIC0xKTsKKwkgICAgaWYgKHZlcnNpb25faGRyLT55ZWFyIDwgMTkwMCB8fCB2ZXJzaW9uX2hkci0+eWVhciA+IDMwMDApCisJICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgeWVhciIpLCAtMSk7CisJICB9CisJfCBERUJVRworCSAgeworCSAgICBkZWJ1Z19pbmZvID0gdHJ1ZTsKKwkgIH0KKwl8IERFU0NSSVBUSU9OIFFVT1RFRF9TVFJJTkcKKwkgIHsKKwkgICAgaW50IGxlbjsKKworCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKKwkgICAgaWYgKGxlbiA+IE5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIKQorCSAgICAgIHsKKwkJbmxtaGVhZGVyX3dhcm4gKF8oImRlc2NyaXB0aW9uIHN0cmluZyBpcyB0b28gbG9uZyIpLAorCQkJCU5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIKTsKKwkJbGVuID0gTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEg7CisJICAgICAgfQorCSAgICB2YXJfaGRyLT5kZXNjcmlwdGlvbkxlbmd0aCA9IGxlbjsKKwkgICAgc3RybmNweSAodmFyX2hkci0+ZGVzY3JpcHRpb25UZXh0LCAkMiwgbGVuKTsKKwkgICAgdmFyX2hkci0+ZGVzY3JpcHRpb25UZXh0W2xlbl0gPSAnXDAnOworCSAgICBmcmVlICgkMik7CisJICB9CisJfCBFWElUIFNUUklORworCSAgeworCSAgICBleGl0X3Byb2NlZHVyZSA9ICQyOworCSAgfQorCXwgRVhQT1JUCisJICB7CisJICAgIHN5bWJvbF9wcmVmaXggPSBOVUxMOworCSAgfQorCSAgc3ltYm9sX2xpc3Rfb3B0CisJICB7CisJICAgIGV4cG9ydF9zeW1ib2xzID0gc3RyaW5nX2xpc3RfYXBwZW5kIChleHBvcnRfc3ltYm9scywgJDMpOworCSAgfQorCXwgRkxBR19PTiBTVFJJTkcKKwkgIHsKKwkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSBubG1sZXhfZ2V0X251bWJlciAoJDIpOworCSAgICBmcmVlICgkMik7CisJICB9CisJfCBGTEFHX09GRiBTVFJJTkcKKwkgIHsKKwkgICAgZml4ZWRfaGRyLT5mbGFncyAmPX4gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKKwkgICAgZnJlZSAoJDIpOworCSAgfQorCXwgRlVMTE1BUAorCSAgeworCSAgICBtYXBfZmlsZSA9ICIiOworCSAgICBmdWxsX21hcCA9IHRydWU7CisJICB9CisJfCBGVUxMTUFQIFNUUklORworCSAgeworCSAgICBtYXBfZmlsZSA9ICQyOworCSAgICBmdWxsX21hcCA9IHRydWU7CisJICB9CisJfCBIRUxQIFNUUklORworCSAgeworCSAgICBoZWxwX2ZpbGUgPSAkMjsKKwkgIH0KKwl8IElNUE9SVAorCSAgeworCSAgICBzeW1ib2xfcHJlZml4ID0gTlVMTDsKKwkgIH0KKwkgIHN5bWJvbF9saXN0X29wdAorCSAgeworCSAgICBpbXBvcnRfc3ltYm9scyA9IHN0cmluZ19saXN0X2FwcGVuZCAoaW1wb3J0X3N5bWJvbHMsICQzKTsKKwkgIH0KKwl8IElOUFVUIHN0cmluZ19saXN0CisJICB7CisJICAgIGlucHV0X2ZpbGVzID0gc3RyaW5nX2xpc3RfYXBwZW5kIChpbnB1dF9maWxlcywgJDIpOworCSAgfQorCXwgTUFQCisJICB7CisJICAgIG1hcF9maWxlID0gIiI7CisJICB9CisJfCBNQVAgU1RSSU5HCisJICB7CisJICAgIG1hcF9maWxlID0gJDI7CisJICB9CisJfCBNRVNTQUdFUyBTVFJJTkcKKwkgIHsKKwkgICAgbWVzc2FnZV9maWxlID0gJDI7CisJICB9CisJfCBNT0RVTEUgc3RyaW5nX2xpc3QKKwkgIHsKKwkgICAgbW9kdWxlcyA9IHN0cmluZ19saXN0X2FwcGVuZCAobW9kdWxlcywgJDIpOworCSAgfQorCXwgTVVMVElQTEUKKwkgIHsKKwkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDI7CisJICB9CisJfCBPU19ET01BSU4KKwkgIHsKKwkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDEwOworCSAgfQorCXwgT1VUUFVUIFNUUklORworCSAgeworCSAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKKwkgICAgICBvdXRwdXRfZmlsZSA9ICQyOworCSAgICBlbHNlCisJICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlnbm9yaW5nIGR1cGxpY2F0ZSBPVVRQVVQgc3RhdGVtZW50IiksIC0xKTsKKwkgIH0KKwl8IFBTRVVET1BSRUVNUFRJT04KKwkgIHsKKwkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDg7CisJICB9CisJfCBSRUVOVFJBTlQKKwkgIHsKKwkgICAgZml4ZWRfaGRyLT5mbGFncyB8PSAweDE7CisJICB9CisJfCBTQ1JFRU5OQU1FIFFVT1RFRF9TVFJJTkcKKwkgIHsKKwkgICAgaW50IGxlbjsKKworCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKKwkgICAgaWYgKGxlbiA+PSBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCkKKwkgICAgICB7CisJCW5sbWhlYWRlcl93YXJuIChfKCJzY3JlZW4gbmFtZSBpcyB0b28gbG9uZyIpLAorCQkJCU5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIKTsKKwkJbGVuID0gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEg7CisJICAgICAgfQorCSAgICB2YXJfaGRyLT5zY3JlZW5OYW1lTGVuZ3RoID0gbGVuOworCSAgICBzdHJuY3B5ICh2YXJfaGRyLT5zY3JlZW5OYW1lLCAkMiwgbGVuKTsKKwkgICAgdmFyX2hkci0+c2NyZWVuTmFtZVtOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSF0gPSAnXDAnOworCSAgICBmcmVlICgkMik7CisJICB9CisJfCBTSEFSRUxJQiBTVFJJTkcKKwkgIHsKKwkgICAgc2hhcmVsaWJfZmlsZSA9ICQyOworCSAgfQorCXwgU1RBQ0sgU1RSSU5HCisJICB7CisJICAgIHZhcl9oZHItPnN0YWNrU2l6ZSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7CisJICAgIGZyZWUgKCQyKTsKKwkgIH0KKwl8IFNUQVJUIFNUUklORworCSAgeworCSAgICBzdGFydF9wcm9jZWR1cmUgPSAkMjsKKwkgIH0KKwl8IFNZTkNIUk9OSVpFCisJICB7CisJICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHg0OworCSAgfQorCXwgVEhSRUFETkFNRSBRVU9URURfU1RSSU5HCisJICB7CisJICAgIGludCBsZW47CisKKwkgICAgbGVuID0gc3RybGVuICgkMik7CisJICAgIGlmIChsZW4gPj0gTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgpCisJICAgICAgeworCQlubG1oZWFkZXJfd2FybiAoXygidGhyZWFkIG5hbWUgaXMgdG9vIGxvbmciKSwKKwkJCQlOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCk7CisJCWxlbiA9IE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RIOworCSAgICAgIH0KKwkgICAgdmFyX2hkci0+dGhyZWFkTmFtZUxlbmd0aCA9IGxlbjsKKwkgICAgc3RybmNweSAodmFyX2hkci0+dGhyZWFkTmFtZSwgJDIsIGxlbik7CisJICAgIHZhcl9oZHItPnRocmVhZE5hbWVbbGVuXSA9ICdcMCc7CisJICAgIGZyZWUgKCQyKTsKKwkgIH0KKwl8IFRZUEUgU1RSSU5HCisJICB7CisJICAgIGZpeGVkX2hkci0+bW9kdWxlVHlwZSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7CisJICAgIGZyZWUgKCQyKTsKKwkgIH0KKwl8IFZFUkJPU0UKKwkgIHsKKwkgICAgdmVyYm9zZSA9IHRydWU7CisJICB9CisJfCBWRVJTSU9OSyBTVFJJTkcgU1RSSU5HIFNUUklORworCSAgeworCSAgICBsb25nIHZhbDsKKworCSAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOworCSAgICB2ZXJzaW9uX2hkci0+bWFqb3JWZXJzaW9uID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKKwkgICAgdmFsID0gbmxtbGV4X2dldF9udW1iZXIgKCQzKTsKKwkgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gOTkpCisJICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbWlub3IgdmVyc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCA5OSkiKSwKKwkJCSAgICAgIC0xKTsKKwkgICAgZWxzZQorCSAgICAgIHZlcnNpb25faGRyLT5taW5vclZlcnNpb24gPSB2YWw7CisJICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkNCk7CisJICAgIGlmICh2YWwgPCAwKQorCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIHJldmlzaW9uIG51bWJlciAobXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI2KSIpLAorCQkJICAgICAgLTEpOworCSAgICBlbHNlIGlmICh2YWwgPiAyNikKKwkgICAgICB2ZXJzaW9uX2hkci0+cmV2aXNpb24gPSAwOworCSAgICBlbHNlCisJICAgICAgdmVyc2lvbl9oZHItPnJldmlzaW9uID0gdmFsOworCSAgICBmcmVlICgkMik7CisJICAgIGZyZWUgKCQzKTsKKwkgICAgZnJlZSAoJDQpOworCSAgfQorCXwgVkVSU0lPTksgU1RSSU5HIFNUUklORworCSAgeworCSAgICBsb25nIHZhbDsKKworCSAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOworCSAgICB2ZXJzaW9uX2hkci0+bWFqb3JWZXJzaW9uID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKKwkgICAgdmFsID0gbmxtbGV4X2dldF9udW1iZXIgKCQzKTsKKwkgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gOTkpCisJICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbWlub3IgdmVyc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCA5OSkiKSwKKwkJCSAgICAgIC0xKTsKKwkgICAgZWxzZQorCSAgICAgIHZlcnNpb25faGRyLT5taW5vclZlcnNpb24gPSB2YWw7CisJICAgIHZlcnNpb25faGRyLT5yZXZpc2lvbiA9IDA7CisJICAgIGZyZWUgKCQyKTsKKwkgICAgZnJlZSAoJDMpOworCSAgfQorCXwgWERDREFUQSBTVFJJTkcKKwkgIHsKKwkgICAgcnBjX2ZpbGUgPSAkMjsKKwkgIH0KKwk7CisKKy8qIEEgcG9zc2libHkgZW1wdHkgbGlzdCBvZiBzeW1ib2xzLiAgKi8KKworc3ltYm9sX2xpc3Rfb3B0OgorCSAgLyogRW1wdHkuICAqLworCSAgeworCSAgICAkJCA9IE5VTEw7CisJICB9CisJfCBzeW1ib2xfbGlzdAorCSAgeworCSAgICAkJCA9ICQxOworCSAgfQorCTsKKworLyogQSBsaXN0IG9mIHN5bWJvbHMgaW4gYW4gaW1wb3J0IG9yIGV4cG9ydCBsaXN0LiAgUHJlZml4ZXMgbWF5IGFwcGVhcgorICAgaW4gcGFyZW50aGVzZXMuICBXZSBuZWVkIHRvIHVzZSBsZWZ0IHJlY3Vyc2lvbiBoZXJlIHRvIGF2b2lkCisgICBidWlsZGluZyB1cCBhIGxhcmdlIGltcG9ydCBsaXN0IG9uIHRoZSBwYXJzZXIgc3RhY2suICAqLworCitzeW1ib2xfbGlzdDoKKwkgIHN5bWJvbAorCSAgeworCSAgICAkJCA9IHN0cmluZ19saXN0X2NvbnMgKCQxLCBOVUxMKTsKKwkgIH0KKwl8IHN5bWJvbF9wcmVmaXgKKwkgIHsKKwkgICAgJCQgPSBOVUxMOworCSAgfQorCXwgc3ltYm9sX2xpc3Qgc3ltYm9sCisJICB7CisJICAgICQkID0gc3RyaW5nX2xpc3RfYXBwZW5kMSAoJDEsICQyKTsKKwkgIH0KKwl8IHN5bWJvbF9saXN0IHN5bWJvbF9wcmVmaXgKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwk7CisKKy8qIEEgcHJlZml4IGZvciBzdWJzZXF1ZW50IHN5bWJvbHMuICAqLworCitzeW1ib2xfcHJlZml4OgorCSAgJygnIFNUUklORyAnKScKKwkgIHsKKwkgICAgaWYgKHN5bWJvbF9wcmVmaXggIT0gTlVMTCkKKwkgICAgICBmcmVlIChzeW1ib2xfcHJlZml4KTsKKwkgICAgc3ltYm9sX3ByZWZpeCA9ICQyOworCSAgfQorCTsKKworLyogQSBzaW5nbGUgc3ltYm9sLiAgKi8KKworc3ltYm9sOgorCSAgU1RSSU5HCisJICB7CisJICAgIGlmIChzeW1ib2xfcHJlZml4ID09IE5VTEwpCisJICAgICAgJCQgPSAkMTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJJCQgPSB4bWFsbG9jIChzdHJsZW4gKHN5bWJvbF9wcmVmaXgpICsgc3RybGVuICgkMSkgKyAyKTsKKwkJc3ByaW50ZiAoJCQsICIlc0AlcyIsIHN5bWJvbF9wcmVmaXgsICQxKTsKKwkJZnJlZSAoJDEpOworCSAgICAgIH0KKwkgIH0KKwk7CisKKy8qIEEgbGlzdCBvZiBzdHJpbmdzLiAgKi8KKworc3RyaW5nX2xpc3Q6CisJICAvKiBNYXkgYmUgZW1wdHkuICAqLworCSAgeworCSAgICAkJCA9IE5VTEw7CisJICB9CisJfCBTVFJJTkcgc3RyaW5nX2xpc3QKKwkgIHsKKwkgICAgJCQgPSBzdHJpbmdfbGlzdF9jb25zICgkMSwgJDIpOworCSAgfQorCTsKKworJSUKKworLyogSWYgc3RyZXJyb3IgaXMganVzdCBhIG1hY3JvLCB3ZSB3YW50IHRvIHVzZSB0aGUgb25lIGZyb20gbGliaWJlcnR5CisgICBzaW5jZSBpdCB3aWxsIGhhbmRsZSB1bmRlZmluZWQgdmFsdWVzLiAgKi8KKyN1bmRlZiBzdHJlcnJvcgorZXh0ZXJuIGNoYXIgKnN0cmVycm9yICgpOworCisvKiBUaGUgbGV4ZXIgaXMgc2ltcGxlLCB0b28gc2ltcGxlIGZvciBmbGV4LiAgS2V5d29yZHMgYXJlIG9ubHkKKyAgIHJlY29nbml6ZWQgYXQgdGhlIHN0YXJ0IG9mIGxpbmVzLiAgRXZlcnl0aGluZyBlbHNlIG11c3QgYmUgYW4KKyAgIGFyZ3VtZW50LiAgQSBjb21tYSBpcyB0cmVhdGVkIGFzIHdoaXRlc3BhY2UuICAqLworCisvKiBUaGUgc3RhdGVzIHRoZSBsZXhlciBjYW4gYmUgaW4uICAqLworCitlbnVtIGxleF9zdGF0ZQoreworICAvKiBBdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCisgIEJFR0lOTklOR19PRl9MSU5FLAorICAvKiBJbiB0aGUgbWlkZGxlIG9mIGEgbGluZS4gICovCisgIElOX0xJTkUKK307CisKKy8qIFdlIG5lZWQgdG8ga2VlcCBhIHN0YWNrIG9mIGZpbGVzIHRvIGhhbmRsZSBmaWxlIGluY2x1c2lvbi4gICovCisKK3N0cnVjdCBpbnB1dAoreworICAvKiBUaGUgZmlsZSB0byByZWFkIGZyb20uICAqLworICBGSUxFICpmaWxlOworICAvKiBUaGUgbmFtZSBvZiB0aGUgZmlsZS4gICovCisgIGNoYXIgKm5hbWU7CisgIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAgKi8KKyAgaW50IGxpbmVubzsKKyAgLyogVGhlIGN1cnJlbnQgc3RhdGUuICAqLworICBlbnVtIGxleF9zdGF0ZSBzdGF0ZTsKKyAgLyogVGhlIG5leHQgZmlsZSBvbiB0aGUgc3RhY2suICAqLworICBzdHJ1Y3QgaW5wdXQgKm5leHQ7Cit9OworCisvKiBUaGUgY3VycmVudCBpbnB1dCBmaWxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBpbnB1dCBjdXJyZW50OworCisvKiBUaGUgY2hhcmFjdGVyIHdoaWNoIGludHJvZHVjZXMgY29tbWVudHMuICAqLworI2RlZmluZSBDT01NRU5UX0NIQVIgJyMnCisMCisvKiBTdGFydCB0aGUgbGV4ZXIgZ29pbmcgb24gdGhlIG1haW4gaW5wdXQgZmlsZS4gICovCisKK2Jvb2xlYW4KK25sbWxleF9maWxlIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBjdXJyZW50Lm5leHQgPSBOVUxMOworICByZXR1cm4gbmxtbGV4X2ZpbGVfb3BlbiAobmFtZSk7Cit9CisKKy8qIFN0YXJ0IHRoZSBsZXhlciBnb2luZyBvbiBhIHN1YnNpZGlhcnkgaW5wdXQgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitubG1sZXhfZmlsZV9wdXNoIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgaW5wdXQgKnB1c2g7CisKKyAgcHVzaCA9IChzdHJ1Y3QgaW5wdXQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaW5wdXQpKTsKKyAgKnB1c2ggPSBjdXJyZW50OworICBpZiAobmxtbGV4X2ZpbGVfb3BlbiAobmFtZSkpCisgICAgY3VycmVudC5uZXh0ID0gcHVzaDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGN1cnJlbnQgPSAqcHVzaDsKKyAgICAgIGZyZWUgKHB1c2gpOworICAgIH0KK30KKworLyogU3RhcnQgbGV4aW5nIGZyb20gYSBmaWxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK25sbWxleF9maWxlX29wZW4gKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGN1cnJlbnQuZmlsZSA9IGZvcGVuIChuYW1lLCAiciIpOworICBpZiAoY3VycmVudC5maWxlID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIG5hbWUsIHN0cmVycm9yIChlcnJubykpOworICAgICAgKytwYXJzZV9lcnJvcnM7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBjdXJyZW50Lm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKKyAgY3VycmVudC5saW5lbm8gPSAxOworICBjdXJyZW50LnN0YXRlID0gQkVHSU5OSU5HX09GX0xJTkU7CisgIHJldHVybiB0cnVlOworfQorDAorLyogVGFibGUgdXNlZCB0byB0dXJuIGtleXdvcmRzIGludG8gdG9rZW5zLiAgKi8KKworc3RydWN0IGtleXdvcmRfdG9rZW5zX3N0cnVjdAoreworICBjb25zdCBjaGFyICprZXl3b3JkOworICBpbnQgdG9rZW47Cit9OworCitzdHJ1Y3Qga2V5d29yZF90b2tlbnNfc3RydWN0IGtleXdvcmRfdG9rZW5zW10gPQoreworICB7ICJDSEVDSyIsIENIRUNLIH0sCisgIHsgIkNPREVTVEFSVCIsIENPREVTVEFSVCB9LAorICB7ICJDT1BZUklHSFQiLCBDT1BZUklHSFQgfSwKKyAgeyAiQ1VTVE9NIiwgQ1VTVE9NIH0sCisgIHsgIkRBVEUiLCBEQVRFIH0sCisgIHsgIkRFQlVHIiwgREVCVUcgfSwKKyAgeyAiREVTQ1JJUFRJT04iLCBERVNDUklQVElPTiB9LAorICB7ICJFWElUIiwgRVhJVCB9LAorICB7ICJFWFBPUlQiLCBFWFBPUlQgfSwKKyAgeyAiRkxBR19PTiIsIEZMQUdfT04gfSwKKyAgeyAiRkxBR19PRkYiLCBGTEFHX09GRiB9LAorICB7ICJGVUxMTUFQIiwgRlVMTE1BUCB9LAorICB7ICJIRUxQIiwgSEVMUCB9LAorICB7ICJJTVBPUlQiLCBJTVBPUlQgfSwKKyAgeyAiSU5QVVQiLCBJTlBVVCB9LAorICB7ICJNQVAiLCBNQVAgfSwKKyAgeyAiTUVTU0FHRVMiLCBNRVNTQUdFUyB9LAorICB7ICJNT0RVTEUiLCBNT0RVTEUgfSwKKyAgeyAiTVVMVElQTEUiLCBNVUxUSVBMRSB9LAorICB7ICJPU19ET01BSU4iLCBPU19ET01BSU4gfSwKKyAgeyAiT1VUUFVUIiwgT1VUUFVUIH0sCisgIHsgIlBTRVVET1BSRUVNUFRJT04iLCBQU0VVRE9QUkVFTVBUSU9OIH0sCisgIHsgIlJFRU5UUkFOVCIsIFJFRU5UUkFOVCB9LAorICB7ICJTQ1JFRU5OQU1FIiwgU0NSRUVOTkFNRSB9LAorICB7ICJTSEFSRUxJQiIsIFNIQVJFTElCIH0sCisgIHsgIlNUQUNLIiwgU1RBQ0sgfSwKKyAgeyAiU1RBQ0tTSVpFIiwgU1RBQ0sgfSwKKyAgeyAiU1RBUlQiLCBTVEFSVCB9LAorICB7ICJTWU5DSFJPTklaRSIsIFNZTkNIUk9OSVpFIH0sCisgIHsgIlRIUkVBRE5BTUUiLCBUSFJFQUROQU1FIH0sCisgIHsgIlRZUEUiLCBUWVBFIH0sCisgIHsgIlZFUkJPU0UiLCBWRVJCT1NFIH0sCisgIHsgIlZFUlNJT04iLCBWRVJTSU9OSyB9LAorICB7ICJYRENEQVRBIiwgWERDREFUQSB9Cit9OworCisjZGVmaW5lIEtFWVdPUkRfQ09VTlQgKHNpemVvZiAoa2V5d29yZF90b2tlbnMpIC8gc2l6ZW9mIChrZXl3b3JkX3Rva2Vuc1swXSkpCisMCisvKiBUaGUgbGV4ZXIgYWNjdW11bGF0ZXMgc3RyaW5ncyBpbiB0aGVzZSB2YXJpYWJsZXMuICAqLworc3RhdGljIGNoYXIgKmxleF9idWY7CitzdGF0aWMgaW50IGxleF9zaXplOworc3RhdGljIGludCBsZXhfcG9zOworCisvKiBTdGFydCBhY2N1bXVsYXRpbmcgc3RyaW5ncyBpbnRvIHRoZSBidWZmZXIuICAqLworI2RlZmluZSBCVUZfSU5JVCgpIFwKKyAgKCh2b2lkKSAobGV4X2J1ZiAhPSBOVUxMID8gbGV4X3BvcyA9IDAgOiBubG1sZXhfYnVmX2luaXQgKCkpKQorCitzdGF0aWMgaW50CitubG1sZXhfYnVmX2luaXQgKCkKK3sKKyAgbGV4X3NpemUgPSAxMDsKKyAgbGV4X2J1ZiA9IHhtYWxsb2MgKGxleF9zaXplICsgMSk7CisgIGxleF9wb3MgPSAwOworICByZXR1cm4gMDsKK30KKworLyogRmluaXNoIGEgc3RyaW5nIGluIHRoZSBidWZmZXIuICAqLworI2RlZmluZSBCVUZfRklOSVNIKCkgKCh2b2lkKSAobGV4X2J1ZltsZXhfcG9zXSA9ICdcMCcpKQorCisvKiBBY2N1bXVsYXRlIGEgY2hhcmFjdGVyIGludG8gdGhlIGJ1ZmZlci4gICovCisjZGVmaW5lIEJVRl9BREQoYykgXAorICAoKHZvaWQpIChsZXhfcG9zIDwgbGV4X3NpemUgXAorCSAgID8gbGV4X2J1ZltsZXhfcG9zKytdID0gKGMpIFwKKwkgICA6IG5sbWxleF9idWZfYWRkIChjKSkpCisKK3N0YXRpYyBjaGFyCitubG1sZXhfYnVmX2FkZCAoYykKKyAgICAgaW50IGM7Cit7CisgIGlmIChsZXhfcG9zID49IGxleF9zaXplKQorICAgIHsKKyAgICAgIGxleF9zaXplICo9IDI7CisgICAgICBsZXhfYnVmID0geHJlYWxsb2MgKGxleF9idWYsIGxleF9zaXplICsgMSk7CisgICAgfQorCisgIHJldHVybiBsZXhfYnVmW2xleF9wb3MrK10gPSBjOworfQorDAorLyogVGhlIGxleGVyIHByb3Blci4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiaXNvbiBnZW5lcmF0ZWQgcGFyc2luZworICAgY29kZS4gICovCisKK3N0YXRpYyBpbnQKK3l5bGV4ICgpCit7CisgIGludCBjOworCit0YWlsX3JlY3Vyc2U6CisKKyAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7CisKKyAgLyogQ29tbWFzIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gICovCisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgfHwgYyA9PSAnLCcpCisgICAgeworICAgICAgY3VycmVudC5zdGF0ZSA9IElOX0xJTkU7CisgICAgICBpZiAoYyA9PSAnXG4nKQorCXsKKwkgICsrY3VycmVudC5saW5lbm87CisJICBjdXJyZW50LnN0YXRlID0gQkVHSU5OSU5HX09GX0xJTkU7CisJfQorICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7CisgICAgfQorCisgIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2UgZWl0aGVyIHBvcCB0byB0aGUgcHJldmlvdXMgZmlsZSBvcgorICAgICBmaW5pc2ggdXAuICAqLworICBpZiAoYyA9PSBFT0YpCisgICAgeworICAgICAgZmNsb3NlIChjdXJyZW50LmZpbGUpOworICAgICAgZnJlZSAoY3VycmVudC5uYW1lKTsKKyAgICAgIGlmIChjdXJyZW50Lm5leHQgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3QgaW5wdXQgKm5leHQ7CisKKwkgIG5leHQgPSBjdXJyZW50Lm5leHQ7CisJICBjdXJyZW50ID0gKm5leHQ7CisJICBmcmVlIChuZXh0KTsKKwkgIGdvdG8gdGFpbF9yZWN1cnNlOworCX0KKyAgICB9CisKKyAgLyogQSBjb21tZW50IGNoYXJhY3RlciBhbHdheXMgbWVhbnMgdG8gZHJvcCBldmVyeXRoaW5nIHVudGlsIHRoZQorICAgICBuZXh0IG5ld2xpbmUuICAqLworICBpZiAoYyA9PSBDT01NRU5UX0NIQVIpCisgICAgeworICAgICAgZG8KKwl7CisJICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKKwl9CisgICAgICB3aGlsZSAoYyAhPSAnXG4nKTsKKyAgICAgICsrY3VycmVudC5saW5lbm87CisgICAgICBjdXJyZW50LnN0YXRlID0gQkVHSU5OSU5HX09GX0xJTkU7CisgICAgICBnb3RvIHRhaWxfcmVjdXJzZTsKKyAgICB9CisKKyAgLyogQW4gJ0AnIGludHJvZHVjZXMgYW4gaW5jbHVkZSBmaWxlLiAgKi8KKyAgaWYgKGMgPT0gJ0AnKQorICAgIHsKKyAgICAgIGRvCisJeworCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7CisJICBpZiAoYyA9PSAnXG4nKQorCSAgICArK2N1cnJlbnQubGluZW5vOworCX0KKyAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykpOworICAgICAgQlVGX0lOSVQgKCk7CisgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgJiYgYyAhPSBFT0YpCisJeworCSAgQlVGX0FERCAoYyk7CisJICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKKwl9CisgICAgICBCVUZfRklOSVNIICgpOworCisgICAgICB1bmdldGMgKGMsIGN1cnJlbnQuZmlsZSk7CisgICAgICAKKyAgICAgIG5sbWxleF9maWxlX3B1c2ggKGxleF9idWYpOworICAgICAgZ290byB0YWlsX3JlY3Vyc2U7CisgICAgfQorCisgIC8qIEEgbm9uLXNwYWNlIGNoYXJhY3RlciBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG11c3QgYmUgdGhlIHN0YXJ0IG9mCisgICAgIGEga2V5d29yZC4gICovCisgIGlmIChjdXJyZW50LnN0YXRlID09IEJFR0lOTklOR19PRl9MSU5FKQorICAgIHsKKyAgICAgIEJVRl9JTklUICgpOworICAgICAgd2hpbGUgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBjKSB8fCBjID09ICdfJykKKwl7CisJICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQorCSAgICBCVUZfQUREICh0b3VwcGVyICgodW5zaWduZWQgY2hhcikgYykpOworCSAgZWxzZQorCSAgICBCVUZfQUREIChjKTsKKwkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOworCX0KKyAgICAgIEJVRl9GSU5JU0ggKCk7CisKKyAgICAgIGlmIChjICE9IEVPRiAmJiAhIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKSAmJiBjICE9ICcsJykKKwl7CisJICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiBpbGxlZ2FsIGNoYXJhY3RlciBpbiBrZXl3b3JkOiAlY1xuIiksCisJCSAgIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIGMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB1bnNpZ25lZCBpbnQgaTsKKworCSAgZm9yIChpID0gMDsgaSA8IEtFWVdPUkRfQ09VTlQ7IGkrKykKKwkgICAgeworCSAgICAgIGlmIChsZXhfYnVmWzBdID09IGtleXdvcmRfdG9rZW5zW2ldLmtleXdvcmRbMF0KKwkJICAmJiBzdHJjbXAgKGxleF9idWYsIGtleXdvcmRfdG9rZW5zW2ldLmtleXdvcmQpID09IDApCisJCXsKKwkJICAvKiBQdXNoaW5nIGJhY2sgdGhlIGZpbmFsIHdoaXRlc3BhY2UgYXZvaWRzIHdvcnJ5aW5nCisJCSAgICAgYWJvdXQgXG4gaGVyZS4gICovCisJCSAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOworCQkgIGN1cnJlbnQuc3RhdGUgPSBJTl9MSU5FOworCQkgIHJldHVybiBrZXl3b3JkX3Rva2Vuc1tpXS50b2tlbjsKKwkJfQorCSAgICB9CisJICAKKwkgIG5sbWhlYWRlcl9pZGVudGlmeSAoKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6JWQ6IHVucmVjb2duaXplZCBrZXl3b3JkOiAlc1xuIiksCisJCSAgIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIGxleF9idWYpOworCX0KKworICAgICAgKytwYXJzZV9lcnJvcnM7CisgICAgICAvKiBUcmVhdCB0aGUgcmVzdCBvZiB0aGlzIGxpbmUgYXMgYSBjb21tZW50LiAgKi8KKyAgICAgIHVuZ2V0YyAoQ09NTUVOVF9DSEFSLCBjdXJyZW50LmZpbGUpOworICAgICAgZ290byB0YWlsX3JlY3Vyc2U7CisgICAgfQorCisgIC8qIFBhcmVudGhlc2VzIGp1c3QgcmVwcmVzZW50IHRoZW1zZWx2ZXMuICAqLworICBpZiAoYyA9PSAnKCcgfHwgYyA9PSAnKScpCisgICAgcmV0dXJuIGM7CisKKyAgLyogSGFuZGxlIHF1b3RlZCBzdHJpbmdzLiAgKi8KKyAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKKyAgICB7CisgICAgICBpbnQgcXVvdGU7CisgICAgICBpbnQgc3RhcnRfbGluZW5vOworCisgICAgICBxdW90ZSA9IGM7CisgICAgICBzdGFydF9saW5lbm8gPSBjdXJyZW50LmxpbmVubzsKKworICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7CisgICAgICBCVUZfSU5JVCAoKTsKKyAgICAgIHdoaWxlIChjICE9IHF1b3RlICYmIGMgIT0gRU9GKQorCXsKKwkgIEJVRl9BREQgKGMpOworCSAgaWYgKGMgPT0gJ1xuJykKKwkgICAgKytjdXJyZW50LmxpbmVubzsKKwkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOworCX0KKyAgICAgIEJVRl9GSU5JU0ggKCk7CisKKyAgICAgIGlmIChjID09IEVPRikKKwl7CisJICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiBlbmQgb2YgZmlsZSBpbiBxdW90ZWQgc3RyaW5nXG4iKSwKKwkJICAgY3VycmVudC5uYW1lLCBzdGFydF9saW5lbm8pOworCSAgKytwYXJzZV9lcnJvcnM7CisJfQorCisgICAgICAvKiBGSVhNRTogUG9zc2libGUgbWVtb3J5IGxlYWsuICAqLworICAgICAgeXlsdmFsLnN0cmluZyA9IHhzdHJkdXAgKGxleF9idWYpOworICAgICAgcmV0dXJuIFFVT1RFRF9TVFJJTkc7CisgICAgfQorCisgIC8qIEdhdGhlciBhIGdlbmVyaWMgYXJndW1lbnQuICAqLworICBCVUZfSU5JVCAoKTsKKyAgd2hpbGUgKCEgaXNzcGFjZSAoYykKKwkgJiYgYyAhPSAnLCcKKwkgJiYgYyAhPSBDT01NRU5UX0NIQVIKKwkgJiYgYyAhPSAnKCcKKwkgJiYgYyAhPSAnKScpCisgICAgeworICAgICAgQlVGX0FERCAoYyk7CisgICAgICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKKyAgICB9CisgIEJVRl9GSU5JU0ggKCk7CisKKyAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOworCisgIC8qIEZJWE1FOiBQb3NzaWJsZSBtZW1vcnkgbGVhay4gICovCisgIHl5bHZhbC5zdHJpbmcgPSB4c3RyZHVwIChsZXhfYnVmKTsKKyAgcmV0dXJuIFNUUklORzsKK30KKwwKKy8qIEdldCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLiAgKi8KKworc3RhdGljIGxvbmcKK25sbWxleF9nZXRfbnVtYmVyIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBsb25nIHJldDsKKyAgY2hhciAqc2VuZDsKKworICByZXQgPSBzdHJ0b2wgKHMsICZzZW5kLCAxMCk7CisgIGlmICgqc2VuZCAhPSAnXDAnKQorICAgIG5sbWhlYWRlcl93YXJuIChfKCJiYWQgbnVtYmVyIiksIC0xKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogUHJlZml4IHRoZSBubG1jb252IHdhcm5pbmdzIHdpdGggYSBub3RlIGFzIHRvIHdoZXJlIHRoZXkgY29tZSBmcm9tLgorICAgV2UgZG9uJ3QgdXNlIHByb2dyYW1fbmFtZSBvbiBldmVyeSB3YXJuaW5nLCBiZWNhdXNlIHRoZW4gc29tZQorICAgdmVyc2lvbnMgb2YgdGhlIGVtYWNzIG5leHQtZXJyb3IgZnVuY3Rpb24gY2FuJ3QgcmVjb2duaXplIHRoZSBsaW5lCisgICBudW1iZXIuICAqLworCitzdGF0aWMgdm9pZAorbmxtaGVhZGVyX2lkZW50aWZ5ICgpCit7CisgIHN0YXRpYyBpbnQgZG9uZTsKKworICBpZiAoISBkb25lKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHByb2JsZW1zIGluIE5MTSBjb21tYW5kIGxhbmd1YWdlIGlucHV0OlxuIiksCisJICAgICAgIHByb2dyYW1fbmFtZSk7CisgICAgICBkb25lID0gMTsKKyAgICB9Cit9CisKKy8qIElzc3VlIGEgd2FybmluZy4gICovCisKK3N0YXRpYyB2b2lkCitubG1oZWFkZXJfd2FybiAocywgaW1heCkKKyAgICAgY29uc3QgY2hhciAqczsKKyAgICAgaW50IGltYXg7Cit7CisgIG5sbWhlYWRlcl9pZGVudGlmeSAoKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICVzIiwgY3VycmVudC5uYW1lLCBjdXJyZW50LmxpbmVubywgcyk7CisgIGlmIChpbWF4ICE9IC0xKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiAobWF4ICVkKSIsIGltYXgpOworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworfQorCisvKiBSZXBvcnQgYW4gZXJyb3IuICAqLworCitzdGF0aWMgdm9pZAorbmxtaGVhZGVyX2Vycm9yIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBubG1oZWFkZXJfd2FybiAocywgLTEpOworICArK3BhcnNlX2Vycm9yczsKK30KKworLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGxpc3QuICAqLworCitzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKK3N0cmluZ19saXN0X2NvbnMgKHMsIGwpCisgICAgIGNoYXIgKnM7CisgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKK3sKKyAgc3RydWN0IHN0cmluZ19saXN0ICpyZXQ7CisKKyAgcmV0ID0gKHN0cnVjdCBzdHJpbmdfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpOworICByZXQtPm5leHQgPSBsOworICByZXQtPnN0cmluZyA9IHM7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIEFwcGVuZCBhIHN0cmluZyBsaXN0IHRvIGFub3RoZXIgc3RyaW5nIGxpc3QuICAqLworCitzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKK3N0cmluZ19saXN0X2FwcGVuZCAobDEsIGwyKQorICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmwxOworICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmwyOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwcDsKKworICBmb3IgKHBwID0gJmwxOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCisgICAgOworICAqcHAgPSBsMjsKKyAgcmV0dXJuIGwxOworfQorCisvKiBBcHBlbmQgYSBzdHJpbmcgdG8gYSBzdHJpbmcgbGlzdC4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKgorc3RyaW5nX2xpc3RfYXBwZW5kMSAobCwgcykKKyAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsOworICAgICBjaGFyICpzOworeworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm47CisgIHJlZ2lzdGVyIHN0cnVjdCBzdHJpbmdfbGlzdCAqKnBwOworCisgIG4gPSAoc3RydWN0IHN0cmluZ19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ19saXN0KSk7CisgIG4tPm5leHQgPSBOVUxMOworICBuLT5zdHJpbmcgPSBzOworICBmb3IgKHBwID0gJmw7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKKyAgICA7CisgICpwcCA9IG47CisgIHJldHVybiBsOworfQorCisvKiBEdXBsaWNhdGUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KKworc3RhdGljIGNoYXIgKgoreHN0cmR1cCAocykKKyAgICAgY29uc3QgY2hhciAqczsKK3sKKyAgdW5zaWduZWQgbG9uZyBsZW47CisgIGNoYXIgKnJldDsKKworICBsZW4gPSBzdHJsZW4gKHMpOworICByZXQgPSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgc3RyY3B5IChyZXQsIHMpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbm0uMSBiL2JpbnV0aWxzL25tLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhZDk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL25tLjEKQEAgLTAsMCArMSwyMzAgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisuXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KKy5USCBubSAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKKy5kZSBCUAorLnNwCisudGkgXC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCitubSBcLSBsaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCisKKy5TSCBTWU5PUFNJUworLmh5IDAKKy5uYQorLlRQCisuQiBubQorLlJCICJbXHwiIFwtYSB8IFwtXC1kZWJ1Z1wtc3ltcyAiXHxdIiAKKy5SQiAiW1x8IiBcLWcgfCBcLVwtZXh0ZXJuXC1vbmx5ICJcfF0iCisuUkIgIltcfCIgXC1CICJcfF0iICAKKy5SQiAiW1x8IiBcLUMgfCBcLVwtZGVtYW5nbGUgIlx8XSIgCisuUkIgIltcfCIgXC1EIHwgXC1cLWR5bmFtaWMgIlx8XSIgCisuUkIgIltcfCIgXC1zIHwgXC1cLXByaW50XC1hcm1hcCAiXHxdIiAKKy5SQiAiW1x8IiBcLW8gfCBcLVwtcHJpbnRcLWZpbGVcLW5hbWUgIlx8XSIgIAorLlJCICJbXHwiIFwtbiB8IFwtXC1udW1lcmljXC1zb3J0ICJcfF0iIAorLlJCICJbXHwiIFwtcCB8IFwtXC1ub1wtc29ydCAiXHxdIgorLlJCICJbXHwiIFwtciB8IFwtXC1yZXZlcnNlXC1zb3J0ICJcfF0iIAorLlJCICJbXHwiIFwtXC1zaXplXC1zb3J0ICJcfF0iIAorLlJCICJbXHwiIFwtdSB8IFwtXC11bmRlZmluZWRcLW9ubHkgIlx8XSIgIAorLlJCICJbXHwiIFwtbCB8IFwtXC1saW5lXC1udW1iZXJzICJcfF0iCisuUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgIAorLlJCICJbXHwiIFwtXC12ZXJzaW9uICJcfF0iICAKKy5SQiAiW1x8IiAiXC10IFxmSXJhZGl4IiB8IFwtXC1yYWRpeD1cZklyYWRpeCAiXHxdIgorLlJCICJbXHwiIFwtUCB8IC0tcG9ydGFiaWxpdHkgIlx8XSIKKy5SQiAiW1x8IiAiXC1mIFxmSWZvcm1hdCIgfCBcLVwtZm9ybWF0PVxmSWZvcm1hdCAiXHxdIgorLlJCICJbXHwiICJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUiICJcfF0iCisuUkIgIltcfCIgXGMKKy5JIG9iamZpbGVcYworXCYuXHwuXHwuXHxdCisuYWQgYgorLmh5IDEKKy5TSCBERVNDUklQVElPTgorR05VIFxjCisuQiBubVxjCitcJiBsaXN0cyB0aGUgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcyBcYworLkkgb2JqZmlsZVxjCitcJi4gIElmIG5vIG9iamVjdCBmaWxlcyBhcmUgZ2l2ZW4gYXMgYXJndW1lbnRzLCBcYworLkIgbm1cYworXCYgYXNzdW1lcyBgXHxcYworLkIgYS5vdXRcYworXHwnLgorCisuU0ggT1BUSU9OUworVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKK2VxdWl2YWxlbnQuCisKKy5UUAorLkIgXC1BCisuVFAKKy5CIFwtbworLlRQCisuQiBcLVwtcHJpbnRcLWZpbGVcLW5hbWUgCitQcmVjZWRlIGVhY2ggc3ltYm9sIGJ5IHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIHdoZXJlIGl0IHdhcyBmb3VuZCwKK3JhdGhlciB0aGFuIGlkZW50aWZ5aW5nIHRoZSBpbnB1dCBmaWxlIG9uY2Ugb25seSBiZWZvcmUgYWxsIG9mIGl0cworc3ltYm9scy4gCisKKy5UUAorLkIgXC1hCisuVFAKKy5CIFwtXC1kZWJ1Z1wtc3ltcyAKK0Rpc3BsYXkgZGVidWdnZXItb25seSBzeW1ib2xzOyBub3JtYWxseSB0aGVzZSBhcmUgbm90IGxpc3RlZC4KKworLlRQCisuQiBcLUIKK1RoZSBzYW1lIGFzCisuQiBcLVwtZm9ybWF0PWJzZAorKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgXGZCbm1cZlApLgorCisuVFAKKy5CIFwtQworLlRQCisuQiBcLVwtZGVtYW5nbGUKK0RlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgorQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCittYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCisKKy5UUAorLkIgXC1ECisuVFAKKy5CIFwtXC1keW5hbWljCitEaXNwbGF5IHRoZSBkeW5hbWljIHN5bWJvbHMgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBzeW1ib2xzLiAgVGhpcyBpcworb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKK2xpYnJhcmllcy4KKworLlRQCisuQiAiXC1mIFxmSWZvcm1hdCIKK1VzZSB0aGUgb3V0cHV0IGZvcm1hdCBcZklmb3JtYXRcZlAsIHdoaWNoIGNhbiBiZSBgYGJzZCcnLAorYGBzeXN2JycsIG9yIGBgcG9zaXgnJy4gIFRoZSBkZWZhdWx0IGlzIGBgYnNkJycuCitPbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgXGZJZm9ybWF0XGZQIGlzIHNpZ25pZmljYW50OyBpdCBjYW4gYmUKK2VpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLgorCisuVFAKKy5CIFwtZworLlRQCisuQiBcLVwtZXh0ZXJuXC1vbmx5IAorRGlzcGxheSBvbmx5IGV4dGVybmFsIHN5bWJvbHMuCisKKy5UUAorLkIgXC1uCisuVFAKKy5CIFwtdgorLlRQCisuQiBcLVwtbnVtZXJpY1wtc29ydCAKK1NvcnQgc3ltYm9scyBudW1lcmljYWxseSBieSB0aGVpciBhZGRyZXNzZXMsIG5vdCBhbHBoYWJldGljYWxseSBieSB0aGVpcgorbmFtZXMuIAorCisuVFAKKy5CIFwtcAorLlRQCisuQiBcLVwtbm9cLXNvcnQgCitEb24ndCBib3RoZXIgdG8gc29ydCB0aGUgc3ltYm9scyBpbiBhbnkgb3JkZXI7IGp1c3QgcHJpbnQgdGhlbSBpbiB0aGUKK29yZGVyIGVuY291bnRlcmVkLgorCisuVFAKKy5CIFwtUAorLlRQCisuQiBcLVwtcG9ydGFiaWxpdHkKK1VzZSB0aGUgUE9TSVguMiBzdGFuZGFyZCBvdXRwdXQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9ybWF0LgorRXF1aXZhbGVudCB0byBgYFwtZiBwb3NpeCcnLgorCisuVFAKKy5CIFwtcworLlRQCisuQiBcLVwtcHJpbnRcLWFybWFwCitXaGVuIGxpc3Rpbmcgc3ltYm9scyBmcm9tIGFyY2hpdmUgbWVtYmVycywgaW5jbHVkZSB0aGUgaW5kZXg6IGEgbWFwcGluZworKHN0b3JlZCBpbiB0aGUgYXJjaGl2ZSBieSBcYworLkIgYXJcYworXCYgb3IgXGMKKy5CIHJhbmxpYlxjCitcJikgb2Ygd2hhdCBtb2R1bGVzCitjb250YWluIGRlZmluaXRpb25zIGZvciB3aGF0IG5hbWVzLgorCisuVFAKKy5CIFwtcgorLlRQCisuQiBcLVwtcmV2ZXJzZVwtc29ydCAKK1JldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBzb3J0ICh3aGV0aGVyIG51bWVyaWMgb3IgYWxwaGFiZXRpYyk7IGxldCB0aGUKK2xhc3QgY29tZSBmaXJzdC4KKworLlRQCisuQiBcLVwtc2l6ZVwtc29ydCAKK1NvcnQgc3ltYm9scyBieSBzaXplLiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgordGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHdpdGggdGhlIG5leHQgaGlnaGVyCit2YWx1ZS4gIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaXMgcHJpbnRlZCwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlLgorCisuVFAKKy5CICJcLXQgXGZJcmFkaXgiCisuVFAKKy5CICJcLVwtcmFkaXg9XGZJcmFkaXgiCitVc2UgXGZJcmFkaXhcZlAgYXMgdGhlIHJhZGl4IGZvciBwcmludGluZyB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IG11c3QgYmUKK2BgZCcnIGZvciBkZWNpbWFsLCBgYG8nJyBmb3Igb2N0YWwsIG9yIGBgeCcnIGZvciBoZXhhZGVjaW1hbC4KKworLlRQCisuQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKK1NwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KK1NlZSAKKy5CUiBvYmpkdW1wICggMSApLAorZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCisKKy5UUAorLkIgXC11CisuVFAKKy5CIFwtXC11bmRlZmluZWRcLW9ubHkgCitEaXNwbGF5IG9ubHkgdW5kZWZpbmVkIHN5bWJvbHMgKHRob3NlIGV4dGVybmFsIHRvIGVhY2ggb2JqZWN0IGZpbGUpLgorCisuVFAKKy5CIFwtbAorLlRQCisuQiBcLVwtbGluZVwtbnVtYmVycworRm9yIGVhY2ggc3ltYm9sLCB1c2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRyeSB0byBmaW5kIGEgZmlsZW5hbWUgYW5kCitsaW5lIG51bWJlci4gIEZvciBhIGRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZSBudW1iZXIgb2YgdGhlCithZGRyZXNzIG9mIHRoZSBzeW1ib2wuICBGb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUKK251bWJlciBvZiBhIHJlbG9jYXRpb24gZW50cnkgd2hpY2ggcmVmZXJzIHRvIHRoZSBzeW1ib2wuICBJZiBsaW5lIG51bWJlcgoraW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kLCBwcmludCBpdCBhZnRlciB0aGUgb3RoZXIgc3ltYm9sIGluZm9ybWF0aW9uLgorCisuVFAKKy5CIFwtVgorLlRQCisuQiBcLVwtdmVyc2lvbgorU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKy5CIG5tCithbmQgZXhpdC4KKworLlRQCisuQiBcLVwtaGVscAorU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KKy5CIG5tCithbmQgZXhpdC4KKworLlNIICJTRUUgQUxTTyIKKy5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgorZW50cnkgaW4gCisuQgoraW5mb1xjCitcJjsgCisuSQorVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKK1wmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7CisuQlIgYXIgIigiIDEgIiksIgorLkJSIG9iamR1bXAgKCAxICksCisuQlIgcmFubGliICIoIiAxICIpLiIKKworCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubS5jIGIvYmludXRpbHMvbm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTFiN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvbm0uYwpAQCAtMCwwICsxLDE1NTggQEAKKy8qIG5tLmMgLS0gRGVzY3JpYmUgc3ltYm9sIHRhYmxlIG9mIGEgcmVsIGZpbGUuCisgICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisjaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisvKiBXaGVuIHNvcnRpbmcgYnkgc2l6ZSwgd2UgdXNlIHRoaXMgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHNpemUgYW5kIGEKKyAgIHBvaW50ZXIgdG8gdGhlIG1pbmlzeW1ib2wuICAqLworCitzdHJ1Y3Qgc2l6ZV9zeW0KK3sKKyAgY29uc3QgUFRSIG1pbmlzeW07CisgIGJmZF92bWEgc2l6ZTsKK307CisKKy8qIFdoZW4gZmV0Y2hpbmcgcmVsb2NzLCB3ZSB1c2UgdGhpcyBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bworICAgZ2V0X3JlbG9jcy4gICovCisKK3N0cnVjdCBnZXRfcmVsb2NzX2luZm8KK3sKKyAgYXNlY3Rpb24gKipzZWNzOworICBhcmVsZW50ICoqKnJlbG9jczsKKyAgbG9uZyAqcmVsY291bnQ7CisgIGFzeW1ib2wgKipzeW1zOworfTsKKworc3RhdGljIHZvaWQKK3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzZXRfcHJpbnRfcmFkaXggUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitzZXRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOworCitzdGF0aWMgYm9vbGVhbgorZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X3JlbF9maWxlIFBBUkFNUyAoKGJmZCAqIGZpbGUsIGJmZCAqIGFyY2hpdmUpKTsKKworc3RhdGljIGxvbmcKK2ZpbHRlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCkpOworCitzdGF0aWMgbG9uZworc29ydF9zeW1ib2xzX2J5X3NpemUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LAorCQkJICAgICAgc3RydWN0IHNpemVfc3ltICoqKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkICopKTsKKworc3RhdGljIHZvaWQKK3ByaW50X3NpemVfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgc3RydWN0IHNpemVfc3ltICosIGxvbmcsIGJmZCAqKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKikpOworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1kZWZfZW50cnkgUEFSQU1TICgoYmZkICogYWJmZCkpOworCisvKiBUaGUgc29ydGluZyBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50CitudW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKKworc3RhdGljIGludAorbnVtZXJpY19yZXZlcnNlIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisKK3N0YXRpYyBpbnQKK25vbl9udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKKworc3RhdGljIGludAorbm9uX251bWVyaWNfcmV2ZXJzZSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOworCitzdGF0aWMgaW50CitzaXplX2ZvcndhcmQxIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisKK3N0YXRpYyBpbnQKK3NpemVfZm9yd2FyZDIgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKKworLyogVGhlIG91dHB1dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9vYmplY3RfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOworCitzdGF0aWMgdm9pZAorcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKKworc3RhdGljIHZvaWQKK3ByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKKworc3RhdGljIHZvaWQKK3ByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKKworCitzdGF0aWMgdm9pZAorcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9hcmNoaXZlX21lbWJlcl9zeXN2IFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOworCisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7CisKKworc3RhdGljIHZvaWQKK3ByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEpKTsKKworc3RhdGljIHZvaWQKK3ByaW50X3N5bWJvbF9pbmZvX2JzZCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKKworc3RhdGljIHZvaWQKK3ByaW50X3N5bWJvbF9pbmZvX3N5c3YgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfaW5mb19wb3NpeCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKKworc3RhdGljIHZvaWQKK2dldF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworCisvKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMuICAqLworc3RydWN0IG91dHB1dF9mbnMKKyAgeworICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLworICAgIHZvaWQgKCpwcmludF9vYmplY3RfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKKyAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCisgICAgdm9pZCAoKnByaW50X2FyY2hpdmVfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKKyAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KKyAgICB2b2lkICgqcHJpbnRfYXJjaGl2ZV9tZW1iZXIpIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7CisKKyAgICAvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKKyAgICAgICBjb250YWluaW5nIGEgc3ltYm9sLiAgKi8KKyAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2ZpbGVuYW1lKSBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOworCisgICAgLyogUHJpbnQgYSBsaW5lIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KKyAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOworICB9Oworc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zIGZvcm1hdHNbXSA9Cit7CisgIHtwcmludF9vYmplY3RfZmlsZW5hbWVfYnNkLAorICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QsCisgICBwcmludF9hcmNoaXZlX21lbWJlcl9ic2QsCisgICBwcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkLAorICAgcHJpbnRfc3ltYm9sX2luZm9fYnNkfSwKKyAge3ByaW50X29iamVjdF9maWxlbmFtZV9zeXN2LAorICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2LAorICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiwKKyAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2LAorICAgcHJpbnRfc3ltYm9sX2luZm9fc3lzdn0sCisgIHtwcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXgsCisgICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4LAorICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgsCisgICBwcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXgsCisgICBwcmludF9zeW1ib2xfaW5mb19wb3NpeH0KK307CisKKy8qIEluZGljZXMgaW4gYGZvcm1hdHMnLiAgKi8KKyNkZWZpbmUgRk9STUFUX0JTRCAwCisjZGVmaW5lIEZPUk1BVF9TWVNWIDEKKyNkZWZpbmUgRk9STUFUX1BPU0lYIDIKKyNkZWZpbmUgRk9STUFUX0RFRkFVTFQgRk9STUFUX0JTRAorCisvKiBUaGUgb3V0cHV0IGZvcm1hdCB0byB1c2UuICAqLworc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zICpmb3JtYXQgPSAmZm9ybWF0c1tGT1JNQVRfREVGQVVMVF07CisKKworLyogQ29tbWFuZCBvcHRpb25zLiAgKi8KKworc3RhdGljIGludCBkb19kZW1hbmdsZSA9IDA7CS8qIFByZXR0eSBwcmludCBDKysgc3ltYm9sIG5hbWVzLiAgKi8KK3N0YXRpYyBpbnQgZXh0ZXJuYWxfb25seSA9IDA7CS8qIHByaW50IGV4dGVybmFsIHN5bWJvbHMgb25seSAqLworc3RhdGljIGludCBkZWZpbmVkX29ubHkgPSAwOwkvKiBQcmludCBkZWZpbmVkIHN5bWJvbHMgb25seSAqLworc3RhdGljIGludCBub19zb3J0ID0gMDsJCS8qIGRvbid0IHNvcnQ7IHByaW50IHN5bXMgaW4gb3JkZXIgZm91bmQgKi8KK3N0YXRpYyBpbnQgcHJpbnRfZGVidWdfc3ltcyA9IDA7CS8qIHByaW50IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyB0b28gKi8KK3N0YXRpYyBpbnQgcHJpbnRfYXJtYXAgPSAwOwkvKiBkZXNjcmliZSBfXy5TWU1ERUYgZGF0YSBpbiBhcmNoaXZlIGZpbGVzLiAgKi8KK3N0YXRpYyBpbnQgcmV2ZXJzZV9zb3J0ID0gMDsJLyogc29ydCBpbiBkb3dud2FyZChhbHBoYSBvciBudW1lcmljKSBvcmRlciAqLworc3RhdGljIGludCBzb3J0X251bWVyaWNhbGx5ID0gMDsJLyogc29ydCBpbiBudW1lcmljIHJhdGhlciB0aGFuIGFscGhhIG9yZGVyICovCitzdGF0aWMgaW50IHNvcnRfYnlfc2l6ZSA9IDA7CS8qIHNvcnQgYnkgc2l6ZSBvZiBzeW1ib2wgKi8KK3N0YXRpYyBpbnQgdW5kZWZpbmVkX29ubHkgPSAwOwkvKiBwcmludCB1bmRlZmluZWQgc3ltYm9scyBvbmx5ICovCitzdGF0aWMgaW50IGR5bmFtaWMgPSAwOwkJLyogcHJpbnQgZHluYW1pYyBzeW1ib2xzLiAgKi8KK3N0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KK3N0YXRpYyBpbnQgc2hvd19zdGF0cyA9IDA7CS8qIHNob3cgc3RhdGlzdGljcyAqLworc3RhdGljIGludCBsaW5lX251bWJlcnMgPSAwOwkvKiBwcmludCBsaW5lIG51bWJlcnMgZm9yIHN5bWJvbHMgKi8KKworLyogV2hlbiB0byBwcmludCB0aGUgbmFtZXMgb2YgZmlsZXMuICBOb3QgbXV0dWFsbHkgZXhjbHVzaXZlIGluIFNZU1YgZm9ybWF0LiAgKi8KK3N0YXRpYyBpbnQgZmlsZW5hbWVfcGVyX2ZpbGUgPSAwOwkvKiBPbmNlIHBlciBmaWxlLCBvbiBpdHMgb3duIGxpbmUuICAqLworc3RhdGljIGludCBmaWxlbmFtZV9wZXJfc3ltYm9sID0gMDsJLyogT25jZSBwZXIgc3ltYm9sLCBhdCBzdGFydCBvZiBsaW5lLiAgKi8KKworLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgYSBzeW1ib2wgdmFsdWUuICAqLworI2lmbmRlZiBCRkQ2NAorc3RhdGljIGNoYXIgdmFsdWVfZm9ybWF0W10gPSAiJTA4bHgiOworI2Vsc2UKKyNpZiBCRkRfSE9TVF82NEJJVF9MT05HCitzdGF0aWMgY2hhciB2YWx1ZV9mb3JtYXRbXSA9ICIlMDE2bHgiOworI2Vsc2UKKy8qIFdlIGRvbid0IHVzZSB2YWx1ZV9mb3JtYXQgZm9yIHRoaXMgY2FzZS4gICovCisjZW5kaWYKKyNlbmRpZgorc3RhdGljIGludCBwcmludF9yYWRpeCA9IDE2OworLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgc3RhYiBpbmZvLiAgKi8KK3N0YXRpYyBjaGFyIG90aGVyX2Zvcm1hdFtdID0gIiUwMngiOworc3RhdGljIGNoYXIgZGVzY19mb3JtYXRbXSA9ICIlMDR4IjsKKworc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7CisKKy8qIFVzZWQgdG8gY2FjaGUgdGhlIGxpbmUgbnVtYmVycyBmb3IgYSBCRkQuICAqLworc3RhdGljIGJmZCAqbGluZW5vX2NhY2hlX2JmZDsKK3N0YXRpYyBiZmQgKmxpbmVub19jYWNoZV9yZWxfYmZkOworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Cit7CisgIHsiZGVidWctc3ltcyIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfZGVidWdfc3ltcywgMX0sCisgIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAxfSwKKyAgeyJkeW5hbWljIiwgbm9fYXJndW1lbnQsICZkeW5hbWljLCAxfSwKKyAgeyJleHRlcm4tb25seSIsIG5vX2FyZ3VtZW50LCAmZXh0ZXJuYWxfb25seSwgMX0sCisgIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCisgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAorICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAorICB7Im5vLWNwbHVzIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMH0sICAvKiBMaW51eCBjb21wYXRpYmlsaXR5LiAgKi8KKyAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDB9LAorICB7Im5vLXNvcnQiLCBub19hcmd1bWVudCwgJm5vX3NvcnQsIDF9LAorICB7Im51bWVyaWMtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9udW1lcmljYWxseSwgMX0sCisgIHsicG9ydGFiaWxpdHkiLCBub19hcmd1bWVudCwgMCwgJ1AnfSwKKyAgeyJwcmludC1hcm1hcCIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfYXJtYXAsIDF9LAorICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCAwLCAnbyd9LAorICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCisgIHsicmV2ZXJzZS1zb3J0Iiwgbm9fYXJndW1lbnQsICZyZXZlcnNlX3NvcnQsIDF9LAorICB7InNpemUtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9ieV9zaXplLCAxfSwKKyAgeyJzdGF0cyIsIG5vX2FyZ3VtZW50LCAmc2hvd19zdGF0cywgMX0sCisgIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCisgIHsiZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZkZWZpbmVkX29ubHksIDF9LAorICB7InVuZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZ1bmRlZmluZWRfb25seSwgMX0sCisgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKKyAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQorfTsKKwwKKy8qIFNvbWUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZAordXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQorICAgICBGSUxFICpzdHJlYW07CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCisgICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG5cCisgICAgICAgWy0tbnVtZXJpYy1zb3J0XSBbLS1uby1zb3J0XSBbLS1yZXZlcnNlLXNvcnRdIFstLXNpemUtc29ydF1cblwKKyAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuXAorICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG5cCisgICAgICAgWy0tZGVmaW5lZC1vbmx5XSBbLS1saW5lLW51bWJlcnNdXG5cCisgICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cblwKKyAgICAgICBbZmlsZS4uLl1cbiIpLAorCSAgIHByb2dyYW1fbmFtZSk7CisgIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7CisgIGV4aXQgKHN0YXR1cyk7Cit9CisKKy8qIFNldCB0aGUgcmFkaXggZm9yIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHNpemUgYWNjb3JkaW5nIHRvIFJBRElYLiAgKi8KKworc3RhdGljIHZvaWQKK3NldF9wcmludF9yYWRpeCAocmFkaXgpCisgICAgIGNoYXIgKnJhZGl4OworeworICBzd2l0Y2ggKCpyYWRpeCkKKyAgICB7CisgICAgY2FzZSAneCc6CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdvJzoKKyAgICAgIGlmICgqcmFkaXggPT0gJ2QnKQorCXByaW50X3JhZGl4ID0gMTA7CisgICAgICBlbHNlCisJcHJpbnRfcmFkaXggPSA4OworI2lmbmRlZiBCRkQ2NAorICAgICAgdmFsdWVfZm9ybWF0WzRdID0gKnJhZGl4OworI2Vsc2UKKyNpZiBCRkRfSE9TVF82NEJJVF9MT05HCisgICAgICB2YWx1ZV9mb3JtYXRbNV0gPSAqcmFkaXg7CisjZWxzZQorICAgICAgLyogVGhpcyBjYXNlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9jdGFsIGFuZCBkZWNpbWFsCisgICAgICAgICBwcmludGluZy4gICovCisjZW5kaWYKKyNlbmRpZgorICAgICAgb3RoZXJfZm9ybWF0WzNdID0gZGVzY19mb3JtYXRbM10gPSAqcmFkaXg7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgcmFkaXhcbiIpLCBwcm9ncmFtX25hbWUsIHJhZGl4KTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NldF9vdXRwdXRfZm9ybWF0IChmKQorICAgICBjaGFyICpmOworeworICBpbnQgaTsKKworICBzd2l0Y2ggKCpmKQorICAgIHsKKyAgICBjYXNlICdiJzoKKyAgICBjYXNlICdCJzoKKyAgICAgIGkgPSBGT1JNQVRfQlNEOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisgICAgICBpID0gRk9STUFUX1BPU0lYOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBpID0gRk9STUFUX1NZU1Y7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIiksIHByb2dyYW1fbmFtZSwgZik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGZvcm1hdCA9ICZmb3JtYXRzW2ldOworfQorDAoraW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBjOworICBpbnQgcmV0dmFsOworCisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7CisgIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKKworICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKKworICBiZmRfaW5pdCAoKTsKKyAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKKworICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFBQkNEZWY6Z2xub3BQcnN0OnV2ViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnYSc6CisJICBwcmludF9kZWJ1Z19zeW1zID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ0EnOgorCWNhc2UgJ28nOgorCSAgZmlsZW5hbWVfcGVyX3N5bWJvbCA9IDE7CisJICBicmVhazsKKwljYXNlICdCJzoJCS8qIEZvciBNSVBTIGNvbXBhdGliaWxpdHkuICAqLworCSAgc2V0X291dHB1dF9mb3JtYXQgKCJic2QiKTsKKwkgIGJyZWFrOworCWNhc2UgJ0MnOgorCSAgZG9fZGVtYW5nbGUgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnRCc6CisJICBkeW5hbWljID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2UnOgorCSAgLyogSWdub3JlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gICovCisJICBicmVhazsKKwljYXNlICdmJzoKKwkgIHNldF9vdXRwdXRfZm9ybWF0IChvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSAnZyc6CisJICBleHRlcm5hbF9vbmx5ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgdXNhZ2UgKHN0ZG91dCwgMCk7CisJY2FzZSAnbCc6CisJICBsaW5lX251bWJlcnMgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnbic6CisJY2FzZSAndic6CisJICBzb3J0X251bWVyaWNhbGx5ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgbm9fc29ydCA9IDE7CisJICBicmVhazsKKwljYXNlICdQJzoKKwkgIHNldF9vdXRwdXRfZm9ybWF0ICgicG9zaXgiKTsKKwkgIGJyZWFrOworCWNhc2UgJ3InOgorCSAgcmV2ZXJzZV9zb3J0ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgcHJpbnRfYXJtYXAgPSAxOworCSAgYnJlYWs7CisJY2FzZSAndCc6CisJICBzZXRfcHJpbnRfcmFkaXggKG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlICd1JzoKKwkgIHVuZGVmaW5lZF9vbmx5ID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ1YnOgorCSAgc2hvd192ZXJzaW9uID0gMTsKKwkgIGJyZWFrOworCisJY2FzZSAyMDA6CQkvKiAtLXRhcmdldCAqLworCSAgdGFyZ2V0ID0gb3B0YXJnOworCSAgYnJlYWs7CisKKwljYXNlIDA6CQkvKiBBIGxvbmcgb3B0aW9uIHRoYXQganVzdCBzZXRzIGEgZmxhZy4gICovCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB1c2FnZSAoc3RkZXJyLCAxKTsKKwl9CisgICAgfQorCisgIGlmIChzaG93X3ZlcnNpb24pCisgICAgcHJpbnRfdmVyc2lvbiAoIm5tIik7CisKKyAgLyogT0ssIGFsbCBvcHRpb25zIG5vdyBwYXJzZWQuICBJZiBubyBmaWxlbmFtZSBzcGVjaWZpZWQsIGRvIGEub3V0LiAgKi8KKyAgaWYgKG9wdGluZCA9PSBhcmdjKQorICAgIHJldHVybiAhZGlzcGxheV9maWxlICgiYS5vdXQiKTsKKworICByZXR2YWwgPSAwOworCisgIGlmIChhcmdjIC0gb3B0aW5kID4gMSkKKyAgICBmaWxlbmFtZV9wZXJfZmlsZSA9IDE7CisKKyAgLyogV2Ugd2VyZSBnaXZlbiBzZXZlcmFsIGZpbGVuYW1lcyB0byBkby4gICovCisgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQorICAgIHsKKyAgICAgIFBST0dSRVNTICgxKTsKKyAgICAgIGlmICghZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSkpCisJcmV0dmFsKys7CisgICAgfQorCisgIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKKworI2lmZGVmIEhBVkVfU0JSSworICBpZiAoc2hvd19zdGF0cykKKyAgICB7CisgICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksIHByb2dyYW1fbmFtZSwKKwkgICAgICAgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOworICAgIH0KKyNlbmRpZgorCisgIGV4aXQgKHJldHZhbCk7CisgIHJldHVybiByZXR2YWw7Cit9CisMCitzdGF0aWMgdm9pZAorZGlzcGxheV9hcmNoaXZlIChmaWxlKQorICAgICBiZmQgKmZpbGU7Cit7CisgIGJmZCAqYXJmaWxlID0gTlVMTDsKKyAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7CisgIGNoYXIgKiptYXRjaGluZzsKKworICAoKmZvcm1hdC0+cHJpbnRfYXJjaGl2ZV9maWxlbmFtZSkgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKKworICBpZiAocHJpbnRfYXJtYXApCisgICAgcHJpbnRfc3ltZGVmX2VudHJ5IChmaWxlKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIFBST0dSRVNTICgxKTsKKworICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKKworICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQorCXsKKwkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQorCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJmaWxlLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQorCXsKKwkgICgqZm9ybWF0LT5wcmludF9hcmNoaXZlX21lbWJlcikgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpLAorCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhcmZpbGUpKTsKKwkgIGRpc3BsYXlfcmVsX2ZpbGUgKGFyZmlsZSwgZmlsZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYXJmaWxlKSk7CisJICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQorCSAgICB7CisJICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7CisJICAgICAgZnJlZSAobWF0Y2hpbmcpOworCSAgICB9CisJfQorCisgICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKKwl7CisJICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKKwkgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOworCSAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOworCX0KKyAgICAgIGxhc3RfYXJmaWxlID0gYXJmaWxlOworICAgIH0KKworICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKKyAgICAgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOworICAgICAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGJvb2xlYW4KK2Rpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBib29sZWFuIHJldHZhbCA9IHRydWU7CisgIGJmZCAqZmlsZTsKKyAgY2hhciAqKm1hdGNoaW5nOworCisgIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOworICBpZiAoZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpKQorICAgIHsKKyAgICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7CisgICAgfQorICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGZpbGUsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCisgICAgeworICAgICAgKCpmb3JtYXQtPnByaW50X29iamVjdF9maWxlbmFtZSkgKGZpbGVuYW1lKTsKKyAgICAgIGRpc3BsYXlfcmVsX2ZpbGUgKGZpbGUsIE5VTEwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKKwl7CisJICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKKwkgIGZyZWUgKG1hdGNoaW5nKTsKKwl9CisgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCisgICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7CisKKyAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7CisgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKKworICByZXR1cm4gcmV0dmFsOworfQorDAorLyogVGhlc2UgZ2xvYmFscyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGludG8gdGhlIHNvcnRpbmcKKyAgIHJvdXRpbmVzLiAgKi8KK3N0YXRpYyBiZmQgKnNvcnRfYmZkOworc3RhdGljIGJvb2xlYW4gc29ydF9keW5hbWljOworc3RhdGljIGFzeW1ib2wgKnNvcnRfeDsKK3N0YXRpYyBhc3ltYm9sICpzb3J0X3k7CisKKy8qIFN5bWJvbC1zb3J0aW5nIHByZWRpY2F0ZXMgKi8KKyNkZWZpbmUgdmFsdWVvZih4KSAoKHgpLT5zZWN0aW9uLT52bWEgKyAoeCktPnZhbHVlKQorCisvKiBOdW1lcmljIHNvcnRzLiAgVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkICJsZXNzIHRoYW4iCisgICBkZWZpbmVkIHN5bWJvbHMgd2l0aCB6ZXJvIHZhbHVlcy4gIENvbW1vbiBzeW1ib2xzIGFyZSBub3QgdHJlYXRlZAorICAgc3BlY2lhbGx5IC0tIGkuZS4sIHRoZWlyIHNpemVzIGFyZSB1c2VkIGFzIHRoZWlyICJ2YWx1ZXMiLiAgKi8KKworc3RhdGljIGludAorbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSkKKyAgICAgY29uc3QgUFRSIFBfeDsKKyAgICAgY29uc3QgUFRSIFBfeTsKK3sKKyAgYXN5bWJvbCAqeCwgKnk7CisgIGFzZWN0aW9uICp4cywgKnlzOworCisgIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKKyAgeSA9ICBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKKyAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOworCisgIHhzID0gYmZkX2dldF9zZWN0aW9uICh4KTsKKyAgeXMgPSBiZmRfZ2V0X3NlY3Rpb24gKHkpOworCisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHhzKSkKKyAgICB7CisgICAgICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKKwlyZXR1cm4gLTE7CisgICAgfQorICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAodmFsdWVvZiAoeCkgIT0gdmFsdWVvZiAoeSkpCisgICAgcmV0dXJuIHZhbHVlb2YgKHgpIDwgdmFsdWVvZiAoeSkgPyAtMSA6IDE7CisKKyAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKK30KKworc3RhdGljIGludAorbnVtZXJpY19yZXZlcnNlICh4LCB5KQorICAgICBjb25zdCBQVFIgeDsKKyAgICAgY29uc3QgUFRSIHk7Cit7CisgIHJldHVybiAtIG51bWVyaWNfZm9yd2FyZCAoeCwgeSk7Cit9CisKK3N0YXRpYyBpbnQKK25vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KQorICAgICBjb25zdCBQVFIgUF94OworICAgICBjb25zdCBQVFIgUF95OworeworICBhc3ltYm9sICp4LCAqeTsKKyAgY29uc3QgY2hhciAqeG4sICp5bjsKKworICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7CisgIHkgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKKyAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOworCisgIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7CisgIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7CisKKyAgcmV0dXJuICgoeG4gPT0gTlVMTCkgPyAoKHluID09IE5VTEwpID8gMCA6IC0xKSA6CisJICAoKHluID09IE5VTEwpID8gMSA6IHN0cmNtcCAoeG4sIHluKSkpOworfQorCitzdGF0aWMgaW50Citub25fbnVtZXJpY19yZXZlcnNlICh4LCB5KQorICAgICBjb25zdCBQVFIgeDsKKyAgICAgY29uc3QgUFRSIHk7Cit7CisgIHJldHVybiAtIG5vbl9udW1lcmljX2ZvcndhcmQgKHgsIHkpOworfQorCitzdGF0aWMgaW50ICgqKHNvcnRlcnNbMl1bMl0pKSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpID0KK3sKKyAgeyBub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlIH0sCisgIHsgbnVtZXJpY19mb3J3YXJkLCBudW1lcmljX3JldmVyc2UgfQorfTsKKworLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNpbWlsYXIKKyAgIHRvIG51bWVyaWNfZm9yd2FyZCwgYnV0IHdoZW4gc3ltYm9scyBoYXZlIHRoZSBzYW1lIHZhbHVlIGl0IHNvcnRzCisgICBieSBzZWN0aW9uIFZNQS4gIFRoaXMgc2ltcGxpZmllcyB0aGUgc29ydF9zeW1ib2xzX2J5X3NpemUgY29kZQorICAgd2hpY2ggaGFuZGxlcyBzeW1ib2xzIGF0IHRoZSBlbmQgb2Ygc2VjdGlvbnMuICBBbHNvLCB0aGlzIHJvdXRpbmUKKyAgIHRyaWVzIHRvIHNvcnQgZmlsZSBuYW1lcyBiZWZvcmUgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLgorICAgVGhhdCB3aWxsIG1ha2UgdGhlIGZpbGUgbmFtZSBoYXZlIGEgemVybyBzaXplLCB3aGljaCB3aWxsIG1ha2UKKyAgIHNvcnRfc3ltYm9sc19ieV9zaXplIGNob29zZSB0aGUgbm9uIGZpbGUgbmFtZSBzeW1ib2wsIGxlYWRpbmcgdG8KKyAgIG1vcmUgbWVhbmluZ2Z1bCBvdXRwdXQuICBGb3Igc2ltaWxhciByZWFzb25zLCB0aGlzIGNvZGUgc29ydHMKKyAgIGdudV9jb21waWxlZF8qIGFuZCBnY2MyX2NvbXBpbGVkIGJlZm9yZSBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUKKyAgIHZhbHVlLiAgKi8KKworc3RhdGljIGludAorc2l6ZV9mb3J3YXJkMSAoUF94LCBQX3kpCisgICAgIGNvbnN0IFBUUiBQX3g7CisgICAgIGNvbnN0IFBUUiBQX3k7Cit7CisgIGFzeW1ib2wgKngsICp5OworICBhc2VjdGlvbiAqeHMsICp5czsKKyAgY29uc3QgY2hhciAqeG4sICp5bjsKKyAgc2l6ZV90IHhubCwgeW5sOworICBpbnQgeGYsIHlmOworCisgIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKKyAgeSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOworICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7CisKKyAgeHMgPSBiZmRfZ2V0X3NlY3Rpb24gKHgpOworICB5cyA9IGJmZF9nZXRfc2VjdGlvbiAoeSk7CisKKyAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeHMpKQorICAgIGFib3J0ICgpOworICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKHZhbHVlb2YgKHgpICE9IHZhbHVlb2YgKHkpKQorICAgIHJldHVybiB2YWx1ZW9mICh4KSA8IHZhbHVlb2YgKHkpID8gLTEgOiAxOworCisgIGlmICh4cy0+dm1hICE9IHlzLT52bWEpCisgICAgcmV0dXJuIHhzLT52bWEgPCB5cy0+dm1hID8gLTEgOiAxOworCisgIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7CisgIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7CisgIHhubCA9IHN0cmxlbiAoeG4pOworICB5bmwgPSBzdHJsZW4gKHluKTsKKworICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IGV2ZW4gbGVzcworICAgICBpbmZvcm1hdGlvbiB0aGFuIHRoZSBmaWxlIG5hbWUsIHNvIHNvcnQgdGhlbSBvdXQgZmlyc3QuICAqLworCisgIHhmID0gKHN0cnN0ciAoeG4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCisJfHwgc3Ryc3RyICh4biwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKKyAgeWYgPSAoc3Ryc3RyICh5biwgImdudV9jb21waWxlZCIpICE9IE5VTEwKKwl8fCBzdHJzdHIgKHluLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOworCisgIGlmICh4ZiAmJiAhIHlmKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCEgeGYgJiYgeWYpCisgICAgcmV0dXJuIDE7CisKKyAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbgorICAgICBVbml4IHN5c3RlbXMsIGJ1dCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UKKyAgICAgaXMgcHJlY2lzZWx5IHdoaWNoIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCisKKyNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCisgICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAorICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCisgICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKKwkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCisKKyAgeGYgPSBmaWxlX3N5bWJvbCAoeCwgeG4sIHhubCk7CisgIHlmID0gZmlsZV9zeW1ib2wgKHksIHluLCB5bmwpOworCisgIGlmICh4ZiAmJiAhIHlmKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCEgeGYgJiYgeWYpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKK30KKworLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNvcnRpbmcKKyAgIGFuIGFycmF5IG9mIHNpemVfc3ltIHN0cnVjdHVyZXMgaW50byBzaXplIG9yZGVyLiAgKi8KKworc3RhdGljIGludAorc2l6ZV9mb3J3YXJkMiAoUF94LCBQX3kpCisgICAgIGNvbnN0IFBUUiBQX3g7CisgICAgIGNvbnN0IFBUUiBQX3k7Cit7CisgIGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqeCA9IChjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKikgUF94OworICBjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKnkgPSAoY29uc3Qgc3RydWN0IHNpemVfc3ltICopIFBfeTsKKworICBpZiAoeC0+c2l6ZSA8IHktPnNpemUpCisgICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IDEgOiAtMTsKKyAgZWxzZSBpZiAoeC0+c2l6ZSA+IHktPnNpemUpCisgICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IC0xIDogMTsKKyAgZWxzZQorICAgIHJldHVybiBzb3J0ZXJzWzBdW3JldmVyc2Vfc29ydF0gKHgtPm1pbmlzeW0sIHktPm1pbmlzeW0pOworfQorCisvKiBTb3J0IHRoZSBzeW1ib2xzIGJ5IHNpemUuICBXZSBndWVzcyB0aGUgc2l6ZSBieSBhc3N1bWluZyB0aGF0IHRoZQorICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgIG5leHQgaGlnaGVyIHN5bWJvbCBpcyB0aGUgc2l6ZS4gIEZJWE1FOiBFTEYgYWN0dWFsbHkgc3RvcmVzIGEgc2l6ZQorICAgd2l0aCBlYWNoIHN5bWJvbC4gIFdlIHNob3VsZCB1c2UgaXQuICAqLworCitzdGF0aWMgbG9uZworc29ydF9zeW1ib2xzX2J5X3NpemUgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc3ltc2l6ZXNwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gZHluYW1pYzsKKyAgICAgUFRSIG1pbmlzeW1zOworICAgICBsb25nIHN5bWNvdW50OworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgc3RydWN0IHNpemVfc3ltICoqc3ltc2l6ZXNwOworeworICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOworICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7CisgIGFzeW1ib2wgKnN5bSA9IE5VTEw7CisgIGFzeW1ib2wgKnN0b3JlX3N5bSwgKnN0b3JlX25leHQ7CisKKyAgcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc2l6ZV9mb3J3YXJkMSk7CisKKyAgLyogV2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIHNwZWNpYWwgc2V0IG9mIHN5bWJvbHMgYW5kIHNpemVzIHRvCisgICAgIHByaW50LiAgKi8KKyAgc3ltc2l6ZXMgPSAoc3RydWN0IHNpemVfc3ltICopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pKTsKKyAgKnN5bXNpemVzcCA9IHN5bXNpemVzOworCisgIC8qIE5vdGUgdGhhdCBmaWx0ZXJfc3ltYm9scyBoYXMgYWxyZWFkeSByZW1vdmVkIGFsbCBhYnNvbHV0ZSBhbmQKKyAgICAgdW5kZWZpbmVkIHN5bWJvbHMuICBIZXJlIHdlIHJlbW92ZSBhbGwgc3ltYm9scyB3aG9zZSBzaXplIHdpbmRzCisgICAgIHVwIGFzIHplcm8uICAqLworCisgIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7CisgIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOworCisgIHN0b3JlX3N5bSA9IHNvcnRfeDsKKyAgc3RvcmVfbmV4dCA9IHNvcnRfeTsKKworICBpZiAoZnJvbSA8IGZyb21lbmQpCisgICAgeworICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCAoY29uc3QgUFRSKSBmcm9tLAorCQkJCSAgICAgIHN0b3JlX3N5bSk7CisgICAgICBpZiAoc3ltID09IE5VTEwpCisJYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgfQorCisgIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKm5leHQ7CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgICAgYmZkX3ZtYSBzejsKKyAgICAgIGFzeW1ib2wgKnRlbXA7CisKKyAgICAgIGlmIChmcm9tICsgc2l6ZSA8IGZyb21lbmQpCisJeworCSAgbmV4dCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwKKwkJCQkJICAgZHluYW1pYywKKwkJCQkJICAgKGNvbnN0IFBUUikgKGZyb20gKyBzaXplKSwKKwkJCQkJICAgc3RvcmVfbmV4dCk7CisJICBpZiAobmV4dCA9PSBOVUxMKQorCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKwl9CisgICAgICBlbHNlCisJbmV4dCA9IE5VTEw7CisKKyAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKKworICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKKwlzeiA9IHN5bS0+dmFsdWU7CisgICAgICBlbHNlCisJeworCSAgaWYgKGZyb20gKyBzaXplIDwgZnJvbWVuZAorCSAgICAgICYmIHNlYyA9PSBiZmRfZ2V0X3NlY3Rpb24gKG5leHQpKQorCSAgICBzeiA9IHZhbHVlb2YgKG5leHQpIC0gdmFsdWVvZiAoc3ltKTsKKwkgIGVsc2UKKwkgICAgc3ogPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQorCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQorCQkgIC0gdmFsdWVvZiAoc3ltKSk7CisJfQorCisgICAgICBpZiAoc3ogIT0gMCkKKwl7CisJICBzeW1zaXplcy0+bWluaXN5bSA9IChjb25zdCBQVFIpIGZyb207CisJICBzeW1zaXplcy0+c2l6ZSA9IHN6OworCSAgKytzeW1zaXplczsKKwl9CisKKyAgICAgIHN5bSA9IG5leHQ7CisKKyAgICAgIHRlbXAgPSBzdG9yZV9zeW07CisgICAgICBzdG9yZV9zeW0gPSBzdG9yZV9uZXh0OworICAgICAgc3RvcmVfbmV4dCA9IHRlbXA7CisgICAgfQorCisgIHN5bWNvdW50ID0gc3ltc2l6ZXMgLSAqc3ltc2l6ZXNwOworCisgIC8qIFdlIG11c3Qgbm93IHNvcnQgYWdhaW4gYnkgc2l6ZS4gICovCisgIHFzb3J0ICgoUFRSKSAqc3ltc2l6ZXNwLCBzeW1jb3VudCwgc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pLCBzaXplX2ZvcndhcmQyKTsKKworICByZXR1cm4gc3ltY291bnQ7Cit9CisMCisvKiBJZiBBUkNISVZFX0JGRCBpcyBub24tTlVMTCwgaXQgaXMgdGhlIGFyY2hpdmUgY29udGFpbmluZyBBQkZELiAgKi8KKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfcmVsX2ZpbGUgKGFiZmQsIGFyY2hpdmVfYmZkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Cit7CisgIGxvbmcgc3ltY291bnQ7CisgIFBUUiBtaW5pc3ltczsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7CisKKyAgaWYgKCEgZHluYW1pYykKKyAgICB7CisgICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisJICByZXR1cm47CisJfQorICAgIH0KKworICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCAmbWluaXN5bXMsICZzaXplKTsKKyAgaWYgKHN5bWNvdW50IDwgMCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBpZiAoc3ltY291bnQgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gcHJpbnQuCisgICAgIEl0J3MgT0sgdG8gZG8gdGhpcyBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkKKyAgICAgKGFmdGVyIHByaW50aW5nKS4gICovCisKKyAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKKworICBzeW1zaXplcyA9IE5VTEw7CisgIGlmICghIG5vX3NvcnQpCisgICAgeworICAgICAgc29ydF9iZmQgPSBhYmZkOworICAgICAgc29ydF9keW5hbWljID0gZHluYW1pYzsKKyAgICAgIHNvcnRfeCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7CisgICAgICBzb3J0X3kgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOworICAgICAgaWYgKHNvcnRfeCA9PSBOVUxMIHx8IHNvcnRfeSA9PSBOVUxMKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgICAgICBpZiAoISBzb3J0X2J5X3NpemUpCisJcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwKKwkgICAgICAgc29ydGVyc1tzb3J0X251bWVyaWNhbGx5XVtyZXZlcnNlX3NvcnRdKTsKKyAgICAgIGVsc2UKKwlzeW1jb3VudCA9IHNvcnRfc3ltYm9sc19ieV9zaXplIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsCisJCQkJCSBzaXplLCAmc3ltc2l6ZXMpOworICAgIH0KKworICBpZiAoISBzb3J0X2J5X3NpemUpCisgICAgcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCk7CisgIGVsc2UKKyAgICBwcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpOworCisgIGZyZWUgKG1pbmlzeW1zKTsKK30KKwwKKy8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBwcmludDsKKyAgIGNvbXBhY3QgdGhlbSBkb3dud2FyZCB0byBnZXQgcmlkIG9mIHRoZSByZXN0LgorICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBiZSBwcmludGVkLiAgKi8KKworc3RhdGljIGxvbmcKK2ZpbHRlcl9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBkeW5hbWljOworICAgICBQVFIgbWluaXN5bXM7CisgICAgIGxvbmcgc3ltY291bnQ7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKKyAgYXN5bWJvbCAqc3RvcmU7CisKKyAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOworICBpZiAoc3RvcmUgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOworICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKKyAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7CisKKyAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCisgICAgeworICAgICAgaW50IGtlZXAgPSAwOworICAgICAgYXN5bWJvbCAqc3ltOworCisgICAgICBQUk9HUkVTUyAoMSk7CisgICAgICAKKyAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOworICAgICAgaWYgKHN5bSA9PSBOVUxMKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgICAgICBpZiAodW5kZWZpbmVkX29ubHkpCisJa2VlcCA9IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKTsKKyAgICAgIGVsc2UgaWYgKGV4dGVybmFsX29ubHkpCisJa2VlcCA9ICgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKKwkJfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAorCQl8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKKwkJfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKKyAgICAgIGVsc2UKKwlrZWVwID0gMTsKKworICAgICAgaWYgKGtlZXAKKwkgICYmICEgcHJpbnRfZGVidWdfc3ltcworCSAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQorCWtlZXAgPSAwOworCisgICAgICBpZiAoa2VlcAorCSAgJiYgc29ydF9ieV9zaXplCisJICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pCisJICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKSkKKwlrZWVwID0gMDsKKworICAgICAgaWYgKGtlZXAKKwkgICYmIGRlZmluZWRfb25seSkKKwl7CisJICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQorCSAgICBrZWVwID0gMDsKKwl9CisKKyAgICAgIGlmIChrZWVwKQorCXsKKwkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOworCSAgdG8gKz0gc2l6ZTsKKwl9CisgICAgfQorCisgIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKK30KKwwKKy8qIFByaW50IHN5bWJvbCBuYW1lIE5BTUUsIHJlYWQgZnJvbSBBQkZELCB3aXRoIHByaW50ZiBmb3JtYXQgRk9STUFULAorICAgZGVtYW5nbGluZyBpdCBpZiByZXF1ZXN0ZWQuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltbmFtZSAoZm9ybWF0LCBuYW1lLCBhYmZkKQorICAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZCAqYWJmZDsKK3sKKyAgaWYgKGRvX2RlbWFuZ2xlICYmICpuYW1lKQorICAgIHsKKyAgICAgIGNoYXIgKnJlczsKKworICAgICAgLyogSW4gdGhpcyBtb2RlLCBnaXZlIGEgdXNlci1sZXZlbCB2aWV3IG9mIHRoZSBzeW1ib2wgbmFtZQorCSBldmVuIGlmIGl0J3Mgbm90IG1hbmdsZWQ7IHN0cmlwIG9mZiBhbnkgbGVhZGluZworCSB1bmRlcnNjb3JlLiAgKi8KKyAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCisJbmFtZSsrOworCisgICAgICByZXMgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOworICAgICAgaWYgKHJlcykKKwl7CisJICBwcmludGYgKGZvcm1hdCwgcmVzKTsKKwkgIGZyZWUgKHJlcyk7CisJICByZXR1cm47CisJfQorICAgIH0KKworICBwcmludGYgKGZvcm1hdCwgbmFtZSk7Cit9CisKKy8qIFByaW50IHRoZSBzeW1ib2xzLiAgSWYgQVJDSElWRV9CRkQgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBhcmNoaXZlCisgICBjb250YWluaW5nIEFCRkQuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCkKKyAgICAgYmZkICphYmZkOworICAgICBib29sZWFuIGR5bmFtaWM7CisgICAgIFBUUiBtaW5pc3ltczsKKyAgICAgbG9uZyBzeW1jb3VudDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Cit7CisgIGFzeW1ib2wgKnN0b3JlOworICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7CisKKyAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOworICBpZiAoc3RvcmUgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOworICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKKyAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltOworCisgICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20sIHN0b3JlKTsKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICAgICAgcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKTsKKyAgICB9Cit9CisKKy8qIFByaW50IHRoZSBzeW1ib2xzIHdoZW4gc29ydGluZyBieSBzaXplLiAgKi8KKworc3RhdGljIHZvaWQgCitwcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBkeW5hbWljOworICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOworICAgICBsb25nIHN5bWNvdW50OworICAgICBiZmQgKmFyY2hpdmVfYmZkOworeworICBhc3ltYm9sICpzdG9yZTsKKyAgc3RydWN0IHNpemVfc3ltICpmcm9tLCAqZnJvbWVuZDsKKworICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7CisgIGlmIChzdG9yZSA9PSBOVUxMKQorICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgIGZyb20gPSBzeW1zaXplczsKKyAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudDsKKyAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tKyspCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltOworCisgICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20tPm1pbmlzeW0sIHN0b3JlKTsKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICAgICAgLyogU2V0IHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCB3ZSBhY3R1YWxseSBkaXNwbGF5IHRoZSBzeW1ib2wKKyAgICAgICAgIHNpemUuICAqLworICAgICAgc3ltLT52YWx1ZSA9IGZyb20tPnNpemUgLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7CisKKyAgICAgIHByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCk7CisgICAgfQorfQorCisvKiBQcmludCBhIHNpbmdsZSBzeW1ib2wuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgYmZkICphcmNoaXZlX2JmZDsKK3sKKyAgUFJPR1JFU1MgKDEpOworCisgICgqZm9ybWF0LT5wcmludF9zeW1ib2xfZmlsZW5hbWUpIChhcmNoaXZlX2JmZCwgYWJmZCk7CisKKyAgaWYgKHVuZGVmaW5lZF9vbmx5KQorICAgIHsKKyAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCisJcHJpbnRfc3ltbmFtZSAoIiVzIiwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgYWJmZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3ltYm9sX2luZm8gc3ltaW5mbzsKKworICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltLCAmc3ltaW5mbyk7CisgICAgICAoKmZvcm1hdC0+cHJpbnRfc3ltYm9sX2luZm8pICgmc3ltaW5mbywgYWJmZCk7CisgICAgfQorCisgIGlmIChsaW5lX251bWJlcnMpCisgICAgeworICAgICAgc3RhdGljIGFzeW1ib2wgKipzeW1zOworICAgICAgc3RhdGljIGxvbmcgc3ltY291bnQ7CisgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmN0aW9ubmFtZTsKKyAgICAgIHVuc2lnbmVkIGludCBsaW5lbm87CisKKyAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scyBpbiBvcmRlciB0byBjYWxsCisgICAgICAgICBiZmRfZmluZF9uZWFyZXN0X2xpbmUuICBUaGlzIGlzIGluZWZmaWNpZW50LCBidXQsIHRoZW4sIHlvdQorICAgICAgICAgZG9uJ3QgaGF2ZSB0byB1c2UgLS1saW5lLW51bWJlcnMuICAqLworICAgICAgaWYgKGFiZmQgIT0gbGluZW5vX2NhY2hlX2JmZCAmJiBzeW1zICE9IE5VTEwpCisJeworCSAgZnJlZSAoc3ltcyk7CisJICBzeW1zID0gTlVMTDsKKwl9CisgICAgICBpZiAoc3ltcyA9PSBOVUxMKQorCXsKKwkgIGxvbmcgc3ltc2l6ZTsKKworCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKKwkgIGlmIChzeW1zaXplIDwgMCkKKwkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisJICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOworCSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7CisJICBpZiAoc3ltY291bnQgPCAwKQorCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKwkgIGxpbmVub19jYWNoZV9iZmQgPSBhYmZkOworCX0KKworICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKKwl7CisJICBzdGF0aWMgYXNlY3Rpb24gKipzZWNzOworCSAgc3RhdGljIGFyZWxlbnQgKioqcmVsb2NzOworCSAgc3RhdGljIGxvbmcgKnJlbGNvdW50OworCSAgc3RhdGljIHVuc2lnbmVkIGludCBzZWNjb3VudDsKKwkgIHVuc2lnbmVkIGludCBpOworCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKKworCSAgLyogRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlIHRyeSB0byBmaW5kIGEgcmVsb2MgZm9yIHRoZQorICAgICAgICAgICAgIHN5bWJvbCwgYW5kIHByaW50IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgcmVsb2MuICAqLworCisJICBpZiAoYWJmZCAhPSBsaW5lbm9fY2FjaGVfcmVsX2JmZCAmJiByZWxvY3MgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQorCQlpZiAocmVsb2NzW2ldICE9IE5VTEwpCisJCSAgZnJlZSAocmVsb2NzW2ldKTsKKwkgICAgICBmcmVlIChzZWNzKTsKKwkgICAgICBmcmVlIChyZWxvY3MpOworCSAgICAgIGZyZWUgKHJlbGNvdW50KTsKKwkgICAgICBzZWNzID0gTlVMTDsKKwkgICAgICByZWxvY3MgPSBOVUxMOworCSAgICAgIHJlbGNvdW50ID0gTlVMTDsKKwkgICAgfQorCisJICBpZiAocmVsb2NzID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvIGluZm87CisKKwkgICAgICBzZWNjb3VudCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7CisKKwkgICAgICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqc2Vjcyk7CisJICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKioqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqcmVsb2NzKTsKKwkgICAgICByZWxjb3VudCA9IChsb25nICopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpyZWxjb3VudCk7CisKKwkgICAgICBpbmZvLnNlY3MgPSBzZWNzOworCSAgICAgIGluZm8ucmVsb2NzID0gcmVsb2NzOworCSAgICAgIGluZm8ucmVsY291bnQgPSByZWxjb3VudDsKKwkgICAgICBpbmZvLnN5bXMgPSBzeW1zOworCSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZ2V0X3JlbG9jcywgKFBUUikgJmluZm8pOworCSAgICAgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gYWJmZDsKKwkgICAgfQorCisJICBzeW1uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKKwkgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQorCSAgICB7CisJICAgICAgbG9uZyBqOworCisJICAgICAgZm9yIChqID0gMDsgaiA8IHJlbGNvdW50W2ldOyBqKyspCisJCXsKKwkJICBhcmVsZW50ICpyOworCisJCSAgciA9IHJlbG9jc1tpXVtqXTsKKwkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gTlVMTAorCQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbiA9PSBzeW0tPnNlY3Rpb24KKwkJICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IHN5bS0+dmFsdWUKKwkJICAgICAgJiYgc3RyY21wIChzeW1uYW1lLAorCQkJCSBiZmRfYXN5bWJvbF9uYW1lICgqci0+c3ltX3B0cl9wdHIpKSA9PSAwCisJCSAgICAgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2Vjc1tpXSwgc3ltcywKKwkJCQkJCXItPmFkZHJlc3MsICZmaWxlbmFtZSwKKwkJCQkJCSZmdW5jdGlvbm5hbWUsICZsaW5lbm8pKQorCQkgICAgeworCQkgICAgICAvKiBXZSBvbmx5IHByaW50IHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gICovCisJCSAgICAgIHByaW50ZiAoIlx0JXM6JXUiLCBmaWxlbmFtZSwgbGluZW5vKTsKKwkJICAgICAgaSA9IHNlY2NvdW50OworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vd25lciA9PSBhYmZkKQorCXsKKwkgIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSwgc3ltcywKKwkJCQkgICAgIHN5bS0+dmFsdWUsICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKKwkJCQkgICAgICZsaW5lbm8pCisJICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAorCSAgICAgICYmIGxpbmVubyAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiXHQlczoldSIsIGZpbGVuYW1lLCBsaW5lbm8pOworCSAgICB9CisJfQorICAgIH0KKworICBwdXRjaGFyICgnXG4nKTsKK30KKwwKKy8qIFRoZSBmb2xsb3dpbmcgMyBncm91cHMgb2YgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5LAorICAgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBlYWNoIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisgICBUaGV5IHNob3VsZCBjaGVjayBgZmlsZW5hbWVfcGVyX2ZpbGUnIGFuZCBgZmlsZW5hbWVfcGVyX3N5bWJvbCcsCisgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgb3V0cHV0IGZvcm1hdCwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KKyAgIHByaW50IGFueXRoaW5nLiAgKi8KKwwKKy8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCAoZmlsZW5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUgJiYgIWZpbGVuYW1lX3Blcl9zeW1ib2wpCisgICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X29iamVjdF9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGlmICh1bmRlZmluZWRfb25seSkKKyAgICBwcmludGYgKF8oIlxuXG5VbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOworICBlbHNlCisgICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOworICBwcmludGYgKF8oIlwKK05hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgIFNlY3Rpb25cblxuIikpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGlmIChmaWxlbmFtZV9wZXJfZmlsZSAmJiAhZmlsZW5hbWVfcGVyX3N5bWJvbCkKKyAgICBwcmludGYgKCIlczpcbiIsIGZpbGVuYW1lKTsKK30KKwwKKy8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGlmIChmaWxlbmFtZV9wZXJfZmlsZSkKKyAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7Cit9CisMCisvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCAoYXJjaGl2ZSwgZmlsZW5hbWUpCisgICAgIGNoYXIgKmFyY2hpdmU7CisgICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOworeworICBpZiAoIWZpbGVuYW1lX3Blcl9zeW1ib2wpCisgICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YgKGFyY2hpdmUsIGZpbGVuYW1lKQorICAgICBjaGFyICphcmNoaXZlOworICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgaWYgKHVuZGVmaW5lZF9vbmx5KQorICAgIHByaW50ZiAoXygiXG5cblVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuXG4iKSwgYXJjaGl2ZSwgZmlsZW5hbWUpOworICBlbHNlCisgICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzWyVzXTpcblxuIiksIGFyY2hpdmUsIGZpbGVuYW1lKTsKKyAgcHJpbnRmIChfKCJcCitOYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICBTZWN0aW9uXG5cbiIpKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4IChhcmNoaXZlLCBmaWxlbmFtZSkKKyAgICAgY2hhciAqYXJjaGl2ZTsKKyAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Cit7CisgIGlmICghZmlsZW5hbWVfcGVyX3N5bWJvbCkKKyAgICBwcmludGYgKCIlc1slc106XG4iLCBhcmNoaXZlLCBmaWxlbmFtZSk7Cit9CisMCisvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKKyAgIGNvbnRhaW5pbmcgYSBzeW1ib2wuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCAoYXJjaGl2ZV9iZmQsIGFiZmQpCisgICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOworeworICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKKyAgICB7CisgICAgICBpZiAoYXJjaGl2ZV9iZmQpCisJcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKKyAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiAoYXJjaGl2ZV9iZmQsIGFiZmQpCisgICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOworeworICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKKyAgICB7CisgICAgICBpZiAoYXJjaGl2ZV9iZmQpCisJcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKKyAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXggKGFyY2hpdmVfYmZkLCBhYmZkKQorICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKK3sKKyAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCisgICAgeworICAgICAgaWYgKGFyY2hpdmVfYmZkKQorCXByaW50ZiAoIiVzWyVzXTogIiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpLAorCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBlbHNlCisJcHJpbnRmICgiJXM6ICIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9Cit9CisMCisvKiBQcmludCBhIHN5bWJvbCB2YWx1ZS4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF92YWx1ZSAodmFsKQorICAgICBiZmRfdm1hIHZhbDsKK3sKKyNpZiAhIGRlZmluZWQgKEJGRDY0KSB8fCBCRkRfSE9TVF82NEJJVF9MT05HCisgIHByaW50ZiAodmFsdWVfZm9ybWF0LCB2YWwpOworI2Vsc2UKKyAgLyogV2UgaGF2ZSBhIDY0IGJpdCB2YWx1ZSB0byBwcmludCwgYnV0IHRoZSBob3N0IGlzIG9ubHkgMzIgYml0LiAgKi8KKyAgaWYgKHByaW50X3JhZGl4ID09IDE2KQorICAgIGZwcmludGZfdm1hIChzdGRvdXQsIHZhbCk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyIGJ1ZlszMF07CisgICAgICBjaGFyICpzOworCisgICAgICBzID0gYnVmICsgc2l6ZW9mIGJ1ZjsKKyAgICAgICotLXMgPSAnXDAnOworICAgICAgd2hpbGUgKHZhbCA+IDApCisJeworCSAgKi0tcyA9ICh2YWwgJSBwcmludF9yYWRpeCkgKyAnMCc7CisJICB2YWwgLz0gcHJpbnRfcmFkaXg7CisJfQorICAgICAgd2hpbGUgKChidWYgKyBzaXplb2YgYnVmIC0gMSkgLSBzIDwgMTYpCisJKi0tcyA9ICcwJzsKKyAgICAgIHByaW50ZiAoIiVzIiwgcyk7CisgICAgfQorI2VuZGlmCit9CisKKy8qIFByaW50IGEgbGluZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfaW5mb19ic2QgKGluZm8sIGFiZmQpCisgICAgIHN5bWJvbF9pbmZvICppbmZvOworICAgICBiZmQgKmFiZmQ7Cit7CisgIGlmIChpbmZvLT50eXBlID09ICdVJykKKyAgICB7CisgICAgICBwcmludGYgKCIlKnMiLAorI2lmZGVmIEJGRDY0CisJICAgICAgMTYsCisjZWxzZQorCSAgICAgIDgsCisjZW5kaWYKKwkgICAgICAiIik7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKKyAgcHJpbnRmICgiICVjIiwgaW5mby0+dHlwZSk7CisgIGlmIChpbmZvLT50eXBlID09ICctJykKKyAgICB7CisgICAgICAvKiBBIHN0YWIuICAqLworICAgICAgcHJpbnRmICgiICIpOworICAgICAgcHJpbnRmIChvdGhlcl9mb3JtYXQsIGluZm8tPnN0YWJfb3RoZXIpOworICAgICAgcHJpbnRmICgiICIpOworICAgICAgcHJpbnRmIChkZXNjX2Zvcm1hdCwgaW5mby0+c3RhYl9kZXNjKTsKKyAgICAgIHByaW50ZiAoIiAlNXMiLCBpbmZvLT5zdGFiX25hbWUpOworICAgIH0KKyAgcHJpbnRfc3ltbmFtZSAoIiAlcyIsIGluZm8tPm5hbWUsIGFiZmQpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc3ltYm9sX2luZm9fc3lzdiAoaW5mbywgYWJmZCkKKyAgICAgc3ltYm9sX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcHJpbnRfc3ltbmFtZSAoIiUtMjBzfCIsIGluZm8tPm5hbWUsIGFiZmQpOwkvKiBOYW1lICovCisgIGlmIChpbmZvLT50eXBlID09ICdVJykKKyAgICBwcmludGYgKCIgICAgICAgICIpOwkvKiBWYWx1ZSAqLworICBlbHNlCisgICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKKyAgcHJpbnRmICgifCAgICVjICB8IiwgaW5mby0+dHlwZSk7CS8qIENsYXNzICovCisgIGlmIChpbmZvLT50eXBlID09ICctJykKKyAgICB7CisgICAgICAvKiBBIHN0YWIuICAqLworICAgICAgcHJpbnRmICgiJTE4c3wgICIsIGluZm8tPnN0YWJfbmFtZSk7CS8qIChDKSBUeXBlICovCisgICAgICBwcmludGYgKGRlc2NfZm9ybWF0LCBpbmZvLT5zdGFiX2Rlc2MpOwkvKiBTaXplICovCisgICAgICBwcmludGYgKCJ8ICAgICB8Iik7CS8qIExpbmUsIFNlY3Rpb24gKi8KKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYgKCIgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCIpOwkvKiBUeXBlLCBTaXplLCBMaW5lLCBTZWN0aW9uICovCit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfaW5mb19wb3NpeCAoaW5mbywgYWJmZCkKKyAgICAgc3ltYm9sX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcHJpbnRfc3ltbmFtZSAoIiVzICIsIGluZm8tPm5hbWUsIGFiZmQpOworICBwcmludGYgKCIlYyAiLCBpbmZvLT50eXBlKTsKKyAgaWYgKGluZm8tPnR5cGUgPT0gJ1UnKQorICAgIHByaW50ZiAoIiAgICAgICAgIik7CisgIGVsc2UKKyAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOworICAvKiBQT1NJWC4yIHdhbnRzIHRoZSBzeW1ib2wgc2l6ZSBwcmludGVkIGhlcmUsIHdoZW4gYXBwbGljYWJsZTsKKyAgICAgQkZEIGN1cnJlbnRseSBkb2Vzbid0IHByb3ZpZGUgaXQsIHNvIHdlIHRha2UgdGhlIGVhc3kgd2F5IG91dCBieQorICAgICBjb25zaWRlcmluZyBpdCB0byBuZXZlciBiZSBhcHBsaWNhYmxlLiAgKi8KK30KKwwKK3N0YXRpYyB2b2lkCitwcmludF9zeW1kZWZfZW50cnkgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgc3ltaW5kZXggaWR4ID0gQkZEX05PX01PUkVfU1lNQk9MUzsKKyAgY2Fyc3ltICp0aGVzeW07CisgIGJvb2xlYW4gZXZlcnByaW50ZWQgPSBmYWxzZTsKKworICBmb3IgKGlkeCA9IGJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIGlkeCwgJnRoZXN5bSk7CisgICAgICAgaWR4ICE9IEJGRF9OT19NT1JFX1NZTUJPTFM7CisgICAgICAgaWR4ID0gYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgaWR4LCAmdGhlc3ltKSkKKyAgICB7CisgICAgICBiZmQgKmVsdDsKKyAgICAgIGlmICghZXZlcnByaW50ZWQpCisJeworCSAgcHJpbnRmIChfKCJcbkFyY2hpdmUgaW5kZXg6XG4iKSk7CisJICBldmVycHJpbnRlZCA9IHRydWU7CisJfQorICAgICAgZWx0ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGlkeCk7CisgICAgICBpZiAoZWx0ID09IE5VTEwpCisJYmZkX2ZhdGFsICgiYmZkX2dldF9lbHRfYXRfaW5kZXgiKTsKKyAgICAgIGlmICh0aGVzeW0tPm5hbWUgIT0gKGNoYXIgKikgTlVMTCkKKwl7CisJICBwcmludF9zeW1uYW1lICgiJXMiLCB0aGVzeW0tPm5hbWUsIGFiZmQpOworCSAgcHJpbnRmICgiIGluICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChlbHQpKTsKKwl9CisgICAgfQorfQorDAorLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4KKyAgIEl0IGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KKworc3RhdGljIHZvaWQKK2dldF9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YWFyZykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBQVFIgZGF0YWFyZzsKK3sKKyAgc3RydWN0IGdldF9yZWxvY3NfaW5mbyAqZGF0YSA9IChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvICopIGRhdGFhcmc7CisKKyAgKmRhdGEtPnNlY3MgPSBzZWM7CisKKyAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQorICAgIHsKKyAgICAgICpkYXRhLT5yZWxvY3MgPSBOVUxMOworICAgICAgKmRhdGEtPnJlbGNvdW50ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb25nIHJlbHNpemU7CisKKyAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOworICAgICAgaWYgKHJlbHNpemUgPCAwKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgICAgICAqZGF0YS0+cmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOworICAgICAgKmRhdGEtPnJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCAqZGF0YS0+cmVsb2NzLAorCQkJCQkJZGF0YS0+c3ltcyk7CisgICAgICBpZiAoKmRhdGEtPnJlbGNvdW50IDwgMCkKKwliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9CisKKyAgKytkYXRhLT5zZWNzOworICArK2RhdGEtPnJlbG9jczsKKyAgKytkYXRhLT5yZWxjb3VudDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1yYW5saWIuYyBiL2JpbnV0aWxzL25vdC1yYW5saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI5Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvbm90LXJhbmxpYi5jCkBAIC0wLDAgKzEsMyBAQAorLyogTGlua2VkIHdpdGggYXIubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdhcicgKG5vdCAncmFubGliJykuICovCisKK2ludCBpc19yYW5saWIgPSAwOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbm90LXN0cmlwLmMgYi9iaW51dGlscy9ub3Qtc3RyaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODA5M2NlCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvbm90LXN0cmlwLmMKQEAgLTAsMCArMSw0IEBACisvKiBMaW5rZWQgd2l0aCBvYmpjb3B5Lm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnb2JqY29weScgKG5vdAorICAgJ3N0cmlwJykuICovCisKK2ludCBpc19zdHJpcCA9IDA7CmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpjb3B5LjEgYi9iaW51dGlscy9vYmpjb3B5LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlNzc2MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL29iamNvcHkuMQpAQCAtMCwwICsxLDMxOSBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggb2JqY29weSAxICJPY3RvYmVyIDE5OTQiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKKy5kZSBCUAorLnNwCisudGkgXC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCitvYmpjb3B5IFwtIGNvcHkgYW5kIHRyYW5zbGF0ZSBvYmplY3QgZmlsZXMKKworLlNIIFNZTk9QU0lTCisuaHkgMAorLm5hCisuVFAKKy5CIG9iamNvcHkKKy5SQiAiW1x8IiBcLUZcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLUlcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCisuUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZSICJcfF0iCisuUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbFxmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWdcZlIgIlx8XSIgCisuUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLUtcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLU5cIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCisuUkIgIltcfCIgXC1MXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAorLlJCICJbXHwiIFwtV1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCisuUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsXGZSICJcfF0iIAorLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2Fsc1xmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLWJcIFxmSWJ5dGVcZlJcIHxcIFxmQlwtXC1ieXRlPVxmSWJ5dGVcZlIgIlx8XSIgCisuUkIgIltcfCIgXC1pXCBcZklpbnRlcmxlYXZlXGZSXCB8XCBcZkJcLVwtaW50ZXJsZWF2ZT1cZklpbnRlcmxlYXZlXGZSICJcfF0iIAorLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlc1xmUiAiXHxdIiAKKy5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iCisuUkIgIltcfCIgXC1cLWdhcFwtZmlsbD1cZkl2YWxcZlIgIlx8XSIKKy5SQiAiW1x8IiBcLVwtcGFkXC10bz1cZklhZGRyZXNzXGZSICJcfF0iCisuUkIgIltcfCIgXC1cLXNldFwtc3RhcnQ9XGZJdmFsXGZSICJcfF0iCisuUkIgIltcfCIgXC1cLWNoYW5nZVwtc3RhcnQ9XGZJaW5jclxmUiAiXHxdIgorLlJCICJbXHwiIFwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSICJcfF0iCisuUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtYWRkcmVzcz1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgorLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgorLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgorLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCisuUkIgIltcfCIgXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCisuUkIgIltcfCIgXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFnc1xmUiAiXHxdIgorLlJCICJbXHwiIFwtXC1hZGRcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWU9ZmlsZW5hbWVcZlIgIlx8XSIKKy5SQiAiW1x8IiBcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyXGZSICJcfF0iCisuUkIgIltcfCIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhclxmUiAiXHxdIgorLlJCICJbXHwiIFwtXC13ZWFrZW5cZlIgIlx8XSIKKy5SQiAiW1x8IiBcLXZcIHxcIFwtXC12ZXJib3NlXGZSICJcfF0iIAorLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCisuUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCisuQiBpbmZpbGUKKy5SQiAiW1x8IiBvdXRmaWxlXGZSICJcfF0iIAorLlNIIERFU0NSSVBUSU9OCitUaGUgR05VIAorLkIgb2JqY29weQordXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBmaWxlIHRvIGFub3RoZXIuICAKKy5CIG9iamNvcHkgCit1c2VzIHRoZSBHTlUgQkZEIExpYnJhcnkgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbgord3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YKK3RoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgCisuQiBvYmpjb3B5CitpcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLgorLlBQCisuQiBvYmpjb3B5CitjcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0byBkbyBpdHMgdHJhbnNsYXRpb25zIGFuZCBkZWxldGVzIHRoZW0KK2FmdGVyd2FyZC4KKy5CIG9iamNvcHkKK3VzZXMgQkZEIHRvIGRvIGFsbCBpdHMgdHJhbnNsYXRpb24gd29yazsgaXQga25vd3MgYWJvdXQgYWxsIHRoZQorZm9ybWF0cyBCRkQga25vd3MgYWJvdXQsIGFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cword2l0aG91dCBiZWluZyB0b2xkIGV4cGxpY2l0bHkuCisuUFAKKy5CIG9iamNvcHkKK2NhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFMtcmVjb3JkcyBieSB1c2luZyBhbiBvdXRwdXQgdGFyZ2V0IG9mCisuQiBzcmVjCisoZS5nLiwgdXNlCisuQiAtTyBzcmVjKS4KKy5QUAorLkIgb2JqY29weQorY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSByYXcgYmluYXJ5IGZpbGUgYnkgdXNpbmcgYW4gb3V0cHV0IHRhcmdldCBvZgorLkIgYmluYXJ5CisoZS5nLiwgdXNlCisuQiAtTyBiaW5hcnkpLgorV2hlbgorLkIgb2JqY29weQorZ2VuZXJhdGVzIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCB3aWxsIGVzc2VudGlhbGx5IHByb2R1Y2UgYSBtZW1vcnkgZHVtcAorb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIEFsbCBzeW1ib2xzIGFuZCByZWxvY2F0aW9uCitpbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gIFRoZSBtZW1vcnkgZHVtcCB3aWxsIHN0YXJ0IGF0IHRoZQordmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuCisuUFAKK1doZW4gZ2VuZXJhdGluZyBhbiBTLXJlY29yZCBvciBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgbWF5IGJlIGhlbHBmdWwgdG8KK3VzZQorLkIgLVMKK3RvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIHNvbWUgY2FzZXMKKy5CIC1SCit3aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbiBpbmZvcm1hdGlvbiB3aGljaCBpcworbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCisuUFAKKy5JIGluZmlsZQorYW5kCisuSSBvdXRmaWxlCithcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzIHJlc3BlY3RpdmVseS4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeQorLklSIG91dGZpbGUgLAorLkIgb2JqY29weQorY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoIHRoZQorbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4KKworLlNIIE9QVElPTlMKKy5UUAorLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKK0NvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCisuSVIgYmZkbmFtZSAsCityYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KKy5UUAorLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCitXcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCisuSVIgYmZkbmFtZSAuCisuVFAKKy5CIFwtRiBcZkliZmRuYW1lXGZSLCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUKK1VzZSAKKy5JIGJmZG5hbWUKK2FzIHRoZSBvYmplY3QgZm9ybWF0IGZvciBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dCBmaWxlOyBpLmUuCitzaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vIHRyYW5zbGF0aW9uLgorLlRQCisuQiBcLVIgXGZJc2VjdGlvbm5hbWVcZlIsIFxmQlwtXC1yZW1vdmUtc2VjdGlvbj1cZklzZWN0aW9ubmFtZQorUmVtb3ZlIHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZQordGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIGluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUKK291dHB1dCBmaWxlIHVudXNhYmxlLgorLlRQCisuQiBcLVNcZlIsIFxmQlwtXC1zdHJpcFwtYWxsCitEbyBub3QgY29weSByZWxvY2F0aW9uIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgc291cmNlIGZpbGUuCisuVFAKKy5CIFwtZ1xmUiwgXGZCXC1cLXN0cmlwXC1kZWJ1ZworRG8gbm90IGNvcHkgZGVidWdnaW5nIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCisuVFAKKy5CIFwtXC1zdHJpcFwtdW5uZWVkZWQKK1N0cmlwIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KKy5UUAorLkIgXC1LIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQorQ29weSBvbmx5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgorbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgorLlRQCisuQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQorRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCittYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCisuVFAKKy5CIFwtTCBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lCitNYWtlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGxvY2FsIHRvIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGlzIG5vdAordmlzaWJsZSBleHRlcm5hbGx5LiAgVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgorLlRQCisuQiBcLVcgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKK01ha2Ugc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgd2Vhay4gVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgorLlRQCisuQiBcLXhcZlIsIFxmQiBcLVwtZGlzY2FyZFwtYWxsCitEbyBub3QgY29weSBub24tZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCisuVFAKKy5CIFwtWFxmUiwgXGZCXC1cLWRpc2NhcmRcLWxvY2FscworRG8gbm90IGNvcHkgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuIChUaGVzZSB1c3VhbGx5IHN0YXJ0Cit3aXRoICJMIiBvciAiLiIpLgorLlRQCisuQiBcLWIgXGZJYnl0ZVxmUiwgXGZCXC1cLWJ5dGU9XGZJYnl0ZQorS2VlcCBvbmx5IGV2ZXJ5IFxmSWJ5dGVcZlB0aCBieXRlIG9mIHRoZSBpbnB1dCBmaWxlIChoZWFkZXIgZGF0YSBpcworbm90IGFmZmVjdGVkKS4gIFxmSWJ5dGVcZlAgY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gdGhlCitpbnRlcmxlYXZlLTEuICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGZpbGVzIHRvIHByb2dyYW0KK1JPTXMuICBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFuIHNyZWMgb3V0cHV0IHRhcmdldC4KKy5UUAorLkIgXC1pIFxmSWludGVybGVhdmVcZlIsIFxmQlwtXC1pbnRlcmxlYXZlPVxmSWludGVybGVhdmUKK09ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IFxmSWludGVybGVhdmVcZlAgYnl0ZXMuICBXaGljaCBvbmUgdG8gY29weSBpcworc2VsZWN0ZWQgYnkgdGhlIFxmQlwtYlxmUCBvciBcZkJcLVwtYnl0ZVxmUCBvcHRpb24uICBUaGUgZGVmYXVsdCBpcyA0LgorVGhlIGludGVybGVhdmUgaXMgaWdub3JlZCBpZiBuZWl0aGVyIFxmQlwtYlxmUCBub3IgXGZCXC1cLWJ5dGVcZlAgaXMgZ2l2ZW4uCisuVFAKKy5CIFwtcFxmUiwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcworU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiBkYXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgdGhlIHNhbWUKK2FzIHRob3NlIG9mIHRoZSBpbnB1dCBmaWxlLgorLlRQCisuQiBcLVwtZGVidWdnaW5nCitDb252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgcG9zc2libGUuICBUaGlzIGlzIG5vdCB0aGUgZGVmYXVsdAorYmVjYXVzZSBvbmx5IGNlcnRhaW4gZGVidWdnaW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgYW5kIHRoZQorY29udmVyc2lvbiBwcm9jZXNzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4KKy5UUAorLkIgXC1cLWdhcFwtZmlsbD1cZkl2YWwKK0ZpbGwgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHdpdGggXGZJdmFsXGZQLiAgVGhpcyBvcGVyYXRpb24gYXBwbGllcyB0bwordGhlIFxmSWxvYWQgYWRkcmVzc1xmUCAoTE1BKSBvZiB0aGUgc2VjdGlvbnMuICBJdCBpcyBkb25lIGJ5IGluY3JlYXNpbmcKK3RoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VyIGFkZHJlc3MsIGFuZCBmaWxsaW5nIGluIHRoZSBleHRyYQorc3BhY2UgY3JlYXRlZCB3aXRoIFxmSXZhbFxmUC4KKy5UUAorLkIgXC1cLXBhZFwtdG89XGZJYWRkcmVzcworUGFkIHRoZSBvdXRwdXQgZmlsZSB1cCB0byB0aGUgbG9hZCBhZGRyZXNzIFxmSWFkZHJlc3NcZlAuICBUaGlzIGlzCitkb25lIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbi4gIFRoZSBleHRyYSBzcGFjZSBpcworZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSBcZkJcLVwtZ2FwXC1maWxsXGZQIChkZWZhdWx0Cit6ZXJvKS4KKy5UUAorLkIgXGZCXC1cLXNldFwtc3RhcnQ9XGZJdmFsCitTZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5ldyBmaWxlIHRvIFxmSXZhbFxmUC4gIE5vdCBhbGwgb2JqZWN0CitmaWxlIGZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgorLlRQCisuQiBcZkJcLVwtY2hhbmdlXC1zdGFydD1cZklpbmNyXGZSLCBcZkJcLVwtYWRqdXN0XC1zdGFydD1cZklpbmNyCitDaGFuZ2VzIHRoZSBzdGFydCBhZGRyZXNzIGJ5IGFkZGluZyBcZklpbmNyXGZQLiAgTm90IGFsbCBvYmplY3QgZmlsZQorZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCisuVFAKKy5CIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSLCBcZkJcLVwtYWRqdXN0XC12bWE9XGZJaW5jcgorQ2hhbmdlcyB0aGUgYWRkcmVzcyBvZiBhbGwgc2VjdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFkZHJlc3MsIGJ5CithZGRpbmcgXGZJaW5jclxmUC4gIFNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3QgcGVybWl0IHNlY3Rpb24KK2FkZHJlc3NlcyB0byBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcmVsb2NhdGUKK3RoZSBzZWN0aW9uczsgaWYgdGhlIHByb2dyYW0gZXhwZWN0cyBzZWN0aW9ucyB0byBiZSBsb2FkZWQgYXQgYQorY2VydGFpbiBhZGRyZXNzLCBhbmQgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHNlY3Rpb25zIHN1Y2gKK3RoYXQgdGhleSBhcmUgbG9hZGVkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIHRoZSBwcm9ncmFtIG1heSBmYWlsLgorLlRQCisuQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1hZGRyZXNzPVxmSXNlY3Rpb257PSwrLC19dmFsXGZSLCBcZkJcLVwtYWRqdXN0XC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWwKK1NldCBvciBjaGFuZ2VzIHRoZSBWTUEgYW5kIExNQSBhZGRyZXNzZXMgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuCitJZiBcZkk9XGZQIGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4KK090aGVyd2lzZSwgXGZJdmFsXGZQIGlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbgorYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMgdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmCitcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZQoraXNzdWVkLCB1bmxlc3MgXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCisuVFAKKy5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbAorU2V0IG9yIGNoYW5nZSB0aGUgTE1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIFxmSXNlY3Rpb25cZlAuICBJZiBcZkk9XGZQIGlzCit1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0byBcZkl2YWxcZlAuICBPdGhlcndpc2UsIFxmSXZhbFxmUAoraXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzCit1bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYgXGZJc2VjdGlvblxmUCBkb2VzIG5vdCBleGlzdAoraW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCwgdW5sZXNzCitcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KKy5UUAorLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtdm1hPVxmSXNlY3Rpb257PSwrLC19dmFsCitTZXQgb3IgY2hhbmdlIHRoZSBWTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4gIElmIFxmST1cZlAgaXMKK3VzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4gIE90aGVyd2lzZSwgXGZJdmFsXGZQCitpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMKK3VuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZiBcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0CitpbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKK1xmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgorLlRQCisuQiBcZkJcLVwtY2hhbmdlXC13YXJuaW5nc1xmUiwgXGZCXC1cLWFkanVzdFwtd2FybmluZ3MKK0lmIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLVhYWFxmUCBpcyB1c2VkLCBhbmQgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcworbm90IGV4aXN0LCBpc3N1ZSBhIHdhcm5pbmcuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorLlRQCisuQiBcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlIsIFxmQlwtXC1ub1wtYWRqdXN0XC13YXJuaW5ncworRG8gbm90IGlzc3VlIGEgd2FybmluZyBpZiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC1YWFhcZlAgaXMgdXNlZCwgZXZlbgoraWYgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3QuCisuVFAKKy5CIFxmQlwtXC1zZXRcLXNlY3Rpb25cLWZsYWdzPVxmSXNlY3Rpb249ZmxhZ3MKK1NldCB0aGUgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgVGhlIFxmSWZsYWdzXGZQIGFyZ3VtZW50IGlzIGEKK2NvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgZmxhZyBuYW1lcy4gIFRoZSByZWNvZ25pemVkIG5hbWVzIGFyZQorXGZJYWxsb2NcZlAsIFxmSWxvYWRcZlAsIFxmSXJlYWRvbmx5XGZQLCBcZkljb2RlXGZQLCBcZklkYXRhXGZQLCBhbmQKK1xmSXJvbVxmUC4gIE5vdCBhbGwgZmxhZ3MgYXJlIG1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZQorZm9ybWF0cy4KKy5UUAorLkIgXGZCXC1cLWFkZFwtc2VjdGlvbj1cZklzZWN0aW9ubmFtZT1maWxlbmFtZQorQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgXGZJc2VjdGlvbm5hbWVcZlIgd2hpbGUgY29weWluZyB0aGUgZmlsZS4gIFRoZQorY29udGVudHMgb2YgdGhlIG5ldyBzZWN0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBmaWxlIFxmSWZpbGVuYW1lXGZSLgorVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uCitvbmx5IHdvcmtzIG9uIGZpbGUgZm9ybWF0cyB3aGljaCBjYW4gc3VwcG9ydCBzZWN0aW9ucyB3aXRoIGFyYml0cmFyeQorbmFtZXMuCisuVFAKKy5CIFwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXIKK1NvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZgorc3ltYm9scy4gIFRoZSBtb3N0IGNvbW1vbiBzdWNoIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLCB3aGljaCBjb21waWxlcnMKK29mdGVuIGFkZCBiZWZvcmUgZXZlcnkgc3ltYm9sLiAgVGhpcyBvcHRpb24gdGVsbHMgCisuQiBvYmpjb3B5Cit0byBjaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIG9mIGV2ZXJ5IHN5bWJvbCB3aGVuIGl0IGNvbnZlcnRzCitiZXR3ZWVuIG9iamVjdCBmaWxlIGZvcm1hdHMuICBJZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2UgdGhlIHNhbWUKK2xlYWRpbmcgY2hhcmFjdGVyLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZAorYSBjaGFyYWN0ZXIsIG9yIHJlbW92ZSBhIGNoYXJhY3Rlciwgb3IgY2hhbmdlIGEgY2hhcmFjdGVyLCBhcworYXBwcm9wcmlhdGUuCisuVFAKKy5CIFwtXC1yZW1vdmVcLWxlYWRpbmdcLWNoYXIKK0lmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBnbG9iYWwgc3ltYm9sIGlzIGEgc3BlY2lhbCBzeW1ib2wgbGVhZGluZworY2hhcmFjdGVyIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIuICBUaGUKK21vc3QgY29tbW9uIHN5bWJvbCBsZWFkaW5nIGNoYXJhY3RlciBpcyB1bmRlcnNjb3JlLiAgVGhpcyBvcHRpb24gd2lsbAorcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gYWxsIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUKK3VzZWZ1bCBpZiB5b3Ugd2FudCB0byBsaW5rIHRvZ2V0aGVyIG9iamVjdHMgb2YgZGlmZmVyZW50IGZpbGUgZm9ybWF0cword2l0aCBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIHN5bWJvbCBuYW1lcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20KK1xmQlwtXC1jaGFuZ2VcLWxlYWRpbmdcLWNoYXJcZlAgYmVjYXVzZSBpdCBhbHdheXMgY2hhbmdlcyB0aGUgc3ltYm9sIG5hbWUKK3doZW4gYXBwcm9wcmlhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0CisuVFAKKy5CIFwtXC13ZWFrZW4KK0NoYW5nZSBhbGwgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlIGZpbGUgdG8gYmUgd2Vhay4KKy5UUAorLkIgXC12XGZSLCBcZkJcLVwtdmVyYm9zZQorVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCithcmNoaXZlcywgIlxmQm9iamNvcHkgXC1WXGZSIiBsaXN0cyBhbGwgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZS4KKy5UUAorLkIgXC1WXGZSLCBcZkJcLVwtdmVyc2lvbgorU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKy5CIG9iamNvcHkKK2FuZCBleGl0LgorLlRQCisuQiBcLVwtaGVscAorU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KKy5CIG9iamNvcHkKK2FuZCBleGl0LgorLlNIICJTRUUgQUxTTyIKKy5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKK2VudHJ5IGluIAorLkIKK2luZm9cYworXCY7IAorLkkKK1RoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCitcJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgorCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpjb3B5LmMgYi9iaW51dGlscy9vYmpjb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkNzc3NwotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL29iamNvcHkuYwpAQCAtMCwwICsxLDIwMjkgQEAKKy8qIG9iamNvcHkuYyAtLSBjb3B5IG9iamVjdCBmaWxlIGZyb20gaW5wdXQgdG8gb3V0cHV0LCBvcHRpb25hbGx5IG1hc3NhZ2luZyBpdC4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworDAorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiYnVkYmcuaCIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisvKiBBIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBsaWNpdGx5IHN0cmlwIG91dCwgb3IgdG8ga2VlcC4gIEEgbGlua2VkCisgICBsaXN0IGlzIGdvb2QgZW5vdWdoIGZvciBhIHNtYWxsIG51bWJlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGJ1dAorICAgdGhpcyB3aWxsIHNsb3cgdGhpbmdzIGRvd24gYSBsb3QgaWYgbWFueSBzeW1ib2xzIGFyZSBiZWluZworICAgZGVsZXRlZC4gKi8KKworc3RydWN0IHN5bWxpc3QKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgc3RydWN0IHN5bWxpc3QgKm5leHQ7Cit9OworCitzdGF0aWMgdm9pZCBjb3B5X3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBzdHJpcF91c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOworc3RhdGljIGZsYWd3b3JkIHBhcnNlX2ZsYWdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKmZpbmRfc2VjdGlvbl9saXN0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworc3RhdGljIHZvaWQgc2V0dXBfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBjb3B5X3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIHZvaWQgZ2V0X3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyBpbnQgY29tcGFyZV9zZWN0aW9uX2xtYSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOworc3RhdGljIHZvaWQgYWRkX3NwZWNpZmljX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzeW1saXN0ICoqKSk7CitzdGF0aWMgYm9vbGVhbiBpc19zcGVjaWZpZWRfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN5bWxpc3QgKikpOworc3RhdGljIGJvb2xlYW4gaXNfc3RyaXBfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIHVuc2lnbmVkIGludCBmaWx0ZXJfc3ltYm9scworICBQQVJBTVMgKChiZmQgKiwgYmZkICosIGFzeW1ib2wgKiosIGFzeW1ib2wgKiosIGxvbmcpKTsKK3N0YXRpYyB2b2lkIG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGZpbHRlcl9ieXRlcyBQQVJBTVMgKChjaGFyICosIGJmZF9zaXplX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gd3JpdGVfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIFBUUiwgbG9uZyAqLCBhc3ltYm9sICoqKikpOworc3RhdGljIHZvaWQgY29weV9vYmplY3QgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7CitzdGF0aWMgdm9pZCBjb3B5X2FyY2hpdmUgUEFSQU1TICgoYmZkICosIGJmZCAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIGNvcHlfZmlsZQorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgc3RyaXBfbWFpbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgY29weV9tYWluIFBBUkFNUyAoKGludCwgY2hhciAqKikpOworCisjZGVmaW5lIFJFVFVSTl9OT05GQVRBTChzKSB7YmZkX25vbmZhdGFsIChzKTsgc3RhdHVzID0gMTsgcmV0dXJuO30KKworc3RhdGljIGFzeW1ib2wgKippc3ltcHAgPSBOVUxMOwkvKiBJbnB1dCBzeW1ib2xzICovCitzdGF0aWMgYXN5bWJvbCAqKm9zeW1wcCA9IE5VTEw7CS8qIE91dHB1dCBzeW1ib2xzIHRoYXQgc3Vydml2ZSBzdHJpcHBpbmcgKi8KKworLyogSWYgYGNvcHlfYnl0ZScgPj0gMCwgY29weSBvbmx5IHRoYXQgYnl0ZSBvZiBldmVyeSBgaW50ZXJsZWF2ZScgYnl0ZXMuICAqLworc3RhdGljIGludCBjb3B5X2J5dGUgPSAtMTsKK3N0YXRpYyBpbnQgaW50ZXJsZWF2ZSA9IDQ7CisKK3N0YXRpYyBib29sZWFuIHZlcmJvc2U7CQkvKiBQcmludCBmaWxlIGFuZCB0YXJnZXQgbmFtZXMuICovCitzdGF0aWMgYm9vbGVhbiBwcmVzZXJ2ZV9kYXRlczsJLyogUHJlc2VydmUgaW5wdXQgZmlsZSB0aW1lc3RhbXAuICAqLworc3RhdGljIGludCBzdGF0dXMgPSAwOwkJLyogRXhpdCBzdGF0dXMuICAqLworCitlbnVtIHN0cmlwX2FjdGlvbgorICB7CisgICAgU1RSSVBfVU5ERUYsCisgICAgU1RSSVBfTk9ORSwJCQkvKiBkb24ndCBzdHJpcCAqLworICAgIFNUUklQX0RFQlVHLAkJLyogc3RyaXAgYWxsIGRlYnVnZ2VyIHN5bWJvbHMgKi8KKyAgICBTVFJJUF9VTk5FRURFRCwJCS8qIHN0cmlwIHVubmVjZXNzYXJ5IHN5bWJvbHMgKi8KKyAgICBTVFJJUF9BTEwJCQkvKiBzdHJpcCBhbGwgc3ltYm9scyAqLworICB9OworCisvKiBXaGljaCBzeW1ib2xzIHRvIHJlbW92ZS4gKi8KK3N0YXRpYyBlbnVtIHN0cmlwX2FjdGlvbiBzdHJpcF9zeW1ib2xzOworCitlbnVtIGxvY2Fsc19hY3Rpb24KKyAgeworICAgIExPQ0FMU19VTkRFRiwKKyAgICBMT0NBTFNfU1RBUlRfTCwJCS8qIGRpc2NhcmQgbG9jYWxzIHN0YXJ0aW5nIHdpdGggTCAqLworICAgIExPQ0FMU19BTEwJCQkvKiBkaXNjYXJkIGFsbCBsb2NhbHMgKi8KKyAgfTsKKworLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byByZW1vdmUuICBPdmVycmlkZXMgU1RSSVBfQUxMLiAgKi8KK3N0YXRpYyBlbnVtIGxvY2Fsc19hY3Rpb24gZGlzY2FyZF9sb2NhbHM7CisKKy8qIFdoYXQga2luZCBvZiBjaGFuZ2UgdG8gcGVyZm9ybS4gICovCitlbnVtIGNoYW5nZV9hY3Rpb24KK3sKKyAgQ0hBTkdFX0lHTk9SRSwKKyAgQ0hBTkdFX01PRElGWSwKKyAgQ0hBTkdFX1NFVAorfTsKKworLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBsaXN0cyBvZiBzZWN0aW9ucyBhbmQgYWN0aW9ucyB0byB0YWtlLiAgKi8KK3N0cnVjdCBzZWN0aW9uX2xpc3QKK3sKKyAgc3RydWN0IHNlY3Rpb25fbGlzdCAqIG5leHQ7ICAgICAgLyogTmV4dCBzZWN0aW9uIHRvIGNoYW5nZS4gICovCisgIGNvbnN0IGNoYXIgKiAgICAgICAgICBuYW1lOyAgICAgIC8qIFNlY3Rpb24gbmFtZS4gICovCisgIGJvb2xlYW4gICAgICAgICAgICAgICB1c2VkOyAgICAgIC8qIFdoZXRoZXIgdGhpcyBlbnRyeSB3YXMgdXNlZC4gICovCisgIGJvb2xlYW4gICAgICAgICAgICAgICByZW1vdmU7ICAgIC8qIFdoZXRoZXIgdG8gcmVtb3ZlIHRoaXMgc2VjdGlvbi4gICovCisgIGVudW0gY2hhbmdlX2FjdGlvbiAgICBjaGFuZ2Vfdm1hOy8qIFdoZXRoZXIgdG8gY2hhbmdlIG9yIHNldCBWTUEuICAqLworICBiZmRfdm1hIAkJdm1hX3ZhbDsgICAvKiBBbW91bnQgdG8gY2hhbmdlIGJ5IG9yIHNldCB0by4gICovCisgIGVudW0gY2hhbmdlX2FjdGlvbiAgICBjaGFuZ2VfbG1hOy8qIFdoZXRoZXIgdG8gY2hhbmdlIG9yIHNldCBMTUEuICAqLworICBiZmRfdm1hIAkJbG1hX3ZhbDsgICAvKiBBbW91bnQgdG8gY2hhbmdlIGJ5IG9yIHNldCB0by4gICovCisgIGJvb2xlYW4gCQlzZXRfZmxhZ3M7IC8qIFdoZXRoZXIgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzLiAgKi8KKyAgZmxhZ3dvcmQgCQlmbGFnczsgICAgIC8qIFdoYXQgdG8gc2V0IHRoZSBzZWN0aW9uIGZsYWdzIHRvLiAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpjaGFuZ2Vfc2VjdGlvbnM7CitzdGF0aWMgYm9vbGVhbiBzZWN0aW9uc19yZW1vdmVkOworCisvKiBDaGFuZ2VzIHRvIHRoZSBzdGFydCBhZGRyZXNzLiAgKi8KK3N0YXRpYyBiZmRfdm1hIGNoYW5nZV9zdGFydCA9IDA7CitzdGF0aWMgYm9vbGVhbiBzZXRfc3RhcnRfc2V0ID0gZmFsc2U7CitzdGF0aWMgYmZkX3ZtYSBzZXRfc3RhcnQ7CisKKy8qIENoYW5nZXMgdG8gc2VjdGlvbiBhZGRyZXNzZXMuICAqLworc3RhdGljIGJmZF92bWEgY2hhbmdlX3NlY3Rpb25fYWRkcmVzcyA9IDA7CisKKy8qIEZpbGxpbmcgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zLiAgKi8KK3N0YXRpYyBib29sZWFuIGdhcF9maWxsX3NldCA9IGZhbHNlOworc3RhdGljIGJmZF9ieXRlIGdhcF9maWxsID0gMDsKKworLyogUGFkIHRvIGEgZ2l2ZW4gYWRkcmVzcy4gICovCitzdGF0aWMgYm9vbGVhbiBwYWRfdG9fc2V0ID0gZmFsc2U7CitzdGF0aWMgYmZkX3ZtYSBwYWRfdG87CisKKy8qIExpc3Qgb2Ygc2VjdGlvbnMgdG8gYWRkLiAgKi8KKworc3RydWN0IHNlY3Rpb25fYWRkCit7CisgIC8qIE5leHQgc2VjdGlvbiB0byBhZGQuICAqLworICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKm5leHQ7CisgIC8qIE5hbWUgb2Ygc2VjdGlvbiB0byBhZGQuICAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBOYW1lIG9mIGZpbGUgaG9sZGluZyBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIC8qIFNpemUgb2YgZmlsZS4gICovCisgIHNpemVfdCBzaXplOworICAvKiBDb250ZW50cyBvZiBmaWxlLiAgKi8KKyAgYmZkX2J5dGUgKmNvbnRlbnRzOworICAvKiBCRkQgc2VjdGlvbiwgYWZ0ZXIgaXQgaGFzIGJlZW4gYWRkZWQuICAqLworICBhc2VjdGlvbiAqc2VjdGlvbjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKmFkZF9zZWN0aW9uczsKKworLyogV2hldGhlciB0byBjb252ZXJ0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuIGNvbnZlcnRfZGVidWdnaW5nID0gZmFsc2U7CisKKy8qIFdoZXRoZXIgdG8gY2hhbmdlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpbiBzeW1ib2wgbmFtZXMuICAqLworCitzdGF0aWMgYm9vbGVhbiBjaGFuZ2VfbGVhZGluZ19jaGFyID0gZmFsc2U7CisKKy8qIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBmcm9tIGdsb2JhbCBzeW1ib2wgbmFtZXMuICAqLworCitzdGF0aWMgYm9vbGVhbiByZW1vdmVfbGVhZGluZ19jaGFyID0gZmFsc2U7CisKKy8qIExpc3Qgb2Ygc3ltYm9scyB0byBzdHJpcCwga2VlcCwgbG9jYWxpemUsIGFuZCB3ZWFrZW4uICAqLworCitzdGF0aWMgc3RydWN0IHN5bWxpc3QgKnN0cmlwX3NwZWNpZmljX2xpc3QgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzeW1saXN0ICprZWVwX3NwZWNpZmljX2xpc3QgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzeW1saXN0ICpsb2NhbGl6ZV9zcGVjaWZpY19saXN0ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqd2Vha2VuX3NwZWNpZmljX2xpc3QgPSBOVUxMOworCisvKiBJZiB0aGlzIGlzIHRydWUsIHdlIHdlYWtlbiBnbG9iYWwgc3ltYm9scyAoc2V0IEJTRl9XRUFLKS4gICovCisKK3N0YXRpYyBib29sZWFuIHdlYWtlbiA9IGZhbHNlOworCisvKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCisKKyNkZWZpbmUgT1BUSU9OX0FERF9TRUNUSU9OIDE1MAorI2RlZmluZSBPUFRJT05fQ0hBTkdFX0FERFJFU1NFUyAoT1BUSU9OX0FERF9TRUNUSU9OICsgMSkKKyNkZWZpbmUgT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVIgKE9QVElPTl9DSEFOR0VfQUREUkVTU0VTICsgMSkKKyNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TVEFSVCAoT1BUSU9OX0NIQU5HRV9MRUFESU5HX0NIQVIgKyAxKQorI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUyAoT1BUSU9OX0NIQU5HRV9TVEFSVCArIDEpCisjZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUEgKE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTICsgMSkKKyNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQSAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQSArIDEpCisjZGVmaW5lIE9QVElPTl9DSEFOR0VfV0FSTklOR1MgKE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUEgKyAxKQorI2RlZmluZSBPUFRJT05fREVCVUdHSU5HIChPUFRJT05fQ0hBTkdFX1dBUk5JTkdTICsgMSkKKyNkZWZpbmUgT1BUSU9OX0dBUF9GSUxMIChPUFRJT05fREVCVUdHSU5HICsgMSkKKyNkZWZpbmUgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUyAoT1BUSU9OX0dBUF9GSUxMICsgMSkKKyNkZWZpbmUgT1BUSU9OX1BBRF9UTyAoT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUyArIDEpCisjZGVmaW5lIE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSIChPUFRJT05fUEFEX1RPICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTIChPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUiArIDEpCisjZGVmaW5lIE9QVElPTl9TRVRfU1RBUlQgKE9QVElPTl9TRVRfU0VDVElPTl9GTEFHUyArIDEpCisjZGVmaW5lIE9QVElPTl9TVFJJUF9VTk5FRURFRCAoT1BUSU9OX1NFVF9TVEFSVCArIDEpCisjZGVmaW5lIE9QVElPTl9XRUFLRU4gKE9QVElPTl9TVFJJUF9VTk5FRURFRCArIDEpCisKKy8qIE9wdGlvbnMgdG8gaGFuZGxlIGlmIHJ1bm5pbmcgYXMgInN0cmlwIi4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIHN0cmlwX29wdGlvbnNbXSA9Cit7CisgIHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ3gnfSwKKyAgeyJkaXNjYXJkLWxvY2FscyIsIG5vX2FyZ3VtZW50LCAwLCAnWCd9LAorICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LCAvKiBPYnNvbGV0ZSAqLworICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKKyAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwgLyogT2Jzb2xldGUgKi8KKyAgeyJpbnB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKKyAgeyJrZWVwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSyd9LAorICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwJLyogT2Jzb2xldGUgKi8KKyAgeyJvdXRwdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCisgIHsicHJlc2VydmUtZGF0ZXMiLCBub19hcmd1bWVudCwgMCwgJ3AnfSwKKyAgeyJyZW1vdmUtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUid9LAorICB7InN0cmlwLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAncyd9LAorICB7InN0cmlwLWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdTJ30sCisgIHsic3RyaXAtdW5uZWVkZWQiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1NUUklQX1VOTkVFREVEfSwKKyAgeyJzdHJpcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKKyAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKKyAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIDAsICd2J30sCisgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAorICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Cit9OworCisvKiBPcHRpb25zIHRvIGhhbmRsZSBpZiBydW5uaW5nIGFzICJvYmpjb3B5Ii4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGNvcHlfb3B0aW9uc1tdID0KK3sKKyAgeyJhZGQtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQUREX1NFQ1RJT059LAorICB7ImFkanVzdC1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NUQVJUfSwKKyAgeyJhZGp1c3Qtdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTfSwKKyAgeyJhZGp1c3Qtc2VjdGlvbi12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1N9LAorICB7ImFkanVzdC13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTfSwKKyAgeyJieXRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdiJ30sCisgIHsiY2hhbmdlLWFkZHJlc3NlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX0FERFJFU1NFU30sCisgIHsiY2hhbmdlLWxlYWRpbmctY2hhciIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUn0sCisgIHsiY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTU30sCisgIHsiY2hhbmdlLXNlY3Rpb24tbG1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUF9LAorICB7ImNoYW5nZS1zZWN0aW9uLXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BfSwKKyAgeyJjaGFuZ2Utc3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TVEFSVH0sCisgIHsiY2hhbmdlLXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfV0FSTklOR1N9LAorICB7ImRlYnVnZ2luZyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fREVCVUdHSU5HfSwKKyAgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAorICB7ImRpc2NhcmQtbG9jYWxzIiwgbm9fYXJndW1lbnQsIDAsICdYJ30sCisgIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sIC8qIE9ic29sZXRlICovCisgIHsiZ2FwLWZpbGwiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0dBUF9GSUxMfSwKKyAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCisgIHsiaW5wdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sIC8qIE9ic29sZXRlICovCisgIHsiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgIHsiaW50ZXJsZWF2ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaSd9LAorICB7ImtlZXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdLJ30sCisgIHsibm8tYWRqdXN0LXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1N9LAorICB7Im5vLWNoYW5nZS13YXJuaW5ncyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTfSwKKyAgeyJvdXRwdXQtZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCS8qIE9ic29sZXRlICovCisgIHsib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAorICB7InBhZC10byIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fUEFEX1RPfSwKKyAgeyJwcmVzZXJ2ZS1kYXRlcyIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAorICB7ImxvY2FsaXplLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTCd9LAorICB7InJlbW92ZS1sZWFkaW5nLWNoYXIiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVJ9LAorICB7InJlbW92ZS1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCisgIHsic2V0LXNlY3Rpb24tZmxhZ3MiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTfSwKKyAgeyJzZXQtc3RhcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1NFVF9TVEFSVH0sCisgIHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIDAsICdTJ30sCisgIHsic3RyaXAtZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2cnfSwKKyAgeyJzdHJpcC11bm5lZWRlZCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fU1RSSVBfVU5ORUVERUR9LAorICB7InN0cmlwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAorICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAorICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKKyAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCisgIHsid2Vha2VuIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9XRUFLRU59LAorICB7IndlYWtlbi1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1cnfSwKKyAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQorfTsKKworLyogSU1QT1JUUyAqLworZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKKworLyogVGhpcyBmbGFnIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBzdHJpcCBhbmQgb2JqY29weToKKyAgIDEgbWVhbnMgdGhpcyBpcyAnc3RyaXAnOyAwIG1lYW5zIHRoaXMgaXMgJ29iamNvcHknLgorICAgLTEgbWVhbnMgaWYgd2Ugc2hvdWxkIHVzZSBhcmd2WzBdIHRvIGRlY2lkZS4gKi8KK2V4dGVybiBpbnQgaXNfc3RyaXA7CisKKworc3RhdGljIHZvaWQKK2NvcHlfdXNhZ2UgKHN0cmVhbSwgZXhpdF9zdGF0dXMpCisgICAgIEZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGV4aXRfc3RhdHVzOworeworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKK1VzYWdlOiAlcyBbLXZWU3BneFhdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1GIGJmZG5hbWVdIFstYiBieXRlXVxuXAorICAgICAgIFstUiBzZWN0aW9uXSBbLWkgaW50ZXJsZWF2ZV0gWy0taW50ZXJsZWF2ZT1pbnRlcmxlYXZlXSBbLS1ieXRlPWJ5dGVdXG5cCisgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCisgICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuXAorICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1kZWJ1Z2dpbmddIFstLXJlbW92ZS1zZWN0aW9uPXNlY3Rpb25dXG4iKSwKKwkgICBwcm9ncmFtX25hbWUpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgICAgICBbLS1nYXAtZmlsbD12YWxdIFstLXBhZC10bz1hZGRyZXNzXSBbLS1wcmVzZXJ2ZS1kYXRlc11cblwKKyAgICAgICBbLS1zZXQtc3RhcnQ9dmFsXSBcblwKKyAgICAgICBbLS1jaGFuZ2Utc3RhcnQ9aW5jcl0gWy0tY2hhbmdlLWFkZHJlc3Nlcz1pbmNyXSBcblwKKyAgICAgICAoLS1hZGp1c3Qtc3RhcnQgICBhbmQgIC0tYWRqdXN0LXZtYSBhcmUgYWxpYXNlcyBmb3IgdGhlc2UgdHdvKSBcblwKKyAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzPXNlY3Rpb257PSwrLC19dmFsXVxuXAorICAgICAgICgtLWFkanVzdC1zZWN0aW9uLXZtYSBpcyBhbiBhbGlhcyBmb3IgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzKVxuXAorICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWxtYT1zZWN0aW9uez0sKywtfXZhbF1cblwKKyAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi12bWE9c2VjdGlvbns9LCssLX12YWxdXG5cCisgICAgICAgWy0tYWRqdXN0LXdhcm5pbmdzXSBbLS1uby1hZGp1c3Qtd2FybmluZ3NdXG5cCisgICAgICAgWy0tY2hhbmdlLXdhcm5pbmdzXSBbLS1uby1jaGFuZ2Utd2FybmluZ3NdXG5cCisgICAgICAgWy0tc2V0LXNlY3Rpb24tZmxhZ3M9c2VjdGlvbj1mbGFnc10gWy0tYWRkLXNlY3Rpb249c2VjdGlvbm5hbWU9ZmlsZW5hbWVdXG5cCisgICAgICAgWy0ta2VlcC1zeW1ib2wgc3ltYm9sXSBbLUsgc3ltYm9sXSBbLS1zdHJpcC1zeW1ib2wgc3ltYm9sXSBbLU4gc3ltYm9sXVxuXAorICAgICAgIFstLWxvY2FsaXplLXN5bWJvbCBzeW1ib2xdIFstTCBzeW1ib2xdIFstLXdlYWtlbi1zeW1ib2wgc3ltYm9sXVxuXAorICAgICAgIFstVyBzeW1ib2xdIFstLWNoYW5nZS1sZWFkaW5nLWNoYXJdIFstLXJlbW92ZS1sZWFkaW5nLWNoYXJdIFstLXdlYWtlbl1cblwKKyAgICAgICBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIpKTsKKyAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOworICBpZiAoZXhpdF9zdGF0dXMgPT0gMCkKKyAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOworICBleGl0IChleGl0X3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJpcF91c2FnZSAoc3RyZWFtLCBleGl0X3N0YXR1cykKKyAgICAgRklMRSAqc3RyZWFtOworICAgICBpbnQgZXhpdF9zdGF0dXM7Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorVXNhZ2U6ICVzIFstdlZzU3BneFhdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1GIGJmZG5hbWVdIFstUiBzZWN0aW9uXVxuXAorICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuXAorICAgICAgIFstLXN0cmlwLWFsbF0gWy0tc3RyaXAtZGVidWddIFstLXN0cmlwLXVubmVlZGVkXSBbLS1kaXNjYXJkLWFsbF1cblwKKyAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0ta2VlcC1zeW1ib2wgc3ltYm9sXSBbLUsgc3ltYm9sXVxuXAorICAgICAgIFstLXN0cmlwLXN5bWJvbCBzeW1ib2xdIFstTiBzeW1ib2xdIFstLXJlbW92ZS1zZWN0aW9uPXNlY3Rpb25dXG5cCisgICAgICAgWy1vIGZpbGVdIFstLXByZXNlcnZlLWRhdGVzXSBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBmaWxlLi4uXG4iKSwKKwkgICBwcm9ncmFtX25hbWUpOworICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7CisgIGlmIChleGl0X3N0YXR1cyA9PSAwKQorICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7CisgIGV4aXQgKGV4aXRfc3RhdHVzKTsKK30KKworLyogUGFyc2Ugc2VjdGlvbiBmbGFncyBpbnRvIGEgZmxhZ3dvcmQsIHdpdGggYSBmYXRhbCBlcnJvciBpZiB0aGUKKyAgIHN0cmluZyBjYW4ndCBiZSBwYXJzZWQuICAqLworCitzdGF0aWMgZmxhZ3dvcmQKK3BhcnNlX2ZsYWdzIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBmbGFnd29yZCByZXQ7CisgIGNvbnN0IGNoYXIgKnNuZXh0OworICBpbnQgbGVuOworCisgIHJldCA9IFNFQ19OT19GTEFHUzsKKworICBkbworICAgIHsKKyAgICAgIHNuZXh0ID0gc3RyY2hyIChzLCAnLCcpOworICAgICAgaWYgKHNuZXh0ID09IE5VTEwpCisJbGVuID0gc3RybGVuIChzKTsKKyAgICAgIGVsc2UKKwl7CisJICBsZW4gPSBzbmV4dCAtIHM7CisJICArK3NuZXh0OworCX0KKworICAgICAgaWYgKDApIDsKKyNkZWZpbmUgUEFSU0VfRkxBRyhmbmFtZSxmdmFsKSBcCisgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChmbmFtZSwgcywgbGVuKSA9PSAwKSByZXQgfD0gZnZhbAorICAgICAgUEFSU0VfRkxBRyAoImFsbG9jIiwgU0VDX0FMTE9DKTsKKyAgICAgIFBBUlNFX0ZMQUcgKCJsb2FkIiwgU0VDX0xPQUQpOworICAgICAgUEFSU0VfRkxBRyAoInJlYWRvbmx5IiwgU0VDX1JFQURPTkxZKTsKKyAgICAgIFBBUlNFX0ZMQUcgKCJjb2RlIiwgU0VDX0NPREUpOworICAgICAgUEFSU0VfRkxBRyAoImRhdGEiLCBTRUNfREFUQSk7CisgICAgICBQQVJTRV9GTEFHICgicm9tIiwgU0VDX1JPTSk7CisgICAgICBQQVJTRV9GTEFHICgiY29udGVudHMiLCBTRUNfSEFTX0NPTlRFTlRTKTsKKyN1bmRlZiBQQVJTRV9GTEFHCisgICAgICBlbHNlCisJeworCSAgY2hhciAqY29weTsKKworCSAgY29weSA9IHhtYWxsb2MgKGxlbiArIDEpOworCSAgc3RybmNweSAoY29weSwgcywgbGVuKTsKKwkgIGNvcHlbbGVuXSA9ICdcMCc7CisJICBub25fZmF0YWwgKF8oInVucmVjb2duaXplZCBzZWN0aW9uIGZsYWcgYCVzJyIpLCBjb3B5KTsKKwkgIGZhdGFsIChfKCJzdXBwb3J0ZWQgZmxhZ3M6IGFsbG9jLCBsb2FkLCByZWFkb25seSwgY29kZSwgZGF0YSwgcm9tLCBjb250ZW50cyIpKTsKKwl9CisKKyAgICAgIHMgPSBzbmV4dDsKKyAgICB9CisgIHdoaWxlIChzICE9IE5VTEwpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIEZpbmQgYW5kIG9wdGlvbmFsbHkgYWRkIGFuIGVudHJ5IGluIHRoZSBjaGFuZ2Vfc2VjdGlvbnMgbGlzdC4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICoKK2ZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCBhZGQpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJvb2xlYW4gYWRkOworeworICByZWdpc3RlciBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOworCisgIGZvciAocCA9IGNoYW5nZV9zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKyAgICBpZiAoc3RyY21wIChwLT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgcmV0dXJuIHA7CisKKyAgaWYgKCEgYWRkKQorICAgIHJldHVybiBOVUxMOworCisgIHAgPSAoc3RydWN0IHNlY3Rpb25fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX2xpc3QpKTsKKyAgcC0+bmFtZSA9IG5hbWU7CisgIHAtPnVzZWQgPSBmYWxzZTsKKyAgcC0+cmVtb3ZlID0gZmFsc2U7CisgIHAtPmNoYW5nZV92bWEgPSBDSEFOR0VfSUdOT1JFOworICBwLT5jaGFuZ2VfbG1hID0gQ0hBTkdFX0lHTk9SRTsKKyAgcC0+dm1hX3ZhbCA9IDA7CisgIHAtPmxtYV92YWwgPSAwOworICBwLT5zZXRfZmxhZ3MgPSBmYWxzZTsKKyAgcC0+ZmxhZ3MgPSAwOworCisgIHAtPm5leHQgPSBjaGFuZ2Vfc2VjdGlvbnM7CisgIGNoYW5nZV9zZWN0aW9ucyA9IHA7CisKKyAgcmV0dXJuIHA7Cit9CisKKy8qIEFkZCBhIHN5bWJvbCB0byBzdHJpcF9zcGVjaWZpY19saXN0LiAgKi8KKworc3RhdGljIHZvaWQgCithZGRfc3BlY2lmaWNfc3ltYm9sIChuYW1lLCBsaXN0KQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgc3ltbGlzdCAqKmxpc3Q7Cit7CisgIHN0cnVjdCBzeW1saXN0ICp0bXBfbGlzdDsKKworICB0bXBfbGlzdCA9IChzdHJ1Y3Qgc3ltbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW1saXN0KSk7CisgIHRtcF9saXN0LT5uYW1lID0gbmFtZTsKKyAgdG1wX2xpc3QtPm5leHQgPSAqbGlzdDsKKyAgKmxpc3QgPSB0bXBfbGlzdDsKK30KKworLyogU2VlIHdoZXRoZXIgYSBzeW1ib2wgc2hvdWxkIGJlIHN0cmlwcGVkIG9yIGtlcHQgYmFzZWQgb24KKyAgIHN0cmlwX3NwZWNpZmljX2xpc3QgYW5kIGtlZXBfc3ltYm9scy4gICovCisKK3N0YXRpYyBib29sZWFuCitpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBsaXN0KQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgc3ltbGlzdCAqbGlzdDsKK3sKKyAgc3RydWN0IHN5bWxpc3QgKnRtcF9saXN0OworCisgIGZvciAodG1wX2xpc3QgPSBsaXN0OyB0bXBfbGlzdDsgdG1wX2xpc3QgPSB0bXBfbGlzdC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChuYW1lLCB0bXBfbGlzdC0+bmFtZSkgPT0gMCkKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyogU2VlIGlmIGEgc2VjdGlvbiBpcyBiZWluZyByZW1vdmVkLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2lzX3N0cmlwX3NlY3Rpb24gKGFiZmQsIHNlYykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworeworICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOworCisgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RFQlVHR0lORykgIT0gMAorICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKKwkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKKwkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCisJICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCisJICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKCEgc2VjdGlvbnNfcmVtb3ZlZCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIGZhbHNlKTsKKyAgcmV0dXJuIHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUgPyB0cnVlIDogZmFsc2U7Cit9CisKKy8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBjb3B5OyBwdXQgdGhlIHJlc3VsdCBpbiBPU1lNUy4KKyAgIFdlIGRvbid0IGNvcHkgaW4gcGxhY2UsIGJlY2F1c2UgdGhhdCBjb25mdXNlcyB0aGUgcmVsb2NzLgorICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBwcmludC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2ZpbHRlcl9zeW1ib2xzIChhYmZkLCBvYmZkLCBvc3ltcywgaXN5bXMsIHN5bWNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGJmZCAqb2JmZDsKKyAgICAgYXN5bWJvbCAqKm9zeW1zLCAqKmlzeW1zOworICAgICBsb25nIHN5bWNvdW50OworeworICByZWdpc3RlciBhc3ltYm9sICoqZnJvbSA9IGlzeW1zLCAqKnRvID0gb3N5bXM7CisgIGxvbmcgc3JjX2NvdW50ID0gMCwgZHN0X2NvdW50ID0gMDsKKworICBmb3IgKDsgc3JjX2NvdW50IDwgc3ltY291bnQ7IHNyY19jb3VudCsrKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnN5bSA9IGZyb21bc3JjX2NvdW50XTsKKyAgICAgIGZsYWd3b3JkIGZsYWdzID0gc3ltLT5mbGFnczsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOworICAgICAgaW50IGtlZXA7CisKKyAgICAgIGlmIChjaGFuZ2VfbGVhZGluZ19jaGFyCisJICAmJiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKQorCSAgICAgICE9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCkpCisJICAmJiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnCisJICAgICAgfHwgKG5hbWVbMF0gPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkpKQorCXsKKwkgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpID09ICdcMCcpCisJICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbmFtZSArIDE7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyICpuOworCisJICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyKTsKKwkgICAgICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKTsKKwkgICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnKQorCQlzdHJjcHkgKG4gKyAxLCBuYW1lKTsKKwkgICAgICBlbHNlCisJCXN0cmNweSAobiArIDEsIG5hbWUgKyAxKTsKKwkgICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSA9IG47CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChyZW1vdmVfbGVhZGluZ19jaGFyCisJICAmJiAoKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMAorCSAgICAgIHx8IChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCisJICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCisJICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCSAgJiYgbmFtZVswXSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKQorCW5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbmFtZSArIDE7CisKKyAgICAgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTCkKKwlrZWVwID0gMDsKKyAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9LRUVQKSAhPSAwCQkvKiBVc2VkIGluIHJlbG9jYXRpb24uICAqLworCSAgICAgICB8fCAoKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCisJCSAgICYmICgoKmJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+c3ltYm9sX3B0cl9wdHIpLT5mbGFncworCQkgICAgICAgJiBCU0ZfS0VFUCkgIT0gMCkpCisJa2VlcCA9IDE7CisgICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCS8qIEdsb2JhbCBzeW1ib2wuICAqLworCSAgICAgICB8fCAoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAorCSAgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKKwkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCWtlZXAgPSBzdHJpcF9zeW1ib2xzICE9IFNUUklQX1VOTkVFREVEOworICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0RFQlVHR0lORykgIT0gMCkJLyogRGVidWdnaW5nIHN5bWJvbC4gICovCisJa2VlcCA9IChzdHJpcF9zeW1ib2xzICE9IFNUUklQX0RFQlVHCisJCSYmIHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQKKwkJJiYgISBjb252ZXJ0X2RlYnVnZ2luZyk7CisgICAgICBlbHNlCQkJLyogTG9jYWwgc3ltYm9sLiAgKi8KKwlrZWVwID0gKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQKKwkJJiYgKGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19BTEwKKwkJICAgICYmIChkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfU1RBUlRfTAorCQkJfHwgISBiZmRfaXNfbG9jYWxfbGFiZWwgKGFiZmQsIHN5bSkpKSk7CisKKyAgICAgIGlmIChrZWVwICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIHN0cmlwX3NwZWNpZmljX2xpc3QpKQorCWtlZXAgPSAwOworICAgICAgaWYgKCFrZWVwICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIGtlZXBfc3BlY2lmaWNfbGlzdCkpCisJa2VlcCA9IDE7CisgICAgICBpZiAoa2VlcCAmJiBpc19zdHJpcF9zZWN0aW9uIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQorCWtlZXAgPSAwOworCisgICAgICBpZiAoa2VlcCAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCisJICAmJiAod2Vha2VuIHx8IGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIHdlYWtlbl9zcGVjaWZpY19saXN0KSkpCisJeworCSAgc3ltLT5mbGFncyAmPX4gQlNGX0dMT0JBTDsKKwkgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7CisJfQorICAgICAgaWYgKGtlZXAgJiYgKGZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpCisJICAmJiBpc19zcGVjaWZpZWRfc3ltYm9sIChuYW1lLCBsb2NhbGl6ZV9zcGVjaWZpY19saXN0KSkKKwl7CisJICBzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTCB8IEJTRl9XRUFLKTsKKwkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0xPQ0FMOworCX0KKworICAgICAgaWYgKGtlZXApCisJdG9bZHN0X2NvdW50KytdID0gc3ltOworICAgIH0KKworICB0b1tkc3RfY291bnRdID0gTlVMTDsKKworICByZXR1cm4gZHN0X2NvdW50OworfQorCisvKiBLZWVwIG9ubHkgZXZlcnkgYGNvcHlfYnl0ZSd0aCBieXRlIGluIE1FTUhVTkssIHdoaWNoIGlzICpTSVpFIGJ5dGVzIGxvbmcuCisgICBBZGp1c3QgKlNJWkUuICAqLworCitzdGF0aWMgdm9pZAorZmlsdGVyX2J5dGVzIChtZW1odW5rLCBzaXplKQorICAgICBjaGFyICptZW1odW5rOworICAgICBiZmRfc2l6ZV90eXBlICpzaXplOworeworICBjaGFyICpmcm9tID0gbWVtaHVuayArIGNvcHlfYnl0ZSwgKnRvID0gbWVtaHVuaywgKmVuZCA9IG1lbWh1bmsgKyAqc2l6ZTsKKworICBmb3IgKDsgZnJvbSA8IGVuZDsgZnJvbSArPSBpbnRlcmxlYXZlKQorICAgICp0bysrID0gKmZyb207CisgIGlmICgqc2l6ZSAlIGludGVybGVhdmUgPiBjb3B5X2J5dGUpCisgICAgKnNpemUgPSAoKnNpemUgLyBpbnRlcmxlYXZlKSArIDE7CisgIGVsc2UKKyAgICAqc2l6ZSAvPSBpbnRlcmxlYXZlOworfQorCisvKiBDb3B5IG9iamVjdCBmaWxlIElCRkQgb250byBPQkZELiAgKi8KKworc3RhdGljIHZvaWQKK2NvcHlfb2JqZWN0IChpYmZkLCBvYmZkKQorICAgICBiZmQgKmliZmQ7CisgICAgIGJmZCAqb2JmZDsKK3sKKyAgYmZkX3ZtYSBzdGFydDsKKyAgbG9uZyBzeW1jb3VudDsKKyAgYXNlY3Rpb24gKipvc2VjdGlvbnMgPSBOVUxMOworICBiZmRfc2l6ZV90eXBlICpnYXBzID0gTlVMTDsKKyAgYmZkX3NpemVfdHlwZSBtYXhfZ2FwID0gMDsKKyAgbG9uZyBzeW1zaXplOworICBQVFIgZGhhbmRsZTsKKworCisgIGlmICghYmZkX3NldF9mb3JtYXQgKG9iZmQsIGJmZF9nZXRfZm9ybWF0IChpYmZkKSkpCisgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisKKyAgaWYgKHZlcmJvc2UpCisgICAgcHJpbnRmIChfKCJjb3B5IGZyb20gJXMoJXMpIHRvICVzKCVzKVxuIiksCisJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBiZmRfZ2V0X3RhcmdldCAoaWJmZCksCisJICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob2JmZCkpOworCisgIGlmIChzZXRfc3RhcnRfc2V0KQorICAgIHN0YXJ0ID0gc2V0X3N0YXJ0OworICBlbHNlCisgICAgc3RhcnQgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGliZmQpOworICBzdGFydCArPSBjaGFuZ2Vfc3RhcnQ7CisKKyAgaWYgKCFiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG9iZmQsIHN0YXJ0KQorICAgICAgfHwgIWJmZF9zZXRfZmlsZV9mbGFncyAob2JmZCwKKwkJCSAgICAgIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGliZmQpCisJCQkgICAgICAgJiBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzIChvYmZkKSkpKQorICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisgIC8qIENvcHkgYXJjaGl0ZWN0dXJlIG9mIGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUgKi8KKyAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwKKwkJCSAgYmZkX2dldF9tYWNoIChpYmZkKSkpCisgICAgbm9uX2ZhdGFsIChfKCJXYXJuaW5nOiBPdXRwdXQgZmlsZSBjYW5ub3QgcmVwcmVzZW50IGFyY2hpdGVjdHVyZSAlcyIpLAorCSAgICAgICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChpYmZkKSwKKwkJCQkJYmZkX2dldF9tYWNoIChpYmZkKSkpOworICAKKyAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKKyAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKKworICBpZiAoaXN5bXBwKQorICAgIGZyZWUgKGlzeW1wcCk7CisgIAorICBpZiAob3N5bXBwICE9IGlzeW1wcCkKKyAgICBmcmVlIChvc3ltcHApOworCisgIC8qIEJGRCBtYW5kYXRlcyB0aGF0IGFsbCBvdXRwdXQgc2VjdGlvbnMgYmUgY3JlYXRlZCBhbmQgc2l6ZXMgc2V0IGJlZm9yZQorICAgICBhbnkgb3V0cHV0IGlzIGRvbmUuICBUaHVzLCB3ZSB0cmF2ZXJzZSBhbGwgc2VjdGlvbnMgbXVsdGlwbGUgdGltZXMuICAqLworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGliZmQsIHNldHVwX3NlY3Rpb24sICh2b2lkICopIG9iZmQpOworCisgIGlmIChhZGRfc2VjdGlvbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKnBhZGQ7CisgICAgICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwc2V0OworCisgICAgICBmb3IgKHBhZGQgPSBhZGRfc2VjdGlvbnM7IHBhZGQgIT0gTlVMTDsgcGFkZCA9IHBhZGQtPm5leHQpCisJeworCSAgcGFkZC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsIHBhZGQtPm5hbWUpOworCSAgaWYgKHBhZGQtPnNlY3Rpb24gPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG5vbl9mYXRhbCAoXygiY2FuJ3QgY3JlYXRlIHNlY3Rpb24gYCVzJzogJXMiKSwKKwkJICAgICAgIHBhZGQtPm5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgICAgICBzdGF0dXMgPSAxOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisJICAgICAgCisJICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIHBhZGQtPnNpemUpKQorCQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKKworCSAgICAgIHBzZXQgPSBmaW5kX3NlY3Rpb25fbGlzdCAocGFkZC0+bmFtZSwgZmFsc2UpOworCSAgICAgIGlmIChwc2V0ICE9IE5VTEwpCisJCXBzZXQtPnVzZWQgPSB0cnVlOworCisJICAgICAgaWYgKHBzZXQgIT0gTlVMTCAmJiBwc2V0LT5zZXRfZmxhZ3MpCisJCWZsYWdzID0gcHNldC0+ZmxhZ3MgfCBTRUNfSEFTX0NPTlRFTlRTOworCSAgICAgIGVsc2UKKwkJZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZIHwgU0VDX0RBVEE7CisJICAgICAgCisJICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBwYWRkLT5zZWN0aW9uLCBmbGFncykpCisJCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOworCisJICAgICAgaWYgKHBzZXQgIT0gTlVMTCkKKwkJeworCQkgIGlmIChwc2V0LT5jaGFuZ2Vfdm1hICE9IENIQU5HRV9JR05PUkUpCisJCSAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvYmZkLCBwYWRkLT5zZWN0aW9uLCBwc2V0LT52bWFfdmFsKSkKKwkJICAgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisJCSAgCisJCSAgaWYgKHBzZXQtPmNoYW5nZV9sbWEgIT0gQ0hBTkdFX0lHTk9SRSkKKwkJICAgIHsKKwkJICAgICAgcGFkZC0+c2VjdGlvbi0+bG1hID0gcHNldC0+bG1hX3ZhbDsKKwkJICAgICAgCisJCSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQKKwkJCSAgKG9iZmQsIHBhZGQtPnNlY3Rpb24sCisJCQkgICBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsIHBhZGQtPnNlY3Rpb24pKSkKKwkJCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChnYXBfZmlsbF9zZXQgfHwgcGFkX3RvX3NldCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqKnNldDsKKyAgICAgIHVuc2lnbmVkIGludCBjLCBpOworCisgICAgICAvKiBXZSBtdXN0IGZpbGwgaW4gZ2FwcyBiZXR3ZWVuIHRoZSBzZWN0aW9ucyBhbmQvb3Igd2UgbXVzdCBwYWQKKwkgdGhlIGxhc3Qgc2VjdGlvbiB0byBhIHNwZWNpZmllZCBhZGRyZXNzLiAgV2UgZG8gdGhpcyBieQorCSBncmFiYmluZyBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zLCBzb3J0aW5nIHRoZW0gYnkgVk1BLCBhbmQKKwkgaW5jcmVhc2luZyB0aGUgc2VjdGlvbiBzaXplcyBhcyByZXF1aXJlZCB0byBmaWxsIHRoZSBnYXBzLgorCSBXZSB3cml0ZSBvdXQgdGhlIGdhcCBjb250ZW50cyBiZWxvdy4gICovCisKKyAgICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG9iZmQpOworICAgICAgb3NlY3Rpb25zID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChjICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7CisgICAgICBzZXQgPSBvc2VjdGlvbnM7CisgICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKG9iZmQsIGdldF9zZWN0aW9ucywgKHZvaWQgKikgJnNldCk7CisKKyAgICAgIHFzb3J0IChvc2VjdGlvbnMsIGMsIHNpemVvZiAoYXNlY3Rpb24gKiksIGNvbXBhcmVfc2VjdGlvbl9sbWEpOworCisgICAgICBnYXBzID0gKGJmZF9zaXplX3R5cGUgKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoYmZkX3NpemVfdHlwZSkpOworICAgICAgbWVtc2V0IChnYXBzLCAwLCBjICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7CisKKyAgICAgIGlmIChnYXBfZmlsbF9zZXQpCisJeworCSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCisJICAgIHsKKwkgICAgICBmbGFnd29yZCBmbGFnczsKKwkgICAgICBiZmRfc2l6ZV90eXBlIHNpemU7CisJICAgICAgYmZkX3ZtYSBnYXBfc3RhcnQsIGdhcF9zdG9wOworCisJICAgICAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIG9zZWN0aW9uc1tpXSk7CisJICAgICAgaWYgKChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKKwkJICB8fCAoZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKKwkJY29udGludWU7CisKKwkgICAgICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2ldKTsKKwkgICAgICBnYXBfc3RhcnQgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tpXSkgKyBzaXplOworCSAgICAgIGdhcF9zdG9wID0gYmZkX3NlY3Rpb25fbG1hIChvYmZkLCBvc2VjdGlvbnNbaSArIDFdKTsKKwkgICAgICBpZiAoZ2FwX3N0YXJ0IDwgZ2FwX3N0b3ApCisJCXsKKwkJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2ldLAorCQkJCQkgICAgICBzaXplICsgKGdhcF9zdG9wIC0gZ2FwX3N0YXJ0KSkpCisJCSAgICB7CisJCSAgICAgIG5vbl9mYXRhbCAoXygiQ2FuJ3QgZmlsbCBnYXAgYWZ0ZXIgJXM6ICVzIiksCisJCQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG9iZmQsIG9zZWN0aW9uc1tpXSksCisJCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCQkgICAgICBzdGF0dXMgPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBnYXBzW2ldID0gZ2FwX3N0b3AgLSBnYXBfc3RhcnQ7CisJCSAgaWYgKG1heF9nYXAgPCBnYXBfc3RvcCAtIGdhcF9zdGFydCkKKwkJICAgIG1heF9nYXAgPSBnYXBfc3RvcCAtIGdhcF9zdGFydDsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBpZiAocGFkX3RvX3NldCkKKwl7CisJICBiZmRfdm1hIGxtYTsKKwkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworCSAgbG1hID0gYmZkX3NlY3Rpb25fbG1hIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKTsKKwkgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKTsKKwkgIGlmIChsbWEgKyBzaXplIDwgcGFkX3RvKQorCSAgICB7CisJICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0sCisJCQkJCSAgcGFkX3RvIC0gbG1hKSkKKwkJeworCQkgIG5vbl9mYXRhbCAoXygiQ2FuJ3QgYWRkIHBhZGRpbmcgdG8gJXM6ICVzIiksCisJCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSksCisJCQkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJCSAgc3RhdHVzID0gMTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGdhcHNbYyAtIDFdID0gcGFkX3RvIC0gKGxtYSArIHNpemUpOworCQkgIGlmIChtYXhfZ2FwIDwgcGFkX3RvIC0gKGxtYSArIHNpemUpKQorCQkgICAgbWF4X2dhcCA9IHBhZF90byAtIChsbWEgKyBzaXplKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAvKiBTeW1ib2wgZmlsdGVyaW5nIG11c3QgaGFwcGVuIGFmdGVyIHRoZSBvdXRwdXQgc2VjdGlvbnMgaGF2ZQorICAgICBiZWVuIGNyZWF0ZWQsIGJ1dCBiZWZvcmUgdGhlaXIgY29udGVudHMgYXJlIHNldC4gICovCisgIGRoYW5kbGUgPSBOVUxMOworICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGliZmQpOworICBpZiAoc3ltc2l6ZSA8IDApCisgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisgIAorICBvc3ltcHAgPSBpc3ltcHAgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7CisgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGliZmQsIGlzeW1wcCk7CisgIGlmIChzeW1jb3VudCA8IDApCisgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisgIAorICBpZiAoY29udmVydF9kZWJ1Z2dpbmcpCisgICAgZGhhbmRsZSA9IHJlYWRfZGVidWdnaW5nX2luZm8gKGliZmQsIGlzeW1wcCwgc3ltY291bnQpOworICAKKyAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcgCisgICAgICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAorICAgICAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAorICAgICAgfHwgZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX1VOREVGCisgICAgICB8fCBzdHJpcF9zcGVjaWZpY19saXN0ICE9IE5VTEwKKyAgICAgIHx8IGtlZXBfc3BlY2lmaWNfbGlzdCAhPSBOVUxMCisgICAgICB8fCBsb2NhbGl6ZV9zcGVjaWZpY19saXN0ICE9IE5VTEwKKyAgICAgIHx8IHdlYWtlbl9zcGVjaWZpY19saXN0ICE9IE5VTEwKKyAgICAgIHx8IHNlY3Rpb25zX3JlbW92ZWQKKyAgICAgIHx8IGNvbnZlcnRfZGVidWdnaW5nCisgICAgICB8fCBjaGFuZ2VfbGVhZGluZ19jaGFyCisgICAgICB8fCByZW1vdmVfbGVhZGluZ19jaGFyCisgICAgICB8fCB3ZWFrZW4pCisgICAgeworICAgICAgLyogTWFyayBzeW1ib2xzIHVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHNvIHRoYXQgdGhleQorCSBhcmUga2VwdCwgZXZlbiBpZiB0aGV5IGFyZSBsb2NhbCBsYWJlbHMgb3Igc3RhdGljIHN5bWJvbHMuCisJIAorCSBOb3RlIHdlIGl0ZXJhdGUgb3ZlciB0aGUgaW5wdXQgc2VjdGlvbnMgZXhhbWluaW5nIHRoZWlyCisJIHJlbG9jYXRpb25zIHNpbmNlIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucworCSBoYXZlbid0IGJlZW4gc2V0IHlldC4gIG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zIHdpbGwKKwkgaWdub3JlIGlucHV0IHNlY3Rpb25zIHdoaWNoIGhhdmUgbm8gY29ycmVzcG9uZGluZyBvdXRwdXQKKwkgc2VjdGlvbi4gICovCisgICAgICBpZiAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9BTEwpCisJYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpYmZkLAorCQkJICAgICAgIG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zLAorCQkJICAgICAgIChQVFIpaXN5bXBwKTsKKyAgICAgIG9zeW1wcCA9IChhc3ltYm9sICoqKSB4bWFsbG9jICgoc3ltY291bnQgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgICAgICBzeW1jb3VudCA9IGZpbHRlcl9zeW1ib2xzIChpYmZkLCBvYmZkLCBvc3ltcHAsIGlzeW1wcCwgc3ltY291bnQpOworICAgIH0KKworICBpZiAoY29udmVydF9kZWJ1Z2dpbmcgJiYgZGhhbmRsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIHdyaXRlX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCAmc3ltY291bnQsICZvc3ltcHApKQorCXsKKwkgIHN0YXR1cyA9IDE7CisJICByZXR1cm47CisJfQorICAgIH0KKworICBiZmRfc2V0X3N5bXRhYiAob2JmZCwgb3N5bXBwLCBzeW1jb3VudCk7CisKKyAgLyogVGhpcyBoYXMgdG8gaGFwcGVuIGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gc2V0LiAgKi8KKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpYmZkLCBjb3B5X3NlY3Rpb24sICh2b2lkICopIG9iZmQpOworCisgIGlmIChhZGRfc2VjdGlvbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGQgKnBhZGQ7CisKKyAgICAgIGZvciAocGFkZCA9IGFkZF9zZWN0aW9uczsgcGFkZCAhPSBOVUxMOyBwYWRkID0gcGFkZC0+bmV4dCkKKwl7CisJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIHBhZGQtPnNlY3Rpb24sCisJCQkJCSAgKFBUUikgcGFkZC0+Y29udGVudHMsCisJCQkJCSAgKGZpbGVfcHRyKSAwLAorCQkJCQkgIChiZmRfc2l6ZV90eXBlKSBwYWRkLT5zaXplKSkKKwkgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisJfQorICAgIH0KKworICBpZiAoZ2FwX2ZpbGxfc2V0IHx8IHBhZF90b19zZXQpCisgICAgeworICAgICAgYmZkX2J5dGUgKmJ1ZjsKKyAgICAgIGludCBjLCBpOworCisgICAgICAvKiBGaWxsIGluIHRoZSBnYXBzLiAgKi8KKworICAgICAgaWYgKG1heF9nYXAgPiA4MTkyKQorCW1heF9nYXAgPSA4MTkyOworICAgICAgYnVmID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKG1heF9nYXApOworICAgICAgbWVtc2V0IChidWYsIGdhcF9maWxsLCAoc2l6ZV90KSBtYXhfZ2FwKTsKKworICAgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob2JmZCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQorCXsKKwkgIGlmIChnYXBzW2ldICE9IDApCisJICAgIHsKKwkgICAgICBiZmRfc2l6ZV90eXBlIGxlZnQ7CisJICAgICAgZmlsZV9wdHIgb2ZmOworCisJICAgICAgbGVmdCA9IGdhcHNbaV07CisJICAgICAgb2ZmID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2ldKSAtIGxlZnQ7CisJICAgICAgd2hpbGUgKGxlZnQgPiAwKQorCQl7CisJCSAgYmZkX3NpemVfdHlwZSBub3c7CisKKwkJICBpZiAobGVmdCA+IDgxOTIpCisJCSAgICBub3cgPSA4MTkyOworCQkgIGVsc2UKKwkJICAgIG5vdyA9IGxlZnQ7CisKKwkJICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG9iZmQsIG9zZWN0aW9uc1tpXSwgYnVmLAorCQkJCQkJICBvZmYsIG5vdykpCisJCSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKKworCQkgIGxlZnQgLT0gbm93OworCQkgIG9mZiArPSBub3c7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogQWxsb3cgdGhlIEJGRCBiYWNrZW5kIHRvIGNvcHkgYW55IHByaXZhdGUgZGF0YSBpdCB1bmRlcnN0YW5kcworICAgICBmcm9tIHRoZSBpbnB1dCBCRkQgdG8gdGhlIG91dHB1dCBCRkQuICBUaGlzIGlzIGRvbmUgbGFzdCB0bworICAgICBwZXJtaXQgdGhlIHJvdXRpbmUgdG8gbG9vayBhdCB0aGUgZmlsdGVyZWQgc3ltYm9sIHRhYmxlLCB3aGljaCBpcworICAgICBpbXBvcnRhbnQgZm9yIHRoZSBFQ09GRiBjb2RlIGF0IGxlYXN0LiAgKi8KKyAgaWYgKCFiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKSkKKyAgICB7CisgICAgICBub25fZmF0YWwgKF8oIiVzOiBlcnJvciBjb3B5aW5nIHByaXZhdGUgQkZEIGRhdGE6ICVzIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwKKwkJIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICAgIHN0YXR1cyA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBSZWFkIGVhY2ggYXJjaGl2ZSBlbGVtZW50IGluIHR1cm4gZnJvbSBJQkZELCBjb3B5IHRoZQorICAgY29udGVudHMgdG8gdGVtcCBmaWxlLCBhbmQga2VlcCB0aGUgdGVtcCBmaWxlIGhhbmRsZS4gICovCisKK3N0YXRpYyB2b2lkCitjb3B5X2FyY2hpdmUgKGliZmQsIG9iZmQsIG91dHB1dF90YXJnZXQpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgYmZkICpvYmZkOworICAgICBjb25zdCBjaGFyICpvdXRwdXRfdGFyZ2V0OworeworICBzdHJ1Y3QgbmFtZV9saXN0CisgICAgeworICAgICAgc3RydWN0IG5hbWVfbGlzdCAqbmV4dDsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBiZmQgKm9iZmQ7CisgICAgfSAqbGlzdCwgKmw7CisgIGJmZCAqKnB0ciA9ICZvYmZkLT5hcmNoaXZlX2hlYWQ7CisgIGJmZCAqdGhpc19lbGVtZW50OworICBjaGFyICpkaXIgPSBtYWtlX3RlbXBuYW1lIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisKKyAgLyogTWFrZSBhIHRlbXAgZGlyZWN0b3J5IHRvIGhvbGQgdGhlIGNvbnRlbnRzLiAgKi8KKyNpZiBkZWZpbmVkIChfV0lOMzIpICYmICFkZWZpbmVkIChfX0NZR1dJTjMyX18pCisgIGlmIChta2RpciAoZGlyKSAhPSAwKQorI2Vsc2UKKyAgaWYgKG1rZGlyIChkaXIsIDA3MDApICE9IDApCisjZW5kaWYKKyAgICB7CisgICAgICBmYXRhbCAoXygiY2Fubm90IG1rZGlyICVzIGZvciBhcmNoaXZlIGNvcHlpbmcgKGVycm9yOiAlcykiKSwKKwkgICAgIGRpciwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICBvYmZkLT5oYXNfYXJtYXAgPSBpYmZkLT5oYXNfYXJtYXA7CisKKyAgbGlzdCA9IE5VTEw7CisKKyAgdGhpc19lbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoaWJmZCwgTlVMTCk7CisgIHdoaWxlICghc3RhdHVzICYmIHRoaXNfZWxlbWVudCAhPSAoYmZkICopIE5VTEwpCisgICAgeworICAgICAgLyogQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGZvciB0aGlzIG1lbWJlci4gICovCisgICAgICBjaGFyICpvdXRwdXRfbmFtZSA9IGNvbmNhdCAoZGlyLCAiLyIsIGJmZF9nZXRfZmlsZW5hbWUgKHRoaXNfZWxlbWVudCksCisJCQkJICAoY2hhciAqKSBOVUxMKTsKKyAgICAgIGJmZCAqb3V0cHV0X2JmZCA9IGJmZF9vcGVudyAob3V0cHV0X25hbWUsIG91dHB1dF90YXJnZXQpOworICAgICAgYmZkICpsYXN0X2VsZW1lbnQ7CisKKyAgICAgIGwgPSAoc3RydWN0IG5hbWVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuYW1lX2xpc3QpKTsKKyAgICAgIGwtPm5hbWUgPSBvdXRwdXRfbmFtZTsKKyAgICAgIGwtPm5leHQgPSBsaXN0OworICAgICAgbGlzdCA9IGw7CisKKyAgICAgIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKKwlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9uYW1lKTsKKworICAgICAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKKwlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKKworICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRoaXNfZWxlbWVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKKwljb3B5X29iamVjdCAodGhpc19lbGVtZW50LCBvdXRwdXRfYmZkKTsKKworICAgICAgaWYgKCFiZmRfY2xvc2UgKG91dHB1dF9iZmQpKQorCXsKKwkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCkpOworCSAgLyogRXJyb3IgaW4gbmV3IG9iamVjdCBmaWxlLiBEb24ndCBjaGFuZ2UgYXJjaGl2ZS4gKi8KKwkgIHN0YXR1cyA9IDE7CisJfQorCisgICAgICAvKiBPcGVuIHRoZSBuZXdseSBvdXRwdXQgZmlsZSBhbmQgYXR0YWNoIHRvIG91ciBsaXN0LiAgKi8KKyAgICAgIG91dHB1dF9iZmQgPSBiZmRfb3BlbnIgKG91dHB1dF9uYW1lLCBvdXRwdXRfdGFyZ2V0KTsKKworICAgICAgbC0+b2JmZCA9IG91dHB1dF9iZmQ7CisKKyAgICAgICpwdHIgPSBvdXRwdXRfYmZkOworICAgICAgcHRyID0gJm91dHB1dF9iZmQtPm5leHQ7CisKKyAgICAgIGxhc3RfZWxlbWVudCA9IHRoaXNfZWxlbWVudDsKKworICAgICAgdGhpc19lbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoaWJmZCwgbGFzdF9lbGVtZW50KTsKKworICAgICAgYmZkX2Nsb3NlIChsYXN0X2VsZW1lbnQpOworICAgIH0KKyAgKnB0ciA9IChiZmQgKikgTlVMTDsKKworICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCisgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisKKyAgaWYgKCFiZmRfY2xvc2UgKGliZmQpKQorICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisgIC8qIERlbGV0ZSBhbGwgdGhlIGZpbGVzIHRoYXQgd2Ugb3BlbmVkLiAgKi8KKyAgZm9yIChsID0gbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBiZmRfY2xvc2UgKGwtPm9iZmQpOworICAgICAgdW5saW5rIChsLT5uYW1lKTsKKyAgICB9CisgIHJtZGlyIChkaXIpOworfQorCisvKiBUaGUgdG9wLWxldmVsIGNvbnRyb2wuICAqLworCitzdGF0aWMgdm9pZAorY29weV9maWxlIChpbnB1dF9maWxlbmFtZSwgb3V0cHV0X2ZpbGVuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpCisgICAgIGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lOworICAgICBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7CisgICAgIGNvbnN0IGNoYXIgKmlucHV0X3RhcmdldDsKKyAgICAgY29uc3QgY2hhciAqb3V0cHV0X3RhcmdldDsKK3sKKyAgYmZkICppYmZkOworICBjaGFyICoqbWF0Y2hpbmc7CisKKyAgLyogVG8gYWxsb3cgdXMgdG8gZG8gInN0cmlwICoiIHdpdGhvdXQgZHlpbmcgb24gdGhlIGZpcnN0CisgICAgIG5vbi1vYmplY3QgZmlsZSwgZmFpbHVyZXMgYXJlIG5vbmZhdGFsLiAgKi8KKworICBpYmZkID0gYmZkX29wZW5yIChpbnB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0KTsKKyAgaWYgKGliZmQgPT0gTlVMTCkKKyAgICBSRVRVUk5fTk9ORkFUQUwgKGlucHV0X2ZpbGVuYW1lKTsKKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoaWJmZCwgYmZkX2FyY2hpdmUpKQorICAgIHsKKyAgICAgIGJmZCAqb2JmZDsKKworICAgICAgLyogYmZkX2dldF90YXJnZXQgZG9lcyBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHVudGlsCisgICAgICAgICBiZmRfY2hlY2tfZm9ybWF0IHN1Y2NlZWRzLiAgKi8KKyAgICAgIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwpCisJb3V0cHV0X3RhcmdldCA9IGJmZF9nZXRfdGFyZ2V0IChpYmZkKTsKKworICAgICAgb2JmZCA9IGJmZF9vcGVudyAob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfdGFyZ2V0KTsKKyAgICAgIGlmIChvYmZkID09IE5VTEwpCisJUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOworCisgICAgICBjb3B5X2FyY2hpdmUgKGliZmQsIG9iZmQsIG91dHB1dF90YXJnZXQpOworICAgIH0KKyAgZWxzZSBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChpYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQorICAgIHsKKyAgICAgIGJmZCAqb2JmZDsKKworICAgICAgLyogYmZkX2dldF90YXJnZXQgZG9lcyBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIHVudGlsCisgICAgICAgICBiZmRfY2hlY2tfZm9ybWF0IHN1Y2NlZWRzLiAgKi8KKyAgICAgIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwpCisJb3V0cHV0X3RhcmdldCA9IGJmZF9nZXRfdGFyZ2V0IChpYmZkKTsKKworICAgICAgb2JmZCA9IGJmZF9vcGVudyAob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfdGFyZ2V0KTsKKyAgICAgIGlmIChvYmZkID09IE5VTEwpCisJUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOworCisgICAgICBjb3B5X29iamVjdCAoaWJmZCwgb2JmZCk7CisKKyAgICAgIGlmICghYmZkX2Nsb3NlIChvYmZkKSkKKwlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9maWxlbmFtZSk7CisKKyAgICAgIGlmICghYmZkX2Nsb3NlIChpYmZkKSkKKwlSRVRVUk5fTk9ORkFUQUwgKGlucHV0X2ZpbGVuYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGVuYW1lKTsKKyAgICAgIAorICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKKwl7CisJICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKKwkgIGZyZWUgKG1hdGNoaW5nKTsKKwl9CisgICAgICAKKyAgICAgIHN0YXR1cyA9IDE7CisgICAgfQorfQorCisvKiBDcmVhdGUgYSBzZWN0aW9uIGluIE9CRkQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBhdHRyaWJ1dGVzCisgICBhcyBJU0VDVElPTiBpbiBJQkZELiAgKi8KKworc3RhdGljIHZvaWQKK3NldHVwX3NlY3Rpb24gKGliZmQsIGlzZWN0aW9uLCBvYmZkYXJnKQorICAgICBiZmQgKmliZmQ7CisgICAgIHNlY19wdHIgaXNlY3Rpb247CisgICAgIFBUUiBvYmZkYXJnOworeworICBiZmQgKm9iZmQgPSAoYmZkICopIG9iZmRhcmc7CisgIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7CisgIHNlY19wdHIgb3NlY3Rpb247CisgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgYmZkX3ZtYSB2bWE7CisgIGJmZF92bWEgbG1hOworICBmbGFnd29yZCBmbGFnczsKKyAgY2hhciAqZXJyOworCisgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpYmZkLCBpc2VjdGlvbikgJiBTRUNfREVCVUdHSU5HKSAhPSAwCisgICAgICAmJiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRworCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTk5FRURFRAorCSAgfHwgc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9BTEwKKwkgIHx8IGRpc2NhcmRfbG9jYWxzID09IExPQ0FMU19BTEwKKwkgIHx8IGNvbnZlcnRfZGVidWdnaW5nKSkKKyAgICByZXR1cm47CisKKyAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbiksIGZhbHNlKTsKKyAgaWYgKHAgIT0gTlVMTCkKKyAgICBwLT51c2VkID0gdHJ1ZTsKKworICBpZiAocCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKKyAgICByZXR1cm47CisKKyAgb3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAob2JmZCwgYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pKTsKKyAgCisgIGlmIChvc2VjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVyciA9ICJtYWtpbmciOworICAgICAgZ290byBsb3NlcjsKKyAgICB9CisKKyAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGliZmQsIGlzZWN0aW9uKTsKKyAgaWYgKGNvcHlfYnl0ZSA+PSAwKQorICAgIHNpemUgPSAoc2l6ZSArIGludGVybGVhdmUgLSAxKSAvIGludGVybGVhdmU7CisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbiwgc2l6ZSkpCisgICAgeworICAgICAgZXJyID0gInNpemUiOworICAgICAgZ290byBsb3NlcjsKKyAgICB9CisgIAorICB2bWEgPSBiZmRfc2VjdGlvbl92bWEgKGliZmQsIGlzZWN0aW9uKTsKKyAgaWYgKHAgIT0gTlVMTCAmJiBwLT5jaGFuZ2Vfdm1hID09IENIQU5HRV9NT0RJRlkpCisgICAgdm1hICs9IHAtPnZtYV92YWw7CisgIGVsc2UgaWYgKHAgIT0gTlVMTCAmJiBwLT5jaGFuZ2Vfdm1hID09IENIQU5HRV9TRVQpCisgICAgdm1hID0gcC0+dm1hX3ZhbDsKKyAgZWxzZQorICAgIHZtYSArPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOworICAKKyAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAob2JmZCwgb3NlY3Rpb24sIHZtYSkpCisgICAgeworICAgICAgZXJyID0gInZtYSI7CisgICAgICBnb3RvIGxvc2VyOworICAgIH0KKworICBsbWEgPSBpc2VjdGlvbi0+bG1hOworICBpZiAoKHAgIT0gTlVMTCkgJiYgcC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQorICAgIHsKKyAgICAgIGlmIChwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9NT0RJRlkpCisJbG1hICs9IHAtPmxtYV92YWw7CisgICAgICBlbHNlIGlmIChwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9TRVQpCisJbG1hID0gcC0+bG1hX3ZhbDsKKyAgICAgIGVsc2UKKwlhYm9ydCAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBsbWEgKz0gY2hhbmdlX3NlY3Rpb25fYWRkcmVzczsKKyAgCisgIG9zZWN0aW9uLT5sbWEgPSBsbWE7CisKKyAgLyogRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGVub3VnaC4gIElmIHdlIGNoYW5nZSB0aGUgTE1BIHdlCisgICAgIG1heSBoYXZlIHRvIHJlY29tcHV0ZSB0aGUgaGVhZGVyIGZvciB0aGUgZmlsZSBhcyB3ZWxsLiAgKi8KKyAgaWYgKGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG9iZmQsCisJCQkJIG9zZWN0aW9uLAorCQkJCSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGliZmQsIGlzZWN0aW9uKSkKKyAgICAgID09IGZhbHNlKQorICAgIHsKKyAgICAgIGVyciA9ICJhbGlnbm1lbnQiOworICAgICAgZ290byBsb3NlcjsKKyAgICB9CisKKyAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKTsKKyAgaWYgKHAgIT0gTlVMTCAmJiBwLT5zZXRfZmxhZ3MpCisgICAgZmxhZ3MgPSBwLT5mbGFncyB8IChmbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpOworICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgb3NlY3Rpb24sIGZsYWdzKSkKKyAgICB7CisgICAgICBlcnIgPSAiZmxhZ3MiOworICAgICAgZ290byBsb3NlcjsKKyAgICB9CisKKyAgLyogVGhpcyB1c2VkIHRvIGJlIG1hbmdsZV9zZWN0aW9uOyB3ZSBkbyBoZXJlIHRvIGF2b2lkIHVzaW5nCisgICAgIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIHNpbmNlIHNvbWUgZm9ybWF0cyBhbGxvdyBtdWx0aXBsZQorICAgICBzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLworICBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBvc2VjdGlvbjsKKyAgaXNlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSAwOworCisgIC8qIEFsbG93IHRoZSBCRkQgYmFja2VuZCB0byBjb3B5IGFueSBwcml2YXRlIGRhdGEgaXQgdW5kZXJzdGFuZHMKKyAgICAgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLworICBpZiAoIWJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pKQorICAgIHsKKyAgICAgIGVyciA9ICJwcml2YXRlIGRhdGEiOworICAgICAgZ290byBsb3NlcjsKKyAgICB9CisKKyAgLyogQWxsIHdlbnQgd2VsbCAqLworICByZXR1cm47CisKK2xvc2VyOgorICBub25fZmF0YWwgKF8oIiVzOiBzZWN0aW9uIGAlcyc6IGVycm9yIGluICVzOiAlcyIpLAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCisJICAgICBiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbiksCisJICAgICBlcnIsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgc3RhdHVzID0gMTsKK30KKworLyogQ29weSB0aGUgZGF0YSBvZiBpbnB1dCBzZWN0aW9uIElTRUNUSU9OIG9mIElCRkQKKyAgIHRvIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBPQkZELgorICAgSWYgc3RyaXBwaW5nIHRoZW4gZG9uJ3QgY29weSBhbnkgcmVsb2NhdGlvbiBpbmZvLiAgKi8KKworc3RhdGljIHZvaWQKK2NvcHlfc2VjdGlvbiAoaWJmZCwgaXNlY3Rpb24sIG9iZmRhcmcpCisgICAgIGJmZCAqaWJmZDsKKyAgICAgc2VjX3B0ciBpc2VjdGlvbjsKKyAgICAgUFRSIG9iZmRhcmc7Cit7CisgIGJmZCAqb2JmZCA9IChiZmQgKikgb2JmZGFyZzsKKyAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKKyAgYXJlbGVudCAqKnJlbHBwOworICBsb25nIHJlbGNvdW50OworICBzZWNfcHRyIG9zZWN0aW9uOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIGxvbmcgcmVsc2l6ZTsKKworICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkIGVhcmxpZXIgb24sIGRvIG5vdCBrZWVwIG9uIGdlbmVyYXRpbmcKKyAgICAgY29tcGxhaW50cyBub3cuICAqLworICBpZiAoc3RhdHVzICE9IDApCisgICAgcmV0dXJuOworICAKKyAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGliZmQsIGlzZWN0aW9uKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKKyAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCisJICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECisJICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAorCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAorCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbiksIGZhbHNlKTsKKworICBpZiAocCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKKyAgICByZXR1cm47CisKKyAgb3NlY3Rpb24gPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGlzZWN0aW9uKTsKKworICBpZiAoc2l6ZSA9PSAwIHx8IG9zZWN0aW9uID09IDApCisgICAgcmV0dXJuOworCisKKyAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGliZmQsIGlzZWN0aW9uKTsKKyAgaWYgKHJlbHNpemUgPCAwKQorICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworICAKKyAgaWYgKHJlbHNpemUgPT0gMCkKKyAgICBiZmRfc2V0X3JlbG9jIChvYmZkLCBvc2VjdGlvbiwgKGFyZWxlbnQgKiopIE5VTEwsIDApOworICBlbHNlCisgICAgeworICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7CisgICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGliZmQsIGlzZWN0aW9uLCByZWxwcCwgaXN5bXBwKTsKKyAgICAgIGlmIChyZWxjb3VudCA8IDApCisJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisgICAgICAKKyAgICAgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTCkKKwl7CisJICAvKiBSZW1vdmUgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIG5vdCBpbgorCSAgICAga2VlcF9zdHJpcF9zcGVjaWZpY19saXN0LiAqLworCSAgYXJlbGVudCAqKnRlbXBfcmVscHA7CisJICBsb25nIHRlbXBfcmVsY291bnQgPSAwOworCSAgbG9uZyBpOworCSAgCisJICB0ZW1wX3JlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOworCSAgZm9yIChpID0gMDsgaSA8IHJlbGNvdW50OyBpKyspCisJICAgIGlmIChpc19zcGVjaWZpZWRfc3ltYm9sCisJCShiZmRfYXN5bWJvbF9uYW1lICgqcmVscHAgW2ldLT5zeW1fcHRyX3B0ciksCisJCSBrZWVwX3NwZWNpZmljX2xpc3QpKQorCSAgICAgIHRlbXBfcmVscHAgW3RlbXBfcmVsY291bnQrK10gPSByZWxwcCBbaV07CisJICByZWxjb3VudCA9IHRlbXBfcmVsY291bnQ7CisJICBmcmVlIChyZWxwcCk7CisJICByZWxwcCA9IHRlbXBfcmVscHA7CisJfQorICAgICAgYmZkX3NldF9yZWxvYyAob2JmZCwgb3NlY3Rpb24sCisJCSAgICAgKHJlbGNvdW50ID09IDAgPyAoYXJlbGVudCAqKikgTlVMTCA6IHJlbHBwKSwgcmVsY291bnQpOworICAgIH0KKyAgCisgIGlzZWN0aW9uLT5fY29va2VkX3NpemUgPSBpc2VjdGlvbi0+X3Jhd19zaXplOworICBpc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7CisKKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykKKyAgICB7CisgICAgICBQVFIgbWVtaHVuayA9IChQVFIpIHhtYWxsb2MgKCh1bnNpZ25lZCkgc2l6ZSk7CisKKyAgICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpYmZkLCBpc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAorCQkJCSAgICAgc2l6ZSkpCisJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7CisKKyAgICAgIGlmIChjb3B5X2J5dGUgPj0gMCkgCisJZmlsdGVyX2J5dGVzIChtZW1odW5rLCAmc2l6ZSk7CisKKyAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAorCQkJCSAgICAgc2l6ZSkpCisJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7CisKKyAgICAgIGZyZWUgKG1lbWh1bmspOworICAgIH0KKyAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncyAmJiAocC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQorICAgIHsKKyAgICAgIFBUUiBtZW1odW5rID0gKFBUUikgeG1hbGxvYyAoKHVuc2lnbmVkKSBzaXplKTsKKworICAgICAgLyogV2UgZG9uJ3QgcGVybWl0IHRoZSB1c2VyIHRvIHR1cm4gb2ZmIHRoZSBTRUNfSEFTX0NPTlRFTlRTCisJIGZsYWctLXRoZXkgY2FuIGp1c3QgcmVtb3ZlIHRoZSBzZWN0aW9uIGVudGlyZWx5IGFuZCBhZGQgaXQKKwkgYmFjayBhZ2Fpbi4gIEhvd2V2ZXIsIHdlIGRvIHBlcm1pdCB0aGVtIHRvIHR1cm4gb24gdGhlCisJIFNFQ19IQVNfQ09OVEVOVFMgZmxhZywgYW5kIHRha2UgaXQgdG8gbWVhbiB0aGF0IHRoZSBzZWN0aW9uCisJIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvZWQgb3V0LiAgKi8KKworICAgICAgbWVtc2V0IChtZW1odW5rLCAwLCBzaXplKTsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKKwkJCQkgICAgICBzaXplKSkKKwlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKKyAgICAgIGZyZWUgKG1lbWh1bmspOworICAgIH0KK30KKworLyogR2V0IGFsbCB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHVzZWQgd2hlbiAtLWdhcC1maWxsIG9yIC0tcGFkLXRvIGlzCisgICB1c2VkLiAgKi8KKworc3RhdGljIHZvaWQKK2dldF9zZWN0aW9ucyAob2JmZCwgb3NlY3Rpb24sIHNlY3BwcGFyZykKKyAgICAgYmZkICpvYmZkOworICAgICBhc2VjdGlvbiAqb3NlY3Rpb247CisgICAgIFBUUiBzZWNwcHBhcmc7Cit7CisgIGFzZWN0aW9uICoqKnNlY3BwcCA9IChhc2VjdGlvbiAqKiopIHNlY3BwcGFyZzsKKworICAqKnNlY3BwcCA9IG9zZWN0aW9uOworICArKygqc2VjcHBwKTsKK30KKworLyogU29ydCBzZWN0aW9ucyBieSBWTUEuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQsIGFuZCBpcyB1c2VkIHdoZW4KKyAgIC0tZ2FwLWZpbGwgb3IgLS1wYWQtdG8gaXMgdXNlZC4gIFdlIGZvcmNlIG5vbiBsb2FkYWJsZSBvciBlbXB0eQorICAgc2VjdGlvbnMgdG8gdGhlIGZyb250LCB3aGVyZSB0aGV5IGFyZSBlYXNpZXIgdG8gaWdub3JlLiAgKi8KKworc3RhdGljIGludAorY29tcGFyZV9zZWN0aW9uX2xtYSAoYXJnMSwgYXJnMikKKyAgICAgY29uc3QgUFRSIGFyZzE7CisgICAgIGNvbnN0IFBUUiBhcmcyOworeworICBjb25zdCBhc2VjdGlvbiAqKnNlYzEgPSAoY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7CisgIGNvbnN0IGFzZWN0aW9uICoqc2VjMiA9IChjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKKyAgZmxhZ3dvcmQgZmxhZ3MxLCBmbGFnczI7CisKKyAgLyogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LiAgKi8KKyAgZmxhZ3MxID0gKCpzZWMxKS0+ZmxhZ3M7CisgIGZsYWdzMiA9ICgqc2VjMiktPmZsYWdzOworICBpZiAoKGZsYWdzMSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKKyAgICAgIHx8IChmbGFnczEgJiBTRUNfTE9BRCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKGZsYWdzMiAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKKwkgICYmIChmbGFnczIgJiBTRUNfTE9BRCkgIT0gMCkKKwlyZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKChmbGFnczIgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCisJICB8fCAoZmxhZ3MyICYgU0VDX0xPQUQpID09IDApCisJcmV0dXJuIDE7CisgICAgfQorCisgIC8qIFNvcnQgc2VjdGlvbnMgYnkgTE1BLiAgKi8KKyAgaWYgKCgqc2VjMSktPmxtYSA+ICgqc2VjMiktPmxtYSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoKCpzZWMxKS0+bG1hIDwgKCpzZWMyKS0+bG1hKQorICAgIHJldHVybiAtMTsKKworICAvKiBTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgTE1BIGJ5IHNpemUuICAqLworICBpZiAoKCpzZWMxKS0+X3Jhd19zaXplID4gKCpzZWMyKS0+X3Jhd19zaXplKQorICAgIHJldHVybiAxOworICBlbHNlIGlmICgoKnNlYzEpLT5fcmF3X3NpemUgPCAoKnNlYzIpLT5fcmF3X3NpemUpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCisvKiBNYXJrIGFsbCB0aGUgc3ltYm9scyB3aGljaCB3aWxsIGJlIHVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHdpdGgKKyAgIHRoZSBCU0ZfS0VFUCBmbGFnIHNvIHRoYXQgdGhvc2Ugc3ltYm9scyB3aWxsIG5vdCBiZSBzdHJpcHBlZC4KKworICAgSWdub3JlIHJlbG9jYXRpb25zIHdoaWNoIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworCitzdGF0aWMgdm9pZAorbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgKGliZmQsIGlzZWN0aW9uLCBzeW1ib2xzYXJnKQorICAgICBiZmQgKmliZmQ7CisgICAgIHNlY19wdHIgaXNlY3Rpb247CisgICAgIFBUUiBzeW1ib2xzYXJnOworeworICBhc3ltYm9sICoqc3ltYm9scyA9IChhc3ltYm9sICoqKSBzeW1ib2xzYXJnOworICBsb25nIHJlbHNpemU7CisgIGFyZWxlbnQgKipyZWxwcDsKKyAgbG9uZyByZWxjb3VudCwgaTsKKworICAvKiBJZ25vcmUgYW4gaW5wdXQgc2VjdGlvbiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb24uICAqLworICBpZiAoaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpYmZkLCBpc2VjdGlvbik7CisgIGlmIChyZWxzaXplIDwgMCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKKworICBpZiAocmVsc2l6ZSA9PSAwKQorICAgIHJldHVybjsKKworICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKKyAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpYmZkLCBpc2VjdGlvbiwgcmVscHAsIHN5bWJvbHMpOworICBpZiAocmVsY291bnQgPCAwKQorICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOworCisgIC8qIEV4YW1pbmUgZWFjaCBzeW1ib2wgdXNlZCBpbiBhIHJlbG9jYXRpb24uICBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlCisgICAgIHNwZWNpYWwgYmZkIHNlY3Rpb24gc3ltYm9scywgdGhlbiBtYXJrIGl0IHdpdGggQlNGX0tFRVAuICAqLworICBmb3IgKGkgPSAwOyBpIDwgcmVsY291bnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfY29tX3NlY3Rpb25fcHRyLT5zeW1ib2wKKwkgICYmICpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sCisJICAmJiAqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF91bmRfc2VjdGlvbl9wdHItPnN5bWJvbCkKKwkoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciktPmZsYWdzIHw9IEJTRl9LRUVQOworICAgIH0KKworICBpZiAocmVscHAgIT0gTlVMTCkKKyAgICBmcmVlIChyZWxwcCk7Cit9CisKKy8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgord3JpdGVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUsIHN5bWNvdW50cCwgc3ltcHBwKQorICAgICBiZmQgKm9iZmQ7CisgICAgIFBUUiBkaGFuZGxlOworICAgICBsb25nICpzeW1jb3VudHA7CisgICAgIGFzeW1ib2wgKioqc3ltcHBwOworeworICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKKyAgICByZXR1cm4gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSk7CisKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKKyAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICB7CisgICAgICBiZmRfYnl0ZSAqc3ltcywgKnN0cmluZ3M7CisgICAgICBiZmRfc2l6ZV90eXBlIHN5bXNpemUsIHN0cmluZ3NpemU7CisgICAgICBhc2VjdGlvbiAqc3RhYnNlYywgKnN0YWJzdHJzZWM7CisKKyAgICAgIGlmICghIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCAmc3ltcywKKwkJCQkJCSAgICAmc3ltc2l6ZSwgJnN0cmluZ3MsCisJCQkJCQkgICAgJnN0cmluZ3NpemUpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgc3RhYnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYiIpOworICAgICAgc3RhYnN0cnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYnN0ciIpOworICAgICAgaWYgKHN0YWJzZWMgPT0gTlVMTAorCSAgfHwgc3RhYnN0cnNlYyA9PSBOVUxMCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBzdGFic2VjLCBzeW1zaXplKQorCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgc3RhYnN0cnNlYywgc3RyaW5nc2l6ZSkKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnNlYywgMikKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnN0cnNlYywgMCkKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBzdGFic2VjLAorCQkJCSAgIChTRUNfSEFTX0NPTlRFTlRTCisJCQkJICAgIHwgU0VDX1JFQURPTkxZCisJCQkJICAgIHwgU0VDX0RFQlVHR0lORykpCisJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgc3RhYnN0cnNlYywKKwkJCQkgICAgICAoU0VDX0hBU19DT05URU5UUworCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQorCQkJCSAgICAgICB8IFNFQ19ERUJVR0dJTkcpKSkKKwl7CisJICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBjcmVhdGUgZGVidWdnaW5nIHNlY3Rpb246ICVzIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCisJCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogV2UgY2FuIGdldCBhd2F5IHdpdGggc2V0dGluZyB0aGUgc2VjdGlvbiBjb250ZW50cyBub3cgYmVjYXVzZQorICAgICAgICAgdGhlIG5leHQgdGhpbmcgdGhlIGNhbGxlciBpcyBnb2luZyB0byBkbyBpcyBjb3B5IG92ZXIgdGhlCisgICAgICAgICByZWFsIHNlY3Rpb25zLiAgV2UgbWF5IHNvbWVkYXkgaGF2ZSB0byBzcGxpdCB0aGUgY29udGVudHMKKyAgICAgICAgIHNldHRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24uICAqLworICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic2VjLCBzeW1zLCAoZmlsZV9wdHIpIDAsCisJCQkJICAgICAgc3ltc2l6ZSkKKwkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic3Ryc2VjLCBzdHJpbmdzLAorCQkJCQkgKGZpbGVfcHRyKSAwLCBzdHJpbmdzaXplKSkKKwl7CisJICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBzZXQgZGVidWdnaW5nIHNlY3Rpb24gY29udGVudHM6ICVzIiksCisJCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCisJCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIG5vbl9mYXRhbCAoXygiJXM6IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgJXMiKSwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob2JmZCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3N0cmlwX21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisgIGNoYXIgKmlucHV0X3RhcmdldCA9IE5VTEwsICpvdXRwdXRfdGFyZ2V0ID0gTlVMTDsKKyAgYm9vbGVhbiBzaG93X3ZlcnNpb24gPSBmYWxzZTsKKyAgaW50IGMsIGk7CisgIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7CisgIGNoYXIgKm91dHB1dF9maWxlID0gTlVMTDsKKworICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIkk6TzpGOks6TjpSOm86c1NwZ3hYVnYiLAorCQkJICAgc3RyaXBfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnSSc6CisJICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdPJzoKKwkgIG91dHB1dF90YXJnZXQgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdGJzoKKwkgIGlucHV0X3RhcmdldCA9IG91dHB1dF90YXJnZXQgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdSJzoKKwkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKKwkgIHAtPnJlbW92ZSA9IHRydWU7CisJICBzZWN0aW9uc19yZW1vdmVkID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKKwkgIGJyZWFrOworCWNhc2UgJ1MnOgorCWNhc2UgJ2cnOgorCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0RFQlVHOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fU1RSSVBfVU5ORUVERUQ6CisJICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ORUVERUQ7CisJICBicmVhazsKKwljYXNlICdLJzoKKwkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmtlZXBfc3BlY2lmaWNfbGlzdCk7CisJICBicmVhazsKKwljYXNlICdOJzoKKwkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJnN0cmlwX3NwZWNpZmljX2xpc3QpOworCSAgYnJlYWs7CisJY2FzZSAnbyc6CisJICBvdXRwdXRfZmlsZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAneCc6CisJICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19BTEw7CisJICBicmVhazsKKwljYXNlICdYJzoKKwkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1NUQVJUX0w7CisJICBicmVhazsKKwljYXNlICd2JzoKKwkgIHZlcmJvc2UgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnVic6CisJICBzaG93X3ZlcnNpb24gPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAwOgorCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KKwljYXNlICdoJzoKKwkgIHN0cmlwX3VzYWdlIChzdGRvdXQsIDApOworCWRlZmF1bHQ6CisJICBzdHJpcF91c2FnZSAoc3RkZXJyLCAxKTsKKwl9CisgICAgfQorCisgIGlmIChzaG93X3ZlcnNpb24pCisgICAgcHJpbnRfdmVyc2lvbiAoInN0cmlwIik7CisKKyAgLyogRGVmYXVsdCBpcyB0byBzdHJpcCBhbGwgc3ltYm9scy4gICovCisgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOREVGCisgICAgICAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYKKyAgICAgICYmIHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCkKKyAgICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOworCisgIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCisgICAgb3V0cHV0X3RhcmdldCA9IGlucHV0X3RhcmdldDsKKworICBpID0gb3B0aW5kOworICBpZiAoaSA9PSBhcmdjCisgICAgICB8fCAob3V0cHV0X2ZpbGUgIT0gTlVMTCAmJiAoaSArIDEpIDwgYXJnYykpCisgICAgc3RyaXBfdXNhZ2UgKHN0ZGVyciwgMSk7CisKKyAgZm9yICg7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaW50IGhvbGRfc3RhdHVzID0gc3RhdHVzOworICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICAgIGNoYXIgKnRtcG5hbWU7CisKKyAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcykKKwl7CisJICBpZiAoc3RhdCAoYXJndltpXSwgJnN0YXRidWYpIDwgMCkKKwkgICAgeworCSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IGNhbm5vdCBzdGF0OiAlcyIpLCBhcmd2W2ldLCBzdHJlcnJvciAoZXJybm8pKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCisJdG1wbmFtZSA9IG91dHB1dF9maWxlOworICAgICAgZWxzZQorCXRtcG5hbWUgPSBtYWtlX3RlbXBuYW1lIChhcmd2W2ldKTsKKyAgICAgIHN0YXR1cyA9IDA7CisKKyAgICAgIGNvcHlfZmlsZSAoYXJndltpXSwgdG1wbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKKyAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwl7CisJICBpZiAocHJlc2VydmVfZGF0ZXMpCisJICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOworCSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCisJICAgIHNtYXJ0X3JlbmFtZSAodG1wbmFtZSwgYXJndltpXSwgcHJlc2VydmVfZGF0ZXMpOworCSAgc3RhdHVzID0gaG9sZF9zdGF0dXM7CisJfQorICAgICAgZWxzZQorCXVubGluayAodG1wbmFtZSk7CisgICAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKKwlmcmVlICh0bXBuYW1lKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlfbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgY2hhciAqaW5wdXRfZmlsZW5hbWUgPSBOVUxMLCAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKKyAgY2hhciAqaW5wdXRfdGFyZ2V0ID0gTlVMTCwgKm91dHB1dF90YXJnZXQgPSBOVUxMOworICBib29sZWFuIHNob3dfdmVyc2lvbiA9IGZhbHNlOworICBib29sZWFuIGNoYW5nZV93YXJuID0gdHJ1ZTsKKyAgaW50IGM7CisgIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisKKyAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOmk6STpLOk46czpPOmQ6RjpMOlI6U3BneFhWdlc6IiwKKwkJCSAgIGNvcHlfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnYic6CisJICBjb3B5X2J5dGUgPSBhdG9pIChvcHRhcmcpOworCSAgaWYgKGNvcHlfYnl0ZSA8IDApCisJICAgIGZhdGFsIChfKCJieXRlIG51bWJlciBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpKTsKKwkgIGJyZWFrOworCWNhc2UgJ2knOgorCSAgaW50ZXJsZWF2ZSA9IGF0b2kgKG9wdGFyZyk7CisJICBpZiAoaW50ZXJsZWF2ZSA8IDEpCisJICAgIGZhdGFsIChfKCJpbnRlcmxlYXZlIG11c3QgYmUgcG9zaXRpdmUiKSk7CisJICBicmVhazsKKwljYXNlICdJJzoKKwljYXNlICdzJzoJCS8qICJzb3VyY2UiIC0gJ0knIGlzIHByZWZlcnJlZCAqLworCSAgaW5wdXRfdGFyZ2V0ID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnTyc6CisJY2FzZSAnZCc6CQkvKiAiZGVzdGluYXRpb24iIC0gJ08nIGlzIHByZWZlcnJlZCAqLworCSAgb3V0cHV0X3RhcmdldCA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ0YnOgorCSAgaW5wdXRfdGFyZ2V0ID0gb3V0cHV0X3RhcmdldCA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgJ1InOgorCSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChvcHRhcmcsIHRydWUpOworCSAgcC0+cmVtb3ZlID0gdHJ1ZTsKKwkgIHNlY3Rpb25zX3JlbW92ZWQgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnUyc6CisJICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOworCSAgYnJlYWs7CisJY2FzZSAnZyc6CisJICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfREVCVUc7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9TVFJJUF9VTk5FRURFRDoKKwkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTk5FRURFRDsKKwkgIGJyZWFrOworCWNhc2UgJ0snOgorCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAma2VlcF9zcGVjaWZpY19saXN0KTsKKwkgIGJyZWFrOworCWNhc2UgJ04nOgorCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmc3RyaXBfc3BlY2lmaWNfbGlzdCk7CisJICBicmVhazsKKwljYXNlICdMJzoKKwkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmxvY2FsaXplX3NwZWNpZmljX2xpc3QpOworCSAgYnJlYWs7CisJY2FzZSAnVyc6CisJICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZ3ZWFrZW5fc3BlY2lmaWNfbGlzdCk7CisJICBicmVhazsKKwljYXNlICdwJzoKKwkgIHByZXNlcnZlX2RhdGVzID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ3gnOgorCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfQUxMOworCSAgYnJlYWs7CisJY2FzZSAnWCc6CisJICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19TVEFSVF9MOworCSAgYnJlYWs7CisJY2FzZSAndic6CisJICB2ZXJib3NlID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ1YnOgorCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1dFQUtFTjoKKwkgIHdlYWtlbiA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9BRERfU0VDVElPTjoKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqczsKKwkgICAgc3RydWN0IHN0YXQgc3Q7CisJICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGE7CisJICAgIGludCBsZW47CisJICAgIGNoYXIgKm5hbWU7CisJICAgIEZJTEUgKmY7CisKKwkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOworCSAgICAKKwkgICAgaWYgKHMgPT0gTlVMTCkKKwkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1hZGQtc2VjdGlvbiBOQU1FPUZJTEVOQU1FIikpOworCisJICAgIGlmIChzdGF0IChzICsgMSwgJiBzdCkgPCAwKQorCSAgICAgIGZhdGFsIChfKCJjYW5ub3Qgc3RhdDogJXM6ICVzIiksIHMgKyAxLCBzdHJlcnJvciAoZXJybm8pKTsKKworCSAgICBwYSA9IChzdHJ1Y3Qgc2VjdGlvbl9hZGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpKTsKKworCSAgICBsZW4gPSBzIC0gb3B0YXJnOworCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7CisJICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKKwkgICAgbmFtZVtsZW5dID0gJ1wwJzsKKwkgICAgcGEtPm5hbWUgPSBuYW1lOworCisJICAgIHBhLT5maWxlbmFtZSA9IHMgKyAxOworCisJICAgIHBhLT5zaXplID0gc3Quc3Rfc2l6ZTsKKworCSAgICBwYS0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAocGEtPnNpemUpOworCSAgICBmID0gZm9wZW4gKHBhLT5maWxlbmFtZSwgRk9QRU5fUkIpOworCSAgICAKKwkgICAgaWYgKGYgPT0gTlVMTCkKKwkgICAgICBmYXRhbCAoXygiY2Fubm90IG9wZW46ICVzOiAlcyIpLCBwYS0+ZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOworCSAgICAKKwkgICAgaWYgKGZyZWFkIChwYS0+Y29udGVudHMsIDEsIHBhLT5zaXplLCBmKSA9PSAwCisJCXx8IGZlcnJvciAoZikpCisJICAgICAgZmF0YWwgKF8oIiVzOiBmcmVhZCBmYWlsZWQiKSwgcGEtPmZpbGVuYW1lKTsKKworCSAgICBmY2xvc2UgKGYpOworCisJICAgIHBhLT5uZXh0ID0gYWRkX3NlY3Rpb25zOworCSAgICBhZGRfc2VjdGlvbnMgPSBwYTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0NIQU5HRV9TVEFSVDoKKwkgIGNoYW5nZV9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2Utc3RhcnQiKTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6CisJY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOgorCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQToKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqczsKKwkgICAgaW50IGxlbjsKKwkgICAgY2hhciAqbmFtZTsKKwkgICAgY2hhciAqb3B0aW9uOworCSAgICBiZmRfdm1hIHZhbDsKKwkgICAgZW51bSBjaGFuZ2VfYWN0aW9uIHdoYXQ7CisJICAgIAorCSAgICBzd2l0Y2ggKGMpCisJICAgICAgeworCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MiOyBicmVhazsKKwkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWxtYSI7IGJyZWFrOworCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQTogb3B0aW9uID0gIi0tY2hhbmdlLXNlY3Rpb24tdm1hIjsgYnJlYWs7CisJICAgICAgfQorCSAgICAKKwkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOworCSAgICBpZiAocyA9PSBOVUxMKQorCSAgICAgIHsKKwkJcyA9IHN0cmNociAob3B0YXJnLCAnKycpOworCQlpZiAocyA9PSBOVUxMKQorCQkgIHsKKwkJICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJy0nKTsKKwkJICAgIGlmIChzID09IE5VTEwpCisJCSAgICAgIGZhdGFsIChfKCJiYWQgZm9ybWF0IGZvciAlcyIpLCBvcHRpb24pOworCQkgIH0KKwkgICAgICB9CisKKwkgICAgbGVuID0gcyAtIG9wdGFyZzsKKwkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOworCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7CisJICAgIG5hbWVbbGVuXSA9ICdcMCc7CisKKwkgICAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCB0cnVlKTsKKworCSAgICB2YWwgPSBwYXJzZV92bWEgKHMgKyAxLCBvcHRpb24pOworCisJICAgIHN3aXRjaCAoKnMpCisJICAgICAgeworCSAgICAgIGNhc2UgJz0nOiB3aGF0ID0gQ0hBTkdFX1NFVDsgYnJlYWs7CisJICAgICAgY2FzZSAnLSc6IHZhbCAgPSAtIHZhbDsgLyogRHJvcCB0aHJvdWdoLiAgKi8KKwkgICAgICBjYXNlICcrJzogd2hhdCA9IENIQU5HRV9NT0RJRlk7IGJyZWFrOworCSAgICAgIH0KKwkgICAgCisJICAgIHN3aXRjaCAoYykKKwkgICAgICB7CisJICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUzoKKwkJcC0+Y2hhbmdlX3ZtYSA9IHdoYXQ7CisJCXAtPnZtYV92YWwgICAgPSB2YWw7CisJCS8qIERyb3AgdGhyb3VnaC4gICovCisJCQorCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKKwkJcC0+Y2hhbmdlX2xtYSA9IHdoYXQ7CisJCXAtPmxtYV92YWwgICAgPSB2YWw7CisJCWJyZWFrOworCQkKKwkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6CisJCXAtPmNoYW5nZV92bWEgPSB3aGF0OworCQlwLT52bWFfdmFsICAgID0gdmFsOworCQlicmVhazsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwljYXNlIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTOgorCSAgY2hhbmdlX3NlY3Rpb25fYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2UtYWRkcmVzc2VzIik7CisJICBjaGFuZ2Vfc3RhcnQgPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTOgorCSAgY2hhbmdlX3dhcm4gPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUjoKKwkgIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fREVCVUdHSU5HOgorCSAgY29udmVydF9kZWJ1Z2dpbmcgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fR0FQX0ZJTEw6CisJICB7CisJICAgIGJmZF92bWEgZ2FwX2ZpbGxfdm1hOworCisJICAgIGdhcF9maWxsX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1nYXAtZmlsbCIpOworCSAgICBnYXBfZmlsbCA9IChiZmRfYnl0ZSkgZ2FwX2ZpbGxfdm1hOworCSAgICBpZiAoKGJmZF92bWEpIGdhcF9maWxsICE9IGdhcF9maWxsX3ZtYSkKKwkgICAgICB7CisJCWNoYXIgYnVmZlsyMF07CisJCQorCQlzcHJpbnRmX3ZtYSAoYnVmZiwgZ2FwX2ZpbGxfdm1hKTsKKwkJCisJCW5vbl9mYXRhbCAoXygiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIpLAorCQkJICAgYnVmZiwgZ2FwX2ZpbGwpOworCSAgICAgIH0KKwkgICAgZ2FwX2ZpbGxfc2V0ID0gdHJ1ZTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUzoKKwkgIGNoYW5nZV93YXJuID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9QQURfVE86CisJICBwYWRfdG8gPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tcGFkLXRvIik7CisJICBwYWRfdG9fc2V0ID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVI6CisJICByZW1vdmVfbGVhZGluZ19jaGFyID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTOgorCSAgeworCSAgICBjb25zdCBjaGFyICpzOworCSAgICBpbnQgbGVuOworCSAgICBjaGFyICpuYW1lOworCisJICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKKwkgICAgaWYgKHMgPT0gTlVMTCkKKwkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1zZXQtc2VjdGlvbi1mbGFncyIpKTsKKworCSAgICBsZW4gPSBzIC0gb3B0YXJnOworCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7CisJICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKKwkgICAgbmFtZVtsZW5dID0gJ1wwJzsKKworCSAgICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIHRydWUpOworCisJICAgIHAtPnNldF9mbGFncyA9IHRydWU7CisJICAgIHAtPmZsYWdzID0gcGFyc2VfZmxhZ3MgKHMgKyAxKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1NFVF9TVEFSVDoKKwkgIHNldF9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zZXQtc3RhcnQiKTsKKwkgIHNldF9zdGFydF9zZXQgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAwOgorCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KKwljYXNlICdoJzoKKwkgIGNvcHlfdXNhZ2UgKHN0ZG91dCwgMCk7CisJZGVmYXVsdDoKKwkgIGNvcHlfdXNhZ2UgKHN0ZGVyciwgMSk7CisJfQorICAgIH0KKworICBpZiAoc2hvd192ZXJzaW9uKQorICAgIHByaW50X3ZlcnNpb24gKCJvYmpjb3B5Iik7CisKKyAgaWYgKGNvcHlfYnl0ZSA+PSBpbnRlcmxlYXZlKQorICAgIGZhdGFsIChfKCJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIikpOworCisgIGlmIChvcHRpbmQgPT0gYXJnYyB8fCBvcHRpbmQgKyAyIDwgYXJnYykKKyAgICBjb3B5X3VzYWdlIChzdGRlcnIsIDEpOworCisgIGlucHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOworICBpZiAob3B0aW5kICsgMSA8IGFyZ2MpCisgICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmQgKyAxXTsKKworICAvKiBEZWZhdWx0IGlzIHRvIHN0cmlwIG5vIHN5bWJvbHMuICAqLworICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTkRFRiAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYpCisgICAgc3RyaXBfc3ltYm9scyA9IFNUUklQX05PTkU7CisKKyAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKKyAgICBvdXRwdXRfdGFyZ2V0ID0gaW5wdXRfdGFyZ2V0OworCisgIGlmIChwcmVzZXJ2ZV9kYXRlcykKKyAgICB7CisgICAgICBpZiAoc3RhdCAoaW5wdXRfZmlsZW5hbWUsICZzdGF0YnVmKSA8IDApCisJZmF0YWwgKF8oIkNhbm5vdCBzdGF0OiAlczogJXMiKSwgaW5wdXRfZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOworICAgIH0KKworICAvKiBJZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBmaWxlIHRoZW4gY3JlYXRlIGEgdGVtcCBhbmQgcmVuYW1lCisgICAgIHRoZSByZXN1bHQgaW50byB0aGUgaW5wdXQuICAqLworCisgIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBjaGFyICp0bXBuYW1lID0gbWFrZV90ZW1wbmFtZSAoaW5wdXRfZmlsZW5hbWUpOworCisgICAgICBjb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCB0bXBuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpOworICAgICAgaWYgKHN0YXR1cyA9PSAwKQorCXsJCisJICBpZiAocHJlc2VydmVfZGF0ZXMpCisJICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOworCSAgc21hcnRfcmVuYW1lICh0bXBuYW1lLCBpbnB1dF9maWxlbmFtZSwgcHJlc2VydmVfZGF0ZXMpOworCX0KKyAgICAgIGVsc2UKKwl1bmxpbmsgKHRtcG5hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKKyAgICAgIGlmIChzdGF0dXMgPT0gMCAmJiBwcmVzZXJ2ZV9kYXRlcykKKwlzZXRfdGltZXMgKG91dHB1dF9maWxlbmFtZSwgJnN0YXRidWYpOworICAgIH0KKworICBpZiAoY2hhbmdlX3dhcm4pCisgICAgeworICAgICAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCXsKKwkgIGlmICghIHAtPnVzZWQpCisJICAgIHsKKwkgICAgICBpZiAocC0+Y2hhbmdlX3ZtYSAhPSBDSEFOR0VfSUdOT1JFKQorCQl7CisJCSAgY2hhciBidWZmIFsyMF07CisKKwkJICBzcHJpbnRmX3ZtYSAoYnVmZiwgcC0+dm1hX3ZhbCk7CisJCSAgCisJCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkJICBub25fZmF0YWwgKF8oIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tdm1hICVzJWMweCVzIG5ldmVyIHVzZWQiKSwKKwkJCSAgICAgcC0+bmFtZSwKKwkJCSAgICAgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfU0VUID8gJz0nIDogJysnLAorCQkJICAgICBidWZmKTsKKwkJfQorCSAgICAgIAorCSAgICAgIGlmIChwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCisJCXsKKwkJICBjaGFyIGJ1ZmYgWzIwXTsKKworCQkgIHNwcmludGZfdm1hIChidWZmLCBwLT5sbWFfdmFsKTsKKwkJICAKKwkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkgIG5vbl9mYXRhbCAoXygiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi1sbWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIpLAorCQkJICAgICBwLT5uYW1lLAorCQkJICAgICBwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9TRVQgPyAnPScgOiAnKycsCisJCQkgICAgIGJ1ZmYpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOworCisgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTkRFRjsKKyAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfVU5ERUY7CisKKyAgYmZkX2luaXQgKCk7CisgIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7CisKKyAgaWYgKGlzX3N0cmlwIDwgMCkKKyAgICB7CisgICAgICBpbnQgaSA9IHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKKyAgICAgIGlzX3N0cmlwID0gKGkgPj0gNSAmJiBzdHJjbXAgKHByb2dyYW1fbmFtZSArIGkgLSA1LCAic3RyaXAiKSA9PSAwKTsKKyAgICB9CisKKyAgaWYgKGlzX3N0cmlwKQorICAgIHN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpOworICBlbHNlCisgICAgY29weV9tYWluIChhcmdjLCBhcmd2KTsKKworICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamR1bXAuMSBiL2JpbnV0aWxzL29iamR1bXAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMxNTNlCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvb2JqZHVtcC4xCkBAIC0wLDAgKzEsNDEyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggb2JqZHVtcCAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKKy5kZSBCUAorLnNwCisudGkgXC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCitvYmpkdW1wIFwtIGRpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMuCisKKy5TSCBTWU5PUFNJUworLmh5IDAKKy5uYQorLlRQCisuQiBvYmpkdW1wCisuUkIgIltcfCIgXC1hIHwgXC1cLWFyY2hpdmVcLWhlYWRlcnMgIlx8XSIgCisuUkIgIltcfCIgIlwtYlwgIlxjCisuSSBiZmRuYW1lXGMKKy5SQiAiIHwgIiAiXC1cLXRhcmdldD0iXGMKKy5JIGJmZG5hbWVcYworXCZcfF0gCisuUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iIAorLlJCICJbXHwiIFwtXC1kZWJ1Z2dpbmcgIlx8XSIgCisuUkIgIltcfCIgXC1kIHwgXC1cLWRpc2Fzc2VtYmxlICJcfF0iIAorLlJCICJbXHwiIFwtRCB8IFwtXC1kaXNhc3NlbWJsZS1hbGwgIlx8XSIgCisuUkIgIltcfCIgXC1cLWRpc2Fzc2VtYmxlXC16ZXJvZXMgIlx8XSIgCisuUkIgIltcfCIgXC1FQiB8IFwtRUwgfCBcLVwtZW5kaWFuPVxjCisuSSB7YmlnfGxpdHRsZX1cYworXCZcfF0KKy5SQiAiW1x8IiBcLWYgfCBcLVwtZmlsZVwtaGVhZGVycyAiXHxdIgorLlJCICJbXHwiIFwtaCB8IFwtXC1zZWN0aW9uXC1oZWFkZXJzCisuUkIgInwgIiBcLVwtaGVhZGVycyAiXHxdIiAKKy5SQiAiW1x8IiBcLWkgfCBcLVwtaW5mbyAiXHxdIiAKKy5SQiAiW1x8IiAiXC1qXCAiXGMKKy5JIHNlY3Rpb25cYworLlJCICIgfCAiICJcLVwtc2VjdGlvbj0iXGMKKy5JIHNlY3Rpb25cYworXCZcfF0gCisuUkIgIltcfCIgXC1sIHwgXC1cLWxpbmVcLW51bWJlcnMgIlx8XSIKKy5SQiAiW1x8IiAiXC1tXCAiXGMKKy5JIG1hY2hpbmVcYworLlJCICIgfCAiICJcLVwtYXJjaGl0ZWN0dXJlPSJcYworLkkgbWFjaGluZVxjCitcJlx8XSAKKy5SQiAiW1x8IiBcLXAgfCBcLVwtcHJpdmF0ZVwtaGVhZGVycyAiXHxdIiAKKy5SQiAiW1x8IiBcLVwtcHJlZml4XC1hZGRyZXNzZXMgIlx8XSIgCisuUkIgIltcfCIgXC1yIHwgXC1cLXJlbG9jICJcfF0iIAorLlJCICJbXHwiIFwtUiB8IFwtXC1keW5hbWljXC1yZWxvYyAiXHxdIiAKKy5SQiAiW1x8IiBcLXMgfCBcLVwtZnVsbFwtY29udGVudHMgIlx8XSIKKy5SQiAiW1x8IiBcLVMgfCBcLVwtc291cmNlICJcfF0iCisuUkIgIltcfCIgXC1cLVtub1wtXXNob3dcLXJhd1wtaW5zbiAiXHxdIiAKKy5SQiAiW1x8IiBcLVwtc3RhYnMgIlx8XSIKKy5SQiAiW1x8IiBcLXQgfCBcLVwtc3ltcyAiXHxdIiAKKy5SQiAiW1x8IiBcLVQgfCBcLVwtZHluYW1pY1wtc3ltcyAiXHxdIiAKKy5SQiAiW1x8IiBcLXggfCBcLVwtYWxsXC1oZWFkZXJzICJcfF0iCisuUkIgIltcfCIgIlwtXC1zdGFydFwtYWRkcmVzcz0iXGMKKy5JIGFkZHJlc3NcYworXCZcfF0KKy5SQiAiW1x8IiAiXC1cLXN0b3BcLWFkZHJlc3M9IlxjCisuSSBhZGRyZXNzXGMKK1wmXHxdCisuUkIgIltcfCIgIlwtXC1hZGp1c3RcLXZtYT0iXGMKKy5JIG9mZnNldFxjCitcJlx8XQorLlJCICJbXHwiIFwtXC12ZXJzaW9uICJcfF0iCisuUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKKy5JIG9iamZpbGVcYworXCYuXHwuXHwuCisuYWQgYgorLmh5IDEKKy5TSCBERVNDUklQVElPTgorXGMKKy5CIG9iamR1bXBcYworXCYgZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgb2JqZWN0IGZpbGVzLgorVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4gIFRoaXMKK2luZm9ybWF0aW9uIGlzIG1vc3RseSB1c2VmdWwgdG8gcHJvZ3JhbW1lcnMgd2hvIGFyZSB3b3JraW5nIG9uIHRoZQorY29tcGlsYXRpb24gdG9vbHMsIGFzIG9wcG9zZWQgdG8gcHJvZ3JhbW1lcnMgd2hvIGp1c3Qgd2FudCB0aGVpcgorcHJvZ3JhbSB0byBjb21waWxlIGFuZCB3b3JrLgorLlBQCisuSVIgICJvYmpmaWxlIiAuXHwuXHwuCithcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4gIFdoZW4geW91IHNwZWNpZnkgYXJjaGl2ZXMsCitcYworLkIgb2JqZHVtcFxjCitcJiBzaG93cyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBtZW1iZXIgb2JqZWN0IGZpbGVzLgorCisuU0ggT1BUSU9OUworV2hlcmUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2YgYW4gb3B0aW9uIGFyZSBzaG93biB0b2dldGhlciwgdGhleSBhcmUKK2VxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMKKy5CIFwtbAorKFxmQlwtXC1saW5lXC1udW1iZXJzXGZQKSBtdXN0IGJlIGdpdmVuLgorCisuVFAKKy5CIFwtYQorLlRQCisuQiBcLVwtYXJjaGl2ZVwtaGVhZGVycworSWYgYW55IGZpbGVzIGZyb20gXGMKKy5JIG9iamZpbGVcYworXCYgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCitoZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gYFx8XGMKKy5CIGxzIFwtbFxjCitcfCcpLiAgQmVzaWRlcyB0aGUKK2luZm9ybWF0aW9uIHlvdSBjb3VsZCBsaXN0IHdpdGggYFx8XGMKKy5CIGFyIHR2XGMKK1x8JywgYFx8XGMKKy5CIG9iamR1bXAgXC1hXGMKK1x8JyBzaG93cwordGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiBlYWNoIGFyY2hpdmUgbWVtYmVyLgorCisuVFAKKy5CSSAiXC1cLWFkanVzdFwtdm1hPSIgIm9mZnNldCIKK1doZW4gZHVtcGluZyBpbmZvcm1hdGlvbiwgZmlyc3QgYWRkCisuSSBvZmZzZXQKK3RvIGFsbCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMKK2RvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nCitzZWN0aW9ucyBhdCBwYXJ0aWN1bGFyIGFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QKK3JlcHJlc2VudCBzZWN0aW9uIGFkZHJlc3Nlcywgc3VjaCBhcyBhLm91dC4KKworLlRQCisuQkkgIlwtYiAiICJiZmRuYW1lIlxjCisuVFAKKy5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgorU3BlY2lmeSB0aGUgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlCitcYworLkkgYmZkbmFtZVxjCitcJi4gIFRoaXMgbWF5IG5vdCBiZSBuZWNlc3Nhcnk7IFxjCisuSSBvYmpkdW1wXGMKK1wmIGNhbgorYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLiAgRm9yIGV4YW1wbGUsCisuc3AKKy5icgorb2JqZHVtcFwgXC1iXCBvYXN5c1wgXC1tXCB2YXhcIFwtaFwgZnUubworLmJyCisuc3AKK2Rpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKGBcfFxjCisuQiBcLWhcYworXHwnKSBvZgorYFx8XGMKKy5CIGZ1Lm9cYworXHwnLCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKGBcfFxjCisuQiBcLW1cYworXHwnKSBhcyBhIFZheCBvYmplY3QKK2ZpbGUgaW4gdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBPYXN5cyBjb21waWxlcnMuICBZb3UgY2FuIGxpc3QgdGhlCitmb3JtYXRzIGF2YWlsYWJsZSB3aXRoIHRoZSBgXHxcYworLkIgXC1pXGMKK1x8JyBvcHRpb24uCisKKy5UUAorLkIgXC1DCisuVFAKKy5CIFwtXC1kZW1hbmdsZQorRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCitCZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKK21ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KKworLlRQCisuQiBcLVwtZGVidWdnaW5nCitEaXNwbGF5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgYXR0ZW1wdHMgdG8gcGFyc2UgZGVidWdnaW5nCitpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGZpbGUgYW5kIHByaW50IGl0IG91dCB1c2luZyBhIEMgbGlrZSBzeW50YXguCitPbmx5IGNlcnRhaW4gdHlwZXMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KKworLlRQCisuQiBcLWQKKy5UUAorLkIgXC1cLWRpc2Fzc2VtYmxlCitEaXNwbGF5IHRoZSBhc3NlbWJsZXIgbW5lbW9uaWNzIGZvciB0aGUgbWFjaGluZQoraW5zdHJ1Y3Rpb25zIGZyb20gXGMKKy5JIG9iamZpbGVcYworXCYuCitUaGlzIG9wdGlvbiBvbmx5IGRpc2Fzc2VtYmxlcyB0aG9zZSBzZWN0aW9ucyB3aGljaCBhcmUKK2V4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgorCisuVFAKKy5CIFwtRAorLlRQCisuQiBcLVwtZGlzYXNzZW1ibGUtYWxsCitMaWtlIFxmQlwtZFxmUCwgYnV0IGRpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0Cit0aG9zZSBleHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KKworLlRQCisuQiBcLVwtcHJlZml4XC1hZGRyZXNzZXMKK1doZW4gZGlzYXNzZW1ibGluZywgcHJpbnQgdGhlIGNvbXBsZXRlIGFkZHJlc3Mgb24gZWFjaCBsaW5lLiAgVGhpcyBpcwordGhlIG9sZGVyIGRpc2Fzc2VtYmx5IGZvcm1hdC4KKworLlRQCisuQiBcLVwtZGlzYXNzZW1ibGVcLXplcm9lcworTm9ybWFsbHkgdGhlIGRpc2Fzc2VtYmx5IG91dHB1dCB3aWxsIHNraXAgYmxvY2tzIG9mIHplcm9lcy4gIFRoaXMKK29wdGlvbiBkaXJlY3RzIHRoZSBkaXNhc3NlbWJsZXIgdG8gZGlzYXNzZW1ibGUgdGhvc2UgYmxvY2tzLCBqdXN0IGxpa2UKK2FueSBvdGhlciBkYXRhLgorCisuVFAKKy5CIFwtRUIKKy5UUAorLkIgXC1FTAorLlRQCisuQkkgIlwtXC1lbmRpYW49IiAie2JpZ3xsaXR0bGV9IgorU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBvbmx5IGFmZmVjdHMKK2Rpc2Fzc2VtYmx5LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBhIGZpbGUgZm9ybWF0IHdoaWNoCitkb2VzIG5vdCBkZXNjcmliZSBlbmRpYW5uZXNzIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4KKworLlRQCisuQiBcLWYKKy5UUAorLkIgXC1cLWZpbGVcLWhlYWRlcnMKK0Rpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdmVyYWxsIGhlYWRlciBvZgorZWFjaCBmaWxlIGluIFxjCisuSSBvYmpmaWxlXGMKK1wmLgorCisuVFAKKy5CIFwtaAorLlRQCisuQiBcLVwtc2VjdGlvblwtaGVhZGVycworLlRQCisuQiBcLVwtaGVhZGVycworRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycyBvZiB0aGUKK29iamVjdCBmaWxlLgorCisuVFAKKy5CIFwtXC1oZWxwCitQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KKy5CIG9iamR1bXAKK2FuZCBleGl0LgorCisuVFAKKy5CIFwtaQorLlRQCisuQiBcLVwtaW5mbworRGlzcGxheSBhIGxpc3Qgc2hvd2luZyBhbGwgYXJjaGl0ZWN0dXJlcyBhbmQgb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCitmb3Igc3BlY2lmaWNhdGlvbiB3aXRoIFxjCisuQiBcLWJcYworXCYgb3IgXGMKKy5CIFwtbVxjCitcJi4KKworLlRQCisuQkkgIlwtaiAiICJuYW1lIlxjCisuVFAKKy5CSSAiXC1cLXNlY3Rpb249IiAibmFtZSIKK0Rpc3BsYXkgaW5mb3JtYXRpb24gb25seSBmb3Igc2VjdGlvbiBcYworLkkgbmFtZVxjCitcJi4KKworLlRQCisuQiBcLWwKKy5UUAorLkIgXC1cLWxpbmVcLW51bWJlcnMKK0xhYmVsIHRoZSBkaXNwbGF5ICh1c2luZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24pIHdpdGggdGhlIGZpbGVuYW1lCithbmQgc291cmNlIGxpbmUgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgY29kZSBzaG93bi4KK09ubHkgdXNlZnVsIHdpdGggXGZCXC1kXGZQLCBcZkJcLURcZlAsIG9yIFxmQlwtclxmUC4KKworLlRQCisuQkkgIlwtbSAiICJtYWNoaW5lIlxjCisuVFAKKy5CSSAiXC1cLWFyY2hpdGVjdHVyZT0iICJtYWNoaW5lIgorU3BlY2lmeSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSB3aGVuIGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGZpbGVzLiAgVGhpcworY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgb2JqZWN0IGZpbGVzIHdoaWNoIGRvIG5vdCBkZXNjcmliZQorYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4gIFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlCithcmNoaXRlY3R1cmVzIHdpdGggdGhlIFxmQlwtaVxmUCBvcHRpb24uIAorCisuVFAKKy5CIFwtcAorLlRQCisuQiBcLVwtcHJpdmF0ZVwtaGVhZGVycworUHJpbnQgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhlCitleGFjdCBpbmZvcm1hdGlvbiBwcmludGVkIGRlcGVuZHMgdXBvbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgRm9yCitzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgcHJpbnRlZC4KKworLlRQCisuQiBcLXIKKy5UUAorLkIgXC1cLXJlbG9jCitQcmludCB0aGUgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgSWYgdXNlZCB3aXRoIFxmQlwtZFxmUCBvcgorXGZCXC1EXGZQLCB0aGUgcmVsb2NhdGlvbnMgYXJlIHByaW50ZWQgaW50ZXJzcGVyc2VkIHdpdGggdGhlCitkaXNhc3NlbWJseS4KKworLlRQCisuQiBcLVIKKy5UUAorLkIgXC1cLWR5bmFtaWNcLXJlbG9jCitQcmludCB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGVudHJpZXMgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG9ubHkKK21lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAorbGlicmFyaWVzLgorCisuVFAKKy5CIFwtcworLlRQCisuQiBcLVwtZnVsbFwtY29udGVudHMKK0Rpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KKworLlRQCisuQiBcLVMKKy5UUAorLkIgXC1cLXNvdXJjZQorRGlzcGxheSBzb3VyY2UgY29kZSBpbnRlcm1peGVkIHdpdGggZGlzYXNzZW1ibHksIGlmIHBvc3NpYmxlLiAgSW1wbGllcworXGZCLWRcZlAuCisKKy5UUAorLkIgXC1cLXNob3dcLXJhd1wtaW5zbgorV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCitpbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgorLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCitpcyB1c2VkLgorCisuVFAKKy5CIFwtXC1ub1wtc2hvd1wtcmF3XC1pbnNuCitXaGVuIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zLCBkbyBub3QgcHJpbnQgdGhlIGluc3RydWN0aW9uIGJ5dGVzLgorVGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuCisuQiBcLVwtcHJlZml4XC1hZGRyZXNzZXMKK2lzIHVzZWQuCisKKy5UUAorLkIgXC1cLXN0YWJzCitEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgLnN0YWIsIC5zdGFiLmluZGV4LCBhbmQgLnN0YWIuZXhjbAorc2VjdGlvbnMgZnJvbSBhbiBFTEYgZmlsZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgb24gc3lzdGVtcyAoc3VjaCBhcworU29sYXJpcyAyLjApIGluIHdoaWNoIC5zdGFiIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUgZW50cmllcyBhcmUgY2FycmllZAoraW4gYW4gRUxGIHNlY3Rpb24uICBJbiBtb3N0IG90aGVyIGZpbGUgZm9ybWF0cywgZGVidWdnaW5nIHN5bWJvbC10YWJsZQorZW50cmllcyBhcmUgaW50ZXJsZWF2ZWQgd2l0aCBsaW5rYWdlIHN5bWJvbHMsIGFuZCBhcmUgdmlzaWJsZSBpbiB0aGUKKy5CIFwtXC1zeW1zCitvdXRwdXQuCisKKy5UUAorLkJJICJcLVwtc3RhcnRcLWFkZHJlc3M9IiAiYWRkcmVzcyIKK1N0YXJ0IGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAorb2YgdGhlCisuQiBcLWRcYworLAorLkIgXC1yCithbmQKKy5CIFwtcworb3B0aW9ucy4KKworLlRQCisuQkkgIlwtXC1zdG9wXC1hZGRyZXNzPSIgImFkZHJlc3MiCitTdG9wIGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAorb2YgdGhlCisuQiBcLWRcYworLAorLkIgXC1yCithbmQKKy5CIFwtcworb3B0aW9ucy4KKworLlRQCisuQiBcLXQKKy5UUAorLkIgXC1cLXN5bXMKK1N5bWJvbCBUYWJsZS4gIFByaW50IHRoZSBzeW1ib2wgdGFibGUgZW50cmllcyBvZiB0aGUgZmlsZS4KK1RoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGBcfFxjCisuQiBubVxjCitcfCcgcHJvZ3JhbS4KKworLlRQCisuQiBcLVQKKy5UUAorLkIgXC1cLWR5bmFtaWNcLXN5bXMKK0R5bmFtaWMgU3ltYm9sIFRhYmxlLiAgUHJpbnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlCitmaWxlLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluCit0eXBlcyBvZiBzaGFyZWQgbGlicmFyaWVzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbgorcHJvdmlkZWQgYnkgdGhlIGBcfFxjCisuQiBubVxjCitcfCcgcHJvZ3JhbSB3aGVuIGdpdmVuIHRoZQorLkIgXC1EIChcLVwtZHluYW1pYykKK29wdGlvbi4KKworLlRQCisuQiBcLVwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCisuQiBvYmpkdW1wCithbmQgZXhpdC4KKworLlRQCisuQiBcLXgKKy5UUAorLkIgXC1cLWFsbFwtaGVhZGVycworRGlzcGxheSBhbGwgYXZhaWxhYmxlIGhlYWRlciBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBzeW1ib2wgdGFibGUgYW5kCityZWxvY2F0aW9uIGVudHJpZXMuICBVc2luZyBgXHxcYworLkIgXC14XGMKK1x8JyBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgYWxsIG9mCitgXHxcYworLkIgXC1hIFwtZiBcLWggXC1yIFwtdFxjCitcfCcuCisKKy5TSCAiU0VFIEFMU08iCisuUkIgImBcfCIgYmludXRpbHMgIlx8JyIKK2VudHJ5IGluIAorLkIKK2luZm9cYworXCY7IAorLkkKK1RoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCitcJiwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpOyAKKy5CUiBubSAiKCIgMSAiKS4iCisKKy5TSCBDT1BZSU5HCitDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9vYmpkdW1wLmMgYi9iaW51dGlscy9vYmpkdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5ZThjNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL29iamR1bXAuYwpAQCAtMCwwICsxLDI4MjkgQEAKKy8qIG9iamR1bXAuYyAtLSBkdW1wIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBmaWxlLgorICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdldG9wdC5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImJ1ZGJnLmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKy8qIEludGVybmFsIGhlYWRlcnMgZm9yIHRoZSBFTEYgLnN0YWItZHVtcCBjb2RlIC0gc29ycnkuICAqLworI2RlZmluZQlCWVRFU19JTl9XT1JECTMyCisjaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlBSSU5URgorLyogVGhpcyBpcyBuZWVkZWQgYnkgSU5JVF9ESVNBU1NFTUJMRV9JTkZPLiAgKi8KK2V4dGVybiBpbnQgZnByaW50ZiBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7CisjZW5kaWYKKworc3RhdGljIGNoYXIgKmRlZmF1bHRfdGFyZ2V0ID0gTlVMTDsJLyogZGVmYXVsdCBhdCBydW50aW1lICovCisKK3N0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJCS8qIHNob3cgdGhlIHZlcnNpb24gbnVtYmVyICovCitzdGF0aWMgaW50IGR1bXBfc2VjdGlvbl9jb250ZW50czsJLyogLXMgKi8KK3N0YXRpYyBpbnQgZHVtcF9zZWN0aW9uX2hlYWRlcnM7CS8qIC1oICovCitzdGF0aWMgYm9vbGVhbiBkdW1wX2ZpbGVfaGVhZGVyOwkvKiAtZiAqLworc3RhdGljIGludCBkdW1wX3N5bXRhYjsJCQkvKiAtdCAqLworc3RhdGljIGludCBkdW1wX2R5bmFtaWNfc3ltdGFiOwkJLyogLVQgKi8KK3N0YXRpYyBpbnQgZHVtcF9yZWxvY19pbmZvOwkJLyogLXIgKi8KK3N0YXRpYyBpbnQgZHVtcF9keW5hbWljX3JlbG9jX2luZm87CS8qIC1SICovCitzdGF0aWMgaW50IGR1bXBfYXJfaGRyczsJCS8qIC1hICovCitzdGF0aWMgaW50IGR1bXBfcHJpdmF0ZV9oZWFkZXJzOwkvKiAtcCAqLworc3RhdGljIGludCBwcmVmaXhfYWRkcmVzc2VzOwkJLyogLS1wcmVmaXgtYWRkcmVzc2VzICovCitzdGF0aWMgaW50IHdpdGhfbGluZV9udW1iZXJzOwkJLyogLWwgKi8KK3N0YXRpYyBib29sZWFuIHdpdGhfc291cmNlX2NvZGU7CS8qIC1TICovCitzdGF0aWMgaW50IHNob3dfcmF3X2luc247CQkvKiAtLXNob3ctcmF3LWluc24gKi8KK3N0YXRpYyBpbnQgZHVtcF9zdGFiX3NlY3Rpb25faW5mbzsJLyogLS1zdGFicyAqLworc3RhdGljIGludCBkb19kZW1hbmdsZTsJCQkvKiAtQywgLS1kZW1hbmdsZSAqLworc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGU7CQkvKiAtZCAqLworc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGVfYWxsOwkJLyogLUQgKi8KK3N0YXRpYyBpbnQgZGlzYXNzZW1ibGVfemVyb2VzOwkJLyogLS1kaXNhc3NlbWJsZS16ZXJvZXMgKi8KK3N0YXRpYyBib29sZWFuIGZvcm1hdHNfaW5mbzsJCS8qIC1pICovCitzdGF0aWMgY2hhciAqb25seTsJCQkvKiAtaiBzZWNuYW1lICovCitzdGF0aWMgaW50IHdpZGVfb3V0cHV0OwkJCS8qIC13ICovCitzdGF0aWMgYmZkX3ZtYSBzdGFydF9hZGRyZXNzID0gKGJmZF92bWEpIC0xOyAvKiAtLXN0YXJ0LWFkZHJlc3MgKi8KK3N0YXRpYyBiZmRfdm1hIHN0b3BfYWRkcmVzcyA9IChiZmRfdm1hKSAtMTsgIC8qIC0tc3RvcC1hZGRyZXNzICovCitzdGF0aWMgaW50IGR1bXBfZGVidWdnaW5nOwkJLyogLS1kZWJ1Z2dpbmcgKi8KK3N0YXRpYyBiZmRfdm1hIGFkanVzdF9zZWN0aW9uX3ZtYSA9IDA7CS8qIC0tYWRqdXN0LXZtYSAqLworCisvKiBFeHRyYSBpbmZvIHRvIHBhc3MgdG8gdGhlIGRpc2Fzc2VtYmxlciBhZGRyZXNzIHByaW50aW5nIGZ1bmN0aW9uLiAgKi8KK3N0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIHsKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqc2VjOworICBib29sZWFuIHJlcXVpcmVfc2VjOworfTsKKworLyogQXJjaGl0ZWN0dXJlIHRvIGRpc2Fzc2VtYmxlIGZvciwgb3IgZGVmYXVsdCBpZiBOVUxMLiAgKi8KK3N0YXRpYyBjaGFyICptYWNoaW5lID0gKGNoYXIgKikgTlVMTDsKKworLyogRW5kaWFubmVzcyB0byBkaXNhc3NlbWJsZSBmb3IsIG9yIGRlZmF1bHQgaWYgQkZEX0VORElBTl9VTktOT1dOLiAgKi8KK3N0YXRpYyBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOworCisvKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KK3N0YXRpYyBhc3ltYm9sICoqc3ltczsKKworLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN5bXMnLiAgKi8KK3N0YXRpYyBsb25nIHN5bWNvdW50ID0gMDsKKworLyogVGhlIHNvcnRlZCBzeW1ib2wgdGFibGUuICAqLworc3RhdGljIGFzeW1ib2wgKipzb3J0ZWRfc3ltczsKKworLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYHNvcnRlZF9zeW1zJy4gICovCitzdGF0aWMgbG9uZyBzb3J0ZWRfc3ltY291bnQgPSAwOworCisvKiBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLworc3RhdGljIGFzeW1ib2wgKipkeW5zeW1zOworCisvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBgZHluc3ltcycuICAqLworc3RhdGljIGxvbmcgZHluc3ltY291bnQgPSAwOworCisvKiBTdGF0aWMgZGVjbGFyYXRpb25zLiAgKi8KKworc3RhdGljIHZvaWQKK3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGNoYXIgKnRhcmdldCkpOworCitzdGF0aWMgdm9pZAorZHVtcF9zZWN0aW9uX2hlYWRlciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKK3N0YXRpYyB2b2lkCitkdW1wX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIHZvaWQKK2R1bXBfZGF0YSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworc3RhdGljIHZvaWQKK2R1bXBfcmVsb2NzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOworCitzdGF0aWMgdm9pZAorZHVtcF9keW5hbWljX3JlbG9jcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7CisKK3N0YXRpYyB2b2lkCitkdW1wX3JlbG9jX3NldCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgbG9uZykpOworCitzdGF0aWMgdm9pZAorZHVtcF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljKSk7CisKK3N0YXRpYyB2b2lkCitkdW1wX2JmZF9oZWFkZXIgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIHZvaWQKK2R1bXBfYmZkX3ByaXZhdGVfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2JmZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfdGFyZ2V0X2xpc3QgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorZGlzcGxheV9pbmZvX3RhYmxlIFBBUkFNUyAoKGludCwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X3RhcmdldF90YWJsZXMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorZGlzcGxheV9pbmZvIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK29iamR1bXBfcHJpbnRfdmFsdWUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOworCitzdGF0aWMgdm9pZAorb2JqZHVtcF9wcmludF9zeW1uYW1lIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBhc3ltYm9sICopKTsKKworc3RhdGljIGFzeW1ib2wgKgorZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4sIGxvbmcgKikpOworCitzdGF0aWMgdm9pZAorb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICosIGJmZF92bWEsCisJCQkJICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBib29sZWFuKSk7CisKK3N0YXRpYyB2b2lkCitvYmpkdW1wX3ByaW50X2FkZHIgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOworCitzdGF0aWMgdm9pZAorb2JqZHVtcF9wcmludF9hZGRyZXNzIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKKworc3RhdGljIHZvaWQKK3Nob3dfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOworCitzdGF0aWMgdm9pZAorZGlzYXNzZW1ibGVfYnl0ZXMgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgZGlzYXNzZW1ibGVyX2Z0eXBlLAorCQkJICAgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwKKwkJCSAgIGFyZWxlbnQgKioqLCBhcmVsZW50ICoqKSk7CisKK3N0YXRpYyB2b2lkCitkaXNhc3NlbWJsZV9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2VuZGlhbl9zdHJpbmcgUEFSQU1TICgoZW51bSBiZmRfZW5kaWFuKSk7CisKK3N0YXRpYyBhc3ltYm9sICoqCitzbHVycF9zeW10YWIgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGFzeW1ib2wgKioKK3NsdXJwX2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7CisKK3N0YXRpYyBsb25nCityZW1vdmVfdXNlbGVzc19zeW1ib2xzIFBBUkFNUyAoKGFzeW1ib2wgKiosIGxvbmcpKTsKKworc3RhdGljIGludAorY29tcGFyZV9zeW1ib2xzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisKK3N0YXRpYyBpbnQKK2NvbXBhcmVfcmVsb2NzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisKK3N0YXRpYyB2b2lkCitkdW1wX3N0YWJzIFBBUkFNUyAoKGJmZCAqKSk7CisKK3N0YXRpYyBib29sZWFuCityZWFkX3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworDAorc3RhdGljIHZvaWQKK3VzYWdlIChzdHJlYW0sIHN0YXR1cykKKyAgICAgRklMRSAqc3RyZWFtOworICAgICBpbnQgc3RhdHVzOworeworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKK1VzYWdlOiAlcyBbLWFoaWZDZERwclJ0VHhzU2x3XSBbLWIgYmZkbmFtZV0gWy1tIG1hY2hpbmVdIFstaiBzZWN0aW9uLW5hbWVdXG5cCisgICAgICAgWy0tYXJjaGl2ZS1oZWFkZXJzXSBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tZGVidWdnaW5nXSBbLS1kaXNhc3NlbWJsZV1cblwKKyAgICAgICBbLS1kaXNhc3NlbWJsZS1hbGxdIFstLWRpc2Fzc2VtYmxlLXplcm9lc10gWy0tZmlsZS1oZWFkZXJzXVxuXAorICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cblwKKyAgICAgICBbLS1pbmZvXSBbLS1zZWN0aW9uPXNlY3Rpb24tbmFtZV0gWy0tbGluZS1udW1iZXJzXSBbLS1zb3VyY2VdXG4iKSwKKwkgICBwcm9ncmFtX25hbWUpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgICAgICBbLS1hcmNoaXRlY3R1cmU9bWFjaGluZV0gWy0tcmVsb2NdIFstLWZ1bGwtY29udGVudHNdIFstLXN0YWJzXVxuXAorICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG5cCisgICAgICAgWy0td2lkZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tcHJpdmF0ZS1oZWFkZXJzXVxuXAorICAgICAgIFstLXN0YXJ0LWFkZHJlc3M9YWRkcl0gWy0tc3RvcC1hZGRyZXNzPWFkZHJdXG5cCisgICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cblwKKyAgICAgICBbLS1hZGp1c3Qtdm1hPW9mZnNldF0gWy1FQnwtRUxdIFstLWVuZGlhbj17YmlnfGxpdHRsZX1dIG9iamZpbGUuLi5cblwKK2F0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyAtbCAoLS1saW5lLW51bWJlcnMpIG11c3QgYmUgZ2l2ZW5cbiIpKTsKKyAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOworICBpZiAoc3RhdHVzID09IDApCisgICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKKyAgZXhpdCAoc3RhdHVzKTsKK30KKworLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLworCisjZGVmaW5lIE9QVElPTl9FTkRJQU4gKDE1MCkKKyNkZWZpbmUgT1BUSU9OX1NUQVJUX0FERFJFU1MgKE9QVElPTl9FTkRJQU4gKyAxKQorI2RlZmluZSBPUFRJT05fU1RPUF9BRERSRVNTIChPUFRJT05fU1RBUlRfQUREUkVTUyArIDEpCisjZGVmaW5lIE9QVElPTl9BREpVU1RfVk1BIChPUFRJT05fU1RPUF9BRERSRVNTICsgMSkKKworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW109Cit7CisgIHsiYWRqdXN0LXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQURKVVNUX1ZNQX0sCisgIHsiYWxsLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKKyAgeyJwcml2YXRlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKKyAgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKKyAgeyJhcmNoaXZlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKKyAgeyJkZWJ1Z2dpbmciLCBub19hcmd1bWVudCwgJmR1bXBfZGVidWdnaW5nLCAxfSwKKyAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDF9LAorICB7ImRpc2Fzc2VtYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCisgIHsiZGlzYXNzZW1ibGUtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdEJ30sCisgIHsiZGlzYXNzZW1ibGUtemVyb2VzIiwgbm9fYXJndW1lbnQsICZkaXNhc3NlbWJsZV96ZXJvZXMsIDF9LAorICB7ImR5bmFtaWMtcmVsb2MiLCBub19hcmd1bWVudCwgTlVMTCwgJ1InfSwKKyAgeyJkeW5hbWljLXN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1QnfSwKKyAgeyJlbmRpYW4iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORElBTn0sCisgIHsiZmlsZS1oZWFkZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCisgIHsiZnVsbC1jb250ZW50cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncyd9LAorICB7ImhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKKyAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCisgIHsiaW5mbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAorICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAorICB7Im5vLXNob3ctcmF3LWluc24iLCBub19hcmd1bWVudCwgJnNob3dfcmF3X2luc24sIC0xfSwKKyAgeyJwcmVmaXgtYWRkcmVzc2VzIiwgbm9fYXJndW1lbnQsICZwcmVmaXhfYWRkcmVzc2VzLCAxfSwKKyAgeyJyZWxvYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAorICB7InNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2onfSwKKyAgeyJzZWN0aW9uLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKKyAgeyJzaG93LXJhdy1pbnNuIiwgbm9fYXJndW1lbnQsICZzaG93X3Jhd19pbnNuLCAxfSwKKyAgeyJzb3VyY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ1MnfSwKKyAgeyJzdGFicyIsIG5vX2FyZ3VtZW50LCAmZHVtcF9zdGFiX3NlY3Rpb25faW5mbywgMX0sCisgIHsic3RhcnQtYWRkcmVzcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBUlRfQUREUkVTU30sCisgIHsic3RvcC1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVE9QX0FERFJFU1N9LAorICB7InN5bXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKKyAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKKyAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsICZzaG93X3ZlcnNpb24sIDF9LAorICB7IndpZGUiLCBub19hcmd1bWVudCwgJndpZGVfb3V0cHV0LCAndyd9LAorICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Cit9OworDAorc3RhdGljIHZvaWQKK2R1bXBfc2VjdGlvbl9oZWFkZXIgKGFiZmQsIHNlY3Rpb24sIGlnbm9yZWQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIFBUUiBpZ25vcmVkOworeworICBjaGFyICpjb21tYSA9ICIiOworCisgIHByaW50ZiAoIiUzZCAlLTEzcyAlMDhseCAgIiwgc2VjdGlvbi0+aW5kZXgsCisJICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksCisJICAodW5zaWduZWQgbG9uZykgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOworICBwcmludGZfdm1hIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKSk7CisgIHByaW50ZiAoIiAgIik7CisgIHByaW50Zl92bWEgKHNlY3Rpb24tPmxtYSk7CisgIHByaW50ZiAoIiAgJTA4bHggIDIqKiV1Iiwgc2VjdGlvbi0+ZmlsZXBvcywKKwkgIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlY3Rpb24pKTsKKyAgaWYgKCEgd2lkZV9vdXRwdXQpCisgICAgcHJpbnRmICgiXG4gICAgICAgICAgICAgICAgIik7CisgIHByaW50ZiAoIiAgIik7CisKKyNkZWZpbmUgUEYoeCwgeSkgXAorICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiB4KSB7IHByaW50ZiAoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hID0gIiwgIjsgfQorCisgIFBGIChTRUNfSEFTX0NPTlRFTlRTLCAiQ09OVEVOVFMiKTsKKyAgUEYgKFNFQ19BTExPQywgIkFMTE9DIik7CisgIFBGIChTRUNfQ09OU1RSVUNUT1IsICJDT05TVFJVQ1RPUiIpOworICBQRiAoU0VDX0NPTlNUUlVDVE9SX1RFWFQsICJDT05TVFJVQ1RPUiBURVhUIik7CisgIFBGIChTRUNfQ09OU1RSVUNUT1JfREFUQSwgIkNPTlNUUlVDVE9SIERBVEEiKTsKKyAgUEYgKFNFQ19DT05TVFJVQ1RPUl9CU1MsICJDT05TVFJVQ1RPUiBCU1MiKTsKKyAgUEYgKFNFQ19MT0FELCAiTE9BRCIpOworICBQRiAoU0VDX1JFTE9DLCAiUkVMT0MiKTsKKyNpZmRlZiBTRUNfQkFMSUdOCisgIFBGIChTRUNfQkFMSUdOLCAiQkFMSUdOIik7CisjZW5kaWYKKyAgUEYgKFNFQ19SRUFET05MWSwgIlJFQURPTkxZIik7CisgIFBGIChTRUNfQ09ERSwgIkNPREUiKTsKKyAgUEYgKFNFQ19EQVRBLCAiREFUQSIpOworICBQRiAoU0VDX1JPTSwgIlJPTSIpOworICBQRiAoU0VDX0RFQlVHR0lORywgIkRFQlVHR0lORyIpOworICBQRiAoU0VDX05FVkVSX0xPQUQsICJORVZFUl9MT0FEIik7CisgIFBGIChTRUNfRVhDTFVERSwgIkVYQ0xVREUiKTsKKyAgUEYgKFNFQ19TT1JUX0VOVFJJRVMsICJTT1JUX0VOVFJJRVMiKTsKKworICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfT05DRSkgIT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpsczsKKworICAgICAgc3dpdGNoIChzZWN0aW9uLT5mbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKKwkgIGxzID0gIkxJTktfT05DRV9ESVNDQVJEIjsKKwkgIGJyZWFrOworCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKKwkgIGxzID0gIkxJTktfT05DRV9PTkVfT05MWSI7CisJICBicmVhazsKKwljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOgorCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfU0laRSI7CisJICBicmVhazsKKwljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKKwkgIGxzID0gIkxJTktfT05DRV9TQU1FX0NPTlRFTlRTIjsKKwkgIGJyZWFrOworCX0KKyAgICAgIHByaW50ZiAoIiVzJXMiLCBjb21tYSwgbHMpOworICAgICAgY29tbWEgPSAiLCAiOworICAgIH0KKworICBwcmludGYgKCJcbiIpOworI3VuZGVmIFBGCit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2hlYWRlcnMgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgcHJpbnRmIChfKCJTZWN0aW9uczpcbiIpKTsKKyNpZm5kZWYgQkZENjQKKyAgcHJpbnRmIChfKCJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgIExNQSAgICAgICBGaWxlIG9mZiAgQWxnblxuIikpOworI2Vsc2UKKyAgcHJpbnRmIChfKCJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgICAgICAgICAgTE1BICAgICAgICAgICAgICAgRmlsZSBvZmYgIEFsZ25cbiIpKTsKKyNlbmRpZgorICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGR1bXBfc2VjdGlvbl9oZWFkZXIsIChQVFIpIE5VTEwpOworfQorDAorc3RhdGljIGFzeW1ib2wgKioKK3NsdXJwX3N5bXRhYiAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc3ltYm9sICoqc3kgPSAoYXN5bWJvbCAqKikgTlVMTDsKKyAgbG9uZyBzdG9yYWdlOworCisgIGlmICghKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIHN5bWNvdW50ID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOworICBpZiAoc3RvcmFnZSA8IDApCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisKKyAgaWYgKHN0b3JhZ2UpCisgICAgeworICAgICAgc3kgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7CisgICAgfQorICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeSk7CisgIGlmIChzeW1jb3VudCA8IDApCisgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgIGlmIChzeW1jb3VudCA9PSAwKQorICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgIHJldHVybiBzeTsKK30KKworLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KKworc3RhdGljIGFzeW1ib2wgKioKK3NsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzeW1ib2wgKipzeSA9IChhc3ltYm9sICoqKSBOVUxMOworICBsb25nIHN0b3JhZ2U7CisKKyAgc3RvcmFnZSA9IGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOworICBpZiAoc3RvcmFnZSA8IDApCisgICAgeworICAgICAgaWYgKCEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBub3QgYSBkeW5hbWljIG9iamVjdFxuIiksCisJCSAgIHByb2dyYW1fbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCSAgZHluc3ltY291bnQgPSAwOworCSAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9CisKKyAgaWYgKHN0b3JhZ2UpCisgICAgeworICAgICAgc3kgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7CisgICAgfQorICBkeW5zeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5KTsKKyAgaWYgKGR5bnN5bWNvdW50IDwgMCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgaWYgKGR5bnN5bWNvdW50ID09IDApCisgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IE5vIGR5bmFtaWMgc3ltYm9sc1xuIiksCisJICAgICBwcm9ncmFtX25hbWUsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgcmV0dXJuIHN5OworfQorCisvKiBGaWx0ZXIgb3V0IChpbiBwbGFjZSkgc3ltYm9scyB0aGF0IGFyZSB1c2VsZXNzIGZvciBkaXNhc3NlbWJseS4KKyAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU1lNQk9MUy4KKyAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHVzZWZ1bCBzeW1ib2xzLiAqLworCitzdGF0aWMgbG9uZworcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyAoc3ltYm9scywgY291bnQpCisgICAgIGFzeW1ib2wgKipzeW1ib2xzOworICAgICBsb25nIGNvdW50OworeworICByZWdpc3RlciBhc3ltYm9sICoqaW5fcHRyID0gc3ltYm9scywgKipvdXRfcHRyID0gc3ltYm9sczsKKworICB3aGlsZSAoLS1jb3VudCA+PSAwKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnN5bSA9ICppbl9wdHIrKzsKKworICAgICAgaWYgKHN5bS0+bmFtZSA9PSBOVUxMIHx8IHN5bS0+bmFtZVswXSA9PSAnXDAnKQorCWNvbnRpbnVlOworICAgICAgaWYgKHN5bS0+ZmxhZ3MgJiAoQlNGX0RFQlVHR0lORykpCisJY29udGludWU7CisgICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCisJICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCisJY29udGludWU7CisKKyAgICAgICpvdXRfcHRyKysgPSBzeW07CisgICAgfQorICByZXR1cm4gb3V0X3B0ciAtIHN5bWJvbHM7Cit9CisKKy8qIFNvcnQgc3ltYm9scyBpbnRvIHZhbHVlIG9yZGVyLiAgKi8KKworc3RhdGljIGludCAKK2NvbXBhcmVfc3ltYm9scyAoYXAsIGJwKQorICAgICBjb25zdCBQVFIgYXA7CisgICAgIGNvbnN0IFBUUiBicDsKK3sKKyAgY29uc3QgYXN5bWJvbCAqYSA9ICooY29uc3QgYXN5bWJvbCAqKilhcDsKKyAgY29uc3QgYXN5bWJvbCAqYiA9ICooY29uc3QgYXN5bWJvbCAqKilicDsKKyAgY29uc3QgY2hhciAqYW4sICpibjsKKyAgc2l6ZV90IGFubCwgYm5sOworICBib29sZWFuIGFmLCBiZjsKKyAgZmxhZ3dvcmQgYWZsYWdzLCBiZmxhZ3M7CisKKyAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChhKSA+IGJmZF9hc3ltYm9sX3ZhbHVlIChiKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKGEpIDwgYmZkX2FzeW1ib2xfdmFsdWUgKGIpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoYS0+c2VjdGlvbiA+IGItPnNlY3Rpb24pCisgICAgcmV0dXJuIDE7CisgIGVsc2UgaWYgKGEtPnNlY3Rpb24gPCBiLT5zZWN0aW9uKQorICAgIHJldHVybiAtMTsKKworICBhbiA9IGJmZF9hc3ltYm9sX25hbWUgKGEpOworICBibiA9IGJmZF9hc3ltYm9sX25hbWUgKGIpOworICBhbmwgPSBzdHJsZW4gKGFuKTsKKyAgYm5sID0gc3RybGVuIChibik7CisKKyAgLyogVGhlIHN5bWJvbHMgZ251X2NvbXBpbGVkIGFuZCBnY2MyX2NvbXBpbGVkIGNvbnZleSBubyByZWFsCisgICAgIGluZm9ybWF0aW9uLCBzbyBwdXQgdGhlbSBhZnRlciBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUgdmFsdWUuICAqLworCisgIGFmID0gKHN0cnN0ciAoYW4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCisJfHwgc3Ryc3RyIChhbiwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKKyAgYmYgPSAoc3Ryc3RyIChibiwgImdudV9jb21waWxlZCIpICE9IE5VTEwKKwl8fCBzdHJzdHIgKGJuLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOworCisgIGlmIChhZiAmJiAhIGJmKQorICAgIHJldHVybiAxOworICBpZiAoISBhZiAmJiBiZikKKyAgICByZXR1cm4gLTE7CisKKyAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLCB0byB0cnkgdG8gc29ydCBpdCBhZnRlcgorICAgICBtb3JlIHVzZWZ1bCBzeW1ib2xzLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbiBVbml4IHN5c3RlbXMsIGJ1dCBpdAorICAgICBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgcHJlY2lzZWx5IHdoaWNoCisgICAgIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCisKKyNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCisgICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAorICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCisgICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKKwkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCisKKyAgYWYgPSBmaWxlX3N5bWJvbCAoYSwgYW4sIGFubCk7CisgIGJmID0gZmlsZV9zeW1ib2wgKGIsIGJuLCBibmwpOworCisgIGlmIChhZiAmJiAhIGJmKQorICAgIHJldHVybiAxOworICBpZiAoISBhZiAmJiBiZikKKyAgICByZXR1cm4gLTE7CisKKyAgLyogVHJ5IHRvIHNvcnQgZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIGxvY2FsIHN5bWJvbHMgYmVmb3JlIGZ1bmN0aW9uCisgICAgIHN5bWJvbHMgYmVmb3JlIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KKworICBhZmxhZ3MgPSBhLT5mbGFnczsKKyAgYmZsYWdzID0gYi0+ZmxhZ3M7CisKKyAgaWYgKChhZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAoYmZsYWdzICYgQlNGX0RFQlVHR0lORykpCisgICAgeworICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiAtMTsKKyAgICB9CisgIGlmICgoYWZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAoYmZsYWdzICYgQlNGX0ZVTkNUSU9OKSkKKyAgICB7CisgICAgICBpZiAoKGFmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMCkKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlCisJcmV0dXJuIDE7CisgICAgfQorICBpZiAoKGFmbGFncyAmIEJTRl9MT0NBTCkgIT0gKGJmbGFncyAmIEJTRl9MT0NBTCkpCisgICAgeworICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKChhZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAoYmZsYWdzICYgQlNGX0dMT0JBTCkpCisgICAgeworICAgICAgaWYgKChhZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwKQorCXJldHVybiAtMTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgLyogU3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggJy4nIG1pZ2h0IGJlIHNlY3Rpb24gbmFtZXMsIHNvIHNvcnQgdGhlbQorICAgICBhZnRlciBzeW1ib2xzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCAnLicuICAqLworICBpZiAoYW5bMF0gPT0gJy4nICYmIGJuWzBdICE9ICcuJykKKyAgICByZXR1cm4gMTsKKyAgaWYgKGFuWzBdICE9ICcuJyAmJiBiblswXSA9PSAnLicpCisgICAgcmV0dXJuIC0xOworCisgIC8qIEZpbmFsbHksIGlmIHdlIGNhbid0IGRpc3Rpbmd1aXNoIHRoZW0gaW4gYW55IG90aGVyIHdheSwgdHJ5IHRvCisgICAgIGdldCBjb25zaXN0ZW50IHJlc3VsdHMgYnkgc29ydGluZyB0aGUgc3ltYm9scyBieSBuYW1lLiAgKi8KKyAgcmV0dXJuIHN0cmNtcCAoYW4sIGJuKTsKK30KKworLyogU29ydCByZWxvY3MgaW50byBhZGRyZXNzIG9yZGVyLiAgKi8KKworc3RhdGljIGludAorY29tcGFyZV9yZWxvY3MgKGFwLCBicCkKKyAgICAgY29uc3QgUFRSIGFwOworICAgICBjb25zdCBQVFIgYnA7Cit7CisgIGNvbnN0IGFyZWxlbnQgKmEgPSAqKGNvbnN0IGFyZWxlbnQgKiopYXA7CisgIGNvbnN0IGFyZWxlbnQgKmIgPSAqKGNvbnN0IGFyZWxlbnQgKiopYnA7CisKKyAgaWYgKGEtPmFkZHJlc3MgPiBiLT5hZGRyZXNzKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChhLT5hZGRyZXNzIDwgYi0+YWRkcmVzcykKKyAgICByZXR1cm4gLTE7CisKKyAgLyogU28gdGhhdCBhc3NvY2lhdGVkIHJlbG9jYXRpb25zIHRpZWQgdG8gdGhlIHNhbWUgYWRkcmVzcyBzaG93IHVwCisgICAgIGluIHRoZSBjb3JyZWN0IG9yZGVyLCB3ZSBkb24ndCBkbyBhbnkgZnVydGhlciBzb3J0aW5nLiAgKi8KKyAgaWYgKGEgPiBiKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChhIDwgYikKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogUHJpbnQgVk1BIHRvIFNUUkVBTS4gIElmIFNLSVBfWkVST0VTIGlzIHRydWUsIG9taXQgbGVhZGluZyB6ZXJvZXMuICAqLworCitzdGF0aWMgdm9pZAorb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcykKKyAgICAgYmZkX3ZtYSB2bWE7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBib29sZWFuIHNraXBfemVyb2VzOworeworICBjaGFyIGJ1ZlszMF07CisgIGNoYXIgKnA7CisKKyAgc3ByaW50Zl92bWEgKGJ1Ziwgdm1hKTsKKyAgaWYgKCEgc2tpcF96ZXJvZXMpCisgICAgcCA9IGJ1ZjsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAocCA9IGJ1ZjsgKnAgPT0gJzAnOyArK3ApCisJOworICAgICAgaWYgKCpwID09ICdcMCcpCisJLS1wOworICAgIH0KKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHApOworfQorCisvKiBQcmludCB0aGUgbmFtZSBvZiBhIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIGluZm8sIHN5bSkKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgYXN5bWJvbCAqc3ltOworeworICBjaGFyICphbGxvYzsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqcHJpbnQ7CisKKyAgYWxsb2MgPSBOVUxMOworICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKKyAgaWYgKCEgZG9fZGVtYW5nbGUgfHwgbmFtZVswXSA9PSAnXDAnKQorICAgIHByaW50ID0gbmFtZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIERlbWFuZ2xlIHRoZSBuYW1lLiAgKi8KKyAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCisJKytuYW1lOworCisgICAgICBhbGxvYyA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7CisgICAgICBpZiAoYWxsb2MgPT0gTlVMTCkKKwlwcmludCA9IG5hbWU7CisgICAgICBlbHNlCisJcHJpbnQgPSBhbGxvYzsKKyAgICB9CisKKyAgaWYgKGluZm8gIT0gTlVMTCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcHJpbnQpOworICBlbHNlCisgICAgcHJpbnRmICgiJXMiLCBwcmludCk7CisKKyAgaWYgKGFsbG9jICE9IE5VTEwpCisgICAgZnJlZSAoYWxsb2MpOworfQorCisvKiBMb2NhdGUgYSBzeW1ib2wgZ2l2ZW4gYSBiZmQsIGEgc2VjdGlvbiwgYW5kIGEgVk1BLiAgSWYgUkVRVUlSRV9TRUMKKyAgIGlzIHRydWUsIHRoZW4gYWx3YXlzIHJlcXVpcmUgdGhlIHN5bWJvbCB0byBiZSBpbiB0aGUgc2VjdGlvbi4gIFRoaXMKKyAgIHJldHVybnMgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWl0YWJsZSBzeW1ib2wuICBJZiBQTEFDRSBpcyBub3QgTlVMTCwKKyAgIHRoZW4gKlBMQUNFIGlzIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbCBpbiBzb3J0ZWRfc3ltcy4gICovCisKK3N0YXRpYyBhc3ltYm9sICoKK2ZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhYmZkLCBzZWMsIHZtYSwgcmVxdWlyZV9zZWMsIHBsYWNlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGJmZF92bWEgdm1hOworICAgICBib29sZWFuIHJlcXVpcmVfc2VjOworICAgICBsb25nICpwbGFjZTsKK3sKKyAgLyogQEAgV291bGQgaXQgc3BlZWQgdGhpbmdzIHVwIHRvIGNhY2hlIHRoZSBsYXN0IHR3byBzeW1ib2xzIHJldHVybmVkLAorICAgICBhbmQgbWF5YmUgdGhlaXIgYWRkcmVzcyByYW5nZXM/ICBGb3IgbWFueSBwcm9jZXNzb3JzLCBvbmx5IG9uZSBtZW1vcnkKKyAgICAgb3BlcmFuZCBjYW4gYmUgcHJlc2VudCBhdCBhIHRpbWUsIHNvIHRoZSAyLWVudHJ5IGNhY2hlIHdvdWxkbid0IGJlCisgICAgIGNvbnN0YW50bHkgY2h1cm5lZCBieSBjb2RlIGRvaW5nIGhlYXZ5IG1lbW9yeSBhY2Nlc3Nlcy4gICovCisKKyAgLyogSW5kaWNlcyBpbiBgc29ydGVkX3N5bXMnLiAgKi8KKyAgbG9uZyBtaW4gPSAwOworICBsb25nIG1heCA9IHNvcnRlZF9zeW1jb3VudDsKKyAgbG9uZyB0aGlzcGxhY2U7CisKKyAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggbG9va2luZyBmb3IgdGhlIGNsb3Nlc3Qgc3ltYm9sIHRvIHRoZQorICAgICByZXF1aXJlZCB2YWx1ZS4gIFdlIGFyZSBzZWFyY2hpbmcgdGhlIHJhbmdlIChtaW4sIG1heF0uICAqLworICB3aGlsZSAobWluICsgMSA8IG1heCkKKyAgICB7CisgICAgICBhc3ltYm9sICpzeW07CisKKyAgICAgIHRoaXNwbGFjZSA9IChtYXggKyBtaW4pIC8gMjsKKyAgICAgIHN5bSA9IHNvcnRlZF9zeW1zW3RoaXNwbGFjZV07CisKKyAgICAgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHZtYSkKKwltYXggPSB0aGlzcGxhY2U7CisgICAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA8IHZtYSkKKwltaW4gPSB0aGlzcGxhY2U7CisgICAgICBlbHNlCisJeworCSAgbWluID0gdGhpc3BsYWNlOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBUaGUgc3ltYm9sIHdlIHdhbnQgaXMgbm93IGluIG1pbiwgdGhlIGxvdyBlbmQgb2YgdGhlIHJhbmdlIHdlCisgICAgIHdlcmUgc2VhcmNoaW5nLiAgSWYgdGhlcmUgYXJlIHNldmVyYWwgc3ltYm9scyB3aXRoIHRoZSBzYW1lCisgICAgIHZhbHVlLCB3ZSB3YW50IHRoZSBmaXJzdCBvbmUuICAqLworICB0aGlzcGxhY2UgPSBtaW47CisgIHdoaWxlICh0aGlzcGxhY2UgPiAwCisJICYmIChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXSkKKwkgICAgID09IGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2UgLSAxXSkpKQorICAgIC0tdGhpc3BsYWNlOworCisgIC8qIElmIHRoZSBmaWxlIGlzIHJlbG9jYXRlYWJsZSwgYW5kIHRoZSBzeW1ib2wgY291bGQgYmUgZnJvbSB0aGlzCisgICAgIHNlY3Rpb24sIHByZWZlciBhIHN5bWJvbCBmcm9tIHRoaXMgc2VjdGlvbiBvdmVyIHN5bWJvbHMgZnJvbQorICAgICBvdGhlcnMsIGV2ZW4gaWYgdGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIG1pZ2h0IGJlIGNsb3Nlci4KKyAgICAgICAKKyAgICAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIHdyb25nIGZvciBzb21lIHN5bWJvbCByZWZlcmVuY2VzIGlmIHRoZQorICAgICBzZWN0aW9ucyBoYXZlIG92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMsIGJ1dCBpbiB0aGF0IGNhc2UgdGhlcmUncworICAgICBubyB3YXkgdG8gdGVsbCB3aGF0J3MgZGVzaXJlZCB3aXRob3V0IGxvb2tpbmcgYXQgdGhlIHJlbG9jYXRpb24KKyAgICAgdGFibGUuICAqLworCisgIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYworICAgICAgJiYgKHJlcXVpcmVfc2VjCisJICB8fCAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSAhPSAwCisJICAgICAgJiYgdm1hID49IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKKwkgICAgICAmJiB2bWEgPCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQorCQkJKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpKSkpKQorICAgIHsKKyAgICAgIGxvbmcgaTsKKworICAgICAgZm9yIChpID0gdGhpc3BsYWNlICsgMTsgaSA8IHNvcnRlZF9zeW1jb3VudDsgaSsrKQorCXsKKwkgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaV0pCisJICAgICAgIT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0pKQorCSAgICBicmVhazsKKwl9CisgICAgICAtLWk7CisgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pCisJeworCSAgaWYgKHNvcnRlZF9zeW1zW2ldLT5zZWN0aW9uID09IHNlYworCSAgICAgICYmIChpID09IDAKKwkJICB8fCBzb3J0ZWRfc3ltc1tpIC0gMV0tPnNlY3Rpb24gIT0gc2VjCisJCSAgfHwgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpXSkKKwkJICAgICAgIT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2kgLSAxXSkpKSkKKwkgICAgeworCSAgICAgIHRoaXNwbGFjZSA9IGk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdLT5zZWN0aW9uICE9IHNlYykKKwl7CisJICAvKiBXZSBkaWRuJ3QgZmluZCBhIGdvb2Qgc3ltYm9sIHdpdGggYSBzbWFsbGVyIHZhbHVlLgorCSAgICAgTG9vayBmb3Igb25lIHdpdGggYSBsYXJnZXIgdmFsdWUuICAqLworCSAgZm9yIChpID0gdGhpc3BsYWNlICsgMTsgaSA8IHNvcnRlZF9zeW1jb3VudDsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKHNvcnRlZF9zeW1zW2ldLT5zZWN0aW9uID09IHNlYykKKwkJeworCQkgIHRoaXNwbGFjZSA9IGk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjCisJICAmJiAocmVxdWlyZV9zZWMKKwkgICAgICB8fCAoKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSAhPSAwCisJCSAgJiYgdm1hID49IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKKwkJICAmJiB2bWEgPCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQorCQkJICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSkpKSkKKwl7CisJICAvKiBUaGVyZSBpcyBubyBzdWl0YWJsZSBzeW1ib2wuICAqLworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICBpZiAocGxhY2UgIT0gTlVMTCkKKyAgICAqcGxhY2UgPSB0aGlzcGxhY2U7CisKKyAgcmV0dXJuIHNvcnRlZF9zeW1zW3RoaXNwbGFjZV07Cit9CisKKy8qIFByaW50IGFuIGFkZHJlc3MgdG8gSU5GTyBzeW1ib2xpY2FsbHkuICAqLworCitzdGF0aWMgdm9pZAorb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWMsIHN5bSwgdm1hLCBpbmZvLCBza2lwX3plcm9lcykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBhc3ltYm9sICpzeW07CisgICAgIGJmZF92bWEgdm1hOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgYm9vbGVhbiBza2lwX3plcm9lczsKK3sKKyAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcyk7CisKKyAgaWYgKHN5bSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF92bWEgc2VjYWRkcjsKKworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgPCVzIiwKKwkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOworICAgICAgc2VjYWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7CisgICAgICBpZiAodm1hIDwgc2VjYWRkcikKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0weCIpOworCSAgb2JqZHVtcF9wcmludF92YWx1ZSAoc2VjYWRkciAtIHZtYSwgaW5mbywgdHJ1ZSk7CisJfQorICAgICAgZWxzZSBpZiAodm1hID4gc2VjYWRkcikKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisweCIpOworCSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hIC0gc2VjYWRkciwgaW5mbywgdHJ1ZSk7CisJfQorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI+Iik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgPCIpOworICAgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhYmZkLCBpbmZvLCBzeW0pOworICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gdm1hKQorCXsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLTB4Iik7CisJICBvYmpkdW1wX3ByaW50X3ZhbHVlIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSAtIHZtYSwgaW5mbywgdHJ1ZSk7CisJfQorICAgICAgZWxzZSBpZiAodm1hID4gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpCisJeworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrMHgiKTsKKwkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHZtYSAtIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pLCBpbmZvLCB0cnVlKTsKKwl9CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj4iKTsKKyAgICB9Cit9CisKKy8qIFByaW50IFZNQSB0byBJTkZPLCBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICBJZiBTS0lQX1pFUk9FUyBpcworICAgdHJ1ZSwgZG9uJ3Qgb3V0cHV0IGxlYWRpbmcgemVyb2VzLiAgKi8KKworc3RhdGljIHZvaWQKK29iamR1bXBfcHJpbnRfYWRkciAodm1hLCBpbmZvLCBza2lwX3plcm9lcykKKyAgICAgYmZkX3ZtYSB2bWE7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBib29sZWFuIHNraXBfemVyb2VzOworeworICBzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqYXV4OworICBhc3ltYm9sICpzeW07CisKKyAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCIpOworICAgICAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hLCBpbmZvLCBza2lwX3plcm9lcyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOworICBzeW0gPSBmaW5kX3N5bWJvbF9mb3JfYWRkcmVzcyAoYXV4LT5hYmZkLCBhdXgtPnNlYywgdm1hLCBhdXgtPnJlcXVpcmVfc2VjLAorCQkJCSAobG9uZyAqKSBOVUxMKTsKKyAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhdXgtPmFiZmQsIGF1eC0+c2VjLCBzeW0sIHZtYSwgaW5mbywKKwkJCSAgICAgICBza2lwX3plcm9lcyk7Cit9CisKKy8qIFByaW50IFZNQSB0byBJTkZPLiAgVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGRpc2Fzc2VtYmxlcgorICAgcm91dGluZS4gICovCisKK3N0YXRpYyB2b2lkCitvYmpkdW1wX3ByaW50X2FkZHJlc3MgKHZtYSwgaW5mbykKKyAgICAgYmZkX3ZtYSB2bWE7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBvYmpkdW1wX3ByaW50X2FkZHIgKHZtYSwgaW5mbywgISBwcmVmaXhfYWRkcmVzc2VzKTsKK30KKworLyogRGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBhZGRyZXNzIGhhcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaXQuICAqLworCitzdGF0aWMgaW50CitvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzICh2bWEsIGluZm8pCisgICAgIGJmZF92bWEgdm1hOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Cit7CisgIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICogYXV4OworICBhc3ltYm9sICogc3ltOworCisgIC8qIE5vIHN5bWJvbHMgLSBkbyBub3QgYm90aGVyIGNoZWNraW5nLiAgKi8KKyAgaWYgKHNvcnRlZF9zeW1jb3VudCA8IDEpCisgICAgcmV0dXJuIDA7CisKKyAgYXV4ID0gKHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICopIGluZm8tPmFwcGxpY2F0aW9uX2RhdGE7CisgIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhdXgtPmFiZmQsIGF1eC0+c2VjLCB2bWEsIGF1eC0+cmVxdWlyZV9zZWMsCisJCQkJIChsb25nICopIE5VTEwpOworCisgIHJldHVybiAoc3ltICE9IE5VTEwgJiYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID09IHZtYSkpOworfQorCisvKiBIb2xkIHRoZSBsYXN0IGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsYXN0IGxpbmUgbnVtYmVyIHdlIGRpc3BsYXllZAorICAgaW4gYSBkaXNhc3NlbWJseS4gICovCisKK3N0YXRpYyBjaGFyICpwcmV2X2Z1bmN0aW9ubmFtZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJldl9saW5lOworCisvKiBXZSBrZWVwIGEgbGlzdCBvZiBhbGwgZmlsZXMgdGhhdCB3ZSBoYXZlIHNlZW4gd2hlbiBkb2luZyBhCisgICBkaXNzYXNzZW1ibHkgd2l0aCBzb3VyY2UsIHNvIHRoYXQgd2Uga25vdyBob3cgbXVjaCBvZiB0aGUgZmlsZSB0bworICAgZGlzcGxheS4gIFRoaXMgY2FuIGJlIGltcG9ydGFudCBmb3IgaW5saW5lZCBmdW5jdGlvbnMuICAqLworCitzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0Cit7CisgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKm5leHQ7CisgIGNoYXIgKmZpbGVuYW1lOworICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgRklMRSAqZjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0ICpwcmludF9maWxlczsKKworLyogVGhlIG51bWJlciBvZiBwcmVjZWRpbmcgY29udGV4dCBsaW5lcyB0byBzaG93IHdoZW4gd2Ugc3RhcnQKKyAgIGRpc3BsYXlpbmcgYSBmaWxlIGZvciB0aGUgZmlyc3QgdGltZS4gICovCisKKyNkZWZpbmUgU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUyAoNSkKKworLyogU2tpcCBhaGVhZCB0byBhIGdpdmVuIGxpbmUgaW4gYSBmaWxlLCBvcHRpb25hbGx5IHByaW50aW5nIGVhY2gKKyAgIGxpbmUuICAqLworCitzdGF0aWMgdm9pZAorc2tpcF90b19saW5lIFBBUkFNUyAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7CisKK3N0YXRpYyB2b2lkCitza2lwX3RvX2xpbmUgKHAsIGxpbmUsIHNob3cpCisgICAgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKnA7CisgICAgIHVuc2lnbmVkIGludCBsaW5lOworICAgICBib29sZWFuIHNob3c7Cit7CisgIHdoaWxlIChwLT5saW5lIDwgbGluZSkKKyAgICB7CisgICAgICBjaGFyIGJ1ZlsxMDBdOworCisgICAgICBpZiAoZmdldHMgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgcC0+ZikgPT0gTlVMTCkKKwl7CisJICBmY2xvc2UgKHAtPmYpOworCSAgcC0+ZiA9IE5VTEw7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChzaG93KQorCXByaW50ZiAoIiVzIiwgYnVmKTsKKworICAgICAgaWYgKHN0cmNociAoYnVmLCAnXG4nKSAhPSBOVUxMKQorCSsrcC0+bGluZTsKKyAgICB9Cit9ICAKKworLyogU2hvdyB0aGUgbGluZSBudW1iZXIsIG9yIHRoZSBzb3VyY2UgbGluZSwgaW4gYSBkaXNzYXNzZW1ibHkKKyAgIGxpc3RpbmcuICAqLworCitzdGF0aWMgdm9pZAorc2hvd19saW5lIChhYmZkLCBzZWN0aW9uLCBvZmYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgb2ZmOworeworICBDT05TVCBjaGFyICpmaWxlbmFtZTsKKyAgQ09OU1QgY2hhciAqZnVuY3Rpb25uYW1lOworICB1bnNpZ25lZCBpbnQgbGluZTsKKworICBpZiAoISB3aXRoX2xpbmVfbnVtYmVycyAmJiAhIHdpdGhfc291cmNlX2NvZGUpCisgICAgcmV0dXJuOworCisgIGlmICghIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltcywgb2ZmLCAmZmlsZW5hbWUsCisJCQkgICAgICAgJmZ1bmN0aW9ubmFtZSwgJmxpbmUpKQorICAgIHJldHVybjsKKworICBpZiAoZmlsZW5hbWUgIT0gTlVMTCAmJiAqZmlsZW5hbWUgPT0gJ1wwJykKKyAgICBmaWxlbmFtZSA9IE5VTEw7CisgIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTCAmJiAqZnVuY3Rpb25uYW1lID09ICdcMCcpCisgICAgZnVuY3Rpb25uYW1lID0gTlVMTDsKKworICBpZiAod2l0aF9saW5lX251bWJlcnMpCisgICAgeworICAgICAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMCisJICAmJiAocHJldl9mdW5jdGlvbm5hbWUgPT0gTlVMTAorCSAgICAgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBwcmV2X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCisJcHJpbnRmICgiJXMoKTpcbiIsIGZ1bmN0aW9ubmFtZSk7CisgICAgICBpZiAobGluZSA+IDAgJiYgbGluZSAhPSBwcmV2X2xpbmUpCisJcHJpbnRmICgiJXM6JXVcbiIsIGZpbGVuYW1lID09IE5VTEwgPyAiPz8/IiA6IGZpbGVuYW1lLCBsaW5lKTsKKyAgICB9CisKKyAgaWYgKHdpdGhfc291cmNlX2NvZGUKKyAgICAgICYmIGZpbGVuYW1lICE9IE5VTEwKKyAgICAgICYmIGxpbmUgPiAwKQorICAgIHsKKyAgICAgIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKipwcCwgKnA7CisKKyAgICAgIGZvciAocHAgPSAmcHJpbnRfZmlsZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKKwlpZiAoc3RyY21wICgoKnBwKS0+ZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKQorCSAgYnJlYWs7CisgICAgICBwID0gKnBwOworCisgICAgICBpZiAocCAhPSBOVUxMKQorCXsKKwkgIGlmIChwICE9IHByaW50X2ZpbGVzKQorCSAgICB7CisJICAgICAgaW50IGw7CisKKwkgICAgICAvKiBXZSBoYXZlIHJlZW5jb3VudGVyZWQgYSBmaWxlIG5hbWUgd2hpY2ggd2Ugc2F3CisJCSBlYXJsaWVyLiAgVGhpcyBpbXBsaWVzIHRoYXQgZWl0aGVyIHdlIGFyZSBkdW1waW5nIG91dAorCQkgY29kZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUsIG9yIHRoZSBzYW1lIGZpbGUgd2FzCisJCSBsaW5rZWQgaW4gbW9yZSB0aGFuIG9uY2UuICBUaGVyZSBhcmUgdHdvIGNvbW1vbiBjYXNlcworCQkgb2YgYW4gaW5jbHVkZWQgZmlsZTogaW5saW5lIGZ1bmN0aW9ucyBpbiBhIGhlYWRlcgorCQkgZmlsZSwgYW5kIGEgYmlzb24gb3IgZmxleCBza2VsZXRvbiBmaWxlLiAgSW4gdGhlCisJCSBmb3JtZXIgY2FzZSB3ZSB3YW50IHRvIGp1c3Qgc3RhcnQgcHJpbnRpbmcgKGJ1dCB3ZQorCQkgYmFjayB1cCBhIGZldyBsaW5lcyB0byBnaXZlIGNvbnRleHQpOyBpbiB0aGUgbGF0dGVyCisJCSBjYXNlIHdlIHdhbnQgdG8gY29udGludWUgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZi4gIEkKKwkJIGNhbid0IHRoaW5rIG9mIGEgZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggdGhlIGNhc2VzLAorCQkgc28gSSB1c2VkIGEgaGV1cmlzdGljIGJhc2VkIG9uIHRoZSBmaWxlIG5hbWUuICAqLworCSAgICAgIGlmIChzdHJjbXAgKHAtPmZpbGVuYW1lICsgc3RybGVuIChwLT5maWxlbmFtZSkgLSAyLCAiLmgiKSAhPSAwKQorCQlsID0gcC0+bGluZTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBsID0gbGluZSAtIFNIT1dfUFJFQ0VESU5HX0NPTlRFWFRfTElORVM7CisJCSAgaWYgKGwgPD0gMCkKKwkJICAgIGwgPSAxOworCQl9CisKKwkgICAgICBpZiAocC0+ZiA9PSBOVUxMKQorCQl7CisJCSAgcC0+ZiA9IGZvcGVuIChwLT5maWxlbmFtZSwgInIiKTsKKwkJICBwLT5saW5lID0gMDsKKwkJfQorCSAgICAgIGlmIChwLT5mICE9IE5VTEwpCisJCXNraXBfdG9fbGluZSAocCwgbCwgZmFsc2UpOworCisJICAgICAgaWYgKHByaW50X2ZpbGVzLT5mICE9IE5VTEwpCisJCXsKKwkJICBmY2xvc2UgKHByaW50X2ZpbGVzLT5mKTsKKwkJICBwcmludF9maWxlcy0+ZiA9IE5VTEw7CisJCX0KKwkgICAgfQorCisJICBpZiAocC0+ZiAhPSBOVUxMKQorCSAgICB7CisJICAgICAgc2tpcF90b19saW5lIChwLCBsaW5lLCB0cnVlKTsKKwkgICAgICAqcHAgPSBwLT5uZXh0OworCSAgICAgIHAtPm5leHQgPSBwcmludF9maWxlczsKKwkgICAgICBwcmludF9maWxlcyA9IHA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgRklMRSAqZjsKKworCSAgZiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKKwkgIGlmIChmICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpbnQgbDsKKworCSAgICAgIHAgPSAoKHN0cnVjdCBwcmludF9maWxlX2xpc3QgKikKKwkJICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KSkpOworCSAgICAgIHAtPmZpbGVuYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKKwkgICAgICBzdHJjcHkgKHAtPmZpbGVuYW1lLCBmaWxlbmFtZSk7CisJICAgICAgcC0+bGluZSA9IDA7CisJICAgICAgcC0+ZiA9IGY7CisKKwkgICAgICBpZiAocHJpbnRfZmlsZXMgIT0gTlVMTCAmJiBwcmludF9maWxlcy0+ZiAhPSBOVUxMKQorCQl7CisJCSAgZmNsb3NlIChwcmludF9maWxlcy0+Zik7CisJCSAgcHJpbnRfZmlsZXMtPmYgPSBOVUxMOworCQl9CisJICAgICAgcC0+bmV4dCA9IHByaW50X2ZpbGVzOworCSAgICAgIHByaW50X2ZpbGVzID0gcDsKKworCSAgICAgIGwgPSBsaW5lIC0gU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUzsKKwkgICAgICBpZiAobCA8PSAwKQorCQlsID0gMTsKKwkgICAgICBza2lwX3RvX2xpbmUgKHAsIGwsIGZhbHNlKTsKKwkgICAgICBpZiAocC0+ZiAhPSBOVUxMKQorCQlza2lwX3RvX2xpbmUgKHAsIGxpbmUsIHRydWUpOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKKyAgICAgICYmIChwcmV2X2Z1bmN0aW9ubmFtZSA9PSBOVUxMCisJICB8fCBzdHJjbXAgKGZ1bmN0aW9ubmFtZSwgcHJldl9mdW5jdGlvbm5hbWUpICE9IDApKQorICAgIHsKKyAgICAgIGlmIChwcmV2X2Z1bmN0aW9ubmFtZSAhPSBOVUxMKQorCWZyZWUgKHByZXZfZnVuY3Rpb25uYW1lKTsKKyAgICAgIHByZXZfZnVuY3Rpb25uYW1lID0geG1hbGxvYyAoc3RybGVuIChmdW5jdGlvbm5hbWUpICsgMSk7CisgICAgICBzdHJjcHkgKHByZXZfZnVuY3Rpb25uYW1lLCBmdW5jdGlvbm5hbWUpOworICAgIH0KKworICBpZiAobGluZSA+IDAgJiYgbGluZSAhPSBwcmV2X2xpbmUpCisgICAgcHJldl9saW5lID0gbGluZTsKK30KKworLyogUHNldWRvIEZJTEUgb2JqZWN0IGZvciBzdHJpbmdzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKmJ1ZmZlcjsKKyAgc2l6ZV90IHNpemU7CisgIGNoYXIgKmN1cnJlbnQ7Cit9IFNGSUxFOworCisvKiBzcHJpbnRmIHRvIGEgInN0cmVhbSIgKi8KKworc3RhdGljIGludAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworb2JqZHVtcF9zcHJpbnRmIChTRklMRSAqZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorb2JqZHVtcF9zcHJpbnRmICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCisgIFNGSUxFICpmOworICBjb25zdCBjaGFyICpmb3JtYXQ7CisjZW5kaWYKKyAgY2hhciAqYnVmOworICB2YV9saXN0IGFyZ3M7CisgIHNpemVfdCBuOworCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBmID0gdmFfYXJnIChhcmdzLCBTRklMRSAqKTsKKyAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOworI2VuZGlmCisKKyAgdmFzcHJpbnRmICgmYnVmLCBmb3JtYXQsIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiT3V0IG9mIHZpcnR1YWwgbWVtb3J5XG4iKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgbiA9IHN0cmxlbiAoYnVmKTsKKworICB3aGlsZSAoKGYtPmJ1ZmZlciArIGYtPnNpemUpIC0gZi0+Y3VycmVudCA8IG4gKyAxKQorICAgIHsKKyAgICAgIHNpemVfdCBjdXJyb2ZmOworCisgICAgICBjdXJyb2ZmID0gZi0+Y3VycmVudCAtIGYtPmJ1ZmZlcjsKKyAgICAgIGYtPnNpemUgKj0gMjsKKyAgICAgIGYtPmJ1ZmZlciA9IHhyZWFsbG9jIChmLT5idWZmZXIsIGYtPnNpemUpOworICAgICAgZi0+Y3VycmVudCA9IGYtPmJ1ZmZlciArIGN1cnJvZmY7CisgICAgfQorCisgIG1lbWNweSAoZi0+Y3VycmVudCwgYnVmLCBuKTsKKyAgZi0+Y3VycmVudCArPSBuOworICBmLT5jdXJyZW50WzBdID0gJ1wwJzsKKworICBmcmVlIChidWYpOworCisgIHJldHVybiBuOworfQorCisvKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB3ZSB3YW50IHRvIHNlZSBiZWZvcmUgd2Ugc3RhcnQgc2tpcHBpbmcgdGhlbS4KKyAgIFRoZSBudW1iZXIgaXMgYXJiaXRyYXJpbHkgY2hvc2VuLiAgKi8KKworI2RlZmluZSBTS0lQX1pFUk9FUyAoOCkKKworLyogVGhlIG51bWJlciBvZiB6ZXJvZXMgdG8gc2tpcCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIElmIHRoZQorICAgbnVtYmVyIG9mIHplcm9lcyBhdCB0aGUgZW5kIGlzIGJldHdlZW4gU0tJUF9aRVJPRVNfQVRfRU5EIGFuZAorICAgU0tJUF9aRVJPRVMsIHRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQuICBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbgorICAgU0tJUF9aRVJPRVNfQVRfRU5ELCB0aGV5IHdpbGwgYmUgc2tpcHBlZC4gIFRoaXMgaXMgYSBoZXVyaXN0aWMKKyAgIGF0dGVtcHQgdG8gYXZvaWQgZGlzYXNzZW1ibGluZyB6ZXJvZXMgaW5zZXJ0ZWQgYnkgc2VjdGlvbgorICAgYWxpZ25tZW50LiAgKi8KKworI2RlZmluZSBTS0lQX1pFUk9FU19BVF9FTkQgKDMpCisKKy8qIERpc2Fzc2VtYmxlIHNvbWUgZGF0YSBpbiBtZW1vcnkgYmV0d2VlbiBnaXZlbiB2YWx1ZXMuICAqLworCitzdGF0aWMgdm9pZAorZGlzYXNzZW1ibGVfYnl0ZXMgKGluZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgc3RhcnQsIHN0b3AsIHJlbHBwcCwKKwkJICAgcmVscHBlbmQpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVfZm47CisgICAgIGJvb2xlYW4gaW5zbnM7CisgICAgIGJmZF9ieXRlICpkYXRhOworICAgICBiZmRfdm1hIHN0YXJ0OworICAgICBiZmRfdm1hIHN0b3A7CisgICAgIGFyZWxlbnQgKioqcmVscHBwOworICAgICBhcmVsZW50ICoqcmVscHBlbmQ7Cit7CisgIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICphdXg7CisgIGFzZWN0aW9uICpzZWN0aW9uOworICBpbnQgYnl0ZXNfcGVyX2xpbmU7CisgIGJvb2xlYW4gZG9uZV9kb3Q7CisgIGludCBza2lwX2FkZHJfY2hhcnM7CisgIGJmZF92bWEgaTsKKworICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKKyAgc2VjdGlvbiA9IGF1eC0+c2VjOworCisgIGlmIChpbnNucykKKyAgICBieXRlc19wZXJfbGluZSA9IDQ7CisgIGVsc2UKKyAgICBieXRlc19wZXJfbGluZSA9IDE2OworCisgIC8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgY2hhcmFjdGVycyB0byBza2lwIGF0IHRoZSBzdGFydCBvZiBhbgorICAgICBhZGRyZXNzLCB0byBtYWtlIHRoZSBkaXNhc3NlbWJseSBsb29rIG5pY2VyLiAgV2UgZGlzY2FyZCBsZWFkaW5nCisgICAgIHplcm9lcyBpbiBjaHVua3Mgb2YgNCwgZW5zdXJpbmcgdGhhdCB0aGVyZSBpcyBhbHdheXMgYSBsZWFkaW5nCisgICAgIHplcm8gcmVtYWluaW5nLiAgKi8KKyAgc2tpcF9hZGRyX2NoYXJzID0gMDsKKyAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKKyAgICB7CisgICAgICBjaGFyIGJ1ZlszMF07CisgICAgICBjaGFyICpzOworCisgICAgICBzcHJpbnRmX3ZtYSAoYnVmLAorCQkgICBzZWN0aW9uLT52bWEgKyBiZmRfc2VjdGlvbl9zaXplIChzZWN0aW9uLT5vd25lciwgc2VjdGlvbikpOworICAgICAgcyA9IGJ1ZjsKKyAgICAgIHdoaWxlIChzWzBdID09ICcwJyAmJiBzWzFdID09ICcwJyAmJiBzWzJdID09ICcwJyAmJiBzWzNdID09ICcwJworCSAgICAgJiYgc1s0XSA9PSAnMCcpCisJeworCSAgc2tpcF9hZGRyX2NoYXJzICs9IDQ7CisJICBzICs9IDQ7CisJfQorICAgIH0KKworICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAwOworCisgIGRvbmVfZG90ID0gZmFsc2U7CisgIGkgPSBzdGFydDsKKyAgd2hpbGUgKGkgPCBzdG9wKQorICAgIHsKKyAgICAgIGJmZF92bWEgejsKKyAgICAgIGludCBieXRlcyA9IDA7CisgICAgICBib29sZWFuIG5lZWRfbmwgPSBmYWxzZTsKKworICAgICAgLyogSWYgd2Ugc2VlIG1vcmUgdGhhbiBTS0lQX1pFUk9FUyBieXRlcyBvZiB6ZXJvZXMsIHdlIGp1c3QKKyAgICAgICAgIHByaW50IGAuLi4nLiAgKi8KKyAgICAgIGZvciAoeiA9IGk7IHogPCBzdG9wOyB6KyspCisJaWYgKGRhdGFbel0gIT0gMCkKKwkgIGJyZWFrOworICAgICAgaWYgKCEgZGlzYXNzZW1ibGVfemVyb2VzCisJICAmJiAoaW5mby0+aW5zbl9pbmZvX3ZhbGlkID09IDAKKwkgICAgICB8fCBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPT0gMCkKKwkgICYmICh6IC0gaSA+PSBTS0lQX1pFUk9FUworCSAgICAgIHx8ICh6ID09IHN0b3AgJiYgeiAtIGkgPCBTS0lQX1pFUk9FU19BVF9FTkQpKSkKKwl7CisJICBwcmludGYgKCJcdC4uLlxuIik7CisKKwkgIC8qIElmIHRoZXJlIGFyZSBtb3JlIG5vbnplcm8gYnl0ZXMgdG8gZm9sbG93LCB3ZSBvbmx5IHNraXAKKyAgICAgICAgICAgICB6ZXJvZXMgaW4gbXVsdGlwbGVzIG9mIDQsIHRvIHRyeSB0byBhdm9pZCBydW5uaW5nIG92ZXIKKyAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaGFwcGVucyB0byBzdGFydCB3aXRoCisgICAgICAgICAgICAgemVyby4gICovCisJICBpZiAoeiAhPSBzdG9wKQorCSAgICB6ID0gaSArICgoeiAtIGkpICZ+IDMpOworCisJICBieXRlcyA9IHogLSBpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyIGJ1Zls1MF07CisJICBTRklMRSBzZmlsZTsKKwkgIGludCBicGMgPSAwOworCSAgaW50IHBiID0gMDsKKworCSAgZG9uZV9kb3QgPSBmYWxzZTsKKworCSAgaWYgKHdpdGhfbGluZV9udW1iZXJzIHx8IHdpdGhfc291cmNlX2NvZGUpCisJICAgIHNob3dfbGluZSAoYXV4LT5hYmZkLCBzZWN0aW9uLCBpKTsKKworCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKKwkgICAgeworCSAgICAgIGNoYXIgKnM7CisKKwkgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBzZWN0aW9uLT52bWEgKyBpKTsKKwkgICAgICBmb3IgKHMgPSBidWYgKyBza2lwX2FkZHJfY2hhcnM7ICpzID09ICcwJzsgcysrKQorCQkqcyA9ICcgJzsKKwkgICAgICBpZiAoKnMgPT0gJ1wwJykKKwkJKi0tcyA9ICcwJzsKKwkgICAgICBwcmludGYgKCIlczpcdCIsIGJ1ZiArIHNraXBfYWRkcl9jaGFycyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGF1eC0+cmVxdWlyZV9zZWMgPSB0cnVlOworCSAgICAgIG9iamR1bXBfcHJpbnRfYWRkcmVzcyAoc2VjdGlvbi0+dm1hICsgaSwgaW5mbyk7CisJICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IGZhbHNlOworCSAgICAgIHB1dGNoYXIgKCcgJyk7CisJICAgIH0KKworCSAgaWYgKGluc25zKQorCSAgICB7CisJICAgICAgc2ZpbGUuc2l6ZSA9IDEyMDsKKwkgICAgICBzZmlsZS5idWZmZXIgPSB4bWFsbG9jIChzZmlsZS5zaXplKTsKKwkgICAgICBzZmlsZS5jdXJyZW50ID0gc2ZpbGUuYnVmZmVyOworCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBvYmpkdW1wX3NwcmludGY7CisJICAgICAgaW5mby0+c3RyZWFtID0gKEZJTEUgKikgJnNmaWxlOworCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gMDsKKwkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAwOworCisJICAgICAgLyogRklYTUU6IFRoaXMgaXMgd3JvbmcuICBJdCB0ZXN0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgICAgICAgIGluIHRoZSBsYXN0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgb25lLiAgKi8KKwkgICAgICBpZiAoKnJlbHBwcCA8IHJlbHBwZW5kCisJCSAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA+PSBpCisJCSAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA8IGkgKyBieXRlcykKKwkJaW5mby0+ZmxhZ3MgPSBJTlNOX0hBU19SRUxPQzsKKwkgICAgICBlbHNlCisJCWluZm8tPmZsYWdzID0gMDsKKworCSAgICAgIGJ5dGVzID0gKCpkaXNhc3NlbWJsZV9mbikgKHNlY3Rpb24tPnZtYSArIGksIGluZm8pOworCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKSBmcHJpbnRmOworCSAgICAgIGluZm8tPnN0cmVhbSA9IHN0ZG91dDsKKwkgICAgICBpZiAoaW5mby0+Ynl0ZXNfcGVyX2xpbmUgIT0gMCkKKwkJYnl0ZXNfcGVyX2xpbmUgPSBpbmZvLT5ieXRlc19wZXJfbGluZTsKKwkgICAgICBpZiAoYnl0ZXMgPCAwKQorCQlicmVhazsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbG9uZyBqOworCisJICAgICAgYnl0ZXMgPSBieXRlc19wZXJfbGluZTsKKwkgICAgICBpZiAoaSArIGJ5dGVzID4gc3RvcCkKKwkJYnl0ZXMgPSBzdG9wIC0gaTsKKworCSAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgYnl0ZXM7ICsraikKKwkJeworCQkgIGlmIChpc3ByaW50IChkYXRhW2pdKSkKKwkJICAgIGJ1ZltqIC0gaV0gPSBkYXRhW2pdOworCQkgIGVsc2UKKwkJICAgIGJ1ZltqIC0gaV0gPSAnLic7CisJCX0KKwkgICAgICBidWZbaiAtIGldID0gJ1wwJzsKKwkgICAgfQorCisJICBpZiAocHJlZml4X2FkZHJlc3NlcworCSAgICAgID8gc2hvd19yYXdfaW5zbiA+IDAKKwkgICAgICA6IHNob3dfcmF3X2luc24gPj0gMCkKKwkgICAgeworCSAgICAgIGxvbmcgajsKKworCSAgICAgIC8qIElmICEgcHJlZml4X2FkZHJlc3NlcyBhbmQgISB3aWRlX291dHB1dCwgd2UgcHJpbnQKKyAgICAgICAgICAgICAgICAgYnl0ZXNfcGVyX2xpbmUgYnl0ZXMgcGVyIGxpbmUuICAqLworCSAgICAgIHBiID0gYnl0ZXM7CisJICAgICAgaWYgKHBiID4gYnl0ZXNfcGVyX2xpbmUgJiYgISBwcmVmaXhfYWRkcmVzc2VzICYmICEgd2lkZV9vdXRwdXQpCisJCXBiID0gYnl0ZXNfcGVyX2xpbmU7CisKKwkgICAgICBpZiAoaW5mby0+Ynl0ZXNfcGVyX2NodW5rKQorCQlicGMgPSBpbmZvLT5ieXRlc19wZXJfY2h1bms7CisJICAgICAgZWxzZQorCQlicGMgPSAxOworCisJICAgICAgZm9yIChqID0gaTsgaiA8IGkgKyBwYjsgaiArPSBicGMpCisJCXsKKwkJICBpbnQgazsKKwkJICBpZiAoYnBjID4gMSAmJiBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKKwkJICAgIHsKKwkJICAgICAgZm9yIChrID0gYnBjIC0gMTsgayA+PSAwOyBrLS0pCisJCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7CisJCSAgICAgIHB1dGNoYXIgKCcgJyk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCisJCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7CisJCSAgICAgIHB1dGNoYXIgKCcgJyk7CisJCSAgICB9CisJCX0KKworCSAgICAgIGZvciAoOyBwYiA8IGJ5dGVzX3Blcl9saW5lOyBwYiArPSBicGMpCisJCXsKKwkJICBpbnQgazsKKworCQkgIGZvciAoayA9IDA7IGsgPCBicGM7IGsrKykKKwkJICAgIHByaW50ZiAoIiAgIik7CisJCSAgcHV0Y2hhciAoJyAnKTsKKwkJfQorCisJICAgICAgLyogU2VwYXJhdGUgcmF3IGRhdGEgZnJvbSBpbnN0cnVjdGlvbiBieSBleHRyYSBzcGFjZS4gICovCisJICAgICAgaWYgKGluc25zKQorCQlwdXRjaGFyICgnXHQnKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIiAgICAiKTsKKwkgICAgfQorCisJICBpZiAoISBpbnNucykKKwkgICAgcHJpbnRmICgiJXMiLCBidWYpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgiJXMiLCBzZmlsZS5idWZmZXIpOworCSAgICAgIGZyZWUgKHNmaWxlLmJ1ZmZlcik7CisJICAgIH0KKworCSAgaWYgKHByZWZpeF9hZGRyZXNzZXMKKwkgICAgICA/IHNob3dfcmF3X2luc24gPiAwCisJICAgICAgOiBzaG93X3Jhd19pbnNuID49IDApCisJICAgIHsKKwkgICAgICB3aGlsZSAocGIgPCBieXRlcykKKwkJeworCQkgIGxvbmcgajsKKwkJICBjaGFyICpzOworCisJCSAgcHV0Y2hhciAoJ1xuJyk7CisJCSAgaiA9IGkgKyBwYjsKKworCQkgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIGopOworCQkgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCisJCSAgICAqcyA9ICcgJzsKKwkJICBpZiAoKnMgPT0gJ1wwJykKKwkJICAgICotLXMgPSAnMCc7CisJCSAgcHJpbnRmICgiJXM6XHQiLCBidWYgKyBza2lwX2FkZHJfY2hhcnMpOworCisJCSAgcGIgKz0gYnl0ZXNfcGVyX2xpbmU7CisJCSAgaWYgKHBiID4gYnl0ZXMpCisJCSAgICBwYiA9IGJ5dGVzOworCQkgIGZvciAoOyBqIDwgaSArIHBiOyBqICs9IGJwYykKKwkJICAgIHsKKwkJICAgICAgaW50IGs7CisKKwkJICAgICAgaWYgKGJwYyA+IDEgJiYgaW5mby0+ZGlzcGxheV9lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCisJCQl7CisJCQkgIGZvciAoayA9IGJwYyAtIDE7IGsgPj0gMDsgay0tKQorCQkJICAgIHByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKKwkJCSAgcHV0Y2hhciAoJyAnKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCisJCQkgICAgcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOworCQkJICBwdXRjaGFyICgnICcpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKCF3aWRlX291dHB1dCkKKwkgICAgcHV0Y2hhciAoJ1xuJyk7CisJICBlbHNlCisJICAgIG5lZWRfbmwgPSB0cnVlOworCX0KKworICAgICAgaWYgKGR1bXBfcmVsb2NfaW5mbworCSAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQorCXsKKwkgIHdoaWxlICgoKnJlbHBwcCkgPCByZWxwcGVuZAorCQkgJiYgKCgqKnJlbHBwcCktPmFkZHJlc3MgPj0gKGJmZF92bWEpIGkKKwkJICAgICAmJiAoKipyZWxwcHApLT5hZGRyZXNzIDwgKGJmZF92bWEpIGkgKyBieXRlcykpCisJICAgIHsKKwkgICAgICBhcmVsZW50ICpxOworCisJICAgICAgcSA9ICoqcmVscHBwOworCisJICAgICAgaWYgKHdpZGVfb3V0cHV0KQorCQlwdXRjaGFyICgnXHQnKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIlx0XHRcdCIpOworCisJICAgICAgb2JqZHVtcF9wcmludF92YWx1ZSAoc2VjdGlvbi0+dm1hICsgcS0+YWRkcmVzcywgaW5mbywgdHJ1ZSk7CisKKwkgICAgICBwcmludGYgKCI6ICVzXHQiLCBxLT5ob3d0by0+bmFtZSk7CisKKwkgICAgICBpZiAocS0+c3ltX3B0cl9wdHIgPT0gTlVMTCB8fCAqcS0+c3ltX3B0cl9wdHIgPT0gTlVMTCkKKwkJcHJpbnRmICgiKnVua25vd24qIik7CisJICAgICAgZWxzZQorCQl7CisJCSAgY29uc3QgY2hhciAqc3ltX25hbWU7CisKKwkJICBzeW1fbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0cik7CisJCSAgaWYgKHN5bV9uYW1lICE9IE5VTEwgJiYgKnN5bV9uYW1lICE9ICdcMCcpCisJCSAgICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGF1eC0+YWJmZCwgaW5mbywgKnEtPnN5bV9wdHJfcHRyKTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOworCisJCSAgICAgIHN5bV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKCpxLT5zeW1fcHRyX3B0cik7CisJCSAgICAgIHN5bV9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGF1eC0+YWJmZCwgc3ltX3NlYyk7CisJCSAgICAgIGlmIChzeW1fbmFtZSA9PSBOVUxMIHx8ICpzeW1fbmFtZSA9PSAnXDAnKQorCQkJc3ltX25hbWUgPSAiKnVua25vd24qIjsKKwkJICAgICAgcHJpbnRmICgiJXMiLCBzeW1fbmFtZSk7CisJCSAgICB9CisJCX0KKworCSAgICAgIGlmIChxLT5hZGRlbmQpCisJCXsKKwkJICBwcmludGYgKCIrMHgiKTsKKwkJICBvYmpkdW1wX3ByaW50X3ZhbHVlIChxLT5hZGRlbmQsIGluZm8sIHRydWUpOworCQl9CisKKwkgICAgICBwcmludGYgKCJcbiIpOworCSAgICAgIG5lZWRfbmwgPSBmYWxzZTsKKwkgICAgICArKygqcmVscHBwKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKG5lZWRfbmwpCisJcHJpbnRmICgiXG4iKTsKKworICAgICAgaSArPSBieXRlczsKKyAgICB9Cit9CisKKy8qIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitkaXNhc3NlbWJsZV9kYXRhIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGxvbmcgaTsKKyAgZGlzYXNzZW1ibGVyX2Z0eXBlIGRpc2Fzc2VtYmxlX2ZuOworICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaXNhc21faW5mbzsKKyAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gYXV4OworICBhc2VjdGlvbiAqc2VjdGlvbjsKKworICBwcmludF9maWxlcyA9IE5VTEw7CisgIHByZXZfZnVuY3Rpb25uYW1lID0gTlVMTDsKKyAgcHJldl9saW5lID0gLTE7CisKKyAgLyogV2UgbWFrZSBhIGNvcHkgb2Ygc3ltcyB0byBzb3J0LiAgV2UgZG9uJ3Qgd2FudCB0byBzb3J0IHN5bXMKKyAgICAgYmVjYXVzZSB0aGF0IHdpbGwgc2NyZXcgdXAgdGhlIHJlbG9jcy4gICovCisgIHNvcnRlZF9zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKKyAgbWVtY3B5IChzb3J0ZWRfc3ltcywgc3ltcywgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOworCisgIHNvcnRlZF9zeW1jb3VudCA9IHJlbW92ZV91c2VsZXNzX3N5bWJvbHMgKHNvcnRlZF9zeW1zLCBzeW1jb3VudCk7CisKKyAgLyogU29ydCB0aGUgc3ltYm9scyBpbnRvIHNlY3Rpb24gYW5kIHN5bWJvbCBvcmRlciAqLworICBxc29ydCAoc29ydGVkX3N5bXMsIHNvcnRlZF9zeW1jb3VudCwgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bWJvbHMpOworCisgIElOSVRfRElTQVNTRU1CTEVfSU5GTyhkaXNhc21faW5mbywgc3Rkb3V0LCBmcHJpbnRmKTsKKyAgZGlzYXNtX2luZm8uYXBwbGljYXRpb25fZGF0YSA9IChQVFIpICZhdXg7CisgIGF1eC5hYmZkID0gYWJmZDsKKyAgYXV4LnJlcXVpcmVfc2VjID0gZmFsc2U7CisgIGRpc2FzbV9pbmZvLnByaW50X2FkZHJlc3NfZnVuYyA9IG9iamR1bXBfcHJpbnRfYWRkcmVzczsKKyAgZGlzYXNtX2luZm8uc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyA9IG9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3M7CisKKyAgaWYgKG1hY2hpbmUgIT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmluZm8gPSBiZmRfc2Nhbl9hcmNoIChtYWNoaW5lKTsKKyAgICAgIGlmIChpbmZvID09IE5VTEwpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3QgdXNlIHN1cHBsaWVkIG1hY2hpbmUgJXNcbiIpLAorCQkgICBwcm9ncmFtX25hbWUsCisJCSAgIG1hY2hpbmUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgYWJmZC0+YXJjaF9pbmZvID0gaW5mbzsKKyAgICB9CisKKyAgaWYgKGVuZGlhbiAhPSBCRkRfRU5ESUFOX1VOS05PV04pCisgICAgeworICAgICAgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7CisKKyAgICAgIHh2ZWMgPSAoc3RydWN0IGJmZF90YXJnZXQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX3RhcmdldCkpOworICAgICAgbWVtY3B5ICh4dmVjLCBhYmZkLT54dmVjLCBzaXplb2YgKHN0cnVjdCBiZmRfdGFyZ2V0KSk7CisgICAgICB4dmVjLT5ieXRlb3JkZXIgPSBlbmRpYW47CisgICAgICBhYmZkLT54dmVjID0geHZlYzsKKyAgICB9CisKKyAgZGlzYXNzZW1ibGVfZm4gPSBkaXNhc3NlbWJsZXIgKGFiZmQpOworICBpZiAoIWRpc2Fzc2VtYmxlX2ZuKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IGRpc2Fzc2VtYmxlIGZvciBhcmNoaXRlY3R1cmUgJXNcbiIpLAorCSAgICAgICBwcm9ncmFtX25hbWUsCisJICAgICAgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLCAwKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGRpc2FzbV9pbmZvLmZsYXZvdXIgPSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpOworICBkaXNhc21faW5mby5hcmNoID0gYmZkX2dldF9hcmNoIChhYmZkKTsKKyAgZGlzYXNtX2luZm8ubWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCk7CisgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCisgICAgZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9CSUc7CisgIGVsc2UgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSkKKyAgICBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKKyAgZWxzZQorICAgIC8qID8/PyBBYm9ydGluZyBoZXJlIHNlZW1zIHRvbyBkcmFzdGljLiAgV2UgY291bGQgZGVmYXVsdCB0byBiaWcgb3IgbGl0dGxlCisgICAgICAgaW5zdGVhZC4gICovCisgICAgZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOworCisgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOworICAgICAgIHNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEw7CisgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCisgICAgeworICAgICAgYmZkX2J5dGUgKmRhdGEgPSBOVUxMOworICAgICAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7CisgICAgICBhcmVsZW50ICoqcmVsYnVmID0gTlVMTDsKKyAgICAgIGFyZWxlbnQgKipyZWxwcCA9IE5VTEw7CisgICAgICBhcmVsZW50ICoqcmVscHBlbmQgPSBOVUxMOworICAgICAgbG9uZyBzdG9wOworICAgICAgYXN5bWJvbCAqc3ltID0gTlVMTDsKKyAgICAgIGxvbmcgcGxhY2UgPSAwOworCisgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDAKKwkgIHx8ICghIGRpc2Fzc2VtYmxlX2FsbAorCSAgICAgICYmIG9ubHkgPT0gTlVMTAorCSAgICAgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKSkKKwljb250aW51ZTsKKyAgICAgIGlmIChvbmx5ICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSAhPSAwKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoZHVtcF9yZWxvY19pbmZvCisJICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCisJeworCSAgbG9uZyByZWxzaXplOworCisJICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7CisJICBpZiAocmVsc2l6ZSA8IDApCisJICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisJICBpZiAocmVsc2l6ZSA+IDApCisJICAgIHsKKwkgICAgICBsb25nIHJlbGNvdW50OworCisJICAgICAgcmVsYnVmID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOworCSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVsYnVmLCBzeW1zKTsKKwkgICAgICBpZiAocmVsY291bnQgPCAwKQorCQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworCSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jcyBieSBhZGRyZXNzLiAgKi8KKwkgICAgICBxc29ydCAocmVsYnVmLCByZWxjb3VudCwgc2l6ZW9mIChhcmVsZW50ICopLCBjb21wYXJlX3JlbG9jcyk7CisKKwkgICAgICByZWxwcCA9IHJlbGJ1ZjsKKwkgICAgICByZWxwcGVuZCA9IHJlbHBwICsgcmVsY291bnQ7CisKKwkgICAgICAvKiBTa2lwIG92ZXIgdGhlIHJlbG9jcyBiZWxvbmdpbmcgdG8gYWRkcmVzc2VzIGJlbG93IHRoZQorCQkgc3RhcnQgYWRkcmVzcy4gICovCisJICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xKQorCQl7CisJCSAgd2hpbGUgKHJlbHBwIDwgcmVscHBlbmQKKwkJCSAmJiAoKnJlbHBwKS0+YWRkcmVzcyA8IHN0YXJ0X2FkZHJlc3MpCisJCSAgICArK3JlbHBwOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIHByaW50ZiAoXygiRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAlczpcbiIpLCBzZWN0aW9uLT5uYW1lKTsKKworICAgICAgZGF0YXNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOworICAgICAgaWYgKGRhdGFzaXplID09IDApCisJY29udGludWU7CisKKyAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoKHNpemVfdCkgZGF0YXNpemUpOworCisgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGRhdGEsIDAsIGRhdGFzaXplKTsKKworICAgICAgYXV4LnNlYyA9IHNlY3Rpb247CisgICAgICBkaXNhc21faW5mby5idWZmZXIgPSBkYXRhOworICAgICAgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSA9IHNlY3Rpb24tPnZtYTsKKyAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGggPSBkYXRhc2l6ZTsKKyAgICAgIGlmIChzdGFydF9hZGRyZXNzID09IChiZmRfdm1hKSAtMQorCSAgfHwgc3RhcnRfYWRkcmVzcyA8IGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEpCisJaSA9IDA7CisgICAgICBlbHNlCisJaSA9IHN0YXJ0X2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOworICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCisJc3RvcCA9IGRhdGFzaXplOworICAgICAgZWxzZQorCXsKKwkgIGlmIChzdG9wX2FkZHJlc3MgPCBkaXNhc21faW5mby5idWZmZXJfdm1hKQorCSAgICBzdG9wID0gMDsKKwkgIGVsc2UKKwkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWE7CisJICBpZiAoc3RvcCA+IGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGgpCisJICAgIHN0b3AgPSBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoOworCX0KKworICAgICAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnZtYSArIGksCisJCQkJICAgICB0cnVlLCAmcGxhY2UpOworCisgICAgICB3aGlsZSAoaSA8IHN0b3ApCisJeworCSAgYXN5bWJvbCAqbmV4dHN5bTsKKwkgIGxvbmcgbmV4dHN0b3A7CisJICBib29sZWFuIGluc25zOworCSAgCisJICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPD0gc2VjdGlvbi0+dm1hICsgaSkKKwkgICAgeworCSAgICAgIGludCB4OworCisJICAgICAgZm9yICh4ID0gcGxhY2U7CisJCSAgICh4IDwgc29ydGVkX3N5bWNvdW50CisJCSAgICAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbeF0pIDw9IHNlY3Rpb24tPnZtYSArIGkpOworCQkgICArK3gpCisJCWNvbnRpbnVlOworCSAgICAgIGRpc2FzbV9pbmZvLnN5bWJvbHMgPSAmIHNvcnRlZF9zeW1zW3BsYWNlXTsKKwkgICAgICBkaXNhc21faW5mby5udW1fc3ltYm9scyA9IHggLSBwbGFjZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBkaXNhc21faW5mby5zeW1ib2xzID0gTlVMTDsKKworCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKKwkgICAgeworCSAgICAgIHByaW50ZiAoIlxuIik7CisJICAgICAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWN0aW9uLCBzeW0sCisJCQkJCSAgIHNlY3Rpb24tPnZtYSArIGksCisJCQkJCSAgICZkaXNhc21faW5mbywKKwkJCQkJICAgZmFsc2UpOworCSAgICAgIHByaW50ZiAoIjpcbiIpOworCSAgICB9CisJICAKKwkgIGlmIChzeW0gIT0gTlVMTCAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkpCisJICAgIG5leHRzeW0gPSBzeW07CisJICBlbHNlIGlmIChzeW0gPT0gTlVMTCkKKwkgICAgbmV4dHN5bSA9IE5VTEw7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB3aGlsZSAocGxhY2UgPCBzb3J0ZWRfc3ltY291bnQKKwkJICAgICAvKiA/Pz8gV2h5IHRoZSB0ZXN0IGZvciAhPSBzZWN0aW9uPyAgKi8KKwkJICAgICAmJiAoc29ydGVkX3N5bXNbcGxhY2VdLT5zZWN0aW9uICE9IHNlY3Rpb24KKwkJCSB8fCAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3BsYWNlXSkKKwkJCSAgICAgPD0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKSkKKwkJKytwbGFjZTsKKwkgICAgICBpZiAocGxhY2UgPj0gc29ydGVkX3N5bWNvdW50KQorCQluZXh0c3ltID0gTlVMTDsKKwkgICAgICBlbHNlCisJCW5leHRzeW0gPSBzb3J0ZWRfc3ltc1twbGFjZV07CisJICAgIH0KKwkgIAorCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgaSkKKwkgICAgeworCSAgICAgIG5leHRzdG9wID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgLSBzZWN0aW9uLT52bWE7CisJICAgICAgaWYgKG5leHRzdG9wID4gc3RvcCkKKwkJbmV4dHN0b3AgPSBzdG9wOworCSAgICB9CisJICBlbHNlIGlmIChuZXh0c3ltID09IE5VTEwpCisJICAgIG5leHRzdG9wID0gc3RvcDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5leHRzdG9wID0gYmZkX2FzeW1ib2xfdmFsdWUgKG5leHRzeW0pIC0gc2VjdGlvbi0+dm1hOworCSAgICAgIGlmIChuZXh0c3RvcCA+IHN0b3ApCisJCW5leHRzdG9wID0gc3RvcDsKKwkgICAgfQorCSAgCisJICAvKiBJZiBhIHN5bWJvbCBpcyBleHBsaWNpdGx5IG1hcmtlZCBhcyBiZWluZyBhbiBvYmplY3QKKwkgICAgIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24sIGp1c3QgZHVtcCB0aGUgYnl0ZXMgd2l0aG91dAorCSAgICAgZGlzYXNzZW1ibGluZyB0aGVtLiAgKi8KKwkgIGlmIChkaXNhc3NlbWJsZV9hbGwKKwkgICAgICB8fCBzeW0gPT0gTlVMTAorCSAgICAgIHx8IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgaQorCSAgICAgIHx8ICgoc3ltLT5mbGFncyAmIEJTRl9PQkpFQ1QpID09IDAKKwkJICAmJiAoc3Ryc3RyIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiZ251X2NvbXBpbGVkIikKKwkJICAgICAgPT0gTlVMTCkKKwkJICAmJiAoc3Ryc3RyIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiZ2NjMl9jb21waWxlZCIpCisJCSAgICAgID09IE5VTEwpKQorCSAgICAgIHx8IChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQorCSAgICBpbnNucyA9IHRydWU7CisJICBlbHNlCisJICAgIGluc25zID0gZmFsc2U7CisJICAKKwkgIGRpc2Fzc2VtYmxlX2J5dGVzICgmZGlzYXNtX2luZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgaSwKKwkJCSAgICAgbmV4dHN0b3AsICZyZWxwcCwgcmVscHBlbmQpOworCSAgCisJICBpID0gbmV4dHN0b3A7CisJICBzeW0gPSBuZXh0c3ltOworCX0KKyAgICAgIAorICAgICAgZnJlZSAoZGF0YSk7CisgICAgICBpZiAocmVsYnVmICE9IE5VTEwpCisJZnJlZSAocmVsYnVmKTsKKyAgICB9CisgIGZyZWUgKHNvcnRlZF9zeW1zKTsKK30KKwwKKworLyogRGVmaW5lIGEgdGFibGUgb2Ygc3RhYiB2YWx1ZXMgYW5kIHByaW50LXN0cmluZ3MuICBXZSB3aXNoIHRoZSBpbml0aWFsaXplcgorICAgY291bGQgYmUgYSBkaXJlY3QtbWFwcGVkIHRhYmxlLCBidXQgaW5zdGVhZCB3ZSBidWlsZCBvbmUgdGhlIGZpcnN0CisgICB0aW1lIHdlIG5lZWQgaXQuICAqLworCitzdGF0aWMgdm9pZCBkdW1wX3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpzdGFic2VjdF9uYW1lLAorCQkJCQljaGFyICpzdHJzZWN0X25hbWUpKTsKKworLyogRHVtcCB0aGUgc3RhYnMgc2VjdGlvbnMgZnJvbSBhbiBvYmplY3QgZmlsZSB0aGF0IGhhcyBhIHNlY3Rpb24gdGhhdAorICAgdXNlcyBTdW4gc3RhYnMgZW5jb2RpbmcuICAqLworCitzdGF0aWMgdm9pZAorZHVtcF9zdGFicyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYiIsICIuc3RhYnN0ciIpOworICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYi5leGNsIiwgIi5zdGFiLmV4Y2xzdHIiKTsKKyAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIuaW5kZXgiLCAiLnN0YWIuaW5kZXhzdHIiKTsKKyAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiJEdEQl9TWU1CT0xTJCIsICIkR0RCX1NUUklOR1MkIik7Cit9CisKK3N0YXRpYyBiZmRfYnl0ZSAqc3RhYnM7CitzdGF0aWMgYmZkX3NpemVfdHlwZSBzdGFiX3NpemU7CisKK3N0YXRpYyBjaGFyICpzdHJ0YWI7CitzdGF0aWMgYmZkX3NpemVfdHlwZSBzdGFic3RyX3NpemU7CisKKy8qIFJlYWQgQUJGRCdzIHN0YWJzIHNlY3Rpb24gU1RBQlNFQ1RfTkFNRSBpbnRvIGBzdGFicycKKyAgIGFuZCBzdHJpbmcgdGFibGUgc2VjdGlvbiBTVFJTRUNUX05BTUUgaW50byBgc3RydGFiJy4KKyAgIElmIHRoZSBzZWN0aW9uIGV4aXN0cyBhbmQgd2FzIHJlYWQsIGFsbG9jYXRlIHRoZSBzcGFjZSBhbmQgcmV0dXJuIHRydWUuCisgICBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3JlYWRfc2VjdGlvbl9zdGFicyAoYWJmZCwgc3RhYnNlY3RfbmFtZSwgc3Ryc2VjdF9uYW1lKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNvbnN0IGNoYXIgKnN0YWJzZWN0X25hbWU7CisgICAgIGNvbnN0IGNoYXIgKnN0cnNlY3RfbmFtZTsKK3sKKyAgYXNlY3Rpb24gKnN0YWJzZWN0LCAqc3RhYnN0cnNlY3Q7CisKKyAgc3RhYnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3RhYnNlY3RfbmFtZSk7CisgIGlmICgwID09IHN0YWJzZWN0KQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiTm8gJXMgc2VjdGlvbiBwcmVzZW50XG5cbiIpLCBzdGFic2VjdF9uYW1lKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgc3RhYnN0cnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3Ryc2VjdF9uYW1lKTsKKyAgaWYgKDAgPT0gc3RhYnN0cnNlY3QpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXMgaGFzIG5vICVzIHNlY3Rpb25cbiIpLCBwcm9ncmFtX25hbWUsCisJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJzZWN0X25hbWUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAKKyAgc3RhYl9zaXplICAgID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3RhYnNlY3QpOworICBzdGFic3RyX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdGFic3Ryc2VjdCk7CisKKyAgc3RhYnMgID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJfc2l6ZSk7CisgIHN0cnRhYiA9IChjaGFyICopIHhtYWxsb2MgKHN0YWJzdHJfc2l6ZSk7CisgIAorICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzZWN0LCAoUFRSKSBzdGFicywgMCwgc3RhYl9zaXplKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIiksCisJICAgICAgIHByb2dyYW1fbmFtZSwgc3RhYnNlY3RfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCisJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICAgIGZyZWUgKHN0YWJzKTsKKyAgICAgIGZyZWUgKHN0cnRhYik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnN0cnNlY3QsIChQVFIpIHN0cnRhYiwgMCwKKwkJCQkgIHN0YWJzdHJfc2l6ZSkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIpLAorCSAgICAgICBwcm9ncmFtX25hbWUsIHN0cnNlY3RfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCisJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICAgIGZyZWUgKHN0YWJzKTsKKyAgICAgIGZyZWUgKHN0cnRhYik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFicyBlbnRyaWVzIHVzZSBhIDEyIGJ5dGUgZm9ybWF0OgorICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4CisgICAgIDEgYnl0ZSBzdGFiIHR5cGUKKyAgICAgMSBieXRlIHN0YWIgb3RoZXIgZmllbGQKKyAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAorICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQorICAgRklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSBmb3IgYSA2NCBiaXQgb2JqZWN0IGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RSRFhPRkYgKDApCisjZGVmaW5lIFRZUEVPRkYgKDQpCisjZGVmaW5lIE9USEVST0ZGICg1KQorI2RlZmluZSBERVNDT0ZGICg2KQorI2RlZmluZSBWQUxPRkYgKDgpCisjZGVmaW5lIFNUQUJTSVpFICgxMikKKworLyogUHJpbnQgQUJGRCdzIHN0YWJzIHNlY3Rpb24gU1RBQlNFQ1RfTkFNRSAoaW4gYHN0YWJzJyksCisgICB1c2luZyBzdHJpbmcgdGFibGUgc2VjdGlvbiBTVFJTRUNUX05BTUUgKGluIGBzdHJ0YWInKS4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzdGFic2VjdF9uYW1lLCBzdHJzZWN0X25hbWUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqc3RhYnNlY3RfbmFtZTsKKyAgICAgY29uc3QgY2hhciAqc3Ryc2VjdF9uYW1lOworeworICBpbnQgaTsKKyAgdW5zaWduZWQgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMCwgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPSAwOworICBiZmRfYnl0ZSAqc3RhYnAsICpzdGFic19lbmQ7CisKKyAgc3RhYnAgPSBzdGFiczsKKyAgc3RhYnNfZW5kID0gc3RhYnAgKyBzdGFiX3NpemU7CisKKyAgcHJpbnRmIChfKCJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7CisgIHByaW50ZiAoIlN5bW51bSBuX3R5cGUgbl9vdGhyIG5fZGVzYyBuX3ZhbHVlICBuX3N0cnggU3RyaW5nXG4iKTsKKworICAvKiBMb29wIHRocm91Z2ggYWxsIHN5bWJvbHMgYW5kIHByaW50IHRoZW0uCisKKyAgICAgV2Ugc3RhcnQgdGhlIGluZGV4IGF0IC0xIGJlY2F1c2UgdGhlcmUgaXMgYSBkdW1teSBzeW1ib2wgb24KKyAgICAgdGhlIGZyb250IG9mIHN0YWJzLWluLXtjb2ZmLGVsZn0gc2VjdGlvbnMgdGhhdCBzdXBwbGllcyBzaXplcy4gICovCisKKyAgZm9yIChpID0gLTE7IHN0YWJwIDwgc3RhYnNfZW5kOyBzdGFicCArPSBTVEFCU0laRSwgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICB1bnNpZ25lZCBsb25nIHN0cng7CisgICAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIG90aGVyOworICAgICAgdW5zaWduZWQgc2hvcnQgZGVzYzsKKyAgICAgIGJmZF92bWEgdmFsdWU7CisKKyAgICAgIHN0cnggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgU1RSRFhPRkYpOworICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBzdGFicCArIFRZUEVPRkYpOworICAgICAgb3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBPVEhFUk9GRik7CisgICAgICBkZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzdGFicCArIERFU0NPRkYpOworICAgICAgdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgVkFMT0ZGKTsKKworICAgICAgcHJpbnRmICgiXG4lLTZkICIsIGkpOworICAgICAgLyogRWl0aGVyIHByaW50IHRoZSBzdGFiIG5hbWUsIG9yLCBpZiB1bm5hbWVkLCBwcmludCBpdHMgbnVtYmVyCisJIGFnYWluIChtYWtlcyBjb25zaXN0ZW50IGZvcm1hdHRpbmcgZm9yIHRvb2xzIGxpa2UgYXdrKS4gKi8KKyAgICAgIG5hbWUgPSBiZmRfZ2V0X3N0YWJfbmFtZSAodHlwZSk7CisgICAgICBpZiAobmFtZSAhPSBOVUxMKQorCXByaW50ZiAoIiUtNnMiLCBuYW1lKTsKKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTl9VTkRGKQorCXByaW50ZiAoIkhkclN5bSIpOworICAgICAgZWxzZQorCXByaW50ZiAoIiUtNmQiLCB0eXBlKTsKKyAgICAgIHByaW50ZiAoIiAlLTZkICUtNmQgIiwgb3RoZXIsIGRlc2MpOworICAgICAgcHJpbnRmX3ZtYSAodmFsdWUpOworICAgICAgcHJpbnRmICgiICUtNmx1Iiwgc3RyeCk7CisKKyAgICAgIC8qIFN5bWJvbHMgd2l0aCB0eXBlID09IDAgKE5fVU5ERikgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZQorCSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZS4gIFdlIHVzZSB0aGF0IGluZm8KKwkgdG8ga25vdyBob3cgdG8gcmVsb2NhdGUgdGhlICpuZXh0KiBmaWxlJ3Mgc3RyaW5nIHRhYmxlIGluZGljZXMuICAqLworCisgICAgICBpZiAodHlwZSA9PSBOX1VOREYpCisJeworCSAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7CisJICBuZXh0X2ZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCArPSB2YWx1ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVXNpbmcgdGhlIChwb3NzaWJseSB1cGRhdGVkKSBzdHJpbmcgdGFibGUgb2Zmc2V0LCBwcmludCB0aGUKKwkgICAgIHN0cmluZyAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuICAqLworCisJICBpZiAoKHN0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQpIDwgc3RhYnN0cl9zaXplKQorCSAgICBwcmludGYgKCIgJXMiLCAmc3RydGFiW3N0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXRdKTsKKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiICoiKTsKKwl9CisgICAgfQorICBwcmludGYgKCJcblxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpzdGFic2VjdF9uYW1lOworICAgICBjaGFyICpzdHJzZWN0X25hbWU7Cit7CisgIGFzZWN0aW9uICpzOworCisgIC8qIENoZWNrIGZvciBzZWN0aW9uIG5hbWVzIGZvciB3aGljaCBzdGFic2VjdF9uYW1lIGlzIGEgcHJlZml4LCB0bworICAgICBoYW5kbGUgLnN0YWIwLCBldGMuICAqLworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsKKyAgICAgICBzICE9IE5VTEw7CisgICAgICAgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgaW50IGxlbjsKKworICAgICAgbGVuID0gc3RybGVuIChzdGFic2VjdF9uYW1lKTsKKworICAgICAgLyogSWYgdGhlIHByZWZpeCBtYXRjaGVzLCBhbmQgdGhlIGZpbGVzIHNlY3Rpb24gbmFtZSBlbmRzIHdpdGggYQorCSBudWwgb3IgYSBkaWdpdCwgdGhlbiB3ZSBtYXRjaC4gIEkuZS4sIHdlIHdhbnQgZWl0aGVyIGFuIGV4YWN0CisJIG1hdGNoIG9yIGEgc2VjdGlvbiBmb2xsb3dlZCBieSBhIG51bWJlci4gICovCisgICAgICBpZiAoc3RybmNtcCAoc3RhYnNlY3RfbmFtZSwgcy0+bmFtZSwgbGVuKSA9PSAwCisJICAmJiAocy0+bmFtZVtsZW5dID09ICdcMDAwJworCSAgICAgIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lW2xlbl0pKSkKKwl7CisJICBpZiAocmVhZF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzLT5uYW1lLCBzdHJzZWN0X25hbWUpKQorCSAgICB7CisJICAgICAgcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKTsKKwkgICAgICBmcmVlIChzdGFicyk7CisJICAgICAgZnJlZSAoc3RydGFiKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisMCitzdGF0aWMgdm9pZAorZHVtcF9iZmRfaGVhZGVyIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgKmNvbW1hID0gIiI7CisKKyAgcHJpbnRmIChfKCJhcmNoaXRlY3R1cmU6ICVzLCAiKSwKKwkgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLAorCQkJCSAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpKTsKKyAgcHJpbnRmIChfKCJmbGFncyAweCUwOHg6XG4iKSwgYWJmZC0+ZmxhZ3MpOworCisjZGVmaW5lIFBGKHgsIHkpICAgIGlmIChhYmZkLT5mbGFncyAmIHgpIHtwcmludGYoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hPSIsICI7fQorICBQRiAoSEFTX1JFTE9DLCAiSEFTX1JFTE9DIik7CisgIFBGIChFWEVDX1AsICJFWEVDX1AiKTsKKyAgUEYgKEhBU19MSU5FTk8sICJIQVNfTElORU5PIik7CisgIFBGIChIQVNfREVCVUcsICJIQVNfREVCVUciKTsKKyAgUEYgKEhBU19TWU1TLCAiSEFTX1NZTVMiKTsKKyAgUEYgKEhBU19MT0NBTFMsICJIQVNfTE9DQUxTIik7CisgIFBGIChEWU5BTUlDLCAiRFlOQU1JQyIpOworICBQRiAoV1BfVEVYVCwgIldQX1RFWFQiKTsKKyAgUEYgKERfUEFHRUQsICJEX1BBR0VEIik7CisgIFBGIChCRkRfSVNfUkVMQVhBQkxFLCAiQkZEX0lTX1JFTEFYQUJMRSIpOworICBwcmludGYgKF8oIlxuc3RhcnQgYWRkcmVzcyAweCIpKTsKKyAgcHJpbnRmX3ZtYSAoYWJmZC0+c3RhcnRfYWRkcmVzcyk7CisgIHByaW50ZiAoIlxuIik7Cit9CisMCitzdGF0aWMgdm9pZAorZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpCitiZmQgKmFiZmQ7Cit7CisgIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorZGlzcGxheV9iZmQgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY2hhciAqKm1hdGNoaW5nOworCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQorICAgIHsKKyAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKKwl7CisJICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKKwkgIGZyZWUgKG1hdGNoaW5nKTsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIElmIHdlIGFyZSBhZGp1c3Rpbmcgc2VjdGlvbiBWTUEncywgY2hhbmdlIHRoZW0gYWxsIG5vdy4gIENoYW5naW5nCisgICAgIHRoZSBCRkQgaW5mb3JtYXRpb24gaXMgYSBoYWNrLiAgSG93ZXZlciwgd2UgbXVzdCBkbyBpdCwgb3IKKyAgICAgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIHdpbGwgbm90IGRvIHRoZSByaWdodCB0aGluZy4gICovCisgIGlmIChhZGp1c3Rfc2VjdGlvbl92bWEgIT0gMCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKworICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJeworCSAgcy0+dm1hICs9IGFkanVzdF9zZWN0aW9uX3ZtYTsKKwkgIHMtPmxtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7CisJfQorICAgIH0KKworICBwcmludGYgKF8oIlxuJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCSAgYWJmZC0+eHZlYy0+bmFtZSk7CisgIGlmIChkdW1wX2FyX2hkcnMpCisgICAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdHJ1ZSk7CisgIGlmIChkdW1wX2ZpbGVfaGVhZGVyKQorICAgIGR1bXBfYmZkX2hlYWRlciAoYWJmZCk7CisgIGlmIChkdW1wX3ByaXZhdGVfaGVhZGVycykKKyAgICBkdW1wX2JmZF9wcml2YXRlX2hlYWRlciAoYWJmZCk7CisgIHB1dGNoYXIgKCdcbicpOworICBpZiAoZHVtcF9zZWN0aW9uX2hlYWRlcnMpCisgICAgZHVtcF9oZWFkZXJzIChhYmZkKTsKKyAgaWYgKGR1bXBfc3ltdGFiIHx8IGR1bXBfcmVsb2NfaW5mbyB8fCBkaXNhc3NlbWJsZSB8fCBkdW1wX2RlYnVnZ2luZykKKyAgICB7CisgICAgICBzeW1zID0gc2x1cnBfc3ltdGFiIChhYmZkKTsKKyAgICB9CisgIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiIHx8IGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQorICAgIHsKKyAgICAgIGR5bnN5bXMgPSBzbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCk7CisgICAgfQorICBpZiAoZHVtcF9zeW10YWIpCisgICAgZHVtcF9zeW1ib2xzIChhYmZkLCBmYWxzZSk7CisgIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiKQorICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgdHJ1ZSk7CisgIGlmIChkdW1wX3N0YWJfc2VjdGlvbl9pbmZvKQorICAgIGR1bXBfc3RhYnMgKGFiZmQpOworICBpZiAoZHVtcF9yZWxvY19pbmZvICYmICEgZGlzYXNzZW1ibGUpCisgICAgZHVtcF9yZWxvY3MgKGFiZmQpOworICBpZiAoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pCisgICAgZHVtcF9keW5hbWljX3JlbG9jcyAoYWJmZCk7CisgIGlmIChkdW1wX3NlY3Rpb25fY29udGVudHMpCisgICAgZHVtcF9kYXRhIChhYmZkKTsKKyAgaWYgKGRpc2Fzc2VtYmxlKQorICAgIGRpc2Fzc2VtYmxlX2RhdGEgKGFiZmQpOworICBpZiAoZHVtcF9kZWJ1Z2dpbmcpCisgICAgeworICAgICAgUFRSIGRoYW5kbGU7CisKKyAgICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCk7CisgICAgICBpZiAoZGhhbmRsZSAhPSBOVUxMKQorCXsKKwkgIGlmICghIHByaW50X2RlYnVnZ2luZ19pbmZvIChzdGRvdXQsIGRoYW5kbGUpKQorCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iKSwKKwkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisJfQorICAgIH0KKyAgaWYgKHN5bXMpCisgICAgeworICAgICAgZnJlZSAoc3ltcyk7CisgICAgICBzeW1zID0gTlVMTDsKKyAgICB9CisgIGlmIChkeW5zeW1zKQorICAgIHsKKyAgICAgIGZyZWUgKGR5bnN5bXMpOworICAgICAgZHluc3ltcyA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGlzcGxheV9maWxlIChmaWxlbmFtZSwgdGFyZ2V0KQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgY2hhciAqdGFyZ2V0OworeworICBiZmQgKmZpbGUsICphcmZpbGUgPSAoYmZkICopIE5VTEw7CisKKyAgZmlsZSA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7CisgIGlmIChmaWxlID09IE5VTEwpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKKyAgICB7CisgICAgICBiZmQgKmxhc3RfYXJmaWxlID0gTlVMTDsKKworICAgICAgcHJpbnRmIChfKCJJbiBhcmNoaXZlICVzOlxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKKyAgICAgIGZvciAoOzspCisJeworCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKKworCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKKwkgIGlmIChhcmZpbGUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQorCQl7CisJCSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKKworCSAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCisJICAgIGJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOworCSAgbGFzdF9hcmZpbGUgPSBhcmZpbGU7CisJfQorCisgICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKKwliZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKKyAgICB9CisgIGVsc2UKKyAgICBkaXNwbGF5X2JmZCAoZmlsZSk7CisKKyAgYmZkX2Nsb3NlIChmaWxlKTsKK30KKwwKKy8qIEFjdHVhbGx5IGRpc3BsYXkgdGhlIHZhcmlvdXMgcmVxdWVzdGVkIHJlZ2lvbnMgKi8KKworc3RhdGljIHZvaWQKK2R1bXBfZGF0YSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgYmZkX2J5dGUgKmRhdGEgPSAwOworICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKKyAgYmZkX3NpemVfdHlwZSBpOworICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOworCisgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPQorICAgICAgIHNlY3Rpb24tPm5leHQpCisgICAgeworICAgICAgaW50IG9uYWxpbmUgPSAxNjsKKworICAgICAgaWYgKG9ubHkgPT0gKGNoYXIgKikgTlVMTCB8fAorCSAgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSA9PSAwKQorCXsKKwkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCisJICAgIHsKKwkgICAgICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iKSwgc2VjdGlvbi0+bmFtZSk7CisKKwkgICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKKwkJY29udGludWU7CisJICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7CisJICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKKworCisJICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7CisKKwkgICAgICBpZiAoc3RhcnRfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEKKwkJICB8fCBzdGFydF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQorCQlzdGFydCA9IDA7CisJICAgICAgZWxzZQorCQlzdGFydCA9IHN0YXJ0X2FkZHJlc3MgLSBzZWN0aW9uLT52bWE7CisJICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCisJCXN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoc3RvcF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQorCQkgICAgc3RvcCA9IDA7CisJCSAgZWxzZQorCQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIHNlY3Rpb24tPnZtYTsKKwkJICBpZiAoc3RvcCA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKQorCQkgICAgc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOworCQl9CisJICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCisJCXsKKwkJICBiZmRfc2l6ZV90eXBlIGo7CisKKwkJICBwcmludGYgKCIgJTA0bHggIiwgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOworCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQorCQkgICAgeworCQkgICAgICBpZiAoaiA8IHN0b3ApCisJCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSAoZGF0YVtqXSkpOworCQkgICAgICBlbHNlCisJCQlwcmludGYgKCIgICIpOworCQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQorCQkJcHJpbnRmICgiICIpOworCQkgICAgfQorCisJCSAgcHJpbnRmICgiICIpOworCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQorCQkgICAgeworCQkgICAgICBpZiAoaiA+PSBzdG9wKQorCQkJcHJpbnRmICgiICIpOworCQkgICAgICBlbHNlCisJCQlwcmludGYgKCIlYyIsIGlzcHJpbnQgKGRhdGFbal0pID8gZGF0YVtqXSA6ICcuJyk7CisJCSAgICB9CisJCSAgcHV0Y2hhciAoJ1xuJyk7CisJCX0KKwkgICAgICBmcmVlIChkYXRhKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIFNob3VsZCBwZXJoYXBzIHNoYXJlIGNvZGUgYW5kIGRpc3BsYXkgd2l0aCBubT8gKi8KK3N0YXRpYyB2b2lkCitkdW1wX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYm9vbGVhbiBkeW5hbWljOworeworICBhc3ltYm9sICoqY3VycmVudDsKKyAgbG9uZyBtYXg7CisgIGxvbmcgY291bnQ7CisKKyAgaWYgKGR5bmFtaWMpCisgICAgeworICAgICAgY3VycmVudCA9IGR5bnN5bXM7CisgICAgICBtYXggPSBkeW5zeW1jb3VudDsKKyAgICAgIGlmIChtYXggPT0gMCkKKwlyZXR1cm47CisgICAgICBwcmludGYgKCJEWU5BTUlDIFNZTUJPTCBUQUJMRTpcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN1cnJlbnQgPSBzeW1zOworICAgICAgbWF4ID0gc3ltY291bnQ7CisgICAgICBpZiAobWF4ID09IDApCisJcmV0dXJuOworICAgICAgcHJpbnRmICgiU1lNQk9MIFRBQkxFOlxuIik7CisgICAgfQorCisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG1heDsgY291bnQrKykKKyAgICB7CisgICAgICBpZiAoKmN1cnJlbnQpCisJeworCSAgYmZkICpjdXJfYmZkID0gYmZkX2FzeW1ib2xfYmZkICgqY3VycmVudCk7CisKKwkgIGlmIChjdXJfYmZkICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICAgIGNoYXIgKmFsbG9jOworCisJICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpjdXJyZW50KTsKKwkgICAgICBhbGxvYyA9IE5VTEw7CisJICAgICAgaWYgKGRvX2RlbWFuZ2xlICYmIG5hbWUgIT0gTlVMTCAmJiAqbmFtZSAhPSAnXDAnKQorCQl7CisJCSAgY29uc3QgY2hhciAqbjsKKworCQkgIC8qIElmIHdlIHdhbnQgdG8gZGVtYW5nbGUgdGhlIG5hbWUsIHdlIGRlbWFuZ2xlIGl0CisgICAgICAgICAgICAgICAgICAgICBoZXJlLCBhbmQgdGVtcG9yYXJpbHkgY2xvYmJlciBpdCB3aGlsZSBjYWxsaW5nCisgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sLiAgRklYTUU6IFRoaXMgaXMgYSBncm9zcyBoYWNrLiAgKi8KKworCQkgIG4gPSBuYW1lOworCQkgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGN1cl9iZmQpID09ICpuKQorCQkgICAgKytuOworCQkgIGFsbG9jID0gY3BsdXNfZGVtYW5nbGUgKG4sIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKwkJICBpZiAoYWxsb2MgIT0gTlVMTCkKKwkJICAgICgqY3VycmVudCktPm5hbWUgPSBhbGxvYzsKKwkJICBlbHNlCisJCSAgICAoKmN1cnJlbnQpLT5uYW1lID0gbjsKKwkJfQorCisJICAgICAgYmZkX3ByaW50X3N5bWJvbCAoY3VyX2JmZCwgc3Rkb3V0LCAqY3VycmVudCwKKwkJCQliZmRfcHJpbnRfc3ltYm9sX2FsbCk7CisKKwkgICAgICAoKmN1cnJlbnQpLT5uYW1lID0gbmFtZTsKKwkgICAgICBpZiAoYWxsb2MgIT0gTlVMTCkKKwkJZnJlZSAoYWxsb2MpOworCisJICAgICAgcHJpbnRmICgiXG4iKTsKKwkgICAgfQorCX0KKyAgICAgIGN1cnJlbnQrKzsKKyAgICB9CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3JlbG9jcyAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBhcmVsZW50ICoqcmVscHA7CisgIGxvbmcgcmVsY291bnQ7CisgIGFzZWN0aW9uICphOworCisgIGZvciAoYSA9IGFiZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKKyAgICB7CisgICAgICBsb25nIHJlbHNpemU7CisKKyAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGEpKQorCWNvbnRpbnVlOworICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYSkpCisJY29udGludWU7CisgICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChhKSkKKwljb250aW51ZTsKKworICAgICAgaWYgKG9ubHkpCisJeworCSAgaWYgKHN0cmNtcCAob25seSwgYS0+bmFtZSkpCisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGEpOworICAgICAgaWYgKHJlbHNpemUgPCAwKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgICAgICBwcmludGYgKCJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106IiwgYS0+bmFtZSk7CisKKyAgICAgIGlmIChyZWxzaXplID09IDApCisJeworCSAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7CisJICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIGEsIHJlbHBwLCBzeW1zKTsKKwkgIGlmIChyZWxjb3VudCA8IDApCisJICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCSAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiAobm9uZSlcblxuIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHByaW50ZiAoIlxuIik7CisJICAgICAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIGEsIHJlbHBwLCByZWxjb3VudCk7CisJICAgICAgcHJpbnRmICgiXG5cbiIpOworCSAgICB9CisJICBmcmVlIChyZWxwcCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2R1bXBfZHluYW1pY19yZWxvY3MgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgbG9uZyByZWxzaXplOworICBhcmVsZW50ICoqcmVscHA7CisgIGxvbmcgcmVsY291bnQ7CisKKyAgcmVsc2l6ZSA9IGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCk7CisgIGlmIChyZWxzaXplIDwgMCkKKyAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBwcmludGYgKCJEWU5BTUlDIFJFTE9DQVRJT04gUkVDT1JEUyIpOworCisgIGlmIChyZWxzaXplID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKKyAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCByZWxwcCwgZHluc3ltcyk7CisgICAgICBpZiAocmVsY291bnQgPCAwKQorCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICAgICAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKKwl7CisJICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKCJcbiIpOworCSAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCByZWxwcCwgcmVsY291bnQpOworCSAgcHJpbnRmICgiXG5cbiIpOworCX0KKyAgICAgIGZyZWUgKHJlbHBwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3JlbG9jX3NldCAoYWJmZCwgc2VjLCByZWxwcCwgcmVsY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgYXJlbGVudCAqKnJlbHBwOworICAgICBsb25nIHJlbGNvdW50OworeworICBhcmVsZW50ICoqcDsKKyAgY2hhciAqbGFzdF9maWxlbmFtZSwgKmxhc3RfZnVuY3Rpb25uYW1lOworICB1bnNpZ25lZCBpbnQgbGFzdF9saW5lOworCisgIC8qIEdldCBjb2x1bW4gaGVhZGVycyBsaW5lZCB1cCByZWFzb25hYmx5LiAgKi8KKyAgeworICAgIHN0YXRpYyBpbnQgd2lkdGg7CisgICAgaWYgKHdpZHRoID09IDApCisgICAgICB7CisJY2hhciBidWZbMzBdOworCXNwcmludGZfdm1hIChidWYsIChiZmRfdm1hKSAtMSk7CisJd2lkdGggPSBzdHJsZW4gKGJ1ZikgLSA3OworICAgICAgfQorICAgIHByaW50ZiAoIk9GRlNFVCAlKnMgVFlQRSAlKnMgVkFMVUUgXG4iLCB3aWR0aCwgIiIsIDEyLCAiIik7CisgIH0KKworICBsYXN0X2ZpbGVuYW1lID0gTlVMTDsKKyAgbGFzdF9mdW5jdGlvbm5hbWUgPSBOVUxMOworICBsYXN0X2xpbmUgPSAwOworCisgIGZvciAocCA9IHJlbHBwOyByZWxjb3VudCAmJiAqcCAhPSAoYXJlbGVudCAqKSBOVUxMOyBwKyssIHJlbGNvdW50LS0pCisgICAgeworICAgICAgYXJlbGVudCAqcSA9ICpwOworICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jdGlvbm5hbWU7CisgICAgICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOworICAgICAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOworCisgICAgICBpZiAoc3RhcnRfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKKwkgICYmIHEtPmFkZHJlc3MgPCBzdGFydF9hZGRyZXNzKQorCWNvbnRpbnVlOworICAgICAgaWYgKHN0b3BfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKKwkgICYmIHEtPmFkZHJlc3MgPiBzdG9wX2FkZHJlc3MpCisJY29udGludWU7CisKKyAgICAgIGlmICh3aXRoX2xpbmVfbnVtYmVycworCSAgJiYgc2VjICE9IE5VTEwKKwkgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjLCBzeW1zLCBxLT5hZGRyZXNzLAorCQkJCSAgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKSkKKwl7CisJICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKKwkgICAgICAmJiAobGFzdF9mdW5jdGlvbm5hbWUgPT0gTlVMTAorCQkgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBsYXN0X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlcygpOlxuIiwgZnVuY3Rpb25uYW1lKTsKKwkgICAgICBpZiAobGFzdF9mdW5jdGlvbm5hbWUgIT0gTlVMTCkKKwkJZnJlZSAobGFzdF9mdW5jdGlvbm5hbWUpOworCSAgICAgIGxhc3RfZnVuY3Rpb25uYW1lID0geHN0cmR1cCAoZnVuY3Rpb25uYW1lKTsKKwkgICAgfQorCSAgaWYgKGxpbmUgPiAwCisJICAgICAgJiYgKGxpbmUgIT0gbGFzdF9saW5lCisJCSAgfHwgKGZpbGVuYW1lICE9IE5VTEwKKwkJICAgICAgJiYgbGFzdF9maWxlbmFtZSAhPSBOVUxMCisJCSAgICAgICYmIHN0cmNtcCAoZmlsZW5hbWUsIGxhc3RfZmlsZW5hbWUpICE9IDApKSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA9PSBOVUxMID8gIj8/PyIgOiBmaWxlbmFtZSwgbGluZSk7CisJICAgICAgbGFzdF9saW5lID0gbGluZTsKKwkgICAgICBpZiAobGFzdF9maWxlbmFtZSAhPSBOVUxMKQorCQlmcmVlIChsYXN0X2ZpbGVuYW1lKTsKKwkgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKwkJbGFzdF9maWxlbmFtZSA9IE5VTEw7CisJICAgICAgZWxzZQorCQlsYXN0X2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOworCSAgICB9CisJfQorCisgICAgICBpZiAocS0+c3ltX3B0cl9wdHIgJiYgKnEtPnN5bV9wdHJfcHRyKQorCXsKKwkgIHN5bV9uYW1lID0gKCoocS0+c3ltX3B0cl9wdHIpKS0+bmFtZTsKKwkgIHNlY3Rpb25fbmFtZSA9ICgqKHEtPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm5hbWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN5bV9uYW1lID0gTlVMTDsKKwkgIHNlY3Rpb25fbmFtZSA9IE5VTEw7CisJfQorICAgICAgaWYgKHN5bV9uYW1lKQorCXsKKwkgIHByaW50Zl92bWEgKHEtPmFkZHJlc3MpOworCSAgcHJpbnRmICgiICUtMTZzICAiLCBxLT5ob3d0by0+bmFtZSk7CisJICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSBOVUxMLAorCQkJCSAqcS0+c3ltX3B0cl9wdHIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoc2VjdGlvbl9uYW1lID09IChDT05TVCBjaGFyICopIE5VTEwpCisJICAgIHNlY3Rpb25fbmFtZSA9ICIqdW5rbm93bioiOworCSAgcHJpbnRmX3ZtYSAocS0+YWRkcmVzcyk7CisJICBwcmludGYgKCIgJS0xNnMgIFslc10iLAorCQkgIHEtPmhvd3RvLT5uYW1lLAorCQkgIHNlY3Rpb25fbmFtZSk7CisJfQorICAgICAgaWYgKHEtPmFkZGVuZCkKKwl7CisJICBwcmludGYgKCIrMHgiKTsKKwkgIHByaW50Zl92bWEgKHEtPmFkZGVuZCk7CisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9Cit9CisMCisvKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGFyY2hpdGVjdHVyZSBuYW1lICsgMS4gICovCisjZGVmaW5lIExPTkdFU1RfQVJDSCBzaXplb2YoInJzNjAwMDo2MDAwIikKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZW5kaWFuX3N0cmluZyAoZW5kaWFuKQorICAgICBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuOworeworICBpZiAoZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQorICAgIHJldHVybiAiYmlnIGVuZGlhbiI7CisgIGVsc2UgaWYgKGVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKKyAgICByZXR1cm4gImxpdHRsZSBlbmRpYW4iOworICBlbHNlCisgICAgcmV0dXJuICJlbmRpYW5uZXNzIHVua25vd24iOworfQorCisvKiBMaXN0IHRoZSB0YXJnZXRzIHRoYXQgQkZEIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgZWFjaCBmb2xsb3dlZAorICAgYnkgaXRzIGVuZGlhbm5lc3MgYW5kIHRoZSBhcmNoaXRlY3R1cmVzIGl0IHN1cHBvcnRzLiAgKi8KKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfdGFyZ2V0X2xpc3QgKCkKK3sKKyAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107CisgIGNoYXIgKmR1bW15X25hbWU7CisgIGludCB0OworCisgIGR1bW15X25hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOworICBmb3IgKHQgPSAwOyBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQorICAgIHsKKyAgICAgIGJmZF90YXJnZXQgKnAgPSBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsKKyAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVudyAoZHVtbXlfbmFtZSwgcC0+bmFtZSk7CisgICAgICBpbnQgYTsKKworICAgICAgcHJpbnRmICgiJXNcbiAoaGVhZGVyICVzLCBkYXRhICVzKVxuIiwgcC0+bmFtZSwKKwkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5oZWFkZXJfYnl0ZW9yZGVyKSwKKwkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5ieXRlb3JkZXIpKTsKKworICAgICAgaWYgKGFiZmQgPT0gTlVMTCkKKwl7CisJICBiZmRfbm9uZmF0YWwgKGR1bW15X25hbWUpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCisJeworCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKQorCSAgICBiZmRfbm9uZmF0YWwgKHAtPm5hbWUpOworCSAgY29udGludWU7CisJfQorCisgICAgICBmb3IgKGEgPSAoaW50KSBiZmRfYXJjaF9vYnNjdXJlICsgMTsgYSA8IChpbnQpIGJmZF9hcmNoX2xhc3Q7IGErKykKKwlpZiAoYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpIGEsIDApKQorCSAgcHJpbnRmICgiICAlc1xuIiwKKwkJICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSkgYSwgMCkpOworICAgIH0KKyAgdW5saW5rIChkdW1teV9uYW1lKTsKKyAgZnJlZSAoZHVtbXlfbmFtZSk7Cit9CisKKy8qIFByaW50IGEgdGFibGUgc2hvd2luZyB3aGljaCBhcmNoaXRlY3R1cmVzIGFyZSBzdXBwb3J0ZWQgZm9yIGVudHJpZXMKKyAgIEZJUlNUIHRocm91Z2ggTEFTVC0xIG9mIGJmZF90YXJnZXRfdmVjdG9yICh0YXJnZXRzIGFjcm9zcywKKyAgIGFyY2hpdGVjdHVyZXMgZG93bikuICAqLworCitzdGF0aWMgdm9pZAorZGlzcGxheV9pbmZvX3RhYmxlIChmaXJzdCwgbGFzdCkKKyAgICAgaW50IGZpcnN0OworICAgICBpbnQgbGFzdDsKK3sKKyAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107CisgIGludCB0LCBhOworICBjaGFyICpkdW1teV9uYW1lOworCisgIC8qIFByaW50IGhlYWRpbmcgb2YgdGFyZ2V0IG5hbWVzLiAgKi8KKyAgcHJpbnRmICgiXG4lKnMiLCAoaW50KSBMT05HRVNUX0FSQ0gsICIgIik7CisgIGZvciAodCA9IGZpcnN0OyB0IDwgbGFzdCAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQorICAgIHByaW50ZiAoIiVzICIsIGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKTsKKyAgcHV0Y2hhciAoJ1xuJyk7CisKKyAgZHVtbXlfbmFtZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7CisgIGZvciAoYSA9IChpbnQpIGJmZF9hcmNoX29ic2N1cmUgKyAxOyBhIDwgKGludCkgYmZkX2FyY2hfbGFzdDsgYSsrKQorICAgIGlmIChzdHJjbXAgKGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhLCAwKSwgIlVOS05PV04hIikgIT0gMCkKKyAgICAgIHsKKwlwcmludGYgKCIlKnMgIiwgKGludCkgTE9OR0VTVF9BUkNIIC0gMSwKKwkJYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGEsIDApKTsKKwlmb3IgKHQgPSBmaXJzdDsgdCA8IGxhc3QgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKKwkgIHsKKwkgICAgYmZkX3RhcmdldCAqcCA9IGJmZF90YXJnZXRfdmVjdG9yW3RdOworCSAgICBib29sZWFuIG9rID0gdHJ1ZTsKKwkgICAgYmZkICphYmZkID0gYmZkX29wZW53IChkdW1teV9uYW1lLCBwLT5uYW1lKTsKKworCSAgICBpZiAoYWJmZCA9PSBOVUxMKQorCSAgICAgIHsKKwkJYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKKwkJb2sgPSBmYWxzZTsKKwkgICAgICB9CisKKwkgICAgaWYgKG9rKQorCSAgICAgIHsKKwkJaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQorCQkgIHsKKwkJICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbikKKwkJICAgICAgYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKKwkJICAgIG9rID0gZmFsc2U7CisJCSAgfQorCSAgICAgIH0KKworCSAgICBpZiAob2spCisJICAgICAgeworCQlpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYSwgMCkpCisJCSAgb2sgPSBmYWxzZTsKKwkgICAgICB9CisKKwkgICAgaWYgKG9rKQorCSAgICAgIHByaW50ZiAoIiVzICIsIHAtPm5hbWUpOworCSAgICBlbHNlCisJICAgICAgeworCQlpbnQgbCA9IHN0cmxlbiAocC0+bmFtZSk7CisJCXdoaWxlIChsLS0pCisJCSAgcHV0Y2hhciAoJy0nKTsKKwkJcHV0Y2hhciAoJyAnKTsKKwkgICAgICB9CisJICB9CisJcHV0Y2hhciAoJ1xuJyk7CisgICAgICB9CisgIHVubGluayAoZHVtbXlfbmFtZSk7CisgIGZyZWUgKGR1bW15X25hbWUpOworfQorCisvKiBQcmludCB0YWJsZXMgb2YgYWxsIHRoZSB0YXJnZXQtYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9ucyB0aGF0CisgICBCRkQgaGFzIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0LiAgKi8KKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfdGFyZ2V0X3RhYmxlcyAoKQoreworICBpbnQgdCwgY29sdW1uczsKKyAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107CisgIGNoYXIgKmNvbHVtOworCisgIGNvbHVtbnMgPSAwOworICBjb2x1bSA9IGdldGVudiAoIkNPTFVNTlMiKTsKKyAgaWYgKGNvbHVtICE9IE5VTEwpCisgICAgY29sdW1ucyA9IGF0b2kgKGNvbHVtKTsKKyAgaWYgKGNvbHVtbnMgPT0gMCkKKyAgICBjb2x1bW5zID0gODA7CisKKyAgdCA9IDA7CisgIHdoaWxlIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBvbGR0ID0gdCwgd2lkOworCisgICAgICB3aWQgPSBMT05HRVNUX0FSQ0ggKyBzdHJsZW4gKGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKSArIDE7CisgICAgICArK3Q7CisgICAgICB3aGlsZSAod2lkIDwgY29sdW1ucyAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQorCXsKKwkgIGludCBuZXd3aWQ7CisKKwkgIG5ld3dpZCA9IHdpZCArIHN0cmxlbiAoYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpICsgMTsKKwkgIGlmIChuZXd3aWQgPj0gY29sdW1ucykKKwkgICAgYnJlYWs7CisJICB3aWQgPSBuZXd3aWQ7CisJICArK3Q7CisJfQorICAgICAgZGlzcGxheV9pbmZvX3RhYmxlIChvbGR0LCB0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2luZm8gKCkKK3sKKyAgcHJpbnRmIChfKCJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbiAlc1xuIiksIEJGRF9WRVJTSU9OKTsKKyAgZGlzcGxheV90YXJnZXRfbGlzdCAoKTsKKyAgZGlzcGxheV90YXJnZXRfdGFibGVzICgpOworfQorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGM7CisgIGNoYXIgKnRhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OworICBib29sZWFuIHNlZW5mbGFnID0gZmFsc2U7CisKKyNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKKyAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOworI2VuZGlmCisgIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOworICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKKworICBwcm9ncmFtX25hbWUgPSAqYXJndjsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOworCisgIGJmZF9pbml0ICgpOworICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOworCisgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAicGliOm06VkNkRGxmYWhyUnRUeHNTajp3RToiLAorCQkJICAgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKQorCSAhPSBFT0YpCisgICAgeworICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gT1BUSU9OX1NUQVJUX0FERFJFU1MgJiYgYyAhPSBPUFRJT05fU1RPUF9BRERSRVNTKQorCXNlZW5mbGFnID0gdHJ1ZTsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAwOgorCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KKwljYXNlICdtJzoKKwkgIG1hY2hpbmUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdqJzoKKwkgIG9ubHkgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdsJzoKKwkgIHdpdGhfbGluZV9udW1iZXJzID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ2InOgorCSAgdGFyZ2V0ID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnZic6CisJICBkdW1wX2ZpbGVfaGVhZGVyID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ2knOgorCSAgZm9ybWF0c19pbmZvID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgZHVtcF9wcml2YXRlX2hlYWRlcnMgPSAxOworCSAgYnJlYWs7CisJY2FzZSAneCc6CisJICBkdW1wX3ByaXZhdGVfaGVhZGVycyA9IDE7CisJICBkdW1wX3N5bXRhYiA9IDE7CisJICBkdW1wX3JlbG9jX2luZm8gPSAxOworCSAgZHVtcF9maWxlX2hlYWRlciA9IHRydWU7CisJICBkdW1wX2FyX2hkcnMgPSAxOworCSAgZHVtcF9zZWN0aW9uX2hlYWRlcnMgPSAxOworCSAgYnJlYWs7CisJY2FzZSAndCc6CisJICBkdW1wX3N5bXRhYiA9IDE7CisJICBicmVhazsKKwljYXNlICdUJzoKKwkgIGR1bXBfZHluYW1pY19zeW10YWIgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnQyc6CisJICBkb19kZW1hbmdsZSA9IDE7CisJICBicmVhazsKKwljYXNlICdkJzoKKwkgIGRpc2Fzc2VtYmxlID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ0QnOgorCSAgZGlzYXNzZW1ibGUgPSBkaXNhc3NlbWJsZV9hbGwgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnUyc6CisJICBkaXNhc3NlbWJsZSA9IHRydWU7CisJICB3aXRoX3NvdXJjZV9jb2RlID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgZHVtcF9zZWN0aW9uX2NvbnRlbnRzID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ3InOgorCSAgZHVtcF9yZWxvY19pbmZvID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ1InOgorCSAgZHVtcF9keW5hbWljX3JlbG9jX2luZm8gPSAxOworCSAgYnJlYWs7CisJY2FzZSAnYSc6CisJICBkdW1wX2FyX2hkcnMgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnaCc6CisJICBkdW1wX3NlY3Rpb25faGVhZGVycyA9IDE7CisJICBicmVhazsKKwljYXNlICdIJzoKKwkgIHVzYWdlIChzdGRvdXQsIDApOworCWNhc2UgJ1YnOgorCSAgc2hvd192ZXJzaW9uID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJ3cnOgorCSAgd2lkZV9vdXRwdXQgPSAxOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fQURKVVNUX1ZNQToKKwkgIGFkanVzdF9zZWN0aW9uX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1hZGp1c3Qtdm1hIik7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9TVEFSVF9BRERSRVNTOgorCSAgc3RhcnRfYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zdGFydC1hZGRyZXNzIik7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9TVE9QX0FERFJFU1M6CisJICBzdG9wX2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc3RvcC1hZGRyZXNzIik7CisJICBicmVhazsKKwljYXNlICdFJzoKKwkgIGlmIChzdHJjbXAgKG9wdGFyZywgIkIiKSA9PSAwKQorCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKKwkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiTCIpID09IDApCisJICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIC1FIG9wdGlvblxuIiksIHByb2dyYW1fbmFtZSk7CisJICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0VORElBTjoKKwkgIGlmIChzdHJuY21wIChvcHRhcmcsICJiaWciLCBzdHJsZW4gKG9wdGFyZykpID09IDApCisJICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOworCSAgZWxzZSBpZiAoc3RybmNtcCAob3B0YXJnLCAibGl0dGxlIiwgc3RybGVuIChvcHRhcmcpKSA9PSAwKQorCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCAtLWVuZGlhbiB0eXBlIGAlcydcbiIpLAorCQkgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7CisJICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICAgIH0KKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB1c2FnZSAoc3RkZXJyLCAxKTsKKwl9CisgICAgfQorCisgIGlmIChzaG93X3ZlcnNpb24pCisgICAgcHJpbnRfdmVyc2lvbiAoIm9iamR1bXAiKTsKKworICBpZiAoc2VlbmZsYWcgPT0gZmFsc2UpCisgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisKKyAgaWYgKGZvcm1hdHNfaW5mbykKKyAgICB7CisgICAgICBkaXNwbGF5X2luZm8gKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG9wdGluZCA9PSBhcmdjKQorCWRpc3BsYXlfZmlsZSAoImEub3V0IiwgdGFyZ2V0KTsKKyAgICAgIGVsc2UKKwlmb3IgKDsgb3B0aW5kIDwgYXJnYzspCisJICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdLCB0YXJnZXQpOworICAgIH0KKworICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9NYWtlLWluIGIvYmludXRpbHMvcG8vTWFrZS1pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTUyZGIxCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvcG8vTWFrZS1pbgpAQCAtMCwwICsxLDI1MSBAQAorIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworUEFDS0FHRSA9IEBQQUNLQUdFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitTSEVMTCA9IC9iaW4vc2gKK0BTRVRfTUFLRUAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQorZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCitzdWJkaXIgPSBwbworCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorCitDQyA9IEBDQ0AKK0dFTkNBVCA9IEBHRU5DQVRACitHTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAorTVNHRk1UID0gQE1TR0ZNVEAKK1hHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKK01TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCisKK0RFRlMgPSBAREVGU0AKK0NGTEFHUyA9IEBDRkxBR1NACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKKworSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCisKK0NPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCisKK1NPVVJDRVMgPSBjYXQtaWQtdGJsLmMKK1BPRklMRVMgPSBAUE9GSUxFU0AKK0dNT0ZJTEVTID0gQEdNT0ZJTEVTQAorRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKK3N0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKKworUE9URklMRVMgPSBcCisKK0NBVEFMT0dTID0gQENBVEFMT0dTQAorQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKK0lOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKKworLmMubzoKKwkkKENPTVBJTEUpICQ8CisKKy5wby5wb3g6CisJJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAorCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKKworLnBvLm1vOgorCSQoTVNHRk1UKSAtbyAkQCAkPAorCisucG8uZ21vOgorCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKKwkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAorCisucG8uY2F0OgorCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCisJICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCisKKworYWxsOiBhbGwtQFVTRV9OTFNACisKK2FsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKK2FsbC1ubzoKKworJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQorCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKKwkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCisJICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCisJcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90CisJbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKKworJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgorJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKKwlybSAtZiBjYXQtaWQtdGJsLnRtcAorCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKKwkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKKwlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCisJICBybSBjYXQtaWQtdGJsLnRtcDsgXAorCWVsc2UgXAorCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAorCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAorCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAorCWZpCisJY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAorCisKK2luc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKK2luc3RhbGwtZXhlYzoKK2luc3RhbGwtaW5mbzoKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAoraW5zdGFsbC1kYXRhLW5vOiBhbGwKK2luc3RhbGwtZGF0YS15ZXM6IGFsbAorCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCisJICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKKwllbHNlIFwKKwkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCisJZmkKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGNhc2UgIiQkY2F0IiBpbiBcCisJICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKKwkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAorCSAgZXNhYzsgXAorCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCisJICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKKwkgIGVsc2UgXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCisJCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKKwkgIGVsc2UgXAorCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKKwkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCisJCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICB0cnVlOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWRvbmUKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCisJICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgIGVsc2UgXAorCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAorCSAgZmk7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAorCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOgorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJZG9uZQorCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KKworY2hlY2s6IGFsbAorCitjYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCisKK2R2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKKworbW9zdGx5Y2xlYW46CisJcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAorCXJtIC1mciAqLm8KKworY2xlYW46IG1vc3RseWNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KKworbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJcm0gLWYgJChHTU9GSUxFUykKKworZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQorCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCWRvbmUKKwordXBkYXRlLXBvOiBNYWtlZmlsZQorCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKKwlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKKwljZCAkKHNyY2Rpcik7IFwKKwljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAorCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCisJICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAorCSAgZWNobyAiJCRsYW5nOiI7IFwKKwkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKKwkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAorCSAgICBybSAtZiAkJGxhbmcucG87IFwKKwkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKKwkgIGZpOyBcCisJZG9uZQorCitQT1RGSUxFUzogUE9URklMRVMuaW4KKwkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAorCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCisJICBlbHNlIFwKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKKwkgIGZpOyBcCisJICBybSAtZiAkQC10ICRAIFwKKwkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAorCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCisJCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKKwkgICAgJiYgY2htb2QgYS13ICRALXQgXAorCSAgICAmJiBtdiAkQC10ICRAICkKKworUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKKwljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCisKK01ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKKwljZCAuLiBcCisJICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKKwkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vUE9URklMRVMuaW4gYi9iaW51dGlscy9wby9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2YzODYwCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvcG8vUE9URklMRVMuaW4KQEAgLTAsMCArMSw1MiBAQAorcmVhZGVsZi5jCithZGRyMmxpbmUuYworYXIuYworYXJzdXAuYworYXJzdXAuaAorYnVjb21tLmMKK2J1Y29tbS5oCitidWRiZy5oCitjb2ZmZHVtcC5jCitjb2ZmZ3Jvay5jCitjb2ZmZ3Jvay5oCitkZWJ1Zy5jCitkZWJ1Zy5oCitkbGx0b29sLmMKK2RsbHRvb2wuaAorZGxsd3JhcC5jCitkeW4tc3RyaW5nLmMKK2R5bi1zdHJpbmcuaAorZmlsZW1vZGUuYworaWVlZS5jCitpcy1yYW5saWIuYworaXMtc3RyaXAuYworbWF5YmUtcmFubGliLmMKK21heWJlLXN0cmlwLmMKK25sbWNvbnYuYworbmxtY29udi5oCitubS5jCitub3QtcmFubGliLmMKK25vdC1zdHJpcC5jCitvYmpjb3B5LmMKK29iamR1bXAuYworcHJkYmcuYworcmRjb2ZmLmMKK3JkZGJnLmMKK3JlbmFtZS5jCityZXNiaW4uYworcmVzY29mZi5jCityZXNyYy5jCityZXNyZXMuYworc2l6ZS5jCitzcmNvbnYuYworc3RhYnMuYworc3RyaW5ncy5jCitzeXNkdW1wLmMKK3ZlcnNpb24uYword2luZHJlcy5jCit3aW5kcmVzLmgKK3dpbmR1bmkuYword2luZHVuaS5oCit3cnN0YWJzLmMKK3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oCit0ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdCBiL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWViMzgzCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvcG8vYmludXRpbHMucG90CkBAIC0wLDAgKzEsMzQ0MyBAQAorIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgorIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCisjCisjLCBmdXp6eQorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDQtMjYgMTA6MTEtMDYwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgorIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgorIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCisKKyM6IGFkZHIybGluZS5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgWy1DZnNIVl0gWy1iIGJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuIgorIiAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuIgorIiAgICAgICBbLS1iYXNlbmFtZXNdIFstLWZ1bmN0aW9uc10gW2FkZHIgYWRkciAuLi5dXG4iCittc2dzdHIgIiIKKworIzogYWRkcjJsaW5lLmM6ODMgYXIuYzoyNTUgbmxtY29udi5jOjExNDEgbm0uYzozMDQgb2JqY29weS5jOjMxOCBvYmpjb3B5LmM6MzM3CisjOiBvYmpkdW1wLmM6MjM2IHJlYWRlbGYuYzoxMTMzIHNpemUuYzo4OSBzdHJpbmdzLmM6NTEyIHdpbmRyZXMuYzo3MjMKK21zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKK21zZ3N0ciAiIgorCisjOiBhZGRyMmxpbmUuYzoyNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGNhbiBub3QgZ2V0IGFkZHJlc3NlcyBmcm9tIGFyY2hpdmUiCittc2dzdHIgIiIKKworIzogYXIuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgorbXNnc3RyICIiCisKKyM6IGFyLmM6MjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgWy1de2RtcHFyc3R4fVthYmNpbG9zU3V2Vl0gW21lbWJlci1uYW1lXSBhcmNoaXZlLWZpbGUgZmlsZS4uLlxuIgorbXNnc3RyICIiCisKKyM6IGFyLmM6MjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICAgICAlcyAtTSBbPG1yaS1zY3JpcHRdXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMjcKK21zZ2lkICIgY29tbWFuZHM6XG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMjgKK21zZ2lkICIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjIyOQorbXNnaWQgIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMzAKK21zZ2lkICIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjIzMQorbXNnaWQgIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjIzMgorbXNnaWQgIiIKKyIgIHJbYWJdW2ZdW3VdICAtIHJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlKHMpIGludG8gdGhlIGFyY2hpdmVcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjIzMworbXNnaWQgIiAgdCAgICAgICAgICAgIC0gZGlzcGxheSBjb250ZW50cyBvZiBhcmNoaXZlXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMzQKK21zZ2lkICIgIHhbb10gICAgICAgICAtIGV4dHJhY3QgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMzUKK21zZ2lkICIgY29tbWFuZCBzcGVjaWZpYyBtb2RpZmllcnM6XG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMzYKK21zZ2lkICIgIFthXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGFmdGVyIFttZW1iZXItbmFtZV1cbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjIzNworbXNnaWQgIiAgW2JdICAgICAgICAgIC0gcHV0IGZpbGUocykgYmVmb3JlIFttZW1iZXItbmFtZV0gKHNhbWUgYXMgW2ldKVxuIgorbXNnc3RyICIiCisKKyM6IGFyLmM6MjM4Cittc2dpZCAiICBbZl0gICAgICAgICAgLSB0cnVuY2F0ZSBpbnNlcnRlZCBmaWxlIG5hbWVzXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyMzkKK21zZ2lkICIgIFtvXSAgICAgICAgICAtIHByZXNlcnZlIG9yaWdpbmFsIGRhdGVzXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyNDAKK21zZ2lkICIiCisiICBbdV0gICAgICAgICAgLSBvbmx5IHJlcGxhY2UgZmlsZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiBjdXJyZW50IGFyY2hpdmUgIgorImNvbnRlbnRzXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyNDEKK21zZ2lkICIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyNDIKK21zZ2lkICIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoyNDMKK21zZ2lkICIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIgorbXNnc3RyICIiCisKKyM6IGFyLmM6MjQ0Cittc2dpZCAiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjI0NQorbXNnaWQgIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIgorbXNnc3RyICIiCisKKyM6IGFyLmM6MjQ2Cittc2dpZCAiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIgorbXNnc3RyICIiCisKKyM6IGFyLmM6MjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiAlcyBbLXZWXSBhcmNoaXZlXG4iCittc2dzdHIgIiIKKworIzogYXIuYzo0MzEKK21zZ2lkICJ0d28gZGlmZmVyZW50IG9wZXJhdGlvbiBvcHRpb25zIHNwZWNpZmllZCIKK21zZ3N0ciAiIgorCisjOiBhci5jOjUwMAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjUzMgorbXNnaWQgIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiCittc2dzdHIgIiIKKworIzogYXIuYzo1MzUKK21zZ2lkICJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIgorbXNnc3RyICIiCisKKyM6IGFyLmM6NjE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjczMCBhci5jOjc4MiBhci5jOjEyMTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIKK21zZ3N0ciAiIgorCisjOiBhci5jOjczNAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiPG1lbWJlciAlcz5cbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjc1MSBhci5jOjgxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYSB2YWxpZCBhcmNoaXZlIgorbXNnc3RyICIiCisKKyM6IGFyLmM6Nzg3CisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXQgcmV0dXJucyBuZWdhdGl2ZSBzaXplIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiBhci5jOjkwOAorIywgYy1mb3JtYXQKK21zZ2lkICIlcyBpcyBub3QgYW4gYXJjaGl2ZSIKK21zZ3N0ciAiIgorCisjOiBhci5jOjkxNQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogY3JlYXRpbmcgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjExMTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWVtYmVyIG5hbWVkIGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBhci5jOjExNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUgJXMhXG4iCittc2dzdHIgIiIKKworIzogYXIuYzoxMzIyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBubyBhcmNoaXZlIG1hcCB0byB1cGRhdGUiCittc2dzdHIgIiIKKworIzogYXJzdXAuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICJObyBlbnRyeSAlcyBpbiBhcmNoaXZlLlxuIgorbXNnc3RyICIiCisKKyM6IGFyc3VwLmM6MTE4CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbid0IG9wZW4gZmlsZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGFyc3VwLmM6MTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBhcmNoaXZlICVzXG4iCittc2dzdHIgIiIKKworIzogYXJzdXAuYzoxNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IENhbid0IG9wZW4gaW5wdXQgYXJjaGl2ZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGFyc3VwLmM6MTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBmaWxlICVzIGlzIG5vdCBhbiBhcmNoaXZlXG4iCittc2dzdHIgIiIKKworIzogYXJzdXAuYzoyMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG5vIG91dHB1dCBhcmNoaXZlIHNwZWNpZmllZCB5ZXRcbiIKK21zZ3N0ciAiIgorCisjOiBhcnN1cC5jOjI0NSBhcnN1cC5jOjI4MCBhcnN1cC5jOjMxNiBhcnN1cC5jOjMzNiBhcnN1cC5jOjM5NAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIgorbXNnc3RyICIiCisKKyM6IGFyc3VwLmM6MjUzIGFyc3VwLmM6MzU0IGFyc3VwLmM6Mzc0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBhcnN1cC5jOjMwMSBhcnN1cC5jOjM3MCBhcnN1cC5jOjQ0OQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGFyc3VwLmM6NDAxCisjLCBjLWZvcm1hdAorbXNnaWQgIkN1cnJlbnQgb3BlbiBhcmNoaXZlIGlzICVzXG4iCittc2dzdHIgIiIKKworIzogYXJzdXAuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG5vIG9wZW4gIGFyY2hpdmVcbiIKK21zZ3N0ciAiIgorCisjOiBidWNvbW0uYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlcyIKK21zZ3N0ciAiIgorCisjOiBidWNvbW0uYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IE1hdGNoaW5nIGZvcm1hdHM6IgorbXNnc3RyICIiCisKKyM6IGJ1Y29tbS5jOjE2OAorbXNnaWQgIlN1cHBvcnRlZCB0YXJnZXRzOiIKK21zZ3N0ciAiIgorCisjOiBidWNvbW0uYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIKK21zZ3N0ciAiIgorCisjOiBidWNvbW0uYzoyNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGJhZCBudW1iZXI6ICVzIgorbXNnc3RyICIiCisKKyM6IGNvZmZkdW1wLmM6OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiI2xpbmVzICVkICIKK21zZ3N0ciAiIgorCisjOiBjb2ZmZHVtcC5jOjQ1NiBzeXNkdW1wLmM6NzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBQcmludCBhIGh1bWFuIHJlYWRhYmxlIGludGVycHJldGF0aW9uIG9mIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IGNvZmZkdW1wLmM6NDk4IHNyY29udi5jOjE5NDAgc3lzZHVtcC5jOjc1NQorIywgYy1mb3JtYXQKK21zZ2lkICJHTlUgJXMgdmVyc2lvbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGNvZmZkdW1wLmM6NTE2IHNyY29udi5jOjE5Nzcgc3lzZHVtcC5jOjc3NQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjY1MworbXNnaWQgImRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZTogbm8gY3VycmVudCBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6NzM2Cittc2dpZCAiZGVidWdfc3RhcnRfc291cmNlOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjc5NQorbXNnaWQgImRlYnVnX3JlY29yZF9mdW5jdGlvbjogbm8gZGVidWdfc2V0X2ZpbGVuYW1lIGNhbGwiCittc2dzdHIgIiIKKworIzogZGVidWcuYzo4NTEKK21zZ2lkICJkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyOiBubyBjdXJyZW50IGZ1bmN0aW9uIgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6ODg1Cittc2dpZCAiZGVidWdfZW5kX2Z1bmN0aW9uOiBubyBjdXJyZW50IGZ1bmN0aW9uIgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6ODkxCittc2dpZCAiZGVidWdfZW5kX2Z1bmN0aW9uOiBzb21lIGJsb2NrcyB3ZXJlIG5vdCBjbG9zZWQiCittc2dzdHIgIiIKKworIzogZGVidWcuYzo5MjEKK21zZ2lkICJkZWJ1Z19zdGFydF9ibG9jazogbm8gY3VycmVudCBibG9jayIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjk1OQorbXNnaWQgImRlYnVnX2VuZF9ibG9jazogbm8gY3VycmVudCBibG9jayIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjk2NgorbXNnaWQgImRlYnVnX2VuZF9ibG9jazogYXR0ZW1wdCB0byBjbG9zZSB0b3AgbGV2ZWwgYmxvY2siCittc2dzdHIgIiIKKworIzogZGVidWcuYzo5OTIKK21zZ2lkICJkZWJ1Z19yZWNvcmRfbGluZTogbm8gY3VycmVudCB1bml0IgorbXNnc3RyICIiCisKKyMuIEZJWE1FCisjOiBkZWJ1Zy5jOjEwNDYKK21zZ2lkICJkZWJ1Z19zdGFydF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIKK21zZ3N0ciAiIgorCisjLiBGSVhNRQorIzogZGVidWcuYzoxMDU4Cittc2dpZCAiZGVidWdfZW5kX2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIgorbXNnc3RyICIiCisKKyMuIEZJWE1FLgorIzogZGVidWcuYzoxMTUyCittc2dpZCAiZGVidWdfcmVjb3JkX2xhYmVsIG5vdCBpbXBsZW1lbnRlZCIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjExNzgKK21zZ2lkICJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjExOTQKK21zZ2lkICJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgYmxvY2siCittc2dzdHIgIiIKKworIzogZGVidWcuYzoxNzY0Cittc2dpZCAiZGVidWdfbWFrZV91bmRlZmluZWRfdHlwZTogdW5zdXBwb3J0ZWQga2luZCIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjE5NzAKK21zZ2lkICJkZWJ1Z19uYW1lX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjIwMTgKK21zZ2lkICJkZWJ1Z190YWdfdHlwZTogbm8gY3VycmVudCBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6MjAyNgorbXNnaWQgImRlYnVnX3RhZ190eXBlOiBleHRyYSB0YWcgYXR0ZW1wdGVkIgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6MjA2NgorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBjaGFuZ2luZyB0eXBlIHNpemUgZnJvbSAlZCB0byAlZFxuIgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6MjA5MAorbXNnaWQgImRlYnVnX2ZpbmRfbmFtZWRfdHlwZTogbm8gY3VycmVudCBjb21waWxhdGlvbiB1bml0IgorbXNnc3RyICIiCisKKyM6IGRlYnVnLmM6MjE5NworIywgYy1mb3JtYXQKK21zZ2lkICJkZWJ1Z19nZXRfcmVhbF90eXBlOiBjaXJjdWxhciBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBkZWJ1Zy5jOjI2NjMKK21zZ2lkICJkZWJ1Z193cml0ZV90eXBlOiBpbGxlZ2FsIHR5cGUgZW5jb3VudGVyZWQiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjYyNyBkbGx0b29sLmM6NjQ2IGRsbHRvb2wuYzo2NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZXJuYWwgZXJyb3I6IFVua25vd24gbWFjaGluZSB0eXBlOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzo3MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgb3BlbiBkZWYgZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjcwNQorIywgYy1mb3JtYXQKK21zZ2lkICJQcm9jZXNzaW5nIGRlZiBmaWxlOiAlcyIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6NzA5Cittc2dpZCAiUHJvY2Vzc2VkIGRlZiBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzo3MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ludGF4IGVycm9yIGluIGRlZiBmaWxlICVzOiVkXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjc2NworIywgYy1mb3JtYXQKK21zZ2lkICJOQU1FOiAlcyBiYXNlOiAleCIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6NzcwCittc2dpZCAiQ2FuJ3QgaGF2ZSBMSUJSQVJZIGFuZCBOQU1FXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjc4NgorIywgYy1mb3JtYXQKK21zZ2lkICJMSUJSQVJZOiAlcyBiYXNlOiAleCIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6Nzg5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MTA0NAorIywgYy1mb3JtYXQKK21zZ2lkICJ3YWl0OiAlcyIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MTA0OQorIywgYy1mb3JtYXQKK21zZ2lkICJzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWQiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjEwNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjEwODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3Vja2luZyBpbiBpbmZvIGZyb20gLmRyZWN0aXZlIHNlY3Rpb24gaW4gJXNcbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MTE5NworIywgYy1mb3JtYXQKK21zZ2lkICJFeGNsdWRpbmcgc3ltYm9sOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoxMjkyIGRsbHRvb2wuYzoxMzAzIG5tLmM6OTAyIG5tLmM6OTEzIG9iamR1bXAuYzozNzkgb2JqZHVtcC5jOjM5NgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbm8gc3ltYm9sc1xuIgorbXNnc3RyICIiCisKKyMuIEZJWE1FOiB3ZSBvdWdodCB0byByZWFkIGluIGFuZCBibG9jayBvdXQgdGhlIGJhc2UgcmVsb2NhdGlvbnMKKyM6IGRsbHRvb2wuYzoxMzMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBEb25lIHJlYWRpbmcgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MTM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjEzNDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjE0MzQKK21zZ2lkICJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MTQ3OQorbXNnaWQgIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjE1ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiR2VuZXJhdGluZyBleHBvcnQgZmlsZTogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MTU5MgorIywgYy1mb3JtYXQKK21zZ2lkICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoxNTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjE4MjgKK21zZ2lkICJHZW5lcmF0ZWQgZXhwb3J0cyBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyMDgxCisjLCBjLWZvcm1hdAorbXNnaWQgImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjIwODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6MjU5MworIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBvcGVuIC5saWIgZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI1OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyNjUyCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbm5vdCBkZWxldGUgJXM6ICVzXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI2NTYKK21zZ2lkICJDcmVhdGVkIGxpYiBmaWxlIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyNzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmcsIGlnbm9yaW5nIGR1cGxpY2F0ZSBFWFBPUlQgJXMgJWQsJWRcbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6Mjc2MworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI4OTAKK21zZ2lkICJQcm9jZXNzaW5nIGRlZmluaXRpb25zIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTI4Cittc2dpZCAiUHJvY2Vzc2VkIGRlZmluaXRpb25zIgorbXNnc3RyICIiCisKKyMuIHhnZXRleHQ6Yy1mb3JtYXQKKyM6IGRsbHRvb2wuYzoyOTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIgorbXNnc3RyICIiCisKKyMuIHhnZXRleHQ6Yy1mb3JtYXQKKyM6IGRsbHRvb2wuYzoyOTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgICAtbSAtLW1hY2hpbmUgPG1hY2hpbmU+ICAgIENyZWF0ZSB7YXJtLCBpMzg2LCBwcGMsIHRodW1ifSBETEwuIFtkZWZhdWx0OiAiCisiJXNdXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NDIKK21zZ2lkICIgICAtZSAtLW91dHB1dC1leHAgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGV4cG9ydCBmaWxlLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTQzCittc2dpZCAiICAgLWwgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBpbnRlcmZhY2UgbGlicmFyeS5cbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6Mjk0NAorbXNnaWQgIiAgIC1hIC0tYWRkLWluZGlyZWN0ICAgICAgICAgQWRkIGRsbCBpbmRpcmVjdHMgdG8gZXhwb3J0IGZpbGUuXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NDUKK21zZ2lkICIiCisiICAgLUQgLS1kbGxuYW1lIDxuYW1lPiAgICAgICBOYW1lIG9mIGlucHV0IGRsbCB0byBwdXQgaW50byBpbnRlcmZhY2UgbGliLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTQ2Cittc2dpZCAiICAgLWQgLS1pbnB1dC1kZWYgPGRlZmZpbGU+ICBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSByZWFkIGluLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTQ3Cittc2dpZCAiICAgLXogLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSBjcmVhdGVkLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTQ4Cittc2dpZCAiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgICBFeHBvcnQgYWxsIHN5bWJvbHMgdG8gLmRlZlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTQ5Cittc2dpZCAiICAgLS1uby1leHBvcnQtYWxsLXN5bWJvbHMgICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTUwCittc2dpZCAiICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+ICBEb24ndCBleHBvcnQgPGxpc3Q+XG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NTEKK21zZ2lkICIgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgICAgIENsZWFyIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NTIKK21zZ2lkICIgICAtYiAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGUuXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NTMKK21zZ2lkICIgICAteCAtLW5vLWlkYXRhNCAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvbi5cbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6Mjk1NAorbXNnaWQgIiAgIC1jIC0tbm8taWRhdGE1ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTU1Cittc2dpZCAiIgorIiAgIC1VIC0tYWRkLXVuZGVyc2NvcmUgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIHN5bWJvbHMgaW4gaW50ZXJmYWNlICIKKyJsaWJyYXJ5LlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTU2Cittc2dpZCAiICAgLWsgLS1raWxsLWF0ICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lcy5cbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6Mjk1NworbXNnaWQgIiAgIC1BIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgQWRkIGFsaWFzZXMgd2l0aG91dCBAPG4+LlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTU4Cittc2dpZCAiICAgLVMgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXIuXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NTkKK21zZ2lkICIgICAtZiAtLWFzLWZsYWdzIDxmbGFncz4gICAgIFBhc3MgPGZsYWdzPiB0byB0aGUgYXNzZW1ibGVyLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzoyOTYxCittc2dpZCAiICAgLWkgLS1pbnRlcndvcmsgICAgICAgICAgICBTdXBwb3J0IEFSTS9UaHVtYiBpbnRlcndvcmtpbmcuXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NjMKK21zZ2lkICIiCisiICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgIgorInByZXNlcnZhdGlvbikuXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NjQKK21zZ2lkICIgICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgIEJlIHZlcmJvc2UuXG4iCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjI5NjUKK21zZ2lkICIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIKK21zZ3N0ciAiIgorCisjOiBkbGx0b29sLmM6Mjk2NgorbXNnaWQgIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIgorbXNnc3RyICIiCisKKyM6IGRsbHRvb2wuYzozMTIwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiCittc2dzdHIgIiIKKworIzogZGxsdG9vbC5jOjMxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjMxNgorbXNnaWQgInVuZXhwZWN0ZWQgZW5kIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6NDExCittc2dpZCAiaW52YWxpZCBudW1iZXIiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjQ3MAorbXNnaWQgImludmFsaWQgc3RyaW5nIGxlbmd0aCIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6NTI3IGllZWUuYzo1NjgKK21zZ2lkICJleHByZXNzaW9uIHN0YWNrIG92ZXJmbG93IgorbXNnc3RyICIiCisKKyM6IGllZWUuYzo1NDcKK21zZ2lkICJ1bnN1cHBvcnRlZCBJRUVFIGV4cHJlc3Npb24gb3BlcmF0b3IiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjU2MgorbXNnaWQgInVua25vd24gc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6NTgzCittc2dpZCAiZXhwcmVzc2lvbiBzdGFjayB1bmRlcmZsb3ciCittc2dzdHIgIiIKKworIzogaWVlZS5jOjU5NworbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgbWlzbWF0Y2giCittc2dzdHIgIiIKKworIzogaWVlZS5jOjYzNgorbXNnaWQgInVua25vd24gYnVpbHRpbiB0eXBlIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzo3ODEKK21zZ2lkICJCQ0QgZmxvYXQgdHlwZSBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzo5MjcKK21zZ2lkICJ1bmV4cGVjdGVkIG51bWJlciIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6OTM0Cittc2dpZCAidW5leHBlY3RlZCByZWNvcmQgdHlwZSIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6OTY3Cittc2dpZCAiYmxvY2tzIGxlZnQgb24gc3RhY2sgYXQgZW5kIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoxMjMyCittc2dpZCAidW5rbm93biBCQiB0eXBlIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoxMjQxCittc2dpZCAic3RhY2sgb3ZlcmZsb3ciCittc2dzdHIgIiIKKworIzogaWVlZS5jOjEyNjYKK21zZ2lkICJzdGFjayB1bmRlcmZsb3ciCittc2dzdHIgIiIKKworIzogaWVlZS5jOjEzODAgaWVlZS5jOjE0NTIgaWVlZS5jOjIxNTEKK21zZ2lkICJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoxNDMwCittc2dpZCAiaWxsZWdhbCB0eXBlIGluZGV4IgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoxNDQwIGllZWUuYzoxNDc3Cittc2dpZCAidW5rbm93biBUWSBjb2RlIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoxNDU5Cittc2dpZCAidW5kZWZpbmVkIHZhcmlhYmxlIGluIFRZIgorbXNnc3RyICIiCisKKyMuIFBhc2NhbCBmaWxlIG5hbWUuICBGSVhNRS4KKyM6IGllZWUuYzoxODcwCittc2dpZCAiUGFzY2FsIGZpbGUgbmFtZSBub3Qgc3VwcG9ydGVkIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoxOTE4Cittc2dpZCAidW5zdXBwb3J0ZWQgcXVhbGlmZXIiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjIxODkKK21zZ2lkICJ1bmRlZmluZWQgdmFyaWFibGUgaW4gQVROIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyMjMyCittc2dpZCAidW5rbm93biBBVE4gdHlwZSIKK21zZ3N0ciAiIgorCisjLiBSZXNlcnZlZCBmb3IgRk9SVFJBTiBjb21tb24uCisjOiBpZWVlLmM6MjM1NAorbXNnaWQgInVuc3VwcG9ydGVkIEFUTjExIgorbXNnc3RyICIiCisKKyMuIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuCisjOiBpZWVlLmM6MjM4MQorbXNnaWQgInVuc3VwcG9ydGVkIEFUTjEyIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyNDQxCittc2dpZCAidW5leHBlY3RlZCBzdHJpbmcgaW4gQysrIG1pc2MiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI0NTQKK21zZ2lkICJiYWQgbWlzYyByZWNvcmQiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI0OTcKK21zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG1pc2MgcmVjb3JkIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyNjE0Cittc2dpZCAidW5kZWZpbmVkIEMrKyBvYmplY3QiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI2NDgKK21zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBzcGVjIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyNjg0Cittc2dpZCAidW5zdXBwb3J0ZWQgQysrIG9iamVjdCB0eXBlIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyNjk0Cittc2dpZCAiQysrIGJhc2UgY2xhc3Mgbm90IGRlZmluZWQiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI3MDYgaWVlZS5jOjI4MTEKK21zZ2lkICJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI3MjUKK21zZ2lkICJDKysgYmFzZSBjbGFzcyBub3QgZm91bmQgaW4gY29udGFpbmVyIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyODMyCittc2dpZCAiQysrIGRhdGEgbWVtYmVyIG5vdCBmb3VuZCBpbiBjb250YWluZXIiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI4NzMgaWVlZS5jOjMwMjMKK21zZ2lkICJ1bmtub3duIEMrKyB2aXNpYmlsaXR5IgorbXNnc3RyICIiCisKKyM6IGllZWUuYzoyOTA3Cittc2dpZCAiYmFkIEMrKyBmaWVsZCBiaXQgcG9zIG9yIHNpemUiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjI5OTkKK21zZ2lkICJiYWQgdHlwZSBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6MzAwOQorbXNnaWQgIm5vIHR5cGUgaW5mb3JtYXRpb24gZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iCittc2dzdHIgIiIKKworIzogaWVlZS5jOjMwNDgKK21zZ2lkICJDKysgc3RhdGljIHZpcnR1YWwgbWV0aG9kIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzozMTQzCittc2dpZCAidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgb3ZlcmhlYWQgc3BlYyIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6MzE4MgorbXNnaWQgInVuZGVmaW5lZCBDKysgdnRhYmxlIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzozMjUzCittc2dpZCAiQysrIGRlZmF1bHQgdmFsdWVzIG5vdCBpbiBhIGZ1bmN0aW9uIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzozMjkzCittc2dpZCAidW5yZWNvZ25pemVkIEMrKyBkZWZhdWx0IHR5cGUiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjMzMjQKK21zZ2lkICJyZWZlcmVuY2UgcGFyYW1ldGVyIGlzIG5vdCBhIHBvaW50ZXIiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjM0MDkKK21zZ2lkICJ1bnJlY29nbml6ZWQgQysrIHJlZmVyZW5jZSB0eXBlIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzozNDkxCittc2dpZCAiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjM0OTkKK21zZ2lkICJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzozNTI4IGllZWUuYzozNTM2Cittc2dpZCAibWlzc2luZyByZXF1aXJlZCBBU04iCittc2dzdHIgIiIKKworIzogaWVlZS5jOjM1NjYgaWVlZS5jOjM1NzQKK21zZ2lkICJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IgorbXNnc3RyICIiCisKKyM6IGllZWUuYzozNTg4Cittc2dpZCAiYmFkIEFUTjY1IHJlY29yZCIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6NDIzNQorbXNnaWQgIklFRUUgbnVtZXJpYyBvdmVyZmxvdzogMHgiCittc2dzdHIgIiIKKworIzogaWVlZS5jOjQyODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiSUVFRSBzdHJpbmcgbGVuZ3RoIG92ZXJmbG93OiAldVxuIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzo1MzE1CisjLCBjLWZvcm1hdAorbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgaW50ZWdlciB0eXBlIHNpemUgJXVcbiIKK21zZ3N0ciAiIgorCisjOiBpZWVlLmM6NTM1MQorIywgYy1mb3JtYXQKK21zZ2lkICJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIgorbXNnc3RyICIiCisKKyM6IGllZWUuYzo1Mzg3CisjLCBjLWZvcm1hdAorbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgY29tcGxleCB0eXBlIHNpemUgJXVcbiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6Mjc1IHNyY29udi5jOjE5NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MzI1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBpbnB1dCBmaWxlIG5hbWVkIGJvdGggb24gY29tbWFuZCBsaW5lIGFuZCB3aXRoIElOUFVUXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjMzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbm8gaW5wdXQgZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzozNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG5vIG5hbWUgZm9yIG91dHB1dCBmaWxlXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjM4MQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogd2FybmluZzppbnB1dCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIG5vdCBjb21wYXRpYmxlXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjQxMQorbXNnaWQgIm1ha2UgLmJzcyBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo0MjAKK21zZ2lkICJtYWtlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo0MjIKK21zZ2lkICJzZXQgLm5sbXNlY3Rpb25zIGZsYWdzIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo0NTAKK21zZ2lkICJzZXQgLmJzcyB2bWEiCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjQ1NworbXNnaWQgInNldCAuZGF0YSBzaXplIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo2MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHdhcm5pbmc6IHN5bWJvbCAlcyBpbXBvcnRlZCBidXQgbm90IGluIGltcG9ydCBsaXN0XG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjY1OAorbXNnaWQgInNldCBzdGFydCBhZGRyZXNzIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo3MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHdhcm5pbmc6IFNUQVJUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo3MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHdhcm5pbmc6IEVYSVQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjcxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogd2FybmluZzogQ0hFQ0sgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjczNiBubG1jb252LmM6OTI4Cittc2dpZCAiY3VzdG9tIHNlY3Rpb24iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjc1NyBubG1jb252LmM6OTYwCittc2dpZCAiaGVscCBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo3NzkgbmxtY29udi5jOjk3OQorbXNnaWQgIm1lc3NhZ2Ugc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6Nzk1IG5sbWNvbnYuYzoxMDEyCittc2dpZCAibW9kdWxlIHNlY3Rpb24iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjgxNSBubG1jb252LmM6MTAyOQorbXNnaWQgInJwYyBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo4NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6JXM6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgY2FuIG5vdCBoYXZlIHVuaW5pdGlhbGl6ZWQgZGF0YVxuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo4NzMgbmxtY29udi5jOjEwNDkKK21zZ2lkICJzaGFyZWQgc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6ODgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB3YXJuaW5nOiBObyB2ZXJzaW9uIG51bWJlciBnaXZlblxuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo5MjIgbmxtY29udi5jOjk1NCBubG1jb252LmM6OTczIG5sbWNvbnYuYzoxMDIzIG5sbWNvbnYuYzoxMDQzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiVzOiByZWFkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzo5NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHdhcm5pbmc6IE1BUCBhbmQgRlVMTE1BUCBhcmUgbm90IHN1cHBvcnRlZDsgdHJ5IGxkIC1NXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjExMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IENvbnZlcnQgYW4gb2JqZWN0IGZpbGUgaW50byBhIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjExMzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlVzYWdlOiAlcyBbLWRoVl0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLVQgaGVhZGVyLWZpbGVdIFstbCBsaW5rZXJdXG4iCisiICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdXG4iCisiICAgICAgIFstLWhlYWRlci1maWxlPWZpbGVdIFstLWxpbmtlcj1saW5rZXJdIFstLWRlYnVnXVxuIgorIiAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXVxuIgorIiAgICAgICBbaW4tZmlsZSBbb3V0LWZpbGVdXVxuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzoxMTczCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiBmb3IgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MTIxNgorbXNnaWQgIm1ha2Ugc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MTIzMAorbXNnaWQgInNldCBzZWN0aW9uIHNpemUiCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjEyMzYKK21zZ2lkICJzZXQgc2VjdGlvbiBhbGlnbm1lbnQiCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjEyNDAKK21zZ2lkICJzZXQgc2VjdGlvbiBmbGFncyIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MTI1MQorbXNnaWQgInNldCAubmxtc2VjdGlvbnMgc2l6ZSIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MTMzOSBubG1jb252LmM6MTM0NyBubG1jb252LmM6MTM1NiBubG1jb252LmM6MTM2MQorbXNnaWQgInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MTg2NAorbXNnaWQgInN0dWIgc2VjdGlvbiBzaXplcyIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MTkxMworbXNnaWQgIndyaXRpbmcgc3R1YiIKK21zZ3N0ciAiIgorCisjOiBubG1jb252LmM6MjAwMworIywgYy1mb3JtYXQKK21zZ2lkICIlczogdW5yZXNvbHZlZCBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0ICVzXG4iCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjIwNjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG92ZXJmbG93IHdoZW4gYWRqdXN0aW5nIHJlbG9jYXRpb24gYWdhaW5zdCAlc1xuIgorbXNnc3RyICIiCisKKyM6IG5sbWNvbnYuYzoyMTkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBleGVjdXRpb24gb2YgJXMgZmFpbGVkOiAiCittc2dzdHIgIiIKKworIzogbmxtY29udi5jOjIyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IEV4ZWN1dGlvbiBvZiAlcyBmYWlsZWRcbiIKK21zZ3N0ciAiIgorCisjOiBubS5jOjI5MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCisiICAgICAgIFstLWRlYnVnLXN5bXNdIFstLWV4dGVybi1vbmx5XSBbLS1wcmludC1hcm1hcF0gWy0tcHJpbnQtZmlsZS1uYW1lXVxuIgorIiAgICAgICBbLS1udW1lcmljLXNvcnRdIFstLW5vLXNvcnRdIFstLXJldmVyc2Utc29ydF0gWy0tc2l6ZS1zb3J0XVxuIgorIiAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuIgorIiAgICAgICBbLS1mb3JtYXQ9e2JzZCxzeXN2LHBvc2l4fV0gWy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXSBbLS1keW5hbWljXVxuIgorIiAgICAgICBbLS1kZWZpbmVkLW9ubHldIFstLWxpbmUtbnVtYmVyc11cbiIKKyIgICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cbiIKKyIgICAgICAgW2ZpbGUuLi5dXG4iCittc2dzdHIgIiIKKworIzogbm0uYzozMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6ICVzOiBpbnZhbGlkIHJhZGl4XG4iCittc2dzdHIgIiIKKworIzogbm0uYzozNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6ICVzOiBpbnZhbGlkIG91dHB1dCBmb3JtYXRcbiIKK21zZ3N0ciAiIgorCisjOiBubS5jOjQ5MAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogZGF0YSBzaXplICVsZFxuIgorbXNnc3RyICIiCisKKyM6IG5tLmM6MTI4MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiXG4iCisiVW5kZWZpbmVkIHN5bWJvbHMgZnJvbSAlczpcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBubS5jOjEyODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlxuIgorIlN5bWJvbHMgZnJvbSAlczpcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBubS5jOjEyODQgbm0uYzoxMzM4Cittc2dpZCAiIgorIk5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgICIKKyJTZWN0aW9uXG4iCisiXG4iCittc2dzdHIgIiIKKworIzogbm0uYzoxMzM1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJVbmRlZmluZWQgc3ltYm9scyBmcm9tICVzWyVzXTpcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBubS5jOjEzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlxuIgorIlN5bWJvbHMgZnJvbSAlc1slc106XG4iCisiXG4iCittc2dzdHIgIiIKKworIzogbm0uYzoxNTA4Cittc2dpZCAiIgorIlxuIgorIkFyY2hpdmUgaW5kZXg6XG4iCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjI5MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVXNhZ2U6ICVzIFstdlZTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1iIGJ5dGVdXG4iCisiICAgICAgIFstUiBzZWN0aW9uXSBbLWkgaW50ZXJsZWF2ZV0gWy0taW50ZXJsZWF2ZT1pbnRlcmxlYXZlXSBbLS1ieXRlPWJ5dGVdXG4iCisiICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdICIKKyJbLS10YXJnZXQ9YmZkbmFtZV1cbiIKKyIgICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuIgorIiAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0tZGVidWdnaW5nXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzozMDAKK21zZ2lkICIiCisiICAgICAgIFstLWdhcC1maWxsPXZhbF0gWy0tcGFkLXRvPWFkZHJlc3NdIFstLXByZXNlcnZlLWRhdGVzXVxuIgorIiAgICAgICBbLS1zZXQtc3RhcnQ9dmFsXSBcbiIKKyIgICAgICAgWy0tY2hhbmdlLXN0YXJ0PWluY3JdIFstLWNoYW5nZS1hZGRyZXNzZXM9aW5jcl0gXG4iCisiICAgICAgICgtLWFkanVzdC1zdGFydCAgIGFuZCAgLS1hZGp1c3Qtdm1hIGFyZSBhbGlhc2VzIGZvciB0aGVzZSB0d28pIFxuIgorIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzPXNlY3Rpb257PSwrLC19dmFsXVxuIgorIiAgICAgICAoLS1hZGp1c3Qtc2VjdGlvbi12bWEgaXMgYW4gYWxpYXMgZm9yIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcylcbiIKKyIgICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tbG1hPXNlY3Rpb257PSwrLC19dmFsXVxuIgorIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi12bWE9c2VjdGlvbns9LCssLX12YWxdXG4iCisiICAgICAgIFstLWFkanVzdC13YXJuaW5nc10gWy0tbm8tYWRqdXN0LXdhcm5pbmdzXVxuIgorIiAgICAgICBbLS1jaGFuZ2Utd2FybmluZ3NdIFstLW5vLWNoYW5nZS13YXJuaW5nc11cbiIKKyIgICAgICAgWy0tc2V0LXNlY3Rpb24tZmxhZ3M9c2VjdGlvbj1mbGFnc10gIgorIlstLWFkZC1zZWN0aW9uPXNlY3Rpb25uYW1lPWZpbGVuYW1lXVxuIgorIiAgICAgICBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdIFstLXN0cmlwLXN5bWJvbCBzeW1ib2xdIFstTiAiCisic3ltYm9sXVxuIgorIiAgICAgICBbLS1sb2NhbGl6ZS1zeW1ib2wgc3ltYm9sXSBbLUwgc3ltYm9sXSBbLS13ZWFrZW4tc3ltYm9sIHN5bWJvbF1cbiIKKyIgICAgICAgWy1XIHN5bWJvbF0gWy0tY2hhbmdlLWxlYWRpbmctY2hhcl0gWy0tcmVtb3ZlLWxlYWRpbmctY2hhcl0gIgorIlstLXdlYWtlbl1cbiIKKyIgICAgICAgWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gaW4tZmlsZSBbb3V0LWZpbGVdXG4iCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjMyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVXNhZ2U6ICVzIFstdlZzU3BneFhdIFstSSBiZmRuYW1lXSBbLU8gYmZkbmFtZV0gWy1GIGJmZG5hbWVdIFstUiBzZWN0aW9uXVxuIgorIiAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXSAiCisiWy0tdGFyZ2V0PWJmZG5hbWVdXG4iCisiICAgICAgIFstLXN0cmlwLWFsbF0gWy0tc3RyaXAtZGVidWddIFstLXN0cmlwLXVubmVlZGVkXSBbLS1kaXNjYXJkLWFsbF1cbiIKKyIgICAgICAgWy0tZGlzY2FyZC1sb2NhbHNdIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF1cbiIKKyIgICAgICAgWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OIHN5bWJvbF0gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cbiIKKyIgICAgICAgWy1vIGZpbGVdIFstLXByZXNlcnZlLWRhdGVzXSBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSAiCisiZmlsZS4uLlxuIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzozODMKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gZmxhZyBgJXMnIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzozODQKK21zZ2lkICJzdXBwb3J0ZWQgZmxhZ3M6IGFsbG9jLCBsb2FkLCByZWFkb25seSwgY29kZSwgZGF0YSwgcm9tLCBjb250ZW50cyIKK21zZ3N0ciAiIgorCisjOiBvYmpjb3B5LmM6NjIzCisjLCBjLWZvcm1hdAorbXNnaWQgImNvcHkgZnJvbSAlcyglcykgdG8gJXMoJXMpXG4iCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjY0MgorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBPdXRwdXQgZmlsZSBjYW5ub3QgcmVwcmVzZW50IGFyY2hpdGVjdHVyZSAlcyIKK21zZ3N0ciAiIgorCisjOiBvYmpjb3B5LmM6NjY5CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbid0IGNyZWF0ZSBzZWN0aW9uIGAlcyc6ICVzIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzo3NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgZmlsbCBnYXAgYWZ0ZXIgJXM6ICVzIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgYWRkIHBhZGRpbmcgdG8gJXM6ICVzIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzo5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGVycm9yIGNvcHlpbmcgcHJpdmF0ZSBCRkQgZGF0YTogJXMiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjk1MAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW5ub3QgbWtkaXIgJXMgZm9yIGFyY2hpdmUgY29weWluZyAoZXJyb3I6ICVzKSIKK21zZ3N0ciAiIgorCisjOiBvYmpjb3B5LmM6MTIwNAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogc2VjdGlvbiBgJXMnOiBlcnJvciBpbiAlczogJXMiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE0NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGNhbid0IGNyZWF0ZSBkZWJ1Z2dpbmcgc2VjdGlvbjogJXMiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE0OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGNhbid0IHNldCBkZWJ1Z2dpbmcgc2VjdGlvbiBjb250ZW50czogJXMiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE1MDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgJXMiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE2MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGNhbm5vdCBzdGF0OiAlcyIKK21zZ3N0ciAiIgorCisjOiBvYmpjb3B5LmM6MTY1NQorbXNnaWQgImJ5dGUgbnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxNjYwCittc2dpZCAiaW50ZXJsZWF2ZSBtdXN0IGJlIHBvc2l0aXZlIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxNzI5Cittc2dpZCAiYmFkIGZvcm1hdCBmb3IgLS1hZGQtc2VjdGlvbiBOQU1FPUZJTEVOQU1FIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxNzMyCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbm5vdCBzdGF0OiAlczogJXMiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE3NTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2Fubm90IG9wZW46ICVzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBvYmpjb3B5LmM6MTc1NAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogZnJlYWQgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxNzkxCisjLCBjLWZvcm1hdAorbXNnaWQgImJhZCBmb3JtYXQgZm9yICVzIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxODU1CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IHRydW5jYXRpbmcgZ2FwLWZpbGwgZnJvbSAweCVzIHRvIDB4JXgiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE4NzkKK21zZ2lkICJiYWQgZm9ybWF0IGZvciAtLXNldC1zZWN0aW9uLWZsYWdzIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxOTA5Cittc2dpZCAiYnl0ZSBudW1iZXIgbXVzdCBiZSBsZXNzIHRoYW4gaW50ZXJsZWF2ZSIKK21zZ3N0ciAiIgorCisjOiBvYmpjb3B5LmM6MTkyOAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc3RhdDogJXM6ICVzIgorbXNnc3RyICIiCisKKyM6IG9iamNvcHkuYzoxOTY4CisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tdm1hICVzJWMweCVzIG5ldmVyIHVzZWQiCittc2dzdHIgIiIKKworIzogb2JqY29weS5jOjE5ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi1sbWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MjE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgWy1haGlmQ2REcHJSdFR4c1Nsd10gWy1iIGJmZG5hbWVdIFstbSBtYWNoaW5lXSBbLWogc2VjdGlvbi1uYW1lXVxuIgorIiAgICAgICBbLS1hcmNoaXZlLWhlYWRlcnNdIFstLXRhcmdldD1iZmRuYW1lXSBbLS1kZWJ1Z2dpbmddIFstLWRpc2Fzc2VtYmxlXVxuIgorIiAgICAgICBbLS1kaXNhc3NlbWJsZS1hbGxdIFstLWRpc2Fzc2VtYmxlLXplcm9lc10gWy0tZmlsZS1oZWFkZXJzXVxuIgorIiAgICAgICBbLS1zZWN0aW9uLWhlYWRlcnNdIFstLWhlYWRlcnNdXG4iCisiICAgICAgIFstLWluZm9dIFstLXNlY3Rpb249c2VjdGlvbi1uYW1lXSBbLS1saW5lLW51bWJlcnNdIFstLXNvdXJjZV1cbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MjI2Cittc2dpZCAiIgorIiAgICAgICBbLS1hcmNoaXRlY3R1cmU9bWFjaGluZV0gWy0tcmVsb2NdIFstLWZ1bGwtY29udGVudHNdIFstLXN0YWJzXVxuIgorIiAgICAgICBbLS1zeW1zXSBbLS1hbGwtaGVhZGVyc10gWy0tZHluYW1pYy1zeW1zXSBbLS1keW5hbWljLXJlbG9jXVxuIgorIiAgICAgICBbLS13aWRlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbLS1wcml2YXRlLWhlYWRlcnNdXG4iCisiICAgICAgIFstLXN0YXJ0LWFkZHJlc3M9YWRkcl0gWy0tc3RvcC1hZGRyZXNzPWFkZHJdXG4iCisiICAgICAgIFstLXByZWZpeC1hZGRyZXNzZXNdIFstLVtuby1dc2hvdy1yYXctaW5zbl0gWy0tZGVtYW5nbGVdXG4iCisiICAgICAgIFstLWFkanVzdC12bWE9b2Zmc2V0XSBbLUVCfC1FTF0gWy0tZW5kaWFuPXtiaWd8bGl0dGxlfV0gb2JqZmlsZS4uLlxuIgorImF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyAtbCAoLS1saW5lLW51bWJlcnMpIG11c3QgYmUgZ2l2ZW5cbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MzYxCittc2dpZCAiU2VjdGlvbnM6XG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjM2MworbXNnaWQgIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgTE1BICAgICAgIEZpbGUgb2ZmICBBbGduXG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjM2NQorbXNnaWQgIiIKKyJJZHggTmFtZSAgICAgICAgICBTaXplICAgICAgVk1BICAgICAgICAgICAgICAgTE1BICAgICAgICAgICAgICAgRmlsZSBvZmYgICIKKyJBbGduXG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjQxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXM6IG5vdCBhIGR5bmFtaWMgb2JqZWN0XG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjQzMQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXM6IE5vIGR5bmFtaWMgc3ltYm9sc1xuIgorbXNnc3RyICIiCisKKyM6IG9iamR1bXAuYzoxMTMxCittc2dpZCAiT3V0IG9mIHZpcnR1YWwgbWVtb3J5XG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjE1MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IENhbid0IHVzZSBzdXBwbGllZCBtYWNoaW5lICVzXG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjE1NTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IENhbid0IGRpc2Fzc2VtYmxlIGZvciBhcmNoaXRlY3R1cmUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MTYyNworIywgYy1mb3JtYXQKK21zZ2lkICJEaXNhc3NlbWJseSBvZiBzZWN0aW9uICVzOlxuIgorbXNnc3RyICIiCisKKyM6IG9iamR1bXAuYzoxNzk4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJObyAlcyBzZWN0aW9uIHByZXNlbnRcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MTgwNQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXMgaGFzIG5vICVzIHNlY3Rpb25cbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MTgxOCBvYmpkdW1wLmM6MTgyOQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MTg3MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiQ29udGVudHMgb2YgJXMgc2VjdGlvbjpcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MTk3MQorIywgYy1mb3JtYXQKK21zZ2lkICJhcmNoaXRlY3R1cmU6ICVzLCAiCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjE5NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmxhZ3MgMHglMDh4OlxuIgorbXNnc3RyICIiCisKKyM6IG9iamR1bXAuYzoxOTg3Cittc2dpZCAiIgorIlxuIgorInN0YXJ0IGFkZHJlc3MgMHgiCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjIwMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiVzOiAgICAgZmlsZSBmb3JtYXQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MjA3MQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogcHJpbnRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZhaWxlZFxuIgorbXNnc3RyICIiCisKKyM6IG9iamR1bXAuYzoyMTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIkluIGFyY2hpdmUgJXM6XG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjIxNTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKK21zZ3N0ciAiIgorCisjOiBvYmpkdW1wLmM6MjY2MQorIywgYy1mb3JtYXQKK21zZ2lkICJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IG9iamR1bXAuYzoyNzg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgLUUgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogb2JqZHVtcC5jOjI3OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVucmVjb2duaXplZCAtLWVuZGlhbiB0eXBlIGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiByZGNvZmYuYzoyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iCittc2dzdHIgIiIKKworIzogcmRjb2ZmLmM6NDIzIHJkY29mZi5jOjUzMSByZGNvZmYuYzo3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHJkY29mZi5jOjQzOSByZGNvZmYuYzo3MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHJkY29mZi5jOjc5OAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJWxkOiAuYmYgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIKK21zZ3N0ciAiIgorCisjOiByZGNvZmYuYzo4NDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6ICVsZDogdW5leHBlY3RlZCAuZWZcbiIKK21zZ3N0ciAiIgorCisjOiByZGRiZy5jOjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBubyByZWNvZ25pemVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIiCisKKyM6IHJkZGJnLmM6NDAwCittc2dpZCAiTGFzdCBzdGFicyBlbnRyaWVzIGJlZm9yZSBlcnJvcjpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjI5IHJlYWRlbGYuYzoyNTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IEVycm9yOiAiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI0MSByZWFkZWxmLmM6MjcwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBXYXJuaW5nOiAiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjMwMCByZWFkZWxmLmM6MzI1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuaGFuZGxlZCBkYXRhIGxlbmd0aDogJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDIwCittc2dpZCAiRG9uJ3Qga25vdyBhYm91dCByZWxvY2F0aW9ucyBvbiB0aGlzIG1hY2hpbmUgYXJjaGl0ZWN0dXJlXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQyNgorbXNnaWQgIiIKKyIgIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWUgICAgICAgICAgIgorIkFkZGVuZFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0MjkKK21zZ2lkICIgIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWVcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NTMzCisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXNlZDogJS03bHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjU1MQorIywgYy1mb3JtYXQKK21zZ2lkICI8c3RyaW5nIHRhYmxlIGluZGV4ICUzbGQ+IgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo3MDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJvY2Vzc29yIFNwZWNpZmljOiAlbHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjcwNgorIywgYy1mb3JtYXQKK21zZ2lkICJPcGVyYXRpbmcgU3lzdGVtIHNwZWNpZmljOiAlbHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjcwOCByZWFkZWxmLmM6OTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIjx1bmtub3duPjogJWx4IgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo3MjIKK21zZ2lkICJOT05FIChOb25lKSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NzIzCittc2dpZCAiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NzI0Cittc2dpZCAiRVhFQyAoRXhlY3V0YWJsZSBmaWxlKSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NzI1Cittc2dpZCAiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo3MjYKK21zZ2lkICJDT1JFIChDb3JlIGZpbGUpIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo3MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo3MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiT1MgU3BlY2lmaWM6ICgleCkiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjczNCByZWFkZWxmLmM6NzkzIHJlYWRlbGYuYzo4OTcgcmVhZGVsZi5jOjEwNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHVua25vd24+OiAleCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NzQ3Cittc2dpZCAiTm9uZSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6ODk0Cittc2dpZCAiRUxGREFUQTJMU0IgKGxpdHRsZSBlbmRpYW4pIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo4OTUKK21zZ2lkICJFTEZEQVRBMk1TQiAoYmlnIGVuZGlhbikiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMDgKK21zZ2lkICJVc2FnZTogcmVhZGVsZiB7b3B0aW9uc30gZWxmLWZpbGUocylcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTEwOQorbXNnaWQgIiAgT3B0aW9ucyBhcmU6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMTAKK21zZ2lkICIiCisiICAtYSBvciAtLWFsbCAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TIC1zIC1yIC1kIC1WIC0taGlzdG9ncmFtXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMTEKK21zZ2lkICIgIC1oIG9yIC0tZmlsZS1oZWFkZXIgICAgICAgRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMTIKK21zZ2lkICIgIC1sIG9yIC0tcHJvZ3JhbS1oZWFkZXJzIG9yIC0tc2VnbWVudHNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTExMworbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIGhlYWRlcnNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTExNAorbXNnaWQgIiAgLVMgb3IgLS1zZWN0aW9uLWhlYWRlcnMgb3IgLS1zZWN0aW9uc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTE1Cittc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXJcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTExNgorbXNnaWQgIiAgLWUgb3IgLS1oZWFkZXJzICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtU1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTE3Cittc2dpZCAiICAtcyBvciAtLXN5bXMgb3IgLS1zeW1ib2xzIERpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTE4Cittc2dpZCAiICAtciBvciAtLXJlbG9jcyAgICAgICAgICAgIERpc3BsYXkgdGhlIHJlbG9jYXRpb25zIChpZiBwcmVzZW50KVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTE5Cittc2dpZCAiICAtZCBvciAtLWR5bmFtaWMgICAgICAgICAgIERpc3BsYXkgdGhlIGR5bmFtaWMgc2VnbWVudCAoaWYgcHJlc2VudClcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTEyMAorbXNnaWQgIiAgLVYgb3IgLS12ZXJzaW9uLWluZm8gICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIHNlY3Rpb25zIChpZiBwcmVzZW50KVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTIxCittc2dpZCAiIgorIiAgLUQgb3IgLS11c2UtZHluYW1pYyAgICAgICBVc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBpbmZvIHdoZW4gZGlzcGxheWluZyAiCisic3ltYm9sc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTIyCittc2dpZCAiICAteCA8bnVtYmVyPiBvciAtLWhleC1kdW1wPTxudW1iZXI+XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMjMKK21zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcCB0aGUgY29udGVudHMgb2Ygc2VjdGlvbiA8bnVtYmVyPlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTI0Cittc2dpZCAiICAtd1tsaWFwcl0gb3IgLS1kZWJ1Zy1kdW1wWz1saW5lLD1pbmZvLD1hYmJyZXYsPXB1Ym5hbWVzLD1yYW5nZXNdXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMjUKK21zZ2lkICIiCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIERXQVJGMiBkZWJ1ZyBzZWN0aW9uc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTI3Cittc2dpZCAiICAtaSA8bnVtYmVyPiBvciAtLWluc3RydWN0aW9uLWR1bXA9PG51bWJlcj5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTEyOAorbXNnaWQgIiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTEzMAorbXNnaWQgIiAgICAgICAgLS1oaXN0b2dyYW0gICAgICAgICBEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjExMzEKK21zZ2lkICIgIC12IG9yIC0tdmVyc2lvbiAgICAgICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgcmVhZGVsZlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTMyCittc2dpZCAiICAtSCBvciAtLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMTUwCittc2dpZCAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGR1bXAgcmVxdWVzdCB0YWJsZS4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEyNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5yZWNvZ25pc2VkIGRlYnVnIG9wdGlvbiAnJXMnXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEyOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBvcHRpb24gJy0lYydcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTMxMgorbXNnaWQgIk5vdGhpbmcgdG8gZG8uXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzMjMgcmVhZGVsZi5jOjEzMzYgcmVhZGVsZi5jOjI0NTkKK21zZ2lkICJub25lIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMzI0Cittc2dpZCAiRUxGMzIiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzMjUKK21zZ2lkICJFTEY2NCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTMyNiByZWFkZWxmLmM6MTMzOSByZWFkZWxmLmM6MTM1MgorbXNnaWQgIjx1bmtub3duPiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTMzNworbXNnaWQgIjIncyBjb21waWxtZW50LCBsaXR0bGUgZW5kaWFuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMzM4Cittc2dpZCAiMidzIGNvbXBpbG1lbnQsIGJpZyBlbmRpYW4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzNDkKK21zZ2lkICJVTklYIC0gU3lzdGVtIFYiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzNTAKK21zZ2lkICJVTklYIC0gSFAtVVgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzNTEKK21zZ2lkICJTdGFuZGFsb25lIEFwcCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTM2NgorbXNnaWQgIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzNzQKK21zZ2lkICJFTEYgSGVhZGVyOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxMzc1Cittc2dpZCAiICBNYWdpYzogICAiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDbGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzODEgcmVhZGVsZi5jOjEzOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBUeXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBNYWNoaW5lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjEzOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBFbnRyeSBwb2ludCBhZGRyZXNzOiAgICAgICAgICAgICAgIDB4JWx4XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE0MDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBTdGFydCBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICVsZCAoYnl0ZXMgaW50byBmaWxlKVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNDAzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAlbGQgKGJ5dGVzIGludG8gZmlsZSlcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTQwNQorIywgYy1mb3JtYXQKK21zZ2lkICIgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHglbHglc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNDA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNDEwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNDEyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTQxNAorIywgYy1mb3JtYXQKK21zZ2lkICIgIFNpemUgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTQxNgorIywgYy1mb3JtYXQKK21zZ2lkICIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE0MTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVsZFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNDI4Cittc2dpZCAiTm90IGEgMzIgYml0IEVMRiBmaWxlXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE0NDgKK21zZ2lkICIiCisiXG4iCisiVGhlcmUgYXJlIG5vIHByb2dyYW0gaGVhZGVycyBpbiB0aGlzIGZpbGUuXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE0NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIkVsZiBmaWxlIGlzICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE0NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW50cnkgcG9pbnQgMHglbHhcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTQ1NgorIywgYy1mb3JtYXQKK21zZ2lkICJUaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNDY5IHJlYWRlbGYuYzoxNjE5IHJlYWRlbGYuYzoxNjYyIHJlYWRlbGYuYzoyMDE4IHJlYWRlbGYuYzoyMTQyCisjOiByZWFkZWxmLmM6MzA0MyByZWFkZWxmLmM6MzA1NworbXNnaWQgIk91dCBvZiBtZW1vcnlcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTQ5MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiUHJvZ3JhbSBIZWFkZXIlczpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTQ5NAorbXNnaWQgIiIKKyIgIFR5cGUgICAgICAgIE9mZnNldCAgIFZpcnRBZGRyICAgUGh5c0FkZHIgICBGaWxlU2l6IE1lbVNpeiAgRmxnIEFsaWduXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE1MjkKK21zZ2lkICJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VnbWVudFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNTM3Cittc2dpZCAiVW5hYmxlIHRvIGZpbmQgcHJvZ3JhbSBpbnRlcnByZXRlciBuYW1lXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE1NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIiAgICAgIFtSZXF1ZXN0aW5nIHByb2dyYW0gaW50ZXJwcmV0ZXI6ICVzXSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTU2MgorbXNnaWQgIiIKKyJcbiIKKyIgU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE1NjMKK21zZ2lkICIgIFNlZ21lbnQgU2VjdGlvbnMuLi5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTY5NworbXNnaWQgIiIKKyJcbiIKKyJUaGVyZSBhcmUgbm8gc2VjdGlvbnMgaW4gdGhpcyBmaWxlLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNzAzCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAlbHg6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE3MzcKK21zZ2lkICJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxNzUwCittc2dpZCAiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN0cmluZyB0YWJsZXNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTc3NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU2VjdGlvbiBIZWFkZXIlczpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTc3OQorbXNnaWQgIiIKKyIgIFtOcl0gTmFtZSAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxnIExrICIKKyJJbmYgQWxcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTg0NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiUmVsb2NhdGlvbiBzZWN0aW9uIGF0IG9mZnNldCAweCVseCBjb250YWlucyAlbGQgYnl0ZXM6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE4NTEKK21zZ2lkICIiCisiXG4iCisiVGhlcmUgYXJlIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxODc3Cittc2dpZCAiIgorIlxuIgorIlJlbG9jYXRpb24gc2VjdGlvbiAiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjE4ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGF0IG9mZnNldCAweCVseCBjb250YWlucyAlbHUgZW50cmllczpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MTkxMAorbXNnaWQgIiIKKyJcbiIKKyJUaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoxOTk4Cittc2dpZCAiIgorIlxuIgorIlRoZXJlIGlzIG5vIGR5bmFtaWMgc2VnbWVudCBpbiB0aGlzIGZpbGUuXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIwNTYKK21zZ2lkICJVbmFibGUgdG8gc2VlayB0byBlbmQgb2YgZmlsZSEiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIwNjIKK21zZ2lkICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2FkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIwOTIKK21zZ2lkICJVbmFibGUgdG8gc2VlayB0byBlbmQgb2YgZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyMDk4Cittc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyMTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJEeW5hbWljIHNlZ21lbnQgYXQgb2Zmc2V0IDB4JXggY29udGFpbnMgJWQgZW50cmllczpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjE2MgorbXNnaWQgIiAgVGFnICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUvVmFsdWVcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjE2OQorIywgYy1mb3JtYXQKK21zZ2lkICIgIDB4JS04LjhseCAoJXMpJSpzIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyMTgyCittc2dpZCAiQXV4aWxpYXJ5IGxpYnJhcnkiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIxODQKK21zZ2lkICJGaWx0ZXIgbGlicmFyeSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjE5NiByZWFkZWxmLmM6MjIxNyByZWFkZWxmLmM6MjI0MworbXNnaWQgIkZsYWdzOiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjE5OCByZWFkZWxmLmM6MjIxOSByZWFkZWxmLmM6MjI0NQorbXNnaWQgIiBOb25lXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIzNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2hhcmVkIGxpYnJhcnk6IFslc10iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIzNTMKK21zZ2lkICIgcHJvZ3JhbSBpbnRlcnByZXRlclxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyMzU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkxpYnJhcnkgc29uYW1lOiBbJXNdXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjIzNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGlicmFyeSBycGF0aDogWyVzXVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNDEzCisjLCBjLWZvcm1hdAorbXNnaWQgIk5vdCBuZWVkZWQgb2JqZWN0OiBbJXNdXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1MDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1MDgKK21zZ2lkICIgIEFkZHI6IDB4IgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNTEwIHJlYWRlbGYuYzoyNjk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAlIzA2eDogUmV2OiAlZCAgRmxhZ3M6ICVzIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNTQzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgSW5kZXg6ICVkICBDbnQ6ICVkICAiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTmFtZTogJXNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjU1NgorIywgYy1mb3JtYXQKK21zZ2lkICJOYW1lIGluZGV4OiAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjU3MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAlIzA2eDogUGFyZW50ICVkLCBuYW1lIGluZGV4OiAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MjU5MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiVmVyc2lvbiBuZWVkcyBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1OTYKK21zZ2lkICIgQWRkcjogMHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI1OTgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBPZmZzZXQ6ICUjMDhseCAgTGluayB0byBzZWN0aW9uOiAlbGQgKCVzKVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgJSMwNng6IFZlcnNpb246ICVkIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgRmlsZTogJXMiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI2MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBGaWxlOiAlbHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI2MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDbnQ6ICVkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI2NDkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAlIzA2eDogTmFtZTogJXMiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI2NTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAlIzA2eDogTmFtZSBpbmRleDogJWx4IgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNjk0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJWZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI2OTcKK21zZ2lkICIgQWRkcjogIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNzI2Cittc2dpZCAiICAgMCAoKmxvY2FsKikgICAgIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyNzMwCittc2dpZCAiICAgMSAoKmdsb2JhbCopICAgIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyOTUzCittc2dpZCAiIgorIlxuIgorIk5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQgaW4gdGhpcyBmaWxlLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyOTY2Cittc2dpZCAiTE9DQUwiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI5NjcKK21zZ2lkICJHTE9CQUwiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI5NjgKK21zZ2lkICJXRUFLIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyOTcxIHJlYWRlbGYuYzoyOTk1CisjLCBjLWZvcm1hdAorbXNnaWQgIjxwcm9jZXNzb3Igc3BlY2lmaWM+OiAlZCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mjk3MyByZWFkZWxmLmM6Mjk5NworIywgYy1mb3JtYXQKK21zZ2lkICI8T1Mgc3BlY2lmaWM+OiAlZCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mjk3NSByZWFkZWxmLmM6Mjk5OQorIywgYy1mb3JtYXQKK21zZ2lkICI8dW5rbm93bj46ICVkIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyOTg4Cittc2dpZCAiTk9UWVBFIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyOTg5Cittc2dpZCAiT0JKRUNUIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzoyOTkwCittc2dpZCAiRlVOQyIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mjk5MQorbXNnaWQgIlNFQ1RJT04iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjI5OTIKK21zZ2lkICJGSUxFIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMDQ5Cittc2dpZCAiVW5hYmxlIHRvIHJlYWQgaW4gZHluYW1pYyBkYXRhXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjMwOTEKK21zZ2lkICJVbmFibGUgdG8gc2VlayB0byBzdGFydCBvZiBkeW5hbWljIGluZm9ybWF0aW9uIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMDk3Cittc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW4gbnVtYmVyIG9mIGJ1Y2tldHNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzEwMworbXNnaWQgIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBjaGFpbnNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzEyMworbXNnaWQgIiIKKyJcbiIKKyJTeW1ib2wgdGFibGUgZm9yIGltYWdlOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMTI0Cittc2dpZCAiICBOdW0gQnVjOiAgICBWYWx1ZSAgU2l6ZSAgIFR5cGUgICBCaW5kIE90IE5keCBOYW1lXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjMxNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlN5bWJvbCB0YWJsZSAnJXMnIGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMTcyCittc2dpZCAiICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIE90ICBOZHggTmFtZVxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMjkxCittc2dpZCAiYmFkIGR5bmFtaWMgc3ltYm9sIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMzUwCittc2dpZCAiIgorIlxuIgorIkR5bmFtaWMgc3ltYm9sIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRpc3BsYXlpbmcgc3ltYm9scy5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzM2MgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiSGlzdG9ncmFtIGZvciBidWNrZXQgbGlzdCBsZW5ndGggKHRvdGFsIG9mICVkIGJ1Y2tldHMpOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozMzY0Cittc2dpZCAiIExlbmd0aCAgTnVtYmVyICAgICAlJSBvZiB0b3RhbCAgQ292ZXJhZ2VcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzM2OSByZWFkZWxmLmM6MzM4OCByZWFkZWxmLmM6NTI3MSByZWFkZWxmLmM6NTQ2MQorbXNnaWQgIk91dCBvZiBtZW1vcnkiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM0MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIkR5bmFtaWMgaW5mbyBzZWdtZW50IGF0IG9mZnNldCAweCVseCBjb250YWlucyAlZCBlbnRyaWVzOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNDM3Cittc2dpZCAiIE51bTogTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kVG8gICAgIEZsYWdzXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM0ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJTZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzUxMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiSGV4IGR1bXAgb2Ygc2VjdGlvbiAnJXMnOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNjYzCittc2dpZCAiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNjcwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgRXh0ZW5kZWQgb3Bjb2RlICVkOiAiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM2NzUKK21zZ2lkICIiCisiRW5kIG9mIFNlcXVlbmNlXG4iCisiXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM2ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAic2V0IEFkZHJlc3MgdG8gMHglbHhcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzY4NworbXNnaWQgIiAgZGVmaW5lIG5ldyBGaWxlIFRhYmxlIGVudHJ5XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM2ODggcmVhZGVsZi5jOjM4MDYKK21zZ2lkICIgIEVudHJ5XHREaXJcdFRpbWVcdFNpemVcdE5hbWVcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzY5MAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAlZFx0IgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNjkzIHJlYWRlbGYuYzozNjk1IHJlYWRlbGYuYzozNjk3IHJlYWRlbGYuYzozODE4IHJlYWRlbGYuYzozODIwCisjOiByZWFkZWxmLmM6MzgyMgorIywgYy1mb3JtYXQKK21zZ2lkICIlbHVcdCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzY5OAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiJXNcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzcwMgorIywgYy1mb3JtYXQKK21zZ2lkICJVTktOT1dOOiBsZW5ndGggJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzcyNAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiRHVtcCBvZiBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgorIlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNzM2Cittc2dpZCAiVGhlIGxpbmUgaW5mbyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQgLSB0aGUgc2VjdGlvbiBpcyB0b28gc21hbGxcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc0NAorbXNnaWQgIk9ubHkgRFdBUkYgdmVyc2lvbiAyIGxpbmUgaW5mbyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNzU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIERXQVJGIFZlcnNpb246ICAgICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIFByb2xndWUgTGVuZ3RoOiAgICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIE1pbmltdW0gSW5zdHJ1Y3Rpb24gTGVuZ3RoOiAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2MworIywgYy1mb3JtYXQKK21zZ2lkICIgIEluaXRpYWwgdmFsdWUgb2YgJ2lzX3N0bXQnOiAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2NAorIywgYy1mb3JtYXQKK21zZ2lkICIgIExpbmUgQmFzZTogICAgICAgICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2NQorIywgYy1mb3JtYXQKK21zZ2lkICIgIExpbmUgUmFuZ2U6ICAgICAgICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc2NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIE9wY29kZSBCYXNlOiAgICAgICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc3NQorbXNnaWQgIiIKKyJcbiIKKyIgT3Bjb2RlczpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzc3OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIE9wY29kZSAlZCBoYXMgJWQgYXJnc1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNzg0Cittc2dpZCAiIgorIlxuIgorIiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNzg3Cittc2dpZCAiIgorIlxuIgorIiBUaGUgRGlyZWN0b3J5IFRhYmxlOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozNzkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgJXNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzgwMgorbXNnaWQgIiIKKyJcbiIKKyIgVGhlIEZpbGUgTmFtZSBUYWJsZSBpcyBlbXB0eS5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzgwNQorbXNnaWQgIiIKKyJcbiIKKyIgVGhlIEZpbGUgTmFtZSBUYWJsZTpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzgxMworIywgYy1mb3JtYXQKK21zZ2lkICIgICVkXHQiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM4MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXNcbiIKK21zZ3N0ciAiIgorCisjLiBOb3cgZGlzcGxheSB0aGUgc3RhdGVtZW50cy4KKyM6IHJlYWRlbGYuYzozODMyCittc2dpZCAiIgorIlxuIgorIiBMaW5lIE51bWJlciBTdGF0ZW1lbnRzOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozODUwCittc2dpZCAiICBDb3B5XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM4NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBBZHZhbmNlIFBDIGJ5ICVkIHRvICVseFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozODY1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgQWR2YW5jZSBMaW5lIGJ5ICVkIHRvICVkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM4NzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzg4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIFNldCBjb2x1bW4gdG8gJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzg4NworIywgYy1mb3JtYXQKK21zZ2lkICIgIFNldCBpc19zdG10IHRvICVkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM4OTIKK21zZ2lkICIgIFNldCBiYXNpYyBibG9ja1xuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozODk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgQWR2YW5jZSBQQyBieSBjb25zdGFudCAlZCB0byAweCVseFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozOTA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgQWR2YW5jZSBQQyBieSBmaXhlZCBzaXplIGFtb3VudCAlZCB0byAweCVseFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzozOTE1CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgU3BlY2lhbCBvcGNvZGUgJWQ6IGFkdmFuY2UgQWRkcmVzcyBieSAlZCB0byAweCVseCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6MzkxOQorIywgYy1mb3JtYXQKK21zZ2lkICIgYW5kIExpbmUgYnkgJWQgdG8gJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzk0MiByZWFkZWxmLmM6NDM2MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiQ29udGVudHMgb2YgdGhlICVzIHNlY3Rpb246XG4iCisiXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM5NjEKK21zZ2lkICJPbmx5IERXQVJGIDIgcHVibmFtZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM5NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjM5NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzk2OQorIywgYy1mb3JtYXQKK21zZ2lkICIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvIHNlY3Rpb246ICAgICAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzk3MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIFNpemUgb2YgYXJlYSBpbiAuZGVidWdfaW5mbyBzZWN0aW9uOiAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6Mzk3NAorbXNnaWQgIiIKKyJcbiIKKyIgICAgT2Zmc2V0XHROYW1lXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQwNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biBUQUcgdmFsdWU6ICVseCIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDE1MQorIywgYy1mb3JtYXQKK21zZ2lkICJVbmtub3duIEFUIHZhbHVlOiAlbHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQxODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biBGT1JNIHZhbHVlOiAlbHgiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQzNjcKK21zZ2lkICIgIE51bWJlciBUQUdcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDM3MworIywgYy1mb3JtYXQKK21zZ2lkICIgICAlbGQgICAgICAlcyAgICBbJXNdXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQzNzYKK21zZ2lkICJoYXMgY2hpbGRyZW4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQzNzYKK21zZ2lkICJubyBjaGlsZHJlbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDM4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgJS0xOHMgJXNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDM5OQorIywgYy1mb3JtYXQKK21zZ2lkICIgJWx1IGJ5dGUgYmxvY2s6ICIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDU2OAorbXNnaWQgIihVc2VyIGRlZmluZWQgbG9jYXRpb24gb3ApIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0NTcwCittc2dpZCAiKFVua25vd24gbG9jYXRpb24gb3ApIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0Njg3CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuYWJsZSB0byBoYW5kbGUgRk9STTogJWQiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ2OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5yZWNvZ25pc2VkIGZvcm06ICVkIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0NzA0Cittc2dpZCAiKG5vdCBpbmxpbmVkKSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDcwNQorbXNnaWQgIihpbmxpbmVkKSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDcwNgorbXNnaWQgIihkZWNsYXJlZCBhcyBpbmxpbmUgYnV0IGlnbm9yZWQpIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0NzA3Cittc2dpZCAiKGRlY2xhcmVkIGFzIGlubGluZSBhbmQgaW5saW5lZCkiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ3MDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAoVW5rbm93biBpbmxpbmUgYXR0cmlidXRlIHZhbHVlOiAlbHgpIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0ODM4IHJlYWRlbGYuYzo0OTYyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgc2VjdGlvbiAlcyBjb250YWluczpcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDg2MAorbXNnaWQgIk9ubHkgdmVyc2lvbiAyIERXQVJGIGRlYnVnIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ4NjQKK21zZ2lkICIgIENvbXBpbGF0aW9uIFVuaXQ6XG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ4NjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgTGVuZ3RoOiAgICAgICAgJWxkXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ4NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgVmVyc2lvbjogICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDg2NworIywgYy1mb3JtYXQKK21zZ2lkICIgICBBYmJyZXYgT2Zmc2V0OiAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDg2OAorIywgYy1mb3JtYXQKK21zZ2lkICIgICBQb2ludGVyIFNpemU6ICAlZFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0ODg4Cittc2dpZCAiVW5hYmxlIHRvIGxvY2F0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24hXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ5MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5hYmxlIHRvIGxvY2F0ZSBlbnRyeSAlZCBpbiB0aGUgYWJicmV2aWF0aW9uIHRhYmxlXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ5MzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIDwlZD48JXg+OiBBYmJyZXYgTnVtYmVyOiAlZCAoJXMpXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjQ5ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICVsZFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0OTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAlZFxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo0OTgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm86ICAlbHhcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDk4MworIywgYy1mb3JtYXQKK21zZ2lkICIgIFBvaW50ZXIgU2l6ZTogICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDk4NAorIywgYy1mb3JtYXQKK21zZ2lkICIgIFNlZ21lbnQgU2l6ZTogICAgICAgICAgICAgJWRcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NDk4NgorbXNnaWQgIiIKKyJcbiIKKyIgICAgQWRkcmVzcyAgTGVuZ3RoXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjUwMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGlzcGxheWluZyB0aGUgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlcyBpcyBub3QgeWV0IHN1cHBvcnRlZC5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NTA2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU2VjdGlvbiAnJXMnIGhhcyBubyBkZWJ1Z2dpbmcgZGF0YS5cbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NTA3OQorIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbmlzZWQgZGVidWcgc2VjdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NTExOAorbXNnaWQgIlNvbWUgc2VjdGlvbnMgd2VyZSBub3QgZHVtcGVkIGJlY2F1c2UgdGhleSBkbyBub3QgZXhpc3QhXG4iCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjUyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo1NDU0Cittc2dpZCAiY29uZmxpY3QgbGlzdCB3aXRoIHdpdGhvdXQgdGFibGUiCittc2dzdHIgIiIKKworIzogcmVhZGVsZi5jOjU0ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNlY3Rpb24gJy5jb25mbGljdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NTQ4MworbXNnaWQgIiAgTnVtOiAgICBJbmRleCAgICAgICBWYWx1ZSAgTmFtZSIKK21zZ3N0ciAiIgorCisjOiByZWFkZWxmLmM6NTU2MAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3Qgc3RhdCBpbnB1dCBmaWxlICVzLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo1NTY3CisjLCBjLWZvcm1hdAorbXNnaWQgIklucHV0IGZpbGUgJXMgbm90IGZvdW5kLlxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo1NTczCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBGYWlsZWQgdG8gcmVhZCBmaWxlIGhlYWRlclxuIgorbXNnc3RyICIiCisKKyM6IHJlYWRlbGYuYzo1NTg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJGaWxlOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHJlbmFtZS5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogY2Fubm90IHNldCB0aW1lOiAlcyIKK21zZ3N0ciAiIgorCisjLiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuCisjOiByZW5hbWUuYzoxNjAgcmVuYW1lLmM6MTkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiByZW5hbWU6ICVzIgorbXNnc3RyICIiCisKKyM6IHJlbmFtZS5jOjIwMQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogc2ltcGxlX2NvcHk6ICVzIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbm90IGVub3VnaCBiaW5hcnkgZGF0YSIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoxNDkKK21zZ2lkICJudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmciCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MTc5IHJlc2Jpbi5jOjE4NQorbXNnaWQgInJlc291cmNlIElEIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjIyOQorbXNnaWQgImN1cnNvciIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoyNjMgcmVzYmluLmM6MjcwCittc2dpZCAibWVudSBoZWFkZXIiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MjgwCittc2dpZCAibWVudWV4IGhlYWRlciIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoyODQKK21zZ2lkICJtZW51ZXggb2Zmc2V0IgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjI5MQorIywgYy1mb3JtYXQKK21zZ2lkICJ1bnN1cHBvcnRlZCBtZW51IHZlcnNpb24gJWQiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MzE5IHJlc2Jpbi5jOjMzNCByZXNiaW4uYzo0MDAKK21zZ2lkICJtZW51aXRlbSBoZWFkZXIiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NDMwCittc2dpZCAibWVudWl0ZW0iCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NDcxIHJlc2Jpbi5jOjQ5OQorbXNnaWQgImRpYWxvZyBoZWFkZXIiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NDg5CisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgZGlhbG9nIHNpZ25hdHVyZSAlZCIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzo1MzEKK21zZ2lkICJkaWFsb2cgZm9udCBwb2ludCBzaXplIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjUzOQorbXNnaWQgImRpYWxvZ2V4IGZvbnQgaW5mb3JtYXRpb24iCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NTY0IHJlc2Jpbi5jOjU4MgorbXNnaWQgImRpYWxvZyBjb250cm9sIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjU3NAorbXNnaWQgImRpYWxvZ2V4IGNvbnRyb2wiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NjAzCittc2dpZCAiZGlhbG9nIGNvbnRyb2wgZW5kIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjYxNQorbXNnaWQgImRpYWxvZyBjb250cm9sIGRhdGEiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NjU4Cittc2dpZCAic3RyaW5ndGFibGUgc3RyaW5nIGxlbmd0aCIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzo2NjgKK21zZ2lkICJzdHJpbmd0YWJsZSBzdHJpbmciCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NzAxCittc2dpZCAiZm9udGRpciBoZWFkZXIiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6NzE0Cittc2dpZCAiZm9udGRpciIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzo3MzAKK21zZ2lkICJmb250ZGlyIGRldmljZSBuYW1lIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjczNgorbXNnaWQgImZvbnRkaXIgZmFjZSBuYW1lIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjc3OQorbXNnaWQgImFjY2VsZXJhdG9yIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjg0MworbXNnaWQgImdyb3VwIGN1cnNvciBoZWFkZXIiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6ODQ3CisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgZ3JvdXAgY3Vyc29yIHR5cGUgJWQiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6ODYyCittc2dpZCAiZ3JvdXAgY3Vyc29yIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjkwMQorbXNnaWQgImdyb3VwIGljb24gaGVhZGVyIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjkwNQorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmV4cGVjdGVkIGdyb3VwIGljb24gdHlwZSAlZCIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzo5MjAKK21zZ2lkICJncm91cCBpY29uIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjk5MSByZXNiaW4uYzoxMjEwCittc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoxMDI1CisjLCBjLWZvcm1hdAorbXNnaWQgInZlcnNpb24gbGVuZ3RoICVkIGRvZXMgbm90IG1hdGNoIHJlc291cmNlIGxlbmd0aCAlbHUiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MTAyOQorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gdHlwZSAlZCIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoxMDQxCisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBsZW5ndGggJWQiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MTA0NAorbXNnaWQgImZpeGVkIHZlcnNpb24gaW5mbyIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoxMDQ4CisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBzaWduYXR1cmUgJWx1IgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjEwNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm8gdmVyc2lvbiAlbHUiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MTA4MQorbXNnaWQgInZlcnNpb24gdmFyIGluZm8iCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MTA5OAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmV4cGVjdGVkIHN0cmluZ2ZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoxMTA4CisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmd0YWJsZSB2YWx1ZSBsZW5ndGggJWQiCittc2dzdHIgIiIKKworIzogcmVzYmluLmM6MTE0MgorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCAhPSAlZCArICVkIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjExNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgPCAlZCIKK21zZ3N0ciAiIgorCisjOiByZXNiaW4uYzoxMTcwCisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgdmFyZmlsZWluZm8gdmFsdWUgbGVuZ3RoICVkIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjExODkKK21zZ2lkICJ2ZXJzaW9uIHZhcmZpbGVpbmZvIgorbXNnc3RyICIiCisKKyM6IHJlc2Jpbi5jOjEyMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHZhbHVlIGxlbmd0aCAlZCIKK21zZ3N0ciAiIgorCisjOiByZXNjb2ZmLmM6MTI4Cittc2dpZCAiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgaW5wdXQiCittc2dzdHIgIiIKKworIzogcmVzY29mZi5jOjE0NQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXM6IG5vIHJlc291cmNlIHNlY3Rpb25cbiIKK21zZ3N0ciAiIgorCisjOiByZXNjb2ZmLmM6MTU0Cittc2dpZCAiY2FuJ3QgcmVhZCByZXNvdXJjZSBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IHJlc2NvZmYuYzoxODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6ICVzOiBhZGRyZXNzIG91dCBvZiBib3VuZHMiCittc2dzdHIgIiIKKworIzogcmVzY29mZi5jOjE5OQorbXNnaWQgImRpcmVjdG9yeSIKK21zZ3N0ciAiIgorCisjOiByZXNjb2ZmLmM6MjI3Cittc2dpZCAibmFtZWQgZGlyZWN0b3J5IGVudHJ5IgorbXNnc3RyICIiCisKKyM6IHJlc2NvZmYuYzoyMzYKK21zZ2lkICJkaXJlY3RvcnkgZW50cnkgbmFtZSIKK21zZ3N0ciAiIgorCisjOiByZXNjb2ZmLmM6MjU2Cittc2dpZCAibmFtZWQgc3ViZGlyZWN0b3J5IgorbXNnc3RyICIiCisKKyM6IHJlc2NvZmYuYzoyNjQKK21zZ2lkICJuYW1lZCByZXNvdXJjZSIKK21zZ3N0ciAiIgorCisjOiByZXNjb2ZmLmM6Mjc5Cittc2dpZCAiSUQgZGlyZWN0b3J5IGVudHJ5IgorbXNnc3RyICIiCisKKyM6IHJlc2NvZmYuYzoyOTYKK21zZ2lkICJJRCBzdWJkaXJlY3RvcnkiCittc2dzdHIgIiIKKworIzogcmVzY29mZi5jOjMwNAorbXNnaWQgIklEIHJlc291cmNlIgorbXNnc3RyICIiCisKKyM6IHJlc2NvZmYuYzozMzAKK21zZ2lkICJyZXNvdXJjZSB0eXBlIHVua25vd24iCittc2dzdHIgIiIKKworIzogcmVzY29mZi5jOjMzMworbXNnaWQgImRhdGEgZW50cnkiCittc2dzdHIgIiIKKworIzogcmVzY29mZi5jOjM0MQorbXNnaWQgInJlc291cmNlIGRhdGEiCittc2dzdHIgIiIKKworIzogcmVzY29mZi5jOjM0NgorbXNnaWQgInJlc291cmNlIGRhdGEgc2l6ZSIKK21zZ3N0ciAiIgorCisjOiByZXNjb2ZmLmM6NDQxCittc2dpZCAiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgb3V0cHV0IgorbXNnc3RyICIiCisKKyM6IHJlc2NvZmYuYzo3MjkKK21zZ2lkICJjYW4ndCBnZXQgQkZEX1JFTE9DX1JWQSByZWxvY2F0aW9uIHR5cGUiCittc2dzdHIgIiIKKworIzogcmVzcmMuYzoxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FuJ3QgcG9wZW4gYCVzJzogJXMiCittc2dzdHIgIiIKKworIzogcmVzcmMuYzoxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHdhcm5pbmc6IHByZXByb2Nlc3NvciBmYWlsZWRcbiIKK21zZ3N0ciAiIgorCisjOiByZXNyYy5jOjIwOAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogdW5leHBlY3RlZCBFT0YiCittc2dzdHIgIiIKKworIzogcmVzcmMuYzoyNjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHJlYWQgb2YgJWx1IHJldHVybmVkICVsdSIKK21zZ3N0ciAiIgorCisjOiByZXNyYy5jOjMwNyByZXNyYy5jOjUzOCByZXNyYy5jOjgxMSByZXNyYy5jOjk2NQorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0IGZhaWxlZCBvbiBiaXRtYXAgZmlsZSBgJXMnOiAlcyIKK21zZ3N0ciAiIgorCisjOiByZXNyYy5jOjM2MAorIywgYy1mb3JtYXQKK21zZ2lkICJjdXJzb3IgZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gY3Vyc29yIGRhdGEiCittc2dzdHIgIiIKKworIzogcmVzcmMuYzozOTIgcmVzcmMuYzo2ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIgorbXNnc3RyICIiCisKKyM6IHJlc3JjLmM6NjUxCisjLCBjLWZvcm1hdAorbXNnaWQgImljb24gZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gaWNvbiBkYXRhIgorbXNnc3RyICIiCisKKyM6IHJlc3JjLmM6MTE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiCittc2dzdHIgIiIKKworIzogc2l6ZS5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgWy1BQmRveFZdIFstLWZvcm1hdD1iZXJrZWxleXxzeXN2XSBbLS1yYWRpeD04fDEwfDE2XVxuIgorIiAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2ZpbGUuLi5dXG4iCittc2dzdHIgIiIKKworIzogc2l6ZS5jOjgzCittc2dpZCAiZGVmYXVsdCBpcyAtLWZvcm1hdD1iZXJrZWxleVxuIgorbXNnc3RyICIiCisKKyM6IHNpemUuYzo4NQorbXNnaWQgImRlZmF1bHQgaXMgLS1mb3JtYXQ9c3lzdlxuIgorbXNnc3RyICIiCisKKyM6IHNpemUuYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBhcmd1bWVudCB0byAtLWZvcm1hdDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBzaXplLmM6MTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgcmFkaXg6ICVzXG4iCittc2dzdHIgIiIKKworIzogc3Jjb252LmM6MTg3OQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJXMgWy1kaFZxXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIKK21zZ3N0ciAiIgorCisjOiBzcmNvbnYuYzoxODg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBDb252ZXJ0IGEgQ09GRiBvYmplY3QgZmlsZSBpbnRvIGEgU1lTUk9GRiBvYmplY3QgZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IHNyY29udi5jOjIwMjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iCittc2dzdHIgIiIKKworIzogc3RhYnMuYzozNDkgc3RhYnMuYzoxNzYyCittc2dpZCAibnVtZXJpYyBvdmVyZmxvdyIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjM2MAorIywgYy1mb3JtYXQKK21zZ2lkICJCYWQgc3RhYjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjM3MAorIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiAlczogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjQ5MgorbXNnaWQgIk5fTEJSQUMgbm90IHdpdGhpbiBmdW5jdGlvblxuIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6NTMxCittc2dpZCAiVG9vIG1hbnkgTl9SQlJBQ3NcbiIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjc4MAorbXNnaWQgInVua25vd24gQysrIGVuY29kZWQgbmFtZSIKK21zZ3N0ciAiIgorCisjLiBDb21wbGFpbiBhbmQga2VlcCBnb2luZywgc28gY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3CisjLiBjcm9zcy1yZWZlcmVuY2UgdHlwZXMuCisjOiBzdGFicy5jOjEzMDYKK21zZ2lkICJ1bnJlY29nbml6ZWQgY3Jvc3MgcmVmZXJlbmNlIHR5cGUiCittc2dzdHIgIiIKKworIy4gRG9lcyB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVuPyAgSXMgdGhhdCB3aHkgd2UgYXJlIHdvcnJ5aW5nCisjLiBhYm91dCBkZWFsaW5nIHdpdGggaXQgcmF0aGVyIHRoYW4ganVzdCBjYWxsaW5nIGVycm9yX3R5cGU/CisjOiBzdGFicy5jOjE4NTQKK21zZ2lkICJtaXNzaW5nIGluZGV4IHR5cGUiCittc2dzdHIgIiIKKworIzogc3RhYnMuYzoyMTgxCittc2dpZCAidW5rbm93biB2aXJ0dWFsIGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6MjE5OQorbXNnaWQgInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjIzOTEKK21zZ2lkICJ1bm5hbWVkICR2YiB0eXBlIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6MjM5NworbXNnaWQgInVucmVjb2duaXplZCBDKysgYWJicmV2aWF0aW9uIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6MjQ3NworbXNnaWQgInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGZpZWxkIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6MjczMworbXNnaWQgImNvbnN0L3ZvbGF0aWxlIGluZGljYXRvciBtaXNzaW5nIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6Mjk3MworIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYW5nbGluZyBmb3IgXCIlc1wiXG4iCittc2dzdHIgIiIKKworIzogc3RhYnMuYzozMjg2Cittc2dpZCAiVW5kZWZpbmVkIE5fRVhDTCIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjMzNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVHlwZSBmaWxlIG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIKK21zZ3N0ciAiIgorCisjOiBzdGFicy5jOjMzNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiVHlwZSBpbmRleCBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iCittc2dzdHIgIiIKKworIzogc3RhYnMuYzozNDY2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXplZCBYQ09GRiB0eXBlICVkXG4iCittc2dzdHIgIiIKKworIzogc3RhYnMuYzozNzY1CisjLCBjLWZvcm1hdAorbXNnaWQgImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IHN0YWJzLmM6Mzg2MQorbXNnaWQgIm5vIGFyZ3VtZW50IHR5cGVzIGluIG1hbmdsZWQgc3RyaW5nXG4iCittc2dzdHIgIiIKKworIzogc3RyaW5ncy5jOjE1OQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogaW52YWxpZCBudW1iZXIgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBzdHJpbmdzLmM6NDk0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBzdHJpbmdzLmM6NTA1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG4iCisiICAgICAgIFstLWFsbF0gWy0tcHJpbnQtZmlsZS1uYW1lXSBbLS1ieXRlcz1taW4tbGVuXSBbLS1yYWRpeD17byx4LGR9XVxuIgorIiAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0taGVscF0gWy0tdmVyc2lvbl0gZmlsZS4uLlxuIgorbXNnc3RyICIiCisKKyM6IHN5c2R1bXAuYzo3MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIKK21zZ3N0ciAiIgorCisjOiBzeXNkdW1wLmM6NzgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iCittc2dzdHIgIiIKKworIzogdmVyc2lvbi5jOjM5Cittc2dpZCAiQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCittc2dzdHIgIiIKKworIzogdmVyc2lvbi5jOjQwCittc2dpZCAiIgorIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKKyJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCittc2dzdHIgIiIKKworIzogd2luZHJlcy5jOjIyOAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBvcGVuICVzIGAlcyc6ICVzIgorbXNnc3RyICIiCisKKyM6IHdpbmRyZXMuYzo0MDcKK21zZ2lkICI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iCittc2dzdHIgIiIKKworIzogd2luZHJlcy5jOjQxOQorbXNnaWQgIjogZXhwZWN0ZWQgdG8gYmUgYSBsZWFmXG4iCittc2dzdHIgIiIKKworIzogd2luZHJlcy5jOjQyOAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogd2FybmluZzogIgorbXNnc3RyICIiCisKKyM6IHdpbmRyZXMuYzo0MzAKK21zZ2lkICI6IGR1cGxpY2F0ZSB2YWx1ZVxuIgorbXNnc3RyICIiCisKKyM6IHdpbmRyZXMuYzo1OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IHdpbmRyZXMuYzo1OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHN1cHBvcnRlZCBmb3JtYXRzOiIKK21zZ3N0ciAiIgorCisjLiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuCisjOiB3aW5kcmVzLmM6NjgxCisjLCBjLWZvcm1hdAorbXNnaWQgImNhbiBub3QgZGV0ZXJtaW5lIHR5cGUgb2YgZmlsZSBgJXMnOyB1c2UgdGhlIC1JIG9wdGlvbiIKK21zZ3N0ciAiIgorCisjOiB3aW5kcmVzLmM6Njk1CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiAlcyBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV1cbiIKK21zZ3N0ciAiIgorCisjOiB3aW5kcmVzLmM6Njk3Cittc2dpZCAiIgorIk9wdGlvbnM6XG4iCisiICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG4iCisiICAtbyBGSUxFLCAtLW91dHB1dCBGSUxFICAgICAgTmFtZSBvdXRwdXQgZmlsZVxuIgorIiAgLUkgRk9STUFULCAtLWlucHV0LWZvcm1hdCBGT1JNQVRcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuIgorIiAgLU8gRk9STUFULCAtLW91dHB1dC1mb3JtYXQgRk9STUFUXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBvdXRwdXQgZm9ybWF0XG4iCisiICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuIgorIiAgLS1wcmVwcm9jZXNzb3IgUFJPR1JBTSAgICAgIFByb2dyYW0gdG8gdXNlIHRvIHByZXByb2Nlc3MgcmMgZmlsZVxuIgorIiAgLS1pbmNsdWRlLWRpciBESVIgICAgICAgICAgIEluY2x1ZGUgZGlyZWN0b3J5IHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG4iCisiICAtLWRlZmluZSBTWU1bPVZBTF0gICAgICAgICAgRGVmaW5lIFNZTSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuIgorIiAgLS1sYW5ndWFnZSBWQUwgICAgICAgICAgICAgIFNldCBsYW5ndWFnZSB3aGVuIHJlYWRpbmcgcmMgZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IHdpbmRyZXMuYzo3MTEKK21zZ2lkICIgIC0teXlkZWJ1ZyAgICAgICAgICAgICAgICAgICBUdXJuIG9uIHBhcnNlciBkZWJ1Z2dpbmdcbiIKK21zZ3N0ciAiIgorCisjOiB3aW5kcmVzLmM6NzE0Cittc2dpZCAiIgorIiAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgIFByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iCisiICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIiCisKKyM6IHdpbmRyZXMuYzo3MTcKK21zZ2lkICIiCisiRk9STUFUIGlzIG9uZSBvZiByYywgcmVzLCBvciBjb2ZmLCBhbmQgaXMgZGVkdWNlZCBmcm9tIHRoZSBmaWxlIG5hbWVcbiIKKyJleHRlbnNpb24gaWYgbm90IHNwZWNpZmllZC4gIEEgc2luZ2xlIGZpbGUgbmFtZSBpcyBhbiBpbnB1dCBmaWxlLlxuIgorIk5vIGlucHV0LWZpbGUgaXMgc3RkaW4sIGRlZmF1bHQgcmMuICBObyBvdXRwdXQtZmlsZSBpcyBzdGRvdXQsIGRlZmF1bHQgcmMuXG4iCittc2dzdHIgIiIKKworIzogd2luZHJlcy5jOjkxOAorbXNnaWQgIm5vIHJlc291cmNlcyIKK21zZ3N0ciAiIgorCisjOiB3cnN0YWJzLmM6MzY2IHdyc3RhYnMuYzoyMDI4CisjLCBjLWZvcm1hdAorbXNnaWQgInN0cmluZ19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVzXG4iCittc2dzdHIgIiIKKworIzogd3JzdGFicy5jOjY2NgorIywgYy1mb3JtYXQKK21zZ2lkICJzdGFiX2ludF90eXBlOiBiYWQgc2l6ZSAldVxuIgorbXNnc3RyICIiCisKKyM6IHdyc3RhYnMuYzoxNDY4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB3YXJuaW5nOiB1bmtub3duIHNpemUgZm9yIGZpZWxkIGAlcycgaW4gc3RydWN0XG4iCittc2dzdHIgIiIKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3ByZGJnLmMgYi9iaW51dGlscy9wcmRiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OGNiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9wcmRiZy5jCkBAIC0wLDAgKzEsMTg2MiBAQAorLyogcHJkYmcuYyAtLSBQcmludCBvdXQgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHByaW50cyBvdXQgdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBieQorICAgc3VwcGx5aW5nIGEgc2V0IG9mIHJvdXRpbmVzIHRvIGRlYnVnX3dyaXRlLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImJ1ZGJnLmgiCisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSB1c2UgYXMgYSBoYW5kbGUgZm9yIHRoZXNlIHJvdXRpbmVzLiAgKi8KKworc3RydWN0IHByX2hhbmRsZQoreworICAvKiBGaWxlIHRvIHByaW50IGluZm9ybWF0aW9uIHRvLiAgKi8KKyAgRklMRSAqZjsKKyAgLyogQ3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCisgIHVuc2lnbmVkIGludCBpbmRlbnQ7CisgIC8qIFR5cGUgc3RhY2suICAqLworICBzdHJ1Y3QgcHJfc3RhY2sgKnN0YWNrOworICAvKiBQYXJhbWV0ZXIgbnVtYmVyIHdlIGFyZSBhYm91dCB0byBvdXRwdXQuICAqLworICBpbnQgcGFyYW1ldGVyOworfTsKKworLyogVGhlIHR5cGUgc3RhY2suICAqLworCitzdHJ1Y3QgcHJfc3RhY2sKK3sKKyAgLyogTmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjay4gICovCisgIHN0cnVjdCBwcl9zdGFjayAqbmV4dDsKKyAgLyogVGhpcyBlbGVtZW50LiAgKi8KKyAgY2hhciAqdHlwZTsKKyAgLyogQ3VycmVudCB2aXNpYmlsaXR5IG9mIGZpZWxkcyBpZiB0aGlzIGlzIGEgY2xhc3MuICAqLworICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKyAgLyogTmFtZSBvZiB0aGUgY3VycmVudCBtZXRob2Qgd2UgYXJlIGhhbmRsaW5nLiAgKi8KKyAgY29uc3QgY2hhciAqbWV0aG9kOworfTsKKworc3RhdGljIHZvaWQgaW5kZW50IFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOworc3RhdGljIGJvb2xlYW4gcHVzaF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBwcmVwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGFwcGVuZF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdWJzdGl0dXRlX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGluZGVudF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOworc3RhdGljIGNoYXIgKnBvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBwcl9oYW5kbGUgKikpOworc3RhdGljIHZvaWQgcHJpbnRfdm1hIFBBUkFNUyAoKGJmZF92bWEsIGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gcHJfZml4X3Zpc2liaWxpdHkKKyAgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKKworc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9lbXB0eV90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gcHJfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gcHJfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHByX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIHByX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOworc3RhdGljIGJvb2xlYW4gcHJfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBwcl9lbnVtX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKK3N0YXRpYyBib29sZWFuIHByX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIHByX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHByX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gcHJfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gcHJfYXJyYXlfdHlwZQorICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gcHJfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIHByX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9jb25zdF90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gcHJfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIHByX3N0YXJ0X3N0cnVjdF90eXBlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOworc3RhdGljIGJvb2xlYW4gcHJfc3RydWN0X2ZpZWxkCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKK3N0YXRpYyBib29sZWFuIHByX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIHByX3N0YXJ0X2NsYXNzX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAorCSAgIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZW1iZXIKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7CitzdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19iYXNlY2xhc3MKKyAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKK3N0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gcHJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbiwKKwkgICBiZmRfdm1hLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gcHJfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIHByX2VuZF9jbGFzc190eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gcHJfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBwcl90YWdfdHlwZQorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOworc3RhdGljIGJvb2xlYW4gcHJfdHlwZGVmIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBwcl90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIHByX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOworc3RhdGljIGJvb2xlYW4gcHJfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHByX3ZhcmlhYmxlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fcGFyYW1ldGVyCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBwcl9saW5lbm8gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgcHJfZm5zID0KK3sKKyAgcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKKyAgcHJfc3RhcnRfc291cmNlLAorICBwcl9lbXB0eV90eXBlLAorICBwcl92b2lkX3R5cGUsCisgIHByX2ludF90eXBlLAorICBwcl9mbG9hdF90eXBlLAorICBwcl9jb21wbGV4X3R5cGUsCisgIHByX2Jvb2xfdHlwZSwKKyAgcHJfZW51bV90eXBlLAorICBwcl9wb2ludGVyX3R5cGUsCisgIHByX2Z1bmN0aW9uX3R5cGUsCisgIHByX3JlZmVyZW5jZV90eXBlLAorICBwcl9yYW5nZV90eXBlLAorICBwcl9hcnJheV90eXBlLAorICBwcl9zZXRfdHlwZSwKKyAgcHJfb2Zmc2V0X3R5cGUsCisgIHByX21ldGhvZF90eXBlLAorICBwcl9jb25zdF90eXBlLAorICBwcl92b2xhdGlsZV90eXBlLAorICBwcl9zdGFydF9zdHJ1Y3RfdHlwZSwKKyAgcHJfc3RydWN0X2ZpZWxkLAorICBwcl9lbmRfc3RydWN0X3R5cGUsCisgIHByX3N0YXJ0X2NsYXNzX3R5cGUsCisgIHByX2NsYXNzX3N0YXRpY19tZW1iZXIsCisgIHByX2NsYXNzX2Jhc2VjbGFzcywKKyAgcHJfY2xhc3Nfc3RhcnRfbWV0aG9kLAorICBwcl9jbGFzc19tZXRob2RfdmFyaWFudCwKKyAgcHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAorICBwcl9jbGFzc19lbmRfbWV0aG9kLAorICBwcl9lbmRfY2xhc3NfdHlwZSwKKyAgcHJfdHlwZWRlZl90eXBlLAorICBwcl90YWdfdHlwZSwKKyAgcHJfdHlwZGVmLAorICBwcl90YWcsCisgIHByX2ludF9jb25zdGFudCwKKyAgcHJfZmxvYXRfY29uc3RhbnQsCisgIHByX3R5cGVkX2NvbnN0YW50LAorICBwcl92YXJpYWJsZSwKKyAgcHJfc3RhcnRfZnVuY3Rpb24sCisgIHByX2Z1bmN0aW9uX3BhcmFtZXRlciwKKyAgcHJfc3RhcnRfYmxvY2ssCisgIHByX2VuZF9ibG9jaywKKyAgcHJfZW5kX2Z1bmN0aW9uLAorICBwcl9saW5lbm8KK307CisMCisvKiBQcmludCBvdXQgdGhlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlY29yZGVkIGluIGRoYW5kbGUuICAqLworCitib29sZWFuCitwcmludF9kZWJ1Z2dpbmdfaW5mbyAoZiwgZGhhbmRsZSkKKyAgICAgRklMRSAqZjsKKyAgICAgUFRSIGRoYW5kbGU7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgaW5mbzsKKworICBpbmZvLmYgPSBmOworICBpbmZvLmluZGVudCA9IDA7CisgIGluZm8uc3RhY2sgPSBOVUxMOworICBpbmZvLnBhcmFtZXRlciA9IDA7CisKKyAgcmV0dXJuIGRlYnVnX3dyaXRlIChkaGFuZGxlLCAmcHJfZm5zLCAoUFRSKSAmaW5mbyk7Cit9CisMCisvKiBJbmRlbnQgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuICAqLworCitzdGF0aWMgdm9pZAoraW5kZW50IChpbmZvKQorICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+aW5kZW50OyBpKyspCisgICAgcHV0YyAoJyAnLCBpbmZvLT5mKTsKK30KKworLyogUHVzaCBhIHR5cGUgb24gdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgYm9vbGVhbgorcHVzaF90eXBlIChpbmZvLCB0eXBlKQorICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICp0eXBlOworeworICBzdHJ1Y3QgcHJfc3RhY2sgKm47CisKKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbiA9IChzdHJ1Y3QgcHJfc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbWVtc2V0IChuLCAwLCBzaXplb2YgKm4pOworCisgIG4tPnR5cGUgPSB4c3RyZHVwICh0eXBlKTsKKyAgbi0+dmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOworICBuLT5tZXRob2QgPSBOVUxMOworICBuLT5uZXh0ID0gaW5mby0+c3RhY2s7CisgIGluZm8tPnN0YWNrID0gbjsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUHJlcGVuZCBhIHN0cmluZyBvbnRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJlcGVuZF90eXBlIChpbmZvLCBzKQorICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICpzOworeworICBjaGFyICpuOworCisgIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7CisKKyAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIDEpOworICBzcHJpbnRmIChuLCAiJXMlcyIsIHMsIGluZm8tPnN0YWNrLT50eXBlKTsKKyAgZnJlZSAoaW5mby0+c3RhY2stPnR5cGUpOworICBpbmZvLT5zdGFjay0+dHlwZSA9IG47CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgdHlwZSBvbiB0aGUgdG9wIG9mIHRoZSB0eXBlIHN0YWNrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2FwcGVuZF90eXBlIChpbmZvLCBzKQorICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICpzOworeworICB1bnNpZ25lZCBpbnQgbGVuOworCisgIGlmIChzID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7CisKKyAgbGVuID0gc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSk7CisgIGluZm8tPnN0YWNrLT50eXBlID0gKGNoYXIgKikgeHJlYWxsb2MgKGluZm8tPnN0YWNrLT50eXBlLAorCQkJCQkgbGVuICsgc3RybGVuIChzKSArIDEpOworICBzdHJjcHkgKGluZm8tPnN0YWNrLT50eXBlICsgbGVuLCBzKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2UgdXNlIGFuIHVuZGVyc2NvcmUgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIG5hbWUgc2hvdWxkIGdvIGluIGEgdHlwZQorICAgc3RyaW5nLiAgVGhpcyBmdW5jdGlvbiBzdWJzdGl0dXRlcyBhIHN0cmluZyBmb3IgdGhlIHVuZGVyc2NvcmUuICBJZgorICAgdGhlcmUgaXMgbm8gdW5kZXJzY29yZSwgdGhlIG5hbWUgZm9sbG93cyB0aGUgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpCisgICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKnM7Cit7CisgIGNoYXIgKnU7CisKKyAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKKworICB1ID0gc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJ3wnKTsKKyAgaWYgKHUgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpuOworCisgICAgICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgKyBzdHJsZW4gKHMpKTsKKworICAgICAgbWVtY3B5IChuLCBpbmZvLT5zdGFjay0+dHlwZSwgdSAtIGluZm8tPnN0YWNrLT50eXBlKTsKKyAgICAgIHN0cmNweSAobiArICh1IC0gaW5mby0+c3RhY2stPnR5cGUpLCBzKTsKKyAgICAgIHN0cmNhdCAobiwgdSArIDEpOworCisgICAgICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7CisgICAgICBpbmZvLT5zdGFjay0+dHlwZSA9IG47CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBpZiAoc3RyY2hyIChzLCAnfCcpICE9IE5VTEwKKyAgICAgICYmIChzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAneycpICE9IE5VTEwKKwkgIHx8IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICcoJykgIT0gTlVMTCkpCisgICAgeworICAgICAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAiKCIpCisJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiKSIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCpzID09ICdcMCcpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgIiAiKQorCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIHMpKTsKK30KKworLyogSW5kZW50IHRoZSB0eXBlIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGJ5IGFwcGVuZGluZyBzcGFjZXMuICAqLworCitzdGF0aWMgYm9vbGVhbgoraW5kZW50X3R5cGUgKGluZm8pCisgICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBQb3AgYSB0eXBlIGZyb20gdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgY2hhciAqCitwb3BfdHlwZSAoaW5mbykKKyAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKK3sKKyAgc3RydWN0IHByX3N0YWNrICpvOworICBjaGFyICpyZXQ7CisKKyAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKKworICBvID0gaW5mby0+c3RhY2s7CisgIGluZm8tPnN0YWNrID0gby0+bmV4dDsKKyAgcmV0ID0gby0+dHlwZTsKKyAgZnJlZSAobyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogUHJpbnQgYSBWTUEgdmFsdWUgaW50byBhIHN0cmluZy4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF92bWEgKHZtYSwgYnVmLCB1bnNpZ25lZHAsIGhleHApCisgICAgIGJmZF92bWEgdm1hOworICAgICBjaGFyICpidWY7CisgICAgIGJvb2xlYW4gdW5zaWduZWRwOworICAgICBib29sZWFuIGhleHA7Cit7CisgIGlmIChzaXplb2YgKHZtYSkgPD0gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKKyAgICB7CisgICAgICBpZiAoaGV4cCkKKwlzcHJpbnRmIChidWYsICIweCVseCIsICh1bnNpZ25lZCBsb25nKSB2bWEpOworICAgICAgZWxzZSBpZiAodW5zaWduZWRwKQorCXNwcmludGYgKGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKSB2bWEpOworICAgICAgZWxzZQorCXNwcmludGYgKGJ1ZiwgIiVsZCIsIChsb25nKSB2bWEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1ZlswXSA9ICcwJzsKKyAgICAgIGJ1ZlsxXSA9ICd4JzsKKyAgICAgIHNwcmludGZfdm1hIChidWYgKyAyLCB2bWEpOworICAgIH0KK30KKwwKKy8qIFN0YXJ0IGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCAocCwgZmlsZW5hbWUpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisKKyAgYXNzZXJ0IChpbmZvLT5pbmRlbnQgPT0gMCk7CisKKyAgZnByaW50ZiAoaW5mby0+ZiwgIiVzOlxuIiwgZmlsZW5hbWUpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFydCBhIHNvdXJjZSBmaWxlIHdpdGhpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKworICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKKworICBmcHJpbnRmIChpbmZvLT5mLCAiICVzOlxuIiwgZmlsZW5hbWUpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9lbXB0eV90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisKKyAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgIjx1bmRlZmluZWQ+Iik7Cit9CisKKy8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl92b2lkX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKworICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAidm9pZCIpOworfQorCisvKiBQdXNoIGFuIGludGVnZXIgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCisgICAgIFBUUiBwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyIGFiWzEwXTsKKworICBzcHJpbnRmIChhYiwgIiVzaW50JWQiLCB1bnNpZ25lZHAgPyAidSIgOiAiIiwgc2l6ZSAqIDgpOworICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCBhYik7Cit9CisKKy8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfZmxvYXRfdHlwZSAocCwgc2l6ZSkKKyAgICAgUFRSIHA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciBhYlsxMF07CisKKyAgaWYgKHNpemUgPT0gNCkKKyAgICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiZmxvYXQiKTsKKyAgZWxzZSBpZiAoc2l6ZSA9PSA4KQorICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJkb3VibGUiKTsKKworICBzcHJpbnRmIChhYiwgImZsb2F0JWQiLCBzaXplICogOCk7CisgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKK30KKworLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKKyAgICAgUFRSIHA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKworICBpZiAoISBwcl9mbG9hdF90eXBlIChwLCBzaXplKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHByZXBlbmRfdHlwZSAoaW5mbywgImNvbXBsZXggIik7Cit9CisKKy8qIFB1c2ggYSBib29sZWFuIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9ib29sX3R5cGUgKHAsIHNpemUpCisgICAgIFBUUiBwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgYWJbMTBdOworCisgIHNwcmludGYgKGFiLCAiYm9vbCVkIiwgc2l6ZSAqIDgpOworCisgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKK30KKworLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9lbnVtX3R5cGUgKHAsIHRhZywgbmFtZXMsIHZhbHVlcykKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICAgY29uc3QgY2hhciAqKm5hbWVzOworICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgdW5zaWduZWQgaW50IGk7CisgIGJmZF9zaWduZWRfdm1hIHZhbDsKKworICBpZiAoISBwdXNoX3R5cGUgKGluZm8sICJlbnVtICIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHRhZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpCisJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAieyAiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG5hbWVzID09IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIvKiB1bmRlZmluZWQgKi8iKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFsID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IG5hbWVzW2ldICE9IE5VTEw7IGkrKykKKwl7CisJICBpZiAoaSA+IDApCisJICAgIHsKKwkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiwgIikpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgbmFtZXNbaV0pKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmICh2YWx1ZXNbaV0gIT0gdmFsKQorCSAgICB7CisJICAgICAgY2hhciBhYlsyMF07CisKKwkgICAgICBwcmludF92bWEgKHZhbHVlc1tpXSwgYWIsIGZhbHNlLCBmYWxzZSk7CisJICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgPSAiKQorCQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIHZhbCA9IHZhbHVlc1tpXTsKKwkgICAgfQorCisJICArK3ZhbDsKKwl9CisgICAgfQorCisgIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgIiB9Iik7Cit9CisKKy8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgcG9pbnRlci4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9wb2ludGVyX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciAqczsKKworICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOworCisgIHMgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOworICBpZiAocyAhPSBOVUxMICYmIHNbMV0gPT0gJ1snKQorICAgIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIoKnwpIik7CisgIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIqfCIpOworfQorCisvKiBUdXJuIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaW50byBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGF0IHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCisgICAgIFBUUiBwOworICAgICBpbnQgYXJnY291bnQ7CisgICAgIGJvb2xlYW4gdmFyYXJnczsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgKiphcmdfdHlwZXM7CisgIHVuc2lnbmVkIGludCBsZW47CisgIGNoYXIgKnM7CisKKyAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKKworICBsZW4gPSAxMDsKKworICBpZiAoYXJnY291bnQgPD0gMCkKKyAgICB7CisgICAgICBhcmdfdHlwZXMgPSBOVUxMOworICAgICAgbGVuICs9IDE1OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7CisgICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7CisJICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOworCX0KKyAgICAgIGlmICh2YXJhcmdzKQorCWxlbiArPSA1OworICAgIH0KKworICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KKworICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKKyAgc3RyY3B5IChzLCAiKHwpICgiKTsKKworICBpZiAoYXJnY291bnQgPCAwKQorICAgIHN0cmNhdCAocywgIi8qIHVua25vd24gKi8iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKKwl7CisJICBpZiAoaSA+IDApCisJICAgIHN0cmNhdCAocywgIiwgIik7CisJICBzdHJjYXQgKHMsIGFyZ190eXBlc1tpXSk7CisJfQorICAgICAgaWYgKHZhcmFyZ3MpCisJeworCSAgaWYgKGkgPiAwKQorCSAgICBzdHJjYXQgKHMsICIsICIpOworCSAgc3RyY2F0IChzLCAiLi4uIik7CisJfQorICAgICAgaWYgKGFyZ2NvdW50ID4gMCkKKwlmcmVlIChhcmdfdHlwZXMpOworICAgIH0KKworICBzdHJjYXQgKHMsICIpIik7CisKKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZnJlZSAocyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgcmVmZXJlbmNlIHRvIHRoYXQgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9yZWZlcmVuY2VfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworCisgIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7CisKKyAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiZ8Iik7Cit9CisKKy8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX3JhbmdlX3R5cGUgKHAsIGxvd2VyLCB1cHBlcikKKyAgICAgUFRSIHA7CisgICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOworICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXTsKKworICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOworCisgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQorICAgIHJldHVybiBmYWxzZTsKKworICBwcmludF92bWEgKGxvd2VyLCBhYmwsIGZhbHNlLCBmYWxzZSk7CisgIHByaW50X3ZtYSAodXBwZXIsIGFidSwgZmFsc2UsIGZhbHNlKTsKKworICByZXR1cm4gKHByZXBlbmRfdHlwZSAoaW5mbywgInJhbmdlICgiKQorCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIpOiIpCisJICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgYWJsKQorCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICI6IikKKwkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYnUpKTsKK30KKworLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorcHJfYXJyYXlfdHlwZSAocCwgbG93ZXIsIHVwcGVyLCBzdHJpbmdwKQorICAgICBQVFIgcDsKKyAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7CisgICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOworICAgICBib29sZWFuIHN0cmluZ3A7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyICpyYW5nZV90eXBlOworICBjaGFyIGFibFsyMF0sIGFidVsyMF0sIGFiWzUwXTsKKworICByYW5nZV90eXBlID0gcG9wX3R5cGUgKGluZm8pOworICBpZiAocmFuZ2VfdHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobG93ZXIgPT0gMCkKKyAgICB7CisgICAgICBpZiAodXBwZXIgPT0gLTEpCisJc3ByaW50ZiAoYWIsICJ8W10iKTsKKyAgICAgIGVsc2UKKwl7CisJICBwcmludF92bWEgKHVwcGVyICsgMSwgYWJ1LCBmYWxzZSwgZmFsc2UpOworCSAgc3ByaW50ZiAoYWIsICJ8WyVzXSIsIGFidSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIHByaW50X3ZtYSAodXBwZXIsIGFidSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIHNwcmludGYgKGFiLCAifFslczolc10iLCBhYmwsIGFidSk7CisgICAgfQorCisgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgYWIpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoc3RyY21wIChyYW5nZV90eXBlLCAiaW50IikgIT0gMCkKKyAgICB7CisgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQorCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgcmFuZ2VfdHlwZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoc3RyaW5ncCkKKyAgICB7CisgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiBzdHJpbmcgKi8iKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBNYWtlIGEgc2V0IHR5cGUuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitwcl9zZXRfdHlwZSAocCwgYml0c3RyaW5ncCkKKyAgICAgUFRSIHA7CisgICAgIGJvb2xlYW4gYml0c3RyaW5ncDsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisKKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInNldCB7ICIpCisgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJpdHN0cmluZ3ApCisgICAgeworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIvKiBiaXRzdHJpbmcgKi8iKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBNYWtlIGFuIG9mZnNldCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX29mZnNldF90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgKnQ7CisKKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHQgPSBwb3BfdHlwZSAoaW5mbyk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiAoc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikKKwkgICYmIHByZXBlbmRfdHlwZSAoaW5mbywgIiAiKQorCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCB0KQorCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICI6OnwiKSk7Cit9CisKKy8qIE1ha2UgYSBtZXRob2QgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9tZXRob2RfdHlwZSAocCwgZG9tYWluLCBhcmdjb3VudCwgdmFyYXJncykKKyAgICAgUFRSIHA7CisgICAgIGJvb2xlYW4gZG9tYWluOworICAgICBpbnQgYXJnY291bnQ7CisgICAgIGJvb2xlYW4gdmFyYXJnczsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIHVuc2lnbmVkIGludCBsZW47CisgIGNoYXIgKmRvbWFpbl90eXBlOworICBjaGFyICoqYXJnX3R5cGVzOworICBjaGFyICpzOworCisgIGxlbiA9IDEwOworCisgIGlmICghIGRvbWFpbikKKyAgICBkb21haW5fdHlwZSA9IE5VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBkb21haW5fdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKKyAgICAgIGlmIChkb21haW5fdHlwZSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChzdHJuY21wIChkb21haW5fdHlwZSwgImNsYXNzICIsIHNpemVvZiAiY2xhc3MgIiAtIDEpID09IDAKKwkgICYmIHN0cmNociAoZG9tYWluX3R5cGUgKyBzaXplb2YgImNsYXNzICIgLSAxLCAnICcpID09IE5VTEwpCisJZG9tYWluX3R5cGUgKz0gc2l6ZW9mICJjbGFzcyAiIC0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAidW5pb24gY2xhc3MgIiwKKwkJCXNpemVvZiAidW5pb24gY2xhc3MgIikgPT0gMAorCSAgICAgICAmJiAoc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAidW5pb24gY2xhc3MgIiAtIDEsICcgJykKKwkJICAgPT0gTlVMTCkpCisJZG9tYWluX3R5cGUgKz0gc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMTsKKyAgICAgIGxlbiArPSBzdHJsZW4gKGRvbWFpbl90eXBlKTsKKyAgICB9CisKKyAgaWYgKGFyZ2NvdW50IDw9IDApCisgICAgeworICAgICAgYXJnX3R5cGVzID0gTlVMTDsKKyAgICAgIGxlbiArPSAxNTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgYXJnX3R5cGVzID0gKGNoYXIgKiopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdfdHlwZXMpOworICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYXJnX3R5cGVzW2ldID0gcG9wX3R5cGUgKGluZm8pOworCSAgaWYgKGFyZ190eXBlc1tpXSA9PSBOVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBsZW4gKz0gc3RybGVuIChhcmdfdHlwZXNbaV0pICsgMjsKKwl9CisgICAgICBpZiAodmFyYXJncykKKwlsZW4gKz0gNTsKKyAgICB9CisKKyAgLyogTm93IHRoZSByZXR1cm4gdHlwZSBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCisKKyAgcyA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7CisgIGlmICghIGRvbWFpbikKKyAgICAqcyA9ICdcMCc7CisgIGVsc2UKKyAgICBzdHJjcHkgKHMsIGRvbWFpbl90eXBlKTsKKyAgc3RyY2F0IChzLCAiOjp8ICgiKTsKKworICBpZiAoYXJnY291bnQgPCAwKQorICAgIHN0cmNhdCAocywgIi8qIHVua25vd24gKi8iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKKwl7CisJICBpZiAoaSA+IDApCisJICAgIHN0cmNhdCAocywgIiwgIik7CisJICBzdHJjYXQgKHMsIGFyZ190eXBlc1tpXSk7CisJfQorICAgICAgaWYgKHZhcmFyZ3MpCisJeworCSAgaWYgKGkgPiAwKQorCSAgICBzdHJjYXQgKHMsICIsICIpOworCSAgc3RyY2F0IChzLCAiLi4uIik7CisJfQorICAgICAgaWYgKGFyZ2NvdW50ID4gMCkKKwlmcmVlIChhcmdfdHlwZXMpOworICAgIH0KKworICBzdHJjYXQgKHMsICIpIik7CisKKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZnJlZSAocyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9jb25zdF90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisKKyAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgImNvbnN0IHwiKTsKK30KKworLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX3ZvbGF0aWxlX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKworICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAidm9sYXRpbGUgfCIpOworfQorCisvKiBTdGFydCBhY2N1bXVsYXRpbmcgYSBzdHJ1Y3QgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICAgdW5zaWduZWQgaW50IGlkOworICAgICBib29sZWFuIHN0cnVjdHA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKworICBpbmZvLT5pbmRlbnQgKz0gMjsKKworICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHN0cnVjdHAgPyAic3RydWN0ICIgOiAidW5pb24gIikpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAodGFnICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgaWRidWZbMjBdOworCisgICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGlkYnVmKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHsiKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChzaXplICE9IDAgfHwgdGFnICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciBhYlszMF07CisKKyAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIikpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoc2l6ZSAhPSAwKQorCXsKKwkgIHNwcmludGYgKGFiLCAiIHNpemUgJXUiLCBzaXplKTsKKwkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBpZiAodGFnICE9IE5VTEwpCisJeworCSAgc3ByaW50ZiAoYWIsICIgaWQgJXUiLCBpZCk7CisJICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIlxuIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7CisKKyAgcmV0dXJuIGluZGVudF90eXBlIChpbmZvKTsKK30KKworLyogT3V0cHV0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQgaW4gYSBzdHJ1Y3QuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpCisgICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeworICBjb25zdCBjaGFyICpzOworICBjaGFyICp0OworICB1bnNpZ25lZCBpbnQgbGVuOworCisgIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7CisKKyAgaWYgKGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID09IHZpc2liaWxpdHkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgYXNzZXJ0IChpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSAhPSBERUJVR19WSVNJQklMSVRZX0lHTk9SRSk7CisKKyAgc3dpdGNoICh2aXNpYmlsaXR5KQorICAgIHsKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgorICAgICAgcyA9ICJwdWJsaWMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6CisgICAgICBzID0gInByaXZhdGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKKyAgICAgIHMgPSAicHJvdGVjdGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9JR05PUkU6CisgICAgICBzID0gIi8qIGlnbm9yZSAqLyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFRyaW0gb2ZmIGEgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIHN0cnVjdCBzdHJpbmcsIHRvIG1ha2UgdGhlCisgICAgIG91dHB1dCBsb29rIGEgYml0IGJldHRlciwgdGhlbiBzdGljayBvbiB0aGUgdmlzaWJpbGl0eSBzdHJpbmcuICAqLworCisgIHQgPSBpbmZvLT5zdGFjay0+dHlwZTsKKyAgbGVuID0gc3RybGVuICh0KTsKKyAgYXNzZXJ0ICh0W2xlbiAtIDFdID09ICcgJyk7CisgIHRbbGVuIC0gMV0gPSAnXDAnOworCisgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBzKQorICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIjpcbiIpCisgICAgICB8fCAhIGluZGVudF90eXBlIChpbmZvKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYSBmaWVsZCB0byBhIHN0cnVjdCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX3N0cnVjdF9maWVsZCAocCwgbmFtZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYmZkX3ZtYSBiaXRwb3M7CisgICAgIGJmZF92bWEgYml0c2l6ZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyIGFiWzIwXTsKKyAgY2hhciAqdDsKKworICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIjsgLyogIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiaXRzaXplICE9IDApCisgICAgeworICAgICAgcHJpbnRfdm1hIChiaXRzaXplLCBhYiwgdHJ1ZSwgZmFsc2UpOworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJiaXRzaXplICIpCisJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikKKwkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIsICIpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcHJpbnRfdm1hIChiaXRwb3MsIGFiLCB0cnVlLCBmYWxzZSk7CisgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiYml0cG9zICIpCisgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikKKyAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi9cbiIpCisgICAgICB8fCAhIGluZGVudF90eXBlIChpbmZvKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdCA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gYXBwZW5kX3R5cGUgKGluZm8sIHQpOworfQorCisvKiBGaW5pc2ggYSBzdHJ1Y3QgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9lbmRfc3RydWN0X3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciAqczsKKworICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOworICBhc3NlcnQgKGluZm8tPmluZGVudCA+PSAyKTsKKworICBpbmZvLT5pbmRlbnQgLT0gMjsKKworICAvKiBDaGFuZ2UgdGhlIHRyYWlsaW5nIGluZGVudGF0aW9uIHRvIGhhdmUgYSBjbG9zZSBicmFjZS4gICovCisgIHMgPSBpbmZvLT5zdGFjay0+dHlwZSArIHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpIC0gMjsKKyAgYXNzZXJ0IChzWzBdID09ICcgJyAmJiBzWzFdID09ICcgJyAmJiBzWzJdID09ICdcMCcpOworCisgICpzKysgPSAnfSc7CisgICpzID0gJ1wwJzsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgYSBjbGFzcyB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX3N0YXJ0X2NsYXNzX3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUsIHZwdHIsIG93bnZwdHIpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICp0YWc7CisgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgYm9vbGVhbiBzdHJ1Y3RwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICAgYm9vbGVhbiB2cHRyOworICAgICBib29sZWFuIG93bnZwdHI7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyICp0diA9IE5VTEw7CisKKyAgaW5mby0+aW5kZW50ICs9IDI7CisKKyAgaWYgKHZwdHIgJiYgISBvd252cHRyKQorICAgIHsKKyAgICAgIHR2ID0gcG9wX3R5cGUgKGluZm8pOworICAgICAgaWYgKHR2ID09IE5VTEwpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHN0cnVjdHAgPyAiY2xhc3MgIiA6ICJ1bmlvbiBjbGFzcyAiKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICh0YWcgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBpZGJ1ZlsyMF07CisKKyAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7CisgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgeyIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHNpemUgIT0gMCB8fCB2cHRyIHx8IG93bnZwdHIgfHwgdGFnICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyoiKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChzaXplICE9IDApCisJeworCSAgY2hhciBhYlsyMF07CisKKwkgIHNwcmludGYgKGFiLCAiJXUiLCBzaXplKTsKKwkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHNpemUgIikKKwkgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmICh2cHRyKQorCXsKKwkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIHZ0YWJsZSAiKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKG93bnZwdHIpCisJICAgIHsKKwkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgInNlbGYgIikpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHR2KQorCQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHRhZyAhPSBOVUxMKQorCXsKKwkgIGNoYXIgYWJbMzBdOworCisJICBzcHJpbnRmIChhYiwgIiBpZCAldSIsIGlkKTsKKwkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiICovIikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKKworICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiXG4iKQorCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKK30KKworLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byBhIGNsYXNzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciAqdDsKKworICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJzdGF0aWMgIikKKyAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICI7IC8qICIpCisgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBwaHlzbmFtZSkKKyAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi9cbiIpCisgICAgICB8fCAhIGluZGVudF90eXBlIChpbmZvKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdCA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gYXBwZW5kX3R5cGUgKGluZm8sIHQpOworfQorCisvKiBBZGQgYSBiYXNlIGNsYXNzIHRvIGEgY2xhc3MuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCisgICAgIFBUUiBwOworICAgICBiZmRfdm1hIGJpdHBvczsKKyAgICAgYm9vbGVhbiB2aXJ0dWFsOworICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgKnQ7CisgIGNvbnN0IGNoYXIgKnByZWZpeDsKKyAgY2hhciBhYlsyMF07CisgIGNoYXIgKnMsICpsLCAqbjsKKworICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwgJiYgaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7CisKKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHQgPSBwb3BfdHlwZSAoaW5mbyk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChzdHJuY21wICh0LCAiY2xhc3MgIiwgc2l6ZW9mICJjbGFzcyAiIC0gMSkgPT0gMCkKKyAgICB0ICs9IHNpemVvZiAiY2xhc3MgIiAtIDE7CisKKyAgLyogUHVzaCBpdCBiYWNrIG9uIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBwcmVwZW5kX3R5cGUgYW5kCisgICAgIGFwcGVuZF90eXBlIHJvdXRpbmVzLiAgKi8KKyAgaWYgKCEgcHVzaF90eXBlIChpbmZvLCB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHZpcnR1YWwpCisgICAgeworICAgICAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAidmlydHVhbCAiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHN3aXRjaCAodmlzaWJpbGl0eSkKKyAgICB7CisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKKyAgICAgIHByZWZpeCA9ICJwdWJsaWMgIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6CisgICAgICBwcmVmaXggPSAicHJvdGVjdGVkICI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKKyAgICAgIHByZWZpeCA9ICJwcml2YXRlICI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHJlZml4ID0gIi8qIHVua25vd24gdmlzaWJpbGl0eSAqLyAiOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgcHJlZml4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJpdHBvcyAhPSAwKQorICAgIHsKKyAgICAgIHByaW50X3ZtYSAoYml0cG9zLCBhYiwgdHJ1ZSwgZmFsc2UpOworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogYml0cG9zICIpCisJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikKKwkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyBzb21ldGhpbmcgbGlrZSAicHVibGljIEEgLyAqIGJpdHBvcworICAgICAxMCAqIC8iLiAgVGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RhY2sgaXMgc29tZXRoaW5nIGxpa2UgImNsYXNzCisgICAgIHh4IHsgLyAqIHNpemUgOCAqIC9cbi4uLiIuICBXZSB3YW50IHRvIHN1YnN0aXR1dGUgdGhlIHRvcCBvZiB0aGUKKyAgICAgc3RhY2sgaW4gYmVmb3JlIHRoZSB7LiAgKi8KKyAgcyA9IHN0cmNociAoaW5mby0+c3RhY2stPm5leHQtPnR5cGUsICd7Jyk7CisgIGFzc2VydCAocyAhPSBOVUxMKTsKKyAgLS1zOworCisgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnOicsIHRoZW4gd2UgYWxyZWFkeSBoYXZlIGEgYmFzZWNsYXNzLCBhbmQKKyAgICAgd2UgbXVzdCBhcHBlbmQgdGhpcyBvbmUgYWZ0ZXIgYSBjb21tYS4gICovCisgIGZvciAobCA9IGluZm8tPnN0YWNrLT5uZXh0LT50eXBlOyBsICE9IHM7IGwrKykKKyAgICBpZiAoKmwgPT0gJzonKQorICAgICAgYnJlYWs7CisgIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgbCA9PSBzID8gIiA6ICIgOiAiLCAiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdCA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpICsgc3RybGVuICh0KSArIDEpOworICBtZW1jcHkgKG4sIGluZm8tPnN0YWNrLT50eXBlLCBzIC0gaW5mby0+c3RhY2stPnR5cGUpOworICBzdHJjcHkgKG4gKyAocyAtIGluZm8tPnN0YWNrLT50eXBlKSwgdCk7CisgIHN0cmNhdCAobiwgcyk7CisKKyAgZnJlZSAoaW5mby0+c3RhY2stPnR5cGUpOworICBpbmZvLT5zdGFjay0+dHlwZSA9IG47CisKKyAgZnJlZSAodCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byBhIGNsYXNzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2NsYXNzX3N0YXJ0X21ldGhvZCAocCwgbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworCisgIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7CisgIGluZm8tPnN0YWNrLT5tZXRob2QgPSBuYW1lOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRkIGEgdmFyaWFudCB0byBhIG1ldGhvZC4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9jbGFzc19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwLCB2b2Zmc2V0LAorCQkJIGNvbnRleHQpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKKyAgICAgYmZkX3ZtYSB2b2Zmc2V0OworICAgICBib29sZWFuIGNvbnRleHQ7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyICptZXRob2RfdHlwZTsKKyAgY2hhciAqY29udGV4dF90eXBlOworCisgIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7CisgIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7CisKKyAgLyogUHV0IHRoZSBjb25zdCBhbmQgdm9sYXRpbGUgcXVhbGlmaWVycyBvbiB0aGUgdHlwZS4gICovCisgIGlmICh2b2xhdGlsZXApCisgICAgeworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdm9sYXRpbGUiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoY29uc3RwKQorICAgIHsKKyAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIGNvbnN0IikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBTdGljayB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludG8gaXRzIHR5cGUuICAqLworICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sCisJCQkgKGNvbnRleHQKKwkJCSAgPyBpbmZvLT5zdGFjay0+bmV4dC0+bmV4dC0+bWV0aG9kCisJCQkgIDogaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBHZXQgdGhlIHR5cGUuICAqLworICBtZXRob2RfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKG1ldGhvZF90eXBlID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIFB1bGwgb2ZmIHRoZSBjb250ZXh0IHR5cGUgaWYgdGhlcmUgaXMgb25lLiAgKi8KKyAgaWYgKCEgY29udGV4dCkKKyAgICBjb250ZXh0X3R5cGUgPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgY29udGV4dF90eXBlID0gcG9wX3R5cGUgKGluZm8pOworICAgICAgaWYgKGNvbnRleHRfdHlwZSA9PSBOVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHRoZSBjbGFzcy4gICovCisKKyAgaWYgKCEgcHJfZml4X3Zpc2liaWxpdHkgKGluZm8sIHZpc2liaWxpdHkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgbWV0aG9kX3R5cGUpCisgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qICIpCisgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBwaHlzbmFtZSkKKyAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoY29udGV4dCB8fCB2b2Zmc2V0ICE9IDApCisgICAgeworICAgICAgY2hhciBhYlsyMF07CisKKyAgICAgIGlmIChjb250ZXh0KQorCXsKKwkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiY29udGV4dCAiKQorCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGNvbnRleHRfdHlwZSkKKwkgICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgcHJpbnRfdm1hICh2b2Zmc2V0LCBhYiwgdHJ1ZSwgZmFsc2UpOworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJ2b2Zmc2V0ICIpCisJICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiICovO1xuIikKKwkgICYmIGluZGVudF90eXBlIChpbmZvKSk7Cit9CisKKy8qIEFkZCBhIHN0YXRpYyB2YXJpYW50IHRvIGEgbWV0aG9kLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworICAgICBib29sZWFuIGNvbnN0cDsKKyAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyICptZXRob2RfdHlwZTsKKworICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOworICBhc3NlcnQgKGluZm8tPnN0YWNrLT5uZXh0ICE9IE5VTEwpOworICBhc3NlcnQgKGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QgIT0gTlVMTCk7CisKKyAgLyogUHV0IHRoZSBjb25zdCBhbmQgdm9sYXRpbGUgcXVhbGlmaWVycyBvbiB0aGUgdHlwZS4gICovCisgIGlmICh2b2xhdGlsZXApCisgICAgeworICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdm9sYXRpbGUiKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoY29uc3RwKQorICAgIHsKKyAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIGNvbnN0IikpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBNYXJrIGl0IGFzIHN0YXRpYy4gICovCisgIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInN0YXRpYyAiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogU3RpY2sgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbnRvIGl0cyB0eXBlLiAgKi8KKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogR2V0IHRoZSB0eXBlLiAgKi8KKyAgbWV0aG9kX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7CisgIGlmIChtZXRob2RfdHlwZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzLiAgKi8KKworICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sIG1ldGhvZF90eXBlKQorCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogIikKKwkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBwaHlzbmFtZSkKKwkgICYmIGFwcGVuZF90eXBlIChpbmZvLCAiICovO1xuIikKKwkgICYmIGluZGVudF90eXBlIChpbmZvKSk7Cit9CisKKy8qIEZpbmlzaCB1cCBhIG1ldGhvZC4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9jbGFzc19lbmRfbWV0aG9kIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisKKyAgaW5mby0+c3RhY2stPm1ldGhvZCA9IE5VTEw7CisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggdXAgYSBjbGFzcy4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9lbmRfY2xhc3NfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHJldHVybiBwcl9lbmRfc3RydWN0X3R5cGUgKHApOworfQorCisvKiBQdXNoIGEgdHlwZSBvbiB0aGUgc3RhY2sgdXNpbmcgYSB0eXBlZGVmIG5hbWUuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfdHlwZWRlZl90eXBlIChwLCBuYW1lKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisKKyAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgbmFtZSk7Cit9CisKKy8qIFB1c2ggYSB0eXBlIG9uIHRoZSBzdGFjayB1c2luZyBhIHRhZyBuYW1lLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX3RhZ190eXBlIChwLCBuYW1lLCBpZCwga2luZCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNvbnN0IGNoYXIgKnQsICp0YWc7CisgIGNoYXIgaWRidWZbMjBdOworCisgIHN3aXRjaCAoa2luZCkKKyAgICB7CisgICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKKyAgICAgIHQgPSAic3RydWN0ICI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046CisgICAgICB0ID0gInVuaW9uICI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKKyAgICAgIHQgPSAiZW51bSAiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgorICAgICAgdCA9ICJjbGFzcyAiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgorICAgICAgdCA9ICJ1bmlvbiBjbGFzcyAiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICB0YWcgPSBuYW1lOworICBlbHNlCisgICAgeworICAgICAgc3ByaW50ZiAoaWRidWYsICIlJWFub24ldSIsIGlkKTsKKyAgICAgIHRhZyA9IGlkYnVmOworICAgIH0KKworICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChuYW1lICE9IE5VTEwgJiYga2luZCAhPSBERUJVR19LSU5EX0VOVU0pCisgICAgeworICAgICAgc3ByaW50ZiAoaWRidWYsICIgLyogaWQgJXUgKi8iLCBpZCk7CisgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhIHR5cGVkZWYuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfdHlwZGVmIChwLCBuYW1lKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgKnM7CisKKyAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcyA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKHMgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5kZW50IChpbmZvKTsKKyAgZnByaW50ZiAoaW5mby0+ZiwgInR5cGVkZWYgJXM7XG4iLCBzKTsKKworICBmcmVlIChzKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogT3V0cHV0IGEgdGFnLiAgVGhlIHRhZyBzaG91bGQgYWxyZWFkeSBiZSBpbiB0aGUgc3RyaW5nIG9uIHRoZQorICAgc3RhY2ssIHNvIGFsbCB3ZSBoYXZlIHRvIGRvIGhlcmUgaXMgcHJpbnQgaXQgb3V0LiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorcHJfdGFnIChwLCBuYW1lKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgKnQ7CisKKyAgdCA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5kZW50IChpbmZvKTsKKyAgZnByaW50ZiAoaW5mby0+ZiwgIiVzO1xuIiwgdCk7CisKKyAgZnJlZSAodCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyIGFiWzIwXTsKKworICBpbmRlbnQgKGluZm8pOworICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7CisgIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBpbnQgJXMgPSAlcztcbiIsIG5hbWUsIGFiKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2Zsb2F0X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBkb3VibGUgdmFsOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKworICBpbmRlbnQgKGluZm8pOworICBmcHJpbnRmIChpbmZvLT5mLCAiY29uc3QgZG91YmxlICVzID0gJWc7XG4iLCBuYW1lLCB2YWwpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogT3V0cHV0IGEgdHlwZWQgY29uc3RhbnQuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZF92bWEgdmFsOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciAqdDsKKyAgY2hhciBhYlsyMF07CisKKyAgdCA9IHBvcF90eXBlIChpbmZvKTsKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5kZW50IChpbmZvKTsKKyAgcHJpbnRfdm1hICh2YWwsIGFiLCBmYWxzZSwgZmFsc2UpOworICBmcHJpbnRmIChpbmZvLT5mLCAiY29uc3QgJXMgJXMgPSAlcztcbiIsIHQsIG5hbWUsIGFiKTsKKworICBmcmVlICh0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogT3V0cHV0IGEgdmFyaWFibGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorcHJfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyICp0OworICBjaGFyIGFiWzIwXTsKKworICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICB0ID0gcG9wX3R5cGUgKGluZm8pOworICBpZiAodCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbmRlbnQgKGluZm8pOworICBzd2l0Y2ggKGtpbmQpCisgICAgeworICAgIGNhc2UgREVCVUdfU1RBVElDOgorICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgorICAgICAgZnByaW50ZiAoaW5mby0+ZiwgInN0YXRpYyAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfUkVHSVNURVI6CisgICAgICBmcHJpbnRmIChpbmZvLT5mLCAicmVnaXN0ZXIgIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOworICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi87XG4iLCB0LCBhYik7CisKKyAgZnJlZSAodCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0YXJ0IG91dHB1dHRpbmcgYSBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFsKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYm9vbGVhbiBnbG9iYWw7Cit7CisgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOworICBjaGFyICp0OworCisgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHQgPSBwb3BfdHlwZSAoaW5mbyk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGluZGVudCAoaW5mbyk7CisgIGlmICghIGdsb2JhbCkKKyAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOworICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgKCIsIHQpOworCisgIGluZm8tPnBhcmFtZXRlciA9IDE7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7CisgICAgIGJmZF92bWEgdmFsOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciAqdDsKKyAgY2hhciBhYlsyMF07CisKKyAgaWYgKGtpbmQgPT0gREVCVUdfUEFSTV9SRUZFUkVOQ0UKKyAgICAgIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQorICAgIHsKKyAgICAgIGlmICghIHByX3JlZmVyZW5jZV90eXBlIChwKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHQgPSBwb3BfdHlwZSAoaW5mbyk7CisgIGlmICh0ID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChpbmZvLT5wYXJhbWV0ZXIgIT0gMSkKKyAgICBmcHJpbnRmIChpbmZvLT5mLCAiLCAiKTsKKworICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRyB8fCBraW5kID09IERFQlVHX1BBUk1fUkVGX1JFRykKKyAgICBmcHJpbnRmIChpbmZvLT5mLCAicmVnaXN0ZXIgIik7CisKKyAgcHJpbnRfdm1hICh2YWwsIGFiLCB0cnVlLCB0cnVlKTsKKyAgZnByaW50ZiAoaW5mby0+ZiwgIiVzIC8qICVzICovIiwgdCwgYWIpOworCisgIGZyZWUgKHQpOworCisgICsraW5mby0+cGFyYW1ldGVyOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQorICAgICBQVFIgcDsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKKyAgY2hhciBhYlsyMF07CisKKyAgaWYgKGluZm8tPnBhcmFtZXRlciA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoaW5mby0+ZiwgIilcbiIpOworICAgICAgaW5mby0+cGFyYW1ldGVyID0gMDsKKyAgICB9CisKKyAgaW5kZW50IChpbmZvKTsKKyAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7CisgIGZwcmludGYgKGluZm8tPmYsICJ7IC8qICVzICovXG4iLCBhYik7CisKKyAgaW5mby0+aW5kZW50ICs9IDI7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdyaXRlIG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitwcl9saW5lbm8gKHAsIGZpbGVuYW1lLCBsaW5lbm8sIGFkZHIpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgYWJbMjBdOworCisgIGluZGVudCAoaW5mbyk7CisgIHByaW50X3ZtYSAoYWRkciwgYWIsIHRydWUsIHRydWUpOworICBmcHJpbnRmIChpbmZvLT5mLCAiLyogZmlsZSAlcyBsaW5lICVsdSBhZGRyICVzICovXG4iLCBmaWxlbmFtZSwgbGluZW5vLCBhYik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3ByX2VuZF9ibG9jayAocCwgYWRkcikKKyAgICAgUFRSIHA7CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7CisgIGNoYXIgYWJbMjBdOworCisgIGluZm8tPmluZGVudCAtPSAyOworCisgIGluZGVudCAoaW5mbyk7CisgIHByaW50X3ZtYSAoYWRkciwgYWIsIHRydWUsIHRydWUpOworICBmcHJpbnRmIChpbmZvLT5mLCAifSAvKiAlcyAqL1xuIiwgYWIpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK3ByX2VuZF9mdW5jdGlvbiAocCkKKyAgICAgUFRSIHA7Cit7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmFubGliLjEgYi9iaW51dGlscy9yYW5saWIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZiNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvcmFubGliLjEKQEAgLTAsMCArMSw4MyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgorLlRIIHJhbmxpYiAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKKy5kZSBCUAorLnNwCisudGkgXC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCityYW5saWIgXC0gZ2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZS4KKworLlNIIFNZTk9QU0lTCisuaHkgMAorLm5hCisuQiByYW5saWIgXGMKKy5SQiAiW1x8IiBcLXYgfCBcLVYgIlx8XSIKKy5JIGFyY2hpdmVcYworXCYKKy5hZCBiCisuaHkgMQorLlNIIERFU0NSSVBUSU9OCisuQiByYW5saWIKK2dlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSwgYW5kCitzdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCittZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKKy5QUAorWW91IG1heSB1c2UKKy5SQiBgICJubSBcLXMiICcKK29yCisuUkIgYCAibm0gXC1cLXByaW50LWFybWFwIiAnCit0byBsaXN0IHRoaXMgaW5kZXguCisuUFAKK0FuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKK2FsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KK3RoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KKy5QUAorVGhlIEdOVQorLkIgcmFubGliCitwcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBHTlUKKy5CUiBhciA7CitydW5uaW5nCisuQiByYW5saWIKK2lzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKKy5SQiBgICJhciBcLXMiICcuCisKKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtdgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCisuQiByYW5saWIKK2FuZCBleGl0LgorCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCitlbnRyeSBpbiAKKy5CCitpbmZvXGMKK1wmOyAKKy5JCitUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYworXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCisuQlIgYXIgIigiIDEgIiksIgorLkJSIG5tICIoIiAxICIpLiIKKworCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuc2ggYi9iaW51dGlscy9yYW5saWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmI2ZmJjNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3JhbmxpYi5zaApAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorIyBBIHNpbXBsZSByYW5saWIgc2NyaXB0LCB0byB1c2UgbGVzcyBkaXNrIHNwYWNlIHRoYW4gYSByYW5saWIgcHJvZ3JhbS4KK2FyIHMgJDEKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JjbGV4LmwgYi9iaW51dGlscy9yY2xleC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTY2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9yY2xleC5sCkBAIC0wLDAgKzEsNDY1IEBACisleyAvKiByY2xleC5sIC0tIGxleGVyIGZvciBXaW5kb3dzIHJjIGZpbGVzIHBhcnNlciAgKi8KKy8qIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyBhIGxleCBpbnB1dCBmaWxlIHdoaWNoIGdlbmVyYXRlcyBhIGxleGVyIHVzZWQgYnkgdGhlCisgICBXaW5kb3dzIHJjIGZpbGUgcGFyc2VyLiAgSXQgYmFzaWNhbGx5IGp1c3QgcmVjb2duaXplZCBhIGJ1bmNoIG9mCisgICBrZXl3b3Jkcy4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJ3aW5kcmVzLmgiCisjaW5jbHVkZSAicmNwYXJzZS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogV2hldGhlciB3ZSBhcmUgaW4gcmNkYXRhIG1vZGUsIGluIHdoaWNoIHdlIHJldHVybnMgdGhlIGxlbmd0aHMgb2YKKyAgIHN0cmluZ3MuICAqLworCitzdGF0aWMgaW50IHJjZGF0YV9tb2RlOworCisvKiBMaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLiAgKi8KKworc3RydWN0IGFsbG9jX3N0cmluZworeworICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICpuZXh0OworICBjaGFyICpzOworfTsKKworc3RhdGljIHN0cnVjdCBhbGxvY19zdHJpbmcgKnN0cmluZ3M7CisKKy8qIExvY2FsIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkIGNwcF9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIGNoYXIgKmhhbmRsZV9xdW90ZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopKTsKK3N0YXRpYyBjaGFyICpnZXRfc3RyaW5nIFBBUkFNUyAoKGludCkpOworCislfQorCislJQorCisiQkVHSU4iCQkJeyByZXR1cm4gQkVHOyB9CisieyIJCQl7IHJldHVybiBCRUc7IH0KKyJFTkQiCQkJeyByZXR1cm4gRU5EOyB9CisifSIJCQl7IHJldHVybiBFTkQ7IH0KKyJBQ0NFTEVSQVRPUlMiCQl7IHJldHVybiBBQ0NFTEVSQVRPUlM7IH0KKyJWSVJUS0VZIgkJeyByZXR1cm4gVklSVEtFWTsgfQorIkFTQ0lJIgkJCXsgcmV0dXJuIEFTQ0lJOyB9CisiTk9JTlZFUlQiCQl7IHJldHVybiBOT0lOVkVSVDsgfQorIlNISUZUIgkJCXsgcmV0dXJuIFNISUZUOyB9CisiQ09OVFJPTCIJCXsgcmV0dXJuIENPTlRST0w7IH0KKyJBTFQiCQkJeyByZXR1cm4gQUxUOyB9CisiQklUTUFQIgkJeyByZXR1cm4gQklUTUFQOyB9CisiQ1VSU09SIgkJeyByZXR1cm4gQ1VSU09SOyB9CisiRElBTE9HIgkJeyByZXR1cm4gRElBTE9HOyB9CisiRElBTE9HRVgiCQl7IHJldHVybiBESUFMT0dFWDsgfQorIkVYU1RZTEUiCQl7IHJldHVybiBFWFNUWUxFOyB9CisiQ0FQVElPTiIJCXsgcmV0dXJuIENBUFRJT047IH0KKyJDTEFTUyIJCQl7IHJldHVybiBDTEFTUzsgfQorIlNUWUxFIgkJCXsgcmV0dXJuIFNUWUxFOyB9CisiQVVUTzNTVEFURSIJCXsgcmV0dXJuIEFVVE8zU1RBVEU7IH0KKyJBVVRPQ0hFQ0tCT1giCQl7IHJldHVybiBBVVRPQ0hFQ0tCT1g7IH0KKyJBVVRPUkFESU9CVVRUT04iCXsgcmV0dXJuIEFVVE9SQURJT0JVVFRPTjsgfQorIkNIRUNLQk9YIgkJeyByZXR1cm4gQ0hFQ0tCT1g7IH0KKyJDT01CT0JPWCIJCXsgcmV0dXJuIENPTUJPQk9YOyB9CisiQ1RFWFQiCQkJeyByZXR1cm4gQ1RFWFQ7IH0KKyJERUZQVVNIQlVUVE9OIgkJeyByZXR1cm4gREVGUFVTSEJVVFRPTjsgfQorIkVESVRURVhUIgkJeyByZXR1cm4gRURJVFRFWFQ7IH0KKyJHUk9VUEJPWCIJCXsgcmV0dXJuIEdST1VQQk9YOyB9CisiTElTVEJPWCIJCXsgcmV0dXJuIExJU1RCT1g7IH0KKyJMVEVYVCIJCQl7IHJldHVybiBMVEVYVDsgfQorIlBVU0hCT1giCQl7IHJldHVybiBQVVNIQk9YOyB9CisiUFVTSEJVVFRPTiIJCXsgcmV0dXJuIFBVU0hCVVRUT047IH0KKyJSQURJT0JVVFRPTiIJCXsgcmV0dXJuIFJBRElPQlVUVE9OOyB9CisiUlRFWFQiCQkJeyByZXR1cm4gUlRFWFQ7IH0KKyJTQ1JPTExCQVIiCQl7IHJldHVybiBTQ1JPTExCQVI7IH0KKyJTVEFURTMiCQl7IHJldHVybiBTVEFURTM7IH0KKyJVU0VSQlVUVE9OIgkJeyByZXR1cm4gVVNFUkJVVFRPTjsgfQorIkJFRElUIgkJCXsgcmV0dXJuIEJFRElUOyB9CisiSEVESVQiCQkJeyByZXR1cm4gSEVESVQ7IH0KKyJJRURJVCIJCQl7IHJldHVybiBJRURJVDsgfQorIkZPTlQiCQkJeyByZXR1cm4gRk9OVDsgfQorIklDT04iCQkJeyByZXR1cm4gSUNPTjsgfQorIkxBTkdVQUdFIgkJeyByZXR1cm4gTEFOR1VBR0U7IH0KKyJDSEFSQUNURVJJU1RJQ1MiCXsgcmV0dXJuIENIQVJBQ1RFUklTVElDUzsgfQorIlZFUlNJT04iCQl7IHJldHVybiBWRVJTSU9OSzsgfQorIk1FTlUiCQkJeyByZXR1cm4gTUVOVTsgfQorIk1FTlVFWCIJCXsgcmV0dXJuIE1FTlVFWDsgfQorIk1FTlVJVEVNIgkJeyByZXR1cm4gTUVOVUlURU07IH0KKyJTRVBBUkFUT1IiCQl7IHJldHVybiBTRVBBUkFUT1I7IH0KKyJQT1BVUCIJCQl7IHJldHVybiBQT1BVUDsgfQorIkNIRUNLRUQiCQl7IHJldHVybiBDSEVDS0VEOyB9CisiR1JBWUVEIgkJeyByZXR1cm4gR1JBWUVEOyB9CisiSEVMUCIJCQl7IHJldHVybiBIRUxQOyB9CisiSU5BQ1RJVkUiCQl7IHJldHVybiBJTkFDVElWRTsgfQorIk1FTlVCQVJCUkVBSyIJCXsgcmV0dXJuIE1FTlVCQVJCUkVBSzsgfQorIk1FTlVCUkVBSyIJCXsgcmV0dXJuIE1FTlVCUkVBSzsgfQorIk1FU1NBR0VUQUJMRSIJCXsgcmV0dXJuIE1FU1NBR0VUQUJMRTsgfQorIlJDREFUQSIJCXsgcmV0dXJuIFJDREFUQTsgfQorIlNUUklOR1RBQkxFIgkJeyByZXR1cm4gU1RSSU5HVEFCTEU7IH0KKyJWRVJTSU9OSU5GTyIJCXsgcmV0dXJuIFZFUlNJT05JTkZPOyB9CisiRklMRVZFUlNJT04iCQl7IHJldHVybiBGSUxFVkVSU0lPTjsgfQorIlBST0RVQ1RWRVJTSU9OIgl7IHJldHVybiBQUk9EVUNUVkVSU0lPTjsgfQorIkZJTEVGTEFHU01BU0siCQl7IHJldHVybiBGSUxFRkxBR1NNQVNLOyB9CisiRklMRUZMQUdTIgkJeyByZXR1cm4gRklMRUZMQUdTOyB9CisiRklMRU9TIgkJeyByZXR1cm4gRklMRU9TOyB9CisiRklMRVRZUEUiCQl7IHJldHVybiBGSUxFVFlQRTsgfQorIkZJTEVTVUJUWVBFIgkJeyByZXR1cm4gRklMRVNVQlRZUEU7IH0KKyJWQUxVRSIJCQl7IHJldHVybiBWQUxVRTsgfQorIk1PVkVBQkxFIgkJeyByZXR1cm4gTU9WRUFCTEU7IH0KKyJGSVhFRCIJCQl7IHJldHVybiBGSVhFRDsgfQorIlBVUkUiCQkJeyByZXR1cm4gUFVSRTsgfQorIklNUFVSRSIJCXsgcmV0dXJuIElNUFVSRTsgfQorIlBSRUxPQUQiCQl7IHJldHVybiBQUkVMT0FEOyB9CisiTE9BRE9OQ0FMTCIJCXsgcmV0dXJuIExPQURPTkNBTEw7IH0KKyJESVNDQVJEQUJMRSIJCXsgcmV0dXJuIERJU0NBUkRBQkxFOyB9CisiTk9UIgkJCXsgcmV0dXJuIE5PVDsgfQorCisiQkxPQ0siWyBcdFxuXSoiXCIiW15cI1xuXSoiXCIiIHsKKwkJCSAgY2hhciAqcywgKnNlbmQ7CisKKwkJCSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gbGV0IHVzIHBhcnNlIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gZWFzaWx5LiAgKi8KKworCQkJICBzID0gc3RyY2hyICh5eXRleHQsICciJyk7CisJCQkgICsrczsKKwkJCSAgc2VuZCA9IHN0cmNociAocywgJyInKTsKKwkJCSAgaWYgKHN0cm5jbXAgKHMsICJTdHJpbmdGaWxlSW5mbyIsCisJCQkJICAgICAgIHNpemVvZiAiU3RyaW5nRmlsZUluZm8iIC0gMSkgPT0gMAorCQkJICAgICAgJiYgcyArIHNpemVvZiAiU3RyaW5nRmlsZUluZm8iIC0gMSA9PSBzZW5kKQorCQkJICAgIHJldHVybiBCTE9DS1NUUklOR0ZJTEVJTkZPOworCQkJICBlbHNlIGlmIChzdHJuY21wIChzLCAiVmFyRmlsZUluZm8iLAorCQkJCQkgICAgc2l6ZW9mICJWYXJGaWxlSW5mbyIgLSAxKSA9PSAwCisJCQkJICAgJiYgcyArIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSA9PSBzZW5kKQorCQkJICAgIHJldHVybiBCTE9DS1ZBUkZJTEVJTkZPOworCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgY2hhciAqcjsKKworCQkJICAgICAgciA9IGdldF9zdHJpbmcgKHNlbmQgLSBzICsgMSk7CisJCQkgICAgICBzdHJuY3B5IChyLCBzLCBzZW5kIC0gcyk7CisJCQkgICAgICByW3NlbmQgLSBzXSA9ICdcMCc7CisJCQkgICAgICB5eWx2YWwucyA9IHI7CisJCQkgICAgICByZXR1cm4gQkxPQ0s7CisJCQkgICAgfQorCQkJfQorCisiIyJbXlxuXSoJCXsKKwkJCSAgY3BwX2xpbmUgKHl5dGV4dCk7CisJCQl9CisKK1swLTldW3gwLTlBLUZhLWZdKkwJeworCQkJICB5eWx2YWwuaS52YWwgPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOworCQkJICB5eWx2YWwuaS5kd29yZCA9IDE7CisJCQkgIHJldHVybiBOVU1CRVI7CisJCQl9CisKK1swLTldW3gwLTlBLUZhLWZdKgl7CisJCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7CisJCQkgIHl5bHZhbC5pLmR3b3JkID0gMDsKKwkJCSAgcmV0dXJuIE5VTUJFUjsKKwkJCX0KKworKCJcIiJbXlwiXG5dKiJcIiJbIFx0XSopKyB7CisJCQkgIGNoYXIgKnM7CisJCQkgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisJCQkgIHMgPSBoYW5kbGVfcXVvdGVzICh5eXRleHQsICZsZW5ndGgpOworCQkJICBpZiAoISByY2RhdGFfbW9kZSkKKwkJCSAgICB7CisJCQkgICAgICB5eWx2YWwucyA9IHM7CisJCQkgICAgICByZXR1cm4gUVVPVEVEU1RSSU5HOworCQkJICAgIH0KKwkJCSAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgIHl5bHZhbC5zcy5sZW5ndGggPSBsZW5ndGg7CisJCQkgICAgICB5eWx2YWwuc3MucyA9IHM7CisJCQkgICAgICByZXR1cm4gU0laRURTVFJJTkc7CisJCQkgICAgfQorCQkJfQorCitbQS1aYS16XVteICxcdFxyXG5dKgl7CisJCQkgIGNoYXIgKnM7CisKKwkJCSAgLyogSSByZWplY3RlZCBjb21tYSBpbiBhIHN0cmluZyBpbiBvcmRlciB0bworCQkJICAgICBoYW5kbGUgVklSVEtFWSwgQ09OVFJPTCBpbiBhbiBhY2NlbGVyYXRvcgorCQkJICAgICByZXNvdXJjZS4gIFRoaXMgbWVhbnMgdGhhdCBhbiB1bnF1b3RlZAorCQkJICAgICBmaWxlIG5hbWUgY2FuIG5vdCBjb250YWluIGEgY29tbWEuICBJCisJCQkgICAgIGRvbid0IGtub3cgd2hhdCByYyBwZXJtaXRzLiAgKi8KKworCQkJICBzID0gZ2V0X3N0cmluZyAoc3RybGVuICh5eXRleHQpICsgMSk7CisJCQkgIHN0cmNweSAocywgeXl0ZXh0KTsKKwkJCSAgeXlsdmFsLnMgPSBzOworCQkJICByZXR1cm4gU1RSSU5HOworCQkJfQorCitbXG5dCQkJeyArK3JjX2xpbmVubzsgfQorWyBcdFxyXSsJCXsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQorLgkJCXsgcmV0dXJuICp5eXRleHQ7IH0KKworJSUKKyNpZm5kZWYgeXl3cmFwCisvKiBUaGlzIGlzIG5lZWRlZCBmb3Igc29tZSB2ZXJzaW9ucyBvZiBsZXguICAqLworaW50IHl5d3JhcCAoKQoreworICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKiBIYW5kbGUgYSBDIHByZXByb2Nlc3NvciBsaW5lLiAgKi8KKworc3RhdGljIHZvaWQKK2NwcF9saW5lIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBpbnQgbGluZTsKKyAgY2hhciAqc2VuZCwgKmZuOworCisgICsrczsKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisgICAgKytzOworICAKKyAgbGluZSA9IHN0cnRvbCAocywgJnNlbmQsIDApOworICBpZiAoKnNlbmQgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2VuZCkpCisgICAgcmV0dXJuOworCisgIC8qIFN1YnRyYWN0IDEgYmVjYXVzZSB3ZSBhcmUgYWJvdXQgdG8gY291bnQgdGhlIG5ld2xpbmUuICAqLworICByY19saW5lbm8gPSBsaW5lIC0gMTsKKworICBzID0gc2VuZDsKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisgICAgKytzOworCisgIGlmICgqcyAhPSAnIicpCisgICAgcmV0dXJuOworCisgICsrczsKKyAgc2VuZCA9IHN0cmNociAocywgJyInKTsKKyAgaWYgKHNlbmQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm4gPSAoY2hhciAqKSB4bWFsbG9jIChzZW5kIC0gcyArIDEpOworICBzdHJuY3B5IChmbiwgcywgc2VuZCAtIHMpOworICBmbltzZW5kIC0gc10gPSAnXDAnOworCisgIGZyZWUgKHJjX2ZpbGVuYW1lKTsKKyAgcmNfZmlsZW5hbWUgPSBmbjsKK30KKworLyogSGFuZGxlIGEgcXVvdGVkIHN0cmluZy4gIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkLiAgQSBwYWlyIG9mIHF1b3RlcworICAgaW4gYSBzdHJpbmcgYXJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIHF1b3RlLiAgQWRqYWNlbnQgc3RyaW5ncyBhcmUKKyAgIG1lcmdlZCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhcmUgbWVyZ2VkLCBhcyBpbiBDLiAgKi8KKworc3RhdGljIGNoYXIgKgoraGFuZGxlX3F1b3RlcyAoaW5wdXQsIGxlbikKKyAgICAgY29uc3QgY2hhciAqaW5wdXQ7CisgICAgIHVuc2lnbmVkIGxvbmcgKmxlbjsKK3sKKyAgY2hhciAqcmV0LCAqczsKKyAgY29uc3QgY2hhciAqdDsKKyAgaW50IGNoOworCisgIHJldCA9IGdldF9zdHJpbmcgKHN0cmxlbiAoaW5wdXQpICsgMSk7CisKKyAgcyA9IHJldDsKKyAgdCA9IGlucHV0OworICBpZiAoKnQgPT0gJyInKQorICAgICsrdDsKKyAgd2hpbGUgKCp0ICE9ICdcMCcpCisgICAgeworICAgICAgaWYgKCp0ID09ICdcXCcpCisJeworCSAgKyt0OworCSAgc3dpdGNoICgqdCkKKwkgICAgeworCSAgICBjYXNlICdcMCc6CisJICAgICAgcmNwYXJzZV93YXJuaW5nICgiYmFja3NsYXNoIGF0IGVuZCBvZiBzdHJpbmciKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdcIic6CisJICAgICAgcmNwYXJzZV93YXJuaW5nICgidXNlIFwiXCIgdG8gcHV0IFwiIGluIGEgc3RyaW5nIik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnYSc6CisJICAgICAgKnMrKyA9IEVTQ0FQRV9BOworCSAgICAgICsrdDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdiJzoKKwkgICAgICAqcysrID0gRVNDQVBFX0I7CisJICAgICAgKyt0OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ2YnOgorCSAgICAgICpzKysgPSBFU0NBUEVfRjsKKwkgICAgICArK3Q7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnbic6CisJICAgICAgKnMrKyA9IEVTQ0FQRV9OOworCSAgICAgICsrdDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdyJzoKKwkgICAgICAqcysrID0gRVNDQVBFX1I7CisJICAgICAgKyt0OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ3QnOgorCSAgICAgICpzKysgPSBFU0NBUEVfVDsKKwkgICAgICArK3Q7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAndic6CisJICAgICAgKnMrKyA9IEVTQ0FQRV9WOworCSAgICAgICsrdDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdcXCc6CisJICAgICAgKnMrKyA9ICp0Kys7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6CisJICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgorCSAgICAgIGNoID0gKnQgLSAnMCc7CisJICAgICAgKyt0OworCSAgICAgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzcnKQorCQl7CisJCSAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOworCQkgICsrdDsKKwkJICBpZiAoKnQgPj0gJzAnICYmICp0IDw9ICc3JykKKwkJICAgIHsKKwkJICAgICAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOworCQkgICAgICArK3Q7CisJCSAgICB9CisJCX0KKwkgICAgICAqcysrID0gY2g7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAneCc6CisJICAgICAgKyt0OworCSAgICAgIGNoID0gMDsKKwkgICAgICB3aGlsZSAoMSkKKwkJeworCQkgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzknKQorCQkgICAgY2ggPSAoY2ggPDwgNCkgfCAoKnQgLSAnMCcpOworCQkgIGVsc2UgaWYgKCp0ID49ICdhJyAmJiAqdCA8PSAnZicpCisJCSAgICBjaCA9IChjaCA8PCA0KSB8ICgqdCAtICdhJyk7CisJCSAgZWxzZSBpZiAoKnQgPj0gJ0EnICYmICp0IDw9ICdGJykKKwkJICAgIGNoID0gKGNoIDw8IDQpIHwgKCp0IC0gJ0EnKTsKKwkJICBlbHNlCisJCSAgICBicmVhazsKKwkJICArK3Q7CisJCX0KKwkgICAgICAqcysrID0gY2g7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJ1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlIik7CisJICAgICAgKnMrKyA9ICdcXCc7CisJICAgICAgKnMrKyA9ICp0Kys7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgqdCAhPSAnIicpCisJKnMrKyA9ICp0Kys7CisgICAgICBlbHNlIGlmICh0WzFdID09ICdcMCcpCisJYnJlYWs7CisgICAgICBlbHNlIGlmICh0WzFdID09ICciJykKKwl7CisJICAqcysrID0gJyInOworCSAgdCArPSAyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICArK3Q7CisJICBhc3NlcnQgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpOworCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpCisJICAgICsrdDsKKwkgIGlmICgqdCA9PSAnXDAnKQorCSAgICBicmVhazsKKwkgIGFzc2VydCAoKnQgPT0gJyInKTsKKwkgICsrdDsKKwl9CisgICAgfQorCisgICpzID0gJ1wwJzsKKworICAqbGVuID0gcyAtIHJldDsKKworICByZXR1cm4gcmV0OworfQorCisvKiBBbGxvY2F0ZSBhIHN0cmluZyBvZiBhIGdpdmVuIGxlbmd0aC4gICovCisKK3N0YXRpYyBjaGFyICoKK2dldF9zdHJpbmcgKGxlbikKKyAgICAgaW50IGxlbjsKK3sKKyAgc3RydWN0IGFsbG9jX3N0cmluZyAqYXM7CisKKyAgYXMgPSAoc3RydWN0IGFsbG9jX3N0cmluZyAqKSB4bWFsbG9jIChzaXplb2YgKmFzKTsKKyAgYXMtPnMgPSB4bWFsbG9jIChsZW4pOworCisgIGFzLT5uZXh0ID0gc3RyaW5nczsKKyAgc3RyaW5ncyA9IGFzLT5uZXh0OworCisgIHJldHVybiBhcy0+czsKK30KKworLyogRGlzY2FyZCBhbGwgdGhlIHN0cmluZ3Mgd2UgaGF2ZSBhbGxvY2F0ZWQuICBUaGUgcGFyc2VyIGNhbGxzIHRoaXMKKyAgIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIHRoZW0uICAqLworCit2b2lkCityY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKQoreworICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICphczsKKworICBhcyA9IHN0cmluZ3M7CisgIHdoaWxlIChhcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBhbGxvY19zdHJpbmcgKm47CisKKyAgICAgIGZyZWUgKGFzLT5zKTsKKyAgICAgIG4gPSBhcy0+bmV4dDsKKyAgICAgIGZyZWUgKGFzKTsKKyAgICAgIGFzID0gbjsKKyAgICB9CisKKyAgc3RyaW5ncyA9IE5VTEw7Cit9CisKKy8qIEVudGVyIHJjZGF0YSBtb2RlLiAgKi8KKwordm9pZAorcmNwYXJzZV9yY2RhdGEgKCkKK3sKKyAgcmNkYXRhX21vZGUgPSAxOworfQorCisvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlIGZyb20gcmNkYXRhIG1vZGUuICAqLworCit2b2lkCityY3BhcnNlX25vcm1hbCAoKQoreworICByY2RhdGFfbW9kZSA9IDA7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9yY3BhcnNlLnkgYi9iaW51dGlscy9yY3BhcnNlLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwNzlhNQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3JjcGFyc2UueQpAQCAtMCwwICsxLDE2MTcgQEAKKyV7IC8qIHJjcGFyc2UueSAtLSBwYXJzZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMKKyAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyBhIHBhcnNlciBmb3IgV2luZG93cyByYyBmaWxlcy4gIEl0IGlzIGJhc2VkIG9uIHRoZSBwYXJzZXIKKyAgIGJ5IEd1bnRoZXIgRWJlcnQgPGd1bnRoZXIuZWJlcnRAaXhvcy1sZWlwemlnLmRlPi4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJ3aW5kcmVzLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisvKiBUaGUgY3VycmVudCBsYW5ndWFnZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKKworLyogVGhlIHJlc291cmNlIGluZm9ybWF0aW9uIGR1cmluZyBhIHN1YiBzdGF0ZW1lbnQuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19yZXNfaW5mbyBzdWJfcmVzX2luZm87CisKKy8qIERpYWxvZyBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgYnVpbHQgYnkgdGhlIG5vbnRlcm1pbmFscyBzdHlsZXMgYW5kCisgICBjb250cm9scy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZGlhbG9nIGRpYWxvZzsKKworLyogVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgYSBzdHlsZS4gIEl0IGlzIG1vZGlmaWVkIGJ5IHRoZQorICAgbm9udGVybWluYWwgc3R5bGVleHByLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3R5bGU7CisKKy8qIFRoZXNlIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBjb250cm9sLiAgVGhleSBhcmUgc2V0IGJlZm9yZSB1c2luZworICAgY29udHJvbF9wYXJhbXMuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXNlX3N0eWxlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdF9zdHlsZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsYXNzOworCislfQorCisldW5pb24KK3sKKyAgc3RydWN0IGFjY2VsZXJhdG9yIGFjYzsKKyAgc3RydWN0IGFjY2VsZXJhdG9yICpwYWNjOworICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRpYWxvZ19jb250cm9sOworICBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtOworICBzdHJ1Y3QKKyAgeworICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqZmlyc3Q7CisgICAgc3RydWN0IHJjZGF0YV9pdGVtICpsYXN0OworICB9IHJjZGF0YTsKKyAgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGFfaXRlbTsKKyAgc3RydWN0IHN0cmluZ3RhYmxlX2RhdGEgKnN0cmluZ3RhYmxlOworICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeHZlcjsKKyAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOworICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZlcnN0cmluZzsKKyAgc3RydWN0IHZlcl92YXJpbmZvICp2ZXJ2YXI7CisgIHN0cnVjdCByZXNfaWQgaWQ7CisgIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzX2luZm87CisgIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgc2hvcnQgb247CisgICAgdW5zaWduZWQgc2hvcnQgb2ZmOworICB9IG1lbWZsYWdzOworICBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIC8qIE5vbnplcm8gaWYgdGhpcyBudW1iZXIgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFzIGxvbmcuICAqLworICAgIGludCBkd29yZDsKKyAgfSBpOworICB1bnNpZ25lZCBsb25nIGlsOworICB1bnNpZ25lZCBzaG9ydCBpczsKKyAgY29uc3QgY2hhciAqczsKKyAgc3RydWN0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICBjb25zdCBjaGFyICpzOworICB9IHNzOworfTsKKworJXRva2VuIEJFRyBFTkQKKyV0b2tlbiBBQ0NFTEVSQVRPUlMgVklSVEtFWSBBU0NJSSBOT0lOVkVSVCBTSElGVCBDT05UUk9MIEFMVAorJXRva2VuIEJJVE1BUAorJXRva2VuIENVUlNPUgorJXRva2VuIERJQUxPRyBESUFMT0dFWCBFWFNUWUxFIENBUFRJT04gQ0xBU1MgU1RZTEUKKyV0b2tlbiBBVVRPM1NUQVRFIEFVVE9DSEVDS0JPWCBBVVRPUkFESU9CVVRUT04gQ0hFQ0tCT1ggQ09NQk9CT1ggQ1RFWFQKKyV0b2tlbiBERUZQVVNIQlVUVE9OIEVESVRURVhUIEdST1VQQk9YIExJU1RCT1ggTFRFWFQgUFVTSEJPWCBQVVNIQlVUVE9OCisldG9rZW4gUkFESU9CVVRUT04gUlRFWFQgU0NST0xMQkFSIFNUQVRFMyBVU0VSQlVUVE9OCisldG9rZW4gQkVESVQgSEVESVQgSUVESVQKKyV0b2tlbiBGT05UCisldG9rZW4gSUNPTgorJXRva2VuIExBTkdVQUdFIENIQVJBQ1RFUklTVElDUyBWRVJTSU9OSworJXRva2VuIE1FTlUgTUVOVUVYIE1FTlVJVEVNIFNFUEFSQVRPUiBQT1BVUCBDSEVDS0VEIEdSQVlFRCBIRUxQIElOQUNUSVZFCisldG9rZW4gTUVOVUJBUkJSRUFLIE1FTlVCUkVBSworJXRva2VuIE1FU1NBR0VUQUJMRQorJXRva2VuIFJDREFUQQorJXRva2VuIFNUUklOR1RBQkxFCisldG9rZW4gVkVSU0lPTklORk8gRklMRVZFUlNJT04gUFJPRFVDVFZFUlNJT04gRklMRUZMQUdTTUFTSyBGSUxFRkxBR1MKKyV0b2tlbiBGSUxFT1MgRklMRVRZUEUgRklMRVNVQlRZUEUgQkxPQ0tTVFJJTkdGSUxFSU5GTyBCTE9DS1ZBUkZJTEVJTkZPCisldG9rZW4gVkFMVUUKKyV0b2tlbiA8cz4gQkxPQ0sKKyV0b2tlbiBNT1ZFQUJMRSBGSVhFRCBQVVJFIElNUFVSRSBQUkVMT0FEIExPQURPTkNBTEwgRElTQ0FSREFCTEUKKyV0b2tlbiBOT1QKKyV0b2tlbiA8cz4gUVVPVEVEU1RSSU5HIFNUUklORworJXRva2VuIDxpPiBOVU1CRVIKKyV0b2tlbiA8c3M+IFNJWkVEU1RSSU5HCisKKyV0eXBlIDxwYWNjPiBhY2NfZW50cmllcworJXR5cGUgPGFjYz4gYWNjX2VudHJ5IGFjY19ldmVudAorJXR5cGUgPGRpYWxvZ19jb250cm9sPiBjb250cm9sIGNvbnRyb2xfcGFyYW1zCisldHlwZSA8bWVudWl0ZW0+IG1lbnVpdGVtcyBtZW51aXRlbSBtZW51ZXhpdGVtcyBtZW51ZXhpdGVtCisldHlwZSA8cmNkYXRhPiBvcHRyY2RhdGFfZGF0YSBvcHRyY2RhdGFfZGF0YV9pbnQgcmNkYXRhX2RhdGEKKyV0eXBlIDxyY2RhdGFfaXRlbT4gb3B0X2NvbnRyb2xfZGF0YQorJXR5cGUgPGZpeHZlcj4gZml4ZWR2ZXJpbmZvCisldHlwZSA8dmVyaW5mbz4gdmVyYmxvY2tzCisldHlwZSA8dmVyc3RyaW5nPiB2ZXJ2YWxzCisldHlwZSA8dmVydmFyPiB2ZXJ0cmFucworJXR5cGUgPHJlc19pbmZvPiBzdWJvcHRpb25zIG1lbWZsYWdzX21vdmVfZGlzY2FyZCBtZW1mbGFnc19tb3ZlCisldHlwZSA8bWVtZmxhZ3M+IG1lbWZsYWcKKyV0eXBlIDxpZD4gaWQKKyV0eXBlIDxpbD4gZXhzdHlsZSBwYXJlbm51bWJlcgorJXR5cGUgPGlsPiBudW1leHByIHBvc251bWV4cHIgY251bWV4cHIgb3B0Y251bWV4cHIgY3Bvc251bWV4cHIKKyV0eXBlIDxpcz4gYWNjX29wdGlvbnMgYWNjX29wdGlvbiBtZW51aXRlbV9mbGFncyBtZW51aXRlbV9mbGFnCisldHlwZSA8cz4gb3B0c3RyaW5nYyBmaWxlX25hbWUKKyV0eXBlIDxpPiBzaXplZG51bWV4cHIgc2l6ZWRwb3NudW1leHByCisKKyVsZWZ0ICd8JworJWxlZnQgJ14nCislbGVmdCAnJicKKyVsZWZ0ICcrJyAnLScKKyVsZWZ0ICcqJyAnLycgJyUnCislcmlnaHQgJ34nIE5FRworCislJQorCitpbnB1dDoKKwkgIC8qIGVtcHR5ICovCisJfCBpbnB1dCBuZXdjbWQgYWNjZWxlcmF0b3IKKwl8IGlucHV0IG5ld2NtZCBiaXRtYXAKKwl8IGlucHV0IG5ld2NtZCBjdXJzb3IKKwl8IGlucHV0IG5ld2NtZCBkaWFsb2cKKwl8IGlucHV0IG5ld2NtZCBmb250CisJfCBpbnB1dCBuZXdjbWQgaWNvbgorCXwgaW5wdXQgbmV3Y21kIGxhbmd1YWdlCisJfCBpbnB1dCBuZXdjbWQgbWVudQorCXwgaW5wdXQgbmV3Y21kIG1lbnVleAorCXwgaW5wdXQgbmV3Y21kIG1lc3NhZ2V0YWJsZQorCXwgaW5wdXQgbmV3Y21kIHJjZGF0YQorCXwgaW5wdXQgbmV3Y21kIHN0cmluZ3RhYmxlCisJfCBpbnB1dCBuZXdjbWQgdXNlcgorCXwgaW5wdXQgbmV3Y21kIHZlcnNpb25pbmZvCisJOworCituZXdjbWQ6CisJICAvKiBlbXB0eSAqLworCSAgeworCSAgICByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKTsKKwkgIH0KKwk7CisKKy8qIEFjY2VsZXJhdG9yIHJlc291cmNlcy4gICovCisKK2FjY2VsZXJhdG9yOgorCSAgaWQgQUNDRUxFUkFUT1JTIHN1Ym9wdGlvbnMgQkVHIGFjY19lbnRyaWVzIEVORAorCSAgeworCSAgICBkZWZpbmVfYWNjZWxlcmF0b3IgKCQxLCAmJDMsICQ1KTsKKwkgIH0KKwk7CisKK2FjY19lbnRyaWVzOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgJCQgPSBOVUxMOworCSAgfQorCXwgYWNjX2VudHJpZXMgYWNjX2VudHJ5CisJICB7CisJICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKKworCSAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7CisJICAgICphID0gJDI7CisJICAgIGlmICgkMSA9PSBOVUxMKQorCSAgICAgICQkID0gYTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJc3RydWN0IGFjY2VsZXJhdG9yICoqcHA7CisKKwkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorCQkgIDsKKwkJKnBwID0gYTsKKwkJJCQgPSAkMTsKKwkgICAgICB9CisJICB9CisJOworCithY2NfZW50cnk6CisJICBhY2NfZXZlbnQgY3Bvc251bWV4cHIKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgICAgJCQuaWQgPSAkMjsKKwkgIH0KKwl8IGFjY19ldmVudCBjcG9zbnVtZXhwciAnLCcgYWNjX29wdGlvbnMKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgICAgJCQuaWQgPSAkMjsKKwkgICAgJCQuZmxhZ3MgfD0gJDQ7CisJICAgIGlmICgoJCQuZmxhZ3MgJiBBQ0NfVklSVEtFWSkgPT0gMAorCQkmJiAoJCQuZmxhZ3MgJiAoQUNDX1NISUZUIHwgQUNDX0NPTlRST0wgfCBBQ0NfQUxUKSkgIT0gMCkKKwkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImluYXBwcm9wcmlhdGUgbW9kaWZpZXJzIGZvciBub24tVklSVEtFWSIpKTsKKwkgIH0KKwk7CisKK2FjY19ldmVudDoKKwkgIFFVT1RFRFNUUklORworCSAgeworCSAgICBjb25zdCBjaGFyICpzID0gJDE7CisJICAgIGNoYXIgY2g7CisKKwkgICAgJCQubmV4dCA9IE5VTEw7CisJICAgICQkLmlkID0gMDsKKwkgICAgY2ggPSAqczsKKwkgICAgaWYgKGNoICE9ICdeJykKKwkgICAgICAkJC5mbGFncyA9IDA7CisJICAgIGVsc2UKKwkgICAgICB7CisJCSQkLmZsYWdzID0gQUNDX0NPTlRST0wgfCBBQ0NfVklSVEtFWTsKKwkJKytzOworCQljaCA9ICpzOworCQljaCA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjaCk7CisJICAgICAgfQorCSAgICAkJC5rZXkgPSBjaDsKKwkgICAgaWYgKHNbMV0gIT0gJ1wwJykKKwkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImFjY2VsZXJhdG9yIHNob3VsZCBvbmx5IGJlIG9uZSBjaGFyYWN0ZXIiKSk7CisJICB9CisJfCBwb3NudW1leHByCisJICB7CisJICAgICQkLm5leHQgPSBOVUxMOworCSAgICAkJC5mbGFncyA9IDA7CisJICAgICQkLmlkID0gMDsKKwkgICAgJCQua2V5ID0gJDE7CisJICB9CisJOworCithY2Nfb3B0aW9uczoKKwkgIGFjY19vcHRpb24KKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwl8IGFjY19vcHRpb25zICcsJyBhY2Nfb3B0aW9uCisJICB7CisJICAgICQkID0gJDEgfCAkMzsKKwkgIH0KKwkvKiBJJ3ZlIGhhZCBvbmUgcmVwb3J0IHRoYXQgdGhlIGNvbW1hIGlzIG9wdGlvbmFsLiAgKi8KKwl8IGFjY19vcHRpb25zIGFjY19vcHRpb24KKwkgIHsKKwkgICAgJCQgPSAkMSB8ICQyOworCSAgfQorCTsKKworYWNjX29wdGlvbjoKKwkgIFZJUlRLRVkKKwkgIHsKKwkgICAgJCQgPSBBQ0NfVklSVEtFWTsKKwkgIH0KKwl8IEFTQ0lJCisJICB7CisJICAgIC8qIFRoaXMgaXMganVzdCB0aGUgYWJzZW5jZSBvZiBWSVJUS0VZLiAgKi8KKwkgICAgJCQgPSAwOworCSAgfQorCXwgTk9JTlZFUlQKKwkgIHsKKwkgICAgJCQgPSBBQ0NfTk9JTlZFUlQ7CisJICB9CisJfCBTSElGVAorCSAgeworCSAgICAkJCA9IEFDQ19TSElGVDsKKwkgIH0KKwl8IENPTlRST0wKKwkgIHsKKwkgICAgJCQgPSBBQ0NfQ09OVFJPTDsKKwkgIH0KKwl8IEFMVAorCSAgeworCSAgICAkJCA9IEFDQ19BTFQ7CisJICB9CisJOworCisvKiBCaXRtYXAgcmVzb3VyY2VzLiAgKi8KKworYml0bWFwOgorCSAgaWQgQklUTUFQIG1lbWZsYWdzX21vdmUgZmlsZV9uYW1lCisJICB7CisJICAgIGRlZmluZV9iaXRtYXAgKCQxLCAmJDMsICQ0KTsKKwkgIH0KKwk7CisKKy8qIEN1cnNvciByZXNvdXJjZXMuICAqLworCitjdXJzb3I6CisJICBpZCBDVVJTT1IgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQorCSAgeworCSAgICBkZWZpbmVfY3Vyc29yICgkMSwgJiQzLCAkNCk7CisJICB9CisJOworCisvKiBEaWFsb2cgcmVzb3VyY2VzLiAgKi8KKworZGlhbG9nOgorCSAgaWQgRElBTE9HIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCisJICAgIGNudW1leHByCisJICAgIHsKKwkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOworCSAgICAgIGRpYWxvZy54ID0gJDU7CisJICAgICAgZGlhbG9nLnkgPSAkNjsKKwkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKKwkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7CisJICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOworCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7CisJICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOworCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7CisJICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOworCSAgICAgIGRpYWxvZy5leCA9IE5VTEw7CisJICAgICAgZGlhbG9nLmNvbnRyb2xzID0gTlVMTDsKKwkgICAgICBzdWJfcmVzX2luZm8gPSAkMzsKKwkgICAgfQorCSAgICBzdHlsZXMgQkVHIGNvbnRyb2xzIEVORAorCSAgeworCSAgICBkZWZpbmVfZGlhbG9nICgkMSwgJnN1Yl9yZXNfaW5mbywgJmRpYWxvZyk7CisJICB9CisJfCBpZCBESUFMT0dFWCBtZW1mbGFnc19tb3ZlIGV4c3R5bGUgcG9zbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgorCSAgICBjbnVtZXhwcgorCSAgICB7CisJICAgICAgbWVtc2V0ICgmZGlhbG9nLCAwLCBzaXplb2YgZGlhbG9nKTsKKwkgICAgICBkaWFsb2cueCA9ICQ1OworCSAgICAgIGRpYWxvZy55ID0gJDY7CisJICAgICAgZGlhbG9nLndpZHRoID0gJDc7CisJICAgICAgZGlhbG9nLmhlaWdodCA9ICQ4OworCSAgICAgIGRpYWxvZy5zdHlsZSA9IFdTX1BPUFVQIHwgV1NfQk9SREVSIHwgV1NfU1lTTUVOVTsKKwkgICAgICBkaWFsb2cuZXhzdHlsZSA9ICQ0OworCSAgICAgIGRpYWxvZy5tZW51Lm5hbWVkID0gMTsKKwkgICAgICBkaWFsb2cuY2xhc3MubmFtZWQgPSAxOworCSAgICAgIGRpYWxvZy5mb250ID0gTlVMTDsKKwkgICAgICBkaWFsb2cuZXggPSAoKHN0cnVjdCBkaWFsb2dfZXggKikKKwkJCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSkpOworCSAgICAgIG1lbXNldCAoZGlhbG9nLmV4LCAwLCBzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKTsKKwkgICAgICBkaWFsb2cuY29udHJvbHMgPSBOVUxMOworCSAgICAgIHN1Yl9yZXNfaW5mbyA9ICQzOworCSAgICB9CisJICAgIHN0eWxlcyBCRUcgY29udHJvbHMgRU5ECisJICB7CisJICAgIGRlZmluZV9kaWFsb2cgKCQxLCAmc3ViX3Jlc19pbmZvLCAmZGlhbG9nKTsKKwkgIH0KKwl8IGlkIERJQUxPR0VYIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCisJICAgIGNudW1leHByIGNudW1leHByCisJICAgIHsKKwkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOworCSAgICAgIGRpYWxvZy54ID0gJDU7CisJICAgICAgZGlhbG9nLnkgPSAkNjsKKwkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKKwkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7CisJICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOworCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7CisJICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOworCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7CisJICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOworCSAgICAgIGRpYWxvZy5leCA9ICgoc3RydWN0IGRpYWxvZ19leCAqKQorCQkJICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKSk7CisJICAgICAgbWVtc2V0IChkaWFsb2cuZXgsIDAsIHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOworCSAgICAgIGRpYWxvZy5leC0+aGVscCA9ICQ5OworCSAgICAgIGRpYWxvZy5jb250cm9scyA9IE5VTEw7CisJICAgICAgc3ViX3Jlc19pbmZvID0gJDM7CisJICAgIH0KKwkgICAgc3R5bGVzIEJFRyBjb250cm9scyBFTkQKKwkgIHsKKwkgICAgZGVmaW5lX2RpYWxvZyAoJDEsICZzdWJfcmVzX2luZm8sICZkaWFsb2cpOworCSAgfQorCTsKKworZXhzdHlsZToKKwkgIC8qIGVtcHR5ICovCisJICB7CisJICAgICQkID0gMDsKKwkgIH0KKwl8IEVYU1RZTEUgJz0nIG51bWV4cHIKKwkgIHsKKwkgICAgJCQgPSAkMzsKKwkgIH0KKwk7CisKK3N0eWxlczoKKwkgIC8qIGVtcHR5ICovCisJfCBzdHlsZXMgQ0FQVElPTiBRVU9URURTVFJJTkcKKwkgIHsKKwkgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZkaWFsb2cuY2FwdGlvbiwgJDMpOworCSAgfQorCXwgc3R5bGVzIENMQVNTIGlkCisJICB7CisJICAgIGRpYWxvZy5jbGFzcyA9ICQzOworCSAgfQorCXwgc3R5bGVzIFNUWUxFCisJICAgIHsgc3R5bGUgPSBkaWFsb2cuc3R5bGU7IH0KKwkgICAgc3R5bGVleHByCisJICB7CisJICAgIGRpYWxvZy5zdHlsZSA9IHN0eWxlOworCSAgfQorCXwgc3R5bGVzIEVYU1RZTEUgbnVtZXhwcgorCSAgeworCSAgICBkaWFsb2cuZXhzdHlsZSA9ICQzOworCSAgfQorCXwgc3R5bGVzIEZPTlQgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HCisJICB7CisJICAgIGRpYWxvZy5zdHlsZSB8PSBEU19TRVRGT05UOworCSAgICBkaWFsb2cucG9pbnRzaXplID0gJDM7CisJICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmZGlhbG9nLmZvbnQsICQ1KTsKKwkgIH0KKwl8IHN0eWxlcyBGT05UIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwcgorCSAgeworCSAgICBkaWFsb2cuc3R5bGUgfD0gRFNfU0VURk9OVDsKKwkgICAgZGlhbG9nLnBvaW50c2l6ZSA9ICQzOworCSAgICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJmRpYWxvZy5mb250LCAkNSk7CisJICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKKwkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImV4dGVuZGVkIEZPTlQgcmVxdWlyZXMgRElBTE9HRVgiKSk7CisJICAgIGVsc2UKKwkgICAgICB7CisJCWRpYWxvZy5leC0+d2VpZ2h0ID0gJDY7CisJCWRpYWxvZy5leC0+aXRhbGljID0gJDc7CisJICAgICAgfQorCSAgfQorCXwgc3R5bGVzIE1FTlUgaWQKKwkgIHsKKwkgICAgZGlhbG9nLm1lbnUgPSAkMzsKKwkgIH0KKwl8IHN0eWxlcyBDSEFSQUNURVJJU1RJQ1MgbnVtZXhwcgorCSAgeworCSAgICBzdWJfcmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzID0gJDM7CisJICB9CisJfCBzdHlsZXMgTEFOR1VBR0UgbnVtZXhwciBjbnVtZXhwcgorCSAgeworCSAgICBzdWJfcmVzX2luZm8ubGFuZ3VhZ2UgPSAkMyB8ICgkNCA8PCA4KTsKKwkgIH0KKwl8IHN0eWxlcyBWRVJTSU9OSyBudW1leHByCisJICB7CisJICAgIHN1Yl9yZXNfaW5mby52ZXJzaW9uID0gJDM7CisJICB9CisJOworCitjb250cm9sczoKKwkgIC8qIGVtcHR5ICovCisJfCBjb250cm9scyBjb250cm9sCisJICB7CisJICAgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKnBwOworCisJICAgIGZvciAocHAgPSAmZGlhbG9nLmNvbnRyb2xzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCisJICAgICAgOworCSAgICAqcHAgPSAkMjsKKwkgIH0KKwk7CisKK2NvbnRyb2w6CisJICBBVVRPM1NUQVRFCisJICAgIHsKKwkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQVVUTzNTVEFURSB8IFdTX1RBQlNUT1A7CisJICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE8zU1RBVEU7CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBBVVRPQ0hFQ0tCT1gKKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1g7CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBBVVRPUkFESU9CVVRUT04KKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT047CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBCRURJVAorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKKwkgICAgICBjbGFzcyA9IENUTF9FRElUOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKKwkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oIklFRElUIHJlcXVpcmVzIERJQUxPR0VYIikpOworCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQtPmNsYXNzLCAiQkVESVQiKTsKKwkgIH0KKwl8IENIRUNLQk9YCisJICAgIHsKKwkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19DSEVDS0JPWCB8IFdTX1RBQlNUT1A7CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBDT01CT0JPWAorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IENCU19TSU1QTEUgfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSAwOworCSAgICAgIGNsYXNzID0gQ1RMX0NPTUJPQk9YOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgorCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCisJICB7CisJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKKwkgICAgaWYgKCQxMSAhPSBOVUxMKQorCSAgICAgIHsKKwkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOworCQkkJC0+ZGF0YSA9ICQxMTsKKwkgICAgICB9CisJICB9CisJfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgorCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCisJICB7CisJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKKwkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKKwkgICAgJCQtPmhlbHAgPSAkMTE7CisJICAgICQkLT5kYXRhID0gJDEyOworCSAgfQorCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgorCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCisJICB7CisJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKKwkgICAgaWYgKCQxMiAhPSBOVUxMKQorCSAgICAgIHsKKwkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCQkgIHJjcGFyc2Vfd2FybmluZyAoImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpOworCQkkJC0+ZGF0YSA9ICQxMjsKKwkgICAgICB9CisJICAgICQkLT5jbGFzcy5uYW1lZCA9IDE7CisgIAkgICAgdW5pY29kZV9mcm9tX2FzY2lpKCYkJC0+Y2xhc3MudS5uLmxlbmd0aCwgJiQkLT5jbGFzcy51Lm4ubmFtZSwgJDUpOworCSAgfQorCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgorCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCisJICB7CisJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKKwkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoImhlbHAgSUQgcmVxdWlyZXMgRElBTE9HRVgiKTsKKwkgICAgJCQtPmhlbHAgPSAkMTI7CisJICAgICQkLT5kYXRhID0gJDEzOworCSAgICAkJC0+Y2xhc3MubmFtZWQgPSAxOworICAJICAgIHVuaWNvZGVfZnJvbV9hc2NpaSgmJCQtPmNsYXNzLnUubi5sZW5ndGgsICYkJC0+Y2xhc3MudS5uLm5hbWUsICQ1KTsKKwkgIH0KKwl8IENURVhUCisJICAgIHsKKwkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfQ0VOVEVSIHwgV1NfR1JPVVA7CisJICAgICAgYmFzZV9zdHlsZSA9IFNTX0NFTlRFUjsKKwkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7CisJICAgIH0KKwkgICAgY29udHJvbF9wYXJhbXMKKwkgIHsKKwkgICAgJCQgPSAkMzsKKwkgIH0KKwl8IERFRlBVU0hCVVRUT04KKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKKwkgICAgICBiYXNlX3N0eWxlID0gQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBFRElUVEVYVAorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKKwkgICAgICBjbGFzcyA9IENUTF9FRElUOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBHUk9VUEJPWAorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0dST1VQQk9YOworCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19HUk9VUEJPWDsKKwkgICAgICBjbGFzcyA9IENUTF9CVVRUT047CisJICAgIH0KKwkgICAgY29udHJvbF9wYXJhbXMKKwkgIHsKKwkgICAgJCQgPSAkMzsKKwkgIH0KKwl8IEhFRElUCisJICAgIHsKKwkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7CisJICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOworCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7CisJICAgIH0KKwkgICAgY29udHJvbF9wYXJhbXMKKwkgIHsKKwkgICAgJCQgPSAkMzsKKwkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiSUVESVQgcmVxdWlyZXMgRElBTE9HRVgiKSk7CisJICAgIHJlc19zdHJpbmdfdG9faWQgKCYkJC0+Y2xhc3MsICJIRURJVCIpOworCSAgfQorCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQorCSAgeworCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMiwgJDMsICQ0LCAkNSwgMCwgMCwgQ1RMX1NUQVRJQywKKwkJCQkgU1NfSUNPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMCk7CisJICAgIGlmICgkNiAhPSBOVUxMKQorCSAgICAgIHsKKwkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOworCQkkJC0+ZGF0YSA9ICQ2OworCSAgICAgIH0KKwkgIH0KKwl8IElDT04gb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCisJICAgIGljb25fc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKKwkgIHsKKyAgICAJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDQsICQ1LCAkNiwgJDcsIENUTF9TVEFUSUMsCisJCQkJIHN0eWxlLCAkOSk7CisJICAgIGlmICgkMTAgIT0gTlVMTCkKKwkgICAgICB7CisJCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKKwkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKKwkJJCQtPmRhdGEgPSAkMTA7CisJICAgICAgfQorCSAgfQorCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKKwkgICAgaWNvbl9zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQorCSAgeworICAgIAkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgQ1RMX1NUQVRJQywKKwkJCQkgc3R5bGUsICQ5KTsKKwkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKKwkgICAgJCQtPmhlbHAgPSAkMTA7CisJICAgICQkLT5kYXRhID0gJDExOworCSAgfQorCXwgSUVESVQKKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKKwkgICAgICBiYXNlX3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7CisJICAgICAgY2xhc3MgPSBDVExfRURJVDsKKwkgICAgfQorCSAgICBjb250cm9sX3BhcmFtcworCSAgeworCSAgICAkJCA9ICQzOworCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCisJICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJJRURJVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKKwkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLT5jbGFzcywgIklFRElUIik7CisJICB9CisJfCBMSVNUQk9YCisJICAgIHsKKwkgICAgICBkZWZhdWx0X3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKKwkgICAgICBiYXNlX3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKKwkgICAgICBjbGFzcyA9IENUTF9MSVNUQk9YOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBMVEVYVAorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX0xFRlQgfCBXU19HUk9VUDsKKwkgICAgICBiYXNlX3N0eWxlID0gU1NfTEVGVDsKKwkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7CisJICAgIH0KKwkgICAgY29udHJvbF9wYXJhbXMKKwkgIHsKKwkgICAgJCQgPSAkMzsKKwkgIH0KKwl8IFBVU0hCT1gKKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQk9YIHwgV1NfVEFCU1RPUDsKKwkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJPWDsKKwkgICAgICBjbGFzcyA9IENUTF9CVVRUT047CisJICAgIH0KKwkgICAgY29udHJvbF9wYXJhbXMKKwkgIHsKKwkgICAgJCQgPSAkMzsKKwkgIH0KKwl8IFBVU0hCVVRUT04KKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKKwkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBSQURJT0JVVFRPTgorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUDsKKwkgICAgICBiYXNlX3N0eWxlID0gQlNfUkFESU9CVVRUT047CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBSVEVYVAorCSAgICB7CisJICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX1JJR0hUIHwgV1NfR1JPVVA7CisJICAgICAgYmFzZV9zdHlsZSA9IFNTX1JJR0hUOworCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKKwkgICAgfQorCSAgICBjb250cm9sX3BhcmFtcworCSAgeworCSAgICAkJCA9ICQzOworCSAgfQorCXwgU0NST0xMQkFSCisJICAgIHsKKwkgICAgICBkZWZhdWx0X3N0eWxlID0gU0JTX0hPUlo7CisJICAgICAgYmFzZV9zdHlsZSA9IDA7CisJICAgICAgY2xhc3MgPSBDVExfU0NST0xMQkFSOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBTVEFURTMKKwkgICAgeworCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU18zU1RBVEUgfCBXU19UQUJTVE9QOworCSAgICAgIGJhc2Vfc3R5bGUgPSBCU18zU1RBVEU7CisJICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOworCSAgICB9CisJICAgIGNvbnRyb2xfcGFyYW1zCisJICB7CisJICAgICQkID0gJDM7CisJICB9CisJfCBVU0VSQlVUVE9OIFFVT1RFRFNUUklORyAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcKKwkgICAgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgCisJICAgIHsgc3R5bGUgPSBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KKwkgICAgc3R5bGVleHByIG9wdGNudW1leHByCisJICB7CisJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkNCwgJDYsICQ4LCAkMTAsICQxMiwgQ1RMX0JVVFRPTiwKKwkJCQkgc3R5bGUsICQxNik7CisJICB9CisJOworCisvKiBQYXJhbWV0ZXJzIGZvciBhIGNvbnRyb2wuICBUaGUgc3RhdGljIHZhcmlhYmxlcyBERUZBVUxUX1NUWUxFLAorICAgQkFTRV9TVFlMRSwgYW5kIENMQVNTIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgbm9udGVybWluYWwKKyAgIGlzIHVzZWQuICBERUZBVUxUX1NUWUxFIGlzIHRoZSBzdHlsZSB0byB1c2UgaWYgbm8gc3R5bGUgZXhwcmVzc2lvbgorICAgaXMgc3BlY2lmaWVkLiAgQkFTRV9TVFlMRSBpcyB0aGUgYmFzZSBzdHlsZSB0byB1c2UgaWYgYSBzdHlsZQorICAgZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQ7IHRoZSBzdHlsZSBleHByZXNzaW9uIG1vZGlmaWVzIHRoZSBiYXNlCisgICBzdHlsZS4gIENMQVNTIGlzIHRoZSBjbGFzcyBvZiB0aGUgY29udHJvbC4gICovCisKK2NvbnRyb2xfcGFyYW1zOgorCSAgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCisJICAgIG9wdF9jb250cm9sX2RhdGEKKwkgIHsKKwkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsCisJCQkJIGRlZmF1bHRfc3R5bGUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDApOworCSAgICBpZiAoJDcgIT0gTlVMTCkKKwkgICAgICB7CisJCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKKwkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKKwkJJCQtPmRhdGEgPSAkNzsKKwkgICAgICB9CisJICB9CisJfCBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKKwkgICAgY29udHJvbF9wYXJhbXNfc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKKwkgIHsKKwkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsIHN0eWxlLCAkOCk7CisJICAgIGlmICgkOSAhPSBOVUxMKQorCSAgICAgIHsKKwkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOworCQkkJC0+ZGF0YSA9ICQ5OworCSAgICAgIH0KKwkgIH0KKwl8IG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgorCSAgICBjb250cm9sX3BhcmFtc19zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQorCSAgeworCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywgc3R5bGUsICQ4KTsKKwkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQorCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKKwkgICAgJCQtPmhlbHAgPSAkOTsKKwkgICAgJCQtPmRhdGEgPSAkMTA7CisJICB9CisJOworCitvcHRzdHJpbmdjOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgJCQgPSBOVUxMOworCSAgfQorCXwgUVVPVEVEU1RSSU5HICcsJworCSAgeworCSAgICAkJCA9ICQxOworCSAgfQorCTsKKworb3B0X2NvbnRyb2xfZGF0YToKKwkgIC8qIGVtcHR5ICovCisJICB7CisJICAgICQkID0gTlVMTDsKKwkgIH0KKwl8IEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKKwkgIHsKKwkgICAgJCQgPSAkMi5maXJzdDsKKwkgIH0KKwk7CisKKy8qIFRoZXNlIG9ubHkgZXhpc3QgdG8gcGFyc2UgYSByZWR1Y3Rpb24gb3V0IG9mIGEgY29tbW9uIGNhc2UuICAqLworCitjb250cm9sX3N0eWxlZXhwcjoKKwkgICcsJworCSAgeyBzdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQorCSAgc3R5bGVleHByCisJOworCitpY29uX3N0eWxlZXhwcjoKKwkgICcsJworCSAgeyBzdHlsZSA9IFNTX0lDT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KKwkgIHN0eWxlZXhwcgorCTsKKworY29udHJvbF9wYXJhbXNfc3R5bGVleHByOgorCSAgJywnCisJICB7IHN0eWxlID0gYmFzZV9zdHlsZSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQorCSAgc3R5bGVleHByCisJOworCisvKiBGb250IHJlc291cmNlcy4gICovCisKK2ZvbnQ6CisJICBpZCBGT05UIG1lbWZsYWdzX21vdmVfZGlzY2FyZCBmaWxlX25hbWUKKwkgIHsKKwkgICAgZGVmaW5lX2ZvbnQgKCQxLCAmJDMsICQ0KTsKKwkgIH0KKwk7CisKKy8qIEljb24gcmVzb3VyY2VzLiAgKi8KKworaWNvbjoKKwkgIGlkIElDT04gbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQorCSAgeworCSAgICBkZWZpbmVfaWNvbiAoJDEsICYkMywgJDQpOworCSAgfQorCTsKKworLyogTGFuZ3VhZ2UgY29tbWFuZC4gIFRoaXMgY2hhbmdlcyB0aGUgc3RhdGljIHZhcmlhYmxlIGxhbmd1YWdlLCB3aGljaAorICAgYWZmZWN0cyBhbGwgc3Vic2VxdWVudCByZXNvdXJjZXMuICAqLworCitsYW5ndWFnZToKKwkgIExBTkdVQUdFIG51bWV4cHIgY251bWV4cHIKKwkgIHsKKwkgICAgbGFuZ3VhZ2UgPSAkMiB8ICgkMyA8PCA4KTsKKwkgIH0KKwk7CisKKy8qIE1lbnUgcmVzb3VyY2VzLiAgKi8KKworbWVudToKKwkgIGlkIE1FTlUgc3Vib3B0aW9ucyBCRUcgbWVudWl0ZW1zIEVORAorCSAgeworCSAgICBkZWZpbmVfbWVudSAoJDEsICYkMywgJDUpOworCSAgfQorCTsKKworbWVudWl0ZW1zOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgJCQgPSBOVUxMOworCSAgfQorCXwgbWVudWl0ZW1zIG1lbnVpdGVtCisJICB7CisJICAgIGlmICgkMSA9PSBOVUxMKQorCSAgICAgICQkID0gJDI7CisJICAgIGVsc2UKKwkgICAgICB7CisJCXN0cnVjdCBtZW51aXRlbSAqKnBwOworCisJCWZvciAocHAgPSAmJDEtPm5leHQ7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKKwkJICA7CisJCSpwcCA9ICQyOworCQkkJCA9ICQxOworCSAgICAgIH0KKwkgIH0KKwk7CisKK21lbnVpdGVtOgorCSAgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIG1lbnVpdGVtX2ZsYWdzCisJICB7CisJICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAwLCAwLCBOVUxMKTsKKwkgIH0KKwl8IE1FTlVJVEVNIFNFUEFSQVRPUgorCSAgeworCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7CisJICB9CisJfCBQT1BVUCBRVU9URURTVFJJTkcgbWVudWl0ZW1fZmxhZ3MgQkVHIG1lbnVpdGVtcyBFTkQKKwkgIHsKKwkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAwLCAkMywgMCwgMCwgJDUpOworCSAgfQorCTsKKworbWVudWl0ZW1fZmxhZ3M6CisJICAvKiBlbXB0eSAqLworCSAgeworCSAgICAkJCA9IDA7CisJICB9CisJfCBtZW51aXRlbV9mbGFncyAnLCcgbWVudWl0ZW1fZmxhZworCSAgeworCSAgICAkJCA9ICQxIHwgJDM7CisJICB9CisJfCBtZW51aXRlbV9mbGFncyBtZW51aXRlbV9mbGFnCisJICB7CisJICAgICQkID0gJDEgfCAkMjsKKwkgIH0KKwk7CisKK21lbnVpdGVtX2ZsYWc6CisJICBDSEVDS0VECisJICB7CisJICAgICQkID0gTUVOVUlURU1fQ0hFQ0tFRDsKKwkgIH0KKwl8IEdSQVlFRAorCSAgeworCSAgICAkJCA9IE1FTlVJVEVNX0dSQVlFRDsKKwkgIH0KKwl8IEhFTFAKKwkgIHsKKwkgICAgJCQgPSBNRU5VSVRFTV9IRUxQOworCSAgfQorCXwgSU5BQ1RJVkUKKwkgIHsKKwkgICAgJCQgPSBNRU5VSVRFTV9JTkFDVElWRTsKKwkgIH0KKwl8IE1FTlVCQVJCUkVBSworCSAgeworCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCQVJCUkVBSzsKKwkgIH0KKwl8IE1FTlVCUkVBSworCSAgeworCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCUkVBSzsKKwkgIH0KKwk7CisKKy8qIE1lbnVleCByZXNvdXJjZXMuICAqLworCittZW51ZXg6CisJICBpZCBNRU5VRVggc3Vib3B0aW9ucyBCRUcgbWVudWV4aXRlbXMgRU5ECisJICB7CisJICAgIGRlZmluZV9tZW51ICgkMSwgJiQzLCAkNSk7CisJICB9CisJOworCittZW51ZXhpdGVtczoKKwkgIC8qIGVtcHR5ICovCisJICB7CisJICAgICQkID0gTlVMTDsKKwkgIH0KKwl8IG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KKwkgIHsKKwkgICAgaWYgKCQxID09IE5VTEwpCisJICAgICAgJCQgPSAkMjsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJc3RydWN0IG1lbnVpdGVtICoqcHA7CisKKwkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorCQkgIDsKKwkJKnBwID0gJDI7CisJCSQkID0gJDE7CisJICAgICAgfQorCSAgfQorCTsKKworbWVudWV4aXRlbToKKwkgIE1FTlVJVEVNIFFVT1RFRFNUUklORworCSAgeworCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsIDAsIDAsIDAsIE5VTEwpOworCSAgfQorCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByCisJICB7CisJICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsIDAsIDAsIDAsIE5VTEwpOworCSAgfQorCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByCisJICB7CisJICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgMCwgTlVMTCk7CisJICB9CisgCXwgTUVOVUlURU0gU0VQQVJBVE9SCisgCSAgeworIAkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwpOworIAkgIH0KKwl8IFBPUFVQIFFVT1RFRFNUUklORyBCRUcgbWVudWV4aXRlbXMgRU5ECisJICB7CisJICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgMCwgMCwgMCwgMCwgJDQpOworCSAgfQorCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKKwkgIHsKKwkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgMCwgMCwgMCwgJDUpOworCSAgfQorCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKKwkgIHsKKwkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsIDAsIDAsICQ2KTsKKwkgIH0KKwl8IFBPUFVQIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwcgorCSAgICBCRUcgbWVudWV4aXRlbXMgRU5ECisJICB7CisJICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgJDYsICQ4KTsKKwkgIH0KKwk7CisKKy8qIE1lc3NhZ2V0YWJsZSByZXNvdXJjZXMuICAqLworCittZXNzYWdldGFibGU6CisJICBpZCBNRVNTQUdFVEFCTEUgbWVtZmxhZ3NfbW92ZSBmaWxlX25hbWUKKwkgIHsKKwkgICAgZGVmaW5lX21lc3NhZ2V0YWJsZSAoJDEsICYkMywgJDQpOworCSAgfQorCTsKKworLyogUmNkYXRhIHJlc291cmNlcy4gICovCisKK3JjZGF0YToKKwkgIGlkIFJDREFUQSBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKKwkgIHsKKwkgICAgZGVmaW5lX3JjZGF0YSAoJDEsICYkMywgJDUuZmlyc3QpOworCSAgfQorCTsKKworLyogV2UgdXNlIGEgZGlmZmVyZW50IGxleGluZyBhbGdvcml0aG0sIGJlY2F1c2UgcmNkYXRhIHN0cmluZ3MgbWF5CisgICBjb250YWluIGVtYmVkZGVkIG51bGwgYnl0ZXMsIGFuZCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCB0byB1c2UuICAqLworCitvcHRyY2RhdGFfZGF0YToKKwkgIHsKKwkgICAgcmNwYXJzZV9yY2RhdGEgKCk7CisJICB9CisJICBvcHRyY2RhdGFfZGF0YV9pbnQKKwkgIHsKKwkgICAgcmNwYXJzZV9ub3JtYWwgKCk7CisJICAgICQkID0gJDI7CisJICB9CisJOworCitvcHRyY2RhdGFfZGF0YV9pbnQ6CisJICAvKiBlbXB0eSAqLworCSAgeworCSAgICAkJC5maXJzdCA9IE5VTEw7CisJICAgICQkLmxhc3QgPSBOVUxMOworCSAgfQorCXwgcmNkYXRhX2RhdGEKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwk7CisKK3JjZGF0YV9kYXRhOgorCSAgU0laRURTVFJJTkcKKwkgIHsKKwkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKKworCSAgICByaSA9IGRlZmluZV9yY2RhdGFfc3RyaW5nICgkMS5zLCAkMS5sZW5ndGgpOworCSAgICAkJC5maXJzdCA9IHJpOworCSAgICAkJC5sYXN0ID0gcmk7CisJICB9CisJfCBzaXplZG51bWV4cHIKKwkgIHsKKwkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKKworCSAgICByaSA9IGRlZmluZV9yY2RhdGFfbnVtYmVyICgkMS52YWwsICQxLmR3b3JkKTsKKwkgICAgJCQuZmlyc3QgPSByaTsKKwkgICAgJCQubGFzdCA9IHJpOworCSAgfQorCXwgcmNkYXRhX2RhdGEgJywnIFNJWkVEU1RSSU5HCisJICB7CisJICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7CisKKwkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX3N0cmluZyAoJDMucywgJDMubGVuZ3RoKTsKKwkgICAgJCQuZmlyc3QgPSAkMS5maXJzdDsKKwkgICAgJDEubGFzdC0+bmV4dCA9IHJpOworCSAgICAkJC5sYXN0ID0gcmk7CisJICB9CisJfCByY2RhdGFfZGF0YSAnLCcgc2l6ZWRudW1leHByCisJICB7CisJICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7CisKKwkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX251bWJlciAoJDMudmFsLCAkMy5kd29yZCk7CisJICAgICQkLmZpcnN0ID0gJDEuZmlyc3Q7CisJICAgICQxLmxhc3QtPm5leHQgPSByaTsKKwkgICAgJCQubGFzdCA9IHJpOworCSAgfQorCTsKKworLyogU3RyaW5ndGFibGUgcmVzb3VyY2VzLiAgKi8KKworc3RyaW5ndGFibGU6CisJICBTVFJJTkdUQUJMRSBzdWJvcHRpb25zIEJFRyAKKwkgICAgeyBzdWJfcmVzX2luZm8gPSAkMjsgfQorCSAgICBzdHJpbmdfZGF0YSBFTkQKKwk7CisKK3N0cmluZ19kYXRhOgorCSAgLyogZW1wdHkgKi8KKwl8IHN0cmluZ19kYXRhIG51bWV4cHIgUVVPVEVEU1RSSU5HCisJICB7CisJICAgIGRlZmluZV9zdHJpbmd0YWJsZSAoJnN1Yl9yZXNfaW5mbywgJDIsICQzKTsKKwkgIH0KKwl8IHN0cmluZ19kYXRhIG51bWV4cHIgJywnIFFVT1RFRFNUUklORworCSAgeworCSAgICBkZWZpbmVfc3RyaW5ndGFibGUgKCZzdWJfcmVzX2luZm8sICQyLCAkNCk7CisJICB9CisJOworCisvKiBVc2VyIGRlZmluZWQgcmVzb3VyY2VzLiAgV2UgYWNjZXB0IGdlbmVyYWwgc3Vib3B0aW9ucyBpbiB0aGUKKyAgIGZpbGVfbmFtZSBjYXNlIHRvIGtlZXAgdGhlIHBhcnNlciBoYXBweS4gICovCisKK3VzZXI6CisJICBpZCBpZCBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKKwkgIHsKKwkgICAgZGVmaW5lX3VzZXJfZGF0YSAoJDEsICQyLCAmJDMsICQ1LmZpcnN0KTsKKwkgIH0KKwl8IGlkIGlkIHN1Ym9wdGlvbnMgZmlsZV9uYW1lCisJICB7CisJICAgIGRlZmluZV91c2VyX2ZpbGUgKCQxLCAkMiwgJiQzLCAkNCk7CisJICB9CisJOworCisvKiBWZXJzaW9uaW5mbyByZXNvdXJjZXMuICAqLworCit2ZXJzaW9uaW5mbzoKKwkgIGlkIFZFUlNJT05JTkZPIGZpeGVkdmVyaW5mbyBCRUcgdmVyYmxvY2tzIEVORAorCSAgeworCSAgICBkZWZpbmVfdmVyc2lvbmluZm8gKCQxLCBsYW5ndWFnZSwgJDMsICQ1KTsKKwkgIH0KKwk7CisKK2ZpeGVkdmVyaW5mbzoKKwkgIC8qIGVtcHR5ICovCisJICB7CisJICAgICQkID0gKChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikKKwkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvKSkpOworCSAgICBtZW1zZXQgKCQkLCAwLCBzaXplb2YgKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbykpOworCSAgfQorCXwgZml4ZWR2ZXJpbmZvIEZJTEVWRVJTSU9OIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKKwkgIHsKKwkgICAgJDEtPmZpbGVfdmVyc2lvbl9tcyA9ICgkMyA8PCAxNikgfCAkNDsKKwkgICAgJDEtPmZpbGVfdmVyc2lvbl9scyA9ICgkNSA8PCAxNikgfCAkNjsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwl8IGZpeGVkdmVyaW5mbyBQUk9EVUNUVkVSU0lPTiBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCisJICB7CisJICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSAoJDMgPDwgMTYpIHwgJDQ7CisJICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbHMgPSAoJDUgPDwgMTYpIHwgJDY7CisJICAgICQkID0gJDE7CisJICB9CisJfCBmaXhlZHZlcmluZm8gRklMRUZMQUdTTUFTSyBudW1leHByCisJICB7CisJICAgICQxLT5maWxlX2ZsYWdzX21hc2sgPSAkMzsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwl8IGZpeGVkdmVyaW5mbyBGSUxFRkxBR1MgbnVtZXhwcgorCSAgeworCSAgICAkMS0+ZmlsZV9mbGFncyA9ICQzOworCSAgICAkJCA9ICQxOworCSAgfQorCXwgZml4ZWR2ZXJpbmZvIEZJTEVPUyBudW1leHByCisJICB7CisJICAgICQxLT5maWxlX29zID0gJDM7CisJICAgICQkID0gJDE7CisJICB9CisJfCBmaXhlZHZlcmluZm8gRklMRVRZUEUgbnVtZXhwcgorCSAgeworCSAgICAkMS0+ZmlsZV90eXBlID0gJDM7CisJICAgICQkID0gJDE7CisJICB9CisJfCBmaXhlZHZlcmluZm8gRklMRVNVQlRZUEUgbnVtZXhwcgorCSAgeworCSAgICAkMS0+ZmlsZV9zdWJ0eXBlID0gJDM7CisJICAgICQkID0gJDE7CisJICB9CisJOworCisvKiBUbyBoYW5kbGUgdmVyYmxvY2tzIHN1Y2Nlc3NmdWxseSwgdGhlIGxleGVyIGhhbmRsZXMgQkxPQ0sKKyAgIHNwZWNpYWxseS4gIEEgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcworICAgQkxPQ0tTVFJJTkdGSUxFSU5GTy4gIEEgQkxPQ0sgIlZhckZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcworICAgQkxPQ0tWQVJGSUxFSU5GTy4gIEEgQkxPQ0sgd2l0aCBzb21lIG90aGVyIHN0cmluZyByZXR1cm5zIEJMT0NLCisgICB3aXRoIHRoZSBzdHJpbmcgYXMgdGhlIHZhbHVlLiAgKi8KKwordmVyYmxvY2tzOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgJCQgPSBOVUxMOworCSAgfQorCXwgdmVyYmxvY2tzIEJMT0NLU1RSSU5HRklMRUlORk8gQkVHIEJMT0NLIEJFRyB2ZXJ2YWxzIEVORCBFTkQKKwkgIHsKKwkgICAgJCQgPSBhcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICgkMSwgJDQsICQ2KTsKKwkgIH0KKwl8IHZlcmJsb2NrcyBCTE9DS1ZBUkZJTEVJTkZPIEJFRyBWQUxVRSBRVU9URURTVFJJTkcgdmVydHJhbnMgRU5ECisJICB7CisJICAgICQkID0gYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAoJDEsICQ1LCAkNik7CisJICB9CisJOworCit2ZXJ2YWxzOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgJCQgPSBOVUxMOworCSAgfQorCXwgdmVydmFscyBWQUxVRSBRVU9URURTVFJJTkcgJywnIFFVT1RFRFNUUklORworCSAgeworCSAgICAkJCA9IGFwcGVuZF92ZXJ2YWwgKCQxLCAkMywgJDUpOworCSAgfQorCTsKKwordmVydHJhbnM6CisJICAvKiBlbXB0eSAqLworCSAgeworCSAgICAkJCA9IE5VTEw7CisJICB9CisJfCB2ZXJ0cmFucyBjbnVtZXhwciBjbnVtZXhwcgorCSAgeworCSAgICAkJCA9IGFwcGVuZF92ZXJ0cmFucyAoJDEsICQyLCAkMyk7CisJICB9CisJOworCisvKiBBIHJlc291cmNlIElELiAgKi8KKworaWQ6CisJICBwb3NudW1leHByCisJICB7CisJICAgICQkLm5hbWVkID0gMDsKKwkgICAgJCQudS5pZCA9ICQxOworCSAgfQorCXwgU1RSSU5HCisJICB7CisJICAgIGNoYXIgKmNvcHksICpzOworCisJICAgIC8qIEl0IHNlZW1zIHRoYXQgcmVzb3VyY2UgSUQncyBhcmUgZm9yY2VkIHRvIHVwcGVyIGNhc2UuICAqLworCSAgICBjb3B5ID0geHN0cmR1cCAoJDEpOworCSAgICBmb3IgKHMgPSBjb3B5OyAqcyAhPSAnXDAnOyBzKyspCisJICAgICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisJCSpzID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKKwkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLCBjb3B5KTsKKwkgICAgZnJlZSAoY29weSk7CisJICB9CisJOworCisvKiBHZW5lcmljIHN1Ym9wdGlvbnMuICBUaGVzZSBtYXkgYXBwZWFyIGJlZm9yZSB0aGUgQkVHSU4gaW4gYW55CisgICBtdWx0aWxpbmUgc3RhdGVtZW50LiAgKi8KKworc3Vib3B0aW9uczoKKwkgIC8qIGVtcHR5ICovCisJICB7CisJICAgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKKwkgICAgJCQubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKwkgICAgLyogRklYTUU6IElzIHRoaXMgdGhlIHJpZ2h0IGRlZmF1bHQ/ICAqLworCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEU7CisJICB9CisJfCBzdWJvcHRpb25zIG1lbWZsYWcKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247CisJICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7CisJICB9CisJfCBzdWJvcHRpb25zIENIQVJBQ1RFUklTVElDUyBudW1leHByCisJICB7CisJICAgICQkID0gJDE7CisJICAgICQkLmNoYXJhY3RlcmlzdGljcyA9ICQzOworCSAgfQorCXwgc3Vib3B0aW9ucyBMQU5HVUFHRSBudW1leHByIGNudW1leHByCisJICB7CisJICAgICQkID0gJDE7CisJICAgICQkLmxhbmd1YWdlID0gJDMgfCAoJDQgPDwgOCk7CisJICB9CisJfCBzdWJvcHRpb25zIFZFUlNJT05LIG51bWV4cHIKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgICAgJCQudmVyc2lvbiA9ICQzOworCSAgfQorCTsKKworLyogTWVtb3J5IGZsYWdzIHdoaWNoIGRlZmF1bHQgdG8gTU9WRUFCTEUgYW5kIERJU0NBUkRBQkxFLiAgKi8KKworbWVtZmxhZ3NfbW92ZV9kaXNjYXJkOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOworCSAgICAkJC5sYW5ndWFnZSA9IGxhbmd1YWdlOworCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEUgfCBNRU1GTEFHX0RJU0NBUkRBQkxFOworCSAgfQorCXwgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWcKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247CisJICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7CisJICB9CisJOworCisvKiBNZW1vcnkgZmxhZ3Mgd2hpY2ggZGVmYXVsdCB0byBNT1ZFQUJMRS4gICovCisKK21lbWZsYWdzX21vdmU6CisJICAvKiBlbXB0eSAqLworCSAgeworCSAgICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7CisJICAgICQkLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisJICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRTsKKwkgIH0KKwl8IG1lbWZsYWdzX21vdmUgbWVtZmxhZworCSAgeworCSAgICAkJCA9ICQxOworCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKKwkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKKwkgIH0KKwk7CisKKy8qIE1lbW9yeSBmbGFncy4gIFRoaXMgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHR3byBpbnRlZ2VycywgYmVjYXVzZSB3ZQorICAgc29tZXRpbWVzIHdhbnQgdG8gc2V0IGJpdHMgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvIGNsZWFyIHRoZW0uICAqLworCittZW1mbGFnOgorCSAgTU9WRUFCTEUKKwkgIHsKKwkgICAgJCQub24gPSBNRU1GTEFHX01PVkVBQkxFOworCSAgICAkJC5vZmYgPSAwOworCSAgfQorCXwgRklYRUQKKwkgIHsKKwkgICAgJCQub24gPSAwOworCSAgICAkJC5vZmYgPSBNRU1GTEFHX01PVkVBQkxFOworCSAgfQorCXwgUFVSRQorCSAgeworCSAgICAkJC5vbiA9IE1FTUZMQUdfUFVSRTsKKwkgICAgJCQub2ZmID0gMDsKKwkgIH0KKwl8IElNUFVSRQorCSAgeworCSAgICAkJC5vbiA9IDA7CisJICAgICQkLm9mZiA9IE1FTUZMQUdfUFVSRTsKKwkgIH0KKwl8IFBSRUxPQUQKKwkgIHsKKwkgICAgJCQub24gPSBNRU1GTEFHX1BSRUxPQUQ7CisJICAgICQkLm9mZiA9IDA7CisJICB9CisJfCBMT0FET05DQUxMCisJICB7CisJICAgICQkLm9uID0gMDsKKwkgICAgJCQub2ZmID0gTUVNRkxBR19QUkVMT0FEOworCSAgfQorCXwgRElTQ0FSREFCTEUKKwkgIHsKKwkgICAgJCQub24gPSBNRU1GTEFHX0RJU0NBUkRBQkxFOworCSAgICAkJC5vZmYgPSAwOworCSAgfQorCTsKKworLyogQSBmaWxlIG5hbWUuICAqLworCitmaWxlX25hbWU6CisJICBRVU9URURTVFJJTkcKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwl8IFNUUklORworCSAgeworCSAgICAkJCA9ICQxOworCSAgfQorCTsKKworLyogQSBzdHlsZSBleHByZXNzaW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgU1RZTEUuICBXZSBkbworICAgaXQgdGhpcyB3YXkgYmVjYXVzZSByYyBhcHBlYXJzIHRvIHBlcm1pdCBhIHN0eWxlIHRvIGJlIHNldCB0bworICAgc29tZXRoaW5nIGxpa2UKKyAgICAgICBXU19HUk9VUCB8IE5PVCBXU19UQUJTVE9QCisgICB0byBtZWFuIHRoYXQgYSBkZWZhdWx0IG9mIFdTX1RBQlNUT1Agc2hvdWxkIGJlIHJlbW92ZWQuICBBbnl0aGluZworICAgd2hpY2ggd2FudHMgdG8gYWNjZXB0IGEgc3R5bGUgbXVzdCBmaXJzdCBzZXQgU1RZTEUgdG8gdGhlIGRlZmF1bHQKKyAgIHZhbHVlLiAgVGhlIHN0eWxlZXhwciBub250ZXJtaW5hbCB3aWxsIGNoYW5nZSBTVFlMRSBhcyBzcGVjaWZpZWQgYnkKKyAgIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGhlcmUsCisgICBqdXN0IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICd8Jy4gICovCisKK3N0eWxlZXhwcjoKKwkgIHBhcmVubnVtYmVyCisJICB7CisJICAgIHN0eWxlIHw9ICQxOworCSAgfQorCXwgTk9UIHBhcmVubnVtYmVyCisJICB7CisJICAgIHN0eWxlICY9fiAkMjsKKwkgIH0KKwl8IHN0eWxlZXhwciAnfCcgcGFyZW5udW1iZXIKKwkgIHsKKwkgICAgc3R5bGUgfD0gJDM7CisJICB9CisJfCBzdHlsZWV4cHIgJ3wnIE5PVCBwYXJlbm51bWJlcgorCSAgeworCSAgICBzdHlsZSAmPX4gJDQ7CisJICB9CisJOworCitwYXJlbm51bWJlcjoKKwkgIE5VTUJFUgorCSAgeworCSAgICAkJCA9ICQxLnZhbDsKKwkgIH0KKwl8ICcoJyBudW1leHByICcpJworCSAgeworCSAgICAkJCA9ICQyOworCSAgfQorCTsKKworLyogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCisKK29wdGNudW1leHByOgorCSAgLyogZW1wdHkgKi8KKwkgIHsKKwkgICAgJCQgPSAwOworCSAgfQorCXwgY251bWV4cHIKKwkgIHsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwk7CisKKy8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEuICAqLworCitjbnVtZXhwcjoKKwkgICcsJyBudW1leHByCisJICB7CisJICAgICQkID0gJDI7CisJICB9CisJOworCisvKiBBIHBvc3NpYmx5IG5lZ2F0ZWQgbnVtZXJpYyBleHByZXNzaW9uLiAgKi8KKworbnVtZXhwcjoKKwkgIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJCA9ICQxLnZhbDsKKwkgIH0KKwk7CisKKy8qIEEgcG9zc2libHkgbmVnYXRlZCBleHByZXNzaW9uIHdpdGggYSBzaXplLiAgKi8KKworc2l6ZWRudW1leHByOgorCSAgTlVNQkVSCisJICB7CisJICAgICQkID0gJDE7CisJICB9CisJfCAnKCcgc2l6ZWRudW1leHByICcpJworCSAgeworCSAgICAkJCA9ICQyOworCSAgfQorCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKKwkgIHsKKwkgICAgJCQudmFsID0gfiAkMi52YWw7CisJICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7CisJICB9CisJfCAnLScgc2l6ZWRudW1leHByICVwcmVjIE5FRworCSAgeworCSAgICAkJC52YWwgPSAtICQyLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnKicgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnLycgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnJScgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnKycgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnLScgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnJicgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnXicgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwl8IHNpemVkbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCisJICB7CisJICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKKwkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKKwkgIH0KKwk7CisKKy8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEgd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5CisgICBuZWdhdGlvbi4gICovCisKK2Nwb3NudW1leHByOgorCSAgJywnIHBvc251bWV4cHIKKwkgIHsKKwkgICAgJCQgPSAkMjsKKwkgIH0KKwk7CisKKy8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgKi8KKworcG9zbnVtZXhwcjoKKwkgIHNpemVkcG9zbnVtZXhwcgorCSAgeworCSAgICAkJCA9ICQxLnZhbDsKKwkgIH0KKwk7CisKKy8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgV2Ugc2VwYXJhdGUgdW5hcnkKKyAgIG5lZ2F0aW9uIHRvIGF2b2lkIHBhcnNpbmcgY29uZmxpY3RzIHdoZW4gdHdvIG51bWVyaWMgZXhwcmVzc2lvbnMKKyAgIGFwcGVhciBjb25zZWN1dGl2ZWx5LiAgKi8KKworc2l6ZWRwb3NudW1leHByOgorCSAgTlVNQkVSCisJICB7CisJICAgICQkID0gJDE7CisJICB9CisJfCAnKCcgc2l6ZWRudW1leHByICcpJworCSAgeworCSAgICAkJCA9ICQyOworCSAgfQorCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKKwkgIHsKKwkgICAgJCQudmFsID0gfiAkMi52YWw7CisJICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJyonIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgKiAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJy8nIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgLyAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJyUnIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgJSAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJysnIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgKyAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJy0nIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgLSAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJyYnIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgJiAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJ14nIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgXiAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJfCBzaXplZHBvc251bWV4cHIgJ3wnIHNpemVkbnVtZXhwcgorCSAgeworCSAgICAkJC52YWwgPSAkMS52YWwgfCAkMy52YWw7CisJICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7CisJICB9CisJOworCislJQorCisvKiBTZXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCisKK3ZvaWQKK3JjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5nKQorICAgICBpbnQgbGFuZzsKK3sKKyAgbGFuZ3VhZ2UgPSBsYW5nOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRjb2ZmLmMgYi9iaW51dGlscy9yZGNvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY4YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvcmRjb2ZmLmMKQEAgLTAsMCArMSw4ODkgQEAKKy8qIHN0YWJzLmMgLS0gUGFyc2UgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBwYXJzZXMgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJidWRiZy5oIgorCisvKiBGSVhNRTogV2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMgQkZEIGludGVybmFsIGZpbGUuICBXZSBuZWVkIGl0IGZvcgorICAgdGhlIE5fQlRNQVNLLCBldGMuLCB2YWx1ZXMuICAqLworI2luY2x1ZGUgImxpYmNvZmYuaCIKKworLyogVGhlc2UgbWFjcm9zIGV4dHJhY3QgdGhlIHJpZ2h0IG1hc2sgYW5kIHNoaWZ0cyBmb3IgdGhpcyBCRkQuICBUaGV5CisgICBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkIEFCRkQuICBUaGlzIGlzIHNvIHRoYXQKKyAgIG1hY3JvcyBsaWtlIElTRkNOIGFuZCBERUNSRUYsIGZyb20gY29mZi9pbnRlcm5hbC5oLCB3aWxsIHdvcmsKKyAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAgKi8KKyNkZWZpbmUgTl9CVE1BU0sgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRtYXNrKQorI2RlZmluZQlOX0JUU0hGVCAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQpCisjZGVmaW5lCU5fVE1BU0sgIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX3RtYXNrKQorI2RlZmluZQlOX1RTSElGVCAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90c2hpZnQpCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCB0aGUgc3ltYm9scywgYXMgd2VsbCBhcyB0aGUgY3VycmVudAorICAgbG9jYXRpb24gd2l0aGluIHRoZSBzeW1ib2xzLiAgKi8KKworc3RydWN0IGNvZmZfc3ltYm9scworeworICAvKiBUaGUgc3ltYm9scy4gICovCisgIGFzeW1ib2wgKipzeW1zOworICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMuICAqLworICBsb25nIHN5bWNvdW50OworICAvKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3ltYm9sLiAgKi8KKyAgbG9uZyBzeW1ubzsKKyAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbCBpbiB0aGUgQ09GRiBzeW1ib2wgdGFibGUgKHdoZXJlCisgICAgIGVhY2ggYXV4ZW50IGNvdW50cyBhcyBhIHN5bWJvbCkuICAqLworICBsb25nIGNvZmZfc3ltbm87Cit9OworCisvKiBUaGUgbGFyZ2VzdCBiYXNpYyB0eXBlIHdlIGFyZSBwcmVwYXJlZCB0byBoYW5kbGUuICAqLworCisjZGVmaW5lIFRfTUFYIChUX0xOR0RCTCkKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHNsb3RzLiAgKi8KKworc3RydWN0IGNvZmZfc2xvdHMKK3sKKyAgLyogTmV4dCBzZXQgb2Ygc2xvdHMuICAqLworICBzdHJ1Y3QgY29mZl9zbG90cyAqbmV4dDsKKyAgLyogU2xvdHMuICAqLworI2RlZmluZSBDT0ZGX1NMT1RTICgxNikKKyAgZGVidWdfdHlwZSBzbG90c1tDT0ZGX1NMT1RTXTsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIHN5bWJvbCBpbmRpY2VzIHRvIHR5cGVzLiAgKi8KKworc3RydWN0IGNvZmZfdHlwZXMKK3sKKyAgLyogU2xvdHMuICAqLworICBzdHJ1Y3QgY29mZl9zbG90cyAqc2xvdHM7CisgIC8qIEJhc2ljIHR5cGVzLiAgKi8KKyAgZGVidWdfdHlwZSBiYXNpY1tUX01BWCArIDFdOworfTsKKworc3RhdGljIGRlYnVnX3R5cGUgKmNvZmZfZ2V0X3Nsb3QgUEFSQU1TICgoc3RydWN0IGNvZmZfdHlwZXMgKiwgaW50KSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX3R5cGUKKyAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgbG9uZywgaW50LAorCSAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqLCBib29sZWFuLCBQVFIpKTsKK3N0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX2NvZmZfYmFzZV90eXBlCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKKwkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX3N0cnVjdF90eXBlCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCwKKwkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2VudW1fdHlwZQorICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLAorCSAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIHBhcnNlX2NvZmZfc3ltYm9sCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBhc3ltYm9sICosIGxvbmcsCisJICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBQVFIsIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKKwwKKy8qIFJldHVybiB0aGUgc2xvdCBmb3IgYSB0eXBlLiAgKi8KKworc3RhdGljIGRlYnVnX3R5cGUgKgorY29mZl9nZXRfc2xvdCAodHlwZXMsIGluZHgpCisgICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKKyAgICAgaW50IGluZHg7Cit7CisgIHN0cnVjdCBjb2ZmX3Nsb3RzICoqcHBzOworCisgIHBwcyA9ICZ0eXBlcy0+c2xvdHM7CisKKyAgd2hpbGUgKGluZHggPj0gQ09GRl9TTE9UUykKKyAgICB7CisgICAgICBpZiAoKnBwcyA9PSBOVUxMKQorCXsKKwkgICpwcHMgPSAoc3RydWN0IGNvZmZfc2xvdHMgKikgeG1hbGxvYyAoc2l6ZW9mICoqcHBzKTsKKwkgIG1lbXNldCAoKnBwcywgMCwgc2l6ZW9mICoqcHBzKTsKKwl9CisgICAgICBwcHMgPSAmKCpwcHMpLT5uZXh0OworICAgICAgaW5keCAtPSBDT0ZGX1NMT1RTOworICAgIH0KKworICBpZiAoKnBwcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICpwcHMgPSAoc3RydWN0IGNvZmZfc2xvdHMgKikgeG1hbGxvYyAoc2l6ZW9mICoqcHBzKTsKKyAgICAgIG1lbXNldCAoKnBwcywgMCwgc2l6ZW9mICoqcHBzKTsKKyAgICB9CisKKyAgcmV0dXJuICgqcHBzKS0+c2xvdHMgKyBpbmR4OworfQorCisvKiBQYXJzZSBhIENPRkYgdHlwZSBjb2RlIGluIE5UWVBFLiAgKi8KKworc3RhdGljIGRlYnVnX3R5cGUKK3BhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG50eXBlLCBwYXV4ZW50LCB1c2VhdXgsCisJCSBkaGFuZGxlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7CisgICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKKyAgICAgbG9uZyBjb2ZmX3N5bW5vOworICAgICBpbnQgbnR5cGU7CisgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKKyAgICAgYm9vbGVhbiB1c2VhdXg7CisgICAgIFBUUiBkaGFuZGxlOworeworICBkZWJ1Z190eXBlIHR5cGU7CisKKyAgaWYgKChudHlwZSAmIH5OX0JUTUFTSykgIT0gMCkKKyAgICB7CisgICAgICBpbnQgbmV3dHlwZTsKKworICAgICAgbmV3dHlwZSA9IERFQ1JFRiAobnR5cGUpOworCisgICAgICBpZiAoSVNQVFIgKG50eXBlKSkKKwl7CisJICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKKwkJCQkgIHBhdXhlbnQsIHVzZWF1eCwgZGhhbmRsZSk7CisJICB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsIHR5cGUpOworCX0KKyAgICAgIGVsc2UgaWYgKElTRkNOIChudHlwZSkpCisJeworCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCisJCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOworCSAgdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgdHlwZSwgKGRlYnVnX3R5cGUgKikgTlVMTCwKKwkJCQkJICAgZmFsc2UpOworCX0KKyAgICAgIGVsc2UgaWYgKElTQVJZIChudHlwZSkpCisJeworCSAgaW50IG47CisKKwkgIGlmIChwYXV4ZW50ID09IE5VTEwpCisJICAgIG4gPSAwOworCSAgZWxzZQorCSAgICB7CisJICAgICAgdW5zaWduZWQgc2hvcnQgKmRpbTsKKwkgICAgICBpbnQgaTsKKworCSAgICAgIC8qIEZJWE1FOiBJZiBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID09IDAsIGdkYiBzZXRzCisgICAgICAgICAgICAgICAgIHRoZSBjX25hdXggZmllbGQgb2YgdGhlIHN5bWVudCB0byAwLiAgKi8KKworCSAgICAgIC8qIE1vdmUgdGhlIGRpbWVuc2lvbnMgZG93biwgc28gdGhhdCB0aGUgbmV4dCBhcnJheQorICAgICAgICAgICAgICAgICBwaWNrcyB1cCB0aGUgbmV4dCBvbmUuICAqLworCSAgICAgIGRpbSA9IHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW47CisJICAgICAgbiA9IGRpbVswXTsKKwkgICAgICBmb3IgKGkgPSAwOyAqZGltICE9IDAgJiYgaSA8IERJTU5VTSAtIDE7IGkrKywgZGltKyspCisJCSpkaW0gPSAqKGRpbSArIDEpOworCSAgICAgICpkaW0gPSAwOworCSAgICB9CisKKwkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAorCQkJCSAgcGF1eGVudCwgZmFsc2UsIGRoYW5kbGUpOworCSAgdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwgdHlwZSwKKwkJCQkJcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsCisJCQkJCQkJICAgICAgdHlwZXMsCisJCQkJCQkJICAgICAgY29mZl9zeW1ubywKKwkJCQkJCQkgICAgICBUX0lOVCwKKwkJCQkJCQkgICAgICBOVUxMLCBkaGFuZGxlKSwKKwkJCQkJMCwgbiAtIDEsIGZhbHNlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogcGFyc2VfY29mZl90eXBlOiBCYWQgdHlwZSBjb2RlIDB4JXhcbiIpLAorCQkgICBwcm9ncmFtX25hbWUsIG50eXBlKTsKKwkgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisJfQorCisgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgaWYgKHBhdXhlbnQgIT0gTlVMTCAmJiBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sID4gMCkKKyAgICB7CisgICAgICBkZWJ1Z190eXBlICpzbG90OworCisgICAgICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIHR5cGUuICBGSVhNRTogZ2RiIGNoZWNrcworCSB0aGF0IHRoZSBjbGFzcyBpcyBub3QgQ19TVFJUQUcsIG5vciBDX1VOVEFHLCBub3IgQ19FTlRBRy4gICovCisgICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIHBhdXhlbnQtPnhfc3ltLnhfdGFnbmR4LmwpOworICAgICAgaWYgKCpzbG90ICE9IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gKnNsb3Q7CisgICAgICBlbHNlCisJcmV0dXJuIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgc2xvdCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7CisgICAgfQorCisgIC8qIElmIHRoZSBhdXggZW50cnkgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGZvciBzb21ldGhpbmcsIHVzZWF1eCB3aWxsCisgICAgIGhhdmUgYmVlbiBzZXQgdG8gZmFsc2UsIGluZGljYXRpbmcgdGhhdCBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQorICAgICBzaG91bGQgbm90IHVzZSBpdC4gIFdlIG5lZWQgdG8gZG8gaXQgdGhpcyB3YXksIHJhdGhlciB0aGFuIHNpbXBseQorICAgICBwYXNzaW5nIHBhdXhlbnQgYXMgTlVMTCwgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgaGFuZGxlCisgICAgIG11bHRpcGxlIGFycmF5IGRpbWVuc2lvbnMgd2hpbGUgc3RpbGwgZGlzY2FyZGluZyBwYXV4ZW50IGFmdGVyCisgICAgIGhhdmluZyBoYW5kbGVkIGFsbCBvZiB0aGVtLiAgKi8KKyAgaWYgKCEgdXNlYXV4KQorICAgIHBhdXhlbnQgPSBOVUxMOworCisgIHJldHVybiBwYXJzZV9jb2ZmX2Jhc2VfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG50eXBlLAorCQkJICAgICAgIHBhdXhlbnQsIGRoYW5kbGUpOworfQorCisvKiBQYXJzZSBhIGJhc2ljIENPRkYgdHlwZSBpbiBOVFlQRS4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitwYXJzZV9jb2ZmX2Jhc2VfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG50eXBlLCBwYXV4ZW50LAorCQkgICAgICBkaGFuZGxlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7CisgICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKKyAgICAgbG9uZyBjb2ZmX3N5bW5vOworICAgICBpbnQgbnR5cGU7CisgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKKyAgICAgUFRSIGRoYW5kbGU7Cit7CisgIGRlYnVnX3R5cGUgcmV0OworICBib29sZWFuIHNldF9iYXNpYzsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGVidWdfdHlwZSAqc2xvdDsKKworICBpZiAobnR5cGUgPj0gMAorICAgICAgJiYgbnR5cGUgPD0gVF9NQVgKKyAgICAgICYmIHR5cGVzLT5iYXNpY1tudHlwZV0gIT0gREVCVUdfVFlQRV9OVUxMKQorICAgIHJldHVybiB0eXBlcy0+YmFzaWNbbnR5cGVdOworCisgIHNldF9iYXNpYyA9IHRydWU7CisgIG5hbWUgPSBOVUxMOworCisgIHN3aXRjaCAobnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVF9OVUxMOgorICAgIGNhc2UgVF9WT0lEOgorICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOworICAgICAgbmFtZSA9ICJ2b2lkIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUX0NIQVI6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7CisgICAgICBuYW1lID0gImNoYXIiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRfU0hPUlQ6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7CisgICAgICBuYW1lID0gInNob3J0IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUX0lOVDoKKyAgICAgIC8qIEZJWE1FOiBQZXJoYXBzIHRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KKyAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKKyAgICAgIG5hbWUgPSAiaW50IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUX0xPTkc6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7CisgICAgICBuYW1lID0gImxvbmciOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRfRkxPQVQ6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOworICAgICAgbmFtZSA9ICJmbG9hdCI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVF9ET1VCTEU6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOworICAgICAgbmFtZSA9ICJkb3VibGUiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRfTE5HREJMOgorICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCAxMik7CisgICAgICBuYW1lID0gImxvbmcgZG91YmxlIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUX1VDSEFSOgorICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7CisgICAgICBuYW1lID0gInVuc2lnbmVkIGNoYXIiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRfVVNIT1JUOgorICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7CisgICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUX1VJTlQ6CisgICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKKyAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUX1VMT05HOgorICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7CisgICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmciOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRfU1RSVUNUOgorICAgICAgaWYgKHBhdXhlbnQgPT0gTlVMTCkKKwlyZXQgPSBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCB0cnVlLCAwLAorCQkJCSAgICAgIChkZWJ1Z19maWVsZCAqKSBOVUxMKTsKKyAgICAgIGVsc2UKKwlyZXQgPSBwYXJzZV9jb2ZmX3N0cnVjdF90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgbnR5cGUsIHBhdXhlbnQsCisJCQkJICAgICAgZGhhbmRsZSk7CisKKyAgICAgIHNsb3QgPSBjb2ZmX2dldF9zbG90ICh0eXBlcywgY29mZl9zeW1ubyk7CisgICAgICAqc2xvdCA9IHJldDsKKworICAgICAgc2V0X2Jhc2ljID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVF9VTklPTjoKKyAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCisJcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgZmFsc2UsIDAsIChkZWJ1Z19maWVsZCAqKSBOVUxMKTsKKyAgICAgIGVsc2UKKwlyZXQgPSBwYXJzZV9jb2ZmX3N0cnVjdF90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgbnR5cGUsIHBhdXhlbnQsCisJCQkJICAgICAgZGhhbmRsZSk7CisKKyAgICAgIHNsb3QgPSBjb2ZmX2dldF9zbG90ICh0eXBlcywgY29mZl9zeW1ubyk7CisgICAgICAqc2xvdCA9IHJldDsKKworICAgICAgc2V0X2Jhc2ljID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVF9FTlVNOgorICAgICAgaWYgKHBhdXhlbnQgPT0gTlVMTCkKKwlyZXQgPSBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgKGNvbnN0IGNoYXIgKiopIE5VTEwsCisJCQkJICAgIChiZmRfc2lnbmVkX3ZtYSAqKSBOVUxMKTsKKyAgICAgIGVsc2UKKwlyZXQgPSBwYXJzZV9jb2ZmX2VudW1fdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIHBhdXhlbnQsIGRoYW5kbGUpOworCisgICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOworICAgICAgKnNsb3QgPSByZXQ7CisKKyAgICAgIHNldF9iYXNpYyA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChuYW1lICE9IE5VTEwpCisgICAgcmV0ID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCByZXQpOworCisgIGlmIChzZXRfYmFzaWMKKyAgICAgICYmIG50eXBlID49IDAKKyAgICAgICYmIG50eXBlIDw9IFRfTUFYKQorICAgIHR5cGVzLT5iYXNpY1tudHlwZV0gPSByZXQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgYSBzdHJ1Y3QgdHlwZS4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitwYXJzZV9jb2ZmX3N0cnVjdF90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgbnR5cGUsIHBhdXhlbnQsIGRoYW5kbGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGNvZmZfc3ltYm9scyAqc3ltYm9sczsKKyAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOworICAgICBpbnQgbnR5cGU7CisgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKKyAgICAgUFRSIGRoYW5kbGU7Cit7CisgIGxvbmcgc3ltZW5kOworICBpbnQgYWxsb2M7CisgIGRlYnVnX2ZpZWxkICpmaWVsZHM7CisgIGludCBjb3VudDsKKyAgYm9vbGVhbiBkb25lOworCisgIHN5bWVuZCA9IHBhdXhlbnQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw7CisKKyAgYWxsb2MgPSAxMDsKKyAgZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOworICBjb3VudCA9IDA7CisKKyAgZG9uZSA9IGZhbHNlOworICB3aGlsZSAoISBkb25lCisJICYmIHN5bWJvbHMtPmNvZmZfc3ltbm8gPCBzeW1lbmQKKwkgJiYgc3ltYm9scy0+c3ltbm8gPCBzeW1ib2xzLT5zeW1jb3VudCkKKyAgICB7CisgICAgICBhc3ltYm9sICpzeW07CisgICAgICBsb25nIHRoaXNfY29mZl9zeW1ubzsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OworICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKKyAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcHN1YmF1eDsKKyAgICAgIGJmZF92bWEgYml0cG9zID0gMCwgYml0c2l6ZSA9IDA7CisKKyAgICAgIHN5bSA9IHN5bWJvbHMtPnN5bXNbc3ltYm9scy0+c3ltbm9dOworCisgICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCisJCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwl9CisKKyAgICAgIHRoaXNfY29mZl9zeW1ubyA9IHN5bWJvbHMtPmNvZmZfc3ltbm87CisKKyAgICAgICsrc3ltYm9scy0+c3ltbm87CisgICAgICBzeW1ib2xzLT5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7CisKKyAgICAgIGlmIChzeW1lbnQubl9udW1hdXggPT0gMCkKKwlwc3ViYXV4ID0gTlVMTDsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBiZmRfY29mZl9nZXRfYXV4ZW50IChhYmZkLCBzeW0sIDAsICZhdXhlbnQpKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iKSwKKwkJICAgICAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisJICAgIH0KKwkgIHBzdWJhdXggPSAmYXV4ZW50OworCX0KKworICAgICAgc3dpdGNoIChzeW1lbnQubl9zY2xhc3MpCisJeworCWNhc2UgQ19NT1M6CisJY2FzZSBDX01PVToKKwkgIGJpdHBvcyA9IDggKiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKKwkgIGJpdHNpemUgPSAwOworCSAgYnJlYWs7CisKKwljYXNlIENfRklFTEQ6CisJICBiaXRwb3MgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKKwkgIGJpdHNpemUgPSBhdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7CisJICBicmVhazsKKworCWNhc2UgQ19FT1M6CisJICBkb25lID0gdHJ1ZTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKCEgZG9uZSkKKwl7CisJICBkZWJ1Z190eXBlIGZ0eXBlOworCSAgZGVidWdfZmllbGQgZjsKKworCSAgZnR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCisJCQkJICAgc3ltZW50Lm5fdHlwZSwgcHN1YmF1eCwgdHJ1ZSwgZGhhbmRsZSk7CisJICBmID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgZnR5cGUsCisJCQkJYml0cG9zLCBiaXRzaXplLCBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7CisJICBpZiAoZiA9PSBERUJVR19GSUVMRF9OVUxMKQorCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisJICBpZiAoY291bnQgKyAxID49IGFsbG9jKQorCSAgICB7CisJICAgICAgYWxsb2MgKz0gMTA7CisJICAgICAgZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQorCQkJeHJlYWxsb2MgKGZpZWxkcywgYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOworCSAgICB9CisKKwkgIGZpZWxkc1tjb3VudF0gPSBmOworCSAgKytjb3VudDsKKwl9CisgICAgfQorCisgIGZpZWxkc1tjb3VudF0gPSBERUJVR19GSUVMRF9OVUxMOworCisgIHJldHVybiBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlIChkaGFuZGxlLCBudHlwZSA9PSBUX1NUUlVDVCwKKwkJCQkgcGF1eGVudC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUsCisJCQkJIGZpZWxkcyk7Cit9CisKKy8qIFBhcnNlIGFuIGVudW0gdHlwZS4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitwYXJzZV9jb2ZmX2VudW1fdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIHBhdXhlbnQsIGRoYW5kbGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGNvZmZfc3ltYm9scyAqc3ltYm9sczsKKyAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOworICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7CisgICAgIFBUUiBkaGFuZGxlOworeworICBsb25nIHN5bWVuZDsKKyAgaW50IGFsbG9jOworICBjb25zdCBjaGFyICoqbmFtZXM7CisgIGJmZF9zaWduZWRfdm1hICp2YWxzOworICBpbnQgY291bnQ7CisgIGJvb2xlYW4gZG9uZTsKKworICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOworCisgIGFsbG9jID0gMTA7CisgIG5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7CisgIHZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKnZhbHMpOworICBjb3VudCA9IDA7CisKKyAgZG9uZSA9IGZhbHNlOworICB3aGlsZSAoISBkb25lCisJICYmIHN5bWJvbHMtPmNvZmZfc3ltbm8gPCBzeW1lbmQKKwkgJiYgc3ltYm9scy0+c3ltbm8gPCBzeW1ib2xzLT5zeW1jb3VudCkKKyAgICB7CisgICAgICBhc3ltYm9sICpzeW07CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKKworICAgICAgc3ltID0gc3ltYm9scy0+c3ltc1tzeW1ib2xzLT5zeW1ub107CisKKyAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKKwkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCX0KKworICAgICAgKytzeW1ib2xzLT5zeW1ubzsKKyAgICAgIHN5bWJvbHMtPmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKKworICAgICAgc3dpdGNoIChzeW1lbnQubl9zY2xhc3MpCisJeworCWNhc2UgQ19NT0U6CisJICBpZiAoY291bnQgKyAxID49IGFsbG9jKQorCSAgICB7CisJICAgICAgYWxsb2MgKz0gMTA7CisJICAgICAgbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCisJCSAgICAgICB4cmVhbGxvYyAobmFtZXMsIGFsbG9jICogc2l6ZW9mICpuYW1lcykpOworCSAgICAgIHZhbHMgPSAoKGJmZF9zaWduZWRfdm1hICopCisJCSAgICAgIHhyZWFsbG9jICh2YWxzLCBhbGxvYyAqIHNpemVvZiAqdmFscykpOworCSAgICB9CisKKwkgIG5hbWVzW2NvdW50XSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7CisJICB2YWxzW2NvdW50XSA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOworCSAgKytjb3VudDsKKwkgIGJyZWFrOworCisJY2FzZSBDX0VPUzoKKwkgIGRvbmUgPSB0cnVlOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBuYW1lc1tjb3VudF0gPSBOVUxMOworCisgIHJldHVybiBkZWJ1Z19tYWtlX2VudW1fdHlwZSAoZGhhbmRsZSwgbmFtZXMsIHZhbHMpOworfQorCisvKiBIYW5kbGUgYSBzaW5nbGUgQ09GRiBzeW1ib2wuICAqLworCitzdGF0aWMgYm9vbGVhbgorcGFyc2VfY29mZl9zeW1ib2wgKGFiZmQsIHR5cGVzLCBzeW0sIGNvZmZfc3ltbm8sIHBzeW1lbnQsIGRoYW5kbGUsIHR5cGUsCisJCSAgIHdpdGhpbl9mdW5jdGlvbikKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7CisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgbG9uZyBjb2ZmX3N5bW5vOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpwc3ltZW50OworICAgICBQVFIgZGhhbmRsZTsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworICAgICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKK3sKKyAgc3dpdGNoIChwc3ltZW50LT5uX3NjbGFzcykKKyAgICB7CisgICAgY2FzZSBDX05VTEw6CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ19BVVRPOgorICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAorCQkJCSAgIERFQlVHX0xPQ0FMLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENfRVhUOgorICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAorCQkJCSAgIERFQlVHX0dMT0JBTCwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDX1NUQVQ6CisgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCisJCQkJICAgKHdpdGhpbl9mdW5jdGlvbgorCQkJCSAgICA/IERFQlVHX0xPQ0FMX1NUQVRJQworCQkJCSAgICA6IERFQlVHX1NUQVRJQyksCisJCQkJICAgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDX1JFRzoKKyAgICAgIC8qIEZJWE1FOiBXZSBtYXkgbmVlZCB0byBjb252ZXJ0IHRoZSByZWdpc3RlciBudW1iZXIuICAqLworICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAorCQkJCSAgIERFQlVHX1JFR0lTVEVSLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENfTEFCRUw6CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ19BUkc6CisgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAorCQkJCSAgICBERUJVR19QQVJNX1NUQUNLLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENfUkVHUEFSTToKKyAgICAgIC8qIEZJWE1FOiBXZSBtYXkgbmVlZCB0byBjb252ZXJ0IHRoZSByZWdpc3RlciBudW1iZXIuICAqLworICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKKwkJCQkgICAgREVCVUdfUEFSTV9SRUcsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ19UUERFRjoKKyAgICAgIHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUpOworICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDX1NUUlRBRzoKKyAgICBjYXNlIENfVU5UQUc6CisgICAgY2FzZSBDX0VOVEFHOgorICAgICAgeworCWRlYnVnX3R5cGUgKnNsb3Q7CisKKwl0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUpOworCWlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgIHJldHVybiBmYWxzZTsKKworCS8qIFN0b3JlIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIHNsb3QsIHNvIHRoYXQgcmVmZXJlbmNlcyBnZXQKKyAgICAgICAgICAgdGhlIG5hbWUuICAqLworCXNsb3QgPSBjb2ZmX2dldF9zbG90ICh0eXBlcywgY29mZl9zeW1ubyk7CisJKnNsb3QgPSB0eXBlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiB0cnVlOwkJCQkgICAKK30KKworLyogVGhpcyBpcyB0aGUgbWFpbiByb3V0aW5lLiAgSXQgbG9va3MgdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgYW5kCisgICBoYW5kbGVzIHRoZW0uICAqLworCitib29sZWFuCitwYXJzZV9jb2ZmIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqc3ltczsKKyAgICAgbG9uZyBzeW1jb3VudDsKKyAgICAgUFRSIGRoYW5kbGU7Cit7CisgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgc3ltYm9sczsKKyAgc3RydWN0IGNvZmZfdHlwZXMgdHlwZXM7CisgIGludCBpOworICBsb25nIG5leHRfY19maWxlOworICBjb25zdCBjaGFyICpmbm5hbWU7CisgIGludCBmbmNsYXNzOworICBpbnQgZm50eXBlOworICBiZmRfdm1hIGZuZW5kOworICBhbGVudCAqbGluZW5vczsKKyAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247CisgIGxvbmcgdGhpc19jb2ZmX3N5bW5vOworCisgIHN5bWJvbHMuc3ltcyA9IHN5bXM7CisgIHN5bWJvbHMuc3ltY291bnQgPSBzeW1jb3VudDsKKyAgc3ltYm9scy5zeW1ubyA9IDA7CisgIHN5bWJvbHMuY29mZl9zeW1ubyA9IDA7CisKKyAgdHlwZXMuc2xvdHMgPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDw9IFRfTUFYOyBpKyspCisgICAgdHlwZXMuYmFzaWNbaV0gPSBERUJVR19UWVBFX05VTEw7CisKKyAgbmV4dF9jX2ZpbGUgPSAtMTsKKyAgZm5uYW1lID0gTlVMTDsKKyAgZm5jbGFzcyA9IDA7CisgIGZudHlwZSA9IDA7CisgIGZuZW5kID0gMDsKKyAgbGluZW5vcyA9IE5VTEw7CisgIHdpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOworCisgIHdoaWxlIChzeW1ib2xzLnN5bW5vIDwgc3ltY291bnQpCisgICAgeworICAgICAgYXN5bWJvbCAqc3ltOworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltZW50OworICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eGVudDsKKyAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eDsKKyAgICAgIGRlYnVnX3R5cGUgdHlwZTsKKworICAgICAgc3ltID0gc3ltc1tzeW1ib2xzLnN5bW5vXTsKKworICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAorCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOworCisgICAgICB0aGlzX2NvZmZfc3ltbm8gPSBzeW1ib2xzLmNvZmZfc3ltbm87CisKKyAgICAgICsrc3ltYm9scy5zeW1ubzsKKyAgICAgIHN5bWJvbHMuY29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OworCisgICAgICAvKiBXZSBvbmx5IHdvcnJ5IGFib3V0IHRoZSBmaXJzdCBhdXhlbnQsIGJlY2F1c2UgdGhhdCBpcyB0aGUKKwkgb25seSBvbmUgd2hpY2ggaXMgcmVsZXZhbnQgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCisJcGF1eCA9IE5VTEw7CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltLCAwLCAmYXV4ZW50KSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIiksCisJCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIHBhdXggPSAmYXV4ZW50OworCX0KKworICAgICAgaWYgKHRoaXNfY29mZl9zeW1ubyA9PSBuZXh0X2NfZmlsZSAmJiBzeW1lbnQubl9zY2xhc3MgIT0gQ19GSUxFKQorCXsKKwkgIC8qIFRoZSBsYXN0IENfRklMRSBzeW1ib2wgcG9pbnRzIHRvIHRoZSBmaXJzdCBleHRlcm5hbAorICAgICAgICAgICAgIHN5bWJvbC4gICovCisJICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGRoYW5kbGUsICIqZ2xvYmFscyoiKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgc3dpdGNoIChzeW1lbnQubl9zY2xhc3MpCisJeworCWNhc2UgQ19FRkNOOgorCWNhc2UgQ19FWFRERUY6CisJY2FzZSBDX1VMQUJFTDoKKwljYXNlIENfVVNUQVRJQzoKKwljYXNlIENfTElORToKKwljYXNlIENfQUxJQVM6CisJY2FzZSBDX0hJRERFTjoKKwkgIC8qIEp1c3QgaWdub3JlIHRoZXNlIGNsYXNzZXMuICAqLworCSAgYnJlYWs7CisKKwljYXNlIENfRklMRToKKwkgIG5leHRfY19maWxlID0gc3ltZW50Lm5fdmFsdWU7CisJICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGRoYW5kbGUsIG5hbWUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBicmVhazsKKworCWNhc2UgQ19TVEFUOgorCSAgLyogSWdub3JlIHN0YXRpYyBzeW1ib2xzIHdpdGggYSB0eXBlIG9mIFRfTlVMTC4gIFRoZXNlCisgICAgICAgICAgICAgcmVwcmVzZW50IHNlY3Rpb24gZW50cmllcy4gICovCisJICBpZiAoc3ltZW50Lm5fdHlwZSA9PSBUX05VTEwpCisJICAgIGJyZWFrOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwljYXNlIENfRVhUOgorCSAgaWYgKElTRkNOIChzeW1lbnQubl90eXBlKSkKKwkgICAgeworCSAgICAgIGZubmFtZSA9IG5hbWU7CisJICAgICAgZm5jbGFzcyA9IHN5bWVudC5uX3NjbGFzczsKKwkgICAgICBmbnR5cGUgPSBzeW1lbnQubl90eXBlOworCSAgICAgIGlmIChzeW1lbnQubl9udW1hdXggPiAwKQorCQlmbmVuZCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pICsgYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2ZzaXplOworCSAgICAgIGVsc2UKKwkJZm5lbmQgPSAwOworCSAgICAgIGxpbmVub3MgPSBCRkRfU0VORCAoYWJmZCwgX2dldF9saW5lbm8sIChhYmZkLCBzeW0pKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgJnN5bWJvbHMsICZ0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAorCQkJCSAgc3ltZW50Lm5fdHlwZSwgcGF1eCwgdHJ1ZSwgZGhhbmRsZSk7CisJICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGlmICghIHBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCAmdHlwZXMsIHN5bSwgdGhpc19jb2ZmX3N5bW5vLCAmc3ltZW50LAorCQkJCSAgIGRoYW5kbGUsIHR5cGUsIHdpdGhpbl9mdW5jdGlvbikpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSBDX0ZDTjoKKwkgIGlmIChzdHJjbXAgKG5hbWUsICIuYmYiKSA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKGZubmFtZSA9PSBOVUxMKQorCQl7CisJCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJWxkOiAuYmYgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIpLAorCQkJICAgcHJvZ3JhbV9uYW1lLCB0aGlzX2NvZmZfc3ltbm8pOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAgICAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgJnN5bWJvbHMsICZ0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAorCQkJCSAgICAgIERFQ1JFRiAoZm50eXBlKSwgcGF1eCwgZmFsc2UsIGRoYW5kbGUpOworCSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChkaGFuZGxlLCBmbm5hbWUsIHR5cGUsCisJCQkJCSAgIGZuY2xhc3MgPT0gQ19FWFQsCisJCQkJCSAgIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKKwkJcmV0dXJuIGZhbHNlOworCisJICAgICAgaWYgKGxpbmVub3MgIT0gTlVMTCkKKwkJeworCQkgIGludCBiYXNlOworCQkgIGJmZF92bWEgYWRkcjsKKworCQkgIGlmIChzeW1lbnQubl9udW1hdXggPT0gMCkKKwkJICAgIGJhc2UgPSAwOworCQkgIGVsc2UKKwkJICAgIGJhc2UgPSBhdXhlbnQueF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gLSAxOworCisJCSAgYWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7CisKKwkJICArK2xpbmVub3M7CisKKwkJICB3aGlsZSAobGluZW5vcy0+bGluZV9udW1iZXIgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsCisJCQkJCSAgICAgICBsaW5lbm9zLT5saW5lX251bWJlciArIGJhc2UsCisJCQkJCSAgICAgICBsaW5lbm9zLT51Lm9mZnNldCArIGFkZHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgICArK2xpbmVub3M7CisJCSAgICB9CisJCX0KKworCSAgICAgIGZubmFtZSA9IE5VTEw7CisJICAgICAgbGluZW5vcyA9IE5VTEw7CisJICAgICAgZm5jbGFzcyA9IDA7CisJICAgICAgZm50eXBlID0gMDsKKworCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5lZiIpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoISB3aXRoaW5fZnVuY3Rpb24pCisJCXsKKwkJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlbGQ6IHVuZXhwZWN0ZWQgLmVmXG4iKSwKKwkJCSAgIHByb2dyYW1fbmFtZSwgdGhpc19jb2ZmX3N5bW5vKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKworCSAgICAgIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IGZuZW5kKQorCQlmbmVuZCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOworCSAgICAgIGlmICghIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgZm5lbmQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkgICAgICBmbmVuZCA9IDA7CisJICAgICAgd2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBDX0JMT0NLOgorCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5iYiIpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoISBkZWJ1Z19zdGFydF9ibG9jayAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5lYiIpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoISBkZWJ1Z19lbmRfYmxvY2sgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCAmc3ltYm9scywgJnR5cGVzLCB0aGlzX2NvZmZfc3ltbm8sCisJCQkJICBzeW1lbnQubl90eXBlLCBwYXV4LCB0cnVlLCBkaGFuZGxlKTsKKwkgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgaWYgKCEgcGFyc2VfY29mZl9zeW1ib2wgKGFiZmQsICZ0eXBlcywgc3ltLCB0aGlzX2NvZmZfc3ltbm8sICZzeW1lbnQsCisJCQkJICAgZGhhbmRsZSwgdHlwZSwgd2l0aGluX2Z1bmN0aW9uKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JkZGJnLmMgYi9iaW51dGlscy9yZGRiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjhjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9yZGRiZy5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKiByZGRiZy5jIC0tIFJlYWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBnZW5lcmljIGZvcm0uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSByZWFkcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4gIFRoaXMKKyAgIGZpbGUga25vd3MgaG93IHRvIGRpZyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiBhbiBvYmplY3QKKyAgIGZpbGUuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJidWRiZy5oIgorCitzdGF0aWMgYm9vbGVhbiByZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8KKyAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcsIFBUUiwgYm9vbGVhbiAqKSk7CitzdGF0aWMgYm9vbGVhbiByZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbworICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSLCBib29sZWFuICopKTsKK3N0YXRpYyB2b2lkIHNhdmVfc3RhYiBQQVJBTVMgKChpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBzdGFiX2NvbnRleHQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZnJlZV9zYXZlZF9zdGFicyBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFJlYWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICBSZXR1cm5zIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcKKyAgIHBvaW50ZXIuICAqLworCitQVFIKK3JlYWRfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzeW1ib2wgKipzeW1zOworICAgICBsb25nIHN5bWNvdW50OworeworICBQVFIgZGhhbmRsZTsKKyAgYm9vbGVhbiBmb3VuZDsKKworICBkaGFuZGxlID0gZGVidWdfaW5pdCAoKTsKKyAgaWYgKGRoYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoISByZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAorCQkJCQkgICAmZm91bmQpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQorICAgIHsKKyAgICAgIGlmICghIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwKKwkJCQkJICAgICAgJmZvdW5kKSkKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIpCisgICAgeworICAgICAgaWYgKCEgcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlLCAmZm91bmQpKQorCXJldHVybiBOVUxMOworICAgIH0KKworICAvKiBUcnkgcmVhZGluZyB0aGUgQ09GRiBzeW1ib2xzIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBzdGFicyBpbiBDT0ZGCisgICAgIHNlY3Rpb25zLiAgKi8KKyAgaWYgKCEgZm91bmQKKyAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKKyAgICAgICYmIHN5bWNvdW50ID4gMCkKKyAgICB7CisgICAgICBpZiAoISBwYXJzZV9jb2ZmIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSkpCisJcmV0dXJuIE5VTEw7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgfQorCisgIGlmICghIGZvdW5kKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iKSwKKwkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiBkaGFuZGxlOworfQorCisvKiBSZWFkIHN0YWJzIGluIHNlY3Rpb25zIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgQkZELiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3JlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsIHBmb3VuZCkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqc3ltczsKKyAgICAgbG9uZyBzeW1jb3VudDsKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIGJvb2xlYW4gKnBmb3VuZDsKK3sKKyAgc3RhdGljIHN0cnVjdAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7CisgICAgICBjb25zdCBjaGFyICpzdHJzZWNuYW1lOworICAgIH0gbmFtZXNbXSA9IHsgeyAiLnN0YWIiLCAiLnN0YWJzdHIiIH0gfTsKKyAgdW5zaWduZWQgaW50IGk7CisgIFBUUiBzaGFuZGxlOworCisgICpwZm91bmQgPSBmYWxzZTsKKyAgc2hhbmRsZSA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBuYW1lcyAvIHNpemVvZiBuYW1lc1swXTsgaSsrKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWMsICpzdHJzZWM7CisKKyAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lc1tpXS5zZWNuYW1lKTsKKyAgICAgIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lc1tpXS5zdHJzZWNuYW1lKTsKKyAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBzdHJzZWMgIT0gTlVMTCkKKwl7CisJICBiZmRfc2l6ZV90eXBlIHN0YWJzaXplLCBzdHJzaXplOworCSAgYmZkX2J5dGUgKnN0YWJzLCAqc3RyaW5nczsKKwkgIGJmZF9ieXRlICpzdGFiOworCSAgYmZkX3NpemVfdHlwZSBzdHJvZmYsIG5leHRfc3Ryb2ZmOworCisJICBzdGFic2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7CisJICBzdGFicyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzdGFic2l6ZSk7CisJICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgc3RhYnMsIDAsIHN0YWJzaXplKSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsCisJCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZXNbaV0uc2VjbmFtZSwKKwkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgc3Ryc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7CisJICBzdHJpbmdzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0cnNpemUpOworCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdHJzZWMsIHN0cmluZ3MsIDAsIHN0cnNpemUpKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKKwkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zdHJzZWNuYW1lLAorCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoc2hhbmRsZSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIHRydWUsIHN5bXMsIHN5bWNvdW50KTsKKwkgICAgICBpZiAoc2hhbmRsZSA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgKnBmb3VuZCA9IHRydWU7CisKKwkgIHN0cm9mZiA9IDA7CisJICBuZXh0X3N0cm9mZiA9IDA7CisJICBmb3IgKHN0YWIgPSBzdGFiczsgc3RhYiA8IHN0YWJzICsgc3RhYnNpemU7IHN0YWIgKz0gMTIpCisJICAgIHsKKwkgICAgICBiZmRfc2l6ZV90eXBlIHN0cng7CisJICAgICAgaW50IHR5cGU7CisJICAgICAgaW50IG90aGVyOworCSAgICAgIGludCBkZXNjOworCSAgICAgIGJmZF92bWEgdmFsdWU7CisKKwkgICAgICAvKiBUaGlzIGNvZGUgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCisKKwkgICAgICBzdHJ4ID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYik7CisJICAgICAgdHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3RhYiArIDQpOworCSAgICAgIG90aGVyID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNSk7CisJICAgICAgZGVzYyA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyA2KTsKKwkgICAgICB2YWx1ZSA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyA4KTsKKworCSAgICAgIGlmICh0eXBlID09IDApCisJCXsKKwkJICAvKiBTcGVjaWFsIHR5cGUgMCBzdGFicyBpbmRpY2F0ZSB0aGUgb2Zmc2V0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgbmV4dCBzdHJpbmcgdGFibGUuICAqLworCQkgIHN0cm9mZiA9IG5leHRfc3Ryb2ZmOworCQkgIG5leHRfc3Ryb2ZmICs9IHZhbHVlOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY2hhciAqZiwgKnM7CisKKwkJICBmID0gTlVMTDsKKwkJICBzID0gKGNoYXIgKikgc3RyaW5ncyArIHN0cm9mZiArIHN0cng7CisJCSAgd2hpbGUgKHNbc3RybGVuIChzKSAtIDFdID09ICdcXCcKKwkJCSAmJiBzdGFiICsgMTIgPCBzdGFicyArIHN0YWJzaXplKQorCQkgICAgeworCQkgICAgICBjaGFyICpwOworCisJCSAgICAgIHN0YWIgKz0gMTI7CisJCSAgICAgIHAgPSBzICsgc3RybGVuIChzKSAtIDE7CisJCSAgICAgICpwID0gJ1wwJzsKKwkJICAgICAgcyA9IGNvbmNhdCAocywKKwkJCQkgICgoY2hhciAqKSBzdHJpbmdzCisJCQkJICAgKyBzdHJvZmYKKwkJCQkgICArIGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIpKSwKKwkJCQkgIChjb25zdCBjaGFyICopIE5VTEwpOworCisJCSAgICAgIC8qIFdlIGhhdmUgdG8gcmVzdG9yZSB0aGUgYmFja3NsYXNoLCBiZWNhdXNlLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgaXMgaGFzaGluZyBzdGFicyBzdHJpbmdzLCB3ZSBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgdGhlIHNhbWUgc3RyaW5nIG1vcmUgdGhhbiBvbmNlLiAgKi8KKwkJICAgICAgKnAgPSAnXFwnOworCisJCSAgICAgIGlmIChmICE9IE5VTEwpCisJCQlmcmVlIChmKTsKKwkJICAgICAgZiA9IHM7CisJCSAgICB9CisKKwkJICBzYXZlX3N0YWIgKHR5cGUsIGRlc2MsIHZhbHVlLCBzKTsKKworCQkgIGlmICghIHBhcnNlX3N0YWIgKGRoYW5kbGUsIHNoYW5kbGUsIHR5cGUsIGRlc2MsIHZhbHVlLCBzKSkKKwkJICAgIHsKKwkJICAgICAgc3RhYl9jb250ZXh0ICgpOworCQkgICAgICBmcmVlX3NhdmVkX3N0YWJzICgpOworCQkgICAgICByZXR1cm4gZmFsc2U7CisJCSAgICB9CisKKwkJICAvKiBEb24ndCBmcmVlIGYsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdHMgc3RyaW5ncyB0byBoYW5nIGFyb3VuZC4gIFRoaXMgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICBzdHJhaWdodGVuZWQgb3V0LiAgRklYTUUuICAqLworCQl9CisJICAgIH0KKworCSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKKwkgIGZyZWUgKHN0YWJzKTsKKworCSAgLyogRG9uJ3QgZnJlZSBzdHJpbmdzLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKKyAgICAgICAgICAgICB0aGUgc3RyaW5ncyB0byBoYW5nIGFyb3VuZC4gIFRoaXMgc2hvdWxkIGJlIHN0cmFpZ2h0ZW5lZAorICAgICAgICAgICAgIG91dC4gIEZJWE1FLiAgKi8KKwl9CisgICAgfQorCisgIGlmIChzaGFuZGxlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCEgZmluaXNoX3N0YWIgKGRoYW5kbGUsIHNoYW5kbGUpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlYWQgc3RhYnMgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisKK3N0YXRpYyBib29sZWFuCityZWFkX3N5bWJvbF9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsIHBmb3VuZCkKKyAgICAgYmZkICphYmZkOworICAgICBhc3ltYm9sICoqc3ltczsKKyAgICAgbG9uZyBzeW1jb3VudDsKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIGJvb2xlYW4gKnBmb3VuZDsKK3sKKyAgUFRSIHNoYW5kbGU7CisgIGFzeW1ib2wgKipwcywgKipzeW1lbmQ7CisKKyAgc2hhbmRsZSA9IE5VTEw7CisgIHN5bWVuZCA9IHN5bXMgKyBzeW1jb3VudDsKKyAgZm9yIChwcyA9IHN5bXM7IHBzIDwgc3ltZW5kOyBwcysrKQorICAgIHsKKyAgICAgIHN5bWJvbF9pbmZvIGk7CisKKyAgICAgIGJmZF9nZXRfc3ltYm9sX2luZm8gKGFiZmQsICpwcywgJmkpOworCisgICAgICBpZiAoaS50eXBlID09ICctJykKKwl7CisJICBjb25zdCBjaGFyICpzOworCSAgY2hhciAqZjsKKworCSAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNoYW5kbGUgPSBzdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBmYWxzZSwgc3ltcywgc3ltY291bnQpOworCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICAqcGZvdW5kID0gdHJ1ZTsKKworCSAgcyA9IGkubmFtZTsKKwkgIGYgPSBOVUxMOworCSAgd2hpbGUgKHNbc3RybGVuIChzKSAtIDFdID09ICdcXCcKKwkJICYmIHBzICsgMSA8IHN5bWVuZCkKKwkgICAgeworCSAgICAgIGNoYXIgKnNjLCAqbjsKKworCSAgICAgICsrcHM7CisJICAgICAgc2MgPSB4c3RyZHVwIChzKTsKKwkgICAgICBzY1tzdHJsZW4gKHNjKSAtIDFdID0gJ1wwJzsKKwkgICAgICBuID0gY29uY2F0IChzYywgYmZkX2FzeW1ib2xfbmFtZSAoKnBzKSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7CisJICAgICAgZnJlZSAoc2MpOworCSAgICAgIGlmIChmICE9IE5VTEwpCisJCWZyZWUgKGYpOworCSAgICAgIGYgPSBuOworCSAgICAgIHMgPSBuOworCSAgICB9CisKKwkgIHNhdmVfc3RhYiAoaS5zdGFiX3R5cGUsIGkuc3RhYl9kZXNjLCBpLnZhbHVlLCBzKTsKKworCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgaS5zdGFiX3R5cGUsIGkuc3RhYl9kZXNjLAorCQkJICAgIGkudmFsdWUsIHMpKQorCSAgICB7CisJICAgICAgc3RhYl9jb250ZXh0ICgpOworCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZSBleHBlY3RzCisJICAgICBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkIG91dC4KKwkgICAgIEZJWE1FLiAgKi8KKwl9CisgICAgfQorCisgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7CisKKyAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCityZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsIHBmb3VuZCkKKyAgICAgYmZkICphYmZkOworICAgICBQVFIgZGhhbmRsZTsKKyAgICAgYm9vbGVhbiAqcGZvdW5kOworeworICBhc2VjdGlvbiAqZHNlYzsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICBiZmRfYnl0ZSAqY29udGVudHM7CisKKyAgLyogVGhlIEJGRCBiYWNrZW5kIHB1dHMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgc2VjdGlvbgorICAgICBuYW1lZCAuZGVidWcuICAqLworCisgIGRzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOworICBpZiAoZHNlYyA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworCisgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBkc2VjKTsKKyAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc2l6ZSk7CisgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZHNlYywgY29udGVudHMsIDAsIHNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISBwYXJzZV9pZWVlIChkaGFuZGxlLCBhYmZkLCBjb250ZW50cywgc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZyZWUgKGNvbnRlbnRzKTsKKworICAqcGZvdW5kID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKKy8qIFJlY29yZCBzdGFicyBzdHJpbmdzLCBzbyB0aGF0IHdlIGNhbiBnaXZlIHNvbWUgY29udGV4dCBmb3IgZXJyb3JzLiAgKi8KKworI2RlZmluZSBTQVZFX1NUQUJTX0NPVU5UICgxNikKKworc3RydWN0IHNhdmVkX3N0YWIKK3sKKyAgaW50IHR5cGU7CisgIGludCBkZXNjOworICBiZmRfdm1hIHZhbHVlOworICBjaGFyICpzdHJpbmc7Cit9OworCitzdGF0aWMgc3RydWN0IHNhdmVkX3N0YWIgc2F2ZWRfc3RhYnNbU0FWRV9TVEFCU19DT1VOVF07CitzdGF0aWMgaW50IHNhdmVkX3N0YWJzX2luZGV4OworCisvKiBTYXZlIGEgc3RhYnMgc3RyaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK3NhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKKyAgICAgaW50IHR5cGU7CisgICAgIGludCBkZXNjOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIGlmIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nICE9IE5VTEwpCisgICAgZnJlZSAoc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnN0cmluZyk7CisgIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS50eXBlID0gdHlwZTsKKyAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLmRlc2MgPSBkZXNjOworICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0udmFsdWUgPSB2YWx1ZTsKKyAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnN0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7CisgIHNhdmVkX3N0YWJzX2luZGV4ID0gKHNhdmVkX3N0YWJzX2luZGV4ICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOworfQorCisvKiBQcm92aWRlIGNvbnRleHQgZm9yIGFuIGVycm9yLiAgKi8KKworc3RhdGljIHZvaWQKK3N0YWJfY29udGV4dCAoKQoreworICBpbnQgaTsKKworICBmcHJpbnRmIChzdGRlcnIsIF8oIkxhc3Qgc3RhYnMgZW50cmllcyBiZWZvcmUgZXJyb3I6XG4iKSk7CisgIGZwcmludGYgKHN0ZGVyciwgIm5fdHlwZSBuX2Rlc2Mgbl92YWx1ZSAgc3RyaW5nXG4iKTsKKworICBpID0gc2F2ZWRfc3RhYnNfaW5kZXg7CisgIGRvCisgICAgeworICAgICAgc3RydWN0IHNhdmVkX3N0YWIgKnN0YWJwOworCisgICAgICBzdGFicCA9IHNhdmVkX3N0YWJzICsgaTsKKyAgICAgIGlmIChzdGFicC0+c3RyaW5nICE9IE5VTEwpCisJeworCSAgY29uc3QgY2hhciAqczsKKworCSAgcyA9IGJmZF9nZXRfc3RhYl9uYW1lIChzdGFicC0+dHlwZSk7CisJICBpZiAocyAhPSBOVUxMKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZzIiwgcyk7CisJICBlbHNlIGlmIChzdGFicC0+dHlwZSA9PSAwKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICJIZHJTeW0iKTsKKwkgIGVsc2UKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiJS02ZCIsIHN0YWJwLT50eXBlKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiAlLTZkICIsIHN0YWJwLT5kZXNjKTsKKwkgIGZwcmludGZfdm1hIChzdGRlcnIsIHN0YWJwLT52YWx1ZSk7CisJICBpZiAoc3RhYnAtPnR5cGUgIT0gMCkKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgc3RhYnAtPnN0cmluZyk7CisJICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworCX0KKyAgICAgIGkgPSAoaSArIDEpICUgU0FWRV9TVEFCU19DT1VOVDsKKyAgICB9CisgIHdoaWxlIChpICE9IHNhdmVkX3N0YWJzX2luZGV4KTsKK30KKworLyogRnJlZSB0aGUgc2F2ZWQgc3RhYiBzdHJpbmdzLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfc2F2ZWRfc3RhYnMgKCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFNBVkVfU1RBQlNfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoc2F2ZWRfc3RhYnNbaV0uc3RyaW5nICE9IE5VTEwpCisJeworCSAgZnJlZSAoc2F2ZWRfc3RhYnNbaV0uc3RyaW5nKTsKKwkgIHNhdmVkX3N0YWJzW2ldLnN0cmluZyA9IE5VTEw7CisJfQorICAgIH0KKworICBzYXZlZF9zdGFic19pbmRleCA9IDA7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZWFkZWxmLmMgYi9iaW51dGlscy9yZWFkZWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5YmYxYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3JlYWRlbGYuYwpAQCAtMCwwICsxLDU2ODIgQEAKKy8qIHJlYWRlbGYuYyAtLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZQorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+CisgICBNb2RpZmljYXRpb25zIGJ5IE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbT4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwwKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKworI2luY2x1ZGUgImVsZi9jb21tb24uaCIKKyNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKKyNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJlbGYvZHdhcmYyLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgaGVhZGVycyB1c2UgdGhlIGVsZi9yZWxvYy1tYWNyb3MuaCBmaWxlIHRvCisgICBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHJlbG9jYXRpb24gcmVjb2duaXRpb24gZnVuY3Rpb25zCisgICBzdWNoIGFzIGVsZl9taXBzX3JlbG9jX3R5cGUoKSAgKi8KKworI2RlZmluZSBSRUxPQ19NQUNST1NfR0VOX0ZVTkMKKworI2luY2x1ZGUgImVsZi9pMzg2LmgiCisjaW5jbHVkZSAiZWxmL3Y4NTAuaCIKKyNpbmNsdWRlICJlbGYvcHBjLmgiCisjaW5jbHVkZSAiZWxmL21pcHMuaCIKKyNpbmNsdWRlICJlbGYvYWxwaGEuaCIKKyNpbmNsdWRlICJlbGYvYXJtLmgiCisjaW5jbHVkZSAiZWxmL202OGsuaCIKKyNpbmNsdWRlICJlbGYvc3BhcmMuaCIKKyNpbmNsdWRlICJlbGYvbTMyci5oIgorI2luY2x1ZGUgImVsZi9kMTB2LmgiCisjaW5jbHVkZSAiZWxmL2QzMHYuaCIKKyNpbmNsdWRlICJlbGYvc2guaCIKKyNpbmNsdWRlICJlbGYvbW4xMDIwMC5oIgorI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCisjaW5jbHVkZSAiZWxmL2hwcGEuaCIKKyNpbmNsdWRlICJlbGYvYXJjLmgiCisjaW5jbHVkZSAiZWxmL2ZyMzAuaCIKKyNpbmNsdWRlICJlbGYvbWNvcmUuaCIKKworI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImdldG9wdC5oIgorCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCitjaGFyICogICAgICAgICAgCXByb2dyYW1fbmFtZSA9ICJyZWFkZWxmIjsKK3Vuc2lnbmVkIGludCAgICAJZHluYW1pY19hZGRyOwordW5zaWduZWQgaW50ICAgIAlkeW5hbWljX3NpemU7Cit1bnNpZ25lZCBpbnQgICAgCXJlbGFfYWRkcjsKK3Vuc2lnbmVkIGludCAgICAJcmVsYV9zaXplOworY2hhciAqICAgICAgICAgIAlkeW5hbWljX3N0cmluZ3M7CitjaGFyICoJCQlzdHJpbmdfdGFibGU7CitFbGZfSW50ZXJuYWxfU3ltICogCWR5bmFtaWNfc3ltYm9sczsKK0VsZl9JbnRlcm5hbF9TeW1pbmZvICoJZHluYW1pY19zeW1pbmZvOwordW5zaWduZWQgbG9uZyAgIAlkeW5hbWljX3N5bWluZm9fb2Zmc2V0OwordW5zaWduZWQgaW50CQlkeW5hbWljX3N5bWluZm9fbmVudDsKK2NoYXIgICAgICAgICAgICAJcHJvZ3JhbV9pbnRlcnByZXRlciBbNjRdOworaW50ICAgICAgICAgICAgIAlkeW5hbWljX2luZm9bRFRfSk1QUkVMICsgMV07CitpbnQgICAgICAgICAgICAgCXZlcnNpb25faW5mb1sxNl07CitpbnQgICAgICAgICAgICAgCWxvYWRhZGRyID0gMDsKK0VsZl9JbnRlcm5hbF9FaGRyICAgICAgIGVsZl9oZWFkZXI7CitFbGZfSW50ZXJuYWxfU2hkciAqICAgICBzZWN0aW9uX2hlYWRlcnM7CitFbGZfSW50ZXJuYWxfRHluICogICAgICBkeW5hbWljX3NlZ21lbnQ7CitpbnQgCQkJc2hvd19uYW1lOworaW50IAkJCWRvX2R5bmFtaWM7CitpbnQgCQkJZG9fc3ltczsKK2ludCAJCQlkb19yZWxvYzsKK2ludCAJCQlkb19zZWN0aW9uczsKK2ludCAJCQlkb19zZWdtZW50czsKK2ludCAJCQlkb191c2luZ19keW5hbWljOworaW50IAkJCWRvX2hlYWRlcjsKK2ludCAJCQlkb19kdW1wOworaW50IAkJCWRvX3ZlcnNpb247CitpbnQJCQlkb19oaXN0b2dyYW07CitpbnQJCQlkb19kZWJ1Z2dpbmc7CitpbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19pbmZvOworaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfYWJicmV2czsKK2ludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2xpbmVzOworaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfcHVibmFtZXM7CitpbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19hcmFuZ2VzOworaW50CQkJYmluYXJ5X2NsYXNzOworCisvKiBBIGR5bmFtaWMgYXJyYXkgb2YgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBzZWN0aW9ucyByZXF1aXJlIGR1bXBpbmcuICAqLworY2hhciAqCQkJZHVtcF9zZWN0cyA9IE5VTEw7Cit1bnNpZ25lZCBpbnQJCW51bV9kdW1wX3NlY3RzID0gMDsKKworI2RlZmluZSBIRVhfRFVNUAkoMSA8PCAwKQorI2RlZmluZSBESVNBU1NfRFVNUAkoMSA8PCAxKQorI2RlZmluZSBERUJVR19EVU1QCSgxIDw8IDIpCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBkdW1iIGNvbXBpbGVycy4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyAoKiAgIGJ5dGVfZ2V0KSAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19keW5hbWljX3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZyB0eXBlKSk7CitzdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9keW5hbWljX3R5cGUgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHR5cGUpKTsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgZHVtcF9yZWxvY2F0aW9ucyAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgRWxmX0ludGVybmFsX1N5bSAqLCBjaGFyICopKTsKK3N0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X2ZpbGVfdHlwZSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGVfdHlwZSkpOworc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfbWFjaGluZV9uYW1lICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgZV9tYWNoaW5lKSk7CitzdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9tYWNoaW5lX2RhdGEgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBlX2RhdGEpKTsKK3N0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X21hY2hpbmVfZmxhZ3MgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkLCB1bnNpZ25lZCBlX21hY2hpbmUpKTsKK3N0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfc2VnbWVudF90eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdHlwZSkpOworc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc2VnbWVudF90eXBlICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZyBwX3R5cGUpKTsKK3N0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgIFBBUkFNUyAoKHVuc2lnbmVkIGludCBzaF90eXBlKSk7CitzdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zZWN0aW9uX3R5cGVfbmFtZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgc2hfdHlwZSkpOworc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX2JpbmRpbmcgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50IGJpbmRpbmcpKTsKK3N0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF90eXBlICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCB0eXBlKSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHBhcnNlX2FyZ3MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChpbnQgYXJnYywgY2hhciAqKiBhcmd2KSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfZmlsZV9oZWFkZXIgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzICAgICBQQVJBTVMgKChGSUxFICopKTsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgICAgIFBBUkFNUyAoKEZJTEUgKikpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgICAgUEFSQU1TICgoRWxmX0ludGVybmFsX0R5biAqZW50cnkpKTsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgICAgIFBBUkFNUyAoKEZJTEUgKikpOworc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3N5bWJvbF90YWJsZSAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAgICBQQVJBTVMgKChGSUxFICopKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlICAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiBmaWxlX25hbWUpKTsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19yZWxvY3MgICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOworc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgICAgUEFSQU1TICgoRklMRSAqKSk7CitzdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF92ZXJfZmxhZ3MgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgZmxhZ3MpKTsKK3N0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF9pbmRleF90eXBlICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCB0eXBlKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF9zZWN0aW9uX2hlYWRlcnMgICAgICAgICBQQVJBTVMgKChGSUxFICogZmlsZSkpOworc3RhdGljIGludCAgICAgICAgICAgICAgICBnZXRfZmlsZV9oZWFkZXIgICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqIGZpbGUpKTsKK3N0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICogZ2V0X2VsZl9zeW1ib2xzICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiBmaWxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBudW1iZXIpKTsKK3N0YXRpYyBpbnQgKiAgICAgICAgICAgICAgZ2V0X2R5bmFtaWNfZGF0YSAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgbnVtYmVyKSk7CisjaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQorc3RhdGljIGludCAJICAgICAgICAgIGRpc2Fzc2VtYmxlX3NlY3Rpb24gICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOworI2VuZGlmCitzdGF0aWMgaW50IAkgICAgICAgICAgZHVtcF9zZWN0aW9uICAgICAgICAgICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgRklMRSAqKSk7CitzdGF0aWMgaW50IAkgICAgICAgICAgZGlzcGxheV9kZWJ1Z19zZWN0aW9uICAgICAgIFBBUkFNUyAoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgRklMRSAqKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfaW5mbyAgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfbGluZXMgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfYWJicmV2ICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIGRpc3BsYXlfZGVidWdfYXJhbmdlcyAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIHVuc2lnbmVkIGNoYXIgKiwgRklMRSAqKSk7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqICAgIHByb2Nlc3NfYWJicmV2X3NlY3Rpb24gICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgICAgICByZWFkX2xlYjEyOCAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQgKiwgaW50KSk7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgICAgICAgICAgICAgICByZXNldF9zdGF0ZV9tYWNoaW5lICAgICAgICAgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9UQUdfbmFtZSAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9BVF9uYW1lICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9GT1JNX25hbWUgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGZyZWVfYWJicmV2cyAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXYgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgYWRkX2FiYnJldl9hdHRyICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgcmVhZF9hbmRfZGlzcGxheV9hdHRyICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBkaXNwbGF5X2Jsb2NrICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkpOworc3RhdGljIHZvaWQJCSAgcmVxdWVzdF9kdW1wICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgY2hhcikpOworc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZWxmX2NsYXNzICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOworc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZGF0YV9lbmNvZGluZyAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOworc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfb3NhYmlfbmFtZSAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhcikpOworCit0eXBlZGVmIGludCBFbGYzMl9Xb3JkOworCisjZGVmaW5lIFNFQ1RJT05fTkFNRShYKSAJKHN0cmluZ190YWJsZSArIChYKS0+c2hfbmFtZSkKKworI2RlZmluZSBEVF9WRVJTSU9OVEFHSURYKHRhZykJKERUX1ZFUk5FRUROVU0gLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KKworI2RlZmluZSBCWVRFX0dFVChmaWVsZCkgCWJ5dGVfZ2V0IChmaWVsZCwgc2l6ZW9mIChmaWVsZCkpCisKKyNkZWZpbmUgTlVNX0VMRU0oYXJyYXkpIAkoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKChhcnJheSlbMF0pKQorCisjZGVmaW5lIEdFVF9EQVRBX0FMTE9DKG9mZnNldCwgc2l6ZSwgdmFyLCB0eXBlLCByZWFzb24pCQkJXAorICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgJXMgYXQgJXhcbiIpLCByZWFzb24sIG9mZnNldCk7IFwKKyAgICAgIHJldHVybiAwOwkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHZhciA9ICh0eXBlKSBtYWxsb2MgKHNpemUpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgaWYgKHZhciA9PSBOVUxMKQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgJWQgYnl0ZXMgZm9yICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgXAorICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCisgICAgfSAJCQkJCQkJCQlcCisgCQkJCQkJCQkJXAorICBpZiAoZnJlYWQgKHZhciwgc2l6ZSwgMSwgZmlsZSkgIT0gMSkgCQkJCQlcCisgICAgeyAJCQkJCQkJCQlcCisgICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgaW4gJWQgYnl0ZXMgb2YgJXNcbiIpLCBzaXplLCByZWFzb24pOyAJXAorICAgICAgZnJlZSAodmFyKTsgCQkJCQkJCVwKKyAgICAgIHZhciA9IE5VTEw7CQkJCQkJCVwKKyAgICAgIHJldHVybiAwOyAJCQkJCQkJXAorICAgIH0KKworCisjZGVmaW5lIEdFVF9EQVRBKG9mZnNldCwgdmFyLCByZWFzb24pIAkJCQkJXAorICBpZiAoZnNlZWsgKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpKQkJCQkJXAorICAgIHsgCQkJCQkJCQkJXAorICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvICV4IGZvciAlc1xuIiksIG9mZnNldCwgcmVhc29uKTsJXAorICAgICAgcmV0dXJuIDA7CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgZWxzZSBpZiAoZnJlYWQgKCYgdmFyLCBzaXplb2YgKHZhciksIDEsIGZpbGUpICE9IDEpCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgZGF0YSBhdCAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKKyAgICAgIHJldHVybiAwOwkJCQkJCQkJXAorICAgIH0KKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworc3RhdGljIHZvaWQKK2Vycm9yIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXJyb3I6ICIpLCBwcm9ncmFtX25hbWUpOworICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCit3YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogV2FybmluZzogIiksIHByb2dyYW1fbmFtZSk7CisgIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybjsKK30KKyNlbHNlCitzdGF0aWMgdm9pZAorZXJyb3IgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKK3sKKyAgY2hhciAqIG1lc3NhZ2U7CisgIHZhX2xpc3QgYXJnczsKKworICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7CisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgbWVzc2FnZSA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3dhcm4gKHZhX2FsaXN0KQorICAgICB2YV9kY2wKK3sKKyAgY2hhciAqIG1lc3NhZ2U7CisgIHZhX2xpc3QgYXJnczsKKworICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludAorYnl0ZV9nZXRfbGl0dGxlX2VuZGlhbiAoZmllbGQsIHNpemUpCisgICAgIHVuc2lnbmVkIGNoYXIgKiBmaWVsZDsKKyAgICAgaW50ICAgICAgICAgICAgIHNpemU7Cit7CisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuICogZmllbGQ7CisKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gICgodW5zaWduZWQgaW50KSAoZmllbGQgWzBdKSkKKwl8ICAgICgoKHVuc2lnbmVkIGludCkgKGZpZWxkIFsxXSkpIDw8IDgpOworCisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKQorCXwgICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsxXSkpIDw8IDgpCisJfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzJdKSkgPDwgMTYpCisJfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkgPDwgMjQpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yIChfKCJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iKSwgc2l6ZSk7CisgICAgICBhYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50CitieXRlX2dldF9iaWdfZW5kaWFuIChmaWVsZCwgc2l6ZSkKKyAgICAgdW5zaWduZWQgY2hhciAqIGZpZWxkOworICAgICBpbnQgICAgICAgICAgICAgc2l6ZTsKK3sKKyAgc3dpdGNoIChzaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gKiBmaWVsZDsKKworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGludCkgKGZpZWxkIFsxXSkpIHwgKCgoaW50KSAoZmllbGQgWzBdKSkgPDwgOCk7CisKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkKKwl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsyXSkpIDw8IDgpCisJfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMV0pKSA8PCAxNikKKwl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFswXSkpIDw8IDI0KTsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoXygiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIiksIHNpemUpOworICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKKworLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRpb24gZGF0YQorICAgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICAqLworc3RhdGljIGludAorZHVtcF9yZWxvY2F0aW9ucyAoZmlsZSwgcmVsX29mZnNldCwgcmVsX3NpemUsIHN5bXRhYiwgc3RydGFiKQorICAgICBGSUxFICogICAgICAgICAgICAgICAgIGZpbGU7CisgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgcmVsX29mZnNldDsKKyAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICByZWxfc2l6ZTsKKyAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBzeW10YWI7CisgICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgc3RydGFiOworeworICB1bnNpZ25lZCBpbnQgICAgICAgIGk7CisgIGludCAgICAgICAgICAgICAgICAgaXNfcmVsYTsKKyAgRWxmX0ludGVybmFsX1JlbCAqICByZWxzOworICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbGFzOworCisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgcmVsb2NhdGlvbnMgYW5kIHJlYWQgdGhlbSBpbi4gICovCisgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCisgICAgeworICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUwgcmVsb2NhdGlvbnMuICAqLworICAgIGNhc2UgRU1fQVJNOgorICAgIGNhc2UgRU1fMzg2OgorICAgIGNhc2UgRU1fNDg2OgorICAgIGNhc2UgRU1fQ1lHTlVTX00zMlI6CisgICAgY2FzZSBFTV9DWUdOVVNfRDEwVjoKKyAgICBjYXNlIEVNX01JUFM6CisgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKKyAgICAgIHsKKwlFbGYzMl9FeHRlcm5hbF9SZWwgKiBlcmVsczsKKworCUdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCisJCQlFbGYzMl9FeHRlcm5hbF9SZWwgKiwgInJlbG9jcyIpOworCisJcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKKworCXJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKSBtYWxsb2MgKHJlbF9zaXplICoKKwkJCQkJICAgIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbCkpOworCisJZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCisJICB7CisJICAgIHJlbHNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVCAoZXJlbHNbaV0ucl9vZmZzZXQpOworCSAgICByZWxzW2ldLnJfaW5mbyAgID0gQllURV9HRVQgKGVyZWxzW2ldLnJfaW5mbyk7CisJICB9CisKKwlmcmVlIChlcmVscyk7CisKKwlpc19yZWxhID0gMDsKKwlyZWxhcyAgID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIHJlbHM7CisgICAgICB9CisgICAgYnJlYWs7CisKKyAgICAgIC8qIFRhcmdldHMgdGhhdCB1c2UgUkVMQSByZWxvY2F0aW9ucy4gICovCisgICAgY2FzZSBFTV82OEs6CisgICAgY2FzZSBFTV9TUEFSQzoKKyAgICBjYXNlIEVNX1BQQzoKKyAgICBjYXNlIEVNX0NZR05VU19WODUwOgorICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6CisgICAgY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKKyAgICBjYXNlIEVNX0NZR05VU19NTjEwMzAwOgorICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6CisgICAgY2FzZSBFTV9TSDoKKyAgICBjYXNlIEVNX0FMUEhBOgorICAgIGNhc2UgRU1fTUNPUkU6CisgICAgICB7CisJRWxmMzJfRXh0ZXJuYWxfUmVsYSAqIGVyZWxhczsKKworCUdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAorCQkJRWxmMzJfRXh0ZXJuYWxfUmVsYSAqLCAicmVsb2NzIik7CisKKwlyZWxfc2l6ZSA9IHJlbF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKKworCXJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopIG1hbGxvYyAocmVsX3NpemUgKgorCQkJCQkgICAgICBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKKwkgIHsKKwkgICAgcmVsYXNbaV0ucl9vZmZzZXQgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfb2Zmc2V0KTsKKwkgICAgcmVsYXNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfaW5mbyk7CisJICAgIHJlbGFzW2ldLnJfYWRkZW5kID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX2FkZGVuZCk7CisJICB9CisKKwlmcmVlIChlcmVsYXMpOworCisJaXNfcmVsYSA9IDE7CisJcmVscyAgICA9IChFbGZfSW50ZXJuYWxfUmVsICopIHJlbGFzOworICAgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHdhcm4gKF8oIkRvbid0IGtub3cgYWJvdXQgcmVsb2NhdGlvbnMgb24gdGhpcyBtYWNoaW5lIGFyY2hpdGVjdHVyZVxuIikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChpc19yZWxhKQorICAgIHByaW50ZgorICAgICAgKF8oIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZSAgICAgICAgICBBZGRlbmRcbiIpKTsKKyAgZWxzZQorICAgIHByaW50ZgorICAgICAgKF8oIiAgT2Zmc2V0ICAgIEluZm8gIFR5cGUgICAgICAgICAgICBTeW1ib2wncyBWYWx1ZSAgU3ltYm9sJ3MgTmFtZVxuIikpOworCisgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKiAgcnR5cGU7CisgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW5mbzsKKyAgICAgIGludCAgICAgICAgICAgc3ltdGFiX2luZGV4OworCisgICAgICBpZiAoaXNfcmVsYSkKKwl7CisJICBvZmZzZXQgPSByZWxhcyBbaV0ucl9vZmZzZXQ7CisJICBpbmZvICAgPSByZWxhcyBbaV0ucl9pbmZvOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBvZmZzZXQgPSByZWxzIFtpXS5yX29mZnNldDsKKwkgIGluZm8gICA9IHJlbHMgW2ldLnJfaW5mbzsKKwl9CisKKyAgICAgIHByaW50ZiAoIiAgJTguOGx4ICAlNS41bHggIiwgb2Zmc2V0LCBpbmZvKTsKKworICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKKwl7CisJZGVmYXVsdDoKKwkgIHJ0eXBlID0gTlVMTDsKKwkgIGJyZWFrOworCisJY2FzZSBFTV9DWUdOVVNfTTMyUjoKKwkgIHJ0eXBlID0gZWxmX20zMnJfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fMzg2OgorCWNhc2UgRU1fNDg2OgorCSAgcnR5cGUgPSBlbGZfaTM4Nl9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKKwkgIGJyZWFrOworCisJY2FzZSBFTV82OEs6CisJICBydHlwZSA9IGVsZl9tNjhrX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOworCSAgYnJlYWs7CisKKwljYXNlIEVNX1NQQVJDOgorCSAgcnR5cGUgPSBlbGZfc3BhcmNfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6CisJICBydHlwZSA9IHY4NTBfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fQ1lHTlVTX0QxMFY6CisJICBydHlwZSA9IGVsZl9kMTB2X3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOworCSAgYnJlYWs7CisKKwljYXNlIEVNX0NZR05VU19EMzBWOgorCSAgcnR5cGUgPSBlbGZfZDMwdl9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKKwkgIGJyZWFrOworCisJY2FzZSBFTV9TSDoKKwkgIHJ0eXBlID0gZWxmX3NoX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOworCSAgYnJlYWs7CisKKwljYXNlIEVNX0NZR05VU19NTjEwMzAwOgorCSAgcnR5cGUgPSBlbGZfbW4xMDMwMF9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKKwkgIGJyZWFrOworCisJY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKKwkgIHJ0eXBlID0gZWxmX21uMTAyMDBfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fQ1lHTlVTX0ZSMzA6CisJICBydHlwZSA9IGVsZl9mcjMwX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOworCSAgYnJlYWs7CisKKwljYXNlIEVNX01DT1JFOgorCSAgcnR5cGUgPSBlbGZfbWNvcmVfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fUFBDOgorCSAgcnR5cGUgPSBlbGZfcHBjX3JlbG9jX3R5cGUgKEVMRjMyX1JfVFlQRSAoaW5mbykpOworCSAgYnJlYWs7CisKKwljYXNlIEVNX01JUFM6CisJY2FzZSBFTV9NSVBTX1JTNF9CRToKKwkgIHJ0eXBlID0gZWxmX21pcHNfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fQUxQSEE6CisJICBydHlwZSA9IGVsZl9hbHBoYV9yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKKwkgIGJyZWFrOworCisJY2FzZSBFTV9BUk06CisJICBydHlwZSA9IGVsZl9hcm1fcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKworCWNhc2UgRU1fQ1lHTlVTX0FSQzoKKwkgIHJ0eXBlID0gZWxmX2FyY19yZWxvY190eXBlIChFTEYzMl9SX1RZUEUgKGluZm8pKTsKKwkgIGJyZWFrOworCisJY2FzZSBFTV9QQVJJU0M6CisJICBydHlwZSA9IGVsZjMyX2hwcGFfcmVsb2NfdHlwZSAoRUxGMzJfUl9UWVBFIChpbmZvKSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChydHlwZSA9PSBOVUxMKQorCXByaW50ZiAoXygidW5yZWNvZ25pc2VkOiAlLTdseCIpLCBFTEYzMl9SX1RZUEUgKGluZm8pKTsKKyAgICAgIGVsc2UKKwlwcmludGYgKCIlLTIxLjIxcyIsIHJ0eXBlKTsKKworICAgICAgc3ltdGFiX2luZGV4ID0gRUxGMzJfUl9TWU0gKGluZm8pOworCisgICAgICBpZiAoc3ltdGFiX2luZGV4ICYmIHN5bXRhYiAhPSBOVUxMKQorCXsKKwkgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltOworCisJICBwc3ltID0gc3ltdGFiICsgc3ltdGFiX2luZGV4OworCisJICBwcmludGYgKCIgJTA4bHggICIsICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSk7CisKKwkgIGlmIChwc3ltLT5zdF9uYW1lID09IDApCisJICAgIHByaW50ZiAoIiUtMjUuMjVzIiwKKwkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgcHN5bS0+c3Rfc2huZHgpKTsKKwkgIGVsc2UgaWYgKHN0cnRhYiA9PSBOVUxMKQorCSAgICBwcmludGYgKF8oIjxzdHJpbmcgdGFibGUgaW5kZXggJTNsZD4iKSwgcHN5bS0+c3RfbmFtZSk7CisJICBlbHNlCisJICAgIHByaW50ZiAoIiUtMjUuMjVzIiwgc3RydGFiICsgcHN5bS0+c3RfbmFtZSk7CisKKwkgIGlmIChpc19yZWxhKQorCSAgICBwcmludGYgKCIgKyAlbHgiLCAodW5zaWduZWQgbG9uZykgcmVsYXMgW2ldLnJfYWRkZW5kKTsKKwl9CisKKyAgICAgIHB1dGNoYXIgKCdcbicpOworICAgIH0KKworICBmcmVlIChyZWxhcyk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9taXBzX2R5bmFtaWNfdHlwZSAodHlwZSkKKyAgICAgdW5zaWduZWQgbG9uZyB0eXBlOworeworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRFRfTUlQU19STERfVkVSU0lPTjogcmV0dXJuICJNSVBTX1JMRF9WRVJTSU9OIjsKKyAgICBjYXNlIERUX01JUFNfVElNRV9TVEFNUDogcmV0dXJuICJNSVBTX1RJTUVfU1RBTVAiOworICAgIGNhc2UgRFRfTUlQU19JQ0hFQ0tTVU06IHJldHVybiAiTUlQU19JQ0hFQ0tTVU0iOworICAgIGNhc2UgRFRfTUlQU19JVkVSU0lPTjogcmV0dXJuICJNSVBTX0lWRVJTSU9OIjsKKyAgICBjYXNlIERUX01JUFNfRkxBR1M6IHJldHVybiAiTUlQU19GTEFHUyI7CisgICAgY2FzZSBEVF9NSVBTX0JBU0VfQUREUkVTUzogcmV0dXJuICJNSVBTX0JBU0VfQUREUkVTUyI7CisgICAgY2FzZSBEVF9NSVBTX01TWU06IHJldHVybiAiTUlQU19NU1lNIjsKKyAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1Q6IHJldHVybiAiTUlQU19DT05GTElDVCI7CisgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1Q6IHJldHVybiAiTUlQU19MSUJMSVNUIjsKKyAgICBjYXNlIERUX01JUFNfTE9DQUxfR09UTk86IHJldHVybiAiTUlQU19MT0NBTF9HT1ROTyI7CisgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86IHJldHVybiAiTUlQU19DT05GTElDVE5PIjsKKyAgICBjYXNlIERUX01JUFNfTElCTElTVE5POiByZXR1cm4gIk1JUFNfTElCTElTVE5PIjsKKyAgICBjYXNlIERUX01JUFNfU1lNVEFCTk86IHJldHVybiAiTUlQU19TWU1UQUJOTyI7CisgICAgY2FzZSBEVF9NSVBTX1VOUkVGRVhUTk86IHJldHVybiAiTUlQU19VTlJFRkVYVE5PIjsKKyAgICBjYXNlIERUX01JUFNfR09UU1lNOiByZXR1cm4gIk1JUFNfR09UU1lNIjsKKyAgICBjYXNlIERUX01JUFNfSElQQUdFTk86IHJldHVybiAiTUlQU19ISVBBR0VOTyI7CisgICAgY2FzZSBEVF9NSVBTX1JMRF9NQVA6IHJldHVybiAiTUlQU19STERfTUFQIjsKKyAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1M6IHJldHVybiAiTUlQU19ERUxUQV9DTEFTUyI7CisgICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NfTk8iOworICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRTogcmV0dXJuICJNSVBTX0RFTFRBX0lOU1RBTkNFIjsKKyAgICBjYXNlIERUX01JUFNfREVMVEFfSU5TVEFOQ0VfTk86IHJldHVybiAiTUlQU19ERUxUQV9JTlNUQU5DRV9OTyI7CisgICAgY2FzZSBEVF9NSVBTX0RFTFRBX1JFTE9DOiByZXR1cm4gIk1JUFNfREVMVEFfUkVMT0MiOworICAgIGNhc2UgRFRfTUlQU19ERUxUQV9SRUxPQ19OTzogcmV0dXJuICJNSVBTX0RFTFRBX1JFTE9DX05PIjsKKyAgICBjYXNlIERUX01JUFNfREVMVEFfU1lNOiByZXR1cm4gIk1JUFNfREVMVEFfU1lNIjsKKyAgICBjYXNlIERUX01JUFNfREVMVEFfU1lNX05POiByZXR1cm4gIk1JUFNfREVMVEFfU1lNX05PIjsKKyAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU06IHJldHVybiAiTUlQU19ERUxUQV9DTEFTU1NZTSI7CisgICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05POiByZXR1cm4gIk1JUFNfREVMVEFfQ0xBU1NTWU1fTk8iOworICAgIGNhc2UgRFRfTUlQU19DWFhfRkxBR1M6IHJldHVybiAiTUlQU19DWFhfRkxBR1MiOworICAgIGNhc2UgRFRfTUlQU19QSVhJRV9JTklUOiByZXR1cm4gIk1JUFNfUElYSUVfSU5JVCI7CisgICAgY2FzZSBEVF9NSVBTX1NZTUJPTF9MSUI6IHJldHVybiAiTUlQU19TWU1CT0xfTElCIjsKKyAgICBjYXNlIERUX01JUFNfTE9DQUxQQUdFX0dPVElEWDogcmV0dXJuICJNSVBTX0xPQ0FMUEFHRV9HT1RJRFgiOworICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1RJRFg6IHJldHVybiAiTUlQU19MT0NBTF9HT1RJRFgiOworICAgIGNhc2UgRFRfTUlQU19ISURERU5fR09USURYOiByZXR1cm4gIk1JUFNfSElEREVOX0dPVElEWCI7CisgICAgY2FzZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFg6IHJldHVybiAiTUlQU19QUk9URUNURURfR09USURYIjsKKyAgICBjYXNlIERUX01JUFNfT1BUSU9OUzogcmV0dXJuICJNSVBTX09QVElPTlMiOworICAgIGNhc2UgRFRfTUlQU19JTlRFUkZBQ0U6IHJldHVybiAiTUlQU19JTlRFUkZBQ0UiOworICAgIGNhc2UgRFRfTUlQU19EWU5TVFJfQUxJR046IHJldHVybiAiTUlQU19EWU5TVFJfQUxJR04iOworICAgIGNhc2UgRFRfTUlQU19JTlRFUkZBQ0VfU0laRTogcmV0dXJuICJNSVBTX0lOVEVSRkFDRV9TSVpFIjsKKyAgICBjYXNlIERUX01JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSOiByZXR1cm4gIk1JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSIjsKKyAgICBjYXNlIERUX01JUFNfUEVSRl9TVUZGSVg6IHJldHVybiAiTUlQU19QRVJGX1NVRkZJWCI7CisgICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRTogcmV0dXJuICJNSVBTX0NPTVBBQ1RfU0laRSI7CisgICAgY2FzZSBEVF9NSVBTX0dQX1ZBTFVFOiByZXR1cm4gIk1JUFNfR1BfVkFMVUUiOworICAgIGNhc2UgRFRfTUlQU19BVVhfRFlOQU1JQzogcmV0dXJuICJNSVBTX0FVWF9EWU5BTUlDIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfZHluYW1pY190eXBlICh0eXBlKQorICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgRFRfTlVMTDoJcmV0dXJuICJOVUxMIjsKKyAgICBjYXNlIERUX05FRURFRDoJcmV0dXJuICJORUVERUQiOworICAgIGNhc2UgRFRfUExUUkVMU1o6CXJldHVybiAiUExUUkVMU1oiOworICAgIGNhc2UgRFRfUExUR09UOglyZXR1cm4gIlBMVEdPVCI7CisgICAgY2FzZSBEVF9IQVNIOglyZXR1cm4gIkhBU0giOworICAgIGNhc2UgRFRfU1RSVEFCOglyZXR1cm4gIlNUUlRBQiI7CisgICAgY2FzZSBEVF9TWU1UQUI6CXJldHVybiAiU1lNVEFCIjsKKyAgICBjYXNlIERUX1JFTEE6CXJldHVybiAiUkVMQSI7CisgICAgY2FzZSBEVF9SRUxBU1o6CXJldHVybiAiUkVMQVNaIjsKKyAgICBjYXNlIERUX1JFTEFFTlQ6CXJldHVybiAiUkVMQUVOVCI7CisgICAgY2FzZSBEVF9TVFJTWjoJcmV0dXJuICJTVFJTWiI7CisgICAgY2FzZSBEVF9TWU1FTlQ6CXJldHVybiAiU1lNRU5UIjsKKyAgICBjYXNlIERUX0lOSVQ6CXJldHVybiAiSU5JVCI7CisgICAgY2FzZSBEVF9GSU5JOglyZXR1cm4gIkZJTkkiOworICAgIGNhc2UgRFRfU09OQU1FOglyZXR1cm4gIlNPTkFNRSI7CisgICAgY2FzZSBEVF9SUEFUSDoJcmV0dXJuICJSUEFUSCI7CisgICAgY2FzZSBEVF9TWU1CT0xJQzoJcmV0dXJuICJTWU1CT0xJQyI7CisgICAgY2FzZSBEVF9SRUw6CXJldHVybiAiUkVMIjsKKyAgICBjYXNlIERUX1JFTFNaOglyZXR1cm4gIlJFTFNaIjsKKyAgICBjYXNlIERUX1JFTEVOVDoJcmV0dXJuICJSRUxFTlQiOworICAgIGNhc2UgRFRfUExUUkVMOglyZXR1cm4gIlBMVFJFTCI7CisgICAgY2FzZSBEVF9ERUJVRzoJcmV0dXJuICJERUJVRyI7CisgICAgY2FzZSBEVF9URVhUUkVMOglyZXR1cm4gIlRFWFRSRUwiOworICAgIGNhc2UgRFRfSk1QUkVMOglyZXR1cm4gIkpNUFJFTCI7CisgICAgY2FzZSBEVF9CSU5EX05PVzogICByZXR1cm4gIkJJTkRfTk9XIjsKKyAgICBjYXNlIERUX0lOSVRfQVJSQVk6IHJldHVybiAiSU5JVF9BUlJBWSI7CisgICAgY2FzZSBEVF9GSU5JX0FSUkFZOiByZXR1cm4gIkZJTklfQVJSQVkiOworICAgIGNhc2UgRFRfSU5JVF9BUlJBWVNaOiByZXR1cm4gIklOSVRfQVJSQVlTWiI7CisgICAgY2FzZSBEVF9GSU5JX0FSUkFZU1o6IHJldHVybiAiRklOSV9BUlJBWVNaIjsKKyAgICAgIAorICAgIGNhc2UgRFRfUExUUEFEU1o6CXJldHVybiAiUExUUEFEU1oiOworICAgIGNhc2UgRFRfTU9WRUVOVDoJcmV0dXJuICJNT1ZFRU5UIjsKKyAgICBjYXNlIERUX01PVkVTWjoJcmV0dXJuICJNT1ZFU1oiOworICAgIGNhc2UgRFRfRkVBVFVSRV8xOglyZXR1cm4gIkZFQVRVUkVfMSI7CisgICAgY2FzZSBEVF9QT1NGTEFHXzE6CXJldHVybiAiUE9TRkxBR18xIjsKKyAgICBjYXNlIERUX1NZTUlOU1o6CXJldHVybiAiU1lNSU5TWiI7CisgICAgY2FzZSBEVF9TWU1JTkVOVDoJcmV0dXJuICJTWU1JTkVOVCI7IC8qIGFrYSBWQUxSTkdISSAqLworICAgICAgCisgICAgY2FzZSBEVF9BRERSUk5HTE86ICByZXR1cm4gIkFERFJSTkdMTyI7CisgICAgY2FzZSBEVF9TWU1JTkZPOglyZXR1cm4gIlNZTUlORk8iOyAvKiBha2EgQUREUlJOR0hJICovCisgICAgICAKKyAgICBjYXNlIERUX1ZFUlNZTToJcmV0dXJuICJWRVJTWU0iOworICAgICAgCisgICAgY2FzZSBEVF9SRUxBQ09VTlQ6CXJldHVybiAiUkVMQUNPVU5UIjsKKyAgICBjYXNlIERUX1JFTENPVU5UOglyZXR1cm4gIlJFTENPVU5UIjsKKyAgICBjYXNlIERUX0ZMQUdTXzE6CXJldHVybiAiRkxBR1NfMSI7CisgICAgY2FzZSBEVF9WRVJERUY6CXJldHVybiAiVkVSREVGIjsKKyAgICBjYXNlIERUX1ZFUkRFRk5VTToJcmV0dXJuICJWRVJERUZOVU0iOworICAgIGNhc2UgRFRfVkVSTkVFRDoJcmV0dXJuICJWRVJORUVEIjsKKyAgICBjYXNlIERUX1ZFUk5FRUROVU06CXJldHVybiAiVkVSTkVFRE5VTSI7CisgICAgICAKKyAgICBjYXNlIERUX0FVWElMSUFSWToJcmV0dXJuICJBVVhJTEFSWSI7CisgICAgY2FzZSBEVF9VU0VEOglyZXR1cm4gIlVTRUQiOworICAgIGNhc2UgRFRfRklMVEVSOglyZXR1cm4gIkZJTFRFUiI7CisgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCh0eXBlID49IERUX0xPUFJPQykgJiYgKHR5cGUgPD0gRFRfSElQUk9DKSkKKwl7CisJICBjb25zdCBjaGFyICogcmVzdWx0OworCSAgCisJICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQorCSAgICB7CisJICAgIGNhc2UgRU1fTUlQUzoKKwkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKKwkgICAgICByZXN1bHQgPSBnZXRfbWlwc19keW5hbWljX3R5cGUgKHR5cGUpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJlc3VsdCA9IE5VTEw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCSAgICByZXR1cm4gcmVzdWx0OworCisJICBzcHJpbnRmIChidWZmLCBfKCJQcm9jZXNzb3IgU3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKKwl9CisgICAgICBlbHNlIGlmICgodHlwZSA+PSBEVF9MT09TKSAmJiAodHlwZSA8PSBEVF9ISU9TKSkKKwlzcHJpbnRmIChidWZmLCBfKCJPcGVyYXRpbmcgU3lzdGVtIHNwZWNpZmljOiAlbHgiKSwgdHlwZSk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlbHgiKSwgdHlwZSk7CisgICAgICAKKyAgICAgIHJldHVybiBidWZmOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorZ2V0X2ZpbGVfdHlwZSAoZV90eXBlKQorICAgICB1bnNpZ25lZCBlX3R5cGU7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKKworICBzd2l0Y2ggKGVfdHlwZSkKKyAgICB7CisgICAgY2FzZSBFVF9OT05FOglyZXR1cm4gXygiTk9ORSAoTm9uZSkiKTsKKyAgICBjYXNlIEVUX1JFTDoJcmV0dXJuIF8oIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiKTsKKyAgICBjYXNlIEVUX0VYRUM6ICAgICAgIHJldHVybiBfKCJFWEVDIChFeGVjdXRhYmxlIGZpbGUpIik7CisgICAgY2FzZSBFVF9EWU46ICAgICAgICByZXR1cm4gXygiRFlOIChTaGFyZWQgb2JqZWN0IGZpbGUpIik7CisgICAgY2FzZSBFVF9DT1JFOiAgICAgICByZXR1cm4gXygiQ09SRSAoQ29yZSBmaWxlKSIpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICgoZV90eXBlID49IEVUX0xPUFJPQykgJiYgKGVfdHlwZSA8PSBFVF9ISVBST0MpKQorCXNwcmludGYgKGJ1ZmYsIF8oIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIpLCBlX3R5cGUpOworICAgICAgZWxzZSBpZiAoKGVfdHlwZSA+PSBFVF9MT09TKSAmJiAoZV90eXBlIDw9IEVUX0hJT1MpKQorCXNwcmludGYgKGJ1ZmYsIF8oIk9TIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX3R5cGUpOworICAgICAgcmV0dXJuIGJ1ZmY7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnZXRfbWFjaGluZV9uYW1lIChlX21hY2hpbmUpCisgICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKK3sKKyAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOworCisgIHN3aXRjaCAoZV9tYWNoaW5lKQorICAgIHsKKyAgICBjYXNlIEVNX05PTkU6ICAgICAgICAJcmV0dXJuIF8oIk5vbmUiKTsKKyAgICBjYXNlIEVNX00zMjogICAgICAgICAJcmV0dXJuICJXRTMyMTAwIjsKKyAgICBjYXNlIEVNX1NQQVJDOiAgICAgICAJcmV0dXJuICJTcGFyYyI7CisgICAgY2FzZSBFTV8zODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODAzODYiOworICAgIGNhc2UgRU1fNjhLOiAgICAgICAgIAlyZXR1cm4gIk1DNjgwMDAiOworICAgIGNhc2UgRU1fODhLOiAgICAgICAgIAlyZXR1cm4gIk1DODgwMDAiOworICAgIGNhc2UgRU1fNDg2OiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwNDg2IjsKKyAgICBjYXNlIEVNXzg2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDg2MCI7CisgICAgY2FzZSBFTV9NSVBTOiAgICAgICAgCXJldHVybiAiTUlQUyBSMzAwMCBiaWctZW5kaWFuIjsKKyAgICBjYXNlIEVNX1MzNzA6ICAgICAgICAJcmV0dXJuICJBbWRhaGwiOworICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6IAlyZXR1cm4gIk1JUFMgUjQwMDAgYmlnLWVuZGlhbiI7CisgICAgY2FzZSBFTV9PTERfU1BBUkNWOToJcmV0dXJuICJTcGFyYyB2OSAob2xkKSI7CisgICAgY2FzZSBFTV9QQVJJU0M6ICAgICAgCXJldHVybiAiSFBQQSI7CisgICAgY2FzZSBFTV9QUENfT0xEOgkJcmV0dXJuICJQb3dlciBQQyAob2xkKSI7CisgICAgY2FzZSBFTV9TUEFSQzMyUExVUzogCXJldHVybiAiU3BhcmMgdjgrIiA7CisgICAgY2FzZSBFTV85NjA6ICAgICAgICAgCXJldHVybiAiSW50ZWwgOTA4NjAiOworICAgIGNhc2UgRU1fUFBDOiAgICAgICAgIAlyZXR1cm4gIlBvd2VyUEMiOworICAgIGNhc2UgRU1fVjgwMDogICAgICAgICAJcmV0dXJuICJORUMgVjgwMCI7CisgICAgY2FzZSBFTV9GUjIwOiAgICAgICAgIAlyZXR1cm4gIkZ1aml0c3UgRlIyMCI7CisgICAgY2FzZSBFTV9SSDMyOiAgICAgICAgIAlyZXR1cm4gIlRSVyBSSDMyIjsKKyAgICBjYXNlIEVNX01DT1JFOgkgICAgICAgIHJldHVybiAiTUNPUkUiOworICAgIGNhc2UgRU1fQVJNOgkgCXJldHVybiAiQVJNIjsKKyAgICBjYXNlIEVNX09MRF9BTFBIQToJIAlyZXR1cm4gIkRpZ2l0YWwgQWxwaGEgKG9sZCkiOworICAgIGNhc2UgRU1fU0g6CQkgCXJldHVybiAiSGl0YWNoaSBTSCI7CisgICAgY2FzZSBFTV9TUEFSQ1Y5OiAgICAgCXJldHVybiAiU3BhcmMgdjkiOworICAgIGNhc2UgRU1fVFJJQ09SRTogICAgCXJldHVybiAiU2llbWVucyBUcmljb3JlIjsKKyAgICBjYXNlIEVNX0FSQzoJCXJldHVybiAiQXJnb25hdXQgUklTQyBDb3JlIjsKKyAgICBjYXNlIEVNX0g4XzMwMDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDAiOworICAgIGNhc2UgRU1fSDhfMzAwSDoJCXJldHVybiAiSGl0YWNoaSBIOC8zMDBIIjsKKyAgICBjYXNlIEVNX0g4UzoJCXJldHVybiAiSGl0YWNoaSBIOFMiOworICAgIGNhc2UgRU1fSDhfNTAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzUwMCI7CisgICAgY2FzZSBFTV9JQV82NDoJCXJldHVybiAiSW50ZWwgTWVyY2VkIjsKKyAgICBjYXNlIEVNX01JUFNfWDoJCXJldHVybiAiU3RhbmZvcmQgTUlQUy1YIjsKKyAgICBjYXNlIEVNX0NPTERGSVJFOgkJcmV0dXJuICJNb3Rvcm9sYSBDb2xkZmlyZSI7CisgICAgY2FzZSBFTV82OEhDMTI6CQlyZXR1cm4gIk1vdG9yb2xhIE02OEhDMTIiOworICAgIGNhc2UgRU1fQUxQSEE6ICAgICAgIAlyZXR1cm4gIkFscGhhIjsKKyAgICBjYXNlIEVNX0NZR05VU19EMTBWOiAgICAgICAgcmV0dXJuICJkMTB2IjsKKyAgICBjYXNlIEVNX0NZR05VU19EMzBWOiAgICAgICAgcmV0dXJuICJkMzB2IjsKKyAgICBjYXNlIEVNX0NZR05VU19BUkM6CQlyZXR1cm4gIkFyYyI7CisgICAgY2FzZSBFTV9DWUdOVVNfTTMyUjoJcmV0dXJuICJNaXRzdWJpc2hpIE0zMnIiOworICAgIGNhc2UgRU1fQ1lHTlVTX1Y4NTA6CXJldHVybiAiTkVDIHY4NTAiOworICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6CXJldHVybiAibW4xMDMwMCI7CisgICAgY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoJcmV0dXJuICJtbjEwMjAwIjsKKyAgICBjYXNlIEVNX0NZR05VU19GUjMwOglyZXR1cm4gIkZ1aml0c3UgRlIzMCI7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBlX21hY2hpbmUpOworICAgICAgcmV0dXJuIGJ1ZmY7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnZXRfbWFjaGluZV9mbGFncyAoZV9mbGFncywgZV9tYWNoaW5lKQorICAgICB1bnNpZ25lZCBlX2ZsYWdzOworICAgICB1bnNpZ25lZCBlX21hY2hpbmU7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZiBbMTAyNF07CisKKyAgYnVmWzBdID0gJ1wwJzsKKyAgaWYgKGVfZmxhZ3MpCisgICAgeworICAgICAgc3dpdGNoIChlX21hY2hpbmUpCisJeworCWRlZmF1bHQ6CisJICBicmVhazsKKworCWNhc2UgRU1fUFBDOgorCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfRU1CKQorCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZW1iIik7CisKKwkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKQorCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUiKTsKKworCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQorCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUtbGliIik7CisJICBicmVhazsKKworCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6CisJICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCisJICAgIHsKKwkgICAgY2FzZSBFX1Y4NTBFX0FSQ0g6CisJICAgICAgc3RyY2F0IChidWYsICIsIHY4NTBlIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRV9WODUwRUFfQVJDSDoKKwkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MGVhIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRV9WODUwX0FSQ0g6CisJICAgICAgc3RyY2F0IChidWYsICIsIHY4NTAiKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdW5rbm93biB2ODUwIGFyY2hpdGVjdHVyZSB2YXJpYW50Iik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBFTV9DWUdOVVNfTTMyUjoKKwkgIGlmICgoZV9mbGFncyAmIEVGX00zMlJfQVJDSCkgPT0gRV9NMzJSX0FSQ0gpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBtMzJyIik7CisKKwkgIGJyZWFrOworCisJY2FzZSBFTV9NSVBTOgorCWNhc2UgRU1fTUlQU19SUzRfQkU6CisJICBpZiAoZV9mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSKQorCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm9yZW9yZGVyIik7CisKKwkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19QSUMpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBwaWMiKTsKKworCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBjcGljIik7CisKKwkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19BQkkyKQorCSAgICBzdHJjYXQgKGJ1ZiwgIiwgYWJpMiIpOworCisJICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMSIpOworCisJICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMiIpOworCisJICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMyIpOworCisJICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCisJICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzNCIpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfbWFjaGluZV9kYXRhIChlX2RhdGEpCisgICAgIHVuc2lnbmVkIGVfZGF0YTsKK3sKKyAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOworCisgIHN3aXRjaCAoZV9kYXRhKQorICAgIHsKKyAgICBjYXNlIEVMRkRBVEEyTFNCOiByZXR1cm4gXygiRUxGREFUQTJMU0IgKGxpdHRsZSBlbmRpYW4pIik7CisgICAgY2FzZSBFTEZEQVRBMk1TQjogcmV0dXJuIF8oIkVMRkRBVEEyTVNCIChiaWcgZW5kaWFuKSIpOworICAgIGRlZmF1bHQ6CisgICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfZGF0YSk7CisgICAgICByZXR1cm4gYnVmZjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9taXBzX3NlZ21lbnRfdHlwZSAodHlwZSkKKyAgICAgdW5zaWduZWQgbG9uZyB0eXBlOworeworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgUFRfTUlQU19SRUdJTkZPOgorICAgICAgcmV0dXJuICJSRUdJTkZPIjsKKyAgICBjYXNlIFBUX01JUFNfUlRQUk9DOgorICAgICAgcmV0dXJuICJSVFBST0MiOworICAgIGNhc2UgUFRfTUlQU19PUFRJT05TOgorICAgICAgcmV0dXJuICJPUFRJT05TIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfc2VnbWVudF90eXBlIChwX3R5cGUpCisgICAgIHVuc2lnbmVkIGxvbmcgcF90eXBlOworeworICBzdGF0aWMgY2hhciBidWZmIFszMl07CisKKyAgc3dpdGNoIChwX3R5cGUpCisgICAgeworICAgIGNhc2UgUFRfTlVMTDogICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICBjYXNlIFBUX0xPQUQ6ICAgICAgIHJldHVybiAiTE9BRCI7CisgICAgY2FzZSBQVF9EWU5BTUlDOglyZXR1cm4gIkRZTkFNSUMiOworICAgIGNhc2UgUFRfSU5URVJQOiAgICAgcmV0dXJuICJJTlRFUlAiOworICAgIGNhc2UgUFRfTk9URTogICAgICAgcmV0dXJuICJOT1RFIjsKKyAgICBjYXNlIFBUX1NITElCOiAgICAgIHJldHVybiAiU0hMSUIiOworICAgIGNhc2UgUFRfUEhEUjogICAgICAgcmV0dXJuICJQSERSIjsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKHBfdHlwZSA+PSBQVF9MT1BST0MpICYmIChwX3R5cGUgPD0gUFRfSElQUk9DKSkKKwl7CisJICBjb25zdCBjaGFyICogcmVzdWx0OworCSAgCisJICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQorCSAgICB7CisJICAgIGNhc2UgRU1fTUlQUzoKKwkgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKKwkgICAgICByZXN1bHQgPSBnZXRfbWlwc19zZWdtZW50X3R5cGUgKHBfdHlwZSk7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgcmVzdWx0ID0gTlVMTDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgCisJICBpZiAocmVzdWx0ICE9IE5VTEwpCisJICAgIHJldHVybiByZXN1bHQ7CisJICAKKwkgIHNwcmludGYgKGJ1ZmYsICJMT1BST0MrJWx4IiwgcF90eXBlIC0gUFRfTE9QUk9DKTsKKwl9CisgICAgICBlbHNlIGlmICgocF90eXBlID49IFBUX0xPT1MpICYmIChwX3R5cGUgPD0gUFRfSElPUykpCisJc3ByaW50ZiAoYnVmZiwgIkxPT1MrJWx4IiwgcF90eXBlIC0gUFRfTE9PUyk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlbHgiKSwgcF90eXBlKTsKKworICAgICAgcmV0dXJuIGJ1ZmY7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfbWlwc19zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKKyAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Cit7CisgIHN3aXRjaCAoc2hfdHlwZSkKKyAgICB7CisgICAgY2FzZSBTSFRfTUlQU19MSUJMSVNUOiAgICAgICByZXR1cm4gIk1JUFNfTElCTElTVCI7CisgICAgY2FzZSBTSFRfTUlQU19NU1lNOiAgICAgICAgICByZXR1cm4gIk1JUFNfTVNZTSI7CisgICAgY2FzZSBTSFRfTUlQU19DT05GTElDVDogICAgICByZXR1cm4gIk1JUFNfQ09ORkxJQ1QiOworICAgIGNhc2UgU0hUX01JUFNfR1BUQUI6ICAgICAgICAgcmV0dXJuICJNSVBTX0dQVEFCIjsKKyAgICBjYXNlIFNIVF9NSVBTX1VDT0RFOiAgICAgICAgIHJldHVybiAiTUlQU19VQ09ERSI7CisgICAgY2FzZSBTSFRfTUlQU19ERUJVRzogICAgICAgICByZXR1cm4gIk1JUFNfREVCVUciOworICAgIGNhc2UgU0hUX01JUFNfUkVHSU5GTzogICAgICAgcmV0dXJuICJNSVBTX1JFR0lORk8iOworICAgIGNhc2UgU0hUX01JUFNfUEFDS0FHRTogICAgICAgcmV0dXJuICJNSVBTX1BBQ0tBR0UiOworICAgIGNhc2UgU0hUX01JUFNfUEFDS1NZTTogICAgICAgcmV0dXJuICJNSVBTX1BBQ0tTWU0iOworICAgIGNhc2UgU0hUX01JUFNfUkVMRDogICAgICAgICAgcmV0dXJuICJNSVBTX1JFTEQiOworICAgIGNhc2UgU0hUX01JUFNfSUZBQ0U6ICAgICAgICAgcmV0dXJuICJNSVBTX0lGQUNFIjsKKyAgICBjYXNlIFNIVF9NSVBTX0NPTlRFTlQ6ICAgICAgIHJldHVybiAiTUlQU19DT05URU5UIjsKKyAgICBjYXNlIFNIVF9NSVBTX09QVElPTlM6ICAgICAgIHJldHVybiAiTUlQU19PUFRJT05TIjsKKyAgICBjYXNlIFNIVF9NSVBTX1NIRFI6ICAgICAgICAgIHJldHVybiAiTUlQU19TSERSIjsKKyAgICBjYXNlIFNIVF9NSVBTX0ZERVNDOiAgICAgICAgIHJldHVybiAiTUlQU19GREVTQyI7CisgICAgY2FzZSBTSFRfTUlQU19FWFRTWU06ICAgICAgICByZXR1cm4gIk1JUFNfRVhUU1lNIjsKKyAgICBjYXNlIFNIVF9NSVBTX0RFTlNFOiAgICAgICAgIHJldHVybiAiTUlQU19ERU5TRSI7CisgICAgY2FzZSBTSFRfTUlQU19QREVTQzogICAgICAgICByZXR1cm4gIk1JUFNfUERFU0MiOworICAgIGNhc2UgU0hUX01JUFNfTE9DU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0xPQ1NZTSI7CisgICAgY2FzZSBTSFRfTUlQU19BVVhTWU06ICAgICAgICByZXR1cm4gIk1JUFNfQVVYU1lNIjsKKyAgICBjYXNlIFNIVF9NSVBTX09QVFNZTTogICAgICAgIHJldHVybiAiTUlQU19PUFRTWU0iOworICAgIGNhc2UgU0hUX01JUFNfTE9DU1RSOiAgICAgICAgcmV0dXJuICJNSVBTX0xPQ1NUUiI7CisgICAgY2FzZSBTSFRfTUlQU19MSU5FOiAgICAgICAgICByZXR1cm4gIk1JUFNfTElORSI7CisgICAgY2FzZSBTSFRfTUlQU19SRkRFU0M6ICAgICAgICByZXR1cm4gIk1JUFNfUkZERVNDIjsKKyAgICBjYXNlIFNIVF9NSVBTX0RFTFRBU1lNOiAgICAgIHJldHVybiAiTUlQU19ERUxUQVNZTSI7CisgICAgY2FzZSBTSFRfTUlQU19ERUxUQUlOU1Q6ICAgICByZXR1cm4gIk1JUFNfREVMVEFJTlNUIjsKKyAgICBjYXNlIFNIVF9NSVBTX0RFTFRBQ0xBU1M6ICAgIHJldHVybiAiTUlQU19ERUxUQUNMQVNTIjsKKyAgICBjYXNlIFNIVF9NSVBTX0RXQVJGOiAgICAgICAgIHJldHVybiAiTUlQU19EV0FSRiI7CisgICAgY2FzZSBTSFRfTUlQU19ERUxUQURFQ0w6ICAgICByZXR1cm4gIk1JUFNfREVMVEFERUNMIjsKKyAgICBjYXNlIFNIVF9NSVBTX1NZTUJPTF9MSUI6ICAgIHJldHVybiAiTUlQU19TWU1CT0xfTElCIjsKKyAgICBjYXNlIFNIVF9NSVBTX0VWRU5UUzogICAgICAgIHJldHVybiAiTUlQU19FVkVOVFMiOworICAgIGNhc2UgU0hUX01JUFNfVFJBTlNMQVRFOiAgICAgcmV0dXJuICJNSVBTX1RSQU5TTEFURSI7CisgICAgY2FzZSBTSFRfTUlQU19QSVhJRTogICAgICAgICByZXR1cm4gIk1JUFNfUElYSUUiOworICAgIGNhc2UgU0hUX01JUFNfWExBVEU6ICAgICAgICAgcmV0dXJuICJNSVBTX1hMQVRFIjsKKyAgICBjYXNlIFNIVF9NSVBTX1hMQVRFX0RFQlVHOiAgIHJldHVybiAiTUlQU19YTEFURV9ERUJVRyI7CisgICAgY2FzZSBTSFRfTUlQU19XSElSTDogICAgICAgICByZXR1cm4gIk1JUFNfV0hJUkwiOworICAgIGNhc2UgU0hUX01JUFNfRUhfUkVHSU9OOiAgICAgcmV0dXJuICJNSVBTX0VIX1JFR0lPTiI7CisgICAgY2FzZSBTSFRfTUlQU19YTEFURV9PTEQ6ICAgICByZXR1cm4gIk1JUFNfWExBVEVfT0xEIjsKKyAgICBjYXNlIFNIVF9NSVBTX1BEUl9FWENFUFRJT046IHJldHVybiAiTUlQU19QRFJfRVhDRVBUSU9OIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKQorICAgICB1bnNpZ25lZCBpbnQgc2hfdHlwZTsKK3sKKyAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOworCisgIHN3aXRjaCAoc2hfdHlwZSkKKyAgICB7CisgICAgY2FzZSBTSFRfTlVMTDoJCXJldHVybiAiTlVMTCI7CisgICAgY2FzZSBTSFRfUFJPR0JJVFM6CQlyZXR1cm4gIlBST0dCSVRTIjsKKyAgICBjYXNlIFNIVF9TWU1UQUI6CQlyZXR1cm4gIlNZTVRBQiI7CisgICAgY2FzZSBTSFRfU1RSVEFCOgkJcmV0dXJuICJTVFJUQUIiOworICAgIGNhc2UgU0hUX1JFTEE6CQlyZXR1cm4gIlJFTEEiOworICAgIGNhc2UgU0hUX0hBU0g6CQlyZXR1cm4gIkhBU0giOworICAgIGNhc2UgU0hUX0RZTkFNSUM6CQlyZXR1cm4gIkRZTkFNSUMiOworICAgIGNhc2UgU0hUX05PVEU6CQlyZXR1cm4gIk5PVEUiOworICAgIGNhc2UgU0hUX05PQklUUzoJCXJldHVybiAiTk9CSVRTIjsKKyAgICBjYXNlIFNIVF9SRUw6CQlyZXR1cm4gIlJFTCI7CisgICAgY2FzZSBTSFRfU0hMSUI6CQlyZXR1cm4gIlNITElCIjsKKyAgICBjYXNlIFNIVF9EWU5TWU06CQlyZXR1cm4gIkRZTlNZTSI7CisgICAgY2FzZSBTSFRfR05VX3ZlcmRlZjoJcmV0dXJuICJWRVJERUYiOworICAgIGNhc2UgU0hUX0dOVV92ZXJuZWVkOglyZXR1cm4gIlZFUk5FRUQiOworICAgIGNhc2UgU0hUX0dOVV92ZXJzeW06CXJldHVybiAiVkVSU1lNIjsKKyAgICBjYXNlIDB4NmZmZmZmZjA6CSAgICAgICAgcmV0dXJuICJWRVJTWU0iOworICAgIGNhc2UgMHg2ZmZmZmZmYzoJICAgICAgICByZXR1cm4gIlZFUkRFRiI7CisgICAgY2FzZSAweDdmZmZmZmZkOgkJcmV0dXJuICJBVVhJTElBUlkiOworICAgIGNhc2UgMHg3ZmZmZmZmZjoJCXJldHVybiAiRklMVEVSIjsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPUFJPQykgJiYgKHNoX3R5cGUgPD0gU0hUX0hJUFJPQykpCisJeworCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKKworCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKKwkgICAgeworCSAgICBjYXNlIEVNX01JUFM6CisJICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6CisJICAgICAgcmVzdWx0ID0gZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJlc3VsdCA9IE5VTEw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCSAgICByZXR1cm4gcmVzdWx0OworCisJICBzcHJpbnRmIChidWZmLCAiU0hUX0xPUFJPQysleCIsIHNoX3R5cGUgLSBTSFRfTE9QUk9DKTsKKwl9CisgICAgICBlbHNlIGlmICgoc2hfdHlwZSA+PSBTSFRfTE9PUykgJiYgKHNoX3R5cGUgPD0gU0hUX0hJT1MpKQorCXNwcmludGYgKGJ1ZmYsICJTSFRfTE9PUysleCIsIHNoX3R5cGUgLSBTSFRfTE9PUyk7CisgICAgICBlbHNlIGlmICgoc2hfdHlwZSA+PSBTSFRfTE9VU0VSKSAmJiAoc2hfdHlwZSA8PSBTSFRfSElVU0VSKSkKKwlzcHJpbnRmIChidWZmLCAiU0hUX0xPVVNFUisleCIsIHNoX3R5cGUgLSBTSFRfTE9VU0VSKTsKKyAgICAgIGVsc2UKKwlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIHNoX3R5cGUpOworICAgICAgCisgICAgICByZXR1cm4gYnVmZjsKKyAgICB9Cit9CisKK3N0cnVjdCBvcHRpb24gb3B0aW9ucyBbXSA9Cit7CisgIHsiYWxsIiwgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnYSd9LAorICB7ImZpbGUtaGVhZGVyIiwgICAgICBub19hcmd1bWVudCwgMCwgJ2gnfSwKKyAgeyJwcm9ncmFtLWhlYWRlcnMiLCAgbm9fYXJndW1lbnQsIDAsICdsJ30sCisgIHsiaGVhZGVycyIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnZSd9LAorICB7Imhpc3RvZ3JhbSIsICAgICAgICBub19hcmd1bWVudCwgJiBkb19oaXN0b2dyYW0sIDF9LAorICB7InNlZ21lbnRzIiwgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2wnfSwKKyAgeyJzZWN0aW9ucyIsICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdTJ30sCisgIHsic2VjdGlvbi1oZWFkZXJzIiwgIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAorICB7InN5bWJvbHMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3MnfSwKKyAgeyJzeW1zIiwgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdzJ30sCisgIHsicmVsb2NzIiwgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncid9LAorICB7ImR5bmFtaWMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2QnfSwKKyAgeyJ2ZXJzaW9uLWluZm8iLCAgICAgbm9fYXJndW1lbnQsIDAsICdWJ30sCisgIHsidXNlLWR5bmFtaWMiLCAgICAgIG5vX2FyZ3VtZW50LCAwLCAnRCd9LAorICB7ImhleC1kdW1wIiwgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3gnfSwKKyAgeyJkZWJ1Zy1kdW1wIiwgICAgICAgb3B0aW9uYWxfYXJndW1lbnQsIDAsICd3J30sCisjaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQorICB7Imluc3RydWN0aW9uLWR1bXAiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2knfSwKKyNlbmRpZgorCisgIHsidmVyc2lvbiIsICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAndid9LAorICB7ImhlbHAiLCAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ0gnfSwKKyAgezAsICAgICAgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsIDB9Cit9OworCitzdGF0aWMgdm9pZAordXNhZ2UgKCkKK3sKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCJVc2FnZTogcmVhZGVsZiB7b3B0aW9uc30gZWxmLWZpbGUocylcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIE9wdGlvbnMgYXJlOlxuIikpOworICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWEgb3IgLS1hbGwgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtUyAtcyAtciAtZCAtViAtLWhpc3RvZ3JhbVxuIikpOworICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWggb3IgLS1maWxlLWhlYWRlciAgICAgICBEaXNwbGF5IHRoZSBFTEYgZmlsZSBoZWFkZXJcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1sIG9yIC0tcHJvZ3JhbS1oZWFkZXJzIG9yIC0tc2VnbWVudHNcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiICAtUyBvciAtLXNlY3Rpb24taGVhZGVycyBvciAtLXNlY3Rpb25zXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHNlY3Rpb25zJyBoZWFkZXJcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1lIG9yIC0taGVhZGVycyAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVNcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1zIG9yIC0tc3ltcyBvciAtLXN5bWJvbHMgRGlzcGxheSB0aGUgc3ltYm9sIHRhYmxlXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiICAtciBvciAtLXJlbG9jcyAgICAgICAgICAgIERpc3BsYXkgdGhlIHJlbG9jYXRpb25zIChpZiBwcmVzZW50KVxuIikpOworICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiICAtViBvciAtLXZlcnNpb24taW5mbyAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gc2VjdGlvbnMgKGlmIHByZXNlbnQpXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiICAtRCBvciAtLXVzZS1keW5hbWljICAgICAgIFVzZSB0aGUgZHluYW1pYyBzZWN0aW9uIGluZm8gd2hlbiBkaXNwbGF5aW5nIHN5bWJvbHNcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC14IDxudW1iZXI+IG9yIC0taGV4LWR1bXA9PG51bWJlcj5cbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcCB0aGUgY29udGVudHMgb2Ygc2VjdGlvbiA8bnVtYmVyPlxuIikpOworICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXdbbGlhcHJdIG9yIC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXVxuIikpOworICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBEV0FSRjIgZGVidWcgc2VjdGlvbnNcbiIpKTsKKyNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCisgIGZwcmludGYgKHN0ZG91dCwgXygiICAtaSA8bnVtYmVyPiBvciAtLWluc3RydWN0aW9uLWR1bXA9PG51bWJlcj5cbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYXNzZW1ibGUgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIpKTsKKyNlbmRpZgorICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgLS1oaXN0b2dyYW0gICAgICAgICBEaXNwbGF5IGhpc3RvZ3JhbSBvZiBidWNrZXQgbGlzdCBsZW5ndGhzXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiICAtdiBvciAtLXZlcnNpb24gICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGZcbiIpKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1IIG9yIC0taGVscCAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uXG4iKSk7CisgIGZwcmludGYgKHN0ZG91dCwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7CisKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXF1ZXN0X2R1bXAgKHNlY3Rpb24sIHR5cGUpCisgICAgIHVuc2lnbmVkIGludCBzZWN0aW9uOworICAgICBjaGFyICAgICAgICAgdHlwZTsKK3sKKyAgaWYgKHNlY3Rpb24gPj0gbnVtX2R1bXBfc2VjdHMpCisgICAgeworICAgICAgY2hhciAqIG5ld19kdW1wX3NlY3RzOworCisgICAgICBuZXdfZHVtcF9zZWN0cyA9IChjaGFyICopIGNhbGxvYyAoc2VjdGlvbiArIDEsIDEpOworCisgICAgICBpZiAobmV3X2R1bXBfc2VjdHMgPT0gTlVMTCkKKwllcnJvciAoXygiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGR1bXAgcmVxdWVzdCB0YWJsZS4iKSk7CisgICAgICBlbHNlCisJeworCSAgLyogQ29weSBjdXJyZW50IGZsYWcgc2V0dGluZ3MuICAqLworCSAgbWVtY3B5IChuZXdfZHVtcF9zZWN0cywgZHVtcF9zZWN0cywgbnVtX2R1bXBfc2VjdHMpOworCisJICBmcmVlIChkdW1wX3NlY3RzKTsKKworCSAgZHVtcF9zZWN0cyA9IG5ld19kdW1wX3NlY3RzOworCSAgbnVtX2R1bXBfc2VjdHMgPSBzZWN0aW9uICsgMTsKKwl9CisgICAgfQorCisgIGlmIChkdW1wX3NlY3RzKQorICAgIGR1bXBfc2VjdHMgW3NlY3Rpb25dIHw9IHR5cGU7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfYXJncyAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiogYXJndjsKK3sKKyAgaW50IGM7CisKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHVzYWdlICgpOworCisgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nCisJICAoYXJnYywgYXJndiwgImVyc2FobGRTRHc6Ong6aTp2ViIsIG9wdGlvbnMsIE5VTEwpKSAhPSBFT0YpCisgICAgeworICAgICAgY2hhciAqICAgIGNwOworICAgICAgaW50CXNlY3Rpb247CisKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAwOgorCSAgLyogTG9uZyBvcHRpb25zLiAgKi8KKwkgIGJyZWFrOworCWNhc2UgJ0gnOgorCSAgdXNhZ2UgKCk7CisJICBicmVhazsKKworCWNhc2UgJ2EnOgorCSAgZG9fc3ltcyArKzsKKwkgIGRvX3JlbG9jICsrOworCSAgZG9fZHluYW1pYyArKzsKKwkgIGRvX2hlYWRlciArKzsKKwkgIGRvX3NlY3Rpb25zICsrOworCSAgZG9fc2VnbWVudHMgKys7CisJICBkb192ZXJzaW9uICsrOworCSAgZG9faGlzdG9ncmFtICsrOworCSAgYnJlYWs7CisJY2FzZSAnZSc6CisJICBkb19oZWFkZXIgKys7CisJICBkb19zZWN0aW9ucyArKzsKKwkgIGRvX3NlZ21lbnRzICsrOworCSAgYnJlYWs7CisJY2FzZSAnRCc6CisJICBkb191c2luZ19keW5hbWljICsrOworCSAgYnJlYWs7CisJY2FzZSAncic6CisJICBkb19yZWxvYyArKzsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgZG9faGVhZGVyICsrOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJICBkb19zZWdtZW50cyArKzsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgZG9fc3ltcyArKzsKKwkgIGJyZWFrOworCWNhc2UgJ1MnOgorCSAgZG9fc2VjdGlvbnMgKys7CisJICBicmVhazsKKwljYXNlICdkJzoKKwkgIGRvX2R5bmFtaWMgKys7CisJICBicmVhazsKKwljYXNlICd4JzoKKwkgIGRvX2R1bXAgKys7CisJICBzZWN0aW9uID0gc3RydG91bCAob3B0YXJnLCAmIGNwLCAwKTsKKwkgIGlmICghICogY3AgJiYgc2VjdGlvbiA+PSAwKQorCSAgICB7CisJICAgICAgcmVxdWVzdF9kdW1wIChzZWN0aW9uLCBIRVhfRFVNUCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gb29wczsKKwljYXNlICd3JzoKKwkgIGRvX2R1bXAgKys7CisJICBpZiAob3B0YXJnID09IDApCisJICAgIGRvX2RlYnVnZ2luZyA9IDE7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBkb19kZWJ1Z2dpbmcgPSAwOworCSAgICAgIHN3aXRjaCAob3B0YXJnWzBdKQorCQl7CisJCWNhc2UgJ2knOgorCQljYXNlICdJJzoKKwkJICBkb19kZWJ1Z19pbmZvID0gMTsKKwkJICBicmVhazsKKworCQljYXNlICdhJzoKKwkJY2FzZSAnQSc6CisJCSAgZG9fZGVidWdfYWJicmV2cyA9IDE7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnbCc6CisJCWNhc2UgJ0wnOgorCQkgIGRvX2RlYnVnX2xpbmVzID0gMTsKKwkJICBicmVhazsKKworCQljYXNlICdwJzoKKwkJY2FzZSAnUCc6CisJCSAgZG9fZGVidWdfcHVibmFtZXMgPSAxOworCQkgIGJyZWFrOworCisJCWNhc2UgJ3InOgorCQljYXNlICdSJzoKKwkJICBkb19kZWJ1Z19hcmFuZ2VzID0gMTsKKwkJICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgIHdhcm4gKF8oIlVucmVjb2duaXNlZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIiksIG9wdGFyZyk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisjaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQorCWNhc2UgJ2knOgorCSAgZG9fZHVtcCArKzsKKwkgIHNlY3Rpb24gPSBzdHJ0b3VsIChvcHRhcmcsICYgY3AsIDApOworCSAgaWYgKCEgKiBjcCAmJiBzZWN0aW9uID49IDApCisJICAgIHsKKwkgICAgICByZXF1ZXN0X2R1bXAgKHNlY3Rpb24sIERJU0FTU19EVU1QKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZ290byBvb3BzOworI2VuZGlmCisJY2FzZSAndic6CisJICBwcmludF92ZXJzaW9uIChwcm9ncmFtX25hbWUpOworCSAgYnJlYWs7CisJY2FzZSAnVic6CisJICBkb192ZXJzaW9uICsrOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwlvb3BzOgorCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgIGVycm9yIChfKCJJbnZhbGlkIG9wdGlvbiAnLSVjJ1xuIiksIGMpOworCSAgLyogRHJvcCB0aHJvdWdoLiAgKi8KKwljYXNlICc/JzoKKwkgIHVzYWdlICgpOworCX0KKyAgICB9CisKKyAgaWYgKCFkb19keW5hbWljICYmICFkb19zeW1zICYmICFkb19yZWxvYyAmJiAhZG9fc2VjdGlvbnMKKyAgICAgICYmICFkb19zZWdtZW50cyAmJiAhZG9faGVhZGVyICYmICFkb19kdW1wICYmICFkb192ZXJzaW9uCisgICAgICAmJiAhZG9faGlzdG9ncmFtICYmICFkb19kZWJ1Z2dpbmcpCisgICAgdXNhZ2UgKCk7CisgIGVsc2UgaWYgKGFyZ2MgPCAzKQorICAgIHsKKyAgICAgIHdhcm4gKF8oIk5vdGhpbmcgdG8gZG8uXG4iKSk7CisgICAgICB1c2FnZSgpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X2VsZl9jbGFzcyAoZWxmX2NsYXNzKQorICAgICB1bnNpZ25lZCBjaGFyIGVsZl9jbGFzczsKK3sKKyAgc3dpdGNoIChlbGZfY2xhc3MpCisgICAgeworICAgIGNhc2UgRUxGQ0xBU1NOT05FOiByZXR1cm4gXygibm9uZSIpOworICAgIGNhc2UgRUxGQ0xBU1MzMjogICByZXR1cm4gXygiRUxGMzIiKTsKKyAgICBjYXNlIEVMRkNMQVNTNjQ6ICAgcmV0dXJuIF8oIkVMRjY0Iik7CisgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiBfKCI8dW5rbm93bj4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9kYXRhX2VuY29kaW5nIChlbmNvZGluZykKKyAgICAgdW5zaWduZWQgY2hhciBlbmNvZGluZzsKK3sKKyAgc3dpdGNoIChlbmNvZGluZykKKyAgICB7CisgICAgY2FzZSBFTEZEQVRBTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKKyAgICBjYXNlIEVMRkRBVEEyTFNCOiByZXR1cm4gXygiMidzIGNvbXBpbG1lbnQsIGxpdHRsZSBlbmRpYW4iKTsKKyAgICBjYXNlIEVMRkRBVEEyTVNCOiByZXR1cm4gXygiMidzIGNvbXBpbG1lbnQsIGJpZyBlbmRpYW4iKTsKKyAgICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gXygiPHVua25vd24+Iik7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfb3NhYmlfbmFtZSAob3NhYmkpCisgICAgIHVuc2lnbmVkIGNoYXIgb3NhYmk7Cit7CisgIHN3aXRjaCAob3NhYmkpCisgICAgeworICAgIGNhc2UgRUxGT1NBQklfU1lTVjogICAgICAgcmV0dXJuIF8oIlVOSVggLSBTeXN0ZW0gViIpOworICAgIGNhc2UgRUxGT1NBQklfSFBVWDogICAgICAgcmV0dXJuIF8oIlVOSVggLSBIUC1VWCIpOworICAgIGNhc2UgRUxGT1NBQklfU1RBTkRBTE9ORTogcmV0dXJuIF8oIlN0YW5kYWxvbmUgQXBwIik7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gXygiPHVua25vd24+Iik7CisgICAgfQorfQorCisvKiBEZWNvZGUgdGhlIGRhdGEgaGVsZCBpbiAnZWxmX2hlYWRlcicuICAqLworc3RhdGljIGludAorcHJvY2Vzc19maWxlX2hlYWRlciAoKQoreworICBpZiAoICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcwXSAhPSBFTEZNQUcwCisgICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzFdICE9IEVMRk1BRzEKKyAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMl0gIT0gRUxGTUFHMgorICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUczXSAhPSBFTEZNQUczKQorICAgIHsKKyAgICAgIGVycm9yCisJKF8oIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGRvX2hlYWRlcikKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgcHJpbnRmIChfKCJFTEYgSGVhZGVyOlxuIikpOworICAgICAgcHJpbnRmIChfKCIgIE1hZ2ljOiAgICIpKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7IGkgKyspCisJcHJpbnRmICgiJTIuMnggIiwgZWxmX2hlYWRlci5lX2lkZW50IFtpXSk7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmIChfKCIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAorCSAgICAgIGdldF9lbGZfY2xhc3MgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQ0xBU1NdKSk7CisgICAgICBwcmludGYgKF8oIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCisJICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfREFUQV0pKTsKKyAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iKSwKKwkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dLAorCSAgICAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfVkVSU0lPTl0gPT0gRVZfQ1VSUkVOVCA/ICIoY3VycmVudCkiIDoKKwkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dICE9IEVWX05PTkUgPyAiPHVua25vd24+IiA6ICIiKTsKKyAgICAgIHByaW50ZiAoXygiICBPUy9BQkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKKwkgICAgICBnZXRfb3NhYmlfbmFtZSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9PU0FCSV0pKTsKKyAgICAgIHByaW50ZiAoXygiICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICVkXG4iKSwKKwkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0FCSVZFUlNJT05dKTsKKyAgICAgIHByaW50ZiAoXygiICBUeXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKKwkgICAgICBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOworICAgICAgcHJpbnRmIChfKCIgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAorCSAgICAgIGdldF9tYWNoaW5lX25hbWUgKGVsZl9oZWFkZXIuZV9tYWNoaW5lKSk7CisgICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseFxuIiksCisJICAgICAgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV92ZXJzaW9uKTsKKyAgICAgIHByaW50ZiAoXygiICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVzXG4iKSwKKwkgICAgICBnZXRfbWFjaGluZV9kYXRhIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0RBVEFdKSk7CisgICAgICBwcmludGYgKF8oIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweCVseFxuIiksCisJICAgICAgKHVuc2lnbmVkIGxvbmcpIGVsZl9oZWFkZXIuZV9lbnRyeSk7CisgICAgICBwcmludGYgKF8oIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlbGQgKGJ5dGVzIGludG8gZmlsZSlcbiIpLAorCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfcGhvZmYpOworICAgICAgcHJpbnRmIChfKCIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iKSwKKwkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Nob2ZmKTsKKyAgICAgIHByaW50ZiAoXygiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIpLAorCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZmxhZ3MsCisJICAgICAgZ2V0X21hY2hpbmVfZmxhZ3MgKGVsZl9oZWFkZXIuZV9mbGFncywgZWxmX2hlYWRlci5lX21hY2hpbmUpKTsKKyAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIHRoaXMgaGVhZGVyOiAgICAgICAgICAgICAgICVsZCAoYnl0ZXMpXG4iKSwKKwkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX2Voc2l6ZSk7CisgICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCisJICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9waGVudHNpemUpOworICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iKSwKKwkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3BobnVtKTsKKyAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iKSwKKwkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSk7CisgICAgICBwcmludGYgKF8oIiAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAlbGRcbiIpLAorCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfc2hudW0pOworICAgICAgcHJpbnRmIChfKCIgIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleDogJWxkXG4iKSwKKwkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Noc3RybmR4KTsKKyAgICB9CisKKyAgLyogVGVzdCBjbGFzcyBhZnRlciBkdW1waW5nIGhlYWRlciBzbyB0aGF0IGF0IGxlYXN0IHRoZSBoZWFkZXIgY2FuIGJlCisgICAgIGRpc3BsYXkgb24gNjQgYml0IGJpbmFyaWVzLiAgKi8KKyAgCisgIGJpbmFyeV9jbGFzcyA9IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQ0xBU1NdOworICBpZiAoYmluYXJ5X2NsYXNzICE9IEVMRkNMQVNTMzIpCisgICAgeworICAgICAgZXJyb3IgKF8oIk5vdCBhIDMyIGJpdCBFTEYgZmlsZVxuIikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgRWxmMzJfRXh0ZXJuYWxfUGhkciAqIHBoZHJzOworICBFbGYzMl9JbnRlcm5hbF9QaGRyICogcHJvZ3JhbV9oZWFkZXJzOworICBFbGYzMl9JbnRlcm5hbF9QaGRyICogc2VnbWVudDsKKyAgdW5zaWduZWQgaW50CSAgICAgICAgaTsKKworICBpZiAoZWxmX2hlYWRlci5lX3BobnVtID09IDApCisgICAgeworICAgICAgaWYgKGRvX3NlZ21lbnRzKQorCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gcHJvZ3JhbSBoZWFkZXJzIGluIHRoaXMgZmlsZS5cbiIpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlcikKKyAgICB7CisgICAgICBwcmludGYgKF8oIlxuRWxmIGZpbGUgaXMgJXNcbiIpLCBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOworICAgICAgcHJpbnRmIChfKCJFbnRyeSBwb2ludCAweCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOworICAgICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIiksCisJICAgICAgZWxmX2hlYWRlci5lX3BobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKKyAgICB9CisKKyAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKKwkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAorCQkgIHBoZHJzLCBFbGYzMl9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKKworICBwcm9ncmFtX2hlYWRlcnMgPSAoRWxmMzJfSW50ZXJuYWxfUGhkciAqKSBtYWxsb2MKKyAgICAoZWxmX2hlYWRlci5lX3BobnVtICogc2l6ZW9mIChFbGYzMl9JbnRlcm5hbF9QaGRyKSk7CisKKyAgaWYgKHByb2dyYW1faGVhZGVycyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZm9yIChpID0gMCwgc2VnbWVudCA9IHByb2dyYW1faGVhZGVyczsKKyAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOworICAgICAgIGkgKyssIHNlZ21lbnQgKyspCisgICAgeworICAgICAgc2VnbWVudC0+cF90eXBlICAgPSBCWVRFX0dFVCAocGhkcnNbaV0ucF90eXBlKTsKKyAgICAgIHNlZ21lbnQtPnBfb2Zmc2V0ID0gQllURV9HRVQgKHBoZHJzW2ldLnBfb2Zmc2V0KTsKKyAgICAgIHNlZ21lbnQtPnBfdmFkZHIgID0gQllURV9HRVQgKHBoZHJzW2ldLnBfdmFkZHIpOworICAgICAgc2VnbWVudC0+cF9wYWRkciAgPSBCWVRFX0dFVCAocGhkcnNbaV0ucF9wYWRkcik7CisgICAgICBzZWdtZW50LT5wX2ZpbGVzeiA9IEJZVEVfR0VUIChwaGRyc1tpXS5wX2ZpbGVzeik7CisgICAgICBzZWdtZW50LT5wX21lbXN6ICA9IEJZVEVfR0VUIChwaGRyc1tpXS5wX21lbXN6KTsKKyAgICAgIHNlZ21lbnQtPnBfZmxhZ3MgID0gQllURV9HRVQgKHBoZHJzW2ldLnBfZmxhZ3MpOworICAgICAgc2VnbWVudC0+cF9hbGlnbiAgPSBCWVRFX0dFVCAocGhkcnNbaV0ucF9hbGlnbik7CisgICAgfQorCisgIGZyZWUgKHBoZHJzKTsKKworICBpZiAoZG9fc2VnbWVudHMpCisgICAgeworICAgICAgcHJpbnRmCisJKF8oIlxuUHJvZ3JhbSBIZWFkZXIlczpcbiIpLCBlbGZfaGVhZGVyLmVfcGhudW0gPiAxID8gInMiIDogIiIpOworICAgICAgcHJpbnRmCisJKF8oIiAgVHlwZSAgICAgICAgT2Zmc2V0ICAgVmlydEFkZHIgICBQaHlzQWRkciAgIEZpbGVTaXogTWVtU2l6ICBGbGcgQWxpZ25cbiIpKTsKKyAgICB9CisKKyAgbG9hZGFkZHIgPSAtMTsKKyAgZHluYW1pY19hZGRyID0gMDsKKworICBmb3IgKGkgPSAwLCBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzOworICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfcGhudW07CisgICAgICAgaSArKywgc2VnbWVudCArKykKKyAgICB7CisgICAgICBpZiAoZG9fc2VnbWVudHMpCisJeworCSAgcHJpbnRmICgiICAlLTExLjExcyAiLCBnZXRfc2VnbWVudF90eXBlIChzZWdtZW50LT5wX3R5cGUpKTsKKwkgIHByaW50ZiAoIjB4JTYuNmx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX29mZnNldCk7CisJICBwcmludGYgKCIweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF92YWRkcik7CisJICBwcmludGYgKCIweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9wYWRkcik7CisJICBwcmludGYgKCIweCU1LjVseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9maWxlc3opOworCSAgcHJpbnRmICgiMHglNS41bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfbWVtc3opOworCSAgcHJpbnRmICgiJWMlYyVjICIsCisJCSAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9SID8gJ1InIDogJyAnKSwKKwkJICAoc2VnbWVudC0+cF9mbGFncyAmIFBGX1cgPyAnVycgOiAnICcpLAorCQkgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfWCA/ICdFJyA6ICcgJykpOworCSAgcHJpbnRmICgiJSNseCIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX2FsaWduKTsKKwl9CisKKyAgICAgIHN3aXRjaCAoc2VnbWVudC0+cF90eXBlKQorCXsKKwljYXNlIFBUX0xPQUQ6CisJICBpZiAobG9hZGFkZHIgPT0gLTEpCisJICAgIGxvYWRhZGRyID0gKHNlZ21lbnQtPnBfdmFkZHIgJiAweGZmZmZmMDAwKQorCSAgICAgIC0gKHNlZ21lbnQtPnBfb2Zmc2V0ICYgMHhmZmZmZjAwMCk7CisJICBicmVhazsKKworCWNhc2UgUFRfRFlOQU1JQzoKKwkgIGlmIChkeW5hbWljX2FkZHIpCisJICAgIGVycm9yIChfKCJtb3JlIHRoYW4gb25lIGR5bmFtaWMgc2VnbWVudFxuIikpOworCisJICBkeW5hbWljX2FkZHIgPSBzZWdtZW50LT5wX29mZnNldDsKKwkgIGR5bmFtaWNfc2l6ZSA9IHNlZ21lbnQtPnBfZmlsZXN6OworCSAgYnJlYWs7CisKKwljYXNlIFBUX0lOVEVSUDoKKwkgIGlmIChmc2VlayAoZmlsZSwgc2VnbWVudC0+cF9vZmZzZXQsIFNFRUtfU0VUKSkKKwkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIikpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJvZ3JhbV9pbnRlcnByZXRlclswXSA9IDA7CisJICAgICAgZnNjYW5mIChmaWxlLCAiJTYzcyIsIHByb2dyYW1faW50ZXJwcmV0ZXIpOworCisJICAgICAgaWYgKGRvX3NlZ21lbnRzKQorCQlwcmludGYgKF8oIlxuICAgICAgW1JlcXVlc3RpbmcgcHJvZ3JhbSBpbnRlcnByZXRlcjogJXNdIiksCisJCSAgICBwcm9ncmFtX2ludGVycHJldGVyKTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoZG9fc2VnbWVudHMpCisJcHV0YyAoJ1xuJywgc3Rkb3V0KTsKKyAgICB9CisKKyAgaWYgKGxvYWRhZGRyID09IC0xKQorICAgIHsKKyAgICAgIC8qIFZlcnkgc3RyYW5nZS4gKi8KKyAgICAgIGxvYWRhZGRyID0gMDsKKyAgICB9CisKKyAgaWYgKGRvX3NlZ21lbnRzICYmIHNlY3Rpb25faGVhZGVycyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiXG4gU2VjdGlvbiB0byBTZWdtZW50IG1hcHBpbmc6XG4iKSk7CisgICAgICBwcmludGYgKF8oIiAgU2VnbWVudCBTZWN0aW9ucy4uLlxuIikpOworCisgICAgICBhc3NlcnQgKHN0cmluZ190YWJsZSAhPSBOVUxMKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsgaSsrKQorCXsKKwkgIGludCAgICAgICAgajsKKwkgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOworCisJICBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzICsgaTsKKwkgIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7CisKKwkgIHByaW50ZiAoIiAgICUyLjJkICAgICAiLCBpKTsKKworCSAgZm9yIChqID0gMDsgaiA8IGVsZl9oZWFkZXIuZV9zaG51bTsgaisrLCBzZWN0aW9uICsrKQorCSAgICB7CisJICAgICAgaWYgKHNlY3Rpb24tPnNoX3NpemUgPiAwCisJCSAgLyogQ29tcGFyZSBhbGxvY2F0ZWQgc2VjdGlvbnMgYnkgVk1BLCB1bmFsbG9jYXRlZAorCQkgICAgIHNlY3Rpb25zIGJ5IGZpbGUgb2Zmc2V0LiAgKi8KKwkJICAmJiAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MKKwkJICAgICAgPyAoc2VjdGlvbi0+c2hfYWRkciA+PSBzZWdtZW50LT5wX3ZhZGRyCisJCQkgJiYgc2VjdGlvbi0+c2hfYWRkciArIHNlY3Rpb24tPnNoX3NpemUKKwkJCSA8PSBzZWdtZW50LT5wX3ZhZGRyICsgc2VnbWVudC0+cF9tZW1zeikKKwkJICAgICAgOiAoc2VjdGlvbi0+c2hfb2Zmc2V0ID49IHNlZ21lbnQtPnBfb2Zmc2V0CisJCQkgJiYgKHNlY3Rpb24tPnNoX29mZnNldCArIHNlY3Rpb24tPnNoX3NpemUKKwkJCSAgICAgPD0gc2VnbWVudC0+cF9vZmZzZXQgKyBzZWdtZW50LT5wX2ZpbGVzeikpKSkKKwkJcHJpbnRmICgiJXMgIiwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7CisJICAgIH0KKworCSAgcHV0YyAoJ1xuJyxzdGRvdXQpOworCX0KKyAgICB9CisKKyAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKKworICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50CitnZXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgRWxmMzJfRXh0ZXJuYWxfU2hkciAqIHNoZHJzOworICBFbGYzMl9JbnRlcm5hbF9TaGRyICogaW50ZXJuYWw7CisgIHVuc2lnbmVkIGludCAgICAgICAgICBpOworCisgIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfc2hvZmYsCisJCSAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9zaG51bSwKKwkJICBzaGRycywgRWxmMzJfRXh0ZXJuYWxfU2hkciAqLCAic2VjdGlvbiBoZWFkZXJzIik7CisKKyAgc2VjdGlvbl9oZWFkZXJzID0gKEVsZjMyX0ludGVybmFsX1NoZHIgKikgbWFsbG9jCisgICAgKGVsZl9oZWFkZXIuZV9zaG51bSAqIHNpemVvZiAoRWxmMzJfSW50ZXJuYWxfU2hkcikpOworCisgIGlmIChzZWN0aW9uX2hlYWRlcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGZvciAoaSA9IDAsIGludGVybmFsID0gc2VjdGlvbl9oZWFkZXJzOworICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07CisgICAgICAgaSArKywgaW50ZXJuYWwgKyspCisgICAgeworICAgICAgaW50ZXJuYWwtPnNoX25hbWUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9uYW1lKTsKKyAgICAgIGludGVybmFsLT5zaF90eXBlICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfdHlwZSk7CisgICAgICBpbnRlcm5hbC0+c2hfZmxhZ3MgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2ZsYWdzKTsKKyAgICAgIGludGVybmFsLT5zaF9hZGRyICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfYWRkcik7CisgICAgICBpbnRlcm5hbC0+c2hfb2Zmc2V0ICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX29mZnNldCk7CisgICAgICBpbnRlcm5hbC0+c2hfc2l6ZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX3NpemUpOworICAgICAgaW50ZXJuYWwtPnNoX2xpbmsgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9saW5rKTsKKyAgICAgIGludGVybmFsLT5zaF9pbmZvICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfaW5mbyk7CisgICAgICBpbnRlcm5hbC0+c2hfYWRkcmFsaWduID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2FkZHJhbGlnbik7CisgICAgICBpbnRlcm5hbC0+c2hfZW50c2l6ZSAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2VudHNpemUpOworICAgIH0KKworICBmcmVlIChzaGRycyk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBFbGZfSW50ZXJuYWxfU3ltICoKK2dldF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBudW1iZXIpCisgICAgIEZJTEUgKiBmaWxlOworICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICAgdW5zaWduZWQgbG9uZyBudW1iZXI7Cit7CisgIEVsZjMyX0V4dGVybmFsX1N5bSAqIGVzeW1zOworICBFbGZfSW50ZXJuYWxfU3ltICogICBpc3ltczsKKyAgRWxmX0ludGVybmFsX1N5bSAqICAgcHN5bTsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgajsKKworICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBudW1iZXIgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCisJCSAgZXN5bXMsIEVsZjMyX0V4dGVybmFsX1N5bSAqLCAic3ltYm9scyIpOworCisgIGlzeW1zID0gKEVsZl9JbnRlcm5hbF9TeW0gKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKKworICBpZiAoaXN5bXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOworICAgICAgZnJlZSAoZXN5bXMpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgZm9yIChqID0gMCwgcHN5bSA9IGlzeW1zOworICAgICAgIGogPCBudW1iZXI7CisgICAgICAgaiArKywgcHN5bSArKykKKyAgICB7CisgICAgICBwc3ltLT5zdF9uYW1lICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9uYW1lKTsKKyAgICAgIHBzeW0tPnN0X3ZhbHVlID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3ZhbHVlKTsKKyAgICAgIHBzeW0tPnN0X3NpemUgID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NpemUpOworICAgICAgcHN5bS0+c3Rfc2huZHggPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfc2huZHgpOworICAgICAgcHN5bS0+c3RfaW5mbyAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfaW5mbyk7CisgICAgICBwc3ltLT5zdF9vdGhlciA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9vdGhlcik7CisgICAgfQorCisgIGZyZWUgKGVzeW1zKTsKKworICByZXR1cm4gaXN5bXM7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247CisgIGludCAgICAgICAgaTsKKworICBzZWN0aW9uX2hlYWRlcnMgPSBOVUxMOworCisgIGlmIChlbGZfaGVhZGVyLmVfc2hudW0gPT0gMCkKKyAgICB7CisgICAgICBpZiAoZG9fc2VjdGlvbnMpCisJcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBzZWN0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoZG9fc2VjdGlvbnMgJiYgIWRvX2hlYWRlcikKKyAgICBwcmludGYgKF8oIlRoZXJlIGFyZSAlZCBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAlbHg6XG4iKSwKKwkgICAgZWxmX2hlYWRlci5lX3NobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Nob2ZmKTsKKworICBpZiAoISBnZXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBSZWFkIGluIHRoZSBzdHJpbmcgdGFibGUsIHNvIHRoYXQgd2UgaGF2ZSBuYW1lcyB0byBkaXNwbGF5LiAgKi8KKyAgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVycyArIGVsZl9oZWFkZXIuZV9zaHN0cm5keDsKKworICBpZiAoc2VjdGlvbi0+c2hfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3RhYmxlX29mZnNldDsKKworICAgICAgc3RyaW5nX3RhYmxlX29mZnNldCA9IHNlY3Rpb24tPnNoX29mZnNldDsKKworICAgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKKwkJICAgICAgc3RyaW5nX3RhYmxlLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKKyAgICB9CisKKyAgLyogU2NhbiB0aGUgc2VjdGlvbnMgZm9yIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQorICAgICBhbmQgZHluYW1pYyBzdHJpbmcgdGFibGUgYW5kIGRlYnVnIHNlY3Rpb25zLiAqLworICBkeW5hbWljX3N5bWJvbHMgPSBOVUxMOworICBkeW5hbWljX3N0cmluZ3MgPSBOVUxMOworICBkeW5hbWljX3N5bWluZm8gPSBOVUxMOworICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOworICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07CisgICAgICAgaSArKywgc2VjdGlvbiArKykKKyAgICB7CisgICAgICBjaGFyICogbmFtZSA9IFNFQ1RJT05fTkFNRSAoc2VjdGlvbik7CisKKyAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0pCisJeworCSAgaWYgKGR5bmFtaWNfc3ltYm9scyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZXJyb3IgKF8oIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzeW1ib2wgdGFibGVzXG4iKSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgZHluYW1pY19zeW1ib2xzID0gZ2V0X2VsZl9zeW1ib2xzCisJICAgIChmaWxlLCBzZWN0aW9uLT5zaF9vZmZzZXQsCisJICAgICBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSk7CisJfQorICAgICAgZWxzZSBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfU1RSVEFCCisJICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5keW5zdHIiKSA9PSAwKQorCXsKKwkgIGlmIChkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGVycm9yIChfKCJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3RyaW5nIHRhYmxlc1xuIikpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCisJCQkgIGR5bmFtaWNfc3RyaW5ncywgY2hhciAqLCAiZHluYW1pYyBzdHJpbmdzIik7CisJfQorICAgICAgZWxzZSBpZiAoKGRvX2RlYnVnZ2luZyB8fCBkb19kZWJ1Z19pbmZvIHx8IGRvX2RlYnVnX2FiYnJldnMKKwkJfHwgZG9fZGVidWdfbGluZXMgfHwgZG9fZGVidWdfcHVibmFtZXMgfHwgZG9fZGVidWdfYXJhbmdlcykKKwkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5kZWJ1Z18iLCA3KSA9PSAwKQorCXsKKwkgIG5hbWUgKz0gNzsKKworCSAgaWYgKGRvX2RlYnVnZ2luZworCSAgICAgIHx8IChkb19kZWJ1Z19pbmZvICAgICAmJiAoc3RyY21wIChuYW1lLCAiaW5mbyIpID09IDApKQorCSAgICAgIHx8IChkb19kZWJ1Z19hYmJyZXZzICAmJiAoc3RyY21wIChuYW1lLCAiYWJicmV2IikgPT0gMCkpCisJICAgICAgfHwgKGRvX2RlYnVnX2xpbmVzICAgICYmIChzdHJjbXAgKG5hbWUsICJsaW5lIikgPT0gMCkpCisJICAgICAgfHwgKGRvX2RlYnVnX3B1Ym5hbWVzICYmIChzdHJjbXAgKG5hbWUsICJwdWJuYW1lcyIpID09IDApKQorCSAgICAgIHx8IChkb19kZWJ1Z19hcmFuZ2VzICAmJiAoc3RyY21wIChuYW1lLCAiYXJhbmdlcyIpID09IDApKQorCSAgICAgICkKKwkgICAgcmVxdWVzdF9kdW1wIChpLCBERUJVR19EVU1QKTsKKwl9CisgICAgfQorCisgIGlmICghIGRvX3NlY3Rpb25zKQorICAgIHJldHVybiAxOworCisgIHByaW50ZiAoXygiXG5TZWN0aW9uIEhlYWRlciVzOlxuIiksIGVsZl9oZWFkZXIuZV9zaG51bSA+IDEgPyAicyIgOiAiIik7CisgIHByaW50ZgorICAgIChfKCIgIFtOcl0gTmFtZSAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxnIExrIEluZiBBbFxuIikpOworCisgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7CisgICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKKyAgICAgICBpICsrLCBzZWN0aW9uICsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgWyUyZF0gJS0xNy4xN3MgJS0xNS4xNXMgIiwKKwkgICAgICBpLAorCSAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksCisJICAgICAgZ2V0X3NlY3Rpb25fdHlwZV9uYW1lIChzZWN0aW9uLT5zaF90eXBlKSk7CisKKyAgICAgIHByaW50ZiAoICIlOC44bHggJTYuNmx4ICU2LjZseCAlMi4ybHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfYWRkciwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX3NpemUsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9lbnRzaXplKTsKKworICAgICAgcHJpbnRmICgiICVjJWMlYyAlMmxkICUzbHggJWxkXG4iLAorCSAgICAgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9XUklURSA/ICdXJyA6ICcgJyksCisJICAgICAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX0FMTE9DID8gJ0EnIDogJyAnKSwKKwkgICAgICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSID8gJ1gnIDogJyAnKSwKKwkgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfbGluaywKKwkgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfaW5mbywKKwkgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfYWRkcmFsaWduKTsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFByb2Nlc3MgdGhlIHJlbG9jIHNlY3Rpb24uICAqLworc3RhdGljIGludAorcHJvY2Vzc19yZWxvY3MgKGZpbGUpCisgICAgIEZJTEUgKiBmaWxlOworeworICB1bnNpZ25lZCBsb25nICAgIHJlbF9zaXplOworICB1bnNpZ25lZCBsb25nCSAgIHJlbF9vZmZzZXQ7CisKKworICBpZiAoIWRvX3JlbG9jKQorICAgIHJldHVybiAxOworCisgIGlmIChkb191c2luZ19keW5hbWljKQorICAgIHsKKyAgICAgIHJlbF9zaXplICAgPSAwOworICAgICAgcmVsX29mZnNldCA9IDA7CisKKyAgICAgIGlmIChkeW5hbWljX2luZm9bRFRfUkVMXSkKKwl7CisJICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX1JFTF07CisJICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1JFTFNaXTsKKwl9CisgICAgICBlbHNlIGlmIChkeW5hbWljX2luZm8gW0RUX1JFTEFdKQorCXsKKwkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfUkVMQV07CisJICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1JFTEFTWl07CisJfQorICAgICAgZWxzZSBpZiAoZHluYW1pY19pbmZvW0RUX0pNUFJFTF0pCisJeworCSAgcmVsX29mZnNldCA9IGR5bmFtaWNfaW5mb1tEVF9KTVBSRUxdOworCSAgcmVsX3NpemUgICA9IGR5bmFtaWNfaW5mb1tEVF9QTFRSRUxTWl07CisJfQorCisgICAgICBpZiAocmVsX3NpemUpCisJeworCSAgcHJpbnRmCisJICAgIChfKCJcblJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIiksCisJICAgICByZWxfb2Zmc2V0LCByZWxfc2l6ZSk7CisKKwkgIGR1bXBfcmVsb2NhdGlvbnMgKGZpbGUsIHJlbF9vZmZzZXQgLSBsb2FkYWRkciwgcmVsX3NpemUsCisJCQkgICAgZHluYW1pY19zeW1ib2xzLCBkeW5hbWljX3N0cmluZ3MpOworCX0KKyAgICAgIGVsc2UKKwlwcmludGYgKF8oIlxuVGhlcmUgYXJlIG5vIGR5bmFtaWMgcmVsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgCQlpOworICAgICAgaW50ICAgICAgICAgICAJCWZvdW5kID0gMDsKKworICAgICAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKKwkgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOworCSAgIGkrKywgc2VjdGlvbiArKykKKwl7CisJICBpZiAoICAgc2VjdGlvbi0+c2hfdHlwZSAhPSBTSFRfUkVMQQorCSAgICAgICYmIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1JFTCkKKwkgICAgY29udGludWU7CisKKwkgIHJlbF9vZmZzZXQgPSBzZWN0aW9uLT5zaF9vZmZzZXQ7CisJICByZWxfc2l6ZSAgID0gc2VjdGlvbi0+c2hfc2l6ZTsKKworCSAgaWYgKHJlbF9zaXplKQorCSAgICB7CisJICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN0cnNlYzsKKwkgICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc3ltc2VjOworCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBzeW10YWI7CisJICAgICAgY2hhciAqICAgICAgICAgICAgICAgIHN0cnRhYjsKKworCSAgICAgIHByaW50ZiAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gIikpOworCisJICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQorCQlwcmludGYgKCIlZCIsIHNlY3Rpb24tPnNoX25hbWUpOworCSAgICAgIGVsc2UKKwkJcHJpbnRmICgiJyVzJyIsIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOworCisJICAgICAgcHJpbnRmIChfKCIgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIiksCisJCSByZWxfb2Zmc2V0LCAodW5zaWduZWQgbG9uZykgKHJlbF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSkpOworCisJICAgICAgc3ltc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluazsKKworCSAgICAgIHN5bXRhYiA9IGdldF9lbGZfc3ltYm9scyAoZmlsZSwgc3ltc2VjLT5zaF9vZmZzZXQsCisJCQkJCXN5bXNlYy0+c2hfc2l6ZSAvIHN5bXNlYy0+c2hfZW50c2l6ZSk7CisKKwkgICAgICBpZiAoc3ltdGFiID09IE5VTEwpCisJCWNvbnRpbnVlOworCisJICAgICAgc3Ryc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc3ltc2VjLT5zaF9saW5rOworCisJICAgICAgR0VUX0RBVEFfQUxMT0MgKHN0cnNlYy0+c2hfb2Zmc2V0LCBzdHJzZWMtPnNoX3NpemUsIHN0cnRhYiwKKwkJCSAgICAgIGNoYXIgKiwgInN0cmluZyB0YWJsZSIpOworCisJICAgICAgZHVtcF9yZWxvY2F0aW9ucyAoZmlsZSwgcmVsX29mZnNldCwgcmVsX3NpemUsIHN5bXRhYiwgc3RydGFiKTsKKworCSAgICAgIGZyZWUgKHN0cnRhYik7CisJICAgICAgZnJlZSAoc3ltdGFiKTsKKworCSAgICAgIGZvdW5kID0gMTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgZm91bmQpCisJcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkCitkeW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KQorICAgICBFbGZfSW50ZXJuYWxfRHluICogZW50cnk7Cit7CisgIHN3aXRjaCAoZW50cnktPmRfdGFnKQorICAgIHsKKyAgICBjYXNlIERUX01JUFNfRkxBR1M6CisgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKKwlwcmludGYgKCJOT05FXG4iKTsKKyAgICAgIGVsc2UKKwl7CisJICBzdGF0aWMgY29uc3QgY2hhciAqIG9wdHNbXSA9CisJICB7CisJICAgICJRVUlDS1NUQVJUIiwgIk5PVFBPVCIsICJOT19MSUJSQVJZX1JFUExBQ0VNRU5UIiwKKwkgICAgIk5PX01PVkUiLCAiU0dJX09OTFkiLCAiR1VBUkFOVEVFX0lOSVQiLCAiREVMVEFfQ19QTFVTX1BMVVMiLAorCSAgICAiR1VBUkFOVEVFX1NUQVJUX0lOSVQiLCAiUElYSUUiLCAiREVGQVVMVF9ERUxBWV9MT0FEIiwKKwkgICAgIlJFUVVJQ0tTVEFSVCIsICJSRVFVSUNLU1RBUlRFRCIsICJDT1JEIiwgIk5PX1VOUkVTX1VOREVGIiwKKwkgICAgIlJMRF9PUkRFUl9TQUZFIgorCSAgfTsKKwkgIHVuc2lnbmVkIGludCBjbnQ7CisJICBpbnQgZmlyc3QgPSAxOworCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fRUxFTSAob3B0cyk7ICsrIGNudCkKKwkgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsICYgKDEgPDwgY250KSkKKwkgICAgICB7CisJCXByaW50ZiAoIiVzJXMiLCBmaXJzdCA/ICIiIDogIiAiLCBvcHRzW2NudF0pOworCQlmaXJzdCA9IDA7CisJICAgICAgfQorCSAgcHV0cyAoIiIpOworCX0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgorICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQorCXByaW50ZiAoIkludGVyZmFjZSBWZXJzaW9uOiAlc1xuIiwKKwkJZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOworICAgICAgZWxzZQorCXByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6CisgICAgICB7CisJY2hhciB0aW1lYnVmWzIwXTsKKwl0aW1lX3QgdGltZSA9IGVudHJ5LT5kX3VuLmRfdmFsOworCXN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOworCXByaW50ZiAoIlRpbWUgU3RhbXA6ICVzXG4iLCB0aW1lYnVmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgorICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKKyAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKKyAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgorICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKKyAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKKyAgICBjYXNlIERUX01JUFNfSElQQUdFTk86CisgICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POgorICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzoKKyAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86CisgICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzoKKyAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86CisgICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRToKKyAgICAgIHByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7CisgICAgfQorfQorCisvKiBQYXJzZSB0aGUgZHluYW1pYyBzZWdtZW50ICovCitzdGF0aWMgaW50Citwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKKyAgICAgRklMRSAqIGZpbGU7Cit7CisgIEVsZl9JbnRlcm5hbF9EeW4gKiAgICBlbnRyeTsKKyAgRWxmMzJfRXh0ZXJuYWxfRHluICogIGVkeW47CisgIHVuc2lnbmVkIGludCBpOworCisgIGlmIChkeW5hbWljX3NpemUgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZG9fZHluYW1pYykKKwlwcmludGYgKF8oIlxuVGhlcmUgaXMgbm8gZHluYW1pYyBzZWdtZW50IGluIHRoaXMgZmlsZS5cbiIpKTsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIEdFVF9EQVRBX0FMTE9DIChkeW5hbWljX2FkZHIsIGR5bmFtaWNfc2l6ZSwKKwkJICBlZHluLCBFbGYzMl9FeHRlcm5hbF9EeW4gKiwgImR5bmFtaWMgc2VnbWVudCIpOworICAKKyAgLyogU0dJJ3MgRUxGIGhhcyBtb3JlIHRoYW4gb25lIHNlY3Rpb24gaW4gdGhlIERZTkFNSUMgc2VnbWVudC4gIERldGVybWluZQorICAgICBob3cgbGFyZ2UgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKKyAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCisgIGR5bmFtaWNfc2l6ZSA9IDA7CisgIHdoaWxlICgqKEVsZjMyX1dvcmQgKikgZWR5bltkeW5hbWljX3NpemUrK10uZF90YWcgIT0gRFRfTlVMTCkKKyAgICA7CisKKyAgZHluYW1pY19zZWdtZW50ID0gKEVsZl9JbnRlcm5hbF9EeW4gKikKKyAgICBtYWxsb2MgKGR5bmFtaWNfc2l6ZSAqIHNpemVvZiAoRWxmX0ludGVybmFsX0R5bikpOworCisgIGlmIChkeW5hbWljX3NlZ21lbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOworICAgICAgZnJlZSAoZWR5bik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7CisgICAgICAgaSA8IGR5bmFtaWNfc2l6ZTsKKyAgICAgICBpICsrLCBlbnRyeSArKykKKyAgICB7CisgICAgICBlbnRyeS0+ZF90YWcgICAgICA9IEJZVEVfR0VUIChlZHluIFtpXS5kX3RhZyk7CisgICAgICBlbnRyeS0+ZF91bi5kX3ZhbCA9IEJZVEVfR0VUIChlZHluIFtpXS5kX3VuLmRfdmFsKTsKKyAgICB9CisKKyAgZnJlZSAoZWR5bik7CisKKyAgLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OworCSAgIGkgPCBkeW5hbWljX3NpemU7CisJICAgKytpLCArKyBlbnRyeSkKKwl7CisJICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7CisJICBsb25nICAgICAgICAgICAgICAgICBudW1fc3ltczsKKworCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TWU1UQUIpCisJICAgIGNvbnRpbnVlOworCisJICBkeW5hbWljX2luZm9bRFRfU1lNVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOworCisJICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzeW1ib2wgdGFibGUgaXMsCisJICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKKwkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0CisJICAgICBzaG91bGQgd29yay4gKi8KKworCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKKworCSAgaWYgKGZzZWVrIChmaWxlLCAwLCBTRUVLX0VORCkpCisJICAgIGVycm9yIChfKCJVbmFibGUgdG8gc2VlayB0byBlbmQgb2YgZmlsZSEiKSk7CisKKwkgIG51bV9zeW1zID0gKGZ0ZWxsIChmaWxlKSAtIG9mZnNldCkgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7CisKKwkgIGlmIChudW1fc3ltcyA8IDEpCisJICAgIHsKKwkgICAgICBlcnJvciAoXygiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9hZFxuIikpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGR5bmFtaWNfc3ltYm9scyA9IGdldF9lbGZfc3ltYm9scyAoZmlsZSwgb2Zmc2V0LCBudW1fc3ltcyk7CisJfQorICAgIH0KKworICAvKiBTaW1pbGFybHkgZmluZCBhIHN0cmluZyB0YWJsZS4gICovCisgIGlmIChkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKKwkgICBpIDwgZHluYW1pY19zaXplOworCSAgICsraSwgKysgZW50cnkpCisJeworCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJICBsb25nICAgICAgICAgIHN0cl90YWJfbGVuOworCisJICBpZiAoZW50cnktPmRfdGFnICE9IERUX1NUUlRBQikKKwkgICAgY29udGludWU7CisKKwkgIGR5bmFtaWNfaW5mb1tEVF9TVFJUQUJdID0gZW50cnktPmRfdW4uZF92YWw7CisKKwkgIC8qIFNpbmNlIHdlIGRvIG5vdCBrbm93IGhvdyBiaWcgdGhlIHN0cmluZyB0YWJsZSBpcywKKwkgICAgIHdlIGRlZmF1bHQgdG8gcmVhZGluZyBpbiB0aGUgZW50aXJlIGZpbGUgKCEpIGFuZAorCSAgICAgcHJvY2Vzc2luZyB0aGF0LiAgVGhpcyBpcyBvdmVya2lsbCwgSSBrbm93LCBidXQgaXQKKwkgICAgIHNob3VsZCB3b3JrLiAqLworCisJICBvZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOworCSAgaWYgKGZzZWVrIChmaWxlLCAwLCBTRUVLX0VORCkpCisJICAgIGVycm9yIChfKCJVbmFibGUgdG8gc2VlayB0byBlbmQgb2YgZmlsZVxuIikpOworCSAgc3RyX3RhYl9sZW4gPSBmdGVsbCAoZmlsZSkgLSBvZmZzZXQ7CisKKwkgIGlmIChzdHJfdGFiX2xlbiA8IDEpCisJICAgIHsKKwkgICAgICBlcnJvcgorCQkoXygiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBkeW5hbWljIHN0cmluZyB0YWJsZVxuIikpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIEdFVF9EQVRBX0FMTE9DIChvZmZzZXQsIHN0cl90YWJfbGVuLCBkeW5hbWljX3N0cmluZ3MsIGNoYXIgKiwKKwkJCSAgImR5bmFtaWMgc3RyaW5nIHRhYmxlIik7CisKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogQW5kIGZpbmQgdGhlIHN5bWluZm8gc2VjdGlvbiBpZiBhdmFpbGFibGUuICAqLworICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHN5bWluc3ogPSAwOworCisgICAgICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKKwkgICBpIDwgZHluYW1pY19zaXplOworCSAgICsraSwgKysgZW50cnkpCisJeworCSAgaWYgKGVudHJ5LT5kX3RhZyA9PSBEVF9TWU1JTkVOVCkKKwkgICAgeworCSAgICAgIC8qIE5vdGU6IHRoZXNlIGJyYWNlcyBhcmUgbmVjZXNzYXJ5IHRvIGF2b2lkIGEgc3ludGF4CisJCSBlcnJvciBmcm9tIHRoZSBTdW5PUzQgQyBjb21waWxlci4gICovCisJICAgICAgYXNzZXJ0IChzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW1pbmZvKSA9PSBlbnRyeS0+ZF91bi5kX3ZhbCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGVudHJ5LT5kX3RhZyA9PSBEVF9TWU1JTlNaKQorCSAgICBzeW1pbnN6ID0gZW50cnktPmRfdW4uZF92YWw7CisJICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5GTykKKwkgICAgZHluYW1pY19zeW1pbmZvX29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7CisJfQorCisgICAgICBpZiAoZHluYW1pY19zeW1pbmZvX29mZnNldCAhPSAwICYmIHN5bWluc3ogIT0gMCkKKwl7CisJICBFbGZfRXh0ZXJuYWxfU3ltaW5mbyAqZXh0c3ltaW5mbzsKKwkgIEVsZl9JbnRlcm5hbF9TeW1pbmZvICpzeW1pbmZvOworCisJICAvKiBUaGVyZSBpcyBhIHN5bWluZm8gc2VjdGlvbi4gIFJlYWQgdGhlIGRhdGEuICAqLworCSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQsIHN5bWluc3osIGV4dHN5bWluZm8sCisJCQkgIEVsZl9FeHRlcm5hbF9TeW1pbmZvICosICJzeW1ib2wgaW5mb3JtYXRpb24iKTsKKworCSAgZHluYW1pY19zeW1pbmZvID0gKEVsZl9JbnRlcm5hbF9TeW1pbmZvICopIG1hbGxvYyAoc3ltaW5zeik7CisJICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCisJICAgIHsKKwkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisKKwkgIGR5bmFtaWNfc3ltaW5mb19uZW50ID0gc3ltaW5zeiAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bWluZm8pOworCSAgZm9yIChpID0gMCwgc3ltaW5mbyA9IGR5bmFtaWNfc3ltaW5mbzsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OworCSAgICAgICArK2ksICsrc3ltaW5mbykKKwkgICAgeworCSAgICAgIHN5bWluZm8tPnNpX2JvdW5kdG8gPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9ib3VuZHRvKTsKKwkgICAgICBzeW1pbmZvLT5zaV9mbGFncyA9IEJZVEVfR0VUIChleHRzeW1pbmZvW2ldLnNpX2ZsYWdzKTsKKwkgICAgfQorCisJICBmcmVlIChleHRzeW1pbmZvKTsKKwl9CisgICAgfQorCisgIGlmIChkb19keW5hbWljICYmIGR5bmFtaWNfYWRkcikKKyAgICBwcmludGYgKF8oIlxuRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKKwkgICAgZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUpOworICBpZiAoZG9fZHluYW1pYykKKyAgICBwcmludGYgKF8oIiAgVGFnICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUvVmFsdWVcbiIpKTsKKworICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKKyAgICAgICBpIDwgZHluYW1pY19zaXplOworICAgICAgIGkrKywgZW50cnkgKyspCisgICAgeworICAgICAgaWYgKGRvX2R5bmFtaWMpCisJcHJpbnRmIChfKCIgIDB4JS04LjhseCAoJXMpJSpzIiksCisJCSh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF90YWcsCisJCWdldF9keW5hbWljX3R5cGUgKGVudHJ5LT5kX3RhZyksCisJCTI3IC0gc3RybGVuIChnZXRfZHluYW1pY190eXBlIChlbnRyeS0+ZF90YWcpKSwKKwkJIiAiKTsKKworICAgICAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCisJeworCWNhc2UgRFRfQVVYSUxJQVJZOgorCWNhc2UgRFRfRklMVEVSOgorCSAgaWYgKGRvX2R5bmFtaWMpCisJICAgIHsKKwkgICAgICBpZiAoZW50cnktPmRfdGFnID09IERUX0FVWElMSUFSWSkKKwkJcHJpbnRmIChfKCJBdXhpbGlhcnkgbGlicmFyeSIpKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoXygiRmlsdGVyIGxpYnJhcnkiKSk7CisKKwkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzKQorCQlwcmludGYgKCI6IFslc11cbiIsIGR5bmFtaWNfc3RyaW5ncyArIGVudHJ5LT5kX3VuLmRfdmFsKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIjogJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIERUX0ZFQVRVUkVfMToKKwkgIGlmIChkb19keW5hbWljKQorCSAgICB7CisJICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7CisJICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCisJCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKKwkJICBpZiAodmFsICYgRFRGXzFfUEFSSU5JVCkKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiIFBBUklOSVQiKTsKKwkJICAgICAgdmFsIF49IERURl8xX1BBUklOSVQ7CisJCSAgICB9CisJCSAgaWYgKHZhbCAhPSAwKQorCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7CisJCSAgcHV0cyAoIiIpOworCQl9CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBEVF9QT1NGTEFHXzE6CisJICBpZiAoZG9fZHluYW1pYykKKwkgICAgeworCSAgICAgIHByaW50ZiAoXygiRmxhZ3M6IikpOworCSAgICAgIGlmIChlbnRyeS0+ZF91bi5kX3ZhbCA9PSAwKQorCQlwcmludGYgKF8oIiBOb25lXG4iKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgdW5zaWduZWQgbG9uZyBpbnQgdmFsID0gZW50cnktPmRfdW4uZF92YWw7CisJCSAgaWYgKHZhbCAmIERGX1AxX0xBWllMT0FEKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCIgTEFaWUxPQUQiKTsKKwkJICAgICAgdmFsIF49IERGX1AxX0xBWllMT0FEOworCQkgICAgfQorCQkgIGlmICh2YWwgJiBERl9QMV9HUk9VUFBFUk0pCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIiBHUk9VUFBFUk0iKTsKKwkJICAgICAgdmFsIF49IERGX1AxX0dST1VQUEVSTTsKKwkJICAgIH0KKwkJICBpZiAodmFsICE9IDApCisJCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKKwkJICBwdXRzICgiIik7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIERUX0ZMQUdTXzE6CisJICBpZiAoZG9fZHluYW1pYykKKwkgICAgeworCSAgICAgIHByaW50ZiAoXygiRmxhZ3M6IikpOworCSAgICAgIGlmIChlbnRyeS0+ZF91bi5kX3ZhbCA9PSAwKQorCQlwcmludGYgKF8oIiBOb25lXG4iKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgdW5zaWduZWQgbG9uZyBpbnQgdmFsID0gZW50cnktPmRfdW4uZF92YWw7CisJCSAgaWYgKHZhbCAmIERGXzFfTk9XKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCIgTk9XIik7CisJCSAgICAgIHZhbCBePSBERl8xX05PVzsKKwkJICAgIH0KKwkJICBpZiAodmFsICYgREZfMV9HTE9CQUwpCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIiBHTE9CQUwiKTsKKwkJICAgICAgdmFsIF49IERGXzFfR0xPQkFMOworCQkgICAgfQorCQkgIGlmICh2YWwgJiBERl8xX0dST1VQKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCIgR1JPVVAiKTsKKwkJICAgICAgdmFsIF49IERGXzFfR1JPVVA7CisJCSAgICB9CisJCSAgaWYgKHZhbCAmIERGXzFfTk9ERUxFVEUpCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIiBOT0RFTEVURSIpOworCQkgICAgICB2YWwgXj0gREZfMV9OT0RFTEVURTsKKwkJICAgIH0KKwkJICBpZiAodmFsICYgREZfMV9MT0FERkxUUikKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiIExPQURGTFRSIik7CisJCSAgICAgIHZhbCBePSBERl8xX0xPQURGTFRSOworCQkgICAgfQorCQkgIGlmICh2YWwgJiBERl8xX0lOSVRGSVJTVCkKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiIElOSVRGSVJTVCIpOworCQkgICAgICB2YWwgXj0gREZfMV9JTklURklSU1Q7CisJCSAgICB9CisJCSAgaWYgKHZhbCAmIERGXzFfTk9PUEVOKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCIgTk9PUEVOIik7CisJCSAgICAgIHZhbCBePSBERl8xX05PT1BFTjsKKwkJICAgIH0KKwkJICBpZiAodmFsICYgREZfMV9PUklHSU4pCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIiBPUklHSU4iKTsKKwkJICAgICAgdmFsIF49IERGXzFfT1JJR0lOOworCQkgICAgfQorCQkgIGlmICh2YWwgJiBERl8xX0RJUkVDVCkKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiIERJUkVDVCIpOworCQkgICAgICB2YWwgXj0gREZfMV9ESVJFQ1Q7CisJCSAgICB9CisJCSAgaWYgKHZhbCAmIERGXzFfVFJBTlMpCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIiBUUkFOUyIpOworCQkgICAgICB2YWwgXj0gREZfMV9UUkFOUzsKKwkJICAgIH0KKwkJICBpZiAodmFsICYgREZfMV9JTlRFUlBPU0UpCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIiBJTlRFUlBPU0UiKTsKKwkJICAgICAgdmFsIF49IERGXzFfSU5URVJQT1NFOworCQkgICAgfQorCQkgIGlmICh2YWwgIT0gMCkKKwkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOworCQkgIHB1dHMgKCIiKTsKKwkJfQorCSAgICB9CisJICBicmVhazsKKworCWNhc2UgRFRfUExUUkVMOgorCSAgaWYgKGRvX2R5bmFtaWMpCisJICAgIHB1dHMgKGdldF9keW5hbWljX3R5cGUgKGVudHJ5LT5kX3VuLmRfdmFsKSk7CisJICBicmVhazsKKworCWNhc2UgRFRfTlVMTAk6CisJY2FzZSBEVF9ORUVERUQJOgorCWNhc2UgRFRfUExUR09UCToKKwljYXNlIERUX0hBU0gJOgorCWNhc2UgRFRfU1RSVEFCCToKKwljYXNlIERUX1NZTVRBQgk6CisJY2FzZSBEVF9SRUxBCToKKwljYXNlIERUX0lOSVQJOgorCWNhc2UgRFRfRklOSQk6CisJY2FzZSBEVF9TT05BTUUJOgorCWNhc2UgRFRfUlBBVEgJOgorCWNhc2UgRFRfU1lNQk9MSUM6CisJY2FzZSBEVF9SRUwJOgorCWNhc2UgRFRfREVCVUcJOgorCWNhc2UgRFRfVEVYVFJFTAk6CisJY2FzZSBEVF9KTVBSRUwJOgorCSAgZHluYW1pY19pbmZvW2VudHJ5LT5kX3RhZ10gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKKworCSAgaWYgKGRvX2R5bmFtaWMpCisJICAgIHsKKwkgICAgICBjaGFyICogbmFtZTsKKworCSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKKwkJbmFtZSA9IE5VTEw7CisJICAgICAgZWxzZQorCQluYW1lID0gZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWw7CisKKwkgICAgICBpZiAobmFtZSkKKwkJeworCQkgIHN3aXRjaCAoZW50cnktPmRfdGFnKQorCQkgICAgeworCQkgICAgY2FzZSBEVF9ORUVERUQ6CisJCSAgICAgIHByaW50ZiAoXygiU2hhcmVkIGxpYnJhcnk6IFslc10iKSwgbmFtZSk7CisKKwkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgcHJvZ3JhbV9pbnRlcnByZXRlcikpCisJCQlwcmludGYgKCJcbiIpOworCQkgICAgICBlbHNlCisJCQlwcmludGYgKF8oIiBwcm9ncmFtIGludGVycHJldGVyXG4iKSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIERUX1NPTkFNRToKKwkJICAgICAgcHJpbnRmIChfKCJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIiksIG5hbWUpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSBEVF9SUEFUSDoKKwkJICAgICAgcHJpbnRmIChfKCJMaWJyYXJ5IHJwYXRoOiBbJXNdXG4iKSwgbmFtZSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQlwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgRFRfUExUUkVMU1o6CisJY2FzZSBEVF9SRUxBU1oJOgorCWNhc2UgRFRfU1RSU1oJOgorCWNhc2UgRFRfUkVMU1oJOgorCWNhc2UgRFRfUkVMQUVOVAk6CisJY2FzZSBEVF9TWU1FTlQJOgorCWNhc2UgRFRfUkVMRU5UCToKKwljYXNlIERUX1BMVFBBRFNaOgorCWNhc2UgRFRfTU9WRUVOVAk6CisJY2FzZSBEVF9NT1ZFU1oJOgorCWNhc2UgRFRfSU5JVF9BUlJBWVNaOgorCWNhc2UgRFRfRklOSV9BUlJBWVNaOgorCSAgaWYgKGRvX2R5bmFtaWMpCisJICAgIHByaW50ZiAoIiVsdSAoYnl0ZXMpXG4iLCAodW5zaWduZWQgbG9uZykgZW50cnktPmRfdW4uZF92YWwpOworCSAgYnJlYWs7CisKKwljYXNlIERUX1ZFUkRFRk5VTToKKwljYXNlIERUX1ZFUk5FRUROVU06CisJY2FzZSBEVF9SRUxBQ09VTlQ6CisJY2FzZSBEVF9SRUxDT1VOVDoKKwkgIGlmIChkb19keW5hbWljKQorCSAgICBwcmludGYgKCIlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7CisJICBicmVhazsKKworCWNhc2UgRFRfU1lNSU5TWjoKKwljYXNlIERUX1NZTUlORU5UOgorCWNhc2UgRFRfU1lNSU5GTzoKKwljYXNlIERUX1VTRUQ6CisJY2FzZSBEVF9JTklUX0FSUkFZOgorCWNhc2UgRFRfRklOSV9BUlJBWToKKwkgIGlmIChkb19keW5hbWljKQorCSAgICB7CisJICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMICYmIGVudHJ5LT5kX3RhZyA9PSBEVF9VU0VEKQorCQl7CisJCSAgY2hhciAqIG5hbWU7CisKKwkJICBuYW1lID0gZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWw7CisKKwkJICBpZiAoKiBuYW1lKQorCQkgICAgeworCQkgICAgICBwcmludGYgKF8oIk5vdCBuZWVkZWQgb2JqZWN0OiBbJXNdXG4iKSwgbmFtZSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgCisJICAgICAgcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIERUX0JJTkRfTk9XOgorCSAgLyogVGhlIHZhbHVlIG9mIHRoaXMgZW50cnkgaXMgaWdub3JlZC4gICovCisJICBicmVhazsKKwkgIAorCWRlZmF1bHQ6CisJICBpZiAoKGVudHJ5LT5kX3RhZyA+PSBEVF9WRVJTWU0pICYmIChlbnRyeS0+ZF90YWcgPD0gRFRfVkVSTkVFRE5VTSkpCisJICAgIHZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoZW50cnktPmRfdGFnKV0gPQorCSAgICAgIGVudHJ5LT5kX3VuLmRfdmFsOworCisJICBpZiAoZG9fZHluYW1pYykKKwkgICAgeworCSAgICAgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCisJCXsKKwkJY2FzZSBFTV9NSVBTOgorCQljYXNlIEVNX01JUFNfUlM0X0JFOgorCQkgIGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCAoZW50cnkpOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X3Zlcl9mbGFncyAoZmxhZ3MpCisgICAgIHVuc2lnbmVkIGludCBmbGFnczsKK3sKKyAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOworCisgIGJ1ZmZbMF0gPSAwOworCisgIGlmIChmbGFncyA9PSAwKQorICAgIHJldHVybiBfKCJub25lIik7CisKKyAgaWYgKGZsYWdzICYgVkVSX0ZMR19CQVNFKQorICAgIHN0cmNhdCAoYnVmZiwgIkJBU0UgIik7CisKKyAgaWYgKGZsYWdzICYgVkVSX0ZMR19XRUFLKQorICAgIHsKKyAgICAgIGlmIChmbGFncyAmIFZFUl9GTEdfQkFTRSkKKwlzdHJjYXQgKGJ1ZmYsICJ8ICIpOworCisgICAgICBzdHJjYXQgKGJ1ZmYsICJXRUFLICIpOworICAgIH0KKworICBpZiAoZmxhZ3MgJiB+KFZFUl9GTEdfQkFTRSB8IFZFUl9GTEdfV0VBSykpCisgICAgc3RyY2F0IChidWZmLCAifCA8dW5rbm93bj4iKTsKKworICByZXR1cm4gYnVmZjsKK30KKworLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHZlcnNpb24gc2VjdGlvbnMuICAqLworc3RhdGljIGludAorcHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247CisgIHVuc2lnbmVkICAgaTsKKyAgaW50ICAgICAgICBmb3VuZCA9IDA7CisKKyAgaWYgKCEgZG9fdmVyc2lvbikKKyAgICByZXR1cm4gMTsKKworICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOworICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07CisgICAgICAgaSsrLCBzZWN0aW9uICsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoc2VjdGlvbi0+c2hfdHlwZSkKKwl7CisJY2FzZSBTSFRfR05VX3ZlcmRlZjoKKwkgIHsKKwkgICAgRWxmX0V4dGVybmFsX1ZlcmRlZiAqIGVkZWZzOworCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgaWR4OworCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgY250OworCisJICAgIGZvdW5kID0gMTsKKworCSAgICBwcmludGYKKwkgICAgICAoXygiXG5WZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCisJICAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHNlY3Rpb24tPnNoX2luZm8pOworCisJICAgIHByaW50ZiAoXygiICBBZGRyOiAweCIpKTsKKwkgICAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+c2hfYWRkcik7CisJICAgIHByaW50ZiAoXygiICBPZmZzZXQ6ICUjMDhseCAgTGluazogJWx4ICglcylcbiIpLAorCQkgICAgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAorCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rKSk7CisKKwkgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKKwkJCSAgICBlZGVmcywgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLAorCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiIpOworCisJICAgIGZvciAoaWR4ID0gY250ID0gMDsgY250IDwgc2VjdGlvbi0+c2hfaW5mbzsgKysgY250KQorCSAgICAgIHsKKwkJY2hhciAqICAgICAgICAgICAgICAgICB2c3RhcnQ7CisJCUVsZl9FeHRlcm5hbF9WZXJkZWYgKiAgZWRlZjsKKwkJRWxmX0ludGVybmFsX1ZlcmRlZiAgICBlbnQ7CisJCUVsZl9FeHRlcm5hbF9WZXJkYXV4ICogZWF1eDsKKwkJRWxmX0ludGVybmFsX1ZlcmRhdXggICBhdXg7CisJCWludCAgICAgICAgICAgICAgICAgICAgajsKKwkJaW50ICAgICAgICAgICAgICAgICAgICBpc3VtOworCQkKKwkJdnN0YXJ0ID0gKChjaGFyICopIGVkZWZzKSArIGlkeDsKKworCQllZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgdnN0YXJ0OworCisJCWVudC52ZF92ZXJzaW9uID0gQllURV9HRVQgKGVkZWYtPnZkX3ZlcnNpb24pOworCQllbnQudmRfZmxhZ3MgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9mbGFncyk7CisJCWVudC52ZF9uZHggICAgID0gQllURV9HRVQgKGVkZWYtPnZkX25keCk7CisJCWVudC52ZF9jbnQgICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2NudCk7CisJCWVudC52ZF9oYXNoICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2hhc2gpOworCQllbnQudmRfYXV4ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9hdXgpOworCQllbnQudmRfbmV4dCAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9uZXh0KTsKKworCQlwcmludGYgKF8oIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIpLAorCQkJaWR4LCBlbnQudmRfdmVyc2lvbiwgZ2V0X3Zlcl9mbGFncyAoZW50LnZkX2ZsYWdzKSk7CisKKwkJcHJpbnRmIChfKCIgIEluZGV4OiAlZCAgQ250OiAlZCAgIiksCisJCQllbnQudmRfbmR4LCBlbnQudmRfY250KTsKKworCQl2c3RhcnQgKz0gZW50LnZkX2F1eDsKKworCQllYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHZzdGFydDsKKworCQlhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOworCQlhdXgudmRhX25leHQgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25leHQpOworCisJCWlmIChkeW5hbWljX3N0cmluZ3MpCisJCSAgcHJpbnRmIChfKCJOYW1lOiAlc1xuIiksIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7CisJCWVsc2UKKwkJICBwcmludGYgKF8oIk5hbWUgaW5kZXg6ICVsZFxuIiksIGF1eC52ZGFfbmFtZSk7CisKKwkJaXN1bSA9IGlkeCArIGVudC52ZF9hdXg7CisKKwkJZm9yIChqID0gMTsgaiA8IGVudC52ZF9jbnQ7IGogKyspCisJCSAgeworCQkgICAgaXN1bSAgICs9IGF1eC52ZGFfbmV4dDsKKwkJICAgIHZzdGFydCArPSBhdXgudmRhX25leHQ7CisKKwkJICAgIGVhdXggPSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgdnN0YXJ0OworCisJCSAgICBhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOworCQkgICAgYXV4LnZkYV9uZXh0ID0gQllURV9HRVQgKGVhdXgtPnZkYV9uZXh0KTsKKworCQkgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKKwkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iKSwKKwkJCSAgICAgIGlzdW0sIGosIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7CisJCSAgICBlbHNlCisJCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogUGFyZW50ICVkLCBuYW1lIGluZGV4OiAlbGRcbiIpLAorCQkJICAgICAgaXN1bSwgaiwgYXV4LnZkYV9uYW1lKTsKKwkJICB9CisKKwkJaWR4ICs9IGVudC52ZF9uZXh0OworCSAgICAgIH0KKworCSAgICBmcmVlIChlZGVmcyk7CisJICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgorCSAgeworCSAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqICBlbmVlZDsKKwkgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgaWR4OworCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbnQ7CisKKwkgICAgZm91bmQgPSAxOworCisJICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIG5lZWRzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIpLAorCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7CisKKwkgICAgcHJpbnRmIChfKCIgQWRkcjogMHgiKSk7CisJICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOworCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIpLAorCQkgICAgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAorCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rKSk7CisKKwkgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKKwkJCSAgICBlbmVlZCwgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiwKKwkJCSAgICAidmVyc2lvbiBuZWVkIHNlY3Rpb24iKTsKKworCSAgICBmb3IgKGlkeCA9IGNudCA9IDA7IGNudCA8IHNlY3Rpb24tPnNoX2luZm87ICsrY250KQorCSAgICAgIHsKKwkJRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiBlbnRyeTsKKwkJRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGVudDsKKwkJaW50ICAgICAgICAgICAgICAgICAgICAgIGo7CisJCWludCAgICAgICAgICAgICAgICAgICAgICBpc3VtOworCQljaGFyICogICAgICAgICAgICAgICAgICAgdnN0YXJ0OworCisJCXZzdGFydCA9ICgoY2hhciAqKSBlbmVlZCkgKyBpZHg7CisKKwkJZW50cnkgPSAoRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikgdnN0YXJ0OworCisJCWVudC52bl92ZXJzaW9uID0gQllURV9HRVQgKGVudHJ5LT52bl92ZXJzaW9uKTsKKwkJZW50LnZuX2NudCAgICAgPSBCWVRFX0dFVCAoZW50cnktPnZuX2NudCk7CisJCWVudC52bl9maWxlICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9maWxlKTsKKwkJZW50LnZuX2F1eCAgICAgPSBCWVRFX0dFVCAoZW50cnktPnZuX2F1eCk7CisJCWVudC52bl9uZXh0ICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9uZXh0KTsKKworCQlwcmludGYgKF8oIiAgJSMwNng6IFZlcnNpb246ICVkIiksIGlkeCwgZW50LnZuX3ZlcnNpb24pOworCisJCWlmIChkeW5hbWljX3N0cmluZ3MpCisJCSAgcHJpbnRmIChfKCIgIEZpbGU6ICVzIiksIGR5bmFtaWNfc3RyaW5ncyArIGVudC52bl9maWxlKTsKKwkJZWxzZQorCQkgIHByaW50ZiAoXygiICBGaWxlOiAlbHgiKSwgZW50LnZuX2ZpbGUpOworCisJCXByaW50ZiAoXygiICBDbnQ6ICVkXG4iKSwgZW50LnZuX2NudCk7CisKKwkJdnN0YXJ0ICs9IGVudC52bl9hdXg7CisKKwkJZm9yIChqID0gMCwgaXN1bSA9IGlkeCArIGVudC52bl9hdXg7IGogPCBlbnQudm5fY250OyArK2opCisJCSAgeworCQkgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKiBlYXV4OworCQkgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICBhdXg7CisKKwkJICAgIGVhdXggPSAoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikgdnN0YXJ0OworCisJCSAgICBhdXgudm5hX2hhc2ggID0gQllURV9HRVQgKGVhdXgtPnZuYV9oYXNoKTsKKwkJICAgIGF1eC52bmFfZmxhZ3MgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX2ZsYWdzKTsKKwkJICAgIGF1eC52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX290aGVyKTsKKwkJICAgIGF1eC52bmFfbmFtZSAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX25hbWUpOworCQkgICAgYXV4LnZuYV9uZXh0ICA9IEJZVEVfR0VUIChlYXV4LT52bmFfbmV4dCk7CisKKwkJICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCisJCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogTmFtZTogJXMiKSwKKwkJCSAgICAgIGlzdW0sIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52bmFfbmFtZSk7CisJCSAgICBlbHNlCisJCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogTmFtZSBpbmRleDogJWx4IiksCisJCQkgICAgICBpc3VtLCBhdXgudm5hX25hbWUpOworCisJCSAgICBwcmludGYgKF8oIiAgRmxhZ3M6ICVzICBWZXJzaW9uOiAlZFxuIiksCisJCQkgICAgZ2V0X3Zlcl9mbGFncyAoYXV4LnZuYV9mbGFncyksIGF1eC52bmFfb3RoZXIpOworCisJCSAgICBpc3VtICAgKz0gYXV4LnZuYV9uZXh0OworCQkgICAgdnN0YXJ0ICs9IGF1eC52bmFfbmV4dDsKKwkJICB9CisKKwkJaWR4ICs9IGVudC52bl9uZXh0OworCSAgICAgIH0KKwkgICAgCisJICAgIGZyZWUgKGVuZWVkKTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBTSFRfR05VX3ZlcnN5bToKKwkgIHsKKwkgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgICAgIGxpbmtfc2VjdGlvbjsKKwkgICAgaW50ICAgICAgICAgICAgICAJCXRvdGFsOworCSAgICBpbnQgICAgICAgICAgICAgIAkJY250OworCSAgICB1bnNpZ25lZCBjaGFyICogCQllZGF0YTsKKwkgICAgdW5zaWduZWQgc2hvcnQgKiAJCWRhdGE7CisJICAgIGNoYXIgKiAgICAgICAgICAgCQlzdHJ0YWI7CisJICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAJCXN5bWJvbHM7CisJICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgICBzdHJpbmdfc2VjOworCisJICAgIGxpbmtfc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7CisJICAgIHRvdGFsID0gc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemU7CisKKwkgICAgZm91bmQgPSAxOworCisJICAgIHN5bWJvbHMgPSBnZXRfZWxmX3N5bWJvbHMKKwkgICAgICAoZmlsZSwgbGlua19zZWN0aW9uLT5zaF9vZmZzZXQsCisJICAgICAgIGxpbmtfc2VjdGlvbi0+c2hfc2l6ZSAvIGxpbmtfc2VjdGlvbi0+c2hfZW50c2l6ZSk7CisKKwkgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIGxpbmtfc2VjdGlvbi0+c2hfbGluazsKKworCSAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAorCQkJICAgIHN0cnRhYiwgY2hhciAqLCAidmVyc2lvbiBzdHJpbmcgdGFibGUiKTsKKworCSAgICBwcmludGYgKF8oIlxuVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksCisJCSAgICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLCB0b3RhbCk7CisKKwkgICAgcHJpbnRmIChfKCIgQWRkcjogIikpOworCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKKwkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIiksCisJCSAgICBzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX2xpbmssCisJCSAgICBTRUNUSU9OX05BTUUgKGxpbmtfc2VjdGlvbikpOworCisJICAgIEdFVF9EQVRBX0FMTE9DICh2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldCisJCQkgICAgLSBsb2FkYWRkciwKKwkJCSAgICB0b3RhbCAqIHNpemVvZiAoc2hvcnQpLCBlZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICosICJ2ZXJzaW9uIHN5bWJvbCBkYXRhIik7CisKKwkgICAgZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKSBtYWxsb2MgKHRvdGFsICogc2l6ZW9mIChzaG9ydCkpOworCisJICAgIGZvciAoY250ID0gdG90YWw7IGNudCAtLTspCisJICAgICAgZGF0YSBbY250XSA9IGJ5dGVfZ2V0IChlZGF0YSArIGNudCAqIHNpemVvZiAoc2hvcnQpLAorCQkJCSAgICAgc2l6ZW9mIChzaG9ydCkpOworCisJICAgIGZyZWUgKGVkYXRhKTsKKworCSAgICBmb3IgKGNudCA9IDA7IGNudCA8IHRvdGFsOyBjbnQgKz0gNCkKKwkgICAgICB7CisJCWludCBqLCBubjsKKworCQlwcmludGYgKCIgICUwM3g6IiwgY250KTsKKworCQlmb3IgKGogPSAwOyAoaiA8IDQpICYmIChjbnQgKyBqKSA8IHRvdGFsOyArK2opCisJCSAgc3dpdGNoIChkYXRhIFtjbnQgKyBqXSkKKwkJICAgIHsKKwkJICAgIGNhc2UgMDoKKwkJICAgICAgZnB1dHMgKF8oIiAgIDAgKCpsb2NhbCopICAgICIpLCBzdGRvdXQpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAxOgorCQkgICAgICBmcHV0cyAoXygiICAgMSAoKmdsb2JhbCopICAgIiksIHN0ZG91dCk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBubiA9IHByaW50ZiAoIiU0eCVjIiwgZGF0YSBbY250ICsgal0gJiAweDdmZmYsCisJCQkJICAgZGF0YSBbY250ICsgal0gJiAweDgwMDAgPyAnaCcgOiAnICcpOworCisJCSAgICAgIGlmIChzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUKKwkJCSAgJiYgc2VjdGlvbl9oZWFkZXJzW3N5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4XS5zaF90eXBlCisJCQkgID09IFNIVF9OT0JJVFMpCisJCQl7CisJCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KKwkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKKwkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKKworCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQorCQkJICAgIC0gbG9hZGFkZHI7CisKKwkJCSAgZG8KKwkJCSAgICB7CisJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKKwkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKKwkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgICBpdm5hOworCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIHZuYV9vZmY7CisKKwkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOworCisJCQkgICAgICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKKwkJCSAgICAgIGl2bi52bl9uZXh0ID0gQllURV9HRVQgKGV2bi52bl9uZXh0KTsKKworCQkJICAgICAgdm5hX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7CisKKwkJCSAgICAgIGRvCisJCQkJeworCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCisJCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMSkiKTsKKworCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7CisJCQkJICBpdm5hLnZuYV9vdGhlciA9IEJZVEVfR0VUIChldm5hLnZuYV9vdGhlcik7CisKKwkJCQkgIHZuYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKKwkJCQl9CisJCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gZGF0YSBbY250ICsgal0KKwkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7CisKKwkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSBkYXRhIFtjbnQgKyBqXSkKKwkJCQl7CisJCQkJICBpdm5hLnZuYV9uYW1lID0gQllURV9HRVQgKGV2bmEudm5hX25hbWUpOworCisJCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKKwkJCQkJCXN0cnRhYiArIGl2bmEudm5hX25hbWUsCisJCQkJCQkxMiAtIHN0cmxlbiAoc3RydGFiCisJCQkJCQkJICAgICArIGl2bmEudm5hX25hbWUpLAorCQkJCQkJIikiKTsKKwkJCQkgIGJyZWFrOworCQkJCX0KKwkJCSAgICAgIGVsc2UgaWYgKGl2bi52bl9uZXh0ID09IDApCisJCQkJeworCQkJCSAgaWYgKGRhdGEgW2NudCArIGpdICE9IDB4ODAwMSkKKwkJCQkgICAgeworCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKKwkJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICBldmQ7CisKKwkJCQkgICAgICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8KKwkJCQkJW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCisJCQkJCS0gbG9hZGFkZHI7CisKKwkJCQkgICAgICBkbworCQkJCQl7CisJCQkJCSAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLAorCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24iKTsKKworCQkJCQkgIGl2ZC52ZF9uZXh0ID0gQllURV9HRVQgKGV2ZC52ZF9uZXh0KTsKKwkJCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKKworCQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKKwkJCQkJfQorCQkJCSAgICAgIHdoaWxlIChpdmQudmRfbmR4CisJCQkJCSAgICAgIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQorCQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOworCisJCQkJICAgICAgaWYgKGl2ZC52ZF9uZHgKKwkJCQkJICA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQorCQkJCQl7CisJCQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggIGV2ZGE7CisJCQkJCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7CisKKwkJCQkJICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOworCisJCQkJCSAgR0VUX0RBVEEgKG9mZnNldCArIGl2ZC52ZF9hdXgsIGV2ZGEsCisJCQkJCQkgICAgInZlcnNpb24gZGVmaW5pdGlvbiBhdXgiKTsKKworCQkJCQkgIGl2ZGEudmRhX25hbWUgPQorCQkJCQkgICAgQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOworCisJCQkJCSAgbm4gKz0KKwkJCQkJICAgIHByaW50ZiAoIiglcyUtKnMiLAorCQkJCQkJICAgIHN0cnRhYiArIGl2ZGEudmRhX25hbWUsCisJCQkJCQkgICAgMTIKKwkJCQkJCSAgICAtIHN0cmxlbiAoc3RydGFiCisJCQkJCQkJICAgICAgKyBpdmRhLnZkYV9uYW1lKSwKKwkJCQkJCSAgICAiKSIpOworCQkJCQl9CisJCQkJICAgIH0KKworCQkJCSAgYnJlYWs7CisJCQkJfQorCQkJICAgICAgZWxzZQorCQkJCW9mZnNldCArPSBpdm4udm5fbmV4dDsKKwkJCSAgICB9CisJCQkgIHdoaWxlIChpdm4udm5fbmV4dCk7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKHN5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4ID09IFNITl9VTkRFRikKKwkJCXsKKwkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKKwkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKKworCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQorCQkJICAgIC0gbG9hZGFkZHI7CisKKwkJICAgICAgICAgIGRvCisJCQkgICAgeworCQkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICAgIGl2bmE7CisJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKKwkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhX29mZjsKKworCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZuLCAidmVyc2lvbiBuZWVkIik7CisKKwkJCSAgICAgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOworCQkJICAgICAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOworCisJCQkgICAgICBhX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7CisKKwkJCSAgICAgIGRvCisJCQkJeworCQkJCSAgR0VUX0RBVEEgKGFfb2ZmLCBldm5hLAorCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDIpIik7CisKKwkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOworCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOworCisJCQkJICBhX29mZiArPSBpdm5hLnZuYV9uZXh0OworCQkJCX0KKwkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSBkYXRhIFtjbnQgKyBqXQorCQkJCSAgICAgJiYgaXZuYS52bmFfbmV4dCAhPSAwKTsKKworCQkJICAgICAgaWYgKGl2bmEudm5hX290aGVyID09IGRhdGEgW2NudCArIGpdKQorCQkJCXsKKwkJCQkgIGl2bmEudm5hX25hbWUgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7CisKKwkJCQkgIG5uICs9IHByaW50ZiAoIiglcyUtKnMiLAorCQkJCQkJc3RydGFiICsgaXZuYS52bmFfbmFtZSwKKwkJCQkJCTEyIC0gc3RybGVuIChzdHJ0YWIKKwkJCQkJCQkgICAgICsgaXZuYS52bmFfbmFtZSksCisJCQkJCQkiKSIpOworCQkJCSAgYnJlYWs7CisJCQkJfQorCisJCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7CisJCQkgICAgfQorCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOworCQkJfQorCQkgICAgICBlbHNlIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCisJCQl7CisJCQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKKwkJCSAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOworCQkJICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7CisKKwkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCisJCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildIC0gbG9hZGFkZHI7CisKKwkJCSAgZG8KKwkJCSAgICB7CisJCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOworCisJCQkgICAgICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7CisJCQkgICAgICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKKworCQkJICAgICAgb2Zmc2V0ICs9IGl2ZC52ZF9uZXh0OworCQkJICAgIH0KKwkJCSAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQorCQkJCSAmJiBpdmQudmRfbmV4dCAhPSAwKTsKKworCQkJICBpZiAoaXZkLnZkX25keCA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQorCQkJICAgIHsKKwkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOworCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7CisKKwkJCSAgICAgIGl2ZC52ZF9hdXggPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7CisKKwkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQgLSBpdmQudmRfbmV4dCArIGl2ZC52ZF9hdXgsCisJCQkJCWV2ZGEsICJ2ZXJzaW9uIGRlZiBhdXgiKTsKKworCQkJICAgICAgaXZkYS52ZGFfbmFtZSA9IEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKKworCQkJICAgICAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCisJCQkJCSAgICBzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lLAorCQkJCQkgICAgMTIgLSBzdHJsZW4gKHN0cnRhYgorCQkJCQkJCSArIGl2ZGEudmRhX25hbWUpLAorCQkJCQkgICAgIikiKTsKKwkJCSAgICB9CisJCQl9CisKKwkJICAgICAgaWYgKG5uIDwgMTgpCisJCQlwcmludGYgKCIlKmMiLCAxOCAtIG5uLCAnICcpOworCQkgICAgfQorCisJCXB1dGNoYXIgKCdcbicpOworCSAgICAgIH0KKworCSAgICBmcmVlIChkYXRhKTsKKwkgICAgZnJlZSAoc3RydGFiKTsKKwkgICAgZnJlZSAoc3ltYm9scyk7CisJICB9CisJICBicmVhazsKKwkKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoISBmb3VuZCkKKyAgICBwcmludGYgKF8oIlxuTm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGlzIGZpbGUuXG4iKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF9zeW1ib2xfYmluZGluZyAoYmluZGluZykKKyAgICAgdW5zaWduZWQgaW50IGJpbmRpbmc7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKKworICBzd2l0Y2ggKGJpbmRpbmcpCisgICAgeworICAgIGNhc2UgU1RCX0xPQ0FMOiAgcmV0dXJuIF8oIkxPQ0FMIik7CisgICAgY2FzZSBTVEJfR0xPQkFMOiByZXR1cm4gXygiR0xPQkFMIik7CisgICAgY2FzZSBTVEJfV0VBSzogICByZXR1cm4gXygiV0VBSyIpOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoYmluZGluZyA+PSBTVEJfTE9QUk9DICYmIGJpbmRpbmcgPD0gU1RCX0hJUFJPQykKKwlzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7CisgICAgICBlbHNlIGlmIChiaW5kaW5nID49IFNUQl9MT09TICYmIGJpbmRpbmcgPD0gU1RCX0hJT1MpCisJc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlZCIpLCBiaW5kaW5nKTsKKyAgICAgIHJldHVybiBidWZmOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorZ2V0X3N5bWJvbF90eXBlICh0eXBlKQorICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKK3sKKyAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBTVFRfTk9UWVBFOiAgIHJldHVybiBfKCJOT1RZUEUiKTsKKyAgICBjYXNlIFNUVF9PQkpFQ1Q6ICAgcmV0dXJuIF8oIk9CSkVDVCIpOworICAgIGNhc2UgU1RUX0ZVTkM6ICAgICByZXR1cm4gXygiRlVOQyIpOworICAgIGNhc2UgU1RUX1NFQ1RJT046ICByZXR1cm4gXygiU0VDVElPTiIpOworICAgIGNhc2UgU1RUX0ZJTEU6ICAgICByZXR1cm4gXygiRklMRSIpOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAodHlwZSA+PSBTVFRfTE9QUk9DICYmIHR5cGUgPD0gU1RUX0hJUFJPQykKKwlzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgdHlwZSk7CisgICAgICBlbHNlIGlmICh0eXBlID49IFNUVF9MT09TICYmIHR5cGUgPD0gU1RUX0hJT1MpCisJc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgdHlwZSk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlZCIpLCB0eXBlKTsKKyAgICAgIHJldHVybiBidWZmOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorZ2V0X3N5bWJvbF9pbmRleF90eXBlICh0eXBlKQorICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIFNITl9VTkRFRjogIHJldHVybiAiVU5EIjsKKyAgICBjYXNlIFNITl9BQlM6ICAgIHJldHVybiAiQUJTIjsKKyAgICBjYXNlIFNITl9DT01NT046IHJldHVybiAiQ09NIjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHR5cGUgPj0gU0hOX0xPUFJPQyAmJiB0eXBlIDw9IFNITl9ISVBST0MpCisJcmV0dXJuICJQUkMiOworICAgICAgZWxzZSBpZiAodHlwZSA+PSBTSE5fTE9SRVNFUlZFICYmIHR5cGUgPD0gU0hOX0hJUkVTRVJWRSkKKwlyZXR1cm4gIlJTViI7CisgICAgICBlbHNlIGlmICh0eXBlID49IFNITl9MT09TICYmIHR5cGUgPD0gU0hOX0hJT1MpCisJcmV0dXJuICJPUyAiOworICAgICAgZWxzZQorCXsKKwkgIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKKworCSAgc3ByaW50ZiAoYnVmZiwgIiUzZCIsIHR5cGUpOworCSAgcmV0dXJuIGJ1ZmY7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgaW50ICoKK2dldF9keW5hbWljX2RhdGEgKGZpbGUsIG51bWJlcikKKyAgICAgRklMRSAqICAgICAgIGZpbGU7CisgICAgIHVuc2lnbmVkIGludCBudW1iZXI7Cit7CisgIGNoYXIgKiBlX2RhdGE7CisgIGludCAqICBpX2RhdGE7CisKKyAgZV9kYXRhID0gKGNoYXIgKikgbWFsbG9jIChudW1iZXIgKiA0KTsKKworICBpZiAoZV9kYXRhID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoZnJlYWQgKGVfZGF0YSwgNCwgbnVtYmVyLCBmaWxlKSAhPSBudW1iZXIpCisgICAgeworICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIikpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlfZGF0YSA9IChpbnQgKikgbWFsbG9jIChudW1iZXIgKiBzaXplb2YgKCogaV9kYXRhKSk7CisKKyAgaWYgKGlfZGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7CisgICAgICBmcmVlIChlX2RhdGEpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHdoaWxlIChudW1iZXItLSkKKyAgICBpX2RhdGEgW251bWJlcl0gPSBieXRlX2dldCAoZV9kYXRhICsgbnVtYmVyICogNCwgNCk7CisKKyAgZnJlZSAoZV9kYXRhKTsKKworICByZXR1cm4gaV9kYXRhOworfQorCisvKiBEdW1wIHRoZSBzeW1ib2wgdGFibGUgKi8KK3N0YXRpYyBpbnQKK3Byb2Nlc3Nfc3ltYm9sX3RhYmxlIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgc2VjdGlvbjsKKyAgY2hhciAgIG5iIFs0XTsKKyAgY2hhciAgIG5jIFs0XTsKKyAgaW50ICAgIG5idWNrZXRzOworICBpbnQgICAgbmNoYWluczsKKyAgaW50ICogIGJ1Y2tldHMgPSBOVUxMOworICBpbnQgKiAgY2hhaW5zID0gTlVMTDsKKworICBpZiAoISBkb19zeW1zICYmICFkb19oaXN0b2dyYW0pCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAmJiAoKGRvX3VzaW5nX2R5bmFtaWMgJiYgZHluYW1pY19zdHJpbmdzICE9IE5VTEwpCisJCQkJfHwgZG9faGlzdG9ncmFtKSkKKyAgICB7CisgICAgICBpZiAoZnNlZWsgKGZpbGUsIGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAtIGxvYWRhZGRyLCBTRUVLX1NFVCkpCisJeworCSAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIHN0YXJ0IG9mIGR5bmFtaWMgaW5mb3JtYXRpb24iKSk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGlmIChmcmVhZCAobmIsIHNpemVvZiAobmIpLCAxLCBmaWxlKSAhPSAxKQorCXsKKwkgIGVycm9yIChfKCJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0c1xuIikpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAoZnJlYWQgKG5jLCBzaXplb2YgKG5jKSwgMSwgZmlsZSkgIT0gMSkKKwl7CisJICBlcnJvciAoXygiRmFpbGVkIHRvIHJlYWQgaW4gbnVtYmVyIG9mIGNoYWluc1xuIikpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBuYnVja2V0cyA9IGJ5dGVfZ2V0IChuYiwgNCk7CisgICAgICBuY2hhaW5zICA9IGJ5dGVfZ2V0IChuYywgNCk7CisKKyAgICAgIGJ1Y2tldHMgPSBnZXRfZHluYW1pY19kYXRhIChmaWxlLCBuYnVja2V0cyk7CisgICAgICBjaGFpbnMgID0gZ2V0X2R5bmFtaWNfZGF0YSAoZmlsZSwgbmNoYWlucyk7CisKKyAgICAgIGlmIChidWNrZXRzID09IE5VTEwgfHwgY2hhaW5zID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChkb19zeW1zCisgICAgICAmJiBkeW5hbWljX2luZm9bRFRfSEFTSF0gJiYgZG9fdXNpbmdfZHluYW1pYyAmJiBkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgICAgaG47CisgICAgICBpbnQgICAgc2k7CisKKyAgICAgIHByaW50ZiAoXygiXG5TeW1ib2wgdGFibGUgZm9yIGltYWdlOlxuIikpOworICAgICAgcHJpbnRmIChfKCIgIE51bSBCdWM6ICAgIFZhbHVlICBTaXplICAgVHlwZSAgIEJpbmQgT3QgTmR4IE5hbWVcbiIpKTsKKworICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7IGhuKyspCisJeworCSAgaWYgKCEgYnVja2V0cyBbaG5dKQorCSAgICBjb250aW51ZTsKKworCSAgZm9yIChzaSA9IGJ1Y2tldHMgW2huXTsgc2k7IHNpID0gY2hhaW5zIFtzaV0pCisJICAgIHsKKwkgICAgICBFbGZfSW50ZXJuYWxfU3ltICogcHN5bTsKKworCSAgICAgIHBzeW0gPSBkeW5hbWljX3N5bWJvbHMgKyBzaTsKKworCSAgICAgIHByaW50ZiAoIiAgJTNkICUzZDogJThseCAlNWxkICU2cyAlNnMgJTJkICIsCisJCSAgICAgIHNpLCBobiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgcHN5bS0+c3Rfc2l6ZSwKKwkJICAgICAgZ2V0X3N5bWJvbF90eXBlIChFTEZfU1RfVFlQRSAocHN5bS0+c3RfaW5mbykpLAorCQkgICAgICBnZXRfc3ltYm9sX2JpbmRpbmcgKEVMRl9TVF9CSU5EIChwc3ltLT5zdF9pbmZvKSksCisJCSAgICAgIHBzeW0tPnN0X290aGVyKTsKKworCSAgICAgIHByaW50ZiAoIiUzLjNzIiwgZ2V0X3N5bWJvbF9pbmRleF90eXBlIChwc3ltLT5zdF9zaG5keCkpOworCisJICAgICAgcHJpbnRmICgiICVzXG4iLCBkeW5hbWljX3N0cmluZ3MgKyBwc3ltLT5zdF9uYW1lKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UgaWYgKGRvX3N5bXMgJiYgIWRvX3VzaW5nX2R5bmFtaWMpCisgICAgeworICAgICAgdW5zaWduZWQgaW50ICAgICBpOworCisgICAgICBmb3IgKGkgPSAwLCBzZWN0aW9uID0gc2VjdGlvbl9oZWFkZXJzOworCSAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07CisJICAgaSsrLCBzZWN0aW9uKyspCisJeworCSAgdW5zaWduZWQgaW50ICAgICAgICAgIHNpOworCSAgY2hhciAqICAgICAgICAgICAgICAgIHN0cnRhYjsKKwkgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBzeW10YWI7CisJICBFbGZfSW50ZXJuYWxfU3ltICogICAgcHN5bTsKKworCisJICBpZiAoICAgc2VjdGlvbi0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCCisJICAgICAgJiYgc2VjdGlvbi0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQorCSAgICBjb250aW51ZTsKKworCSAgcHJpbnRmIChfKCJcblN5bWJvbCB0YWJsZSAnJXMnIGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIiksCisJCSAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwKKwkJICAodW5zaWduZWQgbG9uZykgKHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplKSk7CisJICBmcHV0cyAoXygiICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIE90ICBOZHggTmFtZVxuIiksCisJCSBzdGRvdXQpOworCisJICBzeW10YWIgPSBnZXRfZWxmX3N5bWJvbHMgKGZpbGUsIHNlY3Rpb24tPnNoX29mZnNldCwKKwkJCQkgICAgc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpOworCSAgaWYgKHN5bXRhYiA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKHNlY3Rpb24tPnNoX2xpbmsgPT0gZWxmX2hlYWRlci5lX3Noc3RybmR4KQorCSAgICBzdHJ0YWIgPSBzdHJpbmdfdGFibGU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc3RyaW5nX3NlYzsKKworCSAgICAgIHN0cmluZ19zZWMgPSBzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rOworCisJICAgICAgR0VUX0RBVEFfQUxMT0MgKHN0cmluZ19zZWMtPnNoX29mZnNldCwgc3RyaW5nX3NlYy0+c2hfc2l6ZSwKKwkJCSAgICAgIHN0cnRhYiwgY2hhciAqLCAic3RyaW5nIHRhYmxlIik7CisJICAgIH0KKworCSAgZm9yIChzaSA9IDAsIHBzeW0gPSBzeW10YWI7CisJICAgICAgIHNpIDwgc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemU7CisJICAgICAgIHNpICsrLCBwc3ltICsrKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiICAlM2Q6ICU4bHggJTVsZCAlLTdzICUtNnMgJTJkICIsCisJCSAgICAgIHNpLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgcHN5bS0+c3RfdmFsdWUsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF9zaXplLAorCQkgICAgICBnZXRfc3ltYm9sX3R5cGUgKEVMRl9TVF9UWVBFIChwc3ltLT5zdF9pbmZvKSksCisJCSAgICAgIGdldF9zeW1ib2xfYmluZGluZyAoRUxGX1NUX0JJTkQgKHBzeW0tPnN0X2luZm8pKSwKKwkJICAgICAgcHN5bS0+c3Rfb3RoZXIpOworCisJICAgICAgaWYgKHBzeW0tPnN0X3NobmR4ID09IDApCisJCWZwdXRzICgiIFVORCIsIHN0ZG91dCk7CisJICAgICAgZWxzZSBpZiAoKHBzeW0tPnN0X3NobmR4ICYgMHhmZmZmKSA9PSAweGZmZjEpCisJCWZwdXRzICgiIEFCUyIsIHN0ZG91dCk7CisJICAgICAgZWxzZSBpZiAoKHBzeW0tPnN0X3NobmR4ICYgMHhmZmZmKSA9PSAweGZmZjIpCisJCWZwdXRzICgiIENPTSIsIHN0ZG91dCk7CisJICAgICAgZWxzZQorCQlwcmludGYgKCIlNHgiLCBwc3ltLT5zdF9zaG5keCk7CisKKwkgICAgICBwcmludGYgKCIgJXMiLCBzdHJ0YWIgKyBwc3ltLT5zdF9uYW1lKTsKKworCSAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0gJiYKKwkJICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldICE9IDApCisJCXsKKwkJICB1bnNpZ25lZCBjaGFyICAgZGF0YVsyXTsKKwkJICB1bnNpZ25lZCBzaG9ydCAgdmVyc19kYXRhOworCQkgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7CisJCSAgaW50ICAgICAgICAgICAgIGlzX25vYml0czsKKwkJICBpbnQgICAgICAgICAgICAgY2hlY2tfZGVmOworCisJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQorCQkgICAgLSBsb2FkYWRkcjsKKworCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBzaSAqIHNpemVvZiAodmVyc19kYXRhKSwgZGF0YSwKKwkJCSAgICAidmVyc2lvbiBkYXRhIik7CisKKwkJICB2ZXJzX2RhdGEgPSBieXRlX2dldCAoZGF0YSwgMik7CisKKwkJICBpc19ub2JpdHMgPSBwc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUgPworCQkgICAgKHNlY3Rpb25faGVhZGVycyBbcHN5bS0+c3Rfc2huZHhdLnNoX3R5cGUgPT0gU0hUX05PQklUUykKKwkJICAgIDogMDsKKworCQkgIGNoZWNrX2RlZiA9IChwc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpOworCisJCSAgaWYgKCh2ZXJzX2RhdGEgJiAweDgwMDApIHx8IHZlcnNfZGF0YSA+IDEpCisJCSAgICB7CisJCSAgICAgIGlmIChpc19ub2JpdHMgfHwgISBjaGVja19kZWYpCisJCQl7CisJCQkgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICBldm47CisJCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICBpdm47CisJCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICBpdm5hOworCisJCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KKwkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCisJCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXSAtIGxvYWRhZGRyOworCisJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOworCisJCQkgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOworCQkJICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7CisKKwkJCSAgZG8KKwkJCSAgICB7CisJCQkgICAgICB1bnNpZ25lZCBsb25nICB2bmFfb2ZmOworCisJCQkgICAgICB2bmFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKKworCQkJICAgICAgZG8KKwkJCQl7CisJCQkJICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgZXZuYTsKKworCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCisJCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMykiKTsKKworCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOworCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7CisJCQkJICBpdm5hLnZuYV9uYW1lICA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKKworCQkJCSAgdm5hX29mZiArPSBpdm5hLnZuYV9uZXh0OworCQkJCX0KKwkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSB2ZXJzX2RhdGEKKwkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7CisKKwkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSB2ZXJzX2RhdGEpCisJCQkJYnJlYWs7CisKKwkJCSAgICAgIG9mZnNldCArPSBpdm4udm5fbmV4dDsKKwkJCSAgICB9CisJCQkgIHdoaWxlIChpdm4udm5fbmV4dCAhPSAwKTsKKworCQkJICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQorCQkJICAgIHsKKwkJCSAgICAgIHByaW50ZiAoIkAlcyAoJWQpIiwKKwkJCQkgICAgICBzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLCBpdm5hLnZuYV9vdGhlcik7CisJCQkgICAgICBjaGVja19kZWYgPSAwOworCQkJICAgIH0KKwkJCSAgZWxzZSBpZiAoISBpc19ub2JpdHMpCisJCQkgICAgZXJyb3IgKF8oImJhZCBkeW5hbWljIHN5bWJvbCIpKTsKKwkJCSAgZWxzZQorCQkJICAgIGNoZWNrX2RlZiA9IDE7CisJCQl9CisKKwkJICAgICAgaWYgKGNoZWNrX2RlZikKKwkJCXsKKwkJCSAgaWYgKHZlcnNfZGF0YSAhPSAweDgwMDEpCisJCQkgICAgeworCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAgICAgaXZkOworCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggICAgaXZkYTsKKwkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOworCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgb2Zmc2V0OworCisJCQkgICAgICBvZmZzZXQgPQorCQkJCXZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSREVGKV0KKwkJCQktIGxvYWRhZGRyOworCisJCQkgICAgICBkbworCQkJCXsKKwkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgICBldmQ7CisKKwkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwgInZlcnNpb24gZGVmIik7CisKKwkJCQkgIGl2ZC52ZF9uZHggID0gQllURV9HRVQgKGV2ZC52ZF9uZHgpOworCQkJCSAgaXZkLnZkX2F1eCAgPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7CisJCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7CisKKwkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKKwkJCQl9CisJCQkgICAgICB3aGlsZSAoaXZkLnZkX25keCAhPSAodmVyc19kYXRhICYgMHg3ZmZmKQorCQkJCSAgICAgJiYgaXZkLnZkX25leHQgIT0gMCk7CisKKwkJCSAgICAgIG9mZnNldCAtPSBpdmQudmRfbmV4dDsKKwkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfYXV4OworCisJCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7CisKKwkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7CisKKwkJCSAgICAgIGlmIChwc3ltLT5zdF9uYW1lICE9IGl2ZGEudmRhX25hbWUpCisJCQkJcHJpbnRmICgodmVyc19kYXRhICYgMHg4MDAwKQorCQkJCQk/ICJAJXMiIDogIkBAJXMiLAorCQkJCQlzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIHB1dGNoYXIgKCdcbicpOworCSAgICB9CisKKwkgIGZyZWUgKHN5bXRhYik7CisJICBpZiAoc3RydGFiICE9IHN0cmluZ190YWJsZSkKKwkgICAgZnJlZSAoc3RydGFiKTsKKwl9CisgICAgfQorICBlbHNlIGlmIChkb19zeW1zKQorICAgIHByaW50ZgorICAgICAgKF8oIlxuRHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyBzeW1ib2xzLlxuIikpOworCisgIGlmIChkb19oaXN0b2dyYW0gJiYgYnVja2V0cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCAqbGVuZ3RoczsKKyAgICAgIGludCAqY291bnRzOworICAgICAgaW50IGhuOworICAgICAgaW50IHNpOworICAgICAgaW50IG1heGxlbmd0aCA9IDA7CisgICAgICBpbnQgbnplcm9fY291bnRzID0gMDsKKyAgICAgIGludCBuc3ltcyA9IDA7CisKKyAgICAgIHByaW50ZiAoXygiXG5IaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4iKSwKKwkgICAgICBuYnVja2V0cyk7CisgICAgICBwcmludGYgKF8oIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iKSk7CisKKyAgICAgIGxlbmd0aHMgPSAoaW50ICopIGNhbGxvYyAobmJ1Y2tldHMsIHNpemVvZiAoaW50KSk7CisgICAgICBpZiAobGVuZ3RocyA9PSBOVUxMKQorCXsKKwkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCisJeworCSAgaWYgKCEgYnVja2V0cyBbaG5dKQorCSAgICBjb250aW51ZTsKKworCSAgZm9yIChzaSA9IGJ1Y2tldHNbaG5dOyBzaTsgc2kgPSBjaGFpbnNbc2ldKQorCSAgICB7CisJICAgICAgKytuc3ltczsKKwkgICAgICBpZiAobWF4bGVuZ3RoIDwgKytsZW5ndGhzW2huXSkKKwkJKyttYXhsZW5ndGg7CisJICAgIH0KKwl9CisKKyAgICAgIGNvdW50cyA9IChpbnQgKikgY2FsbG9jIChtYXhsZW5ndGggKyAxLCBzaXplb2YgKGludCkpOworICAgICAgaWYgKGNvdW50cyA9PSBOVUxMKQorCXsKKwkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgKytobikKKwkrKyBjb3VudHMgW2xlbmd0aHMgW2huXV07CisKKyAgICAgIHByaW50ZiAoIiAgICAgIDAgICUtMTBkICglNS4xZiUlKVxuIiwKKwkgICAgICBjb3VudHNbMF0sIChjb3VudHNbMF0gKiAxMDAuMCkgLyBuYnVja2V0cyk7CisgICAgICBmb3IgKHNpID0gMTsgc2kgPD0gbWF4bGVuZ3RoOyArK3NpKQorCXsKKwkgIG56ZXJvX2NvdW50cyArPSBjb3VudHNbc2ldICogc2k7CisJICBwcmludGYgKCIlN2QgICUtMTBkICglNS4xZiUlKSAgICAlNS4xZiUlXG4iLAorCQkgIHNpLCBjb3VudHNbc2ldLCAoY291bnRzW3NpXSAqIDEwMC4wKSAvIG5idWNrZXRzLAorCQkgIChuemVyb19jb3VudHMgKiAxMDAuMCkgLyBuc3ltcyk7CisJfQorCisgICAgICBmcmVlIChjb3VudHMpOworICAgICAgZnJlZSAobGVuZ3Rocyk7CisgICAgfQorCisgIGlmIChidWNrZXRzICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoYnVja2V0cyk7CisgICAgICBmcmVlIChjaGFpbnMpOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19zeW1pbmZvIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgaW50IGk7CisKKyAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMCisgICAgICB8fCAhZG9fZHluYW1pYykKKyAgICAvKiBObyBzeW1pbmZvLCB0aGlzIGlzIG9rLiAgKi8KKyAgICByZXR1cm4gMTsKKworICAvKiBUaGVyZSBiZXR0ZXIgc2hvdWxkIGJlIGEgZHluYW1pYyBzeW1ib2wgc2VjdGlvbi4gICovCisgIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCB8fCBkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoZHluYW1pY19hZGRyKQorICAgIHByaW50ZiAoXygiXG5EeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIpLAorCSAgICBkeW5hbWljX3N5bWluZm9fb2Zmc2V0LCBkeW5hbWljX3N5bWluZm9fbmVudCk7CisKKyAgcHJpbnRmIChfKCIgTnVtOiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmRUbyAgICAgRmxhZ3NcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OyArK2kpCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgaW50IGZsYWdzID0gZHluYW1pY19zeW1pbmZvW2ldLnNpX2ZsYWdzOworCisgICAgICBwcmludGYgKCIlNGQ6ICUtMzBzICIsIGksCisJICAgICAgZHluYW1pY19zdHJpbmdzICsgZHluYW1pY19zeW1ib2xzW2ldLnN0X25hbWUpOworCisgICAgICBzd2l0Y2ggKGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvKQorCXsKKwljYXNlIFNZTUlORk9fQlRfU0VMRjoKKwkgIGZwdXRzICgiU0VMRiAgICAgICAiLCBzdGRvdXQpOworCSAgYnJlYWs7CisJY2FzZSBTWU1JTkZPX0JUX1BBUkVOVDoKKwkgIGZwdXRzICgiUEFSRU5UICAgICAiLCBzdGRvdXQpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGlmIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA+IDAKKwkgICAgICAmJiBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA8IGR5bmFtaWNfc2l6ZSkKKwkgICAgcHJpbnRmICgiJS0xMHMgIiwKKwkJICAgIGR5bmFtaWNfc3RyaW5ncworCQkgICAgKyBkeW5hbWljX3NlZ21lbnRbZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG9dLmRfdW4uZF92YWwpOworCSAgZWxzZQorCSAgICBwcmludGYgKCIlLTEwZCAiLCBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0RJUkVDVCkKKwlwcmludGYgKCIgRElSRUNUIik7CisgICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19QQVNTVEhSVSkKKwlwcmludGYgKCIgUEFTU1RIUlUiKTsKKyAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0NPUFkpCisJcHJpbnRmICgiIENPUFkiKTsKKyAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0xBWllMT0FEKQorCXByaW50ZiAoIiBMQVpZTE9BRCIpOworCisgICAgICBwdXRzICgiIik7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisjaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQorc3RhdGljIHZvaWQKK2Rpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpCisgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOworICAgICBGSUxFICogZmlsZTsKK3sKKyAgcHJpbnRmIChfKCJcbkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIiksCisJICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKKworICAvKiBYWFggLS0gdG8gYmUgZG9uZSAtLS0gWFhYICovCisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorZHVtcF9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQorICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKKyAgICAgRklMRSAqIGZpbGU7Cit7CisgIGludCAgICAgICAgICAgICBieXRlczsKKyAgaW50ICAgICAgICAgICAgIGFkZHI7CisgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOworICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7CisKKyAgYnl0ZXMgPSBzZWN0aW9uLT5zaF9zaXplOworCisgIGlmIChieXRlcyA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIpLAorCSAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgcHJpbnRmIChfKCJcbkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKKworICBhZGRyID0gc2VjdGlvbi0+c2hfYWRkcjsKKworICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBieXRlcywgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKKwkJICAic2VjdGlvbiBkYXRhIik7CisKKyAgZGF0YSA9IHN0YXJ0OworCisgIHdoaWxlIChieXRlcykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIGludCBrOworICAgICAgaW50IGxieXRlczsKKworICAgICAgbGJ5dGVzID0gKGJ5dGVzID4gMTYgPyAxNiA6IGJ5dGVzKTsKKworICAgICAgcHJpbnRmICgiICAweCU4Ljh4ICIsIGFkZHIpOworCisgICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfREFUQV0pCisJeworCWNhc2UgRUxGREFUQTJMU0I6CisJICBmb3IgKGogPSAxNTsgaiA+PSAwOyBqIC0tKQorCSAgICB7CisJICAgICAgaWYgKGogPCBsYnl0ZXMpCisJCXByaW50ZiAoIiUyLjJ4IiwgZGF0YSBbal0pOworCSAgICAgIGVsc2UKKwkJcHJpbnRmICgiICAiKTsKKworCSAgICAgIGlmICghKGogJiAweDMpKQorCQlwcmludGYgKCIgIik7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBFTEZEQVRBMk1TQjoKKwkgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCSAgICB7CisJICAgICAgaWYgKGogPCBsYnl0ZXMpCisJCXByaW50ZiAoIiUyLjJ4IiwgZGF0YSBbal0pOworCSAgICAgIGVsc2UKKwkJcHJpbnRmICgiICAiKTsKKworCSAgICAgIGlmICgoaiAmIDMpID09IDMpCisJCXByaW50ZiAoIiAiKTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorCisgICAgICBmb3IgKGogPSAwOyBqIDwgbGJ5dGVzOyBqKyspCisJeworCSAgayA9IGRhdGEgW2pdOworCSAgaWYgKGsgPj0gJyAnICYmIGsgPCAweDgwKQorCSAgICBwcmludGYgKCIlYyIsIGspOworCSAgZWxzZQorCSAgICBwcmludGYgKCIuIik7CisJfQorCisgICAgICBwdXRjaGFyICgnXG4nKTsKKworICAgICAgZGF0YSAgKz0gbGJ5dGVzOworICAgICAgYWRkciAgKz0gbGJ5dGVzOworICAgICAgYnl0ZXMgLT0gbGJ5dGVzOworICAgIH0KKworICBmcmVlIChzdGFydCk7CisKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50CityZWFkX2xlYjEyOCAoZGF0YSwgbGVuZ3RoX3JldHVybiwgc2lnbikKKyAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7CisgICAgIGludCAqICAgICAgICAgICBsZW5ndGhfcmV0dXJuOworICAgICBpbnQgICAgICAgICAgICAgc2lnbjsKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmVzdWx0ID0gMDsKKyAgdW5zaWduZWQgaW50ICAgICAgbnVtX3JlYWQgPSAwOworICBpbnQgICAgICAgICAgICAgICBzaGlmdCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgICAgIGJ5dGU7CisKKyAgZG8KKyAgICB7CisgICAgICBieXRlID0gKiBkYXRhICsrOworICAgICAgbnVtX3JlYWQgKys7CisKKyAgICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworCisgICAgICBzaGlmdCArPSA3OworCisgICAgfQorICB3aGlsZSAoYnl0ZSAmIDB4ODApOworCisgIGlmIChsZW5ndGhfcmV0dXJuICE9IE5VTEwpCisgICAgKiBsZW5ndGhfcmV0dXJuID0gbnVtX3JlYWQ7CisKKyAgaWYgKHNpZ24gJiYgKHNoaWZ0IDwgMzIpICYmIChieXRlICYgMHg0MCkpCisgICAgcmVzdWx0IHw9IC0xIDw8IHNoaWZ0OworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IFN0YXRlX01hY2hpbmVfUmVnaXN0ZXJzCit7CisgIHVuc2lnbmVkIGxvbmcJYWRkcmVzczsKKyAgdW5zaWduZWQgaW50ICBmaWxlOworICB1bnNpZ25lZCBpbnQgIGxpbmU7CisgIHVuc2lnbmVkIGludCAgY29sdW1uOworICBpbnQgICAgICAgICAgIGlzX3N0bXQ7CisgIGludCAgICAgICAgICAgYmFzaWNfYmxvY2s7CisgIGludAkgICAgICAgIGVuZF9zZXF1ZW5jZTsKKy8qIFRoaXMgdmFyaWFibGUgaG9sZCB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IGVudHJ5IHNlZW4KKyAgIGluIHRoZSBGaWxlIFRhYmxlLiAgKi8KKyAgdW5zaWduZWQgaW50ICBsYXN0X2ZpbGVfZW50cnk7Cit9IFNNUjsKKworc3RhdGljIFNNUiBzdGF0ZV9tYWNoaW5lX3JlZ3M7CisKK3N0YXRpYyB2b2lkCityZXNldF9zdGF0ZV9tYWNoaW5lIChpc19zdG10KQorICAgICBpbnQgaXNfc3RtdDsKK3sKKyAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgPSAwOworICBzdGF0ZV9tYWNoaW5lX3JlZ3MuZmlsZSA9IDE7CisgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lID0gMTsKKyAgc3RhdGVfbWFjaGluZV9yZWdzLmNvbHVtbiA9IDA7CisgIHN0YXRlX21hY2hpbmVfcmVncy5pc19zdG10ID0gaXNfc3RtdDsKKyAgc3RhdGVfbWFjaGluZV9yZWdzLmJhc2ljX2Jsb2NrID0gMDsKKyAgc3RhdGVfbWFjaGluZV9yZWdzLmVuZF9zZXF1ZW5jZSA9IDA7CisgIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkgPSAwOworfQorCisvKiBIYW5kbGVkIGFuIGV4dGVuZCBsaW5lIG9wLiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIGVuZAorICAgb2Ygc2VxdWVuY2UuICAqLworc3RhdGljIGludAorcHJvY2Vzc19leHRlbmRlZF9saW5lX29wIChkYXRhLCBpc19zdG10KQorICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKKyAgICAgaW50IGlzX3N0bXQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgICBvcF9jb2RlOworICBpbnQgICAgICAgICAgICAgYnl0ZXNfcmVhZDsKKyAgdW5zaWduZWQgaW50ICAgIGxlbjsKKyAgdW5zaWduZWQgY2hhciAqIG5hbWU7CisgIHVuc2lnbmVkIGxvbmcgICBhZHI7CisgIAorICBsZW4gPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKKyAgZGF0YSArPSBieXRlc19yZWFkOworCisgIGlmIChsZW4gPT0gMCkKKyAgICB7CisgICAgICB3YXJuIChfKCJiYWRseSBmb3JtZWQgZXh0ZW5kZWQgbGluZSBvcCBlbmNvdW50ZXJlZCEiKSk7CisgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICB9CisKKyAgbGVuICs9IGJ5dGVzX3JlYWQ7CisgIG9wX2NvZGUgPSAqIGRhdGEgKys7CisKKyAgcHJpbnRmIChfKCIgIEV4dGVuZGVkIG9wY29kZSAlZDogIiksIG9wX2NvZGUpOworICAKKyAgc3dpdGNoIChvcF9jb2RlKQorICAgIHsKKyAgICBjYXNlIERXX0xORV9lbmRfc2VxdWVuY2U6CisgICAgICBwcmludGYgKF8oIkVuZCBvZiBTZXF1ZW5jZVxuXG4iKSk7CisgICAgICByZXNldF9zdGF0ZV9tYWNoaW5lIChpc19zdG10KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19MTkVfc2V0X2FkZHJlc3M6CisgICAgICAvKiBYWFggLSBhc3N1bXB0aW9uIGhlcmUgdGhhdCBhZGRyZXNzIHNpemUgaXMgNCEgKi8KKyAgICAgIGFkciA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKKyAgICAgIHByaW50ZiAoXygic2V0IEFkZHJlc3MgdG8gMHglbHhcbiIpLCBhZHIpOworICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgPSBhZHI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfTE5FX2RlZmluZV9maWxlOgorICAgICAgcHJpbnRmIChfKCIgIGRlZmluZSBuZXcgRmlsZSBUYWJsZSBlbnRyeVxuIikpOworICAgICAgcHJpbnRmIChfKCIgIEVudHJ5XHREaXJcdFRpbWVcdFNpemVcdE5hbWVcbiIpKTsKKwkgCisgICAgICBwcmludGYgKF8oIiAgICVkXHQiKSwgKysgc3RhdGVfbWFjaGluZV9yZWdzLmxhc3RfZmlsZV9lbnRyeSk7CisgICAgICBuYW1lID0gZGF0YTsKKyAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7CisgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKKyAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOworICAgICAgZGF0YSArPSBieXRlc19yZWFkOworICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7CisgICAgICBwcmludGYgKF8oIiVzXG5cbiIpLCBuYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50ZiAoXygiVU5LTk9XTjogbGVuZ3RoICVkXG4iKSwgbGVuIC0gYnl0ZXNfcmVhZCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGxlbjsKK30KKworCitzdGF0aWMgaW50CitkaXNwbGF5X2RlYnVnX2xpbmVzIChzZWN0aW9uLCBzdGFydCwgZmlsZSkKKyAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHNlY3Rpb247CisgICAgIHVuc2lnbmVkIGNoYXIgKiAgICAgICBzdGFydDsKKyAgICAgRklMRSAqICAgICAgICAgICAgICAgIGZpbGU7Cit7CisgIERXQVJGMl9FeHRlcm5hbF9MaW5lSW5mbyAqIGV4dGVybmFsOworICBEV0FSRjJfSW50ZXJuYWxfTGluZUluZm8gICBpbmZvOworICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBzdGFuZGFyZF9vcGNvZGVzOworICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBkYXRhID0gc3RhcnQ7CisgIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZCAgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZF9vZl9zZXF1ZW5jZTsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKKworICBwcmludGYgKF8oIlxuRHVtcCBvZiBkZWJ1ZyBjb250ZW50cyBvZiBzZWN0aW9uICVzOlxuXG4iKSwKKwkgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOworCisgIHdoaWxlIChkYXRhIDwgZW5kKQorICAgIHsKKyAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9MaW5lSW5mbyAqKSBkYXRhOworCisgICAgICAvKiBDaGVjayB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jay4gICovCisgICAgICBpbmZvLmxpX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGVuZ3RoKTsKKyAgICAgIGlmIChpbmZvLmxpX2xlbmd0aCA+IHNlY3Rpb24tPnNoX3NpemUpCisJeworCSAgd2FybgorCSAgICAoXygiVGhlIGxpbmUgaW5mbyBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQgLSB0aGUgc2VjdGlvbiBpcyB0b28gc21hbGxcbiIpKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgICAgLyogQ2hlY2sgaXRzIHZlcnNpb24gbnVtYmVyLiAgKi8KKyAgICAgIGluZm8ubGlfdmVyc2lvbiA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfdmVyc2lvbik7CisgICAgICBpZiAoaW5mby5saV92ZXJzaW9uICE9IDIpCisJeworCSAgd2FybiAoXygiT25seSBEV0FSRiB2ZXJzaW9uIDIgbGluZSBpbmZvIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9wcm9sb2d1ZV9sZW5ndGgpOworICAgICAgaW5mby5saV9taW5faW5zbl9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX21pbl9pbnNuX2xlbmd0aCk7CisgICAgICBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfZGVmYXVsdF9pc19zdG10KTsKKyAgICAgIGluZm8ubGlfbGluZV9iYXNlICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX2Jhc2UpOworICAgICAgaW5mby5saV9saW5lX3JhbmdlICAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xpbmVfcmFuZ2UpOworICAgICAgaW5mby5saV9vcGNvZGVfYmFzZSAgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX29wY29kZV9iYXNlKTsKKyAgICAgIAorICAgICAgLyogU2lnbiBleHRlbmQgdGhlIGxpbmUgYmFzZSBmaWVsZC4gICovCisgICAgICBpbmZvLmxpX2xpbmVfYmFzZSA8PD0gMjQ7CisgICAgICBpbmZvLmxpX2xpbmVfYmFzZSA+Pj0gMjQ7CisgICAgICAKKyAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICVsZFxuIiksIGluZm8ubGlfbGVuZ3RoKTsKKyAgICAgIHByaW50ZiAoXygiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV92ZXJzaW9uKTsKKyAgICAgIHByaW50ZiAoXygiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9wcm9sb2d1ZV9sZW5ndGgpOworICAgICAgcHJpbnRmIChfKCIgIE1pbmltdW0gSW5zdHJ1Y3Rpb24gTGVuZ3RoOiAgJWRcbiIpLCBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCk7CisgICAgICBwcmludGYgKF8oIiAgSW5pdGlhbCB2YWx1ZSBvZiAnaXNfc3RtdCc6ICAlZFxuIiksIGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKKyAgICAgIHByaW50ZiAoXygiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX2Jhc2UpOworICAgICAgcHJpbnRmIChfKCIgIExpbmUgUmFuZ2U6ICAgICAgICAgICAgICAgICAgJWRcbiIpLCBpbmZvLmxpX2xpbmVfcmFuZ2UpOworICAgICAgcHJpbnRmIChfKCIgIE9wY29kZSBCYXNlOiAgICAgICAgICAgICAgICAgJWRcbiIpLCBpbmZvLmxpX29wY29kZV9iYXNlKTsKKworICAgICAgZW5kX29mX3NlcXVlbmNlID0gZGF0YSArIGluZm8ubGlfbGVuZ3RoICsgc2l6ZW9mIChpbmZvLmxpX2xlbmd0aCk7CisKKyAgICAgIHJlc2V0X3N0YXRlX21hY2hpbmUgKGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKKyAgICAgIAorICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIE9wY29kZXMgdGFibGUuICAqLworICAgICAgc3RhbmRhcmRfb3Bjb2RlcyA9IGRhdGEgKyBzaXplb2YgKCogZXh0ZXJuYWwpOworICAgICAgCisgICAgICBwcmludGYgKF8oIlxuIE9wY29kZXM6XG4iKSk7CisgICAgICAKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBpbmZvLmxpX29wY29kZV9iYXNlOyBpKyspCisJcHJpbnRmIChfKCIgIE9wY29kZSAlZCBoYXMgJWQgYXJnc1xuIiksIGksIHN0YW5kYXJkX29wY29kZXNbaV0pOworICAgICAgCisgICAgICAvKiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgRGlyZWN0b3J5IHRhYmxlLiAgKi8KKyAgICAgIGRhdGEgPSBzdGFuZGFyZF9vcGNvZGVzICsgaW5mby5saV9vcGNvZGVfYmFzZSAtIDE7CisgICAgICAKKyAgICAgIGlmICgqIGRhdGEgPT0gMCkKKwlwcmludGYgKF8oIlxuIFRoZSBEaXJlY3RvcnkgVGFibGUgaXMgZW1wdHkuXG4iKSk7CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmIChfKCJcbiBUaGUgRGlyZWN0b3J5IFRhYmxlOlxuIikpOworCSAgCisJICB3aGlsZSAoKiBkYXRhICE9IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKF8oIiAgJXNcbiIpLCBkYXRhKTsKKwkgICAgICAKKwkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOworCSAgICB9CisJfQorICAgICAgCisgICAgICAvKiBTa2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLworICAgICAgZGF0YSArKzsKKyAgICAgIAorICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIEZpbGUgTmFtZSB0YWJsZS4gICovCisgICAgICBpZiAoKiBkYXRhID09IDApCisJcHJpbnRmIChfKCJcbiBUaGUgRmlsZSBOYW1lIFRhYmxlIGlzIGVtcHR5LlxuIikpOworICAgICAgZWxzZQorCXsKKwkgIHByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZTpcbiIpKTsKKwkgIHByaW50ZiAoXygiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iKSk7CisJICAKKwkgIHdoaWxlICgqIGRhdGEgIT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKiBuYW1lOworCSAgICAgIGludCBieXRlc19yZWFkOworCSAgICAgIAorCSAgICAgIHByaW50ZiAoXygiICAlZFx0IiksICsrIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkpOworCSAgICAgIG5hbWUgPSBkYXRhOworCSAgICAgIAorCSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7CisJICAgICAgCisJICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7CisJICAgICAgZGF0YSArPSBieXRlc19yZWFkOworCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOworCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKKwkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKKwkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7CisJICAgICAgcHJpbnRmIChfKCIlc1xuIiksIG5hbWUpOworCSAgICB9CisJfQorICAgICAgCisgICAgICAvKiBTa2lwIHRoZSBOVUwgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLworICAgICAgZGF0YSArKzsKKyAgICAgIAorICAgICAgLyogTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuICAqLworICAgICAgcHJpbnRmIChfKCJcbiBMaW5lIE51bWJlciBTdGF0ZW1lbnRzOlxuIikpOworICAgICAgCisgICAgICAKKyAgICAgIHdoaWxlIChkYXRhIDwgZW5kX29mX3NlcXVlbmNlKQorCXsKKwkgIHVuc2lnbmVkIGNoYXIgb3BfY29kZTsKKwkgIGludCAgICAgICAgICAgYWR2OworCSAgaW50ICAgICAgICAgICBieXRlc19yZWFkOworCSAgCisJICBvcF9jb2RlID0gKiBkYXRhICsrOworCSAgCisJICBzd2l0Y2ggKG9wX2NvZGUpCisJICAgIHsKKwkgICAgY2FzZSBEV19MTlNfZXh0ZW5kZWRfb3A6CisJICAgICAgZGF0YSArPSBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgKGRhdGEsIGluZm8ubGlfZGVmYXVsdF9pc19zdG10KTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBEV19MTlNfY29weToKKwkgICAgICBwcmludGYgKF8oIiAgQ29weVxuIikpOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIERXX0xOU19hZHZhbmNlX3BjOgorCSAgICAgIGFkdiA9IGluZm8ubGlfbWluX2luc25fbGVuZ3RoICogcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7CisJICAgICAgZGF0YSArPSBieXRlc19yZWFkOworCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKKwkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIpLCBhZHYsCisJCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzKTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgorCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDEpOworCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKKwkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSArPSBhZHY7CisJICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgTGluZSBieSAlZCB0byAlZFxuIiksIGFkdiwKKwkJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUpOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIERXX0xOU19zZXRfZmlsZToKKwkgICAgICBhZHYgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKKwkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7CisJICAgICAgcHJpbnRmIChfKCIgIFNldCBGaWxlIE5hbWUgdG8gZW50cnkgJWQgaW4gdGhlIEZpbGUgTmFtZSBUYWJsZVxuIiksCisJCSAgICAgIGFkdik7CisJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmZpbGUgPSBhZHY7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46CisJICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7CisJICAgICAgZGF0YSArPSBieXRlc19yZWFkOworCSAgICAgIHByaW50ZiAoXygiICBTZXQgY29sdW1uIHRvICVkXG4iKSwgYWR2KTsKKwkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuY29sdW1uID0gYWR2OworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIERXX0xOU19uZWdhdGVfc3RtdDoKKwkgICAgICBhZHYgPSBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdDsKKwkgICAgICBhZHYgPSAhIGFkdjsKKwkgICAgICBwcmludGYgKF8oIiAgU2V0IGlzX3N0bXQgdG8gJWRcbiIpLCBhZHYpOworCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5pc19zdG10ID0gYWR2OworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIERXX0xOU19zZXRfYmFzaWNfYmxvY2s6CisJICAgICAgcHJpbnRmIChfKCIgIFNldCBiYXNpYyBibG9ja1xuIikpOworCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5iYXNpY19ibG9jayA9IDE7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKKwkgICAgICBhZHYgPSAoMjU1IC0gaW5mby5saV9vcGNvZGVfYmFzZSkgLyBpbmZvLmxpX2xpbmVfcmFuZ2U7CisJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OworCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGNvbnN0YW50ICVkIHRvIDB4JWx4XG4iKSwgYWR2LAorCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGM6CisJICAgICAgYWR2ID0gYnl0ZV9nZXQgKGRhdGEsIDIpOworCSAgICAgIGRhdGEgKz0gMjsKKwkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7CisJICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgZml4ZWQgc2l6ZSBhbW91bnQgJWQgdG8gMHglbHhcbiIpLAorCQkgICAgICBhZHYsIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzKTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgZGVmYXVsdDoKKwkgICAgICBvcF9jb2RlIC09IGluZm8ubGlfb3Bjb2RlX2Jhc2U7CisJICAgICAgYWR2ICAgICAgPSAob3BfY29kZSAvIGluZm8ubGlfbGluZV9yYW5nZSkgKiBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aDsKKwkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7CisJICAgICAgcHJpbnRmIChfKCIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiKSwKKwkJICAgICAgb3BfY29kZSwgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7CisJICAgICAgYWR2ICAgICs9IChvcF9jb2RlICUgaW5mby5saV9saW5lX3JhbmdlKSArIGluZm8ubGlfbGluZV9iYXNlOworCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lICs9IGFkdjsKKwkgICAgICBwcmludGYgKF8oIiBhbmQgTGluZSBieSAlZCB0byAlZFxuIiksCisJCSAgICAgIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9CisgIAorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZGlzcGxheV9kZWJ1Z19wdWJuYW1lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCisgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOworICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7CisgICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOworeworICBEV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXMgKiBleHRlcm5hbDsKKyAgRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzICAgcHVibmFtZXM7CisgIHVuc2lnbmVkIGNoYXIgKiAgICAgICAgICAgIGVuZDsKKworICBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7CisKKyAgcHJpbnRmIChfKCJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOworCisgIHdoaWxlIChzdGFydCA8IGVuZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7CisKKyAgICAgIGV4dGVybmFsID0gKERXQVJGMl9FeHRlcm5hbF9QdWJOYW1lcyAqKSBzdGFydDsKKworICAgICAgcHVibmFtZXMucG5fbGVuZ3RoICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fbGVuZ3RoKTsKKyAgICAgIHB1Ym5hbWVzLnBuX3ZlcnNpb24gPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX3ZlcnNpb24pOworICAgICAgcHVibmFtZXMucG5fb2Zmc2V0ICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cG5fb2Zmc2V0KTsKKyAgICAgIHB1Ym5hbWVzLnBuX3NpemUgICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX3NpemUpOworCisgICAgICBkYXRhICAgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7CisgICAgICBzdGFydCArPSBwdWJuYW1lcy5wbl9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5wbl9sZW5ndGgpOworCisgICAgICBpZiAocHVibmFtZXMucG5fdmVyc2lvbiAhPSAyKQorCXsKKwkgIHdhcm4gKF8oIk9ubHkgRFdBUkYgMiBwdWJuYW1lcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCIpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgcHJpbnRmIChfKCIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIpLAorCSAgICAgIHB1Ym5hbWVzLnBuX2xlbmd0aCk7CisgICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iKSwKKwkgICAgICBwdWJuYW1lcy5wbl92ZXJzaW9uKTsKKyAgICAgIHByaW50ZiAoXygiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbyBzZWN0aW9uOiAgICAgJWxkXG4iKSwKKwkgICAgICBwdWJuYW1lcy5wbl9vZmZzZXQpOworICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgYXJlYSBpbiAuZGVidWdfaW5mbyBzZWN0aW9uOiAlbGRcbiIpLAorCSAgICAgIHB1Ym5hbWVzLnBuX3NpemUpOworCisgICAgICBwcmludGYgKF8oIlxuICAgIE9mZnNldFx0TmFtZVxuIikpOworCisgICAgICBkbworCXsKKwkgIG9mZnNldCA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKKworCSAgaWYgKG9mZnNldCAhPSAwKQorCSAgICB7CisJICAgICAgZGF0YSArPSA0OworCSAgICAgIHByaW50ZiAoIiAgICAlbGRcdFx0JXNcbiIsIG9mZnNldCwgZGF0YSk7CisJICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChvZmZzZXQgIT0gMCk7CisgICAgfQorCisgIHByaW50ZiAoIlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfVEFHX25hbWUgKHRhZykKKyAgICAgdW5zaWduZWQgbG9uZyB0YWc7Cit7CisgIHN3aXRjaCAodGFnKQorICAgIHsKKyAgICBjYXNlIERXX1RBR19wYWRkaW5nOiByZXR1cm4gIkRXX1RBR19wYWRkaW5nIjsKKyAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOiByZXR1cm4gIkRXX1RBR19hcnJheV90eXBlIjsKKyAgICBjYXNlIERXX1RBR19jbGFzc190eXBlOiByZXR1cm4gIkRXX1RBR19jbGFzc190eXBlIjsKKyAgICBjYXNlIERXX1RBR19lbnRyeV9wb2ludDogcmV0dXJuICJEV19UQUdfZW50cnlfcG9pbnQiOworICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6IHJldHVybiAiRFdfVEFHX2VudW1lcmF0aW9uX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXI6IHJldHVybiAiRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIiOworICAgIGNhc2UgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uOiByZXR1cm4gIkRXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbiI7CisgICAgY2FzZSBEV19UQUdfbGFiZWw6IHJldHVybiAiRFdfVEFHX2xhYmVsIjsKKyAgICBjYXNlIERXX1RBR19sZXhpY2FsX2Jsb2NrOiByZXR1cm4gIkRXX1RBR19sZXhpY2FsX2Jsb2NrIjsKKyAgICBjYXNlIERXX1RBR19tZW1iZXI6IHJldHVybiAiRFdfVEFHX21lbWJlciI7CisgICAgY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOiByZXR1cm4gIkRXX1RBR19wb2ludGVyX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX3JlZmVyZW5jZV90eXBlOiByZXR1cm4gIkRXX1RBR19yZWZlcmVuY2VfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfY29tcGlsZV91bml0OiByZXR1cm4gIkRXX1RBR19jb21waWxlX3VuaXQiOworICAgIGNhc2UgRFdfVEFHX3N0cmluZ190eXBlOiByZXR1cm4gIkRXX1RBR19zdHJpbmdfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6IHJldHVybiAiRFdfVEFHX3N0cnVjdHVyZV90eXBlIjsKKyAgICBjYXNlIERXX1RBR19zdWJyb3V0aW5lX3R5cGU6IHJldHVybiAiRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfdHlwZWRlZjogcmV0dXJuICJEV19UQUdfdHlwZWRlZiI7CisgICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZTogcmV0dXJuICJEV19UQUdfdW5pb25fdHlwZSI7CisgICAgY2FzZSBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVyczogcmV0dXJuICJEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycyI7CisgICAgY2FzZSBEV19UQUdfdmFyaWFudDogcmV0dXJuICJEV19UQUdfdmFyaWFudCI7CisgICAgY2FzZSBEV19UQUdfY29tbW9uX2Jsb2NrOiByZXR1cm4gIkRXX1RBR19jb21tb25fYmxvY2siOworICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb246IHJldHVybiAiRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24iOworICAgIGNhc2UgRFdfVEFHX2luaGVyaXRhbmNlOiByZXR1cm4gIkRXX1RBR19pbmhlcml0YW5jZSI7CisgICAgY2FzZSBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lOiByZXR1cm4gIkRXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUiOworICAgIGNhc2UgRFdfVEFHX21vZHVsZTogcmV0dXJuICJEV19UQUdfbW9kdWxlIjsKKyAgICBjYXNlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGU6IHJldHVybiAiRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfc2V0X3R5cGU6IHJldHVybiAiRFdfVEFHX3NldF90eXBlIjsKKyAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdWJyYW5nZV90eXBlIjsKKyAgICBjYXNlIERXX1RBR193aXRoX3N0bXQ6IHJldHVybiAiRFdfVEFHX3dpdGhfc3RtdCI7CisgICAgY2FzZSBEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uOiByZXR1cm4gIkRXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb24iOworICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZTogcmV0dXJuICJEV19UQUdfYmFzZV90eXBlIjsKKyAgICBjYXNlIERXX1RBR19jYXRjaF9ibG9jazogcmV0dXJuICJEV19UQUdfY2F0Y2hfYmxvY2siOworICAgIGNhc2UgRFdfVEFHX2NvbnN0X3R5cGU6IHJldHVybiAiRFdfVEFHX2NvbnN0X3R5cGUiOworICAgIGNhc2UgRFdfVEFHX2NvbnN0YW50OiByZXR1cm4gIkRXX1RBR19jb25zdGFudCI7CisgICAgY2FzZSBEV19UQUdfZW51bWVyYXRvcjogcmV0dXJuICJEV19UQUdfZW51bWVyYXRvciI7CisgICAgY2FzZSBEV19UQUdfZmlsZV90eXBlOiByZXR1cm4gIkRXX1RBR19maWxlX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX2ZyaWVuZDogcmV0dXJuICJEV19UQUdfZnJpZW5kIjsKKyAgICBjYXNlIERXX1RBR19uYW1lbGlzdDogcmV0dXJuICJEV19UQUdfbmFtZWxpc3QiOworICAgIGNhc2UgRFdfVEFHX25hbWVsaXN0X2l0ZW06IHJldHVybiAiRFdfVEFHX25hbWVsaXN0X2l0ZW0iOworICAgIGNhc2UgRFdfVEFHX3BhY2tlZF90eXBlOiByZXR1cm4gIkRXX1RBR19wYWNrZWRfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfc3VicHJvZ3JhbTogcmV0dXJuICJEV19UQUdfc3VicHJvZ3JhbSI7CisgICAgY2FzZSBEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbTogcmV0dXJuICJEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbSI7CisgICAgY2FzZSBEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW06IHJldHVybiAiRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtIjsKKyAgICBjYXNlIERXX1RBR190aHJvd25fdHlwZTogcmV0dXJuICJEV19UQUdfdGhyb3duX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX3RyeV9ibG9jazogcmV0dXJuICJEV19UQUdfdHJ5X2Jsb2NrIjsKKyAgICBjYXNlIERXX1RBR192YXJpYW50X3BhcnQ6IHJldHVybiAiRFdfVEFHX3ZhcmlhbnRfcGFydCI7CisgICAgY2FzZSBEV19UQUdfdmFyaWFibGU6IHJldHVybiAiRFdfVEFHX3ZhcmlhYmxlIjsKKyAgICBjYXNlIERXX1RBR192b2xhdGlsZV90eXBlOiByZXR1cm4gIkRXX1RBR192b2xhdGlsZV90eXBlIjsKKyAgICBjYXNlIERXX1RBR19NSVBTX2xvb3A6IHJldHVybiAiRFdfVEFHX01JUFNfbG9vcCI7CisgICAgY2FzZSBEV19UQUdfZm9ybWF0X2xhYmVsOiByZXR1cm4gIkRXX1RBR19mb3JtYXRfbGFiZWwiOworICAgIGNhc2UgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlOiByZXR1cm4gIkRXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZSI7CisgICAgY2FzZSBEV19UQUdfY2xhc3NfdGVtcGxhdGU6IHJldHVybiAiRFdfVEFHX2NsYXNzX3RlbXBsYXRlIjsKKyAgICBkZWZhdWx0OgorICAgICAgeworCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKKworCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBUQUcgdmFsdWU6ICVseCIpLCB0YWcpOworCXJldHVybiBidWZmZXI7CisgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnZXRfQVRfbmFtZSAoYXR0cmlidXRlKQorICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZTsKK3sKKyAgc3dpdGNoIChhdHRyaWJ1dGUpCisgICAgeworICAgIGNhc2UgRFdfQVRfc2libGluZzogcmV0dXJuICJEV19BVF9zaWJsaW5nIjsKKyAgICBjYXNlIERXX0FUX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX2xvY2F0aW9uIjsKKyAgICBjYXNlIERXX0FUX25hbWU6IHJldHVybiAiRFdfQVRfbmFtZSI7CisgICAgY2FzZSBEV19BVF9vcmRlcmluZzogcmV0dXJuICJEV19BVF9vcmRlcmluZyI7CisgICAgY2FzZSBEV19BVF9zdWJzY3JfZGF0YTogcmV0dXJuICJEV19BVF9zdWJzY3JfZGF0YSI7CisgICAgY2FzZSBEV19BVF9ieXRlX3NpemU6IHJldHVybiAiRFdfQVRfYnl0ZV9zaXplIjsKKyAgICBjYXNlIERXX0FUX2JpdF9vZmZzZXQ6IHJldHVybiAiRFdfQVRfYml0X29mZnNldCI7CisgICAgY2FzZSBEV19BVF9iaXRfc2l6ZTogcmV0dXJuICJEV19BVF9iaXRfc2l6ZSI7CisgICAgY2FzZSBEV19BVF9lbGVtZW50X2xpc3Q6IHJldHVybiAiRFdfQVRfZWxlbWVudF9saXN0IjsKKyAgICBjYXNlIERXX0FUX3N0bXRfbGlzdDogcmV0dXJuICJEV19BVF9zdG10X2xpc3QiOworICAgIGNhc2UgRFdfQVRfbG93X3BjOiByZXR1cm4gIkRXX0FUX2xvd19wYyI7CisgICAgY2FzZSBEV19BVF9oaWdoX3BjOiByZXR1cm4gIkRXX0FUX2hpZ2hfcGMiOworICAgIGNhc2UgRFdfQVRfbGFuZ3VhZ2U6IHJldHVybiAiRFdfQVRfbGFuZ3VhZ2UiOworICAgIGNhc2UgRFdfQVRfbWVtYmVyOiByZXR1cm4gIkRXX0FUX21lbWJlciI7CisgICAgY2FzZSBEV19BVF9kaXNjcjogcmV0dXJuICJEV19BVF9kaXNjciI7CisgICAgY2FzZSBEV19BVF9kaXNjcl92YWx1ZTogcmV0dXJuICJEV19BVF9kaXNjcl92YWx1ZSI7CisgICAgY2FzZSBEV19BVF92aXNpYmlsaXR5OiByZXR1cm4gIkRXX0FUX3Zpc2liaWxpdHkiOworICAgIGNhc2UgRFdfQVRfaW1wb3J0OiByZXR1cm4gIkRXX0FUX2ltcG9ydCI7CisgICAgY2FzZSBEV19BVF9zdHJpbmdfbGVuZ3RoOiByZXR1cm4gIkRXX0FUX3N0cmluZ19sZW5ndGgiOworICAgIGNhc2UgRFdfQVRfY29tbW9uX3JlZmVyZW5jZTogcmV0dXJuICJEV19BVF9jb21tb25fcmVmZXJlbmNlIjsKKyAgICBjYXNlIERXX0FUX2NvbXBfZGlyOiByZXR1cm4gIkRXX0FUX2NvbXBfZGlyIjsKKyAgICBjYXNlIERXX0FUX2NvbnN0X3ZhbHVlOiByZXR1cm4gIkRXX0FUX2NvbnN0X3ZhbHVlIjsKKyAgICBjYXNlIERXX0FUX2NvbnRhaW5pbmdfdHlwZTogcmV0dXJuICJEV19BVF9jb250YWluaW5nX3R5cGUiOworICAgIGNhc2UgRFdfQVRfZGVmYXVsdF92YWx1ZTogcmV0dXJuICJEV19BVF9kZWZhdWx0X3ZhbHVlIjsKKyAgICBjYXNlIERXX0FUX2lubGluZTogcmV0dXJuICJEV19BVF9pbmxpbmUiOworICAgIGNhc2UgRFdfQVRfaXNfb3B0aW9uYWw6IHJldHVybiAiRFdfQVRfaXNfb3B0aW9uYWwiOworICAgIGNhc2UgRFdfQVRfbG93ZXJfYm91bmQ6IHJldHVybiAiRFdfQVRfbG93ZXJfYm91bmQiOworICAgIGNhc2UgRFdfQVRfcHJvZHVjZXI6IHJldHVybiAiRFdfQVRfcHJvZHVjZXIiOworICAgIGNhc2UgRFdfQVRfcHJvdG90eXBlZDogcmV0dXJuICJEV19BVF9wcm90b3R5cGVkIjsKKyAgICBjYXNlIERXX0FUX3JldHVybl9hZGRyOiByZXR1cm4gIkRXX0FUX3JldHVybl9hZGRyIjsKKyAgICBjYXNlIERXX0FUX3N0YXJ0X3Njb3BlOiByZXR1cm4gIkRXX0FUX3N0YXJ0X3Njb3BlIjsKKyAgICBjYXNlIERXX0FUX3N0cmlkZV9zaXplOiByZXR1cm4gIkRXX0FUX3N0cmlkZV9zaXplIjsKKyAgICBjYXNlIERXX0FUX3VwcGVyX2JvdW5kOiByZXR1cm4gIkRXX0FUX3VwcGVyX2JvdW5kIjsKKyAgICBjYXNlIERXX0FUX2Fic3RyYWN0X29yaWdpbjogcmV0dXJuICJEV19BVF9hYnN0cmFjdF9vcmlnaW4iOworICAgIGNhc2UgRFdfQVRfYWNjZXNzaWJpbGl0eTogcmV0dXJuICJEV19BVF9hY2Nlc3NpYmlsaXR5IjsKKyAgICBjYXNlIERXX0FUX2FkZHJlc3NfY2xhc3M6IHJldHVybiAiRFdfQVRfYWRkcmVzc19jbGFzcyI7CisgICAgY2FzZSBEV19BVF9hcnRpZmljaWFsOiByZXR1cm4gIkRXX0FUX2FydGlmaWNpYWwiOworICAgIGNhc2UgRFdfQVRfYmFzZV90eXBlczogcmV0dXJuICJEV19BVF9iYXNlX3R5cGVzIjsKKyAgICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjogcmV0dXJuICJEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24iOworICAgIGNhc2UgRFdfQVRfY291bnQ6IHJldHVybiAiRFdfQVRfY291bnQiOworICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246IHJldHVybiAiRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24iOworICAgIGNhc2UgRFdfQVRfZGVjbF9jb2x1bW46IHJldHVybiAiRFdfQVRfZGVjbF9jb2x1bW4iOworICAgIGNhc2UgRFdfQVRfZGVjbF9maWxlOiByZXR1cm4gIkRXX0FUX2RlY2xfZmlsZSI7CisgICAgY2FzZSBEV19BVF9kZWNsX2xpbmU6IHJldHVybiAiRFdfQVRfZGVjbF9saW5lIjsKKyAgICBjYXNlIERXX0FUX2RlY2xhcmF0aW9uOiByZXR1cm4gIkRXX0FUX2RlY2xhcmF0aW9uIjsKKyAgICBjYXNlIERXX0FUX2Rpc2NyX2xpc3Q6IHJldHVybiAiRFdfQVRfZGlzY3JfbGlzdCI7CisgICAgY2FzZSBEV19BVF9lbmNvZGluZzogcmV0dXJuICJEV19BVF9lbmNvZGluZyI7CisgICAgY2FzZSBEV19BVF9leHRlcm5hbDogcmV0dXJuICJEV19BVF9leHRlcm5hbCI7CisgICAgY2FzZSBEV19BVF9mcmFtZV9iYXNlOiByZXR1cm4gIkRXX0FUX2ZyYW1lX2Jhc2UiOworICAgIGNhc2UgRFdfQVRfZnJpZW5kOiByZXR1cm4gIkRXX0FUX2ZyaWVuZCI7CisgICAgY2FzZSBEV19BVF9pZGVudGlmaWVyX2Nhc2U6IHJldHVybiAiRFdfQVRfaWRlbnRpZmllcl9jYXNlIjsKKyAgICBjYXNlIERXX0FUX21hY3JvX2luZm86IHJldHVybiAiRFdfQVRfbWFjcm9faW5mbyI7CisgICAgY2FzZSBEV19BVF9uYW1lbGlzdF9pdGVtczogcmV0dXJuICJEV19BVF9uYW1lbGlzdF9pdGVtcyI7CisgICAgY2FzZSBEV19BVF9wcmlvcml0eTogcmV0dXJuICJEV19BVF9wcmlvcml0eSI7CisgICAgY2FzZSBEV19BVF9zZWdtZW50OiByZXR1cm4gIkRXX0FUX3NlZ21lbnQiOworICAgIGNhc2UgRFdfQVRfc3BlY2lmaWNhdGlvbjogcmV0dXJuICJEV19BVF9zcGVjaWZpY2F0aW9uIjsKKyAgICBjYXNlIERXX0FUX3N0YXRpY19saW5rOiByZXR1cm4gIkRXX0FUX3N0YXRpY19saW5rIjsKKyAgICBjYXNlIERXX0FUX3R5cGU6IHJldHVybiAiRFdfQVRfdHlwZSI7CisgICAgY2FzZSBEV19BVF91c2VfbG9jYXRpb246IHJldHVybiAiRFdfQVRfdXNlX2xvY2F0aW9uIjsKKyAgICBjYXNlIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlcjogcmV0dXJuICJEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXIiOworICAgIGNhc2UgRFdfQVRfdmlydHVhbGl0eTogcmV0dXJuICJEV19BVF92aXJ0dWFsaXR5IjsKKyAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uIjsKKyAgICBjYXNlIERXX0FUX01JUFNfZmRlOiByZXR1cm4gIkRXX0FUX01JUFNfZmRlIjsKKyAgICBjYXNlIERXX0FUX01JUFNfbG9vcF9iZWdpbjogcmV0dXJuICJEV19BVF9NSVBTX2xvb3BfYmVnaW4iOworICAgIGNhc2UgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4iOworICAgIGNhc2UgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4iOworICAgIGNhc2UgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3I6IHJldHVybiAiRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IiOworICAgIGNhc2UgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aDogcmV0dXJuICJEV19BVF9NSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoIjsKKyAgICBjYXNlIERXX0FUX01JUFNfbGlua2FnZV9uYW1lOiByZXR1cm4gIkRXX0FUX01JUFNfbGlua2FnZV9uYW1lIjsKKyAgICBjYXNlIERXX0FUX01JUFNfc3RyaWRlOiByZXR1cm4gIkRXX0FUX01JUFNfc3RyaWRlIjsKKyAgICBjYXNlIERXX0FUX01JUFNfYWJzdHJhY3RfbmFtZTogcmV0dXJuICJEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUiOworICAgIGNhc2UgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW46IHJldHVybiAiRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4iOworICAgIGNhc2UgRFdfQVRfTUlQU19oYXNfaW5saW5lczogcmV0dXJuICJEV19BVF9NSVBTX2hhc19pbmxpbmVzIjsKKyAgICBjYXNlIERXX0FUX3NmX25hbWVzOiByZXR1cm4gIkRXX0FUX3NmX25hbWVzIjsKKyAgICBjYXNlIERXX0FUX3NyY19pbmZvOiByZXR1cm4gIkRXX0FUX3NyY19pbmZvIjsKKyAgICBjYXNlIERXX0FUX21hY19pbmZvOiByZXR1cm4gIkRXX0FUX21hY19pbmZvIjsKKyAgICBjYXNlIERXX0FUX3NyY19jb29yZHM6IHJldHVybiAiRFdfQVRfc3JjX2Nvb3JkcyI7CisgICAgY2FzZSBEV19BVF9ib2R5X2JlZ2luOiByZXR1cm4gIkRXX0FUX2JvZHlfYmVnaW4iOworICAgIGNhc2UgRFdfQVRfYm9keV9lbmQ6IHJldHVybiAiRFdfQVRfYm9keV9lbmQiOworICAgIGRlZmF1bHQ6CisgICAgICB7CisJc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOworCisJc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIEFUIHZhbHVlOiAlbHgiKSwgYXR0cmlidXRlKTsKKwlyZXR1cm4gYnVmZmVyOworICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorZ2V0X0ZPUk1fbmFtZSAoZm9ybSkKKyAgICAgdW5zaWduZWQgbG9uZyBmb3JtOworeworICBzd2l0Y2ggKGZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9hZGRyOiByZXR1cm4gIkRXX0ZPUk1fYWRkciI7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMjogcmV0dXJuICJEV19GT1JNX2Jsb2NrMiI7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrNDogcmV0dXJuICJEV19GT1JNX2Jsb2NrNCI7CisgICAgY2FzZSBEV19GT1JNX2RhdGEyOiByZXR1cm4gIkRXX0ZPUk1fZGF0YTIiOworICAgIGNhc2UgRFdfRk9STV9kYXRhNDogcmV0dXJuICJEV19GT1JNX2RhdGE0IjsKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTg6IHJldHVybiAiRFdfRk9STV9kYXRhOCI7CisgICAgY2FzZSBEV19GT1JNX3N0cmluZzogcmV0dXJuICJEV19GT1JNX3N0cmluZyI7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2siOworICAgIGNhc2UgRFdfRk9STV9ibG9jazE6IHJldHVybiAiRFdfRk9STV9ibG9jazEiOworICAgIGNhc2UgRFdfRk9STV9kYXRhMTogcmV0dXJuICJEV19GT1JNX2RhdGExIjsKKyAgICBjYXNlIERXX0ZPUk1fZmxhZzogcmV0dXJuICJEV19GT1JNX2ZsYWciOworICAgIGNhc2UgRFdfRk9STV9zZGF0YTogcmV0dXJuICJEV19GT1JNX3NkYXRhIjsKKyAgICBjYXNlIERXX0ZPUk1fc3RycDogcmV0dXJuICJEV19GT1JNX3N0cnAiOworICAgIGNhc2UgRFdfRk9STV91ZGF0YTogcmV0dXJuICJEV19GT1JNX3VkYXRhIjsKKyAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6IHJldHVybiAiRFdfRk9STV9yZWZfYWRkciI7CisgICAgY2FzZSBEV19GT1JNX3JlZjE6IHJldHVybiAiRFdfRk9STV9yZWYxIjsKKyAgICBjYXNlIERXX0ZPUk1fcmVmMjogcmV0dXJuICJEV19GT1JNX3JlZjIiOworICAgIGNhc2UgRFdfRk9STV9yZWY0OiByZXR1cm4gIkRXX0ZPUk1fcmVmNCI7CisgICAgY2FzZSBEV19GT1JNX3JlZjg6IHJldHVybiAiRFdfRk9STV9yZWY4IjsKKyAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOiByZXR1cm4gIkRXX0ZPUk1fcmVmX3VkYXRhIjsKKyAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6IHJldHVybiAiRFdfRk9STV9pbmRpcmVjdCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07CisKKwlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gRk9STSB2YWx1ZTogJWx4IiksIGZvcm0pOworCXJldHVybiBidWZmZXI7CisgICAgICB9CisgICAgfQorfQorCisvKiBGSVhNRTogIFRoZXJlIGFyZSBiZXR0ZXIgYW5kIG1vcmUgZWZmaWVjaW50IHdheXMgdG8gaGFuZGxlCisgICB0aGVzZSBzdHJ1Y3R1cmVzLiAgRm9yIG5vdyB0aG91Z2gsIEkganVzdCB3YW50IHNvbWV0aGluZyB0aGF0CisgICBpcyBzaW1wbGUgdG8gaW1wbGVtZW50LiAgKi8KK3R5cGVkZWYgc3RydWN0IGFiYnJldl9hdHRyCit7CisgIHVuc2lnbmVkIGxvbmcgICAgICAgIGF0dHJpYnV0ZTsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgZm9ybTsKKyAgc3RydWN0IGFiYnJldl9hdHRyICogbmV4dDsKK30KK2FiYnJldl9hdHRyOworCit0eXBlZGVmIHN0cnVjdCBhYmJyZXZfZW50cnkKK3sKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICBlbnRyeTsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICB0YWc7CisgIGludCAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW47CisgIHN0cnVjdCBhYmJyZXZfYXR0ciAqICAgZmlyc3RfYXR0cjsKKyAgc3RydWN0IGFiYnJldl9hdHRyICogICBsYXN0X2F0dHI7CisgIHN0cnVjdCBhYmJyZXZfZW50cnkgKiAgbmV4dDsKK30KK2FiYnJldl9lbnRyeTsKKworc3RhdGljIGFiYnJldl9lbnRyeSAqIGZpcnN0X2FiYnJldiA9IE5VTEw7CitzdGF0aWMgYWJicmV2X2VudHJ5ICogbGFzdF9hYmJyZXYgPSBOVUxMOworCitzdGF0aWMgdm9pZAorZnJlZV9hYmJyZXZzIFBBUkFNUyAoKHZvaWQpKQoreworICBhYmJyZXZfZW50cnkgKiBhYmJyZXY7CisKKyAgZm9yIChhYmJyZXYgPSBmaXJzdF9hYmJyZXY7IGFiYnJldjspCisgICAgeworICAgICAgYWJicmV2X2VudHJ5ICogbmV4dCA9IGFiYnJldi0+bmV4dDsKKyAgICAgIGFiYnJldl9hdHRyICAqIGF0dHI7CisKKyAgICAgIGZvciAoYXR0ciA9IGFiYnJldi0+Zmlyc3RfYXR0cjsgYXR0cjspCisJeworCSAgYWJicmV2X2F0dHIgKiBuZXh0ID0gYXR0ci0+bmV4dDsKKworCSAgZnJlZSAoYXR0cik7CisJICBhdHRyID0gbmV4dDsKKwl9CisKKyAgICAgIGZyZWUgKGFiYnJldik7CisgICAgICBhYmJyZXYgPSBuZXh0OworICAgIH0KKworICBsYXN0X2FiYnJldiA9IGZpcnN0X2FiYnJldiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfYWJicmV2IChudW1iZXIsIHRhZywgY2hpbGRyZW4pCisgICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOworICAgICB1bnNpZ25lZCBsb25nIHRhZzsKKyAgICAgaW50ICAgICAgICAgICBjaGlsZHJlbjsKK3sKKyAgYWJicmV2X2VudHJ5ICogZW50cnk7CisKKyAgZW50cnkgPSAoYWJicmV2X2VudHJ5ICopIG1hbGxvYyAoc2l6ZW9mICgqIGVudHJ5KSk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgLyogdWdnICovCisgICAgcmV0dXJuOworCisgIGVudHJ5LT5lbnRyeSAgICAgID0gbnVtYmVyOworICBlbnRyeS0+dGFnICAgICAgICA9IHRhZzsKKyAgZW50cnktPmNoaWxkcmVuICAgPSBjaGlsZHJlbjsKKyAgZW50cnktPmZpcnN0X2F0dHIgPSBOVUxMOworICBlbnRyeS0+bGFzdF9hdHRyICA9IE5VTEw7CisgIGVudHJ5LT5uZXh0ICAgICAgID0gTlVMTDsKKworICBpZiAoZmlyc3RfYWJicmV2ID09IE5VTEwpCisgICAgZmlyc3RfYWJicmV2ID0gZW50cnk7CisgIGVsc2UKKyAgICBsYXN0X2FiYnJldi0+bmV4dCA9IGVudHJ5OworCisgIGxhc3RfYWJicmV2ID0gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSkKKyAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7CisgICAgIHVuc2lnbmVkIGxvbmcgZm9ybTsKK3sKKyAgYWJicmV2X2F0dHIgKiBhdHRyOworCisgIGF0dHIgPSAoYWJicmV2X2F0dHIgKikgbWFsbG9jIChzaXplb2YgKCogYXR0cikpOworCisgIGlmIChhdHRyID09IE5VTEwpCisgICAgLyogdWdnICovCisgICAgcmV0dXJuOworCisgIGF0dHItPmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKyAgYXR0ci0+Zm9ybSAgICAgID0gZm9ybTsKKyAgYXR0ci0+bmV4dCAgICAgID0gTlVMTDsKKworICBpZiAobGFzdF9hYmJyZXYtPmZpcnN0X2F0dHIgPT0gTlVMTCkKKyAgICBsYXN0X2FiYnJldi0+Zmlyc3RfYXR0ciA9IGF0dHI7CisgIGVsc2UKKyAgICBsYXN0X2FiYnJldi0+bGFzdF9hdHRyLT5uZXh0ID0gYXR0cjsKKworICBsYXN0X2FiYnJldi0+bGFzdF9hdHRyID0gYXR0cjsKK30KKworLyogUHJvY2Vzc2VzIHRoZSAocGFydGlhbCkgY29udGVudHMgb2YgYSAuZGVidWdfYWJicmV2IHNlY3Rpb24uCisgICBSZXR1cm5zIE5VTEwgaWYgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiB3YXMgZW5jb3VudGVyZWQuCisgICBSZXR1cm5zIHRoZSBhZGRyZXNzIGFmdGVyIHRoZSBsYXN0IGJ5dGUgcmVhZCBpZiB0aGUgZW5kIG9mCisgICBhbiBhYmJyZXZpYXRpb24gc2V0IHdhcyBmb3VuZC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK3Byb2Nlc3NfYWJicmV2X3NlY3Rpb24gKHN0YXJ0LCBlbmQpCisgICAgIHVuc2lnbmVkIGNoYXIgKiBzdGFydDsKKyAgICAgdW5zaWduZWQgY2hhciAqIGVuZDsKK3sKKyAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHdoaWxlIChzdGFydCA8IGVuZCkKKyAgICB7CisgICAgICBpbnQgICAgICAgICAgIGJ5dGVzX3JlYWQ7CisgICAgICB1bnNpZ25lZCBsb25nIGVudHJ5OworICAgICAgdW5zaWduZWQgbG9uZyB0YWc7CisgICAgICB1bnNpZ25lZCBsb25nIGF0dHJpYnV0ZTsKKyAgICAgIGludCAgICAgICAgICAgY2hpbGRyZW47CisKKyAgICAgIGVudHJ5ID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOworICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKKworICAgICAgaWYgKGVudHJ5ID09IDApCisJcmV0dXJuIHN0YXJ0OworCisgICAgICB0YWcgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7CisgICAgICBzdGFydCArPSBieXRlc19yZWFkOworCisgICAgICBjaGlsZHJlbiA9ICogc3RhcnQgKys7CisKKyAgICAgIGFkZF9hYmJyZXYgKGVudHJ5LCB0YWcsIGNoaWxkcmVuKTsKKworICAgICAgZG8KKwl7CisJICB1bnNpZ25lZCBsb25nIGZvcm07CisKKwkgIGF0dHJpYnV0ZSA9IHJlYWRfbGViMTI4IChzdGFydCwgJiBieXRlc19yZWFkLCAwKTsKKwkgIHN0YXJ0ICs9IGJ5dGVzX3JlYWQ7CisKKwkgIGZvcm0gPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7CisJICBzdGFydCArPSBieXRlc19yZWFkOworCisJICBpZiAoYXR0cmlidXRlICE9IDApCisJICAgIGFkZF9hYmJyZXZfYXR0ciAoYXR0cmlidXRlLCBmb3JtKTsKKwl9CisgICAgICB3aGlsZSAoYXR0cmlidXRlICE9IDApOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50CitkaXNwbGF5X2RlYnVnX2FiYnJldiAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCisgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOworICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7CisgICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOworeworICBhYmJyZXZfZW50cnkgKiBlbnRyeTsKKyAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKKworICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7CisKKyAgZG8KKyAgICB7CisgICAgICBzdGFydCA9IHByb2Nlc3NfYWJicmV2X3NlY3Rpb24gKHN0YXJ0LCBlbmQpOworCisgICAgICBwcmludGYgKF8oIiAgTnVtYmVyIFRBR1xuIikpOworCisgICAgICBmb3IgKGVudHJ5ID0gZmlyc3RfYWJicmV2OyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKwl7CisJICBhYmJyZXZfYXR0ciAqIGF0dHI7CisKKwkgIHByaW50ZiAoXygiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIiksCisJCSAgZW50cnktPmVudHJ5LAorCQkgIGdldF9UQUdfbmFtZSAoZW50cnktPnRhZyksCisJCSAgZW50cnktPmNoaWxkcmVuID8gXygiaGFzIGNoaWxkcmVuIikgOiBfKCJubyBjaGlsZHJlbiIpKTsKKworCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQorCSAgICB7CisJICAgICAgcHJpbnRmIChfKCIgICAgJS0xOHMgJXNcbiIpLAorCQkgICAgICBnZXRfQVRfbmFtZSAoYXR0ci0+YXR0cmlidXRlKSwKKwkJICAgICAgZ2V0X0ZPUk1fbmFtZSAoYXR0ci0+Zm9ybSkpOworCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKHN0YXJ0KTsKKworICBwcmludGYgKCJcbiIpOworCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK2Rpc3BsYXlfYmxvY2sgKGRhdGEsIGxlbmd0aCkKKyAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgICBsZW5ndGg7Cit7CisgIHByaW50ZiAoXygiICVsdSBieXRlIGJsb2NrOiAiKSwgbGVuZ3RoKTsKKworICB3aGlsZSAobGVuZ3RoIC0tKQorICAgIHByaW50ZiAoIiVseCAiLCBieXRlX2dldCAoZGF0YSArKywgMSkpOworCisgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24gKGRhdGEsIHBvaW50ZXJfc2l6ZSkKKyAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7CisgICAgIHVuc2lnbmVkIGludCAgICBwb2ludGVyX3NpemU7Cit7CisgIHVuc2lnbmVkIGNoYXIgb3A7CisgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKKworICBvcCA9ICogZGF0YSArKzsKKworICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICBjYXNlIERXX09QX2FkZHI6CXByaW50ZiAoIkRXX09QX2FkZHI6ICVseCIsIGJ5dGVfZ2V0IChkYXRhLCBwb2ludGVyX3NpemUpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9kZXJlZjoJcHJpbnRmICgiRFdfT1BfZGVyZWYiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9jb25zdDF1OglwcmludGYgKCJEV19PUF9jb25zdDF1OiAlbHUiLCBieXRlX2dldCAoZGF0YSwgMSkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2NvbnN0MXM6CXByaW50ZiAoIkRXX09QX2NvbnN0MXM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2NvbnN0MnU6CXByaW50ZiAoIkRXX09QX2NvbnN0MnU6ICVsdSIsIGJ5dGVfZ2V0IChkYXRhLCAyKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfY29uc3QyczoJcHJpbnRmICgiRFdfT1BfY29uc3QyczogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAyKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfY29uc3Q0dToJcHJpbnRmICgiRFdfT1BfY29uc3Q0dTogJWx1IiwgYnl0ZV9nZXQgKGRhdGEsIDQpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9jb25zdDRzOglwcmludGYgKCJEV19PUF9jb25zdDRzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDQpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9jb25zdDh1OglwcmludGYgKCJEV19PUF9jb25zdDh1OiAlbHUgJWx1IiwgYnl0ZV9nZXQgKGRhdGEsIDQpLCBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9jb25zdDhzOglwcmludGYgKCJEV19PUF9jb25zdDhzOiAlbGQgJWxkIiwgYnl0ZV9nZXQgKGRhdGEsIDQpLCBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9jb25zdHU6CXByaW50ZiAoIkRXX09QX2NvbnN0dTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9jb25zdHM6CXByaW50ZiAoIkRXX09QX2NvbnN0czogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9kdXA6CXByaW50ZiAoIkRXX09QX2R1cCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2Ryb3A6CXByaW50ZiAoIkRXX09QX2Ryb3AiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9vdmVyOglwcmludGYgKCJEV19PUF9vdmVyIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcGljazoJcHJpbnRmICgiRFdfT1BfcGljazogJWxkIiwgYnl0ZV9nZXQgKGRhdGEsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9zd2FwOglwcmludGYgKCJEV19PUF9zd2FwIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1Bfcm90OglwcmludGYgKCJEV19PUF9yb3QiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF94ZGVyZWY6CXByaW50ZiAoIkRXX09QX3hkZXJlZiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2FiczoJcHJpbnRmICgiRFdfT1BfYWJzIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfYW5kOglwcmludGYgKCJEV19PUF9hbmQiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9kaXY6CXByaW50ZiAoIkRXX09QX2RpdiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX21pbnVzOglwcmludGYgKCJEV19PUF9taW51cyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX21vZDoJcHJpbnRmICgiRFdfT1BfbW9kIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbXVsOglwcmludGYgKCJEV19PUF9tdWwiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9uZWc6CXByaW50ZiAoIkRXX09QX25lZyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX25vdDoJcHJpbnRmICgiRFdfT1Bfbm90Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1Bfb3I6CXByaW50ZiAoIkRXX09QX29yIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcGx1czoJcHJpbnRmICgiRFdfT1BfcGx1cyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3BsdXNfdWNvbnN0OglwcmludGYgKCJEV19PUF9wbHVzX3Vjb25zdDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9zaGw6CXByaW50ZiAoIkRXX09QX3NobCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3NocjoJcHJpbnRmICgiRFdfT1Bfc2hyIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1Bfc2hyYToJcHJpbnRmICgiRFdfT1Bfc2hyYSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3hvcjoJcHJpbnRmICgiRFdfT1BfeG9yIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfYnJhOglwcmludGYgKCJEV19PUF9icmE6ICVsZCIsIGJ5dGVfZ2V0IChkYXRhLCAyKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfZXE6CXByaW50ZiAoIkRXX09QX2VxIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfZ2U6CXByaW50ZiAoIkRXX09QX2dlIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfZ3Q6CXByaW50ZiAoIkRXX09QX2d0Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGU6CXByaW50ZiAoIkRXX09QX2xlIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbHQ6CXByaW50ZiAoIkRXX09QX2x0Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbmU6CXByaW50ZiAoIkRXX09QX25lIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1Bfc2tpcDoJcHJpbnRmICgiRFdfT1Bfc2tpcDogJWxkIiwgYnl0ZV9nZXQgKGRhdGEsIDIpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9saXQwOglwcmludGYgKCJEV19PUF9saXQwIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MToJcHJpbnRmICgiRFdfT1BfbGl0MSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2xpdDI6CXByaW50ZiAoIkRXX09QX2xpdDIiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9saXQzOglwcmludGYgKCJEV19PUF9saXQzIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0NDoJcHJpbnRmICgiRFdfT1BfbGl0NCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2xpdDU6CXByaW50ZiAoIkRXX09QX2xpdDUiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9saXQ2OglwcmludGYgKCJEV19PUF9saXQ2Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0NzoJcHJpbnRmICgiRFdfT1BfbGl0NyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2xpdDg6CXByaW50ZiAoIkRXX09QX2xpdDgiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9saXQ5OglwcmludGYgKCJEV19PUF9saXQ5Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTA6CXByaW50ZiAoIkRXX09QX2xpdDEwIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTE6CXByaW50ZiAoIkRXX09QX2xpdDExIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTI6CXByaW50ZiAoIkRXX09QX2xpdDEyIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTM6CXByaW50ZiAoIkRXX09QX2xpdDEzIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTQ6CXByaW50ZiAoIkRXX09QX2xpdDE0Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTU6CXByaW50ZiAoIkRXX09QX2xpdDE1Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTY6CXByaW50ZiAoIkRXX09QX2xpdDE2Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTc6CXByaW50ZiAoIkRXX09QX2xpdDE3Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTg6CXByaW50ZiAoIkRXX09QX2xpdDE4Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MTk6CXByaW50ZiAoIkRXX09QX2xpdDE5Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjA6CXByaW50ZiAoIkRXX09QX2xpdDIwIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjE6CXByaW50ZiAoIkRXX09QX2xpdDIxIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjI6CXByaW50ZiAoIkRXX09QX2xpdDIyIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjM6CXByaW50ZiAoIkRXX09QX2xpdDIzIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjQ6CXByaW50ZiAoIkRXX09QX2xpdDI0Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjU6CXByaW50ZiAoIkRXX09QX2xpdDI1Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MjY6CXByaW50ZiAoIkRXX09QX2xpdDI2Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0Mjc6CXByaW50ZiAoIkRXX09QX2xpdDI3Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0Mjg6CXByaW50ZiAoIkRXX09QX2xpdDI4Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0Mjk6CXByaW50ZiAoIkRXX09QX2xpdDI5Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MzA6CXByaW50ZiAoIkRXX09QX2xpdDMwIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfbGl0MzE6CXByaW50ZiAoIkRXX09QX2xpdDMxIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcmVnMDoJcHJpbnRmICgiRFdfT1BfcmVnMCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE6CXByaW50ZiAoIkRXX09QX3JlZzEiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9yZWcyOglwcmludGYgKCJEV19PUF9yZWcyIik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcmVnMzoJcHJpbnRmICgiRFdfT1BfcmVnMyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzQ6CXByaW50ZiAoIkRXX09QX3JlZzQiKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9yZWc1OglwcmludGYgKCJEV19PUF9yZWc1Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcmVnNjoJcHJpbnRmICgiRFdfT1BfcmVnNiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzc6CXByaW50ZiAoIkRXX09QX3JlZzciKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9yZWc4OglwcmludGYgKCJEV19PUF9yZWc4Iik7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcmVnOToJcHJpbnRmICgiRFdfT1BfcmVnOSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzEwOglwcmludGYgKCJEV19PUF9yZWcxMCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzExOglwcmludGYgKCJEV19PUF9yZWcxMSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzEyOglwcmludGYgKCJEV19PUF9yZWcxMiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzEzOglwcmludGYgKCJEV19PUF9yZWcxMyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE0OglwcmludGYgKCJEV19PUF9yZWcxNCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE1OglwcmludGYgKCJEV19PUF9yZWcxNSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE2OglwcmludGYgKCJEV19PUF9yZWcxNiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE3OglwcmludGYgKCJEV19PUF9yZWcxNyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE4OglwcmludGYgKCJEV19PUF9yZWcxOCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzE5OglwcmludGYgKCJEV19PUF9yZWcxOSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzIwOglwcmludGYgKCJEV19PUF9yZWcyMCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzIxOglwcmludGYgKCJEV19PUF9yZWcyMSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzIyOglwcmludGYgKCJEV19PUF9yZWcyMiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzIzOglwcmludGYgKCJEV19PUF9yZWcyMyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzI0OglwcmludGYgKCJEV19PUF9yZWcyNCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzI1OglwcmludGYgKCJEV19PUF9yZWcyNSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzI2OglwcmludGYgKCJEV19PUF9yZWcyNiIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzI3OglwcmludGYgKCJEV19PUF9yZWcyNyIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzI4OglwcmludGYgKCJEV19PUF9yZWcyOCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzI5OglwcmludGYgKCJEV19PUF9yZWcyOSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzMwOglwcmludGYgKCJEV19PUF9yZWczMCIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX3JlZzMxOglwcmludGYgKCJEV19PUF9yZWczMSIpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2JyZWcwOglwcmludGYgKCJEV19PUF9icmVnMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMToJcHJpbnRmICgiRFdfT1BfYnJlZzE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfYnJlZzI6CXByaW50ZiAoIkRXX09QX2JyZWcyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2JyZWczOglwcmludGYgKCJEV19PUF9icmVnMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnNDoJcHJpbnRmICgiRFdfT1BfYnJlZzQ6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfYnJlZzU6CXByaW50ZiAoIkRXX09QX2JyZWc1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2JyZWc2OglwcmludGYgKCJEV19PUF9icmVnNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnNzoJcHJpbnRmICgiRFdfT1BfYnJlZzc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfYnJlZzg6CXByaW50ZiAoIkRXX09QX2JyZWc4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2JyZWc5OglwcmludGYgKCJEV19PUF9icmVnOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTA6CXByaW50ZiAoIkRXX09QX2JyZWcxMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTE6CXByaW50ZiAoIkRXX09QX2JyZWcxMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTI6CXByaW50ZiAoIkRXX09QX2JyZWcxMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTM6CXByaW50ZiAoIkRXX09QX2JyZWcxMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTQ6CXByaW50ZiAoIkRXX09QX2JyZWcxNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTU6CXByaW50ZiAoIkRXX09QX2JyZWcxNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTY6CXByaW50ZiAoIkRXX09QX2JyZWcxNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTc6CXByaW50ZiAoIkRXX09QX2JyZWcxNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTg6CXByaW50ZiAoIkRXX09QX2JyZWcxODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMTk6CXByaW50ZiAoIkRXX09QX2JyZWcxOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjA6CXByaW50ZiAoIkRXX09QX2JyZWcyMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjE6CXByaW50ZiAoIkRXX09QX2JyZWcyMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjI6CXByaW50ZiAoIkRXX09QX2JyZWcyMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjM6CXByaW50ZiAoIkRXX09QX2JyZWcyMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjQ6CXByaW50ZiAoIkRXX09QX2JyZWcyNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjU6CXByaW50ZiAoIkRXX09QX2JyZWcyNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjY6CXByaW50ZiAoIkRXX09QX2JyZWcyNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjc6CXByaW50ZiAoIkRXX09QX2JyZWcyNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjg6CXByaW50ZiAoIkRXX09QX2JyZWcyODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMjk6CXByaW50ZiAoIkRXX09QX2JyZWcyOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMzA6CXByaW50ZiAoIkRXX09QX2JyZWczMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVnMzE6CXByaW50ZiAoIkRXX09QX2JyZWczMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9yZWd4OglwcmludGYgKCJEV19PUF9yZWd4OiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2ZicmVnOglwcmludGYgKCJEV19PUF9mYnJlZzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsgYnJlYWs7CisgICAgY2FzZSBEV19PUF9icmVneDoJcHJpbnRmICgiRFdfT1BfYnJlZ3g6ICVsdSAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSwgcmVhZF9sZWIxMjggKGRhdGEgKyBieXRlc19yZWFkLCBOVUxMLCAxKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfcGllY2U6CXByaW50ZiAoIkRXX09QX3BpZWNlOiAlbHUiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMCkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX2RlcmVmX3NpemU6CXByaW50ZiAoIkRXX09QX2RlcmVmX3NpemU6ICVsZCIsIGJ5dGVfZ2V0IChkYXRhLCAxKSk7IGJyZWFrOworICAgIGNhc2UgRFdfT1BfeGRlcmVmX3NpemU6CXByaW50ZiAoIkRXX09QX3hkZXJlZl9zaXplOiAlbGQiLCBieXRlX2dldCAoZGF0YSwgMSkpOyBicmVhazsKKyAgICBjYXNlIERXX09QX25vcDoJcHJpbnRmICgiRFdfT1Bfbm9wIik7IGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChvcCA+PSBEV19PUF9sb191c2VyCisJICAmJiBvcCA8PSBEV19PUF9oaV91c2VyKQorCXByaW50ZiAoXygiKFVzZXIgZGVmaW5lZCBsb2NhdGlvbiBvcCkiKSk7CisgICAgICBlbHNlCisJcHJpbnRmIChfKCIoVW5rbm93biBsb2NhdGlvbiBvcCkiKSk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorcmVhZF9hbmRfZGlzcGxheV9hdHRyIChhdHRyaWJ1dGUsIGZvcm0sIGRhdGEsIHBvaW50ZXJfc2l6ZSkKKyAgICAgdW5zaWduZWQgbG9uZyAgIGF0dHJpYnV0ZTsKKyAgICAgdW5zaWduZWQgbG9uZyAgIGZvcm07CisgICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOworICAgICB1bnNpZ25lZCBsb25nICAgcG9pbnRlcl9zaXplOworeworICB1bnNpZ25lZCBsb25nICAgdXZhbHVlOworICB1bnNpZ25lZCBjaGFyICogYmxvY2tfc3RhcnQ7CisgIGludCAgICAgICAgICAgICBieXRlc19yZWFkOworICBpbnQJCSAgaXNfcmVmID0gMDsKKworICBwcmludGYgKCIgICAgICUtMThzOiIsIGdldF9BVF9uYW1lIChhdHRyaWJ1dGUpKTsKKworICBzd2l0Y2ggKGZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICBjYXNlIERXX0ZPUk1fcmVmMToKKyAgICBjYXNlIERXX0ZPUk1fcmVmMjoKKyAgICBjYXNlIERXX0ZPUk1fcmVmNDoKKyAgICBjYXNlIERXX0ZPUk1fcmVmODoKKyAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgorICAgICAgaXNfcmVmID0gMTsKKyAgICB9CisKKyAgc3dpdGNoIChmb3JtKQorICAgIHsKKyAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6CisgICAgY2FzZSBEV19GT1JNX2FkZHI6CisgICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgcG9pbnRlcl9zaXplKTsKKyAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJSN4IiwgdXZhbHVlKTsKKyAgICAgIGRhdGEgKz0gcG9pbnRlcl9zaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmMToKKyAgICBjYXNlIERXX0ZPUk1fZmxhZzoKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTE6CisgICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSArKywgMSk7CisgICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICVkIiwgdXZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgY2FzZSBEV19GT1JNX2RhdGEyOgorICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDIpOworICAgICAgZGF0YSArPSAyOworICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlZCIsIHV2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWY0OgorICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKKyAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKKyAgICAgIGRhdGEgKz0gNDsKKyAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJWQiLCB1dmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fcmVmODoKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTg6CisgICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgNCk7CisgICAgICBwcmludGYgKCIgJWx4IiwgdXZhbHVlKTsKKyAgICAgIHByaW50ZiAoIiAlbHgiLCBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKKyAgICAgIGRhdGEgKz0gODsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3N0cmluZzoKKyAgICAgIHByaW50ZiAoIiAlcyIsIGRhdGEpOworICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX3NkYXRhOgorICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMSk7CisgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7CisgICAgICBwcmludGYgKCIgJWxkIiwgKGxvbmcpIHV2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisgICAgY2FzZSBEV19GT1JNX3VkYXRhOgorICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7CisgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7CisgICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCVseD4iIDogIiAlbGQiLCB1dmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s6CisgICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKKyAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIGJ5dGVzX3JlYWQ7CisgICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7CisgICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgorICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDEpOworICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgMTsKKyAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKKyAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfRk9STV9ibG9jazI6CisgICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMik7CisgICAgICBibG9ja19zdGFydCA9IGRhdGEgKyAyOworICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOworICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKKyAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKKyAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDQ7CisgICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7CisgICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0ZPUk1fc3RycDoKKyAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6CisgICAgICB3YXJuIChfKCJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIiksIGZvcm0pOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgd2FybiAoXygiVW5yZWNvZ25pc2VkIGZvcm06ICVkIiksIGZvcm0pOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIEZvciBzb21lIGF0dHJpYnV0ZXMgd2UgY2FuIGRpc3BsYXkgZnV0aGVyIGluZm9ybWF0aW9uLiAgKi8KKworICBwcmludGYgKCJcdCIpOworCisgIHN3aXRjaCAoYXR0cmlidXRlKQorICAgIHsKKyAgICBjYXNlIERXX0FUX2lubGluZToKKyAgICAgIHN3aXRjaCAodXZhbHVlKQorCXsKKwljYXNlIERXX0lOTF9ub3RfaW5saW5lZDogICAgICAgICAgcHJpbnRmIChfKCIobm90IGlubGluZWQpIikpOyBicmVhazsKKwljYXNlIERXX0lOTF9pbmxpbmVkOiAgICAgICAgICAgICAgcHJpbnRmIChfKCIoaW5saW5lZCkiKSk7IGJyZWFrOworCWNhc2UgRFdfSU5MX2RlY2xhcmVkX25vdF9pbmxpbmVkOiBwcmludGYgKF8oIihkZWNsYXJlZCBhcyBpbmxpbmUgYnV0IGlnbm9yZWQpIikpOyBicmVhazsKKwljYXNlIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkOiAgICAgcHJpbnRmIChfKCIoZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBpbmxpbmVkKSIpKTsgYnJlYWs7CisJZGVmYXVsdDogcHJpbnRmIChfKCIgIChVbmtub3duIGlubGluZSBhdHRyaWJ1dGUgdmFsdWU6ICVseCkiKSwgdXZhbHVlKTsgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6CisgICAgICBpZiAodXZhbHVlID49IERXX09QX3JlZzAgJiYgdXZhbHVlIDw9IERXX09QX3JlZzMxKQorCXByaW50ZiAoIihyZWcgJWxkKSIsIHV2YWx1ZSAtIERXX09QX3JlZzApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0FUX2xhbmd1YWdlOgorICAgICAgc3dpdGNoICh1dmFsdWUpCisJeworCWNhc2UgRFdfTEFOR19DOiAgICAgICAgICAgICAgcHJpbnRmICgiKG5vbi1BTlNJIEMpIik7IGJyZWFrOworCWNhc2UgRFdfTEFOR19DODk6ICAgICAgICAgICAgcHJpbnRmICgiKEFOU0kgQykiKTsgYnJlYWs7CisJY2FzZSBEV19MQU5HX0NfcGx1c19wbHVzOiAgICBwcmludGYgKCIoQysrKSIpOyBicmVhazsKKwljYXNlIERXX0xBTkdfRm9ydHJhbjc3OiAgICAgIHByaW50ZiAoIihGT1JUUkFOIDc3KSIpOyBicmVhazsKKwljYXNlIERXX0xBTkdfRm9ydHJhbjkwOiAgICAgIHByaW50ZiAoIihGb3J0cmFuIDkwKSIpOyBicmVhazsKKwljYXNlIERXX0xBTkdfTW9kdWxhMjogICAgICAgIHByaW50ZiAoIihNb2R1bGEgMikiKTsgYnJlYWs7CisJY2FzZSBEV19MQU5HX1Bhc2NhbDgzOiAgICAgICBwcmludGYgKCIoQU5TSSBQYXNjYWwpIik7IGJyZWFrOworCWNhc2UgRFdfTEFOR19BZGE4MzogICAgICAgICAgcHJpbnRmICgiKEFkYSkiKTsgYnJlYWs7CisJY2FzZSBEV19MQU5HX0NvYm9sNzQ6ICAgICAgICBwcmludGYgKCIoQ29ib2wgNzQpIik7IGJyZWFrOworCWNhc2UgRFdfTEFOR19Db2JvbDg1OiAgICAgICAgcHJpbnRmICgiKENvYm9sIDg1KSIpOyBicmVhazsKKwljYXNlIERXX0xBTkdfTWlwc19Bc3NlbWJsZXI6IHByaW50ZiAoIihNSVBTIGFzc2VtYmxlcikiKTsgYnJlYWs7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIoVW5rbm93bjogJWx4KSIsIHV2YWx1ZSk7IGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19BVF9lbmNvZGluZzoKKyAgICAgIHN3aXRjaCAodXZhbHVlKQorCXsKKwljYXNlIERXX0FURV92b2lkOiAgICAgICAgICAgIHByaW50ZiAoIih2b2lkKSIpOyBicmVhazsKKwljYXNlIERXX0FURV9hZGRyZXNzOiAgICAgICAgIHByaW50ZiAoIihtYWNoaW5lIGFkZHJlc3MpIik7IGJyZWFrOworCWNhc2UgRFdfQVRFX2Jvb2xlYW46ICAgICAgICAgcHJpbnRmICgiKGJvb2xlYW4pIik7IGJyZWFrOworCWNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6ICAgcHJpbnRmICgiKGNvbXBsZXggZmxvYXQpIik7IGJyZWFrOworCWNhc2UgRFdfQVRFX2Zsb2F0OiAgICAgICAgICAgcHJpbnRmICgiKGZsb2F0KSIpOyBicmVhazsKKwljYXNlIERXX0FURV9zaWduZWQ6ICAgICAgICAgIHByaW50ZiAoIihzaWduZWQpIik7IGJyZWFrOworCWNhc2UgRFdfQVRFX3NpZ25lZF9jaGFyOiAgICAgcHJpbnRmICgiKHNpZ25lZCBjaGFyKSIpOyBicmVhazsKKwljYXNlIERXX0FURV91bnNpZ25lZDogICAgICAgIHByaW50ZiAoIih1bnNpZ25lZCkiKTsgYnJlYWs7CisJY2FzZSBEV19BVEVfdW5zaWduZWRfY2hhcjogICBwcmludGYgKCIodW5zaWduZWQgY2hhcikiKTsgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGlmICh1dmFsdWUgPj0gRFdfQVRFX2xvX3VzZXIKKwkgICAgICAmJiB1dmFsdWUgPD0gRFdfQVRFX2hpX3VzZXIpCisJICAgIHByaW50ZiAoIih1c2VyIGRlZmluZWQgdHlwZSkiKTsKKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiKHVua25vd24gdHlwZSkiKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEV19BVF9hY2Nlc3NpYmlsaXR5OgorICAgICAgc3dpdGNoICh1dmFsdWUpCisJeworCWNhc2UgRFdfQUNDRVNTX3B1YmxpYzoJCXByaW50ZiAoIihwdWJsaWMpIik7IGJyZWFrOworCWNhc2UgRFdfQUNDRVNTX3Byb3RlY3RlZDoJcHJpbnRmICgiKHByb3RlY3RlZCkiKTsgYnJlYWs7CisJY2FzZSBEV19BQ0NFU1NfcHJpdmF0ZToJCXByaW50ZiAoIihwcml2YXRlKSIpOyBicmVhazsKKwlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biBhY2Nlc3NpYmlsaXR5KSIpOyBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eToKKyAgICAgIHN3aXRjaCAodXZhbHVlKQorCXsKKwljYXNlIERXX1ZJU19sb2NhbDoJcHJpbnRmICgiKGxvY2FsKSIpOyBicmVhazsKKwljYXNlIERXX1ZJU19leHBvcnRlZDoJcHJpbnRmICgiKGV4cG9ydGVkKSIpOyBicmVhazsKKwljYXNlIERXX1ZJU19xdWFsaWZpZWQ6CXByaW50ZiAoIihxdWFsaWZpZWQpIik7IGJyZWFrOworCWRlZmF1bHQ6CQlwcmludGYgKCIodW5rbm93biB2aXNpYmlsaXR5KSIpOyBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfQVRfdmlydHVhbGl0eToKKyAgICAgIHN3aXRjaCAodXZhbHVlKQorCXsKKwljYXNlIERXX1ZJUlRVQUxJVFlfbm9uZToJcHJpbnRmICgiKG5vbmUpIik7IGJyZWFrOworCWNhc2UgRFdfVklSVFVBTElUWV92aXJ0dWFsOglwcmludGYgKCIodmlydHVhbCkiKTsgYnJlYWs7CisJY2FzZSBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbDpwcmludGYgKCIocHVyZV92aXJ0dWFsKSIpOyBicmVhazsKKwlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biB2aXJ0dWFsaXR5KSIpOyBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgorICAgICAgc3dpdGNoICh1dmFsdWUpCisJeworCWNhc2UgRFdfSURfY2FzZV9zZW5zaXRpdmU6CXByaW50ZiAoIihjYXNlX3NlbnNpdGl2ZSkiKTsgYnJlYWs7CisJY2FzZSBEV19JRF91cF9jYXNlOgkJcHJpbnRmICgiKHVwX2Nhc2UpIik7IGJyZWFrOworCWNhc2UgRFdfSURfZG93bl9jYXNlOgkJcHJpbnRmICgiKGRvd25fY2FzZSkiKTsgYnJlYWs7CisJY2FzZSBEV19JRF9jYXNlX2luc2Vuc2l0aXZlOglwcmludGYgKCIoY2FzZV9pbnNlbnNpdGl2ZSkiKTsgYnJlYWs7CisJZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gY2FzZSkiKTsgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjoKKyAgICAgIHN3aXRjaCAodXZhbHVlKQorCXsKKwljYXNlIERXX0NDX25vcm1hbDoJcHJpbnRmICgiKG5vcm1hbCkiKTsgYnJlYWs7CisJY2FzZSBEV19DQ19wcm9ncmFtOglwcmludGYgKCIocHJvZ3JhbSkiKTsgYnJlYWs7CisJY2FzZSBEV19DQ19ub2NhbGw6CXByaW50ZiAoIihub2NhbGwpIik7IGJyZWFrOworCWRlZmF1bHQ6CisJICBpZiAodXZhbHVlID49IERXX0NDX2xvX3VzZXIKKwkgICAgICAmJiB1dmFsdWUgPD0gRFdfQ0NfaGlfdXNlcikKKwkgICAgcHJpbnRmICgiKHVzZXIgZGVmaW5lZCkiKTsKKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiKHVua25vd24gY29udmVudGlvbikiKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRFdfQVRfbG9jYXRpb246CisgICAgY2FzZSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbjoKKyAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOgorICAgICAgcHJpbnRmICgiKCIpOworICAgICAgZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24gKGJsb2NrX3N0YXJ0LCBwb2ludGVyX3NpemUpOworICAgICAgcHJpbnRmICgiKSIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHByaW50ZiAoIlxuIik7CisgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50CitkaXNwbGF5X2RlYnVnX2luZm8gKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQorICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKKyAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OworICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKK3sKKyAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKKyAgdW5zaWduZWQgY2hhciAqIHNlY3Rpb25fYmVnaW4gPSBzdGFydDsKKworICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7CisKKyAgd2hpbGUgKHN0YXJ0IDwgZW5kKQorICAgIHsKKyAgICAgIERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqIGV4dGVybmFsOworICAgICAgRFdBUkYyX0ludGVybmFsX0NvbXBVbml0ICAgY29tcHVuaXQ7CisgICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICB0YWdzOworICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICAgIGludAkJCSBsZXZlbDsKKworICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICopIHN0YXJ0OworCisgICAgICBjb21wdW5pdC5jdV9sZW5ndGggICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9sZW5ndGgpOworICAgICAgY29tcHVuaXQuY3VfdmVyc2lvbiAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfdmVyc2lvbik7CisgICAgICBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0ID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9hYmJyZXZfb2Zmc2V0KTsKKyAgICAgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3BvaW50ZXJfc2l6ZSk7CisKKyAgICAgIHRhZ3MgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7CisgICAgICBzdGFydCArPSBjb21wdW5pdC5jdV9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5jdV9sZW5ndGgpOworCisgICAgICBpZiAoY29tcHVuaXQuY3VfdmVyc2lvbiAhPSAyKQorCXsKKwkgIHdhcm4gKF8oIk9ubHkgdmVyc2lvbiAyIERXQVJGIGRlYnVnIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHByaW50ZiAoXygiICBDb21waWxhdGlvbiBVbml0OlxuIikpOworICAgICAgcHJpbnRmIChfKCIgICBMZW5ndGg6ICAgICAgICAlbGRcbiIpLCBjb21wdW5pdC5jdV9sZW5ndGgpOworICAgICAgcHJpbnRmIChfKCIgICBWZXJzaW9uOiAgICAgICAlZFxuIiksIGNvbXB1bml0LmN1X3ZlcnNpb24pOworICAgICAgcHJpbnRmIChfKCIgICBBYmJyZXYgT2Zmc2V0OiAlbGRcbiIpLCBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0KTsKKyAgICAgIHByaW50ZiAoXygiICAgUG9pbnRlciBTaXplOiAgJWRcbiIpLCBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUpOworCisgICAgICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCisJZnJlZV9hYmJyZXZzICgpOworCisgICAgICAvKiBSZWFkIGluIHRoZSBhYmJyZXZzIHVzZWQgYnkgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgKi8KKworICAgICAgeworCUVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWM7CisJdW5zaWduZWQgY2hhciAqICAgICAgIGJlZ2luOworCisJLyogTG9jYXRlIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gYW5kIHByb2Nlc3MgaXQuICAqLworCWZvciAoaSA9IDAsIHNlYyA9IHNlY3Rpb25faGVhZGVyczsKKwkgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07CisJICAgICBpICsrLCBzZWMgKyspCisJICBpZiAoc3RyY21wIChTRUNUSU9OX05BTUUgKHNlYyksICIuZGVidWdfYWJicmV2IikgPT0gMCkKKwkgICAgYnJlYWs7CisKKwlpZiAoaSA9PSAtMSB8fCBzZWMtPnNoX3NpemUgPT0gMCkKKwkgIHsKKwkgICAgd2FybiAoXygiVW5hYmxlIHRvIGxvY2F0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24hXG4iKSk7CisJICAgIHJldHVybiAwOworCSAgfQorCisJR0VUX0RBVEFfQUxMT0MgKHNlYy0+c2hfb2Zmc2V0LCBzZWMtPnNoX3NpemUsIGJlZ2luLCB1bnNpZ25lZCBjaGFyICosCisJCQkiZGVidWdfYWJicmV2IHNlY3Rpb24gZGF0YSIpOworCisJcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAoYmVnaW4gKyBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0LAorCQkJCWJlZ2luICsgc2VjLT5zaF9zaXplKTsKKworCWZyZWUgKGJlZ2luKTsKKyAgICAgIH0KKworICAgICAgbGV2ZWwgPSAwOworICAgICAgd2hpbGUgKHRhZ3MgPCBzdGFydCkKKwl7CisJICBpbnQgICAgICAgICAgICBieXRlc19yZWFkOworCSAgaW50ICAgICAgICAgICAgYWJicmV2X251bWJlcjsKKwkgIGFiYnJldl9lbnRyeSAqIGVudHJ5OworCSAgYWJicmV2X2F0dHIgICogYXR0cjsKKworCSAgYWJicmV2X251bWJlciA9IHJlYWRfbGViMTI4ICh0YWdzLCAmIGJ5dGVzX3JlYWQsIDApOworCSAgdGFncyArPSBieXRlc19yZWFkOworCisJICAvKiBBIG51bGwgRElFIG1hcmtzIHRoZSBlbmQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuLiAgKi8KKwkgIGlmIChhYmJyZXZfbnVtYmVyID09IDApCisJICAgIHsKKwkgICAgICAtLWxldmVsOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFNjYW4gdGhyb3VnaCB0aGUgYWJicmV2aWF0aW9uIGxpc3QgdW50aWwgd2UgcmVhY2ggdGhlCisJICAgICBjb3JyZWN0IGVudHJ5LiAgKi8KKwkgIGZvciAoZW50cnkgPSBmaXJzdF9hYmJyZXY7CisJICAgICAgIGVudHJ5ICYmIGVudHJ5LT5lbnRyeSAhPSBhYmJyZXZfbnVtYmVyOworCSAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0KQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKGVudHJ5ID09IE5VTEwpCisJICAgIHsKKwkgICAgICB3YXJuIChfKCJVbmFibGUgdG8gbG9jYXRlIGVudHJ5ICVkIGluIHRoZSBhYmJyZXZpYXRpb24gdGFibGVcbiIpLAorCQkgICAgYWJicmV2X251bWJlcik7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKworCSAgcHJpbnRmIChfKCIgPCVkPjwleD46IEFiYnJldiBOdW1iZXI6ICVkICglcylcbiIpLAorCQkgIGxldmVsLCB0YWdzIC0gc2VjdGlvbl9iZWdpbiAtIGJ5dGVzX3JlYWQsCisJCSAgYWJicmV2X251bWJlciwKKwkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpKTsKKworCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQorCSAgICB0YWdzID0gcmVhZF9hbmRfZGlzcGxheV9hdHRyIChhdHRyLT5hdHRyaWJ1dGUsCisJCQkJCSAgYXR0ci0+Zm9ybSwKKwkJCQkJICB0YWdzLAorCQkJCQkgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSk7CisKKwkgIGlmIChlbnRyeS0+Y2hpbGRyZW4pCisJICAgICsrbGV2ZWw7CisJfQorICAgIH0KKworICBwcmludGYgKCJcbiIpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitkaXNwbGF5X2RlYnVnX2FyYW5nZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQorICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKKyAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OworICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKK3sKKyAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKKworICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7CisKKyAgd2hpbGUgKHN0YXJ0IDwgZW5kKQorICAgIHsKKyAgICAgIERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UgKiBleHRlcm5hbDsKKyAgICAgIERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UgICBhcmFuZ2U7CisgICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgcmFuZ2VzOworICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhZGRyZXNzOworCisgICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlICopIHN0YXJ0OworCisgICAgICBhcmFuZ2UuYXJfbGVuZ3RoICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9sZW5ndGgpOworICAgICAgYXJhbmdlLmFyX3ZlcnNpb24gICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfdmVyc2lvbik7CisgICAgICBhcmFuZ2UuYXJfaW5mb19vZmZzZXQgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9pbmZvX29mZnNldCk7CisgICAgICBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9wb2ludGVyX3NpemUpOworICAgICAgYXJhbmdlLmFyX3NlZ21lbnRfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfc2VnbWVudF9zaXplKTsKKworICAgICAgcHJpbnRmIChfKCIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgJWxkXG4iKSwgYXJhbmdlLmFyX2xlbmd0aCk7CisgICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl92ZXJzaW9uKTsKKyAgICAgIHByaW50ZiAoXygiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbzogICVseFxuIiksIGFyYW5nZS5hcl9pbmZvX29mZnNldCk7CisgICAgICBwcmludGYgKF8oIiAgUG9pbnRlciBTaXplOiAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOworICAgICAgcHJpbnRmIChfKCIgIFNlZ21lbnQgU2l6ZTogICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfc2VnbWVudF9zaXplKTsKKworICAgICAgcHJpbnRmIChfKCJcbiAgICBBZGRyZXNzICBMZW5ndGhcbiIpKTsKKworICAgICAgcmFuZ2VzID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIGFkZHJlc3MgPSBieXRlX2dldCAocmFuZ2VzLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKKworCSAgaWYgKGFkZHJlc3MgPT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOworCisJICBsZW5ndGggID0gYnl0ZV9nZXQgKHJhbmdlcywgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7CisKKwkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOworCisJICBwcmludGYgKCIgICAgJTguOGx4ICVsdVxuIiwgYWRkcmVzcywgbGVuZ3RoKTsKKwl9CisKKyAgICAgIHN0YXJ0ICs9IGFyYW5nZS5hcl9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5hcl9sZW5ndGgpOworICAgIH0KKworICBwcmludGYgKCJcbiIpOworCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK2Rpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCisgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOworICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7CisgICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOworeworICBwcmludGYgKF8oIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iKSwKKwkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKyAgLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIGRlYnVnIHNlY3Rpb24gYW5kIGEgcG9pbnRlcgorICAgICB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGRlY29kZSBpdC4gICovCitzdHJ1Y3QKK3sKKyAgY2hhciAqIG5hbWU7CisgIGludCAoKiBkaXNwbGF5KSBQQVJBTVMoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKK30KK2RlYnVnX2Rpc3BsYXlzW10gPQoreworICB7ICIuZGVidWdfaW5mbyIsICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gfSwKKyAgeyAiLmRlYnVnX2FiYnJldiIsICAgICAgZGlzcGxheV9kZWJ1Z19hYmJyZXYgfSwKKyAgeyAiLmRlYnVnX2xpbmUiLCAgICAgICAgZGlzcGxheV9kZWJ1Z19saW5lcyB9LAorICB7ICIuZGVidWdfYXJhbmdlcyIsICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgfSwKKyAgeyAiLmRlYnVnX3B1Ym5hbWVzIiwgICAgZGlzcGxheV9kZWJ1Z19wdWJuYW1lcyB9LAorICB7ICIuZGVidWdfbWFjaW5mbyIsICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKKyAgeyAiLmRlYnVnX2ZyYW1lIiwgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCisgIHsgIi5kZWJ1Z19zdHIiLCAgICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAorICB7ICIuZGVidWdfc3RhdGljX2Z1bmMiLCBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKKyAgeyAiLmRlYnVnX3N0YXRpY192YXJzIiwgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCisgIHsgIi5kZWJ1Z190eXBlcyIsICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAorICB7ICIuZGVidWdfd2Vha25hbWVzIiwgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfQorfTsKKworc3RhdGljIGludAorZGlzcGxheV9kZWJ1Z19zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQorICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKKyAgICAgRklMRSAqIGZpbGU7Cit7CisgIGNoYXIgKiAgICAgICAgICBuYW1lID0gU0VDVElPTl9OQU1FIChzZWN0aW9uKTsKKyAgYmZkX3NpemVfdHlwZSAgIGxlbmd0aDsKKyAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OworICBpbnQgICAgICAgICAgICAgaTsKKworICBsZW5ndGggPSBzZWN0aW9uLT5zaF9zaXplOworICBpZiAobGVuZ3RoID09IDApCisgICAgeworICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iKSwgbmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgbGVuZ3RoLCBzdGFydCwgdW5zaWduZWQgY2hhciAqLAorCQkgICJkZWJ1ZyBzZWN0aW9uIGRhdGEiKTsKKworICAvKiBTZWUgaWYgd2Uga25vdyBob3cgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgKi8KKyAgZm9yIChpID0gTlVNX0VMRU0gKGRlYnVnX2Rpc3BsYXlzKTsgaS0tOykKKyAgICBpZiAoc3RyY21wIChkZWJ1Z19kaXNwbGF5c1tpXS5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgeworCWRlYnVnX2Rpc3BsYXlzW2ldLmRpc3BsYXkgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKTsKKwlicmVhazsKKyAgICAgIH0KKworICBpZiAoaSA9PSAtMSkKKyAgICBwcmludGYgKF8oIlVucmVjb2duaXNlZCBkZWJ1ZyBzZWN0aW9uOiAlc1xuIiksIG5hbWUpOworCisgIGZyZWUgKHN0YXJ0KTsKKworICAvKiBJZiB3ZSBsb2FkZWQgaW4gdGhlIGFiYnJldiBzZWN0aW9uIGF0IHNvbWUgcG9pbnQsCisgICAgIHdlIG11c3QgcmVsZWFzZSBpdCBoZXJlLiAgKi8KKyAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQorICAgIGZyZWVfYWJicmV2cyAoKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzIChmaWxlKQorICAgICBGSUxFICogZmlsZTsKK3sKKyAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgIHNlY3Rpb247CisgIHVuc2lnbmVkIGludCAgaTsKKworICBpZiAoISBkb19kdW1wKQorICAgIHJldHVybiAxOworCisgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7CisgICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bQorICAgICAgICYmIGkgPCBudW1fZHVtcF9zZWN0czsKKyAgICAgICBpICsrLCBzZWN0aW9uICsrKQorICAgIHsKKyNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCisgICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIERJU0FTU19EVU1QKQorCWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOworI2VuZGlmCisgICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIEhFWF9EVU1QKQorCWR1bXBfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSk7CisKKyAgICAgIGlmIChkdW1wX3NlY3RzW2ldICYgREVCVUdfRFVNUCkKKwlkaXNwbGF5X2RlYnVnX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOworICAgIH0KKworICBpZiAoaSA8IG51bV9kdW1wX3NlY3RzKQorICAgIHdhcm4gKF8oIlNvbWUgc2VjdGlvbnMgd2VyZSBub3QgZHVtcGVkIGJlY2F1c2UgdGhleSBkbyBub3QgZXhpc3QhXG4iKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAobWFzaykKKyAgICAgaW50IG1hc2s7Cit7CisgIGlmIChtYXNrKQorICAgIHsKKyAgICAgIGludCBmaXJzdCA9IDE7CisgICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5FWCkKKwlmcHV0cyAoIklORVgiLCBzdGRvdXQpLCBmaXJzdCA9IDA7CisgICAgICBpZiAobWFzayAmIE9FWF9GUFVfVUZMTykKKwlwcmludGYgKCIlc1VGTE8iLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOworICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX09GTE8pCisJcHJpbnRmICgiJXNPRkxPIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKKyAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9ESVYwKQorCXByaW50ZiAoIiVzRElWMCIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7CisgICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5WQUwpCisJcHJpbnRmICgiJXNJTlZBTCIsIGZpcnN0ID8gIiIgOiAifCIpOworICAgIH0KKyAgZWxzZQorICAgIGZwdXRzICgiMCIsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbWlwc19zcGVjaWZpYyAoZmlsZSkKKyAgICAgRklMRSAqZmlsZTsKK3sKKyAgRWxmX0ludGVybmFsX0R5biAqZW50cnk7CisgIHNpemVfdCBsaWJsaXN0X29mZnNldCA9IDA7CisgIHNpemVfdCBsaWJsaXN0bm8gPSAwOworICBzaXplX3QgY29uZmxpY3Rzbm8gPSAwOworICBzaXplX3Qgb3B0aW9uc19vZmZzZXQgPSAwOworICBzaXplX3QgY29uZmxpY3RzX29mZnNldCA9IDA7CisKKyAgLyogV2UgaGF2ZSBhIGxvdCBvZiBzcGVjaWFsIHNlY3Rpb25zLiAgVGhhbmtzIFNHSSEgICovCisgIGlmIChkeW5hbWljX3NlZ21lbnQgPT0gTlVMTCkKKyAgICAvKiBObyBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICAqLworICAgIHJldHVybiAwOworCisgIGZvciAoZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7IGVudHJ5LT5kX3RhZyAhPSBEVF9OVUxMOyArK2VudHJ5KQorICAgIHN3aXRjaCAoZW50cnktPmRfdGFnKQorICAgICAgeworICAgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1Q6CisJbGlibGlzdF9vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOworCWJyZWFrOworICAgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzoKKwlsaWJsaXN0bm8gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKKwlicmVhazsKKyAgICAgIGNhc2UgRFRfTUlQU19PUFRJT05TOgorCW9wdGlvbnNfb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKKwlicmVhazsKKyAgICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDoKKwljb25mbGljdHNfb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKKwlicmVhazsKKyAgICAgIGNhc2UgRFRfTUlQU19DT05GTElDVE5POgorCWNvbmZsaWN0c25vID0gZW50cnktPmRfdW4uZF92YWw7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWJyZWFrOworICAgICAgfQorCisgIGlmIChsaWJsaXN0X29mZnNldCAhPSAwICYmIGxpYmxpc3RubyAhPSAwICYmIGRvX2R5bmFtaWMpCisgICAgeworICAgICAgRWxmMzJfRXh0ZXJuYWxfTGliICplbGliOworICAgICAgc2l6ZV90IGNudDsKKworICAgICAgR0VUX0RBVEFfQUxMT0MgKGxpYmxpc3Rfb2Zmc2V0LCBsaWJsaXN0bm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX0xpYiksCisJCSAgICAgIGVsaWIsIEVsZjMyX0V4dGVybmFsX0xpYiAqLCAibGlibGlzdCIpOworCisgICAgICBwcmludGYgKCJcblNlY3Rpb24gJy5saWJsaXN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwgbGlibGlzdG5vKTsKKyAgICAgIGZwdXRzICgiICAgICBMaWJyYXJ5ICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtICAgVmVyc2lvbiBGbGFnc1xuIiwKKwkgICAgIHN0ZG91dCk7CisKKyAgICAgIGZvciAoY250ID0gMDsgY250IDwgbGlibGlzdG5vOyArK2NudCkKKwl7CisJICBFbGYzMl9MaWIgbGlibGlzdDsKKwkgIHRpbWVfdCB0aW1lOworCSAgY2hhciB0aW1lYnVmWzIwXTsKKworCSAgbGlibGlzdC5sX25hbWUgPSBCWVRFX0dFVCAoZWxpYltjbnRdLmxfbmFtZSk7CisJICB0aW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX3RpbWVfc3RhbXApOworCSAgbGlibGlzdC5sX2NoZWNrc3VtID0gQllURV9HRVQgKGVsaWJbY250XS5sX2NoZWNrc3VtKTsKKwkgIGxpYmxpc3QubF92ZXJzaW9uID0gQllURV9HRVQgKGVsaWJbY250XS5sX3ZlcnNpb24pOworCSAgbGlibGlzdC5sX2ZsYWdzID0gQllURV9HRVQgKGVsaWJbY250XS5sX2ZsYWdzKTsKKworCSAgc3RyZnRpbWUgKHRpbWVidWYsIDIwLCAiJVktJW0tJWRUJUg6JU06JVMiLCBnbXRpbWUgKCZ0aW1lKSk7CisKKwkgIHByaW50ZiAoIiUzZDogJS0yMHMgJXMgJSMxMGx4ICUtN2xkIiwgY250LAorCQkgIGR5bmFtaWNfc3RyaW5ncyArIGxpYmxpc3QubF9uYW1lLCB0aW1lYnVmLAorCQkgIGxpYmxpc3QubF9jaGVja3N1bSwgbGlibGlzdC5sX3ZlcnNpb24pOworCisJICBpZiAobGlibGlzdC5sX2ZsYWdzID09IDApCisJICAgIHB1dHMgKCIgTk9ORSIpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdAorCSAgICAgIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJaW50IGJpdDsKKwkgICAgICB9IGxfZmxhZ3NfdmFsc1tdID0KKwkJeworCQkgIHsgIiBFWEFDVF9NQVRDSCIsIExMX0VYQUNUX01BVENIIH0sCisJCSAgeyAiIElHTk9SRV9JTlRfVkVSIiwgTExfSUdOT1JFX0lOVF9WRVIgfSwKKwkJICB7ICIgUkVRVUlSRV9NSU5PUiIsIExMX1JFUVVJUkVfTUlOT1IgfSwKKwkJICB7ICIgRVhQT1JUUyIsIExMX0VYUE9SVFMgfSwKKwkJICB7ICIgREVMQVlfTE9BRCIsIExMX0RFTEFZX0xPQUQgfSwKKwkJICB7ICIgREVMVEEiLCBMTF9ERUxUQSB9CisJCX07CisJICAgICAgaW50IGZsYWdzID0gbGlibGlzdC5sX2ZsYWdzOworCSAgICAgIGludCBmY250OworCisJICAgICAgZm9yIChmY250ID0gMDsKKwkJICAgZmNudCA8IHNpemVvZiAobF9mbGFnc192YWxzKSAvIHNpemVvZiAobF9mbGFnc192YWxzWzBdKTsKKwkJICAgKytmY250KQorCQlpZiAoKGZsYWdzICYgbF9mbGFnc192YWxzW2ZjbnRdLmJpdCkgIT0gMCkKKwkJICB7CisJCSAgICBmcHV0cyAobF9mbGFnc192YWxzW2ZjbnRdLm5hbWUsIHN0ZG91dCk7CisJCSAgICBmbGFncyBePSBsX2ZsYWdzX3ZhbHNbZmNudF0uYml0OworCQkgIH0KKwkgICAgICBpZiAoZmxhZ3MgIT0gMCkKKwkJcHJpbnRmICgiICUjeCIsICh1bnNpZ25lZCBpbnQpIGZsYWdzKTsKKworCSAgICAgIHB1dHMgKCIiKTsKKwkgICAgfQorCX0KKworICAgICAgZnJlZSAoZWxpYik7CisgICAgfQorCisgIGlmIChvcHRpb25zX29mZnNldCAhPSAwKQorICAgIHsKKyAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICplb3B0OworICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnNlY3QgPSBzZWN0aW9uX2hlYWRlcnM7CisgICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyAqaW9wdDsKKyAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICpvcHRpb247CisgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgaW50IGNudDsKKworICAgICAgLyogRmluZCB0aGUgc2VjdGlvbiBoZWFkZXIgc28gdGhhdCB3ZSBnZXQgdGhlIHNpemUuICAqLworICAgICAgd2hpbGUgKHNlY3QtPnNoX3R5cGUgIT0gU0hUX01JUFNfT1BUSU9OUykKKwkrK3NlY3Q7CisKKyAgICAgIEdFVF9EQVRBX0FMTE9DIChvcHRpb25zX29mZnNldCwgc2VjdC0+c2hfc2l6ZSwgZW9wdCwKKwkJICAgICAgRWxmX0V4dGVybmFsX09wdGlvbnMgKiwgIm9wdGlvbnMiKTsKKworICAgICAgaW9wdCA9IChFbGZfSW50ZXJuYWxfT3B0aW9ucyAqKSBtYWxsb2MgKChzZWN0LT5zaF9zaXplIC8gc2l6ZW9mIChlb3B0KSkKKwkJCQkJICAgICAgKiBzaXplb2YgKCppb3B0KSk7CisgICAgICBpZiAoaW9wdCA9PSBOVUxMKQorCXsKKwkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBvZmZzZXQgPSBjbnQgPSAwOworICAgICAgb3B0aW9uID0gaW9wdDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCBzZWN0LT5zaF9zaXplKQorCXsKKwkgIEVsZl9FeHRlcm5hbF9PcHRpb25zICplb3B0aW9uOworCisJICBlb3B0aW9uID0gKEVsZl9FeHRlcm5hbF9PcHRpb25zICopICgoY2hhciAqKSBlb3B0ICsgb2Zmc2V0KTsKKworCSAgb3B0aW9uLT5raW5kID0gQllURV9HRVQgKGVvcHRpb24tPmtpbmQpOworCSAgb3B0aW9uLT5zaXplID0gQllURV9HRVQgKGVvcHRpb24tPnNpemUpOworCSAgb3B0aW9uLT5zZWN0aW9uID0gQllURV9HRVQgKGVvcHRpb24tPnNlY3Rpb24pOworCSAgb3B0aW9uLT5pbmZvID0gQllURV9HRVQgKGVvcHRpb24tPmluZm8pOworCisJICBvZmZzZXQgKz0gb3B0aW9uLT5zaXplOworCSAgKytvcHRpb247CisJICArK2NudDsKKwl9CisKKyAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIpLAorCSAgICAgIHN0cmluZ190YWJsZSArIHNlY3QtPnNoX25hbWUsIGNudCk7CisKKyAgICAgIG9wdGlvbiA9IGlvcHQ7CisgICAgICB3aGlsZSAoY250LS0gPiAwKQorCXsKKwkgIHNpemVfdCBsZW47CisKKwkgIHN3aXRjaCAob3B0aW9uLT5raW5kKQorCSAgICB7CisJICAgIGNhc2UgT0RLX05VTEw6CisJICAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiAgKi8KKwkgICAgICBwcmludGYgKCIgTlVMTCAgICAgICAlZCAlbHgiLCBvcHRpb24tPnNlY3Rpb24sIG9wdGlvbi0+aW5mbyk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX1JFR0lORk86CisJICAgICAgcHJpbnRmICgiIFJFR0lORk8gICAgIik7CisJICAgICAgaWYgKGVsZl9oZWFkZXIuZV9tYWNoaW5lID09IEVNX01JUFMpCisJCXsKKwkJICAvKiAzMmJpdCBmb3JtLiAgKi8KKwkJICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICplcmVnOworCQkgIEVsZjMyX1JlZ0luZm8gcmVnaW5mbzsKKworCQkgIGVyZWcgPSAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKSAob3B0aW9uICsgMSk7CisJCSAgcmVnaW5mby5yaV9ncHJtYXNrID0gQllURV9HRVQgKGVyZWctPnJpX2dwcm1hc2spOworCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzBdKTsKKwkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMV0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1sxXSk7CisJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzJdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMl0pOworCQkgIHJlZ2luZm8ucmlfY3BybWFza1szXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzNdKTsKKwkJICByZWdpbmZvLnJpX2dwX3ZhbHVlID0gQllURV9HRVQgKGVyZWctPnJpX2dwX3ZhbHVlKTsKKworCQkgIHByaW50ZiAoIkdQUiAlMDhseCAgR1AgMHglbHhcbiIsCisJCQkgIHJlZ2luZm8ucmlfZ3BybWFzaywKKwkJCSAgKHVuc2lnbmVkIGxvbmcpIHJlZ2luZm8ucmlfZ3BfdmFsdWUpOworCQkgIHByaW50ZiAoIiAgICAgICAgICAgIENQUjAgJTA4bHggIENQUjEgJTA4bHggIENQUjIgJTA4bHggIENQUjMgJTA4bHhcbiIsCisJCQkgIHJlZ2luZm8ucmlfY3BybWFza1swXSwgcmVnaW5mby5yaV9jcHJtYXNrWzFdLAorCQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0sIHJlZ2luZm8ucmlfY3BybWFza1szXSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiA2NCBiaXQgZm9ybS4gICovCisJCSAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXJlZzsKKwkJICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIHJlZ2luZm87CisKKwkJICBlcmVnID0gKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikgKG9wdGlvbiArIDEpOworCQkgIHJlZ2luZm8ucmlfZ3BybWFzayA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncHJtYXNrKTsKKwkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1swXSk7CisJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzFdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMV0pOworCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzJdKTsKKwkJICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1szXSk7CisJCSAgcmVnaW5mby5yaV9ncF92YWx1ZSA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncF92YWx1ZSk7CisKKwkJICBwcmludGYgKCJHUFIgJTA4bHggIEdQIDB4IiwKKwkJCSAgcmVnaW5mby5yaV9ncHJtYXNrKTsKKwkJICBwcmludGZfdm1hIChyZWdpbmZvLnJpX2dwX3ZhbHVlKTsKKwkJICBwcmludGYgKCJcbiIpOworCisJCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKKwkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCisJCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKKwkJfQorCSAgICAgICsrb3B0aW9uOworCSAgICAgIGNvbnRpbnVlOworCSAgICBjYXNlIE9ES19FWENFUFRJT05TOgorCSAgICAgIGZwdXRzICgiIEVYQ0VQVElPTlMgZnBlX21pbigiLCBzdGRvdXQpOworCSAgICAgIHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uIChvcHRpb24tPmluZm8gJiBPRVhfRlBVX01JTik7CisJICAgICAgZnB1dHMgKCIpIGZwZV9tYXgoIiwgc3Rkb3V0KTsKKwkgICAgICBwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAoKG9wdGlvbi0+aW5mbyAmIE9FWF9GUFVfTUFYKSA+PiA4KTsKKwkgICAgICBmcHV0cyAoIikiLCBzdGRvdXQpOworCisJICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9QQUdFMCkKKwkJZnB1dHMgKCIgUEFHRTAiLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfU01NKQorCQlmcHV0cyAoIiBTTU0iLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRlBEQlVHKQorCQlmcHV0cyAoIiBGUERCVUciLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRElTTUlTUykKKwkJZnB1dHMgKCIgRElTTUlTUyIsIHN0ZG91dCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX1BBRDoKKwkgICAgICBmcHV0cyAoIiBQQUQgICAgICAgIiwgc3Rkb3V0KTsKKwkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT1BBRF9QUkVGSVgpCisJCWZwdXRzICgiIFBSRUZJWCIsIHN0ZG91dCk7CisJICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfUE9TVEZJWCkKKwkJZnB1dHMgKCIgUE9TVEZJWCIsIHN0ZG91dCk7CisJICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfU1lNQk9MKQorCQlmcHV0cyAoIiBTWU1CT0wiLCBzdGRvdXQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE9ES19IV1BBVENIOgorCSAgICAgIGZwdXRzICgiIEhXUEFUQ0ggICAiLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjRLRU9QKQorCQlmcHV0cyAoIiBSNEtFT1AiLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjhLUEZFVENIKQorCQlmcHV0cyAoIiBSOEtQRkVUQ0giLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLRU9QKQorCQlmcHV0cyAoIiBSNUtFT1AiLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLQ1ZUTCkKKwkJZnB1dHMgKCIgUjVLQ1ZUTCIsIHN0ZG91dCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX0ZJTEw6CisJICAgICAgZnB1dHMgKCIgRklMTCAgICAgICAiLCBzdGRvdXQpOworCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX1RBR1M6CisJICAgICAgZnB1dHMgKCIgVEFHUyAgICAgICAiLCBzdGRvdXQpOworCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX0hXQU5EOgorCSAgICAgIGZwdXRzICgiIEhXQU5EICAgICAiLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0hFQ0tFRCkKKwkJZnB1dHMgKCIgUjRLRU9QX0NIRUNLRUQiLCBzdGRvdXQpOworCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0xFQU4pCisJCWZwdXRzICgiIFI0S0VPUF9DTEVBTiIsIHN0ZG91dCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX0hXT1I6CisJICAgICAgZnB1dHMgKCIgSFdPUiAgICAgICIsIHN0ZG91dCk7CisJICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DSEVDS0VEKQorCQlmcHV0cyAoIiBSNEtFT1BfQ0hFQ0tFRCIsIHN0ZG91dCk7CisJICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DTEVBTikKKwkJZnB1dHMgKCIgUjRLRU9QX0NMRUFOIiwgc3Rkb3V0KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBPREtfR1BfR1JPVVA6CisJICAgICAgcHJpbnRmICgiIEdQX0dST1VQICAlIzA2bHggIHNlbGYtY29udGFpbmVkICUjMDZseCIsCisJCSAgICAgIG9wdGlvbi0+aW5mbyAmIE9HUF9HUk9VUCwKKwkJICAgICAgKG9wdGlvbi0+aW5mbyAmIE9HUF9TRUxGKSA+PiAxNik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT0RLX0lERU5UOgorCSAgICAgIHByaW50ZiAoIiBJREVOVCAgICAgJSMwNmx4ICBzZWxmLWNvbnRhaW5lZCAlIzA2bHgiLAorCQkgICAgICBvcHRpb24tPmluZm8gJiBPR1BfR1JPVVAsCisJCSAgICAgIChvcHRpb24tPmluZm8gJiBPR1BfU0VMRikgPj4gMTYpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gICovCisJICAgICAgcHJpbnRmICgiICUzZCA/Pz8gICAgICVkICVseCIsCisJCSAgICAgIG9wdGlvbi0+a2luZCwgb3B0aW9uLT5zZWN0aW9uLCBvcHRpb24tPmluZm8pOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGxlbiA9IHNpemVvZiAoKmVvcHQpOworCSAgd2hpbGUgKGxlbiA8IG9wdGlvbi0+c2l6ZSkKKwkgICAgaWYgKCgoY2hhciAqKSBvcHRpb24pW2xlbl0gPj0gJyAnCisJCSYmICgoY2hhciAqKSBvcHRpb24pW2xlbl0gPCAweDdmKQorCSAgICAgIHByaW50ZiAoIiVjIiwgKChjaGFyICopIG9wdGlvbilbbGVuKytdKTsKKwkgICAgZWxzZQorCSAgICAgIHByaW50ZiAoIlxcJTAzbyIsICgoY2hhciAqKSBvcHRpb24pW2xlbisrXSk7CisKKwkgIGZwdXRzICgiXG4iLCBzdGRvdXQpOworCSAgKytvcHRpb247CisJfQorCisgICAgICBmcmVlIChlb3B0KTsKKyAgICB9CisKKyAgaWYgKGNvbmZsaWN0c19vZmZzZXQgIT0gMCAmJiBjb25mbGljdHNubyAhPSAwKQorICAgIHsKKyAgICAgIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0ICplY29uZjMyOworICAgICAgRWxmNjRfRXh0ZXJuYWxfQ29uZmxpY3QgKmVjb25mNjQ7CisgICAgICBFbGYzMl9Db25mbGljdCAqaWNvbmY7CisgICAgICBzaXplX3QgY250OworCisgICAgICBpZiAoZHluYW1pY19zeW1ib2xzID09IE5VTEwpCisJeworCSAgZXJyb3IgKF8oImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIikpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpY29uZiA9IChFbGYzMl9Db25mbGljdCAqKSBtYWxsb2MgKGNvbmZsaWN0c25vICogc2l6ZW9mICgqaWNvbmYpKTsKKyAgICAgIGlmIChpY29uZiA9PSBOVUxMKQorCXsKKwkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAoYmluYXJ5X2NsYXNzID09IEVMRkNMQVNTMzIpCisJeworCSAgR0VUX0RBVEFfQUxMT0MgKGNvbmZsaWN0c19vZmZzZXQsIGNvbmZsaWN0c25vICogc2l6ZW9mICgqZWNvbmYzMiksCisJCQkgIGVjb25mMzIsIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0ICosICJjb25mbGljdCIpOworCisJICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKKwkgICAgaWNvbmZbY250XSA9IEJZVEVfR0VUIChlY29uZjMyW2NudF0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBHRVRfREFUQV9BTExPQyAoY29uZmxpY3RzX29mZnNldCwgY29uZmxpY3Rzbm8gKiBzaXplb2YgKCplY29uZjY0KSwKKwkJCSAgZWNvbmY2NCwgRWxmNjRfRXh0ZXJuYWxfQ29uZmxpY3QgKiwgImNvbmZsaWN0Iik7CisKKwkgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQorCSAgICBpY29uZltjbnRdID0gQllURV9HRVQgKGVjb25mNjRbY250XSk7CisJfQorCisgICAgICBwcmludGYgKF8oIlxuU2VjdGlvbiAnLmNvbmZsaWN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksIGNvbmZsaWN0c25vKTsKKyAgICAgIHB1dHMgKF8oIiAgTnVtOiAgICBJbmRleCAgICAgICBWYWx1ZSAgTmFtZSIpKTsKKworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCisJeworCSAgRWxmX0ludGVybmFsX1N5bSAqcHN5bSA9ICZkeW5hbWljX3N5bWJvbHNbaWNvbmZbY250XV07CisKKwkgIHByaW50ZiAoIiU1dTogJThsdSAgJSMxMGx4ICAlc1xuIiwKKwkJICBjbnQsIGljb25mW2NudF0sICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSwKKwkJICBkeW5hbWljX3N0cmluZ3MgKyBwc3ltLT5zdF9uYW1lKTsKKwl9CisKKworICAgICAgZnJlZSAoaWNvbmYpOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKQorICAgICBGSUxFICpmaWxlOworeworICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQorICAgIHsKKyAgICBjYXNlIEVNX01JUFM6CisgICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKKyAgICAgIHJldHVybiBwcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9maWxlX2hlYWRlciAoZmlsZSkKKyAgICAgRklMRSAqIGZpbGU7Cit7CisgIEVsZjMyX0V4dGVybmFsX0VoZHIgZWhkcjsKKworICBpZiAoZnJlYWQgKCYgZWhkciwgc2l6ZW9mIChlaGRyKSwgMSwgZmlsZSkgIT0gMSkKKyAgICByZXR1cm4gMDsKKworICBtZW1jcHkgKGVsZl9oZWFkZXIuZV9pZGVudCwgZWhkci5lX2lkZW50LCBFSV9OSURFTlQpOworCisgIGlmIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX0RBVEFdID09IEVMRkRBVEEyTFNCKQorICAgIGJ5dGVfZ2V0ID0gYnl0ZV9nZXRfbGl0dGxlX2VuZGlhbjsKKyAgZWxzZQorICAgIGJ5dGVfZ2V0ID0gYnl0ZV9nZXRfYmlnX2VuZGlhbjsKKworICBlbGZfaGVhZGVyLmVfZW50cnkgICAgID0gQllURV9HRVQgKGVoZHIuZV9lbnRyeSk7CisgIGVsZl9oZWFkZXIuZV9waG9mZiAgICAgPSBCWVRFX0dFVCAoZWhkci5lX3Bob2ZmKTsKKyAgZWxmX2hlYWRlci5lX3Nob2ZmICAgICA9IEJZVEVfR0VUIChlaGRyLmVfc2hvZmYpOworICBlbGZfaGVhZGVyLmVfdmVyc2lvbiAgID0gQllURV9HRVQgKGVoZHIuZV92ZXJzaW9uKTsKKyAgZWxmX2hlYWRlci5lX2ZsYWdzICAgICA9IEJZVEVfR0VUIChlaGRyLmVfZmxhZ3MpOworICBlbGZfaGVhZGVyLmVfdHlwZSAgICAgID0gQllURV9HRVQgKGVoZHIuZV90eXBlKTsKKyAgZWxmX2hlYWRlci5lX21hY2hpbmUgICA9IEJZVEVfR0VUIChlaGRyLmVfbWFjaGluZSk7CisgIGVsZl9oZWFkZXIuZV9laHNpemUgICAgPSBCWVRFX0dFVCAoZWhkci5lX2Voc2l6ZSk7CisgIGVsZl9oZWFkZXIuZV9waGVudHNpemUgPSBCWVRFX0dFVCAoZWhkci5lX3BoZW50c2l6ZSk7CisgIGVsZl9oZWFkZXIuZV9waG51bSAgICAgPSBCWVRFX0dFVCAoZWhkci5lX3BobnVtKTsKKyAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSA9IEJZVEVfR0VUIChlaGRyLmVfc2hlbnRzaXplKTsKKyAgZWxmX2hlYWRlci5lX3NobnVtICAgICA9IEJZVEVfR0VUIChlaGRyLmVfc2hudW0pOworICBlbGZfaGVhZGVyLmVfc2hzdHJuZHggID0gQllURV9HRVQgKGVoZHIuZV9zaHN0cm5keCk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2ZpbGUgKGZpbGVfbmFtZSkKKyAgICAgY2hhciAqIGZpbGVfbmFtZTsKK3sKKyAgRklMRSAqICAgICAgIGZpbGU7CisgIHN0cnVjdCBzdGF0ICBzdGF0YnVmOworICB1bnNpZ25lZCBpbnQgaTsKKworICBpZiAoc3RhdCAoZmlsZV9uYW1lLCAmIHN0YXRidWYpIDwgMCkKKyAgICB7CisgICAgICBlcnJvciAoXygiQ2Fubm90IHN0YXQgaW5wdXQgZmlsZSAlcy5cbiIpLCBmaWxlX25hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmaWxlID0gZm9wZW4gKGZpbGVfbmFtZSwgInJiIik7CisgIGlmIChmaWxlID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKF8oIklucHV0IGZpbGUgJXMgbm90IGZvdW5kLlxuIiksIGZpbGVfbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghIGdldF9maWxlX2hlYWRlciAoZmlsZSkpCisgICAgeworICAgICAgZXJyb3IgKF8oIiVzOiBGYWlsZWQgdG8gcmVhZCBmaWxlIGhlYWRlclxuIiksIGZpbGVfbmFtZSk7CisgICAgICBmY2xvc2UgKGZpbGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBJbml0aWFsaXNlIHBlciBmaWxlIHZhcmlhYmxlcy4gICovCisgIGZvciAoaSA9IE5VTV9FTEVNICh2ZXJzaW9uX2luZm8pOyBpLS07KQorICAgIHZlcnNpb25faW5mb1tpXSA9IDA7CisKKyAgZm9yIChpID0gTlVNX0VMRU0gKGR5bmFtaWNfaW5mbyk7IGktLTspCisgICAgZHluYW1pY19pbmZvW2ldID0gMDsKKworICAvKiBQcm9jZXNzIHRoZSBmaWxlLiAgKi8KKyAgaWYgKHNob3dfbmFtZSkKKyAgICBwcmludGYgKF8oIlxuRmlsZTogJXNcbiIpLCBmaWxlX25hbWUpOworCisgIGlmICghIHByb2Nlc3NfZmlsZV9oZWFkZXIgKCkpCisgICAgeworICAgICAgZmNsb3NlIChmaWxlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcHJvY2Vzc19zZWN0aW9uX2hlYWRlcnMgKGZpbGUpOworCisgIHByb2Nlc3NfcHJvZ3JhbV9oZWFkZXJzIChmaWxlKTsKKworICBwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSk7CisKKyAgcHJvY2Vzc19yZWxvY3MgKGZpbGUpOworCisgIHByb2Nlc3Nfc3ltYm9sX3RhYmxlIChmaWxlKTsKKworICBwcm9jZXNzX3N5bWluZm8gKGZpbGUpOworCisgIHByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAoZmlsZSk7CisKKyAgcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzIChmaWxlKTsKKworICBwcm9jZXNzX2FyY2hfc3BlY2lmaWMgKGZpbGUpOworCisgIGZjbG9zZSAoZmlsZSk7CisKKyAgaWYgKHNlY3Rpb25faGVhZGVycykKKyAgICB7CisgICAgICBmcmVlIChzZWN0aW9uX2hlYWRlcnMpOworICAgICAgc2VjdGlvbl9oZWFkZXJzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHN0cmluZ190YWJsZSkKKyAgICB7CisgICAgICBmcmVlIChzdHJpbmdfdGFibGUpOworICAgICAgc3RyaW5nX3RhYmxlID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGR5bmFtaWNfc3RyaW5ncykKKyAgICB7CisgICAgICBmcmVlIChkeW5hbWljX3N0cmluZ3MpOworICAgICAgZHluYW1pY19zdHJpbmdzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGR5bmFtaWNfc3ltYm9scykKKyAgICB7CisgICAgICBmcmVlIChkeW5hbWljX3N5bWJvbHMpOworICAgICAgZHluYW1pY19zeW1ib2xzID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGR5bmFtaWNfc3ltaW5mbykKKyAgICB7CisgICAgICBmcmVlIChkeW5hbWljX3N5bWluZm8pOworICAgICAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKKyAgICB9Cit9CisKKyNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCisvKiBOZWVkZWQgYnkgdGhlIGkzODYgZGlzYXNzZW1ibGVyLiAgRm9yIGV4dHJhIGNyZWRpdCwgc29tZW9uZSBjb3VsZAorZml4IHRoaXMgc28gdGhhdCB3ZSBpbnNlcnQgc3ltYm9saWMgYWRkcmVzc2VzIGhlcmUsIGVzcCBmb3IgR09UL1BMVAorc3ltYm9scyAqLworCit2b2lkCitwcmludF9hZGRyZXNzICh1bnNpZ25lZCBpbnQgYWRkciwgRklMRSAqIG91dGZpbGUpCit7CisgIGZwcmludGYgKG91dGZpbGUsIjB4JTguOHgiLCBhZGRyKTsKK30KKworLyogTmVlZGVkIGJ5IHRoZSBpMzg2IGRpc2Fzc2VtYmxlci4gKi8KK3ZvaWQKK2RiX3Rhc2tfcHJpbnRzeW0gKHVuc2lnbmVkIGludCBhZGRyKQoreworICBwcmludF9hZGRyZXNzIChhZGRyLCBzdGRlcnIpOworfQorI2VuZGlmCisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50ICAgICBhcmdjOworICAgICBjaGFyICoqIGFyZ3Y7Cit7CisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcGFyc2VfYXJncyAoYXJnYywgYXJndik7CisKKyAgaWYgKG9wdGluZCA8IChhcmdjIC0gMSkpCisgICAgc2hvd19uYW1lID0gMTsKKworICB3aGlsZSAob3B0aW5kIDwgYXJnYykKKyAgICBwcm9jZXNzX2ZpbGUgKGFyZ3YgW29wdGluZCArK10pOworCisgIGlmIChkdW1wX3NlY3RzICE9IE5VTEwpCisgICAgZnJlZSAoZHVtcF9zZWN0cyk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZW5hbWUuYyBiL2JpbnV0aWxzL3JlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzcyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9yZW5hbWUuYwpAQCAtMCwwICsxLDIxMCBAQAorLyogcmVuYW1lLmMgLS0gcmVuYW1lIGEgZmlsZSwgcHJlc2VydmluZyBzeW1saW5rcy4KKyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIEhBVkVfR09PRF9VVElNRV9ICisjaW5jbHVkZSA8dXRpbWUuaD4KKyNlbHNlIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KKyNpZmRlZiBIQVZFX1VUSU1FUworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KKyNlbmRpZiAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCisKK3N0YXRpYyBpbnQgc2ltcGxlX2NvcHkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKworLyogVGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGF0IG9uY2UuICAqLworI2RlZmluZSBDT1BZX0JVRiA4MTkyCisKKy8qIENvcHkgZmlsZSBGUk9NIHRvIGZpbGUgVE8sIHBlcmZvcm1pbmcgbm8gdHJhbnNsYXRpb25zLgorICAgUmV0dXJuIDAgaWYgb2ssIC0xIGlmIGVycm9yLiAgKi8KKworc3RhdGljIGludAorc2ltcGxlX2NvcHkgKGZyb20sIHRvKQorICAgICBjb25zdCBjaGFyICpmcm9tOworICAgICBjb25zdCBjaGFyICp0bzsKK3sKKyAgaW50IGZyb21mZCwgdG9mZCwgbnJlYWQ7CisgIGludCBzYXZlZDsKKyAgY2hhciBidWZbQ09QWV9CVUZdOworCisgIGZyb21mZCA9IG9wZW4gKGZyb20sIE9fUkRPTkxZKTsKKyAgaWYgKGZyb21mZCA8IDApCisgICAgcmV0dXJuIC0xOworICB0b2ZkID0gY3JlYXQgKHRvLCAwNzc3KTsKKyAgaWYgKHRvZmQgPCAwKQorICAgIHsKKyAgICAgIHNhdmVkID0gZXJybm87CisgICAgICBjbG9zZSAoZnJvbWZkKTsKKyAgICAgIGVycm5vID0gc2F2ZWQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB3aGlsZSAoKG5yZWFkID0gcmVhZCAoZnJvbWZkLCBidWYsIHNpemVvZiBidWYpKSA+IDApCisgICAgeworICAgICAgaWYgKHdyaXRlICh0b2ZkLCBidWYsIG5yZWFkKSAhPSBucmVhZCkKKwl7CisJICBzYXZlZCA9IGVycm5vOworCSAgY2xvc2UgKGZyb21mZCk7CisJICBjbG9zZSAodG9mZCk7CisJICBlcnJubyA9IHNhdmVkOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisgIHNhdmVkID0gZXJybm87CisgIGNsb3NlIChmcm9tZmQpOworICBjbG9zZSAodG9mZCk7CisgIGlmIChucmVhZCA8IDApCisgICAgeworICAgICAgZXJybm8gPSBzYXZlZDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBTZXQgdGhlIHRpbWVzIG9mIHRoZSBmaWxlIERFU1RJTkFUSU9OIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlIGluCisgICBTVEFUQlVGLiAgKi8KKwordm9pZAorc2V0X3RpbWVzIChkZXN0aW5hdGlvbiwgc3RhdGJ1ZikKKyAgICAgY29uc3QgY2hhciAqZGVzdGluYXRpb247CisgICAgIGNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmOworeworICBpbnQgcmVzdWx0OworCisgIHsKKyNpZmRlZiBIQVZFX0dPT0RfVVRJTUVfSAorICAgIHN0cnVjdCB1dGltYnVmIHRiOworCisgICAgdGIuYWN0aW1lID0gc3RhdGJ1Zi0+c3RfYXRpbWU7CisgICAgdGIubW9kdGltZSA9IHN0YXRidWYtPnN0X210aW1lOworICAgIHJlc3VsdCA9IHV0aW1lIChkZXN0aW5hdGlvbiwgJnRiKTsKKyNlbHNlIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KKyNpZm5kZWYgSEFWRV9VVElNRVMKKyAgICBsb25nIHRiWzJdOworCisgICAgdGJbMF0gPSBzdGF0YnVmLT5zdF9hdGltZTsKKyAgICB0YlsxXSA9IHN0YXRidWYtPnN0X210aW1lOworICAgIHJlc3VsdCA9IHV0aW1lIChkZXN0aW5hdGlvbiwgdGIpOworI2Vsc2UgLyogSEFWRV9VVElNRVMgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCB0dlsyXTsKKworICAgIHR2WzBdLnR2X3NlYyA9IHN0YXRidWYtPnN0X2F0aW1lOworICAgIHR2WzBdLnR2X3VzZWMgPSAwOworICAgIHR2WzFdLnR2X3NlYyA9IHN0YXRidWYtPnN0X210aW1lOworICAgIHR2WzFdLnR2X3VzZWMgPSAwOworICAgIHJlc3VsdCA9IHV0aW1lcyAoZGVzdGluYXRpb24sIHR2KTsKKyNlbmRpZiAvKiBIQVZFX1VUSU1FUyAqLworI2VuZGlmIC8qICEgSEFWRV9HT09EX1VUSU1FX0ggKi8KKyAgfQorCisgIGlmIChyZXN1bHQgIT0gMCkKKyAgICBub25fZmF0YWwgKF8oIiVzOiBjYW5ub3Qgc2V0IHRpbWU6ICVzIiksIGRlc3RpbmF0aW9uLCBzdHJlcnJvciAoZXJybm8pKTsKK30KKworI2lmbmRlZiBTX0lTTE5LCisjaWZkZWYgU19JRkxOSworI2RlZmluZSBTX0lTTE5LKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQorI2Vsc2UKKyNkZWZpbmUgU19JU0xOSyhtKSAwCisjZGVmaW5lIGxzdGF0IHN0YXQKKyNlbmRpZgorI2VuZGlmCisKKy8qIFJlbmFtZSBGUk9NIHRvIFRPLCBjb3B5aW5nIGlmIFRPIGlzIGEgbGluay4KKyAgIFJldHVybiAwIGlmIG9rLCAtMSBpZiBlcnJvci4gICovCisKK2ludAorc21hcnRfcmVuYW1lIChmcm9tLCB0bywgcHJlc2VydmVfZGF0ZXMpCisgICAgIGNvbnN0IGNoYXIgKmZyb207CisgICAgIGNvbnN0IGNoYXIgKnRvOworICAgICBpbnQgcHJlc2VydmVfZGF0ZXM7Cit7CisgIGludCBleGlzdHM7CisgIHN0cnVjdCBzdGF0IHM7CisgIGludCByZXQgPSAwOworCisgIGV4aXN0cyA9IGxzdGF0ICh0bywgJnMpOworCisjaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU4zMl9fKQorICAvKiBXaW4zMiwgdW5saWtlIHVuaXgsIHdpbGwgbm90IGVyYXNlIGB0bycgaW4gYHJlbmFtZShmcm9tLCB0byknIGJ1dAorICAgICBmYWlsIGluc3RlYWQuICBBbHNvLCBjaG93biBpcyBub3QgcHJlc2VudC4gICovCisKKyAgaWYgKGV4aXN0cyA9PSAwKQorICAgIHJlbW92ZSAodG8pOworCisgIHJldCA9IHJlbmFtZSAoZnJvbSwgdG8pOworICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLiAqLworICAgICAgCisgICAgICBub25fZmF0YWwgKF8oIiVzOiByZW5hbWU6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHVubGluayAoZnJvbSk7CisgICAgfQorI2Vsc2UKKyAgLyogVXNlIHJlbmFtZSBvbmx5IGlmIFRPIGlzIG5vdCBhIHN5bWJvbGljIGxpbmsgYW5kIGhhcworICAgICBvbmx5IG9uZSBoYXJkIGxpbmsuICAqLworICBpZiAoZXhpc3RzIDwgMCB8fCAoIVNfSVNMTksgKHMuc3RfbW9kZSkgJiYgcy5zdF9ubGluayA9PSAxKSkKKyAgICB7CisgICAgICByZXQgPSByZW5hbWUgKGZyb20sIHRvKTsKKyAgICAgIGlmIChyZXQgPT0gMCkKKwl7CisJICBpZiAoZXhpc3RzKQorCSAgICB7CisJICAgICAgLyogVHJ5IHRvIHByZXNlcnZlIHRoZSBwZXJtaXNzaW9uIGJpdHMgYW5kIG93bmVyc2hpcCBvZgorCQkgVE8uICBGaXJzdCBnZXQgdGhlIG1vZGUgcmlnaHQgZXhjZXB0IGZvciB0aGUgc2V0dWlkCisJCSBiaXQuICBUaGVuIGNoYW5nZSB0aGUgb3duZXJzaGlwLiAgVGhlbiBmaXggdGhlIHNldHVpZAorCQkgYml0LiAgV2UgZG8gdGhlIGNobW9kIGJlZm9yZSB0aGUgY2hvd24gYmVjYXVzZSBpZiB0aGUKKwkJIGNob3duIHN1Y2NlZWRzLCBhbmQgd2UgYXJlIGEgbm9ybWFsIHVzZXIsIHdlIHdvbid0IGJlCisJCSBhYmxlIHRvIGRvIHRoZSBjaG1vZCBhZnRlcndhcmQuICBXZSBkb24ndCBib3RoZXIgdG8KKwkJIGZpeCB0aGUgc2V0dWlkIGJpdCBmaXJzdCBiZWNhdXNlIHRoYXQgbWlnaHQgaW50cm9kdWNlCisJCSBhIGZsZWV0aW5nIHNlY3VyaXR5IHByb2JsZW0sIGFuZCBiZWNhdXNlIHRoZSBjaG93bgorCQkgd2lsbCBjbGVhciB0aGUgc2V0dWlkIGJpdCBhbnlob3cuICBXZSBvbmx5IGZpeCB0aGUKKwkJIHNldHVpZCBiaXQgaWYgdGhlIGNob3duIHN1Y2NlZWRzLCBiZWNhdXNlIHdlIGRvbid0CisJCSB3YW50IHRvIGludHJvZHVjZSBhbiB1bmV4cGVjdGVkIHNldHVpZCBmaWxlIG93bmVkIGJ5CisJCSB0aGUgdXNlciBydW5uaW5nIG9iamNvcHkuICAqLworCSAgICAgIGNobW9kICh0bywgcy5zdF9tb2RlICYgMDc3Nyk7CisJICAgICAgaWYgKGNob3duICh0bywgcy5zdF91aWQsIHMuc3RfZ2lkKSA+PSAwKQorCQljaG1vZCAodG8sIHMuc3RfbW9kZSAmIDA3Nzc3KTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCisJICBub25fZmF0YWwgKF8oIiVzOiByZW5hbWU6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKKwkgIHVubGluayAoZnJvbSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldCA9IHNpbXBsZV9jb3B5IChmcm9tLCB0byk7CisgICAgICBpZiAocmV0ICE9IDApCisJbm9uX2ZhdGFsIChfKCIlczogc2ltcGxlX2NvcHk6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQorCXNldF90aW1lcyAodG8sICZzKTsKKyAgICAgIHVubGluayAoZnJvbSk7CisgICAgfQorI2VuZGlmIC8qIF9XSU4zMiAmJiAhX19DWUdXSU4zMl9fICovCisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc2Jpbi5jIGIvYmludXRpbHMvcmVzYmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMDdmYgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Jlc2Jpbi5jCkBAIC0wLDAgKzEsMjM4NyBAQAorLyogcmVzYmluLmMgLS0gbWFuaXB1bGF0ZSB0aGUgV2luZG93cyBiaW5hcnkgcmVzb3VyY2UgZm9ybWF0LgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgYmluYXJ5IHJlc291cmNlCisgICBmb3JtYXQgYW5kIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIHRoYXQgd2Ugd2FudCB0byB1c2UuICBUaGUgc2FtZQorICAgYmluYXJ5IHJlc291cmNlIGZvcm1hdCBpcyB1c2VkIGluIGJvdGggcmVzIGFuZCBDT0ZGIGZpbGVzLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgIndpbmRyZXMuaCIKKworLyogTWFjcm9zIHRvIHN3YXAgaW4gdmFsdWVzLiAgKi8KKworI2RlZmluZSBnZXRfMTYoYmUsIHMpICgoYmUpID8gYmZkX2dldGIxNiAocykgOiBiZmRfZ2V0bDE2IChzKSkKKyNkZWZpbmUgZ2V0XzMyKGJlLCBzKSAoKGJlKSA/IGJmZF9nZXRiMzIgKHMpIDogYmZkX2dldGwzMiAocykpCisKKy8qIExvY2FsIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkIHRvb3NtYWxsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIHVuaWNoYXIgKmdldF91bmljb2RlCisgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOworc3RhdGljIGludCBnZXRfcmVzaWQKKyAgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOworc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZ2VuZXJpYworICBQQVJBTVMgKChlbnVtIHJlc190eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2N1cnNvcgorICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOworc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfbWVudQorICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOworc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqYmluX3RvX3Jlc19tZW51aXRlbXMKKyAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKSk7CitzdGF0aWMgc3RydWN0IG1lbnVpdGVtICpiaW5fdG9fcmVzX21lbnVleGl0ZW1zCisgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOworc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZGlhbG9nCisgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7CitzdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19zdHJpbmcKKyAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2ZvbnRkaXIKKyAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycworICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOworc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfcmNkYXRhCisgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7CitzdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19ncm91cF9jdXJzb3IKKyAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2dyb3VwX2ljb24KKyAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3ZlcnNpb24KKyAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3VzZXJkYXRhCisgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7CisKKy8qIEdpdmVuIGEgcmVzb3VyY2UgdHlwZSBJRCwgYSBwb2ludGVyIHRvIGRhdGEsIGEgbGVuZ3RoLCByZXR1cm4gYQorICAgcmVzX3Jlc291cmNlIHN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIHRoYXQgcmVzb3VyY2UuICBUaGUgY2FsbGVyCisgICBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSByZXNfaW5mbyBhbmQgY29mZl9pbmZvIGZpZWxkcworICAgb2YgdGhlIHJldHVybmVkIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCByZXNfcmVzb3VyY2UgKgorYmluX3RvX3JlcyAodHlwZSwgZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBzdHJ1Y3QgcmVzX2lkIHR5cGU7CisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgaWYgKHR5cGUubmFtZWQpCisgICAgcmV0dXJuIGJpbl90b19yZXNfdXNlcmRhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKHR5cGUudS5pZCkKKwl7CisJZGVmYXVsdDoKKwkgIHJldHVybiBiaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOworCWNhc2UgUlRfQ1VSU09SOgorCSAgcmV0dXJuIGJpbl90b19yZXNfY3Vyc29yIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOworCWNhc2UgUlRfQklUTUFQOgorCSAgcmV0dXJuIGJpbl90b19yZXNfZ2VuZXJpYyAoUkVTX1RZUEVfQklUTUFQLCBkYXRhLCBsZW5ndGgpOworCWNhc2UgUlRfSUNPTjoKKwkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0lDT04sIGRhdGEsIGxlbmd0aCk7CisJY2FzZSBSVF9NRU5VOgorCSAgcmV0dXJuIGJpbl90b19yZXNfbWVudSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKKwljYXNlIFJUX0RJQUxPRzoKKwkgIHJldHVybiBiaW5fdG9fcmVzX2RpYWxvZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKKwljYXNlIFJUX1NUUklORzoKKwkgIHJldHVybiBiaW5fdG9fcmVzX3N0cmluZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKKwljYXNlIFJUX0ZPTlRESVI6CisJICByZXR1cm4gYmluX3RvX3Jlc19mb250ZGlyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOworCWNhc2UgUlRfRk9OVDoKKwkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0ZPTlQsIGRhdGEsIGxlbmd0aCk7CisJY2FzZSBSVF9BQ0NFTEVSQVRPUjoKKwkgIHJldHVybiBiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKKwljYXNlIFJUX1JDREFUQToKKwkgIHJldHVybiBiaW5fdG9fcmVzX3JjZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKKwljYXNlIFJUX01FU1NBR0VUQUJMRToKKwkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX01FU1NBR0VUQUJMRSwgZGF0YSwgbGVuZ3RoKTsKKwljYXNlIFJUX0dST1VQX0NVUlNPUjoKKwkgIHJldHVybiBiaW5fdG9fcmVzX2dyb3VwX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKKwljYXNlIFJUX0dST1VQX0lDT046CisJICByZXR1cm4gYmluX3RvX3Jlc19ncm91cF9pY29uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOworCWNhc2UgUlRfVkVSU0lPTjoKKwkgIHJldHVybiBiaW5fdG9fcmVzX3ZlcnNpb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7CisJfQorICAgIH0KK30KKworLyogR2l2ZSBhbiBlcnJvciBpZiB0aGUgYmluYXJ5IGRhdGEgaXMgdG9vIHNtYWxsLiAgKi8KKworc3RhdGljIHZvaWQKK3Rvb3NtYWxsIChtc2cpCisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgZmF0YWwgKF8oIiVzOiBub3QgZW5vdWdoIGJpbmFyeSBkYXRhIiksIG1zZyk7Cit9CisKKy8qIFN3YXAgaW4gYSBOVUxMIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmcuICAqLworCitzdGF0aWMgdW5pY2hhciAqCitnZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCByZXRsZW4pCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICAgICBpbnQgYmlnX2VuZGlhbjsKKyAgICAgaW50ICpyZXRsZW47Cit7CisgIGludCBjLCBpOworICB1bmljaGFyICpyZXQ7CisKKyAgYyA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChsZW5ndGggPCAodW5zaWduZWQgbG9uZykgYyAqIDIgKyAyKQorCXRvb3NtYWxsIChfKCJudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmciKSk7CisgICAgICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgYyAqIDIpID09IDApCisJYnJlYWs7CisgICAgICArK2M7CisgICAgfQorCisgIHJldCA9ICh1bmljaGFyICopIHJlc19hbGxvYyAoKGMgKyAxKSAqIHNpemVvZiAodW5pY2hhcikpOworCisgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCisgICAgcmV0W2ldID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgaSAqIDIpOworICByZXRbaV0gPSAwOworCisgIGlmIChyZXRsZW4gIT0gTlVMTCkKKyAgICAqcmV0bGVuID0gYzsKKworICByZXR1cm4gcmV0OworfQorCisvKiBHZXQgYSByZXNvdXJjZSBpZGVudGlmaWVyLiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZC4gICovCisKK3N0YXRpYyBpbnQKK2dldF9yZXNpZCAoaWQsIGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKKyAgICAgc3RydWN0IHJlc19pZCAqaWQ7CisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgaW50IGZpcnN0OworCisgIGlmIChsZW5ndGggPCAyKQorICAgIHRvb3NtYWxsIChfKCJyZXNvdXJjZSBJRCIpKTsKKworICBmaXJzdCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7CisgIGlmIChmaXJzdCA9PSAweGZmZmYpCisgICAgeworICAgICAgaWYgKGxlbmd0aCA8IDQpCisJdG9vc21hbGwgKF8oInJlc291cmNlIElEIikpOworICAgICAgaWQtPm5hbWVkID0gMDsKKyAgICAgIGlkLT51LmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZC0+bmFtZWQgPSAxOworICAgICAgaWQtPnUubi5uYW1lID0gZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgJmlkLT51Lm4ubGVuZ3RoKTsKKyAgICAgIHJldHVybiBpZC0+dS5uLmxlbmd0aCAqIDIgKyAyOworICAgIH0KK30KKworLyogQ29udmVydCBhIHJlc291cmNlIHdoaWNoIGp1c3Qgc3RvcmVzIHVuaW50ZXJwcmV0ZWQgZGF0YSBmcm9tCisgICBiaW5hcnkuICAqLworCitzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfZ2VuZXJpYyAodHlwZSwgZGF0YSwgbGVuZ3RoKQorICAgICBlbnVtIHJlc190eXBlIHR5cGU7CisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworeworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworCisgIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7CisgIHItPnR5cGUgPSB0eXBlOworICByLT51LmRhdGEuZGF0YSA9IGRhdGE7CisgIHItPnUuZGF0YS5sZW5ndGggPSBsZW5ndGg7CisKKyAgcmV0dXJuIHI7Cit9CisKKy8qIENvbnZlcnQgYSBjdXJzb3IgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLworCitzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfY3Vyc29yIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3RydWN0IGN1cnNvciAqYzsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICBpZiAobGVuZ3RoIDwgNCkKKyAgICB0b29zbWFsbCAoXygiY3Vyc29yIikpOworCisgIGMgPSAoc3RydWN0IGN1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYyk7CisgIGMtPnhob3RzcG90ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKKyAgYy0+eWhvdHNwb3QgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKKyAgYy0+bGVuZ3RoID0gbGVuZ3RoIC0gNDsKKyAgYy0+ZGF0YSA9IGRhdGEgKyA0OworCisgIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9DVVJTT1I7CisgIHItPnUuY3Vyc29yID0gYzsKKworICByZXR1cm4gcjsKK30KKworLyogQ29udmVydCBhIG1lbnUgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLworCitzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfbWVudSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisgIHN0cnVjdCBtZW51ICptOworICBpbnQgdmVyc2lvbiwgcmVhZDsKKworICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOworICByLT50eXBlID0gUkVTX1RZUEVfTUVOVTsKKworICBtID0gKHN0cnVjdCBtZW51ICopIHJlc19hbGxvYyAoc2l6ZW9mICptKTsKKyAgci0+dS5tZW51ID0gbTsKKworICBpZiAobGVuZ3RoIDwgMikKKyAgICB0b29zbWFsbCAoXygibWVudSBoZWFkZXIiKSk7CisKKyAgdmVyc2lvbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7CisKKyAgaWYgKHZlcnNpb24gPT0gMCkKKyAgICB7CisgICAgICBpZiAobGVuZ3RoIDwgNCkKKwl0b29zbWFsbCAoXygibWVudSBoZWFkZXIiKSk7CisgICAgICBtLT5oZWxwID0gMDsKKyAgICAgIG0tPml0ZW1zID0gYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEgKyA0LCBsZW5ndGggLSA0LCBiaWdfZW5kaWFuLAorCQkJCSAgICAgICAmcmVhZCk7CisgICAgfQorICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKKworICAgICAgaWYgKGxlbmd0aCA8IDgpCisJdG9vc21hbGwgKF8oIm1lbnVleCBoZWFkZXIiKSk7CisgICAgICBtLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7CisgICAgICBvZmZzZXQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKKyAgICAgIGlmIChvZmZzZXQgKyA0ID49IGxlbmd0aCkKKwl0b29zbWFsbCAoXygibWVudWV4IG9mZnNldCIpKTsKKyAgICAgIG0tPml0ZW1zID0gYmluX3RvX3Jlc19tZW51ZXhpdGVtcyAoZGF0YSArIDQgKyBvZmZzZXQsCisJCQkJCSBsZW5ndGggLSAoNCArIG9mZnNldCksCisJCQkJCSBiaWdfZW5kaWFuLAorCQkJCQkgJnJlYWQpOworICAgIH0KKyAgZWxzZQorICAgIGZhdGFsIChfKCJ1bnN1cHBvcnRlZCBtZW51IHZlcnNpb24gJWQiKSwgdmVyc2lvbik7CisKKyAgcmV0dXJuIHI7Cit9CisKKy8qIENvbnZlcnQgbWVudSBpdGVtcyBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKgorYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmVhZCkKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgICAgIGludCBiaWdfZW5kaWFuOworICAgICBpbnQgKnJlYWQ7Cit7CisgIHN0cnVjdCBtZW51aXRlbSAqZmlyc3QsICoqcHA7CisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKworICAqcmVhZCA9IDA7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApCisgICAgeworICAgICAgaW50IGZsYWdzLCBzbGVuLCBpdGVtbGVuOworICAgICAgdW5zaWduZWQgaW50IHN0cm9mZjsKKyAgICAgIHN0cnVjdCBtZW51aXRlbSAqbWk7CisKKyAgICAgIGlmIChsZW5ndGggPCA0KQorCXRvb3NtYWxsIChfKCJtZW51aXRlbSBoZWFkZXIiKSk7CisKKyAgICAgIG1pID0gKHN0cnVjdCBtZW51aXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqbWkpOworICAgICAgbWktPnN0YXRlID0gMDsKKyAgICAgIG1pLT5oZWxwID0gMDsKKworICAgICAgZmxhZ3MgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOworICAgICAgbWktPnR5cGUgPSBmbGFncyAmfiAoTUVOVUlURU1fUE9QVVAgfCBNRU5VSVRFTV9FTkRNRU5VKTsKKworICAgICAgaWYgKChmbGFncyAmIE1FTlVJVEVNX1BPUFVQKSA9PSAwKQorCXN0cm9mZiA9IDQ7CisgICAgICBlbHNlCisJc3Ryb2ZmID0gMjsKKworICAgICAgaWYgKGxlbmd0aCA8IHN0cm9mZiArIDIpCisJdG9vc21hbGwgKF8oIm1lbnVpdGVtIGhlYWRlciIpKTsKKworICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIHN0cm9mZikgPT0gMCkKKwl7CisJICBzbGVuID0gMDsKKwkgIG1pLT50ZXh0ID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJbWktPnRleHQgPSBnZXRfdW5pY29kZSAoZGF0YSArIHN0cm9mZiwgbGVuZ3RoIC0gc3Ryb2ZmLCBiaWdfZW5kaWFuLAorCQkJCSZzbGVuKTsKKworICAgICAgaXRlbWxlbiA9IHN0cm9mZiArIHNsZW4gKiAyICsgMjsKKworICAgICAgaWYgKChmbGFncyAmIE1FTlVJVEVNX1BPUFVQKSA9PSAwKQorCXsKKwkgIG1pLT5wb3B1cCA9IE5VTEw7CisJICBtaS0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IHN1YnJlYWQ7CisKKwkgIG1pLT5pZCA9IDA7CisJICBtaS0+cG9wdXAgPSBiaW5fdG9fcmVzX21lbnVpdGVtcyAoZGF0YSArIGl0ZW1sZW4sIGxlbmd0aCAtIGl0ZW1sZW4sCisJCQkJCSAgICBiaWdfZW5kaWFuLCAmc3VicmVhZCk7CisJICBpdGVtbGVuICs9IHN1YnJlYWQ7CisJfQorCisgICAgICBtaS0+bmV4dCA9IE5VTEw7CisgICAgICAqcHAgPSBtaTsKKyAgICAgIHBwID0gJm1pLT5uZXh0OworCisgICAgICBkYXRhICs9IGl0ZW1sZW47CisgICAgICBsZW5ndGggLT0gaXRlbWxlbjsKKyAgICAgICpyZWFkICs9IGl0ZW1sZW47CisKKyAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9FTkRNRU5VKSAhPSAwKQorCXJldHVybiBmaXJzdDsKKyAgICB9CisKKyAgcmV0dXJuIGZpcnN0OworfQorCisvKiBDb252ZXJ0IG1lbnVleCBpdGVtcyBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKgorYmluX3RvX3Jlc19tZW51ZXhpdGVtcyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCByZWFkKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47CisgICAgIGludCAqcmVhZDsKK3sKKyAgc3RydWN0IG1lbnVpdGVtICpmaXJzdCwgKipwcDsKKworICBmaXJzdCA9IE5VTEw7CisgIHBwID0gJmZpcnN0OworCisgICpyZWFkID0gMDsKKworICB3aGlsZSAobGVuZ3RoID4gMCkKKyAgICB7CisgICAgICBpbnQgZmxhZ3MsIHNsZW47CisgICAgICB1bnNpZ25lZCBpbnQgaXRlbWxlbjsKKyAgICAgIHN0cnVjdCBtZW51aXRlbSAqbWk7CisKKyAgICAgIGlmIChsZW5ndGggPCAxNCkKKwl0b29zbWFsbCAoXygibWVudWl0ZW0gaGVhZGVyIikpOworCisgICAgICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKKyAgICAgIG1pLT50eXBlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhKTsKKyAgICAgIG1pLT5zdGF0ZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOworICAgICAgbWktPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgOCk7CisKKyAgICAgIGZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTApOworCisgICAgICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTIpID09IDApCisJeworCSAgc2xlbiA9IDA7CisJICBtaS0+dGV4dCA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCW1pLT50ZXh0ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyAxMiwgbGVuZ3RoIC0gMTIsIGJpZ19lbmRpYW4sICZzbGVuKTsKKworICAgICAgaXRlbWxlbiA9IDEyICsgc2xlbiAqIDIgKyAyOworICAgICAgaXRlbWxlbiA9IChpdGVtbGVuICsgMykgJn4gMzsKKworICAgICAgaWYgKChmbGFncyAmIDEpID09IDApCisJeworCSAgbWktPnBvcHVwID0gTlVMTDsKKwkgIG1pLT5oZWxwID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IHN1YnJlYWQ7CisKKwkgIGlmIChsZW5ndGggPCBpdGVtbGVuICsgNCkKKwkgICAgdG9vc21hbGwgKF8oIm1lbnVpdGVtIikpOworCSAgbWktPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBpdGVtbGVuKTsKKwkgIGl0ZW1sZW4gKz0gNDsKKworCSAgbWktPnBvcHVwID0gYmluX3RvX3Jlc19tZW51ZXhpdGVtcyAoZGF0YSArIGl0ZW1sZW4sCisJCQkJCSAgICAgIGxlbmd0aCAtIGl0ZW1sZW4sCisJCQkJCSAgICAgIGJpZ19lbmRpYW4sICZzdWJyZWFkKTsKKwkgIGl0ZW1sZW4gKz0gc3VicmVhZDsKKwl9CisKKyAgICAgIG1pLT5uZXh0ID0gTlVMTDsKKyAgICAgICpwcCA9IG1pOworICAgICAgcHAgPSAmbWktPm5leHQ7CisKKyAgICAgIGRhdGEgKz0gaXRlbWxlbjsKKyAgICAgIGxlbmd0aCAtPSBpdGVtbGVuOworICAgICAgKnJlYWQgKz0gaXRlbWxlbjsKKworICAgICAgaWYgKChmbGFncyAmIDB4ODApICE9IDApCisJcmV0dXJuIGZpcnN0OworICAgIH0KKworICByZXR1cm4gZmlyc3Q7Cit9CisKKy8qIENvbnZlcnQgYSBkaWFsb2cgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCitiaW5fdG9fcmVzX2RpYWxvZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIGludCB2ZXJzaW9uOworICBzdHJ1Y3QgZGlhbG9nICpkOworICBpbnQgYywgc3VibGVuLCBpOworICB1bnNpZ25lZCBpbnQgb2ZmOworICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKipwcDsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICBpZiAobGVuZ3RoIDwgMTgpCisgICAgdG9vc21hbGwgKF8oImRpYWxvZyBoZWFkZXIiKSk7CisKKyAgZCA9IChzdHJ1Y3QgZGlhbG9nICopIHJlc19hbGxvYyAoc2l6ZW9mICpkKTsKKworICB2ZXJzaW9uID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKKyAgaWYgKHZlcnNpb24gIT0gMSkKKyAgICB7CisgICAgICBkLT5leCA9IE5VTEw7CisgICAgICBkLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7CisgICAgICBkLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNCk7CisgICAgICBvZmYgPSA4OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBzaWduYXR1cmU7CisKKyAgICAgIHNpZ25hdHVyZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOworICAgICAgaWYgKHNpZ25hdHVyZSAhPSAweGZmZmYpCisJZmF0YWwgKF8oInVuZXhwZWN0ZWQgZGlhbG9nIHNpZ25hdHVyZSAlZCIpLCBzaWduYXR1cmUpOworCisgICAgICBkLT5leCA9IChzdHJ1Y3QgZGlhbG9nX2V4ICopIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSk7CisgICAgICBkLT5leC0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOworICAgICAgZC0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOworICAgICAgZC0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7CisgICAgICBvZmYgPSAxNjsKKyAgICB9CisKKyAgaWYgKGxlbmd0aCA8IG9mZiArIDEwKQorICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgaGVhZGVyIikpOworCisgIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOworICBkLT54ID0gZ2V0XzE2ICAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOworICBkLT55ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7CisgIGQtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNik7CisgIGQtPmhlaWdodCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDgpOworCisgIG9mZiArPSAxMDsKKworICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkLT5tZW51LCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOworICBvZmYgKz0gc3VibGVuOworCisgIHN1YmxlbiA9IGdldF9yZXNpZCAoJmQtPmNsYXNzLCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOworICBvZmYgKz0gc3VibGVuOworCisgIGQtPmNhcHRpb24gPSBnZXRfdW5pY29kZSAoZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuLCAmc3VibGVuKTsKKyAgb2ZmICs9IHN1YmxlbiAqIDIgKyAyOworCisgIGlmICgoZC0+c3R5bGUgJiBEU19TRVRGT05UKSA9PSAwKQorICAgIHsKKyAgICAgIGQtPnBvaW50c2l6ZSA9IDA7CisgICAgICBkLT5mb250ID0gTlVMTDsKKyAgICAgIGlmIChkLT5leCAhPSBOVUxMKQorCXsKKwkgIGQtPmV4LT53ZWlnaHQgPSAwOworCSAgZC0+ZXgtPml0YWxpYyA9IDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAyKQorCXRvb3NtYWxsIChfKCJkaWFsb2cgZm9udCBwb2ludCBzaXplIikpOworCisgICAgICBkLT5wb2ludHNpemUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOworICAgICAgb2ZmICs9IDI7CisKKyAgICAgIGlmIChkLT5leCAhPSBOVUxMKQorCXsKKwkgIGlmIChsZW5ndGggPCBvZmYgKyA0KQorCSAgICB0b29zbWFsbCAoXygiZGlhbG9nZXggZm9udCBpbmZvcm1hdGlvbiIpKTsKKwkgIGQtPmV4LT53ZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOworCSAgZC0+ZXgtPml0YWxpYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOworCSAgb2ZmICs9IDQ7CisJfQorCisgICAgICBkLT5mb250ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbiwgJnN1Ymxlbik7CisgICAgICBvZmYgKz0gc3VibGVuICogMiArIDI7CisgICAgfQorCisgIGQtPmNvbnRyb2xzID0gTlVMTDsKKyAgcHAgPSAmZC0+Y29udHJvbHM7CisKKyAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRjOworICAgICAgaW50IGRhdGFsZW47CisKKyAgICAgIG9mZiA9IChvZmYgKyAzKSAmfiAzOworCisgICAgICBkYyA9IChzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKikgcmVzX2FsbG9jIChzaXplb2YgKmRjKTsKKworICAgICAgaWYgKGQtPmV4ID09IE5VTEwpCisJeworCSAgaWYgKGxlbmd0aCA8IG9mZiArIDgpCisJICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCIpKTsKKworCSAgZGMtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKKwkgIGRjLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7CisJICBkYy0+aGVscCA9IDA7CisJICBvZmYgKz0gODsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGxlbmd0aCA8IG9mZiArIDEyKQorCSAgICB0b29zbWFsbCAoXygiZGlhbG9nZXggY29udHJvbCIpKTsKKwkgIGRjLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKKwkgIGRjLT5leHN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7CisJICBkYy0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKKwkgIG9mZiArPSAxMjsKKwl9CisKKyAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAxMCkKKwl0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wiKSk7CisKKyAgICAgIGRjLT54ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKKyAgICAgIGRjLT55ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgMik7CisgICAgICBkYy0+d2lkdGggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA0KTsKKyAgICAgIGRjLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA2KTsKKworICAgICAgaWYgKGQtPmV4ICE9IE5VTEwpCisgICAgICAgIGRjLT5pZCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDgpOworICAgICAgZWxzZQorICAgICAgICBkYy0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKKworICAgICAgb2ZmICs9IDEwICsgKGQtPmV4ICE9IE5VTEwgPyAyIDogMCk7CisKKyAgICAgIHN1YmxlbiA9IGdldF9yZXNpZCAoJmRjLT5jbGFzcywgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKKyAgICAgIG9mZiArPSBzdWJsZW47CisKKyAgICAgIHN1YmxlbiA9IGdldF9yZXNpZCAoJmRjLT50ZXh0LCBkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4pOworICAgICAgb2ZmICs9IHN1YmxlbjsKKworICAgICAgaWYgKGxlbmd0aCA8IG9mZiArIDIpCisJdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIGVuZCIpKTsKKworICAgICAgZGF0YWxlbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7CisgICAgICBvZmYgKz0gMjsKKworICAgICAgaWYgKGRhdGFsZW4gPT0gMCkKKwlkYy0+ZGF0YSA9IE5VTEw7CisgICAgICBlbHNlCisJeworCSAgb2ZmID0gKG9mZiArIDMpICZ+IDM7CisKKwkgIGlmIChsZW5ndGggPCBvZmYgKyBkYXRhbGVuKQorCSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wgZGF0YSIpKTsKKworCSAgZGMtPmRhdGEgPSAoKHN0cnVjdCByY2RhdGFfaXRlbSAqKQorCQkgICAgICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHJjZGF0YV9pdGVtKSkpOworCSAgZGMtPmRhdGEtPm5leHQgPSBOVUxMOworCSAgZGMtPmRhdGEtPnR5cGUgPSBSQ0RBVEFfQlVGRkVSOworCSAgZGMtPmRhdGEtPnUuYnVmZmVyLmxlbmd0aCA9IGRhdGFsZW47CisJICBkYy0+ZGF0YS0+dS5idWZmZXIuZGF0YSA9IGRhdGEgKyBvZmY7CisKKwkgIG9mZiArPSBkYXRhbGVuOwkgIAorCX0KKworICAgICAgZGMtPm5leHQgPSBOVUxMOworICAgICAgKnBwID0gZGM7CisgICAgICBwcCA9ICZkYy0+bmV4dDsKKyAgICB9CisKKyAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX0RJQUxPRzsKKyAgci0+dS5kaWFsb2cgPSBkOworCisgIHJldHVybiByOworfQorCisvKiBDb252ZXJ0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCitiaW5fdG9fcmVzX3N0cmluZyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIHN0cnVjdCBzdHJpbmd0YWJsZSAqc3Q7CisgIGludCBpOworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworCisgIHN0ID0gKHN0cnVjdCBzdHJpbmd0YWJsZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqc3QpOworCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBzbGVuOworCisgICAgICBpZiAobGVuZ3RoIDwgMikKKwl0b29zbWFsbCAoXygic3RyaW5ndGFibGUgc3RyaW5nIGxlbmd0aCIpKTsKKyAgICAgIHNsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOworICAgICAgc3QtPnN0cmluZ3NbaV0ubGVuZ3RoID0gc2xlbjsKKworICAgICAgaWYgKHNsZW4gPiAwKQorCXsKKwkgIHVuaWNoYXIgKnM7CisJICB1bnNpZ25lZCBpbnQgajsKKworCSAgaWYgKGxlbmd0aCA8IDIgKyAyICogc2xlbikKKwkgICAgdG9vc21hbGwgKF8oInN0cmluZ3RhYmxlIHN0cmluZyIpKTsKKworCSAgcyA9ICh1bmljaGFyICopIHJlc19hbGxvYyAoc2xlbiAqIHNpemVvZiAodW5pY2hhcikpOworCSAgc3QtPnN0cmluZ3NbaV0uc3RyaW5nID0gczsKKworCSAgZm9yIChqID0gMDsgaiA8IHNsZW47IGorKykKKwkgICAgc1tqXSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIgKyBqICogMik7CisJfQorCisgICAgICBkYXRhICs9IDIgKyAyICogc2xlbjsKKyAgICAgIGxlbmd0aCAtPSAyICsgMiAqIHNsZW47CisgICAgfQorCisgIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9TVFJJTkdUQUJMRTsKKyAgci0+dS5zdHJpbmd0YWJsZSA9IHN0OworCisgIHJldHVybiByOworfQorCisvKiBDb252ZXJ0IGEgZm9udGRpciByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfZm9udGRpciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIGludCBjLCBpOworICBzdHJ1Y3QgZm9udGRpciAqZmlyc3QsICoqcHA7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgaWYgKGxlbmd0aCA8IDIpCisgICAgdG9vc21hbGwgKF8oImZvbnRkaXIgaGVhZGVyIikpOworCisgIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOworCisgIGZpcnN0ID0gTlVMTDsKKyAgcHAgPSAmZmlyc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgZm9udGRpciAqZmQ7CisgICAgICB1bnNpZ25lZCBpbnQgb2ZmOworCisgICAgICBpZiAobGVuZ3RoIDwgNTYpCisJdG9vc21hbGwgKF8oImZvbnRkaXIiKSk7CisKKyAgICAgIGZkID0gKHN0cnVjdCBmb250ZGlyICopIHJlc19hbGxvYyAoc2l6ZW9mICpmZCk7CisgICAgICBmZC0+aW5kZXggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOworCisgICAgICAvKiBUbyB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBmb250ZGlyIGRhdGEsIHdlIG11c3QgZ2V0IHRoZQorICAgICAgICAgbGVuZ3RoIG9mIHRoZSBkZXZpY2UgbmFtZSBhbmQgZmFjZSBuYW1lIHN0cmluZ3MsIGV2ZW4gdGhvdWdoCisgICAgICAgICB3ZSBkb24ndCBzdG9yZSB0aGVtIGluIHRoZSBmb250ZGlyIHN0cnVjdHVyZS4gIFRoZQorICAgICAgICAgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgdGhlc2UgYXJlIE5VTEwgdGVybWluYXRlZCBjaGFyCisgICAgICAgICBzdHJpbmdzLCBub3QgVW5pY29kZSBzdHJpbmdzLiAgKi8KKworICAgICAgb2ZmID0gNTY7CisKKyAgICAgIHdoaWxlIChvZmYgPCBsZW5ndGggJiYgZGF0YVtvZmZdICE9ICdcMCcpCisJKytvZmY7CisgICAgICBpZiAob2ZmID49IGxlbmd0aCkKKwl0b29zbWFsbCAoXygiZm9udGRpciBkZXZpY2UgbmFtZSIpKTsKKyAgICAgICsrb2ZmOworCisgICAgICB3aGlsZSAob2ZmIDwgbGVuZ3RoICYmIGRhdGFbb2ZmXSAhPSAnXDAnKQorCSsrb2ZmOworICAgICAgaWYgKG9mZiA+PSBsZW5ndGgpCisJdG9vc21hbGwgKF8oImZvbnRkaXIgZmFjZSBuYW1lIikpOworICAgICAgKytvZmY7CisKKyAgICAgIGZkLT5sZW5ndGggPSBvZmY7CisgICAgICBmZC0+ZGF0YSA9IGRhdGE7CisKKyAgICAgIGZkLT5uZXh0ID0gTlVMTDsKKyAgICAgICpwcCA9IGZkOworICAgICAgcHAgPSAmZmQtPm5leHQ7CisKKyAgICAgIC8qIFRoZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGluZGljYXRlIHRoYXQgYW55IHJvdW5kaW5nIGlzCisgICAgICAgICByZXF1aXJlZC4gICovCisKKyAgICAgIGRhdGEgKz0gb2ZmOworICAgICAgbGVuZ3RoIC09IG9mZjsKKyAgICB9CisKKyAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX0ZPTlRESVI7CisgIHItPnUuZm9udGRpciA9IGZpcnN0OworCisgIHJldHVybiByOworfQorCisvKiBDb252ZXJ0IGFuIGFjY2VsZXJhdG9ycyByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfYWNjZWxlcmF0b3JzIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3RydWN0IGFjY2VsZXJhdG9yICpmaXJzdCwgKipwcDsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICBmaXJzdCA9IE5VTEw7CisgIHBwID0gJmZpcnN0OworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKKworICAgICAgaWYgKGxlbmd0aCA8IDgpCisJdG9vc21hbGwgKF8oImFjY2VsZXJhdG9yIikpOworCisgICAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7CisKKyAgICAgIGEtPmZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKKyAgICAgIGEtPmtleSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOworICAgICAgYS0+aWQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKKworICAgICAgYS0+bmV4dCA9IE5VTEw7CisgICAgICAqcHAgPSBhOworICAgICAgcHAgPSAmYS0+bmV4dDsKKworICAgICAgaWYgKChhLT5mbGFncyAmIEFDQ19MQVNUKSAhPSAwKQorCWJyZWFrOworCisgICAgICBkYXRhICs9IDg7CisgICAgICBsZW5ndGggLT0gODsKKyAgICB9CisKKyAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX0FDQ0VMRVJBVE9SOworICByLT51LmFjYyA9IGZpcnN0OworCisgIHJldHVybiByOworfQorCisvKiBDb252ZXJ0IGFuIHJjZGF0YSByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfcmNkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKKworICByaS0+bmV4dCA9IE5VTEw7CisgIHJpLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKKyAgcmktPnUuYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKKyAgcmktPnUuYnVmZmVyLmRhdGEgPSBkYXRhOworCisgIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9SQ0RBVEE7CisgIHItPnUucmNkYXRhID0gcmk7CisKKyAgcmV0dXJuIHI7Cit9CisKKy8qIENvbnZlcnQgYSBncm91cCBjdXJzb3IgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCitiaW5fdG9fcmVzX2dyb3VwX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIGludCB0eXBlLCBjLCBpOworICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpmaXJzdCwgKipwcDsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICBpZiAobGVuZ3RoIDwgNikKKyAgICB0b29zbWFsbCAoXygiZ3JvdXAgY3Vyc29yIGhlYWRlciIpKTsKKworICB0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7CisgIGlmICh0eXBlICE9IDIpCisgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgZ3JvdXAgY3Vyc29yIHR5cGUgJWQiKSwgdHlwZSk7CisKKyAgYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOworCisgIGRhdGEgKz0gNjsKKyAgbGVuZ3RoIC09IDY7CisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKworICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOworCisgICAgICBpZiAobGVuZ3RoIDwgMTQpCisJdG9vc21hbGwgKF8oImdyb3VwIGN1cnNvciIpKTsKKworICAgICAgZ2MgPSAoc3RydWN0IGdyb3VwX2N1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZ2MpOworCisgICAgICBnYy0+d2lkdGggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOworICAgICAgZ2MtPmhlaWdodCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOworICAgICAgZ2MtPnBsYW5lcyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOworICAgICAgZ2MtPmJpdHMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA2KTsKKyAgICAgIGdjLT5ieXRlcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOworICAgICAgZ2MtPmluZGV4ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOworCisgICAgICBnYy0+bmV4dCA9IE5VTEw7CisgICAgICAqcHAgPSBnYzsKKyAgICAgIHBwID0gJmdjLT5uZXh0OworCisgICAgICBkYXRhICs9IDE0OworICAgICAgbGVuZ3RoIC09IDE0OworICAgIH0KKworICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOworICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfQ1VSU09SOworICByLT51Lmdyb3VwX2N1cnNvciA9IGZpcnN0OworCisgIHJldHVybiByOworfQorCisvKiBDb252ZXJ0IGEgZ3JvdXAgaWNvbiByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfZ3JvdXBfaWNvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIGludCB0eXBlLCBjLCBpOworICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZmlyc3QsICoqcHA7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgaWYgKGxlbmd0aCA8IDYpCisgICAgdG9vc21hbGwgKF8oImdyb3VwIGljb24gaGVhZGVyIikpOworCisgIHR5cGUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKKyAgaWYgKHR5cGUgIT0gMSkKKyAgICBmYXRhbCAoXygidW5leHBlY3RlZCBncm91cCBpY29uIHR5cGUgJWQiKSwgdHlwZSk7CisKKyAgYyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOworCisgIGRhdGEgKz0gNjsKKyAgbGVuZ3RoIC09IDY7CisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKworICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBncm91cF9pY29uICpnaTsKKworICAgICAgaWYgKGxlbmd0aCA8IDE0KQorCXRvb3NtYWxsIChfKCJncm91cCBpY29uIikpOworCisgICAgICBnaSA9IChzdHJ1Y3QgZ3JvdXBfaWNvbiAqKSByZXNfYWxsb2MgKHNpemVvZiAqZ2kpOworCisgICAgICBnaS0+d2lkdGggPSBkYXRhWzBdOworICAgICAgZ2ktPmhlaWdodCA9IGRhdGFbMV07CisgICAgICBnaS0+Y29sb3JzID0gZGF0YVsyXTsKKyAgICAgIGdpLT5wbGFuZXMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKKyAgICAgIGdpLT5iaXRzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7CisgICAgICBnaS0+Ynl0ZXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKKyAgICAgIGdpLT5pbmRleCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKKworICAgICAgZ2ktPm5leHQgPSBOVUxMOworICAgICAgKnBwID0gZ2k7CisgICAgICBwcCA9ICZnaS0+bmV4dDsKKworICAgICAgZGF0YSArPSAxNDsKKyAgICAgIGxlbmd0aCAtPSAxNDsKKyAgICB9CisKKyAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0lDT047CisgIHItPnUuZ3JvdXBfaWNvbiA9IGZpcnN0OworCisgIHJldHVybiByOworfQorCisvKiBFeHRyYWN0IGRhdGEgZnJvbSBhIHZlcnNpb24gaGVhZGVyLiAgSWYgS0VZIGlzIG5vdCBOVUxMLCB0aGVuIHRoZQorICAga2V5IG11c3QgYmUgS0VZOyBvdGhlcndpc2UsIHRoZSBrZXkgaXMgcmV0dXJuZWQgaW4gKlBLRVkuICBUaGlzCisgICBzZXRzICpMRU4gdG8gdGhlIHRvdGFsIGxlbmd0aCwgKlZBTExFTiB0byB0aGUgdmFsdWUgbGVuZ3RoLCAqVFlQRQorICAgdG8gdGhlIHR5cGUsIGFuZCAqT0ZGIHRvIHRoZSBvZmZzZXQgdG8gdGhlIGNoaWxkcmVuLiAgKi8KKworc3RhdGljIHZvaWQKK2dldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCBrZXksIHBrZXksIGxlbiwgdmFsbGVuLCB0eXBlLAorCQkgICAgb2ZmKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47CisgICAgIGNvbnN0IGNoYXIgKmtleTsKKyAgICAgdW5pY2hhciAqKnBrZXk7CisgICAgIGludCAqbGVuOworICAgICBpbnQgKnZhbGxlbjsKKyAgICAgaW50ICp0eXBlOworICAgICBpbnQgKm9mZjsKK3sKKyAgaWYgKGxlbmd0aCA8IDgpCisgICAgdG9vc21hbGwgKGtleSk7CisKKyAgKmxlbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7CisgICp2YWxsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKKyAgKnR5cGUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKKworICAqb2ZmID0gNjsKKworICBsZW5ndGggLT0gNjsKKyAgZGF0YSArPSA2OworCisgIGlmIChrZXkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgc3VibGVuOworCisgICAgICAqcGtleSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZzdWJsZW4pOworICAgICAgKm9mZiArPSBzdWJsZW4gKiAyICsgMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAobGVuZ3RoIDwgMikKKwkgICAgdG9vc21hbGwgKGtleSk7CisJICBpZiAoZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKSAhPSAodW5zaWduZWQgY2hhcikgKmtleSkKKwkgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciKSk7CisKKwkgICpvZmYgKz0gMjsKKwkgIGxlbmd0aCAtPSAyOworCSAgZGF0YSArPSAyOworCisJICBpZiAoKmtleSA9PSAnXDAnKQorCSAgICBicmVhazsKKworCSAgKytrZXk7CisJfQorICAgIH0KKworICAqb2ZmID0gKCpvZmYgKyAzKSAmfiAzOworfQorCisvKiBDb252ZXJ0IGEgdmVyc2lvbiByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfdmVyc2lvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIGludCB2ZXJsZW4sIHZhbGxlbiwgdHlwZSwgb2ZmOworICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpOworICBzdHJ1Y3QgdmVyX2luZm8gKmZpcnN0LCAqKnBwOworICBzdHJ1Y3QgdmVyc2lvbmluZm8gKnY7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJWU19WRVJTSU9OX0lORk8iLAorCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwgJm9mZik7CisKKyAgaWYgKCh1bnNpZ25lZCBpbnQpIHZlcmxlbiAhPSBsZW5ndGgpCisgICAgZmF0YWwgKF8oInZlcnNpb24gbGVuZ3RoICVkIGRvZXMgbm90IG1hdGNoIHJlc291cmNlIGxlbmd0aCAlbHUiKSwKKwkgICB2ZXJsZW4sIGxlbmd0aCk7CisKKyAgaWYgKHR5cGUgIT0gMCkKKyAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHR5cGUgJWQiKSwgdHlwZSk7CisKKyAgZGF0YSArPSBvZmY7CisgIGxlbmd0aCAtPSBvZmY7CisKKyAgaWYgKHZhbGxlbiA9PSAwKQorICAgIGZpID0gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbmF0dXJlLCBmaXY7CisKKyAgICAgIGlmICh2YWxsZW4gIT0gNTIpCisJZmF0YWwgKF8oInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBsZW5ndGggJWQiKSwgdmFsbGVuKTsKKworICAgICAgaWYgKGxlbmd0aCA8IDUyKQorCXRvb3NtYWxsIChfKCJmaXhlZCB2ZXJzaW9uIGluZm8iKSk7CisKKyAgICAgIHNpZ25hdHVyZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7CisgICAgICBpZiAoc2lnbmF0dXJlICE9IDB4ZmVlZjA0YmQpCisJZmF0YWwgKF8oInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBzaWduYXR1cmUgJWx1IiksIHNpZ25hdHVyZSk7CisKKyAgICAgIGZpdiA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOworICAgICAgaWYgKGZpdiAhPSAwICYmIGZpdiAhPSAweDEwMDAwKQorCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mbyB2ZXJzaW9uICVsdSIpLCBmaXYpOworCisgICAgICBmaSA9IChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKmZpKTsKKworICAgICAgZmktPmZpbGVfdmVyc2lvbl9tcyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOworICAgICAgZmktPmZpbGVfdmVyc2lvbl9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKKyAgICAgIGZpLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxNik7CisgICAgICBmaS0+cHJvZHVjdF92ZXJzaW9uX2xzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMjApOworICAgICAgZmktPmZpbGVfZmxhZ3NfbWFzayA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDI0KTsKKyAgICAgIGZpLT5maWxlX2ZsYWdzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMjgpOworICAgICAgZmktPmZpbGVfb3MgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAzMik7CisgICAgICBmaS0+ZmlsZV90eXBlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMzYpOworICAgICAgZmktPmZpbGVfc3VidHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQwKTsKKyAgICAgIGZpLT5maWxlX2RhdGVfbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0NCk7CisgICAgICBmaS0+ZmlsZV9kYXRlX2xzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNDgpOworCisgICAgICBkYXRhICs9IDUyOworICAgICAgbGVuZ3RoIC09IDUyOworICAgIH0KKworICBmaXJzdCA9IE5VTEw7CisgIHBwID0gJmZpcnN0OworCisgIHdoaWxlIChsZW5ndGggPiAwKQorICAgIHsKKyAgICAgIHN0cnVjdCB2ZXJfaW5mbyAqdmk7CisgICAgICBpbnQgY2g7CisKKyAgICAgIGlmIChsZW5ndGggPCA4KQorCXRvb3NtYWxsIChfKCJ2ZXJzaW9uIHZhciBpbmZvIikpOworCisgICAgICB2aSA9IChzdHJ1Y3QgdmVyX2luZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnZpKTsKKworICAgICAgY2ggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA2KTsKKworICAgICAgaWYgKGNoID09ICdTJykKKwl7CisJICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKipwcHZzOworCisJICB2aS0+dHlwZSA9IFZFUklORk9fU1RSSU5HOworCisJICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgIlN0cmluZ0ZpbGVJbmZvIiwKKwkJCSAgICAgICh1bmljaGFyICopIE5VTEwsICZ2ZXJsZW4sICZ2YWxsZW4sICZ0eXBlLAorCQkJICAgICAgJm9mZik7CisKKwkgIGlmICh2YWxsZW4gIT0gMCkKKwkgICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgc3RyaW5nZmlsZWluZm8gdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7CisKKwkgIGRhdGEgKz0gb2ZmOworCSAgbGVuZ3RoIC09IG9mZjsKKworCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkgICAgICAmdmktPnUuc3RyaW5nLmxhbmd1YWdlLCAmdmVybGVuLCAmdmFsbGVuLAorCQkJICAgICAgJnR5cGUsICZvZmYpOworCisJICBpZiAodmFsbGVuICE9IDApCisJICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5ndGFibGUgdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7CisKKwkgIGRhdGEgKz0gb2ZmOworCSAgbGVuZ3RoIC09IG9mZjsKKwkgIHZlcmxlbiAtPSBvZmY7CisKKwkgIHZpLT51LnN0cmluZy5zdHJpbmdzID0gTlVMTDsKKwkgIHBwdnMgPSAmdmktPnUuc3RyaW5nLnN0cmluZ3M7CisKKwkgIC8qIEl0J3MgY29udmVuaWVudCB0byByb3VuZCB2ZXJsZW4gdG8gYSA0IGJ5dGUgYWxpZ25tZW50LAorICAgICAgICAgICAgIHNpbmNlIHdlIHJvdW5kIHRoZSBzdWJ2YXJpYWJsZXMgaW4gdGhlIGxvb3AuICAqLworCSAgdmVybGVuID0gKHZlcmxlbiArIDMpICZ+IDM7CisKKwkgIHdoaWxlICh2ZXJsZW4gPiAwKQorCSAgICB7CisJICAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2czsKKwkgICAgICBpbnQgc3VidmVybGVuLCB2c2xlbiwgdmFsb2ZmOworCisJICAgICAgdnMgPSAoc3RydWN0IHZlcl9zdHJpbmdpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2cyk7CisKKwkgICAgICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwKKwkJCQkgIChjb25zdCBjaGFyICopIE5VTEwsICZ2cy0+a2V5LCAmc3VidmVybGVuLAorCQkJCSAgJnZhbGxlbiwgJnR5cGUsICZvZmYpOworCisJICAgICAgc3VidmVybGVuID0gKHN1YnZlcmxlbiArIDMpICZ+IDM7CisKKwkgICAgICBkYXRhICs9IG9mZjsKKwkgICAgICBsZW5ndGggLT0gb2ZmOworCisJICAgICAgdnMtPnZhbHVlID0gZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgJnZzbGVuKTsKKwkgICAgICB2YWxvZmYgPSB2c2xlbiAqIDIgKyAyOworCSAgICAgIHZhbG9mZiA9ICh2YWxvZmYgKyAzKSAmfiAzOworCisJICAgICAgaWYgKG9mZiArIHZhbG9mZiAhPSBzdWJ2ZXJsZW4pCisJCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCAhPSAlZCArICVkIiksCisJCSAgICAgICBzdWJ2ZXJsZW4sIG9mZiwgdmFsb2ZmKTsKKworCSAgICAgIHZzLT5uZXh0ID0gTlVMTDsKKwkgICAgICAqcHB2cyA9IHZzOworCSAgICAgIHBwdnMgPSAmdnMtPm5leHQ7CisKKwkgICAgICBkYXRhICs9IHZhbG9mZjsKKwkgICAgICBsZW5ndGggLT0gdmFsb2ZmOworCisJICAgICAgaWYgKHZlcmxlbiA8IHN1YnZlcmxlbikKKwkJZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkIDwgJWQiKSwKKwkJICAgICAgIHZlcmxlbiwgc3VidmVybGVuKTsKKworCSAgICAgIHZlcmxlbiAtPSBzdWJ2ZXJsZW47CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChjaCA9PSAnVicpCisJeworCSAgc3RydWN0IHZlcl92YXJpbmZvICoqcHB2djsKKworCSAgdmktPnR5cGUgPSBWRVJJTkZPX1ZBUjsKKworCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJWYXJGaWxlSW5mbyIsCisJCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwKKwkJCSAgICAgICZvZmYpOworCisJICBpZiAodmFsbGVuICE9IDApCisJICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZhcmZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOworCisJICBkYXRhICs9IG9mZjsKKwkgIGxlbmd0aCAtPSBvZmY7CisKKwkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJICAgICAgJnZpLT51LnZhci5rZXksICZ2ZXJsZW4sICZ2YWxsZW4sICZ0eXBlLCAmb2ZmKTsKKworCSAgZGF0YSArPSBvZmY7CisJICBsZW5ndGggLT0gb2ZmOworCisJICB2aS0+dS52YXIudmFyID0gTlVMTDsKKwkgIHBwdnYgPSAmdmktPnUudmFyLnZhcjsKKworCSAgd2hpbGUgKHZhbGxlbiA+IDApCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OworCisJICAgICAgaWYgKGxlbmd0aCA8IDQpCisJCXRvb3NtYWxsIChfKCJ2ZXJzaW9uIHZhcmZpbGVpbmZvIikpOworCisJICAgICAgdnYgPSAoc3RydWN0IHZlcl92YXJpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2dik7CisKKwkgICAgICB2di0+bGFuZ3VhZ2UgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOworCSAgICAgIHZ2LT5jaGFyc2V0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7CisKKwkgICAgICB2di0+bmV4dCA9IE5VTEw7CisJICAgICAgKnBwdnYgPSB2djsKKwkgICAgICBwcHZ2ID0gJnZ2LT5uZXh0OworCisJICAgICAgZGF0YSArPSA0OworCSAgICAgIGxlbmd0aCAtPSA0OworCisJICAgICAgaWYgKHZhbGxlbiA8IDQpCisJCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gdmFsdWUgbGVuZ3RoICVkIiksIHZhbGxlbik7CisKKwkgICAgICB2YWxsZW4gLT0gNDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyIpKTsKKworICAgICAgdmktPm5leHQgPSBOVUxMOworICAgICAgKnBwID0gdmk7CisgICAgICBwcCA9ICZ2aS0+bmV4dDsgICAgICAKKyAgICB9CisKKyAgdiA9IChzdHJ1Y3QgdmVyc2lvbmluZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnYpOworICB2LT5maXhlZCA9IGZpOworICB2LT52YXIgPSBmaXJzdDsKKworICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOworICByLT50eXBlID0gUkVTX1RZUEVfVkVSU0lPTklORk87CisgIHItPnUudmVyc2lvbmluZm8gPSB2OworCisgIHJldHVybiByOyAgCit9CisKKy8qIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHVzZXIgZGVmaW5lZCByZXNvdXJjZSBmcm9tIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK2Jpbl90b19yZXNfdXNlcmRhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworCisgIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOworCisgIHJpLT5uZXh0ID0gTlVMTDsKKyAgcmktPnR5cGUgPSBSQ0RBVEFfQlVGRkVSOworICByaS0+dS5idWZmZXIubGVuZ3RoID0gbGVuZ3RoOworICByaS0+dS5idWZmZXIuZGF0YSA9IGRhdGE7CisKKyAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX1VTRVJEQVRBOworICByLT51LnJjZGF0YSA9IHJpOworCisgIHJldHVybiByOworfQorDAorLyogTWFjcm9zIHRvIHN3YXAgb3V0IHZhbHVlcy4gICovCisKKyNkZWZpbmUgcHV0XzE2KGJlLCB2LCBzKSAoKGJlKSA/IGJmZF9wdXRiMTYgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMTYgKCh2KSwgKHMpKSkKKyNkZWZpbmUgcHV0XzMyKGJlLCB2LCBzKSAoKGJlKSA/IGJmZF9wdXRiMzIgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMzIgKCh2KSwgKHMpKSkKKworLyogTG9jYWwgZnVuY3Rpb25zIHVzZWQgdG8gY29udmVydCByZXNvdXJjZXMgdG8gYmluYXJ5IGZvcm1hdC4gICovCisKK3N0YXRpYyB2b2lkIGR3b3JkX2FsaWduX2JpbiBQQVJBTVMgKChzdHJ1Y3QgYmluZGF0YSAqKiosIHVuc2lnbmVkIGxvbmcgKikpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNpZF90b19iaW4gUEFSQU1TICgoc3RydWN0IHJlc19pZCwgaW50KSk7CitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKnVuaWNvZGVfdG9fYmluIFBBUkFNUyAoKGNvbnN0IHVuaWNoYXIgKiwgaW50KSk7CitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fYWNjZWxlcmF0b3IKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2N1cnNvcgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgY3Vyc29yICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dyb3VwX2N1cnNvcgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2RpYWxvZworICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZGlhbG9nICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2ZvbnRkaXIKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZvbnRkaXIgKiwgaW50KSk7CitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZ3JvdXBfaWNvbgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9tZW51CisgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51ICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX21lbnVpdGVtcworICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKiwgaW50KSk7CitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fbWVudWV4aXRlbXMKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX3JjZGF0YQorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKiwgaW50KSk7CitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fc3RyaW5ndGFibGUKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICosIGludCkpOworc3RhdGljIHN0cnVjdCBiaW5kYXRhICpzdHJpbmdfdG9fdW5pY29kZV9iaW4gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbworICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKiwgaW50KSk7CitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fZ2VuZXJpYworICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKKworLyogQ29udmVydCBhIHJlc291cmNlIHRvIGJpbmFyeS4gICovCisKK3N0cnVjdCBiaW5kYXRhICoKK3Jlc190b19iaW4gKHJlcywgYmlnX2VuZGlhbikKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3dpdGNoIChyZXMtPnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKKyAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6CisgICAgY2FzZSBSRVNfVFlQRV9JQ09OOgorICAgIGNhc2UgUkVTX1RZUEVfTUVTU0FHRVRBQkxFOgorICAgICAgcmV0dXJuIHJlc190b19iaW5fZ2VuZXJpYyAocmVzLT51LmRhdGEubGVuZ3RoLCByZXMtPnUuZGF0YS5kYXRhKTsKKyAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgorICAgICAgcmV0dXJuIHJlc190b19iaW5fYWNjZWxlcmF0b3IgKHJlcy0+dS5hY2MsIGJpZ19lbmRpYW4pOworICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgorICAgICAgcmV0dXJuIHJlc190b19iaW5fY3Vyc29yIChyZXMtPnUuY3Vyc29yLCBiaWdfZW5kaWFuKTsKKyAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKKyAgICAgIHJldHVybiByZXNfdG9fYmluX2dyb3VwX2N1cnNvciAocmVzLT51Lmdyb3VwX2N1cnNvciwgYmlnX2VuZGlhbik7CisgICAgY2FzZSBSRVNfVFlQRV9ESUFMT0c6CisgICAgICByZXR1cm4gcmVzX3RvX2Jpbl9kaWFsb2cgKHJlcy0+dS5kaWFsb2csIGJpZ19lbmRpYW4pOworICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKKyAgICAgIHJldHVybiByZXNfdG9fYmluX2ZvbnRkaXIgKHJlcy0+dS5mb250ZGlyLCBiaWdfZW5kaWFuKTsKKyAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046CisgICAgICByZXR1cm4gcmVzX3RvX2Jpbl9ncm91cF9pY29uIChyZXMtPnUuZ3JvdXBfaWNvbiwgYmlnX2VuZGlhbik7CisgICAgY2FzZSBSRVNfVFlQRV9NRU5VOgorICAgICAgcmV0dXJuIHJlc190b19iaW5fbWVudSAocmVzLT51Lm1lbnUsIGJpZ19lbmRpYW4pOworICAgIGNhc2UgUkVTX1RZUEVfUkNEQVRBOgorICAgICAgcmV0dXJuIHJlc190b19iaW5fcmNkYXRhIChyZXMtPnUucmNkYXRhLCBiaWdfZW5kaWFuKTsKKyAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgorICAgICAgcmV0dXJuIHJlc190b19iaW5fc3RyaW5ndGFibGUgKHJlcy0+dS5zdHJpbmd0YWJsZSwgYmlnX2VuZGlhbik7CisgICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKKyAgICAgIHJldHVybiByZXNfdG9fYmluX3JjZGF0YSAocmVzLT51LnJjZGF0YSwgYmlnX2VuZGlhbik7CisgICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKKyAgICAgIHJldHVybiByZXNfdG9fYmluX3ZlcnNpb25pbmZvIChyZXMtPnUudmVyc2lvbmluZm8sIGJpZ19lbmRpYW4pOworICAgIH0KK30KKworLyogQWxpZ24gdG8gYSAzMiBiaXQgYm91bmRhcnkuICBQUFAgcG9pbnRzIHRvIHRoZSBvZiBhIGxpc3Qgb2YgYmluZGF0YQorICAgc3RydWN0dXJlcy4gIExFTkdUSCBwb2ludHMgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RydWN0dXJlcy4gIElmCisgICBuZWNlc3NhcnksIHRoaXMgYWRkcyBhIG5ldyBiaW5kYXRhIHRvIGJyaW5nIGxlbmd0aCB1cCB0byBhIDMyIGJpdAorICAgYm91bmRhcnkuICBJdCB1cGRhdGVzICpQUFAgYW5kICpMRU5HVEguICAqLworCitzdGF0aWMgdm9pZAorZHdvcmRfYWxpZ25fYmluIChwcHAsIGxlbmd0aCkKKyAgICAgc3RydWN0IGJpbmRhdGEgKioqcHBwOworICAgICB1bnNpZ25lZCBsb25nICpsZW5ndGg7Cit7CisgIGludCBhZGQ7CisgIHN0cnVjdCBiaW5kYXRhICpkOworCisgIGlmICgoKmxlbmd0aCAmIDMpID09IDApCisgICAgcmV0dXJuOworCisgIGFkZCA9IDQgLSAoKmxlbmd0aCAmIDMpOworCisgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgIGQtPmxlbmd0aCA9IGFkZDsKKyAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChhZGQpOworICBtZW1zZXQgKGQtPmRhdGEsIDAsIGFkZCk7CisKKyAgZC0+bmV4dCA9IE5VTEw7CisgICoqcHBwID0gZDsKKyAgKnBwcCA9ICYoKipwcHApLT5uZXh0OworCisgICpsZW5ndGggKz0gYWRkOworfQorCisvKiBDb252ZXJ0IGEgcmVzb3VyY2UgSUQgdG8gYmluYXJ5LiAgVGhpcyBhbHdheXMgcmV0dXJucyBleGFjdGx5IG9uZQorICAgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzaWRfdG9fYmluIChpZCwgYmlnX2VuZGlhbikKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIHN0cnVjdCBiaW5kYXRhICpkOworCisgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisKKyAgaWYgKCEgaWQubmFtZWQpCisgICAgeworICAgICAgZC0+bGVuZ3RoID0gNDsKKyAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDB4ZmZmZiwgZC0+ZGF0YSk7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGlkLnUuaWQsIGQtPmRhdGEgKyAyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZC0+bGVuZ3RoID0gaWQudS5uLmxlbmd0aCAqIDIgKyAyOworICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOworICAgICAgZm9yIChpID0gMDsgaSA8IGlkLnUubi5sZW5ndGg7IGkrKykKKwlwdXRfMTYgKGJpZ19lbmRpYW4sIGlkLnUubi5uYW1lW2ldLCBkLT5kYXRhICsgaSAqIDIpOworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOworICAgIH0KKworICBkLT5uZXh0ID0gTlVMTDsKKworICByZXR1cm4gZDsKK30KKworLyogQ29udmVydCBhIG51bGwgdGVybWluYXRlZCB1bmljb2RlIHN0cmluZyB0byBiaW5hcnkuICBUaGlzIGFsd2F5cworICAgcmV0dXJucyBleGFjdGx5IG9uZSBiaW5kYXRhIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCit1bmljb2RlX3RvX2JpbiAoc3RyLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCB1bmljaGFyICpzdHI7CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBpbnQgbGVuOworICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICBsZW4gPSAwOworICBpZiAoc3RyICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgdW5pY2hhciAqczsKKworICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAwOyBzKyspCisJKytsZW47CisgICAgfQorCisgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgIGQtPmxlbmd0aCA9IGxlbiAqIDIgKyAyOworICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7CisKKyAgaWYgKHN0ciA9PSBOVUxMKQorICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSk7CisgIGVsc2UKKyAgICB7CisgICAgICBjb25zdCB1bmljaGFyICpzOworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAocyA9IHN0ciwgaSA9IDA7ICpzICE9IDA7IHMrKywgaSsrKQorCXB1dF8xNiAoYmlnX2VuZGlhbiwgKnMsIGQtPmRhdGEgKyBpICogMik7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyBpICogMik7CisgICAgfQorCisgIGQtPm5leHQgPSBOVUxMOworCisgIHJldHVybiBkOworfQorCisvKiBDb252ZXJ0IGFuIGFjY2VsZXJhdG9yIHJlc291cmNlIHRvIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCityZXNfdG9fYmluX2FjY2VsZXJhdG9yIChhY2NlbGVyYXRvcnMsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjZWxlcmF0b3JzOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOworICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmE7CisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKworICBmb3IgKGEgPSBhY2NlbGVyYXRvcnM7IGEgIT0gTlVMTDsgYSA9IGEtPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7CisKKyAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgICAgICBkLT5sZW5ndGggPSA4OworICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg4KTsKKworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLAorCSAgICAgIGEtPmZsYWdzIHwgKGEtPm5leHQgIT0gTlVMTCA/IDAgOiBBQ0NfTEFTVCksCisJICAgICAgZC0+ZGF0YSk7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGEtPmtleSwgZC0+ZGF0YSArIDIpOworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBhLT5pZCwgZC0+ZGF0YSArIDQpOworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgOCk7CisKKyAgICAgIGQtPm5leHQgPSBOVUxMOworICAgICAgKnBwID0gZDsKKyAgICAgIHBwID0gJmQtPm5leHQ7CisgICAgfQorCisgIHJldHVybiBmaXJzdDsKK30KKworLyogQ29udmVydCBhIGN1cnNvciByZXNvdXJjZSB0byBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzX3RvX2Jpbl9jdXJzb3IgKGMsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHN0cnVjdCBjdXJzb3IgKmM7CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworICBkLT5sZW5ndGggPSA0OworICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOworCisgIHB1dF8xNiAoYmlnX2VuZGlhbiwgYy0+eGhvdHNwb3QsIGQtPmRhdGEpOworICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMtPnlob3RzcG90LCBkLT5kYXRhICsgMik7CisKKyAgZC0+bmV4dCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKKyAgZC0+bmV4dC0+bGVuZ3RoID0gYy0+bGVuZ3RoOworICBkLT5uZXh0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgYy0+ZGF0YTsKKyAgZC0+bmV4dC0+bmV4dCA9IE5VTEw7CisKKyAgcmV0dXJuIGQ7Cit9CisKKy8qIENvbnZlcnQgYSBncm91cCBjdXJzb3IgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KKworc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKK3Jlc190b19iaW5fZ3JvdXBfY3Vyc29yIChncm91cF9jdXJzb3JzLCBiaWdfZW5kaWFuKQorICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3JzOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOworICBpbnQgYzsKKyAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ2M7CisKKyAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOworICBmaXJzdC0+bGVuZ3RoID0gNjsKKyAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7CisKKyAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSk7CisgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMiwgZmlyc3QtPmRhdGEgKyAyKTsKKworICBmaXJzdC0+bmV4dCA9IE5VTEw7CisgIHBwID0gJmZpcnN0LT5uZXh0OworCisgIGMgPSAwOworICBmb3IgKGdjID0gZ3JvdXBfY3Vyc29yczsgZ2MgIT0gTlVMTDsgZ2MgPSBnYy0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICAgICAgKytjOworCisgICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworICAgICAgZC0+bGVuZ3RoID0gMTQ7CisgICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDE0KTsKKworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+d2lkdGgsIGQtPmRhdGEpOworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+aGVpZ2h0LCBkLT5kYXRhICsgMik7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5wbGFuZXMsIGQtPmRhdGEgKyA0KTsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPmJpdHMsIGQtPmRhdGEgKyA2KTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZ2MtPmJ5dGVzLCBkLT5kYXRhICsgOCk7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5pbmRleCwgZC0+ZGF0YSArIDEyKTsKKworICAgICAgZC0+bmV4dCA9IE5VTEw7CisgICAgICAqcHAgPSBkOworICAgICAgcHAgPSAmZC0+bmV4dDsKKyAgICB9CisKKyAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIDQpOworCisgIHJldHVybiBmaXJzdDsKK30KKworLyogQ29udmVydCBhIGRpYWxvZyByZXNvdXJjZSB0byBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzX3RvX2Jpbl9kaWFsb2cgKGRpYWxvZywgYmlnX2VuZGlhbikKKyAgICAgY29uc3Qgc3RydWN0IGRpYWxvZyAqZGlhbG9nOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgaW50IGRpYWxvZ2V4OworICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7CisgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBpbnQgb2ZmLCBjOworICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmRjOworCisgIGRpYWxvZ2V4ID0gZXh0ZW5kZWRfZGlhbG9nIChkaWFsb2cpOworCisgIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKKyAgZmlyc3QtPmxlbmd0aCA9IGRpYWxvZ2V4ID8gMjYgOiAxODsKKyAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZmlyc3QtPmxlbmd0aCk7CisKKyAgbGVuZ3RoID0gZmlyc3QtPmxlbmd0aDsKKworICBpZiAoISBkaWFsb2dleCkKKyAgICB7CisgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+c3R5bGUsIGZpcnN0LT5kYXRhKTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leHN0eWxlLCBmaXJzdC0+ZGF0YSArIDQpOworICAgICAgb2ZmID0gODsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIGZpcnN0LT5kYXRhKTsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMHhmZmZmLCBmaXJzdC0+ZGF0YSArIDIpOworCisgICAgICBpZiAoZGlhbG9nLT5leCA9PSBOVUxMKQorCXB1dF8zMiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyA0KTsKKyAgICAgIGVsc2UKKwlwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPmhlbHAsIGZpcnN0LT5kYXRhICsgNCk7CisgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXhzdHlsZSwgZmlyc3QtPmRhdGEgKyA4KTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5zdHlsZSwgZmlyc3QtPmRhdGEgKyAxMik7CisgICAgICBvZmYgPSAxNjsKKyAgICB9CisKKyAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPngsIGZpcnN0LT5kYXRhICsgb2ZmICsgMik7CisgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT55LCBmaXJzdC0+ZGF0YSArIG9mZiArIDQpOworICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+d2lkdGgsIGZpcnN0LT5kYXRhICsgb2ZmICsgNik7CisgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5oZWlnaHQsIGZpcnN0LT5kYXRhICsgb2ZmICsgOCk7CisKKyAgcHAgPSAmZmlyc3QtPm5leHQ7CisKKyAgKnBwID0gcmVzaWRfdG9fYmluIChkaWFsb2ctPm1lbnUsIGJpZ19lbmRpYW4pOworICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKKyAgcHAgPSAmKCpwcCktPm5leHQ7CisKKyAgKnBwID0gcmVzaWRfdG9fYmluIChkaWFsb2ctPmNsYXNzLCBiaWdfZW5kaWFuKTsKKyAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7CisgIHBwID0gJigqcHApLT5uZXh0OworCisgICpwcCA9IHVuaWNvZGVfdG9fYmluIChkaWFsb2ctPmNhcHRpb24sIGJpZ19lbmRpYW4pOworICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKKyAgcHAgPSAmKCpwcCktPm5leHQ7CisKKyAgaWYgKChkaWFsb2ctPnN0eWxlICYgRFNfU0VURk9OVCkgIT0gMCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKKyAgICAgIGQtPmxlbmd0aCA9IGRpYWxvZ2V4ID8gNiA6IDI7CisgICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7CisKKyAgICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7CisKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5wb2ludHNpemUsIGQtPmRhdGEpOworCisgICAgICBpZiAoZGlhbG9nZXgpCisJeworCSAgaWYgKGRpYWxvZy0+ZXggPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDIpOworCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPndlaWdodCwgZC0+ZGF0YSArIDIpOworCSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT5leC0+aXRhbGljLCBkLT5kYXRhICsgNCk7CisJICAgIH0KKwl9CisKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OworCisgICAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAoZGlhbG9nLT5mb250LCBiaWdfZW5kaWFuKTsKKyAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOworICAgICAgcHAgPSAmKCpwcCktPm5leHQ7CisgICAgfQorCisgIGMgPSAwOworICBmb3IgKGRjID0gZGlhbG9nLT5jb250cm9sczsgZGMgIT0gTlVMTDsgZGMgPSBkYy0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKyAgICAgIGludCBkY29mZjsKKworICAgICAgKytjOworCisgICAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7CisKKyAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgICAgICBkLT5sZW5ndGggPSBkaWFsb2dleCA/IDI0IDogMTg7CisgICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7CisKKyAgICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7CisKKyAgICAgIGlmICghIGRpYWxvZ2V4KQorCXsKKwkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPnN0eWxlLCBkLT5kYXRhKTsKKwkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmV4c3R5bGUsIGQtPmRhdGEgKyA0KTsKKwkgIGRjb2ZmID0gODsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+aGVscCwgZC0+ZGF0YSk7CisJICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5leHN0eWxlLCBkLT5kYXRhICsgNCk7CisJICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5zdHlsZSwgZC0+ZGF0YSArIDgpOworCSAgZGNvZmYgPSAxMjsKKwl9CisKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPngsIGQtPmRhdGEgKyBkY29mZik7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT55LCBkLT5kYXRhICsgZGNvZmYgKyAyKTsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPndpZHRoLCBkLT5kYXRhICsgZGNvZmYgKyA0KTsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGMtPmhlaWdodCwgZC0+ZGF0YSArIGRjb2ZmICsgNik7CisKKyAgICAgIGlmIChkaWFsb2dleCkKKyAgICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+aWQsIGQtPmRhdGEgKyBkY29mZiArIDgpOworICAgICAgZWxzZQorICAgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT5pZCwgZC0+ZGF0YSArIGRjb2ZmICsgOCk7CisKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OworCisgICAgICAqcHAgPSByZXNpZF90b19iaW4gKGRjLT5jbGFzcywgYmlnX2VuZGlhbik7CisgICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKKyAgICAgIHBwID0gJigqcHApLT5uZXh0OworCisgICAgICAqcHAgPSByZXNpZF90b19iaW4gKGRjLT50ZXh0LCBiaWdfZW5kaWFuKTsKKyAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOworICAgICAgcHAgPSAmKCpwcCktPm5leHQ7CisKKyAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgICAgICBkLT5sZW5ndGggPSAyOworICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKKworICAgICAgbGVuZ3RoICs9IDI7CisKKyAgICAgIGQtPm5leHQgPSBOVUxMOworICAgICAgKnBwID0gZDsKKyAgICAgIHBwID0gJmQtPm5leHQ7CisKKyAgICAgIGlmIChkYy0+ZGF0YSA9PSBOVUxMKQorCXB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSk7CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgbG9uZyBzdWJsZW47CisKKwkgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKKworCSAgKnBwID0gcmVzX3RvX2Jpbl9yY2RhdGEgKGRjLT5kYXRhLCBiaWdfZW5kaWFuKTsKKwkgIHN1YmxlbiA9IDA7CisJICB3aGlsZSAoKnBwICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBzdWJsZW4gKz0gKCpwcCktPmxlbmd0aDsKKwkgICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKKwkgICAgfQorCisJICBwdXRfMTYgKGJpZ19lbmRpYW4sIHN1YmxlbiwgZC0+ZGF0YSk7CisKKwkgIGxlbmd0aCArPSBzdWJsZW47CisJfQorICAgIH0KKyAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIG9mZik7CisKKyAgcmV0dXJuIGZpcnN0OworfQorCisvKiBDb252ZXJ0IGEgZm9udGRpciByZXNvdXJjZSB0byBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzX3RvX2Jpbl9mb250ZGlyIChmb250ZGlycywgYmlnX2VuZGlhbikKKyAgICAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZvbnRkaXJzOworICAgICBpbnQgYmlnX2VuZGlhbjsKK3sKKyAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOworICBpbnQgYzsKKyAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZkOworCisgIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKKyAgZmlyc3QtPmxlbmd0aCA9IDI7CisgIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOworCisgIGZpcnN0LT5uZXh0ID0gTlVMTDsKKyAgcHAgPSAmZmlyc3QtPm5leHQ7CisKKyAgYyA9IDA7CisgIGZvciAoZmQgPSBmb250ZGlyczsgZmQgIT0gTlVMTDsgZmQgPSBmZC0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICAgICAgKytjOworCisgICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworICAgICAgZC0+bGVuZ3RoID0gMjsKKyAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7CisKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZmQtPmluZGV4LCBkLT5kYXRhKTsKKworICAgICAgKnBwID0gZDsKKyAgICAgIHBwID0gJmQtPm5leHQ7CisKKyAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgICAgICBkLT5sZW5ndGggPSBmZC0+bGVuZ3RoOworICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGZkLT5kYXRhOworCisgICAgICBkLT5uZXh0ID0gTlVMTDsKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OyAgICAgIAorICAgIH0KKworICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMsIGZpcnN0LT5kYXRhKTsKKworICByZXR1cm4gZmlyc3Q7ICAKK30KKworLyogQ29udmVydCBhIGdyb3VwIGljb24gcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KKworc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKK3Jlc190b19iaW5fZ3JvdXBfaWNvbiAoZ3JvdXBfaWNvbnMsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uczsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKKyAgaW50IGM7CisgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpnaTsKKworICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7CisgIGZpcnN0LT5sZW5ndGggPSA2OworICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKKworICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhKTsKKyAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBmaXJzdC0+ZGF0YSArIDIpOworCisgIGZpcnN0LT5uZXh0ID0gTlVMTDsKKyAgcHAgPSAmZmlyc3QtPm5leHQ7CisKKyAgYyA9IDA7CisgIGZvciAoZ2kgPSBncm91cF9pY29uczsgZ2kgIT0gTlVMTDsgZ2kgPSBnaS0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICAgICAgKytjOworCisgICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworICAgICAgZC0+bGVuZ3RoID0gMTQ7CisgICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDE0KTsKKworICAgICAgZC0+ZGF0YVswXSA9IGdpLT53aWR0aDsKKyAgICAgIGQtPmRhdGFbMV0gPSBnaS0+aGVpZ2h0OworICAgICAgZC0+ZGF0YVsyXSA9IGdpLT5jb2xvcnM7CisgICAgICBkLT5kYXRhWzNdID0gMDsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPnBsYW5lcywgZC0+ZGF0YSArIDQpOworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnaS0+Yml0cywgZC0+ZGF0YSArIDYpOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBnaS0+Ynl0ZXMsIGQtPmRhdGEgKyA4KTsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPmluZGV4LCBkLT5kYXRhICsgMTIpOworCisgICAgICBkLT5uZXh0ID0gTlVMTDsKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OworICAgIH0KKworICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMsIGZpcnN0LT5kYXRhICsgNCk7CisKKyAgcmV0dXJuIGZpcnN0OworfQorCisvKiBDb252ZXJ0IGEgbWVudSByZXNvdXJjZSB0byBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzX3RvX2Jpbl9tZW51IChtZW51LCBiaWdfZW5kaWFuKQorICAgICBjb25zdCBzdHJ1Y3QgbWVudSAqbWVudTsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIGludCBtZW51ZXg7CisgIHN0cnVjdCBiaW5kYXRhICpkOworCisgIG1lbnVleCA9IGV4dGVuZGVkX21lbnUgKG1lbnUpOworCisgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgIGQtPmxlbmd0aCA9IG1lbnVleCA/IDggOiA0OworICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7CisKKyAgaWYgKCEgbWVudWV4KQorICAgIHsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSk7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyAyKTsKKworICAgICAgZC0+bmV4dCA9IHJlc190b19iaW5fbWVudWl0ZW1zIChtZW51LT5pdGVtcywgYmlnX2VuZGlhbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBkLT5kYXRhKTsKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgNCwgZC0+ZGF0YSArIDIpOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBtZW51LT5oZWxwLCBkLT5kYXRhICsgNCk7CisKKyAgICAgIGQtPm5leHQgPSByZXNfdG9fYmluX21lbnVleGl0ZW1zIChtZW51LT5pdGVtcywgYmlnX2VuZGlhbik7CisgICAgfQorCisgIHJldHVybiBkOworfQorCisvKiBDb252ZXJ0IG1lbnUgaXRlbXMgdG8gYmluYXJ5LiAgKi8KKworc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKK3Jlc190b19iaW5fbWVudWl0ZW1zIChpdGVtcywgYmlnX2VuZGlhbikKKyAgICAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICppdGVtczsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKKyAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKKworICBmaXJzdCA9IE5VTEw7CisgIHBwID0gJmZpcnN0OworCisgIGZvciAobWkgPSBpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKyAgICAgIGludCBmbGFnczsKKworICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKKyAgICAgIGQtPmxlbmd0aCA9IG1pLT5wb3B1cCA9PSBOVUxMID8gNCA6IDI7CisgICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7CisKKyAgICAgIGZsYWdzID0gbWktPnR5cGU7CisgICAgICBpZiAobWktPm5leHQgPT0gTlVMTCkKKwlmbGFncyB8PSBNRU5VSVRFTV9FTkRNRU5VOworICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQorCWZsYWdzIHw9IE1FTlVJVEVNX1BPUFVQOworCisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZsYWdzLCBkLT5kYXRhKTsKKworICAgICAgaWYgKG1pLT5wb3B1cCA9PSBOVUxMKQorCXB1dF8xNiAoYmlnX2VuZGlhbiwgbWktPmlkLCBkLT5kYXRhICsgMik7CisKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OworCisgICAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAobWktPnRleHQsIGJpZ19lbmRpYW4pOworICAgICAgcHAgPSAmKCpwcCktPm5leHQ7CisKKyAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKKwl7CisJICAqcHAgPSByZXNfdG9fYmluX21lbnVpdGVtcyAobWktPnBvcHVwLCBiaWdfZW5kaWFuKTsKKwkgIHdoaWxlICgqcHAgIT0gTlVMTCkKKwkgICAgcHAgPSAmKCpwcCktPm5leHQ7CisJfQorICAgIH0KKworICByZXR1cm4gZmlyc3Q7Cit9CisKKy8qIENvbnZlcnQgbWVudWV4IGl0ZW1zIHRvIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCityZXNfdG9fYmluX21lbnVleGl0ZW1zIChpdGVtcywgYmlnX2VuZGlhbikKKyAgICAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICppdGVtczsKKyAgICAgaW50IGJpZ19lbmRpYW47Cit7CisgIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKKyAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWk7CisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKworICBsZW5ndGggPSAwOworCisgIGZvciAobWkgPSBpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKyAgICAgIGludCBmbGFnczsKKworICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOworCisgICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworICAgICAgZC0+bGVuZ3RoID0gMTI7CisgICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDEyKTsKKworICAgICAgbGVuZ3RoICs9IDEyOworCisgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1pLT50eXBlLCBkLT5kYXRhKTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWktPnN0YXRlLCBkLT5kYXRhICsgNCk7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIG1pLT5pZCwgZC0+ZGF0YSArIDgpOworCisgICAgICBmbGFncyA9IDA7CisgICAgICBpZiAobWktPm5leHQgPT0gTlVMTCkKKwlmbGFncyB8PSAweDgwOworICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQorCWZsYWdzIHw9IDE7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZsYWdzLCBkLT5kYXRhICsgMTApOworCisgICAgICAqcHAgPSBkOworICAgICAgcHAgPSAmZC0+bmV4dDsKKworICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKG1pLT50ZXh0LCBiaWdfZW5kaWFuKTsKKyAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOworICAgICAgcHAgPSAmKCpwcCktPm5leHQ7CisKKyAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKKwl7CisJICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7CisKKwkgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisJICBkLT5sZW5ndGggPSA0OworCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKKworCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBtaS0+aGVscCwgZC0+ZGF0YSk7CisKKwkgICpwcCA9IGQ7CisJICBwcCA9ICZkLT5uZXh0OworCisJICAqcHAgPSByZXNfdG9fYmluX21lbnVleGl0ZW1zIChtaS0+cG9wdXAsIGJpZ19lbmRpYW4pOworCSAgd2hpbGUgKCpwcCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7CisJICAgICAgcHAgPSAmKCpwcCktPm5leHQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBmaXJzdDsKK30KKworLyogQ29udmVydCBhbiByY2RhdGEgcmVzb3VyY2UgdG8gYmluYXJ5LiAgVGhpcyBpcyBhbHNvIHVzZWQgdG8gY29udmVydAorICAgb3RoZXIgaW5mb3JtYXRpb24gd2hpY2ggaGFwcGVucyB0byBiZSBzdG9yZWQgaW4gcmNkYXRhX2l0ZW0gbGlzdHMKKyAgIHRvIGJpbmFyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCityZXNfdG9fYmluX3JjZGF0YSAoaXRlbXMsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqaXRlbXM7CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7CisgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7CisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKworICBmb3IgKHJpID0gaXRlbXM7IHJpICE9IE5VTEw7IHJpID0gcmktPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7CisKKyAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisKKyAgICAgIHN3aXRjaCAocmktPnR5cGUpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKworCWNhc2UgUkNEQVRBX1dPUkQ6CisJICBkLT5sZW5ndGggPSAyOworCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKKwkgIHB1dF8xNiAoYmlnX2VuZGlhbiwgcmktPnUud29yZCwgZC0+ZGF0YSk7CisJICBicmVhazsKKworCWNhc2UgUkNEQVRBX0RXT1JEOgorCSAgZC0+bGVuZ3RoID0gNDsKKwkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7CisJICBwdXRfMzIgKGJpZ19lbmRpYW4sIHJpLT51LmR3b3JkLCBkLT5kYXRhKTsKKwkgIGJyZWFrOworCisJY2FzZSBSQ0RBVEFfU1RSSU5HOgorCSAgZC0+bGVuZ3RoID0gcmktPnUuc3RyaW5nLmxlbmd0aDsKKwkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByaS0+dS5zdHJpbmcuczsKKwkgIGJyZWFrOworCisJY2FzZSBSQ0RBVEFfV1NUUklORzoKKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBpOworCisJICAgIGQtPmxlbmd0aCA9IHJpLT51LndzdHJpbmcubGVuZ3RoICogMjsKKwkgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgcmktPnUud3N0cmluZy5sZW5ndGg7IGkrKykKKwkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHJpLT51LndzdHJpbmcud1tpXSwgZC0+ZGF0YSArIGkgKiAyKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIFJDREFUQV9CVUZGRVI6CisJICBkLT5sZW5ndGggPSByaS0+dS5idWZmZXIubGVuZ3RoOworCSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJpLT51LmJ1ZmZlci5kYXRhOworCSAgYnJlYWs7CisJfQorCisgICAgICBkLT5uZXh0ID0gTlVMTDsKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OworICAgIH0KKworICByZXR1cm4gZmlyc3Q7Cit9CisKKy8qIENvbnZlcnQgYSBzdHJpbmd0YWJsZSByZXNvdXJjZSB0byBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzX3RvX2Jpbl9zdHJpbmd0YWJsZSAoc3QsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqc3Q7CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7CisgIGludCBpOworCisgIGZpcnN0ID0gTlVMTDsKKyAgcHAgPSAmZmlyc3Q7CisKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgaW50IHNsZW4sIGo7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqZDsKKyAgICAgIHVuaWNoYXIgKnM7CisKKyAgICAgIHNsZW4gPSBzdC0+c3RyaW5nc1tpXS5sZW5ndGg7CisgICAgICBzID0gc3QtPnN0cmluZ3NbaV0uc3RyaW5nOworCisgICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworICAgICAgZC0+bGVuZ3RoID0gMiArIHNsZW4gKiAyOworICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOworCisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHNsZW4sIGQtPmRhdGEpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgc2xlbjsgaisrKQorCXB1dF8xNiAoYmlnX2VuZGlhbiwgc1tqXSwgZC0+ZGF0YSArIDIgKyBqICogMik7CisKKyAgICAgIGQtPm5leHQgPSBOVUxMOworICAgICAgKnBwID0gZDsKKyAgICAgIHBwID0gJmQtPm5leHQ7ICAgICAgCisgICAgfQorCisgIHJldHVybiBmaXJzdDsKK30KKworLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIGJpbmFyeSBzdHJpbmcuICBUaGlzIGFsd2F5cworICAgcmV0dXJucyBleGFjdGx5IG9uZSBiaW5kYXRhIHN0cnVjdHVyZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCitzdHJpbmdfdG9fdW5pY29kZV9iaW4gKHMsIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBzaXplX3QgbGVuLCBpOworICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICBsZW4gPSBzdHJsZW4gKHMpOworCisgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgIGQtPmxlbmd0aCA9IGxlbiAqIDIgKyAyOworICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGQtPmxlbmd0aCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgc1tpXSwgZC0+ZGF0YSArIGkgKiAyKTsKKyAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOworCisgIGQtPm5leHQgPSBOVUxMOworCisgIHJldHVybiBkOyAgCit9CisKKy8qIENvbnZlcnQgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZSB0byBiaW5hcnkuICAqLworCitzdGF0aWMgc3RydWN0IGJpbmRhdGEgKgorcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyAodmVyc2lvbmluZm8sIGJpZ19lbmRpYW4pCisgICAgIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87CisgICAgIGludCBiaWdfZW5kaWFuOworeworICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7CisgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBzdHJ1Y3QgdmVyX2luZm8gKnZpOworCisgIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKKyAgZmlyc3QtPmxlbmd0aCA9IDY7CisgIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOworCisgIGxlbmd0aCA9IDY7CisKKyAgaWYgKHZlcnNpb25pbmZvLT5maXhlZCA9PSBOVUxMKQorICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyAyKTsKKyAgZWxzZQorICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgNTIsIGZpcnN0LT5kYXRhICsgMik7CisKKyAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSArIDQpOworCisgIHBwID0gJmZpcnN0LT5uZXh0OworCisgICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlZTX1ZFUlNJT05fSU5GTyIsIGJpZ19lbmRpYW4pOworICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKKyAgcHAgPSAmKCpwcCktPm5leHQ7CisKKyAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOworCisgIGlmICh2ZXJzaW9uaW5mby0+Zml4ZWQgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpOworICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7CisKKyAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7CisgICAgICBkLT5sZW5ndGggPSA1MjsKKyAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNTIpOworCisgICAgICBsZW5ndGggKz0gNTI7CisKKyAgICAgIGZpID0gdmVyc2lvbmluZm8tPmZpeGVkOworCisgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIDB4ZmVlZjA0YmQsIGQtPmRhdGEpOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCAweDEwMDAwLCBkLT5kYXRhICsgNCk7CisgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3ZlcnNpb25fbXMsIGQtPmRhdGEgKyA4KTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfdmVyc2lvbl9scywgZC0+ZGF0YSArIDEyKTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPnByb2R1Y3RfdmVyc2lvbl9tcywgZC0+ZGF0YSArIDE2KTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPnByb2R1Y3RfdmVyc2lvbl9scywgZC0+ZGF0YSArIDIwKTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZmxhZ3NfbWFzaywgZC0+ZGF0YSArIDI0KTsKKyAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZmxhZ3MsIGQtPmRhdGEgKyAyOCk7CisgICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX29zLCBkLT5kYXRhICsgMzIpOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV90eXBlLCBkLT5kYXRhICsgMzYpOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9zdWJ0eXBlLCBkLT5kYXRhICsgNDApOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9kYXRlX21zLCBkLT5kYXRhICsgNDQpOworICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9kYXRlX2xzLCBkLT5kYXRhICsgNDgpOworCisgICAgICBkLT5uZXh0ID0gTlVMTDsKKyAgICAgICpwcCA9IGQ7CisgICAgICBwcCA9ICZkLT5uZXh0OworICAgIH0KKworICBmb3IgKHZpID0gdmVyc2lvbmluZm8tPnZhcjsgdmkgIT0gTlVMTDsgdmkgPSB2aS0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmluZGF0YSAqdmlkOworICAgICAgdW5zaWduZWQgbG9uZyB2aWxlbjsKKworICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOworCisgICAgICB2aWQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdmlkKTsKKyAgICAgIHZpZC0+bGVuZ3RoID0gNjsKKyAgICAgIHZpZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKKworICAgICAgbGVuZ3RoICs9IDY7CisgICAgICB2aWxlbiA9IDY7CisKKyAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdmlkLT5kYXRhICsgMik7CisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZpZC0+ZGF0YSArIDQpOworCisgICAgICAqcHAgPSB2aWQ7CisgICAgICBwcCA9ICZ2aWQtPm5leHQ7CisKKyAgICAgIHN3aXRjaCAodmktPnR5cGUpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKworCWNhc2UgVkVSSU5GT19TVFJJTkc6CisJICB7CisJICAgIHVuc2lnbmVkIGxvbmcgaG9sZCwgdnNsZW47CisJICAgIHN0cnVjdCBiaW5kYXRhICp2c2Q7CisJICAgIGNvbnN0IHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7CisKKwkgICAgKnBwID0gc3RyaW5nX3RvX3VuaWNvZGVfYmluICgiU3RyaW5nRmlsZUluZm8iLCBiaWdfZW5kaWFuKTsKKwkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7CisJICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7CisJICAgIHBwID0gJigqcHApLT5uZXh0OworCisJICAgIGhvbGQgPSBsZW5ndGg7CisJICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKKwkgICAgdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKKworCSAgICB2c2QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdnNkKTsKKwkgICAgdnNkLT5sZW5ndGggPSA2OworCSAgICB2c2QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7CisKKwkgICAgbGVuZ3RoICs9IDY7CisJICAgIHZpbGVuICs9IDY7CisJICAgIHZzbGVuID0gNjsKKworCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZzZC0+ZGF0YSArIDIpOworCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZzZC0+ZGF0YSArIDQpOworCisJICAgICpwcCA9IHZzZDsKKwkgICAgcHAgPSAmdnNkLT5uZXh0OworCisJICAgICpwcCA9IHVuaWNvZGVfdG9fYmluICh2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsIGJpZ19lbmRpYW4pOworCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKKwkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKKwkgICAgdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKKwkgICAgcHAgPSAmKCpwcCktPm5leHQ7CisKKwkgICAgZm9yICh2cyA9IHZpLT51LnN0cmluZy5zdHJpbmdzOyB2cyAhPSBOVUxMOyB2cyA9IHZzLT5uZXh0KQorCSAgICAgIHsKKwkJc3RydWN0IGJpbmRhdGEgKnZzc2Q7CisJCXVuc2lnbmVkIGxvbmcgdnNzbGVuOworCisJCWhvbGQgPSBsZW5ndGg7CisJCWR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKKwkJdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKKwkJdnNsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKKworCQl2c3NkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZzc2QpOworCQl2c3NkLT5sZW5ndGggPSA2OworCQl2c3NkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOworCisJCWxlbmd0aCArPSA2OworCQl2aWxlbiArPSA2OworCQl2c2xlbiArPSA2OworCQl2c3NsZW4gPSA2OworCisJCXB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgdnNzZC0+ZGF0YSArIDQpOworCisJCSpwcCA9IHZzc2Q7CisJCXBwID0gJnZzc2QtPm5leHQ7CisKKwkJKnBwID0gdW5pY29kZV90b19iaW4gKHZzLT5rZXksIGJpZ19lbmRpYW4pOworCQlsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKKwkJdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKKwkJdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKKwkJdnNzbGVuICs9ICgqcHApLT5sZW5ndGg7CisJCXBwID0gJigqcHApLT5uZXh0OworCisJCWhvbGQgPSBsZW5ndGg7CisJCWR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKKwkJdmlsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKKwkJdnNsZW4gKz0gbGVuZ3RoIC0gaG9sZDsKKwkJdnNzbGVuICs9IGxlbmd0aCAtIGhvbGQ7CisKKwkJKnBwID0gdW5pY29kZV90b19iaW4gKHZzLT52YWx1ZSwgYmlnX2VuZGlhbik7CisgCQlwdXRfMTYgKGJpZ19lbmRpYW4sICgqcHApLT5sZW5ndGggLyAyLCB2c3NkLT5kYXRhICsgMik7CisJCWxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOworCQl2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOworCQl2c2xlbiArPSAoKnBwKS0+bGVuZ3RoOworCQl2c3NsZW4gKz0gKCpwcCktPmxlbmd0aDsKKwkJcHAgPSAmKCpwcCktPm5leHQ7CisKKwkJcHV0XzE2IChiaWdfZW5kaWFuLCB2c3NsZW4sIHZzc2QtPmRhdGEpOworCSAgICAgIH0KKworCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZzbGVuLCB2c2QtPmRhdGEpOworCisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBWRVJJTkZPX1ZBUjoKKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBob2xkLCB2dmxlbiwgdnZ2bGVuOworCSAgICBzdHJ1Y3QgYmluZGF0YSAqdnZkOworCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OworCisJICAgICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlZhckZpbGVJbmZvIiwgYmlnX2VuZGlhbik7CisJICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOworCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOworCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKKworCSAgICBob2xkID0gbGVuZ3RoOworCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7CisJICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7CisKKwkgICAgdnZkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZ2ZCk7CisJICAgIHZ2ZC0+bGVuZ3RoID0gNjsKKwkgICAgdnZkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOworCisJICAgIGxlbmd0aCArPSA2OworCSAgICB2aWxlbiArPSA2OworCSAgICB2dmxlbiA9IDY7CisKKwkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2dmQtPmRhdGEgKyA0KTsKKworCSAgICAqcHAgPSB2dmQ7CisJICAgIHBwID0gJnZ2ZC0+bmV4dDsKKworCSAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAodmktPnUudmFyLmtleSwgYmlnX2VuZGlhbik7CisJICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOworCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOworCSAgICB2dmxlbiArPSAoKnBwKS0+bGVuZ3RoOworCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKKworCSAgICBob2xkID0gbGVuZ3RoOworCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7CisJICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7CisJICAgIHZ2bGVuICs9IGxlbmd0aCAtIGhvbGQ7CisKKwkgICAgdnZ2bGVuID0gMDsKKworCSAgICBmb3IgKHZ2ID0gdmktPnUudmFyLnZhcjsgdnYgIT0gTlVMTDsgdnYgPSB2di0+bmV4dCkKKwkgICAgICB7CisJCXN0cnVjdCBiaW5kYXRhICp2dnNkOworCisJCXZ2c2QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqdnZzZCk7CisJCXZ2c2QtPmxlbmd0aCA9IDQ7CisJCXZ2c2QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7CisKKwkJbGVuZ3RoICs9IDQ7CisJCXZpbGVuICs9IDQ7CisJCXZ2bGVuICs9IDQ7CisJCXZ2dmxlbiArPSA0OworCisJCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnYtPmxhbmd1YWdlLCB2dnNkLT5kYXRhKTsKKwkJcHV0XzE2IChiaWdfZW5kaWFuLCB2di0+Y2hhcnNldCwgdnZzZC0+ZGF0YSArIDIpOworCisJCXZ2c2QtPm5leHQgPSBOVUxMOworCQkqcHAgPSB2dnNkOworCQlwcCA9ICZ2dnNkLT5uZXh0OworCSAgICAgIH0KKworCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2bGVuLCB2dmQtPmRhdGEpOworCSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2dmxlbiwgdnZkLT5kYXRhICsgMik7CisKKwkgICAgYnJlYWs7CisJICB9CisJfQorCisgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHZpbGVuLCB2aWQtPmRhdGEpOworICAgIH0KKworICBwdXRfMTYgKGJpZ19lbmRpYW4sIGxlbmd0aCwgZmlyc3QtPmRhdGEpOworCisgIHJldHVybiBmaXJzdDsKK30KKworLyogQ29udmVydCBhIGdlbmVyaWMgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KKworc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKK3Jlc190b19iaW5fZ2VuZXJpYyAobGVuZ3RoLCBkYXRhKQorICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKK3sKKyAgc3RydWN0IGJpbmRhdGEgKmQ7CisKKyAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKKyAgZC0+bGVuZ3RoID0gbGVuZ3RoOworICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YTsKKworICBkLT5uZXh0ID0gTlVMTDsKKworICByZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc2NvZmYuYyBiL2JpbnV0aWxzL3Jlc2NvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTAyOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvcmVzY29mZi5jCkBAIC0wLDAgKzEsNzc2IEBACisvKiByZXNjb2ZmLmMgLS0gcmVhZCBhbmQgd3JpdGUgcmVzb3VyY2VzIGluIFdpbmRvd3MgQ09GRiBmaWxlcy4KKyAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHRoYXQgcmVhZCBhbmQgd3JpdGUgV2luZG93cyByZXNvdXJjZXMKKyAgIGluIENPRkYgZmlsZXMuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAid2luZHJlcy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8qIEluIG9yZGVyIHRvIHVzZSB0aGUgYWRkcmVzcyBvZiBhIHJlc291cmNlIGRhdGEgZW50cnksIHdlIG5lZWQgdG8KKyAgIGdldCB0aGUgaW1hZ2UgYmFzZSBvZiB0aGUgZmlsZS4gIFJpZ2h0IG5vdyB3ZSBleHRyYWN0IGl0IGZyb20KKyAgIGludGVybmFsIEJGRCBpbmZvcm1hdGlvbi4gIEZJWE1FLiAgKi8KKworI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKKy8qIEluZm9ybWF0aW9uIHdlIGV4dHJhY3QgZnJvbSB0aGUgZmlsZS4gICovCisKK3N0cnVjdCBjb2ZmX2ZpbGVfaW5mbworeworICAvKiBGaWxlIG5hbWUuICAqLworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgLyogRGF0YSByZWFkIGZyb20gdGhlIGZpbGUuICAqLworICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKKyAgLyogRW5kIG9mIGRhdGEgcmVhZCBmcm9tIGZpbGUuICAqLworICBjb25zdCBiZmRfYnl0ZSAqZGF0YV9lbmQ7CisgIC8qIEFkZHJlc3Mgb2YgdGhlIHJlc291cmNlIHNlY3Rpb24gbWludXMgdGhlIGltYWdlIGJhc2Ugb2YgdGhlIGZpbGUuICAqLworICBiZmRfdm1hIHNlY2FkZHI7CisgIC8qIE5vbi16ZXJvIGlmIHRoZSBmaWxlIGlzIGJpZyBlbmRpYW4uICAqLworICBpbnQgYmlnX2VuZGlhbjsKK307CisKKy8qIEEgcmVzb3VyY2UgZGlyZWN0b3J5IHRhYmxlIGluIGEgQ09GRiBmaWxlLiAgKi8KKworc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5Cit7CisgIC8qIENoYXJhY3RlcmlzdGljcy4gICovCisgIGJmZF9ieXRlIGNoYXJhY3RlcmlzdGljc1s0XTsKKyAgLyogVGltZSBzdGFtcC4gICovCisgIGJmZF9ieXRlIHRpbWVbNF07CisgIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyLiAgKi8KKyAgYmZkX2J5dGUgbWFqb3JbMl07CisgIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KKyAgYmZkX2J5dGUgbWlub3JbMl07CisgIC8qIE51bWJlciBvZiBuYW1lZCBkaXJlY3RvcnkgZW50cmllcy4gICovCisgIGJmZF9ieXRlIG5hbWVfY291bnRbMl07CisgIC8qIE51bWJlciBvZiBkaXJlY3RvcnkgZW50cmllcyB3aXRoIElEcy4gICovCisgIGJmZF9ieXRlIGlkX2NvdW50WzJdOworfTsKKworLyogQSByZXNvdXJjZSBkaXJlY3RvcnkgZW50cnkgaW4gYSBDT0ZGIGZpbGUuICAqLworCitzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeQoreworICAvKiBOYW1lIG9yIElELiAgKi8KKyAgYmZkX2J5dGUgbmFtZVs0XTsKKyAgLyogQWRkcmVzcyBvZiByZXNvdXJjZSBlbnRyeSBvciBzdWJkaXJlY3RvcnkuICAqLworICBiZmRfYnl0ZSBydmFbNF07Cit9OworCisvKiBBIHJlc291cmNlIGRhdGEgZW50cnkgaW4gYSBDT0ZGIGZpbGUuICAqLworCitzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhCit7CisgIC8qIEFkZHJlc3Mgb2YgcmVzb3VyY2UgZGF0YS4gIFRoaXMgaXMgYXBwYXJlbnRseSBhIGZpbGUgcmVsYXRpdmUKKyAgICAgYWRkcmVzcywgcmF0aGVyIHRoYW4gYSBzZWN0aW9uIG9mZnNldC4gICovCisgIGJmZF9ieXRlIHJ2YVs0XTsKKyAgLyogU2l6ZSBvZiByZXNvdXJjZSBkYXRhLiAgKi8KKyAgYmZkX2J5dGUgc2l6ZVs0XTsKKyAgLyogQ29kZSBwYWdlLiAgKi8KKyAgYmZkX2J5dGUgY29kZXBhZ2VbNF07CisgIC8qIFJlc2VydmVkLiAgKi8KKyAgYmZkX2J5dGUgcmVzZXJ2ZWRbNF07Cit9OworCisvKiBNYWNyb3MgdG8gc3dhcCBpbiB2YWx1ZXMuICAqLworCisjZGVmaW5lIGdldGZpXzE2KGZpLCBzKSAoKGZpKS0+YmlnX2VuZGlhbiA/IGJmZF9nZXRiMTYgKHMpIDogYmZkX2dldGwxNiAocykpCisjZGVmaW5lIGdldGZpXzMyKGZpLCBzKSAoKGZpKS0+YmlnX2VuZGlhbiA/IGJmZF9nZXRiMzIgKHMpIDogYmZkX2dldGwzMiAocykpCisKKy8qIExvY2FsIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkIG92ZXJydW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX2NvZmZfcmVzX2RpcgorICBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqLCBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOworc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlYWRfY29mZl9kYXRhX2VudHJ5CisgIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqLAorCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOworDAorLyogUmVhZCB0aGUgcmVzb3VyY2VzIGluIGEgQ09GRiBmaWxlLiAgKi8KKworc3RydWN0IHJlc19kaXJlY3RvcnkgKgorcmVhZF9jb2ZmX3JzcmMgKGZpbGVuYW1lLCB0YXJnZXQpCisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Cit7CisgIGJmZCAqYWJmZDsKKyAgY2hhciAqKm1hdGNoaW5nOworICBhc2VjdGlvbiAqc2VjOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIGJmZF9ieXRlICpkYXRhOworICBzdHJ1Y3QgY29mZl9maWxlX2luZm8gZmluZm87CisKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgZmF0YWwgKF8oImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIGlucHV0IikpOworCisgIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOworICBpZiAoYWJmZCA9PSBOVUxMKQorICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOworCisgIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKKyAgICB7CisgICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisJbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7CisgICAgICB4ZXhpdCAoMSk7CisgICAgfQorCisgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJzcmMiKTsKKyAgaWYgKHNlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBubyByZXNvdXJjZSBzZWN0aW9uXG4iKSwgcHJvZ3JhbV9uYW1lLAorCSAgICAgICBmaWxlbmFtZSk7CisgICAgICB4ZXhpdCAoMSk7CisgICAgfQorCisgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpOworICBkYXRhID0gKGJmZF9ieXRlICopIHJlc19hbGxvYyAoc2l6ZSk7CisKKyAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIDAsIHNpemUpKQorICAgIGJmZF9mYXRhbCAoXygiY2FuJ3QgcmVhZCByZXNvdXJjZSBzZWN0aW9uIikpOworCisgIGZpbmZvLmZpbGVuYW1lID0gZmlsZW5hbWU7CisgIGZpbmZvLmRhdGEgPSBkYXRhOworICBmaW5mby5kYXRhX2VuZCA9IGRhdGEgKyBzaXplOworICBmaW5mby5zZWNhZGRyID0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykKKwkJICAgLSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSk7CisgIGZpbmZvLmJpZ19lbmRpYW4gPSBiZmRfYmlnX2VuZGlhbiAoYWJmZCk7CisKKyAgYmZkX2Nsb3NlIChhYmZkKTsKKworICAvKiBOb3cganVzdCByZWFkIGluIHRoZSB0b3AgbGV2ZWwgcmVzb3VyY2UgZGlyZWN0b3J5LiAgTm90ZSB0aGF0IHdlCisgICAgIGRvbid0IGZyZWUgZGF0YSwgc2luY2Ugd2UgY3JlYXRlIHJlc291cmNlIGVudHJpZXMgdGhhdCBwb2ludCBpbnRvCisgICAgIGl0LiAgSWYgd2UgZXZlciB3YW50IHRvIGZyZWUgdXAgdGhlIHJlc291cmNlIGluZm9ybWF0aW9uIHdlIHJlYWQsCisgICAgIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGNsZWFuZWQgdXAuICAqLworCisgIHJldHVybiByZWFkX2NvZmZfcmVzX2RpciAoZGF0YSwgJmZpbmZvLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAwKTsKK30KKworLyogR2l2ZSBhbiBlcnJvciBpZiB3ZSBhcmUgb3V0IG9mIGJvdW5kcy4gICovCisKK3N0YXRpYyB2b2lkCitvdmVycnVuIChmaW5mbywgbXNnKQorICAgICBjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKmZpbmZvOworICAgICBjb25zdCBjaGFyICptc2c7Cit7CisgIGZhdGFsIChfKCIlczogJXM6IGFkZHJlc3Mgb3V0IG9mIGJvdW5kcyIpLCBmaW5mby0+ZmlsZW5hbWUsIG1zZyk7Cit9CisKKy8qIFJlYWQgYSByZXNvdXJjZSBkaXJlY3RvcnkuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKgorcmVhZF9jb2ZmX3Jlc19kaXIgKGRhdGEsIGZpbmZvLCB0eXBlLCBsZXZlbCkKKyAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7CisgICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7CisgICAgIGludCBsZXZlbDsKK3sKKyAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICplcmQ7CisgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZDsKKyAgaW50IG5hbWVfY291bnQsIGlkX2NvdW50LCBpOworICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7CisgIGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICplcmU7CisKKyAgaWYgKChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBkYXRhKSA8IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5KSkKKyAgICBvdmVycnVuIChmaW5mbywgXygiZGlyZWN0b3J5IikpOworCisgIGVyZCA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKikgZGF0YTsKKworICByZCA9IChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmQpOworICByZC0+Y2hhcmFjdGVyaXN0aWNzID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPmNoYXJhY3RlcmlzdGljcyk7CisgIHJkLT50aW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnRpbWUpOworICByZC0+bWFqb3IgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+bWFqb3IpOworICByZC0+bWlub3IgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+bWlub3IpOworICByZC0+ZW50cmllcyA9IE5VTEw7CisKKyAgbmFtZV9jb3VudCA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5uYW1lX2NvdW50KTsKKyAgaWRfY291bnQgPSBnZXRmaV8xNiAoZmluZm8sIGVyZC0+aWRfY291bnQpOworCisgIHBwID0gJnJkLT5lbnRyaWVzOworCisgIC8qIFRoZSByZXNvdXJjZSBkaXJlY3RvcnkgZW50cmllcyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGRpcmVjdG9yeQorICAgICB0YWJsZS4gICovCisgIGVyZSA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqKSAoZXJkICsgMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5hbWVfY291bnQ7IGkrKywgZXJlKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBydmE7CisgICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKKyAgICAgIGNvbnN0IGJmZF9ieXRlICplcnM7CisgICAgICBpbnQgbGVuZ3RoLCBqOworCisgICAgICBpZiAoKGNvbnN0IGJmZF9ieXRlICopIGVyZSA+PSBmaW5mby0+ZGF0YV9lbmQpCisJb3ZlcnJ1biAoZmluZm8sIF8oIm5hbWVkIGRpcmVjdG9yeSBlbnRyeSIpKTsKKworICAgICAgbmFtZSA9IGdldGZpXzMyIChmaW5mbywgZXJlLT5uYW1lKTsKKyAgICAgIHJ2YSA9IGdldGZpXzMyIChmaW5mbywgZXJlLT5ydmEpOworCisgICAgICAvKiBGb3Igc29tZSByZWFzb24gdGhlIGhpZ2ggYml0IGluIE5BTUUgaXMgc2V0LiAgKi8KKyAgICAgIG5hbWUgJj1+IDB4ODAwMDAwMDA7CisKKyAgICAgIGlmIChuYW1lID4gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKKwlvdmVycnVuIChmaW5mbywgXygiZGlyZWN0b3J5IGVudHJ5IG5hbWUiKSk7CisKKyAgICAgIGVycyA9IGZpbmZvLT5kYXRhICsgbmFtZTsKKworICAgICAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOworICAgICAgcmUtPm5leHQgPSBOVUxMOworICAgICAgcmUtPmlkLm5hbWVkID0gMTsKKyAgICAgIGxlbmd0aCA9IGdldGZpXzE2IChmaW5mbywgZXJzKTsKKyAgICAgIHJlLT5pZC51Lm4ubGVuZ3RoID0gbGVuZ3RoOworICAgICAgcmUtPmlkLnUubi5uYW1lID0gKHVuaWNoYXIgKikgcmVzX2FsbG9jIChsZW5ndGggKiBzaXplb2YgKHVuaWNoYXIpKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKKwlyZS0+aWQudS5uLm5hbWVbal0gPSBnZXRmaV8xNiAoZmluZm8sIGVycyArIGogKiAyICsgMik7CisKKyAgICAgIGlmIChsZXZlbCA9PSAwKQorCXR5cGUgPSAmcmUtPmlkOworCisgICAgICBpZiAoKHJ2YSAmIDB4ODAwMDAwMDApICE9IDApCisJeworCSAgcnZhICY9fiAweDgwMDAwMDAwOworCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQorCSAgICBvdmVycnVuIChmaW5mbywgXygibmFtZWQgc3ViZGlyZWN0b3J5IikpOworCSAgcmUtPnN1YmRpciA9IDE7CisJICByZS0+dS5kaXIgPSByZWFkX2NvZmZfcmVzX2RpciAoZmluZm8tPmRhdGEgKyBydmEsIGZpbmZvLCB0eXBlLAorCQkJCQkgbGV2ZWwgKyAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQorCSAgICBvdmVycnVuIChmaW5mbywgXygibmFtZWQgcmVzb3VyY2UiKSk7CisJICByZS0+c3ViZGlyID0gMDsKKwkgIHJlLT51LnJlcyA9IHJlYWRfY29mZl9kYXRhX2VudHJ5IChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUpOworCX0KKworICAgICAgKnBwID0gcmU7CisgICAgICBwcCA9ICZyZS0+bmV4dDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGlkX2NvdW50OyBpKyssIGVyZSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZSwgcnZhOworICAgICAgc3RydWN0IHJlc19lbnRyeSAqcmU7CisKKyAgICAgIGlmICgoY29uc3QgYmZkX2J5dGUgKikgZXJlID49IGZpbmZvLT5kYXRhX2VuZCkKKwlvdmVycnVuIChmaW5mbywgXygiSUQgZGlyZWN0b3J5IGVudHJ5IikpOworCisgICAgICBuYW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPm5hbWUpOworICAgICAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPnJ2YSk7CisKKyAgICAgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKKyAgICAgIHJlLT5uZXh0ID0gTlVMTDsKKyAgICAgIHJlLT5pZC5uYW1lZCA9IDA7CisgICAgICByZS0+aWQudS5pZCA9IG5hbWU7CisKKyAgICAgIGlmIChsZXZlbCA9PSAwKQorCXR5cGUgPSAmcmUtPmlkOworCisgICAgICBpZiAoKHJ2YSAmIDB4ODAwMDAwMDApICE9IDApCisJeworCSAgcnZhICY9fiAweDgwMDAwMDAwOworCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQorCSAgICBvdmVycnVuIChmaW5mbywgXygiSUQgc3ViZGlyZWN0b3J5IikpOworCSAgcmUtPnN1YmRpciA9IDE7CisJICByZS0+dS5kaXIgPSByZWFkX2NvZmZfcmVzX2RpciAoZmluZm8tPmRhdGEgKyBydmEsIGZpbmZvLCB0eXBlLAorCQkJCQkgbGV2ZWwgKyAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHJ2YSA+PSAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQorCSAgICBvdmVycnVuIChmaW5mbywgXygiSUQgcmVzb3VyY2UiKSk7CisJICByZS0+c3ViZGlyID0gMDsKKwkgIHJlLT51LnJlcyA9IHJlYWRfY29mZl9kYXRhX2VudHJ5IChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUpOworCX0KKworICAgICAgKnBwID0gcmU7CisgICAgICBwcCA9ICZyZS0+bmV4dDsKKyAgICB9CisKKyAgcmV0dXJuIHJkOworfQorCisvKiBSZWFkIGEgcmVzb3VyY2UgZGF0YSBlbnRyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICoKK3JlYWRfY29mZl9kYXRhX2VudHJ5IChkYXRhLCBmaW5mbywgdHlwZSkKKyAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7CisgICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Cit7CisgIGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKmVyZDsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKyAgdW5zaWduZWQgbG9uZyBzaXplLCBydmE7CisgIGNvbnN0IGJmZF9ieXRlICpyZXNkYXRhOworCisgIGlmICh0eXBlID09IE5VTEwpCisgICAgZmF0YWwgKF8oInJlc291cmNlIHR5cGUgdW5rbm93biIpKTsKKworICBpZiAoKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGRhdGEpIDwgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhKSkKKyAgICBvdmVycnVuIChmaW5mbywgXygiZGF0YSBlbnRyeSIpKTsKKworICBlcmQgPSAoY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqKSBkYXRhOworCisgIHNpemUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+c2l6ZSk7CisgIHJ2YSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5ydmEpOworICBpZiAocnZhIDwgZmluZm8tPnNlY2FkZHIKKyAgICAgIHx8IHJ2YSAtIGZpbmZvLT5zZWNhZGRyID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCisgICAgb3ZlcnJ1biAoZmluZm8sIF8oInJlc291cmNlIGRhdGEiKSk7CisKKyAgcmVzZGF0YSA9IGZpbmZvLT5kYXRhICsgKHJ2YSAtIGZpbmZvLT5zZWNhZGRyKTsKKworICBpZiAoc2l6ZSA+IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSByZXNkYXRhKSkKKyAgICBvdmVycnVuIChmaW5mbywgXygicmVzb3VyY2UgZGF0YSBzaXplIikpOworCisgIHIgPSBiaW5fdG9fcmVzICgqdHlwZSwgcmVzZGF0YSwgc2l6ZSwgZmluZm8tPmJpZ19lbmRpYW4pOworCisgIG1lbXNldCAoJnItPnJlc19pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKKyAgci0+Y29mZl9pbmZvLmNvZGVwYWdlID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPmNvZGVwYWdlKTsKKyAgci0+Y29mZl9pbmZvLnJlc2VydmVkID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnJlc2VydmVkKTsKKworICByZXR1cm4gcjsKK30KKwwKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYnVpbGQgYSBsaXN0IG9mIGJpbmRhdGEgc3RydWN0dXJlcy4gICovCisKK3N0cnVjdCBiaW5kYXRhX2J1aWxkCit7CisgIC8qIFRoZSBkYXRhLiAgKi8KKyAgc3RydWN0IGJpbmRhdGEgKmQ7CisgIC8qIFRoZSBsYXN0IHN0cnVjdHVyZSB3ZSBoYXZlIGFkZGVkIHRvIHRoZSBsaXN0LiAgKi8KKyAgc3RydWN0IGJpbmRhdGEgKmxhc3Q7CisgIC8qIFRoZSBzaXplIG9mIHRoZSBsaXN0IGFzIGEgd2hvbGUuICAqLworICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIGluZm9ybWF0aW9uIGFzIHdlIGJ1aWxkIHRoZSBkaXJlY3RvcnkKKyAgIHRyZWUuICAqLworCitzdHJ1Y3QgY29mZl93cml0ZV9pbmZvCit7CisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgYmFzZWQgb24gdGhlIEJGRC4gICovCisgIC8qIFRoZSBCRkQgaXRzZWxmLiAgKi8KKyAgYmZkICphYmZkOworICAvKiBOb24temVybyBpZiB0aGUgZmlsZSBpcyBiaWcgZW5kaWFuLiAgKi8KKyAgaW50IGJpZ19lbmRpYW47CisgIC8qIFBvaW50ZXIgdG8gc2VjdGlvbiBzeW1ib2wgdXNlZCB0byBidWlsZCBSVkEgcmVsb2NzLiAgKi8KKyAgYXN5bWJvbCAqKnN5bXBwOworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgaW5pdGlhbGx5LCBhbmQgdGhlbiBub3QgY2hhbmdlZC4gICovCisgIC8qIExlbmd0aCBvZiBkaXJlY3RvcnkgdGFibGVzIGFuZCBlbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBkaXJzaXplOworICAvKiBMZW5ndGggb2YgZGlyZWN0b3J5IGVudHJ5IHN0cmluZ3MuICAqLworICB1bnNpZ25lZCBsb25nIGRpcnN0cnNpemU7CisgIC8qIExlbmd0aCBvZiByZXNvdXJjZSBkYXRhIGVudHJpZXMuICAqLworICB1bnNpZ25lZCBsb25nIGRhdGFlbnRzaXplOworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgdXBkYXRlZCBhcyB3ZSBhZGQgZGF0YS4gICovCisgIC8qIERpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMuICAqLworICBzdHJ1Y3QgYmluZGF0YV9idWlsZCBkaXJzOworICAvKiBEaXJlY3RvcnkgZW50cnkgc3RyaW5ncy4gICovCisgIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRpcnN0cnM7CisgIC8qIFJlc291cmNlIGRhdGEgZW50cmllcy4gICovCisgIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRhdGFlbnRzOworICAvKiBBY3R1YWwgcmVzb3VyY2UgZGF0YS4gICovCisgIHN0cnVjdCBiaW5kYXRhX2J1aWxkIHJlc291cmNlczsKKyAgLyogUmVsb2NhdGlvbnMuICAqLworICBhcmVsZW50ICoqcmVsb2NzOworICAvKiBOdW1iZXIgb2YgcmVsb2NhdGlvbnMuICAqLworICB1bnNpZ25lZCBpbnQgcmVsb2NfY291bnQ7Cit9OworCisvKiBNYWNyb3MgdG8gc3dhcCBvdXQgdmFsdWVzLiAgKi8KKworI2RlZmluZSBwdXRjd2lfMTYoY3dpLCB2LCBzKSBcCisgICgoY3dpLT5iaWdfZW5kaWFuKSA/IGJmZF9wdXRiMTYgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMTYgKCh2KSwgKHMpKSkKKyNkZWZpbmUgcHV0Y3dpXzMyKGN3aSwgdiwgcykgXAorICAoKGN3aS0+YmlnX2VuZGlhbikgPyBiZmRfcHV0YjMyICgodiksIChzKSkgOiBiZmRfcHV0bDMyICgodiksIChzKSkpCisKK3N0YXRpYyB2b2lkIGNvZmZfYmluX3NpemVzCisgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNvZmZfYWxsb2MgUEFSQU1TICgoc3RydWN0IGJpbmRhdGFfYnVpbGQgKiwgc2l6ZV90KSk7CitzdGF0aWMgdm9pZCBjb2ZmX3RvX2JpbgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLCBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICopKTsKK3N0YXRpYyB2b2lkIGNvZmZfcmVzX3RvX2JpbgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOworCisvKiBXcml0ZSByZXNvdXJjZXMgdG8gYSBDT0ZGIGZpbGUuICBSRVNPVVJDRVMgc2hvdWxkIGFscmVhZHkgYmUKKyAgIHNvcnRlZC4KKworICAgUmlnaHQgbm93IHdlIGFsd2F5cyBjcmVhdGUgYSBuZXcgZmlsZS4gIFNvbWVkYXkgd2Ugc2hvdWxkIGFsc28KKyAgIG9mZmVyIHRoZSBhYmlsaXR5IHRvIG1lcmdlIHJlc291cmNlcyBpbnRvIGFuIGV4aXN0aW5nIGZpbGUuICBUaGlzCisgICB3b3VsZCByZXF1aXJlIGRvaW5nIHRoZSBiYXNpYyB3b3JrIG9mIG9iamNvcHksIGp1c3QgbW9kaWZ5aW5nIG9yCisgICBhZGRpbmcgdGhlIC5yc3JjIHNlY3Rpb24uICAqLworCit2b2lkCit3cml0ZV9jb2ZmX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQsIHJlc291cmNlcykKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlczsKK3sKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqc2VjOworICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvIGN3aTsKKyAgc3RydWN0IGJpbmRhdGEgKmQ7CisgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBvZmZzZXQ7CisKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwpCisgICAgZmF0YWwgKF8oImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIG91dHB1dCIpKTsKKworICBhYmZkID0gYmZkX29wZW53IChmaWxlbmFtZSwgdGFyZ2V0KTsKKyAgaWYgKGFiZmQgPT0gTlVMTCkKKyAgICBiZmRfZmF0YWwgKGZpbGVuYW1lKTsKKworICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCisgICAgYmZkX2ZhdGFsICgiYmZkX3NldF9mb3JtYXQiKTsKKworICAvKiBGSVhNRTogVGhpcyBpcyBvYnZpb3VzbHkgaTM4NiBzcGVjaWZpYy4gICovCisgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKSkKKyAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2FyY2hfbWFjaCIpOworCisgIGlmICghIGJmZF9zZXRfZmlsZV9mbGFncyAoYWJmZCwgSEFTX1NZTVMgfCBIQVNfUkVMT0MpKQorICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfZmlsZV9mbGFncyIpOworCisgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnNyYyIpOworICBpZiAoc2VjID09IE5VTEwpCisgICAgYmZkX2ZhdGFsICgiYmZkX21ha2Vfc2VjdGlvbiIpOworCisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLAorCQkJICAgICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DCisJCQkJfCBTRUNfTE9BRCB8IFNFQ19EQVRBKSkpCisgICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2ZsYWdzIik7CisKKyAgaWYgKCEgYmZkX3NldF9zeW10YWIgKGFiZmQsIHNlYy0+c3ltYm9sX3B0cl9wdHIsIDEpKQorICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc3ltdGFiIik7CisKKyAgLyogUmVxdWlyaW5nIHRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gQkZELiAgKi8KKyAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKKworICAvKiBUaGUgb3JkZXIgb2YgZGF0YSBpbiB0aGUgLnJzcmMgc2VjdGlvbiBpcworICAgICAgIHJlc291cmNlIGRpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMKKyAgICAgICByZXNvdXJjZSBkaXJlY3Rvcnkgc3RyaW5ncworICAgICAgIHJlc291cmNlIGRhdGEgZW50cmllcworICAgICAgIGFjdHVhbCByZXNvdXJjZSBkYXRhCisKKyAgICAgV2UgYnVpbGQgdGhlc2UgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgaW4gZGlmZmVyZW50IGxpc3RzLiAgKi8KKworICBjd2kuYWJmZCA9IGFiZmQ7CisgIGN3aS5iaWdfZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOworICBjd2kuc3ltcHAgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOworICBjd2kuZGlyc2l6ZSA9IDA7CisgIGN3aS5kaXJzdHJzaXplID0gMDsKKyAgY3dpLmRhdGFlbnRzaXplID0gMDsKKyAgY3dpLmRpcnMuZCA9IE5VTEw7CisgIGN3aS5kaXJzLmxhc3QgPSBOVUxMOworICBjd2kuZGlycy5sZW5ndGggPSAwOworICBjd2kuZGlyc3Rycy5kID0gTlVMTDsKKyAgY3dpLmRpcnN0cnMubGFzdCA9IE5VTEw7CisgIGN3aS5kaXJzdHJzLmxlbmd0aCA9IDA7CisgIGN3aS5kYXRhZW50cy5kID0gTlVMTDsKKyAgY3dpLmRhdGFlbnRzLmxhc3QgPSBOVUxMOworICBjd2kuZGF0YWVudHMubGVuZ3RoID0gMDsKKyAgY3dpLnJlc291cmNlcy5kID0gTlVMTDsKKyAgY3dpLnJlc291cmNlcy5sYXN0ID0gTlVMTDsKKyAgY3dpLnJlc291cmNlcy5sZW5ndGggPSAwOworICBjd2kucmVsb2NzID0gTlVMTDsKKyAgY3dpLnJlbG9jX2NvdW50ID0gMDsKKworICAvKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyaWVzLCBzbyB0aGF0IHdlCisgICAgIGtub3cgdGhlIHZhcmlvdXMgb2Zmc2V0cyB3ZSB3aWxsIG5lZWQuICAqLworICBjb2ZmX2Jpbl9zaXplcyAocmVzb3VyY2VzLCAmY3dpKTsKKworICAvKiBGb3JjZSB0aGUgZGlyZWN0b3J5IHN0cmluZ3MgdG8gYmUgMzIgYml0IGFsaWduZWQuICBFdmVyeSBvdGhlcgorICAgICBzdHJ1Y3R1cmUgaXMgMzIgYml0IGFsaWduZWQgYW55aG93LiAgKi8KKyAgY3dpLmRpcnN0cnNpemUgPSAoY3dpLmRpcnN0cnNpemUgKyAzKSAmfiAzOworCisgIC8qIEFjdHVhbGx5IGNvbnZlcnQgdGhlIHJlc291cmNlcyB0byBiaW5hcnkuICAqLworICBjb2ZmX3RvX2JpbiAocmVzb3VyY2VzLCAmY3dpKTsKKworICAvKiBBZGQgYW5vdGhlciAyIGJ5dGVzIHRvIHRoZSBkaXJlY3Rvcnkgc3RyaW5ncyBpZiBuZWVkZWQgZm9yCisgICAgIGFsaWdubWVudC4gICovCisgIGlmICgoY3dpLmRpcnN0cnMubGVuZ3RoICYgMykgIT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpleDsKKworICAgICAgZXggPSBjb2ZmX2FsbG9jICgmY3dpLmRpcnN0cnMsIDIpOworICAgICAgZXhbMF0gPSAwOworICAgICAgZXhbMV0gPSAwOworICAgIH0KKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGF0YSB3ZSBidWlsdCBjYW1lIG91dCB0byB0aGUgc2FtZSBzaXplIGFzIHdlCisgICAgIGNhbGN1bGF0ZWQgaW5pdGlhbGx5LiAgKi8KKyAgYXNzZXJ0IChjd2kuZGlycy5sZW5ndGggPT0gY3dpLmRpcnNpemUpOworICBhc3NlcnQgKGN3aS5kaXJzdHJzLmxlbmd0aCA9PSBjd2kuZGlyc3Ryc2l6ZSk7CisgIGFzc2VydCAoY3dpLmRhdGFlbnRzLmxlbmd0aCA9PSBjd2kuZGF0YWVudHNpemUpOworCisgIGxlbmd0aCA9IChjd2kuZGlyc2l6ZQorCSAgICArIGN3aS5kaXJzdHJzaXplCisJICAgICsgY3dpLmRhdGFlbnRzaXplCisJICAgICsgY3dpLnJlc291cmNlcy5sZW5ndGgpOworCisgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIGxlbmd0aCkpCisgICAgYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX3NpemUiKTsKKworICBiZmRfc2V0X3JlbG9jIChhYmZkLCBzZWMsIGN3aS5yZWxvY3MsIGN3aS5yZWxvY19jb3VudCk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgZm9yIChkID0gY3dpLmRpcnMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQorCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOworICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKKyAgICB9CisgIGZvciAoZCA9IGN3aS5kaXJzdHJzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCisgICAgeworICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKKwliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKKyAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7CisgICAgfQorICBmb3IgKGQgPSBjd2kuZGF0YWVudHMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQorCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOworICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKKyAgICB9CisgIGZvciAoZCA9IGN3aS5yZXNvdXJjZXMuZDsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZC0+ZGF0YSwgb2Zmc2V0LCBkLT5sZW5ndGgpKQorCWJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyIpOworICAgICAgb2Zmc2V0ICs9IGQtPmxlbmd0aDsKKyAgICB9CisKKyAgYXNzZXJ0IChvZmZzZXQgPT0gbGVuZ3RoKTsKKworICBpZiAoISBiZmRfY2xvc2UgKGFiZmQpKQorICAgIGJmZF9mYXRhbCAoImJmZF9jbG9zZSIpOworCisgIC8qIFdlIGFsbG9jYXRlZCB0aGUgcmVsb2NzIGFycmF5IHVzaW5nIG1hbGxvYy4gICovCisgIGZyZWUgKGN3aS5yZWxvY3MpOworfQorCisvKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZml4ZWQgc2l6ZSByZXNvdXJjZSBkaXJlY3RvcnkKKyAgIGVudHJpZXMuICBUaGlzIHVwZGF0ZXMgZmllbGRzIGluIENXSS4gICovCisKK3N0YXRpYyB2b2lkCitjb2ZmX2Jpbl9zaXplcyAocmVzZGlyLCBjd2kpCisgICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7CisgICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKK3sKKyAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7CisKKyAgY3dpLT5kaXJzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5KTsKKworICBmb3IgKHJlID0gcmVzZGlyLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQorICAgIHsKKyAgICAgIGN3aS0+ZGlyc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5KTsKKworICAgICAgaWYgKHJlLT5pZC5uYW1lZCkKKwljd2ktPmRpcnN0cnNpemUgKz0gcmUtPmlkLnUubi5sZW5ndGggKiAyICsgMjsKKworICAgICAgaWYgKHJlLT5zdWJkaXIpCisJY29mZl9iaW5fc2l6ZXMgKHJlLT51LmRpciwgY3dpKTsKKyAgICAgIGVsc2UKKwljd2ktPmRhdGFlbnRzaXplICs9IHNpemVvZiAoc3RydWN0IGV4dGVybl9yZXNfZGF0YSk7CisgICAgfQorfQorCisvKiBBbGxvY2F0ZSBkYXRhIGZvciBhIHBhcnRpY3VsYXIgbGlzdC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK2NvZmZfYWxsb2MgKGJiLCBzaXplKQorICAgICBzdHJ1Y3QgYmluZGF0YV9idWlsZCAqYmI7CisgICAgIHNpemVfdCBzaXplOworeworICBzdHJ1Y3QgYmluZGF0YSAqZDsKKworICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOworCisgIGQtPm5leHQgPSBOVUxMOworICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKHNpemUpOworICBkLT5sZW5ndGggPSBzaXplOworCisgIGlmIChiYi0+ZCA9PSBOVUxMKQorICAgIGJiLT5kID0gZDsKKyAgZWxzZQorICAgIGJiLT5sYXN0LT5uZXh0ID0gZDsKKyAgYmItPmxhc3QgPSBkOworICBiYi0+bGVuZ3RoICs9IHNpemU7CisKKyAgcmV0dXJuIGQtPmRhdGE7Cit9CisKKy8qIENvbnZlcnQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBSRVNESVIgdG8gYmluYXJ5LiAgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfdG9fYmluIChyZXNkaXIsIGN3aSkKKyAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKKyAgICAgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqY3dpOworeworICBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKmVyZDsKKyAgaW50IGNpLCBjbjsKKyAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqZTsKKyAgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKmVyZTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGRpcmVjdG9yeSB0YWJsZS4gICovCisKKyAgZXJkID0gKChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKikKKwkgY29mZl9hbGxvYyAoJmN3aS0+ZGlycywgc2l6ZW9mICgqZXJkKSkpOworCisgIHB1dGN3aV8zMiAoY3dpLCByZXNkaXItPmNoYXJhY3RlcmlzdGljcywgZXJkLT5jaGFyYWN0ZXJpc3RpY3MpOworICBwdXRjd2lfMzIgKGN3aSwgcmVzZGlyLT50aW1lLCBlcmQtPnRpbWUpOworICBwdXRjd2lfMTYgKGN3aSwgcmVzZGlyLT5tYWpvciwgZXJkLT5tYWpvcik7CisgIHB1dGN3aV8xNiAoY3dpLCByZXNkaXItPm1pbm9yLCBlcmQtPm1pbm9yKTsKKworICBjaSA9IDA7CisgIGNuID0gMDsKKyAgZm9yIChlID0gcmVzZGlyLT5lbnRyaWVzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChlLT5pZC5uYW1lZCkKKwkrK2NuOworICAgICAgZWxzZQorCSsrY2k7CisgICAgfQorCisgIHB1dGN3aV8xNiAoY3dpLCBjbiwgZXJkLT5uYW1lX2NvdW50KTsKKyAgcHV0Y3dpXzE2IChjd2ksIGNpLCBlcmQtPmlkX2NvdW50KTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGRhdGEgZW50cmllcy4gIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBzcGFjZSBmb3IgYWxsCisgICAgIHRoZSBlbnRyaWVzIGJlZm9yZSB3cml0aW5nIHRoZW0gb3V0LiAgVGhhdCBwZXJtaXRzIGEgcmVjdXJzaXZlCisgICAgIGNhbGwgdG8gd29yayBjb3JyZWN0bHkgd2hlbiB3cml0aW5nIG91dCBzdWJkaXJlY3Rvcmllcy4gICovCisKKyAgZXJlID0gKChzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSAqKQorCSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzLCAoY2kgKyBjbikgKiBzaXplb2YgKCplcmUpKSk7CisgIGZvciAoZSA9IHJlc2Rpci0+ZW50cmllczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCwgZXJlKyspCisgICAgeworICAgICAgaWYgKCEgZS0+aWQubmFtZWQpCisJcHV0Y3dpXzMyIChjd2ksIGUtPmlkLnUuaWQsIGVyZS0+bmFtZSk7CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgY2hhciAqc3RyOworCSAgaW50IGk7CisKKwkgIC8qIEZvciBzb21lIHJlYXNvbiBleGlzdGluZyBmaWxlcyBzZWVtIHRvIGhhdmUgdGhlIGhpZ2ggYml0CisgICAgICAgICAgICAgc2V0IG9uIHRoZSBhZGRyZXNzIG9mIHRoZSBuYW1lLCBhbHRob3VnaCB0aGF0IGlzIG5vdAorICAgICAgICAgICAgIGRvY3VtZW50ZWQuICAqLworCSAgcHV0Y3dpXzMyIChjd2ksCisJCSAgICAgMHg4MDAwMDAwMCB8IChjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnMubGVuZ3RoKSwKKwkJICAgICBlcmUtPm5hbWUpOworCisJICBzdHIgPSBjb2ZmX2FsbG9jICgmY3dpLT5kaXJzdHJzLCBlLT5pZC51Lm4ubGVuZ3RoICogMiArIDIpOworCSAgcHV0Y3dpXzE2IChjd2ksIGUtPmlkLnUubi5sZW5ndGgsIHN0cik7CisJICBmb3IgKGkgPSAwOyBpIDwgZS0+aWQudS5uLmxlbmd0aDsgaSsrKQorCSAgICBwdXRjd2lfMTYgKGN3aSwgZS0+aWQudS5uLm5hbWVbaV0sIHN0ciArIGkgKiAyICsgMik7CisJfQorCisgICAgICBpZiAoZS0+c3ViZGlyKQorCXsKKwkgIHB1dGN3aV8zMiAoY3dpLCAweDgwMDAwMDAwIHwgY3dpLT5kaXJzLmxlbmd0aCwgZXJlLT5ydmEpOworCSAgY29mZl90b19iaW4gKGUtPnUuZGlyLCBjd2kpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwdXRjd2lfMzIgKGN3aSwKKwkJICAgICBjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnNpemUgKyBjd2ktPmRhdGFlbnRzLmxlbmd0aCwKKwkJICAgICBlcmUtPnJ2YSk7CisKKwkgIGNvZmZfcmVzX3RvX2JpbiAoZS0+dS5yZXMsIGN3aSk7CisJfQorICAgIH0KK30KKworLyogQ29udmVydCB0aGUgcmVzb3VyY2UgUkVTIHRvIGJpbmFyeS4gICovCisKK3N0YXRpYyB2b2lkCitjb2ZmX3Jlc190b19iaW4gKHJlcywgY3dpKQorICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7CisgICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKK3sKKyAgYXJlbGVudCAqcjsKKyAgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqZXJkOworICBzdHJ1Y3QgYmluZGF0YSAqZDsKKyAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisKKyAgLyogRm9yIHNvbWUgcmVhc29uLCBhbHRob3VnaCBldmVyeSBvdGhlciBhZGRyZXNzIGlzIGEgc2VjdGlvbgorICAgICBvZmZzZXQsIHRoZSBhZGRyZXNzIG9mIHRoZSByZXNvdXJjZSBkYXRhIGl0c2VsZiBpcyBhbiBSVkEuICBUaGF0CisgICAgIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlbG9jYXRpb24gZm9yIGl0LiAgV2UgYWxsb2NhdGUKKyAgICAgdGhlIHJlbG9jcyBhcnJheSB1c2luZyBtYWxsb2Mgc28gdGhhdCB3ZSBjYW4gdXNlIHJlYWxsb2MuICBGSVhNRToKKyAgICAgVGhpcyByZWxvY2F0aW9uIGhhbmRsaW5nIGlzIGNvcnJlY3QgZm9yIHRoZSBpMzg2LCBidXQgcHJvYmFibHkKKyAgICAgbm90IGZvciBhbnkgb3RoZXIgdGFyZ2V0LiAgKi8KKworICByID0gKGFyZWxlbnQgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworICByLT5zeW1fcHRyX3B0ciA9IGN3aS0+c3ltcHA7CisgIHItPmFkZHJlc3MgPSBjd2ktPmRpcnNpemUgKyBjd2ktPmRpcnN0cnNpemUgKyBjd2ktPmRhdGFlbnRzLmxlbmd0aDsKKyAgci0+YWRkZW5kID0gMDsKKyAgci0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGN3aS0+YWJmZCwgQkZEX1JFTE9DX1JWQSk7CisgIGlmIChyLT5ob3d0byA9PSBOVUxMKQorICAgIGJmZF9mYXRhbCAoXygiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIikpOworCisgIGN3aS0+cmVsb2NzID0geHJlYWxsb2MgKGN3aS0+cmVsb2NzLAorCQkJICAoY3dpLT5yZWxvY19jb3VudCArIDIpICogc2l6ZW9mIChhcmVsZW50ICopKTsKKyAgY3dpLT5yZWxvY3NbY3dpLT5yZWxvY19jb3VudF0gPSByOworICBjd2ktPnJlbG9jc1tjd2ktPnJlbG9jX2NvdW50ICsgMV0gPSBOVUxMOworICArK2N3aS0+cmVsb2NfY291bnQ7CisKKyAgZXJkID0gKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKikgY29mZl9hbGxvYyAoJmN3aS0+ZGF0YWVudHMsIHNpemVvZiAoKmVyZCkpOworCisgIHB1dGN3aV8zMiAoY3dpLAorCSAgICAgKGN3aS0+ZGlyc2l6ZQorCSAgICAgICsgY3dpLT5kaXJzdHJzaXplCisJICAgICAgKyBjd2ktPmRhdGFlbnRzaXplCisJICAgICAgKyBjd2ktPnJlc291cmNlcy5sZW5ndGgpLAorCSAgICAgZXJkLT5ydmEpOworICBwdXRjd2lfMzIgKGN3aSwgcmVzLT5jb2ZmX2luZm8uY29kZXBhZ2UsIGVyZC0+Y29kZXBhZ2UpOworICBwdXRjd2lfMzIgKGN3aSwgcmVzLT5jb2ZmX2luZm8ucmVzZXJ2ZWQsIGVyZC0+cmVzZXJ2ZWQpOworCisgIGQgPSByZXNfdG9fYmluIChyZXMsIGN3aS0+YmlnX2VuZGlhbik7CisKKyAgaWYgKGN3aS0+cmVzb3VyY2VzLmQgPT0gTlVMTCkKKyAgICBjd2ktPnJlc291cmNlcy5kID0gZDsKKyAgZWxzZQorICAgIGN3aS0+cmVzb3VyY2VzLmxhc3QtPm5leHQgPSBkOworCisgIGxlbmd0aCA9IDA7CisgIGZvciAoOyBkLT5uZXh0ICE9IE5VTEw7IGQgPSBkLT5uZXh0KQorICAgIGxlbmd0aCArPSBkLT5sZW5ndGg7CisgIGxlbmd0aCArPSBkLT5sZW5ndGg7CisgIGN3aS0+cmVzb3VyY2VzLmxhc3QgPSBkOworICBjd2ktPnJlc291cmNlcy5sZW5ndGggKz0gbGVuZ3RoOworCisgIHB1dGN3aV8zMiAoY3dpLCBsZW5ndGgsIGVyZC0+c2l6ZSk7CisKKyAgLyogRm9yY2UgdGhlIG5leHQgcmVzb3VyY2UgdG8gaGF2ZSAzMiBiaXQgYWxpZ25tZW50LiAgKi8KKworICBpZiAoKGxlbmd0aCAmIDMpICE9IDApCisgICAgeworICAgICAgaW50IGFkZDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmV4OworCisgICAgICBhZGQgPSA0IC0gKGxlbmd0aCAmIDMpOworCisgICAgICBleCA9IGNvZmZfYWxsb2MgKCZjd2ktPnJlc291cmNlcywgYWRkKTsKKyAgICAgIG1lbXNldCAoZXgsIDAsIGFkZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmVzcmMuYyBiL2JpbnV0aWxzL3Jlc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhM2MxMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Jlc3JjLmMKQEAgLTAsMCArMSwyMjY1IEBACisvKiByZXNyYy5jIC0tIHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmMgZmlsZXMuCisgICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJjIGZpbGVzLgorICAgVGhlc2UgYXJlIHRleHQgZmlsZXMgdGhhdCByZXByZXNlbnQgcmVzb3VyY2VzLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgIndpbmRyZXMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pCisjZGVmaW5lIHBvcGVuIF9wb3BlbgorI2RlZmluZSBwY2xvc2UgX3BjbG9zZQorI2VuZGlmCisKKy8qIFRoZSBkZWZhdWx0IHByZXByb2Nlc3Nvci4gICovCisKKyNkZWZpbmUgREVGQVVMVF9QUkVQUk9DRVNTT1IgImdjYyAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRCIKKworLyogV2UgcmVhZCB0aGUgZGlyZWN0b3J5IGVudHJpZXMgaW4gYSBjdXJzb3Igb3IgaWNvbiBmaWxlIGludG8KKyAgIGluc3RhbmNlcyBvZiB0aGlzIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBpY29uZGlyCit7CisgIC8qIFdpZHRoIG9mIGltYWdlLiAgKi8KKyAgdW5zaWduZWQgY2hhciB3aWR0aDsKKyAgLyogSGVpZ2h0IG9mIGltYWdlLiAgKi8KKyAgdW5zaWduZWQgY2hhciBoZWlnaHQ7CisgIC8qIE51bWJlciBvZiBjb2xvcnMgaW4gaW1hZ2UuICAqLworICB1bnNpZ25lZCBjaGFyIGNvbG9yY291bnQ7CisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBDb2xvciBwbGFuZXMuICAqLworICAgICAgdW5zaWduZWQgc2hvcnQgcGxhbmVzOworICAgICAgLyogQml0cyBwZXIgcGl4ZWwuICAqLworICAgICAgdW5zaWduZWQgc2hvcnQgYml0czsKKyAgICB9IGljb247CisgICAgc3RydWN0CisgICAgeworICAgICAgLyogWCBjb29yZGluYXRlIG9mIGhvdHNwb3QuICAqLworICAgICAgdW5zaWduZWQgc2hvcnQgeGhvdHNwb3Q7CisgICAgICAvKiBZIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCisgICAgICB1bnNpZ25lZCBzaG9ydCB5aG90c3BvdDsKKyAgICB9IGN1cnNvcjsKKyAgfSB1OworICAvKiBCeXRlcyBpbiBpbWFnZS4gICovCisgIHVuc2lnbmVkIGxvbmcgYnl0ZXM7CisgIC8qIEZpbGUgb2Zmc2V0IG9mIGltYWdlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9OworCisvKiBUaGUgbmFtZSBvZiB0aGUgcmMgZmlsZSB3ZSBhcmUgcmVhZGluZy4gICovCisKK2NoYXIgKnJjX2ZpbGVuYW1lOworCisvKiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIHJjIGZpbGUuICAqLworCitpbnQgcmNfbGluZW5vOworCisvKiBUaGUgcGlwZSB3ZSBhcmUgcmVhZGluZyBmcm9tLCBzbyB0aGF0IHdlIGNhbiBjbG9zZSBpdCBpZiB3ZSBleGl0LiAgKi8KKworc3RhdGljIEZJTEUgKmNwcF9waXBlOworCisvKiBBcyB3ZSByZWFkIHRoZSByYyBmaWxlLCB3ZSBhdHRhY2ggaW5mb3JtYXRpb24gdG8gdGhpcyBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlczsKKworLyogVGhlIG51bWJlciBvZiBjdXJzb3IgcmVzb3VyY2VzIHdlIGhhdmUgd3JpdHRlbiBvdXQuICAqLworCitzdGF0aWMgaW50IGN1cnNvcnM7CisKKy8qIFRoZSBudW1iZXIgb2YgZm9udCByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCisKK3N0YXRpYyBpbnQgZm9udHM7CisKKy8qIEZvbnQgZGlyZWN0b3J5IGluZm9ybWF0aW9uLiAgKi8KKworc3RydWN0IGZvbnRkaXIgKmZvbnRkaXJzOworCisvKiBSZXNvdXJjZSBpbmZvIHRvIHVzZSBmb3IgZm9udGRpcnMuICAqLworCitzdHJ1Y3QgcmVzX3Jlc19pbmZvIGZvbnRkaXJzX3Jlc2luZm87CisKKy8qIFRoZSBudW1iZXIgb2YgaWNvbiByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCisKK3N0YXRpYyBpbnQgaWNvbnM7CisKKy8qIExvY2FsIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkIGNsb3NlX3BpcGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgdW5leHBlY3RlZF9lb2YgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IGdldF93b3JkIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbG9uZyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgZ2V0X2RhdGEKKyAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgZGVmaW5lX2ZvbnRkaXJzIFBBUkFNUyAoKHZvaWQpKTsKKwwKKy8qIFJlYWQgYW4gcmMgZmlsZS4gICovCisKK3N0cnVjdCByZXNfZGlyZWN0b3J5ICoKK3JlYWRfcmNfZmlsZSAoZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGxhbmd1YWdlKQorICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgY29uc3QgY2hhciAqcHJlcHJvY2Vzc29yOworICAgICBjb25zdCBjaGFyICpwcmVwcm9jYXJnczsKKyAgICAgaW50IGxhbmd1YWdlOworeworICBjaGFyICpjbWQ7CisKKyAgaWYgKHByZXByb2Nlc3NvciA9PSBOVUxMKQorICAgIHByZXByb2Nlc3NvciA9IERFRkFVTFRfUFJFUFJPQ0VTU09SOworCisgIGlmIChwcmVwcm9jYXJncyA9PSBOVUxMKQorICAgIHByZXByb2NhcmdzID0gIiI7CisgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgIGZpbGVuYW1lID0gIi0iOworCisgIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2Vzc29yKQorCQkgKyBzdHJsZW4gKHByZXByb2NhcmdzKQorCQkgKyBzdHJsZW4gKGZpbGVuYW1lKQorCQkgKyAxMCk7CisgIHNwcmludGYgKGNtZCwgIiVzICVzICVzIiwgcHJlcHJvY2Vzc29yLCBwcmVwcm9jYXJncywgZmlsZW5hbWUpOworCisgIGNwcF9waXBlID0gcG9wZW4gKGNtZCwgRk9QRU5fUlQpOworICBpZiAoY3BwX3BpcGUgPT0gTlVMTCkKKyAgICBmYXRhbCAoXygiY2FuJ3QgcG9wZW4gYCVzJzogJXMiKSwgY21kLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgZnJlZSAoY21kKTsKKworICB4YXRleGl0IChjbG9zZV9waXBlKTsKKworICByY19maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKKyAgcmNfbGluZW5vID0gMTsKKyAgaWYgKGxhbmd1YWdlICE9IC0xKQorICAgIHJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5ndWFnZSk7CisgIHl5aW4gPSBjcHBfcGlwZTsKKyAgeXlwYXJzZSAoKTsKKworICBpZiAocGNsb3NlIChjcHBfcGlwZSkgIT0gMCkKKyAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgY3BwX3BpcGUgPSBOVUxMOworCisgIGlmIChmb250ZGlycyAhPSBOVUxMKQorICAgIGRlZmluZV9mb250ZGlycyAoKTsKKworICBmcmVlIChyY19maWxlbmFtZSk7CisgIHJjX2ZpbGVuYW1lID0gTlVMTDsKKworICByZXR1cm4gcmVzb3VyY2VzOworfQorCisvKiBDbG9zZSB0aGUgcGlwZSBpZiBpdCBpcyBvcGVuLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLworCit2b2lkCitjbG9zZV9waXBlICgpCit7CisgIGlmIChjcHBfcGlwZSAhPSBOVUxMKQorICAgIHBjbG9zZSAoY3BwX3BpcGUpOworfQorCisvKiBSZXBvcnQgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyBhbiByYyBmaWxlLiAgKi8KKwordm9pZAoreXllcnJvciAobXNnKQorICAgICBjb25zdCBjaGFyICptc2c7Cit7CisgIGZhdGFsICgiJXM6JWQ6ICVzIiwgcmNfZmlsZW5hbWUsIHJjX2xpbmVubywgbXNnKTsKK30KKworLyogSXNzdWUgYSB3YXJuaW5nIHdoaWxlIHJlYWRpbmcgYW4gcmMgZmlsZS4gICovCisKK3ZvaWQKK3JjcGFyc2Vfd2FybmluZyAobXNnKQorICAgICBjb25zdCBjaGFyICptc2c7Cit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgcmNfZmlsZW5hbWUsIHJjX2xpbmVubywgbXNnKTsKK30KKworLyogRGllIGlmIHdlIGdldCBhbiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK3VuZXhwZWN0ZWRfZW9mIChtc2cpCisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgZmF0YWwgKF8oIiVzOiB1bmV4cGVjdGVkIEVPRiIpLCBtc2cpOworfQorCisvKiBSZWFkIGEgMTYgYml0IHdvcmQgZnJvbSBhIGZpbGUuICBUaGUgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGxpdHRsZQorICAgZW5kaWFuLiAgKi8KKworc3RhdGljIGludAorZ2V0X3dvcmQgKGUsIG1zZykKKyAgICAgRklMRSAqZTsKKyAgICAgY29uc3QgY2hhciAqbXNnOworeworICBpbnQgYjEsIGIyOworCisgIGIxID0gZ2V0YyAoZSk7CisgIGIyID0gZ2V0YyAoZSk7CisgIGlmIChmZW9mIChlKSkKKyAgICB1bmV4cGVjdGVkX2VvZiAobXNnKTsKKyAgcmV0dXJuICgoYjIgJiAweGZmKSA8PCA4KSB8IChiMSAmIDB4ZmYpOworfQorCisvKiBSZWFkIGEgMzIgYml0IHdvcmQgZnJvbSBhIGZpbGUuICBUaGUgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGxpdHRsZQorICAgZW5kaWFuLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9sb25nIChlLCBtc2cpCisgICAgIEZJTEUgKmU7CisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgaW50IGIxLCBiMiwgYjMsIGI0OworCisgIGIxID0gZ2V0YyAoZSk7CisgIGIyID0gZ2V0YyAoZSk7CisgIGIzID0gZ2V0YyAoZSk7CisgIGI0ID0gZ2V0YyAoZSk7CisgIGlmIChmZW9mIChlKSkKKyAgICB1bmV4cGVjdGVkX2VvZiAobXNnKTsKKyAgcmV0dXJuICgoKCgoKChiNCAmIDB4ZmYpIDw8IDgpCisJICAgICAgfCAoYjMgJiAweGZmKSkgPDwgOCkKKwkgICAgfCAoYjIgJiAweGZmKSkgPDwgOCkKKwkgIHwgKGIxICYgMHhmZikpOworfQorCisvKiBSZWFkIGRhdGEgZnJvbSBhIGZpbGUuICBUaGlzIGlzIGEgd3JhcHBlciB0byBkbyBlcnJvciBjaGVja2luZy4gICovCisKK3N0YXRpYyB2b2lkCitnZXRfZGF0YSAoZSwgcCwgYywgbXNnKQorICAgICBGSUxFICplOworICAgICB1bnNpZ25lZCBjaGFyICpwOworICAgICB1bnNpZ25lZCBsb25nIGM7CisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgdW5zaWduZWQgbG9uZyBnb3Q7CisKKyAgZ290ID0gZnJlYWQgKHAsIDEsIGMsIGUpOworICBpZiAoZ290ID09IGMpCisgICAgcmV0dXJuOworCisgIGZhdGFsIChfKCIlczogcmVhZCBvZiAlbHUgcmV0dXJuZWQgJWx1IiksIG1zZywgYywgZ290KTsKK30KKwwKKy8qIERlZmluZSBhbiBhY2NlbGVyYXRvciByZXNvdXJjZS4gICovCisKK3ZvaWQKK2RlZmluZV9hY2NlbGVyYXRvciAoaWQsIHJlc2luZm8sIGRhdGEpCisgICAgIHN0cnVjdCByZXNfaWQgaWQ7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87CisgICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqZGF0YTsKK3sKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9BQ0NFTEVSQVRPUiwgaWQsCisJCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOworICByLT50eXBlID0gUkVTX1RZUEVfQUNDRUxFUkFUT1I7CisgIHItPnUuYWNjID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogRGVmaW5lIGEgYml0bWFwIHJlc291cmNlLiAgQml0bWFwIGRhdGEgaXMgc3RvcmVkIGluIGEgZmlsZS4gIFRoZQorICAgZmlyc3QgMTQgYnl0ZXMgb2YgdGhlIGZpbGUgYXJlIGEgc3RhbmRhcmQgaGVhZGVyLCB3aGljaCBpcyBub3QKKyAgIGluY2x1ZGVkIGluIHRoZSByZXNvdXJjZSBkYXRhLiAgKi8KKworI2RlZmluZSBCSVRNQVBfU0tJUCAoMTQpCisKK3ZvaWQKK2RlZmluZV9iaXRtYXAgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIEZJTEUgKmU7CisgIGNoYXIgKnJlYWxfZmlsZW5hbWU7CisgIHN0cnVjdCBzdGF0IHM7CisgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgIGludCBpOworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworCisgIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJiaXRtYXAgZmlsZSIsICZyZWFsX2ZpbGVuYW1lKTsKKworICBpZiAoc3RhdCAocmVhbF9maWxlbmFtZSwgJnMpIDwgMCkKKyAgICBmYXRhbCAoXygic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiKSwgcmVhbF9maWxlbmFtZSwKKwkgICBzdHJlcnJvciAoZXJybm8pKTsKKworICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChzLnN0X3NpemUgLSBCSVRNQVBfU0tJUCk7CisKKyAgZm9yIChpID0gMDsgaSA8IEJJVE1BUF9TS0lQOyBpKyspCisgICAgZ2V0YyAoZSk7CisKKyAgZ2V0X2RhdGEgKGUsIGRhdGEsIHMuc3Rfc2l6ZSAtIEJJVE1BUF9TS0lQLCByZWFsX2ZpbGVuYW1lKTsKKworICBmY2xvc2UgKGUpOworICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKKworICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9CSVRNQVAsIGlkLAorCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKKworICByLT50eXBlID0gUkVTX1RZUEVfQklUTUFQOworICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplIC0gQklUTUFQX1NLSVA7CisgIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogRGVmaW5lIGEgY3Vyc29yIHJlc291cmNlLiAgQSBjdXJzb3IgZmlsZSBtYXkgY29udGFpbiBhIHNldCBvZgorICAgYml0bWFwcywgZWFjaCByZXByZXNlbnRpbmcgdGhlIHNhbWUgY3Vyc29yIGF0IHZhcmlvdXMgZGlmZmVyZW50CisgICByZXNvbHV0aW9ucy4gIFRoZXkgZWFjaCBnZXQgd3JpdHRlbiBvdXQgd2l0aCBhIGRpZmZlcmVudCBJRC4gIFRoZQorICAgcmVhbCBjdXJzb3IgcmVzb3VyY2UgaXMgdGhlbiBhIGdyb3VwIHJlc291cmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgICBzZWxlY3Qgb25lIG9mIHRoZSBhY3R1YWwgY3Vyc29ycy4gICovCisKK3ZvaWQKK2RlZmluZV9jdXJzb3IgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIEZJTEUgKmU7CisgIGNoYXIgKnJlYWxfZmlsZW5hbWU7CisgIGludCB0eXBlLCBjb3VudCwgaTsKKyAgc3RydWN0IGljb25kaXIgKmljb25kaXJzOworICBpbnQgZmlyc3RfY3Vyc29yOworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpmaXJzdCwgKipwcDsKKworICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiY3Vyc29yIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7CisKKyAgLyogQSBjdXJzb3IgZmlsZSBpcyBiYXNpY2FsbHkgYW4gaWNvbiBmaWxlLiAgVGhlIHN0YXJ0IG9mIHRoZSBmaWxlCisgICAgIGlzIGEgdGhyZWUgd29yZCBzdHJ1Y3R1cmUuICBUaGUgZmlyc3Qgd29yZCBpcyBpZ25vcmVkLiAgVGhlCisgICAgIHNlY29uZCB3b3JkIGlzIHRoZSB0eXBlIG9mIGRhdGEuICBUaGUgdGhpcmQgd29yZCBpcyB0aGUgbnVtYmVyIG9mCisgICAgIGVudHJpZXMuICAqLworCisgIGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKKyAgdHlwZSA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKKyAgY291bnQgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7CisgIGlmICh0eXBlICE9IDIpCisgICAgZmF0YWwgKF8oImN1cnNvciBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBjdXJzb3IgZGF0YSIpLCByZWFsX2ZpbGVuYW1lKTsKKworICAvKiBSZWFkIGluIHRoZSBpY29uIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KKworICBpY29uZGlycyA9IChzdHJ1Y3QgaWNvbmRpciAqKSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAqaWNvbmRpcnMpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGljb25kaXJzW2ldLndpZHRoID0gZ2V0YyAoZSk7CisgICAgICBpY29uZGlyc1tpXS5oZWlnaHQgPSBnZXRjIChlKTsKKyAgICAgIGljb25kaXJzW2ldLmNvbG9yY291bnQgPSBnZXRjIChlKTsKKyAgICAgIGdldGMgKGUpOworICAgICAgaWNvbmRpcnNbaV0udS5jdXJzb3IueGhvdHNwb3QgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7CisgICAgICBpY29uZGlyc1tpXS51LmN1cnNvci55aG90c3BvdCA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKKyAgICAgIGljb25kaXJzW2ldLmJ5dGVzID0gZ2V0X2xvbmcgKGUsIHJlYWxfZmlsZW5hbWUpOworICAgICAgaWNvbmRpcnNbaV0ub2Zmc2V0ID0gZ2V0X2xvbmcgKGUsIHJlYWxfZmlsZW5hbWUpOworCisgICAgICBpZiAoZmVvZiAoZSkpCisJdW5leHBlY3RlZF9lb2YgKHJlYWxfZmlsZW5hbWUpOworICAgIH0KKworICAvKiBEZWZpbmUgZWFjaCBjdXJzb3IgYXMgYSB1bmlxdWUgcmVzb3VyY2UuICAqLworCisgIGZpcnN0X2N1cnNvciA9IGN1cnNvcnM7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgIHN0cnVjdCByZXNfaWQgbmFtZTsKKyAgICAgIHN0cnVjdCBjdXJzb3IgKmM7CisKKyAgICAgIGlmIChmc2VlayAoZSwgaWNvbmRpcnNbaV0ub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKwlmYXRhbCAoXygiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIiksIHJlYWxfZmlsZW5hbWUsCisJICAgICAgIGljb25kaXJzW2ldLm9mZnNldCwgc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGljb25kaXJzW2ldLmJ5dGVzKTsKKworICAgICAgZ2V0X2RhdGEgKGUsIGRhdGEsIGljb25kaXJzW2ldLmJ5dGVzLCByZWFsX2ZpbGVuYW1lKTsKKworICAgICAgYyA9IChzdHJ1Y3QgY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpjKTsKKyAgICAgIGMtPnhob3RzcG90ID0gaWNvbmRpcnNbaV0udS5jdXJzb3IueGhvdHNwb3Q7CisgICAgICBjLT55aG90c3BvdCA9IGljb25kaXJzW2ldLnUuY3Vyc29yLnlob3RzcG90OworICAgICAgYy0+bGVuZ3RoID0gaWNvbmRpcnNbaV0uYnl0ZXM7CisgICAgICBjLT5kYXRhID0gZGF0YTsKKworICAgICAgKytjdXJzb3JzOworCisgICAgICBuYW1lLm5hbWVkID0gMDsKKyAgICAgIG5hbWUudS5pZCA9IGN1cnNvcnM7CisKKyAgICAgIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0NVUlNPUiwgbmFtZSwKKwkJCQkgICAgcmVzaW5mby0+bGFuZ3VhZ2UsIDApOworICAgICAgci0+dHlwZSA9IFJFU19UWVBFX0NVUlNPUjsKKyAgICAgIHItPnUuY3Vyc29yID0gYzsKKyAgICAgIHItPnJlc19pbmZvID0gKnJlc2luZm87CisgICAgfQorCisgIGZjbG9zZSAoZSk7CisgIGZyZWUgKHJlYWxfZmlsZW5hbWUpOworCisgIC8qIERlZmluZSBhIGN1cnNvciBncm91cCByZXNvdXJjZS4gICovCisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgc3RydWN0IGdyb3VwX2N1cnNvciAqY2c7CisKKyAgICAgIGNnID0gKHN0cnVjdCBncm91cF9jdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmNnKTsKKyAgICAgIGNnLT5uZXh0ID0gTlVMTDsKKyAgICAgIGNnLT53aWR0aCA9IGljb25kaXJzW2ldLndpZHRoOworICAgICAgY2ctPmhlaWdodCA9IDIgKiBpY29uZGlyc1tpXS5oZWlnaHQ7CisKKyAgICAgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGVzZSBiZSBzZXQgdG8/ICAqLworICAgICAgY2ctPnBsYW5lcyA9IDE7CisgICAgICBjZy0+Yml0cyA9IDE7CisKKyAgICAgIGNnLT5ieXRlcyA9IGljb25kaXJzW2ldLmJ5dGVzICsgNDsKKyAgICAgIGNnLT5pbmRleCA9IGZpcnN0X2N1cnNvciArIGkgKyAxOworCisgICAgICAqcHAgPSBjZzsKKyAgICAgIHBwID0gJigqcHApLT5uZXh0OworICAgIH0KKworICBmcmVlIChpY29uZGlycyk7CisKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfR1JPVVBfQ1VSU09SLCBpZCwKKwkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I7CisgIHItPnUuZ3JvdXBfY3Vyc29yID0gZmlyc3Q7CisgIHItPnJlc19pbmZvID0gKnJlc2luZm87Cit9CisKKy8qIERlZmluZSBhIGRpYWxvZyByZXNvdXJjZS4gICovCisKK3ZvaWQKK2RlZmluZV9kaWFsb2cgKGlkLCByZXNpbmZvLCBkaWFsb2cpCisgICAgIHN0cnVjdCByZXNfaWQgaWQ7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87CisgICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKK3sKKyAgc3RydWN0IGRpYWxvZyAqY29weTsKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICBjb3B5ID0gKHN0cnVjdCBkaWFsb2cgKikgcmVzX2FsbG9jIChzaXplb2YgKmNvcHkpOworICAqY29weSA9ICpkaWFsb2c7CisKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRElBTE9HLCBpZCwKKwkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9ESUFMT0c7CisgIHItPnUuZGlhbG9nID0gY29weTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogRGVmaW5lIGEgZGlhbG9nIGNvbnRyb2wuICBUaGlzIGRvZXMgbm90IGRlZmluZSBhIHJlc291cmNlLCBidXQKKyAgIG1lcmVseSBhbGxvY2F0ZXMgYW5kIGZpbGxzIGluIGEgc3RydWN0dXJlLiAgKi8KKworc3RydWN0IGRpYWxvZ19jb250cm9sICoKK2RlZmluZV9jb250cm9sICh0ZXh0LCBpZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgY2xhc3MsIHN0eWxlLCBleHN0eWxlKQorICAgICBjb25zdCBjaGFyICp0ZXh0OworICAgICB1bnNpZ25lZCBsb25nIGlkOworICAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgIHVuc2lnbmVkIGxvbmcgeTsKKyAgICAgdW5zaWduZWQgbG9uZyB3aWR0aDsKKyAgICAgdW5zaWduZWQgbG9uZyBoZWlnaHQ7CisgICAgIHVuc2lnbmVkIGxvbmcgY2xhc3M7CisgICAgIHVuc2lnbmVkIGxvbmcgc3R5bGU7CisgICAgIHVuc2lnbmVkIGxvbmcgZXhzdHlsZTsKK3sKKyAgc3RydWN0IGRpYWxvZ19jb250cm9sICpuOworCisgIG4gPSAoc3RydWN0IGRpYWxvZ19jb250cm9sICopIHJlc19hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbi0+bmV4dCA9IE5VTEw7CisgIG4tPmlkID0gaWQ7CisgIG4tPnN0eWxlID0gc3R5bGU7CisgIG4tPmV4c3R5bGUgPSBleHN0eWxlOworICBuLT54ID0geDsKKyAgbi0+eSA9IHk7CisgIG4tPndpZHRoID0gd2lkdGg7CisgIG4tPmhlaWdodCA9IGhlaWdodDsKKyAgbi0+Y2xhc3MubmFtZWQgPSAwOworICBuLT5jbGFzcy51LmlkID0gY2xhc3M7CisgIGlmICh0ZXh0ICE9IE5VTEwpCisgICAgcmVzX3N0cmluZ190b19pZCAoJm4tPnRleHQsIHRleHQpOworICBlbHNlCisgICAgeworICAgICAgbi0+dGV4dC5uYW1lZCA9IDA7CisgICAgICBuLT50ZXh0LnUuaWQgPSAwOworICAgIH0KKyAgbi0+ZGF0YSA9IE5VTEw7CisgIG4tPmhlbHAgPSAwOworCisgIHJldHVybiBuOworfQorCisvKiBEZWZpbmUgYSBmb250IHJlc291cmNlLiAgKi8KKwordm9pZAorZGVmaW5lX2ZvbnQgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIEZJTEUgKmU7CisgIGNoYXIgKnJlYWxfZmlsZW5hbWU7CisgIHN0cnVjdCBzdGF0IHM7CisgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisgIGxvbmcgb2Zmc2V0OworICBsb25nIGZvbnRkYXRhbGVuZ3RoOworICB1bnNpZ25lZCBjaGFyICpmb250ZGF0YTsKKyAgc3RydWN0IGZvbnRkaXIgKmZkOworICBjb25zdCBjaGFyICpkZXZpY2UsICpmYWNlOworICBzdHJ1Y3QgZm9udGRpciAqKnBwOworCisgIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJmb250IGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7CisKKyAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCisgICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCisJICAgc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKKworICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKKworICBmY2xvc2UgKGUpOworICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKKworICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9GT05ULCBpZCwKKwkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7CisKKyAgci0+dHlwZSA9IFJFU19UWVBFX0ZPTlQ7CisgIHItPnUuZGF0YS5sZW5ndGggPSBzLnN0X3NpemU7CisgIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKKworICAvKiBGb3IgZWFjaCBmb250IHJlc291cmNlLCB3ZSBtdXN0IGFkZCBhbiBlbnRyeSBpbiB0aGUgRk9OVERJUgorICAgICByZXNvdXJjZS4gIFRoZSBGT05URElSIHJlc291cmNlIGluY2x1ZGVzIHNvbWUgc3RyaW5ncyBpbiB0aGUgZm9udAorICAgICBmaWxlLiAgVG8gZmluZCB0aGVtLCB3ZSBoYXZlIHRvIGRvIHNvbWUgbWFnaWMgb24gdGhlIGRhdGEgd2UgaGF2ZQorICAgICByZWFkLiAgKi8KKworICBvZmZzZXQgPSAoKCgoKChkYXRhWzQ3XSA8PCA4KQorCQl8IGRhdGFbNDZdKSA8PCA4KQorCSAgICAgIHwgZGF0YVs0NV0pIDw8IDgpCisJICAgIHwgZGF0YVs0NF0pOworICBpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPCBzLnN0X3NpemUpCisgICAgZGV2aWNlID0gKGNoYXIgKikgZGF0YSArIG9mZnNldDsKKyAgZWxzZQorICAgIGRldmljZSA9ICIiOworCisgIG9mZnNldCA9ICgoKCgoKGRhdGFbNTFdIDw8IDgpCisJCXwgZGF0YVs1MF0pIDw8IDgpCisJICAgICAgfCBkYXRhWzQ5XSkgPDwgOCkKKwkgICAgfCBkYXRhWzQ4XSk7CisgIGlmIChvZmZzZXQgPiAwICYmIG9mZnNldCA8IHMuc3Rfc2l6ZSkKKyAgICBmYWNlID0gKGNoYXIgKikgZGF0YSArIG9mZnNldDsKKyAgZWxzZQorICAgIGZhY2UgPSAiIjsKKworICArK2ZvbnRzOworCisgIGZvbnRkYXRhbGVuZ3RoID0gNTggKyBzdHJsZW4gKGRldmljZSkgKyBzdHJsZW4gKGZhY2UpOworICBmb250ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAoZm9udGRhdGFsZW5ndGgpOworICBtZW1jcHkgKGZvbnRkYXRhLCBkYXRhLCA1Nik7CisgIHN0cmNweSAoKGNoYXIgKikgZm9udGRhdGEgKyA1NiwgZGV2aWNlKTsKKyAgc3RyY3B5ICgoY2hhciAqKSBmb250ZGF0YSArIDU3ICsgc3RybGVuIChkZXZpY2UpLCBmYWNlKTsKKworICBmZCA9IChzdHJ1Y3QgZm9udGRpciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZmQpOworICBmZC0+bmV4dCA9IE5VTEw7CisgIGZkLT5pbmRleCA9IGZvbnRzOworICBmZC0+bGVuZ3RoID0gZm9udGRhdGFsZW5ndGg7CisgIGZkLT5kYXRhID0gZm9udGRhdGE7CisKKyAgZm9yIChwcCA9ICZmb250ZGlyczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorICAgIDsKKyAgKnBwID0gZmQ7CisKKyAgLyogRm9yIHRoZSBzaW5nbGUgZm9udGRpcnMgcmVzb3VyY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHJlc291cmNlCisgICAgIGluZm9ybWF0aW9uIG9mIHRoZSBsYXN0IGZvbnQuICBJIGRvbid0IGtub3cgd2hhdCBlbHNlIHRvIGRvLiAgKi8KKyAgZm9udGRpcnNfcmVzaW5mbyA9ICpyZXNpbmZvOworfQorCisvKiBEZWZpbmUgdGhlIGZvbnRkaXJzIHJlc291cmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGVudGlyZSByYworICAgZmlsZSBoYXMgYmVlbiBwYXJzZWQsIGlmIGFueSBmb250IHJlc291cmNlcyB3ZXJlIHNlZW4uICAqLworCitzdGF0aWMgdm9pZAorZGVmaW5lX2ZvbnRkaXJzICgpCit7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisgIHN0cnVjdCByZXNfaWQgaWQ7CisKKyAgaWQubmFtZWQgPSAwOworICBpZC51LmlkID0gMTsKKworICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9GT05URElSLCBpZCwgMHg0MDksIDApOworCisgIHItPnR5cGUgPSBSRVNfVFlQRV9GT05URElSOworICByLT51LmZvbnRkaXIgPSBmb250ZGlyczsKKyAgci0+cmVzX2luZm8gPSBmb250ZGlyc19yZXNpbmZvOworfQorCisvKiBEZWZpbmUgYW4gaWNvbiByZXNvdXJjZS4gIEFuIGljb24gZmlsZSBtYXkgY29udGFpbiBhIHNldCBvZgorICAgYml0bWFwcywgZWFjaCByZXByZXNlbnRpbmcgdGhlIHNhbWUgaWNvbiBhdCB2YXJpb3VzIGRpZmZlcmVudAorICAgcmVzb2x1dGlvbnMuICBUaGV5IGVhY2ggZ2V0IHdyaXR0ZW4gb3V0IHdpdGggYSBkaWZmZXJlbnQgSUQuICBUaGUKKyAgIHJlYWwgaWNvbiByZXNvdXJjZSBpcyB0aGVuIGEgZ3JvdXAgcmVzb3VyY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgIHNlbGVjdCBvbmUgb2YgdGhlIGFjdHVhbCBpY29uIGJpdG1hcHMuICAqLworCit2b2lkCitkZWZpbmVfaWNvbiAoaWQsIHJlc2luZm8sIGZpbGVuYW1lKQorICAgICBzdHJ1Y3QgcmVzX2lkIGlkOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgRklMRSAqZTsKKyAgY2hhciAqcmVhbF9maWxlbmFtZTsKKyAgaW50IHR5cGUsIGNvdW50LCBpOworICBzdHJ1Y3QgaWNvbmRpciAqaWNvbmRpcnM7CisgIGludCBmaXJzdF9pY29uOworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZmlyc3QsICoqcHA7CisKKyAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImljb24gZmlsZSIsICZyZWFsX2ZpbGVuYW1lKTsKKworICAvKiBUaGUgc3RhcnQgb2YgYW4gaWNvbiBmaWxlIGlzIGEgdGhyZWUgd29yZCBzdHJ1Y3R1cmUuICBUaGUgZmlyc3QKKyAgICAgd29yZCBpcyBpZ25vcmVkLiAgVGhlIHNlY29uZCB3b3JkIGlzIHRoZSB0eXBlIG9mIGRhdGEuICBUaGUgdGhpcmQKKyAgICAgd29yZCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICAqLworCisgIGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKKyAgdHlwZSA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKKyAgY291bnQgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7CisgIGlmICh0eXBlICE9IDEpCisgICAgZmF0YWwgKF8oImljb24gZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gaWNvbiBkYXRhIiksIHJlYWxfZmlsZW5hbWUpOworCisgIC8qIFJlYWQgaW4gdGhlIGljb24gZGlyZWN0b3J5IGVudHJpZXMuICAqLworCisgIGljb25kaXJzID0gKHN0cnVjdCBpY29uZGlyICopIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mICppY29uZGlycyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgaWNvbmRpcnNbaV0ud2lkdGggPSBnZXRjIChlKTsKKyAgICAgIGljb25kaXJzW2ldLmhlaWdodCA9IGdldGMgKGUpOworICAgICAgaWNvbmRpcnNbaV0uY29sb3Jjb3VudCA9IGdldGMgKGUpOworICAgICAgZ2V0YyAoZSk7CisgICAgICBpY29uZGlyc1tpXS51Lmljb24ucGxhbmVzID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOworICAgICAgaWNvbmRpcnNbaV0udS5pY29uLmJpdHMgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7CisgICAgICBpY29uZGlyc1tpXS5ieXRlcyA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKKyAgICAgIGljb25kaXJzW2ldLm9mZnNldCA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKKworICAgICAgaWYgKGZlb2YgKGUpKQorCXVuZXhwZWN0ZWRfZW9mIChyZWFsX2ZpbGVuYW1lKTsKKyAgICB9CisKKyAgLyogRGVmaW5lIGVhY2ggaWNvbiBhcyBhIHVuaXF1ZSByZXNvdXJjZS4gICovCisKKyAgZmlyc3RfaWNvbiA9IGljb25zOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7CisKKyAgICAgIGlmIChmc2VlayAoZSwgaWNvbmRpcnNbaV0ub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKKwlmYXRhbCAoXygiJXM6IGZzZWVrIHRvICVsdSBmYWlsZWQ6ICVzIiksIHJlYWxfZmlsZW5hbWUsCisJICAgICAgIGljb25kaXJzW2ldLm9mZnNldCwgc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGljb25kaXJzW2ldLmJ5dGVzKTsKKworICAgICAgZ2V0X2RhdGEgKGUsIGRhdGEsIGljb25kaXJzW2ldLmJ5dGVzLCByZWFsX2ZpbGVuYW1lKTsKKworICAgICAgKytpY29uczsKKworICAgICAgbmFtZS5uYW1lZCA9IDA7CisgICAgICBuYW1lLnUuaWQgPSBpY29uczsKKworICAgICAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfSUNPTiwgbmFtZSwKKwkJCQkgICAgcmVzaW5mby0+bGFuZ3VhZ2UsIDApOworICAgICAgci0+dHlwZSA9IFJFU19UWVBFX0lDT047CisgICAgICByLT51LmRhdGEubGVuZ3RoID0gaWNvbmRpcnNbaV0uYnl0ZXM7CisgICAgICByLT51LmRhdGEuZGF0YSA9IGRhdGE7CisgICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOworICAgIH0KKworICBmY2xvc2UgKGUpOworICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKKworICAvKiBEZWZpbmUgYW4gaWNvbiBncm91cCByZXNvdXJjZS4gICovCisKKyAgZmlyc3QgPSBOVUxMOworICBwcCA9ICZmaXJzdDsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgc3RydWN0IGdyb3VwX2ljb24gKmNnOworCisgICAgICAvKiBGb3Igc29tZSByZWFzb24sIGF0IGxlYXN0IGluIHNvbWUgZmlsZXMgdGhlIHBsYW5lcyBhbmQgYml0cworICAgICAgICAgYXJlIHplcm8uICBXZSBpbnN0ZWFkIHNldCB0aGVtIGZyb20gdGhlIGNvbG9yLiAgVGhpcyBpcworICAgICAgICAgY29waWVkIGZyb20gcmNsLiAgKi8KKworICAgICAgY2cgPSAoc3RydWN0IGdyb3VwX2ljb24gKikgcmVzX2FsbG9jIChzaXplb2YgKmNnKTsKKyAgICAgIGNnLT5uZXh0ID0gTlVMTDsKKyAgICAgIGNnLT53aWR0aCA9IGljb25kaXJzW2ldLndpZHRoOworICAgICAgY2ctPmhlaWdodCA9IGljb25kaXJzW2ldLmhlaWdodDsKKyAgICAgIGNnLT5jb2xvcnMgPSBpY29uZGlyc1tpXS5jb2xvcmNvdW50OworCisgICAgICBjZy0+cGxhbmVzID0gMTsKKyAgICAgIGNnLT5iaXRzID0gMDsKKyAgICAgIHdoaWxlICgoMSA8PCBjZy0+Yml0cykgPCBjZy0+Y29sb3JzKQorCSsrY2ctPmJpdHM7CisKKyAgICAgIGNnLT5ieXRlcyA9IGljb25kaXJzW2ldLmJ5dGVzOworICAgICAgY2ctPmluZGV4ID0gZmlyc3RfaWNvbiArIGkgKyAxOworCisgICAgICAqcHAgPSBjZzsKKyAgICAgIHBwID0gJigqcHApLT5uZXh0OworICAgIH0KKworICBmcmVlIChpY29uZGlycyk7CisKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfR1JPVVBfSUNPTiwgaWQsCisJCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOworICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfSUNPTjsKKyAgci0+dS5ncm91cF9pY29uID0gZmlyc3Q7CisgIHItPnJlc19pbmZvID0gKnJlc2luZm87Cit9CisKKy8qIERlZmluZSBhIG1lbnUgcmVzb3VyY2UuICAqLworCit2b2lkCitkZWZpbmVfbWVudSAoaWQsIHJlc2luZm8sIG1lbnVpdGVtcykKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKKyAgICAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbXM7Cit7CisgIHN0cnVjdCBtZW51ICptOworICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworCisgIG0gPSAoc3RydWN0IG1lbnUgKikgcmVzX2FsbG9jIChzaXplb2YgKm0pOworICBtLT5pdGVtcyA9IG1lbnVpdGVtczsKKyAgbS0+aGVscCA9IDA7CisKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfTUVOVSwgaWQsIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX01FTlU7CisgIHItPnUubWVudSA9IG07CisgIHItPnJlc19pbmZvID0gKnJlc2luZm87Cit9CisKKy8qIERlZmluZSBhIG1lbnUgaXRlbS4gIFRoaXMgZG9lcyBub3QgZGVmaW5lIGEgcmVzb3VyY2UsIGJ1dCBtZXJlbHkKKyAgIGFsbG9jYXRlcyBhbmQgZmlsbHMgaW4gYSBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgbWVudWl0ZW0gKgorZGVmaW5lX21lbnVpdGVtICh0ZXh0LCBtZW51aWQsIHR5cGUsIHN0YXRlLCBoZWxwLCBtZW51aXRlbXMpCisgICAgIGNvbnN0IGNoYXIgKnRleHQ7CisgICAgIGludCBtZW51aWQ7CisgICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKKyAgICAgdW5zaWduZWQgbG9uZyBzdGF0ZTsKKyAgICAgdW5zaWduZWQgbG9uZyBoZWxwOworICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKK3sKKyAgc3RydWN0IG1lbnVpdGVtICptaTsKKworICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKKyAgbWktPm5leHQgPSBOVUxMOworICBtaS0+dHlwZSA9IHR5cGU7CisgIG1pLT5zdGF0ZSA9IHN0YXRlOworICBtaS0+aWQgPSBtZW51aWQ7CisgIGlmICh0ZXh0ID09IE5VTEwpCisgICAgbWktPnRleHQgPSBOVUxMOworICBlbHNlCisgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZtaS0+dGV4dCwgdGV4dCk7CisgIG1pLT5oZWxwID0gaGVscDsKKyAgbWktPnBvcHVwID0gbWVudWl0ZW1zOworICByZXR1cm4gbWk7Cit9CisKKy8qIERlZmluZSBhIG1lc3NhZ2V0YWJsZSByZXNvdXJjZS4gICovCisKK3ZvaWQKK2RlZmluZV9tZXNzYWdldGFibGUgKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIEZJTEUgKmU7CisgIGNoYXIgKnJlYWxfZmlsZW5hbWU7CisgIHN0cnVjdCBzdGF0IHM7CisgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgIm1lc3NhZ2V0YWJsZSBmaWxlIiwKKwkJCSZyZWFsX2ZpbGVuYW1lKTsKKworICBpZiAoc3RhdCAocmVhbF9maWxlbmFtZSwgJnMpIDwgMCkKKyAgICBmYXRhbCAoXygic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiKSwgcmVhbF9maWxlbmFtZSwKKwkgICBzdHJlcnJvciAoZXJybm8pKTsKKworICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChzLnN0X3NpemUpOworCisgIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUsIHJlYWxfZmlsZW5hbWUpOworCisgIGZjbG9zZSAoZSk7CisgIGZyZWUgKHJlYWxfZmlsZW5hbWUpOworCisgIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX01FU1NBR0VUQUJMRSwgaWQsCisJCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOworCisgIHItPnR5cGUgPSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU7CisgIHItPnUuZGF0YS5sZW5ndGggPSBzLnN0X3NpemU7CisgIHItPnUuZGF0YS5kYXRhID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogRGVmaW5lIGFuIHJjZGF0YSByZXNvdXJjZS4gICovCisKK3ZvaWQKK2RlZmluZV9yY2RhdGEgKGlkLCByZXNpbmZvLCBkYXRhKQorICAgICBzdHJ1Y3QgcmVzX2lkIGlkOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOworICAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Cit7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfUkNEQVRBLCBpZCwKKwkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9SQ0RBVEE7CisgIHItPnUucmNkYXRhID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogQ3JlYXRlIGFuIHJjZGF0YSBpdGVtIGhvbGRpbmcgYSBzdHJpbmcuICAqLworCitzdHJ1Y3QgcmNkYXRhX2l0ZW0gKgorZGVmaW5lX3JjZGF0YV9zdHJpbmcgKHN0cmluZywgbGVuKQorICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuOworeworICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOworICBjaGFyICpzOworCisgIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOworICByaS0+bmV4dCA9IE5VTEw7CisgIHJpLT50eXBlID0gUkNEQVRBX1NUUklORzsKKyAgcmktPnUuc3RyaW5nLmxlbmd0aCA9IGxlbjsKKyAgcyA9IChjaGFyICopIHJlc19hbGxvYyAobGVuKTsKKyAgbWVtY3B5IChzLCBzdHJpbmcsIGxlbik7CisgIHJpLT51LnN0cmluZy5zID0gczsKKworICByZXR1cm4gcmk7Cit9CisKKy8qIENyZWF0ZSBhbiByY2RhdGEgaXRlbSBob2xkaW5nIGEgbnVtYmVyLiAgKi8KKworc3RydWN0IHJjZGF0YV9pdGVtICoKK2RlZmluZV9yY2RhdGFfbnVtYmVyICh2YWwsIGR3b3JkKQorICAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICAgaW50IGR3b3JkOworeworICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOworCisgIHJpID0gKHN0cnVjdCByY2RhdGFfaXRlbSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmkpOworICByaS0+bmV4dCA9IE5VTEw7CisgIHJpLT50eXBlID0gZHdvcmQgPyBSQ0RBVEFfRFdPUkQgOiBSQ0RBVEFfV09SRDsKKyAgcmktPnUud29yZCA9IHZhbDsKKworICByZXR1cm4gcmk7Cit9CisKKy8qIERlZmluZSBhIHN0cmluZ3RhYmxlIHJlc291cmNlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaW5nCisgICB3aGljaCBhcHBlYXJzIGluIGEgU1RSSU5HVEFCTEUgc3RhdGVtZW50LiAgKi8KKwordm9pZAorZGVmaW5lX3N0cmluZ3RhYmxlIChyZXNpbmZvLCBzdHJpbmdpZCwgc3RyaW5nKQorICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOworICAgICB1bnNpZ25lZCBsb25nIHN0cmluZ2lkOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCByZXNfaWQgaWQ7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgaWQubmFtZWQgPSAwOworICBpZC51LmlkID0gKHN0cmluZ2lkID4+IDQpICsgMTsKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfU1RSSU5HLCBpZCwKKwkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMSk7CisKKyAgaWYgKHItPnR5cGUgPT0gUkVTX1RZUEVfVU5JTklUSUFMSVpFRCkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgci0+dHlwZSA9IFJFU19UWVBFX1NUUklOR1RBQkxFOworICAgICAgci0+dS5zdHJpbmd0YWJsZSA9ICgoc3RydWN0IHN0cmluZ3RhYmxlICopCisJCQkgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5ndGFibGUpKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJICByLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLmxlbmd0aCA9IDA7CisJICByLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLnN0cmluZyA9IE5VTEw7CisJfQorCisgICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOworICAgIH0KKworICB1bmljb2RlX2Zyb21fYXNjaWkgKCZyLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW3N0cmluZ2lkICYgMHhmXS5sZW5ndGgsCisJCSAgICAgICZyLT51LnN0cmluZ3RhYmxlLT5zdHJpbmdzW3N0cmluZ2lkICYgMHhmXS5zdHJpbmcsCisJCSAgICAgIHN0cmluZyk7Cit9CisKKy8qIERlZmluZSBhIHVzZXIgZGF0YSByZXNvdXJjZSB3aGVyZSB0aGUgZGF0YSBpcyBpbiB0aGUgcmMgZmlsZS4gICovCisKK3ZvaWQKK2RlZmluZV91c2VyX2RhdGEgKGlkLCB0eXBlLCByZXNpbmZvLCBkYXRhKQorICAgICBzdHJ1Y3QgcmVzX2lkIGlkOworICAgICBzdHJ1Y3QgcmVzX2lkIHR5cGU7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87CisgICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqZGF0YTsKK3sKKyAgc3RydWN0IHJlc19pZCBpZHNbM107CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgaWRzWzBdID0gdHlwZTsKKyAgaWRzWzFdID0gaWQ7CisgIGlkc1syXS5uYW1lZCA9IDA7CisgIGlkc1syXS51LmlkID0gcmVzaW5mby0+bGFuZ3VhZ2U7CisKKyAgciA9IGRlZmluZV9yZXNvdXJjZSAoJnJlc291cmNlcywgMywgaWRzLCAwKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX1VTRVJEQVRBOworICByLT51LnVzZXJkYXRhID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogRGVmaW5lIGEgdXNlciBkYXRhIHJlc291cmNlIHdoZXJlIHRoZSBkYXRhIGlzIGluIGEgZmlsZS4gICovCisKK3ZvaWQKK2RlZmluZV91c2VyX2ZpbGUgKGlkLCB0eXBlLCByZXNpbmZvLCBmaWxlbmFtZSkKKyAgICAgc3RydWN0IHJlc19pZCBpZDsKKyAgICAgc3RydWN0IHJlc19pZCB0eXBlOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgRklMRSAqZTsKKyAgY2hhciAqcmVhbF9maWxlbmFtZTsKKyAgc3RydWN0IHN0YXQgczsKKyAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgc3RydWN0IHJlc19pZCBpZHNbM107CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImZvbnQgZmlsZSIsICZyZWFsX2ZpbGVuYW1lKTsKKworICBpZiAoc3RhdCAocmVhbF9maWxlbmFtZSwgJnMpIDwgMCkKKyAgICBmYXRhbCAoXygic3RhdCBmYWlsZWQgb24gYml0bWFwIGZpbGUgYCVzJzogJXMiKSwgcmVhbF9maWxlbmFtZSwKKwkgICBzdHJlcnJvciAoZXJybm8pKTsKKworICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChzLnN0X3NpemUpOworCisgIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUsIHJlYWxfZmlsZW5hbWUpOworCisgIGZjbG9zZSAoZSk7CisgIGZyZWUgKHJlYWxfZmlsZW5hbWUpOworCisgIGlkc1swXSA9IHR5cGU7CisgIGlkc1sxXSA9IGlkOworICBpZHNbMl0ubmFtZWQgPSAwOworICBpZHNbMl0udS5pZCA9IHJlc2luZm8tPmxhbmd1YWdlOworCisgIHIgPSBkZWZpbmVfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIDMsIGlkcywgMCk7CisgIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKKyAgci0+dS51c2VyZGF0YSA9ICgoc3RydWN0IHJjZGF0YV9pdGVtICopCisJCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmNkYXRhX2l0ZW0pKSk7CisgIHItPnUudXNlcmRhdGEtPm5leHQgPSBOVUxMOworICByLT51LnVzZXJkYXRhLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKKyAgci0+dS51c2VyZGF0YS0+dS5idWZmZXIubGVuZ3RoID0gcy5zdF9zaXplOworICByLT51LnVzZXJkYXRhLT51LmJ1ZmZlci5kYXRhID0gZGF0YTsKKyAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKK30KKworLyogRGVmaW5lIGEgdmVyc2lvbmluZm8gcmVzb3VyY2UuICAqLworCit2b2lkCitkZWZpbmVfdmVyc2lvbmluZm8gKGlkLCBsYW5ndWFnZSwgZml4ZWR2ZXJpbmZvLCB2ZXJpbmZvKQorICAgICBzdHJ1Y3QgcmVzX2lkIGlkOworICAgICBpbnQgbGFuZ3VhZ2U7CisgICAgIHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZml4ZWR2ZXJpbmZvOworICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87Cit7CisgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7CisKKyAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfVkVSU0lPTiwgaWQsIGxhbmd1YWdlLCAwKTsKKyAgci0+dHlwZSA9IFJFU19UWVBFX1ZFUlNJT05JTkZPOworICByLT51LnZlcnNpb25pbmZvID0gKChzdHJ1Y3QgdmVyc2lvbmluZm8gKikKKwkJICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCB2ZXJzaW9uaW5mbykpKTsKKyAgci0+dS52ZXJzaW9uaW5mby0+Zml4ZWQgPSBmaXhlZHZlcmluZm87CisgIHItPnUudmVyc2lvbmluZm8tPnZhciA9IHZlcmluZm87CisgIHItPnJlc19pbmZvLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Cit9CisKKy8qIEFkZCBzdHJpbmcgdmVyc2lvbiBpbmZvIHRvIGEgbGlzdCBvZiB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KKworc3RydWN0IHZlcl9pbmZvICoKK2FwcGVuZF92ZXJfc3RyaW5nZmlsZWluZm8gKHZlcmluZm8sIGxhbmd1YWdlLCBzdHJpbmdzKQorICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87CisgICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlOworICAgICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnN0cmluZ3M7Cit7CisgIHN0cnVjdCB2ZXJfaW5mbyAqdmksICoqcHA7CisKKyAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7CisgIHZpLT5uZXh0ID0gTlVMTDsKKyAgdmktPnR5cGUgPSBWRVJJTkZPX1NUUklORzsKKyAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsIGxhbmd1YWdlKTsKKyAgdmktPnUuc3RyaW5nLnN0cmluZ3MgPSBzdHJpbmdzOworCisgIGZvciAocHAgPSAmdmVyaW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorICAgIDsKKyAgKnBwID0gdmk7CisKKyAgcmV0dXJuIHZlcmluZm87Cit9CisKKy8qIEFkZCB2YXJpYWJsZSB2ZXJzaW9uIGluZm8gdG8gYSBsaXN0IG9mIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgdmVyX2luZm8gKgorYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAodmVyaW5mbywga2V5LCB2YXIpCisgICAgIHN0cnVjdCB2ZXJfaW5mbyAqdmVyaW5mbzsKKyAgICAgY29uc3QgY2hhciAqa2V5OworICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZhcjsKK3sKKyAgc3RydWN0IHZlcl9pbmZvICp2aSwgKipwcDsKKworICB2aSA9IChzdHJ1Y3QgdmVyX2luZm8gKikgcmVzX2FsbG9jIChzaXplb2YgKnZpKTsKKyAgdmktPm5leHQgPSBOVUxMOworICB2aS0+dHlwZSA9IFZFUklORk9fVkFSOworICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJnZpLT51LnZhci5rZXksIGtleSk7CisgIHZpLT51LnZhci52YXIgPSB2YXI7CisKKyAgZm9yIChwcCA9ICZ2ZXJpbmZvOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCisgICAgOworICAqcHAgPSB2aTsKKworICByZXR1cm4gdmVyaW5mbzsKK30KKworLyogQXBwZW5kIHZlcnNpb24gc3RyaW5nIGluZm9ybWF0aW9uIHRvIGEgbGlzdC4gICovCisKK3N0cnVjdCB2ZXJfc3RyaW5naW5mbyAqCithcHBlbmRfdmVydmFsIChzdHJpbmdzLCBrZXksIHZhbHVlKQorICAgICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnN0cmluZ3M7CisgICAgIGNvbnN0IGNoYXIgKmtleTsKKyAgICAgY29uc3QgY2hhciAqdmFsdWU7Cit7CisgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnMsICoqcHA7CisKKyAgdnMgPSAoc3RydWN0IHZlcl9zdHJpbmdpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2cyk7CisgIHZzLT5uZXh0ID0gTlVMTDsKKyAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2cy0+a2V5LCBrZXkpOworICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJnZzLT52YWx1ZSwgdmFsdWUpOworCisgIGZvciAocHAgPSAmc3RyaW5nczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorICAgIDsKKyAgKnBwID0gdnM7CisKKyAgcmV0dXJuIHN0cmluZ3M7Cit9CisKKy8qIEFwcGVuZCB2ZXJzaW9uIHZhcmlhYmxlIGluZm9ybWF0aW9uIHRvIGEgbGlzdC4gICovCisKK3N0cnVjdCB2ZXJfdmFyaW5mbyAqCithcHBlbmRfdmVydHJhbnMgKHZhciwgbGFuZ3VhZ2UsIGNoYXJzZXQpCisgICAgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmFyOworICAgICB1bnNpZ25lZCBsb25nIGxhbmd1YWdlOworICAgICB1bnNpZ25lZCBsb25nIGNoYXJzZXQ7Cit7CisgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdnYsICoqcHA7CisKKyAgdnYgPSAoc3RydWN0IHZlcl92YXJpbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2dik7CisgIHZ2LT5uZXh0ID0gTlVMTDsKKyAgdnYtPmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgIHZ2LT5jaGFyc2V0ID0gY2hhcnNldDsKKworICBmb3IgKHBwID0gJnZhcjsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorICAgIDsKKyAgKnBwID0gdnY7CisKKyAgcmV0dXJuIHZhcjsKK30KKwwKKy8qIExvY2FsIGZ1bmN0aW9ucyB1c2VkIHRvIHdyaXRlIG91dCBhbiByYyBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQgaW5kZW50IFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yY19kaXJlY3RvcnkKKyAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCisJICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yY19zdWJkaXIKKyAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JjX3Jlc291cmNlCisgIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCisJICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQgKikpOworc3RhdGljIHZvaWQgd3JpdGVfcmNfYWNjZWxlcmF0b3JzCisgIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICopKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JjX2N1cnNvciBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBjdXJzb3IgKikpOworc3RhdGljIHZvaWQgd3JpdGVfcmNfZ3JvdXBfY3Vyc29yCisgIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqKSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yY19kaWFsb2cgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JjX2RpYWxvZ19jb250cm9sCisgIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICopKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JjX2ZvbnRkaXIgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgZm9udGRpciAqKSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yY19ncm91cF9pY29uIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKikpOworc3RhdGljIHZvaWQgd3JpdGVfcmNfbWVudSBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBtZW51ICosIGludCkpOworc3RhdGljIHZvaWQgd3JpdGVfcmNfbWVudWl0ZW1zCisgIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCwgaW50KSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yY19yY2RhdGEgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKiwgaW50KSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yY19zdHJpbmd0YWJsZQorICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICopKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JjX3ZlcnNpb25pbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICopKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3JjX2ZpbGVkYXRhCisgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgY2hhciAqKSk7CisKKy8qIEluZGVudCBhIGdpdmVuIG51bWJlciBvZiBzcGFjZXMuICAqLworCitzdGF0aWMgdm9pZAoraW5kZW50IChlLCBjKQorICAgICBGSUxFICplOworICAgICBpbnQgYzsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKKyAgICBwdXRjICgnICcsIGUpOworfQorCisvKiBEdW1wIHRoZSByZXNvdXJjZXMgd2UgaGF2ZSByZWFkIGluIHRoZSBmb3JtYXQgb2YgYW4gcmMgZmlsZS4KKworICAgQWN0dWFsbHksIHdlIGRvbid0IHVzZSB0aGUgZm9ybWF0IG9mIGFuIHJjIGZpbGUsIGJlY2F1c2UgaXQncyB3YXkKKyAgIHRvbyBtdWNoIG9mIGEgcGFpbi0tZm9yIGV4YW1wbGUsIHdlJ2QgaGF2ZSB0byB3cml0ZSBpY29uIHJlc291cmNlcworICAgaW50byBhIGZpbGUgYW5kIHJlZmVyIHRvIHRoYXQgZmlsZS4gIFdlIGp1c3QgZ2VuZXJhdGUgYSByZWFkYWJsZQorICAgZm9ybWF0IHRoYXQga2luZCBvZiBsb29rcyBsaWtlIGFuIHJjIGZpbGUsIGFuZCBpcyB1c2VmdWwgZm9yCisgICB1bmRlcnN0YW5kaW5nIHRoZSBjb250ZW50cyBvZiBhIHJlc291cmNlIGZpbGUuICBTb21lZGF5IHdlIG1heSB3YW50CisgICB0byBnZW5lcmF0ZSBhbiByYyBmaWxlIHdoaWNoIHRoZSByYyBjb21waWxlciBjYW4gcmVhZDsgaWYgdGhhdCBkYXkKKyAgIGNvbWVzLCB0aGlzIGNvZGUgd2lsbCBoYXZlIHRvIGJlIGZpeGVkIHVwLiAgKi8KKwordm9pZAord3JpdGVfcmNfZmlsZSAoZmlsZW5hbWUsIHJlc291cmNlcykKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Cit7CisgIEZJTEUgKmU7CisgIGludCBsYW5ndWFnZTsKKworICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICBlID0gc3Rkb3V0OworICBlbHNlCisgICAgeworICAgICAgZSA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fV1QpOworICAgICAgaWYgKGUgPT0gTlVMTCkKKwlmYXRhbCAoXygiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiksIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisKKyAgbGFuZ3VhZ2UgPSAtMTsKKyAgd3JpdGVfcmNfZGlyZWN0b3J5IChlLCByZXNvdXJjZXMsIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsCisJCSAgICAgIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsICZsYW5ndWFnZSwgMSk7Cit9CisKKy8qIFdyaXRlIG91dCBhIGRpcmVjdG9yeS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBSRCBpcyB0aGUKKyAgIGRpcmVjdG9yeS4gIFRZUEUgaXMgYSBwb2ludGVyIHRvIHRoZSBsZXZlbCAxIElEIHdoaWNoIHNlcnZlcyBhcyB0aGUKKyAgIHJlc291cmNlIHR5cGUuICBOQU1FIGlzIGEgcG9pbnRlciB0byB0aGUgbGV2ZWwgMiBJRCB3aGljaCBzZXJ2ZXMgYXMKKyAgIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgbmFtZS4gIExBTkdVQUdFIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudAorICAgbGFuZ3VhZ2UuICBMRVZFTCBpcyB0aGUgbGV2ZWwgaW4gdGhlIHRyZWUuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfZGlyZWN0b3J5IChlLCByZCwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQorICAgICBGSUxFICplOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmQ7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7CisgICAgIGludCAqbGFuZ3VhZ2U7CisgICAgIGludCBsZXZlbDsKK3sKKyAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7CisKKyAgLyogUHJpbnQgb3V0IHNvbWUgQ09GRiBpbmZvcm1hdGlvbiB0aGF0IHJjIGZpbGVzIGNhbid0IHJlcHJlc2VudC4gICovCisKKyAgaWYgKHJkLT50aW1lICE9IDApCisgICAgZnByaW50ZiAoZSwgIi8vIFRpbWUgc3RhbXA6ICVsdVxuIiwgcmQtPnRpbWUpOworICBpZiAocmQtPmNoYXJhY3RlcmlzdGljcyAhPSAwKQorICAgIGZwcmludGYgKGUsICIvLyBDaGFyYWN0ZXJpc3RpY3M6ICVsdVxuIiwgcmQtPmNoYXJhY3RlcmlzdGljcyk7CisgIGlmIChyZC0+bWFqb3IgIT0gMCB8fCByZC0+bWlub3IgIT0gMCkKKyAgICBmcHJpbnRmIChlLCAiLy8gVmVyc2lvbjogJWQgJWRcbiIsIHJkLT5tYWpvciwgcmQtPm1pbm9yKTsKKworICBmb3IgKHJlID0gcmQtPmVudHJpZXM7ICByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQorICAgIHsKKyAgICAgIHN3aXRjaCAobGV2ZWwpCisJeworCWNhc2UgMToKKwkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDEsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUKKyAgICAgICAgICAgICB0eXBlLiAgVGhpcyBub3JtYWxseSBkdXBsaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlCisgICAgICAgICAgICAgc3RvcmVkIHdpdGggdGhlIHJlc291cmNlIGl0c2VsZiwgYnV0IHdlIG5lZWQgdG8gcmVtZW1iZXIKKyAgICAgICAgICAgICB0aGUgdHlwZSBpZiB0aGlzIGlzIGEgdXNlciBkZWZpbmUgcmVzb3VyY2UgdHlwZS4gICovCisJICB0eXBlID0gJnJlLT5pZDsKKwkgIGJyZWFrOworCisJY2FzZSAyOgorCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMiwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNlIGlzIHRoZSBuYW1lCisJICAgICB3ZSBhcmUgZ29pbmcgdG8gdXNlIGluIHRoZSByYyBwcmludG91dC4gKi8KKwkgIG5hbWUgPSAmcmUtPmlkOworCSAgYnJlYWs7CisKKwljYXNlIDM6CisJICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAzLCB0aGVuIHRoaXMga2V5IHJlcHJlc2VudHMgYSBsYW5ndWFnZS4KKwkgICAgIFVzZSBpdCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLworCSAgaWYgKCEgcmUtPmlkLm5hbWVkCisJICAgICAgJiYgcmUtPmlkLnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpICh1bnNpZ25lZCBpbnQpICpsYW5ndWFnZQorCSAgICAgICYmIChyZS0+aWQudS5pZCAmIDB4ZmZmZikgPT0gcmUtPmlkLnUuaWQpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChlLCAiTEFOR1VBR0UgJWx1LCAlbHVcbiIsCisJCSAgICAgICByZS0+aWQudS5pZCAmIDB4ZmYsIChyZS0+aWQudS5pZCA+PiA4KSAmIDB4ZmYpOworCSAgICAgICpsYW5ndWFnZSA9IHJlLT5pZC51LmlkOworCSAgICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChyZS0+c3ViZGlyKQorCXdyaXRlX3JjX3N1YmRpciAoZSwgcmUsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCk7CisgICAgICBlbHNlCisJeworCSAgaWYgKGxldmVsID09IDMpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBub3JtYWwgY2FzZTogdGhlIHRocmVlIGxldmVscyBhcmUKKyAgICAgICAgICAgICAgICAgVFlQRS9OQU1FL0xBTkdVQUdFLiAgTkFNRSB3aWxsIGhhdmUgYmVlbiBzZXQgYXQgbGV2ZWwKKyAgICAgICAgICAgICAgICAgMiwgYW5kIHJlcHJlc2VudHMgdGhlIG5hbWUgdG8gdXNlLiAgV2UgcHJvYmFibHkganVzdAorICAgICAgICAgICAgICAgICBzZXQgTEFOR1VBR0UsIGFuZCBpdCB3aWxsIHByb2JhYmx5IG1hdGNoIHdoYXQgdGhlCisgICAgICAgICAgICAgICAgIHJlc291cmNlIGl0c2VsZiByZWNvcmRzIGlmIGFueXRoaW5nLiAgKi8KKwkgICAgICB3cml0ZV9yY19yZXNvdXJjZSAoZSwgdHlwZSwgbmFtZSwgcmUtPnUucmVzLCBsYW5ndWFnZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYgKGUsICIvLyBSZXNvdXJjZSBhdCB1bmV4cGVjdGVkIGxldmVsICVkXG4iLCBsZXZlbCk7CisJICAgICAgd3JpdGVfcmNfcmVzb3VyY2UgKGUsIHR5cGUsIChzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIHJlLT51LnJlcywKKwkJCQkgbGFuZ3VhZ2UpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogV3JpdGUgb3V0IGEgc3ViZGlyZWN0b3J5IGVudHJ5LiAgRSBpcyB0aGUgZmlsZSB0byB3cml0ZSB0by4gIFJFIGlzCisgICB0aGUgc3ViZGlyZWN0b3J5IGVudHJ5LiAgVFlQRSBhbmQgTkFNRSBhcmUgcG9pbnRlcnMgdG8gaGlnaGVyIGxldmVsCisgICBJRHMsIG9yIE5VTEwuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCisgICBMRVZFTCBpcyB0aGUgbGV2ZWwgaW4gdGhlIHRyZWUuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfc3ViZGlyIChlLCByZSwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQorICAgICBGSUxFICplOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKKyAgICAgaW50ICpsYW5ndWFnZTsKKyAgICAgaW50IGxldmVsOworeworICBmcHJpbnRmIChlLCAiXG4iKTsKKyAgc3dpdGNoIChsZXZlbCkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgZnByaW50ZiAoZSwgIi8vIFR5cGU6ICIpOworICAgICAgaWYgKHJlLT5pZC5uYW1lZCkKKwlyZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7CisgICAgICBlbHNlCisJeworCSAgY29uc3QgY2hhciAqczsKKworCSAgc3dpdGNoIChyZS0+aWQudS5pZCkKKwkgICAgeworCSAgICBjYXNlIFJUX0NVUlNPUjogcyA9ICJjdXJzb3IiOyBicmVhazsKKwkgICAgY2FzZSBSVF9CSVRNQVA6IHMgPSAiYml0bWFwIjsgYnJlYWs7CisJICAgIGNhc2UgUlRfSUNPTjogcyA9ICJpY29uIjsgYnJlYWs7CisJICAgIGNhc2UgUlRfTUVOVTogcyA9ICJtZW51IjsgYnJlYWs7CisJICAgIGNhc2UgUlRfRElBTE9HOiBzID0gImRpYWxvZyI7IGJyZWFrOworCSAgICBjYXNlIFJUX1NUUklORzogcyA9ICJzdHJpbmd0YWJsZSI7IGJyZWFrOworCSAgICBjYXNlIFJUX0ZPTlRESVI6IHMgPSAiZm9udGRpciI7IGJyZWFrOworCSAgICBjYXNlIFJUX0ZPTlQ6IHMgPSAiZm9udCI7IGJyZWFrOworCSAgICBjYXNlIFJUX0FDQ0VMRVJBVE9SOiBzID0gImFjY2VsZXJhdG9ycyI7IGJyZWFrOworCSAgICBjYXNlIFJUX1JDREFUQTogcyA9ICJyY2RhdGEiOyBicmVhazsKKwkgICAgY2FzZSBSVF9NRVNTQUdFVEFCTEU6IHMgPSAibWVzc2FnZXRhYmxlIjsgYnJlYWs7CisJICAgIGNhc2UgUlRfR1JPVVBfQ1VSU09SOiBzID0gImdyb3VwIGN1cnNvciI7IGJyZWFrOworCSAgICBjYXNlIFJUX0dST1VQX0lDT046IHMgPSAiZ3JvdXAgaWNvbiI7IGJyZWFrOworCSAgICBjYXNlIFJUX1ZFUlNJT046IHMgPSAidmVyc2lvbiI7IGJyZWFrOworCSAgICBjYXNlIFJUX0RMR0lOQ0xVREU6IHMgPSAiZGxnaW5jbHVkZSI7IGJyZWFrOworCSAgICBjYXNlIFJUX1BMVUdQTEFZOiBzID0gInBsdWdwbGF5IjsgYnJlYWs7CisJICAgIGNhc2UgUlRfVlhEOiBzID0gInZ4ZCI7IGJyZWFrOworCSAgICBjYXNlIFJUX0FOSUNVUlNPUjogcyA9ICJhbmljdXJzb3IiOyBicmVhazsKKwkgICAgY2FzZSBSVF9BTklJQ09OOiBzID0gImFuaWljb24iOyBicmVhazsKKwkgICAgZGVmYXVsdDogcyA9IE5VTEw7IGJyZWFrOworCSAgICB9CisKKwkgIGlmIChzICE9IE5VTEwpCisJICAgIGZwcmludGYgKGUsICIlcyIsIHMpOworCSAgZWxzZQorCSAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7CisJfQorICAgICAgZnByaW50ZiAoZSwgIlxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGZwcmludGYgKGUsICIvLyBOYW1lOiAiKTsKKyAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKKyAgICAgIGZwcmludGYgKGUsICJcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICBmcHJpbnRmIChlLCAiLy8gTGFuZ3VhZ2U6ICIpOworICAgICAgcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOworICAgICAgZnByaW50ZiAoZSwgIlxuIik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChlLCAiLy8gTGV2ZWwgJWQ6ICIsIGxldmVsKTsKKyAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKKyAgICAgIGZwcmludGYgKGUsICJcbiIpOworICAgIH0JCQorCisgIHdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmUtPnUuZGlyLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwgKyAxKTsKK30KKworLyogV3JpdGUgb3V0IGEgc2luZ2xlIHJlc291cmNlLiAgRSBpcyB0aGUgZmlsZSB0byB3cml0ZSB0by4gIFRZUEUgaXMgYQorICAgcG9pbnRlciB0byB0aGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuICBOQU1FIGlzIGEgcG9pbnRlciB0byB0aGUgbmFtZQorICAgb2YgdGhlIHJlc291cmNlOyBpdCB3aWxsIGJlIE5VTEwgaWYgdGhlcmUgaXMgYSBsZXZlbCBtaXNtYXRjaC4gIFJFUworICAgaXMgdGhlIHJlc291cmNlIGRhdGEuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKKyAgIGxhbmd1YWdlLiAgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX3JjX3Jlc291cmNlIChlLCB0eXBlLCBuYW1lLCByZXMsIGxhbmd1YWdlKQorICAgICBGSUxFICplOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7CisgICAgIGludCAqbGFuZ3VhZ2U7Cit7CisgIGNvbnN0IGNoYXIgKnM7CisgIGludCBydDsKKyAgaW50IG1lbnVleCA9IDA7CisKKyAgZnByaW50ZiAoZSwgIlxuIik7CisKKyAgc3dpdGNoIChyZXMtPnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKworICAgIGNhc2UgUkVTX1RZUEVfQUNDRUxFUkFUT1I6CisgICAgICBzID0gIkFDQ0VMRVJBVE9SIjsKKyAgICAgIHJ0ID0gUlRfQUNDRUxFUkFUT1I7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfQklUTUFQOgorICAgICAgcyA9ICJCSVRNQVAiOworICAgICAgcnQgPSBSVF9CSVRNQVA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgorICAgICAgcyA9ICJDVVJTT1IiOworICAgICAgcnQgPSBSVF9DVVJTT1I7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfQ1VSU09SOgorICAgICAgcyA9ICJHUk9VUF9DVVJTT1IiOworICAgICAgcnQgPSBSVF9HUk9VUF9DVVJTT1I7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgorICAgICAgaWYgKGV4dGVuZGVkX2RpYWxvZyAocmVzLT51LmRpYWxvZykpCisJcyA9ICJESUFMT0dFWCI7CisgICAgICBlbHNlCisJcyA9ICJESUFMT0ciOworICAgICAgcnQgPSBSVF9ESUFMT0c7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfRk9OVDoKKyAgICAgIHMgPSAiRk9OVCI7CisgICAgICBydCA9IFJUX0ZPTlQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKKyAgICAgIHMgPSAiRk9OVERJUiI7CisgICAgICBydCA9IFJUX0ZPTlRESVI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKKyAgICAgIHMgPSAiSUNPTiI7CisgICAgICBydCA9IFJUX0lDT047CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfSUNPTjoKKyAgICAgIHMgPSAiR1JPVVBfSUNPTiI7CisgICAgICBydCA9IFJUX0dST1VQX0lDT047CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKKyAgICAgIGlmIChleHRlbmRlZF9tZW51IChyZXMtPnUubWVudSkpCisJeworCSAgcyA9ICJNRU5VRVgiOworCSAgbWVudWV4ID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcyA9ICJNRU5VIjsKKwkgIG1lbnVleCA9IDA7CisJfQorICAgICAgcnQgPSBSVF9NRU5VOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKKyAgICAgIHMgPSAiTUVTU0FHRVRBQkxFIjsKKyAgICAgIHJ0ID0gUlRfTUVTU0FHRVRBQkxFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKKyAgICAgIHMgPSAiUkNEQVRBIjsKKyAgICAgIHJ0ID0gUlRfUkNEQVRBOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgorICAgICAgcyA9ICJTVFJJTkdUQUJMRSI7CisgICAgICBydCA9IFJUX1NUUklORzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKKyAgICAgIHMgPSBOVUxMOworICAgICAgcnQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX1ZFUlNJT05JTkZPOgorICAgICAgcyA9ICJWRVJTSU9OSU5GTyI7CisgICAgICBydCA9IFJUX1ZFUlNJT047CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKHJ0ICE9IDAKKyAgICAgICYmIHR5cGUgIT0gTlVMTAorICAgICAgJiYgKHR5cGUtPm5hbWVkIHx8IHR5cGUtPnUuaWQgIT0gKHVuc2lnbmVkIGxvbmcpIHJ0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChlLCAiLy8gVW5leHBlY3RlZCByZXNvdXJjZSB0eXBlIG1pc21hdGNoOiAiKTsKKyAgICAgIHJlc19pZF9wcmludCAoZSwgKnR5cGUsIDEpOworICAgICAgZnByaW50ZiAoZSwgIiAhPSAlZCIsIHJ0KTsKKyAgICB9CisKKyAgaWYgKHJlcy0+Y29mZl9pbmZvLmNvZGVwYWdlICE9IDApCisgICAgZnByaW50ZiAoZSwgIi8vIENvZGUgcGFnZTogJWx1XG4iLCByZXMtPmNvZmZfaW5mby5jb2RlcGFnZSk7CisgIGlmIChyZXMtPmNvZmZfaW5mby5yZXNlcnZlZCAhPSAwKQorICAgIGZwcmludGYgKGUsICIvLyBDT0ZGIHJlc2VydmVkIHZhbHVlOiAlbHVcbiIsIHJlcy0+Y29mZl9pbmZvLnJlc2VydmVkKTsKKworICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHJlc19pZF9wcmludCAoZSwgKm5hbWUsIDApOworICBlbHNlCisgICAgZnByaW50ZiAoZSwgIj8/VW5rbm93bi1OYW1lPz8iKTsKKworICBmcHJpbnRmIChlLCAiICIpOworICBpZiAocyAhPSBOVUxMKQorICAgIGZwcmludGYgKGUsICIlcyIsIHMpOworICBlbHNlIGlmICh0eXBlICE9IE5VTEwpCisgICAgcmVzX2lkX3ByaW50IChlLCAqdHlwZSwgMCk7CisgIGVsc2UKKyAgICBmcHJpbnRmIChlLCAiPz9Vbmtub3duLVR5cGU/PyIpOworCisgIGlmIChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICE9IDApCisgICAgeworICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19NT1ZFQUJMRSkgIT0gMCkKKwlmcHJpbnRmIChlLCAiIE1PVkVBQkxFIik7CisgICAgICBpZiAoKHJlcy0+cmVzX2luZm8ubWVtZmxhZ3MgJiBNRU1GTEFHX1BVUkUpICE9IDApCisJZnByaW50ZiAoZSwgIiBQVVJFIik7CisgICAgICBpZiAoKHJlcy0+cmVzX2luZm8ubWVtZmxhZ3MgJiBNRU1GTEFHX1BSRUxPQUQpICE9IDApCisJZnByaW50ZiAoZSwgIiBQUkVMT0FEIik7CisgICAgICBpZiAoKHJlcy0+cmVzX2luZm8ubWVtZmxhZ3MgJiBNRU1GTEFHX0RJU0NBUkRBQkxFKSAhPSAwKQorCWZwcmludGYgKGUsICIgRElTQ0FSREFCTEUiKTsKKyAgICB9CisKKyAgaWYgKHJlcy0+dHlwZSA9PSBSRVNfVFlQRV9ESUFMT0cpCisgICAgeworICAgICAgZnByaW50ZiAoZSwgIiAlZCwgJWQsICVkLCAlZCIsIHJlcy0+dS5kaWFsb2ctPngsIHJlcy0+dS5kaWFsb2ctPnksCisJICAgICAgIHJlcy0+dS5kaWFsb2ctPndpZHRoLCByZXMtPnUuZGlhbG9nLT5oZWlnaHQpOworICAgICAgaWYgKHJlcy0+dS5kaWFsb2ctPmV4ICE9IE5VTEwKKwkgICYmIHJlcy0+dS5kaWFsb2ctPmV4LT5oZWxwICE9IDApCisJZnByaW50ZiAoZSwgIiwgJWx1IiwgcmVzLT51LmRpYWxvZy0+ZXgtPmhlbHApOworICAgIH0KKworICBmcHJpbnRmIChlLCAiXG4iKTsKKworICBpZiAoKHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgIT0gMCAmJiByZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9ICpsYW5ndWFnZSkKKyAgICAgIHx8IHJlcy0+cmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzICE9IDAKKyAgICAgIHx8IHJlcy0+cmVzX2luZm8udmVyc2lvbiAhPSAwKQorICAgIHsKKyAgICAgIGludCBtb2RpZmllcnM7CisKKyAgICAgIHN3aXRjaCAocmVzLT50eXBlKQorCXsKKwljYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgorCWNhc2UgUkVTX1RZUEVfRElBTE9HOgorCWNhc2UgUkVTX1RZUEVfTUVOVToKKwljYXNlIFJFU19UWVBFX1JDREFUQToKKwljYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgorCSAgbW9kaWZpZXJzID0gMTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIG1vZGlmaWVycyA9IDA7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChyZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9IDAgJiYgcmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAqbGFuZ3VhZ2UpCisJZnByaW50ZiAoZSwgIiVzTEFOR1VBR0UgJWQsICVkXG4iLAorCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKKwkJIHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgJiAweGZmLAorCQkgKHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgPj4gOCkgJiAweGZmKTsKKyAgICAgIGlmIChyZXMtPnJlc19pbmZvLmNoYXJhY3RlcmlzdGljcyAhPSAwKQorCWZwcmludGYgKGUsICIlc0NIQVJBQ1RFUklTVElDUyAlbHVcbiIsCisJCSBtb2RpZmllcnMgPyAiLy8gIiA6ICIiLAorCQkgcmVzLT5yZXNfaW5mby5jaGFyYWN0ZXJpc3RpY3MpOworICAgICAgaWYgKHJlcy0+cmVzX2luZm8udmVyc2lvbiAhPSAwKQorCWZwcmludGYgKGUsICIlc1ZFUlNJT04gJWx1XG4iLAorCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKKwkJIHJlcy0+cmVzX2luZm8udmVyc2lvbik7CisgICAgfQorCisgIHN3aXRjaCAocmVzLT50eXBlKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisKKyAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgorICAgICAgd3JpdGVfcmNfYWNjZWxlcmF0b3JzIChlLCByZXMtPnUuYWNjKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9DVVJTT1I6CisgICAgICB3cml0ZV9yY19jdXJzb3IgKGUsIHJlcy0+dS5jdXJzb3IpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKKyAgICAgIHdyaXRlX3JjX2dyb3VwX2N1cnNvciAoZSwgcmVzLT51Lmdyb3VwX2N1cnNvcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgorICAgICAgd3JpdGVfcmNfZGlhbG9nIChlLCByZXMtPnUuZGlhbG9nKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9GT05URElSOgorICAgICAgd3JpdGVfcmNfZm9udGRpciAoZSwgcmVzLT51LmZvbnRkaXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046CisgICAgICB3cml0ZV9yY19ncm91cF9pY29uIChlLCByZXMtPnUuZ3JvdXBfaWNvbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKKyAgICAgIHdyaXRlX3JjX21lbnUgKGUsIHJlcy0+dS5tZW51LCBtZW51ZXgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKKyAgICAgIHdyaXRlX3JjX3JjZGF0YSAoZSwgcmVzLT51LnJjZGF0YSwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfU1RSSU5HVEFCTEU6CisgICAgICB3cml0ZV9yY19zdHJpbmd0YWJsZSAoZSwgbmFtZSwgcmVzLT51LnN0cmluZ3RhYmxlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9VU0VSREFUQToKKyAgICAgIHdyaXRlX3JjX3JjZGF0YSAoZSwgcmVzLT51LnVzZXJkYXRhLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKKyAgICAgIHdyaXRlX3JjX3ZlcnNpb25pbmZvIChlLCByZXMtPnUudmVyc2lvbmluZm8pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKKyAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6CisgICAgY2FzZSBSRVNfVFlQRV9JQ09OOgorICAgIGNhc2UgUkVTX1RZUEVfTUVTU0FHRVRBQkxFOgorICAgICAgd3JpdGVfcmNfZmlsZWRhdGEgKGUsIHJlcy0+dS5kYXRhLmxlbmd0aCwgcmVzLT51LmRhdGEuZGF0YSk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFdyaXRlIG91dCBhY2NlbGVyYXRvciBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9yY19hY2NlbGVyYXRvcnMgKGUsIGFjY2VsZXJhdG9ycykKKyAgICAgRklMRSAqZTsKKyAgICAgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICphY2NlbGVyYXRvcnM7Cit7CisgIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjOworCisgIGZwcmludGYgKGUsICJCRUdJTlxuIik7CisgIGZvciAoYWNjID0gYWNjZWxlcmF0b3JzOyBhY2MgIT0gTlVMTDsgYWNjID0gYWNjLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBwcmludGFibGU7CisKKyAgICAgIGZwcmludGYgKGUsICIgICIpOworCisgICAgICBpZiAoKGFjYy0+a2V5ICYgMHg3ZikgPT0gYWNjLT5rZXkKKwkgICYmIGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSBhY2MtPmtleSkKKwkgICYmIChhY2MtPmZsYWdzICYgQUNDX1ZJUlRLRVkpID09IDApCisJeworCSAgZnByaW50ZiAoZSwgIlwiJWNcIiIsIGFjYy0+a2V5KTsKKwkgIHByaW50YWJsZSA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwcmludGYgKGUsICIlZCIsIGFjYy0+a2V5KTsKKwkgIHByaW50YWJsZSA9IDA7CisJfQorCisgICAgICBmcHJpbnRmIChlLCAiLCAlZCIsIGFjYy0+aWQpOworCisgICAgICBpZiAoISBwcmludGFibGUpCisJeworCSAgaWYgKChhY2MtPmZsYWdzICYgQUNDX1ZJUlRLRVkpICE9IDApCisJICAgIGZwcmludGYgKGUsICIsIFZJUlRLRVkiKTsKKwkgIGVsc2UKKwkgICAgZnByaW50ZiAoZSwgIiwgQVNDSUkiKTsKKwl9CisKKyAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19TSElGVCkgIT0gMCkKKwlmcHJpbnRmIChlLCAiLCBTSElGVCIpOworICAgICAgaWYgKChhY2MtPmZsYWdzICYgQUNDX0NPTlRST0wpICE9IDApCisJZnByaW50ZiAoZSwgIiwgQ09OVFJPTCIpOworICAgICAgaWYgKChhY2MtPmZsYWdzICYgQUNDX0FMVCkgIT0gMCkKKwlmcHJpbnRmIChlLCAiLCBBTFQiKTsKKworICAgICAgZnByaW50ZiAoZSwgIlxuIik7CisgICAgfQorCisgIGZwcmludGYgKGUsICJFTkRcbiIpOworfQorCisvKiBXcml0ZSBvdXQgY3Vyc29yIGluZm9ybWF0aW9uLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBpbiBhIHNlcGFyYXRlCisgICBmaWxlLCB3aGljaCB0aGUgcmMgZmlsZSB3b3VsZCBpbmNsdWRlLiAgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX3JjX2N1cnNvciAoZSwgY3Vyc29yKQorICAgICBGSUxFICplOworICAgICBjb25zdCBzdHJ1Y3QgY3Vyc29yICpjdXJzb3I7Cit7CisgIGZwcmludGYgKGUsICIvLyBIb3RzcG90OiB4OiAlZDsgeTogJWRcbiIsIGN1cnNvci0+eGhvdHNwb3QsCisJICAgY3Vyc29yLT55aG90c3BvdCk7CisgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCBjdXJzb3ItPmxlbmd0aCwgY3Vyc29yLT5kYXRhKTsKK30KKworLyogV3JpdGUgb3V0IGdyb3VwIGN1cnNvciBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tIHRoZQorICAgY3Vyc29yIGRhdGEuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfZ3JvdXBfY3Vyc29yIChlLCBncm91cF9jdXJzb3IpCisgICAgIEZJTEUgKmU7CisgICAgIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdyb3VwX2N1cnNvcjsKK3sKKyAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ2M7CisKKyAgZm9yIChnYyA9IGdyb3VwX2N1cnNvcjsgZ2MgIT0gTlVMTDsgZ2MgPSBnYy0+bmV4dCkKKyAgICB7CisgICAgICBmcHJpbnRmIChlLCAiLy8gd2lkdGg6ICVkOyBoZWlnaHQgJWQ7IHBsYW5lcyAlZDsgYml0cyAlZFxuIiwKKwkgICAgIGdjLT53aWR0aCwgZ2MtPmhlaWdodCwgZ2MtPnBsYW5lcywgZ2MtPmJpdHMpOworICAgICAgZnByaW50ZiAoZSwgIi8vIGRhdGEgYnl0ZXM6ICVsdTsgaW5kZXg6ICVkXG4iLAorCSAgICAgICBnYy0+Ynl0ZXMsIGdjLT5pbmRleCk7CisgICAgfQorfQorCisvKiBXcml0ZSBkaWFsb2cgZGF0YS4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9yY19kaWFsb2cgKGUsIGRpYWxvZykKKyAgICAgRklMRSAqZTsKKyAgICAgY29uc3Qgc3RydWN0IGRpYWxvZyAqZGlhbG9nOworeworICBjb25zdCBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmNvbnRyb2w7CisKKyAgaWYgKGRpYWxvZy0+c3R5bGUgIT0gMCkKKyAgICBmcHJpbnRmIChlLCAiU1RZTEUgMHglbHhcbiIsIGRpYWxvZy0+c3R5bGUpOworICBpZiAoZGlhbG9nLT5leHN0eWxlICE9IDApCisgICAgZnByaW50ZiAoZSwgIkVYU1RZTEUgMHglbHhcbiIsIGRpYWxvZy0+ZXhzdHlsZSk7CisgIGlmICgoZGlhbG9nLT5jbGFzcy5uYW1lZCAmJiBkaWFsb2ctPmNsYXNzLnUubi5sZW5ndGggPiAwKQorICAgICAgfHwgZGlhbG9nLT5jbGFzcy51LmlkICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoZSwgIkNMQVNTICIpOworICAgICAgcmVzX2lkX3ByaW50IChlLCBkaWFsb2ctPmNsYXNzLCAwKTsKKyAgICAgIGZwcmludGYgKGUsICJcbiIpOworICAgIH0KKyAgaWYgKGRpYWxvZy0+Y2FwdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKGUsICJDQVBUSU9OIFwiIik7CisgICAgICB1bmljb2RlX3ByaW50IChlLCBkaWFsb2ctPmNhcHRpb24sIC0xKTsKKyAgICAgIGZwcmludGYgKGUsICJcIlxuIik7CisgICAgfQorICBpZiAoKGRpYWxvZy0+bWVudS5uYW1lZCAmJiBkaWFsb2ctPm1lbnUudS5uLmxlbmd0aCA+IDApCisgICAgICB8fCBkaWFsb2ctPm1lbnUudS5pZCAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKGUsICJNRU5VICIpOworICAgICAgcmVzX2lkX3ByaW50IChlLCBkaWFsb2ctPm1lbnUsIDApOworICAgICAgZnByaW50ZiAoZSwgIlxuIik7CisgICAgfQorICBpZiAoZGlhbG9nLT5mb250ICE9IE5VTEwpCisgICAgeworICAgICAgZnByaW50ZiAoZSwgIkZPTlQgJWQsIFwiIiwgZGlhbG9nLT5wb2ludHNpemUpOworICAgICAgdW5pY29kZV9wcmludCAoZSwgZGlhbG9nLT5mb250LCAtMSk7CisgICAgICBmcHJpbnRmIChlLCAiXCIiKTsKKyAgICAgIGlmIChkaWFsb2ctPmV4ICE9IE5VTEwKKwkgICYmIChkaWFsb2ctPmV4LT53ZWlnaHQgIT0gMCB8fCBkaWFsb2ctPmV4LT5pdGFsaWMgIT0gMCkpCisJZnByaW50ZiAoZSwgIiwgJWQsICVkIiwgZGlhbG9nLT5leC0+d2VpZ2h0LCBkaWFsb2ctPmV4LT5pdGFsaWMpOworICAgICAgZnByaW50ZiAoZSwgIlxuIik7CisgICAgfQorCisgIGZwcmludGYgKGUsICJCRUdJTlxuIik7CisKKyAgZm9yIChjb250cm9sID0gZGlhbG9nLT5jb250cm9sczsgY29udHJvbCAhPSBOVUxMOyBjb250cm9sID0gY29udHJvbC0+bmV4dCkKKyAgICB3cml0ZV9yY19kaWFsb2dfY29udHJvbCAoZSwgY29udHJvbCk7CisKKyAgZnByaW50ZiAoZSwgIkVORFxuIik7Cit9CisKKy8qIEZvciBlYWNoIHByZWRlZmluZWQgY29udHJvbCBrZXl3b3JkLCB0aGlzIHRhYmxlIHByb3ZpZGVzIHRoZSBjbGFzcworICAgYW5kIHRoZSBzdHlsZS4gICovCisKK3N0cnVjdCBjb250cm9sX2luZm8KK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgc2hvcnQgY2xhc3M7CisgIHVuc2lnbmVkIGxvbmcgc3R5bGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyBjb250cm9sX2luZm9bXSA9Cit7CisgIHsgIkFVVE8zU1RBVEUiLCBDVExfQlVUVE9OLCBCU19BVVRPM1NUQVRFIH0sCisgIHsgIkFVVE9DSEVDS0JPWCIsIENUTF9CVVRUT04sIEJTX0FVVE9DSEVDS0JPWCB9LAorICB7ICJBVVRPUkFESU9CVVRUT04iLCBDVExfQlVUVE9OLCBCU19BVVRPUkFESU9CVVRUT04gfSwKKyAgeyAiQ0hFQ0tCT1giLCBDVExfQlVUVE9OLCBCU19DSEVDS0JPWCB9LAorICB7ICJDT01CT0JPWCIsIENUTF9DT01CT0JPWCwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCisgIHsgIkNURVhUIiwgQ1RMX1NUQVRJQywgU1NfQ0VOVEVSIH0sCisgIHsgIkRFRlBVU0hCVVRUT04iLCBDVExfQlVUVE9OLCBCU19ERUZQVVNIQlVUVE9OIH0sCisgIHsgIkVESVRURVhUIiwgQ1RMX0VESVQsICh1bnNpZ25lZCBsb25nKSAtMSB9LAorICB7ICJHUk9VUEJPWCIsIENUTF9CVVRUT04sIEJTX0dST1VQQk9YIH0sCisgIHsgIklDT04iLCBDVExfU1RBVElDLCBTU19JQ09OIH0sCisgIHsgIkxJU1RCT1giLCBDVExfTElTVEJPWCwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCisgIHsgIkxURVhUIiwgQ1RMX1NUQVRJQywgU1NfTEVGVCB9LAorICB7ICJQVVNIQk9YIiwgQ1RMX0JVVFRPTiwgQlNfUFVTSEJPWCB9LAorICB7ICJQVVNIQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfUFVTSEJVVFRPTiB9LAorICB7ICJSQURJT0JVVFRPTiIsIENUTF9CVVRUT04sIEJTX1JBRElPQlVUVE9OIH0sCisgIHsgIlJURVhUIiwgQ1RMX1NUQVRJQywgU1NfUklHSFQgfSwKKyAgeyAiU0NST0xMQkFSIiwgQ1RMX1NDUk9MTEJBUiwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCisgIHsgIlNUQVRFMyIsIENUTF9CVVRUT04sIEJTXzNTVEFURSB9LAorICAvKiBJdCdzIGltcG9ydGFudCB0aGF0IFVTRVJCVVRUT04gY29tZSBhZnRlciBhbGwgdGhlIG90aGVyIGJ1dHRvbgorICAgICB0eXBlcywgc28gdGhhdCBpdCB3b24ndCBiZSBtYXRjaGVkIHRvbyBlYXJseS4gICovCisgIHsgIlVTRVJCVVRUT04iLCBDVExfQlVUVE9OLCAodW5zaWduZWQgbG9uZykgLTEgfSwKKyAgeyBOVUxMLCAwLCAwIH0KK307CisKKy8qIFdyaXRlIGEgZGlhbG9nIGNvbnRyb2wuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfZGlhbG9nX2NvbnRyb2wgKGUsIGNvbnRyb2wpCisgICAgIEZJTEUgKmU7CisgICAgIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqY29udHJvbDsKK3sKKyAgY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqY2k7CisKKyAgZnByaW50ZiAoZSwgIiAgIik7CisKKyAgaWYgKGNvbnRyb2wtPmNsYXNzLm5hbWVkKQorICAgIGNpID0gTlVMTDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoY2kgPSBjb250cm9sX2luZm87IGNpLT5uYW1lICE9IE5VTEw7ICsrY2kpCisJaWYgKGNpLT5jbGFzcyA9PSBjb250cm9sLT5jbGFzcy51LmlkCisJICAgICYmIChjaS0+c3R5bGUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xCisJCXx8IGNpLT5zdHlsZSA9PSAoY29udHJvbC0+c3R5bGUgJiAweGZmKSkpCisJICBicmVhazsKKyAgICB9CisgIGlmIChjaSA9PSBOVUxMKQorICAgIGZwcmludGYgKGUsICJDT05UUk9MIik7CisgIGVsc2UgaWYgKGNpLT5uYW1lICE9IE5VTEwpCisgICAgZnByaW50ZiAoZSwgIiVzIiwgY2ktPm5hbWUpOworICBlbHNlCisgICAgZnByaW50ZiAoZSwgIkNPTlRST0wiKTsKKyAgCisgIGlmIChjb250cm9sLT50ZXh0Lm5hbWVkIHx8IGNvbnRyb2wtPnRleHQudS5pZCAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKGUsICIgIik7CisgICAgICByZXNfaWRfcHJpbnQgKGUsIGNvbnRyb2wtPnRleHQsIDEpOworICAgICAgZnByaW50ZiAoZSwgIiwiKTsKKyAgICB9CisKKyAgZnByaW50ZiAoZSwgIiAlZCwgIiwgY29udHJvbC0+aWQpOworCisgIGlmIChjaSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKKwlmcHJpbnRmIChlLCAiXCIiKTsKKyAgICAgIHJlc19pZF9wcmludCAoZSwgY29udHJvbC0+Y2xhc3MsIDApOworICAgICAgaWYgKGNvbnRyb2wtPmNsYXNzLm5hbWVkKQorCWZwcmludGYgKGUsICJcIiIpOworICAgICAgZnByaW50ZiAoZSwgIiwgMHglbHgsICIsIGNvbnRyb2wtPnN0eWxlKTsKKyAgICB9CisKKyAgZnByaW50ZiAoZSwgIiVkLCAlZCIsIGNvbnRyb2wtPngsIGNvbnRyb2wtPnkpOworCisgIGlmIChjb250cm9sLT5zdHlsZSAhPSBTU19JQ09OCisgICAgICB8fCBjb250cm9sLT5leHN0eWxlICE9IDAKKyAgICAgIHx8IGNvbnRyb2wtPndpZHRoICE9IDAKKyAgICAgIHx8IGNvbnRyb2wtPmhlaWdodCAhPSAwCisgICAgICB8fCBjb250cm9sLT5oZWxwICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoZSwgIiwgJWQsICVkIiwgY29udHJvbC0+d2lkdGgsIGNvbnRyb2wtPmhlaWdodCk7CisKKyAgICAgIC8qIEZJWE1FOiBXZSBkb24ndCBuZWVkIHRvIHByaW50IHRoZSBzdHlsZSBpZiBpdCBpcyB0aGUgZGVmYXVsdC4KKwkgTW9yZSBpbXBvcnRhbnRseSwgaW4gY2VydGFpbiBjYXNlcyB3ZSBhY3R1YWxseSBuZWVkIHRvIHR1cm4KKwkgb2ZmIHBhcnRzIG9mIHRoZSBmb3JjZWQgc3R5bGUsIGJ5IHVzaW5nIE5PVC4gICovCisgICAgICBmcHJpbnRmIChlLCAiLCAweCVseCIsIGNvbnRyb2wtPnN0eWxlKTsKKworICAgICAgaWYgKGNvbnRyb2wtPmV4c3R5bGUgIT0gMCB8fCBjb250cm9sLT5oZWxwICE9IDApCisJZnByaW50ZiAoZSwgIiwgMHglbHgsICVsdSIsIGNvbnRyb2wtPmV4c3R5bGUsIGNvbnRyb2wtPmhlbHApOworICAgIH0KKworICBmcHJpbnRmIChlLCAiXG4iKTsKKworICBpZiAoY29udHJvbC0+ZGF0YSAhPSBOVUxMKQorICAgIHdyaXRlX3JjX3JjZGF0YSAoZSwgY29udHJvbC0+ZGF0YSwgMik7Cit9CisKKy8qIFdyaXRlIG91dCBmb250IGRpcmVjdG9yeSBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tCisgICB0aGUgZm9udCBkYXRhLiAgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX3JjX2ZvbnRkaXIgKGUsIGZvbnRkaXIpCisgICAgIEZJTEUgKmU7CisgICAgIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmb250ZGlyOworeworICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZmM7CisKKyAgZm9yIChmYyA9IGZvbnRkaXI7IGZjICE9IE5VTEw7IGZjID0gZmMtPm5leHQpCisgICAgeworICAgICAgZnByaW50ZiAoZSwgIi8vIEZvbnQgaW5kZXg6ICVkXG4iLCBmYy0+aW5kZXgpOworICAgICAgd3JpdGVfcmNfZmlsZWRhdGEgKGUsIGZjLT5sZW5ndGgsIGZjLT5kYXRhKTsKKyAgICB9Cit9CisKKy8qIFdyaXRlIG91dCBncm91cCBpY29uIGRhdGEuICBUaGlzIHdvdWxkIG5vcm1hbGx5IGJlIGJ1aWx0IGZyb20gdGhlCisgICBpY29uIGRhdGEuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfZ3JvdXBfaWNvbiAoZSwgZ3JvdXBfaWNvbikKKyAgICAgRklMRSAqZTsKKyAgICAgY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKmdyb3VwX2ljb247Cit7CisgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpnaTsKKworICBmb3IgKGdpID0gZ3JvdXBfaWNvbjsgZ2kgIT0gTlVMTDsgZ2kgPSBnaS0+bmV4dCkKKyAgICB7CisgICAgICBmcHJpbnRmIChlLCAiLy8gd2lkdGg6ICVkOyBoZWlnaHQgJWQ7IGNvbG9yczogJWQ7IHBsYW5lcyAlZDsgYml0cyAlZFxuIiwKKwkgICAgICAgZ2ktPndpZHRoLCBnaS0+aGVpZ2h0LCBnaS0+Y29sb3JzLCBnaS0+cGxhbmVzLCBnaS0+Yml0cyk7CisgICAgICBmcHJpbnRmIChlLCAiLy8gZGF0YSBieXRlczogJWx1OyBpbmRleDogJWRcbiIsCisJICAgICAgIGdpLT5ieXRlcywgZ2ktPmluZGV4KTsKKyAgICB9Cit9CisKKy8qIFdyaXRlIG91dCBhIG1lbnUgcmVzb3VyY2UuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfbWVudSAoZSwgbWVudSwgbWVudWV4KQorICAgICBGSUxFICplOworICAgICBjb25zdCBzdHJ1Y3QgbWVudSAqbWVudTsKKyAgICAgaW50IG1lbnVleDsKK3sKKyAgaWYgKG1lbnUtPmhlbHAgIT0gMCkKKyAgICBmcHJpbnRmIChlLCAiLy8gSGVscCBJRDogJWx1XG4iLCBtZW51LT5oZWxwKTsKKyAgd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtZW51LT5pdGVtcywgbWVudWV4LCAwKTsKK30KKworLyogV3JpdGUgb3V0IG1lbnVpdGVtcy4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9yY19tZW51aXRlbXMgKGUsIG1lbnVpdGVtcywgbWVudWV4LCBpbmQpCisgICAgIEZJTEUgKmU7CisgICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOworICAgICBpbnQgbWVudWV4OworICAgICBpbnQgaW5kOworeworICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOworCisgIGluZGVudCAoZSwgaW5kKTsKKyAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKKworICBmb3IgKG1pID0gbWVudWl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQorICAgIHsKKyAgICAgIGluZGVudCAoZSwgaW5kICsgMik7CisKKyAgICAgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKKwlmcHJpbnRmIChlLCAiTUVOVUlURU0iKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmIChlLCAiUE9QVVAiKTsKKworICAgICAgaWYgKCEgbWVudWV4CisJICAmJiBtaS0+cG9wdXAgPT0gTlVMTAorCSAgJiYgbWktPnRleHQgPT0gTlVMTAorCSAgJiYgbWktPnR5cGUgPT0gMAorCSAgJiYgbWktPmlkID09IDApCisJeworCSAgZnByaW50ZiAoZSwgIiBTRVBBUkFUT1JcbiIpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAobWktPnRleHQgPT0gTlVMTCkKKwlmcHJpbnRmIChlLCAiIFwiXCIiKTsKKyAgICAgIGVsc2UKKwl7CisJICBmcHJpbnRmIChlLCAiIFwiIik7CisJICB1bmljb2RlX3ByaW50IChlLCBtaS0+dGV4dCwgLTEpOworCSAgZnByaW50ZiAoZSwgIlwiIik7CisJfQorCisgICAgICBpZiAoISBtZW51ZXgpCisJeworCSAgaWYgKG1pLT5wb3B1cCA9PSBOVUxMKQorCSAgICBmcHJpbnRmIChlLCAiLCAlZCIsIG1pLT5pZCk7CisKKwkgIGlmICgobWktPnR5cGUgJiBNRU5VSVRFTV9DSEVDS0VEKSAhPSAwKQorCSAgICBmcHJpbnRmIChlLCAiLCBDSEVDS0VEIik7CisJICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fR1JBWUVEKSAhPSAwKQorCSAgICBmcHJpbnRmIChlLCAiLCBHUkFZRUQiKTsKKwkgIGlmICgobWktPnR5cGUgJiBNRU5VSVRFTV9IRUxQKSAhPSAwKQorCSAgICBmcHJpbnRmIChlLCAiLCBIRUxQIik7CisJICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fSU5BQ1RJVkUpICE9IDApCisJICAgIGZwcmludGYgKGUsICIsIElOQUNUSVZFIik7CisJICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fTUVOVUJBUkJSRUFLKSAhPSAwKQorCSAgICBmcHJpbnRmIChlLCAiLCBNRU5VQkFSQlJFQUsiKTsKKwkgIGlmICgobWktPnR5cGUgJiBNRU5VSVRFTV9NRU5VQlJFQUspICE9IDApCisJICAgIGZwcmludGYgKGUsICIsIE1FTlVCUkVBSyIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAobWktPmlkICE9IDAgfHwgbWktPnR5cGUgIT0gMCB8fCBtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBtaS0+aWQpOworCSAgICAgIGlmIChtaS0+dHlwZSAhPSAwIHx8IG1pLT5zdGF0ZSAhPSAwIHx8IG1pLT5oZWxwICE9IDApCisJCXsKKwkJICBmcHJpbnRmIChlLCAiLCAlbHUiLCBtaS0+dHlwZSk7CisJCSAgaWYgKG1pLT5zdGF0ZSAhPSAwIHx8IG1pLT5oZWxwICE9IDApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYgKGUsICIsICVsdSIsIG1pLT5zdGF0ZSk7CisJCSAgICAgIGlmIChtaS0+aGVscCAhPSAwKQorCQkJZnByaW50ZiAoZSwgIiwgJWx1IiwgbWktPmhlbHApOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGZwcmludGYgKGUsICJcbiIpOworCisgICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCisJd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtaS0+cG9wdXAsIG1lbnVleCwgaW5kICsgMik7CisgICAgfQorCisgIGluZGVudCAoZSwgaW5kKTsKKyAgZnByaW50ZiAoZSwgIkVORFxuIik7Cit9CisKKy8qIFdyaXRlIG91dCBhbiByY2RhdGEgcmVzb3VyY2UuICBUaGlzIGlzIGFsc28gdXNlZCBmb3Igb3RoZXIgdHlwZXMgb2YKKyAgIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gcHJpbnQgYXJiaXRyYXJ5IGRhdGEuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfcmNkYXRhIChlLCByY2RhdGEsIGluZCkKKyAgICAgRklMRSAqZTsKKyAgICAgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGE7CisgICAgIGludCBpbmQ7Cit7CisgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7CisKKyAgaW5kZW50IChlLCBpbmQpOworICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOworCisgIGZvciAocmkgPSByY2RhdGE7IHJpICE9IE5VTEw7IHJpID0gcmktPm5leHQpCisgICAgeworICAgICAgaWYgKHJpLT50eXBlID09IFJDREFUQV9CVUZGRVIgJiYgcmktPnUuYnVmZmVyLmxlbmd0aCA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICBpbmRlbnQgKGUsIGluZCArIDIpOworCisgICAgICBzd2l0Y2ggKHJpLT50eXBlKQorCXsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisKKwljYXNlIFJDREFUQV9XT1JEOgorCSAgZnByaW50ZiAoZSwgIiVkIiwgcmktPnUud29yZCk7CisJICBicmVhazsKKworCWNhc2UgUkNEQVRBX0RXT1JEOgorCSAgZnByaW50ZiAoZSwgIiVsdUwiLCByaS0+dS5kd29yZCk7CisJICBicmVhazsKKworCWNhc2UgUkNEQVRBX1NUUklORzoKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqczsKKwkgICAgdW5zaWduZWQgbG9uZyBpOworCisJICAgIGZwcmludGYgKGUsICJcIiIpOworCSAgICBzID0gcmktPnUuc3RyaW5nLnM7CisJICAgIGZvciAoaSA9IDA7IGkgPCByaS0+dS5zdHJpbmcubGVuZ3RoOyBpKyspCisJICAgICAgeworCQlpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKKwkJICBwdXRjICgqcywgZSk7CisJCWVsc2UKKwkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKnMpOworCSAgICAgIH0KKwkgICAgZnByaW50ZiAoZSwgIlwiIik7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSBSQ0RBVEFfV1NUUklORzoKKwkgIGZwcmludGYgKGUsICJMXCIiKTsKKwkgIHVuaWNvZGVfcHJpbnQgKGUsIHJpLT51LndzdHJpbmcudywgcmktPnUud3N0cmluZy5sZW5ndGgpOworCSAgZnByaW50ZiAoZSwgIlwiIik7CisJICBicmVhazsKKworCWNhc2UgUkNEQVRBX0JVRkZFUjoKKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBpOworCSAgICBpbnQgZmlyc3Q7CisKKwkgICAgLyogQXNzdW1lIGxpdHRsZSBlbmRpYW4gZGF0YS4gICovCisKKwkgICAgZmlyc3QgPSAxOworCSAgICBmb3IgKGkgPSAwOyBpICsgMyA8IHJpLT51LmJ1ZmZlci5sZW5ndGg7IGkgKz0gNCkKKwkgICAgICB7CisJCXVuc2lnbmVkIGxvbmcgbDsKKworCQlsID0gKCgoKCgocmktPnUuYnVmZmVyLmRhdGFbaSArIDNdIDw8IDgpCisJCQkgfCByaS0+dS5idWZmZXIuZGF0YVtpICsgMl0pIDw8IDgpCisJCSAgICAgICB8IHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAxXSkgPDwgOCkKKwkJICAgICB8IHJpLT51LmJ1ZmZlci5kYXRhW2ldKTsKKwkJaWYgKGZpcnN0KQorCQkgIGZpcnN0ID0gMDsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGZwcmludGYgKGUsICIsXG4iKTsKKwkJICAgIGluZGVudCAoZSwgaW5kICsgMik7CisJCSAgfQorCQlmcHJpbnRmIChlLCAiJWx1TCIsIGwpOworCSAgICAgIH0KKworCSAgICBpZiAoaSArIDEgPCByaS0+dS5idWZmZXIubGVuZ3RoKQorCSAgICAgIHsKKwkJaW50IGk7CisKKwkJaSA9IChyaS0+dS5idWZmZXIuZGF0YVtpICsgMV0gPDwgOCkgfCByaS0+dS5idWZmZXIuZGF0YVtpXTsKKwkJaWYgKGZpcnN0KQorCQkgIGZpcnN0ID0gMDsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGZwcmludGYgKGUsICIsXG4iKTsKKwkJICAgIGluZGVudCAoZSwgaW5kICsgMik7CisJCSAgfQorCQlmcHJpbnRmIChlLCAiJWQiLCBpKTsKKwkJaSArPSAyOworCSAgICAgIH0KKworCSAgICBpZiAoaSA8IHJpLT51LmJ1ZmZlci5sZW5ndGgpCisJICAgICAgeworCQlpZiAoZmlyc3QpCisJCSAgZmlyc3QgPSAwOworCQllbHNlCisJCSAgeworCQkgICAgZnByaW50ZiAoZSwgIixcbiIpOworCQkgICAgaW5kZW50IChlLCBpbmQgKyAyKTsKKwkJICB9CisJCWlmICgocmktPnUuYnVmZmVyLmRhdGFbaV0gJiAweDdmKSA9PSByaS0+dS5idWZmZXIuZGF0YVtpXQorCQkgICAgJiYgaXNwcmludCAocmktPnUuYnVmZmVyLmRhdGFbaV0pKQorCQkgIGZwcmludGYgKGUsICJcIiVjXCIiLCByaS0+dS5idWZmZXIuZGF0YVtpXSk7CisJCWVsc2UKKwkJICBmcHJpbnRmIChlLCAiXCJcJTAzb1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOworCSAgICAgIH0KKworCSAgICBicmVhazsKKwkgIH0KKwl9CisKKyAgICAgIGlmIChyaS0+bmV4dCAhPSBOVUxMKQorCWZwcmludGYgKGUsICIsIik7CisgICAgICBmcHJpbnRmIChlLCAiXG4iKTsKKyAgICB9CisKKyAgaW5kZW50IChlLCBpbmQpOworICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKK30KKworLyogV3JpdGUgb3V0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfc3RyaW5ndGFibGUgKGUsIG5hbWUsIHN0cmluZ3RhYmxlKQorICAgICBGSUxFICplOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOworICAgICBjb25zdCBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0cmluZ3RhYmxlOworeworICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgaW50IGk7CisKKyAgaWYgKG5hbWUgIT0gTlVMTCAmJiAhIG5hbWUtPm5hbWVkKQorICAgIG9mZnNldCA9IChuYW1lLT51LmlkIC0gMSkgPDwgNDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKGUsICIvLyAlcyBzdHJpbmcgdGFibGUgbmFtZVxuIiwKKwkgICAgICAgbmFtZSA9PSBOVUxMID8gIk1pc3NpbmciIDogIkludmFsaWQiKTsKKyAgICAgIG9mZnNldCA9IDA7CisgICAgfQorCisgIGZwcmludGYgKGUsICJCRUdJTlxuIik7CisKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgaWYgKHN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLmxlbmd0aCAhPSAwKQorCXsKKwkgIGZwcmludGYgKGUsICIgICVsdSwgXCIiLCBvZmZzZXQgKyBpKTsKKwkgIHVuaWNvZGVfcHJpbnQgKGUsIHN0cmluZ3RhYmxlLT5zdHJpbmdzW2ldLnN0cmluZywKKwkJCSBzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGgpOworCSAgZnByaW50ZiAoZSwgIlwiXG4iKTsKKwl9CisgICAgfQorCisgIGZwcmludGYgKGUsICJFTkRcbiIpOworfQorCisvKiBXcml0ZSBvdXQgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZS4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9yY192ZXJzaW9uaW5mbyAoZSwgdmVyc2lvbmluZm8pCisgICAgIEZJTEUgKmU7CisgICAgIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87Cit7CisgIGNvbnN0IHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbyAqZjsKKyAgY29uc3Qgc3RydWN0IHZlcl9pbmZvICp2aTsKKworICBmID0gdmVyc2lvbmluZm8tPmZpeGVkOworICBpZiAoZi0+ZmlsZV92ZXJzaW9uX21zICE9IDAgfHwgZi0+ZmlsZV92ZXJzaW9uX2xzICE9IDApCisgICAgZnByaW50ZiAoZSwgIiBGSUxFVkVSU0lPTiAlbHUsICVsdSwgJWx1LCAlbHVcbiIsCisJICAgICAoZi0+ZmlsZV92ZXJzaW9uX21zID4+IDE2KSAmIDB4ZmZmZiwKKwkgICAgIGYtPmZpbGVfdmVyc2lvbl9tcyAmIDB4ZmZmZiwKKwkgICAgIChmLT5maWxlX3ZlcnNpb25fbHMgPj4gMTYpICYgMHhmZmZmLAorCSAgICAgZi0+ZmlsZV92ZXJzaW9uX2xzICYgMHhmZmZmKTsKKyAgaWYgKGYtPnByb2R1Y3RfdmVyc2lvbl9tcyAhPSAwIHx8IGYtPnByb2R1Y3RfdmVyc2lvbl9scyAhPSAwKQorICAgIGZwcmludGYgKGUsICIgUFJPRFVDVFZFUlNJT04gJWx1LCAlbHUsICVsdSwgJWx1XG4iLAorCSAgICAgKGYtPnByb2R1Y3RfdmVyc2lvbl9tcyA+PiAxNikgJiAweGZmZmYsCisJICAgICBmLT5wcm9kdWN0X3ZlcnNpb25fbXMgJiAweGZmZmYsCisJICAgICAoZi0+cHJvZHVjdF92ZXJzaW9uX2xzID4+IDE2KSAmIDB4ZmZmZiwKKwkgICAgIGYtPnByb2R1Y3RfdmVyc2lvbl9scyAmIDB4ZmZmZik7CisgIGlmIChmLT5maWxlX2ZsYWdzX21hc2sgIT0gMCkKKyAgICBmcHJpbnRmIChlLCAiIEZJTEVGTEFHU01BU0sgMHglbHhcbiIsIGYtPmZpbGVfZmxhZ3NfbWFzayk7CisgIGlmIChmLT5maWxlX2ZsYWdzICE9IDApCisgICAgZnByaW50ZiAoZSwgIiBGSUxFRkxBR1MgMHglbHhcbiIsIGYtPmZpbGVfZmxhZ3MpOworICBpZiAoZi0+ZmlsZV9vcyAhPSAwKQorICAgIGZwcmludGYgKGUsICIgRklMRU9TIDB4JWx4XG4iLCBmLT5maWxlX29zKTsKKyAgaWYgKGYtPmZpbGVfdHlwZSAhPSAwKQorICAgIGZwcmludGYgKGUsICIgRklMRVRZUEUgMHglbHhcbiIsIGYtPmZpbGVfdHlwZSk7CisgIGlmIChmLT5maWxlX3N1YnR5cGUgIT0gMCkKKyAgICBmcHJpbnRmIChlLCAiIEZJTEVTVUJUWVBFIDB4JWx4XG4iLCBmLT5maWxlX3N1YnR5cGUpOworICBpZiAoZi0+ZmlsZV9kYXRlX21zICE9IDAgfHwgZi0+ZmlsZV9kYXRlX2xzICE9IDApCisgICAgZnByaW50ZiAoZSwgIi8vIERhdGU6ICVsdSwgJWx1XG4iLCBmLT5maWxlX2RhdGVfbXMsIGYtPmZpbGVfZGF0ZV9scyk7CisKKyAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKKworICBmb3IgKHZpID0gdmVyc2lvbmluZm8tPnZhcjsgdmkgIT0gTlVMTDsgdmkgPSB2aS0+bmV4dCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHZpLT50eXBlKQorCXsKKwljYXNlIFZFUklORk9fU1RSSU5HOgorCSAgeworCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzOworCisJICAgIGZwcmludGYgKGUsICIgIEJMT0NLIFwiU3RyaW5nRmlsZUluZm9cIlxuIik7CisJICAgIGZwcmludGYgKGUsICIgIEJFR0lOXG4iKTsKKwkgICAgZnByaW50ZiAoZSwgIiAgICBCTE9DSyBcIiIpOworCSAgICB1bmljb2RlX3ByaW50IChlLCB2aS0+dS5zdHJpbmcubGFuZ3VhZ2UsIC0xKTsKKwkgICAgZnByaW50ZiAoZSwgIlwiXG4iKTsKKwkgICAgZnByaW50ZiAoZSwgIiAgICBCRUdJTlxuIik7CisKKwkgICAgZm9yICh2cyA9IHZpLT51LnN0cmluZy5zdHJpbmdzOyB2cyAhPSBOVUxMOyB2cyA9IHZzLT5uZXh0KQorCSAgICAgIHsKKwkJZnByaW50ZiAoZSwgIiAgICAgIFZBTFVFIFwiIik7CisJCXVuaWNvZGVfcHJpbnQgKGUsIHZzLT5rZXksIC0xKTsKKwkJZnByaW50ZiAoZSwgIlwiLCBcIiIpOworCQl1bmljb2RlX3ByaW50IChlLCB2cy0+dmFsdWUsIC0xKTsKKwkJZnByaW50ZiAoZSwgIlwiXG4iKTsKKwkgICAgICB9CisKKwkgICAgZnByaW50ZiAoZSwgIiAgICBFTkRcbiIpOworCSAgICBmcHJpbnRmIChlLCAiICBFTkRcbiIpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgVkVSSU5GT19WQVI6CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCB2ZXJfdmFyaW5mbyAqdnY7CisKKwkgICAgZnByaW50ZiAoZSwgIiAgQkxPQ0sgXCJWYXJGaWxlSW5mb1wiXG4iKTsKKwkgICAgZnByaW50ZiAoZSwgIiAgQkVHSU5cbiIpOworCSAgICBmcHJpbnRmIChlLCAiICAgIFZBTFVFIFwiIik7CisJICAgIHVuaWNvZGVfcHJpbnQgKGUsIHZpLT51LnZhci5rZXksIC0xKTsKKwkgICAgZnByaW50ZiAoZSwgIlwiIik7CisKKwkgICAgZm9yICh2diA9IHZpLT51LnZhci52YXI7IHZ2ICE9IE5VTEw7IHZ2ID0gdnYtPm5leHQpCisJICAgICAgZnByaW50ZiAoZSwgIiwgMHgleCwgJWQiLCAodW5zaWduZWQgaW50KSB2di0+bGFuZ3VhZ2UsCisJCSAgICAgICB2di0+Y2hhcnNldCk7CisKKwkgICAgZnByaW50ZiAoZSwgIlxuICBFTkRcbiIpOworCisJICAgIGJyZWFrOworCSAgfQorCX0KKyAgICB9CisKKyAgZnByaW50ZiAoZSwgIkVORFxuIik7Cit9CisKKy8qIFdyaXRlIG91dCBkYXRhIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHJlYWQgZnJvbSBhIGZpbGUuICAqLworCitzdGF0aWMgdm9pZAord3JpdGVfcmNfZmlsZWRhdGEgKGUsIGxlbmd0aCwgZGF0YSkKKyAgICAgRklMRSAqZTsKKyAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Cit7CisgIHVuc2lnbmVkIGxvbmcgaTsKKworICBmb3IgKGkgPSAwOyBpICsgMTUgPCBsZW5ndGg7IGkgKz0gMTYpCisgICAgeworICAgICAgZnByaW50ZiAoZSwgIi8vICU0bHg6ICIsIGkpOworICAgICAgZnByaW50ZiAoZSwgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAiLAorCSAgICAgICBkYXRhW2kgKyAwXSwgZGF0YVtpICsgMV0sIGRhdGFbaSArIDJdLCBkYXRhW2kgKyAzXSwKKwkgICAgICAgZGF0YVtpICsgNF0sIGRhdGFbaSArIDVdLCBkYXRhW2kgKyA2XSwgZGF0YVtpICsgN10pOworICAgICAgZnByaW50ZiAoZSwgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkgICAgICAgZGF0YVtpICsgIDhdLCBkYXRhW2kgKyAgOV0sIGRhdGFbaSArIDEwXSwgZGF0YVtpICsgMTFdLAorCSAgICAgICBkYXRhW2kgKyAxMl0sIGRhdGFbaSArIDEzXSwgZGF0YVtpICsgMTRdLCBkYXRhW2kgKyAxNV0pOworICAgIH0KKworICBpZiAoaSA8IGxlbmd0aCkKKyAgICB7CisgICAgICBmcHJpbnRmIChlLCAiLy8gJTRseDoiLCBpKTsKKyAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKQorCXsKKwkgIGZwcmludGYgKGUsICIgJTAyeCIsIGRhdGFbaV0pOworCSAgKytpOworCX0KKyAgICAgIGZwcmludGYgKGUsICJcbiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc3Jlcy5jIGIvYmludXRpbHMvcmVzcmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyNjRmNAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Jlc3Jlcy5jCkBAIC0wLDAgKzEsNjU2IEBACisvKiByZXNyZXMuYzogcmVhZF9yZXNfZmlsZSBhbmQgd3JpdGVfcmVzX2ZpbGUgaW1wbGVtZW50YXRpb24gZm9yIHdpbmRyZXMuCisKKyAgIENvcHlyaWdodCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBBbmRlcnMgTm9ybGFuZGVyIDxhbm9ybGFuZEBoZW0yLnBhc3NhZ2VuLnNlPi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgIndpbmRyZXMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworc3RydWN0IHJlc19oZHIKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplOworICAgIHVuc2lnbmVkIGxvbmcgaGVhZGVyX3NpemU7CisgIH07CisKK3N0YXRpYyB2b2lkIHdyaXRlX3Jlc19kaXJlY3RvcnkKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKKwkgICBpbnQgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yZXNfcmVzb3VyY2UKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCisJICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQgKikpOworc3RhdGljIHZvaWQgd3JpdGVfcmVzX2JpbgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOworCitzdGF0aWMgdm9pZCB3cml0ZV9yZXNfaWQgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7CitzdGF0aWMgdm9pZCB3cml0ZV9yZXNfaW5mbyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3Jlc19kYXRhIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3Jlc19oZWFkZXIKKyAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCisJICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7CisKK3N0YXRpYyBpbnQgcmVhZF9yZXNvdXJjZV9lbnRyeSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCByZWFkX3Jlc19kYXRhIFBBUkFNUyAoKHZvaWQgKiwgc2l6ZV90LCBpbnQpKTsKK3N0YXRpYyB2b2lkIHJlYWRfcmVzX2lkIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKikpOworc3RhdGljIHVuaWNoYXIgKnJlYWRfdW5pc3RyaW5nIFBBUkFNUyAoKGludCAqKSk7CitzdGF0aWMgdm9pZCBza2lwX251bGxfcmVzb3VyY2UgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfaWRfc2l6ZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKK3N0YXRpYyB2b2lkIHJlc19hbGlnbl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKKyAgcmVzX2FkZF9yZXNvdXJjZQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKKwkgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCwgaW50KSk7CisKK3ZvaWQKKyAgcmVzX2FwcGVuZF9yZXNvdXJjZQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgc3RydWN0IHJlc19yZXNvdXJjZSAqLAorCSAgIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXMgPSBOVUxMOworCitzdGF0aWMgRklMRSAqZnJlczsKK3N0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKKworZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsKKworLyogUmVhZCByZXNvdXJjZSBmaWxlICovCitzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCityZWFkX3Jlc19maWxlIChmbikKKyAgICAgY29uc3QgY2hhciAqZm47Cit7CisgIGZpbGVuYW1lID0gZm47CisgIGZyZXMgPSBmb3BlbiAoZmlsZW5hbWUsICJyYiIpOworICBpZiAoZnJlcyA9PSBOVUxMKQorICAgIGZhdGFsICgiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOworCisgIHNraXBfbnVsbF9yZXNvdXJjZSAoKTsKKworICB3aGlsZSAocmVhZF9yZXNvdXJjZV9lbnRyeSAoKSkKKyAgICA7CisKKyAgZmNsb3NlIChmcmVzKTsKKworICByZXR1cm4gcmVzb3VyY2VzOworfQorCisvKiBXcml0ZSByZXNvdXJjZSBmaWxlICovCit2b2lkCit3cml0ZV9yZXNfZmlsZSAoZm4sIHJlc2RpcikKKyAgICAgY29uc3QgY2hhciAqZm47CisgICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Cit7CisgIGludCBsYW5ndWFnZTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2lnbltdID0KKyAgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworICBsb25nIGZwb3M7CisKKyAgZmlsZW5hbWUgPSBmbjsKKworICBmcmVzID0gZm9wZW4gKGZpbGVuYW1lLCAid2IiKTsKKyAgaWYgKGZyZXMgPT0gTlVMTCkKKyAgICBmYXRhbCAoImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKworICAvKiBXcml0ZSAzMiBiaXQgcmVzb3VyY2Ugc2lnbmF0dXJlICovCisgIHdyaXRlX3Jlc19kYXRhIChzaWduLCBzaXplb2YgKHNpZ24pLCAxKTsKKworICAvKiB3cml0ZSByZXNvdXJjZXMgKi8KKworICBsYW5ndWFnZSA9IC0xOworICB3cml0ZV9yZXNfZGlyZWN0b3J5IChyZXNkaXIsIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsCisJCSAgICAgICAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAmbGFuZ3VhZ2UsIDEpOworCisgIC8qIGVuZCBmaWxlIG9uIERXT1JEIGJvdW5kYXJ5ICovCisgIGZwb3MgPSBmdGVsbCAoZnJlcyk7CisgIGlmIChmcG9zICUgNCkKKyAgICB3cml0ZV9yZXNfZGF0YSAoc2lnbiwgZnBvcyAlIDQsIDEpOworCisgIGZjbG9zZSAoZnJlcyk7Cit9CisKKy8qIFJlYWQgYSByZXNvdXJjZSBlbnRyeSwgcmV0dXJucyAwIHdoZW4gYWxsIHJlc291cmNlcyBhcmUgcmVhZCAqLworc3RhdGljIGludAorcmVhZF9yZXNvdXJjZV9lbnRyeSAodm9pZCkKK3sKKyAgc3RydWN0IHJlc19pZCB0eXBlOworICBzdHJ1Y3QgcmVzX2lkIG5hbWU7CisgIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzaW5mbzsKKyAgc3RydWN0IHJlc19oZHIgcmVzaGRyOworICBsb25nIHZlcnNpb247CisgIHZvaWQgKmJ1ZmY7CisKKyAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKKworICByZXNfYWxpZ25fZmlsZSAoKTsKKworICAvKiBSZWFkIGhlYWRlciAqLworICBpZiAoZnJlYWQgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSwgZnJlcykgIT0gMSkKKyAgICByZXR1cm4gMDsKKworICAvKiByZWFkIHJlc291cmNlIHR5cGUgKi8KKyAgcmVhZF9yZXNfaWQgKCZ0eXBlKTsKKyAgLyogcmVhZCByZXNvdXJjZSBpZCAqLworICByZWFkX3Jlc19pZCAoJm5hbWUpOworCisgIHJlc19hbGlnbl9maWxlICgpOworCisgIC8qIFJlYWQgYWRkaXRpb25hbCByZXNvdXJjZSBoZWFkZXIgKi8KKyAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8udmVyc2lvbiwgc2l6ZW9mIChyZXNpbmZvLnZlcnNpb24pLCAxKTsKKyAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8ubWVtZmxhZ3MsIHNpemVvZiAocmVzaW5mby5tZW1mbGFncyksIDEpOworICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5sYW5ndWFnZSwgc2l6ZW9mIChyZXNpbmZvLmxhbmd1YWdlKSwgMSk7CisgIHJlYWRfcmVzX2RhdGEgKCZ2ZXJzaW9uLCBzaXplb2YgKHZlcnNpb24pLCAxKTsKKyAgcmVhZF9yZXNfZGF0YSAoJnJlc2luZm8uY2hhcmFjdGVyaXN0aWNzLCBzaXplb2YgKHJlc2luZm8uY2hhcmFjdGVyaXN0aWNzKSwgMSk7CisKKyAgcmVzX2FsaWduX2ZpbGUgKCk7CisKKyAgLyogQWxsb2NhdGUgYnVmZmVyIGZvciBkYXRhICovCisgIGJ1ZmYgPSByZXNfYWxsb2MgKHJlc2hkci5kYXRhX3NpemUpOworICAvKiBSZWFkIGRhdGEgKi8KKyAgcmVhZF9yZXNfZGF0YSAoYnVmZiwgcmVzaGRyLmRhdGFfc2l6ZSwgMSk7CisgIC8qIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gcmVzb3VyY2UgKi8KKyAgciA9IGJpbl90b19yZXMgKHR5cGUsIGJ1ZmYsIHJlc2hkci5kYXRhX3NpemUsIDApOworICByLT5yZXNfaW5mbyA9IHJlc2luZm87CisgIC8qIEFkZCByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkgKi8KKyAgcmVzX2FkZF9yZXNvdXJjZSAociwgJnR5cGUsICZuYW1lLCByZXNpbmZvLmxhbmd1YWdlLCAwKTsKKworICByZXR1cm4gMTsKK30KKworLyogd3JpdGUgcmVzb3VyY2UgZGlyZWN0b3J5IHRvIGJpbmFyeSByZXNvdXJjZSBmaWxlICovCitzdGF0aWMgdm9pZAord3JpdGVfcmVzX2RpcmVjdG9yeSAocmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKKyAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOworICAgICBpbnQgKmxhbmd1YWdlOworICAgICBpbnQgbGV2ZWw7Cit7CisgIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOworCisgIGZvciAocmUgPSByZC0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGxldmVsKQorCXsKKwljYXNlIDE6CisJICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAxLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlCisJICAgICB0eXBlLiAgVGhpcyBub3JtYWxseSBkdXBsaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlCisJICAgICBzdG9yZWQgd2l0aCB0aGUgcmVzb3VyY2UgaXRzZWxmLCBidXQgd2UgbmVlZCB0byByZW1lbWJlcgorCSAgICAgdGhlIHR5cGUgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lIHJlc291cmNlIHR5cGUuICAqLworCSAgdHlwZSA9ICZyZS0+aWQ7CisJICBicmVhazsKKworCWNhc2UgMjoKKwkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDIsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUgbmFtZQorCSAgICAgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbiB0aGUgcmMgcHJpbnRvdXQuICovCisJICBuYW1lID0gJnJlLT5pZDsKKwkgIGJyZWFrOworCisJY2FzZSAzOgorCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMywgdGhlbiB0aGlzIGtleSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UuCisJICAgICBVc2UgaXQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAgKi8KKwkgIGlmICghcmUtPmlkLm5hbWVkCisJICAgICAgJiYgcmUtPmlkLnUuaWQgIT0gKmxhbmd1YWdlCisJICAgICAgJiYgKHJlLT5pZC51LmlkICYgMHhmZmZmKSA9PSByZS0+aWQudS5pZCkKKwkgICAgeworCSAgICAgICpsYW5ndWFnZSA9IHJlLT5pZC51LmlkOworCSAgICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChyZS0+c3ViZGlyKQorCXdyaXRlX3Jlc19kaXJlY3RvcnkgKHJlLT51LmRpciwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsICsgMSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKGxldmVsID09IDMpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBub3JtYWwgY2FzZTogdGhlIHRocmVlIGxldmVscyBhcmUKKwkgICAgICAgICBUWVBFL05BTUUvTEFOR1VBR0UuICBOQU1FIHdpbGwgaGF2ZSBiZWVuIHNldCBhdCBsZXZlbAorCSAgICAgICAgIDIsIGFuZCByZXByZXNlbnRzIHRoZSBuYW1lIHRvIHVzZS4gIFdlIHByb2JhYmx5IGp1c3QKKwkgICAgICAgICBzZXQgTEFOR1VBR0UsIGFuZCBpdCB3aWxsIHByb2JhYmx5IG1hdGNoIHdoYXQgdGhlCisJICAgICAgICAgcmVzb3VyY2UgaXRzZWxmIHJlY29yZHMgaWYgYW55dGhpbmcuICAqLworCSAgICAgIHdyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgbmFtZSwgcmUtPnUucmVzLCBsYW5ndWFnZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIi8vIFJlc291cmNlIGF0IHVuZXhwZWN0ZWQgbGV2ZWwgJWRcbiIsIGxldmVsKTsKKwkgICAgICB3cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIChzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIHJlLT51LnJlcywKKwkJCQkgIGxhbmd1YWdlKTsKKwkgICAgfQorCX0KKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgbmFtZSwgcmVzLCBsYW5ndWFnZSkKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOworICAgICBpbnQgKmxhbmd1YWdlOworeworICBpbnQgcnQ7CisKKyAgc3dpdGNoIChyZXMtPnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKworICAgIGNhc2UgUkVTX1RZUEVfQUNDRUxFUkFUT1I6CisgICAgICBydCA9IFJUX0FDQ0VMRVJBVE9SOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKKyAgICAgIHJ0ID0gUlRfQklUTUFQOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKKyAgICAgIHJ0ID0gUlRfQ1VSU09SOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKKyAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09SOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKKyAgICAgIHJ0ID0gUlRfRElBTE9HOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6CisgICAgICBydCA9IFJUX0ZPTlQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKKyAgICAgIHJ0ID0gUlRfRk9OVERJUjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9JQ09OOgorICAgICAgcnQgPSBSVF9JQ09OOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046CisgICAgICBydCA9IFJUX0dST1VQX0lDT047CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKKyAgICAgIHJ0ID0gUlRfTUVOVTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6CisgICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6CisgICAgICBydCA9IFJUX1JDREFUQTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKKyAgICAgIHJ0ID0gUlRfU1RSSU5HOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX1VTRVJEQVRBOgorICAgICAgcnQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU19UWVBFX1ZFUlNJT05JTkZPOgorICAgICAgcnQgPSBSVF9WRVJTSU9OOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChydCAhPSAwCisgICAgICAmJiB0eXBlICE9IE5VTEwKKyAgICAgICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9IHJ0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIvLyBVbmV4cGVjdGVkIHJlc291cmNlIHR5cGUgbWlzbWF0Y2g6ICIpOworICAgICAgcmVzX2lkX3ByaW50IChzdGRlcnIsICp0eXBlLCAxKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAhPSAlZCIsIHJ0KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICB3cml0ZV9yZXNfYmluIChyZXMsIHR5cGUsIG5hbWUsICZyZXMtPnJlc19pbmZvKTsKKyAgcmV0dXJuOworfQorCisvKiBXcml0ZSBhIHJlc291cmNlIGluIGJpbmFyeSByZXNvdXJjZSBmb3JtYXQgKi8KK3N0YXRpYyB2b2lkCit3cml0ZV9yZXNfYmluIChyZXMsIHR5cGUsIG5hbWUsIHJlc2luZm8pCisgICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKK3sKKyAgdW5zaWduZWQgbG9uZyBkYXRhc2l6ZSA9IDA7CisgIGNvbnN0IHN0cnVjdCBiaW5kYXRhICpiaW5fcmVwLCAqZGF0YTsKKworICBiaW5fcmVwID0gcmVzX3RvX2JpbiAocmVzLCAwKTsKKyAgZm9yIChkYXRhID0gYmluX3JlcDsgZGF0YSAhPSBOVUxMOyBkYXRhID0gZGF0YS0+bmV4dCkKKyAgICBkYXRhc2l6ZSArPSBkYXRhLT5sZW5ndGg7CisKKyAgd3JpdGVfcmVzX2hlYWRlciAoZGF0YXNpemUsIHR5cGUsIG5hbWUsIHJlc2luZm8pOworCisgIGZvciAoZGF0YSA9IGJpbl9yZXA7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpCisgICAgd3JpdGVfcmVzX2RhdGEgKGRhdGEtPmRhdGEsIGRhdGEtPmxlbmd0aCwgMSk7Cit9CisKKy8qIEdldCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGFuIGlkIGluIGJpbmFyeSBmb3JtYXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitnZXRfaWRfc2l6ZSAoaWQpCisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOworeworICBpZiAoaWQtPm5hbWVkKQorICAgIHJldHVybiBzaXplb2YgKHVuaWNoYXIpICogKGlkLT51Lm4ubGVuZ3RoICsgMSk7CisgIGVsc2UKKyAgICByZXR1cm4gc2l6ZW9mICh1bmljaGFyKSAqIDI7Cit9CisKKy8qIFdyaXRlIGEgcmVzb3VyY2UgaGVhZGVyICovCitzdGF0aWMgdm9pZAord3JpdGVfcmVzX2hlYWRlciAoZGF0YXNpemUsIHR5cGUsIG5hbWUsIHJlc2luZm8pCisgICAgIHVuc2lnbmVkIGxvbmcgZGF0YXNpemU7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Cit7CisgIHN0cnVjdCByZXNfaGRyIHJlc2hkcjsKKyAgcmVzaGRyLmRhdGFfc2l6ZSA9IGRhdGFzaXplOworICByZXNoZHIuaGVhZGVyX3NpemUgPSAyNCArIGdldF9pZF9zaXplICh0eXBlKSArIGdldF9pZF9zaXplIChuYW1lKTsKKworICByZXNfYWxpZ25fZmlsZSAoKTsKKyAgd3JpdGVfcmVzX2RhdGEgKCZyZXNoZHIsIHNpemVvZiAocmVzaGRyKSwgMSk7CisgIHdyaXRlX3Jlc19pZCAodHlwZSk7CisgIHdyaXRlX3Jlc19pZCAobmFtZSk7CisKKyAgcmVzX2FsaWduX2ZpbGUgKCk7CisKKyAgd3JpdGVfcmVzX2luZm8gKHJlc2luZm8pOworICByZXNfYWxpZ25fZmlsZSAoKTsKK30KKworCisvKiBXcml0ZSBkYXRhIHRvIGZpbGUsIGFib3J0IG9uIGZhaWx1cmUgKi8KK3N0YXRpYyB2b2lkCit3cml0ZV9yZXNfZGF0YSAoZGF0YSwgc2l6ZSwgY291bnQpCisgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgIHNpemVfdCBzaXplOworICAgICBpbnQgY291bnQ7Cit7CisgIGlmIChmd3JpdGUgKGRhdGEsIHNpemUsIGNvdW50LCBmcmVzKSAhPSBjb3VudCkKKyAgICBmYXRhbCAoIiVzOiAlczogY291bGQgbm90IHdyaXRlIHRvIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsKK30KKworLyogUmVhZCBkYXRhIGZyb20gZmlsZSwgYWJvcnQgb24gZmFpbHVyZSAqLworc3RhdGljIHZvaWQKK3JlYWRfcmVzX2RhdGEgKGRhdGEsIHNpemUsIGNvdW50KQorICAgICB2b2lkICpkYXRhOworICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgaW50IGNvdW50OworeworICBpZiAoZnJlYWQgKGRhdGEsIHNpemUsIGNvdW50LCBmcmVzKSAhPSBjb3VudCkKKyAgICBmYXRhbCAoIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOworfQorCisvKiBXcml0ZSBhIHJlc291cmNlIGlkICovCitzdGF0aWMgdm9pZAord3JpdGVfcmVzX2lkIChpZCkKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Cit7CisgIGlmIChpZC0+bmFtZWQpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBsZW4gPSBpZC0+dS5uLmxlbmd0aDsKKyAgICAgIHVuaWNoYXIgbnVsbF90ZXJtID0gMDsKKyAgICAgIHdyaXRlX3Jlc19kYXRhIChpZC0+dS5uLm5hbWUsIGxlbiAqIHNpemVvZiAodW5pY2hhciksIDEpOworICAgICAgd3JpdGVfcmVzX2RhdGEgKCZudWxsX3Rlcm0sIHNpemVvZiAobnVsbF90ZXJtKSwgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgaSA9IDB4RkZGRjsKKyAgICAgIHdyaXRlX3Jlc19kYXRhICgmaSwgc2l6ZW9mIChpKSwgMSk7CisgICAgICBpID0gaWQtPnUuaWQ7CisgICAgICB3cml0ZV9yZXNfZGF0YSAoJmksIHNpemVvZiAoaSksIDEpOworICAgIH0KK30KKworLyogV3JpdGUgcmVzb3VyY2UgaW5mbyAqLworc3RhdGljIHZvaWQKK3dyaXRlX3Jlc19pbmZvIChpbmZvKQorICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICppbmZvOworeworICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPnZlcnNpb24sIHNpemVvZiAoaW5mby0+dmVyc2lvbiksIDEpOworICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPm1lbWZsYWdzLCBzaXplb2YgKGluZm8tPm1lbWZsYWdzKSwgMSk7CisgIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+bGFuZ3VhZ2UsIHNpemVvZiAoaW5mby0+bGFuZ3VhZ2UpLCAxKTsKKyAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT52ZXJzaW9uLCBzaXplb2YgKGluZm8tPnZlcnNpb24pLCAxKTsKKyAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5jaGFyYWN0ZXJpc3RpY3MsIHNpemVvZiAoaW5mby0+Y2hhcmFjdGVyaXN0aWNzKSwgMSk7Cit9CisKKy8qIHJlYWQgYSByZXNvdXJjZSBpZGVudGlmaWVyICovCit2b2lkIAorcmVhZF9yZXNfaWQgKGlkKQorICAgICBzdHJ1Y3QgcmVzX2lkICppZDsKK3sKKyAgdW5zaWduZWQgc2hvcnQgb3JkOworICB1bmljaGFyICppZF9zID0gTlVMTDsKKyAgaW50IGxlbjsKKworICByZWFkX3Jlc19kYXRhICgmb3JkLCBzaXplb2YgKG9yZCksIDEpOworICBpZiAob3JkID09IDB4RkZGRikJCS8qIGFuIG9yZGluYWwgaWQgKi8KKyAgICB7CisgICAgICByZWFkX3Jlc19kYXRhICgmb3JkLCBzaXplb2YgKG9yZCksIDEpOworICAgICAgaWQtPm5hbWVkID0gMDsKKyAgICAgIGlkLT51LmlkID0gb3JkOworICAgIH0KKyAgZWxzZQorICAgIC8qIG5hbWVkIGlkICovCisgICAgeworICAgICAgaWYgKGZzZWVrIChmcmVzLCAtc2l6ZW9mIChvcmQpLCBTRUVLX0NVUikgIT0gMCkKKwlmYXRhbCAoIiVzOiAlczogY291bGQgbm90IHNlZWsgaW4gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOworICAgICAgaWRfcyA9IHJlYWRfdW5pc3RyaW5nICgmbGVuKTsKKyAgICAgIGlkLT5uYW1lZCA9IDE7CisgICAgICBpZC0+dS5uLmxlbmd0aCA9IGxlbjsKKyAgICAgIGlkLT51Lm4ubmFtZSA9IGlkX3M7CisgICAgfQorfQorCisvKiBSZWFkIGEgbnVsbCB0ZXJtaW5hdGVkIFVOSUNPREUgc3RyaW5nICovCitzdGF0aWMgdW5pY2hhciAqCityZWFkX3VuaXN0cmluZyAobGVuKQorICAgICBpbnQgKmxlbjsKK3sKKyAgdW5pY2hhciAqczsKKyAgdW5pY2hhciBjOworICB1bmljaGFyICpwOworICBpbnQgbDsKKworICAqbGVuID0gMDsKKyAgbCA9IDA7CisKKyAgLyogdGhlcmUgYXJlIGhhcmRseSBhbnkgbmFtZXMgbG9uZ2VyIHRoYW4gMjU2IGNoYXJhY3RlcnMgKi8KKyAgcCA9IHMgPSAodW5pY2hhciAqKSB4bWFsbG9jIChzaXplb2YgKHVuaWNoYXIpICogMjU2KTsKKyAgZG8KKyAgICB7CisgICAgICByZWFkX3Jlc19kYXRhICgmYywgc2l6ZW9mIChjKSwgMSk7CisgICAgICAqcCsrID0gYzsKKyAgICAgIGlmIChjICE9IDApCisJbCsrOworICAgIH0KKyAgd2hpbGUgKGMgIT0gMCk7CisgICpsZW4gPSBsOworICByZXR1cm4gczsKK30KKworLyogYWxpZ24gZmlsZSBvbiBEV09SRCBib3VuZGFyeSAqLworc3RhdGljIHZvaWQKK3Jlc19hbGlnbl9maWxlICh2b2lkKQoreworICBpZiAoZnNlZWsgKGZyZXMsIGZ0ZWxsIChmcmVzKSAlIDQsIFNFRUtfQ1VSKSAhPSAwKQorICAgIGZhdGFsICgiJXM6ICVzOiB1bmFibGUgdG8gYWxpZ24gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOworfQorCisvKiBDaGVjayBpZiBmaWxlIGlzIGEgd2luMzIgYmluYXJ5IHJlc291cmNlIGZpbGUsIGlmIHNvCisgICBza2lwIHBhc3QgdGhlIG51bGwgcmVzb3VyY2UuIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBvbgorICAgZXJyb3IuCisgKi8KK3N0YXRpYyB2b2lkCitza2lwX251bGxfcmVzb3VyY2UgKHZvaWQpCit7CisgIHN0cnVjdCByZXNfaGRyIHJlc2hkciA9CisgIHswLCAwfTsKKyAgcmVhZF9yZXNfZGF0YSAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxKTsKKyAgaWYgKChyZXNoZHIuZGF0YV9zaXplICE9IDApIHx8IChyZXNoZHIuaGVhZGVyX3NpemUgIT0gMHgyMCkpCisgICAgZ290byBza2lwX2VycjsKKworICAvKiBTdWJ0cmFjdCBzaXplIG9mIEhlYWRlclNpemUgYW5kIERhdGFTaXplICovCisgIGlmIChmc2VlayAoZnJlcywgcmVzaGRyLmhlYWRlcl9zaXplIC0gOCwgU0VFS19DVVIpICE9IDApCisgICAgZ290byBza2lwX2VycjsKKworICByZXR1cm47CisKK3NraXBfZXJyOgorICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6IE5vdCBhIHZhbGlkIFdJTjMyIHJlc291cmNlIGZpbGVcbiIsIHByb2dyYW1fbmFtZSwKKwkgICBmaWxlbmFtZSk7CisgIHhleGl0ICgxKTsKK30KKworLyogQWRkIGEgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGlyZWN0b3J5ICovCit2b2lkCityZXNfYWRkX3Jlc291cmNlIChyLCB0eXBlLCBpZCwgbGFuZ3VhZ2UsIGR1cG9rKQorICAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKKyAgICAgaW50IGxhbmd1YWdlOworICAgICBpbnQgZHVwb2s7Cit7CisgIHN0cnVjdCByZXNfaWQgYVszXTsKKworICBhWzBdID0gKnR5cGU7CisgIGFbMV0gPSAqaWQ7CisgIGFbMl0ubmFtZWQgPSAwOworICBhWzJdLnUuaWQgPSBsYW5ndWFnZTsKKyAgcmVzX2FwcGVuZF9yZXNvdXJjZSAoJnJlc291cmNlcywgciwgMywgYSwgZHVwb2spOworfQorCisvKiBBcHBlbmQgYSByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkuCisgICBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gZGVmaW5lX3Jlc291cmNlCisgICBhbmQgbW9kaWZpZWQgdG8gYWRkIGFuIGV4aXN0aW5nIHJlc291cmNlLgorICovCit2b2lkCityZXNfYXBwZW5kX3Jlc291cmNlIChyZXNvdXJjZXMsIHJlc291cmNlLCBjaWRzLCBpZHMsIGR1cG9rKQorICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKnJlc291cmNlczsKKyAgICAgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzb3VyY2U7CisgICAgIGludCBjaWRzOworICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZHM7CisgICAgIGludCBkdXBvazsKK3sKKyAgc3RydWN0IHJlc19lbnRyeSAqcmUgPSBOVUxMOworICBpbnQgaTsKKworICBhc3NlcnQgKGNpZHMgPiAwKTsKKyAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7CisKKyAgICAgIGlmICgqcmVzb3VyY2VzID09IE5VTEwpCisJeworCSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXZhbDsKKworCSAgLyogVXNlIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgZXZlcnkgcmVzb3VyY2UgY3JlYXRlZCBpbiBhCisJICAgICBzaW5nbGUgcnVuLiAgKi8KKwkgIGlmICh0aW1ldmFsID09IDApCisJICAgIHRpbWV2YWwgPSB0aW1lIChOVUxMKTsKKworCSAgKnJlc291cmNlcyA9ICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKikKKwkJCXJlc19hbGxvYyAoc2l6ZW9mICoqcmVzb3VyY2VzKSk7CisJICAoKnJlc291cmNlcyktPmNoYXJhY3RlcmlzdGljcyA9IDA7CisJICAoKnJlc291cmNlcyktPnRpbWUgPSB0aW1ldmFsOworCSAgKCpyZXNvdXJjZXMpLT5tYWpvciA9IDA7CisJICAoKnJlc291cmNlcyktPm1pbm9yID0gMDsKKwkgICgqcmVzb3VyY2VzKS0+ZW50cmllcyA9IE5VTEw7CisJfQorCisgICAgICBmb3IgKHBwID0gJigqcmVzb3VyY2VzKS0+ZW50cmllczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorCWlmIChyZXNfaWRfY21wICgoKnBwKS0+aWQsIGlkc1tpXSkgPT0gMCkKKwkgIGJyZWFrOworCisgICAgICBpZiAoKnBwICE9IE5VTEwpCisJcmUgPSAqcHA7CisgICAgICBlbHNlCisJeworCSAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOworCSAgcmUtPm5leHQgPSBOVUxMOworCSAgcmUtPmlkID0gaWRzW2ldOworCSAgaWYgKChpICsgMSkgPCBjaWRzKQorCSAgICB7CisJICAgICAgcmUtPnN1YmRpciA9IDE7CisJICAgICAgcmUtPnUuZGlyID0gTlVMTDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmUtPnN1YmRpciA9IDA7CisJICAgICAgcmUtPnUucmVzID0gTlVMTDsKKwkgICAgfQorCisJICAqcHAgPSByZTsKKwl9CisKKyAgICAgIGlmICgoaSArIDEpIDwgY2lkcykKKwl7CisJICBpZiAoIXJlLT5zdWJkaXIpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwkgICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGksIGlkcyk7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiBleHBlY3RlZCB0byBiZSBhIGRpcmVjdG9yeVxuIik7CisJICAgICAgeGV4aXQgKDEpOworCSAgICB9CisKKwkgIHJlc291cmNlcyA9ICZyZS0+dS5kaXI7CisJfQorICAgIH0KKworICBpZiAocmUtPnN1YmRpcikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZXhwZWN0ZWQgdG8gYmUgYSBsZWFmXG4iKTsKKyAgICAgIHhleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJlLT51LnJlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkdXBvaykKKwlyZXR1cm47CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiAiLCBwcm9ncmFtX25hbWUpOworICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiBkdXBsaWNhdGUgdmFsdWVcbiIpOworICAgIH0KKworICByZS0+dS5yZXMgPSByZXNvdXJjZTsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Nhbml0eS5zaCBiL2JpbnV0aWxzL3Nhbml0eS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDJjYWJmCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvc2FuaXR5LnNoCkBAIC0wLDAgKzEsNTAgQEAKKyMhL2Jpbi9zaAorIyMjIHF1aWNrIHNhbml0eSB0ZXN0IGZvciB0aGUgYmludXRpbHMuCisjIyMKKyMjIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYW5kIGlzIG1haW50YWluZWQgYnkgSy4gUmljaGFyZCBQaXhsZXksCisjIyMgcmljaEBjeWdudXMuY29tLgorCisjIyMgZmFpbCBvbiBlcnJvcnMKK3NldCAtZQorCisjIyMgZmlyc3QgYXJnIGlzIGRpcmVjdG9yeSBpbiB3aGljaCBiaW5hcmllcyB0byBiZSB0ZXN0ZWQgcmVzaWRlLgorY2FzZSAiJDEiIGluCisiIikgQklOPS4gOzsKKyopICBCSU49IiQxIiA7OworZXNhYworCisjIyMgc2l6ZQorZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHN0cmlwIHJhbmxpYiA7IGRvCisJJHtCSU59L3NpemUgJHtCSU59LyRpID4gL2Rldi9udWxsCitkb25lCisKKyMjIyBvYmpkdW1wCitmb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KKwkke0JJTn0vb2JqZHVtcCAtYWhpZmRydHhzbCAke0JJTn0vJGkgPiAvZGV2L251bGwKK2RvbmUKKworIyMjIG5tCitmb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KKwkke0JJTn0vbm0gJHtCSU59LyRpID4gL2Rldi9udWxsCitkb25lCisKKyMjIyBzdHJpcAorVE1QRElSPS4vYmludXRpbHMtJCQKK21rZGlyICR7VE1QRElSfQorCitjcCAke0JJTn0vc3RyaXAgJHtUTVBESVJ9L3N0cmlwCisKK2ZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciByYW5saWIgOyBkbworCWNwICR7QklOfS8kaSAke1RNUERJUn0vJGkKKwkke0JJTn0vc3RyaXAgJHtUTVBESVJ9LyRpCisJY3AgJHtCSU59LyRpICR7VE1QRElSfS8kaQorCSR7VE1QRElSfS9zdHJpcCAke1RNUERJUn0vJGkKK2RvbmUKKworIyMjIGFyCisKKyMjIyByYW5saWIKKworcm0gLXJmICR7VE1QRElSfQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuMSBiL2JpbnV0aWxzL3NpemUuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE5YmQyCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvc2l6ZS4xCkBAIC0wLDAgKzEsMTYxIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggc2l6ZSAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKKy5kZSBCUAorLnNwCisudGkgXC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCitzaXplIFwtIGxpc3Qgc2VjdGlvbiBzaXplcyBhbmQgdG90YWwgc2l6ZS4KKworLlNIIFNZTk9QU0lTCisuaHkgMAorLm5hCisuVFAKKy5CIHNpemUKKy5SQiAiW1x8IiBcLUEgXHx8XHwgXC1CIFx8fFx8IFxjCisuQkkgIlwtXC1mb3JtYXQ9IiBjb21wYXRpYmlsaXR5XGMKK1wmXHxdCisuUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIgCisuUkIgIltcfCIgXC1kIFx8fFx8IFwtbyBcfHxcfCBcLXhcYworXHx8XHxcYworLkJJICJcLVwtcmFkaXg9IiBudW1iZXJcYworXCZcfF0KKy5SQiAiW1x8IiBcYworLkJJICJcLVwtdGFyZ2V0PSIgYmZkbmFtZVxjCitcJlx8XQorLlJCICJbXHwiIFwtViBcfHxcfCBcLVwtdmVyc2lvbiAiXHxdIiAgCisuSSBvYmpmaWxlXGMKK1wmLlx8Llx8LgorLmFkIGIKKy5oeSAxCisuU0ggREVTQ1JJUFRJT04KK1RoZSBHTlUgXGMKKy5CIHNpemVcYworXCYgdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplc1woZW1cJmFuZCB0aGUgdG90YWwKK3NpemVcKGVtXCZmb3IgZWFjaCBvZiB0aGUgb2JqZWN0IGZpbGVzCisuSSBvYmpmaWxlCitpbiBpdHMgYXJndW1lbnQgbGlzdC4KK0J5IGRlZmF1bHQsIG9uZSBsaW5lIG9mIG91dHB1dCBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgb3IgZWFjaAorbW9kdWxlIGluIGFuIGFyY2hpdmUuCisKKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtQQorLlRQCisuQiBcLUIKKy5UUAorLkJJICJcLVwtZm9ybWF0ICIgImNvbXBhdGliaWxpdHkiCitVc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjaG9vc2Ugd2hldGhlciB0aGUgb3V0cHV0IGZyb20gR05VCitcYworLkIgc2l6ZVxjCitcJiByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgXGMKKy5CIHNpemVcYworXCYgKHVzaW5nIGBcfFxjCisuQiBcLUFcYworXHwnLAorb3IgYFx8XGMKKy5CIFwtXC1mb3JtYXQ9c3lzdlxjCitcfCcpLCBvciBCZXJrZWxleSBcYworLkIgc2l6ZVxjCitcJiAodXNpbmcgYFx8XGMKKy5CIFwtQlxjCitcfCcsIG9yCitgXHxcYworLkIgXC1cLWZvcm1hdD1iZXJrZWxleVxjCitcfCcpLiAgVGhlIGRlZmF1bHQgaXMgdGhlIG9uZS1saW5lIGZvcm1hdCBzaW1pbGFyIHRvCitCZXJrZWxleSdzLiAgCisKKy5UUAorLkIgXC1cLWhlbHAKK1Nob3cgYSBzdW1tYXJ5IG9mIGFjY2VwdGFibGUgYXJndW1lbnRzIGFuZCBvcHRpb25zLgorCisuVFAKKy5CIFwtZAorLlRQCisuQiBcLW8KKy5UUAorLkIgXC14CisuVFAKKy5CSSAiXC1cLXJhZGl4ICIgIm51bWJlciIKK1VzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCitzZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKGBcfFxjCisuQiBcLWRcYworXHwnLCBvciBgXHxcYworLkIgXC1cLXJhZGl4IDEwXGMKK1x8Jyk7IG9jdGFsCisoYFx8XGMKKy5CIFwtb1xjCitcfCcsIG9yIGBcfFxjCisuQiBcLVwtcmFkaXggOFxjCitcfCcpOyBvciBoZXhhZGVjaW1hbCAoYFx8XGMKKy5CIFwteFxjCitcfCcsIG9yCitgXHxcYworLkIgXC1cLXJhZGl4IDE2XGMKK1x8JykuICBJbiBgXHxcYworLkIgXC1cLXJhZGl4IFxjCisuSSBudW1iZXJcYworXCZcYworXHwnLCBvbmx5IHRoZSB0aHJlZQordmFsdWVzICg4LCAxMCwgMTYpIGFyZSBzdXBwb3J0ZWQuICBUaGUgdG90YWwgc2l6ZSBpcyBhbHdheXMgZ2l2ZW4gaW4gdHdvCityYWRpY2VzOyBkZWNpbWFsIGFuZCBoZXhhZGVjaW1hbCBmb3IgYFx8XGMKKy5CIFwtZFxjCitcfCcgb3IgYFx8XGMKKy5CIFwteFxjCitcfCcgb3V0cHV0LCBvcgorb2N0YWwgYW5kIGhleGFkZWNpbWFsIGlmIHlvdSdyZSB1c2luZyBgXHxcYworLkIgXC1vXGMKK1x8Jy4KKworLlRQCisuQkkgIlwtXC10YXJnZXQgIiAiYmZkbmFtZSIKK1lvdSBjYW4gc3BlY2lmeSBhIHBhcnRpY3VsYXIgb2JqZWN0LWNvZGUgZm9ybWF0IGZvciBcYworLkkgb2JqZmlsZVxjCitcJiBhcworXGMKKy5JIGJmZG5hbWVcYworXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYworLkkgc2l6ZVxjCitcJiBjYW4KK2F1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gICBTZWUgCisuQlIgb2JqZHVtcCAoIDEgKSAKK2ZvciBpbmZvcm1hdGlvbgorb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KKworLlRQCisuQiBcLVYKKy5UUAorLkIgXC1cLXZlcnNpb24KK0Rpc3BsYXkgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gb24gXGMKKy5CIHNpemVcYworXCYgaXRzZWxmLgorCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAorZW50cnkgaW4gCisuQlIgaW5mbyA7CisuSVIgIlRoZSBHTlUgQmluYXJ5IFV0aWxpdGllcyIgLAorIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCisuQlIgYXIgIigiIDEgIiksIgorLkJSIG9iamR1bXAgKCAxICkuCisKKy5TSCBDT1BZSU5HCitDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKK21hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAordmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCit0cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCit0aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuYyBiL2JpbnV0aWxzL3NpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdjN2VkCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvc2l6ZS5jCkBAIC0wLDAgKzEsNTE1IEBACisvKiBzaXplLmMgLS0gcmVwb3J0IHNpemUgb2YgdmFyaW91cyBzZWN0aW9ucyBvZiBhbiBleGVjdXRhYmxlIGZpbGUuCisgICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisMCisvKiBFeHRlbnNpb25zL2luY29tcGF0aWJpbGl0aWVzOgorICAgbyAtIEJTRCBvdXRwdXQgaGFzIGZpbGVuYW1lcyBhdCB0aGUgZW5kLgorICAgbyAtIEJTRCBvdXRwdXQgY2FuIGFwcGVhciBpbiBkaWZmZXJlbnQgcmFkaWNpZXMuCisgICBvIC0gU3lzViBvdXRwdXQgaGFzIGxlc3MgcmVkdW5kYW50IHdoaXRlc3BhY2UuICBGaWxlbmFtZSBjb21lcyBhdCBlbmQuCisgICBvIC0gU3lzViBvdXRwdXQgZG9lc24ndCBzaG93IFZNQSB3aGljaCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIFBNQS4KKyAgIG8gLSBXZSBhbHNvIGhhbmRsZSBjb3JlIGZpbGVzLgorICAgbyAtIFdlIGFsc28gaGFuZGxlIGFyY2hpdmVzLgorICAgSWYgeW91IHdyaXRlIHNoZWxsIHNjcmlwdHMgd2hpY2ggbWFuaXB1bGF0ZSB0aGlzIGluZm8gdGhlbiB5b3UgbWF5IGJlCisgICBvdXQgb2YgbHVjazsgdGhlcmUncyBubyAtLWNvbXBhdGliaWxpdHkgb3IgLS1wZWRhbnRpYyBvcHRpb24uCisqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpZm5kZWYgQlNEX0RFRkFVTFQKKyNkZWZpbmUgQlNEX0RFRkFVTFQgMQorI2VuZGlmCisKKy8qIFByb2dyYW0gb3B0aW9ucy4gICovCisKK2VudW0KKyAgeworICAgIGRlY2ltYWwsIG9jdGFsLCBoZXgKKyAgfSByYWRpeCA9IGRlY2ltYWw7CitpbnQgYmVya2VsZXlfZm9ybWF0ID0gQlNEX0RFRkFVTFQ7CS8qIDAgbWVhbnMgdXNlIEFUJlQtc3R5bGUgb3V0cHV0LiAgKi8KK2ludCBzaG93X3ZlcnNpb24gPSAwOworaW50IHNob3dfaGVscCA9IDA7CisKKy8qIFByb2dyYW0gZXhpdCBzdGF0dXMuICAqLworaW50IHJldHVybl9jb2RlID0gMDsKKworc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7CisKKy8qIFN0YXRpYyBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGRpc3BsYXlfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOworc3RhdGljIHZvaWQgZGlzcGxheV9iZmQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIGRpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIGludCBzaXplX251bWJlciBQQVJBTVMgKChiZmRfc2l6ZV90eXBlKSk7CisjaWYgMAorc3RhdGljIHZvaWQgbHByaW50X251bWJlciBQQVJBTVMgKChpbnQsIGJmZF9zaXplX3R5cGUpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcnByaW50X251bWJlciBQQVJBTVMgKChpbnQsIGJmZF9zaXplX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHByaW50X2JlcmtlbGV5X2Zvcm1hdCBQQVJBTVMgKChiZmQgKikpOworc3RhdGljIHZvaWQgc3lzdl9pbnRlcm5hbF9zaXplciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBzeXN2X2ludGVybmFsX3ByaW50ZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIHZvaWQgcHJpbnRfc3lzdl9mb3JtYXQgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkIHByaW50X3NpemVzIFBBUkFNUyAoKGJmZCAqIGZpbGUpKTsKK3N0YXRpYyB2b2lkIGJlcmtlbGV5X3N1bSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSKSk7CisMCitzdGF0aWMgdm9pZAordXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQorICAgICBGSUxFICpzdHJlYW07CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorVXNhZ2U6ICVzIFstQUJkb3hWXSBbLS1mb3JtYXQ9YmVya2VsZXl8c3lzdl0gWy0tcmFkaXg9OHwxMHwxNl1cblwKKyAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2ZpbGUuLi5dXG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyNpZiBCU0RfREVGQVVMVAorICBmcHV0cyAoXygiZGVmYXVsdCBpcyAtLWZvcm1hdD1iZXJrZWxleVxuIiksIHN0cmVhbSk7CisjZWxzZQorICBmcHV0cyAoXygiZGVmYXVsdCBpcyAtLWZvcm1hdD1zeXN2XG4iKSwgc3RyZWFtKTsKKyNlbmRpZgorICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOworICBleGl0IChzdGF0dXMpOworfQorCitzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KK3sKKyAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMjAwfSwKKyAgeyJyYWRpeCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDF9LAorICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDJ9LAorICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgJnNob3dfdmVyc2lvbiwgMX0sCisgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAmc2hvd19oZWxwLCAxfSwKKyAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQorfTsKKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCB0ZW1wOworICBpbnQgYzsKKworI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQorICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7CisjZW5kaWYKKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisgIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIHByb2dyYW1fbmFtZSA9ICphcmd2OworICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7CisKKyAgYmZkX2luaXQgKCk7CisgIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7CisKKyAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJBQlZkb3giLCBsb25nX29wdGlvbnMsCisJCQkgICAoaW50ICopIDApKSAhPSBFT0YpCisgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSAyMDA6CQkvKiAtLWZvcm1hdCAqLworCXN3aXRjaCAoKm9wdGFyZykKKwkgIHsKKwkgIGNhc2UgJ0InOgorCSAgY2FzZSAnYic6CisJICAgIGJlcmtlbGV5X2Zvcm1hdCA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAnUyc6CisJICBjYXNlICdzJzoKKwkgICAgYmVya2VsZXlfZm9ybWF0ID0gMDsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludmFsaWQgYXJndW1lbnQgdG8gLS1mb3JtYXQ6ICVzXG4iKSwgb3B0YXJnKTsKKwkgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgMjAyOgkJLyogLS10YXJnZXQgKi8KKwl0YXJnZXQgPSBvcHRhcmc7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgMjAxOgkJLyogLS1yYWRpeCAqLworI2lmZGVmIEFOU0lfTElCUkFSSUVTCisJdGVtcCA9IHN0cnRvbCAob3B0YXJnLCBOVUxMLCAxMCk7CisjZWxzZQorCXRlbXAgPSBhdG9sIChvcHRhcmcpOworI2VuZGlmCisJc3dpdGNoICh0ZW1wKQorCSAgeworCSAgY2FzZSAxMDoKKwkgICAgcmFkaXggPSBkZWNpbWFsOworCSAgICBicmVhazsKKwkgIGNhc2UgODoKKwkgICAgcmFkaXggPSBvY3RhbDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDE2OgorCSAgICByYWRpeCA9IGhleDsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBwcmludGYgKF8oIkludmFsaWQgcmFkaXg6ICVzXG4iKSwgb3B0YXJnKTsKKwkgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJ0EnOgorCWJlcmtlbGV5X2Zvcm1hdCA9IDA7CisJYnJlYWs7CisgICAgICBjYXNlICdCJzoKKwliZXJrZWxleV9mb3JtYXQgPSAxOworCWJyZWFrOworICAgICAgY2FzZSAnVic6CisJc2hvd192ZXJzaW9uID0gMTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2QnOgorCXJhZGl4ID0gZGVjaW1hbDsKKwlicmVhazsKKyAgICAgIGNhc2UgJ3gnOgorCXJhZGl4ID0gaGV4OworCWJyZWFrOworICAgICAgY2FzZSAnbyc6CisJcmFkaXggPSBvY3RhbDsKKwlicmVhazsKKyAgICAgIGNhc2UgMDoKKwlicmVhazsKKyAgICAgIGNhc2UgJz8nOgorCXVzYWdlIChzdGRlcnIsIDEpOworICAgICAgfQorCisgIGlmIChzaG93X3ZlcnNpb24pCisgICAgcHJpbnRfdmVyc2lvbiAoInNpemUiKTsKKyAgaWYgKHNob3dfaGVscCkKKyAgICB1c2FnZSAoc3Rkb3V0LCAwKTsKKworICBpZiAob3B0aW5kID09IGFyZ2MpCisgICAgZGlzcGxheV9maWxlICgiYS5vdXQiKTsKKyAgZWxzZQorICAgIGZvciAoOyBvcHRpbmQgPCBhcmdjOykKKyAgICAgIGRpc3BsYXlfZmlsZSAoYXJndltvcHRpbmQrK10pOworCisgIHJldHVybiByZXR1cm5fY29kZTsKK30KKwwKKy8qIERpc3BsYXkgc3RhdHMgb24gZmlsZSBvciBhcmNoaXZlIG1lbWJlciBBQkZELiAgKi8KKworc3RhdGljIHZvaWQKK2Rpc3BsYXlfYmZkIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGNoYXIgKiptYXRjaGluZzsKKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX2FyY2hpdmUpKQorICAgIC8qIEFuIGFyY2hpdmUgd2l0aGluIGFuIGFyY2hpdmUuICAqLworICAgIHJldHVybjsKKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQorICAgIHsKKyAgICAgIHByaW50X3NpemVzIChhYmZkKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKKyAgICAgIGZyZWUgKG1hdGNoaW5nKTsKKyAgICAgIHJldHVybl9jb2RlID0gMzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX2NvcmUsICZtYXRjaGluZykpCisgICAgeworICAgICAgQ09OU1QgY2hhciAqY29yZV9jbWQ7CisKKyAgICAgIHByaW50X3NpemVzIChhYmZkKTsKKyAgICAgIGZwdXRzICgiIChjb3JlIGZpbGUiLCBzdGRvdXQpOworCisgICAgICBjb3JlX2NtZCA9IGJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKTsKKyAgICAgIGlmIChjb3JlX2NtZCkKKwlwcmludGYgKCIgaW52b2tlZCBhcyAlcyIsIGNvcmVfY21kKTsKKworICAgICAgcHV0cyAoIilcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKworICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQorICAgIHsKKyAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOworICAgICAgZnJlZSAobWF0Y2hpbmcpOworICAgIH0KKworICByZXR1cm5fY29kZSA9IDM7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X2FyY2hpdmUgKGZpbGUpCisgICAgIGJmZCAqZmlsZTsKK3sKKyAgYmZkICphcmZpbGUgPSAoYmZkICopIE5VTEw7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOworCisgICAgICBhcmZpbGUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmaWxlLCBhcmZpbGUpOworICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQorCXsKKwkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQorCSAgICB7CisJICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7CisJICAgICAgcmV0dXJuX2NvZGUgPSAyOworCSAgICB9CisJICBicmVhazsKKwl9CisKKyAgICAgIGRpc3BsYXlfYmZkIChhcmZpbGUpOworICAgICAgLyogRG9uJ3QgY2xvc2UgdGhlIGFyY2hpdmUgZWxlbWVudHM7IHdlIG5lZWQgdGhlbSBmb3IgbmV4dF9hcmNoaXZlICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGlzcGxheV9maWxlIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGJmZCAqZmlsZSA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7CisgIGlmIChmaWxlID09IE5VTEwpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7CisgICAgICByZXR1cm5fY29kZSA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKKyAgICBkaXNwbGF5X2FyY2hpdmUgKGZpbGUpOworICBlbHNlCisgICAgZGlzcGxheV9iZmQgKGZpbGUpOworCisgIGlmIChiZmRfY2xvc2UgKGZpbGUpID09IGZhbHNlKQorICAgIHsKKyAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuX2NvZGUgPSAxOworICAgICAgcmV0dXJuOworICAgIH0KK30KKwwKKy8qIFRoaXMgaXMgd2hhdCBsZXhpY2FsIGZ1bmN0aW9ucyBhcmUgZm9yLiAgKi8KKworc3RhdGljIGludAorc2l6ZV9udW1iZXIgKG51bSkKKyAgICAgYmZkX3NpemVfdHlwZSBudW07Cit7CisgIGNoYXIgYnVmZmVyWzQwXTsKKyAgc3ByaW50ZiAoYnVmZmVyLAorCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgorCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAorCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOworCisgIHJldHVybiBzdHJsZW4gKGJ1ZmZlcik7Cit9CisKKyNpZiAwCisKKy8qIFRoaXMgaXMgbm90IHVzZWQuICAqLworCitzdGF0aWMgdm9pZAorbHByaW50X251bWJlciAod2lkdGgsIG51bSkKKyAgICAgaW50IHdpZHRoOworICAgICBiZmRfc2l6ZV90eXBlIG51bTsKK3sKKyAgY2hhciBidWZmZXJbNDBdOworICBzcHJpbnRmIChidWZmZXIsCisJICAgKHJhZGl4ID09IGRlY2ltYWwgPyAiJWx1IiA6CisJICAgKChyYWRpeCA9PSBvY3RhbCkgPyAiMCVsbyIgOiAiMHglbHgiKSksCisJICAgKHVuc2lnbmVkIGxvbmcpIG51bSk7CisKKyAgcHJpbnRmICgiJS0qcyIsIHdpZHRoLCBidWZmZXIpOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK3JwcmludF9udW1iZXIgKHdpZHRoLCBudW0pCisgICAgIGludCB3aWR0aDsKKyAgICAgYmZkX3NpemVfdHlwZSBudW07Cit7CisgIGNoYXIgYnVmZmVyWzQwXTsKKyAgc3ByaW50ZiAoYnVmZmVyLAorCSAgIChyYWRpeCA9PSBkZWNpbWFsID8gIiVsdSIgOgorCSAgICgocmFkaXggPT0gb2N0YWwpID8gIjAlbG8iIDogIjB4JWx4IikpLAorCSAgICh1bnNpZ25lZCBsb25nKSBudW0pOworCisgIHByaW50ZiAoIiUqcyIsIHdpZHRoLCBidWZmZXIpOworfQorCitzdGF0aWMgYmZkX3NpemVfdHlwZSBic3NzaXplOworc3RhdGljIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7CitzdGF0aWMgYmZkX3NpemVfdHlwZSB0ZXh0c2l6ZTsKKworc3RhdGljIHZvaWQKK2JlcmtlbGV5X3N1bSAoYWJmZCwgc2VjLCBpZ25vcmUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWM7CisgICAgIFBUUiBpZ25vcmU7Cit7CisgIGZsYWd3b3JkIGZsYWdzOworICBiZmRfc2l6ZV90eXBlIHNpemU7CisKKyAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7CisgIGlmICgoZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCisgICAgcmV0dXJuOworCisgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7CisgIGlmICgoZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCB8fCAoZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCisgICAgdGV4dHNpemUgKz0gc2l6ZTsKKyAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKKyAgICBkYXRhc2l6ZSArPSBzaXplOworICBlbHNlCisgICAgYnNzc2l6ZSArPSBzaXplOworfQorCitzdGF0aWMgdm9pZCAKK3ByaW50X2JlcmtlbGV5X2Zvcm1hdCAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzdGF0aWMgaW50IGZpbGVzX3NlZW4gPSAwOworICBiZmRfc2l6ZV90eXBlIHRvdGFsOworCisgIGJzc3NpemUgPSAwOworICBkYXRhc2l6ZSA9IDA7CisgIHRleHRzaXplID0gMDsKKworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGJlcmtlbGV5X3N1bSwgKFBUUikgTlVMTCk7CisKKyAgaWYgKGZpbGVzX3NlZW4rKyA9PSAwKQorI2lmIDAKKyAgICAvKiBJbnRlbCBkb2Vzbid0IGxpa2UgYnNzL3N0ayBiZWNhdXNlIHRoZXkgZG9uJ3QgaGF2ZSBjb3JlIGZpbGVzLiAgKi8KKyAgICBwdXRzICgocmFkaXggPT0gb2N0YWwpID8gIiAgIHRleHRcdCAgIGRhdGFcdGJzcy9zdGtcdCAgICBvY3RcdCAgICBoZXhcdGZpbGVuYW1lIiA6CisJICAiICAgdGV4dFx0ICAgZGF0YVx0YnNzL3N0a1x0ICAgIGRlY1x0ICAgIGhleFx0ZmlsZW5hbWUiKTsKKyNlbHNlCisgICAgcHV0cyAoKHJhZGl4ID09IG9jdGFsKSA/ICIgICB0ZXh0XHQgICBkYXRhXHQgICAgYnNzXHQgICAgb2N0XHQgICAgaGV4XHRmaWxlbmFtZSIgOgorCSAgIiAgIHRleHRcdCAgIGRhdGFcdCAgICBic3NcdCAgICBkZWNcdCAgICBoZXhcdGZpbGVuYW1lIik7CisjZW5kaWYKKworICB0b3RhbCA9IHRleHRzaXplICsgZGF0YXNpemUgKyBic3NzaXplOworCisgIHJwcmludF9udW1iZXIgKDcsIHRleHRzaXplKTsKKyAgcHV0Y2hhciAoJ1x0Jyk7CisgIHJwcmludF9udW1iZXIgKDcsIGRhdGFzaXplKTsKKyAgcHV0Y2hhciAoJ1x0Jyk7CisgIHJwcmludF9udW1iZXIgKDcsIGJzc3NpemUpOworICBwcmludGYgKCgocmFkaXggPT0gb2N0YWwpID8gIlx0JTdsb1x0JTdseFx0IiA6ICJcdCU3bHVcdCU3bHhcdCIpLAorCSAgKHVuc2lnbmVkIGxvbmcpIHRvdGFsLCAodW5zaWduZWQgbG9uZykgdG90YWwpOworCisgIGZwdXRzIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3Rkb3V0KTsKKyAgaWYgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkKKyAgICBwcmludGYgKCIgKGV4ICVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOworfQorCisvKiBJIFJFQUxMWSBtaXNzIGxleGljYWwgZnVuY3Rpb25zISAqLworYmZkX3NpemVfdHlwZSBzdmlfdG90YWwgPSAwOworYmZkX3ZtYSBzdmlfbWF4dm1hID0gMDsKK2ludCBzdmlfbmFtZWxlbiA9IDA7CitpbnQgc3ZpX3ZtYWxlbiA9IDA7CitpbnQgc3ZpX3NpemVsZW4gPSAwOworCitzdGF0aWMgdm9pZAorc3lzdl9pbnRlcm5hbF9zaXplciAoZmlsZSwgc2VjLCBpZ25vcmUpCisgICAgIGJmZCAqZmlsZTsKKyAgICAgc2VjX3B0ciBzZWM7CisgICAgIFBUUiBpZ25vcmU7Cit7CisgIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGZpbGUsIHNlYyk7CisgIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCisgICAgICAmJiAhYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpCisgICAgICAmJiAhYmZkX2lzX3VuZF9zZWN0aW9uIChzZWMpKQorICAgIHsKKyAgICAgIGludCBuYW1lbGVuID0gc3RybGVuIChiZmRfc2VjdGlvbl9uYW1lIChmaWxlLCBzZWMpKTsKKyAgICAgIGlmIChuYW1lbGVuID4gc3ZpX25hbWVsZW4pCisJc3ZpX25hbWVsZW4gPSBuYW1lbGVuOworCisgICAgICBzdmlfdG90YWwgKz0gc2l6ZTsKKyAgICAgIGlmIChiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYykgPiBzdmlfbWF4dm1hKQorCXN2aV9tYXh2bWEgPSBiZmRfc2VjdGlvbl92bWEgKGZpbGUsIHNlYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3lzdl9pbnRlcm5hbF9wcmludGVyIChmaWxlLCBzZWMsIGlnbm9yZSkKKyAgICAgYmZkICpmaWxlOworICAgICBzZWNfcHRyIHNlYzsKKyAgICAgUFRSIGlnbm9yZTsKK3sKKyAgYmZkX3NpemVfdHlwZSBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoZmlsZSwgc2VjKTsKKyAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKKyAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKKyAgICAgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCisgICAgeworICAgICAgc3ZpX3RvdGFsICs9IHNpemU7CisKKyAgICAgIHByaW50ZiAoIiUtKnMgICAiLCBzdmlfbmFtZWxlbiwgYmZkX3NlY3Rpb25fbmFtZSAoZmlsZSwgc2VjKSk7CisgICAgICBycHJpbnRfbnVtYmVyIChzdmlfc2l6ZWxlbiwgc2l6ZSk7CisgICAgICBwcmludGYgKCIgICAiKTsKKyAgICAgIHJwcmludF9udW1iZXIgKHN2aV92bWFsZW4sIGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKSk7CisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X3N5c3ZfZm9ybWF0IChmaWxlKQorICAgICBiZmQgKmZpbGU7Cit7CisgIC8qIHNpemUgYWxsIG9mIHRoZSBjb2x1bW5zICovCisgIHN2aV90b3RhbCA9IDA7CisgIHN2aV9tYXh2bWEgPSAwOworICBzdmlfbmFtZWxlbiA9IDA7CisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZmlsZSwgc3lzdl9pbnRlcm5hbF9zaXplciwgKFBUUikgTlVMTCk7CisgIHN2aV92bWFsZW4gPSBzaXplX251bWJlciAoKGJmZF9zaXplX3R5cGUpc3ZpX21heHZtYSk7CisgIGlmICgoc2l6ZV90KSBzdmlfdm1hbGVuIDwgc2l6ZW9mICgiYWRkciIpIC0gMSkKKyAgICBzdmlfdm1hbGVuID0gc2l6ZW9mICgiYWRkciIpLTE7CisKKyAgc3ZpX3NpemVsZW4gPSBzaXplX251bWJlciAoc3ZpX3RvdGFsKTsKKyAgaWYgKChzaXplX3QpIHN2aV9zaXplbGVuIDwgc2l6ZW9mICgic2l6ZSIpIC0gMSkKKyAgICBzdmlfc2l6ZWxlbiA9IHNpemVvZiAoInNpemUiKS0xOworCisgIHN2aV90b3RhbCA9IDA7CisgIHByaW50ZiAoIiVzICAiLCBiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7CisgIGlmIChiZmRfbXlfYXJjaGl2ZSAoZmlsZSkpCisgICAgcHJpbnRmICgiIChleCAlcykiLCBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoZmlsZSkpKTsKKworICBwcmludGYgKCI6XG4lLSpzICAgJSpzICAgJSpzXG4iLCBzdmlfbmFtZWxlbiwgInNlY3Rpb24iLAorCSAgc3ZpX3NpemVsZW4sICJzaXplIiwgc3ZpX3ZtYWxlbiwgImFkZHIiKTsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChmaWxlLCBzeXN2X2ludGVybmFsX3ByaW50ZXIsIChQVFIpIE5VTEwpOworCisgIHByaW50ZiAoIiUtKnMgICAiLCBzdmlfbmFtZWxlbiwgIlRvdGFsIik7CisgIHJwcmludF9udW1iZXIgKHN2aV9zaXplbGVuLCBzdmlfdG90YWwpOworICBwcmludGYgKCJcblxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zaXplcyAoZmlsZSkKKyAgICAgYmZkICpmaWxlOworeworICBpZiAoYmVya2VsZXlfZm9ybWF0KQorICAgIHByaW50X2JlcmtlbGV5X2Zvcm1hdCAoZmlsZSk7CisgIGVsc2UKKyAgICBwcmludF9zeXN2X2Zvcm1hdCAoZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy9zcmNvbnYuYyBiL2JpbnV0aWxzL3NyY29udi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMGYyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9zcmNvbnYuYwpAQCAtMCwwICsxLDIwMzYgQEAKKy8qIHNyY29udi5jIC0tIFN5c3JvZmYgY29udmVyc2lvbiBwcm9ncmFtCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQorCisgICBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIGNvZmYgb2JqZWN0IGZpbGUKKyAgIGludG8gYSBIaXRhY2hpIE9NL0xNIChTeXNyb2ZmKSBmb3JtYXQuCisKKyAgIEFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkICovCisKKyNpbmNsdWRlIDxiZmQuaD4KKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJzeXNyb2ZmLmgiCisjaW5jbHVkZSAiY29mZmdyb2suaCIKKyNpbmNsdWRlIDxsaWJpYmVydHkuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgorCisjZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS41IgorLyojZGVmaW5lIEZPT1AxIDEgKi8KKworc3RhdGljIGludCBhZGRyc2l6ZTsKK3N0YXRpYyBjaGFyICp0b29sbmFtZTsKK3N0YXRpYyBjaGFyICoqcm5hbWVzOworCitzdGF0aWMgdm9pZCB3cl9jcyAoKTsKK3N0YXRpYyB2b2lkIHdhbGtfdHJlZV9zY29wZSAoKTsKK3N0YXRpYyB2b2lkIHdyX2dsb2JhbHMgKCk7CitzdGF0aWMgaW50IGZpbmRfYmFzZSAoKTsKKworc3RhdGljIEZJTEUgKmZpbGU7CitzdGF0aWMgYmZkICphYmZkOworc3RhdGljIGludCBkZWJ1ZyA9IDA7CitzdGF0aWMgaW50IHF1aWNrID0gMDsKK3N0YXRpYyBpbnQgbm9wcmVzY2FuID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKKy8qIE9ic29sZXRlID8/IAorICAgc3RhdGljIGludCBhYnNvbHV0ZV9wOworICovCisKK3N0YXRpYyBpbnQgc2VnbWVudGVkX3A7CitzdGF0aWMgaW50IGNvZGU7CisKK3N0YXRpYyBpbnQgaWRzMVsyMDAwMF07CitzdGF0aWMgaW50IGlkczJbMjAwMDBdOworCitzdGF0aWMgaW50IGJhc2UxID0gMHgxODsKK3N0YXRpYyBpbnQgYmFzZTIgPSAweDIwMTg7CisKK3N0YXRpYyBpbnQKK2dldF9tZW1iZXJfaWQgKHgpCisgICAgIGludCB4OworeworICBpZiAoaWRzMlt4XSkKKyAgICB7CisgICAgICByZXR1cm4gaWRzMlt4XTsKKyAgICB9CisgIGlkczJbeF0gPSBiYXNlMisrOworICByZXR1cm4gaWRzMlt4XTsKK30KKworc3RhdGljIGludAorZ2V0X29yZGluYXJ5X2lkICh4KQorICAgICBpbnQgeDsKK3sKKyAgaWYgKGlkczFbeF0pCisgICAgeworICAgICAgcmV0dXJuIGlkczFbeF07CisgICAgfQorICBpZHMxW3hdID0gYmFzZTErKzsKKyAgcmV0dXJuIGlkczFbeF07Cit9CitzdGF0aWMgY2hhciAqCitzZWN0aW9uX3RyYW5zbGF0ZSAobikKKyAgICAgY2hhciAqbjsKK3sKKyAgaWYgKHN0cmNtcCAobiwgIi50ZXh0IikgPT0gMCkKKyAgICByZXR1cm4gIlAiOworICBpZiAoc3RyY21wIChuLCAiLmRhdGEiKSA9PSAwKQorICAgIHJldHVybiAiRCI7CisgIGlmIChzdHJjbXAgKG4sICIuYnNzIikgPT0gMCkKKyAgICByZXR1cm4gIkIiOworICByZXR1cm4gbjsKK30KKworCisKKyNkZWZpbmUgREFURSAiOTQwMjAxMDczMDAwIjsJLyogSnVzdCBhIHRpbWUgb24gbXkgYmlydGhkYXkgKi8KKworCitzdGF0aWMKK2NoYXIgKgorc3RyaXBfc3VmZml4IChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBpbnQgaTsKKyAgY2hhciAqcmVzOworICBmb3IgKGkgPSAwOyBuYW1lW2ldICE9IDAgJiYgbmFtZVtpXSAhPSAnLic7IGkrKykKKyAgICA7CisgIHJlcyA9IChjaGFyICopIHhtYWxsb2MgKGkgKyAxKTsKKyAgbWVtY3B5IChyZXMsIG5hbWUsIGkpOworICByZXNbaV0gPSAwOworICByZXR1cm4gcmVzOworfQorCisKKy8qIElUIExFTiBzdHVmZiBDUyAqLworc3RhdGljIHZvaWQKK2NoZWNrc3VtIChmaWxlLCBwdHIsIHNpemUsIGNvZGUpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGNoYXIgKnB0cjsKKyAgICAgaW50IHNpemU7CisgICAgIGludCBjb2RlOworeworICBpbnQgajsKKyAgaW50IGxhc3Q7CisgIGludCBzdW0gPSAwOworICBpbnQgYnl0ZXMgPSBzaXplIC8gODsKKyAgbGFzdCA9ICEoY29kZSAmIDB4ZmYwMCk7CisgIGlmIChzaXplICYgMHg3KQorICAgIGFib3J0ICgpOworICBwdHJbMF0gPSBjb2RlIHwgKGxhc3QgPyAweDgwIDogMCk7CisgIHB0clsxXSA9IGJ5dGVzICsgMTsKKworICBmb3IgKGogPSAwOyBqIDwgYnl0ZXM7IGorKykKKyAgICB7CisgICAgICBzdW0gKz0gcHRyW2pdOworICAgIH0KKyAgLyogR2x1ZSBvbiBhIGNoZWNrc3VtIHRvbyAqLworICBwdHJbYnl0ZXNdID0gfnN1bTsKKyAgZndyaXRlIChwdHIsIGJ5dGVzICsgMSwgMSwgZmlsZSk7Cit9CisKKworCisKK3N0YXRpYyB2b2lkCit3cml0ZUlOVCAobiwgcHRyLCBpZHgsIHNpemUsIGZpbGUpCisgICAgIGludCBuOworICAgICBjaGFyICpwdHI7CisgICAgIGludCAqaWR4OworICAgICBpbnQgc2l6ZTsKKyAgICAgRklMRSAqZmlsZTsKK3sKKyAgaW50IGJ5dGUgPSAqaWR4IC8gODsKKworICBpZiAoc2l6ZSA9PSAtMikKKyAgICBzaXplID0gYWRkcnNpemU7CisgIGVsc2UgaWYgKHNpemUgPT0gLTEpCisgICAgc2l6ZSA9IDA7CisKKyAgaWYgKGJ5dGUgPiAyNDApCisgICAgeworICAgICAgLyogTGV0cyB3cml0ZSBvdXQgdGhhdCByZWNvcmQgYW5kIGRvIGFub3RoZXIgb25lICovCisgICAgICBjaGVja3N1bSAoZmlsZSwgcHRyLCAqaWR4LCBjb2RlIHwgMHgxMDAwKTsKKyAgICAgICppZHggPSAxNjsKKyAgICAgIGJ5dGUgPSAqaWR4IC8gODsKKyAgICB9CisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcHRyW2J5dGVdID0gbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHB0cltieXRlICsgMF0gPSBuID4+IDg7CisgICAgICBwdHJbYnl0ZSArIDFdID0gbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHB0cltieXRlICsgMF0gPSBuID4+IDI0OworICAgICAgcHRyW2J5dGUgKyAxXSA9IG4gPj4gMTY7CisgICAgICBwdHJbYnl0ZSArIDJdID0gbiA+PiA4OworICAgICAgcHRyW2J5dGUgKyAzXSA9IG4gPj4gMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgICppZHggKz0gc2l6ZSAqIDg7Cit9CisKKworc3RhdGljIHZvaWQKK3dyaXRlQklUUyAodmFsLCBwdHIsIGlkeCwgc2l6ZSkKKyAgICAgaW50IHZhbDsKKyAgICAgY2hhciAqcHRyOworICAgICBpbnQgKmlkeDsKKyAgICAgaW50IHNpemU7Cit7CisgIGludCBieXRlID0gKmlkeCAvIDg7CisgIGludCBiaXQgPSAqaWR4ICUgODsKKyAgaW50IG9sZDsKKyAgKmlkeCArPSBzaXplOworCisgIG9sZCA9IHB0cltieXRlXTsKKyAgLyogVHVybiBvZmYgYWxsIGFib3V0IHRvIGNoYW5nZSBiaXRzICovCisgIG9sZCAmPSB+KCh+MCA+PiAoOCAtIGJpdCAtIHNpemUpKSAmICgoMSA8PCBzaXplKSAtIDEpKTsKKyAgLyogVHVybiBvbiB0aGUgYml0cyB3ZSB3YW50ICovCisgIG9sZCB8PSAodmFsICYgKCgxIDw8IHNpemUpIC0gMSkpIDw8ICg4IC0gYml0IC0gc2l6ZSk7CisgIHB0cltieXRlXSA9IG9sZDsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlQkFSUkFZIChkYXRhLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKKyAgICAgYmFycmF5IGRhdGE7CisgICAgIGNoYXIgKnB0cjsKKyAgICAgaW50ICppZHg7CisgICAgIGludCBzaXplOworICAgICBGSUxFICpmaWxlOworeworICBpbnQgaTsKKyAgd3JpdGVJTlQgKGRhdGEubGVuLCBwdHIsIGlkeCwgMSwgZmlsZSk7CisgIGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbjsgaSsrKQorICAgIHsKKyAgICAgIHdyaXRlSU5UIChkYXRhLmRhdGFbaV0sIHB0ciwgaWR4LCAxLCBmaWxlKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3dyaXRlQ0hBUlMgKHN0cmluZywgcHRyLCBpZHgsIHNpemUsIGZpbGUpCisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgY2hhciAqcHRyOworICAgICBpbnQgKmlkeDsKKyAgICAgaW50IHNpemU7CisgICAgIEZJTEUgKmZpbGU7Cit7CisgIGludCBpID0gKmlkeCAvIDg7CisKKyAgaWYgKGkgPiAyNDApCisgICAgeworICAgICAgLyogTGV0cyB3cml0ZSBvdXQgdGhhdCByZWNvcmQgYW5kIGRvIGFub3RoZXIgb25lICovCisgICAgICBjaGVja3N1bSAoZmlsZSwgcHRyLCAqaWR4LCBjb2RlIHwgMHgxMDAwKTsKKyAgICAgICppZHggPSAxNjsKKyAgICAgIGkgPSAqaWR4IC8gODsKKyAgICB9CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBWYXJpYWJsZSBsZW5ndGggc3RyaW5nICovCisgICAgICBzaXplID0gc3RybGVuIChzdHJpbmcpOworICAgICAgcHRyW2krK10gPSBzaXplOworICAgIH0KKworICAvKiBCVUcgV0FJVElORyBUTyBIQVBQRU4gKi8KKyAgbWVtY3B5IChwdHIgKyBpLCBzdHJpbmcsIHNpemUpOworICBpICs9IHNpemU7CisgICppZHggPSBpICogODsKK30KKworI2RlZmluZSBTWVNST0ZGX1NXQVBfT1VUCisjaW5jbHVkZSAic3lzcm9mZi5jIgorCisKK3N0YXRpYyBjaGFyICpybmFtZV9zaFtdID0KK3sKKyAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IgorfTsKKworc3RhdGljIGNoYXIgKnJuYW1lX2g4MzAwW10gPQoreworICAiRVIwIiwgIkVSMSIsICJFUjIiLCAiRVIzIiwgIkVSNCIsICJFUjUiLCAiRVI2IiwgIkVSNyIsICJQQyIsICJDQ1IiCit9OworCitzdGF0aWMgdm9pZAord3JfdHIgKCkKK3sKKyAgLyogVGhlIFRSIGJsb2NrIGlzIG5vdCBub3JtYWwgLSBpdCBkb2Vzbid0IGhhdmUgYW55IGNvbnRlbnRzLiAqLworCisgIHN0YXRpYyBjaGFyIGJbXSA9IHsKKyAgICAweGZmLAkJCS8qIElUICovCisgICAgMHgwMywJCQkvKiBSTCAqLworICAgIDB4ZmQsCQkJLyogQ1MgKi8KKyAgfTsKKyAgZndyaXRlIChiLCAxLCBzaXplb2YgKGIpLCBmaWxlKTsKK30KKworc3RhdGljIHZvaWQKK3dyX3VuIChwdHIsIHNmaWxlLCBmaXJzdCwgbnNlY3MpCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7CisgICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKKyAgICAgaW50IGZpcnN0OworICAgICBpbnQgbnNlY3M7Cit7CisgIHN0cnVjdCBJVF91biB1bjsKKworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7CisKKyAgdW4uc3BhcmUxID0gMDsKKworICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKKyAgICB1bi5mb3JtYXQgPSBGT1JNQVRfTE07CisgIGVsc2UKKyAgICB1bi5mb3JtYXQgPSBGT1JNQVRfT007CisgIHVuLnNwYXJlMSA9IDA7CisKKworI2lmIDEKKyAgdW4ubnNlY3Rpb25zID0gcHRyLT5uc2VjdGlvbnMgLSAxOwkvKiAgRG9uJ3QgY291bnQgdGhlIGFicyBzZWN0aW9uICovCisjZWxzZQorICAvKk5FVyAtIG9ubHkgY291bnQgc2VjdGlvbnMgd2l0aCBzaXplICovCisgIHVuLm5zZWN0aW9ucyA9IG5zZWNzOworI2VuZGlmCisKKyAgdW4ubmV4dGRlZnMgPSAwOworICB1bi5uZXh0cmVmcyA9IDA7CisgIC8qIENvdW50IGFsbCB0aGUgdW5kZWZpbmVkIGFuZCBkZWZpbmVkIHZhcmlhYmxlcyB3aXRoIGdsb2JhbCBzY29wZSAqLworCisgIGlmIChmaXJzdCkKKyAgICB7CisgICAgICBmb3IgKHMgPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHM7IHMgPSBzLT5uZXh0X2luX29maWxlX2xpc3QpCisJeworCSAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X2RlZgorCSAgICAgIHx8IHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQorCSAgICB1bi5uZXh0ZGVmcysrOworCisJICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQorCSAgICB1bi5uZXh0cmVmcysrOworCX0KKyAgICB9CisgIHVuLnRvb2wgPSB0b29sbmFtZTsKKyAgdW4udGNkID0gREFURTsKKyAgdW4ubGlua2VyID0gIkxfR1gwMCI7CisgIHVuLmxjZCA9IERBVEU7CisgIHVuLm5hbWUgPSBzZmlsZS0+bmFtZTsKKyAgc3lzcm9mZl9zd2FwX3VuX291dCAoZmlsZSwgJnVuKTsKK30KKworCitzdGF0aWMgdm9pZAord3JfaGQgKHApCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOworeworICBzdHJ1Y3QgSVRfaGQgaGQ7CisKKyAgaGQuc3BhcmUxID0gMDsKKyAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCisgICAgeworICAgICAgaGQubXQgPSBNVFlQRV9BQlNfTE07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaGQubXQgPSBNVFlQRV9PTVNfT1JfTE1TOworICAgIH0KKyAgaGQuY2QgPSBEQVRFOworCisgIGhkLm51ID0gcC0+bnNvdXJjZXM7CQkvKiBBbHdheXMgb25lIHVuaXQgKi8KKyAgaGQuY29kZSA9IDA7CQkJLyogQWx3YXlzIEFTQ0lJICovCisgIGhkLnZlciA9ICIwMjAwIjsJCS8qIFZlcnNpb24gMi4wMCAqLworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCisgICAgeworICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6CisgICAgICBoZC5hdSA9IDg7CisgICAgICBoZC5zaSA9IDA7CisgICAgICBoZC5zcGNzeiA9IDMyOworICAgICAgaGQuc2Vnc3ogPSAwOworICAgICAgaGQuc2Vnc2ggPSAwOworICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQorCXsKKwljYXNlIGJmZF9tYWNoX2g4MzAwOgorCSAgaGQuY3B1ID0gIkg4MzAwIjsKKwkgIGhkLmFmbCA9IDI7CisJICBhZGRyc2l6ZSA9IDI7CisJICB0b29sbmFtZSA9ICJDX0g4LzMwMCI7CisJICBicmVhazsKKwljYXNlIGJmZF9tYWNoX2g4MzAwaDoKKwkgIGhkLmNwdSA9ICJIODMwMEgiOworCSAgaGQuYWZsID0gNDsKKwkgIGFkZHJzaXplID0gNDsKKwkgIHRvb2xuYW1lID0gIkNfSDgvMzAwSCI7CisJICBicmVhazsKKwljYXNlIGJmZF9tYWNoX2g4MzAwczoKKwkgIGhkLmNwdSA9ICJIODMwMFMiOworCSAgaGQuYWZsID0gNDsKKwkgIGFkZHJzaXplID0gNDsKKwkgIHRvb2xuYW1lID0gIkNfSDgvMzAwUyI7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQoKTsKKwl9CisgICAgICBybmFtZXMgPSBybmFtZV9oODMwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX2FyY2hfc2g6CisgICAgICBoZC5hdSA9IDg7CisgICAgICBoZC5zaSA9IDA7CisgICAgICBoZC5hZmwgPSA0OworICAgICAgaGQuc3Bjc3ogPSAzMjsKKyAgICAgIGhkLnNlZ3N6ID0gMDsKKyAgICAgIGhkLnNlZ3NoID0gMDsKKyAgICAgIGhkLmNwdSA9ICJTSCI7CisgICAgICBhZGRyc2l6ZSA9IDQ7CisgICAgICB0b29sbmFtZSA9ICJDX1NIIjsKKyAgICAgIHJuYW1lcyA9IHJuYW1lX3NoOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAoISBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgJiBFWEVDX1ApCisgICAgeworICAgICAgaGQuZXAgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhkLmVwID0gMTsKKyAgICAgIGhkLnVhbiA9IDA7CisgICAgICBoZC5zYSA9IDA7CisgICAgICBoZC5zYWQgPSAwOworICAgICAgaGQuYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgICAgfQorCisgIGhkLm9zID0gIiI7CisgIGhkLnN5cyA9ICIiOworICBoZC5tbiA9IHN0cmlwX3N1ZmZpeCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCisgIHN5c3JvZmZfc3dhcF9oZF9vdXQgKGZpbGUsICZoZCk7Cit9CisKKworc3RhdGljIHZvaWQKK3dyX3NoIChwLCBzZWMpCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOworICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Cit7CisgIHN0cnVjdCBJVF9zaCBzaDsKKyAgc2gudW5pdCA9IDA7CisgIHNoLnNlY3Rpb24gPSBzZWMtPm51bWJlcjsKKyNpZmRlZiBGT09QMQorICBzaC5zZWN0aW9uID0gMDsKKyNlbmRpZgorICBzeXNyb2ZmX3N3YXBfc2hfb3V0IChmaWxlLCAmc2gpOworfQorCisKK3N0YXRpYyB2b2lkCit3cl9vYiAocCwgc2VjdGlvbikKKyAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7CisgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Cit7CisgIGJmZF9zaXplX3R5cGUgaTsKKyAgaW50IGZpcnN0ID0gMTsKKyAgdW5zaWduZWQgY2hhciBzdHVmZlsyMDBdOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpCisgICAgeworICAgICAgc3RydWN0IElUX29iIG9iOworICAgICAgaW50IHRvZG8gPSAyMDA7CQkvKiBDb3B5IGluIDIwMCBieXRlIGx1bXBzICovCisgICAgICBvYi5zcGFyZSA9IDA7CisgICAgICBpZiAoaSArIHRvZG8gPiBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplKQorCXRvZG8gPSBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplIC0gaTsKKworICAgICAgaWYgKGZpcnN0KQorCXsKKwkgIG9iLnNhZiA9IDE7CisJICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKKwkgICAgb2IuYWRkcmVzcyA9IHNlY3Rpb24tPmFkZHJlc3M7CisJICBlbHNlCisJICAgIG9iLmFkZHJlc3MgPSAwOworCisJICBmaXJzdCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG9iLnNhZiA9IDA7CisJfQorCisgICAgICBvYi5jcGYgPSAwOwkJLyogTmV2ZXIgY29tcHJlc3MgKi8KKyAgICAgIG9iLmRhdGEubGVuID0gdG9kbzsKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbi0+YmZkX3NlY3Rpb24sIHN0dWZmLCBpLCB0b2RvKTsKKyAgICAgIG9iLmRhdGEuZGF0YSA9IHN0dWZmOworICAgICAgc3lzcm9mZl9zd2FwX29iX291dCAoZmlsZSwgJm9iIC8qLCBpICsgdG9kbyA8IHNlY3Rpb24tPnNpemUgKi8gKTsKKyAgICAgIGkgKz0gdG9kbzsKKyAgICB9CisgIC8qIE5vdyBmaWxsIHRoZSByZXN0IHdpdGggYmxhbmtzICovCisgIHdoaWxlIChpIDwgKGJmZF9zaXplX3R5cGUpIHNlY3Rpb24tPnNpemUpCisgICAgeworICAgICAgc3RydWN0IElUX29iIG9iOworICAgICAgaW50IHRvZG8gPSAyMDA7CQkvKiBDb3B5IGluIDIwMCBieXRlIGx1bXBzICovCisgICAgICBvYi5zcGFyZSA9IDA7CisgICAgICBpZiAoaSArIHRvZG8gPiAoYmZkX3NpemVfdHlwZSkgc2VjdGlvbi0+c2l6ZSkKKwl0b2RvID0gc2VjdGlvbi0+c2l6ZSAtIGk7CisgICAgICBvYi5zYWYgPSAwOworCisgICAgICBvYi5jcGYgPSAwOwkJLyogTmV2ZXIgY29tcHJlc3MgKi8KKyAgICAgIG9iLmRhdGEubGVuID0gdG9kbzsKKyAgICAgIG1lbXNldCAoc3R1ZmYsIDAsIHRvZG8pOworICAgICAgb2IuZGF0YS5kYXRhID0gc3R1ZmY7CisgICAgICBzeXNyb2ZmX3N3YXBfb2Jfb3V0IChmaWxlLCAmb2IpOworICAgICAgaSArPSB0b2RvOworICAgIH0KKyAgLyogTm93IGZpbGwgdGhlIHJlc3Qgd2l0aCBibGFua3MgKi8KKworfQorCitzdGF0aWMgdm9pZAord3JfcmwgKHB0ciwgc2VjKQorICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOworICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Cit7CisgIGludCBuciA9IHNlYy0+bnJlbG9jczsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBjb2ZmX3JlbG9jICpyID0gc2VjLT5yZWxvY3MgKyBpOworICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7CisgICAgICBzdHJ1Y3QgSVRfcmwgcmw7CisgICAgICBybC5hcG9sID0gMDsKKyAgICAgIHJsLmJvdW5kYXJ5ID0gMDsKKyAgICAgIHJsLnNlZ21lbnQgPSAxOworICAgICAgcmwuc2lnbiA9IDA7CisgICAgICBybC5jaGVjayA9IDA7CisgICAgICBybC5hZGRyID0gci0+b2Zmc2V0OworICAgICAgcmwuYml0bG9jID0gMDsKKyAgICAgIHJsLmZsZW4gPSAzMjsJCS8qIFNIIFNwZWNpZmljICovCisgICAgICAvKiBXaGF0IHNvcnQgb2YgcmVsb2MgPyBMb29rIGluIHRoZSBzZWN0aW9uIHRvIGZpbmQgb3V0ICovCisgICAgICByZWYgPSByLT5zeW1ib2w7CisgICAgICBpZiAocmVmLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCisJeworCSAgcmwuYmNvdW50ID0gNDsJLyogQWx3YXlzIDQgZm9yIHVzICovCisJICBybC5vcCA9IE9QX0VYVF9SRUY7CisJICBybC5zeW1uID0gcmVmLT5lcl9udW1iZXI7CisJfQorICAgICAgZWxzZSBpZiAocmVmLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKKwl7CisJICBybC5iY291bnQgPSAxMTsJLyogQWx3YXlzIDExIGZvciB1cyAqLworCSAgcmwub3AgPSBPUF9TRUNfUkVGOworCSAgcmwuc2VjbiA9IHJlZi0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKKwkgIHJsLmNvcGNvZGVfaXNfMyA9IDM7CisJICBybC5hbGVuZ3RoX2lzXzQgPSA0OworCSAgcmwuYWRkZW5kID0gcmVmLT53aGVyZS0+b2Zmc2V0IC0gcmVmLT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzczsKKwkgIHJsLmFvcGNvZGVfaXNfMHgyMCA9IDB4MjA7CisJfQorCisgICAgICBlbHNlCisJeworCSAgcmwuYmNvdW50ID0gMTE7CS8qIEFsd2F5cyAxMSBmb3IgdXMgKi8KKwkgIHJsLm9wID0gT1BfU0VDX1JFRjsKKwkgIHJsLnNlY24gPSByZWYtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7CisJICBybC5jb3Bjb2RlX2lzXzMgPSAzOworCSAgcmwuYWxlbmd0aF9pc180ID0gNDsKKwkgIHJsLmFkZGVuZCA9IC1yZWYtPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzOworCSAgcmwuYW9wY29kZV9pc18weDIwID0gMHgyMDsKKwl9CisgICAgICBybC5lbmQgPSAweGZmOworICAgICAgaWYgKHJsLm9wID09IE9QX1NFQ19SRUYKKwkgIHx8IHJsLm9wID09IE9QX0VYVF9SRUYpCisJeworCSAgc3lzcm9mZl9zd2FwX3JsX291dCAoZmlsZSwgJnJsKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3Jfb2JqZWN0X2JvZHkgKHApCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOworeworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IHAtPm5zZWN0aW9uczsgaSsrKQorICAgIHsKKyAgICAgIHdyX3NoIChwLCBwLT5zZWN0aW9ucyArIGkpOworICAgICAgd3Jfb2IgKHAsIHAtPnNlY3Rpb25zICsgaSk7CisgICAgICB3cl9ybCAocCwgcC0+c2VjdGlvbnMgKyBpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cl9kcHNfc3RhcnQgKHNmaWxlLCBzZWN0aW9uLCBzY29wZSwgdHlwZSwgbmVzdCkKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOworICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7CisgICAgIGludCB0eXBlOworICAgICBpbnQgbmVzdDsKK3sKKyAgc3RydWN0IElUX2RwcyBkcHM7CisgIGRwcy5lbmQgPSAwOworICBkcHMub3B0ID0gMDsKKyAgZHBzLnR5cGUgPSB0eXBlOworICBpZiAoc2NvcGUtPnNlYykKKyAgICB7CisgICAgICBkcHMuc2FuID0gc2NvcGUtPnNlYy0+bnVtYmVyOworICAgICAgZHBzLmFkZHJlc3MgPSBzY29wZS0+b2Zmc2V0IC0gZmluZF9iYXNlIChzZmlsZSwgc2NvcGUtPnNlYyk7CisgICAgICBkcHMuYmxvY2tfc2l6ZSA9IHNjb3BlLT5zaXplOworICAgICAgaWYgKGRlYnVnKQorCXsKKwkgIHByaW50ZiAoIkRQUyAlcyAlZCAleFxuIiwKKwkJICBzZmlsZS0+bmFtZSwKKwkJICBuZXN0LAorCQkgIGRwcy5hZGRyZXNzKTsKKworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkcHMuc2FuID0gMDsKKyAgICAgIGRwcy5hZGRyZXNzID0gMDsKKyAgICAgIGRwcy5ibG9ja19zaXplID0gMDsKKyAgICB9CisKKyAgZHBzLm5lc3RpbmcgPSBuZXN0OworICBkcHMubmVnID0gMHgxMDAxOworICBzeXNyb2ZmX3N3YXBfZHBzX291dCAoZmlsZSwgJmRwcyk7Cit9CisKK3N0YXRpYyB2b2lkCit3cl9kcHNfZW5kIChzZWN0aW9uLCBzY29wZSwgdHlwZSkKKyAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOworICAgICBpbnQgdHlwZTsKK3sKKyAgc3RydWN0IElUX2RwcyBkcHM7CisgIGRwcy5lbmQgPSAxOworICBkcHMudHlwZSA9IHR5cGU7CisgIHN5c3JvZmZfc3dhcF9kcHNfb3V0IChmaWxlLCAmZHBzKTsKK30KKworc3RhdGljIGludCAqCituaW50cyAoeCkKKyAgICAgaW50IHg7Cit7CisgIHJldHVybiAoaW50ICopICh4Y2FsbG9jIChzaXplb2YgKGludCksIHgpKTsKK30KKworc3RhdGljIHZvaWQgd2Fsa190cmVlX3N5bWJvbCAoKTsKK3N0YXRpYyB2b2lkCit3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQorICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7CisgICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOworICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOworICAgICBpbnQgbmVzdDsKK3sKKyAgc3dpdGNoICh0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIGNvZmZfc2VjZGVmX3R5cGU6CisgICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6CisgICAgICB7CisJc3RydWN0IElUX2RidCBkYnQ7CisKKwlzd2l0Y2ggKHR5cGUtPnUuYmFzaWMpCisJICB7CisJICBjYXNlIFRfTlVMTDoKKwkgIGNhc2UgVF9WT0lEOgorCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9WT0lEOworCSAgICBkYnQuc2lnbiA9IEJUWVBFX1VOU1BFQzsKKwkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOworCSAgICBicmVhazsKKwkgIGNhc2UgVF9DSEFSOgorCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9DSEFSOworCSAgICBkYnQuc2lnbiA9IEJUWVBFX1VOU1BFQzsKKwkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOworCSAgICBicmVhazsKKwkgIGNhc2UgVF9TSE9SVDoKKwkgIGNhc2UgVF9JTlQ6CisJICBjYXNlIFRfTE9ORzoKKwkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfSU5UOworCSAgICBkYnQuc2lnbiA9IFNJR05fU0lHTkVEOworCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7CisJICAgIGJyZWFrOworCSAgY2FzZSBUX0ZMT0FUOgorCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9GTE9BVDsKKwkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9TSU5HTEU7CisJICAgIGJyZWFrOworCSAgY2FzZSBUX0RPVUJMRToKKwkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfRkxPQVQ7CisJICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfRE9VQkxFOworCSAgICBicmVhazsKKwkgIGNhc2UgVF9MTkdEQkw6CisJICAgIGRidC5idHlwZSA9IEJUWVBFX0ZMT0FUOworCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX0VYVEVOREVEOworCSAgICBicmVhazsKKwkgIGNhc2UgVF9VQ0hBUjoKKwkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfQ0hBUjsKKwkgICAgZGJ0LnNpZ24gPSBTSUdOX1VOU0lHTkVEOworCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7CisJICAgIGJyZWFrOworCSAgY2FzZSBUX1VTSE9SVDoKKwkgIGNhc2UgVF9VSU5UOgorCSAgY2FzZSBUX1VMT05HOgorCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9JTlQ7CisJICAgIGRidC5zaWduID0gU0lHTl9VTlNJR05FRDsKKwkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOworCSAgICBicmVhazsKKwkgIH0KKwlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7CisJZGJ0Lm5lZyA9IDB4MTAwMTsKKwlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfZHB0IGRwdDsKKwl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LnBvaW50ZXIucG9pbnRzX3RvLCBuZXN0ICsgMSk7CisJZHB0Lm5lZyA9IDB4MTAwMTsKKwlzeXNyb2ZmX3N3YXBfZHB0X291dCAoZmlsZSwgJmRwdCk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfZGZwIGRmcDsKKwlzdHJ1Y3QgY29mZl9zeW1ib2wgKnBhcmFtOworCWRmcC5lbmQgPSAwOworCWRmcC5zcGFyZSA9IDA7CisJZGZwLm5wYXJhbXMgPSB0eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMtPm52YXJzOworCWRmcC5uZWcgPSAweDEwMDE7CisKKwl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMsIG5lc3QgKyAxKTsKKworCXN5c3JvZmZfc3dhcF9kZnBfb3V0IChmaWxlLCAmZGZwKTsKKworCWZvciAocGFyYW0gPSB0eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMtPnZhcnNfaGVhZDsKKwkgICAgIHBhcmFtOworCSAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dCkKKwkgIHsKKwkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIHBhcmFtLCBuZXN0KTsKKwkgIH0KKwlkZnAuZW5kID0gMTsKKwlzeXNyb2ZmX3N3YXBfZGZwX291dCAoZmlsZSwgJmRmcCk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6CisgICAgICB7CisJc3RydWN0IElUX2RidCBkYnQ7CisJc3RydWN0IElUX2RkcyBkZHM7CisJc3RydWN0IGNvZmZfc3ltYm9sICptZW1iZXI7CisJZGRzLnNwYXJlID0gMDsKKwlkYnQuYnR5cGUgPSBCVFlQRV9TVFJVQ1Q7CisJZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOworCWRidC5zaWduID0gU0lHTl9VTlNQRUM7CisJZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOworCWRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFzdHJ1Y3RkZWYuaWR4KTsKKwlkYnQubmVnID0gMHgxMDAxOworCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKKwlkZHMuZW5kID0gMDsKKwlkZHMubmVnID0gMHgxMDAxOworCXN5c3JvZmZfc3dhcF9kZHNfb3V0IChmaWxlLCAmZGRzKTsKKwlmb3IgKG1lbWJlciA9IHR5cGUtPnUuYXN0cnVjdGRlZi5lbGVtZW50cy0+dmFyc19oZWFkOworCSAgICAgbWVtYmVyOworCSAgICAgbWVtYmVyID0gbWVtYmVyLT5uZXh0KQorCSAgeworCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgbWVtYmVyLCBuZXN0ICsgMSk7CisJICB9CisKKwlkZHMuZW5kID0gMTsKKwlzeXNyb2ZmX3N3YXBfZGRzX291dCAoZmlsZSwgJmRkcyk7CisKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl9zdHJ1Y3RyZWZfdHlwZToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfZGJ0IGRidDsKKwlkYnQuYnR5cGUgPSBCVFlQRV9UQUc7CisJZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOworCWRidC5zaWduID0gU0lHTl9VTlNQRUM7CisJZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOworCWlmICh0eXBlLT51LmFzdHJ1Y3RyZWYucmVmKQorCSAgeworCSAgICBkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hc3RydWN0cmVmLnJlZi0+bnVtYmVyKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGRidC5zaWQgPSAwOworCSAgfQorCisJZGJ0Lm5lZyA9IDB4MTAwMTsKKwlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfZGFyIGRhcjsKKwlpbnQgajsKKwlpbnQgZGltcyA9IDE7CQkvKiBPbmx5IG91dHB1dCBvbmUgZGltZW5zaW9uIGF0IGEgdGltZSAqLworCWRhci5kaW1zID0gZGltczsKKwlkYXIudmFyaWFibGUgPSBuaW50cyAoZGltcyk7CisJZGFyLnN1YnR5cGUgPSBuaW50cyAoZGltcyk7CisJZGFyLnNwYXJlID0gbmludHMgKGRpbXMpOworCWRhci5tYXhfdmFyaWFibGUgPSBuaW50cyAoZGltcyk7CisJZGFyLm1heHNwYXJlID0gbmludHMgKGRpbXMpOworCWRhci5tYXggPSBuaW50cyAoZGltcyk7CisJZGFyLm1pbl92YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKKwlkYXIubWluID0gbmludHMgKGRpbXMpOworCWRhci5taW5zcGFyZSA9IG5pbnRzIChkaW1zKTsKKwlkYXIubmVnID0gMHgxMDAxOworCWRhci5sZW5ndGggPSB0eXBlLT5zaXplIC8gdHlwZS0+dS5hcnJheS5kaW07CisJZm9yIChqID0gMDsgaiA8IGRpbXM7IGorKykKKwkgIHsKKwkgICAgZGFyLnZhcmlhYmxlW2pdID0gVkFSSUFCTEVfRklYRUQ7CisJICAgIGRhci5zdWJ0eXBlW2pdID0gU1VCX0lOVEVHRVI7CisJICAgIGRhci5zcGFyZVtqXSA9IDA7CisJICAgIGRhci5tYXhfdmFyaWFibGVbal0gPSAwOworCSAgICBkYXIubWF4W2pdID0gdHlwZS0+dS5hcnJheS5kaW07CisJICAgIGRhci5taW5fdmFyaWFibGVbal0gPSAwOworCSAgICBkYXIubWluW2pdID0gMTsJLyogV2h5IGlzbid0IHRoaXMgMCA/ICovCisJICB9CisJd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZS0+dS5hcnJheS5hcnJheV9vZiwgbmVzdCArIDEpOworCXN5c3JvZmZfc3dhcF9kYXJfb3V0IChmaWxlLCAmZGFyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6CisgICAgICB7CisJc3RydWN0IElUX2RidCBkYnQ7CisJc3RydWN0IElUX2RlbiBkZW47CisJc3RydWN0IGNvZmZfc3ltYm9sICptZW1iZXI7CisJZGJ0LmJ0eXBlID0gQlRZUEVfRU5VTTsKKwlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7CisJZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKKwlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7CisJZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYWVudW1kZWYuaWR4KTsKKwlkYnQubmVnID0gMHgxMDAxOworCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKKworCWRlbi5lbmQgPSAwOworCWRlbi5uZWcgPSAweDEwMDE7CisJZGVuLnNwYXJlID0gMDsKKwlzeXNyb2ZmX3N3YXBfZGVuX291dCAoZmlsZSwgJmRlbik7CisJZm9yIChtZW1iZXIgPSB0eXBlLT51LmFlbnVtZGVmLmVsZW1lbnRzLT52YXJzX2hlYWQ7CisJICAgICBtZW1iZXI7CisJICAgICBtZW1iZXIgPSBtZW1iZXItPm5leHQpCisJICB7CisJICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBtZW1iZXIsIG5lc3QgKyAxKTsKKwkgIH0KKworCWRlbi5lbmQgPSAxOworCXN5c3JvZmZfc3dhcF9kZW5fb3V0IChmaWxlLCAmZGVuKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgorICAgICAgeworCXN0cnVjdCBJVF9kYnQgZGJ0OworCWRidC5idHlwZSA9IEJUWVBFX1RBRzsKKwlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7CisJZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKKwlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7CisJZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYWVudW1yZWYucmVmLT5udW1iZXIpOworCWRidC5uZWcgPSAweDEwMDE7CisJc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogT2Jzb2xldGUgPyAKKyAgIHN0YXRpYyB2b2lkCisgICBkdHlfc3RhcnQgKCkKKyAgIHsKKyAgIHN0cnVjdCBJVF9kdHkgZHR5OworICAgZHR5LmVuZCA9IDA7CisgICBkdHkubmVnID0gMHgxMDAxOworICAgZHR5LnNwYXJlID0gMDsKKyAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKKyAgIH0KKworICAgc3RhdGljIHZvaWQKKyAgIGR0eV9zdG9wICgpCisgICB7CisgICBzdHJ1Y3QgSVRfZHR5IGR0eTsKKyAgIGR0eS5lbmQgPSAwOworICAgZHR5Lm5lZyA9IDB4MTAwMTsKKyAgIGR0eS5lbmQgPSAxOworICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOworICAgfQorCisKKyAgIHN0YXRpYyB2b2lkCisgICBkdW1wX3RyZWVfc3RydWN0dXJlIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQorICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7CisgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOworICAgaW50IG5lc3Q7CisgICB7CisgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKKyAgIHsKKworCisgICB9CisKKyAgIH0KKyAqLworCitzdGF0aWMgdm9pZAord2Fsa190cmVlX3R5cGUgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCisKKyAgICAgc3RydWN0CisgICAgIGNvZmZfc2ZpbGUgKnNmaWxlOworICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKKyAgICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKKyAgICAgaW50IG5lc3Q7Cit7CisgIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQorICAgIHsKKworICAgICAgc3RydWN0IElUX2R0eSBkdHk7CisgICAgICBkdHkuZW5kID0gMDsKKyAgICAgIGR0eS5uZWcgPSAweDEwMDE7CisKKyAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKKyAgICAgIHdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpOworICAgICAgZHR5LmVuZCA9IDE7CisgICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7CisKKyAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsCisJCSAgICBzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAorCQkgICAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsCisJCSAgICBCTE9DS19UWVBFX0ZVTkNUSU9OLCBuZXN0KTsKKyAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCisJCSAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKKwkJICAgIEJMT0NLX1RZUEVfQkxPQ0ssIG5lc3QpOworICAgICAgd2Fsa190cmVlX3Njb3BlIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAorCQkgICAgICAgc2ZpbGUsCisJCSAgICAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKKwkJICAgICAgIG5lc3QgKyAxLCBCTE9DS19UWVBFX0JMT0NLKTsKKworICAgICAgd3JfZHBzX2VuZCAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKKwkJICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKKwkJICBCTE9DS19UWVBFX0JMT0NLKTsKKyAgICAgIHdyX2Rwc19lbmQgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCisJCSAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsIEJMT0NLX1RZUEVfRlVOQ1RJT04pOworCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IElUX2R0eSBkdHk7CisgICAgICBkdHkuZW5kID0gMDsKKyAgICAgIGR0eS5uZWcgPSAweDEwMDE7CisgICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7CisgICAgICB3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KTsKKyAgICAgIGR0eS5lbmQgPSAxOworICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOworICAgIH0KKworfQorCisKKworc3RhdGljIHZvaWQKK3dhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCBzZWN0aW9uLCBzeW1ib2wsIG5lc3QpCisgICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKKyAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7CisgICAgIGludCBuZXN0OworeworICBzdHJ1Y3QgSVRfZHN5IGRzeTsKKworICBtZW1zZXQoJmRzeSwgMCwgc2l6ZW9mKGRzeSkpOworICBkc3kubmVzdGluZyA9IG5lc3Q7CisKKyAgc3dpdGNoIChzeW1ib2wtPnR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgorICAgICAgZHN5LnR5cGUgPSBTVFlQRV9GVU5DOworICAgICAgZHN5LmFzc2lnbiA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6CisgICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKKyAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKKyAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKKyAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgorICAgICAgZHN5LnR5cGUgPSBTVFlQRV9WQVI7CisgICAgICBkc3kuYXNzaWduID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6CisgICAgICBkc3kudHlwZSA9IFNUWVBFX1RBRzsKKyAgICAgIGRzeS5hc3NpZ24gPSAwOworICAgICAgZHN5Lm1hZ2ljID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl9zdHJ1Y3RkZWZfdHlwZToKKyAgICAgIGRzeS50eXBlID0gU1RZUEVfVEFHOworICAgICAgZHN5LmFzc2lnbiA9IDA7CisgICAgICBkc3kubWFnaWMgPSBzeW1ib2wtPnR5cGUtPnUuYXN0cnVjdGRlZi5pc3N0cnVjdCA/IDAgOiAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgorICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdCkKKyAgICB7CisgICAgICBkc3kuYXNzaWduID0gMDsKKyAgICAgIGRzeS50eXBlID0gU1RZUEVfTUVNQkVSOworICAgIH0KKyAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW0pCisgICAgeworICAgICAgZHN5LnR5cGUgPSBTVFlQRV9FTlVNOworICAgICAgZHN5LmFzc2lnbiA9IDA7CisgICAgICBkc3kuZXZhbGxlbiA9IDQ7CisgICAgICBkc3kuZXZhbHVlID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OworICAgIH0KKworICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc3RydWN0ZGVmX3R5cGUKKyAgICAgIHx8IHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfZW50YWcKKyAgICAgIHx8IHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfc3RydGFnKQorICAgIHsKKyAgICAgIGRzeS5zbnVtYmVyID0gZ2V0X21lbWJlcl9pZCAoc3ltYm9sLT5udW1iZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRzeS5zbnVtYmVyID0gZ2V0X29yZGluYXJ5X2lkIChzeW1ib2wtPm51bWJlcik7CisgICAgfQorCisKKyAgZHN5LnNuYW1lID0gc3ltYm9sLT5uYW1lWzBdID09ICdfJyA/IHN5bWJvbC0+bmFtZSArIDEgOiBzeW1ib2wtPm5hbWU7CisKKyAgc3dpdGNoIChzeW1ib2wtPnZpc2libGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgorICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKKyAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1NUQVRJQ19FWFRfREVGOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19leHRfcmVmOgorICAgICAgZHN5LmFpbmZvID0gQUlORk9fU1RBVElDX0VYVF9SRUY7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6CisgICAgICBkc3kuYWluZm8gPSBBSU5GT19TVEFUSUNfSU5UOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgorICAgIGNhc2UgY29mZl92aXNfYXV0b3BhcmFtOgorICAgICAgZHN5LmFpbmZvID0gQUlORk9fQVVUTzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl92aXNfcmVnaXN0ZXI6CisgICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKKyAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1JFRzsKKyAgICAgIGJyZWFrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3Zpc190YWc6CisgICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgorICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX2VudW06CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGRzeS5kbGVuZ3RoID0gc3ltYm9sLT50eXBlLT5zaXplOworICBzd2l0Y2ggKHN5bWJvbC0+d2hlcmUtPndoZXJlKQorICAgIHsKKyAgICBjYXNlIGNvZmZfd2hlcmVfbWVtb3J5OgorCisgICAgICBkc3kuc2VjdGlvbiA9IHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKKyNpZmRlZiBGT09QCisgICAgICBkc3kuc2VjdGlvbiA9IDA7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgorICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKKyAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6CisgICAgY2FzZSBjb2ZmX3doZXJlX3JlZ2lzdGVyOgorICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgorICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6CisKKyAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6CisgICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHN3aXRjaCAoc3ltYm9sLT53aGVyZS0+d2hlcmUpCisgICAgeworICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6CisgICAgICBkc3kuYWRkcmVzcyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldCAtIGZpbmRfYmFzZSAoc2ZpbGUsIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgorICAgICAgZHN5LmFkZHJlc3MgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKKworCisgICAgICBpZiAoc3ltYm9sLT53aGVyZS0+Yml0c2l6ZSkKKwl7CisJICBpbnQgYml0cyA9IChzeW1ib2wtPndoZXJlLT5vZmZzZXQgKiA4ICsgc3ltYm9sLT53aGVyZS0+Yml0b2Zmc2V0KTsKKwkgIGRzeS5iaXR1bml0ID0gMTsKKwkgIGRzeS5maWVsZF9sZW4gPSBzeW1ib2wtPndoZXJlLT5iaXRzaXplOworCSAgZHN5LmZpZWxkX29mZiA9IChiaXRzIC8gMzIpICogNDsKKwkgIGRzeS5maWVsZF9iaXRvZmYgPSBiaXRzICUgMzI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRzeS5iaXR1bml0ID0gMDsKKworCSAgZHN5LmZpZWxkX2xlbiA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKKwkgIGRzeS5maWVsZF9vZmYgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgorICAgICAgLyogICAgICBkc3kuYml0dW5pdCA9IDA7CisgICAgICAgICBkc3kuZmllbGRfbGVuICA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKKyAgICAgICAgIGRzeS5maWVsZF9vZmYgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6CisgICAgY2FzZSBjb2ZmX3doZXJlX3Vua25vd246CisgICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKKworICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKKyAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfcmVnaXN0ZXIpCisgICAgZHN5LnJlZyA9IHJuYW1lc1tzeW1ib2wtPndoZXJlLT5vZmZzZXRdOworCisgIHN3aXRjaCAoc3ltYm9sLT52aXNpYmxlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKKyAgICAgIC8qIFdlIGRvIHRoaXMgJ2NhdXNlIGNvbW1vbiBDIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgZXh0ZGVmcyAqLworICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKKyAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6CisKKyAgICAgIGRzeS5lbmFtZSA9IHN5bWJvbC0+bmFtZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKKyAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKKyAgICAgIGRzeS50eXBlID0gU1RZUEVfUEFSQU1FVEVSOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6CisKKyAgICBjYXNlIGNvZmZfdmlzX2F1dG86CisgICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKKyAgICBjYXNlIGNvZmZfdmlzX3RhZzoKKyAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6CisgICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgZHN5LnNmbiA9IDA7CisgIGRzeS5zbG4gPSAyOworCisgIGRzeS5uZWcgPSAweDEwMDE7CisKKworICBzeXNyb2ZmX3N3YXBfZHN5X291dCAoZmlsZSwgJmRzeSk7CisKKyAgd2Fsa190cmVlX3R5cGUgKHNmaWxlLCBzeW1ib2wsIHN5bWJvbC0+dHlwZSwgbmVzdCk7Cit9CisKKworc3RhdGljIHZvaWQKK3dhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIHNjb3BlLCBuZXN0LCB0eXBlKQorICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOworICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7CisgICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKKyAgICAgaW50IG5lc3Q7CisgICAgIGludCB0eXBlOworeworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnM7CisgIHN0cnVjdCBjb2ZmX3Njb3BlICpjaGlsZDsKKworICBpZiAoc2NvcGUtPnZhcnNfaGVhZAorICAgICAgfHwgKHNjb3BlLT5saXN0X2hlYWQgJiYgc2NvcGUtPmxpc3RfaGVhZC0+dmFyc19oZWFkKSkKKyAgICB7CisgICAgICB3cl9kcHNfc3RhcnQgKHNmaWxlLCBzZWN0aW9uLCBzY29wZSwgdHlwZSwgbmVzdCk7CisKKyAgICAgIGlmIChuZXN0ID09IDApCisJd3JfZ2xvYmFscyAodHJlZSwgc2ZpbGUsIG5lc3QgKyAxKTsKKworICAgICAgZm9yICh2YXJzID0gc2NvcGUtPnZhcnNfaGVhZDsgdmFyczsgdmFycyA9IHZhcnMtPm5leHQpCisJeworCSAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIHNlY3Rpb24sIHZhcnMsIG5lc3QpOworCX0KKworICAgICAgZm9yIChjaGlsZCA9IHNjb3BlLT5saXN0X2hlYWQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCXsKKwkgIHdhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIGNoaWxkLCBuZXN0ICsgMSwgQkxPQ0tfVFlQRV9CTE9DSyk7CisJfQorCisgICAgICB3cl9kcHNfZW5kIChzZWN0aW9uLCBzY29wZSwgdHlwZSk7CisgICAgfQorfQorc3RhdGljIHZvaWQKK3dhbGtfdHJlZV9zZmlsZSAoc2VjdGlvbiwgc2ZpbGUpCisgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247CisgICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKK3sKKyAgd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgc2ZpbGUtPnNjb3BlLCAwLCBCTE9DS19UWVBFX0NPTVBVTklUKTsKKworfQorCitzdGF0aWMgdm9pZAord3JfcHJvZ3JhbV9zdHJ1Y3R1cmUgKHAsIHNmaWxlKQorICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworeworCisgIHdhbGtfdHJlZV9zZmlsZSAocC0+c2VjdGlvbnMgKyA0LCBzZmlsZSk7CisKK30KKworc3RhdGljIHZvaWQKK3dyX2R1IChwLCBzZmlsZSwgbikKKyAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7CisgICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKKyAgICAgaW50IG47Cit7CisgIHN0cnVjdCBJVF9kdSBkdTsKKyAgaW50IGxpbTsKKyNpZiAwCisgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOworICBzdGF0aWMgaW50IGluY2l0ID0gMHg1MDAwMDA7CisgIGludCB1c2VkID0gMDsKKyNlbmRpZgorICBpbnQgaTsKKyAgaW50IGo7CisgIHVuc2lnbmVkIGludCAqbG93ZXN0ID0gKHVuc2lnbmVkICopIG5pbnRzIChwLT5uc2VjdGlvbnMpOworICB1bnNpZ25lZCBpbnQgKmhpZ2hlc3QgPSAodW5zaWduZWQgKikgbmludHMgKHAtPm5zZWN0aW9ucyk7CisgIGR1LmZvcm1hdCA9IGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1AgPyAwIDogMTsKKyAgZHUub3B0aW1pemVkID0gMDsKKyAgZHUuc3RhY2tmcm10ID0gMDsKKyAgZHUuc3BhcmUgPSAwOworICBkdS51bml0ID0gbjsKKyAgZHUuc2VjdGlvbnMgPSBwLT5uc2VjdGlvbnMgLSAxOworICBkdS5zYW4gPSAoaW50ICopIHhjYWxsb2MgKHNpemVvZiAoaW50KSwgZHUuc2VjdGlvbnMpOworICBkdS5hZGRyZXNzID0gbmludHMgKGR1LnNlY3Rpb25zKTsKKyAgZHUubGVuZ3RoID0gbmludHMgKGR1LnNlY3Rpb25zKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZHUuc2VjdGlvbnM7IGkrKykKKyAgICB7CisgICAgICBsb3dlc3RbaV0gPSB+MDsKKyAgICAgIGhpZ2hlc3RbaV0gPSAwOworICAgIH0KKworICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZCB0cnkgYW5kIHdvcmsgb3V0IHRoZSBleHRlbnRzIGluIHRoaXMKKyAgICAgc291cmNlIGZpbGUgKi8KKyNpZiAwCisgIGZvciAoc3ltYm9sID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7CisgICAgICAgc3ltYm9sOworICAgICAgIHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCisJeworCSAgdW5zaWduZWQgaW50IGxvdyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKKwkgIHVuc2lnbmVkIGludCBoaWdoID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0ICsgc3ltYm9sLT50eXBlLT5zaXplIC0gMTsKKwkgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb24gPSBzeW1ib2wtPndoZXJlLT5zZWN0aW9uOworCisJICBpbnQgc24gPSBzZWN0aW9uLT5udW1iZXI7CisJICBpZiAobG93IDwgbG93ZXN0W3NuXSkKKwkgICAgbG93ZXN0W3NuXSA9IGxvdzsKKwkgIGlmIChoaWdoID4gaGlnaGVzdFtzbl0pCisJICAgIGhpZ2hlc3Rbc25dID0gaGlnaDsKKwl9CisgICAgfQorCisKKyAgZm9yIChpID0gMDsgaSA8IGR1LnNlY3Rpb25zOyBpKyspCisgICAgeworICAgICAgaWYgKGhpZ2hlc3RbaV0gPT0gMCkKKwl7CisJICBsb3dlc3RbaV0gPSBoaWdoZXN0W2ldID0gaW5jaXQ7CisJfQorICAgICAgZHUuc2FuW3VzZWRdID0gaTsKKyAgICAgIGR1Lmxlbmd0aFt1c2VkXSA9IGhpZ2hlc3RbaV0gLSBsb3dlc3RbaV07CisgICAgICBkdS5hZGRyZXNzW3VzZWRdID0gYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCA/IGxvd2VzdFtpXSA6IDA7CisgICAgICBpZiAoZGVidWcpCisJeworCSAgcHJpbnRmICgiIHNlY3Rpb24gJTZzIDB4JTA4eC4uMHglMDh4XG4iLAorCQkgIHAtPnNlY3Rpb25zW2kgKyAxXS5uYW1lLAorCQkgIGxvd2VzdFtpXSwKKwkJICBoaWdoZXN0W2ldKTsKKwl9CisgICAgICB1c2VkKys7CisgICAgfQorCisjZW5kaWYKKyAgbGltID0gZHUuc2VjdGlvbnM7CisgIGZvciAoaiA9IDA7IGogPCBsaW07IGorKykKKyAgICB7CisgICAgICBpbnQgc3JjID0gajsKKyAgICAgIGludCBkc3QgPSBqOworICAgICAgZHUuc2FuW2RzdF0gPSBkc3Q7CisgICAgICBpZiAoc2ZpbGUtPnNlY3Rpb25bc3JjXS5pbml0KQorCXsKKwkgIGR1Lmxlbmd0aFtkc3RdCisJICAgID0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5oaWdoIC0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5sb3cgKyAxOworCSAgZHUuYWRkcmVzc1tkc3RdCisJICAgID0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5sb3c7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGR1Lmxlbmd0aFtkc3RdID0gMDsKKwkgIGR1LmFkZHJlc3NbZHN0XSA9IDA7CisJfQorICAgICAgaWYgKGRlYnVnKQorCXsKKwkgIGlmIChzZmlsZS0+c2VjdGlvbltzcmNdLnBhcmVudCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiBzZWN0aW9uICU2cyAweCUwOHguLjB4JTA4eFxuIiwKKwkJICAgICAgc2ZpbGUtPnNlY3Rpb25bc3JjXS5wYXJlbnQtPm5hbWUsCisJCSAgICAgIGR1LmFkZHJlc3NbZHN0XSwKKwkJICAgICAgZHUuYWRkcmVzc1tkc3RdICsgZHUubGVuZ3RoW2RzdF0gLSAxKTsKKwkgICAgfQorCX0KKyAgICAgIGR1LnNlY3Rpb25zID0gZHN0ICsgMTsKKyAgICB9CisKKyAgZHUudG9vbCA9ICJjX2djYyI7CisgIGR1LmRhdGUgPSBEQVRFOworCisgIHN5c3JvZmZfc3dhcF9kdV9vdXQgKGZpbGUsICZkdSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cl9kdXMgKHAsIHNmaWxlKQorICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworeworCisgIHN0cnVjdCBJVF9kdXMgZHVzOworCisgIGR1cy5lZm4gPSAweDEwMDE7CisgIGR1cy5ucyA9IDE7CQkJLyogcC0+bnNvdXJjZXM7IHNhYyAxNCBqdWwgOTQgKi8KKyAgZHVzLmRyYiA9IG5pbnRzIChkdXMubnMpOworICBkdXMuZm5hbWUgPSAoY2hhciAqKikgeGNhbGxvYyAoc2l6ZW9mIChjaGFyICopLCBkdXMubnMpOworICBkdXMuc3BhcmUgPSBuaW50cyAoZHVzLm5zKTsKKyAgZHVzLm5kaXIgPSAwOworICAvKiBGaW5kIHRoZSBmaWxlbmFtZXMgKi8KKyNpZiAwCisgIGkgPSAwOworCisgIGZvciAoc2ZpbGUgPSBwLT5zb3VyY2VfaGVhZDsKKyAgICAgICBzZmlsZTsKKyAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQorICAgIHsKKyAgICAgIGR1cy5kcmJbaV0gPSAwOworICAgICAgZHVzLnNwYXJlW2ldID0gMDsKKyAgICAgIGR1cy5mbmFtZVtpXSA9IHNmaWxlLT5uYW1lOworICAgICAgaSsrOworICAgIH0KKyNlbHNlCisgIGR1cy5kcmJbMF0gPSAwOworICBkdXMuZm5hbWVbMF0gPSBzZmlsZS0+bmFtZTsKKyNlbmRpZgorCisgIHN5c3JvZmZfc3dhcF9kdXNfb3V0IChmaWxlLCAmZHVzKTsKKworfQorCisvKiBGaW5kIHRoZSBvZmZzZXQgb2YgdGhlIC50ZXh0IHNlY3Rpb24gZm9yIHRoaXMgc2ZpbGUgaW4gdGhlCisgICAudGV4dCBzZWN0aW9uIGZvciB0aGUgb3V0cHV0IGZpbGUgKi8KKworc3RhdGljIGludAorZmluZF9iYXNlIChzZmlsZSwgc2VjdGlvbikKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOworeworICByZXR1cm4gc2ZpbGUtPnNlY3Rpb25bc2VjdGlvbi0+bnVtYmVyXS5sb3c7Cit9CitzdGF0aWMgdm9pZAord3JfZGxuIChwLCBzZmlsZSwgbikKKyAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7CisgICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKKyAgICAgaW50IG47CisKK3sKKyNpZiAwCisgIGlmIChuID09IDApCisgICAgeworICAgICAgLyogQ291bnQgdXAgYWxsIHRoZSBsaW5lbnVtYmVycyAqLworICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKKyAgICAgIGludCBsYyA9IDA7CisgICAgICBzdHJ1Y3QgSVRfZGxuIGRsbjsKKworICAgICAgaW50IGlkeDsKKworICAgICAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7CisJICAgc3k7CisJICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQorCXsKKwkgIHN0cnVjdCBjb2ZmX3R5cGUgKnQgPSBzeS0+dHlwZTsKKwkgIGlmICh0LT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKKwkgICAgeworCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSB0LT51LmZ1bmN0aW9uLmxpbmVzOworCSAgICAgIGxjICs9IGwtPm5saW5lczsKKwkgICAgfQorCX0KKworICAgICAgZGxuLnNmbiA9IG5pbnRzIChsYyk7CisgICAgICBkbG4uc2xuID0gbmludHMgKGxjKTsKKyAgICAgIGRsbi5sbG4gPSBuaW50cyAobGMpOworICAgICAgZGxuLnNlY3Rpb24gPSBuaW50cyAobGMpOworCisgICAgICBkbG4uZnJvbV9hZGRyZXNzID0gbmludHMgKGxjKTsKKyAgICAgIGRsbi50b19hZGRyZXNzID0gbmludHMgKGxjKTsKKworCisgICAgICBkbG4ubmVnID0gMHgxMDAxOworCisgICAgICBkbG4ubmxuID0gbGM7CisKKyAgICAgIC8qIFJ1biB0aHJvdWdoIG9uY2UgbW9yZSBhbmQgZmlsbCB1cCB0aGUgc3RydWN0dXJlICovCisgICAgICBpZHggPSAwOworICAgICAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7CisJICAgc3k7CisJICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQorCXsKKwkgIGlmIChzeS0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCisJICAgIHsKKwkgICAgICBpbnQgaTsKKwkgICAgICBzdHJ1Y3QgY29mZl9saW5lICpsID0gc3ktPnR5cGUtPnUuZnVuY3Rpb24ubGluZXM7CisJICAgICAgZm9yIChpID0gMDsgaSA8IGwtPm5saW5lczsgaSsrKQorCQl7CisJCSAgZGxuLnNlY3Rpb25baWR4XSA9IHN5LT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOworCQkgIGRsbi5zZm5baWR4XSA9IG47CisJCSAgZGxuLnNsbltpZHhdID0gbC0+bGluZXNbaV07CisJCSAgZGxuLmZyb21fYWRkcmVzc1tpZHhdID0gbC0+YWRkcmVzc2VzW2ldOworCQkgIGlmIChpZHgpCisJCSAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4XTsKKwkJICBpZHgrKzsKKwkJfQorCSAgICB9CisJICBuKys7CisJfQorICAgICAgc3lzcm9mZl9zd2FwX2Rsbl9vdXQgKGZpbGUsICZkbG4pOworICAgIH0KKworI2VuZGlmCisjaWYgMQorICAvKiBDb3VudCB1cCBhbGwgdGhlIGxpbmVudW1iZXJzICovCisKKyAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKKyAgaW50IGxjID0gMDsKKyAgc3RydWN0IElUX2RsbiBkbG47CisKKyAgaW50IGlkeDsKKworICBmb3IgKHN5ID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7CisgICAgICAgc3k7CisgICAgICAgc3kgPSBzeS0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgY29mZl90eXBlICp0ID0gc3ktPnR5cGU7CisgICAgICBpZiAodC0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCisJeworCSAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHQtPnUuZnVuY3Rpb24ubGluZXM7CisJICBpZiAobCkKKwkgICAgbGMgKz0gbC0+bmxpbmVzOworCX0KKyAgICB9CisKKyAgZGxuLnNmbiA9IG5pbnRzIChsYyk7CisgIGRsbi5zbG4gPSBuaW50cyAobGMpOworICBkbG4uY2MgPSBuaW50cyAobGMpOworICBkbG4uc2VjdGlvbiA9IG5pbnRzIChsYyk7CisKKyAgZGxuLmZyb21fYWRkcmVzcyA9IG5pbnRzIChsYyk7CisgIGRsbi50b19hZGRyZXNzID0gbmludHMgKGxjKTsKKworCisgIGRsbi5uZWcgPSAweDEwMDE7CisKKyAgZGxuLm5sbiA9IGxjOworCisgIC8qIFJ1biB0aHJvdWdoIG9uY2UgbW9yZSBhbmQgZmlsbCB1cCB0aGUgc3RydWN0dXJlICovCisgIGlkeCA9IDA7CisgIGZvciAoc3kgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKKyAgICAgICBzeTsKKyAgICAgICBzeSA9IHN5LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChzeS0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCisJeworCSAgaW50IGk7CisJICBzdHJ1Y3QgY29mZl9saW5lICpsID0gc3ktPnR5cGUtPnUuZnVuY3Rpb24ubGluZXM7CisJICBpZiAobCkKKwkgICAgeworCSAgICAgIGludCBiYXNlID0gZmluZF9iYXNlIChzZmlsZSwgc3ktPndoZXJlLT5zZWN0aW9uKTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+bmxpbmVzOyBpKyspCisJCXsKKwkJICBkbG4uc2VjdGlvbltpZHhdID0gc3ktPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7CisJCSAgZGxuLnNmbltpZHhdID0gMDsKKwkJICBkbG4uc2xuW2lkeF0gPSBsLT5saW5lc1tpXTsKKwkJICBkbG4uZnJvbV9hZGRyZXNzW2lkeF0gPQorCQkgICAgbC0+YWRkcmVzc2VzW2ldICsgc3ktPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzIC0gYmFzZTsKKwkJICBkbG4uY2NbaWR4XSA9IDA7CisJCSAgaWYgKGlkeCkKKwkJICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHhdOworCQkgIGlkeCsrOworCisJCX0KKwkgICAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4IC0gMV0gKyAyOworCSAgICB9CisJfQorICAgIH0KKyAgaWYgKGxjKQorICAgIHN5c3JvZmZfc3dhcF9kbG5fb3V0IChmaWxlLCAmZGxuKTsKKyNlbmRpZgorfQorCisvKiBXcml0ZSB0aGUgZ2xvYmFsIHN5bWJvbHMgb3V0IHRvIHRoZSBkZWJ1ZyBpbmZvICovCitzdGF0aWMgdm9pZAord3JfZ2xvYmFscyAocCwgc2ZpbGUsIG4pCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOworICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7CisgICAgIGludCBuOworeworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OworICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKKyAgICAgICBzeTsKKyAgICAgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCisgICAgeworICAgICAgaWYgKHN5LT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9kZWYKKwkgIHx8IHN5LT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCisJeworCSAgLyogT25seSB3cml0ZSBvdXQgc3ltYm9scyBpZiB0aGV5IGJlbG9uZyB0bworCSAgICAgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgKi8KKwkgIGlmIChzeS0+c2ZpbGUgPT0gc2ZpbGUpCisJICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBzeSwgMCk7CisKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3JfZGVidWcgKHApCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOworeworICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7CisgIGludCBuID0gMDsKKyAgZm9yIChzZmlsZSA9IHAtPnNvdXJjZV9oZWFkOworICAgICAgIHNmaWxlOworICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCisKKyAgICB7CisgICAgICBpZiAoZGVidWcpCisJeworCSAgcHJpbnRmICgiJXNcbiIsIHNmaWxlLT5uYW1lKTsKKwl9CisgICAgICB3cl9kdSAocCwgc2ZpbGUsIG4pOworICAgICAgd3JfZHVzIChwLCBzZmlsZSk7CisgICAgICB3cl9wcm9ncmFtX3N0cnVjdHVyZSAocCwgc2ZpbGUpOworICAgICAgd3JfZGxuIChwLCBzZmlsZSwgbik7CisgICAgICBuKys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3JfY3MgKCkKK3sKKyAgLyogSXQgc2VlbXMgdGhhdCB0aGUgQ1Mgc3RydWN0IGlzIG5vdCBub3JtYWwgLSB0aGUgc2l6ZSBpcyB3cm9uZworICAgICBoZXJlcyBvbmUgSSBwcmVwYXJlZCBlYXJsaWVyLi4gKi8KKyAgc3RhdGljIGNoYXIgYltdID0geworICAgIDB4ODAsCQkJLyogSVQgKi8KKyAgICAweDIxLAkJCS8qIFJMICovCisgICAgMHgwMCwJCQkvKiBudW1iZXIgb2YgY2hhcnMgaW4gdmFyaWFibGUgbGVuZ3RoIHBhcnQgKi8KKyAgICAweDgwLAkJCS8qIGhkICovIAorICAgIDB4MDAsCQkJLyogaHMgKi8gCisgICAgMHg4MCwJCQkvKiB1biAqLyAKKyAgICAweDAwLAkJCS8qIHVzICovIAorICAgIDB4ODAsCQkJLyogc2MgKi8gCisgICAgMHgwMCwJCQkvKiBzcyAqLyAKKyAgICAweDgwLAkJCS8qIGVyICovIAorICAgIDB4ODAsCQkJLyogZWQgKi8gCisgICAgMHg4MCwJCQkvKiBzaCAqLyAKKyAgICAweDgwLAkJCS8qIG9iICovIAorICAgIDB4ODAsCQkJLyogcmwgKi8gCisgICAgMHg4MCwJCQkvKiBkdSAqLworICAgIDB4ODAsCQkJLyogZHBzICovCisgICAgMHg4MCwJCQkvKiBkc3kgKi8KKyAgICAweDgwLAkJCS8qIGR0eSAqLworICAgIDB4ODAsCQkJLyogZGxuICovCisgICAgMHg4MCwJCQkvKiBkc28gKi8KKyAgICAweDgwLAkJCS8qIGR1cyAqLworICAgIDB4MDAsCQkJLyogZHNzICovCisgICAgMHg4MCwJCQkvKiBkYnQgKi8KKyAgICAweDAwLAkJCS8qIGRwcCAqLworICAgIDB4ODAsCQkJLyogZGZwICovCisgICAgMHg4MCwJCQkvKiBkZW4gKi8KKyAgICAweDgwLAkJCS8qIGRkcyAqLworICAgIDB4ODAsCQkJLyogZGFyICovCisgICAgMHg4MCwJCQkvKiBkcHQgKi8KKyAgICAweDAwLAkJCS8qIGR1bCAqLworICAgIDB4MDAsCQkJLyogZHNlICovCisgICAgMHgwMCwJCQkvKiBkb3QgKi8KKyAgICAweERFCQkJLyogQ1MgKi8KKyAgfTsKKyAgZndyaXRlIChiLCAxLCBzaXplb2YgKGIpLCBmaWxlKTsKK30KKworLyogV3JpdGUgb3V0IHRoZSBTQyByZWNvcmRzIGZvciBhIHVuaXQuICBDcmVhdGUgYW4gU0MKKyAgIGZvciBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUsIGV2ZW4KKyAgIGlmIHRoZXJlIGlzbid0IGFuIGVxdWl2YWxlbnQgb25lIG9uIHRoZSBpbnB1dCAqLworCitzdGF0aWMgaW50Cit3cl9zYyAocHRyLCBzZmlsZSkKKyAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworeworICBpbnQgaTsKK2ludCBzY291bnQgPSAwOworICAvKiBGaXJzdCB3b3JrIG91dCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlY3Rpb25zICovCisKKyAgaW50IHRvdGFsX3NlYyA9IHB0ci0+bnNlY3Rpb25zOworCisgIHN0cnVjdCBteWluZm8KKyAgICB7CisgICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7CisgICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKKyAgICB9OworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKKworICBzdHJ1Y3QgbXlpbmZvICppbmZvCisgICAgPSAoc3RydWN0IG15aW5mbyAqKSBjYWxsb2MgKHRvdGFsX3NlYywgc2l6ZW9mIChzdHJ1Y3QgbXlpbmZvKSk7CisKKworCisgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9zZWM7IGkrKykKKyAgICB7CisgICAgICBpbmZvW2ldLnNlYyA9IHB0ci0+c2VjdGlvbnMgKyBpOworICAgICAgaW5mb1tpXS5zeW1ib2wgPSAwOworICAgIH0KKworICBmb3IgKHN5bWJvbCA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOworICAgICAgIHN5bWJvbDsKKyAgICAgICBzeW1ib2wgPSBzeW1ib2wtPm5leHQpCisgICAgeworCisgICAgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCisJeworCSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3NlYzsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24gPT0gaW5mb1tpXS5zZWMpCisJCXsKKwkJICBpbmZvW2ldLnN5bWJvbCA9IHN5bWJvbDsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAvKiBOb3cgb3V0cHV0IGFsbCB0aGUgc2VjdGlvbiBpbmZvLCBhbmQgZmFrZSB1cCBzb21lIHN0dWZmIGZvciBzZWN0aW9ucworICAgICB3ZSBkb24ndCBoYXZlICovCisKKyAgZm9yIChpID0gMTsgaSA8IHRvdGFsX3NlYzsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBJVF9zYyBzYzsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBzeW1ib2wgPSBpbmZvW2ldLnN5bWJvbDsKKyAgICAgIHNjLnNwYXJlID0gMDsKKyAgICAgIHNjLnNwYXJlMSA9IDA7CisgICAgICBpZiAoIXN5bWJvbCkKKwl7CisJICAvKiBEb24ndCBoYXZlIGEgc3ltYm9sIHNldCBhc2lkZSBmb3IgdGhpcyBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IG5vdGhpbmcKKwkgICAgIGluIHRoaXMgZmlsZSBkb2VzIGFueXRoaW5nIGZvciB0aGUgc2VjdGlvbi4gKi8KKwkgIHNjLmZvcm1hdCA9ICEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCk7CisJICBzYy5hZGRyID0gMDsKKwkgIHNjLmxlbmd0aCA9IDA7CisJICBuYW1lID0gaW5mb1tpXS5zZWMtPm5hbWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQorCSAgICB7CisJICAgICAgc2MuZm9ybWF0ID0gMDsKKwkgICAgICBzYy5hZGRyID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzYy5mb3JtYXQgPSAxOworCSAgICAgIHNjLmFkZHIgPSAwOworCSAgICB9CisJICBzYy5sZW5ndGggPSBzeW1ib2wtPnR5cGUtPnNpemU7CisJICBuYW1lID0gc3ltYm9sLT5uYW1lOworCX0KKworICAgICAgc2MuYWxpZ24gPSA0OworCisgICAgICBzYy5jb25jYXQgPSBDT05DQVRfU0lNUExFOworICAgICAgc2MucmVhZCA9IDM7CisgICAgICBzYy53cml0ZSA9IDM7CisgICAgICBzYy5leGVjID0gMzsKKyAgICAgIHNjLmluaXQgPSAzOworICAgICAgc2MubW9kZSA9IDM7CisgICAgICBzYy5zcGFyZSA9IDA7CisgICAgICBzYy5zZWdhZGQgPSAwOworICAgICAgc2Muc3BhcmUxID0gMDsJCS8qIElmIG5vdCB6ZXJvLCB0aGVuIGl0IGRvZXNuJ3Qgd29yayAqLworICAgICAgc2MubmFtZSA9IHNlY3Rpb25fdHJhbnNsYXRlIChuYW1lKTsKKyAgICAgIGlmIChzdHJsZW4gKHNjLm5hbWUpID09IDEpCisJeworCSAgc3dpdGNoIChzYy5uYW1lWzBdKQorCSAgICB7CisJICAgIGNhc2UgJ0QnOgorCSAgICBjYXNlICdCJzoKKwkgICAgICBzYy5jb250ZW50cyA9IENPTlRFTlRTX0RBVEE7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgc2MuY29udGVudHMgPSBDT05URU5UU19DT0RFOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNjLmNvbnRlbnRzID0gQ09OVEVOVFNfQ09ERTsKKwl9CisjaWYgMAorICAgICAgLyogTkVXICovCisgICAgICBpZiAoc2MubGVuZ3RoKSB7CisjZW5kaWYKKwlzeXNyb2ZmX3N3YXBfc2Nfb3V0IChmaWxlLCAmc2MpOworCXNjb3VudCsrOworI2lmIDAKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KK3JldHVybiBzY291bnQ7Cit9CisKKworLyogV3JpdGUgb3V0IHRoZSBFUiByZWNvcmRzIGZvciBhIHVuaXQuICovCitzdGF0aWMgdm9pZAord3JfZXIgKHB0ciwgc2ZpbGUsIGZpcnN0KQorICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOworICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7CisgICAgIGludCBmaXJzdDsKK3sKKyAgaW50IGlkeCA9IDA7CisgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltOworICBpZiAoZmlyc3QpCisgICAgeworICAgICAgZm9yIChzeW0gPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHN5bTsgc3ltID0gc3ltLT5uZXh0X2luX29maWxlX2xpc3QpCisJeworCSAgaWYgKHN5bS0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQorCSAgICB7CisJICAgICAgc3RydWN0IElUX2VyIGVyOworCSAgICAgIGVyLnNwYXJlID0gMDsKKwkgICAgICBlci50eXBlID0gRVJfTk9UU1BFQzsKKwkgICAgICBlci5uYW1lID0gc3ltLT5uYW1lOworCSAgICAgIHN5c3JvZmZfc3dhcF9lcl9vdXQgKGZpbGUsICZlcik7CisJICAgICAgc3ltLT5lcl9udW1iZXIgPSBpZHgrKzsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIFdyaXRlIG91dCB0aGUgRUQgcmVjb3JkcyBmb3IgYSB1bml0LiAqLworc3RhdGljIHZvaWQKK3dyX2VkIChwdHIsIHNmaWxlLCBmaXJzdCkKKyAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKKyAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworICAgICBpbnQgZmlyc3Q7Cit7CisgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKKyAgaWYgKGZpcnN0KQorICAgIHsKKyAgICAgIGZvciAocyA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgczsgcyA9IHMtPm5leHRfaW5fb2ZpbGVfbGlzdCkKKwl7CisJICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfZGVmCisJICAgICAgfHwgcy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgSVRfZWQgZWQ7CisKKwkgICAgICBlZC5zZWN0aW9uID0gcy0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKKwkgICAgICBlZC5zcGFyZSA9IDA7CisJICAgICAgaWYgKHMtPndoZXJlLT5zZWN0aW9uLT5kYXRhKQorCQl7CisJCSAgZWQudHlwZSA9IEVEX1RZUEVfREFUQTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHMtPndoZXJlLT5zZWN0aW9uLT5jb2RlICYgU0VDX0NPREUpCisJCXsKKwkJICBlZC50eXBlID0gRURfVFlQRV9FTlRSWTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGVkLnR5cGUgPSBFRF9UWVBFX05PVFNQRUM7CisJCSAgZWQudHlwZSA9IEVEX1RZUEVfREFUQTsKKwkJfQorCSAgICAgIGVkLmFkZHJlc3MgPSBzLT53aGVyZS0+b2Zmc2V0IC0gcy0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3M7CisJICAgICAgZWQubmFtZSA9IHMtPm5hbWU7CisJICAgICAgc3lzcm9mZl9zd2FwX2VkX291dCAoZmlsZSwgJmVkKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cl91bml0X2luZm8gKHB0cikKKyAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKK3sKKyAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOworICBpbnQgZmlyc3QgPSAxOworICBmb3IgKHNmaWxlID0gcHRyLT5zb3VyY2VfaGVhZDsKKyAgICAgICBzZmlsZTsKKyAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQorICAgIHsKKyAgICAgIGxvbmcgcDE7CisgICAgICBsb25nIHAyOworICAgICAgaW50IG5zZWNzOworICAgICAgcDEgPSBmdGVsbCAoZmlsZSk7CisgICAgICB3cl91biAocHRyLCBzZmlsZSwgZmlyc3QsIDApOworICAgICAgbnNlY3MgPSB3cl9zYyAocHRyLCBzZmlsZSk7CisgICAgICBwMiA9IGZ0ZWxsIChmaWxlKTsKKyAgICAgIGZzZWVrIChmaWxlLCBwMSwgU0VFS19TRVQpOworICAgICAgd3JfdW4gKHB0ciwgc2ZpbGUsIGZpcnN0LCBuc2Vjcyk7CisgICAgICBmc2VlayAoZmlsZSwgcDIsIFNFRUtfU0VUKTsgCisgICAgICB3cl9lciAocHRyLCBzZmlsZSwgZmlyc3QpOworICAgICAgd3JfZWQgKHB0ciwgc2ZpbGUsIGZpcnN0KTsKKyAgICAgIGZpcnN0ID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit3cl9tb2R1bGUgKHApCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOworeworICB3cl9jcyAoKTsKKyAgd3JfaGQgKHApOworICB3cl91bml0X2luZm8gKHApOworICB3cl9vYmplY3RfYm9keSAocCk7CisgIHdyX2RlYnVnIChwKTsKKyAgd3JfdHIgKCk7Cit9CisKK3N0YXRpYyBpbnQKK2FsaWduICh4KQorICAgICBpbnQgeDsKK3sKKyAgcmV0dXJuICh4ICsgMykgJiB+MzsKK30KKworLyogRmluZCBhbGwgdGhlIGNvbW1vbiB2YXJpYWJsZXMgYW5kIHR1cm4gdGhlbSBpbnRvCisgICBvcmRpbmFyeSBkZWZzIC0gZHVubm8gd2h5LCBidXQgdGhhdHMgd2hhdCBoaXRhY2hpIGRvZXMgd2l0aCAnZW0gKi8KKworc3RhdGljIHZvaWQKK3ByZXNjYW4gKHRyZWUpCisgICAgIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOworeworICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7CisgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKmNvbW1vbl9zZWN0aW9uOworICAvKiBGaW5kIHRoZSBjb21tb24gc2VjdGlvbiAtIGFsd2F5cyBzZWN0aW9uIDMgKi8KKyAgY29tbW9uX3NlY3Rpb24gPSB0cmVlLT5zZWN0aW9ucyArIDM7CisgIGZvciAocyA9IHRyZWUtPnN5bWJvbF9saXN0X2hlYWQ7CisgICAgICAgczsKKyAgICAgICBzID0gcy0+bmV4dF9pbl9vZmlsZV9saXN0KQorICAgIHsKKyAgICAgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKKwl7CisJICBzdHJ1Y3QgY29mZl93aGVyZSAqdyA9IHMtPndoZXJlOworCSAgLyogICAgICBzLT52aXNpYmxlLT50eXBlID0gY29mZl92aXNfZXh0X2RlZjsgbGVhdmUgaXQgYXMgY29tbW9uICovCisJICBjb21tb25fc2VjdGlvbi0+c2l6ZSA9IGFsaWduIChjb21tb25fc2VjdGlvbi0+c2l6ZSk7CisJICB3LT5vZmZzZXQgPSBjb21tb25fc2VjdGlvbi0+c2l6ZSArIGNvbW1vbl9zZWN0aW9uLT5hZGRyZXNzOworCSAgdy0+c2VjdGlvbiA9IGNvbW1vbl9zZWN0aW9uOworCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgKz0gcy0+dHlwZS0+c2l6ZTsKKwkgIGNvbW1vbl9zZWN0aW9uLT5zaXplID0gYWxpZ24gKGNvbW1vbl9zZWN0aW9uLT5zaXplKTsKKwl9CisgICAgfQorfQorCitjaGFyICpwcm9ncmFtX25hbWU7CisKK3N0YXRpYyB2b2lkCitzaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKGZpbGUsIF8oIlVzYWdlOiAlcyBbLWRoVnFdIGluLWZpbGUgW291dC1maWxlXVxuIiksIHByb2dyYW1fbmFtZSk7CisgIGV4aXQgKHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X2hlbHAgKCkKK3sKKyAgcHJpbnRmIChfKCIlczogQ29udmVydCBhIENPRkYgb2JqZWN0IGZpbGUgaW50byBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAorCSAgcHJvZ3JhbV9uYW1lKTsKKyAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKK30KKworCisKK2ludAorbWFpbiAoYWMsIGF2KQorICAgICBpbnQgYWM7CisgICAgIGNoYXIgKmF2W107Cit7CisgIGludCBvcHQ7CisgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KKyAgeworICAgIHsiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnfSwKKyAgICB7InF1aWNrIiwgbm9fYXJndW1lbnQsIDAsICdxJ30sCisgICAgeyJub3ByZXNjYW4iLCBub19hcmd1bWVudCwgMCwgJ24nfSwKKyAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKKyAgICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKKyAgICB7TlVMTCwgbm9fYXJndW1lbnQsIDAsIDB9CisgIH07CisgIGNoYXIgKiptYXRjaGluZzsKKyAgY2hhciAqaW5wdXRfZmlsZTsKKyAgY2hhciAqb3V0cHV0X2ZpbGU7CisKKyNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKKyAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOworI2VuZGlmCisgIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOworICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKKworICBwcm9ncmFtX25hbWUgPSBhdlswXTsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFjLCBhdiwgImRoVnFuIiwgbG9uZ19vcHRpb25zLAorCQkJICAgICAoaW50ICopIE5VTEwpKQorCSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChvcHQpCisJeworCWNhc2UgJ3EnOgorCSAgcXVpY2sgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnbic6CisJICBub3ByZXNjYW4gPSAxOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBkZWJ1ZyA9IDE7CisJICBicmVhazsKKwljYXNlICdoJzoKKwkgIHNob3dfaGVscCAoKTsKKwkgIC8qTk9UUkVBQ0hFRCAqLworCWNhc2UgJ1YnOgorCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKKwkgIGV4aXQgKDApOworCSAgLypOT1RSRUFDSEVEICovCisJY2FzZSAwOgorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7CisJICAvKk5PVFJFQUNIRUQgKi8KKwl9CisgICAgfQorCisgIC8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG1heSBiZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KKyAgb3V0cHV0X2ZpbGUgPSBOVUxMOworICBpZiAob3B0aW5kIDwgYWMpCisgICAgeworICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07CisgICAgICArK29wdGluZDsKKyAgICAgIGlmIChvcHRpbmQgPCBhYykKKwl7CisJICBvdXRwdXRfZmlsZSA9IGF2W29wdGluZF07CisJICArK29wdGluZDsKKwkgIGlmIChvcHRpbmQgPCBhYykKKwkgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKKwkgIGlmIChzdHJjbXAgKGlucHV0X2ZpbGUsIG91dHB1dF9maWxlKSA9PSAwKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAgXygiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIpLAorCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICBpbnB1dF9maWxlID0gMDsKKworICBpZiAoIWlucHV0X2ZpbGUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAorCSAgICAgICBwcm9ncmFtX25hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmICghb3V0cHV0X2ZpbGUpCisgICAgeworICAgICAgLyogVGFrZSBhIC5vIG9mZiB0aGUgaW5wdXQgZmlsZSBhbmQgc3RpY2sgb24gYSAub2JqLiAgSWYKKyAgICAgICAgIGl0IGRvZXNuJ3QgZW5kIGluIC5vLCB0aGVuIHN0aWNrIGEgLm9iaiBvbiBhbnl3YXkgKi8KKworICAgICAgaW50IGxlbiA9IHN0cmxlbiAoaW5wdXRfZmlsZSk7CisgICAgICBvdXRwdXRfZmlsZSA9IHhtYWxsb2MgKGxlbiArIDUpOworICAgICAgc3RyY3B5IChvdXRwdXRfZmlsZSwgaW5wdXRfZmlsZSk7CisgICAgICBpZiAobGVuID4gMworCSAgJiYgb3V0cHV0X2ZpbGVbbGVuIC0gMl0gPT0gJy4nCisJICAmJiBvdXRwdXRfZmlsZVtsZW4gLSAxXSA9PSAnbycpCisJeworCSAgb3V0cHV0X2ZpbGVbbGVuXSA9ICdiJzsKKwkgIG91dHB1dF9maWxlW2xlbiArIDFdID0gJ2onOworCSAgb3V0cHV0X2ZpbGVbbGVuICsgMl0gPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdHJjYXQgKG91dHB1dF9maWxlLCAiLm9iaiIpOworCX0KKyAgICB9CisKKyAgYWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZSwgMCk7CisKKyAgaWYgKCFhYmZkKQorICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCisgICAgeworICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisJeworCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7CisJICBmcmVlIChtYXRjaGluZyk7CisJfQorICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGZpbGUgPSBmb3BlbiAob3V0cHV0X2ZpbGUsIEZPUEVOX1dCKTsKKworICBpZiAoIWZpbGUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIpLAorCSAgICAgICBwcm9ncmFtX25hbWUsIG91dHB1dF9maWxlKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoZGVidWcpCisgICAgcHJpbnRmICgiaWRzICVkICVkXG4iLCBiYXNlMSwgYmFzZTIpOworICB0cmVlID0gY29mZl9ncm9rIChhYmZkKTsKKyAgaWYgKCFub3ByZXNjYW4pCisgICAgcHJlc2NhbiAodHJlZSk7CisgIHdyX21vZHVsZSAodHJlZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RhYnMuYyBiL2JpbnV0aWxzL3N0YWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3YjNiZAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N0YWJzLmMKQEAgLTAsMCArMSw1MTg4IEBACisvKiBzdGFicy5jIC0tIFBhcnNlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIHBhcnNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgICBUaGUgb3JnYW5pemF0aW9uIG9mIHRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgZ2RiIHN0YWJzIHJlYWRpbmcKKyAgIGNvZGUuICBUaGUgam9iIGl0IGRvZXMgaXMgc29tZXdoYXQgZGlmZmVyZW50LCBiZWNhdXNlIGl0IGlzIG5vdAorICAgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0IGFkZHJlc3MgZm9yIGFueXRoaW5nLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJidWRiZy5oIgorCisvKiBNZWFuaW5nbGVzcyBkZWZpbml0aW9uIG5lZWRzIGJ5IGFvdXQ2NC5oLiAgRklYTUUuICAqLworI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKKworI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorCisjaWZuZGVmIERJUl9TRVBBUkFUT1IKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgRElSX1NFUEFSQVRPUiAnXFwnCisjZWxzZQorI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJworI2VuZGlmCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBwcmVkZWZpbmVkIFhDT0ZGIHR5cGVzLiAgKi8KKworI2RlZmluZSBYQ09GRl9UWVBFX0NPVU5UIDM0CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBoYW5kbGUgc28gdGhhdCB0aGUgc3RhYiBwYXJzaW5nIGRvZXNuJ3QKKyAgIG5lZWQgdG8gdXNlIGFueSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KKworc3RydWN0IHN0YWJfaGFuZGxlCit7CisgIC8qIFRoZSBCRkQuICAqLworICBiZmQgKmFiZmQ7CisgIC8qIFRydWUgaWYgdGhpcyBpcyBzdGFicyBpbiBzZWN0aW9ucy4gICovCisgIGJvb2xlYW4gc2VjdGlvbnM7CisgIC8qIFRoZSBzeW1ib2wgdGFibGUuICAqLworICBhc3ltYm9sICoqc3ltczsKKyAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KKyAgbG9uZyBzeW1jb3VudDsKKyAgLyogVGhlIGFjY3VtdWxhdGVkIGZpbGUgbmFtZSBzdHJpbmcuICAqLworICBjaGFyICpzb19zdHJpbmc7CisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBOX1NPIHN5bWJvbC4gICovCisgIGJmZF92bWEgc29fdmFsdWU7CisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBmaWxlCisgICAgIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCisgIGJmZF92bWEgZmlsZV9zdGFydF9vZmZzZXQ7CisgIC8qIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgc28gdGhhdCB3ZSBjYW4gaGFuZGxlCisgICAgIGZ1bmN0aW9uIHJlbGF0aXZlIE5fTEJSQUMgYW5kIE5fUkJSQUMgc3ltYm9scy4gICovCisgIGJmZF92bWEgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OworICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgZ2NjIHdoaWNoIGNvbXBpbGVkIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uCisgICAgIHVuaXQsIDAgaWYgbm90IGNvbXBpbGVkIGJ5IGdjYy4gICovCisgIGludCBnY2NfY29tcGlsZWQ7CisgIC8qIFdoZXRoZXIgYW4gTl9PUFQgc3ltYm9sIHdhcyBzZWVuIHRoYXQgd2FzIG5vdCBnZW5lcmF0ZWQgYnkgZ2NjLAorICAgICBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgdGhlIFN1blBSTyBjb21waWxlci4gICovCisgIGJvb2xlYW4gbl9vcHRfZm91bmQ7CisgIC8qIFRoZSBtYWluIGZpbGUgbmFtZS4gICovCisgIGNoYXIgKm1haW5fZmlsZW5hbWU7CisgIC8qIEEgc3RhY2sgb2YgdW5maW5pc2hlZCBOX0JJTkNMIGZpbGVzLiAgKi8KKyAgc3RydWN0IGJpbmNsX2ZpbGUgKmJpbmNsX3N0YWNrOworICAvKiBBIGxpc3Qgb2YgZmluaXNoZWQgTl9CSU5DTCBmaWxlcy4gICovCisgIHN0cnVjdCBiaW5jbF9maWxlICpiaW5jbF9saXN0OworICAvKiBXaGV0aGVyIHdlIGFyZSBpbnNpZGUgYSBmdW5jdGlvbiBvciBub3QuICAqLworICBib29sZWFuIHdpdGhpbl9mdW5jdGlvbjsKKyAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHVzZWQgaWYgd2UgaGF2ZSBzZWVuIGFuCisgICAgIE5fRlVOIHN5bWJvbCB3aGlsZSBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBpcyAtMSBpZiB3ZSBoYXZlIG5vdCBzZWVuCisgICAgIGFuIE5fRlVOICh0aGUgbm9ybWFsIGNhc2UpLiAgKi8KKyAgYmZkX3ZtYSBmdW5jdGlvbl9lbmQ7CisgIC8qIFRoZSBkZXB0aCBvZiBibG9jayBuZXN0aW5nLiAgKi8KKyAgaW50IGJsb2NrX2RlcHRoOworICAvKiBMaXN0IG9mIHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICAqLworICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqcGVuZGluZzsKKyAgLyogTnVtYmVyIG9mIGZpbGVzIGZvciB3aGljaCB3ZSBoYXZlIHR5cGVzLiAgKi8KKyAgdW5zaWduZWQgaW50IGZpbGVzOworICAvKiBMaXN0cyBvZiB0eXBlcyBwZXIgZmlsZS4gICovCisgIHN0cnVjdCBzdGFiX3R5cGVzICoqZmlsZV90eXBlczsKKyAgLyogUHJlZGVmaW5lZCBYQ09GRiB0eXBlcy4gICovCisgIGRlYnVnX3R5cGUgeGNvZmZfdHlwZXNbWENPRkZfVFlQRV9DT1VOVF07CisgIC8qIFVuZGVmaW5lZCB0YWdzLiAgKi8KKyAgc3RydWN0IHN0YWJfdGFnICp0YWdzOworICAvKiBTZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIGl0IHNlZXMgYSBzdHJ1Y3R1cmUgZGVmaW5lZCBhcyBhIGNyb3NzCisgICAgIHJlZmVyZW5jZSB0byBpdHNlbGYuICBSZXNldCBieSBwYXJzZV9zdGFiX3R5cGUgb3RoZXJ3aXNlLiAgKi8KKyAgYm9vbGVhbiBzZWxmX2Nyb3NzcmVmOworfTsKKworLyogQSBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0byBob2xkIHBlbmRpbmcgdmFyaWFibGUKKyAgIGRlZmluaXRpb25zIHNlZW4gYmVmb3JlIHRoZSBOX0xCUkFDIG9mIGEgYmxvY2suICAqLworCitzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhcgoreworICAvKiBOZXh0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbi4gICovCisgIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpuZXh0OworICAvKiBOYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogVHlwZS4gICovCisgIGRlYnVnX3R5cGUgdHlwZTsKKyAgLyogS2luZC4gICovCisgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKKyAgLyogVmFsdWUuICAqLworICBiZmRfdm1hIHZhbDsKK307CisKKy8qIEEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8gaG9sZCB0aGUgdHlwZXMgZm9yIGEgc2luZ2xlCisgICBmaWxlLiAgKi8KKworc3RydWN0IHN0YWJfdHlwZXMKK3sKKyAgLyogTmV4dCBzZXQgb2Ygc2xvdHMgZm9yIHRoaXMgZmlsZS4gICovCisgIHN0cnVjdCBzdGFiX3R5cGVzICpuZXh0OworICAvKiBUeXBlcyBpbmRleGVkIGJ5IHR5cGUgbnVtYmVyLiAgKi8KKyNkZWZpbmUgU1RBQl9UWVBFU19TTE9UUyAoMTYpCisgIGRlYnVnX3R5cGUgdHlwZXNbU1RBQl9UWVBFU19TTE9UU107Cit9OworCisvKiBXZSBrZWVwIGEgbGlzdCBvZiB1bmRlZmluZWQgdGFncyB0aGF0IHdlIGVuY291bnRlciwgc28gdGhhdCB3ZSBjYW4KKyAgIGZpbGwgdGhlbSBpbiBpZiB0aGUgdGFnIGlzIGxhdGVyIGRlZmluZWQuICAqLworCitzdHJ1Y3Qgc3RhYl90YWcKK3sKKyAgLyogTmV4dCB1bmRlZmluZWQgdGFnLiAgKi8KKyAgc3RydWN0IHN0YWJfdGFnICpuZXh0OworICAvKiBUYWcgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIFR5cGUga2luZC4gICovCisgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7CisgIC8qIFNsb3QgdG8gaG9sZCByZWFsIHR5cGUgd2hlbiB3ZSBkaXNjb3ZlciBpdC4gIElmIHdlIGRvbid0LCB3ZSBmaWxsCisgICAgIGluIGFuIHVuZGVmaW5lZCB0YWcgdHlwZS4gICovCisgIGRlYnVnX3R5cGUgc2xvdDsKKyAgLyogSW5kaXJlY3QgdHlwZSB3ZSBoYXZlIGNyZWF0ZWQgdG8gcG9pbnQgYXQgc2xvdC4gICovCisgIGRlYnVnX3R5cGUgdHlwZTsKK307CisKK3N0YXRpYyBjaGFyICpzYXZlc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgYmZkX3ZtYSBwYXJzZV9udW1iZXIgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgYm9vbGVhbiAqKSk7CitzdGF0aWMgdm9pZCBiYWRfc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIHdhcm5fc3RhYiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9zdHJpbmcKKyAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl90eXBlCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKKwkgICBkZWJ1Z190eXBlICoqKSk7CitzdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGludCAqKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAorCSAgIGNvbnN0IGludCAqKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOworc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9lbnVtX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX3N0cnVjdF90eXBlCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYm9vbGVhbiwKKwkgICBjb25zdCBpbnQgKikpOworc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcworICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19iYXNlY2xhc3MgKiopKTsKK3N0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcworICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKiwKKwkgICBib29sZWFuICopKTsKK3N0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfY3BwX2FiYnJldgorICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z19maWVsZCAqKSk7CitzdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQKKyAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqLAorCSAgIGRlYnVnX2ZpZWxkICosIGJvb2xlYW4gKikpOworc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9tZW1iZXJzCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKKwkgICBjb25zdCBpbnQgKiwgZGVidWdfbWV0aG9kICoqKSk7CitzdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9zdGFiX2FyZ3R5cGVzCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCSAgIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKikpOworc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl90aWxkZV9maWVsZAorICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBpbnQgKiwKKwkgICBkZWJ1Z190eXBlICosIGJvb2xlYW4gKikpOworc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9hcnJheV90eXBlCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGJvb2xlYW4pKTsKK3N0YXRpYyB2b2lkIHB1c2hfYmluY2wgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOworc3RhdGljIGNvbnN0IGNoYXIgKnBvcF9iaW5jbCBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikpOworc3RhdGljIGJvb2xlYW4gZmluZF9leGNsCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfcmVjb3JkX3ZhcmlhYmxlCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwKKwkgICBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2VtaXRfcGVuZGluZ192YXJzIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICopKTsKK3N0YXRpYyBkZWJ1Z190eXBlICpzdGFiX2ZpbmRfc2xvdAorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgaW50ICopKTsKK3N0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90eXBlCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3JlY29yZF90eXBlCisgIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqLCBkZWJ1Z190eXBlKSk7CitzdGF0aWMgZGVidWdfdHlwZSBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZQorICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBpbnQpKTsKK3N0YXRpYyBkZWJ1Z190eXBlIHN0YWJfZmluZF90YWdnZWRfdHlwZQorICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGludCwKKwkgICBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOworc3RhdGljIGRlYnVnX3R5cGUgKnN0YWJfZGVtYW5nbGVfYXJndHlwZXMKKyAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKKworLyogU2F2ZSBhIHN0cmluZyBpbiBtZW1vcnkuICAqLworCitzdGF0aWMgY2hhciAqCitzYXZlc3RyaW5nIChzdGFydCwgbGVuKQorICAgICBjb25zdCBjaGFyICpzdGFydDsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciAqcmV0OworCisgIHJldCA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOworICBtZW1jcHkgKHJldCwgc3RhcnQsIGxlbik7CisgIHJldFtsZW5dID0gJ1wwJzsKKyAgcmV0dXJuIHJldDsKK30KKworLyogUmVhZCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLiAgKi8KKworc3RhdGljIGJmZF92bWEKK3BhcnNlX251bWJlciAocHAsIHBvdmVyZmxvdykKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBib29sZWFuICpwb3ZlcmZsb3c7Cit7CisgIHVuc2lnbmVkIGxvbmcgdWw7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisKKyAgaWYgKHBvdmVyZmxvdyAhPSBOVUxMKQorICAgICpwb3ZlcmZsb3cgPSBmYWxzZTsKKworICBvcmlnID0gKnBwOworCisgIGVycm5vID0gMDsKKyAgdWwgPSBzdHJ0b3VsICgqcHAsIChjaGFyICoqKSBwcCwgMCk7CisgIGlmICh1bCArIDEgIT0gMCB8fCBlcnJubyA9PSAwKQorICAgIHsKKyAgICAgIC8qIElmIGJmZF92bWEgaXMgbGFyZ2VyIHRoYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoZSBudW1iZXIgaXMKKyAgICAgICAgIG1lYW50IHRvIGJlIG5lZ2F0aXZlLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNpZ24KKyAgICAgICAgIGV4dGVuZCBwcm9wZXJseS4gICovCisgICAgICBpZiAoKm9yaWcgPT0gJy0nKQorCXJldHVybiAoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAobG9uZykgdWw7CisgICAgICByZXR1cm4gKGJmZF92bWEpIHVsOworICAgIH0KKworICAvKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggc3RydG91bCBvdmVyZmxvd2VkLCBpdCBzaG91bGQgaGF2ZSBzZXQgKnBwCisgICAgIHRvIHRoZSBlbmQgb2YgdGhlIG51bWJlciwgd2hpY2ggaXMgd2hlcmUgd2Ugd2FudCBpdC4gICovCisKKyAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPiBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgICBib29sZWFuIG5lZzsKKyAgICAgIGludCBiYXNlOworICAgICAgYmZkX3ZtYSBvdmVyLCBsYXN0ZGlnOworICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKKyAgICAgIGJmZF92bWEgdjsKKworICAgICAgLyogT3VyIG93biB2ZXJzaW9uIG9mIHN0cnRvdWwsIGZvciBhIGJmZF92bWEuICAqLworCisgICAgICBwID0gb3JpZzsKKworICAgICAgbmVnID0gZmFsc2U7CisgICAgICBpZiAoKnAgPT0gJysnKQorCSsrcDsKKyAgICAgIGVsc2UgaWYgKCpwID09ICctJykKKwl7CisJICBuZWcgPSB0cnVlOworCSAgKytwOworCX0KKworICAgICAgYmFzZSA9IDEwOworICAgICAgaWYgKCpwID09ICcwJykKKwl7CisJICBpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpCisJICAgIHsKKwkgICAgICBiYXNlID0gMTY7CisJICAgICAgcCArPSAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBiYXNlID0gODsKKwkgICAgICArK3A7CisJICAgIH0KKwl9CisKKyAgICAgIG92ZXIgPSAoKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgLTEpIC8gKGJmZF92bWEpIGJhc2U7CisgICAgICBsYXN0ZGlnID0gKChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIC0xKSAlIChiZmRfdm1hKSBiYXNlOworCisgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICAgICAgdiA9IDA7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpbnQgZDsKKworCSAgZCA9ICpwKys7CisJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGQpKQorCSAgICBkIC09ICcwJzsKKwkgIGVsc2UgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBkKSkKKwkgICAgZCAtPSAnQSc7CisJICBlbHNlIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgZCkpCisJICAgIGQgLT0gJ2EnOworCSAgZWxzZQorCSAgICBicmVhazsKKworCSAgaWYgKGQgPj0gYmFzZSkKKwkgICAgYnJlYWs7CisKKwkgIGlmICh2ID4gb3ZlciB8fCAodiA9PSBvdmVyICYmIChiZmRfdm1hKSBkID4gbGFzdGRpZykpCisJICAgIHsKKwkgICAgICBvdmVyZmxvdyA9IHRydWU7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICghIG92ZXJmbG93KQorCXsKKwkgIGlmIChuZWcpCisJICAgIHYgPSAtIHY7CisJICByZXR1cm4gdjsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgbnVtYmVyIGlzIHRvbyBsYXJnZSB0byByZXByZXNlbnQgaW4gYQorICAgICBiZmRfdm1hLiAgKi8KKworICBpZiAocG92ZXJmbG93ICE9IE5VTEwpCisgICAgKnBvdmVyZmxvdyA9IHRydWU7CisgIGVsc2UKKyAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdpdmUgYW4gZXJyb3IgZm9yIGEgYmFkIHN0YWIgc3RyaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK2JhZF9zdGFiIChwKQorICAgICBjb25zdCBjaGFyICpwOworeworICBmcHJpbnRmIChzdGRlcnIsIF8oIkJhZCBzdGFiOiAlc1xuIiksIHApOworfQorCisvKiBXYXJuIGFib3V0IHNvbWV0aGluZyBpbiBhIHN0YWIgc3RyaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK3dhcm5fc3RhYiAocCwgZXJyKQorICAgICBjb25zdCBjaGFyICpwOworICAgICBjb25zdCBjaGFyICplcnI7Cit7CisgIGZwcmludGYgKHN0ZGVyciwgXygiV2FybmluZzogJXM6ICVzXG4iKSwgZXJyLCBwKTsKK30KKworLyogQ3JlYXRlIGEgaGFuZGxlIHRvIHBhcnNlIHN0YWJzIHN5bWJvbHMgd2l0aC4gICovCisKKy8qQVJHU1VTRUQqLworUFRSCitzdGFydF9zdGFiIChkaGFuZGxlLCBhYmZkLCBzZWN0aW9ucywgc3ltcywgc3ltY291bnQpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBiZmQgKmFiZmQ7CisgICAgIGJvb2xlYW4gc2VjdGlvbnM7CisgICAgIGFzeW1ib2wgKipzeW1zOworICAgICBsb25nIHN5bWNvdW50OworeworICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKnJldDsKKworICByZXQgPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKKyAgbWVtc2V0IChyZXQsIDAsIHNpemVvZiAqcmV0KTsKKyAgcmV0LT5hYmZkID0gYWJmZDsKKyAgcmV0LT5zZWN0aW9ucyA9IHNlY3Rpb25zOworICByZXQtPnN5bXMgPSBzeW1zOworICByZXQtPnN5bWNvdW50ID0gc3ltY291bnQ7CisgIHJldC0+ZmlsZXMgPSAxOworICByZXQtPmZpbGVfdHlwZXMgPSAoc3RydWN0IHN0YWJfdHlwZXMgKiopIHhtYWxsb2MgKHNpemVvZiAqcmV0LT5maWxlX3R5cGVzKTsKKyAgcmV0LT5maWxlX3R5cGVzWzBdID0gTlVMTDsKKyAgcmV0LT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7CisgIHJldHVybiAoUFRSKSByZXQ7Cit9CisKKy8qIFdoZW4gd2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHRoZSBzdGFicyBpbmZvcm1hdGlvbiwgd2UgbmVlZCB0byBnbworICAgdGhyb3VnaCBhbmQgZmlsbCBpbiBhbGwgdGhlIHVuZGVmaW5lZCB0YWdzLiAgKi8KKworYm9vbGVhbgorZmluaXNoX3N0YWIgKGRoYW5kbGUsIGhhbmRsZSkKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIFBUUiBoYW5kbGU7Cit7CisgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikgaGFuZGxlOworICBzdHJ1Y3Qgc3RhYl90YWcgKnN0OworCisgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCisgICAgeworICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKKwkgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBpbmZvLT5mdW5jdGlvbl9lbmQpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOworICAgICAgaW5mby0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOworICAgIH0KKworICBmb3IgKHN0ID0gaW5mby0+dGFnczsgc3QgIT0gTlVMTDsgc3QgPSBzdC0+bmV4dCkKKyAgICB7CisgICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOworCisgICAgICBraW5kID0gc3QtPmtpbmQ7CisgICAgICBpZiAoa2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCisJa2luZCA9IERFQlVHX0tJTkRfU1RSVUNUOworICAgICAgc3QtPnNsb3QgPSBkZWJ1Z19tYWtlX3VuZGVmaW5lZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgc3QtPm5hbWUsIGtpbmQpOworICAgICAgaWYgKHN0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBIYW5kbGUgYSBzaW5nbGUgc3RhYnMgc3ltYm9sLiAgKi8KKworYm9vbGVhbgorcGFyc2Vfc3RhYiAoZGhhbmRsZSwgaGFuZGxlLCB0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgUFRSIGhhbmRsZTsKKyAgICAgaW50IHR5cGU7CisgICAgIGludCBkZXNjOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKikgaGFuZGxlOworCisgIC8qIGdjYyB3aWxsIGVtaXQgdHdvIE5fU08gc3RyaW5ncyBwZXIgY29tcGlsYXRpb24gdW5pdCwgb25lIGZvciB0aGUKKyAgICAgZGlyZWN0b3J5IG5hbWUgYW5kIG9uZSBmb3IgdGhlIGZpbGUgbmFtZS4gIFdlIGp1c3QgY29sbGVjdCBOX1NPCisgICAgIHN0cmluZ3MgYXMgd2Ugc2VlIHRoZW0sIGFuZCBzdGFydCB0aGUgbmV3IGNvbXBpbGF0aW9uIHVuaXQgd2hlbgorICAgICB3ZSBzZWUgYSBub24gTl9TTyBzeW1ib2wuICAqLworICBpZiAoaW5mby0+c29fc3RyaW5nICE9IE5VTEwKKyAgICAgICYmICh0eXBlICE9IE5fU08gfHwgKnN0cmluZyA9PSAnXDAnIHx8IHZhbHVlICE9IGluZm8tPnNvX3ZhbHVlKSkKKyAgICB7CisgICAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGRoYW5kbGUsIGluZm8tPnNvX3N0cmluZykpCisJcmV0dXJuIGZhbHNlOworICAgICAgaW5mby0+bWFpbl9maWxlbmFtZSA9IGluZm8tPnNvX3N0cmluZzsKKworICAgICAgaW5mby0+Z2NjX2NvbXBpbGVkID0gMDsKKyAgICAgIGluZm8tPm5fb3B0X2ZvdW5kID0gZmFsc2U7CisKKyAgICAgIC8qIEdlbmVyYWxseSwgZm9yIHN0YWJzIGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZSBOX0xCUkFDIGFuZAorCSBOX1JCUkFDIHN5bWJvbHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBOX1NPIHN5bWJvbCB2YWx1ZS4gICovCisgICAgICBpZiAoISBpbmZvLT5zZWN0aW9ucykKKwlpbmZvLT5maWxlX3N0YXJ0X29mZnNldCA9IGluZm8tPnNvX3ZhbHVlOworCisgICAgICAvKiBXZSBuZWVkIHRvIHJlc2V0IHRoZSBtYXBwaW5nIGZyb20gdHlwZSBudW1iZXJzIHRvIHR5cGVzLiAgV2UKKwkgY2FuJ3QgZnJlZSB0aGUgb2xkIG1hcHBpbmcsIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZgorCSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUuICAqLworICAgICAgaW5mby0+ZmlsZXMgPSAxOworICAgICAgaW5mby0+ZmlsZV90eXBlcyA9ICgoc3RydWN0IHN0YWJfdHlwZXMgKiopCisJCQkgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+ZmlsZV90eXBlcykpOworICAgICAgaW5mby0+ZmlsZV90eXBlc1swXSA9IE5VTEw7CisKKyAgICAgIGluZm8tPnNvX3N0cmluZyA9IE5VTEw7CisKKyAgICAgIC8qIE5vdyBwcm9jZXNzIHdoYXRldmVyIHR5cGUgd2UganVzdCBnb3QuICAqLworICAgIH0KKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgTl9GTjoKKyAgICBjYXNlIE5fRk5fU0VROgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fTEJSQUM6CisgICAgICAvKiBJZ25vcmUgZXh0cmEgb3V0ZXJtb3N0IGNvbnRleHQgZnJvbSBTdW5QUk8gY2MgYW5kIGFjYy4gICovCisgICAgICBpZiAoaW5mby0+bl9vcHRfZm91bmQgJiYgZGVzYyA9PSAxKQorCWJyZWFrOworCisgICAgICBpZiAoISBpbmZvLT53aXRoaW5fZnVuY3Rpb24pCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJOX0xCUkFDIG5vdCB3aXRoaW4gZnVuY3Rpb25cbiIpKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIC8qIFN0YXJ0IGFuIGlubmVyIGxleGljYWwgYmxvY2suICAqLworICAgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGRoYW5kbGUsCisJCQkgICAgICAgKHZhbHVlCisJCQkJKyBpbmZvLT5maWxlX3N0YXJ0X29mZnNldAorCQkJCSsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBFbWl0IGFueSBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgKi8KKyAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pKQorCXJldHVybiBmYWxzZTsKKworICAgICAgKytpbmZvLT5ibG9ja19kZXB0aDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1JCUkFDOgorICAgICAgLyogSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20gU3VuUFJPIGNjIGFuZCBhY2MuICAqLworICAgICAgaWYgKGluZm8tPm5fb3B0X2ZvdW5kICYmIGRlc2MgPT0gMSkKKwlicmVhazsKKworICAgICAgLyogV2Ugc2hvdWxkbid0IGhhdmUgYW55IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMgaGVyZSwgYnV0LAorICAgICAgICAgaWYgd2UgZG8sIHdlIHByb2JhYmx5IG5lZWQgdG8gZW1pdCB0aGVtIGJlZm9yZSBjbG9zaW5nIHRoZQorICAgICAgICAgYmxvY2suICAqLworICAgICAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBFbmQgYW4gaW5uZXIgbGV4aWNhbCBibG9jay4gICovCisgICAgICBpZiAoISBkZWJ1Z19lbmRfYmxvY2sgKGRoYW5kbGUsCisJCQkgICAgICh2YWx1ZQorCQkJICAgICAgKyBpbmZvLT5maWxlX3N0YXJ0X29mZnNldAorCQkJICAgICAgKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC0taW5mby0+YmxvY2tfZGVwdGg7CisgICAgICBpZiAoaW5mby0+YmxvY2tfZGVwdGggPCAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiVG9vIG1hbnkgTl9SQlJBQ3NcbiIpKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9TTzoKKyAgICAgIC8qIFRoaXMgYWx3YXlzIGVuZHMgYSBmdW5jdGlvbi4gICovCisgICAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQorCXsKKwkgIGJmZF92bWEgZW5kdmFsOworCisJICBlbmR2YWwgPSB2YWx1ZTsKKwkgIGlmICgqc3RyaW5nICE9ICdcMCcKKwkgICAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgIT0gKGJmZF92bWEpIC0xCisJICAgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kIDwgZW5kdmFsKQorCSAgICBlbmR2YWwgPSBpbmZvLT5mdW5jdGlvbl9lbmQ7CisJICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQorCSAgICAgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCBlbmR2YWwpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKKwkgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKKwl9CisKKyAgICAgIC8qIEFuIGVtcHR5IHN0cmluZyBpcyBlbWl0dGVkIGJ5IGdjYyBhdCB0aGUgZW5kIG9mIGEgY29tcGlsYXRpb24KKyAgICAgICAgIHVuaXQuICAqLworICAgICAgaWYgKCpzdHJpbmcgPT0gJ1wwJykKKwlyZXR1cm4gdHJ1ZTsKKworICAgICAgLyogSnVzdCBhY2N1bXVsYXRlIHN0cmluZ3MgdW50aWwgd2Ugc2VlIGEgbm9uIE5fU08gc3ltYm9sLiAgSWYKKyAgICAgICAgIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIG9yIHNvbWUgb3RoZXIKKwkgZm9ybSBvZiBhYnNvbHV0ZSBwYXRoIHNwZWNpZmljYXRpb24sIHdlIGRpc2NhcmQgdGhlIHByZXZpb3VzbHkKKyAgICAgICAgIGFjY3VtdWxhdGVkIHN0cmluZ3MuICAqLworICAgICAgaWYgKGluZm8tPnNvX3N0cmluZyA9PSBOVUxMKQorCWluZm8tPnNvX3N0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqZjsKKworCSAgZiA9IGluZm8tPnNvX3N0cmluZzsKKworCSAgaWYgKCAgIChzdHJpbmdbMF0gPT0gJy8nKQorCSAgICAgIHx8IChzdHJpbmdbMF0gPT0gRElSX1NFUEFSQVRPUikKKwkgICAgICB8fCAoICAgKERJUl9TRVBBUkFUT1IgPT0gJ1xcJykKKwkJICAmJiAoc3RyaW5nWzFdID09ICc6JykKKwkJICAmJiAoICAgKHN0cmluZ1syXSA9PSBESVJfU0VQQVJBVE9SKQorCQkgICAgICB8fCAoc3RyaW5nWzJdID09ICcvJykpKSkKKwkgICAgaW5mby0+c29fc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKKwkgIGVsc2UKKwkgICAgaW5mby0+c29fc3RyaW5nID0gY29uY2F0IChpbmZvLT5zb19zdHJpbmcsIHN0cmluZywKKwkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKKwkgIGZyZWUgKGYpOworCX0KKworICAgICAgaW5mby0+c29fdmFsdWUgPSB2YWx1ZTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fU09MOgorICAgICAgLyogU3RhcnQgYW4gaW5jbHVkZSBmaWxlLiAgKi8KKyAgICAgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoZGhhbmRsZSwgc3RyaW5nKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9CSU5DTDoKKyAgICAgIC8qIFN0YXJ0IGFuIGluY2x1ZGUgZmlsZSB3aGljaCBtYXkgYmUgcmVwbGFjZWQuICAqLworICAgICAgcHVzaF9iaW5jbCAoaW5mbywgc3RyaW5nLCB2YWx1ZSk7CisgICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHN0cmluZykpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fRUlOQ0w6CisgICAgICAvKiBFbmQgYW4gTl9CSU5DTCBpbmNsdWRlLiAgKi8KKyAgICAgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoZGhhbmRsZSwgcG9wX2JpbmNsIChpbmZvKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fRVhDTDoKKyAgICAgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgYSBoZWFkZXIgZmlsZSBuYW1lZCBieSBOX0JJTkNMIHdoaWNoCisgICAgICAgICB3YXMgZWxpbWluYXRlZCBieSB0aGUgbGlua2VyLiAgKi8KKyAgICAgIGlmICghIGZpbmRfZXhjbCAoaW5mbywgc3RyaW5nLCB2YWx1ZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fU0xJTkU6CisgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfbGluZSAoZGhhbmRsZSwgZGVzYywKKwkJCSAgICAgICB2YWx1ZSArIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fQkNPTU06CisgICAgICBpZiAoISBkZWJ1Z19zdGFydF9jb21tb25fYmxvY2sgKGRoYW5kbGUsIHN0cmluZykpCisJcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fRUNPTU06CisgICAgICBpZiAoISBkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrIChkaGFuZGxlLCBzdHJpbmcpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX0ZVTjoKKyAgICAgIGlmICgqc3RyaW5nID09ICdcMCcpCisJeworCSAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKKwkgICAgeworCSAgICAgIC8qIFRoaXMgYWx3YXlzIG1hcmtzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbjsgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAgbmVlZCB0byB3b3JyeSBhYm91dCBpbmZvLT5mdW5jdGlvbl9lbmQuICAqLworCSAgICAgIGlmIChpbmZvLT5zZWN0aW9ucykKKwkJdmFsdWUgKz0gaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OworCSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCisJCSAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIHZhbHVlKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOworCSAgICAgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBBIGNvbnN0IHN0YXRpYyBzeW1ib2wgaW4gdGhlIC50ZXh0IHNlY3Rpb24gd2lsbCBoYXZlIGFuIE5fRlVOCisgICAgICAgICBlbnRyeS4gIFdlIG5lZWQgdG8gdXNlIHRoZXNlIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sCisgICAgICAgICBpbiBjYXNlIHdlIGFyZSBsb29raW5nIGF0IGdjYyBvdXRwdXQgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkIHRvCisgICAgICAgICBhbHdheXMgZW1pdCBhbiBlbXB0eSBOX0ZVTi4gIFdlIGNhbid0IGNhbGwgZGVidWdfZW5kX2Z1bmN0aW9uCisgICAgICAgICBoZXJlLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEgbG9jYWwgc3RhdGljIHN5bWJvbC4gICovCisgICAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uCisJICAmJiAoaW5mby0+ZnVuY3Rpb25fZW5kID09IChiZmRfdm1hKSAtMQorCSAgICAgIHx8IHZhbHVlIDwgaW5mby0+ZnVuY3Rpb25fZW5kKSkKKwlpbmZvLT5mdW5jdGlvbl9lbmQgPSB2YWx1ZTsKKworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIHRoZSBzdHJpbmcgZm9yIE5fU1RTWU0sIE5fTENTWU0gb3IgTl9ST1NZTQorICAgICAgICAgc3ltYm9scywgYW5kIGlmIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggOlMsIGdkYiByZWxvY2F0ZXMgdGhlCisgICAgICAgICB2YWx1ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBnY2MgYWx3YXlzIHNlZW1zIHRvIHVzZQorICAgICAgICAgOlMsIHNvIHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoaXMuICAqLworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBkZWZhdWx0OgorICAgICAgeworCWNvbnN0IGNoYXIgKmNvbG9uOworCisJY29sb24gPSBzdHJjaHIgKHN0cmluZywgJzonKTsKKwlpZiAoY29sb24gIT0gTlVMTAorCSAgICAmJiAoY29sb25bMV0gPT0gJ2YnIHx8IGNvbG9uWzFdID09ICdGJykpCisJICB7CisJICAgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCisJICAgICAgeworCQliZmRfdm1hIGVuZHZhbDsKKworCQllbmR2YWwgPSB2YWx1ZTsKKwkJaWYgKGluZm8tPmZ1bmN0aW9uX2VuZCAhPSAoYmZkX3ZtYSkgLTEKKwkJICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCA8IGVuZHZhbCkKKwkJICBlbmR2YWwgPSBpbmZvLT5mdW5jdGlvbl9lbmQ7CisJCWlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCisJCSAgICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgZW5kdmFsKSkKKwkJICByZXR1cm4gZmFsc2U7CisJCWluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKKwkgICAgICB9CisJICAgIC8qIEZvciBzdGFicyBpbiBzZWN0aW9ucywgbGluZSBudW1iZXJzIGFuZCBibG9jayBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgIGFyZSBvZmZzZXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gICovCisJICAgIGlmIChpbmZvLT5zZWN0aW9ucykKKwkgICAgICBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQgPSB2YWx1ZTsKKwkgICAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gdHJ1ZTsKKwkgIH0KKworCWlmICghIHBhcnNlX3N0YWJfc3RyaW5nIChkaGFuZGxlLCBpbmZvLCB0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX09QVDoKKyAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCAmJiBzdHJjbXAgKHN0cmluZywgImdjYzJfY29tcGlsZWQuIikgPT0gMCkKKwlpbmZvLT5nY2NfY29tcGlsZWQgPSAyOworICAgICAgZWxzZSBpZiAoc3RyaW5nICE9IE5VTEwgJiYgc3RyY21wIChzdHJpbmcsICJnY2NfY29tcGlsZWQuIikgPT0gMCkKKwlpbmZvLT5nY2NfY29tcGlsZWQgPSAxOworICAgICAgZWxzZQorCWluZm8tPm5fb3B0X2ZvdW5kID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX09CSjoKKyAgICBjYXNlIE5fRU5ETToKKyAgICBjYXNlIE5fTUFJTjoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUGFyc2UgdGhlIHN0YWJzIHN0cmluZy4gICovCisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9zdGFiX3N0cmluZyAoZGhhbmRsZSwgaW5mbywgc3RhYnR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGludCBzdGFidHlwZTsKKyAgICAgaW50IGRlc2M7CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgY29uc3QgY2hhciAqcDsKKyAgY2hhciAqbmFtZTsKKyAgaW50IHR5cGU7CisgIGRlYnVnX3R5cGUgZHR5cGU7CisgIGJvb2xlYW4gc3lub255bTsKKyAgYm9vbGVhbiBzZWxmX2Nyb3NzcmVmOworICB1bnNpZ25lZCBpbnQgbGluZW5vOworICBkZWJ1Z190eXBlICpzbG90OworCisgIHAgPSBzdHJjaHIgKHN0cmluZywgJzonKTsKKyAgaWYgKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICB3aGlsZSAocFsxXSA9PSAnOicpCisgICAgeworICAgICAgcCArPSAyOworICAgICAgcCA9IHN0cmNociAocCwgJzonKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisJeworCSAgYmFkX3N0YWIgKHN0cmluZyk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBHQ0MgMi54IHB1dHMgdGhlIGxpbmUgbnVtYmVyIGluIGRlc2MuICBTdW5PUyBhcHBhcmVudGx5IHB1dHMgaW4KKyAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBhIHR5cGUgb3Igb2JqZWN0LCB3aGljaCB3ZQorICAgICBpZ25vcmUuICAqLworICBpZiAoaW5mby0+Z2NjX2NvbXBpbGVkID49IDIpCisgICAgbGluZW5vID0gZGVzYzsKKyAgZWxzZQorICAgIGxpbmVubyA9IDA7CisKKyAgLyogRklYTUU6IFNvbWV0aW1lcyB0aGUgc3BlY2lhbCBDKysgbmFtZXMgc3RhcnQgd2l0aCAnLicuICAqLworICBuYW1lID0gTlVMTDsKKyAgaWYgKHN0cmluZ1swXSA9PSAnJCcpCisgICAgeworICAgICAgc3dpdGNoIChzdHJpbmdbMV0pCisJeworCWNhc2UgJ3QnOgorCSAgbmFtZSA9ICJ0aGlzIjsKKwkgIGJyZWFrOworCWNhc2UgJ3YnOgorCSAgLyogV2FzOiBuYW1lID0gInZwdHIiOyAqLworCSAgYnJlYWs7CisJY2FzZSAnZSc6CisJICBuYW1lID0gImVoX3Rocm93IjsKKwkgIGJyZWFrOworCWNhc2UgJ18nOgorCSAgLyogVGhpcyB3YXMgYW4gYW5vbnltb3VzIHR5cGUgdGhhdCB3YXMgbmV2ZXIgZml4ZWQgdXAuICAqLworCSAgYnJlYWs7CisJY2FzZSAnWCc6CisJICAvKiBTdW5QUk8gKDMuMCBhdCBsZWFzdCkgc3RhdGljIHZhcmlhYmxlIGVuY29kaW5nLiAgKi8KKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB3YXJuX3N0YWIgKHN0cmluZywgXygidW5rbm93biBDKysgZW5jb2RlZCBuYW1lIikpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChwID09IHN0cmluZyB8fCAoc3RyaW5nWzBdID09ICcgJyAmJiBwID09IHN0cmluZyArIDEpKQorCW5hbWUgPSBOVUxMOworICAgICAgZWxzZQorCW5hbWUgPSBzYXZlc3RyaW5nIChzdHJpbmcsIHAgLSBzdHJpbmcpOworICAgIH0KKworICArK3A7CisgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICcoJyB8fCAqcCA9PSAnLScpCisgICAgdHlwZSA9ICdsJzsKKyAgZWxzZQorICAgIHR5cGUgPSAqcCsrOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnYyc6CisgICAgICAvKiBjIGlzIGEgc3BlY2lhbCBjYXNlLCBub3QgZm9sbG93ZWQgYnkgYSB0eXBlLW51bWJlci4KKwkgU1lNQk9MOmM9aVZBTFVFIGZvciBhbiBpbnRlZ2VyIGNvbnN0YW50IHN5bWJvbC4KKwkgU1lNQk9MOmM9clZBTFVFIGZvciBhIGZsb2F0aW5nIGNvbnN0YW50IHN5bWJvbC4KKwkgU1lNQk9MOmM9ZVRZUEUsSU5UVkFMVUUgZm9yIGFuIGVudW0gY29uc3RhbnQgc3ltYm9sLgorCSBlLmcuICJiOmM9ZTYsMCIgZm9yICJjb25zdCBiID0gYmxvYjEiCisJICh3aGVyZSB0eXBlIDYgaXMgZGVmaW5lZCBieSAiYmxvYnM6dDY9ZWJsb2IxOjAsYmxvYjI6MSw7IikuICAqLworICAgICAgaWYgKCpwICE9ICc9JykKKwl7CisJICBiYWRfc3RhYiAoc3RyaW5nKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICArK3A7CisgICAgICBzd2l0Y2ggKCpwKyspCisJeworCWNhc2UgJ3InOgorCSAgLyogRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLworCSAgaWYgKCEgZGVidWdfcmVjb3JkX2Zsb2F0X2NvbnN0IChkaGFuZGxlLCBuYW1lLCBhdG9mIChwKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgJ2knOgorCSAgLyogSW50ZWdlciBjb25zdGFudC4gICovCisJICAvKiBEZWZpbmluZyBpbnRlZ2VyIGNvbnN0YW50cyB0aGlzIHdheSBpcyBraW5kIG9mIHNpbGx5LAorCSAgICAgc2luY2UgJ2UnIGNvbnN0YW50cyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdpdmUgbm90IG9ubHkKKwkgICAgIHRoZSB2YWx1ZSwgYnV0IHRoZSB0eXBlIGFzIHdlbGwuICBDIGhhcyBhdCBsZWFzdCBpbnQsCisJICAgICBsb25nLCB1bnNpZ25lZCBpbnQsIGFuZCBsb25nIGxvbmcgYXMgY29uc3RhbnQgdHlwZXM7CisJICAgICBvdGhlciBsYW5ndWFnZXMgcHJvYmFibHkgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdW5zaWduZWQgYXMKKwkgICAgIHdlbGwgYXMgc2lnbmVkIGNvbnN0YW50cy4gICovCisJICBpZiAoISBkZWJ1Z19yZWNvcmRfaW50X2NvbnN0IChkaGFuZGxlLCBuYW1lLCBhdG9pIChwKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgJ2UnOgorCSAgLyogU1lNQk9MOmM9ZVRZUEUsSU5UVkFMVUUgZm9yIGEgY29uc3RhbnQgc3ltYm9sIHdob3NlIHZhbHVlCisJICAgICBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgaW50ZWdyYWwuCisJICAgICBlLmcuICJiOmM9ZTYsMCIgZm9yICJjb25zdCBiID0gYmxvYjEiCisJICAgICAod2hlcmUgdHlwZSA2IGlzIGRlZmluZWQgYnkgImJsb2JzOnQ2PWVibG9iMTowLGJsb2IyOjEsOyIpLiAgKi8KKwkgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJCSAgICZwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoKnAgIT0gJywnKQorCSAgICB7CisJICAgICAgYmFkX3N0YWIgKHN0cmluZyk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICBpZiAoISBkZWJ1Z19yZWNvcmRfdHlwZWRfY29uc3QgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBhdG9pIChwKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBiYWRfc3RhYiAoc3RyaW5nKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQyc6CisgICAgICAvKiBUaGUgbmFtZSBvZiBhIGNhdWdodCBleGNlcHRpb24uICAqLworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkgICAgICAgJnAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2xhYmVsIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgdmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgICAvKiBBIGZ1bmN0aW9uIGRlZmluaXRpb24uICAqLworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgdHlwZSA9PSAnRicsIHZhbHVlKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIFN1biBhY2MgcHV0cyBkZWNsYXJlZCB0eXBlcyBvZiBhcmd1bWVudHMgaGVyZS4gIFdlIGRvbid0IGNhcmUKKwkgYWJvdXQgdGhlaXIgYWN0dWFsIHR5cGVzIChGSVhNRSAtLSB3ZSBzaG91bGQgcmVtZW1iZXIgdGhlIHdob2xlCisJIGZ1bmN0aW9uIHByb3RvdHlwZSksIGJ1dCB0aGUgbGlzdCBtYXkgZGVmaW5lIHNvbWUgbmV3IHR5cGVzCisJIHRoYXQgd2UgaGF2ZSB0byByZW1lbWJlciwgc28gd2UgbXVzdCBzY2FuIGl0IG5vdy4gICovCisgICAgICB3aGlsZSAoKnAgPT0gJzsnKQorCXsKKwkgICsrcDsKKwkgIGlmIChwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKQorCSAgICAgID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdHJzoKKyAgICAgIHsKKwljaGFyIGxlYWRpbmc7CisJbG9uZyBjOworCWFzeW1ib2wgKipwczsKKworCS8qIEEgZ2xvYmFsIHN5bWJvbC4gIFRoZSB2YWx1ZSBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZQorCSAgIHN5bWJvbCB0YWJsZS4gICovCisJZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgIHJldHVybiBmYWxzZTsKKwlsZWFkaW5nID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChpbmZvLT5hYmZkKTsKKwlmb3IgKGMgPSBpbmZvLT5zeW1jb3VudCwgcHMgPSBpbmZvLT5zeW1zOyBjID4gMDsgLS1jLCArK3BzKQorCSAgeworCSAgICBjb25zdCBjaGFyICpuOworCisJICAgIG4gPSBiZmRfYXN5bWJvbF9uYW1lICgqcHMpOworCSAgICBpZiAobGVhZGluZyAhPSAnXDAnICYmICpuID09IGxlYWRpbmcpCisJICAgICAgKytuOworCSAgICBpZiAoKm4gPT0gKm5hbWUgJiYgc3RyY21wIChuLCBuYW1lKSA9PSAwKQorCSAgICAgIGJyZWFrOworCSAgfQorCWlmIChjID4gMCkKKwkgIHZhbHVlID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpwcyk7CisJaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19HTE9CQUwsCisJCQkJICAgIHZhbHVlKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBUaGlzIGNhc2UgaXMgZmFrZWQgYnkgYSBjb25kaXRpb25hbCBhYm92ZSwgd2hlbiB0aGVyZSBpcyBubworCSBjb2RlIGxldHRlciBpbiB0aGUgZGJ4IGRhdGEuICBEYnggZGF0YSBuZXZlciBhY3R1YWxseQorCSBjb250YWlucyAnbCcuICAqLworICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgJ3MnOgorICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19MT0NBTCwKKwkJCQkgIHZhbHVlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgICAgLyogQSBmdW5jdGlvbiBwYXJhbWV0ZXIuICAqLworICAgICAgaWYgKCpwICE9ICdGJykKKwlkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCisJCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGVsc2UKKwl7CisJLyogcEYgaXMgYSB0d28tbGV0dGVyIGNvZGUgdGhhdCBtZWFucyBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpbgorCSAgIEZvcnRyYW4uICBUaGUgdHlwZS1udW1iZXIgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4KKwkgICB2YWx1ZS4gIFRyYW5zbGF0ZSBpdCBpbnRvIGEgcG9pbnRlci10by1mdW5jdGlvbiB0eXBlLiAgKi8KKwkgICsrcDsKKwkgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKKwkJCQkgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJICBpZiAoZHR5cGUgIT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICB7CisJICAgICAgZGVidWdfdHlwZSBmdHlwZTsKKworCSAgICAgIGZ0eXBlID0gZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlIChkaGFuZGxlLCBkdHlwZSwKKwkJCQkJCShkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKTsKKwkgICAgICBkdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCBmdHlwZSk7CisJICAgIH0KKwl9CisgICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1NUQUNLLAorCQkJCSAgICB2YWx1ZSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBGSVhNRTogQXQgdGhpcyBwb2ludCBnZGIgY29uc2lkZXJzIHJlYXJyYW5naW5nIHRoZSBwYXJhbWV0ZXIKKwkgYWRkcmVzcyBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gYW4gaW50LgorCSBXZSBoYXZlIG5vIHdheSB0byBkbyB0aGF0LCBzaW5jZSB3ZSBkb24ndCByZWFsbHkga25vdyBtdWNoCisJIGFib3V0IHRoZSB0YXJnZXQuICAqLworCisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1AnOgorICAgICAgaWYgKHN0YWJ0eXBlID09IE5fRlVOKQorCXsKKwkgIC8qIFByb3RvdHlwZSBvZiBhIGZ1bmN0aW9uIHJlZmVyZW5jZWQgYnkgdGhpcyBmaWxlLiAgKi8KKwkgIHdoaWxlICgqcCA9PSAnOycpCisJICAgIHsKKwkgICAgICArK3A7CisJICAgICAgaWYgKHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCisJCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpCisJCSAgPT0gREVCVUdfVFlQRV9OVUxMKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSAnUic6CisgICAgICAvKiBQYXJhbWV0ZXIgd2hpY2ggaXMgaW4gYSByZWdpc3Rlci4gICovCisgICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCisJCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUcsCisJCQkJICAgIHZhbHVlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3InOgorICAgICAgLyogUmVnaXN0ZXIgdmFyaWFibGUgKGVpdGhlciBnbG9iYWwgb3IgbG9jYWwpLiAgKi8KKyAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKKwkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisgICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfUkVHSVNURVIsCisJCQkJICB2YWx1ZSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICAvKiBGSVhNRTogQXQgdGhpcyBwb2ludCBnZGIgY2hlY2tzIHRvIGNvbWJpbmUgcGFpcnMgb2YgJ3AnIGFuZAorCSAncicgc3RhYnMgaW50byBhIHNpbmdsZSAnUCcgc3RhYi4gICovCisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUyc6CisgICAgICAvKiBTdGF0aWMgc3ltYm9sIGF0IHRvcCBsZXZlbCBvZiBmaWxlICovCisgICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCisJCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX1NUQVRJQywKKwkJCQkgIHZhbHVlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3QnOgorICAgICAgLyogQSB0eXBlZGVmLiAgKi8KKyAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCAmcCwgJnNsb3QpOworICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCXsKKwkgIC8qIEEgbmFtZWxlc3MgdHlwZS4gIE5vdGhpbmcgdG8gZG8uICAqLworCSAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBkdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOworICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChzbG90ICE9IE5VTEwpCisJKnNsb3QgPSBkdHlwZTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdUJzoKKyAgICAgIC8qIFN0cnVjdCwgdW5pb24sIG9yIGVudW0gdGFnLiAgRm9yIEdOVSBDKyssIHRoaXMgY2FuIGJlIGJlIGZvbGxvd2VkCisJIGJ5ICd0JyB3aGljaCBtZWFucyB3ZSBhcmUgdHlwZWRlZidpbmcgaXQgYXMgd2VsbC4gICovCisgICAgICBpZiAoKnAgIT0gJ3QnKQorCXsKKwkgIHN5bm9ueW0gPSBmYWxzZTsKKwkgIC8qIEZJWE1FOiBnZGIgc2V0cyBzeW5vbnltIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UKKyAgICAgICAgICAgICBpcyBDKysuICAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzeW5vbnltID0gdHJ1ZTsKKwkgICsrcDsKKwl9CisKKyAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCAmcCwgJnNsb3QpOworICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCXJldHVybiB0cnVlOworCisgICAgICAvKiBJTkZPLT5TRUxGX0NST1NTUkVGIGlzIHNldCBieSBwYXJzZV9zdGFiX3R5cGUgaWYgdGhpcyB0eXBlIGlzCisgICAgICAgICBhIGNyb3NzIHJlZmVyZW5jZSB0byBpdHNlbGYuICBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IHNvbWUKKyAgICAgICAgIHZlcnNpb25zIG9mIGcrKy4gICovCisgICAgICBzZWxmX2Nyb3NzcmVmID0gaW5mby0+c2VsZl9jcm9zc3JlZjsKKworICAgICAgZHR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOworICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoc2xvdCAhPSBOVUxMKQorCSpzbG90ID0gZHR5cGU7CisKKyAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIHRoaXMgdGFnIHdoaWNoIHdlIGNhbiBub3cKKyAgICAgICAgIGZpbGwgaW4uICBBdm9pZCBmaWxsaW5nIGluIGEgY3Jvc3MgcmVmZXJlbmNlIHRvIG91cnNlbHZlcywKKyAgICAgICAgIGJlY2F1c2UgdGhhdCB3b3VsZCBsZWFkIHRvIGNpcmN1bGFyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgICAgICBpZiAoISBzZWxmX2Nyb3NzcmVmKQorCXsKKwkgIHJlZ2lzdGVyIHN0cnVjdCBzdGFiX3RhZyAqKnBzdDsKKworCSAgZm9yIChwc3QgPSAmaW5mby0+dGFnczsgKnBzdCAhPSBOVUxMOyBwc3QgPSAmKCpwc3QpLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKCgqcHN0KS0+bmFtZVswXSA9PSBuYW1lWzBdCisJCSAgJiYgc3RyY21wICgoKnBzdCktPm5hbWUsIG5hbWUpID09IDApCisJCXsKKwkJICAoKnBzdCktPnNsb3QgPSBkdHlwZTsKKwkJICAqcHN0ID0gKCpwc3QpLT5uZXh0OworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzeW5vbnltKQorCXsKKwkgIGR0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCBkdHlwZSk7CisJICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmIChzbG90ICE9IE5VTEwpCisJICAgICpzbG90ID0gZHR5cGU7CisJfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1YnOgorICAgICAgLyogU3RhdGljIHN5bWJvbCBvZiBsb2NhbCBzY29wZSAqLworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KKyAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwKKwkJCQkgIERFQlVHX0xPQ0FMX1NUQVRJQywgdmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndic6CisgICAgICAvKiBSZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KKyAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKKwkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisgICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRkVSRU5DRSwKKwkJCQkgICAgdmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYSc6CisgICAgICAvKiBSZWZlcmVuY2UgcGFyYW1ldGVyIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuICAqLworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVGX1JFRywKKwkJCQkgICAgdmFsdWUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWCc6CisgICAgICAvKiBUaGlzIGlzIHVzZWQgYnkgU3VuIEZPUlRSQU4gZm9yICJmdW5jdGlvbiByZXN1bHQgdmFsdWUiLgorCSBTdW4gY2xhaW1zICgiZGJ4IGFuZCBkYnh0b29sIGludGVyZmFjZXMiLCAybmQgZWQpCisJIHRoYXQgUGFzY2FsIHVzZXMgaXQgdG9vLCBidXQgd2hlbiBJIHRyaWVkIGl0IFBhc2NhbCB1c2VkCisJICJ4OjMiIChsb2NhbCBzeW1ib2wpIGluc3RlYWQuICAqLworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAorCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19MT0NBTCwKKwkJCQkgIHZhbHVlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBiYWRfc3RhYiAoc3RyaW5nKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLyogRklYTUU6IGdkYiBjb252ZXJ0cyBzdHJ1Y3R1cmUgdmFsdWVzIHRvIHN0cnVjdHVyZSBwb2ludGVycyBpbiBhCisgICAgIGNvdXBsZSBvZiBjYXNlcywgZGVwZW5kaW5nIHVwb24gdGhlIHRhcmdldC4gICovCisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFBhcnNlIGEgc3RhYnMgdHlwZS4gIFRoZSB0eXBlbmFtZSBhcmd1bWVudCBpcyBub24tTlVMTCBpZiB0aGlzIGlzIGEKKyAgIHR5cGVkZWYgb3IgYSB0YWcgZGVmaW5pdGlvbi4gIFRoZSBwcCBhcmd1bWVudCBwb2ludHMgdG8gdGhlIHN0YWIKKyAgIHN0cmluZywgYW5kIGlzIHVwZGF0ZWQuICBUaGUgc2xvdHAgYXJndW1lbnQgcG9pbnRzIHRvIGEgcGxhY2UgdG8KKyAgIHN0b3JlIHRoZSBzbG90IHVzZWQgaWYgdGhlIHR5cGUgaXMgYmVpbmcgZGVmaW5lZC4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgc2xvdHApCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGRlYnVnX3R5cGUgKipzbG90cDsKK3sKKyAgY29uc3QgY2hhciAqb3JpZzsKKyAgaW50IHR5cGVudW1zWzJdOworICBpbnQgc2l6ZTsKKyAgYm9vbGVhbiBzdHJpbmdwOworICBpbnQgZGVzY3JpcHRvcjsKKyAgZGVidWdfdHlwZSBkdHlwZTsKKworICBpZiAoc2xvdHAgIT0gTlVMTCkKKyAgICAqc2xvdHAgPSBOVUxMOworCisgIG9yaWcgPSAqcHA7CisKKyAgc2l6ZSA9IC0xOworICBzdHJpbmdwID0gZmFsc2U7CisKKyAgaW5mby0+c2VsZl9jcm9zc3JlZiA9IGZhbHNlOworCisgIC8qIFJlYWQgdHlwZSBudW1iZXIgaWYgcHJlc2VudC4gIFRoZSB0eXBlIG51bWJlciBtYXkgYmUgb21pdHRlZC4KKyAgICAgZm9yIGluc3RhbmNlIGluIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGRlY2xhcmVkIHdpdGggdHlwZQorICAgICAiYXIxOzE7MTA7YXIxOzE7MTA7NCIuICAqLworICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkgJiYgKipwcCAhPSAnKCcgJiYgKipwcCAhPSAnLScpCisgICAgeworICAgICAgLyogJ3R5cGVudW1zPScgbm90IHByZXNlbnQsIHR5cGUgaXMgYW5vbnltb3VzLiAgUmVhZCBhbmQgcmV0dXJuCisJIHRoZSBkZWZpbml0aW9uLCBidXQgZG9uJ3QgcHV0IGl0IGluIHRoZSB0eXBlIHZlY3Rvci4gICovCisgICAgICB0eXBlbnVtc1swXSA9IHR5cGVudW1zWzFdID0gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHR5cGVudW1zKSkKKwlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgICAgICBpZiAoKipwcCAhPSAnPScpCisJeworCSAgLyogVHlwZSBpcyBub3QgYmVpbmcgZGVmaW5lZCBoZXJlLiAgRWl0aGVyIGl0IGFscmVhZHkKKwkgICAgIGV4aXN0cywgb3IgdGhpcyBpcyBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGl0LiAgKi8KKwkgIHJldHVybiBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMpOworCX0KKworICAgICAgLyogT25seSBzZXQgdGhlIHNsb3QgaWYgdGhlIHR5cGUgaXMgYmVpbmcgZGVmaW5lZC4gIFRoaXMgbWVhbnMKKyAgICAgICAgIHRoYXQgdGhlIG1hcHBpbmcgZnJvbSB0eXBlIG51bWJlcnMgdG8gdHlwZXMgd2lsbCBvbmx5IHJlY29yZAorICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgd2hpY2ggZGVmaW5lcyBhIHR5cGUuICBJZiB3ZSBkb24ndCBkbworICAgICAgICAgdGhpcywgdGhlbiBzb21ldGhpbmcgbGlrZQorCSAgICAgdHlwZWRlZiBpbnQgZm9vOworCSAgICAgaW50IGk7CisJIHdpbGwgcmVjb3JkIHRoYXQgaSBpcyBvZiB0eXBlIGZvby4gIFVuZm9ydHVuYXRlbHksIHN0YWJzCisJIGluZm9ybWF0aW9uIGlzIGFtYmlndW91cyBhYm91dCB2YXJpYWJsZSB0eXBlcy4gIEZvciB0aGlzIGNvZGUsCisJICAgICB0eXBlZGVmIGludCBmb287CisJICAgICBpbnQgaTsKKwkgICAgIGZvbyBqOworCSB0aGUgc3RhYnMgaW5mb3JtYXRpb24gcmVjb3JkcyBib3RoIGkgYW5kIGogYXMgaGF2aW5nIHRoZSBzYW1lCisJIHR5cGUuICBUaGlzIGNvdWxkIGJlIGZpeGVkIGJ5IHBhdGNoaW5nIHRoZSBjb21waWxlci4gICovCisgICAgICBpZiAoc2xvdHAgIT0gTlVMTCAmJiB0eXBlbnVtc1swXSA+PSAwICYmIHR5cGVudW1zWzFdID49IDApCisJKnNsb3RwID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKKworICAgICAgLyogVHlwZSBpcyBiZWluZyBkZWZpbmVkIGhlcmUuICAqLworICAgICAgLyogU2tpcCB0aGUgJz0nLiAgKi8KKyAgICAgICsrKnBwOworCisgICAgICB3aGlsZSAoKipwcCA9PSAnQCcpCisJeworCSAgY29uc3QgY2hhciAqcCA9ICpwcCArIDE7CisJICBjb25zdCBjaGFyICphdHRyOworCisJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnKCcgfHwgKnAgPT0gJy0nKQorCSAgICB7CisJICAgICAgLyogTWVtYmVyIHR5cGUuICAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIFR5cGUgYXR0cmlidXRlcy4gICovCisJICBhdHRyID0gcDsKKworCSAgZm9yICg7ICpwICE9ICc7JzsgKytwKQorCSAgICB7CisJICAgICAgaWYgKCpwID09ICdcMCcpCisJCXsKKwkJICBiYWRfc3RhYiAob3JpZyk7CisJCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwkJfQorCSAgICB9CisJICAqcHAgPSBwICsgMTsKKworCSAgc3dpdGNoICgqYXR0cikKKwkgICAgeworCSAgICBjYXNlICdzJzoKKwkgICAgICBzaXplID0gYXRvaSAoYXR0ciArIDEpOworCSAgICAgIGlmIChzaXplIDw9IDApCisJCXNpemUgPSAtMTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdTJzoKKwkgICAgICBzdHJpbmdwID0gdHJ1ZTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIElnbm9yZSB1bnJlY29nbml6ZWQgdHlwZSBhdHRyaWJ1dGVzLCBzbyBmdXR1cmUKKwkJIGNvbXBpbGVycyBjYW4gaW52ZW50IG5ldyBvbmVzLiAgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgZGVzY3JpcHRvciA9ICoqcHA7CisgICsrKnBwOworCisgIHN3aXRjaCAoZGVzY3JpcHRvcikKKyAgICB7CisgICAgY2FzZSAneCc6CisgICAgICB7CisJZW51bSBkZWJ1Z190eXBlX2tpbmQgY29kZTsKKwljb25zdCBjaGFyICpxMSwgKnEyLCAqcDsKKworCS8qIEEgY3Jvc3MgcmVmZXJlbmNlIHRvIGFub3RoZXIgdHlwZS4gICovCisKKwlzd2l0Y2ggKCoqcHApCisJICB7CisJICBjYXNlICdzJzoKKwkgICAgY29kZSA9IERFQlVHX0tJTkRfU1RSVUNUOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3UnOgorCSAgICBjb2RlID0gREVCVUdfS0lORF9VTklPTjsKKwkgICAgYnJlYWs7CisJICBjYXNlICdlJzoKKwkgICAgY29kZSA9IERFQlVHX0tJTkRfRU5VTTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICAvKiBDb21wbGFpbiBhbmQga2VlcCBnb2luZywgc28gY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3CisJICAgICAgIGNyb3NzLXJlZmVyZW5jZSB0eXBlcy4gICovCisJICAgIHdhcm5fc3RhYiAob3JpZywgXygidW5yZWNvZ25pemVkIGNyb3NzIHJlZmVyZW5jZSB0eXBlIikpOworCSAgICBjb2RlID0gREVCVUdfS0lORF9TVFJVQ1Q7CisJICAgIGJyZWFrOworCSAgfQorCSsrKnBwOworCisJcTEgPSBzdHJjaHIgKCpwcCwgJzwnKTsKKwlwID0gc3RyY2hyICgqcHAsICc6Jyk7CisJaWYgKHAgPT0gTlVMTCkKKwkgIHsKKwkgICAgYmFkX3N0YWIgKG9yaWcpOworCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCSAgfQorCXdoaWxlIChxMSAhPSBOVUxMICYmIHAgPiBxMSAmJiBwWzFdID09ICc6JykKKwkgIHsKKwkgICAgcTIgPSBzdHJjaHIgKHExLCAnPicpOworCSAgICBpZiAocTIgPT0gTlVMTCB8fCBxMiA8IHApCisJICAgICAgYnJlYWs7CisJICAgIHAgKz0gMjsKKwkgICAgcCA9IHN0cmNociAocCwgJzonKTsKKwkgICAgaWYgKHAgPT0gTlVMTCkKKwkgICAgICB7CisJCWJhZF9zdGFiIChvcmlnKTsKKwkJcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwkgICAgICB9CisJICB9CisKKwkvKiBTb21lIHZlcnNpb25zIG9mIGcrKyBjYW4gZW1pdCBzdGFicyBsaWtlCisJICAgICAgIGZsZWVwOlQyMD14c2ZsZWVwOgorCSAgIHdoaWNoIGRlZmluZSBzdHJ1Y3R1cmVzIGluIHRlcm1zIG9mIHRoZW1zZWx2ZXMuICBXZSBuZWVkIHRvCisJICAgdGVsbCB0aGUgY2FsbGVyIHRvIGF2b2lkIGJ1aWxkaW5nIGEgY2lyY3VsYXIgc3RydWN0dXJlLiAgKi8KKwlpZiAodHlwZW5hbWUgIT0gTlVMTAorCSAgICAmJiBzdHJuY21wICh0eXBlbmFtZSwgKnBwLCBwIC0gKnBwKSA9PSAwCisJICAgICYmIHR5cGVuYW1lW3AgLSAqcHBdID09ICdcMCcpCisJICBpbmZvLT5zZWxmX2Nyb3NzcmVmID0gdHJ1ZTsKKworCWR0eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBpbmZvLCAqcHAsIHAgLSAqcHAsIGNvZGUpOworCisJKnBwID0gcCArIDE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy0nOgorICAgIGNhc2UgJzAnOgorICAgIGNhc2UgJzEnOgorICAgIGNhc2UgJzInOgorICAgIGNhc2UgJzMnOgorICAgIGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOgorICAgIGNhc2UgJzYnOgorICAgIGNhc2UgJzcnOgorICAgIGNhc2UgJzgnOgorICAgIGNhc2UgJzknOgorICAgIGNhc2UgJygnOgorICAgICAgeworCWNvbnN0IGNoYXIgKmhvbGQ7CisJaW50IHh0eXBlbnVtc1syXTsKKworCS8qIFRoaXMgdHlwZSBpcyBkZWZpbmVkIGFzIGFub3RoZXIgdHlwZS4gICovCisKKwkoKnBwKS0tOworCWhvbGQgPSAqcHA7CisKKwkvKiBQZWVrIGFoZWFkIGF0IHRoZSBudW1iZXIgdG8gZGV0ZWN0IHZvaWQuICAqLworCWlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB4dHlwZW51bXMpKQorCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworCWlmICh0eXBlbnVtc1swXSA9PSB4dHlwZW51bXNbMF0gJiYgdHlwZW51bXNbMV0gPT0geHR5cGVudW1zWzFdKQorCSAgeworCSAgICAvKiBUaGlzIHR5cGUgaXMgYmVpbmcgZGVmaW5lZCBhcyBpdHNlbGYsIHdoaWNoIG1lYW5zIHRoYXQKKyAgICAgICAgICAgICAgIGl0IGlzIHZvaWQuICAqLworCSAgICBkdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgICpwcCA9IGhvbGQ7CisKKwkgICAgLyogR28gYmFjayB0byB0aGUgbnVtYmVyIGFuZCBoYXZlIHBhcnNlX3N0YWJfdHlwZSBnZXQgaXQuCisJICAgICAgIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4gZGVhbCB3aXRoIHNvbWV0aGluZyBsaWtlCisJICAgICAgIHQoMSwyKT0oMyw0KT0uLi4gd2hpY2ggdGhlIEx1Y2lkIGNvbXBpbGVyIHVzZXMuICAqLworCSAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkgICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwkgIH0KKworCWlmICh0eXBlbnVtc1swXSAhPSAtMSkKKwkgIHsKKwkgICAgaWYgKCEgc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIGR0eXBlKSkKKwkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCSAgfQorCisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlICcqJzoKKyAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKGRoYW5kbGUsCisJCQkJICAgICAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKKwkJCQkJCQkoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJCQkJCXBwLAorCQkJCQkJCShkZWJ1Z190eXBlICoqKSBOVUxMKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyYnOgorICAgICAgLyogUmVmZXJlbmNlIHRvIGFub3RoZXIgdHlwZS4gICovCisgICAgICBkdHlwZSA9IChkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlCisJICAgICAgIChkaGFuZGxlLAorCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAorCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCkpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZic6CisgICAgICAvKiBGdW5jdGlvbiByZXR1cm5pbmcgYW5vdGhlciB0eXBlLiAgKi8KKyAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCisgICAgICBkdHlwZSA9IChkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUKKwkgICAgICAgKGRoYW5kbGUsCisJCXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKSwKKwkJKGRlYnVnX3R5cGUgKikgTlVMTCwgZmFsc2UpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnayc6CisgICAgICAvKiBDb25zdCBxdWFsaWZpZXIgb24gc29tZSB0eXBlIChTdW4pLiAgKi8KKyAgICAgIC8qIEZJWE1FOiBnZGIgYWNjZXB0cyAnYycgaGVyZSBpZiBvczlrX3N0YWJzLiAgKi8KKyAgICAgIGR0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChkaGFuZGxlLAorCQkJCSAgICAgcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAorCQkJCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkJCSAgICAgIHBwLAorCQkJCQkJICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQic6CisgICAgICAvKiBWb2xhdGlsZSBxdWFsIG9uIHNvbWUgdHlwZSAoU3VuKS4gICovCisgICAgICAvKiBGSVhNRTogZ2RiIGFjY2VwdHMgJ2knIGhlcmUgaWYgb3M5a19zdGFicy4gICovCisgICAgICBkdHlwZSA9IChkZWJ1Z19tYWtlX3ZvbGF0aWxlX3R5cGUKKwkgICAgICAgKGRoYW5kbGUsCisJCXBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkJIChkZWJ1Z190eXBlICoqKSBOVUxMKSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdAJzoKKyAgICAgIC8qIE9mZnNldCAoY2xhc3MgJiB2YXJpYWJsZSkgdHlwZS4gIFRoaXMgaXMgdXNlZCBmb3IgYSBwb2ludGVyCisgICAgICAgICByZWxhdGl2ZSB0byBhbiBvYmplY3QuICAqLworICAgICAgeworCWRlYnVnX3R5cGUgZG9tYWluOworCWRlYnVnX3R5cGUgbWVtdHlwZTsKKworCS8qIE1lbWJlciB0eXBlLiAgKi8KKworCWRvbWFpbiA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJaWYgKGRvbWFpbiA9PSBERUJVR19UWVBFX05VTEwpCisJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisJaWYgKCoqcHAgIT0gJywnKQorCSAgeworCSAgICBiYWRfc3RhYiAob3JpZyk7CisJICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisJICB9CisJKysqcHA7CisKKwltZW10eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKKwkJCQkgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJaWYgKG1lbXR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworCWR0eXBlID0gZGVidWdfbWFrZV9vZmZzZXRfdHlwZSAoZGhhbmRsZSwgZG9tYWluLCBtZW10eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnIyc6CisgICAgICAvKiBNZXRob2QgKGNsYXNzICYgZm4pIHR5cGUuICAqLworICAgICAgaWYgKCoqcHAgPT0gJyMnKQorCXsKKwkgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7CisKKwkgICsrKnBwOworCSAgcmV0dXJuX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworCSAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwkgIGlmICgqKnBwICE9ICc7JykKKwkgICAgeworCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKKwkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCSAgICB9CisJICArKypwcDsKKwkgIGR0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsCisJCQkJCSAgREVCVUdfVFlQRV9OVUxMLAorCQkJCQkgIChkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZGVidWdfdHlwZSBkb21haW47CisJICBkZWJ1Z190eXBlIHJldHVybl90eXBlOworCSAgZGVidWdfdHlwZSAqYXJnczsKKwkgIHVuc2lnbmVkIGludCBuOworCSAgdW5zaWduZWQgaW50IGFsbG9jOworCSAgYm9vbGVhbiB2YXJhcmdzOworCisJICBkb21haW4gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJICBpZiAoZG9tYWluID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworCSAgaWYgKCoqcHAgIT0gJywnKQorCSAgICB7CisJICAgICAgYmFkX3N0YWIgKG9yaWcpOworCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisJICAgIH0KKwkgICsrKnBwOworCisJICByZXR1cm5fdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQkJIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisJICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisJICBhbGxvYyA9IDEwOworCSAgYXJncyA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICphcmdzKTsKKwkgIG4gPSAwOworCSAgd2hpbGUgKCoqcHAgIT0gJzsnKQorCSAgICB7CisJICAgICAgaWYgKCoqcHAgIT0gJywnKQorCQl7CisJCSAgYmFkX3N0YWIgKG9yaWcpOworCQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisJCX0KKwkgICAgICArKypwcDsKKworCSAgICAgIGlmIChuICsgMSA+PSBhbGxvYykKKwkJeworCQkgIGFsbG9jICs9IDEwOworCQkgIGFyZ3MgPSAoKGRlYnVnX3R5cGUgKikKKwkJCSAgeHJlYWxsb2MgKChQVFIpIGFyZ3MsIGFsbG9jICogc2l6ZW9mICphcmdzKSk7CisJCX0KKworCSAgICAgIGFyZ3Nbbl0gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworCSAgICAgIGlmIChhcmdzW25dID09IERFQlVHX1RZUEVfTlVMTCkKKwkJcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwkgICAgICArK247CisJICAgIH0KKwkgICsrKnBwOworCisJICAvKiBJZiB0aGUgbGFzdCB0eXBlIGlzIG5vdCB2b2lkLCB0aGVuIHRoaXMgZnVuY3Rpb24gdGFrZXMgYQorCSAgICAgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIE90aGVyd2lzZSwgd2UgbXVzdCBzdHJpcAorCSAgICAgdGhlIHZvaWQgdHlwZS4gICovCisJICBpZiAobiA9PSAwCisJICAgICAgfHwgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnc1tuIC0gMV0pICE9IERFQlVHX0tJTkRfVk9JRCkKKwkgICAgdmFyYXJncyA9IHRydWU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAtLW47CisJICAgICAgdmFyYXJncyA9IGZhbHNlOworCSAgICB9CisKKwkgIGFyZ3Nbbl0gPSBERUJVR19UWVBFX05VTEw7CisKKwkgIGR0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGRvbWFpbiwgYXJncywKKwkJCQkJICB2YXJhcmdzKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3InOgorICAgICAgLyogUmFuZ2UgdHlwZS4gICovCisgICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLCB0eXBlbnVtcyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2InOgorICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KKyAgICAgIC8qIFN1biBBQ0MgYnVpbHRpbiBpbnQgdHlwZS4gICovCisgICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3VuX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgcHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdSJzoKKyAgICAgIC8qIFN1biBBQ0MgYnVpbHRpbiBmbG9hdCB0eXBlLiAgKi8KKyAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZSAoZGhhbmRsZSwgcHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdlJzoKKyAgICAgIC8qIEVudW1lcmF0aW9uIHR5cGUuICAqLworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX2VudW1fdHlwZSAoZGhhbmRsZSwgcHApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICd1JzoKKyAgICAgIC8qIFN0cnVjdCBvciB1bmlvbiB0eXBlLiAgKi8KKyAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW5hbWUsIHBwLAorCQkJCSAgICAgIGRlc2NyaXB0b3IgPT0gJ3MnLCB0eXBlbnVtcyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2EnOgorICAgICAgLyogQXJyYXkgdHlwZS4gICovCisgICAgICBpZiAoKipwcCAhPSAncicpCisJeworCSAgYmFkX3N0YWIgKG9yaWcpOworCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwl9CisgICAgICArKypwcDsKKworICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX2FycmF5X3R5cGUgKGRoYW5kbGUsIGluZm8sIHBwLCBzdHJpbmdwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUyc6CisgICAgICBkdHlwZSA9IGRlYnVnX21ha2Vfc2V0X3R5cGUgKGRoYW5kbGUsCisJCQkJICAgcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLAorCQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJCQkgICAgcHAsCisJCQkJCQkgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpLAorCQkJCSAgIHN0cmluZ3ApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYmFkX3N0YWIgKG9yaWcpOworICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICB9CisKKyAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKyAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCisgIGlmICh0eXBlbnVtc1swXSAhPSAtMSkKKyAgICB7CisgICAgICBpZiAoISBzdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgZHR5cGUpKQorCXJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorCisgIGlmIChzaXplICE9IC0xKQorICAgIHsKKyAgICAgIGlmICghIGRlYnVnX3JlY29yZF90eXBlX3NpemUgKGRoYW5kbGUsIGR0eXBlLCAodW5zaWduZWQgaW50KSBzaXplKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiBkdHlwZTsKK30KKworLyogUmVhZCBhIG51bWJlciBieSB3aGljaCBhIHR5cGUgaXMgcmVmZXJyZWQgdG8gaW4gZGJ4IGRhdGEsIG9yCisgICBwZXJoYXBzIHJlYWQgYSBwYWlyIChGSUxFTlVNLCBUWVBFTlVNKSBpbiBwYXJlbnRoZXNlcy4gIEp1c3QgYQorICAgc2luZ2xlIG51bWJlciBOIGlzIGVxdWl2YWxlbnQgdG8gKDAsTikuICBSZXR1cm4gdGhlIHR3byBudW1iZXJzIGJ5CisgICBzdG9yaW5nIHRoZW0gaW4gdGhlIHZlY3RvciBUWVBFTlVNUy4gICovCisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdHlwZW51bXMpCisgICAgIGNvbnN0IGNoYXIgKipwcDsKKyAgICAgaW50ICp0eXBlbnVtczsKK3sKKyAgY29uc3QgY2hhciAqb3JpZzsKKworICBvcmlnID0gKnBwOworCisgIGlmICgqKnBwICE9ICcoJykKKyAgICB7CisgICAgICB0eXBlbnVtc1swXSA9IDA7CisgICAgICB0eXBlbnVtc1sxXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICsrKnBwOworICAgICAgdHlwZW51bXNbMF0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgICAgIGlmICgqKnBwICE9ICcsJykKKwl7CisJICBiYWRfc3RhYiAob3JpZyk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgKysqcHA7CisgICAgICB0eXBlbnVtc1sxXSA9IChpbnQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOworICAgICAgaWYgKCoqcHAgIT0gJyknKQorCXsKKwkgIGJhZF9zdGFiIChvcmlnKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICArKypwcDsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFBhcnNlIGEgcmFuZ2UgdHlwZS4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitwYXJzZV9zdGFiX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgdHlwZW51bXMpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGNvbnN0IGludCAqdHlwZW51bXM7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGludCByYW5nZW51bXNbMl07CisgIGJvb2xlYW4gc2VsZl9zdWJyYW5nZTsKKyAgZGVidWdfdHlwZSBpbmRleF90eXBlOworICBjb25zdCBjaGFyICpzMiwgKnMzOworICBiZmRfc2lnbmVkX3ZtYSBuMiwgbjM7CisgIGJvb2xlYW4gb3YyLCBvdjM7CisKKyAgb3JpZyA9ICpwcDsKKworICBpbmRleF90eXBlID0gREVCVUdfVFlQRV9OVUxMOworCisgIC8qIEZpcnN0IGNvbWVzIGEgdHlwZSB3ZSBhcmUgYSBzdWJyYW5nZSBvZi4KKyAgICAgSW4gQyBpdCBpcyB1c3VhbGx5IDAsIDEgb3IgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC4gICovCisgIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCByYW5nZW51bXMpKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgc2VsZl9zdWJyYW5nZSA9IChyYW5nZW51bXNbMF0gPT0gdHlwZW51bXNbMF0KKwkJICAgJiYgcmFuZ2VudW1zWzFdID09IHR5cGVudW1zWzFdKTsKKworICBpZiAoKipwcCA9PSAnPScpCisgICAgeworICAgICAgKnBwID0gb3JpZzsKKyAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJICAgIHBwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisgICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICB9CisKKyAgaWYgKCoqcHAgPT0gJzsnKQorICAgICsrKnBwOworCisgIC8qIFRoZSByZW1haW5pbmcgdHdvIG9wZXJhbmRzIGFyZSB1c3VhbGx5IGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YKKyAgICAgdGhlIHJhbmdlLiAgQnV0IGluIHNvbWUgc3BlY2lhbCBjYXNlcyB0aGV5IG1lYW4gc29tZXRoaW5nIGVsc2UuICAqLworICBzMiA9ICpwcDsKKyAgbjIgPSBwYXJzZV9udW1iZXIgKHBwLCAmb3YyKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorICArKypwcDsKKworICBzMyA9ICpwcDsKKyAgbjMgPSBwYXJzZV9udW1iZXIgKHBwLCAmb3YzKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorICArKypwcDsKKworICBpZiAob3YyIHx8IG92MykKKyAgICB7CisgICAgICAvKiBnY2Mgd2lsbCBlbWl0IHJhbmdlIHN0YWJzIGZvciBsb25nIGxvbmcgdHlwZXMuICBIYW5kbGUgdGhpcworICAgICAgICAgYXMgYSBzcGVjaWFsIGNhc2UuICBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBtb3JlIGdlbmVyYWwuICAqLworI2RlZmluZSBMTExPVyAgIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOyIKKyNkZWZpbmUgTExISUdIICIwNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIKKyNkZWZpbmUgVUxMSElHSCAiMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7IgorICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXsKKwkgIGlmIChzdHJuY21wIChzMiwgTExMT1csIHNpemVvZiBMTExPVyAtIDEpID09IDAKKwkgICAgICAmJiBzdHJuY21wIChzMywgTExISUdILCBzaXplb2YgTExISUdIIC0gMSkgPT0gMCkKKwkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKKwkgIGlmICghIG92MgorCSAgICAgICYmIG4yID09IDAKKwkgICAgICAmJiBzdHJuY21wIChzMywgVUxMSElHSCwgc2l6ZW9mIFVMTEhJR0ggLSAxKSA9PSAwKQorCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7CisJfQorCisgICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm51bWVyaWMgb3ZlcmZsb3ciKSk7CisgICAgfQorCisgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKyAgICB7CisgICAgICAvKiBBIHR5cGUgZGVmaW5lZCBhcyBhIHN1YnJhbmdlIG9mIGl0c2VsZiwgd2l0aCBib3RoIGJvdW5kcyAwLAorICAgICAgICAgaXMgdm9pZC4gICovCisgICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMiA9PSAwICYmIG4zID09IDApCisJcmV0dXJuIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKKworICAgICAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggbjIgcG9zaXRpdmUgYW5kCisJIG4zIHplcm8sIGlzIGEgY29tcGxleCB0eXBlLCBhbmQgbjIgaXMgdGhlIG51bWJlciBvZiBieXRlcy4gICovCisgICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMyA9PSAwICYmIG4yID4gMCkKKwlyZXR1cm4gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIG4yKTsKKworICAgICAgLyogSWYgbjMgaXMgemVybyBhbmQgbjIgaXMgcG9zaXRpdmUsIHRoaXMgaXMgYSBmbG9hdGluZyBwb2ludAorICAgICAgICAgdHlwZSwgYW5kIG4yIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuICAqLworICAgICAgaWYgKG4zID09IDAgJiYgbjIgPiAwKQorCXJldHVybiBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIG4yKTsKKworICAgICAgLyogSWYgdGhlIHVwcGVyIGJvdW5kIGlzIC0xLCB0aGlzIGlzIGFuIHVuc2lnbmVkIGludC4gICovCisgICAgICBpZiAobjIgPT0gMCAmJiBuMyA9PSAtMSkKKwl7CisJICAvKiBXaGVuIGdjYyBpcyB1c2VkIHdpdGggLWdzdGFicywgYnV0IG5vdCAtZ3N0YWJzKywgaXQgd2lsbCBlbWl0CisJICAgICAgICAgbG9uZyBsb25nIGludDp0Nj1yMTswOy0xOworCQkgbG9uZyBsb25nIHVuc2lnbmVkIGludDp0Nz1yMTswOy0xOworCSAgICAgV2UgaGFjayBoZXJlIHRvIGhhbmRsZSB0aGlzIHJlYXNvbmFibHkuICAqLworCSAgaWYgKHR5cGVuYW1lICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wICh0eXBlbmFtZSwgImxvbmcgbG9uZyBpbnQiKSA9PSAwKQorCQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOworCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKKwkJcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOworCSAgICB9CisJICAvKiBGSVhNRTogVGhlIHNpemUgaGVyZSByZWFsbHkgZGVwZW5kcyB1cG9uIHRoZSB0YXJnZXQuICAqLworCSAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworCX0KKworICAgICAgLyogQSByYW5nZSBvZiAwIHRvIDEyNyBpcyBjaGFyLiAgKi8KKyAgICAgIGlmIChzZWxmX3N1YnJhbmdlICYmIG4yID09IDAgJiYgbjMgPT0gMTI3KQorCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7CisKKyAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIGZvciB0aGUgbGFuZ3VhZ2UgQ0hJTEwgaGVyZS4gICovCisKKyAgICAgIGlmIChuMiA9PSAwKQorCXsKKwkgIGlmIChuMyA8IDApCisJICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAtIG4zLCB0cnVlKTsKKwkgIGVsc2UgaWYgKG4zID09IDB4ZmYpCisJICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKKwkgIGVsc2UgaWYgKG4zID09IDB4ZmZmZikKKwkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOworCSAgZWxzZSBpZiAobjMgPT0gMHhmZmZmZmZmZikKKwkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworI2lmZGVmIEJGRDY0CisJICBlbHNlIGlmIChuMyA9PSAoKCgoYmZkX3ZtYSkgMHhmZmZmZmZmZikgPDwgMzIpIHwgMHhmZmZmZmZmZikpCisJICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKKyNlbmRpZgorCX0KKyAgICAgIGVsc2UgaWYgKG4zID09IDAKKwkgICAgICAgJiYgbjIgPCAwCisJICAgICAgICYmIChzZWxmX3N1YnJhbmdlIHx8IG4yID09IC04KSkKKwlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgLSBuMiwgdHJ1ZSk7CisgICAgICBlbHNlIGlmIChuMiA9PSAtIG4zIC0gMSB8fCBuMiA9PSBuMyArIDEpCisJeworCSAgaWYgKG4zID09IDB4N2YpCisJICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7CisJICBlbHNlIGlmIChuMyA9PSAweDdmZmYpCisJICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7CisJICBlbHNlIGlmIChuMyA9PSAweDdmZmZmZmZmKQorCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOworI2lmZGVmIEJGRDY0CisJICBlbHNlIGlmIChuMyA9PSAoKCgoYmZkX3ZtYSkgMHg3ZmZmZmZmZikgPDwgMzIpIHwgMHhmZmZmZmZmZikpCisJICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7CisjZW5kaWYKKwl9CisgICAgfQorCisgIC8qIEF0IHRoaXMgcG9pbnQgSSBkb24ndCBoYXZlIHRoZSBmYWludGVzdCBpZGVhIGhvdyB0byBkZWFsIHdpdGggYQorICAgICBzZWxmX3N1YnJhbmdlIHR5cGU7IEknbSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIHVzZWQgYXMgYW4KKyAgICAgaWRpb20sIGFuZCB0aGF0IGFsbCBvZiB0aGVtIGFyZSBzcGVjaWFsIGNhc2VzLiAgU28gLiAuIC4gICovCisgIGlmIChzZWxmX3N1YnJhbmdlKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorCisgIGluZGV4X3R5cGUgPSBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgcmFuZ2VudW1zKTsKKyAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorICAgIHsKKyAgICAgIC8qIERvZXMgdGhpcyBhY3R1YWxseSBldmVyIGhhcHBlbj8gIElzIHRoYXQgd2h5IHdlIGFyZSB3b3JyeWluZworICAgICAgICAgYWJvdXQgZGVhbGluZyB3aXRoIGl0IHJhdGhlciB0aGFuIGp1c3QgY2FsbGluZyBlcnJvcl90eXBlPyAgKi8KKyAgICAgIHdhcm5fc3RhYiAob3JpZywgXygibWlzc2luZyBpbmRleCB0eXBlIikpOworICAgICAgaW5kZXhfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKKyAgICB9CisKKyAgcmV0dXJuIGRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoZGhhbmRsZSwgaW5kZXhfdHlwZSwgbjIsIG4zKTsKK30KKworLyogU3VuJ3MgQUNDIHVzZXMgYSBzb21ld2hhdCBzYW5lciBtZXRob2QgZm9yIHNwZWNpZnlpbmcgdGhlIGJ1aWx0aW4KKyAgIHR5cGVkZWZzIGluIGV2ZXJ5IGZpbGUgKGZvciBpbnQsIGxvbmcsIGV0Yyk6CisKKwl0eXBlID0gYiA8c2lnbmVkPiA8d2lkdGg+OyA8b2Zmc2V0PjsgPG5iaXRzPgorCXNpZ25lZCA9IHUgb3Igcy4gIFBvc3NpYmxlIGMgaW4gYWRkaXRpb24gdG8gdSBvciBzIChmb3IgY2hhcj8pLgorCW9mZnNldCA9IG9mZnNldCBmcm9tIGhpZ2ggb3JkZXIgYml0IHRvIHN0YXJ0IGJpdCBvZiB0eXBlLgorCXdpZHRoIGlzICMgYnl0ZXMgaW4gb2JqZWN0IG9mIHRoaXMgdHlwZSwgbmJpdHMgaXMgIyBiaXRzIGluIHR5cGUuCisKKyAgIFRoZSB3aWR0aC9vZmZzZXQgc3R1ZmYgYXBwZWFycyB0byBiZSBmb3Igc21hbGwgb2JqZWN0cyBzdG9yZWQgaW4KKyAgIGxhcmdlciBvbmVzIChlLmcuIGBzaG9ydHMnIGluIGBpbnQnIHJlZ2lzdGVycykuICBXZSBpZ25vcmUgaXQgZm9yIG5vdywKKyAgIEZJWE1FLiAgKi8KKworc3RhdGljIGRlYnVnX3R5cGUKK3BhcnNlX3N0YWJfc3VuX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgcHApCisgICAgIFBUUiBkaGFuZGxlOworICAgICBjb25zdCBjaGFyICoqcHA7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGJvb2xlYW4gdW5zaWduZWRwOworICBiZmRfdm1hIGJpdHM7CisKKyAgb3JpZyA9ICpwcDsKKworICBzd2l0Y2ggKCoqcHApCisgICAgeworICAgIGNhc2UgJ3MnOgorICAgICAgdW5zaWduZWRwID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBjYXNlICd1JzoKKyAgICAgIHVuc2lnbmVkcCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYmFkX3N0YWIgKG9yaWcpOworICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICB9CisgICsrKnBwOworCisgIC8qIEZvciBzb21lIG9kZCByZWFzb24sIGFsbCBmb3JtcyBvZiBjaGFyIHB1dCBhIGMgaGVyZS4gIFRoaXMgaXMgc3RyYW5nZQorICAgICBiZWNhdXNlIG5vIG90aGVyIHR5cGUgaGFzIHRoaXMgaG9ub3IuICBXZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzIGJlY2F1c2UKKyAgICAgd2UgYWN0dWFsbHkgZGV0ZXJtaW5lICdjaGFyJ2FjdGVybmVzcyBieSB0aGUgbnVtYmVyIG9mIGJpdHMgc3BlY2lmaWVkIGluCisgICAgIHRoZSBkZXNjcmlwdG9yLiAgKi8KKyAgaWYgKCoqcHAgPT0gJ2MnKQorICAgICsrKnBwOworCisgIC8qIFRoZSBmaXJzdCBudW1iZXIgYXBwZWFycyB0byBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkCisgICAgIGJ5IHRoaXMgdHlwZSwgZXhjZXB0IHRoYXQgdW5zaWduZWQgc2hvcnQgaXMgNCBpbnN0ZWFkIG9mIDIuCisgICAgIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgcmVkdW5kYW50IHdpdGggdGhlIHRoaXJkIG51bWJlciwKKyAgICAgd2Ugd2lsbCBpZ25vcmUgaXQuICAqLworICAodm9pZCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7CisgIGlmICgqKnBwICE9ICc7JykKKyAgICB7CisgICAgICBiYWRfc3RhYiAob3JpZyk7CisgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworICAgIH0KKyAgKysqcHA7CisKKyAgLyogVGhlIHNlY29uZCBudW1iZXIgaXMgYWx3YXlzIDAsIHNvIGlnbm9yZSBpdCB0b28uICovCisgICh2b2lkKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorICArKypwcDsKKworICAvKiBUaGUgdGhpcmQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgdGhpcyB0eXBlLiAqLworICBiaXRzID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7CisKKyAgLyogVGhlIHR5cGUgKnNob3VsZCogZW5kIHdpdGggYSBzZW1pY29sb24uICBJZiBpdCBhcmUgZW1iZWRkZWQKKyAgICAgaW4gYSBsYXJnZXIgdHlwZSB0aGUgc2VtaWNvbG9uIG1heSBiZSB0aGUgb25seSB3YXkgdG8ga25vdyB3aGVyZQorICAgICB0aGUgdHlwZSBlbmRzLiAgSWYgdGhpcyB0eXBlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHN0YWJzdHJpbmcgd2UKKyAgICAgY2FuIGRlYWwgd2l0aCB0aGUgb21pdHRlZCBzZW1pY29sb24gKGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGxpa2UKKyAgICAgaXQpLiAgRG9uJ3QgYm90aGVyIHRvIGNvbXBsYWluKCksIFN1bidzIGNvbXBpbGVyIG9taXRzIHRoZSBzZW1pY29sb24KKyAgICAgZm9yICJ2b2lkIi4gICovCisgIGlmICgqKnBwID09ICc7JykKKyAgICArKypwcDsKKworICBpZiAoYml0cyA9PSAwKQorICAgIHJldHVybiBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7CisKKyAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIGJpdHMgLyA4LCB1bnNpZ25lZHApOworfQorCisvKiBQYXJzZSBhIGJ1aWx0aW4gZmxvYXRpbmcgdHlwZSBnZW5lcmF0ZWQgYnkgdGhlIFN1biBjb21waWxlci4gICovCisKK3N0YXRpYyBkZWJ1Z190eXBlCitwYXJzZV9zdGFiX3N1bl9mbG9hdGluZ190eXBlIChkaGFuZGxlLCBwcCkKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKipwcDsKK3sKKyAgY29uc3QgY2hhciAqb3JpZzsKKyAgYmZkX3ZtYSBkZXRhaWxzOworICBiZmRfdm1hIGJ5dGVzOworCisgIG9yaWcgPSAqcHA7CisKKyAgLyogVGhlIGZpcnN0IG51bWJlciBoYXMgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB0eXBlLCBmb3IgZXhhbXBsZQorICAgICBGTl9DT01QTEVYLiAgKi8KKyAgZGV0YWlscyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOworICBpZiAoKipwcCAhPSAnOycpCisgICAgeworICAgICAgYmFkX3N0YWIgKG9yaWcpOworICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICB9CisKKyAgLyogVGhlIHNlY29uZCBudW1iZXIgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSB0aGlzIHR5cGUgKi8KKyAgYnl0ZXMgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorCisgIGlmIChkZXRhaWxzID09IE5GX0NPTVBMRVgKKyAgICAgIHx8IGRldGFpbHMgPT0gTkZfQ09NUExFWDE2CisgICAgICB8fCBkZXRhaWxzID09IE5GX0NPTVBMRVgzMikKKyAgICByZXR1cm4gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIGJ5dGVzKTsKKworICByZXR1cm4gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCBieXRlcyk7ICAgICAgCit9CisKKy8qIEhhbmRsZSBhbiBlbnVtIHR5cGUuICAqLworCitzdGF0aWMgZGVidWdfdHlwZQorcGFyc2Vfc3RhYl9lbnVtX3R5cGUgKGRoYW5kbGUsIHBwKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqKnBwOworeworICBjb25zdCBjaGFyICpvcmlnOworICBjb25zdCBjaGFyICoqbmFtZXM7CisgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7CisgIHVuc2lnbmVkIGludCBuOworICB1bnNpZ25lZCBpbnQgYWxsb2M7CisKKyAgb3JpZyA9ICpwcDsKKworICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLworCisgIC8qIFRoZSBhaXg0IGNvbXBpbGVyIGVtaXRzIGFuIGV4dHJhIGZpZWxkIGJlZm9yZSB0aGUgZW51bSBtZW1iZXJzOworICAgICBteSBndWVzcyBpcyBpdCdzIGEgdHlwZSBvZiBzb21lIHNvcnQuICBKdXN0IGlnbm9yZSBpdC4gICovCisgIGlmICgqKnBwID09ICctJykKKyAgICB7CisgICAgICB3aGlsZSAoKipwcCAhPSAnOicpCisJKysqcHA7CisgICAgICArKypwcDsKKyAgICB9CisKKyAgLyogUmVhZCB0aGUgdmFsdWUtbmFtZXMgYW5kIHRoZWlyIHZhbHVlcy4KKyAgICAgVGhlIGlucHV0IHN5bnRheCBpcyBOQU1FOlZBTFVFLE5BTUU6VkFMVUUsIGFuZCBzbyBvbi4KKyAgICAgQSBzZW1pY29sb24gb3IgY29tbWEgaW5zdGVhZCBvZiBhIE5BTUUgbWVhbnMgdGhlIGVuZC4gICovCisgIGFsbG9jID0gMTA7CisgIG5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7CisgIHZhbHVlcyA9IChiZmRfc2lnbmVkX3ZtYSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqdmFsdWVzKTsKKyAgbiA9IDA7CisgIHdoaWxlICgqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnOycgJiYgKipwcCAhPSAnLCcpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcDsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBiZmRfc2lnbmVkX3ZtYSB2YWw7CisKKyAgICAgIHAgPSAqcHA7CisgICAgICB3aGlsZSAoKnAgIT0gJzonKQorCSsrcDsKKworICAgICAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7CisKKyAgICAgICpwcCA9IHAgKyAxOworICAgICAgdmFsID0gKGJmZF9zaWduZWRfdm1hKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgICAgIGlmICgqKnBwICE9ICcsJykKKwl7CisJICBiYWRfc3RhYiAob3JpZyk7CisJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOworCX0KKyAgICAgICsrKnBwOworCisgICAgICBpZiAobiArIDEgPj0gYWxsb2MpCisJeworCSAgYWxsb2MgKz0gMTA7CisJICBuYW1lcyA9ICgoY29uc3QgY2hhciAqKikKKwkJICAgeHJlYWxsb2MgKChQVFIpIG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKKwkgIHZhbHVlcyA9ICgoYmZkX3NpZ25lZF92bWEgKikKKwkJICAgIHhyZWFsbG9jICgoUFRSKSB2YWx1ZXMsIGFsbG9jICogc2l6ZW9mICp2YWx1ZXMpKTsKKwl9CisKKyAgICAgIG5hbWVzW25dID0gbmFtZTsKKyAgICAgIHZhbHVlc1tuXSA9IHZhbDsKKyAgICAgICsrbjsKKyAgICB9CisKKyAgbmFtZXNbbl0gPSBOVUxMOworICB2YWx1ZXNbbl0gPSAwOworCisgIGlmICgqKnBwID09ICc7JykKKyAgICArKypwcDsKKworICByZXR1cm4gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWx1ZXMpOworfQorCisvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHN0cnVjdHVyZSAob3IgdW5pb24gdHlwZSkgYW5kIHJldHVybiBhbiBvYmplY3QKKyAgIGRlc2NyaWJpbmcgdGhlIHR5cGUuCisKKyAgIFBQIHBvaW50cyB0byBhIGNoYXJhY3RlciBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IHVuY29uc3VtZWQgdG9rZW4KKyAgIGluIHRoZSB0aGUgc3RhYnMgc3RyaW5nLiAgRm9yIGV4YW1wbGUsIGdpdmVuIHN0YWJzICJBOlQ0PXM0YToxLDAsMzI7OyIsCisgICAqUFAgd2lsbCBwb2ludCB0byAiNGE6MSwwLDMyOzsiLiAgKi8KKworc3RhdGljIGRlYnVnX3R5cGUKK3BhcnNlX3N0YWJfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCBzdHJ1Y3RwLCB0eXBlbnVtcykKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBib29sZWFuIHN0cnVjdHA7CisgICAgIGNvbnN0IGludCAqdHlwZW51bXM7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGJmZF92bWEgc2l6ZTsKKyAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKKyAgZGVidWdfZmllbGQgKmZpZWxkczsKKyAgYm9vbGVhbiBzdGF0aWNzOworICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7CisgIGRlYnVnX3R5cGUgdnB0cmJhc2U7CisgIGJvb2xlYW4gb3dudnB0cjsKKworICBvcmlnID0gKnBwOworCisgIC8qIEdldCB0aGUgc2l6ZS4gICovCisgIHNpemUgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKworICAvKiBHZXQgdGhlIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKCEgcGFyc2Vfc3RhYl9iYXNlY2xhc3NlcyAoZGhhbmRsZSwgaW5mbywgcHAsICZiYXNlY2xhc3NlcykKKyAgICAgIHx8ICEgcGFyc2Vfc3RhYl9zdHJ1Y3RfZmllbGRzIChkaGFuZGxlLCBpbmZvLCBwcCwgJmZpZWxkcywgJnN0YXRpY3MpCisgICAgICB8fCAhIHBhcnNlX3N0YWJfbWVtYmVycyAoZGhhbmRsZSwgaW5mbywgdGFnbmFtZSwgcHAsIHR5cGVudW1zLCAmbWV0aG9kcykKKyAgICAgIHx8ICEgcGFyc2Vfc3RhYl90aWxkZV9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHR5cGVudW1zLCAmdnB0cmJhc2UsCisJCQkJICAgJm93bnZwdHIpKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgaWYgKCEgc3RhdGljcworICAgICAgJiYgYmFzZWNsYXNzZXMgPT0gTlVMTAorICAgICAgJiYgbWV0aG9kcyA9PSBOVUxMCisgICAgICAmJiB2cHRyYmFzZSA9PSBERUJVR19UWVBFX05VTEwKKyAgICAgICYmICEgb3dudnB0cikKKyAgICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzKTsKKworICByZXR1cm4gZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoZGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzLCBiYXNlY2xhc3NlcywKKwkJCQkgbWV0aG9kcywgdnB0cmJhc2UsIG93bnZwdHIpOworfQorCisvKiBUaGUgc3RhYnMgZm9yIEMrKyBkZXJpdmVkIGNsYXNzZXMgY29udGFpbiBiYXNlY2xhc3MgaW5mb3JtYXRpb24gd2hpY2gKKyAgIGlzIG1hcmtlZCBieSBhICchJyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHRvdGFsIHNpemUuICBUaGlzIGZ1bmN0aW9uIGlzCisgICBjYWxsZWQgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGJhc2VjbGFzcyBtYXJrZXIsIGFuZCBzbHVycHMgdXAgYWxsIHRoZQorICAgYmFzZWNsYXNzIGluZm9ybWF0aW9uLgorCisgICBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlICchJyBtYXJrZXIgaXMgdGhlIG51bWJlciBvZiBiYXNlIGNsYXNzZXMgdGhhdAorICAgdGhlIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSwgZm9sbG93ZWQgYnkgaW5mb3JtYXRpb24gZm9yIGVhY2ggYmFzZSBjbGFzcy4KKyAgIEZvciBlYWNoIGJhc2UgY2xhc3MsIHRoZXJlIGFyZSB0d28gdmlzaWJpbGl0eSBzcGVjaWZpZXJzLCBhIGJpdCBvZmZzZXQKKyAgIHRvIHRoZSBiYXNlIGNsYXNzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgZGVyaXZlZCBjbGFzcywgYSByZWZlcmVuY2UgdG8KKyAgIHRoZSB0eXBlIGZvciB0aGUgYmFzZSBjbGFzcywgYW5kIGEgdGVybWluYXRpbmcgc2VtaWNvbG9uLgorCisgICBBIHR5cGljYWwgZXhhbXBsZSwgd2l0aCB0d28gYmFzZSBjbGFzc2VzLCB3b3VsZCBiZSAiITIsMDIwLDE5OzAyNjQsMjE7Ii4KKyAgIAkJCQkJCSAgICAgICBeXiBeIF4gXiAgXiBeICBeCisJQmFzZWNsYXNzIGluZm9ybWF0aW9uIG1hcmtlciBfX19fX19fX19fX19fX19fX198fCB8IHwgfCAgfCB8ICB8CisJTnVtYmVyIG9mIGJhc2VjbGFzc2VzIF9fX19fX19fX19fX19fX19fX19fX19fX19ffCB8IHwgfCAgfCB8ICB8CisJVmlzaWJpbGl0eSBzcGVjaWZpZXJzICgyKSBfX19fX19fX19fX19fX19fX19fX19fX198IHwgfCAgfCB8ICB8CisJT2Zmc2V0IGluIGJpdHMgZnJvbSBzdGFydCBvZiBjbGFzcyBfX19fX19fX19fX19fX19fX3wgfCAgfCB8ICB8CisJVHlwZSBudW1iZXIgZm9yIGJhc2UgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19fX19ffCAgfCB8ICB8CisJVmlzaWJpbGl0eSBzcGVjaWZpZXJzICgyKSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCB8ICB8CisJT2Zmc2V0IGluIGJpdHMgZnJvbSBzdGFydCBvZiBjbGFzcyBfX19fX19fX19fX19fX19fX19fX19fX198ICB8CisJVHlwZSBudW1iZXIgb2YgYmFzZSBjbGFzcyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisKKyAgUmV0dXJuIHRydWUgZm9yIHN1Y2Nlc3MsIGZhbHNlIGZvciBmYWlsdXJlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BhcnNlX3N0YWJfYmFzZWNsYXNzZXMgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGRlYnVnX2Jhc2VjbGFzcyAqKnJldHA7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIHVuc2lnbmVkIGludCBjLCBpOworICBkZWJ1Z19iYXNlY2xhc3MgKmNsYXNzZXM7CisKKyAgKnJldHAgPSBOVUxMOworCisgIG9yaWcgPSAqcHA7CisKKyAgaWYgKCoqcHAgIT0gJyEnKQorICAgIHsKKyAgICAgIC8qIE5vIGJhc2UgY2xhc3Nlcy4gICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICsrKnBwOworCisgIGMgPSAodW5zaWduZWQgaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKworICBpZiAoKipwcCAhPSAnLCcpCisgICAgeworICAgICAgYmFkX3N0YWIgKG9yaWcpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgKysqcHA7CisKKyAgY2xhc3NlcyA9IChkZWJ1Z19iYXNlY2xhc3MgKikgeG1hbGxvYyAoKGMgKyAxKSAqIHNpemVvZiAoKipyZXRwKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKKyAgICB7CisgICAgICBib29sZWFuIHZpcnR1YWw7CisgICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKyAgICAgIGJmZF92bWEgYml0cG9zOworICAgICAgZGVidWdfdHlwZSB0eXBlOworCisgICAgICBzd2l0Y2ggKCoqcHApCisJeworCWNhc2UgJzAnOgorCSAgdmlydHVhbCA9IGZhbHNlOworCSAgYnJlYWs7CisJY2FzZSAnMSc6CisJICB2aXJ0dWFsID0gdHJ1ZTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB3YXJuX3N0YWIgKG9yaWcsIF8oInVua25vd24gdmlydHVhbCBjaGFyYWN0ZXIgZm9yIGJhc2VjbGFzcyIpKTsKKwkgIHZpcnR1YWwgPSBmYWxzZTsKKwkgIGJyZWFrOworCX0KKyAgICAgICsrKnBwOworCisgICAgICBzd2l0Y2ggKCoqcHApCisJeworCWNhc2UgJzAnOgorCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKKwkgIGJyZWFrOworCWNhc2UgJzEnOgorCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOworCSAgYnJlYWs7CisJY2FzZSAnMic6CisJICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bmtub3duIHZpc2liaWxpdHkgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiKSk7CisJICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7CisJICBicmVhazsKKwl9CisgICAgICArKypwcDsKKworICAgICAgLyogVGhlIHJlbWFpbmluZyB2YWx1ZSBpcyB0aGUgYml0IG9mZnNldCBvZiB0aGUgcG9ydGlvbiBvZiB0aGUKKwkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBiYXNlY2xhc3MuICBBbHdheXMgemVybyBpbiB0aGUKKwkgYWJzZW5jZSBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZS4gICovCisgICAgICBiaXRwb3MgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgICAgIGlmICgqKnBwICE9ICcsJykKKwl7CisJICBiYWRfc3RhYiAob3JpZyk7CisJICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgKysqcHA7CisKKyAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAorCQkJICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgY2xhc3Nlc1tpXSA9IGRlYnVnX21ha2VfYmFzZWNsYXNzIChkaGFuZGxlLCB0eXBlLCBiaXRwb3MsIHZpcnR1YWwsCisJCQkJCSB2aXNpYmlsaXR5KTsKKyAgICAgIGlmIChjbGFzc2VzW2ldID09IERFQlVHX0JBU0VDTEFTU19OVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCoqcHAgIT0gJzsnKQorCXJldHVybiBmYWxzZTsKKyAgICAgICsrKnBwOworICAgIH0KKworICBjbGFzc2VzW2ldID0gREVCVUdfQkFTRUNMQVNTX05VTEw7CisKKyAgKnJldHAgPSBjbGFzc2VzOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBSZWFkIHN0cnVjdCBvciBjbGFzcyBkYXRhIGZpZWxkcy4gIFRoZXkgaGF2ZSB0aGUgZm9ybToKKworICAgCU5BTUUgOiBbVklTSUJJTElUWV0gVFlQRU5VTSAsIEJJVFBPUyAsIEJJVFNJWkUgOworCisgICBBdCB0aGUgZW5kLCB3ZSBzZWUgYSBzZW1pY29sb24gaW5zdGVhZCBvZiBhIGZpZWxkLgorCisgICBJbiBDKyssIHRoaXMgbWF5IHdpbmQgdXAgYmVpbmcgTkFNRTo/VFlQRU5VTTpQSFlTTkFNRTsgZm9yCisgICBhIHN0YXRpYyBmaWVsZC4KKworICAgVGhlIG9wdGlvbmFsIFZJU0lCSUxJVFkgaXMgb25lIG9mOgorCisgICAJJy8wJwkoVklTSUJJTElUWV9QUklWQVRFKQorCScvMScJKFZJU0lCSUxJVFlfUFJPVEVDVEVEKQorCScvMicJKFZJU0lCSUxJVFlfUFVCTElDKQorCScvOScJKFZJU0lCSUxJVFlfSUdOT1JFKQorCisgICBvciBub3RoaW5nLCBmb3IgQyBzdHlsZSBmaWVsZHMgd2l0aCBwdWJsaWMgdmlzaWJpbGl0eS4KKworICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcyAoZGhhbmRsZSwgaW5mbywgcHAsIHJldHAsIHN0YXRpY3NwKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGRlYnVnX2ZpZWxkICoqcmV0cDsKKyAgICAgYm9vbGVhbiAqc3RhdGljc3A7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGNvbnN0IGNoYXIgKnA7CisgIGRlYnVnX2ZpZWxkICpmaWVsZHM7CisgIHVuc2lnbmVkIGludCBjOworICB1bnNpZ25lZCBpbnQgYWxsb2M7CisKKyAgKnJldHAgPSBOVUxMOworICAqc3RhdGljc3AgPSBmYWxzZTsKKworICBvcmlnID0gKnBwOworCisgIGMgPSAwOworICBhbGxvYyA9IDEwOworICBmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7CisgIHdoaWxlICgqKnBwICE9ICc7JykKKyAgICB7CisgICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLworCisgICAgICBwID0gKnBwOworCisgICAgICAvKiBBZGQgMSB0byBjIHRvIGxlYXZlIHJvb20gZm9yIE5VTEwgcG9pbnRlciBhdCBlbmQuICAqLworICAgICAgaWYgKGMgKyAxID49IGFsbG9jKQorCXsKKwkgIGFsbG9jICs9IDEwOworCSAgZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQorCQkgICAgeHJlYWxsb2MgKChQVFIpIGZpZWxkcywgYWxsb2MgKiBzaXplb2YgKmZpZWxkcykpOworCX0KKworICAgICAgLyogSWYgaXQgc3RhcnRzIHdpdGggQ1BMVVNfTUFSS0VSIGl0IGlzIGEgc3BlY2lhbCBhYmJyZXZpYXRpb24sCisJIHVubGVzcyB0aGUgQ1BMVVNfTUFSS0VSIGlzIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUsIGluCisJIHdoaWNoIGNhc2UgaXQgaXMganVzdCB0aGUgbmFtZSBvZiBhbiBhbm9ueW1vdXMgdHlwZSwgd2hpY2ggd2UKKwkgc2hvdWxkIGhhbmRsZSBsaWtlIGFueSBvdGhlciB0eXBlIG5hbWUuICBXZSBhY2NlcHQgZWl0aGVyICckJworCSBvciAnLicsIGJlY2F1c2UgYSBmaWVsZCBuYW1lIGNhbiBuZXZlciBjb250YWluIG9uZSBvZiB0aGVzZQorCSBjaGFyYWN0ZXJzIGV4Y2VwdCBhcyBhIENQTFVTX01BUktFUi4gICovCisKKyAgICAgIGlmICgoKnAgPT0gJyQnIHx8ICpwID09ICcuJykgJiYgcFsxXSAhPSAnXycpCisJeworCSAgKysqcHA7CisJICBpZiAoISBwYXJzZV9zdGFiX2NwcF9hYmJyZXYgKGRoYW5kbGUsIGluZm8sIHBwLCBmaWVsZHMgKyBjKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgKytjOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBMb29rIGZvciB0aGUgJzonIHRoYXQgc2VwYXJhdGVzIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIGZpZWxkCisJIHZhbHVlcy4gIERhdGEgbWVtYmVycyBhcmUgZGVsaW1pdGVkIGJ5IGEgc2luZ2xlICc6Jywgd2hpbGUgbWVtYmVyCisJIGZ1bmN0aW9ucyBhcmUgZGVsaW1pdGVkIGJ5IGEgcGFpciBvZiAnOidzLiAgV2hlbiB3ZSBoaXQgdGhlIG1lbWJlcgorCSBmdW5jdGlvbnMgKGlmIGFueSksIHRlcm1pbmF0ZSBzY2FuIGxvb3AgYW5kIHJldHVybi4gKi8KKworICAgICAgcCA9IHN0cmNociAocCwgJzonKTsKKyAgICAgIGlmIChwID09IE5VTEwpCisJeworCSAgYmFkX3N0YWIgKG9yaWcpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKHBbMV0gPT0gJzonKQorCWJyZWFrOworCisgICAgICBpZiAoISBwYXJzZV9zdGFiX29uZV9zdHJ1Y3RfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCBwLCBmaWVsZHMgKyBjLAorCQkJCQkgc3RhdGljc3ApKQorCXJldHVybiBmYWxzZTsKKworICAgICAgKytjOworICAgIH0KKworICBmaWVsZHNbY10gPSBERUJVR19GSUVMRF9OVUxMOworCisgICpyZXRwID0gZmllbGRzOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTcGVjaWFsIEdOVSBDKysgbmFtZS4gICovCisKK3N0YXRpYyBib29sZWFuCitwYXJzZV9zdGFiX2NwcF9hYmJyZXYgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGRlYnVnX2ZpZWxkICpyZXRwOworeworICBjb25zdCBjaGFyICpvcmlnOworICBpbnQgY3BwX2FiYnJldjsKKyAgZGVidWdfdHlwZSBjb250ZXh0OworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICp0eXBlbmFtZTsKKyAgZGVidWdfdHlwZSB0eXBlOworICBiZmRfdm1hIGJpdHBvczsKKworICAqcmV0cCA9IERFQlVHX0ZJRUxEX05VTEw7CisKKyAgb3JpZyA9ICpwcDsKKworICBpZiAoKipwcCAhPSAndicpCisgICAgeworICAgICAgYmFkX3N0YWIgKCpwcCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICBjcHBfYWJicmV2ID0gKipwcDsKKyAgKysqcHA7CisKKyAgLyogQXQgdGhpcyBwb2ludCwgKnBwIHBvaW50cyB0byBzb21ldGhpbmcgbGlrZSAiMjI6MjM9KjIyLi4uIiwgd2hlcmUKKyAgICAgdGhlIHR5cGUgbnVtYmVyIGJlZm9yZSB0aGUgJzonIGlzIHRoZSAiY29udGV4dCIgYW5kIGV2ZXJ5dGhpbmcKKyAgICAgYWZ0ZXIgaXMgYSByZWd1bGFyIHR5cGUgZGVmaW5pdGlvbi4gIExvb2t1cCB0aGUgdHlwZSwgZmluZCBpdCdzCisgICAgIG5hbWUsIGFuZCBjb25zdHJ1Y3QgdGhlIGZpZWxkIG5hbWUuICAqLworCisgIGNvbnRleHQgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAorCQkJICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisgIGlmIChjb250ZXh0ID09IERFQlVHX1RZUEVfTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChjcHBfYWJicmV2KQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICAgIC8qICR2ZiAtLSBhIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgcG9pbnRlci4gICovCisgICAgICBuYW1lID0gIl92cHRyJCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICAgIC8qICR2YiAtLSBhIHZpcnR1YWwgYnNvbWV0aGluZ29yb3RoZXIgKi8KKyAgICAgIHR5cGVuYW1lID0gZGVidWdfZ2V0X3R5cGVfbmFtZSAoZGhhbmRsZSwgY29udGV4dCk7CisgICAgICBpZiAodHlwZW5hbWUgPT0gTlVMTCkKKwl7CisJICB3YXJuX3N0YWIgKG9yaWcsIF8oInVubmFtZWQgJHZiIHR5cGUiKSk7CisJICB0eXBlbmFtZSA9ICJGT08iOworCX0KKyAgICAgIG5hbWUgPSBjb25jYXQgKCJfdmIkIiwgdHlwZW5hbWUsIChjb25zdCBjaGFyICopIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHdhcm5fc3RhYiAob3JpZywgXygidW5yZWNvZ25pemVkIEMrKyBhYmJyZXZpYXRpb24iKSk7CisgICAgICBuYW1lID0gIklOVkFMSURfQ1BMVVNQTFVTX0FCQlJFViI7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKCoqcHAgIT0gJzonKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICsrKnBwOworCisgIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAorCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7CisgIGlmICgqKnBwICE9ICcsJykKKyAgICB7CisgICAgICBiYWRfc3RhYiAob3JpZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICBiaXRwb3MgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICsrKnBwOworCisgICpyZXRwID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgbmFtZSwgdHlwZSwgYml0cG9zLCAwLAorCQkJICAgIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSk7CisgIGlmICgqcmV0cCA9PSBERUJVR19GSUVMRF9OVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUGFyc2UgYSBzaW5nbGUgZmllbGQgaW4gYSBzdHJ1Y3Qgb3IgdW5pb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgcCwgcmV0cCwgc3RhdGljc3ApCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKipwcDsKKyAgICAgY29uc3QgY2hhciAqcDsKKyAgICAgZGVidWdfZmllbGQgKnJldHA7CisgICAgIGJvb2xlYW4gKnN0YXRpY3NwOworeworICBjb25zdCBjaGFyICpvcmlnOworICBjaGFyICpuYW1lOworICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKKyAgZGVidWdfdHlwZSB0eXBlOworICBiZmRfdm1hIGJpdHBvczsKKyAgYmZkX3ZtYSBiaXRzaXplOworCisgIG9yaWcgPSAqcHA7CisKKyAgLyogRklYTUU6IGdkYiBjaGVja3MgQVJNX0RFTUFOR0xJTkcgaGVyZS4gICovCisKKyAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7CisKKyAgKnBwID0gcCArIDE7CisKKyAgaWYgKCoqcHAgIT0gJy8nKQorICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKKyAgZWxzZQorICAgIHsKKyAgICAgICsrKnBwOworICAgICAgc3dpdGNoICgqKnBwKQorCXsKKwljYXNlICcwJzoKKwkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7CisJICBicmVhazsKKwljYXNlICcxJzoKKwkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKKwkgIGJyZWFrOworCWNhc2UgJzInOgorCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHdhcm5fc3RhYiAob3JpZywgXygidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgZmllbGQiKSk7CisJICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7CisJICBicmVhazsKKwl9CisgICAgICArKypwcDsKKyAgICB9CisKKyAgdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKipwcCA9PSAnOicpCisgICAgeworICAgICAgY2hhciAqdmFybmFtZTsKKworICAgICAgLyogVGhpcyBpcyBhIHN0YXRpYyBjbGFzcyBtZW1iZXIuICAqLworICAgICAgKysqcHA7CisgICAgICBwID0gc3RyY2hyICgqcHAsICc7Jyk7CisgICAgICBpZiAocCA9PSBOVUxMKQorCXsKKwkgIGJhZF9zdGFiIChvcmlnKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHZhcm5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOworCisgICAgICAqcHAgPSBwICsgMTsKKworICAgICAgKnJldHAgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIHZhcm5hbWUsCisJCQkJCXZpc2liaWxpdHkpOworICAgICAgKnN0YXRpY3NwID0gdHJ1ZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIGlmICgqKnBwICE9ICcsJykKKyAgICB7CisgICAgICBiYWRfc3RhYiAob3JpZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICBiaXRwb3MgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgaWYgKCoqcHAgIT0gJywnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICsrKnBwOworCisgIGJpdHNpemUgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICsrKnBwOworCisgIGlmIChiaXRwb3MgPT0gMCAmJiBiaXRzaXplID09IDApCisgICAgeworICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGluIHR3byBjYXNlczogKDEpIGF0IGxlYXN0IGZvciBnY2MgMi40LjUgb3IKKwkgc28sIGl0IGlzIGEgZmllbGQgd2hpY2ggaGFzIGJlZW4gb3B0aW1pemVkIG91dC4gIFRoZSBjb3JyZWN0CisJIHN0YWIgZm9yIHRoaXMgY2FzZSBpcyB0byB1c2UgVklTSUJJTElUWV9JR05PUkUsIGJ1dCB0aGF0IGlzIGEKKwkgcmVjZW50IGludmVudGlvbi4gICgyKSBJdCBpcyBhIDAtc2l6ZSBhcnJheS4gIEZvciBleGFtcGxlCisJIHVuaW9uIHsgaW50IG51bTsgY2hhciBzdHJbMF07IH0gZm9vLiAgUHJpbnRpbmcgIjxubyB2YWx1ZT4iCisJIGZvciBzdHIgaW4gInAgZm9vIiBpcyBPSywgc2luY2UgZm9vLnN0ciAoYW5kIHRodXMgZm9vLnN0clszXSkKKwkgd2lsbCBjb250aW51ZSB0byB3b3JrLCBhbmQgYSAwLXNpemUgYXJyYXkgYXMgYSB3aG9sZSBkb2Vzbid0CisJIGhhdmUgYW55IGNvbnRlbnRzIHRvIHByaW50LgorCisJIEkgc3VzcGVjdCB0aGlzIHByb2JhYmx5IGNvdWxkIGFsc28gaGFwcGVuIHdpdGggZ2NjIC1nc3RhYnMKKwkgKG5vdCAtZ3N0YWJzKykgZm9yIHN0YXRpYyBmaWVsZHMsIGFuZCBwZXJoYXBzIG90aGVyIEMrKworCSBleHRlbnNpb25zLiAgSG9wZWZ1bGx5IGZldyBwZW9wbGUgdXNlIC1nc3RhYnMgd2l0aCBnZGIsIHNpbmNlCisJIGl0IGlzIGludGVuZGVkIGZvciBkYnggY29tcGF0aWJpbGl0eS4gICovCisgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9JR05PUkU7CisgICAgfQorCisgIC8qIEZJWE1FOiBnZGIgZG9lcyBzb21lIHN0dWZmIGhlcmUgdG8gbWFyayBmaWVsZHMgYXMgdW5wYWNrZWQuICAqLworCisgICpyZXRwID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgbmFtZSwgdHlwZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUmVhZCBtZW1iZXIgZnVuY3Rpb24gc3RhYnMgaW5mbyBmb3IgQysrIGNsYXNzZXMuICBUaGUgZm9ybSBvZiBlYWNoIG1lbWJlcgorICAgZnVuY3Rpb24gZGF0YSBpczoKKworCU5BTUUgOjogVFlQRU5VTVs9dHlwZSBkZWZpbml0aW9uXSBBUkdTIDogUEhZU05BTUUgOworCisgICBBbiBleGFtcGxlIHdpdGggdHdvIG1lbWJlciBmdW5jdGlvbnMgaXM6CisKKwlhZnVuYzE6OjIwPSMjMTU7Omk7MkEuO2FmdW5jMjo6MjA6aTsyQS47CisKKyAgIEZvciB0aGUgY2FzZSBvZiBvdmVybG9hZGVkIG9wZXJhdG9ycywgdGhlIGZvcm1hdCBpcyBvcCQ6OiouZnVuY3MsIHdoZXJlCisgICAkIGlzIHRoZSBDUExVU19NQVJLRVIgKHVzdWFsbHkgJyQnKSwgYConIGhvbGRzIHRoZSBwbGFjZSBmb3IgYW4gb3BlcmF0b3IKKyAgIG5hbWUgKHN1Y2ggYXMgYCs9JykgYW5kIGAuJyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBvcGVyYXRvciBuYW1lLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BhcnNlX3N0YWJfbWVtYmVycyAoZGhhbmRsZSwgaW5mbywgdGFnbmFtZSwgcHAsIHR5cGVudW1zLCByZXRwKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICp0YWduYW1lOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGNvbnN0IGludCAqdHlwZW51bXM7CisgICAgIGRlYnVnX21ldGhvZCAqKnJldHA7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGRlYnVnX21ldGhvZCAqbWV0aG9kczsKKyAgdW5zaWduZWQgaW50IGM7CisgIHVuc2lnbmVkIGludCBhbGxvYzsKKworICAqcmV0cCA9IE5VTEw7CisKKyAgb3JpZyA9ICpwcDsKKworICBhbGxvYyA9IDA7CisgIG1ldGhvZHMgPSBOVUxMOworICBjID0gMDsKKworICB3aGlsZSAoKipwcCAhPSAnOycpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcDsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdmFyaWFudHM7CisgICAgICB1bnNpZ25lZCBpbnQgY3ZhcnM7CisgICAgICB1bnNpZ25lZCBpbnQgYWxsb2N2YXJzOworICAgICAgZGVidWdfdHlwZSBsb29rX2FoZWFkX3R5cGU7CisKKyAgICAgIHAgPSBzdHJjaHIgKCpwcCwgJzonKTsKKyAgICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSAnOicpCisJYnJlYWs7CisKKyAgICAgIC8qIEZJWE1FOiBTb21lIHN5c3RlbXMgdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuICckJyBoZXJlLiAgKi8KKyAgICAgIGlmICgoKnBwKVswXSAhPSAnbycgfHwgKCpwcClbMV0gIT0gJ3AnIHx8ICgqcHApWzJdICE9ICckJykKKwl7CisJICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKKwkgICpwcCA9IHAgKyAyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIGEgY29tcGxldGVseSB3aWVyZCBjYXNlLiAgSW4gb3JkZXIgdG8gc3R1ZmYgaW4gdGhlCisJICAgICBuYW1lcyB0aGF0IG1pZ2h0IGNvbnRhaW4gY29sb25zICh0aGUgdXN1YWwgbmFtZSBkZWxpbWl0ZXIpLAorCSAgICAgTWlrZSBUaWVtYW5uIGRlZmluZWQgYSBkaWZmZXJlbnQgbmFtZSBmb3JtYXQgd2hpY2ggaXMKKwkgICAgIHNpZ25hbGxlZCBpZiB0aGUgaWRlbnRpZmllciBpcyAib3AkIi4gIEluIHRoYXQgY2FzZSwgdGhlCisJICAgICBmb3JtYXQgaXMgIm9wJDo6WFhYWC4iIHdoZXJlIFhYWFggaXMgdGhlIG5hbWUuICBUaGlzIGlzCisJICAgICB1c2VkIGZvciBuYW1lcyBsaWtlICIrIiBvciAiPSIuICBZVVVVVVVVVUshICBGSVhNRSEgICovCisJICAqcHAgPSBwICsgMjsKKwkgIGZvciAocCA9ICpwcDsgKnAgIT0gJy4nICYmICpwICE9ICdcMCc7IHArKykKKwkgICAgOworCSAgaWYgKCpwICE9ICcuJykKKwkgICAgeworCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOworCSAgKnBwID0gcCArIDE7CisJfQorCisgICAgICBhbGxvY3ZhcnMgPSAxMDsKKyAgICAgIHZhcmlhbnRzID0gKChkZWJ1Z19tZXRob2RfdmFyaWFudCAqKQorCQkgIHhtYWxsb2MgKGFsbG9jdmFycyAqIHNpemVvZiAqdmFyaWFudHMpKTsKKyAgICAgIGN2YXJzID0gMDsKKworICAgICAgbG9va19haGVhZF90eXBlID0gREVCVUdfVFlQRV9OVUxMOworCisgICAgICBkbworCXsKKwkgIGRlYnVnX3R5cGUgdHlwZTsKKwkgIGJvb2xlYW4gc3R1YjsKKwkgIGNoYXIgKmFyZ3R5cGVzOworCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisJICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwLCBzdGF0aWNwOworCSAgYmZkX3ZtYSB2b2Zmc2V0OworCSAgZGVidWdfdHlwZSBjb250ZXh0OworCSAgY29uc3QgY2hhciAqcGh5c25hbWU7CisJICBib29sZWFuIHZhcmFyZ3M7CisKKwkgIGlmIChsb29rX2FoZWFkX3R5cGUgIT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICB7CisJICAgICAgLyogZysrIHZlcnNpb24gMSBrbHVkZ2UgKi8KKwkgICAgICB0eXBlID0gbG9va19haGVhZF90eXBlOworCSAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkJICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworCSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIGlmICgqKnBwICE9ICc6JykKKwkJeworCQkgIGJhZF9zdGFiIChvcmlnKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgfQorCisJICArKypwcDsKKwkgIHAgPSBzdHJjaHIgKCpwcCwgJzsnKTsKKwkgIGlmIChwID09IE5VTEwpCisJICAgIHsKKwkgICAgICBiYWRfc3RhYiAob3JpZyk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIHN0dWIgPSBmYWxzZTsKKwkgIGlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCB0eXBlKSA9PSBERUJVR19LSU5EX01FVEhPRAorCSAgICAgICYmIGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgKGRoYW5kbGUsIHR5cGUsICZ2YXJhcmdzKSA9PSBOVUxMKQorCSAgICBzdHViID0gdHJ1ZTsKKworCSAgYXJndHlwZXMgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOworCSAgKnBwID0gcCArIDE7CisKKwkgIHN3aXRjaCAoKipwcCkKKwkgICAgeworCSAgICBjYXNlICcwJzoKKwkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICcxJzoKKwkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICArKypwcDsKKworCSAgY29uc3RwID0gZmFsc2U7CisJICB2b2xhdGlsZXAgPSBmYWxzZTsKKwkgIHN3aXRjaCAoKipwcCkKKwkgICAgeworCSAgICBjYXNlICdBJzoKKwkgICAgICAvKiBOb3JtYWwgZnVuY3Rpb24uICAqLworCSAgICAgICsrKnBwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdCJzoKKwkgICAgICAvKiBjb25zdCBtZW1iZXIgZnVuY3Rpb24uICAqLworCSAgICAgIGNvbnN0cCA9IHRydWU7CisJICAgICAgKysqcHA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ0MnOgorCSAgICAgIC8qIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbi4gICovCisJICAgICAgdm9sYXRpbGVwID0gdHJ1ZTsKKwkgICAgICArKypwcDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnRCc6CisJICAgICAgLyogY29uc3Qgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KKwkgICAgICBjb25zdHAgPSB0cnVlOworCSAgICAgIHZvbGF0aWxlcCA9IHRydWU7CisJICAgICAgKysqcHA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJyonOgorCSAgICBjYXNlICc/JzoKKwkgICAgY2FzZSAnLic6CisJICAgICAgLyogRmlsZSBjb21waWxlZCB3aXRoIGcrKyB2ZXJzaW9uIDE7IG5vIGluZm9ybWF0aW9uLiAgKi8KKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oImNvbnN0L3ZvbGF0aWxlIGluZGljYXRvciBtaXNzaW5nIikpOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIHN0YXRpY3AgPSBmYWxzZTsKKwkgIHN3aXRjaCAoKipwcCkKKwkgICAgeworCSAgICBjYXNlICcqJzoKKwkgICAgICAvKiB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiwgZm9sbG93ZWQgYnkgaW5kZXguICBUaGUgc2lnbgorCQkgYml0IGlzIHN1cHBvc2VkbHkgc2V0IHRvIGRpc3Rpbmd1aXNoCisJCSBwb2ludGVycy10by1tZXRob2RzIGZyb20gdmlydHVhbCBmdW5jdGlvbiBpbmRpY2llcy4gICovCisJICAgICAgKysqcHA7CisJICAgICAgdm9mZnNldCA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOworCSAgICAgIGlmICgqKnBwICE9ICc7JykKKwkJeworCQkgIGJhZF9zdGFiIChvcmlnKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICArKypwcDsKKwkgICAgICB2b2Zmc2V0ICY9IDB4N2ZmZmZmZmY7CisKKwkgICAgICBpZiAoKipwcCA9PSAnOycgfHwgKnBwID09ICdcMCcpCisJCXsKKwkJICAvKiBNdXN0IGJlIGcrKyB2ZXJzaW9uIDEuICAqLworCQkgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBGaWd1cmUgb3V0IGZyb20gd2hlbmNlIHRoaXMgdmlydHVhbCBmdW5jdGlvbgorCQkgICAgIGNhbWUuICBJdCBtYXkgYmVsb25nIHRvIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgb2YKKwkJICAgICBvbmUgb2YgaXRzIGJhc2VjbGFzc2VzLiAgKi8KKwkJICAgIGxvb2tfYWhlYWRfdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKKwkJCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJCQkJICAgICAgIHBwLAorCQkJCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKwkJICAgIGlmICgqKnBwID09ICc6JykKKwkJICAgICAgeworCQkJLyogZysrIHZlcnNpb24gMSBvdmVybG9hZGVkIG1ldGhvZHMuICAqLworCQkJY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICB7CisJCQljb250ZXh0ID0gbG9va19haGVhZF90eXBlOworCQkJbG9va19haGVhZF90eXBlID0gREVCVUdfVFlQRV9OVUxMOworCQkJaWYgKCoqcHAgIT0gJzsnKQorCQkJICB7CisJCQkgICAgYmFkX3N0YWIgKG9yaWcpOworCQkJICAgIHJldHVybiBmYWxzZTsKKwkJCSAgfQorCQkJKysqcHA7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnPyc6CisJICAgICAgLyogc3RhdGljIG1lbWJlciBmdW5jdGlvbi4gICovCisJICAgICAgKysqcHA7CisJICAgICAgc3RhdGljcCA9IHRydWU7CisJICAgICAgdm9mZnNldCA9IDA7CisJICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKKwkgICAgICBpZiAoc3RybmNtcCAoYXJndHlwZXMsIG5hbWUsIHN0cmxlbiAobmFtZSkpICE9IDApCisJCXN0dWIgPSB0cnVlOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgd2Fybl9zdGFiIChvcmlnLCAibWVtYmVyIGZ1bmN0aW9uIHR5cGUgbWlzc2luZyIpOworCSAgICAgIHZvZmZzZXQgPSAwOworCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnLic6CisJICAgICAgKysqcHA7CisJICAgICAgdm9mZnNldCA9IDA7CisJICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBJZiB0aGUgdHlwZSBpcyBub3QgYSBzdHViLCB0aGVuIHRoZSBhcmd0eXBlcyBzdHJpbmcgaXMKKyAgICAgICAgICAgICB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBPdGhlcndpc2UgdGhlCisgICAgICAgICAgICAgYXJndHlwZXMgc3RyaW5nIGlzIHRoZSBtYW5nbGVkIGZvcm0gb2YgdGhlIGFyZ3VtZW50CisgICAgICAgICAgICAgdHlwZXMsIGFuZCB0aGUgZnVsbCB0eXBlIGFuZCB0aGUgcGh5c2ljYWwgbmFtZSBtdXN0IGJlCisgICAgICAgICAgICAgZXh0cmFjdGVkIGZyb20gdGhlbS4gICovCisJICBpZiAoISBzdHViKQorCSAgICBwaHlzbmFtZSA9IGFyZ3R5cGVzOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZGVidWdfdHlwZSBjbGFzc190eXBlLCByZXR1cm5fdHlwZTsKKworCSAgICAgIGNsYXNzX3R5cGUgPSBzdGFiX2ZpbmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMpOworCSAgICAgIGlmIChjbGFzc190eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIHJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChkaGFuZGxlLCB0eXBlKTsKKwkgICAgICBpZiAocmV0dXJuX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCQl7CisJCSAgYmFkX3N0YWIgKG9yaWcpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBjbGFzc190eXBlLCBuYW1lLAorCQkJCQkgIHRhZ25hbWUsIHJldHVybl90eXBlLCBhcmd0eXBlcywKKwkJCQkJICBjb25zdHAsIHZvbGF0aWxlcCwgJnBoeXNuYW1lKTsKKwkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAoY3ZhcnMgKyAxID49IGFsbG9jdmFycykKKwkgICAgeworCSAgICAgIGFsbG9jdmFycyArPSAxMDsKKwkgICAgICB2YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKKwkJCSAgeHJlYWxsb2MgKChQVFIpIHZhcmlhbnRzLAorCQkJCSAgICBhbGxvY3ZhcnMgKiBzaXplb2YgKnZhcmlhbnRzKSk7CisJICAgIH0KKworCSAgaWYgKCEgc3RhdGljcCkKKwkgICAgdmFyaWFudHNbY3ZhcnNdID0gZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgcGh5c25hbWUsCisJCQkJCQkJIHR5cGUsIHZpc2liaWxpdHksCisJCQkJCQkJIGNvbnN0cCwgdm9sYXRpbGVwLAorCQkJCQkJCSB2b2Zmc2V0LCBjb250ZXh0KTsKKwkgIGVsc2UKKwkgICAgdmFyaWFudHNbY3ZhcnNdID0gZGVidWdfbWFrZV9zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsCisJCQkJCQkJCXBoeXNuYW1lLAorCQkJCQkJCQl0eXBlLAorCQkJCQkJCQl2aXNpYmlsaXR5LAorCQkJCQkJCQljb25zdHAsCisJCQkJCQkJCXZvbGF0aWxlcCk7CisJICBpZiAodmFyaWFudHNbY3ZhcnNdID09IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEwpCisJICAgIHJldHVybiBmYWxzZTsKKworCSAgKytjdmFyczsKKwl9CisgICAgICB3aGlsZSAoKipwcCAhPSAnOycgJiYgKipwcCAhPSAnXDAnKTsKKworICAgICAgdmFyaWFudHNbY3ZhcnNdID0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTDsKKworICAgICAgaWYgKCoqcHAgIT0gJ1wwJykKKwkrKypwcDsKKworICAgICAgaWYgKGMgKyAxID49IGFsbG9jKQorCXsKKwkgIGFsbG9jICs9IDEwOworCSAgbWV0aG9kcyA9ICgoZGVidWdfbWV0aG9kICopCisJCSAgICAgeHJlYWxsb2MgKChQVFIpIG1ldGhvZHMsIGFsbG9jICogc2l6ZW9mICptZXRob2RzKSk7CisJfQorCisgICAgICBtZXRob2RzW2NdID0gZGVidWdfbWFrZV9tZXRob2QgKGRoYW5kbGUsIG5hbWUsIHZhcmlhbnRzKTsKKworICAgICAgKytjOworICAgIH0KKworICBpZiAobWV0aG9kcyAhPSBOVUxMKQorICAgIG1ldGhvZHNbY10gPSBERUJVR19NRVRIT0RfTlVMTDsKKworICAqcmV0cCA9IG1ldGhvZHM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhcmd1bWVudCB0eXBlcyBmb3IgYSBtZXRob2QuICBTdGFicworICAgdHJpZXMgdG8gc2F2ZSBzcGFjZSBieSBwYWNraW5nIGFyZ3VtZW50IHR5cGVzIGludG8gYSBtYW5nbGVkCisgICBzdHJpbmcuICBUaGlzIHN0cmluZyBzaG91bGQgZ2l2ZSB1cyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZXh0cmFjdAorICAgYm90aCBhcmd1bWVudCB0eXBlcyBhbmQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCBnaXZlbgorICAgdGhlIHRhZyBuYW1lLiAgKi8KKworc3RhdGljIGRlYnVnX3R5cGUKK3BhcnNlX3N0YWJfYXJndHlwZXMgKGRoYW5kbGUsIGluZm8sIGNsYXNzX3R5cGUsIGZpZWxkbmFtZSwgdGFnbmFtZSwKKwkJICAgICByZXR1cm5fdHlwZSwgYXJndHlwZXMsIGNvbnN0cCwgdm9sYXRpbGVwLCBwcGh5c25hbWUpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGRlYnVnX3R5cGUgY2xhc3NfdHlwZTsKKyAgICAgY29uc3QgY2hhciAqZmllbGRuYW1lOworICAgICBjb25zdCBjaGFyICp0YWduYW1lOworICAgICBkZWJ1Z190eXBlIHJldHVybl90eXBlOworICAgICBjb25zdCBjaGFyICphcmd0eXBlczsKKyAgICAgYm9vbGVhbiBjb25zdHA7CisgICAgIGJvb2xlYW4gdm9sYXRpbGVwOworICAgICBjb25zdCBjaGFyICoqcHBoeXNuYW1lOworeworICBib29sZWFuIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3I7CisgIGJvb2xlYW4gaXNfY29uc3RydWN0b3I7CisgIGJvb2xlYW4gaXNfZGVzdHJ1Y3RvcjsKKyAgZGVidWdfdHlwZSAqYXJnczsKKyAgYm9vbGVhbiB2YXJhcmdzOworCisgIC8qIENvbnN0cnVjdG9ycyBhcmUgc29tZXRpbWVzIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KKyAgaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvciA9ICgoYXJndHlwZXNbMF0gPT0gJ18nCisJCQkJICAgJiYgYXJndHlwZXNbMV0gPT0gJ18nCisJCQkJICAgJiYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBhcmd0eXBlc1syXSkKKwkJCQkgICAgICAgfHwgYXJndHlwZXNbMl0gPT0gJ1EnCisJCQkJICAgICAgIHx8IGFyZ3R5cGVzWzJdID09ICd0JykpCisJCQkJICB8fCBzdHJuY21wIChhcmd0eXBlcywgIl9fY3QiLCA0KSA9PSAwKTsKKworICBpc19jb25zdHJ1Y3RvciA9IChpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yCisJCSAgICB8fCAodGFnbmFtZSAhPSBOVUxMCisJCQkmJiBzdHJjbXAgKGZpZWxkbmFtZSwgdGFnbmFtZSkgPT0gMCkpOworICBpc19kZXN0cnVjdG9yID0gKChhcmd0eXBlc1swXSA9PSAnXycKKwkJICAgICYmIChhcmd0eXBlc1sxXSA9PSAnJCcgfHwgYXJndHlwZXNbMV0gPT0gJy4nKQorCQkgICAgJiYgYXJndHlwZXNbMl0gPT0gJ18nKQorCQkgICB8fCBzdHJuY21wIChhcmd0eXBlcywgIl9fZHQiLCA0KSA9PSAwKTsKKworICBpZiAoaXNfZGVzdHJ1Y3RvciB8fCBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yKQorICAgICpwcGh5c25hbWUgPSBhcmd0eXBlczsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBsZW47CisgICAgICBjb25zdCBjaGFyICpjb25zdF9wcmVmaXg7CisgICAgICBjb25zdCBjaGFyICp2b2xhdGlsZV9wcmVmaXg7CisgICAgICBjaGFyIGJ1ZlsyMF07CisgICAgICB1bnNpZ25lZCBpbnQgbWFuZ2xlZF9uYW1lX2xlbjsKKyAgICAgIGNoYXIgKnBoeXNuYW1lOworCisgICAgICBsZW4gPSB0YWduYW1lID09IE5VTEwgPyAwIDogc3RybGVuICh0YWduYW1lKTsKKyAgICAgIGNvbnN0X3ByZWZpeCA9IGNvbnN0cCA/ICJDIiA6ICIiOworICAgICAgdm9sYXRpbGVfcHJlZml4ID0gdm9sYXRpbGVwID8gIlYiIDogIiI7CisKKyAgICAgIGlmIChsZW4gPT0gMCkKKwlzcHJpbnRmIChidWYsICJfXyVzJXMiLCBjb25zdF9wcmVmaXgsIHZvbGF0aWxlX3ByZWZpeCk7CisgICAgICBlbHNlIGlmICh0YWduYW1lICE9IE5VTEwgJiYgc3RyY2hyICh0YWduYW1lLCAnPCcpICE9IE5VTEwpCisJeworCSAgLyogVGVtcGxhdGUgbWV0aG9kcyBhcmUgZnVsbHkgbWFuZ2xlZC4gICovCisJICBzcHJpbnRmIChidWYsICJfXyVzJXMiLCBjb25zdF9wcmVmaXgsIHZvbGF0aWxlX3ByZWZpeCk7CisJICB0YWduYW1lID0gTlVMTDsKKwkgIGxlbiA9IDA7CisJfQorICAgICAgZWxzZQorCXNwcmludGYgKGJ1ZiwgIl9fJXMlcyVkIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgsIGxlbik7CisKKyAgICAgIG1hbmdsZWRfbmFtZV9sZW4gPSAoKGlzX2NvbnN0cnVjdG9yID8gMCA6IHN0cmxlbiAoZmllbGRuYW1lKSkKKwkJCSAgKyBzdHJsZW4gKGJ1ZikKKwkJCSAgKyBsZW4KKwkJCSAgKyBzdHJsZW4gKGFyZ3R5cGVzKQorCQkJICArIDEpOworCisgICAgICBpZiAoZmllbGRuYW1lWzBdID09ICdvJworCSAgJiYgZmllbGRuYW1lWzFdID09ICdwJworCSAgJiYgKGZpZWxkbmFtZVsyXSA9PSAnJCcgfHwgZmllbGRuYW1lWzJdID09ICcuJykpCisJeworCSAgY29uc3QgY2hhciAqb3BuYW1lOworCisJICBvcG5hbWUgPSBjcGx1c19tYW5nbGVfb3BuYW1lIChmaWVsZG5hbWUgKyAzLCAwKTsKKwkgIGlmIChvcG5hbWUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiTm8gbWFuZ2xpbmcgZm9yIFwiJXNcIlxuIiksIGZpZWxkbmFtZSk7CisJICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKwkgICAgfQorCSAgbWFuZ2xlZF9uYW1lX2xlbiArPSBzdHJsZW4gKG9wbmFtZSk7CisJICBwaHlzbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKG1hbmdsZWRfbmFtZV9sZW4pOworCSAgc3RybmNweSAocGh5c25hbWUsIGZpZWxkbmFtZSwgMyk7CisJICBzdHJjcHkgKHBoeXNuYW1lICsgMywgb3BuYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcGh5c25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChtYW5nbGVkX25hbWVfbGVuKTsKKwkgIGlmIChpc19jb25zdHJ1Y3RvcikKKwkgICAgcGh5c25hbWVbMF0gPSAnXDAnOworCSAgZWxzZQorCSAgICBzdHJjcHkgKHBoeXNuYW1lLCBmaWVsZG5hbWUpOworCX0KKworICAgICAgc3RyY2F0IChwaHlzbmFtZSwgYnVmKTsKKyAgICAgIGlmICh0YWduYW1lICE9IE5VTEwpCisJc3RyY2F0IChwaHlzbmFtZSwgdGFnbmFtZSk7CisgICAgICBzdHJjYXQgKHBoeXNuYW1lLCBhcmd0eXBlcyk7CisKKyAgICAgICpwcGh5c25hbWUgPSBwaHlzbmFtZTsKKyAgICB9CisKKyAgaWYgKCphcmd0eXBlcyA9PSAnXDAnIHx8IGlzX2Rlc3RydWN0b3IpCisgICAgeworICAgICAgYXJncyA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYXJncyk7CisgICAgICAqYXJncyA9IE5VTEw7CisgICAgICByZXR1cm4gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGNsYXNzX3R5cGUsIGFyZ3MsCisJCQkJICAgICBmYWxzZSk7CisgICAgfQorCisgIGFyZ3MgPSBzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCAqcHBoeXNuYW1lLCAmdmFyYXJncyk7CisgIGlmIChhcmdzID09IE5VTEwpCisgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKworICByZXR1cm4gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGNsYXNzX3R5cGUsIGFyZ3MsCisJCQkJIHZhcmFyZ3MpOworfQorCisvKiBUaGUgdGFpbCBlbmQgb2Ygc3RhYnMgZm9yIEMrKyBjbGFzc2VzIHRoYXQgY29udGFpbiBhIHZpcnR1YWwgZnVuY3Rpb24KKyAgIHBvaW50ZXIgY29udGFpbnMgYSB0aWxkZSwgYSAlLCBhbmQgYSB0eXBlIG51bWJlci4KKyAgIFRoZSB0eXBlIG51bWJlciByZWZlcnMgdG8gdGhlIGJhc2UgY2xhc3MgKHBvc3NpYmx5IHRoaXMgY2xhc3MgaXRzZWxmKSB3aGljaAorICAgY29udGFpbnMgdGhlIHZ0YWJsZSBwb2ludGVyIGZvciB0aGUgY3VycmVudCBjbGFzcy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIHBhcnNlZCBhbGwgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMsCisgICBzbyB3ZSBjYW4gbG9vayBmb3IgdGhlIHZwdHIgYmFzZSBjbGFzcyBpbmZvLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3BhcnNlX3N0YWJfdGlsZGVfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCB0eXBlbnVtcywgcmV0dnB0cmJhc2UsIHJldG93bnZwdHIpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKipwcDsKKyAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKKyAgICAgZGVidWdfdHlwZSAqcmV0dnB0cmJhc2U7CisgICAgIGJvb2xlYW4gKnJldG93bnZwdHI7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGNvbnN0IGNoYXIgKmhvbGQ7CisgIGludCB2dHlwZW51bXNbMl07CisKKyAgKnJldHZwdHJiYXNlID0gREVCVUdfVFlQRV9OVUxMOworICAqcmV0b3dudnB0ciA9IGZhbHNlOworCisgIG9yaWcgPSAqcHA7CisKKyAgLyogSWYgd2UgYXJlIHBvc2l0aW9uZWQgYXQgYSAnOycsIHRoZW4gc2tpcCBpdC4gKi8KKyAgaWYgKCoqcHAgPT0gJzsnKQorICAgICsrKnBwOworCisgIGlmICgqKnBwICE9ICd+JykKKyAgICByZXR1cm4gdHJ1ZTsKKworICArKypwcDsKKworICBpZiAoKipwcCA9PSAnPScgfHwgKipwcCA9PSAnKycgfHwgKipwcCA9PSAnLScpCisgICAgeworICAgICAgLyogT2Jzb2xldGUgZmxhZ3MgdGhhdCB1c2VkIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZgorCSBjb25zdHJ1Y3RvcnMgYW5kL29yIGRlc3RydWN0b3JzLiAqLworICAgICAgKysqcHA7CisgICAgfQorCisgIGlmICgqKnBwICE9ICclJykKKyAgICByZXR1cm4gdHJ1ZTsKKworICArKypwcDsKKworICBob2xkID0gKnBwOworCisgIC8qIFRoZSBuZXh0IG51bWJlciBpcyB0aGUgdHlwZSBudW1iZXIgb2YgdGhlIGJhc2UgY2xhc3MgKHBvc3NpYmx5CisgICAgIG91ciBvd24gY2xhc3MpIHdoaWNoIHN1cHBsaWVzIHRoZSB2dGFibGUgZm9yIHRoaXMgY2xhc3MuICAqLworICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgdnR5cGVudW1zKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHZ0eXBlbnVtc1swXSA9PSB0eXBlbnVtc1swXQorICAgICAgJiYgdnR5cGVudW1zWzFdID09IHR5cGVudW1zWzFdKQorICAgICpyZXRvd252cHRyID0gdHJ1ZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRlYnVnX3R5cGUgdnR5cGU7CisgICAgICBjb25zdCBjaGFyICpwOworCisgICAgICAqcHAgPSBob2xkOworCisgICAgICB2dHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworICAgICAgZm9yIChwID0gKnBwOyAqcCAhPSAnOycgJiYgKnAgIT0gJ1wwJzsgcCsrKQorCTsKKyAgICAgIGlmICgqcCAhPSAnOycpCisJeworCSAgYmFkX3N0YWIgKG9yaWcpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgKnJldHZwdHJiYXNlID0gdnR5cGU7CisKKyAgICAgICpwcCA9IHAgKyAxOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsgICAgCit9CisKKy8qIFJlYWQgYSBkZWZpbml0aW9uIG9mIGFuIGFycmF5IHR5cGUuICAqLworCitzdGF0aWMgZGVidWdfdHlwZQorcGFyc2Vfc3RhYl9hcnJheV90eXBlIChkaGFuZGxlLCBpbmZvLCBwcCwgc3RyaW5ncCkKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBib29sZWFuIHN0cmluZ3A7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGNvbnN0IGNoYXIgKnA7CisgIGludCB0eXBlbnVtc1syXTsKKyAgZGVidWdfdHlwZSBpbmRleF90eXBlOworICBib29sZWFuIGFkanVzdGFibGU7CisgIGJmZF9zaWduZWRfdm1hIGxvd2VyLCB1cHBlcjsKKyAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7CisKKyAgLyogRm9ybWF0IG9mIGFuIGFycmF5IHR5cGU6CisgICAgICJhcjxpbmRleCB0eXBlPjtsb3dlcjt1cHBlcjs8YXJyYXlfY29udGVudHNfdHlwZT4iLgorICAgICBPUzkwMDA6ICJhcmxvd2VyLHVwcGVyOzxhcnJheV9jb250ZW50c190eXBlPiIuCisKKyAgICAgRm9ydHJhbiBhZGp1c3RhYmxlIGFycmF5cyB1c2UgQWRpZ2l0cyBvciBUZGlnaXRzIGZvciBsb3dlciBvciB1cHBlcjsKKyAgICAgZm9yIHRoZXNlLCBwcm9kdWNlIGEgdHlwZSBsaWtlIGZsb2F0W11bXS4gICovCisKKyAgb3JpZyA9ICpwcDsKKworICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLworCisgIC8qIElmIHRoZSBpbmRleCB0eXBlIGlzIHR5cGUgMCwgd2UgdGFrZSBpdCBhcyBpbnQuICAqLworICBwID0gKnBwOworICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyICgmcCwgdHlwZW51bXMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHR5cGVudW1zWzBdID09IDAgJiYgdHlwZW51bXNbMV0gPT0gMCAmJiAqKnBwICE9ICc9JykKKyAgICB7CisgICAgICBpbmRleF90eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChkaGFuZGxlLCAiaW50Iik7CisgICAgICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJeworCSAgaW5kZXhfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKKwkgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgICpwcCA9IHA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5kZXhfdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCisJCQkJICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKKyAgICB9CisKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisgICAgfQorICArKypwcDsKKworICBhZGp1c3RhYmxlID0gZmFsc2U7CisKKyAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApICYmICoqcHAgIT0gJy0nKQorICAgIHsKKyAgICAgICsrKnBwOworICAgICAgYWRqdXN0YWJsZSA9IHRydWU7CisgICAgfQorCisgIGxvd2VyID0gKGJmZF9zaWduZWRfdm1hKSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKKyAgaWYgKCoqcHAgIT0gJzsnKQorICAgIHsKKyAgICAgIGJhZF9zdGFiIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICsrKnBwOworCisgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICctJykKKyAgICB7CisgICAgICArKypwcDsKKyAgICAgIGFkanVzdGFibGUgPSB0cnVlOworICAgIH0KKworICB1cHBlciA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7CisgIGlmICgqKnBwICE9ICc7JykKKyAgICB7CisgICAgICBiYWRfc3RhYiAob3JpZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICArKypwcDsKKworICBlbGVtZW50X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAorCQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOworICBpZiAoZWxlbWVudF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGFkanVzdGFibGUpCisgICAgeworICAgICAgbG93ZXIgPSAwOworICAgICAgdXBwZXIgPSAtMTsKKyAgICB9CisKKyAgcmV0dXJuIGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwgZWxlbWVudF90eXBlLCBpbmRleF90eXBlLCBsb3dlciwKKwkJCQl1cHBlciwgc3RyaW5ncCk7Cit9CisKKy8qIFRoaXMgc3RydWN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGZpbGVzIHdlIGhhdmUgc2VlbiB1c2luZworICAgTl9CSU5DTC4gICovCisKK3N0cnVjdCBiaW5jbF9maWxlCit7CisgIC8qIFRoZSBuZXh0IE5fQklOQ0wgZmlsZS4gICovCisgIHN0cnVjdCBiaW5jbF9maWxlICpuZXh0OworICAvKiBUaGUgbmV4dCBOX0JJTkNMIG9uIHRoZSBzdGFjay4gICovCisgIHN0cnVjdCBiaW5jbF9maWxlICpuZXh0X3N0YWNrOworICAvKiBUaGUgZmlsZSBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogVGhlIGhhc2ggdmFsdWUuICAqLworICBiZmRfdm1hIGhhc2g7CisgIC8qIFRoZSBmaWxlIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgaW50IGZpbGU7CisgIC8qIFRoZSBsaXN0IG9mIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KKyAgc3RydWN0IHN0YWJfdHlwZXMgKmZpbGVfdHlwZXM7Cit9OworCisvKiBTdGFydCBhIG5ldyBOX0JJTkNMIGZpbGUsIHB1c2hpbmcgaXQgb250byB0aGUgc3RhY2suICAqLworCitzdGF0aWMgdm9pZAorcHVzaF9iaW5jbCAoaW5mbywgbmFtZSwgaGFzaCkKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmRfdm1hIGhhc2g7Cit7CisgIHN0cnVjdCBiaW5jbF9maWxlICpuOworCisgIG4gPSAoc3RydWN0IGJpbmNsX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbi0+bmV4dCA9IGluZm8tPmJpbmNsX2xpc3Q7CisgIG4tPm5leHRfc3RhY2sgPSBpbmZvLT5iaW5jbF9zdGFjazsKKyAgbi0+bmFtZSA9IG5hbWU7CisgIG4tPmhhc2ggPSBoYXNoOworICBuLT5maWxlID0gaW5mby0+ZmlsZXM7CisgIG4tPmZpbGVfdHlwZXMgPSBOVUxMOworICBpbmZvLT5iaW5jbF9saXN0ID0gbjsKKyAgaW5mby0+YmluY2xfc3RhY2sgPSBuOworCisgICsraW5mby0+ZmlsZXM7CisgIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQorCQkgICAgICB4cmVhbGxvYyAoKFBUUikgaW5mby0+ZmlsZV90eXBlcywKKwkJCQkoaW5mby0+ZmlsZXMKKwkJCQkgKiBzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKSk7CisgIGluZm8tPmZpbGVfdHlwZXNbbi0+ZmlsZV0gPSBOVUxMOworfQorCisvKiBGaW5pc2ggYW4gTl9CSU5DTCBmaWxlLCBhdCBhbiBOX0VJTkNMLCBwb3BwaW5nIHRoZSBuYW1lIG9mZiB0aGUKKyAgIHN0YWNrLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcG9wX2JpbmNsIChpbmZvKQorICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Cit7CisgIHN0cnVjdCBiaW5jbF9maWxlICpvOworCisgIG8gPSBpbmZvLT5iaW5jbF9zdGFjazsKKyAgaWYgKG8gPT0gTlVMTCkKKyAgICByZXR1cm4gaW5mby0+bWFpbl9maWxlbmFtZTsKKyAgaW5mby0+YmluY2xfc3RhY2sgPSBvLT5uZXh0X3N0YWNrOworCisgIG8tPmZpbGVfdHlwZXMgPSBpbmZvLT5maWxlX3R5cGVzW28tPmZpbGVdOworCisgIGlmIChpbmZvLT5iaW5jbF9zdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBpbmZvLT5tYWluX2ZpbGVuYW1lOworICByZXR1cm4gaW5mby0+YmluY2xfc3RhY2stPm5hbWU7Cit9CisKKy8qIEhhbmRsZSBhbiBOX0VYQ0w6IGdldCB0aGUgdHlwZXMgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBOX0JJTkNMLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2ZpbmRfZXhjbCAoaW5mbywgbmFtZSwgaGFzaCkKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmRfdm1hIGhhc2g7Cit7CisgIHN0cnVjdCBiaW5jbF9maWxlICpsOworCisgICsraW5mby0+ZmlsZXM7CisgIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQorCQkgICAgICB4cmVhbGxvYyAoKFBUUikgaW5mby0+ZmlsZV90eXBlcywKKwkJCQkoaW5mby0+ZmlsZXMKKwkJCQkgKiBzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKSk7CisKKyAgZm9yIChsID0gaW5mby0+YmluY2xfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICBpZiAobC0+aGFzaCA9PSBoYXNoICYmIHN0cmNtcCAobC0+bmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgIGJyZWFrOworICBpZiAobCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdhcm5fc3RhYiAobmFtZSwgXygiVW5kZWZpbmVkIE5fRVhDTCIpKTsKKyAgICAgIGluZm8tPmZpbGVfdHlwZXNbaW5mby0+ZmlsZXMgLSAxXSA9IE5VTEw7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaW5mby0+ZmlsZV90eXBlc1tpbmZvLT5maWxlcyAtIDFdID0gbC0+ZmlsZV90eXBlczsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSGFuZGxlIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4gIGdjYyBlbWl0cyB2YXJpYWJsZSBkZWZpbml0aW9ucyBmb3IgYQorICAgYmxvY2sgYmVmb3JlIHRoZSBOX0xCUkFDLCBzbyB3ZSBtdXN0IGhvbGQgb250byB0aGVtIHVudGlsIHdlIHNlZQorICAgaXQuICBUaGUgU3VuUFJPIGNvbXBpbGVyIGVtaXRzIHZhcmlhYmxlIGRlZmluaXRpb25zIGFmdGVyIHRoZQorICAgTl9MQlJBQywgc28gd2UgY2FuIGNhbGwgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIGltbWVkaWF0ZWx5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGRlYnVnX3R5cGUgdHlwZTsKKyAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKnY7CisKKyAgaWYgKChraW5kID09IERFQlVHX0dMT0JBTCB8fCBraW5kID09IERFQlVHX1NUQVRJQykKKyAgICAgIHx8ICEgaW5mby0+d2l0aGluX2Z1bmN0aW9uCisgICAgICB8fCAoaW5mby0+Z2NjX2NvbXBpbGVkID09IDAgJiYgaW5mby0+bl9vcHRfZm91bmQpKQorICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGtpbmQsIHZhbCk7CisKKyAgdiA9IChzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqKSB4bWFsbG9jIChzaXplb2YgKnYpOworICBtZW1zZXQgKHYsIDAsIHNpemVvZiAqdik7CisKKyAgdi0+bmV4dCA9IGluZm8tPnBlbmRpbmc7CisgIHYtPm5hbWUgPSBuYW1lOworICB2LT50eXBlID0gdHlwZTsKKyAgdi0+a2luZCA9IGtpbmQ7CisgIHYtPnZhbCA9IHZhbDsKKyAgaW5mby0+cGVuZGluZyA9IHY7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEVtaXQgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIHNlZSB0aGUKKyAgIE5fTEJSQUMgdGhhdCBzdGFydHMgdGhlIGJsb2NrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Cit7CisgIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICp2OworCisgIHYgPSBpbmZvLT5wZW5kaW5nOworICB3aGlsZSAodiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICpuZXh0OworCisgICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIHYtPm5hbWUsIHYtPnR5cGUsIHYtPmtpbmQsIHYtPnZhbCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBuZXh0ID0gdi0+bmV4dDsKKyAgICAgIGZyZWUgKHYpOworICAgICAgdiA9IG5leHQ7CisgICAgfQorCisgIGluZm8tPnBlbmRpbmcgPSBOVUxMOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBGaW5kIHRoZSBzbG90IGZvciBhIHR5cGUgaW4gdGhlIGRhdGFiYXNlLiAgKi8KKworc3RhdGljIGRlYnVnX3R5cGUgKgorc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKQorICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGludCAqdHlwZW51bXM7Cit7CisgIGludCBmaWxlbnVtOworICBpbnQgaW5kZXg7CisgIHN0cnVjdCBzdGFiX3R5cGVzICoqcHM7CisKKyAgZmlsZW51bSA9IHR5cGVudW1zWzBdOworICBpbmRleCA9IHR5cGVudW1zWzFdOworCisgIGlmIChmaWxlbnVtIDwgMCB8fCAodW5zaWduZWQgaW50KSBmaWxlbnVtID49IGluZm8tPmZpbGVzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVHlwZSBmaWxlIG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIpLCBmaWxlbnVtKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgaWYgKGluZGV4IDwgMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlR5cGUgaW5kZXggbnVtYmVyICVkIG91dCBvZiByYW5nZVxuIiksIGluZGV4KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBwcyA9IGluZm8tPmZpbGVfdHlwZXMgKyBmaWxlbnVtOworCisgIHdoaWxlIChpbmRleCA+PSBTVEFCX1RZUEVTX1NMT1RTKQorICAgIHsKKyAgICAgIGlmICgqcHMgPT0gTlVMTCkKKwl7CisJICAqcHMgPSAoc3RydWN0IHN0YWJfdHlwZXMgKikgeG1hbGxvYyAoc2l6ZW9mICoqcHMpOworCSAgbWVtc2V0ICgqcHMsIDAsIHNpemVvZiAqKnBzKTsKKwl9CisgICAgICBwcyA9ICYoKnBzKS0+bmV4dDsKKyAgICAgIGluZGV4IC09IFNUQUJfVFlQRVNfU0xPVFM7CisgICAgfQorICBpZiAoKnBzID09IE5VTEwpCisgICAgeworICAgICAgKnBzID0gKHN0cnVjdCBzdGFiX3R5cGVzICopIHhtYWxsb2MgKHNpemVvZiAqKnBzKTsKKyAgICAgIG1lbXNldCAoKnBzLCAwLCBzaXplb2YgKipwcyk7CisgICAgfQorCisgIHJldHVybiAoKnBzKS0+dHlwZXMgKyBpbmRleDsKK30KKworLyogRmluZCBhIHR5cGUgZ2l2ZW4gYSB0eXBlIG51bWJlci4gIElmIHRoZSB0eXBlIGhhcyBub3QgYmVlbgorICAgYWxsb2NhdGVkIHlldCwgY3JlYXRlIGFuIGluZGlyZWN0IHR5cGUuICAqLworCitzdGF0aWMgZGVidWdfdHlwZQorc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKQorICAgICBQVFIgZGhhbmRsZTsKKyAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAgICBjb25zdCBpbnQgKnR5cGVudW1zOworeworICBkZWJ1Z190eXBlICpzbG90OworCisgIGlmICh0eXBlbnVtc1swXSA9PSAwICYmIHR5cGVudW1zWzFdIDwgMCkKKyAgICB7CisgICAgICAvKiBBIG5lZ2F0aXZlIHR5cGUgbnVtYmVyIGluZGljYXRlcyBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLworICAgICAgcmV0dXJuIHN0YWJfeGNvZmZfYnVpbHRpbl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtc1sxXSk7CisgICAgfQorCisgIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOworICBpZiAoc2xvdCA9PSBOVUxMKQorICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7CisKKyAgaWYgKCpzbG90ID09IERFQlVHX1RZUEVfTlVMTCkKKyAgICByZXR1cm4gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBzbG90LCAoY29uc3QgY2hhciAqKSBOVUxMKTsKKworICByZXR1cm4gKnNsb3Q7Cit9CisKKy8qIFJlY29yZCB0aGF0IGEgZ2l2ZW4gdHlwZSBudW1iZXIgcmVmZXJzIHRvIGEgZ2l2ZW4gdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3JlY29yZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcywgdHlwZSkKKyAgICAgUFRSIGRoYW5kbGU7CisgICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKKyAgICAgZGVidWdfdHlwZSB0eXBlOworeworICBkZWJ1Z190eXBlICpzbG90OworCisgIHNsb3QgPSBzdGFiX2ZpbmRfc2xvdCAoaW5mbywgdHlwZW51bXMpOworICBpZiAoc2xvdCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBnZGIgYXBwZWFycyB0byBpZ25vcmUgdHlwZSByZWRlZmluaXRpb25zLCBzbyB3ZSBkbyBhcyB3ZWxsLiAgKi8KKworICAqc2xvdCA9IHR5cGU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJldHVybiBhbiBYQ09GRiBidWlsdGluIHR5cGUuICAqLworCitzdGF0aWMgZGVidWdfdHlwZQorc3RhYl94Y29mZl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW0pCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGludCB0eXBlbnVtOworeworICBkZWJ1Z190eXBlIHJldHR5cGU7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgaWYgKHR5cGVudW0gPj0gMCB8fCB0eXBlbnVtIDwgLVhDT0ZGX1RZUEVfQ09VTlQpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgWENPRkYgdHlwZSAlZFxuIiksIHR5cGVudW0pOworICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKKyAgICB9CisgIGlmIChpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV0gIT0gTlVMTCkKKyAgICByZXR1cm4gaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dOworCisgIHN3aXRjaCAoLXR5cGVudW0pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIC8qIFRoZSBzaXplIG9mIHRoaXMgYW5kIGFsbCB0aGUgb3RoZXIgdHlwZXMgYXJlIGZpeGVkLCBkZWZpbmVkCisJIGJ5IHRoZSBkZWJ1Z2dpbmcgZm9ybWF0LiAgKi8KKyAgICAgIG5hbWUgPSAiaW50IjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBuYW1lID0gImNoYXIiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG5hbWUgPSAic2hvcnQiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIG5hbWUgPSAibG9uZyI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIG5hbWUgPSAic2lnbmVkIGNoYXIiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBpbnQiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgbmFtZSA9ICJ1bnNpZ25lZCI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7CisgICAgY2FzZSAxMDoKKyAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgbmFtZSA9ICJ2b2lkIjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgLyogSUVFRSBzaW5nbGUgcHJlY2lzaW9uICgzMiBiaXQpLiAgKi8KKyAgICAgIG5hbWUgPSAiZmxvYXQiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgLyogSUVFRSBkb3VibGUgcHJlY2lzaW9uICg2NCBiaXQpLiAgKi8KKyAgICAgIG5hbWUgPSAiZG91YmxlIjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNDoKKyAgICAgIC8qIFRoaXMgaXMgYW4gSUVFRSBkb3VibGUgb24gdGhlIFJTLzYwMDAsIGFuZCBkaWZmZXJlbnQgbWFjaGluZXMKKwkgd2l0aCBkaWZmZXJlbnQgc2l6ZXMgZm9yICJsb25nIGRvdWJsZSIgc2hvdWxkIHVzZSBkaWZmZXJlbnQKKwkgbmVnYXRpdmUgdHlwZSBudW1iZXJzLiAgU2VlIHN0YWJzLnRleGluZm8uICAqLworICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICBuYW1lID0gImludGVnZXIiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBuYW1lID0gImJvb2xlYW4iOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTc6CisgICAgICBuYW1lID0gInNob3J0IHJlYWwiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgbmFtZSA9ICJyZWFsIjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOToKKyAgICAgIC8qIEZJWE1FICovCisgICAgICBuYW1lID0gInN0cmluZ3B0ciI7CisgICAgICByZXR0eXBlID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgICAvKiBGSVhNRSAqLworICAgICAgbmFtZSA9ICJjaGFyYWN0ZXIiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMToKKyAgICAgIG5hbWUgPSAibG9naWNhbCoxIjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIyOgorICAgICAgbmFtZSA9ICJsb2dpY2FsKjIiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjM6CisgICAgICBuYW1lID0gImxvZ2ljYWwqNCI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIG5hbWUgPSAibG9naWNhbCI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIHNpbmdsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KKyAgICAgIG5hbWUgPSAiY29tcGxleCI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGRoYW5kbGUsIDgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNjoKKyAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KKyAgICAgIG5hbWUgPSAiZG91YmxlIGNvbXBsZXgiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCAxNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI3OgorICAgICAgbmFtZSA9ICJpbnRlZ2VyKjEiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjg6CisgICAgICBuYW1lID0gImludGVnZXIqMiI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgIG5hbWUgPSAiaW50ZWdlcio0IjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMwOgorICAgICAgLyogRklYTUUgKi8KKyAgICAgIG5hbWUgPSAid2NoYXIiOworICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzE6CisgICAgICBuYW1lID0gImxvbmcgbG9uZyI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyBsb25nIjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzM6CisgICAgICBuYW1lID0gImxvZ2ljYWwqOCI7CisgICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzNDoKKyAgICAgIG5hbWUgPSAiaW50ZWdlcio4IjsKKyAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHJldHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHJldHR5cGUpOworCisgIGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXSA9IHJldHR5cGU7CisKKyAgcmV0dXJuIHJldHR5cGU7Cit9CisKKy8qIEZpbmQgb3IgY3JlYXRlIGEgdGFnZ2VkIHR5cGUuICAqLworCitzdGF0aWMgZGVidWdfdHlwZQorc3RhYl9maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBpbmZvLCBwLCBsZW4sIGtpbmQpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgIGludCBsZW47CisgICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Cit7CisgIGNoYXIgKm5hbWU7CisgIGRlYnVnX3R5cGUgZHR5cGU7CisgIHN0cnVjdCBzdGFiX3RhZyAqc3Q7CisKKyAgbmFtZSA9IHNhdmVzdHJpbmcgKHAsIGxlbik7CisKKyAgLyogV2UgcGFzcyBERUJVR19LSU5EX0lMTEVHQUwgYmVjYXVzZSB3ZSB3YW50IGFsbCB0YWdzIGluIHRoZSBzYW1lCisgICAgIG5hbWVzcGFjZS4gIFRoaXMgaXMgcmlnaHQgZm9yIEMsIGFuZCBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZQorICAgICBvdGhlciBsYW5ndWFnZXMuICBGSVhNRS4gICovCisgIGR0eXBlID0gZGVidWdfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgbmFtZSwgREVCVUdfS0lORF9JTExFR0FMKTsKKyAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChuYW1lKTsKKyAgICAgIHJldHVybiBkdHlwZTsKKyAgICB9CisKKyAgLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBlbnRyeSBvbiB0aGUgdW5kZWZpbmVkIHRhZyBsaXN0LiAgKi8KKyAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCisgICAgeworICAgICAgaWYgKHN0LT5uYW1lWzBdID09IG5hbWVbMF0KKwkgICYmIHN0cmNtcCAoc3QtPm5hbWUsIG5hbWUpID09IDApCisJeworCSAgaWYgKHN0LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKKwkgICAgc3QtPmtpbmQgPSBraW5kOworCSAgZnJlZSAobmFtZSk7CisJICBicmVhazsKKwl9CisgICAgfQorICBpZiAoc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdCA9IChzdHJ1Y3Qgc3RhYl90YWcgKikgeG1hbGxvYyAoc2l6ZW9mICpzdCk7CisgICAgICBtZW1zZXQgKHN0LCAwLCBzaXplb2YgKnN0KTsKKworICAgICAgc3QtPm5leHQgPSBpbmZvLT50YWdzOworICAgICAgc3QtPm5hbWUgPSBuYW1lOworICAgICAgc3QtPmtpbmQgPSBraW5kOworICAgICAgc3QtPnNsb3QgPSBERUJVR19UWVBFX05VTEw7CisgICAgICBzdC0+dHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgJnN0LT5zbG90LCBuYW1lKTsKKyAgICAgIGluZm8tPnRhZ3MgPSBzdDsKKyAgICB9CisKKyAgcmV0dXJuIHN0LT50eXBlOworfQorDAorLyogSW4gb3JkZXIgdG8gZ2V0IHRoZSBjb3JyZWN0IGFyZ3VtZW50IHR5cGVzIGZvciBhIHN0dWJiZWQgbWV0aG9kLCB3ZQorICAgbmVlZCB0byBleHRyYWN0IHRoZSBhcmd1bWVudCB0eXBlcyBmcm9tIGEgQysrIG1hbmdsZWQgc3RyaW5nLgorICAgU2luY2UgdGhlIGFyZ3VtZW50IHR5cGVzIGNhbiByZWZlciBiYWNrIHRvIHRoZSByZXR1cm4gdHlwZSwgdGhpcworICAgbWVhbnMgdGhhdCB3ZSBtdXN0IGRlbWFuZ2xlIHRoZSBlbnRpcmUgcGh5c2ljYWwgbmFtZS4gIEluIGdkYiB0aGlzCisgICBpcyBkb25lIGJ5IGNhbGxpbmcgY3BsdXNfZGVtYW5nbGUgYW5kIHJ1bm5pbmcgdGhlIHJlc3VsdHMgYmFjaworICAgdGhyb3VnaCB0aGUgQysrIGV4cHJlc3Npb24gcGFyc2VyLiAgU2luY2Ugd2UgaGF2ZSBubyBleHByZXNzaW9uCisgICBwYXJzZXIsIHdlIG11c3QgZHVwbGljYXRlIG11Y2ggb2YgdGhlIHdvcmsgb2YgY3BsdXNfZGVtYW5nbGUgaGVyZS4KKworICAgV2UgYXNzdW1lIHRoYXQgR05VIHN0eWxlIGRlbWFuZ2xpbmcgaXMgdXNlZCwgc2luY2UgdGhpcyBpcyBvbmx5CisgICBkb25lIGZvciBtZXRob2Qgc3R1YnMsIGFuZCBvbmx5IGcrKyBzaG91bGQgb3V0cHV0IHRoYXQgZm9ybSBvZgorICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgcG9pbnRlciB0byB0eXBlIGluZm9ybWF0aW9uIHdoaWNoCisgICBkZW1hbmdsaW5nIGEgc3RyaW5nLiAgKi8KKworc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZworeworICAvKiBUaGUgc3RhcnQgb2YgdGhlIHR5cGUuICBUaGlzIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQuICAqLworICBjb25zdCBjaGFyICp0eXBlc3RyaW5nOworICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSB0eXBlLiAgKi8KKyAgdW5zaWduZWQgaW50IGxlbjsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiB3aGlsZSBkZW1hbmdsaW5nIGEKKyAgIHN0cmluZy4gICovCisKK3N0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8KK3sKKyAgLyogVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYW5kbGUuICAqLworICBQVFIgZGhhbmRsZTsKKyAgLyogVGhlIHN0YWIgaW5mb3JtYXRpb24gaGFuZGxlLiAgKi8KKyAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOworICAvKiBUaGUgYXJyYXkgb2YgYXJndW1lbnRzIHdlIGFyZSBidWlsZGluZy4gICovCisgIGRlYnVnX3R5cGUgKmFyZ3M7CisgIC8qIFdoZXRoZXIgdGhlIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBib29sZWFuIHZhcmFyZ3M7CisgIC8qIFRoZSBhcnJheSBvZiB0eXBlcyB3ZSBoYXZlIHJlbWVtYmVyZWQuICAqLworICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICp0eXBlc3RyaW5nczsKKyAgLyogVGhlIG51bWJlciBvZiB0eXBlc3RyaW5ncy4gICovCisgIHVuc2lnbmVkIGludCB0eXBlc3RyaW5nX2NvdW50OworICAvKiBUaGUgbnVtYmVyIG9mIHR5cGVzdHJpbmcgc2xvdHMgd2UgaGF2ZSBhbGxvY2F0ZWQuICAqLworICB1bnNpZ25lZCBpbnQgdHlwZXN0cmluZ19hbGxvYzsKK307CisKK3N0YXRpYyB2b2lkIHN0YWJfYmFkX2RlbWFuZ2xlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIHVuc2lnbmVkIGludCBzdGFiX2RlbWFuZ2xlX2NvdW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50CisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3ByZWZpeAorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZQorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUKKyAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZAorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZQorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGNoYXIgKiopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfY2xhc3MKKyAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2FyZ3MKKyAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAorCSAgIGJvb2xlYW4gKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9hcmcKKyAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICoqLAorCSAgIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZQorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKworLyogV2FybiBhYm91dCBhIGJhZCBkZW1hbmdsaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK3N0YWJfYmFkX2RlbWFuZ2xlIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBmcHJpbnRmIChzdGRlcnIsIF8oImJhZCBtYW5nbGVkIG5hbWUgYCVzJ1xuIiksIHMpOworfQorCisvKiBHZXQgYSBjb3VudCBmcm9tIGEgc3RhYiBzdHJpbmcuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCkKKyAgICAgY29uc3QgY2hhciAqKnBwOworeworICB1bnNpZ25lZCBpbnQgY291bnQ7CisKKyAgY291bnQgPSAwOworICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQorICAgIHsKKyAgICAgIGNvdW50ICo9IDEwOworICAgICAgY291bnQgKz0gKipwcCAtICcwJzsKKyAgICAgICsrKnBwOworICAgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCisvKiBSZXF1aXJlIGEgY291bnQgaW4gYSBzdHJpbmcuICBUaGUgY291bnQgbWF5IGJlIG11bHRpcGxlIGRpZ2l0cywgaW4KKyAgIHdoaWNoIGNhc2UgaXQgbXVzdCBlbmQgaW4gYW4gdW5kZXJzY29yZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsIHBpKQorICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIHVuc2lnbmVkIGludCAqcGk7Cit7CisgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKnBpID0gKipwcCAtICcwJzsKKyAgKysqcHA7CisgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGNvdW50OworICAgICAgY29uc3QgY2hhciAqcDsKKworICAgICAgY291bnQgPSAqcGk7CisgICAgICBwID0gKnBwOworICAgICAgZG8KKwl7CisJICBjb3VudCAqPSAxMDsKKwkgIGNvdW50ICs9ICpwIC0gJzAnOworCSAgKytwOworCX0KKyAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKTsKKyAgICAgIGlmICgqcCA9PSAnXycpCisJeworCSAgKnBwID0gcCArIDE7CisJICAqcGkgPSBjb3VudDsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRlbWFuZ2xlcyBhIHBoeXNpY2FsIG5hbWUsIHJldHVybmluZyBhIE5VTEwKKyAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMuICAqLworCitzdGF0aWMgZGVidWdfdHlwZSAqCitzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBwaHlzbmFtZSwgcHZhcmFyZ3MpCisgICAgIFBUUiBkaGFuZGxlOworICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87CisgICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOworICAgICBib29sZWFuICpwdmFyYXJnczsKK3sKKyAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyBtaW5mbzsKKworICBtaW5mby5kaGFuZGxlID0gZGhhbmRsZTsKKyAgbWluZm8uaW5mbyA9IGluZm87CisgIG1pbmZvLmFyZ3MgPSBOVUxMOworICBtaW5mby52YXJhcmdzID0gZmFsc2U7CisgIG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MgPSAxMDsKKyAgbWluZm8udHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKKwkJICAgICAgIHhtYWxsb2MgKG1pbmZvLnR5cGVzdHJpbmdfYWxsb2MKKwkJCQkqIHNpemVvZiAqbWluZm8udHlwZXN0cmluZ3MpKTsKKyAgbWluZm8udHlwZXN0cmluZ19jb3VudCA9IDA7CisKKyAgLyogY3BsdXNfZGVtYW5nbGUgY2hlY2tzIGZvciBzcGVjaWFsIEdOVSBtYW5nbGVkIGZvcm1zLCBidXQgd2UgY2FuJ3QKKyAgICAgc2VlIGFueSBvZiB0aGVtIGluIG1hbmdsZWQgbWV0aG9kIGFyZ3VtZW50IHR5cGVzLiAgKi8KKworICBpZiAoISBzdGFiX2RlbWFuZ2xlX3ByZWZpeCAoJm1pbmZvLCAmcGh5c25hbWUpKQorICAgIGdvdG8gZXJyb3JfcmV0dXJuOworCisgIGlmICgqcGh5c25hbWUgIT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZSAoJm1pbmZvLCAmcGh5c25hbWUpKQorCWdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBmcmVlIChtaW5mby50eXBlc3RyaW5ncyk7CisgIG1pbmZvLnR5cGVzdHJpbmdzID0gTlVMTDsKKworICBpZiAobWluZm8uYXJncyA9PSBOVUxMKQorICAgIGZwcmludGYgKHN0ZGVyciwgXygibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIpKTsKKworICAqcHZhcmFyZ3MgPSBtaW5mby52YXJhcmdzOworICByZXR1cm4gbWluZm8uYXJnczsKKworIGVycm9yX3JldHVybjoKKyAgaWYgKG1pbmZvLnR5cGVzdHJpbmdzICE9IE5VTEwpCisgICAgZnJlZSAobWluZm8udHlwZXN0cmluZ3MpOworICByZXR1cm4gTlVMTDsKK30KKworLyogRGVtYW5nbGUgdGhlIHByZWZpeCBvZiB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZGVtYW5nbGVfcHJlZml4IChtaW5mbywgcHApCisgICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOworICAgICBjb25zdCBjaGFyICoqcHA7Cit7CisgIGNvbnN0IGNoYXIgKnNjYW47CisgIHVuc2lnbmVkIGludCBpOworCisgIC8qIGNwbHVzX2RlbWFuZ2xlIGNoZWNrcyBmb3IgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCisgICAgIGJ1dCB3ZSBjYW4ndCBzZWUgdGhlbSBpbiBtYW5nbGVkIGFyZ3VtZW50IHR5cGVzLiAgKi8KKworICAvKiBMb29rIGZvciBgX18nLiAgKi8KKyAgc2NhbiA9ICpwcDsKKyAgZG8KKyAgICB7CisgICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOworICAgIH0KKyAgd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7CisKKyAgaWYgKHNjYW4gPT0gTlVMTCkKKyAgICB7CisgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLS1zY2FuOworCisgIC8qIFdlIGZvdW5kIGBfXyc7IG1vdmUgYWhlYWQgdG8gdGhlIGxhc3QgY29udGlndW91cyBgX18nIHBhaXIuICAqLworICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOworICBpZiAoaSA+IDIpCisgICAgc2NhbiArPSBpIC0gMjsKKworICBpZiAoc2NhbiA9PSAqcHAKKyAgICAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc2NhblsyXSkKKwkgIHx8IHNjYW5bMl0gPT0gJ1EnCisJICB8fCBzY2FuWzJdID09ICd0JykpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIEdOVSBzdHlsZSBjb25zdHJ1Y3RvciBuYW1lLiAgKi8KKyAgICAgICpwcCA9IHNjYW4gKyAyOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlIGlmIChzY2FuID09ICpwcAorCSAgICYmICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNjYW5bMl0pCisJICAgJiYgc2NhblsyXSAhPSAndCcpCisgICAgeworICAgICAgLyogTG9vayBmb3IgdGhlIGBfXycgdGhhdCBzZXBhcmF0ZXMgdGhlIHByZWZpeCBmcm9tIHRoZQorICAgICAgICAgc2lnbmF0dXJlLiAgKi8KKyAgICAgIHdoaWxlICgqc2NhbiA9PSAnXycpCisJKytzY2FuOworICAgICAgc2NhbiA9IHN0cnN0ciAoc2NhbiwgIl9fIik7CisgICAgICBpZiAoc2NhbiA9PSBOVUxMIHx8IHNjYW5bMl0gPT0gJ1wwJykKKwl7CisJICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHJldHVybiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2Nhbik7CisgICAgfQorICBlbHNlIGlmIChzY2FuWzJdICE9ICdcMCcpCisgICAgeworICAgICAgLyogVGhlIG5hbWUgZG9lc24ndCBzdGFydCB3aXRoIGBfXycsIGJ1dCBpdCBkb2VzIGNvbnRhaW4gYF9fJy4gICovCisgICAgICByZXR1cm4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlICgqcHApOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgLypOT1RSRUFDSEVEKi8KK30KKworLyogRGVtYW5nbGUgYSBmdW5jdGlvbiBuYW1lIHByZWZpeC4gIFRoZSBzY2FuIGFyZ3VtZW50IHBvaW50cyB0byB0aGUKKyAgIGRvdWJsZSB1bmRlcnNjb3JlIHdoaWNoIHNlcGFyYXRlcyB0aGUgZnVuY3Rpb24gbmFtZSBmcm9tIHRoZQorICAgc2lnbmF0dXJlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKQorICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBjb25zdCBjaGFyICpzY2FuOworeworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBzdHJpbmcgZnJvbSAqcHAgdG8gc2NhbiBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBXZQorICAgICBkb24ndCBjYXJlIGFib3V0IHRoZSBuYW1lLCBzaW5jZSB3ZSBqdXN0IGxvb2tpbmcgZm9yIGFyZ3VtZW50CisgICAgIHR5cGVzLiAgSG93ZXZlciwgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCB0aGUgbmFtZSBtYXkgaW5jbHVkZSBhCisgICAgIHR5cGUgd2hpY2ggd2UgbXVzdCByZW1lbWJlciBpbiBvcmRlciB0byBoYW5kbGUgYmFja3JlZmVyZW5jZXMuICAqLworCisgIG5hbWUgPSAqcHA7CisgICpwcCA9IHNjYW4gKyAyOworCisgIGlmICgqcHAgLSBuYW1lID49IDUKKwkgICAmJiBzdHJuY21wIChuYW1lLCAidHlwZSIsIDQpID09IDAKKwkgICAmJiAobmFtZVs0XSA9PSAnJCcgfHwgbmFtZVs0XSA9PSAnLicpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnRlbTsKKworICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCisgICAgICB0ZW0gPSBuYW1lICsgNTsKKyAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ18nCisJICAgJiYgbmFtZVsxXSA9PSAnXycKKwkgICAmJiBuYW1lWzJdID09ICdvJworCSAgICYmIG5hbWVbM10gPT0gJ3AnKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnRlbTsKKworICAgICAgLyogVGhpcyBpcyBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCisgICAgICB0ZW0gPSBuYW1lICsgNDsKKyAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZ0ZW0sIChkZWJ1Z190eXBlICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERlbWFuZ2xlIHRoZSBzaWduYXR1cmUuICBUaGlzIGlzIHdoZXJlIHRoZSBhcmd1bWVudCB0eXBlcyBhcmUKKyAgIGZvdW5kLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZGVtYW5nbGVfc2lnbmF0dXJlIChtaW5mbywgcHApCisgICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOworICAgICBjb25zdCBjaGFyICoqcHA7Cit7CisgIGNvbnN0IGNoYXIgKm9yaWc7CisgIGJvb2xlYW4gZXhwZWN0X2Z1bmMsIGZ1bmNfZG9uZTsKKyAgY29uc3QgY2hhciAqaG9sZDsKKworICBvcmlnID0gKnBwOworCisgIGV4cGVjdF9mdW5jID0gZmFsc2U7CisgIGZ1bmNfZG9uZSA9IGZhbHNlOworICBob2xkID0gTlVMTDsKKworICB3aGlsZSAoKipwcCAhPSAnXDAnKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKipwcCkKKwl7CisJY2FzZSAnUSc6CisJICBob2xkID0gKnBwOworCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkKKwkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBleHBlY3RfZnVuYyA9IHRydWU7CisJICBob2xkID0gTlVMTDsKKwkgIGJyZWFrOworCisJY2FzZSAnUyc6CisJICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgRklYTUU6IENhbiB0aGlzIGhhcHBlbj8gICovCisJICBpZiAoaG9sZCA9PSBOVUxMKQorCSAgICBob2xkID0gKnBwOworCSAgKysqcHA7CisJICBicmVhazsKKworCWNhc2UgJ0MnOgorCSAgLyogQ29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KKwkgIGlmIChob2xkID09IE5VTEwpCisJICAgIGhvbGQgPSAqcHA7CisJICArKypwcDsKKwkgIGJyZWFrOworCisJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKwkgIGlmIChob2xkID09IE5VTEwpCisJICAgIGhvbGQgPSAqcHA7CisJICBpZiAoISBzdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsIChjb25zdCBjaGFyICoqKSBOVUxMKQorCSAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgaG9sZCwgKnBwIC0gaG9sZCkpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKKwkgIGhvbGQgPSBOVUxMOworCSAgYnJlYWs7CisKKwljYXNlICdGJzoKKwkgIC8qIEZ1bmN0aW9uLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgYWN0dWFsbHkgaGFwcGVucyB3aXRoIGcrKworICAgICAgICAgICAgIG91dHB1dC4gICovCisJICBob2xkID0gTlVMTDsKKwkgIGZ1bmNfZG9uZSA9IHRydWU7CisJICArKypwcDsKKwkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSAndCc6CisJICAvKiBUZW1wbGF0ZS4gICovCisJICBpZiAoaG9sZCA9PSBOVUxMKQorCSAgICBob2xkID0gKnBwOworCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCAoY2hhciAqKikgTlVMTCkKKwkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBob2xkID0gTlVMTDsKKwkgIGV4cGVjdF9mdW5jID0gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSAnXyc6CisJICAvKiBBdCB0aGUgb3V0ZXJtb3N0IGxldmVsLCB3ZSBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlCisJICAgICBzcGVjaWZpZWQsIHNvIGlmIHdlIHJ1biBpbnRvIGFub3RoZXIgJ18nIGF0IHRoaXMgcG9pbnQgd2UKKwkgICAgIGFyZSBkZWFsaW5nIHdpdGggYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yCisJICAgICBoYXMgYmVlbiBtYW5nbGVkIGJ5IHNvbWUgYWxnb3JpdGhtIHdlIGRvbid0IGtub3cgaG93IHRvCisJICAgICBkZWFsIHdpdGguICBTbyBqdXN0IHJlamVjdCB0aGUgZW50aXJlIGRlbWFuZ2xpbmcuICAqLworCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworCSAgcmV0dXJuIGZhbHNlOworCisJZGVmYXVsdDoKKwkgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgorCSAgICAgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLworCSAgZnVuY19kb25lID0gdHJ1ZTsKKwkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKGV4cGVjdF9mdW5jKQorCXsKKwkgIGZ1bmNfZG9uZSA9IHRydWU7CisJICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICBpZiAoISBmdW5jX2RvbmUpCisgICAgeworICAgICAgLyogV2l0aCBHTlUgc3R5bGUgZGVtYW5nbGluZywgYmFyX18zZm9vIGlzICdmb286OmJhcih2b2lkKScsIGFuZAorCSBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKKwkgZmlyc3QgY2FzZSwgYW5kIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlICcodm9pZCknIGdldHMgYWRkZWQKKwkgdG8gdGhlIGN1cnJlbnQgZGVjbHAuICAqLworICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBEZW1hbmdsZSBhIHF1YWxpZmllZCBuYW1lLCBzdWNoIGFzICJRMjVPdXRlcjVJbm5lciIgd2hpY2ggaXMgdGhlCisgICBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQgKG1pbmZvLCBwcCwgcHR5cGUpCisgICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOworICAgICBjb25zdCBjaGFyICoqcHA7CisgICAgIGRlYnVnX3R5cGUgKnB0eXBlOworeworICBjb25zdCBjaGFyICpvcmlnOworICBjb25zdCBjaGFyICpwOworICB1bnNpZ25lZCBpbnQgcXVhbGlmaWVyczsKKyAgZGVidWdfdHlwZSBjb250ZXh0OworCisgIG9yaWcgPSAqcHA7CisKKyAgc3dpdGNoICgoKnBwKVsxXSkKKyAgICB7CisgICAgY2FzZSAnXyc6CisgICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcworCSBwcmVjZWRlZCBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5CisJIGNhc2UpIGFuZCBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLiAgKi8KKyAgICAgIHAgPSAqcHAgKyAyOworICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnMCcpCisJeworCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHF1YWxpZmllcnMgPSBhdG9pIChwKTsKKyAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQorCSsrcDsKKyAgICAgIGlmICgqcCAhPSAnXycpCisJeworCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgICpwcCA9IHAgKyAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6CisgICAgY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICBxdWFsaWZpZXJzID0gKCpwcClbMV0gLSAnMCc7CisgICAgICAvKiBTa2lwIGFuIG9wdGlvbmFsIHVuZGVyc2NvcmUgYWZ0ZXIgdGhlIGNvdW50LiAgKi8KKyAgICAgIGlmICgoKnBwKVsyXSA9PSAnXycpCisJKysqcHA7CisgICAgICAqcHAgKz0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnMCc6CisgICAgZGVmYXVsdDoKKyAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKKworICAvKiBQaWNrIG9mZiB0aGUgbmFtZXMuICAqLworICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKKyAgICB7CisgICAgICBpZiAoKipwcCA9PSAnXycpCisJKysqcHA7CisgICAgICBpZiAoKipwcCA9PSAndCcpCisJeworCSAgY2hhciAqbmFtZTsKKworCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLAorCQkJCQlwdHlwZSAhPSBOVUxMID8gJm5hbWUgOiBOVUxMKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAocHR5cGUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKKwkJCQkJICAgICAgIG5hbWUsIHN0cmxlbiAobmFtZSksCisJCQkJCSAgICAgICBERUJVR19LSU5EX0NMQVNTKTsKKwkgICAgICBmcmVlIChuYW1lKTsKKwkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICB1bnNpZ25lZCBpbnQgbGVuOworCisJICBsZW4gPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7CisJICBpZiAoc3RybGVuICgqcHApIDwgbGVuKQorCSAgICB7CisJICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAocHR5cGUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNvbnN0IGRlYnVnX2ZpZWxkICpmaWVsZHM7CisKKwkgICAgICBmaWVsZHMgPSBOVUxMOworCSAgICAgIGlmIChjb250ZXh0ICE9IERFQlVHX1RZUEVfTlVMTCkKKwkJZmllbGRzID0gZGVidWdfZ2V0X2ZpZWxkcyAobWluZm8tPmRoYW5kbGUsIGNvbnRleHQpOworCisJICAgICAgY29udGV4dCA9IERFQlVHX1RZUEVfTlVMTDsKKworCSAgICAgIGlmIChmaWVsZHMgIT0gTlVMTCkKKwkJeworCQkgIGNoYXIgKm5hbWU7CisKKwkJICAvKiBUcnkgdG8gZmluZCB0aGUgdHlwZSBieSBsb29raW5nIHRocm91Z2ggdGhlCisgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgb2YgY29udGV4dCB1bnRpbCB3ZSBmaW5kIGEgZmllbGQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNhbWUgdHlwZS4gIFRoaXMgb3VnaHQgdG8gd29yayBmb3IgYSBjbGFzcworICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcywgYnV0IGl0IHdvbid0IHdvcmsgZm9yLAorICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYW4gZW51bSBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzLiAgc3RhYnMgZG9lcworICAgICAgICAgICAgICAgICAgICAgbm90IGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICBsYXR0ZXIgY2FzZS4gICovCisKKwkJICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOworCisJCSAgZm9yICg7ICpmaWVsZHMgIT0gREVCVUdfRklFTERfTlVMTDsgZmllbGRzKyspCisJCSAgICB7CisJCSAgICAgIGRlYnVnX3R5cGUgZnQ7CisJCSAgICAgIGNvbnN0IGNoYXIgKmRuOworCisJCSAgICAgIGZ0ID0gZGVidWdfZ2V0X2ZpZWxkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqZmllbGRzKTsKKwkJICAgICAgaWYgKGZ0ID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICAgIGRuID0gZGVidWdfZ2V0X3R5cGVfbmFtZSAobWluZm8tPmRoYW5kbGUsIGZ0KTsKKwkJICAgICAgaWYgKGRuICE9IE5VTEwgJiYgc3RyY21wIChkbiwgbmFtZSkgPT0gMCkKKwkJCXsKKwkJCSAgY29udGV4dCA9IGZ0OworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKworCQkgIGZyZWUgKG5hbWUpOworCQl9CisKKwkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCisJCXsKKwkJICAvKiBXZSBoYXZlIHRvIGZhbGwgYmFjayBvbiBmaW5kaW5nIHRoZSB0eXBlIGJ5IG5hbWUuCisgICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbW9yZSB0eXBlcyB0byBjb21lLCB0aGVuIHRoaXMgbXVzdAorICAgICAgICAgICAgICAgICAgICAgYmUgYSBjbGFzcy4gIE90aGVyd2lzZSwgaXQgY291bGQgYmUgYW55dGhpbmcuICAqLworCisJCSAgaWYgKHF1YWxpZmllcnMgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY2hhciAqbmFtZTsKKworCQkgICAgICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBsZW4pOworCQkgICAgICBjb250ZXh0ID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKKwkJCQkJCSAgICAgICBuYW1lKTsKKwkJICAgICAgZnJlZSAobmFtZSk7CisJCSAgICB9CisKKwkJICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCisJCSAgICB7CisJCSAgICAgIGNvbnRleHQgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAorCQkJCQkJICAgICAgIG1pbmZvLT5pbmZvLAorCQkJCQkJICAgICAgICpwcCwgbGVuLAorCQkJCQkJICAgICAgIChxdWFsaWZpZXJzID09IDAKKwkJCQkJCQk/IERFQlVHX0tJTkRfSUxMRUdBTAorCQkJCQkJCTogREVCVUdfS0lORF9DTEFTUykpOworCQkgICAgICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAqcHAgKz0gbGVuOworCX0KKyAgICB9CisKKyAgaWYgKHB0eXBlICE9IE5VTEwpCisgICAgKnB0eXBlID0gY29udGV4dDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRGVtYW5nbGUgYSB0ZW1wbGF0ZS4gIElmIFBOQU1FIGlzIG5vdCBOVUxMLCB0aGlzIHNldHMgKlBOQU1FIHRvIGEKKyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9kZW1hbmdsZV90ZW1wbGF0ZSAobWluZm8sIHBwLCBwbmFtZSkKKyAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87CisgICAgIGNvbnN0IGNoYXIgKipwcDsKKyAgICAgY2hhciAqKnBuYW1lOworeworICBjb25zdCBjaGFyICpvcmlnOworICB1bnNpZ25lZCBpbnQgciwgaTsKKworICBvcmlnID0gKnBwOworCisgICsrKnBwOworCisgIC8qIFNraXAgdGhlIHRlbXBsYXRlIG5hbWUuICAqLworICByID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOworICBpZiAociA9PSAwIHx8IHN0cmxlbiAoKnBwKSA8IHIpCisgICAgeworICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgKnBwICs9IHI7CisKKyAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gICovCisgIGlmIChzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZyKSA9PSAwKQorICAgIHsKKyAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKKyAgICB7CisgICAgICBpZiAoKipwcCA9PSAnWicpCisJeworCSAgLyogVGhpcyBpcyBhIHR5cGUgcGFyYW1ldGVyLiAgKi8KKwkgICsrKnBwOworCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IGNoYXIgKm9sZF9wOworCSAgYm9vbGVhbiBwb2ludGVycCwgcmVhbHAsIGludGVncmFscCwgY2hhcnAsIGJvb2xwOworCSAgYm9vbGVhbiBkb25lOworCisJICBvbGRfcCA9ICpwcDsKKwkgIHBvaW50ZXJwID0gZmFsc2U7CisJICByZWFscCA9IGZhbHNlOworCSAgaW50ZWdyYWxwID0gZmFsc2U7CisJICBjaGFycCA9IGZhbHNlOworCSAgYm9vbHAgPSBmYWxzZTsKKwkgIGRvbmUgPSBmYWxzZTsKKworCSAgLyogVGhpcyBpcyBhIHZhbHVlIHBhcmFtZXRlci4gICovCisKKwkgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICB3aGlsZSAoKm9sZF9wICE9ICdcMCcgJiYgISBkb25lKQorCSAgICB7CisJICAgICAgc3dpdGNoICgqb2xkX3ApCisJCXsKKwkJY2FzZSAnUCc6CisJCWNhc2UgJ3AnOgorCQljYXNlICdSJzoKKwkJICBwb2ludGVycCA9IHRydWU7CisJCSAgZG9uZSA9IHRydWU7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0MnOgkvKiBDb25zdC4gICovCisJCWNhc2UgJ1MnOgkvKiBTaWduZWQuICAqLworCQljYXNlICdVJzoJLyogVW5zaWduZWQuICAqLworCQljYXNlICdWJzoJLyogVm9sYXRpbGUuICAqLworCQljYXNlICdGJzoJLyogRnVuY3Rpb24uICAqLworCQljYXNlICdNJzoJLyogTWVtYmVyIGZ1bmN0aW9uLiAgKi8KKwkJY2FzZSAnTyc6CS8qID8/PyAqLworCQkgICsrb2xkX3A7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1EnOgkvKiBRdWFsaWZpZWQgbmFtZS4gICovCisJCSAgaW50ZWdyYWxwID0gdHJ1ZTsKKwkJICBkb25lID0gdHJ1ZTsKKwkJICBicmVhazsKKwkJY2FzZSAnVCc6CS8qIFJlbWVtYmVyZWQgdHlwZS4gICovCisJCSAgYWJvcnQgKCk7CisJCWNhc2UgJ3YnOgkvKiBWb2lkLiAgKi8KKwkJICBhYm9ydCAoKTsKKwkJY2FzZSAneCc6CS8qIExvbmcgbG9uZy4gICovCisJCWNhc2UgJ2wnOgkvKiBMb25nLiAgKi8KKwkJY2FzZSAnaSc6CS8qIEludC4gICovCisJCWNhc2UgJ3MnOgkvKiBTaG9ydC4gICovCisJCWNhc2UgJ3cnOgkvKiBXY2hhcl90LiAgKi8KKwkJICBpbnRlZ3JhbHAgPSB0cnVlOworCQkgIGRvbmUgPSB0cnVlOworCQkgIGJyZWFrOworCQljYXNlICdiJzoJLyogQm9vbC4gICovCisJCSAgYm9vbHAgPSB0cnVlOworCQkgIGRvbmUgPSB0cnVlOworCQkgIGJyZWFrOworCQljYXNlICdjJzoJLyogQ2hhci4gICovCisJCSAgY2hhcnAgPSB0cnVlOworCQkgIGRvbmUgPSB0cnVlOworCQkgIGJyZWFrOworCQljYXNlICdyJzoJLyogTG9uZyBkb3VibGUuICAqLworCQljYXNlICdkJzoJLyogRG91YmxlLiAgKi8KKwkJY2FzZSAnZic6CS8qIEZsb2F0LiAgKi8KKwkJICByZWFscCA9IHRydWU7CisJCSAgZG9uZSA9IHRydWU7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgLyogQXNzdW1lIGl0J3MgYSB1c2VyIGRlZmluZWQgaW50ZWdyYWwgdHlwZS4gICovCisJCSAgaW50ZWdyYWxwID0gdHJ1ZTsKKwkJICBkb25lID0gdHJ1ZTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIGlmIChpbnRlZ3JhbHApCisJICAgIHsKKwkgICAgICBpZiAoKipwcCA9PSAnbScpCisJCSsrKnBwOworCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCisJCSsrKnBwOworCSAgICB9CisJICBlbHNlIGlmIChjaGFycCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCB2YWw7CisKKwkgICAgICBpZiAoKipwcCA9PSAnbScpCisJCSsrKnBwOworCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKKwkgICAgICBpZiAodmFsID09IDApCisJCXsKKwkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGJvb2xwKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IHZhbDsKKworCSAgICAgIHZhbCA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKKwkgICAgICBpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCisJCXsKKwkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHJlYWxwKQorCSAgICB7CisJICAgICAgaWYgKCoqcHAgPT0gJ20nKQorCQkrKypwcDsKKwkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQorCQkrKypwcDsKKwkgICAgICBpZiAoKipwcCA9PSAnLicpCisJCXsKKwkJICArKypwcDsKKwkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQorCQkgICAgKysqcHA7CisJCX0KKwkgICAgICBpZiAoKipwcCA9PSAnZScpCisJCXsKKwkJICArKypwcDsKKwkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQorCQkgICAgKysqcHA7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAocG9pbnRlcnApCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBpbnQgbGVuOworCisJICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmbGVuKSkKKwkJeworCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgICAqcHAgKz0gbGVuOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBXZSBjYW4gdHJhbnNsYXRlIHRoaXMgdG8gYSBzdHJpbmcgZmFpcmx5IGVhc2lseSBieSBpbnZva2luZyB0aGUKKyAgICAgcmVndWxhciBkZW1hbmdsaW5nIHJvdXRpbmUuICAqLworICBpZiAocG5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpzMSwgKnMyLCAqczMsICpzNDsKKyAgICAgIGNoYXIgKmZyb20sICp0bzsKKworICAgICAgczEgPSBzYXZlc3RyaW5nIChvcmlnLCAqcHAgLSBvcmlnKTsKKworICAgICAgczIgPSBjb25jYXQgKCJOb1N1Y2hTdHJpbkdfXyIsIHMxLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKKworICAgICAgZnJlZSAoczEpOworCisgICAgICBzMyA9IGNwbHVzX2RlbWFuZ2xlIChzMiwgRE1HTF9BTlNJKTsKKworICAgICAgZnJlZSAoczIpOworCisgICAgICBpZiAoczMgIT0gTlVMTCkKKwlzNCA9IHN0cnN0ciAoczMsICI6Ok5vU3VjaFN0cmluRyIpOworICAgICAgaWYgKHMzID09IE5VTEwgfHwgczQgPT0gTlVMTCkKKwl7CisJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJICBpZiAoczMgIT0gTlVMTCkKKwkgICAgZnJlZSAoczMpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgLyogRWxpbWluYXRpbmcgYWxsIHNwYWNlcywgZXhjZXB0IHRob3NlIGJldHdlZW4gPiBjaGFyYWN0ZXJzLAorICAgICAgICAgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB0aGUgZGVtYW5nbGVkIG5hbWUgd2lsbCBtYXRjaCB0aGUKKyAgICAgICAgIG5hbWUgd2hpY2ggZysrIHVzZWQgYXMgdGhlIHN0cnVjdHVyZSBuYW1lLiAgKi8KKyAgICAgIGZvciAoZnJvbSA9IHRvID0gczM7IGZyb20gIT0gczQ7ICsrZnJvbSkKKwlpZiAoKmZyb20gIT0gJyAnCisJICAgIHx8IChmcm9tWzFdID09ICc+JyAmJiBmcm9tID4gczMgJiYgZnJvbVstMV0gPT0gJz4nKSkKKwkgICp0bysrID0gKmZyb207CisKKyAgICAgICpwbmFtZSA9IHNhdmVzdHJpbmcgKHMzLCB0byAtIHMzKTsKKworICAgICAgZnJlZSAoczMpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRGVtYW5nbGUgYSBjbGFzcyBuYW1lLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgcHN0YXJ0KQorICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBjb25zdCBjaGFyICoqcHN0YXJ0OworeworICBjb25zdCBjaGFyICpvcmlnOworICB1bnNpZ25lZCBpbnQgbjsKKworICBvcmlnID0gKnBwOworCisgIG4gPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7CisgIGlmIChzdHJsZW4gKCpwcCkgPCBuKQorICAgIHsKKyAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKHBzdGFydCAhPSBOVUxMKQorICAgICpwc3RhcnQgPSAqcHA7CisKKyAgKnBwICs9IG47CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERlbWFuZ2xlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIElmIHRoZSBwYXJncyBhcmd1bWVudCBpcyBub3QgTlVMTCwgaXQKKyAgIGlzIHNldCB0byBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBob2xkaW5nIHRoZSBhcmd1bWVudHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsIHBhcmdzLCBwdmFyYXJncykKKyAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87CisgICAgIGNvbnN0IGNoYXIgKipwcDsKKyAgICAgZGVidWdfdHlwZSAqKnBhcmdzOworICAgICBib29sZWFuICpwdmFyYXJnczsKK3sKKyAgY29uc3QgY2hhciAqb3JpZzsKKyAgdW5zaWduZWQgaW50IGFsbG9jLCBjb3VudDsKKworICBvcmlnID0gKnBwOworCisgIGFsbG9jID0gMTA7CisgIGlmIChwYXJncyAhPSBOVUxMKQorICAgIHsKKyAgICAgICpwYXJncyA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICoqcGFyZ3MpOworICAgICAgKnB2YXJhcmdzID0gZmFsc2U7CisgICAgfQorICBjb3VudCA9IDA7CisKKyAgd2hpbGUgKCoqcHAgIT0gJ18nICYmICoqcHAgIT0gJ1wwJyAmJiAqKnBwICE9ICdlJykKKyAgICB7CisgICAgICBpZiAoKipwcCA9PSAnTicgfHwgKipwcCA9PSAnVCcpCisJeworCSAgY2hhciB0ZW1wdHlwZTsKKwkgIHVuc2lnbmVkIGludCByLCB0OworCisJICB0ZW1wdHlwZSA9ICoqcHA7CisJICArKypwcDsKKworCSAgaWYgKHRlbXB0eXBlID09ICdUJykKKwkgICAgciA9IDE7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZyKSkKKwkJeworCQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgfQorCisJICBpZiAoISBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudCAocHAsICZ0KSkKKwkgICAgeworCSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKworCSAgaWYgKHQgPj0gbWluZm8tPnR5cGVzdHJpbmdfY291bnQpCisJICAgIHsKKwkgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJICB3aGlsZSAoci0tID4gMCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnRlbTsKKworCSAgICAgIHRlbSA9IG1pbmZvLT50eXBlc3RyaW5nc1t0XS50eXBlc3RyaW5nOworCSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgJnRlbSwgcGFyZ3MsICZjb3VudCwgJmFsbG9jKSkKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgcHAsIHBhcmdzLCAmY291bnQsICZhbGxvYykpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIGlmIChwYXJncyAhPSBOVUxMKQorICAgICgqcGFyZ3MpW2NvdW50XSA9IERFQlVHX1RZUEVfTlVMTDsKKworICBpZiAoKipwcCA9PSAnZScpCisgICAgeworICAgICAgaWYgKHBhcmdzICE9IE5VTEwpCisJKnB2YXJhcmdzID0gdHJ1ZTsKKyAgICAgICsrKnBwOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRGVtYW5nbGUgYSBzaW5nbGUgYXJndW1lbnQuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9kZW1hbmdsZV9hcmcgKG1pbmZvLCBwcCwgcGFyZ3MsIHBjb3VudCwgcGFsbG9jKQorICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBkZWJ1Z190eXBlICoqcGFyZ3M7CisgICAgIHVuc2lnbmVkIGludCAqcGNvdW50OworICAgICB1bnNpZ25lZCBpbnQgKnBhbGxvYzsKK3sKKyAgY29uc3QgY2hhciAqc3RhcnQ7CisgIGRlYnVnX3R5cGUgdHlwZTsKKworICBzdGFydCA9ICpwcDsKKyAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsCisJCQkgICAgcGFyZ3MgPT0gTlVMTCA/IChkZWJ1Z190eXBlICopIE5VTEwgOiAmdHlwZSkKKyAgICAgIHx8ICEgc3RhYl9kZW1hbmdsZV9yZW1lbWJlcl90eXBlIChtaW5mbywgc3RhcnQsICpwcCAtIHN0YXJ0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHBhcmdzICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCXJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCpwY291bnQgKyAxID49ICpwYWxsb2MpCisJeworCSAgKnBhbGxvYyArPSAxMDsKKwkgICpwYXJncyA9ICgoZGVidWdfdHlwZSAqKQorCQkgICAgeHJlYWxsb2MgKCpwYXJncywgKnBhbGxvYyAqIHNpemVvZiAqKnBhcmdzKSk7CisJfQorICAgICAgKCpwYXJncylbKnBjb3VudF0gPSB0eXBlOworICAgICAgKysqcGNvdW50OworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRGVtYW5nbGUgYSB0eXBlLiAgSWYgdGhlIHB0eXBlIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqcHR5cGUgaXMgc2V0CisgICB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKQorICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBkZWJ1Z190eXBlICpwdHlwZTsKK3sKKyAgY29uc3QgY2hhciAqb3JpZzsKKworICBvcmlnID0gKnBwOworCisgIHN3aXRjaCAoKipwcCkKKyAgICB7CisgICAgY2FzZSAnUCc6CisgICAgY2FzZSAncCc6CisgICAgICAvKiBBIHBvaW50ZXIgdHlwZS4gICovCisgICAgICArKypwcDsKKyAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCisJKnB0eXBlID0gZGVidWdfbWFrZV9wb2ludGVyX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdSJzoKKyAgICAgIC8qIEEgcmVmZXJlbmNlIHR5cGUuICAqLworICAgICAgKysqcHA7CisgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQorCSpwdHlwZSA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdBJzoKKyAgICAgIC8qIEFuIGFycmF5LiAgKi8KKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGhpZ2g7CisKKwkrKypwcDsKKwloaWdoID0gMDsKKwl3aGlsZSAoKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJ18nKQorCSAgeworCSAgICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCisJICAgICAgeworCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJCXJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICAgIGhpZ2ggKj0gMTA7CisJICAgIGhpZ2ggKz0gKipwcCAtICcwJzsKKwkgICAgKysqcHA7CisJICB9CisJaWYgKCoqcHAgIT0gJ18nKQorCSAgeworCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwkrKypwcDsKKworCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCisJICByZXR1cm4gZmFsc2U7CisJaWYgKHB0eXBlICE9IE5VTEwpCisJICB7CisJICAgIGRlYnVnX3R5cGUgaW50X3R5cGU7CisKKwkgICAgaW50X3R5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiaW50Iik7CisJICAgIGlmIChpbnRfdHlwZSA9PSBOVUxMKQorCSAgICAgIGludF90eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIGZhbHNlKTsKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLCBpbnRfdHlwZSwKKwkJCQkJICAgIDAsIGhpZ2gsIGZhbHNlKTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVCc6CisgICAgICAvKiBBIGJhY2sgcmVmZXJlbmNlIHRvIGEgcmVtZW1iZXJlZCB0eXBlLiAgKi8KKyAgICAgIHsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpwOworCisJKysqcHA7CisJaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmaSkpCisJICB7CisJICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCWlmIChpID49IG1pbmZvLT50eXBlc3RyaW5nX2NvdW50KQorCSAgeworCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwlwID0gbWluZm8tPnR5cGVzdHJpbmdzW2ldLnR5cGVzdHJpbmc7CisJaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgJnAsIHB0eXBlKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRic6CisgICAgICAvKiBBIGZ1bmN0aW9uLiAgKi8KKyAgICAgIHsKKwlkZWJ1Z190eXBlICphcmdzOworCWJvb2xlYW4gdmFyYXJnczsKKworCSsrKnBwOworCWlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLAorCQkJCSAgKHB0eXBlID09IE5VTEwKKwkJCQkgICA/IChkZWJ1Z190eXBlICoqKSBOVUxMCisJCQkJICAgOiAmYXJncyksCisJCQkJICAocHR5cGUgPT0gTlVMTAorCQkJCSAgID8gKGJvb2xlYW4gKikgTlVMTAorCQkJCSAgIDogJnZhcmFyZ3MpKSkKKwkgIHJldHVybiBmYWxzZTsKKwlpZiAoKipwcCAhPSAnXycpCisJICB7CisJICAgIC8qIGNwbHVzX2RlbWFuZ2xlIHdpbGwgYWNjZXB0IGEgZnVuY3Rpb24gd2l0aG91dCBhIHJldHVybgorCSAgICAgICB0eXBlLCBidXQgSSBkb24ndCBrbm93IHdoZW4gdGhhdCB3aWxsIGhhcHBlbiwgb3Igd2hhdAorCSAgICAgICB0byBkbyBpZiBpdCBkb2VzLiAgKi8KKwkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworCSAgICByZXR1cm4gZmFsc2U7CisJICB9CisJKysqcHA7CisJaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKKwkgIHJldHVybiBmYWxzZTsKKwlpZiAocHR5cGUgIT0gTlVMTCkKKwkgICpwdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwgYXJncywKKwkJCQkJICAgICB2YXJhcmdzKTsKKworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdNJzoKKyAgICBjYXNlICdPJzoKKyAgICAgIHsKKwlib29sZWFuIG1lbWJlcnAsIGNvbnN0cCwgdm9sYXRpbGVwOworCWRlYnVnX3R5cGUgKmFyZ3M7CisJYm9vbGVhbiB2YXJhcmdzOworCXVuc2lnbmVkIGludCBuOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwltZW1iZXJwID0gKipwcCA9PSAnTSc7CisJY29uc3RwID0gZmFsc2U7CisJdm9sYXRpbGVwID0gZmFsc2U7CisJYXJncyA9IE5VTEw7CisJdmFyYXJncyA9IGZhbHNlOworCisJKysqcHA7CisJaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQorCSAgeworCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwluID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOworCWlmIChzdHJsZW4gKCpwcCkgPCBuKQorCSAgeworCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwluYW1lID0gKnBwOworCSpwcCArPSBuOworCisJaWYgKG1lbWJlcnApCisJICB7CisJICAgIGlmICgqKnBwID09ICdDJykKKwkgICAgICB7CisJCWNvbnN0cCA9IHRydWU7CisJCSsrKnBwOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoKipwcCA9PSAnVicpCisJICAgICAgeworCQl2b2xhdGlsZXAgPSB0cnVlOworCQkrKypwcDsKKwkgICAgICB9CisJICAgIGlmICgqKnBwICE9ICdGJykKKwkgICAgICB7CisJCXN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKwkJcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgICAgKysqcHA7CisJICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLAorCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCisJCQkJICAgICAgID8gKGRlYnVnX3R5cGUgKiopIE5VTEwKKwkJCQkgICAgICAgOiAmYXJncyksCisJCQkJICAgICAgKHB0eXBlID09IE5VTEwKKwkJCQkgICAgICAgPyAoYm9vbGVhbiAqKSBOVUxMCisJCQkJICAgICAgIDogJnZhcmFyZ3MpKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisKKwlpZiAoKipwcCAhPSAnXycpCisJICB7CisJICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCSsrKnBwOworCisJaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKKwkgIHJldHVybiBmYWxzZTsKKworCWlmIChwdHlwZSAhPSBOVUxMKQorCSAgeworCSAgICBkZWJ1Z190eXBlIGNsYXNzX3R5cGU7CisKKwkgICAgY2xhc3NfdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAorCQkJCQkJbmFtZSwgKGludCkgbiwKKwkJCQkJCURFQlVHX0tJTkRfQ0xBU1MpOworCSAgICBpZiAoY2xhc3NfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIGlmICghIG1lbWJlcnApCisJICAgICAgKnB0eXBlID0gZGVidWdfbWFrZV9vZmZzZXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIGNsYXNzX3R5cGUsCisJCQkJCSAgICAgICAqcHR5cGUpOworCSAgICBlbHNlCisJICAgICAgeworCQkvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIGNvbnN0cCBvcgorICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlcC4gICovCisJCSpwdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsCisJCQkJCQkgY2xhc3NfdHlwZSwgYXJncywgdmFyYXJncyk7CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdHJzoKKyAgICAgICsrKnBwOworICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0MnOgorICAgICAgKysqcHA7CisgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQorCSpwdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1EnOgorICAgICAgeworCWNvbnN0IGNoYXIgKmhvbGQ7CisKKwlob2xkID0gKnBwOworCWlmICghIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsIHB0eXBlKSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERlbWFuZ2xlIGEgZnVuZGFtZW50YWwgdHlwZS4gIElmIHRoZSBwdHlwZSBhcmd1bWVudCBpcyBub3QgTlVMTCwKKyAgICpwdHlwZSBpcyBzZXQgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZGVtYW5nbGVfZnVuZF90eXBlIChtaW5mbywgcHAsIHB0eXBlKQorICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKKyAgICAgY29uc3QgY2hhciAqKnBwOworICAgICBkZWJ1Z190eXBlICpwdHlwZTsKK3sKKyAgY29uc3QgY2hhciAqb3JpZzsKKyAgYm9vbGVhbiBjb25zdHAsIHZvbGF0aWxlcCwgdW5zaWduZWRwLCBzaWduZWRwOworICBib29sZWFuIGRvbmU7CisKKyAgb3JpZyA9ICpwcDsKKworICBjb25zdHAgPSBmYWxzZTsKKyAgdm9sYXRpbGVwID0gZmFsc2U7CisgIHVuc2lnbmVkcCA9IGZhbHNlOworICBzaWduZWRwID0gZmFsc2U7CisKKyAgZG9uZSA9IGZhbHNlOworICB3aGlsZSAoISBkb25lKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKipwcCkKKwl7CisJY2FzZSAnQyc6CisJICBjb25zdHAgPSB0cnVlOworCSAgKysqcHA7CisJICBicmVhazsKKworCWNhc2UgJ1UnOgorCSAgdW5zaWduZWRwID0gdHJ1ZTsKKwkgICsrKnBwOworCSAgYnJlYWs7CisKKwljYXNlICdTJzoKKwkgIHNpZ25lZHAgPSB0cnVlOworCSAgKysqcHA7CisJICBicmVhazsKKworCWNhc2UgJ1YnOgorCSAgdm9sYXRpbGVwID0gdHJ1ZTsKKwkgICsrKnBwOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZG9uZSA9IHRydWU7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHN3aXRjaCAoKipwcCkKKyAgICB7CisgICAgY2FzZSAnXDAnOgorICAgIGNhc2UgJ18nOgorICAgICAgLyogY3BsdXNfZGVtYW5nbGUgcGVybWl0cyB0aGlzLCBidXQgSSBkb24ndCBrbm93IHdoYXQgaXQgbWVhbnMuICAqLworICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd2JzogLyogdm9pZCAqLworICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCisJeworCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgInZvaWQiKTsKKwkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAobWluZm8tPmRoYW5kbGUpOworCX0KKyAgICAgICsrKnBwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd4JzogLyogbG9uZyBsb25nICovCisgICAgICBpZiAocHR5cGUgIT0gTlVMTCkKKwl7CisJICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAorCQkJCQkgICh1bnNpZ25lZHAKKwkJCQkJICAgPyAibG9uZyBsb25nIHVuc2lnbmVkIGludCIKKwkJCQkJICAgOiAibG9uZyBsb25nIGludCIpKTsKKwkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgOCwgdW5zaWduZWRwKTsKKwl9CisgICAgICArKypwcDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbCc6IC8qIGxvbmcgKi8KKyAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQorCXsKKwkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCisJCQkJCSAgKHVuc2lnbmVkcAorCQkJCQkgICA/ICJsb25nIHVuc2lnbmVkIGludCIKKwkJCQkJICAgOiAibG9uZyBpbnQiKSk7CisJICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIHVuc2lnbmVkcCk7CisJfQorICAgICAgKysqcHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2knOiAvKiBpbnQgKi8KKyAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQorCXsKKwkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCisJCQkJCSAgKHVuc2lnbmVkcAorCQkJCQkgICA/ICJ1bnNpZ25lZCBpbnQiCisJCQkJCSAgIDogImludCIpKTsKKwkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCwgdW5zaWduZWRwKTsKKwl9CisgICAgICArKypwcDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncyc6IC8qIHNob3J0ICovCisgICAgICBpZiAocHR5cGUgIT0gTlVMTCkKKwl7CisJICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAorCQkJCQkgICh1bnNpZ25lZHAKKwkJCQkJICAgPyAic2hvcnQgdW5zaWduZWQgaW50IgorCQkJCQkgICA6ICJzaG9ydCBpbnQiKSk7CisJICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDIsIHVuc2lnbmVkcCk7CisJfQorICAgICAgKysqcHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2InOiAvKiBib29sICovCisgICAgICBpZiAocHR5cGUgIT0gTlVMTCkKKwl7CisJICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiYm9vbCIpOworCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJICAgICpwdHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCk7CisJfQorICAgICAgKysqcHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2MnOiAvKiBjaGFyICovCisgICAgICBpZiAocHR5cGUgIT0gTlVMTCkKKwl7CisJICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAorCQkJCQkgICh1bnNpZ25lZHAKKwkJCQkJICAgPyAidW5zaWduZWQgY2hhciIKKwkJCQkJICAgOiAoc2lnbmVkcAorCQkJCQkgICAgICA/ICJzaWduZWQgY2hhciIKKwkJCQkJICAgICAgOiAiY2hhciIpKSk7CisJICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDEsIHVuc2lnbmVkcCk7CisJfQorICAgICAgKysqcHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3cnOiAvKiB3Y2hhcl90ICovCisgICAgICBpZiAocHR5cGUgIT0gTlVMTCkKKwl7CisJICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiX193Y2hhcl90Iik7CisJICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDIsIHRydWUpOworCX0KKyAgICAgICsrKnBwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdyJzogLyogbG9uZyBkb3VibGUgKi8KKyAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQorCXsKKwkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJsb25nIGRvdWJsZSIpOworCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgpOworCX0KKyAgICAgICsrKnBwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzogLyogZG91YmxlICovCisgICAgICBpZiAocHR5cGUgIT0gTlVMTCkKKwl7CisJICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAiZG91YmxlIik7CisJICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgOCk7CisJfQorICAgICAgKysqcHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2YnOiAvKiBmbG9hdCAqLworICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCisJeworCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImZsb2F0Iik7CisJICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgNCk7CisJfQorICAgICAgKysqcHA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0cnOgorICAgICAgKysqcHA7CisgICAgICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCisJeworCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgIHsKKwljb25zdCBjaGFyICpob2xkOworCisJaWYgKCEgc3RhYl9kZW1hbmdsZV9jbGFzcyAobWluZm8sIHBwLCAmaG9sZCkpCisJICByZXR1cm4gZmFsc2U7CisJaWYgKHB0eXBlICE9IE5VTEwpCisJICB7CisJICAgIGNoYXIgKm5hbWU7CisKKwkgICAgbmFtZSA9IHNhdmVzdHJpbmcgKGhvbGQsICpwcCAtIGhvbGQpOworCSAgICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBuYW1lKTsKKwkgICAgZnJlZSAobmFtZSk7CisJICAgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQorCSAgICAgIHsKKwkJLyogRklYTUU6IEl0IGlzIHByb2JhYmx5IGluY29ycmVjdCB0byBhc3N1bWUgdGhhdAorICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCB0eXBlcyBhcmUgdGFnZ2VkIHR5cGVzLiAgKi8KKwkJKnB0eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbWluZm8tPmluZm8sCisJCQkJCQlob2xkLCAqcHAgLSBob2xkLAorCQkJCQkJREVCVUdfS0lORF9JTExFR0FMKTsKKwkJaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndCc6CisgICAgICB7CisJY2hhciAqbmFtZTsKKworCWlmICghIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwKKwkJCQkgICAgICBwdHlwZSAhPSBOVUxMID8gJm5hbWUgOiBOVUxMKSkKKwkgIHJldHVybiBmYWxzZTsKKwlpZiAocHR5cGUgIT0gTlVMTCkKKwkgIHsKKwkgICAgKnB0eXBlID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbWluZm8tPmluZm8sCisJCQkJCSAgICBuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCQkgICAgREVCVUdfS0lORF9DTEFTUyk7CisJICAgIGZyZWUgKG5hbWUpOworCSAgICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChwdHlwZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChjb25zdHApCisJKnB0eXBlID0gZGVidWdfbWFrZV9jb25zdF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKKyAgICAgIGlmICh2b2xhdGlsZXApCisJKnB0eXBlID0gZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlbWVtYmVyIGEgdHlwZSBzdHJpbmcgaW4gYSBkZW1hbmdsZWQgc3RyaW5nLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIHAsIGxlbikKKyAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87CisgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgIGludCBsZW47Cit7CisgIGlmIChtaW5mby0+dHlwZXN0cmluZ19jb3VudCA+PSBtaW5mby0+dHlwZXN0cmluZ19hbGxvYykKKyAgICB7CisgICAgICBtaW5mby0+dHlwZXN0cmluZ19hbGxvYyArPSAxMDsKKyAgICAgIG1pbmZvLT50eXBlc3RyaW5ncyA9ICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZyAqKQorCQkJICAgIHhyZWFsbG9jIChtaW5mby0+dHlwZXN0cmluZ3MsCisJCQkJICAgICAgKG1pbmZvLT50eXBlc3RyaW5nX2FsbG9jCisJCQkJICAgICAgICogc2l6ZW9mICptaW5mby0+dHlwZXN0cmluZ3MpKSk7CisgICAgfQorCisgIG1pbmZvLT50eXBlc3RyaW5nc1ttaW5mby0+dHlwZXN0cmluZ19jb3VudF0udHlwZXN0cmluZyA9IHA7CisgIG1pbmZvLT50eXBlc3RyaW5nc1ttaW5mby0+dHlwZXN0cmluZ19jb3VudF0ubGVuID0gKHVuc2lnbmVkIGludCkgbGVuOworICArK21pbmZvLT50eXBlc3RyaW5nX2NvdW50OworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RhbXAtaC5pbiBiL2JpbnV0aWxzL3N0YW1wLWguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4OGY3MAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N0YW1wLWguaW4KQEAgLTAsMCArMSBAQAordGltZXN0YW1wCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLjEgYi9iaW51dGlscy9zdHJpbmdzLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N0cmluZ3MuMQpAQCAtMCwwICsxLDE1MSBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgorLlRIIHN0cmluZ3MgMSAiMjUgSnVuZSAxOTkzIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCisuZGUgQlAKKy5zcAorLnRpIFwtLjJpCitcKCoqCisuLgorCisuU0ggTkFNRQorc3RyaW5ncyBcLSBwcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcworCisuU0ggU1lOT1BTSVMKKy5oeSAwCisubmEKKy5UUAorLkIgc3RyaW5ncworLlJCICJbXHwiIFwtYSB8IFwtXGMKKy5SQiB8IFwtXC1hbGwgIlx8XSIgCisuUkIgIltcfCIgXC1mIHwgXC1cLXByaW50XC1maWxlXC1uYW1lICJcfF0iCisuUkIgIltcfCIgXC1vICJcfF0iIAorLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iIAorLlJCICJbXHwiIFwtdiB8IFwtXC12ZXJzaW9uICJcfF0iICAKKy5SQiAiW1x8IiBcLW4KKy5JIG1pblwtbGVuXGMKKy5SSSB8IFwtbWluXC1sZW5cYworLlJCIHwgIlwtXC1ieXRlcz0iXGMKKy5JIG1pblwtbGVuXGMKK1wmXHxdCisuUkIgIltcfCIgXC10CisuSSB7byx4LGR9XGMKKy5SQiAiW1x8IiAiXC1cLXRhcmdldD1cZkliZmRuYW1lIiAiXHxdIgorLlJCIHwgIlwtXC1yYWRpeD0iXGMKKy5JIHtvLHgsZH1cYworXCZcfF0KKy5JIGZpbGVcYworLmFkIGIKKy5oeSAxCisuU0ggREVTQ1JJUFRJT04KK0ZvciBlYWNoCisuSSBmaWxlCitnaXZlbiwgR05VIFxjCisuQiBzdHJpbmdzCitwcmludHMgdGhlIHByaW50YWJsZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQKK2NoYXJhY3RlcnMgbG9uZyAob3IgdGhlIG51bWJlciBnaXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlCitmb2xsb3dlZCBieSBhbiB1bnByaW50YWJsZSBjaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUKK3N0cmluZ3MgZnJvbSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvcgorb3RoZXIgdHlwZXMgb2YgZmlsZXMsIGl0IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgorCisuUFAKKy5CIHN0cmluZ3MKK2lzIG1haW5seSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50cyBvZiBub24tdGV4dCBmaWxlcy4KKworLlNIIE9QVElPTlMKK1RoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCitlcXVpdmFsZW50LgorCisuVFAKKy5CIFwtYQorLlRQCisuQiBcLVwtYWxsCisuVFAKKy5CIFwtCitEbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKK3NjYW4gdGhlIHdob2xlIGZpbGVzLgorCisuVFAKKy5CIFwtZgorLlRQCisuQiBcLVwtcHJpbnRcLWZpbGVcLW5hbWUKK1ByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KKworLlRQCisuQiBcLVwtaGVscAorUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCisuQiBzdHJpbmdzCitvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorCisuVFAKKy5CIFwtdgorLlRQCisuQiBcLVwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCitvZgorLkIgc3RyaW5ncworb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KKworLlRQCisuQiAiXC1uIFxmSW1pblwtbGVuXGZQIgorLlRQCisuQiAiXC1cZkltaW5cLWxlblxmUCIKKy5UUAorLkIgIlwtYnl0ZXM9XGZJbWluXC1sZW5cZlAiCitQcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdAorLkkgbWluXC1sZW4KK2NoYXJhY3RlcnMgbG9uZywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0LgorCisuVFAKKy5CUiAiXC10ICIge28seCxkfQorLlRQCisuQlIgIlwtXC1yYWRpeD0iIHtvLHgsZH0KK1ByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4gIFRoZSBzaW5nbGUKK2NoYXJhY3RlciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4IG9mIHRoZSBvZmZzZXRcKGVtb2N0YWwsCitoZXhhZGVjaW1hbCwgb3IgZGVjaW1hbC4KKworLlRQCisuQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKK1NwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KK1NlZSAKKy5CUiBvYmpkdW1wICggMSApLAorZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCisKKy5UUAorLkIgXC1vCitMaWtlCisuQlIgIlwtdCBvIiAuCisKKy5QUAorCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCitlbnRyeSBpbiAKKy5CCitpbmZvXGMKK1wmOyAKKy5JCitUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYworXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKKy5CUiBhciAoIDEgKSwKKy5CUiBubSAoIDEgKSwKKy5CUiBvYmpkdW1wICggMSApLAorLkJSIHJhbmxpYiAoIDEgKS4KKworCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLmMgYi9iaW51dGlscy9zdHJpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmZTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N0cmluZ3MuYwpAQCAtMCwwICsxLDUxNCBAQAorLyogc3RyaW5ncyAtLSBwcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcworICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworDAorLyogVXNhZ2U6IHN0cmluZ3MgW29wdGlvbnNdIGZpbGUuLi4KKworICAgT3B0aW9uczoKKyAgIC0tYWxsCisgICAtYQorICAgLQkJRG8gbm90IHNjYW4gb25seSB0aGUgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIG9mIG9iamVjdCBmaWxlcy4KKworICAgLS1wcmludC1maWxlLW5hbWUKKyAgIC1mCQlQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCisKKyAgIC0tYnl0ZXM9bWluLWxlbgorICAgLW4gbWluLWxlbgorICAgLW1pbi1sZW4JUHJpbnQgZ3JhcGhpYyBjaGFyIHNlcXVlbmNlcywgTUlOLUxFTiBvciBtb3JlIGJ5dGVzIGxvbmcsCisJCXRoYXQgYXJlIGZvbGxvd2VkIGJ5IGEgTlVMIG9yIGEgbmV3bGluZS4gIERlZmF1bHQgaXMgNC4KKworICAgLS1yYWRpeD17byx4LGR9CisgICAtdCB7byx4LGR9CVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZywKKwkJaW4gb2N0YWwvaGV4L2RlY2ltYWwuCisKKyAgIC1vCQlMaWtlIC10by4gIChTb21lIG90aGVyIGltcGxlbWVudGF0aW9ucyBoYXZlIC1vIGxpa2UgLXRvLAorCQlvdGhlcnMgbGlrZSAtdGQuICBXZSBjaG9zZSBvbmUgYXJiaXRyYXJpbHkuKQorCisgICAtLXRhcmdldD1CRkROQU1FCisJCVNwZWNpZnkgYSBub24tZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQuCisKKyAgIC0taGVscAorICAgLWgJCVByaW50IHRoZSB1c2FnZSBtZXNzYWdlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKyAgIC0tdmVyc2lvbgorICAgLXYJCVByaW50IHRoZSBwcm9ncmFtIHZlcnNpb24gbnVtYmVyLgorCisgICBXcml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gPHJtc0BnbnUuYWkubWl0LmVkdT4KKyAgIGFuZCBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4uICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiYnVjb21tLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpZmRlZiBpc2FzY2lpCisjZGVmaW5lIGlzZ3JhcGhpYyhjKSAoaXNhc2NpaSAoYykgJiYgaXNwcmludCAoYykpCisjZWxzZQorI2RlZmluZSBpc2dyYXBoaWMoYykgKGlzcHJpbnQgKGMpKQorI2VuZGlmCisKKyNpZm5kZWYgZXJybm8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworLyogVGhlIEJGRCBzZWN0aW9uIGZsYWdzIHRoYXQgaWRlbnRpZnkgYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgREFUQV9GTEFHUyAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTKQorCisvKiBSYWRpeCBmb3IgcHJpbnRpbmcgYWRkcmVzc2VzIChtdXN0IGJlIDgsIDEwIG9yIDE2KS4gICovCitzdGF0aWMgaW50IGFkZHJlc3NfcmFkaXg7CisKKy8qIE1pbmltdW0gbGVuZ3RoIG9mIHNlcXVlbmNlIG9mIGdyYXBoaWMgY2hhcnMgdG8gdHJpZ2dlciBvdXRwdXQuICAqLworc3RhdGljIGludCBzdHJpbmdfbWluOworCisvKiB0cnVlIG1lYW5zIHByaW50IGFkZHJlc3Mgd2l0aGluIGZpbGUgZm9yIGVhY2ggc3RyaW5nLiAgKi8KK3N0YXRpYyBib29sZWFuIHByaW50X2FkZHJlc3NlczsKKworLyogdHJ1ZSBtZWFucyBwcmludCBmaWxlbmFtZSBmb3IgZWFjaCBzdHJpbmcuICAqLworc3RhdGljIGJvb2xlYW4gcHJpbnRfZmlsZW5hbWVzOworCisvKiB0cnVlIG1lYW5zIGZvciBvYmplY3QgZmlsZXMgc2NhbiBvbmx5IHRoZSBkYXRhIHNlY3Rpb24uICAqLworc3RhdGljIGJvb2xlYW4gZGF0YXNlY3Rpb25fb25seTsKKworLyogdHJ1ZSBpZiB3ZSBmb3VuZCBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gaW4gdGhlIGN1cnJlbnQgZmlsZS4gICovCitzdGF0aWMgYm9vbGVhbiBnb3RfYV9zZWN0aW9uOworCisvKiBUaGUgQkZEIG9iamVjdCBmaWxlIGZvcm1hdC4gICovCitzdGF0aWMgY2hhciAqdGFyZ2V0OworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Cit7CisgIHsiYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdhJ30sCisgIHsicHJpbnQtZmlsZS1uYW1lIiwgbm9fYXJndW1lbnQsIE5VTEwsICdmJ30sCisgIHsiYnl0ZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ24nfSwKKyAgeyJyYWRpeCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndCd9LAorICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAorICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKKyAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICd2J30sCisgIHtOVUxMLCAwLCBOVUxMLCAwfQorfTsKKworc3RhdGljIHZvaWQgc3RyaW5nc19hX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RyaW5nc19vYmplY3RfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIHN0cmluZ3NfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlKSk7CitzdGF0aWMgaW50IGludGVnZXJfYXJnIFBBUkFNUyAoKGNoYXIgKnMpKTsKK3N0YXRpYyB2b2lkIHByaW50X3N0cmluZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUsIEZJTEUgKnN0cmVhbSwKKwkJCQkgIGZpbGVfcHRyIGFkZHJlc3MsIGludCBzdG9wX3BvaW50LAorCQkJCSAgaW50IG1hZ2ljY291bnQsIGNoYXIgKm1hZ2ljKSk7CitzdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICpzdHJlYW0sIGludCBzdGF0dXMpKTsKKwwKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgb3B0YzsKKyAgaW50IGV4aXRfc3RhdHVzID0gMDsKKyAgYm9vbGVhbiBmaWxlc19naXZlbiA9IGZhbHNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworICBzdHJpbmdfbWluID0gLTE7CisgIHByaW50X2FkZHJlc3NlcyA9IGZhbHNlOworICBwcmludF9maWxlbmFtZXMgPSBmYWxzZTsKKyAgZGF0YXNlY3Rpb25fb25seSA9IHRydWU7CisgIHRhcmdldCA9IE5VTEw7CisKKyAgd2hpbGUgKChvcHRjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJhZm46b3Q6djAxMjM0NTY3ODkiLAorCQkJICAgICAgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChvcHRjKQorCXsKKwljYXNlICdhJzoKKwkgIGRhdGFzZWN0aW9uX29ubHkgPSBmYWxzZTsKKwkgIGJyZWFrOworCisJY2FzZSAnZic6CisJICBwcmludF9maWxlbmFtZXMgPSB0cnVlOworCSAgYnJlYWs7CisKKwljYXNlICdoJzoKKwkgIHVzYWdlIChzdGRvdXQsIDApOworCisJY2FzZSAnbic6CisJICBzdHJpbmdfbWluID0gaW50ZWdlcl9hcmcgKG9wdGFyZyk7CisJICBpZiAoc3RyaW5nX21pbiA8IDEpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIG51bWJlciAlc1xuIiksCisJCSAgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7CisJICAgICAgZXhpdCAoMSk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnbyc6CisJICBwcmludF9hZGRyZXNzZXMgPSB0cnVlOworCSAgYWRkcmVzc19yYWRpeCA9IDg7CisJICBicmVhazsKKworCWNhc2UgJ3QnOgorCSAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKKwkgIGlmIChvcHRhcmdbMV0gIT0gJ1wwJykKKwkgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICBzd2l0Y2ggKG9wdGFyZ1swXSkKKwkgICAgeworCSAgICBjYXNlICdvJzoKKwkgICAgICBhZGRyZXNzX3JhZGl4ID0gODsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdkJzoKKwkgICAgICBhZGRyZXNzX3JhZGl4ID0gMTA7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAneCc6CisJICAgICAgYWRkcmVzc19yYWRpeCA9IDE2OworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnVCc6CisJICB0YXJnZXQgPSBvcHRhcmc7CisJICBicmVhazsKKworCWNhc2UgJ3YnOgorCSAgcHJpbnRfdmVyc2lvbiAoInN0cmluZ3MiKTsKKwkgIGJyZWFrOworCisJY2FzZSAnPyc6CisJICB1c2FnZSAoc3RkZXJyLCAxKTsKKworCWRlZmF1bHQ6CisJICBpZiAoc3RyaW5nX21pbiA8IDApCisJICAgIHN0cmluZ19taW4gPSBvcHRjOworCSAgZWxzZQorCSAgICBzdHJpbmdfbWluID0gc3RyaW5nX21pbiAqIDEwICsgb3B0YyAtICcwJzsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKHN0cmluZ19taW4gPCAwKQorICAgIHN0cmluZ19taW4gPSA0OworCisgIGJmZF9pbml0ICgpOworICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOworCisgIGlmIChvcHRpbmQgPj0gYXJnYykKKyAgICB7CisgICAgICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7CisgICAgICBwcmludF9zdHJpbmdzICgie3N0YW5kYXJkIGlucHV0fSIsIHN0ZGluLCAwLCAwLCAwLCAoY2hhciAqKSBOVUxMKTsKKyAgICAgIGZpbGVzX2dpdmVuID0gdHJ1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKDsgb3B0aW5kIDwgYXJnYzsgKytvcHRpbmQpCisJeworCSAgaWYgKHN0cmNtcCAoYXJndltvcHRpbmRdLCAiLSIpID09IDApCisJICAgIGRhdGFzZWN0aW9uX29ubHkgPSBmYWxzZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZpbGVzX2dpdmVuID0gdHJ1ZTsKKwkgICAgICBleGl0X3N0YXR1cyB8PSAoc3RyaW5nc19maWxlIChhcmd2W29wdGluZF0pID09IGZhbHNlKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGZpbGVzX2dpdmVuID09IGZhbHNlKQorICAgIHVzYWdlIChzdGRlcnIsIDEpOworCisgIHJldHVybiAoZXhpdF9zdGF0dXMpOworfQorDAorLyogU2NhbiBzZWN0aW9uIFNFQ1Qgb2YgdGhlIGZpbGUgQUJGRCwgd2hvc2UgcHJpbnRhYmxlIG5hbWUgaXMgRklMRS4KKyAgIElmIGl0IGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEsCisgICBzZXQgYGdvdF9hX3NlY3Rpb24nIGFuZCBwcmludCB0aGUgc3RyaW5ncyBpbiBpdC4gICovCisKK3N0YXRpYyB2b2lkCitzdHJpbmdzX2Ffc2VjdGlvbiAoYWJmZCwgc2VjdCwgZmlsZWFyZykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdDsKKyAgICAgUFRSIGZpbGVhcmc7Cit7CisgIGNvbnN0IGNoYXIgKmZpbGUgPSAoY29uc3QgY2hhciAqKSBmaWxlYXJnOworCisgIGlmICgoc2VjdC0+ZmxhZ3MgJiBEQVRBX0ZMQUdTKSA9PSBEQVRBX0ZMQUdTKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3QpOworICAgICAgUFRSIG1lbSA9IHhtYWxsb2MgKHN6KTsKKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3QsIG1lbSwgKGZpbGVfcHRyKSAwLCBzeikpCisJeworCSAgZ290X2Ffc2VjdGlvbiA9IHRydWU7CisJICBwcmludF9zdHJpbmdzIChmaWxlLCAoRklMRSAqKSBOVUxMLCBzZWN0LT5maWxlcG9zLCAwLCBzeiwgbWVtKTsKKwl9CisgICAgICBmcmVlIChtZW0pOworICAgIH0KK30KKworLyogU2NhbiBhbGwgb2YgdGhlIHNlY3Rpb25zIGluIEZJTEUsIGFuZCBwcmludCB0aGUgc3RyaW5ncworICAgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbihzKS4KKworICAgUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwKKyAgIGZhbHNlIGlmIG5vdCAoc3VjaCBhcyBpZiBGSUxFIGlzIG5vdCBhbiBvYmplY3QgZmlsZSkuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RyaW5nc19vYmplY3RfZmlsZSAoZmlsZSkKKyAgICAgY29uc3QgY2hhciAqZmlsZTsKK3sKKyAgYmZkICphYmZkID0gYmZkX29wZW5yIChmaWxlLCB0YXJnZXQpOworCisgIGlmIChhYmZkID09IE5VTEwpCisgICAgeworICAgICAgLyogVHJlYXQgdGhlIGZpbGUgYXMgYSBub24tb2JqZWN0IGZpbGUuICAqLworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBUaGlzIGNhbGwgaXMgbWFpbmx5IGZvciBpdHMgc2lkZSBlZmZlY3Qgb2YgcmVhZGluZyBpbiB0aGUgc2VjdGlvbnMuCisgICAgIFdlIGZvbGxvdyB0aGUgdHJhZGl0aW9uYWwgYmVoYXZpb3Igb2YgYHN0cmluZ3MnIGluIHRoYXQgd2UgZG9uJ3QKKyAgICAgY29tcGxhaW4gaWYgd2UgZG9uJ3QgcmVjb2duaXplIGEgZmlsZSB0byBiZSBhbiBvYmplY3QgZmlsZS4gICovCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBiZmRfY2xvc2UgKGFiZmQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBnb3RfYV9zZWN0aW9uID0gZmFsc2U7CisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgc3RyaW5nc19hX3NlY3Rpb24sIChQVFIpIGZpbGUpOworCisgIGlmICghYmZkX2Nsb3NlIChhYmZkKSkKKyAgICB7CisgICAgICBiZmRfbm9uZmF0YWwgKGZpbGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICByZXR1cm4gZ290X2Ffc2VjdGlvbjsKK30KKworLyogUHJpbnQgdGhlIHN0cmluZ3MgaW4gRklMRS4gIFJldHVybiB0cnVlIGlmIG9rLCBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnMuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RyaW5nc19maWxlIChmaWxlKQorICAgICBjaGFyICpmaWxlOworeworICAvKiBJZiB3ZSB3ZXJlbid0IHRvbGQgdG8gc2NhbiB0aGUgd2hvbGUgZmlsZSwKKyAgICAgdHJ5IHRvIG9wZW4gaXQgYXMgYW4gb2JqZWN0IGZpbGUgYW5kIG9ubHkgbG9vayBhdAorICAgICBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb25zLiAgSWYgdGhhdCBmYWlscywgZmFsbCBiYWNrIHRvIHRoZQorICAgICB3aG9sZSBmaWxlLiAgKi8KKyAgaWYgKCFkYXRhc2VjdGlvbl9vbmx5IHx8ICFzdHJpbmdzX29iamVjdF9maWxlIChmaWxlKSkKKyAgICB7CisgICAgICBGSUxFICpzdHJlYW07CisKKyAgICAgIHN0cmVhbSA9IGZvcGVuIChmaWxlLCAicmIiKTsKKyAgICAgIC8qIE5vdCBhbGwgc3lzdGVtcyBwZXJtaXQgInJiIiwgc28gdHJ5ICJyIiBpZiBpdCBmYWlsZWQuICAqLworICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQorCXN0cmVhbSA9IGZvcGVuIChmaWxlLCAiciIpOworICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOworCSAgcGVycm9yIChmaWxlKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgIHByaW50X3N0cmluZ3MgKGZpbGUsIHN0cmVhbSwgKGZpbGVfcHRyKSAwLCAwLCAwLCAoY2hhciAqKSAwKTsKKworICAgICAgaWYgKGZjbG9zZSAoc3RyZWFtKSA9PSBFT0YpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisJICBwZXJyb3IgKGZpbGUpOworCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisMCisvKiBGaW5kIHRoZSBzdHJpbmdzIGluIGZpbGUgRklMRU5BTUUsIHJlYWQgZnJvbSBTVFJFQU0uCisgICBBc3N1bWUgdGhhdCBTVFJFQU0gaXMgcG9zaXRpb25lZCBzbyB0aGF0IHRoZSBuZXh0IGJ5dGUgcmVhZAorICAgaXMgYXQgYWRkcmVzcyBBRERSRVNTIGluIHRoZSBmaWxlLgorICAgU3RvcCByZWFkaW5nIGF0IGFkZHJlc3MgU1RPUF9QT0lOVCBpbiB0aGUgZmlsZSwgaWYgbm9uemVyby4KKworICAgSWYgU1RSRUFNIGlzIE5VTEwsIGRvIG5vdCByZWFkIGZyb20gaXQuCisgICBUaGUgY2FsbGVyIGNhbiBzdXBwbHkgYSBidWZmZXIgb2YgY2hhcmFjdGVycworICAgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgZGF0YSBpbiBTVFJFQU0uCisgICBNQUdJQyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZAorICAgTUFHSUNDT1VOVCBpcyBob3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBpbiBpdC4KKyAgIFRob3NlIGNoYXJhY3RlcnMgY29tZSBhdCBhZGRyZXNzIEFERFJFU1MgYW5kIHRoZSBkYXRhIGluIFNUUkVBTSBmb2xsb3cuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3RyaW5ncyAoZmlsZW5hbWUsIHN0cmVhbSwgYWRkcmVzcywgc3RvcF9wb2ludCwgbWFnaWNjb3VudCwgbWFnaWMpCisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICBGSUxFICpzdHJlYW07CisgICAgIGZpbGVfcHRyIGFkZHJlc3M7CisgICAgIGludCBzdG9wX3BvaW50OworICAgICBpbnQgbWFnaWNjb3VudDsKKyAgICAgY2hhciAqbWFnaWM7Cit7CisgIGNoYXIgKmJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmluZ19taW4gKyAxKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBmaWxlX3B0ciBzdGFydDsKKyAgICAgIGludCBpOworICAgICAgaW50IGM7CisKKyAgICAgIC8qIFNlZSBpZiB0aGUgbmV4dCBgc3RyaW5nX21pbicgY2hhcnMgYXJlIGFsbCBncmFwaGljIGNoYXJzLiAgKi8KKyAgICB0cnlsaW5lOgorICAgICAgaWYgKHN0b3BfcG9pbnQgJiYgYWRkcmVzcyA+PSBzdG9wX3BvaW50KQorCWJyZWFrOworICAgICAgc3RhcnQgPSBhZGRyZXNzOworICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ19taW47IGkrKykKKwl7CisJICBpZiAobWFnaWNjb3VudCkKKwkgICAgeworCSAgICAgIG1hZ2ljY291bnQtLTsKKwkgICAgICBjID0gKm1hZ2ljKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuOworCSAgICAgIGMgPSBnZXRjIChzdHJlYW0pOworCSAgICAgIGlmIChjID09IEVPRikKKwkJcmV0dXJuOworCSAgICB9CisJICBhZGRyZXNzKys7CisJICBpZiAoIWlzZ3JhcGhpYyAoYykpCisJICAgIC8qIEZvdW5kIGEgbm9uLWdyYXBoaWMuICBUcnkgYWdhaW4gc3RhcnRpbmcgd2l0aCBuZXh0IGNoYXIuICAqLworCSAgICBnb3RvIHRyeWxpbmU7CisJICBidWZbaV0gPSBjOworCX0KKworICAgICAgLyogV2UgZm91bmQgYSBydW4gb2YgYHN0cmluZ19taW4nIGdyYXBoaWMgY2hhcmFjdGVycy4gIFByaW50IHVwCisgICAgICAgICB0byB0aGUgbmV4dCBub24tZ3JhcGhpYyBjaGFyYWN0ZXIuICAqLworCisgICAgICBpZiAocHJpbnRfZmlsZW5hbWVzKQorCXByaW50ZiAoIiVzOiAiLCBmaWxlbmFtZSk7CisgICAgICBpZiAocHJpbnRfYWRkcmVzc2VzKQorCXN3aXRjaCAoYWRkcmVzc19yYWRpeCkKKwkgIHsKKwkgIGNhc2UgODoKKwkgICAgcHJpbnRmICgiJTdsbyAiLCAodW5zaWduZWQgbG9uZykgc3RhcnQpOworCSAgICBicmVhazsKKworCSAgY2FzZSAxMDoKKwkgICAgcHJpbnRmICgiJTdsZCAiLCAobG9uZykgc3RhcnQpOworCSAgICBicmVhazsKKworCSAgY2FzZSAxNjoKKwkgICAgcHJpbnRmICgiJTdseCAiLCAodW5zaWduZWQgbG9uZykgc3RhcnQpOworCSAgICBicmVhazsKKwkgIH0KKworICAgICAgYnVmW2ldID0gJ1wwJzsKKyAgICAgIGZwdXRzIChidWYsIHN0ZG91dCk7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGlmIChtYWdpY2NvdW50KQorCSAgICB7CisJICAgICAgbWFnaWNjb3VudC0tOworCSAgICAgIGMgPSAqbWFnaWMrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlicmVhazsKKwkgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKKwkgICAgICBpZiAoYyA9PSBFT0YpCisJCWJyZWFrOworCSAgICB9CisJICBhZGRyZXNzKys7CisJICBpZiAoISBpc2dyYXBoaWMgKGMpKQorCSAgICBicmVhazsKKwkgIHB1dGNoYXIgKGMpOworCX0KKworICAgICAgcHV0Y2hhciAoJ1xuJyk7CisgICAgfQorfQorDAorLyogUGFyc2Ugc3RyaW5nIFMgYXMgYW4gaW50ZWdlciwgdXNpbmcgZGVjaW1hbCByYWRpeCBieSBkZWZhdWx0LAorICAgYnV0IGFsbG93aW5nIG9jdGFsIGFuZCBoZXggbnVtYmVycyBhcyBpbiBDLiAgKi8KKworc3RhdGljIGludAoraW50ZWdlcl9hcmcgKHMpCisgICAgIGNoYXIgKnM7Cit7CisgIGludCB2YWx1ZTsKKyAgaW50IHJhZGl4ID0gMTA7CisgIGNoYXIgKnAgPSBzOworICBpbnQgYzsKKworICBpZiAoKnAgIT0gJzAnKQorICAgIHJhZGl4ID0gMTA7CisgIGVsc2UgaWYgKCorK3AgPT0gJ3gnKQorICAgIHsKKyAgICAgIHJhZGl4ID0gMTY7CisgICAgICBwKys7CisgICAgfQorICBlbHNlCisgICAgcmFkaXggPSA4OworCisgIHZhbHVlID0gMDsKKyAgd2hpbGUgKCgoYyA9ICpwKyspID49ICcwJyAmJiBjIDw9ICc5JykKKwkgfHwgKHJhZGl4ID09IDE2ICYmIChjICYgfjQwKSA+PSAnQScgJiYgKGMgJiB+NDApIDw9ICdaJykpCisgICAgeworICAgICAgdmFsdWUgKj0gcmFkaXg7CisgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJdmFsdWUgKz0gYyAtICcwJzsKKyAgICAgIGVsc2UKKwl2YWx1ZSArPSAoYyAmIH40MCkgLSAnQSc7CisgICAgfQorCisgIGlmIChjID09ICdiJykKKyAgICB2YWx1ZSAqPSA1MTI7CisgIGVsc2UgaWYgKGMgPT0gJ0InKQorICAgIHZhbHVlICo9IDEwMjQ7CisgIGVsc2UKKyAgICBwLS07CisKKyAgaWYgKCpwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgaW50ZWdlciBhcmd1bWVudCAlc1xuIiksIHByb2dyYW1fbmFtZSwgcyk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlIChzdHJlYW0sIHN0YXR1cykKKyAgICAgRklMRSAqc3RyZWFtOworICAgICBpbnQgc3RhdHVzOworeworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKK1VzYWdlOiAlcyBbLWFmb3ZdIFstbiBtaW4tbGVuXSBbLW1pbi1sZW5dIFstdCB7byx4LGR9XSBbLV1cblwKKyAgICAgICBbLS1hbGxdIFstLXByaW50LWZpbGUtbmFtZV0gWy0tYnl0ZXM9bWluLWxlbl0gWy0tcmFkaXg9e28seCxkfV1cblwKKyAgICAgICBbLS10YXJnZXQ9YmZkbmFtZV0gWy0taGVscF0gWy0tdmVyc2lvbl0gZmlsZS4uLlxuIiksCisJICAgcHJvZ3JhbV9uYW1lKTsKKyAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOworICBpZiAoc3RhdHVzID09IDApCisgICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKKyAgZXhpdCAoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0cmlwLjEgYi9iaW51dGlscy9zdHJpcC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODgxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy9zdHJpcC4xCkBAIC0wLDAgKzEsMTg1IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggc3RyaXAgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCisuZGUgQlAKKy5zcAorLnRpIFwtLjJpCitcKCoqCisuLgorCisuU0ggTkFNRQorc3RyaXAgXC0gRGlzY2FyZCBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzLgorCisuU0ggU1lOT1BTSVMKKy5oeSAwCisubmEKKy5UUAorLkIgc3RyaXAKKy5SQiAiW1x8IiBcLUZcIFxmSWJmZG5hbWVcZlJcIHxcIFxmQlwtXC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgorLlJCICJbXHwiIFwtSVwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgorLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlAgIlx8XSIKKy5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZQICJcfF0iCisuUkIgIltcfCIgXC1zXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbCAiXHxdIgorLlJCICJbXHwiIFwtU1xmUlwgfFwgXGZCXC1nXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWRlYnVnICJcfF0iCisuUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIgorLlJCICJbXHwiIFwteFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWFsbCAiXHxdIgorLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2FscyAiXHxdIgorLlJCICJbXHwiIFwtS1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAorLlJCICJbXHwiIFwtTlwgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIgorLlJCICJbXHwiIFwtb1wgXGZJZmlsZVxmXFIgIlx8XSIKKy5SQiAiW1x8IiBcLXBcZlJcIHxcIFxmQlwtXC1wcmVzZXJ2ZVwtZGF0ZXMgIlx8XSIKKy5SQiAiW1x8IiBcLXZcZlJcIHxcIFxmQlwtXC12ZXJib3NlICJcfF0iCisuUkIgIltcfCIgXC1WXGZSXCB8XCBcZkJcLVwtdmVyc2lvbiAiXHxdIgorLlJCICJbXHwiIFwtVlxmUlwgfFwgXGZCXC1cLWhlbHAgIlx8XSIKKy5JIG9iamZpbGVcYworXCYuXHwuXHwuCisKKy5TSCBERVNDUklQVElPTgorR05VCisuQiBzdHJpcAorZGlzY2FyZHMgYWxsIHN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGVzCisuSVIgb2JqZmlsZSAuCitUaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgbWF5IGluY2x1ZGUgYXJjaGl2ZXMuCitBdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUgbXVzdCBiZSBnaXZlbi4KKworLlAKKy5CIHN0cmlwCittb2RpZmllcyB0aGUgZmlsZXMgbmFtZWQgaW4gaXRzIGFyZ3VtZW50LAorcmF0aGVyIHRoYW4gd3JpdGluZyBtb2RpZmllZCBjb3BpZXMgdW5kZXIgZGlmZmVyZW50IG5hbWVzLgorCisuU0ggT1BUSU9OUworLlRQCisuQiAiXC1GIFxmSWJmZG5hbWUiCisuVFAKKy5CICJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUiCitUcmVhdCB0aGUgb3JpZ2luYWwgXGZJb2JqZmlsZVxmUCBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Citjb2RlIGZvcm1hdCBcZkliZmRuYW1lXGZQLCBhbmQgcmV3cml0ZSBpdCBpbiB0aGUgc2FtZSBmb3JtYXQuCisKKy5UUAorLkIgXC1cLWhlbHAKK1Nob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCisuQiBzdHJpcAorYW5kIGV4aXQuCisKKy5UUAorLkIgIlwtSSBcZkliZmRuYW1lCisuVFAKKy5CICJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lIgorVHJlYXQgdGhlIG9yaWdpbmFsIFxmSW9iamZpbGVcZlAgYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAorY29kZSBmb3JtYXQgXGZJYmZkbmFtZVxmUC4KKworLlRQCisuQiAiXC1PIFxmSWJmZG5hbWVcZlAiCisuVFAKKy5CICJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZSIKK1JlcGxhY2UgXGZJb2JqZmlsZVxmUCB3aXRoIGEgZmlsZSBpbiB0aGUgb3V0cHV0IGZvcm1hdCBcZkliZmRuYW1lXGZQLgorCisuVFAKKy5CICJcLVIgXGZJc2VjdGlvbm5hbWVcZlAiCisuVFAKKy5CICJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lIgorUmVtb3ZlIHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZQordGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIGluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUKK29iamVjdCBmaWxlIHVudXNhYmxlLgorCisuVFAKKy5CIFwtcworLlRQCisuQiBcLVwtc3RyaXBcLWFsbAorUmVtb3ZlIGFsbCBzeW1ib2xzLgorCisuVFAKKy5CIFwtUworLlRQCisuQiBcLWcKKy5UUAorLkIgXC1cLXN0cmlwXC1kZWJ1ZworUmVtb3ZlIGRlYnVnZ2luZyBzeW1ib2xzIG9ubHkuCisKKy5UUAorLkIgXC1cLXN0cmlwXC11bm5lZWRlZAorU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgorCisuVFAKKy5CIFwtTiBcZklzeW1ib2xuYW1lXGZSCisuVFAKKy5CIFwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKK1JlbW92ZSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KK21heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHN0cmlwCitvcHRpb25zLgorCisuVFAKKy5CIFwtbyBcZklmaWxlXGZSCitQdXQgdGhlIHN0cmlwcGVkIG91dHB1dCBpbiBcZklmaWxlXGZSLCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlCitleGlzdGluZyBmaWxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQsIG9ubHkgb25lIFxmSW9iamZpbGVcZlIKK2FyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQuCisKKy5UUAorLkIgXC1wCisuVFAKKy5CIFwtXC1wcmVzZXJ2ZS1kYXRlcworUHJlc2VydmUgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBmaWxlLgorCisuVFAKKy5CIFwteAorLlRQCisuQiBcLVwtZGlzY2FyZFwtYWxsCitSZW1vdmUgbm9uLWdsb2JhbCBzeW1ib2xzLgorCisuVFAKKy5CIFwtWAorLlRQCisuQiBcLVwtZGlzY2FyZFwtbG9jYWxzCitSZW1vdmUgY29tcGlsZXItZ2VuZXJhdGVkIGxvY2FsIHN5bWJvbHMuCisoVGhlc2UgdXN1YWxseSBzdGFydCB3aXRoIGBgTCcnIG9yIGBgLicnLikKKworLlRQCisuQiBcLUsgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCitDb3B5IG9ubHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCittYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCisKKy5UUAorLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKK0RvIG5vdCBjb3B5IHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgorbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggc3RyaXAgb3B0aW9ucworb3RoZXIgdGhhbiBcZkJcLUtcZlIuCisKKy5UUAorLkIgXC12CisuVFAKKy5CIFwtXC12ZXJib3NlCitWZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKK2FyY2hpdmVzLAorLkIgInN0cmlwIFwtdiIKK2xpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgorCisuVFAKKy5CIFwtVgorLlRQCisuQiBcLVwtdmVyc2lvbgorU2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIFxmQnN0cmlwXGZQIGFuZCBleGl0LgorCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAorZW50cnkgaW4gCisuQlIgaW5mbyA7CisuSVIgIlRoZSBHTlUgQmluYXJ5IFV0aWxpdGllcyIgLAorUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgorCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNkdW1wLmMgYi9iaW51dGlscy9zeXNkdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyMWU4YwotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N5c2R1bXAuYwpAQCAtMCwwICsxLDc5MCBAQAorLyogU3lzcm9mZiBvYmplY3QgZm9ybWF0IGR1bXBlci4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPi4KKworIFRoaXMgcHJvZ3JhbSByZWFkcyBhIFNZU1JPRkYgb2JqZWN0IGZpbGUgYW5kIHByaW50cyBpdCBpbiBhbgorIGFsbW9zdCBodW1hbiByZWFkYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgInN5c3JvZmYuaCIKKworI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuMCIKKworc3RhdGljIGludCBkdW1wID0gMTsKK3N0YXRpYyBpbnQgc2VnbWVudGVkX3A7CitzdGF0aWMgaW50IGNvZGU7CitzdGF0aWMgaW50IGFkZHJzaXplID0gNDsKK3N0YXRpYyBGSUxFICpmaWxlOworCitjaGFyICoKK2dldENIQVJTIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQorICAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgIGludCAqaWR4OworICAgICBpbnQgc2l6ZTsKKyAgICAgaW50IG1heDsKK3sKKyAgaW50IG9jID0gKmlkeCAvIDg7CisgIGNoYXIgKnI7CisgIGludCBiID0gc2l6ZTsKKyAgaWYgKGIgPj0gbWF4KQorICAgIHsKKyAgICAgIHJldHVybiAiKnVuZGVmaW5lZCoiOworICAgIH0KKworICBpZiAoYiA9PSAwKQorICAgIHsKKyAgICAgIC8qIEdvdCB0byB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZnJvbSBzZWxmICovCisgICAgICBiID0gcHRyW29jKytdOworICAgICAgKCppZHgpICs9IDg7CisgICAgfQorCisgICppZHggKz0gYiAqIDg7CisgIHIgPSB4Y2FsbG9jIChiICsgMSwgMSk7CisgIG1lbWNweSAociwgcHRyICsgb2MsIGIpOworICByW2JdID0gMDsKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkCitkaCAocHRyLCBzaXplKQorICAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgIGludCBzaXplOworeworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBzcGFuID0gMTY7CisKKyAgcHJpbnRmICgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IHNwYW4pCisgICAgeworICAgICAgZm9yIChqID0gMDsgaiA8IHNwYW47IGorKykKKwl7CisJICBpZiAoaiArIGkgPCBzaXplKSAKKwkgICAgcHJpbnRmICgiJTAyeCAiLCBwdHJbaSArIGpdKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIgICAiKTsKKwl9CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBzcGFuICYmIGogKyBpIDwgc2l6ZTsgaisrKQorCXsKKwkgIGludCBjID0gcHRyW2kgKyBqXTsKKwkgIGlmIChjIDwgMzIgfHwgYyA+IDEyNykKKwkgICAgYyA9ICcuJzsKKwkgIHByaW50ZiAoIiVjIiwgYyk7CisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9Cit9CisKK2ludAorZmlsbHVwIChwdHIpCisgICAgIGNoYXIgKnB0cjsKK3sKKyAgaW50IHNpemU7CisgIGludCBzdW07CisgIGludCBpOworICBzaXplID0gZ2V0YyAoZmlsZSkgLSAyOworICBmcmVhZCAocHRyLCAxLCBzaXplLCBmaWxlKTsKKyAgc3VtID0gY29kZSArIHNpemUgKyAyOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIHN1bSArPSBwdHJbaV07CisgICAgfQorCisgIGlmICgoc3VtICYgMHhmZikgIT0gMHhmZikKKyAgICB7CisgICAgICBwcmludGYgKCJTVU0gSVMgJXhcbiIsIHN1bSk7CisgICAgfQorICBpZiAoZHVtcCkKKyAgICBkaCAocHRyLCBzaXplKTsKKworICByZXR1cm4gc2l6ZSAtIDE7Cit9CisKK2JhcnJheQorZ2V0QkFSUkFZIChwdHIsIGlkeCwgZHNpemUsIG1heCkKKyAgICAgdW5zaWduZWQgY2hhciAqcHRyOworICAgICBpbnQgKmlkeDsKKyAgICAgaW50IGRzaXplOworICAgICBpbnQgbWF4OworeworICBiYXJyYXkgcmVzOworICBpbnQgaTsKKyAgaW50IGJ5dGUgPSAqaWR4IC8gODsKKyAgaW50IHNpemUgPSBwdHJbYnl0ZSsrXTsKKyAgcmVzLmxlbiA9IHNpemU7CisgIHJlcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoc2l6ZSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAgcmVzLmRhdGFbaV0gPSBwdHJbYnl0ZSsrXTsKKyAgICB9CisgIHJldHVybiByZXM7Cit9CisKK2ludAorZ2V0SU5UIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQorICAgICB1bnNpZ25lZCBjaGFyICpwdHI7CisgICAgIGludCAqaWR4OworICAgICBpbnQgc2l6ZTsKKyAgICAgaW50IG1heDsKK3sKKyAgaW50IG4gPSAwOworICBpbnQgYnl0ZSA9ICppZHggLyA4OworCisgIGlmIChieXRlID49IG1heCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaXplID09IC0yKQorICAgIHNpemUgPSBhZGRyc2l6ZTsKKyAgaWYgKHNpemUgPT0gLTEpCisgICAgc2l6ZSA9IDA7CisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAxOgorICAgICAgbiA9IChwdHJbYnl0ZV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbiA9IChwdHJbYnl0ZSArIDBdIDw8IDgpICsgcHRyW2J5dGUgKyAxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIG4gPSAocHRyW2J5dGUgKyAwXSA8PCAyNCkgKyAocHRyW2J5dGUgKyAxXSA8PCAxNikgKyAocHRyW2J5dGUgKyAyXSA8PCA4KSArIChwdHJbYnl0ZSArIDNdKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgICppZHggKz0gc2l6ZSAqIDg7CisgIHJldHVybiBuOworfQorCitpbnQKK2dldEJJVFMgKHB0ciwgaWR4LCBzaXplLCBtYXgpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgaW50ICppZHg7CisgICAgIGludCBzaXplLCBtYXg7Cit7CisgIGludCBieXRlID0gKmlkeCAvIDg7CisgIGludCBiaXQgPSAqaWR4ICUgODsKKworICBpZiAoYnl0ZSA+PSBtYXgpCisgICAgcmV0dXJuIDA7CisKKyAgKmlkeCArPSBzaXplOworCisgIHJldHVybiAocHRyW2J5dGVdID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdGhlYWRlciAobmFtZSwgY29kZSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGNvZGU7Cit7CisgIHByaW50ZiAoIlxuJXMgMHglMDJ4XG4iLCBuYW1lLCBjb2RlKTsKK30KKworc3RhdGljIGludCBpbmRlbnQ7CitzdGF0aWMgdm9pZAorcCAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoInwgIik7CisgICAgfQorICBwcmludGYgKCI+ICIpOworfQorCitzdGF0aWMgdm9pZAordGFib3V0ICgpCit7CisgIHAgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYmFycmF5ICh5KQorICAgICBiYXJyYXkgKnk7Cit7CisgIGludCB4OworICBwcmludGYgKCIlZCAoIiwgeS0+bGVuKTsKKyAgZm9yICh4ID0gMDsgeCA8IHktPmxlbjsgeCsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiglMDJ4ICVjKSIsIHktPmRhdGFbeF0sIGlzcHJpbnQgKHktPmRhdGFbeF0pID8geS0+ZGF0YVt4XSA6ICcuJyk7CisgICAgfQorICBwcmludGYgKCIpXG4iKTsKK30KKworI2RlZmluZSBTWVNST0ZGX1BSSU5UCisjZGVmaW5lIFNZU1JPRkZfU1dBUF9JTgorCisjaW5jbHVkZSAic3lzcm9mZi5jIgorCisvKiAKKyAqIEZJWE1FOiBzeXNpbmZvLCB3aGljaCBnZW5lcmF0ZXMgc3lzcm9mZi5bY2hdIGZyb20gc3lzcm9mZi5pbmZvLCBjYW4ndAorICogaGFjayB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ciBibG9jaywgd2hpY2ggaGFzIG5vIGNvbnRlbnRzLiAgU28gd2UKKyAqIGltcGxlbWVudCBvdXIgb3duIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBpbiBhbmQgcHJpbnRpbmcgb3V0IHRoZSB0cgorICogYmxvY2suCisgKi8KKworI2RlZmluZSBJVF90cl9DT0RFCTB4N2YKK3ZvaWQKK3N5c3JvZmZfc3dhcF90cl9pbigpCit7CisJY2hhciByYXdbMjU1XTsKKworCW1lbXNldChyYXcsIDAsIDI1NSk7CisJZmlsbHVwKHJhdyk7Cit9CisKK3ZvaWQKK3N5c3JvZmZfcHJpbnRfdHJfb3V0KCkKK3sKKwlpdGhlYWRlcigidHIiLCBJVF90cl9DT0RFKTsKK30KKworc3RhdGljIGludAorZ2V0b25lICh0eXBlKQorICAgICBpbnQgdHlwZTsKK3sKKyAgaW50IGMgPSBnZXRjIChmaWxlKTsKKyAgY29kZSA9IGM7CisKKyAgaWYgKChjICYgMHg3ZikgIT0gdHlwZSkKKyAgICB7CisgICAgICB1bmdldGMgKGMsIGZpbGUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHN3aXRjaCAoYyAmIDB4N2YpCisgICAgeworICAgIGNhc2UgSVRfY3NfQ09ERToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfY3MgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2NzX2luICgmZHVtbXkpOworCXN5c3JvZmZfcHJpbnRfY3Nfb3V0ICgmZHVtbXkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJVF9kbG5fQ09ERToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfZGxuIGR1bW15OworCXN5c3JvZmZfc3dhcF9kbG5faW4gKCZkdW1teSk7CisJc3lzcm9mZl9wcmludF9kbG5fb3V0ICgmZHVtbXkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJVF9oZF9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9oZCBkdW1teTsKKwlzeXNyb2ZmX3N3YXBfaGRfaW4gKCZkdW1teSk7CisJYWRkcnNpemUgPSBkdW1teS5hZmw7CisJc3lzcm9mZl9wcmludF9oZF9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2Rhcl9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kYXIgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2Rhcl9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2Rhcl9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2RzeV9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kc3kgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2RzeV9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2RzeV9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2RmcF9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kZnAgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2RmcF9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2RmcF9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2Rzb19DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kc28gZHVtbXk7CisJc3lzcm9mZl9zd2FwX2Rzb19pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2Rzb19vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2RwdF9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kcHQgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2RwdF9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2RwdF9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2Rlbl9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kZW4gZHVtbXk7CisJc3lzcm9mZl9zd2FwX2Rlbl9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2Rlbl9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2RidF9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kYnQgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2RidF9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2RidF9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2R0eV9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kdHkgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2R0eV9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2R0eV9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX3VuX0NPREU6CisgICAgICB7CisJc3RydWN0IElUX3VuIGR1bW15OworCXN5c3JvZmZfc3dhcF91bl9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X3VuX291dCAoJmR1bW15KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVRfc2NfQ09ERToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfc2MgZHVtbXk7CisJc3lzcm9mZl9zd2FwX3NjX2luICgmZHVtbXkpOworCXN5c3JvZmZfcHJpbnRfc2Nfb3V0ICgmZHVtbXkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJVF9lcl9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9lciBkdW1teTsKKwlzeXNyb2ZmX3N3YXBfZXJfaW4gKCZkdW1teSk7CisJc3lzcm9mZl9wcmludF9lcl9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2VkX0NPREU6CisgICAgICB7CisJc3RydWN0IElUX2VkIGR1bW15OworCXN5c3JvZmZfc3dhcF9lZF9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2VkX291dCAoJmR1bW15KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVRfc2hfQ09ERToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfc2ggZHVtbXk7CisJc3lzcm9mZl9zd2FwX3NoX2luICgmZHVtbXkpOworCXN5c3JvZmZfcHJpbnRfc2hfb3V0ICgmZHVtbXkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJVF9vYl9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9vYiBkdW1teTsKKwlzeXNyb2ZmX3N3YXBfb2JfaW4gKCZkdW1teSk7CisJc3lzcm9mZl9wcmludF9vYl9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX3JsX0NPREU6CisgICAgICB7CisJc3RydWN0IElUX3JsIGR1bW15OworCXN5c3JvZmZfc3dhcF9ybF9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X3JsX291dCAoJmR1bW15KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVRfZHVfQ09ERToKKyAgICAgIHsKKwlzdHJ1Y3QgSVRfZHUgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2R1X2luICgmZHVtbXkpOworCisJc3lzcm9mZl9wcmludF9kdV9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2R1c19DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kdXMgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2R1c19pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2R1c19vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2R1bF9DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kdWwgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2R1bF9pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2R1bF9vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2Rzc19DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kc3MgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2Rzc19pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2Rzc19vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2hzX0NPREU6CisgICAgICB7CisJc3RydWN0IElUX2hzIGR1bW15OworCXN5c3JvZmZfc3dhcF9oc19pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2hzX291dCAoJmR1bW15KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVRfZHBzX0NPREU6CisgICAgICB7CisJc3RydWN0IElUX2RwcyBkdW1teTsKKwlzeXNyb2ZmX3N3YXBfZHBzX2luICgmZHVtbXkpOworCXN5c3JvZmZfcHJpbnRfZHBzX291dCAoJmR1bW15KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVRfdHJfQ09ERToKKyAgICAgIHsKKwlzeXNyb2ZmX3N3YXBfdHJfaW4gKCk7CisJc3lzcm9mZl9wcmludF90cl9vdXQgKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIElUX2Rkc19DT0RFOgorICAgICAgeworCXN0cnVjdCBJVF9kZHMgZHVtbXk7CisJc3lzcm9mZl9zd2FwX2Rkc19pbiAoJmR1bW15KTsKKwlzeXNyb2ZmX3ByaW50X2Rkc19vdXQgKCZkdW1teSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmICgiR09UIEEgJXhcbiIsIGMpOworICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitvcHQgKHgpCisgICAgIGludCB4OworeworICByZXR1cm4gZ2V0b25lICh4KTsKK30KKworI2lmIDAKKworLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCisKK3N0YXRpYyB2b2lkCit1bml0X2luZm9fbGlzdCAoKQoreworICB3aGlsZSAob3B0IChJVF91bl9DT0RFKSkKKyAgICB7CisgICAgICBnZXRvbmUgKElUX3VzX0NPREUpOworCisgICAgICB3aGlsZSAoZ2V0b25lIChJVF9zY19DT0RFKSkKKwlnZXRvbmUgKElUX3NzX0NPREUpOworCisgICAgICB3aGlsZSAoZ2V0b25lIChJVF9lcl9DT0RFKSkKKwk7CisKKyAgICAgIHdoaWxlIChnZXRvbmUgKElUX2VkX0NPREUpKQorCTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisjaWYgMAorCisvKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KKworc3RhdGljIHZvaWQKK29iamVjdF9ib2R5X2xpc3QgKCkKK3sKKyAgd2hpbGUgKGdldG9uZSAoSVRfc2hfQ09ERSkpCisgICAgeworICAgICAgd2hpbGUgKGdldG9uZSAoSVRfb2JfQ09ERSkpCisJOworICAgICAgd2hpbGUgKGdldG9uZSAoSVRfcmxfQ09ERSkpCisJOworICAgIH0KK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkCittdXN0ICh4KQorICAgICBpbnQgeDsKK3sKKyAgaWYgKCFnZXRvbmUgKHgpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIldBTlRFRCAleCEhXG4iLCB4KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0YWIgKGksIHMpCisgICAgIGludCBpOworICAgICBjaGFyICpzOworeworICBpbmRlbnQgKz0gaTsKKyAgaWYgKHMpCisgICAgeworICAgICAgcCAoKTsKKyAgICAgIHByaW50ZiAocyk7CisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVyaXZlZF90eXBlICgpOworCitzdGF0aWMgdm9pZAorZHVtcF9zeW1ib2xfaW5mbyAoKQoreworICB0YWIgKDEsICJTWU1CT0wgSU5GTyIpOworICB3aGlsZSAob3B0IChJVF9kc3lfQ09ERSkpCisgICAgeworICAgICAgaWYgKG9wdCAoSVRfZHR5X0NPREUpKQorCXsKKwkgIG11c3QgKElUX2RidF9DT0RFKTsKKwkgIGRlcml2ZWRfdHlwZSAoKTsKKwkgIG11c3QgKElUX2R0eV9DT0RFKTsKKwl9CisgICAgfQorICB0YWIgKC0xLCAiIik7Cit9CisKK3N0YXRpYyB2b2lkCitkZXJpdmVkX3R5cGUgKCkKK3sKKyAgdGFiICgxLCAiREVSSVZFRCBUWVBFIik7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChvcHQgKElUX2RwcF9DT0RFKSkKKwl7CisJICBkdW1wX3N5bWJvbF9pbmZvICgpOworCSAgbXVzdCAoSVRfZHBwX0NPREUpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGZwX0NPREUpKQorCXsKKwkgIGR1bXBfc3ltYm9sX2luZm8gKCk7CisJICBtdXN0IChJVF9kZnBfQ09ERSk7CisJfQorICAgICAgZWxzZSBpZiAob3B0IChJVF9kZW5fQ09ERSkpCisJeworCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKKwkgIG11c3QgKElUX2Rlbl9DT0RFKTsKKwl9CisgICAgICBlbHNlIGlmIChvcHQgKElUX2Rlbl9DT0RFKSkKKwl7CisJICBkdW1wX3N5bWJvbF9pbmZvICgpOworCSAgbXVzdCAoSVRfZGVuX0NPREUpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGRzX0NPREUpKQorCXsKKwkgIGR1bXBfc3ltYm9sX2luZm8gKCk7CisJICBtdXN0IChJVF9kZHNfQ09ERSk7CisJfQorICAgICAgZWxzZSBpZiAob3B0IChJVF9kYXJfQ09ERSkpCisJeworCX0KKyAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHB0X0NPREUpKQorCXsKKwl9CisgICAgICBlbHNlIGlmIChvcHQgKElUX2R1bF9DT0RFKSkKKwl7CisJfQorICAgICAgZWxzZSBpZiAob3B0IChJVF9kc2VfQ09ERSkpCisJeworCX0KKyAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZG90X0NPREUpKQorCXsKKwl9CisgICAgICBlbHNlCisJYnJlYWs7CisgICAgfQorCisgIHRhYiAoLTEsICIiKTsKK30KKworI2lmIDAKKworLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCisKK3N0YXRpYyB2b2lkCitwcm9ncmFtX3N0cnVjdHVyZSAoKQoreworICB0YWIgKDEsICJQUk9HUkFNIFNUUlVDVFVSRSIpOworICB3aGlsZSAob3B0IChJVF9kcHNfQ09ERSkpCisgICAgeworICAgICAgbXVzdCAoSVRfZHNvX0NPREUpOworICAgICAgb3B0IChJVF9kc3NfQ09ERSk7CisgICAgICBkdW1wX3N5bWJvbF9pbmZvICgpOworICAgICAgbXVzdCAoSVRfZHBzX0NPREUpOworICAgIH0KKyAgdGFiICgtMSwgIiIpOworfQorCisjZW5kaWYKKworI2lmIDAKKworLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCisKK3N0YXRpYyB2b2lkCitkZWJ1Z19saXN0ICgpCit7CisgIHRhYiAoMSwgIkRFQlVHIExJU1QiKTsKKworICBtdXN0IChJVF9kdV9DT0RFKTsKKyAgb3B0IChJVF9kdXNfQ09ERSk7CisgIHByb2dyYW1fc3RydWN0dXJlICgpOworICBtdXN0IChJVF9kbG5fQ09ERSk7CisKKyAgdGFiICgtMSwgIiIpOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK21vZHVsZSAoKQoreworICBpbnQgYyA9IDA7CisgIGludCBsID0gMDsKKworICB0YWIgKDEsICJNT0RVTEUqKipcbiIpOworCisgIGRvCisgICAgeworICAgICAgYyA9IGdldGMgKGZpbGUpOworICAgICAgdW5nZXRjIChjLCBmaWxlKTsKKworICAgICAgYyAmPSAweDdmOworICAgIH0KKyAgd2hpbGUgKGdldG9uZSAoYykgJiYgYyAhPSBJVF90cl9DT0RFKTsKKworI2lmIDAKKyAgbXVzdCAoSVRfY3NfQ09ERSk7CisgIG11c3QgKElUX2hkX0NPREUpOworICBvcHQgKElUX2hzX0NPREUpOworCisgIHVuaXRfaW5mb19saXN0ICgpOworICBvYmplY3RfYm9keV9saXN0ICgpOworICBkZWJ1Z19saXN0ICgpOworCisgIG11c3QgKElUX3RyX0NPREUpOworI2VuZGlmCisgIHRhYiAoLTEsICIiKTsKKworICBjID0gZ2V0YyAoZmlsZSk7CisgIHdoaWxlIChjICE9IEVPRikKKyAgICB7CisgICAgICBwcmludGYgKCIlMDJ4ICIsIGMpOworICAgICAgbCsrOworICAgICAgaWYgKGwgPT0gMzIpCisJeworCSAgcHJpbnRmICgiXG4iKTsKKwkgIGwgPSAwOworCX0KKyAgICAgIGMgPSBnZXRjIChmaWxlKTsKKyAgICB9Cit9CisKK2NoYXIgKnByb2dyYW1fbmFtZTsKKworc3RhdGljIHZvaWQKK3Nob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKKyAgICAgRklMRSAqZmlsZTsKKyAgICAgaW50IHN0YXR1czsKK3sKKyAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOworICBleGl0IChzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAorc2hvd19oZWxwICgpCit7CisgIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKKwkgIHByb2dyYW1fbmFtZSk7CisgIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Cit9CisKK2ludAorbWFpbiAoYWMsIGF2KQorICAgICBpbnQgYWM7CisgICAgIGNoYXIgKiphdjsKK3sKKyAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7CisgIGludCBvcHQ7CisgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KKyAgeworICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAorICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAorICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KKyAgfTsKKworI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQorICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7CisjZW5kaWYKKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisgIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIHByb2dyYW1fbmFtZSA9IGF2WzBdOworICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7CisKKyAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgTlVMTCkpICE9IEVPRikKKyAgICB7CisgICAgICBzd2l0Y2ggKG9wdCkKKwl7CisJY2FzZSAnaCc6CisJICBzaG93X2hlbHAgKCk7CisJICAvKk5PVFJFQUNIRUQqLworCWNhc2UgJ1YnOgorCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKKwkgIGV4aXQgKDApOworCSAgLypOT1RSRUFDSEVEKi8KKwljYXNlIDA6CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKKwkgIC8qTk9UUkVBQ0hFRCovCisJfQorICAgIH0KKworICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCisKKyAgaWYgKG9wdGluZCA8IGFjKQorICAgIHsKKyAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOworICAgIH0KKworICBpZiAoIWlucHV0X2ZpbGUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAorCSAgICAgICBwcm9ncmFtX25hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGZpbGUgPSBmb3BlbiAoaW5wdXRfZmlsZSwgRk9QRU5fUkIpOworICBpZiAoIWZpbGUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiksCisJICAgICAgIHByb2dyYW1fbmFtZSwgaW5wdXRfZmlsZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgbW9kdWxlICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2luZm8ueSBiL2JpbnV0aWxzL3N5c2luZm8ueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE4NzM3Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvc3lzaW5mby55CkBAIC0wLDAgKzEsNDE1IEBACisleworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2V4dGVybiBjaGFyICp3b3JkOworZXh0ZXJuIGNoYXIgd3JpdGVjb2RlOworZXh0ZXJuIGludCBudW1iZXI7CitleHRlcm4gaW50IHVuaXQ7CitjaGFyIG5pY2VfbmFtZVsxMDAwXTsKK2NoYXIgKml0OworaW50IHNvZmFyOworaW50IHdpZHRoOworaW50IGNvZGU7CitjaGFyICogcmVwZWF0OworY2hhciAqb2xkcmVwZWF0OworY2hhciAqbmFtZTsKK2ludCByZGVwdGg7CitjaGFyICpsb29wIFtdID0geyIiLCJuIiwibSIsIi8qQkFEKi8ifTsKK2NoYXIgKm5hbWVzW10gPSB7IiAiLCJbbl0iLCJbbl1bbV0ifTsKK2NoYXIgKnBuYW1lc1tdPSB7IiIsIioiLCIqKiJ9OworJX0KKworCisldW5pb24geworIGludCBpOworIGNoYXIgKnM7Cit9IAorJXRva2VuIENPTkQKKyV0b2tlbiBSRVBFQVQKKyV0b2tlbiAnKCcgJyknCisldG9rZW4gPHM+IFRZUEUKKyV0b2tlbiA8cz4gTkFNRQorJXRva2VuIDxpPiBOVU1CRVIgVU5JVAorJXR5cGUgPGk+IGF0dHJfc2l6ZSAKKyV0eXBlIDxzPiBhdHRyX2Rlc2MgYXR0cl9pZCBhdHRyX3R5cGUKKyUlCisKK3RvcDogIHsKKyAgc3dpdGNoICh3cml0ZWNvZGUpCisgICAgeworICAgIGNhc2UgJ2knOgorICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9TV0FQX0lOXG4iKTsKKyAgICAgIGJyZWFrOyAKKyAgICBjYXNlICdwJzoKKyAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfcFxuIik7CisgICAgICBicmVhazsgCisgICAgY2FzZSAnZCc6CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoKKyAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfU1dBUF9PVVRcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CisgICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1BSSU5UXG4iKTsKKyAgICAgIHByaW50ZigiI2luY2x1ZGUgPHN0ZGlvLmg+XG4iKTsKKyAgICAgIHByaW50ZigiI2luY2x1ZGUgPHN0ZGxpYi5oPlxuIik7CisgICAgICBicmVhazsKKyAgICB9CisgfSAKK2l0X2xpc3QgeworICBzd2l0Y2ggKHdyaXRlY29kZSkgeworICBjYXNlICdpJzoKKyAgY2FzZSAncCc6CisgIGNhc2UgJ2cnOgorICBjYXNlICdjJzoKKyAgICBwcmludGYoIiNlbmRpZlxuIik7CisgICAgYnJlYWs7IAorICBjYXNlICdkJzoKKyAgICBicmVhazsKKyAgfQorfQorCisgIDsKKworCitpdF9saXN0OiBpdCBpdF9saXN0CisgIHwKKyAgOworCitpdDoKKwknKCcgTkFNRSBOVU1CRVIgCisgICAgICB7CisJaXQgPSAkMjsgY29kZSA9ICQzOworCXN3aXRjaCAod3JpdGVjb2RlKSAKKwkgIHsKKwkgIGNhc2UgJ2QnOgorCSAgICBwcmludGYoIlxuXG5cbiNkZWZpbmUgSVRfJXNfQ09ERSAweCV4XG4iLCBpdCxjb2RlKTsKKwkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgeyBcbiIsIGl0KTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdpJzoKKwkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19pbihwdHIpXG4iLCQyKTsKKwkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKKwkgICAgcHJpbnRmKCJ7XG4iKTsKKwkgICAgcHJpbnRmKCJjaGFyIHJhd1syNTVdO1xuIik7CisJICAgIHByaW50ZigiXHRpbnQgaWR4ID0gMCA7XG4iKTsKKwkgICAgcHJpbnRmKCJcdGludCBzaXplO1xuIik7CisJICAgIHByaW50ZigibWVtc2V0KHJhdywwLDI1NSk7XG4iKTsJCisJICAgIHByaW50ZigibWVtc2V0KHB0ciwwLHNpemVvZigqcHRyKSk7XG4iKTsKKwkgICAgcHJpbnRmKCJzaXplID0gZmlsbHVwKHJhdyk7XG4iKTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdnJzoKKwkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19vdXQoZmlsZSxwdHIpXG4iLCQyKTsKKwkgICAgcHJpbnRmKCJGSUxFICogZmlsZTtcbiIpOworCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOworCSAgICBwcmludGYoIntcbiIpOworCSAgICBwcmludGYoIlx0Y2hhciByYXdbMjU1XTtcbiIpOworCSAgICBwcmludGYoIlx0aW50IGlkeCA9IDE2IDtcbiIpOworCSAgICBwcmludGYoIlx0bWVtc2V0IChyYXcsIDAsIDI1NSk7XG4iKTsKKwkgICAgcHJpbnRmKCJcdGNvZGUgPSBJVF8lc19DT0RFO1xuIiwgaXQpOworCSAgICBicmVhazsKKwkgIGNhc2UgJ28nOgorCSAgICBwcmludGYoInZvaWQgc3lzcm9mZl9zd2FwXyVzX291dChhYmZkLHB0cilcbiIsJDIpOworCSAgICBwcmludGYoImJmZCAqIGFiZmQ7XG4iKTsKKwkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsaXQpOworCSAgICBwcmludGYoIntcbiIpOworCSAgICBwcmludGYoImludCBpZHggPSAwIDtcbiIpOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2MnOgorCSAgICBwcmludGYoInZvaWQgc3lzcm9mZl9wcmludF8lc19vdXQocHRyKVxuIiwkMik7CisJICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7CisJICAgIHByaW50Zigie1xuIik7CisJICAgIHByaW50ZigiaXRoZWFkZXIoXCIlc1wiLCBJVF8lc19DT0RFKTtcbiIsJDIsJDIpOworCSAgICBicmVhazsKKworCSAgY2FzZSAndCc6CisJICAgIGJyZWFrOworCSAgfQorCisgICAgICB9IAorCWl0X2ZpZWxkX2xpc3QgCisnKScKK3sKKyAgc3dpdGNoICh3cml0ZWNvZGUpIHsKKyAgY2FzZSAnZCc6IAorICAgIHByaW50ZigifTtcbiIpOworICAgIGJyZWFrOworICBjYXNlICdnJzoKKyAgICBwcmludGYoIlx0Y2hlY2tzdW0oZmlsZSxyYXcsIGlkeCwgSVRfJXNfQ09ERSk7XG4iLCBpdCk7CisgICAgCisgIGNhc2UgJ2knOgorCisgIGNhc2UgJ28nOgorICBjYXNlICdjJzoKKyAgICBwcmludGYoIn1cbiIpOworICB9Cit9Cis7CisKKworCitpdF9maWVsZF9saXN0OgorCQlpdF9maWVsZCBpdF9maWVsZF9saXN0CisJfAljb25kX2l0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QJCisJfAlyZXBlYXRfaXRfZmllbGQgaXRfZmllbGRfbGlzdAorCXwKKwk7CisKK3JlcGVhdF9pdF9maWVsZDogJygnIFJFUEVBVCBOQU1FCisJeworCSAgcmRlcHRoKys7CisJICBzd2l0Y2ggKHdyaXRlY29kZSkgCisJICAgIHsKKwkgICAgY2FzZSAnYyc6CisJICAgICAgaWYgKHJkZXB0aD09MSkKKwkgICAgICBwcmludGYoIlx0cHJpbnRmKFwicmVwZWF0ICUlZFxcblwiLCAlcyk7XG4iLCQzKTsKKwkgICAgICBpZiAocmRlcHRoPT0yKQorCSAgICAgIHByaW50ZigiXHRwcmludGYoXCJyZXBlYXQgJSVkXFxuXCIsICVzW25dKTtcbiIsJDMpOworCSAgICBjYXNlICdpJzoKKwkgICAgY2FzZSAnZyc6CisJICAgIGNhc2UgJ28nOgorCisJICAgICAgaWYgKHJkZXB0aD09MSkgCisJCXsKKwkgICAgICBwcmludGYoIlx0eyBpbnQgbjsgZm9yIChuID0gMDsgbiA8ICVzOyBuKyspIHtcbiIsICAgICQzKTsKKwkgICAgfQorCSAgICAgIGlmIChyZGVwdGggPT0gMikgeworCSAgICAgIHByaW50ZigiXHR7IGludCBtOyBmb3IgKG0gPSAwOyBtIDwgJXNbbl07IG0rKykge1xuIiwgICAgJDMpOworCSAgICB9CQkKKworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIG9sZHJlcGVhdCA9IHJlcGVhdDsKKyAgICAgICAgIHJlcGVhdCA9ICQzOworCX0KKworCSBpdF9maWVsZF9saXN0ICcpJyAKKworCXsKKwkgIHJlcGVhdCA9IG9sZHJlcGVhdDsKKwkgIG9sZHJlcGVhdCA9MDsKKwkgIHJkZXB0aC0tOworCSAgc3dpdGNoICh3cml0ZWNvZGUpCisJICAgIHsKKwkgICAgY2FzZSAnaSc6CisJICAgIGNhc2UgJ2cnOgorCSAgICBjYXNlICdvJzoKKwkgICAgY2FzZSAnYyc6CisJICBwcmludGYoIlx0fX1cbiIpOworCX0KKwl9CisgICAgICAgOworCisKK2NvbmRfaXRfZmllbGQ6ICcoJyBDT05EIE5BTUUKKwl7CisJICBzd2l0Y2ggKHdyaXRlY29kZSkgCisJICAgIHsKKwkgICAgY2FzZSAnaSc6CisJICAgIGNhc2UgJ2cnOgorCSAgICBjYXNlICdvJzoKKwkgICAgY2FzZSAnYyc6CisJICAgICAgcHJpbnRmKCJcdGlmICglcykge1xuIiwgJDMpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisJIGl0X2ZpZWxkX2xpc3QgJyknIAorCXsKKwkgIHN3aXRjaCAod3JpdGVjb2RlKQorCSAgICB7CisJICAgIGNhc2UgJ2knOgorCSAgICBjYXNlICdnJzoKKwkgICAgY2FzZSAnbyc6CisJICAgIGNhc2UgJ2MnOgorCSAgcHJpbnRmKCJcdH1cbiIpOworCX0KKwl9CisgICAgICAgOworCitpdF9maWVsZDoKKwknKCcgYXR0cl9kZXNjICcoJyBhdHRyX3R5cGUgYXR0cl9zaXplICcpJyBhdHRyX2lkIAorCXtuYW1lID0gJDc7IH0gCisJZW51bXMgJyknCisJeworCSAgY2hhciAqZGVzYyA9ICQyOworCSAgY2hhciAqdHlwZSA9ICQ0OworCSAgaW50IHNpemUgPSAkNTsKKwkgIGNoYXIgKmlkID0gJDc7CitjaGFyICpwID0gbmFtZXNbcmRlcHRoXTsKK2NoYXIgKnB0ciA9IHBuYW1lc1tyZGVwdGhdOworCSAgc3dpdGNoICh3cml0ZWNvZGUpIAorCSAgICB7CisJICAgIGNhc2UgJ2cnOgorCSAgICAgIGlmIChzaXplICUgOCkgCisJCXsKKwkJICAKKwkJICBwcmludGYoIlx0d3JpdGVCSVRTKHB0ci0+JXMlcyxyYXcsJmlkeCwlZCk7XG4iLAorCQkJIGlkLAorCQkJIG5hbWVzW3JkZXB0aF0sIHNpemUpOworCisJCX0KKwkgICAgICBlbHNlIHsKKwkJcHJpbnRmKCJcdHdyaXRlJXMocHRyLT4lcyVzLHJhdywmaWR4LCVkLGZpbGUpO1xuIiwKKwkJICAgICAgIHR5cGUsCisJCSAgICAgICBpZCwKKwkJICAgICAgIG5hbWVzW3JkZXB0aF0sc2l6ZS84KTsKKwkJfQorCSAgICAgIGJyZWFrOwkgICAgICAKKwkgICAgY2FzZSAnaSc6CisJICAgICAgeworCisJCWlmIChyZGVwdGggPj0gMSkKKworCQkgIHsKKwkJICAgIHByaW50ZigiaWYgKCFwdHItPiVzKSBwdHItPiVzID0gKCVzKil4Y2FsbG9jKCVzLCBzaXplb2YocHRyLT4lc1swXSkpO1xuIiwgCisJCQkgICBpZCwgCisJCQkgICBpZCwKKwkJCSAgIHR5cGUsCisJCQkgICByZXBlYXQsCisJCQkgICBpZCk7CisJCSAgfQorCisJCWlmIChyZGVwdGggPT0gMikKKwkJICB7CisJCSAgICBwcmludGYoImlmICghcHRyLT4lc1tuXSkgcHRyLT4lc1tuXSA9ICglcyoqKXhjYWxsb2MoJXNbbl0sIHNpemVvZihwdHItPiVzW25dWzBdKSk7XG4iLCAKKwkJCSAgIGlkLCAKKwkJCSAgIGlkLAorCQkJICAgdHlwZSwKKwkJCSAgIHJlcGVhdCwKKwkJCSAgIGlkKTsKKwkJICB9CisKKwkgICAgICB9CisKKwkgICAgICBpZiAoc2l6ZSAlIDgpIAorCQl7CisJCSAgcHJpbnRmKCJcdHB0ci0+JXMlcyA9IGdldEJJVFMocmF3LCZpZHgsICVkLHNpemUpO1xuIiwKKwkJCSBpZCwKKwkJCSBuYW1lc1tyZGVwdGhdLCAKKwkJCSBzaXplKTsKKwkJfQorCSAgICAgIGVsc2UgeworCQlwcmludGYoIlx0cHRyLT4lcyVzID0gZ2V0JXMocmF3LCZpZHgsICVkLHNpemUpO1xuIiwKKwkJICAgICAgIGlkLAorCQkgICAgICAgbmFtZXNbcmRlcHRoXSwKKwkJICAgICAgIHR5cGUsCisJCSAgICAgICBzaXplLzgpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ28nOgorCSAgICAgIHByaW50ZigiXHRwdXQlcyhyYXcsJWQsJWQsJmlkeCxwdHItPiVzJXMpO1xuIiwgdHlwZSxzaXplLzgsc2l6ZSU4LGlkLG5hbWVzW3JkZXB0aF0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdkJzoKKwkgICAgICBpZiAocmVwZWF0KSAKKwkJcHJpbnRmKCJcdC8qIHJlcGVhdCAlcyAqL1xuIiwgcmVwZWF0KTsKKworCQkgIGlmICh0eXBlWzBdID09ICdJJykgeworCQkgIHByaW50ZigiXHRpbnQgJXMlczsgXHQvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOworCQl9CisJCSAgZWxzZSBpZiAodHlwZVswXSA9PSdDJykgeworCQkgIHByaW50ZigiXHRjaGFyICVzKiVzO1x0IC8qICVzICovXG4iLHB0cixpZCwgZGVzYyk7CisJCX0KKwkgICAgICBlbHNlIHsKKwkJcHJpbnRmKCJcdGJhcnJheSAlcyVzO1x0IC8qICVzICovXG4iLHB0cixpZCwgZGVzYyk7CisJICAgICAgfQorCQkgIGJyZWFrOworCQljYXNlICdjJzoKKwkgICAgICBwcmludGYoInRhYm91dCgpO1xuIik7CisJCSAgcHJpbnRmKCJcdHByaW50ZihcIi8qJS0zMHMqLyBwdHItPiVzID0gXCIpO1xuIiwgZGVzYywgaWQpOworCisJCSAgaWYgKHR5cGVbMF0gPT0gJ0knKQorCQkgIHByaW50ZigiXHRwcmludGYoXCIlJWRcXG5cIixwdHItPiVzJXMpO1xuIiwgaWQscCk7CisJCSAgZWxzZSAgIGlmICh0eXBlWzBdID09ICdDJykKKwkJICBwcmludGYoIlx0cHJpbnRmKFwiJSVzXFxuXCIscHRyLT4lcyVzKTtcbiIsIGlkLHApOworCisJCSAgZWxzZSAgIGlmICh0eXBlWzBdID09ICdCJykgCisJCSAgICB7CisJCSAgcHJpbnRmKCJcdHBiYXJyYXkoJnB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKKwkJfQorCSAgICAgIGVsc2UgYWJvcnQoKTsKKwkJICBicmVhazsKKwkJfQorCX0KKworCTsKKworCithdHRyX3R5cGU6CQorCSBUWVBFIHsgJCQgPSAkMTsgfQorIAl8ICB7ICQkID0gIklOVCI7fQorCTsKKworYXR0cl9kZXNjOiAKKwknKCcgTkFNRSAnKScJCisJeyAkJCA9ICQyOyB9CisJOworCithdHRyX3NpemU6CisJIE5VTUJFUiBVTklUIAorCXsgJCQgPSAkMSAqICQyOyB9CisJOworCisKK2F0dHJfaWQ6CisJCScoJyBOQU1FICcpJwl7ICQkID0gJDI7IH0KKwl8CXsgJCQgPSAiZHVtbXkiO30KKwk7CQorCQorZW51bXM6IAorCXwgJygnIGVudW1fbGlzdCAnKScgOworCitlbnVtX2xpc3Q6CisJfAorCWVudW1fbGlzdCAnKCcgTkFNRSBOQU1FICcpJyB7IAorCSAgc3dpdGNoICh3cml0ZWNvZGUpIAorCSAgICB7CisJICAgIGNhc2UgJ2QnOgorCSAgICAgIHByaW50ZigiI2RlZmluZSAlcyAlc1xuIiwgJDMsJDQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdjJzoKKwkJcHJpbnRmKCJpZiAocHRyLT4lcyVzID09ICVzKSB7IHRhYm91dCgpOyBwcmludGYoXCIlc1xcblwiKTt9XG4iLCBuYW1lLCBuYW1lc1tyZGVwdGhdLCQ0LCQzKTsKKwkgICAgfQorCX0KKworCTsKKworCisKKyUlCisvKiBmb3VyIG1vZGVzCisKKyAgIC1kIHdyaXRlIHN0cnVjdHVyZSBkZWZpbnRpb25zIGZvciBzeXNyb2ZmIGluIGhvc3QgZm9ybWF0CisgICAtaSB3cml0ZSBmdW5jdGlvbnMgdG8gc3dhcCBpbnRvIHN5c3JvZmYgZm9ybWF0IGluCisgICAtbyB3cml0ZSBmdW5jdGlvbnMgdG8gc3dhcCBpbnRvIHN5c3JvZmYgZm9ybWF0IG91dAorICAgLWMgd3JpdGUgY29kZSB0byBwcmludCBpbmZvIGluIGh1bWFuIGZvcm0gKi8KKworaW50IHl5ZGVidWc7CitjaGFyIHdyaXRlY29kZTsKKworaW50IAorbWFpbihhYyxhdikKK2ludCBhYzsKK2NoYXIgKiphdjsKK3sKKyAgeXlkZWJ1Zz0wOworICBpZiAoYWMgPiAxKQorICAgIHdyaXRlY29kZSA9IGF2WzFdWzFdOworaWYgKHdyaXRlY29kZSA9PSAnZCcpCisgIHsKKyAgICBwcmludGYoInR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgY2hhciAqZGF0YTsgaW50IGxlbjsgfSBiYXJyYXk7IFxuIik7CisgICAgcHJpbnRmKCJ0eXBlZGVmICBpbnQgSU5UO1xuIik7CisgICAgcHJpbnRmKCJ0eXBlZGVmICBjaGFyICogQ0hBUlM7XG4iKTsKKworICB9CisgIHl5cGFyc2UoKTsKK3JldHVybiAwOworfQorCitpbnQKK3l5ZXJyb3IocykKKyAgICAgY2hhciAqczsKK3sKKyAgZnByaW50ZihzdGRlcnIsICIlc1xuIiAsIHMpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2xleC5sIGIvYmludXRpbHMvc3lzbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5NDg0MgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N5c2xleC5sCkBAIC0wLDAgKzEsNTEgQEAKKyV7CisjaW5jbHVkZSAic3lzaW5mby5oIgorY2hhciAqd29yZDsKK2ludCBudW1iZXI7CitpbnQgdW5pdDsKKworI2lmbmRlZiB5eXdyYXAKK3N0YXRpYyBpbnQgeXl3cmFwICgpIHsgcmV0dXJuIDE7IH0KKyNlbmRpZgorJX0KKyUlCisiKCIgeyByZXR1cm4gJygnO30KKyIpIiB7IHJldHVybiAnKSc7fQorIlsiIHsgcmV0dXJuICdbJzt9CisiXSIgeyByZXR1cm4gJ10nO30KKyIgIiB7IDsgfQorIjsiLiogeyA7IH0gCisiXHQiIHsgOyB9CisiXG4iIHsgOyB9CisiXCIiW15cIl0qIlwiIiB7Cit5eWx2YWwucyA9IG1hbGxvYyhzdHJsZW4gKHl5dGV4dCkpOworc3RyY3B5KHl5bHZhbC5zLCB5eXRleHQrMSk7Cit5eWx2YWwuc1tzdHJsZW4oeXlsdmFsLnMpLTFdID0gMDsKKyAgICAgICAgcmV0dXJuIE5BTUU7CisJfQorCisweFswLTlhLWZdKyB7CisgICAgICAgIHl5bHZhbC5pID0gc3RydG9sKHl5dGV4dCwwLDE2KTsKKwlyZXR1cm4gIE5VTUJFUjsKKwl9CisKK1swLTldKyB7CisgICAgICAgIHl5bHZhbC5pID0gYXRvaSh5eXRleHQpOworCXJldHVybiAgTlVNQkVSOworCX0KKworCisiYml0cyIgeyB5eWx2YWwuaSA9MSA7cmV0dXJuIFVOSVQ7fQorImJpdCIgeyB5eWx2YWwuaSA9IDE7IHJldHVybiBVTklUO30KKyJieXRlcyIgeyB5eWx2YWwuaT0gODsgcmV0dXJuIFVOSVQ7fQorImJ5dGUiIHsgeXlsdmFsLmkgPSA4OyByZXR1cm4gVU5JVDt9CisKKyJpbnQiIHsgeXlsdmFsLnMgPSAiSU5UIjsgcmV0dXJuIFRZUEU7fQorImJhcnJheSIgeyB5eWx2YWwucyA9ICJCQVJSQVkiOyByZXR1cm4gVFlQRTt9CisiY2hhcnMiIHsgeXlsdmFsLnMgPSAiQ0hBUlMiOyByZXR1cm4gVFlQRTt9CisidmFyaWFibGUiIHsgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNQkVSO30KKyJjb3VudGVkIiB7IHl5bHZhbC5pID0gLTQ7IHJldHVybiBOVU1CRVI7fQorImFkZHJzaXplIiB7IHl5bHZhbC5pID0gLTI7IHJldHVybiBOVU1CRVI7IH0KKyJzZWdzaXplIiB7IHl5bHZhbC5pID0gLTE7IHJldHVybiBOVU1CRVI7IH0KKyJjb25kIiB7IHJldHVybiBDT05EO30KKyJyZXBlYXQiIHsgcmV0dXJuIFJFUEVBVDt9CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNyb2ZmLmluZm8gYi9iaW51dGlscy9zeXNyb2ZmLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmMDAxYQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3N5c3JvZmYuaW5mbwpAQCAtMCwwICsxLDUwNCBAQAorKCJjcyIgMHgwCisgKCgic2l6ZSIpICgxIGJ5dGUpICgic2l6ZSIpKQorCisgKCgiaGQiKSAoMSBieXRlKSAoImhkIikpCisgKCgiaHMiKSAoMSBieXRlKSAoImhzIikpCisgKCgidW4iKSAoMSBieXRlKSAoInVuIikpCisgKCgidXMiKSAoMSBieXRlKSAoInVzIikpCisKKyAoKCJzYyIpICgxIGJ5dGUpICgic2MiKSkKKyAoKCJzcyIpICgxIGJ5dGUpICgic3MiKSkKKyAoKCJlciIpICgxIGJ5dGUpICgiZXIiKSkKKyAoKCJlZCIpICgxIGJ5dGUpICgiZWQiKSkKKworICgoInNoIikgKDEgYnl0ZSkgKCJzaCIpKQorICgoIm9iIikgKDEgYnl0ZSkgKCJvYiIpKQorICgoInJsIikgKDEgYnl0ZSkgKCJybCIpKQorICgoImR1IikgKDEgYnl0ZSkgKCJkdSIpKQorCisgKCgiZHBzIikgKDEgYnl0ZSkgKCJkcHMiKSkKKyAoKCJkc3kiKSAoMSBieXRlKSAoImRzeSIpKQorICgoImR0eSIpICgxIGJ5dGUpICgiZHR5IikpCisgKCgiZGxuIikgKDEgYnl0ZSkgKCJkbG4iKSkKKworICgoImRzbyIpICgxIGJ5dGUpICgiZHNvIikpCisgKCgiZHVzIikgKDEgYnl0ZSkgKCJkdXMiKSkKKyAoKCJkc3MiKSAoMSBieXRlKSAoImRzcyIpKQorICgoImRidCIpICgxIGJ5dGUpICgiZGJ0IikpCisKKyAoKCJkcHAiKSAoMSBieXRlKSAoImRwcCIpKQorICgoImRmcCIpICgxIGJ5dGUpICgiZGZwIikpCisgKCgiZGVuIikgKDEgYnl0ZSkgKCJkZW4iKSkKKyAoKCJkZHMiKSAoMSBieXRlKSAoImRkcyIpKQorCisgKCgiZGFyIikgKDEgYnl0ZSkgKCJkYXIiKSkKKyAoKCJkcHQiKSAoMSBieXRlKSAoImRwdCIpKQorICgoImR1bCIpICgxIGJ5dGUpICgiZHVsIikpCisgKCgiZHNlIikgKDEgYnl0ZSkgKCJkc2UiKSkKKworICgoImRvdCIpICgxIGJ5dGUpICgiZG90IikpKQorCisKKygiaGQiIDB4MDQKKyAoKCJtb2R1bGUgdHlwZSIpICg0IGJpdHMpICgibXQiKQorICAoKCJNVFlQRV9BQlNfTE0iIAkiMCIpCisgICAoIk1UWVBFX1JFTF9MTSIgCSIxIikKKyAgICgiTVRZUEVfT01TX09SX0xNUyIgCSIyIikKKyAgICgiTVRZUEVfVU5TUEVDIiAJIjB4ZiIpKSkKKyAoKCJzcGFyZSIpKDQgYml0cykgKCJzcGFyZTEiKSkKKyAoKCJjcmVhdGlvbiBkYXRlIikoIGNoYXJzIDEyIGJ5dGVzKSggImNkIikpCisgKCgibnVtYmVyIG9mIHVuaXRzIikgKDIgYnl0ZXMpICgibnUiKSkKKyAoKCJjb2RlIikgKDEgYnl0ZSkgKCJjb2RlIikpCisgKCgidmVyc2lvbiIpIChjaGFycyA0IGJ5dGVzKSAoInZlciIpKQorICgoImFkZHJlc3MgdXBkYXRlIikgKDEgYnl0ZSkgKCJhdSIpKQorICgoInNlZ21lbnQgaWRlbnRpZmllciIpICgxIGJpdCkgKCJzaSIpKQorICgoImFkZHJlc3MgZmllbGQgbGVuZ3RoIikgKDQgYml0cykgKCJhZmwiKSkKKyAoKCJzcGFyZSIpKDMgYml0cykgKCJzcGFyZTIiKSkKKyAoKCJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IikgKDEgYnl0ZSkgKCJzcGNzeiIpKQorICgoInNlZ21lbnQgc2l6ZSIpICAJKDEgYnl0ZSkgKCJzZWdzeiIpKQorICgoInNlZ21lbnQgc2hpZnQiKSAJKDEgYnl0ZSkgKCJzZWdzaCIpKQorICgoImVudHJ5IHBvaW50IikgCSgxIGJ5dGUpICgiZXAiKSkKKyAoY29uZCAicHRyLT5lcCIKKyAgICAgICAoY29uZCAicHRyLT5tdCAhPSBNVFlQRV9BQlNfTE0iIAorCSAgICAgKCgidW5pdCBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInVhbiIpKQorCSAgICAgKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNhIikpKQorICAgICAgIChjb25kICJzZWdtZW50ZWRfcCIKKwkgICAgICgoInNlZ21lbnQgYWRkcmVzcyIpIChzZWdzaXplIGJ5dGVzKSAoInNhZCIpKSkKKyAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCisgKCgib3MgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJvcyIpKQorICgoInN5cyBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInN5cyIpKQorICgoIm1vZHVsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1uIikpCisgKCgiY3B1IikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImNwdSIpKSkKKworCisoImhzIiAweDA1CisgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKKworCisoInVuIiAweDA2CisgKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKQorICAoKCJGT1JNQVRfTE0iICIwIikKKyAgICgiRk9STUFUX09NIiAiMSIpCisgICAoIkZPUk1BVF9PTVNfT1JfTE1TIiAiMiIpKSkKKyAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCisgKCgibnVtYmVyIG9mIHNlY3Rpb25zIikgKDIgYnl0ZXMpICgibnNlY3Rpb25zIikpCisgKCgibnVtYmVyIG9mIGV4dGVybmFsIHJlZnMiKSAoMiBieXRlcykgKCJuZXh0cmVmcyIpKQorICgoIm51bWJlciBvZiBleHRlcm5hbCBkZWZzIikgKDIgYnl0ZXMpICgibmV4dGRlZnMiKSkKKyAoKCJ1bml0IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpCisgKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQorICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgidGNkIikpCisgKCgibGlua2VyIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJsaW5rZXIiKSkKKyAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoImxjZCIpKSkKKworCisoInVzIiAweDA3CisgKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQorCisKKygic2MiIDB4MDgKKyAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQkKKyAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKKyAoKCJzZWdtZW50IGFkZHJlc3MiKSAoc2Vnc2l6ZSBieXRlcykgKCJzZWdhZGQiKSkKKyAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKKyAoKCJsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpCisgKCgiYWxpZ25tZW50IikgKGFkZHJzaXplIGJ5dGVzKSAoImFsaWduIikpCisgKCgiY29udGVudHMiKSAoNCBiaXRzKSAoImNvbnRlbnRzIikKKyAgKCgiQ09OVEVOVFNfQ09ERSIgIjAiKQorICAgKCJDT05URU5UU19EQVRBIiAiMSIpCisgICAoIkNPTlRFTlRTX1NUQUNLIiAiMiIpCisgICAoIkNPTlRFTlRTX0RVTU1ZIiAiMyIpCisgICAoIkNPTlRFTlRTX1NQRUNJQUwiICI0IikKKyAgICgiQ09OVEVOVFNfTk9OU1BFQyIgIjB4ZiIpKSkKKyAoKCJjb25jYXQiKSAoNCBiaXRzKSAoImNvbmNhdCIpCisgICgoIkNPTkNBVF9TSU1QTEUiICIwIikKKyAgICgiQ09OQ0FUX1NIQVJFREMiICIxIikKKyAgICgiQ09OQ0FUX0RVTU1ZIiAiMiIpCisgICAoIkNPTkNBVF9HUk9VUCIgIjMiKQorICAgKCJDT05DQVRfU0hBUkVEIiAiNCIpCisgICAoIkNPTkNBVF9QUklWQVRFIiAiNSIpCisgICAoIkNPTkNBVF9VTlNQRUMiICIweGYiKSkpCisgKCgicmVhZCIpICgyIGJpdHMpICgicmVhZCIpKQorICgoIndyaXRlIikgKDIgYml0cykgKCJ3cml0ZSIpKQorICgoImV4ZWMiKSAoMiBiaXRzKSAoImV4ZWMiKSkKKyAoKCJpbml0aWFsaXplZCIpICgyIGJpdHMpICgiaW5pdCIpKQorICgoIm1vZGUiKSAoMiBiaXRzKSAoIm1vZGUiKSkKKyAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCisgKCgibmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCisKKworKCJzcyIgMHgwOQorICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCisKKwkKKygiZXIiIDB4MGMKKyAoKCJzeW1ib2wgdHlwZSIpICgyIGJpdHMpICgidHlwZSIpCisgICgoIkVSX0VOVFJZIiAiMCIpCisgICAoIkVSX0RBVEEiICIxIikKKyAgICgiRVJfTk9UREVGIiAiMiIpCisgICAoIkVSX05PVFNQRUMiICIzIikpKQorICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQorICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKKwkKKworKCJlZCIgMHgxNAorICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpCisgKCgic3ltYm9sIHR5cGUiKSAoMyBiaXRzKSAoInR5cGUiKQorICAoKCJFRF9UWVBFX0VOVFJZIiAiMCIpCisgICAoIkVEX1RZUEVfREFUQSIgIjEiKQorICAgKCJFRF9UWVBFX0NPTlNUIiAiMiIpCisgICAoIkVEX1RZUEVfTk9UU1BFQyIgIjciKSkpCisgKCgic3BhcmUiKSAoNSBiaXRzKSAoInNwYXJlIikpCisgKGNvbmQgInB0ci0+dHlwZT09RURfVFlQRV9FTlRSWSB8fCBwdHItPnR5cGU9PUVEX1RZUEVfREFUQSIKKyAgICAgICAoKCJzeW1ib2wgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQorIChjb25kICJwdHItPnR5cGU9PUVEX1RZUEVfQ09OU1QiCisgICAgICAgKCgiY29uc3RhbnQgdmFsdWUiKSAoYWRkcnNpemUgYnl0ZXMpICgiY29uc3RhbnQiKSkpCisgKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQorCisKKygic2giIDB4MWEKKyAoKCJ1bml0IGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQorICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpKQorCisKKygib2IiIDB4MWMKKyAoKCJzdGFydGluZyBhZGRyZXNzIGZsYWciKSAoMSBiaXQpICgic2FmIikpCisgKCgiY29tcHJlc3Npb24gZmxhZyIpICgxIGJpdCkgKCJjcGYiKSkKKyAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKKyAoY29uZCAicHRyLT5zYWYiCisgICAgICAgKCAoInN0YXJ0aW5nIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKKyAoY29uZCAicHRyLT5jcGYiCisgICAgICAgKCgiY29tcCByZXBzIikgKGFkZHJzaXplIGJ5dGVzKSAoImNvbXByZXBzIikpKQorICgoImRhdGEiKSAoYmFycmF5IGNvdW50ZWQgYnl0ZSkgKCJkYXRhIikpKQorCQorCisoInJsIiAweDIwCisgKCgiYm91bmRhcnkgb2YgcmVsb2NhdGVhYmxlIGFyZWEiKSAoNCBiaXRzKSAoImJvdW5kYXJ5IikpCisgKCgiYWRkcmVzcyBwb2xhcml0eSIpICgxIGJpdCkgKCJhcG9sIikpCisgKCgic2VnbWVudCBudW1iZXIiKSAoMSBiaXQpICgic2VnbWVudCIpKQorICgoInNpZ24gb2YgcmVsb2NhdGlvbiIpICgxIGJpdCkgKCJzaWduIikpCisgKCgiY2hlY2sgcmFuZ2UiKSAoMSBiaXQpICgiY2hlY2siKSkKKyAoKCJyZWxvYyBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKKworICgoImJpdCBsb2MiKSAoMSBieXRlKSAoImJpdGxvYyIpKQorICgoImZpZWxkIGxlbmd0aCIpICgxIGJ5dGUpICgiZmxlbiIpKQorICgoImJjb3VudCIpICgxIGJ5dGUpICgiYmNvdW50IikpCisgKCgib3BlcmF0b3IiKSAoMSBieXRlKSAoIm9wIikKKyAgKCgiT1BfUkVMT0NfQUREUiIgIjEiKQorICAgKCJPUF9TRUNfUkVGIiAiMCIpCisgICAoIk9QX0VYVF9SRUYiICIyIikpKQorIChjb25kICJwdHItPm9wID09IE9QX0VYVF9SRUYiCisgICAgICAgKCgic3ltYm9sIG51bWJlciIpICgyIGJ5dGVzKSAoInN5bW4iKSkJKQorCQorIChjb25kICJwdHItPm9wID09IE9QX1NFQ19SRUYiCisgICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzZWNuIikpCisgICAgICAgKCgiY29uc3Qgb3Bjb2RlIikgKDEgYnl0ZSkgKCJjb3Bjb2RlX2lzXzMiKSkKKyAgICAgICAoKCJhZGRlbmQgbGVuZ3RoIikgKDEgYnl0ZSkgKCJhbGVuZ3RoX2lzXzQiKSkKKyAgICAgICAoKCJhZGRlbmQiKSAoNCBieXRlKSAoImFkZGVuZCIpKQorICAgICAgICgoInBsdXMgb3Bjb2RlIikgKDEgYnl0ZSkgKCJhb3Bjb2RlX2lzXzB4MjAiKSkpCisKKyAoY29uZCAicHRyLT5vcCA9PSBPUF9SRUxPQ19BRERSIgorICAgICAgICgoImR1bm5vIikgKDIgYnl0ZXMpICgiZHVubm8iKSkpCisKKyAoKCJlbmQiKSAgKDEgYnl0ZSkgKCJlbmQiKSkpCisJCisKKygiZHUiIDB4MzAKKyAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQorICgoIm9wdGltaXplZCIpICgxIGJpdCkgKCJvcHRpbWl6ZWQiKSkKKyAoKCJzdGFja2ZybXQiKSAoMiBiaXRzKSAoInN0YWNrZnJtdCIpKQorICgoInNwYXJlIikgKDMgYml0cykgKCJzcGFyZSIpKQorICgoInVuaXQgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQorICgoInNlY3Rpb25zIikgKDIgYnl0ZXMpICgic2VjdGlvbnMiKSkKKyAocmVwZWF0ICJwdHItPnNlY3Rpb25zIgorCSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2FuIikpCisJICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQorCSAoKCJzZWN0aW9uIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkpCisgKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQorICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgiZGF0ZSIpKSkKKworCisoImRzeSIgMHgzNAorICgoInN5bWJvbCB0eXBlIikgKDcgYml0cykgKCJ0eXBlIikKKyAgKCgiU1RZUEVfVkFSIiAiMCIpCisgICAoIlNUWVBFX0xBQiIgIjEiKQorICAgKCJTVFlQRV9QUk9DIiAiMiIpCisgICAoIlNUWVBFX0ZVTkMiICIzIikKKyAgICgiU1RZUEVfVFlQRSIgIjQiKQorICAgKCJTVFlQRV9DT05TVCIgIjUiKQorICAgKCJTVFlQRV9FTlRSWSIgIjYiKQorICAgKCJTVFlQRV9NRU1CRVIiICI3IikKKyAgICgiU1RZUEVfRU5VTSIgIjgiKQorICAgKCJTVFlQRV9UQUciICI5IikKKyAgICgiU1RZUEVfUEFDS0FHRSIgIjEwIikKKyAgICgiU1RZUEVfR0VORVJJQyIgIjExIikKKyAgICgiU1RZUEVfVEFTSyIgIjEyIikKKyAgICgiU1RZUEVfRVhDRVBUSU9OIiAiMTMiKQorICAgKCJTVFlQRV9QQVJBTUVURVIiICIxNCIpCisgICAoIlNUWVBFX0VRVUFURSIgIjE1IikKKyAgICgiU1RZUEVfVU5TUEVDIiAiMHg3ZiIpKSkKKyAoKCJhc3NpZ25tZW50IGluZm8iKSAoMSBiaXQpICgiYXNzaWduIikpCisgKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic251bWJlciIpKQorICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInNuYW1lIikpCisgKCgibmVzdGluZyBsZXZlbCIpICgyIGJ5dGVzKSAoIm5lc3RpbmciKSkKKyAoY29uZCAicHRyLT5hc3NpZ24iCisgICAgICAgKCgiYXNzaWdubWVudCB0eXBlIikgKDEgYnl0ZSkgICgiYWluZm8iKQorCSgoIkFJTkZPX1JFRyIgIjEiKQorCSAoIkFJTkZPX1NUQVRJQ19FWFRfREVGIiAiMiIpCisJICgiQUlORk9fU1RBVElDX0VYVF9SRUYiICIzIikKKwkgKCJBSU5GT19TVEFUSUNfSU5UIiAiNCIpCisJICgiQUlORk9fU1RBVElDX0NPTSIgIjUiKQorCSAoIkFJTkZPX0FVVE8iICI2IikKKwkgKCJBSU5GT19DT05TVCIgIjciKQorCSAoIkFJTkZPX1VOU1BFQyIgIjB4ZmYiKSkpCisgICAgICAgKCgiZGF0YSBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgiZGxlbmd0aCIpKQorICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCisgICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19JTlQKKyAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0NPTSIKKwkgICAgICgoInNlY3Rpb24gbnVtYmVyIikgICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkpCisgICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKKyAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0lOVAorICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfQ09NCisgICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX0FVVE8iCisJICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCisgICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fUkVHIgorCSAgICAgKCgicmVnaXN0ZXIgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJyZWciKSkpCisgICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKKwkgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX1JFRiIKKwkgICAgICgoImV4dGVybmFsIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZW5hbWUiKSkpCisgICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fQ09OU1QiCisJICAgICAoKCJjb25zdGFudCIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjb25zdGFudCIpKSkpCisgKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9NRU1CRVIiCisgICAgICAgKCgiYXNzaWdubWVudCB1bml0IikgKDEgYml0KSAoImJpdHVuaXQiKSkKKyAgICAgICAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUyIikpCisgICAgICAgKCgiZmllbGQgbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX2xlbiIpKQorICAgICAgICgoImZpZWxkIG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9vZmYiKSkKKyAgICAgICAoY29uZCAicHRyLT5iaXR1bml0IgorCSAgICAgKCgiYml0IG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9iaXRvZmYiKSkpKQorIChjb25kICJwdHItPnR5cGU9PSBTVFlQRV9FTlVNIgorICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgiZXZhbGxlbiIpKQorICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgiZXZhbHVlIikpKQorIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfQ09OU1QiCisgICAgICAgKCgidmFsdWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY3ZhbHVlIikpKQorIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfRVFVQVRFIgorICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgicXZhbGxlbiIpKQorICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgicXZhbHVlIikpCisgICAgICAgKCgiYmFzaWMgdHlwZSIpICgxIGJ5dGUpICgiYnR5cGUiKSkKKyAgICAgICAoKCJzaXplIGluZm9ybWF0aW9uIikgKGFkZHJzaXplIGJ5dGVzKSAoInNpemVpbmZvIikpCisgICAgICAgKCgic2lnbiIpICgyIGJpdHMpICgic2lnbiIpKQorICAgICAgICgoImZsb2F0aW5nIHBvaW50IHR5cGUiKSAoNiBiaXRzKSAoImZsdF90eXBlIikpKQorICgoInNvdXJjZSBmaWxlIG51bWJlciIpICgyIGJ5dGVzKSAoInNmbiIpKQorICgoInNvdXJjZSBsaW5lIG51bWJlciIpICgyIGJ5dGVzKSAoInNsbiIpKQorICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQorIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfVEFHIgorICAgICAgICgoIm1hZ2ljIikgKDEgYnl0ZSkgKCJtYWdpYyIpKSkpCisKKyAKKworKCJkdWwiIDB4NTIKKyAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQorICgoIm1heCBzcGFyZSIpICg3IGJpdHMpICgibWF4c3BhcmUiKSkKKyAoY29uZCAicHRyLT5tYXhfdmFyaWFibGUgPT0gMCIKKyAgICAgICAoKCJtYXhpbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1heCIpKQorICAgICAgICgoIm1heCBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1heG1vZGUiKSkpCisKKyAoKCJtaW4gZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1pbl92YXJpYWJsZSIpKQorICgoIm1pbiBzcGFyZSIpICg3IGJpdHMpICgibWluc3BhcmUiKSkKKyAoY29uZCAicHRyLT5taW5fdmFyaWFibGUgPT0gMCIKKyAgICAgICAoKCJtaW5pbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1pbiIpKQorICAgICAgICgoIm1pbiBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1pbm1vZGUiKSkpKQorCisKKygiZHR5IiAweDM2CisgKCgiZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCisgKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCisgKGNvbmQgIiFwdHItPmVuZCIKKyAgICAgICAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCisKKworKCJkYnQiIDB4NDQKKyAoKCJiYXNpYyB0eXBlIikgKDEgYnl0ZSkgKCJidHlwZSIpCisgICgoIkJUWVBFX1ZPSUQiICIwIikKKyAgICgiQlRZUEVfVU5ERUYiICIxIikKKyAgICgiQlRZUEVfQ0hBUiIgIjIiKQorICAgKCJCVFlQRV9JTlQiICIzIikKKyAgICgiQlRZUEVfRkxPQVQiICI0IikKKyAgICgiQlRZUEVfQklUIiAiNSIpCisgICAoIkJUWVBFX1NUUklORyIgIjYiKQorICAgKCJCVFlQRV9ERUNJTUFMIiAiNyIpCisgICAoIkJUWVBFX0VOVU0iICI4IikKKyAgICgiQlRZUEVfU1RSVUNUIiAiOSIpCisgICAoIkJUWVBFX1RZUEUiICIxMCIpCisgICAoIkJUWVBFX1RBRyIgIjExIikKKyAgICgiQlRZUEVfVU5TUEVDIiAiMHhmZiIpKSkKKyAoKCJzaXplIGluZm8iKSAoYWRkcnNpemUgYnl0ZXMpICgiYml0c2l6ZSIpKQorICgoInNpZ24iKSAoMiBiaXRzKSAoInNpZ24iKQorICAoKCJTSUdOX1NJR05FRCIgIjAiKQorICAgKCJTSUdOX1VOU0lHTkVEIiAiMSIpCisgICAoIlNJR05fVU5TUEVDIiAiMyIpKSkKKyAoKCJmbG9hdGluZyBwb2ludCB0eXBlIikgKDYgYml0cykgKCJmcHR5cGUiKQorICAoKCJGUFRZUEVfU0lOR0xFIiAiMCIpCisgICAoIkZQVFlQRV9ET1VCTEUiICIxIikKKyAgICgiRlBUWVBFX0VYVEVOREVEIiAiMiIpCisgICAoIkZQVFlQRV9OT1RTUEVDIiAiMHgzZiIpKSkKKyAoY29uZCAicHRyLT5idHlwZT09QlRZUEVfVEFHIHx8IHB0ci0+YnR5cGUgPT0gQlRZUEVfVFlQRSIKKyAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzaWQiKSkpCisgKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpCisKKygiZGFyIiAweDRlCisgKCgiZWxlbWVudCBsZW5ndGgiICkgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKQorICgoImRpbXMiKSAoMSBieXRlKSAoImRpbXMiKSkKKyAocmVwZWF0ICJwdHItPmRpbXMiCisJICgoInZhcmlhYmxlIGZsYWciKSAoMSBiaXQpICgidmFyaWFibGUiKQorCSAgKCgiVkFSSUFCTEVfRklYRUQiICIwIikKKwkgICAoIlZBUklBQkxFX1ZBUklBQkxFIiAiMSIpKSkKKworCSAoKCJzdWJzY3JpcHQgdHlwZSIpICgxIGJpdCkgKCJzdWJ0eXBlIikKKwkgICgoIlNVQl9JTlRFR0VSIiAiMCIpCisJICAgKCJTVUJfVFlQRSIgICAgIjEiKSkpCisKKwkgKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCisKKwkgKGNvbmQgInB0ci0+c3VidHlwZVtuXSA9PSBTVUJfVFlQRSIKKwkgICAgICAgKCgic3ViIHN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNpZCIpKSkKKworCSAoY29uZCAicHRyLT5zdWJ0eXBlW25dID09IFNVQl9JTlRFR0VSIgorCSAgICAgICAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQorCSAgICAgICAoKCJtYXggc3BhcmUiKSAoNyBiaXRzKSAoIm1heHNwYXJlIikpCisJICAgICAgIDs7IEZJWE1FOiBuZXh0IGZpZWxkIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBtYXhfdmFyaWFibGUsCisJICAgICAgICgoIm1heGltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWF4IikpCisKKwkgICAgICAgKCgibWluIGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtaW5fdmFyaWFibGUiKSkKKwkgICAgICAgKCgibWluIHNwYXJlIikgKDcgYml0cykgKCJtaW5zcGFyZSIpKQorCSAgICAgICA7OyBGSVhNRTogbmV4dCBmaWVsZCBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gbWluX3ZhcmlhYmxlCisJICAgICAgICgoIm1pbmltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWluIikpKSkKKyAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKKworCSAgICAgICAKKygiZHNvIiAweDNhCisgKCgiZnVuY3Rpb24gbmFtZSIpICgyIGJ5dGVzKSAoInNpZCIpKQorICgoInNwIHVwZGF0ZSBjb3VudCIpICg0IGJ5dGVzKSAoInNwdXBkYXRlcyIpKQorIChyZXBlYXQgInB0ci0+c3B1cGRhdGVzIgorCSAoKCJ1cGRhdGUgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCisJICgoIm9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJvZmZzZXQiKSkpKQorCisoImRsbiIgMHgzOAorICgoIm51bWJlciBvZiBsaW5lcyIpICgyIGJ5dGVzKSAoIm5sbiIpKQorIChyZXBlYXQgInB0ci0+bmxuIgorCSAoKCJzb3VyY2UgZmlsZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZm4iKSkKKwkgKCgic291cmNlIGxpbmUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2xuIikpCisJICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKQorCSAoKCJmcm9tIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiZnJvbV9hZGRyZXNzIikpCisJICgoInRvIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgidG9fYWRkcmVzcyIpKQorCSAoKCJjYWxsIGNvdW50IikgKDIgYnl0ZXMpICgiY2MiKSkKKwkgKQorICgoIm5lZyIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKKyAKKygiZHBwIiAweDQ2CisgKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQorICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQorIChjb25kICIhcHRyLT5lbmQiCisgICAgICAgKCgicGFyYW1zIikgKDEgYnl0ZSkgKCJwYXJhbXMiKSkKKyAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKKworKCJkZW4iIDB4NGEKKyAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCisgKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCisgKGNvbmQgIiFwdHItPmVuZCIKKyAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKKworKCJkZnAiIDB4NDgKKyAoKCJzdGFydC9lbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKKyAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKKyAoY29uZCAiIXB0ci0+ZW5kIgorICAgICAgICgoIm51bWJlciBvZiBwYXJhbWV0ZXJzIikgKDEgYnl0ZSkgKCJucGFyYW1zIikpCisgICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCisKKygiZGRzIiAweDRjCisgKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQorICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQorIChjb25kICIhcHRyLT5lbmQiCisgICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCisKKygiZHB0IiAweDUwCisgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQorICgoImR1bm5vIikgKDEgYnl0ZSkgKCJkdW5ubyIpKSkKKworKCJkc2UiIDB4NTQKKyAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCisgKCgiZHVubm8iKSAoMSBieXRlKSAoImR1bm5vIikpKQorCisoImRvdCIgMHg1NgorICgoInVua25vd24iKSAoMSBieXRlKSAoInVua25vd24iKSkpCis7IEZJWE1FOiB1bmtub3duIGZpZWxkIHNob3VsZCBiZSByZXBlYXRlZCBzeW1ib2wgbnVtYmVyPworCisKKygiZHNzIiAweDQyCisgKCgidHlwZSIpICgxIGJ5dGUpICgidHlwZSIpKQorICgoImV4dGVybmFsL2ludGVybmFsIikgKDEgYml0KSAoImludGVybmFsIikpCisgKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCisgKGNvbmQgIiFwdHItPmludGVybmFsIgorICAgICAgICggICgicGFja2FnZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicGFja2FnZSIpKSkKKyAoY29uZCAicHRyLT5pbnRlcm5hbCIKKyAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJpZCIpKSkKKyAoKCJyZWNvcmQgdHlwZSIpICgyIGJ5dGVzKSAoInJlY29yZCIpKQorICgoInJ1bGVzIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicnVsZXMiKSkKKyAoKCJudW1iZXIgb2Ygc3ltYm9scyIpICgyIGJ5dGVzKSAoIm5zeW1ib2xzIikpCisgKCgidW5rbm93biIgKSAoMiBieXRlcykgKCJmaXhtZSIpKSkKKyAgICAgCisoInBzcyIgMHg0MAorICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoImVmbiIpKQorICgoIm51bWJlciBvZiBzb3VyY2UgZmlsZXMiKSAoMiBieXRlcykgKCJucyIpKQorIChyZXBlYXQgInB0ci0+bnMiCisJICgoImRpcmVjdG9yeSByZWZlcmVuY2UgYml0IikgKDEgYml0KSAoImRyYiIpKQorCSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKKwkgKCgiY29tcGxldGVkIGZpbGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImZuYW1lIikpCisJIChjb25kICJwdHItPmRyYltuXSIgCisJICAgICAgICgoImRpcmVjdG9yeSBhcHBlcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgiZGFuIikpKSkKKyAKKyAoKCJudW1iZXIgb2YgZGlyZWN0b3JpZXMiKSAoMiBieXRlcykgKCJuZGlyIikpCisgKHJlcGVhdCAicHRyLT5uZGlyIgorCSAoKCJkaXJlY3RvcnkgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJkbmFtZSIpKSkpCisKKworOyBGSVhNRTogdGhlIHRyIGJsb2NrIGhhcyBubyBjb250ZW50cy4gc3lzaW5mbywgZXRjLiBhcmVuJ3QgcHJlcGFyZWQgCis7IHRvIGRlYWwgd2l0aCB0aGF0LgorOyAoInRyIiAweDdmKQorCisKKygiZHVzIiAweDQwCisgKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgiZWZuIikpCisgKCgibnVtYmVyIG9mIHNvdXJjZSBmaWxlcyIpICgyIGJ5dGVzKSAoIm5zIikpCisgKHJlcGVhdCAicHRyLT5ucyIKKwkgKCgiZGlyZWN0b3J5IHJlZmVyZW5jZSBiaXQiKSAoMSBiaXQpICgiZHJiIikpCisJICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQorCSAoKCJjb21wbGV0ZWQgZmlsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgiZm5hbWUiKSkKKwkgKGNvbmQgInB0ci0+ZHJiW25dIiAKKwkgICAgICAgKCgiZGlyZWN0b3J5IGFwcGVyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJkYW4iKSkpKQorICgoIm51bWJlciBvZiBkaXJlY3RvcmllcyIpICgyIGJ5dGVzKSAoIm5kaXIiKSkKKyAocmVwZWF0ICJwdHItPm5kaXIiCisJICgoImRpcmVjdG9yeSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImRuYW1lIikpKSkKKworCisoImRwcyIgMHgzMgorICgoInN0YXJ0L2VuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQorICgoImJsb2NrIHR5cGUiKSAoNyBiaXRzKSAoInR5cGUiKQorICAoKCJCTE9DS19UWVBFX0NPTVBVTklUIiAiMCIpCisgICAoIkJMT0NLX1RZUEVfUFJPQ0VEVVJFIiAiMiIpCisgICAoIkJMT0NLX1RZUEVfRlVOQ1RJT04iICIzIikKKyAgICgiQkxPQ0tfVFlQRV9CTE9DSyIgIjQiKQorICAgKCJCTE9DS19UWVBFX0JBU0lDIiAiOSIpKSkKKyAoY29uZCAiIXB0ci0+ZW5kIgorICAgICAgICgoIm9wdGltaXphdGlvbiIpICgxIGJ5dGUpICgib3B0IikpCisgICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzYW4iKSkKKyAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKKyAgICAgICAoKCJibG9jayBzaXplIikgKGFkZHJzaXplIGJ5dGVzKSAoImJsb2NrX3NpemUiKSkKKyAgICAgICAoKCJuZXN0aW5nIikgKDEgYnl0ZSkgKCJuZXN0aW5nIikpCisgICAgICAgKGNvbmQgInB0ci0+dHlwZSA9PSBCTE9DS19UWVBFX1BST0NFRFVSRSAKKwkgICAgfHwgcHRyLT50eXBlID09IEJMT0NLX1RZUEVfRlVOQ1RJT04iCisJICAgICAoKCJyZXR1cm4gYWRkcmVzcyIpICgxIGJpdCkgKCJyZXRhZGRyIikpCisJICAgICAoKCJpbnRlcnJ1cHQgZnVuY3Rpb24gZmxhZyIpICgxIGJpdCkgKCJpbnRyZmxhZyIpKQorCSAgICAgKCgic3RhY2sgdXBkYXRlIGZsYWciKSAoMSBiaXQpICgic3RhY2tmbGFnIikpCisJICAgICAoKCJpbnRyYSBwYWdlIEpNUCIpICgxIGJpdCkgKCJpbnRycGFnZWptcCIpKQorCSAgICAgKCgic3BhcmUiKSAoNCBiaXRzKSAoInNwYXJlIikpKQorICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQorCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEwNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZwpAQCAtMCwwICsxLDU4NSBAQAorMTk5OS0wMy0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IFJlbW92ZSBGUjMwIHNwZWNpZmljIGNvbXBvbm50cy4KKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IFJlbW92ZSBSRUxBIHNwZWNpZmljIGNvbXBvbmVudHMuCisKKzE5OTktMDItMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IERvIG5vdCBhc3N1bWUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgNC4KKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnI6IERvIG5vdCBhc3N1bWUgcmVsYSdzIGFyZSBiZWluZyB1c2VkLiAKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cDogZGlzYWJsZSB0ZXN0cyBmb3Igbm9uIEVMRiBiYXNlZAorCXRhcmdldHMuCisKKzE5OTktMDItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBBbWVuZCB0byBtYXRjaCBuZXcgcmVhZGVsZiBvdXRwdXQuCisJKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBEbyBub3QgYXNzdW1lIHRoYXQgUkVMQXMgd2lsbCBiZSB1c2VkLgorCisxOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvZGVmYXVsdC5leHA6IEFkZCBkZWZpbml0aW9ucyBvZiBSRUFERUxGIGFuZCBSRUFERUxGRkxBR1MuCisKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cDogTmV3IGZpbGU6IFJlYWRlbGYgdGVzdHMKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmg6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtaCcKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtUycKKwkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnNzOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXMnCisJKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXInCisJKiBiaW51dGlscy1hbGwvcmVhZGVsZi53aTogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC13aScKKworV2VkIERlYyAgOSAxOToxMTozOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCAoY29weV9leGVjdXRhYmxlKTogRXhwZWN0IGNvbXBhcmlzb24KKwlmYWlsdXJlIGZvciBtaXBzKi0qLWVsZi4KKworRnJpIE9jdCAxNiAyMjo1NzoxMiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogZml4ICJubyBzeW1ib2xzIiBtZXNzYWdlLgorCitUdWUgSnVsIDI4IDE1OjE0OjA0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBLZWVwICJtYWluIiBhbmQgIl9tYWluIiBmb3Igc3RyaXAgd2l0aAorCXNhdmluZyBzeW1ib2wgdGVzdHMuICBMb29rIGZvciBlaXRoZXIgIm1haW4iIG9yICJfbWFpbiIgaW4gdGhlIG91dHB1dAorCWZpbGUuICBGaXggdGVzdCBmb3IgIm5vIHN5bWJvbHMiIGluIHRoZSBvdXRwdXQgZmlsZS4KKworMTk5OC0wNy0yMiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogUG9saXNoIG91dHB1dCBhYm91dCBmYWlsIGZvciBvYmpjb3B5CisJKHNpbXBsZSBjb3B5KSwgc3RyaXAgd2l0aC93aXRob3V0IHNhdmluZyBhIHN5bWJvbCBmb3Igb2JqZWN0IGZpbGUKKwlhbmQgZXhlY3V0YWJsZS4KKworV2VkIEp1bCAgMSAxNjoyNzo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFSTSBzaW1wbGUgb2JqY29weSBub3cgcGFzc2VzLgorCitXZWQgSnVuIDI0IDA5OjIwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogTG9vayBmb3IgJy5kYXRhJyByYXRoZXIgdGhhbiAnZGF0YScKKwl3aGVuIHBhcnNpbmcgb3V0cHV0IG9mIG9iamR1bXAgLWguCisJKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IExvb2sgZm9yICcuZGF0YScgcmF0aGVyIHRoYW4gJ2RhdGEnIHdoZW4KKwlwYXJzaW5nIG91dHB1dCBvZiBzaXplIC1BLgorCisxOTk4LTA3LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KKworCSogb2JqY29weS5leHA6IFR3byBuZXcgdGVzdHMgLSBzdHJpcCBvYmplY3QgZmlsZSB3aXRoIHNhdmluZyBhCisJc3ltYm9sIGFuZCBzdHJpcCBleGVjdXRhYmxlIGZpbGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wuCisKK0ZyaSBNYXkgMjkgMTQ6NTA6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERvbid0IHhmYWlsIHRoZSBzaW1wbGUgb2JqY29weSB0ZXN0CisJd2hlbiBjcm9zcyBjb21waWxpbmcuCisKK1RodSBOb3YgIDYgMTQ6MzI6MzcgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGxpYi91dGlscy1saWIuZXhwOiBUZW1wb3JhcnkgZGVmaW5pdGlvbiBvZiB0YXJnZXRfYXNzZW1ibGUgYW5kCisgCWRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHNvIHRoYXQgdGVzdGluZyBjYW4gd29yayB3aXRoIG9sZGVyCisgCWRlamFnbnUgdmVyc2lvbnMuCisKK1dlZCBTZXAgMjQgMTI6MDk6MTUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cChzdHJpcF9leGVjdXRhYmxlKTogTWFrZSBhIG5ldyBjb3B5IG9mCisgCXRoZSBleGVjdXRhYmxlIGJlaW5nIHRlc3RlZC4KKworTW9uIFNlcCAxNSAyMToyNToyMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDb21waWxlIHRoZSBleGVjdXRhYmxlcyB0byBiZSB0ZXN0ZWQKKyAJb24gdGhlIHRhcmdldCB3aXRoIGEgc3RhdHVzIHdyYXBwZXIgKGFzIG5lY2Vzc2FyeSkuCisKKwkqIGJpbnV0aWxzLWFsbC9hci5leHA6IElmIHRlc3Rpbmcgb24gYSByZW1vdGUgaG9zdCwgZG9uJ3QgYm90aGVyCisgCWxvb2tpbmcgb24gdGhlIGxvY2FsIGhvc3QgZm9yIHRoZSBwcm9ncmFtIGJlaW5nIHRlc3RlZC4gVXNlIHRoZQorIAljb3JyZWN0IGZpbGVuYW1lcyBvbiB0aGUgcmVtb3RlIGhvc3QuCisKKwkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IERpdHRvLgorCisJKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgorCisJKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgorIAkoY3B1c19leHBlY3RlZCk6IEFkZCB0aGUgdGFyZ2V0IENQVSB0byB0aGUgcmVnZXhwIG9mIENQVXMgdG8gYmUKKyAJZXhwZWN0ZWQsIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuCisKK1RodSBBdWcgMjggMDk6NTc6MjcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogQWRkIGFyYy4KKworVHVlIEF1ZyAgNSAwMDowMzoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9vayBmb3Igbm0tbmV3IGFuZCBzdHJpcC1uZXcuCisKK1R1ZSBKdW4gIDMgMTc6MTI6NTQgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIGV4cGVjdF9iZWZvcmUgc3RhdGVtZW50LgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERvbid0IHVzZSBnbG9iYWwgZXhlY19vdXRwdXQgdmFyaWFibGU7CisgCXRoZSBvdXRwdXQgaXMgcmV0dXJuZWQgZnJvbSByZW1vdGVfbG9hZCBpbnN0ZWFkLgorCitNb24gTWF5IDEyIDIyOjE0OjIwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHAoc3RyaXBfdGVzdCk6IFRlc3RzIHRoYXQKKwlmYWlsIHRvIGNvbXBpbGUgYXJlIHVudGVzdGVkLCBub3QgdW5yZXNvbHZlZC4KKwkoY29weV9zZXR1cCk6IERpdHRvLgorCisJKiBsaWIvdXRpbHMtbGliLmV4cChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogQ2FsbAorCXRhcmdldF9hc3NlbWJsZSBpbnN0ZWFkIG9mIHRhcmdldF9jb21waWxlLgorCitXZWQgQXByIDMwIDIwOjM3OjUxIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJQ2hhbmdlcyB0byBzdXBwb3J0IG11bHRpbGliIGFuZCByZW1vdGUgaG9zdGVkIHRlc3RpbmcsIGFsb25nIHdpdGgKKyAJZ2VuZXJhbCBjbGVhbnVwcyBhbmQgc2ltcGxpZmljYXRpb25zLgorCisJKiBsaWIvdXRpbHMtbGliLmV4cChiaW51dGlsX3ZlcnNpb24pOiBVc2UgcmVtb3RlX2V4ZWMuCisJKGRlZmF1bHRfYmludXRpbHNfcnVuKTogRGl0dG8uCisJKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQ7IGNhbGwKKyAJdGFyZ2V0X2NvbXBpbGUgdG8gYWN0dWFsbHkgZG8gdGhlIGFzc2VtYmx5LgorCShkZWZhdWx0X2JpbnV0aWxzX2NvbXBpbGUsZGVmYXVsdF9iaW51dGlsc19yZW1vdmUscHJ1bmVfd2FybmluZ3MpOgorIAlEZWxldGUuCisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIEFTIGFuZCBBU0ZMQUdTLgorCShiaW51dGlsc19jb21waWxlLGJpbnV0aWxzX3JlbW92ZSk6IERlbGV0ZS4KKwkoYmludXRpbHNfYXNzZW1ibGUpOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQuCisKKwkqIGJpbnV0aWxzLWFsbC9hci5leHA6IFNlZSBpZiB3ZSdyZSBydW5uaW5nIHRoZSB0ZXN0cyBvbgorCWEgcmVtb3RlIGhvc3QsIGFuZCBkb3dubG9hZC91cGxvYWQgZmlsZXMgYXMgYXBwcm9wcmlhdGUuCisJUmVwbGFjZSBjYWxscyB0byBiaW51dGlsc19yZW1vdmUgd2l0aCByZW1vdGVfZmlsZS4gUmVwbGFjZQorCWNhbGxzIHRvIGJpbnV0aWxzX2NvbXBpbGUgd2l0aCB0YXJnZXRfY29tcGlsZS4gUmVtb3ZlIGluaXRpYWwKKwlhcmd1bWVudCB0byBiaW51dGlsc19hc3NlbWJsZS4gVXNlIHJlbW90ZV9sb2FkIHRvIGV4ZWN1dGUKKwlwcm9ncmFtcyBvbiB0aGUgdGFyZ2V0LgorCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6ICBEaXR0by4KKwkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogIERpdHRvLgorCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBEaXR0by4KKworTW9uIEFwciAxNCAxMjozNjo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9hci5leHAgKGxvbmdfZmlsZW5hbWVzKTogQ2hlY2sgZm9yIGEgZmlsZSBzeXN0ZW0KKwl3aXRoIGEgMTQgY2hhcmFjdGVyIGZpbGUgbmFtZSBsZW5ndGggbGltaXQuCisKK1R1ZSBBcHIgIDEgMDk6NTI6MTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEhhbmRsZSBkMTB2LgorCitGcmkgRmViICA3IDE2OjQ1OjM0IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvYXIuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZgorCXBydW5lX3N5c3RlbV9jcnVkLgorCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4KKworV2VkIEphbiAyOSAwMDoxNjo0MyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL25tLmV4cDogVXNlIC8gYmV0d2VlbiAkc3JjZGlyIGFuZCAkc3ViZGlyLgorCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4KKwkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRGl0dG8uCisJKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgorCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHA6IERpdHRvLgorCQorCitXZWQgT2N0IDE2IDIyOjU3OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBBZGQgbW4xMDIwMCBhbmQgbW4xMDMwMCB0byBleHBlY3RlZAorCWNwdXMgbGlzdC4KKworVHVlIE9jdCAgMSAxNTowNjo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYi91dGlscy1saWIuZXhwIChiaW51dGlsX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgorCXByaW50aW5nLgorCitTdW4gQXVnICA0IDIyOjI1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBGaXggZW5kIG9mIGxpbmUgbWF0Y2hpbmcgaW4gc3JlYyB0ZXN0cworCXRvIHdvcmsgd2l0aCBUQ0wgNy41LgorCitTYXQgSnVuIDI5IDEyOjUxOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBTaW1wbGUgY29weSB0ZXN0IHdvcmtzIGZvciBpOTYwIGIub3V0CisJdGFyZ2V0cy4KKworTW9uIEp1biAyNCAxNDozMzowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogT24gT1NGLzEsIHRoZSBzaW1wbGUgY29weSB0ZXN0IHdpbGwKKwlzdWNjZWVkIHdpdGggZ2FzLCBhbmQgZmFpbCB3aXRoIC9iaW4vYXMsIHNvIG1hcmsgaXQgYXMgYW4gZXhwZWN0ZWQKKwlmYWlsdXJlIG9ubHkgaWYgaXQgZmFpbHMuCisKK1R1ZSBNYXIgMjYgMTY6NTU6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE5vIGxvbmdlciBleHBlY3QgYWRqdXN0LXNlY3Rpb24tdm1hCisJdGVzdCB0byBmYWlsIGZvciBocHBhKi0qLXByb2VsZiouCisKK01vbiBNYXIgMTEgMDg6MjU6MTQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IExvb2sgZm9yICIkQ09ERSQiLCBub3QganVzdCAiQ09ERSIuCisKK1dlZCBKYW4gMzEgMTE6NTU6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBhZGp1c3Qtc2VjdGlvbi12bWEgdGVzdHMgdG8KKwlmYWlsIGZvciBocHBhKi0qLXByb2VsZiogdGFyZ2V0cy4KKworVGh1IEphbiAyNSAxMzo1MzowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBvYmpkdW1wIC1oIGZvcm1hdCBjaGFuZ2UuCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IExpa2V3aXNlLgorCitNb24gSmFuIDE1IDE4OjE0OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBVc2UgdGhlIGxtYSwgbm90IHRoZSB2bWEsIHdoZW4gdGVzdGluZworCWFkZHJlc3MgYWRqdXN0bWVudHMuCisKK0ZyaSBEZWMgMTUgMTY6MzE6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBvYmpkdW1wIC1pIHRlc3QgZm9yIGN1cnJlbnQKKwlvYmpkdW1wIG91dHB1dC4KKworTW9uIE5vdiAyNyAxNToxNTowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ29ycmVjdCBmYWlsIGNhbGxzIHRvIGFsd2F5cyB1c2UgdGhlCisJc2FtZSBzdHJpbmcgYXMgdGhlIHBhc3MgY2FsbC4KKworV2VkIE5vdiAyMiAxMzoxODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYi91dGlscy1saWIuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERpc2NhcmQgLWcgLU8gd2FybmluZ3MKKwlmcm9tIG5hdGl2ZSBjb21waWxlcnMgb24gT1NGLzEgYW5kIFN1bk9TLgorCitGcmkgTm92IDE3IDEwOjM2OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfY29tcGlsZXI6IENoYW5nZSBlcnJvcgorCW1lc3NhZ2UgdG8gc2F5IGNvbXBpbGF0aW9uIHJhdGhlciB0aGFuIGFzc2VtYmx5LgorCitXZWQgTm92IDE1IDE4OjM0OjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IFNpbXBsZSBjb3B5IHRlc3QgZG9lcyBhcHBlYXIgdG8gd29yaworCW9uIGkqODYtc3ZyNC4KKworV2VkIE5vdiAxNSAxMjoxOToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogSWYgYXNzZW1ibHkgZmFpbHMsIGNhbGwgdW5yZXNvbHZlZC4KKwlUZXN0IHJ1bm5pbmcgb2JqY29weSBhbmQgc3RyaXAgb24gYSBmaW5hbCBleGVjdXRhYmxlLgorCSogYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmM6IE5ldyBmaWxlLgorCSogY29uZmlnL2RlZmF1bHQuZXhwIChTVFJJUCwgU1RSSVBGTEFHUyk6IERlZmluZS4KKwkoYmludXRpbHNfY29tcGlsZSk6IE5ldyBwcm9jZWR1cmUuCisJKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19jb21waWxlKTogTmV3IHByb2NlZHVyZS4KKworRnJpIE5vdiAgMyAxMzoyMjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IERvbid0IHVzZSB2ZXJib3NlCisJLWxvZywgcmV2ZXJ0aW5nIHBhcnQgb2YgT2N0IDIgY2hhbmdlLgorCitXZWQgTm92ICAxIDE1OjA5OjU3IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yCisJbTY4Ki1tb3Rvcm9sYS1zeXN2KiBhbmQgbTg4Ki1tb3Rvcm9sYS1zeXN2Ki4KKworV2VkIE9jdCAgNCAxNDozODozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIFhDT0ZGLgorCitNb24gT2N0ICAyIDEyOjQxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL2FyLmV4cDogTmV3IGZpbGUuCisJKiBiaW51dGlscy1hbGwvYmludGVzdC5zOiBNYWtlIHRleHRfc3ltYm9sIGFuZCBkYXRhX3N5bWJvbCBnbG9iYWwuCisJQWRkIG5ldyBzdGF0aWMgc3ltYm9scyBzdGF0aWNfdGV4dF9zeW1ib2wgYW5kIHN0YXRpY19kYXRhX3N5bWJvbC4KKwkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkanVzdCBhY2NvcmRpbmdseS4KKwkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoQVIpOiBTZXQgaWYgbm90IHNldC4KKwkoYmludXRpbHNfcmVtb3ZlKTogTmV3IHByb2NlZHVyZS4KKwkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IENhbGwKKwlwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBwcm9ncmFtIG91dHB1dC4gIFVzZSB2ZXJib3NlIC1sb2cgaW5zdGVhZCBvZgorCWJvdGggdmVyYm9zZSBhbmQgc2VuZF9sb2cuCisJKGRlZmF1bHRfYmludXRpbHNfcmVtb3ZlKTogTmV3IHByb2NlZHVyZS4KKworCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBDYWxsCisJcHJ1bmVfc3lzdGVtX2NydWQgb24gYXNzZW1ibGVyIG91dHB1dC4KKworVHVlIFNlcCAyNiAxNDowNzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3Igc2ltcGxlIGNvcHkgdGVzdAorCWZvciBpMzg2IENPRkYgdGFyZ2V0cy4KKworV2VkIFNlcCAxMyAxMzoyMDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYi91dGlscy1saWIuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBjbXAgb3V0cHV0LgorCitTYXQgQXVnIDE5IDE3OjM4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgeGZhaWwgZm9yIGkqODYtKi1hb3V0KiBmb3Igc2ltcGxlCisJY29weSB0ZXN0LgorCitXZWQgQXVnIDE2IDE2OjUyOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL25tLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtaXBzKi1zb255LWJzZCogZm9yCisJdGVzdHMgd2hpY2ggZmFpbCBvbiBFQ09GRiB0YXJnZXRzLgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENoYW5nZSBpKjg2LSotbGludXggeGZhaWwgZm9yIHNpbXBsZQorCWNvcHkgdGVzdCB0byBjaGVjayBmb3IgaSo4Ni0qLWxpbnV4YW91dCogaW5zdGVhZC4KKworVHVlIEF1ZyAgOCAxNzo0ODozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBhMjlrLSotdnh3b3JrcyoKKwlmb3Igc2ltcGxlIGNvcHkgdGVzdC4KKworVHVlIEp1bCAyNSAxMTo1NzoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2hhbmdlIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weQorCXRlc3QgZnJvbSBpOTYwLSotdnh3b3JrczUuMSB0byBpOTYwLSotdnh3b3JrcyouCisKK01vbiBKdWwgMTAgMTI6MjU6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgejgqLSotY29mZiBmb3IKKwlzaW1wbGUgY29weSB0ZXN0LgorCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogQWRkIHo4MDAxIGFuZCB6ODAwMi4KKworU3VuIE1heSAyMSAyMDozMjo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgKGFkZGVuZGJ1Zyk6IEhhbmRsZSBQQSBFTEYgdGFyZ2V0cworCXRvby4KKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCAoc2ltcGxlIGNvcHkpOiBEb24ndCBleHBlY3QgUEEgRUxGCisJdGFyZ2V0cyB0byBmYWlsLgorCitUdWUgQXByICA0IDE0OjUyOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBiaW51dGlscy1hbGwvaHBwYTogUmVuYW1lZCBmcm9tIGJpbnV0aWxzLWhwcGEuCisKK1dlZCBNYXIgMjkgMTI6MDI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAorCWZvciBoODUwMC0qLWhtcyBhbmQgaDg1MDAtKi1jb2ZmLgorCitUdWUgTWFyIDI4IDExOjE4OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKKwlmb3IgbTY4Ki1lcmljc3Nvbi1vc2UgYW5kIG04OCotKi1jb2ZmLgorCitNb24gTWFyIDI3IDExOjI3OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKKwlmb3IgbTY4Ki0qLXZ4d29ya3MqLgorCitGcmkgTWFyIDI0IDExOjQ0OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtaHBwYS9vYmpkdW1wLmV4cDogQ29ycmVjdCBocHBhKi0qLSogY2hlY2suCisKK1R1ZSBNYXIgMjEgMTA6NDg6NDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGJpbnV0aWxzLWhwcGEvYWRkZW5kYnVnLnM6IE5ldyB0ZXN0Y2FzZS4KKwkqIGJpbnV0aWxzLWhwcGEvb2JqZHVtcC5leHA6IFJ1biBpdC4KKworTW9uIE1hciAyMCAxMTozMTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IFF1b3RlIGFueSBkb2xsYXIgc2lnbnMKKwlpbiBwcm9nYXJncyBiZWZvcmUgcGFzc2luZyBpdCB0byBleGVjLgorCitGcmkgTWFyIDE3IDE2OjM5OjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvaHBwYS5zZWQ6IFNlZCBzY3JpcHQgdG8gdHJhbnNmb3JtIGJpbnRlc3QucyBpbnRvIHByb3BlcgorCVBBIGFzc2VtYmx5IGNvZGUuCisJKiBiaW51dGlscy1hbGwvbm0uZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLgorCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLiAgRXhwZWN0CisJc2ltcGxlIGNvcHkgdG8gZmFpbC4KKwkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4gIEhhbmRsZQorCSJDT0RFIiBhcyBhIHNlY3Rpb24gbmFtZS4KKwkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4KKwkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogRm9yICJocHBhKi0qLSoiLAorCXJ1biB0aGUgYXNzZW1ibHkgdGhyb3VnaCBhIHNlZCBzY3JpcHQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlCisJYXNzZW1ibGVyLgorCitXZWQgTWFyIDE1IDE2OjQ3OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBGb3JjZSBzZWN0aW9uIHNpemVzIHRvIGJlIGludGVycHJldGVkCisJaW4gaGV4LiAgQ2hhbmdlIG9iamR1bXAgLWggZmFpbHVyZSBtb2RlIHRvIGFsd2F5cyB1c2UgdGhlIHNhbWUKKwlzdHJpbmcuCisKK1RodSBKYW4gIDUgMTM6MDE6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvbm0uZXhwOiBKdXN0IGNoZWNrIGZvciBpcml4NCosIHJhdGhlciB0aGFuCisJaXJpeFxbMC00XF0qLCB0byBhdm9pZCBEZWphR251IGJ1Zy4KKworVGh1IERlYyAxNSAxOTozNTozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBzaW1wbGUtb2JqY29weSB0ZXN0IHRvIGZhaWwKKwlmb3IgdmFyaW91cyBvdGhlciB0YXJnZXRzIGZvciB3aGljaCBnYXMgZG9lc24ndCB1c2UgYmZkOiBzaC1obXMsCisJbTY4ay1ocHV4LCBtNjhrLXN1bm9zLCBtNjhrLWNvZmYsIGkzODYtbGludXgsIGEyOWstdWRpLCBhMjlrLWNvZmYsCisJaTk2MC12eHdvcmtzNS4xLCBpOTYwLWNvZmYsIGg4MzAwLWhtcywgaDgzMDAtY29mZi4KKworV2VkIERlYyAxNCAxNTo1NDo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IFNraXAgdGVzdHMgcmVxdWlyaW5nIGJpbnRlc3QubyBvbiBocHBhLAorCXNpbmNlIGl0IChjb3JyZWN0bHkpIGdlbmVyYXRlcyBzeW50YXggZXJyb3JzIG9uIHRoYXQgcGxhdGZvcm0uCisJKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgorCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERpdHRvLiAgQWxzbywgbW92ZSBzZXR1cF94ZmFpbCBmb3IKKwlzaC1jb2ZmIHRvIGJyYW5jaCB3aGVyZSBvYmpjb3B5IGV4ZWN1dGlvbiBwcm9kdWNlZCBubyBlcnJvcgorCW1lc3NhZ2VzLiAgRXhwZWN0IGZhaWx1cmUgZm9yIGhwMzAwIGFsc28uCisKK1RodSBEZWMgIDggMTQ6MzY6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogTmV3IHZhcmlhYmxlLCB0YWtlbgorCWZyb20gb2JqZHVtcCAtaSB0ZXN0LCBhZGRlZCBuczMyayBhbmQgcG93ZXJwYywgc29ydGVkLgorCShvYmpkdW1wIC1pLCAtZiB0ZXN0cyk6IFVzZSAkY3B1c19leHBlY3RlZC4KKworCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBGb3Igc2ltcGxlLWNvcHkgdGVzdCwgZXhwZWN0IGZhaWx1cmUKKwlmb3Igc2gtY29mZi4KKworVHVlIE9jdCAyNSAxNjowMDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRqdXN0IC0tYWRqdXN0LXNlY3Rpb24tdm1hIHRlc3RzIGZvcgorCW5ldyBTLXJlY29yZCBzZWN0aW9uIGhhbmRsaW5nLgorCitUdWUgT2N0IDE4IDExOjE4OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMtYWxsL25tLmV4cDogbm0gd2l0aCBubyBhcmd1bWVudHMgYW5kIG5tIC1QIGRvIG5vdCB3b3JrCisJYXMgZXhwZWN0ZWQgb24gRUNPRkYgdGFyZ2V0czsgYWRkIGNhbGxzIHRvIHNldHVwX3hmYWlsLgorCisJKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE5ldyBmaWxlLgorCSogY29uZmlnL2RlZmF1bHQuZXhwOiBJbml0aWFsaXplIE9CSkNPUFkgYW5kIE9CSkNPUFlGTEFHUy4KKworRnJpIE9jdCAxNCAxNDo0NjoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwlSZXdyaXRlIHRlc3RzdWl0ZS4KKwkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IFJlbW92ZS4KKwkqIGJpbnV0aWxzLWFsbC9jb25maWd1cmUuaW4sIGJpbnV0aWxzLWFsbC9NYWtlZmlsZS5pbjogUmVtb3ZlLgorCSogYmludXRpbHMtYWxsL2JpbnRlc3QuYzogUmVtb3ZlLgorCSogYmludXRpbHMtYWxsL2JpbnRlc3QuczogTmV3IGZpbGUuCisJKiBiaW51dGlscy1hbGwvbm0uZXhwLCBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFJld3JpdGUuCisJKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IFJld3JpdGUuCisJKiBjb25maWcvZGVmYXVsdC5leHA6IExvYWQgdXRpbHMtbGliLmV4cC4gIFNldCBBUyBhbmQgQVNGTEFHUy4KKwlEb24ndCBnbyB1cCBvbmUgZGlyZWN0b3J5IGZyb20gJGJhc2VfZGlyLiAgQ3JlYXRlIHRtcGRpci4KKwkoYmludXRpbHNfcnVuLCBiaW51dGlscy1hc3NlbWJsZSk6IE5ldyBwcm9jZWR1cmVzLgorCSogY29uZmlnL3VuaXguZXhwOiBSZW1vdmUuCisJKiBjb25maWcvbXQtYTI5ay11ZGksIGNvbmZpZy9tdC1pMzg2LWFvdXQ6IFJlbW92ZS4KKwkqIGNvbmZpZy9tdC1pOTYwLW5pbmR5LCBjb25maWcvbXQtbHlueCwgY29uZmlnL210LW02OGs6IFJlbW92ZS4KKwkqIGNvbmZpZy9tdC1taXBzLWVjb2ZmLCBjb25maWcvbXQtc2xpdGU6IFJlbW92ZS4KKwkqIGNvbmZpZy9tdC1zcGFyYy1hb3V0LCBjb25maWcvbXQtdnh3b3JrczogUmVtb3ZlLgorCSogbGliL3V0aWxzLWxpYi5leHAgKGJpbnV0aWxfdmVyc2lvbik6IERvbid0IHJlZGlyZWN0IHN0YW5kYXJkCisJaW5wdXQgd2hlbiBnZXR0aW5nIHZlcnNpb24uICBEb24ndCB1bnNldCBlcnJvckluZm8uCisJKGRlZmF1bHRfYmludXRpbHNfcnVuKTogTmV3IHByb2NlZHVyZS4KKwkoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IE5ldyBwcm9jZWR1cmUuCisKK1RodSBTZXAgMjkgMTI6NDU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBWTVMgZG9lcyBub3QgcGVybWl0IGAuJyBpbiBkaXJlY3RvcnkgbmFtZXM6IHJlbmFtZWQgYmludXRpbHMuYWxsCisJdG8gYmludXRpbHMtYWxsLgorCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogQ2hhbmdlIGJpbnV0aWxzLmFsbCB0byBiaW51dGlscy1hbGwuCisKK0ZyaSBTZXAgMjMgMTY6MDE6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFVzZSBtdC1tNjhrIGZvciBtNjhrKi0qLWFvdXQqIGFuZCBtNjhrKi0qLWNvZmYqLAorCW5vdCBmb3IgbTY4ay0qLSouCisKK0ZyaSBTZXAgMjMgMTM6NTQ6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBBZGRlZCBBUk0gdG8gbGlzdCBvZiBDUFUgdHlwZXMuCisKK1RodSBTZXAgMjIgMTE6MDQ6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBmb3IgbmV3IHVzYWdlIG1lc3NhZ2UuCisJKiBiaW51dGlscy5hbGwvc2l6ZS5leHA6IFVzZSBhIGRvdWJsZSBiYWNrc2xhc2ggaW4gdGhlIHN0cmluZyB0bworCWdldCBhIHNpbmdsZSBiYWNrc2xhc2ggdG8gdGhlIHJlZ2V4cCBtYXRjaGVyLiAgQWNjZXB0ICRURVhUJCwKKwkkREFUQSQgYW5kICRCU1MkIGFzIHdlbGwgYXMgLnRleHQsIC5kYXRhIGFuZCAuYnNzLCBmb3IgSFAvVVguCisKK0ZyaSBTZXAgIDIgMTI6NTM6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdW5peC5leHA6IElmIG5tLm5ldyBkb2VzIG5vdCBleGlzdCwgdXNlIFt0cmFuc2Zvcm0gbm1dLgorCSogY29uZmlnL2RlZmF1bHQuZXhwOiBMaWtld2lzZS4KKworV2VkIEF1ZyAyNCAxMjo0MTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgYmludXRpbHMuYWxsL2NvbmZpZ3VyZS5pbjogQ2hhbmdlIGkzODYgdG8KKwlpWzM0NV04Ni4KKworVHVlIEp1bCAxOSAxNToyMzo1MyAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tdC1taXBzLWVjb2ZmOiBBZGQgLVRpZHAubGQgb3B0aW9uLgorCitUaHUgSnVuIDMwIDEyOjQxOjU1IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBVc2Ugbm0ubmV3LCBub3Qgbm0sIGZyb20gbmV3bHkgYnVpbHQgdHJlZS4KKworVHVlIE1heSAxNyAxNDowNDowNSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cCwgY29uZmlnL3VuaXguZXhwOiBSZXBsYWNlIGVycm9yCisJICBwcm9jIGNhbGxzIHdpdGggcGVycm9yLgorCitUdWUgTWF5IDEwIDExOjIwOjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChzcGFyY2xpdGUpOiBNYXRjaCBvbiBzcGFyY2xpdGUqLSotKi4KKworV2VkIEFwciAxMyAxODoyNToxOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvdW5peC5leHA6IFVzZSBubS5uZXcsIG5vdCBubSwgZnJvbSBuZXdseSBidWlsdCB0cmVlLgorCisJKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IEFkZCBtb3JlIHdpbGRjYXJkcyB0byBsaXN0IG9mCisJc2luZ2xlLWxldHRlciBvcHRpb25zIGluIHBhdHRlcm4gZm9yIHVzYWdlIG1lc3NhZ2UuCisKKwkqIGJpbnV0aWxzLmFsbC9ubS5leHA6IERlbGV0ZWQgZGVidWctc3ltYm9scyB0ZXN0LCBzaW5jZSBpdCBvbmx5CisJd29ya3MgZm9yIGEub3V0L3N0YWJzIHN5c3RlbXMuICBGaXhlZCByZWdleHBzIHRvIG1ha2UgdW5kZXJzY29yZXMKKwlvcHRpb25hbCwgc2luY2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndCBwcmVwZW5kIHRoZW0uICBEZWxldGVkCisJY2hlY2sgZm9yIGZvby5vIHN5bWJvbCwgc2luY2UgYWdhaW4gc29tZSBzeXN0ZW1zIGRvbid0IGdlbmVyYXRlCisJaXQuCisKK01vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCisKK01vbiBGZWIgMTQgMTk6MzQ6MDMgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogVXNlIG5ldyBjb25maWcgZmVhdHVyZXMgb2YgRGVqYUdudSBpbiBzaXRlLmV4cAorCWZpbGUuICJNYWtlIGNoZWNrIiBzaG91bGQgbm93IHdvcmsgZm9yIGFsbCBjcm9zc2VzLgorCitGcmkgSmFuIDI4IDE4OjAwOjI5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogSW4gdXNhZ2UgbWVzc2FnZSwgYWNjZXB0CisJInNlY3Rpb24tbmFtZSIgYXMgd2VsbCBhcyAic2VjdGlvbl9uYW1lIi4KKworTW9uIEphbiAxNyAxNjo1NzowMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFRyaW0gbGlzdCBvZiBmb3JtYXQgbmFtZXMgZXhwZWN0ZWQsCisJYW5kIGFjY2VwdCBhbnkga25vd24gQ1BVIHR5cGUuCisKK1RodSBEZWMgIDIgMjA6NTA6MjQgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHNvbWUgc3R1ZmYgZnJvbSB0aGUgc2l0ZS5leHAgZmlsZS4KKwkqIGNvbmZpZy91bml4LmV4cDogQWRkIGdsb2JhbCBiZWZvcmUgc2VlaW5nIGlmIHRoZSB2YXJpYWJsZXMgZm9yCisJbm0sIG9iamR1bXAsIGFuZCBzaXplIGV4aXN0LgorCitXZWQgTm92ICAzIDExOjEyOjMyIDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3VkaS5leHAsdW5peC5leHA6IFRyYW5zZm9ybSB0b29sIG5hbWUuCisJKiBiaW51dGlscy5hbGwvKi5leHA6IENsZWFyIGVycm9ySW5mbyBhZnRlciBleGVjLgorCitGcmkgSnVsICAyIDEyOjQxOjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYmludXRpbHMuYWxsLyouZXhwOiBVc2UgLS0gZm9yIGxvbmcgYXJndW1lbnRzIHJhdGhlciB0aGFuICsuCisKK0ZyaSBKdW4gIDQgMTA6NTI6MjkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGNoYW5nZSBzcmN0cmlnZ2VyIHRvIE1ha2VmaWxlLmluIAorCitXZWQgTWF5IDI2IDE3OjI3OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0MgYW5kIENGTEFHUy4KKworRnJpIE1heSAgNyAxMzo1ODo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBuZXcgdXNhZ2UgbWVzc2FnZS4KKworTW9uIEFwciAxOSAxNDowODo1MiAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzLmFsbC8qLmV4cDogVXNlIHRoZSBuZXcgdXRpbF90ZXN0IHByb2MuCisJKiBNYWtlZmlsZS5pbjogQ3JlYXRlIGEgbG9jYWwgc2l0ZS5leHAgZmlsZSB3aXRoIGNvbmZpZyBpbmZvLgorCitUaHUgTWFyIDI1IDA1OjM4OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBubS5hbGwvY29uZmlndXJlLmluIChzcmNuYW1lKTogRGVsZXRlIGV4dHJhIHF1b3RlLgorCitNb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBiaW51dGlscy90ZXN0c3VpdGU6IG1hZGUgbW9kaWZpY2F0aW9ucyB0byB0ZXN0Y2FzZXMsIGV0Yy4sIHRvIGFsbG93CisgICAgICAgIHRoZW0gdG8gd29yayBwcm9wZXJseSAgZ2l2ZW4gdGhlIHJlb3JnYW5pemF0aW9uIG9mIGRlamEtZ251IGFuZCB0aGUKKyAgICAgICAgcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgorCitTdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogSW5pdGlhbCBjcmVhdGlvbiBvZiBiaW51dGlscy90ZXN0c3VpdGUuCisJTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KKwliaW51dGlscy90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgorCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4gIFRoaXMgbWlncmF0aW9uIGlzIHBhcnQgb2YgYSBtYWpvciBvdmVyaGF1bAorCW9mIGRlamFnbnUuICBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGVzZSB0ZXN0Y2FzZXMsIGV0Yy4sIHdoaWNoCisJd2lsbCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgZGVqYWdudSB3aWxsIGJlCisJbWFkZSBpbiBhIGZ1dHVyZSB1cGRhdGUuCisKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYXIuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9hci5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzOGM2YgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYXIuZXhwCkBAIC0wLDAgKzEsMjE5IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1CisKKyMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KKworaWYgIVtpc19yZW1vdGUgaG9zdF0geworICAgIGlmIHtbd2hpY2ggJEFSXSA9PSAwfSB0aGVuIHsKKyAgICAgICAgcGVycm9yICIkQVIgZG9lcyBub3QgZXhpc3QiCisgICAgICAgIHJldHVybgorICAgIH0KK30KKworIyBzZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkQVJdIgorCisjIFRlc3QgbG9uZyBmaWxlIG5hbWUgc3VwcG9ydAorCitwcm9jIGxvbmdfZmlsZW5hbWVzIHsgfSB7CisgICAgZ2xvYmFsIEFSCisgICAgZ2xvYmFsIGhvc3RfdHJpcGxldAorCisgICAgc2V0IHRlc3RuYW1lICJhciBsb25nIGZpbGUgbmFtZXMiCisKKyAgICBzZXQgbjEgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MSIKKyAgICBzZXQgbjIgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MiIKKyAgICBzZXQgZmlsZTEgdG1wZGlyLyRuMQorICAgIHNldCBmaWxlMiB0bXBkaXIvJG4yCisKKyAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgJGZpbGUxCisKKyAgICAjIFNvbWUgZmlsZSBzeXN0ZW1zIHRydW5jYXRlIGZpbGUgbmFtZXMgYXQgMTQgY2hhcmFjdGVycywgd2hpY2gKKyAgICAjIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcnVuIHRoaXMgdGVzdC4gIENoZWNrIGZvciB0aGF0IG5vdy4KKyAgICBzZXQgc3RhdHVzIFtjYXRjaCAic2V0IGYgW29wZW4gdG1wZGlyLyRuMSB3XSIgZXJyc10KKyAgICBpZiB7ICRzdGF0dXMgIT0gMCB9IHsKKwl2ZXJib3NlIC1sb2cgIm9wZW4gdG1wZGlyLyRuMSByZXR1cm5lZCAkZXJycyIKKwl1bnN1cHBvcnRlZCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisgICAgcHV0cyAkZiAiZmlyc3QiCisgICAgY2xvc2UgJGYKKworCisgICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlICRmaWxlMgorCisgICAgc2V0IHN0YXR1cyBbY2F0Y2ggInNldCBmIFtvcGVuIHRtcGRpci8kbjIgd10iIGVycnNdCisgICAgaWYgeyAkc3RhdHVzICE9IDAgfSB7CisJdmVyYm9zZSAtbG9nICJvcGVuIHRtcGRpci8kbjIgcmV0dXJuZWQgJGVycnMiCisJdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCisJcmV0dXJuCisgICAgfQorICAgIHB1dHMgJGYgInNlY29uZCIKKyAgICBjbG9zZSAkZgorCisgICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJc2V0IGZpbGUxIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkZmlsZTFdOworCXNldCBmaWxlMiBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJGZpbGUyXTsKKwlzZXQgZGVzdCBhcnRlc3QuYQorICAgIH0gZWxzZSB7CisJc2V0IGRlc3QgdG1wZGlyL2FydGVzdC5hCisgICAgfQorCisgICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGRlc3Q7CisKKyAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJyYyAkZGVzdCAkZmlsZTEgJGZpbGUyIl0KKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlyZW1vdGVfdXBsb2FkIGhvc3QgJGZpbGUxIHRtcGRpci8kbjEKKyAgICB9CisKKyAgICBzZXQgZiBbb3BlbiB0bXBkaXIvJG4xIHJdCisgICAgZ2V0cyAkZiBzdHJpbmcKKyAgICBjbG9zZSAkZgorICAgIGlmICFbc3RyaW5nIG1hdGNoICJmaXJzdCIgJHN0cmluZ10geworCXZlcmJvc2UgLWxvZyAicmVhZGluZyB0bXBkaXIvJG4xIHJldHVybmVkICRzdHJpbmciCisJdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCisJcmV0dXJuCisgICAgfQorCisgICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGRlc3Q7CisgICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGRlc3QgJGZpbGUxICRmaWxlMiJdCisKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB7CisJZmFpbCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisKKyAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyLyRuMQorICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSB0bXBkaXIvJG4yCisKKyAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJ0ICRkZXN0Il0KKyAgICByZWdzdWIgIlxbXHJcbiBcdFxdKiQiICIkZ290IiAiIiBnb3Q7CisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiRuMSokbjIiICRnb3RdIHsKKwlmYWlsICR0ZXN0bmFtZQorCXJldHVybgorICAgIH0KKyAgICAKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlyZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkZmlsZTE7CisJcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGZpbGUyOworICAgIH0KKworICAgIHZlcmJvc2UgLWxvZyAiJEFSIHggJGRlc3QiCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJEFSICJ4ICRkZXN0Il0KKyAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKKwl2ZXJib3NlIC1sb2cgJGV4ZWNfb3V0cHV0CisJZmFpbCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlyZW1vdGVfdXBsb2FkIGhvc3QgJG4xIHRtcGRpci8kbjE7CisJcmVtb3RlX3VwbG9hZCBob3N0ICRuMiB0bXBkaXIvJG4yOworCXNldCBmaWxlMSB0bXBkaXIvJG4xCisJc2V0IGZpbGUyIHRtcGRpci8kbjIKKyAgICB9IGVsc2UgeworCXNldCBmaWxlMSAkbjEKKwlzZXQgZmlsZTIgJG4yCisgICAgfQorCisgICAgaWYgIVtmaWxlIGV4aXN0cyAkZmlsZTFdIHsKKwl2ZXJib3NlIC1sb2cgIiRmaWxlMSBkb2VzIG5vdCBleGlzdCIKKwlmYWlsICR0ZXN0bmFtZQorCXJldHVybgorICAgIH0KKyAgICBpZiAhW2ZpbGUgZXhpc3RzICRmaWxlMl0geworCXZlcmJvc2UgLWxvZyAiJGZpbGUyIGRvZXMgbm90IGV4aXN0IgorCWZhaWwgJHRlc3RuYW1lCisJcmV0dXJuCisgICAgfQorCisgICAgc2V0IGYgW29wZW4gJGZpbGUxIHJdCisgICAgaWYgeyBbZ2V0cyAkZiBsaW5lXSA9PSAtMSB8fCAkbGluZSAhPSAiZmlyc3QiIH0geworCXZlcmJvc2UgLWxvZyAiJGZpbGUxIGNvbnRlbnRzOiIKKwl2ZXJib3NlIC1sb2cgIiRsaW5lIgorCWNsb3NlICRmCisJZmFpbCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisgICAgY2xvc2UgJGYKKworICAgIHNldCBmIFtvcGVuICRmaWxlMiByXQorICAgIGlmIHsgW2dldHMgJGYgbGluZV0gPT0gLTEgfHwgJGxpbmUgIT0gInNlY29uZCIgfSB7CisJdmVyYm9zZSAtbG9nICIkZmlsZTIgY29udGVudHM6IgorCXZlcmJvc2UgLWxvZyAiJGxpbmUiCisJY2xvc2UgJGYKKwlmYWlsICR0ZXN0bmFtZQorCXJldHVybgorICAgIH0KKyAgICBjbG9zZSAkZgorCisgICAgcGFzcyAkdGVzdG5hbWUKK30KKworIyBUZXN0IGJ1aWxkaW5nIHRoZSBzeW1ib2wgdGFibGUuCisKK3Byb2Mgc3ltYm9sX3RhYmxlIHsgfSB7CisgICAgZ2xvYmFsIEFSCisgICAgZ2xvYmFsIEFTCisgICAgZ2xvYmFsIE5NCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKworICAgIHNldCB0ZXN0bmFtZSAiYXIgc3ltYm9sIHRhYmxlIgorCisgICAgaWYgIVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dIHsKKwl1bnJlc29sdmVkICR0ZXN0bmFtZQorCXJldHVybgorICAgIH0KKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXNldCBhcmNoaXZlIGFydGVzdC5hCisJc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCisJcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGFyY2hpdmUKKyAgICB9IGVsc2UgeworCXNldCBhcmNoaXZlIHRtcGRpci9hcnRlc3QuYQorCXNldCBvYmpmaWxlIHRtcGRpci9iaW50ZXN0Lm8KKyAgICB9CisKKyAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyL2FydGVzdC5hCisKKyAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJEFSICJyYyAkYXJjaGl2ZSAke29iamZpbGV9Il0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB7CisJZmFpbCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisKKyAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICItLXByaW50LWFybWFwICRhcmNoaXZlIl0KKyAgICBpZiB7ICFbc3RyaW5nIG1hdGNoICIqdGV4dF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAorCSB8fCAhW3N0cmluZyBtYXRjaCAiKmRhdGFfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKKwkgfHwgIVtzdHJpbmcgbWF0Y2ggIipjb21tb25fc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKKwkgfHwgW3N0cmluZyBtYXRjaCAiKnN0YXRpY190ZXh0X3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCisJIHx8IFtzdHJpbmcgbWF0Y2ggIipzdGF0aWNfZGF0YV9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAorCSB8fCBbc3RyaW5nIG1hdGNoICIqZXh0ZXJuYWxfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIH0geworCWZhaWwgJHRlc3RuYW1lCisJcmV0dXJuCisgICAgfQorCisgICAgcGFzcyAkdGVzdG5hbWUKK30KKworIyBSdW4gdGhlIHRlc3RzLgorCitsb25nX2ZpbGVuYW1lcworc3ltYm9sX3RhYmxlCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYmludGVzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDA2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucwpAQCAtMCwwICsxLDEyIEBACisJLmdsb2JsIHRleHRfc3ltYm9sCisJLnRleHQKK3RleHRfc3ltYm9sOgkKK3N0YXRpY190ZXh0X3N5bWJvbDoKKwkubG9uZwkxCisJLmxvbmcJZXh0ZXJuYWxfc3ltYm9sCisJLmdsb2JsIGRhdGFfc3ltYm9sCisJLmRhdGEKK2RhdGFfc3ltYm9sOgorc3RhdGljX2RhdGFfc3ltYm9sOgorCS5sb25nCTIKKwkuY29tbSBjb21tb25fc3ltYm9sLDQKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkzMDZmCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zCkBAIC0wLDAgKzEsMjMgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCS5JTVBPUlQgJGdsb2JhbCQsREFUQQorCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQorOyBnY2NfY29tcGlsZWQuOgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuRVhQT1JUIGluaXRpYWxpemVfY2hhcl9zeW50YXgsQ09ERQorCS5FWFBPUlQgaW5pdGlhbGl6ZV9jaGFyX3N5bnRheCxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgoraW5pdGlhbGl6ZV9jaGFyX3N5bnRheAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MworCS5FTlRSWQorCWFkZGlsIEwnaXNfaWRjaGFyLSRnbG9iYWwkLTMyLCVyMjcKKwkuRVhJVAorCS5QUk9DRU5ECitpc19pZGNoYXIJLmNvbW0gMjU2CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2YjI4OQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9vYmpkdW1wLmV4cApAQCAtMCwwICsxLDU5IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgorIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgorCitpZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7CisgIHJldHVybgorfQorCitpZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKKyAgICBwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgorICAgIHJldHVybgorfQorCitzZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKRFVNUF0iCisKK2lmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9hZGRlbmRidWcucyB0bXBkaXIvYWRkZW5kYnVnLm9dfSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworaWYgW2lzX3JlbW90ZSBob3N0XSB7CisgICAgc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9hZGRlbmRidWcub10KK30gZWxzZSB7CisgICAgc2V0IG9iamZpbGUgdG1wZGlyL2FkZGVuZGJ1Zy5vCit9CisKKyMgTWFrZSBzdXJlIHRoZSBTT00gQkZEIGNvZGUgc2lnbiBleHRlbmRzIGNvbnN0YW50cyBpbiBSX0RBVEFfT1ZFUlJJREUgZml4dXBzLgorCitzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXIgJG9iamZpbGUiXQorCitpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7CisgIHNldCB3YW50ICIwMDAwMDAwMCBSX1BBUklTQ19EUFJFTDIxTFxbIAlcXStpc19pZGNoYXJcXCsweGZmZmZmZmUwLioiCit9IGVsc2UgeworICBzZXQgd2FudCAiMDAwMDAwMDAgUl9EUF9SRUxBVElWRVxbIAlcXStpc19pZGNoYXJcXCsweGZmZmZmZmUwLioiCit9CisKKworaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKKyAgICBwYXNzICJhZGRlbmRidWcgdGVzdCIKK30gZWxzZSB7CisgICAgZmFpbCAiYWRkZW5kYnVnIHRlc3QiCit9CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvbm0uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzdjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cApAQCAtMCwwICsxLDEyMyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KKyMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KKworaWYgIVtpc19yZW1vdGUgaG9zdF0geworICAgIGlmIHtbd2hpY2ggJE5NXSA9PSAwfSB0aGVuIHsKKyAgICAgICAgcGVycm9yICIkTk0gZG9lcyBub3QgZXhpc3QiCisgICAgICAgIHJldHVybgorICAgIH0KK30KKworc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE5NXSIKKworCitpZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworaWYgW2lzX3JlbW90ZSBob3N0XSB7CisgICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQorfSBlbHNlIHsKKyAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL2JpbnRlc3QubworfQorCisjIFRlc3Qgbm0gd2l0aCBubyBhcmd1bWVudHMuCisKKyMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKKyMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCitzZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgorc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCitzZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCisKKyMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKKyMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KK3NldHVwX3hmYWlsICIqLSotYWl4KiIKKworc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgJHRlbXBmaWxlIl0KKworaWYgW2luZm8gZXhpc3RzIHZhcnNdIHRoZW4geyB1bnNldCB2YXJzIH0KK3doaWxlIHtbcmVnZXhwICIoXFthLXpBLVpcXSkgKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgdHlwZSBzeW1ib2wgcmVzdF19IHsKKyAgICBzZXQgdmFycygkc3ltYm9sKSAkdHlwZQorICAgIHNldCBnb3QgJHJlc3QKK30KKworaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKKyAgICAgfHwgJHZhcnModGV4dF9zeW1ib2wpICE9ICJUIiBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKKyAgICAgfHwgJHZhcnMoZGF0YV9zeW1ib2wpICE9ICJEIiBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAorICAgICB8fCAkdmFycyhjb21tb25fc3ltYm9sKSAhPSAiQyIgXAorICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV0gXAorICAgICB8fCAkdmFycyhleHRlcm5hbF9zeW1ib2wpICE9ICJVIiBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfdGV4dF9zeW1ib2wpXSBcCisgICAgIHx8ICR2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCkgIT0gInQiIFwKKyAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY19kYXRhX3N5bWJvbCldIFwKKyAgICAgfHwgJHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKSAhPSAiZCJ9IHsKKyAgICBmYWlsICJubSAobm8gYXJndW1lbnRzKSIKK30gZWxzZSB7CisgICAgcGFzcyAibm0gKG5vIGFyZ3VtZW50cykiCit9CisKKyMgVGVzdCBubSAtZworCitzZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAtZyAkdGVtcGZpbGUiXQorCitpZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQord2hpbGUge1tyZWdleHAgIihcW2Etel9cXSpfc3ltYm9sKSguKikiICRnb3QgYWxsIHN5bWJvbCByZXN0XX0geworICAgIHNldCB2YXJzKCRzeW1ib2wpIDEKKyAgICBzZXQgZ290ICRyZXN0Cit9CisKK2lmIHshW2luZm8gZXhpc3RzIHZhcnModGV4dF9zeW1ib2wpXSBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhkYXRhX3N5bWJvbCldIFwKKyAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCisgICAgIHx8IFtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKKyAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV19IHsKKyAgICBmYWlsICJubSAtZyIKK30gZWxzZSB7CisgICAgcGFzcyAibm0gLWciCit9CisKKyMgVGVzdCBubSAtUAorCisjIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBFQ09GRiB0YXJnZXRzLCBiZWNhdXNlIEVDT0ZGCisjIHN0b3JlcyBtb3N0IHN5bWJvbHMgdHdpY2UsIHdoaWNoIG1lc3NlcyB1cCB0aGUgbm0gb3V0cHV0Lgorc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiICJhbHBoYSotKi1uZXR3YXJlKiIKK3NldHVwX3hmYWlsICJtaXBzKi0qLXVsdHJpeCoiICJtaXBzKi0qLWVjb2ZmKiIgIm1pcHMqLSotaXJpeDQqIgorc2V0dXBfeGZhaWwgIm1pcHMqLSotcmlzY29zKiIgIm1pcHMqLSotc3lzdjMqIiAibWlwcyotc29ueS1ic2QqIgorCisjIFRoaXMgdGVzdCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBvbiBYQ09GRiB0YXJnZXRzLCBiZWNhdXNlIFhDT0ZGCisjIGRvZXMgbm90IGVudGVyIHN0YXRpYyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUuCitzZXR1cF94ZmFpbCAiKi0qLWFpeCoiCisKK3NldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1QICR0ZW1wZmlsZSJdCisKK3NldCB3YW50ICJjb21tb25fc3ltYm9sIEMgXFswXF0qNC4qZGF0YV9zeW1ib2wgRCBcWzAtOWEtZkEtRlxdKi4qZXh0ZXJuYWxfc3ltYm9sIFUuKnN0YXRpY19kYXRhX3N5bWJvbCBkIFxbMC05YS1mQS1GXF0qLipzdGF0aWNfdGV4dF9zeW1ib2wgdCBcWzAtOWEtZkEtRlxdKi4qdGV4dF9zeW1ib2wgVCBcWzAtOWEtZkEtRlxdKiIKKworaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKKyAgICBwYXNzICJubSAtUCIKK30gZWxzZSB7CisgICAgZmFpbCAibm0gLVAiCit9CisKKyMgVGhlcmUgYXJlIGNlcnRhaW5seSBvdGhlciB0ZXN0cyB0aGF0IGNvdWxkIGJlIHJ1bi4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamNvcHkuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTcyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamNvcHkuZXhwCkBAIC0wLDAgKzEsNTkxIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1CisKKyMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KKworaWYgIVtpc19yZW1vdGUgaG9zdF0geworICAgIGlmIHtbd2hpY2ggJE9CSkNPUFldID09IDB9IHRoZW4geworICAgICAgICBwZXJyb3IgIiRPQkpDT1BZIGRvZXMgbm90IGV4aXN0IgorICAgICAgICByZXR1cm4KKyAgICB9Cit9CisKK3NlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpDT1BZXSIKKworaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7CisgICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCisgICAgdW5yZXNvbHZlZCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgorICAgIHJldHVybgorfQorCitpZiAhW2lzX3JlbW90ZSBob3N0XSB7CisgICAgc2V0IHRlbXBmaWxlIHRtcGRpci9iaW50ZXN0Lm87CisgICAgc2V0IGNvcHlmaWxlIHRtcGRpci9jb3B5OworfSBlbHNlIHsKKyAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCisgICAgc2V0IGNvcHlmaWxlIGNvcHkKK30KKworIyBUZXN0IHRoYXQgb2JqY29weSBkb2VzIG5vdCBtb2RpZnkgYSBmaWxlIHdoZW4gY29weWluZyBpdC4KKworc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIl0KKworaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7CisgICAgZmFpbCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgorfSBlbHNlIHsKKyAgICBzZW5kX2xvZyAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vXG4iCisgICAgdmVyYm9zZSAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIgorICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXNldCBzcmMxIHRtcGRpci9iaW50ZXN0Lm8KKwlzZXQgc3JjMiB0bXBkaXIvY29weS5vCisJcmVtb3RlX3VwbG9hZCBob3N0ICR0ZW1wZmlsZSAkc3JjMTsKKwlyZW1vdGVfdXBsb2FkIGhvc3QgJHtjb3B5ZmlsZX0ubyAkc3JjMjsKKyAgICB9IGVsc2UgeworCXNldCBzcmMxICR7dGVtcGZpbGV9CisJc2V0IHNyYzIgJHtjb3B5ZmlsZX0ubworICAgIH0KKyAgICBzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBidWlsZCBjbXAgIiR7c3JjMX0gJHtzcmMyfSJdOworICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisKKyAgICAjIE9uIHNvbWUgc3lzdGVtcyB0aGUgcmVzdWx0IG9mIG9iamNvcHkgd2lsbCBub3QgYmUgaWRlbnRpY2FsLgorICAgICMgVXN1YWxseSB0aGlzIGlzIGp1c3QgYmVjYXVzZSBnYXMgaXNuJ3QgdXNpbmcgYmZkIHRvIHdyaXRlIHRoZSBmaWxlcworICAgICMgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgbWF5IG9yZGVyIHRoaW5ncyBhIGxpdHRsZSBkaWZmZXJlbnRseS4KKyAgICAjIFRob3NlIHN5c3RlbXMgc2hvdWxkIHVzZSBzZXR1cF94ZmFpbCBoZXJlLgorCisgICAgc2V0dXBfeGZhaWwgInNoLSotY29mZiIgInNoLSotaG1zIiAKKyAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIiAibTY4Ki0qLXN1bm9zKiIgIm02OCotKi1jb2ZmIiAibTY4Ki0qLXZ4d29ya3MqIgorICAgIHNldHVwX3hmYWlsICJtNjgqLWVyaWNzc29uLW9zZSIgIm02OGsqLW1vdG9yb2xhLXN5c3YqIgorICAgIHNldHVwX3hmYWlsICJpKjg2LSotbGludXhhb3V0KiIgImkqODYtKi1hb3V0KiIKKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLXN5c3YzIiAiaSo4Ni0qLWlzYyoiICJpKjg2LSotc2NvKiIgImkqODYtKi1jb2ZmIgorICAgIHNldHVwX3hmYWlsICJpKjg2LSotYWl4KiIgImkqODYtKi1nbzMyKiIKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgImEyOWstKi1jb2ZmIiAiYTI5ay0qLXZ4d29ya3MqIgorICAgIHNldHVwX3hmYWlsICJpOTYwLSotY29mZiIKKyAgICBzZXR1cF94ZmFpbCAiaDgzMDAtKi1obXMiICJoODMwMC0qLWNvZmYiCisgICAgc2V0dXBfeGZhaWwgImg4NTAwLSotaG1zIiAiaDg1MDAtKi1jb2ZmIgorICAgIHNldHVwX3hmYWlsICJocHBhKi0qLSoiCisgICAgY2xlYXJfeGZhaWwgImhwcGEqLSotKmVsZioiCisgICAgc2V0dXBfeGZhaWwgIm04OCotKi1jb2ZmIiAibTg4Ki1tb3Rvcm9sYS1zeXN2KiIKKyAgICBzZXR1cF94ZmFpbCAiejgqLSotY29mZiIKKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlwYXNzICJvYmpjb3B5IChzaW1wbGUgY29weSkiCisgICAgfSBlbHNlIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCisKKwkjIE9uIE9TRi8xLCB0aGlzIHN1Y2NlZWRzIHdpdGggZ2FzIGFuZCBmYWlscyB3aXRoIC9iaW4vYXMuCisJc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiCisKKwkjIFRoaXMgZmFpbHMgZm9yIENPRkYgaTk2MC12eHdvcmtzIHRhcmdldHMuCisJc2V0dXBfeGZhaWwgImk5NjAtKi12eHdvcmtzKiIKKworCWZhaWwgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKKyAgICB9Cit9CisKKyMgVGVzdCBnZW5lcmF0aW5nIFMgcmVjb3Jkcy4KKworIyBXZSBtYWtlIHRoZSBzcmVjIGZpbGVuYW1lIDguMyBjb21wYXRpYmxlLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBzdHJpbmcKKyMgbWF0Y2hlZCBhZ2FpbnN0IGRlcGVuZHMgb24gdGhlIG5hbWUgb2YgdGhlIGZpbGUuIFVnaC4KKworaWYgW2lzX3JlbW90ZSBob3N0XSB7CisgICAgc2V0IHNyZWNmaWxlIGNvcHkuc3JlCisgICAgc2V0IGhlYWRlcl9zdHJpbmcgUzAwQjAwMDA2MzZGNzA3OTJFNzM3MjY1QzEKK30gZWxzZSB7CisgICAgc2V0IHNyZWNmaWxlICR7Y29weWZpbGV9LnNyZWMKKyAgICBzZXQgaGVhZGVyX3N0cmluZyBTMDEzMDAwMDc0NkQ3MDY0Njk3MjJGNjM2RjcwNzkyRTczNzI2NTYzOTcKK30KKworc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7c3JlY2ZpbGV9Il0KKworaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7CisgICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgorfSBlbHNlIHsKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlyZW1vdGVfdXBsb2FkIGhvc3QgJHtzcmVjZmlsZX0gdG1wZGlyL2NvcHkuc3JlYzsKKwlzZXQgc3JlY2ZpbGUgdG1wZGlyL2NvcHkuc3JlYzsKKyAgICB9CisgICAgc2V0IGZpbGUgW29wZW4gJHtzcmVjZmlsZX0gcl0KKworICAgICMgVGhlIGZpcnN0IFMgcmVjb3JkIGlzIGZpeGVkIGJ5IHRoZSBmaWxlIG5hbWUgd2UgYXJlIHVzaW5nLgorICAgIGdldHMgJGZpbGUgbGluZQorICAgIHNlbmRfbG9nICIkbGluZVxuIgorICAgIHZlcmJvc2UgJGxpbmUKKyAgICBpZiAhW3JlZ2V4cCAiJGhlYWRlcl9zdHJpbmcuKiIgJGxpbmVdIHsKKwlzZW5kX2xvZyAiYmFkIGhlYWRlclxuIgorCWZhaWwgIm9iamNvcHkgLU8gc3JlYyIKKyAgICB9IGVsc2UgeworCXdoaWxlIHtbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSBcCisJICAgICAgICYmIFtyZWdleHAgIl5TXFsxMjNcXVxbMC05YS1mQS1GXF0rXFtcclxuXF0qJCIgJGxpbmVdfSB7CisJICAgIHNlbmRfbG9nICIkbGluZVxuIgorCSAgICB2ZXJib3NlICRsaW5lCisJICAgIHNldCBsaW5lICIqKkVPRioqIgorCX0KKwlzZW5kX2xvZyAiJGxpbmVcbiIKKwl2ZXJib3NlICRsaW5lCisJaWYgIVtyZWdleHAgIl5TXFs3ODlcXVxbMC05YS1mQS1GXF0rXFtcclxuXF0qJCIgJGxpbmVdIHRoZW4geworCSAgICBzZW5kX2xvZyAiYmFkIHRyYWlsZXJcbiIKKwkgICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgorCX0gZWxzZSB7CisJICAgIGlmIHtbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMX0gdGhlbiB7CisJCXNlbmRfbG9nICJnYXJiYWdlIGF0IGVuZFxuIgorCQlzZW5kX2xvZyAiJGxpbmVcbiIKKwkJdmVyYm9zZSAkbGluZQorCQlmYWlsICJvYmpjb3B5IC1PIHNyZWMiCisJICAgIH0gZWxzZSB7CisJCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KKwkJaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMiICRnb3RdIHRoZW4geworCQkgICAgc2VuZF9sb2cgIm9iamR1bXAgZmFpbGVkXG4iCisJCSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCisJCX0gZWxzZSB7CisJCSAgICBwYXNzICJvYmpjb3B5IC1PIHNyZWMiCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBjbG9zZSAkZmlsZQorfQorCisjIFRlc3Qgc2V0dGluZyBhbmQgYWRqdXN0aW5nIHRoZSBzdGFydCBhZGRyZXNzLiAgV2Ugb25seSB0ZXN0IHRoaXMKKyMgd2hpbGUgZ2VuZXJhdGluZyBTIHJlY29yZHMsIGJlY2F1c2Ugd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHNldCB0aGUKKyMgc3RhcnQgYWRkcmVzcyBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cywgYW5kIHRoZSBTIHJlY29yZCBjYXNlCisjIGlzIHRoZSBvbmx5IHVzZWZ1bCBvbmUgYW55aG93LgorCitzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHRlbXBmaWxlIl0KK2lmICFbcmVnZXhwICJzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgb3JpZ3N0YXJ0XSB0aGVuIHsKKyAgICBwZXJyb3IgIm9iamR1bXAgY2FuIG5vdCByZWNvZ25pemUgYmludGVzdC5vIgorICAgIHNldCBvcmlnc3RhcnQgIiIKK30gZWxzZSB7CisgICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1zZXQtc3RhcnQgMHg3NjU0Il0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKKwlmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgorICAgIH0gZWxzZSB7CisJc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQorCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgc3JlY3N0YXJ0XSB0aGVuIHsKKwkgICAgZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKKwl9IGVsc2UgeworCSAgICBpZiB7JHNyZWNzdGFydCAhPSAweDc2NTR9IHRoZW4geworCQlzZW5kX2xvZyAiJHNyZWNzdGFydCAhPSAweDc2NTRcbiIKKwkJZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKKwkgICAgfSBlbHNlIHsKKwkJcGFzcyAib2JqY29weSAtLXNldC1zdGFydCIKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLWFkanVzdC1zdGFydCAweDEyMyJdCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7CisJZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKKyAgICB9IGVsc2UgeworCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KKwlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIHNyZWNzdGFydF0gdGhlbiB7CisJICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCisJfSBlbHNlIHsKKwkgICAgaWYgeyRzcmVjc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzfSB0aGVuIHsKKwkJc2VuZF9sb2cgIiRzcmVjc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzXG4iCisJCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCisJICAgIH0gZWxzZSB7CisJCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCisJICAgIH0KKwl9CisgICAgfQorfQorCisjIFRlc3QgYWRqdXN0aW5nIHRoZSBvdmVyYWxsIFZNQSwgYW5kIGFkanVzdGluZyB0aGUgVk1BIG9mIGEKKyMgcGFydGljdWxhciBzZWN0aW9uLiAgV2UgYWdhaW4gb25seSB0ZXN0IHRoaXMgd2hlbiBnZW5lcmF0aW5nIFMKKyMgcmVjb3Jkcy4KKworc2V0IGxvdyAiIgorc2V0IGxvd25hbWUgIiIKKworc2V0IGhlYWRlcnMgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAkdGVtcGZpbGUiXQorCitzZXQgaGVhZGVyc19yZWdleHAgIlxbIAkwLTlcXSsoXFteIAlcXSspXFsgCVxdKihcWzAtOWEtZkEtRlxdKylcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsyXFsqXF1cWypcXVxbMC05XF0rKC4qKSIKKworc2V0IGdvdCAkaGVhZGVycword2hpbGUge1tyZWdleHAgJGhlYWRlcnNfcmVnZXhwICRnb3QgYWxsIG5hbWUgc2l6ZSB2bWEgcmVzdF19IHsKKyAgICBzZXQgdm1hIDB4JHZtYQorICAgIHNldCBzaXplIDB4JHNpemUKKyAgICBpZiB7JHNpemUgIT0gMH0geworCWlmIHskbG93ID09ICIiIHx8ICR2bWEgPCAkbG93fSB7CisgICAgICAgICAgICBzZXQgbG93ICR2bWEKKwkgICAgc2V0IGxvd25hbWUgJG5hbWUKKwl9CisgICAgfQorICAgIHNldCBnb3QgJHJlc3QKK30KKworaWYgeyRsb3cgPT0gIiIgfHwgJG9yaWdzdGFydCA9PSAiIn0gdGhlbiB7CisgICAgcGVycm9yICJvYmpkdW1wIGNhbiBub3QgcmVjb2duaXplIGJpbnRlc3QubyIKK30gZWxzZSB7CisgICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1hZGp1c3Qtdm1hIDB4MTIzIl0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKKyAgICAgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCisgICAgfSBlbHNlIHsKKwlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWZoICR7Y29weWZpbGV9LnNyZWMiXQorCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzXFsgCVxdKihcWzAtOWEtZkEtRnhYXF0rKS4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgorCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHN0YXJ0IHZtYV0gdGhlbiB7CisJICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgorCX0gZWxzZSB7CisJICAgIHNldCB2bWEgMHgkdm1hCisJICAgIGlmIHskdm1hICE9ICRsb3cgKyAweDEyM30gdGhlbiB7CisJCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyAweDEyM1xuIgorCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKKwkgICAgfSBlbHNlIHsKKwkJaWYgeyRzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjN9IHRoZW4geworCQkgICAgc2VuZF9sb2cgIiRzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjNcbiIKKwkJICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgorCQl9IGVsc2UgeworCQkgICAgcGFzcyAib2JqY29weSAtLWFkanVzdC12bWEiCisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBzZXQgYXJnICIiCisgICAgc2V0IGdvdCAkaGVhZGVycworICAgIHdoaWxlIHtbcmVnZXhwICRoZWFkZXJzX3JlZ2V4cCAkZ290IGFsbCBuYW1lIHNpemUgdm1hIHJlc3RdfSB7CisJc2V0IHZtYSAweCR2bWEKKwlpZiB7JHZtYSA9PSAkbG93fSB0aGVuIHsKKwkgICAgc2V0IGFyZyAiJGFyZyAtLWFkanVzdC1zZWN0aW9uLXZtYSAkbmFtZSs0IgorCX0KKwlzZXQgZ290ICRyZXN0CisgICAgfQorCisgICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgJGFyZyJdCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7CisJZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgorICAgIH0gZWxzZSB7CisJc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR7Y29weWZpbGV9LnNyZWMiXQorCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCisJaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdm1hXSB0aGVuIHsKKwkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgorCX0gZWxzZSB7CisJICAgIHNldCB2bWEgMHgkdm1hCisJICAgIGlmIHskdm1hICE9ICRsb3cgKyA0fSB0aGVuIHsKKwkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDRcbiIKKwkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgorCSAgICB9IGVsc2UgeworCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmVnc3ViIC1hbGwgIlxcKzQiICRhcmcgIj1bZXhwciAkbG93ICsgNF0iIGFyZ2VxCisgICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgJGFyZ2VxIl0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKKwlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCisgICAgfSBlbHNlIHsKKwlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHtjb3B5ZmlsZX0uc3JlYyJdCisJc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKKwlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB2bWFdIHRoZW4geworCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCisJfSBlbHNlIHsKKwkgICAgc2V0IHZtYSAweCR2bWEKKwkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDR9IHRoZW4geworCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgNFxuIgorCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCisJICAgIH0gZWxzZSB7CisJCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKyMgVGVzdCBzdHJpcHBpbmcgYW4gb2JqZWN0LgorCitwcm9jIHN0cmlwX3Rlc3QgeyB9IHsKKyAgICBnbG9iYWwgQ0MKKyAgICBnbG9iYWwgU1RSSVAKKyAgICBnbG9iYWwgU1RSSVBGTEFHUworICAgIGdsb2JhbCBOTQorICAgIGdsb2JhbCBOTUZMQUdTCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKworICAgIHNldCB0ZXN0ICJzdHJpcCIKKworICAgIGlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7CisJdW50ZXN0ZWQgJHRlc3QKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOworICAgIH0gZWxzZSB7CisJc2V0IG9iamZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KKyAgICB9CisKKyAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkU1RSSVAgIiRTVFJJUEZMQUdTICRvYmpmaWxlIl0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKKwlmYWlsICR0ZXN0CisJcmV0dXJuCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICItYSAkTk1GTEFHUyAkb2JqZmlsZSJdCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKKwlmYWlsICR0ZXN0CisJcmV0dXJuCisgICAgfQorCisgICAgcGFzcyAkdGVzdAorfQorCitzdHJpcF90ZXN0CisKKyMgVGVzdCBzdHJpcHBpbmcgYW4gb2JqZWN0IGZpbGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wKKworcHJvYyBzdHJpcF90ZXN0X3dpdGhfc2F2aW5nX2Ffc3ltYm9sIHsgfSB7CisgICAgZ2xvYmFsIENDCisgICAgZ2xvYmFsIFNUUklQCisgICAgZ2xvYmFsIFNUUklQRkxBR1MKKyAgICBnbG9iYWwgTk0KKyAgICBnbG9iYWwgTk1GTEFHUworICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisKKyAgICBzZXQgdGVzdCAic3RyaXAgd2l0aCBzYXZpbmcgYSBzeW1ib2wiCisKKyAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0geworCXVudGVzdGVkICR0ZXN0CisJcmV0dXJuCisgICAgfQorCisgICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKKyAgICB9IGVsc2UgeworCXNldCBvYmpmaWxlIHRtcGRpci90ZXN0cHJvZy5vCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJFNUUklQICIkU1RSSVBGTEFHUyAtSyBtYWluIC1LIF9tYWluICRvYmpmaWxlIl0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKKwlmYWlsICR0ZXN0CisJcmV0dXJuCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAkb2JqZmlsZSJdCisgICAgaWYgeyFbcmVnZXhwIHteKFswLTlhLWZBLUZdKyk/WyBdK1QgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCisgICAgICAgICAmJiAhW3JlZ2V4cCB7XihbMC05YS1mQS1GXSspP1sgXStUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7CisJZmFpbCAkdGVzdAorCXJldHVybgorICAgIH0KKworICAgIHBhc3MgJHRlc3QKK30KKworc3RyaXBfdGVzdF93aXRoX3NhdmluZ19hX3N5bWJvbAorCisjIEJ1aWxkIGEgZmluYWwgZXhlY3V0YWJsZS4KKworcHJvYyBjb3B5X3NldHVwIHsgfSB7CisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICAKKyAgICBzZXQgcmVzIFtidWlsZF93cmFwcGVyIHRlc3RnbHVlLm9dOworICAgIHNldCBmbGFncyB7IGRlYnVnIH07CisgICAgCisgICAgaWYgeyAkcmVzICE9ICIiIH0geworCWxhcHBlbmQgZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9W2xpbmRleCAkcmVzIDFdIjsKKwlzZXQgYWRkX2xpYnMgInRlc3RnbHVlLm8iOworICAgIH0gZWxzZSB7CisJc2V0IGFkZF9saWJzICIiOworICAgIH0KKworICAgIGlmIHsgW3RhcmdldF9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyAkYWRkX2xpYnMiIHRtcGRpci90ZXN0cHJvZyBleGVjdXRhYmxlICRmbGFnc10gICE9ICIiIH0geworCXJldHVybiAyCisgICAgfQorCisgICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci90ZXN0cHJvZ107CisgICAgc2V0IHN0YXR1cyBbbGluZGV4ICRyZXN1bHQgMF07CisKKyAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiICB9IHsKKwlwZXJyb3IgInVucmVzb2x2ZWQgc2V0dXAsIHN0YXR1cyA9ICRzdGF0dXMiCisJcmV0dXJuIDMKKyAgICB9CisKKyAgICByZXR1cm4gMAorfQorCisjIFRlc3QgY29weWluZyBhbiBleGVjdXRhYmxlLgorCitwcm9jIGNvcHlfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdDEgdGVzdDIgfSB7CisKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZ107CisJc2V0IHRlc3Rjb3B5IGNvcHlwcm9nCisgICAgfSBlbHNlIHsKKwlzZXQgdGVzdGZpbGUgdG1wZGlyL3Rlc3Rwcm9nCisJc2V0IHRlc3Rjb3B5IHRtcGRpci9jb3B5cHJvZworICAgIH0KKyAgICByZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkdGVzdGNvcHk7CisKKyAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkcHJvZyAiJGZsYWdzICR0ZXN0ZmlsZSAkdGVzdGNvcHkiXQorCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJZmFpbCAkdGVzdDEKKwlmYWlsICR0ZXN0MgorCXJldHVybgorICAgIH0KKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXJlbW90ZV91cGxvYWQgaG9zdCAkdGVzdGNvcHkgdG1wZGlyL2NvcHlwcm9nCisgICAgfQorCisgICAgc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgYnVpbGQgImNtcCIgInRtcGRpci90ZXN0cHJvZyB0bXBkaXIvY29weXByb2ciXQorICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07CisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisJcGFzcyAkdGVzdDEKKyAgICB9IGVsc2UgeworCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwl2ZXJib3NlICIkZXhlY19vdXRwdXQiCisKKwkjIFRoaXMgd2lsbCBmYWlsIGZvciBtYW55IHJlYXNvbnMuICBGb3IgZXhhbXBsZSwgaXQgd2lsbCBtb3N0CisJIyBsaWtlbHkgZmFpbCBpZiBhIG5vbi1HTlUgbGlua2VyIGlzIHVzZWQuICBUaGVyZWZvcmUsIHdlIGRvCisJIyBub3QgaW5zaXN0IHRoYXQgaXQgcGFzcy4gIElmIHlvdSBhcmUgdXNpbmcgYW4gYXNzZW1ibGVyIGFuZAorCSMgbGlua2VyIGJhc2VkIG9uIHRoZSBzYW1lIEJGRCBhcyBvYmpjb3B5LCBpdCBpcyB3b3J0aAorCSMgaW52ZXN0aWdhdGluZyB0byBzZWUgd2h5IHRoaXMgZmFpbHVyZSBvY2N1cnMuICBJZiB3ZSBhcmUKKwkjIGNyb3NzIGNvbXBpbGluZywgd2UgYXNzdW1lIHRoYXQgYSBHTlUgbGlua2VyIGlzIGJlaW5nIHVzZWQsCisJIyBhbmQgZXhwZWN0IGl0IHRvIHN1Y2NlZWQuCisJaWYge1tpc25hdGl2ZV19IHRoZW4geworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJfQorCisJIyBUaGlzIGFsc28gZmFpbHMgZm9yIG1pcHMqLSotZWxmIHRhcmdldHMuICBTZWUgZWxmMzItbWlwcy5jCisJIyBtaXBzX2VsZl9zeW1faXNfZ2xvYmFsLgorCXNldHVwX3hmYWlsICJtaXBzKi0qLWVsZiIKKworCWZhaWwgJHRlc3QxCisgICAgfQorCisgICAgc2V0IG91dHB1dCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9jb3B5cHJvZ10KKyAgICBzZXQgc3RhdHVzIFtsaW5kZXggJG91dHB1dCAwXTsKKyAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0geworCWZhaWwgJHRlc3QyCisgICAgfSBlbHNlIHsKKwlwYXNzICR0ZXN0MgorICAgIH0KK30KKworIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlCisKK3Byb2Mgc3RyaXBfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKKyAgICBnbG9iYWwgTk0KKyAgICBnbG9iYWwgTk1GTEFHUworCisgICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107CisgICAgfSBlbHNlIHsKKwlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJZmFpbCAkdGVzdAorCXJldHVybgorICAgIH0KKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7CisgICAgfQorCisgICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KKyAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKKyAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0geworCWZhaWwgJHRlc3QKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKKwlmYWlsICR0ZXN0CisJcmV0dXJuCisgICAgfQorICAgIHBhc3MgJHRlc3QKK30KKworIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCisKK3Byb2Mgc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKKyAgICBnbG9iYWwgTk0KKyAgICBnbG9iYWwgTk1GTEFHUworCisgICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107CisgICAgfSBlbHNlIHsKKwlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJZmFpbCAkdGVzdAorCXJldHVybgorICAgIH0KKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7CisgICAgfQorCisgICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KKyAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKKyAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0geworCWZhaWwgJHRlc3QKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCisgICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZkEtRl0rIFQgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCisgICAgICAgICAmJiAhW3JlZ2V4cCB7XlswLTlhLWZBLUZdKyBUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7CisJZmFpbCAkdGVzdAorCXJldHVybgorICAgIH0KKyAgICBwYXNzICR0ZXN0Cit9CisKK3NldCB0ZXN0MSAic2ltcGxlIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKK3NldCB0ZXN0MiAicnVuIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKK3NldCB0ZXN0MyAicnVuIHN0cmlwcGVkIGV4ZWN1dGFibGUiCitzZXQgdGVzdDQgInJ1biBzdHJpcHBlZCBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sIgorCitzd2l0Y2ggW2NvcHlfc2V0dXBdIHsKKyAgICAiMSIgeworCSMgZG8gbm90aGluZworICAgIH0KKyAgICAiMiIgeworCXVudGVzdGVkICR0ZXN0MQorCXVudGVzdGVkICR0ZXN0MgorCXVudGVzdGVkICR0ZXN0MworCXVudGVzdGVkICR0ZXN0NAorICAgIH0KKyAgICAiMyIgeworCXVucmVzb2x2ZWQgJHRlc3QxCisJdW5yZXNvbHZlZCAkdGVzdDIKKwl1bnJlc29sdmVkICR0ZXN0MworCXVucmVzb2x2ZWQgJHRlc3Q0CisgICAgfQorICAgICIwIiB7CisJY29weV9leGVjdXRhYmxlICIkT0JKQ09QWSIgIiRPQkpDT1BZRkxBR1MiICIkdGVzdDEiICIkdGVzdDIiCisJc3RyaXBfZXhlY3V0YWJsZSAiJFNUUklQIiAiJFNUUklQRkxBR1MiICIkdGVzdDMiCisJc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCAiJFNUUklQIiAiLUsgbWFpbiAtSyBfbWFpbiAkU1RSSVBGTEFHUyIgIiR0ZXN0NCIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzUwZjAyCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cApAQCAtMCwwICsxLDE0MCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KKyMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KKworaWYgIVtpc19yZW1vdGUgaG9zdF0geworICAgIGlmIHtbd2hpY2ggJE9CSkRVTVBdID09IDB9IHRoZW4geworCXBlcnJvciAiJE9CSkRVTVAgZG9lcyBub3QgZXhpc3QiCisJcmV0dXJuCisgICAgfQorfQorCitzZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkT0JKRFVNUF0iCisKKyMgU2ltcGxlIHRlc3Qgb2Ygb2JqZHVtcCAtaQorCitzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWkiXQorCitzZXQgY3B1c19leHBlY3RlZCAiKGEyOWt8YWxsaWFudHxhbHBoYXxhcmN8YXJtfGNvbnZleHxkMTB2fGQzMHZ8aDh8aHBwYXxpMzg2fGk4NjB8aTk2MHxtMzJyfG02OGt8bTg4a3xtaXBzfG1uMTAyMDB8bW4xMDMwMHxuczMya3xwb3dlcnBjfHB5cmFtaWR8cm9tcHxyczYwMDB8c2h8c3BhcmN8dGFob2V8djg1MHx2YXh8d2UzMmt8ejhrfHo4MDAxfHo4MDAyKSIKKworIyBNYWtlIHN1cmUgdGhlIHRhcmdldCBDUFUgc2hvd3MgdXAgaW4gdGhlIGxpc3QuCitpZiAhW3JlZ2V4cCAkY3B1c19leHBlY3RlZCAkdGFyZ2V0X2NwdV0geworICAgIHJlZ3N1YiAiXlxbKFxdIiAiJGNwdXNfZXhwZWN0ZWQiICIoJHt0YXJnZXRfY3B1fXwiIGNwdXNfZXhwZWN0ZWQ7Cit9CisKK3NldCB3YW50ICJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbi4qc3JlYy4qaGVhZGVyIC4qIGVuZGlhbi4qLCBkYXRhIC4qIGVuZGlhbi4qJGNwdXNfZXhwZWN0ZWQiCisKK2lmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7CisgICAgcGFzcyAib2JqZHVtcCAtaSIKK30gZWxzZSB7CisgICAgZmFpbCAib2JqZHVtcCAtaSIKK30KKworIyBUaGUgcmVtYWluaW5nIHRlc3RzIHJlcXVpcmUgYSB0ZXN0IGZpbGUuCisKKworaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7CisgICAgcmV0dXJuCit9CitpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKyAgICBzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSB0bXBkaXIvYmludGVzdC5vCit9CisKKyMgVGVzdCBvYmpkdW1wIC1mCisKK3NldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAkdGVzdGZpbGUiXQorCitzZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qYXJjaGl0ZWN0dXJlOlxbIAlcXSoke2NwdXNfZXhwZWN0ZWR9LipIQVNfUkVMT0MuKkhBU19TWU1TIgorCitpZiAhW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKKyAgICBmYWlsICJvYmpkdW1wIC1mIgorfSBlbHNlIHsKKyAgICBwYXNzICJvYmpkdW1wIC1mIgorfQorCisjIFRlc3Qgb2JqZHVtcCAtaAorCitzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHRlc3RmaWxlIl0KKworc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKlNlY3Rpb25zLipcWzAtOVxdK1xbIAlcXStcW14gCVxdKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXiAJXF0qXFsgCVxdKihcWzAtOWEtZkEtRlxdKykuKlxbMC05XF0rXFsgCVxdK1xbXiAJXF0qKFxcLmRhdGF8REFUQSlcW14gCVxdKlxbIAlcXSooXFswLTlhLWZBLUZcXSspIgorCitpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0X25hbWUgdGV4dF9zaXplIGRhdGFfbmFtZSBkYXRhX3NpemVdIHRoZW4geworICAgIGZhaWwgIm9iamR1bXAgLWgiCit9IGVsc2UgeworICAgIHZlcmJvc2UgInRleHQgbmFtZSBpcyAkdGV4dF9uYW1lIHNpemUgaXMgJHRleHRfc2l6ZSIKKyAgICB2ZXJib3NlICJkYXRhIG5hbWUgaXMgJGRhdGFfbmFtZSBzaXplIGlzICRkYXRhX3NpemUiCisgICAgaWYge1tleHByICIweCR0ZXh0X3NpemUiXSA8IDggfHwgW2V4cHIgIjB4JGRhdGFfc2l6ZSJdIDwgNH0gdGhlbiB7CisJc2VuZF9sb2cgInNpemVzIHRvbyBzbWFsbFxuIgorCWZhaWwgIm9iamR1bXAgLWgiCisgICAgfSBlbHNlIHsKKwlwYXNzICJvYmpkdW1wIC1oIgorICAgIH0KK30KKworIyBUZXN0IG9iamR1bXAgLXQKKworc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC10ICR0ZXN0ZmlsZSJdCisKK2lmIFtpbmZvIGV4aXN0cyB2YXJzXSB0aGVuIHsgdW5zZXQgdmFycyB9Cit3aGlsZSB7W3JlZ2V4cCAiKFxbYS16XF0qX3N5bWJvbCkoLiopIiAkZ290IGFsbCBzeW1ib2wgcmVzdF19IHsKKyAgICBzZXQgdmFycygkc3ltYm9sKSAxCisgICAgc2V0IGdvdCAkcmVzdAorfQorCitpZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRleHRfc3ltYm9sKV0gXAorICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZGF0YV9zeW1ib2wpXSBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAorICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV19IHRoZW4geworICAgIGZhaWwgIm9iamR1bXAgLXQiCit9IGVsc2UgeworICAgIHBhc3MgIm9iamR1bXAgLXQiCit9CisKKyMgVGVzdCBvYmpkdW1wIC1yCisKK3NldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtciAkdGVzdGZpbGUiXQorCitzZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcXFxbXFteXF1cXSoodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW15cXVxdKlxcXF0uKmV4dGVybmFsX3N5bWJvbCIKKworaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKKyAgICBwYXNzICJvYmpkdW1wIC1yIgorfSBlbHNlIHsKKyAgICBmYWlsICJvYmpkdW1wIC1yIgorfQorCisjIFRlc3Qgb2JqZHVtcCAtcworCitzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXMgJHRlc3RmaWxlIl0KKworc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKkNvbnRlbnRzLioodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW14wLTlcXSpcWyAJXF0qXFswLTlhLWZBLUZcXSpcWyAJXF0qKDAwMDAwMDAxfDAxMDAwMDAwKS4qQ29udGVudHMuKihkYXRhfERBVEEpXFteMC05XF0qXFsgCVxdKlxbMC05YS1mQS1GXF0qXFsgCVxdKigwMDAwMDAwMnwwMjAwMDAwMCkiCisKK2lmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7CisgICAgcGFzcyAib2JqZHVtcCAtcyIKK30gZWxzZSB7CisgICAgZmFpbCAib2JqZHVtcCAtcyIKK30KKworIyBPcHRpb25zIHdoaWNoIGFyZSBub3QgdGVzdGVkOiAtYSAtZCAtRCAtUiAtVCAteCAtbCAtLXN0YWJzCisjIEkgZG9uJ3Qgc2VlIGFueSBnZW5lcmljIHdheSB0byB0ZXN0IGFueSBvZiB0aGVzZSBvdGhlciB0aGFuIC1hLgorIyBUZXN0cyBjb3VsZCBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyB0YXJnZXRzLCBhbmQgdGhhdCBzaG91bGQgYmUgZG9uZQorIyBpZiBzcGVjaWZpYyBwcm9ibGVtcyBhcmUgZm91bmQuCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY3NDRjCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cApAQCAtMCwwICsxLDIxNyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQorCisjIFdyaXR0ZW4gYnkgTmljayBDbGlmdG8gIDxuaWNrY0BjeWdudXMuY29tPgorIyBCYXNlZCBvbiBzY3JpcHRzIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+CisjIGFuZCBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KKworIyBGaXJzdCBzb21lIGhlbHBmdWwgcHJvY2VkdXJlcywgdGhlbiB0aGUgdGVzdHMgdGhlbXNlbHZlcworCisjIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVuYW1lIGdpdmVuCitwcm9jIGZpbGVfY29udGVudHMgeyBmaWxlbmFtZSB9IHsKKyAgICBzZXQgZmlsZSBbb3BlbiAkZmlsZW5hbWUgcl0KKyAgICBzZXQgY29udGVudHMgW3JlYWQgJGZpbGVdCisgICAgY2xvc2UgJGZpbGUKKyAgICByZXR1cm4gJGNvbnRlbnRzCit9CisKKyMgcmVnZXhwX2RpZmYsIGJhc2VkIG9uIHNpbXBsZV9kaWZmIHRha2VuIGZyb20gbGQgdGVzdCBzdWl0ZQorIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCisjCWZpbGUxIGNvbnRhaW5zIHN0cmluZ3MsIGZpbGUyIGNvbnRhaW5zIHJlZ2V4cHMgYW5kICMtY29tbWVudHMKKyMJYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgaW4gZWl0aGVyIGZpbGUKKyMJcmV0dXJucyBub24temVybyBpZiBkaWZmZXJlbmNlcyBleGlzdAorIworcHJvYyByZWdleHBfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7CisKKyAgICBzZXQgZW9mIC0xCisgICAgc2V0IGVuZF8xIDAKKyAgICBzZXQgZW5kXzIgMAorICAgIHNldCBkaWZmZXJlbmNlcyAwCisgICAgc2V0IGRpZmZfcGFzcyAwCisKKyAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7CisJc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCisgICAgfSBlbHNlIHsKKwl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCisJcmV0dXJuIDEKKyAgICB9CisKKyAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMl0gdGhlbiB7CisJc2V0IGZpbGVfYiBbb3BlbiAkZmlsZV8yIHJdCisgICAgfSBlbHNlIHsKKwlmYWlsICIkZmlsZV8yIGRvZXNuJ3QgZXhpc3QiCisJY2xvc2UgJGZpbGVfYQorCXJldHVybiAxCisgICAgfQorCisgICAgdmVyYm9zZSAiIFJlZ2V4cC1kaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yIiAyCisKKyAgICB3aGlsZSB7IDEgfSB7CisJc2V0IGxpbmVfYSAiIgorCXNldCBsaW5lX2IgIiIKKwl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2FdID09IDAgfSB7CisJICAgIGlmIHsgW2dldHMgJGZpbGVfYSBsaW5lX2FdID09ICRlb2YgfSB7CisJCXNldCBlbmRfMSAxCisJCWJyZWFrCisJICAgIH0KKwl9CisJd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9iXSA9PSAwIHx8IFtzdHJpbmcgbWF0Y2ggIiMqIiAkbGluZV9iXSB9IHsKKwkgICAgaWYgWyBzdHJpbmcgbWF0Y2ggIiNwYXNzIiAkbGluZV9iIF0geworCQlzZXQgZW5kXzIgMQorCQlzZXQgZGlmZl9wYXNzIDEKKwkJYnJlYWsKKwkgICAgfQorCSAgICBpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0geworCQlzZXQgZW5kXzIgMQorCQlicmVhaworCSAgICB9CisJfQorCisgICAgICAgIGlmIHsgJGRpZmZfcGFzcyB9IHsgCisgICAgICAgICAgICBicmVhayAKKyAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgJiYgJGVuZF8yIH0geyAKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xIH0geworICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzFcbiIKKyAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzEiIDMKKyAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCisgICAgICAgICAgICBicmVhaworICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMiB9IHsKKyAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIgorICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIgMworICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ZXJib3NlICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiIiAzCisgICAgICAgICAgICBpZiAhW3JlZ2V4cCAiXiRsaW5lX2IkIiAiJGxpbmVfYSJdIHsKKwkJc2VuZF9sb2cgInJlZ2V4cF9kaWZmIG1hdGNoIGZhaWx1cmVcbiIKKwkJc2VuZF9sb2cgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCJcbiIKKwkJc2V0IGRpZmZlcmVuY2VzIDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgeyAkZGlmZmVyZW5jZXMgPT0gMCAmJiAhJGRpZmZfcGFzcyAmJiBbZW9mICRmaWxlX2FdICE9IFtlb2YgJGZpbGVfYl0gfSB7CisJc2VuZF9sb2cgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzXG4iCisJdmVyYm9zZSAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHMiIDMKKwlzZXQgZGlmZmVyZW5jZXMgMQorICAgIH0KKworICAgIGNsb3NlICRmaWxlX2EKKyAgICBjbG9zZSAkZmlsZV9iCisKKyAgICByZXR1cm4gJGRpZmZlcmVuY2VzCit9CisKKyMgUnVuIGFuIGluZGl2aWR1YWwgcmVhZGVsZiB0ZXN0LgorIyBCYXNpY2FsbHkgcmVhZGVsZiBpcyBydW4gb24gdGhlIGJpbmFyeV9maWxlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuCisjIFJlYWRlbGYncyBvdXRwdXQgaXMgY2FwdHVyZWQgYW5kIHRoZW4gY29tcGFyZWQgYWdhaW5zdCB0aGUgY29udGVudHMKKyMgb2YgdGhlIHJlZ2V4cF9maWxlLgorCitwcm9jIHJlYWRlbGZfdGVzdCB7IG9wdGlvbnMgYmluYXJ5X2ZpbGUgcmVnZXhwX2ZpbGUgeGZhaWxzIH0geworCisgICAgZ2xvYmFsIFJFQURFTEYKKyAgICBnbG9iYWwgUkVBREVMRkZMQUdTCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICAKKyAgICBzZW5kX2xvZyAiZXhlYyAkUkVBREVMRiAkUkVBREVMRkZMQUdTICRvcHRpb25zICRiaW5hcnlfZmlsZSA+IHJlYWRlbGYub3V0IgorICAgIGNhdGNoICJleGVjICRSRUFERUxGICRSRUFERUxGRkxBR1MgJG9wdGlvbnMgJGJpbmFyeV9maWxlID4gcmVhZGVsZi5vdXQiIGdvdAorCisgICAgaWYgeyBbbGxlbmd0aCAkeGZhaWxzXSAhPSAwIH0gdGhlbiB7CisJc2V0dXBfeGZhaWwgJHhmYWlscworICAgIH0KKyAgICAKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKKwlzZW5kX2xvZyAkZ290CisJZmFpbCAicmVhZGVsZiAkb3B0aW9ucyIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiB7IFtyZWdleHBfZGlmZiByZWFkZWxmLm91dCAkc3JjZGlyLyRzdWJkaXIvJHJlZ2V4cF9maWxlXSB9IHRoZW4geworCWZhaWwgInJlYWRlbGYgJG9wdGlvbnMiCisJdmVyYm9zZSAib3V0cHV0IGlzIFxuW2ZpbGVfY29udGVudHMgcmVhZGVsZi5vdXRdIiAyCisJcmV0dXJuCisgICAgfQorCisgICAgcGFzcyAicmVhZGVsZiAkb3B0aW9ucyIKK30KKworCisKKyMgT25seSBFTEYgYmFzZWQgdG9vbGNoYWlucyBuZWVkIHJlYWRlbGYuCisjIEZvciBub3cgYmUgcGFyYW5vaWQgYW5kIGFzc3VtZSB0aGF0IGlmIEVMRiBpcyBub3QgbWVudGlvbmVkCisjIGluIHRoZSB0YXJnZXQgc3RyaW5nLCB0aGVuIHRoZSB0YXJnZXQgaXMgbm90IGFuIEVMRiBiYXNlZCBwb3J0LgorCitpZiAhW2lzdGFyZ2V0ICIqLSplbGYiXSB0aGVuIHsKKyAgICB2ZXJib3NlICIkUkVBREVMRiBpcyBvbmx5IGludGVudGVkZWQgZm9yIEVMRiB0YXJnZXRzIiAyCisgICAgcmV0dXJuCit9CisKK2lmICFbaXNfcmVtb3RlIGhvc3RdIHsKKyAgICBpZiB7W3doaWNoICRSRUFERUxGXSA9PSAwfSB0aGVuIHsKKyAgICAgICAgcGVycm9yICIkUkVBREVMRiBkb2VzIG5vdCBleGlzdCIKKyAgICAgICAgcmV0dXJuCisgICAgfQorfQorCitzZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkUkVBREVMRl0iCisKKyMgQXNzZW1sZSB0aGUgdGVzdCBmaWxlLgoraWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7CisgICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCisgICAgdW5yZXNvbHZlZCAicmVhZGVsZiAtIGZhaWxlZCB0byBhc3NlbWJsZSIKKyAgICByZXR1cm4KK30KKworaWYgIVtpc19yZW1vdGUgaG9zdF0geworICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vOworfSBlbHNlIHsKKyAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCit9CisKKyMgUnVuIHRoZSB0ZXN0cworcmVhZGVsZl90ZXN0IC1oICR0ZW1wZmlsZSByZWFkZWxmLmggIHt9CisKKyMgVGhlIHY4NTAgZmFpbHMgdGhlIG5leHQgdHdvIHRlc3RzIGJlY2F1c2UgaXQgY3JlYXRlcyB0d28gc3BlY2lhbAorIyBzZWN0aW9ucyBvZiBpdHMgb3duOiAuY2FsbF90YWJsZV9kYXRhIGFuZCAuY2FsbF90YWJsZV90ZXh0CisjIFRoZSByZWdleHAgc2NyaXB0cyBhcmUgbm90IGV4cGVjdGluZyB0aGVzZSBzZWN0aW9ucy4uLgorCityZWFkZWxmX3Rlc3QgLVMgJHRlbXBmaWxlIHJlYWRlbGYucyAge3Y4NTAqLSotKn0KK3JlYWRlbGZfdGVzdCAtcyAkdGVtcGZpbGUgcmVhZGVsZi5zcyB7djg1MCotKi0qfQorcmVhZGVsZl90ZXN0IC1yICR0ZW1wZmlsZSByZWFkZWxmLnIgIHt9CisKKworIyBDb21waWxlIHRoZSBzZWNvbmQgdGVzdCBmaWxlLgoraWYgeyBbdGFyZ2V0X2NvbXBpbGUgJHNyY2Rpci8kc3ViZGlyL3Rlc3Rwcm9nLmMgdG1wZGlyL3Rlc3Rwcm9nLm8gb2JqZWN0IGRlYnVnXSAhPSAiIiB9IHsKKyAgICB1bnRlc3RlZCAicmVhZGVsZiAtdyIKKyAgICByZXR1cm4KK30KKworaWYgW2lzX3JlbW90ZSBob3N0XSB7CisgICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvdGVzdHByb2cub107Cit9IGVsc2UgeworICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvdGVzdHByb2cubworfQorCisjIFRoZSB4ZmFpbCB0YXJnZXRzIGhlcmUgZG8gbm90IGRlZmF1bHQgdG8gRFdBUkYyIGZvcm1hdCBkZWJ1ZyBpbmZvcm1hdGlvbgorIyBUaGUgc3ltcHRvbSBpcyB0aGF0IHRoZSBvdXRwdXQgb2YgJ3JlYWRlbGYgLXdpJyBpcyBlbXB0eS4KKworcmVhZGVsZl90ZXN0IC13aSAkdGVtcGZpbGUgcmVhZGVsZi53aSB7djg1MCotKi0qfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmggYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTVhZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmgKQEAgLTAsMCArMSwxNiBAQAorRUxGIEhlYWRlcjoKKyAgTWFnaWM6ICAgN2YgNDUgNGMgNDYgMFsxMl0gMFsxMl0gMDEgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgCisgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMIFwoUmVsb2NhdGFibGUgZmlsZVwpCisgIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKKyAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEZEQVRBLiogZW5kaWFuXCkKKyAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweDAKKyAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAwIFwoYnl0ZXMgaW50byBmaWxlXCkKKyAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAuKiBcKGJ5dGVzIGludG8gZmlsZVwpCisgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKKyAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAuKiBcKGJ5dGVzXCkKKyAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAwIFwoYnl0ZXNcKQorICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgIDAKKyAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAuKiBcKGJ5dGVzXCkKKyAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAuKgorICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuciBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWE3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucgpAQCAtMCwwICsxLDQgQEAKKworUmVsb2NhdGlvbiBzZWN0aW9uICcucmVsLip0ZXh0JyBhdCBvZmZzZXQgMHguKiBjb250YWlucyAxIGVudHJpZXM6CisgIE9mZnNldCAgICBJbmZvICBUeXBlICAgICAgICAgICAgU3ltYm9sJ3MgVmFsdWUgIFN5bWJvbCdzIE5hbWUuKgorICAwMDAwMDAwNCAgMDAuKiBSXy4qICAgICAgICAgICAwMDAwMDAwMCAgZXh0ZXJuYWxfc3ltYm9sLioKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCkBAIC0wLDAgKzEsMTMgQEAKK1RoZXJlIGFyZSAuKiBzZWN0aW9uIGhlYWRlcnMsIHN0YXJ0aW5nIGF0IG9mZnNldCAuKjoKKworU2VjdGlvbiBIZWFkZXJzOgorICBcW05yXF0gTmFtZSAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFkZHIgICAgIE9mZiAgICBTaXplICAgRVMgRmxnIExrIEluZiBBbAorICBcWyAwXF0gICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgIDAwMDAwMDAwIDAwMDAwMCAwMDAwMDAgMDAgICAgICAwICAgMCAwCisgIFxbIDFcXSAudGV4dCAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDM0IDAwMDAwOCAwMCAgQVggIDAgICAwIC4KKyAgXFsgMlxdIC5yZWwuK3RleHQgK1JFTC4gKzArIDArLiogMDAwMDAuIDAuICAgICAgLiAgIDEgNAorICBcWyAzXF0gLmRhdGEgICAgICAgICAgICAgUFJPR0JJVFMgICAgICAgIDAwMDAwMDAwIDAwMDAzYyAwMDAwMDQgMDAgV0EgICAwICAgMCAuCisgIFxbIDRcXSAuYnNzICAgICAgICAgICAgICBOT0JJVFMgICAgICAgICAgMDAwMDAwMDAgMDAwMDQwIDAwMDAwMCAwMCBXQSAgIDAgICAwIC4KKyAgXFsgNVxdIC5zaHN0cnRhYiAgICAgICAgIFNUUlRBQiAgICAgICAgICAwMDAwMDAwMCAwMDAwNDAgMDAwMC4qIDAwICAgICAgMCAgIDAgLgorICBcWyA2XF0gLnN5bXRhYiAgICAgICAgICAgU1lNVEFCICAgICAgICAgIDAwMDAwMDAwIDArLiogMCsuKiAxMCAgICAgIDcgICA2IDQKKyAgXFsgN1xdIC5zdHJ0YWIgICAgICAgICAgIFNUUlRBQiAgICAgICAgICAwMDAwMDAwMCAwKy4qIDArLiogMDAgICAgICAwICAgMCAxCisKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzYwYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzCkBAIC0wLDAgKzEsMTMgQEAKKworU3ltYm9sIHRhYmxlICcuc3ltdGFiJyBjb250YWlucyAuKiBlbnRyaWVzOgorICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIE90ICBOZHggTmFtZQorICAgIDA6ICAgICAgICAwICAgICAwIE5PVFlQRSAgTE9DQUwgICAwICBVTkQgCisgICAgMTogICAgICAgIDAgICAgIDAgU0VDVElPTiBMT0NBTCAgIDAgICAgMSAKKyAgICAyOiAgICAgICAgMCAgICAgMCBTRUNUSU9OIExPQ0FMICAgMCAgICAzIAorICAgIDM6ICAgICAgICAwICAgICAwIFNFQ1RJT04gTE9DQUwgICAwICAgIDQgCisgICAgNDogICAgICAgIDAgICAgIDAgTk9UWVBFICBMT0NBTCAgIDAgICAgMSBzdGF0aWNfdGV4dF9zeW1ib2wKKyAgICA1OiAgICAgICAgMCAgICAgMCBOT1RZUEUgIExPQ0FMICAgMCAgICAzIHN0YXRpY19kYXRhX3N5bWJvbAorICAgIC46ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDEgdGV4dF9zeW1ib2wKKyAgICAuOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIEdMT0JBTCAgMCAgVU5EIGV4dGVybmFsX3N5bWJvbAorICAgLio6ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDMgZGF0YV9zeW1ib2wKKyAgIC4qOiAgICAgICAgNCAgICAgNCBPQkpFQ1QgIEdMT0JBTCAgMCAgQ09NIGNvbW1vbl9zeW1ib2wKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aSBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2IyZWNjCi0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLndpCkBAIC0wLDAgKzEsNzggQEAKK1RoZSBzZWN0aW9uIC5kZWJ1Z19pbmZvIGNvbnRhaW5zOgorCisgIENvbXBpbGF0aW9uIFVuaXQ6CisgICBMZW5ndGg6ICAgICAgICAuKgorICAgVmVyc2lvbjogICAgICAgMgorICAgQWJicmV2IE9mZnNldDogMAorICAgUG9pbnRlciBTaXplOiAgNAorICAgIEFiYnJldiBOdW1iZXI6IDEgXChEV19UQUdfY29tcGlsZV91bml0XCkKKyAgICAgRFdfQVRfbmFtZSAgICAgICAgOiAuKi90ZXN0cHJvZy5jCQorICAgICBEV19BVF9jb21wX2RpciAgICA6IC4qL2JpbnV0aWxzCQorICAgICBEV19BVF9wcm9kdWNlciAgICA6IEdOVSBDIC4qCQorICAgICBEV19BVF9sYW5ndWFnZSAgICA6IDEJXChBTlNJIENcKQorICAgICBEV19BVF9sb3dfcGMgICAgICA6IDAJCisgICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCisgICAgIERXX0FUX3N0bXRfbGlzdCAgIDogMAkKKyAgICBBYmJyZXYgTnVtYmVyOiAyIFwoRFdfVEFHX3N1YnByb2dyYW1cKQorICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCisgICAgIERXX0FUX25hbWUgICAgICAgIDogZm4JCisgICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKKyAgICAgRFdfQVRfZGVjbF9saW5lICAgOiBhCQorICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQorICAgICBEV19BVF9sb3dfcGMgICAgICA6IDAJCisgICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCisgICAgIERXX0FUX2ZyYW1lX2Jhc2UgIDogMSBieXRlIGJsb2NrOiAuKgorICAgIEFiYnJldiBOdW1iZXI6IDMgXChEV19UQUdfYmFzZV90eXBlXCkKKyAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBpbnQJCisgICAgIERXX0FUX2J5dGVfc2l6ZSAgIDogNAkKKyAgICAgRFdfQVRfZW5jb2RpbmcgICAgOiA1CVwoc2lnbmVkXCkKKyAgICBBYmJyZXYgTnVtYmVyOiA0IFwoRFdfVEFHX3N1YnByb2dyYW1cKQorICAgICBEV19BVF9zaWJsaW5nICAgICA6IC4qCQorICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCisgICAgIERXX0FUX25hbWUgICAgICAgIDogbWFpbgkKKyAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQorICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDEwCQorICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQorICAgICBEV19BVF9sb3dfcGMgICAgICA6IC4qCQorICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQorICAgICBEV19BVF9mcmFtZV9iYXNlICA6IDEgYnl0ZSBibG9jazogLioKKyAgICBBYmJyZXYgTnVtYmVyOiA1IFwoRFdfVEFHX2xleGljYWxfYmxvY2tcKQorICAgICBEV19BVF9sb3dfcGMgICAgICA6IC4qCQorICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQorCisgICBFeHRyYSBkYXRhIGF0IGVuZCBvZiBjb21wIHVuaXQ6CisgLio6IEFiYnJldiBOdW1iZXI6IDYgXChEV19UQUdfdmFyaWFibGVcKQorICAgICBEV19BVF9uYW1lICAgICAgICA6IGNvbW1vbgkKKyAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQorICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDMJCisgICAgIERXX0FUX3R5cGUgICAgICAgIDogLioKKyAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQorICAgICBEV19BVF9sb2NhdGlvbiAgICA6IDUgYnl0ZSBibG9jazogMyAuIDAgMCAwIAlcKERXX09QX2FkZHI6IDBcKQorIC4qOiBBYmJyZXYgTnVtYmVyOiA2IFwoRFdfVEFHX3ZhcmlhYmxlXCkKKyAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBnbG9iYWwJCisgICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKKyAgICAgRFdfQVRfZGVjbF9saW5lICAgOiA0CQorICAgICBEV19BVF90eXBlICAgICAgICA6IC4qCQorICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCisgICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIDAgCVwoRFdfT1BfYWRkcjogMFwpCisgLio6IEFiYnJldiBOdW1iZXI6IDcgXChEV19UQUdfdmFyaWFibGVcKQorICAgICBEV19BVF9uYW1lICAgICAgICA6IGxvY2FsCQorICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCisgICAgIERXX0FUX2RlY2xfbGluZSAgIDogNQkKKyAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKKyAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgLiAwIDAgLiAJXChEV19PUF9hZGRyOiAuXCkKKyAuKjogQWJicmV2IE51bWJlcjogOCBcKERXX1RBR19hcnJheV90eXBlXCkKKyAgICAgRFdfQVRfc2libGluZyAgICAgOiAuKgkKKyAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKKyAuKjogQWJicmV2IE51bWJlcjogOSBcKERXX1RBR19zdWJyYW5nZV90eXBlXCkKKyAgICAgRFdfQVRfdXBwZXJfYm91bmQgOiA2CQorIC4qOiBBYmJyZXYgTnVtYmVyOiAzIFwoRFdfVEFHX2Jhc2VfdHlwZVwpCisgICAgIERXX0FUX25hbWUgICAgICAgIDogY2hhcgkKKyAgICAgRFdfQVRfYnl0ZV9zaXplICAgOiAxCQorICAgICBEV19BVF9lbmNvZGluZyAgICA6IC4JXCguKiBjaGFyXCkKKyAuKjogQWJicmV2IE51bWJlcjogNyBcKERXX1RBR192YXJpYWJsZVwpCisgICAgIERXX0FUX25hbWUgICAgICAgIDogc3RyaW5nCQorICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCisgICAgIERXX0FUX2RlY2xfbGluZSAgIDogNgkKKyAgICAgRFdfQVRfdHlwZSAgICAgICAgOiAuKgkKKyAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgLiAwIDAgLiAJXChEV19PUF9hZGRyOiAuXCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvc2l6ZS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDhjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCkBAIC0wLDAgKzEsNzggQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+CisjIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+CisKK2lmICFbaXNfcmVtb3RlIGhvc3RdIHsKKyAgICBpZiB7W3doaWNoICRTSVpFXSA9PSAwfSB0aGVuIHsKKwlwZXJyb3IgIiRTSVpFIGRvZXMgbm90IGV4aXN0IgorCXJldHVybgorICAgIH0KK30KKworc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJFNJWkVdIgorCisKK2lmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4geworICAgIHJldHVybgorfQorCitpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKyAgICBzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSB0bXBkaXIvYmludGVzdC5vCit9CisKK3NldCBkZWMgIlxbMC05XF0rIgorc2V0IGhleCAiXFswLTlhLWZBLUZcXSsiCisKKyMgVGVzdCBzaXplIHdpdGggbm8gYXJndW1lbnRzCisKK3NldCBnb3QgW2JpbnV0aWxzX3J1biAkU0laRSAiJFNJWkVGTEFHUyAkdGVzdGZpbGUiXQorCitzZXQgd2FudCAiKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkaGV4KVxbIAlcXSske3Rlc3RmaWxlfSIKKworaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdGV4dCBkYXRhIGJzcyBkdG90IGhleHRvdF0gdGhlbiB7CisgICAgZmFpbCAic2l6ZSAobm8gYXJndW1lbnRzKSIKK30gZWxzZSB7CisgICAgaWYgeyR0ZXh0IDwgOCB8fCAkZGF0YSA8IDR9IHRoZW4geworCWZhaWwgInNpemUgKG5vIGFyZ3VtZW50cykiCisgICAgfSBlbHNlIHsKKwlwYXNzICJzaXplIChubyBhcmd1bWVudHMpIgorICAgIH0KK30KKworIyBUZXN0IHNpemUgLUEKKworc2V0IGdvdCBbYmludXRpbHNfcnVuICRTSVpFICIkU0laRUZMQUdTIC1BICR7dGVzdGZpbGV9Il0KKworc2V0IHdhbnQgIiR7dGVzdGZpbGV9LioodGV4dHxURVhUKVxbXlxuXHJcXSpcWyAJXF0oJGRlYylcWyAJXF0rJGRlYy4qKFxcLmRhdGF8REFUQSlcW15cblxyXF0qXFsgCVxdKCRkZWMpXFsgCVxdKyRkZWMiCisKK2lmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHRleHRuYW1lIHRleHRzaXplIGRhdGFuYW1lIGRhdGFzaXplXSB0aGVuIHsKKyAgICBmYWlsICJzaXplIC1BIgorfSBlbHNlIHsKKyAgICB2ZXJib3NlICJ0ZXh0IHNpemU6ICR0ZXh0c2l6ZSIKKyAgICB2ZXJib3NlICJkYXRhIHNpemU6ICRkYXRhc2l6ZSIKKyAgICBpZiB7JHRleHRzaXplIDwgOCB8fCAkZGF0YXNpemUgPCA0fSB0aGVuIHsKKwlmYWlsICJzaXplIC1BIgorICAgIH0gZWxzZSB7CisJcGFzcyAic2l6ZSAtQSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwNjU2YgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYwpAQCAtMCwwICsxLDI4IEBACisvKiBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byB0ZXN0IG9iamNvcHkgYW5kIHN0cmlwLiAgKi8KKworaW50IGNvbW1vbjsKK2ludCBnbG9iYWwgPSAxOworc3RhdGljIGludCBsb2NhbCA9IDI7CitzdGF0aWMgY2hhciBzdHJpbmdbXSA9ICJzdHJpbmciOworCitpbnQKK2ZuICgpCit7CisgIHJldHVybiAzOworfQorCitpbnQKK21haW4gKCkKK3sKKyAgaWYgKGNvbW1vbiAhPSAwCisgICAgICB8fCBnbG9iYWwgIT0gMQorICAgICAgfHwgbG9jYWwgIT0gMgorICAgICAgfHwgc3RyY21wIChzdHJpbmcsICJzdHJpbmciKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImZhaWxlZFxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcHJpbnRmICgib2tcbiIpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjgwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCkBAIC0wLDAgKzEsODggQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZS4gKHJvYkBjeWdudXMuY29tKQorCitsb2FkX2xpYiB1dGlsLWRlZnMuZXhwCitsb2FkX2xpYiB1dGlscy1saWIuZXhwCisKK2lmICFbaW5mbyBleGlzdHMgTk1dIHRoZW4geworICAgIHNldCBOTSBbZmluZGZpbGUgJGJhc2VfZGlyL25tLW5ldyAkYmFzZV9kaXIvbm0tbmV3IFt0cmFuc2Zvcm0gbm1dXQorfQoraWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB0aGVuIHsKKyAgICBzZXQgTk1GTEFHUyAiIgorfQorCitpZiAhW2luZm8gZXhpc3RzIFNJWkVdIHRoZW4geworICAgIHNldCBTSVpFIFtmaW5kZmlsZSAkYmFzZV9kaXIvc2l6ZV0KK30KK2lmICFbaW5mbyBleGlzdHMgU0laRUZMQUdTXSB0aGVuIHsKKyAgICBzZXQgU0laRUZMQUdTICIiCit9CisKK2lmICFbaW5mbyBleGlzdHMgT0JKRFVNUF0gdGhlbiB7CisgICAgc2V0IE9CSkRVTVAgW2ZpbmRmaWxlICRiYXNlX2Rpci9vYmpkdW1wXQorfQoraWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QRkxBR1NdIHRoZW4geworICAgIHNldCBPQkpEVU1QRkxBR1MgIiIKK30KKworaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZXSB0aGVuIHsKKyAgICBzZXQgT0JKQ09QWSBbZmluZGZpbGUgJGJhc2VfZGlyL29iamNvcHldCit9CitpZiAhW2luZm8gZXhpc3RzIE9CSkNPUFlGTEFHU10gdGhlbiB7CisgICAgc2V0IE9CSkNPUFlGTEFHUyAiIgorfQorCitpZiAhW2luZm8gZXhpc3RzIEFSXSB0aGVuIHsKKyAgICBzZXQgQVIgW2ZpbmRmaWxlICRiYXNlX2Rpci9hcl0KK30KKworaWYgIVtpbmZvIGV4aXN0cyBTVFJJUF0gdGhlbiB7CisgICAgc2V0IFNUUklQIFtmaW5kZmlsZSAkYmFzZV9kaXIvc3RyaXAtbmV3ICRiYXNlX2Rpci9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCit9CitpZiAhW2luZm8gZXhpc3RzIFNUUklQRkxBR1NdIHRoZW4geworICAgIHNldCBTVFJJUEZMQUdTICIiCit9CisKK2lmICFbaW5mbyBleGlzdHMgUkVBREVMRl0gdGhlbiB7CisgICAgc2V0IFJFQURFTEYgW2ZpbmRmaWxlICRiYXNlX2Rpci9yZWFkZWxmXQorfQoraWYgIVtpbmZvIGV4aXN0cyBSRUFERUxGRkxBR1NdIHRoZW4geworICAgIHNldCBSRUFERUxGRkxBR1MgIiIKK30KKworaWYgIVtmaWxlIGlzZGlyZWN0b3J5IHRtcGRpcl0ge2NhdGNoICJleGVjIG1rZGlyIHRtcGRpciIgc3RhdHVzfQorCisjCisjIGJpbnV0aWxzX3J1bgorIwlydW4gYSBwcm9ncmFtLCByZXR1cm5pbmcgdGhlIG91dHB1dAorIwlzZXRzIGJpbnV0aWxzX3J1bl9mYWlsZWQgaWYgdGhlIHByb2dyYW0gZG9lcyBub3QgZXhpc3QKKyMKK3Byb2MgYmludXRpbHNfcnVuIHsgcHJvZyBwcm9nYXJncyB9IHsKKyAgICBkZWZhdWx0X2JpbnV0aWxzX3J1biAkcHJvZyAkcHJvZ2FyZ3MKK30KKworIworIyBiaW51dGlsc19hc3NlbWJsZQorIwlhc3NlbWJsZSBhIGZpbGUKKyMKK3Byb2MgYmludXRpbHNfYXNzZW1ibGUgeyBzb3VyY2Ugb2JqZWN0IH0geworICAgIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUgJHNvdXJjZSAkb2JqZWN0Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2hwcGEuc2VkIGIvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODYwN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZApAQCAtMCwwICsxLDQgQEAKK3MvIyBPbGQgT1NGIHNlZCBibG93cyB1cCBpZiB5b3UgaGF2ZSBhIHNlZCBjb21tYW5kIHN0YXJ0aW5nIHdpdGggIiMiLy8KK3MvIyBBdm9pZCBpdCBieSBwdXR0aW5nIHRoZSBjb21tZW50cyB3aXRoaW4gcmVhbCBzZWQgY29tbWFuZHMuLy8KK3MvIyBGaXggdGhlIGRlZmluaXRpb24gb2YgY29tbW9uX3N5bWJvbCB0byBiZSBjb3JyZWN0IGZvciB0aGUgUEEgYXNzZWJtbGVycy4vLworcy8JXC5jb21tIGNvbW1vbl9zeW1ib2wsNC9jb21tb25fc3ltYm9sCS5jb21tIDQvCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvbGliL3V0aWxzLWxpYi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3ZjIxNwotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cApAQCAtMCwwICsxLDE2MSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KKyMgYW5kIGV4dGVuZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgorCitwcm9jIGJpbnV0aWxfdmVyc2lvbiB7IHByb2cgfSB7CisgICAgaWYgIVtpc19yZW1vdGUgaG9zdF0geworCXNldCBwYXRoIFt3aGljaCAkcHJvZ107CisJaWYgeyRwYXRoID09IDB9IHRoZW4geworCSAgICBwZXJyb3IgIiRwcm9nIGNhbid0IGJlIHJ1biwgZmlsZSBub3QgZm91bmQuIgorCSAgICByZXR1cm4gIiIKKwl9CisgICAgfSBlbHNlIHsKKwlzZXQgcGF0aCAkcHJvZworICAgIH0KKyAgICBzZXQgc3RhdGUgW3JlbW90ZV9leGVjIGhvc3QgJHByb2cgLS12ZXJzaW9uXTsKKyAgICBzZXQgdG1wICJbbGluZGV4ICRzdGF0ZSAxXVxuIjsKKyAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncworICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KKyAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgIiR0bXAiIHZlcnNpb24gY3lnIG51bWJlcgorICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKKyAgICAgICAgcmV0dXJuICIkcGF0aCAobm8gdmVyc2lvbiBudW1iZXIpXG4iCisgICAgfQorICAgIHJldHVybiAiJHBhdGggJG51bWJlclxuIgorfQorCisjCisjIGRlZmF1bHRfYmludXRpbHNfcnVuCisjCXJ1biBhIHByb2dyYW0sIHJldHVybmluZyB0aGUgb3V0cHV0CisjCXNldHMgYmludXRpbHNfcnVuX2ZhaWxlZCBpZiB0aGUgcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAorIworcHJvYyBkZWZhdWx0X2JpbnV0aWxzX3J1biB7IHByb2cgcHJvZ2FyZ3MgfSB7CisgICAgZ2xvYmFsIGJpbnV0aWxzX3J1bl9mYWlsZWQKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisKKyAgICBzZXQgYmludXRpbHNfcnVuX2ZhaWxlZCAwCisKKyAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7CisJaWYge1t3aGljaCAkcHJvZ10gPT0gMH0gdGhlbiB7CisJICAgIHBlcnJvciAiJHByb2cgZG9lcyBub3QgZXhpc3QiCisJICAgIHNldCBiaW51dGlsc19ydW5fZmFpbGVkIDEKKwkgICAgcmV0dXJuICIiCisJfQorICAgIH0KKworICAgIHNlbmRfbG9nICIkcHJvZyAkcHJvZ2FyZ3NcbiIKKyAgICB2ZXJib3NlICIkcHJvZyAkcHJvZ2FyZ3MiCisKKyAgICAjIEdvdHRhIHF1b3RlIGRvbGxhci1zaWducyBiZWNhdXNlIHRoZXkgZ2V0IG1hbmdsZWQgYnkgdGhlCisgICAgIyBzaGVsbCBvdGhlcndpc2UuCisgICAgcmVnc3ViIC1hbGwgIlxcJCIgIiRwcm9nYXJncyIgIlxcJCIgcHJvZ2FyZ3MKKworICAgIHNldCBzdGF0ZSBbcmVtb3RlX2V4ZWMgaG9zdCAkcHJvZyAkcHJvZ2FyZ3NdCisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyBbbGluZGV4ICRzdGF0ZSAxXV07CisgICAgaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4geworCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwl2ZXJib3NlICIkZXhlY19vdXRwdXQiCisgICAgfQorICAgIHJldHVybiAkZXhlY19vdXRwdXQKK30KKworIworIyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlCisjCWFzc2VtYmxlIGEgZmlsZQorIworcHJvYyBkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlIHsgc291cmNlIG9iamVjdCB9IHsKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGhvc3RfdHJpcGxldAorCisgICAgIyBUaGUgSFBQQSBhc3NlbWJsZXIgc3ludGF4IGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuIG1vc3QsIHRvIG1ha2UKKyAgICAjIHRoZSB0ZXN0IHNvdXJjZSBmaWxlIGFzc2VtYmxlIHdlIG5lZWQgdG8gcnVuIGl0IHRocm91Z2ggc2VkLgorICAgICMKKyAgICAjIFRoaXMgaXMgYSBoYWNrIGluIHRoYXQgaXQgd29uJ3Qgc2NhbGUgd2VsbCBpZiBvdGhlciB0YXJnZXRzIG5lZWQKKyAgICAjIHNpbWlsYXIgdHJhbnNmb3JtYXRpb25zIHRvIGFzc2VtYmxlLiAgV2UnbGwgZ2VuZXJhbGl6ZSB0aGUgaGFjaworICAgICMgaWYvd2hlbiBvdGhlciB0YXJnZXRzIG5lZWQgc2ltaWxhciBoYW5kbGluZy4KKyAgICBpZiBbaXN0YXJnZXQgImhwcGEqLSotKiIgXSB0aGVuIHsKKwlzZW5kX2xvZyAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zXG4iCisJdmVyYm9zZSAic2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zIgorCWNhdGNoICJleGVjIHNlZCAtZiAkc3JjZGlyL2NvbmZpZy9ocHBhLnNlZCA8ICRzb3VyY2UgPiBhc20ucyI7CisJc2V0IHNvdXJjZSBhc20ucworICAgIH0KKworICAgIHNldCBleGVjX291dHB1dCBbdGFyZ2V0X2Fzc2VtYmxlICRzb3VyY2UgJG9iamVjdCAiIl07CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0geworCXJldHVybiAxCisgICAgfSBlbHNlIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgorCXBlcnJvciAiJHNvdXJjZTogYXNzZW1ibHkgZmFpbGVkIgorCXJldHVybiAwCisgICAgfQorfQorCitpZiAhW2luZm8gZXhpc3RzIHRhcmdldF9hc3NlbWJsZV0geworIworIyBTdG9sZW4gZnJvbSBkZWphZ251L2xpYi90YXJnZXQuZXhwLS1wbGVhc2UgcmVtb3ZlIGFmdGVyIDEvMS85OC4KKyMKK3VwbGV2ZWwgIzAgeworICAgIHByb2MgdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0geworCXJldHVybiBbZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgJHNvdXJjZSAkZGVzdGZpbGUgJGZsYWdzXTsKKyAgICB9CisKKyAgICBwcm9jIGRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHsgc291cmNlIGRlc3RmaWxlIGZsYWdzIH0geworCWdsb2JhbCBBU19GT1JfVEFSR0VUOworCWdsb2JhbCBBU0ZMQUdTX0ZPUl9UQVJHRVQ7CisKKwlpZiBbaW5mbyBleGlzdHMgQVNfRk9SX1RBUkdFVF0geworCSAgICBzZXQgQVMgIiRBU19GT1JfVEFSR0VUIjsKKwl9IGVsc2UgeworCSAgICBpZiAhW2JvYXJkX2luZm8gdGFyZ2V0IGV4aXN0cyBhc3NlbWJsZXJdIHsKKwkJc2V0IEFTIFtmaW5kX2dhc107CisJICAgIH0gZWxzZSB7CisJCXNldCBBUyBbYm9hcmRfaW5mbyB0YXJnZXQgYXNzZW1ibGVyXTsKKwkgICAgfQorCX0KKworCWlmIFtpbmZvIGV4aXN0cyBBU0ZMQUdTX0ZPUl9UQVJHRVRdIHsKKwkgICAgYXBwZW5kIGZsYWdzICIgJEFTRkxBR1NfRk9SX1RBUkdFVCI7CisJfQorCisJaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJICAgIHNldCBzb3VyY2UgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRzb3VyY2VdOworCSAgICBzZXQgZGVzdCAiYS5vdXQiCisJfSBlbHNlIHsKKwkgICAgc2V0IGRlc3QgJGRlc3RmaWxlCisJfQorCXNldCBzdGF0dXMgW3JlbW90ZV9leGVjIGhvc3QgIiRBUyAkc291cmNlICRmbGFncyAtbyAkZGVzdCJdCisJaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJICAgIHJlbW90ZV91cGxvYWQgaG9zdCAkZGVzdCAkZGVzdGZpbGUKKwl9CisKKwlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzIFtsaW5kZXggJHN0YXR1cyAxXV07CisJaWYgeyBbbGluZGV4ICRzdGF0dXMgMF0gIT0gMCB9IHsKKwkgICAgdmVyYm9zZSAtbG9nICJhc3NlbWJsZXIgZXhpdGVkIHdpdGggc3RhdHVzIFtsaW5kZXggJHN0YXR1cyAwXSI7CisJfQorCWlmIHsgW2xpbmRleCAkc3RhdHVzIDFdICE9ICIiIH0geworCSAgICB2ZXJib3NlIC1sb2cgImFzc2VtYmxlciBvdXRwdXQgaXM6XG5bbGluZGV4ICRzdGF0dXMgMV0iIDI7CisJfQorCXJldHVybiAke2NvbXBfb3V0cHV0fTsKK30KK30KK30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3ZlcnNpb24uYyBiL2JpbnV0aWxzL3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU1OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmludXRpbHMvdmVyc2lvbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHZlcnNpb24uYyAtLSBiaW51dGlscyB2ZXJzaW9uIGluZm9ybWF0aW9uCisgICBDb3B5cmlnaHQgMTk5MSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKworLyogVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXJzIGZvciB0aGUgYmludXRpbHMuICBUaGV5IGFsbCBjaGFuZ2UgaW4KKyAgIGxvY2tzdGVwIC0tIGl0J3MgZWFzaWVyIHRoYXQgd2F5LiAqLworCitjb25zdCBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOworCisvKiBQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGNvcHlyaWdodCBpbmZvcm1hdGlvbiwgYW5kIGV4aXQuICBUaGlzCisgICBpbXBsZW1lbnRzIHRoZSAtLXZlcnNpb24gb3B0aW9uIGZvciB0aGUgdmFyaW91cyBwcm9ncmFtcy4gICovCisKK3ZvaWQKK3ByaW50X3ZlcnNpb24gKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIHByaW50ZiAoIkdOVSAlcyAlc1xuIiwgbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKKyAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKKyAgcHJpbnRmIChfKCJcCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHJlcy5jIGIvYmludXRpbHMvd2luZHJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTI4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy93aW5kcmVzLmMKQEAgLTAsMCArMSw5NDcgQEAKKy8qIHdpbmRyZXMuYyAtLSBhIHByb2dyYW0gdG8gbWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcworICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIHByb2dyYW0gY2FuIHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmVzb3VyY2VzIGluIHZhcmlvdXMKKyAgIGZvcm1hdHMuICBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4gYWN0IGxpa2UgdGhlIHJjIHJlc291cmNlIGNvbXBpbGVyCisgICBwcm9ncmFtLCBhbmQgaXQgY2FuIGFjdCBsaWtlIHRoZSBjdnRyZXMgcmVzIHRvIENPRkYgY29udmVyc2lvbgorICAgcHJvZ3JhbS4KKworICAgSXQgaXMgYmFzZWQgb24gaW5mb3JtYXRpb24gdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXM6CisKKyAgICogTWljcm9zb2Z0IGRvY3VtZW50YXRpb24uCisKKyAgICogVGhlIHJjbCBwcm9ncmFtLCB3cml0dGVuIGJ5IEd1bnRoZXIgRWJlcnQKKyAgICAgPGd1bnRoZXIuZWJlcnRAaXhvcy1sZWlwemlnLmRlPi4KKworICAgKiBUaGUgcmVzMmNvZmYgcHJvZ3JhbSwgd3JpdHRlbiBieSBQZWRybyBBLiBBcmFuZGEgPHBhYWdAdGlkLmVzPi4KKworICAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdldG9wdC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJ3aW5kcmVzLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworLyogQW4gZW51bWVyYXRpb24gb2YgZm9ybWF0IHR5cGVzLiAgKi8KKworZW51bSByZXNfZm9ybWF0Cit7CisgIC8qIFVua25vd24gZm9ybWF0LiAgKi8KKyAgUkVTX0ZPUk1BVF9VTktOT1dOLAorICAvKiBUZXh0dWFsIFJDIGZpbGUuICAqLworICBSRVNfRk9STUFUX1JDLAorICAvKiBCaW5hcnkgUkVTIGZpbGUuICAqLworICBSRVNfRk9STUFUX1JFUywKKyAgLyogQ09GRiBmaWxlLiAgKi8KKyAgUkVTX0ZPUk1BVF9DT0ZGCit9OworCisvKiBBIHN0cnVjdHVyZSB1c2VkIHRvIG1hcCBiZXR3ZWVuIGZvcm1hdCB0eXBlcyBhbmQgc3RyaW5ncy4gICovCisKK3N0cnVjdCBmb3JtYXRfbWFwCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGVudW0gcmVzX2Zvcm1hdCBmb3JtYXQ7Cit9OworCisvKiBBIG1hcHBpbmcgYmV0d2VlbiBuYW1lcyBhbmQgZm9ybWF0IHR5cGVzLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwIGZvcm1hdF9uYW1lc1tdID0KK3sKKyAgeyAicmMiLCBSRVNfRk9STUFUX1JDIH0sCisgIHsgInJlcyIsIFJFU19GT1JNQVRfUkVTIH0sCisgIHsgImNvZmYiLCBSRVNfRk9STUFUX0NPRkYgfSwKKyAgeyBOVUxMLCBSRVNfRk9STUFUX1VOS05PV04gfQorfTsKKworLyogQSBtYXBwaW5nIGZyb20gZmlsZSBleHRlbnNpb25zIHRvIGZvcm1hdCB0eXBlcy4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZm9ybWF0X21hcCBmb3JtYXRfZmlsZWV4dHNbXSA9Cit7CisgIHsgInJjIiwgUkVTX0ZPUk1BVF9SQyB9LAorICB7ICJyZXMiLCBSRVNfRk9STUFUX1JFUyB9LAorICB7ICJleGUiLCBSRVNfRk9STUFUX0NPRkYgfSwKKyAgeyAib2JqIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCisgIHsgIm8iLCBSRVNfRk9STUFUX0NPRkYgfSwKKyAgeyBOVUxMLCBSRVNfRk9STUFUX1VOS05PV04gfQorfTsKKworLyogQSBsaXN0IG9mIGluY2x1ZGUgZGlyZWN0b3JpZXMuICAqLworCitzdHJ1Y3QgaW5jbHVkZV9kaXIKK3sKKyAgc3RydWN0IGluY2x1ZGVfZGlyICpuZXh0OworICBjaGFyICpkaXI7Cit9OworCitzdGF0aWMgc3RydWN0IGluY2x1ZGVfZGlyICppbmNsdWRlX2RpcnM7CisKKy8qIExvbmcgb3B0aW9ucy4gICovCisKKy8qIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KKworI2RlZmluZSBPUFRJT05fREVGSU5FIDE1MAorI2RlZmluZSBPUFRJT05fSEVMUCAoT1BUSU9OX0RFRklORSArIDEpCisjZGVmaW5lIE9QVElPTl9JTkNMVURFX0RJUiAoT1BUSU9OX0hFTFAgKyAxKQorI2RlZmluZSBPUFRJT05fTEFOR1VBR0UgKE9QVElPTl9JTkNMVURFX0RJUiArIDEpCisjZGVmaW5lIE9QVElPTl9QUkVQUk9DRVNTT1IgKE9QVElPTl9MQU5HVUFHRSArIDEpCisjZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fUFJFUFJPQ0VTU09SICsgMSkKKyNkZWZpbmUgT1BUSU9OX1lZREVCVUcgKE9QVElPTl9WRVJTSU9OICsgMSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQoreworICB7ImRlZmluZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fREVGSU5FfSwKKyAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9IRUxQfSwKKyAgeyJpbmNsdWRlLWRpciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fSU5DTFVERV9ESVJ9LAorICB7ImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAorICB7Imxhbmd1YWdlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9MQU5HVUFHRX0sCisgIHsib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAorICB7InByZXByb2Nlc3NvciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fUFJFUFJPQ0VTU09SfSwKKyAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwKKyAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9WRVJTSU9OfSwKKyAgeyJ5eWRlYnVnIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ZWURFQlVHfSwKKyAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQorfTsKKworLyogU3RhdGljIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkIHJlc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgZXh0ZW5kZWRfbWVudWl0ZW1zIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqKSk7CitzdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgZW51bSByZXNfZm9ybWF0IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOworc3RhdGljIGludCBjbXBfcmVzX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CitzdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnNvcnRfcmVzb3VyY2VzIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKKwwKKy8qIFdoZW4gd2UgYXJlIGJ1aWxkaW5nIGEgcmVzb3VyY2UgdHJlZSwgd2UgYWxsb2NhdGUgZXZlcnl0aGluZyBvbnRvCisgICBhbiBvYnN0YWNrLCBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBhdCBvbmNlIGlmIHdlIHdhbnQuICAqLworCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfYWxsb2MgeG1hbGxvYworI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQorCisvKiBUaGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXNfb2JzdGFjazsKKworLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgYnVpbGRpbmcgb2JzdGFjay4gICovCisKK3N0YXRpYyB2b2lkCityZXNfaW5pdCAoKQoreworICBvYnN0YWNrX2luaXQgKCZyZXNfb2JzdGFjayk7Cit9CisKKy8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KKworUFRSCityZXNfYWxsb2MgKGJ5dGVzKQorICAgICBzaXplX3QgYnl0ZXM7Cit7CisgIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzX29ic3RhY2ssIGJ5dGVzKTsKK30KKworLyogV2UgYWxzbyB1c2UgYW4gb2JzdGFjayB0byBzYXZlIG1lbW9yeSB1c2VkIHdoaWxlIHdyaXRpbmcgb3V0IGEgc2V0CisgICBvZiByZXNvdXJjZXMuICAqLworCitzdGF0aWMgc3RydWN0IG9ic3RhY2sgcmVzd3Jfb2JzdGFjazsKKworLyogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2Ugd3JpdGluZyBvYnN0YWNrLiAgKi8KKworc3RhdGljIHZvaWQKK3Jlc3dyX2luaXQgKCkKK3sKKyAgb2JzdGFja19pbml0ICgmcmVzd3Jfb2JzdGFjayk7Cit9CisKKy8qIEFsbG9jYXRlIHNwYWNlIG9uIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLworCitQVFIKK3Jlc3dyX2FsbG9jIChieXRlcykKKyAgICAgc2l6ZV90IGJ5dGVzOworeworICByZXR1cm4gKFBUUikgb2JzdGFja19hbGxvYyAoJnJlc3dyX29ic3RhY2ssIGJ5dGVzKTsKK30KKwwKKy8qIE9wZW4gYSBmaWxlIHVzaW5nIHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBzZWFyY2ggbGlzdC4gICovCisKK0ZJTEUgKgorb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIG1vZGUsIGVycm1zZywgcmVhbF9maWxlbmFtZSkKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGNvbnN0IGNoYXIgKm1vZGU7CisgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKKyAgICAgY2hhciAqKnJlYWxfZmlsZW5hbWU7Cit7CisgIEZJTEUgKmU7CisgIHN0cnVjdCBpbmNsdWRlX2RpciAqZDsKKworICBlID0gZm9wZW4gKGZpbGVuYW1lLCBtb2RlKTsKKyAgaWYgKGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAqcmVhbF9maWxlbmFtZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBlOworICAgIH0KKworICBpZiAoZXJybm8gPT0gRU5PRU5UKQorICAgIHsKKyAgICAgIGZvciAoZCA9IGluY2x1ZGVfZGlyczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKwl7CisJICBjaGFyICpuOworCisJICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkLT5kaXIpICsgc3RybGVuIChmaWxlbmFtZSkgKyAyKTsKKwkgIHNwcmludGYgKG4sICIlcy8lcyIsIGQtPmRpciwgZmlsZW5hbWUpOworCSAgZSA9IGZvcGVuIChuLCBtb2RlKTsKKwkgIGlmIChlICE9IE5VTEwpCisJICAgIHsKKwkgICAgICAqcmVhbF9maWxlbmFtZSA9IG47CisJICAgICAgcmV0dXJuIGU7CisJICAgIH0KKworCSAgaWYgKGVycm5vICE9IEVOT0VOVCkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICBmYXRhbCAoXygiY2FuJ3Qgb3BlbiAlcyBgJXMnOiAlcyIpLCBlcnJtc2csIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKKworICAvKiBSZXR1cm4gYSB2YWx1ZSB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuICAqLworICByZXR1cm4gTlVMTDsKK30KKwwKKy8qIENvbXBhcmUgdHdvIHJlc291cmNlIElEJ3MuICBXZSBjb25zaWRlciBuYW1lIGVudHJpZXMgdG8gY29tZSBiZWZvcmUKKyAgIG51bWVyaWMgZW50cmllcywgYmVjYXVzZSB0aGF0IGlzIGhvdyB0aGV5IGFwcGVhciBpbiB0aGUgQ09GRiAucnNyYworICAgc2VjdGlvbi4gICovCisKK2ludAorcmVzX2lkX2NtcCAoYSwgYikKKyAgICAgc3RydWN0IHJlc19pZCBhOworICAgICBzdHJ1Y3QgcmVzX2lkIGI7Cit7CisgIGlmICghIGEubmFtZWQpCisgICAgeworICAgICAgaWYgKGIubmFtZWQpCisJcmV0dXJuIDE7CisgICAgICBpZiAoYS51LmlkID4gYi51LmlkKQorCXJldHVybiAxOworICAgICAgZWxzZSBpZiAoYS51LmlkIDwgYi51LmlkKQorCXJldHVybiAtMTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1bmljaGFyICphcywgKmFzZSwgKmJzLCAqYnNlOworCisgICAgICBpZiAoISBiLm5hbWVkKQorCXJldHVybiAtMTsKKworICAgICAgYXMgPSBhLnUubi5uYW1lOworICAgICAgYXNlID0gYXMgKyBhLnUubi5sZW5ndGg7CisgICAgICBicyA9IGIudS5uLm5hbWU7CisgICAgICBic2UgPSBicyArIGIudS5uLmxlbmd0aDsKKworICAgICAgd2hpbGUgKGFzIDwgYXNlKQorCXsKKwkgIGludCBpOworCisJICBpZiAoYnMgPj0gYnNlKQorCSAgICByZXR1cm4gMTsKKwkgIGkgPSAoaW50KSAqYXMgLSAoaW50KSAqYnM7CisJICBpZiAoaSAhPSAwKQorCSAgICByZXR1cm4gaTsKKwkgICsrYXM7CisJICArK2JzOworCX0KKworICAgICAgaWYgKGJzIDwgYnNlKQorCXJldHVybiAtMTsKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBQcmludCBhIHJlc291cmNlIElELiAgKi8KKwordm9pZAorcmVzX2lkX3ByaW50IChzdHJlYW0sIGlkLCBxdW90ZSkKKyAgICAgRklMRSAqc3RyZWFtOworICAgICBzdHJ1Y3QgcmVzX2lkIGlkOworICAgICBpbnQgcXVvdGU7Cit7CisgIGlmICghIGlkLm5hbWVkKQorICAgIGZwcmludGYgKHN0cmVhbSwgIiVsdSIsIGlkLnUuaWQpOworICBlbHNlCisgICAgeworICAgICAgaWYgKHF1b3RlKQorCXB1dGMgKCciJywgc3RyZWFtKTsKKyAgICAgIHVuaWNvZGVfcHJpbnQgKHN0cmVhbSwgaWQudS5uLm5hbWUsIGlkLnUubi5sZW5ndGgpOworICAgICAgaWYgKHF1b3RlKQorCXB1dGMgKCciJywgc3RyZWFtKTsKKyAgICB9Cit9CisKKy8qIFByaW50IGEgbGlzdCBvZiByZXNvdXJjZSBJRCdzLiAgKi8KKwordm9pZAorcmVzX2lkc19wcmludCAoc3RyZWFtLCBjaWRzLCBpZHMpCisgICAgIEZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGNpZHM7CisgICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkczsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKKyAgICB7CisgICAgICByZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWRzW2ldLCAxKTsKKyAgICAgIGlmIChpICsgMSA8IGNpZHMpCisJZnByaW50ZiAoc3RyZWFtLCAiOiAiKTsKKyAgICB9Cit9CisKKy8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgcmVzb3VyY2UgSUQuICAqLworCit2b2lkCityZXNfc3RyaW5nX3RvX2lkIChyZXNfaWQsIHN0cmluZykKKyAgICAgc3RydWN0IHJlc19pZCAqcmVzX2lkOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHJlc19pZC0+bmFtZWQgPSAxOworICB1bmljb2RlX2Zyb21fYXNjaWkgKCZyZXNfaWQtPnUubi5sZW5ndGgsICZyZXNfaWQtPnUubi5uYW1lLCBzdHJpbmcpOworfQorCisvKiBEZWZpbmUgYSByZXNvdXJjZS4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSByZXNvdXJjZSB0cmVlLCBSRVNPVVJDRVMsCisgICBhbmQgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIHB1dCBpdCBpbiB0aGUgdHJlZSwgQ0lEUyBhbmQgSURTLgorICAgVGhpcyByZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZQorICAgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluaXRpYWxpemUuICBJZiBEVVBPSyBpcyBub24temVybywgdGhlbiBpZiBhCisgICByZXNvdXJjZSB3aXRoIHRoaXMgSUQgZXhpc3RzLCBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgYSB3YXJuaW5nCisgICBpcyBpc3N1ZWQsIGFuZCBhIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKKyAgIG9uZS4gICovCisKK3N0cnVjdCByZXNfcmVzb3VyY2UgKgorZGVmaW5lX3Jlc291cmNlIChyZXNvdXJjZXMsIGNpZHMsIGlkcywgZHVwb2spCisgICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOworICAgICBpbnQgY2lkczsKKyAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOworICAgICBpbnQgZHVwb2s7Cit7CisgIHN0cnVjdCByZXNfZW50cnkgKnJlID0gTlVMTDsKKyAgaW50IGk7CisKKyAgYXNzZXJ0IChjaWRzID4gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBjaWRzOyBpKyspCisgICAgeworICAgICAgc3RydWN0IHJlc19lbnRyeSAqKnBwOworCisgICAgICBpZiAoKnJlc291cmNlcyA9PSBOVUxMKQorCXsKKwkgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWV2YWw7CisKKwkgIC8qIFVzZSB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgaW4gYQorICAgICAgICAgICAgIHNpbmdsZSBydW4uICAqLworCSAgaWYgKHRpbWV2YWwgPT0gMCkKKwkgICAgdGltZXZhbCA9IHRpbWUgKE5VTEwpOworCisJICAqcmVzb3VyY2VzID0gKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKQorCQkJcmVzX2FsbG9jIChzaXplb2YgKipyZXNvdXJjZXMpKTsKKwkgICgqcmVzb3VyY2VzKS0+Y2hhcmFjdGVyaXN0aWNzID0gMDsKKwkgICgqcmVzb3VyY2VzKS0+dGltZSA9IHRpbWV2YWw7CisJICAoKnJlc291cmNlcyktPm1ham9yID0gMDsKKwkgICgqcmVzb3VyY2VzKS0+bWlub3IgPSAwOworCSAgKCpyZXNvdXJjZXMpLT5lbnRyaWVzID0gTlVMTDsKKwl9CisKKyAgICAgIGZvciAocHAgPSAmKCpyZXNvdXJjZXMpLT5lbnRyaWVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCisJaWYgKHJlc19pZF9jbXAgKCgqcHApLT5pZCwgaWRzW2ldKSA9PSAwKQorCSAgYnJlYWs7CisKKyAgICAgIGlmICgqcHAgIT0gTlVMTCkKKwlyZSA9ICpwcDsKKyAgICAgIGVsc2UKKwl7CisJICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7CisJICByZS0+bmV4dCA9IE5VTEw7CisJICByZS0+aWQgPSBpZHNbaV07CisJICBpZiAoKGkgKyAxKSA8IGNpZHMpCisJICAgIHsKKwkgICAgICByZS0+c3ViZGlyID0gMTsKKwkgICAgICByZS0+dS5kaXIgPSBOVUxMOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICByZS0+c3ViZGlyID0gMDsKKwkgICAgICByZS0+dS5yZXMgPSBOVUxMOworCSAgICB9CisKKwkgICpwcCA9IHJlOworCX0KKworICAgICAgaWYgKChpICsgMSkgPCBjaWRzKQorCXsKKwkgIGlmICghIHJlLT5zdWJkaXIpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwkgICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGksIGlkcyk7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iKSk7CisJICAgICAgeGV4aXQgKDEpOworCSAgICB9CisKKwkgIHJlc291cmNlcyA9ICZyZS0+dS5kaXI7CisJfQorICAgIH0KKworICBpZiAocmUtPnN1YmRpcikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIpKTsKKyAgICAgIHhleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHJlLT51LnJlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkdXBvaykKKwlyZXR1cm4gcmUtPnUucmVzOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRzKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiOiBkdXBsaWNhdGUgdmFsdWVcbiIpKTsKKyAgICB9CisKKyAgcmUtPnUucmVzID0gKChzdHJ1Y3QgcmVzX3Jlc291cmNlICopCisJICAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc291cmNlKSkpOworCisgIHJlLT51LnJlcy0+dHlwZSA9IFJFU19UWVBFX1VOSU5JVElBTElaRUQ7CisgIG1lbXNldCAoJnJlLT51LnJlcy0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOworICBtZW1zZXQgKCZyZS0+dS5yZXMtPmNvZmZfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX2NvZmZfaW5mbykpOworCisgIHJldHVybiByZS0+dS5yZXM7Cit9CisKKy8qIERlZmluZSBhIHN0YW5kYXJkIHJlc291cmNlLiAgVGhpcyBpcyBhIHZlcnNpb24gb2YgZGVmaW5lX3Jlc291cmNlCisgICB0aGF0IGp1c3QgdGFrZXMgdHlwZSwgbmFtZSwgYW5kIGxhbmd1YWdlIGFyZ3VtZW50cy4gICovCisKK3N0cnVjdCByZXNfcmVzb3VyY2UgKgorZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlIChyZXNvdXJjZXMsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBkdXBvaykKKyAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7CisgICAgIGludCB0eXBlOworICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7CisgICAgIGludCBsYW5ndWFnZTsKKyAgICAgaW50IGR1cG9rOworeworICBzdHJ1Y3QgcmVzX2lkIGFbM107CisKKyAgYVswXS5uYW1lZCA9IDA7CisgIGFbMF0udS5pZCA9IHR5cGU7CisgIGFbMV0gPSBuYW1lOworICBhWzJdLm5hbWVkID0gMDsKKyAgYVsyXS51LmlkID0gbGFuZ3VhZ2U7CisgIHJldHVybiBkZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgMywgYSwgZHVwb2spOworfQorCisvKiBDb21wYXJpc29uIHJvdXRpbmUgZm9yIHJlc291cmNlIHNvcnRpbmcuICAqLworCitzdGF0aWMgaW50CitjbXBfcmVzX2VudHJ5IChwMSwgcDIpCisgICAgIGNvbnN0IFBUUiBwMTsKKyAgICAgY29uc3QgUFRSIHAyOworeworICBjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqcmUxLCAqKnJlMjsKKworICByZTEgPSAoY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqKikgcDE7CisgIHJlMiA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMjsKKyAgcmV0dXJuIHJlc19pZF9jbXAgKCgqcmUxKS0+aWQsICgqcmUyKS0+aWQpOworfQorCisvKiBTb3J0IHRoZSByZXNvdXJjZXMuICAqLworCitzdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKgorc29ydF9yZXNvdXJjZXMgKHJlc2RpcikKKyAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKK3sKKyAgaW50IGMsIGk7CisgIHN0cnVjdCByZXNfZW50cnkgKnJlOworICBzdHJ1Y3QgcmVzX2VudHJ5ICoqYTsKKworICBpZiAocmVzZGlyLT5lbnRyaWVzID09IE5VTEwpCisgICAgcmV0dXJuIHJlc2RpcjsKKworICBjID0gMDsKKyAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKKyAgICArK2M7CisKKyAgLyogVGhpcyBpcyBhIHJlY3Vyc2l2ZSByb3V0aW5lLCBzbyB1c2luZyB4bWFsbG9jIGlzIHByb2JhYmx5IGJldHRlcgorICAgICB0aGFuIGFsbG9jYS4gICovCisgIGEgPSAoc3RydWN0IHJlc19lbnRyeSAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSk7CisKKyAgZm9yIChpID0gMCwgcmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQsIGkrKykKKyAgICBhW2ldID0gcmU7CisKKyAgcXNvcnQgKGEsIGMsIHNpemVvZiAoc3RydWN0IHJlc19lbnRyeSAqKSwgY21wX3Jlc19lbnRyeSk7CisKKyAgcmVzZGlyLT5lbnRyaWVzID0gYVswXTsKKyAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCisgICAgYVtpXS0+bmV4dCA9IGFbaSArIDFdOworICBhW2ldLT5uZXh0ID0gTlVMTDsKKworICBmcmVlIChhKTsKKworICAvKiBOb3cgc29ydCB0aGUgc3ViZGlyZWN0b3JpZXMuICAqLworCisgIGZvciAocmUgPSByZXNkaXItPmVudHJpZXM7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpCisgICAgaWYgKHJlLT5zdWJkaXIpCisgICAgICByZS0+dS5kaXIgPSBzb3J0X3Jlc291cmNlcyAocmUtPnUuZGlyKTsKKworICByZXR1cm4gcmVzZGlyOworfQorDAorLyogUmV0dXJuIHdoZXRoZXIgdGhlIGRpYWxvZyByZXNvdXJjZSBESUFMT0cgaXMgYSBESUFMT0cgb3IgYQorICAgRElBTE9HRVguICAqLworCitpbnQKK2V4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKQorICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Cit7CisgIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqYzsKKworICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMKQorICAgIHJldHVybiAxOworCisgIGZvciAoYyA9IGRpYWxvZy0+Y29udHJvbHM7IGMgIT0gTlVMTDsgYyA9IGMtPm5leHQpCisgICAgaWYgKGMtPmRhdGEgIT0gTlVMTCB8fCBjLT5oZWxwICE9IDApCisgICAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHdoZXRoZXIgTUVOVUlURU1TIGFyZSBhIE1FTlUgb3IgYSBNRU5VRVguICAqLworCitpbnQKK2V4dGVuZGVkX21lbnUgKG1lbnUpCisgICAgIGNvbnN0IHN0cnVjdCBtZW51ICptZW51OworeworICByZXR1cm4gZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51LT5pdGVtcyk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dGVuZGVkX21lbnVpdGVtcyAobWVudWl0ZW1zKQorICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKK3sKKyAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKKworICBmb3IgKG1pID0gbWVudWl0ZW1zOyBtaSAhPSBOVUxMOyBtaSA9IG1pLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChtaS0+aGVscCAhPSAwIHx8IG1pLT5zdGF0ZSAhPSAwKQorCXJldHVybiAxOworICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMICYmIG1pLT5pZCAhPSAwKQorCXJldHVybiAxOworICAgICAgaWYgKChtaS0+dHlwZQorCSAgICYgfiAoTUVOVUlURU1fQ0hFQ0tFRAorCQl8IE1FTlVJVEVNX0dSQVlFRAorCQl8IE1FTlVJVEVNX0hFTFAKKwkJfCBNRU5VSVRFTV9JTkFDVElWRQorCQl8IE1FTlVJVEVNX01FTlVCQVJCUkVBSworCQl8IE1FTlVJVEVNX01FTlVCUkVBSykpCisJICAhPSAwKQorCXJldHVybiAxOworICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQorCXsKKwkgIGlmIChleHRlbmRlZF9tZW51aXRlbXMgKG1pLT5wb3B1cCkpCisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisMCisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IHR5cGUsIG9yIGV4aXQgaWYgaXQgY2FuJ3QgYmUgZG9uZS4gICovCisKK3N0YXRpYyBlbnVtIHJlc19mb3JtYXQKK2Zvcm1hdF9mcm9tX25hbWUgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOworCisgIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCisgICAgaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIG5hbWUpID09IDApCisgICAgICBicmVhazsKKworICBpZiAobS0+bmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZm9ybWF0IHR5cGUgYCVzJ1xuIiksIHByb2dyYW1fbmFtZSwgbmFtZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0ZWQgZm9ybWF0czoiKSwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgIGZvciAobSA9IGZvcm1hdF9uYW1lczsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCisJZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgbS0+bmFtZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgICAgeGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gbS0+Zm9ybWF0OworfQorCisvKiBXb3JrIG91dCBhIGZvcm1hdCB0eXBlIGdpdmVuIGEgZmlsZSBuYW1lLiAgSWYgSU5QVVQgaXMgbm9uLXplcm8sCisgICBpdCdzIE9LIHRvIGxvb2sgYXQgdGhlIGZpbGUgaXRzZWxmLiAgKi8KKworc3RhdGljIGVudW0gcmVzX2Zvcm1hdAorZm9ybWF0X2Zyb21fZmlsZW5hbWUgKGZpbGVuYW1lLCBpbnB1dCkKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGludCBpbnB1dDsKK3sKKyAgY29uc3QgY2hhciAqZXh0OworICBGSUxFICplOworICB1bnNpZ25lZCBjaGFyIGIxLCBiMiwgYjMsIGI0LCBiNTsKKyAgaW50IG1hZ2ljOworCisgIC8qIElmIHdlIGhhdmUgYW4gZXh0ZW5zaW9uLCBzZWUgaWYgd2UgcmVjb2duaXplIGl0IGFzIGltcGx5aW5nIGEKKyAgICAgcGFydGljdWxhciBmb3JtYXQuICAqLworICBleHQgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy4nKTsKKyAgaWYgKGV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBmb3JtYXRfbWFwICptOworCisgICAgICArK2V4dDsKKyAgICAgIGZvciAobSA9IGZvcm1hdF9maWxlZXh0czsgbS0+bmFtZSAhPSBOVUxMOyBtKyspCisJaWYgKHN0cmNhc2VjbXAgKG0tPm5hbWUsIGV4dCkgPT0gMCkKKwkgIHJldHVybiBtLT5mb3JtYXQ7CisgICAgfQorCisgIC8qIElmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbmFtZSBvZiBhbiBvdXRwdXQgZmlsZSwgYXNzdW1lIGl0J3MgYQorICAgICBDT0ZGIGZpbGUuICAqLworCisgIGlmICghIGlucHV0KQorICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7CisKKyAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIHRoZSBmaWxlIHRvIHNlZSBpZiB3ZSBjYW4gZ3Vlc3Mgd2hhdAorICAgICBpdCBpcy4gICovCisKKyAgZSA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUkIpOworICBpZiAoZSA9PSBOVUxMKQorICAgIGZhdGFsICgiJXM6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOworCisgIGIxID0gZ2V0YyAoZSk7CisgIGIyID0gZ2V0YyAoZSk7CisgIGIzID0gZ2V0YyAoZSk7CisgIGI0ID0gZ2V0YyAoZSk7CisgIGI1ID0gZ2V0YyAoZSk7CisKKyAgZmNsb3NlIChlKTsKKworICAvKiBBIFBFIGV4ZWN1dGFibGUgc3RhcnRzIHdpdGggMHg0ZCAweDVhLiAgKi8KKyAgaWYgKGIxID09IDB4NGQgJiYgYjIgPT0gMHg1YSkKKyAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOworCisgIC8qIEEgQ09GRiAubyBmaWxlIHN0YXJ0cyB3aXRoIGEgQ09GRiBtYWdpYyBudW1iZXIuICAqLworICBtYWdpYyA9IChiMiA8PCA4KSB8IGIxOworICBzd2l0Y2ggKG1hZ2ljKQorICAgIHsKKyAgICBjYXNlIDB4MTRjOiAvKiBpMzg2ICovCisgICAgY2FzZSAweDE2NjogLyogTUlQUyAqLworICAgIGNhc2UgMHgxODQ6IC8qIEFscGhhICovCisgICAgY2FzZSAweDI2ODogLyogNjhrICovCisgICAgY2FzZSAweDFmMDogLyogUG93ZXJQQyAqLworICAgIGNhc2UgMHgyOTA6IC8qIFBBICovCisgICAgICByZXR1cm4gUkVTX0ZPUk1BVF9DT0ZGOworICAgIH0KKworICAvKiBBIFJFUyBmaWxlIHN0YXJ0cyB3aXRoIDB4MCAweDAgMHgwIDB4MCAweDIwIDB4MCAweDAgMHgwLiAgKi8KKyAgaWYgKGIxID09IDAgJiYgYjIgPT0gMCAmJiBiMyA9PSAwICYmIGI0ID09IDAgJiYgYjUgPT0gMHgyMCkKKyAgICByZXR1cm4gUkVTX0ZPUk1BVF9SRVM7CisKKyAgLyogSWYgZXZlcnkgY2hhcmFjdGVyIGlzIHByaW50YWJsZSBvciBzcGFjZSwgYXNzdW1lIGl0J3MgYW4gUkMgZmlsZS4gICovCisgIGlmICgoaXNwcmludCAoYjEpIHx8IGlzc3BhY2UgKGIxKSkKKyAgICAgICYmIChpc3ByaW50IChiMikgfHwgaXNzcGFjZSAoYjIpKQorICAgICAgJiYgKGlzcHJpbnQgKGIzKSB8fCBpc3NwYWNlIChiMykpCisgICAgICAmJiAoaXNwcmludCAoYjQpIHx8IGlzc3BhY2UgKGI0KSkKKyAgICAgICYmIChpc3ByaW50IChiNSkgfHwgaXNzcGFjZSAoYjUpKSkKKyAgICByZXR1cm4gUkVTX0ZPUk1BVF9SQzsKKworICAvKiBPdGhlcndpc2UsIHdlIGdpdmUgdXAuICAqLworICBmYXRhbCAoXygiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIiksCisJIGZpbGVuYW1lKTsKKworICAvKiBSZXR1cm4gc29tZXRoaW5nIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyIHdhcm5pbmcuICAqLworICByZXR1cm4gUkVTX0ZPUk1BVF9VTktOT1dOOworfQorCisvKiBQcmludCBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLworCitzdGF0aWMgdm9pZAordXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQorICAgICBGSUxFICpzdHJlYW07CisgICAgIGludCBzdGF0dXM7Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIiksCisJICAgcHJvZ3JhbV9uYW1lKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCitPcHRpb25zOlxuXAorICAtaSBGSUxFLCAtLWlucHV0IEZJTEUgICAgICAgTmFtZSBpbnB1dCBmaWxlXG5cCisgIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG5cCisgIC1JIEZPUk1BVCwgLS1pbnB1dC1mb3JtYXQgRk9STUFUXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGlucHV0IGZvcm1hdFxuXAorICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgb3V0cHV0IGZvcm1hdFxuXAorICAtRiBUQVJHRVQsIC0tdGFyZ2V0IFRBUkdFVCAgU3BlY2lmeSBDT0ZGIHRhcmdldFxuXAorICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG5cCisgIC0taW5jbHVkZS1kaXIgRElSICAgICAgICAgICBJbmNsdWRlIGRpcmVjdG9yeSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuXAorICAtLWRlZmluZSBTWU1bPVZBTF0gICAgICAgICAgRGVmaW5lIFNZTSB3aGVuIHByZXByb2Nlc3NpbmcgcmMgZmlsZVxuXAorICAtLWxhbmd1YWdlIFZBTCAgICAgICAgICAgICAgU2V0IGxhbmd1YWdlIHdoZW4gcmVhZGluZyByYyBmaWxlXG4iKSk7CisjaWZkZWYgWVlERUJVRworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgLS15eWRlYnVnICAgICAgICAgICAgICAgICAgIFR1cm4gb24gcGFyc2VyIGRlYnVnZ2luZ1xuIikpOworI2VuZGlmCisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcblwKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCitGT1JNQVQgaXMgb25lIG9mIHJjLCByZXMsIG9yIGNvZmYsIGFuZCBpcyBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgbmFtZVxuXAorZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cblwKK05vIGlucHV0LWZpbGUgaXMgc3RkaW4sIGRlZmF1bHQgcmMuICBObyBvdXRwdXQtZmlsZSBpcyBzdGRvdXQsIGRlZmF1bHQgcmMuXG4iKSk7CisgIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7CisgIGV4aXQgKHN0YXR1cyk7Cit9CisKKy8qIFRoZSBtYWluIGZ1bmN0aW9uLiAgKi8KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBjOworICBjaGFyICppbnB1dF9maWxlbmFtZTsKKyAgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOworICBlbnVtIHJlc19mb3JtYXQgaW5wdXRfZm9ybWF0OworICBlbnVtIHJlc19mb3JtYXQgb3V0cHV0X2Zvcm1hdDsKKyAgY2hhciAqdGFyZ2V0OworICBjaGFyICpwcmVwcm9jZXNzb3I7CisgIGNoYXIgKnByZXByb2NhcmdzOworICBpbnQgbGFuZ3VhZ2U7CisgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7CisKKyNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKKyAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOworI2VuZGlmCisgIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOworICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKKworICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7CisKKyAgYmZkX2luaXQgKCk7CisgIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7CisKKyAgcmVzX2luaXQgKCk7CisKKyAgaW5wdXRfZmlsZW5hbWUgPSBOVUxMOworICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOworICBpbnB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1VOS05PV047CisgIG91dHB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1VOS05PV047CisgIHRhcmdldCA9IE5VTEw7CisgIHByZXByb2Nlc3NvciA9IE5VTEw7CisgIHByZXByb2NhcmdzID0gTlVMTDsKKyAgbGFuZ3VhZ2UgPSAtMTsKKworICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImk6bzpJOk86RjoiLCBsb25nX29wdGlvbnMsCisJCQkgICAoaW50ICopIDApKSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlICdpJzoKKwkgIGlucHV0X2ZpbGVuYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisKKwljYXNlICdvJzoKKwkgIG91dHB1dF9maWxlbmFtZSA9IG9wdGFyZzsKKwkgIGJyZWFrOworCisJY2FzZSAnSSc6CisJICBpbnB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9uYW1lIChvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlICdPJzoKKwkgIG91dHB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9uYW1lIChvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlICdGJzoKKwkgIHRhcmdldCA9IG9wdGFyZzsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRJT05fUFJFUFJPQ0VTU09SOgorCSAgcHJlcHJvY2Vzc29yID0gb3B0YXJnOworCSAgYnJlYWs7CisKKwljYXNlIE9QVElPTl9ERUZJTkU6CisJICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHByZXByb2NhcmdzID0geG1hbGxvYyAoc3RybGVuIChvcHRhcmcpICsgMyk7CisJICAgICAgc3ByaW50ZiAocHJlcHJvY2FyZ3MsICItRCVzIiwgb3B0YXJnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciAqbjsKKworCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2NhcmdzKSArIHN0cmxlbiAob3B0YXJnKSArIDQpOworCSAgICAgIHNwcmludGYgKG4sICIlcyAtRCVzIiwgcHJlcHJvY2FyZ3MsIG9wdGFyZyk7CisJICAgICAgZnJlZSAocHJlcHJvY2FyZ3MpOworCSAgICAgIHByZXByb2NhcmdzID0gbjsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIE9QVElPTl9JTkNMVURFX0RJUjoKKwkgIGlmIChwcmVwcm9jYXJncyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgcHJlcHJvY2FyZ3MgPSB4bWFsbG9jIChzdHJsZW4gKG9wdGFyZykgKyAzKTsKKwkgICAgICBzcHJpbnRmIChwcmVwcm9jYXJncywgIi1JJXMiLCBvcHRhcmcpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyICpuOworCisJICAgICAgbiA9IHhtYWxsb2MgKHN0cmxlbiAocHJlcHJvY2FyZ3MpICsgc3RybGVuIChvcHRhcmcpICsgNCk7CisJICAgICAgc3ByaW50ZiAobiwgIiVzIC1JJXMiLCBwcmVwcm9jYXJncywgb3B0YXJnKTsKKwkgICAgICBmcmVlIChwcmVwcm9jYXJncyk7CisJICAgICAgcHJlcHJvY2FyZ3MgPSBuOworCSAgICB9CisKKwkgIHsKKwkgICAgc3RydWN0IGluY2x1ZGVfZGlyICpuLCAqKnBwOworCisJICAgIG4gPSAoc3RydWN0IGluY2x1ZGVfZGlyICopIHhtYWxsb2MgKHNpemVvZiAqbik7CisJICAgIG4tPm5leHQgPSBOVUxMOworCSAgICBuLT5kaXIgPSBvcHRhcmc7CisKKwkgICAgZm9yIChwcCA9ICZpbmNsdWRlX2RpcnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKKwkgICAgICA7CisJICAgICpwcCA9IG47CisJICB9CisKKwkgIGJyZWFrOworCisJY2FzZSBPUFRJT05fTEFOR1VBR0U6CisJICBsYW5ndWFnZSA9IHN0cnRvbCAob3B0YXJnLCAoY2hhciAqKikgTlVMTCwgMTYpOworCSAgYnJlYWs7CisKKyNpZmRlZiBZWURFQlVHCisJY2FzZSBPUFRJT05fWVlERUJVRzoKKwkgIHl5ZGVidWcgPSAxOworCSAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgT1BUSU9OX0hFTFA6CisJICB1c2FnZSAoc3Rkb3V0LCAwKTsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRJT05fVkVSU0lPTjoKKwkgIHByaW50X3ZlcnNpb24gKCJ3aW5kcmVzIik7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB1c2FnZSAoc3RkZXJyLCAxKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGlucHV0X2ZpbGVuYW1lID09IE5VTEwgJiYgb3B0aW5kIDwgYXJnYykKKyAgICB7CisgICAgICBpbnB1dF9maWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKyAgICAgICsrb3B0aW5kOworICAgIH0KKworICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IE5VTEwgJiYgb3B0aW5kIDwgYXJnYykKKyAgICB7CisgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07CisgICAgICArK29wdGluZDsKKyAgICB9CisKKyAgaWYgKGFyZ2MgIT0gb3B0aW5kKQorICAgIHVzYWdlIChzdGRlcnIsIDEpOworCisgIGlmIChpbnB1dF9mb3JtYXQgPT0gUkVTX0ZPUk1BVF9VTktOT1dOKQorICAgIHsKKyAgICAgIGlmIChpbnB1dF9maWxlbmFtZSA9PSBOVUxMKQorCWlucHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfUkM7CisgICAgICBlbHNlCisJaW5wdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fZmlsZW5hbWUgKGlucHV0X2ZpbGVuYW1lLCAxKTsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9mb3JtYXQgPT0gUkVTX0ZPUk1BVF9VTktOT1dOKQorICAgIHsKKyAgICAgIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gTlVMTCkKKwlvdXRwdXRfZm9ybWF0ID0gUkVTX0ZPUk1BVF9SQzsKKyAgICAgIGVsc2UKKwlvdXRwdXRfZm9ybWF0ID0gZm9ybWF0X2Zyb21fZmlsZW5hbWUgKG91dHB1dF9maWxlbmFtZSwgMCk7CisgICAgfQorCisgIC8qIFJlYWQgdGhlIGlucHV0IGZpbGUuICAqLworCisgIHN3aXRjaCAoaW5wdXRfZm9ybWF0KQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSBSRVNfRk9STUFUX1JDOgorICAgICAgcmVzb3VyY2VzID0gcmVhZF9yY19maWxlIChpbnB1dF9maWxlbmFtZSwgcHJlcHJvY2Vzc29yLCBwcmVwcm9jYXJncywKKwkJCQlsYW5ndWFnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFU19GT1JNQVRfUkVTOgorICAgICAgcmVzb3VyY2VzID0gcmVhZF9yZXNfZmlsZSAoaW5wdXRfZmlsZW5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVNfRk9STUFUX0NPRkY6CisgICAgICByZXNvdXJjZXMgPSByZWFkX2NvZmZfcnNyYyAoaW5wdXRfZmlsZW5hbWUsIHRhcmdldCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKHJlc291cmNlcyA9PSBOVUxMKQorICAgIGZhdGFsIChfKCJubyByZXNvdXJjZXMiKSk7CisKKyAgLyogU29ydCB0aGUgcmVzb3VyY2VzLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgQ09GRiwgY29udmVuaWVudCBmb3IKKyAgICAgcmMsIGFuZCB1bmltcG9ydGFudCBmb3IgcmVzLiAgKi8KKworICByZXNvdXJjZXMgPSBzb3J0X3Jlc291cmNlcyAocmVzb3VyY2VzKTsKKworICAvKiBXcml0ZSB0aGUgb3V0cHV0IGZpbGUuICAqLworCisgIHJlc3dyX2luaXQgKCk7CisKKyAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSBSRVNfRk9STUFUX1JDOgorICAgICAgd3JpdGVfcmNfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCByZXNvdXJjZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRVNfRk9STUFUX1JFUzoKKyAgICAgIHdyaXRlX3Jlc19maWxlIChvdXRwdXRfZmlsZW5hbWUsIHJlc291cmNlcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFU19GT1JNQVRfQ09GRjoKKyAgICAgIHdyaXRlX2NvZmZfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCB0YXJnZXQsIHJlc291cmNlcyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgeGV4aXQgKDApOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHJlcy5oIGIvYmludXRpbHMvd2luZHJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzc4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy93aW5kcmVzLmgKQEAgLTAsMCArMSw4NDcgQEAKKy8qIHdpbmRyZXMuaCAtLSBoZWFkZXIgZmlsZSBmb3Igd2luZHJlcyBwcm9ncmFtLgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKworLyogVGhpcyBpcyB0aGUgaGVhZGVyIGZpbGUgZm9yIHRoZSB3aW5kcmVzIHByb2dyYW0uICBJdCBkZWZpbmVzCisgICBzdHJ1Y3R1cmVzIGFuZCBkZWNsYXJlcyBmdW5jdGlvbnMgdXNlZCB3aXRoaW4gdGhlIHByb2dyYW0uICAqLworCisjaW5jbHVkZSAid2luZHVuaS5oIgorCisvKiBXZSByZXByZXNlbnQgcmVzb3VyY2VzIGludGVybmFsbHkgYXMgYSB0cmVlLCBzaW1pbGFyIHRvIHRoZSB0cmVlCisgICB1c2VkIGluIHRoZSAucnNyYyBzZWN0aW9uIG9mIGEgQ09GRiBmaWxlLiAgVGhlIHJvb3QgaXMgYQorICAgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgcmVzX2RpcmVjdG9yeQoreworICAvKiBSZXNvdXJjZSBmbGFncy4gIEFjY29yZGluZyB0byB0aGUgTVMgZG9jcywgdGhpcyBpcyBjdXJyZW50bHkKKyAgICAgYWx3YXlzIHplcm8uICAqLworICB1bnNpZ25lZCBsb25nIGNoYXJhY3RlcmlzdGljczsKKyAgLyogVGltZS9kYXRlIHN0YW1wLiAgKi8KKyAgdW5zaWduZWQgbG9uZyB0aW1lOworICAvKiBNYWpvciB2ZXJzaW9uIG51bWJlci4gICovCisgIHVuc2lnbmVkIHNob3J0IG1ham9yOworICAvKiBNaW5vciB2ZXJzaW9uIG51bWJlci4gICovCisgIHVuc2lnbmVkIHNob3J0IG1pbm9yOworICAvKiBEaXJlY3RvcnkgZW50cmllcy4gICovCisgIHN0cnVjdCByZXNfZW50cnkgKmVudHJpZXM7Cit9OworCisvKiBBIHJlc291cmNlIElEIGlzIHN0b3JlZCBpbiBhIHJlc19pZCBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgcmVzX2lkCit7CisgIC8qIE5vbi16ZXJvIGlmIHRoaXMgZW50cnkgaGFzIGEgbmFtZSByYXRoZXIgdGhhbiBhbiBJRC4gICovCisgIHVuc2lnbmVkIGludCBuYW1lZCA6IDE7CisgIHVuaW9uCisgIHsKKyAgICAvKiBJZiB0aGUgbmFtZWQgZmllbGQgaXMgbm9uLXplcm8sIHRoaXMgaXMgdGhlIG5hbWUuICAqLworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIC8qIExlbmd0aCBvZiB0aGUgbmFtZS4gICovCisgICAgICBpbnQgbGVuZ3RoOworICAgICAgLyogUG9pbnRlciB0byB0aGUgbmFtZSwgd2hpY2ggaXMgYSBVbmljb2RlIHN0cmluZy4gICovCisgICAgICB1bmljaGFyICpuYW1lOworICAgIH0gbjsKKyAgICAvKiBJZiB0aGUgbmFtZWQgZmllbGQgaXMgemVybywgdGhpcyBpcyB0aGUgSUQuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaWQ7CisgIH0gdTsKK307CisKKy8qIEVhY2ggZW50cnkgaW4gdGhlIHRyZWUgaXMgYSByZXNfZW50cnkgc3RydWN0dXJlLiAgV2UgbWl4CisgICBkaXJlY3RvcmllcyBhbmQgcmVzb3VyY2VzIGJlY2F1c2UgaW4gYSBDT0ZGIGZpbGUgYWxsIGVudHJpZXMgaW4gYQorICAgZGlyZWN0b3J5IGFyZSBzb3J0ZWQgdG9nZXRoZXIsIHdoZXRoZXIgdGhlIGVudHJpZXMgYXJlCisgICBzdWJkaXJlY3RvcmllcyBvciByZXNvdXJjZXMuICAqLworCitzdHJ1Y3QgcmVzX2VudHJ5Cit7CisgIC8qIE5leHQgZW50cnkuICAqLworICBzdHJ1Y3QgcmVzX2VudHJ5ICpuZXh0OworICAvKiBSZXNvdXJjZSBJRC4gICovCisgIHN0cnVjdCByZXNfaWQgaWQ7CisgIC8qIE5vbi16ZXJvIGlmIHRoaXMgZW50cnkgaXMgYSBzdWJkaXJlY3RvcnkgcmF0aGVyIHRoYW4gYSBsZWFmLiAgKi8KKyAgdW5zaWduZWQgaW50IHN1YmRpciA6IDE7CisgIHVuaW9uCisgIHsKKyAgICAvKiBJZiB0aGUgc3ViZGlyIGZpZWxkIGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUKKyAgICAgICBzdWJkaXJlY3RvcnkuICAqLworICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpkaXI7CisgICAgLyogSWYgdGhlIHN1YmRpciBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UKKyAgICAgICBkYXRhLiAgKi8KKyAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7CisgIH0gdTsKK307CisKKy8qIFR5cGVzIG9mIHJlc291cmNlcy4gICovCisKK2VudW0gcmVzX3R5cGUKK3sKKyAgUkVTX1RZUEVfVU5JTklUSUFMSVpFRCwKKyAgUkVTX1RZUEVfQUNDRUxFUkFUT1IsCisgIFJFU19UWVBFX0JJVE1BUCwKKyAgUkVTX1RZUEVfQ1VSU09SLAorICBSRVNfVFlQRV9HUk9VUF9DVVJTT1IsCisgIFJFU19UWVBFX0RJQUxPRywKKyAgUkVTX1RZUEVfRk9OVCwKKyAgUkVTX1RZUEVfRk9OVERJUiwKKyAgUkVTX1RZUEVfSUNPTiwKKyAgUkVTX1RZUEVfR1JPVVBfSUNPTiwKKyAgUkVTX1RZUEVfTUVOVSwKKyAgUkVTX1RZUEVfTUVTU0FHRVRBQkxFLAorICBSRVNfVFlQRV9SQ0RBVEEsCisgIFJFU19UWVBFX1NUUklOR1RBQkxFLAorICBSRVNfVFlQRV9VU0VSREFUQSwKKyAgUkVTX1RZUEVfVkVSU0lPTklORk8KK307CisKKy8qIEEgcmVzIGZpbGUgYW5kIGEgQ09GRiBmaWxlIHN0b3JlIGluZm9ybWF0aW9uIGRpZmZlcmVudGx5LiAgVGhlCisgICByZXNfaW5mbyBzdHJ1Y3R1cmVzIGhvbGRzIGRhdGEgd2hpY2ggaW4gYSByZXMgZmlsZSBpcyBzdG9yZWQgd2l0aAorICAgZWFjaCByZXNvdXJjZSwgYnV0IGluIGEgQ09GRiBmaWxlIGlzIHN0b3JlZCBlbHNld2hlcmUuICAqLworCitzdHJ1Y3QgcmVzX3Jlc19pbmZvCit7CisgIC8qIExhbmd1YWdlLiAgSW4gYSBDT0ZGIGZpbGUsIHRoZSB0aGlyZCBsZXZlbCBvZiB0aGUgZGlyZWN0b3J5IGlzCisgICAgIGtleWVkIGJ5IHRoZSBsYW5ndWFnZSwgc28gdGhlIGxhbmd1YWdlIG9mIGEgcmVzb3VyY2UgaXMgZGVmaW5lZAorICAgICBieSBpdHMgbG9jYXRpb24gaW4gdGhlIHJlc291cmNlIHRyZWUuICAqLworICB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKKyAgLyogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSByZXNvdXJjZS4gIEVudGlyZWx5IHVzZXIgZGVmaW5lZC4gIEluIGEKKyAgICAgQ09GRiBmaWxlLCB0aGUgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGEgY2hhcmFjdGVyaXN0aWNzCisgICAgIGZpZWxkLCBidXQgSSBkb24ndCBrbm93IGlmIGl0J3MgcmVsYXRlZCB0byB0aGUgb25lIGluIHRoZSByZXMKKyAgICAgZmlsZS4gICovCisgIHVuc2lnbmVkIGxvbmcgY2hhcmFjdGVyaXN0aWNzOworICAvKiBWZXJzaW9uIG9mIHRoZSByZXNvdXJjZS4gIEVudGlyZWx5IHVzZXIgZGVmaW5lZC4gIEluIGEgQ09GRiBmaWxlLAorICAgICB0aGUgcmVzX2RpcmVjdG9yeSBzdHJ1Y3R1cmUgaGFzIGEgY2hhcmFjdGVyaXN0aWNzIGZpZWxkLCBidXQgSQorICAgICBkb24ndCBrbm93IGlmIGl0J3MgcmVsYXRlZCB0byB0aGUgb25lIGluIHRoZSByZXMgZmlsZS4gICovCisgIHVuc2lnbmVkIGxvbmcgdmVyc2lvbjsKKyAgLyogTWVtb3J5IGZsYWdzLiAgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBNRU1GTEFHIHZhbHVlcworICAgICBkZWZpbmVkIGJlbG93LiAgTW9zdCBvZiB0aGVzZSB2YWx1ZXMgYXJlIGhpc3RvcmljYWwsIGFuZCBhcmUgbm90CisgICAgIG1lYW5pbmdmdWwgZm9yIHdpbjMyLiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkgd2F5IHRvIHN0b3JlCisgICAgIHRoaXMgaW5mb3JtYXRpb24gaW4gYSBDT0ZGIGZpbGUuICAqLworICB1bnNpZ25lZCBzaG9ydCBtZW1mbGFnczsKK307CisKKy8qIEVhY2ggcmVzb3VyY2UgaW4gYSBDT0ZGIGZpbGUgaGFzIHNvbWUgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGRvZXMKKyAgIG5vdCBhcHBlYXIgaW4gYSByZXMgZmlsZS4gICovCisKK3N0cnVjdCByZXNfY29mZl9pbmZvCit7CisgIC8qIFRoZSBjb2RlIHBhZ2UgdXNlZCBmb3IgdGhlIGRhdGEuICBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcworICAgICBzaG91bGQgYmUuICAqLworICB1bnNpZ25lZCBsb25nIGNvZGVwYWdlOworICAvKiBBIHJlc291cmNlIGVudHJ5IGluIGEgQ09GRiBmaWxlIGhhcyBhIHJlc2VydmVkIGZpZWxkLCB3aGljaCB3ZQorICAgICByZWNvcmQgaGVyZSB3aGVuIHJlYWRpbmcgYSBDT0ZGIGZpbGUuICBXaGVuIHdyaXRpbmcgYSBDT0ZGIGZpbGUsCisgICAgIHdlIHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICAqLworICB1bnNpZ25lZCBsb25nIHJlc2VydmVkOworfTsKKworLyogUmVzb3VyY2UgZGF0YSBpcyBzdG9yZWQgaW4gYSByZXNfcmVzb3VyY2Ugc3RydWN0dXJlLiAgKi8KKworc3RydWN0IHJlc19yZXNvdXJjZQoreworICAvKiBUaGUgdHlwZSBvZiByZXNvdXJjZS4gICovCisgIGVudW0gcmVzX3R5cGUgdHlwZTsKKyAgLyogVGhlIGRhdGEgZm9yIHRoZSByZXNvdXJjZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgfSBkYXRhOworICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjOworICAgIHN0cnVjdCBjdXJzb3IgKmN1cnNvcjsKKyAgICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3I7CisgICAgc3RydWN0IGRpYWxvZyAqZGlhbG9nOworICAgIHN0cnVjdCBmb250ZGlyICpmb250ZGlyOworICAgIHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uOworICAgIHN0cnVjdCBtZW51ICptZW51OworICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhOworICAgIHN0cnVjdCBzdHJpbmd0YWJsZSAqc3RyaW5ndGFibGU7CisgICAgc3RydWN0IHJjZGF0YV9pdGVtICp1c2VyZGF0YTsKKyAgICBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOworICB9IHU7CisgIC8qIEluZm9ybWF0aW9uIGZyb20gYSByZXMgZmlsZS4gICovCisgIHN0cnVjdCByZXNfcmVzX2luZm8gcmVzX2luZm87CisgIC8qIEluZm9ybWF0aW9uIGZyb20gYSBDT0ZGIGZpbGUuICAqLworICBzdHJ1Y3QgcmVzX2NvZmZfaW5mbyBjb2ZmX2luZm87Cit9OworCisvKiBNZW1vcnkgZmxhZ3MgaW4gdGhlIG1lbWZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHJlc19yZXNvdXJjZS4gICovCisKKyNkZWZpbmUgTUVNRkxBR19NT1ZFQUJMRQkweDEwCisjZGVmaW5lIE1FTUZMQUdfUFVSRQkJMHgyMAorI2RlZmluZSBNRU1GTEFHX1BSRUxPQUQJCTB4NDAKKyNkZWZpbmUgTUVNRkxBR19ESVNDQVJEQUJMRQkweDEwMDAKKworLyogU3RhbmRhcmQgcmVzb3VyY2UgdHlwZSBjb2Rlcy4gIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBJRCBmaWVsZCBvZiBhCisgICByZXNfZW50cnkgc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBSVF9DVVJTT1IJCSAxCisjZGVmaW5lIFJUX0JJVE1BUAkJIDIKKyNkZWZpbmUgUlRfSUNPTgkJCSAzCisjZGVmaW5lIFJUX01FTlUJCQkgNAorI2RlZmluZSBSVF9ESUFMT0cJCSA1CisjZGVmaW5lIFJUX1NUUklORwkJIDYKKyNkZWZpbmUgUlRfRk9OVERJUgkJIDcKKyNkZWZpbmUgUlRfRk9OVAkJCSA4CisjZGVmaW5lIFJUX0FDQ0VMRVJBVE9SCQkgOQorI2RlZmluZSBSVF9SQ0RBVEEJCTEwCisjZGVmaW5lIFJUX01FU1NBR0VUQUJMRQkJMTEKKyNkZWZpbmUgUlRfR1JPVVBfQ1VSU09SCQkxMgorI2RlZmluZSBSVF9HUk9VUF9JQ09OCQkxNAorI2RlZmluZSBSVF9WRVJTSU9OCQkxNgorI2RlZmluZSBSVF9ETEdJTkNMVURFCQkxNworI2RlZmluZSBSVF9QTFVHUExBWQkJMTkKKyNkZWZpbmUgUlRfVlhECQkJMjAKKyNkZWZpbmUgUlRfQU5JQ1VSU09SCQkyMQorI2RlZmluZSBSVF9BTklJQ09OCQkyMgorCisvKiBBbiBhY2NlbGVyYXRvciByZXNvdXJjZSBpcyBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMuICAqLworCitzdHJ1Y3QgYWNjZWxlcmF0b3IKK3sKKyAgLyogTmV4dCBhY2NlbGVyYXRvci4gICovCisgIHN0cnVjdCBhY2NlbGVyYXRvciAqbmV4dDsKKyAgLyogRmxhZ3MuICBBIGNvbWJpbmF0aW9uIG9mIHRoZSBBQ0MgdmFsdWVzIGRlZmluZWQgYmVsb3cuICAqLworICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKKyAgLyogS2V5IHZhbHVlLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQga2V5OworICAvKiBSZXNvdXJjZSBJRC4gICovCisgIHVuc2lnbmVkIHNob3J0IGlkOworfTsKKworLyogQWNjZWxlcmF0b3IgZmxhZ3MgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGFjY2VsZXJhdG9yLgorICAgVGhlc2UgYXJlIHRoZSBzYW1lIHZhbHVlcyB0aGF0IGFwcGVhciBpbiBhIHJlcyBmaWxlLiAgSSBob3BlLiAgKi8KKworI2RlZmluZSBBQ0NfVklSVEtFWQkweDAxCisjZGVmaW5lIEFDQ19OT0lOVkVSVAkweDAyCisjZGVmaW5lIEFDQ19TSElGVAkweDA0CisjZGVmaW5lIEFDQ19DT05UUk9MCTB4MDgKKyNkZWZpbmUgQUNDX0FMVAkJMHgxMAorI2RlZmluZSBBQ0NfTEFTVAkweDgwCisKKy8qIEEgY3Vyc29yIHJlc291cmNlLiAgKi8KKworc3RydWN0IGN1cnNvcgoreworICAvKiBYIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCisgIHNob3J0IHhob3RzcG90OworICAvKiBZIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCisgIHNob3J0IHlob3RzcG90OworICAvKiBMZW5ndGggb2YgYml0bWFwIGRhdGEuICAqLworICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgLyogRGF0YS4gICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Cit9OworCisvKiBBIGdyb3VwX2N1cnNvciByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZ3JvdXBfY3Vyc29yIHN0cnVjdHVyZXMuICAqLworCitzdHJ1Y3QgZ3JvdXBfY3Vyc29yCit7CisgIC8qIE5leHQgY3Vyc29yIGluIGdyb3VwLiAgKi8KKyAgc3RydWN0IGdyb3VwX2N1cnNvciAqbmV4dDsKKyAgLyogV2lkdGguICAqLworICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKKyAgLyogSGVpZ2h0LiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OworICAvKiBQbGFuZXMuICAqLworICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7CisgIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgYml0czsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIGN1cnNvciByZXNvdXJjZS4gICovCisgIHVuc2lnbmVkIGxvbmcgYnl0ZXM7CisgIC8qIEluZGV4IG9mIGN1cnNvciByZXNvdXJjZS4gICovCisgIHVuc2lnbmVkIHNob3J0IGluZGV4OworfTsKKworLyogQSBkaWFsb2cgcmVzb3VyY2UuICAqLworCitzdHJ1Y3QgZGlhbG9nCit7CisgIC8qIEJhc2ljIHdpbmRvdyBzdHlsZS4gICovCisgIHVuc2lnbmVkIGxvbmcgc3R5bGU7CisgIC8qIEV4dGVuZGVkIHdpbmRvdyBzdHlsZS4gICovCisgIHVuc2lnbmVkIGxvbmcgZXhzdHlsZTsKKyAgLyogWCBjb29yZGluYXRlLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgeDsKKyAgLyogWSBjb29yZGluYXRlLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgeTsKKyAgLyogV2lkdGguICAqLworICB1bnNpZ25lZCBzaG9ydCB3aWR0aDsKKyAgLyogSGVpZ2h0LiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgaGVpZ2h0OworICAvKiBNZW51IG5hbWUuICAqLworICBzdHJ1Y3QgcmVzX2lkIG1lbnU7CisgIC8qIENsYXNzIG5hbWUuICAqLworICBzdHJ1Y3QgcmVzX2lkIGNsYXNzOworICAvKiBDYXB0aW9uLiAgKi8KKyAgdW5pY2hhciAqY2FwdGlvbjsKKyAgLyogRm9udCBwb2ludCBzaXplLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgcG9pbnRzaXplOworICAvKiBGb250IG5hbWUuICAqLworICB1bmljaGFyICpmb250OworICAvKiBFeHRlbmRlZCBpbmZvcm1hdGlvbiBmb3IgYSBkaWFsb2dleC4gICovCisgIHN0cnVjdCBkaWFsb2dfZXggKmV4OworICAvKiBDb250cm9scy4gICovCisgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqY29udHJvbHM7Cit9OworCisvKiBBbiBleHRlbmRlZCBkaWFsb2cgaGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgZGlhbG9nX2V4Cit7CisgIC8qIEhlbHAgSUQuICAqLworICB1bnNpZ25lZCBsb25nIGhlbHA7CisgIC8qIEZvbnQgd2VpZ2h0LiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgd2VpZ2h0OworICAvKiBXaGV0aGVyIHRoZSBmb250IGlzIGl0YWxpYy4gICovCisgIHVuc2lnbmVkIHNob3J0IGl0YWxpYzsKK307CisKKy8qIFdpbmRvdyBzdHlsZSBmbGFncywgZnJvbSB0aGUgd2luc3VwIERlZmluZXMuaCBoZWFkZXIgZmlsZS4gIFRoZXNlCisgICBjYW4gYXBwZWFyIGluIHRoZSBzdHlsZSBmaWVsZCBvZiBhIHN0cnVjdCBkaWFsb2cgb3IgYSBzdHJ1Y3QKKyAgIGRpYWxvZ19jb250cm9sLiAgKi8KKworI2RlZmluZSBDV19VU0VERUZBVUxUCSgweDgwMDAwMDAwKQorI2RlZmluZSBXU19CT1JERVIJKDB4ODAwMDAwTCkKKyNkZWZpbmUgV1NfQ0FQVElPTgkoMHhjMDAwMDBMKQorI2RlZmluZSBXU19DSElMRAkoMHg0MDAwMDAwMEwpCisjZGVmaW5lIFdTX0NISUxEV0lORE9XCSgweDQwMDAwMDAwTCkKKyNkZWZpbmUgV1NfQ0xJUENISUxEUkVOCSgweDIwMDAwMDBMKQorI2RlZmluZSBXU19DTElQU0lCTElOR1MJKDB4NDAwMDAwMEwpCisjZGVmaW5lIFdTX0RJU0FCTEVECSgweDgwMDAwMDBMKQorI2RlZmluZSBXU19ETEdGUkFNRQkoMHg0MDAwMDBMKQorI2RlZmluZSBXU19HUk9VUAkoMHgyMDAwMEwpCisjZGVmaW5lIFdTX0hTQ1JPTEwJKDB4MTAwMDAwTCkKKyNkZWZpbmUgV1NfSUNPTklDCSgweDIwMDAwMDAwTCkKKyNkZWZpbmUgV1NfTUFYSU1JWkUJKDB4MTAwMDAwMEwpCisjZGVmaW5lIFdTX01BWElNSVpFQk9YCSgweDEwMDAwTCkKKyNkZWZpbmUgV1NfTUlOSU1JWkUJKDB4MjAwMDAwMDBMKQorI2RlZmluZSBXU19NSU5JTUlaRUJPWAkoMHgyMDAwMEwpCisjZGVmaW5lIFdTX09WRVJMQVBQRUQJKDBMKQorI2RlZmluZSBXU19PVkVSTEFQUEVEV0lORE9XCSgweGNmMDAwMEwpCisjZGVmaW5lIFdTX1BPUFVQCSgweDgwMDAwMDAwTCkKKyNkZWZpbmUgV1NfUE9QVVBXSU5ET1cJKDB4ODA4ODAwMDBMKQorI2RlZmluZSBXU19TSVpFQk9YCSgweDQwMDAwTCkKKyNkZWZpbmUgV1NfU1lTTUVOVQkoMHg4MDAwMEwpCisjZGVmaW5lIFdTX1RBQlNUT1AJKDB4MTAwMDBMKQorI2RlZmluZSBXU19USElDS0ZSQU1FCSgweDQwMDAwTCkKKyNkZWZpbmUgV1NfVElMRUQJKDBMKQorI2RlZmluZSBXU19USUxFRFdJTkRPVwkoMHhjZjAwMDBMKQorI2RlZmluZSBXU19WSVNJQkxFCSgweDEwMDAwMDAwTCkKKyNkZWZpbmUgV1NfVlNDUk9MTAkoMHgyMDAwMDBMKQorI2RlZmluZSBNRElTX0FMTENISUxEU1RZTEVTCSgweDEpCisjZGVmaW5lIEJTXzNTVEFURQkoMHg1TCkKKyNkZWZpbmUgQlNfQVVUTzNTVEFURQkoMHg2TCkKKyNkZWZpbmUgQlNfQVVUT0NIRUNLQk9YCSgweDNMKQorI2RlZmluZSBCU19BVVRPUkFESU9CVVRUT04JKDB4OUwpCisjZGVmaW5lIEJTX0JJVE1BUAkoMHg4MEwpCisjZGVmaW5lIEJTX0JPVFRPTQkoMHg4MDBMKQorI2RlZmluZSBCU19DRU5URVIJKDB4MzAwTCkKKyNkZWZpbmUgQlNfQ0hFQ0tCT1gJKDB4MkwpCisjZGVmaW5lIEJTX0RFRlBVU0hCVVRUT04JKDB4MUwpCisjZGVmaW5lIEJTX0dST1VQQk9YCSgweDdMKQorI2RlZmluZSBCU19JQ09OCSgweDQwTCkKKyNkZWZpbmUgQlNfTEVGVAkoMHgxMDBMKQorI2RlZmluZSBCU19MRUZUVEVYVAkoMHgyMEwpCisjZGVmaW5lIEJTX01VTFRJTElORQkoMHgyMDAwTCkKKyNkZWZpbmUgQlNfTk9USUZZCSgweDQwMDBMKQorI2RlZmluZSBCU19PV05FUkRSQVcJKDB4YkwpCisjZGVmaW5lIEJTX1BVU0hCT1gJKDB4Y0wpCQkvKiBGSVhNRSEgIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICAqLworI2RlZmluZSBCU19QVVNIQlVUVE9OCSgwTCkKKyNkZWZpbmUgQlNfUFVTSExJS0UJKDB4MTAwMEwpCisjZGVmaW5lIEJTX1JBRElPQlVUVE9OCSgweDRMKQorI2RlZmluZSBCU19SSUdIVAkoMHgyMDBMKQorI2RlZmluZSBCU19SSUdIVEJVVFRPTgkoMHgyMEwpCisjZGVmaW5lIEJTX1RFWFQJKDBMKQorI2RlZmluZSBCU19UT1AJKDB4NDAwTCkKKyNkZWZpbmUgQlNfVVNFUkJVVFRPTgkoMHg4TCkKKyNkZWZpbmUgQlNfVkNFTlRFUgkoMHhjMDBMKQorI2RlZmluZSBDQlNfQVVUT0hTQ1JPTEwJKDB4NDBMKQorI2RlZmluZSBDQlNfRElTQUJMRU5PU0NST0xMCSgweDgwMEwpCisjZGVmaW5lIENCU19EUk9QRE9XTgkoMHgyTCkKKyNkZWZpbmUgQ0JTX0RST1BET1dOTElTVAkoMHgzTCkKKyNkZWZpbmUgQ0JTX0hBU1NUUklOR1MJKDB4MjAwTCkKKyNkZWZpbmUgQ0JTX0xPV0VSQ0FTRQkoMHg0MDAwTCkKKyNkZWZpbmUgQ0JTX05PSU5URUdSQUxIRUlHSFQJKDB4NDAwTCkKKyNkZWZpbmUgQ0JTX09FTUNPTlZFUlQJKDB4ODBMKQorI2RlZmluZSBDQlNfT1dORVJEUkFXRklYRUQJKDB4MTBMKQorI2RlZmluZSBDQlNfT1dORVJEUkFXVkFSSUFCTEUJKDB4MjBMKQorI2RlZmluZSBDQlNfU0lNUExFCSgweDFMKQorI2RlZmluZSBDQlNfU09SVAkoMHgxMDBMKQorI2RlZmluZSBDQlNfVVBQRVJDQVNFCSgweDIwMDBMKQorI2RlZmluZSBFU19BVVRPSFNDUk9MTAkoMHg4MEwpCisjZGVmaW5lIEVTX0FVVE9WU0NST0xMCSgweDQwTCkKKyNkZWZpbmUgRVNfQ0VOVEVSCSgweDFMKQorI2RlZmluZSBFU19MRUZUCSgwTCkKKyNkZWZpbmUgRVNfTE9XRVJDQVNFCSgweDEwTCkKKyNkZWZpbmUgRVNfTVVMVElMSU5FCSgweDRMKQorI2RlZmluZSBFU19OT0hJREVTRUwJKDB4MTAwTCkKKyNkZWZpbmUgRVNfTlVNQkVSCSgweDIwMDBMKQorI2RlZmluZSBFU19PRU1DT05WRVJUCSgweDQwMEwpCisjZGVmaW5lIEVTX1BBU1NXT1JECSgweDIwTCkKKyNkZWZpbmUgRVNfUkVBRE9OTFkJKDB4ODAwTCkKKyNkZWZpbmUgRVNfUklHSFQJKDB4MkwpCisjZGVmaW5lIEVTX1VQUEVSQ0FTRQkoMHg4TCkKKyNkZWZpbmUgRVNfV0FOVFJFVFVSTgkoMHgxMDAwTCkKKyNkZWZpbmUgTEJTX0RJU0FCTEVOT1NDUk9MTAkoMHgxMDAwTCkKKyNkZWZpbmUgTEJTX0VYVEVOREVEU0VMCSgweDgwMEwpCisjZGVmaW5lIExCU19IQVNTVFJJTkdTCSgweDQwTCkKKyNkZWZpbmUgTEJTX01VTFRJQ09MVU1OCSgweDIwMEwpCisjZGVmaW5lIExCU19NVUxUSVBMRVNFTAkoMHg4TCkKKyNkZWZpbmUgTEJTX05PREFUQQkoMHgyMDAwTCkKKyNkZWZpbmUgTEJTX05PSU5URUdSQUxIRUlHSFQJKDB4MTAwTCkKKyNkZWZpbmUgTEJTX05PUkVEUkFXCSgweDRMKQorI2RlZmluZSBMQlNfTk9TRUwJKDB4NDAwMEwpCisjZGVmaW5lIExCU19OT1RJRlkJKDB4MUwpCisjZGVmaW5lIExCU19PV05FUkRSQVdGSVhFRAkoMHgxMEwpCisjZGVmaW5lIExCU19PV05FUkRSQVdWQVJJQUJMRQkoMHgyMEwpCisjZGVmaW5lIExCU19TT1JUCSgweDJMKQorI2RlZmluZSBMQlNfU1RBTkRBUkQJKDB4YTAwMDAzTCkKKyNkZWZpbmUgTEJTX1VTRVRBQlNUT1BTCSgweDgwTCkKKyNkZWZpbmUgTEJTX1dBTlRLRVlCT0FSRElOUFVUCSgweDQwMEwpCisjZGVmaW5lIFNCU19CT1RUT01BTElHTgkoMHg0TCkKKyNkZWZpbmUgU0JTX0hPUloJKDBMKQorI2RlZmluZSBTQlNfTEVGVEFMSUdOCSgweDJMKQorI2RlZmluZSBTQlNfUklHSFRBTElHTgkoMHg0TCkKKyNkZWZpbmUgU0JTX1NJWkVCT1gJKDB4OEwpCisjZGVmaW5lIFNCU19TSVpFQk9YQk9UVE9NUklHSFRBTElHTgkoMHg0TCkKKyNkZWZpbmUgU0JTX1NJWkVCT1hUT1BMRUZUQUxJR04JKDB4MkwpCisjZGVmaW5lIFNCU19TSVpFR1JJUAkoMHgxMEwpCisjZGVmaW5lIFNCU19UT1BBTElHTgkoMHgyTCkKKyNkZWZpbmUgU0JTX1ZFUlQJKDB4MUwpCisjZGVmaW5lIFNTX0JJVE1BUAkoMHhlTCkKKyNkZWZpbmUgU1NfQkxBQ0tGUkFNRQkoMHg3TCkKKyNkZWZpbmUgU1NfQkxBQ0tSRUNUCSgweDRMKQorI2RlZmluZSBTU19DRU5URVIJKDB4MUwpCisjZGVmaW5lIFNTX0NFTlRFUklNQUdFCSgweDIwMEwpCisjZGVmaW5lIFNTX0VOSE1FVEFGSUxFCSgweGZMKQorI2RlZmluZSBTU19FVENIRURGUkFNRQkoMHgxMkwpCisjZGVmaW5lIFNTX0VUQ0hFREhPUloJKDB4MTBMKQorI2RlZmluZSBTU19FVENIRURWRVJUCSgweDExTCkKKyNkZWZpbmUgU1NfR1JBWUZSQU1FCSgweDhMKQorI2RlZmluZSBTU19HUkFZUkVDVAkoMHg1TCkKKyNkZWZpbmUgU1NfSUNPTgkoMHgzTCkKKyNkZWZpbmUgU1NfTEVGVAkoMEwpCisjZGVmaW5lIFNTX0xFRlROT1dPUkRXUkFQCSgweGNMKQorI2RlZmluZSBTU19OT1BSRUZJWAkoMHg4MEwpCisjZGVmaW5lIFNTX05PVElGWQkoMHgxMDBMKQorI2RlZmluZSBTU19PV05FUkRSQVcJKDB4ZEwpCisjZGVmaW5lIFNTX1JFQUxTSVpFSU1BR0UJKDB4ODAwTCkKKyNkZWZpbmUgU1NfUklHSFQJKDB4MkwpCisjZGVmaW5lIFNTX1JJR0hUSlVTVAkoMHg0MDBMKQorI2RlZmluZSBTU19TSU1QTEUJKDB4YkwpCisjZGVmaW5lIFNTX1NVTktFTgkoMHgxMDAwTCkKKyNkZWZpbmUgU1NfVVNFUklURU0gICAgICgweGFMKQorI2RlZmluZSBTU19XSElURUZSQU1FCSgweDlMKQorI2RlZmluZSBTU19XSElURVJFQ1QJKDB4NkwpCisjZGVmaW5lIERTXzNETE9PSwkoMHg0TCkKKyNkZWZpbmUgRFNfQUJTQUxJR04JKDB4MUwpCisjZGVmaW5lIERTX0NFTlRFUgkoMHg4MDBMKQorI2RlZmluZSBEU19DRU5URVJNT1VTRQkoMHgxMDAwTCkKKyNkZWZpbmUgRFNfQ09OVEVYVEhFTFAJKDB4MjAwMEwpCisjZGVmaW5lIERTX0NPTlRST0wJKDB4NDAwTCkKKyNkZWZpbmUgRFNfRklYRURTWVMJKDB4OEwpCisjZGVmaW5lIERTX0xPQ0FMRURJVAkoMHgyMEwpCisjZGVmaW5lIERTX01PREFMRlJBTUUJKDB4ODBMKQorI2RlZmluZSBEU19OT0ZBSUxDUkVBVEUJKDB4MTBMKQorI2RlZmluZSBEU19OT0lETEVNU0cJKDB4MTAwTCkKKyNkZWZpbmUgRFNfU0VURk9OVAkoMHg0MEwpCisjZGVmaW5lIERTX1NFVEZPUkVHUk9VTkQJKDB4MjAwTCkKKyNkZWZpbmUgRFNfU1lTTU9EQUwJKDB4MkwpCisKKy8qIEEgZGlhbG9nIGNvbnRyb2wuICAqLworCitzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wKK3sKKyAgLyogTmV4dCBjb250cm9sLiAgKi8KKyAgc3RydWN0IGRpYWxvZ19jb250cm9sICpuZXh0OworICAvKiBJRC4gICovCisgIHVuc2lnbmVkIHNob3J0IGlkOworICAvKiBTdHlsZS4gICovCisgIHVuc2lnbmVkIGxvbmcgc3R5bGU7CisgIC8qIEV4dGVuZGVkIHN0eWxlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBleHN0eWxlOworICAvKiBYIGNvb3JkaW5hdGUuICAqLworICB1bnNpZ25lZCBzaG9ydCB4OworICAvKiBZIGNvb3JkaW5hdGUuICAqLworICB1bnNpZ25lZCBzaG9ydCB5OworICAvKiBXaWR0aC4gICovCisgIHVuc2lnbmVkIHNob3J0IHdpZHRoOworICAvKiBIZWlnaHQuICAqLworICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7CisgIC8qIENsYXNzIG5hbWUuICAqLworICBzdHJ1Y3QgcmVzX2lkIGNsYXNzOworICAvKiBBc3NvY2lhdGVkIHRleHQuICAqLworICBzdHJ1Y3QgcmVzX2lkIHRleHQ7CisgIC8qIEV4dHJhIGRhdGEgZm9yIHRoZSB3aW5kb3cgcHJvY2VkdXJlLiAgKi8KKyAgc3RydWN0IHJjZGF0YV9pdGVtICpkYXRhOworICAvKiBIZWxwIElELiAgT25seSB1c2VkIGluIGFuIGV4dGVuZGVkIGRpYWxvZy4gICovCisgIHVuc2lnbmVkIGxvbmcgaGVscDsKK307CisKKy8qIENvbnRyb2wgY2xhc3Nlcy4gIFRoZXNlIGNhbiBiZSB1c2VkIGFzIHRoZSBJRCBmaWVsZCBpbiBhIHN0cnVjdAorICAgZGlhbG9nX2NvbnRyb2wuICAqLworCisjZGVmaW5lIENUTF9CVVRUT04JMHg4MAorI2RlZmluZSBDVExfRURJVAkweDgxCisjZGVmaW5lIENUTF9TVEFUSUMJMHg4MgorI2RlZmluZSBDVExfTElTVEJPWAkweDgzCisjZGVmaW5lIENUTF9TQ1JPTExCQVIJMHg4NAorI2RlZmluZSBDVExfQ09NQk9CT1gJMHg4NQorCisvKiBBIGZvbnRkaXIgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGZvbnRkaXIgc3RydWN0dXJlcy4gICovCisKK3N0cnVjdCBmb250ZGlyCit7CisgIHN0cnVjdCBmb250ZGlyICpuZXh0OworICAvKiBJbmRleCBvZiBmb250IGVudHJ5LiAgKi8KKyAgc2hvcnQgaW5kZXg7CisgIC8qIExlbmd0aCBvZiBmb250IGluZm9ybWF0aW9uLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIC8qIEZvbnQgaW5mb3JtYXRpb24uICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Cit9OworCisvKiBBIGdyb3VwX2ljb24gcmVzb3VyY2UgaXMgYSBsaXN0IG9mIGdyb3VwX2ljb24gc3RydWN0dXJlcy4gICovCisKK3N0cnVjdCBncm91cF9pY29uCit7CisgIC8qIE5leHQgaWNvbiBpbiBncm91cC4gICovCisgIHN0cnVjdCBncm91cF9pY29uICpuZXh0OworICAvKiBXaWR0aC4gICovCisgIHVuc2lnbmVkIGNoYXIgd2lkdGg7CisgIC8qIEhlaWdodC4gICovCisgIHVuc2lnbmVkIGNoYXIgaGVpZ2h0OworICAvKiBDb2xvciBjb3VudC4gICovCisgIHVuc2lnbmVkIGNoYXIgY29sb3JzOworICAvKiBQbGFuZXMuICAqLworICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7CisgIC8qIEJpdHMgcGVyIHBpeGVsLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgYml0czsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIGluIGN1cnNvciByZXNvdXJjZS4gICovCisgIHVuc2lnbmVkIGxvbmcgYnl0ZXM7CisgIC8qIEluZGV4IG9mIGN1cnNvciByZXNvdXJjZS4gICovCisgIHVuc2lnbmVkIHNob3J0IGluZGV4OworfTsKKworLyogQSBtZW51IHJlc291cmNlLiAgKi8KKworc3RydWN0IG1lbnUKK3sKKyAgLyogTGlzdCBvZiBtZW51aXRlbXMuICAqLworICBzdHJ1Y3QgbWVudWl0ZW0gKml0ZW1zOworICAvKiBIZWxwIElELiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkgd2F5IHRvIHNldCB0aGlzIGluIGFuIHJjCisgICAgIGZpbGUsIGJ1dCBpdCBjYW4gYXBwZWFyIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBoZWxwOworfTsKKworLyogQSBtZW51IHJlc291cmNlIGlzIGEgbGlzdCBvZiBtZW51aXRlbSBzdHJ1Y3R1cmVzLiAgKi8KKworc3RydWN0IG1lbnVpdGVtCit7CisgIC8qIE5leHQgbWVudWl0ZW0uICAqLworICBzdHJ1Y3QgbWVudWl0ZW0gKm5leHQ7CisgIC8qIFR5cGUuICBJbiBhIG5vcm1hbCBtZW51LCByYXRoZXIgdGhhbiBhIG1lbnVleCwgdGhpcyBpcyB0aGUgZmxhZ3MKKyAgICAgZmllbGQuICAqLworICB1bnNpZ25lZCBsb25nIHR5cGU7CisgIC8qIFN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gYSBtZW51ZXguICAqLworICB1bnNpZ25lZCBsb25nIHN0YXRlOworICAvKiBJZC4gICovCisgIHVuc2lnbmVkIHNob3J0IGlkOworICAvKiBVbmljb2RlIHRleHQuICAqLworICB1bmljaGFyICp0ZXh0OworICAvKiBQb3B1cCBtZW51IGl0ZW1zIGZvciBhIHBvcHVwLiAgKi8KKyAgc3RydWN0IG1lbnVpdGVtICpwb3B1cDsKKyAgLyogSGVscCBJRC4gIFRoaXMgaXMgb25seSB1c2VkIGluIGEgbWVudWV4LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBoZWxwOworfTsKKworLyogTWVudSBpdGVtIGZsYWdzLiAgVGhlc2UgY2FuIGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QKKyAgIG1lbnVpdGVtLiAgKi8KKworI2RlZmluZSBNRU5VSVRFTV9HUkFZRUQJCTB4MDAxCisjZGVmaW5lIE1FTlVJVEVNX0lOQUNUSVZFCTB4MDAyCisjZGVmaW5lIE1FTlVJVEVNX0JJVE1BUAkJMHgwMDQKKyNkZWZpbmUgTUVOVUlURU1fT1dORVJEUkFXCTB4MTAwCisjZGVmaW5lIE1FTlVJVEVNX0NIRUNLRUQJMHgwMDgKKyNkZWZpbmUgTUVOVUlURU1fUE9QVVAJCTB4MDEwCisjZGVmaW5lIE1FTlVJVEVNX01FTlVCQVJCUkVBSwkweDAyMAorI2RlZmluZSBNRU5VSVRFTV9NRU5VQlJFQUsJMHgwNDAKKyNkZWZpbmUgTUVOVUlURU1fRU5ETUVOVQkweDA4MAorI2RlZmluZSBNRU5VSVRFTV9IRUxQCSAgICAgICAweDQwMDAKKworLyogQW4gcmNkYXRhIHJlc291cmNlIGlzIGEgcG9pbnRlciB0byBhIGxpc3Qgb2YgcmNkYXRhX2l0ZW0KKyAgIHN0cnVjdHVyZXMuICAqLworCitzdHJ1Y3QgcmNkYXRhX2l0ZW0KK3sKKyAgLyogTmV4dCBkYXRhIGl0ZW0uICAqLworICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKm5leHQ7CisgIC8qIFR5cGUgb2YgZGF0YS4gICovCisgIGVudW0KKyAgeworICAgIFJDREFUQV9XT1JELAorICAgIFJDREFUQV9EV09SRCwKKyAgICBSQ0RBVEFfU1RSSU5HLAorICAgIFJDREFUQV9XU1RSSU5HLAorICAgIFJDREFUQV9CVUZGRVIKKyAgfSB0eXBlOworICB1bmlvbgorICB7CisgICAgdW5zaWduZWQgaW50IHdvcmQ7CisgICAgdW5zaWduZWQgbG9uZyBkd29yZDsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgfSBzdHJpbmc7CisgICAgc3RydWN0CisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgICAgICBjb25zdCB1bmljaGFyICp3OworICAgIH0gd3N0cmluZzsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgfSBidWZmZXI7CisgIH0gdTsKK307CisKKy8qIEEgc3RyaW5ndGFibGUgcmVzb3VyY2UgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5ndGFibGUgc3RydWN0dXJlLiAgKi8KKworc3RydWN0IHN0cmluZ3RhYmxlCit7CisgIC8qIEVhY2ggc3RyaW5ndGFibGUgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIDE2IHVuaWNvZGUgc3RyaW5ncy4gICovCisgIHN0cnVjdAorICB7CisgICAgLyogTGVuZ3RoIG9mIHN0cmluZy4gICovCisgICAgaW50IGxlbmd0aDsKKyAgICAvKiBTdHJpbmcgZGF0YSBpZiBsZW5ndGggPiAwLiAgKi8KKyAgICB1bmljaGFyICpzdHJpbmc7CisgIH0gc3RyaW5nc1sxNl07Cit9OworCisvKiBBIHZlcnNpb25pbmZvIHJlc291cmNlIHBvaW50cyB0byBhIHZlcnNpb25pbmZvIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCB2ZXJzaW9uaW5mbworeworICAvKiBGaXhlZCB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KKyAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXhlZDsKKyAgLyogVmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCB2ZXJfaW5mbyAqdmFyOworfTsKKworLyogVGhlIGZpeGVkIHBvcnRpb24gb2YgYSB2ZXJzaW9uaW5mbyByZXNvdXJjZS4gICovCisKK3N0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbworeworICAvKiBUaGUgZmlsZSB2ZXJzaW9uLCB3aGljaCBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmaWxlX3ZlcnNpb25fbXM7CisgIHVuc2lnbmVkIGxvbmcgZmlsZV92ZXJzaW9uX2xzOworICAvKiBUaGUgcHJvZHVjdCB2ZXJzaW9uLCB3aGljaCBpcyB0d28gMzIgYml0IGludGVnZXJzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBwcm9kdWN0X3ZlcnNpb25fbXM7CisgIHVuc2lnbmVkIGxvbmcgcHJvZHVjdF92ZXJzaW9uX2xzOworICAvKiBUaGUgZmlsZSBmbGFncyBtYXNrLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmaWxlX2ZsYWdzX21hc2s7CisgIC8qIFRoZSBmaWxlIGZsYWdzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmaWxlX2ZsYWdzOworICAvKiBUaGUgT1MgdHlwZS4gICovCisgIHVuc2lnbmVkIGxvbmcgZmlsZV9vczsKKyAgLyogVGhlIGZpbGUgdHlwZS4gICovCisgIHVuc2lnbmVkIGxvbmcgZmlsZV90eXBlOworICAvKiBUaGUgZmlsZSBzdWJ0eXBlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmaWxlX3N1YnR5cGU7CisgIC8qIFRoZSBkYXRlLCB3aGljaCBpbiBXaW5kb3dzIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLworICB1bnNpZ25lZCBsb25nIGZpbGVfZGF0ZV9tczsKKyAgdW5zaWduZWQgbG9uZyBmaWxlX2RhdGVfbHM7Cit9OworCisvKiBBIGxpc3Qgb2YgdmFyaWFibGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisKK3N0cnVjdCB2ZXJfaW5mbworeworICAvKiBOZXh0IGl0ZW0uICAqLworICBzdHJ1Y3QgdmVyX2luZm8gKm5leHQ7CisgIC8qIFR5cGUgb2YgZGF0YS4gICovCisgIGVudW0geyBWRVJJTkZPX1NUUklORywgVkVSSU5GT19WQVIgfSB0eXBlOworICB1bmlvbgorICB7CisgICAgLyogU3RyaW5nRmlsZUluZm8gZGF0YS4gICovCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogTGFuZ3VhZ2UuICAqLworICAgICAgdW5pY2hhciAqbGFuZ3VhZ2U7CisgICAgICAvKiBTdHJpbmdzLiAgKi8KKyAgICAgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqc3RyaW5nczsKKyAgICB9IHN0cmluZzsKKyAgICAvKiBWYXJGaWxlSW5mbyBkYXRhLiAgKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiBLZXkuICAqLworICAgICAgdW5pY2hhciAqa2V5OworICAgICAgLyogVmFsdWVzLiAgKi8KKyAgICAgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmFyOworICAgIH0gdmFyOworICB9IHU7Cit9OworCisvKiBBIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgdmVyX3N0cmluZ2luZm8KK3sKKyAgLyogTmV4dCBzdHJpbmcuICAqLworICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKm5leHQ7CisgIC8qIEtleS4gICovCisgIHVuaWNoYXIgKmtleTsKKyAgLyogVmFsdWUuICAqLworICB1bmljaGFyICp2YWx1ZTsKK307CisKKy8qIEEgbGlzdCBvZiB2YXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KKworc3RydWN0IHZlcl92YXJpbmZvCit7CisgIC8qIE5leHQgaXRlbS4gICovCisgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqbmV4dDsKKyAgLyogTGFuZ3VhZ2UgSUQuICAqLworICB1bnNpZ25lZCBzaG9ydCBsYW5ndWFnZTsKKyAgLyogQ2hhcmFjdGVyIHNldCBJRC4gICovCisgIHVuc2lnbmVkIHNob3J0IGNoYXJzZXQ7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdoZW4gY29udmVydGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiB0bworICAgYmluYXJ5LiAgKi8KKworc3RydWN0IGJpbmRhdGEKK3sKKyAgLyogTmV4dCBkYXRhLiAgKi8KKyAgc3RydWN0IGJpbmRhdGEgKm5leHQ7CisgIC8qIExlbmd0aCBvZiBkYXRhLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIC8qIERhdGEuICAqLworICB1bnNpZ25lZCBjaGFyICpkYXRhOworfTsKKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgKi8KKworZXh0ZXJuIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX3JjX2ZpbGUKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CitleHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfcmVzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfY29mZl9yc3JjCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCB3cml0ZV9yY19maWxlCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOworZXh0ZXJuIHZvaWQgd3JpdGVfcmVzX2ZpbGUKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7CitleHRlcm4gdm9pZCB3cml0ZV9jb2ZmX2ZpbGUKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKKworZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXMKKyAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKK2V4dGVybiBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2JpbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGludCkpOworCitleHRlcm4gRklMRSAqb3Blbl9maWxlX3NlYXJjaAorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqKSk7CisKK2V4dGVybiBQVFIgcmVzX2FsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworZXh0ZXJuIFBUUiByZXN3cl9hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKKworLyogUmVzb3VyY2UgSUQgaGFuZGxpbmcuICAqLworCitleHRlcm4gaW50IHJlc19pZF9jbXAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCkpOworZXh0ZXJuIHZvaWQgcmVzX2lkX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgc3RydWN0IHJlc19pZCwgaW50KSk7CitleHRlcm4gdm9pZCByZXNfaWRzX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKK2V4dGVybiB2b2lkIHJlc19zdHJpbmdfdG9faWQgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqLCBjb25zdCBjaGFyICopKTsKKworLyogTWFuaXB1bGF0aW9uIG9mIHRoZSByZXNvdXJjZSB0cmVlLiAgKi8KKworZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmRlZmluZV9yZXNvdXJjZQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOworZXh0ZXJuIHN0cnVjdCByZXNfcmVzb3VyY2UgKmRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgaW50LCBzdHJ1Y3QgcmVzX2lkLCBpbnQsIGludCkpOworCitleHRlcm4gaW50IGV4dGVuZGVkX2RpYWxvZyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZGlhbG9nICopKTsKK2V4dGVybiBpbnQgZXh0ZW5kZWRfbWVudSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudSAqKSk7CisKKy8qIENvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgcmMgZmlsZSBzdXBwb3J0IGFuZCB0aGUgcGFyc2VyIGFuZCBsZXhlci4gICovCisKK2V4dGVybiBpbnQgeXlkZWJ1ZzsKK2V4dGVybiBGSUxFICp5eWluOworZXh0ZXJuIGNoYXIgKnJjX2ZpbGVuYW1lOworZXh0ZXJuIGludCByY19saW5lbm87CitleHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgcmNwYXJzZV93YXJuaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgcmNwYXJzZV9zZXRfbGFuZ3VhZ2UgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCByY3BhcnNlX3JjZGF0YSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCByY3BhcnNlX25vcm1hbCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGRlZmluZV9hY2NlbGVyYXRvcgorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCBhY2NlbGVyYXRvciAqKSk7CitleHRlcm4gdm9pZCBkZWZpbmVfYml0bWFwCisgIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBkZWZpbmVfY3Vyc29yCisgIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBkZWZpbmVfZGlhbG9nCisgIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7CitleHRlcm4gc3RydWN0IGRpYWxvZ19jb250cm9sICpkZWZpbmVfY29udHJvbAorICBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwkgICB1bnNpZ25lZCBsb25nKSk7CitleHRlcm4gdm9pZCBkZWZpbmVfZm9udAorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgZGVmaW5lX2ljb24KKyAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIGRlZmluZV9tZW51CisgIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgc3RydWN0IG1lbnVpdGVtICopKTsKK2V4dGVybiBzdHJ1Y3QgbWVudWl0ZW0gKmRlZmluZV9tZW51aXRlbQorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwkgICBzdHJ1Y3QgbWVudWl0ZW0gKikpOworZXh0ZXJuIHZvaWQgZGVmaW5lX21lc3NhZ2V0YWJsZQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgZGVmaW5lX3JjZGF0YQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCByY2RhdGFfaXRlbSAqKSk7CitleHRlcm4gc3RydWN0IHJjZGF0YV9pdGVtICpkZWZpbmVfcmNkYXRhX3N0cmluZworICBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKK2V4dGVybiBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRlZmluZV9yY2RhdGFfbnVtYmVyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCkpOworZXh0ZXJuIHZvaWQgZGVmaW5lX3N0cmluZ3RhYmxlCisgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBkZWZpbmVfdXNlcl9kYXRhCisgIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwKKwkgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikpOworZXh0ZXJuIHZvaWQgZGVmaW5lX3VzZXJfZmlsZQorICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosCisJICAgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBkZWZpbmVfdmVyc2lvbmluZm8KKyAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgaW50LCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKiwKKwkgICBzdHJ1Y3QgdmVyX2luZm8gKikpOworZXh0ZXJuIHN0cnVjdCB2ZXJfaW5mbyAqYXBwZW5kX3Zlcl9zdHJpbmdmaWxlaW5mbworICBQQVJBTVMgKChzdHJ1Y3QgdmVyX2luZm8gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKikpOworZXh0ZXJuIHN0cnVjdCB2ZXJfaW5mbyAqYXBwZW5kX3Zlcl92YXJmaWxlaW5mbworICBQQVJBTVMgKChzdHJ1Y3QgdmVyX2luZm8gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKikpOworZXh0ZXJuIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqYXBwZW5kX3ZlcnZhbAorICBQQVJBTVMgKChzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiBzdHJ1Y3QgdmVyX3ZhcmluZm8gKmFwcGVuZF92ZXJ0cmFucworICBQQVJBTVMgKChzdHJ1Y3QgdmVyX3ZhcmluZm8gKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHVuaS5jIGIvYmludXRpbHMvd2luZHVuaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OWY0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9iaW51dGlscy93aW5kdW5pLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIHdpbmR1bmkuYyAtLSB1bmljb2RlIHN1cHBvcnQgZm9yIHRoZSB3aW5kcmVzIHByb2dyYW0uCisgICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB1bmljb2RlIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSB3aW5kcmVzCisgICBwcm9ncmFtLiAgSWRlYWxseSwgd2Ugd291bGQgaGF2ZSBnZW5lcmljIHVuaWNvZGUgc3VwcG9ydCB3aGljaAorICAgd291bGQgd29yayBvbiBhbGwgc3lzdGVtcy4gIEhvd2V2ZXIsIHdlIGRvbid0LiAgSW5zdGVhZCwgb24gYQorICAgV2luZG93cyBob3N0LCB3ZSBhcmUgcHJlcGFyZWQgdG8gY2FsbCBzb21lIFdpbmRvd3Mgcm91dGluZXMuICBUaGlzCisgICBtZWFucyB0aGF0IHdlIHdpbGwgZ2VuZXJhdGUgZGlmZmVyZW50IG91dHB1dCBvbiBXaW5kb3dzIGFuZCBVbml4CisgICBob3N0cywgYnV0IHRoYXQgc2VlbXMgYmV0dGVyIHRoYW4gbm90IHJlYWxseSBzdXBwb3J0aW5nIHVuaWNvZGUgYXQKKyAgIGFsbC4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJidWNvbW0uaCIKKyNpbmNsdWRlICJ3aW5kdW5pLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKy8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICBXZSBqdXN0IGNvcHkgaXQsCisgICBleHBhbmRpbmcgY2hhcnMgdG8gc2hvcnRzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuICAqLworCit2b2lkCit1bmljb2RlX2Zyb21fYXNjaWkgKGxlbmd0aCwgdW5pY29kZSwgYXNjaWkpCisgICAgIGludCAqbGVuZ3RoOworICAgICB1bmljaGFyICoqdW5pY29kZTsKKyAgICAgY29uc3QgY2hhciAqYXNjaWk7Cit7CisgIGludCBsZW47CisgIGNvbnN0IGNoYXIgKnM7CisgIHVuc2lnbmVkIHNob3J0ICp3OworCisgIGxlbiA9IHN0cmxlbiAoYXNjaWkpOworCisgIGlmIChsZW5ndGggIT0gTlVMTCkKKyAgICAqbGVuZ3RoID0gbGVuOworCisgICp1bmljb2RlID0gKCh1bmljaGFyICopIHJlc19hbGxvYyAoKGxlbiArIDEpICogc2l6ZW9mICh1bmljaGFyKSkpOworCisjaWZkZWYgX1dJTjMyCisgIC8qIEZJWE1FOiBPbiBXaW5kb3dzLCB3ZSBzaG91bGQgYmUgdXNpbmcgTXVsdGlCeXRlVG9XaWRlQ2hhciB0byBzZXQKKyAgICAgdGhlIGxlbmd0aC4gICovCisgIE11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX0FDUCwgMCwgYXNjaWksIGxlbiArIDEsICp1bmljb2RlLCBsZW4gKyAxKTsKKyNlbHNlCisgIGZvciAocyA9IGFzY2lpLCB3ID0gKnVuaWNvZGU7ICpzICE9ICdcMCc7IHMrKywgdysrKQorICAgICp3ID0gKnMgJiAweGZmOworICAqdyA9IDA7CisjZW5kaWYKK30KKworLyogUHJpbnQgdGhlIHVuaWNvZGUgc3RyaW5nIFVOSUNPREUgdG8gdGhlIGZpbGUgRS4gIExFTkdUSCBpcyB0aGUKKyAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50LCBvciAtMSBpZiB3ZSBzaG91bGQgcHJpbnQgdW50aWwgdGhlCisgICBlbmQgb2YgdGhlIHN0cmluZy4gIEZJWE1FOiBPbiBhIFdpbmRvd3MgaG9zdCwgd2Ugc2hvdWxkIGJlIGNhbGxpbmcKKyAgIHNvbWUgV2luZG93cyBmdW5jdGlvbiwgcHJvYmFibHkgV2lkZUNoYXJUb011bHRpQnl0ZS4gICovCisKK3ZvaWQKK3VuaWNvZGVfcHJpbnQgKGUsIHVuaWNvZGUsIGxlbmd0aCkKKyAgICAgRklMRSAqZTsKKyAgICAgY29uc3QgdW5pY2hhciAqdW5pY29kZTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgdW5pY2hhciBjaDsKKworICAgICAgaWYgKGxlbmd0aCA9PSAwKQorCXJldHVybjsKKyAgICAgIGlmIChsZW5ndGggPiAwKQorCS0tbGVuZ3RoOworCisgICAgICBjaCA9ICp1bmljb2RlOworCisgICAgICBpZiAoY2ggPT0gMCAmJiBsZW5ndGggPCAwKQorCXJldHVybjsKKworICAgICAgKyt1bmljb2RlOworCisgICAgICBpZiAoKGNoICYgMHg3ZikgPT0gY2gpCisJeworCSAgaWYgKGNoID09ICdcXCcpCisJICAgIGZwdXRzICgiXFwiLCBlKTsKKwkgIGVsc2UgaWYgKGlzcHJpbnQgKGNoKSkKKwkgICAgcHV0YyAoY2gsIGUpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3dpdGNoIChjaCkKKwkJeworCQljYXNlIEVTQ0FQRV9BOgorCQkgIGZwdXRzICgiXFxhIiwgZSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBFU0NBUEVfQjoKKwkJICBmcHV0cyAoIlxcYiIsIGUpOworCQkgIGJyZWFrOworCisJCWNhc2UgRVNDQVBFX0Y6CisJCSAgZnB1dHMgKCJcXGYiLCBlKTsKKwkJICBicmVhazsKKworCQljYXNlIEVTQ0FQRV9OOgorCQkgIGZwdXRzICgiXFxuIiwgZSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBFU0NBUEVfUjoKKwkJICBmcHV0cyAoIlxcciIsIGUpOworCQkgIGJyZWFrOworCisJCWNhc2UgRVNDQVBFX1Q6CisJCSAgZnB1dHMgKCJcXHQiLCBlKTsKKwkJICBicmVhazsKKworCQljYXNlIEVTQ0FQRV9WOgorCQkgIGZwdXRzICgiXFx2IiwgZSk7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgoY2ggJiAweGZmKSA9PSBjaCkKKwlmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOworICAgICAgZWxzZQorCWZwcmludGYgKGUsICJcXHgleCIsICh1bnNpZ25lZCBpbnQpIGNoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iaW51dGlscy93aW5kdW5pLmggYi9iaW51dGlscy93aW5kdW5pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhOWFmMgotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3dpbmR1bmkuaApAQCAtMCwwICsxLDYwIEBACisvKiB3aW5kdW5pLmggLS0gaGVhZGVyIGZpbGUgZm9yIHVuaWNvZGUgc3VwcG9ydCBmb3Igd2luZHJlcyBwcm9ncmFtLgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKworLyogVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgdHlwZXMgYW5kIGZ1bmN0aW9ucyB3ZSB1c2UgZm9yCisgICB1bmljb2RlIHN1cHBvcnQgaW4gd2luZHJlcy4gIE91ciB1bmljb2RlIHN1cHBvcnQgaXMgdmVyeSBsaW1pdGVkIGF0CisgICBwcmVzZW50LgorCisgICBXZSBkb24ndCBwdXQgdGhpcyBzdHVmZiBpbiB3aW5kcmVzLmggc28gdGhhdCB3aW5kdW5pLmMgZG9lc24ndCBoYXZlCisgICB0byBpbmNsdWRlIHdpbmRyZXMuaC4gIHdpbmR1bmkuYyBuZWVkcyB0byBpbmNsdWRlcyB3aW5kb3dzLmgsIGFuZAorICAgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSBkZWZpbml0aW9ucyBvZiBXaW5kb3dzIG1hY3JvcyB3ZQorICAgYWxyZWFkeSBoYXZlIGluIHdpbmRyZXMuaC4gICovCisKKy8qIFdlIHVzZSB0aGlzIHR5cGUgdG8gaG9sZCBhIHVuaWNvZGUgY2hhcmFjdGVyLiAgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bmljaGFyOworCisvKiBFc2NhcGUgY2hhcmFjdGVyIHRyYW5zbGF0aW9ucy4gICovCisKKyNkZWZpbmUgRVNDQVBFX0EgKDAwNykKKyNkZWZpbmUgRVNDQVBFX0IgKDAxMCkKKyNkZWZpbmUgRVNDQVBFX0YgKDAxNCkKKyNkZWZpbmUgRVNDQVBFX04gKDAxMikKKyNkZWZpbmUgRVNDQVBFX1IgKDAxNSkKKyNkZWZpbmUgRVNDQVBFX1QgKDAxMSkKKyNkZWZpbmUgRVNDQVBFX1YgKDAxMykKKworLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gICovCisKK2V4dGVybiB2b2lkIHVuaWNvZGVfZnJvbV9hc2NpaQorICBQQVJBTVMgKChpbnQgKiwgdW5pY2hhciAqKiwgY29uc3QgY2hhciAqKSk7CisKKy8qIFByaW50IGEgdW5pY29kZSBzdHJpbmcgdG8gYSBmaWxlLiAgKi8KKworZXh0ZXJuIHZvaWQgdW5pY29kZV9wcmludCBQQVJBTVMgKChGSUxFICosIGNvbnN0IHVuaWNoYXIgKiwgaW50KSk7CisKKy8qIFdpbmRyZXMgc3VwcG9ydCByb3V0aW5lIGNhbGxlZCBieSB1bmljb2RlX2Zyb21fYXNjaWkuICBUaGlzIGlzIGJvdGgKKyAgIGhlcmUgYW5kIGluIHdpbmRyZXMuaC4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIGhlYWRlcgorICAgZmlsZSwgYnV0IGl0IGhhcmRseSBzZWVtcyB3b3J0aCBpdCBmb3Igb25lIGZ1bmN0aW9uLiAgKi8KKworZXh0ZXJuIFBUUiByZXNfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy93cnN0YWJzLmMgYi9iaW51dGlscy93cnN0YWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyODE3NAotLS0gL2Rldi9udWxsCisrKyBiL2JpbnV0aWxzL3dyc3RhYnMuYwpAQCAtMCwwICsxLDI0MTYgQEAKKy8qIHdyc3RhYnMuYyAtLSBPdXRwdXQgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggd3JpdGVzIG91dCBzdGFicyBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImJ1Y29tbS5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYnVkYmcuaCIKKworLyogTWVhbmluZ2xlc3MgZGVmaW5pdGlvbiBuZWVkcyBieSBhb3V0NjQuaC4gIEZJWE1FLiAgKi8KKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CisKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKworLyogVGhlIHNpemUgb2YgYSBzdGFicyBzeW1ib2wuICBUaGlzIHByZXN1bWVzIDMyIGJpdCB2YWx1ZXMuICAqLworCisjZGVmaW5lIFNUQUJfU1lNQk9MX1NJWkUgKDEyKQorCisvKiBBbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KKworc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworICAvKiBOZXh0IHN0cmluZyBpbiB0aGlzIHRhYmxlLiAgKi8KKyAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpuZXh0OworICAvKiBJbmRleCBpbiBzdHJpbmcgdGFibGUuICAqLworICBsb25nIGluZGV4OworICAvKiBTaXplIG9mIHR5cGUgaWYgdGhpcyBpcyBhIHR5cGVkZWYuICAqLworICB1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKy8qIEEgc3RyaW5nIGhhc2ggdGFibGUuICAqLworCitzdHJ1Y3Qgc3RyaW5nX2hhc2hfdGFibGUKK3sKKyAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOworfTsKKworLyogVGhlIHR5cGUgc3RhY2suICBFYWNoIGVsZW1lbnQgb24gdGhlIHN0YWNrIGlzIGEgc3RyaW5nLiAgKi8KKworc3RydWN0IHN0YWJfdHlwZV9zdGFjaworeworICAvKiBUaGUgbmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjay4gICovCisgIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKm5leHQ7CisgIC8qIFRoaXMgZWxlbWVudCBhcyBhIHN0cmluZy4gICovCisgIGNoYXIgKnN0cmluZzsKKyAgLyogVGhlIHR5cGUgaW5kZXggb2YgdGhpcyBlbGVtZW50LiAgKi8KKyAgbG9uZyBpbmRleDsKKyAgLyogVGhlIHNpemUgb2YgdGhlIHR5cGUuICAqLworICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgLyogV2hldGhlciB0eXBlIHN0cmluZyBkZWZpbmVzIGEgbmV3IHR5cGUuICAqLworICBib29sZWFuIGRlZmluaXRpb247CisgIC8qIFN0cmluZyBkZWZpbmluZyBzdHJ1Y3QgZmllbGRzLiAgKi8KKyAgY2hhciAqZmllbGRzOworICAvKiBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncyBkZWZpbmluZyBiYXNlIGNsYXNzZXMgZm9yIGEKKyAgICAgY2xhc3MuICAqLworICBjaGFyICoqYmFzZWNsYXNzZXM7CisgIC8qIFN0cmluZyBkZWZpbmluZyBjbGFzcyBtZXRob2RzLiAgKi8KKyAgY2hhciAqbWV0aG9kczsKKyAgLyogU3RyaW5nIGRlZmluaW5nIHZ0YWJsZSBwb2ludGVyIGZvciBhIGNsYXNzLiAgKi8KKyAgY2hhciAqdnRhYmxlOworfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHR5cGUgaW5kaWNlcyBmb3IgdGFnZ2VkCisgICB0eXBlcy4gICovCisKK3N0cnVjdCBzdGFiX3RhZworeworICAvKiBUaGUgdHlwZSBpbmRleC4gICovCisgIGxvbmcgaW5kZXg7CisgIC8qIFRoZSB0YWcgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKnRhZzsKKyAgLyogVGhlIGtpbmQgb2YgdHlwZS4gIFRoaXMgaXMgc2V0IHRvIERFQlVHX0tJTkRfSUxMRUdBTCB3aGVuIHRoZQorICAgICB0eXBlIGlzIGRlZmluZWQuICAqLworICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOworICAvKiBUaGUgc2l6ZSBvZiB0aGUgc3RydWN0LiAgKi8KKyAgdW5zaWduZWQgaW50IHNpemU7Cit9OworCisvKiBXZSByZW1lbWJlciB2YXJpb3VzIHNvcnRzIG9mIHR5cGUgaW5kaWNlcy4gIFRoZXkgYXJlIG5vdCByZWxhdGVkLAorICAgYnV0LCBmb3IgY29udmVuaWVuY2UsIHdlIGtlZXAgYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzCisgICBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3Qgc3RhYl90eXBlX2NhY2hlCit7CisgIC8qIFRoZSB2b2lkIHR5cGUgaW5kZXguICAqLworICBsb25nIHZvaWRfdHlwZTsKKyAgLyogU2lnbmVkIGludGVnZXIgdHlwZSBpbmRpY2VzLCBpbmRleGVkIGJ5IHNpemUgLSAxLiAgKi8KKyAgbG9uZyBzaWduZWRfaW50ZWdlcl90eXBlc1s4XTsKKyAgLyogVW5zaWduZWQgaW50ZWdlciB0eXBlIGluZGljZXMsIGluZGV4ZWQgYnkgc2l6ZSAtIDEuICAqLworICBsb25nIHVuc2lnbmVkX2ludGVnZXJfdHlwZXNbOF07CisgIC8qIEZsb2F0aW5nIHBvaW50IHR5cGVzLCBpbmRleGVkIGJ5IHNpemUgLSAxLiAgKi8KKyAgbG9uZyBmbG9hdF90eXBlc1sxNl07CisgIC8qIFBvaW50ZXJzIHRvIHR5cGVzLCBpbmRleGVkIGJ5IHRoZSB0eXBlIGluZGV4LiAgKi8KKyAgbG9uZyAqcG9pbnRlcl90eXBlczsKKyAgc2l6ZV90IHBvaW50ZXJfdHlwZXNfYWxsb2M7CisgIC8qIEZ1bmN0aW9ucyByZXR1cm5pbmcgdHlwZXMsIGluZGV4ZWQgYnkgdGhlIHR5cGUgaW5kZXguICAqLworICBsb25nICpmdW5jdGlvbl90eXBlczsKKyAgc2l6ZV90IGZ1bmN0aW9uX3R5cGVzX2FsbG9jOworICAvKiBSZWZlcmVuY2VzIHRvIHR5cGVzLCBpbmRleGVkIGJ5IHRoZSB0eXBlIGluZGV4LiAgKi8KKyAgbG9uZyAqcmVmZXJlbmNlX3R5cGVzOworICBzaXplX3QgcmVmZXJlbmNlX3R5cGVzX2FsbG9jOworICAvKiBTdHJ1Y3QvdW5pb24vY2xhc3MgdHlwZSBpbmRpY2VzLCBpbmRleGVkIGJ5IHRoZSBzdHJ1Y3QgaWQuICAqLworICBzdHJ1Y3Qgc3RhYl90YWcgKnN0cnVjdF90eXBlczsKKyAgc2l6ZV90IHN0cnVjdF90eXBlc19hbGxvYzsKK307CisKKy8qIFRoaXMgaXMgdGhlIGhhbmRsZSBwYXNzZWQgdGhyb3VnaCBkZWJ1Z193cml0ZS4gICovCisKK3N0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZQoreworICAvKiBUaGUgQkZELiAgKi8KKyAgYmZkICphYmZkOworICAvKiBUaGlzIGJ1ZmZlciBob2xkcyB0aGUgc3ltYm9scy4gICovCisgIGJmZF9ieXRlICpzeW1ib2xzOworICBzaXplX3Qgc3ltYm9sc19zaXplOworICBzaXplX3Qgc3ltYm9sc19hbGxvYzsKKyAgLyogVGhpcyBpcyBhIGxpc3Qgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIGZvciB0aGUgc3RyaW5ncy4gICovCisgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3RyaW5nczsKKyAgLyogVGhlIGxhc3Qgc3RyaW5nIGhhc2ggdGFibGUgZW50cnkuICAqLworICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmxhc3Rfc3RyaW5nOworICAvKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaW5ncy4gICovCisgIHNpemVfdCBzdHJpbmdzX3NpemU7CisgIC8qIFRoaXMgaGFzaCB0YWJsZSBlbGltaW5hdGVzIGR1cGxpY2F0ZSBzdHJpbmdzLiAgKi8KKyAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHN0cmhhc2g7CisgIC8qIFRoZSB0eXBlIHN0YWNrLiAgKi8KKyAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqdHlwZV9zdGFjazsKKyAgLyogVGhlIG5leHQgdHlwZSBpbmRleC4gICovCisgIGxvbmcgdHlwZV9pbmRleDsKKyAgLyogVGhlIHR5cGUgY2FjaGUuICAqLworICBzdHJ1Y3Qgc3RhYl90eXBlX2NhY2hlIHR5cGVfY2FjaGU7CisgIC8qIEEgbWFwcGluZyBmcm9tIHR5cGVkZWYgbmFtZXMgdG8gdHlwZSBpbmRpY2VzLiAgKi8KKyAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHR5cGVkZWZfaGFzaDsKKyAgLyogSWYgdGhpcyBpcyBub3QgLTEsIGl0IGlzIHRoZSBvZmZzZXQgdG8gdGhlIG1vc3QgcmVjZW50IE5fU08KKyAgICAgc3ltYm9sLCBhbmQgdGhlIHZhbHVlIG9mIHRoYXQgc3ltYm9sIG5lZWRzIHRvIGJlIHNldC4gICovCisgIGxvbmcgc29fb2Zmc2V0OworICAvKiBJZiB0aGlzIGlzIG5vdCAtMSwgaXQgaXMgdGhlIG9mZnNldCB0byB0aGUgbW9zdCByZWNlbnQgTl9GVU4KKyAgICAgc3ltYm9sLCBhbmQgdGhlIHZhbHVlIG9mIHRoYXQgc3ltYm9sIG5lZWRzIHRvIGJlIHNldC4gICovCisgIGxvbmcgZnVuX29mZnNldDsKKyAgLyogVGhlIGxhc3QgdGV4dCBzZWN0aW9uIGFkZHJlc3Mgc2Vlbi4gICovCisgIGJmZF92bWEgbGFzdF90ZXh0X2FkZHJlc3M7CisgIC8qIFRoZSBibG9jayBuZXN0aW5nIGRlcHRoLiAgKi8KKyAgdW5zaWduZWQgaW50IG5lc3Rpbmc7CisgIC8qIFRoZSBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KKyAgYmZkX3ZtYSBmbmFkZHI7CisgIC8qIEEgcGVuZGluZyBMQlJBQyBzeW1ib2wuICAqLworICBiZmRfdm1hIHBlbmRpbmdfbGJyYWM7CisgIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZpbGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKmxpbmVub19maWxlbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cmluZ19oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfd3JpdGVfc3ltYm9sCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3B1c2hfc3RyaW5nCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGxvbmcsIGJvb2xlYW4sCisJICAgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBjaGFyICpzdGFiX3BvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX21vZGlmeV90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBpbnQsIHVuc2lnbmVkIGludCwgbG9uZyAqKiwgc2l6ZV90ICopKTsKK3N0YXRpYyBsb25nIHN0YWJfZ2V0X3N0cnVjdF9pbmRleAorICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJICAgZW51bSBkZWJ1Z190eXBlX2tpbmQsIHVuc2lnbmVkIGludCAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX21ldGhvZF92YXIKKyAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAorCSAgIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4sIGJmZF92bWEsIGJvb2xlYW4pKTsKKworc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9lbXB0eV90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2ludF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2Zsb2F0X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2Jvb2xfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOworc3RhdGljIGJvb2xlYW4gc3RhYl9lbnVtX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJmZF9zaWduZWRfdm1hICopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9mdW5jdGlvbl90eXBlIFBBUkFNUyAoKFBUUiwgaW50LCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2FycmF5X3R5cGUKKyAgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEsIGJvb2xlYW4pKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfc2V0X3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9tZXRob2RfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGludCwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9jb25zdF90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZQorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfc3RydWN0X2ZpZWxkCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hLCBiZmRfdm1hLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9jbGFzc190eXBlCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKKwkgICBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX3N0YXRpY19tZW1iZXIKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX2Jhc2VjbGFzcworICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOworc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19zdGFydF9tZXRob2QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbiwKKwkgICBiZmRfdm1hLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX2VuZF9tZXRob2QgUEFSQU1TICgoUFRSKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9jbGFzc190eXBlIFBBUkFNUyAoKFBUUikpOworc3RhdGljIGJvb2xlYW4gc3RhYl90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfdGFnX3R5cGUKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfdHlwZGVmIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9pbnRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfZmxvYXRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOworc3RhdGljIGJvb2xlYW4gc3RhYl90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gc3RhYl92YXJpYWJsZQorICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192YXJfa2luZCwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9mdW5jdGlvbiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworc3RhdGljIGJvb2xlYW4gc3RhYl9mdW5jdGlvbl9wYXJhbWV0ZXIKKyAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX3N0YXJ0X2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyBib29sZWFuIHN0YWJfbGluZW5vCisgIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zIHN0YWJfZm5zID0KK3sKKyAgc3RhYl9zdGFydF9jb21waWxhdGlvbl91bml0LAorICBzdGFiX3N0YXJ0X3NvdXJjZSwKKyAgc3RhYl9lbXB0eV90eXBlLAorICBzdGFiX3ZvaWRfdHlwZSwKKyAgc3RhYl9pbnRfdHlwZSwKKyAgc3RhYl9mbG9hdF90eXBlLAorICBzdGFiX2NvbXBsZXhfdHlwZSwKKyAgc3RhYl9ib29sX3R5cGUsCisgIHN0YWJfZW51bV90eXBlLAorICBzdGFiX3BvaW50ZXJfdHlwZSwKKyAgc3RhYl9mdW5jdGlvbl90eXBlLAorICBzdGFiX3JlZmVyZW5jZV90eXBlLAorICBzdGFiX3JhbmdlX3R5cGUsCisgIHN0YWJfYXJyYXlfdHlwZSwKKyAgc3RhYl9zZXRfdHlwZSwKKyAgc3RhYl9vZmZzZXRfdHlwZSwKKyAgc3RhYl9tZXRob2RfdHlwZSwKKyAgc3RhYl9jb25zdF90eXBlLAorICBzdGFiX3ZvbGF0aWxlX3R5cGUsCisgIHN0YWJfc3RhcnRfc3RydWN0X3R5cGUsCisgIHN0YWJfc3RydWN0X2ZpZWxkLAorICBzdGFiX2VuZF9zdHJ1Y3RfdHlwZSwKKyAgc3RhYl9zdGFydF9jbGFzc190eXBlLAorICBzdGFiX2NsYXNzX3N0YXRpY19tZW1iZXIsCisgIHN0YWJfY2xhc3NfYmFzZWNsYXNzLAorICBzdGFiX2NsYXNzX3N0YXJ0X21ldGhvZCwKKyAgc3RhYl9jbGFzc19tZXRob2RfdmFyaWFudCwKKyAgc3RhYl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCisgIHN0YWJfY2xhc3NfZW5kX21ldGhvZCwKKyAgc3RhYl9lbmRfY2xhc3NfdHlwZSwKKyAgc3RhYl90eXBlZGVmX3R5cGUsCisgIHN0YWJfdGFnX3R5cGUsCisgIHN0YWJfdHlwZGVmLAorICBzdGFiX3RhZywKKyAgc3RhYl9pbnRfY29uc3RhbnQsCisgIHN0YWJfZmxvYXRfY29uc3RhbnQsCisgIHN0YWJfdHlwZWRfY29uc3RhbnQsCisgIHN0YWJfdmFyaWFibGUsCisgIHN0YWJfc3RhcnRfZnVuY3Rpb24sCisgIHN0YWJfZnVuY3Rpb25fcGFyYW1ldGVyLAorICBzdGFiX3N0YXJ0X2Jsb2NrLAorICBzdGFiX2VuZF9ibG9jaywKKyAgc3RhYl9lbmRfZnVuY3Rpb24sCisgIHN0YWJfbGluZW5vCit9OworDAorLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorc3RyaW5nX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7CisgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQorCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KKyAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKKwkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKKworICBpZiAocmV0KQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCisgICAgICByZXQtPm5leHQgPSBOVUxMOworICAgICAgcmV0LT5pbmRleCA9IC0xOworICAgICAgcmV0LT5zaXplID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OworfQorCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLworCisjZGVmaW5lIHN0cmluZ19oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAorICAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBcCisgICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCisKKy8qIEFkZCBhIHN5bWJvbCB0byB0aGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdlIGFyZSBidWlsZGluZy4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKKyAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOworICAgICBpbnQgdHlwZTsKKyAgICAgaW50IGRlc2M7CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgYmZkX3NpemVfdHlwZSBzdHJ4OworICBiZmRfYnl0ZSBzeW1bU1RBQl9TWU1CT0xfU0laRV07CisKKyAgaWYgKHN0cmluZyA9PSBOVUxMKQorICAgIHN0cnggPSAwOworICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOworCisgICAgICBoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmaW5mby0+c3RyaGFzaCwgc3RyaW5nLCB0cnVlLCB0cnVlKTsKKyAgICAgIGlmIChoID09IE5VTEwpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIiksCisJCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICBpZiAoaC0+aW5kZXggIT0gLTEpCisJc3RyeCA9IGgtPmluZGV4OworICAgICAgZWxzZQorCXsKKwkgIHN0cnggPSBpbmZvLT5zdHJpbmdzX3NpemU7CisJICBoLT5pbmRleCA9IHN0cng7CisJICBpZiAoaW5mby0+bGFzdF9zdHJpbmcgPT0gTlVMTCkKKwkgICAgaW5mby0+c3RyaW5ncyA9IGg7CisJICBlbHNlCisJICAgIGluZm8tPmxhc3Rfc3RyaW5nLT5uZXh0ID0gaDsKKwkgIGluZm8tPmxhc3Rfc3RyaW5nID0gaDsKKwkgIGluZm8tPnN0cmluZ3Nfc2l6ZSArPSBzdHJsZW4gKHN0cmluZykgKyAxOworCX0KKyAgICB9CisKKyAgLyogVGhpcyBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KKyAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgc3RyeCwgc3ltKTsKKyAgYmZkX3B1dF84IChpbmZvLT5hYmZkLCB0eXBlLCBzeW0gKyA0KTsKKyAgYmZkX3B1dF84IChpbmZvLT5hYmZkLCAwLCBzeW0gKyA1KTsKKyAgYmZkX3B1dF8xNiAoaW5mby0+YWJmZCwgZGVzYywgc3ltICsgNik7CisgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIHZhbHVlLCBzeW0gKyA4KTsKKworICBpZiAoaW5mby0+c3ltYm9sc19zaXplICsgU1RBQl9TWU1CT0xfU0laRSA+IGluZm8tPnN5bWJvbHNfYWxsb2MpCisgICAgeworICAgICAgaW5mby0+c3ltYm9sc19hbGxvYyAqPSAyOworICAgICAgaW5mby0+c3ltYm9scyA9IChiZmRfYnl0ZSAqKSB4cmVhbGxvYyAoaW5mby0+c3ltYm9scywKKwkJCQkJICAgICBpbmZvLT5zeW1ib2xzX2FsbG9jKTsKKyAgICB9CisKKyAgbWVtY3B5IChpbmZvLT5zeW1ib2xzICsgaW5mby0+c3ltYm9sc19zaXplLCBzeW0sIFNUQUJfU1lNQk9MX1NJWkUpOworCisgIGluZm8tPnN5bWJvbHNfc2l6ZSArPSBTVEFCX1NZTUJPTF9TSVpFOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQdXNoIGEgc3RyaW5nIG9uIHRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfcHVzaF9zdHJpbmcgKGluZm8sIHN0cmluZywgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpCisgICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgICBsb25nIGluZGV4OworICAgICBib29sZWFuIGRlZmluaXRpb247CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICpzOworCisgIHMgPSAoc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKnMpOworICBzLT5zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOworICBzLT5pbmRleCA9IGluZGV4OworICBzLT5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKKyAgcy0+c2l6ZSA9IHNpemU7CisKKyAgcy0+ZmllbGRzID0gTlVMTDsKKyAgcy0+YmFzZWNsYXNzZXMgPSBOVUxMOworICBzLT5tZXRob2RzID0gTlVMTDsKKyAgcy0+dnRhYmxlID0gTlVMTDsKKworICBzLT5uZXh0ID0gaW5mby0+dHlwZV9zdGFjazsKKyAgaW5mby0+dHlwZV9zdGFjayA9IHM7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFB1c2ggYSB0eXBlIGluZGV4IHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSkKKyAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOworICAgICBsb25nIGluZGV4OworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgY2hhciBidWZbMjBdOworCisgIHNwcmludGYgKGJ1ZiwgIiVsZCIsIGluZGV4KTsKKyAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGZhbHNlLCBzaXplKTsKK30KKworLyogUG9wIGEgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2suICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgZnJlZWluZyB0aGUgc3RyaW5nLiAgKi8KKworc3RhdGljIGNoYXIgKgorc3RhYl9wb3BfdHlwZSAoaW5mbykKKyAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOworeworICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICpzOworICBjaGFyICpyZXQ7CisKKyAgcyA9IGluZm8tPnR5cGVfc3RhY2s7CisgIGFzc2VydCAocyAhPSBOVUxMKTsKKworICBpbmZvLT50eXBlX3N0YWNrID0gcy0+bmV4dDsKKworICByZXQgPSBzLT5zdHJpbmc7CisKKyAgZnJlZSAocyk7CisKKyAgcmV0dXJuIHJldDsKK30KKwwKKy8qIFRoZSBnZW5lcmFsIHJvdXRpbmUgdG8gd3JpdGUgb3V0IHN0YWJzIGluIHNlY3Rpb25zIGRlYnVnZ2luZworICAgaW5mb3JtYXRpb24uICBUaGlzIGFjY3VtdWxhdGVzIHRoZSBzdGFicyBzeW1ib2xzIGFuZCB0aGUgc3RyaW5ncyBpbgorICAgdHdvIG9ic3RhY2tzLiAgV2UgY2FuJ3QgZWFzaWx5IHdyaXRlIG91dCB0aGUgaW5mb3JtYXRpb24gYXMgd2UgZ28KKyAgIGFsb25nLCBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB0aGUgc2VjdGlvbiBzaXplcyBiZWZvcmUgd2UgY2FuCisgICB3cml0ZSBvdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICBBQkZEIGlzIHRoZSBCRkQgYW5kIERIQU5ETEUgaXMgdGhlCisgICBoYW5kbGUgZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHNldHMgKlBTWU1TIHRvIHBvaW50IHRvCisgICB0aGUgc3ltYm9scywgKlBTWU1TSVpFIHRoZSBzaXplIG9mIHRoZSBzeW1ib2xzLCAqUFNUUklOR1MgdG8gdGhlCisgICBzdHJpbmdzLCBhbmQgKlBTVFJJTkdTSVpFIHRvIHRoZSBzaXplIG9mIHRoZSBzdHJpbmdzLiAgKi8KKworYm9vbGVhbgord3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsIHBzeW1zLCBwc3ltc2l6ZSwKKwkJCQkJcHN0cmluZ3MsIHBzdHJpbmdzaXplKQorICAgICBiZmQgKmFiZmQ7CisgICAgIFBUUiBkaGFuZGxlOworICAgICBiZmRfYnl0ZSAqKnBzeW1zOworICAgICBiZmRfc2l6ZV90eXBlICpwc3ltc2l6ZTsKKyAgICAgYmZkX2J5dGUgKipwc3RyaW5nczsKKyAgICAgYmZkX3NpemVfdHlwZSAqcHN0cmluZ3NpemU7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSBpbmZvOworICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmg7CisgIGJmZF9ieXRlICpwOworCisgIGluZm8uYWJmZCA9IGFiZmQ7CisKKyAgaW5mby5zeW1ib2xzX3NpemUgPSAwOworICBpbmZvLnN5bWJvbHNfYWxsb2MgPSA1MDA7CisgIGluZm8uc3ltYm9scyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChpbmZvLnN5bWJvbHNfYWxsb2MpOworCisgIGluZm8uc3RyaW5ncyA9IE5VTEw7CisgIGluZm8ubGFzdF9zdHJpbmcgPSBOVUxMOworICAvKiBSZXNlcnZlIDEgYnl0ZSBmb3IgYSBudWxsIGJ5dGUuICAqLworICBpbmZvLnN0cmluZ3Nfc2l6ZSA9IDE7CisKKyAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8uc3RyaGFzaC50YWJsZSwgc3RyaW5nX2hhc2hfbmV3ZnVuYykKKyAgICAgIHx8ICEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udHlwZWRlZl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJiZmRfaGFzaF90YWJsZV9pbml0X2ZhaWxlZDogJXNcbiIsCisJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaW5mby50eXBlX3N0YWNrID0gTlVMTDsKKyAgaW5mby50eXBlX2luZGV4ID0gMTsKKyAgbWVtc2V0ICgmaW5mby50eXBlX2NhY2hlLCAwLCBzaXplb2YgaW5mby50eXBlX2NhY2hlKTsKKyAgaW5mby5zb19vZmZzZXQgPSAtMTsKKyAgaW5mby5mdW5fb2Zmc2V0ID0gLTE7CisgIGluZm8ubGFzdF90ZXh0X2FkZHJlc3MgPSAwOworICBpbmZvLm5lc3RpbmcgPSAwOworICBpbmZvLmZuYWRkciA9IDA7CisgIGluZm8ucGVuZGluZ19sYnJhYyA9IChiZmRfdm1hKSAtMTsKKworICAvKiBUaGUgaW5pdGlhbCBzeW1ib2wgaG9sZHMgdGhlIHN0cmluZyBzaXplLiAgKi8KKyAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKCZpbmZvLCAwLCAwLCAwLCAoY29uc3QgY2hhciAqKSBOVUxMKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogT3V0cHV0IGFuIGluaXRpYWwgTl9TTyBzeW1ib2wuICAqLworICBpbmZvLnNvX29mZnNldCA9IGluZm8uc3ltYm9sc19zaXplOworICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoJmluZm8sIE5fU08sIDAsIDAsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCEgZGVidWdfd3JpdGUgKGRoYW5kbGUsICZzdGFiX2ZucywgKFBUUikgJmluZm8pKQorICAgIHJldHVybiBmYWxzZTsKKworICBhc3NlcnQgKGluZm8ucGVuZGluZ19sYnJhYyA9PSAoYmZkX3ZtYSkgLTEpOworCisgIC8qIE91dHB1dCBhIHRyYWlsaW5nIE5fU08uICAqLworICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoJmluZm8sIE5fU08sIDAsIGluZm8ubGFzdF90ZXh0X2FkZHJlc3MsCisJCQkgICAoY29uc3QgY2hhciAqKSBOVUxMKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogUHV0IHRoZSBzdHJpbmcgc2l6ZSBpbiB0aGUgaW5pdGlhbCBzeW1ib2wuICAqLworICBiZmRfcHV0XzMyIChhYmZkLCBpbmZvLnN0cmluZ3Nfc2l6ZSwgaW5mby5zeW1ib2xzICsgOCk7CisKKyAgKnBzeW1zID0gaW5mby5zeW1ib2xzOworICAqcHN5bXNpemUgPSBpbmZvLnN5bWJvbHNfc2l6ZTsKKworICAqcHN0cmluZ3NpemUgPSBpbmZvLnN0cmluZ3Nfc2l6ZTsKKyAgKnBzdHJpbmdzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKGluZm8uc3RyaW5nc19zaXplKTsKKworICBwID0gKnBzdHJpbmdzOworICAqcCsrID0gJ1wwJzsKKyAgZm9yIChoID0gaW5mby5zdHJpbmdzOyBoICE9IE5VTEw7IGggPSBoLT5uZXh0KQorICAgIHsKKyAgICAgIHN0cmNweSAoKGNoYXIgKikgcCwgaC0+cm9vdC5zdHJpbmcpOworICAgICAgcCArPSBzdHJsZW4gKChjaGFyICopIHApICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisKKyAgLyogV2Ugd291bGQgbm9ybWFsbHkgb3V0cHV0IGFuIE5fU08gc3ltYm9sIGhlcmUuICBIb3dldmVyLCB0aGF0CisgICAgIHdvdWxkIGZvcmNlIHVzIHRvIHJlc2V0IGFsbCBvZiBvdXIgdHlwZSBpbmZvcm1hdGlvbi4gIEkgdGhpbmsgd2UKKyAgICAgd2lsbCBiZSBiZXR0ZXIgb2ZmIGp1c3Qgb3V0cHV0dGluZyBhbiBOX1NPTCBzeW1ib2wsIGFuZCBub3QKKyAgICAgd29ycnlpbmcgYWJvdXQgc3BsaXR0aW5nIGluZm9ybWF0aW9uIGJldHdlZW4gZmlsZXMuICAqLworCisgIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGZpbGVuYW1lOworCisgIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TT0wsIDAsIDAsIGZpbGVuYW1lKTsKK30KKworLyogU3RhcnQgd3JpdGluZyBvdXQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBzb3VyY2UgZmlsZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3N0YXJ0X3NvdXJjZSAocCwgZmlsZW5hbWUpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworCisgIC8qIEZJWE1FOiBUaGUgc3ltYm9sJ3MgdmFsdWUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHRleHQgc2VjdGlvbgorICAgICBhZGRyZXNzLiAgSG93ZXZlciwgd2Ugd291bGQgaGF2ZSB0byBmaWxsIGl0IGluIGxhdGVyLCBhbmQgZ2RiCisgICAgIGRvZXNuJ3QgY2FyZSwgc28gd2UgZG9uJ3QgYm90aGVyIHdpdGggaXQuICAqLworCisgIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGZpbGVuYW1lOworCisgIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TT0wsIDAsIDAsIGZpbGVuYW1lKTsKK30KKworLyogUHVzaCBhbiBlbXB0eSB0eXBlLiAgVGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLiAgV2UganVzdCB1c2UgYQorICAgdm9pZCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZW1wdHlfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKworICAvKiBXZSBkb24ndCBjYWxsIHN0YWJfdm9pZF90eXBlIGlmIHRoZSB0eXBlIGlzIG5vdCB5ZXQgZGVmaW5lZCwKKyAgICAgYmVjYXVzZSB0aGF0IG1pZ2h0IHNjcmV3IHVwIHRoZSB0eXBlZGVmLiAgKi8KKworICBpZiAoaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUgIT0gMCkKKyAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUsIDApOworICBlbHNlCisgICAgeworICAgICAgbG9uZyBpbmRleDsKKyAgICAgIGNoYXIgYnVmWzQwXTsKKworICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OworICAgICAgKytpbmZvLT50eXBlX2luZGV4OworCisgICAgICBzcHJpbnRmIChidWYsICIlbGQ9JWxkIiwgaW5kZXgsIGluZGV4KTsKKworICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGZhbHNlLCAwKTsKKyAgICB9Cit9CisKKy8qIFB1c2ggYSB2b2lkIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl92b2lkX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisKKyAgaWYgKGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlICE9IDApCisgICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlLCAwKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxvbmcgaW5kZXg7CisgICAgICBjaGFyIGJ1Zls0MF07CisKKyAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKKyAgICAgICsraW5mby0+dHlwZV9pbmRleDsKKworICAgICAgaW5mby0+dHlwZV9jYWNoZS52b2lkX3R5cGUgPSBpbmRleDsKKworICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPSVsZCIsIGluZGV4LCBpbmRleCk7CisKKyAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCAwKTsKKyAgICB9Cit9CisKKy8qIFB1c2ggYW4gaW50ZWdlciB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKKyAgICAgUFRSIHA7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICBib29sZWFuIHVuc2lnbmVkcDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBsb25nICpjYWNoZTsKKworICBpZiAoc2l6ZSA8PSAwIHx8IChzaXplID4gc2l6ZW9mIChsb25nKSAmJiBzaXplICE9IDgpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygic3RhYl9pbnRfdHlwZTogYmFkIHNpemUgJXVcbiIpLCBzaXplKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKHVuc2lnbmVkcCkKKyAgICBjYWNoZSA9IGluZm8tPnR5cGVfY2FjaGUuc2lnbmVkX2ludGVnZXJfdHlwZXM7CisgIGVsc2UKKyAgICBjYWNoZSA9IGluZm8tPnR5cGVfY2FjaGUudW5zaWduZWRfaW50ZWdlcl90eXBlczsKKworICBpZiAoY2FjaGVbc2l6ZSAtIDFdICE9IDApCisgICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGNhY2hlW3NpemUgLSAxXSwgc2l6ZSk7CisgIGVsc2UKKyAgICB7CisgICAgICBsb25nIGluZGV4OworICAgICAgY2hhciBidWZbMTAwXTsKKworICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OworICAgICAgKytpbmZvLT50eXBlX2luZGV4OworCisgICAgICBjYWNoZVtzaXplIC0gMV0gPSBpbmRleDsKKworICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPXIlbGQ7IiwgaW5kZXgsIGluZGV4KTsKKyAgICAgIGlmICh1bnNpZ25lZHApCisJeworCSAgc3RyY2F0IChidWYsICIwOyIpOworCSAgaWYgKHNpemUgPCBzaXplb2YgKGxvbmcpKQorCSAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlbGQ7IiwgKChsb25nKSAxIDw8IChzaXplICogOCkpIC0gMSk7CisJICBlbHNlIGlmIChzaXplID09IHNpemVvZiAobG9uZykpCisJICAgIHN0cmNhdCAoYnVmLCAiLTE7Iik7CisJICBlbHNlIGlmIChzaXplID09IDgpCisJICAgIHN0cmNhdCAoYnVmLCAiMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Iik7CisJICBlbHNlCisJICAgIGFib3J0ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoc2l6ZSA8PSBzaXplb2YgKGxvbmcpKQorCSAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlbGQ7JWxkOyIsCisJCSAgICAgKGxvbmcpIC0gKCh1bnNpZ25lZCBsb25nKSAxIDw8IChzaXplICogOCAtIDEpKSwKKwkJICAgICAobG9uZykgKCgodW5zaWduZWQgbG9uZykgMSA8PCAoc2l6ZSAqIDggLSAxKSkgLSAxKSk7CisJICBlbHNlIGlmIChzaXplID09IDgpCisJICAgIHN0cmNhdCAoYnVmLCAiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDA7MDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiKTsKKwkgIGVsc2UKKwkgICAgYWJvcnQgKCk7CisJfQorCisgICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSk7CisgICAgfQorfQorCisvKiBQdXNoIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2Zsb2F0X3R5cGUgKHAsIHNpemUpCisgICAgIFBUUiBwOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworCisgIGlmIChzaXplID4gMAorICAgICAgJiYgc2l6ZSAtIDEgPCAoc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXMKKwkJICAgICAvIHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzWzBdKQorICAgICAgJiYgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1tzaXplIC0gMV0gIT0gMCkKKyAgICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywKKwkJCQkgICBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzW3NpemUgLSAxXSwKKwkJCQkgICBzaXplKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxvbmcgaW5kZXg7CisgICAgICBjaGFyICppbnRfdHlwZTsKKyAgICAgIGNoYXIgYnVmWzUwXTsKKworICAgICAgLyogRmxvYXRzIGFyZSBkZWZpbmVkIGFzIGEgc3VicmFuZ2Ugb2YgaW50LiAgKi8KKyAgICAgIGlmICghIHN0YWJfaW50X3R5cGUgKGluZm8sIDQsIGZhbHNlKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpbnRfdHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7CisgICAgICArK2luZm8tPnR5cGVfaW5kZXg7CisKKyAgICAgIGlmIChzaXplID4gMAorCSAgJiYgc2l6ZSAtIDEgPCAoc2l6ZW9mIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXMKKwkJCSAvIHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzWzBdKSkKKwlpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzW3NpemUgLSAxXSA9IGluZGV4OworCisgICAgICBzcHJpbnRmIChidWYsICIlbGQ9ciVzOyV1OzA7IiwgaW5kZXgsIGludF90eXBlLCBzaXplKTsKKworICAgICAgZnJlZSAoaW50X3R5cGUpOworCisgICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSk7CisgICAgfQorfQorCisvKiBQdXNoIGEgY29tcGxleCB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfY29tcGxleF90eXBlIChwLCBzaXplKQorICAgICBQVFIgcDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgY2hhciBidWZbNTBdOworICBsb25nIGluZGV4OworCisgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKKyAgKytpbmZvLT50eXBlX2luZGV4OworCisgIHNwcmludGYgKGJ1ZiwgIiVsZD1yJWxkOyV1OzA7IiwgaW5kZXgsIGluZGV4LCBzaXplKTsKKworICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSAqIDIpOworfQorCisvKiBQdXNoIGEgYm9vbGVhbiB0eXBlLiAgV2UgdXNlIGFuIFhDT0ZGIHByZWRlZmluZWQgdHlwZSwgc2luY2UgZ2RiCisgICBhbHdheXMgcmVjb2duaXplcyB0aGVtLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfYm9vbF90eXBlIChwLCBzaXplKQorICAgICBQVFIgcDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgbG9uZyBpbmRleDsKKworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIGluZGV4ID0gLTIxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBpbmRleCA9IC0yMjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDQ6CisgICAgICBpbmRleCA9IC0xNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA4OgorICAgICAgaW5kZXggPSAtMzM7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKTsKK30KKworLyogUHVzaCBhbiBlbnVtIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9lbnVtX3R5cGUgKHAsIHRhZywgbmFtZXMsIHZhbHMpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICp0YWc7CisgICAgIGNvbnN0IGNoYXIgKipuYW1lczsKKyAgICAgYmZkX3NpZ25lZF92bWEgKnZhbHM7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgc2l6ZV90IGxlbjsKKyAgY29uc3QgY2hhciAqKnBuOworICBjaGFyICpidWY7CisgIGxvbmcgaW5kZXggPSAwOworICBiZmRfc2lnbmVkX3ZtYSAqcHY7CisKKyAgaWYgKG5hbWVzID09IE5VTEwpCisgICAgeworICAgICAgYXNzZXJ0ICh0YWcgIT0gTlVMTCk7CisKKyAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDEwICsgc3RybGVuICh0YWcpKTsKKyAgICAgIHNwcmludGYgKGJ1ZiwgInhlJXM6IiwgdGFnKTsKKyAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBpcyBqdXN0IGEgZ3Vlc3MuICAqLworICAgICAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBmYWxzZSwgNCkpCisJcmV0dXJuIGZhbHNlOworICAgICAgZnJlZSAoYnVmKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBsZW4gPSAxMDsKKyAgaWYgKHRhZyAhPSBOVUxMKQorICAgIGxlbiArPSBzdHJsZW4gKHRhZyk7CisgIGZvciAocG4gPSBuYW1lczsgKnBuICE9IE5VTEw7IHBuKyspCisgICAgbGVuICs9IHN0cmxlbiAoKnBuKSArIDIwOworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7CisKKyAgaWYgKHRhZyA9PSBOVUxMKQorICAgIHN0cmNweSAoYnVmLCAiZSIpOworICBlbHNlCisgICAgeworICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OworICAgICAgKytpbmZvLT50eXBlX2luZGV4OworICAgICAgc3ByaW50ZiAoYnVmLCAiJXM6VCVsZD1lIiwgdGFnLCBpbmRleCk7CisgICAgfQorCisgIGZvciAocG4gPSBuYW1lcywgcHYgPSB2YWxzOyAqcG4gIT0gTlVMTDsgcG4rKywgcHYrKykKKyAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIlczolbGQsIiwgKnBuLCAobG9uZykgKnB2KTsKKyAgc3RyY2F0IChidWYsICI7Iik7CisKKyAgaWYgKHRhZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBpcyBqdXN0IGEgZ3Vlc3MuICAqLworICAgICAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBmYWxzZSwgNCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBUaGUgc2l6ZSBpcyBqdXN0IGEgZ3Vlc3MuICAqLworICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKQorCSAgfHwgISBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgNCkpCisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQdXNoIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2suICBDYWNoZSB0aGUKKyAgIHJlc3VsdHMgaW4gQ0FDSEUgYW5kIENBQ0hFX0FMTE9DLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfbW9kaWZ5X3R5cGUgKGluZm8sIG1vZCwgc2l6ZSwgY2FjaGUsIGNhY2hlX2FsbG9jKQorICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87CisgICAgIGludCBtb2Q7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworICAgICBsb25nICoqY2FjaGU7CisgICAgIHNpemVfdCAqY2FjaGVfYWxsb2M7Cit7CisgIGxvbmcgdGFyZ2luZGV4OworICBsb25nIGluZGV4OworICBjaGFyICpzLCAqYnVmOworCisgIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMKTsKKyAgdGFyZ2luZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+aW5kZXg7CisKKyAgaWYgKHRhcmdpbmRleCA8PSAwCisgICAgICB8fCBjYWNoZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJvb2xlYW4gZGVmaW5pdGlvbjsKKworICAgICAgLyogRWl0aGVyIHRoZSB0YXJnZXQgdHlwZSBoYXMgbm8gaW5kZXgsIG9yIHdlIGFyZW4ndCBjYWNoaW5nCisgICAgICAgICB0aGlzIG1vZGlmaWVyLiAgRWl0aGVyIHdheSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvcmRpbmcgdGhlCisgICAgICAgICBuZXcgdHlwZSwgc28gd2UgZG9uJ3QgYm90aGVyIHRvIGRlZmluZSBvbmUuICAqLworICAgICAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgICAgICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisgICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMik7CisgICAgICBzcHJpbnRmIChidWYsICIlYyVzIiwgbW9kLCBzKTsKKyAgICAgIGZyZWUgKHMpOworICAgICAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCBzaXplKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBmcmVlIChidWYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoc2l6ZV90KSB0YXJnaW5kZXggPj0gKmNhY2hlX2FsbG9jKQorCXsKKwkgIHNpemVfdCBhbGxvYzsKKworCSAgYWxsb2MgPSAqY2FjaGVfYWxsb2M7CisJICBpZiAoYWxsb2MgPT0gMCkKKwkgICAgYWxsb2MgPSAxMDsKKwkgIHdoaWxlICgoc2l6ZV90KSB0YXJnaW5kZXggPj0gYWxsb2MpCisJICAgIGFsbG9jICo9IDI7CisJICAqY2FjaGUgPSAobG9uZyAqKSB4cmVhbGxvYyAoKmNhY2hlLCBhbGxvYyAqIHNpemVvZiAobG9uZykpOworCSAgbWVtc2V0ICgqY2FjaGUgKyAqY2FjaGVfYWxsb2MsIDAsCisJCSAgKGFsbG9jIC0gKmNhY2hlX2FsbG9jKSAqIHNpemVvZiAobG9uZykpOworCSAgKmNhY2hlX2FsbG9jID0gYWxsb2M7CisJfQorCisgICAgICBpbmRleCA9ICgqY2FjaGUpW3RhcmdpbmRleF07CisgICAgICBpZiAoaW5kZXggIT0gMCAmJiAhIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24pCisJeworCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgYSBtb2RpZmljYXRpb24gb2YgdGhpcyB0eXBlLCBhbmQKKyAgICAgICAgICAgICB0aGUgZW50cnkgb24gdGhlIHR5cGUgc3RhY2sgaXMgbm90IGEgZGVmaW5pdGlvbiwgc28gd2UKKyAgICAgICAgICAgICBjYW4gc2FmZWx5IGRpc2NhcmQgaXQgKHdlIG1heSBoYXZlIGEgZGVmaW5pdGlvbiBvbiB0aGUKKyAgICAgICAgICAgICBzdGFjaywgZXZlbiBpZiB3ZSBhbHJlYWR5IGRlZmluZWQgYSBtb2RpZmljYXRpb24sIGlmIGl0CisgICAgICAgICAgICAgaXMgYSBzdHJ1Y3Qgd2hpY2ggd2UgZGlkIG5vdCBkZWZpbmUgYXQgdGhlIHRpbWUgaXQgd2FzCisgICAgICAgICAgICAgcmVmZXJlbmNlZCkuICAqLworCSAgZnJlZSAoc3RhYl9wb3BfdHlwZSAoaW5mbykpOworCSAgaWYgKCEgc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpKQorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKKwkgICsraW5mby0+dHlwZV9pbmRleDsKKworCSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDIwKTsKKwkgIHNwcmludGYgKGJ1ZiwgIiVsZD0lYyVzIiwgaW5kZXgsIG1vZCwgcyk7CisJICBmcmVlIChzKTsKKworCSAgKCpjYWNoZSlbdGFyZ2luZGV4XSA9IGluZGV4OworCisJICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCB0cnVlLCBzaXplKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBmcmVlIChidWYpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9ICAKKworLyogUHVzaCBhIHBvaW50ZXIgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3BvaW50ZXJfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKworICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLworICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJyonLCA0LCAmaW5mby0+dHlwZV9jYWNoZS5wb2ludGVyX3R5cGVzLAorCQkJICAgJmluZm8tPnR5cGVfY2FjaGUucG9pbnRlcl90eXBlc19hbGxvYyk7Cit9CisKKy8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZnVuY3Rpb25fdHlwZSAocCwgYXJnY291bnQsIHZhcmFyZ3MpCisgICAgIFBUUiBwOworICAgICBpbnQgYXJnY291bnQ7CisgICAgIGJvb2xlYW4gdmFyYXJnczsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBpbnQgaTsKKworICAvKiBXZSBoYXZlIG5vIHdheSB0byByZXByZXNlbnQgdGhlIGFyZ3VtZW50IHR5cGVzLCBzbyB3ZSBqdXN0CisgICAgIGRpc2NhcmQgdGhlbS4gIEhvd2V2ZXIsIGlmIHRoZXkgZGVmaW5lIG5ldyB0eXBlcywgd2UgbXVzdCBvdXRwdXQKKyAgICAgdGhlbS4gIFdlIGRvIHRoaXMgYnkgcHJvZHVjaW5nIGVtcHR5IHR5cGVkZWZzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCisgICAgeworICAgICAgaWYgKCEgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbikKKwlmcmVlIChzdGFiX3BvcF90eXBlIChpbmZvKSk7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqcywgKmJ1ZjsKKworCSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisJICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMyk7CisJICBzcHJpbnRmIChidWYsICI6dCVzIiwgcyk7CisJICBmcmVlIChzKTsKKworCSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBmcmVlIChidWYpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICdmJywgMCwgJmluZm8tPnR5cGVfY2FjaGUuZnVuY3Rpb25fdHlwZXMsCisJCQkgICAmaW5mby0+dHlwZV9jYWNoZS5mdW5jdGlvbl90eXBlc19hbGxvYyk7Cit9CisKKy8qIFB1c2ggYSByZWZlcmVuY2UgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3JlZmVyZW5jZV90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworCisgIC8qIEZJWE1FOiBUaGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCisgIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnJicsIDQsICZpbmZvLT50eXBlX2NhY2hlLnJlZmVyZW5jZV90eXBlcywKKwkJCSAgICZpbmZvLT50eXBlX2NhY2hlLnJlZmVyZW5jZV90eXBlc19hbGxvYyk7Cit9CisKKy8qIFB1c2ggYSByYW5nZSB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfcmFuZ2VfdHlwZSAocCwgbG93LCBoaWdoKQorICAgICBQVFIgcDsKKyAgICAgYmZkX3NpZ25lZF92bWEgbG93OworICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIGJvb2xlYW4gZGVmaW5pdGlvbjsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIGNoYXIgKnMsICpidWY7CisKKyAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOworCisgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDEwMCk7CisgIHNwcmludGYgKGJ1ZiwgInIlczslbGQ7JWxkOyIsIHMsIChsb25nKSBsb3csIChsb25nKSBoaWdoKTsKKyAgZnJlZSAocyk7CisKKyAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCBzaXplKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZnJlZSAoYnVmKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUHVzaCBhbiBhcnJheSB0eXBlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfYXJyYXlfdHlwZSAocCwgbG93LCBoaWdoLCBzdHJpbmdwKQorICAgICBQVFIgcDsKKyAgICAgYmZkX3NpZ25lZF92bWEgbG93OworICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOworICAgICBib29sZWFuIHN0cmluZ3A7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgYm9vbGVhbiBkZWZpbml0aW9uOworICB1bnNpZ25lZCBpbnQgZWxlbWVudF9zaXplOworICBjaGFyICpyYW5nZSwgKmVsZW1lbnQsICpidWY7CisgIGxvbmcgaW5kZXg7CisgIHVuc2lnbmVkIGludCBzaXplOworCisgIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworICByYW5nZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgIGVsZW1lbnRfc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7CisgIGVsZW1lbnQgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKworICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHJhbmdlKSArIHN0cmxlbiAoZWxlbWVudCkgKyAxMDApOworCisgIGlmICghIHN0cmluZ3ApCisgICAgeworICAgICAgaW5kZXggPSAwOworICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBkZWZpbmUgYSB0eXBlIGluIG9yZGVyIHRvIGluY2x1ZGUgdGhlIHN0cmluZworICAgICAgICAgYXR0cmlidXRlLiAgKi8KKyAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKKyAgICAgICsraW5mby0+dHlwZV9pbmRleDsKKyAgICAgIGRlZmluaXRpb24gPSB0cnVlOworICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPUBTOyIsIGluZGV4KTsKKyAgICB9CisKKyAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiYXIlczslbGQ7JWxkOyVzIiwKKwkgICByYW5nZSwgKGxvbmcpIGxvdywgKGxvbmcpIGhpZ2gsIGVsZW1lbnQpOworICBmcmVlIChyYW5nZSk7CisgIGZyZWUgKGVsZW1lbnQpOworCisgIGlmIChoaWdoIDwgbG93KQorICAgIHNpemUgPSAwOworICBlbHNlCisgICAgc2l6ZSA9IGVsZW1lbnRfc2l6ZSAqICgoaGlnaCAtIGxvdykgKyAxKTsKKyAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZyZWUgKGJ1Zik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFB1c2ggYSBzZXQgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQorICAgICBQVFIgcDsKKyAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIGJvb2xlYW4gZGVmaW5pdGlvbjsKKyAgY2hhciAqcywgKmJ1ZjsKKyAgbG9uZyBpbmRleDsKKworICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKKworICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAzMCk7CisKKyAgaWYgKCEgYml0c3RyaW5ncCkKKyAgICB7CisgICAgICAqYnVmID0gJ1wwJzsKKyAgICAgIGluZGV4ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGRlZmluZSBhIHR5cGUgaW4gb3JkZXIgdG8gaW5jbHVkZSB0aGUgc3RyaW5nCisgICAgICAgICBhdHRyaWJ1dGUuICAqLworICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OworICAgICAgKytpbmZvLT50eXBlX2luZGV4OworICAgICAgZGVmaW5pdGlvbiA9IHRydWU7CisgICAgICBzcHJpbnRmIChidWYsICIlbGQ9QFM7IiwgaW5kZXgpOworICAgIH0KKworICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICJTJXMiLCBzKTsKKyAgZnJlZSAocyk7CisKKyAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgMCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZyZWUgKGJ1Zik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFB1c2ggYW4gb2Zmc2V0IHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9vZmZzZXRfdHlwZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgYm9vbGVhbiBkZWZpbml0aW9uOworICBjaGFyICp0YXJnZXQsICpiYXNlLCAqYnVmOworCisgIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworICB0YXJnZXQgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKworICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworICBiYXNlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuICh0YXJnZXQpICsgc3RybGVuIChiYXNlKSArIDMpOworICBzcHJpbnRmIChidWYsICJAJXMsJXMiLCBiYXNlLCB0YXJnZXQpOworICBmcmVlIChiYXNlKTsKKyAgZnJlZSAodGFyZ2V0KTsKKworICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIDApKQorICAgIHJldHVybiBmYWxzZTsKKworICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBQdXNoIGEgbWV0aG9kIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9tZXRob2RfdHlwZSAocCwgZG9tYWlucCwgYXJnY291bnQsIHZhcmFyZ3MpCisgICAgIFBUUiBwOworICAgICBib29sZWFuIGRvbWFpbnA7CisgICAgIGludCBhcmdjb3VudDsKKyAgICAgYm9vbGVhbiB2YXJhcmdzOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIGJvb2xlYW4gZGVmaW5pdGlvbjsKKyAgY2hhciAqZG9tYWluLCAqcmV0dXJuX3R5cGUsICpidWY7CisgIGNoYXIgKiphcmdzOworICBpbnQgaTsKKyAgc2l6ZV90IGxlbjsKKworICAvKiBXZSBkb24ndCBib3RoZXIgd2l0aCBzdHViIG1ldGhvZCB0eXBlcywgYmVjYXVzZSB0aGF0IHdvdWxkCisgICAgIHJlcXVpcmUgYSBtYW5nbGVyIGZvciBDKysgYXJndW1lbnQgdHlwZXMuICBUaGlzIHdpbGwgd2FzdGUgc3BhY2UKKyAgICAgaW4gdGhlIGRlYnVnZ2luZyBvdXRwdXQuICAqLworCisgIC8qIFdlIG5lZWQgYSBkb21haW4uICBJJ20gbm90IHN1cmUgRE9NQUlOUCBjYW4gZXZlciBiZSBmYWxzZSwKKyAgICAgYW55aG93LiAgKi8KKyAgaWYgKCEgZG9tYWlucCkKKyAgICB7CisgICAgICBpZiAoISBzdGFiX2VtcHR5X3R5cGUgKHApKQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgIGRvbWFpbiA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIC8qIEEgbm9uLXZhcmFyZ3MgZnVuY3Rpb24gaXMgaW5kaWNhdGVkIGJ5IG1ha2luZyB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAgICAgdHlwZSBiZSB2b2lkLiAgKi8KKworICBpZiAoYXJnY291bnQgPCAwKQorICAgIHsKKyAgICAgIGFyZ3MgPSBOVUxMOworICAgICAgYXJnY291bnQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoYXJnY291bnQgPT0gMCkKKyAgICB7CisgICAgICBpZiAodmFyYXJncykKKwlhcmdzID0gTlVMTDsKKyAgICAgIGVsc2UKKwl7CisJICBhcmdzID0gKGNoYXIgKiopIHhtYWxsb2MgKDEgKiBzaXplb2YgKCphcmdzKSk7CisJICBpZiAoISBzdGFiX2VtcHR5X3R5cGUgKHApKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworCSAgYXJnc1swXSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCSAgYXJnY291bnQgPSAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhcmdzID0gKGNoYXIgKiopIHhtYWxsb2MgKChhcmdjb3VudCArIDEpICogc2l6ZW9mICgqYXJncykpOworICAgICAgZm9yIChpID0gYXJnY291bnQgLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworCSAgYXJnc1tpXSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCX0KKyAgICAgIGlmICghIHZhcmFyZ3MpCisJeworCSAgaWYgKCEgc3RhYl9lbXB0eV90eXBlIChwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKKwkgIGFyZ3NbYXJnY291bnRdID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisJICArK2FyZ2NvdW50OworCX0KKyAgICB9CisKKyAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKKyAgcmV0dXJuX3R5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKworICBsZW4gPSBzdHJsZW4gKGRvbWFpbikgKyBzdHJsZW4gKHJldHVybl90eXBlKSArIDEwOworICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKKyAgICBsZW4gKz0gc3RybGVuIChhcmdzW2ldKTsKKworICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOworCisgIHNwcmludGYgKGJ1ZiwgIiMlcywlcyIsIGRvbWFpbiwgcmV0dXJuX3R5cGUpOworICBmcmVlIChkb21haW4pOworICBmcmVlIChyZXR1cm5fdHlwZSk7CisgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHN0cmNhdCAoYnVmLCAiLCIpOworICAgICAgc3RyY2F0IChidWYsIGFyZ3NbaV0pOworICAgICAgZnJlZSAoYXJnc1tpXSk7CisgICAgfQorICBzdHJjYXQgKGJ1ZiwgIjsiKTsKKworICBpZiAoYXJncyAhPSBOVUxMKQorICAgIGZyZWUgKGFyZ3MpOworCisgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgMCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZyZWUgKGJ1Zik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFB1c2ggYSBjb25zdCB2ZXJzaW9uIG9mIGEgdHlwZS4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2NvbnN0X3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisKKyAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICdrJywgaW5mby0+dHlwZV9zdGFjay0+c2l6ZSwKKwkJCSAgIChsb25nICoqKSBOVUxMLCAoc2l6ZV90ICopIE5VTEwpOworfQorCisvKiBQdXNoIGEgdm9sYXRpbGUgdmVyc2lvbiBvZiBhIHR5cGUuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl92b2xhdGlsZV90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworCisgIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnQicsIGluZm8tPnR5cGVfc3RhY2stPnNpemUsCisJCQkgICAobG9uZyAqKikgTlVMTCwgKHNpemVfdCAqKSBOVUxMKTsKK30KKworLyogR2V0IHRoZSB0eXBlIGluZGV4IHRvIHVzZSBmb3IgYSBzdHJ1Y3QvdW5pb24vY2xhc3MgSUQuICBUaGlzIHNob3VsZAorICAgcmV0dXJuIC0xIGlmIGl0IGZhaWxzLiAgKi8KKworc3RhdGljIGxvbmcKK3N0YWJfZ2V0X3N0cnVjdF9pbmRleCAoaW5mbywgdGFnLCBpZCwga2luZCwgcHNpemUpCisgICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqdGFnOworICAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7CisgICAgIHVuc2lnbmVkIGludCAqcHNpemU7Cit7CisgIGlmIChpZCA+PSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYykKKyAgICB7CisgICAgICBzaXplX3QgYWxsb2M7CisKKyAgICAgIGFsbG9jID0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2M7CisgICAgICBpZiAoYWxsb2MgPT0gMCkKKwlhbGxvYyA9IDEwOworICAgICAgd2hpbGUgKGlkID49IGFsbG9jKQorCWFsbG9jICo9IDI7CisgICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlcyA9CisJKHN0cnVjdCBzdGFiX3RhZyAqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXMsCisJCQkJICAgICAgYWxsb2MgKiBzaXplb2YgKHN0cnVjdCBzdGFiX3RhZykpOworICAgICAgbWVtc2V0ICgoaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXMKKwkgICAgICAgKyBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYyksCisJICAgICAgMCwKKwkgICAgICAoKGFsbG9jIC0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2MpCisJICAgICAgICogc2l6ZW9mIChzdHJ1Y3Qgc3RhYl90YWcpKSk7CisgICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc19hbGxvYyA9IGFsbG9jOworICAgIH0KKworICBpZiAoaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmluZGV4ID09IDApCisgICAgeworICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKKyAgICAgICsraW5mby0+dHlwZV9pbmRleDsKKyAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS50YWcgPSB0YWc7CisgICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0ua2luZCA9IGtpbmQ7CisgICAgfQorCisgIGlmIChraW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGUgc3RydWN0LiAgKi8KKyAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5raW5kID0ga2luZDsKKyAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5zaXplID0gKnBzaXplOworICAgIH0KKyAgZWxzZQorICAgICpwc2l6ZSA9IGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5zaXplOworCisgIHJldHVybiBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uaW5kZXg7Cit9CisKKy8qIFN0YXJ0IG91dHB1dHRpbmcgYSBzdHJ1Y3QuICBXZSBpZ25vcmUgdGhlIHRhZywgYW5kIGhhbmRsZSBpdCBpbgorICAgc3RhYl90YWcuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitzdGFiX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqdGFnOworICAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgIGJvb2xlYW4gc3RydWN0cDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgbG9uZyBpbmRleDsKKyAgYm9vbGVhbiBkZWZpbml0aW9uOworICBjaGFyICpidWY7CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoNDApOworCisgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgIGluZGV4ID0gMDsKKyAgICAgICpidWYgPSAnXDAnOworICAgICAgZGVmaW5pdGlvbiA9IGZhbHNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGluZGV4ID0gc3RhYl9nZXRfc3RydWN0X2luZGV4IChpbmZvLCB0YWcsIGlkLCBERUJVR19LSU5EX0lMTEVHQUwsCisJCQkJICAgICAmc2l6ZSk7CisgICAgICBpZiAoaW5kZXggPCAwKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD0iLCBpbmRleCk7CisgICAgICBkZWZpbml0aW9uID0gdHJ1ZTsKKyAgICB9CisKKyAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJWMldSIsCisJICAgc3RydWN0cCA/ICdzJyA6ICd1JywKKwkgICBzaXplKTsKKworICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gKGNoYXIgKikgeG1hbGxvYyAoMSk7CisgIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkc1swXSA9ICdcMCc7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmRfdm1hIGJpdHBvczsKKyAgICAgYmZkX3ZtYSBiaXRzaXplOworICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBib29sZWFuIGRlZmluaXRpb247CisgIHVuc2lnbmVkIGludCBzaXplOworICBjaGFyICpzLCAqbjsKKyAgY29uc3QgY2hhciAqdmlzOworCisgIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKKyAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIC8qIEFkZCB0aGlzIGZpZWxkIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RydWN0IGZpZWxkcywgd2hpY2ggaXMKKyAgICAgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKKyAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKQorCQkJKyBzdHJsZW4gKG5hbWUpCisJCQkrIHN0cmxlbiAocykKKwkJCSsgNTApOworCisgIHN3aXRjaCAodmlzaWJpbGl0eSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKKyAgICAgIHZpcyA9ICIiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKKyAgICAgIHZpcyA9ICIvMCI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6CisgICAgICB2aXMgPSAiLzEiOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChiaXRzaXplID09IDApCisgICAgeworICAgICAgYml0c2l6ZSA9IHNpemUgKiA4OworICAgICAgaWYgKGJpdHNpemUgPT0gMCkKKwlmcHJpbnRmIChzdGRlcnIsCisJCSBfKCIlczogd2FybmluZzogdW5rbm93biBzaXplIGZvciBmaWVsZCBgJXMnIGluIHN0cnVjdFxuIiksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgbmFtZSk7CisgICAgfQorCisgIHNwcmludGYgKG4sICIlcyVzOiVzJXMsJWxkLCVsZDsiLCBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMsIG5hbWUsIHZpcywgcywKKwkgICAobG9uZykgYml0cG9zLCAobG9uZykgYml0c2l6ZSk7CisKKyAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKKyAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gbjsKKworICBpZiAoZGVmaW5pdGlvbikKKyAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogRmluaXNoIHVwIGEgc3RydWN0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZW5kX3N0cnVjdF90eXBlIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBib29sZWFuIGRlZmluaXRpb247CisgIGxvbmcgaW5kZXg7CisgIHVuc2lnbmVkIGludCBzaXplOworICBjaGFyICpmaWVsZHMsICpmaXJzdCwgKmJ1ZjsKKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7CisKKyAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgIGluZGV4ID0gaW5mby0+dHlwZV9zdGFjay0+aW5kZXg7CisgIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOworICBmaWVsZHMgPSBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHM7CisgIGZpcnN0ID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaXJzdCkgKyBzdHJsZW4gKGZpZWxkcykgKyAyKTsKKyAgc3ByaW50ZiAoYnVmLCAiJXMlczsiLCBmaXJzdCwgZmllbGRzKTsKKyAgZnJlZSAoZmlyc3QpOworICBmcmVlIChmaWVsZHMpOworCisgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBTdGFydCBvdXRwdXR0aW5nIGEgY2xhc3MuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqdGFnOworICAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgIGJvb2xlYW4gc3RydWN0cDsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgIGJvb2xlYW4gdnB0cjsKKyAgICAgYm9vbGVhbiBvd252cHRyOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIGJvb2xlYW4gZGVmaW5pdGlvbjsKKyAgY2hhciAqdnN0cmluZzsKKworICBpZiAoISB2cHRyIHx8IG93bnZwdHIpCisgICAgeworICAgICAgZGVmaW5pdGlvbiA9IGZhbHNlOworICAgICAgdnN0cmluZyA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgICAgICB2c3RyaW5nID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisgICAgfQorCisgIGlmICghIHN0YWJfc3RhcnRfc3RydWN0X3R5cGUgKHAsIHRhZywgaWQsIHN0cnVjdHAsIHNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAodnB0cikKKyAgICB7CisgICAgICBjaGFyICp2dGFibGU7CisKKyAgICAgIGlmIChvd252cHRyKQorCXsKKwkgIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjay0+aW5kZXggPiAwKTsKKwkgIHZ0YWJsZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKKwkgIHNwcmludGYgKHZ0YWJsZSwgIn4lJSVsZCIsIGluZm8tPnR5cGVfc3RhY2stPmluZGV4KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdnRhYmxlID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuICh2c3RyaW5nKSArIDMpOworCSAgc3ByaW50ZiAodnRhYmxlLCAifiUlJXMiLCB2c3RyaW5nKTsKKwkgIGZyZWUgKHZzdHJpbmcpOworCX0KKworICAgICAgaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlID0gdnRhYmxlOworICAgIH0KKworICBpZiAoZGVmaW5pdGlvbikKKyAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRkIGEgc3RhdGljIG1lbWJlciB0byB0aGUgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9jbGFzc19zdGF0aWNfbWVtYmVyIChwLCBuYW1lLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOworICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBib29sZWFuIGRlZmluaXRpb247CisgIGNoYXIgKnMsICpuOworICBjb25zdCBjaGFyICp2aXM7CisKKyAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKworICAvKiBBZGQgdGhpcyBmaWVsZCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0cnVjdCBmaWVsZHMsIHdoaWNoIGlzCisgICAgIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCisKKyAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7CisgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcykKKwkJCSsgc3RybGVuIChuYW1lKQorCQkJKyBzdHJsZW4gKHMpCisJCQkrIHN0cmxlbiAocGh5c25hbWUpCisJCQkrIDEwKTsKKworICBzd2l0Y2ggKHZpc2liaWxpdHkpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6CisgICAgICB2aXMgPSAiIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6CisgICAgICB2aXMgPSAiLzAiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgorICAgICAgdmlzID0gIi8xIjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzcHJpbnRmIChuLCAiJXMlczolcyVzOiVzOyIsIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcywgbmFtZSwgdmlzLCBzLAorCSAgIHBoeXNuYW1lKTsKKworICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpOworICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSBuOworCisgIGlmIChkZWZpbml0aW9uKQorICAgIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24gPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYSBiYXNlIGNsYXNzIHRvIHRoZSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2NsYXNzX2Jhc2VjbGFzcyAocCwgYml0cG9zLCB2aXJ0dWFsLCB2aXNpYmlsaXR5KQorICAgICBQVFIgcDsKKyAgICAgYmZkX3ZtYSBiaXRwb3M7CisgICAgIGJvb2xlYW4gdmlydHVhbDsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgYm9vbGVhbiBkZWZpbml0aW9uOworICBjaGFyICpzOworICBjaGFyICpidWY7CisgIHVuc2lnbmVkIGludCBjOworICBjaGFyICoqYmFzZWNsYXNzZXM7CisKKyAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247CisgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKworICAvKiBCdWlsZCB0aGUgYmFzZSBjbGFzcyBzcGVjaWZpZXIuICAqLworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyNSk7CisgIGJ1ZlswXSA9IHZpcnR1YWwgPyAnMScgOiAnMCc7CisgIHN3aXRjaCAodmlzaWJpbGl0eSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6CisgICAgICBidWZbMV0gPSAnMCc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ6CisgICAgICBidWZbMV0gPSAnMSc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6CisgICAgICBidWZbMV0gPSAnMic7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgc3ByaW50ZiAoYnVmICsgMiwgIiVsZCwlczsiLCAobG9uZykgYml0cG9zLCBzKTsKKyAgZnJlZSAocyk7CisKKyAgLyogQWRkIHRoZSBuZXcgYmFzZWNsYXNzIHRvIHRoZSBleGlzdGluZyBvbmVzLiAgKi8KKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7CisKKyAgaWYgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzID09IE5VTEwpCisgICAgYyA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBjID0gMDsKKyAgICAgIHdoaWxlIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tjXSAhPSBOVUxMKQorCSsrYzsKKyAgICB9CisKKyAgYmFzZWNsYXNzZXMgPSAoY2hhciAqKikgeHJlYWxsb2MgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzLAorCQkJCSAgICAoYyArIDIpICogc2l6ZW9mICgqYmFzZWNsYXNzZXMpKTsKKyAgYmFzZWNsYXNzZXNbY10gPSBidWY7CisgIGJhc2VjbGFzc2VzW2MgKyAxXSA9IE5VTEw7CisKKyAgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgPSBiYXNlY2xhc3NlczsKKworICBpZiAoZGVmaW5pdGlvbikKKyAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIHRoZSBjbGFzcyBvbiB0aGUgdHlwZSBzdGFjay4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2NsYXNzX3N0YXJ0X21ldGhvZCAocCwgbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgY2hhciAqbTsKKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7CisKKyAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPT0gTlVMTCkKKyAgICB7CisgICAgICBtID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDMpOworICAgICAgKm0gPSAnXDAnOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG0gPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcywKKwkJCSAgICAgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcykKKwkJCSAgICAgICsgc3RybGVuIChuYW1lKQorCQkJICAgICAgKyA0KSk7CisgICAgfQorCisgIHNwcmludGYgKG0gKyBzdHJsZW4gKG0pLCAiJXM6OiIsIG5hbWUpOworCisgIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPSBtOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBBZGQgYSB2YXJpYW50LCBlaXRoZXIgc3RhdGljIG9yIG5vdCwgdG8gdGhlIGN1cnJlbnQgbWV0aG9kLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHN0YXRpY3AsIGNvbnN0cCwgdm9sYXRpbGVwLAorCQkgICAgICAgdm9mZnNldCwgY29udGV4dHApCisgICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworICAgICBib29sZWFuIHN0YXRpY3A7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKKyAgICAgYmZkX3ZtYSB2b2Zmc2V0OworICAgICBib29sZWFuIGNvbnRleHRwOworeworICBib29sZWFuIGRlZmluaXRpb247CisgIGNoYXIgKnR5cGU7CisgIGNoYXIgKmNvbnRleHQgPSBOVUxMOworICBjaGFyIHZpc2MsIHF1YWxjLCB0eXBlYzsKKworICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKKyAgdHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIGlmIChjb250ZXh0cCkKKyAgICB7CisgICAgICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOworICAgICAgY29udGV4dCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworICAgIH0KKworICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICE9IE5VTEwpOworCisgIHN3aXRjaCAodmlzaWJpbGl0eSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6CisgICAgICB2aXNjID0gJzAnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgorICAgICAgdmlzYyA9ICcxJzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKKyAgICAgIHZpc2MgPSAnMic7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGNvbnN0cCkKKyAgICB7CisgICAgICBpZiAodm9sYXRpbGVwKQorCXF1YWxjID0gJ0QnOworICAgICAgZWxzZQorCXF1YWxjID0gJ0InOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh2b2xhdGlsZXApCisJcXVhbGMgPSAnQyc7CisgICAgICBlbHNlCisJcXVhbGMgPSAnQSc7CisgICAgfQorCisgIGlmIChzdGF0aWNwKQorICAgIHR5cGVjID0gJz8nOworICBlbHNlIGlmICghIGNvbnRleHRwKQorICAgIHR5cGVjID0gJy4nOworICBlbHNlCisgICAgdHlwZWMgPSAnKic7CisKKyAgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyA9CisgICAgKGNoYXIgKikgeHJlYWxsb2MgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMsCisJCSAgICAgICAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKQorCQkJKyBzdHJsZW4gKHR5cGUpCisJCQkrIHN0cmxlbiAocGh5c25hbWUpCisJCQkrIChjb250ZXh0cCA/IHN0cmxlbiAoY29udGV4dCkgOiAwKQorCQkJKyA0MCkpOworCisgIHNwcmludGYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgKyBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpLAorCSAgICIlczolczslYyVjJWMiLCB0eXBlLCBwaHlzbmFtZSwgdmlzYywgcXVhbGMsIHR5cGVjKTsKKyAgZnJlZSAodHlwZSk7CisKKyAgaWYgKGNvbnRleHRwKQorICAgIHsKKyAgICAgIHNwcmludGYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgKyBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpLAorCSAgICAgICAiJWxkOyVzOyIsIChsb25nKSB2b2Zmc2V0LCBjb250ZXh0KTsKKyAgICAgIGZyZWUgKGNvbnRleHQpOworICAgIH0KKworICBpZiAoZGVmaW5pdGlvbikKKyAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogQWRkIGEgdmFyaWFudCB0byB0aGUgY3VycmVudCBtZXRob2QuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9jbGFzc19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwLAorCQkJICAgdm9mZnNldCwgY29udGV4dHApCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKKyAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7CisgICAgIGJvb2xlYW4gY29uc3RwOworICAgICBib29sZWFuIHZvbGF0aWxlcDsKKyAgICAgYmZkX3ZtYSB2b2Zmc2V0OworICAgICBib29sZWFuIGNvbnRleHRwOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisKKyAgcmV0dXJuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIGZhbHNlLCBjb25zdHAsCisJCQkJdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0cCk7Cit9CisKKy8qIEFkZCBhIHN0YXRpYyB2YXJpYW50IHRvIHRoZSBjdXJyZW50IG1ldGhvZC4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7CisgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OworICAgICBib29sZWFuIGNvbnN0cDsKKyAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKworICByZXR1cm4gc3RhYl9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgdHJ1ZSwgY29uc3RwLAorCQkJCXZvbGF0aWxlcCwgMCwgZmFsc2UpOworfQorCisvKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9jbGFzc19lbmRfbWV0aG9kIChwKQorICAgICBQVFIgcDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworCisgIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCk7CisKKyAgLyogV2UgYWxsb2NhdGVkIGVub3VnaCByb29tIG9uIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgdG8gYWRkIHRoZQorICAgICB0cmFpbGluZyBzZW1pY29sb24uICAqLworICBzdHJjYXQgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMsICI7Iik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZW5kX2NsYXNzX3R5cGUgKHApCisgICAgIFBUUiBwOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIHNpemVfdCBsZW47CisgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgY2hhciAqYnVmOworCisgIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMICYmIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyAhPSBOVUxMKTsKKworICAvKiBXb3JrIG91dCB0aGUgc2l6ZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZvciB0aGUgY2xhc3MgZGVmaW5pdGlvbi4gICovCisKKyAgbGVuID0gKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+c3RyaW5nKQorCSArIHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKQorCSArIDEwKTsKKyAgaWYgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzICE9IE5VTEwpCisgICAgeworICAgICAgbGVuICs9IDIwOworICAgICAgZm9yIChpID0gMDsgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0gIT0gTlVMTDsgaSsrKQorCWxlbiArPSBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldKTsKKyAgICB9CisgIGlmIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICE9IE5VTEwpCisgICAgbGVuICs9IHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyk7CisgIGlmIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUgIT0gTlVMTCkKKyAgICBsZW4gKz0gc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUpOworCisgIC8qIEJ1aWxkIHRoZSBjbGFzcyBkZWZpbml0aW9uLiAgKi8KKworICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOworCisgIHN0cmNweSAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcpOworCisgIGlmIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiEldSwiLCBpKTsKKyAgICAgIGZvciAoaSA9IDA7IGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldICE9IE5VTEw7IGkrKykKKwl7CisJICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0pOworCSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbaV0pOworCX0KKyAgICAgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzKTsKKyAgICAgIGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzID0gTlVMTDsKKyAgICB9CisKKyAgc3RyY2F0IChidWYsIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7CisgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7CisgIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyA9IE5VTEw7CisKKyAgaWYgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJjYXQgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyk7CisgICAgICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKTsKKyAgICAgIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPSBOVUxMOworICAgIH0KKworICBzdHJjYXQgKGJ1ZiwgIjsiKTsKKworICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlICE9IE5VTEwpCisgICAgeworICAgICAgc3RyY2F0IChidWYsIGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSk7CisgICAgICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT52dGFibGUpOworICAgICAgaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlID0gTlVMTDsKKyAgICB9CisKKyAgLyogUmVwbGFjZSB0aGUgc3RyaW5nIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGggdGhlIGNvbXBsZXRlCisgICAgIGNsYXNzIGRlZmluaXRpb24uICAqLworICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcpOworICBpbmZvLT50eXBlX3N0YWNrLT5zdHJpbmcgPSBidWY7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFB1c2ggYSB0eXBlZGVmIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRlZmluZWQuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKKworICBoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmaW5mby0+dHlwZWRlZl9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpOworICBhc3NlcnQgKGggIT0gTlVMTCAmJiBoLT5pbmRleCA+IDApOworCisgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBoLT5pbmRleCwgaC0+c2l6ZSk7Cit9CisKKy8qIFB1c2ggYSBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzIHRhZy4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3RhZ190eXBlIChwLCBuYW1lLCBpZCwga2luZCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHVuc2lnbmVkIGludCBpZDsKKyAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBsb25nIGluZGV4OworICB1bnNpZ25lZCBpbnQgc2l6ZTsKKworICBpbmRleCA9IHN0YWJfZ2V0X3N0cnVjdF9pbmRleCAoaW5mbywgbmFtZSwgaWQsIGtpbmQsICZzaXplKTsKKyAgaWYgKGluZGV4IDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKTsKK30KKworLyogRGVmaW5lIGEgdHlwZWRlZi4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3R5cGRlZiAocCwgbmFtZSkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgbG9uZyBpbmRleDsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIGNoYXIgKnMsICpidWY7CisgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKKworICBpbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPmluZGV4OworICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKKyAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMjApOworCisgIGlmIChpbmRleCA+IDApCisgICAgc3ByaW50ZiAoYnVmLCAiJXM6dCVzIiwgbmFtZSwgcyk7CisgIGVsc2UKKyAgICB7CisgICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7CisgICAgICArK2luZm8tPnR5cGVfaW5kZXg7CisgICAgICBzcHJpbnRmIChidWYsICIlczp0JWxkPSVzIiwgbmFtZSwgaW5kZXgsIHMpOworICAgIH0KKworICBmcmVlIChzKTsKKworICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmcmVlIChidWYpOworCisgIGggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmX2hhc2gsIG5hbWUsIHRydWUsIGZhbHNlKTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInN0cmluZ19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVzXG4iKSwKKwkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYWJvdXQgcmVkZWZpbml0aW9ucy4gICovCisKKyAgaC0+aW5kZXggPSBpbmRleDsKKyAgaC0+c2l6ZSA9IHNpemU7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERlZmluZSBhIHRhZy4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3RhZyAocCwgdGFnKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqdGFnOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIGNoYXIgKnMsICpidWY7CisKKyAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAodGFnKSArIHN0cmxlbiAocykgKyAzKTsKKworICBzcHJpbnRmIChidWYsICIlczpUJXMiLCB0YWcsIHMpOworICBmcmVlIChzKTsKKworICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBEZWZpbmUgYW4gaW50ZWdlciBjb25zdGFudC4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQorICAgICBQVFIgcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgY2hhciAqYnVmOworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyMCk7CisgIHNwcmludGYgKGJ1ZiwgIiVzOmM9aSVsZCIsIG5hbWUsIChsb25nKSB2YWwpOworCisgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZyZWUgKGJ1Zik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIERlZmluZSBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGRvdWJsZSB2YWw7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgY2hhciAqYnVmOworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyMCk7CisgIHNwcmludGYgKGJ1ZiwgIiVzOmM9ZiVnIiwgbmFtZSwgdmFsKTsKKworICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBEZWZpbmUgYSB0eXBlZCBjb25zdGFudC4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3R5cGVkX2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmRfdm1hIHZhbDsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworICBjaGFyICpzLCAqYnVmOworCisgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKKworICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzKSArIDIwKTsKKyAgc3ByaW50ZiAoYnVmLCAiJXM6Yz1lJXMsJWxkIiwgbmFtZSwgcywgKGxvbmcpIHZhbCk7CisgIGZyZWUgKHMpOworCisgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZyZWUgKGJ1Zik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfdmFyaWFibGUgKHAsIG5hbWUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKKyAgICAgYmZkX3ZtYSB2YWw7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgY2hhciAqcywgKmJ1ZjsKKyAgaW50IHN0YWJfdHlwZTsKKyAgY29uc3QgY2hhciAqa2luZHN0cjsKKworICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisKKyAgICBjYXNlIERFQlVHX0dMT0JBTDoKKyAgICAgIHN0YWJfdHlwZSA9IE5fR1NZTTsKKyAgICAgIGtpbmRzdHIgPSAiRyI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfU1RBVElDOgorICAgICAgc3RhYl90eXBlID0gTl9TVFNZTTsKKyAgICAgIGtpbmRzdHIgPSAiUyI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfTE9DQUxfU1RBVElDOgorICAgICAgc3RhYl90eXBlID0gTl9TVFNZTTsKKyAgICAgIGtpbmRzdHIgPSAiViI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfTE9DQUw6CisgICAgICBzdGFiX3R5cGUgPSBOX0xTWU07CisgICAgICBraW5kc3RyID0gIiI7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgYSB0eXBlIHJlZmVyZW5jZSBvciBkZWZpbml0aW9uLiAgKi8KKyAgICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisJeworCSAgY2hhciAqbjsKKwkgIGxvbmcgaW5kZXg7CisKKwkgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKKwkgICsraW5mby0+dHlwZV9pbmRleDsKKwkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMjApOworCSAgc3ByaW50ZiAobiwgIiVsZD0lcyIsIGluZGV4LCBzKTsKKwkgIGZyZWUgKHMpOworCSAgcyA9IG47CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX1JFR0lTVEVSOgorICAgICAgc3RhYl90eXBlID0gTl9SU1lNOworICAgICAga2luZHN0ciA9ICJyIjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzKSArIDMpOworICBzcHJpbnRmIChidWYsICIlczolcyVzIiwgbmFtZSwga2luZHN0ciwgcyk7CisgIGZyZWUgKHMpOworCisgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBzdGFiX3R5cGUsIDAsIHZhbCwgYnVmKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZnJlZSAoYnVmKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgb3V0cHV0dGluZyBhIGZ1bmN0aW9uLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfc3RhcnRfZnVuY3Rpb24gKHAsIG5hbWUsIGdsb2JhbHApCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBib29sZWFuIGdsb2JhbHA7Cit7CisgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKKyAgY2hhciAqcmV0dHlwZSwgKmJ1ZjsKKworICBhc3NlcnQgKGluZm8tPm5lc3RpbmcgPT0gMCAmJiBpbmZvLT5mdW5fb2Zmc2V0ID09IC0xKTsKKworICByZXR0eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocmV0dHlwZSkgKyAzKTsKKyAgc3ByaW50ZiAoYnVmLCAiJXM6JWMlcyIsIG5hbWUsCisJICAgZ2xvYmFscCA/ICdGJyA6ICdmJywKKwkgICByZXR0eXBlKTsKKworICAvKiBXZSBkb24ndCBrbm93IHRoZSB2YWx1ZSBub3csIHNvIHdlIHNldCBpdCBpbiBzdGFydF9ibG9jay4gICovCisgIGluZm8tPmZ1bl9vZmZzZXQgPSBpbmZvLT5zeW1ib2xzX3NpemU7CisKKyAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fRlVOLCAwLCAwLCBidWYpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmcmVlIChidWYpOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBPdXRwdXQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIuICAqLworCitzdGF0aWMgYm9vbGVhbgorc3RhYl9mdW5jdGlvbl9wYXJhbWV0ZXIgKHAsIG5hbWUsIGtpbmQsIHZhbCkKKyAgICAgUFRSIHA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7CisgICAgIGJmZF92bWEgdmFsOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisgIGNoYXIgKnMsICpidWY7CisgIGludCBzdGFiX3R5cGU7CisgIGNoYXIga2luZGM7CisKKyAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOworCisgIHN3aXRjaCAoa2luZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgY2FzZSBERUJVR19QQVJNX1NUQUNLOgorICAgICAgc3RhYl90eXBlID0gTl9QU1lNOworICAgICAga2luZGMgPSAncCc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgREVCVUdfUEFSTV9SRUc6CisgICAgICBzdGFiX3R5cGUgPSBOX1JTWU07CisgICAgICBraW5kYyA9ICdQJzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19QQVJNX1JFRkVSRU5DRToKKyAgICAgIHN0YWJfdHlwZSA9IE5fUFNZTTsKKyAgICAgIGtpbmRjID0gJ3YnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQlVHX1BBUk1fUkVGX1JFRzoKKyAgICAgIHN0YWJfdHlwZSA9IE5fUlNZTTsKKyAgICAgIGtpbmRjID0gJ2EnOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHMpICsgMyk7CisgIHNwcmludGYgKGJ1ZiwgIiVzOiVjJXMiLCBuYW1lLCBraW5kYywgcyk7CisgIGZyZWUgKHMpOworCisgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBzdGFiX3R5cGUsIDAsIHZhbCwgYnVmKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZnJlZSAoYnVmKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhcnQgYSBibG9jay4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX3N0YXJ0X2Jsb2NrIChwLCBhZGRyKQorICAgICBQVFIgcDsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisKKyAgLyogRmlsbCBpbiBhbnkgc2xvdHMgd2hpY2ggaGF2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBrbm93bgorICAgICB0ZXh0IGFkZHJlc3MuICAqLworCisgIGlmIChpbmZvLT5zb19vZmZzZXQgIT0gLTEpCisgICAgeworICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgYWRkciwgaW5mby0+c3ltYm9scyArIGluZm8tPnNvX29mZnNldCArIDgpOworICAgICAgaW5mby0+c29fb2Zmc2V0ID0gLTE7CisgICAgfQorCisgIGlmIChpbmZvLT5mdW5fb2Zmc2V0ICE9IC0xKQorICAgIHsKKyAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGFkZHIsIGluZm8tPnN5bWJvbHMgKyBpbmZvLT5mdW5fb2Zmc2V0ICsgOCk7CisgICAgICBpbmZvLT5mdW5fb2Zmc2V0ID0gLTE7CisgICAgfQorCisgICsraW5mby0+bmVzdGluZzsKKworICAvKiBXZSB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgdG9wIGxldmVsIGJsb2NrIHN1cnJvdW5kaW5nIHRoZQorICAgICBmdW5jdGlvbiwgYnV0IHN0YWJzIGluZm9ybWF0aW9uIGRvZXMgbm90IG91dHB1dCB0aGF0IGJsb2NrLCBzbyB3ZQorICAgICBpZ25vcmUgaXQuICAqLworCisgIGlmIChpbmZvLT5uZXN0aW5nID09IDEpCisgICAgeworICAgICAgaW5mby0+Zm5hZGRyID0gYWRkcjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBXZSBoYXZlIHRvIG91dHB1dCB0aGUgTEJSQUMgc3ltYm9sIGFmdGVyIGFueSB2YXJpYWJsZXMgd2hpY2ggYXJlCisgICAgIGRlY2xhcmVkIGluc2lkZSB0aGUgYmxvY2suICBXZSBwb3N0cG9uZSB0aGUgTEJSQUMgdW50aWwgdGhlIG5leHQKKyAgICAgc3RhcnRfYmxvY2sgb3IgZW5kX2Jsb2NrLiAgKi8KKworICAvKiBJZiB3ZSBoYXZlIHBvc3Rwb25lZCBhbiBMQlJBQywgb3V0cHV0IGl0IG5vdy4gICovCisgIGlmIChpbmZvLT5wZW5kaW5nX2xicmFjICE9IChiZmRfdm1hKSAtMSkKKyAgICB7CisgICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MQlJBQywgMCwgaW5mby0+cGVuZGluZ19sYnJhYywKKwkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzIGFuZCBvdXRwdXQgaXQgbGF0ZXIuICAqLworCisgIGluZm8tPnBlbmRpbmdfbGJyYWMgPSBhZGRyIC0gaW5mby0+Zm5hZGRyOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBFbmQgYSBibG9jay4gICovCisKK3N0YXRpYyBib29sZWFuCitzdGFiX2VuZF9ibG9jayAocCwgYWRkcikKKyAgICAgUFRSIHA7CisgICAgIGJmZF92bWEgYWRkcjsKK3sKKyAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOworCisgIGlmIChhZGRyID4gaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MpCisgICAgaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MgPSBhZGRyOworCisgIC8qIElmIHdlIGhhdmUgcG9zdHBvbmVkIGFuIExCUkFDLCBvdXRwdXQgaXQgbm93LiAgKi8KKyAgaWYgKGluZm8tPnBlbmRpbmdfbGJyYWMgIT0gKGJmZF92bWEpIC0xKQorICAgIHsKKyAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xCUkFDLCAwLCBpbmZvLT5wZW5kaW5nX2xicmFjLAorCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIGluZm8tPnBlbmRpbmdfbGJyYWMgPSAoYmZkX3ZtYSkgLTE7CisgICAgfQorCisgIGFzc2VydCAoaW5mby0+bmVzdGluZyA+IDApOworCisgIC0taW5mby0+bmVzdGluZzsKKworICAvKiBXZSBpZ25vcmUgdGhlIG91dGVybW9zdCBibG9jay4gICovCisgIGlmIChpbmZvLT5uZXN0aW5nID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1JCUkFDLCAwLCBhZGRyIC0gaW5mby0+Zm5hZGRyLAorCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwpOworfQorCisvKiBFbmQgYSBmdW5jdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK3N0YWJfZW5kX2Z1bmN0aW9uIChwKQorICAgICBQVFIgcDsKK3sKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIE91dHB1dCBhIGxpbmUgbnVtYmVyLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK3N0YWJfbGluZW5vIChwLCBmaWxlLCBsaW5lbm8sIGFkZHIpCisgICAgIFBUUiBwOworICAgICBjb25zdCBjaGFyICpmaWxlOworICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKKyAgICAgYmZkX3ZtYSBhZGRyOworeworICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7CisKKyAgYXNzZXJ0IChpbmZvLT5saW5lbm9fZmlsZW5hbWUgIT0gTlVMTCk7CisKKyAgaWYgKGFkZHIgPiBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcykKKyAgICBpbmZvLT5sYXN0X3RleHRfYWRkcmVzcyA9IGFkZHI7CisKKyAgaWYgKHN0cmNtcCAoZmlsZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NPTCwgMCwgYWRkciwgZmlsZSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gZmlsZTsKKyAgICB9CisKKyAgcmV0dXJuIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX1NMSU5FLCBsaW5lbm8sIGFkZHIgLSBpbmZvLT5mbmFkZHIsCisJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9jb25maWctbWwuaW4gYi9jb25maWctbWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZjdjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy1tbC5pbgpAQCAtMCwwICsxLDY4NyBAQAorIyBDb25maWd1cmUgZnJhZ21lbnQgaW52b2tlZCBpbiB0aGUgcG9zdC10YXJnZXQgc2VjdGlvbiBmb3Igc3ViZGlycworIyB3YW50aW5nIG11bHRpbGliIHN1cHBvcnQuCisjCisjIEl0IGlzIGFkdmlzYWJsZSB0byBzdXBwb3J0IGEgZmV3IC0tZW5hYmxlLy0tZGlzYWJsZSBvcHRpb25zIHRvIGxldCB0aGUKKyMgdXNlciBzZWxlY3Qgd2hpY2ggbGlicmFyaWVzIHMvaGUgcmVhbGx5IHdhbnRzLgorIworIyBTdWJkaXJlY3RvcmllcyB3aXNoaW5nIHRvIHVzZSBtdWx0aWxpYiBzaG91bGQgcHV0IHRoZSBmb2xsb3dpbmcgbGluZXMKKyMgaW4gdGhlICJwb3N0LXRhcmdldCIgc2VjdGlvbiBvZiBjb25maWd1cmUuaW4uCisjCisjIGlmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXSA7IHRoZW4KKyMgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdIDsgdGhlbgorIyAgICAgLiAke3dpdGhfbXVsdGlzcmN0b3B9Li4vLi4vY29uZmlnLW1sLmluCisjICAgZWxzZQorIyAgICAgLiAke3dpdGhfbXVsdGlzcmN0b3B9Li4vY29uZmlnLW1sLmluCisjICAgZmkKKyMgZWxzZQorIyAgIC4gJHtzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbgorIyBmaQorIworIyBTZWUgbGlicngvY29uZmlndXJlLmluIGluIHRoZSBsaWJnKysgZGlzdHJpYnV0aW9uIGZvciBhbiBleGFtcGxlIG9mIGhvdworIyB0byBoYW5kbGUgYXV0b2NvbmYnZCBsaWJyYXJpZXMuCisjCisjIFRoaW5ncyBhcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSA2IHNlcGFyYXRlIGNhc2VzIG11c3QgYmUgaGFuZGxlZDoKKyMgMiAobmF0aXZlLCBjcm9zcykgeCAzIChhYnNvbHV0ZS1wYXRoLCByZWxhdGl2ZS1ub3QtZG90LCBkb3QpID0gNi4KKyMKKyMgc3JjZGlyPS4gaXMgc3BlY2lhbC4gIEl0IG11c3QgaGFuZGxlIG1ha2UgcHJvZ3JhbXMgdGhhdCBkb24ndCBoYW5kbGUgVlBBVEguCisjIFRvIGltcGxlbWVudCB0aGlzLCBhIHN5bWxpbmsgdHJlZSBpcyBidWlsdCBmb3IgZWFjaCBsaWJyYXJ5IGFuZCBmb3IgZWFjaAorIyBtdWx0aWxpYiBzdWJkaXIuCisjCisjIFRoZSBidWlsZCB0cmVlIGlzIGxheWVkIG91dCBhcworIworIyAuLworIyAgIGxpYmcrKworIyAgIG5ld2xpYgorIyAgIG02ODAyMC8KKyMgICAgICAgICAgbGliZysrCisjICAgICAgICAgIG5ld2xpYgorIyAgICAgICAgICBtNjg4ODEvCisjICAgICAgICAgICAgICAgICBsaWJnKysKKyMgICAgICAgICAgICAgICAgIG5ld2xpYgorIworIyBUaGUgbmljZSBmZWF0dXJlIGFib3V0IHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCBpbnRlci1saWJyYXJ5IHJlZmVyZW5jZXMKKyMgaW4gdGhlIGJ1aWxkIHRyZWUgd29yayB3aXRob3V0IGhhdmluZyB0byBjYXJlIHdoZXJlIHlvdSBhcmUuICBOb3RlIHRoYXQKKyMgaW50ZXItbGlicmFyeSByZWZlcmVuY2VzIGFsc28gd29yayBpbiB0aGUgc291cmNlIHRyZWUgYmVjYXVzZSBzeW1saW5rIHRyZWVzCisjIGFyZSBidWlsdCB3aGVuIHNyY2Rpcj0uCisjCisjIFVuZm9ydHVuYXRlbHksIHRyeWluZyB0byBhY2Nlc3MgdGhlIGxpYnJhcmllcyBpbiB0aGUgYnVpbGQgdHJlZSByZXF1aXJlcworIyB0aGUgdXNlciB0byBtYW51YWxseSBjaG9vc2Ugd2hpY2ggbGlicmFyeSB0byB1c2UgYXMgR0NDIHdvbid0IGJlIGFibGUgdG8KKyMgZmluZCB0aGUgcmlnaHQgb25lLiAgVGhpcyBpcyB2aWV3ZWQgYXMgdGhlIGxlc3NlciBvZiB0d28gZXZpbHMuCisjCisjIENvbmZpZ3VyZSB2YXJpYWJsZXM6CisjICR7d2l0aF90YXJnZXRfc3ViZGlyfSA9ICIuIiBmb3IgbmF0aXZlLCBvciAke3RhcmdldF9hbGlhc30gZm9yIGNyb3NzLgorIyBTZXQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLgorIyAke3dpdGhfbXVsdGlzcmN0b3B9ID0gaG93IG1hbnkgbGV2ZWxzIG9mIG11bHRpbGlicyB0aGVyZSBhcmUgaW4gdGhlIHNvdXJjZQorIyB0cmVlLiAgSXQgZXhpc3RzIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlIHRyZWU6CisjICR7c3JjZGlyfSBpcyBub3QgY29uc3RhbnQuCisjICR7d2l0aF9tdWx0aXN1YmRpcn0gPSBuYW1lIG9mIG11bHRpbGliIHN1YmRpcmVjdG9yeSAoZWc6IG02ODAyMC9tNjg4ODEpLgorIworIyBNYWtlZmlsZSB2YXJpYWJsZXM6CisjIE1VTFRJU1JDVE9QID0gbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiBzb3VyY2UgdHJlZSAoKzEgaWYgY3Jvc3MpCisjIChGSVhNRTogbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gJHt3aXRoX211bHRpc3JjdG9wfS4gIENoZWNrIG91dC4pLgorIyBNVUxUSUJVSUxEVE9QID0gbnVtYmVyIG9mIG11bHRpbGliIGxldmVscyBpbiBidWlsZCB0cmVlCisjIE1VTFRJRElSUyA9IGxpc3Qgb2YgbXVsdGlsaWIgc3ViZGlycyAoZWc6IG02ODAwMCBtNjgwMjAgLi4uKQorIyAob25seSBkZWZpbmVkIGluIGVhY2ggbGlicmFyeSdzIG1haW4gTWFrZWZpbGUpLgorIyBNVUxUSVNVQkRJUiA9IGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB3aXRoIGxlYWRpbmcgJy8nIChlZzogL202ODAwMCkKKyMgKG9ubHkgZGVmaW5lZCBpbiBlYWNoIG11bHRpbGliIHN1YmRpcikuCisKKyMgRklYTUU6IE11bHRpbGliIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBieSBkZWZhdWx0IGZvciBldmVyeXRoaW5nIG90aGVyIHRoYW4KKyMgbmV3bGliLiAgSXQgaXMgdXAgdG8gZWFjaCB0YXJnZXQgdG8gdHVybiBvbiBtdWx0aWxpYiBzdXBwb3J0IGZvciB0aGUgb3RoZXIKKyMgbGlicmFyaWVzIGFzIGRlc2lyZWQuCisKKyMgV2UgaGF2ZSB0byBoYW5kbGUgYmVpbmcgaW52b2tlZCBieSBib3RoIEN5Z251cyBjb25maWd1cmUgYW5kIEF1dG9jb25mLgorIworIyBDeWdudXMgY29uZmlndXJlIGluY29taW5nIHZhcmlhYmxlczoKKyMgc3JjZGlyLCBzdWJkaXIsIGhvc3QsIGFyZ3VtZW50cworIworIyBBdXRvY29uZiBpbmNvbWluZyB2YXJpYWJsZXM6CisjIHNyY2RpciwgaG9zdCwgYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgV2UgKmNvdWxkKiBmaWd1cmUgc3JjZGlyIGFuZCBob3N0IG91dCwgYnV0IHdlJ2QgaGF2ZSB0byBkbyB3b3JrIHRoYXQKKyMgb3VyIGNhbGxlciBoYXMgYWxyZWFkeSBkb25lIHRvIGZpZ3VyZSB0aGVtIG91dCBhbmQgcmVxdWlyaW5nIHRoZXNlIHR3bworIyBzZWVtcyByZWFzb25hYmxlLgorIyBOb3RlIHRoYXQgYGhvc3QnIGluIHRoaXMgY2FzZSBpcyBHQ0MncyBgdGFyZ2V0Jy4gIFRhcmdldCBsaWJyYXJpZXMgYXJlCisjIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciBob3N0LgorCitpZiBbIC1uICIke2FjX2NvbmZpZ3VyZV9hcmdzfSIgXTsgdGhlbgorICBNYWtlZmlsZT0ke2FjX2ZpbGUtTWFrZWZpbGV9CisgIG1sX2NvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorICBtbF9hcmd1bWVudHM9IiR7YWNfY29uZmlndXJlX2FyZ3N9IgorICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfQorZWxzZQorICBNYWtlZmlsZT0ke01ha2VmaWxlLU1ha2VmaWxlfQorICBtbF9jb25maWdfc2hlbGw9JHtjb25maWdfc2hlbGwtL2Jpbi9zaH0KKyAgbWxfYXJndW1lbnRzPSIke2FyZ3VtZW50c30iCisgIGlmIFsgLW4gIiR7c3ViZGlyfSIgLWEgIiR7c3ViZGlyfSIgIT0gIi4iIF0gOyB0aGVuCisgICAgbWxfcmVhbHNyY2Rpcj0ke3NyY2Rpcn0vJHtzdWJkaXJ9CisgIGVsc2UKKyAgICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfQorICBmaQorZmkKKworIyBTY2FuIGFsbCB0aGUgYXJndW1lbnRzIGFuZCBzZXQgYWxsIHRoZSBvbmVzIHdlIG5lZWQuCisKK21sX3ZlcmJvc2U9LS12ZXJib3NlCitmb3Igb3B0aW9uIGluICR7bWxfYXJndW1lbnRzfQorZG8KKyAgY2FzZSAkb3B0aW9uIGluCisgIC0tKikgOzsKKyAgLSopIG9wdGlvbj0tJG9wdGlvbiA7OworICBlc2FjCisKKyAgY2FzZSAkb3B0aW9uIGluCisgIC0tKj0qKQorCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCisJOzsKKyAgZXNhYworCisgIGNhc2UgJG9wdGlvbiBpbgorICAtLWRpc2FibGUtKikKKwllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLWRpc2FibGUtOmVuYWJsZV86O3M6LTpfOmcnYAorCWV2YWwgJGVuYWJsZW9wdD1ubworCTs7CisgIC0tZW5hYmxlLSopCisJY2FzZSAiJG9wdGlvbiIgaW4KKwkqPSopCTs7CisJKikJb3B0YXJnPXllcyA7OworCWVzYWMKKwllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAorCWV2YWwgJGVuYWJsZW9wdD0iJG9wdGFyZyIKKwk7OworICAtLW5vcmVjdXJzaW9uIHwgLS1ubyopCisJbWxfbm9yZWN1cnNpb249eWVzCisJOzsKKyAgLS1zaWxlbnQgfCAtLXNpbCogfCAtLXF1aWV0IHwgLS1xKikKKwltbF92ZXJib3NlPS0tc2lsZW50CisJOzsKKyAgLS12ZXJib3NlIHwgLS12IHwgLS12ZXJiKikKKwltbF92ZXJib3NlPS0tdmVyYm9zZQorCTs7CisgIC0td2l0aC0qKQorCWNhc2UgIiRvcHRpb24iIGluCisJKj0qKQk7OworCSopCW9wdGFyZz15ZXMgOzsKKwllc2FjCisJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCisJZXZhbCAkd2l0aG9wdD0iJG9wdGFyZyIKKwk7OworICAtLXdpdGhvdXQtKikKKwl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOm91dDo6O3M6LTpfOmcnYAorCWV2YWwgJHdpdGhvcHQ9bm8KKwk7OworICBlc2FjCitkb25lCisKKyMgT25seSBkbyB0aGlzIGlmIC0tZW5hYmxlLW11bHRpbGliLgoraWYgWyAiJHtlbmFibGVfbXVsdGlsaWJ9IiA9IHllcyBdOyB0aGVuCisKKyMgQ29tcHV0ZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwgZGlyZWN0b3J5CisjIChpZTogbm90IGEgbXVsdGlsaWIgc3ViZGlyZWN0b3J5LCBhbmQgbm90IGEgc3ViZGlyZWN0b3J5IGxpa2UgbGliZysrL3NyYykuCisjICR7d2l0aF9tdWx0aXN1YmRpcn0gdGVsbHMgdXMgd2UncmUgaW4gdGhlIHJpZ2h0IGJyYW5jaCwgYnV0IHdlIGNvdWxkIGJlCisjIGluIGEgc3ViZGlyIG9mIHRoYXQuCisjID8/PyBUaGUgcHJldmlvdXMgdmVyc2lvbiBjb3VsZCB2b2lkIHRoaXMgdGVzdCBieSBzZXBhcmF0aW5nIHRoZSBwcm9jZXNzIGludG8KKyMgdHdvIGZpbGVzOiBvbmUgdGhhdCBvbmx5IHRoZSBsaWJyYXJ5J3MgdG9wbGV2ZWwgY29uZmlndXJlLmluIHJhbiAodG8KKyMgY29uZmlndXJlIHRoZSBtdWx0aWxpYiBzdWJkaXJzKSwgYW5kIGFub3RoZXIgdGhhdCBhbGwgY29uZmlndXJlLmluJ3MgcmFuIHRvCisjIHVwZGF0ZSB0aGUgTWFrZWZpbGUuICBJdCBzZWVtZWQgcmVhc29uYWJsZSB0byBjb2xsYXBzZSBhbGwgbXVsdGlsaWIgc3VwcG9ydAorIyBpbnRvIG9uZSBmaWxlLCBidXQgaXQgZG9lcyBsZWF2ZSB1cyB3aXRoIGhhdmluZyB0byBwZXJmb3JtIHRoaXMgdGVzdC4KK21sX3RvcGxldmVsX3A9bm8KK2lmIFsgLXogIiR7d2l0aF9tdWx0aXN1YmRpcn0iIF07IHRoZW4KKyAgaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdOyB0aGVuCisgICAgIyBVc2UgJHttbF9yZWFsc3JjZGlyfSBpbnN0ZWFkIG9mICR7c3JjZGlyfSBoZXJlIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KKyAgICAjICR7d2l0aF90YXJnZXRfc3ViZGlyfSA9ICIuIiBmb3IgbmF0aXZlLCBvdGhlcndpc2UgdGFyZ2V0IGFsaWFzLgorICAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgPSAiLiIgXTsgdGhlbgorICAgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCisJbWxfdG9wbGV2ZWxfcD15ZXMKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uLy4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCisJbWxfdG9wbGV2ZWxfcD15ZXMKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgICMgVXNlICR7bWxfcmVhbHNyY2Rpcn0gaW5zdGVhZCBvZiAke3NyY2Rpcn0gaGVyZSB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCisgICAgaWYgWyAtZiAke21sX3JlYWxzcmNkaXJ9Ly4uL2NvbmZpZy1tbC5pbiBdOyB0aGVuCisgICAgICBtbF90b3BsZXZlbF9wPXllcworICAgIGZpCisgIGZpCitmaQorCisjIElmIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBzZXQgbXVsdGlkaXJzIHRvIHRoZQorIyBtdWx0aWxpYiBzdWJkaXJzIHRvIHN1cHBvcnQuICBUaGlzIGxpdmVzIGF0IHRoZSB0b3AgYmVjYXVzZSB3ZSBuZWVkCisjIGBtdWx0aWRpcnMnIHNldCByaWdodCBhd2F5LgorCitpZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCisKK211bHRpZGlycz0KK2ZvciBpIGluIGAke0NDLWdjY30gLS1wcmludC1tdWx0aS1saWIgMj4vZGV2L251bGxgOyBkbworICBkaXI9YGVjaG8gJGkgfCBzZWQgLWUgJ3MvOy4qJC8vJ2AKKyAgaWYgWyAiJHtkaXJ9IiA9ICIuIiBdOyB0aGVuCisgICAgdHJ1ZQorICBlbHNlCisgICAgaWYgWyAteiAiJHttdWx0aWRpcnN9IiBdOyB0aGVuCisgICAgICBtdWx0aWRpcnM9IiR7ZGlyfSIKKyAgICBlbHNlCisgICAgICBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke2Rpcn0iCisgICAgZmkKKyAgZmkKK2RvbmUKKworIyBUYXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkIGZvciB0aGUgaG9zdCB0aGV5IHJ1biBvbiwgc28gd2UgY2hlY2sKKyMgJGhvc3QgaGVyZSwgbm90ICR0YXJnZXQuCisKK2Nhc2UgIiR7aG9zdH0iIGluCithcmMtKi1lbGYqKQorCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gIT0geHllcyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHt4fSIgaW4KKwkgICAgICAqYmUqKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJOzsKK2FybS0qLSopCisJaWYgWyB4IiRlbmFibGVfZnB1IiA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHt4fSIgaW4KKwkgICAgICAqZnB1KikgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCIkZW5hYmxlXzI2Yml0IiA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHt4fSIgaW4KKwkgICAgICAqMjZiaXQqKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJaWYgWyB4IiRlbmFibGVfdW5kZXJzY29yZSIgPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9CisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR7eH0iIGluCisJICAgICAgKnVuZGVyKikgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCIkZW5hYmxlX2ludGVyd29yayIgPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9JHttdWx0aWRpcnN9CisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR7eH0iIGluCisJICAgICAgKmludGVyd29yayopIDogOzsKKwkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KKwl0aGVuCisJICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR4IiBpbgorCSAgICAgICpsZSogKSA6IDs7CisJICAgICAgKmJlKiApIDogOzsKKwkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwk7OworbTY4Ki0qLSopCisJaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHgiIGluCisJICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCRlbmFibGVfbTY4ODgxID0geG5vIF0KKwl0aGVuCisJICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR4IiBpbgorCSAgICAgICptNjg4ODEqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCRlbmFibGVfbTY4MDAwID0geG5vIF0KKwl0aGVuCisJICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR4IiBpbgorCSAgICAgICptNjgwMDAqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCRlbmFibGVfbTY4MDIwID0geG5vIF0KKwl0aGVuCisJICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR4IiBpbgorCSAgICAgICptNjgwMjAqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCTs7CittaXBzKi0qLSopCisJaWYgWyB4JGVuYWJsZV9zaW5nbGVfZmxvYXQgPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHgiIGluCisJICAgICAgKnNpbmdsZSogKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgorCSAgbXVsdGlkaXJzPSIiCisJICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbworCSAgICBjYXNlICIkeCIgaW4KKwkgICAgICAqZWwqICkgOiA7OworCSAgICAgICplYiogKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJaWYgWyB4JGVuYWJsZV9zb2Z0ZmxvYXQgPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHgiIGluCisJICAgICAgKnNvZnQtZmxvYXQqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCTs7Citwb3dlcnBjKi0qLSogfCByczYwMDAqLSotKikKKwlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgorCSAgbXVsdGlkaXJzPSIiCisJICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbworCSAgICBjYXNlICIkeCIgaW4KKwkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJaWYgWyB4JGVuYWJsZV9wb3dlcmNwdSA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgorCSAgbXVsdGlkaXJzPSIiCisJICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbworCSAgICBjYXNlICIkeCIgaW4KKwkgICAgICBwb3dlciB8ICovcG93ZXIgfCAqL3Bvd2VyLyogKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJaWYgWyB4JGVuYWJsZV9wb3dlcnBjY3B1ID0geG5vIF0KKwl0aGVuCisJICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCisJICBtdWx0aWRpcnM9IiIKKwkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCisJICAgIGNhc2UgIiR4IiBpbgorCSAgICAgICpwb3dlcnBjKiApIDogOzsKKwkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKwlpZiBbIHgkZW5hYmxlX3Bvd2VycGNvcyA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgorCSAgbXVsdGlkaXJzPSIiCisJICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbworCSAgICBjYXNlICIkeCIgaW4KKwkgICAgICAqbWNhbGwtbGludXgqIHwgKm1jYWxsLXNvbGFyaXMqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHgiIGluCisJICAgICAgKm1saXR0bGUqIHwgKm1iaWcqICkgOiA7OworCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWlmIFsgeCRlbmFibGVfc3lzdiA9IHhubyBdCisJdGhlbgorCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgorCSAgbXVsdGlkaXJzPSIiCisJICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbworCSAgICBjYXNlICIkeCIgaW4KKwkgICAgICAqbWNhbGwtc3lzdiogKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJaWYgWyB4JGVuYWJsZV9haXggPSB4bm8gXQorCXRoZW4KKwkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKKwkgIG11bHRpZGlycz0iIgorCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KKwkgICAgY2FzZSAiJHgiIGluCisJICAgICAgKm1jYWxsLWFpeCogKSA6IDs7CisJICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCWZpCisJOzsKK2VzYWMKKworIyBSZW1vdmUgZXh0cmFuZW91cyBibGFua3MgZnJvbSBtdWx0aWRpcnMuCisjIFRlc3RzIGxpa2UgYGlmIFsgLW4gIiRtdWx0aWRpcnMiIF0nIHJlcXVpcmUgaXQuCittdWx0aWRpcnM9YGVjaG8gIiRtdWx0aWRpcnMiIHwgc2VkIC1lICdzL15bIF1bIF0qLy8nIC1lICdzL1sgXVsgXSokLy8nIC1lICdzL1sgXVsgXSovIC9nJ2AKKworIyBBZGQgY29kZSB0byBsaWJyYXJ5J3MgdG9wIGxldmVsIG1ha2VmaWxlIHRvIGhhbmRsZSBidWlsZGluZyB0aGUgbXVsdGlsaWIKKyMgc3ViZGlycy4KKworY2F0ID4gTXVsdGkudGVtIDw8XEVPRgorCisjIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYW4gQC1zaWduIGluIGZyb250IG9mIHRoZSBgaWYnLgorIyBMZWF2ZSBvdXQgdW50aWwgdGhpcyBpcyB0ZXN0ZWQgYSBiaXQgbW9yZS4KK211bHRpLWRvOgorCWlmIFsgLXogIiQoTVVMVElESVJTKSIgXTsgdGhlbiBcCisJICB0cnVlOyBcCisJZWxzZSBcCisJICByb290cHJlPWBwd2RgLzsgZXhwb3J0IHJvb3RwcmU7IFwKKwkgIHNyY3Jvb3RwcmU9YGNkICQoc3JjZGlyKTsgcHdkYC87IGV4cG9ydCBzcmNyb290cHJlOyBcCisJICBsaWI9YGVjaG8gJCR7cm9vdHByZX0gfCBzZWQgLWUgJ3MsXi4qL1woW14vXVteL10qXCkvJCQsXDEsJ2A7IFwKKwkgIGNvbXBpbGVyPSIkKENDKSI7IFwKKwkgIGZvciBpIGluIGAkJHtjb21waWxlcn0gLS1wcmludC1tdWx0aS1saWIgMj4vZGV2L251bGxgOyBkbyBcCisJICAgIGRpcj1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvOy4qJCQvLydgOyBcCisJICAgIGlmIFsgIiQke2Rpcn0iID0gIi4iIF07IHRoZW4gXAorCSAgICAgIHRydWU7IFwKKwkgICAgZWxzZSBcCisJICAgICAgaWYgWyAtZCAuLi8kJHtkaXJ9LyQke2xpYn0gXTsgdGhlbiBcCisJCWZsYWdzPWBlY2hvICQkaSB8IHNlZCAtZSAncy9eW147XSo7Ly8nIC1lICdzL0AvIC0vZydgOyBcCisJCWlmIChjZCAuLi8kJHtkaXJ9LyQke2xpYn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBcCisJCQkJQ0ZMQUdTPSIkKENGTEFHUykgJCR7ZmxhZ3N9IiBcCisJCQkJQ1hYRkxBR1M9IiQoQ1hYRkxBR1MpICQke2ZsYWdzfSIgXAorCQkJCUxJQkNGTEFHUz0iJChMSUJDRkxBR1MpICQke2ZsYWdzfSIgXAorCQkJCUxJQkNYWEZMQUdTPSIkKExJQkNYWEZMQUdTKSAkJHtmbGFnc30iIFwKKwkJCQlMREZMQUdTPSIkKExERkxBR1MpICQke2ZsYWdzfSIgXAorCQkJCSQoRE8pKTsgdGhlbiBcCisJCSAgdHJ1ZTsgXAorCQllbHNlIFwKKwkJICBleGl0IDE7IFwKKwkJZmk7IFwKKwkgICAgICBlbHNlIHRydWU7IFwKKwkgICAgICBmaTsgXAorCSAgICBmaTsgXAorCSAgZG9uZTsgXAorCWZpCisKKyMgRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhbiBALXNpZ24gaW4gZnJvbnQgb2YgdGhlIGBpZicuCisjIExlYXZlIG91dCB1bnRpbCB0aGlzIGlzIHRlc3RlZCBhIGJpdCBtb3JlLgorbXVsdGktY2xlYW46CisJaWYgWyAteiAiJChNVUxUSURJUlMpIiBdOyB0aGVuIFwKKwkgIHRydWU7IFwKKwllbHNlIFwKKwkgIGxpYj1gcHdkIHwgc2VkIC1lICdzLF4uKi9cKFteL11bXi9dKlwpJCQsXDEsJ2A7IFwKKwkgIGZvciBkaXIgaW4gTWFrZWZpbGUgJChNVUxUSURJUlMpOyBkbyBcCisJICAgIGlmIFsgLWYgLi4vJCR7ZGlyfS8kJHtsaWJ9L01ha2VmaWxlIF07IHRoZW4gXAorCSAgICAgIGlmIChjZCAuLi8kJHtkaXJ9LyQke2xpYn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkKERPKSk7IFwKKwkgICAgICB0aGVuIHRydWU7IFwKKwkgICAgICBlbHNlIGV4aXQgMTsgXAorCSAgICAgIGZpOyBcCisJICAgIGVsc2UgdHJ1ZTsgXAorCSAgICBmaTsgXAorCSAgZG9uZTsgXAorCWZpCitFT0YKKworY2F0ICR7TWFrZWZpbGV9IE11bHRpLnRlbSA+IE1ha2VmaWxlLnRlbQorcm0gLWYgJHtNYWtlZmlsZX0gTXVsdGkudGVtCittdiBNYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KKworZmkgIyAke21sX3RvcGxldmVsX3B9ID0geWVzCisKK2lmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KKyAgZWNobyAiQWRkaW5nIG11bHRpbGliIHN1cHBvcnQgdG8gTWFrZWZpbGUgaW4gJHttbF9yZWFsc3JjZGlyfSIKKyAgaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgorICAgIGVjaG8gIm11bHRpZGlycz0ke211bHRpZGlyc30iCisgIGZpCisgIGVjaG8gIndpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfSIKK2ZpCisKK2lmIFsgIiR7c3JjZGlyfSIgPSAiLiIgXTsgdGhlbgorICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdOyB0aGVuCisgICAgbWxfc3JjZG90ZG90PSIuLi8iCisgIGVsc2UKKyAgICBtbF9zcmNkb3Rkb3Q9IiIKKyAgZmkKK2Vsc2UKKyAgbWxfc3JjZG90ZG90PSIiCitmaQorCitpZiBbIC16ICIke3dpdGhfbXVsdGlzdWJkaXJ9IiBdOyB0aGVuCisgIG1sX3N1YmRpcj0KKyAgbWxfYnVpbGRkb3Rkb3Q9CisgIDogIyBtbF9zcmNkb3Rkb3Q9ICMgYWxyZWFkeSBzZXQKK2Vsc2UKKyAgbWxfc3ViZGlyPSIvJHt3aXRoX211bHRpc3ViZGlyfSIKKyAgIyBUaGUgJ1teL11bXi9dKicgYXBwZWFycyB0aGF0IHdheSB0byB3b3JrIGFyb3VuZCBhIFN1bk9TIHNlZCBidWcuCisgIG1sX2J1aWxkZG90ZG90PWBlY2hvICR7d2l0aF9tdWx0aXN1YmRpcn0gfCBzZWQgLWUgJ3M6W14vXVteL10qOi4uOmcnYC8KKyAgaWYgWyAiJHNyY2RpciIgPSAiLiIgXTsgdGhlbgorICAgIG1sX3NyY2RvdGRvdD0ke21sX3NyY2RvdGRvdH0ke21sX2J1aWxkZG90ZG90fQorICBlbHNlCisgICAgOiAjIG1sX3NyY2RvdGRvdD0gIyBhbHJlYWR5IHNldAorICBmaQorZmkKKworaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgorICBtbF9kbz0nJChNQUtFKScKKyAgbWxfY2xlYW49JyQoTUFLRSknCitlbHNlCisgIG1sX2RvPXRydWUKKyAgbWxfY2xlYW49dHJ1ZQorZmkKKworIyBUT1AgaXMgdXNlZCBieSBuZXdsaWIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUgZm9yIHRoaXMgcHVycG9zZS4KKyMgTVVMVEl7U1JDLEJVSUxEfVRPUCBhcmUgdGhlIHByb3BlciBvbmVzIHRvIHVzZS4gIE1VTFRJU1JDVE9QIGlzIGVtcHR5CisjIHdoZW4gc3JjZGlyICE9IGJ1aWxkZGlyLiAgTVVMVElCVUlMRFRPUCBpcyBhbHdheXMgc29tZSBudW1iZXIgb2YgLi4vJ3MuCisjIEZJWE1FOiBuZXdsaWIgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byB1c2UgTVVMVEl7U1JDLEJVSUxEfVRPUCBzbyB3ZSBjYW4KKyMgZGVsZXRlIFRPUC4gIE5ld2xpYiBtYXkgd2lzaCB0byBjb250aW51ZSB0byB1c2UgVE9QIGZvciBpdHMgb3duIHB1cnBvc2VzCisjIG9mIGNvdXJzZS4KKyMgTVVMVElESVJTIGlzIG5vbi1lbXB0eSBmb3IgdGhlIGNwdSB0b3AgbGV2ZWwgTWFrZWZpbGUgKGVnOiBuZXdsaWIvTWFrZWZpbGUpCisjIGFuZCBsaXN0cyB0aGUgc3ViZGlyZWN0b3JpZXMgdG8gcmVjdXJzZSBpbnRvLgorIyBNVUxUSVNVQkRJUiBpcyBub24tZW1wdHkgaW4gZWFjaCBjcHUgc3ViZGlyZWN0b3J5J3MgTWFrZWZpbGUKKyMgKGVnOiBuZXdsaWIvaDgzMDBoL01ha2VmaWxlKSBhbmQgaXMgdGhlIGluc3RhbGxlZCBzdWJkaXJlY3RvcnkgbmFtZSB3aXRoCisjIGEgbGVhZGluZyAnLycuCisjIE1VTFRJRE8gaXMgdXNlZCBmb3IgdGFyZ2V0cyBsaWtlIGFsbCwgaW5zdGFsbCwgYW5kIGNoZWNrIHdoZXJlCisjICQoRkxBR1NfVE9fUEFTUykgYXVnbWVudGVkIHdpdGggdGhlIHN1YmRpcidzIGNvbXBpbGVyIG9wdGlvbiBpcyBuZWVkZWQuCisjIE1VTFRJQ0xFQU4gaXMgdXNlZCBmb3IgdGhlICpjbGVhbiB0YXJnZXRzLgorIworIyA/Pz8gSXQgaXMgcG9zc2libGUgdG8gbWVyZ2UgTVVMVElETyBhbmQgTVVMVElDTEVBTiBpbnRvIG9uZS4gIFRoZXkgYXJlCisjIGN1cnJlbnRseSBrZXB0IHNlcGFyYXRlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgKmNsZWFuIHRhcmdldHMgdG8gcmVxdWlyZQorIyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjb21waWxlciAod2hpY2ggTVVMVElETyBjdXJyZW50bHkgcmVxdWlyZXMpIGFuZAorIyB0aGVyZWZvcmUgd2UnZCBoYXZlIHRvIHJlY29yZCB0aGUgZGlyZWN0b3J5IG9wdGlvbnMgYXMgd2VsbCBhcyBuYW1lcworIyAoY3VycmVudGx5IHdlIGp1c3QgcmVjb3JkIHRoZSBuYW1lcyBhbmQgdXNlIC0tcHJpbnQtbXVsdGktbGliIHRvIGdldCB0aGUKKyMgb3B0aW9ucykuCisKK3NlZCAtZSAiczpeVE9QWyAJXSo9WyAJXSpcKFsuL10qXClbIAldKiQ6VE9QID0gJHttbF9idWlsZGRvdGRvdH1cMToiIFwKKyAgICAtZSAiczpeTVVMVElTUkNUT1BbIAldKj0uKiQ6TVVMVElTUkNUT1AgPSAke21sX3NyY2RvdGRvdH06IiBcCisgICAgLWUgInM6Xk1VTFRJQlVJTERUT1BbIAldKj0uKiQ6TVVMVElCVUlMRFRPUCA9ICR7bWxfYnVpbGRkb3Rkb3R9OiIgXAorICAgIC1lICJzOl5NVUxUSURJUlNbIAldKj0uKiQ6TVVMVElESVJTID0gJHttdWx0aWRpcnN9OiIgXAorICAgIC1lICJzOl5NVUxUSVNVQkRJUlsgCV0qPS4qJDpNVUxUSVNVQkRJUiA9ICR7bWxfc3ViZGlyfToiIFwKKyAgICAtZSAiczpeTVVMVElET1sgCV0qPS4qJDpNVUxUSURPID0gJG1sX2RvOiIgXAorICAgIC1lICJzOl5NVUxUSUNMRUFOWyAJXSo9LiokOk1VTFRJQ0xFQU4gPSAkbWxfY2xlYW46IiBcCisJJHtNYWtlZmlsZX0gPiBNYWtlZmlsZS50ZW0KK3JtIC1mICR7TWFrZWZpbGV9CittdiBNYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KKworIyBJZiB0aGlzIGlzIHRoZSBsaWJyYXJ5J3MgdG9wIGxldmVsLCBjb25maWd1cmUgZWFjaCBtdWx0aWxpYiBzdWJkaXIuCisjIFRoaXMgaXMgZG9uZSBhdCB0aGUgZW5kIGJlY2F1c2UgdGhpcyBpcyB0aGUgbG9vcCB0aGF0IHJ1bnMgY29uZmlndXJlCisjIGluIGVhY2ggbXVsdGlsaWIgc3ViZGlyIGFuZCBpdCBzZWVtZWQgcmVhc29uYWJsZSB0byBmaW5pc2ggdXBkYXRpbmcgdGhlCisjIE1ha2VmaWxlIGJlZm9yZSBnb2luZyBvbiB0byBjb25maWd1cmUgdGhlIHN1YmRpcnMuCisKK2lmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KKworIyBXZSBtdXN0IGZyZXNobHkgY29uZmlndXJlIGVhY2ggc3ViZGlyZWN0b3J5LiAgVGhpcyBiaXQgb2YgY29kZSBpcworIyBhY3R1YWxseSBwYXJ0aWFsbHkgc3RvbGVuIGZyb20gdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdC4gIEZJWE1FLgorCitpZiBbIC1uICIke211bHRpZGlyc30iIF0gJiYgWyAteiAiJHttbF9ub3JlY3Vyc2lvbn0iIF07IHRoZW4KKworICBpZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCisgICAgZWNobyAiUnVubmluZyBjb25maWd1cmUgaW4gbXVsdGlsaWIgc3ViZGlycyAke211bHRpZGlyc30iCisgICAgZWNobyAicHdkOiBgcHdkYCIKKyAgZmkKKworICBtbF9vcmlnZGlyPWBwd2RgCisgIG1sX2xpYmRpcj1gZWNobyAkbWxfb3JpZ2RpciB8IHNlZCAtZSAncyxeLiovLCwnYAorICAjIGNkIHRvIHRvcC1sZXZlbC1idWlsZC1kaXIvJHt3aXRoX3RhcmdldF9zdWJkaXJ9CisgIGNkIC4uCisKKyAgZm9yIG1sX2RpciBpbiAke211bHRpZGlyc307IGRvCisKKyAgICBpZiBbICIke21sX3ZlcmJvc2V9IiA9IC0tdmVyYm9zZSBdOyB0aGVuCisgICAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZSBpbiBtdWx0aWxpYiBzdWJkaXIgJHttbF9kaXJ9IgorICAgICAgZWNobyAicHdkOiBgcHdkYCIKKyAgICBmaQorCisgICAgaWYgWyAtZCAke21sX2Rpcn0gXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICR7bWxfZGlyfTsgZmkKKyAgICBpZiBbIC1kICR7bWxfZGlyfS8ke21sX2xpYmRpcn0gXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICR7bWxfZGlyfS8ke21sX2xpYmRpcn07IGZpCisKKyAgICAjIEVnOiBpZiAke21sX2Rpcn0gPSBtNjgwMDAvbTY4ODgxLCBkb3Rkb3QgPSAuLi8uLi8KKyAgICBkb3Rkb3Q9Li4vYGVjaG8gJHttbF9kaXJ9IHwgc2VkIC1lICdzfFteL118fGcnIC1lICdzfC98Li4vfGcnYAorCisgICAgY2FzZSAke3NyY2Rpcn0gaW4KKyAgICAiLiIpCisgICAgICBlY2hvIEJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBpbiBgcHdkYC8ke21sX2Rpcn0vJHttbF9saWJkaXJ9CisgICAgICBpZiBbICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIiBdOyB0aGVuCisJbWxfdW5zdWJkaXI9Ii4uLyIKKyAgICAgIGVsc2UKKwltbF91bnN1YmRpcj0iIgorICAgICAgZmkKKyAgICAgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OworICAgICAgIC4uLyR7ZG90ZG90fSR7bWxfdW5zdWJkaXJ9c3ltbGluay10cmVlIC4uLyR7ZG90ZG90fSR7bWxfdW5zdWJkaXJ9JHttbF9saWJkaXJ9ICIiKQorICAgICAgaWYgWyAtZiAke21sX2Rpcn0vJHttbF9saWJkaXJ9L01ha2VmaWxlIF07IHRoZW4KKwlpZiBbIHgiJHtNQUtFfSIgPSB4IF07IHRoZW4KKwkgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyBtYWtlIGRpc3RjbGVhbikKKwllbHNlCisJICAoY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgJHtNQUtFfSBkaXN0Y2xlYW4pCisJZmkKKyAgICAgIGZpCisgICAgICBtbF9uZXdzcmNkaXI9Ii4iCisgICAgICBtbF9zcmNkaXJvcHRpb249CisgICAgICBtdWx0aXNyY3RvcD0ke2RvdGRvdH0KKyAgICAgIDs7CisgICAgKikKKyAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KKyAgICAgIC8qKSAjIGFic29sdXRlIHBhdGgKKyAgICAgICAgbWxfbmV3c3JjZGlyPSR7c3JjZGlyfQorICAgICAgICA7OworICAgICAgKikgIyBvdGhlcndpc2UgcmVsYXRpdmUKKyAgICAgICAgbWxfbmV3c3JjZGlyPSR7ZG90ZG90fSR7c3JjZGlyfQorICAgICAgICA7OworICAgICAgZXNhYworICAgICAgbWxfc3JjZGlyb3B0aW9uPSItc3JjZGlyPSR7bWxfbmV3c3JjZGlyfSIKKyAgICAgIG11bHRpc3JjdG9wPQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBjYXNlICIke3Byb2duYW1lfSIgaW4KKyAgICAvKikgICAgIG1sX3JlY3Byb2c9JHtwcm9nbmFtZX0gOzsKKyAgICAqKSAgICAgIG1sX3JlY3Byb2c9JHtkb3Rkb3R9JHtwcm9nbmFtZX0gOzsKKyAgICBlc2FjCisKKyAgICAjIEZJWE1FOiBQT1BESVI9JHtQV0Q9YHB3ZGB9IGRvZXNuJ3Qgd29yayBoZXJlLgorICAgIE1MX1BPUERJUj1gcHdkYAorICAgIGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn0KKworICAgIGlmIFsgLWYgJHttbF9uZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdOyB0aGVuCisgICAgICBtbF9yZWNwcm9nPSR7bWxfbmV3c3JjZGlyfS9jb25maWd1cmUKKyAgICBmaQorICAgIGlmIGV2YWwgJHttbF9jb25maWdfc2hlbGx9ICR7bWxfcmVjcHJvZ30gXAorCS0td2l0aC1tdWx0aXN1YmRpcj0ke21sX2Rpcn0gLS13aXRoLW11bHRpc3JjdG9wPSR7bXVsdGlzcmN0b3B9IFwKKwkke21sX2FyZ3VtZW50c30gJHttbF9zcmNkaXJvcHRpb259IDsgdGhlbgorICAgICAgdHJ1ZQorICAgIGVsc2UKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBjZCAke01MX1BPUERJUn0KKworICBkb25lCisKKyAgY2QgJHttbF9vcmlnZGlyfQorZmkKKworZmkgIyAke21sX3RvcGxldmVsX3B9ID0geWVzCitmaSAjICR7ZW5hYmxlX211bHRpbGlifSA9IHllcwpkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjNzVhODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxMDA4IEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBXcml0dGVuIGJ5IFBlciBCb3RobmVyIDxib3RobmVyQGN5Z251cy5jb20+LgorIyBUaGUgbWFzdGVyIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGF0IHRoZSBGU0YgaW4gL2hvbWUvZ2QvZ251L2xpYi4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQorIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHN5c3RlbSB0eXBlIChob3N0L3RhcmdldCBuYW1lKS4KKyMKKyMgT25seSBhIGZldyBzeXN0ZW1zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIGxpc3Q7IHBsZWFzZSBhZGQgb3RoZXJzCisjIChidXQgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBjbGVhbikuCisjCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgOC8yNC85NC4pCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCit0cmFwICdybSAtZiBkdW1teS5jIGR1bW15Lm8gZHVtbXk7IGV4aXQgMScgMSAyIDE1CisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgIGFscGhhOk9TRjE6KjoqKQorCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwlmaQorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJY2F0IDw8RU9GID5kdW1teS5zCisJLmdsb2JsIG1haW4KKwkuZW50IG1haW4KK21haW46CisJLmZyYW1lIFwkMzAsMCxcJDI2LDAKKwkucHJvbG9ndWUgMAorCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCisJbGRhIFwkMiwyNTkKKwkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgJDIsJDEKKwlzcmwgXCQxLDgsXCQyCisJc2xsIFwkMiwyLFwkMgorCXNsbCBcJDAsMyxcJDAKKwlhZGRsIFwkMSxcJDAsXCQwCisJYWRkbCBcJDIsXCQwLFwkMAorCXJldCBcJDMxLChcJDI2KSwxCisJLmVuZCBtYWluCitFT0YKKwkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCisJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KKwkJLi9kdW1teQorCQljYXNlICIkPyIgaW4KKwkJCTcpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCisJCQkJOzsKKwkJCTE1KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgorCQkJCTs7CisJCQkxNCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCisJCQkJOzsKKwkJCTEwKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCisJCQkJOzsKKwkJCTE2KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgorCQkJCTs7CisJCWVzYWMKKwlmaQorCXJtIC1mIGR1bW15LnMgZHVtbXkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgMCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgMCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay1jYm0tc3lzdjQKKwlleGl0IDA7OworICAgIGFtaWdhOk5ldEJTRDoqOiopCisgICAgICBlY2hvIG02OGstY2JtLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgIGV4aXQgMCA7OworICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCAwIDs7CisgICAgYXJjNjQ6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzNjRlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXJjOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBoa21pcHM6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBwbWF4Ok9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzZ2k6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICB3Z3Jpc2M6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwOzsKKyAgICBhcm0zMjpOZXRCU0Q6KjoqKQorCWVjaG8gYXJtLXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgMDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOip8TUlTKjpPU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgTklMRToqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgMCA7OworICAgIHN1bjRIOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgMCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoaGVhZCAtMSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXRhcmkqOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWF0YXJpLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4zKjpOZXRCU0Q6KjoqKQorCWVjaG8gbTY4ay1zdW4tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWFwcGxlLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWM2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTg4azpPcGVuQlNEOio6KikKKwllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgMCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIDIwMjA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgeworCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IFwKKwkgICYmIC4vZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAorCSAgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwlybSAtZiBkdW1teS5jIGR1bW15CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDAgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgMCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisgICAgICAgIGlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgLW8gJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXSA7IHRoZW4KKwlpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBcCisJICAgICAtbyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0gOyB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZWxzZSBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaT84NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+ZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCQlybSAtZiBkdW1teS5jIGR1bW15CisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCAwIDs7CisgICAgKjpBSVg6Kjo0KQorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVIbCBwcm9jMCB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCAwIDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgMCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCAwIDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0gKQorCisgICAgICAgICAgICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID5kdW1teS5jCisgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZiAKKyAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpIAorICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6IAorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKSAKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYgCisgICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgIGV4aXQgKDApOworICAgICAgICAgICAgICB9CitFT0YKKwkoJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCApICYmIEhQX0FSQ0g9YC4vZHVtbXlgCisJcm0gLWYgZHVtbXkuYyBkdW1teQorCWVzYWMKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCAwIDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCXJtIC1mIGR1bW15LmMgZHVtbXkKKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCAwIDs7CisgICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGk/ODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgMCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDAgOzsKKyAgICBocHBhKjpPcGVuQlNEOio6KikKKwllY2hvIGhwcGEtdW5rbm93bi1vcGVuYnNkCisJZXhpdCAwIDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIENSQVkqWC1NUDoqOio6KikKKwllY2hvIHhtcC1jcmF5LXVuaWNvcworICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBDUkFZLTI6KjoqOiopCisJZWNobyBjcmF5Mi1jcmF5LXVuaWNvcworICAgICAgICBleGl0IDAgOzsKKyAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gImYzMDAtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDAgOzsKKyAgICBGMzAxOlVOSVhfU3lzdGVtX1Y6KjoqKQorICAgICAgIGVjaG8gZjMwMS1mdWppdHN1LXV4cHZgZWNobyAkVU5BTUVfUkVMRUFTRSB8IHNlZCAncy8gLiovLydgCisgICAgICAgZXhpdCAwIDs7CisgICAgaHAzWzAtOV1bMDVdOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWhwLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBocDMwMDpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGk/ODY6QlNELzM4NjoqOiogfCAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpGcmVlQlNEOio6KikKKwlpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorCSAgICBpZiB0ZXN0ICJlbGYiID0gImAvdXNyL2Jpbi9vYmpmb3JtYXRgIjsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkZWxmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qLy8nYAorCQlleGl0IDAKKwkgICAgZmkKKwlmaQorICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDAgOzsKKyAgICAqOk5ldEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgKjpPcGVuQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgaSo6W0NjXVtZeV1bR2ddW1d3XVtJaV1bTm5dKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4zMgorCWV4aXQgMCA7OworICAgIGkqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCAwIDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisgICAgICAgICMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIGdlbmVyaWMgcG9zaXggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YKKwkjIGkzODY/CisJZWNobyBpMzg2LXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCAwIDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luMzIKKwlleGl0IDAgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgKjpHTlU6KjoqKQorCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAorCWV4aXQgMCA7OworICAgICo6TGludXg6KjoqKQorCSMgdW5hbWUgb24gdGhlIEFSTSBwcm9kdWNlcyBhbGwgc29ydHMgb2Ygc3RyYW5nZW5lc3MsIGFuZCB3ZSBuZWVkIHRvCisJIyBmaWx0ZXIgaXQgb3V0LgorCWNhc2UgIiRVTkFNRV9NQUNISU5FIiBpbgorCSAgYXJtdiopCQkgICAgICBVTkFNRV9NQUNISU5FPSRVTkFNRV9NQUNISU5FIDs7CisJICBhcm0qIHwgc2ExMTAqKQkgICAgICBVTkFNRV9NQUNISU5FPSJhcm0iIDs7CisJZXNhYworCisJIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KKwkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuCisJbGRfaGVscF9zdHJpbmc9YGxkIC0taGVscCAyPiYxYAorCWxkX3N1cHBvcnRlZF9lbXVsYXRpb25zPWBlY2hvICRsZF9oZWxwX3N0cmluZyBcCisJCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIGVtdWxhdGlvbnM6LyFkCisJCQkJICAgIHMvWyAJXVsgCV0qLyAvZworCQkJCSAgICBzLy4qc3VwcG9ydGVkIGVtdWxhdGlvbnM6ICovLworCQkJCSAgICBzLyAuKi8vCisJCQkJICAgIHAnYAorICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnMiIGluCisJICBpPzg2bGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiICAgICAgOyBleGl0IDAgOzsKKwkgIGk/ODZjb2ZmKSAgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIgICAgICA7IGV4aXQgMCA7OworCSAgc3BhcmNsaW51eCkgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7CisJICBhcm1saW51eCkgICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKKwkgIG02OGtsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OworCSAgZWxmMzJwcGMpCisJCSMgRGV0ZXJtaW5lIExpYiBWZXJzaW9uCisJCWNhdCA+ZHVtbXkuYyA8PEVPRgorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaWYgZGVmaW5lZChfX0dMSUJDX18pCitleHRlcm4gY2hhciBfX2xpYmNfdmVyc2lvbltdOworZXh0ZXJuIGNoYXIgX19saWJjX3JlbGVhc2VbXTsKKyNlbmRpZgorbWFpbihhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdOworeworI2lmIGRlZmluZWQoX19HTElCQ19fKQorICBwcmludGYoIiVzICVzXG4iLCBfX2xpYmNfdmVyc2lvbiwgX19saWJjX3JlbGVhc2UpOworI2Vsc2UKKyAgcHJpbnRmKCJ1bmtvd25cbiIpOworI2VuZGlmCisgIHJldHVybiAwOworfQorRU9GCisJCUxJQkM9IiIKKwkJJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbAorCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgorCQkJLi9kdW1teSB8IGdyZXAgMVwuOTkgPiAvZGV2L251bGwKKwkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkJTElCQz0ibGliYzEiCisJCQlmaQorCQlmaQkKKwkJcm0gLWYgZHVtbXkuYyBkdW1teQorCQllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwIDs7CisJZXNhYworCisJaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgorCQlzZWQgJ3MvXgkvLycgIDw8RU9GID5kdW1teS5zCisJCS5nbG9ibCBtYWluCisJCS5lbnQgbWFpbgorCW1haW46CisJCS5mcmFtZSBcJDMwLDAsXCQyNiwwCisJCS5wcm9sb2d1ZSAwCisJCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCisJCWxkYSBcJDIsMjU5CisJCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQorCQlzcmwgXCQxLDgsXCQyCisJCXNsbCBcJDIsMixcJDIKKwkJc2xsIFwkMCwzLFwkMAorCQlhZGRsIFwkMSxcJDAsXCQwCisJCWFkZGwgXCQyLFwkMCxcJDAKKwkJcmV0IFwkMzEsKFwkMjYpLDEKKwkJLmVuZCBtYWluCitFT0YKKwkJTElCQz0iIgorCQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCisJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkuL2R1bW15CisJCQljYXNlICIkPyIgaW4KKwkJCTcpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCisJCQkJOzsKKwkJCTE1KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgorCQkJCTs7CisJCQkxNCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCisJCQkJOzsKKwkJCTEwKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCisJCQkJOzsKKwkJCTE2KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgorCQkJCTs7CisJCQllc2FjCQorCisJCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAorCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKKwkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkJTElCQz0ibGliYzEiCisJCQlmaQorCQlmaQkKKwkJcm0gLWYgZHVtbXkucyBkdW1teQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwCisJZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJtaXBzIiA7IHRoZW4KKwkgIGNhdCA+ZHVtbXkuYyA8PEVPRgorbWFpbihhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdOworeworI2lmZGVmIF9fTUlQU0VCX18KKyAgcHJpbnRmICgiJXMtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOworI2VuZGlmCisjaWZkZWYgX19NSVBTRUxfXworICBwcmludGYgKCIlc2VsLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KK0VPRgorCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCSAgcm0gLWYgZHVtbXkuYyBkdW1teQorCWVsc2UKKwkgICMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKQorCSAgIyBvciBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJICAjIEdDQyB3YW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbnV4LWdudW9sZGxkIGFuZCBsaW51eC1nbnVhb3V0LgorCSAgIyBJZiBsZCBkb2VzIG5vdCBwcm92aWRlICphbnkqICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCisJICAjIHRoYXQgbWVhbnMgaXQgaXMgZ251b2xkbGQuCisJICBlY2hvICIkbGRfaGVscF9zdHJpbmciIHwgZ3JlcCA+L2Rldi9udWxsIDI+JjEgInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKKwkgIHRlc3QgJD8gIT0gMCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIiAmJiBleGl0IDAKKworCSAgY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgIGk/ODYpCisJICAgIFZFTkRPUj1wYzsKKwkgICAgOzsKKwkgICopCisJICAgIFZFTkRPUj11bmtub3duOworCSAgICA7OworCSAgZXNhYworCSAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwkgIGNhdCA+ZHVtbXkuYyA8PEVPRgorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CittYWluKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisjaWZkZWYgX19FTEZfXworIyBpZmRlZiBfX0dMSUJDX18KKyMgIGlmIF9fR0xJQkNfXyA+PSAyCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudVxuIiwgYXJndlsxXSk7CisjICBlbHNlCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7CisjIGVuZGlmCisjZWxzZQorICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251YW91dFxuIiwgYXJndlsxXSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitFT0YKKwkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwkgIHJtIC1mIGR1bW15LmMgZHVtbXkKKwlmaSA7OworIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4gIGVhcmxpZXIgdmVyc2lvbnMKKyMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorICAgIGk/ODY6RFlOSVgvcHR4OjQqOiopCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBpPzg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDAgOzsKKyAgICBpPzg2Oio6NC4qOiogfCBpPzg2OlNZU1RFTV9WOjQuKjoqKQorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWV4aXQgMCA7OworICAgIGk/ODY6Kjo1OjcpCisgICAgICAgVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKyAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisgICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisgICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk1ODYKKyMgNS4wLjRjIHJldHVybnMgIlBlbnQgSUkiLiAgNS4wLjUgcmV0dXJucyBQZW50SUkKKyAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQuKklJJyA+L2Rldi9udWxsKSBcCisgICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk2ODYKKyAgICAgICAoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisgICAgICAgICAgICAgICAmJiBVTkFNRV9NQUNISU5FPWk2ODYKKyAgICAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorICAgICAgIGV4aXQgMCA7OworICAgIGk/ODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudCBJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisgICAgICAgICAgICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYzoqOio6KikKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDAgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCAwIDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgMCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDAgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIE02OCo6KjpSM1ZbNTY3XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OworICAgIG02OCo6THlueE9TOjIuKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgaT84NjpMeW54T1M6Mi4qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDAgOzsKKyAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbmV3cyo6TkVXUy1PUzoqOjYqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDAgOzsKKyAgICBSMzAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSNDAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgMCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgMCA7OworICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYXBwbGUtYmVvcworCWV4aXQgMCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDAgOzsKK2VzYWMKKworI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCisjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCisKK2NhdCA+ZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKKyAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTmVYVCkKKyNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKKyNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKKyNlbmRpZgorICBpbnQgdmVyc2lvbjsKKyAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOworICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyNpZiAhZGVmaW5lZCAodWx0cml4KQorICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiske0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKK3JtIC1mIGR1bW15LmMgZHVtbXkKKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQgMDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzIqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjNCopCisJZWNobyBjNC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgZXNhYworZmkKKworI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCisKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvY29uZmlnLmlmIGIvY29uZmlnLmlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzAyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcuaWYKQEAgLTAsMCArMSw4NyBAQAorIyEgL2Rldi9udWxsCisjIERvbid0IGNhbGwgaXQgZGlyZWN0bHkuIFRoaXMgc2hlbGwgc2NyaXB0IGZyYWdtZW50IGlzIGNhbGxlZCB0bworIyBkZXRlcm1pbmU6CisjCisjCTEuIGxpYnN0Y3h4X2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBsaWJzdGRjKysuCisjCTIuIGN4eF9pbnRlcmZhY2U6IHRoZSBpbnRlcmZhY2UgbmFtZSBmb3IgYysrLgorIwkzLiBsaWJjX2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBsaWJjLgorIworCisjIEdldCB0aGUgdG9wIGxldmVsIHNyYyBkaXIuCitpZiBbIC16ICIke3RvcHNyY2Rpcn0iIC1hIC16ICIke3RvcF9zcmNkaXJ9IiBdCit0aGVuCisgIGVjaG8gIlVuZGVmaW5lZCB0b3AgbGV2ZWwgc3JjIGRpcjogdG9wc3JjZGlyIGFuZCB0b3Bfc3JjZGlyIGFyZSBlbXB0eSIgPiYyCisgIGV4aXQgMQorZmkKKworaWYgWyAtbiAiJHt0b3BzcmNkaXJ9IiBdCit0aGVuCisgIGlmX3RvcHNyY2Rpcj0ke3RvcHNyY2Rpcn0KK2Vsc2UKKyAgaWZfdG9wc3JjZGlyPSR7dG9wX3NyY2Rpcn0KK2ZpCisKK2lmIFsgLWYgJHtpZl90b3BzcmNkaXJ9L2xpYnN0ZGMrKy9NYWtlZmlsZS5pbiBdOyB0aGVuCisjIFdlIGNoZWNrIGxpYnN0ZGMrKyBmb3IgbGlic3RkY3h4X2ludGVyZmFjZS4KK2xpYnN0ZGN4eF9pbnRlcmZhY2U9YGdyZXAgIl5JTlRFUkZBQ0UiICR7aWZfdG9wc3JjZGlyfS9saWJzdGRjKysvTWFrZWZpbGUuaW4gfCBzZWQgJ3MvSU5URVJGQUNFWyAJXSo9WyAJXSpcKC4qXCkvXDEvJ2AKK2Vsc2UKK2xpYnN0ZGN4eF9pbnRlcmZhY2U9CitmaQorCitpZiBbIC1mICR7aWZfdG9wc3JjZGlyfS9nY2MvY3AvTWFrZWZpbGUuaW4gXTsgdGhlbgorIyBXZSBjaGVjayBnY2MvY3AgZm9yIGN4eF9pbnRlcmZhY2UuCitjeHhfaW50ZXJmYWNlPWBncmVwICJeSU5URVJGQUNFIiAke2lmX3RvcHNyY2Rpcn0vZ2NjL2NwL01ha2VmaWxlLmluIHwgc2VkICdzL0lOVEVSRkFDRVsgCV0qPVsgCV0qXCguKlwpL1wxLydgCitlbHNlCitjeHhfaW50ZXJmYWNlPQorZmkKKworIyBUaGUgdHJpY2tpZXN0IHBhcnQgaXMgbGliY19pbnRlcmZhY2UuCitpZiBbIC16ICIke2xpYmNfaW50ZXJmYWNlfSIgXQordGhlbgorICBjYXNlICR7dGFyZ2V0X29zfSBpbgorICAqbGludXgqbGliYzEqfCpsaW51eCpsaWJjNSopCisgICAgY2FzZSAke3RhcmdldF9hbGlhc30gaW4KKyAgICAqYWxwaGEqfCpwb3dlcnBjKikKKyAgICAgIGxpYmNfaW50ZXJmYWNlPS1saWJjNS45LQorICAgICAgOzsKKyAgICAqKQorICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM1LQorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgKmxpbnV4KmdudSopCisgICAgIyBXZSBoYXZlIHRvIHdvcmsgaGFyZGVyIHRvIGZpZ3VyZSBpdCBvdXQuCisgICAgaWYgWyAke3RhcmdldF9hbGlhc30gPSAke2J1aWxkX2FsaWFzfSBdCisgICAgdGhlbgorICAgICAgZHVtbXk9aWYkJAorICAgICAgY2F0ID4kZHVtbXkuYyA8PEVPRgorI2luY2x1ZGUgPGZlYXR1cmVzLmg+ICAgICAgICAgICAgICAgICAgICAgIAorbWFpbihhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsgICAgICAgICAgCisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgcHJpbnRmKCIlZFxuIiwgX19HTElCQ19NSU5PUl9fKTsKKyAgcmV0dXJuIDA7Cit9CitFT0YKKyAgICAgICR7Q0MtY2N9ICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbAorICAgICAgaWYgWyAiJD8iID0gMCBdCisgICAgICB0aGVuCisJbGliY19pbnRlcmZhY2U9LWxpYmM2LmAuLyRkdW1teWAtCisJcm0gLWYgJGR1bW15LmMgJGR1bW15CisgICAgICBlbHNlCisJIyBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLgorCWVjaG8gIkNhbm5vdCBmaW5kIHRoZSBHTlUgQyBsaWJyYXJ5IG1pbm9yIHZlcnNpb24gbnVtYmVyLiIgPiYyCisJcm0gLWYgJGR1bW15LmMgJGR1bW15CisJZXhpdCAxCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgICMgQ3Jvc3MgY29tcGlsaW5nLiBBc3N1bWUgZ2xpYmMgMi4xLgorICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM2LjEtCisgICAgZmkKKyAgICA7OworICAqKQorICAgIGxpYmNfaW50ZXJmYWNlPS0KKyAgICA7OworICBlc2FjCitmaQpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q0ZjVmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxMjkyIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdCwgdmVyc2lvbiAxLjEuCisjICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5Mi05NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgorIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCisjIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCitpZiBbIHgkMSA9IHggXQordGhlbgorCWVjaG8gQ29uZmlndXJhdGlvbiBuYW1lIG1pc3NpbmcuIDE+JjIKKwllY2hvICJVc2FnZTogJDAgQ1BVLU1GUi1PUFNZUyIgMT4mMgorCWVjaG8gIm9yICAgICAkMCBBTElBUyIgMT4mMgorCWVjaG8gd2hlcmUgQUxJQVMgaXMgYSByZWNvZ25pemVkIGNvbmZpZ3VyYXRpb24gdHlwZS4gMT4mMgorCWV4aXQgMQorZmkKKworIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCitjYXNlICQxIGluCisJKmxvY2FsKikKKwkJZWNobyAkMQorCQlleGl0IDAKKwkJOzsKKwkqKQorCTs7Citlc2FjCisKKyMgQ1lHTlVTIExPQ0FMIG1hcmtldGluZy1uYW1lcworIyBIZXJlIHdlIGhhbmRsZSBhbnkgIm1hcmtldGluZyIgbmFtZXMgLSB0cmFuc2xhdGluZyB0aGVtIHRvCisjICBzdGFuZGFyZCB0cmlwbGV0cworY2FzZSAkMSBpbiAKKwltaXBzLXR4MzktZWxmKQorCQlzZXQgbWlwc3R4MzktdW5rbm93bi1lbGYKKyAgICAgICAgICAgICAgICA7OworCSopCisJCTs7Citlc2FjCisjIEVORCBDWUdOVVMgTE9DQUwgbWFya2V0aW5nLW5hbWVzCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIGxpbnV4LWdudSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQgKQkjIEVHQ1MgTE9DQUwKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCQkJCQkJIyBFR0NTIExPQ0FMCisJCTs7CisJLXdycykJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJb3M9dnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJdGFob2UgfCBpODYwIHwgbTMyciB8IG02OGsgfCBtNjgwMDAgfCBtODhrIHwgbnMzMmsgfCBhcmMgfCBhcm0gXAorCQl8IGFybWVbbGJdIHwgcHlyYW1pZCB8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwkJfCB0cm9uIHwgYTI5ayB8IDU4MCB8IGk5NjAgfCBoODMwMCBcCisJCXwgaHBwYSB8IGhwcGExLjAgfCBocHBhMS4xIHwgaHBwYTIuMCB8IGhwcGEyLjB3IHwgaHBwYTIuMG4gXAorCQl8IGFscGhhIHwgYWxwaGFldls0NTY3OF0gfCBhbHBoYWV2NTYgfCBhbHBoYXBjYTVbNjddIFwKKwkJfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciB8IGkzNzAgfCBzaCB8IHBvd2VycGMgfCBwb3dlcnBjbGUgXAorCQl8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIFwKKwkJfCBtaXBzNjQgfCBtaXBzZWwgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHNwYXJjODZ4IHwgdjg1MCBcCisJCXwgYzR4KQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltODgxMTAgfCBtNjgwWzAxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB6OGsgfCB2NzAgXAorCQl8IGg4NTAwIHwgdzY1IHwgZnIzMCB8IG1jb3JlKSAjIENZR05VUyAvIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJc3Ryb25nYXJtKSAjIENZR05VUyBMT0NBTCBuaWNrYy9zdHJvbmdhcm0KKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJdGh1bWIpCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworICAgICAgICAjIENZR05VUyBMT0NBTCB2cjQxMTEvZ2F2aW4KKwltaXBzNjR2cjQxMTEgfCBtaXBzNjR2cjQxMTFlbCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisgICAgICAgICMgRU5EIENZR05VUyBMT0NBTCB2cjQxMTEvZ2F2aW4KKwltaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCkgIyBFR0NTIExPQ0FMIGpzbWl0aC92cjQzMDAKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwpICMgRUdDUyBMT0NBTCBqc21pdGgvdnI0MTAwCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsKSAjIEVHQ1MgTE9DQUwgaWFuL3ZyNTAwMAorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltaXBzMTYpCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCXRpYzMwKSAjIENZR05VUyBMT0NBTCBpYW4vdGljMzAKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJYzMwKSAjIENZR05VUyBMT0NBTCBpYW4vdGljMzAKKwkJYmFzaWNfbWFjaGluZT10aWMzMC11bmtub3duCisJCTs7CisKKwl0aWM4MCkJCQkJIyBDWUdOVVMgTE9DQUwgZm5mL1RJYzgwCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCXY4NTBlKQkJCQkjIENZR05VUyBMT0NBTCBqdGMvdjg1MAorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwl2ODUwZWEpCQkJCSMgQ1lHTlVTIExPQ0FMIGp0Yy92ODUwCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCWQxMHYpCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCWQzMHYpCQkJCSMgQ1lHTlVTIExPQ0FMIGh1bnQvZDMwdgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpWzM0NTY3XTg2KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwl2YXgtKiB8IHRhaG9lLSogfCBpWzM0NTY3XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCisJICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKKwkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaTk2MC0qIFwKKwkgICAgICB8IHhtcC0qIHwgeW1wLSogXAorCSAgICAgIHwgaHBwYS0qIHwgaHBwYTEuMC0qIHwgaHBwYTEuMS0qIFwKKwkgICAgICB8IGhwcGEyLjAtKiB8IGhwcGEyLjB3LSogfCBocHBhMi4wbi0qIFwKKwkgICAgICB8IGFscGhhLSogfCBhbHBoYWV2WzQ1Njc4XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYXBjYTVbNjddLSogXAorCSAgICAgIHwgd2UzMmstKiB8IGN5ZHJhLSogfCBuczE2ay0qIHwgcG4tKiB8IG5wMS0qIFwKKwkgICAgICB8IHhwczEwMC0qIHwgY2xpcHBlci0qIHwgb3Jpb24tKiBcCisJICAgICAgfCBzcGFyY2xpdGUtKiB8IHBkcDExLSogfCBzaC0qIHwgcG93ZXJwYy0qIHwgcG93ZXJwY2xlLSogXAorCSAgICAgIHwgc3BhcmM2NC0qIHwgc3BhcmN2OS0qIHwgc3BhcmM4NngtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAorCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogIFwKKwkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCSAgICAgIHwgZjMwMS0qIHwgYXJtKi0qIFwKKwkgICAgICB8IGZyMzAtKiB8IG1jb3JlLSopICMgQ1lHTlVTIExPQ0FMCisJCTs7CisJbTg4MTEwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM/Mi0qIHwgbTY4MzYwLSogfCB6OGstKiB8IGg4NTAwLSogfCBkMTB2LSopICMgRUdDUyBMT0NBTAorCQk7OworCXN0cm9uZ2FybS0qKSAjIENZR05VUyBMT0NBTCBuaWNrYy9zdHJvbmdhcm0KKwkJOzsKKwl0aHVtYi0qKSAjIEVHQ1MgTE9DQUwgYW5nZWxhL3RodW1iCisJCTs7CisJdjg1MC0qKSAjIEVHQ1MgTE9DQUwKKwkgICAgICAgIDs7CisJdjg1MGUtKikgIyBDWUdOVVMgTE9DQUwKKwkgICAgICAgIDs7CisJdjg1MGVhLSopICMgQ1lHTlVTIExPQ0FMCisJICAgICAgICA7OworCWQzMHYtKikgIyBFR0NTIExPQ0FMCisJICAgICAgICA7OworICAgICAgICAjIENZR05VUyBMT0NBTCB2cjQxMTEvZ2F2aW4KKwltaXBzNjR2cjQxMTEtKiB8IG1pcHM2NHZyNDExMWVsLSopCisJCTs7CisgICAgICAgICMgRU5EIENZR05VUyBMT0NBTCB2cjQxMTEvZ2F2aW4KKwltaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSopICMgRUdDUyBMT0NBTCBqc21pdGgvdnI0MzAwCisJCTs7CisJbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qKSAjIEVHQ1MgTE9DQUwganNtaXRoL3ZyNDEwMAorCQk7OworCW1pcHMxNi0qKSAjIEVHQ1MgTE9DQUwga3JrL21pcHMxNgorCQk7OworCXRpYzMwLSopICMgRUdDUyBMT0NBTCBpYW4vdGljMzAKKwkJOzsKKwljMzAtKikgIyBFR0NTIExPQ0FMIGlhbi90aWMzMAorCQliYXNpY19tYWNoaW5lPXRpYzMwLXVua25vd24KKwkJOzsKKwl0aWM4MC0qKQkJCQkJCSMgQ1lHTlVTIExPQ0FMIGZuZi9USWM4MAorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTM4NmJzZCkJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LWJzZAorCQk7OworCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYTI5a2hpZikJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhZG9iZTY4aykJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCB5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXkyKQorCQliYXNpY19tYWNoaW5lPWNyYXkyLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCVtjdGpdOTAtY3JheSkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworICAgICAgICB3ODlrLSopCQkJCQkJIyBFR0NTIExPQ0FMCisgICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKyAgICAgICAgICAgICAgICBvcz0tcHJvZWxmCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgb3A1MG4tKikJCQkJCSMgRUdDUyBMT0NBTAorICAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKyAgICAgICAgICAgICAgICBvcz0tcHJvZWxmCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgb3A2MGMtKikJCQkJCSMgRUdDUyBMT0NBTAorICAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKyAgICAgICAgICAgICAgICBvcz0tcHJvZWxmCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgaHBwcm8pCQkJCQkJIyBFR0NTIExPQ0FMCisgICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisgICAgICAgICAgICAgICAgb3M9LXByb2VsZgorICAgICAgICAgICAgICAgIDs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldICkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldICkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0gKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBcCisJaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzICkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0gKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQkJCQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpWzM0NTY3XTg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWlbMzQ1NjddODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpWzM0NTY3XTg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaVszNDU2N104NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpMzg2bWFjaCkJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tdnN0YQorCQk7OworCWkzODYtZ28zMiB8IGdvMzIpCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tZ28zMgorCQk7OworCWkzODYtbWluZ3czMiB8IG1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1taW5ndzMyCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCW1pcHNlbCotbGludXgqKQorCQliYXNpY19tYWNoaW5lPW1pcHNlbC11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwltaXBzKi1saW51eCopCisJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQkJCQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltc2RvcykJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24JCisJCW9zPS1tc2RvcworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgkJIyBFR0NTIExPQ0FMCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLWNvcmVsCisJCW9zPS1saW51eAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmVjdjcwKQkJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW1vbjk2MCkJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1tb245NjAKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkJCQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKyAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBuZXhlbikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgazYgfCA2eDg2KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtaWkgfCBwZW50aXVtMikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBuZXhlbi0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgazYtKiB8IDZ4ODYtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qKQorCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJICAgICAgICA7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXJvbTY4aykJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzYTI5MjAwKQkJCQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc3BhcmNsaXRlLXdycykJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkJCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKyAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisgICAgICAgICAgICAgICA7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikJCQkJCQkjIEVHQ1MgTE9DQUwKKyAJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworIAkJb3M9LW5vbmUKKwkJOzsKKwl4bXApCisJCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworICAgICAgICB4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXo4ay0qLWNvZmYpCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCQkJCQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCQkJCQkJIyBFR0NTIExPQ0FMCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW1pcHMpCisJCWlmIFsgeCRvcyA9IHgtbGludXgtZ251IF07IHRoZW4KKwkJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCisJCWVsc2UKKwkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCWZpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjkpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisgICAgICAgIGN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCQkJCSMgRUdDUyBMT0NBTAorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKKwkJOzsKKyAJYzR4KikKKyAJCWJhc2ljX21hY2hpbmU9YzR4LW5vbmUKKyAJCW9zPS1jb2ZmCisgIAkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCisJICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKKwkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiApCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCSMgRUdDUyBMT0NBTAorCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8ICAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1vbjk2MCogfCAtbG5ld3MqICkKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCSMgRU5EIEVHQ1MgTE9DQUwKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktMzg2YnNkKQkJCQkJIyBFR0NTIExPQ0FMCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbnMyICkKKwkgICAgICAgIG9zPS1uZXh0c3RlcDIKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQkJCQkJCSMgRUdDUyBMT0NBTAorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCQkJCQkjIEVHQ1MgTE9DQUwKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1jb3JlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykJCQkJCSMgRUdDUyBMT0NBTAorCQlvcz0tYW91dAorCQk7OworCW1pcHMqLWNpc2NvKQkJCQkJIyBFR0NTIExPQ0FMCisJCW9zPS1lbGYKKwkJOzsKKyAgICAgICAgbWlwcyotKikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFR0NTIExPQ0FMCisgICAgICAgICAgICAgICAgb3M9LWVsZgorICAgICAgICAgICAgICAgIDs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLXdlYykJCQkJCQkjIEVHQ1MgTE9DQUwKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkJCQkJCSMgRUdDUyBMT0NBTAorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCQkJCQkJIyBFR0NTIExPQ0FMCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKyAgICAgICAgKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworICAgICAgICAqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKyAgICAgICAgKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwMS1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQkJCQkJIyBFR0NTIExPQ0FMCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQkJCQkJCSMgRUdDUyBMT0NBTAorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCQkJCQkjIEVHQ1MgTE9DQUwKKwkJb3M9LW1hY29zCisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikJCQkJIyBFR0NTIExPQ0FMCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQkJIyBFR0NTIExPQ0FMCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCmRpZmYgLS1naXQgYS9jb25maWcvQ2hhbmdlTG9nIGIvY29uZmlnL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDZmYzYwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL0NoYW5nZUxvZwpAQCAtMCwwICsxLDM5MiBAQAorMTk5OS0wNC0wNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIG10LWQzMHY6IE5ldyBmaWxlLCBwYXNzIC1nIC1PcyAtV2EsLUMgYXMgZGVmYXVsdCBvcHRpb25zLgorCisxOTk5LTAyLTA4ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+CisKKwkqIGFjaW5jbHVkZS5tNDogQWRkZWQgbWFjcm9zIHRvIGZpbmQgaXRjbCBmaWxlcy4KKwlFeHBvcnQgVENMX0NGTEFHUyBmcm9tIHRjbENvbmZpZy5zaC4KKwlFeHBvcnQgVENMX0xJQl9GVUxMX1BBVEgsIFRLX0xJQl9GVUxMX1BBVEgsIElUQ0xfTElCX0ZVTExfUEFUSCwKKwlJVEtfTElCX0ZVTExfUEFUSCwgYW5kIFRJWF9MSUJfRlVMTF9QQVRICisJUmVwbGFjZSBUSVggbWFjcm9zIHdpdGggYmV0dGVyIG9uZXMgZnJvbSBzbmF2aWdhdG9yLgorCitUdWUgRmViICAyIDIyOjUxOjIxIDE5OTkgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KKworCSogbWgtYXJtcGljOiBOZXcgZmlsZS4gIFBhdGNoIGZyb20gSmltIFBpY2sgPGppbUBqaW1waWNrLmNvbT4uCisJKiBtdC1hcm1waWM6IExpa2V3aXNlLgorCitNb24gSmFuIDE4IDE5OjQxOjA4IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGN5Z3dpbi5taDogQWN0aXZhdGUgY29tbWVudGVkIG91dCBkZXBlbmRlbmNpZXMgZm9yCisJZ2RiOiBsaWJ0ZXJtY2FwLgorCitXZWQgTm92IDE4IDIwOjI5OjQ2IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGN5Z3dpbi5taDogQWRkIGV4dHJhIGxpYnRlcm1jYXAgdGFyZ2V0IGluZm9ybWF0aW9uLgorCUFkZCBjb21tZW50ZWQgb3V0IGRlcGVuZGVuY3kgZm9yIGdkYiB0byBsaWJ0ZXJtY2FwIGZvcgorCWZ1dHVyZSByZWFkbGluZSByZXF1aXJlbWVudC4KKworTW9uIE5vdiAgMiAxNToxNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogbWgtY3lnd2luMzI6IGRlbGV0ZQorICAgICAgICAqIG1oLWN5Z3dpbjogd2FzIG1oLWN5Z3dpbjMyCisKKzE5OTgtMTAtMjYgIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KKworCSogYWNpbmNsdWRlLm00OiBUQ0xIRElSIGFuZCBUS0hESVIgbmVlZCB0byBiZSBydW4gdGhyb3VnaAorCWN5Z3BhdGggZm9yIE1pY3Jvc29mdCBidWlsZHMuCisKKzE5OTgtMTAtMjAgIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KKworCSogYWNpbmNsdWRlLm00OiBSZS1leHBvcnRlZCBUQ0xfTElCUyBhbmQgVENMX0xEX1NFQVJDSF9GTEFHUworCWJlY2F1c2UgaXRjbCBuZWVkcyB0aGVtLgorCitNb24gQXVnIDMxIDE3OjUwOjUzIDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgorCisJKiBtaC1haXg0MyAoTk1fRk9SX1RBUkdFVCk6IEFkZCAtWDMyXzY0IGFzIHdlbGwuCisKK1NhdCBBdWcgMjkgMTQ6MzI6NTUgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+CisKKwkqIG1oLWFpeDQzOiBOZXcgZmlsZS4KKworTW9uIEF1ZyAxMCAwMDoxNTo0NyAxOTk4ICBISiBMdSAoaGpsQGdudS5vcmcpCisKKwkqIG10LWxpbnV4IChDWFhGTEFHU19GT1JfVEFSR0VUKTogQWRkIC1EX0dOVV9TT1VSQ0UuCisKKzE5OTgtMDUtMjkgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+CisKKwkqIGFjaW5jbHVkZS5tNDogTmV3IGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBhdXRvY29uZiBtYWNyb3MuCisJCitXZWQgQXByIDIyIDEyOjI0OjI4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBtdC1vc3BhY2U6IE5ldyBmaWxlLCBzdXBwb3J0IHVzaW5nIC1PcyBpbnN0ZWFkIG9mIC1PMiB0byBjb21waWxlCisJdGhlIGxpYnJhcmllcy4KKworV2VkIEFwciAyMiAxMDo1MzoxNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbXQtbGludXggKENYWEZMQUdTX0ZPUl9UQVJHRVQpOiBTZXQgdGhpcyBpbnN0ZWFkIG9mIENYWEZMQUdTLgorCitTYXQgQXByIDExIDIyOjQzOjE3IDE5OTggIEouIEtlYW4gSm9obnN0b24gIDxqa2pAc2NvLmNvbT4KKworCSogbWgtc3ZzdjU6IE5ldyBmaWxlIC0gc3VwcG9ydCBmb3IgU0NPIFVuaXhXYXJlIDcgLyBTVlI1LgorCitUaHUgTWFyIDI2IDAxOjU0OjI1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIG1oLWN5Z3dpbjMyOiBzdG9wIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBkb3NyZWwuCisKK1RodSBTZXAgMTEgMTY6NDM6MjcgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBtaC1lbGZhbHBoYXBpYywgbXQtZWxmYWxwaGFwaWM6IE5ldyBmaWxlcy4KKworV2VkIEp1bCAyMyAxMjozMjoxOCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+CisKKwkqIG1oLWdvMzIgKENGTEFHUyk6IERvbid0IHNldCAtZm5vLW9taXQtZnJhbWUtcG9pbnRlci4KKworTW9uIEp1biAxNiAxOTowNjo0MSAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBtaC1wcGNwaWM6IE5ldyBmaWxlLgorCSogbXQtcHBjcGljOiBOZXcgZmlsZS4KKworVGh1IE1hciAyNyAxNTo1Mjo0MCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBtaC1jeWd3aW4zMjogb3ZlcnJpZGUgQ1hYRkxBR1MsIHNldHRpbmcgdG8gLU8yIG9ubHkKKwkobm8gZGVidWcpCisKK1R1ZSBNYXIgMjUgMTg6MTY6NDMgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogbWgtY3lnd2luMzI6IG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGRlYnVnIGluZm8KKwlpc24ndCBpbmNsdWRlZCBpbiBjeWd3aW4zMi1ob3N0ZWQgbGliZ2NjMi5hIGJ5IGRlZmF1bHQKKworV2VkIEphbiAgOCAxOTo1Njo0MyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogbWgtY3lnd2luMzI6IG92ZXJyaWRlIENGTEFHUyBzbyBkZWJ1ZyBpbmZvIGlzbid0IGluY2x1ZGVkCisgICAgICAgIGluIGN5Z3dpbjMyLWhvc3RlZCB0b29scyBieSBkZWZhdWx0CisKK1R1ZSBEZWMgMzEgMTY6MDQ6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaC1saW51eDogUmVtb3ZlLgorCitNb24gTm92IDExIDEwOjI5OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogbXQtcHBjOiBEZWxldGUgZmlsZSwgb3B0aW9ucyBtb3ZlZCB0byBuZXdsaWIgY29uZmlndXJlLgorCitGcmkgT2N0ICA0IDEyOjIxOjAzIDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBtaC1kZ3V4Mzg2OiBOZXcgZmlsZS4gIHg4NiBkZ3V4IHNwZWNpZmljIGZsYWdzCisKK01vbiBTZXAgMzAgMTU6MTA6MDcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWgtbXB3IChFWFRSQUxJQlNfUFBDX1hDT0ZGKTogTmV3LCB3YXMgRVhUUkFMSUJTX1BQQy4KKwkoRVhUUkFMSUJTX1BQQyk6IFVzZSBzaGFyZWQgbGlicmFyaWVzIGluc3RlYWQgb2YgeGNvZmYuCisKK1NhdCBBdWcgMTcgMDQ6NTY6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAc2thcm8uY3lnbnVzLmNvbT4KKworCSogbWgtY3lnd2luMzI6IGRvbid0IC1EX1dJTjMyIGhlcmUgYW55bW9yZQorCitUaHUgQXVnIDE1IDE5OjQ2OjQ0IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1oLW1wdyAoU0VHRkxBR182OEssIFNFR0ZMQUdfUFBDKTogUmVtb3ZlLgorCShFWFRSQUxJQlNfUFBDKTogQWRkIGxpYmdjYy54Y29mZi4KKworVGh1IEF1ZyAgOCAxNDo1MTo0NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG10LXBwYzogTmV3IGZpbGUsIGFkZCAtbXJlbG9jYXRhYmxlLWxpYiBhbmQgLW1uby1lYWJpIHRvIGFsbAorCXRhcmdldCBidWlsZHMgZm9yIFBvd2VyUEMgZWFiaSB0YXJnZXRzLgorCitGcmkgSnVsIDEyIDEyOjA2OjAxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3OiBOZXcgc3ViZGlyLCBNYWMgTVBXIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBiaXRzLgorCitNb24gSnVsICA4IDE3OjMwOjUyIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogbWgtaXJpeDY6IE5ldyBmaWxlLgorCitNb24gSnVsICA4IDE1OjE1OjM3IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogbXQtc3BhcmNwaWMgKFBJQ0ZMQUdfRk9SX1RBUkdFVCk6IFVzZSAtZlBJQy4KKworRnJpIEp1bCAgNSAxMTo0OTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1oLWlyaXg0IChSQU5MSUIpOiBEb24ndCBkZWZpbmU7IElyaXggNCBkb2VzIGhhdmUgcmFubGliLgorCitTdW4gSnVuIDIzIDIyOjU5OjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIG1oLWN5Z3dpbjMyOiBuZXcgZmlsZS4gIExpa2UgbWgtZ28zMiB3aXRob3V0IHRoZSBDRkxBR1MgZW50cnkuCisKK1R1ZSBNYXIgMjYgMTQ6MTA6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaC1nbzMyIChDRkxBR1MpOiBEZWZpbmUuCisKK1RodSBNYXIgMTQgMTk6MjA6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaC1uZWN2NDogTmV3IGZpbGUuCisKK1RodSBGZWIgMTUgMTM6MDc6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaC1jeHV4IChDQyk6IE5ldyB2YXJpYWJsZS4KKwkoQ0ZMQUdTLCBMREZMQUdTKTogUmVtb3ZlLgorCSogbWgtbmNyc3ZyNDMgKENDKTogTmV3IHZhcmlhYmxlLgorCShDRkxBR1MpOiBSZW1vdmUuCisJKiBtaC1zb2xhcmlzIChDRkxBR1MpOiBSZW1vdmUuCisKKwkqIG1oLWdvMzI6IFJlbW92ZSBtb3N0IHZhcmlhYmxlIHNldHRpbmdzLCBzaW5jZSB0aGV5IHByZXN1bWVkIGEKKwlDYW5hZGlhbiBDcm9zcywgd2hpY2ggaXMgbm93IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBjb25maWd1cmUKKwlzY3JpcHQuCisKKwkqIG1oLXNwYXJjcGljIChQSUNGTEFHKTogU2V0IHRvIC1mUElDLCBub3QgLWZwaWMuCisKK01vbiBGZWIgMTIgMTQ6NTM6MzkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG1oLW02OGtwaWMsIG10LW02OGtwaWM6IE5ldyBmaWxlcy4KKworVGh1IEZlYiAgMSAxNDoxNTo0MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1taC1tcHcgKENDX01XQzY4Syk6IEFkZCBvcHRpb25zIHNpbWlsYXIgdG8gdGhvc2UgdXNlZAorCWluIENDX01XQ1BQQywgYW5kIC1tYzY4MDIwIC1tb2RlbCBmYXIuCisJKEFSX01XTElOSzY4Syk6IEFkZCAteG0gbGlicmFyeS4KKwkoQVJfQVIpOiBEZWZpbmUuCisJKENDX0xEX01XTElOSzY4Syk6IFJlbW92ZSAtZC4KKwkoRVhUUkFMSUJTX01XQzY4Syk6IERlZmluZS4KKworVGh1IEphbiAyNSAxNjowNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1oLW5jcnN2cjQzIChDRkxBR1MpOiBSZW1vdmUgLUhub2NvcHlyLgorCitUdWUgTm92ICA3IDE1OjQxOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1oLW1wdyAoQ0NfTVdDNjhLLCBDQ19NV0NQUEMpOiBSZW1vdmUgdW51c2VkIGluY2x1ZGUgcGF0aC4KKwkoQ0NfTVdDUFBDKTogQWRkIC1tcHdfY2hhcnMsIGRpc2FibGUgd2FybmluZ3MsIGFkZCBjb21tZW50cworCWV4cGxhaW5pbmcgcmVhc29ucyBmb3IgdmFyaW91cyBmbGFncy4KKwkoRVhUUkFMSUJTX1BQQywgRVhUUkFMSUJTX01XQ1BQQyApOiBQdXQgcnVudGltZSBsaWJyYXJ5IGZpcnN0LgorCQorRnJpIE9jdCAxMyAxNDo0NDoyNSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogbWgtYWl4LCBtaC1zdW46ICBSZW1vdmVkLgorCisJKiBtaC1kZWNzdGF0aW9uIChYMTFfRVhUUkFfQ0ZMQUdTKTogRGVmaW5lLgorCisJKiBtaC1zY28sIG1oLXNvbGFyaXMsIG1oLXN5c3Y0IChYMTFfRVhUUkFfTElCUyk6IERlZmluZS4KKworICAgICAgICAqIG1oLWhwMzAwLCBtaC1ocHV4LCBtaC1ocHV4OCwgbWgtc29sYXJpcywgbWgtc3VuMywgbWgtc3lzdjQ6IERvbid0IAorCWhhcmRjb2RlIGxvY2F0aW9uIG9mIFggc3R1ZmYgaGVyZS4KKworVGh1IFNlcCAyOCAxMzoxNDo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1taC1tcHc6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyA2OEsgYW5kIFBvd2VyTWFjCisJY29tcGlsZXJzLCBhZGQgZGVmaW5pdGlvbnMgZm9yIGxpYnJhcnkgYW5kIGxpbmsgc3RlcHMgZm9yCisJUG93ZXJNYWNzLgorCitUaHUgU2VwIDE0IDA4OjIwOjA0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBtaC1ocDMwMCAoQ0MpOiBBZGQgIkNDID0gY2MgLVdwLC1IMjU2MDAwIiB0byBhdm9pZAorCSJ0b28gbXVjaCBkZWZpbmluZyIgZXJyb3JzIGZyb20gdGhlIEhQVVggY29tcGlsZXIuCisKK1RodSBBdWcgMTcgMTc6Mjg6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBtaC1ocDMwMCAoUkFOTElCKTogVXNlICJhciB0cyIsIGluIGNhc2UgR05VIGFyIHdhcyB1c2VkIGFuZAorCWRpZG4ndCBidWlsZCBhIHN5bWJvbCB0YWJsZS4KKworVGh1IEp1biAyMiAxNzo0NzoyNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1taC1tcHcgKENDKTogRGVmaW5lIEFOU0lfUFJPVE9UWVBFUy4KKworTW9uIEFwciAxMCAxMjoyOTo0OCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1taC1tcHcgKEVYVFJBTElCUyk6IEFsd2F5cyBsaW5rIGluIE1hdGgubywgQ1NBTkVMSUIubywKKyAgICAgICAgYW5kIFRvb2xMaWJzLm8uCisKKwkqIG1wdy1taC1tcHcgKENDKTogRGVmaW5lIEFMTU9TVF9TVERDLgorCShDRkxBR1MpOiBSZW1vdmUgQUxNT1NUX1NUREMsIC1tYzY4ODgxLgorCShMREZMQUdTKTogYWRkIC13LgorCisJKiBtcHctbWgtbXB3IChDRkxBR1MpOiBBZGQgLWIgb3B0aW9uIHRvIHB1dCBzdHJpbmdzIGF0IHRoZSBlbmRzIG9mCisJZnVuY3Rpb25zLgorCisJKiBtcHctbWgtbXB3OiBOZXcgZmlsZSwgaG9zdCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmb3IgTVBXLgorCitGcmkgTWFyIDMxIDExOjM1OjE3IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIG10LW5ldHdhcmU6IE5ldyBmaWxlLgorCitNb24gTWFyIDEzIDEyOjMxOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWgtaHB1eDg6IE5ldyBmaWxlLgorCSogbWgtaHB1eDogVXNlIFgxMVI1IHJhdGhlciB0aGFuIFgxMVI0LgorCitUaHUgRmViICA5IDExOjA0OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWgtbGludXggKFNZU1YpOiBEb24ndCBkZWZpbmUuCisJKFJBTkxJQik6IERvbid0IGRlZmluZS4KKworV2VkIEphbiAxMSAxNjoyOTozNCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogbT8tKnBpYyAoTElCQ1hYRkxBR1MpOiBBZGQgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMuCisKK1RodSBOb3YgIDMgMTc6Mjc6MTkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbWgtaXJpeDQgKENDKTogSW5jcmVhc2UgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLgorCisJKiBtaC1zY28gKENDKTogRGVmaW5lIGF3YXkgY29uc3QsIGl0IGRvZXNuJ3Qgd29yayByaWdodDsgZWxlbWVudHMKKwlvZiBhcnJheXMgb2YgcHRyLXRvLWNvbnN0IGFyZSBjb25zaWRlcmVkIGNvbnN0IHRoZW1zZWx2ZXMuCisKK1NhdCBKdWwgMTYgMTI6MTc6NDkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBtaC1jeHV4OiBOZXcgZmlsZSwgZnJvbSBCb2IgUnVzayAocnJ1c2tAbWFpbC5jc2QuaGFycmlzLmNvbSkuCisKK1NhdCBKdW4gIDQgMTc6MjI6MTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIG1oLW5jcnN2cjQzOiAgTmV3IGZpbGUgZnJvbSBUb20gTWNDb25uZWxsCisJPHRtY2Nvbm5lQHNlZG9uYS5pbnRlbC5jb20+LgorCitUaHUgTWF5IDE5IDAwOjMyOjExIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBtaC1ocHV4IChDQyk6IEFkZCAtV3AsLUgyNTYwMDAgdG8gYXZvaWQgInRvbyBtdWNoIGRlZmluaW5nIgorCWVycm9ycyBmcm9tIHRoZSBIUFVYIDggY29tcGlsZXJzLgorCitXZWQgTWF5ICA0IDIwOjE0OjQ3IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogbWgtbHlueHJzNms6IHNldCBTSEVMTCB0byAvYmluL2Jhc2gKKworVHVlIEFwciAxMiAxMjozODoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1oLWlyaXg0IChDQyk6IENoYW5nZSAtWE5oMTUwMCB0byAtWE5oMjAwMC4KKworU2F0IERlYyAyNSAyMDowMzo0NSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogbXQtaHBwYTogRGVsZXRlLgorCitUdWUgTm92IDE2IDIyOjU0OjM5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtaC1hNjhic2Q6IERlZmluZSBDQyB0byBnY2MuCisKK01vbiBOb3YgMTUgMTY6NTY6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1oLWxpbnV4OiBEb24ndCBwdXQgLXN0YXRpYyBpbiBMREZMQUdTLiAgQWRkIGNvbW1lbnRzLgorCitNb24gTm92IDE1IDEzOjM3OjU4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogbWgtc3lzdjQgKEFSX0ZMQUdTKTogY2hhbmdlIGZyb20gY3EgdG8gY3IKKworRnJpIE5vdiAgNSAwODoxMjozMiAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGJsdWVzLmN5Z251cy5jb20pCisKKwkqIG1oLXVuaXh3YXJlOiByZW1vdmUuICBJdCdzIHRoZSBzYW1lIGFzIHN5c3Y0LCBhbmQgY29uZmlnLmd1ZXNzCisJY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZS4gIFNvIGRvbid0IGFsbG93IHNrZXcuCisKK1dlZCBPY3QgMjAgMjA6MzU6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1oLWhwMzAwOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLCBidXQgYWRkIGNvbW1lbnQgZXhwbGFpbmluZy4KKworVHVlIE9jdCAxOSAxODo1ODoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWgtaHAzMDA6IERvbid0IGRlZmluZSBDRkxBR1MgdG8gZW1wdHkuICBXaHkgc2hvdWxkIGhwMzAwIGJlCisJZGlmZmVyZW50IGZyb20gYW55dGhpbmcgZWxzZT8gICgiZ2RiIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgbmF0aXZlCisJZGVidWcgZm9ybWF0IiBpc24ndCBhIGdvb2QgZW5vdWdoIGFuc3dlciBiZWNhdXNlIHdlIG1pZ2h0IGJlIHVzaW5nCisJZ2NjKS4KKworVHVlIE9jdCAgNSAxMjoxNzo0MCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1oLWFscGhhb3NmOiBSZW1vdmUsIG5vIGxvbmdlciBuZWNlc3Nhcnkgbm93IHRoYXQgZ2RiIGtub3dzCisJaG93IHRvIGhhbmRsZSBPU0YvMSBzaGFyZWQgbGlicmFyaWVzLgorCitUdWUgSnVsICA2IDExOjI3OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIG1oLWFscGhhb3NmOiBOZXcgZmlsZS4KKworVGh1IEp1bCAgMSAxNTo0OTozMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWgtcmlzY29zOiBOZXcgZmlsZS4KKworTW9uIEp1biAxNCAxMjowMzoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIG1oLWFpeCwgbWgtYWl4Mzg2LCBtaC1kZWNzdGF0aW9uLCBtaC1kZWx0YTg4LCBtaC1ocHV4LCBtaC1pcml4NCwKKwltaC1uY3IzMDAwLCBtaC1zb2xhcmlzLCBtaC1zeXN2LCBtaC1zeXN2NDogcmVtb3ZlIElOU1RBTEw9Y3AgbGluZSwKKwlub3cgdGhhdCB3ZSdyZSB1c2luZyBpbnN0YWxsLnNoIGdsb2JhbGx5CisKK0ZyaSBKdW4gIDQgMTY6MDk6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaC1zeXN2NCAoSU5TVEFMTCk6IFVzZSBjcCwgbm90IC91c3IvdWNiL2luc3RhbGwuCisKK1RodSBBcHIgIDggMTE6MjE6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtdC1hMjlrLCBtdC1lYm1vbjI5aywgbXQtb3M2OGssIG10LW9zZTY4MDAwLCBtdC1vc2U2OGssCisJbXQtdnh3b3JrczY4LCBtdC12eHdvcmtzOTYwOiBSZW1vdmVkIG9ic29sZXRlLCB1bnVzZWQgdGFyZ2V0CisJTWFrZWZpbGUgZnJhZ21lbnQgZmlsZXMuCisKK01vbiBNYXIgIDggMTU6MDU6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBtaC1haXgzODY6IE5ldyBmaWxlOyBvbGQgbWgtYWl4LCBwbHVzIG5vLW9wIFJBTkxJQi4KKworVGh1IE9jdCAgMSAxMzo1MDo0OCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIG1oLXNvbGFyaXM6IElOU1RBTEwgaXMgTk9UIC91c3IvdWNiL2luc3RhbGwKKworTW9uIEF1ZyAyNCAxNDoyNTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG10LW9zZTY4MDAwLCBtdC1vc2U2OGs6IHJlbmFtZWQgZnJvbSBtdC1PU0UqLgorCitUdWUgSnVsIDIxIDAyOjExOjAxIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogbXQtT1NFNjhrLCBtdC02ODAwMDA6IG5ldyBjb25maWdzLgorCitUaHUgSnVsIDE2IDE3OjEyOjA5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogbWgtaXJpeDQ6IG1lcmdlZCBjaGFuZ2VzIGZyb20gcHJvZ3Jlc3NpdmUuCisKK1R1ZSBKdW4gIDkgMjM6Mjk6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBFdmVyeXdoZXJlOiBDaGFuZ2UgUkFOTElCPWVjaG8+L2Rldi9udWxsICh3aGljaCBjb25mdXNlcworCXNvbWUgc2hlbGxzIC0gYW5kIEkgZG9uJ3QgYmxhbWUgdGhlbSkgdG8gUkFOTElCPXRydWUuCisJKiBtaC1zb2xhcmlzOiAgVXNlIC91c3IvdWNiL2luc3RhbGwgZm9yIElOU1RBTEwuCisKK1N1biBNYXkgMzEgMTQ6NDU6MjMgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKKworCSogbWgtc29sYXJpczI6IEFkZCBuZXcgY29uZmlndXJhdGlvbiBmb3IgU29sYXJpcyAyIChzeXN2LCBubyByYW5saWIpCisKK0ZyaSBBcHIgMTAgMjM6MTA6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1oLW5jcjMwMDA6ICBBZGQgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIE5DUiAzMDAwLgorCitUdWUgRGVjIDEwIDAwOjEwOjU1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogQ2hhbmdlTG9nOiBmcmVzaCBjaGFuZ2Vsb2cuCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9hY2luY2x1ZGUubTQgYi9jb25maWcvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3OTljZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvYWNpbmNsdWRlLm00CkBAIC0wLDAgKzEsMTk5NCBAQAorZG5sIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBpbnRvIGFsbCBhbnkgb3RoZXIgYWNpbmNsdWRlIGZpbGUgdGhhdCBuZWVkcworZG5sIHRvIHVzZSB0aGVzZSBtYWNyb3MuCisKK2RubCBUaGlzIGlzIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIGNhbGxzIG91ciBvd24gQUNfUFJPR19DQ19XT1JLUywKK2RubCBhbmQgZG9lc24ndCBjYWxsIEFDX1BST0dfQ1hYX0dOVSwgY2F1c2Ugd2UgdGVzdCBmb3IgdGhhdCBpbiAgQUNfUFJPR19DQ19XT1JLUy4KK2RubCBXZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlciwgd2hpY2ggd2lsbCBub3QgYmUgYWJsZSB0byBmdWxseQorZG5sIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZiBpdHNlbGYuCitkbmwgRmluZCBhIHdvcmtpbmcgRysrIGNyb3NzIGNvbXBpbGVyLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgorQUNfREVGVU4oQ1lHX0FDX1BST0dfQ1hYX0NST1NTLAorW0FDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DWFhDUFBdKQorQUNfQ0hFQ0tfUFJPR1MoQ1hYLCAkQ0NDIGMrKyBnKysgZ2NjIENDIGN4eCBjYysrLCBnY2MpCisKK0NZR19BQ19QUk9HX0dYWF9XT1JLUworCitpZiB0ZXN0ICRhY19jdl9wcm9nX2d4eCA9IHllczsgdGhlbgorICBHWFg9eWVzCitkbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDWFhGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKK2RubCBwbGF5cyBhcm91bmQgd2l0aCBDWFhGTEFHUyAoc3VjaCBhcyB0byBidWlsZCBib3RoIGRlYnVnZ2luZyBhbmQKK2RubCBub3JtYWwgdmVyc2lvbnMgb2YgYSBsaWJyYXJ5KSwgdGFzdGVsZXNzIGFzIHRoYXQgaWRlYSBpcy4KKyAgYWNfdGVzdF9DWFhGTEFHUz0iJHtDWFhGTEFHUytzZXR9IgorICBhY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgIENYWEZMQUdTPQorICBBQ19QUk9HX0NYWF9HCisgIGlmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgorICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKKyAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPSItTzIiCisgIGZpCitlbHNlCisgIEdYWD0KKyAgdGVzdCAiJHtDWFhGTEFHUytzZXR9IiA9IHNldCB8fCBDWFhGTEFHUz0iLWciCitmaQorXSkKKworZG5sIFNlZSBpZiB0aGUgRysrIGNvbXBpbGVyIHdlIGZvdW5kIHdvcmtzLgorQUNfREVGVU4oQ1lHX0FDX1BST0dfR1hYX1dPUktTLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgRysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgYWN0dWFsbHkgd29ya3NdKQorQUNfTEFOR19TQVZFCitBQ19MQU5HX0NQTFVTUExVUworZG5sIFRyeSBhIHRlc3QgY2FzZS4gV2Ugb25seSBjb21waWxlLCBiZWNhdXNlIGl0J3MgY2xvc2UgdG8gaW1wb3NzaWJsZQorZG5sIHRvIGdldCBhIGNvcnJlY3QgZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgd2l0aCBhIGNyb3NzIGNvbXBpbGVyLiBGb3IKK2RubCBtb3N0IGNyb3NzIGNvbXBpbGVycywgdGhpcyB0ZXN0IGlzIGJvZ3VzLiBGb3IgRysrLCB3ZSBjYW4gdXNlIHZhcmlvdXMKK2RubCBvdGhlciBjb21waWxlIGxpbmUgb3B0aW9ucyB0byBnZXQgYSBkZWNlbnQgaWRlYSB0aGF0IHRoZSBjcm9zcyBjb21waWxlcgorZG5sIGFjdHVhbGx5IGRvZXMgd29yaywgZXZlbiB0aG91Z2ggd2UgY2FuJ3QgcHJvZHVjZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQKK2RubCBtb3JlIGluZm8gYWJvdXQgdGhlIHRhcmdldCBpdCdzIGJlaW5nIGNvbXBpbGVkIGZvci4gVGhpcyBvbmx5IHdvcmtzCitkbmwgZm9yIHRoZSBHTlUgQysrIGNvbXBpbGVyLgorCitkbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcworZG5sIENYWCBpcyBzZXQuIFRoaXMgaXMgYWxzbyB3aGF0IENYWCBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkCitkbmwgTWFrZWZpbGUuCitpZiB0ZXN0IHgiJHtDWFh9IiA9IHhjKysgOyB0aGVuCisgICAgQ1hYPWBlY2hvIGdjYyB8IHNlZCAtZSAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSJgCitmaQorCitkbmwgR2V0IEcrKydzIGZ1bGwgcGF0aCB0byBsaWJnY2MuYQorbGliZ2NjcGF0aD1gJHtDWFh9IC0tcHJpbnQtbGliZ2NjYAorCitkbmwgSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdGggd2l0aCBsaWJnY2MuYSBvbiB0aGUgZW5kLCB0aGlzIGlzbid0IEcrKy4KK2lmIHRlc3QgYGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6Ly4qLzo6J2AgPSBsaWJnY2MuYSA7IHRoZW4KKyAgIGFjX2N2X3Byb2dfZ3h4PXllcworZWxzZQorICAgYWNfY3ZfcHJvZ19neHg9bm8KK2ZpCisKK2RubCBJZiB3ZSBhcmUgdXNpbmcgRysrLCBsb29rIGZvciB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGV4aXN0IGlmIHRoaXMKK2RubCBjb21waWxlciB3b3Jrcy4KK2lmIHRlc3QgeCIke2FjX2N2X3Byb2dfZ3h4fSIgPSB4eWVzIDsgdGhlbgorICAgIGdjY2ZpbGVzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKKyAgICBpZiB0ZXN0IC1mICR7Z2NjZmlsZXN9L3NwZWNzIC1hIC1mICR7Z2NjZmlsZXN9L2NwcCAtYSAtZiAke2djY2ZpbGVzfS9jYzFwbHVzOyB0aGVuCisJZ2NjZmlsZXM9eWVzCisgICAgZWxzZQorCWdjY2ZpbGVzPW5vCisgICAgZmkKKyAgICBnY2NsaWJzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOmxpYi9nY2MtbGliLzo6JyAtZSAnczovbGliZ2NjLmE6OicgLWUgJ3MsXCguKlwpLy4qLFwxLGcnYC9saWIKKyAgICBpZiB0ZXN0IC1kICR7Z2NjbGlic30vbGRzY3JpcHRzIC1hIC1mICR7Z2NjbGlic30vbGliYy5hIC1hIC1mICR7Z2NjbGlic30vbGlic3RkYysrLmEgOyB0aGVuCisJZ2NjbGlicz15ZXMKKyAgICBlbHNlCisJZ2NjbGlicz1ubworICAgIGZpCitmaQorCitkbmwgSWYgZXZlcnl0aGluZyBpcyBPSywgdGhlbiB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGUgY29tcGlsZXIgd29ya3MuCitpZiB0ZXN0IHgiJHtnY2NmaWxlc30iID0geG5vIC1vIHgiJHtnY2NsaWJzfSIgPSB4bm87IHRoZW4KKyAgICBhY19jdl9wcm9nX2N4eF93b3Jrcz1ubworICAgIEFDX01TR19FUlJPUigke0NYWH0gaXMgYSBub24td29ya2luZyBjcm9zcyBjb21waWxlcikKK2Vsc2UKKyAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPXllcyAKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jeHhfd29ya3MpCitpZiB0ZXN0IHgiJGFjX2N2X3Byb2dfY3h4X3dvcmtzIiA9IHhubzsgdGhlbgorICBBQ19NU0dfRVJST1IoW2luc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLl0pCitmaQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyXSkKK0FDX01TR19SRVNVTFQoJGFjX2N2X3Byb2dfY3h4X2Nyb3NzKQorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworQUNfU1VCU1QoQ1hYKQorXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgRmluZCBhIHdvcmtpbmcgR0NDIGNyb3NzIGNvbXBpbGVyLiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHTlUgZ2NjIGNvbXBpbGVyLgorZG5sIFRoaXMgaXMgYmFzZWQgb24gdGhlIG1hY3JvcyBhYm92ZSBmb3IgRysrLgorQUNfREVGVU4oQ1lHX0FDX1BST0dfQ0NfQ1JPU1MsCitbQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NDUFBdKQorQUNfQ0hFQ0tfUFJPR1MoQ0MsIGNjLCBnY2MpCisKK0NZR19BQ19QUk9HX0dDQ19XT1JLUworCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitkbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCitkbmwgcGxheXMgYXJvdW5kIHdpdGggQ0ZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAorZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgorICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKKyAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0KKyAgQUNfUFJPR19DQ19HCisgIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLU8yIgorICBmaQorZWxzZQorICBHWFg9CisgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCitmaQorXSkKKworZG5sIFNlZSBpZiB0aGUgR0NDIGNvbXBpbGVyIHdlIGZvdW5kIHdvcmtzLgorQUNfREVGVU4oQ1lHX0FDX1BST0dfR0NDX1dPUktTLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgR2NjIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgYWN0dWFsbHkgd29ya3NdKQorQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK2RubCBUcnkgYSB0ZXN0IGNhc2UuIFdlIG9ubHkgY29tcGlsZSwgYmVjYXVzZSBpdCdzIGNsb3NlIHRvIGltcG9zc2libGUKK2RubCB0byBnZXQgYSBjb3JyZWN0IGZ1bGx5IGxpbmtlZCBleGVjdXRhYmxlIHdpdGggYSBjcm9zcworZG5sIGNvbXBpbGVyLiBGb3IgbW9zdCBjcm9zcyBjb21waWxlcnMsIHRoaXMgdGVzdCBpcyBib2d1cy4gRm9yIEcrKywKK2RubCB3ZSBjYW4gdXNlIHZhcmlvdXMgb3RoZXIgY29tcGlsZSBsaW5lIG9wdGlvbnMgdG8gZ2V0IGEgZGVjZW50IGlkZWEKK2RubCB0aGF0IHRoZSBjcm9zcyBjb21waWxlciBhY3R1YWxseSBkb2VzIHdvcmssIGV2ZW4gdGhvdWdoIHdlIGNhbid0CitkbmwgcHJvZHVjZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgbW9yZSBpbmZvIGFib3V0IHRoZSB0YXJnZXQgaXQncworZG5sIGJlaW5nIGNvbXBpbGVkIGZvci4gVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR05VIEMrKyBjb21waWxlci4KKworZG5sIFRyYW5zZm9ybSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgdG8gaXQncyBjcm9zcyB2YXJpYW50LCB1bmxlc3MKK2RubCBDWFggaXMgc2V0LiBUaGlzIGlzIGFsc28gd2hhdCBDQyBnZXRzIHNldCB0byBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLgoraWYgdGVzdCB4IiR7Q0N9IiA9IHhjYyA7IHRoZW4KKyAgICBDQz1gZWNobyBnY2MgfCBzZWQgLWUgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iYAorZmkKKworZG5sIEdldCBHY2MncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKK2xpYmdjY3BhdGg9YCR7Q0N9IC0tcHJpbnQtbGliZ2NjYAorCitkbmwgSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdGggd2l0aCBsaWJnY2MuYSBvbiB0aGUgZW5kLCB0aGlzIGlzbid0IEcrKy4KK2lmIHRlc3QgYGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6Ly4qLzo6J2AgPSBsaWJnY2MuYSA7IHRoZW4KKyAgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCisKK2RubCBJZiB3ZSBhcmUgdXNpbmcgR2NjLCBsb29rIGZvciB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGV4aXN0IGlmIHRoaXMKK2RubCBjb21waWxlciB3b3Jrcy4KK2lmIHRlc3QgeCIke2FjX2N2X3Byb2dfZ2NjfSIgPSB4eWVzIDsgdGhlbgorICAgIGdjY2ZpbGVzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi9saWJnY2MuYTo6J2AKKyAgICBpZiB0ZXN0IC1mICR7Z2NjZmlsZXN9L3NwZWNzIC1hIC1mICR7Z2NjZmlsZXN9L2NwcCAtYSAtZiAke2djY2ZpbGVzfS9jYzFwbHVzOyB0aGVuCisJZ2NjZmlsZXM9eWVzCisgICAgZWxzZQorCWdjY2ZpbGVzPW5vCisgICAgZmkKKyAgICBnY2NsaWJzPWBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOmxpYi9nY2MtbGliLzo6JyAtZSAnczovbGliZ2NjLmE6OicgLWUgJ3MsXCguKlwpLy4qLFwxLGcnYC9saWIKKyAgICBpZiB0ZXN0IC1kICR7Z2NjbGlic30vbGRzY3JpcHRzIC1hIC1mICR7Z2NjbGlic30vbGliYy5hIC1hIC1mICR7Z2NjbGlic30vbGlic3RkYysrLmEgOyB0aGVuCisJZ2NjbGlicz15ZXMKKyAgICBlbHNlCisJZ2NjbGlicz1ubworICAgIGZpCitmaQorCitkbmwgSWYgZXZlcnl0aGluZyBpcyBPSywgdGhlbiB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGUgY29tcGlsZXIgd29ya3MuCitpZiB0ZXN0IHgiJHtnY2NmaWxlc30iID0geG5vIC1vIHgiJHtnY2NsaWJzfSIgPSB4bm87IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCisgICAgQUNfTVNHX0VSUk9SKCR7Q0N9IGlzIGEgbm9uLXdvcmtpbmcgY3Jvc3MgY29tcGlsZXIpICAgIAorZWxzZQorICAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCitmaQorCitBQ19MQU5HX1JFU1RPUkUKK0FDX01TR19SRVNVTFQoJGFjX2N2X3Byb2dfY2Nfd29ya3MpCitpZiB0ZXN0IHgiJGFjX2N2X3Byb2dfY2Nfd29ya3MiID0geG5vOyB0aGVuCisgIEFDX01TR19FUlJPUihbaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuXSkKK2ZpCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEdjYyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXJdKQorQUNfTVNHX1JFU1VMVCgkYWNfY3ZfcHJvZ19jY19jcm9zcykKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworQUNfU1VCU1QoQ0MpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBGaW5kIHRoZSBCRkQgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGFjY2VzcyBhbmQKK2RubCBtYW5pcHVsYXRlIG9iamVjdCBvciBleGVjdXRhYmxlIGZpbGVzLgorQUNfREVGVU4oQ1lHX0FDX1BBVEhfQkZELCBbCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBiZmQgaGVhZGVyIGluIHRoZSBidWlsZCB0cmVlKQorZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK2RubCBMb29rIGZvciB0aGUgaGVhZGVyIGZpbGUKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2JmZGgsWworZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAiJGkvYmZkL2JmZC5oIiA7IHRoZW4KKwlhY19jdl9jX2JmZGg9YChjZCAkaS9iZmQ7IHB3ZClgCisJYnJlYWsKKyAgICBmaQorZG9uZQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfYmZkaH0iICE9IHg7IHRoZW4KKyAgICBCRkRIRElSPSItSSR7YWNfY3ZfY19iZmRofSIKKyAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19iZmRofSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorQUNfU1VCU1QoQkZESERJUikKKworZG5sIExvb2sgZm9yIHRoZSBsaWJyYXJ5CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBiZmQgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2JmZGxpYixbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkaS9iZmQvTWFrZWZpbGUiIDsgdGhlbgorCWFjX2N2X2NfYmZkbGliPWAoY2QgJGkvYmZkOyBwd2QpYAorICAgIGZpCitkb25lCitdKQorZG5sIFdlIGxpc3QgdHdvIGRpcmVjdG9yaWVzIGNhdXNlIGJmZCBub3cgdXNlcyBsaWJ0b29sCitpZiB0ZXN0IHgiJHthY19jdl9jX2JmZGxpYn0iICE9IHg7IHRoZW4KKyAgICBCRkRMSUI9Ii1MJHthY19jdl9jX2JmZGxpYn0gLUwke2FjX2N2X2NfYmZkbGlifS8ubGlicyIKKyAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19iZmRsaWJ9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCitBQ19TVUJTVChCRkRMSUIpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBGaW5kIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gVGhpcyBkZWZpbmVzIG1hbnkgY29tbW9ubHkgdXNlZCBDCitkbmwgZnVuY3Rpb25zIHRoYXQgZXhpc3RzIGluIHZhcmlvdXMgc3RhdGVzIGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIE9TLgorQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCRVJUWSwgWworQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgbGliZXJ0eSBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQorZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmVydHksWworZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAiJGkvbGliaWJlcnR5L01ha2VmaWxlIiA7IHRoZW4KKwlhY19jdl9jX2xpYmVydHk9YChjZCAkaS9saWJpYmVydHk7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2xpYmVydHl9IiAhPSB4OyB0aGVuCisgICAgTElCRVJUWT0iLUwke2FjX2N2X2NfbGliZXJ0eX0iCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZXJ0eX0pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK0FDX1NVQlNUKExJQkVSVFkpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBGaW5kIHRoZSBvcGNvZGVzIGxpYnJhcnkuIFRoaXMgaXMgdXNlZCB0byBkbyBkaXNzYXNlbWJsaWVzLgorQUNfREVGVU4oQ1lHX0FDX1BBVEhfT1BDT0RFUywgWworQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgb3Bjb2RlcyBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQorZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX29wYyxbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkaS9vcGNvZGVzL01ha2VmaWxlIiA7IHRoZW4KKwlhY19jdl9jX29wYz1gKGNkICRpL29wY29kZXM7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX29wY30iICE9IHg7IHRoZW4KKyAgICBPUENPREVTTElCPSItTCR7YWNfY3ZfY19vcGN9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX29wY30pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK0FDX1NVQlNUKE9QQ09ERVNMSUIpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBMb29rIGZvciB0aGUgRGVqYUdudSBoZWFkZXIgZmlsZSBpbiB0aGUgc291cmNlIHRyZWUuIFRoaXMgZmlsZQorZG5sIGRlZmluZXMgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIHRlc3Rpbmcgc3VwcG9ydC4KK0FDX0RFRlVOKENZR19BQ19QQVRIX0RFSkFHTlUsIFsKK0FDX01TR19DSEVDS0lORyhmb3IgdGhlIHRlc3Rpbmcgc3VwcG9ydCBmaWxlcyBpbiB0aGUgc291cmNlIHRyZWUpCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfZGVqYWdudSxbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkc3JjZGlyLyRpL2VjYy9lY2MvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2luY2x1ZGUvZGVqYWdudS5oIiA7IHRoZW4KKwlhY19jdl9jX2RlamFnbnU9YChjZCAkc3JjZGlyLyRpL2VjYy9lY2MvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2luY2x1ZGU7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2RlamFnbnV9IiAhPSB4OyB0aGVuCisgICAgREVKQUdOVUhESVI9Ii1JJHthY19jdl9jX2RlamFnbnV9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2RlamFnbnV9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19kZWphZ251bGliLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2xpYi9ob3N0dXRpbC5leHAiIDsgdGhlbgorCWFjX2N2X2NfZGVqYWdudWxpYj1gKGNkICRzcmNkaXIvJGkvaW5mcmEvdGVzdGxpYi9jdXJyZW50L2xpYjsgcHdkKWAKKyAgICBmaQorZG9uZQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfZGVqYWdudWxpYn0iICE9IHg7IHRoZW4KKyAgICBERUpBR05VTElCPSIke2FjX2N2X2NfZGVqYWdudWxpYn0iCitlbHNlCisgICAgREVKQUdOVUxJQj0iIgorZmkKK0FDX01TR19DSEVDS0lORyhmb3IgcnVudGVzdCBpbiB0aGUgc291cmNlIHRyZWUpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19ydW50ZXN0LFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJGkvZGVqYWdudS9ydW50ZXN0IiA7IHRoZW4KKwlhY19jdl9jX3J1bnRlc3Q9YChjZCAkc3JjZGlyLyRpL2RlamFnbnU7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX3J1bnRlc3R9IiAhPSB4OyB0aGVuCisgICAgUlVOVEVTVERJUj0iJHthY19jdl9jX3J1bnRlc3R9IgorICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfcnVudGVzdH0pCitlbHNlCisgICAgUlVOVEVTVERJUj0iIgorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCitBQ19TVUJTVChSVU5URVNURElSKQorQUNfU1VCU1QoREVKQUdOVUxJQikKK0FDX1NVQlNUKERFSkFHTlVIRElSKQorXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgRmluZCB0aGUgbGliaW50bCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlLiBUaGlzIGlzIGZvcgorZG5sICBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0LgorQUNfREVGVU4oQ1lHX0FDX1BBVEhfSU5UTCwgWworQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgaW50bCBoZWFkZXIgaW4gdGhlIGJ1aWxkIHRyZWUpCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgorZG5sIExvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaW50bGgsWworZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAiJGkvaW50bC9saWJpbnRsLmgiIDsgdGhlbgorCWFjX2N2X2NfaW50bGg9YChjZCAkaS9pbnRsOyBwd2QpYAorCWJyZWFrCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2ludGxofSIgIT0geDsgdGhlbgorICAgIElOVExIRElSPSItSSR7YWNfY3ZfY19pbnRsaH0iCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaW50bGh9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCitBQ19TVUJTVChJTlRMSERJUikKKworZG5sIExvb2sgZm9yIHRoZSBsaWJyYXJ5CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJpbnRsIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbnRsbGliLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiRpL2ludGwvTWFrZWZpbGUiIDsgdGhlbgorCWFjX2N2X2NfaW50bGxpYj1gKGNkICRpL2ludGw7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2ludGxsaWJ9IiAhPSB4OyB0aGVuCisgICAgSU5UTExJQj0iLUwke2FjX2N2X2NfaW50bGxpYn0gLWxpbnRsIgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2ludGxsaWJ9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCitBQ19TVUJTVChJTlRMTElCKQorXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgRmluZCB0aGUgc2ltdWxhdG9yIGxpYnJhcnkuCitBQ19ERUZVTihDWUdfQUNfUEFUSF9TSU0sIFsKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitjYXNlICIkdGFyZ2V0X2NwdSIgaW4KKyAgICBwb3dlcnBjKQl0YXJnZXRfZGlyPXBwYyA7OworICAgIHNwYXJjKikJdGFyZ2V0X2Rpcj1lcmMzMiA7OworICAgIG1pcHMqKQl0YXJnZXRfZGlyPW1pcHMgOzsKKyAgICAqKQkJdGFyZ2V0X2Rpcj0kdGFyZ2V0X2NwdSA7OworZXNhYworZG5sIEZpcnN0IGxvb2sgZm9yIHRoZSBoZWFkZXIgZmlsZQorQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgc2ltdWxhdG9yIGhlYWRlciBmaWxlKQorQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfc2ltaCxbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaW5jbHVkZS9yZW1vdGUtc2ltLmgiIDsgdGhlbgorCWFjX2N2X2Nfc2ltaD1gKGNkICR7c3JjZGlyfS8kaS9pbmNsdWRlOyBwd2QpYAorCWJyZWFrCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX3NpbWh9IiAhPSB4OyB0aGVuCisgICAgU0lNSERJUj0iLUkke2FjX2N2X2Nfc2ltaH0iCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltaH0pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK0FDX1NVQlNUKFNJTUhESVIpCisKK2RubCBTZWUgd2hldGhlciBpdCdzIGEgZGV2byBvciBGb3VuZHJ5IGJyYW5jaCBzaW11bGF0b3IKK0FDX01TR19DSEVDS0lORyhXaGV0aGVyIHRoaXMgaXMgYSBkZXZvIHNpbXVsYXRvciApCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19zaW1kZXZvLFsKKyAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRTSU1IRElSIgorICAgIEFDX0VHUkVQX0hFQURFUihbU0lNX0RFU0Mgc2ltX29wZW4uKnN0cnVjdCBfYmZkXSwgcmVtb3RlLXNpbS5oLAorICAgICAgICBhY19jdl9jX3NpbWRldm89eWVzLAorICAgICAgICBhY19jdl9jX3NpbWRldm89bm8pCitdKQoraWYgdGVzdCB4IiRhY19jdl9jX3NpbWRldm8iID0geCJ5ZXMiIDsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX0RFVk9fU0lNKQorZmkKK0FDX01TR19SRVNVTFQoJHthY19jdl9jX3NpbWRldm99KQorQUNfU1VCU1QoSEFWRV9ERVZPX1NJTSkKKworZG5sIE5leHQgbG9vayBmb3IgdGhlIGxpYnJhcnkKK0FDX01TR19DSEVDS0lORyhmb3IgdGhlIHNpbXVsYXRvciBsaWJyYXJ5KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfc2ltbGliLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiRpL3NpbS8kdGFyZ2V0X2Rpci9NYWtlZmlsZSIgOyB0aGVuCisJYWNfY3ZfY19zaW1saWI9YChjZCAkaS9zaW0vJHRhcmdldF9kaXI7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX3NpbWxpYn0iICE9IHg7IHRoZW4KKyAgICBTSU1MSUI9Ii1MJHthY19jdl9jX3NpbWxpYn0iCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorICAgIGRubCBGSVhNRTogdGhpcyBpcyBraW5kYSBib2d1cywgY2F1c2UgdW10aW1hdGVseSB0aGUgVE0gd2lsbCBidWlsZAorICAgIGRubCBhbGwgdGhlIGxpYnJhcmllcyBmb3Igc2V2ZXJhbCBhcmNoaXRlY3R1cmVzLiBCdXQgZm9yIG5vdywgdGhpcworICAgIGRubCB3aWxsIHdvcmsgdGlsbCB0aGVuLgorZG5sICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBzaW11bGF0b3IgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyIGxpYnJhcmllcykKKyAgICBkbmwgVHJhbnNmb3JtIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byBpdCdzIGNyb3NzIHZhcmlhbnQsIHVubGVzcworICAgIGRubCBDWFggaXMgc2V0LiBUaGlzIGlzIGFsc28gd2hhdCBDWFggZ2V0cyBzZXQgdG8gaW4gdGhlIGdlbmVyYXRlZAorICAgIGRubCBNYWtlZmlsZS4KKyAgICBDUk9TU19HQ0M9YGVjaG8gZ2NjIHwgc2VkIC1lICJzL14vJHRhcmdldC8iYAorCisgICAgZG5sIEdldCBHKysncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKK2NoYW5nZXF1b3RlKCwpCisgICAgZ2NjcGF0aD1gJHtDUk9TU19HQ0N9IC0tcHJpbnQtbGliZ2NjIHwgc2VkIC1lICdzOlthLXowLTlBLVpcLlwtXSovbGliZ2NjLmE6OicgLWUgJ3M6bGliL2djYy1saWIvOjonYGxpYgorY2hhbmdlcXVvdGUoWyxdKQorICAgIGlmIHRlc3QgLWYgJGdjY3BhdGgvbGlic2ltLmEgLW8gLWYgJGdjY3BhdGgvbGlic2ltLnNvIDsgdGhlbgorICAgICAgICBhY19jdl9jX3NpbWxpYj0iJGdjY3BhdGgvIgorICAgICAgICBTSU1MSUI9Ii1MJHthY19jdl9jX3NpbWxpYn0iCisJQUNfTVNHX1JFU1VMVCgke2FjX2N2X2Nfc2ltbGlifSkKKyAgICBlbHNlCisgICAgICAgIEFNX0NPTkRJVElPTkFMKFBTSU0sIHRlc3QgeCRwc2ltID0geG5vKQorCVNJTUxJQj0iIgorCUFDX01TR19SRVNVTFQobm9uZSkKK2RubCAgICAgICAgIGFjX2N2X2Nfc2ltbGliPW5vbmUKKyAgICBmaQorZmkKK0FDX1NVQlNUKFNJTUxJQikKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEZpbmQgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgorQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCSUJFUlRZLCBbCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBsaWJpYmVydHkgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19saWJpYixbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkaS9saWJpYmVydHkvTWFrZWZpbGUiIDsgdGhlbgorCWFjX2N2X2NfbGliaWI9YChjZCAkaS9saWJpYmVydHkvOyBwd2QpYAorICAgIGZpCitkb25lCitdKQoraWYgdGVzdCB4IiR7YWNfY3ZfY19saWJpYn0iICE9IHg7IHRoZW4KKyAgICBMSUJJQkVSVFk9Ii1MJHthY19jdl9jX2xpYmlifSIKKyAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJpYn0pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK0FDX1NVQlNUKExJQklCRVJUWSkKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oQ1lHX0FDX1BBVEhfREVWTywgWworQUNfTVNHX0NIRUNLSU5HKGZvciBkZXZvIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQorZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2Rldm9oLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbmNsdWRlL3JlbW90ZS1zaW0uaCIgOyB0aGVuCisJYWNfY3ZfY19kZXZvaD1gKGNkICR7c3JjZGlyfS8kaS9pbmNsdWRlOyBwd2QpYAorICAgIGZpCitkb25lCitdKQoraWYgdGVzdCB4IiR7YWNfY3ZfY19kZXZvaH0iICE9IHg7IHRoZW4KKyAgICBERVZPSERJUj0iLUkke2FjX2N2X2NfZGV2b2h9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2Rldm9ofSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorQUNfU1VCU1QoREVWT0hESVIpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBmaW5kIHRoZSBJREUgbGlicmFyeSBhbmQgaGVhZGVycy4KK0FDX0RFRlVOKENZR19BQ19QQVRIX0lERSwgWworQUNfTVNHX0NIRUNLSU5HKGZvciBJREUgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgorSURFSERJUj0KK0lERUxJQj0KK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZWgsWworZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2xpYmlkZS9zcmMvZXZlbnQuaCIgOyB0aGVuCisJYWNfY3ZfY19pZGVoPWAoY2QgJHtzcmNkaXJ9LyRpL2xpYmlkZS9zcmM7IHB3ZClgOworICAgIGZpCitkb25lCitdKQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVofSIgIT0geDsgdGhlbgorICAgIElERUhESVI9Ii1JJHthY19jdl9jX2lkZWh9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZWh9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCisKK0FDX01TR19DSEVDS0lORyhmb3IgTElCSURFIFRDTCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZXRjbGgsWworZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2xpYmlkZXRjbC9zcmMvaWRldGNsLmgiIDsgdGhlbgorCWFjX2N2X2NfaWRldGNsaD1gKGNkICR7c3JjZGlyfS8kaS9saWJpZGV0Y2wvc3JjOyBwd2QpYDsKKyAgICBmaQorZG9uZQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaWRldGNsaH0iICE9IHg7IHRoZW4KKyAgICBJREVIRElSPSIke0lERUhESVJ9IC1JJHthY19jdl9jX2lkZXRjbGh9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZXRjbGh9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCisKK0FDX01TR19DSEVDS0lORyhmb3IgSURFIGhlYWRlcnMgaW4gdGhlIGJ1aWxkIHRyZWUpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGVoMixbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGUvc3JjL01ha2VmaWxlIiA7IHRoZW4KKwlhY19jdl9jX2lkZWgyPWAoY2QgJGkvbGliaWRlL3NyYzsgcHdkKWA7CisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2lkZWgyfSIgIT0geDsgdGhlbgorICAgIElERUhESVI9IiR7SURFSERJUn0gLUkke2FjX2N2X2NfaWRlaDJ9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZWgyfSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorCitkbmwgbG9vayBmb3IgdGhlIGxpYnJhcnkKK0FDX01TR19DSEVDS0lORyhmb3IgSURFIGxpYnJhcnkpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGVsaWIsWworaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVsaWJ9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9saWJpZGUvc3JjL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY19pZGVsaWI9YChjZCAkaS9saWJpZGUvc3JjOyBwd2QpYAorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCitmaV0pIAoraWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVsaWJ9IiAhPSB4IDsgdGhlbgorICAgICBJREVMSUI9Ii1MJHthY19jdl9jX2lkZWxpYn0iCisgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lkZWxpYn0pCitlbHNlCisgICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCisKK2RubCBmaW5kIGxpYmlkZGV0Y2wuYSBpZiBpdCBleGlzdHMKK0FDX01TR19DSEVDS0lORyhmb3IgSURFIFRDTCBsaWJyYXJ5KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRldGNsbGliLFsKK2lmIHRlc3QgeCIke2FjX2N2X2NfaWRldGNsbGlifSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluICRkaXJsaXN0OyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvbGliaWRldGNsL3NyYy9NYWtlZmlsZSIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaWRldGNsbGliPWAoY2QgJGkvbGliaWRldGNsL3NyYzsgcHdkKWAKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorZmkKK10pIAoraWYgdGVzdCB4IiR7YWNfY3ZfY19pZGV0Y2xsaWJ9IiAhPSB4IDsgdGhlbgorICAgICBJREVMSUI9IiR7SURFTElCfSAtTCR7YWNfY3ZfY19pZGV0Y2xsaWJ9IgorICAgICBJREVUQ0xMSUI9Ii1saWRldGNsIgorICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pZGV0Y2xsaWJ9KQorZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorQUNfU1VCU1QoSURFSERJUikKK0FDX1NVQlNUKElERUxJQikKK0FDX1NVQlNUKElERVRDTExJQikKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEZpbmQgYWxsIHRoZSBJTFUgaGVhZGVycyBhbmQgbGlicmFyaWVzCitBQ19ERUZVTihDWUdfQUNfUEFUSF9JTFUsIFsKK0FDX01TR19DSEVDS0lORyhmb3IgSUxVIGtlcm5lbCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9rZXJuZWwvbWV0aG9kLmgiIDsgdGhlbgorCWFjX2N2X2NfaWx1aD1gKGNkICR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9rZXJuZWw7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2lsdWh9IiAhPSB4OyB0aGVuCisgICAgSUxVSERJUj0iLUkke2FjX2N2X2NfaWx1aH0iCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aH0pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUga2VybmVsIGhlYWRlcnMgaW4gdGhlIGJ1aWxkIHRyZWUpCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aDUsWworZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAiJGkvaWx1L3J1bnRpbWUva2VybmVsL2lsdWNvbmYuaCIgOyB0aGVuCisJYWNfY3ZfY19pbHVoNT1gKGNkICRpL2lsdS9ydW50aW1lL2tlcm5lbDsgcHdkKWAKKyAgICBmaQorZG9uZQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDV9IiAhPSB4OyB0aGVuCisgICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoNX0iCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDV9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCisKK0FDX01TR19DSEVDS0lORyhmb3IgSUxVIEMrKyBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgyLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvY3BwL3Jlc291cmNlLmgiIDsgdGhlbgorCWFjX2N2X2NfaWx1aDI9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2NwcDsgcHdkKWAKKyAgICBmaQorZG9uZQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDJ9IiAhPSB4OyB0aGVuCisgICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoMn0iCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDJ9KQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCisKK0FDX01TR19DSEVDS0lORyhmb3IgSUxVIEMgaGVhZGVycykKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWgzLFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvYy9yZXNvdXJjZS5oIiA7IHRoZW4KKwlhY19jdl9jX2lsdWgzPWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jICA7IHB3ZClgCisgICAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX2lsdWgzfSIgIT0geDsgdGhlbgorICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDN9IgorICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWgzfSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBDIHJ1bnRpbWUgaGVhZGVycykKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWg0LFsKK2ZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9pbHUvcnVudGltZS9jL2lsdWNzdHViLmgiIDsgdGhlbgorCWFjX2N2X2NfaWx1aDQ9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3J1bnRpbWUvYyAgOyBwd2QpYAorICAgIGZpCitkb25lCitdKQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoNH0iICE9IHg7IHRoZW4KKyAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWg0fSIKKyAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoNH0pCitlbHNlCisgICAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKKworQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1cGF0aCxbCitmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICIkaS9pbHUvTWFrZWZpbGUiIDsgdGhlbgorCWFjX2N2X2NfaWx1cGF0aD1gKGNkICRpL2lsdTsgcHdkKWAKKwlicmVhaworICAgIGZpCitkb25lCitdKQorSUxVVE9QPSR7YWNfY3ZfY19pbHVwYXRofQorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBJTFUgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYixbCitpZiB0ZXN0IC1mICIkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUva2VybmVsL01ha2VmaWxlIiA7IHRoZW4KKyAgICBhY19jdl9jX2lsdWxpYj1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9rZXJuZWw7IHB3ZClgCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAke2FjX2N2X2NfaWx1bGlifS9saWJpbHUuYSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorZmldKQorICAgCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBJTFUgQysrIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWIyLFsKK2lmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jcHAvTWFrZWZpbGUiIDsgdGhlbgorICAgIGFjX2N2X2NfaWx1bGliMj1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jcHA7IHB3ZClgCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAke2FjX2N2X2NfaWx1bGliMn0vbGliaWx1LWMrKy5hKQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm8pCitmaV0pCisKK0FDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBDIGJpbmRpbmdzIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWIzLFsKK2lmIHRlc3QgLWYgIiRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9jL01ha2VmaWxlIiA7IHRoZW4KKyAgICBhY19jdl9jX2lsdWxpYjM9YChjZCAkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvYzsgcHdkKWAKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWIzfS9saWJpbHUtYy5hKQorZWxzZQorICAgIEFDX01TR19SRVNVTFQobm8pCitmaV0pCisKK0FDX01TR19DSEVDS0lORyhmb3IgdGhlIElMVSBUayBiaW5kaW5ncyBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliNCxbCitpZiB0ZXN0IC1mICIkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvbWFpbmxvb3AvTWFrZWZpbGUiIDsgdGhlbgorICAgIGFjX2N2X2NfaWx1bGliND1gKGNkICRhY19jdl9jX2lsdXBhdGgvcnVudGltZS9tYWlubG9vcDsgcHdkKWAKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICR7YWNfY3ZfY19pbHVsaWI0fS9saWJpbHUtdGsuYSkKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorZmldKQorCitpZiB0ZXN0IHgiJHthY19jdl9jX2lsdWxpYn0iID0geCAtYSB4IiR7YWNfY3ZfY19pbHVsaWIyfSIgPSB4OyB0aGVuCisgIElMVUhESVI9IiIKK2ZpCisKK2lmIHRlc3QgeCIke2FjX2N2X2NfaWx1bGlifSIgIT0geCAtYSB4IiR7YWNfY3ZfY19pbHVsaWIyfSIgIT0geDsgdGhlbgorICAgIElMVUxJQj0iLUwke2FjX2N2X2NfaWx1bGlifSAtTCR7YWNfY3ZfY19pbHVsaWIyfSAtTCR7YWNfY3ZfY19pbHVsaWIzfSAtTCR7YWNfY3ZfY19pbHVsaWI0fSIKK2Vsc2UKKyAgICBJTFVMSUI9IiIKK2ZpCisKK2lmIHRlc3QgeCIke0lMVUxJQn0iID0geDsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhmb3IgSUxVIGxpYnJhcmllcyBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIpCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliNSxbCisgICAgTkFUSVZFX0dDQz1gZWNobyBnY2MgfCBzZWQgLWUgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iYAorCisgICAgZG5sIEdldCBHKysncyBmdWxsIHBhdGggdG8gaXQncyBsaWJyYXJpZXMKKyAgICBhY19jdl9jX2lsdWxpYjU9YCR7TkFUSVZFX0dDQ30gLS1wcmludC1saWJnY2MgfCBzZWQgLWUgJ3M6bGliL2djYy1saWIvLio6OidgbGliCisgICAgaWYgdGVzdCAtZiAkYWNfY3ZfY19pbHVsaWI1L2xpYmlsdS1jLmEgLW8gLWYgJGFjX2N2X2NfaWx1bGliNS9saWJpbHUtYy5zbyA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiR7SUxVSERJUn0iID0geDsgdGhlbgorICAgICAgICAgICAgICAgSUxVSERJUj0iLUkke2FjX2N2X2NfaWx1bGliNX0vLi4vaW5jbHVkZSIKKyAgICAgICAgZmkKKyAgICAgICAgSUxVTElCPSItTCR7YWNfY3ZfY19pbHVsaWI1fSIKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1bGliNX0pCisgICAgZWxzZQorICAgICAgICBhY19jdl9jX2lsdWxpYj1ub25lCisgICAgICAgIEFDX01TR19SRVNVTFQobm9uZSkKKyAgICBmaQorZmldKQorQUNfU1VCU1QoSUxVSERJUikKK0FDX1NVQlNUKElMVUxJQikKK0FDX1NVQlNUKElMVVRPUCkKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIFRoaXMgZGVmaW5lcyB0aGUgYnl0ZSBvcmRlciBmb3IgdGhlIGhvc3QuIFdlIGNhbid0IHVzZQorZG5sIEFDX0NfQklHRU5ESUFOLCBjYXVzZSB3ZSB3YW50IHRvIGNyZWF0ZSBhIGNvbmZpZyBmaWxlIGFuZAorZG5sIHN1YnN0aXR1ZSB0aGUgcmVhbCB2YWx1ZSwgc28gdGhlIGhlYWRlciBmaWxlcyB3b3JrIHJpZ2h0CitBQ19ERUZVTihDWUdfQUNfQ19FTkRJQU4sIFsKK0FDX01TR19DSEVDS0lORyh0byBzZWUgaWYgdGhpcyBpcyBhIGxpdHRsZSBlbmRpYW4gaG9zdCkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2xpdHRsZV9lbmRpYW4sIFsKK2FjX2N2X2NfbGl0dGxlX2VuZGlhbj11bmtub3duCisjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD5dLCBbCisjaWYgIUJZVEVfT1JERVIgfHwgIV9CSUdfRU5ESUFOIHx8ICFfTElUVExFX0VORElBTgorIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKyNlbmRpZl0sIFsjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9MSVRUTEVfRU5ESUFOIG9yIG5vdC4KK0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+XSwgWworI2lmIEJZVEVfT1JERVIgIT0gX0xJVFRMRV9FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmXSwgYWNfY3ZfY19saXR0bGVfZW5kaWFuPXllcywgYWNfY3ZfY19saXR0bGVfZW5kaWFuPW5vKQorXSkKK2lmIHRlc3QgJHthY19jdl9jX2xpdHRsZV9lbmRpYW59ID0gdW5rbm93bjsgdGhlbgorb2xkX2NmbGFncz0kQ0ZMQUdTCitDRkxBR1M9LWcKK0FDX1RSWV9SVU4oWworbWFpbiAoKSB7CisgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKyAgdW5pb24KKyAgeworICAgIGxvbmcgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07CisgIH0gdTsKKyAgdS5sID0gMTsKKyAgZXhpdCAodS5jWzBdID09IDEpOworfV0sCithY19jdl9jX2xpdHRsZV9lbmRpYW49bm8sCithY19jdl9jX2xpdHRsZV9lbmRpYW49eWVzLFsKK2RubCBZZXMsIHRoaXMgaXMgdWdseSwgYW5kIG9ubHkgdXNlZCBmb3IgYSBjYW5hZGlhbiBjcm9zcyBhbnl3YXkuIFRoaXMKK2RubCBpcyBqdXN0IHRvIGtlZXAgY29uZmlndXJlIGZyb20gc3RvcHBpbmcgaGVyZS4KK2Nhc2UgIiR7aG9zdH0iIGluCitjaGFuZ2VxdW90ZSgsKQorICAgaVszNDU2XTg2LSotKikgYWNfY3ZfY19saXR0bGVfZW5kaWFuPXllcyA7OworICAgc3BhcmMqLSotKikgICAgYWNfY3ZfY19saXR0bGVfZW5kaWFuPW5vIDs7CitjaGFuZ2VxdW90ZShbLF0pCisgICopICAgIEFDX01TR19XQVJOKENhbid0IGNyb3NzIGNvbXBpbGUgdGhpcyB0ZXN0KSA7OworZXNhY10pCitDRkxBR1M9JG9sZF9jZmxhZ3MKK2ZpXSkKKworaWYgdGVzdCB4IiR7YWNfY3ZfY19saXR0bGVfZW5kaWFufSIgPSB4eWVzOyB0aGVuCisgICAgQUNfREVGSU5FKExJVFRMRV9FTkRJQU5fSE9TVCkKKyAgICBFTkRJQU49IkNZR19MU0JGSVJTVCI7CitlbHNlCisgICAgRU5ESUFOPSJDWUdfTVNCRklSU1QiOworZmkKK0FDX01TR19SRVNVTFQoJHthY19jdl9jX2xpdHRsZV9lbmRpYW59KQorQUNfU1VCU1QoRU5ESUFOKQorXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgTG9vayBmb3IgdGhlIHBhdGggdG8gbGliZ2NjLCBzbyB3ZSBjYW4gdXNlIGl0IHRvIGRpcmVjdGx5IGxpbmsKK2RubCBpbiBsaWJnY2MuYSB3aXRoIExELgorQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR0NDLAorW0FDX01TR19DSEVDS0lORyhbTG9va2luZyBmb3IgdGhlIHBhdGggdG8gbGliZ2NjLmFdKQorQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKKworZG5sIEdldCBHY2MncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKK2xpYmdjY3BhdGg9YCR7Q0N9IC0tcHJpbnQtbGliZ2NjYAorCitkbmwgSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdGggd2l0aCBsaWJnY2MuYSBvbiB0aGUgZW5kLCB0aGlzIGlzbid0IEcrKy4KK2lmIHRlc3QgYGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6Ly4qLzo6J2AgPSBsaWJnY2MuYSA7IHRoZW4KKyAgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCisKK2RubCAKK2lmIHRlc3QgeCIke2FjX2N2X3Byb2dfZ2NjfSIgPSB4eWVzIDsgdGhlbgorICAgZ2NjcGF0aD1gZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovbGliZ2NjLmE6OidgCisgICBMSUJHQ0M9Ii1MJHtnY2NwYXRofSIKKyAgIEFDX01TR19SRVNVTFQoJHtnY2NwYXRofSkKK2Vsc2UKKyAgIExJQkdDQz0iIgorICAgQUNfTVNHX0VSUk9SKE5vdCB1c2luZyBnY2MpCitmaQorCitBQ19MQU5HX1JFU1RPUkUKK0FDX1NVQlNUKExJQkdDQykKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIE9rLCBsZXRzIGZpbmQgdGhlIHRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycworZG5sIFdhcm5pbmc6IHRyYW5zaXRpb24gb2YgdmVyc2lvbiA5IHRvIDEwIHdpbGwgYnJlYWsgdGhpcyBhbGdvcml0aG0KK2RubCBiZWNhdXNlIDEwIHNvcnRzIGJlZm9yZSA5LiBXZSBhbHNvIGxvb2sgZm9yIGp1c3QgdGNsLiBXZSBoYXZlIHRvCitkbmwgYmUgY2FyZWZ1bCB0aGF0IHdlIGRvbid0IG1hdGNoIHN0dWZmIGxpa2UgdGNsWCBieSBhY2NpZGVudC4KK2RubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGNsaW5jbHVkZQorQUNfREVGVU4oQ1lHX0FDX1BBVEhfVENMLCBbCisgICAgQ1lHX0FDX1BBVEhfVENMSAorICAgIENZR19BQ19QQVRIX1RDTENPTkZJRworICAgIENZR19BQ19MT0FEX1RDTENPTkZJRworXSkKK0FDX0RFRlVOKENZR19BQ19QQVRIX1RDTEgsIFsKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitub190Y2w9dHJ1ZQorQUNfTVNHX0NIRUNLSU5HKGZvciBUY2wgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCitBQ19BUkdfV0lUSCh0Y2xpbmNsdWRlLCBbICAtLXdpdGgtdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF90Y2xpbmNsdWRlPSR7d2l0aHZhbH0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfY190Y2xoLFsKK2RubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAoraWYgdGVzdCB4IiR7d2l0aF90Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KKyAgaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vdGNsLmggOyB0aGVuCisgICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9OyBwd2QpYAorICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWMvdGNsLmggOyB0aGVuCisgICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCisgIGVsc2UKKyAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQorICBmaQorZmkKKworZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRjbCBjb25maWd1cmF0aW9uIGZpbGUKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAkYWNfY3ZfY190Y2xjb25maWcvJGkvZ2VuZXJpYy90Y2wuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRhY19jdl9jX3RjbGNvbmZpZy8kaS9nZW5lcmljOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorCitkbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKK2RubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGNsIHNvdXJjZSBkaXJlY3RvcnkKKyAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL3RjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KKwkgICAgdGNscGF0aD0kc3JjZGlyLyRpCisJICAgIGJyZWFrCisJZmkKKyAgICBkb25lCisKKyAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQorICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KKyAgICBmb3IgaSBpbiBgbHMgLWRyICR0Y2xwYXRoL3RjbCogMj4vZGV2L251bGwgYCA7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90Y2wuaCA7IHRoZW4KKyAgICAgICAgICBhY19jdl9jX3RjbGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgZG9uZQorZmkKKworZG5sIGNoZWNrIGlmIGl0cyBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KKyAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgorICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2luY2x1ZGUKKyAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGNsLmg7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190Y2xoPSRjY3BhdGgKKyAgICBmaQorZmkKKworZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCitpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCisgICBBQ19NU0dfUkVTVUxUKG5vbmUpCisgICBBQ19DSEVDS19IRUFERVIodGNsLmgsIGFjX2N2X2NfdGNsaD1pbnN0YWxsZWQsIGFjX2N2X2NfdGNsaD0iIikKK2Vsc2UKKyAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RjbGh9KQorZmkKK10pCisgIFRDTEhESVI9IiIKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IFRjbCBoZWFkZXJzXSkKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiAhPSB4IDsgdGhlbgorICAgIG5vX3RjbD0iIgorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KKwlpZiB0ZXN0IHgiJHtDQ30iID0geGNsIDsgdGhlbgorCSAgICB0bXA9ImBjeWdwYXRoIC0td2luZG93cyAke2FjX2N2X2NfdGNsaH1gIgorCSAgICBhY19jdl9jX3RjbGg9ImBlY2hvICR0bXAgfCBzZWQgLWUgcyNcXFxcXFxcXCMvI2dgIgorCWZpCisgICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RjbGh9KQorICAgICAgICBUQ0xIRElSPSItSSR7YWNfY3ZfY190Y2xofSIKKyAgICBmaQorZmkKKworQUNfU1VCU1QoVENMSERJUikKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIE9rLCBsZXRzIGZpbmQgdGhlIHRjbCBjb25maWd1cmF0aW9uCitBQ19ERUZVTihDWUdfQUNfUEFUSF9UQ0xDT05GSUcsIFsKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitkbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRjbGNvbmZpZworaWYgdGVzdCB4IiR7bm9fdGNsfSIgPSB4IDsgdGhlbgorICBkbmwgd2UgcmVzZXQgbm9fdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKKyAgICBub190Y2w9dHJ1ZQorICAgIEFDX0FSR19XSVRIKHRjbGNvbmZpZywgWyAgLS13aXRoLXRjbGNvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGNsIGNvbmZpZ3VyYXRpb24gKHRjbENvbmZpZy5zaCldLAorICAgICAgICAgd2l0aF90Y2xjb25maWc9JHt3aXRodmFsfSkKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUY2wgY29uZmlndXJhdGlvbiBzY3JpcHRdKQorICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGNvbmZpZyxbCisKKyAgICBkbmwgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10Y2xjb25maWcgd2FzIHNwZWNpZmllZC4KKyAgICBpZiB0ZXN0IHgiJHt3aXRoX3RjbGNvbmZpZ30iICE9IHggOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90Y2xjb25maWd9L3RjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICR7d2l0aF90Y2xjb25maWd9OyBwd2QpYAorICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGNsQ29uZmlnLnNoXSkKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRjbCBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlCisgICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCisgICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRpL3VuaXgvdGNsQ29uZmlnLnNoIDsgdGhlbgorICAgICAgICAgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHNyY2Rpci8kaS91bml4OyBwd2QpYAorCSAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICBmaQorICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBsb2NhdGlvbnMKKyAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICAgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUY2wgc291cmNlIGRpcmVjdG9yeQorICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJGkvdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgorCSAgICAgICAgdGNsY29uZnBhdGg9JGkKKwkgICAgICAgIGJyZWFrCisJICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGNsIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCisgICAgICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KKyAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAkdGNsY29uZnBhdGgvdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJGkvdW5peC90Y2xDb25maWcuc2ggOyB0aGVuCisgICAgICAgICAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkaS91bml4OyBwd2QpYAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgZmkKKworICAgIGRubCBDaGVjayB0byBzZWUgaWYgaXQncyBpbnN0YWxsZWQuIFdlIGhhdmUgdG8gbG9vayBpbiB0aGUgJENDIHBhdGgKKyAgICBkbmwgdG8gZmluZCBpdCwgY2F1c2Ugb3VyICRwcmVmaXggbWF5IG5vdCBtYXRjaCB0aGUgY29tcGlsZXJzLgorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgICAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgorCWNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2xpYgorICAgICAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGNsQ29uZmlnLnNoOyB0aGVuCisJICAgIGFjX2N2X2NfdGNsY29uZmlnPSRjY3BhdGgKKyAgICAgICAgZmkKKyAgICBmaQorICAgIF0pCWRubCBlbmQgb2YgY2FjaGVfdmFsCisKKyAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICAgICAgVENMQ09ORklHPSIiCisgICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGNsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCisgICAgZWxzZQorICAgICAgICBub190Y2w9IiIKKyAgICAgICAgVENMQ09ORklHPSR7YWNfY3ZfY190Y2xjb25maWd9L3RjbENvbmZpZy5zaAorICAgICAgICBBQ19NU0dfUkVTVUxUKCR7VENMQ09ORklHfSkKKyAgICAgZmkKK2ZpCitBQ19TVUJTVChUQ0xDT05GSUcpCitdKQorCitkbmwgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcworZG5sIGZyb20gUEFUSF9UQ0xDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lHX0FDX0xPQURfVENMQ09ORklHLCBbCisgICAgLiAkVENMQ09ORklHCisKK2RubCBBQ19TVUJTVChUQ0xfVkVSU0lPTikKK2RubCBBQ19TVUJTVChUQ0xfTUFKT1JfVkVSU0lPTikKK2RubCBBQ19TVUJTVChUQ0xfTUlOT1JfVkVSU0lPTikKK2RubCBBQ19TVUJTVChUQ0xfQ0MpCisgICAgQUNfU1VCU1QoVENMX0RFRlMpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworICAgIEFDX1NVQlNUKFRDTF9MSUJfRklMRSkKKyAgICBBQ19TVUJTVChUQ0xfTElCX0ZVTExfUEFUSCkKKyAgICBBQ19TVUJTVChUQ0xfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRDTF9QUkVGSVgpCisKKyAgICBBQ19TVUJTVChUQ0xfQ0ZMQUdTKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUQ0xfRVhFQ19QUkVGSVgpCisKKyAgICBBQ19TVUJTVChUQ0xfU0hMSUJfQ0ZMQUdTKQorICAgIEFDX1NVQlNUKFRDTF9TSExJQl9MRCkKK2RubCBkb24ndCBleHBvcnQsIG5vdCB1c2VkIG91dHNpZGUgb2YgY29uZmlndXJlCitkbmwgQUNfU1VCU1QoVENMX1NITElCX0xEX0xJQlMpCitkbmwgQUNfU1VCU1QoVENMX1NITElCX1NVRkZJWCkKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sIEFDX1NVQlNUKFRDTF9ETF9MSUJTKQorICAgIEFDX1NVQlNUKFRDTF9MRF9GTEFHUykKKyAgICBBQ19TVUJTVChUQ0xfTERfU0VBUkNIX0ZMQUdTKQorZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKK2RubCBBQ19TVUJTVChUQ0xfQ09NUEFUX09CSlMpCisgICAgQUNfU1VCU1QoVENMX1JBTkxJQikKKyAgICBBQ19TVUJTVChUQ0xfQlVJTERfTElCX1NQRUMpCisgICAgQUNfU1VCU1QoVENMX0xJQl9TUEVDKQorZG5sIEFDX1NVQlNUKFRDTF9MSUJfVkVSU0lPTlNfT0spCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRDTF9TSEFSRURfTElCX1NVRkZJWCkKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVENMX1VOU0hBUkVEX0xJQl9TVUZGSVgpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKENZR19BQ19QQVRIX1RLLCBbCisgICAgQ1lHX0FDX1BBVEhfVEtICisgICAgQ1lHX0FDX1BBVEhfVEtDT05GSUcKKyAgICBDWUdfQUNfTE9BRF9US0NPTkZJRworXSkKK0FDX0RFRlVOKENZR19BQ19QQVRIX1RLSCwgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0ayBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycworIyBJZiB0aGUgZGlyZWN0b3J5IChwcmVzdW1hYmx5IHN5bWxpbmspIG5hbWVkICJ0ayIgZXhpc3RzLCB1c2UgdGhhdCBvbmUKKyMgaW4gcHJlZmVyZW5jZSB0byBhbnkgb3RoZXJzLiAgU2FtZSBsb2dpYyBpcyB1c2VkIHdoZW4gY2hvb3NpbmcgbGlicmFyeQorIyBhbmQgYWdhaW4gd2l0aCBUY2wuIFRoZSBzZWFyY2ggb3JkZXIgaXMgdGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmaXJzdCwgdGhlbiBpbgorIyBkZWNyZWFzaW5nIHNpZ25pZmljYW5jZS4gVGhlIGxvb3AgYnJlYWtzIGlmIHRoZSB0cmlnZ2VyIGZpbGUgaXMgZm91bmQuCisjIE5vdGUgdGhlIGdyb3NzIGxpdHRsZSBjb252ZXJzaW9uIGhlcmUgb2Ygc3JjZGlyIGJ5IGNkJ2luZyB0byB0aGUgZm91bmQKKyMgZGlyZWN0b3J5LiBUaGlzIGNvbnZlcnRzIHRoZSBwYXRoIGZyb20gYSByZWxhdGl2ZSB0byBhbiBhYnNvbHV0ZSwgc28KKyMgcmVjdXJzaXZlIGNhY2hlIHZhcmlhYmxlcyBmb3IgdGhlIHBhdGggd2lsbCB3b3JrIHJpZ2h0LiBXZSBjaGVjayBhbGwKKyMgdGhlIHBvc3NpYmxlIHBhdGhzIGluIG9uZSBsb29wIHJhdGhlciB0aGFuIG1hbnkgc2VwZXJhdGUgbG9vcHMgdG8gc3BlZWQKKyMgdGhpbmdzIHVwLgorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGtpbmNsdWRlCisjCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgorbm9fdGs9dHJ1ZQorQUNfTVNHX0NIRUNLSU5HKGZvciBUayBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKK0FDX0FSR19XSVRIKHRraW5jbHVkZSwgWyAgLS13aXRoLXRraW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGsgaGVhZGVycyBhcmVdLCB3aXRoX3RraW5jbHVkZT0ke3dpdGh2YWx9KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtoLFsKK2RubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRraW5jbHVkZSB3YXMgc3BlY2lmaWVkCitpZiB0ZXN0IHgiJHt3aXRoX3RraW5jbHVkZX0iICE9IHggOyB0aGVuCisgIGlmIHRlc3QgLWYgJHt3aXRoX3RraW5jbHVkZX0vdGsuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RraD1gKGNkICR7d2l0aF90a2luY2x1ZGV9OyBwd2QpYAorICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RraW5jbHVkZX0vZ2VuZXJpYy90ay5oIDsgdGhlbgorICAgIGFjX2N2X2NfdGtoPWAoY2QgJHt3aXRoX3RraW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RraW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKKyAgZmkKK2ZpCisKK2RubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUayBjb25maWd1cmF0aW9uIGZpbGUKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiAhPSB4IDsgdGhlbgorICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICRhY19jdl9jX3RrY29uZmlnLyRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtoPWAoY2QgJGFjX2N2X2NfdGtjb25maWcvJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Citkbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgorICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGsgc291cmNlIGRpcmVjdG9yeQorICAgIGZvciBpIGluICRkaXJsaXN0OyBkbworICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvdGsqIDI+L2Rldi9udWxsYCIgOyB0aGVuCisJICAgIHRrcGF0aD0kc3JjZGlyLyRpCisJICAgIGJyZWFrCisJZmkKKyAgICBkb25lCisKKyAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGsgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCisgICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGssIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCisgICAgZm9yIGkgaW4gYGxzIC1kciAkdGtwYXRoL3RrKiAyPi9kZXYvbnVsbCBgIDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RrLmggOyB0aGVuCisgICAgICAgICAgYWNfY3ZfY190a2g9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgZG9uZQorZmkKKworZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCisgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIuIFdlIGRvIGl0IHRoaXMgd2F5IGluc3RlYWQgb2YgdXNpbmcKKyAgICBkbmwgQUNfQ0hFQ0tfSEVBREVSLCBjYXVzZSB0aGlzIGRvZXNuJ3QgZGVwZW5kIGluIGhhdmluZyBYIGNvbmZpZ3VyZWQuCisgICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvaW5jbHVkZQorICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90ay5oOyB0aGVuCisJYWNfY3ZfY190a2g9JGNjcGF0aAorICAgIGZpCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190a2h9KQorZmkKK10pCisgIFRLSERJUj0iIgoraWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBUayBoZWFkZXJzXSkKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iICE9IHggOyB0aGVuCisgICAgbm9fdGs9IiIKKyAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KKwlpZiB0ZXN0IHgiJHtDQ30iID0geGNsIDsgdGhlbgorCSAgICB0bXA9ImBjeWdwYXRoIC0td2luZG93cyAke2FjX2N2X2NfdGtofWAiCisJICAgIGFjX2N2X2NfdGtoPSJgZWNobyAkdG1wIHwgc2VkIC1lIHMjXFxcXFxcXFwjLyNnYCIKKwlmaQorICAgICAgICBBQ19NU0dfUkVTVUxUKFtmb3VuZCBpbiAke2FjX2N2X2NfdGtofV0pCisgICAgICAgIFRLSERJUj0iLUkke2FjX2N2X2NfdGtofSIKKyAgICBmaQorZmkKKworQUNfU1VCU1QoVEtIRElSKQorXSkKKworQUNfREVGVU4oQ1lHX0FDX1BBVEhfVEtDT05GSUcsIFsKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitkbmwgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRrY29uZmlnCitpZiB0ZXN0IHgiJHtub190a30iID0geCA7IHRoZW4KKyAgZG5sIHdlIHJlc2V0IG5vX3RrIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKKyAgICBub190az10cnVlCisgICAgQUNfQVJHX1dJVEgodGtjb25maWcsIFsgIC0td2l0aC10a2NvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGsgY29uZmlndXJhdGlvbiAodGtDb25maWcuc2gpXSwKKyAgICAgICAgIHdpdGhfdGtjb25maWc9JHt3aXRodmFsfSkKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUayBjb25maWd1cmF0aW9uIHNjcmlwdF0pCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtjb25maWcsWworCisgICAgZG5sIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGtjb25maWcgd2FzIHNwZWNpZmllZC4KKyAgICBpZiB0ZXN0IHgiJHt3aXRoX3RrY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RrY29uZmlnfS90a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJHt3aXRoX3RrY29uZmlnfTsgcHdkKWAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGtDb25maWcuc2hdKQorICAgICAgICBmaQorICAgIGZpCisKKyAgICBkbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGsgY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZQorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCisgICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRpL3VuaXgvdGtDb25maWcuc2ggOyB0aGVuCisgICAgICAgICAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICRzcmNkaXIvJGkvdW5peDsgcHdkKWAKKwkgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgZmkKKyAgICBkbmwgY2hlY2sgaW4gYSBmZXcgb3RoZXIgbG9jYXRpb25zCisgICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICAgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUayBzb3VyY2UgZGlyZWN0b3J5CisgICAgICAgIGZvciBpIGluICRkaXJsaXN0OyBkbworICAgICAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkaS90ayogMj4vZGV2L251bGxgIiA7IHRoZW4KKwkgICAgICAgIHRrY29uZnBhdGg9JGkKKwkgICAgICAgIGJyZWFrCisJICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICBkbmwgZmluZCB0aGUgZXhhY3QgVGsgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKKyAgICAgICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGssIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCisgICAgICAgIGZvciBpIGluIGBscyAtZHIgJHRrY29uZnBhdGgvdGsqIDI+L2Rldi9udWxsIGAgOyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZiAkaS91bml4L3RrQ29uZmlnLnNoIDsgdGhlbgorICAgICAgICAgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaS91bml4OyBwd2QpYAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgZmkKKworICAgIGRubCBDaGVjayB0byBzZWUgaWYgaXQncyBpbnN0YWxsZWQuIFdlIGhhdmUgdG8gbG9vayBpbiB0aGUgJENDIHBhdGgKKyAgICBkbmwgdG8gZmluZCBpdCwgY2F1c2Ugb3VyICRwcmVmaXggbWF5IG5vdCBtYXRjaCB0aGUgY29tcGlsZXJzLgorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCisgICAgICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCisJY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvbGliCisgICAgICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90a0NvbmZpZy5zaDsgdGhlbgorCSAgICBhY19jdl9jX3RrY29uZmlnPSRjY3BhdGgKKyAgICAgICAgZmkKKyAgICBmaQorICAgIF0pCWRubCBlbmQgb2YgY2FjaGVfdmFsCisKKyAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgICAgICBUS0NPTkZJRz0iIgorICAgICAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCisgICAgZWxzZQorICAgICAgICBub190az0iIgorICAgICAgICBUS0NPTkZJRz0ke2FjX2N2X2NfdGtjb25maWd9L3RrQ29uZmlnLnNoCisgICAgICAgIEFDX01TR19SRVNVTFQoJHtUS0NPTkZJR30pCisgICAgIGZpCitmaQorQUNfU1VCU1QoVEtDT05GSUcpCitdKQorCitkbmwgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcworZG5sIGZyb20gUEFUSF9US0NPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCitBQ19ERUZVTihDWUdfQUNfTE9BRF9US0NPTkZJRywgWworICAgIGlmIHRlc3QgLWYgIiRUS0NPTkZJRyIgOyB0aGVuCisgICAgICAuICRUS0NPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChUS19WRVJTSU9OKQorZG5sIG5vdCBhY3R1YWxseSB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVEtfTUFKT1JfVkVSU0lPTikKK2RubCAgICBBQ19TVUJTVChUS19NSU5PUl9WRVJTSU9OKQorICAgIEFDX1NVQlNUKFRLX0RFRlMpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworICAgIEFDX1NVQlNUKFRLX0xJQl9GSUxFKQorICAgIEFDX1NVQlNUKFRLX0xJQl9GVUxMX1BBVEgpCisgICAgQUNfU1VCU1QoVEtfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRLX1BSRUZJWCkKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVEtfRVhFQ19QUkVGSVgpCisgICAgQUNfU1VCU1QoVEtfQlVJTERfSU5DTFVERVMpCisgICAgQUNfU1VCU1QoVEtfWElOQ0xVREVTKQorICAgIEFDX1NVQlNUKFRLX1hMSUJTVykKKyAgICBBQ19TVUJTVChUS19CVUlMRF9MSUJfU1BFQykKKyAgICBBQ19TVUJTVChUS19MSUJfU1BFQykKK10pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKK2RubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKK0FDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0wsIFsKKyAgICBDWUdfQUNfUEFUSF9JVENMSAorICAgIENZR19BQ19QQVRIX0lUQ0xMSUIKKyAgICBDWUdfQUNfUEFUSF9JVENMU0gKKyAgICBDWUdfQUNfUEFUSF9JVENMTUtJRFgKK10pCitBQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMSCwgWworZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK25vX2l0Y2w9dHJ1ZQorQUNfTVNHX0NIRUNLSU5HKGZvciBJdGNsIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQorQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xoLFsKK2RubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKK2lmIHRlc3QgeCIke3dpdGhfaXRjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vaXRjbC5oIDsgdGhlbgorICAgIGFjX2N2X2NfaXRjbGg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAorICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbC5oIDsgdGhlbgorICAgIGFjX2N2X2NfaXRjbGg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYzsgcHdkKWAKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQorICBmaQorZmkKKworZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIEl0Y2wgY29uZmlndXJhdGlvbiBmaWxlCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiAhPSB4IDsgdGhlbgorICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICBpZiB0ZXN0IC1mICRhY19jdl9jX2l0Y2xjb25maWcvJGkvc3JjL2l0Y2wuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfaXRjbGg9YChjZCAkYWNfY3ZfY19pdGNsY29uZmlnLyRpL3NyYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Citkbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCisgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKKyAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCisJICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKKwkgICAgYnJlYWsKKwlmaQorICAgIGRvbmUKKworICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQorICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCisgICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2l0Y2wuaCA7IHRoZW4KKyAgICAgICAgICBhY19jdl9jX2l0Y2xoPWAoY2QgJGkvc3JjOyBwd2QpYAorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgZG9uZQorZmkKKworZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgorICAgQUNfTVNHX1JFU1VMVChub25lKQorICAgQUNfQ0hFQ0tfSEVBREVSKGl0Y2wuaCwgYWNfY3ZfY19pdGNsaD1pbnN0YWxsZWQsIGFjX2N2X2NfaXRjbGg9IiIpCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsaH0pCitmaQorXSkKKyAgSVRDTEhESVI9IiIKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBJdGNsIGhlYWRlcnNdKQorZmkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiAhPSB4IDsgdGhlbgorICAgIG5vX2l0Y2w9IiIKKyAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgorICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsaH0pCisgICAgICAgIElUQ0xIRElSPSItSSR7YWNfY3ZfY19pdGNsaH0iCisgICAgZmkKK2ZpCisKK0FDX1NVQlNUKElUQ0xIRElSKQorXSkKKworZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgbGlicmFyeQorZG5sIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKK2RubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGNsbGliCitBQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMTElCLCBbCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgoraWYgdGVzdCB4IiR7bm9faXRjbH0iID0geCA7IHRoZW4KKyAgICBkbmwgd2UgcmVzZXQgbm9faXRjbCBpbmNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKKyAgICBub19pdGNsPXRydWUKKyAgICBBQ19BUkdfV0lUSChpdGNsbGliLAorCVsgIC0td2l0aC1pdGNsbGliICAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgdGhlIGl0Y2wgbGlicmFyeSBpc10sCisgICAgICAgIHdpdGhfaXRjbGxpYj0ke3dpdGh2YWx9KQorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIEl0Y2wgbGlicmFyeV0pCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGxpYixbCisgICAgZG5sIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGxpYiB3YXMgc3BlY2lmaWVkLgorICAgIGlmIHRlc3QgeCIke3dpdGhfaXRjbGxpYn0iICE9IHggOyB0aGVuCisgICAgICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsbGlifS9saWJpdGNsJFRDTF9TSEFSRURfTElCX1NVRkZJWCIgOyB0aGVuCisgICAgICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAke3dpdGhfaXRjbGxpYn07IHB3ZClgL2xpYml0Y2wkVENMX1NIQVJFRF9MSUJfU1VGRklYCisJZWxzZQorCSAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRjbGxpYn0vbGliaXRjbCRUQ0xfVU5TSEFSRURfTElCX1NVRkZJWCI7IHRoZW4KKwkgCWFjX2N2X2NfaXRjbGxpYj1gKGNkICR7d2l0aF9pdGNsbGlifTsgcHdkKWAvbGliaXRjbCRUQ0xfVU5TSEFSRURfTElCX1NVRkZJWAorCSAgICBmaQorCWZpCisgICAgZmkKKyAgICBkbmwgdGhlbiBjaGVjayBmb3IgYSAgSXRjbCBsaWJyYXJ5LiBTaW5jZSB0aGVzZSBhcmUgdW5pbnN0YWxsZWQsCisgICAgZG5sIHVzZSB0aGUgc2ltcGxlIGxpYiBuYW1lIHJvb3QuIAorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KKyAgICAgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIGJ1aWxkIGRpcmVjdG9yeQorICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KKwkgICAgICAgIGl0Y2xwYXRoPSRpL2l0Y2wKKwkgICAgICAgIGJyZWFrCisJICAgIGZpCisgICAgICAgIGRvbmUKKyAgICAgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgorICAgICAgICBpZiB0ZXN0IC1mICIkaXRjbHBhdGgvc3JjL2xpYml0Y2wuJFRDTF9TSExJQl9TVUZGSVgiIDsgdGhlbgorCSAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGl0Y2xwYXRoL3NyYzsgcHdkKWAKKyAgICAgICAgZWxpZiB0ZXN0IC1mICIkaXRjbHBhdGgvc3JjL2xpYml0Y2wuYSI7IHRoZW4KKwkgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpdGNscGF0aC9zcmM7IHB3ZClgCisJZmkKKyAgICBmaQorICAgIGRubCBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucworICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KKyAgICAgICAgZm9yIGkgaW4gJHtkaXJsaXN0fTsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHtzcmNkaXJ9LyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCisJICAgICAgICBpdGNscGF0aD0ke3NyY2Rpcn0vJGkKKwkgICAgICAgIGJyZWFrCisJICAgIGZpCisgICAgICAgIGRvbmUKKyAgICAgICAgZm9yIGkgaW4gYGxzIC1kciAke2l0Y2xwYXRofS9pdGNsKiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgICAgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgorICAgICAgICAgICAgaWYgdGVzdCAtZiAiJGkvc3JjL2xpYml0Y2wkVENMX1NITElCX1NVRkZJWCIgOyB0aGVuCisJICAgICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaS9zcmM7IHB3ZClgCisJICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiB0ZXN0IC1mICIkaS9zcmMvbGliaXRjbC5hIjsgdGhlbgorCSAgICAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGkvc3JjOyBwd2QpYAorCSAgICAgICAgYnJlYWsKKwkgICAgZmkJCisgICAgICAgIGRvbmUKKyAgICBmaQorCisgICAgZG5sIHNlZSBpZiBvbmUgaXMgY29udmVuaWVudGx5IGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlcgorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KKyAgICAgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKKwljY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9saWIKKyAgICAgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgorICAgICAgICBpZiB0ZXN0IC1mICIke2NjcGF0aH0vbGliaXRjbCRUQ0xfU0hMSUJfU1VGRklYIiA7IHRoZW4KKwkgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJHtjY3BhdGh9OyBwd2QpYAorICAgICAgICBlbGlmIHRlc3QgLWYgIiR7Y2NwYXRofS9saWJpdGNsLmEiOyB0aGVuCisJICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICR7Y2NwYXRofTsgcHdkKWAKKyAgICAgICAgZmkKKyAgICBmaQorICAgIF0pCisgICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbGlifSIgPSB4IDsgdGhlbgorICAgICAgICBJVENMTElCPSIiCisgICAgICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgSXRjbCBsaWJyYXJ5KQorICAgIGVsc2UKKyAgICAgICAgSVRDTExJQj0iLUwke2FjX2N2X2NfaXRjbGxpYn0iCisgICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xsaWJ9KQorICAgICAgICBub19pdGNsPSIiCisgICAgZmkKK2ZpCisKK0FDX1BST1ZJREUoWyQwXSkKK0FDX1NVQlNUKElUQ0xMSUIpCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGl0Y2xfc2ggc2NyaXB0CitkbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLWl0Y2xpbmNsdWRlCitBQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMU0gsIFsKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitub19pdGNsPXRydWUKK0FDX01TR19DSEVDS0lORyhmb3IgdGhlIGl0Y2xfc2ggc2NyaXB0KQorQUNfQVJHX1dJVEgoaXRjbGluY2x1ZGUsIFsgIC0td2l0aC1pdGNsaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgaXRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfaXRjbGluY2x1ZGU9JHt3aXRodmFsfSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xzaCxbCitkbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCitpZiB0ZXN0IHgiJHt3aXRoX2l0Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KKyAgaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L2l0Y2xfc2ggOyB0aGVuCisgICAgYWNfY3ZfY19pdGNsc2g9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9OyBwd2QpYAorICBlbGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmMvaXRjbF9zaCA7IHRoZW4KKyAgICBhY19jdl9jX2l0Y2xzaD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjOyBwd2QpYAorICBlbHNlCisgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbF9zaF0pCisgIGZpCitmaQorCitkbmwgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKK2RubCBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCisgICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBJdGNsIHNvdXJjZSBkaXJlY3RvcnkKKyAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KKyAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCisJICAgIGl0Y2xwYXRoPSRzcmNkaXIvJGkKKwkgICAgYnJlYWsKKwlmaQorICAgIGRvbmUKKworICAgIGRubCBmaW5kIHRoZSBleGFjdCBJdGNsIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQorICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIEl0Y2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCisgICAgZm9yIGkgaW4gYGxzIC1kciAkaXRjbHBhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGkvc3JjL2l0Y2xfc2ggOyB0aGVuCisgICAgICAgICAgYWNfY3ZfY19pdGNsc2g9YChjZCAkaS9zcmM7IHB3ZClgL2l0Y2xfc2gKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgIGRvbmUKK2ZpCisKK2RubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsc2h9IiA9IHggOyB0aGVuCisgICBBQ19NU0dfUkVTVUxUKG5vbmUpCisgICBBQ19QQVRIX1BST0coYWNfY3ZfY19pdGNsc2gsIGl0Y2xfc2gpCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsc2h9KQorZmkKK10pCisKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbHNofSIgPSB4IDsgdGhlbgorICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCB0aGUgaXRjbF9zaCBzY3JpcHRdKQorZmkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbHNofSIgIT0geCA7IHRoZW4KKyAgICBub19pdGNsPSIiCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbHNofSkKKyAgICBJVENMU0g9IiR7YWNfY3ZfY19pdGNsc2h9IgorZmkKK0FDX1NVQlNUKElUQ0xTSCkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaXRjbF9zaCBzY3JpcHQKK2RubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtaXRjbGluY2x1ZGUKK0FDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xNS0lEWCwgWworZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK25vX2l0Y2w9dHJ1ZQorQUNfTVNHX0NIRUNLSU5HKGZvciBpdGNsX21raW5kZXgudGNsIHNjcmlwdCkKK0FDX0FSR19XSVRIKGl0Y2xpbmNsdWRlLCBbICAtLXdpdGgtaXRjbGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGl0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX2l0Y2xpbmNsdWRlPSR7d2l0aHZhbH0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsbWtpZHgsWworZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAoraWYgdGVzdCB4IiR7d2l0aF9pdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCisgIGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9pdGNsX3NoIDsgdGhlbgorICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfTsgcHdkKWAKKyAgZWxpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjL2l0Y2xfc2ggOyB0aGVuCisgICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYzsgcHdkKWAKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xfc2hdKQorICBmaQorZmkKKworZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Citkbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgPSB4IDsgdGhlbgorICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgSXRjbCBzb3VyY2UgZGlyZWN0b3J5CisgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgorCSAgICBpdGNscGF0aD0kc3JjZGlyLyRpCisJICAgIGJyZWFrCisJZmkKKyAgICBkb25lCisKKyAgICBkbmwgZmluZCB0aGUgZXhhY3QgSXRjbCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKKyAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBJdGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgorICAgIGZvciBpIGluIGBscyAtZHIgJGl0Y2xwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRpL2xpYnJhcnkvaXRjbF9ta2luZGV4LnRjbCA7IHRoZW4KKyAgICAgICAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICRpL2xpYnJhcnk7IHB3ZClgL2l0Y2xfbWtpbmRleC50Y2wKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgIGRvbmUKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iID0geCA7IHRoZW4KKyAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgorICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL3NoYXJlCisgICAgZG5sIEl0Y2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgorICAgIGZvciBpIGluIGBscyAtZHIgJGNjcGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkaS9pdGNsX21raW5kZXgudGNsIDsgdGhlbgorICAgICAgICAgICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAkaTsgcHdkKWAvaXRjbF9ta2luZGV4LnRjbAorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICBkb25lCitmaQorXSkKKworaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiA9IHggOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIHRoZSBpdGNsX21raW5kZXgudGNsIHNjcmlwdF0pCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiAhPSB4IDsgdGhlbgorICAgIG5vX2l0Y2w9IiIKKyAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsbWtpZHh9KQorICAgIElUQ0xNS0lEWD0iJHthY19jdl9jX2l0Y2xta2lkeH0iCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorQUNfU1VCU1QoSVRDTE1LSURYKQorXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgT2ssIGxldHMgZmluZCB0aGUgdGl4IHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCitkbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLXRpeGluY2x1ZGUKK0FDX0RFRlVOKENZR19BQ19QQVRIX1RJWCwgWworICAgIENZR19BQ19QQVRIX1RJWEgKKyAgICBDWUdfQUNfUEFUSF9USVhMSUIKK10pCitBQ19ERUZVTihDWUdfQUNfUEFUSF9USVhILCBbCitkaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgorbm9fdGl4PXRydWUKK0FDX01TR19DSEVDS0lORyhmb3IgVGl4IGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQorQUNfQVJHX1dJVEgodGl4aW5jbHVkZSwgWyAgLS13aXRoLXRpeGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRpeCBoZWFkZXJzIGFyZV0sIHdpdGhfdGl4aW5jbHVkZT0ke3dpdGh2YWx9KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGl4aCxbCitkbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10aXhpbmNsdWRlIHdhcyBzcGVjaWZpZWQKK2lmIHRlc3QgeCIke3dpdGhfdGl4aW5jbHVkZX0iICE9IHggOyB0aGVuCisgIGlmIHRlc3QgLWYgJHt3aXRoX3RpeGluY2x1ZGV9L3RpeC5oIDsgdGhlbgorICAgIGFjX2N2X2NfdGl4aD1gKGNkICR7d2l0aF90aXhpbmNsdWRlfTsgcHdkKWAKKyAgZWxpZiB0ZXN0IC1mICR7d2l0aF90aXhpbmNsdWRlfS9nZW5lcmljL3RpeC5oIDsgdGhlbgorICAgIGFjX2N2X2NfdGl4aD1gKGNkICR7d2l0aF90aXhpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAorICBlbHNlCisgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGl4aW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKKyAgZmkKK2ZpCisKK2RubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUaXggY29uZmlndXJhdGlvbiBmaWxlCitpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iICE9IHggOyB0aGVuCisgIGZvciBpIGluICRkaXJsaXN0OyBkbworICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGl4Y29uZmlnLyRpL2dlbmVyaWMvdGl4LmggOyB0aGVuCisgICAgICBhY19jdl9jX3RpeGg9YChjZCAkYWNfY3ZfY190aXhjb25maWcvJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Citkbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KKyAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRpeCBzb3VyY2UgZGlyZWN0b3J5CisgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS90aXgqIDI+L2Rldi9udWxsYCIgOyB0aGVuCisJICAgIHRpeHBhdGg9JHNyY2Rpci8kaQorCSAgICBicmVhaworCWZpCisgICAgZG9uZQorCisgICAgZG5sIGZpbmQgdGhlIGV4YWN0IFRpeCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKKyAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUaXgsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCisgICAgZm9yIGkgaW4gYGxzIC1kciAkdGl4cGF0aC90aXgqIDI+L2Rldi9udWxsIGAgOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGl4LmggOyB0aGVuCisgICAgICAgICAgYWNfY3ZfY190aXhoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgIGRvbmUKK2ZpCisKK2RubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAoraWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgorICAgIEFDX01TR19SRVNVTFQobm9uZSkKKyAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgorCisgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlci4gV2UgZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZworICAgIGRubCBBQ19DSEVDS19IRUFERVIsIGNhdXNlIHRoaXMgZG9lc24ndCBkZXBlbmQgaW4gaGF2aW5nIFggY29uZmlndXJlZC4KKyAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9pbmNsdWRlCisgICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RpeC5oOyB0aGVuCisJYWNfY3ZfY190aXhoPWluc3RhbGxlZAorICAgIGZpCitlbHNlCisgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190aXhofSkKK2ZpCitdKQoraWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgorICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgVGl4IGhlYWRlcnNdKQorZmkKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iICE9IHggOyB0aGVuCisgICAgbm9fdGl4PSIiCisgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGl4aH0pCisgICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgIT0geCJpbnN0YWxsZWQiIDsgdGhlbgorICAgICAgICBUSVhIRElSPSItSSR7YWNfY3ZfY190aXhofSIKKyAgICBmaQorZmkKKworQUNfU1VCU1QoVElYSERJUikKK10pCisKK0FDX0RFRlVOKENZR19BQ19QQVRIX1RJWENPTkZJRywgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0aXggY29uZmlndXJhdGlvbgorIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRpeGNvbmZpZworIworCitpZiB0ZXN0IHgiJHtub190aXh9IiA9IHggOyB0aGVuCisgICMgd2UgcmVzZXQgbm9fdGl4IGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKKyAgbm9fdGl4PXRydWUKKyAgQUNfQVJHX1dJVEgodGl4Y29uZmlnLCBbICAtLXdpdGgtdGl4Y29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aXggY29uZmlndXJhdGlvbiAodGl4Q29uZmlnLnNoKV0sCisgICAgICAgICB3aXRoX3RpeGNvbmZpZz0ke3dpdGh2YWx9KQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUaXggY29uZmlndXJhdGlvbl0pCisgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RpeGNvbmZpZyxbCisKKyAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRpeGNvbmZpZyB3YXMgc3BlY2lmaWVkLgorICBpZiB0ZXN0IHgiJHt3aXRoX3RpeGNvbmZpZ30iICE9IHggOyB0aGVuCisgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RpeGNvbmZpZ30vdGl4Q29uZmlnLnNoIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJHt3aXRoX3RpeGNvbmZpZ307IHB3ZClgCisgICAgZWxzZQorICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGl4Y29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRpeENvbmZpZy5zaF0pCisgICAgZmkKKyAgZmkKKworICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBUaXggbGlicmFyeQorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCS4uL3RpeCBcCisJCWBscyAtZHIgLi4vdGl4W1s0XV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uL3RpeCBcCisJCWBscyAtZHIgLi4vLi4vdGl4W1s0XV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uLy4uL3RpeCBcCisJCWBscyAtZHIgLi4vLi4vLi4vdGl4W1s0XV0qIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS90aXhDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vdGl4IFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGl4W1s0LTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICBdKQorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBUSVhDT05GSUc9IiMgbm8gVGl4IGNvbmZpZ3MgZm91bmQiCisgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUaXggY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKKyAgZWxzZQorICAgIG5vX3RpeD0KKyAgICBUSVhDT05GSUc9JHthY19jdl9jX3RpeGNvbmZpZ30vdGl4Q29uZmlnLnNoCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkVElYQ09ORklHKQorICBmaQorZmkKKworXSkKKworIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCisjIGZyb20gUEFUSF9USVhDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lHX0FDX0xPQURfVElYQ09ORklHLCBbCisgICAgaWYgdGVzdCAtZiAiJFRJWENPTkZJRyIgOyB0aGVuCisgICAgICAuICRUSVhDT05GSUcKKyAgICBmaQorCisgICAgQUNfU1VCU1QoVElYX0JVSUxEX0xJQl9TUEVDKQorICAgIEFDX1NVQlNUKFRJWF9MSUJfRlVMTF9QQVRIKQorXSkKKworQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTENPTkZJRywgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIGNvbmZpZ3VyYXRpb24KKyMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGNsY29uZmlnCisjCisKK2lmIHRlc3QgeCIke25vX2l0Y2x9IiA9IHggOyB0aGVuCisgICMgd2UgcmVzZXQgbm9faXRjbCBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCisgIG5vX2l0Y2w9dHJ1ZQorICBBQ19BUkdfV0lUSChpdGNsY29uZmlnLCBbICAtLXdpdGgtaXRjbGNvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXRjbCBjb25maWd1cmF0aW9uIChpdGNsQ29uZmlnLnNoKV0sCisgICAgICAgICB3aXRoX2l0Y2xjb25maWc9JHt3aXRodmFsfSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRjbCBjb25maWd1cmF0aW9uXSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbGNvbmZpZyxbCisKKyAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xjb25maWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgdGVzdCB4IiR7d2l0aF9pdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRjbGNvbmZpZ30vaXRjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAke3dpdGhfaXRjbGNvbmZpZ307IHB3ZClgCisgICAgZWxzZQorICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGNsQ29uZmlnLnNoXSkKKyAgICBmaQorICBmaQorCisgICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIGl0Y2wgbGlicmFyeQorICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkuLi9pdGNsL2l0Y2wgXAorCQlgbHMgLWRyIC4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi9pdGNsL2l0Y2wgXAorCQlgbHMgLWRyIC4uLy4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi8uLi9pdGNsL2l0Y2wgXAorCQlgbHMgLWRyIC4uLy4uLy4uL2l0Y2wvaXRjbFtbM11dKiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi9pdGNsL2l0Y2wgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi9pdGNsL2l0Y2xbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2wvaXRjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIElUQ0xDT05GSUc9IiMgbm8gaXRjbCBjb25maWdzIGZvdW5kIgorICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgaXRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQorICBlbHNlCisgICAgbm9faXRjbD0KKyAgICBJVENMQ09ORklHPSR7YWNfY3ZfY19pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkSVRDTENPTkZJRykKKyAgZmkKK2ZpCisKK10pCisKKyMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcworIyBmcm9tIFBBVEhfSVRDTENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCitBQ19ERUZVTihDWUdfQUNfTE9BRF9JVENMQ09ORklHLCBbCisgICAgaWYgdGVzdCAtZiAiJElUQ0xDT05GSUciIDsgdGhlbgorICAgICAgLiAkSVRDTENPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChJVENMX0JVSUxEX0xJQl9TUEVDKQorICAgIEFDX1NVQlNUKElUQ0xfU0gpCisgICAgQUNfU1VCU1QoSVRDTF9MSUJfRklMRSkKKyAgICBBQ19TVUJTVChJVENMX0xJQl9GVUxMX1BBVEgpCisKK10pCisKKworQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRLQ09ORklHLCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIGl0ayBjb25maWd1cmF0aW9uCisjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKKyMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRrY29uZmlnCisjCisKK2lmIHRlc3QgeCIke25vX2l0a30iID0geCA7IHRoZW4KKyAgIyB3ZSByZXNldCBub19pdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQorICBub19pdGs9dHJ1ZQorICBBQ19BUkdfV0lUSChpdGtjb25maWcsIFsgIC0td2l0aC1pdGtjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIGl0ayBjb25maWd1cmF0aW9uIChpdGtDb25maWcuc2gpXSwKKyAgICAgICAgIHdpdGhfaXRrY29uZmlnPSR7d2l0aHZhbH0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEl0ayBjb25maWd1cmF0aW9uXSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRrY29uZmlnLFsKKworICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRrY29uZmlnIHdhcyBzcGVjaWZpZWQuCisgIGlmIHRlc3QgeCIke3dpdGhfaXRrY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRrY29uZmlnfS9pdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAke3dpdGhfaXRrY29uZmlnfTsgcHdkKWAKKyAgICBlbHNlCisgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRrQ29uZmlnLnNoXSkKKyAgICBmaQorICBmaQorCisgICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIGl0ayBsaWJyYXJ5CisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vaXRjbC9pdGsgXAorCQlgbHMgLWRyIC4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uL2l0Y2wvaXRrIFwKKwkJYGxzIC1kciAuLi8uLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi8uLi9pdGNsL2l0ayBcCisJCWBscyAtZHIgLi4vLi4vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbC9pdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi9pdGNsL2l0ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9pdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCisgICAgSVRDTENPTkZJRz0iIyBubyBpdGsgY29uZmlncyBmb3VuZCIKKyAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIGl0ayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQorICBlbHNlCisgICAgbm9faXRrPQorICAgIElUS0NPTkZJRz0ke2FjX2N2X2NfaXRrY29uZmlnfS9pdGtDb25maWcuc2gKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRJVEtDT05GSUcpCisgIGZpCitmaQorCitdKQorCisjIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKKyMgZnJvbSBQQVRIX0lUS0NPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCitBQ19ERUZVTihDWUdfQUNfTE9BRF9JVEtDT05GSUcsIFsKKyAgICBpZiB0ZXN0IC1mICIkSVRLQ09ORklHIiA7IHRoZW4KKyAgICAgIC4gJElUS0NPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChJVEtfQlVJTERfTElCX1NQRUMpCisgICAgQUNfU1VCU1QoSVRLX0xJQl9GSUxFKQorICAgIEFDX1NVQlNUKElUS19MSUJfRlVMTF9QQVRIKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBPaywgbGV0cyBmaW5kIHRoZSBsaWJndWkgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKK2RubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtbGliZ3VpaW5jbHVkZQorQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJLCBbCisgICAgQ1lHX0FDX1BBVEhfTElCR1VJSAorICAgIENZR19BQ19QQVRIX0xJQkdVSUxJQgorXSkKK0FDX0RFRlVOKENZR19BQ19QQVRIX0xJQkdVSUgsIFsKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKK25vX2xpYmd1aT10cnVlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIExpYmd1aSBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKK0FDX0FSR19XSVRIKGxpYmd1aWluY2x1ZGUsIFsgIC0td2l0aC1saWJndWlpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBsaWJndWkgaGVhZGVycyBhcmVdLCB3aXRoX2xpYmd1aWluY2x1ZGU9JHt3aXRodmFsfSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX2xpYmd1aWgsWworZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtbGliZ3VpaW5jbHVkZSB3YXMgc3BlY2lmaWVkCitpZiB0ZXN0IHgiJHt3aXRoX2xpYmd1aWluY2x1ZGV9IiAhPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICR7d2l0aF9saWJndWlpbmNsdWRlfS9ndWl0Y2wuaCA7IHRoZW4KKyAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAke3dpdGhfbGliZ3VpaW5jbHVkZX07IHB3ZClgCisgIGVsaWYgdGVzdCAtZiAke3dpdGhfbGliZ3VpaW5jbHVkZX0vc3JjL2d1aXRjbC5oIDsgdGhlbgorICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICR7d2l0aF9saWJndWlpbmNsdWRlfS9zcmM7IHB3ZClgCisgIGVsc2UKKyAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9saWJndWlpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGhlYWRlcnNdKQorICBmaQorZmkKKworZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIExpYmd1aSBjb25maWd1cmF0aW9uIGZpbGUKK2lmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgaWYgdGVzdCAtZiAkYWNfY3ZfY19saWJndWljb25maWcvJGkvc3JjL2d1aXRjbC5oIDsgdGhlbgorICAgICAgYWNfY3ZfY19saWJndWloPWAoY2QgJGFjX2N2X2NfbGliZ3VpY29uZmlnLyRpL3NyYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Citkbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KKyAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIExpYmd1aSBzb3VyY2UgZGlyZWN0b3J5CisgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS9saWJndWkqIDI+L2Rldi9udWxsYCIgOyB0aGVuCisJICAgIGxpYmd1aXBhdGg9JHNyY2Rpci8kaQorCSAgICBicmVhaworCWZpCisgICAgZG9uZQorCisgICAgZG5sIGZpbmQgdGhlIGV4YWN0IExpYmd1aSBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKKyAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBMaWJndWksIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCisgICAgZm9yIGkgaW4gYGxzIC1kciAkbGliZ3VpcGF0aC9saWJndWkqIDI+L2Rldi9udWxsIGAgOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRpL3NyYy9ndWl0Y2wuaCA7IHRoZW4KKyAgICAgICAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAkaS9zcmM7IHB3ZClgCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICBkb25lCitmaQorCitkbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKK2lmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iID0geCA7IHRoZW4KKyAgIEFDX01TR19SRVNVTFQobm9uZSkKKyAgIEFDX0NIRUNLX0hFQURFUihndWl0Y2wuaCwgYWNfY3ZfY19saWJndWloPWluc3RhbGxlZCwgYWNfY3ZfY19saWJndWloPSIiKQorZmkKK10pCitMSUJHVUlIRElSPSIiCitpZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiA9IHggOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW0Nhbid0IGZpbmQgYW55IExpYmd1aSBoZWFkZXJzXSkKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiAhPSB4IDsgdGhlbgorICAgIG5vX2xpYmd1aT0iIgorICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpaH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KKyAgICAgICAgTElCR1VJSERJUj0iLUkke2FjX2N2X2NfbGliZ3VpaH0iCisgICAgZmkKK2ZpCitBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJndWlofSkKK0FDX1NVQlNUKExJQkdVSUhESVIpCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBmaW5kIHRoZSBHVUkgbGlicmFyeQorQUNfREVGVU4oQ1lHX0FDX1BBVEhfTElCR1VJTElCLCBbCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEdVSSBsaWJyYXJ5ICBpbiB0aGUgYnVpbGQgdHJlZSkKK2Rpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCitkbmwgbG9vayBmb3IgdGhlIGxpYnJhcnkKK0FDX01TR19DSEVDS0lORyhmb3IgR1VJIGxpYnJhcnkpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19saWJndWlsaWIsWworaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlsaWJ9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9saWJndWkvc3JjL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY19saWJndWlsaWI9YChjZCAkaS9saWJndWkvc3JjOyBwd2QpYAorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCitmaQorXSkgCitpZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWxpYn0iICE9IHggOyB0aGVuCisgICAgIEdVSUxJQj0iJHtHVUlMSUJ9IC1MJHthY19jdl9jX2xpYmd1aWxpYn0iCisgICAgIExJQkdVSUxJQj0iLWxndWkiCisgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmd1aWxpYn0pCitlbHNlCisgICAgIEFDX01TR19SRVNVTFQobm9uZSkKK2ZpCisKK0FDX1NVQlNUKEdVSUxJQikKK0FDX1NVQlNUKExJQkdVSUxJQikKK10pCmRpZmYgLS1naXQgYS9jb25maWcvbWgtYTY4YnNkIGIvY29uZmlnL21oLWE2OGJzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTkxMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWE2OGJzZApAQCAtMCwwICsxLDEyIEBACitSQU5MSUI9dHJ1ZQorCisjTm9uZSBvZiB0aGUgQXBvbGxvIGNvbXBpbGVycyBjYW4gY29tcGlsZSBnYXMgb3IgYmludXRpbHMuICBUaGUgcHJlcHJvY2Vzc29yCisjIGNob2tlcyBvbiBiZmQsIHRoZSBjb21waWxlciB3b24ndCBsZXQgeW91IGFzc2lnbiBpbnRlZ2VycyB0byBlbnVtcywgYW5kCisjIG90aGVyIHByb2JsZW1zLiAgRGVmaW5pbmcgQ0MgdG8gZ2NjIGlzIGEgcXVlc3Rpb25hYmxlIHdheSB0byBzYXkgImRvbid0IHVzZQorIyB0aGUgYXBvbGxvIGNvbXBpbGVyIiAodGhlIHByZWZlcnJlZCB2ZXJzaW9uIG9mIEdDQyBjb3VsZCBiZSBjYWxsZWQgY2MsCisjIG9yIHdoYXRldmVyKSwgYnV0IEknbSBub3Qgc3VyZSBsZWF2aW5nIENDIGFzIGNjIGlzIGFueSBiZXR0ZXIuLi4KKworI0NDPWNjIC1BIGFuc2kgLUEgcnVudHlwZSxhbnkgLUEgc3lzdHlwZSxhbnkgLVVfX1NURENfXyAtRE5PX1NUREFSRworQ0M9Z2NjCisKK0JJU09OPXlhY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1haXgzODYgYi9jb25maWcvbWgtYWl4Mzg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhY2NkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtYWl4Mzg2CkBAIC0wLDAgKzEgQEAKK1JBTkxJQiA9IEA6CmRpZmYgLS1naXQgYS9jb25maWcvbWgtYWl4NDMgYi9jb25maWcvbWgtYWl4NDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViNzUwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taC1haXg0MwpAQCAtMCwwICsxLDQgQEAKKyMgQUlYIDQuMyBhbmQgYWJvdmUgcmVxdWlyZXMgLVgzMl82NCBmbGFnIHRvIGFsbCBhciBhbmQgbm0gY29tbWFuZHMKKyMgdG8gaGFuZGxlIGJvdGggMzItYml0IGFuZCA2NC1iaXQgb2JqZWN0cy4KK0FSX0ZPUl9UQVJHRVQ9YXIgLVgzMl82NAorTk1fRk9SX1RBUkdFVD1ubSAtWDMyXzY0CmRpZmYgLS1naXQgYS9jb25maWcvbWgtYXBvbGxvNjggYi9jb25maWcvbWgtYXBvbGxvNjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5N2VkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taC1hcG9sbG82OApAQCAtMCwwICsxLDMgQEAKK0hERUZJTkVTID0gLURVU0cKK1JBTkxJQj10cnVlCitDQz0gY2MgLUEgYW5zaSAtQSBydW50eXBlLGFueSAtQSBzeXN0eXBlLGFueSAtVV9fU1REQ19fIC1EVVNHCmRpZmYgLS1naXQgYS9jb25maWcvbWgtYXJtcGljIGIvY29uZmlnL21oLWFybXBpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNmMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWFybXBpYwpAQCAtMCwwICsxIEBACitQSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3h1eCBiL2NvbmZpZy9taC1jeHV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjJhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtY3h1eApAQCAtMCwwICsxLDE0IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIEhhcnJpcyBDWC9VWCA3IChhbmQgbWF5YmUgNiksIGJhc2VkIG9uIHN5c3Y0IGNvbmZpZ3VyYXRpb24uCisKKyMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgorU1lTViA9IC1EU1lTViAtRFNWUjQKK1JBTkxJQiA9IHRydWUKKworIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQorQ1hYRkxBR1M9LU8KKworIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgorQVJfRkxBR1MgPSBjcQorCisjIFVuZGVyIENYL1VYLCB3ZSB3YW50IHRvIHRlbGwgdGhlIGNvbXBpbGVyIHRvIHVzZSBBTlNJIG1vZGUuCitDQz1jYyAtWGEKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1jeWd3aW4gYi9jb25maWcvbWgtY3lnd2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTAyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtY3lnd2luCkBAIC0wLDAgKzEsNiBAQAorRVhUUkFfVEFSR0VUX0hPU1RfQUxMX01PRFVMRVM9YWxsLWxpYnRlcm1jYXAKK0VYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUz1pbnN0YWxsLWxpYnRlcm1jYXAKKworYWxsLWdkYjogYWxsLWxpYnRlcm1jYXAKKworaW5zdGFsbC1nZGI6IGFsbC1saWJ0ZXJtY2FwCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGVjc3RhdGlvbiBiL2NvbmZpZy9taC1kZWNzdGF0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjAxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtZGVjc3RhdGlvbgpAQCAtMCwwICsxLDUgQEAKK0NDID0gY2MgLVdmLC1YTmcxMDAwCisKKyMgZm9yIFgxMSwgc2luY2UgdGhlIG5hdGl2ZSBERUN3aW5kb3dzIGluY2x1ZGUgZmlsZXMgYXJlIHJlYWxseSBicm9rZW4gd2hlbgorIyBpdCBjb21lcyB0byBmdW5jdGlvbiBwcm90b3R5cGVzLiAgCitYMTFfRVhUUkFfQ0ZMQUdTID0gIi1ETmVlZEZ1bmN0aW9uUHJvdG90eXBlcz0wIgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRlbHRhODggYi9jb25maWcvbWgtZGVsdGE4OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzljNDUzCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWRlbHRhODgKQEAgLTAsMCArMSw0IEBACitSQU5MSUIgPSB0cnVlCisKKworCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGd1eCBiL2NvbmZpZy9taC1kZ3V4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDg1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtZGd1eApAQCAtMCwwICsxLDQgQEAKK0hERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKK0NDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAorUkFOTElCPXRydWUKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRndXgzODYgYi9jb25maWcvbWgtZGd1eDM4NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg4NWMzCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWRndXgzODYKQEAgLTAsMCArMSwyMiBAQAorIyBmcm9tIG1oLWRndXgKK0hERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKK0NDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAorUkFOTElCID0gdHJ1ZQorCisjIGZyb20gbWgtc3lzdjQKKyMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgorU1lTViA9IC1EU1lTViAtRFNWUjQKK1JBTkxJQiA9IHRydWUKKworIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQorQ1hYRkxBR1M9LU8KKworIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgorQVJfRkxBR1MgPSBjcgorCitYMTFfRVhUUkFfTElCUyA9IC1sbnNsCisKKyMgZnJvbSBhbmdlbGEKKyMgbm8gZGVidWdnaW5nIGR1ZSB0byBicm9rZW4gY29tcGlsZXIsIHVzZSBCU0Qgc3R5bGUgdGltZW9mZGF5CitDRkxBR1M9LU8gLURfQlNEX1RJTUVPRkRBWV9GTEFWT1IKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRqZ3BwIGIvY29uZmlnL21oLWRqZ3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMjAwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtZGpncHAKQEAgLTAsMCArMSw0IEBACisjIFdlIGRvbid0IHdhbnQgdG8gdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvbiBET1MuICBVbmZvcnR1bmF0ZWx5LAorIyB0aGlzIHJlcXVpcmVzIHRoYXQgd2Ugc2V0IENGTEFHUy4KKyMgVGhpcyB1c2VkIHRvIHNldCAtZm5vLW9taXQtZnJhbWUtcG9pbnRlci4KK0NGTEFHUz0tTzIKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1lbGZhbHBoYXBpYyBiL2NvbmZpZy9taC1lbGZhbHBoYXBpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNmMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWVsZmFscGhhcGljCkBAIC0wLDAgKzEgQEAKK1BJQ0ZMQUc9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocDMwMCBiL2NvbmZpZy9taC1ocDMwMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE3MjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWhwMzAwCkBAIC0wLDAgKzEsMTMgQEAKKyMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgorU1lTViA9IC1EU1lTVgorIyBBdm9pZCAidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIEhQVVggY29tcGlsZXIuCitDQyA9IGNjIC1XcCwtSDI1NjAwMAorIyBJZiAiYXIiIGluICRQQVRIIGlzIEdOVSBhciwgdGhlIHN5bWJvbCB0YWJsZSBtYXkgbmVlZCByZWJ1aWxkaW5nLgorIyBJZiBpdCdzIEhQL1VYIGFyLCB0aGlzIHNob3VsZCBiZSBoYXJtbGVzcy4KK1JBTkxJQiA9IGFyIHRzCisKKyMgTmF0aXZlIGNjIGNhbid0IGJvb3RzdHJhcCBnY2Mgd2l0aCAtZy4gIERlZmluaW5nIENGTEFHUyBoZXJlIGxvc2VzIChhKQorIyBmb3Igbm9uLWdjYyBkaXJlY3RvcmllcywgKGIpIGlmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBnY2MsIG5vdAorIyBuYXRpdmUgY2MuICBOZWl0aGVyIChhKSBub3IgKGIpIGhhcyBhIHRyaXZpYWwgZml4IHRob3VnaC4KKworQ0ZMQUdTID0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4IGIvY29uZmlnL21oLWhwdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taC1ocHV4CkBAIC0wLDAgKzEsNCBAQAorIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCitDQyA9IGNjIC1XcCwtSDI1NjAwMAorU1lTViA9IC1EU1lTVgorUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWhwdXg4IGIvY29uZmlnL21oLWhwdXg4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzFjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtaHB1eDgKQEAgLTAsMCArMSw0IEBACisjIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KK0NDID0gY2MgLVdwLC1IMjU2MDAwCitTWVNWID0gLURTWVNWCitSQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaW50ZXJpeCBiL2NvbmZpZy9taC1pbnRlcml4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjhlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtaW50ZXJpeApAQCAtMCwwICsxLDE0IEBACisjIFRoZSBzaGVsbCBtYXkgbm90IGJlIGluIC9iaW4uIAorU0hFTEwgPSBzaAorUkFOTElCID0gdHJ1ZQorCisjIFdlIGRvbid0IHdhbnQgZGVidWdnaW5nIGluZm8gaW4gSW50ZXJpeC1ob3N0ZWQgdG9vbGNoYWlucy4KKyMgQWNjb21wbGlzaCB0aGlzIGJ5IG92ZXJyaWRpbmcgQ0ZMQUdTLiBUaGlzIGlzIGFsc28gYSB3b3JrYXJvdW5kCisjIGZvciBMRCBjcmFzaCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJzdGRjKysuCitDRkxBR1M9LU8yCitDWFhGTEFHUz0tTzIKKworIyBXZSBhbHNvIG5lZWQgdG8gb3ZlcnJpZGUgTElCR0NDMl9ERUJVR19DRkxBR1Mgc28gbGliZ2NjMiB3aWxsIGJlCisjIGJ1aWx0IHdpdGhvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uCisKK0xJQkdDQzJfREVCVUdfQ0ZMQUdTPQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg0IGIvY29uZmlnL21oLWlyaXg0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NzIxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtaXJpeDQKQEAgLTAsMCArMSw3IEBACisjIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFNHSSdzIHJ1bm5pbmcgSVJJWC00LnguCisjIFRlbGwgY29tcGlsZXIgdG8gdXNlIEsmUiBDLiAgV2UgY2FuJ3QgY29tcGlsZSB1bmRlciB0aGUgU0dJIEFuc2kKKyMgZW52aXJvbm1lbnQuICBBbHNvIGJ1bXAgc3dpdGNoIHRhYmxlIHNpemUgc28gdGhhdCBjcC1wYXJzZSB3aWxsCisjIGNvbXBpbGUuICBCdW1wIHN0cmluZyBsZW5ndGggbGltaXQgc28gbGlua2VyIGJ1aWxkcy4KKworQ0MgPSBjYyAtY2NrciAtV2YsLVhOZzE1MDAgLVdmLC1YTmsxMDAwIC1XZiwtWE5oMjAwMCAtV2YsLVhObDgxOTIKK1NZU1YgPSAtRFNZU1YKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pcml4NSBiL2NvbmZpZy9taC1pcml4NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ3Yzk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWlyaXg1CkBAIC0wLDAgKzEsMyBAQAorIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNS54LgorU1lTViA9IC1EU1lTVgorUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg2IGIvY29uZmlnL21oLWlyaXg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjVjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtaXJpeDYKQEAgLTAsMCArMSw3IEBACisjIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFNHSSdzIHJ1bm5pbmcgSVJJWC02LnguCitTWVNWID0gLURTWVNWCitSQU5MSUIgPSB0cnVlCisjIFNwZWNpZnkgdGhlIEFCSSwgdG8gZW5zdXJlIHRoYXQgYWxsIElyaXggNiBzeXN0ZW1zIHdpbGwgYmVoYXZlIHRoZSBzYW1lLgorIyBBbHNvLCB1c2luZyAtMzIgYXZvaWRzIGJ1Z3MgdGhhdCBleGlzdCBpbiB0aGUgbjMyL242NCBzdXBwb3J0IGluIHNvbWUKKyMgdmVyc2lvbnMgb2YgdGhlIFNHSSBjb21waWxlci4KK0NDID0gY2MgLTMyCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbHlueG9zIGIvY29uZmlnL21oLWx5bnhvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZjYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLWx5bnhvcwpAQCAtMCwwICsxLDIgQEAKKyMgL2Jpbi9jYyBpcyBsZXNzIHRoYW4gdXNlZnVsIGZvciBvdXIgcHVycG9zZXMuICBBbHdheXMgdXNlIEdDQworQ0MgPSAvYmluL2djYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWx5bnhyczZrIGIvY29uZmlnL21oLWx5bnhyczZrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzkzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtbHlueHJzNmsKQEAgLTAsMCArMSw4IEBACisjIEx5bnhPUyBydW5uaW5nIG9uIHRoZSByczYwMDAgZG9lc24ndCBoYXZlIHJhbmxpYgorUkFOTElCID0gdHJ1ZQorCisjIC9iaW4vY2MgaXMgbGVzcyB0aGFuIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzLiAgQWx3YXlzIHVzZSBHQ0MKK0NDID0gL3Vzci9jeWdudXMvcHJvZ3Jlc3NpdmUvYmluL2djYworCisjIC9iaW4vc2ggaXMgdG9vIGJ1Z2d5LCBzbyB1c2UgL2Jpbi9iYXNoIGluc3RlYWQuCitTSEVMTCA9IC9iaW4vYmFzaApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW02OGtwaWMgYi9jb25maWcvbWgtbTY4a3BpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmU0OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLW02OGtwaWMKQEAgLTAsMCArMSBAQAorUElDRkxBRz0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW1pbmd3MzIgYi9jb25maWcvbWgtbWluZ3czMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ4MzlkCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLW1pbmd3MzIKQEAgLTAsMCArMSwxMiBAQAorIyBXZSBkb24ndCB3YW50IGRlYnVnZ2luZyBpbmZvIGluIFdpbjMyLWhvc3RlZCB0b29sY2hhaW5zLgorIyBBY2NvbXBsaXNoIHRoaXMgYnkgb3ZlcnJpZGluZyBDRkxBR1MuCitDRkxBR1M9LU8yCitDWFhGTEFHUz0tTzIKKworIyBXZSBhbHNvIG5lZWQgdG8gb3ZlcnJpZGUgTElCR0NDMl9ERUJVR19DRkxBR1Mgc28gbGliZ2NjMiB3aWxsIGJlCisjIGJ1aWx0IHdpdGhvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uCisKK0xJQkdDQzJfREVCVUdfQ0ZMQUdTPQorCisjIGN1c3RvbSBpbnN0YWxsYXRpb24gcnVsZXMgZm9yIG1pbmd3MzIgKGFwcGVuZCAuZXhlIHRvIGJpbmFyaWVzLCBldGMuKQorIyBJTlNUQUxMX0RPU1JFTD1pbnN0YWxsLWRvc3JlbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW5jcjMwMDAgYi9jb25maWcvbWgtbmNyMzAwMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJkODAzCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLW5jcjMwMDAKQEAgLTAsMCArMSwxNyBAQAorIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNCkgc3lzdGVtLgorCisjIFRoZSBOQ1IgMzAwMCBzaGlwcyB3aXRoIGEgTWV0YVdhcmUgY29tcGlsZXIgaW5zdGFsbGVkIGFzIC9iaW4vY2MuCisjIFRoaXMgY29tcGlsZXIgbm90IG9ubHkgZW1pdHMgb2Jub3hpb3VzIGNvcHlyaWdodCBtZXNzYWdlcyBldmVyeSB0aW1lCisjIHlvdSBydW4gaXQsIGJ1dCBpdCBjaG9rZXMgYW5kIGRpZXMgb24gYSB3aG9sZSBidW5jaCBvZiBHTlUgc291cmNlCisjIGZpbGVzLiAgRGVmYXVsdCB0byB1c2luZyB0aGUgQVQmVCBjb21waWxlciBpbnN0YWxsZWQgaW4gL3Vzci9jY3MvQVRUL2NjLgorIyBVbmZvcnR1bmF0ZWx5IHRob3VnaCwgdGhlIEFUJlQgY29tcGlsZXIgc29tZXRpbWVzIGdlbmVyYXRlcyBjb2RlIHRoYXQKKyMgdGhlIGFzc2VtYmxlciBiYXJmcyBvbiBpZiAtZyBpcyB1c2VkLCBzbyBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQgYXMgd2VsbC4KK0NDID0gL3Vzci9jY3MvQVRUL2NjCitDRkxBR1MgPQorCisjIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KK1NZU1YgPSAtRFNZU1YgLURTVlI0CitSQU5MSUIgPSB0cnVlCisKKyMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KK0FSX0ZMQUdTID0gY3EKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uY3JzdnI0MyBiL2NvbmZpZy9taC1uY3JzdnI0MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2IwOTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLW5jcnN2cjQzCkBAIC0wLDAgKzEsOSBAQAorIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNDMpIHN5c3RlbS4KKworIyBUaGUgTWV0YVdhcmUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhIGNvcHlyaWdodCBtZXNzYWdlIHVubGVzcyB5b3UKKyMgdHVybiBpdCBvZmYgYnkgYWRkaW5nIHRoZSAtSG5vY29weXIgZmxhZy4KK0NDID0gY2MgLUhub2NvcHlyCisKKyMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgorU1lTViA9IC1EU1lTViAtRFNWUjQKK1JBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uZWN2NCBiL2NvbmZpZy9taC1uZWN2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg3NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLW5lY3Y0CkBAIC0wLDAgKzEsMTEgQEAKKyMgSG9zdCBNYWtlZmlsZSBmcmFnbWVudCBmb3IgTkVDIE1JUFMgU1ZSNC4KKworIyBUaGUgQyBjb21waWxlciBvbiBORUMgTUlQUyBTVlI0IG5lZWRzIGJpZ2dlciB0YWJsZXMuCitDQyA9IGNjIC1aWE5kPTUwMDAgLVpYTmc9MTAwMAorCisjIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KK1NZU1YgPSAtRFNZU1YgLURTVlI0CitSQU5MSUIgPSB0cnVlCisKKyMgTkVDIC1sWDExIG5lZWRzIHNvbWUgb3RoZXIgbGlicmFyaWVzLgorWDExX0VYVFJBX0xJQlMgPSAtbHNvY2tldCAtbG5zbApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBhcGljIGIvY29uZmlnL21oLXBhcGljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Y2YyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtcGFwaWMKQEAgLTAsMCArMSBAQAorUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXBwY3BpYyBiL2NvbmZpZy9taC1wcGNwaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjZjJjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taC1wcGNwaWMKQEAgLTAsMCArMSBAQAorUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXJpc2NvcyBiL2NvbmZpZy9taC1yaXNjb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4NmIzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taC1yaXNjb3MKQEAgLTAsMCArMSwxNSBAQAorIyBUaGlzIGlzIGZvciBhIE1JUFMgcnVubmluZyBSSVNDL29zIDQuNTJDLgorCisjIFRoaXMgaXMgbmVlZGVkIGZvciBHREIsIGJ1dCBuZWVkcyB0byBiZSBpbiB0aGUgdG9wLWxldmVsIG1ha2UgYmVjYXVzZQorIyBpZiBhIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCB0aGUgYnNkIGhlYWRlcnMgYW5kIGdldHMgbGlua2VkIHdpdGggdGhlCisjIHN5c3Ygc3lzdGVtIGxpYnJhcmllcyBhbGwgaGVsbCBjYW4gYnJlYWsgbG9vc2UgKGUuZy4gYSBqbXBfYnVmIG1pZ2h0IGJlCisjIGEgZGlmZmVyZW50IHNpemUpLgorIyBwdHJhY2UoMikgYXBwYXJlbnRseSBoYXMgcHJvYmxlbXMgaW4gdGhlIEJTRCBlbnZpcm9ubWVudC4gIE5vIHdvcmthcm91bmQgaXMKKyMga25vd24gZXhjZXB0IHRvIHNlbGVjdCB0aGUgc3lzdiBlbnZpcm9ubWVudC4gIENvdWxkIHdlIHVzZSAvcHJvYyBpbnN0ZWFkPworIyBUaGVzZSAic3lzdiBlbnZpcm9ubWVudHMiIGFuZCAiYnNkIGVudmlyb25tZW50cyIgb2Z0ZW4gZW5kIHVwIGJlaW5nIGEgcGFpbi4KKyMKKyMgVGhpcyBpcyBub3QgcGFydCBvZiBDRkxBR1MgYmVjYXVzZSBwZXJoYXBzIG5vdCBhbGwgQyBjb21waWxlcnMgaGF2ZSB0aGlzCisjIG9wdGlvbi4KK0NDPSBjYyAtc3lzdHlwZSBzeXN2CisKK1JBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zY28gYi9jb25maWcvbWgtc2NvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzM3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtc2NvCkBAIC0wLDAgKzEsMTAgQEAKKyMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgorU1lTViA9IC1EU1lTVgorUkFOTElCID0gdHJ1ZQorIyBZb3UgbWF5IG5lZWQgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSBiaXNvbi4KKyMgQklTT04gPSB5YWNjIC1TbTEwNDAwCisjIFRoZSBuYXRpdmUgQyBjb21waWxlciBib3RjaGVzIHNvbWUgc2ltcGxlIHVzZXMgb2YgY29uc3QuICBVbmZvcnR1bmF0ZWx5LAorIyBpdCBkb2Vzbid0IGRlZmluZWQgYW55dGhpbmcgbGlrZSAiX19zY29fXyIgZm9yIHVzIHRvIHRlc3QgZm9yIGluIGFuc2lkZWNsLmguCitDQyA9IGNjIC1EY29uc3Q9CisKK1gxMV9FWFRSQV9MSUJTID0gLWxzb2NrZXQgLWxtIC1saW50bCAtbG1hbGxvYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXNvbGFyaXMgYi9jb25maWcvbWgtc29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJlYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLXNvbGFyaXMKQEAgLTAsMCArMSw2IEBACisjIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFN1bnMgcnVubmluZyBTb2xhcmlzIDIKKworU1lTViA9IC1EU1lTVgorUkFOTElCID0gdHJ1ZQorCitYMTFfRVhUUkFfTElCUyA9IC1sbnNsIC1sc29ja2V0CmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3BhcmNwaWMgYi9jb25maWcvbWgtc3BhcmNwaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkYmMyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9taC1zcGFyY3BpYwpAQCAtMCwwICsxIEBACitQSUNGTEFHPWBjYXNlICIke0xJQkNGTEFHU30gJHtMSUJDWFhGTEFHU30iIGluICotZnBpYyogKSBlY2hvIC1mcGljIDs7ICogKSBlY2hvIC1mUElDIDs7IGVzYWNgCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3VuMyBiL2NvbmZpZy9taC1zdW4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtc3VuMwpAQCAtMCwwICsxLDMgQEAKKyMgU3VuJ3MgQyBjb21waWxlciBuZWVkcyB0aGUgLUogZmxhZyB0byBiZSBhYmxlIHRvIGNvbXBpbGUgY3AtcGFyc2UuYworIyB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBqdW1wIHRhYmxlcyAoLUogc2F5cyB0byB1c2UgYSAzMiBiaXQgdGFibGUpCitDQyA9IGNjIC1KCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdiBiL2NvbmZpZy9taC1zeXN2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjExODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtc3lzdgpAQCAtMCwwICsxLDMgQEAKKyMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgorU1lTViA9IC1EU1lTVgorUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3Y0IGIvY29uZmlnL21oLXN5c3Y0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDY2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtc3lzdjQKQEAgLTAsMCArMSwxMSBAQAorIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCitTWVNWID0gLURTWVNWIC1EU1ZSNAorUkFOTElCID0gdHJ1ZQorCisjIEMrKyBkZWJ1Z2dpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgdW5kZXIgU1ZSNCAoRFdBUkYpCitDWFhGTEFHUz0tTworCisjIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCitBUl9GTEFHUyA9IGNyCisKK1gxMV9FWFRSQV9MSUJTID0gLWxuc2wKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2NSBiL2NvbmZpZy9taC1zeXN2NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEzOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21oLXN5c3Y1CkBAIC0wLDAgKzEsOCBAQAorIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCitTWVNWID0gLURTWVNWIC1EU1ZSNCAtRFNWUjUKK1JBTkxJQiA9IHRydWUKKworIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgorQVJfRkxBR1MgPSBjcgorCitYMTFfRVhUUkFfTElCUyA9IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtdmF4dWx0MiBiL2NvbmZpZy9taC12YXh1bHQyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTJkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgtdmF4dWx0MgpAQCAtMCwwICsxLDIgQEAKKyMgVGhlIG9sZCBCU0QgcGNjIGlzbid0IHVwIHRvIGNvbXBpbGluZyBwYXJ0cyBvZiBnZGIgc28gdXNlIGdjYworQ0MgPSBnY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC14ODZwaWMgYi9jb25maWcvbWgteDg2cGljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTQ4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbWgteDg2cGljCkBAIC0wLDAgKzEgQEAKK1BJQ0ZMQUc9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHctbWgtbXB3IGIvY29uZmlnL21wdy1taC1tcHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzZWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9tcHctbWgtbXB3CkBAIC0wLDAgKzEsMTU3IEBACisjIFRoaXMgaXMgYW4gTVBXIG1ha2VmaWxlIGZyYWdtZW50LgorCisjIFNpbmNlIHRoZXJlIGFyZSBhIG11bHRpcGxpY2l0eSBvZiBNYWMgY29tcGlsZXJzIGFuZCB0d28gZGlmZmVyZW50CisjIHByb2Nlc3NvcnMsIHRoaXMgZmlsZSBpcyBwcmltYXJpbHkgYSBsaWJyYXJ5IG9mIG9wdGlvbnMgZm9yIGVhY2gKKyMgY29tcGlsZXIuICBTb21lYm9keSBlbHNlIChzdWNoIGFzIGEgY29uZmlndXJlIG9yIGJ1aWxkIHNjcmlwdCkgd2lsbAorIyBtYWtlIHRoZSBhY3R1YWwgY2hvaWNlLgorCisjIENvbXBpbGVyIHRvIHVzZSBmb3IgY29tcGlsaW5nLgorCitDQ19NUFdfQyA9IEMgLWQgTVBXX0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC13CisKK0NDX1NDID0gU0MgLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtbWM2ODAyMCAtbW9kZWwgZmFyIC1iIC1pICcnIC1pIDoKKworQ0NfTVdDNjhLID0gTVdDNjhLIC1kIE1QVyAtZW51bSBpbnQgLW1wd19jaGFycyAtc3ltIG9uIC13IG9mZiAtbWM2ODAyMCAtbW9kZWwgZmFyCisKK0NDX1BQQ0MgPSBQUENDIC1kIHBvd2VyYz0xIC1kIHBhc2NhbD0gLWQgQUxNT1NUX1NUREMgLWQgQU5TSV9QUk9UT1RZUEVTIC1kIE1QVyAtdworCitDQ19NUkMgPSBNckMgLWQgcG93ZXJjPTEgLWQgcGFzY2FsPSAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1pICcnIC1pIDogLWptCisKK0NDX1NNckMgPSBTTXJDIC1kIE1QVworCisjICItbXB3X2NoYXJzIiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBHTlUgc291cmNlcyBvZnRlbiBtaXggc2lnbmVkIGFuZAorIyB1bnNpZ25lZCBjYXN1YWxseS4KKyMgIi13IG9mZiIgaXMgbm90IGEgZ3JlYXQgaWRlYSwgYnV0IENXNyBpcyBjb21wbGFpbmluZyBhYm91dCBlbnVtCisjIGFzc2lnbm1lbnRzLgorIyAiLW9wdCBnbG9iYWwscGVlcCxsNCxzcGVlZCIgaXMgc29tZXRpbWVzIGdvb2QsIGFuZCBzb21ldGltZXMgYmFkLgorIyBXZSBtdXN0IHVzZSB7Q0luY2x1ZGVzfSBzbyB0aGF0IE1QVyB0b29scyB3aWxsIHdvcms7IHtNV0NJbmNsdWRlc30KKyMgZGVmaW5lcyBzdGRvdXQsIGlzbG93ZXIsIGV0YywgaW4gd2F5cyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCBNUFcncworIyBydW50aW1lLiAgSG93ZXZlciwgdGhpcyBjYW5ub3QgYmUgZG9uZSB2aWEgIC1pICJ7Q0luY2x1ZGVzfSIsIHNpbmNlCisjIHRoYXQgZG9lcyBub3QgYWZmZWN0IGhvdyA8Pi10eXBlIGluY2x1ZGVzIGhhcHBlbjsgaW5zdGVhZCwgdGhlIHZhcmlhYmxlCisjIE1XQ0luY2x1ZGVzIG11c3QgYmUgc2V0IHRvIHBvaW50IGF0IHtDSW5jbHVkZXN9LgorCitDQ19NV0NQUEMgPSBNV0NQUEMgLWQgTVBXIC1lbnVtIGludCAtbXB3X2NoYXJzIC1zeW0gb24gLXcgb2ZmCisKKyMgTm90ZSB0aGF0IEdDQyBkb2VzICpub3QqIHdpcmUgaW4gYSBkZWZpbml0aW9uIG9mICJwYXNjYWwiLCBzbyB0aGF0CisjIGl0IGNhbiBiZSBoYW5kbGVkIGluIGFub3RoZXIgd2F5IGlmIGRlc2lyZWQuCisKK0NDXzY4S19HQ0MgPSBnQyAtRHBhc2NhbD0gLURBTlNJX1BST1RPVFlQRVMgLURNUFcKKworQ0NfUFBDX0dDQyA9IGdDIC1EcG93ZXJjPTEgLURwYXNjYWw9IC1EQU5TSV9QUk9UT1RZUEVTIC1ETVBXCisKKyMgTm90aGluZyBmb3IgdGhlIGRlZmF1bHQgQ0ZMQUdTLgorCitDRkxBR1MgPSAKKworIyBUb29sIHRvIHVzZSBmb3IgbWFraW5nIGxpYnJhcmllcy9hcmNoaXZlcy4KKworQVJfTElCID0gTGliCisKK0FSX01XTElOSzY4SyA9IE1XTGluazY4SyAteG0gbGlicmFyeQorCitBUl9QUENMSU5LID0gUFBDTGluayAteG0gbGlicmFyeQorCitBUl9NV0xJTktQUEMgPSBNV0xpbmtQUEMgLXhtIGxpYnJhcnkKKworQVJfQVIgPSBhcgorCitBUl9GTEFHUyA9IC1vCisKK1JBTkxJQl9OVUxMID0gbnVsbC1jb21tYW5kCisKK1JBTkxJQl9SQU5MSUIgPSByYW5saWIKKworIyBDb21waWxlciBhbmQvb3IgbGlua2VyIHRvIHVzZSBmb3IgbGlua2luZy4KKworQ0NfTERfTElOSyA9IExpbmsgLXcgLWQgLW1vZGVsIGZhciB7Q0NfTERfVE9PTF9GTEFHU30KKworQ0NfTERfTVdMSU5LNjhLID0gTVdMaW5rNjhLIC13IHtDQ19MRF9UT09MX0ZMQUdTfSAtc3ltIG9uIC1tb2RlbCBmYXIKKworQ0NfTERfUFBDTElOSyA9IFBQQ0xpbmsgLW1haW4gX19zdGFydCAtb3V0cHV0Zm9ybWF0IHhjb2ZmCisKK0NDX0xEX01XTElOS1BQQyA9IE1XTGlua1BQQyAtdyB7Q0NfTERfVE9PTF9GTEFHU30gLXN5bSBvbgorCitDQ19MRF9HTEQgPSBnQworCisjIEV4dGVuc2lvbiBmb3IgbGlua2VyIG91dHB1dC4KKworUFJPR19FWFRfNjhLID0KKworUFJPR19FWFRfWENPRkYgPSAueGNvZmYKKworIyBOb3RoaW5nIGZvciB0aGUgZGVmYXVsdCBMREZMQUdTLgorCitMREZMQUdTID0gLXcKKworQ0NfTERfVE9PTF9GTEFHUyA9IC1jICdNUFMgJyAtdCBNUFNUCisKKyMgTGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdC4KKworIyBJdCB3b3VsZCBhcHBlYXIgdGhhdCB0aGUgbWF0aCBsaWJyYXJpZXMgYXJlIG5vdAorIyBuZWVkZWQgZXhjZXB0IHRvIHByb3ZpZGUgYSBkZWZpbml0aW9uIGZvciBzY2FsYiwKKyMgd2hpY2ggaXMgY2FsbGVkIGZyb20gbGRleHAsIHdoaWNoIGlzIHJlZmVyZW5jZWQKKyMgaW4gdGhlIG02OGsgb3Bjb2RlcyBsaWJyYXJ5LgorCitFWFRSQUxJQlNfQyA9IFxPcHRpb24tZAorCSJ7Q0xpYnJhcmllc30iU3RkQ2xpYi5vIFxPcHRpb24tZAorCSJ7Q0xpYnJhcmllc30iTWF0aC5vIFxPcHRpb24tZAorCSJ7Q0xpYnJhcmllc30iQ1NBTkVMaWIubyBcT3B0aW9uLWQKKwkie0xpYnJhcmllc30iU3R1YnMubyBcT3B0aW9uLWQKKwkie0xpYnJhcmllc30iUnVudGltZS5vIFxPcHRpb24tZAorCSJ7TGlicmFyaWVzfSJJbnRlcmZhY2UubyBcT3B0aW9uLWQKKwkie0xpYnJhcmllc30iVG9vbExpYnMubworCitFWFRSQUxJQlNfTVdDNjhLID0gXE9wdGlvbi1kCisJIntDTGlicmFyaWVzfSJTdGRDbGliLm8gXE9wdGlvbi1kCisJIntDTGlicmFyaWVzfSJNYXRoLm8gXE9wdGlvbi1kCisJIntDTGlicmFyaWVzfSJDU0FORUxpYi5vIFxPcHRpb24tZAorCSJ7TGlicmFyaWVzfSJTdHVicy5vIFxPcHRpb24tZAorCSJ7TGlicmFyaWVzfSJSdW50aW1lLm8gXE9wdGlvbi1kCisJIntMaWJyYXJpZXN9IkludGVyZmFjZS5vIFxPcHRpb24tZAorCSJ7TGlicmFyaWVzfSJUb29sTGlicy5vIFxPcHRpb24tZAorCSJ7TVc2OEtMaWJyYXJpZXN9TVBXIEFOU0kgKDRpKSBDLjY4Sy5MaWIiCisKK0VYVFJBTElCU19QUENfWENPRkYgPSBcT3B0aW9uLWQKKwkie1BQQ0xpYnJhcmllc30iU3RkQ1J1bnRpbWUubyBcT3B0aW9uLWQKKwkie1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliLnhjb2ZmIFxPcHRpb24tZAorCSJ7UFBDTGlicmFyaWVzfSJNYXRoTGliLnhjb2ZmIFxPcHRpb24tZAorCSJ7UFBDTGlicmFyaWVzfSJTdGRDTGliLnhjb2ZmIFxPcHRpb24tZAorCSJ7UFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vIFxPcHRpb24tZAorCSJ7UFBDTGlicmFyaWVzfSJQUENDUnVudGltZS5vIFxPcHRpb24tZAorCSJ7R0NDUFBDTGlicmFyaWVzfSJsaWJnY2MueGNvZmYKKworRVhUUkFMSUJTX1BQQyA9IFxPcHRpb24tZAorCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAorCSJ7U2hhcmVkTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCisJIntTaGFyZWRMaWJyYXJpZXN9Ik1hdGhMaWIgXE9wdGlvbi1kCisJIntTaGFyZWRMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCisJIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCisJIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCisJIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgorCitFWFRSQUxJQlNfTVdDUFBDID0gXE9wdGlvbi1kCisJIntNV1BQQ0xpYnJhcmllc30iTVdTdGRDUnVudGltZS5MaWIgXE9wdGlvbi1kCisJIntNV1BQQ0xpYnJhcmllc30iSW50ZXJmYWNlTGliIFxPcHRpb24tZAorCSJ7TVdQUENMaWJyYXJpZXN9IlN0ZENMaWIgXE9wdGlvbi1kCisJIntNV1BQQ0xpYnJhcmllc30iTWF0aExpYiBcT3B0aW9uLWQKKwkie01XUFBDTGlicmFyaWVzfSJQUENUb29sTGlicy5vCisKKyMgVG9vbCB0byBtYWtlIFBFRiB3aXRoLCBpZiBuZWVkZWQuCisKK01BS0VQRUZfTlVMTCA9IG51bGwtY29tbWFuZAorCitNQUtFUEVGX1BQQyA9IE1ha2VQRUYKKworTUFLRVBFRl9GTEFHUyA9IFxPcHRpb24tZAorCS1sIEludGVyZmFjZUxpYi54Y29mZj1JbnRlcmZhY2VMaWIgXE9wdGlvbi1kCisJLWwgTWF0aExpYi54Y29mZj1NYXRoTGliIFxPcHRpb24tZAorCS1sIFN0ZENMaWIueGNvZmY9U3RkQ0xpYgorCitNQUtFUEVGX1RPT0xfRkxBR1MgPSAtZnQgTVBTVCAtZmMgJ01QUyAnCisKKyMgUmVzb3VyY2UgY29tcGlsZXIgdG8gdXNlLgorCitSRVpfNjhLID0gUmV6CisKK1JFWl9QUEMgPSBSZXogLWQgV0FOVF9DRlJHCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvQ2hhbmdlTG9nIGIvY29uZmlnL21wdy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkZWZiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9tcHcvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNTMgQEAKK1R1ZSBOb3YgMjYgMTI6MzQ6MTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnLW1wdy1tYWtlLnNlZDogRml4IHNvbWUgY29tbWVudHMuCisKK01vbiBTZXAgMTYgMTQ6NDI6NTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnLW1wdy1tYWtlLnNlZCAoSExERU5WKTogRWRpdCBvdXQgYWxsIHJlZmVyZW5jZXMuCisKK1RodSBBdWcgMTUgMTk6NDk6MjMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiB0cnVlOiBOZXcgc2NyaXB0LCBpZGVudGljYWwgdG8gbXB3LXRydWUuCisJKiBnLW1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgYW5kIEBTRUdNRU5UX0ZMQUcoKUAKKwl0byB0aGUgZWRpdG9ycyBmb3IgY29tcGlsZSBjb21tYW5kcy4KKworVGh1IEF1ZyAgMSAxNTowMTo0MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy10cnVlLCBtcHctdG91Y2gsIG51bGwtY29tbWFuZDogTmV3IHNjcmlwdHMuCisJKiBSRUFETUU6IERlc2NyaWJlIHVzYWdlIGluIG1vcmUgZGV0YWlsLgorCitUdWUgRGVjIDEyIDE0OjUxOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZy1tcHctbWFrZS5zZWQ6IERvbid0IGVkaXQgb3V0ICJ2ZXJzaW9uPSIgb2NjdXJyZW5jZXMuCisKK0ZyaSBEZWMgIDEgMTE6NDY6MTggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnLW1wdy1tYWtlLnNlZCAoYmluZGlyLCBsaWJkaXIpOiBFZGl0IHRoZSBwb3NpdGlvbnMgb2YKKwlwYXRobmFtZSBzZXBhcmF0b3JzIHRvIHdvcmsgd2l0aCBvdGhlciBwYXRobmFtZXMgYmV0dGVyLgorCitUdWUgTm92ICA3IDE1OjA4OjA3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBjb21tZW50IGFib3V0IER1cGxpY2F0ZSB2cyBDYXRlbmF0ZSwKKwlhZGQgYWRkaXRpb25hbCBwYXR0ZXJuIGZvciBlZGl0aW5nIGxpbmstY29tcGlsZSBjb21tYW5kcy4KKworVHVlIE9jdCAyNCAxNDoyODo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgaGFuZGxpbmcgZm9yICoudGFiLltoY10gZmlsZXMuCisJKENISUxMX0ZPUl9UQVJHRVQsIENISUxMX0xJQik6IEVkaXQgb3V0IHRyaWNreSBkZWZpbml0aW9ucworCW9mIHRoZXNlLgorCitUaHUgU2VwIDI4IDIxOjA1OjEwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZy1tcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBnZW5lcmljIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUKKwlVbml4IG1ha2VmaWxlcyBpbnRvIE1QVyBtYWtlZmlsZSBzeW50YXguCisKK0ZyaSBNYXIgMTcgMTE6NTE6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBSRUFETUU6IENsYXJpZnkgaW5zdHJ1Y3Rpb25zLgorCSogZmk6IFJlbW92ZS4KKworV2VkIERlYyAyMSAxNTo0NTo1MyAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE1vdmVJZkNoYW5nZSwgUkVBRE1FLCBmaSwgZm9yd2FyZC1pbmNsdWRlLCBvcGVuLWJyYWNlLAorICAgICAgICB0ci03dG84LXNyYzogTmV3IGZpbGVzLgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UgYi9jb25maWcvbXB3L01vdmVJZkNoYW5nZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGJjMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UKQEAgLTAsMCArMSwxOSBAQAorIyBSZW5hbWUgYSBmaWxlIG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gYSBwcmV2aW91c2x5IGV4aXN0aW5nCisjIGZpbGUgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgdXNlZnVsIGZvciBrZWVwaW5nIG1ha2UgZnJvbSBkb2luZworIyB0b28gbXVjaCB3b3JrIGlmIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgaGF2ZW4ndCBjaGFuZ2VkLgorCisjIFRoaXMgaXMgYW4gTVBXIHRyYW5zbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBHTlUgc2ggc2NyaXB0IG1vdmUtaWYtY2hhbmdlLgorCitTZXQgZXhpdCAwCisKK0lmICJgZXhpc3RzIC1mICJ7Mn0iYCIKKyAgQ29tcGFyZSAiezF9IiAiezJ9IiA+ZGV2Om51bGwKKyAgSWYge3N0YXR1c30gIT0gMAorICAgIFJlbmFtZSAteSAiezF9IiAiezJ9IgorICBFbHNlCisgICAgRWNobyAiezJ9IiBpcyB1bmNoYW5nZWQKKyAgICBEZWxldGUgLWkgLXkgInsxfSIKKyAgRW5kCitFbHNlCisgIFJlbmFtZSAteSAiezF9IiAiezJ9IgorRW5kCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L1JFQURNRSBiL2NvbmZpZy9tcHcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDcwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXB3L1JFQURNRQpAQCAtMCwwICsxLDIzIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBNUFcgc2NyaXB0cyBhbmQgcmVsYXRlZCBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgdG8KK2J1aWxkIEN5Z251cyBHTlUgdG9vbHMgZm9yIE1QVy4gIFRoZSBzY3JpcHRzIHNob3VsZCBiZSBzb21ld2hlcmUgb24gdGhlCitjb21tYW5kIHBhdGg7IG91ciB1c3VhbCBwcmFjdGljZSBoYXMgYmVlbiB0byBoYXZlIGEgc2VwYXJhdGUgZGlyZWN0b3J5Citmb3IgdGhlIHNjcmlwdHMsIGFuZCBwdXQgdGhlIHRvb2xzIChieWFjYywgZmxleCwgYW5kIHNlZCBhdCBsZWFzdCkgdGhlcmUKK2Fsc287IHRoZW4gaXQncyBlYXNpZXIgdG8gZHJhZyB0aGUgc3VwcG9ydCBiaXRzIGFyb3VuZCBhcyBhIGdyb3VwLCBvciB0bwordXBncmFkZSBNUFcgdmVyc2lvbnMuICBUaGUgY29tcGxldGUgcGFja2FnZSBvZiBzY3JpcHRzIGFuZCB0b29sIGJpbmFyaWVzCitpcyB1c3VhbGx5IGF2YWlsYWJsZSBhcyBwdWIvbWFjL2J1aWxkdG9vbHMuY3B0LmhxeCBvbiBmdHAuY3lnbnVzLmNvbS4KKworInRyLTd0bzgtc3JjIiBpcyBhY3R1YWxseSB0aGUgc291cmNlIHRvIGFuIE1QVyBzY3JpcHQgdGhhdCB0cmFuc2Zvcm1zCitzZXF1ZW5jZXMgbGlrZSAiXE9wdGlvbi1kIiBpbnRvIHRoZSBhY3R1YWwgOC1iaXQgY2hhcnMgdGhhdCBNUFcgbmVlZHMuCitJdCdzIG9ubHkgdGhlIHNvdXJjZSBiZWNhdXNlIGl0IGNhbid0IGl0c2VsZiBpbmNsdWRlIGFueSA4LWJpdCBjaGFycy4KK0l0ICpjYW4qIGJlIHByb2Nlc3NlZCBpbnRvIGEgZ2VudWluZSAidHItN3RvOCIgYnkgdXNpbmcgaXRzZWxmOgorCisJdHItN3RvOCB0ci03dG84LXNyYyB8IHNlZCAtZSAncy9TcmMvLycgPm5ldy10ci03dG84CisKK1VzZSB0aGlzIHRvIHZlcmlmeToKKworCWNvbXBhcmUgdHItN3RvOCBuZXctdHItN3RvOAorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhIHdvcmtpbmcgdHItN3RvOCwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5CityZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAiXE9wdGlvbi1kIiB3aXRoIHJlYWwgT3B0aW9uLWQgKHdoaWNoIGxvb2tzCitsaWtlIGEgZGVsdGEpLCB0aGVuIGRvIHNpbWlsYXJseSB3aXRoIGFsbCB0aGUgb3RoZXIgIlxPcHRpb24tLi4uIgorc3RyaW5ncywgYW5kIHRoZW4gY2hhbmdlICJcU3JjT3B0aW9uLWQiIGludG8gdGhlIHN0cmluZyAiXE9wdGlvbi1kIi4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlIGIvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkNmJkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9tcHcvZm9yd2FyZC1pbmNsdWRlCkBAIC0wLDAgKzEsMyBAQAorRWNobyAnI2luY2x1ZGUnILYiInsxfSK2IiA+InsyfSIudGVtCitNb3ZlSWZDaGFuZ2UgInsyfSIudGVtICJ7Mn0iCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZy1tcHctbWFrZS5zZWQgYi9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDNjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCkBAIC0wLDAgKzEsMjkzIEBACisjIFNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peCBtYWtlZmlsZXMgaW50byBNUFcgbWFrZWZpbGVzLgorIyBUaGVzZSBhcmUgbm9taW5hbGx5IGdlbmVyaWMsIGJ1dCB3b3JrIGJlc3Qgb24gdGhlIG1ha2VmaWxlcyB1c2VkCisjIGZvciBHTlUgcHJvZ3JhbXMuCisKKyMgV2hhY2sgb3V0IGFueSBjb21tZW50ZWQtb3V0IGxpbmVzIHRoYXQgYXJlIHByb2JhYmx5IGNvbW1hbmRzOworIyB0aGV5IGNhbiBvbmx5IGNhdXNlIHRyb3VibGUgbGF0ZXIgb24uCisvXiMJL2QKKworIyBDaGFuZ2UgZGVwZW5kZW5jeSBjaGFyLgorLzokL3MvOi8gXFxPcHRpb24tZi9nCisvXlteIAk6I11bXjpdKjovcy9cKFsgCV0qXCk6XChbIAldKlwpLyBcXE9wdGlvbi1mIC9nCisKKyMgQ2hhbmdlIHN5bnRheCBvZiBNYWtlZmlsZSB2YXJzLgorL1wkL3MvXCR7XChbYS16QS1aMC05Xy1dKlwpfS97XDF9L2cKKy9cJC9zL1wkKFwoW2EtekEtWjAtOV8tXSpcKSkve1wxfS9nCisvICRAL3MvICRALyB7VGFyZ30vCisKKyMgRG91YmxlLSQgYXJlIGxpdGVyYWxzIHRvIFVuaXggYnV0IG5vdCB0byBNUFcgbWFrZS4KKy9cJFwkL3MvXCRcJC8kL2cKKworIyBDaGFuZ2UgcGF0aG5hbWUgc3ludGF4LgorL1wvL3MsXC5cLi9cL1wuXC4vLDo6OixnCisvXC8vcyxcLlwuLyw6OixnCisvXC5cLy9zLFwuLyw6LGcKKy9cLy9zLC8sOixnCisjIFVuZG8gZXhjZXNzIGNoYW5nZXMuCisvYW5kL3MsYW5kOm9yJCxhbmQvb3IsCisvYW5kL3MsYW5kOm9yICxhbmQvb3IgLAorL3dhbnQvcyx3YW50Om5lZWQsd2FudC9uZWVkLAorIyBGaXhpbmcgdXAgc2VkIGNvbW1hbmRzLgorLy1lL3NfIjpcKFteOl0qXCk6ZCJfIi9cMS9kIl9nCisvLWUvc18iOlwoW146XSpcKTosOlwoW146XSpcKTpkIl8iL1wxLywvXDIvZCJfZworCisvPS9zLyA9IFwuJC8gPSA6LworCisjIE1ha2UgdGhlc2UgZ28gYXdheSBzbyB0aGF0IGxhdGVyIGVkaXRzIG5vdCBjb25mdXNlZC4KKy9ITERFTlYvcy97SExERU5WfS8vCisKKyMgQ29tbWVudCBvdXQgYW55IGV4cGxpY2l0IHNyY2RpciBzZXR0aW5nLgorL3NyY2Rpci9zL15zcmNkaXIvIyBzcmNkaXIvCisKKy9CQVNFRElSL3MvXkJBU0VESVIgPS4qJC9CQVNFRElSID0gIntzcmNyb290fSIvCisve0JBU0VESVJ9Oi9zL3tCQVNFRElSfTove0JBU0VESVJ9L2cKKy97c3JjZGlyfTovcy97c3JjZGlyfTovIntzcmNkaXJ9Ii9nCisvIntzcmNkaXJ9Ijovcy8ie3NyY2Rpcn0iOi8ie3NyY2Rpcn0iL2cKKworIyBUd2VhayBzb21lIGNvbnZlbnRpb25zIHRoYXQgYXJlIGJhY2t3YXJkcyBmb3IgdGhlIE1hYy4KKy9iaW5kaXIvcy97ZXhlY19wcmVmaXh9OmJpbi97ZXhlY19wcmVmaXh9YmluOi8KKy9saWJkaXIvcy97ZXhlY19wcmVmaXh9OmxpYi97ZXhlY19wcmVmaXh9bGliOi8KKworIyBDb21tZW50IG91dCBzZXR0aW5ncyBvZiBhbnl0aGluZyBzZXQgYnkgbXB3IGhvc3QgY29uZmlnLgorL0NDL3MvXkNDICo9LyNDQyA9LworL0NGTEFHUy9zL15DRkxBR1MgKj0vI0NGTEFHUyA9LworL0FSL3MvXkFSICo9LyNBUiA9LworL0FSX0ZMQUdTL3MvXkFSX0ZMQUdTICo9LyNBUl9GTEFHUyA9LworL1JBTkxJQi9zL15SQU5MSUIgKj0vI1JBTkxJQiA9LworL0NDX0xEL3MvXkNDX0xEICo9LyNDQ19MRCA9LworL0xERkxBR1Mvcy9eTERGTEFHUyAqPS8jTERGTEFHUyA9LworCisjIENoYW5nZSAtSSB1c2FnZXMuCisvLUkvcy8tSVwuLy1pIDovZworLy1JL3MvLUk6OmJmZC8taSA6OmJmZDovZworLy1JL3MvLUk6OmluY2x1ZGUvLWkgOjppbmNsdWRlOi9nCisvLUkvcy8tSS8taSAvZworCisjIENoYW5nZSAtRCB1c2FnZS4KKy8tRC9zL1woWyA9XVwpLURcKFteIF0qXCkvXDEtZCBcMi9nCisKKyMgQ2hhbmdlIGNvbnRpbnVhdGlvbiBjaGFyLgorL1xcJC9zL1xcJC9cXE9wdGlvbi1kLworCisjIENoYW5nZSB3aWxkY2FyZCBjaGFyLgorL1wqL3MvXCovXFxPcHRpb24teC9nCisKKyMgQ2hhbmdlIHBhdGggb2YgdmFyaW91cyB0eXBlcyBvZiBzb3VyY2UgZmlsZXMuICBUaGlzIHJ1bGUgZG9lcyBub3QgYWxsb3cKKyMgZm9yIGZpbGUgbmFtZXMgd2l0aCBtdWx0aXBsZSBkb3RzIGluIHRoZSBuYW1lLgorL1wuW2NobHldL3MvXChbIAk+PD1dXClcKFstYS16QS1aMC05XyR7fToiXSpcKVwuXChbY2hseV1cKS9cMSJ7c30iXDIuXDMvZworL1wuW2NobHldL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5cKFtjaGx5XVwpLyJ7c30iXDEuXDIvCisjIEFsbG93IGZpbGVzIG5hbWVkICoudGFiLltjaF0gYXMgYSBzcGVjaWFsIGNhc2UuCisvXC50YWJcLltjaF0vcy9cKFsgCT48PV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwudGFiXClcLlwoW2NoXVwpL1wxIntzfSJcMi5cMy9nCisvXC50YWJcLltjaF0vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXC50YWJcKVwuXChbY2hdXCkvIntzfSJcMS5cMi8KKyMgRml4IHNvbWUgb3ZlcmVudGh1c2lhc21zLgorL3tzfS9zLyJ7c30iIntzcmNkaXJ9Ii8ie3NyY2Rpcn0iL2cKKy97c30vcy8ie3N9IntcKFthLXpBLVowLTlfXSpcKWRpcn0vIntcMWRpcn0iL2cKKy97c30vcy8ie3N9IntcKFthLXpBLVowLTlfXSpcKURJUn0vIntcMURJUn0iL2cKKy97c30vcy8ie3N9IiJ7XChbYS16QS1aMC05X10qXClkaXJ9Ii8ie1wxZGlyfSIvZworL3tzfS9zLyJ7c30iIntcKFthLXpBLVowLTlfXSpcKURJUn0iLyJ7XDFESVJ9Ii9nCisve3N9L3MvIntzfSI6LzovZworL3tzfS9zL14ie3N9Ii8vZworL3tzfS9zLyJ7c30iIntzfSIvIntzfSIvZworL3tzfS9zLyJ7c30iIntzcmNkaXJ9Ii8ie3N9Ii9nCisve3N9L3MvIntzcmNkaXJ9IiJ7c30iLyJ7c30iL2cKKworIyBUaGUgLmRlZiBmaWxlcyBhcmUgYWxzbyB0eXBpY2FsbHkgc291cmNlIGZpbGVzLgorL1wuZGVmL3MvXChbIAk+PF1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5kZWYvXDEie3N9IlwyLmRlZi9nCisvXC5kZWYvcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLmRlZi8ie3N9IlwxLmRlZi9nCisKKyMgQ2hhbmdlIGV4dGVuc2lvbiBhbmQgcGF0aCBvZiBvYmplY3RzLgorL1wuby9zL1woWyAJPV1cKVwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5vL1wxIntvfSJcMi5jLm8vZworL1wuby9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuby8ie299IlwxLmMuby8KKyMgQWxsb3cgKi50YWIubyBmaWxlcyBhcyBhIHNwZWNpYWwgY2FzZSBvZiBhIDItZG90LW5hbWUgZmlsZS4KKy9cLm8vcy9cKFsgCT1dXClcKFstYS16QS1aMC05XyR7fToiXSpcKVwudGFiXC5vL1wxIntvfSJcMi50YWIuYy5vL2cKKy9cLm8vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLnRhYlwuby8ie299IlwxLnRhYi5jLm8vCisjIENsZWFuIHVwLgorLyJ7b30iL3MvIntvfSIie299Ii8ie299Ii9nCisvIntvfSIvcy9eIntvfSJcKFthLXpBLVowLTlfXSpcKT0vXDE9LworCisjIENoYW5nZSBleHRlbnNpb24gb2YgbGlicy4KKy9cLmEvcy9saWJcKFthLXpdKlwpXC5hL2xpYlwxLm8vZworCisjIFJlbW92ZSBub24tZmFpbCBvcHRpb24uCisvLS9zL15cKFsgCV0qXCktL1wxLworIyBGaXggb3ZlcmVhZ2VybmVzc2VzIC0gYXNzdW1lcyBubyBvbmUtbGV0dGVyIGNvbW1hbmRzLgorL15bIAldKlthLXpdIC9zL15cKFsgCV0qXClcKFthLXpdXCkgL1wxLVwyIC8KKworIyBSZW1vdmUgbm9uLWVjaG8gb3B0aW9uLiAod2F0Y2ggb3V0IGZvciBhdXRvY29uZiB0aGluZ3MpCisvQC9zL15cKFsgCV0qXClAL1wxLworCisjIENoYW5nZSBjcCB0byBEdXBsaWNhdGUuCisjIENhdGVuYXRlIGlzIHBlcmhhcHMgbW9yZSBhY2N1cmF0ZSwgYnV0IHRoZSBwYXR0ZXJuIHdvdWxkIGhhdmUgdG8KKyMgaWRlbnRpZnkgdGhlIG91dHB1dCBmaWxlIGFuZCBhZGQgYSAnPicgcmVkaXJlY3Rpb24gaW50byBpdC4KKy9jcC9zL15cKFsgCV0qXCljcCAvXDFEdXBsaWNhdGUgLWQgLXkgLworIyBDaGFuZ2UgbXYgdG8gUmVuYW1lLgorL212L3MvXlwoWyAJXSpcKW12IC9cMVJlbmFtZSAteSAvCisvUmVuYW1lL3MvXlwoWyAJXSpcKVJlbmFtZSAteSAtZi9cMVJlbmFtZSAteS8KKyMgQ2hhbmdlIHJtIHRvIERlbGV0ZS4KKy9ybSAtcmYvcy9eXChbIAldKlwpcm0gLXJmIC9cMURlbGV0ZSAtaSAteSAvCisvcm0gLWYvcy9eXChbIAldKlwpcm0gLWYgL1wxRGVsZXRlIC1pIC15IC8KKy9ybS9zL15cKFsgCV0qXClybSAvXDFEZWxldGUgLWkgLXkgLworIyBOb3RlIHRoYXQgd2UgZG9uJ3QgbWVzcyB3aXRoIGxuIC0gZGlyZWN0b3J5LXNwZWNpZmljIHNjcmlwdHMKKyMgbXVzdCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHN5bWxpbmtzLgorIyBDaGFuZ2UgY2F0IHRvIENhdGVuYXRlLgorL2NhdC9zL15cKFsgCV0qXCljYXQgL1wxQ2F0ZW5hdGUgLworIyBDaGFuZ2UgdG91Y2ggdG8gbXB3LXRvdWNoLgorL3RvdWNoL3MvXlwoWyAJXSpcKXRvdWNoIC9cMW1wdy10b3VjaCAvCisjIENoYW5nZSBta2RpciB0byBOZXdGb2xkZXIuCisvbWtkaXIvcy9eXChbIAldKlwpbWtkaXIgL1wxTmV3Rm9sZGVyIC8KKyMgQ2hhbmdlIHZhciBzZXR0aW5nIHRvIFNldC4KKy89L3MvXlwoWyAJXSpcKVwoWy1hLXpBLVowLTlfXSpcKT1cKFteO10qXCk7IFxcT3B0aW9uLWQvXDFTZXQgXDIgXDMvCisKKyMgQ2hhbmdlIHRlc3RzLgorL2lmIC9zL2lmIFxbICotZiBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCisvaWYgL3MvaWYgXFsgKi1mIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KKy9pZiAvcy9pZiBcWyAhICotZiBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCisvaWYgL3MvaWYgXFsgISAqLWYgXChbXiBdKlwpIF0gKjsgKnRoZW4gXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCisKKy9pZiAvcy9pZiBcWyAqLWQgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLworL2lmIC9zL2lmIFxbICotZCBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCisvaWYgL3MvaWYgXFsgISAqLWQgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLworL2lmIC9zL2lmIFxbICEgKi1kIFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KKworL2lmIC9zL2lmIFxbIC1kIFwoW14gXSpcKSBdICo7IHRoZW4gdHJ1ZSAqOyBlbHNlIG1rZGlyIFwoW14gO10qXCkgKjsgZmkvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiIE5ld0ZvbGRlciBcMiBFbmQgSWYvCisKKy9pZiAvcy9pZiBcWyBcKFteIF0qXCkgPSBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiXDEiID09ICJcMiIvCisvaWYgL3MvaWYgXFsgXChbXiBdKlwpID0gXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgIlwxIiA9PSAiXDIiLworCisvaWYgL3MvaWYgXFsgXChbXiBdKlwpICE9IFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KKy9pZiAvcy9pZiBcWyBcKFteIF0qXCkgIT0gXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLworCisvaWYgL3MvaWYgXFsgXChbXiBdKlwpIC1lcSBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCisvaWYgL3MvaWYgXFsgXChbXiBdKlwpIC1lcSBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCisKKy9eWyAJXSplbHNlIHRydWUkL2NcCisJRWxzZVwKKwkJbXB3LXRydWVcCisKKworL2Vsc2Uvcy9eXChbIAldKlwpZWxzZVsgCV0qJC9cMUVsc2UvCisvZWxzZS9zL15cKFsgCV0qXCllbHNlWzsgCV0qXFxPcHRpb24tZCQvXDFFbHNlLworCisvXlsgCV0qZWxzZVsgCV0qdHJ1ZVsgCV0qJC9jXAorCUVsc2VcCisJCW1wdy10cnVlCisKKy9eWyAJXSplbHNlWyAJXSp0cnVlWzsgCV0qZmkkL2NcCisJRWxzZVwKKwkJbXB3LXRydWVcCisJRW5kIElmCisKKy9maS9zL15cKFsgCV0qXClmaSAqJC9cMUVuZC8KKy9maS9zL15cKFsgCV0qXClmaSAqOyAqXFxPcHRpb24tZC9cMUVuZC8KKworIyBDaGFuZ2UgbG9vcGluZy4KKy9mb3Ivcy9eXChbIAldKlwpZm9yIFwoWy1hLXpBLVowLTlfXSpcKSBpbiBcKFteO10qXCk7ICpkbyAqXFxPcHRpb24tZC9cMUZvciBcMiBJbiBcMy8KKy9eXChbIAldKlwpZG8gKlxcT3B0aW9uLWQvZAorL2RvbmUvcy9eXChbIAldKlwpZG9uZSAqOyAqXFxPcHRpb24tZC9cMUVuZC8KKy9kb25lL3MvXlwoWyAJXSpcKWRvbmUkL1wxRW5kLworCisjIFRyYWlsaW5nIHNlbWljb2xvbnMgYW5kIGNvbnRpbnVlZCBsaW5lcyBhcmUgdW5uZWVkZWQgc2ggc3ludGF4LgorLzsgXFxPcHRpb24tZC9zLzsgXFxPcHRpb24tZC8vCisKKyMgQ2hhbmdlIG1vdmUtaWYtY2hhbmdlIHRvIE1vdmVJZkNoYW5nZS4KKy9tb3ZlLWlmLWNoYW5nZS9zL1woW14gCV0qXCltb3ZlLWlmLWNoYW5nZS9Nb3ZlSWZDaGFuZ2UvZworCisjIENoYW5nZSAkKFNIRUxMKSB0byB0aGUgc2NyaXB0IG5hbWUgYnkgaXRzZWxmLgorL1NIRUxML3MvXlwoWyAJXSpcKXtTSEVMTH0gL1wxLworCisjIENoYW5nZSBzeW50YXggb2YgZGVmYXVsdCBydWxlIGRlcGVuZGVuY3kuCisvXlwuY1wuby9zL15cLmNcLm8gXFxPcHRpb24tZiQvLmMubyBcXE9wdGlvbi1mIC5jLworCisjIENoYW5nZSBkZWZhdWx0IHJ1bGUncyBhY3Rpb24uCisve0NDfSAtYy9zL3tDQ30gLWMgXCguKlwpIFwkPCQve0NDfSBAREFTSF9DX0ZMQUdAIHtEZXBEaXJ9e0RlZmF1bHR9LmMgXDEgQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQCAtbyB7VGFyZ0Rpcn17RGVmYXVsdH0uYy5vLworCisjIFRoaXMgaXMgcHJldHR5IGRpc2d1c3RpbmcsIGJ1dCBJIGNhbid0IHNlZW0gdG8gZGV0ZWN0IGVtcHR5IHJ1bGVzLgorL09wdGlvbi1mJC9zL09wdGlvbi1mJC9PcHRpb24tZiBfb2xkZXN0L2cKKworIyBSZW1vdmUgLWMgZnJvbSBleHBsaWNpdCBjb21waWxlciBjYWxscy4gKGJ1dCBzaG91bGQgbm90IGlmIEdDQykKKyMgSGFuZGxlIHRoZSBjYXNlIG9mIGEgc291cmNlIGZpbGUgdGhhdCBpcyAie3h4eH0iZmlsZS5jLgorLyAtYyAvcy97XChbQS1aX10qXClDQ31cKC4qXCkgLWMgXCguKlwpIlwoW14iXSpcKSJcKFstYS16X10qXClcLmMve1wxQ0N9XDIgQERBU0hfQ19GTEFHQCBcMyJcNCJcNS5jIC1vICJ7b30iXDUuYy5vLworIyBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzb3VyY2UgZmlsZSB0aGF0IGlzICJ7eHh4fSJkaXI6ZmlsZS5jLgorLyAtYyAvcy97XChbQS1aX10qXClDQ31cKC4qXCkgLWMgXCguKlwpIlwoW14iXSpcKSJcKFstYS16X10qXCk6XChbLWEtel9dKlwpXC5jL3tcMUNDfVwyIEBEQVNIX0NfRkxBR0AgXDMiXDQiXDU6XDYuYyAtbyAie299Ilw2LmMuby8KKworIyBDaGFuZ2UgbGlua2luZyBjYyB0byBsaW5raW5nIHNlcXVlbmNlLgorLy1vL3MvXlwoWyAJXSpcKXtDQ30gXCguKlwpe1woW0EtWl9dKlwpQ0ZMQUdTfSBcKC4qXCl7TERGTEFHU30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKSQvXDF7Q0NfTER9IFwyIHtcM0NGTEFHU30gXDQge0xERkxBR1N9IFw1IC1vIFw2e1BST0dfRVhUfSBcN1wKK1wxe01BS0VQRUZ9IFw2e1BST0dfRVhUfSAtbyBcNiB7TUFLRVBFRl9UT09MX0ZMQUdTfSB7TUFLRVBFRl9GTEFHU31cCitcMXtSRVp9ICJ7c30iXDYuciAtbyBcNiAtYXBwZW5kIC1kIFBST0dfTkFNRT0nIidcNiciJyAtZCBWRVJTSU9OX1NUUklORz0nIid7dmVyc2lvbn0nIicvCisvLW8vcy9eXChbIAldKlwpe0NDfSBcKC4qXCl7XChbQS1aX10qXClDRkxBR1N9IFwoLipcKS1vIFwoW14gXSpcKSBcKC4qXCl7TERGTEFHU30gXCguKlwpJC9cMXtDQ19MRH0gXDIge1wzQ0ZMQUdTfSBcNCB7TERGTEFHU30gXDYgLW8gXDV7UFJPR19FWFR9IFw3XAorXDF7TUFLRVBFRn0gXDV7UFJPR19FWFR9IC1vIFw1IHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKK1wxe1JFWn0gIntzfSJcNS5yIC1vIFw1IC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1w1JyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KKy8tby9zL15cKFsgCV0qXCl7SE9TVF9DQ30gXCguKlwpLW8gXChbXiBdKlwpIFwoLipcKSQvXDF7SE9TVF9DQ19MRH0gXDIgLW8gXDN7UFJPR19FWFR9IFw0XAorXDF7TUFLRVBFRn0gXDN7UFJPR19FWFR9IC1vIFwzIHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKK1wxe1JFWn0gIntzfSJcMy5yIC1vIFwzIC1hcHBlbmQgLWQgUFJPR19OQU1FPSciJ1wzJyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJy8KKworIyBDb21tZW50IG91dCAuTk9FWFBPUlQgcnVsZXMuCisvXC5OT0VYUE9SVC9zL15cLk5PRVhQT1JULyNcLk5PRVhQT1JULworIyBDb21tZW50IG91dCAuUEhPTlkgcnVsZXMuCisvXC5QSE9OWS9zL15cLlBIT05ZLyNcLlBIT05ZLworIyBDb21tZW50IG91dCAuUFJFQ0lPVVMgcnVsZXMuCisvXC5QUkVDSU9VUy9zL15cLlBSRUNJT1VTLyNcLlBSRUNJT1VTLworIyBDb21tZW50IG91dCAuU1VGRklYRVMgcnVsZXMuCisvXC5TVUZGSVhFUy9zL15cLlNVRkZJWEVTLyNcLlNVRkZJWEVTLworCisjIFNldCB0aGUgaW5zdGFsbCBwcm9ncmFtIGFwcHJvcHJpYXRlbHkuCisvSU5TVEFMTC9zL15JTlNUQUxMICo9ICpgLipgOmluc3RhbGwuc2ggLWMvSU5TVEFMTCA9IER1cGxpY2F0ZSAteS8KKworIyBEb24ndCB0cnkgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlIHRoZSB0cmVlJ3Mgb3duIHRvb2xzLgorL2Jpc29uL3MvYC4qYmlzb246Ymlzb24uKmAvYmlzb24gLXkvCisvYnlhY2Mvcy9gLipieWFjYzpieWFjYy4qYC9ieWFjYy8KKy9mbGV4L3MvYC4qZmxleDpmbGV4LipgL2ZsZXgvCisKKyMgVHVybiB0cmFuc2Zvcm1lZCBDIGNvbW1lbnRzIGluIGVjaG8gY29tbWFuZHMgYmFjayBpbnRvIGNvbW1lbnRzLgorL2VjaG8vcyxlY2hvICdcKC4qXCk6XFxPcHRpb24teFwoLipcKVxcT3B0aW9uLXg6XCguKlwpJyxlY2hvICdcMS8qXDIqL1wzJywKKworIyBXaGFjayBvdXQgdmFyaW91cyBjbGV2ZXIgZXhwcmVzc2lvbnMgdGhhdCBzZWFyY2ggZm9yIHRvb2xzLCBzaW5jZQorIyB0aGUgY2xldmVyIGNvZGUgaXMgdG9vIC9iaW4vc2ggc3BlY2lmaWMuCisKKy9eQVJfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAorQVJfRk9SX1RBUkdFVCA9IDo6YmludXRpbHM6YXJcCisKKworL15SQU5MSUJfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAorUkFOTElCX0ZPUl9UQVJHRVQgPSA6OmJpbnV0aWxzOnJhbmxpYlwKKworCisvXlJBTkxJQl9URVNUX0ZPUl9UQVJHRVQgPSAvLC9yYW5saWIgXSApJC9jXAorUkFOTElCX1RFU1RfRk9SX1RBUkdFVCA9IFwKKworCisvXkVYUEVDVCA9IGAvLC9gJC9jXAorRVhQRUNUID0gXAorCisKKy9eUlVOVEVTVCA9IGAvLC9gJC9jXAorUlVOVEVTVCA9IFwKKworCisvXkNDX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKK0NDX0ZPUl9UQVJHRVQgPSBcCisKKworL15DWFhfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAorQ1hYX0ZPUl9UQVJHRVQgPSBcCisKKworL15DSElMTF9GT1JfVEFSR0VUID0gYC8sL2AkL2NcCitDSElMTF9GT1JfVEFSR0VUID0gXAorCisKKy9eQ0hJTExfTElCID0gYC8sL2AkL2NcCitDSElMTF9MSUIgPSBcCisKKy9zYW5pdC9zL3tzdGFydC1zYW5pdC4uLi1bYS16MC05XSp9Ly8KKy9zYW5pdC9zL3tlbmQtc2FuaXQuLi4tW2EtejAtOV0qfS8vCisKKyMgQWRkIHN0YW5kYXJkIGRlZmluZXMgYW5kIGRlZmF1bHQgcnVsZXMuCisvXiMgc3JjZGlyL2FcCitcCitzID0gIntzcmNkaXJ9IlwKK1wKK28gPSA6XAorXAorIntvfSIgXFxPcHRpb24tZiA6ICJ7c30iCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRvdWNoIGIvY29uZmlnL21wdy9tcHctdG91Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0M2E1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9tcHcvbXB3LXRvdWNoCkBAIC0wLDAgKzEsNyBAQAorIyAiVG91Y2giIGNvbW1hbmQuCisKK0lmICJgRXhpc3RzICJ7MX0iYCIgIT0gIiIKKwlTZXRGaWxlIC1tIC4gInsxfSIKK0Vsc2UKKwlFY2hvICcgJyA+ICJ7MX0iCitFbmQgSWYKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvbXB3LXRydWUgYi9jb25maWcvbXB3L21wdy10cnVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDY1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXB3L21wdy10cnVlCkBAIC0wLDAgKzEgQEAKK0V4aXQgMApkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQgYi9jb25maWcvbXB3L251bGwtY29tbWFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODQ0YzhlCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21wdy9udWxsLWNvbW1hbmQKQEAgLTAsMCArMSBAQAorIyBUaGlzIGNvbW1hbmQgZG9lcyBub3RoaW5nLgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9vcGVuLWJyYWNlIGIvY29uZmlnL21wdy9vcGVuLWJyYWNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDY1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXB3L29wZW4tYnJhY2UKQEAgLTAsMCArMSw0IEBACisjIE1QVyBtYWtlZmlsZXMgc2VlbSBub3QgdG8gaGF2ZSBhbnkgd2F5IHRvIGdldCBhIGxpdGVyYWwgb3BlbgorIyBicmFjZSBpbnRvIGEgcnVsZSBhbnl3aGVyZSwgc28gdGhpcyBkb2VzIHRoZSBqb2IuCisKK0VjaG8gJ3snCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L3RyLTd0bzgtc3JjIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBiNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21wdy90ci03dG84LXNyYwpAQCAtMCwwICsxLDkgQEAKK1N0cmVhbUVkaXQgLWUgXE9wdGlvbi1kCisgICcvXE9wdGlvbi14LyBcT3B0aW9uLWQKKyAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWQvICJcT3B0aW9uLWRcT3B0aW9uLWQiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAorICAgIFJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tZi8gIlxPcHRpb24tZFxPcHRpb24tZiIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCisJUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi04LyAiXE9wdGlvbi1kXE9wdGlvbi04IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKKwlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLTUvICJcT3B0aW9uLWRcT3B0aW9uLTUiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAorCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24teC8gIlxPcHRpb24tZFxPcHRpb24teCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCisJUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1yLyAiXE9wdGlvbi1kXE9wdGlvbi1yIiAtYyBcT3B0aW9uLTUnICBcT3B0aW9uLWQKKyAgInsxfSIKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvdHJ1ZSBiL2NvbmZpZy9tcHcvdHJ1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA2NTMwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL21wdy90cnVlCkBAIC0wLDAgKzEgQEAKK0V4aXQgMApkaWZmIC0tZ2l0IGEvY29uZmlnL210LWFybXBpYyBiL2NvbmZpZy9tdC1hcm1waWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViOGM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9tdC1hcm1waWMKQEAgLTAsMCArMSBAQAorUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtZDMwdiBiL2NvbmZpZy9tdC1kMzB2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGI3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXQtZDMwdgpAQCAtMCwwICsxLDQgQEAKKyMgQnVpbGQgbGlicmFyaWVzIG9wdGltaXppbmcgZm9yIHNwYWNlLCBub3Qgc3BlZWQuCisjIFR1cm4gb2ZmIHdhcm5pbmdzIGFib3V0IHN5bWJvbHMgbmFtZWQgdGhlIHNhbWUgYXMgcmVnaXN0ZXJzCisgQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MgLVdhLC1DCisgQ1hYRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcyAtV2EsLUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1lbGZhbHBoYXBpYyBiL2NvbmZpZy9tdC1lbGZhbHBoYXBpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI4YzllCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL210LWVsZmFscGhhcGljCkBAIC0wLDAgKzEgQEAKK1BJQ0ZMQUdfRk9SX1RBUkdFVD0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LWxpbnV4IGIvY29uZmlnL210LWxpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWU2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXQtbGludXgKQEAgLTAsMCArMSwyIEBACisjIFdoZW4gdXNpbmcgZ2xpYmMgMiBvbiBMaW51eCB3ZSBtdXN0IGFsd2F5cyB1c2UgdnRhYmxlIHRodW5rcy4KK0NYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTKSAtZnZ0YWJsZS10aHVua3MgLURfR05VX1NPVVJDRQpkaWZmIC0tZ2l0IGEvY29uZmlnL210LW02OGtwaWMgYi9jb25maWcvbXQtbTY4a3BpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk4NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL210LW02OGtwaWMKQEAgLTAsMCArMSBAQAorUElDRkxBR19GT1JfVEFSR0VUPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWcvbXQtbmV0d2FyZSBiL2NvbmZpZy9tdC1uZXR3YXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODJmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXQtbmV0d2FyZQpAQCAtMCwwICsxIEBACitHREJfTkxNX0RFUFMgPSBhbGwtZ2NjIGFsbC1sZApkaWZmIC0tZ2l0IGEvY29uZmlnL210LW9zcGFjZSBiL2NvbmZpZy9tdC1vc3BhY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwOTEwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9tdC1vc3BhY2UKQEAgLTAsMCArMSwzIEBACisjIEJ1aWxkIGxpYnJhcmllcyBvcHRpbWl6aW5nIGZvciBzcGFjZSwgbm90IHNwZWVkLgorIENGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zCisgQ1hYRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcwpkaWZmIC0tZ2l0IGEvY29uZmlnL210LXBhcGljIGIvY29uZmlnL210LXBhcGljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjhjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXQtcGFwaWMKQEAgLTAsMCArMSBAQAorUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtcHBjcGljIGIvY29uZmlnL210LXBwY3BpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWI4YzllCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL210LXBwY3BpYwpAQCAtMCwwICsxIEBACitQSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1zcGFyY3BpYyBiL2NvbmZpZy9tdC1zcGFyY3BpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDBlYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL210LXNwYXJjcGljCkBAIC0wLDAgKzEgQEAKK1BJQ0ZMQUdfRk9SX1RBUkdFVD1gY2FzZSAiJHtMSUJDRkxBR1N9ICR7TElCQ1hYRkxBR1N9IiBpbiAqLWZwaWMqICkgZWNobyAtZnBpYyA7OyAqICkgZWNobyAtZlBJQyA7OyBlc2FjYApkaWZmIC0tZ2l0IGEvY29uZmlnL210LXY4MTAgYi9jb25maWcvbXQtdjgxMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RhNmMyCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL210LXY4MTAKQEAgLTAsMCArMSw0IEBACitDQ19GT1JfVEFSR0VUID0gY2E3MzIgLWFuc2kKK0FTX0ZPUl9UQVJHRVQgPSBhczczMgorQVJfRk9SX1RBUkdFVCA9IGFyNzMyCitSQU5MSUJfRk9SX1RBUkdFVCA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC14ODZwaWMgYi9jb25maWcvbXQteDg2cGljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTg3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvbXQteDg2cGljCkBAIC0wLDAgKzEgQEAKK1BJQ0ZMQUdfRk9SX1RBUkdFVD0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhZDYwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUKQEAgLTAsMCArMSwxNTk1IEBACisjIS9iaW4vc2gKKworIyMjIFdBUk5JTkc6IHRoaXMgZmlsZSBjb250YWlucyBlbWJlZGRlZCB0YWJzLiAgRG8gbm90IHJ1biB1bnRhYmlmeSBvbiB0aGlzIGZpbGUuCisKKyMgQ29uZmlndXJhdGlvbiBzY3JpcHQKKyMgQ29weXJpZ2h0IChDKSAxOTg4LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NworIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCisKKyMKKyMgU2hlbGwgc2NyaXB0IHRvIGNyZWF0ZSBwcm9wZXIgbGlua3MgdG8gbWFjaGluZS1kZXBlbmRlbnQgZmlsZXMgaW4KKyMgcHJlcGFyYXRpb24gZm9yIGNvbXBpbGF0aW9uLgorIworIyBJZiBjb25maWd1cmUgc3VjY2VlZHMsIGl0IGxlYXZlcyBpdHMgc3RhdHVzIGluIGNvbmZpZy5zdGF0dXMuCisjIElmIGNvbmZpZ3VyZSBmYWlscyBhZnRlciBkaXN0dXJiaW5nIHRoZSBzdGF0dXMgcXVvLCAKKyMgICAgICAgY29uZmlnLnN0YXR1cyBpcyByZW1vdmVkLgorIworCitleHBvcnQgUEFUSCB8fCAoZWNobyAiT09QUywgdGhpcyBpc24ndCBzaC4gIERlc3BlcmF0aW9uIHRpbWUuICBJIHdpbGwgZmVlZCBteXNlbGYgdG8gc2guIjsgc2ggJDAgJGFyZ3Y7IGtpbGwgJCQpCisKK3JlbW92ZT1ybQoraGFyZF9saW5rPWxuCitzeW1ib2xpY19saW5rPSdsbiAtcycKKworI2ZvciBUZXN0CisjcmVtb3ZlPSJlY2hvIHJtIgorI2hhcmRfbGluaz0iZWNobyBsbiIKKyNzeW1ib2xpY19saW5rPSJlY2hvIGxuIC1zIgorCisjIGNsZWFyIHNvbWUgdGhpbmdzIHBvdGVudGlhbGx5IGluaGVyaXRlZCBmcm9tIGVudmlyb25tZW50LgorCitNYWtlZmlsZT1NYWtlZmlsZQorTWFrZWZpbGVfaW49TWFrZWZpbGUuaW4KK2FyZ3VtZW50cz0KK2J1aWxkX2FsaWFzPQorY2FjaGVfZmlsZT1jb25maWcuY2FjaGUKK2NhY2hlX2ZpbGVfb3B0aW9uPQorY29uZmlnZGlycz0KK2V4dHJhY29uZmlnZGlycz0KK2Rpcm9wdGlvbnM9CitleGVjX3ByZWZpeD0KK2V4ZWNfcHJlZml4b3B0aW9uPQorZmF0YWw9CitmbG9hdGluZ19wb2ludD1kZWZhdWx0CitnYXM9ZGVmYXVsdAorZ2NjX3ZlcnNpb249CitnY2NfdmVyc2lvbl90cmlnZ2VyPQoraG9zdF9hbGlhcz1OT0hPU1QKK2hvc3RfbWFrZWZpbGVfZnJhZz0KK21vdmVpZmNoYW5nZT0KK25vcmVjdXJzaW9uPQorb3RoZXJfb3B0aW9ucz0KK3BhY2thZ2VfbWFrZWZpbGVfZnJhZz0KK3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZz0KK3ByZWZpeD0vdXNyL2xvY2FsCitwcm9nbmFtZT0KK3Byb2dyYW1fcHJlZml4PQorcHJvZ3JhbV9wcmVmaXhvcHRpb249Citwcm9ncmFtX3N1ZmZpeD0KK3Byb2dyYW1fc3VmZml4b3B0aW9uPQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249CityZWRpcmVjdD0KK3JlbW92aW5nPQorc2l0ZT0KK3NpdGVfbWFrZWZpbGVfZnJhZz0KK3NpdGVfb3B0aW9uPQorc3JjZGlyPQorc3JjdHJpZ2dlcj0KK3N1YmRpcnM9Cit0YXJnZXRfYWxpYXM9Tk9UQVJHRVQKK3RhcmdldF9tYWtlZmlsZV9mcmFnPQordW5kZWZzPU5PVU5ERUZTCit2ZXJzaW9uPSIkUmV2aXNpb24kIgoreDExPWRlZmF1bHQKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIyMgd2UgbWlnaHQgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBzaGVsbCB0aGFuIC9iaW4vc2ggZm9yIHJ1bm5pbmcgc3Vic2hlbGxzCisKKyMjIyBJZiB3ZSBhcmUgb24gV2luZG93cywgc2VhcmNoIGZvciB0aGUgc2hlbGwuICBUaGlzIHdpbGwgcGVybWl0IHBlb3BsZQorIyMjIHRvIG5vdCBoYXZlIC9iaW4vc2gsIGJ1dCB0byBiZSBhYmxlIHRvIHNlZSAvU09NRS9QQVRIL3NoIGNvbmZpZ3VyZQorIyMjIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gc2V0IENPTkZJR19TSEVMTC4gIFRoaXMgY29kZSB3aWxsIHdvcmsgd2hlbgorIyMjIHVzaW5nIGJhc2gsIHdoaWNoIHNldHMgT1NUWVBFLgorY2FzZSAiJHtPU1RZUEV9IiBpbgorKndpbjMyKikKKyAgaWYgWyB4JHtDT05GSUdfU0hFTEx9ID0geCBdOyB0aGVuCisgICAgaWYgWyAhIC1mIC9iaW4vc2ggXTsgdGhlbgorICAgICAgaWYgWyB4JHtTSEVMTH0gIT0geCBdICYmIFsgLWYgJHtTSEVMTH0gXTsgdGhlbgorCUNPTkZJR19TSEVMTD0ke1NIRUxMfQorCWV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgIGVsc2UKKwlmb3IgcHJvZyBpbiBzaCBzaC5leGUgYmFzaCBiYXNoLmV4ZTsgZG8KKwkgIElGUz0iJHtJRlM9CX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKwkgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisJICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisJICAgIGlmIHRlc3QgLWYgJGRpci8kcHJvZzsgdGhlbgorCSAgICAgIENPTkZJR19TSEVMTD0kZGlyLyRwcm9nCisJICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIHRlc3QgLW4gIiR7Q09ORklHX1NIRUxMfSIgJiYgYnJlYWsKKwlkb25lCisgICAgICBmaQorICAgIGZpCisgIGZpCisgIDs7Citlc2FjCisKK2NvbmZpZ19zaGVsbD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCitOT19FRElUPSJUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBlZGl0LiIKKworIyMgdGhpcyBpcyBhIGxpdHRsZSB0b3VjaHkgYW5kIHdvbid0IGFsd2F5cyB3b3JrLCBidXQuLi4KKyMjCisjIyBpZiB0aGUgYXJndlswXSBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZW4gaXQgaXMgYW4gYWJzb2x1dGUgbmFtZSB0aGF0IGNhbiAoYW5kCisjIyBtdXN0KSBiZSB1c2VkIGFzIGlzLgorIyMKKyMjIG90aGVyd2lzZSwgaWYgYXJndlswXSBoYXMgbm8gc2xhc2ggaW4gaXQsIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBvbiB0aGUKKyMjIHBhdGguICBTaW5jZSBQQVRIIG1pZ2h0IGluY2x1ZGUgIi4iIHdlIGFsc28gYWRkIGBwd2RgIHRvIHRoZSBlbmQgb2YgUEFUSC4KKyMjCisKK3Byb2duYW1lPSQwCisjIGlmIFBXRCBhbHJlYWR5IGhhcyBhIHZhbHVlLCBpdCBpcyBwcm9iYWJseSB3cm9uZy4KK2lmIFsgLW4gIiRQV0QiIF07IHRoZW4gUFdEPWBwd2RgOyBmaQorCitjYXNlICIke3Byb2duYW1lfSIgaW4KKy8qKSA7OworKi8qKSA7OworKikKKyAgICAgICAgUEFUSD0kUEFUSDoke1BXRD1gcHdkYH0gOyBleHBvcnQgUEFUSAorICAgICAgICA7OworZXNhYworCisjIExvb3Agb3ZlciBhbGwgYXJncworCit3aGlsZSA6CitkbworCisjIEJyZWFrIG91dCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhcmdzCisJY2FzZSAkIyBpbgorCTApCisJCWJyZWFrCisJCTs7CisJZXNhYworCisjIEdldCB0aGUgZmlyc3QgYXJnLCBhbmQgc2h1ZmZsZQorCW9wdGlvbj0kMQorCXNoaWZ0CisKKyMgTWFrZSBhbGwgb3B0aW9ucyBoYXZlIHR3byBoeXBoZW5zCisJb3JpZ19vcHRpb249JG9wdGlvbgkjIFNhdmUgb3JpZ2luYWwgZm9yIGVycm9yIG1lc3NhZ2VzCisJY2FzZSAkb3B0aW9uIGluCisJLS0qKSA7OworCS0qKSBvcHRpb249LSRvcHRpb24gOzsKKwllc2FjCisJCQorIyBTcGxpdCBvdXQgdGhlIGFyZ3VtZW50IGZvciBvcHRpb25zIHRoYXQgdGFrZSB0aGVtCisJY2FzZSAkb3B0aW9uIGluCisJLS0qPSopCisJCW9wdGFyZz1gZWNobyAkb3B0aW9uIHwgc2VkIC1lICdzL15bXj1dKj0vLydgCisJCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgorCQk7OworIyBUaGVzZSBvcHRpb25zIGhhdmUgbWFuZGF0b3J5IHZhbHVlcy4gIFNpbmNlIHdlIGRpZG4ndCBmaW5kIGFuID0gc2lnbiwKKyMgdGhlIHZhbHVlIG11c3QgYmUgaW4gdGhlIG5leHQgYXJndW1lbnQKKwktLWJ1KiB8IC0tY2FjaGUqIHwgLS1leCogfCAtLWhvKiB8IC0tcHJlKiB8IC0tcHJvZ3JhbS1wKiB8IC0tcHJvZ3JhbS1zKiB8IC0tcHJvZ3JhbS10KiB8IC0tc2kqIHwgLS1zciogfCAtLXRhKiB8IC0tdG0qIHwgLS14LSogfCAtLWJpKiB8IC0tc2IqIHwgLS1saSogfCAtLWRhKiB8IC0tc3kqIHwgLS1zaCogfCAtLWxvKiB8IC0taW4qIHwgLS1vbCogfCAtLW1hKikKKwkJb3B0YXJnPSQxCisJCXNoaWZ0CisJCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uPSRvcHRhcmciCisJCTs7CisJLS12KQorCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgLXYiCisJCTs7CisJLS0qKQorCQlhcmd1bWVudHM9IiRhcmd1bWVudHMgJG9wdGlvbiIKKwkJOzsKKwllc2FjCisKKyMgTm93LCBwcm9jZXNzIHRoZSBvcHRpb25zCisJY2FzZSAkb3B0aW9uIGluCisKKwktLWJpKikKKwkJYmluZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1iaW5kaXI9JG9wdGFyZyIKKwkJOzsKKwktLWJ1aWxkKiB8IC0tYnUqKQorCQljYXNlICIkYnVpbGRfYWxpYXMiIGluCisJCSIiKSBidWlsZF9hbGlhcz0kb3B0YXJnIDs7CisJCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgYnVpbGQgbWFjaGluZSBhdCBhIHRpbWUuICAxPiYyCisJCSAgIGZhdGFsPXllcworCQkgICA7OworCQllc2FjCisJCTs7CisJLS1jYWNoZSopCisJCWNhY2hlX2ZpbGU9JG9wdGFyZworCQk7OworCS0tZGEqKQorCQlkYXRhZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1kYXRhZGlyPSRvcHRhcmciCisJCTs7CisJLS1kaXNhYmxlLSopCisJCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCisJCWV2YWwgJGVuYWJsZW9wdD1ubworCQlkaXNhYmxlb3B0aW9ucz0iJGRpc2FibGVvcHRpb25zICRvcHRpb24iCisJCTs7CisJLS1lbmFibGUtKikKKwkJY2FzZSAiJG9wdGlvbiIgaW4KKwkJKj0qKQk7OworCQkqKQlvcHRhcmc9eWVzIDs7CisJCWVzYWMKKworCQllbmFibGVvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6PS4qJDo6O3M6LTpfOmcnYAorCQlldmFsICIkZW5hYmxlb3B0PSckb3B0YXJnJyIKKwkJZW5hYmxlb3B0aW9ucz0iJGVuYWJsZW9wdGlvbnMgJyRvcHRpb24nIgorCQk7OworCS0tZXhlYy1wcmVmaXgqIHwgLS1leCopCisJCWV4ZWNfcHJlZml4PSRvcHRhcmcKKwkJZXhlY19wcmVmaXhvcHRpb249Ii0tZXhlYy1wcmVmaXg9JG9wdGFyZyIKKwkJOzsKKwktLWdhcyB8IC0tZyopCisJCWdhcz15ZXMKKwkJOzsKKwktLWhlbHAgfCAtLWhlKikKKwkJZmF0YWw9eWVzCisJCTs7CisJLS1ob3N0KiB8IC0taG8qKQorCQljYXNlICRob3N0X2FsaWFzIGluCisJCU5PSE9TVCkgaG9zdF9hbGlhcz0kb3B0YXJnIDs7CisJCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhdCBhIHRpbWUuICAxPiYyCisJCSAgIGZhdGFsPXllcworCQkgICA7OworCQllc2FjCisJCTs7CisJLS1pbmMqKQorCQlpbmNsdWRlZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmNsdWRlZGlyPSRvcHRhcmciCisJCTs7CisJLS1pbmYqKQorCQlpbmZvZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1pbmZvZGlyPSRvcHRhcmciCisJCTs7CisJLS1saWJkKikKKwkJbGliZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJkaXI9JG9wdGFyZyIKKwkJOzsKKwktLWxpYmUqKQorCQlsaWJleGVjZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1saWJleGVjZGlyPSRvcHRhcmciCisJCTs7CisJLS1sbyopCisJCWxvY2Fsc3RhdGVkaXI9JG9wdGFyZworCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxvY2Fsc3RhdGVkaXI9JG9wdGFyZyIKKwkJOzsKKwktLW1hKikKKwkJbWFuZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1tYW5kaXI9JG9wdGFyZyIKKwkJOzsKKwktLW5mcCB8IC0tbmYqKQorCQlmbG9hdGluZ19wb2ludD1ubworCQlmbG9hdGluZ19wb2ludG9wdGlvbj0iLS1uZnAiCisJCTs7CisJLS1ub3JlY3Vyc2lvbiB8IC0tbm8qKQorCQlub3JlY3Vyc2lvbj15ZXMKKwkJOzsKKwktLW9sKikKKwkJb2xkaW5jbHVkZWRpcj0kb3B0YXJnCisJCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tb2xkaW5jbHVkZWRpcj0kb3B0YXJnIgorCQk7OworCS0tcHJlZml4KiB8IC0tcHJlKikKKwkJcHJlZml4PSRvcHRhcmcKKwkJcHJlZml4b3B0aW9uPSItLXByZWZpeD0kb3B0YXJnIgorCQk7OworCS0tcHJvZ3JhbS1wcmVmaXgqIHwgLS1wcm9ncmFtLXAqKQorCQlwcm9ncmFtX3ByZWZpeD0kb3B0YXJnCisJCXByb2dyYW1fcHJlZml4b3B0aW9uPSItLXByb2dyYW0tcHJlZml4PSRvcHRhcmciCisJCTs7CisJLS1wcm9ncmFtLXN1ZmZpeCogfCAtLXByb2dyYW0tcyopCisJCXByb2dyYW1fc3VmZml4PSRvcHRhcmcKKwkJcHJvZ3JhbV9zdWZmaXhvcHRpb249Ii0tcHJvZ3JhbS1zdWZmaXg9JG9wdGFyZyIKKwkJOzsKKwktLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUqIHwgLS1wcm9ncmFtLXQqKQorCQkjIERvdWJsZSBhbnkgYmFja3NsYXNoZXMgb3IgZG9sbGFyIHNpZ25zIGluIHRoZSBhcmd1bWVudAorCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IC1lIGBlY2hvICR7b3B0YXJnfSB8IHNlZCAtZSAncy9cXFxcL1xcXFxcXFxcL2cnIC1lICdzL1xcXCQvJCQvZydgIgorCQlwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9uPSIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0nJG9wdGFyZyciCisJCTs7CisJLS1ybSkKKwkJcmVtb3Zpbmc9LS1ybQorCQk7OworCS0tc2IqKQorCQlzYmluZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zYmluZGlyPSRvcHRhcmciCisJCTs7CisJLS1zaCopCisJCXNoYXJlZHN0YXRlZGlyPSRvcHRhcmcKKwkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zaGFyZWRzdGF0ZWRpcj0kb3B0YXJnIgorCQk7OworCS0tc2lsZW50IHwgLS1zaWwqIHwgLS1xdWlldCB8IC0tcSopCisJCXJlZGlyZWN0PSI+L2Rldi9udWxsIgorCQl2ZXJib3NlPS0tc2lsZW50CisJCTs7CisJLS1zaXRlKiB8IC0tc2l0KikKKwkJc2l0ZT0kb3B0YXJnCisJCXNpdGVfb3B0aW9uPSItLXNpdGU9JG9wdGFyZyIKKwkJOzsKKwktLXNyY2RpciovIHwgLS1zciovKQorICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICBPdGhlcndpc2UsIHdoZW4gdGhlIGZpbGUgbmFtZSBnZXRzCisgICAgICAgICAgICAgICAgIyBib2x0ZWQgaW50byBhbiBvYmplY3QgZmlsZSBhcyBkZWJ1ZyBpbmZvLCBpdCBoYXMgdHdvIHNsYXNoZXMKKyAgICAgICAgICAgICAgICAjIGluIGl0LiAgT3JkaW5hcmlseSB0aGlzIGlzIG9rLCBidXQgZW1hY3MgdGFrZXMgZG91YmxlIHNsYXNoCisgICAgICAgICAgICAgICAgIyB0byBtZWFuICJmb3JnZXQgdGhlIGZpcnN0IHBhcnQiLgorCQlzcmNkaXI9YGVjaG8gJG9wdGFyZyB8IHNlZCAtZSAnczovJDo6J2AKKwkJOzsKKwktLXNyY2RpciogfCAtLXNyKikKKwkJc3JjZGlyPSRvcHRhcmcKKwkJOzsKKwktLXN5KikKKwkJc3lzY29uZmRpcj0kb3B0YXJnCisJCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tc3lzY29uZmRpcj0kb3B0YXJnIgorCQk7OworCS0tdGFyZ2V0KiB8IC0tdGEqKQorCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KKwkJTk9UQVJHRVQpIHRhcmdldF9hbGlhcz0kb3B0YXJnIDs7CisJCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKKwkJICAgZmF0YWw9eWVzCisJCSAgIDs7CisJCWVzYWMKKwkJOzsKKwktLXRtcGRpciogfCAtLXRtKikKKwkJVE1QRElSPSRvcHRhcmcKKwkJdG1wZGlyb3B0aW9uPSItLXRtcGRpcj0kb3B0YXJnIgorCQk7OworCS0tdmVyYm9zZSB8IC0tdiB8IC0tdmVyYiopCisJCXJlZGlyZWN0PQorCQl2ZXJib3NlPS0tdmVyYm9zZQorCQk7OworCS0tdmVyc2lvbiB8IC0tViB8IC0tdmVycyopCisJCWVjaG8gIlRoaXMgaXMgQ3lnbnVzIENvbmZpZ3VyZSB2ZXJzaW9uIiBgZWNobyAke3ZlcnNpb259IHwgc2VkICdzL1sgJDpdLy9nJ2AKKwkJZXhpdCAwCisJCTs7CisJLS13aXRoLSopCisJCWNhc2UgIiRvcHRpb24iIGluCisJCSo9KikJOzsKKwkJKikJb3B0YXJnPXllcyA7OworCQllc2FjCisKKwkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCisJCWV2YWwgJHdpdGhvcHQ9IiRvcHRhcmciCisJCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgJG9wdGlvbiIKKwkJOzsKKwktLXdpdGhvdXQtKikKKwkJd2l0aG9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czpvdXQ6OjtzOi06XzpnJ2AKKwkJZXZhbCAkd2l0aG9wdD1ubworCQl3aXRob3V0b3B0aW9ucz0iJHdpdGhvdXRvcHRpb25zICRvcHRpb24iCisJCTs7CisJLS14KQl3aXRoX3g9eWVzCisJCXdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLXgiCisJCTs7CisJLS14LWkqIHwgLS14LWwqKSBvdGhlcl9vcHRpb25zPSIkb3RoZXJfb3B0aW9ucyAkb3JpZ19vcHRpb24iCisJCTs7CisJLS0qKQorCQllY2hvICJjb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246IFwiJG9yaWdfb3B0aW9uXCI7IHVzZSAtLWhlbHAgZm9yIHVzYWdlLiIgPiYyCisJCWV4aXQgMQorCQk7OworCSopCisJCWNhc2UgJHVuZGVmcyBpbgorCQlOT1VOREVGUykgdW5kZWZzPSRvcHRpb24gOzsKKwkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKKwkJICAgZmF0YWw9eWVzCisJCSAgIDs7CisJCWVzYWMKKwkJOzsKKwllc2FjCitkb25lCisKKyMgcHJvY2VzcyBob3N0IGFuZCB0YXJnZXQKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIFVOREVGUworIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlbid0IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgdW5kZWZzIGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gdW5kZWZzLgorIyAzLiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgZGVmYXVsdHMgdG8gdW5kZWZzLgorIyA1LiBJZiB1bmRlZnMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgZGVmYXVsdHMgdG8gaG9zdC4KKworY2FzZSAiJHtmYXRhbH0iIGluCisiIikKKwkjIE1ha2Ugc3VyZSB0aGF0IGhvc3QsIHRhcmdldCAmIHVuZGVmcyBhcmVuJ3QgYWxsIHNwZWNpZmllZCBhdCB0aGUKKwkjIHNhbWUgdGltZS4KKwljYXNlICRob3N0X2FsaWFzLS0tJHRhcmdldF9hbGlhcy0tLSR1bmRlZnMgaW4KKwlOT0hPU1QtLS0qLS0tKiB8ICotLS1OT1RBUkdFVC0tLSogfCAqLS0tKi0tLU5PVU5ERUZTKQorCQk7OworCSopIGVjaG8gJyoqKicgQ2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUuICAxPiYyCisJICAgZmF0YWw9eWVzCisJICAgYnJlYWsgMgorCQk7OworCWVzYWMKKworCSMgTm93LCBkbyBkZWZhdWx0aW5nIGZvciBob3N0LgorCWNhc2UgJGhvc3RfYWxpYXMgaW4KKwlOT0hPU1QpCisJCWNhc2UgJHVuZGVmcyBpbgorCQlOT1VOREVGUykKKwkJCSMgTmVpdGhlciAtLWhvc3Qgb3B0aW9uIG5vciB1bmRlZnMgd2VyZSBwcmVzZW50LgorCQkJIyBDYWxsIGNvbmZpZy5ndWVzcy4KKwkJCWd1ZXNzc3lzPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzL2NvbmZpZ3VyZSQvY29uZmlnLmd1ZXNzLydgCisJCQlpZiBob3N0X2FsaWFzPWAke2NvbmZpZ19zaGVsbH0gJHtndWVzc3N5c31gCisJCQl0aGVuCisJCQkJIyBJZiB0aGUgc3RyaW5nIHdlIGFyZSBnb2luZyB0byB1c2UgZm9yCisJCQkJIyB0aGUgdGFyZ2V0IGlzIGEgcHJlZml4IG9mIHRoZSBzdHJpbmcKKwkJCQkjIHdlIGp1c3QgZ3Vlc3NlZCBmb3IgdGhlIGhvc3QsIHRoZW4KKwkJCQkjIGFzc3VtZSB3ZSBhcmUgcnVubmluZyBuYXRpdmUsIGFuZCBmb3JjZQorCQkJCSMgdGhlIHNhbWUgc3RyaW5nIGZvciBib3RoIHRhcmdldCBhbmQgaG9zdC4KKwkJCQljYXNlICR0YXJnZXRfYWxpYXMgaW4KKwkJCQlOT1RBUkdFVCkgOzsKKwkJCQkqKQorCQkJCQlpZiBleHByICRob3N0X2FsaWFzIDogJHRhcmdldF9hbGlhcyA+L2Rldi9udWxsCisJCQkJCXRoZW4KKwkJCQkJCWhvc3RfYWxpYXM9JHRhcmdldF9hbGlhcworCQkJCQlmaQorCQkJCQk7OworCQkJCWVzYWMKKwkJCQllY2hvICJDb25maWd1cmluZyBmb3IgYSAke2hvc3RfYWxpYXN9IGhvc3QuIiAxPiYyCisJCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKKwkJCWVsc2UKKwkJCQllY2hvICdDb25maWcuZ3Vlc3MgZmFpbGVkIHRvIGRldGVybWluZSB0aGUgaG9zdCB0eXBlLiAgWW91IG5lZWQgdG8gc3BlY2lmeSBvbmUuJyAxPiYyCisJCQkJZmF0YWw9eWVzCisJCQlmaQorCQkJOzsKKwkJKikKKwkJCWhvc3RfYWxpYXM9JHVuZGVmcworCQkJYXJndW1lbnRzPSItLWhvc3Q9JGhvc3RfYWxpYXMgJGFyZ3VtZW50cyIKKwkJCXVuZGVmcz1OT1VOREVGUworCQkJOzsKKwkJZXNhYworCWVzYWMKKworCSMgRG8gZGVmYXVsdGluZyBmb3IgdGFyZ2V0LiAgSWYgLS10YXJnZXQgb3B0aW9uIGlzbid0IHByZXNlbnQsIGRlZmF1bHQKKwkjIHRvIHVuZGVmcy4gIElmIHVuZGVmcyBpc24ndCBwcmVzZW50LCBkZWZhdWx0IHRvIGhvc3QuCisJY2FzZSAkdGFyZ2V0X2FsaWFzIGluCisJTk9UQVJHRVQpCisJCWNhc2UgJHVuZGVmcyBpbgorCQlOT1VOREVGUykKKwkJCXRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcworCQkJOzsKKwkJKikKKwkJCXRhcmdldF9hbGlhcz0kdW5kZWZzCisJCQlhcmd1bWVudHM9Ii0tdGFyZ2V0PSR0YXJnZXRfYWxpYXMgJGFyZ3VtZW50cyIKKwkJCTs7CisJCWVzYWMKKwllc2FjCisJOzsKKyopIDs7Citlc2FjCisKK2lmIFsgLW4gIiR7ZmF0YWx9IiAtbyAiJHtob3N0X2FsaWFzfSIgPSAiaGVscCIgXSA7IHRoZW4KKwlleGVjIDE+JjIKKwllY2hvIFVzYWdlOiBjb25maWd1cmUgW09QVElPTlNdIFtIT1NUXQorCWVjaG8KKwllY2hvIE9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0c10KKwllY2hvICcgLS1wcmVmaXg9TVlESVIJCSBpbnN0YWxsIGludG8gTVlESVIgWy91c3IvbG9jYWxdJworCWVjaG8gJyAtLWV4ZWMtcHJlZml4PU1ZRElSCSBpbnN0YWxsIGhvc3QtZGVwZW5kZW50IGZpbGVzIGludG8gTVlESVIgWy91c3IvbG9jYWxdJworCWVjaG8gJyAtLWhlbHAJCQkgcHJpbnQgdGhpcyBtZXNzYWdlIFtub3JtYWwgY29uZmlnXScKKwllY2hvICcgLS1idWlsZD1CVUlMRAkJIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdJworCWVjaG8gJyAtLWhvc3Q9SE9TVAkJIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZGV0ZXJtaW5lZCB2aWEgY29uZmlnLmd1ZXNzXScKKwllY2hvICcgLS1ub3JlY3Vyc2lvbgkJIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXScKKwllY2hvICcgLS1wcm9ncmFtLXByZWZpeD1GT08JIHByZXBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCisJZWNobyAnIC0tcHJvZ3JhbS1zdWZmaXg9Rk9PCSBhcHBlbmQgRk9PIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzIFsiIl0nCisJZWNobyAnIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QIHRyYW5zZm9ybSBpbnN0YWxsZWQgbmFtZXMgYnkgc2VkIHBhdHRlcm4gUCBbIiJdJworCWVjaG8gJyAtLXNpdGU9U0lURQkJIGNvbmZpZ3VyZSB3aXRoIHNpdGUtc3BlY2lmaWMgbWFrZWZpbGUgZm9yIFNJVEUnCisJZWNobyAnIC0tc3JjZGlyPURJUgkJIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFsuIG9yIC4uXScKKwllY2hvICcgLS10YXJnZXQ9VEFSR0VUCSBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdJworCWVjaG8gJyAtLXRtcGRpcj1UTVBESVIJIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gVE1QRElSIFsvdG1wXScKKwllY2hvICcgLS1uZnAJCQkgY29uZmlndXJlIGZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBbaGFyZCBmbG9hdF0nCisJZWNobyAnIC0td2l0aC1GT08sIC0td2l0aC1GT089QkFSIHBhY2thZ2UgRk9PIGlzIGF2YWlsYWJsZSAocGFyYW1ldGVyIEJBUiknCisJZWNobyAnIC0td2l0aG91dC1GT08JCSBwYWNrYWdlIEZPTyBpcyBOT1QgYXZhaWxhYmxlJworCWVjaG8gJyAtLWVuYWJsZS1GT08sIC0tZW5hYmxlLUZPTz1CQVIgaW5jbHVkZSBmZWF0dXJlIEZPTyAocGFyYW1ldGVyIEJBUiknCisJZWNobyAnIC0tZGlzYWJsZS1GT08JCSBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTycKKwllY2hvCisJZWNobyAnV2hlcmUgSE9TVCBhbmQgVEFSR0VUIGFyZSBzb21ldGhpbmcgbGlrZSAic3BhcmMtc3Vub3MiLCAibWlwcy1zZ2ktaXJpeDUiLCBldGMuJworCWVjaG8KKwlpZiBbIC1yIGNvbmZpZy5zdGF0dXMgXSA7IHRoZW4KKwkJY2F0IGNvbmZpZy5zdGF0dXMKKwlmaQorCisJZXhpdCAxCitmaQorCitjb25maWdzdWI9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuc3ViLydgCittb3ZlaWZjaGFuZ2U9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9tb3ZlLWlmLWNoYW5nZS8nYAordG9wc3JjZGlyPWBjZCBcYGRpcm5hbWUgJHtwcm9nbmFtZX1cYDsgcHdkYAorCisKKyMgdGhpcyBpcyBhIGhhY2suICBzdW40IG11c3QgYWx3YXlzIGJlIGEgdmFsaWQgaG9zdCBhbGlhcyBvciB0aGlzIHdpbGwgZmFpbC4KK2lmICR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gc3VuNCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisgICAgICAgIHRydWUKK2Vsc2UKKyAgICAgICAgZWNobyAnKioqJyBjYW5ub3QgZmluZCBjb25maWcuc3ViLiAgMT4mMgorICAgICAgICBleGl0IDEKK2ZpCisKK3RvdWNoIGNvbmZpZy5qdW5rCitpZiAke2NvbmZpZ19zaGVsbH0gJHttb3ZlaWZjaGFuZ2V9IGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaCA7IHRoZW4KKyAgICAgICAgdHJ1ZQorZWxzZQorICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIG1vdmUtaWYtY2hhbmdlLiAgMT4mMgorICAgICAgICBleGl0IDEKK2ZpCitybSAtZiBjb25maWcuanVuayBjb25maWcudHJhc2gKKworY2FzZSAiJHtzcmNkaXJ9IiBpbgorIiIpCisgICAgICAgIGlmIFsgLXIgY29uZmlndXJlLmluIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgc3JjZGlyPS4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlmIFsgLXIgJHtwcm9nbmFtZX0uaW4gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY2Rpcj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAnczovY29uZmlndXJlJDo6J2AKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJDYW4ndCBmaW5kIGNvbmZpZ3VyZS5pbi4gIFRyeSB1c2luZyAtLXNyY2Rpcj1zb21lX2RpciIgIDE+JjIKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisqKQorCSMgU2V0IHNyY2RpciB0byAiLiIgaWYgdGhhdCdzIHdoYXQgaXQgaXMuCisJIyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbXVsdGlsaWIgc3VwcG9ydC4KKwlpZiBbICEgLWQgJHtzcmNkaXJ9IF0gOyB0aGVuCisJCWVjaG8gIkludmFsaWQgc291cmNlIGRpcmVjdG9yeSAke3NyY2Rpcn0iID4mMgorCQlleGl0IDEKKwlmaQorCXB3ZD1gcHdkYAorCXNyY3B3ZD1gY2QgJHtzcmNkaXJ9IDsgcHdkYAorCWlmIFsgIiR7cHdkfSIgPSAiJHtzcmNwd2R9IiBdIDsgdGhlbgorCQlzcmNkaXI9LgorCWZpCitlc2FjCisKKyMjIyB3YXJuIGFib3V0IHNvbWUgY29uZmxpY3RpbmcgY29uZmlndXJhdGlvbnMuCisKK2Nhc2UgIiR7c3JjZGlyfSIgaW4KKyIuIikgOzsKKyopCisgICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICcqKionIENhbm5vdCBjb25maWd1cmUgaGVyZSBpbiBcIiR7UFdEPWBwd2RgfVwiIHdoZW4gXCIke3NyY2Rpcn1cIiBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4gMT4mMgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorZXNhYworCisKKyMgZGVmYXVsdCBleGVjX3ByZWZpeAorY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCisiIikgZXhlY19wcmVmaXg9IlwkKHByZWZpeCkiIDs7CisqKSA7OworZXNhYworCisjIERlZmluZSB0aGUgdHJpZ2dlciBmaWxlIHRvIG1ha2Ugc3VyZSBjb25maWd1cmUgd2lsbCByZS1ydW4gd2hlbmV2ZXIKKyMgdGhlIGdjYyB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLgoraWYgWyAiJHt3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIrc2V0fSIgPSBzZXQgXTsgdGhlbgorICAgIGdjY192ZXJzaW9uX3RyaWdnZXI9IiR3aXRoX2djY192ZXJzaW9uX3RyaWdnZXIiCisgICAgZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke3dpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlcn1gCitlbHNlCisgICAgIyBJZiBnY2MncyBzb3VyY2VzIGFyZSBhdmFpbGFibGUsIGRlZmluZSB0aGUgdHJpZ2dlciBmaWxlLgorICAgIGlmIFsgLWYgJHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMgXSA7IHRoZW4KKwlnY2NfdmVyc2lvbl90cmlnZ2VyPSR7dG9wc3JjZGlyfS9nY2MvdmVyc2lvbi5jCisJZ2NjX3ZlcnNpb249YHNlZCAtZSAncy8uKlwiXChbXiBcIl0qXClbIFwiXS4qL1wxLycgPCAke2djY192ZXJzaW9uX3RyaWdnZXJ9YAorCWNhc2UgIiRhcmd1bWVudHMiIGluCisJICAqLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIqICkKKwkgICAgOzsKKwkgICogKQorCSAgICAjIE1ha2Ugc3VyZSBjb25maWd1cmUuaW4ga25vd3MgYWJvdXQgdGhpcy4KKwkgICAgYXJndW1lbnRzPSItLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciAkYXJndW1lbnRzIgorCSAgICA7OworCWVzYWMKKwl3aXRob3B0aW9ucz0iLS13aXRoLWdjYy12ZXJzaW9uLXRyaWdnZXI9JGdjY192ZXJzaW9uX3RyaWdnZXIgJHdpdGhvcHRpb25zIgorICAgIGZpCitmaQorCisjIyMgYnJlYWsgdXAgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbi4KK2Nhc2UgImBncmVwICdeIyBwZXJcLWhvc3Q6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KKyIiKQorICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLWhvc3Q6XCIgbGluZS4gMT4mMgorCSMgQ2hlY2sgZm9yIGEgZGlyZWN0b3J5IHRoYXQncyBiZWVuIGNvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYgc2luY2UKKwkjIGl0IHdhcyBsYXN0IGNvbmZpZ3VyZWQuCisJaWYgZ3JlcCBBQ19PVVRQVVQgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+L2Rldi9udWxsIDsgdGhlbgorCSAgZWNobyAnKioqJyBIbW0sIGxvb2tzIGxpa2UgdGhpcyBkaXJlY3RvcnkgaGFzIGJlZW4gYXV0b2NvbmZpc2NhdGVkLiAxPiYyCisJICBpZiBbIC1yICR7c3JjZGlyfS9jb25maWd1cmUgXSA7IHRoZW4KKwkgICAgZWNobyAnKioqJyBSdW5uaW5nIHRoZSBsb2NhbCBjb25maWd1cmUgc2NyaXB0LiAxPiYyCisJICAgIGNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCisJICAgICIiKSBjYWNoZV9maWxlX29wdGlvbj0gOzsKKwkgICAgKikgIGNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIgOzsKKwkgICAgZXNhYworCSAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7c3JjZGlyfSIKKwkgICAgY2FzZSAiJHtidWlsZF9hbGlhc30iIGluCisJICAgICIiKSBidWlsZG9wdD0gOzsKKwkgICAgKikgIGJ1aWxkb3B0PSItLWJ1aWxkPSR7YnVpbGRfYWxpYXN9IiA7OworCSAgICBlc2FjCisJICAgIGV2YWwgZXhlYyAke2NvbmZpZ19zaGVsbH0gJHtzcmNkaXJ9L2NvbmZpZ3VyZSAke3ZlcmJvc2V9IFwKKwkJJHtidWlsZG9wdH0gLS1ob3N0PSR7aG9zdF9hbGlhc30gLS10YXJnZXQ9JHt0YXJnZXRfYWxpYXN9IFwKKwkJJHtwcmVmaXhvcHRpb259ICR7dG1wZGlyb3B0aW9ufSAke2V4ZWNfcHJlZml4b3B0aW9ufSBcCisJCSR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9IFwKKwkJJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0gJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0gXAorCQkke3Byb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb259ICR7c2l0ZV9vcHRpb259IFwKKwkJJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gXAorCQkke2VuYWJsZW9wdGlvbnN9ICR7ZGlzYWJsZW9wdGlvbnN9ICR7ZmxvYXRpbmdfcG9pbnRvcHRpb259IFwKKwkJJHtjYWNoZV9maWxlX29wdGlvbn0gJHtyZW1vdmluZ30gJHtvdGhlcl9vcHRpb25zfSAke3JlZGlyZWN0fQorCSAgZWxzZQorCSAgICBlY2hvICcqKionIFRoZXJlIGlzIG5vIGNvbmZpZ3VyZSBzY3JpcHQgcHJlc2VudCB0aG91Z2guIDE+JjIKKwkgIGZpCisJZmkKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7CisqKSA7OworZXNhYworCitjYXNlICJgZ3JlcCAnXiMgcGVyXC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluYCIgaW4KKyIiKQorICAgICAgICBlY2hvICcqKionICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaGFzIG5vIFwicGVyLXRhcmdldDpcIiBsaW5lLiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgICA7OworKikgOzsKK2VzYWMKKworY2FzZSAiJHtUTVBESVJ9IiBpbgorIiIpIFRNUERJUj0vdG1wIDsgZXhwb3J0IFRNUERJUiA7OworKikgOzsKK2VzYWMKKworIyBrZWVwIHRoaXMgZmlsZW5hbWUgc2hvcnQgZm9yICYlKiUkKiMgMTQgY2hhciBmaWxlIG5hbWVzCit0bXBmaWxlPSR7VE1QRElSfS9jT05mJCQKKyMgTm90ZSB0aGF0IHVuZGVyIG1hbnkgdmVyc2lvbnMgb2Ygc2ggYSB0cmFwIGhhbmRsZXIgZm9yIDAgd2lsbCAqb3ZlcnJpZGUqIGFueQorIyBleGl0IHN0YXR1cyB5b3UgZXhwbGljaXRseSBzcGVjaWZ5ISAgQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKKyMgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0OyB0aGVzZSBhY3Rpb25zIGFyZSBkdXBsaWNhdGVkIHRoZXJlLCBtaW51cworIyB0aGUgImV4aXQgMSIuICBEb24ndCB1c2UgImV4aXQgMCIgYW55d2hlcmUgYWZ0ZXIgdGhpcyB3aXRob3V0IHJlc2V0dGluZyB0aGUKKyMgdHJhcCBoYW5kbGVyLCBvciB5b3UnbGwgbG9zZS4KK3RyYXAgInJtIC1mIE1ha2VmaWxlLnRlbSAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvczsgZXhpdCAxIiAwIDEgMiAxNQorCisjIHNwbGl0ICR7c3JjZGlyfS9jb25maWd1cmUuaW4gaW50byBjb21tb24sIHBlci1ob3N0LCBwZXItdGFyZ2V0LAorIyBhbmQgcG9zdC10YXJnZXQgcGFydHMuICBQb3N0LXRhcmdldCBpcyBvcHRpb25hbC4KK3NlZCAtZSAnL14jIHBlclwtaG9zdDovLCRkJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5jb20KK3NlZCAtZSAnMSwvXiMgcGVyXC1ob3N0Oi9kJyAtZSAnL14jIHBlclwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LmhzdAoraWYgZ3JlcCAnXiMgcG9zdC10YXJnZXQ6JyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4vZGV2L251bGwgOyB0aGVuCisgIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnIC1lICcvXiMgcG9zdFwtdGFyZ2V0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAorICBzZWQgLWUgJzEsL14jIHBvc3RcLXRhcmdldDovZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0ucG9zCitlbHNlCisgIHNlZCAtZSAnMSwvXiMgcGVyXC10YXJnZXQ6L2QnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LnRndAorICBlY2hvID4ke3RtcGZpbGV9LnBvcworZmkKKworIyMjIGRvIGNvbW1vbiBwYXJ0IG9mIGNvbmZpZ3VyZS5pbgorCisjIElmIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBjb21waWxlciBkb2VzIG5vdCBleGlzdCwgYnV0IHRoZSAiZ2NjIiBkaXJlY3RvcnkgZG9lcywKKyMgd2Ugd2lsbCBza2lwIHRoaXMgZGlyZWN0b3J5OyBpbiB0aGlzIGNhc2UgdGhlIHN1Yi1kaXJlY3RvcnkncyBjb21tb24gcGFydAorIyBvZiBjb25maWd1cmUuaW4gd2lsbCBjcmVhdGUgYSBzbWFsbCBzaGVsbCBzY3JpcHQgInNraXAtdGhpcy1kaXIiIGNvbnRhaW5pbmcKKyMgY29tbWFuZHMgdG8gY29tcGxldGVseSBjbGVhbiB1cCBhbnkgdGVtcG9yYXJ5IG9yIGNyZWF0ZWQgZmlsZXMuCisKKy4gJHt0bXBmaWxlfS5jb20KKworaWYgdGVzdCAtZiBza2lwLXRoaXMtZGlyOyB0aGVuCisJIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKKwkjIGFuZCByZXNldCB0aGUgdHJhcCBoYW5kbGVyLgorCXRyYXAgMAorCXJtIC1mIE1ha2VmaWxlKiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcworCSMgRXhlY3V0ZSB0aGUgZmluYWwgY2xlYW4tdXAgYWN0aW9ucworCSR7Y29uZmlnX3NoZWxsfSBza2lwLXRoaXMtZGlyCisJIyBhbmQgc3RvcCBjb25maWd1cmluZyB0aGlzIGRpcmVjdG9yeS4KKwlleGl0IDAKK2ZpCisKKyMgc29tZSBzYW5pdHkgY2hlY2tzIG9uIGNvbmZpZ3VyZS5pbgorY2FzZSAiJHtzcmN0cmlnZ2VyfSIgaW4KKyIiKQorICAgICAgICBlY2hvICcqKionIHNyY3RyaWdnZXIgbm90IHNldCBpbiAke1BXRD1gcHdkYH0vY29uZmlndXJlLmluLiAgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyopIDs7Citlc2FjCisKK2Nhc2UgIiR7YnVpbGRfYWxpYXN9IiBpbgorIiIpCisJaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7aG9zdF9hbGlhc31gIDsgdGhlbgorCSAgICBidWlsZF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCisJICAgIGJ1aWxkX3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKKwkgICAgYnVpbGRfb3M9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisJICAgIGJ1aWxkPSR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KKwkgICAgYnVpbGRfYWxpYXM9JHtob3N0X2FsaWFzfQorCWZpCisJOzsKKyopCisJaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7YnVpbGRfYWxpYXN9YCA7IHRoZW4KKwkgICAgYnVpbGRvcHQ9Ii0tYnVpbGQ9JHtidWlsZF9hbGlhc30iCisJICAgIGJ1aWxkX2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKKwkgICAgYnVpbGRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorCSAgICBidWlsZF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKwkgICAgYnVpbGQ9JHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQorCWVsc2UKKwkgICAgZWNobyAiVW5yZWNvZ25pemVkIGJ1aWxkIHN5c3RlbSBuYW1lICR7YnVpbGRfYWxpYXN9LiIgMT4mMgorCSAgICBleGl0IDEKKwlmaQorCTs7Citlc2FjCisKK2lmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke2hvc3RfYWxpYXN9YCA7IHRoZW4KKyAgICB0cnVlCitlbHNlCisgICAgZWNobyAiVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIG5hbWUgJHtob3N0X2FsaWFzfS4iIDE+JjIKKyAgICBleGl0IDEKK2ZpCitob3N0X2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2hvc3Q9JHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQorCisuICR7dG1wZmlsZX0uaHN0CisKK2lmIHJlc3VsdD1gJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSAke3RhcmdldF9hbGlhc31gIDsgdGhlbgorICAgIHRydWUKK2Vsc2UKKyAgICBlY2hvICJVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSBuYW1lICR7dGFyZ2V0X2FsaWFzfS4iIDE+JjIKKyAgICBleGl0IDEKK2ZpCit0YXJnZXRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK3RhcmdldD0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0tJHt0YXJnZXRfb3N9CisKKy4gJHt0bXBmaWxlfS50Z3QKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgorY2FzZSAiJHtzcmNkaXJ9IiBpbgorIiIpCisgICAgICAgIHNyY2RpcmRlZmF1bHRlZD0xCisgICAgICAgIHNyY2Rpcj0uCisgICAgICAgIGlmIFsgISAtciAke3NyY3RyaWdnZXJ9IF0gOyB0aGVuCisgICAgICAgICAgICAgICAgc3JjZGlyPS4uCisgICAgICAgIGZpCisgICAgICAgIDs7CisqKSA7OworZXNhYworCitpZiBbICEgLXIgJHtzcmNkaXJ9LyR7c3JjdHJpZ2dlcn0gXSA7IHRoZW4KKyAgICAgICAgY2FzZSAiJHtzcmNkaXJkZWZhdWx0ZWR9IiBpbgorICAgICAgICAiIikgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IENhbid0IGZpbmQgJHtzcmNuYW1lfSBzb3VyY2VzIGluICR7UFdEPWBwd2RgfS8ke3NyY2Rpcn0iIDE+JjIgOzsKKyAgICAgICAgKikgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBDYW4ndCBmaW5kICR7c3JjbmFtZX0gc291cmNlcyBpbiAke1BXRD1gcHdkYH0vLiBvciAke1BXRD1gcHdkYH0vLi4iIDE+JjIgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGVjaG8gJyoqKicgXChBdCBsZWFzdCAke3NyY3RyaWdnZXJ9IGlzIG1pc3NpbmcuXCkgMT4mMgorICAgICAgICBleGl0IDEKK2ZpCisKKyMgU29tZSBzeXN0ZW1zIChlLmcuLCBvbmUgb2YgdGhlIGkzODYtYWl4IHN5c3RlbXMgdGhlIGdhcyB0ZXN0ZXJzIGFyZQorIyB1c2luZykgZG9uJ3QgaGFuZGxlICJcJCIgY29ycmVjdGx5LCBzbyBkb24ndCB1c2UgaXQgaGVyZS4KK3Rvb2xkaXI9JyQoZXhlY19wcmVmaXgpJy8ke3RhcmdldF9hbGlhc30KKworaWYgWyAiJHtob3N0X2FsaWFzfSIgIT0gIiR7dGFyZ2V0X2FsaWFzfSIgXSA7IHRoZW4KKyAgICBpZiBbICIke3Byb2dyYW1fcHJlZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbgorICAgICAgICBpZiBbICIke3Byb2dyYW1fc3VmZml4b3B0aW9ufSIgPSAiIiBdIDsgdGhlbiAKKyAgICAgICAgICAgIGlmIFsgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0iID0gIiIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tIDsKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKK2ZpCisKKyMgTWVyZ2UgcHJvZ3JhbV9wcmVmaXggYW5kIHByb2dyYW1fc3VmZml4IG9udG8gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KKyMgKHByb2dyYW1fc3VmZml4IHVzZWQgdG8gdXNlICQsIGJ1dCBpdCdzIGhhcmQgdG8gcHJlc2VydmUgJCB0aHJvdWdoIGJvdGgKKyMgbWFrZSBhbmQgc2guKQoraWYgWyAiJHtwcm9ncmFtX3N1ZmZpeH0iICE9ICIiIF0gOyB0aGVuCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iLWUgcyxcXFxcKC4qXFxcXCksXFxcXDEke3Byb2dyYW1fc3VmZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKK2ZpCisKK2lmIFsgIiR7cHJvZ3JhbV9wcmVmaXh9IiAhPSAiIiBdIDsgdGhlbgorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ii1lIHMsXiwke3Byb2dyYW1fcHJlZml4fSwgJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfSIKK2ZpCisKKyMgSWYgQ0MgYW5kIENYWCBhcmUgbm90IHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIGFuZCB0aGUgTWFrZWZpbGUKKyMgZXhpc3RzLCB0cnkgdG8gZXh0cmFjdCB0aGVtIGZyb20gaXQuICBUaGlzIGlzIHRvIGhhbmRsZSBydW5uaW5nCisjIC4vY29uZmlnLnN0YXR1cyBieSBoYW5kLgoraWYgWyAteiAiJHtDQ30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCisgIHNlZCAtbiAtZSAnOmxvb3AKKy9cXCQvIE4KK3MvXFxcbi8vZwordCBsb29wCisvXkNDWyAJXSo9LyBzL0NDWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCisgIENDPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAorICBybSAtZiBNYWtlZmlsZS5jYworZmkKKworaWYgWyAteiAiJHtDRkxBR1N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgorICBzZWQgLW4gLWUgJzpsb29wCisvXFwkLyBOCitzL1xcXG4vL2cKK3QgbG9vcAorL15DRkxBR1NbIAldKj0vIHMvQ0ZMQUdTWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCisgIENGTEFHUz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKKyAgcm0gLWYgTWFrZWZpbGUuY2MKK2ZpCisKK2lmIFsgLXogIiR7Q1hYfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KKyAgc2VkIC1uIC1lICc6bG9vcAorL1xcJC8gTgorcy9cXFxuLy9nCit0IGxvb3AKKy9eQ1hYWyAJXSo9LyBzL0NYWFsgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYworICBDWFg9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCisgIHJtIC1mIE1ha2VmaWxlLmNjCitmaQorCitpZiBbIC16ICIke0NYWEZMQUdTfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KKyAgc2VkIC1uIC1lICc6bG9vcAorL1xcJC8gTgorcy9cXFxuLy9nCit0IGxvb3AKKy9eQ1hYRkxBR1NbIAldKj0vIHMvQ1hYRkxBR1NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKKyAgQ1hYRkxBR1M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCisgIHJtIC1mIE1ha2VmaWxlLmNjCitmaQorCisjIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBZQUNDLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAorIyBsb2NhdGUgYmlzb24gb3IgYnlhY2MgaW4gb2JqZGlyLgorCitmb3IgcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjIHlhY2MKK2RvCisgIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCisgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgorICAgICAgREVGQVVMVF9ZQUNDPSIkcHJvZyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICB0ZXN0IC1uICIkREVGQVVMVF9ZQUNDIiAmJiBicmVhaworZG9uZQorCisjIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBNNC4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgbWFrZWZpbGUgY2FuJ3QKKyMgbG9jYXRlIG00IGluIG9iamRpci4KKworZm9yIHByb2cgaW4gZ200IGdudW00IG00CitkbworICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgorICBJRlM9IiR7SUZTPSAgIH0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGRpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCisgICAgICBERUZBVUxUX000PSIkcHJvZyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICB0ZXN0IC1uICIkREVGQVVMVF9NNCIgJiYgYnJlYWsKK2RvbmUKKworIyBHZW5lcmF0ZSBhIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgTEVYLiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAorIyBsb2NhdGUgZmxleCBpbiBvYmpkaXIuCisKK2ZvciBwcm9nIGluIGZsZXggbGV4CitkbworICBzZXQgZHVtbXkgJHByb2c7IHRtcD0kMgorICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KKyAgICAgIERFRkFVTFRfTEVYPSIkcHJvZyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICB0ZXN0IC1uICIkREVGQVVMVF9MRVgiICYmIGJyZWFrCitkb25lCisKK2lmIFsgIiR7YnVpbGR9IiAhPSAiJHtob3N0fSIgXTsgdGhlbgorICAjIElmIHdlIGFyZSBkb2luZyBhIENhbmFkaWFuIENyb3NzLCBpbiB3aGljaCB0aGUgaG9zdCBhbmQgYnVpbGQgc3lzdGVtcworICAjIGFyZSBub3QgdGhlIHNhbWUsIHdlIHNldCByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgdG9vbHMuCisKKyAgdG9vbHM9IkFSIEFSX0ZPUl9UQVJHRVQgQVMgQVNfRk9SX1RBUkdFVCBCSVNPTiBDQ19GT1JfQlVJTEQiCisgIHRvb2xzPSIke3Rvb2xzfSBDQ19GT1JfVEFSR0VUIENYWF9GT1JfVEFSR0VUIgorICB0b29scz0iJHt0b29sc30gRExMVE9PTCBETExUT09MX0ZPUl9UQVJHRVQgR0NDX0ZPUl9UQVJHRVQgSE9TVF9QUkVGSVgiCisgIHRvb2xzPSIke3Rvb2xzfSBIT1NUX1BSRUZJWF8xIExEIExEX0ZPUl9UQVJHRVQgTEVYIE1BS0VJTkZPIE5NIgorICB0b29scz0iJHt0b29sc30gTk1fRk9SX1RBUkdFVCBSQU5MSUIgUkFOTElCX0ZPUl9UQVJHRVQiCisgIHRvb2xzPSIke3Rvb2xzfSBXSU5EUkVTIFdJTkRSRVNfRk9SX1RBUkdFVCBZQUNDIgorCisgIGZvciB2YXIgaW4gJHt0b29sc307IGRvCisgICAgaWYgWyAteiAiYGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAiIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCisgICAgICBzZWQgLW4gLWUgJzpsb29wCisvXFwkLyBOCitzL1xcXG4vL2cKK3QgbG9vcAorL14nIiR7dmFyfSInWyAJXSo9LyBzLyciJHt2YXJ9IidbIAldKj1bIAldKlwoLipcKS9cMS9wJyBcCisJPCBNYWtlZmlsZSA+IE1ha2VmaWxlLnYKKyAgICAgIHQ9YHRhaWwgLTEgTWFrZWZpbGUudmAKKyAgICAgIGlmIFsgLW4gIiR7dH0iIF07IHRoZW4KKwlldmFsICIke3Zhcn09JyR7dH0nIgorICAgICAgZmkKKyAgICAgIHJtIC1mIE1ha2VmaWxlLnYKKyAgICBmaQorICBkb25lCisKKyAgQVI9JHtBUi0ke2hvc3RfYWxpYXN9LWFyfQorICBBUl9GT1JfVEFSR0VUPSR7QVJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYXJ9CisgIEFTPSR7QVMtJHtob3N0X2FsaWFzfS1hc30KKyAgQVNfRk9SX1RBUkdFVD0ke0FTX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWFzfQorICBCSVNPTj0ke0JJU09OLWJpc29ufQorICBDQz0ke0NDLSR7aG9zdF9hbGlhc30tZ2NjfQorICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9CisgIENYWD0ke0NYWC0ke2hvc3RfYWxpYXN9LWMrK30KKyAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KKyAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KKyAgQ0NfRk9SX1RBUkdFVD0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY30KKyAgQ1hYX0ZPUl9UQVJHRVQ9JHtDWFhfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYysrfQorICBETExUT09MPSR7RExMVE9PTC0ke2hvc3RfYWxpYXN9LWRsbHRvb2x9CisgIERMTFRPT0xfRk9SX1RBUkdFVD0ke0RMTFRPT0xfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZGxsdG9vbH0KKyAgR0NDX0ZPUl9UQVJHRVQ9JHtHQ0NfRk9SX1RBUkdFVC0ke0NDX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWdjY319CisgIEhPU1RfUFJFRklYPSR7YnVpbGRfYWxpYXN9LQorICBIT1NUX1BSRUZJWF8xPSR7YnVpbGRfYWxpYXN9LQorICBMRD0ke0xELSR7aG9zdF9hbGlhc30tbGR9CisgIExEX0ZPUl9UQVJHRVQ9JHtMRF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1sZH0KKyAgTUFLRUlORk89JHtNQUtFSU5GTy1tYWtlaW5mb30KKyAgTk09JHtOTS0ke2hvc3RfYWxpYXN9LW5tfQorICBOTV9GT1JfVEFSR0VUPSR7Tk1fRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tbm19CisgIFJBTkxJQj0ke1JBTkxJQi0ke2hvc3RfYWxpYXN9LXJhbmxpYn0KKyAgUkFOTElCX0ZPUl9UQVJHRVQ9JHtSQU5MSUJfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tcmFubGlifQorICBXSU5EUkVTPSR7V0lORFJFUy0ke2hvc3RfYWxpYXN9LXdpbmRyZXN9CisgIFdJTkRSRVNfRk9SX1RBUkdFVD0ke1dJTkRSRVNfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30td2luZHJlc30KKworICBpZiBbIC16ICIke1lBQ0N9IiBdOyB0aGVuCisgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KKyAgICAgIGlmIHRlc3QgLWYgJGRpci9iaXNvbjsgdGhlbgorCVlBQ0M9ImJpc29uIC15IgorCWJyZWFrCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtZiAkZGlyL2J5YWNjOyB0aGVuCisJWUFDQz1ieWFjYworCWJyZWFrCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtZiAkZGlyL3lhY2M7IHRoZW4KKwlZQUNDPXlhY2MKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgaWYgWyAteiAiJHtZQUNDfSIgXTsgdGhlbgorICAgICAgWUFDQz0iYmlzb24gLXkiCisgICAgZmkKKyAgZmkKKworICBpZiBbIC16ICIke0xFWH0iIF07IHRoZW4KKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisgICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgICAgaWYgdGVzdCAtZiAkZGlyL2ZsZXg7IHRoZW4KKwlMRVg9ZmxleAorCWJyZWFrCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtZiAkZGlyL2xleDsgdGhlbgorCUxFWD1sZXgKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgTEVYPSR7TEVYLWZsZXh9CisgIGZpCisKKyAgIyBFeHBvcnQgdmFyaWFibGVzIHdoaWNoIGF1dG9jb25mIG1pZ2h0IHRyeSB0byBzZXQuCisgIGV4cG9ydCBBUworICBleHBvcnQgQVIKKyAgZXhwb3J0IENDX0ZPUl9CVUlMRAorICBleHBvcnQgRExMVE9PTAorICBleHBvcnQgTEQKKyAgZXhwb3J0IE5NCisgIGV4cG9ydCBSQU5MSUIKKyAgZXhwb3J0IFdJTkRSRVMKK2Vsc2UKKyAgIyBJZiBDQyBpcyBzdGlsbCBub3Qgc2V0LCB0cnkgdG8gZ2V0IGdjYy4KKyAgaWYgWyAteiAiJHtDQ30iIF07IHRoZW4KKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisgICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgorCUNDPSJnY2MiCisJZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCisJaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisJICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9CisJICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQorCWVsc2UKKwkgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KKwkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9CisJZmkKKwlybSAtZiBjb25mdGVzdCoKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgQ0M9JHtDQy1jY30KKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiR7Q0ZMQUdTfSI7IHRoZW4KKyAgICAgICMgSGVyZSBDQyBpcyBzZXQgYnV0IENGTEFHUyBpcyBub3QuICBVc2UgYSBxdWljayBoYWNrIHRvIHVzZSAtTzIgaWYgQ0MKKyAgICAgICMgaXMgc2V0IHRvIGEgdmVyc2lvbiBvZiBnY2MuCisgICAgICBjYXNlICIke0NDfSIgaW4KKyAgICAgICpnY2MpCisJZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCisJaWYgdGVzdCAteiAiYCR7Q0N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisJICBDRkxBR1M9JHtDRkxBR1MtIi1nIC1PMiJ9CisJICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQorCWVsc2UKKwkgIENGTEFHUz0ke0NGTEFHUy0iLU8yIn0KKwkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1PMiJ9CisJZmkKKwlybSAtZiBjb25mdGVzdCoKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCisKKyAgQ1hYPSR7Q1hYLSJjKysifQorICBDRkxBR1M9JHtDRkxBR1MtIi1nIn0KKyAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLWcgLU8yIn0KK2ZpCisKK2V4cG9ydCBDQworZXhwb3J0IENYWAorZXhwb3J0IENGTEFHUworZXhwb3J0IENYWEZMQUdTCisKKworZm9yIHN1YmRpciBpbiAuICR7c3ViZGlyc30gOyBkbworCisgICAgIyAke3N1YmRpcn0gaXMgcmVsYXRpdmUgcGF0aCBmcm9tIC4gdG8gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjdXJyZW50bHkKKyAgICAjIGNvbmZpZ3VyaW5nLgorICAgICMgJHtpbnZzdWJkaXJ9IGlzIGludmVyc2Ugb2YgJHtzdWJkaXIpLCAqd2l0aCogdHJhaWxpbmcgLywgaWYgbmVlZGVkLgorICAgIGludnN1YmRpcj1gZWNobyAke3N1YmRpcn0vIHwgc2VkIC1lICdzfFwuL3x8ZycgLWUgJ3N8W14vXSovfC4uL3xnJ2AKKworICAgICMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKKyAgICBjYXNlICIke3NyY2Rpcn0iIGluCisgICAgICAgICIuIikgICMgbm8gLXNyY2RpciBvcHRpb24uICBXZSdyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICAgICAgICAgICAgICBtYWtlc3JjZGlyPS4gOzsKKyAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9YGVjaG8gJHtzcmNkaXJ9LyR7c3ViZGlyfSB8IHNlZCAtZSAnc3wvXC4kfHwnYAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCisgICAgICAgICAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgorICAgICAgICAgICAgICAgIC4pIG1ha2VzcmNkaXI9JHtzcmNkaXJ9IDs7CisgICAgICAgICAgICAgICAgKikgbWFrZXNyY2Rpcj0ke2ludnN1YmRpcn0ke3NyY2Rpcn0vJHtzdWJkaXJ9IDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgWyAiJHtzdWJkaXJ9LyIgIT0gIi4vIiBdIDsgdGhlbgorICAgICAgICBNYWtlZmlsZT0ke3N1YmRpcn0vTWFrZWZpbGUKKyAgICBmaQorCisgICAgaWYgWyAhIC1kICR7c3ViZGlyfSBdIDsgdGhlbgorICAgICAgICBpZiBta2RpciAke3N1YmRpcn0gOyB0aGVuCisgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke3N1YmRpcn0iIDE+JjIKKyAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgY2FzZSAiJHtyZW1vdmluZ30iIGluCisgICAgIiIpCisgICAgICAgIGNhc2UgIiR7c3ViZGlyfSIgaW4KKyAgICAgICAgLikgOzsKKyAgICAgICAgKikgZXZhbCBlY2hvIEJ1aWxkaW5nIGluICR7c3ViZGlyfSAke3JlZGlyZWN0fSA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgIyBGSVhNRSBTaG91bGQgdGhpcyBiZSBkb25lIHJlY3Vyc2l2ZWx5ID8/PyAoVXNlZnVsIGZvciBlLmcuIGdkYnRlc3QpCisgICAgICAgICMgU2V0IHVwIHRoZSBsaXN0IG9mIGxpbmtzIHRvIGJlIG1hZGUuCisgICAgICAgICMgJHtsaW5rc30gaXMgdGhlIGxpc3Qgb2YgbGluayBuYW1lcywgYW5kICR7ZmlsZXN9IGlzIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpbmsgdG8uCisKKyAgICAgICAgIyBNYWtlIHRoZSBsaW5rcy4KKyAgICAgICAgY29uZmlnbGlua3M9IiR7bGlua3N9IgorICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuc3RhdHVzIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrCisgICAgICAgIGZpCisgICAgICAgIHdoaWxlIFsgLW4gIiR7ZmlsZXN9IiBdIDsgZG8KKyAgICAgICAgICAgICAgICAjIHNldCBmaWxlIHRvIGNhciBvZiBmaWxlcywgZmlsZXMgdG8gY2RyIG9mIGZpbGVzCisgICAgICAgICAgICAgICAgc2V0ICR7ZmlsZXN9OyBmaWxlPSQxOyBzaGlmdDsgZmlsZXM9JCoKKyAgICAgICAgICAgICAgICBzZXQgJHtsaW5rc307IGxpbms9JDE7IHNoaWZ0OyBsaW5rcz0kKgorCisgICAgICAgICAgICAgICAgaWYgWyAhIC1yICR7c3JjZGlyfS8ke2ZpbGV9IF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtmaWxlfSBdIDsgdGhlbgorCQkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY2Fubm90IGNyZWF0ZSBhIGxpbmsgXCIke2xpbmt9XCIsIiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICJzaW5jZSB0aGUgZmlsZSBcIiR7c3JjZGlyfS8ke2ZpbGV9XCIgZG9lcyBub3QgZXhpc3QuIiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKKwkJICBlbHNlCisJCQlzcmNmaWxlPSR7ZmlsZX0KKwkJICBmaQorCQllbHNlCisJCQlzcmNmaWxlPSR7c3JjZGlyfS8ke2ZpbGV9CisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICR7cmVtb3ZlfSAtZiAke2xpbmt9CisJCSMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsKKwkJaWYgJHtzeW1ib2xpY19saW5rfSAke3NyY2ZpbGV9ICR7bGlua30gPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCQkJdHJ1ZQorCQllbHNlCisJCQkjIFdlIG5lZWQgdG8gcmUtcmVtb3ZlIHRoZSBmaWxlIGJlY2F1c2UgTHlueCBsZWF2ZXMgYSAKKwkJCSMgdmVyeSBzdHJhbmdlIGRpcmVjdG9yeSB0aGVyZSB3aGVuIGl0IGZhaWxzIGFuIE5GUyBzeW1saW5rLgorCQkJJHtyZW1vdmV9IC1yIC1mICR7bGlua30KKwkJCSR7aGFyZF9saW5rfSAke3NyY2ZpbGV9ICR7bGlua30KKwkJZmkKKyAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtsaW5rfSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IHVuYWJsZSB0byBsaW5rIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIgMT4mMgorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgIGVjaG8gIkxpbmtlZCBcIiR7bGlua31cIiB0byBcIiR7c3JjZmlsZX1cIi4iCisgICAgICAgIGRvbmUKKworICAgICAgICAjIENyZWF0ZSBhIC5nZGJpbml0IGZpbGUgd2hpY2ggcnVucyB0aGUgb25lIGluIHNyY2RpcgorICAgICAgICAjIGFuZCB0ZWxscyBHREIgdG8gbG9vayB0aGVyZSBmb3Igc291cmNlIGZpbGVzLgorCisgICAgICAgIGlmIFsgLXIgJHtzcmNkaXJ9LyR7c3ViZGlyfS8uZ2RiaW5pdCBdIDsgdGhlbgorICAgICAgICAgICAgICAgIGNhc2UgJHtzcmNkaXJ9IGluCisgICAgICAgICAgICAgICAgLikgOzsKKyAgICAgICAgICAgICAgICAqKSBjYXQgPiAke3N1YmRpcn0vLmdkYmluaXQgPDxFT0YKKyMgJHtOT19FRElUfQorZGlyICR7bWFrZXNyY2Rpcn0KK2RpciAuCitzb3VyY2UgJHttYWtlc3JjZGlyfS8uZ2RiaW5pdAorRU9GCisgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKworICAgICAgICAjIEluc3RhbGwgYSBtYWtlZmlsZSwgYW5kIG1ha2UgaXQgc2V0IFZQQVRICisgICAgICAgICMgaWYgbmVjZXNzYXJ5IHNvIHRoYXQgdGhlIHNvdXJjZXMgYXJlIGZvdW5kLgorICAgICAgICAjIEFsc28gY2hhbmdlIGl0cyB2YWx1ZSBvZiBzcmNkaXIuCisgICAgICAgICMgTk9URTogTWFrZWZpbGUgZ2VuZXJhdGlvbiBjb25zdGl0dXRlcyB0aGUgbWFqb3JpdHkgb2YgdGhlIHRpbWUgaW4gY29uZmlndXJlLiAgSGVuY2UsIHRoaXMgc2VjdGlvbiBoYXMKKyAgICAgICAgIyBiZWVuIHNvbWV3aGF0IG9wdGltaXplZCBhbmQgaXMgcGVyaGFwcyBhIGJpdCB0d2lzdHkuCisKKyAgICAgICAgIyBjb2RlIGlzIG9yZGVyIHNvIGFzIHRvIHRyeSB0byBzZWQgdGhlIHNtYWxsZXN0IGlucHV0IGZpbGVzIHdlIGtub3cuCisgICAgICAgICMgc28gZG8gdGhlc2Ugc2VwYXJhdGVseSBiZWNhdXNlIEkgZG9uJ3QgdHJ1c3QgdGhlIG9yZGVyIG9mIHNlZCAtZSBleHByZXNzaW9ucy4KKworICAgICAgICAjIHRoZSBmaXZlIG1ha2VmaWxlIGZyYWdtZW50cyBNVVNUIGVuZCB1cCBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlIGluIHRoaXMgb3JkZXI6IAorICAgICAgICAjIHBhY2thZ2UgbWFjcm9zLCB0YXJnZXQsIGhvc3QsIHNpdGUsIGFuZCBwYWNrYWdlIHJ1bGVzLgorCisgICAgICAgIGlmIFsgLWYgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSBdIDsgdGhlbgorCisgICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIHRoZSBtYWtlZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gIk1ha2VmaWxlLmluIiAob3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQpIGludG8gTWFrZWZpbGUudGVtLgorICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9LyR7TWFrZWZpbGV9LnRlbQorICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiBpbgorICAgICAgICAgICAgICAiIikgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7CisgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30KKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ID4gJHtNYWtlZmlsZX0udGVtCisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBFeHBlY3RlZCBwYWNrYWdlIG1ha2VmaWxlIHJ1bGVzIGZyYWdtZW50IFwiJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9XCIgMT4mMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyBpcyBtaXNzaW5nIGluICR7UFdEPWBwd2RgfS4gMT4mMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke01ha2VmaWxlX2lufSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfS50ZW0KKworICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSBmb3IgdGhpcyBzaXRlLgorICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KKyAgICAgICAgICAgICAgY2FzZSAiJHtzaXRlfSIgaW4KKyAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKKyAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9L2NvbmZpZy9tcy0ke3NpdGV9CisKKyAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJHtNYWtlZmlsZX0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlX21ha2VmaWxlX2ZyYWc9CisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9CisKKyAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIGhvc3QuCisgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisgICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCisgICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7CisgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30KKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtob3N0X21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIGhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke3N1YmRpcikvTWFrZWZpbGUudGVtCisKKyAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHRhcmdldC4KKyAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9CisgICAgICAgICAgICBjYXNlICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgaW4KKyAgICAgICAgICAgICAgIiIpIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0gOzsKKyAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3RhcmdldF9tYWtlZmlsZV9mcmFnfQorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkIC1lICIvXiMjIyMvICByICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtNYWtlZmlsZX0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudGVtICR7TWFrZWZpbGV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0KKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KKworICAgICAgICAgICAgIyBFbWl0IHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGlzIHBhY2thZ2UncyBtYWNyb3MuCisgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisgICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iIGluCisgICAgICAgICAgICAgICIiKSBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtIDs7CisgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1mICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8ke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30KKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiAke01ha2VmaWxlfSA+ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdiAke01ha2VmaWxlfSAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICMgcmVhbCBjb3B5IG5vdyBpbiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisKKyAgICAgICAgICAgICMgcHJlcGVuZCB3YXJuaW5nIGFib3V0IGVkaXR0aW5nLCBhbmQgYSBidW5jaCBvZiB2YXJpYWJsZXMuCisgICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQorICAgICAgICAgICAgY2F0ID4gJHtNYWtlZmlsZX0gPDxFT0YKKyMgJHtOT19FRElUfQorVlBBVEggPSAke21ha2VzcmNkaXJ9CitsaW5rcyA9ICR7Y29uZmlnbGlua3N9Citob3N0X2FsaWFzID0gJHtob3N0X2FsaWFzfQoraG9zdF9jcHUgPSAke2hvc3RfY3B1fQoraG9zdF92ZW5kb3IgPSAke2hvc3RfdmVuZG9yfQoraG9zdF9vcyA9ICR7aG9zdF9vc30KK2hvc3RfY2Fub25pY2FsID0gJHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0tJHtob3N0X29zfQordGFyZ2V0X2FsaWFzID0gJHt0YXJnZXRfYWxpYXN9Cit0YXJnZXRfY3B1ID0gJHt0YXJnZXRfY3B1fQordGFyZ2V0X3ZlbmRvciA9ICR7dGFyZ2V0X3ZlbmRvcn0KK3RhcmdldF9vcyA9ICR7dGFyZ2V0X29zfQordGFyZ2V0X2Nhbm9uaWNhbCA9ICR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KK0VPRgorCSAgICBjYXNlICIke2J1aWxkfSIgaW4KKwkgICAgICAiIikgOzsKKwkgICAgICAqKSAgY2F0ID4+ICR7TWFrZWZpbGV9IDw8IEVPRgorYnVpbGRfYWxpYXMgPSAke2J1aWxkX2FsaWFzfQorYnVpbGRfY3B1ID0gJHtidWlsZF9jcHV9CitidWlsZF92ZW5kb3IgPSAke2J1aWxkX3ZlbmRvcn0KK2J1aWxkX29zID0gJHtidWlsZF9vc30KK2J1aWxkX2Nhbm9uaWNhbCA9ICR7YnVpbGRfY3B1fS0ke2J1aWxkX3ZlbmRvcn0tJHtidWlsZF9vc30KK0VPRgorCSAgICBlc2FjCisKKyAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KKyAgICAgICAgICAgICAgIiIpIDs7CisgICAgICAgICAgICAgIC8qKSBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7CisgICAgICAgICAgICAgICopICBlY2hvIHBhY2thZ2VfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7CisgICAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgorICAgICAgICAgICAgICAiIikgOzsKKyAgICAgICAgICAgICAgLyopIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7CisgICAgICAgICAgICAgICopICBlY2hvIHRhcmdldF9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OworICAgICAgICAgICAgZXNhYworCisgICAgICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCisgICAgICAgICAgICAgICIiKSA7OworICAgICAgICAgICAgICAvKikgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OworICAgICAgICAgICAgICAqKSAgZWNobyBob3N0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke2hvc3RfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfSA7OworICAgICAgICAgICAgZXNhYworCisgICAgICAgICAgICBpZiBbICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iICE9ICIiIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBzaXRlX21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3NpdGVfbWFrZWZpbGVfZnJhZ30gPj4ke01ha2VmaWxlfQorICAgICAgICAgICAgZmkgCisKKwkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBidWlsZCBzaGFyZWQgbGlicy4KKwkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfc2hhcmVkfSI7IHRoZW4KKwkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+ICR7TWFrZWZpbGV9CisJICAgIGVsc2UKKwkgICAgICAgIGVjaG8gZW5hYmxlX3NoYXJlZCA9ICR7ZW5hYmxlX3NoYXJlZH0gPj4gJHtNYWtlZmlsZX0KKwkgICAgZmkKKwkgICAgIyByZWNvcmQgaWYgd2Ugd2FudCB0byBydW10aW1lIGxpYnJhcnkgc3R1ZmYgaW5zdGFsbGVkIGluIGxpYnN1YmRpci4KKwkgICAgaWYgdGVzdCAteiAiJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9IjsgdGhlbgorCSAgICAgICAgZWNobyBlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnMgPSBubyA+PiAke01ha2VmaWxlfQorCSAgICBlbHNlCisJICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9ICR7ZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzfSA+PiAke01ha2VmaWxlfQorCSAgICBmaQorCisJICAgICMgRW1pdCBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmlsZSBjb250YWluaW5nIGdjYydzCisJICAgICMgdmVyc2lvbiBudW1iZXIuCisJICAgIGVjaG8gZ2NjX3ZlcnNpb25fdHJpZ2dlciA9ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn0gPj4gJHtNYWtlZmlsZX0KKwkgICAgIyBBbmQgZW1pdCBhIG1hY3JvIGRlZmluaW5nIGdjYydzIHZlcnNpb24gbnVtYmVyLgorCSAgICBlY2hvIGdjY192ZXJzaW9uID0gJHtnY2NfdmVyc2lvbn0gPj4gJHtNYWtlZmlsZX0KKworICAgICAgICAgICAgIyByZXNldCBwcmVmaXgsIGV4ZWNfcHJlZml4LCBzcmNkaXIsIFNVQkRJUlMsIE5PTlNVQkRJUlMsCisgICAgICAgICAgICAjIHJlbW92ZSBhbnkgZm9ybSBmZWVkcy4KKyAgICAgICAgICAgIGlmIFsgLXogIiR7c3ViZGlyc30iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCisgICAgICAgICAgICAgICAgc2VkIC1lICJzOl5TVUJESVJTWyAJXSo9LiokOlNVQkRJUlMgPSAke2NvbmZpZ2RpcnN9OiIgXAorICAgICAgICAgICAgICAgICAgICAtZSAiczpeTk9OU1VCRElSU1sgCV0qPS4qJDpOT05TVUJESVJTID0gJHtub2NvbmZpZ2RpcnN9OiIgXAorICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRtMgorICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KKyAgICAgICAgICAgICAgICBtdiAke3N1YmRpcn0vTWFrZWZpbGUudG0yICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KKwkgICAgZmkKKwkgICAgc2VkICAgICAtZSAic3xecHJlZml4WyAJXSo9LiokfHByZWZpeCA9ICR7cHJlZml4fXwiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInN8XmV4ZWNfcHJlZml4WyAJXSo9LiokfGV4ZWNfcHJlZml4ID0gJHtleGVjX3ByZWZpeH18IiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzfF5iaW5kaXJbIAldKj0uKiR8YmluZGlyID0gJHtiaW5kaXJ9fCIgXAorICAgICAgICAgICAgICAgICAgICAtZSAic3xec2JpbmRpclsgCV0qPS4qJHxzYmluZGlyID0gJHtzYmluZGlyfXwiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxpYmV4ZWNkaXJbIAldKj0uKiR8bGliZXhlY2RpciA9ICR7bGliZXhlY2Rpcn18IiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzfF5kYXRhZGlyWyAJXSo9LiokfGRhdGFkaXIgPSAke2RhdGFkaXJ9fCIgXAorICAgICAgICAgICAgICAgICAgICAtZSAic3xec3lzY29uZmRpclsgCV0qPS4qJHxzeXNjb25mZGlyID0gJHtzeXNjb25mZGlyfXwiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNoYXJlZHN0YXRlZGlyWyAJXSo9LiokfHNoYXJlZHN0YXRlZGlyID0gJHtzaGFyZWRzdGF0ZWRpcn18IiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzfF5sb2NhbHN0YXRlZGlyWyAJXSo9LiokfGxvY2Fsc3RhdGVkaXIgPSAke2xvY2Fsc3RhdGVkaXJ9fCIgXAorICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZGlyWyAJXSo9LiokfGxpYmRpciA9ICR7bGliZGlyfXwiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInN8XmluY2x1ZGVkaXJbIAldKj0uKiR8aW5jbHVkZWRpciA9ICR7aW5jbHVkZWRpcn18IiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzfF5vbGRpbmNsdWRlZGlyWyAJXSo9LiokfG9sZGluY2x1ZGVkaXIgPSAke29sZGluY2x1ZGVkaXJ9fCIgXAorICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5mb2RpclsgCV0qPS4qJHxpbmZvZGlyID0gJHtpbmZvZGlyfXwiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm1hbmRpclsgCV0qPS4qJHxtYW5kaXIgPSAke21hbmRpcn18IiBcCisJCSAgICAtZSAiL15DQ1sgCV0qPS97CisJCQk6bG9vcDEKKwkJCS9cXFxcJC8gTgorCQkJcy9cXFxcXFxuLy9nCisJCQl0IGxvb3AxCisJCQlzJV5DQ1sgCV0qPS4qJCVDQyA9ICR7Q0N9JQorCQkJfSIgXAorCQkgICAgLWUgIi9eQ1hYWyAJXSo9L3sKKwkJCTpsb29wMgorCQkJL1xcXFwkLyBOCisJCQlzL1xcXFxcXG4vL2cKKwkJCXQgbG9vcDIKKwkJCXMlXkNYWFsgCV0qPS4qJCVDWFggPSAke0NYWH0lCisJCQl9IiBcCisJCSAgICAtZSAiL15DRkxBR1NbIAldKj0veworCQkJOmxvb3AzCisJCQkvXFxcXCQvIE4KKwkJCXMvXFxcXFxcbi8vZworCQkJdCBsb29wMworCQkJcyVeQ0ZMQUdTWyAJXSo9LiokJUNGTEFHUyA9ICR7Q0ZMQUdTfSUKKwkJCX0iIFwKKwkJICAgIC1lICIvXkNYWEZMQUdTWyAJXSo9L3sKKwkJCTpsb29wNAorCQkJL1xcXFwkLyBOCisJCQlzL1xcXFxcXG4vL2cKKwkJCXQgbG9vcDQKKwkJCXMlXkNYWEZMQUdTWyAJXSo9LiokJUNYWEZMQUdTID0gJHtDWFhGTEFHU30lCisJCQl9IiBcCisJCSAgICAtZSAic3xeU0hFTExbCSBdKj0uKiR8U0hFTEwgPSAke2NvbmZpZ19zaGVsbH18IiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzfF5zcmNkaXJbIAldKj0uKiR8c3JjZGlyID0gJHttYWtlc3JjZGlyfXwiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInMvDC8vIiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3ByZWZpeFsgCV0qPS4qJDpwcm9ncmFtX3ByZWZpeCA9ICR7cHJvZ3JhbV9wcmVmaXh9OiIgXAorICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV9zdWZmaXhbIAldKj0uKiQ6cHJvZ3JhbV9zdWZmaXggPSAke3Byb2dyYW1fc3VmZml4fToiIFwKKyAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fdHJhbnNmb3JtX25hbWVbIAldKj0uKiQ6cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX06IiBcCisgICAgICAgICAgICAgICAgICAgIC1lICJzfF50b29sZGlyWyAJXSo9LiokfHRvb2xkaXIgPSAke3Rvb2xkaXJ9fCIgXAorCQkgICAgLWUgInM6XkRFRkFVTFRfWUFDQ1sJIF0qPS4qJDpERUZBVUxUX1lBQ0MgPSAke0RFRkFVTFRfWUFDQ306IiBcCisJCSAgICAtZSAiczpeREVGQVVMVF9MRVhbCSBdKj0uKiQ6REVGQVVMVF9MRVggPSAke0RFRkFVTFRfTEVYfToiIFwKKwkJICAgIC1lICJzOl5ERUZBVUxUX000WyAgXSo9LiokOkRFRkFVTFRfTTQgPSAke0RFRkFVTFRfTTR9OiIgXAorICAgICAgICAgICAgICAgICAgICAke3N1YmRpcn0vTWFrZWZpbGUudGVtID4+ICR7TWFrZWZpbGV9CisgIAorCisJICAgICMgSWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLCBwcmVzZXQgdGhlIHZhbHVlcyBvZiBtYW55IG1vcmUKKwkgICAgIyB0b29scy4KKwkgICAgaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCisJCWZvciB2YXIgaW4gJHt0b29sc307IGRvCisJCSAgICB2YWw9YGV2YWwgJ2VjaG8gJCciJHt2YXJ9ImAKKwkJICAgIHNlZCAtZSAiL14ke3Zhcn1bIAldKj0veworCQkJICAgOmxvb3AxCisJCQkgICAvXFxcXCQvIE4KKwkJCSAgIC9cXFxcJC8gYiBsb29wMQorCQkJICAgcy9cXFxcXFxuLy9nCisJCQkgICBzJV4ke3Zhcn1bIAldKj0uKiQlJHt2YXJ9ID0gJHt2YWx9JQorCQkJICAgfSIgJHtNYWtlZmlsZX0gPiAke01ha2VmaWxlfS50ZW0KKwkJICAgIG12IC1mICR7TWFrZWZpbGV9LnRlbSAke01ha2VmaWxlfQorCQlkb25lCisJICAgIGZpCisKKyAgICAgICAgICAgICMgZmluYWwgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KKworICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gIk5vIE1ha2VmaWxlLmluIGZvdW5kIGluICR7c3JjZGlyfS8ke3N1YmRpcn0sIHVuYWJsZSB0byBjb25maWd1cmUiIDE+JjIKKyAgICAgICAgZmkKKworICAgICAgICBybSAtZiAke3N1YmRpcn0vTWFrZWZpbGUudGVtCisKKyAgICAgICAgY2FzZSAiJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBpbgorICAgICAgICAiIikgdXNpbmc9IDs7CisgICAgICAgICopIHVzaW5nPSJhbmQgXCIke2hvc3RfbWFrZWZpbGVfZnJhZ31cIiIgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgorICAgICAgICAiIikgOzsKKyAgICAgICAgKikgdXNpbmc9IiR7dXNpbmd9IGFuZCBcIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9XCIiIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICIke3NpdGVfbWFrZWZpbGVfZnJhZ30iIGluCisgICAgICAgICIiKSA7OworICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHtzaXRlX21ha2VmaWxlX2ZyYWd9XCIiIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBuZXd1c2luZz1gZWNobyAiJHt1c2luZ30iIHwgc2VkICdzL2FuZC91c2luZy8nYAorICAgICAgICB1c2luZz0ke25ld3VzaW5nfQorICAgICAgICBlY2hvICJDcmVhdGVkIFwiJHtNYWtlZmlsZX1cIiBpbiIgJHtQV0Q9YHB3ZGB9ICR7dXNpbmd9CisKKyAgICAgICAgLiAke3RtcGZpbGV9LnBvcworCisgICAgICAgICMgZGVzY3JpYmUgdGhlIGNob3NlbiBjb25maWd1cmF0aW9uIGluIGNvbmZpZy5zdGF0dXMuCisgICAgICAgICMgTWFrZSB0aGF0IGZpbGUgYSBzaGVsbHNjcmlwdCB3aGljaCB3aWxsIHJlZXN0YWJsaXNoCisgICAgICAgICMgdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gIFVzZWQgaW4gTWFrZWZpbGVzIHRvIHJlYnVpbGQKKyAgICAgICAgIyBNYWtlZmlsZXMuCisKKyAgICAgICAgY2FzZSAiJHtub3JlY3Vyc2lvbn0iIGluCisgICAgICAgICIiKSBhcmd1bWVudHM9IiR7YXJndW1lbnRzfSAtLW5vcmVjdXJzaW9uIiA7OworICAgICAgICAqKSA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgaWYgWyAke3N1YmRpcn0gPSAuIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKKyMgJHtOT19FRElUfQorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgorJHtwcm9nbmFtZX0iICR7YXJndW1lbnRzfSAgIgorIyAke3VzaW5nfSIgPiAke3N1YmRpcn0vY29uZmlnLm5ldworICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICIjIS9iaW4vc2gKKyMgJHtOT19FRElUfQorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgorY2QgJHtpbnZzdWJkaXJ9Ciske3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCisjICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3CisgICAgICAgIGZpCisgICAgICAgIGNobW9kIGEreCAke3N1YmRpcn0vY29uZmlnLm5ldworICAgICAgICBpZiBbIC1yICR7c3ViZGlyfS9jb25maWcuYmFjayBdIDsgdGhlbgorICAgICAgICAgICAgICAgIG12IC1mICR7c3ViZGlyfS9jb25maWcuYmFjayAke3N1YmRpcn0vY29uZmlnLnN0YXR1cworICAgICAgICBmaQorCSR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gJHtzdWJkaXJ9L2NvbmZpZy5uZXcgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMKKyAgICAgICAgOzsKKworICAgICopICBybSAtZiAke01ha2VmaWxlfSAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke2xpbmtzfSA7OworICAgIGVzYWMKK2RvbmUKKworIyBJZiB0aGVyZSBhcmUgc3ViZGlyZWN0b3JpZXMsIHRoZW4gcmVjdXIuCitpZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdIDsgdGhlbiAKKyAgICAgICAgZm9yIGNvbmZpZ2RpciBpbiAke2NvbmZpZ2RpcnN9ICR7ZXh0cmFjb25maWdkaXJzfSA7IGRvCisKKwkJIyBJZiBjb25maWdkaXIgY29udGFpbnMgJywnIGl0IGlzCisJCSMgc3JjZGlyLGJ1aWxkZGlyLHRhcmdldF9hbGlhcworCQkjIFRoZXNlIGNvbWUgZnJvbSBleHRyYWNvbmZpZ2RpcnMuCisJCWNhc2UgJHtjb25maWdkaXJ9IGluCisJCSosKikKKwkJICAgIGV2YWwgYGVjaG8gJHtjb25maWdkaXJ9IHwgc2VkIC1lICdzL1woW14sXSpcKSxcKFteLF0qXCksXCguKlwpL2NmZ19kaXI9XDEgYmxkX2Rpcj1cMiB0Z3RfYWxpYXM9XDMvJ2AKKwkJICAgIDs7CisJCSopCisJCSAgICBjZmdfZGlyPSR7Y29uZmlnZGlyfQorCQkgICAgYmxkX2Rpcj0ke2NvbmZpZ2Rpcn0KKwkJICAgIHRndF9hbGlhcz0ke3RhcmdldF9hbGlhc30KKwkJICAgIDs7CisJCWVzYWMKKworICAgICAgICAgICAgICAgIGlmIFsgLWQgJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwgZWNobyBDb25maWd1cmluZyAke2NvbmZpZ2Rpcn0uLi4gJHtyZWRpcmVjdH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICIuIikgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZCAuLyR7YmxkX2Rpcn0gXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBta2RpciAuLyR7YmxkX2Rpcn0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IGNvdWxkIG5vdCBtYWtlICR7UFdEPWBwd2RgfS8ke2JsZF9kaXJ9IiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICAgICAgZXNhYworCisgICAgICAgICAgICAgICAgICAgICAgICBQT1BESVI9JHtQV0Q9YHB3ZGB9CisgICAgICAgICAgICAgICAgICAgICAgICBjZCAke2JsZF9kaXJ9IAorCisjIyMgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggc3JjZGlyCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NyY2Rpcn0iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAiLiIpIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICAgICA/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9JHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9LyR7Y2ZnX2Rpcn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyb3B0aW9uPSItLXNyY2Rpcj0ke25ld3NyY2Rpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisKKwkJCSMgSGFuZGxlIC0tY2FjaGUtZmlsZT0uLi9YWFgKKwkJCWNhc2UgIiR7Y2FjaGVfZmlsZX0iIGluCisJCQkiIikgIyBlbXB0eQorCQkJCTs7CisJCQkvKikgIyBhYnNvbHV0ZSBwYXRoCisJCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgorCQkJCTs7CisJCQk/OiopICMgYWJzb2x1dGUgcGF0aCBvbiB3aW4zMgorCQkJCWNhY2hlX2ZpbGVfb3B0aW9uPSItLWNhY2hlLWZpbGU9JHtjYWNoZV9maWxlfSIKKwkJCQk7OworCQkJKikgIyByZWxhdGl2ZSBwYXRoCisJCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0uLi8ke2NhY2hlX2ZpbGV9IgorCQkJCTs7CisJCQllc2FjCisKKyMjIyBjaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUsIG90aGVyd2lzZSBmaXggcG9zc2libHkgcmVsYXRpdmUgcHJvZ25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNwcm9nPSR7bmV3c3JjZGlyfS9jb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlLmluIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKikgICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzoqKSAgICByZWNwcm9nPSR7cHJvZ25hbWV9IDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopICAgICAgcmVjcHJvZz0uLi8ke3Byb2duYW1lfSA7OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2FjCisJCQllbHNlCisJCQkJZXZhbCBlY2hvIE5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gJHtjZmdfZGlyfSAke3JlZGlyZWN0fQorCQkJCXJlY3Byb2c9CisgICAgICAgICAgICAgICAgICAgICAgICBmaQorCisjIyMgVGhlIHJlY3Vyc2lvbiBsaW5lIGlzIGhlcmUuCisJCQlpZiBbICEgLXogIiR7cmVjcHJvZ30iIF0gOyB0aGVuCisJICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXZhbCAke2NvbmZpZ19zaGVsbH0gJHtyZWNwcm9nfSAke3ZlcmJvc2V9ICR7YnVpbGRvcHR9IC0taG9zdD0ke2hvc3RfYWxpYXN9IC0tdGFyZ2V0PSR7dGd0X2FsaWFzfSBcCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKKyAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICR7c3JjZGlyb3B0aW9ufSAke2Rpcm9wdGlvbnN9ICR7cHJvZ3JhbV9wcmVmaXhvcHRpb259ICR7cHJvZ3JhbV9zdWZmaXhvcHRpb259ICR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gJHt3aXRob3B0aW9uc30gJHt3aXRob3V0b3B0aW9uc30gJHtlbmFibGVvcHRpb25zfSAke2Rpc2FibGVvcHRpb25zfSAke2Zsb2F0aW5nX3BvaW50b3B0aW9ufSAke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9IDsgdGhlbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkJZWNobyBDb25maWd1cmUgaW4gYHB3ZGAgZmFpbGVkLCBleGl0aW5nLiAxPiYyCisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIAlmaQorCQkJZmkKKworICAgICAgICAgICAgICAgICAgICAgICAgY2QgJHtQT1BESVJ9CisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorZmkKKworIyBQZXJmb3JtIHRoZSBzYW1lIGNsZWFudXAgYXMgdGhlIHRyYXAgaGFuZGxlciwgbWludXMgdGhlICJleGl0IDEiIG9mIGNvdXJzZSwKKyMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCitybSAtZiAke3RtcGZpbGV9LmNvbSAke3RtcGZpbGV9LnRndCAke3RtcGZpbGV9LmhzdCAke3RtcGZpbGV9LnBvcwordHJhcCAwCisKK2V4aXQgMAorCisjCisjIExvY2FsIFZhcmlhYmxlczoKKyMgZmlsbC1jb2x1bW46IDEzMQorIyBFbmQ6CisjCisKKyMgZW5kIG9mIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmJhdCBiL2NvbmZpZ3VyZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2YTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5iYXQKQEAgLTAsMCArMSwxNyBAQAorQGVjaG8gb2ZmDQorDQorY2hkaXIgbGliaWJlcnR5DQorY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxiZmQNCitjYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KK2NoZGlyIC4uXG9wY29kZXMNCitjYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KK2NoZGlyIC4uXGdwcm9mDQorY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxiaW51dGlscw0KK2NhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQorY2hkaXIgLi5cZ2FzDQorY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxsZA0KK2NhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQorY2hkaXIgLi4NCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlNWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDExODQgQEAKKyMhIC9iaW4vYmFzaAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgorIyMgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCisjIyBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCisjIyBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4gIAorCisjIyBCZSB3YXJuZWQsIHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY29uZmlndXJlLmluIGZpbGVzLiAgVGhlcmUgYXJlIHRob3NlCisjIyB1c2VkIGJ5IEF1dG9jb25mLCB3aGljaCBhcmUgbWFjcm9zIHdoaWNoIGFyZSBleHBhbmRlZCBpbnRvIGEgY29uZmlndXJlCisjIyBzY3JpcHQgYnkgYXV0b2NvbmYuICBUaGUgb3RoZXIgc29ydCwgb2Ygd2hpY2ggdGhpcyBpcyBvbmUsIGlzIGV4ZWN1dGVkCisjIyBieSBDeWdudXMgY29uZmlndXJlLiAgCisKKyMjIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHR3byBzeXN0ZW1zLCBjaGVjayBvdXQgdGhlIGRvY3VtZW50YXRpb24KKyMjIGZvciAnQXV0b2NvbmYnIChhdXRvY29uZi50ZXhpKSBhbmQgJ0NvbmZpZ3VyZScgKGNvbmZpZ3VyZS50ZXhpKS4gIAorCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMgVG8gYWRkIGEgbmV3IGRpcmVjdG9yeSB0byB0aGUgdHJlZSwgZmlyc3QgY2hvb3NlIHdoZXRoZXIgaXQgaXMgYSB0YXJnZXQKKyMjIyBvciBhIGhvc3QgZGVwZW5kZW50IHRvb2wuICBUaGVuIHB1dCBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0CisjIyMgKGxpYnJhcnkgb3IgdG9vbHMsIGhvc3Qgb3IgdGFyZ2V0KSwgZG9pbmcgYSBkZXBlbmRlbmN5IHNvcnQuICBGb3IKKyMjIyBleGFtcGxlLCBnZGIgcmVxdWlyZXMgdGhhdCBieWFjYyAob3IgYmlzb24pIGJlIGJ1aWx0IGZpcnN0LCBzbyBpdCBpcyBpbgorIyMjIHRoZSAke2hvc3RfdG9vbHN9IGxpc3QgYWZ0ZXIgYnlhY2MgYW5kIGJpc29uLiAgCisKKworIyB0aGVzZSBsaWJyYXJpZXMgYXJlIHVzZWQgYnkgdmFyaW91cyBwcm9ncmFtcyBidWlsdCBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQKKyMKK2hvc3RfbGlicz0iaW50bCBtbWFsbG9jIGxpYmliZXJ0eSBvcGNvZGVzIGJmZCByZWFkbGluZSBnYXNoIGRiIHRjbCB0ayB0Y2w4LjEgdGs4LjEgdGNsWCBpdGNsIHRpeCBsaWJndWkiCisKK2lmIFsgIiR7ZW5hYmxlX2dkYmd1aX0iID0gInllcyIgXSA7IHRoZW4KKwlob3N0X2xpYnM9IiR7aG9zdF9saWJzfSBsaWJndWkiCitmaQorCisjIHRoZXNlIHRvb2xzIGFyZSBidWlsdCBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQKKyMgTm90ZSwgdGhlIHBvd2VycGMtZWFiaSBidWlsZCBkZXBlbmRzIG9uIHNpbSBvY2N1cnJpbmcgYmVmb3JlIGdkYiBpbiBvcmRlciB0bworIyBrbm93IHRoYXQgd2UgYXJlIGJ1aWxkaW5nIHRoZSBzaW11bGF0b3IuCitob3N0X3Rvb2xzPSJ0ZXhpbmZvIGJ5YWNjIGZsZXggYmlzb24gYmludXRpbHMgbGQgZ2FzIGdjYyBzaW0gZ2RiIG1ha2UgcGF0Y2ggcHJtcyBzZW5kLXByIGdwcm9mIGdkYnRlc3QgdGdhcyBldGMgZXhwZWN0IGRlamFnbnUgYXNoIGJhc2ggYnppcDIgbTQgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBpc3BlbGwgZ3JlcCBkaWZmIHJjcyBjdnNzcmMgZmlsZXV0aWxzIHNoZWxsdXRpbHMgdGltZSB0ZXh0dXRpbHMgd2RpZmYgZmluZCBlbWFjcyBlbWFjczE5IHV1ZGVjb2RlIGhlbGxvIHRhciBnemlwIGluZGVudCByZWNvZGUgcmVsZWFzZSBzZWQgdXRpbHMgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBnYXdrIGZpbmR1dGlscyBzbmF2aWdhdG9yIGxpYnRvb2wgZ2V0dGV4dCB6aXAiCisKKyMgdGhlc2UgbGlicmFyaWVzIGFyZSBidWlsdCBmb3IgdGhlIHRhcmdldCBlbnZpcm9ubWVudCwgYW5kIGFyZSBidWlsdCBhZnRlcgorIyB0aGUgaG9zdCBsaWJyYXJpZXMgYW5kIHRoZSBob3N0IHRvb2xzICh3aGljaCBtYXkgYmUgYSBjcm9zcyBjb21waWxlcikKKyMKK3RhcmdldF9saWJzPSJ0YXJnZXQtbGliaWJlcnR5IFwKKwkJdGFyZ2V0LWxpYmdsb3NzIFwKKwkJdGFyZ2V0LW5ld2xpYiBcCisJCXRhcmdldC1saWJpbyBcCisJCXRhcmdldC1saWJyeCBcCisJCXRhcmdldC1saWJzdGRjKysgXAorCQl0YXJnZXQtbGliZysrIgorCisjIHRoZXNlIHRvb2xzIGFyZSBidWlsdCB1c2luZyB0aGUgdGFyZ2V0IGxpYnMsIGFuZCBhcmUgaW50ZW5kZWQgdG8gcnVuIG9ubHkKKyMgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudAorIworIyBub3RlOiBhbnkgcHJvZ3JhbSB0aGF0ICp1c2VzKiBsaWJyYXJpZXMgdGhhdCBhcmUgaW4gdGhlICJ0YXJnZXRfbGlicyIKKyMgbGlzdCBiZWxvbmdzIGluIHRoaXMgbGlzdC4gIHRob3NlIHByb2dyYW1zIGFyZSBhbHNvIHZlcnkgbGlrZWx5CisjIGNhbmRpZGF0ZXMgZm9yIHRoZSAibmF0aXZlX29ubHkiIGxpc3Qgd2hpY2ggZm9sbG93cworIwordGFyZ2V0X3Rvb2xzPSJ0YXJnZXQtZXhhbXBsZXMgdGFyZ2V0LWdyb2ZmIHRhcmdldC1ncGVyZiIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMgVGhlc2UgdHdvIGxpc3RzIGFyZSBvZiBkaXJlY3RvcmllcyB0aGF0IGFyZSB0byBiZSByZW1vdmVkIGZyb20gdGhlCisjIyAke2NvbmZpZ2RpcnN9IGxpc3QgZm9yIGVpdGhlciBjcm9zcy1jb21waWxhdGlvbnMgb3IgZm9yIG5hdGl2ZS0KKyMjIGNvbXBpbGF0aW9ucy4gIEZvciBleGFtcGxlLCBpdCBkb2Vzbid0IG1ha2UgdGhhdCBtdWNoIHNlbnNlIHRvCisjIyBjcm9zcy1jb21waWxlIEVtYWNzLCBub3IgaXMgaXQgdGVycmlibHkgdXNlZnVsIHRvIGNvbXBpbGUgdGFyZ2V0LWxpYmliZXJ0eSBpbgorIyMgYSBuYXRpdmUgZW52aXJvbm1lbnQuICAKKworIyBkaXJlY3RvcmllcyB0byBiZSBidWlsdCBpbiB0aGUgbmF0aXZlIGVudmlyb25tZW50IG9ubHkKKyMKKyMgVGhpcyBtdXN0IGJlIGEgc2luZ2xlIGxpbmUgYmVjYXVzZSBvZiB0aGUgd2F5IGl0IGlzIHNlYXJjaGVkIGJ5IGdyZXAgaW4KKyMgdGhlIGNvZGUgYmVsb3cuCituYXRpdmVfb25seT0iYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbCBjdnNzcmMgZW1hY3MgZW1hY3MxOSBmaWxldXRpbHMgZmluZCBnYXdrIGdldHRleHQgZ3JlcCBnemlwIGhlbGxvIGluZGVudCBpc3BlbGwgbTQgcmNzIHJlY29kZSBzZWQgc2hlbGx1dGlscyB0YXIgdGV4dHV0aWxzIGdhc2ggdXVkZWNvZGUgd2RpZmYgZ3Byb2YgdGFyZ2V0LWdyb2ZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgdGltZSBhc2ggYmFzaCBiemlwMiBwcm1zIHNuYXZpZ2F0b3IgZ251c2VydiB0YXJnZXQtZ3BlcmYiCisKKyMgZGlyZWN0b3JpZXMgdG8gYmUgYnVpbHQgaW4gYSBjcm9zcyBlbnZpcm9ubWVudCBvbmx5CisjCitjcm9zc19vbmx5PSJ0YXJnZXQtbGliZ2xvc3MgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtY3lnbW9uIHRhcmdldC1vcGNvZGVzIHRhcmdldC1saWJzdHViIgorCisjIyBBbGwgdG9vbHMgYmVsb25nIGluIG9uZSBvZiB0aGUgZm91ciBjYXRlZ29yaWVzLCBhbmQgYXJlIGFzc2lnbmVkIGFib3ZlCisjIyBXZSBhc3NpZ24gJHtjb25maWdkaXJzfSB0aGlzIHdheSB0byByZW1vdmUgYWxsIGVtYmVkZGVkIG5ld2xpbmVzLiAgVGhpcworIyMgaXMgaW1wb3J0YW50IGJlY2F1c2UgY29uZmlndXJlIHdpbGwgY2hva2UgaWYgdGhleSBldmVyIGdldCB0aHJvdWdoLgorIyMgJHtjb25maWdkaXJzfSBpcyBkaXJlY3RvcmllcyB3ZSBidWlsZCB1c2luZyB0aGUgaG9zdCB0b29scy4KKyMjICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IGlzIGRpcmVjdG9yaWVzIHdlIGJ1aWxkIHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCisjCitjb25maWdkaXJzPWBlY2hvICR7aG9zdF9saWJzfSAke2hvc3RfdG9vbHN9YAordGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gJHt0YXJnZXRfbGlic30gJHt0YXJnZXRfdG9vbHN9YAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzcmN0cmlnZ2VyPW1vdmUtaWYtY2hhbmdlCitzcmNuYW1lPSJnbnUgZGV2ZWxvcG1lbnQgcGFja2FnZSIKKworIyBUaGlzIGdldHMgc2V0IG5vbi1lbXB0eSBmb3Igc29tZSBuZXQgcmVsZWFzZXMgb2YgcGFja2FnZXMuCithcHBkaXJzPSIiCisKKyMgcGVyLWhvc3Q6CisKKyMgV29yayBpbiBkaXN0cmlidXRpb25zIHRoYXQgY29udGFpbiBubyBjb21waWxlciB0b29scywgbGlrZSBBdXRvY29uZi4KK2lmIFsgLWQgJHtzcmNkaXJ9L2NvbmZpZyBdOyB0aGVuCitjYXNlICIke2hvc3R9IiBpbgorICBtNjhrLWhwLWhwdXgqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocDMwMCIKKyAgICA7OworICBtNjhrLWFwb2xsby1zeXN2KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYXBvbGxvNjgiCisgICAgOzsKKyAgbTY4ay1hcG9sbG8tYnNkKikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYTY4YnNkIgorICAgIDs7CisgIG04OGstZGctZGd1eCopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRndXgiCisgICAgOzsKKyAgbTg4ay1oYXJyaXMtY3h1eCopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWN4dXgiCisgICAgOzsKKyAgbTg4ay1tb3Rvcm9sYS1zeXN2KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGVsdGE4OCIKKyAgICA7OworICBtaXBzKi1kZWMtdWx0cml4KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGVjc3RhdGlvbiIKKyAgICA7OworICBtaXBzKi1uZWMtc3lzdjQqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uZWN2NCIKKyAgICA7OworICBtaXBzKi1zZ2ktaXJpeDYqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NiIKKyAgICA7OworICBtaXBzKi1zZ2ktaXJpeDUqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NSIKKyAgICA7OworICBtaXBzKi1zZ2ktaXJpeDQqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1pcml4NCIKKyAgICA7OworICBtaXBzKi1zZ2ktaXJpeDMqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgorICAgIDs7CisgIG1pcHMqLSotc3lzdjQqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKKyAgICA7OworICBtaXBzKi0qLXN5c3YqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1yaXNjb3MiCisgICAgOzsKKyAgaVszNDU2XTg2LSotc3lzdjUqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NSIKKyAgICA7OworICBpWzM0NTZdODYtKi1kZ3V4KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtZGd1eDM4NiIKKyAgICA7OworICBpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1uY3JzdnI0MyIKKyAgICA7OworICBpWzM0NTZdODYtbmNyLXN5c3Y0KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbmNyMzAwMCIKKyAgICA7OworICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCisgICAgOzsKKyAgaVszNDU2XTg2LSotc2NvKikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc2NvIgorICAgIDs7CisgIGlbMzQ1Nl04Ni0qLXVkayopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3Y1IgorICAgIDs7CisgIGlbMzQ1Nl04Ni0qLWlzYyopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCisgICAgOzsKKyAgaVszNDU2XTg2LSotc29sYXJpczIqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKKyAgICA7OworICBpWzM0NTZdODYtKi1haXgqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1haXgzODYiCisgICAgOzsKKyAgaVszNDU2XTg2LSotbXNkb3NkamdwcCopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRqZ3BwIgorICAgIDs7CisgICotY3lnd2luKikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtY3lnd2luIgorICAgIDs7CisgICotbWluZ3czMiopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW1pbmd3MzIiCisgICAgOzsKKyAgKi1pbnRlcml4KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaW50ZXJpeCIKKyAgICA7OworICAqLXdpbmRvd3MqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC13aW5kb3dzIgorICAgIDs7CisgIHZheC0qLXVsdHJpeDIqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC12YXh1bHQyIgorICAgIDs7CisgICotKi1zb2xhcmlzMiopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNvbGFyaXMiCisgICAgOzsKKyAgbTY4ay1zdW4tc3Vub3MqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zdW4zIgorICAgIDs7CisgICotaHAtaHB1eFs3OF0qKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4OCIKKyAgICA7OworICAqLWhwLWhwdXgqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1ocHV4IgorICAgIDs7CisgICotKi1oaXV4KikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaHB1eCIKKyAgICA7OworICByczYwMDAtKi1seW54b3MqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1seW54cnM2ayIKKyAgICA7OworICAqLSotbHlueG9zKikKKyAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbHlueG9zIgorICAgIDs7CisgICotKi1haXg0LlszNDU2Nzg5XSogfCAqLSotYWl4WzU2Nzg5XS4qKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1haXg0MyIKKyAgICA7OworICAqLSotc3lzdjQqKQorICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NCIKKyAgICA7OworICAqLSotc3lzdiopCisgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXN5c3YiCisgICAgOzsKK2VzYWMKK2ZpCisKKyMgSWYgd2UgYXJlbid0IGdvaW5nIHRvIGJlIHVzaW5nIGdjYywgc2VlIGlmIHdlIGNhbiBleHRyYWN0IGEgZGVmaW5pdGlvbgorIyBvZiBDQyBmcm9tIHRoZSBmcmFnbWVudC4KK2lmIFsgLXogIiR7Q0N9IiBdICYmIFsgIiR7YnVpbGR9IiA9ICIke2hvc3R9IiBdOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvdW5kPQorICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgorICAgICAgZm91bmQ9eWVzCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkc2F2ZV9pZnMiCisgIGlmIFsgLXogIiR7Zm91bmR9IiBdICYmIFsgLW4gIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgXSAmJiBbIC1mICIke3NyY2Rpcn0vJHtob3N0X21ha2VmaWxlX2ZyYWd9IiBdOyB0aGVuCisgICAgeHg9YHNlZCAtbiAtZSAncy9eWyAJXSpDQ1sgCV0qPVsgCV0qXCguKlwpJC9cMS9wJyA8ICR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ31gCisgICAgaWYgWyAtbiAiJHt4eH0iIF0gOyB0aGVuCisgICAgICBDQz0keHgKKyAgICBmaQorICBmaQorZmkKKworIyBXZSBkZWZhdWx0IHRvIC0td2l0aC1zaGFyZWQgb24gcGxhdGZvcm1zIHdoZXJlIC1mcGljIGlzIG1lYW5pbmdsZXNzLgorIyBXZWxsLCB3ZSBkb24ndCB5ZXQsIGJ1dCB3ZSB3aWxsLgoraWYgZmFsc2UgJiYgWyAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IiBdICYmIFsgeCR7ZW5hYmxlX3NoYXJlZH0gPSB4IF07IHRoZW4KKyAgY2FzZSAiJHt0YXJnZXR9IiBpbgorICAgIGFscGhhKi1kZWMtb3NmKikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBhbHBoYSotKi1saW51eCopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbWlwcy1zZ2ktaXJpeDUqKQllbmFibGVfc2hhcmVkPXllcyA7OworICAgICopCQkJZW5hYmxlX3NoYXJlZD1ubyA7OworICBlc2FjCitmaQorCitjYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgorICB5ZXMpIHNoYXJlZD15ZXMgOzsKKyAgbm8pIHNoYXJlZD1ubyA7OworICAiIikgc2hhcmVkPW5vIDs7CisgICopIHNoYXJlZD15ZXMgOzsKK2VzYWMKKworaWYgWyB4JHtzaGFyZWR9ID0geHllcyBdOyB0aGVuCisgIGNhc2UgIiR7aG9zdH0iIGluCisgICAgYWxwaGEqLSotbGludXgqKQorICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWVsZmFscGhhcGljIgorICAgICAgOzsKKyAgICBhcm0qLSotKikKKyAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1hcm1waWMiCisgICAgICA7OworICAgIGhwcGEqLSotKikKKyAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1wYXBpYyIKKyAgICAgIDs7CisgICAgaVszNDU2XTg2LSotY3lnd2luKikKKyAgICAgICMgV2UgZG9uJ3Qgd2FudCAtZlBJQyBvbiBDeWd3aW4uCisgICAgICA7OworICAgIGlbMzQ1Nl04Ni0qLSopCisgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgteDg2cGljIgorICAgICAgOzsKKyAgICBzcGFyYzY0LSotKikKKyAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zcGFyY3BpYyIKKyAgICAgIDs7CisgICAgcG93ZXJwYyotKi1haXgqKQorICAgICAgIyBXZSBkb24ndCB3YW50IC1mUElDIG9uIEFJWC4KKyAgICAgIDs7CisgICAgcG93ZXJwYyotKi0qKQorICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXBwY3BpYyIKKyAgICAgIDs7CisgICAgKi0qLSopCisgICAgICBpZiB0ZXN0IC1mICR7c3JjZGlyfS9jb25maWcvbWgtJHtob3N0X2NwdX1waWM7IHRoZW4KKyAgICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLSR7aG9zdF9jcHV9cGljIgorICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKK2ZpCisKK3JtIC1mIG1oLWZyYWcKK2lmIFsgLW4gIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgXSA7IHRoZW4KKyAgZm9yIGYgaW4gJHtob3N0X21ha2VmaWxlX2ZyYWd9CisgIGRvCisgICAgY2F0ICR7c3JjZGlyfS8kZiA+PiBtaC1mcmFnCisgIGRvbmUKKyAgaG9zdF9tYWtlZmlsZV9mcmFnPW1oLWZyYWcKK2ZpCisKKyMgcGVyLXRhcmdldDoKKworY2FzZSAiJHt0YXJnZXR9IiBpbgorICB2ODEwKikKKyAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXY4MTAiCisgICAgOzsKKyAgaVszNDU2XTg2LSotbmV0d2FyZSopCisgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1uZXR3YXJlIgorICAgIDs7CisgIHBvd2VycGMtKi1uZXR3YXJlKikKKyAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LW5ldHdhcmUiCisgICAgOzsKKyAgKi0qLWxpbnV4LWdudSkKKyAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWxpbnV4IgorICAgIDs7Citlc2FjCisKKyMgSWYgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIGFsd2F5cyB1c2UgLU9zIGluc3RlYWQgb2YgLU8yIHRvIGJ1aWxkCisjIHRoZSB0YXJnZXQgbGlicmFyaWVzLCBzaW1pbGFybHkgaWYgaXQgaXMgbm90IHNwZWNpZmllZCwgdXNlIC1PcworIyBvbiBzZWxlY3RlZCBwbGF0Zm9ybXMuCitjYXNlICIke2VuYWJsZV90YXJnZXRfb3B0c3BhY2V9OiR7dGFyZ2V0fSIgaW4KKyAgeWVzOiopCisgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1vc3BhY2UiCisgICAgOzsKKyAgIyBDWUdOVVMgTE9DQUwgZDEwdiwgZDMwdiwgZnIzMAorICA6ZDMwdi0qKQorICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtZDMwdiIKKyAgICA7OworICA6bTMyci0qIHwgOmQxMHYtKiB8IDpmcjMwLSopCisgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1vc3BhY2UiCisgICAgOzsKKyAgbm86KiB8IDoqKQorICAgIDs7CisgICopCisgICAgZWNobyAiKioqIGJhZCB2YWx1ZSBcIiR7ZW5hYmxlX3RhcmdldF9vcHRzcGFjZX1cIiBmb3IgLS1lbmFibGUtdGFyZ2V0LW9wdHNwYWNlIGZsYWc7IGlnbm9yZWQiIDE+JjIKKyAgICA7OworZXNhYworCitza2lwZGlycz0KK2dhc2Rpcj1nYXMKK3VzZV9nbnVfbGQ9Cit1c2VfZ251X2FzPQorCisjIHNvbWUgdG9vbHMgYXJlIHNvIGRlcGVuZGVudCB1cG9uIFgxMSB0aGF0IGlmIHdlJ3JlIG5vdCBidWlsZGluZyB3aXRoIFgsIAorIyBpdCdzIG5vdCBldmVuIHdvcnRoIHRyeWluZyB0byBjb25maWd1cmUsIG11Y2ggbGVzcyBidWlsZCwgdGhhdCB0b29sLgorCitjYXNlICR7d2l0aF94fSBpbgorICB5ZXMgfCAiIikgICMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgdHJlZSBpcyB0aGF0IFgxMSBpcyBhdmFpbGFibGUKKwk7OworICBubykKKwlza2lwZGlycz0iJHtza2lwZGlyc30gdGsgbGliZ3VpIGdhc2giCisJOzsKKyAgKikKKyAgICAJZWNobyAiKioqIGJhZCB2YWx1ZSBcIiR7d2l0aF94fVwiIGZvciAtd2l0aC14IGZsYWc7IGlnbm9yZWQiIDE+JjIKKyAgICAJOzsKK2VzYWMKKworIyBTb21lIHRvb2xzIGFyZSBvbmx5IHN1aXRhYmxlIGZvciBidWlsZGluZyBpbiBhICJuYXRpdmUiIHNpdHVhdGlvbi4KKyMgVGhvc2UgYXJlIGFkZGVkIHdoZW4gd2UgaGF2ZSBhIGhvc3Q9PXRhcmdldCBjb25maWd1cmF0aW9uLiAgRm9yIGNyb3NzCisjIHRvb2xjaGFpbnMsIHdlIGFkZCBzb21lIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZnVsIGluIGEKKyMgY3Jvc3MtY29tcGlsZXIuCisKK2lzX2Nyb3NzX2NvbXBpbGVyPQorCitpZiBbIHgiJHtob3N0fSIgPSB4IiR7dGFyZ2V0fSIgXSA7IHRoZW4KKwkjIHdoZW4gZG9pbmcgYSBuYXRpdmUgdG9vbGNoYWluLCBkb24ndCBidWlsZCB0aGUgdGFyZ2V0cworCSMgdGhhdCBhcmUgaW4gdGhlICdjcm9zcyBvbmx5JyBsaXN0CisJc2tpcGRpcnM9IiR7c2tpcGRpcnN9ICR7Y3Jvc3Nfb25seX0iCisJaXNfY3Jvc3NfY29tcGlsZXI9bm8KK2Vsc2UKKwkjIHNpbWlsYXJseSwgZG9uJ3QgYnVpbGQgdGhlIHRhcmdldHMgaW4gdGhlICduYXRpdmUgb25seScgCisJIyBsaXN0IHdoZW4gYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlcgorCXNraXBkaXJzPSIke3NraXBkaXJzfSAke25hdGl2ZV9vbmx5fSIKKwlpc19jcm9zc19jb21waWxlcj15ZXMKK2ZpCQorCisjIFdlIGFsd2F5cyB3YW50IHRvIHVzZSB0aGUgc2FtZSBuYW1lIGZvciB0aGlzIGRpcmVjdG9yeSwgc28gdGhhdCBkZWphZ251CisjIGNhbiByZWxpYWJseSBmaW5kIGl0LgordGFyZ2V0X3N1YmRpcj0ke3RhcmdldF9hbGlhc30KKworaWYgWyAhIC1kICR7dGFyZ2V0X3N1YmRpcn0gXSA7IHRoZW4KKyAgaWYgbWtkaXIgJHt0YXJnZXRfc3ViZGlyfSA7IHRoZW4gdHJ1ZQorICBlbHNlCisgICAgZWNobyAiJyoqKiBjb3VsZCBub3QgbWFrZSAke1BXRD1gcHdkYH0vJHt0YXJnZXRfc3ViZGlyfSIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmkKKworY29weV9kaXJzPQorCisjIEhhbmRsZSAtLXdpdGgtaGVhZGVycz1YWFguICBUaGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGRpcmVjdG9yeSBhcmUKKyMgY29waWVkIHRvICQodG9vbGRpcikvc3lzLWluY2x1ZGUuCitpZiBbIHgiJHt3aXRoX2hlYWRlcnN9IiAhPSB4IF07IHRoZW4KKyAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4bm8gXTsgdGhlbgorICAgIGVjaG8gMT4mMiAnKioqJyAtLXdpdGgtaGVhZGVycyBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIGNyb3NzIGNvbXBpbGluZworICAgIGV4aXQgMQorICBmaQorICBjYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KKyAgIiIpIHg9JHtwcmVmaXh9IDs7CisgICopIHg9JHtleGVjX3ByZWZpeH0gOzsKKyAgZXNhYworICBjb3B5X2RpcnM9IiR7Y29weV9kaXJzfSAke3dpdGhfaGVhZGVyc30gJHgvJHt0YXJnZXRfYWxpYXN9L3N5cy1pbmNsdWRlIgorZmkKKworIyBIYW5kbGUgLS13aXRoLWxpYnM9WFhYLiAgTXVsdGlwbGUgZGlyZWN0b3JpZXMgYXJlIHBlcm1pdHRlZC4gIFRoZQorIyBjb250ZW50cyBhcmUgY29waWVkIHRvICQodG9vbGRpcikvbGliLgoraWYgWyB4IiR7d2l0aF9saWJzfSIgIT0geCBdOyB0aGVuCisgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geG5vIF07IHRoZW4KKyAgICBlY2hvIDE+JjIgJyoqKicgLS13aXRoLWxpYnMgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBjcm9zcyBjb21waWxpbmcKKyAgICBleGl0IDEKKyAgZmkKKyAgIyBDb3B5IHRoZSBsaWJyYXJpZXMgaW4gcmV2ZXJzZSBvcmRlciwgc28gdGhhdCBmaWxlcyBpbiB0aGUgZmlyc3QgbmFtZWQKKyAgIyBsaWJyYXJ5IG92ZXJyaWRlIGZpbGVzIGluIHN1YnNlcXVlbnQgbGlicmFyaWVzLgorICBjYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KKyAgIiIpIHg9JHtwcmVmaXh9IDs7CisgICopIHg9JHtleGVjX3ByZWZpeH0gOzsKKyAgZXNhYworICBmb3IgbCBpbiAke3dpdGhfbGlic307IGRvCisgICAgY29weV9kaXJzPSIkbCAkeC8ke3RhcmdldF9hbGlhc30vbGliICR7Y29weV9kaXJzfSIKKyAgZG9uZQorZmkKKworIyBJZiBib3RoIC0td2l0aC1oZWFkZXJzIGFuZCAtLXdpdGgtbGlicyBhcmUgc3BlY2lmaWVkLCBkZWZhdWx0IHRvCisjIC0td2l0aG91dC1uZXdsaWIuCitpZiBbIHgiJHt3aXRoX2hlYWRlcnN9IiAhPSB4IF0gJiYgWyB4IiR7d2l0aF9saWJzfSIgIT0geCBdOyB0aGVuCisgIGlmIFsgeCIke3dpdGhfbmV3bGlifSIgPSB4IF07IHRoZW4KKyAgICB3aXRoX25ld2xpYj1ubworICBmaQorZmkKKworIyBSZWNvZ25pemUgLS13aXRoLW5ld2xpYi8tLXdpdGhvdXQtbmV3bGliLgoraWYgWyB4JHt3aXRoX25ld2xpYn0gPSB4bm8gXTsgdGhlbgorICBza2lwZGlycz0iJHtza2lwZGlyc30gdGFyZ2V0LW5ld2xpYiIKK2VsaWYgWyB4JHt3aXRoX25ld2xpYn0gPSB4eWVzIF07IHRoZW4KKyAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCitmaQorCisjIERlZmF1bHQgdG8gdXNpbmcgLS13aXRoLXN0YWJzIGZvciBjZXJ0YWluIHRhcmdldHMuCitpZiBbIHgke3dpdGhfc3RhYnN9ID0geCBdOyB0aGVuCisgIGNhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgbWlwcyotKi1pcml4NiopCisgICAgOzsKKyAgbWlwcyotKi0qIHwgYWxwaGEqLSotb3NmKikKKyAgICB3aXRoX3N0YWJzPXllczsKKyAgICB3aXRob3B0aW9ucz0iJHt3aXRob3B0aW9uc30gLS13aXRoLXN0YWJzIgorICAgIDs7CisgIGVzYWMKK2ZpCisKKyMgSGFuZGxlICR7Y29weV9kaXJzfQorc2V0IGZub3JkICR7Y29weV9kaXJzfQorc2hpZnQKK3doaWxlIFsgJCMgIT0gMCBdOyBkbworICBpZiBbIC1mICQyL0NPUElFRCBdICYmIFsgeCJgY2F0ICQyL0NPUElFRGAiID0geCIkMSIgXTsgdGhlbgorICAgIDoKKyAgZWxzZQorICAgIGVjaG8gQ29weWluZyAkMSB0byAkMgorCisgICAgIyBVc2UgdGhlIGluc3RhbGwgc2NyaXB0IHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgcmVxdWlyZWQKKyAgICAjIHBhcmVudCBkaXJlY3Rvcmllcy4KKyAgICBpZiBbIC1kICQyIF07IHRoZW4KKyAgICAgIDoKKyAgICBlbHNlCisgICAgICBlY2hvID5jb25maWcudGVtcAorICAgICAgJHtzcmNkaXJ9L2luc3RhbGwtc2ggLWMgLW0gNjQ0IGNvbmZpZy50ZW1wICQyL0NPUElFRAorICAgIGZpCisKKyAgICAjIENvcHkgdGhlIGRpcmVjdG9yeSwgYXNzdW1pbmcgd2UgaGF2ZSB0YXIuCisgICAgIyBGSVhNRTogU2hvdWxkIHdlIHVzZSBCIGluIHRoZSBzZWNvbmQgdGFyPyAgTm90IGFsbCBzeXN0ZW1zIHN1cHBvcnQgaXQuCisgICAgKGNkICQxOyB0YXIgLWNmIC0gLikgfCAoY2QgJDI7IHRhciAteHBmIC0pCisKKyAgICAjIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciB0byBjb3JyZWN0bHkgYWRqdXN0IGFsbAorICAgICMgc3ltbGlua3MuICBJZiBzb21lYm9keSBjYW4gZmlndXJlIG91dCBob3cgdG8gaGFuZGxlIHRoZW0gY29ycmVjdGx5CisgICAgIyBoZXJlLCBmZWVsIGZyZWUgdG8gYWRkIHRoZSBjb2RlLgorCisgICAgZWNobyAkMSA+ICQyL0NPUElFRAorICBmaQorICBzaGlmdDsgc2hpZnQKK2RvbmUKKworIyBDb25maWd1cmUgZXh0cmEgZGlyZWN0b3JpZXMgd2hpY2ggYXJlIGhvc3Qgc3BlY2lmaWMKKworY2FzZSAiJHtob3N0fSIgaW4KKwlpWzM0NTZdODYtKi1nbzMyKikKKwkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGRvc3JlbCIgOzsKKwlpWzM0NTZdODYtKi1taW5ndzMyKikKKwkgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGRvc3JlbCIgOzsKKwkqLWN5Z3dpbiopCisJICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBsaWJ0ZXJtY2FwIGRvc3JlbCIgOzsKK2VzYWMKKworIyBSZW1vdmUgbW9yZSBwcm9ncmFtcyBmcm9tIGNvbnNpZGVyYXRpb24sIGJhc2VkIG9uIHRoZSBob3N0IG9yIAorIyB0YXJnZXQgdGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgYSBwb3J0IG9mIHRoZSBwcm9ncmFtIGRvZXNuJ3QKKyMgZXhpc3QgeWV0LgorCitub2NvbmZpZ2RpcnM9IiIKKworY2FzZSAiJHtob3N0fSIgaW4KKyAgaVszNDU2XTg2LSotdnN0YSkKKyAgICBub2NvbmZpZ2RpcnM9InRjbCBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIGdwcm9mIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiBnZXR0ZXh0IgorICAgIDs7CisgIGlbMzQ1Nl04Ni0qLWdvMzIqIHwgaVszNDU2XTg2LSotbXNkb3NkamdwcCopCisgICAgbm9jb25maWdkaXJzPSJ0Y2wgdGsgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYgZ2V0dGV4dCIKKwk7OworICBpWzM0NTZdODYtKi1taW5ndzMyKikKKyAgICAjIG5vY29uZmlnZGlycz0idGNsIHRrIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgorICAgICBub2NvbmZpZ2RpcnM9ImV4cGVjdCBkZWphZ251IGN2cyBhdXRvY29uZiBhdXRvbWFrZSBzZW5kLXByIGdwcm9mIHJjcyBndWlsZSBwZXJsIHRleGluZm8gYXBhY2hlIGluZXQgbGlidG9vbCIKKwk7OworICBpWzM0NTZdODYtKi1iZW9zKikKKyAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRrIGl0Y2wgdGl4IGxpYmd1aSBnZGIiCisgICAgIDs7CisgICotKi1jeWd3aW4qKQorICAgICBub2NvbmZpZ2RpcnM9ImF1dG9jb25mIGF1dG9tYWtlIHNlbmQtcHIgZ3Byb2YgcmNzIGd1aWxlIHBlcmwgdGV4aW5mbyBhcGFjaGUgaW5ldCIKKyAgICA7OworICAqLSotbmV0YnNkKikKKyAgICBub2NvbmZpZ2RpcnM9InJjcyIKKyAgICA7OworICBwcGMqLSotcGUpCisgICAgIG5vY29uZmlnZGlycz0icGF0Y2ggZGlmZiBtYWtlIHRrIHRjbCBleHBlY3QgZGVqYWdudSBjdnNzcmMgYXV0b2NvbmYgYXV0b21ha2UgdGV4aW5mbyBiaXNvbiBzZW5kLXByIGdwcm9mIHJjcyBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKKyAgICA7OworZXNhYworCisKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgKi0qLW5ldHdhcmUpCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGlicnggdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliaWJlcnR5IHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICAqLSotcnRlbXMqKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgKi0qLXZ4d29ya3MqKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBhbHBoYSotZGVjLW9zZiopCisgICAgIyBsZCB3b3JrcywgYnV0IGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIGVtYWNzIGRvZXNuJ3QKKyAgICAjIHdvcmsuICBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeS4gIEknbSBub3Qgc3VyZSBhYm91dCBmaWxldXRpbHMuCisgICAgIyBnYXMgZG9lc24ndCBnZW5lcmF0ZSBleGNlcHRpb24gaW5mb3JtYXRpb24uCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyBsZCBlbWFjcyBmaWxldXRpbHMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgYWxwaGEqLSotKnZtcyopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBsZCB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBhbHBoYSotKi1saW51eCopCisgICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKKyAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCisgICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCisgICAgOzsKKyAgYWxwaGEqLSotKikKKyAgICAjIG5ld2xpYiBpcyBub3QgNjQgYml0IHJlYWR5CisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIGFyYy0qLSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBhcm0tKi1wZSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBhcm0tKi1jb2ZmKikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgorCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCisgICAgZmkKKyAgICA7OworICBhcm0tKi1lbGYqKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCisgICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCisJICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKKyAgICBmaQorICAgIDs7CisgIGFybS0qLW9hYmkqKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgYzR4LSotKikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIHRodW1iLSotY29mZikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisjIENZR05VUyBMT0NBTCBjbG0vYXJtLWVsZgorICB0aHVtYi0qLWVsZikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIHRodW1iLSotb2FiaSkKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisjIEVORCBDWUdOVVMgTE9DQUwKKyMgQ1lHTlVTIExPQ0FMIG5pY2tjL3N0cm9uZ2FybQorICBzdHJvbmdhcm0tKi1lbGYpCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KKwkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgorICAgIGZpCisgICAgOzsKKyAgc3Ryb25nYXJtLSotY29mZikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgorCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCisgICAgZmkKKyAgICA7OworIyBFTkQgQ1lHTlVTIExPQ0FMCisgIHRodW1iLSotcGUpICMgQ1lHTlVTIExPQ0FMIG5pY2tjL3RodW1iCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBhcm0tKi1yaXNjaXgqKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgZDEwdi0qLSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIgorICAgIDs7CisjIENZR05VUyBMT0NBTCBkMzB2CisgIGQzMHYtKi0qKQorICAgIDs7CisjIEVORCBDWUdOVVMgTE9DQUwKKyMgQ1lHTlVTIExPQ0FMIGZyMzAKKyAgZnIzMC0qLWVsZiopCisgICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCisJICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKKyAgICBmaQorICAgIDs7CisjIEVORCBDWUdOVVMgTE9DQUwKKyAgaDgzMDAqLSotKiB8IFwKKyAgaDg1MDAtKi0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgaHBwYSotKi0qZWxmKiB8IFwKKyAgaHBwYSotKi1saXRlcyopCisgICAgIyBEbyBjb25maWd1cmUgbGQvYmludXRpbHMvZ2FzIGZvciB0aGlzIGNhc2UuCisgICAgOzsKKyAgaHBwYSotKi0qKQorICAgICMgSFAncyBDIGNvbXBpbGVyIGRvZXNuJ3QgaGFuZGxlIEVtYWNzIGNvcnJlY3RseSAoYnV0IG9uIEJTRCBhbmQgTWFjaAorICAgICMgY2MgaXMgZ2NjLCBhbmQgb24gYW55IHN5c3RlbSBhIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gbGluayBjYyB0bworICAgICMgd2hhdGV2ZXIgdGhleSB3YW50LiAgRklYTUUsIGVtYWNzIGVtYWNzMTkpLgorICAgIGNhc2UgIiR7Q0N9IiBpbgorCSIiIHwgY2MqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSIgOzsKKyAgICAgICAgKikgOzsKKyAgICBlc2FjCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHNoZWxsdXRpbHMiCisgICAgOzsKKyAgaVszNDU2XTg2LSotY29mZiB8IGlbMzQ1Nl04Ni0qLWVsZikKKyAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KKyAgICAgICAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgorICAgIGZpCisgICAgOzsKKyAgaVszNDU2XTg2LSotZ28zMiogfCBpWzM0NTZdLSotbXNkb3NkamdwcCopCisgICAgIyBidXQgZG9uJ3QgYnVpbGQgZ2RiCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYmlvIHRhcmdldC1saWJyeCIKKyAgICA7OworICAqLSotbGludXgqKQorICAgICMgbGludXggaGFzIHJ4IGluIGxpYmMKKyAgICBza2lwZGlycz0iJHNraXBkaXJzIHRhcmdldC1saWJyeCIKKyAgICA7OworICBpWzM0NTZdODYtKi1taW5ndzMyKikKKyAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC1taW5ndyIKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZXhwZWN0IHRhcmdldC1saWJnbG9zcyIKKworICAgICMgQ2FuJ3QgYnVpbGQgZ2RiIGZvciBtaW5ndzMyIGlmIG5vdCBuYXRpdmUuCisgICAgY2FzZSAiJHtob3N0fSIgaW4KKyAgICAgIGlbMzQ1Nl04Ni0qLW1pbmd3MzIpIDs7ICMga2VlcCBnZGIgdGNsIHRrIGV4cGVjdCBldGMuCisgICAgICAqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgorICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsgICAgCisgICotKi1jeWd3aW4qKQorICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYnRlcm1jYXAgdGFyZ2V0LXdpbnN1cCIKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgICMgYWx3YXlzIGJ1aWxkIG5ld2xpYi4KKyAgICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKKworICAgICMgQ2FuJ3QgYnVpbGQgZ2RiIGZvciBDeWd3aW4gaWYgbm90IG5hdGl2ZS4KKyAgICBjYXNlICIke2hvc3R9IiBpbgorICAgICAgKi0qLWN5Z3dpbiopIDs7ICMga2VlcCBnZGIgdGNsIHRrIGV4cGVjdCBldGMuCisgICAgICAqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggbGliZ3VpIGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKKyAgICAgICAgIDs7CisgICAgZXNhYworICAgIDs7ICAgIAorICBpWzM0NTZdODYtKi1wZSkKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKKyAgICAjIFRoZSBsaW5rZXIgZG9lcyBub3QgeWV0IGtub3cgYWJvdXQgd2VhayBzeW1ib2xzIGluIENPRkYsCisgICAgIyBhbmQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gaGFuZGxlIG1peGVkIEVMRiBhbmQgQ09GRi4KKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIGlbMzQ1Nl04Ni0qLXNjbyopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBpWzM0NTZdODYtKi1zb2xhcmlzMiopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBpWzM0NTZdODYtKi1zeXN2NCopCisgICAgIyBUaGUgU1lTVjQgQyBjb21waWxlciBkb2Vzbid0IGhhbmRsZSBFbWFjcyBjb3JyZWN0bHkKKyAgICBjYXNlICIke0NDfSIgaW4KKwkiIiB8IGNjKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGVtYWNzIGVtYWNzMTkiIDs7CisgICAgICAgICopIDs7CisgICAgZXNhYworICAgICMgYnV0IHRoYXQncyBva2F5IHNpbmNlIGVtYWNzIGRvZXNuJ3Qgd29yayBhbnl3YXkKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZW1hY3MgZW1hY3MxOSB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgaVszNDU2XTg2LSotYmVvcyopCisgICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCisgICAgIDs7CisgIG02OGstKi1lbGYqKQorICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgorCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCisgICAgZmkKKyAgICA7OworICBtNjhrLSotY29mZiopCisgICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCisJICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKKyAgICBmaQorICAgIDs7CisgIG1uMTAyMDAtKi0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyIKKyAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KKwkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKKyAgICBmaQorICAgIDs7CisgIG1uMTAzMDAtKi0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyIKKyAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KKwkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgorICAgIGZpCisgICAgOzsKKyAgcG93ZXJwYy0qLWFpeCopCisgICAgIyBjb3BpZWQgZnJvbSByczYwMDAtKi0qIGVudHJ5CisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIGN2c3NyYyB0YXJnZXQtbGliZ2xvc3MiCisgICAgIyBUaGlzIGlzIG5lZWRlZCB1bnRpbCBnY2MgYW5kIGxkIGFyZSBmaXhlZCB0byB3b3JrIHRvZ2V0aGVyLgorICAgIHVzZV9nbnVfbGQ9bm8KKyAgICA7OworICBwb3dlcnBjKi0qLXdpbm50KiB8IHBvd2VycGMqLSotcGUqIHwgcHBjKi0qLXBlKQorICAgIHRhcmdldF9jb25maWdkaXJzPSIkdGFyZ2V0X2NvbmZpZ2RpcnMgdGFyZ2V0LXdpbnN1cCIKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRjbCB0ayBtYWtlIGV4cGVjdCB0YXJnZXQtbGliZ2xvc3MgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgorICAgICMgYWx3YXlzIGJ1aWxkIG5ld2xpYi4KKyAgICBza2lwZGlycz1gZWNobyAiICR7c2tpcGRpcnN9ICIgfCBzZWQgLWUgJ3MvIHRhcmdldC1uZXdsaWIgLyAvJ2AKKyAgICA7OworICAgICMgVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgY2FuIGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzCisgIHBvd2VycGNsZS0qLXNvbGFyaXMqKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgc2ltIG1ha2UgdGNsIHRrIGV4cGVjdCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCisgICAgOzsKKyAgcG93ZXJwYy0qLWVhYmkpCisgICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCisJICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKKyAgICBmaQorICAgIDs7CisgIHJzNjAwMC0qLWx5bnhvcyopCisgICAgIyBUaGUgQ1ZTIHNlcnZlciBjb2RlIGRvZXNuJ3Qgd29yayBvbiB0aGUgUlMvNjAwMAorICAgICMgTmV3bGliIG1ha2VzIHByb2JsZW1zIGZvciBsaWJnKysgaW4gY3Jvc3Nlcy4KKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiBncHJvZiBjdnNzcmMiCisgICAgOzsKKyAgcnM2MDAwLSotYWl4KikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiCisgICAgIyBUaGlzIGlzIG5lZWRlZCB1bnRpbCBnY2MgYW5kIGxkIGFyZSBmaXhlZCB0byB3b3JrIHRvZ2V0aGVyLgorICAgIHVzZV9nbnVfbGQ9bm8KKyAgICA7OworICByczYwMDAtKi0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKKyAgICA7OworICBtNjhrLWFwb2xsby0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBiaW51dGlscyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgbWlwcyotKi1pcml4NSopCisgICAgIyBUaGUgR05VIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCisgICAgIyBlbWFjcyBpcyBlbWFjcyAxOCwgd2hpY2ggZG9lcyBub3Qgd29yayBvbiBJcml4IDUgKGVtYWNzMTkgZG9lcyB3b3JrKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBncHJvZiBlbWFjcyB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgbWlwcyotKi1pcml4NiopCisgICAgIyBUaGUgR05VIGFzc2VtYmxlciBhbmQgbGlua2VyIGRvIG5vdCBzdXBwb3J0IElSSVggNi4KKyAgICAjIGVtYWNzIGlzIGVtYWNzIDE4LCB3aGljaCBkb2VzIG5vdCB3b3JrIG9uIElyaXggNSAoZW1hY3MxOSBkb2VzIHdvcmspCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIGdhcyBncHJvZiBlbWFjcyB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgbWlwcyotZGVjLWJzZCopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBtaXBzKi0qLWJzZCopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBtaXBzdHgzOS0qLSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIiAgICMgc2FtZSBhcyBnZW5lcmljIG1pcHMKKyAgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgorICAgOzsKKyAgbWlwcyotKi0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIKKyAgICA7OworICByb21wLSotKikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGxkIGdhcyBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICBzaC0qLSopCisgICAgY2FzZSAiJHtob3N0fSIgaW4KKyAgICAgIGlbMzQ1Nl04Ni0qLXZzdGEpIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KKyAgICAgIGlbMzQ1Nl04Ni0qLWdvMzIqKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCisgICAgICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgorICAgICAgKikgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyBncHJvZiAvIC8nYCA7OworICAgIGVzYWMKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIHNwYXJjLSotZWxmKikKKyAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KKwkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKKyAgICBmaQorICAgIDs7CisgIHNwYXJjNjQtKi1lbGYqKQorICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgorCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgorICAgIGZpCisgICAgOzsKKyAgc3BhcmNsaXRlLSotKikKKyAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KKwkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtbGlic3R1YiB0YXJnZXQtY3lnbW9uIgorICAgIGZpCisgICAgOzsKKyAgc3BhcmMtKi1zdW5vczQqKQorICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgorICAgICAgICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIGdkYnRlc3QgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCisgICAgZWxzZQorICAgICAgICAgICB1c2VfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICB2ODEwLSotKikKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGdhcyBnY2MgZ2RiIGxkIHRhcmdldC1saWJpbyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsKKyAgdjg1MC0qLSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICB2ODUwZS0qLSopICMgQ1lHTlVTIExPQ0FMIHY4NTBlCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKKyAgICA7OworICB2ODUwZWEtKi0qKQorICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsgICAgICAgIyBFTkQgQ1lHTlVTIExPQ0FMCisgIHZheC0qLXZtcykKKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgYmZkIGJpbnV0aWxzIGdkYiBsZCB0YXJnZXQtbmV3bGliIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgIHZheC0qLSopCisgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgorICAgIDs7CisgICotKi1seW54b3MqKQorICAgICMgTmV3bGliIG1ha2VzIHByb2JsZW1zIGZvciBsaWJnKysgaW4gY3Jvc3Nlcy4KKyAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCisgICAgOzsgCisgICotKi1tYWNvcyogfCBcCisgICotKi1tcHcqKQorICAgICMgTWFjcyB3YW50IGEgcmVzb3VyY2UgY29tcGlsZXIuCisgICAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgZ3JleiIKKyAgICA7OyAgICAKK2VzYWMKKworIyBJZiB3ZSBhcmVuJ3QgYnVpbGRpbmcgbmV3bGliLCB0aGVuIGRvbid0IGJ1aWxkIGxpYmdsb3NzLCBzaW5jZSBsaWJnbG9zcworIyBkZXBlbmRzIHVwb24gc29tZSBuZXdsaWIgaGVhZGVyIGZpbGVzLgorY2FzZSAiJHtub2NvbmZpZ2RpcnN9IiBpbgorICAqdGFyZ2V0LWxpYmdsb3NzKikgOzsKKyAgKnRhcmdldC1uZXdsaWIqKSBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIiA7OworZXNhYworCisjIE1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgR05VIGxkIGJlIGFkZGVkIGlmIHdlIGRpZG4ndCB3YW50IGl0LgoraWYgWyB4JHdpdGhfZ251X2xkID0geG5vIF07IHRoZW4KKyAgdXNlX2dudV9sZD1ubworICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQiCitmaQorCisjIE1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgR05VIGFzIGJlIGFkZGVkIGlmIHdlIGRpZG4ndCB3YW50IGl0LgoraWYgWyB4JHdpdGhfZ251X2FzID0geG5vIF07IHRoZW4KKyAgdXNlX2dudV9hcz1ubworICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2FzIgorZmkKKworIyBSZW1vdmUgdGhlIGVudHJpZXMgaW4gJHNraXBkaXJzIGFuZCAkbm9jb25maWdkaXJzIGZyb20gJGNvbmZpZ2RpcnMgYW5kCisjICR0YXJnZXRfY29uZmlnZGlycy4KKyMgSWYgd2UgaGF2ZSB0aGUgc291cmNlIGZvciAkbm9jb25maWdkaXJzIGVudHJpZXMsIGFkZCB0aGVtIHRvICRub3RzdXBwLgorCitub3RzdXBwPSIiCitmb3IgZGlyIGluIC4gJHNraXBkaXJzICRub2NvbmZpZ2RpcnMgOyBkbworICBkaXJuYW1lPWBlY2hvICRkaXIgfCBzZWQgLWUgcy90YXJnZXQtLy9nYAorICBpZiBbICRkaXIgIT0gLiBdICAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGNvbmZpZ2RpcnM9YGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBzZWQgLWUgInMvICR7ZGlyfSAvIC8iYAorICAgIGlmIFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUgXSBcCisJfHwgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCisgICAgICBpZiBlY2hvICIgJHtza2lwZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwl0cnVlCisgICAgICBlbHNlCisJbm90c3VwcD0iJG5vdHN1cHAgJGRpciIKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKyAgaWYgWyAkZGlyICE9IC4gXSAgJiYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgdGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgc2VkIC1lICJzLyAke2Rpcn0gLyAvImAKKyAgICBpZiBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlIF0gXAorCXx8IFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUuaW4gXTsgdGhlbgorICAgICAgaWYgZWNobyAiICR7c2tpcGRpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJdHJ1ZQorICAgICAgZWxzZQorCW5vdHN1cHA9IiRub3RzdXBwICRkaXIiCisgICAgICBmaQorICAgIGZpCisgIGZpCitkb25lCisKKyMgU29tZXRpbWVzIHRoZSB0b29scyBhcmUgZGlzdHJpYnV0ZWQgd2l0aCBsaWJpYmVydHkgYnV0IHdpdGggbm8gb3RoZXIKKyMgbGlicmFyaWVzLiAgSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGJ1aWxkIHRhcmdldC1saWJpYmVydHkuCitpZiBbIC1uICIke3RhcmdldF9jb25maWdkaXJzfSIgXTsgdGhlbgorICBvdGhlcnM9CisgIGZvciBpIGluIGBlY2hvICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbworICAgIGlmIFsgIiRpIiAhPSAibGliaWJlcnR5IiBdOyB0aGVuCisgICAgICBpZiBbIC1yICRzcmNkaXIvJGkvY29uZmlndXJlIF0gfHwgWyAtciAkc3JjZGlyLyRpL2NvbmZpZ3VyZS5pbiBdOyB0aGVuCisJb3RoZXJzPXllczsKKwlicmVhazsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBpZiBbIC16ICIke290aGVyc30iIF07IHRoZW4KKyAgICB0YXJnZXRfY29uZmlnZGlycz0KKyAgZmkKK2ZpCisKKyMgRGVjb25maWd1cmUgYWxsIHN1YmRpcmVjdG9yaWVzLCBpbiBjYXNlIHdlIGFyZSBjaGFuZ2luZyB0aGUKKyMgY29uZmlndXJhdGlvbiBmcm9tIG9uZSB3aGVyZSBhIHN1YmRpcmVjdG9yeSBpcyBzdXBwb3J0ZWQgdG8gb25lIHdoZXJlIGl0CisjIGlzIG5vdC4KK2lmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdICYmIFsgLW4gIiR7Y29uZmlnZGlyc30iIF07IHRoZW4KKyAgZm9yIGkgaW4gYGVjaG8gJHtjb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KKyAgICBybSAtZiAkaS9NYWtlZmlsZQorICBkb25lCitmaQoraWYgWyAteiAiJHtub3JlY3Vyc2lvbn0iIF0gJiYgWyAtbiAiJHt0YXJnZXRfY29uZmlnZGlyc30iIF07IHRoZW4KKyAgZm9yIGkgaW4gYGVjaG8gJHt0YXJnZXRfY29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCisgICAgcm0gLWYgJHt0YXJnZXRfc3ViZGlyfS8kaS9NYWtlZmlsZQorICBkb25lCitmaQorCisjIFByb2R1Y2UgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBzdWJkaXJzIHdlIGNhbid0IGNvbmZpZ3VyZS4KKyMgVGhpcyBpc24ndCBlc3BlY2lhbGx5IGludGVyZXN0aW5nIGluIHRoZSBDeWdudXMgdHJlZSwgYnV0IGluIHRoZSBpbmRpdmlkdWFsCisjIEZTRiByZWxlYXNlcywgaXQncyBpbXBvcnRhbnQgdG8gbGV0IHBlb3BsZSBrbm93IHdoZW4gdGhlaXIgbWFjaGluZSBpc24ndAorIyBzdXBwb3J0ZWQgYnkgdGhlIG9uZSBvciB0d28gcHJvZ3JhbXMgaW4gYSBwYWNrYWdlLgorCitpZiBbIC1uICIke25vdHN1cHB9IiBdICYmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdOyB0aGVuCisgICMgSWYgJGFwcGRpcnMgaXMgbm9uLWVtcHR5LCBhdCBsZWFzdCBvbmUgb2YgdGhvc2UgZGlyZWN0b3JpZXMgbXVzdCBzdGlsbAorICAjIGJlIGNvbmZpZ3VyZWQsIG9yIHdlIGVycm9yIG91dC4gIChFLmcuLCBpZiB0aGUgZ2FzIHJlbGVhc2Ugc3VwcG9ydHMgYQorICAjIHNwZWNpZmllZCB0YXJnZXQgaW4gc29tZSBzdWJkaXJzIGJ1dCBub3QgdGhlIGdhcyBzdWJkaXIsIHdlIHNob3VsZG4ndAorICAjIHByZXRlbmQgdGhhdCBhbGwgaXMgd2VsbC4pCisgIGlmIFsgLW4gIiRhcHBkaXJzIiBdOyB0aGVuCisgICAgZm9yIGRpciBpbiAkYXBwZGlycyA7IGRvCisgICAgICBpZiBbIC1yICRkaXIvTWFrZWZpbGUuaW4gXTsgdGhlbgorCWlmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBhcHBkaXJzPSIiCisJICBicmVhaworCWZpCisJaWYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBhcHBkaXJzPSIiCisJICBicmVhaworCWZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiBbIC1uICIkYXBwZGlycyIgXTsgdGhlbgorICAgICAgZWNobyAiKioqIFRoaXMgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGFja2FnZS4iIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgIGZpCisgICMgT2theSwgc29tZSBhcHBsaWNhdGlvbiB3aWxsIGJ1aWxkLCBvciB3ZSBkb24ndCBjYXJlIHRvIGNoZWNrLiAgU3RpbGwKKyAgIyBub3RpZnkgb2Ygc3ViZGlycyBub3QgZ2V0dGluZyBidWlsdC4KKyAgZWNobyAiKioqIFRoaXMgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBmb2xsb3dpbmcgc3ViZGlyZWN0b3JpZXM6IiAxPiYyCisgIGVjaG8gIiAgICAke25vdHN1cHB9IiAxPiYyCisgIGVjaG8gIiAgICAoQW55IG90aGVyIGRpcmVjdG9yaWVzIHNob3VsZCBzdGlsbCB3b3JrIGZpbmUuKSIgMT4mMgorZmkKKworIyBTZXQgd2l0aF9nbnVfYXMgYW5kIHdpdGhfZ251X2xkIGFzIGFwcHJvcHJpYXRlLgorIworIyBUaGlzIGlzIGRvbmUgYnkgZGV0ZXJtaW5pbmcgd2hldGhlciBvciBub3QgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeQorIyBpcyBhdmFpbGFibGUsIGFuZCBieSBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBzcGVjaWZpYyBjb25maWd1cmF0aW9ucworIyBoYXZlIHJlcXVlc3RlZCB0aGF0IHRoaXMgbWFnaWMgbm90IGhhcHBlbi4KKyMgCisjIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbHdheXMgb3ZlcnJpZGUgdGhlIGV4cGxpY2l0IHNldHRpbmdzIGluIAorIyBjb25maWd1cmUuaW4sIGFuZCB0aGUgc2V0dGluZ3MgaW4gY29uZmlndXJlLmluIG92ZXJyaWRlIHRoaXMgbWFnaWMuCisjCisjIElmIHRoZSBkZWZhdWx0IGZvciBhIHRvb2xjaGFpbiBpcyB0byB1c2UgR05VIGFzIGFuZCBsZCwgYW5kIHlvdSBkb24ndCAKKyMgd2FudCB0byBkbyB0aGF0LCB0aGVuIHlvdSBzaG91bGQgdXNlIHRoZSAtLXdpdGhvdXQtZ251LWFzIGFuZAorIyAtLXdpdGhvdXQtZ251LWxkIG9wdGlvbnMgZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0LgorCitpZiBbIHgke3VzZV9nbnVfYXN9ID0geCBdIDsgdGhlbgorICBpZiBbIHgke3dpdGhfZ251X2FzfSAhPSB4bm8gXSAmJiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7Z2FzZGlyfSAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vJHtnYXNkaXJ9IF0gOyB0aGVuCisgICAgd2l0aF9nbnVfYXM9eWVzCisgICAgd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgtZ251LWFzIgorICBmaQorZmkKKworaWYgWyB4JHt1c2VfZ251X2xkfSA9IHggXSA7IHRoZW4KKyAgaWYgWyB4JHt3aXRoX2dudV9sZH0gIT0geG5vIF0gJiYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiBsZCAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vbGQgXSA7IHRoZW4KKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1nbnUtbGQiCisgIGZpCitmaQorCisjIElmIHVzaW5nIG5ld2xpYiwgYWRkIC0td2l0aC1uZXdsaWIgdG8gdGhlIHdpdGhvcHRpb25zIHNvIHRoYXQgZ2NjL2NvbmZpZ3VyZQorIyBjYW4gZGV0ZWN0IHRoaXMgY2FzZS4KKworaWYgWyB4JHt3aXRoX25ld2xpYn0gIT0geG5vIF0gJiYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgdGFyZ2V0LW5ld2xpYiAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vbmV3bGliIF0gOyB0aGVuCisgIHdpdGhfbmV3bGliPXllcworICB3aXRob3B0aW9ucz0iJHdpdGhvcHRpb25zIC0td2l0aC1uZXdsaWIiCitmaQorCitpZiBbIHgke3NoYXJlZH0gPSB4eWVzIF07IHRoZW4KKyAgY2FzZSAiJHt0YXJnZXR9IiBpbgorICAgIGhwcGEqKQorICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1wYXBpYyIKKyAgICAgIDs7CisgICAgaVszNDU2XTg2LSopCisgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXg4NnBpYyIKKyAgICAgIDs7CisgICAgcG93ZXJwYyotKikKKyAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtcHBjcGljIgorICAgICAgOzsKKyAgICBhbHBoYSotKi1saW51eCopCisgICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWVsZmFscGhhcGljIgorICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAtZiAke3NyY2Rpcn0vY29uZmlnL210LSR7dGFyZ2V0X2NwdX1waWM7IHRoZW4KKyAgICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC0ke3RhcmdldF9jcHV9cGljIgorICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKK2ZpCisKK3JtIC1mIG10LWZyYWcKK2lmIFsgLW4gIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBdIDsgdGhlbgorICBmb3IgZiBpbiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfQorICBkbworICAgIGNhdCAke3NyY2Rpcn0vJGYgPj4gbXQtZnJhZworICBkb25lCisgIHRhcmdldF9tYWtlZmlsZV9mcmFnPW10LWZyYWcKK2ZpCisKKyMgcG9zdC10YXJnZXQ6CisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGlzIGFibGUgdG8gZ2VuZXJhdGUgYW4gZXhlY3V0YWJsZS4gIElmIGl0CisjIGNhbid0LCB3ZSBhcmUgcHJvYmFibHkgaW4gdHJvdWJsZS4gIFdlIGRvbid0IGNhcmUgd2hldGhlciB3ZSBjYW4gcnVuIHRoZQorIyBleGVjdXRhYmxlLS13ZSBtaWdodCBiZSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLS13ZSBvbmx5IGNhcmUgd2hldGhlciBpdAorIyBjYW4gYmUgY3JlYXRlZC4gIEF0IHRoaXMgcG9pbnQgdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdCBoYXMgc2V0IENDLgorZWNobyAiaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfSIgPiBjb25mdGVzdC5jCiske0NDfSAtbyBjb25mdGVzdCAke0NGTEFHU30gJHtDUFBGTEFHU30gJHtMREZMQUdTfSBjb25mdGVzdC5jCitpZiBbICQ/ID0gMCBdICYmIFsgLXMgY29uZnRlc3QgLW8gLXMgY29uZnRlc3QuZXhlIF07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvIDE+JjIgIioqKiBUaGUgY29tbWFuZCAnJHtDQ30gLW8gY29uZnRlc3QgJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30gY29uZnRlc3QuYycgZmFpbGVkLiIKKyAgZWNobyAxPiYyICIqKiogWW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDQyB0byBhIHdvcmtpbmcgY29tcGlsZXIuIgorICBybSAtZiBjb25mdGVzdCoKKyAgZXhpdCAxCitmaQorcm0gLWYgY29uZnRlc3QqCisKKyMgVGhlIFNvbGFyaXMgL3Vzci91Y2IvY2MgY29tcGlsZXIgZG9lcyBub3QgYXBwZWFyIHRvIHdvcmsuCitjYXNlICIke2hvc3R9IiBpbgorICBzcGFyYy1zdW4tc29sYXJpczIqKQorICAgICAgQ0NCQVNFPSJgZWNobyAke0NDLWNjfSB8IHNlZCAncy8gLiokLy8nYCIKKyAgICAgIGlmIFsgImAvdXNyL2Jpbi93aGljaCAkQ0NCQVNFYCIgPSAiL3Vzci91Y2IvY2MiIF0gOyB0aGVuCisgICAgICAgICAgY291bGRfdXNlPQorICAgICAgICAgIFsgLWQgL29wdC9TVU5Xc3Byby9iaW4gXSAmJiBjb3VsZF91c2U9Ii9vcHQvU1VOV3Nwcm8vYmluIgorICAgICAgICAgIGlmIFsgLWQgL29wdC9jeWdudXMvYmluIF0gOyB0aGVuCisgICAgICAgICAgICAgIGlmIFsgIiRjb3VsZF91c2UiID0gIiIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGNvdWxkX3VzZT0iL29wdC9jeWdudXMvYmluIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBjb3VsZF91c2U9IiRjb3VsZF91c2Ugb3IgL29wdC9jeWdudXMvYmluIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgIGlmIFsgIiRjb3VsZF91c2UiID0gIiIgXSA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIldhcm5pbmc6IGNvbXBpbGF0aW9uIG1heSBmYWlsIGJlY2F1c2UgeW91J3JlIHVzaW5nIgorICAgICAgICAgICAgZWNobyAiL3Vzci91Y2IvY2MuICBZb3Ugc2hvdWxkIGNoYW5nZSB5b3VyIFBBVEggb3IgQ0MgIgorICAgICAgICAgICAgZWNobyAidmFyaWFibGUgYW5kIHJlcnVuIGNvbmZpZ3VyZS4iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIldhcm5pbmc6IGNvbXBpbGF0aW9uIG1heSBmYWlsIGJlY2F1c2UgeW91J3JlIHVzaW5nIgorICAgICAgICAgICAgZWNobyAiL3Vzci91Y2IvY2MsIHdoZW4geW91IHNob3VsZCB1c2UgdGhlIEMgY29tcGlsZXIgZnJvbSIKKyAgICAgICAgICAgIGVjaG8gIiRjb3VsZF91c2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB5b3VyIgorICAgICAgICAgICAgZWNobyAiUEFUSCBvciBDQyB2YXJpYWJsZSBhbmQgcmVydW4gY29uZmlndXJlLiIKKyAgICAgICAgZmkKKyAgICAgIGZpCisgIDs7Citlc2FjCisKKyMgSWYgLS1lbmFibGUtc2hhcmVkIHdhcyBzZXQsIHdlIG11c3Qgc2V0IExEX0xJQlJBUllfUEFUSCBzbyB0aGF0IHRoZQorIyBiaW51dGlscyB0b29scyB3aWxsIGZpbmQgbGliYmZkLnNvLgoraWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KKyAgc2VkIC1lICdzL15TRVRfTElCX1BBVEhbIAldKj0uKiQvU0VUX0xJQl9QQVRIID0gJChSRUFMTFlfU0VUX0xJQl9QQVRIKS8nIFwKKyAgICAgIE1ha2VmaWxlID4gTWFrZWZpbGUudGVtCisgIHJtIC1mIE1ha2VmaWxlCisgIG12IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQorCisgIGNhc2UgIiR7aG9zdH0iIGluCisgICotKi1ocHV4KikKKyAgICBzZWQgLWUgJ3MvXlJQQVRIX0VOVlZBUlsgCV0qPS4qJC9SUEFUSF9FTlZWQVIgPSBTSExJQl9QQVRILycgXAorCU1ha2VmaWxlID4gTWFrZWZpbGUudGVtCisgICAgcm0gLWYgTWFrZWZpbGUKKyAgICBtdiAtZiBNYWtlZmlsZS50ZW0gTWFrZWZpbGUKKyAgICA7OworICBlc2FjCitmaQorCisjIFJlY29yZCB0YXJnZXRfY29uZmlnZGlycyBhbmQgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMgaW4gTWFrZWZpbGUuCit0YXJnZXRfY29uZmlnZGlycz1gZWNobyAiJHt0YXJnZXRfY29uZmlnZGlyc30iIHwgc2VkIC1lICdzL3RhcmdldC0vL2cnYAordGFyZ2FyZ3M9YGVjaG8gIiR7YXJndW1lbnRzfSIgfCBcCisJc2VkIC1lICdzLy0tbm9bXiAJXSovLycgXAorCSAgICAtZSAncy8tLWNhY2hlW2Etei1dKj1bXiAJXSovLycgXAorCSAgICAtZSAncy8tLWhvW2Etei1dKj1bXiAJXSovLycgXAorCSAgICAtZSAncy8tLWJ1W2Etei1dKj1bXiAJXSovLycgXAorCSAgICAtZSAncy8tLXRhW2Etei1dKj1bXiAJXSovLydgCisKKyMgUGFzc2luZyBhIC0td2l0aC1jcm9zcy1ob3N0IGFyZ3VtZW50IGxldHMgdGhlIHRhcmdldCBsaWJyYXJpZXMga25vdworIyB3aGV0aGVyIHRoZXkgYXJlIGJlaW5nIGJ1aWx0IHdpdGggYSBjcm9zcy1jb21waWxlciBvciBiZWluZyBidWlsdAorIyBuYXRpdmUuICBIb3dldmVyLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIG90aGVyIG1lY2hhbmlzbXMgdG8gbWFrZSB0aGUKKyMgc29ydHMgb2YgZGVjaXNpb25zIHRoZXkgd2FudCB0byBtYWtlIG9uIHRoaXMgYmFzaXMuICBQbGVhc2UgY29uc2lkZXIKKyMgdGhpcyBvcHRpb24gdG8gYmUgZGVwcmVjYXRlZC4gIEZJWE1FLgoraWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gPSB4eWVzIF07IHRoZW4KKyAgdGFyZ2FyZ3M9Ii0td2l0aC1jcm9zcy1ob3N0PSR7aG9zdF9hbGlhc30gJHt0YXJnYXJnc30iCitmaQorCisjIERlZmF1bHQgdG8gLS1lbmFibGUtbXVsdGlsaWIuCitpZiBbIHgke2VuYWJsZV9tdWx0aWxpYn0gPSB4IF07IHRoZW4KKyAgdGFyZ2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7dGFyZ2FyZ3N9IgorZmkKKworIyBQYXNzIC0td2l0aC1uZXdsaWIgaWYgYXBwcm9wcmlhdGUuICBOb3RlIHRoYXQgdGFyZ2V0X2NvbmZpZ2RpcnMgaGFzCisjIGNoYW5nZWQgZnJvbSB0aGUgZWFybGllciBzZXR0aW5nIG9mIHdpdGhfbmV3bGliLgoraWYgWyB4JHt3aXRoX25ld2xpYn0gIT0geG5vIF0gJiYgZWNobyAiICR7dGFyZ2V0X2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgbmV3bGliICIgPiAvZGV2L251bGwgMj4mMSAmJiBbIC1kICR7c3JjZGlyfS9uZXdsaWIgXSA7IHRoZW4KKyAgdGFyZ2FyZ3M9Ii0td2l0aC1uZXdsaWIgJHt0YXJnYXJnc30iCitmaQorCisjIHByb3ZpZGUgYSBwcm9wZXIgZ3h4X2luY2x1ZGVfZGlyLgorIyBOb3RlLCBpZiB5b3UgY2hhbmdlIHRoZSBkZWZhdWx0LCBtYWtlIHN1cmUgdG8gZml4IGJvdGggaGVyZSBhbmQgaW4KKyMgdGhlIGdjYywgbGliaW8sIGxpYnN0ZGMrKyBhbmQgbGliZysrIHN1YmRpcmVjdG9yaWVzLgorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1neHgtaW5jbHVkZS1kaXIgb3IgLS13aXRob3V0LWd4eC1pbmNsdWRlLWRpciB3YXMgZ2l2ZW4uCitneHhfaW5jbHVkZV9kaXI9CitpZiB0ZXN0IC1uICIke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfSI7IHRoZW4KKyAgY2FzZSAiJHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0iIGluCisgICAgeWVzICkKKyAgICAgIGVjaG8gImNvbmZpZ3VyZS5pbjogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGdpdmVuIGZvciBnKysgaW5jbHVkZSBkaXJlY3RvcnkiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBubyApCisgICAgICA7OworICAgICogKQorICAgICAgZ3h4X2luY2x1ZGVfZGlyPSR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9CisgICAgICA7OworICBlc2FjCitmaQoraWYgdGVzdCB4JHtneHhfaW5jbHVkZV9kaXJ9ID0geDsgdGhlbgorICBpZiB0ZXN0IHgke2VuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlic30gPSB4eWVzOyB0aGVuCisgICAgZ3h4X2luY2x1ZGVfZGlyPScke2xpYnN1YmRpcn0vaW5jbHVkZS9nKysnCisgIGVsc2UKKyAgICAuICR7dG9wc3JjZGlyfS9jb25maWcuaWYKKyAgICBneHhfaW5jbHVkZV9kaXI9JyR7cHJlZml4fS9pbmNsdWRlL2crKyctJHtsaWJzdGRjeHhfaW50ZXJmYWNlfQorICBmaQorZWxzZQorICBneHhfaW5jbHVkZV9kaXI9JHtneHhfaW5jbHVkZV9kaXJ9CitmaQorCit0YXJnYXJncz0iLS1ob3N0PSR7dGFyZ2V0X2FsaWFzfSAtLWJ1aWxkPSR7YnVpbGRfYWxpYXN9ICR7dGFyZ2FyZ3N9Igorc2VkIC1lICJzOl5UQVJHRVRfQ09ORklHRElSU1sgCV0qPS4qJDpUQVJHRVRfQ09ORklHRElSUyA9ICR7dGFyZ2V0X2NvbmZpZ2RpcnN9OiIgXAorICAgIC1lICJzJV5DT05GSUdfQVJHVU1FTlRTWyAJXSo9LiokJUNPTkZJR19BUkdVTUVOVFMgPSAke3RhcmdhcmdzfSUiIFwKKyAgICAtZSAicyVeVEFSR0VUX1NVQkRJUlsgCV0qPS4qJCVUQVJHRVRfU1VCRElSID0gJHt0YXJnZXRfc3ViZGlyfSUiIFwKKyAgICAtZSAicyVeZ3h4X2luY2x1ZGVfZGlyWyAJXSo9LiokJWd4eF9pbmNsdWRlX2Rpcj0ke2d4eF9pbmNsdWRlX2Rpcn0lIiBcCisgICAgICAgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KK3JtIC1mIE1ha2VmaWxlCittdiAtZiBNYWtlZmlsZS50ZW0gTWFrZWZpbGUKKworIworIyBMb2NhbCBWYXJpYWJsZXM6CisjIGZpbGwtY29sdW1uOiAxMzEKKyMgRW5kOgorIwpkaWZmIC0tZ2l0IGEvZXRjL0NoYW5nZUxvZyBiL2V0Yy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1M2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1MDcgQEAKKzE5OTktMDQtMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogYWRkLWxvZy5lbCwgYWRkLWxvZy52aTogTmV3IGZpbGVzLgorCitXZWQgSmFuIDIwIDAxOjMzOjUwIDE5OTkgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBjb21wLXRvb2xzLXZlcmlmeTogUmVtb3ZlIHNvbWUgY2hlY2tzIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZC4KKworMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0ZG9jL2ZyMzAudGV4aTogTmV3IGRvY3VtZW50LgorCQorVGh1IE9jdCAgMSAyMToxNTo1OSAxOTk4ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKKworCSogY29tcC10b29scy1maXgsIGNyb3NzLXRvb2xzLWZpeDogUmVwbGFjZSAvdXNyL2luY2x1ZGUKKwl3aXRoICR7RklYSU5DRElSfS4KKworVHVlIEF1ZyAxMSAxOToyMjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtYWtlLXJlbC1zeW0tdHJlZSAodmVyc2lvbik6IFVwZGF0ZSBjYWxjdWxhdGlvbi4KKworRnJpIEp1biAxMiAyMTozNDowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50ZXhpOiBWYXJpb3VzIGFkZGl0aW9ucy4KKwkqIE1ha2VmaWxlLmluIChURVhJMkhUTUwsIERWSVBTKTogTmV3IHZhcmlhYmxlcy4KKwkoc3RhbmRhcmRzLnBzKTogTmV3IHRhcmdldC4KKwkoY29uZmlndXJlLmR2aSk6IENvcHkgLnRpbiBmaWxlcyBpbiBhcyB3ZWxsLgorCShjb25maWd1cmUucHMsIGNvbmZpZ3VyZS5odG1sKTogTmV3IHRhcmdldHMuCisJKGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2Rldi5qcGcgYW5kIGNvbmZpZ2J1aWxkLmpwZy4KKwkqIGNvbmZpZ2Rldi5maWc6IE5ldyBmaWxlLgorCSogY29uZmlnZGV2LmVpbjogTmV3IGZpbGUgKEVQUyB2ZXJzaW9uIG9mIGNvbmZpZ2Rldi5maWcpLgorCSogY29uZmlnZGV2LmppbjogTmV3IGZpbGUgKEpQRUcgdmVyc2lvbiBvZiBjb25maWdkZXYuZmlnKS4KKwkqIGNvbmZpZ2J1aWxkLmZpZzogTmV3IGZpbGUuCisJKiBjb25maWdidWlsZC5laW46IE5ldyBmaWxlIChFUFMgdmVyc2lvbiBvZiBjb25maWdidWlsZC5maWcpLgorCSogY29uZmlnYnVpbGQuamluOiBOZXcgZmlsZSAoSlBFRyB2ZXJzaW9uIG9mIGNvbmZpZ2J1aWxkLmZpZykuCisKK1dlZCBKdW4gMTAgMTQ6NDE6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGV4aTogTmV3IGZpbGUuCisJKiBjb25maWdkZXYudGluOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ2J1aWxkLnRpbjogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoTUFLRUlORk8pOiBVc2UgbWFrZWluZm8gZnJvbSB0ZXhpbmZvIGRpcmVjdG9yeSBpZgorCWl0IGV4aXN0cy4KKwkoVEVYSTJEVkkpOiBMaWtld2lzZSBmb3IgdGV4aTJkdmkuCisJKElORk9GSUxFUyk6IEFkZCBjb25maWd1cmUuaW5mby4KKwkoRFZJRklMRVMpOiBBZGQgY29uZmlndXJlLmR2aS4KKwkoaW5mbyk6IE9ubHkgYnVpbGQgaW5mbyBmaWxlcyBpZiB0aGUgc291cmNlIGZpbGVzIGV4aXN0LgorCShpbnN0YWxsLWluZm8pOiBPbmx5IGluc3RhbGwgaW5mbyBmaWxlcyBpZiB0aGV5IGV4aXN0LgorCShkdmkpOiBPbmx5IGJ1aWxkIERWSSBmaWxlcyBpZiB0aGUgc291cmNlcyBmaWxlcyBleGlzdC4KKwkoY29uZmlndXJlLmluZm8pOiBOZXcgdGFyZ2V0LgorCShjb25maWd1cmUuZHZpKTogTmV3IHRhcmdldC4KKwkoY2xlYW4pOiBSZW1vdmUgY29uZmlnZGV2IGFuZCBjb25maWdidWlsZCBkZXJpdmVkIGZpbGVzLgorCisJUmVtb3ZlIG9ic29sZXRlIGRvY3VtZW50YXRpb24uCisJKiBpbnRyby50ZXhpOiBSZW1vdmUuCisJKiBpbnN0YWxsLnRleGk6IFJlbW92ZS4KKwkqIGNvbmZpZy1uYW1lcy50ZXhpOiBSZW1vdmUuCisJKiBzY3JlZW4xLmVwczogUmVtb3ZlLgorCSogc2NyZWVuMS5vYmo6IFJlbW92ZS4KKwkqIHNjcmVlbjIuZXBzOiBSZW1vdmUuCisJKiBzY3JlZW4yLm9iajogUmVtb3ZlLgorCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBhYm92ZS4KKworVGh1IE1heSAyMSAxNDozNDo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBBZGQgbm90ZSBhYm91dCBpZ25vcmluZyBsaW5rZXIKKwl3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB1c2luZyAtLXN1cHBvcnQtb2xkLWNvZGUuCisKK01vbiBNYXkgMTggMTQ6Mjc6MzcgMTk5OCAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW4sIGNvbXAtdG9vbHMtZml4LCBjb21wLXRvb2xzLXZlcmlmeSwgY3Jvc3MtdG9vbHMtZml4OgorCVVzZSAkR0NDdm4gcmF0aGVyIHRoYW4gc3Vic3RpdHV0ZSBldmVyeXdoZXJlLgorCitUaHUgTWF5IDE0IDE0OjQzOjEwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IERvY3VtZW50IGRsbHRvb2wgc3VwcG9ydCBvZgorCWludGVyd29ya2luZy4gCisKK1RodSBNYXkgIDcgMTY6NDk6MzggMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIFRDTF9MSUJSQVJZLCBUS19MSUJSQVJZLAorCWFuZCBHREJUS19GSUxFTkFNRS4KKworV2VkIEFwciAgMSAxNzoxMTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB0YXJnZXRkb2MvYXJtLWludGVyd29yay50ZXhpOiBEb2N1bWVudCBBUk0vdGh1bWIgaW50ZXJ3b3JraW5nLiAKKworVHVlIE1hciAzMSAxNToyODoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb25zLgorCSogTWFrZWZpbGUuaW4gKHN0YW5kYXJkcy5pbmZvKTogRGVwZW5kIHVwb24gbWFrZS1zdGQudGV4aS4KKworVHVlIE1hciAyNCAxNjoxMzoyNiAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+CisKKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEgdG8gZml4IHNoZWxsIGlzc3VlcworCWZvciBOVCBuYXRpdmUgYnVpbGRzLiAKKworTW9uIE1hciAgOSAxNjo0MTowNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtYWtlLXJlbC1zeW0tdHJlZSAoYmlucHJvZ3MpOiBBZGQgb2JqY29weS4KKworVHVlIEZlYiAyNCAxODoxMTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtYWtlLXJlbC1zeW0tdHJlZTogYXMubmV3IC0+IGFzLW5ldywgbGQubmV3IC0+IGxkLW5ldworCW5tLm5ldyAtPiBubS1uZXcuICBNYWtlIHN5bWxpbmtzIHRvIGNydCouby4KKworRnJpIE5vdiAyMSAxMjo1NDo1OCAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSogTWFrZWZpbGUuaW46IEFkZCAtLW5vLXNwbGl0IGFyZ3VtZW50IHRvIGF2b2lkIGNyZWF0aW5nIGZpbGVzCisJd2l0aCBuYW1lcyBsb25nZXIgdGhhbiAxNCBjaGFyYWN0ZXJzLgorCitUaHUgU2VwIDI1IDEzOjEzOjExIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwZXJuLmN5Z251cy5jb20pCisKKwkqIGludHJvLnRleGk6IEFkZCBjbG9zaW5nIGlmc2V0LgorCitNb24gU2VwICAxIDEwOjMxOjMyIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBJbnN0YWxsLmluOiBNb3ZlIHNldHRpbmcgSE9TVCBhbmQgVEFSR0VUIHRvIHRoZSBiZWdpbm5pbmcKKwlvZiB0aGUgZmlsZSBmb3IgZWRpdGluZyBjb252ZW5pZW5jZS4KKworTW9uIFNlcCAgMSAxMDoyODozNyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKKworCSogSW5zdGFsbC5pbi46IE1vcmUgZnJpZW5kbHkgb3B0aW9ucy9tZXNzYWdlcyB3aGVuIGV4dHJhY3RpbmcKKwlmcm9tIGEgZmlsZSBpbnN0ZWFkIG9mIGEgdGFwZSBkZXZpY2UuCisKK1R1ZSBKdW4gMTcgMTU6NTA6MjMgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IEFkZCAvdXNyL2JzZCB0byBQQVRIIGZvciBJcml4IChob21lIG9mIGNvbXByZXNzKQorCitUaHUgSnVuIDEyIDEzOjQ3OjAwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisgICAgICAgICogSW5zdGFsbC5pbiAoc2hvd19leGVjX3ByZWZpeF9tc2cpOiBmaXggcXVvdGluZworCitXZWQgSnVuICA0IDE1OjMxOjQzIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIHJlYnVpbGRpbmcudGV4aTogUmVtb3ZlZC4KKworU2F0IE1heSAyNCAxODowMjoyMCAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKKworCSogY3Jvc3MtdG9vbHMtZml4OiAgUmVtb3ZlIGhvc3QgY2hlY2sgc2luY2UgaXQgZG9lc24ndCBtYXR0ZXIKKwlmb3IgdGhpcyBjYXNlLgorCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogY2xlYW4gdXAgbW9yZSB1bnVzZWQgaG9zdHMuCisJKiBJbnN0YWxsLmluLCBjcm9zcy10b29scy1maXgsIGNvbXAtdG9vbHMtZml4LCBjb21wLXRvb2xzLXZlcmlmeToKKwlIYWNrIGZvciBob3N0IGNoZWNrIHRvIG5vdCB3YXJuIHRoZSB1c2VyIGZvciBjZXJ0YWluIGNhc2VzLgorCitGcmkgTWF5IDIzIDIzOjQ2OjEwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBzdWJzdC1zdHJpbmdzOiBSZW1vdmUgYSBsb3Qgb2YgdW51c2VkIGNvZGUKKwkqIEluc3RhbGwuaW46IFJlbW92ZSByZWZlcmVuY2UgdG8gVEFQRWRmbHQsIHVzZSB2YXJpYWJsZXMgaW5zdGVhZCBvZgorCXN0cmluZyBzdWJzdGl0dXRpb24gd2hlbiBhYmxlLgorCitGcmkgQXByIDExIDE3OjI1OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZmlsZSBuYW1lZCBpbiBBQ19JTklUIHRvIE1ha2VmaWxlLmluLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgQXByIDExIDE4OjEyOjQyIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IEJhY2sgb3V0IGNoYW5nZSB0byBJTlNUQUxMSE9TVCB0bworCWNhbGwgYWxsIElSSVggc3lzdGVtcyAibWlwcy1zZ2ktaXJpeDQiCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25maWd1cmUudGV4aSBhbmQgY2ZnLXBhcGVyLnRleGkuCisKK1RodSBBcHIgMTAgMjM6MjY6NDUgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogc3JjdHJlZS50ZXhpLCBlbWFjcy1yZWxub3Rlcy50ZXhpLCBjZmctcGFwZXIudGV4aTogUmVtb3ZlLgorCSogSW5zdGFsbC5pbjogUmVtb3ZlIFVsdHJpeC1zcGVjaWZpYyBoYWNrcy4KKwlVcGRhdGUgQ3lnbnVzIHBob25lIG51bWJlcnMuCisJKGd1ZXNzX3N5c3RlbSk6IFJlbW92ZSBzb21lIG9sZCBzeXN0ZW1zIChVbHRyaXgsIE9TRjEgdjEgJiAyLAorCW02OGstSFBVWCwgbTY4ayBTdW5PUywgZXRjLikKKwkoc2hvd19nbnVfcm9vdF9tc2cpOiBSZW1vdmUuCisJUmVtb3ZlZCBhbGwgdGhlIHJlbW92ZSBvcHRpb24gY29kZS4KKworVGh1IEFwciAxMCAyMzoyMzozMyAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBjb25maWd1cmUubWFuLCBjb25maWd1cmUudGV4aTogUmVtb3RlLgorCitNb24gQXByICA3IDE4OjE1OjAwIDE5OTcgIEJyZW5kYW4gS2Vob2UgPGJyZW5kYW5AY3lnbnVzLmNvbT4KKworICAgICAgICAqIEZpeCB0aGUgdmVyc2lvbiBzdHJpbmcgZm9yIE9TRjEgNC4wIHRvIHJlY29nbml6ZSBlaXRoZXIKKyAgICAgICAgVjQuKiBvciBYNC4qCisKK01vbiBBcHIgIDcgMTU6MzQ6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdGFuZGFyZHMudGV4aSwgbWFrZS1zdGRzLnRleGk6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9ucy4KKworVHVlIE5vdiAxOSAxNTozNjoxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtYWtlLXJlbC1zeW0tdHJlZTogTmV3IGZpbGUuCisKK1dlZCBPY3QgMjMgMDA6MzQ6MDcgMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCisKKwkqIExvdHMgb2YgcGF0Y2hlcyBmcm9tIHByb2dyZXNzaXZlLi4uCisgCSogSW5zdGFsbC5pbjogcmVzdG9yZSBERE9QVFMgZm9yIEFJWCA0LngKKyAJKiBJbnN0YWxsLmluLCBzdWJzdC1zdHJpbmdzOiBhZGQgY2FzZSBmb3IgREcgQXZpaW9uCisgCSogc3Vic3Qtc3RyaW5nczogZml4IHR5cG8gaW4gSU5TVEFMTGRpciB2YXIgc2V0dGluZworIAkqIGNvbXAtdG9vbHMtdmVyaWZ5OiBzZXQgU0hMSUJfUEFUSCBmb3Igc2hhcmVkIGxpYnMKKyAJKiBJbnN0YWxsLmluLCBzdWJzdC1zdHJpbmdzOiAgYWRkIGNhc2UgZm9yIHNvbGFyaXMyLjUKKyAJKiBJbnN0YWxsLmluOiBmaXggcmVncmVzc2lvbiBmb3IgaHBwYTEuMSBjaGVjaworIAkqIGNvbXAtdG9vbHMtZml4OiBzZXQgTERfTElCUkFSWV9QQVRICisgCSogY29tcC10b29scy1maXg6IElmIGZpeGluY2x1ZGVzIGZpeGVzIC91c3IvaW5jbHVkZS9saW1pdHMuaCwKKyAJaW5zdGFsbCBpdCBhcyBzeXNsaW1pdHMuaC4KKworV2VkIE9jdCAxNiAxOToyMDo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IFRyZWF0IHBvd2VycGMtaWJtLWFpeDQuMSB0aGUgc2FtZSBhcworCXJzNjAwMC1pYm0tYWl4NC4xLCBzaW5jZSB0aGUgY29tcGlsZXIgbm93IHVzZXMgY29tbW9uIG1vZGUgYnkKKwlkZWZhdWx0LgorCitXZWQgT2N0ICAyIDE1OjM5OjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZS4KKworV2VkIE9jdCAgMiAxNDozMzo1OCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBjb25maWd1cmUuaW46IFN3aXRjaCB0byBhdXRvY29uZiBjb25maWd1cmUuaW4uCisJKiBjb25maWd1cmU6IE5ldy4KKwkqIE1ha2VmaWxlLmluOiBVc2UgYXV0b2NvbmYtc3Vic3RpdHV0ZWQgdmFsdWVzLgorCitUdWUgSnVuIDI1IDE4OjU2OjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogQ2hhbmdlZCB0byAkKHByZWZpeCkvc2hhcmUuCisKK0ZyaSBNYXIgMjkgMTE6Mzg6MDEgMTk5NiAgSi5ULiBDb25rbGluICAoanRjQGxpc2EuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLm1hbjogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgorCitXZWQgRGVjICA2IDE1OjQwOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbXAtdG9vbHMtZml4IChmaXhpbmNsdWRlcyk6IERlZmluZSBGSVhQUk9UT19ERUZJTkVTIGZyb20KKwkuLi4vaW5zdGFsbC10b29scy9maXhwcm90by1kZWZpbmVzLgorCitTdW4gTm92IDEyIDE5OjMxOjI3IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb21wLXRvb2xzLXZlcmlmeSAodmVyaWZ5X2N4eF9pbml0aWFsaXplcnMpOiBkZWxldGUgYXJndiwKKwlhcmdjIGRlY2xhcmF0aW9ucywgYWRkIC1zdGF0aWMgdG8gY29tcGlsZSBsaW5lLgorCSh2ZXJpZnlfY3h4X2hlbGxvX3dvcmxkKTogZGVsZXRlIGFyZ3YsIGFyZ2MgZGVjbGFyYXRpb25zLCBhZGQKKwktc3RhdGljIHRvIGNvbXBpbGUgbGluZS4KKworV2VkIFNlcCAyMCAxMzoyMTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKKwlyZWFsY2xlYW4uCisKK01vbiBBdWcgMjggMTc6MjU6NDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW4gKFBBVEgpOiAgYWRkIC91c3IvdWNiIHRvICRQQVRIIChmb3IgU3VuT1MgNC4xLngpLgorCitUdWUgQXVnIDE1IDIxOjUxOjU4IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBNYXRjaCBPU0YvMSB2My54IGFzIHRoZSBzYW1lIGFzIAorICAgICAgICB2Mi54LS12Mi54IGJpbmFyaWVzIGFyZSB1cHdhcmQgY29tcGF0aWJsZS4KKworVHVlIEF1ZyAxNSAyMTo0Njo1NCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogcmVjb2duaXplIEhQIDkwMDAvODAwIHN5c3RlbXMgYXMgdGhlCisJc2FtZSBhcyBIUCA5MDAwLzcwMCBzeXN0ZW1zLgorCitUdWUgQXVnICA4IDEzOjExOjU2IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogSW5zdGFsbC5pbjogRm9yIGVtYWNzLCBydW4gc2hvd19lbWFjc19hbHRlcm5hdGVfbXNnIGFuZCBleGl0LgorCShzaG93X2VtYWNzX2FsdGVybmF0ZV9tc2cpOiBOZXcgbWVzc2FnZSBzYXlpbmcgaG93IGVtYWNzIGNhbid0IGJlCisJaW5zdGFsbGVkIGluIGFuIGFsdGVybmF0ZSBwcmVmaXguCisKK1RodSBKdW4gIDggMDA6NDI6NTYgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyAgPGFuZ2VsYUBjaXJkYW4uY3lnbnVzLmNvbT4KKworICAgICAgICAqIHN1YnN0LXN0cmluZ3M6IGNoYW5nZSBkdSBjb21tYW5kcyB0byAkQklORElSLy4gJiAkU1JDRElSLy4ganVzdAorICAgICAgICBpbiBjYXNlIHRoZXkgYXJlIHN5bWxpbmtzLgorCitUdWUgQXByIDE4IDE0OjIzOjEwIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY2RrLWZpeDogRXh0cmFjdGVkIHRhYmxlIG9mIHRhcmdldHMgdGhhdCBkb24ndCBuZWVkIHRoZWlyCisJICBoZWFkZXJzIGZpeGVkIGZyb20gZ2NjJ3MgY29uZmlndXJlIHNjcmlwdC4KKworCSogY2RrLWZpeCwgY2RrLXZlcmlmeTogVXNlICR7SE9TVH0gaW5zdGVhZCBvZiB8fEhPU1RzdHJ8fAorCisJKiBjZGstZml4LCBjZGstdmVyaWZ5OiBOZXcgZmlsZXMsIGluc3RhbGwgc2NyaXB0IGZyYWdtZW50cyB1c2VkCisJICBmb3IgQ3lnbnVzIERldmVsb3BlcidzIEtpdC4KKworCSogSW5zdGFsbC5pbiAoZG9fbWtkaXIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIEluc3RhbGwuaW46IEFkZGVkIHN1cHBvcnQgZm9yIC0td2l0aCBhbmQgLS13aXRob3V0IG9wdGlvbnMuCisJICBDaGFuZ2VkIHNvIHRoYXQgdGFwZSBjb21tYW5kcyBhcmUgbm90IHJ1biB3aGVuIGV4dHJhY3RpbmcgCisJICBmcm9tIGEgZmlsZS4KKwkgIChkb19tdCk6IENoYW5nZWQgdG8gdGFrZSBvbmx5IG9uZSBhcmd1bWVudC4KKworV2VkIE1hciAyOSAxMToxNjozOCAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBJbnN0YWxsLmluOiBjYXRjaCBVTkFNRT09YWxwaGEtZGVjLW9zZjIueCBhbmQgY29ycmVjdCBlbnRyeSBmb3IKKwlhbHBoYS1kZWMtb3NmMS54CisJCitGcmkgSmFuIDI3IDEyOjA0OjI5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogc3Vic3Qtc3RyaW5ncyAobWlwcy1zZ2ktaXJpeDUpOiBOZXcgZW50cnkgaW4gdGFibGUuCisKK1RodSBKYW4gMTkgMTI6MTU6NDQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBJbnN0YWxsLmluOiBNYWpvciByZXdyaXRlLCBidW5kbGUgZGVwZW5kZW50IGNvZGUgKGZvciBleGFtcGxlLAorCSAgZml4aW5jbHVkZXMgZm9yIGNvbXAtdG9vbHMpIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgSW5zdGFsbAorCSAgc2NyaXB0IHdoZW4gaXQgaXMgZ2VuZXJhdGVkLgorCitUdWUgSmFuIDE3IDE2OjUxOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogUmVidWlsZCB1c2luZyAkKFNIRUxMKS4KKworVGh1IE5vdiAgMyAxOTozMDozMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGluZm8uCisKK0ZyaSBBdWcgMTkgMTY6MTY6MzggMTk5NCAgSmFzb24gTW9sZW5kYSAgICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IHNldCAkRklYX0hFQURFUiBzbyBmaXhwcm90byBjYW4gZmluZCBmaXgtaGVhZGVyLgorCitGcmkgTWF5ICA2IDE2OjE4OjU4IDE5OTQgIEphc29uIE1vbGVuZGEgICAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IGFkZCBhIHNlbWljb2xvbiBpbiB0aGUgaWYgc3RhdGVtZW50LgorCitGcmkgQXByIDI5IDE2OjU2OjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY2ZnLXBhcGVyLnRleGk6IFVwZGF0ZSBzb21lIG91dGRhdGVkIGluZm9ybWF0aW9uLgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogUGFzcyBmaWxlLCBub3QgZGlyZWN0b3J5LCBhcyBsYXN0CisJYXJnIHRvIElOU1RBTExfREFUQS4KKwkodW5pbnN0YWxsKTogTmV3IHRhcmdldC4KKworVGh1IEFwciAyOCAxNDo0MjoyMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS50ZXhpOiBDb21tZW50IG91dCBAc21hbGxib29rLgorCisJKiBNYWtlZmlsZS5pbjogRGVmaW5lIFRFWEkyRFZJIGFuZCBURVhJRElSLCBhbmQgdXNlIHRoZSBsYXR0ZXIuCisJUmVtb3ZlIGluZm8gZmlsZXMgaW4gcmVhbGNsZWFuLCBub3QgY2xlYW4sIHBlciBjb2Rpbmcgc3RhbmRhcmRzLgorCVJlbW92ZSBUZVggb3V0cHV0IGluIGNsZWFuLgorCitUdWUgQXByIDI2IDE3OjE4OjAzIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQorCisgICAgICAgICogSW5zdGFsbC5pbjogIGZpeGluY2x1ZGVzIG91dHB1dCBpcyBhY3R1YWxseSBwdXQgaW4gZml4aW5jbHVkZXMubG9nLAorICAgICAgICBidXQgZWNobydlZCBtZXNzYWdlcyBjbGFpbSBpdCBpcyBmaXhpbmMubG9nLiAgVGhpcyBpcyB0aGUgc2FtZQorCW1lc3NhZ2VzIGFzIEkgbG9nZ2VkIGluIE1hcmNoIDQgMTk5NCwgYnV0IGZvciBzb21lIHJlYXNvbiB3ZSBmb3VuZAorCXRoZSBjaGFuZ2UgaGFkbid0IGJlZW4gZG9uZS4gIEknbGwgaGF2ZSB0byBkaWcgdGhyb3VnaCB0aGUgbG9ncworCWFuZCBmaW5kIG91dCB3aGF0IEkgcmVhbGx5IGRpZCBkbyB0aGF0IGRheS4gOikKKworTW9uIEFwciAyNSAyMDoyODoxOSAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBJbnN0YWxsLmluOiAgdXNlIGV2YWwgdG8gY2FsbCBkb19tdCgpIGZvciBVbHRyaXggYnJva2VubmVzcy4KKworTW9uIEFwciAyNSAyMDowMDowMCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBJbnN0YWxsLmluKGRvX210KTogZXhpdCB3aXRoIGVycm9yIHN0YXR1cyAxIGlmICMgb2YgcGFyYW1ldGVycworCSE9IDMuCisKK01vbiBBcHIgMjUgMTk6NDI6MzYgMTk5NCAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogSW5zdGFsbC5pbjogIGxvc2UgVEFQRV9GT1JXQVJEIGFuZCBUQVBFX1JFV0lORCwgYWRkIGRvX210KCkKKwl0byBkbyBhbGwgdGFwZSBtb3ZlbWVudCBvcGVyYXRpb25zLiAgQ3VycmVudGx5IHVudGVzdGVkLiAgQWRkcmVzc2VzCisJUFIgIyA0ODg2IGZyb20gYnVsbC4KKworCSogSW5zdGFsbC5pbjogYWRkIDE5OTQgdG8gdGhlIGNvcHlyaWdodCB0aGluZy4KKworRnJpIEFwciAyMiAxOTowNToxMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIHN0YW5kYXJkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCisKK0ZyaSBBcHIgMjIgMTU6NDY6MTAgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAY3lnbnVzLmNvbSkKKworCSogSW5zdGFsbC5pbjogQWRkICRERE9QVFMsIGhhcyBgYGJzPTEyNGInJyBmb3IgYWxsIHN5c3RlbXMgZXhjZXB0CisJQUlYIChzb21lIHZlcnNpb25zIG9mIEFJWCBkb24ndCB1bmRlcnN0YW5kIGJzPTEyNGIuICBTaWxseSBPUykuCisKK01vbiBBcHIgIDQgMjI6NTU6MDUgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IG51bGwgb3V0ICRUT09MUyBiZWZvcmUgYWRkaW5nIHN0dWZmIHRvIGl0CisJbm9uLWRlc3RydWN0aXZlbHkuCisKK1dlZCBNYXIgMzAgMjE6NDU6MzUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBzdGFuZGFyZHMudGV4aTogRml4IHR5cG8uCisKKwkqIGNvbmZpZ3VyZS50ZXhpLCBjb25maWd1cmUubWFuOiBEb2N1bWVudCAtLWRpc2FibGUtLgorCitNb24gTWFyIDI4IDEzOjIyOjE1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogc3RhbmRhcmRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KKworU2F0IE1hciAyNiAwOToyMTo0NCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgorCitGcmkgTWFyIDI1IDIyOjU5OjQ1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLnRleGksIGNvbmZpZ3VyZS5tYW46IERvY3VtZW50IC0tZW5hYmxlLSogb3B0aW9ucy4KKworV2VkIE1hciAyMyAyMzozODoyNCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IHNldCBDUFAgdG8gYmUgZ2NjIC1FIGZvciBmaXhpbmNsdWRlcy4KKworV2VkIE1hciAyMyAxMzo0Mjo0OCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBJbnN0YWxsLmluOiBzZXQgUEFUSCB0byAkUEFUSDovYmluOi91c3IvYmluIHNvIHdlIGNhbiBwaWNrCisgICAgICAgIHVwIG5hdGl2ZSB0b29scyBldmVuIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGVtIGluIGhpcworICAgICAgICBwYXRoLgorCisgICAgICAgICogSW5zdGFsbC5pbjogYGBocHBhLTEuMS1ocC1ocHV4JycgLT4gYGBocHBhMS4xLWhwLWhwdXgnJy4KKworVHVlIE1hciAxNSAyMjowOToyMCAxOTk0ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCisgICAgICAgIAorICAgICAgICAqIEluc3RhbGwuaW46IFRBUEVfUkVXSU5EIGFuZCBUQVBFX0ZPUldBUkQgdmFyaWFibGVzIGZvciBVbml4dW5hd2FyZSwKKyAgICAgICAgYWRkZWQgc3dpdGNoIHN0YXRlbWVudCB0byBkZXRlY3QgaWYgc3lzdGVtIGlzIFVuaXh1bmF3YXJlLgorCitGcmkgTWFyICA0IDEyOjEwOjMwIDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQorCisgICAgICAgICogSW5zdGFsbC5pbjogIGZpeGluY2x1ZGVzIG91dHB1dCBpcyBhY3R1YWxseSBwdXQgaW4gZml4aW5jbHVkZXMubG9nLAorICAgICAgICBidXQgZWNobydlZCBtZXNzYWdlcyBjbGFpbSBpdCBpcyBmaXhpbmMubG9nLgorCitXZWQgTm92ICAzIDAyOjU4OjAyIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzdWJzdC1zdHJpbmdzOiAgb3V0cHV0IFRFWEJVTkRMRSBmb3IgbW9yZSBpbnN0YWxsIG5vdGVzIG1hdGNoaW5nCisJKiBpbnN0YWxsLXRleGkuaW46ICBQUk1TIGluZm8gbm93IGV4aXN0cworCitUdWUgT2N0IDI2IDE2OjU3OjEyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogc3Vic3Qtc3RyaW5nczogbWF0Y2ggc29sYXJpcyouICBBbHNvLCBhZGQgZGVmYXVsdCBjYXNlIHRvIGNhdGNoCisJICBhbmQgZXJyb3Igb3V0IGZvciB1bnJlY29nbml6ZWQgc3lzdGVtcy4KKworVGh1IEF1ZyAxOSAxODoyMTozMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IGhhbmRsZSB0aGUgbmV3IGZpeHByb3RvIHdvcmsKKworTW9uIEp1bCAxOSAxMjowNTo0MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IHJlbW92ZSAiTVQ9dGN0bCIgZm9yIEFJWCAobm90IG5lZWRlZCwgYW5kIGJhcmVseQorCXdvcmtlZCBhbnl3YXkpCisKK01vbiBKdW4gMTQgMTk6MDk6MjIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKKworCSogc3Vic3Qtc3RyaW5nczogY2hhbmdlZCBIT1NUIHRvIHJlY29nbml6ZSBTb2xhcmlzIGZvciBpbnN0YWxsIG5vdGVzCisKK1RodSBKdW4gMTAgMTY6MDE6MjUgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKKworCSogZG9zLWluc3QudGV4aTogIG5ldyBmaWxlLgorCitXZWQgSnVuICA5IDE5OjIzOjU5IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QHJ0bC5jeWdudXMuY29tKQorCisgICAgICAgICogaW5zdGFsbC10ZXhpLmluOiAgICAgICAgYWRkZWQgY29uZGl0aW9uYWxzIChuZWFybHkgY29tcGxldGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5lZCB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIHJlbGVhc2VzIChub3QgZG9uZSkKKworV2VkIEp1biAgOSAxNTo1Mzo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBJTlNUQUxMX0RBVEEuCisJKHtkaXN0LHJlYWx9Y2xlYW4pOiBBbHNvIGRlbGV0ZSBNYWtlZmlsZSBhbmQgY29uZmlnLnN0YXR1cy4KKworRnJpIEp1biAgNCAxNzowOTo1NiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQorCisJKiBzdWJzdC1zdHJpbmdzOiAgYWRkZWQgZGF0YSBmb3IgT1NfU1RSSU5HCisKKwkqIHN1YnN0LXN0cmluZ3M6ICBhZGRlZCBzdXBwb3J0IGZvciBPU19TVFJJTkcKKworVGh1IEp1biAgMyAwMDozNzowMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIEluc3RhbGwuaW46IHB1bGwgQ09QWUlORyBhbmQgQ09QWUlORy5MSUIgb2ZmIG9mIHRoZSB0YXBlIAorCitUdWUgSnVuICAxIDE2OjUyOjA4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3Vic3Qtc3RyaW5nczogcmVwbGFjZSBSRUxFQVNFX0RJUiB0b28KKworTW9uIE1hciAyMiAyMzo1NToyNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAorCitXZWQgTWFyIDE3IDAyOjIxOjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogSW5zdGFsbC5pbjogZml4ICdzb3VyY2Ugb25seScgZXh0cmFjdGlvbiBidWcgd2hlcmUgaXQgbG9va2VkIGZvcgorCXRoZSBzcmMgZGlyIHVuZGVyIEgtPGhvc3Q+L3NyYyBpbnN0ZWFkIG9mIHNyYzsgYWxzbyByZW1vdmUgc3RyYXkKKwlyZWZlcmVuY2UgdG8gRU1BQ1NISUJJTgorCitNb24gTWFyIDE1IDAxOjI1OjQ1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogbWFrZS1zdGRzLnRleGk6IGFkZGVkICdpbnN0YWxsY2hlY2snIHRvIHRoZSBzdGFuZGFyZCB0YXJnZXRzCisKK1R1ZSBNYXIgIDkgMTk6NDg6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBzdGFuZGFyZHMudGV4aTogYWRkZWQgSU5GTy1ESVItRU5UUlksIHVwZGF0ZWQgdmVyc2lvbiBmcm9tIHRoZSBGU0YKKworVHVlIEZlYiAgOSAxMjo0MDoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChzdGFuZGFyZHMuaW5mbyk6IEFkZGVkIC1JJChzcmNkaXIpIHRvIGZpbmQKKwltYWtlLXN0ZHMudGV4aS4KKworTW9uIEZlYiAgMSAxNjozMjo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHN0YW5kYXJkcy50ZXhpOiB1cGRhdGVkIHRvIGxhdGVzdCBGU0YgdmVyc2lvbiwgd2hpY2ggaW5jbHVkZXM6CisKKwkqIG1ha2Utc3Rkcy50ZXhpOiBuZXcgZmlsZQorCitNb24gTm92IDMwIDAxOjMxOjQwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogaW5zdGFsbC10ZXhpLmluLCByZWxub3Rlcy50ZXhpLCBpbnRyby50ZXhpOiBjaGFuZ2VkIEN5Z251cyBwaG9uZQorCW51bWJlcnMgZnJvbSB0aGUgb2xkIFBhbG8gQWx0byBvbmVzIHRvIHRoZSBuZXcgTXRuLiBWaWV3IG51bWJlcnMKKworTW9uIE5vdiAxNiAxNjo1MDo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBkZWZpbmUgJChSTSkgdG8gInJtIC1mIgorCitTdW4gT2N0IDExIDE2OjA1OjQ4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogaW50cm8udGV4aTogYWRkZWQgSU5GTy1ESVItRU5UUlkKKwpkaWZmIC0tZ2l0IGEvZXRjL01ha2VmaWxlLmluIGIvZXRjL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZGM4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNTYgQEAKKyMgCisjIE1ha2VmaWxlLmluIGZvciBldGMKKyMKKworcHJlZml4IAkJPSBAcHJlZml4QAorZXhlY19wcmVmaXggCT0gQGV4ZWNfcHJlZml4QAorCitzcmNkaXIgID0gQHNyY2RpckAKK1ZQQVRICT0gQHNyY2RpckAKKworYmluZGlyICA9IEBiaW5kaXJACitsaWJkaXIgID0gQGxpYmRpckAKK3Rvb2xkaXIgPSAkKGxpYmRpcikKK2RhdGFkaXIgPSBAZGF0YWRpckAKKworbWFuZGlyICA9IEBtYW5kaXJACittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK21hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgorbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCittYW40ZGlyID0gJChtYW5kaXIpL21hbjQKK21hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQorbWFuNmRpciA9ICQobWFuZGlyKS9tYW42CittYW43ZGlyID0gJChtYW5kaXIpL21hbjcKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorbWFuOWRpciA9ICQobWFuZGlyKS9tYW45CitpbmZvZGlyID0gQGluZm9kaXJACisKK1NIRUxMID0gL2Jpbi9zaAorCitJTlNUQUxMIAk9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSAgICA9IEBJTlNUQUxMX0RBVEFACisKK01BS0VJTkZPID0gYGlmIFsgLWYgLi4vdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbyBdOyBcCisJdGhlbiBlY2hvIC4uL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm87IFwKKwllbHNlIGVjaG8gbWFrZWluZm87IGZpYAorVEVYSTJEVkkgPSBgaWYgWyAtZiAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmkgXTsgXAorCXRoZW4gZWNobyAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IFwKKwllbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAorVEVYSTJIVE1MID0gdGV4aTJodG1sCitEVklQUyA9IGR2aXBzCisKKyMgV2hlcmUgdG8gZmluZCB0ZXhpbmZvLnRleCB0byBmb3JtYXQgZG9jdW1lbnRhdGlvbiB3aXRoIFRlWC4KK1RFWElESVIgPSAkKHNyY2RpcikvLi4vdGV4aW5mbworCisjIyMjIEhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KKyMjIworCitJTkZPRklMRVMgPSBzdGFuZGFyZHMuaW5mbyBjb25maWd1cmUuaW5mbworRFZJRklMRVMgPSBzdGFuZGFyZHMuZHZpIGNvbmZpZ3VyZS5kdmkKKworYWxsOgorCitpbnN0YWxsOgorCit1bmluc3RhbGw6CisKK2luZm86CisJZm9yIGYgaW4gJChJTkZPRklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmluZm8kJC8udGV4aS8nYDsgdGhlbiBcCisJICAgIGlmICQoTUFLRSkgIk1BS0VJTkZPPSQoTUFLRUlORk8pIiAkJGY7IHRoZW4gXAorCSAgICAgIHRydWU7IFwKKwkgICAgZWxzZSBcCisJICAgICAgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWRvbmUKKworaW5zdGFsbC1pbmZvOiBpbmZvCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21raW5zdGFsbGRpcnMgJChpbmZvZGlyKQorCWlmIHRlc3QgISAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBjZCAkKHNyY2Rpcik7IGZpOyBcCisJaWYgdGVzdCAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBcCisJICBmb3IgaSBpbiBzdGFuZGFyZHMuaW5mbyo7IGRvIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgXAorCSAgZG9uZTsgXAorCWZpCisJaWYgdGVzdCAhIC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIGNkICQoc3JjZGlyKTsgZmk7IFwKKwlpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIFwKKwkgIGZvciBpIGluIGNvbmZpZ3VyZS5pbmZvKjsgZG8gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoaW5mb2RpcikvJCRpOyBcCisJICBkb25lOyBcCisJZmkKKworZHZpOgorCWZvciBmIGluICQoRFZJRklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmR2aSQkLy50ZXhpLydgOyB0aGVuIFwKKwkgICAgaWYgJChNQUtFKSAiVEVYSTJEVkk9JChURVhJMkRWSSkiICQkZjsgdGhlbiBcCisJICAgICAgdHJ1ZTsgXAorCSAgICBlbHNlIFwKKwkgICAgICBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZG9uZQorCitzdGFuZGFyZHMuaW5mbzogJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpICQoc3JjZGlyKS9tYWtlLXN0ZHMudGV4aQorCSQoTUFLRUlORk8pIC0tbm8tc3BsaXQgLUkkKHNyY2RpcikgLW8gc3RhbmRhcmRzLmluZm8gJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpCisKK3N0YW5kYXJkcy5kdmk6ICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQorCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQorCitzdGFuZGFyZHMucHM6IHN0YW5kYXJkcy5kdmkKKwkkKERWSVBTKSBzdGFuZGFyZHMuZHZpIC1vIHN0YW5kYXJkcy5wcworCisjIG1ha2VpbmZvIHJlcXVpcmVzIGltYWdlcyB0byBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCitjb25maWd1cmUuaW5mbzogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpICQoc3JjZGlyKS9jb25maWdkZXYudGluICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4KKwlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAorCWNwICQoc3JjZGlyKS9jb25maWdkZXYudGluIGNvbmZpZ2Rldi50eHQKKwljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluIGNvbmZpZ2J1aWxkLnR4dAorCSQoTUFLRUlORk8pIC1JJChzcmNkaXIpIC1vIGNvbmZpZ3VyZS5pbmZvICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQorCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0CisKKyMgdGV4aTJkdmkgd2FudHMgYm90aCB0aGUgLnR4dCBhbmQgdGhlIC5lcHMgZmlsZXMuCitjb25maWd1cmUuZHZpOiAkKHNyY2RpcikvY29uZmlndXJlLnRleGkgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluCisJcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKKwljcCAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiBjb25maWdkZXYudHh0CisJY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiBjb25maWdidWlsZC50eHQKKwlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcworCWNwICQoc3JjZGlyKS9jb25maWdkZXYuZWluIGNvbmZpZ2Rldi5lcHMKKwljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluIGNvbmZpZ2J1aWxkLmVwcworCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQorCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0CisJcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKKworIyBkdmlwcyByZXF1aXJlcyBpbWFnZXMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5Citjb25maWd1cmUucHM6IGNvbmZpZ3VyZS5kdmkgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbgorCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCisJY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gY29uZmlnZGV2LmVwcworCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4gY29uZmlnYnVpbGQuZXBzCisJJChEVklQUykgY29uZmlndXJlLmR2aSAtbyBjb25maWd1cmUucHMKKwlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcworCitjb25maWd1cmUuaHRtbDogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCisJJChURVhJMkhUTUwpIC1zcGxpdF9jaGFwdGVyICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQorCitjbGVhbjoKKwlybSAtZiAqLmF1eCAqLmNwICouY3BzICouZHZpICouZm4gKi5mbnMgKi5reSAqLmt5cyAqLmxvZworCXJtIC1mICoucGcgKi5wZ3MgKi50b2MgKi50cCAqLnRwcyAqLnZyICoudnJzCisJcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKKwlybSAtZiBjb25maWdkZXYuanBnIGNvbmZpZ2J1aWxkLmpwZworCittb3N0bHljbGVhbjogY2xlYW4KKworZGlzdGNsZWFuOiAgIGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKKworbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46ICAgZGlzdGNsZWFuCisJcm0gLWYgKi5pbmZvKgorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQoaG9zdF9tYWtlZmlsZV9mcmFnKSAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIyB0aGVzZSBsYXN0IHRhcmdldHMgYXJlIGZvciBzdGFuZGFyZHMudGV4aSBjb25mb3JtYW5jZQorZGlzdDoKK2NoZWNrOgoraW5zdGFsbGNoZWNrOgorVEFHUzoKZGlmZiAtLWdpdCBhL2V0Yy9hZGQtbG9nLmVsIGIvZXRjL2FkZC1sb2cuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjODhlOAotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9hZGQtbG9nLmVsCkBAIC0wLDAgKzEsNTczIEBACis7OzsgPT09PT09PT09PT09IE5PVEUgV0VMTCEgPT09PT09PT09PT09PQorOzs7Cis7OzsgWW91IG9ubHkgbmVlZCB0byB1c2UgdGhpcyBmaWxlIGlmIHlvdSdyZSB1c2luZyBhIHZlcnNpb24gb2YgRW1hY3MKKzs7OyBwcmlvciB0byAyMC4xIHRvIHdvcmsgb24gR0RCLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKKzs7OyBhbmQgdGhlIHN0YW5kYXJkIGFkZC1sb2cuZWwgcHJvdmlkZWQgd2l0aCAxOS4zNCBpcyB0aGF0IGl0Cis7OzsgZ2VuZXJhdGVzIGRhdGVzIHVzaW5nIHRoZSB0ZXJzZXIgZm9ybWF0IHVzZWQgYnkgRW1hY3MgMjAuICBUaGlzIGlzCis7OzsgdGhlIGZvcm1hdCByZWNvbW1lbmRlZCBmb3IgdXNlIGluIEdEQiBDaGFuZ2VMb2dzLgorOzs7Cis7OzsgVG8gdXNlIHRoaXMgY29kZSwgeW91IHNob3VsZCBjcmVhdGUgYSBkaXJlY3RvcnkgYH4vZWxpc3AnLCBzYXZlIHRoZSBjb2RlCis7OzsgYmVsb3cgaW4gYH4vZWxpc3AvYWRkLWxvZy5lbCcsIGFuZCB0aGVuIHB1dCBzb21ldGhpbmcgbGlrZSB0aGlzIGluCis7OzsgeW91ciBgfi8uZW1hY3MnIGZpbGUsIHRvIHRlbGwgRW1hY3Mgd2hlcmUgdG8gZmluZCBpdDoKKzs7OyAKKzs7OyAoc2V0cSBsb2FkLXBhdGgKKzs7OyAgICAgICAoY29ucyAoZXhwYW5kLWZpbGUtbmFtZSAifi9lbGlzcCIpCis7OzsgICAgICAgICAgICAgbG9hZC1wYXRoKSkKKzs7OyAKKzs7OyBJZiB5b3Ugd2FudCwgeW91IGNhbiBhbHNvIGJ5dGUtY29tcGlsZSBpdCAtLS0gaXQnbGwgcnVuIGEgbGl0dGxlCis7OzsgZmFzdGVyLCBhbmQgdXNlIGEgbGl0dGxlIGxlc3MgbWVtb3J5LiAgKE5vdCB0aGF0IHRob3NlIG1hdHRlciBtdWNoIGZvcgorOzs7IHRoaXMgZmlsZS4pICBUbyBkbyB0aGF0LCBhZnRlciB5b3UndmUgc2F2ZWQgdGhlIHRleHQgYXMKKzs7OyB+L2VsaXNwL2FkZC1sb2cuZWwsIGJyaW5nIGl0IHVwIGluIEVtYWNzLCBhbmQgdHlwZQorOzs7IAorOzs7ICAgICBDLXUgTS14IGJ5dGUtY29tcGlsZS1maWxlCis7OzsKKzs7OyAtLS0gSmltIEJsYW5keQorCis7OzsgYWRkLWxvZy5lbCAtLS0gY2hhbmdlIGxvZyBtYWludGVuYW5jZSBjb21tYW5kcyBmb3IgRW1hY3MKKworOzsgQ29weXJpZ2h0IChDKSAxOTg1LCAxOTg2LCAxOTg4LCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCis7OyBLZXl3b3JkczogbWFpbnQKKworOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgorCis7OyBHTlUgRW1hY3MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKzs7IGFueSBsYXRlciB2ZXJzaW9uLgorCis7OyBHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCis7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorOzsgYWxvbmcgd2l0aCBHTlUgRW1hY3M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKzs7IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorOzsgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBUaGlzIGZhY2lsaXR5IGlzIGRvY3VtZW50ZWQgaW4gdGhlIEVtYWNzIE1hbnVhbC4KKworOzs7IENvZGU6CisKKyhkZWZ2YXIgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUgbmlsCisgICIqTmFtZSBvZiBhIGNoYW5nZSBsb2cgZmlsZSBmb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldLiIpCisKKyhkZWZ2YXIgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWZ1bmN0aW9uIG5pbAorICAiXAorKklmIG5vbi1uaWwsIGZ1bmN0aW9uIHRvIGd1ZXNzIG5hbWUgb2YgY3VycmVudCBmdW5jdGlvbiBmcm9tIHN1cnJvdW5kaW5nIHRleHQuCitcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0gY2FsbHMgdGhpcyBmdW5jdGlvbiAoaWYgbmlsLCBgYWRkLWxvZy1jdXJyZW50LWRlZnVuJworaW5zdGVhZCkgd2l0aCBubyBhcmd1bWVudHMuICBJdCByZXR1cm5zIGEgc3RyaW5nIG9yIG5pbCBpZiBpdCBjYW5ub3QgZ3Vlc3MuIikKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ2YXIgYWRkLWxvZy1mdWxsLW5hbWUgbmlsCisgICIqRnVsbCBuYW1lIG9mIHVzZXIsIGZvciBpbmNsdXNpb24gaW4gQ2hhbmdlTG9nIGRhaWx5IGhlYWRlcnMuCitUaGlzIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYHVzZXItZnVsbC1uYW1lJyBmdW5jdGlvbi4iKQorCis7OzsjIyNhdXRvbG9hZAorKGRlZnZhciBhZGQtbG9nLW1haWxpbmctYWRkcmVzcyBuaWwKKyAgIipFbGVjdHJvbmljIG1haWwgYWRkcmVzcyBvZiB1c2VyLCBmb3IgaW5jbHVzaW9uIGluIENoYW5nZUxvZyBkYWlseSBoZWFkZXJzLgorVGhpcyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgYHVzZXItbWFpbC1hZGRyZXNzJy4iKQorCisoZGVmdmFyIGNoYW5nZS1sb2ctZm9udC1sb2NrLWtleXdvcmRzCisgICcoKCJeW1NNVFdGXS4rIiAuIGZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpCTsgRGF0ZSBsaW5lLgorICAgICgiXlx0XFwqIFxcKFteIDpcbl0rXFwpIiAxIGZvbnQtbG9jay1jb21tZW50LWZhY2UpCTsgRmlsZSBuYW1lLgorICAgICgiKFxcKFteKVxuXStcXCkpOiIgMSBmb250LWxvY2sta2V5d29yZC1mYWNlKSkJOyBGdW5jdGlvbiBuYW1lLgorICAiQWRkaXRpb25hbCBleHByZXNzaW9ucyB0byBoaWdobGlnaHQgaW4gQ2hhbmdlIExvZyBtb2RlLiIpCisKKyhkZWZ2YXIgY2hhbmdlLWxvZy1tb2RlLW1hcCBuaWwKKyAgIktleW1hcCBmb3IgQ2hhbmdlIExvZyBtYWpvciBtb2RlLiIpCisoaWYgY2hhbmdlLWxvZy1tb2RlLW1hcAorICAgIG5pbAorICAoc2V0cSBjaGFuZ2UtbG9nLW1vZGUtbWFwIChtYWtlLXNwYXJzZS1rZXltYXApKQorICAoZGVmaW5lLWtleSBjaGFuZ2UtbG9nLW1vZGUtbWFwICJcTS1xIiAnY2hhbmdlLWxvZy1maWxsLXBhcmFncmFwaCkpCisKKyhkZWZ1biBjaGFuZ2UtbG9nLW5hbWUgKCkKKyAgKG9yIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lCisgICAgICAoaWYgKGVxIHN5c3RlbS10eXBlICd2YXgtdm1zKSAKKwkgICIkQ0hBTkdFX0xPRyQuVFhUIiAKKwkoaWYgKG9yIChlcSBzeXN0ZW0tdHlwZSAnbXMtZG9zKSAoZXEgc3lzdGVtLXR5cGUgJ3dpbmRvd3MtbnQpKQorCSAgICAiY2hhbmdlbG8iCisJICAiQ2hhbmdlTG9nIikpKSkKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSAoKQorICAiUHJvbXB0IGZvciBhIGNoYW5nZSBsb2cgbmFtZS4iCisgIChsZXQqICgoZGVmYXVsdCAoY2hhbmdlLWxvZy1uYW1lKSkKKwkgKG5hbWUgKGV4cGFuZC1maWxlLW5hbWUKKwkJKHJlYWQtZmlsZS1uYW1lIChmb3JtYXQgIkxvZyBmaWxlIChkZWZhdWx0ICVzKTogIiBkZWZhdWx0KQorCQkJCW5pbCBkZWZhdWx0KSkpKQorICAgIDs7IEhhbmRsZSBzb21ldGhpbmcgdGhhdCBpcyBzeW50YWN0aWNhbGx5IGEgZGlyZWN0b3J5IG5hbWUuCisgICAgOzsgTG9vayBmb3IgQ2hhbmdlTG9nIG9yIHdoYXRldmVyIGluIHRoYXQgZGlyZWN0b3J5LgorICAgIChpZiAoc3RyaW5nPSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBuYW1lKSAiIikKKwkoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBkZWZhdWx0KQorCQkJICBuYW1lKQorICAgICAgOzsgSGFuZGxlIHNwZWNpZnlpbmcgYSBmaWxlIHRoYXQgaXMgYSBkaXJlY3RvcnkuCisgICAgICAoaWYgKGZpbGUtZGlyZWN0b3J5LXAgbmFtZSkKKwkgIChleHBhbmQtZmlsZS1uYW1lIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGRlZmF1bHQpCisJCQkgICAgKGZpbGUtbmFtZS1hcy1kaXJlY3RvcnkgbmFtZSkpCisJbmFtZSkpKSkKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBmaW5kLWNoYW5nZS1sb2cgKCZvcHRpb25hbCBmaWxlLW5hbWUpCisgICJGaW5kIGEgY2hhbmdlIGxvZyBmaWxlIGZvciBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0gYW5kIHJldHVybiB0aGUgbmFtZS4KKworT3B0aW9uYWwgYXJnIEZJTEUtTkFNRSBzcGVjaWZpZXMgdGhlIGZpbGUgdG8gdXNlLgorSWYgRklMRS1OQU1FIGlzIG5pbCwgdXNlIHRoZSB2YWx1ZSBvZiBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnLgorSWYgJ2NoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJyBpcyBuaWwsIGJlaGF2ZSBhcyB0aG91Z2ggaXQgd2VyZSAnQ2hhbmdlTG9nJworXChvciB3aGF0ZXZlciB3ZSB1c2Ugb24gdGhpcyBvcGVyYXRpbmcgc3lzdGVtKS4KKworSWYgJ2NoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJyBjb250YWlucyBhIGxlYWRpbmcgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbgorc2ltcGx5IGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlLCBzZWFyY2ggaW4gdGhlIGN1cnJlbnQgCitkaXJlY3RvcnkgYW5kIGl0cyBzdWNjZXNzaXZlIHBhcmVudHMgZm9yIGEgZmlsZSBzbyBuYW1lZC4KKworT25jZSBhIGZpbGUgaXMgZm91bmQsIGBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgaXMgc2V0IGxvY2FsbHkgaW4gdGhlCitjdXJyZW50IGJ1ZmZlciB0byB0aGUgY29tcGxldGUgZmlsZSBuYW1lLiIKKyAgOzsgSWYgdXNlciBzcGVjaWZpZWQgYSBmaWxlIG5hbWUgb3IgaWYgdGhpcyBidWZmZXIga25vd3Mgd2hpY2ggb25lIHRvIHVzZSwKKyAgOzsganVzdCB1c2UgdGhhdC4KKyAgKG9yIGZpbGUtbmFtZQorICAgICAgKHNldHEgZmlsZS1uYW1lIChhbmQgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUKKwkJCSAgIChmaWxlLW5hbWUtZGlyZWN0b3J5IGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKQorCQkJICAgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpKQorICAgICAgKHByb2duCisJOzsgQ2hhc2UgbGlua3MgaW4gdGhlIHNvdXJjZSBmaWxlCisJOzsgYW5kIHVzZSB0aGUgY2hhbmdlIGxvZyBpbiB0aGUgZGlyIHdoZXJlIGl0IHBvaW50cy4KKwkoc2V0cSBmaWxlLW5hbWUgKG9yIChhbmQgYnVmZmVyLWZpbGUtbmFtZQorCQkJCSAoZmlsZS1uYW1lLWRpcmVjdG9yeQorCQkJCSAgKGZpbGUtY2hhc2UtbGlua3MgYnVmZmVyLWZpbGUtbmFtZSkpKQorCQkJICAgIGRlZmF1bHQtZGlyZWN0b3J5KSkKKwkoaWYgKGZpbGUtZGlyZWN0b3J5LXAgZmlsZS1uYW1lKQorCSAgICAoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgKGNoYW5nZS1sb2ctbmFtZSkgZmlsZS1uYW1lKSkpCisJOzsgQ2hhc2UgbGlua3MgYmVmb3JlIHZpc2l0aW5nIHRoZSBmaWxlLgorCTs7IFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBhIHNpbmdsZSBjaGFuZ2UgbG9nIGZpbGUKKwk7OyBmb3Igc2V2ZXJhbCByZWxhdGVkIGRpcmVjdG9yaWVzLgorCShzZXRxIGZpbGUtbmFtZSAoZmlsZS1jaGFzZS1saW5rcyBmaWxlLW5hbWUpKQorCShzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlLW5hbWUpKQorCTs7IE1vdmUgdXAgaW4gdGhlIGRpciBoaWVyYXJjaHkgdGlsbCB3ZSBmaW5kIGEgY2hhbmdlIGxvZyBmaWxlLgorCShsZXQgKChmaWxlMSBmaWxlLW5hbWUpCisJICAgICAgcGFyZW50LWRpcikKKwkgICh3aGlsZSAoYW5kIChub3QgKG9yIChnZXQtZmlsZS1idWZmZXIgZmlsZTEpIChmaWxlLWV4aXN0cy1wIGZpbGUxKSkpCisJCSAgICAgIChwcm9nbiAoc2V0cSBwYXJlbnQtZGlyCisJCQkJICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkKKwkJCQkgICAgKGRpcmVjdG9yeS1maWxlLW5hbWUKKwkJCQkgICAgIChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUxKSkpKQorCQkJICAgICA7OyBHaXZlIHVwIGlmIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSByb290IGRpci4KKwkJCSAgICAgKG5vdCAoc3RyaW5nPSAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlMSkKKwkJCQkJICAgcGFyZW50LWRpcikpKSkKKwkgICAgOzsgTW92ZSB1cCB0byB0aGUgcGFyZW50IGRpciBhbmQgdHJ5IGFnYWluLgorCSAgICAoc2V0cSBmaWxlMSAoZXhwYW5kLWZpbGUtbmFtZSAKKwkJCSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSAoY2hhbmdlLWxvZy1uYW1lKSkKKwkJCSBwYXJlbnQtZGlyKSkpCisJICA7OyBJZiB3ZSBmb3VuZCBhIGNoYW5nZSBsb2cgaW4gYSBwYXJlbnQsIHVzZSB0aGF0LgorCSAgKGlmIChvciAoZ2V0LWZpbGUtYnVmZmVyIGZpbGUxKSAoZmlsZS1leGlzdHMtcCBmaWxlMSkpCisJICAgICAgKHNldHEgZmlsZS1uYW1lIGZpbGUxKSkpKSkKKyAgOzsgTWFrZSBhIGxvY2FsIHZhcmlhYmxlIGluIHRoaXMgYnVmZmVyIHNvIHdlIG5lZWRuJ3Qgc2VhcmNoIGFnYWluLgorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkgZmlsZS1uYW1lKQorICBmaWxlLW5hbWUpCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4gYWRkLWNoYW5nZS1sb2ctZW50cnkgKCZvcHRpb25hbCB3aG9hbWkgZmlsZS1uYW1lIG90aGVyLXdpbmRvdyBuZXctZW50cnkpCisgICJGaW5kIGNoYW5nZSBsb2cgZmlsZSBhbmQgYWRkIGFuIGVudHJ5IGZvciB0b2RheS4KK09wdGlvbmFsIGFyZyAoaW50ZXJhY3RpdmUgcHJlZml4KSBub24tbmlsIG1lYW5zIHByb21wdCBmb3IgdXNlciBuYW1lIGFuZCBzaXRlLgorU2Vjb25kIGFyZyBpcyBmaWxlIG5hbWUgb2YgY2hhbmdlIGxvZy4gIElmIG5pbCwgdXNlcyBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnLgorVGhpcmQgYXJnIE9USEVSLVdJTkRPVyBub24tbmlsIG1lYW5zIHZpc2l0IGluIG90aGVyIHdpbmRvdy4KK0ZvdXJ0aCBhcmcgTkVXLUVOVFJZIG5vbi1uaWwgbWVhbnMgYWx3YXlzIGNyZWF0ZSBhIG5ldyBlbnRyeSBhdCB0aGUgZnJvbnQ7CituZXZlciBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgZW50cnkuIgorICAoaW50ZXJhY3RpdmUgKGxpc3QgY3VycmVudC1wcmVmaXgtYXJnCisJCSAgICAgKHByb21wdC1mb3ItY2hhbmdlLWxvZy1uYW1lKSkpCisgIChvciBhZGQtbG9nLWZ1bGwtbmFtZQorICAgICAgKHNldHEgYWRkLWxvZy1mdWxsLW5hbWUgKHVzZXItZnVsbC1uYW1lKSkpCisgIChvciBhZGQtbG9nLW1haWxpbmctYWRkcmVzcworICAgICAgKHNldHEgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MgdXNlci1tYWlsLWFkZHJlc3MpKQorICAoaWYgd2hvYW1pCisgICAgICAocHJvZ24KKwkoc2V0cSBhZGQtbG9nLWZ1bGwtbmFtZSAocmVhZC1pbnB1dCAiRnVsbCBuYW1lOiAiIGFkZC1sb2ctZnVsbC1uYW1lKSkKKwkgOzsgTm90ZSB0aGF0IHNvbWUgc2l0ZXMgaGF2ZSByb29tIGFuZCBwaG9uZSBudW1iZXIgZmllbGRzIGluCisJIDs7IGZ1bGwgbmFtZSB3aGljaCBsb29rIHNpbGx5IHdoZW4gaW5zZXJ0ZWQuICBSYXRoZXIgdGhhbiBkbworCSA7OyBhbnl0aGluZyBhYm91dCB0aGF0IGhlcmUsIGxldCB1c2VyIGdpdmUgcHJlZml4IGFyZ3VtZW50IHNvIHRoYXQKKwkgOzsgcy9oZSBjYW4gZWRpdCB0aGUgZnVsbCBuYW1lIGZpZWxkIGluIHByb21wdGVyIGlmIHMvaGUgd2FudHMuCisJKHNldHEgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MKKwkgICAgICAocmVhZC1pbnB1dCAiTWFpbGluZyBhZGRyZXNzOiAiIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzKSkpKQorICAobGV0ICgoZGVmdW4gKGZ1bmNhbGwgKG9yIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1mdW5jdGlvbgorCQkJICAgICdhZGQtbG9nLWN1cnJlbnQtZGVmdW4pKSkKKwlwYXJhZ3JhcGgtZW5kIGVudHJ5KQorCisgICAgKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIChmaW5kLWNoYW5nZS1sb2cgZmlsZS1uYW1lKSkpCisKKyAgICA7OyBTZXQgRU5UUlkgdG8gdGhlIGZpbGUgbmFtZSB0byB1c2UgaW4gdGhlIG5ldyBlbnRyeS4KKyAgICAoYW5kIGJ1ZmZlci1maWxlLW5hbWUKKwkgOzsgTmV2ZXIgd2FudCB0byBhZGQgYSBjaGFuZ2UgbG9nIGVudHJ5IGZvciB0aGUgQ2hhbmdlTG9nIGZpbGUgaXRzZWxmLgorCSAobm90IChzdHJpbmc9IGJ1ZmZlci1maWxlLW5hbWUgZmlsZS1uYW1lKSkKKwkgKHNldHEgZW50cnkgKGlmIChzdHJpbmctbWF0Y2gKKwkJCSAgKGNvbmNhdCAiXiIgKHJlZ2V4cC1xdW90ZSAoZmlsZS1uYW1lLWRpcmVjdG9yeQorCQkJCQkJICAgICBmaWxlLW5hbWUpKSkKKwkJCSAgYnVmZmVyLWZpbGUtbmFtZSkKKwkJCSAoc3Vic3RyaW5nIGJ1ZmZlci1maWxlLW5hbWUgKG1hdGNoLWVuZCAwKSkKKwkJICAgICAgIChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGJ1ZmZlci1maWxlLW5hbWUpKSkpCisKKyAgICAoaWYgKGFuZCBvdGhlci13aW5kb3cgKG5vdCAoZXF1YWwgZmlsZS1uYW1lIGJ1ZmZlci1maWxlLW5hbWUpKSkKKwkoZmluZC1maWxlLW90aGVyLXdpbmRvdyBmaWxlLW5hbWUpCisgICAgICAoZmluZC1maWxlIGZpbGUtbmFtZSkpCisgICAgKG9yIChlcSBtYWpvci1tb2RlICdjaGFuZ2UtbG9nLW1vZGUpCisJKGNoYW5nZS1sb2ctbW9kZSkpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAobGV0ICgoaGVhZGluZyAoZm9ybWF0ICIlcyAgJXMgIDwlcz4iCisJCQkgICAoZm9ybWF0LXRpbWUtc3RyaW5nICIlWS0lbS0lZCIpCisJCQkgICBhZGQtbG9nLWZ1bGwtbmFtZQorCQkJICAgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpKSkKKyAgICAgIChpZiAobG9va2luZy1hdCAocmVnZXhwLXF1b3RlIGhlYWRpbmcpKQorCSAgKGZvcndhcmQtbGluZSAxKQorCShpbnNlcnQgaGVhZGluZyAiXG5cbiIpKSkKKworICAgIDs7IFNlYXJjaCBvbmx5IHdpdGhpbiB0aGUgZmlyc3QgcGFyYWdyYXBoLgorICAgIChpZiAobG9va2luZy1hdCAiXG4qW15cbiogXHRdIikKKwkoc2tpcC1jaGFycy1mb3J3YXJkICJcbiIpCisgICAgICAoZm9yd2FyZC1wYXJhZ3JhcGggMSkpCisgICAgKHNldHEgcGFyYWdyYXBoLWVuZCAocG9pbnQpKQorICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisKKyAgICA7OyBOb3cgaW5zZXJ0IHRoZSBuZXcgbGluZSBmb3IgdGhpcyBlbnRyeS4KKyAgICAoY29uZCAoKHJlLXNlYXJjaC1mb3J3YXJkICJeXFxzICpcXCpcXHMgKiQiIHBhcmFncmFwaC1lbmQgdCkKKwkgICA7OyBQdXQgdGhpcyBmaWxlIG5hbWUgaW50byB0aGUgZXhpc3RpbmcgZW1wdHkgZW50cnkuCisJICAgKGlmIGVudHJ5CisJICAgICAgIChpbnNlcnQgZW50cnkpKSkKKwkgICgoYW5kIChub3QgbmV3LWVudHJ5KQorCQkobGV0IChjYXNlLWZvbGQtc2VhcmNoKQorCQkgIChyZS1zZWFyY2gtZm9yd2FyZAorCQkgICAoY29uY2F0IChyZWdleHAtcXVvdGUgKGNvbmNhdCAiKiAiIGVudHJ5KSkKKwkJCSAgIDs7IERvbid0IGFjY2VwdCBgZm9vLmJhcicgd2hlbgorCQkJICAgOzsgbG9va2luZyBmb3IgYGZvbyc6CisJCQkgICAiXFwoXFxzIFxcfFsoKSw6XVxcKSIpCisJCSAgIHBhcmFncmFwaC1lbmQgdCkpKQorCSAgIDs7IEFkZCB0byB0aGUgZXhpc3RpbmcgZW50cnkgZm9yIHRoZSBzYW1lIGZpbGUuCisJICAgKHJlLXNlYXJjaC1mb3J3YXJkICJeXFxzICokXFx8XlxccyBcXCoiKQorCSAgIChnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAwKSkKKwkgICA7OyBEZWxldGUgZXhjZXNzIGVtcHR5IGxpbmVzOyBtYWtlIGp1c3QgMi4KKwkgICAod2hpbGUgKGFuZCAobm90IChlb2JwKSkgKGxvb2tpbmctYXQgIl5cXHMgKiQiKSkKKwkgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLWxpbmUgMSkgKHBvaW50KSkpKQorCSAgIChpbnNlcnQgIlxuXG4iKQorCSAgIChmb3J3YXJkLWxpbmUgLTIpCisJICAgKGluZGVudC1yZWxhdGl2ZS1tYXliZSkpCisJICAodAorCSAgIDs7IE1ha2UgYSBuZXcgZW50cnkuCisJICAgKGZvcndhcmQtbGluZSAxKQorCSAgICh3aGlsZSAobG9va2luZy1hdCAiXFxzVyIpCisJICAgICAoZm9yd2FyZC1saW5lIDEpKQorCSAgICh3aGlsZSAoYW5kIChub3QgKGVvYnApKSAobG9va2luZy1hdCAiXlxccyAqJCIpKQorCSAgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtbGluZSAxKSAocG9pbnQpKSkpCisJICAgKGluc2VydCAiXG5cblxuIikKKwkgICAoZm9yd2FyZC1saW5lIC0yKQorCSAgIChpbmRlbnQtdG8gbGVmdC1tYXJnaW4pCisJICAgKGluc2VydCAiKiAiIChvciBlbnRyeSAiIikpKSkKKyAgICA7OyBOb3cgaW5zZXJ0IHRoZSBmdW5jdGlvbiBuYW1lLCBpZiB3ZSBoYXZlIG9uZS4KKyAgICA7OyBQb2ludCBpcyBhdCB0aGUgZW50cnkgZm9yIHRoaXMgZmlsZSwKKyAgICA7OyBlaXRoZXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBvciBhdCB0aGUgZmlyc3QgYmxhbmsgbGluZS4KKyAgICAoaWYgZGVmdW4KKwkocHJvZ24KKwkgIDs7IE1ha2UgaXQgZWFzeSB0byBnZXQgcmlkIG9mIHRoZSBmdW5jdGlvbiBuYW1lLgorCSAgKHVuZG8tYm91bmRhcnkpCisJICAoaW5zZXJ0IChpZiAoc2F2ZS1leGN1cnNpb24KKwkJCShiZWdpbm5pbmctb2YtbGluZSAxKQorCQkJKGxvb2tpbmctYXQgIlxccyAqJCIpKSAKKwkJICAgICAgIiIKKwkJICAgICIgIikKKwkJICAiKCIgZGVmdW4gIik6ICIpKQorICAgICAgOzsgTm8gZnVuY3Rpb24gbmFtZSwgc28gcHV0IGluIGEgY29sb24gdW5sZXNzIHdlIGhhdmUganVzdCBhIHN0YXIuCisgICAgICAoaWYgKG5vdCAoc2F2ZS1leGN1cnNpb24KKwkJIChiZWdpbm5pbmctb2YtbGluZSAxKQorCQkgKGxvb2tpbmctYXQgIlxccyAqXFwoXFwqXFxzICpcXCk/JCIpKSkKKwkgIChpbnNlcnQgIjogIikpKSkpCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4gYWRkLWNoYW5nZS1sb2ctZW50cnktb3RoZXItd2luZG93ICgmb3B0aW9uYWwgd2hvYW1pIGZpbGUtbmFtZSkKKyAgIkZpbmQgY2hhbmdlIGxvZyBmaWxlIGluIG90aGVyIHdpbmRvdyBhbmQgYWRkIGFuIGVudHJ5IGZvciB0b2RheS4KK09wdGlvbmFsIGFyZyAoaW50ZXJhY3RpdmUgcHJlZml4KSBub24tbmlsIG1lYW5zIHByb21wdCBmb3IgdXNlciBuYW1lIGFuZCBzaXRlLgorU2Vjb25kIGFyZyBpcyBmaWxlIG5hbWUgb2YgY2hhbmdlIGxvZy4gIFwKK0lmIG5pbCwgdXNlcyBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnLiIKKyAgKGludGVyYWN0aXZlIChpZiBjdXJyZW50LXByZWZpeC1hcmcKKwkJICAgKGxpc3QgY3VycmVudC1wcmVmaXgtYXJnCisJCQkgKHByb21wdC1mb3ItY2hhbmdlLWxvZy1uYW1lKSkpKQorICAoYWRkLWNoYW5nZS1sb2ctZW50cnkgd2hvYW1pIGZpbGUtbmFtZSB0KSkKKzs7OyMjI2F1dG9sb2FkIChkZWZpbmUta2V5IGN0bC14LTQtbWFwICJhIiAnYWRkLWNoYW5nZS1sb2ctZW50cnktb3RoZXItd2luZG93KQorCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIGNoYW5nZS1sb2ctbW9kZSAoKQorICAiTWFqb3IgbW9kZSBmb3IgZWRpdGluZyBjaGFuZ2UgbG9nczsgbGlrZSBJbmRlbnRlZCBUZXh0IE1vZGUuCitQcmV2ZW50cyBudW1lcmljIGJhY2t1cHMgYW5kIHNldHMgYGxlZnQtbWFyZ2luJyB0byA4IGFuZCBgZmlsbC1jb2x1bW4nIHRvIDc0LgorTmV3IGxvZyBlbnRyaWVzIGFyZSB1c3VhbGx5IG1hZGUgd2l0aCBcXFthZGQtY2hhbmdlLWxvZy1lbnRyeV0gb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnktb3RoZXItd2luZG93XS4KK0VhY2ggZW50cnkgYmVoYXZlcyBhcyBhIHBhcmFncmFwaCwgYW5kIHRoZSBlbnRyaWVzIGZvciBvbmUgZGF5IGFzIGEgcGFnZS4KK1J1bnMgYGNoYW5nZS1sb2ctbW9kZS1ob29rJy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGtpbGwtYWxsLWxvY2FsLXZhcmlhYmxlcykKKyAgKGluZGVudGVkLXRleHQtbW9kZSkKKyAgKHNldHEgbWFqb3ItbW9kZSAnY2hhbmdlLWxvZy1tb2RlCisJbW9kZS1uYW1lICJDaGFuZ2UgTG9nIgorCWxlZnQtbWFyZ2luIDgKKwlmaWxsLWNvbHVtbiA3NAorICAgIGluZGVudC10YWJzLW1vZGUgdAorICAgIHRhYi13aWR0aCA4KQorICAodXNlLWxvY2FsLW1hcCBjaGFuZ2UtbG9nLW1vZGUtbWFwKQorICA7OyBMZXQgZWFjaCBlbnRyeSBiZWhhdmUgYXMgb25lIHBhcmFncmFwaDoKKyAgOzsgV2UgcmVhbGx5IGRvIHdhbnQgIl4iIGluIHBhcmFncmFwaC1zdGFydCBiZWxvdzogaXQgaXMgb25seSB0aGUgbGluZXMgdGhhdAorICA7OyBiZWdpbiBhdCBjb2x1bW4gMCAoZGVzcGl0ZSB0aGUgbGVmdC1tYXJnaW4gb2YgOCkgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IuCisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1zdGFydCkgIlxccyAqJFxcfFxmXFx8Xlxcc3ciKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtc2VwYXJhdGUpICJcXHMgKiRcXHxcZlxcfF5cXHN3IikKKyAgOzsgTGV0IGFsbCBlbnRyaWVzIGZvciBvbmUgZGF5IGJlaGF2ZSBhcyBvbmUgcGFnZS4KKyAgOzsgTWF0Y2ggbnVsbCBzdHJpbmcgb24gdGhlIGRhdGUtbGluZSBzbyB0aGF0IHRoZSBkYXRlLWxpbmUKKyAgOzsgaXMgZ3JvdXBlZCB3aXRoIHdoYXQgZm9sbG93cy4KKyAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFnZS1kZWxpbWl0ZXIpICJeXFw8XFx8XlxmIikKKyAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAndmVyc2lvbi1jb250cm9sKSAnbmV2ZXIpCisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2FkYXB0aXZlLWZpbGwtcmVnZXhwKSAiXFxzICoiKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2stZGVmYXVsdHMpCisgICAgICAgJyhjaGFuZ2UtbG9nLWZvbnQtbG9jay1rZXl3b3JkcyB0KSkKKyAgKHJ1bi1ob29rcyAnY2hhbmdlLWxvZy1tb2RlLWhvb2spKQorCis7OyBJdCBtaWdodCBiZSBuaWNlIHRvIGhhdmUgYSBnZW5lcmFsIGZlYXR1cmUgdG8gcmVwbGFjZSB0aGlzLiAgVGhlIGlkZWEgSQorOzsgaGF2ZSBpcyBhIHZhcmlhYmxlIGdpdmluZyBhIHJlZ2V4cCBtYXRjaGluZyB0ZXh0IHdoaWNoIHNob3VsZCBub3QgYmUKKzs7IG1vdmVkIGZyb20gYm9sIGJ5IGZpbGxpbmcuICBjaGFuZ2UtbG9nLW1vZGUgd291bGQgc2V0IHRoaXMgdG8gIl5cXHMgKlxccygiLgorOzsgQnV0IEkgZG9uJ3QgZmVlbCB1cCB0byBpbXBsZW1lbnRpbmcgdGhhdCB0b2RheS4KKyhkZWZ1biBjaGFuZ2UtbG9nLWZpbGwtcGFyYWdyYXBoICgmb3B0aW9uYWwganVzdGlmeSkKKyAgIkZpbGwgdGhlIHBhcmFncmFwaCwgYnV0IHByZXNlcnZlIG9wZW4gcGFyZW50aGVzZXMgYXQgYmVnaW5uaW5nIG9mIGxpbmVzLgorUHJlZml4IGFyZyBtZWFucyBqdXN0aWZ5IGFzIHdlbGwuIgorICAoaW50ZXJhY3RpdmUgIlAiKQorICAobGV0ICgoZW5kIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1wYXJhZ3JhcGgpIChwb2ludCkpKQorCShiZWcgKHNhdmUtZXhjdXJzaW9uIChiYWNrd2FyZC1wYXJhZ3JhcGgpKHBvaW50KSkpCisJKHBhcmFncmFwaC1zdGFydCAoY29uY2F0IHBhcmFncmFwaC1zdGFydCAiXFx8XFxzICpcXHMoIikpKQorICAgIChmaWxsLXJlZ2lvbiBiZWcgZW5kIGp1c3RpZnkpKSkKKwwKKyhkZWZ2YXIgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAKKyAgIl5cXChbQS1aXVtBLVpfIF0qW0EtWl9dXFx8Wy1fYS16QS1aXStcXClbIFx0XSpbOj1dIgorICAiKkhldXJpc3RpYyByZWdleHAgdXNlZCBieSBgYWRkLWxvZy1jdXJyZW50LWRlZnVuJyBmb3IgdW5rbm93biBtYWpvciBtb2Rlcy4iKQorCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIGFkZC1sb2ctY3VycmVudC1kZWZ1biAoKQorICAiUmV0dXJuIG5hbWUgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBwb2ludCBpcyBpbiwgb3IgbmlsLgorCitVbmRlcnN0YW5kcyBDLCBMaXNwLCBMYVRlWCAoXCJmdW5jdGlvbnNcIiBhcmUgY2hhcHRlcnMsIHNlY3Rpb25zLCAuLi4pLAorVGV4aW5mbyAoQG5vZGUgdGl0bGVzKSwgUGVybCwgYW5kIEZvcnRyYW4uCisKK090aGVyIG1vZGVzIGFyZSBoYW5kbGVkIGJ5IGEgaGV1cmlzdGljIHRoYXQgbG9va3MgaW4gdGhlIDEwSyBiZWZvcmUKK3BvaW50IGZvciB1cHBlcmNhc2UgaGVhZGluZ3Mgc3RhcnRpbmcgaW4gdGhlIGZpcnN0IGNvbHVtbiBvcgoraWRlbnRpZmllcnMgZm9sbG93ZWQgYnkgYDonIG9yIGA9Jywgc2VlIHZhcmlhYmxlCitgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAnLgorCitIYXMgYSBwcmVmZXJlbmNlIG9mIGxvb2tpbmcgYmFja3dhcmRzLiIKKyAgKGNvbmRpdGlvbi1jYXNlIG5pbAorICAgICAgKHNhdmUtZXhjdXJzaW9uCisJKGxldCAoKGxvY2F0aW9uIChwb2ludCkpKQorCSAgKGNvbmQgKChtZW1xIG1ham9yLW1vZGUgJyhlbWFjcy1saXNwLW1vZGUgbGlzcC1tb2RlIHNjaGVtZS1tb2RlCisJCQkJCQkgICAgbGlzcC1pbnRlcmFjdGlvbi1tb2RlKSkKKwkJIDs7IElmIHdlIGFyZSBub3cgcHJlY2lzZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBkZWZ1biwKKwkJIDs7IG1ha2Ugc3VyZSBiZWdpbm5pbmctb2YtZGVmdW4gZmluZHMgdGhhdCBvbmUKKwkJIDs7IHJhdGhlciB0aGFuIHRoZSBwcmV2aW91cyBvbmUuCisJCSAob3IgKGVvYnApIChmb3J3YXJkLWNoYXIgMSkpCisJCSAoYmVnaW5uaW5nLW9mLWRlZnVuKQorCQkgOzsgTWFrZSBzdXJlIHdlIGFyZSByZWFsbHkgaW5zaWRlIHRoZSBkZWZ1biBmb3VuZCwgbm90IGFmdGVyIGl0LgorCQkgKGlmIChhbmQgKGxvb2tpbmctYXQgIlxccygiKQorCQkJICAocHJvZ24gKGVuZC1vZi1kZWZ1bikKKwkJCQkgKDwgbG9jYXRpb24gKHBvaW50KSkpCisJCQkgIChwcm9nbiAoZm9yd2FyZC1zZXhwIC0xKQorCQkJCSAoPj0gbG9jYXRpb24gKHBvaW50KSkpKQorCQkgICAgIChwcm9nbgorCQkgICAgICAgKGlmIChsb29raW5nLWF0ICJcXHMoIikKKwkJCSAgIChmb3J3YXJkLWNoYXIgMSkpCisJCSAgICAgICAoZm9yd2FyZC1zZXhwIDEpCisJCSAgICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgJyIpCisJCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCisJCQkJCSAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpKSkKKwkJKChhbmQgKG1lbXEgbWFqb3ItbW9kZSAnKGMtbW9kZSBjKystbW9kZSBjKystYy1tb2RlIG9iamMtbW9kZSkpCisJCSAgICAgIChzYXZlLWV4Y3Vyc2lvbiAoYmVnaW5uaW5nLW9mLWxpbmUpCisJCQkJICAgICAgOzsgVXNlIGVxIGluc3RlYWQgb2YgPSBoZXJlIHRvIGF2b2lkCisJCQkJICAgICAgOzsgZXJyb3Igd2hlbiBhdCBib2IgYW5kIGNoYXItYWZ0ZXIKKwkJCQkgICAgICA7OyByZXR1cm5zIG5pbC4KKwkJCQkgICAgICAod2hpbGUgKGVxIChjaGFyLWFmdGVyICgtIChwb2ludCkgMikpID9cXCkKKwkJCQkJKGZvcndhcmQtbGluZSAtMSkpCisJCQkJICAgICAgKGxvb2tpbmctYXQgIlsgXHRdKiNbIFx0XSpkZWZpbmVbIFx0XSIpKSkKKwkJIDs7IEhhbmRsZSBhIEMgbWFjcm8gZGVmaW5pdGlvbi4KKwkJIChiZWdpbm5pbmctb2YtbGluZSkKKwkJICh3aGlsZSAoZXEgKGNoYXItYWZ0ZXIgKC0gKHBvaW50KSAyKSkgP1xcKSA7bm90ID07IG5vdGUgYWJvdmUKKwkJICAgKGZvcndhcmQtbGluZSAtMSkpCisJCSAoc2VhcmNoLWZvcndhcmQgImRlZmluZSIpCisJCSAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQorCQkgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQorCQkJCSAgIChwcm9nbiAoZm9yd2FyZC1zZXhwIDEpIChwb2ludCkpKSkKKwkJKChtZW1xIG1ham9yLW1vZGUgJyhjLW1vZGUgYysrLW1vZGUgYysrLWMtbW9kZSBvYmpjLW1vZGUpKQorCQkgKGJlZ2lubmluZy1vZi1saW5lKQorCQkgOzsgU2VlIGlmIHdlIGFyZSBpbiB0aGUgYmVnaW5uaW5nIHBhcnQgb2YgYSBmdW5jdGlvbiwKKwkJIDs7IGJlZm9yZSB0aGUgb3BlbiBicmFjZS4gIElmIHNvLCBhZHZhbmNlIGZvcndhcmQuCisJCSAod2hpbGUgKG5vdCAobG9va2luZy1hdCAie1xcfFxcKFxccyAqJFxcKSIpKQorCQkgICAoZm9yd2FyZC1saW5lIDEpKQorCQkgKG9yIChlb2JwKQorCQkgICAgIChmb3J3YXJkLWNoYXIgMSkpCisJCSAoYmVnaW5uaW5nLW9mLWRlZnVuKQorCQkgKGlmIChwcm9nbiAoZW5kLW9mLWRlZnVuKQorCQkJICAgICg8IGxvY2F0aW9uIChwb2ludCkpKQorCQkgICAgIChwcm9nbgorCQkgICAgICAgKGJhY2t3YXJkLXNleHAgMSkKKwkJICAgICAgIChsZXQgKGJlZyB0ZW0pCisKKwkJCSAoZm9yd2FyZC1saW5lIC0xKQorCQkJIDs7IFNraXAgYmFjayBvdmVyIHR5cGVkZWZzIG9mIGFyZ2xpc3QuCisJCQkgKHdoaWxlIChhbmQgKG5vdCAoYm9icCkpCisJCQkJICAgICAobG9va2luZy1hdCAiWyBcdFxuXSIpKQorCQkJICAgKGZvcndhcmQtbGluZSAtMSkpCisJCQkgOzsgU2VlIGlmIHRoaXMgaXMgdXNpbmcgdGhlIERFRlVOIG1hY3JvIHVzZWQgaW4gRW1hY3MsCisJCQkgOzsgb3IgdGhlIERFRlVOIG1hY3JvIHVzZWQgYnkgdGhlIEMgbGlicmFyeS4KKwkJCSAoaWYgKGNvbmRpdGlvbi1jYXNlIG5pbAorCQkJCSAoYW5kIChzYXZlLWV4Y3Vyc2lvbgorCQkJCQkoZW5kLW9mLWxpbmUpCisJCQkJCSh3aGlsZSAoPSAocHJlY2VkaW5nLWNoYXIpID9cXCkKKwkJCQkJICAoZW5kLW9mLWxpbmUgMikpCisJCQkJCShiYWNrd2FyZC1zZXhwIDEpCisJCQkJCShiZWdpbm5pbmctb2YtbGluZSkKKwkJCQkJKHNldHEgdGVtIChwb2ludCkpCisJCQkJCShsb29raW5nLWF0ICJERUZVTlxcYiIpKQorCQkJCSAgICAgICg+PSBsb2NhdGlvbiB0ZW0pKQorCQkJICAgICAgIChlcnJvciBuaWwpKQorCQkJICAgICAocHJvZ24KKwkJCSAgICAgICAoZ290by1jaGFyIHRlbSkKKwkJCSAgICAgICAoZG93bi1saXN0IDEpCisJCQkgICAgICAgKGlmICg9IChjaGFyLWFmdGVyIChwb2ludCkpID9cIikKKwkJCQkgICAocHJvZ24KKwkJCQkgICAgIChmb3J3YXJkLXNleHAgMSkKKwkJCQkgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiAsIikpKQorCQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKKwkJCQkJCSAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGxvb2tpbmctYXQgIl5bKy1dIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0LW1ldGhvZC1kZWZpbml0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBPcmRpbmFyeSBDIGZ1bmN0aW9uIHN5bnRheC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgYmVnIChwb2ludCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kIChjb25kaXRpb24tY2FzZSBuaWwKKwkJCQkJICA7OyBQcm90ZWN0IGFnYWluc3QgIlVuYmFsYW5jZWQgcGFyZW5zIiBlcnJvci4KKwkJCQkJICAocHJvZ24KKwkJCQkJICAgIChkb3duLWxpc3QgMSkgOyBpbnRvIGFyZ2xpc3QKKwkJCQkJICAgIChiYWNrd2FyZC11cC1saXN0IDEpCisJCQkJCSAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKKwkJCQkJICAgIHQpCisJCQkJCShlcnJvciBuaWwpKQorCQkJCSAgICAgIDs7IFZlcmlmeSBpbml0aWFsIHBvcyB3YXMgYWZ0ZXIKKwkJCQkgICAgICA7OyByZWFsIHN0YXJ0IG9mIGZ1bmN0aW9uLgorCQkJCSAgICAgIChzYXZlLWV4Y3Vyc2lvbgorCQkJCQkoZ290by1jaGFyIGJlZykKKwkJCQkJOzsgRm9yIHRoaXMgcHVycG9zZSwgaW5jbHVkZSB0aGUgbGluZQorCQkJCQk7OyB0aGF0IGhhcyB0aGUgZGVjbCBrZXl3b3Jkcy4gIFRoaXMKKwkJCQkJOzsgbWF5IGFsc28gaW5jbHVkZSBzb21lIG9mIHRoZQorCQkJCQk7OyBjb21tZW50cyBiZWZvcmUgdGhlIGZ1bmN0aW9uLgorCQkJCQkod2hpbGUgKGFuZCAobm90IChib2JwKSkKKwkJCQkJCSAgICAoc2F2ZS1leGN1cnNpb24KKwkJCQkJCSAgICAgIChmb3J3YXJkLWxpbmUgLTEpCisJCQkJCQkgICAgICAobG9va2luZy1hdCAiW15cblxmXSIpKSkKKwkJCQkJICAoZm9yd2FyZC1saW5lIC0xKSkKKwkJCQkJKD49IGxvY2F0aW9uIChwb2ludCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgQ29uc2lzdGVuY3kgY2hlY2s6IGdvaW5nIGRvd24gYW5kIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBzaG91bGRuJ3QgdGFrZSB1cyBiYWNrIGJlZm9yZSBCRUcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPiAocG9pbnQpIGJlZykpCisJCQkJIChsZXQgKGVuZCBtaWRkbGUpCisJCQkJICAgOzsgRG9uJ3QgaW5jbHVkZSBhbnkgZmluYWwgbmV3bGluZQorCQkJCSAgIDs7IGluIHRoZSBuYW1lIHdlIHVzZS4KKwkJCQkgICAoaWYgKD0gKHByZWNlZGluZy1jaGFyKSA/XG4pCisJCQkJICAgICAgIChmb3J3YXJkLWNoYXIgLTEpKQorCQkJCSAgIChzZXRxIGVuZCAocG9pbnQpKQorCQkJCSAgIChiYWNrd2FyZC1zZXhwIDEpCisJCQkJICAgOzsgTm93IGZpbmQgdGhlIHJpZ2h0IGJlZ2lubmluZyBvZiB0aGUgbmFtZS4KKwkJCQkgICA7OyBJbmNsdWRlIGNlcnRhaW4ga2V5d29yZHMgaWYgdGhleQorCQkJCSAgIDs7IHByZWNlZGUgdGhlIG5hbWUuCisJCQkJICAgKHNldHEgbWlkZGxlIChwb2ludCkpCisJCQkJICAgKGZvcndhcmQtd29yZCAtMSkKKwkJCQkgICA7OyBJZ25vcmUgdGhlc2Ugc3VicGFydHMgb2YgYSBjbGFzcyBkZWNsCisJCQkJICAgOzsgYW5kIG1vdmUgYmFjayB0byB0aGUgY2xhc3MgbmFtZSBpdHNlbGYuCisJCQkJICAgKHdoaWxlIChsb29raW5nLWF0ICJwdWJsaWMgXFx8cHJpdmF0ZSAiKQorCQkJCSAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdDoiKQorCQkJCSAgICAgKHNldHEgZW5kIChwb2ludCkpCisJCQkJICAgICAoYmFja3dhcmQtc2V4cCAxKQorCQkJCSAgICAgKHNldHEgbWlkZGxlIChwb2ludCkpCisJCQkJICAgICAoZm9yd2FyZC13b3JkIC0xKSkKKwkJCQkgICAoYW5kIChib2xwKQorCQkJCQkobG9va2luZy1hdCAic3RydWN0IFxcfHVuaW9uIFxcfGNsYXNzICIpCisJCQkJCShzZXRxIG1pZGRsZSAocG9pbnQpKSkKKwkJCQkgICAoYnVmZmVyLXN1YnN0cmluZyBtaWRkbGUgZW5kKSkpKSkpKSkpCisJCSgobWVtcSBtYWpvci1tb2RlCisJCSAgICAgICAnKFRlWC1tb2RlIHBsYWluLVRlWC1tb2RlIExhVGVYLW1vZGU7OyB0ZXgtbW9kZS5lbAorCQkJCSAgcGxhaW4tdGV4LW1vZGUgbGF0ZXgtbW9kZTs7IGNtdXRleC5lbAorCQkJCSAgKSkKKwkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkCisJCSAgICAgICJcXFxcXFwoc3ViXFwpKlxcKHNlY3Rpb25cXHxwYXJhZ3JhcGhcXHxjaGFwdGVyXFwpIiBuaWwgdCkKKwkJICAgICAocHJvZ24KKwkJICAgICAgIChnb3RvLWNoYXIgKG1hdGNoLWJlZ2lubmluZyAwKSkKKwkJICAgICAgIChidWZmZXItc3Vic3RyaW5nICgxKyAocG9pbnQpKTs7IHdpdGhvdXQgaW5pdGlhbCBiYWNrc2xhc2gKKwkJCQkJIChwcm9nbgorCQkJCQkgICAoZW5kLW9mLWxpbmUpCisJCQkJCSAgIChwb2ludCkpKSkpKQorCQkoKGVxIG1ham9yLW1vZGUgJ3RleGluZm8tbW9kZSkKKwkJIChpZiAocmUtc2VhcmNoLWJhY2t3YXJkICJeQG5vZGVbIFx0XStcXChbXixcbl0rXFwpIiBuaWwgdCkKKwkJICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCisJCQkJICAgICAgIChtYXRjaC1lbmQgMSkpKSkKKwkJKChlcSBtYWpvci1tb2RlICdwZXJsLW1vZGUpCisJCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXnN1YlsgXHRdK1xcKFteIFx0XG5dK1xcKSIgbmlsIHQpCisJCSAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQorCQkJCSAgICAgICAobWF0Y2gtZW5kIDEpKSkpCisgICAgICAgICAgICAgICAgKChlcSBtYWpvci1tb2RlICdmb3J0cmFuLW1vZGUpCisgICAgICAgICAgICAgICAgIDs7IG11c3QgYmUgaW5zaWRlIGZ1bmN0aW9uIGJvZHkgZm9yIHRoaXMgdG8gd29yaworICAgICAgICAgICAgICAgICAoYmVnaW5uaW5nLW9mLWZvcnRyYW4tc3VicHJvZ3JhbSkKKyAgICAgICAgICAgICAgICAgKGxldCAoKGNhc2UtZm9sZC1zZWFyY2ggdCkpIDsgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgIDs7IHNlYXJjaCBmb3IgZm9ydHJhbiBzdWJwcm9ncmFtIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgKGlmIChyZS1zZWFyY2gtZm9yd2FyZAorCQkJICJeWyBcdF0qXFwocHJvZ3JhbVxcfHN1YnJvdXRpbmVcXHxmdW5jdGlvblwKK1xcfFsgXHRhLXowLTkqXSpbIFx0XStmdW5jdGlvblxcKSIKKwkJCSBuaWwgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgKHByb2duCisgICAgICAgICAgICAgICAgICAgICAgICAgOzsgbW92ZSB0byBFT0wgb3IgYmVmb3JlIGZpcnN0IGxlZnQgcGFyZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHJlLXNlYXJjaC1mb3J3YXJkICJbKFxuXSIgbmlsIHQpCisJCQkgICAgIChwcm9nbiAoZm9yd2FyZC1jaGFyIC0xKQorCQkJCSAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikpCisJCQkgICAoZW5kLW9mLWxpbmUpKQorCQkJIDs7IFVzZSB0aGUgbmFtZSBwcmVjZWRpbmcgdGhhdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2duIChmb3J3YXJkLXNleHAgLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludCkpKSkpKSkKKwkJKHQKKwkJIDs7IElmIGFsbCBlbHNlIGZhaWxzLCB0cnkgaGV1cmlzdGljcworCQkgKGxldCAoY2FzZS1mb2xkLXNlYXJjaCkKKwkJICAgKGVuZC1vZi1saW5lKQorCQkgICAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCBhZGQtbG9nLWN1cnJlbnQtZGVmdW4taGVhZGVyLXJlZ2V4cAorCQkJCQkgICAoLSAocG9pbnQpIDEwMDAwKQorCQkJCQkgICB0KQorCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQorCQkJCQkgKG1hdGNoLWVuZCAxKSkpKSkpKSkKKyAgICAoZXJyb3IgbmlsKSkpCisKKyhkZWZ2YXIgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kKQorCis7OyBTdWJyb3V0aW5lIHVzZWQgd2l0aGluIGdldC1tZXRob2QtZGVmaW5pdGlvbi4KKzs7IEFkZCB0aGUgbGFzdCBtYXRjaCBpbiB0aGUgYnVmZmVyIHRvIHRoZSBlbmQgb2YgYG1kJywKKzs7IGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgRU5EOyBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhhdCBtYXRjaC4KKyhkZWZ1biBnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAoZW5kKQorICAoc2V0cSBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQKKwkoY29uY2F0IGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAKKwkJKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKQorCQllbmQpKQorICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpKQorCis7OyBGb3Igb2JqZWN0aXZlIEMsIHJldHVybiB0aGUgbWV0aG9kIG5hbWUgaWYgd2UgYXJlIGluIGEgbWV0aG9kLgorKGRlZnVuIGdldC1tZXRob2QtZGVmaW5pdGlvbiAoKQorICAobGV0ICgoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kICJbIikpCisgICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXkBpbXBsZW1lbnRhdGlvblxccy0qXFwoW0EtWmEtel9dKlxcKSIgbmlsIHQpCisJICAoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgIiAiKSkpCisgICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAoY29uZAorICAgICAgICgocmUtc2VhcmNoLWZvcndhcmQgIl5cXChbLStdXFwpWyBcdFxuXGZccl0qXFwoKFteKV0qKVxcKT9cXHMtKiIgbmlsIHQpCisJKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIiKQorCSh3aGlsZSAobm90IChsb29raW5nLWF0ICJbeztdIikpCisJICAobG9va2luZy1hdAorCSAgICJcXChbQS1aYS16X10qOj9cXClcXHMtKlxcKChbXildKilcXCk/W0EtWmEtel9dKlsgXHRcblxmXHJdKiIpCisJICAoZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgIiIpKQorCShjb25jYXQgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kICJdIikpKSkpKQorCisKKyhwcm92aWRlICdhZGQtbG9nKQorCis7OzsgYWRkLWxvZy5lbCBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL2V0Yy9hZGQtbG9nLnZpIGIvZXRjL2FkZC1sb2cudmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiOGM3NwotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9hZGQtbG9nLnZpCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC5laW4gYi9ldGMvY29uZmlnYnVpbGQuZWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvY29uZmlnYnVpbGQuZWluCkBAIC0wLDAgKzEsMTQ5IEBACislIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAorJSVUaXRsZTogY29uZmlnYnVpbGQuZmlnCislJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCislJUNyZWF0aW9uRGF0ZTogRnJpIEp1biAxMiAyMDoxMzoxNiAxOTk4CislJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKKyUlT3JpZW50YXRpb246IFBvcnRyYWl0CislJUJvdW5kaW5nQm94OiAwIDAgMzIyIDE3MworJSVQYWdlczogMAorJSVCZWdpblNldHVwCislJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCislJUVuZFNldHVwCislJUVuZENvbW1lbnRzCisvJEYycHNEaWN0IDIwMCBkaWN0IGRlZgorJEYycHNEaWN0IGJlZ2luCiskRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAorL2NvbC0xIHt9IGRlZgorL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgorL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCisvY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCisvY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisKK2VuZAorc2F2ZQorLTYyLjAgMjI2LjAgdHJhbnNsYXRlCisxIC0xIHNjYWxlCisKKy9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKKy9lZiB7ZW9maWxsfSBiaW5kIGRlZgorL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKKy9ncyB7Z3NhdmV9IGJpbmQgZGVmCisvbCB7bGluZXRvfSBiaW5kIGRlZgorL20ge21vdmV0b30gYmluZCBkZWYKKy9uIHtuZXdwYXRofSBiaW5kIGRlZgorL3Mge3N0cm9rZX0gYmluZCBkZWYKKy9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCisvc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKKy9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKKy9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKKy9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKKy9zYyB7c2NhbGV9IGJpbmQgZGVmCisvdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKKy90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCisgIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAorICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKKyAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9CisgIGJpbmQgZGVmCisvc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKKyAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgorLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgorLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCislJUVuZFByb2xvZworCiskRjJwc0JlZ2luCisxMCBzZXRtaXRlcmxpbWl0CisgMC4wNjAwMCAwLjA2MDAwIHNjCis3LjUwMCBzbHcKKyUgUG9seWxpbmUKK24gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gMTUwMCAxNDI1IG0gMTUwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCituIDE1MzAuMDAgMTk4MC4wMCBtIDE1MDAuMDAgMjEwMC4wMCBsIDE0NzAuMDAgMTk4MC4wMCBsICAxNTAwLjUwIDE5ODAuNTAgbCAxNTMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKKyUgUG9seWxpbmUKK24gMTUwMCAyNjI1IG0gMTUwMCAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCituIDE1MzAuMDAgMzE4MC4wMCBtIDE1MDAuMDAgMzMwMC4wMCBsIDE0NzAuMDAgMzE4MC4wMCBsICAxNTAwLjUwIDMxODAuNTAgbCAxNTMwLjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKKyUgUG9seWxpbmUKK24gMjkyNSA5MDAgbSAzODI1IDkwMCBsICAzODI1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gMTE1NSAyMTAwIG0gMTA1MCAyMTAwIDEwNTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMTA1MCAyNjI1IDIyMjAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyNjI1IDIzMjUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyMTAwIDExNTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorbiAyODUwIDIxMDAgbSA0MTI1IDIxMDAgbCAgNDEyNSAyNjI1IGwgIDI4NTAgMjYyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCislIFBvbHlsaW5lCituIDMzNzUgMTQyNSBtIDMzNzUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAorbiAzNDA1LjAwIDE5ODAuMDAgbSAzMzc1LjAwIDIxMDAuMDAgbCAzMzQ1LjAwIDE5ODAuMDAgbCAgMzM3NS41MCAxOTgwLjUwIGwgMzQwNS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDUxMDAgOTAwIG0gNjMwMCA5MDAgbCAgNjMwMCAxMzUwIGwgIDUxMDAgMTM1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCislIFBvbHlsaW5lCituIDU2MjUgMTM1MCBtIDU2MjUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAorbiA1NjU1LjAwIDE5ODAuMDAgbSA1NjI1LjAwIDIxMDAuMDAgbCA1NTk1LjAwIDE5ODAuMDAgbCAgNTYyNS41MCAxOTgwLjUwIGwgNTY1NS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDUyMDUgMjEwMCBtIDUxMDAgMjEwMCA1MTAwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDUxMDAgMjYyNSA2MjcwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjYyNSA2Mzc1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjEwMCA1MjA1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gNTYyNSAyNjI1IG0gNTYyNSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCituIDU2NTUuMDAgMzE4MC4wMCBtIDU2MjUuMDAgMzMwMC4wMCBsIDU1OTUuMDAgMzE4MC4wMCBsICA1NjI1LjUwIDMxODAuNTAgbCA1NjU1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKKyUgUG9seWxpbmUKK24gNTEwMCAzMzAwIG0gNjIyNSAzMzAwIGwgIDYyMjUgMzc1MCBsICA1MTAwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCituIDI4NTAgMjQwMCBtIDIzMjUgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKK24gMjQ0NS4wMCAyNDMwLjAwIG0gMjMyNS4wMCAyNDAwLjAwIGwgMjQ0NS4wMCAyMzcwLjAwIGwgIDI0NDUuNTAgMjQwMC41MCBsIDI0NDUuMDAgMjQzMC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCituIDQxMjUgMjQwMCBtIDUxMDAgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKK24gNDk4MC4wMCAyMzcwLjAwIG0gNTEwMC4wMCAyNDAwLjAwIGwgNDk4MC4wMCAyNDMwLjAwIGwgIDQ5ODAuNTAgMjQwMC41MCBsIDQ5ODAuMDAgMjM3MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorbiAxMDUwIDMzMDAgbSAxOTUwIDMzMDAgbCAgMTk1MCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCisvVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250CisxMjAwIDEyMDAgbQorZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCisvVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250CiszMDAwIDEyMDAgbQorZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCisvVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250CiszMDAwIDI0MDAgbQorZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorMTIwMCAyNDAwIG0KK2dzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzEyMDAgMzYwMCBtCitncyAxIC0xIHNjIChjb25maWcuaCkgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorNTI1MCAxMjAwIG0KK2dzIDEgLTEgc2MgKE1ha2VmaWxlLmluKSBjb2wtMSBzaG93IGdyCisvVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Cis1MjUwIDI0MDAgbQorZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorNTI1MCAzNjAwIG0KK2dzIDEgLTEgc2MgKE1ha2VmaWxlKSBjb2wtMSBzaG93IGdyCiskRjJwc0VuZAorcmVzdG9yZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmZpZyBiL2V0Yy9jb25maWdidWlsZC5maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NTkyZAotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9jb25maWdidWlsZC5maWcKQEAgLTAsMCArMSw1MCBAQAorI0ZJRyAzLjEKK1BvcnRyYWl0CitDZW50ZXIKK0luY2hlcworMTIwMCAyCisyIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1CisJIDEwNTAgOTAwIDIxMDAgOTAwIDIxMDAgMTQyNSAxMDUwIDE0MjUgMTA1MCA5MDAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDE1MDAgMTQyNSAxNTAwIDIxMDAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDE1MDAgMjYyNSAxNTAwIDMzMDAKKzIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKKwkgMjkyNSA5MDAgMzgyNSA5MDAgMzgyNSAxNDI1IDI5MjUgMTQyNSAyOTI1IDkwMAorMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQorCSAyMzI1IDI2MjUgMjMyNSAyMTAwIDEwNTAgMjEwMCAxMDUwIDI2MjUgMjMyNSAyNjI1CisyIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1CisJIDI4NTAgMjEwMCA0MTI1IDIxMDAgNDEyNSAyNjI1IDI4NTAgMjYyNSAyODUwIDIxMDAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDMzNzUgMTQyNSAzMzc1IDIxMDAKKzIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKKwkgNTEwMCA5MDAgNjMwMCA5MDAgNjMwMCAxMzUwIDUxMDAgMTM1MCA1MTAwIDkwMAorMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKKwkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKKwkgNTYyNSAxMzUwIDU2MjUgMjEwMAorMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQorCSA2Mzc1IDI2MjUgNjM3NSAyMTAwIDUxMDAgMjEwMCA1MTAwIDI2MjUgNjM3NSAyNjI1CisyIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgorCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAorCSA1NjI1IDI2MjUgNTYyNSAzMzAwCisyIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1CisJIDUxMDAgMzMwMCA2MjI1IDMzMDAgNjIyNSAzNzUwIDUxMDAgMzc1MCA1MTAwIDMzMDAKKzIgMSAyIDEgLTEgNyAwIDAgLTEgMy4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDI4NTAgMjQwMCAyMzI1IDI0MDAKKzIgMSAyIDEgLTEgNyAwIDAgLTEgMy4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDQxMjUgMjQwMCA1MTAwIDI0MDAKKzIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKKwkgMTA1MCAzMzAwIDE5NTAgMzMwMCAxOTUwIDM3NTAgMTA1MCAzNzUwIDEwNTAgMzMwMAorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2NDUgMTIwMCAxMjAwIGNvbmZpZy5pblwwMDEKKzQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNzA1IDMwMDAgMTIwMCBjb25maWd1cmVcMDAxCis0IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCAzMDAwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKKzQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDEyMDAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2MDAgMTIwMCAzNjAwIGNvbmZpZy5oXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NTUgNTI1MCAxMjAwIE1ha2VmaWxlLmluXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgNTI1MCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCis0IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDY3NSA1MjUwIDM2MDAgTWFrZWZpbGVcMDAxCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQuamluIGIvZXRjL2NvbmZpZ2J1aWxkLmppbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNkOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZ2J1aWxkLmppbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnYnVpbGQudGluIGIvZXRjL2NvbmZpZ2J1aWxkLnRpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmRkNmZlCi0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZ2J1aWxkLnRpbgpAQCAtMCwwICsxLDkgQEAKKyAgIGNvbmZpZy5pbiAgICAgICAgKmNvbmZpZ3VyZSogICAgICBNYWtlZmlsZS5pbgorICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgICB8ICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgIHwKKyAgICAgIHwgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAqY29uZmlnLnN0YXR1cyo8PT09PT09Kz09PT09PT09PT0+KmNvbmZpZy5zdGF0dXMqCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgorICAgY29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmVpbiBiL2V0Yy9jb25maWdkZXYuZWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODM3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvY29uZmlnZGV2LmVpbgpAQCAtMCwwICsxLDE4NSBAQAorJSFQUy1BZG9iZS0yLjAgRVBTRi0yLjAKKyUlVGl0bGU6IGNvbmZpZ2Rldi5maWcKKyUlQ3JlYXRvcjogZmlnMmRldiBWZXJzaW9uIDMuMSBQYXRjaGxldmVsIDEKKyUlQ3JlYXRpb25EYXRlOiBNb24gSnVuIDE1IDE3OjM1OjE5IDE5OTgKKyUlRm9yOiBpYW5AdGl0by5jeWdudXMuY29tIChJYW4gTGFuY2UgVGF5bG9yKQorJSVPcmllbnRhdGlvbjogUG9ydHJhaXQKKyUlQm91bmRpbmdCb3g6IDAgMCAzNDQgMzE3CislJVBhZ2VzOiAwCislJUJlZ2luU2V0dXAKKyUlSW5jbHVkZUZlYXR1cmU6ICpQYWdlU2l6ZSBMZXR0ZXIKKyUlRW5kU2V0dXAKKyUlRW5kQ29tbWVudHMKKy8kRjJwc0RpY3QgMjAwIGRpY3QgZGVmCiskRjJwc0RpY3QgYmVnaW4KKyRGMnBzRGljdCAvbXRyeCBtYXRyaXggcHV0CisvY29sLTEge30gZGVmCisvY29sMCB7MC4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxIHswLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDIgezAuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sMyB7MC4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w0IHsxLjAwMCAwLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDUgezEuMDAwIDAuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCisvY29sNiB7MS4wMDAgMS4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2w3IHsxLjAwMCAxLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgorL2NvbDggezAuMDAwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCisvY29sOSB7MC4wMDAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMCB7MC4wMDAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMSB7MC41MzAgMC44MTAgMS4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMiB7MC4wMDAgMC41NjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxMyB7MC4wMDAgMC42OTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNCB7MC4wMDAgMC44MjAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNSB7MC4wMDAgMC41NjAgMC41NjAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNiB7MC4wMDAgMC42OTAgMC42OTAgc3JnYn0gYmluZCBkZWYKKy9jb2wxNyB7MC4wMDAgMC44MjAgMC44MjAgc3JnYn0gYmluZCBkZWYKKy9jb2wxOCB7MC41NjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wxOSB7MC42OTAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMCB7MC44MjAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMSB7MC41NjAgMC4wMDAgMC41NjAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMiB7MC42OTAgMC4wMDAgMC42OTAgc3JnYn0gYmluZCBkZWYKKy9jb2wyMyB7MC44MjAgMC4wMDAgMC44MjAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNCB7MC41MDAgMC4xOTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNSB7MC42MzAgMC4yNTAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNiB7MC43NTAgMC4zODAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyNyB7MS4wMDAgMC41MDAgMC41MDAgc3JnYn0gYmluZCBkZWYKKy9jb2wyOCB7MS4wMDAgMC42MzAgMC42MzAgc3JnYn0gYmluZCBkZWYKKy9jb2wyOSB7MS4wMDAgMC43NTAgMC43NTAgc3JnYn0gYmluZCBkZWYKKy9jb2wzMCB7MS4wMDAgMC44ODAgMC44ODAgc3JnYn0gYmluZCBkZWYKKy9jb2wzMSB7MS4wMDAgMC44NDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKKworZW5kCitzYXZlCistNjIuMCAzNzAuMCB0cmFuc2xhdGUKKzEgLTEgc2NhbGUKKworL2NscCB7Y2xvc2VwYXRofSBiaW5kIGRlZgorL2VmIHtlb2ZpbGx9IGJpbmQgZGVmCisvZ3Ige2dyZXN0b3JlfSBiaW5kIGRlZgorL2dzIHtnc2F2ZX0gYmluZCBkZWYKKy9sIHtsaW5ldG99IGJpbmQgZGVmCisvbSB7bW92ZXRvfSBiaW5kIGRlZgorL24ge25ld3BhdGh9IGJpbmQgZGVmCisvcyB7c3Ryb2tlfSBiaW5kIGRlZgorL3NsYyB7c2V0bGluZWNhcH0gYmluZCBkZWYKKy9zbGoge3NldGxpbmVqb2lufSBiaW5kIGRlZgorL3NsdyB7c2V0bGluZXdpZHRofSBiaW5kIGRlZgorL3NyZ2Ige3NldHJnYmNvbG9yfSBiaW5kIGRlZgorL3JvdCB7cm90YXRlfSBiaW5kIGRlZgorL3NjIHtzY2FsZX0gYmluZCBkZWYKKy90ciB7dHJhbnNsYXRlfSBiaW5kIGRlZgorL3RudCB7ZHVwIGR1cCBjdXJyZW50cmdiY29sb3IKKyAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkCisgIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAorICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQgc3JnYn0KKyAgYmluZCBkZWYKKy9zaGQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yIDQgLTIgcm9sbCBtdWwgNCAtMiByb2xsIG11bAorICA0IC0yIHJvbGwgbXVsIHNyZ2J9IGJpbmQgZGVmCisvJEYycHNCZWdpbiB7JEYycHNEaWN0IGJlZ2luIC8kRjJwc0VudGVyZWRTdGF0ZSBzYXZlIGRlZn0gZGVmCisvJEYycHNFbmQgeyRGMnBzRW50ZXJlZFN0YXRlIHJlc3RvcmUgZW5kfSBkZWYKKyUlRW5kUHJvbG9nCisKKyRGMnBzQmVnaW4KKzEwIHNldG1pdGVybGltaXQKKyAwLjA2MDAwIDAuMDYwMDAgc2MKKzcuNTAwIHNsdworJSBQb2x5bGluZQorbiAxMDUwIDkwMCBtIDIxMDAgOTAwIGwgIDIxMDAgMTQyNSBsICAxMDUwIDE0MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorbiAyOTI1IDkwMCBtIDM5NzUgOTAwIGwgIDM5NzUgMTQyNSBsICAyOTI1IDE0MjUgbCAgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorbiA1NTUwIDkwMCBtIDY3NTAgOTAwIGwgIDY3NTAgMTM1MCBsICA1NTUwIDEzNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorbiAzNzUwIDE4MDAgbSA1MDI1IDE4MDAgbCAgNTAyNSAyMjUwIGwgIDM3NTAgMjI1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCislIFBvbHlsaW5lCituIDExNTUgMjEwMCBtIDEwNTAgMjEwMCAxMDUwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDEwNTAgMjYyNSAyMDcwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIxNzUgMjYyNSAyMTc1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDIxNzUgMjEwMCAxMTU1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gNTU1MCAzMzAwIG0gNjY3NSAzMzAwIGwgIDY2NzUgMzc1MCBsICA1NTUwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorbiA1NjU1IDIxMDAgbSA1NTUwIDIxMDAgNTU1MCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA1NTUwIDI2MjUgNjQ5NSAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2NjAwIDI2MjUgNjYwMCAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCA2NjAwIDIxMDAgNTY1NSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCislIFBvbHlsaW5lCituIDM3NTAgMzYwMCBtIDQ4NzUgMzYwMCBsICA0ODc1IDQwNTAgbCAgMzc1MCA0MDUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gMzg1NSAyNzAwIG0gMzc1MCAyNzAwIDM3NTAgMzA0NSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMzc1MCAzMTUwIDQ1NDUgMzE1MCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNDY1MCAzMTUwIDQ2NTAgMjgwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNDY1MCAyNzAwIDM4NTUgMjcwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAorJSBQb2x5bGluZQorbiAyODUwIDU3MDAgbSAzNzUwIDU3MDAgbCAgMzc1MCA2MTUwIGwgIDI4NTAgNjE1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCislIFBvbHlsaW5lCituIDMwMzAgNDgwMCBtIDI5MjUgNDgwMCAyOTI1IDUxNDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDI5MjUgNTI1MCAzNjQ1IDUyNTAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgNTI1MCAzNzUwIDQ5MDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgNDgwMCAzMDMwIDQ4MDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gMTUwMCAxNDI1IG0gMTUwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCituIDE1MzAuMDAgMTk4MC4wMCBtIDE1MDAuMDAgMjEwMC4wMCBsIDE0NzAuMDAgMTk4MC4wMCBsICAxNTAwLjUwIDE5ODAuNTAgbCAxNTMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKKyUgUG9seWxpbmUKK24gMzMwMCAxNDI1IG0gMzMwMCA0ODAwIGwgIGdzIGNvbC0xIHMgZ3IgCituIDMzMzAuMDAgNDY4MC4wMCBtIDMzMDAuMDAgNDgwMC4wMCBsIDMyNzAuMDAgNDY4MC4wMCBsICAzMzAwLjUwIDQ2ODAuNTAgbCAzMzMwLjAwIDQ2ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKKyUgUG9seWxpbmUKK24gMzMwMCAxNTc1IG0gMTg3NSAxNTc1IGwgIDE4NzUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAorbiAxOTA1LjAwIDE5ODAuMDAgbSAxODc1LjAwIDIxMDAuMDAgbCAxODQ1LjAwIDE5ODAuMDAgbCAgMTg3NS41MCAxOTgwLjUwIGwgMTkwNS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDMzMDAgMTU3NSBtIDU3MDAgMTU3NSBsICA1NzAwIDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKK24gNTczMC4wMCAxOTgwLjAwIG0gNTcwMC4wMCAyMTAwLjAwIGwgNTY3MC4wMCAxOTgwLjAwIGwgIDU3MDAuNTAgMTk4MC41MCBsIDU3MzAuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorbiA2MjI1IDEzNTAgbSA2MjI1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKK24gNjI1NS4wMCAxOTgwLjAwIG0gNjIyNS4wMCAyMTAwLjAwIGwgNjE5NS4wMCAxOTgwLjAwIGwgIDYyMjUuNTAgMTk4MC41MCBsIDYyNTUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorbiA2MDc1IDI2MjUgbSA2MDc1IDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKK24gNjEwNS4wMCAzMTgwLjAwIG0gNjA3NS4wMCAzMzAwLjAwIGwgNjA0NS4wMCAzMTgwLjAwIGwgIDYwNzUuNTAgMzE4MC41MCBsIDYxMDUuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorbiA0MjAwIDIyNTAgbSA0MjAwIDI3MDAgbCAgZ3MgY29sLTEgcyBnciAKK24gNDIzMC4wMCAyNTgwLjAwIG0gNDIwMC4wMCAyNzAwLjAwIGwgNDE3MC4wMCAyNTgwLjAwIGwgIDQyMDAuNTAgMjU4MC41MCBsIDQyMzAuMDAgMjU4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorbiA0MjAwIDMxNTAgbSA0MjAwIDM2MDAgbCAgZ3MgY29sLTEgcyBnciAKK24gNDIzMC4wMCAzNDgwLjAwIG0gNDIwMC4wMCAzNjAwLjAwIGwgNDE3MC4wMCAzNDgwLjAwIGwgIDQyMDAuNTAgMzQ4MC41MCBsIDQyMzAuMDAgMzQ4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorJSBQb2x5bGluZQorbiA0MjAwIDQwNTAgbSA0MjAwIDQ1MDAgbCAgMzY3NSA0NTAwIGwgIDM2NzUgNDgwMCBsICBncyBjb2wtMSBzIGdyIAorbiAzNzA1LjAwIDQ2ODAuMDAgbSAzNjc1LjAwIDQ4MDAuMDAgbCAzNjQ1LjAwIDQ2ODAuMDAgbCAgMzY3NS41MCA0NjgwLjUwIGwgMzcwNS4wMCA0NjgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDMzNzUgNTI1MCBtIDMzNzUgNTcwMCBsICBncyBjb2wtMSBzIGdyIAorbiAzNDA1LjAwIDU1ODAuMDAgbSAzMzc1LjAwIDU3MDAuMDAgbCAzMzQ1LjAwIDU1ODAuMDAgbCAgMzM3NS41MCA1NTgwLjUwIGwgMzQwNS4wMCA1NTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDMzMDAgMjkyNSBtIDM3NTAgMjkyNSBsICBncyBjb2wtMSBzIGdyIAorbiAzNjMwLjAwIDI4OTUuMDAgbSAzNzUwLjAwIDI5MjUuMDAgbCAzNjMwLjAwIDI5NTUuMDAgbCAgMzYzMC41MCAyOTI1LjUwIGwgMzYzMC4wMCAyODk1LjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDE1MDAgMjYyNSBtIDE1MDAgMzMwMCBsICBncyBjb2wtMSBzIGdyIAorbiAxNTMwLjAwIDMxODAuMDAgbSAxNTAwLjAwIDMzMDAuMDAgbCAxNDcwLjAwIDMxODAuMDAgbCAgMTUwMC41MCAzMTgwLjUwIGwgMTUzMC4wMCAzMTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCislIFBvbHlsaW5lCituIDEwNTAgMzMwMCBtIDIxMDAgMzMwMCBsICAyMTAwIDM3NTAgbCAgMTA1MCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKKyUgUG9seWxpbmUKK24gNDg3NSAzODI1IG0gNTI1MCAzODI1IGwgIDUyNTAgMjQwMCBsICA1NTUwIDI0MDAgbCAgZ3MgY29sLTEgcyBnciAKK24gNTQzMC4wMCAyMzcwLjAwIG0gNTU1MC4wMCAyNDAwLjAwIGwgNTQzMC4wMCAyNDMwLjAwIGwgIDU0MzAuNTAgMjQwMC41MCBsIDU0MzAuMDAgMjM3MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorMTIwMCAxMjAwIG0KK2dzIDEgLTEgc2MgKGFjY29uZmlnLmgpIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzMwMDAgMTIwMCBtCitncyAxIC0xIHNjIChjb25maWd1cmUuaW4pIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzU3MDAgMTIwMCBtCitncyAxIC0xIHNjIChNYWtlZmlsZS5hbSkgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorMzkwMCAyMTAwIG0KK2dzIDEgLTEgc2MgKGFjaW5jbHVkZS5tNCkgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorMTIwMCAyNDAwIG0KK2dzIDEgLTEgc2MgKGF1dG9oZWFkZXIpIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzEyMDAgMzYwMCBtCitncyAxIC0xIHNjIChjb25maWcuaW4pIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzU3MDAgMzYwMCBtCitncyAxIC0xIHNjIChNYWtlZmlsZS5pbikgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorNTcwMCAyNDAwIG0KK2dzIDEgLTEgc2MgKGF1dG9tYWtlKSBjb2wtMSBzaG93IGdyCisvVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250CiszOTAwIDM5MDAgbQorZ3MgMSAtMSBzYyAoYWNsb2NhbC5tNCkgY29sLTEgc2hvdyBncgorL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAorMzkwMCAzMDAwIG0KK2dzIDEgLTEgc2MgKGFjbG9jYWwpIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzMwMDAgNjAwMCBtCitncyAxIC0xIHNjIChjb25maWd1cmUpIGNvbC0xIHNob3cgZ3IKKy9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKKzMwMDAgNTEwMCBtCitncyAxIC0xIHNjIChhdXRvY29uZikgY29sLTEgc2hvdyBncgorJEYycHNFbmQKK3Jlc3RvcmUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdkZXYuZmlnIGIvZXRjL2NvbmZpZ2Rldi5maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzODZlYwotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9jb25maWdkZXYuZmlnCkBAIC0wLDAgKzEsODAgQEAKKyNGSUcgMy4xCitQb3J0cmFpdAorQ2VudGVyCitJbmNoZXMKKzEyMDAgMgorMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQorCSAxMDUwIDkwMCAyMTAwIDkwMCAyMTAwIDE0MjUgMTA1MCAxNDI1IDEwNTAgOTAwCisyIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1CisJIDI5MjUgOTAwIDM5NzUgOTAwIDM5NzUgMTQyNSAyOTI1IDE0MjUgMjkyNSA5MDAKKzIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKKwkgNTU1MCA5MDAgNjc1MCA5MDAgNjc1MCAxMzUwIDU1NTAgMTM1MCA1NTUwIDkwMAorMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQorCSAzNzUwIDE4MDAgNTAyNSAxODAwIDUwMjUgMjI1MCAzNzUwIDIyNTAgMzc1MCAxODAwCisyIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1CisJIDIxNzUgMjYyNSAyMTc1IDIxMDAgMTA1MCAyMTAwIDEwNTAgMjYyNSAyMTc1IDI2MjUKKzIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKKwkgNTU1MCAzMzAwIDY2NzUgMzMwMCA2Njc1IDM3NTAgNTU1MCAzNzUwIDU1NTAgMzMwMAorMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQorCSA2NjAwIDI2MjUgNjYwMCAyMTAwIDU1NTAgMjEwMCA1NTUwIDI2MjUgNjYwMCAyNjI1CisyIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1CisJIDM3NTAgMzYwMCA0ODc1IDM2MDAgNDg3NSA0MDUwIDM3NTAgNDA1MCAzNzUwIDM2MDAKKzIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKKwkgNDY1MCAzMTUwIDQ2NTAgMjcwMCAzNzUwIDI3MDAgMzc1MCAzMTUwIDQ2NTAgMzE1MAorMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQorCSAyODUwIDU3MDAgMzc1MCA1NzAwIDM3NTAgNjE1MCAyODUwIDYxNTAgMjg1MCA1NzAwCisyIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1CisJIDM3NTAgNTI1MCAzNzUwIDQ4MDAgMjkyNSA0ODAwIDI5MjUgNTI1MCAzNzUwIDUyNTAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDE1MDAgMTQyNSAxNTAwIDIxMDAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDMzMDAgMTQyNSAzMzAwIDQ4MDAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAzCisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDMzMDAgMTU3NSAxODc1IDE1NzUgMTg3NSAyMTAwCisyIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMworCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAorCSAzMzAwIDE1NzUgNTcwMCAxNTc1IDU3MDAgMjEwMAorMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKKwkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKKwkgNjIyNSAxMzUwIDYyMjUgMjEwMAorMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKKwkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKKwkgNjA3NSAyNjI1IDYwNzUgMzMwMAorMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKKwkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKKwkgNDIwMCAyMjUwIDQyMDAgMjcwMAorMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKKwkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKKwkgNDIwMCAzMTUwIDQyMDAgMzYwMAorMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDQKKwkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKKwkgNDIwMCA0MDUwIDQyMDAgNDUwMCAzNjc1IDQ1MDAgMzY3NSA0ODAwCisyIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgorCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAorCSAzMzc1IDUyNTAgMzM3NSA1NzAwCisyIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgorCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAorCSAzMzAwIDI5MjUgMzc1MCAyOTI1CisyIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgorCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAorCSAxNTAwIDI2MjUgMTUwMCAzMzAwCisyIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1CisJIDEwNTAgMzMwMCAyMTAwIDMzMDAgMjEwMCAzNzUwIDEwNTAgMzc1MCAxMDUwIDMzMDAKKzIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCA0CisJMSAxIDEuMDAgNjAuMDAgMTIwLjAwCisJIDQ4NzUgMzgyNSA1MjUwIDM4MjUgNTI1MCAyNDAwIDU1NTAgMjQwMAorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA3ODAgMTIwMCAxMjAwIGFjY29uZmlnLmhcMDAxCis0IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDg4NSAzMDAwIDEyMDAgY29uZmlndXJlLmluXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA5NDUgNTcwMCAxMjAwIE1ha2VmaWxlLmFtXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA5OTAgMzkwMCAyMTAwIGFjaW5jbHVkZS5tNFwwMDEKKzQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODQwIDEyMDAgMjQwMCBhdXRvaGVhZGVyXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA2NDUgMTIwMCAzNjAwIGNvbmZpZy5pblwwMDEKKzQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODU1IDU3MDAgMzYwMCBNYWtlZmlsZS5pblwwMDEKKzQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgNzM1IDU3MDAgMjQwMCBhdXRvbWFrZVwwMDEKKzQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODEwIDM5MDAgMzkwMCBhY2xvY2FsLm00XDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA1NDAgMzkwMCAzMDAwIGFjbG9jYWxcMDAxCis0IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDcwNSAzMDAwIDYwMDAgY29uZmlndXJlXDAwMQorNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA2NjAgMzAwMCA1MTAwIGF1dG9jb25mXDAwMQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi5qaW4gYi9ldGMvY29uZmlnZGV2LmppbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjExYTcxCi0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZ2Rldi5qaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi50aW4gYi9ldGMvY29uZmlnZGV2LnRpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWI2ZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZ2Rldi50aW4KQEAgLTAsMCArMSwxNyBAQAorICAgYWNjb25maWcuaCAgICAgICBjb25maWd1cmUuaW4gICAgICAgICAgICAgICAgIE1ha2VmaWxlLmFtCisgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIHwgIC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIHwKKyAgICAgICB8ICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgICB8CisgICAgICAgdiAgdiAgICAgICAgICAgICB8ICAgIGFjaW5jbHVkZS5tNCAgICAgfCAgICAgfAorICAgKmF1dG9oZWFkZXIqICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHYgICAgIHYKKyAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICB2ICAgICAgLS0tPiphdXRvbWFrZSogCisgICAgICAgdiAgICAgICAgICAgICAgICB8LS0tPiphY2xvY2FsKiAgIHwgICAgICAgfCAgICAgIAorICAgY29uZmlnLmluICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgICAgIHYgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB2ICAgICAgfCAgIE1ha2VmaWxlLmluCisgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIGFjbG9jYWwubTQtLS0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYKKyAgICAgICAgICAgICAgICAgICAgICAgKmF1dG9jb25mKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdgorICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUgYi9ldGMvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwMWZjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvY29uZmlndXJlCkBAIC0wLDAgKzEsODYyIEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NTU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCitjYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgorcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLmluIGIvZXRjL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg1MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDcgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorQUNfUFJFUkVRKDIuNSkKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK0FDX1BST0dfSU5TVEFMTAorCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLnRleGkgYi9ldGMvY29uZmlndXJlLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0MDE2NwotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9jb25maWd1cmUudGV4aQpAQCAtMCwwICsxLDI2NDQgQEAKK1xpbnB1dCB0ZXhpbmZvCitAYyAlKipzdGFydCBvZiBoZWFkZXIKK0BzZXRmaWxlbmFtZSBjb25maWd1cmUuaW5mbworQHNldHRpdGxlIFRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KK0BzZXRjaGFwdGVybmV3cGFnZSBvZmYKK0BjICUqKmVuZCBvZiBoZWFkZXIKKworQGRpcmNhdGVnb3J5IEdOVSBhZG1pbgorQGRpcmVudHJ5CisqIGNvbmZpZ3VyZTogKGNvbmZpZ3VyZSkuCVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KK0BlbmQgZGlyZW50cnkKKworQGlmaW5mbworVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLgorCitDb3B5cmlnaHQgKEMpIDE5OTggQ3lnbnVzIFNvbHV0aW9ucy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQorcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAorZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKK2J5IHRoZSBGb3VuZGF0aW9uLgorQGVuZCBpZmluZm8KKworQHRpdGxlcGFnZQorQHRpdGxlIFRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KK0BhdXRob3IgSWFuIExhbmNlIFRheWxvcgorCitAcGFnZQorQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk4IEN5Z251cyBTb2x1dGlvbnMKKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQorcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAorZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24KK2FwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCitAZW5kIHRpdGxlcGFnZQorCitAaWZpbmZvCitAbm9kZSBUb3AKK0B0b3AgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCisKK1RoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0uCisKK0BtZW51CisqIEludHJvZHVjdGlvbjo6CQlJbnRyb2R1Y3Rpb24uCisqIEdldHRpbmcgU3RhcnRlZDo6CQlHZXR0aW5nIFN0YXJ0ZWQuCisqIEZpbGVzOjoJCQlGaWxlcy4KKyogQ29uZmlndXJhdGlvbiBOYW1lczo6CQlDb25maWd1cmF0aW9uIE5hbWVzLgorKiBDcm9zcyBDb21waWxhdGlvbiBUb29sczo6CUNyb3NzIENvbXBpbGF0aW9uIFRvb2xzLgorKiBDYW5hZGlhbiBDcm9zczo6CQlDYW5hZGlhbiBDcm9zcy4KKyogQ3lnbnVzIENvbmZpZ3VyZTo6CQlDeWdudXMgQ29uZmlndXJlLgorKiBNdWx0aWxpYnM6OgkJCU11bHRpbGlicy4KKyogRkFROjoJCQkJRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMuCisqIEluZGV4OjoJCQlJbmRleC4KK0BlbmQgbWVudQorCitAZW5kIGlmaW5mbworCitAbm9kZSBJbnRyb2R1Y3Rpb24KK0BjaGFwdGVyIEludHJvZHVjdGlvbgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtcy4gIEl0CitkZXNjcmliZXMgaG93IGF1dG9jb25mLCBhdXRvbWFrZSwgbGlidG9vbCwgYW5kIG1ha2UgZml0IHRvZ2V0aGVyLiAgSXQKK2Fsc28gaW5jbHVkZXMgYSBkaXNjdXNzaW9uIG9mIHRoZSBvbGRlciBDeWdudXMgY29uZmlndXJlIHN5c3RlbS4KKworVGhpcyBkb2N1bWVudCBkb2VzIG5vdCBkZXNjcmliZSBpbiBkZXRhaWwgaG93IHRvIHVzZSBlYWNoIG9mIHRoZSB0b29sczsKK3NlZSB0aGUgcmVzcGVjdGl2ZSBtYW51YWxzIGZvciB0aGF0LiAgSW5zdGVhZCwgaXQgZGVzY3JpYmVzIHdoaWNoIGZpbGVzCit0aGUgZGV2ZWxvcGVyIG11c3Qgd3JpdGUsIHdoaWNoIGZpbGVzIGFyZSBtYWNoaW5lIGdlbmVyYXRlZCBhbmQgaG93IHRoZXkKK2FyZSBnZW5lcmF0ZWQsIGFuZCB3aGVyZSBjZXJ0YWluIGNvbW1vbiBwcm9ibGVtcyBzaG91bGQgYmUgYWRkcmVzc2VkLgorCitAaWZub3RodG1sCitUaGlzIGRvY3VtZW50IGRyYXdzIG9uIHNldmVyYWwgc291cmNlcywgaW5jbHVkaW5nIHRoZSBhdXRvY29uZiBtYW51YWwgYnkKK0RhdmlkIE1hY0tlbnppZSAoQHB4cmVme1RvcCwgLCBhdXRvY29uZiBvdmVydmlldywgYXV0b2NvbmYsIEF1dG9jb25mfSksCit0aGUgYXV0b21ha2UgbWFudWFsIGJ5IERhdmlkIE1hY0tlbnppZSBhbmQgVG9tIFRyb21leSAoQHB4cmVme1RvcCwgLAorYXV0b21ha2Ugb3ZlcnZpZXcsIGF1dG9tYWtlLCBHTlUgQXV0b21ha2V9KSwgdGhlIGxpYnRvb2wgbWFudWFsIGJ5CitHb3Jkb24gTWF0emlna2VpdCAoQHB4cmVme1RvcCwgLCBsaWJ0b29sIG92ZXJ2aWV3LCBsaWJ0b29sLCBHTlUKK2xpYnRvb2x9KSwgYW5kIHRoZSBDeWdudXMgY29uZmlndXJlIG1hbnVhbCBieSBLLiBSaWNoYXJkIFBpeGxleS4KK0BlbmQgaWZub3RodG1sCitAaWZodG1sCitUaGlzIGRvY3VtZW50IGRyYXdzIG9uIHNldmVyYWwgc291cmNlcywgaW5jbHVkaW5nCitAdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9jb25mL2F1dG9jb25mX3RvYy5odG1sLCB0aGUKK2F1dG9jb25mIG1hbnVhbH0gYnkgRGF2aWQgTWFjS2VuemllLAorQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvbWFrZS9hdXRvbWFrZV90b2MuaHRtbCwgdGhlCithdXRvbWFrZSBtYW51YWx9IGJ5IERhdmlkIE1hY0tlbnppZSBhbmQgVG9tIFRyb21leSwKK0B1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvbGlidG9vbC9saWJ0b29sX3RvYy5odG1sLCB0aGUKK2xpYnRvb2wgbWFudWFsfSBieSBHb3Jkb24gTWF0emlna2VpdCwgYW5kIHRoZSBDeWdudXMgY29uZmlndXJlIG1hbnVhbCBieQorSy4gUmljaGFyZCBQaXhsZXkuCitAZW5kIGlmaHRtbAorCitAbWVudQorKiBHb2Fsczo6CQkJR29hbHMuCisqIFRvb2xzOjoJCQlUaGUgdG9vbHMuCisqIEhpc3Rvcnk6OgkJCUhpc3RvcnkuCisqIEJ1aWxkaW5nOjoJCQlCdWlsZGluZy4KK0BlbmQgbWVudQorCitAbm9kZSBHb2FscworQHNlY3Rpb24gR29hbHMKK0BjaW5kZXggZ29hbHMKKworVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBoYXMgdHdvIG1haW4gZ29hbHMuCisKK1RoZSBmaXJzdCBpcyB0byBzaW1wbGlmeSB0aGUgZGV2ZWxvcG1lbnQgb2YgcG9ydGFibGUgcHJvZ3JhbXMuICBUaGUKK3N5c3RlbSBwZXJtaXRzIHRoZSBkZXZlbG9wZXIgdG8gY29uY2VudHJhdGUgb24gd3JpdGluZyB0aGUgcHJvZ3JhbSwKK3NpbXBsaWZ5aW5nIG1hbnkgZGV0YWlscyBvZiBwb3J0YWJpbGl0eSBhY3Jvc3MgVW5peCBhbmQgZXZlbiBXaW5kb3dzCitzeXN0ZW1zLCBhbmQgcGVybWl0dGluZyB0aGUgZGV2ZWxvcGVyIHRvIGRlc2NyaWJlIGhvdyB0byBidWlsZCB0aGUKK3Byb2dyYW0gdXNpbmcgc2ltcGxlIHJ1bGVzIHJhdGhlciB0aGFuIGNvbXBsZXggTWFrZWZpbGVzLgorCitUaGUgc2Vjb25kIGlzIHRvIHNpbXBsaWZ5IHRoZSBidWlsZGluZyBvZiBwcm9ncmFtcyBkaXN0cmlidXRlZCBhcyBzb3VyY2UKK2NvZGUuICBBbGwgcHJvZ3JhbXMgYXJlIGJ1aWx0IHVzaW5nIGEgc2ltcGxlLCBzdGFuZGFyZGl6ZWQsIHR3byBzdGVwCitwcm9jZXNzLiAgVGhlIHByb2dyYW0gYnVpbGRlciBuZWVkIG5vdCBpbnN0YWxsIGFueSBzcGVjaWFsIHRvb2xzIGluCitvcmRlciB0byBidWlsZCB0aGUgcHJvZ3JhbS4KKworQG5vZGUgVG9vbHMKK0BzZWN0aW9uIFRvb2xzCisKK1RoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gaXMgY29tcHJpc2VkIG9mIHNldmVyYWwgZGlmZmVyZW50Cit0b29scy4gIFByb2dyYW0gZGV2ZWxvcGVycyBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsIGFsbCBvZiB0aGVzZSB0b29scy4KKworUGVvcGxlIHdobyBqdXN0IHdhbnQgdG8gYnVpbGQgcHJvZ3JhbXMgZnJvbSBkaXN0cmlidXRlZCBzb3VyY2VzIG5vcm1hbGx5CitkbyBub3QgbmVlZCBhbnkgc3BlY2lhbCB0b29scyBiZXlvbmQgYSBVbml4IHNoZWxsLCBhIG1ha2UgcHJvZ3JhbSwgYW5kIGEKK0MgY29tcGlsZXIuCisKK0B0YWJsZSBAYXNpcworQGl0ZW0gYXV0b2NvbmYKK3Byb3ZpZGVzIGEgZ2VuZXJhbCBwb3J0YWJpbGl0eSBmcmFtZXdvcmssIGJhc2VkIG9uIHRlc3RpbmcgdGhlIGZlYXR1cmVzCitvZiB0aGUgaG9zdCBzeXN0ZW0gYXQgYnVpbGQgdGltZS4KK0BpdGVtIGF1dG9tYWtlCithIHN5c3RlbSBmb3IgZGVzY3JpYmluZyBob3cgdG8gYnVpbGQgYSBwcm9ncmFtLCBwZXJtaXR0aW5nIHRoZSBkZXZlbG9wZXIKK3RvIHdyaXRlIGEgc2ltcGxpZmllZCBAZmlsZXtNYWtlZmlsZX0uCitAaXRlbSBsaWJ0b29sCithIHN0YW5kYXJkaXplZCBhcHByb2FjaCB0byBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorQGl0ZW0gZ2V0dGV4dAorcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHRyYW5zbGF0aW9uIG9mIHRleHQgbWVzc2FnZXMgaW50byBvdGhlcgorbGFuZ3VhZ2VzOyBub3QgcmVhbGx5IGRpc2N1c3NlZCBpbiB0aGlzIGRvY3VtZW50LgorQGl0ZW0gbTQKK2F1dG9jb25mIHJlcXVpcmVzIHRoZSBHTlUgdmVyc2lvbiBvZiBtNDsgdGhlIHN0YW5kYXJkIFVuaXggbTQgZG9lcyBub3QKK3N1ZmZpY2UuCitAaXRlbSBwZXJsCithdXRvbWFrZSByZXF1aXJlcyBwZXJsLgorQGVuZCB0YWJsZQorCitAbm9kZSBIaXN0b3J5CitAc2VjdGlvbiBIaXN0b3J5CitAY2luZGV4IGhpc3RvcnkKKworVGhpcyBpcyBhIHZlcnkgYnJpZWYgYW5kIHByb2JhYmx5IGluYWNjdXJhdGUgaGlzdG9yeS4KKworQXMgdGhlIG51bWJlciBvZiBVbml4IHZhcmlhbnRzIGluY3JlYXNlZCBkdXJpbmcgdGhlIDE5ODBzLCBpdCBiZWNhbWUKK2hhcmRlciB0byB3cml0ZSBwcm9ncmFtcyB3aGljaCBjb3VsZCBydW4gb24gYWxsIHZhcmlhbnRzLiAgV2hpbGUgaXQgd2FzCitvZnRlbiBwb3NzaWJsZSB0byB1c2UgQGNvZGV7I2lmZGVmfSB0byBpZGVudGlmeSBwYXJ0aWN1bGFyIHN5c3RlbXMsCitkZXZlbG9wZXJzIGZyZXF1ZW50bHkgZGlkIG5vdCBoYXZlIGFjY2VzcyB0byBldmVyeSBzeXN0ZW0sIGFuZCB0aGUKK2NoYXJhY3RlcmlzdGljcyBvZiBzb21lIHN5c3RlbXMgY2hhbmdlZCBmcm9tIHZlcnNpb24gdG8gdmVyc2lvbi4KKworQnkgMTk5MiwgYXQgbGVhc3QgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXMgaGFkIGJlZW4gZGV2ZWxvcGVkOgorQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1RoZSBNZXRhY29uZmlnIHByb2dyYW0sIGJ5IExhcnJ5IFdhbGwsIEhhcmxhbiBTdGVubiwgYW5kIFJhcGhhZWwKK01hbmZyZWRpLgorQGl0ZW0KK1RoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCwgYnkgSy4gUmljaGFyZCBQaXhsZXksIGFuZCB0aGUgZ2NjIGNvbmZpZ3VyZQorc2NyaXB0LCBieSBSaWNoYXJkIFN0YWxsbWFuLiAgVGhlc2UgdXNlIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFwcHJvYWNoLAorYW5kIHRoZSBkZXZlbG9wZXJzIGNvbW11bmljYXRlZCByZWd1bGFybHkuCitAaXRlbQorVGhlIGF1dG9jb25mIHByb2dyYW0sIGJ5IERhdmlkIE1hY0tlbnppZS4KK0BlbmQgaXRlbWl6ZQorCitUaGUgTWV0YWNvbmZpZyBwcm9ncmFtIGlzIHN0aWxsIHVzZWQgZm9yIFBlcmwgYW5kIGEgZmV3IG90aGVyIHByb2dyYW1zLgorSXQgaXMgcGFydCBvZiB0aGUgRGlzdCBwYWNrYWdlLiAgSSBkbyBub3Qga25vdyBpZiBpdCBpcyBiZWluZyBkZXZlbG9wZWQuCisKK0luIDE5OTQsIERhdmlkIE1hY0tlbnppZSBhbmQgb3RoZXJzIG1vZGlmaWVkIGF1dG9jb25mIHRvIGluY29ycG9yYXRlIGFsbAordGhlIGZlYXR1cmVzIG9mIEN5Z251cyBjb25maWd1cmUuICBTaW5jZSB0aGVuLCB0aGVyZSBoYXMgYmVlbiBhIHNsb3cgYnV0CitzdGVhZHkgY29udmVyc2lvbiBvZiBHTlUgcHJvZ3JhbXMgZnJvbSBDeWdudXMgY29uZmlndXJlIHRvIGF1dG9jb25mLiBnY2MKK2hhcyBiZWVuIGNvbnZlcnRlZCwgZWxpbWluYXRpbmcgdGhlIGdjYyBjb25maWd1cmUgc2NyaXB0LgorCitHTlUgYXV0b2NvbmYgd2FzIHJlZ3VsYXJseSBtYWludGFpbmVkIHVudGlsIGxhdGUgMTk5Ni4gIEFzIG9mIHRoaXMKK3dyaXRpbmcgaW4gSnVuZSwgMTk5OCwgaXQgaGFzIG5vIHB1YmxpYyBtYWludGFpbmVyLgorCitNb3N0IHByb2dyYW1zIGFyZSBidWlsdCB1c2luZyB0aGUgbWFrZSBwcm9ncmFtLCB3aGljaCByZXF1aXJlcyB0aGUKK2RldmVsb3BlciB0byB3cml0ZSBNYWtlZmlsZXMgZGVzY3JpYmluZyBob3cgdG8gYnVpbGQgdGhlIHByb2dyYW1zLgorU2luY2UgbW9zdCBwcm9ncmFtcyBhcmUgYnVpbHQgaW4gcHJldHR5IG11Y2ggdGhlIHNhbWUgd2F5LCB0aGlzIGxlZCB0byBhCitsb3Qgb2YgZHVwbGljYXRpb24uCisKK1RoZSBYIFdpbmRvdyBzeXN0ZW0gaXMgYnVpbHQgdXNpbmcgdGhlIGltYWtlIHRvb2wsIHdoaWNoIHVzZXMgYSBkYXRhYmFzZQorb2YgcnVsZXMgdG8gZWxpbWluYXRlIHRoZSBkdXBsaWNhdGlvbi4gIEhvd2V2ZXIsIGJ1aWxkaW5nIGEgdG9vbCB3aGljaAord2FzIGRldmVsb3BlZCB1c2luZyBpbWFrZSByZXF1aXJlcyB0aGF0IHRoZSBidWlsZGVyIGhhdmUgaW1ha2UKK2luc3RhbGxlZCwgdmlvbGF0aW5nIG9uZSBvZiB0aGUgZ29hbHMgb2YgdGhlIEdOVSBzeXN0ZW0uCisKK1RoZSBuZXcgQlNEIG1ha2UgcHJvdmlkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IG9mIE1ha2VmaWxlIGZyYWdtZW50cywKK3doaWNoIHBlcm1pdHMgZGV2ZWxvcGVycyB0byB3cml0ZSB2ZXJ5IHNpbXBsZSBNYWtlZmlsZXMuICBIb3dldmVyLCB0aGlzCityZXF1aXJlcyB0aGF0IHRoZSBidWlsZGVyIGluc3RhbGwgdGhlIG5ldyBCU0QgbWFrZSBwcm9ncmFtLgorCitJbiAxOTk0LCBEYXZpZCBNYWNLZW56aWUgd3JvdGUgdGhlIGZpcnN0IHZlcnNpb24gb2YgYXV0b21ha2UsIHdoaWNoCitwZXJtaXR0ZWQgd3JpdGluZyBhIHNpbXBsZSBidWlsZCBkZXNjcmlwdGlvbiB3aGljaCB3YXMgY29udmVydGVkIGludG8gYQorTWFrZWZpbGUgd2hpY2ggY291bGQgYmUgdXNlZCBieSB0aGUgc3RhbmRhcmQgbWFrZSBwcm9ncmFtLiAgSW4gMTk5NSwgVG9tCitUcm9tZXkgY29tcGxldGVseSByZXdyb3RlIGF1dG9tYWtlIGluIFBlcmwsIGFuZCBoZSBjb250aW51ZXMgdG8gZW5oYW5jZQoraXQuCisKK1ZhcmlvdXMgZnJlZSBwYWNrYWdlcyBidWlsdCBsaWJyYXJpZXMsIGFuZCBieSBhcm91bmQgMTk5NSBzZXZlcmFsCitpbmNsdWRlZCBzdXBwb3J0IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgb24gdmFyaW91cyBwbGF0Zm9ybXMuCitIb3dldmVyLCB0aGVyZSB3YXMgbm8gY29uc2lzdGVudCBhcHByb2FjaC4gIEluIGVhcmx5IDE5OTYsIEdvcmRvbgorTWF0emlna2VpdCBiZWdhbiB3b3JraW5nIG9uIGxpYnRvb2wsIHdoaWNoIHByb3ZpZGVkIGEgc3RhbmRhcmRpemVkCithcHByb2FjaCB0byBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLiAgVGhpcyB3YXMgaW50ZWdyYXRlZCBpbnRvCithdXRvbWFrZSBmcm9tIHRoZSBzdGFydC4KKworVGhlIGRldmVsb3BtZW50IG9mIGF1dG9tYWtlIGFuZCBsaWJ0b29sIHdhcyBkcml2ZW4gYnkgdGhlIEdOSVRTIHByb2plY3QsCithIGdyb3VwIG9mIEdOVSBtYWludGFpbmVycyB3aG8gZGVzaWduZWQgc3RhbmRhcmRpemVkIHRvb2xzIHRvIGhlbHAgbWVldAordGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgorCitAbm9kZSBCdWlsZGluZworQHNlY3Rpb24gQnVpbGRpbmcKKworTW9zdCByZWFkZXJzIG9mIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFscmVhZHkga25vdyBob3cgdG8gYnVpbGQgYSB0b29sIGJ5CitydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0gYW5kIEBzYW1we21ha2V9LiAgVGhpcyBzZWN0aW9uIG1heSBzZXJ2ZSBhcyBhCitxdWljayBpbnRyb2R1Y3Rpb24gb3IgcmVtaW5kZXIuCisKK0J1aWxkaW5nIGEgdG9vbCBpcyBub3JtYWxseSBhcyBzaW1wbGUgYXMgcnVubmluZyBAc2FtcHtjb25maWd1cmV9Citmb2xsb3dlZCBieSBAc2FtcHttYWtlfS4gIFlvdSBzaG91bGQgbm9ybWFsbHkgcnVuIEBzYW1we2NvbmZpZ3VyZX0gZnJvbQorYW4gZW1wdHkgZGlyZWN0b3J5LCB1c2luZyBzb21lIHBhdGggdG8gcmVmZXIgdG8gdGhlIEBzYW1we2NvbmZpZ3VyZX0KK3NjcmlwdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggeW91IHJ1bgorQHNhbXB7Y29uZmlndXJlfSBpcyBjYWxsZWQgdGhlIEBkZm57b2JqZWN0IGRpcmVjdG9yeX0uCisKK0luIG9yZGVyIHRvIHVzZSBhIG9iamVjdCBkaXJlY3Rvcnkgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIHNvdXJjZQorZGlyZWN0b3J5LCB5b3UgbXVzdCBiZSB1c2luZyB0aGUgR05VIHZlcnNpb24gb2YgQHNhbXB7bWFrZX0sIHdoaWNoIGhhcwordGhlIHJlcXVpcmVkIEBzYW1we1ZQQVRIfSBzdXBwb3J0LiAgRGVzcGl0ZSB0aGlzIHJlc3RyaWN0aW9uLCB1c2luZyBhCitkaWZmZXJlbnQgb2JqZWN0IGRpcmVjdG9yeSBpcyBoaWdobHkgcmVjb21tZW5kZWQ6CitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorSXQga2VlcHMgdGhlIGZpbGVzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGJ1aWxkIGZyb20gY2x1dHRlcmluZyB1cCB5b3VyCitzb3VyY2VzLgorQGl0ZW0gCitJdCBwZXJtaXRzIHlvdSB0byByZW1vdmUgdGhlIGJ1aWx0IGZpbGVzIGJ5IHNpbXBseSByZW1vdmluZyB0aGUgZW50aXJlCitidWlsZCBkaXJlY3RvcnkuCitAaXRlbQorSXQgcGVybWl0cyB5b3UgdG8gYnVpbGQgZnJvbSB0aGUgc2FtZSBzb3VyY2VzIHdpdGggc2V2ZXJhbCBzZXRzIG9mCitjb25maWd1cmUgb3B0aW9ucyBzaW11bHRhbmVvdXNseS4KK0BlbmQgaXRlbWl6ZQorCitJZiB5b3UgZG9uJ3QgaGF2ZSBHTlUgQHNhbXB7bWFrZX0sIHlvdSB3aWxsIGhhdmUgdG8gcnVuIEBzYW1we2NvbmZpZ3VyZX0KK2luIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQWxsIEdOVSBwYWNrYWdlcyBzaG91bGQgc3VwcG9ydCB0aGlzOyBpbgorcGFydGljdWxhciwgR05VIHBhY2thZ2VzIHNob3VsZCBub3QgYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBHTlUKK0BzYW1we21ha2V9LgorCitBZnRlciBydW5uaW5nIEBzYW1we2NvbmZpZ3VyZX0sIHlvdSBjYW4gYnVpbGQgdGhlIHRvb2xzIGJ5IHJ1bm5pbmcKK0BzYW1we21ha2V9LgorCitUbyBpbnN0YWxsIHRoZSB0b29scywgcnVuIEBzYW1we21ha2UgaW5zdGFsbH0uICBJbnN0YWxsaW5nIHRoZSB0b29scword2lsbCBjb3B5IHRoZSBwcm9ncmFtcyBhbmQgYW55IHJlcXVpcmVkIHN1cHBvcnQgZmlsZXMgdG8gdGhlCitAZGZue2luc3RhbGxhdGlvbiBkaXJlY3Rvcnl9LiAgVGhlIGxvY2F0aW9uIG9mIHRoZSBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeSBpcyBjb250cm9sbGVkIGJ5IEBzYW1we2NvbmZpZ3VyZX0gb3B0aW9ucywgYXMgZGVzY3JpYmVkIGJlbG93LgorCitJbiB0aGUgQ3lnbnVzIHRyZWUgYXQgcHJlc2VudCwgdGhlIGluZm8gZmlsZXMgYXJlIGJ1aWx0IGFuZCBpbnN0YWxsZWQgYXMKK2Egc2VwYXJhdGUgc3RlcC4gIFRvIGJ1aWxkIHRoZW0sIHJ1biBAc2FtcHttYWtlIGluZm99LiAgVG8gaW5zdGFsbCB0aGVtLAorcnVuIEBzYW1we21ha2UgaW5zdGFsbC1pbmZvfS4KKworQWxsIEBzYW1we2NvbmZpZ3VyZX0gc2NyaXB0cyBzdXBwb3J0IGEgd2lkZSB2YXJpZXR5IG9mIG9wdGlvbnMuICBUaGUKK21vc3QgaW50ZXJlc3Rpbmcgb25lcyBhcmUgQHNhbXB7LS13aXRofSBhbmQgQHNhbXB7LS1lbmFibGV9IG9wdGlvbnMKK3doaWNoIGFyZSBnZW5lcmFsbHkgc3BlY2lmaWMgdG8gcGFydGljdWxhciB0b29scy4gIFlvdSBjYW4gdXN1YWxseSB1c2UKK3RoZSBAc2FtcHstLWhlbHB9IG9wdGlvbiB0byBnZXQgYSBsaXN0IG9mIGludGVyZXN0aW5nIG9wdGlvbnMgZm9yIGEKK3BhcnRpY3VsYXIgY29uZmlndXJlIHNjcmlwdC4KKworVGhlIG9ubHkgZ2VuZXJpYyBvcHRpb25zIHlvdSBhcmUgbGlrZWx5IHRvIHVzZSBhcmUgdGhlIEBzYW1wey0tcHJlZml4fQorYW5kIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMuICBUaGVzZSBvcHRpb25zIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitUaGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBAc2FtcHstLXByZWZpeH0gb3B0aW9uIHdpbGwgaG9sZCBtYWNoaW5lCitpbmRlcGVuZGVudCBmaWxlcyBzdWNoIGFzIGluZm8gZmlsZXMuCisKK1RoZSBkaXJlY3RvcnkgbmFtZWQgYnkgdGhlIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbiwgd2hpY2ggaXMKK25vcm1hbGx5IGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBAc2FtcHstLXByZWZpeH0gZGlyZWN0b3J5LCB3aWxsIGhvbGQKK21hY2hpbmUgZGVwZW5kZW50IGZpbGVzIHN1Y2ggYXMgZXhlY3V0YWJsZXMuCisKK1RoZSBkZWZhdWx0IGZvciBAc2FtcHstLXByZWZpeH0gaXMgQGZpbGV7L3Vzci9sb2NhbH0uICBUaGUgZGVmYXVsdCBmb3IKK0BzYW1wey0tZXhlYy1wcmVmaXh9IGlzIHRoZSB2YWx1ZSB1c2VkIGZvciBAc2FtcHstLXByZWZpeH0uCisKK1RoZSBjb252ZW50aW9uIHVzZWQgaW4gQ3lnbnVzIHJlbGVhc2VzIGlzIHRvIHVzZSBhIEBzYW1wey0tcHJlZml4fQorb3B0aW9uIG9mIEBmaWxley91c3IvY3lnbnVzL0B2YXJ7cmVsZWFzZX19LCB3aGVyZSBAdmFye3JlbGVhc2V9IGlzIHRoZQorbmFtZSBvZiB0aGUgcmVsZWFzZSwgYW5kIHRvIHVzZSBhIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbiBvZgorQGZpbGV7L3Vzci9jeWdudXMvQHZhcntyZWxlYXNlfS9ILUB2YXJ7aG9zdH19LCB3aGVyZSBAdmFye2hvc3R9IGlzIHRoZQorY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBob3N0IHN5c3RlbSAoQHB4cmVme0NvbmZpZ3VyYXRpb24gTmFtZXN9KS4KKworRG8gbm90IHVzZSBlaXRoZXIgdGhlIHNvdXJjZSBvciB0aGUgb2JqZWN0IGRpcmVjdG9yeSBhcyB0aGUgaW5zdGFsbGF0aW9uCitkaXJlY3RvcnkuICBUaGF0IHdpbGwganVzdCBsZWFkIHRvIGNvbmZ1c2lvbi4KKworQG5vZGUgR2V0dGluZyBTdGFydGVkCitAY2hhcHRlciBHZXR0aW5nIFN0YXJ0ZWQKKworVG8gc3RhcnQgdXNpbmcgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSB3aXRoIHlvdXIgc29mdHdhcmUKK3BhY2thZ2UsIHlvdSBtdXN0IHdyaXRlIHRocmVlIGZpbGVzLCBhbmQgeW91IG11c3QgcnVuIHNvbWUgdG9vbHMgdG8KK21hbnVhbGx5IGdlbmVyYXRlIGFkZGl0aW9uYWwgZmlsZXMuCisKK0BtZW51CisqIFdyaXRlIGNvbmZpZ3VyZS5pbjo6CQlXcml0ZSBjb25maWd1cmUuaW4uCisqIFdyaXRlIE1ha2VmaWxlLmFtOjoJCVdyaXRlIE1ha2VmaWxlLmFtLgorKiBXcml0ZSBhY2NvbmZpZy5oOjoJCVdyaXRlIGFjY29uZmlnLmguCisqIEdlbmVyYXRlIGZpbGVzOjoJCUdlbmVyYXRlIGZpbGVzLgorKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZTo6CUV4YW1wbGUuCitAZW5kIG1lbnUKKworQG5vZGUgV3JpdGUgY29uZmlndXJlLmluCitAc2VjdGlvbiBXcml0ZSBjb25maWd1cmUuaW4KK0BjaW5kZXggQGZpbGV7Y29uZmlndXJlLmlufSwgd3JpdGluZworCitZb3UgbXVzdCBmaXJzdCB3cml0ZSB0aGUgZmlsZSBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBpcyBhbiBhdXRvY29uZgoraW5wdXQgZmlsZSwgYW5kIHRoZSBhdXRvY29uZiBtYW51YWwgZGVzY3JpYmVzIGluIGRldGFpbCB3aGF0IHRoaXMgZmlsZQorc2hvdWxkIGxvb2sgbGlrZS4KKworWW91IHdpbGwgd3JpdGUgdGVzdHMgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgdG8gY2hlY2sgZm9yCitjb25kaXRpb25zIHRoYXQgbWF5IGNoYW5nZSBmcm9tIG9uZSBzeXN0ZW0gdG8gYW5vdGhlciwgc3VjaCBhcyB0aGUKK3ByZXNlbmNlIG9mIHBhcnRpY3VsYXIgaGVhZGVyIGZpbGVzIG9yIGZ1bmN0aW9ucy4KKworRm9yIGV4YW1wbGUsIG5vdCBhbGwgc3lzdGVtcyBzdXBwb3J0IHRoZSBAc2FtcHtnZXR0aW1lb2ZkYXl9IGZ1bmN0aW9uLgorSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBAc2FtcHtnZXR0aW1lb2ZkYXl9IGZ1bmN0aW9uIHdoZW4gaXQgaXMKK2F2YWlsYWJsZSwgYW5kIHRvIHVzZSBzb21lIG90aGVyIGZ1bmN0aW9uIHdoZW4gaXQgaXMgbm90LCB5b3Ugd291bGQKK2NoZWNrIGZvciB0aGlzIGJ5IHB1dHRpbmcgQHNhbXB7QUNfQ0hFQ0tfRlVOQ1MoZ2V0dGltZW9mZGF5KX0gaW4KK0BmaWxle2NvbmZpZ3VyZS5pbn0uCisKK1doZW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVuIGF0IGJ1aWxkIHRpbWUsIHRoaXMgd2lsbCBhcnJhbmdlIHRvCitkZWZpbmUgdGhlIHByZXByb2Nlc3NvciBtYWNybyBAc2FtcHtIQVZFX0dFVFRJTUVPRkRBWX0gdG8gdGhlIHZhbHVlIDEgaWYKK3RoZSBAc2FtcHtnZXR0aW1lb2ZkYXl9IGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgYW5kIHRvIG5vdCBkZWZpbmUgdGhlCittYWNybyBhdCBhbGwgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBZb3VyIGNvZGUgY2FuIHRoZW4gdXNlCitAc2FtcHsjaWZkZWZ9IHRvIHRlc3Qgd2hldGhlciBpdCBpcyBzYWZlIHRvIGNhbGwgQHNhbXB7Z2V0dGltZW9mZGF5fS4KKworSWYgeW91IGhhdmUgYW4gZXhpc3RpbmcgYm9keSBvZiBjb2RlLCB0aGUgQHNhbXB7YXV0b3NjYW59IHByb2dyYW0gbWF5CitoZWxwIGlkZW50aWZ5IHBvdGVudGlhbCBwb3J0YWJpbGl0eSBwcm9ibGVtcywgYW5kIGhlbmNlIGNvbmZpZ3VyZSB0ZXN0cwordGhhdCB5b3Ugd2lsbCB3YW50IHRvIHVzZS4KK0BpZm5vdGh0bWwKK0B4cmVme0ludm9raW5nIGF1dG9zY2FuLCAsICwgYXV0b2NvbmYsIHRoZSBhdXRvY29uZiBtYW51YWx9LgorQGVuZCBpZm5vdGh0bWwKK0BpZmh0bWwKK1NlZSBAdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2F1dG9jb25mL2F1dG9jb25mXzQuaHRtbCwgdGhlCithdXRvc2NhbiBkb2N1bWVudGF0aW9ufS4KK0BlbmQgaWZodG1sCisKK0Fub3RoZXIgaGFuZHkgdG9vbCBmb3IgYW4gZXhpc3RpbmcgYm9keSBvZiBjb2RlIGlzIEBzYW1we2lmbmFtZXN9LiAgVGhpcword2lsbCBzaG93IHlvdSBhbGwgdGhlIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgdGhhdCB0aGUgY29kZSBhbHJlYWR5Cit1c2VzLgorQGlmbm90aHRtbAorQHhyZWZ7SW52b2tpbmcgaWZuYW1lcywgLCAsIGF1dG9jb25mLCB0aGUgYXV0b2NvbmYgbWFudWFsfS4KK0BlbmQgaWZub3RodG1sCitAaWZodG1sCitTZWUgQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl81Lmh0bWwsIHRoZQoraWZuYW1lcyBkb2N1bWVudGF0aW9ufS4KK0BlbmQgaWZodG1sCisKK0Jlc2lkZXMgdGhlIHBvcnRhYmlsaXR5IHRlc3RzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byB5b3VyIHBhcnRpY3VsYXIKK3BhY2thZ2UsIGV2ZXJ5IEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBzaG91bGQgY29udGFpbiB0aGUgZm9sbG93aW5nCittYWNyb3MuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gQUNfSU5JVAorQGNpbmRleCBAc2FtcHtBQ19JTklUfQorVGhpcyBtYWNybyB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHlvdXIKK3BhY2thZ2UuICBGb3IgZXhhbXBsZSwgQHNhbXB7QUNfSU5JVChmb28uYyl9LgorCitAaXRlbSBBQ19QUkVSRVEoQHZhcntWRVJTSU9OfSkKK0BjaW5kZXggQHNhbXB7QUNfUFJFUkVRfQorVGhpcyBtYWNybyBpcyBvcHRpb25hbC4gIEl0IG1heSBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mCitAc2FtcHthdXRvY29uZn0gdGhhdCB5b3UgYXJlIHVzaW5nLiAgVGhpcyB3aWxsIHByZXZlbnQgdXNlcnMgZnJvbQorcnVubmluZyBhbiBlYXJsaWVyIHZlcnNpb24gb2YgQHNhbXB7YXV0b2NvbmZ9IGFuZCBwZXJoYXBzIGdldHRpbmcgYW4KK2ludmFsaWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBGb3IgZXhhbXBsZSwgQHNhbXB7QUNfUFJFUkVRKDIuMTIpfS4KKworQGl0ZW0gQU1fSU5JVF9BVVRPTUFLRQorQGNpbmRleCBAc2FtcHtBTV9JTklUX0FVVE9NQUtFfQorVGhpcyBtYWNybyB0YWtlcyB0d28gYXJndW1lbnRzOiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgYW5kIGEgdmVyc2lvbgorbnVtYmVyLiAgRm9yIGV4YW1wbGUsIEBzYW1we0FNX0lOSVRfQVVUT01BS0UoZm9vLCAxLjApfS4gIChUaGlzIG1hY3JvIGlzCitub3QgbmVlZGVkIGlmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlKS4KKworQGl0ZW0gQU1fQ09ORklHX0hFQURFUgorQGNpbmRleCBAc2FtcHtBTV9DT05GSUdfSEVBREVSfQorVGhpcyBtYWNybyBuYW1lcyB0aGUgaGVhZGVyIGZpbGUgd2hpY2ggd2lsbCBob2xkIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8KK2RlZmluaXRpb25zIGF0IHJ1biB0aW1lLiAgTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgQGZpbGV7Y29uZmlnLmh9LiAgWW91cgorc291cmNlcyB3b3VsZCB0aGVuIHVzZSBAc2FtcHsjaW5jbHVkZSAiY29uZmlnLmgifSB0byBpbmNsdWRlIGl0LgorCitUaGlzIG1hY3JvIG1heSBvcHRpb25hbGx5IG5hbWUgdGhlIGlucHV0IGZpbGUgZm9yIHRoYXQgaGVhZGVyIGZpbGU7IGJ5CitkZWZhdWx0LCB0aGlzIGlzIEBmaWxle2NvbmZpZy5oLmlufSwgYnV0IHRoYXQgZmlsZSBuYW1lIHdvcmtzIHBvb3JseSBvbgorRE9TIGZpbGVzeXN0ZW1zLiAgVGhlcmVmb3JlLCBpdCBpcyBvZnRlbiBiZXR0ZXIgdG8gbmFtZSBpdCBleHBsaWNpdGx5IGFzCitAZmlsZXtjb25maWcuaW59LgorCitUaGlzIGlzIHdoYXQgeW91IHNob3VsZCBub3JtYWxseSBwdXQgaW4gQGZpbGV7Y29uZmlndXJlLmlufToKK0BleGFtcGxlCitBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKK0BlbmQgZXhhbXBsZQorCitAY2luZGV4IEBzYW1we0FDX0NPTkZJR19IRUFERVJ9CisoSWYgeW91IGFyZSBub3QgdXNpbmcgYXV0b21ha2UsIHVzZSBAc2FtcHtBQ19DT05GSUdfSEVBREVSfSByYXRoZXIgdGhhbgorQHNhbXB7QU1fQ09ORklHX0hFQURFUn0pLgorCitAaXRlbSBBTV9NQUlOVEFJTkVSX01PREUKK0BjaW5kZXggQHNhbXB7QU1fTUFJTlRBSU5FUl9NT0RFfQorVGhpcyBtYWNybyBhbHdheXMgYXBwZWFycyBpbiBDeWdudXMgY29uZmlndXJlIHNjcmlwdHMuICBPdGhlciBwcm9ncmFtcworbWF5IG9yIG1heSBub3QgdXNlIGl0LgorCitJZiB0aGlzIG1hY3JvIGlzIHVzZWQsIHRoZSBAc2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbiBpcworcmVxdWlyZWQgdG8gZW5hYmxlIGF1dG9tYXRpYyByZWJ1aWxkaW5nIG9mIGdlbmVyYXRlZCBmaWxlcyB1c2VkIGJ5IHRoZQorY29uZmlndXJlIHN5c3RlbS4gIFRoaXMgb2YgY291cnNlIHJlcXVpcmVzIHRoYXQgZGV2ZWxvcGVycyBiZSBhd2FyZSBvZiwKK2FuZCB1c2UsIHRoYXQgb3B0aW9uLgorCitJZiB0aGlzIG1hY3JvIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbCBhbHdheXMgYmUKK3JlYnVpbHQgYXV0b21hdGljYWxseS4gIFRoaXMgd2lsbCBjYXVzZSBwcm9ibGVtcyBpZiB0aGUgd3JvbmcgdmVyc2lvbnMKK29mIGF1dG9jb25mLCBhdXRvbWFrZSwgb3Igb3RoZXJzIGFyZSBpbiB0aGUgYnVpbGRlcidzIEBzYW1we1BBVEh9LgorCisoSWYgeW91IGFyZSBub3QgdXNpbmcgYXV0b21ha2UsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBtYWNybykuCisKK0BpdGVtIEFDX0VYRUVYVAorQGNpbmRleCBAc2FtcHtBQ19FWEVFWFR9CitAY2luZGV4IEBzYW1we0FNX0VYRUVYVH0KK0VpdGhlciB0aGlzIG1hY3JvIG9yIEBzYW1we0FNX0VYRUVYVH0gYWx3YXlzIGFwcGVhcnMgaW4gQ3lnbnVzIGNvbmZpZ3VyZQorZmlsZXMuICBPdGhlciBwcm9ncmFtcyBtYXkgb3IgbWF5IG5vdCB1c2Ugb25lIG9mIHRoZW0uCisKK1RoaXMgbWFjcm8gbG9va3MgZm9yIHRoZSBleGVjdXRhYmxlIHN1ZmZpeCB1c2VkIG9uIHRoZSBob3N0IHN5c3RlbS4gIE9uCitVbml4IHN5c3RlbXMsIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4gIE9uIFdpbmRvd3Mgc3lzdGVtcywgdGhpcyBpcworQHNhbXB7LmV4ZX0uICBUaGlzIG1hY3JvIGRpcmVjdHMgYXV0b21ha2UgdG8gdXNlIHRoZSBleGVjdXRhYmxlIHN1ZmZpeAorYXMgYXBwcm9wcmlhdGUgd2hlbiBjcmVhdGluZyBwcm9ncmFtcy4gIFRoaXMgbWFjcm8gZG9lcyBub3QgdGFrZSBhbnkKK2FyZ3VtZW50cy4KKworVGhlIEBzYW1we0FDX0VYRUVYVH0gZm9ybSBpcyBuZXcsIGFuZCBpcyBwYXJ0IG9mIGEgQ3lnbnVzIHBhdGNoIHRvCithdXRvY29uZiB0byBzdXBwb3J0IGNvbXBpbGluZyB3aXRoIFZpc3VhbCBDKysuICBPbGRlciBwcm9ncmFtcyB1c2UKK0BzYW1we0FNX0VYRUVYVH0gaW5zdGVhZC4KKworKFByb2dyYW1zIHdoaWNoIGRvIG5vdCB1c2UgYXV0b21ha2UgdXNlIG5laXRoZXIgQHNhbXB7QUNfRVhFRVhUfSBub3IKK0BzYW1we0FNX0VYRUVYVH0pLgorCitAaXRlbSBBQ19QUk9HX0NDCitAY2luZGV4IEBzYW1we0FDX1BST0dfQ0N9CitJZiB5b3UgYXJlIHdyaXRpbmcgQyBjb2RlLCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLiAgSXQKK2xvY2F0ZXMgdGhlIEMgY29tcGlsZXIgdG8gdXNlLiAgSXQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzLgorCitIb3dldmVyLCBpZiB0aGlzIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpcyBmb3IgYSBsaWJyYXJ5IHdoaWNoIGlzIHRvCitiZSBjb21waWxlZCBieSBhIGNyb3NzIGNvbXBpbGVyIHdoaWNoIG1heSBub3QgZnVsbHkgd29yaywgdGhlbiB5b3Ugd2lsbAorbm90IHdhbnQgdG8gdXNlIEBzYW1we0FDX1BST0dfQ0N9LiAgSW5zdGVhZCwgeW91IHdpbGwgd2FudCB0byB1c2UgYQordmFyaWFudCB3aGljaCBkb2VzIG5vdCBjYWxsIHRoZSBtYWNybyBAc2FtcHtBQ19QUk9HX0NDX1dPUktTfS4gIEV4YW1wbGVzCitjYW4gYmUgZm91bmQgaW4gdmFyaW91cyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGVzIGZvciBsaWJyYXJpZXMgdGhhdCBhcmUKK2NvbXBpbGVkIHdpdGggY3Jvc3MgY29tcGlsZXJzLCBzdWNoIGFzIGxpYmliZXJ0eSBvciBsaWJnbG9zcy4gIFRoaXMgaXMKK2Vzc2VudGlhbGx5IGEgYnVnIGluIGF1dG9jb25mLCBhbmQgdGhlcmUgd2lsbCBwcm9iYWJseSBiZSBhIGJldHRlcgord29ya2Fyb3VuZCBhdCBzb21lIHBvaW50LgorCitAaXRlbSBBQ19QUk9HX0NYWAorQGNpbmRleCBAc2FtcHtBQ19QUk9HX0NYWH0KK0lmIHlvdSBhcmUgd3JpdGluZyBDKysgY29kZSwgeW91IHdpbGwgd2FudCB0byB1c2UgdGhpcyBtYWNyby4gIEl0Citsb2NhdGVzIHRoZSBDKysgY29tcGlsZXIgdG8gdXNlLiAgSXQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzLiAgVGhlCitzYW1lIGNyb3NzIGNvbXBpbGVyIGNvbW1lbnRzIGFwcGx5IGFzIGZvciBAc2FtcHtBQ19QUk9HX0NDfS4KKworQGl0ZW0gQU1fUFJPR19MSUJUT09MCitAY2luZGV4IEBzYW1we0FNX1BST0dfTElCVE9PTH0KK0lmIHlvdSB3YW50IHRvIGJ1aWxkIGxpYnJhcmllcywgYW5kIHlvdSB3YW50IHRvIHBlcm1pdCB0aGVtIHRvIGJlCitzaGFyZWQsIG9yIHlvdSB3YW50IHRvIGxpbmsgYWdhaW5zdCBsaWJyYXJpZXMgd2hpY2ggd2VyZSBidWlsdCB1c2luZworbGlidG9vbCwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRoaXMgbWFjcm8uICBUaGlzIG1hY3JvIGlzIHJlcXVpcmVkIGluIG9yZGVyCit0byB1c2UgbGlidG9vbC4KKworQGNpbmRleCBAc2FtcHtBTV9ESVNBQkxFX1NIQVJFRH0KK0J5IGRlZmF1bHQsIHRoaXMgd2lsbCBjYXVzZSBhbGwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IGFzIHNoYXJlZAorbGlicmFyaWVzLiAgVG8gcHJldmVudCB0aGlzLS10byBjaGFuZ2UgdGhlIGRlZmF1bHQtLXVzZQorQHNhbXB7QU1fRElTQUJMRV9TSEFSRUR9IGJlZm9yZSBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9LiAgVGhlIGNvbmZpZ3VyZQorb3B0aW9ucyBAc2FtcHstLWVuYWJsZS1zaGFyZWR9IGFuZCBAc2FtcHstLWRpc2FibGUtc2hhcmVkfSBtYXkgYmUgdXNlZAordG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYXQgYnVpbGQgdGltZS4KKworQGl0ZW0gQUNfREVGSU5FKF9HTlVfU09VUkNFKQorQGNpbmRleCBAc2FtcHtfR05VX1NPVVJDRX0KK0dOVSBwYWNrYWdlcyBzaG91bGQgbm9ybWFsbHkgaW5jbHVkZSB0aGlzIGxpbmUgYmVmb3JlIGFueSBvdGhlciBmZWF0dXJlCit0ZXN0cy4gIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gQHNhbXB7X0dOVV9TT1VSQ0V9IHdoZW4gY29tcGlsaW5nLCB3aGljaAorZGlyZWN0cyB0aGUgbGliYyBoZWFkZXIgZmlsZXMgdG8gcHJvdmlkZSB0aGUgc3RhbmRhcmQgR05VIHN5c3RlbQoraW50ZXJmYWNlcyBpbmNsdWRpbmcgYWxsIEdOVSBleHRlbnNpb25zLiAgSWYgdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCwKK2NlcnRhaW4gR05VIGV4dGVuc2lvbnMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCisKK0BpdGVtIEFDX09VVFBVVAorQGNpbmRleCBAc2FtcHtBQ19PVVRQVVR9CitUaGlzIG1hY3JvIHRha2VzIGEgbGlzdCBvZiBmaWxlIG5hbWVzIHdoaWNoIHRoZSBjb25maWd1cmUgcHJvY2VzcyBzaG91bGQKK3Byb2R1Y2UuICBUaGlzIGlzIG5vcm1hbGx5IGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBAZmlsZXtNYWtlZmlsZX0gZmlsZXMKK2luIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gIElmIHlvdXIgcGFja2FnZSBsaXZlcyBlbnRpcmVseSBpbiBhIHNpbmdsZQorZGlyZWN0b3J5LCB5b3Ugd291bGQgdXNlIHNpbXBseSBAc2FtcHtBQ19PVVRQVVQoTWFrZWZpbGUpfS4gIElmIHlvdSBhbHNvCitoYXZlLCBmb3IgZXhhbXBsZSwgYSBAZmlsZXtsaWJ9IHN1YmRpcmVjdG9yeSwgeW91IHdvdWxkIHVzZQorQHNhbXB7QUNfT1VUUFVUKE1ha2VmaWxlIGxpYi9NYWtlZmlsZSl9LgorQGVuZCB0YWJsZQorCitJZiB5b3Ugd2FudCB0byB1c2UgbG9jYWxseSBkZWZpbmVkIG1hY3JvcyBpbiB5b3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0KK2ZpbGUsIHRoZW4geW91IHdpbGwgbmVlZCB0byB3cml0ZSBhIEBmaWxle2FjaW5jbHVkZS5tNH0gZmlsZSB3aGljaAorZGVmaW5lcyB0aGVtIChpZiBub3QgdXNpbmcgYXV0b21ha2UsIHRoaXMgZmlsZSBpcyBjYWxsZWQKK0BmaWxle2FjbG9jYWwubTR9KS4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcHV0IHNlcGFyYXRlIG1hY3JvcyBpbiBhbgorQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSwgYW5kIHB1dCBAc2FtcHtBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNH0gaW4geW91cgorQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgc28gdGhhdCB0aGUgQHNhbXB7YWNsb2NhbH0gcHJvZ3JhbSB3aWxsIGJlIGFibGUKK3RvIGZpbmQgdGhlbS4KKworVGhlIGRpZmZlcmVudCBtYWNybyBwcmVmaXhlcyBpbmRpY2F0ZSB3aGljaCB0b29sIGRlZmluZXMgdGhlIG1hY3JvLgorTWFjcm9zIHdoaWNoIHN0YXJ0IHdpdGggQHNhbXB7QUNffSBhcmUgcGFydCBvZiBhdXRvY29uZi4gIE1hY3JvcyB3aGljaAorc3RhcnQgd2l0aCBAc2FtcHtBTV99IGFyZSBwcm92aWRlZCBieSBhdXRvbWFrZSBvciBsaWJ0b29sLgorCitAbm9kZSBXcml0ZSBNYWtlZmlsZS5hbQorQHNlY3Rpb24gV3JpdGUgTWFrZWZpbGUuYW0KK0BjaW5kZXggQGZpbGV7TWFrZWZpbGUuYW19LCB3cml0aW5nCisKK1lvdSBtdXN0IHdyaXRlIHRoZSBmaWxlIEBmaWxle01ha2VmaWxlLmFtfS4gIFRoaXMgaXMgYW4gYXV0b21ha2UgaW5wdXQKK2ZpbGUsIGFuZCB0aGUgYXV0b21ha2UgbWFudWFsIGRlc2NyaWJlcyBpbiBkZXRhaWwgd2hhdCB0aGlzIGZpbGUgc2hvdWxkCitsb29rIGxpa2UuCisKK1RoZSBhdXRvbWFrZSBjb21tYW5kcyBpbiBAZmlsZXtNYWtlZmlsZS5hbX0gbW9zdGx5IGxvb2sgbGlrZSB2YXJpYWJsZQorYXNzaWdubWVudHMgaW4gYSBAZmlsZXtNYWtlZmlsZX0uICBhdXRvbWFrZSByZWNvZ25pemVzIHNwZWNpYWwgdmFyaWFibGUKK25hbWVzLCBhbmQgYXV0b21hdGljYWxseSBhZGQgbWFrZSBydWxlcyB0byB0aGUgb3V0cHV0IGFzIG5lZWRlZC4KKworVGhlcmUgd2lsbCBiZSBvbmUgQGZpbGV7TWFrZWZpbGUuYW19IGZpbGUgZm9yIGVhY2ggZGlyZWN0b3J5IGluIHlvdXIKK3BhY2thZ2UuICBGb3IgZWFjaCBkaXJlY3Rvcnkgd2l0aCBzdWJkaXJlY3RvcmllcywgdGhlIEBmaWxle01ha2VmaWxlLmFtfQorZmlsZSBzaG91bGQgY29udGFpbiB0aGUgbGluZQorQHNtYWxsZXhhbXBsZQorU1VCRElSUyA9IEB2YXJ7ZGlyfSBAdmFye2Rpcn0gQGRvdHN7fQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAord2hlcmUgZWFjaCBAdmFye2Rpcn0gaXMgdGhlIG5hbWUgb2YgYSBzdWJkaXJlY3RvcnkuCisKK0ZvciBlYWNoIEBmaWxle01ha2VmaWxlLmFtfSwgdGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZworQGZpbGV7TWFrZWZpbGV9IGluIHRoZSBAc2FtcHtBQ19PVVRQVVR9IG1hY3JvIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uCisKK0V2ZXJ5IEBmaWxle01ha2VmaWxlLmFtfSB3cml0dGVuIGF0IEN5Z251cyBzaG91bGQgY29udGFpbiB0aGUgbGluZQorQHNtYWxsZXhhbXBsZQorQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cworQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAorVGhpcyBwdXRzIGF1dG9tYWtlIGludG8gQ3lnbnVzIG1vZGUuICBTZWUgdGhlIGF1dG9tYWtlIG1hbnVhbCBmb3IKK2RldGFpbHMuCisKK1lvdSBtYXkgdG8gaW5jbHVkZSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQHNhbXB7YXV0b21ha2V9IHRoYXQgeW91IGFyZQordXNpbmcgb24gdGhlIEBzYW1we0FVVE9NQUtFX09QVElPTlN9IGxpbmUuICBGb3IgZXhhbXBsZSwKK0BzbWFsbGV4YW1wbGUKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgMS4zCitAZW5kIHNtYWxsZXhhbXBsZQorQG5vaW5kZW50CitUaGlzIHdpbGwgcHJldmVudCB1c2VycyBmcm9tIHJ1bm5pbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mCitAc2FtcHthdXRvbWFrZX0gYW5kIHBlcmhhcHMgZ2V0dGluZyBhbiBpbnZhbGlkIEBmaWxle01ha2VmaWxlLmlufS4KKworSWYgeW91ciBwYWNrYWdlIGJ1aWxkcyBhIHByb2dyYW0sIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0Citwcm9ncmFtIGlzIGJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKK0BzbWFsbGV4YW1wbGUKK2Jpbl9QUk9HUkFNUyA9IEB2YXJ7cHJvZ3JhbX0KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK3doZXJlIEB2YXJ7cHJvZ3JhbX0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0uICBZb3Ugd2lsbCB0aGVuIHdhbnQgYQorbGluZSBsaWtlCitAc21hbGxleGFtcGxlCitAdmFye3Byb2dyYW19X1NPVVJDRVMgPSBAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAord2hlcmUgZWFjaCBAdmFye2ZpbGV9IGlzIHRoZSBuYW1lIG9mIGEgc291cmNlIGZpbGUgdG8gbGluayBpbnRvIHRoZQorcHJvZ3JhbSAoZS5nLiwgQHNhbXB7Zm9vLmN9KS4KKworSWYgeW91ciBwYWNrYWdlIGJ1aWxkcyBhIGxpYnJhcnksIGFuZCB5b3UgZG8gbm90IHdhbnQgdGhlIGxpYnJhcnkgdG8KK2V2ZXIgYmUgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQKK2xpYnJhcnkgaXMgYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQorQHNtYWxsZXhhbXBsZQorbGliX0xJQlJBUklFUyA9IGxpYkB2YXJ7bmFtZX0uYQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAord2hlcmUgQHNhbXB7bGliQHZhcntuYW1lfS5hfSBpcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeS4gIFlvdSB3aWxsIHRoZW4KK3dhbnQgYSBsaW5lIGxpa2UKK0BzbWFsbGV4YW1wbGUKK2xpYkB2YXJ7bmFtZX1fYV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK3doZXJlIGVhY2ggQHZhcntmaWxlfSBpcyB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlIHRvIGFkZCB0byB0aGUKK2xpYnJhcnkuCisKK0lmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgdG8gcGVybWl0IGJ1aWxkaW5nIHRoZQorbGlicmFyeSBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdCBsaWJyYXJ5IGlzCitidWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCitAc21hbGxleGFtcGxlCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJAdmFye25hbWV9LmxhCitAZW5kIHNtYWxsZXhhbXBsZQorVGhlIHVzZSBvZiBAc2FtcHtMVExJQlJBUklFU30sIGFuZCB0aGUgQHNhbXB7LmxhfSBleHRlbnNpb24sIGluZGljYXRlIGEKK2xpYnJhcnkgdG8gYmUgYnVpbHQgdXNpbmcgbGlidG9vbC4gIEFzIHVzdWFsLCB5b3Ugd2lsbCB0aGVuIHdhbnQgYSBsaW5lCitsaWtlCitAc21hbGxleGFtcGxlCitsaWJAdmFye25hbWV9X2xhX1NPVVJDRVMgPSBAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fQorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIHN0cmluZ3MgQHNhbXB7YmlufSBhbmQgQHNhbXB7bGlifSB0aGF0IGFwcGVhciBhYm92ZSBpbgorQHNhbXB7YmluX1BST0dSQU1TfSBhbmQgQHNhbXB7bGliX0xJQlJBUklFU30gYXJlIG5vdCBhcmJpdHJhcnkuICBUaGV5CityZWZlciB0byBwYXJ0aWN1bGFyIGRpcmVjdG9yaWVzLCB3aGljaCBtYXkgYmUgc2V0IGJ5IHRoZSBAc2FtcHstLWJpbmRpcn0KK2FuZCBAc2FtcHstLWxpYmRpcn0gb3B0aW9ucyB0byBAZmlsZXtjb25maWd1cmV9LiAgSWYgdGhvc2Ugb3B0aW9ucyBhcmUKK25vdCB1c2VkLCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBAc2FtcHstLXByZWZpeH0gb3IKK0BzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMgdG8gQGZpbGV7Y29uZmlndXJlfS4gIEl0IGlzIHBvc3NpYmxlIHRvIHVzZQorb3RoZXIgbmFtZXMgaWYgdGhlIHByb2dyYW0gb3IgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIGluIHNvbWUgb3RoZXIKK2RpcmVjdG9yeS4KKworVGhlIEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIG1heSBhbHNvIGNvbnRhaW4gYWxtb3N0IGFueXRoaW5nIHRoYXQgbWF5CithcHBlYXIgaW4gYSBub3JtYWwgQGZpbGV7TWFrZWZpbGV9LiAgYXV0b21ha2UgYWxzbyBzdXBwb3J0cyBtYW55IG90aGVyCitzcGVjaWFsIHZhcmlhYmxlcywgYXMgd2VsbCBhcyBjb25kaXRpb25hbHMuCisKK1NlZSB0aGUgYXV0b21ha2UgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAbm9kZSBXcml0ZSBhY2NvbmZpZy5oCitAc2VjdGlvbiBXcml0ZSBhY2NvbmZpZy5oCitAY2luZGV4IEBmaWxle2FjY29uZmlnLmh9LCB3cml0aW5nCisKK0lmIHlvdSBhcmUgZ2VuZXJhdGluZyBhIHBvcnRhYmlsaXR5IGhlYWRlciBmaWxlLCAoaS5lLiwgeW91IGFyZSB1c2luZworQHNhbXB7QU1fQ09ORklHX0hFQURFUn0gaW4gQGZpbGV7Y29uZmlndXJlLmlufSksIHRoZW4geW91IHdpbGwgaGF2ZSB0bword3JpdGUgYSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlLiAgSXQgd2lsbCBoYXZlIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZworbGluZXMuCisKK0BzbWFsbGV4YW1wbGUKKy8qIE5hbWUgb2YgcGFja2FnZS4gICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLworI3VuZGVmIFZFUlNJT04KK0BlbmQgc21hbGxleGFtcGxlCisKK1RoaXMgcmVxdWlyZW1lbnQgaXMgcmVhbGx5IGEgYnVnIGluIHRoZSBzeXN0ZW0sIGFuZCB0aGUgcmVxdWlyZW1lbnQgbWF5CitiZSBlbGltaW5hdGVkIGF0IHNvbWUgbGF0ZXIgZGF0ZS4KKworVGhlIEBmaWxle2FjY29uZmlnLmh9IGZpbGUgd2lsbCBhbHNvIHNpbWlsYXIgY29tbWVudCBhbmQgQHNhbXB7I3VuZGVmfQorbGluZXMgZm9yIGFueSB1bnVzdWFsIG1hY3JvcyBpbiB0aGUgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBpbmNsdWRpbmcKK2FueSBtYWNybyB3aGljaCBhcHBlYXJzIGluIGEgQHNhbXB7QUNfREVGSU5FfSBtYWNyby4KKworSW4gcGFydGljdWxhciwgaWYgeW91IGFyZSB3cml0aW5nIGEgR05VIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSBpbmNsdWRlCitAc2FtcHtBQ19ERUZJTkUoX0dOVV9TT1VSQ0UpfSBpbiBAZmlsZXtjb25maWd1cmUuaW59IGFzIHN1Z2dlc3RlZCBhYm92ZSwKK3lvdSB3aWxsIG5lZWQgbGluZXMgbGlrZSB0aGlzIGluIEBmaWxle2FjY29uZmlnLmh9OgorQHNtYWxsZXhhbXBsZQorLyogRW5hYmxlIEdOVSBleHRlbnNpb25zLiAgKi8KKyN1bmRlZiBfR05VX1NPVVJDRQorQGVuZCBzbWFsbGV4YW1wbGUKKworTm9ybWFsbHkgdGhlIEBzYW1we2F1dG9oZWFkZXJ9IHByb2dyYW0gd2lsbCBpbmZvcm0geW91IG9mIGFueSBzdWNoCityZXF1aXJlbWVudHMgYnkgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIGl0IGlzIHJ1bi4gIEhvd2V2ZXIsIGlmCit5b3UgZG8gYW55dGhpbmcgcGFydGljdWxhciBvZGQgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIHlvdQord2lsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByaWdodCBlbnRyaWVzIGFwcGVhciBpbgorQGZpbGV7YWNjb25maWcuaH0sIHNpbmNlIG90aGVyd2lzZSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgbWF5IG5vdCBiZQorYXZhaWxhYmxlIGluIHRoZSBAZmlsZXtjb25maWcuaH0gZmlsZSB3aGljaCB5b3VyIGNvZGUgd2lsbCB1c2UuCisKKyhUaGVlIEBzYW1we1BBQ0tBR0V9IGFuZCBAc2FtcHtWRVJTSU9OfSBsaW5lcyBhcmUgbm90IHJlcXVpcmVkIGlmIHlvdQorYXJlIG5vdCB1c2luZyBhdXRvbWFrZSwgYW5kIGluIHRoYXQgY2FzZSB5b3UgbWF5IG5vdCBuZWVkIGEKK0BmaWxle2FjY29uZmlnLmh9IGZpbGUgYXQgYWxsKS4KKworQG5vZGUgR2VuZXJhdGUgZmlsZXMKK0BzZWN0aW9uIEdlbmVyYXRlIGZpbGVzCisKK09uY2UgeW91IGhhdmUgd3JpdHRlbiBAZmlsZXtjb25maWd1cmUuaW59LCBAZmlsZXtNYWtlZmlsZS5hbX0sCitAZmlsZXthY2NvbmZpZy5ofSwgYW5kIHBvc3NpYmx5IEBmaWxle2FjaW5jbHVkZS5tNH0sIHlvdSBtdXN0IHVzZQorYXV0b2NvbmYgYW5kIGF1dG9tYWtlIHByb2dyYW1zIHRvIHByb2R1Y2UgdGhlIGZpcnN0IHZlcnNpb25zIG9mIHRoZQorZ2VuZXJhdGVkIGZpbGVzLiAgVGhpcyBpcyBkb25lIGJ5IGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mCitjb21tYW5kcy4KKworQHNtYWxsZXhhbXBsZQorYWNsb2NhbAorYXV0b2NvbmYKK2F1dG9oZWFkZXIKK2F1dG9tYWtlCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgQHNhbXB7YWNsb2NhbH0gYW5kIEBzYW1we2F1dG9tYWtlfSBjb21tYW5kcyBhcmUgcGFydCBvZiB0aGUgYXV0b21ha2UKK3BhY2thZ2UsIGFuZCB0aGUgQHNhbXB7YXV0b2NvbmZ9IGFuZCBAc2FtcHthdXRvaGVhZGVyfSBjb21tYW5kcyBhcmUgcGFydAorb2YgdGhlIGF1dG9jb25mIHBhY2thZ2UuCisKK0lmIHlvdSBhcmUgdXNpbmcgYSBAZmlsZXttNH0gc3ViZGlyZWN0b3J5IGZvciB5b3VyIG1hY3JvcywgeW91IHdpbGwgbmVlZAordG8gdXNlIHRoZSBAc2FtcHstSSBtNH0gb3B0aW9uIHdoZW4geW91IHJ1biBAc2FtcHthY2xvY2FsfS4KKworSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB1c2UgdGhlIEBzYW1wey1hfSBvcHRpb24gd2hlbgorcnVubmluZyBAc2FtcHthdXRvbWFrZX0gY29tbWFuZCBpbiBvcmRlciB0byBjb3B5IHRoZSByZXF1aXJlZCBzdXBwb3J0CitmaWxlcyBpbnRvIHlvdXIgc291cmNlIGRpcmVjdG9yeS4KKworSWYgeW91IGFyZSB1c2luZyBsaWJ0b29sLCB5b3UgbXVzdCBidWlsZCBhbmQgaW5zdGFsbCB0aGUgbGlidG9vbCBwYWNrYWdlCit3aXRoIHRoZSBzYW1lIEBzYW1wey0tcHJlZml4fSBhbmQgQHNhbXB7LS1leGVjLXByZWZpeH0gb3B0aW9ucyBhcyB5b3UKK3VzZWQgd2l0aCB0aGUgYXV0b2NvbmYgYW5kIGF1dG9tYWtlIHBhY2thZ2VzLiAgWW91IG11c3QgZG8gdGhpcyBiZWZvcmUKK3J1bm5pbmcgYW55IG9mIHRoZSBhYm92ZSBjb21tYW5kcy4gIElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMKK3RyZWUsIHlvdSB3aWxsIG5lZWQgdG8gcnVuIHRoZSBAc2FtcHtsaWJ0b29saXplfSBwcm9ncmFtIHRvIGNvcHkgdGhlCitsaWJ0b29sIHN1cHBvcnQgZmlsZXMgaW50byB5b3VyIGRpcmVjdG9yeS4KKworT25jZSB5b3UgaGF2ZSBtYW5hZ2VkIHRvIHJ1biB0aGVzZSBjb21tYW5kcyB3aXRob3V0IGdldHRpbmcgYW55IGVycm9ycywKK3lvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGVtcHR5IGRpcmVjdG9yeSwgYW5kIHJ1biB0aGUgQHNhbXB7Y29uZmlndXJlfQorc2NyaXB0IHdoaWNoIHdpbGwgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgQHNhbXB7YXV0b2NvbmZ9IHdpdGggdGhlCitAc2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9IG9wdGlvbi4gIFRoaXMgd2lsbCBnaXZlIHlvdSBhIHNldCBvZgorTWFrZWZpbGVzIHdoaWNoIHdpbGwgaW5jbHVkZSBydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJlYnVpbGQgYWxsIHRoZQorZ2VuZXJhdGVkIGZpbGVzLgorCitBZnRlciBkb2luZyB0aGF0LCB3aGVuZXZlciB5b3UgaGF2ZSBjaGFuZ2VkIHNvbWUgb2YgdGhlIGlucHV0IGZpbGVzIGFuZAord2FudCB0byByZWdlbmVyYXRlZCB0aGUgb3RoZXIgZmlsZXMsIGdvIHRvIHlvdXIgb2JqZWN0IGRpcmVjdG9yeSBhbmQgcnVuCitAc2FtcHttYWtlfS4gIERvaW5nIHRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0byByZWJ1aWxkIHRoZQorZmlsZXMgbWFudWFsbHksIGJlY2F1c2UgdGhlcmUgYXJlIGNvbXBsZXggb3JkZXIgZGVwZW5kZW5jaWVzIGFuZCBpdCBpcworZWFzeSB0byBmb3JnZXQgc29tZXRoaW5nLgorCitAbm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZQorQHNlY3Rpb24gRXhhbXBsZQorCitMZXQncyBjb25zaWRlciBhIHRyaXZpYWwgZXhhbXBsZS4KKworU3VwcG9zZSB3ZSB3YW50IHRvIHdyaXRlIGEgc2ltcGxlIHZlcnNpb24gb2YgQHNhbXB7dG91Y2h9LiAgT3VyIHByb2dyYW0sCit3aGljaCB3ZSB3aWxsIGNhbGwgQHNhbXB7cG9rZX0sIHdpbGwgdGFrZSBhIHNpbmdsZSBmaWxlIG5hbWUgYXJndW1lbnQsCithbmQgdXNlIHRoZSBAc2FtcHt1dGltZX0gc3lzdGVtIGNhbGwgdG8gc2V0IHRoZSBtb2RpZmljYXRpb24gYW5kIGFjY2VzcwordGltZXMgb2YgdGhlIGZpbGUgdG8gdGhlIGN1cnJlbnQgdGltZS4gIFdlIHdhbnQgdGhpcyBwcm9ncmFtIHRvIGJlCitoaWdobHkgcG9ydGFibGUuCisKK1dlJ2xsIGZpcnN0IHNlZSB3aGF0IHRoaXMgbG9va3MgbGlrZSB3aXRob3V0IHVzaW5nIGF1dG9jb25mIGFuZAorYXV0b21ha2UsIGFuZCB0aGVuIHNlZSB3aGF0IGl0IGxvb2tzIGxpa2Ugd2l0aCB0aGVtLgorCitAbWVudQorKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAxOjoJCUZpcnN0IFRyeS4KKyogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMjo6CQlTZWNvbmQgVHJ5LgorKiBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAzOjoJCVRoaXJkIFRyeS4KKyogR2VuZXJhdGUgRmlsZXMgaW4gRXhhbXBsZTo6CQlHZW5lcmF0ZSBGaWxlcy4KK0BlbmQgbWVudQorCitAbm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAxCitAc3Vic2VjdGlvbiBGaXJzdCBUcnkKKworSGVyZSBpcyBvdXIgZmlyc3QgdHJ5IGF0IEBzYW1we3Bva2UuY30uICBOb3RlIHRoYXQgd2UndmUgd3JpdHRlbiBpdAord2l0aG91dCBBTlNJL0lTTyBDIHByb3RvdHlwZXMsIHNpbmNlIHdlIHdhbnQgaXQgdG8gYmUgaGlnaGx5IHBvcnRhYmxlLgorCitAZXhhbXBsZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbWUuaD4KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7CitAeworICBpZiAoYXJnYyAhPSAyKQorICAgIEB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogcG9rZSBmaWxlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIEB9CisKKyAgaWYgKHV0aW1lIChhcmd2WzFdLCBOVUxMKSA8IDApCisgICAgQHsKKyAgICAgIHBlcnJvciAoInV0aW1lIik7CisgICAgICBleGl0ICgxKTsKKyAgICBAfQorCisgIGV4aXQgKDApOworQH0KK0BlbmQgZXhhbXBsZQorCitXZSBhbHNvIHdyaXRlIGEgc2ltcGxlIEBmaWxle01ha2VmaWxlfS4KKworQGV4YW1wbGUKK0NDID0gZ2NjCitDRkxBR1MgPSAtZyAtTzIKKworYWxsOiBwb2tlCisKK3Bva2U6IHBva2UubworCSQoQ0MpIC1vIHBva2UgJChDRkxBR1MpICQoTERGTEFHUykgcG9rZS5vCitAZW5kIGV4YW1wbGUKKworU28gZmFyLCBzbyBnb29kLgorCitVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgYSBmZXcgcHJvYmxlbXMuCisKK09uIG9sZGVyIFVuaXggc3lzdGVtcyBkZXJpdmVkIGZyb20gQlNEIDQuMywgdGhlIEBzYW1we3V0aW1lfSBzeXN0ZW0gY2FsbAorZG9lcyBub3QgYWNjZXB0IGEgc2Vjb25kIGFyZ3VtZW50IG9mIEBzYW1we05VTEx9LiAgT24gdGhvc2Ugc3lzdGVtcywgd2UKK25lZWQgdG8gcGFzcyBhIHBvaW50ZXIgdG8gQHNhbXB7c3RydWN0IHV0aW1idWZ9IHN0cnVjdHVyZS4KK1VuZm9ydHVuYXRlbHksIGV2ZW4gb2xkZXIgc3lzdGVtcyBkb24ndCBkZWZpbmUgdGhhdCBzdHJ1Y3R1cmU7IG9uIHRob3NlCitzeXN0ZW1zLCB3ZSBuZWVkIHRvIHBhc3MgYW4gYXJyYXkgb2YgdHdvIEBzYW1we2xvbmd9IHZhbHVlcy4KKworVGhlIGhlYWRlciBmaWxlIEBmaWxle3N0ZGxpYi5ofSB3YXMgaW52ZW50ZWQgYnkgQU5TSSBDLCBhbmQgb2xkZXIKK3N5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvcHkuICBXZSBpbmNsdWRlZCBpdCBhYm92ZSB0byBnZXQgYSBkZWNsYXJhdGlvbiBvZgorQHNhbXB7ZXhpdH0uCisKK1dlIGNhbiBmaW5kIHNvbWUgb2YgdGhlc2UgcG9ydGFiaWxpdHkgcHJvYmxlbXMgYnkgcnVubmluZworQHNhbXB7YXV0b3NjYW59LCB3aGljaCB3aWxsIGNyZWF0ZSBhIEBmaWxle2NvbmZpZ3VyZS5zY2FufSBmaWxlIHdoaWNoIHdlCitjYW4gdXNlIGFzIGEgcHJvdG90eXBlIGZvciBvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLiAgSSB3b24ndCBzaG93Cit0aGUgb3V0cHV0LCBidXQgaXQgd2lsbCBub3RpY2UgdGhlIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIEBzYW1we3V0aW1lfQorYW5kIEBmaWxle3N0ZGxpYi5ofS4KKworSW4gb3VyIEBmaWxle01ha2VmaWxlfSwgd2UgZG9uJ3QgcHJvdmlkZSBhbnkgd2F5IHRvIGluc3RhbGwgdGhlIHByb2dyYW0uCitUaGlzIGRvZXNuJ3QgbWF0dGVyIG11Y2ggZm9yIHN1Y2ggYSBzaW1wbGUgZXhhbXBsZSwgYnV0IGEgcmVhbCBwcm9ncmFtCit3aWxsIG5lZWQgYW4gQHNhbXB7aW5zdGFsbH0gdGFyZ2V0LiAgRm9yIHRoYXQgbWF0dGVyLCB3ZSB3aWxsIGFsc28gd2FudAorYSBAc2FtcHtjbGVhbn0gdGFyZ2V0LgorCitAbm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAyCitAc3Vic2VjdGlvbiBTZWNvbmQgVHJ5CisKK0hlcmUgaXMgb3VyIHNlY29uZCB0cnkgYXQgdGhpcyBwcm9ncmFtLgorCitXZSBtb2RpZnkgQGZpbGV7cG9rZS5jfSB0byB1c2UgcHJlcHJvY2Vzc29yIG1hY3JvcyB0byBjb250cm9sIHdoYXQKK2ZlYXR1cmVzIGFyZSBhdmFpbGFibGUuICAoSSd2ZSBjaGVhdGVkIGEgYml0IGJ5IHVzaW5nIHRoZSBzYW1lIG1hY3JvCituYW1lcyB3aGljaCBhdXRvY29uZiB3aWxsIHVzZSkuCisKK0BleGFtcGxlCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIEhBVkVfVVRJTUVfSAorI2luY2x1ZGUgPHV0aW1lLmg+CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1VUSU1FX05VTEwKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBIQVZFX1NUUlVDVF9VVElNQlVGCisKK3N0cnVjdCB1dGltYnVmCitAeworICBsb25nIGFjdGltZTsKKyAgbG9uZyBtb2R0aW1lOworQH07CisKKyNlbmRpZgorCitzdGF0aWMgaW50Cit1dGltZV9ub3cgKGZpbGUpCisgICAgIGNoYXIgKmZpbGU7CitAeworICBzdHJ1Y3QgdXRpbWJ1ZiBub3c7CisKKyAgbm93LmFjdGltZSA9IG5vdy5tb2R0aW1lID0gdGltZSAoTlVMTCk7CisgIHJldHVybiB1dGltZSAoZmlsZSwgJm5vdyk7CitAfQorCisjZGVmaW5lIHV0aW1lKGYsIHApIHV0aW1lX25vdyAoZikKKworI2VuZGlmIC8qIEhBVkVfVVRJTUVfTlVMTCAgKi8KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7CitAeworICBpZiAoYXJnYyAhPSAyKQorICAgIEB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogcG9rZSBmaWxlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIEB9CisKKyAgaWYgKHV0aW1lIChhcmd2WzFdLCBOVUxMKSA8IDApCisgICAgQHsKKyAgICAgIHBlcnJvciAoInV0aW1lIik7CisgICAgICBleGl0ICgxKTsKKyAgICBAfQorCisgIGV4aXQgKDApOworQH0KK0BlbmQgZXhhbXBsZQorCitIZXJlIGlzIHRoZSBhc3NvY2lhdGVkIEBmaWxle01ha2VmaWxlfS4gIFdlJ3ZlIGFkZGVkIHN1cHBvcnQgZm9yIHRoZQorcHJlcHJvY2Vzc29yIGZsYWdzIHdlIHVzZS4gIFdlJ3ZlIGFsc28gYWRkZWQgQHNhbXB7aW5zdGFsbH0gYW5kCitAc2FtcHtjbGVhbn0gdGFyZ2V0cy4KKworQGV4YW1wbGUKKyMgU2V0IHRoaXMgdG8geW91ciBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorYmluZGlyID0gL3Vzci9sb2NhbC9iaW4KKworIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgc3RhbmRhcmQgQU5TSS9JU08gQyBoZWFkZXIgZmlsZXMuCisjIFNURENfSERSUyA9IC1EU1REQ19IRUFERVJTCisKKyMgVW5jb21tZW50IHRoaXMgaWYgeW91IGhhdmUgdXRpbWUuaC4KKyMgVVRJTUVfSCA9IC1ESEFWRV9VVElNRV9ICisKKyMgVW5jb21tZW50IHRoaXMgaWYgdXRpbWUgKEZJTEUsIE5VTEwpIHdvcmtzIG9uIHlvdXIgc3lzdGVtLgorIyBVVElNRV9OVUxMID0gLURIQVZFX1VUSU1FX05VTEwKKworIyBVbmNvbW1lbnQgdGhpcyBpZiBzdHJ1Y3QgdXRpbWJ1ZiBpcyBkZWZpbmVkIGluIHV0aW1lLmguCisjIFVUSU1CVUYgPSAtREhBVkVfU1RSVUNUX1VUSU1CVUYKKworQ0MgPSBnY2MKK0NGTEFHUyA9IC1nIC1PMgorCitBTExfQ0ZMQUdTID0gJChTVERDX0hEUlMpICQoVVRJTUVfSCkgJChVVElNRV9OVUxMKSAkKFVUSU1CVUYpICQoQ0ZMQUdTKQorCithbGw6IHBva2UKKworcG9rZTogcG9rZS5vCisJJChDQykgLW8gcG9rZSAkKEFMTF9DRkxBR1MpICQoTERGTEFHUykgcG9rZS5vCisKKy5jLm86CisJJChDQykgLWMgJChBTExfQ0ZMQUdTKSBwb2tlLmMKKworaW5zdGFsbDogcG9rZQorCWNwIHBva2UgJChiaW5kaXIpL3Bva2UKKworY2xlYW46CisJcm0gcG9rZSBwb2tlLm8KK0BlbmQgZXhhbXBsZQorCitTb21lIHByb2JsZW1zIHdpdGggdGhpcyBhcHByb2FjaCBzaG91bGQgYmUgY2xlYXIuCisKK1VzZXJzIHdobyB3YW50IHRvIGNvbXBpbGUgcG9rZSB3aWxsIGhhdmUgdG8ga25vdyBob3cgQHNhbXB7dXRpbWV9IHdvcmtzCitvbiB0aGVpciBzeXN0ZW1zLCBzbyB0aGF0IHRoZXkgY2FuIHVuY29tbWVudCB0aGUgQGZpbGV7TWFrZWZpbGV9Citjb3JyZWN0bHkuCisKK1RoZSBpbnN0YWxsYXRpb24gaXMgZG9uZSB1c2luZyBAc2FtcHtjcH0sIGJ1dCBtYW55IHN5c3RlbXMgaGF2ZSBhbgorQHNhbXB7aW5zdGFsbH0gcHJvZ3JhbSB3aGljaCBtYXkgYmUgdXNlZCwgYW5kIHdoaWNoIHN1cHBvcnRzIG9wdGlvbmFsCitmZWF0dXJlcyBzdWNoIGFzIHN0cmlwcGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBpbnN0YWxsZWQKK2JpbmFyeS4KKworVGhlIHVzZSBvZiBAZmlsZXtNYWtlZmlsZX0gdmFyaWFibGVzIGxpa2UgQHNhbXB7Q0N9LCBAc2FtcHtDRkxBR1N9IGFuZAorQHNhbXB7TERGTEFHU30gZm9sbG93cyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgc3RhbmRhcmRzLiAgVGhpcyBpcworY29udmVuaWVudCBmb3IgYWxsIHBhY2thZ2VzLCBzaW5jZSBpdCByZWR1Y2VzIHN1cnByaXNlcyBmb3IgdXNlcnMuCitIb3dldmVyLCBpdCBpcyBlYXN5IHRvIGdldCB0aGUgZGV0YWlscyB3cm9uZywgYW5kIHdpbmQgdXAgd2l0aCBhCitzbGlnaHRseSBub25zdGFuZGFyZCBkaXN0cmlidXRpb24uCisKK0Bub2RlIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDMKK0BzdWJzZWN0aW9uIFRoaXJkIFRyeQorCitGb3Igb3VyIHRoaXJkIHRyeSBhdCB0aGlzIHByb2dyYW0sIHdlIHdpbGwgd3JpdGUgYSBAZmlsZXtjb25maWd1cmUuaW59CitzY3JpcHQgdG8gZGlzY292ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZmVhdHVyZXMgb24gdGhlIGhvc3Qgc3lzdGVtLCByYXRoZXIKK3RoYW4gcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGVkaXQgdGhlIEBmaWxle01ha2VmaWxlfS4gIFdlIHdpbGwgYWxzbyB3cml0ZQorYSBAZmlsZXtNYWtlZmlsZS5hbX0gcmF0aGVyIHRoYW4gYSBAZmlsZXtNYWtlZmlsZX0uCisKK1RoZSBvbmx5IGNoYW5nZSB0byBAZmlsZXtwb2tlLmN9IGlzIHRvIGFkZCBhIGxpbmUgYXQgdGhlIHN0YXJ0IG9mIHRoZQorZmlsZToKK0BzbWFsbGV4YW1wbGUKKyNpbmNsdWRlICJjb25maWcuaCIKK0BlbmQgc21hbGxleGFtcGxlCisKK1RoZSBuZXcgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGlzIGFzIGZvbGxvd3MuCisKK0BleGFtcGxlCitBQ19JTklUKHBva2UuYykKK0FNX0lOSVRfQVVUT01BS0UocG9rZSwgMS4wKQorQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCitBQ19QUk9HX0NDCitBQ19IRUFERVJfU1REQworQUNfQ0hFQ0tfSEVBREVSUyh1dGltZS5oKQorQUNfRUdSRVBfSEVBREVSKHV0aW1idWYsIHV0aW1lLmgsIEFDX0RFRklORShIQVZFX1NUUlVDVF9VVElNQlVGKSkKK0FDX0ZVTkNfVVRJTUVfTlVMTAorQUNfT1VUUFVUKE1ha2VmaWxlKQorQGVuZCBleGFtcGxlCisKK1RoZSBmaXJzdCBmb3VyIG1hY3JvcyBpbiB0aGlzIGZpbGUsIGFuZCB0aGUgbGFzdCBvbmUsIHdlcmUgZGVzY3JpYmVkCithYm92ZTsgc2VlIEByZWZ7V3JpdGUgY29uZmlndXJlLmlufS4gIElmIHdlIG9taXQgdGhlc2UgbWFjcm9zLCB0aGVuIHdoZW4KK3dlIHJ1biBAc2FtcHthdXRvbWFrZX0gd2Ugd2lsbCBnZXQgYSByZW1pbmRlciB0aGF0IHdlIG5lZWQgdGhlbS4KKworVGhlIG90aGVyIG1hY3JvcyBhcmUgc3RhbmRhcmQgYXV0b2NvbmYgbWFjcm9zLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIEFDX0hFQURFUl9TVERDCitDaGVjayBmb3Igc3RhbmRhcmQgQyBoZWFkZXJzLgorQGl0ZW0gQUNfQ0hFQ0tfSEVBREVSUworQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgaGVhZGVyIGZpbGUgZXhpc3RzLgorQGl0ZW0gQUNfRUdSRVBfSEVBREVSCitDaGVjayBmb3IgYSBwYXJ0aWN1bGFyIHN0cmluZyBpbiBhIHBhcnRpY3VsYXIgaGVhZGVyIGZpbGUsIGluIHRoaXMgY2FzZQorY2hlY2tpbmcgZm9yIEBzYW1we3V0aW1idWZ9IGluIEBmaWxle3V0aW1lLmh9LgorQGl0ZW0gQUNfRlVOQ19VVElNRV9OVUxMCitDaGVjayB3aGV0aGVyIEBzYW1we3V0aW1lfSBhY2NlcHRzIGEgTlVMTCBzZWNvbmQgYXJndW1lbnQgdG8gc2V0IHRoZQorZmlsZSBjaGFuZ2UgdGltZSB0byB0aGUgY3VycmVudCB0aW1lLgorQGVuZCB0YWJsZQorCitTZWUgdGhlIGF1dG9jb25mIG1hbnVhbCBmb3IgYSBtb3JlIGNvbXBsZXRlIGRlc2NyaXB0aW9uLgorCitUaGUgbmV3IEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIGlzIGFzIGZvbGxvd3MuICBOb3RlIGhvdyBzaW1wbGUgdGhpcyBpcworY29tcGFyZWQgdG8gb3VyIGVhcmxpZXIgQGZpbGV7TWFrZWZpbGV9LgorCitAZXhhbXBsZQorYmluX1BST0dSQU1TID0gcG9rZQorCitwb2tlX1NPVVJDRVMgPSBwb2tlLmMKK0BlbmQgZXhhbXBsZQorCitUaGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGJ1aWxkIGEgc2luZ2xlIHByb2dyYW0gbmFtZSBAc2FtcHtwb2tlfS4gIEl0CitzaG91bGQgYmUgaW5zdGFsbGVkIGluIHRoZSBiaW5hcnkgZGlyZWN0b3J5LCB3aGljaCB3ZSBjYWxsZWQKK0BzYW1we2JpbmRpcn0gZWFybGllci4gIFRoZSBwcm9ncmFtIEBzYW1we3Bva2V9IGlzIGJ1aWx0IGZyb20gdGhlIHNvdXJjZQorZmlsZSBAZmlsZXtwb2tlLmN9LgorCitXZSBtdXN0IGFsc28gd3JpdGUgYSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlLiAgQmVzaWRlcyBAc2FtcHtQQUNLQUdFfSBhbmQKK0BzYW1we1ZFUlNJT059LCB3aGljaCBtdXN0IGJlIG1lbnRpb25lZCBmb3IgYWxsIHBhY2thZ2VzIHdoaWNoIHVzZQorYXV0b21ha2UsIHdlIG11c3QgaW5jbHVkZSBAc2FtcHtIQVZFX1NUUlVDVF9VVElNQlVGfSwgc2luY2Ugd2UgbWVudGlvbmVkCitpdCBpbiBhbiBAc2FtcHtBQ19ERUZJTkV9LgorCitAZXhhbXBsZQorLyogTmFtZSBvZiBwYWNrYWdlLiAgKi8KKyN1bmRlZiBQQUNLQUdFCisKKy8qIFZlcnNpb24gb2YgcGFja2FnZS4gICovCisjdW5kZWYgVkVSU0lPTgorCisvKiBXaGV0aGVyIHV0aW1lLmggZGVmaW5lcyBzdHJ1Y3QgdXRpbWJ1Zi4gICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfVVRJTUJVRgorQGVuZCBleGFtcGxlCisKK0Bub2RlIEdlbmVyYXRlIEZpbGVzIGluIEV4YW1wbGUKK0BzdWJzZWN0aW9uIEdlbmVyYXRlIEZpbGVzCisKK1dlIG11c3Qgbm93IGdlbmVyYXRlIHRoZSBvdGhlciBmaWxlcywgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KKworQHNtYWxsZXhhbXBsZQorYWNsb2NhbAorYXV0b2NvbmYKK2F1dG9oZWFkZXIKK2F1dG9tYWtlCitAZW5kIHNtYWxsZXhhbXBsZQorCitXaGVuIHdlIHJ1biBAc2FtcHthdXRvaGVhZGVyfSwgaXQgd2lsbCByZW1pbmQgdXMgb2YgYW55IG1hY3JvcyB3ZSBmb3Jnb3QKK3RvIGFkZCB0byBAZmlsZXthY2NvbmZpZy5ofS4KKworV2hlbiB3ZSBydW4gQHNhbXB7YXV0b21ha2V9LCBpdCB3aWxsIHdhbnQgdG8gYWRkIHNvbWUgZmlsZXMgdG8gb3VyCitkaXN0cmlidXRpb24uICBJdCB3aWxsIGFkZCB0aGVtIGF1dG9tYXRpY2FsbHkgaWYgd2UgdXNlIHRoZQorQHNhbXB7LS1hZGQtbWlzc2luZ30gb3B0aW9uLgorCitCeSBkZWZhdWx0LCBAc2FtcHthdXRvbWFrZX0gd2lsbCBydW4gaW4gR05VIG1vZGUsIHdoaWNoIG1lYW5zIHRoYXQgaXQKK3dpbGwgd2FudCB1cyB0byBjcmVhdGUgY2VydGFpbiBhZGRpdGlvbmFsIGZpbGVzOyBhcyBvZiB0aGlzIHdyaXRpbmcsIGl0Cit3aWxsIHdhbnQgQGZpbGV7TkVXU30sIEBmaWxle1JFQURNRX0sIEBmaWxle0FVVEhPUlN9LCBhbmQKK0BmaWxle0NoYW5nZUxvZ30sIGFsbCBvZiB3aGljaCBhcmUgZmlsZXMgd2hpY2ggc2hvdWxkIGFwcGVhciBpbiBhCitzdGFuZGFyZCBHTlUgZGlzdHJpYnV0aW9uLiAgV2UgY2FuIGVpdGhlciBhZGQgdGhvc2UgZmlsZXMsIG9yIHJ1bgorQHNhbXB7YXV0b21ha2V9IHdpdGggdGhlIEBzYW1wey0tZm9yZWlnbn0gb3B0aW9uLgorCitSdW5uaW5nIHRoZXNlIHRvb2xzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBmaWxlcywgYWxsIG9mIHdoaWNoIGFyZQorZGVzY3JpYmVkIGluIHRoZSBuZXh0IGNoYXB0ZXIuCisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitAZmlsZXthY2xvY2FsLm00fQorQGl0ZW0KK0BmaWxle2NvbmZpZ3VyZX0KK0BpdGVtCitAZmlsZXtjb25maWcuaW59CitAaXRlbQorQGZpbGV7TWFrZWZpbGUuaW59CitAaXRlbQorQGZpbGV7c3RhbXAtaC5pbn0KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBGaWxlcworQGNoYXB0ZXIgRmlsZXMKKworQXMgd2FzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGNoYXB0ZXIsIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0KK3VzZXMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZpbGVzLiAgVGhlIGRldmVsb3BlciBtdXN0IHdyaXRlIGEgZmV3IGZpbGVzLgorVGhlIG90aGVycyBhcmUgZ2VuZXJhdGVkIGJ5IHZhcmlvdXMgdG9vbHMuCisKK1RoZSBzeXN0ZW0gaXMgcmF0aGVyIGZsZXhpYmxlLCBhbmQgY2FuIGJlIHVzZWQgaW4gbWFueSBkaWZmZXJlbnQgd2F5cy4KK0luIGRlc2NyaWJpbmcgdGhlIGZpbGVzIHRoYXQgaXQgdXNlcywgSSB3aWxsIGRlc2NyaWJlIHRoZSBjb21tb24gY2FzZSwKK2FuZCBtZW50aW9uIHNvbWUgb3RoZXIgY2FzZXMgdGhhdCBtYXkgYXJpc2UuCisKK0BtZW51CisqIERldmVsb3BlciBGaWxlczo6CQlEZXZlbG9wZXIgRmlsZXMuCisqIEJ1aWxkIEZpbGVzOjoJCQlCdWlsZCBGaWxlcy4KKyogU3VwcG9ydCBGaWxlczo6CQlTdXBwb3J0IEZpbGVzLgorQGVuZCBtZW51CisKK0Bub2RlIERldmVsb3BlciBGaWxlcworQHNlY3Rpb24gRGV2ZWxvcGVyIEZpbGVzCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGZpbGVzIHdyaXR0ZW4gb3IgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZlbG9wZXIKK29mIGEgcGFja2FnZS4KKworQG1lbnUKKyogRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmU6OglEZXZlbG9wZXIgRmlsZXMgUGljdHVyZS4KKyogV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXM6OglXcml0dGVuIERldmVsb3BlciBGaWxlcy4KKyogR2VuZXJhdGVkIERldmVsb3BlciBGaWxlczo6CUdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMuCitAZW5kIG1lbnUKKworQG5vZGUgRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUKK0BzdWJzZWN0aW9uIERldmVsb3BlciBGaWxlcyBQaWN0dXJlCisKK0hlcmUgaXMgYSBwaWN0dXJlIG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgd3JpdHRlbiBieSB0aGUgZGV2ZWxvcGVyLCB0aGUKK2dlbmVyYXRlZCBmaWxlcyB3aGljaCB3b3VsZCBiZSBpbmNsdWRlZCB3aXRoIGEgY29tcGxldGUgc291cmNlCitkaXN0cmlidXRpb24sIGFuZCB0aGUgdG9vbHMgd2hpY2ggY3JlYXRlIHRob3NlIGZpbGVzLgorQGlmaW5mbworVGhlIGZpbGUgbmFtZXMgYXJlIHBsYWluIHRleHQgYW5kIHRoZSB0b29sIG5hbWVzIGFyZSBlbmNsb3NlZCBieQorQHNhbXB7Kn0gY2hhcmFjdGVycworQGVuZCBpZmluZm8KK0BpZm5vdGluZm8KK1RoZSBmaWxlIG5hbWVzIGFyZSBpbiByZWN0YW5nbGVzIHdpdGggc3F1YXJlIGNvcm5lcnMgYW5kIHRoZSB0b29sIG5hbWVzCithcmUgaW4gcmVjdGFuZ2xlcyB3aXRoIHJvdW5kZWQgY29ybmVycworQGVuZCBpZm5vdGluZm8KKyhlLmcuLCBAc2FtcHthdXRvaGVhZGVyfSBpcyB0aGUgbmFtZSBvZiBhIHRvb2wsIG5vdCB0aGUgbmFtZSBvZiBhIGZpbGUpLgorCitAaW1hZ2V7Y29uZmlnZGV2fQorCitAbm9kZSBXcml0dGVuIERldmVsb3BlciBGaWxlcworQHN1YnNlY3Rpb24gV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMKKworVGhlIGZvbGxvd2luZyBmaWxlcyB3b3VsZCBiZSB3cml0dGVuIGJ5IHRoZSBkZXZlbG9wZXIuCisKK0B0YWJsZSBAZmlsZQorQGl0ZW0gY29uZmlndXJlLmluCitAY2luZGV4IEBmaWxle2NvbmZpZ3VyZS5pbn0KK1RoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gc2NyaXB0LiAgVGhpcyBzY3JpcHQgY29udGFpbnMgaW52b2NhdGlvbnMgb2YKK2F1dG9jb25mIG1hY3Jvcy4gIEl0IG1heSBhbHNvIGNvbnRhaW4gb3JkaW5hcnkgc2hlbGwgc2NyaXB0IGNvZGUuICBUaGlzCitmaWxlIHdpbGwgY29udGFpbiBmZWF0dXJlIHRlc3RzIGZvciBwb3J0YWJpbGl0eSBpc3N1ZXMuICBUaGUgbGFzdCB0aGluZworaW4gdGhlIGZpbGUgd2lsbCBub3JtYWxseSBiZSBhbiBAc2FtcHtBQ19PVVRQVVR9IG1hY3JvIGxpc3Rpbmcgd2hpY2gKK2ZpbGVzIHRvIGNyZWF0ZSB3aGVuIHRoZSBidWlsZGVyIHJ1bnMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuICBUaGlzIGZpbGUKK2lzIGFsd2F5cyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBHTlUgY29uZmlndXJlIHN5c3RlbS4gIEB4cmVme1dyaXRlCitjb25maWd1cmUuaW59LgorCitAaXRlbSBNYWtlZmlsZS5hbQorQGNpbmRleCBAZmlsZXtNYWtlZmlsZS5hbX0KK1RoaXMgaXMgdGhlIGF1dG9tYWtlIGlucHV0IGZpbGUuICBJdCBkZXNjcmliZXMgaG93IHRoZSBjb2RlIHNob3VsZCBiZQorYnVpbHQuICBJdCBjb25zaXN0cyBvZiBkZWZpbml0aW9ucyBvZiBhdXRvbWFrZSB2YXJpYWJsZXMuICBJdCBtYXkgYWxzbworY29udGFpbiBvcmRpbmFyeSBNYWtlZmlsZSB0YXJnZXRzLiAgVGhpcyBmaWxlIGlzIG9ubHkgbmVlZGVkIHdoZW4gdXNpbmcKK2F1dG9tYWtlIChuZXdlciB0b29scyBub3JtYWxseSB1c2UgYXV0b21ha2UsIGJ1dCB0aGVyZSBhcmUgc3RpbGwgb2xkZXIKK3Rvb2xzIHdoaWNoIGhhdmUgbm90IGJlZW4gY29udmVydGVkLCBpbiB3aGljaCB0aGUgZGV2ZWxvcGVyIHdyaXRlcworQGZpbGV7TWFrZWZpbGUuaW59IGRpcmVjdGx5KS4gIEB4cmVme1dyaXRlIE1ha2VmaWxlLmFtfS4KKworQGl0ZW0gYWNjb25maWcuaAorQGNpbmRleCBAZmlsZXthY2NvbmZpZy5ofQorV2hlbiB0aGUgY29uZmlndXJlIHNjcmlwdCBjcmVhdGVzIGEgcG9ydGFiaWxpdHkgaGVhZGVyIGZpbGUsIGJ5IHVzaW5nCitAc2FtcHtBTV9DT05GSUdfSEVBREVSfSAob3IsIGlmIG5vdCB1c2luZyBhdXRvbWFrZSwKK0BzYW1we0FDX0NPTkZJR19IRUFERVJ9KSwgdGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVzY3JpYmUgbWFjcm9zIHdoaWNoIGFyZQorbm90IHJlY29nbml6ZWQgYnkgdGhlIEBzYW1we2F1dG9oZWFkZXJ9IGNvbW1hbmQuICBUaGlzIGlzIG5vcm1hbGx5IGEKK2ZhaXJseSB1bmludGVyZXN0aW5nIGZpbGUsIGNvbnNpc3Rpbmcgb2YgYSBjb2xsZWN0aW9uIG9mIEBzYW1weyN1bmRlZn0KK2xpbmVzIHdpdGggY29tbWVudHMuICBOb3JtYWxseSBhbnkgY2FsbCB0byBAc2FtcHtBQ19ERUZJTkV9IGluCitAZmlsZXtjb25maWd1cmUuaW59IHdpbGwgcmVxdWlyZSBhIGxpbmUgaW4gdGhpcyBmaWxlLiBAeHJlZntXcml0ZQorYWNjb25maWcuaH0uCisKK0BpdGVtIGFjaW5jbHVkZS5tNAorQGNpbmRleCBAZmlsZXthY2luY2x1ZGUubTR9CitUaGlzIGZpbGUgaXMgbm90IGFsd2F5cyByZXF1aXJlZC4gIEl0IGRlZmluZXMgbG9jYWwgYXV0b2NvbmYgbWFjcm9zLgorVGhlc2UgbWFjcm9zIG1heSB0aGVuIGJlIHVzZWQgaW4gQGZpbGV7Y29uZmlndXJlLmlufS4gIElmIHlvdSBkb24ndCBuZWVkCithbnkgbG9jYWwgYXV0b2NvbmYgbWFjcm9zLCB0aGVuIHlvdSBkb24ndCBuZWVkIHRoaXMgZmlsZSBhdCBhbGwuICBJbgorZmFjdCwgaW4gZ2VuZXJhbCwgeW91IG5ldmVyIG5lZWQgbG9jYWwgYXV0b2NvbmYgbWFjcm9zLCBzaW5jZSB5b3UgY2FuCitwdXQgZXZlcnl0aGluZyBpbiBAZmlsZXtjb25maWd1cmUuaW59LCBidXQgc29tZXRpbWVzIGEgbG9jYWwgbWFjcm8gaXMKK2NvbnZlbmllbnQuCisKK05ld2VyIHRvb2xzIG1heSBvbWl0IEBmaWxle2FjaW5jbHVkZS5tNH0sIGFuZCBpbnN0ZWFkIHVzZSBhCitzdWJkaXJlY3RvcnksIHR5cGljYWxseSBuYW1lZCBAZmlsZXttNH0sIGFuZCBkZWZpbmUKK0BzYW1we0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00fSBpbiBAZmlsZXtNYWtlZmlsZS5hbX0gdG8gZm9yY2UKK0BzYW1we2FjbG9jYWx9IHRvIGxvb2sgdGhlcmUgZm9yIG1hY3JvIGRlZmluaXRpb25zLiAgVGhlIG1hY3JvCitkZWZpbml0aW9ucyBhcmUgdGhlbiBwbGFjZWQgaW4gc2VwYXJhdGUgZmlsZXMgaW4gdGhhdCBkaXJlY3RvcnkuCisKK1RoZSBAZmlsZXthY2luY2x1ZGUubTR9IGZpbGUgaXMgb25seSB1c2VkIHdoZW4gdXNpbmcgYXV0b21ha2U7IGluIG9sZGVyCit0b29scywgdGhlIGRldmVsb3BlciB3cml0ZXMgQGZpbGV7YWNsb2NhbC5tNH0gZGlyZWN0bHksIGlmIGl0IGlzIG5lZWRlZC4KK0BlbmQgdGFibGUKKworQG5vZGUgR2VuZXJhdGVkIERldmVsb3BlciBGaWxlcworQHN1YnNlY3Rpb24gR2VuZXJhdGVkIERldmVsb3BlciBGaWxlcworCitUaGUgZm9sbG93aW5nIGZpbGVzIHdvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgZGV2ZWxvcGVyLgorCitXaGVuIHVzaW5nIGF1dG9tYWtlLCB0aGVzZSBmaWxlcyBhcmUgbm9ybWFsbHkgbm90IGdlbmVyYXRlZCBtYW51YWxseQorYWZ0ZXIgdGhlIGZpcnN0IHRpbWUuICBJbnN0ZWFkLCB0aGUgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSBjb250YWlucworcnVsZXMgdG8gYXV0b21hdGljYWxseSByZWJ1aWxkIHRoZSBmaWxlcyBhcyByZXF1aXJlZC4gIFdoZW4KK0BzYW1we0FNX01BSU5UQUlORVJfTU9ERX0gaXMgdXNlZCBpbiBAZmlsZXtjb25maWd1cmUuaW59ICh0aGUgbm9ybWFsCitjYXNlIGluIEN5Z251cyBjb2RlKSwgdGhlIGF1dG9tYXRpYyByZWJ1aWxkaW5nIHJ1bGVzIHdpbGwgb25seSBiZQorZGVmaW5lZCBpZiB5b3UgY29uZmlndXJlIHVzaW5nIHRoZSBAc2FtcHstLWVuYWJsZS1tYWludGFpbmVyLW1vZGV9CitvcHRpb24uCisKK1doZW4gdXNpbmcgYXV0b21hdGljIHJlYnVpbGRpbmcsIGl0IGlzIGltcG9ydGFudCB0byBlbnN1cmUgdGhhdCBhbGwgdGhlCit2YXJpb3VzIHRvb2xzIGhhdmUgYmVlbiBidWlsdCBhbmQgaW5zdGFsbGVkIG9uIHlvdXIgQHNhbXB7UEFUSH0uICBVc2luZworYXV0b21hdGljIHJlYnVpbGRpbmcgaXMgaGlnaGx5IHJlY29tbWVuZGVkLCBzbyBtdWNoIHNvIHRoYXQgSSdtIG5vdAorZ29pbmcgdG8gZXhwbGFpbiB3aGF0IHlvdSBoYXZlIHRvIGRvIGlmIHlvdSBkb24ndCB1c2UgaXQuCisKK0B0YWJsZSBAZmlsZQorQGl0ZW0gY29uZmlndXJlCitAY2luZGV4IEBmaWxle2NvbmZpZ3VyZX0KK1RoaXMgaXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2ggd2lsbCBiZSBydW4gd2hlbiBidWlsZGluZyB0aGUKK3BhY2thZ2UuICBUaGlzIGlzIGdlbmVyYXRlZCBieSBAc2FtcHthdXRvY29uZn0gZnJvbSBAZmlsZXtjb25maWd1cmUuaW59CithbmQgQGZpbGV7YWNsb2NhbC5tNH0uICBUaGlzIGlzIGEgc2hlbGwgc2NyaXB0LgorCitAaXRlbSBNYWtlZmlsZS5pbgorQGNpbmRleCBAZmlsZXtNYWtlZmlsZS5pbn0KK1RoaXMgaXMgdGhlIGZpbGUgd2hpY2ggdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCB0dXJuIGludG8gdGhlCitAZmlsZXtNYWtlZmlsZX0gYXQgYnVpbGQgdGltZS4gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkKK0BzYW1we2F1dG9tYWtlfSBmcm9tIEBmaWxle01ha2VmaWxlLmFtfS4gIElmIHlvdSBhcmVuJ3QgdXNpbmcgYXV0b21ha2UsCit5b3UgbXVzdCB3cml0ZSB0aGlzIGZpbGUgeW91cnNlbGYuICBUaGlzIGZpbGUgaXMgcHJldHR5IG11Y2ggYSBub3JtYWwKK0BmaWxle01ha2VmaWxlfSwgd2l0aCBzb21lIGNvbmZpZ3VyZSBzdWJzdGl0dXRpb25zIGZvciBjZXJ0YWluCit2YXJpYWJsZXMuCisKK0BpdGVtIGFjbG9jYWwubTQKK0BjaW5kZXggQGZpbGV7YWNsb2NhbC5tNH0KK1RoaXMgZmlsZSBpcyBjcmVhdGVkIGJ5IHRoZSBAc2FtcHthY2xvY2FsfSBwcm9ncmFtLCBiYXNlZCBvbiB0aGUKK2NvbnRlbnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gYW5kIEBmaWxle2FjaW5jbHVkZS5tNH0gKG9yLCBhcyBub3RlZCBpbgordGhlIGRlc2NyaXB0aW9uIG9mIEBmaWxle2FjaW5jbHVkZS5tNH0gYWJvdmUsIG9uIHRoZSBjb250ZW50cyBvZiBhbgorQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSkuICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgb2YgYXV0b2NvbmYKK21hY3JvcyB3aGljaCBAc2FtcHthdXRvY29uZn0gd2lsbCB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBmaWxlCitAZmlsZXtjb25maWd1cmV9LiAgVGhlc2UgYXV0b2NvbmYgbWFjcm9zIG1heSBiZSBkZWZpbmVkIGJ5IHlvdSBpbgorQGZpbGV7YWNpbmNsdWRlLm00fSBvciB0aGV5IG1heSBiZSBkZWZpbmVkIGJ5IG90aGVyIHBhY2thZ2VzIHN1Y2ggYXMKK2F1dG9tYWtlLCBsaWJ0b29sIG9yIGdldHRleHQuICBJZiB5b3UgYXJlbid0IHVzaW5nIGF1dG9tYWtlLCB5b3Ugd2lsbAorbm9ybWFsbHkgd3JpdGUgdGhpcyBmaWxlIHlvdXJzZWxmOyBpbiB0aGF0IGNhc2UsIGlmIEBmaWxle2NvbmZpZ3VyZS5pbn0KK3VzZXMgb25seSBzdGFuZGFyZCBhdXRvY29uZiBtYWNyb3MsIHRoaXMgZmlsZSB3aWxsIG5vdCBiZSBuZWVkZWQgYXQgYWxsLgorCitAaXRlbSBjb25maWcuaW4KK0BjaW5kZXggQGZpbGV7Y29uZmlnLmlufQorQGNpbmRleCBAZmlsZXtjb25maWcuaC5pbn0KK1RoaXMgZmlsZSBpcyBjcmVhdGVkIGJ5IEBzYW1we2F1dG9oZWFkZXJ9IGJhc2VkIG9uIEBmaWxle2FjY29uZmlnLmh9IGFuZAorQGZpbGV7Y29uZmlndXJlLmlufS4gIEF0IGJ1aWxkIHRpbWUsIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgZGVmaW5lCitzb21lIG9mIHRoZSBtYWNyb3MgaW4gaXQgdG8gY3JlYXRlIEBmaWxle2NvbmZpZy5ofSwgd2hpY2ggbWF5IHRoZW4gYmUKK2luY2x1ZGVkIGJ5IHlvdXIgcHJvZ3JhbS4gIFRoaXMgcGVybWl0cyB5b3VyIEMgY29kZSB0byB1c2UgcHJlcHJvY2Vzc29yCitjb25kaXRpb25hbHMgdG8gY2hhbmdlIGl0cyBiZWhhdmlvdXIgYmFzZWQgb24gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKK2hvc3Qgc3lzdGVtLiAgVGhpcyBmaWxlIG1heSBhbHNvIGJlIGNhbGxlZCBAZmlsZXtjb25maWcuaC5pbn0uCisKK0BpdGVtIHN0YW1wLmgtaW4KK0BjaW5kZXggQGZpbGV7c3RhbXAtaC5pbn0KK1RoaXMgcmF0aGVyIHVuaW50ZXJlc3RpbmcgZmlsZSwgd2hpY2ggSSBvbWl0dGVkIGZyb20gdGhlIHBpY3R1cmUsIGlzCitnZW5lcmF0ZWQgYnkgQHNhbXB7YXV0b21ha2V9LiAgSXQgYWx3YXlzIGNvbnRhaW5zIHRoZSBzdHJpbmcKK0BzYW1we3RpbWVzdGFtcH0uICBJdCBpcyB1c2VkIGFzIGEgdGltZXN0YW1wIGZpbGUgaW5kaWNhdGluZyB3aGV0aGVyCitAZmlsZXtjb25maWcuaW59IGlzIHVwIHRvIGRhdGUuICBVc2luZyBhIHRpbWVzdGFtcCBmaWxlIG1lYW5zIHRoYXQKK0BmaWxle2NvbmZpZy5pbn0gY2FuIGJlIG1hcmtlZCBhcyB1cCB0byBkYXRlIHdpdGhvdXQgYWN0dWFsbHkgY2hhbmdpbmcKK2l0cyBtb2RpZmljYXRpb24gdGltZS4gIFRoaXMgaXMgdXNlZnVsIHNpbmNlIEBmaWxle2NvbmZpZy5pbn0gZGVwZW5kcwordXBvbiBAZmlsZXtjb25maWd1cmUuaW59LCBidXQgaXQgaXMgZWFzeSB0byBjaGFuZ2UgQGZpbGV7Y29uZmlndXJlLmlufQoraW4gYSB3YXkgd2hpY2ggZG9lcyBub3QgYWZmZWN0IEBmaWxle2NvbmZpZy5pbn0uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJ1aWxkIEZpbGVzCitAc2VjdGlvbiBCdWlsZCBGaWxlcworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmaWxlcyB3aGljaCBhcmUgY3JlYXRlZCBhdCBjb25maWd1cmUgYW5kCitidWlsZCB0aW1lLiAgVGhlc2UgYXJlIHRoZSBmaWxlcyB3aGljaCBzb21lYm9keSB3aG8gYnVpbGRzIHRoZSBwYWNrYWdlCit3aWxsIHNlZS4KKworT2YgY291cnNlLCB0aGUgZGV2ZWxvcGVyIHdpbGwgYWxzbyBidWlsZCB0aGUgcGFja2FnZS4gIFRoZSBkaXN0aW5jdGlvbgorYmV0d2VlbiBkZXZlbG9wZXIgZmlsZXMgYW5kIGJ1aWxkIGZpbGVzIGlzIG5vdCB0aGF0IHRoZSBkZXZlbG9wZXIgZG9lcworbm90IHNlZSB0aGUgYnVpbGQgZmlsZXMsIGJ1dCB0aGF0IHNvbWVib2R5IHdobyBvbmx5IGJ1aWxkcyB0aGUgcGFja2FnZQorZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZGV2ZWxvcGVyIGZpbGVzLgorCitAbWVudQorKiBCdWlsZCBGaWxlcyBQaWN0dXJlOjoJCUJ1aWxkIEZpbGVzIFBpY3R1cmUuCisqIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uOjoJQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24uCitAZW5kIG1lbnUKKworQG5vZGUgQnVpbGQgRmlsZXMgUGljdHVyZQorQHN1YnNlY3Rpb24gQnVpbGQgRmlsZXMgUGljdHVyZQorCitIZXJlIGlzIGEgcGljdHVyZSBvZiB0aGUgZmlsZXMgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGF0IGJ1aWxkIHRpbWUuCitAZmlsZXtjb25maWcuc3RhdHVzfSBpcyBib3RoIGEgY3JlYXRlZCBmaWxlIGFuZCBhIHNoZWxsIHNjcmlwdCB3aGljaCBpcworcnVuIHRvIGNyZWF0ZSBvdGhlciBmaWxlcywgYW5kIHRoZSBwaWN0dXJlIGF0dGVtcHRzIHRvIHNob3cgdGhhdC4KKworQGltYWdle2NvbmZpZ2J1aWxkfQorCitAbm9kZSBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbgorQHN1YnNlY3Rpb24gQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24KKworVGhpcyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlcyB3aGljaCBhcmUgY3JlYXRlZCBhdCBidWlsZCB0aW1lLgorCitAdGFibGUgQGZpbGUKK0BpdGVtIGNvbmZpZy5zdGF0dXMKK0BjaW5kZXggQGZpbGV7Y29uZmlnLnN0YXR1c30KK1RoZSBmaXJzdCBzdGVwIGluIGJ1aWxkaW5nIGEgcGFja2FnZSBpcyB0byBydW4gdGhlIEBmaWxle2NvbmZpZ3VyZX0KK3NjcmlwdC4gIFRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsIGNyZWF0ZSB0aGUgZmlsZQorQGZpbGV7Y29uZmlnLnN0YXR1c30sIHdoaWNoIGlzIGl0c2VsZiBhIHNoZWxsIHNjcmlwdC4gIFdoZW4geW91IGZpcnN0CitydW4gQGZpbGV7Y29uZmlndXJlfSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biBAZmlsZXtjb25maWcuc3RhdHVzfS4KK0FuIEBmaWxle01ha2VmaWxlfSBkZXJpdmVkIGZyb20gYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlLmlufQord2lsbCBjb250YWluIHJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcnVuIEBmaWxle2NvbmZpZy5zdGF0dXN9IGFnYWluIHdoZW4KK25lY2Vzc2FyeSB0byByZWNyZWF0ZSBjZXJ0YWluIGZpbGVzIGlmIHRoZWlyIGlucHV0cyBjaGFuZ2UuCisKK0BpdGVtIE1ha2VmaWxlCitAY2luZGV4IEBmaWxle01ha2VmaWxlfQorVGhpcyBpcyB0aGUgZmlsZSB3aGljaCBtYWtlIHdpbGwgcmVhZCB0byBidWlsZCB0aGUgcHJvZ3JhbS4gIFRoZQorQGZpbGV7Y29uZmlnLnN0YXR1c30gc2NyaXB0IHdpbGwgdHJhbnNmb3JtIEBmaWxle01ha2VmaWxlLmlufSBpbnRvCitAZmlsZXtNYWtlZmlsZX0uCisKK0BpdGVtIGNvbmZpZy5oCitAY2luZGV4IEBmaWxle2NvbmZpZy5ofQorVGhpcyBmaWxlIGRlZmluZXMgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHdoaWNoIEMgY29kZSBjYW4gdXNlIHRvIGFkanVzdAoraXRzIGJlaGF2aW91ciBvbiBkaWZmZXJlbnQgc3lzdGVtcy4gIFRoZSBAZmlsZXtjb25maWcuc3RhdHVzfSBzY3JpcHQKK3dpbGwgdHJhbnNmb3JtIEBmaWxle2NvbmZpZy5pbn0gaW50byBAZmlsZXtjb25maWcuaH0uCisKK0BpdGVtIGNvbmZpZy5jYWNoZQorQGNpbmRleCBAZmlsZXtjb25maWcuY2FjaGV9CitUaGlzIGZpbGUgZGlkIG5vdCBmaXQgbmVhdGx5IGludG8gdGhlIHBpY3R1cmUsIGFuZCBJIG9taXR0ZWQgaXQuICBJdCBpcwordXNlZCBieSB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdG8gY2FjaGUgcmVzdWx0cyBiZXR3ZWVuIHJ1bnMuICBUaGlzCitjYW4gYmUgYW4gaW1wb3J0YW50IHNwZWVkdXAuICBJZiB5b3UgbW9kaWZ5IEBmaWxle2NvbmZpZ3VyZS5pbn0gaW4gc3VjaAorYSB3YXkgdGhhdCB0aGUgcmVzdWx0cyBvZiBvbGQgdGVzdHMgc2hvdWxkIGNoYW5nZSAocGVyaGFwcyB5b3UgaGF2ZQorYWRkZWQgYSBuZXcgbGlicmFyeSB0byBAc2FtcHtMREZMQUdTfSksIHRoZW4geW91IHdpbGwgaGF2ZSB0byByZW1vdmUKK0BmaWxle2NvbmZpZy5jYWNoZX0gdG8gZm9yY2UgdGhlIHRlc3RzIHRvIGJlIHJlcnVuLgorCitUaGUgYXV0b2NvbmYgbWFudWFsIGV4cGxhaW5zIGhvdyB0byBzZXQgdXAgYSBzaXRlIHNwZWNpZmljIGNhY2hlIGZpbGUuCitUaGlzIGNhbiBzcGVlZCB1cCBydW5uaW5nIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0cyBvbiB5b3VyIHN5c3RlbS4KKworQGl0ZW0gc3RhbXAuaAorQGNpbmRleCBAZmlsZXtzdGFtcC1ofQorVGhpcyBmaWxlLCB3aGljaCBJIG9taXR0ZWQgZnJvbSB0aGUgcGljdHVyZSwgaXMgc2ltaWxhciB0bworQGZpbGV7c3RhbXAtaC5pbn0uICBJdCBpcyB1c2VkIGFzIGEgdGltZXN0YW1wIGZpbGUgaW5kaWNhdGluZyB3aGV0aGVyCitAZmlsZXtjb25maWcuaH0gaXMgdXAgdG8gZGF0ZS4gIFRoaXMgaXMgdXNlZnVsIHNpbmNlIEBmaWxle2NvbmZpZy5ofQorZGVwZW5kcyB1cG9uIEBmaWxle2NvbmZpZy5zdGF0dXN9LCBidXQgaXQgaXMgZWFzeSBmb3IKK0BmaWxle2NvbmZpZy5zdGF0dXN9IHRvIGNoYW5nZSBpbiBhIHdheSB3aGljaCBkb2VzIG5vdCBhZmZlY3QKK0BmaWxle2NvbmZpZy5ofS4KK0BlbmQgdGFibGUKKworQG5vZGUgU3VwcG9ydCBGaWxlcworQHNlY3Rpb24gU3VwcG9ydCBGaWxlcworCitUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHJlcXVpcmVzIHNldmVyYWwgc3VwcG9ydCBmaWxlcyB0byBiZQoraW5jbHVkZWQgd2l0aCB5b3VyIGRpc3RyaWJ1dGlvbi4gIFlvdSBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byBjb25jZXJuCit5b3Vyc2VsZiB3aXRoIHRoZXNlLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIG1vc3QgYXJlIGFscmVhZHkKK3ByZXNlbnQuICBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBpbnN0YWxsZWQgd2l0aCB5b3VyIHNvdXJjZSBieQorQHNhbXB7YXV0b21ha2V9ICh3aXRoIHRoZSBAc2FtcHstLWFkZC1taXNzaW5nfSBvcHRpb24pIGFuZAorQHNhbXB7bGlidG9vbGl6ZX0uCisKK1lvdSBkb24ndCBoYXZlIHRvIHB1dCB0aGUgc3VwcG9ydCBmaWxlcyBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gIFlvdQorY2FuIHB1dCB0aGVtIGluIGEgc3ViZGlyZWN0b3J5LCBhbmQgdXNlIHRoZSBAc2FtcHtBQ19DT05GSUdfQVVYX0RJUn0KK21hY3JvIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0gdG8gdGVsbCBAc2FtcHthdXRvbWFrZX0gYW5kIHRoZQorQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2hlcmUgdGhleSBhcmUuCisKK0luIHRoaXMgc2VjdGlvbiwgSSBkZXNjcmliZSB0aGUgc3VwcG9ydCBmaWxlcywgc28gdGhhdCB5b3UgY2FuIGtub3cgd2hhdAordGhleSBhcmUgYW5kIHdoeSB0aGV5IGFyZSB0aGVyZS4KKworQHRhYmxlIEBmaWxlCitAaXRlbSBBQk9VVC1OTFMKK0FkZGVkIGJ5IGF1dG9tYWtlIGlmIHlvdSBhcmUgdXNpbmcgZ2V0dGV4dC4gIFRoaXMgaXMgYSBkb2N1bWVudGF0aW9uCitmaWxlIGFib3V0IHRoZSBnZXR0ZXh0IHByb2plY3QuCitAaXRlbSBhbnNpMmtuci5jCitVc2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gaWYgeW91IHB1dCBAc2FtcHthbnNpMmtucn0KK2luIEBzYW1we0FVVE9NQUtFX09QVElPTlN9IGluIEBmaWxle01ha2VmaWxlLmFtfS4gIFRoaXMgcGVybWl0cworY29tcGlsaW5nIEFOU0kgQyBjb2RlIHdpdGggYSBLJlIgQyBjb21waWxlci4KK0BpdGVtIGFuc2kya25yLjEKK1RoZSBtYW4gcGFnZSB3aGljaCBnb2VzIHdpdGggQGZpbGV7YW5zaTJrbnIuY30uCitAaXRlbSBjb25maWcuZ3Vlc3MKK0Egc2hlbGwgc2NyaXB0IHdoaWNoIGRldGVybWluZXMgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBmb3IgdGhlIHN5c3RlbSBvbgord2hpY2ggaXQgaXMgcnVuLgorQGl0ZW0gY29uZmlnLnN1YgorQSBzaGVsbCBzY3JpcHQgd2hpY2ggY2Fub25pY2FsaXplcyBhIGNvbmZpZ3VyYXRpb24gbmFtZSBlbnRlcmVkIGJ5IGEKK3VzZXIuCitAaXRlbSBlbGlzcC1jb21wCitVc2VkIHRvIGNvbXBpbGUgRW1hY3MgTElTUCBmaWxlcy4KK0BpdGVtIGluc3RhbGwtc2gKK0Egc2hlbGwgc2NyaXB0IHdoaWNoIGluc3RhbGxzIGEgcHJvZ3JhbS4gIFRoaXMgaXMgdXNlZCBpZiB0aGUgY29uZmlndXJlCitzY3JpcHQgY2FuIG5vdCBmaW5kIGFuIGluc3RhbGwgYmluYXJ5LgorQGl0ZW0gbHRjb25maWcKK1VzZWQgYnkgbGlidG9vbC4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQgd2hpY2ggY29uZmlndXJlcyBsaWJ0b29sIGZvcgordGhlIHBhcnRpY3VsYXIgc3lzdGVtIG9uIHdoaWNoIGl0IGlzIHVzZWQuCitAaXRlbSBsdG1haW4uc2gKK1VzZWQgYnkgbGlidG9vbC4gIFRoaXMgaXMgdGhlIGFjdHVhbCBsaWJ0b29sIHNjcmlwdCB3aGljaCBpcyB1c2VkLCBhZnRlcgoraXQgaXMgY29uZmlndXJlZCBieSBAZmlsZXtsdGNvbmZpZ30gdG8gYnVpbGQgYSBsaWJyYXJ5LgorQGl0ZW0gbWRhdGUtc2gKK0Egc2hlbGwgc2NyaXB0IHVzZWQgYnkgYW4gYXV0b21ha2UgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfSB0byBwcmV0dHkKK3ByaW50IHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBhIGZpbGUuICBUaGlzIGlzIHVzZWQgdG8gbWFpbnRhaW4gdmVyc2lvbgorbnVtYmVycyBmb3IgdGV4aW5mbyBmaWxlcy4KK0BpdGVtIG1pc3NpbmcKK0Egc2hlbGwgc2NyaXB0IHVzZWQgaWYgc29tZSB0b29sIGlzIG1pc3NpbmcgZW50aXJlbHkuICBUaGlzIGlzIHVzZWQgYnkKK2FuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gYXZvaWQgY2VydGFpbiBzb3J0cyBvZgordGltZXN0YW1wIHByb2JsZW1zLgorQGl0ZW0gbWtpbnN0YWxsZGlycworQSBzaGVsbCBzY3JpcHQgd2hpY2ggY3JlYXRlcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBwYXJlbnQKK2RpcmVjdG9yaWVzLiAgVGhpcyBpcyB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0KK2R1cmluZyBpbnN0YWxsYXRpb24uCitAaXRlbSB0ZXhpbmZvLnRleAorUmVxdWlyZWQgaWYgeW91IGhhdmUgYW55IHRleGluZm8gZmlsZXMuICBUaGlzIGlzIHVzZWQgd2hlbiBjb252ZXJ0aW5nCitUZXhpbmZvIGZpbGVzIGludG8gRFZJIHVzaW5nIEBzYW1we3RleGkyZHZpfSBhbmQgQFRlWHt9LgorQGl0ZW0geWx3cmFwCitBIHNoZWxsIHNjcmlwdCB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gcnVuCitwcm9ncmFtcyBsaWtlIEBzYW1we2Jpc29ufSwgQHNhbXB7eWFjY30sIEBzYW1we2ZsZXh9LCBhbmQgQHNhbXB7bGV4fS4KK1RoZXNlIHByb2dyYW1zIGRlZmF1bHQgdG8gcHJvZHVjaW5nIG91dHB1dCBmaWxlcyB3aXRoIGEgZml4ZWQgbmFtZSwgYW5kCit0aGUgQGZpbGV7eWx3cmFwfSBzY3JpcHQgcnVucyB0aGVtIGluIGEgc3ViZGlyZWN0b3J5IHRvIGF2b2lkIGZpbGUgbmFtZQorY29uZmxpY3RzIHdoZW4gdXNpbmcgYSBwYXJhbGxlbCBtYWtlIHByb2dyYW0uCitAZW5kIHRhYmxlCisKK0Bub2RlIENvbmZpZ3VyYXRpb24gTmFtZXMKK0BjaGFwdGVyIENvbmZpZ3VyYXRpb24gTmFtZXMKK0BjaW5kZXggY29uZmlndXJhdGlvbiBuYW1lcworQGNpbmRleCBjb25maWd1cmF0aW9uIHRyaXBsZXRzCitAY2luZGV4IHRyaXBsZXRzCitAY2luZGV4IGhvc3QgbmFtZXMKK0BjaW5kZXggaG9zdCB0cmlwbGV0cworQGNpbmRleCBjYW5vbmljYWwgc3lzdGVtIG5hbWVzCitAY2luZGV4IHN5c3RlbSBuYW1lcworQGNpbmRleCBzeXN0ZW0gdHlwZXMKKworVGhlIEdOVSBjb25maWd1cmUgc3lzdGVtIG5hbWVzIGFsbCBzeXN0ZW1zIHVzaW5nIGEgQGRmbntjb25maWd1cmF0aW9uCituYW1lfS4gIEFsbCBzdWNoIG5hbWVzIHVzZWQgdG8gYmUgdHJpcGxldHMgKHRoZXkgbWF5IG5vdyBjb250YWluIGZvdXIKK3BhcnRzIGluIGNlcnRhaW4gY2FzZXMpLCBhbmQgdGhlIHRlcm0gQGRmbntjb25maWd1cmF0aW9uIHRyaXBsZXR9IGlzCitzdGlsbCBzZWVuLgorCitAbWVudQorKiBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbjo6CUNvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uLgorKiBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzOjoJCVVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXMuCitAZW5kIG1lbnUKKworQG5vZGUgQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb24KK0BzZWN0aW9uIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uCisKK1RoaXMgaXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0KK0B2YXJ7Y3B1fS1AdmFye21hbnVmYWN0dXJlcn0tQHZhcntvcGVyYXRpbmdfc3lzdGVtfS4gIEluIHNvbWUgY2FzZXMsCit0aGlzIGlzIGV4dGVuZGVkIHRvIGEgZm91ciBwYXJ0IGZvcm06CitAdmFye2NwdX0tQHZhcnttYW51ZmFjdHVyZXJ9LUB2YXJ7a2VybmVsfS1AdmFye29wZXJhdGluZ19zeXN0ZW19LgorCitXaGVuIHVzaW5nIGEgY29uZmlndXJhdGlvbiBuYW1lIGluIGEgY29uZmlndXJlIG9wdGlvbiwgaXQgaXMgbm9ybWFsbHkKK25vdCBuZWNlc3NhcnkgdG8gc3BlY2lmeSBhbiBlbnRpcmUgbmFtZS4gIEluIHBhcnRpY3VsYXIsIHRoZQorQHZhcnttYW51ZmFjdHVyZXJ9IGZpZWxkIGlzIG9mdGVuIG9taXR0ZWQsIGxlYWRpbmcgdG8gc3RyaW5ncyBzdWNoIGFzCitAc2FtcHtpMzg2LWxpbnV4fSBvciBAc2FtcHtzcGFyYy1zdW5vc30uICBUaGUgc2hlbGwgc2NyaXB0CitAZmlsZXtjb25maWcuc3VifSB3aWxsIHRyYW5zbGF0ZSB0aGVzZSBzaG9ydGVuZWQgc3RyaW5ncyBpbnRvIHRoZQorY2Fub25pY2FsIGZvcm0uICBhdXRvY29uZiB3aWxsIGFycmFuZ2UgZm9yIEBmaWxle2NvbmZpZy5zdWJ9IHRvIGJlIHJ1bgorYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIG5lZWRlZC4KKworVGhlIGZpZWxkcyBvZiBhIGNvbmZpZ3VyYXRpb24gbmFtZSBhcmUgYXMgZm9sbG93czoKKworQHRhYmxlIEB2YXIKK0BpdGVtIGNwdQorVGhlIHR5cGUgb2YgcHJvY2Vzc29yLiAgVGhpcyBpcyB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgQHNhbXB7aTM4Nn0gb3IKK0BzYW1we3NwYXJjfS4gIE1vcmUgc3BlY2lmaWMgdmFyaWFudHMgYXJlIHVzZWQgYXMgd2VsbCwgc3VjaCBhcworQHNhbXB7bWlwc2VsfSB0byBpbmRpY2F0ZSBhIGxpdHRsZSBlbmRpYW4gTUlQUyBwcm9jZXNzb3IuCitAaXRlbSBtYW51ZmFjdHVyZXIKK0Egc29tZXdoYXQgZnJlZWZvcm0gZmllbGQgd2hpY2ggaW5kaWNhdGVzIHRoZSBtYW51ZmFjdHVyZXIgb2YgdGhlCitzeXN0ZW0uICBUaGlzIGlzIG9mdGVuIHNpbXBseSBAc2FtcHt1bmtub3dufS4gIE90aGVyIGNvbW1vbiBzdHJpbmdzIGFyZQorQHNhbXB7cGN9IGZvciBhbiBJQk0gUEMgY29tcGF0aWJsZSBzeXN0ZW0sIG9yIHRoZSBuYW1lIG9mIGEgd29ya3N0YXRpb24KK3ZlbmRvciwgc3VjaCBhcyBAc2FtcHtzdW59LgorQGl0ZW0gb3BlcmF0aW5nX3N5c3RlbQorVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2hpY2ggaXMgcnVuIG9uIHRoZSBzeXN0ZW0uICBUaGlzIHdpbGwKK2JlIHNvbWV0aGluZyBsaWtlIEBzYW1we3NvbGFyaXMyLjV9IG9yIEBzYW1we2lyaXg2LjN9LiAgVGhlcmUgaXMgbm8KK3BhcnRpY3VsYXIgcmVzdHJpY3Rpb24gb24gdGhlIHZlcnNpb24gbnVtYmVyLCBhbmQgc3RyaW5ncyBsaWtlCitAc2FtcHthaXg0LjEuNC4wfSBhcmUgc2Vlbi4gIEZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIHdoaWNoIGhhcyBubworb3BlcmF0aW5nIHN5c3RlbSwgdGhpcyBmaWVsZCBub3JtYWxseSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb2JqZWN0IGZpbGUKK2Zvcm1hdCwgc3VjaCBhcyBAc2FtcHtlbGZ9IG9yIEBzYW1we2NvZmZ9LgorQGl0ZW0ga2VybmVsCitUaGlzIGlzIHVzZWQgbWFpbmx5IGZvciBHTlUvTGludXguICBBIHR5cGljYWwgR05VL0xpbnV4IGNvbmZpZ3VyYXRpb24KK25hbWUgaXMgQHNhbXB7aTU4Ni1wYy1saW51eC1nbnVsaWJjMX0uICBJbiB0aGlzIGNhc2UgdGhlIGtlcm5lbCwKK0BzYW1we2xpbnV4fSwgaXMgc2VwYXJhdGVkIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0sIEBzYW1we2dudWxpYmMxfS4KK0BlbmQgdGFibGUKKworVGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtjb25maWcuZ3Vlc3N9IHdpbGwgbm9ybWFsbHkgcHJpbnQgdGhlIGNvcnJlY3QKK2NvbmZpZ3VyYXRpb24gbmFtZSBmb3IgdGhlIHN5c3RlbSBvbiB3aGljaCBpdCBpcyBydW4uICBJdCBkb2VzIGJ5CitydW5uaW5nIEBzYW1we3VuYW1lfSBhbmQgYnkgZXhhbWluaW5nIG90aGVyIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKK3N5c3RlbS4KKworQmVjYXVzZSBAZmlsZXtjb25maWcuZ3Vlc3N9IGNhbiBub3JtYWxseSBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyYXRpb24KK25hbWUgZm9yIGEgbWFjaGluZSwgaXQgaXMgbm9ybWFsbHkgb25seSBuZWNlc3NhcnkgdG8gc3BlY2lmeSBhCitjb25maWd1cmF0aW9uIG5hbWUgd2hlbiBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyIG9yIHdoZW4gYnVpbGRpbmcgdXNpbmcKK2EgY3Jvc3MtY29tcGlsZXIuCisKK0Bub2RlIFVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXMKK0BzZWN0aW9uIFVzaW5nIENvbmZpZ3VyYXRpb24gTmFtZXMKKworQSBjb25maWd1cmUgc2NyaXB0IHdpbGwgc29tZXRpbWVzIGhhdmUgdG8gbWFrZSBhIGRlY2lzaW9uIGJhc2VkIG9uIGEKK2NvbmZpZ3VyYXRpb24gbmFtZS4gIFlvdSB3aWxsIG5lZWQgdG8gZG8gdGhpcyBpZiB5b3UgaGF2ZSB0byBjb21waWxlCitjb2RlIGRpZmZlcmVudGx5IGJhc2VkIG9uIHNvbWV0aGluZyB3aGljaCBjYW4gbm90IGJlIHRlc3RlZCB1c2luZyBhCitzdGFuZGFyZCBhdXRvY29uZiBmZWF0dXJlIHRlc3QuCisKK0l0IGlzIG5vcm1hbGx5IGJldHRlciB0byB0ZXN0IGZvciBwYXJ0aWN1bGFyIGZlYXR1cmVzLCByYXRoZXIgdGhhbiB0bwordGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbS4gIFRoaXMgaXMgYmVjYXVzZSBhcyBVbml4IGV2b2x2ZXMsCitkaWZmZXJlbnQgc3lzdGVtcyBjb3B5IGZlYXR1cmVzIGZyb20gb25lIGFub3RoZXIuICBFdmVuIGlmIHlvdSBuZWVkIHRvCitkZXRlcm1pbmUgd2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYmFzZWQgb24gYSBjb25maWd1cmF0aW9uCituYW1lLCB5b3Ugc2hvdWxkIGRlZmluZSBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmVhdHVyZSwgcmF0aGVyIHRoYW4KK2RlZmluaW5nIGEgbWFjcm8gd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSB5b3UgYXJlIG9uLgorCitUZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtIGlzIG5vcm1hbGx5IGRvbmUgdXNpbmcgYSBjYXNlIHN0YXRlbWVudAoraW4gQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoZSBjYXNlIHN0YXRlbWVudCBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlCit0aGUgZm9sbG93aW5nLCBhc3N1bWluZyB0aGF0IEBzYW1we2hvc3R9IGlzIGEgc2hlbGwgdmFyaWFibGUgaG9sZGluZyBhCitjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lICh3aGljaCB3aWxsIGJlIHRoZSBjYXNlIGlmCitAZmlsZXtjb25maWd1cmUuaW59IHVzZXMgdGhlIEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSBvcgorQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gbWFjcm8pLgorCitAc21hbGxleGFtcGxlCitjYXNlICIkQHtob3N0QH0iIGluCitpWzM0NTZdODYtKi1saW51eC1nbnUqKSBkbyBzb21ldGhpbmcgOzsKK3NwYXJjKi1zdW4tc29sYXJpczIuWzU2Nzg5XSopIGRvIHNvbWV0aGluZyA7Oworc3BhcmMqLXN1bi1zb2xhcmlzKikgZG8gc29tZXRoaW5nIDs7CittaXBzKi0qLWVsZiopIGRvIHNvbWV0aGluZyA7OworZXNhYworQGVuZCBzbWFsbGV4YW1wbGUKKworSXQgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB0byB1c2UgQHNhbXB7Kn0gYWZ0ZXIgdGhlIG9wZXJhdGluZyBzeXN0ZW0KK2ZpZWxkLCBpbiBvcmRlciB0byBtYXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgd2hpY2ggd2lsbCBiZSBnZW5lcmF0ZWQgYnkKK0BmaWxle2NvbmZpZy5ndWVzc30uCisKK0luIG1vc3QgY2FzZXMgeW91IG11c3QgYmUgY2FyZWZ1bCB0byBtYXRjaCBhIHJhbmdlIG9mIHByb2Nlc3NvciB0eXBlcy4KK0ZvciBtb3N0IHByb2Nlc3NvciBmYW1pbGllcywgYSB0cmFpbGluZyBAc2FtcHsqfSBzdWZmaWNlcywgYXMgaW4KK0BzYW1we21pcHMqfSBhYm92ZS4gIEZvciB0aGUgaTM4NiBmYW1pbHksIHNvbWV0aGluZyBhbG9uZyB0aGUgbGluZXMgb2YKK0BzYW1we2lbMzQ1Nl04Nn0gc3VmZmljZXMgYXQgcHJlc2VudC4gIEZvciB0aGUgbTY4ayBmYW1pbHksIHlvdSB3aWxsCituZWVkIHNvbWV0aGluZyBsaWtlIEBzYW1we202OCp9LiAgT2YgY291cnNlLCBpZiB5b3UgZG8gbm90IG5lZWQgdG8gbWF0Y2gKK29uIHRoZSBwcm9jZXNzb3IsIGl0IGlzIHNpbXBsZXIgdG8ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUgZmllbGQgYnkgYQorQHNhbXB7Kn0sIGFzIGluIEBzYW1weyotKi1pcml4Kn0uCisKK0Bub2RlIENyb3NzIENvbXBpbGF0aW9uIFRvb2xzCitAY2hhcHRlciBDcm9zcyBDb21waWxhdGlvbiBUb29scworQGNpbmRleCBjcm9zcyB0b29scworCitUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIEBkZm57Y3Jvc3MKK2NvbXBpbGF0aW9ufSB0b29scy4gIEEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCBpcyBhIHRvb2wgd2hpY2ggcnVucyBvbgorb25lIHN5c3RlbSBhbmQgcHJvZHVjZXMgY29kZSB3aGljaCBydW5zIG9uIGFub3RoZXIgc3lzdGVtLgorCitAbWVudQorKiBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0czo6CQlDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cy4KKyogSG9zdCBhbmQgVGFyZ2V0OjoJCQlIb3N0IGFuZCBUYXJnZXQuCisqIFVzaW5nIHRoZSBIb3N0IFR5cGU6OgkJCVVzaW5nIHRoZSBIb3N0IFR5cGUuCisqIFNwZWNpZnlpbmcgdGhlIFRhcmdldDo6ICAgICAgIAlTcGVjaWZ5aW5nIHRoZSBUYXJnZXQuCisqIFVzaW5nIHRoZSBUYXJnZXQgVHlwZTo6CQlVc2luZyB0aGUgVGFyZ2V0IFR5cGUuCisqIENyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZTo6CUNyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZQorQGVuZCBtZW51CisKK0Bub2RlIENyb3NzIENvbXBpbGF0aW9uIENvbmNlcHRzCitAc2VjdGlvbiBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cworCitAY2luZGV4IGNyb3NzIGNvbXBpbGVyCitBIGNvbXBpbGVyIHdoaWNoIHByb2R1Y2VzIHByb2dyYW1zIHdoaWNoIHJ1biBvbiBhIGRpZmZlcmVudCBzeXN0ZW0gaXMgYQorY3Jvc3MgY29tcGlsYXRpb24gY29tcGlsZXIsIG9yIHNpbXBseSBhIEBkZm57Y3Jvc3MgY29tcGlsZXJ9LgorU2ltaWxhcmx5LCB3ZSBzcGVhayBvZiBjcm9zcyBhc3NlbWJsZXJzLCBjcm9zcyBsaW5rZXJzLCBldGMuCisKK0luIHRoZSBub3JtYWwgY2FzZSwgYSBjb21waWxlciBwcm9kdWNlcyBjb2RlIHdoaWNoIHJ1bnMgb24gdGhlIHNhbWUKK3N5c3RlbSBhcyB0aGUgb25lIG9uIHdoaWNoIHRoZSBjb21waWxlciBydW5zLiAgV2hlbiBpdCBpcyBuZWNlc3NhcnkgdG8KK2Rpc3Rpbmd1aXNoIHRoaXMgY2FzZSBmcm9tIHRoZSBjcm9zcyBjb21waWxhdGlvbiBjYXNlLCBzdWNoIGEgY29tcGlsZXIKK2lzIGNhbGxlZCBhIEBkZm57bmF0aXZlIGNvbXBpbGVyfS4gIFNpbWlsYXJseSwgd2Ugc3BlYWsgb2YgbmF0aXZlCithc3NlbWJsZXJzLCBldGMuCisKK0FsdGhvdWdoIHRoZSBkZWJ1Z2dlciBpcyBub3Qgc3RyaWN0bHkgc3BlYWtpbmcgYSBjb21waWxhdGlvbiB0b29sLCBpdCBpcworbmV2ZXJ0aGVsZXNzIG1lYW5pbmdmdWwgdG8gc3BlYWsgb2YgYSBjcm9zcyBkZWJ1Z2dlcjogYSBkZWJ1Z2dlciB3aGljaAoraXMgdXNlZCB0byBkZWJ1ZyBjb2RlIHdoaWNoIHJ1bnMgb24gYW5vdGhlciBzeXN0ZW0uICBFdmVyeXRoaW5nIHRoYXQgaXMKK3NhaWQgYmVsb3cgYWJvdXQgY29uZmlndXJpbmcgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMgYXBwbGllcyB0byB0aGUKK2RlYnVnZ2VyIGFzIHdlbGwuCisKK0Bub2RlIEhvc3QgYW5kIFRhcmdldAorQHNlY3Rpb24gSG9zdCBhbmQgVGFyZ2V0CitAY2luZGV4IGhvc3Qgc3lzdGVtCitAY2luZGV4IHRhcmdldCBzeXN0ZW0KKworV2hlbiBidWlsZGluZyBjcm9zcyBjb21waWxhdGlvbiB0b29scywgdGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc3lzdGVtcworaW52b2x2ZWQ6IHRoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuLCBhbmQgdGhlIHN5c3RlbSBmb3IKK3doaWNoIHRoZSB0b29scyBnZW5lcmF0ZSBjb2RlLgorCitUaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biBpcyBjYWxsZWQgdGhlIEBkZm57aG9zdH0gc3lzdGVtLgorCitUaGUgc3lzdGVtIGZvciB3aGljaCB0aGUgdG9vbHMgZ2VuZXJhdGUgY29kZSBpcyBjYWxsZWQgdGhlIEBkZm57dGFyZ2V0fQorc3lzdGVtLgorCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSBhIGNvbXBpbGVyIHdoaWNoIHJ1bnMgb24gYSBHTlUvTGludXgKK3N5c3RlbSBhbmQgZ2VuZXJhdGVzIEVMRiBwcm9ncmFtcyBmb3IgYSBNSVBTIGVtYmVkZGVkIHN5c3RlbS4gIEluIHRoaXMKK2Nhc2UgdGhlIEdOVS9MaW51eCBzeXN0ZW0gaXMgdGhlIGhvc3QsIGFuZCB0aGUgTUlQUyBFTEYgc3lzdGVtIGlzIHRoZQordGFyZ2V0LiAgU3VjaCBhIGNvbXBpbGVyIGNvdWxkIGJlIGNhbGxlZCBhIEdOVS9MaW51eCBjcm9zcyBNSVBTIEVMRgorY29tcGlsZXIsIG9yLCBlcXVpdmFsZW50bHksIGEgQHNhbXB7aTM4Ni1saW51eC1nbnV9IGNyb3NzCitAc2FtcHttaXBzLWVsZn0gY29tcGlsZXIuCisKK05hdHVyYWxseSwgbW9zdCBwcm9ncmFtcyBhcmUgbm90IGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzLiAgRm9yIHRob3NlCitwcm9ncmFtcywgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzcGVhayBvZiBhIHRhcmdldC4gIEl0IG9ubHkgbWFrZXMKK3NlbnNlIHRvIHNwZWFrIG9mIGEgdGFyZ2V0IGZvciB0b29scyBsaWtlIEBzYW1we2djY30gb3IgdGhlCitAc2FtcHtiaW51dGlsc30gd2hpY2ggYWN0dWFsbHkgcHJvZHVjZSBydW5uaW5nIGNvZGUuICBGb3IgZXhhbXBsZSwgaXQKK2RvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gc3BlYWsgb2YgdGhlIHRhcmdldCBvZiBhIHRvb2wgbGlrZSBAc2FtcHtiaXNvbn0KK29yIEBzYW1we21ha2V9LgorCitNb3N0IGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzIGNhbiBhbHNvIHNlcnZlIGFzIG5hdGl2ZSB0b29scy4gIEZvciBhCituYXRpdmUgY29tcGlsYXRpb24gdG9vbCwgaXQgaXMgc3RpbGwgbWVhbmluZ2Z1bCB0byBzcGVhayBvZiBhIHRhcmdldC4KK0ZvciBhIG5hdGl2ZSB0b29sLCB0aGUgdGFyZ2V0IGlzIHRoZSBzYW1lIGFzIHRoZSBob3N0LiAgRm9yIGV4YW1wbGUsIGZvcgorYSBHTlUvTGludXggbmF0aXZlIGNvbXBpbGVyLCB0aGUgaG9zdCBpcyBHTlUvTGludXgsIGFuZCB0aGUgdGFyZ2V0IGlzCithbHNvIEdOVS9MaW51eC4KKworQG5vZGUgVXNpbmcgdGhlIEhvc3QgVHlwZQorQHNlY3Rpb24gVXNpbmcgdGhlIEhvc3QgVHlwZQorCitJbiBhbG1vc3QgYWxsIGNhc2VzIHRoZSBob3N0IHN5c3RlbSBpcyB0aGUgc3lzdGVtIG9uIHdoaWNoIHlvdSBydW4gdGhlCitAc2FtcHtjb25maWd1cmV9IHNjcmlwdCwgYW5kIG9uIHdoaWNoIHlvdSBidWlsZCB0aGUgdG9vbHMgKGZvciB0aGUgY2FzZQord2hlbiB0aGV5IGRpZmZlciwgQHB4cmVme0NhbmFkaWFuIENyb3NzfSkuCisKK0BjaW5kZXggQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9CitJZiB5b3VyIGNvbmZpZ3VyZSBzY3JpcHQgbmVlZHMgdG8ga25vdyB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZQoraG9zdCBzeXN0ZW0sIGFuZCB0aGUgcGFja2FnZSBpcyBub3QgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sIGFuZAordGhlcmVmb3JlIGRvZXMgbm90IGhhdmUgYSB0YXJnZXQsIHB1dCBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gaW4KK0BmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGlzIG1hY3JvIHdpbGwgYXJyYW5nZSB0byBkZWZpbmUgYSBmZXcgc2hlbGwKK3ZhcmlhYmxlcyB3aGVuIHRoZSBAc2FtcHtjb25maWd1cmV9IHNjcmlwdCBpcyBydW4uCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gaG9zdAorVGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIGhvc3QuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUKK2RldGVybWluZWQgYnkgcnVubmluZyB0aGUgQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQsIGFsdGhvdWdoIHRoZQordXNlciBpcyBwZXJtaXR0ZWQgdG8gb3ZlcnJpZGUgdGhpcyBieSB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHstLWhvc3R9CitvcHRpb24uCitAaXRlbSBob3N0X2FsaWFzCitJbiB0aGUgdW51c3VhbCBjYXNlIHRoYXQgdGhlIHVzZXIgdXNlZCBhbiBleHBsaWNpdCBAc2FtcHstLWhvc3R9IG9wdGlvbiwKK3RoaXMgd2lsbCBiZSB0aGUgYXJndW1lbnQgdG8gQHNhbXB7LS1ob3N0fS4gIEluIHRoZSBub3JtYWwgY2FzZSwgdGhpcword2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgQHNhbXB7aG9zdH0gdmFyaWFibGUuCitAaXRlbSBob3N0X2NwdQorQGl0ZW14IGhvc3RfdmVuZG9yCitAaXRlbXggaG9zdF9vcworVGhlIGZpcnN0IHRocmVlIHBhcnRzIG9mIHRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lLgorQGVuZCB0YWJsZQorCitUaGUgc2hlbGwgdmFyaWFibGVzIG1heSBiZSB1c2VkIGJ5IHB1dHRpbmcgc2hlbGwgY29kZSBpbgorQGZpbGV7Y29uZmlndXJlLmlufS4gIEZvciBhbiBleGFtcGxlLCBzZWUgQHJlZntVc2luZyBDb25maWd1cmF0aW9uCitOYW1lc30uCisKK0Bub2RlIFNwZWNpZnlpbmcgdGhlIFRhcmdldAorQHNlY3Rpb24gU3BlY2lmeWluZyB0aGUgVGFyZ2V0CisKK0J5IGRlZmF1bHQsIHRoZSBAc2FtcHtjb25maWd1cmV9IHNjcmlwdCB3aWxsIGFzc3VtZSB0aGF0IHRoZSB0YXJnZXQgaXMKK3RoZSBzYW1lIGFzIHRoZSBob3N0LiAgVGhpcyBpcyB0aGUgbW9yZSBjb21tb24gY2FzZTsgZm9yIGV4YW1wbGUsIGl0CitsZWFkcyB0byBhIG5hdGl2ZSBjb21waWxlciByYXRoZXIgdGhhbiBhIGNyb3NzIGNvbXBpbGVyLgorCitAY2luZGV4IEBzYW1wey0tdGFyZ2V0fSBvcHRpb24KK0BjaW5kZXggdGFyZ2V0IG9wdGlvbgorQGNpbmRleCBjb25maWd1cmUgdGFyZ2V0CitJZiB5b3Ugd2FudCB0byBidWlsZCBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wsIHlvdSBtdXN0IHNwZWNpZnkgdGhlCit0YXJnZXQgZXhwbGljaXRseSBieSB1c2luZyB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3aGVuIHlvdSBydW4KK0BzYW1we2NvbmZpZ3VyZX0uICBUaGUgYXJndW1lbnQgdG8gQHNhbXB7LS10YXJnZXR9IGlzIHRoZSBjb25maWd1cmF0aW9uCituYW1lIG9mIHRoZSBzeXN0ZW0gZm9yIHdoaWNoIHlvdSB3aXNoIHRvIGdlbmVyYXRlIGNvZGUuCitAeHJlZntDb25maWd1cmF0aW9uIE5hbWVzfS4KKworRm9yIGV4YW1wbGUsIHRvIGJ1aWxkIHRvb2xzIHdoaWNoIGdlbmVyYXRlIGNvZGUgZm9yIGEgTUlQUyBFTEYgZW1iZWRkZWQKK3N5c3RlbSwgeW91IHdvdWxkIHVzZSBAc2FtcHstLXRhcmdldCBtaXBzLWVsZn0uCisKK0Bub2RlIFVzaW5nIHRoZSBUYXJnZXQgVHlwZQorQHNlY3Rpb24gVXNpbmcgdGhlIFRhcmdldCBUeXBlCisKK0BjaW5kZXggQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0KK1doZW4gd3JpdGluZyBAZmlsZXtjb25maWd1cmUuaW59IGZvciBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wsIHlvdSB3aWxsCituZWVkIHRvIHVzZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFyZ2V0LiAgVG8gZG8gdGhpcywgcHV0CitAc2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSBpbiBAZmlsZXtjb25maWd1cmUuaW59LgorCitAc2FtcHtBQ19DQU5PTklDQUxfU1lTVEVNfSB3aWxsIGxvb2sgZm9yIGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBhbmQKK2Nhbm9uaWNhbGl6ZSBpdCB1c2luZyB0aGUgQGZpbGV7Y29uZmlnLnN1Yn0gc2hlbGwgc2NyaXB0LiAgSXQgd2lsbCBhbHNvCitydW4gQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IChAcHhyZWZ7VXNpbmcgdGhlIEhvc3QgVHlwZX0pLgorCitUaGUgdGFyZ2V0IHR5cGUgd2lsbCBiZSByZWNvcmRlZCBpbiB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlcy4gIE5vdGUKK3RoYXQgdGhlIGhvc3QgdmVyc2lvbnMgb2YgdGhlc2UgdmFyaWFibGVzIHdpbGwgYWxzbyBiZSBkZWZpbmVkIGJ5CitAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0uCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gdGFyZ2V0CitUaGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgdGFyZ2V0LgorQGl0ZW0gdGFyZ2V0X2FsaWFzCitUaGUgYXJndW1lbnQgdG8gdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24uICBJZiB0aGUgdXNlciBkaWQgbm90IHNwZWNpZnkKK2EgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIEBzYW1we2hvc3RfYWxpYXN9LgorQGl0ZW0gdGFyZ2V0X2NwdQorQGl0ZW14IHRhcmdldF92ZW5kb3IKK0BpdGVteCB0YXJnZXRfb3MKK1RoZSBmaXJzdCB0aHJlZSBwYXJ0cyBvZiB0aGUgY2Fub25pY2FsIHRhcmdldCBjb25maWd1cmF0aW9uIG5hbWUuCitAZW5kIHRhYmxlCisKK05vdGUgdGhhdCBpZiBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSBhcmUgdGhlIHNhbWUgc3RyaW5nLCB5b3UgY2FuCithc3N1bWUgYSBuYXRpdmUgY29uZmlndXJhdGlvbi4gIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgeW91IGNhbiBhc3N1bWUgYQorY3Jvc3MgY29uZmlndXJhdGlvbi4KKworSXQgaXMgYXJndWFibHkgcG9zc2libGUgZm9yIEBzYW1we2hvc3R9IGFuZCBAc2FtcHt0YXJnZXR9IHRvIHJlcHJlc2VudAordGhlIHNhbWUgc3lzdGVtLCBidXQgZm9yIHRoZSBzdHJpbmdzIHRvIG5vdCBiZSBpZGVudGljYWwuICBGb3IgZXhhbXBsZSwKK2lmIEBzYW1we2NvbmZpZy5ndWVzc30gcmV0dXJucyBAc2FtcHtzcGFyYy1zdW4tc3Vub3M0LjEuNH0sIGFuZCBzb21lYm9keQorY29uZmlndXJlcyB3aXRoIEBzYW1wey0tdGFyZ2V0IHNwYXJjLXN1bi1zdW5vczQuMX0sIHRoZW4gdGhlIHNsaWdodAorZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIG9mIFN1bk9TIG1heSBiZSB1bmltcG9ydGFudCBmb3IKK3lvdXIgdG9vbC4gIEhvd2V2ZXIsIGluIHRoZSBnZW5lcmFsIGNhc2UgaXQgY2FuIGJlIHF1aXRlIGRpZmZpY3VsdCB0bworZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNvbmZpZ3VyYXRpb24gbmFtZXMgYXJlCitzaWduaWZpY2FudCBvciBub3QuICBUaGVyZWZvcmUsIGJ5IGNvbnZlbnRpb24sIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhCitAc2FtcHstLXRhcmdldH0gb3B0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBhIEBzYW1wey0taG9zdH0gb3B0aW9uLCBpdCBpcworYXNzdW1lZCB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGNvbmZpZ3VyZSBhIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wuCisKK1RoZSB2YXJpYWJsZXMgQHNhbXB7dGFyZ2V0fSBhbmQgQHNhbXB7dGFyZ2V0X2FsaWFzfSBzaG91bGQgYmUgaGFuZGxlZAorZGlmZmVyZW50bHkuCisKK0luIGdlbmVyYWwsIHdoZW5ldmVyIHRoZSB1c2VyIG1heSBhY3R1YWxseSBzZWUgYSBzdHJpbmcsCitAc2FtcHt0YXJnZXRfYWxpYXN9IHNob3VsZCBiZSB1c2VkLiAgVGhpcyBpbmNsdWRlcyBhbnl0aGluZyB3aGljaCBtYXkKK2FwcGVhciBpbiB0aGUgZmlsZSBzeXN0ZW0sIHN1Y2ggYXMgYSBkaXJlY3RvcnkgbmFtZSBvciBwYXJ0IG9mIGEgdG9vbAorbmFtZS4gIEl0IGFsc28gaW5jbHVkZXMgYW55IHRvb2wgb3V0cHV0LCB1bmxlc3MgaXQgaXMgY2xlYXJseSBsYWJlbGxlZAorYXMgdGhlIGNhbm9uaWNhbCB0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lLiAgVGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvCit1c2UgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gdG8gc3BlY2lmeSBob3cgdGhlIHRvb2wgd2lsbCBhcHBlYXIgdG8KK3RoZSBvdXRzaWRlIHdvcmxkLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgd2hlbiBjaGVja2luZyBmb3IgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB0YXJnZXQKK3N5c3RlbSwgQHNhbXB7dGFyZ2V0fSBzaG91bGQgYmUgdXNlZC4gIFRoaXMgaXMgYmVjYXVzZSBhIHdpZGUgdmFyaWV0eSBvZgorQHNhbXB7LS10YXJnZXR9IG9wdGlvbnMgbWF5IG1hcCBpbnRvIHRoZSBzYW1lIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uCituYW1lLiAgWW91IHNob3VsZCBub3QgYXR0ZW1wdCB0byBkdXBsaWNhdGUgdGhlIGNhbm9uaWNhbGl6YXRpb24gZG9uZSBieQorQHNhbXB7Y29uZmlnLnN1Yn0gaW4geW91ciBvd24gY29kZS4KKworQnkgY29udmVudGlvbiwgY3Jvc3MgdG9vbHMgYXJlIGluc3RhbGxlZCB3aXRoIGEgcHJlZml4IG9mIHRoZSBhcmd1bWVudAordXNlZCB3aXRoIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLCBhbHNvIGtub3duIGFzIEBzYW1we3RhcmdldF9hbGlhc30KKyhAcHhyZWZ7VXNpbmcgdGhlIFRhcmdldCBUeXBlfSkuICBJZiB0aGUgdXNlciBkb2VzIG5vdCB1c2UgdGhlCitAc2FtcHstLXRhcmdldH0gb3B0aW9uLCBhbmQgdGh1cyBpcyBidWlsZGluZyBhIG5hdGl2ZSB0b29sLCBubyBwcmVmaXggaXMKK3VzZWQuCisKK0ZvciBleGFtcGxlLCBpZiBnY2MgaXMgY29uZmlndXJlZCB3aXRoIEBzYW1wey0tdGFyZ2V0IG1pcHMtZWxmfSwgdGhlbgordGhlIGluc3RhbGxlZCBiaW5hcnkgd2lsbCBiZSBuYW1lZCBAc2FtcHttaXBzLWVsZi1nY2N9LiAgSWYgZ2NjIGlzCitjb25maWd1cmVkIHdpdGhvdXQgYSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLCB0aGVuIHRoZSBpbnN0YWxsZWQgYmluYXJ5Cit3aWxsIGJlIG5hbWVkIEBzYW1we2djY30uCisKK1RoZSBhdXRvY29uZiBtYWNybyBAc2FtcHtBQ19BUkdfUFJPR1JBTX0gd2lsbCBoYW5kbGUgdGhpcyBmb3IgeW91LiAgSWYKK3lvdSBhcmUgdXNpbmcgYXV0b21ha2UsIG5vIG1vcmUgbmVlZCBiZSBkb25lOyB0aGUgcHJvZ3JhbXMgd2lsbAorYXV0b21hdGljYWxseSBiZSBpbnN0YWxsZWQgd2l0aCB0aGUgY29ycmVjdCBwcmVmaXhlcy4gIE90aGVyd2lzZSwgc2VlCit0aGUgYXV0b2NvbmYgZG9jdW1lbnRhdGlvbiBmb3IgQHNhbXB7QUNfQVJHX1BST0dSQU19LgorCitAbm9kZSBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKK0BzZWN0aW9uIENyb3NzIFRvb2xzIGluIHRoZSBDeWdudXMgVHJlZQorCitUaGUgQ3lnbnVzIHRyZWUgaXMgdXNlZCBmb3IgdmFyaW91cyBwYWNrYWdlcyBpbmNsdWRpbmcgZ2RiLCB0aGUgR05VCitiaW51dGlscywgYW5kIGVnY3MuICBJdCBpcyBhbHNvLCBvZiBjb3Vyc2UsIHVzZWQgZm9yIEN5Z251cyByZWxlYXNlcy4KKworSW4gdGhlIEN5Z251cyB0cmVlLCB0aGUgdG9wIGxldmVsIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHVzZXMgdGhlIG9sZAorQ3lnbnVzIGNvbmZpZ3VyZSBzeXN0ZW0sIG5vdCBhdXRvY29uZi4gIFRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGUuaW59CitpcyB3cml0dGVuIHRvIGJ1aWxkIHBhY2thZ2VzIGJhc2VkIG9uIHdoYXQgaXMgaW4gdGhlIHNvdXJjZSB0cmVlLCBhbmQKK3N1cHBvcnRzIGJ1aWxkaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHRvb2xzIGluIGEgc2luZ2xlCitAc2FtcHtjb25maWd1cmV9L0BzYW1we21ha2V9IHN0ZXAuCisKK1RoZSBDeWdudXMgdHJlZSBtYXkgYmUgY29uZmlndXJlZCB3aXRoIGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbi4gIFRoZQorQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvIGV2ZXJ5IHN1YmRpcmVjdG9yeSwgYW5kCitwZXJtaXRzIGJ1aWxkaW5nIGFuIGVudGlyZSBzZXQgb2YgY3Jvc3MgdG9vbHMgYXQgb25jZS4KKworQG1lbnUKKyogSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllczo6CQlIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzLgorKiBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0czo6CVRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzLgorKiBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWU6OiAgICAgICAgIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZS4KKyogVGFyZ2V0IGxpYmliZXJ0eTo6CQkJVGFyZ2V0IGxpYmliZXJ0eQorQGVuZCBtZW51CisKK0Bub2RlIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXMKK0BzdWJzZWN0aW9uIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXMKKworVGhlIEN5Z251cyB0cmVlIGRpc3Rpbmd1aXNoZXMgaG9zdCBsaWJyYXJpZXMgZnJvbSB0YXJnZXQgbGlicmFyaWVzLgorCitIb3N0IGxpYnJhcmllcyBhcmUgYnVpbHQgd2l0aCB0aGUgY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgcHJvZ3JhbXMKK3doaWNoIHJ1biBvbiB0aGUgaG9zdCwgd2hpY2ggaXMgY2FsbGVkIHRoZSBob3N0IGNvbXBpbGVyLiAgVGhpcyBpbmNsdWRlcworbGlicmFyaWVzIHN1Y2ggYXMgQHNhbXB7YmZkfSBhbmQgQHNhbXB7dGNsfS4gIFRoZXNlIGxpYnJhcmllcyBhcmUgYnVpbHQKK3dpdGggdGhlIGhvc3QgY29tcGlsZXIsIGFuZCBhcmUgbGlua2VkIGludG8gcHJvZ3JhbXMgbGlrZSB0aGUgYmludXRpbHMKK29yIGdjYyB3aGljaCBydW4gb24gdGhlIGhvc3QuCisKK1RhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBjb21waWxlci4gIElmIGdjYyBpcyBwcmVzZW50CitpbiB0aGUgc291cmNlIHRyZWUsIHRoZW4gdGhlIHRhcmdldCBjb21waWxlciBpcyB0aGUgZ2NjIHRoYXQgaXMgYnVpbHQKK3VzaW5nIHRoZSBob3N0IGNvbXBpbGVyLiAgVGFyZ2V0IGxpYnJhcmllcyBhcmUgbGlicmFyaWVzIHN1Y2ggYXMKK0BzYW1we25ld2xpYn0gYW5kIEBzYW1we2xpYnN0ZGMrK30uICBUaGVzZSBsaWJyYXJpZXMgYXJlIG5vdCBsaW5rZWQgaW50bwordGhlIGhvc3QgcHJvZ3JhbXMsIGJ1dCBhcmUgaW5zdGVhZCBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlIHdpdGggcHJvZ3JhbXMKK2J1aWx0IHdpdGggdGhlIHRhcmdldCBjb21waWxlci4KKworRm9yIHRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiwgYXNzdW1lIHRoYXQgZ2NjIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZQordHJlZSwgc28gdGhhdCBpdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCisKK1RoZXJlIGlzIGEgY29tcGxpY2F0aW9uIGhlcmUuICBUaGUgY29uZmlndXJlIHByb2Nlc3MgbmVlZHMgdG8ga25vdyB3aGljaAorY29tcGlsZXIgeW91IGFyZSBnb2luZyB0byB1c2UgdG8gYnVpbGQgYSB0b29sOyBvdGhlcndpc2UsIHRoZSBmZWF0dXJlCit0ZXN0cyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gIFRoZSBDeWdudXMgdHJlZSBoYW5kbGVzIHRoaXMgYnkgbm90Citjb25maWd1cmluZyB0aGUgdGFyZ2V0IGxpYnJhcmllcyB1bnRpbCB0aGUgdGFyZ2V0IGNvbXBpbGVyIGlzIGJ1aWx0LiAgSW4KK29yZGVyIHRvIHBlcm1pdCBldmVyeXRoaW5nIHRvIGJ1aWxkIHVzaW5nIGEgc2luZ2xlCitAc2FtcHtjb25maWd1cmV9L0BzYW1we21ha2V9LCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFyZ2V0IGxpYnJhcmllcworaXMgYWN0dWFsbHkgdHJpZ2dlcmVkIGR1cmluZyB0aGUgbWFrZSBzdGVwLgorCitXaGVuIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkLCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBpcworbm90IHVzZWQuICBJbnN0ZWFkLCB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCB3aXRoIHRoZSBhcmd1bWVudAorb2YgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gZm9yIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uICBJZiBubworQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3YXMgdXNlZCBmb3IgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbiwgdGhlCitAc2FtcHstLWhvc3R9IG9wdGlvbiB3aWxsIGJlIHBhc3NlZCB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlCitAZmlsZXtjb25maWcuZ3Vlc3N9IHNoZWxsIHNjcmlwdC4gIEFueSBAc2FtcHstLWJ1aWxkfSBvcHRpb24gaXMgcGFzc2VkCitkb3duIHVuY2hhbmdlZC4KKworVGhpcyB0cmFuc2xhdGlvbiBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgaXMgZG9uZSBiZWNhdXNlIHNpbmNlIHRoZQordGFyZ2V0IGxpYnJhcmllcyBhcmUgY29tcGlsZWQgd2l0aCB0aGUgdGFyZ2V0IGNvbXBpbGVyLCB0aGV5IGFyZSBiZWluZworYnVpbHQgaW4gb3JkZXIgdG8gcnVuIG9uIHRoZSB0YXJnZXQgb2YgdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbi4gIEJ5Cit0aGUgZGVmaW5pdGlvbiBvZiBob3N0LCB0aGlzIG1lYW5zIHRoYXQgdGhlaXIgaG9zdCBzeXN0ZW0gaXMgdGhlIHNhbWUgYXMKK3RoZSB0YXJnZXQgc3lzdGVtIG9mIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uCisKK1RoZSBzYW1lIHByb2Nlc3MgaXMgdXNlZCBmb3IgYm90aCBhIG5hdGl2ZSBjb25maWd1cmF0aW9uIGFuZCBhIGNyb3NzCitjb25maWd1cmF0aW9uLiAgRXZlbiB3aGVuIHVzaW5nIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQKK2xpYnJhcmllcyB3aWxsIGJlIGNvbmZpZ3VyZWQgYW5kIGJ1aWx0IHVzaW5nIHRoZSBuZXdseSBidWlsdCBjb21waWxlci4KK1RoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgdGhlIEMrKyBsaWJyYXJpZXMsIHNpbmNlIHRoZXJlIGlzIG5vCityZWFzb24gdG8gYXNzdW1lIHRoYXQgdGhlIEMrKyBjb21waWxlciB1c2VkIHRvIGJ1aWxkIHRoZSBob3N0IHRvb2xzIChpZgordGhlcmUgZXZlbiBpcyBvbmUpIHVzZXMgdGhlIHNhbWUgQUJJIGFzIHRoZSBnKysgY29tcGlsZXIgd2hpY2ggd2lsbCBiZQordXNlZCB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KKworVGhlcmUgaXMgb25lIGRpZmZlcmVuY2UgYmV0d2VlbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uIGFuZCBhIGNyb3NzCitjb25maWd1cmF0aW9uLiAgSW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlCitub3JtYWxseSBjb25maWd1cmVkIGFuZCBidWlsdCBhcyBzaWJsaW5ncyBvZiB0aGUgaG9zdCB0b29scy4gIEluIGEgY3Jvc3MKK2NvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBub3JtYWxseSBidWlsdCBpbiBhIHN1YmRpcmVjdG9yeQord2hvc2UgbmFtZSBpcyB0aGUgYXJndW1lbnQgdG8gQHNhbXB7LS10YXJnZXR9LiAgVGhpcyBpcyBtYWlubHkgZm9yCitoaXN0b3JpY2FsIHJlYXNvbnMuCisKK1RvIHN1bW1hcml6ZSwgcnVubmluZyBAc2FtcHtjb25maWd1cmV9IGluIHRoZSBDeWdudXMgdHJlZSBjb25maWd1cmVzIGFsbAordGhlIGhvc3QgbGlicmFyaWVzIGFuZCB0b29scywgYnV0IGRvZXMgbm90IGNvbmZpZ3VyZSBhbnkgb2YgdGhlIHRhcmdldAorbGlicmFyaWVzLiAgUnVubmluZyBAc2FtcHttYWtlfSB0aGVuIGRvZXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0J1aWxkIHRoZSBob3N0IGxpYnJhcmllcy4KK0BpdGVtCitCdWlsZCB0aGUgaG9zdCBwcm9ncmFtcywgaW5jbHVkaW5nIGdjYy4gIE5vdGUgdGhhdCB3ZSBjYWxsIGdjYyBib3RoIGEKK2hvc3QgcHJvZ3JhbSAoc2luY2UgaXQgcnVucyBvbiB0aGUgaG9zdCkgYW5kIGEgdGFyZ2V0IGNvbXBpbGVyIChzaW5jZSBpdAorZ2VuZXJhdGVzIGNvZGUgZm9yIHRoZSB0YXJnZXQpLgorQGl0ZW0KK1VzaW5nIHRoZSBuZXdseSBidWlsdCB0YXJnZXQgY29tcGlsZXIsIGNvbmZpZ3VyZSB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KK0BpdGVtCitCdWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcy4KK0BlbmQgaXRlbWl6ZQorCitUaGUgc3RlcHMgbmVlZCBub3QgYmUgZG9uZSBpbiBwcmVjaXNlbHkgdGhpcyBvcmRlciwgc2luY2UgdGhleSBhcmUKK2FjdHVhbGx5IGNvbnRyb2xsZWQgYnkgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMuCisKK0Bub2RlIFRhcmdldCBMaWJyYXJ5IENvbmZpZ3VyZSBTY3JpcHRzCitAc3Vic2VjdGlvbiBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cworCitUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHlvdSBtdXN0IGtub3cgaW4gb3JkZXIgdG8gd3JpdGUgYSBjb25maWd1cmUKK3NjcmlwdCBmb3IgYSB0YXJnZXQgbGlicmFyeS4gIFRoaXMgaXMganVzdCBhIHF1aWNrIHNrZXRjaCwgYW5kIGJlZ2lubmVycworc2hvdWxkbid0IHdvcnJ5IGlmIHRoZXkgZG9uJ3QgZm9sbG93IGV2ZXJ5dGhpbmcgaGVyZS4KKworVGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQgYW5kIGJ1aWx0IHVzaW5nIGEgbmV3bHkgYnVpbHQgdGFyZ2V0Citjb21waWxlci4gIFRoZXJlIG1heSBub3QgYmUgYW55IHN0YXJ0dXAgZmlsZXMgb3IgbGlicmFyaWVzIGZvciB0aGlzCit0YXJnZXQgY29tcGlsZXIuICBJbiBmYWN0LCB0aG9zZSBmaWxlcyB3aWxsIHByb2JhYmx5IGJlIGJ1aWx0IGFzIHBhcnQgb2YKK3NvbWUgdGFyZ2V0IGxpYnJhcnksIHdoaWNoIG5hdHVyYWxseSBtZWFucyB0aGF0IHRoZXkgd2lsbCBub3QgZXhpc3Qgd2hlbgoreW91ciB0YXJnZXQgbGlicmFyeSBpcyBjb25maWd1cmVkLgorCitUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGEgdGFyZ2V0IGxpYnJhcnkgbWF5IG5vdCB1c2UKK2FueSB0ZXN0IHdoaWNoIHJlcXVpcmVzIGRvaW5nIGEgbGluay4gIFRoaXMgdW5mb3J0dW5hdGVseSBpbmNsdWRlcyBtYW55Cit1c2VmdWwgYXV0b2NvbmYgbWFjcm9zLCBzdWNoIGFzIEBzYW1we0FDX0NIRUNLX0ZVTkNTfS4gIGF1dG9jb25mIG1hY3Jvcword2hpY2ggZG8gYSBjb21waWxlIGJ1dCBub3QgYSBsaW5rLCBzdWNoIGFzIEBzYW1we0FDX0NIRUNLX0hFQURFUlN9LCBtYXkKK2JlIHVzZWQuCisKK1RoaXMgaXMgYSBzZXZlcmUgcmVzdHJpY3Rpb24sIGJ1dCBub3JtYWxseSBub3QgYSBmYXRhbCBvbmUsIGFzIHRhcmdldAorbGlicmFyaWVzIGNhbiBvZnRlbiBhc3N1bWUgdGhlIHByZXNlbmNlIG9mIG90aGVyIHRhcmdldCBsaWJyYXJpZXMsIGFuZAordGh1cyBrbm93IHdoaWNoIGZ1bmN0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZS4KKworQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgYXV0b2NvbmYgbWFjcm8gQHNhbXB7QUNfUFJPR19DQ30gZG9lcyBhIGxpbmsgdG8KK21ha2Ugc3VyZSB0aGF0IHRoZSBjb21waWxlciB3b3Jrcy4gIFRoaXMgbWF5IGZhaWwgaW4gYSB0YXJnZXQgbGlicmFyeSwKK3NvIHRhcmdldCBsaWJyYXJpZXMgbXVzdCB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mIG1hY3JvcyB0byBsb2NhdGUgdGhlCitjb21waWxlci4gIFNlZSB0aGUgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGluIGEgZGlyZWN0b3J5IGxpa2UKK0BmaWxle2xpYmliZXJ0eX0gb3IgQGZpbGV7bGliZ2xvc3N9IGZvciBhbiBleGFtcGxlLgorCitBcyBub3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGFyZ2V0IGxpYnJhcmllcyBhcmUgc29tZXRpbWVzIGJ1aWx0CitpbiBkaXJlY3RvcmllcyB3aGljaCBhcmUgc2libGluZ3MgdG8gdGhlIGhvc3QgdG9vbHMsIGFuZCBhcmUgc29tZXRpbWVzCitidWlsdCBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoZSBAc2FtcHstLXdpdGgtdGFyZ2V0LXN1YmRpcn0gY29uZmlndXJlCitvcHRpb24gd2lsbCBiZSBwYXNzZWQgd2hlbiB0aGUgbGlicmFyeSBpcyBjb25maWd1cmVkLiAgSXRzIHZhbHVlIHdpbGwgYmUKK2FuIGVtcHR5IHN0cmluZyBpZiB0aGUgdGFyZ2V0IGxpYnJhcnkgaXMgYSBzaWJsaW5nLiAgSXRzIHZhbHVlIHdpbGwgYmUKK3RoZSBuYW1lIG9mIHRoZSBzdWJkaXJlY3RvcnkgaWYgdGhlIHRhcmdldCBsaWJyYXJ5IGlzIGluIGEgc3ViZGlyZWN0b3J5LgorCitJZiB0aGUgb3ZlcmFsbCBidWlsZCBpcyBub3QgYSBuYXRpdmUgYnVpbGQgKGkuZS4sIHRoZSBvdmVyYWxsIGNvbmZpZ3VyZQordXNlZCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiksIHRoZW4gdGhlIGxpYnJhcnkgd2lsbCBiZSBjb25maWd1cmVkCit3aXRoIHRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIHdpbGwKK2JlIHRoZSBob3N0IHN5c3RlbSBvZiB0aGUgb3ZlcmFsbCBidWlsZC4gIFJlY2FsbCB0aGF0IHRoZSBob3N0IHN5c3RlbSBvZgordGhlIGxpYnJhcnkgd2lsbCBiZSB0aGUgdGFyZ2V0IG9mIHRoZSBvdmVyYWxsIGJ1aWxkLiAgSWYgdGhlIG92ZXJhbGwKK2J1aWxkIGlzIGEgbmF0aXZlIGJ1aWxkLCB0aGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiB3aWxsIG5vdCBiZQordXNlZC4KKworQSBsaWJyYXJ5IHdoaWNoIGNhbiBiZSBidWlsdCBib3RoIHN0YW5kYWxvbmUgYW5kIGFzIGEgdGFyZ2V0IGxpYnJhcnkgbWF5Cit3YW50IHRvIGluc3RhbGwgaXRzZWxmIGludG8gZGlmZmVyZW50IGRpcmVjdG9yaWVzIGRlcGVuZGluZyB1cG9uIHRoZQorY2FzZS4gIFdoZW4gYnVpbHQgc3RhbmRhbG9uZSwgb3Igd2hlbiBidWlsdCBuYXRpdmUsIHRoZSBsaWJyYXJ5IHNob3VsZAorYmUgaW5zdGFsbGVkIGluIEBzYW1weyQobGliZGlyKX0uICBXaGVuIGJ1aWx0IGFzIGEgdGFyZ2V0IGxpYnJhcnkgd2hpY2gKK2lzIG5vdCBuYXRpdmUsIHRoZSBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gQHNhbXB7JCh0b29sZGlyKS9saWJ9LgorVGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gbWF5IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UKK2Nhc2VzLgorCitUaGlzIHNhbWUgdGVzdCBvZiBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gbWF5IGJlIHVzZWQgdG8gc2VlIHdoZXRoZXIgaXQKK2lzIE9LIHRvIHVzZSBsaW5rIHRlc3RzIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgSWYgdGhlCitAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBsaWJyYXJ5IGlzIGJlaW5nCitidWlsdCBlaXRoZXIgc3RhbmRhbG9uZSBvciBuYXRpdmUsIGFuZCBhIGxpbmsgc2hvdWxkIHdvcmsuCisKK0Bub2RlIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZQorQHN1YnNlY3Rpb24gTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlCisKK1RoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IGluIHRoZSBDeWdudXMgdHJlZSBkZWZpbmVzIHRhcmdldHMgZm9yCitldmVyeSBrbm93biBzdWJkaXJlY3RvcnkuCisKK0ZvciBldmVyeSBzdWJkaXJlY3RvcnkgQHZhcntkaXJ9IHdoaWNoIGhvbGRzIGEgaG9zdCBsaWJyYXJ5IG9yIHByb2dyYW0sCit0aGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHthbGwtQHZhcntkaXJ9fSB3aWxsIGJ1aWxkIHRoYXQgbGlicmFyeQorb3IgcHJvZ3JhbS4KKworVGhlcmUgYXJlIGRlcGVuZGVuY2llcyBhbW9uZyBob3N0IHRvb2xzLiAgRm9yIGV4YW1wbGUsIGJ1aWxkaW5nIGdjYworcmVxdWlyZXMgZmlyc3QgYnVpbGRpbmcgZ2FzLCBiZWNhdXNlIHRoZSBnY2MgYnVpbGQgcHJvY2VzcyBpbnZva2VzIHRoZQordGFyZ2V0IGFzc2VtYmxlci4gIFRoZXNlIGRlcGVuZGVuY2llcyBhcmUgcmVmbGVjdGVkIGluIHRoZSB0b3AgbGV2ZWwKK0BmaWxle01ha2VmaWxlfS4KKworRm9yIGV2ZXJ5IHN1YmRpcmVjdG9yeSBAdmFye2Rpcn0gd2hpY2ggaG9sZHMgYSB0YXJnZXQgbGlicmFyeSwgdGhlCitAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB3aWxsIGNvbmZpZ3VyZQordGhhdCBsaWJyYXJ5LiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7YWxsLXRhcmdldC1AdmFye2Rpcn19Cit3aWxsIGJ1aWxkIHRoYXQgbGlicmFyeS4KKworRXZlcnkgQHNhbXB7Y29uZmlndXJlLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldCBkZXBlbmRzIHVwb24KK0BzYW1we2FsbC1nY2N9LCBzaW5jZSBnY2MsIHRoZSB0YXJnZXQgY29tcGlsZXIsIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZQordGhlIHRvb2wuICBFdmVyeSBAc2FtcHthbGwtdGFyZ2V0LUB2YXJ7ZGlyfX0gdGFyZ2V0IGRlcGVuZHMgdXBvbiB0aGUKK2NvcnJlc3BvbmRpbmcgQHNhbXB7Y29uZmlndXJlLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldC4KKworVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgdGFyZ2V0cyB3aGljaCBtYXkgYmUgb2YgaW50ZXJlc3QgZm9yIGVhY2gKK2RpcmVjdG9yeTogQHNhbXB7aW5zdGFsbC1AdmFye2Rpcn19LCBAc2FtcHtjbGVhbi1AdmFye2Rpcn19LCBhbmQKK0BzYW1we2NoZWNrLUB2YXJ7ZGlyfX0uICBUaGVyZSBhcmUgYWxzbyBjb3JyZXNwb25kaW5nIEBzYW1we3RhcmdldH0KK3ZlcnNpb25zIG9mIHRoZXNlIGZvciB0aGUgdGFyZ2V0IGxpYnJhcmllcyAsIHN1Y2ggYXMKK0BzYW1we2luc3RhbGwtdGFyZ2V0LUB2YXJ7ZGlyfX0uCisKK0Bub2RlIFRhcmdldCBsaWJpYmVydHkKK0BzdWJzZWN0aW9uIFRhcmdldCBsaWJpYmVydHkKKworVGhlIEBmaWxle2xpYmliZXJ0eX0gc3ViZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBhIHNwZWNpYWwgY2FzZSwgaW4gdGhhdAoraXQgaXMgdGhlIG9ubHkgZGlyZWN0b3J5IHdoaWNoIGlzIGJ1aWx0IGJvdGggdXNpbmcgdGhlIGhvc3QgY29tcGlsZXIgYW5kCit1c2luZyB0aGUgdGFyZ2V0IGNvbXBpbGVyLgorCitUaGlzIGlzIGJlY2F1c2UgdGhlIGZpbGVzIGluIEBmaWxle2xpYmliZXJ0eX0gYXJlIHVzZWQgd2hlbiBidWlsZGluZyB0aGUKK2hvc3QgdG9vbHMsIGFuZCB0aGV5IGFyZSBhbHNvIGluY29ycG9yYXRlZCBpbnRvIHRoZSBAZmlsZXtsaWJzdGRjKyt9Cit0YXJnZXQgbGlicmFyeSBhcyBzdXBwb3J0IGNvZGUuCisKK1RoaXMgZHVhbGl0eSBkb2VzIG5vdCBwb3NlIGFueSBwYXJ0aWN1bGFyIGRpZmZpY3VsdGllcy4gIEl0IG1lYW5zIHRoYXQKK3RoZXJlIGFyZSB0YXJnZXRzIGZvciBib3RoIEBzYW1we2FsbC1saWJpYmVydHl9IGFuZAorQHNhbXB7YWxsLXRhcmdldC1saWJpYmVydHl9LgorCitJbiBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB3aGVuIHRhcmdldCBsaWJyYXJpZXMgYXJlIG5vdCBidWlsdCBpbiBhCitzdWJkaXJlY3RvcnksIHRoZSBzYW1lIG9iamVjdHMgYXJlIG5vcm1hbGx5IHVzZWQgYXMgYm90aCB0aGUgaG9zdCBidWlsZAorYW5kIHRoZSB0YXJnZXQgYnVpbGQuICBUaGlzIGlzIG5vcm1hbGx5IE9LLCBzaW5jZSBsaWJpYmVydHkgY29udGFpbnMKK29ubHkgQyBjb2RlLCBhbmQgaW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiB0aGUgcmVzdWx0cyBvZiB0aGUgaG9zdAorY29tcGlsZXIgYW5kIHRoZSB0YXJnZXQgY29tcGlsZXIgYXJlIG5vcm1hbGx5IGludGVyb3BlcmFibGUuCisKK0lyaXggNiBpcyBhZ2FpbiBhbiBleGNlcHRpb24gaGVyZSwgc2luY2UgdGhlIFNHSSBuYXRpdmUgY29tcGlsZXIKK2RlZmF1bHRzIHRvIHVzaW5nIHRoZSBAc2FtcHtPMzJ9IEFCSSwgYW5kIGdjYyBkZWZhdWx0cyB0byB1c2luZyB0aGUKK0BzYW1we04zMn0gQUJJLiAgT24gSXJpeCA2LCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgYnVpbHQgaW4gYQorc3ViZGlyZWN0b3J5IGV2ZW4gZm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIGF2b2lkaW5nIHRoaXMgcHJvYmxlbS4KKworVGhlcmUgYXJlIGN1cnJlbnRseSBubyBvdGhlciBsaWJyYXJpZXMgYnVpbHQgZm9yIGJvdGggdGhlIGhvc3QgYW5kIHRoZQordGFyZ2V0LCBidXQgdGhlcmUgaXMgbm8gY29uY2VwdHVhbCBwcm9ibGVtIHdpdGggYWRkaW5nIG1vcmUuCisKK0Bub2RlIENhbmFkaWFuIENyb3NzCitAY2hhcHRlciBDYW5hZGlhbiBDcm9zcworQGNpbmRleCBjYW5hZGlhbiBjcm9zcworQGNpbmRleCBidWlsZGluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXIKK0BjaW5kZXggY3Jvc3MgY29tcGlsZXIsIGJ1aWxkaW5nIHdpdGgKKworSXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gdG8gYnVpbGQgYQorcHJvZ3JhbSB3aGljaCB3aWxsIHJ1biBvbiBhIHN5c3RlbSB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3lzdGVtIG9uCit3aGljaCB0aGUgdG9vbHMgYXJlIGJ1aWx0LiAgSW4gb3RoZXIgd29yZHMsIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkCitwcm9ncmFtcyB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorCitUaGlzIGlzIHJlZmVycmVkIHRvIGFzIGEgQGRmbntDYW5hZGlhbiBDcm9zc30uCisKK0BtZW51CisqIENhbmFkaWFuIENyb3NzIEV4YW1wbGU6OgkJQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZS4KKyogQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHM6OgkJQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMuCisqIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHM6OgkJQnVpbGQgQ3Jvc3MgSG9zdCBUb29scy4KKyogQnVpbGQgYW5kIEhvc3QgT3B0aW9uczo6CQlCdWlsZCBhbmQgSG9zdCBPcHRpb25zLgorKiBDQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlOjoJCUNhbmFkaWFuIENyb3NzIG5vdCBpbiBDeWdudXMgVHJlZS4KKyogQ0Nyb3NzIGluIEN5Z251cyBUcmVlOjoJCUNhbmFkaWFuIENyb3NzIGluIEN5Z251cyBUcmVlLgorKiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MuCitAZW5kIG1lbnUKKworQG5vZGUgQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZQorQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgRXhhbXBsZQorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBDYW5hZGlhbiBDcm9zcy4KKworV2hpbGUgcnVubmluZyBvbiBhIEdOVS9MaW51eCwgeW91IGNhbiBidWlsZCBhIHByb2dyYW0gd2hpY2ggd2lsbCBydW4gb24KK2EgU29sYXJpcyBzeXN0ZW0uICBZb3Ugd291bGQgdXNlIGEgR05VL0xpbnV4IGNyb3NzIFNvbGFyaXMgY29tcGlsZXIgdG8KK2J1aWxkIHRoZSBwcm9ncmFtLgorCitPZiBjb3Vyc2UsIHlvdSBjb3VsZCBub3QgcnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSBvbiB5b3VyIEdOVS9MaW51eAorc3lzdGVtLiAgWW91IHdvdWxkIGhhdmUgdG8gY29weSBpdCBvdmVyIHRvIGEgU29sYXJpcyBzeXN0ZW0gYmVmb3JlIHlvdQord291bGQgcnVuIGl0LgorCitPZiBjb3Vyc2UsIHlvdSBjb3VsZCBhbHNvIHNpbXBseSBidWlsZCB0aGUgcHJvZ3JhbXMgb24gdGhlIFNvbGFyaXMKK3N5c3RlbSBpbiB0aGUgZmlyc3QgcGxhY2UuICBIb3dldmVyLCBwZXJoYXBzIHRoZSBTb2xhcmlzIHN5c3RlbSBpcyBub3QKK2F2YWlsYWJsZSBmb3Igc29tZSByZWFzb247IHBlcmhhcHMgeW91IGFjdHVhbGx5IGRvbid0IGhhdmUgb25lLCBidXQgeW91Cit3YW50IHRvIGJ1aWxkIHRoZSB0b29scyBmb3Igc29tZWJvZHkgZWxzZSB0byB1c2UuICBPciBwZXJoYXBzIHlvdXIKK0dOVS9MaW51eCBzeXN0ZW0gaXMgbXVjaCBmYXN0ZXIgdGhhbiB5b3VyIFNvbGFyaXMgc3lzdGVtLgorCitBIENhbmFkaWFuIENyb3NzIGJ1aWxkIGlzIG1vc3QgZnJlcXVlbnRseSB1c2VkIHdoZW4gYnVpbGRpbmcgcHJvZ3JhbXMgdG8KK3J1biBvbiBhIG5vbi1Vbml4IHN5c3RlbSwgc3VjaCBhcyBET1Mgb3IgV2luZG93cy4gIEl0IG1heSBiZSBzaW1wbGVyIHRvCitjb25maWd1cmUgYW5kIGJ1aWxkIG9uIGEgVW5peCBzeXN0ZW0gdGhhbiB0byBzdXBwb3J0IHRoZSBjb25maWd1cmF0aW9uCittYWNoaW5lcnkgb24gYSBub24tVW5peCBzeXN0ZW0uCisKK0Bub2RlIENhbmFkaWFuIENyb3NzIENvbmNlcHRzCitAc2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBDb25jZXB0cworCitXaGVuIGJ1aWxkaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gZGlmZmVyZW50IHN5c3RlbXMKK2ludm9sdmVkOiB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyBhcmUgYmVpbmcgYnVpbHQsIGFuZCB0aGUgc3lzdGVtCitvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4uCisKK1RoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIGFyZSBiZWluZyBidWlsdCBpcyBjYWxsZWQgdGhlIEBkZm57YnVpbGR9CitzeXN0ZW0uCisKK1RoZSBzeXN0ZW0gb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuIGlzIGNhbGxlZCB0aGUgaG9zdCBzeXN0ZW0uCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgU29sYXJpcyBwcm9ncmFtIG9uIGEgR05VL0xpbnV4CitzeXN0ZW0sIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGUgYnVpbGQgc3lzdGVtIHdvdWxkIGJlIEdOVS9MaW51eCwKK2FuZCB0aGUgaG9zdCBzeXN0ZW0gd291bGQgYmUgU29sYXJpcy4KKworSXQgaXMsIG9mIGNvdXJzZSwgcG9zc2libGUgdG8gYnVpbGQgYSBjcm9zcyBjb21waWxlciB1c2luZyBhIENhbmFkaWFuCitDcm9zcyAoaS5lLiwgYnVpbGQgYSBjcm9zcyBjb21waWxlciB1c2luZyBhIGNyb3NzIGNvbXBpbGVyKS4gIEluIHRoaXMKK2Nhc2UsIHRoZSBzeXN0ZW0gZm9yIHdoaWNoIHRoZSByZXN1bHRpbmcgY3Jvc3MgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUKK2lzIGNhbGxlZCB0aGUgdGFyZ2V0IHN5c3RlbS4gIChGb3IgYSBtb3JlIGNvbXBsZXRlIGRpc2N1c3Npb24gb2YgaG9zdAorYW5kIHRhcmdldCBzeXN0ZW1zLCBAcHhyZWZ7SG9zdCBhbmQgVGFyZ2V0fSkuCisKK0FuIGV4YW1wbGUgb2YgYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlciB1c2luZyBhIENhbmFkaWFuIENyb3NzIHdvdWxkIGJlCitidWlsZGluZyBhIFdpbmRvd3MgY3Jvc3MgTUlQUyBFTEYgY29tcGlsZXIgb24gYSBHTlUvTGludXggc3lzdGVtLiAgSW4KK3RoaXMgY2FzZSB0aGUgYnVpbGQgc3lzdGVtIHdvdWxkIGJlIEdOVS9MaW51eCwgdGhlIGhvc3Qgc3lzdGVtIHdvdWxkIGJlCitXaW5kb3dzLCBhbmQgdGhlIHRhcmdldCBzeXN0ZW0gd291bGQgYmUgTUlQUyBFTEYuCisKK1RoZSBuYW1lIENhbmFkaWFuIENyb3NzIGNvbWVzIGZyb20gdGhlIGNhc2Ugd2hlbiB0aGUgYnVpbGQsIGhvc3QsIGFuZAordGFyZ2V0IHN5c3RlbXMgYXJlIGFsbCBkaWZmZXJlbnQuICBBdCB0aGUgdGltZSB0aGF0IHRoZXNlIGlzc3VlcyB3ZXJlCithbGwgYmVpbmcgaGFzaGVkIG91dCwgQ2FuYWRhIGhhZCB0aHJlZSBuYXRpb25hbCBwb2xpdGljYWwgcGFydGllcy4KKworQG5vZGUgQnVpbGQgQ3Jvc3MgSG9zdCBUb29scworQHNlY3Rpb24gQnVpbGQgQ3Jvc3MgSG9zdCBUb29scworCitJbiBvcmRlciB0byBjb25maWd1cmUgYSBwcm9ncmFtIGZvciBhIENhbmFkaWFuIENyb3NzIGJ1aWxkLCB5b3UgbXVzdAorZmlyc3QgYnVpbGQgYW5kIGluc3RhbGwgdGhlIHNldCBvZiBjcm9zcyB0b29scyB5b3Ugd2lsbCB1c2UgdG8gYnVpbGQgdGhlCitwcm9ncmFtLgorCitUaGVzZSB0b29scyB3aWxsIGJlIGJ1aWxkIGNyb3NzIGhvc3QgdG9vbHMuICBUaGF0IGlzLCB0aGV5IHdpbGwgcnVuIG9uCit0aGUgYnVpbGQgc3lzdGVtLCBhbmQgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCBydW5zIG9uIHRoZSBob3N0IHN5c3RlbS4KKworSXQgaXMgZWFzeSB0byBjb25mdXNlIHRoZSBtZWFuaW5nIG9mIGJ1aWxkIGFuZCBob3N0IGhlcmUuICBBbHdheXMKK3JlbWVtYmVyIHRoYXQgdGhlIGJ1aWxkIHN5c3RlbSBpcyB3aGVyZSB5b3UgYXJlIGRvaW5nIHRoZSBidWlsZCwgYW5kIHRoZQoraG9zdCBzeXN0ZW0gaXMgd2hlcmUgdGhlIHJlc3VsdGluZyBwcm9ncmFtIHdpbGwgcnVuLiAgVGhlcmVmb3JlLCB5b3UKK25lZWQgYSBidWlsZCBjcm9zcyBob3N0IGNvbXBpbGVyLgorCitJbiBnZW5lcmFsLCB5b3UgbXVzdCBoYXZlIGEgY29tcGxldGUgY3Jvc3MgZW52aXJvbm1lbnQgaW4gb3JkZXIgdG8gZG8KK3RoZSBidWlsZC4gIFRoaXMgbm9ybWFsbHkgbWVhbnMgYSBjcm9zcyBjb21waWxlciwgY3Jvc3MgYXNzZW1ibGVyLCBhbmQKK3NvIGZvcnRoLCBhcyB3ZWxsIGFzIGxpYnJhcmllcyBhbmQgaW5jbHVkZSBmaWxlcyBmb3IgdGhlIGhvc3Qgc3lzdGVtLgorCitAbm9kZSBCdWlsZCBhbmQgSG9zdCBPcHRpb25zCitAc2VjdGlvbiBCdWlsZCBhbmQgSG9zdCBPcHRpb25zCitAY2luZGV4IGNvbmZpZ3VyaW5nIGEgY2FuYWRpYW4gY3Jvc3MKK0BjaW5kZXggY2FuYWRpYW4gY3Jvc3MsIGNvbmZpZ3VyaW5nCisKK1doZW4geW91IHJ1biBAZmlsZXtjb25maWd1cmV9LCB5b3UgbXVzdCB1c2UgYm90aCB0aGUgQHNhbXB7LS1idWlsZH0gYW5kCitAc2FtcHstLWhvc3R9IG9wdGlvbnMuCisKK0BjaW5kZXggQHNhbXB7LS1idWlsZH0gb3B0aW9uCitAY2luZGV4IGJ1aWxkIG9wdGlvbgorQGNpbmRleCBjb25maWd1cmUgYnVpbGQgc3lzdGVtCitUaGUgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mCit0aGUgYnVpbGQgc3lzdGVtLiAgVGhpcyBjYW4gbm9ybWFsbHkgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZQorQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQsIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIHVzZQorQHNhbXB7LS1idWlsZD1gY29uZmlnLmd1ZXNzYH0uCisKK0BjaW5kZXggQHNhbXB7LS1ob3N0fSBvcHRpb24KK0BjaW5kZXggaG9zdCBvcHRpb24KK0BjaW5kZXggY29uZmlndXJlIGhvc3QKK1RoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZgordGhlIGhvc3Qgc3lzdGVtLgorCitBcyB3ZSBleHBsYWluZWQgZWFybGllciwgQGZpbGV7Y29uZmlnLmd1ZXNzfSBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdAordmFsdWUgZm9yIHRoZSBAc2FtcHstLWhvc3R9IG9wdGlvbiAoQHB4cmVme1VzaW5nIHRoZSBIb3N0IFR5cGV9KS4gIFdlCitjYW4gbm93IHNlZSB0aGF0IHNpbmNlIEBmaWxle2NvbmZpZy5ndWVzc30gcmV0dXJucyB0aGUgdHlwZSBvZiBzeXN0ZW0gb24KK3doaWNoIGl0IGlzIHJ1biwgaXQgcmVhbGx5IGlkZW50aWZpZXMgdGhlIGJ1aWxkIHN5c3RlbS4gIFNpbmNlIHRoZSBob3N0CitzeXN0ZW0gaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMgdGhlIGJ1aWxkIHN5c3RlbSAoaS5lLiwgcGVvcGxlIGRvIG5vdAorbm9ybWFsbHkgYnVpbGQgdXNpbmcgYSBjcm9zcyBjb21waWxlciksIGl0IGlzIHJlYXNvbmFibGUgdG8gdXNlIHRoZQorcmVzdWx0IG9mIEBmaWxle2NvbmZpZy5ndWVzc30gYXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBob3N0IHN5c3RlbSB3aGVuCit0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgbm90IHVzZWQuCisKK0l0IG1pZ2h0IHNlZW0gdGhhdCBpZiB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gd2VyZSB1c2VkIHdpdGhvdXQgdGhlCitAc2FtcHstLWJ1aWxkfSBvcHRpb24gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBjb3VsZCBydW4KK0BmaWxle2NvbmZpZy5ndWVzc30gdG8gZGV0ZXJtaW5lIHRoZSBidWlsZCBzeXN0ZW0sIGFuZCBwcmVzdW1lIGEKK0NhbmFkaWFuIENyb3NzIGlmIHRoZSByZXN1bHQgb2YgQGZpbGV7Y29uZmlnLmd1ZXNzfSBkaWZmZXJlZCBmcm9tIHRoZQorQHNhbXB7LS1ob3N0fSBvcHRpb24uICBIb3dldmVyLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBzb21lIGNvbmZpZ3VyZQorc2NyaXB0cyBhcmUgcm91dGluZWx5IHJ1biB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHstLWhvc3R9IG9wdGlvbiwgcmF0aGVyCit0aGFuIHVzaW5nIHRoZSBkZWZhdWx0IGZyb20gQGZpbGV7Y29uZmlnLmd1ZXNzfS4gIEFzIG5vdGVkIGVhcmxpZXIsIGl0CitpcyBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSB0byByZWxpYWJseSBjb21wYXJlIGNvbmZpZ3VyYXRpb24gbmFtZXMKKyhAcHhyZWZ7VXNpbmcgdGhlIFRhcmdldCBUeXBlfSkuICBUaGVyZWZvcmUsIGJ5IGNvbnZlbnRpb24sIGlmIHRoZQorQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCwgYnV0IHRoZSBAc2FtcHstLWJ1aWxkfSBvcHRpb24gaXMgbm90IHVzZWQsCit0aGVuIHRoZSBidWlsZCBzeXN0ZW0gZGVmYXVsdHMgdG8gdGhlIGhvc3Qgc3lzdGVtLgorCitAbm9kZSBDQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlCitAc2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUuCisKK0lmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgeW91IG11c3QgZXhwbGljaXRseSBzcGVjaWZ5IHRoZQorY3Jvc3MgdG9vbHMgd2hpY2ggeW91IHdhbnQgdG8gdXNlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtLiAgVGhpcyBpcyBkb25lIGJ5CitzZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgcnVubmluZyB0aGUgQGZpbGV7Y29uZmlndXJlfQorc2NyaXB0LgorCitZb3UgbXVzdCBub3JtYWxseSBzZXQgYXQgbGVhc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBAc2FtcHtDQ30sCitAc2FtcHtBUn0sIGFuZCBAc2FtcHtSQU5MSUJ9IHRvIHRoZSBjcm9zcyB0b29scyB3aGljaCB5b3Ugd2FudCB0byB1c2UgdG8KK2J1aWxkLgorCitGb3Igc29tZSBwcm9ncmFtcywgeW91IG11c3Qgc2V0IGFkZGl0aW9uYWwgY3Jvc3MgdG9vbHMgYXMgd2VsbCwgc3VjaCBhcworQHNhbXB7QVN9LCBAc2FtcHtMRH0sIG9yIEBzYW1we05NfS4KKworWW91IHdvdWxkIHNldCB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gdGhlIGJ1aWxkIGNyb3NzIHRvb2xzIHdoaWNoCit5b3UgYXJlIGdvaW5nIHRvIHVzZS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBTb2xhcmlzIHByb2dyYW0gb24gYSBHTlUvTGludXgKK3N5c3RlbSwgYW5kIHlvdXIgR05VL0xpbnV4IGNyb3NzIFNvbGFyaXMgY29tcGlsZXIgd2VyZSBuYW1lZAorQHNhbXB7c29sYXJpcy1nY2N9LCB0aGVuIHlvdSB3b3VsZCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitAc2FtcHtDQ30gdG8gQHNhbXB7c29sYXJpcy1nY2N9LgorCitAbm9kZSBDQ3Jvc3MgaW4gQ3lnbnVzIFRyZWUKK0BzZWN0aW9uIENhbmFkaWFuIENyb3NzIGluIEN5Z251cyBUcmVlCitAY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIGN5Z251cyB0cmVlCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIGEgQ2FuYWRpYW4gQ3Jvc3Mgd2hlbgordXNpbmcgdGhlIEN5Z251cyB0cmVlLgorCitAbWVudQorKiBTdGFuZGFyZCBDeWdudXMgQ0Nyb3NzOjoJQnVpbGRpbmcgYSBOb3JtYWwgUHJvZ3JhbS4KKyogQ3Jvc3MgQ3lnbnVzIENDcm9zczo6CQlCdWlsZGluZyBhIENyb3NzIFByb2dyYW0uCitAZW5kIG1lbnUKKworQG5vZGUgU3RhbmRhcmQgQ3lnbnVzIENDcm9zcworQHN1YnNlY3Rpb24gQnVpbGRpbmcgYSBOb3JtYWwgUHJvZ3JhbQorCitXaGVuIGNvbmZpZ3VyaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MgaW4gdGhlIEN5Z251cyB0cmVlLCBhbGwgdGhlCithcHByb3ByaWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IHRvCitAc2FtcHtAdmFye2hvc3R9LUB2YXJ7dG9vbH19LCB3aGVyZSBAdmFye2hvc3R9IGlzIHRoZSB2YWx1ZSB1c2VkIGZvciB0aGUKK0BzYW1wey0taG9zdH0gb3B0aW9uLCBhbmQgQHZhcnt0b29sfSBpcyB0aGUgbmFtZSBvZiB0aGUgdG9vbCAoZS5nLiwKK0BzYW1we2djY30sIEBzYW1we2FzfSwgZXRjLikuICBUaGVzZSB0b29scyBtdXN0IGJlIG9uIHlvdXIgQHNhbXB7UEFUSH0uCisKK0FkZGluZyBhIHByZWZpeCBvZiBAdmFye2hvc3R9IHdpbGwgZ2l2ZSB0aGUgdXN1YWwgbmFtZSBmb3IgdGhlIGJ1aWxkCitjcm9zcyBob3N0IHRvb2xzLiAgVG8gc2VlIHRoaXMsIGNvbnNpZGVyIHRoYXQgd2hlbiB0aGVzZSBjcm9zcyB0b29scword2VyZSBidWlsdCwgdGhleSB3ZXJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0gYW5kIHRvCitwcm9kdWNlIGNvZGUgZm9yIHRoZSBob3N0IHN5c3RlbS4gIFRoYXQgaXMsIHRoZXkgd2VyZSBjb25maWd1cmVkIHdpdGggYQorQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBzeXN0ZW0gd2hpY2ggd2UgYXJlIG5vdworY2FsbGluZyB0aGUgaG9zdC4gIFJlY2FsbCB0aGF0IHRoZSBkZWZhdWx0IG5hbWUgZm9yIGluc3RhbGxlZCBjcm9zcwordG9vbHMgdXNlcyB0aGUgdGFyZ2V0IHN5c3RlbSBhcyBhIHByZWZpeCAoQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQKK1R5cGV9KS4gIFNpbmNlIHRoYXQgaXMgdGhlIHN5c3RlbSB3aGljaCB3ZSBhcmUgbm93IGNhbGxpbmcgdGhlIGhvc3QsCitAdmFye2hvc3R9IGlzIHRoZSByaWdodCBwcmVmaXggdG8gdXNlLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGNvbmZpZ3VyZSB3aXRoIEBzYW1wey0tYnVpbGQ9aTM4Ni1saW51eC1nbnV9IGFuZAorQHNhbXB7LS1ob3N0PXNvbGFyaXN9LCB0aGVuIHRoZSBDeWdudXMgdHJlZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGVmYXVsdAordG8gdXNpbmcgdGhlIGNvbXBpbGVyIEBzYW1we3NvbGFyaXMtZ2NjfS4gIFlvdSBtdXN0IGhhdmUgcHJldmlvdXNseQorYnVpbHQgYW5kIGluc3RhbGxlZCB0aGlzIGNvbXBpbGVyLCBwcm9iYWJseSBieSBkb2luZyBhIGJ1aWxkIHdpdGggbm8KK0BzYW1wey0taG9zdH0gb3B0aW9uIGFuZCB3aXRoIGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiBvZgorQHNhbXB7c29sYXJpc30uCisKK0Bub2RlIENyb3NzIEN5Z251cyBDQ3Jvc3MKK0BzdWJzZWN0aW9uIEJ1aWxkaW5nIGEgQ3Jvc3MgUHJvZ3JhbQorCitUaGVyZSBhcmUgYWRkaXRpb25hbCBjb25zaWRlcmF0aW9ucyBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGNyb3NzCitjb21waWxlciwgcmF0aGVyIHRoYW4gYSBuYXRpdmUgY29tcGlsZXIsIGluIHRoZSBDeWdudXMgdHJlZSB1c2luZyBhCitDYW5hZGlhbiBDcm9zcy4KKworV2hlbiB5b3UgYnVpbGQgYSBjcm9zcyBjb21waWxlciB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHRoZW4gdGhlIHRhcmdldAorbGlicmFyaWVzIHdpbGwgbm9ybWFsbHkgYmUgYnVpbHQgd2l0aCB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0IGNvbXBpbGVyCisoQHB4cmVme0hvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXN9KS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBub3Qgd29yayB3aGVuCitidWlsZGluZyB3aXRoIGEgQ2FuYWRpYW4gQ3Jvc3MuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG5ld2x5IGJ1aWx0IHRhcmdldAorY29tcGlsZXIgd2lsbCBiZSBhIHByb2dyYW0gd2hpY2ggcnVucyBvbiB0aGUgaG9zdCBzeXN0ZW0sIGFuZCB0aGVyZWZvcmUKK3dpbGwgbm90IGJlIGFibGUgdG8gcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0uCisKK1RoZXJlZm9yZSwgd2hlbiBidWlsZGluZyBhIGNyb3NzIGNvbXBpbGVyIHdpdGggdGhlIEN5Z251cyB0cmVlLCB5b3UgbXVzdAorZmlyc3QgaW5zdGFsbCBhIHNldCBvZiBidWlsZCBjcm9zcyB0YXJnZXQgdG9vbHMuICBUaGVzZSB0b29scyB3aWxsIGJlCit1c2VkIHdoZW4gYnVpbGRpbmcgdGhlIHRhcmdldCBsaWJyYXJpZXMuCisKK05vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIHJlcXVpcmVtZW50IG9mIGEgQ2FuYWRpYW4gQ3Jvc3MgaW4gZ2VuZXJhbC4gIEZvcgorZXhhbXBsZSwgaXQgd291bGQgYmUgcG9zc2libGUgdG8gYnVpbGQganVzdCB0aGUgaG9zdCBjcm9zcyB0YXJnZXQgdG9vbHMKK29uIHRoZSBidWlsZCBzeXN0ZW0sIHRvIGNvcHkgdGhlIHRvb2xzIHRvIHRoZSBob3N0IHN5c3RlbSwgYW5kIHRvIGJ1aWxkCit0aGUgdGFyZ2V0IGxpYnJhcmllcyBvbiB0aGUgaG9zdCBzeXN0ZW0uICBUaGUgcmVxdWlyZW1lbnQgZm9yIGJ1aWxkCitjcm9zcyB0YXJnZXQgdG9vbHMgaXMgaW1wb3NlZCBieSB0aGUgQ3lnbnVzIHRyZWUsIHdoaWNoIGV4cGVjdHMgdG8gYmUKK2FibGUgdG8gYnVpbGQgYm90aCBob3N0IHByb2dyYW1zIGFuZCB0YXJnZXQgbGlicmFyaWVzIGluIGEgc2luZ2xlCitAc2FtcHtjb25maWd1cmV9L0BzYW1we21ha2V9IHN0ZXAuICBCZWNhdXNlIGl0IGJ1aWxkcyB0aGVzZSBpbiBhIHNpbmdsZQorc3RlcCwgaXQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzIG9uIHRoZSBidWlsZAorc3lzdGVtLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgdXNlIGEgYnVpbGQgY3Jvc3MgdGFyZ2V0IHRvb2xjaGFpbi4KKworRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IHdhbnQgdG8gYnVpbGQgYSBXaW5kb3dzIGNyb3NzIE1JUFMgRUxGIGNvbXBpbGVyCitvbiBhIEdOVS9MaW51eCBzeXN0ZW0uICBZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkgaW5zdGFsbGVkIGJvdGggYQorR05VL0xpbnV4IGNyb3NzIFdpbmRvd3MgY29tcGlsZXIgYW5kIGEgR05VL0xpbnV4IGNyb3NzIE1JUFMgRUxGCitjb21waWxlci4KKworSW4gb3JkZXIgdG8gYnVpbGQgdGhlIFdpbmRvd3MgKGNvbmZpZ3VyYXRpb24gbmFtZSBAc2FtcHtpMzg2LWN5Z3dpbjMyfSkKK2Nyb3NzIE1JUFMgRUxGIChjb25maWd1cmUgbmFtZSBAc2FtcHttaXBzLWVsZn0pIGNvbXBpbGVyLCB5b3UgbWlnaHQKK2V4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyAobG9uZyBjb21tYW5kIGxpbmVzIGFyZSBicm9rZW4gYWNyb3NzCitsaW5lcyB3aXRoIGEgdHJhaWxpbmcgYmFja3NsYXNoIGFzIGEgY29udGludWF0aW9uIGNoYXJhY3RlcikuCisKK0BleGFtcGxlCitta2RpciBsaW51eC14LWN5Z3dpbjMyCitjZCBsaW51eC14LWN5Z3dpbjMyCitAdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tdGFyZ2V0IGkzODYtY3lnd2luMzIgLS1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfSBcCisgIC0tZXhlYy1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfS9ILWkzODYtbGludXgKK21ha2UKK21ha2UgaW5zdGFsbAorY2QgLi4KK21rZGlyIGxpbnV4LXgtbWlwcy1lbGYKK2NkIGxpbnV4LXgtbWlwcy1lbGYKK0B2YXJ7c3JjZGlyfS9jb25maWd1cmUgLS10YXJnZXQgbWlwcy1lbGYgLS1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfSBcCisgIC0tZXhlYy1wcmVmaXg9QHZhcntpbnN0YWxsZGlyfS9ILWkzODYtbGludXgKK21ha2UKK21ha2UgaW5zdGFsbAorY2QgLi4KK21rZGlyIGN5Z3dpbjMyLXgtbWlwcy1lbGYKK2NkIGN5Z3dpbjMyLXgtbWlwcy1lbGYKK0B2YXJ7c3JjZGlyfS9jb25maWd1cmUgLS1idWlsZD1pMzg2LWxpbnV4LWdudSAtLWhvc3Q9aTM4Ni1jeWd3aW4zMiBcCisgIC0tdGFyZ2V0PW1pcHMtZWxmIC0tcHJlZml4PUB2YXJ7d2luaW5zdGFsbGRpcn0gXAorICAtLWV4ZWMtcHJlZml4PUB2YXJ7d2luaW5zdGFsbGRpcn0vSC1pMzg2LWN5Z3dpbjMyCittYWtlCittYWtlIGluc3RhbGwKK0BlbmQgZXhhbXBsZQorCitZb3Ugd291bGQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZiBAdmFye3dpbmluc3RhbGxkaXJ9IG92ZXIgdG8gdGhlCitXaW5kb3dzIG1hY2hpbmUsIGFuZCBydW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtcy4KKworQG5vZGUgU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcworQHNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcworCitJZiB5b3Ugd2FudCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGEgcHJvZ3JhbSB5b3UgYXJlIGRldmVsb3BpbmcKK3VzaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIHlvdSBtdXN0IHRha2Ugc29tZSBjYXJlIHdoZW4gd3JpdGluZyB5b3VyCitjb25maWd1cmUgYW5kIG1ha2UgcnVsZXMuICBTaW1wbGUgY2FzZXMgd2lsbCBub3JtYWxseSB3b3JrIGNvcnJlY3RseS4KK0hvd2V2ZXIsIGl0IGlzIG5vdCBoYXJkIHRvIHdyaXRlIGNvbmZpZ3VyZSBhbmQgbWFrZSB0ZXN0cyB3aGljaCB3aWxsCitmYWlsIGluIGEgQ2FuYWRpYW4gQ3Jvc3MuCisKK0BtZW51CisqIENDcm9zcyBpbiBDb25maWd1cmU6OgkJU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBDb25maWd1cmUgU2NyaXB0cy4KKyogQ0Nyb3NzIGluIE1ha2U6OgkJU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBNYWtlZmlsZXMuCitAZW5kIG1lbnUKKworQG5vZGUgQ0Nyb3NzIGluIENvbmZpZ3VyZQorQHN1YnNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBDb25maWd1cmUgU2NyaXB0cworQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBjb25maWd1cmUKKworSW4gYSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGFmdGVyIGNhbGxpbmcgQHNhbXB7QUNfUFJPR19DQ30sIHlvdSBjYW4KK2ZpbmQgb3V0IHdoZXRoZXIgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzIGNvbmZpZ3VyZSBieSBleGFtaW5pbmcgdGhlCitzaGVsbCB2YXJpYWJsZSBAc2FtcHtjcm9zc19jb21waWxpbmd9LiAgSW4gYSBDYW5hZGlhbiBDcm9zcywgd2hpY2ggbWVhbnMKK3RoYXQgdGhlIGNvbXBpbGVyIGlzIGEgY3Jvc3MgY29tcGlsZXIsIEBzYW1we2Nyb3NzX2NvbXBpbGluZ30gd2lsbCBiZQorQHNhbXB7eWVzfS4gIEluIGEgbm9ybWFsIGNvbmZpZ3VyYXRpb24sIEBzYW1we2Nyb3NzX2NvbXBpbGluZ30gd2lsbCBiZQorQHNhbXB7bm99LgorCitZb3Ugb3JkaW5hcmlseSBkbyBub3QgbmVlZCB0byBrbm93IHRoZSB0eXBlIG9mIHRoZSBidWlsZCBzeXN0ZW0gaW4gYQorY29uZmlndXJlIHNjcmlwdC4gIEhvd2V2ZXIsIGlmIHlvdSBkbyBuZWVkIHRoYXQgaW5mb3JtYXRpb24sIHlvdSBjYW4gZ2V0CitpdCBieSB1c2luZyB0aGUgbWFjcm8gQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0sIHRoZSBzYW1lIG1hY3JvIHRoYXQgaXMKK3VzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgc3lzdGVtLiAgVGhpcyBtYWNybyB3aWxsIHNldCB0aGUgdmFyaWFibGVzCitAc2FtcHtidWlsZH0sIEBzYW1we2J1aWxkX2FsaWFzfSwgQHNhbXB7YnVpbGRfY3B1fSwgQHNhbXB7YnVpbGRfdmVuZG9yfSwKK2FuZCBAc2FtcHtidWlsZF9vc30sIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIHNpbWlsYXIgQHNhbXB7dGFyZ2V0fSBhbmQKK0BzYW1we2hvc3R9IHZhcmlhYmxlcywgZXhjZXB0IHRoYXQgdGhleSBkZXNjcmliZSB0aGUgYnVpbGQgc3lzdGVtLgorCitXaGVuIHdyaXRpbmcgdGVzdHMgaW4gQGZpbGV7Y29uZmlndXJlLmlufSwgeW91IG11c3QgcmVtZW1iZXIgdGhhdCB5b3UKK3dhbnQgdG8gdGVzdCB0aGUgaG9zdCBlbnZpcm9ubWVudCwgbm90IHRoZSBidWlsZCBlbnZpcm9ubWVudC4KKworTWFjcm9zIGxpa2UgQHNhbXB7QUNfQ0hFQ0tfRlVOQ1N9IHdoaWNoIHVzZSB0aGUgY29tcGlsZXIgd2lsbCB0ZXN0IHRoZQoraG9zdCBlbnZpcm9ubWVudC4gIFRoYXQgaXMgYmVjYXVzZSB0aGUgdGVzdHMgd2lsbCBiZSBkb25lIGJ5IHJ1bm5pbmcgdGhlCitjb21waWxlciwgd2hpY2ggaXMgYWN0dWFsbHkgYSBidWlsZCBjcm9zcyBob3N0IGNvbXBpbGVyLiAgSWYgdGhlCitjb21waWxlciBjYW4gZmluZCB0aGUgZnVuY3Rpb24sIHRoYXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgcHJlc2VudAoraW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuCisKK1Rlc3RzIGxpa2UgQHNhbXB7dGVzdCAtZiAvZGV2L3B0eXAwfSwgb24gdGhlIG90aGVyIGhhbmQsIHdpbGwgdGVzdCB0aGUKK2J1aWxkIGVudmlyb25tZW50LiAgUmVtZW1iZXIgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW5uaW5nIG9uIHRoZQorYnVpbGQgc3lzdGVtLCBub3QgdGhlIGhvc3Qgc3lzdGVtLiAgSWYgeW91ciBjb25maWd1cmUgc2NyaXB0cyBleGFtaW5lcworZmlsZXMsIHRob3NlIGZpbGVzIHdpbGwgYmUgb24gdGhlIGJ1aWxkIHN5c3RlbS4gIFdoYXRldmVyIHlvdSBkZXRlcm1pbmUKK2Jhc2VkIG9uIHRob3NlIGZpbGVzIG1heSBvciBtYXkgbm90IGJlIHRoZSBjYXNlIG9uIHRoZSBob3N0IHN5c3RlbS4KKworTW9zdCBhdXRvY29uZiBtYWNyb3Mgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgYSBDYW5hZGlhbiBDcm9zcy4gIFRoZSBtYWluCitleGNlcHRpb24gaXMgQHNhbXB7QUNfVFJZX1JVTn0uICBUaGlzIG1hY3JvIHRyaWVzIHRvIGNvbXBpbGUgYW5kIHJ1biBhCit0ZXN0IHByb2dyYW0uICBUaGlzIHdpbGwgZmFpbCBpbiBhIENhbmFkaWFuIENyb3NzLCBiZWNhdXNlIHRoZSBwcm9ncmFtCit3aWxsIGJlIGNvbXBpbGVkIGZvciB0aGUgaG9zdCBzeXN0ZW0sIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBub3QgcnVuCitvbiB0aGUgYnVpbGQgc3lzdGVtLgorCitUaGUgQHNhbXB7QUNfVFJZX1JVTn0gbWFjcm8gcHJvdmlkZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gdGVsbCB0aGUKK2NvbmZpZ3VyZSBzY3JpcHQgd2hhdCB0byBkbyBpbiBhIENhbmFkaWFuIENyb3NzLiAgSWYgdGhhdCBhcmd1bWVudCBpcworbm90IHByZXNlbnQsIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcgd2hlbiB5b3UgcnVuIEBzYW1we2F1dG9jb25mfToKK0BzbWFsbGV4YW1wbGUKK3dhcm5pbmc6IEFDX1RSWV9SVU4gY2FsbGVkIHdpdGhvdXQgZGVmYXVsdCB0byBhbGxvdyBjcm9zcyBjb21waWxpbmcKK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK1RoaXMgdGVsbHMgeW91IHRoYXQgdGhlIHJlc3VsdGluZyBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsIG5vdCB3b3JrCit3aXRoIGEgQ2FuYWRpYW4gQ3Jvc3MuCisKK0luIHNvbWUgY2FzZXMgd2hpbGUgaXQgbWF5IGJldHRlciB0byBwZXJmb3JtIGEgdGVzdCBhdCBjb25maWd1cmUgdGltZSwKK2l0IGlzIGFsc28gcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgdGVzdCBhdCBydW4gdGltZS4gIEluIHN1Y2ggYSBjYXNlIHlvdQorY2FuIHVzZSB0aGUgY3Jvc3MgY29tcGlsaW5nIGFyZ3VtZW50IHRvIEBzYW1we0FDX1RSWV9SVU59IHRvIHRlbGwgeW91cgorcHJvZ3JhbSB0aGF0IHRoZSB0ZXN0IGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYXQgY29uZmlndXJlIHRpbWUuCisKK1RoZXJlIGFyZSBhIGZldyBvdGhlciBhdXRvY29uZiBtYWNyb3Mgd2hpY2ggd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgd2l0aAorYSBDYW5hZGlhbiBDcm9zczogYSBwYXJ0aWFsIGxpc3QgaXMgQHNhbXB7QUNfRlVOQ19HRVRQR1JQfSwKK0BzYW1we0FDX0ZVTkNfU0VUUEdSUH0sIEBzYW1we0FDX0ZVTkNfU0VUVkJVRl9SRVZFUlNFRH0sIGFuZAorQHNhbXB7QUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTfS4gIFRoZSBAc2FtcHtBQ19DSEVDS19TSVpFT0Z9IG1hY3JvIGlzCitnZW5lcmFsbHkgbm90IHZlcnkgdXNlZnVsIHdpdGggYSBDYW5hZGlhbiBDcm9zczsgaXQgcGVybWl0cyBhbiBvcHRpb25hbAorYXJndW1lbnQgaW5kaWNhdGluZyB0aGUgZGVmYXVsdCBzaXplLCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hhdAordGhlIGNvcnJlY3QgZGVmYXVsdCBzaG91bGQgYmUuCisKK0Bub2RlIENDcm9zcyBpbiBNYWtlCitAc3Vic2VjdGlvbiBTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzIGluIE1ha2VmaWxlcy4KK0BjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gbWFrZWZpbGUKKworVGhlIG1haW4gQ2FuYWRpYW4gQ3Jvc3MgaXNzdWUgaW4gYSBAZmlsZXtNYWtlZmlsZX0gYXJpc2VzIHdoZW4geW91IHdhbnQKK3RvIHVzZSBhIHN1YnNpZGlhcnkgcHJvZ3JhbSB0byBnZW5lcmF0ZSBjb2RlIG9yIGRhdGEgd2hpY2ggeW91IHdpbGwgdGhlbgoraW5jbHVkZSBpbiB5b3VyIHJlYWwgcHJvZ3JhbS4KKworSWYgeW91IGNvbXBpbGUgdGhpcyBzdWJzaWRpYXJ5IHByb2dyYW0gdXNpbmcgQHNhbXB7JChDQyl9IGluIHRoZSB1c3VhbAord2F5LCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBydW4gaXQuICBUaGlzIGlzIGJlY2F1c2UgQHNhbXB7JChDQyl9IHdpbGwKK2J1aWxkIGEgcHJvZ3JhbSBmb3IgdGhlIGhvc3Qgc3lzdGVtLCBidXQgdGhlIHByb2dyYW0gaXMgYmVpbmcgYnVpbHQgb24KK3RoZSBidWlsZCBzeXN0ZW0uCisKK1lvdSBtdXN0IGluc3RlYWQgdXNlIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0sIHJhdGhlciB0aGFuIHRoZQoraG9zdCBzeXN0ZW0uICBJbiB0aGUgQ3lnbnVzIHRyZWUsIHRoaXMgbWFrZSB2YXJpYWJsZQorQHNhbXB7JChDQ19GT1JfQlVJTEQpfSB3aWxsIGhvbGQgYSBjb21waWxlciBmb3IgdGhlIGJ1aWxkIHN5c3RlbS4KKworTm90ZSB0aGF0IHlvdSBzaG91bGQgbm90IGluY2x1ZGUgQGZpbGV7Y29uZmlnLmh9IGluIGEgZmlsZSB5b3UgYXJlCitjb21waWxpbmcgd2l0aCBAc2FtcHskKENDX0ZPUl9CVUlMRCl9LiAgVGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdpbGwKK2J1aWxkIEBmaWxle2NvbmZpZy5ofSB3aXRoIGluZm9ybWF0aW9uIGZvciB0aGUgaG9zdCBzeXN0ZW0uICBIb3dldmVyLAoreW91IGFyZSBjb21waWxpbmcgdGhlIGZpbGUgdXNpbmcgYSBjb21waWxlciBmb3IgdGhlIGJ1aWxkIHN5c3RlbSAoYQorbmF0aXZlIGNvbXBpbGVyKS4gIFN1YnNpZGlhcnkgcHJvZ3JhbXMgYXJlIG5vcm1hbGx5IHNpbXBsZSBmaWx0ZXJzIHdoaWNoCitkbyBubyB1c2VyIGludGVyYWN0aW9uLCBhbmQgaXQgaXMgbm9ybWFsbHkgcG9zc2libGUgdG8gd3JpdGUgdGhlbSBpbiBhCitoaWdobHkgcG9ydGFibGUgZmFzaGlvbiBzbyB0aGF0IHRoZSBhYnNlbmNlIG9mIEBmaWxle2NvbmZpZy5ofSBpcyBub3QKK2NydWNpYWwuCisKK0BjaW5kZXggQHNhbXB7SE9TVF9DQ30KK1RoZSBnY2MgQGZpbGV7TWFrZWZpbGUuaW59IHNob3dzIGEgY29tcGxleCBzaXR1YXRpb24gaW4gd2hpY2ggY2VydGFpbgorZmlsZXMsIHN1Y2ggYXMgQGZpbGV7cnRsLmN9LCBtdXN0IGJlIGNvbXBpbGVkIGludG8gYm90aCBzdWJzaWRpYXJ5Citwcm9ncmFtcyBydW4gb24gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgaW50byB0aGUgZmluYWwgcHJvZ3JhbS4gIFRoaXMKK2FwcHJvYWNoIG1heSBiZSBvZiBpbnRlcmVzdCBmb3IgYWR2YW5jZWQgYnVpbGQgc3lzdGVtIGhhY2tlcnMuICBOb3RlCit0aGF0IHRoZSBidWlsZCBzeXN0ZW0gY29tcGlsZXIgaXMgcmF0aGVyIGNvbmZ1c2luZ2x5IGNhbGxlZAorQHNhbXB7SE9TVF9DQ30uCisKK0Bub2RlIEN5Z251cyBDb25maWd1cmUKK0BjaGFwdGVyIEN5Z251cyBDb25maWd1cmUKK0BjaW5kZXggY3lnbnVzIGNvbmZpZ3VyZQorCitUaGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgcHJlZGF0ZXMgYXV0b2NvbmYuICBBbGwgb2YgaXRzIGludGVyZXN0aW5nCitmZWF0dXJlcyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkIGludG8gYXV0b2NvbmYuICBObyBuZXcgcHJvZ3JhbXMgc2hvdWxkCitiZSB3cml0dGVuIHRvIHVzZSB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0hvd2V2ZXIsIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBpcyBzdGlsbCB1c2VkIGluIGEgZmV3IHBsYWNlczogYXQKK3RoZSB0b3Agb2YgdGhlIEN5Z251cyB0cmVlIGFuZCBpbiBhIGZldyB0YXJnZXQgbGlicmFyaWVzIGluIHRoZSBDeWdudXMKK3RyZWUuICBVbnRpbCB0aG9zZSB1c2VzIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGF1dG9jb25mLCBzb21lIGJyaWVmCitub3RlcyBhcmUgYXBwcm9wcmlhdGUgaGVyZS4gIFRoaXMgaXMgbm90IGNvbXBsZXRlIGRvY3VtZW50YXRpb24sIGJ1dCBpdAorc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIGFzIGEgZ3VpZGUgd2hpbGUgZXhhbWluaW5nIHRoZSBzY3JpcHRzCit0aGVtc2VsdmVzLgorCitAbWVudQorKiBDeWdudXMgQ29uZmlndXJlIEJhc2ljczo6CQlDeWdudXMgQ29uZmlndXJlIEJhc2ljcy4KKyogQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzOjoJQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzLgorQGVuZCBtZW51CisKK0Bub2RlIEN5Z251cyBDb25maWd1cmUgQmFzaWNzCitAc2VjdGlvbiBDeWdudXMgQ29uZmlndXJlIEJhc2ljcworCitDeWdudXMgY29uZmlndXJlIGRvZXMgbm90IHVzZSBhbnkgZ2VuZXJhdGVkIGZpbGVzOyB0aGVyZSBpcyBubyBwcm9ncmFtCitjb3JyZXNwb25kaW5nIHRvIEBzYW1we2F1dG9jb25mfS4gIEluc3RlYWQsIHRoZXJlIGlzIGEgc2luZ2xlIHNoZWxsCitzY3JpcHQgbmFtZWQgQHNhbXB7Y29uZmlndXJlfSB3aGljaCBtYXkgYmUgZm91bmQgYXQgdGhlIHRvcCBvZiB0aGUKK0N5Z251cyB0cmVlLiAgVGhpcyBzaGVsbCBzY3JpcHQgd2FzIHdyaXR0ZW4gYnkgaGFuZDsgaXQgd2FzIG5vdAorZ2VuZXJhdGVkIGJ5IGF1dG9jb25mLCBhbmQgaXQgaXMgaW5jb3JyZWN0LCBhbmQgaW5kZWVkIGhhcm1mdWwsIHRvIHJ1bgorQHNhbXB7YXV0b2NvbmZ9IGluIHRoZSB0b3AgbGV2ZWwgb2YgYSBDeWdudXMgdHJlZS4KKworQ3lnbnVzIGNvbmZpZ3VyZSB3b3JrcyBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IGJ5IGV4YW1pbmluZyB0aGUgZmlsZQorQGZpbGV7Y29uZmlndXJlLmlufSBpbiB0aGF0IGRpcmVjdG9yeS4gIFRoYXQgZmlsZSBpcyBicm9rZW4gaW50byBmb3VyCitzZXBhcmF0ZSBzaGVsbCBzY3JpcHRzLgorCitUaGUgZmlyc3QgaXMgdGhlIGNvbnRlbnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gdXAgdG8gYSBsaW5lIHRoYXQKK3N0YXJ0cyB3aXRoIEBzYW1weyMgcGVyLWhvc3Q6fS4gIFRoaXMgaXMgdGhlIGNvbW1vbiBwYXJ0LgorCitUaGUgc2Vjb25kIGlzIHRoZSByZXN0IG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gdXAgdG8gYSBsaW5lIHRoYXQgc3RhcnRzCit3aXRoIEBzYW1weyMgcGVyLXRhcmdldDp9LiAgVGhpcyBpcyB0aGUgcGVyIGhvc3QgcGFydC4KKworVGhlIHRoaXJkIGlzIHRoZSByZXN0IG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gdXAgdG8gYSBsaW5lIHRoYXQgc3RhcnRzCit3aXRoIEBzYW1weyMgcG9zdC10YXJnZXQ6fS4gIFRoaXMgaXMgdGhlIHBlciB0YXJnZXQgcGFydC4KKworVGhlIGZvdXJ0aCBpcyB0aGUgcmVtYWluZGVyIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGlzIGlzIHRoZSBwb3N0Cit0YXJnZXQgcGFydC4KKworSWYgYW55IG9mIHRoZXNlIGNvbW1lbnQgbGluZXMgYXJlIG1pc3NpbmcsIHRoZSBjb3JyZXNwb25kaW5nIHNoZWxsCitzY3JpcHQgaXMgZW1wdHkuCisKK0N5Z251cyBjb25maWd1cmUgd2lsbCBmaXJzdCBleGVjdXRlIHRoZSBjb21tb24gcGFydC4gIFRoaXMgbXVzdCBzZXQgdGhlCitzaGVsbCB2YXJpYWJsZSBAc2FtcHtzcmN0cmlnZ2VyfSB0byB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlLCB0bworY29uZmlybSB0aGF0IEN5Z251cyBjb25maWd1cmUgaXMgbG9va2luZyBhdCB0aGUgcmlnaHQgZGlyZWN0b3J5LiAgVGhpcworbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGVzIEBzYW1we3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gYW5kCitAc2FtcHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9LgorCitDeWdudXMgY29uZmlndXJlIHdpbGwgbmV4dCBzZXQgdGhlIEBzYW1we2J1aWxkfSBhbmQgQHNhbXB7aG9zdH0gc2hlbGwKK3ZhcmlhYmxlcywgYW5kIGV4ZWN1dGUgdGhlIHBlciBob3N0IHBhcnQuICBUaGlzIG1heSBzZXQgdGhlIHNoZWxsCit2YXJpYWJsZSBAc2FtcHtob3N0X21ha2VmaWxlX2ZyYWd9LgorCitDeWdudXMgY29uZmlndXJlIHdpbGwgbmV4dCBzZXQgdGhlIEBzYW1we3RhcmdldH0gdmFyaWFibGUsIGFuZCBleGVjdXRlCit0aGUgcGVyIHRhcmdldCBwYXJ0LiAgVGhpcyBtYXkgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQorQHNhbXB7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9LgorCitBbnkgb2YgdGhlc2Ugc2NyaXB0cyBtYXkgc2V0IHRoZSBAc2FtcHtzdWJkaXJzfSBzaGVsbCB2YXJpYWJsZS4gIFRoaXMKK3ZhcmlhYmxlIGlzIGEgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyB3aGVyZSBhIEBmaWxle01ha2VmaWxlLmlufSBmaWxlIG1heQorYmUgZm91bmQuICBDeWdudXMgY29uZmlndXJlIHdpbGwgYXV0b21hdGljYWxseSBsb29rIGZvciBhCitAZmlsZXtNYWtlZmlsZS5pbn0gZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBUaGUgQHNhbXB7c3ViZGlyc30KK3NoZWxsIHZhcmlhYmxlIGlzIG5vdCBub3JtYWxseSB1c2VkLCBhbmQgSSBiZWxpZXZlIHRoYXQgdGhlIG9ubHkKK2RpcmVjdG9yeSB3aGljaCB1c2VzIGl0IGF0IHByZXNlbnQgaXMgQGZpbGV7bmV3bGlifS4KKworRm9yIGVhY2ggQGZpbGV7TWFrZWZpbGUuaW59LCBDeWdudXMgY29uZmlndXJlIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUKK2EgQGZpbGV7TWFrZWZpbGV9IGJ5IGFkZGluZyBkZWZpbml0aW9ucyBmb3IgQHNhbXB7bWFrZX0gdmFyaWFibGVzIHN1Y2gKK2FzIEBzYW1we2hvc3R9IGFuZCBAc2FtcHt0YXJnZXR9LCBhbmQgYXV0b21hdGljYWxseSBlZGl0aW5nIHRoZSB2YWx1ZXMKK29mIEBzYW1we21ha2V9IHZhcmlhYmxlcyBzdWNoIGFzIEBzYW1we3ByZWZpeH0gaWYgdGhleSBhcmUgcHJlc2VudC4KKworQWxzbywgaWYgYW55IG9mIHRoZSBAc2FtcHttYWtlZmlsZV9mcmFnfSBzaGVsbCB2YXJpYWJsZXMgYXJlIHNldCwgQ3lnbnVzCitjb25maWd1cmUgd2lsbCBpbnRlcnByZXQgdGhlbSBhcyBmaWxlIG5hbWVzIHJlbGF0aXZlIHRvIGVpdGhlciB0aGUKK3dvcmtpbmcgZGlyZWN0b3J5IG9yIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBhbmQgd2lsbCByZWFkIHRoZSBjb250ZW50cyBvZgordGhlIGZpbGUgaW50byB0aGUgZ2VuZXJhdGVkIEBmaWxle01ha2VmaWxlfS4gIFRoZSBmaWxlIGNvbnRlbnRzIHdpbGwgYmUKK3JlYWQgaW4gYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgaW4gQGZpbGV7TWFrZWZpbGUuaW59IHdoaWNoIHN0YXJ0cyB3aXRoCitAc2FtcHsjIyMjfS4KKworVGhlc2UgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50cyBhcmUgdXNlZCB0byBjdXN0b21pemUgYmVoYXZpb3VyIGZvciBhCitwYXJ0aWN1bGFyIGhvc3Qgb3IgdGFyZ2V0LiAgVGhleSBzZXJ2ZSB0byBzZWxlY3QgcGFydGljdWxhciBmaWxlcyB0bworY29tcGlsZSwgYW5kIHRvIGRlZmluZSBwYXJ0aWN1bGFyIHByZXByb2Nlc3NvciBtYWNyb3MgYnkgcHJvdmlkaW5nCit2YWx1ZXMgZm9yIEBzYW1we21ha2V9IHZhcmlhYmxlcyB3aGljaCBhcmUgdGhlbiB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4KK0N5Z251cyBjb25maWd1cmUsIHVubGlrZSBhdXRvY29uZiwgbm9ybWFsbHkgZG9lcyBub3QgZG8gZmVhdHVyZSB0ZXN0cywKK2FuZCBub3JtYWxseSByZXF1aXJlcyBzdXBwb3J0IHRvIGJlIGFkZGVkIG1hbnVhbGx5IGZvciBlYWNoIG5ldyBob3N0LgorCitUaGUgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50IHN1cHBvcnQgaXMgc2ltaWxhciB0byB0aGUgYXV0b2NvbmYKK0BzYW1we0FDX1NVQlNUX0ZJTEV9IG1hY3JvLgorCitBZnRlciBjcmVhdGluZyBlYWNoIEBmaWxle01ha2VmaWxlfSwgdGhlIHBvc3QgdGFyZ2V0IHNjcmlwdCB3aWxsIGJlIHJ1bgorKGkuZS4sIGl0IG1heSBiZSBydW4gc2V2ZXJhbCB0aW1lcykuICBUaGlzIHNjcmlwdCBtYXkgZnVydGhlciBjdXN0b21pemUKK3RoZSBAZmlsZXtNYWtlZmlsZX0uICBXaGVuIGl0IGlzIHJ1biwgdGhlIHNoZWxsIHZhcmlhYmxlIEBzYW1we01ha2VmaWxlfQord2lsbCBob2xkIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0sIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUKK2RpcmVjdG9yeSBjb21wb25lbnQuCisKK0xpa2UgYW4gYXV0b2NvbmYgZ2VuZXJhdGVkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LCBDeWdudXMgY29uZmlndXJlCit3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7Y29uZmlnLnN0YXR1c30gd2hpY2gsIHdoZW4gcnVuLCB3aWxsCithdXRvbWF0aWNhbGx5IHJlY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uLiAgVGhlIEBmaWxle2NvbmZpZy5zdGF0dXN9IGZpbGUKK3dpbGwgc2ltcGx5IGV4ZWN1dGUgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IGFnYWluIHdpdGggdGhlCithcHByb3ByaWF0ZSBhcmd1bWVudHMuCisKK0FueSBvZiB0aGUgcGFydHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBtYXkgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZXMKK0BzYW1we2ZpbGVzfSBhbmQgQHNhbXB7bGlua3N9LiAgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIHNldCB1cCBzeW1saW5rcworZnJvbSB0aGUgbmFtZXMgaW4gQHNhbXB7bGlua3N9IHRvIHRoZSBmaWxlcyBuYW1lZCBpbiBAc2FtcHtmaWxlc30uICBUaGlzCitpcyBzaW1pbGFyIHRvIHRoZSBhdXRvY29uZiBAc2FtcHtBQ19MSU5LX0ZJTEVTfSBtYWNyby4KKworRmluYWxseSwgYW55IG9mIHRoZSBwYXJ0cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IG1heSBzZXQgdGhlIHNoZWxsCit2YXJpYWJsZSBAc2FtcHtjb25maWdkaXJzfSB0byBhIHNldCBvZiBzdWJkaXJlY3Rvcmllcy4gIElmIGl0IGlzIHNldCwKK0N5Z251cyBjb25maWd1cmUgd2lsbCByZWN1cnNpdmVseSBydW4gdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIGluIGVhY2gKK3N1YmRpcmVjdG9yeS4gIElmIHRoZSBzdWJkaXJlY3RvcnkgdXNlcyBDeWdudXMgY29uZmlndXJlLCBpdCB3aWxsCitjb250YWluIGEgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIGJ1dCBubyBAZmlsZXtjb25maWd1cmV9IGZpbGUsIGluCit3aGljaCBjYXNlIEN5Z251cyBjb25maWd1cmUgd2lsbCBpbnZva2UgaXRzZWxmIHJlY3Vyc2l2ZWx5LiAgSWYgdGhlCitzdWJkaXJlY3RvcnkgaGFzIGEgQGZpbGV7Y29uZmlndXJlfSBmaWxlLCBDeWdudXMgY29uZmlndXJlIGFzc3VtZXMgdGhhdAoraXQgaXMgYW4gYXV0b2NvbmYgZ2VuZXJhdGVkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LCBhbmQgc2ltcGx5IGludm9rZXMKK2l0IGRpcmVjdGx5LgorCitAbm9kZSBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMKK0BzZWN0aW9uIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcworQGNpbmRleCBAZmlsZXtsaWJzdGRjKyt9IGNvbmZpZ3VyZQorQGNpbmRleCBAZmlsZXtsaWJpb30gY29uZmlndXJlCitAY2luZGV4IEBmaWxle2xpYmcrK30gY29uZmlndXJlCisKK1RoZSBDKysgbGlicmFyeSBjb25maWd1cmUgc3lzdGVtLCB3cml0dGVuIGJ5IFBlciBCb3RobmVyLCBkZXNlcnZlcworc3BlY2lhbCBtZW50aW9uLiAgSXQgdXNlcyBDeWdudXMgY29uZmlndXJlLCBidXQgaXQgZG9lcyBmZWF0dXJlIHRlc3RpbmcKK2xpa2UgdGhhdCBkb25lIGJ5IGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdHMuICBUaGlzCithcHByb2FjaCBpcyB1c2VkIGluIHRoZSBsaWJyYXJpZXMgQGZpbGV7bGliaW99LCBAZmlsZXtsaWJzdGRjKyt9LCBhbmQKK0BmaWxle2xpYmcrK30uCisKK01vc3Qgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIG91dCBieSB0aGUgc2hlbGwKK3NjcmlwdCBAZmlsZXtsaWJpby9jb25maWcuc2hhcmVkfS4gIEVhY2ggQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHNldHMKK2NlcnRhaW4gc2hlbGwgdmFyaWFibGVzLCBhbmQgdGhlbiBpbnZva2VzIEBmaWxle2NvbmZpZy5zaGFyZWR9IHRvIGNyZWF0ZQordHdvIHBhY2thZ2UgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50cy4gIFRoZXNlIGZyYWdtZW50cyBhcmUgdGhlbgoraW5jb3Jwb3JhdGVkIGludG8gdGhlIHJlc3VsdGluZyBAZmlsZXtNYWtlZmlsZX0gYnkgdGhlIEN5Z251cyBjb25maWd1cmUKK3NjcmlwdC4KKworVGhlIGZpbGUgQGZpbGV7X0dfY29uZmlnLmh9IGlzIGNyZWF0ZWQgaW4gdGhlIEBmaWxle2xpYmlvfSBvYmplY3QKK2RpcmVjdG9yeSBieSBydW5uaW5nIHRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7bGliaW8vZ2VuLXBhcmFtc30uICBUaGlzCitzaGVsbCBzY3JpcHQgdXNlcyBmZWF0dXJlIHRlc3RzIHRvIGRlZmluZSBtYWNyb3MgYW5kIHR5cGVkZWZzIGluCitAZmlsZXtfR19jb25maWcuaH0uCisKK0Bub2RlIE11bHRpbGlicworQGNoYXB0ZXIgTXVsdGlsaWJzCitAY2luZGV4IG11bHRpbGlicworCitGb3Igc29tZSB0YXJnZXRzIGdjYyBtYXkgaGF2ZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHJlcXVpcmVtZW50cyBkZXBlbmRpbmcKK3Vwb24gY29tbWFuZCBsaW5lIG9wdGlvbnMuICBBbiBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlCitAc2FtcHstbXNvZnQtZmxvYXR9IG9wdGlvbiBzdXBwb3J0ZWQgb24gc2V2ZXJhbCBwcm9jZXNzb3JzLiAgVGhpcyBvcHRpb24KK21lYW5zIHRoYXQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgbm90IGF2YWlsYWJsZSwgd2hpY2ggbWVhbnMKK3RoYXQgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBtdXN0IGJlIGRvbmUgYnkgY2FsbGluZyBhbiBlbXVsYXRpb24KK3N1YnJvdXRpbmUgcmF0aGVyIHRoYW4gYnkgdXNpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisKK0ZvciBzdWNoIG9wdGlvbnMsIGdjYyBpcyBvZnRlbiBjb25maWd1cmVkIHRvIGNvbXBpbGUgdGFyZ2V0IGxpYnJhcmllcwordHdpY2U6IG9uY2Ugd2l0aCBAc2FtcHstbXNvZnQtZmxvYXR9IGFuZCBvbmNlIHdpdGhvdXQuICBXaGVuIGdjYworY29tcGlsZXMgdGFyZ2V0IGxpYnJhcmllcyBtb3JlIHRoYW4gb25jZSwgdGhlIHJlc3VsdGluZyBsaWJyYXJpZXMgYXJlCitjYWxsZWQgQGRmbnttdWx0aWxpYnN9LgorCitNdWx0aWxpYnMgYXJlIG5vdCByZWFsbHkgcGFydCBvZiB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLCBidXQKK3dlIGRpc2N1c3MgdGhlbSBoZXJlIHNpbmNlIHRoZXkgcmVxdWlyZSBzdXBwb3J0IGluIHRoZSBAZmlsZXtjb25maWd1cmV9CitzY3JpcHRzIGFuZCBAZmlsZXtNYWtlZmlsZX1zIHVzZWQgZm9yIHRhcmdldCBsaWJyYXJpZXMuCisKK0BtZW51CisqIE11bHRpbGlicyBpbiBnY2M6OgkJICAgICAgICBNdWx0aWxpYnMgaW4gZ2NjLgorKiBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllczo6CU11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzLgorQGVuZCBtZW51CisKK0Bub2RlIE11bHRpbGlicyBpbiBnY2MKK0BzZWN0aW9uIE11bHRpbGlicyBpbiBnY2MKKworSW4gZ2NjLCBtdWx0aWxpYnMgYXJlIGRlZmluZWQgYnkgc2V0dGluZyB0aGUgdmFyaWFibGUKK0BzYW1we01VTFRJTElCX09QVElPTlN9IGluIHRoZSB0YXJnZXQgQGZpbGV7TWFrZWZpbGV9IGZyYWdtZW50LiAgU2V2ZXJhbAorb3RoZXIgQHNhbXB7TVVMVElMSUJ9IHZhcmlhYmxlcyBtYXkgYWxzbyBiZSBkZWZpbmVkIHRoZXJlLiAgQHhyZWZ7VGFyZ2V0CitGcmFnbWVudCwgLCBUaGUgVGFyZ2V0IE1ha2VmaWxlIEZyYWdtZW50LCBnY2MsIFVzaW5nIGFuZCBQb3J0aW5nIEdOVQorQ0N9LgorCitJZiB5b3UgaGF2ZSBidWlsdCBnY2MsIHlvdSBjYW4gc2VlIHdoYXQgbXVsdGlsaWJzIGl0IHVzZXMgYnkgcnVubmluZyBpdAord2l0aCB0aGUgQHNhbXB7LXByaW50LW11bHRpLWxpYn0gb3B0aW9uLiAgVGhlIG91dHB1dCBAc2FtcHsuO30gbWVhbnMKK3RoYXQgbm8gbXVsdGlsaWJzIGFyZSB1c2VkLiAgSW4gZ2VuZXJhbCwgdGhlIG91dHB1dCBpcyBhIHNlcXVlbmNlIG9mCitsaW5lcywgb25lIHBlciBtdWx0aWxpYi4gIFRoZSBmaXJzdCBwYXJ0IG9mIGVhY2ggbGluZSwgdXAgdG8gdGhlCitAc2FtcHs7fSwgaXMgdGhlIG5hbWUgb2YgdGhlIG11bHRpbGliIGRpcmVjdG9yeS4gIFRoZSBzZWNvbmQgcGFydCBpcyBhCitsaXN0IG9mIGNvbXBpbGVyIG9wdGlvbnMgc2VwYXJhdGVkIGJ5IEBzYW1we0BAfSBjaGFyYWN0ZXJzLgorCitNdWx0aWxpYnMgYXJlIGJ1aWx0IGluIGEgdHJlZSBvZiBkaXJlY3Rvcmllcy4gIFRoZSB0b3Agb2YgdGhlIHRyZWUsCityZXByZXNlbnRlZCBieSBAc2FtcHsufSBpbiB0aGUgbGlzdCBvZiBtdWx0aWxpYiBkaXJlY3RvcmllcywgaXMgdGhlCitkZWZhdWx0IGxpYnJhcnkgdG8gdXNlIHdoZW4gbm8gc3BlY2lhbCBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkLiAgVGhlCitzdWJkaXJlY3RvcmllcyBvZiB0aGUgdHJlZSBob2xkIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHRvIHVzZSB3aGVuCitwYXJ0aWN1bGFyIGNvbXBpbGVyIG9wdGlvbnMgYXJlIHVzZWQuCisKK0Bub2RlIE11bHRpbGlicyBpbiBUYXJnZXQgTGlicmFyaWVzCitAc2VjdGlvbiBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcworCitUaGUgdGFyZ2V0IGxpYnJhcmllcyBpbiB0aGUgQ3lnbnVzIHRyZWUgYXJlIGF1dG9tYXRpY2FsbHkgYnVpbHQgd2l0aAorbXVsdGlsaWJzLiAgVGhhdCBtZWFucyB0aGF0IGVhY2ggbGlicmFyeSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcy4KKworVGhpcyBkZWZhdWx0IGlzIHNldCBpbiB0aGUgdG9wIGxldmVsIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgYnkgYWRkaW5nCitAc2FtcHstLWVuYWJsZS1tdWx0aWxpYn0gdG8gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUKK3doZW4gaXQgaXMgcnVuIGZvciB0aGUgdGFyZ2V0IGxpYnJhcmllcyAoQHB4cmVme0hvc3QgYW5kIFRhcmdldAorTGlicmFyaWVzfSkuCisKK0VhY2ggdGFyZ2V0IGxpYnJhcnkgdXNlcyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy1tbC5pbn0sIHdyaXR0ZW4KK2J5IERvdWcgRXZhbnMsIHRvIHByZXBhcmUgdG8gYnVpbGQgdGFyZ2V0IGxpYnJhcmllcy4gIFRoaXMgc2hlbGwgc2NyaXB0CitpcyBpbnZva2VkIGFmdGVyIHRoZSBAZmlsZXtNYWtlZmlsZX0gaGFzIGJlZW4gY3JlYXRlZCBieSB0aGUKK0BmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgSWYgbXVsdGlsaWJzIGFyZSBub3QgZW5hYmxlZCwgaXQgZG9lcyBub3RoaW5nLAorb3RoZXJ3aXNlIGl0IG1vZGlmaWVzIHRoZSBAZmlsZXtNYWtlZmlsZX0gdG8gc3VwcG9ydCBtdWx0aWxpYnMuCisKK1RoZSBAZmlsZXtjb25maWctbWwuaW59IHNjcmlwdCBtYWtlcyBvbmUgY29weSBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IGZvcgorZWFjaCBtdWx0aWxpYiBpbiB0aGUgYXBwcm9wcmlhdGUgc3ViZGlyZWN0b3J5LiAgV2hlbiBjb25maWd1cmluZyBpbiB0aGUKK3NvdXJjZSBkaXJlY3RvcnkgKHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCksIGl0IHdpbGwgYnVpbGQgYSBzeW1saW5rCit0cmVlIG9mIHRoZSBzb3VyY2VzIGluIGVhY2ggc3ViZGlyZWN0b3J5LgorCitUaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgc2V0cyBzZXZlcmFsIHZhcmlhYmxlcyBpbiB0aGUgdmFyaW91cworQGZpbGV7TWFrZWZpbGV9cy4gIFRoZSBAZmlsZXtNYWtlZmlsZS5pbn0gbXVzdCBoYXZlIGRlZmluaXRpb25zIGZvcgordGhlc2UgdmFyaWFibGVzIGFscmVhZHk7IEBmaWxle2NvbmZpZy1tbC5pbn0gc2ltcGx5IGNoYW5nZXMgdGhlIGV4aXN0aW5nCit2YWx1ZXMuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHNob3VsZCB1c2UgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlCit2YXJpYWJsZXMgd2hpY2ggd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgaW4gdGhlIHN1YmRpcmVjdG9yaWVzLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIE1VTFRJU1JDVE9QCitAZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMgdG8gYSBzZXF1ZW5jZSBvZiBAc2FtcHsuLi99IHN0cmluZ3MsCit3aGVyZSB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaXMgdGhlIG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gdGhlCitzb3VyY2UgdHJlZS4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUgZW1wdHkgc3RyaW5nLgorQGl0ZW0gTVVMVElCVUlMRFRPUAorQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIGEgc2VxdWVuY2Ugb2YgQHNhbXB7Li4vfSBzdHJpbmdzLAord2hlcmUgdGhlIG51bWJlciBvZiBzdHJpbmdzIGlzIG51bWJlciBvZiBtdWx0aWxpYiBsZXZlbHMgaW4gdGhlIG9iamVjdAorZGlyZWN0b3J5LiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZSBlbXB0eSBzdHJpbmcuICBUaGlzIHdpbGwKK2RpZmZlciBmcm9tIEBzYW1we01VTFRJU1JDVE9QfSB3aGVuIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UgdHJlZQorKHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuCitAaXRlbSBNVUxUSURJUlMKK0luIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IG9ubHksIEBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcwordG8gdGhlIGxpc3Qgb2YgbXVsdGlsaWIgc3ViZGlyZWN0b3JpZXMuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlCitlbXB0eSBzdHJpbmcuCitAaXRlbSBNVUxUSVNVQkRJUgorQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIHRoZSBpbnN0YWxsZWQgc3ViZGlyZWN0b3J5IG5hbWUgdG8KK3VzZSBmb3IgdGhpcyBzdWJkaXJlY3RvcnksIHdpdGggYSBsZWFkaW5nIEBzYW1wey99LiAgVGhlIGRlZmF1bHQgdmFsdWUKK3Nob2xkIGJlIHRoZSBlbXB0eSBzdHJpbmcuCitAaXRlbSBNVUxUSURPCitAaXRlbXggTVVMVElDTEVBTgorSW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gb25seSwgQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldAordGhlc2UgdmFyaWFibGVzIHRvIGNvbW1hbmRzIHRvIHVzZSB3aGVuIGRvaW5nIGEgcmVjdXJzaXZlIG1ha2UuICBUaGVzZQordmFyaWFibGVzIHNob3VsZCBib3RoIGRlZmF1bHQgdG8gdGhlIHN0cmluZyBAc2FtcHt0cnVlfSwgc28gdGhhdCBieQorZGVmYXVsdCBub3RoaW5nIGhhcHBlbnMuCitAZW5kIHRhYmxlCisKK0FsbCByZWZlcmVuY2VzIHRvIHRoZSBwYXJlbnQgb2YgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgc2hvdWxkIHVzZSB0aGUKK3ZhcmlhYmxlIEBzYW1we01VTFRJU1JDVE9QfS4gIEluc3RlYWQgb2Ygd3JpdGluZyBAc2FtcHskKHNyY2RpcikvLi59LAoreW91IG11c3Qgd3JpdGUgQHNhbXB7JChzcmNkaXIpLyQoTVVMVElTUkNUT1ApLi59LgorCitTaW1pbGFybHksIHJlZmVyZW5jZXMgdG8gdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBzaG91bGQgdXNlCit0aGUgdmFyaWFibGUgQHNhbXB7TVVMVElCVUlMRFRPUH0uCisKK0luIHRoZSBpbnN0YWxsYXRpb24gdGFyZ2V0LCB0aGUgbGlicmFyaWVzIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gdGhlCitzdWJkaXJlY3RvcnkgQHNhbXB7TVVMVElTVUJESVJ9LiAgSW5zdGVhZCBvZiBpbnN0YWxsaW5nCitAc2FtcHskKGxpYmRpcikvbGliZm9vLmF9LCBpbnN0YWxsCitAc2FtcHskKGxpYmRpcikkKE1VTFRJU1VCRElSKS9saWJmb28uYX0uCisKK1RoZSBAZmlsZXtjb25maWctbWwuaW59IHNjcmlwdCBhbHNvIG1vZGlmaWVzIHRoZSB0b3AgbGV2ZWwKK0BmaWxle01ha2VmaWxlfSB0byBhZGQgQHNhbXB7bXVsdGktZG99IGFuZCBAc2FtcHttdWx0aS1jbGVhbn0gdGFyZ2V0cword2hpY2ggYXJlIHVzZWQgd2hlbiBidWlsZGluZyBtdWx0aWxpYnMuCisKK1RoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9IHNob3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcKK2NvbW1hbmQ6CitAc21hbGxleGFtcGxlCitAQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBETz1hbGwgbXVsdGktZG8KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK1RoaXMgYXNzdW1lcyB0aGF0IEBzYW1weyQoRkxBR1NfVE9fUEFTUyl9IGlzIGRlZmluZWQgYXMgYSBzZXQgb2YKK3ZhcmlhYmxlcyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIGludm9jYXRpb24gb2YgQHNhbXB7bWFrZX0uICBUaGlzIHdpbGwKK2J1aWxkIGFsbCB0aGUgbXVsdGlsaWJzLiAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBzYW1we01VTFRJRE99CitpcyBAc2FtcHt0cnVlfSwgc28gYnkgZGVmYXVsdCB0aGlzIGNvbW1hbmQgd2lsbCBkbyBub3RoaW5nLiAgSXQgd2lsbAorb25seSBkbyBzb21ldGhpbmcgaW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtNYWtlZmlsZX0gaWYgbXVsdGlsaWJzIHdlcmUKK2VuYWJsZWQuCisKK1RoZSBAc2FtcHtpbnN0YWxsfSB0YXJnZXQgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgaW5jbHVkZSB0aGUKK2ZvbGxvd2luZyBjb21tYW5kOgorQHNtYWxsZXhhbXBsZQorQEAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgRE89aW5zdGFsbCBtdWx0aS1kbworQGVuZCBzbWFsbGV4YW1wbGUKKworSW4gZ2VuZXJhbCwgYW55IG9wZXJhdGlvbiwgb3RoZXIgdGhhbiBjbGVhbiwgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZAorb24gYWxsIHRoZSBtdWx0aWxpYnMgc2hvdWxkIHVzZSBhIEBzYW1weyQoTVVMVElETyl9IGxpbmUsIHNldHRpbmcgdGhlCit2YXJpYWJsZSBAc2FtcHtET30gdG8gdGhlIHRhcmdldCBvZiBlYWNoIHJlY3Vyc2l2ZSBjYWxsIHRvIEBzYW1we21ha2V9LgorCitUaGUgQHNhbXB7Y2xlYW59IHRhcmdldHMgKEBzYW1we2NsZWFufSwgQHNhbXB7bW9zdGx5Y2xlYW59LCBldGMuKSBzaG91bGQKK3VzZSBAc2FtcHskKE1VTFRJQ0xFQU4pfS4gIEZvciBleGFtcGxlLCB0aGUgQHNhbXB7Y2xlYW59IHRhcmdldCBzaG91bGQKK2RvIHRoaXM6CitAc21hbGxleGFtcGxlCitAQCQoTVVMVElDTEVBTikgRE89Y2xlYW4gbXVsdGktY2xlYW4KK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIEZBUQorQGNoYXB0ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMKKworQHRhYmxlIEBhc2lzCitAaXRlbSBXaGljaCBkbyBJIHJ1biBmaXJzdCwgQHNhbXB7YXV0b2NvbmZ9IG9yIEBzYW1we2F1dG9tYWtlfT8KK0V4Y2VwdCB3aGVuIHlvdSBmaXJzdCBhZGQgYXV0b2NvbmYgb3IgYXV0b21ha2Ugc3VwcG9ydCB0byBhIHBhY2thZ2UsIHlvdQorc2hvdWxkbid0IHJ1biBlaXRoZXIgYnkgaGFuZC4gIEluc3RlYWQsIGNvbmZpZ3VyZSB3aXRoIHRoZQorQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24sIGFuZCBsZXQgQHNhbXB7bWFrZX0gdGFrZSBjYXJlIG9mCitpdC4KKworQGNpbmRleCB1bmRlZmluZWQgbWFjcm9zCitAaXRlbSBAc2FtcHthdXRvY29uZn0gc2F5cyBzb21ldGhpbmcgYWJvdXQgdW5kZWZpbmVkIG1hY3Jvcy4KK1RoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IHdoaWNoIGFyZQorbm90IGRlZmluZWQgYnkgQHNhbXB7YXV0b2NvbmZ9LiAgWW91IG1heSBiZSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZgorQHNhbXB7YXV0b2NvbmZ9OyB0cnkgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgYSBuZXdlciBvbmUuICBNYWtlIHN1cmUgdGhlCituZXdseSBpbnN0YWxsbGVkIEBzYW1we2F1dG9jb25mfSBpcyBmaXJzdCBvbiB5b3VyIEBzYW1we1BBVEh9LiAgQWxzbywKK3NlZSB0aGUgbmV4dCBxdWVzdGlvbi4KKworQGNpbmRleCBAc2FtcHtDWV9HTlVfR0VUVEVYVH0gaW4gQGZpbGV7Y29uZmlndXJlfQorQGNpbmRleCBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9IGluIEBmaWxle2NvbmZpZ3VyZX0KK0BpdGVtIE15IEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IGhhcyBzdHVmZiBsaWtlIEBzYW1we0NZX0dOVV9HRVRURVhUfSBpbiBpdC4KK1RoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IHdoaWNoIHNob3VsZAorYmUgZGVmaW5lZCBpbiB5b3VyIEBmaWxle2FjbG9jYWwubTR9IGZpbGUsIGJ1dCBhcmVuJ3QuICBUaGlzIHVzdWFsbHkKK21lYW5zIHRoYXQgQHNhbXB7YWNsb2NhbH0gd2FzIG5vdCBhYmxlIHRvIGFwcHJvcHJpYXRlIGRlZmluaXRpb25zIG9mIHRoZQorbWFjcm9zLiAgTWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkIGFsbCB0aGUgcGFja2FnZXMgeW91IG5lZWQuCitJbiBwYXJ0aWN1bGFyLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgbGlidG9vbCAodGhpcyBpcyB3aGVyZQorQHNhbXB7QU1fUFJPR19MSUJUT09MfSBpcyBkZWZpbmVkKSBhbmQgZ2V0dGV4dCAodGhpcyBpcyB3aGVyZQorQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGlzIGRlZmluZWQsIGF0IGxlYXN0IGluIHRoZSBDeWdudXMgdmVyc2lvbiBvZgorZ2V0dGV4dCkuCisKK0BjaW5kZXggQGZpbGV7TWFrZWZpbGV9LCBnYXJiYWdlIGNoYXJhY3RlcnMKK0BpdGVtIE15IEBmaWxle01ha2VmaWxlfSBoYXMgQHNhbXB7QEB9IGNoYXJhY3RlcnMgaW4gaXQuCitUaGlzIG1heSBtZWFuIHRoYXQgeW91IHRyaWVkIHRvIHVzZSBhbiBhdXRvY29uZiBzdWJzdGl0dXRpb24gaW4geW91cgorQGZpbGV7TWFrZWZpbGUuaW59IHdpdGhvdXQgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSBAc2FtcHtBQ19TVUJTVH0gY2FsbAordG8geW91ciBAZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIE9yIGl0IG1heSBqdXN0IG1lYW4gdGhhdCB5b3UgbmVlZCB0bworcmVidWlsZCBAZmlsZXtNYWtlZmlsZX0gaW4geW91ciBidWlsZCBkaXJlY3RvcnkuICBUbyByZWJ1aWxkCitAZmlsZXtNYWtlZmlsZX0gZnJvbSBAZmlsZXtNYWtlZmlsZS5pbn0sIHJ1biB0aGUgc2hlbGwgc2NyaXB0CitAZmlsZXtjb25maWcuc3RhdHVzfSB3aXRoIG5vIGFyZ3VtZW50cy4gIElmIHlvdSBuZWVkIHRvIGZvcmNlCitAZmlsZXtjb25maWd1cmV9IHRvIHJ1biBhZ2FpbiwgZmlyc3QgcnVuIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfS4KK1RoZXNlIHJ1bnMgYXJlIG5vcm1hbGx5IGRvbmUgYXV0b21hdGljYWxseSBieSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cywKK2J1dCBpZiB5b3VyIEBmaWxle01ha2VmaWxlfSBoYXMgZ290dGVuIG1lc3NlZCB1cCB5b3UnbGwgbmVlZCB0byBoZWxwCit0aGVtIGFsb25nLgorCitAY2luZGV4IEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfQorQGl0ZW0gV2h5IGRvIEkgaGF2ZSB0byBydW4gYm90aCBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30gYW5kIEBzYW1we2NvbmZpZy5zdGF0dXN9PworTm9ybWFsbHksIHlvdSBkb24ndDsgdGhleSB3aWxsIGJlIHJ1biBhdXRvbWF0aWNhbGx5IGJ5IEBmaWxle01ha2VmaWxlfQordGFyZ2V0cy4gIElmIHlvdSBkbyBuZWVkIHRvIHJ1biB0aGVtLCB1c2UgQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9Cit0byBydW4gdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIGFzIHRoZQorZmlyc3QgdGltZSB5b3UgcmFuIGl0LiAgVXNlIEBzYW1we2NvbmZpZy5zdGF0dXN9ICh3aXRoIG5vIGFyZ3VtZW50cykgdG8KK3JlZ2VuZXJhdGUgYWxsIGZpbGVzIChAZmlsZXtNYWtlZmlsZX0sIEBmaWxle2NvbmZpZy5ofSwgZXRjLikgYmFzZWQgb24KK3RoZSByZXN1bHRzIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgVGhlIHR3byBjYXNlcyBhcmUgc2VwYXJhdGUgYmVjYXVzZQoraXQgaXNuJ3QgYWx3YXlzIG5lY2Vzc2FyeSB0byByZWdlbmVyYXRlIGFsbCB0aGUgZmlsZXMgYWZ0ZXIgcnVubmluZworQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9LiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXRzIGdlbmVyYXRlZAorYnkgYXV0b21ha2Ugd2lsbCB1c2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBAc2FtcHtDT05GSUdfRklMRVN9IGFuZAorQHNhbXB7Q09ORklHX0hFQURFUlN9IHRvIG9ubHkgcmVnZW5lcmF0ZSBmaWxlcyBhcyB0aGV5IGFyZSBuZWVkZWQuCisKK0BpdGVtIFdoYXQgaXMgdGhlIEN5Z251cyB0cmVlPworVGhlIEN5Z251cyB0cmVlIGlzIHVzZWQgZm9yIHZhcmlvdXMgcGFja2FnZXMgaW5jbHVkaW5nIGdkYiwgdGhlIEdOVQorYmludXRpbHMsIGFuZCBlZ2NzLiAgSXQgaXMgYWxzbywgb2YgY291cnNlLCB1c2VkIGZvciBDeWdudXMgcmVsZWFzZXMuCitJdCBpcyB0aGUgYnVpbGQgc3lzdGVtIHdoaWNoIHdhcyBkZXZlbG9wZWQgYXQgQ3lnbnVzLCB1c2luZyB0aGUgQ3lnbnVzCitjb25maWd1cmUgc2NyaXB0LiAgSXQgcGVybWl0cyBidWlsZGluZyBtYW55IGRpZmZlcmVudCBwYWNrYWdlcyB3aXRoIGEKK3NpbmdsZSBjb25maWd1cmUgYW5kIG1ha2UuICBUaGUgY29uZmlndXJlIHNjcmlwdHMgaW4gdGhlIHRyZWUgYXJlIGJlaW5nCitjb252ZXJ0ZWQgdG8gYXV0b2NvbmYsIGJ1dCB0aGUgZ2VuZXJhbCBidWlsZCBzdHJ1Y3R1cmUgcmVtYWlucyBpbnRhY3QuCisKK0BpdGVtIFdoeSBkbyBJIGhhdmUgdG8ga2VlcCByZWJ1aWxkaW5nIGFuZCByZWluc3RhbGxpbmcgdGhlIHRvb2xzPworSSBrbm93LCBpdCdzIGEgcGFpbi4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBidWdzIGluIHRoZSB0b29scwordGhlbXNlbHZlcyB3aGljaCBuZWVkIHRvIGJlIGZpeGVkLCBhbmQgZWFjaCB0aW1lIHRoYXQgaGFwcGVucyBldmVyeWJvZHkKK3dobyB1c2VzIHRoZSB0b29scyBuZWVkIHRvIHJlaW5zdGFsbCBuZXcgdmVyc2lvbnMgb2YgdGhlbS4gIEkgZG9uJ3Qga25vdworaWYgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSBjbGV2ZXIgZml4IHVudGlsIHRoZSB0b29scyBzdGFiaWxpemUuCisKK0BpdGVtIFdoeSBub3QganVzdCBoYXZlIGEgQ3lnbnVzIHRyZWUgQHNhbXB7bWFrZX0gdGFyZ2V0IHRvIHVwZGF0ZSB0aGUgdG9vbHM/CitUaGUgdG9vbHMgdW5mb3J0dW5hdGVseSBuZWVkIHRvIGJlIGluc3RhbGxlZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZC4KK1RoYXQgbWVhbnMgdGhhdCB0aGV5IG11c3QgYmUgYnVpbHQgdXNpbmcgYW4gYXBwcm9wcmlhdGUgcHJlZml4LCBhbmQgaXQKK3NlZW1zIHVud2lzZSB0byBhc3N1bWUgdGhhdCBldmVyeSBjb25maWd1cmF0aW9uIHVzZXMgYW4gYXBwcm9wcmlhdGUKK3ByZWZpeC4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhlbSB3b3JrIGluIHBsYWNlLCBvciBpdCBtaWdodCBiZQorcG9zc2libGUgdG8gaW5zdGFsbCB0aGVtIGluIHNvbWUgc3ViZGlyZWN0b3J5OyBzbyBmYXIgdGhlc2UgYXBwcm9hY2hlcworaGF2ZSBub3QgYmVlbiBpbXBsZW1lbnRlZC4KK0BlbmQgdGFibGUKKworQG5vZGUgSW5kZXgKK0B1bm51bWJlcmVkIEluZGV4CisKK0BwcmludGluZGV4IGNwCisKK0Bjb250ZW50cworQGJ5ZQpkaWZmIC0tZ2l0IGEvZXRjL21ha2Utc3Rkcy50ZXhpIGIvZXRjL21ha2Utc3Rkcy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDk3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvbWFrZS1zdGRzLnRleGkKQEAgLTAsMCArMSw5MTQgQEAKK0Bjb21tZW50IFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBib3RoIHN0YW5kYXJkcy50ZXhpIGFuZCBtYWtlLnRleGluZm8uCitAY29tbWVudCBJdCB3YXMgYnJva2VuIG91dCBvZiBzdGFuZGFyZHMudGV4aSBvbiAxLzYvOTMgYnkgcm9sYW5kLgorCitAbm9kZSBNYWtlZmlsZSBDb252ZW50aW9ucworQGNoYXB0ZXIgTWFrZWZpbGUgQ29udmVudGlvbnMKK0Bjb21tZW50IHN0YW5kYXJkcy50ZXhpIGRvZXMgbm90IHByaW50IGFuIGluZGV4LCBidXQgbWFrZS50ZXhpbmZvIGRvZXMuCitAY2luZGV4IG1ha2VmaWxlLCBjb252ZW50aW9ucyBmb3IKK0BjaW5kZXggY29udmVudGlvbnMgZm9yIG1ha2VmaWxlcworQGNpbmRleCBzdGFuZGFyZHMgZm9yIG1ha2VmaWxlcworCitUaGlzCitAaWZpbmZvCitub2RlCitAZW5kIGlmaW5mbworQGlmdGV4CitAaWZzZXQgQ09ERVNURAorc2VjdGlvbgorQGVuZCBpZnNldAorQGlmY2xlYXIgQ09ERVNURAorY2hhcHRlcgorQGVuZCBpZmNsZWFyCitAZW5kIGlmdGV4CitkZXNjcmliZXMgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgdGhlIE1ha2VmaWxlcyBmb3IgR05VIHByb2dyYW1zLgorCitAbWVudQorKiBNYWtlZmlsZSBCYXNpY3M6OgkJR2VuZXJhbCBDb252ZW50aW9ucyBmb3IgTWFrZWZpbGVzCisqIFV0aWxpdGllcyBpbiBNYWtlZmlsZXM6OglVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCisqIENvbW1hbmQgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBmb3IgU3BlY2lmeWluZyBDb21tYW5kcworKiBEaXJlY3RvcnkgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBmb3IgSW5zdGFsbGF0aW9uIERpcmVjdG9yaWVzCisqIFN0YW5kYXJkIFRhcmdldHM6OgkJU3RhbmRhcmQgVGFyZ2V0cyBmb3IgVXNlcnMKKyogSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXM6OiAgVGhyZWUgY2F0ZWdvcmllcyBvZiBjb21tYW5kcyBpbiB0aGUgYGluc3RhbGwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogbm9ybWFsLCBwcmUtaW5zdGFsbCBhbmQgcG9zdC1pbnN0YWxsLgorQGVuZCBtZW51CisKK0Bub2RlIE1ha2VmaWxlIEJhc2ljcworQHNlY3Rpb24gR2VuZXJhbCBDb252ZW50aW9ucyBmb3IgTWFrZWZpbGVzCisKK0V2ZXJ5IE1ha2VmaWxlIHNob3VsZCBjb250YWluIHRoaXMgbGluZToKKworQGV4YW1wbGUKK1NIRUxMID0gL2Jpbi9zaAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAordG8gYXZvaWQgdHJvdWJsZSBvbiBzeXN0ZW1zIHdoZXJlIHRoZSBAY29kZXtTSEVMTH0gdmFyaWFibGUgbWlnaHQgYmUKK2luaGVyaXRlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIChUaGlzIGlzIG5ldmVyIGEgcHJvYmxlbSB3aXRoIEdOVQorQGNvZGV7bWFrZX0uKQorCitEaWZmZXJlbnQgQGNvZGV7bWFrZX0gcHJvZ3JhbXMgaGF2ZSBpbmNvbXBhdGlibGUgc3VmZml4IGxpc3RzIGFuZAoraW1wbGljaXQgcnVsZXMsIGFuZCB0aGlzIHNvbWV0aW1lcyBjcmVhdGVzIGNvbmZ1c2lvbiBvciBtaXNiZWhhdmlvci4gIFNvCitpdCBpcyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlIHN1ZmZpeCBsaXN0IGV4cGxpY2l0bHkgdXNpbmcgb25seSB0aGUKK3N1ZmZpeGVzIHlvdSBuZWVkIGluIHRoZSBwYXJ0aWN1bGFyIE1ha2VmaWxlLCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5vCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitUaGUgZmlyc3QgbGluZSBjbGVhcnMgb3V0IHRoZSBzdWZmaXggbGlzdCwgdGhlIHNlY29uZCBpbnRyb2R1Y2VzIGFsbAorc3VmZml4ZXMgd2hpY2ggbWF5IGJlIHN1YmplY3QgdG8gaW1wbGljaXQgcnVsZXMgaW4gdGhpcyBNYWtlZmlsZS4KKworRG9uJ3QgYXNzdW1lIHRoYXQgQGZpbGV7Ln0gaXMgaW4gdGhlIHBhdGggZm9yIGNvbW1hbmQgZXhlY3V0aW9uLiAgV2hlbgoreW91IG5lZWQgdG8gcnVuIHByb2dyYW1zIHRoYXQgYXJlIGEgcGFydCBvZiB5b3VyIHBhY2thZ2UgZHVyaW5nIHRoZQorbWFrZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IGl0IHVzZXMgQGZpbGV7Li99IGlmIHRoZSBwcm9ncmFtIGlzIGJ1aWx0IGFzCitwYXJ0IG9mIHRoZSBtYWtlIG9yIEBmaWxleyQoc3JjZGlyKS99IGlmIHRoZSBmaWxlIGlzIGFuIHVuY2hhbmdpbmcgcGFydAorb2YgdGhlIHNvdXJjZSBjb2RlLiAgV2l0aG91dCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMsIHRoZSBjdXJyZW50IHNlYXJjaAorcGF0aCBpcyB1c2VkLgorCitUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBAZmlsZXsuL30gKHRoZSBAZGZue2J1aWxkIGRpcmVjdG9yeX0pIGFuZAorQGZpbGV7JChzcmNkaXIpL30gKHRoZSBAZGZue3NvdXJjZSBkaXJlY3Rvcnl9KSBpcyBpbXBvcnRhbnQgYmVjYXVzZQordXNlcnMgY2FuIGJ1aWxkIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5IHVzaW5nIHRoZSBAc2FtcHstLXNyY2Rpcn0gb3B0aW9uCit0byBAZmlsZXtjb25maWd1cmV9LiAgQSBydWxlIG9mIHRoZSBmb3JtOgorCitAc21hbGxleGFtcGxlCitmb28uMSA6IGZvby5tYW4gc2Vkc2NyaXB0CisgICAgICAgIHNlZCAtZSBzZWRzY3JpcHQgZm9vLm1hbiA+IGZvby4xCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK3dpbGwgZmFpbCB3aGVuIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMgbm90IHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlCitAZmlsZXtmb28ubWFufSBhbmQgQGZpbGV7c2Vkc2NyaXB0fSBhcmUgaW4gdGhlIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorCitXaGVuIHVzaW5nIEdOVSBAY29kZXttYWtlfSwgcmVseWluZyBvbiBAc2FtcHtWUEFUSH0gdG8gZmluZCB0aGUgc291cmNlCitmaWxlIHdpbGwgd29yayBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHNpbmdsZSBkZXBlbmRlbmN5IGZpbGUsCitzaW5jZSB0aGUgQGNvZGV7bWFrZX0gYXV0b21hdGljIHZhcmlhYmxlIEBzYW1weyQ8fSB3aWxsIHJlcHJlc2VudCB0aGUKK3NvdXJjZSBmaWxlIHdoZXJldmVyIGl0IGlzLiAgKE1hbnkgdmVyc2lvbnMgb2YgQGNvZGV7bWFrZX0gc2V0IEBzYW1weyQ8fQorb25seSBpbiBpbXBsaWNpdCBydWxlcy4pICBBIE1ha2VmaWxlIHRhcmdldCBsaWtlCisKK0BzbWFsbGV4YW1wbGUKK2Zvby5vIDogYmFyLmMKKyAgICAgICAgJChDQykgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAtYyBiYXIuYyAtbyBmb28ubworQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitzaG91bGQgaW5zdGVhZCBiZSB3cml0dGVuIGFzCisKK0BzbWFsbGV4YW1wbGUKK2Zvby5vIDogYmFyLmMKKyAgICAgICAgJChDQykgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQEAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAoraW4gb3JkZXIgdG8gYWxsb3cgQHNhbXB7VlBBVEh9IHRvIHdvcmsgY29ycmVjdGx5LiAgV2hlbiB0aGUgdGFyZ2V0IGhhcworbXVsdGlwbGUgZGVwZW5kZW5jaWVzLCB1c2luZyBhbiBleHBsaWNpdCBAc2FtcHskKHNyY2Rpcil9IGlzIHRoZSBlYXNpZXN0Cit3YXkgdG8gbWFrZSB0aGUgcnVsZSB3b3JrIHdlbGwuICBGb3IgZXhhbXBsZSwgdGhlIHRhcmdldCBhYm92ZSBmb3IKK0BmaWxle2Zvby4xfSBpcyBiZXN0IHdyaXR0ZW4gYXM6CisKK0BzbWFsbGV4YW1wbGUKK2Zvby4xIDogZm9vLm1hbiBzZWRzY3JpcHQKKyAgICAgICAgc2VkIC1lICQoc3JjZGlyKS9zZWRzY3JpcHQgJChzcmNkaXIpL2Zvby5tYW4gPiAkQEAKK0BlbmQgc21hbGxleGFtcGxlCisKK0dOVSBkaXN0cmlidXRpb25zIHVzdWFsbHkgY29udGFpbiBzb21lIGZpbGVzIHdoaWNoIGFyZSBub3Qgc291cmNlCitmaWxlcy0tLWZvciBleGFtcGxlLCBJbmZvIGZpbGVzLCBhbmQgdGhlIG91dHB1dCBmcm9tIEF1dG9jb25mLCBBdXRvbWFrZSwKK0Jpc29uIG9yIEZsZXguICBTaW5jZSB0aGVzZSBmaWxlcyBub3JtYWxseSBhcHBlYXIgaW4gdGhlIHNvdXJjZQorZGlyZWN0b3J5LCB0aGV5IHNob3VsZCBhbHdheXMgYXBwZWFyIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCBub3QgaW4gdGhlCitidWlsZCBkaXJlY3RvcnkuICBTbyBNYWtlZmlsZSBydWxlcyB0byB1cGRhdGUgdGhlbSBzaG91bGQgcHV0IHRoZQordXBkYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKworSG93ZXZlciwgaWYgYSBmaWxlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgZGlzdHJpYnV0aW9uLCB0aGVuIHRoZQorTWFrZWZpbGUgc2hvdWxkIG5vdCBwdXQgaXQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgYnVpbGRpbmcgYQorcHJvZ3JhbSBpbiBvcmRpbmFyeSBjaXJjdW1zdGFuY2VzIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBzb3VyY2UgZGlyZWN0b3J5CitpbiBhbnkgd2F5LgorCitUcnkgdG8gbWFrZSB0aGUgYnVpbGQgYW5kIGluc3RhbGxhdGlvbiB0YXJnZXRzLCBhdCBsZWFzdCAoYW5kIGFsbCB0aGVpcgorc3VidGFyZ2V0cykgd29yayBjb3JyZWN0bHkgd2l0aCBhIHBhcmFsbGVsIEBjb2Rle21ha2V9LgorCitAbm9kZSBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCitAc2VjdGlvbiBVdGlsaXRpZXMgaW4gTWFrZWZpbGVzCisKK1dyaXRlIHRoZSBNYWtlZmlsZSBjb21tYW5kcyAoYW5kIGFueSBzaGVsbCBzY3JpcHRzLCBzdWNoIGFzCitAY29kZXtjb25maWd1cmV9KSB0byBydW4gaW4gQGNvZGV7c2h9LCBub3QgaW4gQGNvZGV7Y3NofS4gIERvbid0IHVzZSBhbnkKK3NwZWNpYWwgZmVhdHVyZXMgb2YgQGNvZGV7a3NofSBvciBAY29kZXtiYXNofS4KKworVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IGFuZCB0aGUgTWFrZWZpbGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGFuZAoraW5zdGFsbGF0aW9uIHNob3VsZCBub3QgdXNlIGFueSB1dGlsaXRpZXMgZGlyZWN0bHkgZXhjZXB0IHRoZXNlOgorCitAYyBkZCBmaW5kCitAYyBndW56aXAgZ3ppcCBtZDVzdW0KK0BjIG1rZmlmbyBta25vZCB0ZWUgdW5hbWUgCisKK0BleGFtcGxlCitjYXQgY21wIGNwIGRpZmYgZWNobyBlZ3JlcCBleHByIGZhbHNlIGdyZXAgaW5zdGFsbC1pbmZvCitsbiBscyBta2RpciBtdiBwd2Qgcm0gcm1kaXIgc2VkIHNsZWVwIHNvcnQgdGFyIHRlc3QgdG91Y2ggdHJ1ZQorQGVuZCBleGFtcGxlCisKK1RoZSBjb21wcmVzc2lvbiBwcm9ncmFtIEBjb2Rle2d6aXB9IGNhbiBiZSB1c2VkIGluIHRoZSBAY29kZXtkaXN0fSBydWxlLgorCitTdGljayB0byB0aGUgZ2VuZXJhbGx5IHN1cHBvcnRlZCBvcHRpb25zIGZvciB0aGVzZSBwcm9ncmFtcy4gIEZvcgorZXhhbXBsZSwgZG9uJ3QgdXNlIEBzYW1we21rZGlyIC1wfSwgY29udmVuaWVudCBhcyBpdCBtYXkgYmUsIGJlY2F1c2UKK21vc3Qgc3lzdGVtcyBkb24ndCBzdXBwb3J0IGl0LgorCitJdCBpcyBhIGdvb2QgaWRlYSB0byBhdm9pZCBjcmVhdGluZyBzeW1ib2xpYyBsaW5rcyBpbiBtYWtlZmlsZXMsIHNpbmNlIGEKK2ZldyBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgdGhlbS4KKworVGhlIE1ha2VmaWxlIHJ1bGVzIGZvciBidWlsZGluZyBhbmQgaW5zdGFsbGF0aW9uIGNhbiBhbHNvIHVzZSBjb21waWxlcnMKK2FuZCByZWxhdGVkIHByb2dyYW1zLCBidXQgc2hvdWxkIGRvIHNvIHZpYSBAY29kZXttYWtlfSB2YXJpYWJsZXMgc28gdGhhdCB0aGUKK3VzZXIgY2FuIHN1YnN0aXR1dGUgYWx0ZXJuYXRpdmVzLiAgSGVyZSBhcmUgc29tZSBvZiB0aGUgcHJvZ3JhbXMgd2UKK21lYW46CisKK0BleGFtcGxlCithciBiaXNvbiBjYyBmbGV4IGluc3RhbGwgbGQgbGRjb25maWcgbGV4CittYWtlIG1ha2VpbmZvIHJhbmxpYiB0ZXhpMmR2aSB5YWNjCitAZW5kIGV4YW1wbGUKKworVXNlIHRoZSBmb2xsb3dpbmcgQGNvZGV7bWFrZX0gdmFyaWFibGVzIHRvIHJ1biB0aG9zZSBwcm9ncmFtczoKKworQGV4YW1wbGUKKyQoQVIpICQoQklTT04pICQoQ0MpICQoRkxFWCkgJChJTlNUQUxMKSAkKExEKSAkKExEQ09ORklHKSAkKExFWCkKKyQoTUFLRSkgJChNQUtFSU5GTykgJChSQU5MSUIpICQoVEVYSTJEVkkpICQoWUFDQykKK0BlbmQgZXhhbXBsZQorCitXaGVuIHlvdSB1c2UgQGNvZGV7cmFubGlifSBvciBAY29kZXtsZGNvbmZpZ30sIHlvdSBzaG91bGQgbWFrZSBzdXJlCitub3RoaW5nIGJhZCBoYXBwZW5zIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGUgcHJvZ3JhbSBpbiBxdWVzdGlvbi4KK0FycmFuZ2UgdG8gaWdub3JlIGFuIGVycm9yIGZyb20gdGhhdCBjb21tYW5kLCBhbmQgcHJpbnQgYSBtZXNzYWdlIGJlZm9yZQordGhlIGNvbW1hbmQgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGZhaWx1cmUgb2YgdGhpcyBjb21tYW5kIGRvZXMgbm90IG1lYW4KK2EgcHJvYmxlbS4gIChUaGUgQXV0b2NvbmYgQHNhbXB7QUNfUFJPR19SQU5MSUJ9IG1hY3JvIGNhbiBoZWxwIHdpdGgKK3RoaXMuKQorCitJZiB5b3UgdXNlIHN5bWJvbGljIGxpbmtzLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBhIGZhbGxiYWNrIGZvciBzeXN0ZW1zCit0aGF0IGRvbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCisKK0FkZGl0aW9uYWwgdXRpbGl0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdmlhIE1ha2UgdmFyaWFibGVzIGFyZToKKworQGV4YW1wbGUKK2NoZ3JwIGNobW9kIGNob3duIG1rbm9kCitAZW5kIGV4YW1wbGUKKworSXQgaXMgb2sgdG8gdXNlIG90aGVyIHV0aWxpdGllcyBpbiBNYWtlZmlsZSBwb3J0aW9ucyAob3Igc2NyaXB0cykKK2ludGVuZGVkIG9ubHkgZm9yIHBhcnRpY3VsYXIgc3lzdGVtcyB3aGVyZSB5b3Uga25vdyB0aG9zZSB1dGlsaXRpZXMKK2V4aXN0LgorCitAbm9kZSBDb21tYW5kIFZhcmlhYmxlcworQHNlY3Rpb24gVmFyaWFibGVzIGZvciBTcGVjaWZ5aW5nIENvbW1hbmRzCisKK01ha2VmaWxlcyBzaG91bGQgcHJvdmlkZSB2YXJpYWJsZXMgZm9yIG92ZXJyaWRpbmcgY2VydGFpbiBjb21tYW5kcywgb3B0aW9ucywKK2FuZCBzbyBvbi4KKworSW4gcGFydGljdWxhciwgeW91IHNob3VsZCBydW4gbW9zdCB1dGlsaXR5IHByb2dyYW1zIHZpYSB2YXJpYWJsZXMuCitUaHVzLCBpZiB5b3UgdXNlIEJpc29uLCBoYXZlIGEgdmFyaWFibGUgbmFtZWQgQGNvZGV7QklTT059IHdob3NlIGRlZmF1bHQKK3ZhbHVlIGlzIHNldCB3aXRoIEBzYW1we0JJU09OID0gYmlzb259LCBhbmQgcmVmZXIgdG8gaXQgd2l0aAorQGNvZGV7JChCSVNPTil9IHdoZW5ldmVyIHlvdSBuZWVkIHRvIHVzZSBCaXNvbi4KKworRmlsZSBtYW5hZ2VtZW50IHV0aWxpdGllcyBzdWNoIGFzIEBjb2Rle2xufSwgQGNvZGV7cm19LCBAY29kZXttdn0sIGFuZAorc28gb24sIG5lZWQgbm90IGJlIHJlZmVycmVkIHRvIHRocm91Z2ggdmFyaWFibGVzIGluIHRoaXMgd2F5LCBzaW5jZSB1c2VycworZG9uJ3QgbmVlZCB0byByZXBsYWNlIHRoZW0gd2l0aCBvdGhlciBwcm9ncmFtcy4KKworRWFjaCBwcm9ncmFtLW5hbWUgdmFyaWFibGUgc2hvdWxkIGNvbWUgd2l0aCBhbiBvcHRpb25zIHZhcmlhYmxlIHRoYXQgaXMKK3VzZWQgdG8gc3VwcGx5IG9wdGlvbnMgdG8gdGhlIHByb2dyYW0uICBBcHBlbmQgQHNhbXB7RkxBR1N9IHRvIHRoZQorcHJvZ3JhbS1uYW1lIHZhcmlhYmxlIG5hbWUgdG8gZ2V0IHRoZSBvcHRpb25zIHZhcmlhYmxlIG5hbWUtLS1mb3IKK2V4YW1wbGUsIEBjb2Rle0JJU09ORkxBR1N9LiAgKFRoZSBuYW1lcyBAY29kZXtDRkxBR1N9IGZvciB0aGUgQworY29tcGlsZXIsIEBjb2Rle1lGTEFHU30gZm9yIHlhY2MsIGFuZCBAY29kZXtMRkxBR1N9IGZvciBsZXgsIGFyZQorZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUsIGJ1dCB3ZSBrZWVwIHRoZW0gYmVjYXVzZSB0aGV5IGFyZSBzdGFuZGFyZC4pCitVc2UgQGNvZGV7Q1BQRkxBR1N9IGluIGFueSBjb21waWxhdGlvbiBjb21tYW5kIHRoYXQgcnVucyB0aGUKK3ByZXByb2Nlc3NvciwgYW5kIHVzZSBAY29kZXtMREZMQUdTfSBpbiBhbnkgY29tcGlsYXRpb24gY29tbWFuZCB0aGF0Citkb2VzIGxpbmtpbmcgYXMgd2VsbCBhcyBpbiBhbnkgZGlyZWN0IHVzZSBvZiBAY29kZXtsZH0uCisKK0lmIHRoZXJlIGFyZSBDIGNvbXBpbGVyIG9wdGlvbnMgdGhhdCBAZW1waHttdXN0fSBiZSB1c2VkIGZvciBwcm9wZXIKK2NvbXBpbGF0aW9uIG9mIGNlcnRhaW4gZmlsZXMsIGRvIG5vdCBpbmNsdWRlIHRoZW0gaW4gQGNvZGV7Q0ZMQUdTfS4KK1VzZXJzIGV4cGVjdCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgQGNvZGV7Q0ZMQUdTfSBmcmVlbHkgdGhlbXNlbHZlcy4KK0luc3RlYWQsIGFycmFuZ2UgdG8gcGFzcyB0aGUgbmVjZXNzYXJ5IG9wdGlvbnMgdG8gdGhlIEMgY29tcGlsZXIKK2luZGVwZW5kZW50bHkgb2YgQGNvZGV7Q0ZMQUdTfSwgYnkgd3JpdGluZyB0aGVtIGV4cGxpY2l0bHkgaW4gdGhlCitjb21waWxhdGlvbiBjb21tYW5kcyBvciBieSBkZWZpbmluZyBhbiBpbXBsaWNpdCBydWxlLCBsaWtlIHRoaXM6CisKK0BzbWFsbGV4YW1wbGUKK0NGTEFHUyA9IC1nCitBTExfQ0ZMQUdTID0gLUkuICQoQ0ZMQUdTKQorLmMubzoKKyAgICAgICAgJChDQykgLWMgJChDUFBGTEFHUykgJChBTExfQ0ZMQUdTKSAkPAorQGVuZCBzbWFsbGV4YW1wbGUKKworRG8gaW5jbHVkZSB0aGUgQHNhbXB7LWd9IG9wdGlvbiBpbiBAY29kZXtDRkxBR1N9LCBiZWNhdXNlIHRoYXQgaXMgbm90CitAZW1waHtyZXF1aXJlZH0gZm9yIHByb3BlciBjb21waWxhdGlvbi4gIFlvdSBjYW4gY29uc2lkZXIgaXQgYSBkZWZhdWx0Cit0aGF0IGlzIG9ubHkgcmVjb21tZW5kZWQuICBJZiB0aGUgcGFja2FnZSBpcyBzZXQgdXAgc28gdGhhdCBpdCBpcworY29tcGlsZWQgd2l0aCBHQ0MgYnkgZGVmYXVsdCwgdGhlbiB5b3UgbWlnaHQgYXMgd2VsbCBpbmNsdWRlIEBzYW1wey1PfQoraW4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7Q0ZMQUdTfSBhcyB3ZWxsLgorCitQdXQgQGNvZGV7Q0ZMQUdTfSBsYXN0IGluIHRoZSBjb21waWxhdGlvbiBjb21tYW5kLCBhZnRlciBvdGhlciB2YXJpYWJsZXMKK2NvbnRhaW5pbmcgY29tcGlsZXIgb3B0aW9ucywgc28gdGhlIHVzZXIgY2FuIHVzZSBAY29kZXtDRkxBR1N9IHRvCitvdmVycmlkZSB0aGUgb3RoZXJzLgorCitAY29kZXtDRkxBR1N9IHNob3VsZCBiZSB1c2VkIGluIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlIEMgY29tcGlsZXIsCitib3RoIHRob3NlIHdoaWNoIGRvIGNvbXBpbGF0aW9uIGFuZCB0aG9zZSB3aGljaCBkbyBsaW5raW5nLgorCitFdmVyeSBNYWtlZmlsZSBzaG91bGQgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtJTlNUQUxMfSwgd2hpY2ggaXMgdGhlCitiYXNpYyBjb21tYW5kIGZvciBpbnN0YWxsaW5nIGEgZmlsZSBpbnRvIHRoZSBzeXN0ZW0uCisKK0V2ZXJ5IE1ha2VmaWxlIHNob3VsZCBhbHNvIGRlZmluZSB0aGUgdmFyaWFibGVzIEBjb2Rle0lOU1RBTExfUFJPR1JBTX0KK2FuZCBAY29kZXtJTlNUQUxMX0RBVEF9LiAgKFRoZSBkZWZhdWx0IGZvciBlYWNoIG9mIHRoZXNlIHNob3VsZCBiZQorQGNvZGV7JChJTlNUQUxMKX0uKSAgVGhlbiBpdCBzaG91bGQgdXNlIHRob3NlIHZhcmlhYmxlcyBhcyB0aGUgY29tbWFuZHMKK2ZvciBhY3R1YWwgaW5zdGFsbGF0aW9uLCBmb3IgZXhlY3V0YWJsZXMgYW5kIG5vbmV4ZWN1dGFibGVzCityZXNwZWN0aXZlbHkuICBVc2UgdGhlc2UgdmFyaWFibGVzIGFzIGZvbGxvd3M6CisKK0BleGFtcGxlCiskKElOU1RBTExfUFJPR1JBTSkgZm9vICQoYmluZGlyKS9mb28KKyQoSU5TVEFMTF9EQVRBKSBsaWJmb28uYSAkKGxpYmRpcikvbGliZm9vLmEKK0BlbmQgZXhhbXBsZQorCitPcHRpb25hbGx5LCB5b3UgbWF5IHByZXBlbmQgdGhlIHZhbHVlIG9mIEBjb2Rle0RFU1RESVJ9IHRvIHRoZSB0YXJnZXQKK2ZpbGVuYW1lLiAgRG9pbmcgdGhpcyBhbGxvd3MgdGhlIGluc3RhbGxlciB0byBjcmVhdGUgYSBzbmFwc2hvdCBvZiB0aGUKK2luc3RhbGxhdGlvbiB0byBiZSBjb3BpZWQgb250byB0aGUgcmVhbCB0YXJnZXQgZmlsZXN5c3RlbSBsYXRlci4gIERvIG5vdAorc2V0IHRoZSB2YWx1ZSBvZiBAY29kZXtERVNURElSfSBpbiB5b3VyIE1ha2VmaWxlLCBhbmQgZG8gbm90IGluY2x1ZGUgaXQKK2luIGFueSBpbnN0YWxsZWQgZmlsZXMuICBXaXRoIHN1cHBvcnQgZm9yIEBjb2Rle0RFU1RESVJ9LCB0aGUgYWJvdmUKK2V4YW1wbGVzIGJlY29tZToKKworQGV4YW1wbGUKKyQoSU5TVEFMTF9QUk9HUkFNKSBmb28gJChERVNURElSKSQoYmluZGlyKS9mb28KKyQoSU5TVEFMTF9EQVRBKSBsaWJmb28uYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmZvby5hCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitBbHdheXMgdXNlIGEgZmlsZSBuYW1lLCBub3QgYSBkaXJlY3RvcnkgbmFtZSwgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBvZgordGhlIGluc3RhbGxhdGlvbiBjb21tYW5kcy4gIFVzZSBhIHNlcGFyYXRlIGNvbW1hbmQgZm9yIGVhY2ggZmlsZSB0byBiZQoraW5zdGFsbGVkLgorCitAbm9kZSBEaXJlY3RvcnkgVmFyaWFibGVzCitAc2VjdGlvbiBWYXJpYWJsZXMgZm9yIEluc3RhbGxhdGlvbiBEaXJlY3RvcmllcworCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgc2hvdWxkIGFsd2F5cyBiZSBuYW1lZCBieSB2YXJpYWJsZXMsIHNvIGl0IGlzCitlYXN5IHRvIGluc3RhbGwgaW4gYSBub25zdGFuZGFyZCBwbGFjZS4gIFRoZSBzdGFuZGFyZCBuYW1lcyBmb3IgdGhlc2UKK3ZhcmlhYmxlcyBhcmUgZGVzY3JpYmVkIGJlbG93LiAgVGhleSBhcmUgYmFzZWQgb24gYSBzdGFuZGFyZCBmaWxlc3lzdGVtCitsYXlvdXQ7IHZhcmlhbnRzIG9mIGl0IGFyZSB1c2VkIGluIFNWUjQsIDQuNEJTRCwgTGludXgsIFVsdHJpeCB2NCwgYW5kCitvdGhlciBtb2Rlcm4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK1RoZXNlIHR3byB2YXJpYWJsZXMgc2V0IHRoZSByb290IGZvciB0aGUgaW5zdGFsbGF0aW9uLiAgQWxsIHRoZSBvdGhlcgoraW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHNob3VsZCBiZSBzdWJkaXJlY3RvcmllcyBvZiBvbmUgb2YgdGhlc2UgdHdvLAorYW5kIG5vdGhpbmcgc2hvdWxkIGJlIGRpcmVjdGx5IGluc3RhbGxlZCBpbnRvIHRoZXNlIHR3byBkaXJlY3Rvcmllcy4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBwcmVmaXgKK0EgcHJlZml4IHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgdmFyaWFibGVzIGxpc3RlZAorYmVsb3cuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtwcmVmaXh9IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsfS4KK1doZW4gYnVpbGRpbmcgdGhlIGNvbXBsZXRlIEdOVSBzeXN0ZW0sIHRoZSBwcmVmaXggd2lsbCBiZSBlbXB0eSBhbmQKK0BmaWxley91c3J9IHdpbGwgYmUgYSBzeW1ib2xpYyBsaW5rIHRvIEBmaWxley99LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAcHJlZml4QEB9LikKKworUnVubmluZyBAc2FtcHttYWtlIGluc3RhbGx9IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgb2YgQGNvZGV7cHJlZml4fQorZnJvbSB0aGUgb25lIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gc2hvdWxkIEB2YXJ7bm90fSByZWNvbXBpbGUKK3RoZSBwcm9ncmFtLgorCitAaXRlbSBleGVjX3ByZWZpeAorQSBwcmVmaXggdXNlZCBpbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHNvbWUgb2YgdGhlCit2YXJpYWJsZXMgbGlzdGVkIGJlbG93LiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7ZXhlY19wcmVmaXh9IHNob3VsZAorYmUgQGNvZGV7JChwcmVmaXgpfS4KKyhJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGV4ZWNfcHJlZml4QEB9LikKKworR2VuZXJhbGx5LCBAY29kZXskKGV4ZWNfcHJlZml4KX0gaXMgdXNlZCBmb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCittYWNoaW5lLXNwZWNpZmljIGZpbGVzIChzdWNoIGFzIGV4ZWN1dGFibGVzIGFuZCBzdWJyb3V0aW5lIGxpYnJhcmllcyksCit3aGlsZSBAY29kZXskKHByZWZpeCl9IGlzIHVzZWQgZGlyZWN0bHkgZm9yIG90aGVyIGRpcmVjdG9yaWVzLgorCitSdW5uaW5nIEBzYW1we21ha2UgaW5zdGFsbH0gd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBvZiBAY29kZXtleGVjX3ByZWZpeH0KK2Zyb20gdGhlIG9uZSB1c2VkIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHNob3VsZCBAdmFye25vdH0gcmVjb21waWxlIHRoZQorcHJvZ3JhbS4KK0BlbmQgdGFibGUKKworRXhlY3V0YWJsZSBwcm9ncmFtcyBhcmUgaW5zdGFsbGVkIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGJpbmRpcgorVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRoYXQgdXNlcnMgY2FuIHJ1bi4KK1RoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvYmlufSwgYnV0IHdyaXRlIGl0IGFzCitAZmlsZXskKGV4ZWNfcHJlZml4KS9iaW59LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAYmluZGlyQEB9LikKKworQGl0ZW0gc2JpbmRpcgorVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBleGVjdXRhYmxlIHByb2dyYW1zIHRoYXQgY2FuIGJlIHJ1biBmcm9tCit0aGUgc2hlbGwsIGJ1dCBhcmUgb25seSBnZW5lcmFsbHkgdXNlZnVsIHRvIHN5c3RlbSBhZG1pbmlzdHJhdG9ycy4gIFRoaXMKK3Nob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL3NiaW59LCBidXQgd3JpdGUgaXQgYXMKK0BmaWxleyQoZXhlY19wcmVmaXgpL3NiaW59LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc2JpbmRpckBAfS4pCisKK0BpdGVtIGxpYmV4ZWNkaXIKK0Bjb21tZW50IFRoaXMgcGFyYWdyYXBoIGFkanVzdGVkIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggLS1yb2xhbmQgNWp1bDk0CitUaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdG8gYmUgcnVuIGJ5IG90aGVyCitwcm9ncmFtcyByYXRoZXIgdGhhbiBieSB1c2Vycy4gIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBub3JtYWxseSBiZQorQGZpbGV7L3Vzci9sb2NhbC9saWJleGVjfSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQoZXhlY19wcmVmaXgpL2xpYmV4ZWN9LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbGliZXhlY2RpckBAfS4pCitAZW5kIHRhYmxlCisKK0RhdGEgZmlsZXMgdXNlZCBieSB0aGUgcHJvZ3JhbSBkdXJpbmcgaXRzIGV4ZWN1dGlvbiBhcmUgZGl2aWRlZCBpbnRvCitjYXRlZ29yaWVzIGluIHR3byB3YXlzLgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorU29tZSBmaWxlcyBhcmUgbm9ybWFsbHkgbW9kaWZpZWQgYnkgcHJvZ3JhbXM7IG90aGVycyBhcmUgbmV2ZXIgbm9ybWFsbHkKK21vZGlmaWVkICh0aG91Z2ggdXNlcnMgbWF5IGVkaXQgc29tZSBvZiB0aGVzZSkuCisKK0BpdGVtCitTb21lIGZpbGVzIGFyZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgYW5kIGNhbiBiZSBzaGFyZWQgYnkgYWxsCittYWNoaW5lcyBhdCBhIHNpdGU7IHNvbWUgYXJlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgYW5kIGNhbiBiZSBzaGFyZWQKK29ubHkgYnkgbWFjaGluZXMgb2YgdGhlIHNhbWUga2luZCBhbmQgb3BlcmF0aW5nIHN5c3RlbTsgb3RoZXJzIG1heSBuZXZlcgorYmUgc2hhcmVkIGJldHdlZW4gdHdvIG1hY2hpbmVzLgorQGVuZCBpdGVtaXplCisKK1RoaXMgbWFrZXMgZm9yIHNpeCBkaWZmZXJlbnQgcG9zc2liaWxpdGllcy4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8KK2Rpc2NvdXJhZ2UgdGhlIHVzZSBvZiBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzLCBhc2lkZSBmcm9tIG9iamVjdAorZmlsZXMgYW5kIGxpYnJhcmllcy4gIEl0IGlzIG11Y2ggY2xlYW5lciB0byBtYWtlIG90aGVyIGRhdGEgZmlsZXMKK2FyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCwgYW5kIGl0IGlzIGdlbmVyYWxseSBub3QgaGFyZC4KKworVGhlcmVmb3JlLCBoZXJlIGFyZSB0aGUgdmFyaWFibGVzIE1ha2VmaWxlcyBzaG91bGQgdXNlIHRvIHNwZWNpZnkKK2RpcmVjdG9yaWVzOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGRhdGFkaXIKK1RoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBkYXRhCitmaWxlcy4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvc2hhcmV9LCBidXQgd3JpdGUgaXQgYXMKK0BmaWxleyQocHJlZml4KS9zaGFyZX0uCisoSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBkYXRhZGlyQEB9LikKK0FzIGEgc3BlY2lhbCBleGNlcHRpb24sIHNlZSBAZmlsZXskKGluZm9kaXIpfQorYW5kIEBmaWxleyQoaW5jbHVkZWRpcil9IGJlbG93LgorCitAaXRlbSBzeXNjb25mZGlyCitUaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHJlYWQtb25seSBkYXRhIGZpbGVzIHRoYXQgcGVydGFpbiB0byBhCitzaW5nbGUgbWFjaGluZS0tdGhhdCBpcyB0byBzYXksIGZpbGVzIGZvciBjb25maWd1cmluZyBhIGhvc3QuICBNYWlsZXIKK2FuZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gZmlsZXMsIEBmaWxley9ldGMvcGFzc3dkfSwgYW5kIHNvIGZvcnRoIGJlbG9uZworaGVyZS4gIEFsbCB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIG9yZGluYXJ5IEFTQ0lJIHRleHQKK2ZpbGVzLiAgVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvZXRjfSwgYnV0Cit3cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvZXRjfS4KKyhJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQHN5c2NvbmZkaXJAQH0uKQorCitEbyBub3QgaW5zdGFsbCBleGVjdXRhYmxlcyBoZXJlIGluIHRoaXMgZGlyZWN0b3J5ICh0aGV5IHByb2JhYmx5IGJlbG9uZworaW4gQGZpbGV7JChsaWJleGVjZGlyKX0gb3IgQGZpbGV7JChzYmluZGlyKX0pLiAgQWxzbyBkbyBub3QgaW5zdGFsbAorZmlsZXMgdGhhdCBhcmUgbW9kaWZpZWQgaW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgdGhlaXIgdXNlIChwcm9ncmFtcword2hvc2UgcHVycG9zZSBpcyB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN5c3RlbSBleGNsdWRlZCkuCitUaG9zZSBwcm9iYWJseSBiZWxvbmcgaW4gQGZpbGV7JChsb2NhbHN0YXRlZGlyKX0uCisKK0BpdGVtIHNoYXJlZHN0YXRlZGlyCitUaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGZpbGVzIHdoaWNoCit0aGUgcHJvZ3JhbXMgbW9kaWZ5IHdoaWxlIHRoZXkgcnVuLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUKK0BmaWxley91c3IvbG9jYWwvY29tfSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9jb219LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc2hhcmVkc3RhdGVkaXJAQH0uKQorCitAaXRlbSBsb2NhbHN0YXRlZGlyCitUaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGRhdGEgZmlsZXMgd2hpY2ggdGhlIHByb2dyYW1zIG1vZGlmeSB3aGlsZQordGhleSBydW4sIGFuZCB0aGF0IHBlcnRhaW4gdG8gb25lIHNwZWNpZmljIG1hY2hpbmUuICBVc2VycyBzaG91bGQgbmV2ZXIKK25lZWQgdG8gbW9kaWZ5IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSdzCitvcGVyYXRpb247IHB1dCBzdWNoIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaW4gc2VwYXJhdGUgZmlsZXMgdGhhdCBnbworaW4gQGZpbGV7JChkYXRhZGlyKX0gb3IgQGZpbGV7JChzeXNjb25mZGlyKX0uICBAZmlsZXskKGxvY2Fsc3RhdGVkaXIpfQorc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvdmFyfSwgYnV0IHdyaXRlIGl0IGFzCitAZmlsZXskKHByZWZpeCkvdmFyfS4KKyhJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxvY2Fsc3RhdGVkaXJAQH0uKQorCitAaXRlbSBsaWJkaXIKK1RoZSBkaXJlY3RvcnkgZm9yIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzIG9mIG9iamVjdCBjb2RlLiAgRG8gbm90CitpbnN0YWxsIGV4ZWN1dGFibGVzIGhlcmUsIHRoZXkgcHJvYmFibHkgb3VnaHQgdG8gZ28gaW4gQGZpbGV7JChsaWJleGVjZGlyKX0KK2luc3RlYWQuICBUaGUgdmFsdWUgb2YgQGNvZGV7bGliZGlyfSBzaG91bGQgbm9ybWFsbHkgYmUKK0BmaWxley91c3IvbG9jYWwvbGlifSwgYnV0IHdyaXRlIGl0IGFzIEBmaWxleyQoZXhlY19wcmVmaXgpL2xpYn0uCisoSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsaWJkaXJAQH0uKQorCitAaXRlbSBpbmZvZGlyCitUaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBJbmZvIGZpbGVzIGZvciB0aGlzIHBhY2thZ2UuICBCeQorZGVmYXVsdCwgaXQgc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWwvaW5mb30sIGJ1dCBpdCBzaG91bGQgYmUgd3JpdHRlbgorYXMgQGZpbGV7JChwcmVmaXgpL2luZm99LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAaW5mb2RpckBAfS4pCisKK0BpdGVtIGxpc3BkaXIKK1RoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgYW55IEVtYWNzIExpc3AgZmlsZXMgaW4gdGhpcyBwYWNrYWdlLiAgQnkKK2RlZmF1bHQsIGl0IHNob3VsZCBiZSBAZmlsZXsvdXNyL2xvY2FsL3NoYXJlL2VtYWNzL3NpdGUtbGlzcH0sIGJ1dCBpdAorc2hvdWxkIGJlIHdyaXR0ZW4gYXMgQGZpbGV7JChwcmVmaXgpL3NoYXJlL2VtYWNzL3NpdGUtbGlzcH0uCisKK0lmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIHRoZSBkZWZhdWx0IGFzIEBzYW1we0BAbGlzcGRpckBAfS4KK0luIG9yZGVyIHRvIG1ha2UgQHNhbXB7QEBsaXNwZGlyQEB9IHdvcmssIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcgbGluZXMKK2luIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlOgorCitAZXhhbXBsZQorbGlzcGRpcj0nJEB7ZGF0YWRpckB9L2VtYWNzL3NpdGUtbGlzcCcKK0FDX1NVQlNUKGxpc3BkaXIpCitAZW5kIGV4YW1wbGUKKworQGl0ZW0gaW5jbHVkZWRpcgorQGMgcmV3cml0dGVuIHRvIGF2b2lkIG92ZXJmdWxsIGhib3ggLS1yb2xhbmQKK1RoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgaGVhZGVyIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGJ5IHVzZXIKK3Byb2dyYW1zIHdpdGggdGhlIEMgQHNhbXB7I2luY2x1ZGV9IHByZXByb2Nlc3NvciBkaXJlY3RpdmUuICBUaGlzCitzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlfSwgYnV0IHdyaXRlIGl0IGFzCitAZmlsZXskKHByZWZpeCkvaW5jbHVkZX0uCisoSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBpbmNsdWRlZGlyQEB9LikKKworTW9zdCBjb21waWxlcnMgb3RoZXIgdGhhbiBHQ0MgZG8gbm90IGxvb2sgZm9yIGhlYWRlciBmaWxlcyBpbiBkaXJlY3RvcnkKK0BmaWxley91c3IvbG9jYWwvaW5jbHVkZX0uICBTbyBpbnN0YWxsaW5nIHRoZSBoZWFkZXIgZmlsZXMgdGhpcyB3YXkgaXMKK29ubHkgdXNlZnVsIHdpdGggR0NDLiAgU29tZXRpbWVzIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBiZWNhdXNlIHNvbWUKK2xpYnJhcmllcyBhcmUgb25seSByZWFsbHkgaW50ZW5kZWQgdG8gd29yayB3aXRoIEdDQy4gIEJ1dCBzb21lIGxpYnJhcmllcworYXJlIGludGVuZGVkIHRvIHdvcmsgd2l0aCBvdGhlciBjb21waWxlcnMuICBUaGV5IHNob3VsZCBpbnN0YWxsIHRoZWlyCitoZWFkZXIgZmlsZXMgaW4gdHdvIHBsYWNlcywgb25lIHNwZWNpZmllZCBieSBAY29kZXtpbmNsdWRlZGlyfSBhbmQgb25lCitzcGVjaWZpZWQgYnkgQGNvZGV7b2xkaW5jbHVkZWRpcn0uCisKK0BpdGVtIG9sZGluY2x1ZGVkaXIKK1RoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgQHNhbXB7I2luY2x1ZGV9IGhlYWRlciBmaWxlcyBmb3IgdXNlIHdpdGgKK2NvbXBpbGVycyBvdGhlciB0aGFuIEdDQy4gIFRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvaW5jbHVkZX0uCisoSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgeW91IGNhbiB3cml0ZSBpdCBhcyBAc2FtcHtAQG9sZGluY2x1ZGVkaXJAQH0uKQorCitUaGUgTWFrZWZpbGUgY29tbWFuZHMgc2hvdWxkIGNoZWNrIHdoZXRoZXIgdGhlIHZhbHVlIG9mCitAY29kZXtvbGRpbmNsdWRlZGlyfSBpcyBlbXB0eS4gIElmIGl0IGlzLCB0aGV5IHNob3VsZCBub3QgdHJ5IHRvIHVzZQoraXQ7IHRoZXkgc2hvdWxkIGNhbmNlbCB0aGUgc2Vjb25kIGluc3RhbGxhdGlvbiBvZiB0aGUgaGVhZGVyIGZpbGVzLgorCitBIHBhY2thZ2Ugc2hvdWxkIG5vdCByZXBsYWNlIGFuIGV4aXN0aW5nIGhlYWRlciBpbiB0aGlzIGRpcmVjdG9yeSB1bmxlc3MKK3RoZSBoZWFkZXIgY2FtZSBmcm9tIHRoZSBzYW1lIHBhY2thZ2UuICBUaHVzLCBpZiB5b3VyIEZvbyBwYWNrYWdlCitwcm92aWRlcyBhIGhlYWRlciBmaWxlIEBmaWxle2Zvby5ofSwgdGhlbiBpdCBzaG91bGQgaW5zdGFsbCB0aGUgaGVhZGVyCitmaWxlIGluIHRoZSBAY29kZXtvbGRpbmNsdWRlZGlyfSBkaXJlY3RvcnkgaWYgZWl0aGVyICgxKSB0aGVyZSBpcyBubworQGZpbGV7Zm9vLmh9IHRoZXJlIG9yICgyKSB0aGUgQGZpbGV7Zm9vLmh9IHRoYXQgZXhpc3RzIGNhbWUgZnJvbSB0aGUgRm9vCitwYWNrYWdlLgorCitUbyB0ZWxsIHdoZXRoZXIgQGZpbGV7Zm9vLmh9IGNhbWUgZnJvbSB0aGUgRm9vIHBhY2thZ2UsIHB1dCBhIG1hZ2ljCitzdHJpbmcgaW4gdGhlIGZpbGUtLS1wYXJ0IG9mIGEgY29tbWVudC0tLWFuZCBAY29kZXtncmVwfSBmb3IgdGhhdCBzdHJpbmcuCitAZW5kIHRhYmxlCisKK1VuaXgtc3R5bGUgbWFuIHBhZ2VzIGFyZSBpbnN0YWxsZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gbWFuZGlyCitUaGUgdG9wLWxldmVsIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyB0aGUgbWFuIHBhZ2VzIChpZiBhbnkpIGZvciB0aGlzCitwYWNrYWdlLiAgSXQgd2lsbCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL21hbn0sIGJ1dCB5b3Ugc2hvdWxkCit3cml0ZSBpdCBhcyBAZmlsZXskKHByZWZpeCkvbWFufS4KKyhJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQG1hbmRpckBAfS4pCisKK0BpdGVtIG1hbjFkaXIKK1RoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgc2VjdGlvbiAxIG1hbiBwYWdlcy4gIFdyaXRlIGl0IGFzCitAZmlsZXskKG1hbmRpcikvbWFuMX0uCitAaXRlbSBtYW4yZGlyCitUaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHNlY3Rpb24gMiBtYW4gcGFnZXMuICBXcml0ZSBpdCBhcworQGZpbGV7JChtYW5kaXIpL21hbjJ9CitAaXRlbSBAZG90c3t9CisKK0BzdHJvbmd7RG9uJ3QgbWFrZSB0aGUgcHJpbWFyeSBkb2N1bWVudGF0aW9uIGZvciBhbnkgR05VIHNvZnR3YXJlIGJlIGEKK21hbiBwYWdlLiAgV3JpdGUgYSBtYW51YWwgaW4gVGV4aW5mbyBpbnN0ZWFkLiAgTWFuIHBhZ2VzIGFyZSBqdXN0IGZvcgordGhlIHNha2Ugb2YgcGVvcGxlIHJ1bm5pbmcgR05VIHNvZnR3YXJlIG9uIFVuaXgsIHdoaWNoIGlzIGEgc2Vjb25kYXJ5CithcHBsaWNhdGlvbiBvbmx5Ln0KKworQGl0ZW0gbWFuZXh0CitUaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgdGhlIGluc3RhbGxlZCBtYW4gcGFnZS4gIFRoaXMgc2hvdWxkIGNvbnRhaW4KK2EgcGVyaW9kIGZvbGxvd2VkIGJ5IHRoZSBhcHByb3ByaWF0ZSBkaWdpdDsgaXQgc2hvdWxkIG5vcm1hbGx5IGJlIEBzYW1wey4xfS4KKworQGl0ZW0gbWFuMWV4dAorVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIGluc3RhbGxlZCBzZWN0aW9uIDEgbWFuIHBhZ2VzLgorQGl0ZW0gbWFuMmV4dAorVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gZm9yIGluc3RhbGxlZCBzZWN0aW9uIDIgbWFuIHBhZ2VzLgorQGl0ZW0gQGRvdHN7fQorVXNlIHRoZXNlIG5hbWVzIGluc3RlYWQgb2YgQHNhbXB7bWFuZXh0fSBpZiB0aGUgcGFja2FnZSBuZWVkcyB0byBpbnN0YWxsIG1hbgorcGFnZXMgaW4gbW9yZSB0aGFuIG9uZSBzZWN0aW9uIG9mIHRoZSBtYW51YWwuCitAZW5kIHRhYmxlCisKK0FuZCBmaW5hbGx5LCB5b3Ugc2hvdWxkIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIHNyY2RpcgorVGhlIGRpcmVjdG9yeSBmb3IgdGhlIHNvdXJjZXMgYmVpbmcgY29tcGlsZWQuICBUaGUgdmFsdWUgb2YgdGhpcwordmFyaWFibGUgaXMgbm9ybWFsbHkgaW5zZXJ0ZWQgYnkgdGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2hlbGwgc2NyaXB0LgorKElmIHlvdSBhcmUgdXNpbmcgQXV0Y29uZiwgdXNlIEBzYW1we3NyY2RpciA9IEBAc3JjZGlyQEB9LikKK0BlbmQgdGFibGUKKworRm9yIGV4YW1wbGU6CisKK0BzbWFsbGV4YW1wbGUKK0BjIEkgaGF2ZSBjaGFuZ2VkIHNvbWUgb2YgdGhlIGNvbW1lbnRzIGhlcmUgc2xpZ2h0bHkgdG8gZml4IGFuIG92ZXJmdWxsCitAYyBoYm94LCBzbyB0aGUgbWFrZSBtYW51YWwgY2FuIGZvcm1hdCBjb3JyZWN0bHkuIC0tcm9sYW5kCisjIENvbW1vbiBwcmVmaXggZm9yIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KKyMgTk9URTogVGhpcyBkaXJlY3RvcnkgbXVzdCBleGlzdCB3aGVuIHlvdSBzdGFydCB0aGUgaW5zdGFsbC4KK3ByZWZpeCA9IC91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisjIFdoZXJlIHRvIHB1dCB0aGUgZXhlY3V0YWJsZSBmb3IgdGhlIGNvbW1hbmQgYGdjYycuCitiaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KKyMgV2hlcmUgdG8gcHV0IHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBjb21waWxlci4KK2xpYmV4ZWNkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWJleGVjCisjIFdoZXJlIHRvIHB1dCB0aGUgSW5mbyBmaWxlcy4KK2luZm9kaXIgPSAkKHByZWZpeCkvaW5mbworQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgeW91ciBwcm9ncmFtIGluc3RhbGxzIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIGludG8gb25lIG9mIHRoZQorc3RhbmRhcmQgdXNlci1zcGVjaWZpZWQgZGlyZWN0b3JpZXMsIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBncm91cCB0aGVtCitpbnRvIGEgc3ViZGlyZWN0b3J5IHBhcnRpY3VsYXIgdG8gdGhhdCBwcm9ncmFtLiAgSWYgeW91IGRvIHRoaXMsIHlvdQorc2hvdWxkIHdyaXRlIHRoZSBAY29kZXtpbnN0YWxsfSBydWxlIHRvIGNyZWF0ZSB0aGVzZSBzdWJkaXJlY3Rvcmllcy4KKworRG8gbm90IGV4cGVjdCB0aGUgdXNlciB0byBpbmNsdWRlIHRoZSBzdWJkaXJlY3RvcnkgbmFtZSBpbiB0aGUgdmFsdWUgb2YKK2FueSBvZiB0aGUgdmFyaWFibGVzIGxpc3RlZCBhYm92ZS4gIFRoZSBpZGVhIG9mIGhhdmluZyBhIHVuaWZvcm0gc2V0IG9mCit2YXJpYWJsZSBuYW1lcyBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGlzIHRvIGVuYWJsZSB0aGUgdXNlciB0bworc3BlY2lmeSB0aGUgZXhhY3Qgc2FtZSB2YWx1ZXMgZm9yIHNldmVyYWwgZGlmZmVyZW50IEdOVSBwYWNrYWdlcy4gIEluCitvcmRlciBmb3IgdGhpcyB0byBiZSB1c2VmdWwsIGFsbCB0aGUgcGFja2FnZXMgbXVzdCBiZSBkZXNpZ25lZCBzbyB0aGF0Cit0aGV5IHdpbGwgd29yayBzZW5zaWJseSB3aGVuIHRoZSB1c2VyIGRvZXMgc28uCisKK0Bub2RlIFN0YW5kYXJkIFRhcmdldHMKK0BzZWN0aW9uIFN0YW5kYXJkIFRhcmdldHMgZm9yIFVzZXJzCisKK0FsbCBHTlUgcHJvZ3JhbXMgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyB0YXJnZXRzIGluIHRoZWlyIE1ha2VmaWxlczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBhbGwKK0NvbXBpbGUgdGhlIGVudGlyZSBwcm9ncmFtLiAgVGhpcyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0LiAgVGhpcwordGFyZ2V0IG5lZWQgbm90IHJlYnVpbGQgYW55IGRvY3VtZW50YXRpb24gZmlsZXM7IEluZm8gZmlsZXMgc2hvdWxkCitub3JtYWxseSBiZSBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgRFZJIGZpbGVzIHNob3VsZCBiZSBtYWRlCitvbmx5IHdoZW4gZXhwbGljaXRseSBhc2tlZCBmb3IuCisKK0J5IGRlZmF1bHQsIHRoZSBNYWtlIHJ1bGVzIHNob3VsZCBjb21waWxlIGFuZCBsaW5rIHdpdGggQHNhbXB7LWd9LCBzbwordGhhdCBleGVjdXRhYmxlIHByb2dyYW1zIGhhdmUgZGVidWdnaW5nIHN5bWJvbHMuICBVc2VycyB3aG8gZG9uJ3QgbWluZAorYmVpbmcgaGVscGxlc3MgY2FuIHN0cmlwIHRoZSBleGVjdXRhYmxlcyBsYXRlciBpZiB0aGV5IHdpc2guCisKK0BpdGVtIGluc3RhbGwKK0NvbXBpbGUgdGhlIHByb2dyYW0gYW5kIGNvcHkgdGhlIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGFuZCBzbyBvbiB0bwordGhlIGZpbGUgbmFtZXMgd2hlcmUgdGhleSBzaG91bGQgcmVzaWRlIGZvciBhY3R1YWwgdXNlLiAgSWYgdGhlcmUgaXMgYQorc2ltcGxlIHRlc3QgdG8gdmVyaWZ5IHRoYXQgYSBwcm9ncmFtIGlzIHByb3Blcmx5IGluc3RhbGxlZCwgdGhpcyB0YXJnZXQKK3Nob3VsZCBydW4gdGhhdCB0ZXN0LgorCitEbyBub3Qgc3RyaXAgZXhlY3V0YWJsZXMgd2hlbiBpbnN0YWxsaW5nIHRoZW0uICBEZXZpbC1tYXktY2FyZSB1c2VycyBjYW4KK3VzZSB0aGUgQGNvZGV7aW5zdGFsbC1zdHJpcH0gdGFyZ2V0IHRvIGRvIHRoYXQuCisKK0lmIHBvc3NpYmxlLCB3cml0ZSB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0IHJ1bGUgc28gdGhhdCBpdCBkb2VzIG5vdAorbW9kaWZ5IGFueXRoaW5nIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHByb2dyYW0gd2FzIGJ1aWx0LCBwcm92aWRlZAorQHNhbXB7bWFrZSBhbGx9IGhhcyBqdXN0IGJlZW4gZG9uZS4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgYnVpbGRpbmcgdGhlCitwcm9ncmFtIHVuZGVyIG9uZSB1c2VyIG5hbWUgYW5kIGluc3RhbGxpbmcgaXQgdW5kZXIgYW5vdGhlci4KKworVGhlIGNvbW1hbmRzIHNob3VsZCBjcmVhdGUgYWxsIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCBmaWxlcyBhcmUgdG8gYmUKK2luc3RhbGxlZCwgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LiAgVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0b3JpZXMKK3NwZWNpZmllZCBhcyB0aGUgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgQGNvZGV7cHJlZml4fSBhbmQKK0Bjb2Rle2V4ZWNfcHJlZml4fSwgYXMgd2VsbCBhcyBhbGwgc3ViZGlyZWN0b3JpZXMgdGhhdCBhcmUgbmVlZGVkLgorT25lIHdheSB0byBkbyB0aGlzIGlzIGJ5IG1lYW5zIG9mIGFuIEBjb2Rle2luc3RhbGxkaXJzfSB0YXJnZXQKK2FzIGRlc2NyaWJlZCBiZWxvdy4KKworVXNlIEBzYW1wey19IGJlZm9yZSBhbnkgY29tbWFuZCBmb3IgaW5zdGFsbGluZyBhIG1hbiBwYWdlLCBzbyB0aGF0CitAY29kZXttYWtlfSB3aWxsIGlnbm9yZSBhbnkgZXJyb3JzLiAgVGhpcyBpcyBpbiBjYXNlIHRoZXJlIGFyZSBzeXN0ZW1zCit0aGF0IGRvbid0IGhhdmUgdGhlIFVuaXggbWFuIHBhZ2UgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW5zdGFsbGVkLgorCitUaGUgd2F5IHRvIGluc3RhbGwgSW5mbyBmaWxlcyBpcyB0byBjb3B5IHRoZW0gaW50byBAZmlsZXskKGluZm9kaXIpfQord2l0aCBAY29kZXskKElOU1RBTExfREFUQSl9IChAcHhyZWZ7Q29tbWFuZCBWYXJpYWJsZXN9KSwgYW5kIHRoZW4gcnVuCit0aGUgQGNvZGV7aW5zdGFsbC1pbmZvfSBwcm9ncmFtIGlmIGl0IGlzIHByZXNlbnQuICBAY29kZXtpbnN0YWxsLWluZm99CitpcyBhIHByb2dyYW0gdGhhdCBlZGl0cyB0aGUgSW5mbyBAZmlsZXtkaXJ9IGZpbGUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUKK21lbnUgZW50cnkgZm9yIHRoZSBnaXZlbiBJbmZvIGZpbGU7IGl0IGlzIHBhcnQgb2YgdGhlIFRleGluZm8gcGFja2FnZS4KK0hlcmUgaXMgYSBzYW1wbGUgcnVsZSB0byBpbnN0YWxsIGFuIEluZm8gZmlsZToKKworQGNvbW1lbnQgVGhpcyBleGFtcGxlIGhhcyBiZWVuIGNhcmVmdWxseSBmb3JtYXR0ZWQgZm9yIHRoZSBNYWtlIG1hbnVhbC4KK0Bjb21tZW50IFBsZWFzZSBkbyBub3QgcmVmb3JtYXQgaXQgd2l0aG91dCB0YWxraW5nIHRvIHJvbGFuZEBnbnUuYWkubWl0LmVkdS4KK0BzbWFsbGV4YW1wbGUKKyQoREVTVERJUikkKGluZm9kaXIpL2Zvby5pbmZvOiBmb28uaW5mbworICAgICAgICAkKFBPU1RfSU5TVEFMTCkKKyMgVGhlcmUgbWF5IGJlIGEgbmV3ZXIgaW5mbyBmaWxlIGluIC4gdGhhbiBpbiBzcmNkaXIuCisgICAgICAgIC1pZiB0ZXN0IC1mIGZvby5pbmZvOyB0aGVuIGQ9LjsgXAorICAgICAgICAgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKyAgICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC9mb28uaW5mbyAkKERFU1RESVIpJEBAOyBcCisjIFJ1biBpbnN0YWxsLWluZm8gb25seSBpZiBpdCBleGlzdHMuCisjIFVzZSBgaWYnIGluc3RlYWQgb2YganVzdCBwcmVwZW5kaW5nIGAtJyB0byB0aGUKKyMgbGluZSBzbyB3ZSBub3RpY2UgcmVhbCBlcnJvcnMgZnJvbSBpbnN0YWxsLWluZm8uCisjIFdlIHVzZSBgJChTSEVMTCkgLWMnIGJlY2F1c2Ugc29tZSBzaGVsbHMgZG8gbm90CisjIGZhaWwgZ3JhY2VmdWxseSB3aGVuIHRoZXJlIGlzIGFuIHVua25vd24gY29tbWFuZC4KKyAgICAgICAgaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24nIFwKKyAgICAgICAgICAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKyAgICAgICAgICBpbnN0YWxsLWluZm8gLS1kaXItZmlsZT0kKERFU1RESVIpJChpbmZvZGlyKS9kaXIgXAorICAgICAgICAgICAgICAgICAgICAgICAkKERFU1RESVIpJChpbmZvZGlyKS9mb28uaW5mbzsgXAorICAgICAgICBlbHNlIHRydWU7IGZpCitAZW5kIHNtYWxsZXhhbXBsZQorCitXaGVuIHdyaXRpbmcgdGhlIEBjb2Rle2luc3RhbGx9IHRhcmdldCwgeW91IG11c3QgY2xhc3NpZnkgYWxsIHRoZQorY29tbWFuZHMgaW50byB0aHJlZSBjYXRlZ29yaWVzOiBub3JtYWwgb25lcywgQGRmbntwcmUtaW5zdGFsbGF0aW9ufQorY29tbWFuZHMgYW5kIEBkZm57cG9zdC1pbnN0YWxsYXRpb259IGNvbW1hbmRzLiAgQHhyZWZ7SW5zdGFsbCBDb21tYW5kCitDYXRlZ29yaWVzfS4KKworQGl0ZW0gdW5pbnN0YWxsCitEZWxldGUgYWxsIHRoZSBpbnN0YWxsZWQgZmlsZXMtLS10aGUgY29waWVzIHRoYXQgdGhlIEBzYW1we2luc3RhbGx9Cit0YXJnZXQgY3JlYXRlcy4KKworVGhpcyBydWxlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBjb21waWxhdGlvbiBpcyBkb25lLAorb25seSB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgZmlsZXMgYXJlIGluc3RhbGxlZC4KKworVGhlIHVuaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgY2F0ZWdvcmllcywganVzdCBsaWtlCit0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgQHhyZWZ7SW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXN9LgorCitAaXRlbSBpbnN0YWxsLXN0cmlwCitMaWtlIEBjb2Rle2luc3RhbGx9LCBidXQgc3RyaXAgdGhlIGV4ZWN1dGFibGUgZmlsZXMgd2hpbGUgaW5zdGFsbGluZwordGhlbS4gIEluIG1hbnkgY2FzZXMsIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFyZ2V0IGNhbiBiZSB2ZXJ5IHNpbXBsZToKKworQHNtYWxsZXhhbXBsZQoraW5zdGFsbC1zdHJpcDoKKyAgICAgICAgJChNQUtFKSBJTlNUQUxMX1BST0dSQU09JyQoSU5TVEFMTF9QUk9HUkFNKSAtcycgXAorICAgICAgICAgICAgICAgIGluc3RhbGwKK0BlbmQgc21hbGxleGFtcGxlCisKK05vcm1hbGx5IHdlIGRvIG5vdCByZWNvbW1lbmQgc3RyaXBwaW5nIGFuIGV4ZWN1dGFibGUgdW5sZXNzIHlvdSBhcmUgc3VyZQordGhlIHByb2dyYW0gaGFzIG5vIGJ1Z3MuICBIb3dldmVyLCBpdCBjYW4gYmUgcmVhc29uYWJsZSB0byBpbnN0YWxsIGEKK3N0cmlwcGVkIGV4ZWN1dGFibGUgZm9yIGFjdHVhbCBleGVjdXRpb24gd2hpbGUgc2F2aW5nIHRoZSB1bnN0cmlwcGVkCitleGVjdXRhYmxlIGVsc2V3aGVyZSBpbiBjYXNlIHRoZXJlIGlzIGEgYnVnLgorCitAY29tbWVudCBUaGUgZ3JhdHVpdG91cyBibGFuayBsaW5lIGhlcmUgaXMgdG8gbWFrZSB0aGUgdGFibGUgbG9vayBiZXR0ZXIKK0Bjb21tZW50IGluIHRoZSBwcmludGVkIE1ha2UgbWFudWFsLiAgUGxlYXNlIGxlYXZlIGl0IGluLgorQGl0ZW0gY2xlYW4KKworRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBub3JtYWxseSBjcmVhdGVkIGJ5CitidWlsZGluZyB0aGUgcHJvZ3JhbS4gIERvbid0IGRlbGV0ZSB0aGUgZmlsZXMgdGhhdCByZWNvcmQgdGhlCitjb25maWd1cmF0aW9uLiAgQWxzbyBwcmVzZXJ2ZSBmaWxlcyB0aGF0IGNvdWxkIGJlIG1hZGUgYnkgYnVpbGRpbmcsIGJ1dAorbm9ybWFsbHkgYXJlbid0IGJlY2F1c2UgdGhlIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIHRoZW0uCisKK0RlbGV0ZSBAZmlsZXsuZHZpfSBmaWxlcyBoZXJlIGlmIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkaXN0cmlidXRpb24uCisKK0BpdGVtIGRpc3RjbGVhbgorRGVsZXRlIGFsbCBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGFyZSBjcmVhdGVkIGJ5Citjb25maWd1cmluZyBvciBidWlsZGluZyB0aGUgcHJvZ3JhbS4gIElmIHlvdSBoYXZlIHVucGFja2VkIHRoZSBzb3VyY2UKK2FuZCBidWlsdCB0aGUgcHJvZ3JhbSB3aXRob3V0IGNyZWF0aW5nIGFueSBvdGhlciBmaWxlcywgQHNhbXB7bWFrZQorZGlzdGNsZWFufSBzaG91bGQgbGVhdmUgb25seSB0aGUgZmlsZXMgdGhhdCB3ZXJlIGluIHRoZSBkaXN0cmlidXRpb24uCisKK0BpdGVtIG1vc3RseWNsZWFuCitMaWtlIEBzYW1we2NsZWFufSwgYnV0IG1heSByZWZyYWluIGZyb20gZGVsZXRpbmcgYSBmZXcgZmlsZXMgdGhhdCBwZW9wbGUKK25vcm1hbGx5IGRvbid0IHdhbnQgdG8gcmVjb21waWxlLiAgRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHttb3N0bHljbGVhbn0KK3RhcmdldCBmb3IgR0NDIGRvZXMgbm90IGRlbGV0ZSBAZmlsZXtsaWJnY2MuYX0sIGJlY2F1c2UgcmVjb21waWxpbmcgaXQKK2lzIHJhcmVseSBuZWNlc3NhcnkgYW5kIHRha2VzIGEgbG90IG9mIHRpbWUuCisKK0BpdGVtIG1haW50YWluZXItY2xlYW4KK0RlbGV0ZSBhbG1vc3QgZXZlcnl0aGluZyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IGNhbiBiZQorcmVjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgTWFrZWZpbGUuICBUaGlzIHR5cGljYWxseSBpbmNsdWRlcyBldmVyeXRoaW5nCitkZWxldGVkIGJ5IEBjb2Rle2Rpc3RjbGVhbn0sIHBsdXMgbW9yZTogQyBzb3VyY2UgZmlsZXMgcHJvZHVjZWQgYnkKK0Jpc29uLCB0YWdzIHRhYmxlcywgSW5mbyBmaWxlcywgYW5kIHNvIG9uLgorCitUaGUgcmVhc29uIHdlIHNheSBgYGFsbW9zdCBldmVyeXRoaW5nJycgaXMgdGhhdCBydW5uaW5nIHRoZSBjb21tYW5kCitAc2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IHNob3VsZCBub3QgZGVsZXRlIEBmaWxle2NvbmZpZ3VyZX0gZXZlbiBpZgorQGZpbGV7Y29uZmlndXJlfSBjYW4gYmUgcmVtYWRlIHVzaW5nIGEgcnVsZSBpbiB0aGUgTWFrZWZpbGUuICBNb3JlIGdlbmVyYWxseSwKK0BzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkIG5vdCBkZWxldGUgYW55dGhpbmcgdGhhdCBuZWVkcyB0bworZXhpc3QgaW4gb3JkZXIgdG8gcnVuIEBmaWxle2NvbmZpZ3VyZX0gYW5kIHRoZW4gYmVnaW4gdG8gYnVpbGQgdGhlCitwcm9ncmFtLiAgVGhpcyBpcyB0aGUgb25seSBleGNlcHRpb247IEBjb2Rle21haW50YWluZXItY2xlYW59IHNob3VsZAorZGVsZXRlIGV2ZXJ5dGhpbmcgZWxzZSB0aGF0IGNhbiBiZSByZWJ1aWx0LgorCitUaGUgQHNhbXB7bWFpbnRhaW5lci1jbGVhbn0gdGFyZ2V0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgYSBtYWludGFpbmVyIG9mCit0aGUgcGFja2FnZSwgbm90IGJ5IG9yZGluYXJ5IHVzZXJzLiAgWW91IG1heSBuZWVkIHNwZWNpYWwgdG9vbHMgdG8KK3JlY29uc3RydWN0IHNvbWUgb2YgdGhlIGZpbGVzIHRoYXQgQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBkZWxldGVzLgorU2luY2UgdGhlc2UgZmlsZXMgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIHdlIGRvbid0Cit0YWtlIGNhcmUgdG8gbWFrZSB0aGVtIGVhc3kgdG8gcmVjb25zdHJ1Y3QuICBJZiB5b3UgZmluZCB5b3UgbmVlZCB0bwordW5wYWNrIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbiBhZ2FpbiwgZG9uJ3QgYmxhbWUgdXMuCisKK1RvIGhlbHAgbWFrZSB1c2VycyBhd2FyZSBvZiB0aGlzLCB0aGUgY29tbWFuZHMgZm9yIHRoZSBzcGVjaWFsCitAY29kZXttYWludGFpbmVyLWNsZWFufSB0YXJnZXQgc2hvdWxkIHN0YXJ0IHdpdGggdGhlc2UgdHdvOgorCitAc21hbGxleGFtcGxlCitAQGVjaG8gJ1RoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyBpdCcKK0BAZWNobyAnZGVsZXRlcyBmaWxlcyB0aGF0IG1heSBuZWVkIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4nCitAZW5kIHNtYWxsZXhhbXBsZQorCitAaXRlbSBUQUdTCitVcGRhdGUgYSB0YWdzIHRhYmxlIGZvciB0aGlzIHByb2dyYW0uCitAYyBBRFI6IGhvdz8KKworQGl0ZW0gaW5mbworR2VuZXJhdGUgYW55IEluZm8gZmlsZXMgbmVlZGVkLiAgVGhlIGJlc3Qgd2F5IHRvIHdyaXRlIHRoZSBydWxlcyBpcyBhcworZm9sbG93czoKKworQHNtYWxsZXhhbXBsZQoraW5mbzogZm9vLmluZm8KKworZm9vLmluZm86IGZvby50ZXhpIGNoYXAxLnRleGkgY2hhcDIudGV4aQorICAgICAgICAkKE1BS0VJTkZPKSAkKHNyY2RpcikvZm9vLnRleGkKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorWW91IG11c3QgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtNQUtFSU5GT30gaW4gdGhlIE1ha2VmaWxlLiAgSXQgc2hvdWxkCitydW4gdGhlIEBjb2Rle21ha2VpbmZvfSBwcm9ncmFtLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvCitkaXN0cmlidXRpb24uCisKK05vcm1hbGx5IGEgR05VIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIEluZm8gZmlsZXMsIGFuZCB0aGF0IG1lYW5zIHRoZQorSW5mbyBmaWxlcyBhcmUgcHJlc2VudCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRoZXJlZm9yZSwgdGhlIE1ha2UKK3J1bGUgZm9yIGFuIGluZm8gZmlsZSBzaG91bGQgdXBkYXRlIGl0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgV2hlbgordXNlcnMgYnVpbGQgdGhlIHBhY2thZ2UsIG9yZGluYXJpbHkgTWFrZSB3aWxsIG5vdCB1cGRhdGUgdGhlIEluZm8gZmlsZXMKK2JlY2F1c2UgdGhleSB3aWxsIGFscmVhZHkgYmUgdXAgdG8gZGF0ZS4KKworQGl0ZW0gZHZpCitHZW5lcmF0ZSBEVkkgZmlsZXMgZm9yIGFsbCBUZXhpbmZvIGRvY3VtZW50YXRpb24uCitGb3IgZXhhbXBsZToKKworQHNtYWxsZXhhbXBsZQorZHZpOiBmb28uZHZpCisKK2Zvby5kdmk6IGZvby50ZXhpIGNoYXAxLnRleGkgY2hhcDIudGV4aQorICAgICAgICAkKFRFWEkyRFZJKSAkKHNyY2RpcikvZm9vLnRleGkKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorWW91IG11c3QgZGVmaW5lIHRoZSB2YXJpYWJsZSBAY29kZXtURVhJMkRWSX0gaW4gdGhlIE1ha2VmaWxlLiAgSXQgc2hvdWxkCitydW4gdGhlIHByb2dyYW0gQGNvZGV7dGV4aTJkdml9LCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBUZXhpbmZvCitkaXN0cmlidXRpb24uQGZvb3Rub3Rle0Bjb2Rle3RleGkyZHZpfSB1c2VzIEBUZVh7fSB0byBkbyB0aGUgcmVhbCB3b3JrCitvZiBmb3JtYXR0aW5nLiBAVGVYe30gaXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggVGV4aW5mby59ICBBbHRlcm5hdGl2ZWx5LAord3JpdGUganVzdCB0aGUgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3cgR05VIEBjb2Rle21ha2V9IHRvIHByb3ZpZGUgdGhlIGNvbW1hbmQuCisKK0BpdGVtIGRpc3QKK0NyZWF0ZSBhIGRpc3RyaWJ1dGlvbiB0YXIgZmlsZSBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIHRhciBmaWxlIHNob3VsZCBiZQorc2V0IHVwIHNvIHRoYXQgdGhlIGZpbGUgbmFtZXMgaW4gdGhlIHRhciBmaWxlIHN0YXJ0IHdpdGggYSBzdWJkaXJlY3RvcnkKK25hbWUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgaXQgaXMgYSBkaXN0cmlidXRpb24gZm9yLiAgVGhpcworbmFtZSBjYW4gaW5jbHVkZSB0aGUgdmVyc2lvbiBudW1iZXIuCisKK0ZvciBleGFtcGxlLCB0aGUgZGlzdHJpYnV0aW9uIHRhciBmaWxlIG9mIEdDQyB2ZXJzaW9uIDEuNDAgdW5wYWNrcyBpbnRvCithIHN1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtnY2MtMS40MH0uCisKK1RoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSBhcHByb3ByaWF0ZWx5CituYW1lZCwgdXNlIEBjb2Rle2xufSBvciBAY29kZXtjcH0gdG8gaW5zdGFsbCB0aGUgcHJvcGVyIGZpbGVzIGluIGl0LCBhbmQKK3RoZW4gQGNvZGV7dGFyfSB0aGF0IHN1YmRpcmVjdG9yeS4KKworQ29tcHJlc3MgdGhlIHRhciBmaWxlIGZpbGUgd2l0aCBAY29kZXtnemlwfS4gIEZvciBleGFtcGxlLCB0aGUgYWN0dWFsCitkaXN0cmlidXRpb24gZmlsZSBmb3IgR0NDIHZlcnNpb24gMS40MCBpcyBjYWxsZWQgQGZpbGV7Z2NjLTEuNDAudGFyLmd6fS4KKworVGhlIEBjb2Rle2Rpc3R9IHRhcmdldCBzaG91bGQgZXhwbGljaXRseSBkZXBlbmQgb24gYWxsIG5vbi1zb3VyY2UgZmlsZXMKK3RoYXQgYXJlIGluIHRoZSBkaXN0cmlidXRpb24sIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlIGluIHRoZQorZGlzdHJpYnV0aW9uLgorQGlmc2V0IENPREVTVEQKK0B4cmVme1JlbGVhc2VzLCAsIE1ha2luZyBSZWxlYXNlc30uCitAZW5kIGlmc2V0CitAaWZjbGVhciBDT0RFU1RECitAeHJlZntSZWxlYXNlcywgLCBNYWtpbmcgUmVsZWFzZXMsIHN0YW5kYXJkcywgR05VIENvZGluZyBTdGFuZGFyZHN9LgorQGVuZCBpZmNsZWFyCisKK0BpdGVtIGNoZWNrCitQZXJmb3JtIHNlbGYtdGVzdHMgKGlmIGFueSkuICBUaGUgdXNlciBtdXN0IGJ1aWxkIHRoZSBwcm9ncmFtIGJlZm9yZQorcnVubmluZyB0aGUgdGVzdHMsIGJ1dCBuZWVkIG5vdCBpbnN0YWxsIHRoZSBwcm9ncmFtOyB5b3Ugc2hvdWxkIHdyaXRlCit0aGUgc2VsZi10ZXN0cyBzbyB0aGF0IHRoZXkgd29yayB3aGVuIHRoZSBwcm9ncmFtIGlzIGJ1aWx0IGJ1dCBub3QKK2luc3RhbGxlZC4KK0BlbmQgdGFibGUKKworVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBzdWdnZXN0ZWQgYXMgY29udmVudGlvbmFsIG5hbWVzLCBmb3IgcHJvZ3JhbXMKK2luIHdoaWNoIHRoZXkgYXJlIHVzZWZ1bC4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBpbnN0YWxsY2hlY2sKK1BlcmZvcm0gaW5zdGFsbGF0aW9uIHRlc3RzIChpZiBhbnkpLiAgVGhlIHVzZXIgbXVzdCBidWlsZCBhbmQgaW5zdGFsbAordGhlIHByb2dyYW0gYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3RzLiAgWW91IHNob3VsZCBub3QgYXNzdW1lIHRoYXQKK0BmaWxleyQoYmluZGlyKX0gaXMgaW4gdGhlIHNlYXJjaCBwYXRoLgorCitAaXRlbSBpbnN0YWxsZGlycworSXQncyB1c2VmdWwgdG8gYWRkIGEgdGFyZ2V0IG5hbWVkIEBzYW1we2luc3RhbGxkaXJzfSB0byBjcmVhdGUgdGhlCitkaXJlY3RvcmllcyB3aGVyZSBmaWxlcyBhcmUgaW5zdGFsbGVkLCBhbmQgdGhlaXIgcGFyZW50IGRpcmVjdG9yaWVzLgorVGhlcmUgaXMgYSBzY3JpcHQgY2FsbGVkIEBmaWxle21raW5zdGFsbGRpcnN9IHdoaWNoIGlzIGNvbnZlbmllbnQgZm9yCit0aGlzOyB5b3UgY2FuIGZpbmQgaXQgaW4gdGhlIFRleGluZm8gcGFja2FnZS4KK0BjIEl0J3MgaW4gL2dkL2dudS9saWIvbWtpbnN0YWxsZGlycy4KK1lvdSBjYW4gdXNlIGEgcnVsZSBsaWtlIHRoaXM6CisKK0Bjb21tZW50IFRoaXMgaGFzIGJlZW4gY2FyZWZ1bGx5IGZvcm1hdHRlZCB0byBsb29rIGRlY2VudCBpbiB0aGUgTWFrZSBtYW51YWwuCitAY29tbWVudCBQbGVhc2UgYmUgc3VyZSBub3QgdG8gbWFrZSBpdCBleHRlbmQgYW55IGZ1cnRoZXIgdG8gdGhlIHJpZ2h0Li0tcm9sYW5kCitAc21hbGxleGFtcGxlCisjIE1ha2Ugc3VyZSBhbGwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIChlLmcuICQoYmluZGlyKSkKKyMgYWN0dWFsbHkgZXhpc3QgYnkgbWFraW5nIHRoZW0gaWYgbmVjZXNzYXJ5LgoraW5zdGFsbGRpcnM6IG1raW5zdGFsbGRpcnMKKyAgICAgICAgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChiaW5kaXIpICQoZGF0YWRpcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGxpYmRpcikgJChpbmZvZGlyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobWFuZGlyKQorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhpcyBydWxlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBjb21waWxhdGlvbiBpcyBkb25lLgorSXQgc2hvdWxkIGRvIG5vdGhpbmcgYnV0IGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCitAZW5kIHRhYmxlCisKK0Bub2RlIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzCitAc2VjdGlvbiBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllcworCitAY2luZGV4IHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMKK0BjaW5kZXggcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMKK1doZW4gd3JpdGluZyB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0LCB5b3UgbXVzdCBjbGFzc2lmeSBhbGwgdGhlCitjb21tYW5kcyBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IG5vcm1hbCBvbmVzLCBAZGZue3ByZS1pbnN0YWxsYXRpb259Citjb21tYW5kcyBhbmQgQGRmbntwb3N0LWluc3RhbGxhdGlvbn0gY29tbWFuZHMuCisKK05vcm1hbCBjb21tYW5kcyBtb3ZlIGZpbGVzIGludG8gdGhlaXIgcHJvcGVyIHBsYWNlcywgYW5kIHNldCB0aGVpcgorbW9kZXMuICBUaGV5IG1heSBub3QgYWx0ZXIgYW55IGZpbGVzIGV4Y2VwdCB0aGUgb25lcyB0aGF0IGNvbWUgZW50aXJlbHkKK2Zyb20gdGhlIHBhY2thZ2UgdGhleSBiZWxvbmcgdG8uCisKK1ByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIG1heSBhbHRlciBvdGhlciBmaWxlczsKK2luIHBhcnRpY3VsYXIsIHRoZXkgY2FuIGVkaXQgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3IgZGF0YSBiYXNlcy4KKworUHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcyBhcmUgdHlwaWNhbGx5IGV4ZWN1dGVkIGJlZm9yZSB0aGUgbm9ybWFsCitjb21tYW5kcywgYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgcnVuIGFmdGVyIHRoZQorbm9ybWFsIGNvbW1hbmRzLgorCitUaGUgbW9zdCBjb21tb24gdXNlIGZvciBhIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmQgaXMgdG8gcnVuCitAY29kZXtpbnN0YWxsLWluZm99LiAgVGhpcyBjYW5ub3QgYmUgZG9uZSB3aXRoIGEgbm9ybWFsIGNvbW1hbmQsIHNpbmNlCitpdCBhbHRlcnMgYSBmaWxlICh0aGUgSW5mbyBkaXJlY3RvcnkpIHdoaWNoIGRvZXMgbm90IGNvbWUgZW50aXJlbHkgYW5kCitzb2xlbHkgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBpbnN0YWxsZWQuICBJdCBpcyBhIHBvc3QtaW5zdGFsbGF0aW9uCitjb21tYW5kIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciB0aGUgbm9ybWFsIGNvbW1hbmQgd2hpY2gKK2luc3RhbGxzIHRoZSBwYWNrYWdlJ3MgSW5mbyBmaWxlcy4KKworTW9zdCBwcm9ncmFtcyBkb24ndCBuZWVkIGFueSBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLCBidXQgd2UgaGF2ZSB0aGUKK2ZlYXR1cmUganVzdCBpbiBjYXNlIGl0IGlzIG5lZWRlZC4KKworVG8gY2xhc3NpZnkgdGhlIGNvbW1hbmRzIGluIHRoZSBAY29kZXtpbnN0YWxsfSBydWxlIGludG8gdGhlc2UgdGhyZWUKK2NhdGVnb3JpZXMsIGluc2VydCBAZGZue2NhdGVnb3J5IGxpbmVzfSBhbW9uZyB0aGVtLiAgQSBjYXRlZ29yeSBsaW5lCitzcGVjaWZpZXMgdGhlIGNhdGVnb3J5IGZvciB0aGUgY29tbWFuZHMgdGhhdCBmb2xsb3cuCisKK0EgY2F0ZWdvcnkgbGluZSBjb25zaXN0cyBvZiBhIHRhYiBhbmQgYSByZWZlcmVuY2UgdG8gYSBzcGVjaWFsIE1ha2UKK3ZhcmlhYmxlLCBwbHVzIGFuIG9wdGlvbmFsIGNvbW1lbnQgYXQgdGhlIGVuZC4gIFRoZXJlIGFyZSB0aHJlZQordmFyaWFibGVzIHlvdSBjYW4gdXNlLCBvbmUgZm9yIGVhY2ggY2F0ZWdvcnk7IHRoZSB2YXJpYWJsZSBuYW1lCitzcGVjaWZpZXMgdGhlIGNhdGVnb3J5LiAgQ2F0ZWdvcnkgbGluZXMgYXJlIG5vLW9wcyBpbiBvcmRpbmFyeSBleGVjdXRpb24KK2JlY2F1c2UgdGhlc2UgdGhyZWUgTWFrZSB2YXJpYWJsZXMgYXJlIG5vcm1hbGx5IHVuZGVmaW5lZCAoYW5kIHlvdQorQGVtcGh7c2hvdWxkIG5vdH0gZGVmaW5lIHRoZW0gaW4gdGhlIG1ha2VmaWxlKS4KKworSGVyZSBhcmUgdGhlIHRocmVlIHBvc3NpYmxlIGNhdGVnb3J5IGxpbmVzLCBlYWNoIHdpdGggYSBjb21tZW50IHRoYXQKK2V4cGxhaW5zIHdoYXQgaXQgbWVhbnM6CisKK0BzbWFsbGV4YW1wbGUKKyAgICAgICAgJChQUkVfSU5TVEFMTCkgICAgICMgQHJ7UHJlLWluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KKyAgICAgICAgJChQT1NUX0lOU1RBTEwpICAgICMgQHJ7UG9zdC1pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59CisgICAgICAgICQoTk9STUFMX0lOU1RBTEwpICAjIEBye05vcm1hbCBjb21tYW5kcyBmb2xsb3cufQorQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgeW91IGRvbid0IHVzZSBhIGNhdGVnb3J5IGxpbmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgQGNvZGV7aW5zdGFsbH0KK3J1bGUsIGFsbCB0aGUgY29tbWFuZHMgYXJlIGNsYXNzaWZpZWQgYXMgbm9ybWFsIHVudGlsIHRoZSBmaXJzdCBjYXRlZ29yeQorbGluZS4gIElmIHlvdSBkb24ndCB1c2UgYW55IGNhdGVnb3J5IGxpbmVzLCBhbGwgdGhlIGNvbW1hbmRzIGFyZQorY2xhc3NpZmllZCBhcyBub3JtYWwuCisKK1RoZXNlIGFyZSB0aGUgY2F0ZWdvcnkgbGluZXMgZm9yIEBjb2Rle3VuaW5zdGFsbH06CisKK0BzbWFsbGV4YW1wbGUKKyAgICAgICAgJChQUkVfVU5JTlNUQUxMKSAgICAgIyBAcntQcmUtdW5pbnN0YWxsIGNvbW1hbmRzIGZvbGxvdy59CisgICAgICAgICQoUE9TVF9VTklOU1RBTEwpICAgICMgQHJ7UG9zdC11bmluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KKyAgICAgICAgJChOT1JNQUxfVU5JTlNUQUxMKSAgIyBAcntOb3JtYWwgY29tbWFuZHMgZm9sbG93Ln0KK0BlbmQgc21hbGxleGFtcGxlCisKK1R5cGljYWxseSwgYSBwcmUtdW5pbnN0YWxsIGNvbW1hbmQgd291bGQgYmUgdXNlZCBmb3IgZGVsZXRpbmcgZW50cmllcworZnJvbSB0aGUgSW5mbyBkaXJlY3RvcnkuCisKK0lmIHRoZSBAY29kZXtpbnN0YWxsfSBvciBAY29kZXt1bmluc3RhbGx9IHRhcmdldCBoYXMgYW55IGRlcGVuZGVuY2llcword2hpY2ggYWN0IGFzIHN1YnJvdXRpbmVzIG9mIGluc3RhbGxhdGlvbiwgdGhlbiB5b3Ugc2hvdWxkIHN0YXJ0CitAZW1waHtlYWNofSBkZXBlbmRlbmN5J3MgY29tbWFuZHMgd2l0aCBhIGNhdGVnb3J5IGxpbmUsIGFuZCBzdGFydCB0aGUKK21haW4gdGFyZ2V0J3MgY29tbWFuZHMgd2l0aCBhIGNhdGVnb3J5IGxpbmUgYWxzby4gIFRoaXMgd2F5LCB5b3UgY2FuCitlbnN1cmUgdGhhdCBlYWNoIGNvbW1hbmQgaXMgcGxhY2VkIGluIHRoZSByaWdodCBjYXRlZ29yeSByZWdhcmRsZXNzIG9mCit3aGljaCBvZiB0aGUgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1bi4KKworUHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgc2hvdWxkIG5vdCBydW4gYW55Citwcm9ncmFtcyBleGNlcHQgZm9yIHRoZXNlOgorCitAZXhhbXBsZQorWyBiYXNlbmFtZSBiYXNoIGNhdCBjaGdycCBjaG1vZCBjaG93biBjbXAgY3AgZGQgZGlmZiBlY2hvCitlZ3JlcCBleHBhbmQgZXhwciBmYWxzZSBmZ3JlcCBmaW5kIGdldG9wdCBncmVwIGd1bnppcCBnemlwCitob3N0bmFtZSBpbnN0YWxsIGluc3RhbGwtaW5mbyBraWxsIGxkY29uZmlnIGxuIGxzIG1kNXN1bQorbWtkaXIgbWtmaWZvIG1rbm9kIG12IHByaW50ZW52IHB3ZCBybSBybWRpciBzZWQgc29ydCB0ZWUKK3Rlc3QgdG91Y2ggdHJ1ZSB1bmFtZSB4YXJncyB5ZXMKK0BlbmQgZXhhbXBsZQorCitAY2luZGV4IGJpbmFyeSBwYWNrYWdlcworVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlIGNvbW1hbmRzIGluIHRoaXMgd2F5IGlzIGZvciB0aGUgc2FrZQorb2YgbWFraW5nIGJpbmFyeSBwYWNrYWdlcy4gIFR5cGljYWxseSBhIGJpbmFyeSBwYWNrYWdlIGNvbnRhaW5zIGFsbCB0aGUKK2V4ZWN1dGFibGVzIGFuZCBvdGhlciBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBhbmQgaGFzIGl0cyBvd24KK21ldGhvZCBvZiBpbnN0YWxsaW5nIHRoZW0tLS1zbyBpdCBkb2VzIG5vdCBuZWVkIHRvIHJ1biB0aGUgbm9ybWFsCitpbnN0YWxsYXRpb24gY29tbWFuZHMuICBCdXQgaW5zdGFsbGluZyB0aGUgYmluYXJ5IHBhY2thZ2UgZG9lcyBuZWVkIHRvCitleGVjdXRlIHRoZSBwcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcy4KKworUHJvZ3JhbXMgdG8gYnVpbGQgYmluYXJ5IHBhY2thZ2VzIHdvcmsgYnkgZXh0cmFjdGluZyB0aGUKK3ByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgSGVyZSBpcyBvbmUgd2F5IG9mCitleHRyYWN0aW5nIHRoZSBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzOgorCitAc21hbGxleGFtcGxlCittYWtlIC1uIGluc3RhbGwgLW8gYWxsIFwKKyAgICAgIFBSRV9JTlNUQUxMPXByZS1pbnN0YWxsIFwKKyAgICAgIFBPU1RfSU5TVEFMTD1wb3N0LWluc3RhbGwgXAorICAgICAgTk9STUFMX0lOU1RBTEw9bm9ybWFsLWluc3RhbGwgXAorICB8IGdhd2sgLWYgcHJlLWluc3RhbGwuYXdrCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK3doZXJlIHRoZSBmaWxlIEBmaWxle3ByZS1pbnN0YWxsLmF3a30gY291bGQgY29udGFpbiB0aGlzOgorCitAc21hbGxleGFtcGxlCiskMCB+IC9eXHRbIFx0XSoobm9ybWFsX2luc3RhbGx8cG9zdF9pbnN0YWxsKVsgXHRdKiQvIEB7b24gPSAwQH0KK29uIEB7cHJpbnQgJDBAfQorJDAgfiAvXlx0WyBcdF0qcHJlX2luc3RhbGxbIFx0XSokLyBAe29uID0gMUB9CitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgcmVzdWx0aW5nIGZpbGUgb2YgcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsCitzY3JpcHQgYXMgcGFydCBvZiBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgcGFja2FnZS4KZGlmZiAtLWdpdCBhL2V0Yy9zdGFuZGFyZHMudGV4aSBiL2V0Yy9zdGFuZGFyZHMudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBiZjhiCi0tLSAvZGV2L251bGwKKysrIGIvZXRjL3N0YW5kYXJkcy50ZXhpCkBAIC0wLDAgKzEsMzA5MyBAQAorXGlucHV0IHRleGluZm8gQGMgLSotdGV4aW5mby0qLQorQGMgJSoqc3RhcnQgb2YgaGVhZGVyCitAc2V0ZmlsZW5hbWUgc3RhbmRhcmRzLmluZm8KK0BzZXR0aXRsZSBHTlUgQ29kaW5nIFN0YW5kYXJkcworQGMgVGhpcyBkYXRlIGlzIGF1dG9tYWdpY2FsbHkgdXBkYXRlZCB3aGVuIHlvdSBzYXZlIHRoaXMgZmlsZToKK0BzZXQgbGFzdHVwZGF0ZSBNYXJjaCAxMywgMTk5OAorQGMgJSoqZW5kIG9mIGhlYWRlcgorCitAaWZpbmZvCitAZm9ybWF0CitTVEFSVC1JTkZPLURJUi1FTlRSWQorKiBTdGFuZGFyZHM6IChzdGFuZGFyZHMpLiAgICAgICAgR05VIGNvZGluZyBzdGFuZGFyZHMuCitFTkQtSU5GTy1ESVItRU5UUlkKK0BlbmQgZm9ybWF0CitAZW5kIGlmaW5mbworCitAYyBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCisKK0BjIFRoaXMgaXMgdXNlZCBieSBhIGNyb3NzIHJlZiBpbiBtYWtlLXN0ZHMudGV4aQorQHNldCBDT0RFU1REICAxCitAaWZ0ZXgKK0BzZXQgQ0hBUFRFUiBjaGFwdGVyCitAZW5kIGlmdGV4CitAaWZpbmZvCitAc2V0IENIQVBURVIgbm9kZQorQGVuZCBpZmluZm8KKworQGlmaW5mbworR05VIENvZGluZyBTdGFuZGFyZHMKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorQGVuZCBpZ25vcmUKKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKK3Jlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKK2V4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorQGVuZCBpZmluZm8KKworQHRpdGxlcGFnZQorQHRpdGxlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCitAYXV0aG9yIFJpY2hhcmQgU3RhbGxtYW4KK0BhdXRob3IgbGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfQorQHBhZ2UKKworQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCityZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCitleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0BlbmQgdGl0bGVwYWdlCisKK0BpZmluZm8KK0Bub2RlIFRvcCwgUHJlZmFjZSwgKGRpciksIChkaXIpCitAdG9wIFZlcnNpb24KKworTGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfS4KK0BlbmQgaWZpbmZvCisKK0BtZW51CisqIFByZWZhY2U6OiAgICAgICAgICAgICAgICAgICAgIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcworKiBJbnRlbGxlY3R1YWwgUHJvcGVydHk6OiAgICAgICBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQorKiBEZXNpZ24gQWR2aWNlOjogICAgICAgICAgICAgICBHZW5lcmFsIFByb2dyYW0gRGVzaWduCisqIFByb2dyYW0gQmVoYXZpb3I6OiAgICAgICAgICAgIFByb2dyYW0gQmVoYXZpb3IgZm9yIEFsbCBQcm9ncmFtcworKiBXcml0aW5nIEM6OiAgICAgICAgICAgICAgICAgICBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKKyogRG9jdW1lbnRhdGlvbjo6ICAgICAgICAgICAgICAgRG9jdW1lbnRpbmcgUHJvZ3JhbXMKKyogTWFuYWdpbmcgUmVsZWFzZXM6OiAgICAgICAgICAgVGhlIFJlbGVhc2UgUHJvY2VzcworQGVuZCBtZW51CisKK0Bub2RlIFByZWZhY2UKK0BjaGFwdGVyIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcworCitUaGUgR05VIENvZGluZyBTdGFuZGFyZHMgd2VyZSB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYW5kIG90aGVyIEdOVQorUHJvamVjdCB2b2x1bnRlZXJzLiAgVGhlaXIgcHVycG9zZSBpcyB0byBtYWtlIHRoZSBHTlUgc3lzdGVtIGNsZWFuLAorY29uc2lzdGVudCwgYW5kIGVhc3kgdG8gaW5zdGFsbC4gIFRoaXMgZG9jdW1lbnQgY2FuIGFsc28gYmUgcmVhZCBhcyBhCitndWlkZSB0byB3cml0aW5nIHBvcnRhYmxlLCByb2J1c3QgYW5kIHJlbGlhYmxlIHByb2dyYW1zLiAgSXQgZm9jdXNlcyBvbgorcHJvZ3JhbXMgd3JpdHRlbiBpbiBDLCBidXQgbWFueSBvZiB0aGUgcnVsZXMgYW5kIHByaW5jaXBsZXMgYXJlIHVzZWZ1bAorZXZlbiBpZiB5b3Ugd3JpdGUgaW4gYW5vdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIFRoZSBydWxlcyBvZnRlbgorc3RhdGUgcmVhc29ucyBmb3Igd3JpdGluZyBpbiBhIGNlcnRhaW4gd2F5LgorCitDb3JyZWN0aW9ucyBvciBzdWdnZXN0aW9ucyBmb3IgdGhpcyBkb2N1bWVudCBzaG91bGQgYmUgc2VudCB0bworQGVtYWlse2dudUBAZ251Lm9yZ30uICBJZiB5b3UgbWFrZSBhIHN1Z2dlc3Rpb24sIHBsZWFzZSBpbmNsdWRlIGEKK3N1Z2dlc3RlZCBuZXcgd29yZGluZyBmb3IgaXQ7IG91ciB0aW1lIGlzIGxpbWl0ZWQuICBXZSBwcmVmZXIgYSBjb250ZXh0CitkaWZmIHRvIHRoZSBAZmlsZXtzdGFuZGFyZHMudGV4aX0gb3IgQGZpbGV7bWFrZS1zdGRzLnRleGl9IGZpbGVzLCBidXQgaWYKK3lvdSBkb24ndCBoYXZlIHRob3NlIGZpbGVzLCBwbGVhc2UgbWFpbCB5b3VyIHN1Z2dlc3Rpb24gYW55d2F5LgorCitUaGlzIHJlbGVhc2Ugb2YgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzIHdhcyBsYXN0IHVwZGF0ZWQKK0B2YWx1ZXtsYXN0dXBkYXRlfS4KKworQG5vZGUgSW50ZWxsZWN0dWFsIFByb3BlcnR5CitAY2hhcHRlciBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQorCitUaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgaG93IHlvdSBjYW4gbWFrZSBzdXJlIHRoYXQgR05VIHNvZnR3YXJlCityZW1haW5zIHVuZW5jdW1iZXJlZC4KKworQG1lbnUKKyogUmVhZGluZyBOb24tRnJlZSBDb2RlOjogICAgICAgUmVmZXJyaW5nIHRvIFByb3ByaWV0YXJ5IFByb2dyYW1zCisqIENvbnRyaWJ1dGlvbnM6OiAgICAgICAgICAgICAgIEFjY2VwdGluZyBDb250cmlidXRpb25zCitAZW5kIG1lbnUKKworQG5vZGUgUmVhZGluZyBOb24tRnJlZSBDb2RlCitAc2VjdGlvbiBSZWZlcnJpbmcgdG8gUHJvcHJpZXRhcnkgUHJvZ3JhbXMKKworRG9uJ3QgaW4gYW55IGNpcmN1bXN0YW5jZXMgcmVmZXIgdG8gVW5peCBzb3VyY2UgY29kZSBmb3Igb3IgZHVyaW5nCit5b3VyIHdvcmsgb24gR05VISAgKE9yIHRvIGFueSBvdGhlciBwcm9wcmlldGFyeSBwcm9ncmFtcy4pCisKK0lmIHlvdSBoYXZlIGEgdmFndWUgcmVjb2xsZWN0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgYSBVbml4IHByb2dyYW0sCit0aGlzIGRvZXMgbm90IGFic29sdXRlbHkgbWVhbiB5b3UgY2FuJ3Qgd3JpdGUgYW4gaW1pdGF0aW9uIG9mIGl0LCBidXQKK2RvIHRyeSB0byBvcmdhbml6ZSB0aGUgaW1pdGF0aW9uIGludGVybmFsbHkgYWxvbmcgZGlmZmVyZW50IGxpbmVzLAorYmVjYXVzZSB0aGlzIGlzIGxpa2VseSB0byBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBVbml4IHZlcnNpb24KK2lycmVsZXZhbnQgYW5kIGRpc3NpbWlsYXIgdG8geW91ciByZXN1bHRzLgorCitGb3IgZXhhbXBsZSwgVW5peCB1dGlsaXRpZXMgd2VyZSBnZW5lcmFsbHkgb3B0aW1pemVkIHRvIG1pbmltaXplCittZW1vcnkgdXNlOyBpZiB5b3UgZ28gZm9yIHNwZWVkIGluc3RlYWQsIHlvdXIgcHJvZ3JhbSB3aWxsIGJlIHZlcnkKK2RpZmZlcmVudC4gIFlvdSBjb3VsZCBrZWVwIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBpbiBjb3JlIGFuZCBzY2FuIGl0Cit0aGVyZSBpbnN0ZWFkIG9mIHVzaW5nIHN0ZGlvLiAgVXNlIGEgc21hcnRlciBhbGdvcml0aG0gZGlzY292ZXJlZCBtb3JlCityZWNlbnRseSB0aGFuIHRoZSBVbml4IHByb2dyYW0uICBFbGltaW5hdGUgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcy4gIERvCitpdCBpbiBvbmUgcGFzcyBpbnN0ZWFkIG9mIHR3byAod2UgZGlkIHRoaXMgaW4gdGhlIGFzc2VtYmxlcikuCisKK09yLCBvbiB0aGUgY29udHJhcnksIGVtcGhhc2l6ZSBzaW1wbGljaXR5IGluc3RlYWQgb2Ygc3BlZWQuICBGb3Igc29tZQorYXBwbGljYXRpb25zLCB0aGUgc3BlZWQgb2YgdG9kYXkncyBjb21wdXRlcnMgbWFrZXMgc2ltcGxlciBhbGdvcml0aG1zCithZGVxdWF0ZS4KKworT3IgZ28gZm9yIGdlbmVyYWxpdHkuICBGb3IgZXhhbXBsZSwgVW5peCBwcm9ncmFtcyBvZnRlbiBoYXZlIHN0YXRpYwordGFibGVzIG9yIGZpeGVkLXNpemUgc3RyaW5ncywgd2hpY2ggbWFrZSBmb3IgYXJiaXRyYXJ5IGxpbWl0czsgdXNlCitkeW5hbWljIGFsbG9jYXRpb24gaW5zdGVhZC4gIE1ha2Ugc3VyZSB5b3VyIHByb2dyYW0gaGFuZGxlcyBOVUxzIGFuZAorb3RoZXIgZnVubnkgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgZmlsZXMuICBBZGQgYSBwcm9ncmFtbWluZyBsYW5ndWFnZQorZm9yIGV4dGVuc2liaWxpdHkgYW5kIHdyaXRlIHBhcnQgb2YgdGhlIHByb2dyYW0gaW4gdGhhdCBsYW5ndWFnZS4KKworT3IgdHVybiBzb21lIHBhcnRzIG9mIHRoZSBwcm9ncmFtIGludG8gaW5kZXBlbmRlbnRseSB1c2FibGUgbGlicmFyaWVzLgorT3IgdXNlIGEgc2ltcGxlIGdhcmJhZ2UgY29sbGVjdG9yIGluc3RlYWQgb2YgdHJhY2tpbmcgcHJlY2lzZWx5IHdoZW4KK3RvIGZyZWUgbWVtb3J5LCBvciB1c2UgYSBuZXcgR05VIGZhY2lsaXR5IHN1Y2ggYXMgb2JzdGFja3MuCisKKworQG5vZGUgQ29udHJpYnV0aW9ucworQHNlY3Rpb24gQWNjZXB0aW5nIENvbnRyaWJ1dGlvbnMKKworSWYgc29tZW9uZSBlbHNlIHNlbmRzIHlvdSBhIHBpZWNlIG9mIGNvZGUgdG8gYWRkIHRvIHRoZSBwcm9ncmFtIHlvdSBhcmUKK3dvcmtpbmcgb24sIHdlIG5lZWQgbGVnYWwgcGFwZXJzIHRvIHVzZSBpdC0tLXRoZSBzYW1lIHNvcnQgb2YgbGVnYWwKK3BhcGVycyB3ZSB3aWxsIG5lZWQgdG8gZ2V0IGZyb20geW91LiAgQGVtcGh7RWFjaH0gc2lnbmlmaWNhbnQKK2NvbnRyaWJ1dG9yIHRvIGEgcHJvZ3JhbSBtdXN0IHNpZ24gc29tZSBzb3J0IG9mIGxlZ2FsIHBhcGVycyBpbiBvcmRlcgorZm9yIHVzIHRvIGhhdmUgY2xlYXIgdGl0bGUgdG8gdGhlIHByb2dyYW0uICBUaGUgbWFpbiBhdXRob3IgYWxvbmUgaXMgbm90Citlbm91Z2guCisKK1NvLCBiZWZvcmUgYWRkaW5nIGluIGFueSBjb250cmlidXRpb25zIGZyb20gb3RoZXIgcGVvcGxlLCBwbGVhc2UgdGVsbAordXMsIHNvIHdlIGNhbiBhcnJhbmdlIHRvIGdldCB0aGUgcGFwZXJzLiAgVGhlbiB3YWl0IHVudGlsIHdlIHRlbGwgeW91Cit0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNpZ25lZCBwYXBlcnMsIGJlZm9yZSB5b3UgYWN0dWFsbHkgdXNlIHRoZQorY29udHJpYnV0aW9uLgorCitUaGlzIGFwcGxpZXMgYm90aCBiZWZvcmUgeW91IHJlbGVhc2UgdGhlIHByb2dyYW0gYW5kIGFmdGVyd2FyZC4gIElmCit5b3UgcmVjZWl2ZSBkaWZmcyB0byBmaXggYSBidWcsIGFuZCB0aGV5IG1ha2Ugc2lnbmlmaWNhbnQgY2hhbmdlcywgd2UKK25lZWQgbGVnYWwgcGFwZXJzIGZvciB0aGF0IGNoYW5nZS4KKworVGhpcyBhbHNvIGFwcGxpZXMgdG8gY29tbWVudHMgYW5kIGRvY3VtZW50YXRpb24gZmlsZXMuICBGb3IgY29weXJpZ2h0CitsYXcsIGNvbW1lbnRzIGFuZCBjb2RlIGFyZSBqdXN0IHRleHQuICBDb3B5cmlnaHQgYXBwbGllcyB0byBhbGwga2luZHMgb2YKK3RleHQsIHNvIHdlIG5lZWQgbGVnYWwgcGFwZXJzIGZvciBhbGwga2luZHMuCisKK1lvdSBkb24ndCBuZWVkIHBhcGVycyBmb3IgY2hhbmdlcyBvZiBhIGZldyBsaW5lcyBoZXJlIG9yIHRoZXJlLCBzaW5jZQordGhleSBhcmUgbm90IHNpZ25pZmljYW50IGZvciBjb3B5cmlnaHQgcHVycG9zZXMuICBBbHNvLCB5b3UgZG9uJ3QgbmVlZAorcGFwZXJzIGlmIGFsbCB5b3UgZ2V0IGZyb20gdGhlIHN1Z2dlc3Rpb24gaXMgc29tZSBpZGVhcywgbm90IGFjdHVhbCBjb2RlCit3aGljaCB5b3UgdXNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3cml0ZSBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB0aGUKK3Byb2JsZW0sIHlvdSBkb24ndCBuZWVkIHRvIGdldCBwYXBlcnMuCisKK1dlIGtub3cgdGhpcyBpcyBmcnVzdHJhdGluZzsgaXQncyBmcnVzdHJhdGluZyBmb3IgdXMgYXMgd2VsbC4gIEJ1dCBpZgoreW91IGRvbid0IHdhaXQsIHlvdSBhcmUgZ29pbmcgb3V0IG9uIGEgbGltYi0tLWZvciBleGFtcGxlLCB3aGF0IGlmIHRoZQorY29udHJpYnV0b3IncyBlbXBsb3llciB3b24ndCBzaWduIGEgZGlzY2xhaW1lcj8gIFlvdSBtaWdodCBoYXZlIHRvIHRha2UKK3RoYXQgY29kZSBvdXQgYWdhaW4hCisKK1RoZSB2ZXJ5IHdvcnN0IHRoaW5nIGlzIGlmIHlvdSBmb3JnZXQgdG8gdGVsbCB1cyBhYm91dCB0aGUgb3RoZXIKK2NvbnRyaWJ1dG9yLiAgV2UgY291bGQgYmUgdmVyeSBlbWJhcnJhc3NlZCBpbiBjb3VydCBzb21lIGRheSBhcyBhCityZXN1bHQuCisKK1dlIGhhdmUgbW9yZSBkZXRhaWxlZCBhZHZpY2UgZm9yIG1haW50YWluZXJzIG9mIHByb2dyYW1zOyBpZiB5b3UgaGF2ZQorcmVhY2hlZCB0aGUgc3RhZ2Ugb2YgYWN0dWFsbHkgbWFpbnRhaW5pbmcgYSBwcm9ncmFtIGZvciBHTlUgKHdoZXRoZXIKK3JlbGVhc2VkIG9yIG5vdCksIHBsZWFzZSBhc2sgdXMgZm9yIGEgY29weS4KKworQG5vZGUgRGVzaWduIEFkdmljZQorQGNoYXB0ZXIgR2VuZXJhbCBQcm9ncmFtIERlc2lnbgorCitUaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgc29tZSBvZiB0aGUgaXNzdWVzIHlvdSBzaG91bGQgdGFrZSBpbnRvCithY2NvdW50IHdoZW4gZGVzaWduaW5nIHlvdXIgcHJvZ3JhbS4KKworQG1lbnUKKyogQ29tcGF0aWJpbGl0eTo6ICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucworKiBVc2luZyBFeHRlbnNpb25zOjogICAgICAgICAgICBVc2luZyBub24tc3RhbmRhcmQgZmVhdHVyZXMKKyogQU5TSSBDOjogICAgICAgICAgICAgICAgICAgICAgVXNpbmcgQU5TSSBDIGZlYXR1cmVzCisqIFNvdXJjZSBMYW5ndWFnZTo6ICAgICAgICAgICAgIFVzaW5nIGxhbmd1YWdlcyBvdGhlciB0aGFuIEMKK0BlbmQgbWVudQorCitAbm9kZSBDb21wYXRpYmlsaXR5CitAc2VjdGlvbiBDb21wYXRpYmlsaXR5IHdpdGggT3RoZXIgSW1wbGVtZW50YXRpb25zCisKK1dpdGggb2NjYXNpb25hbCBleGNlcHRpb25zLCB1dGlsaXR5IHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgZm9yIEdOVQorc2hvdWxkIGJlIHVwd2FyZCBjb21wYXRpYmxlIHdpdGggdGhvc2UgaW4gQmVya2VsZXkgVW5peCwgYW5kIHVwd2FyZAorY29tcGF0aWJsZSB3aXRoIEBzY3thbnNpfSBDIGlmIEBzY3thbnNpfSBDIHNwZWNpZmllcyB0aGVpciBiZWhhdmlvciwgYW5kCit1cHdhcmQgY29tcGF0aWJsZSB3aXRoIEBzY3tQT1NJWH0gaWYgQHNje1BPU0lYfSBzcGVjaWZpZXMgdGhlaXIKK2JlaGF2aW9yLgorCitXaGVuIHRoZXNlIHN0YW5kYXJkcyBjb25mbGljdCwgaXQgaXMgdXNlZnVsIHRvIG9mZmVyIGNvbXBhdGliaWxpdHkKK21vZGVzIGZvciBlYWNoIG9mIHRoZW0uCisKK0BzY3thbnNpfSBDIGFuZCBAc2N7UE9TSVh9IHByb2hpYml0IG1hbnkga2luZHMgb2YgZXh0ZW5zaW9ucy4gIEZlZWwgZnJlZQordG8gbWFrZSB0aGUgZXh0ZW5zaW9ucyBhbnl3YXksIGFuZCBpbmNsdWRlIGEgQHNhbXB7LS1hbnNpfSwKK0BzYW1wey0tcG9zaXh9LCBvciBAc2FtcHstLWNvbXBhdGlibGV9IG9wdGlvbiB0byB0dXJuIHRoZW0gb2ZmLgorSG93ZXZlciwgaWYgdGhlIGV4dGVuc2lvbiBoYXMgYSBzaWduaWZpY2FudCBjaGFuY2Ugb2YgYnJlYWtpbmcgYW55IHJlYWwKK3Byb2dyYW1zIG9yIHNjcmlwdHMsIHRoZW4gaXQgaXMgbm90IHJlYWxseSB1cHdhcmQgY29tcGF0aWJsZS4gIFRyeSB0bworcmVkZXNpZ24gaXRzIGludGVyZmFjZS4KKworTWFueSBHTlUgcHJvZ3JhbXMgc3VwcHJlc3MgZXh0ZW5zaW9ucyB0aGF0IGNvbmZsaWN0IHdpdGggUE9TSVggaWYgdGhlCitlbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtQT1NJWExZX0NPUlJFQ1R9IGlzIGRlZmluZWQgKGV2ZW4gaWYgaXQgaXMKK2RlZmluZWQgd2l0aCBhIG51bGwgdmFsdWUpLiAgUGxlYXNlIG1ha2UgeW91ciBwcm9ncmFtIHJlY29nbml6ZSB0aGlzCit2YXJpYWJsZSBpZiBhcHByb3ByaWF0ZS4KKworV2hlbiBhIGZlYXR1cmUgaXMgdXNlZCBvbmx5IGJ5IHVzZXJzIChub3QgYnkgcHJvZ3JhbXMgb3IgY29tbWFuZAorZmlsZXMpLCBhbmQgaXQgaXMgZG9uZSBwb29ybHkgaW4gVW5peCwgZmVlbCBmcmVlIHRvIHJlcGxhY2UgaXQKK2NvbXBsZXRlbHkgd2l0aCBzb21ldGhpbmcgdG90YWxseSBkaWZmZXJlbnQgYW5kIGJldHRlci4gIChGb3IgZXhhbXBsZSwKK0Bjb2Rle3ZpfSBpcyByZXBsYWNlZCB3aXRoIEVtYWNzLikgIEJ1dCBpdCBpcyBuaWNlIHRvIG9mZmVyIGEgY29tcGF0aWJsZQorZmVhdHVyZSBhcyB3ZWxsLiAgKFRoZXJlIGlzIGEgZnJlZSBAY29kZXt2aX0gY2xvbmUsIHNvIHdlIG9mZmVyIGl0LikKKworQWRkaXRpb25hbCB1c2VmdWwgZmVhdHVyZXMgbm90IGluIEJlcmtlbGV5IFVuaXggYXJlIHdlbGNvbWUuCisKK0Bub2RlIFVzaW5nIEV4dGVuc2lvbnMKK0BzZWN0aW9uIFVzaW5nIE5vbi1zdGFuZGFyZCBGZWF0dXJlcworCitNYW55IEdOVSBmYWNpbGl0aWVzIHRoYXQgYWxyZWFkeSBleGlzdCBzdXBwb3J0IGEgbnVtYmVyIG9mIGNvbnZlbmllbnQKK2V4dGVuc2lvbnMgb3ZlciB0aGUgY29tcGFyYWJsZSBVbml4IGZhY2lsaXRpZXMuICBXaGV0aGVyIHRvIHVzZSB0aGVzZQorZXh0ZW5zaW9ucyBpbiBpbXBsZW1lbnRpbmcgeW91ciBwcm9ncmFtIGlzIGEgZGlmZmljdWx0IHF1ZXN0aW9uLgorCitPbiB0aGUgb25lIGhhbmQsIHVzaW5nIHRoZSBleHRlbnNpb25zIGNhbiBtYWtlIGEgY2xlYW5lciBwcm9ncmFtLgorT24gdGhlIG90aGVyIGhhbmQsIHBlb3BsZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtCit1bmxlc3MgdGhlIG90aGVyIEdOVSB0b29scyBhcmUgYXZhaWxhYmxlLiAgVGhpcyBtaWdodCBjYXVzZSB0aGUKK3Byb2dyYW0gdG8gd29yayBvbiBmZXdlciBraW5kcyBvZiBtYWNoaW5lcy4KKworV2l0aCBzb21lIGV4dGVuc2lvbnMsIGl0IG1pZ2h0IGJlIGVhc3kgdG8gcHJvdmlkZSBib3RoIGFsdGVybmF0aXZlcy4KK0ZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBmdW5jdGlvbnMgd2l0aCBhIGBga2V5d29yZCcnIEBjb2Rle0lOTElORX0KK2FuZCBkZWZpbmUgdGhhdCBhcyBhIG1hY3JvIHRvIGV4cGFuZCBpbnRvIGVpdGhlciBAY29kZXtpbmxpbmV9IG9yCitub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLgorCitJbiBnZW5lcmFsLCBwZXJoYXBzIGl0IGlzIGJlc3Qgbm90IHRvIHVzZSB0aGUgZXh0ZW5zaW9ucyBpZiB5b3UgY2FuCitzdHJhaWdodGZvcndhcmRseSBkbyB3aXRob3V0IHRoZW0sIGJ1dCB0byB1c2UgdGhlIGV4dGVuc2lvbnMgaWYgdGhleQorYXJlIGEgYmlnIGltcHJvdmVtZW50LgorCitBbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIGFyZSB0aGUgbGFyZ2UsIGVzdGFibGlzaGVkIHByb2dyYW1zIChzdWNoIGFzCitFbWFjcykgd2hpY2ggcnVuIG9uIGEgZ3JlYXQgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgU3VjaCBwcm9ncmFtcyB3b3VsZAorYmUgYnJva2VuIGJ5IHVzZSBvZiBHTlUgZXh0ZW5zaW9ucy4KKworQW5vdGhlciBleGNlcHRpb24gaXMgZm9yIHByb2dyYW1zIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZgorY29tcGlsYXRpb246IGFueXRoaW5nIHRoYXQgbXVzdCBiZSBjb21waWxlZCB3aXRoIG90aGVyIGNvbXBpbGVycyBpbgorb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBHTlUgY29tcGlsYXRpb24gZmFjaWxpdGllcy4gIElmIHRoZXNlIHJlcXVpcmUKK3RoZSBHTlUgY29tcGlsZXIsIHRoZW4gbm8gb25lIGNhbiBjb21waWxlIHRoZW0gd2l0aG91dCBoYXZpbmcgdGhlbQoraW5zdGFsbGVkIGFscmVhZHkuICBUaGF0IHdvdWxkIGJlIG5vIGdvb2QuCisKK0Bub2RlIEFOU0kgQworQHNlY3Rpb24gQHNje2Fuc2l9IEMgYW5kIHByZS1Ac2N7YW5zaX0gQworCitEbyBub3QgZXZlciB1c2UgdGhlIGBgdHJpZ3JhcGgnJyBmZWF0dXJlIG9mIEBzY3thbnNpfSBDLgorCitAc2N7YW5zaX0gQyBpcyB3aWRlc3ByZWFkIGVub3VnaCBub3cgdGhhdCBpdCBpcyBvayB0byB3cml0ZSBuZXcgcHJvZ3JhbXMKK3RoYXQgdXNlIEBzY3thbnNpfSBDIGZlYXR1cmVzIChhbmQgdGhlcmVmb3JlIHdpbGwgbm90IHdvcmsgaW4KK25vbi1Ac2N7YW5zaX0gY29tcGlsZXJzKS4gIEFuZCBpZiBhIHByb2dyYW0gaXMgYWxyZWFkeSB3cml0dGVuIGluCitAc2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9Citjb21waWxlcnMuCisKK0hvd2V2ZXIsIGl0IGlzIGVhc3kgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9IGNvbXBpbGVycyBpbiBtb3N0IHByb2dyYW1zLAorc28geW91IG1pZ2h0IHN0aWxsIGNvbnNpZGVyIGRvaW5nIHNvIHdoZW4geW91IHdyaXRlIGEgcHJvZ3JhbS4gIEluc3RlYWQKK29mIHdyaXRpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gQHNje2Fuc2l9IHByb3RvdHlwZSBmb3JtLAorCitAZXhhbXBsZQoraW50Citmb28gKGludCB4LCBpbnQgeSkKK0Bkb3Rze30KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3dyaXRlIHRoZSBkZWZpbml0aW9uIGluIHByZS1Ac2N7YW5zaX0gc3R5bGUgbGlrZSB0aGlzLAorCitAZXhhbXBsZQoraW50Citmb28gKHgsIHkpCisgICAgIGludCB4LCB5OworQGRvdHN7fQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorYW5kIHVzZSBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHByb3RvdHlwZToKKworQGV4YW1wbGUKK2ludCBmb28gKGludCwgaW50KTsKK0BlbmQgZXhhbXBsZQorCitZb3UgbmVlZCBzdWNoIGEgZGVjbGFyYXRpb24gYW55d2F5LCBpbiBhIGhlYWRlciBmaWxlLCB0byBnZXQgdGhlIGJlbmVmaXQKK29mIEBzY3thbnNpfSBDIHByb3RvdHlwZXMgaW4gYWxsIHRoZSBmaWxlcyB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorQW5kIG9uY2UgeW91IGhhdmUgaXQsIHlvdSBsb3NlIG5vdGhpbmcgYnkgd3JpdGluZyB0aGUgZnVuY3Rpb24KK2RlZmluaXRpb24gaW4gdGhlIHByZS1Ac2N7YW5zaX0gc3R5bGUuCisKK0lmIHlvdSBkb24ndCBrbm93IG5vbi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGxlYXJuIGl0OyBqdXN0Cit3cml0ZSBpbiBAc2N7YW5zaX0gQy4KKworQG5vZGUgU291cmNlIExhbmd1YWdlCitAc2VjdGlvbiBVc2luZyBMYW5ndWFnZXMgT3RoZXIgVGhhbiBDCisKK1VzaW5nIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBDIGlzIGxpa2UgdXNpbmcgYSBub24tc3RhbmRhcmQgZmVhdHVyZTogaXQKK3dpbGwgY2F1c2UgdHJvdWJsZSBmb3IgdXNlcnMuICBFdmVuIGlmIEdDQyBzdXBwb3J0cyB0aGUgb3RoZXIgbGFuZ3VhZ2UsCit1c2VycyBtYXkgZmluZCBpdCBpbmNvbnZlbmllbnQgdG8gaGF2ZSB0byBpbnN0YWxsIHRoZSBjb21waWxlciBmb3IgdGhhdAorb3RoZXIgbGFuZ3VhZ2UgaW4gb3JkZXIgdG8gYnVpbGQgeW91ciBwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQord3JpdGUgeW91ciBwcm9ncmFtIGluIEMrKywgcGVvcGxlIHdpbGwgaGF2ZSB0byBpbnN0YWxsIHRoZSBDKysgY29tcGlsZXIKK2luIG9yZGVyIHRvIGNvbXBpbGUgeW91ciBwcm9ncmFtLiAgVGh1cywgaXQgaXMgYmV0dGVyIGlmIHlvdSB3cml0ZSBpbiBDLgorCitCdXQgdGhlcmUgYXJlIHRocmVlIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBpcyBubyBkaXNhZHZhbnRhZ2UgaW4gdXNpbmcKK3NvbWUgb3RoZXIgbGFuZ3VhZ2U6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitJdCBpcyBva2F5IHRvIHVzZSBhbm90aGVyIGxhbmd1YWdlIGlmIHlvdXIgcHJvZ3JhbSBjb250YWlucyBhbgoraW50ZXJwcmV0ZXIgZm9yIHRoYXQgbGFuZ3VhZ2UuCisKK0ZvciBleGFtcGxlLCBpZiB5b3VyIHByb2dyYW0gbGlua3Mgd2l0aCBHVUlMRSwgaXQgaXMgb2sgdG8gd3JpdGUgcGFydCBvZgordGhlIHByb2dyYW0gaW4gU2NoZW1lIG9yIGFub3RoZXIgbGFuZ3VhZ2Ugc3VwcG9ydGVkIGJ5IEdVSUxFLgorCitAaXRlbQorSXQgaXMgb2theSB0byB1c2UgYW5vdGhlciBsYW5ndWFnZSBpbiBhIHRvb2wgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvcgordXNlIHdpdGggdGhhdCBsYW5ndWFnZS4KKworVGhpcyBpcyBva2F5IGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyB3YW50IHRvIGJ1aWxkIHRoZSB0b29sIHdpbGwgYmUKK3Rob3NlIHdobyBoYXZlIGluc3RhbGxlZCB0aGUgb3RoZXIgbGFuZ3VhZ2UgYW55d2F5LgorCitAaXRlbQorSWYgYW4gYXBwbGljYXRpb24gaXMgb2YgaW50ZXJlc3QgdG8gYSBuYXJyb3cgY29tbXVuaXR5LCB0aGVuIHBlcmhhcHMKK2l0J3Mgbm90IGltcG9ydGFudCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5jb252ZW5pZW50IHRvIGluc3RhbGwuCitAZW5kIGl0ZW1pemUKKworQyBoYXMgb25lIG90aGVyIGFkdmFudGFnZSBvdmVyIEMrKyBhbmQgb3RoZXIgY29tcGlsZWQgbGFuZ3VhZ2VzOiBtb3JlCitwZW9wbGUga25vdyBDLCBzbyBtb3JlIHBlb3BsZSB3aWxsIGZpbmQgaXQgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkgdGhlCitwcm9ncmFtIGlmIGl0IGlzIHdyaXR0ZW4gaW4gQy4KKworQG5vZGUgUHJvZ3JhbSBCZWhhdmlvcgorQGNoYXB0ZXIgUHJvZ3JhbSBCZWhhdmlvciBmb3IgQWxsIFByb2dyYW1zCisKK1RoaXMgQHZhbHVle0NIQVBURVJ9IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUgcm9idXN0IHNvZnR3YXJlLiBJdCBhbHNvCitkZXNjcmliZXMgZ2VuZXJhbCBzdGFuZGFyZHMgZm9yIGVycm9yIG1lc3NhZ2VzLCB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSwKK2FuZCBob3cgbGlicmFyaWVzIHNob3VsZCBiZWhhdmUuCisKK0BtZW51CisqIFNlbWFudGljczo6ICAgICAgICAgICAgICAgICAgIFdyaXRpbmcgcm9idXN0IHByb2dyYW1zCisqIExpYnJhcmllczo6ICAgICAgICAgICAgICAgICAgIExpYnJhcnkgYmVoYXZpb3IKKyogRXJyb3JzOjogICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcworKiBVc2VyIEludGVyZmFjZXM6OiAgICAgICAgICAgICBTdGFuZGFyZHMgZm9yIGNvbW1hbmQgbGluZSBpbnRlcmZhY2VzCisqIE9wdGlvbiBUYWJsZTo6ICAgICAgICAgICAgICAgIFRhYmxlIG9mIGxvbmcgb3B0aW9ucy4KKyogTWVtb3J5IFVzYWdlOjogICAgICAgICAgICAgICAgV2hlbiBhbmQgaG93IHRvIGNhcmUgYWJvdXQgbWVtb3J5IG5lZWRzCitAZW5kIG1lbnUKKworQG5vZGUgU2VtYW50aWNzCitAc2VjdGlvbiBXcml0aW5nIFJvYnVzdCBQcm9ncmFtcworCitBdm9pZCBhcmJpdHJhcnkgbGltaXRzIG9uIHRoZSBsZW5ndGggb3IgbnVtYmVyIG9mIEBlbXBoe2FueX0gZGF0YQorc3RydWN0dXJlLCBpbmNsdWRpbmcgZmlsZSBuYW1lcywgbGluZXMsIGZpbGVzLCBhbmQgc3ltYm9scywgYnkgYWxsb2NhdGluZworYWxsIGRhdGEgc3RydWN0dXJlcyBkeW5hbWljYWxseS4gIEluIG1vc3QgVW5peCB1dGlsaXRpZXMsIGBgbG9uZyBsaW5lcworYXJlIHNpbGVudGx5IHRydW5jYXRlZCcnLiAgVGhpcyBpcyBub3QgYWNjZXB0YWJsZSBpbiBhIEdOVSB1dGlsaXR5LgorCitVdGlsaXRpZXMgcmVhZGluZyBmaWxlcyBzaG91bGQgbm90IGRyb3AgTlVMIGNoYXJhY3RlcnMsIG9yIGFueSBvdGhlcgorbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBAZW1waHtpbmNsdWRpbmcgdGhvc2Ugd2l0aCBjb2RlcyBhYm92ZSAwMTc3fS4gIFRoZQorb25seSBzZW5zaWJsZSBleGNlcHRpb25zIHdvdWxkIGJlIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yCitpbnRlcmZhY2UgdG8gY2VydGFpbiB0eXBlcyBvZiBwcmludGVycyB0aGF0IGNhbid0IGhhbmRsZSB0aG9zZSBjaGFyYWN0ZXJzLgorCitDaGVjayBldmVyeSBzeXN0ZW0gY2FsbCBmb3IgYW4gZXJyb3IgcmV0dXJuLCB1bmxlc3MgeW91IGtub3cgeW91IHdpc2ggdG8KK2lnbm9yZSBlcnJvcnMuICBJbmNsdWRlIHRoZSBzeXN0ZW0gZXJyb3IgdGV4dCAoZnJvbSBAY29kZXtwZXJyb3J9IG9yCitlcXVpdmFsZW50KSBpbiBAZW1waHtldmVyeX0gZXJyb3IgbWVzc2FnZSByZXN1bHRpbmcgZnJvbSBhIGZhaWxpbmcKK3N5c3RlbSBjYWxsLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIGFueSBhbmQgdGhlIG5hbWUgb2YgdGhlCit1dGlsaXR5LiAgSnVzdCBgYGNhbm5vdCBvcGVuIGZvby5jJycgb3IgYGBzdGF0IGZhaWxlZCcnIGlzIG5vdAorc3VmZmljaWVudC4KKworQ2hlY2sgZXZlcnkgY2FsbCB0byBAY29kZXttYWxsb2N9IG9yIEBjb2Rle3JlYWxsb2N9IHRvIHNlZSBpZiBpdAorcmV0dXJuZWQgemVyby4gIENoZWNrIEBjb2Rle3JlYWxsb2N9IGV2ZW4gaWYgeW91IGFyZSBtYWtpbmcgdGhlIGJsb2NrCitzbWFsbGVyOyBpbiBhIHN5c3RlbSB0aGF0IHJvdW5kcyBibG9jayBzaXplcyB0byBhIHBvd2VyIG9mIDIsCitAY29kZXtyZWFsbG9jfSBtYXkgZ2V0IGEgZGlmZmVyZW50IGJsb2NrIGlmIHlvdSBhc2sgZm9yIGxlc3Mgc3BhY2UuCisKK0luIFVuaXgsIEBjb2Rle3JlYWxsb2N9IGNhbiBkZXN0cm95IHRoZSBzdG9yYWdlIGJsb2NrIGlmIGl0IHJldHVybnMKK3plcm8uICBHTlUgQGNvZGV7cmVhbGxvY30gZG9lcyBub3QgaGF2ZSB0aGlzIGJ1ZzogaWYgaXQgZmFpbHMsIHRoZQorb3JpZ2luYWwgYmxvY2sgaXMgdW5jaGFuZ2VkLiAgRmVlbCBmcmVlIHRvIGFzc3VtZSB0aGUgYnVnIGlzIGZpeGVkLiAgSWYKK3lvdSB3aXNoIHRvIHJ1biB5b3VyIHByb2dyYW0gb24gVW5peCwgYW5kIHdpc2ggdG8gYXZvaWQgbG9zc2FnZSBpbiB0aGlzCitjYXNlLCB5b3UgY2FuIHVzZSB0aGUgR05VIEBjb2Rle21hbGxvY30uCisKK1lvdSBtdXN0IGV4cGVjdCBAY29kZXtmcmVlfSB0byBhbHRlciB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIHRoYXQgd2FzCitmcmVlZC4gIEFueXRoaW5nIHlvdSB3YW50IHRvIGZldGNoIGZyb20gdGhlIGJsb2NrLCB5b3UgbXVzdCBmZXRjaCBiZWZvcmUKK2NhbGxpbmcgQGNvZGV7ZnJlZX0uCisKK0lmIEBjb2Rle21hbGxvY30gZmFpbHMgaW4gYSBub25pbnRlcmFjdGl2ZSBwcm9ncmFtLCBtYWtlIHRoYXQgYSBmYXRhbAorZXJyb3IuICBJbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCByZWFkcyBjb21tYW5kcyBmcm9tIHRoZQordXNlciksIGl0IGlzIGJldHRlciB0byBhYm9ydCB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIHRvIHRoZSBjb21tYW5kCityZWFkZXIgbG9vcC4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGtpbGwgb3RoZXIgcHJvY2Vzc2VzIHRvIGZyZWUgdXAKK3ZpcnR1YWwgbWVtb3J5LCBhbmQgdGhlbiB0cnkgdGhlIGNvbW1hbmQgYWdhaW4uCisKK1VzZSBAY29kZXtnZXRvcHRfbG9uZ30gdG8gZGVjb2RlIGFyZ3VtZW50cywgdW5sZXNzIHRoZSBhcmd1bWVudCBzeW50YXgKK21ha2VzIHRoaXMgdW5yZWFzb25hYmxlLgorCitXaGVuIHN0YXRpYyBzdG9yYWdlIGlzIHRvIGJlIHdyaXR0ZW4gaW4gZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLCB1c2UKK2V4cGxpY2l0IEMgY29kZSB0byBpbml0aWFsaXplIGl0LiAgUmVzZXJ2ZSBDIGluaXRpYWxpemVkIGRlY2xhcmF0aW9ucworZm9yIGRhdGEgdGhhdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgorQGMgQURSOiB3aHk/CisKK1RyeSB0byBhdm9pZCBsb3ctbGV2ZWwgaW50ZXJmYWNlcyB0byBvYnNjdXJlIFVuaXggZGF0YSBzdHJ1Y3R1cmVzIChzdWNoCithcyBmaWxlIGRpcmVjdG9yaWVzLCB1dG1wLCBvciB0aGUgbGF5b3V0IG9mIGtlcm5lbCBtZW1vcnkpLCBzaW5jZSB0aGVzZQorYXJlIGxlc3MgbGlrZWx5IHRvIHdvcmsgY29tcGF0aWJseS4gIElmIHlvdSBuZWVkIHRvIGZpbmQgYWxsIHRoZSBmaWxlcworaW4gYSBkaXJlY3RvcnksIHVzZSBAY29kZXtyZWFkZGlyfSBvciBzb21lIG90aGVyIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlLgorVGhlc2Ugd2lsbCBiZSBzdXBwb3J0ZWQgY29tcGF0aWJseSBieSBHTlUuCisKK0J5IGRlZmF1bHQsIHRoZSBHTlUgc3lzdGVtIHdpbGwgcHJvdmlkZSB0aGUgc2lnbmFsIGhhbmRsaW5nIGZ1bmN0aW9ucyBvZgorQHNje0JTRH0gYW5kIG9mIEBzY3tQT1NJWH0uICBTbyBHTlUgc29mdHdhcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdXNlCit0aGVzZS4KKworSW4gZXJyb3IgY2hlY2tzIHRoYXQgZGV0ZWN0IGBgaW1wb3NzaWJsZScnIGNvbmRpdGlvbnMsIGp1c3QgYWJvcnQuCitUaGVyZSBpcyB1c3VhbGx5IG5vIHBvaW50IGluIHByaW50aW5nIGFueSBtZXNzYWdlLiAgVGhlc2UgY2hlY2tzCitpbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIGJ1Z3MuICBXaG9ldmVyIHdhbnRzIHRvIGZpeCB0aGUgYnVncyB3aWxsIGhhdmUKK3RvIHJlYWQgdGhlIHNvdXJjZSBjb2RlIGFuZCBydW4gYSBkZWJ1Z2dlci4gIFNvIGV4cGxhaW4gdGhlIHByb2JsZW0gd2l0aAorY29tbWVudHMgaW4gdGhlIHNvdXJjZS4gIFRoZSByZWxldmFudCBkYXRhIHdpbGwgYmUgaW4gdmFyaWFibGVzLCB3aGljaAorYXJlIGVhc3kgdG8gZXhhbWluZSB3aXRoIHRoZSBkZWJ1Z2dlciwgc28gdGhlcmUgaXMgbm8gcG9pbnQgbW92aW5nIHRoZW0KK2Vsc2V3aGVyZS4KKworRG8gbm90IHVzZSBhIGNvdW50IG9mIGVycm9ycyBhcyB0aGUgZXhpdCBzdGF0dXMgZm9yIGEgcHJvZ3JhbS4KK0BlbXBoe1RoYXQgZG9lcyBub3Qgd29ya30sIGJlY2F1c2UgZXhpdCBzdGF0dXMgdmFsdWVzIGFyZSBsaW1pdGVkIHRvIDgKK2JpdHMgKDAgdGhyb3VnaCAyNTUpLiAgQSBzaW5nbGUgcnVuIG9mIHRoZSBwcm9ncmFtIG1pZ2h0IGhhdmUgMjU2CitlcnJvcnM7IGlmIHlvdSB0cnkgdG8gcmV0dXJuIDI1NiBhcyB0aGUgZXhpdCBzdGF0dXMsIHRoZSBwYXJlbnQgcHJvY2Vzcword2lsbCBzZWUgMCBhcyB0aGUgc3RhdHVzLCBhbmQgaXQgd2lsbCBhcHBlYXIgdGhhdCB0aGUgcHJvZ3JhbSBzdWNjZWVkZWQuCisKK0lmIHlvdSBtYWtlIHRlbXBvcmFyeSBmaWxlcywgY2hlY2sgdGhlIEBjb2Rle1RNUERJUn0gZW52aXJvbm1lbnQKK3ZhcmlhYmxlOyBpZiB0aGF0IHZhcmlhYmxlIGlzIGRlZmluZWQsIHVzZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQoraW5zdGVhZCBvZiBAZmlsZXsvdG1wfS4KKworQG5vZGUgTGlicmFyaWVzCitAc2VjdGlvbiBMaWJyYXJ5IEJlaGF2aW9yCisKK1RyeSB0byBtYWtlIGxpYnJhcnkgZnVuY3Rpb25zIHJlZW50cmFudC4gIElmIHRoZXkgbmVlZCB0byBkbyBkeW5hbWljCitzdG9yYWdlIGFsbG9jYXRpb24sIGF0IGxlYXN0IHRyeSB0byBhdm9pZCBhbnkgbm9ucmVlbnRyYW5jeSBhc2lkZSBmcm9tCit0aGF0IG9mIEBjb2Rle21hbGxvY30gaXRzZWxmLgorCitIZXJlIGFyZSBjZXJ0YWluIG5hbWUgY29udmVudGlvbnMgZm9yIGxpYnJhcmllcywgdG8gYXZvaWQgbmFtZQorY29uZmxpY3RzLgorCitDaG9vc2UgYSBuYW1lIHByZWZpeCBmb3IgdGhlIGxpYnJhcnksIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycyBsb25nLgorQWxsIGV4dGVybmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCB0aGlzCitwcmVmaXguICBJbiBhZGRpdGlvbiwgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIG9mIHRoZXNlIGluIGFueSBnaXZlbgorbGlicmFyeSBtZW1iZXIuICBUaGlzIHVzdWFsbHkgbWVhbnMgcHV0dGluZyBlYWNoIG9uZSBpbiBhIHNlcGFyYXRlCitzb3VyY2UgZmlsZS4KKworQW4gZXhjZXB0aW9uIGNhbiBiZSBtYWRlIHdoZW4gdHdvIGV4dGVybmFsIHN5bWJvbHMgYXJlIGFsd2F5cyB1c2VkCit0b2dldGhlciwgc28gdGhhdCBubyByZWFzb25hYmxlIHByb2dyYW0gY291bGQgdXNlIG9uZSB3aXRob3V0IHRoZQorb3RoZXI7IHRoZW4gdGhleSBjYW4gYm90aCBnbyBpbiB0aGUgc2FtZSBmaWxlLgorCitFeHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBkb2N1bWVudGVkIGVudHJ5IHBvaW50cyBmb3IgdGhlIHVzZXIKK3Nob3VsZCBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoIEBzYW1we199LiAgVGhleSBzaG91bGQgYWxzbyBjb250YWluCit0aGUgY2hvc2VuIG5hbWUgcHJlZml4IGZvciB0aGUgbGlicmFyeSwgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGgKK290aGVyIGxpYnJhcmllcy4gIFRoZXNlIGNhbiBnbyBpbiB0aGUgc2FtZSBmaWxlcyB3aXRoIHVzZXIgZW50cnkKK3BvaW50cyBpZiB5b3UgbGlrZS4KKworU3RhdGljIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGFzIHlvdSBsaWtlIGFuZCBuZWVkIG5vdAorZml0IGFueSBuYW1pbmcgY29udmVudGlvbi4KKworQG5vZGUgRXJyb3JzCitAc2VjdGlvbiBGb3JtYXR0aW5nIEVycm9yIE1lc3NhZ2VzCisKK0Vycm9yIG1lc3NhZ2VzIGZyb20gY29tcGlsZXJzIHNob3VsZCBsb29rIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK0B2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9CitAZW5kIGV4YW1wbGUKKworRXJyb3IgbWVzc2FnZXMgZnJvbSBvdGhlciBub25pbnRlcmFjdGl2ZSBwcm9ncmFtcyBzaG91bGQgbG9vayBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitAdmFye3Byb2dyYW19OkB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit3aGVuIHRoZXJlIGlzIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBmaWxlLCBvciBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitAdmFye3Byb2dyYW19OiBAdmFye21lc3NhZ2V9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit3aGVuIHRoZXJlIGlzIG5vIHJlbGV2YW50IHNvdXJjZSBmaWxlLgorCitJbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCBpcyByZWFkaW5nIGNvbW1hbmRzIGZyb20gYQordGVybWluYWwpLCBpdCBpcyBiZXR0ZXIgbm90IHRvIGluY2x1ZGUgdGhlIHByb2dyYW0gbmFtZSBpbiBhbiBlcnJvcgorbWVzc2FnZS4gIFRoZSBwbGFjZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9ncmFtIGlzIHJ1bm5pbmcgaXMgaW4gdGhlCitwcm9tcHQgb3Igd2l0aCB0aGUgc2NyZWVuIGxheW91dC4gIChXaGVuIHRoZSBzYW1lIHByb2dyYW0gcnVucyB3aXRoCitpbnB1dCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gYSB0ZXJtaW5hbCwgaXQgaXMgbm90IGludGVyYWN0aXZlIGFuZAord291bGQgZG8gYmVzdCB0byBwcmludCBlcnJvciBtZXNzYWdlcyB1c2luZyB0aGUgbm9uaW50ZXJhY3RpdmUgc3R5bGUuKQorCitUaGUgc3RyaW5nIEB2YXJ7bWVzc2FnZX0gc2hvdWxkIG5vdCBiZWdpbiB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgd2hlbgoraXQgZm9sbG93cyBhIHByb2dyYW0gbmFtZSBhbmQvb3IgZmlsZSBuYW1lLiAgQWxzbywgaXQgc2hvdWxkIG5vdCBlbmQKK3dpdGggYSBwZXJpb2QuCisKK0Vycm9yIG1lc3NhZ2VzIGZyb20gaW50ZXJhY3RpdmUgcHJvZ3JhbXMsIGFuZCBvdGhlciBtZXNzYWdlcyBzdWNoIGFzCit1c2FnZSBtZXNzYWdlcywgc2hvdWxkIHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4gIEJ1dCB0aGV5IHNob3VsZCBub3QKK2VuZCB3aXRoIGEgcGVyaW9kLgorCitAbm9kZSBVc2VyIEludGVyZmFjZXMKK0BzZWN0aW9uIFN0YW5kYXJkcyBmb3IgQ29tbWFuZCBMaW5lIEludGVyZmFjZXMKKworUGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIGEgdXRpbGl0eSBkZXBlbmQgb24gdGhlIG5hbWUgdXNlZAordG8gaW52b2tlIGl0LiAgSXQgaXMgdXNlZnVsIHNvbWV0aW1lcyB0byBtYWtlIGEgbGluayB0byBhIHV0aWxpdHkKK3dpdGggYSBkaWZmZXJlbnQgbmFtZSwgYW5kIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hhdCBpdCBkb2VzLgorCitJbnN0ZWFkLCB1c2UgYSBydW4gdGltZSBvcHRpb24gb3IgYSBjb21waWxhdGlvbiBzd2l0Y2ggb3IgYm90aAordG8gc2VsZWN0IGFtb25nIHRoZSBhbHRlcm5hdGUgYmVoYXZpb3JzLgorCitMaWtld2lzZSwgcGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9ncmFtIGRlcGVuZCBvbiB0aGUKK3R5cGUgb2Ygb3V0cHV0IGRldmljZSBpdCBpcyB1c2VkIHdpdGguICBEZXZpY2UgaW5kZXBlbmRlbmNlIGlzIGFuCitpbXBvcnRhbnQgcHJpbmNpcGxlIG9mIHRoZSBzeXN0ZW0ncyBkZXNpZ247IGRvIG5vdCBjb21wcm9taXNlIGl0CittZXJlbHkgdG8gc2F2ZSBzb21lb25lIGZyb20gdHlwaW5nIGFuIG9wdGlvbiBub3cgYW5kIHRoZW4uCisKK0lmIHlvdSB0aGluayBvbmUgYmVoYXZpb3IgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIGEKK3Rlcm1pbmFsLCBhbmQgYW5vdGhlciBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBvdXRwdXQgaXMgYSBmaWxlIG9yIGEKK3BpcGUsIHRoZW4gaXQgaXMgdXN1YWxseSBiZXN0IHRvIG1ha2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdGhlIG9uZSB0aGF0CitpcyB1c2VmdWwgd2l0aCBvdXRwdXQgdG8gYSB0ZXJtaW5hbCwgYW5kIGhhdmUgYW4gb3B0aW9uIGZvciB0aGUgb3RoZXIKK2JlaGF2aW9yLgorCitDb21wYXRpYmlsaXR5IHJlcXVpcmVzIGNlcnRhaW4gcHJvZ3JhbXMgdG8gZGVwZW5kIG9uIHRoZSB0eXBlIG9mIG91dHB1dAorZGV2aWNlLiAgSXQgd291bGQgYmUgZGlzYXN0cm91cyBpZiBAY29kZXtsc30gb3IgQGNvZGV7c2h9IGRpZCBub3QgZG8gc28KK2luIHRoZSB3YXkgYWxsIHVzZXJzIGV4cGVjdC4gIEluIHNvbWUgb2YgdGhlc2UgY2FzZXMsIHdlIHN1cHBsZW1lbnQgdGhlCitwcm9ncmFtIHdpdGggYSBwcmVmZXJyZWQgYWx0ZXJuYXRlIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCitvdXRwdXQgZGV2aWNlIHR5cGUuICBGb3IgZXhhbXBsZSwgd2UgcHJvdmlkZSBhIEBjb2Rle2Rpcn0gcHJvZ3JhbSBtdWNoCitsaWtlIEBjb2Rle2xzfSBleGNlcHQgdGhhdCBpdHMgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IGlzIGFsd2F5cworbXVsdGktY29sdW1uIGZvcm1hdC4KKworSXQgaXMgYSBnb29kIGlkZWEgdG8gZm9sbG93IHRoZSBAc2N7UE9TSVh9IGd1aWRlbGluZXMgZm9yIHRoZQorY29tbWFuZC1saW5lIG9wdGlvbnMgb2YgYSBwcm9ncmFtLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlCitAY29kZXtnZXRvcHR9IHRvIHBhcnNlIHRoZW0uICBOb3RlIHRoYXQgdGhlIEdOVSB2ZXJzaW9uIG9mIEBjb2Rle2dldG9wdH0KK3dpbGwgbm9ybWFsbHkgcGVybWl0IG9wdGlvbnMgYW55d2hlcmUgYW1vbmcgdGhlIGFyZ3VtZW50cyB1bmxlc3MgdGhlCitzcGVjaWFsIGFyZ3VtZW50IEBzYW1wey0tfSBpcyB1c2VkLiAgVGhpcyBpcyBub3Qgd2hhdCBAc2N7UE9TSVh9CitzcGVjaWZpZXM7IGl0IGlzIGEgR05VIGV4dGVuc2lvbi4KKworUGxlYXNlIGRlZmluZSBsb25nLW5hbWVkIG9wdGlvbnMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byB0aGUKK3NpbmdsZS1sZXR0ZXIgVW5peC1zdHlsZSBvcHRpb25zLiAgV2UgaG9wZSB0byBtYWtlIEdOVSBtb3JlIHVzZXIKK2ZyaWVuZGx5IHRoaXMgd2F5LiAgVGhpcyBpcyBlYXN5IHRvIGRvIHdpdGggdGhlIEdOVSBmdW5jdGlvbgorQGNvZGV7Z2V0b3B0X2xvbmd9LgorCitPbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgbG9uZy1uYW1lZCBvcHRpb25zIGlzIHRoYXQgdGhleSBjYW4gYmUKK2NvbnNpc3RlbnQgZnJvbSBwcm9ncmFtIHRvIHByb2dyYW0uICBGb3IgZXhhbXBsZSwgdXNlcnMgc2hvdWxkIGJlIGFibGUKK3RvIGV4cGVjdCB0aGUgYGB2ZXJib3NlJycgb3B0aW9uIG9mIGFueSBHTlUgcHJvZ3JhbSB3aGljaCBoYXMgb25lLCB0byBiZQorc3BlbGxlZCBwcmVjaXNlbHkgQHNhbXB7LS12ZXJib3NlfS4gIFRvIGFjaGlldmUgdGhpcyB1bmlmb3JtaXR5LCBsb29rIGF0Cit0aGUgdGFibGUgb2YgY29tbW9uIGxvbmctb3B0aW9uIG5hbWVzIHdoZW4geW91IGNob29zZSB0aGUgb3B0aW9uIG5hbWVzCitmb3IgeW91ciBwcm9ncmFtIChAcHhyZWZ7T3B0aW9uIFRhYmxlfSkuCisKK0l0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgZm9yIGZpbGUgbmFtZXMgZ2l2ZW4gYXMgb3JkaW5hcnkgYXJndW1lbnRzIHRvCitiZSBpbnB1dCBmaWxlcyBvbmx5OyBhbnkgb3V0cHV0IGZpbGVzIHdvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBvcHRpb25zCisocHJlZmVyYWJseSBAc2FtcHstb30gb3IgQHNhbXB7LS1vdXRwdXR9KS4gIEV2ZW4gaWYgeW91IGFsbG93IGFuIG91dHB1dAorZmlsZSBuYW1lIGFzIGFuIG9yZGluYXJ5IGFyZ3VtZW50IGZvciBjb21wYXRpYmlsaXR5LCB0cnkgdG8gcHJvdmlkZSBhbgorb3B0aW9uIGFzIGFub3RoZXIgd2F5IHRvIHNwZWNpZnkgaXQuICBUaGlzIHdpbGwgbGVhZCB0byBtb3JlIGNvbnNpc3RlbmN5CithbW9uZyBHTlUgdXRpbGl0aWVzLCBhbmQgZmV3ZXIgaWRpb3N5bmNyYWNpZXMgZm9yIHVzZXJzIHRvIHJlbWVtYmVyLgorCitBbGwgcHJvZ3JhbXMgc2hvdWxkIHN1cHBvcnQgdHdvIHN0YW5kYXJkIG9wdGlvbnM6IEBzYW1wey0tdmVyc2lvbn0KK2FuZCBAc2FtcHstLWhlbHB9LgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC0tdmVyc2lvbgorVGhpcyBvcHRpb24gc2hvdWxkIGRpcmVjdCB0aGUgcHJvZ3JhbSB0byBpbmZvcm1hdGlvbiBhYm91dCBpdHMgbmFtZSwKK3ZlcnNpb24sIG9yaWdpbiBhbmQgbGVnYWwgc3RhdHVzLCBhbGwgb24gc3RhbmRhcmQgb3V0cHV0LCBhbmQgdGhlbiBleGl0CitzdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZCBhcmd1bWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb25jZSB0aGlzCitpcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkIG5vdCBwZXJmb3JtIGl0cyBub3JtYWwgZnVuY3Rpb24uCisKK1RoZSBmaXJzdCBsaW5lIGlzIG1lYW50IHRvIGJlIGVhc3kgZm9yIGEgcHJvZ3JhbSB0byBwYXJzZTsgdGhlIHZlcnNpb24KK251bWJlciBwcm9wZXIgc3RhcnRzIGFmdGVyIHRoZSBsYXN0IHNwYWNlLiAgSW4gYWRkaXRpb24sIGl0IGNvbnRhaW5zCit0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgcHJvZ3JhbSwgaW4gdGhpcyBmb3JtYXQ6CisKK0BleGFtcGxlCitHTlUgRW1hY3MgMTkuMzAKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoZSBwcm9ncmFtJ3MgbmFtZSBzaG91bGQgYmUgYSBjb25zdGFudCBzdHJpbmc7IEBlbXBoe2Rvbid0fSBjb21wdXRlIGl0Citmcm9tIEBjb2Rle2FyZ3ZbMF19LiAgVGhlIGlkZWEgaXMgdG8gc3RhdGUgdGhlIHN0YW5kYXJkIG9yIGNhbm9uaWNhbAorbmFtZSBmb3IgdGhlIHByb2dyYW0sIG5vdCBpdHMgZmlsZSBuYW1lLiAgVGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZmluZAorb3V0IHRoZSBwcmVjaXNlIGZpbGUgbmFtZSB3aGVyZSBhIGNvbW1hbmQgaXMgZm91bmQgaW4gQGNvZGV7UEFUSH0uCisKK0lmIHRoZSBwcm9ncmFtIGlzIGEgc3Vic2lkaWFyeSBwYXJ0IG9mIGEgbGFyZ2VyIHBhY2thZ2UsIG1lbnRpb24gdGhlCitwYWNrYWdlIG5hbWUgaW4gcGFyZW50aGVzZXMsIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK2VtYWNzc2VydmVyIChHTlUgRW1hY3MpIDE5LjMwCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitJZiB0aGUgcGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzCitwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIsIHlvdSBjYW4gbWVudGlvbiB0aGUgcGFja2FnZSB2ZXJzaW9uIG51bWJlcgoranVzdCBiZWZvcmUgdGhlIGNsb3NlLXBhcmVudGhlc2lzLgorCitJZiB5b3UgQHN0cm9uZ3tuZWVkfSB0byBtZW50aW9uIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgbGlicmFyaWVzIHdoaWNoCithcmUgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIHRoaXMgcHJvZ3JhbSwKK3lvdSBjYW4gZG8gc28gYnkgcHJpbnRpbmcgYW4gYWRkaXRpb25hbCBsaW5lIG9mIHZlcnNpb24gaW5mbyBmb3IgZWFjaAorbGlicmFyeSB5b3Ugd2FudCB0byBtZW50aW9uLiAgVXNlIHRoZSBzYW1lIGZvcm1hdCBmb3IgdGhlc2UgbGluZXMgYXMgZm9yCit0aGUgZmlyc3QgbGluZS4KKworUGxlYXNlIGRvIG5vdCBtZW50aW9uIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgdGhlIHByb2dyYW0gdXNlcyBgYGp1c3QKK2ZvciBjb21wbGV0ZW5lc3MnJy0tLXRoYXQgd291bGQgcHJvZHVjZSBhIGxvdCBvZiB1bmhlbHBmdWwgY2x1dHRlci4KK1BsZWFzZSBtZW50aW9uIGxpYnJhcnkgdmVyc2lvbiBudW1iZXJzIG9ubHkgaWYgeW91IGZpbmQgaW4gcHJhY3RpY2UgdGhhdAordGhleSBhcmUgdmVyeSBpbXBvcnRhbnQgdG8geW91IGluIGRlYnVnZ2luZy4KKworVGhlIGZvbGxvd2luZyBsaW5lLCBhZnRlciB0aGUgdmVyc2lvbiBudW1iZXIgbGluZSBvciBsaW5lcywgc2hvdWxkIGJlIGEKK2NvcHlyaWdodCBub3RpY2UuICBJZiBtb3JlIHRoYW4gb25lIGNvcHlyaWdodCBub3RpY2UgaXMgY2FsbGVkIGZvciwgcHV0CitlYWNoIG9uIGEgc2VwYXJhdGUgbGluZS4KKworTmV4dCBzaG91bGQgZm9sbG93IGEgYnJpZWYgc3RhdGVtZW50IHRoYXQgdGhlIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZSwKK2FuZCB0aGF0IHVzZXJzIGFyZSBmcmVlIHRvIGNvcHkgYW5kIGNoYW5nZSBpdCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMuICBJZgordGhlIHByb2dyYW0gaXMgY292ZXJlZCBieSB0aGUgR05VIEdQTCwgc2F5IHNvIGhlcmUuICBBbHNvIG1lbnRpb24gdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4KKworSXQgaXMgb2sgdG8gZmluaXNoIHRoZSBvdXRwdXQgd2l0aCBhIGxpc3Qgb2YgdGhlIG1ham9yIGF1dGhvcnMgb2YgdGhlCitwcm9ncmFtLCBhcyBhIHdheSBvZiBnaXZpbmcgY3JlZGl0LgorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiBvdXRwdXQgdGhhdCBmb2xsb3dzIHRoZXNlIHJ1bGVzOgorCitAc21hbGxleGFtcGxlCitHTlUgRW1hY3MgMTkuMzQuNQorQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorR05VIEVtYWNzIGNvbWVzIHdpdGggTk8gV0FSUkFOVFksCit0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuCitZb3UgbWF5IHJlZGlzdHJpYnV0ZSBjb3BpZXMgb2YgR05VIEVtYWNzCit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWF0dGVycywKK3NlZSB0aGUgZmlsZXMgbmFtZWQgQ09QWUlORy4KK0BlbmQgc21hbGxleGFtcGxlCisKK1lvdSBzaG91bGQgYWRhcHQgdGhpcyB0byB5b3VyIHByb2dyYW0sIG9mIGNvdXJzZSwgZmlsbGluZyBpbiB0aGUgcHJvcGVyCit5ZWFyLCBjb3B5cmlnaHQgaG9sZGVyLCBuYW1lIG9mIHByb2dyYW0sIGFuZCB0aGUgcmVmZXJlbmNlcyB0bworZGlzdHJpYnV0aW9uIHRlcm1zLCBhbmQgY2hhbmdpbmcgdGhlIHJlc3Qgb2YgdGhlIHdvcmRpbmcgYXMgbmVjZXNzYXJ5LgorCitUaGlzIGNvcHlyaWdodCBub3RpY2Ugb25seSBuZWVkcyB0byBtZW50aW9uIHRoZSBtb3N0IHJlY2VudCB5ZWFyIGluCit3aGljaCBjaGFuZ2VzIHdlcmUgbWFkZS0tLXRoZXJlJ3Mgbm8gbmVlZCB0byBsaXN0IHRoZSB5ZWFycyBmb3IgcHJldmlvdXMKK3ZlcnNpb25zJyBjaGFuZ2VzLiAgWW91IGRvbid0IGhhdmUgdG8gbWVudGlvbiB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBpbgordGhlc2Ugbm90aWNlcywgaWYgdGhhdCBpcyBpbmNvbnZlbmllbnQsIHNpbmNlIGl0IGFwcGVhcmVkIGluIHRoZSBmaXJzdAorbGluZS4KKworQGl0ZW0gLS1oZWxwCitUaGlzIG9wdGlvbiBzaG91bGQgb3V0cHV0IGJyaWVmIGRvY3VtZW50YXRpb24gZm9yIGhvdyB0byBpbnZva2UgdGhlCitwcm9ncmFtLCBvbiBzdGFuZGFyZCBvdXRwdXQsIHRoZW4gZXhpdCBzdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZAorYXJndW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UgdGhpcyBpcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkCitub3QgcGVyZm9ybSBpdHMgbm9ybWFsIGZ1bmN0aW9uLgorCitOZWFyIHRoZSBlbmQgb2YgdGhlIEBzYW1wey0taGVscH0gb3B0aW9uJ3Mgb3V0cHV0IHRoZXJlIHNob3VsZCBiZSBhIGxpbmUKK3RoYXQgc2F5cyB3aGVyZSB0byBtYWlsIGJ1ZyByZXBvcnRzLiAgSXQgc2hvdWxkIGhhdmUgdGhpcyBmb3JtYXQ6CisKK0BleGFtcGxlCitSZXBvcnQgYnVncyB0byBAdmFye21haWxpbmctYWRkcmVzc30uCitAZW5kIGV4YW1wbGUKK0BlbmQgdGFibGUKKworQG5vZGUgT3B0aW9uIFRhYmxlCitAc2VjdGlvbiBUYWJsZSBvZiBMb25nIE9wdGlvbnMKKworSGVyZSBpcyBhIHRhYmxlIG9mIGxvbmcgb3B0aW9ucyB1c2VkIGJ5IEdOVSBwcm9ncmFtcy4gIEl0IGlzIHN1cmVseQoraW5jb21wbGV0ZSwgYnV0IHdlIGFpbSB0byBsaXN0IGFsbCB0aGUgb3B0aW9ucyB0aGF0IGEgbmV3IHByb2dyYW0gbWlnaHQKK3dhbnQgdG8gYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYgeW91IHVzZSBuYW1lcyBub3QgYWxyZWFkeSBpbiB0aGUgdGFibGUsCitwbGVhc2Ugc2VuZCBAZW1haWx7Z251QEBnbnUub3JnfSBhIGxpc3Qgb2YgdGhlbSwgd2l0aCB0aGVpcgorbWVhbmluZ3MsIHNvIHdlIGNhbiB1cGRhdGUgdGhlIHRhYmxlLgorCitAYyBQbGVhc2UgbGVhdmUgbmV3bGluZXMgYmV0d2VlbiBpdGVtcyBpbiB0aGlzIHRhYmxlOyBpdCdzIG11Y2ggZWFzaWVyCitAYyB0byB1cGRhdGUgd2hlbiBpdCBpc24ndCBjb21wbGV0ZWx5IHNxdWFzaGVkIHRvZ2V0aGVyIGFuZCB1bnJlYWRhYmxlLgorQGMgV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNob3J0IG9wdGlvbiBmb3IgYSBsb25nIG9wdGlvbiBuYW1lLCBwdXQKK0BjIGEgc2VtaWNvbG9uIGJldHdlZW4gdGhlIGxpc3RzIG9mIHRoZSBwcm9ncmFtcyB0aGF0IHVzZSB0aGVtLCBub3QgYQorQGMgcGVyaW9kLiAgIC0tZnJpZWRtYW4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBhZnRlci1kYXRlCitAc2FtcHstTn0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gYWxsCitAc2FtcHstYX0gaW4gQGNvZGV7ZHV9LCBAY29kZXtsc30sIEBjb2Rle25tfSwgQGNvZGV7c3R0eX0sIEBjb2Rle3VuYW1lfSwKK2FuZCBAY29kZXt1bmV4cGFuZH0uCisKK0BpdGVtIGFsbC10ZXh0CitAc2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIGFsbW9zdC1hbGwKK0BzYW1wey1BfSBpbiBAY29kZXtsc30uCisKK0BpdGVtIGFwcGVuZAorQHNhbXB7LWF9IGluIEBjb2Rle2V0YWdzfSwgQGNvZGV7dGVlfSwgQGNvZGV7dGltZX07CitAc2FtcHstcn0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gYXJjaGl2ZQorQHNhbXB7LWF9IGluIEBjb2Rle2NwfS4KKworQGl0ZW0gYXJjaGl2ZS1uYW1lCitAc2FtcHstbn0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIGFyZ2xlbmd0aAorQHNhbXB7LWx9IGluIEBjb2Rle200fS4KKworQGl0ZW0gYXNjaWkKK0BzYW1wey1hfSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gYXNzaWduCitAc2FtcHstdn0gaW4gQGNvZGV7Z2F3a30uCisKK0BpdGVtIGFzc3VtZS1uZXcKK0BzYW1wey1XfSBpbiBNYWtlLgorCitAaXRlbSBhc3N1bWUtb2xkCitAc2FtcHstb30gaW4gTWFrZS4KKworQGl0ZW0gYXV0by1jaGVjaworQHNhbXB7LWF9IGluIEBjb2Rle3JlY29kZX0uCisKK0BpdGVtIGF1dG8tcGFnZXIKK0BzYW1wey1hfSBpbiBAY29kZXt3ZGlmZn0uCisKK0BpdGVtIGF1dG8tcmVmZXJlbmNlCitAc2FtcHstQX0gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gYXZvaWQtd3JhcHMKK0BzYW1wey1ufSBpbiBAY29kZXt3ZGlmZn0uCisKK0BpdGVtIGJhY2t3YXJkLXNlYXJjaAorQHNhbXB7LUJ9IGluIEBjb2Rle2N0YWdzfS4KKworQGl0ZW0gYmFzZW5hbWUKK0BzYW1wey1mfSBpbiBAY29kZXtzaGFyfS4KKworQGl0ZW0gYmF0Y2gKK1VzZWQgaW4gR0RCLgorCitAaXRlbSBiYXVkCitVc2VkIGluIEdEQi4KKworQGl0ZW0gYmVmb3JlCitAc2FtcHstYn0gaW4gQGNvZGV7dGFjfS4KKworQGl0ZW0gYmluYXJ5CitAc2FtcHstYn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBiaXRzLXBlci1jb2RlCitAc2FtcHstYn0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIGJsb2NrLXNpemUKK1VzZWQgaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGJsb2NrcworQHNhbXB7LWJ9IGluIEBjb2Rle2hlYWR9IGFuZCBAY29kZXt0YWlsfS4KKworQGl0ZW0gYnJlYWstZmlsZQorQHNhbXB7LWJ9IGluIEBjb2Rle3B0eH0uCisKK0BpdGVtIGJyaWVmCitVc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gbWFrZSBvdXRwdXQgc2hvcnRlci4KKworQGl0ZW0gYnl0ZXMKK0BzYW1wey1jfSBpbiBAY29kZXtoZWFkfSwgQGNvZGV7c3BsaXR9LCBhbmQgQGNvZGV7dGFpbH0uCisKK0BpdGVtIGNAdHsrK30KK0BzYW1wey1DfSBpbiBAY29kZXtldGFnc30uCisKK0BpdGVtIGNhdGVuYXRlCitAc2FtcHstQX0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gY2QKK1VzZWQgaW4gdmFyaW91cyBwcm9ncmFtcyB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgdG8gdXNlLgorCitAaXRlbSBjaGFuZ2VzCitAc2FtcHstY30gaW4gQGNvZGV7Y2hncnB9IGFuZCBAY29kZXtjaG93bn0uCisKK0BpdGVtIGNsYXNzaWZ5CitAc2FtcHstRn0gaW4gQGNvZGV7bHN9LgorCitAaXRlbSBjb2xvbnMKK0BzYW1wey1jfSBpbiBAY29kZXtyZWNvZGV9LgorCitAaXRlbSBjb21tYW5kCitAc2FtcHstY30gaW4gQGNvZGV7c3V9OworQHNhbXB7LXh9IGluIEdEQi4KKworQGl0ZW0gY29tcGFyZQorQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGNvbXBhdAorVXNlZCBpbiBAY29kZXtnYXdrfS4KKworQGl0ZW0gY29tcHJlc3MKK0BzYW1wey1afSBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtzaGFyfS4KKworQGl0ZW0gY29uY2F0ZW5hdGUKK0BzYW1wey1BfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBjb25maXJtYXRpb24KK0BzYW1wey13fSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBjb250ZXh0CitVc2VkIGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBjb3B5bGVmdAorQHNhbXB7LVcgY29weWxlZnR9IGluIEBjb2Rle2dhd2t9LgorCitAaXRlbSBjb3B5cmlnaHQKK0BzYW1wey1DfSBpbiBAY29kZXtwdHh9LCBAY29kZXtyZWNvZGV9LCBhbmQgQGNvZGV7d2RpZmZ9OworQHNhbXB7LVcgY29weXJpZ2h0fSBpbiBAY29kZXtnYXdrfS4KKworQGl0ZW0gY29yZQorVXNlZCBpbiBHREIuCisKK0BpdGVtIGNvdW50CitAc2FtcHstcX0gaW4gQGNvZGV7d2hvfS4KKworQGl0ZW0gY291bnQtbGlua3MKK0BzYW1wey1sfSBpbiBAY29kZXtkdX0uCisKK0BpdGVtIGNyZWF0ZQorVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcGlvfS4KKworQGl0ZW0gY3V0LW1hcmsKK0BzYW1wey1jfSBpbiBAY29kZXtzaGFyfS4KKworQGl0ZW0gY3hyZWYKK0BzYW1wey14fSBpbiBAY29kZXtjdGFnc30uCisKK0BpdGVtIGRhdGUKK0BzYW1wey1kfSBpbiBAY29kZXt0b3VjaH0uCisKK0BpdGVtIGRlYnVnCitAc2FtcHstZH0gaW4gTWFrZSBhbmQgQGNvZGV7bTR9OworQHNhbXB7LXR9IGluIEJpc29uLgorCitAaXRlbSBkZWZpbmUKK0BzYW1wey1EfSBpbiBAY29kZXttNH0uCisKK0BpdGVtIGRlZmluZXMKK0BzYW1wey1kfSBpbiBCaXNvbiBhbmQgQGNvZGV7Y3RhZ3N9LgorCitAaXRlbSBkZWxldGUKK0BzYW1wey1EfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBkZXJlZmVyZW5jZQorQHNhbXB7LUx9IGluIEBjb2Rle2NoZ3JwfSwgQGNvZGV7Y2hvd259LCBAY29kZXtjcGlvfSwgQGNvZGV7ZHV9LAorQGNvZGV7bHN9LCBhbmQgQGNvZGV7dGFyfS4KKworQGl0ZW0gZGVyZWZlcmVuY2UtYXJncworQHNhbXB7LUR9IGluIEBjb2Rle2R1fS4KKworQGl0ZW0gZGlhY3JpdGljcworQHNhbXB7LWR9IGluIEBjb2Rle3JlY29kZX0uCisKK0BpdGVtIGRpY3Rpb25hcnktb3JkZXIKK0BzYW1wey1kfSBpbiBAY29kZXtsb29rfS4KKworQGl0ZW0gZGlmZgorQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGRpZ2l0cworQHNhbXB7LW59IGluIEBjb2Rle2NzcGxpdH0uCisKK0BpdGVtIGRpcmVjdG9yeQorU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHRvIHVzZSwgaW4gdmFyaW91cyBwcm9ncmFtcy4gIEluIEBjb2Rle2xzfSwgaXQKK21lYW5zIHRvIHNob3cgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyByYXRoZXIgdGhhbiB0aGVpciBjb250ZW50cy4gIEluCitAY29kZXtybX0gYW5kIEBjb2Rle2xufSwgaXQgbWVhbnMgdG8gbm90IHRyZWF0IGxpbmtzIHRvIGRpcmVjdG9yaWVzCitzcGVjaWFsbHkuCisKK0BpdGVtIGRpc2NhcmQtYWxsCitAc2FtcHsteH0gaW4gQGNvZGV7c3RyaXB9LgorCitAaXRlbSBkaXNjYXJkLWxvY2FscworQHNhbXB7LVh9IGluIEBjb2Rle3N0cmlwfS4KKworQGl0ZW0gZHJ5LXJ1bgorQHNhbXB7LW59IGluIE1ha2UuCisKK0BpdGVtIGVkCitAc2FtcHstZX0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIGVsaWRlLWVtcHR5LWZpbGVzCitAc2FtcHsten0gaW4gQGNvZGV7Y3NwbGl0fS4KKworQGl0ZW0gZW5kLWRlbGV0ZQorQHNhbXB7LXh9IGluIEBjb2Rle3dkaWZmfS4KKworQGl0ZW0gZW5kLWluc2VydAorQHNhbXB7LXp9IGluIEBjb2Rle3dkaWZmfS4KKworQGl0ZW0gZW50aXJlLW5ldy1maWxlCitAc2FtcHstTn0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIGVudmlyb25tZW50LW92ZXJyaWRlcworQHNhbXB7LWV9IGluIE1ha2UuCisKK0BpdGVtIGVvZgorQHNhbXB7LWV9IGluIEBjb2Rle3hhcmdzfS4KKworQGl0ZW0gZXBvY2gKK1VzZWQgaW4gR0RCLgorCitAaXRlbSBlcnJvci1saW1pdAorVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCisKK0BpdGVtIGVycm9yLW91dHB1dAorQHNhbXB7LW99IGluIEBjb2Rle200fS4KKworQGl0ZW0gZXNjYXBlCitAc2FtcHstYn0gaW4gQGNvZGV7bHN9LgorCitAaXRlbSBleGNsdWRlLWZyb20KK0BzYW1wey1YfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBleGVjCitVc2VkIGluIEdEQi4KKworQGl0ZW0gZXhpdAorQHNhbXB7LXh9IGluIEBjb2Rle3hhcmdzfS4KKworQGl0ZW0gZXhpdC0wCitAc2FtcHstZX0gaW4gQGNvZGV7dW5zaGFyfS4KKworQGl0ZW0gZXhwYW5kLXRhYnMKK0BzYW1wey10fSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gZXhwcmVzc2lvbgorQHNhbXB7LWV9IGluIEBjb2Rle3NlZH0uCisKK0BpdGVtIGV4dGVybi1vbmx5CitAc2FtcHstZ30gaW4gQGNvZGV7bm19LgorCitAaXRlbSBleHRyYWN0CitAc2FtcHstaX0gaW4gQGNvZGV7Y3Bpb307CitAc2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gZmFjZXMKK0BzYW1wey1mfSBpbiBAY29kZXtmaW5nZXJ9LgorCitAaXRlbSBmYXN0CitAc2FtcHstZn0gaW4gQGNvZGV7c3V9LgorCitAaXRlbSBmYXRhbC13YXJuaW5ncworQHNhbXB7LUV9IGluIEBjb2Rle200fS4KKworQGl0ZW0gZmlsZQorQHNhbXB7LWZ9IGluIEBjb2Rle2luZm99LCBAY29kZXtnYXdrfSwgTWFrZSwgQGNvZGV7bXR9LCBhbmQgQGNvZGV7dGFyfTsKK0BzYW1wey1ufSBpbiBAY29kZXtzZWR9OworQHNhbXB7LXJ9IGluIEBjb2Rle3RvdWNofS4KKworQGl0ZW0gZmllbGQtc2VwYXJhdG9yCitAc2FtcHstRn0gaW4gQGNvZGV7Z2F3a30uCisKK0BpdGVtIGZpbGUtcHJlZml4CitAc2FtcHstYn0gaW4gQmlzb24uCisKK0BpdGVtIGZpbGUtdHlwZQorQHNhbXB7LUZ9IGluIEBjb2Rle2xzfS4KKworQGl0ZW0gZmlsZXMtZnJvbQorQHNhbXB7LVR9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGZpbGwtY29sdW1uCitVc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KKworQGl0ZW0gZmxhZy10cnVuY2F0aW9uCitAc2FtcHstRn0gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gZml4ZWQtb3V0cHV0LWZpbGVzCitAc2FtcHsteX0gaW4gQmlzb24uCisKK0BpdGVtIGZvbGxvdworQHNhbXB7LWZ9IGluIEBjb2Rle3RhaWx9LgorCitAaXRlbSBmb290bm90ZS1zdHlsZQorVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCisKK0BpdGVtIGZvcmNlCitAc2FtcHstZn0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fSwgYW5kIEBjb2Rle3JtfS4KKworQGl0ZW0gZm9yY2UtcHJlZml4CitAc2FtcHstRn0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIGZvcm1hdAorVXNlZCBpbiBAY29kZXtsc30sIEBjb2Rle3RpbWV9LCBhbmQgQGNvZGV7cHR4fS4KKworQGl0ZW0gZnJlZXplLXN0YXRlCitAc2FtcHstRn0gaW4gQGNvZGV7bTR9LgorCitAaXRlbSBmdWxsbmFtZQorVXNlZCBpbiBHREIuCisKK0BpdGVtIGdhcC1zaXplCitAc2FtcHstZ30gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gZ2V0CitAc2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gZ3JhcGhpYworQHNhbXB7LWl9IGluIEBjb2Rle3VsfS4KKworQGl0ZW0gZ3JhcGhpY3MKK0BzYW1wey1nfSBpbiBAY29kZXtyZWNvZGV9LgorCitAaXRlbSBncm91cAorQHNhbXB7LWd9IGluIEBjb2Rle2luc3RhbGx9LgorCitAaXRlbSBnemlwCitAc2FtcHsten0gaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7c2hhcn0uCisKK0BpdGVtIGhhc2hzaXplCitAc2FtcHstSH0gaW4gQGNvZGV7bTR9LgorCitAaXRlbSBoZWFkZXIKK0BzYW1wey1ofSBpbiBAY29kZXtvYmpkdW1wfSBhbmQgQGNvZGV7cmVjb2RlfQorCitAaXRlbSBoZWFkaW5nCitAc2FtcHstSH0gaW4gQGNvZGV7d2hvfS4KKworQGl0ZW0gaGVscAorVXNlZCB0byBhc2sgZm9yIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uLgorCitAaXRlbSBoZXJlLWRlbGltaXRlcgorQHNhbXB7LWR9IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBoaWRlLWNvbnRyb2wtY2hhcnMKK0BzYW1wey1xfSBpbiBAY29kZXtsc30uCisKK0BpdGVtIGlkbGUKK0BzYW1wey11fSBpbiBAY29kZXt3aG99LgorCitAaXRlbSBpZmRlZgorQHNhbXB7LUR9IGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBpZ25vcmUKK0BzYW1wey1JfSBpbiBAY29kZXtsc307CitAc2FtcHsteH0gaW4gQGNvZGV7cmVjb2RlfS4KKworQGl0ZW0gaWdub3JlLWFsbC1zcGFjZQorQHNhbXB7LXd9IGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBpZ25vcmUtYmFja3VwcworQHNhbXB7LUJ9IGluIEBjb2Rle2xzfS4KKworQGl0ZW0gaWdub3JlLWJsYW5rLWxpbmVzCitAc2FtcHstQn0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIGlnbm9yZS1jYXNlCitAc2FtcHstZn0gaW4gQGNvZGV7bG9va30gYW5kIEBjb2Rle3B0eH07CitAc2FtcHstaX0gaW4gQGNvZGV7ZGlmZn0gYW5kIEBjb2Rle3dkaWZmfS4KKworQGl0ZW0gaWdub3JlLWVycm9ycworQHNhbXB7LWl9IGluIE1ha2UuCisKK0BpdGVtIGlnbm9yZS1maWxlCitAc2FtcHstaX0gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gaWdub3JlLWluZGVudGF0aW9uCitAc2FtcHstSX0gaW4gQGNvZGV7ZXRhZ3N9LgorCitAaXRlbSBpZ25vcmUtaW5pdC1maWxlCitAc2FtcHstZn0gaW4gT2xlby4KKworQGl0ZW0gaWdub3JlLWludGVycnVwdHMKK0BzYW1wey1pfSBpbiBAY29kZXt0ZWV9LgorCitAaXRlbSBpZ25vcmUtbWF0Y2hpbmctbGluZXMKK0BzYW1wey1JfSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gaWdub3JlLXNwYWNlLWNoYW5nZQorQHNhbXB7LWJ9IGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBpZ25vcmUtemVyb3MKK0BzYW1wey1pfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBpbmNsdWRlCitAc2FtcHstaX0gaW4gQGNvZGV7ZXRhZ3N9OworQHNhbXB7LUl9IGluIEBjb2Rle200fS4KKworQGl0ZW0gaW5jbHVkZS1kaXIKK0BzYW1wey1JfSBpbiBNYWtlLgorCitAaXRlbSBpbmNyZW1lbnRhbAorQHNhbXB7LUd9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGluZm8KK0BzYW1wey1pfSwgQHNhbXB7LWx9LCBhbmQgQHNhbXB7LW19IGluIEZpbmdlci4KKworQGl0ZW0gaW5pdGlhbAorQHNhbXB7LWl9IGluIEBjb2Rle2V4cGFuZH0uCisKK0BpdGVtIGluaXRpYWwtdGFiCitAc2FtcHstVH0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIGlub2RlCitAc2FtcHstaX0gaW4gQGNvZGV7bHN9LgorCitAaXRlbSBpbnRlcmFjdGl2ZQorQHNhbXB7LWl9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0sIEBjb2Rle3JtfTsKK0BzYW1wey1lfSBpbiBAY29kZXttNH07CitAc2FtcHstcH0gaW4gQGNvZGV7eGFyZ3N9OworQHNhbXB7LXd9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGludGVybWl4LXR5cGUKK0BzYW1wey1wfSBpbiBAY29kZXtzaGFyfS4KKworQGl0ZW0gam9icworQHNhbXB7LWp9IGluIE1ha2UuCisKK0BpdGVtIGp1c3QtcHJpbnQKK0BzYW1wey1ufSBpbiBNYWtlLgorCitAaXRlbSBrZWVwLWdvaW5nCitAc2FtcHsta30gaW4gTWFrZS4KKworQGl0ZW0ga2VlcC1maWxlcworQHNhbXB7LWt9IGluIEBjb2Rle2NzcGxpdH0uCisKK0BpdGVtIGtpbG9ieXRlcworQHNhbXB7LWt9IGluIEBjb2Rle2R1fSBhbmQgQGNvZGV7bHN9LgorCitAaXRlbSBsYW5ndWFnZQorQHNhbXB7LWx9IGluIEBjb2Rle2V0YWdzfS4KKworQGl0ZW0gbGVzcy1tb2RlCitAc2FtcHstbH0gaW4gQGNvZGV7d2RpZmZ9LgorCitAaXRlbSBsZXZlbC1mb3ItZ3ppcAorQHNhbXB7LWd9IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBsaW5lLWJ5dGVzCitAc2FtcHstQ30gaW4gQGNvZGV7c3BsaXR9LgorCitAaXRlbSBsaW5lcworVXNlZCBpbiBAY29kZXtzcGxpdH0sIEBjb2Rle2hlYWR9LCBhbmQgQGNvZGV7dGFpbH0uCisKK0BpdGVtIGxpbmsKK0BzYW1wey1sfSBpbiBAY29kZXtjcGlvfS4KKworQGl0ZW0gbGludAorQGl0ZW14IGxpbnQtb2xkCitVc2VkIGluIEBjb2Rle2dhd2t9LgorCitAaXRlbSBsaXN0CitAc2FtcHstdH0gaW4gQGNvZGV7Y3Bpb307CitAc2FtcHstbH0gaW4gQGNvZGV7cmVjb2RlfS4KKworQGl0ZW0gbGlzdAorQHNhbXB7LXR9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIGxpdGVyYWwKK0BzYW1wey1OfSBpbiBAY29kZXtsc30uCisKK0BpdGVtIGxvYWQtYXZlcmFnZQorQHNhbXB7LWx9IGluIE1ha2UuCisKK0BpdGVtIGxvZ2luCitVc2VkIGluIEBjb2Rle3N1fS4KKworQGl0ZW0gbWFjaGluZQorTm8gbGlzdGluZyBvZiB3aGljaCBwcm9ncmFtcyBhbHJlYWR5IHVzZSB0aGlzOworc29tZW9uZSBzaG91bGQgY2hlY2sgdG8KK3NlZSBpZiBhbnkgYWN0dWFsbHkgZG8sIGFuZCB0ZWxsIEBlbWFpbHtnbnVAQGdudS5vcmd9LgorCitAaXRlbSBtYWNyby1uYW1lCitAc2FtcHstTX0gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gbWFpbAorQHNhbXB7LW19IGluIEBjb2Rle2hlbGxvfSBhbmQgQGNvZGV7dW5hbWV9LgorCitAaXRlbSBtYWtlLWRpcmVjdG9yaWVzCitAc2FtcHstZH0gaW4gQGNvZGV7Y3Bpb30uCisKK0BpdGVtIG1ha2VmaWxlCitAc2FtcHstZn0gaW4gTWFrZS4KKworQGl0ZW0gbWFwcGVkCitVc2VkIGluIEdEQi4KKworQGl0ZW0gbWF4LWFyZ3MKK0BzYW1wey1ufSBpbiBAY29kZXt4YXJnc30uCisKK0BpdGVtIG1heC1jaGFycworQHNhbXB7LW59IGluIEBjb2Rle3hhcmdzfS4KKworQGl0ZW0gbWF4LWxpbmVzCitAc2FtcHstbH0gaW4gQGNvZGV7eGFyZ3N9LgorCitAaXRlbSBtYXgtbG9hZAorQHNhbXB7LWx9IGluIE1ha2UuCisKK0BpdGVtIG1heC1wcm9jcworQHNhbXB7LVB9IGluIEBjb2Rle3hhcmdzfS4KKworQGl0ZW0gbWVzZworQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCisKK0BpdGVtIG1lc3NhZ2UKK0BzYW1wey1UfSBpbiBAY29kZXt3aG99LgorCitAaXRlbSBtaW5pbWFsCitAc2FtcHstZH0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIG1peGVkLXV1ZW5jb2RlCitAc2FtcHstTX0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIG1vZGUKK0BzYW1wey1tfSBpbiBAY29kZXtpbnN0YWxsfSwgQGNvZGV7bWtkaXJ9LCBhbmQgQGNvZGV7bWtmaWZvfS4KKworQGl0ZW0gbW9kaWZpY2F0aW9uLXRpbWUKK0BzYW1wey1tfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBtdWx0aS12b2x1bWUKK0BzYW1wey1NfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBuYW1lLXByZWZpeAorQHNhbXB7LWF9IGluIEJpc29uLgorCitAaXRlbSBuZXN0aW5nLWxpbWl0CitAc2FtcHstTH0gaW4gQGNvZGV7bTR9LgorCitAaXRlbSBuZXQtaGVhZGVycworQHNhbXB7LWF9IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBuZXctZmlsZQorQHNhbXB7LVd9IGluIE1ha2UuCisKK0BpdGVtIG5vLWJ1aWx0aW4tcnVsZXMKK0BzYW1wey1yfSBpbiBNYWtlLgorCitAaXRlbSBuby1jaGFyYWN0ZXItY291bnQKK0BzYW1wey13fSBpbiBAY29kZXtzaGFyfS4KKworQGl0ZW0gbm8tY2hlY2stZXhpc3RpbmcKK0BzYW1wey14fSBpbiBAY29kZXtzaGFyfS4KKworQGl0ZW0gbm8tY29tbW9uCitAc2FtcHstM30gaW4gQGNvZGV7d2RpZmZ9LgorCitAaXRlbSBuby1jcmVhdGUKK0BzYW1wey1jfSBpbiBAY29kZXt0b3VjaH0uCisKK0BpdGVtIG5vLWRlZmluZXMKK0BzYW1wey1EfSBpbiBAY29kZXtldGFnc30uCisKK0BpdGVtIG5vLWRlbGV0ZWQKK0BzYW1wey0xfSBpbiBAY29kZXt3ZGlmZn0uCisKK0BpdGVtIG5vLWRlcmVmZXJlbmNlCitAc2FtcHstZH0gaW4gQGNvZGV7Y3B9LgorCitAaXRlbSBuby1pbnNlcnRlZAorQHNhbXB7LTJ9IGluIEBjb2Rle3dkaWZmfS4KKworQGl0ZW0gbm8ta2VlcC1nb2luZworQHNhbXB7LVN9IGluIE1ha2UuCisKK0BpdGVtIG5vLWxpbmVzCitAc2FtcHstbH0gaW4gQmlzb24uCisKK0BpdGVtIG5vLXBpcGluZworQHNhbXB7LVB9IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBuby1wcm9mCitAc2FtcHstZX0gaW4gQGNvZGV7Z3Byb2Z9LgorCitAaXRlbSBuby1yZWdleAorQHNhbXB7LVJ9IGluIEBjb2Rle2V0YWdzfS4KKworQGl0ZW0gbm8tc29ydAorQHNhbXB7LXB9IGluIEBjb2Rle25tfS4KKworQGl0ZW0gbm8tc3BsaXQKK1VzZWQgaW4gQGNvZGV7bWFrZWluZm99LgorCitAaXRlbSBuby1zdGF0aWMKK0BzYW1wey1hfSBpbiBAY29kZXtncHJvZn0uCisKK0BpdGVtIG5vLXRpbWUKK0BzYW1wey1FfSBpbiBAY29kZXtncHJvZn0uCisKK0BpdGVtIG5vLXRpbWVzdGFtcAorQHNhbXB7LW19IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBuby12YWxpZGF0ZQorVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCisKK0BpdGVtIG5vLXdhaXQKK1VzZWQgaW4gQGNvZGV7ZW1hY3NjbGllbnR9LgorCitAaXRlbSBuby13YXJuCitVc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gaW5oaWJpdCB3YXJuaW5ncy4KKworQGl0ZW0gbm9kZQorQHNhbXB7LW59IGluIEBjb2Rle2luZm99LgorCitAaXRlbSBub2RlbmFtZQorQHNhbXB7LW59IGluIEBjb2Rle3VuYW1lfS4KKworQGl0ZW0gbm9ubWF0Y2hpbmcKK0BzYW1wey1mfSBpbiBAY29kZXtjcGlvfS4KKworQGl0ZW0gbnN0dWZmCitAc2FtcHstbn0gaW4gQGNvZGV7b2JqZHVtcH0uCisKK0BpdGVtIG51bGwKK0BzYW1wey0wfSBpbiBAY29kZXt4YXJnc30uCisKK0BpdGVtIG51bWJlcgorQHNhbXB7LW59IGluIEBjb2Rle2NhdH0uCisKK0BpdGVtIG51bWJlci1ub25ibGFuaworQHNhbXB7LWJ9IGluIEBjb2Rle2NhdH0uCisKK0BpdGVtIG51bWVyaWMtc29ydAorQHNhbXB7LW59IGluIEBjb2Rle25tfS4KKworQGl0ZW0gbnVtZXJpYy11aWQtZ2lkCitAc2FtcHstbn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2xzfS4KKworQGl0ZW0gbngKK1VzZWQgaW4gR0RCLgorCitAaXRlbSBvbGQtYXJjaGl2ZQorQHNhbXB7LW99IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIG9sZC1maWxlCitAc2FtcHstb30gaW4gTWFrZS4KKworQGl0ZW0gb25lLWZpbGUtc3lzdGVtCitAc2FtcHstbH0gaW4gQGNvZGV7dGFyfSwgQGNvZGV7Y3B9LCBhbmQgQGNvZGV7ZHV9LgorCitAaXRlbSBvbmx5LWZpbGUKK0BzYW1wey1vfSBpbiBAY29kZXtwdHh9LgorCitAaXRlbSBvbmx5LXByb2YKK0BzYW1wey1mfSBpbiBAY29kZXtncHJvZn0uCisKK0BpdGVtIG9ubHktdGltZQorQHNhbXB7LUZ9IGluIEBjb2Rle2dwcm9mfS4KKworQGl0ZW0gb3V0cHV0CitJbiB2YXJpb3VzIHByb2dyYW1zLCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLgorCitAaXRlbSBvdXRwdXQtcHJlZml4CitAc2FtcHstb30gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIG92ZXJyaWRlCitAc2FtcHstb30gaW4gQGNvZGV7cm19LgorCitAaXRlbSBvdmVyd3JpdGUKK0BzYW1wey1jfSBpbiBAY29kZXt1bnNoYXJ9LgorCitAaXRlbSBvd25lcgorQHNhbXB7LW99IGluIEBjb2Rle2luc3RhbGx9LgorCitAaXRlbSBwYWdpbmF0ZQorQHNhbXB7LWx9IGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBwYXJhZ3JhcGgtaW5kZW50CitVc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KKworQGl0ZW0gcGFyZW50cworQHNhbXB7LXB9IGluIEBjb2Rle21rZGlyfSBhbmQgQGNvZGV7cm1kaXJ9LgorCitAaXRlbSBwYXNzLWFsbAorQHNhbXB7LXB9IGluIEBjb2Rle3VsfS4KKworQGl0ZW0gcGFzcy10aHJvdWdoCitAc2FtcHstcH0gaW4gQGNvZGV7Y3Bpb30uCisKK0BpdGVtIHBvcnQKK0BzYW1wey1QfSBpbiBAY29kZXtmaW5nZXJ9LgorCitAaXRlbSBwb3J0YWJpbGl0eQorQHNhbXB7LWN9IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXt0YXJ9LgorCitAaXRlbSBwb3NpeAorVXNlZCBpbiBAY29kZXtnYXdrfS4KKworQGl0ZW0gcHJlZml4LWJ1aWx0aW5zCitAc2FtcHstUH0gaW4gQGNvZGV7bTR9LgorCitAaXRlbSBwcmVmaXgKK0BzYW1wey1mfSBpbiBAY29kZXtjc3BsaXR9LgorCitAaXRlbSBwcmVzZXJ2ZQorVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcH0uCisKK0BpdGVtIHByZXNlcnZlLWVudmlyb25tZW50CitAc2FtcHstcH0gaW4gQGNvZGV7c3V9LgorCitAaXRlbSBwcmVzZXJ2ZS1tb2RpZmljYXRpb24tdGltZQorQHNhbXB7LW19IGluIEBjb2Rle2NwaW99LgorCitAaXRlbSBwcmVzZXJ2ZS1vcmRlcgorQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIHByZXNlcnZlLXBlcm1pc3Npb25zCitAc2FtcHstcH0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gcHJpbnQKK0BzYW1wey1sfSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gcHJpbnQtY2hhcnMKK0BzYW1wey1MfSBpbiBAY29kZXtjbXB9LgorCitAaXRlbSBwcmludC1kYXRhLWJhc2UKK0BzYW1wey1wfSBpbiBNYWtlLgorCitAaXRlbSBwcmludC1kaXJlY3RvcnkKK0BzYW1wey13fSBpbiBNYWtlLgorCitAaXRlbSBwcmludC1maWxlLW5hbWUKK0BzYW1wey1vfSBpbiBAY29kZXtubX0uCisKK0BpdGVtIHByaW50LXN5bWRlZnMKK0BzYW1wey1zfSBpbiBAY29kZXtubX0uCisKK0BpdGVtIHByaW50ZXIKK0BzYW1wey1wfSBpbiBAY29kZXt3ZGlmZn0uCisKK0BpdGVtIHByb21wdAorQHNhbXB7LXB9IGluIEBjb2Rle2VkfS4KKworQGl0ZW0gcXVlcnktdXNlcgorQHNhbXB7LVh9IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBxdWVzdGlvbgorQHNhbXB7LXF9IGluIE1ha2UuCisKK0BpdGVtIHF1aWV0CitVc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LiAgQHN0cm9uZ3tOb3RlOn0gZXZlcnkKK3Byb2dyYW0gYWNjZXB0aW5nIEBzYW1wey0tcXVpZXR9IHNob3VsZCBhY2NlcHQgQHNhbXB7LS1zaWxlbnR9IGFzIGEKK3N5bm9ueW0uCisKK0BpdGVtIHF1aWV0LXVuc2hhcgorQHNhbXB7LVF9IGluIEBjb2Rle3NoYXJ9CisKK0BpdGVtIHF1b3RlLW5hbWUKK0BzYW1wey1RfSBpbiBAY29kZXtsc30uCisKK0BpdGVtIHJjcworQHNhbXB7LW59IGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSByZS1pbnRlcnZhbAorVXNlZCBpbiBAY29kZXtnYXdrfS4KKworQGl0ZW0gcmVhZC1mdWxsLWJsb2NrcworQHNhbXB7LUJ9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIHJlYWRub3cKK1VzZWQgaW4gR0RCLgorCitAaXRlbSByZWNvbgorQHNhbXB7LW59IGluIE1ha2UuCisKK0BpdGVtIHJlY29yZC1udW1iZXIKK0BzYW1wey1SfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSByZWN1cnNpdmUKK1VzZWQgaW4gQGNvZGV7Y2hncnB9LCBAY29kZXtjaG93bn0sIEBjb2Rle2NwfSwgQGNvZGV7bHN9LCBAY29kZXtkaWZmfSwKK2FuZCBAY29kZXtybX0uCisKK0BpdGVtIHJlZmVyZW5jZS1saW1pdAorVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCisKK0BpdGVtIHJlZmVyZW5jZXMKK0BzYW1wey1yfSBpbiBAY29kZXtwdHh9LgorCitAaXRlbSByZWdleAorQHNhbXB7LXJ9IGluIEBjb2Rle3RhY30gYW5kIEBjb2Rle2V0YWdzfS4KKworQGl0ZW0gcmVsZWFzZQorQHNhbXB7LXJ9IGluIEBjb2Rle3VuYW1lfS4KKworQGl0ZW0gcmVsb2FkLXN0YXRlCitAc2FtcHstUn0gaW4gQGNvZGV7bTR9LgorCitAaXRlbSByZWxvY2F0aW9uCitAc2FtcHstcn0gaW4gQGNvZGV7b2JqZHVtcH0uCisKK0BpdGVtIHJlbmFtZQorQHNhbXB7LXJ9IGluIEBjb2Rle2NwaW99LgorCitAaXRlbSByZXBsYWNlCitAc2FtcHstaX0gaW4gQGNvZGV7eGFyZ3N9LgorCitAaXRlbSByZXBvcnQtaWRlbnRpY2FsLWZpbGVzCitAc2FtcHstc30gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIHJlc2V0LWFjY2Vzcy10aW1lCitAc2FtcHstYX0gaW4gQGNvZGV7Y3Bpb30uCisKK0BpdGVtIHJldmVyc2UKK0BzYW1wey1yfSBpbiBAY29kZXtsc30gYW5kIEBjb2Rle25tfS4KKworQGl0ZW0gcmV2ZXJzZWQtZWQKK0BzYW1wey1mfSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gcmlnaHQtc2lkZS1kZWZzCitAc2FtcHstUn0gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gc2FtZS1vcmRlcgorQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIHNhbWUtcGVybWlzc2lvbnMKK0BzYW1wey1wfSBpbiBAY29kZXt0YXJ9LgorCitAaXRlbSBzYXZlCitAc2FtcHstZ30gaW4gQGNvZGV7c3R0eX0uCisKK0BpdGVtIHNlCitVc2VkIGluIEdEQi4KKworQGl0ZW0gc2VudGVuY2UtcmVnZXhwCitAc2FtcHstU30gaW4gQGNvZGV7cHR4fS4KKworQGl0ZW0gc2VwYXJhdGUtZGlycworQHNhbXB7LVN9IGluIEBjb2Rle2R1fS4KKworQGl0ZW0gc2VwYXJhdG9yCitAc2FtcHstc30gaW4gQGNvZGV7dGFjfS4KKworQGl0ZW0gc2VxdWVuY2UKK1VzZWQgYnkgQGNvZGV7cmVjb2RlfSB0byBjaG9zZSBmaWxlcyBvciBwaXBlcyBmb3Igc2VxdWVuY2luZyBwYXNzZXMuCisKK0BpdGVtIHNoZWxsCitAc2FtcHstc30gaW4gQGNvZGV7c3V9LgorCitAaXRlbSBzaG93LWFsbAorQHNhbXB7LUF9IGluIEBjb2Rle2NhdH0uCisKK0BpdGVtIHNob3ctYy1mdW5jdGlvbgorQHNhbXB7LXB9IGluIEBjb2Rle2RpZmZ9LgorCitAaXRlbSBzaG93LWVuZHMKK0BzYW1wey1FfSBpbiBAY29kZXtjYXR9LgorCitAaXRlbSBzaG93LWZ1bmN0aW9uLWxpbmUKK0BzYW1wey1GfSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gc2hvdy10YWJzCitAc2FtcHstVH0gaW4gQGNvZGV7Y2F0fS4KKworQGl0ZW0gc2lsZW50CitVc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LgorQHN0cm9uZ3tOb3RlOn0gZXZlcnkgcHJvZ3JhbSBhY2NlcHRpbmcKK0BzYW1wey0tc2lsZW50fSBzaG91bGQgYWNjZXB0IEBzYW1wey0tcXVpZXR9IGFzIGEgc3lub255bS4KKworQGl0ZW0gc2l6ZQorQHNhbXB7LXN9IGluIEBjb2Rle2xzfS4KKworQGl0ZW0gc29ydAorVXNlZCBpbiBAY29kZXtsc30uCisKK0BpdGVtIHNvdXJjZQorQHNhbXB7LVcgc291cmNlfSBpbiBAY29kZXtnYXdrfS4KKworQGl0ZW0gc3BhcnNlCitAc2FtcHstU30gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gc3BlZWQtbGFyZ2UtZmlsZXMKK0BzYW1wey1IfSBpbiBAY29kZXtkaWZmfS4KKworQGl0ZW0gc3BsaXQtYXQKK0BzYW1wey1FfSBpbiBAY29kZXt1bnNoYXJ9LgorCitAaXRlbSBzcGxpdC1zaXplLWxpbWl0CitAc2FtcHstTH0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIHNxdWVlemUtYmxhbmsKK0BzYW1wey1zfSBpbiBAY29kZXtjYXR9LgorCitAaXRlbSBzdGFydC1kZWxldGUKK0BzYW1wey13fSBpbiBAY29kZXt3ZGlmZn0uCisKK0BpdGVtIHN0YXJ0LWluc2VydAorQHNhbXB7LXl9IGluIEBjb2Rle3dkaWZmfS4KKworQGl0ZW0gc3RhcnRpbmctZmlsZQorVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtkaWZmfSB0byBzcGVjaWZ5IHdoaWNoIGZpbGUgd2l0aGluCithIGRpcmVjdG9yeSB0byBzdGFydCBwcm9jZXNzaW5nIHdpdGguCisKK0BpdGVtIHN0YXRpc3RpY3MKK0BzYW1wey1zfSBpbiBAY29kZXt3ZGlmZn0uCisKK0BpdGVtIHN0ZGluLWZpbGUtbGlzdAorQHNhbXB7LVN9IGluIEBjb2Rle3NoYXJ9LgorCitAaXRlbSBzdG9wCitAc2FtcHstU30gaW4gTWFrZS4KKworQGl0ZW0gc3RyaWN0CitAc2FtcHstc30gaW4gQGNvZGV7cmVjb2RlfS4KKworQGl0ZW0gc3RyaXAKK0BzYW1wey1zfSBpbiBAY29kZXtpbnN0YWxsfS4KKworQGl0ZW0gc3RyaXAtYWxsCitAc2FtcHstc30gaW4gQGNvZGV7c3RyaXB9LgorCitAaXRlbSBzdHJpcC1kZWJ1ZworQHNhbXB7LVN9IGluIEBjb2Rle3N0cmlwfS4KKworQGl0ZW0gc3VibWl0dGVyCitAc2FtcHstc30gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIHN1ZmZpeAorQHNhbXB7LVN9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0uCisKK0BpdGVtIHN1ZmZpeC1mb3JtYXQKK0BzYW1wey1ifSBpbiBAY29kZXtjc3BsaXR9LgorCitAaXRlbSBzdW0KK0BzYW1wey1zfSBpbiBAY29kZXtncHJvZn0uCisKK0BpdGVtIHN1bW1hcml6ZQorQHNhbXB7LXN9IGluIEBjb2Rle2R1fS4KKworQGl0ZW0gc3ltYm9saWMKK0BzYW1wey1zfSBpbiBAY29kZXtsbn0uCisKK0BpdGVtIHN5bWJvbHMKK1VzZWQgaW4gR0RCIGFuZCBAY29kZXtvYmpkdW1wfS4KKworQGl0ZW0gc3luY2xpbmVzCitAc2FtcHstc30gaW4gQGNvZGV7bTR9LgorCitAaXRlbSBzeXNuYW1lCitAc2FtcHstc30gaW4gQGNvZGV7dW5hbWV9LgorCitAaXRlbSB0YWJzCitAc2FtcHstdH0gaW4gQGNvZGV7ZXhwYW5kfSBhbmQgQGNvZGV7dW5leHBhbmR9LgorCitAaXRlbSB0YWJzaXplCitAc2FtcHstVH0gaW4gQGNvZGV7bHN9LgorCitAaXRlbSB0ZXJtaW5hbAorQHNhbXB7LVR9IGluIEBjb2Rle3RwdXR9IGFuZCBAY29kZXt1bH0uCitAc2FtcHstdH0gaW4gQGNvZGV7d2RpZmZ9LgorCitAaXRlbSB0ZXh0CitAc2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCisKK0BpdGVtIHRleHQtZmlsZXMKK0BzYW1wey1UfSBpbiBAY29kZXtzaGFyfS4KKworQGl0ZW0gdGltZQorVXNlZCBpbiBAY29kZXtsc30gYW5kIEBjb2Rle3RvdWNofS4KKworQGl0ZW0gdG8tc3Rkb3V0CitAc2FtcHstT30gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gdG90YWwKK0BzYW1wey1jfSBpbiBAY29kZXtkdX0uCisKK0BpdGVtIHRvdWNoCitAc2FtcHstdH0gaW4gTWFrZSwgQGNvZGV7cmFubGlifSwgYW5kIEBjb2Rle3JlY29kZX0uCisKK0BpdGVtIHRyYWNlCitAc2FtcHstdH0gaW4gQGNvZGV7bTR9LgorCitAaXRlbSB0cmFkaXRpb25hbAorQHNhbXB7LXR9IGluIEBjb2Rle2hlbGxvfTsKK0BzYW1wey1XIHRyYWRpdGlvbmFsfSBpbiBAY29kZXtnYXdrfTsKK0BzYW1wey1HfSBpbiBAY29kZXtlZH0sIEBjb2Rle200fSwgYW5kIEBjb2Rle3B0eH0uCisKK0BpdGVtIHR0eQorVXNlZCBpbiBHREIuCisKK0BpdGVtIHR5cGVkZWZzCitAc2FtcHstdH0gaW4gQGNvZGV7Y3RhZ3N9LgorCitAaXRlbSB0eXBlZGVmcy1hbmQtYysrCitAc2FtcHstVH0gaW4gQGNvZGV7Y3RhZ3N9LgorCitAaXRlbSB0eXBlc2V0LW1vZGUKK0BzYW1wey10fSBpbiBAY29kZXtwdHh9LgorCitAaXRlbSB1bmNvbXByZXNzCitAc2FtcHsten0gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gdW5jb25kaXRpb25hbAorQHNhbXB7LXV9IGluIEBjb2Rle2NwaW99LgorCitAaXRlbSB1bmRlZmluZQorQHNhbXB7LVV9IGluIEBjb2Rle200fS4KKworQGl0ZW0gdW5kZWZpbmVkLW9ubHkKK0BzYW1wey11fSBpbiBAY29kZXtubX0uCisKK0BpdGVtIHVwZGF0ZQorQHNhbXB7LXV9IGluIEBjb2Rle2NwfSwgQGNvZGV7Y3RhZ3N9LCBAY29kZXttdn0sIEBjb2Rle3Rhcn0uCisKK0BpdGVtIHVzYWdlCitVc2VkIGluIEBjb2Rle2dhd2t9OyBzYW1lIGFzIEBzYW1wey0taGVscH0uCisKK0BpdGVtIHV1ZW5jb2RlCitAc2FtcHstQn0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIHZhbmlsbGEtb3BlcmF0aW9uCitAc2FtcHstVn0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIHZlcmJvc2UKK1ByaW50IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHJvZ3Jlc3MuICBNYW55IHByb2dyYW1zIHN1cHBvcnQgdGhpcy4KKworQGl0ZW0gdmVyaWZ5CitAc2FtcHstV30gaW4gQGNvZGV7dGFyfS4KKworQGl0ZW0gdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyLgorCitAaXRlbSB2ZXJzaW9uLWNvbnRyb2wKK0BzYW1wey1WfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LgorCitAaXRlbSB2Z3JpbmQKK0BzYW1wey12fSBpbiBAY29kZXtjdGFnc30uCisKK0BpdGVtIHZvbHVtZQorQHNhbXB7LVZ9IGluIEBjb2Rle3Rhcn0uCisKK0BpdGVtIHdoYXQtaWYKK0BzYW1wey1XfSBpbiBNYWtlLgorCitAaXRlbSB3aG9sZS1zaXplLWxpbWl0CitAc2FtcHstbH0gaW4gQGNvZGV7c2hhcn0uCisKK0BpdGVtIHdpZHRoCitAc2FtcHstd30gaW4gQGNvZGV7bHN9IGFuZCBAY29kZXtwdHh9LgorCitAaXRlbSB3b3JkLXJlZ2V4cAorQHNhbXB7LVd9IGluIEBjb2Rle3B0eH0uCisKK0BpdGVtIHdyaXRhYmxlCitAc2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KKworQGl0ZW0gemVyb3MKK0BzYW1wey16fSBpbiBAY29kZXtncHJvZn0uCitAZW5kIHRhYmxlCisKK0Bub2RlIE1lbW9yeSBVc2FnZQorQHNlY3Rpb24gTWVtb3J5IFVzYWdlCisKK0lmIGl0IHR5cGljYWxseSB1c2VzIGp1c3QgYSBmZXcgbWVnIG9mIG1lbW9yeSwgZG9uJ3QgYm90aGVyIG1ha2luZyBhbnkKK2VmZm9ydCB0byByZWR1Y2UgbWVtb3J5IHVzYWdlLiAgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIGltcHJhY3RpY2FsIGZvcgorb3RoZXIgcmVhc29ucyB0byBvcGVyYXRlIG9uIGZpbGVzIG1vcmUgdGhhbiBhIGZldyBtZWcgbG9uZywgaXQgaXMKK3JlYXNvbmFibGUgdG8gcmVhZCBlbnRpcmUgaW5wdXQgZmlsZXMgaW50byBjb3JlIHRvIG9wZXJhdGUgb24gdGhlbS4KKworSG93ZXZlciwgZm9yIHByb2dyYW1zIHN1Y2ggYXMgQGNvZGV7Y2F0fSBvciBAY29kZXt0YWlsfSwgdGhhdCBjYW4KK3VzZWZ1bGx5IG9wZXJhdGUgb24gdmVyeSBsYXJnZSBmaWxlcywgaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHVzaW5nIGEKK3RlY2huaXF1ZSB0aGF0IHdvdWxkIGFydGlmaWNpYWxseSBsaW1pdCB0aGUgc2l6ZSBvZiBmaWxlcyBpdCBjYW4gaGFuZGxlLgorSWYgYSBwcm9ncmFtIHdvcmtzIGJ5IGxpbmVzIGFuZCBjb3VsZCBiZSBhcHBsaWVkIHRvIGFyYml0cmFyeQordXNlci1zdXBwbGllZCBpbnB1dCBmaWxlcywgaXQgc2hvdWxkIGtlZXAgb25seSBhIGxpbmUgaW4gbWVtb3J5LCBiZWNhdXNlCit0aGlzIGlzIG5vdCB2ZXJ5IGhhcmQgYW5kIHVzZXJzIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIG9wZXJhdGUgb24gaW5wdXQKK2ZpbGVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIHdpbGwgZml0IGluIGNvcmUgYWxsIGF0IG9uY2UuCisKK0lmIHlvdXIgcHJvZ3JhbSBjcmVhdGVzIGNvbXBsaWNhdGVkIGRhdGEgc3RydWN0dXJlcywganVzdCBtYWtlIHRoZW0gaW4KK2NvcmUgYW5kIGdpdmUgYSBmYXRhbCBlcnJvciBpZiBAY29kZXttYWxsb2N9IHJldHVybnMgemVyby4KKworQG5vZGUgV3JpdGluZyBDCitAY2hhcHRlciBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKKworVGhpcyBAdmFsdWV7Q0hBUFRFUn0gcHJvdmlkZXMgYWR2aWNlIG9uIGhvdyBiZXN0IHRvIHVzZSB0aGUgQyBsYW5ndWFnZQord2hlbiB3cml0aW5nIEdOVSBzb2Z0d2FyZS4KKworQG1lbnUKKyogRm9ybWF0dGluZzo6ICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCisqIENvbW1lbnRzOjogICAgICAgICAgICAgICAgICAgIENvbW1lbnRpbmcgWW91ciBXb3JrCisqIFN5bnRhY3RpYyBDb252ZW50aW9uczo6ICAgICAgIENsZWFuIFVzZSBvZiBDIENvbnN0cnVjdHMKKyogTmFtZXM6OiAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCisqIFN5c3RlbSBQb3J0YWJpbGl0eTo6ICAgICAgICAgIFBvcnRhYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zCisqIENQVSBQb3J0YWJpbGl0eTo6ICAgICAgICAgICAgIFN1cHBvcnRpbmcgdGhlIHJhbmdlIG9mIENQVSB0eXBlcworKiBTeXN0ZW0gRnVuY3Rpb25zOjogICAgICAgICAgICBQb3J0YWJpbGl0eSBhbmQgYGBzdGFuZGFyZCcnIGxpYnJhcnkgZnVuY3Rpb25zCisqIEludGVybmF0aW9uYWxpemF0aW9uOjogICAgICAgIFRlY2huaXF1ZXMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uCisqIE1tYXA6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB5b3UgY2FuIHNhZmVseSB1c2UgQGNvZGV7bW1hcH0uCitAZW5kIG1lbnUKKworQG5vZGUgRm9ybWF0dGluZworQHNlY3Rpb24gRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCisKK0l0IGlzIGltcG9ydGFudCB0byBwdXQgdGhlIG9wZW4tYnJhY2UgdGhhdCBzdGFydHMgdGhlIGJvZHkgb2YgYSBDCitmdW5jdGlvbiBpbiBjb2x1bW4gemVybywgYW5kIGF2b2lkIHB1dHRpbmcgYW55IG90aGVyIG9wZW4tYnJhY2Ugb3IKK29wZW4tcGFyZW50aGVzaXMgb3Igb3Blbi1icmFja2V0IGluIGNvbHVtbiB6ZXJvLiAgU2V2ZXJhbCB0b29scyBsb29rCitmb3Igb3Blbi1icmFjZXMgaW4gY29sdW1uIHplcm8gdG8gZmluZCB0aGUgYmVnaW5uaW5ncyBvZiBDIGZ1bmN0aW9ucy4KK1RoZXNlIHRvb2xzIHdpbGwgbm90IHdvcmsgb24gY29kZSBub3QgZm9ybWF0dGVkIHRoYXQgd2F5LgorCitJdCBpcyBhbHNvIGltcG9ydGFudCBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gc3RhcnQgdGhlIG5hbWUgb2YgdGhlCitmdW5jdGlvbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgaGVscHMgcGVvcGxlIHRvIHNlYXJjaCBmb3IgZnVuY3Rpb24KK2RlZmluaXRpb25zLCBhbmQgbWF5IGFsc28gaGVscCBjZXJ0YWluIHRvb2xzIHJlY29nbml6ZSB0aGVtLiAgVGh1cywKK3RoZSBwcm9wZXIgZm9ybWF0IGlzIHRoaXM6CisKK0BleGFtcGxlCitzdGF0aWMgY2hhciAqCitjb25jYXQgKHMxLCBzMikgICAgICAgIC8qIE5hbWUgc3RhcnRzIGluIGNvbHVtbiB6ZXJvIGhlcmUgKi8KKyAgICAgY2hhciAqczEsICpzMjsKK0B7ICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBicmFjZSBpbiBjb2x1bW4gemVybyBoZXJlICovCisgIEBkb3Rze30KK0B9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitvciwgaWYgeW91IHdhbnQgdG8gdXNlIEBzY3thbnNpfSBDLCBmb3JtYXQgdGhlIGRlZmluaXRpb24gbGlrZSB0aGlzOgorCitAZXhhbXBsZQorc3RhdGljIGNoYXIgKgorY29uY2F0IChjaGFyICpzMSwgY2hhciAqczIpCitAeworICBAZG90c3t9CitAfQorQGVuZCBleGFtcGxlCisKK0luIEBzY3thbnNpfSBDLCBpZiB0aGUgYXJndW1lbnRzIGRvbid0IGZpdCBuaWNlbHkgb24gb25lIGxpbmUsCitzcGxpdCBpdCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitpbnQKK2xvdHNfb2ZfYXJncyAoaW50IGFuX2ludGVnZXIsIGxvbmcgYV9sb25nLCBzaG9ydCBhX3Nob3J0LAorICAgICAgICAgICAgICBkb3VibGUgYV9kb3VibGUsIGZsb2F0IGFfZmxvYXQpCitAZG90c3t9CitAZW5kIGV4YW1wbGUKKworRm9yIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgd2UgcHJlZmVyIGNvZGUgZm9ybWF0dGVkIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK2lmICh4IDwgZm9vICh5LCB6KSkKKyAgaGFoYSA9IGJhcls0XSArIDU7CitlbHNlCisgIEB7CisgICAgd2hpbGUgKHopCisgICAgICBAeworICAgICAgICBoYWhhICs9IGZvbyAoeiwgeik7CisgICAgICAgIHotLTsKKyAgICAgIEB9CisgICAgcmV0dXJuICsreCArIGJhciAoKTsKKyAgQH0KK0BlbmQgZXhhbXBsZQorCitXZSBmaW5kIGl0IGVhc2llciB0byByZWFkIGEgcHJvZ3JhbSB3aGVuIGl0IGhhcyBzcGFjZXMgYmVmb3JlIHRoZQorb3Blbi1wYXJlbnRoZXNlcyBhbmQgYWZ0ZXIgdGhlIGNvbW1hcy4gIEVzcGVjaWFsbHkgYWZ0ZXIgdGhlIGNvbW1hcy4KKworV2hlbiB5b3Ugc3BsaXQgYW4gZXhwcmVzc2lvbiBpbnRvIG11bHRpcGxlIGxpbmVzLCBzcGxpdCBpdAorYmVmb3JlIGFuIG9wZXJhdG9yLCBub3QgYWZ0ZXIgb25lLiAgSGVyZSBpcyB0aGUgcmlnaHQgd2F5OgorCitAZXhhbXBsZQoraWYgKGZvb190aGlzX2lzX2xvbmcgJiYgYmFyID4gd2luICh4LCB5LCB6KQorICAgICYmIHJlbWFpbmluZ19jb25kaXRpb24pCitAZW5kIGV4YW1wbGUKKworVHJ5IHRvIGF2b2lkIGhhdmluZyB0d28gb3BlcmF0b3JzIG9mIGRpZmZlcmVudCBwcmVjZWRlbmNlIGF0IHRoZSBzYW1lCitsZXZlbCBvZiBpbmRlbnRhdGlvbi4gIEZvciBleGFtcGxlLCBkb24ndCB3cml0ZSB0aGlzOgorCitAZXhhbXBsZQorbW9kZSA9IChpbm1vZGVbal0gPT0gVk9JRG1vZGUKKyAgICAgICAgfHwgR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pCisgICAgICAgID8gb3V0bW9kZVtqXSA6IGlubW9kZVtqXSk7CitAZW5kIGV4YW1wbGUKKworSW5zdGVhZCwgdXNlIGV4dHJhIHBhcmVudGhlc2VzIHNvIHRoYXQgdGhlIGluZGVudGF0aW9uIHNob3dzIHRoZSBuZXN0aW5nOgorCitAZXhhbXBsZQorbW9kZSA9ICgoaW5tb2RlW2pdID09IFZPSURtb2RlCisgICAgICAgICB8fCAoR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pKSkKKyAgICAgICAgPyBvdXRtb2RlW2pdIDogaW5tb2RlW2pdKTsKK0BlbmQgZXhhbXBsZQorCitJbnNlcnQgZXh0cmEgcGFyZW50aGVzZXMgc28gdGhhdCBFbWFjcyB3aWxsIGluZGVudCB0aGUgY29kZSBwcm9wZXJseS4KK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGluZGVudGF0aW9uIGxvb2tzIG5pY2UgaWYgeW91IGRvIGl0IGJ5IGhhbmQsCitidXQgRW1hY3Mgd291bGQgbWVzcyBpdCB1cDoKKworQGV4YW1wbGUKK3YgPSBydXAtPnJ1X3V0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV91dGltZS50dl91c2VjLzEwMDAKKyAgICArIHJ1cC0+cnVfc3RpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3N0aW1lLnR2X3VzZWMvMTAwMDsKK0BlbmQgZXhhbXBsZQorCitCdXQgYWRkaW5nIGEgc2V0IG9mIHBhcmVudGhlc2VzIHNvbHZlcyB0aGUgcHJvYmxlbToKKworQGV4YW1wbGUKK3YgPSAocnVwLT5ydV91dGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfdXRpbWUudHZfdXNlYy8xMDAwCisgICAgICsgcnVwLT5ydV9zdGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfc3RpbWUudHZfdXNlYy8xMDAwKTsKK0BlbmQgZXhhbXBsZQorCitGb3JtYXQgZG8td2hpbGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitkbworICBAeworICAgIGEgPSBmb28gKGEpOworICBAfQord2hpbGUgKGEgPiAwKTsKK0BlbmQgZXhhbXBsZQorCitQbGVhc2UgdXNlIGZvcm1mZWVkIGNoYXJhY3RlcnMgKGNvbnRyb2wtTCkgdG8gZGl2aWRlIHRoZSBwcm9ncmFtIGludG8KK3BhZ2VzIGF0IGxvZ2ljYWwgcGxhY2VzIChidXQgbm90IHdpdGhpbiBhIGZ1bmN0aW9uKS4gIEl0IGRvZXMgbm90IG1hdHRlcgoranVzdCBob3cgbG9uZyB0aGUgcGFnZXMgYXJlLCBzaW5jZSB0aGV5IGRvIG5vdCBoYXZlIHRvIGZpdCBvbiBhIHByaW50ZWQKK3BhZ2UuICBUaGUgZm9ybWZlZWRzIHNob3VsZCBhcHBlYXIgYWxvbmUgb24gbGluZXMgYnkgdGhlbXNlbHZlcy4KKworCitAbm9kZSBDb21tZW50cworQHNlY3Rpb24gQ29tbWVudGluZyBZb3VyIFdvcmsKKworRXZlcnkgcHJvZ3JhbSBzaG91bGQgc3RhcnQgd2l0aCBhIGNvbW1lbnQgc2F5aW5nIGJyaWVmbHkgd2hhdCBpdCBpcyBmb3IuCitFeGFtcGxlOiBAc2FtcHtmbXQgLSBmaWx0ZXIgZm9yIHNpbXBsZSBmaWxsaW5nIG9mIHRleHR9LgorCitQbGVhc2Ugd3JpdGUgdGhlIGNvbW1lbnRzIGluIGEgR05VIHByb2dyYW0gaW4gRW5nbGlzaCwgYmVjYXVzZSBFbmdsaXNoCitpcyB0aGUgb25lIGxhbmd1YWdlIHRoYXQgbmVhcmx5IGFsbCBwcm9ncmFtbWVycyBpbiBhbGwgY291bnRyaWVzIGNhbgorcmVhZC4gIElmIHlvdSBkbyBub3Qgd3JpdGUgRW5nbGlzaCB3ZWxsLCBwbGVhc2Ugd3JpdGUgY29tbWVudHMgaW4KK0VuZ2xpc2ggYXMgd2VsbCBhcyB5b3UgY2FuLCB0aGVuIGFzayBvdGhlciBwZW9wbGUgdG8gaGVscCByZXdyaXRlIHRoZW0uCitJZiB5b3UgY2FuJ3Qgd3JpdGUgY29tbWVudHMgaW4gRW5nbGlzaCwgcGxlYXNlIGZpbmQgc29tZW9uZSB0byB3b3JrIHdpdGgKK3lvdSBhbmQgdHJhbnNsYXRlIHlvdXIgY29tbWVudHMgaW50byBFbmdsaXNoLgorCitQbGVhc2UgcHV0IGEgY29tbWVudCBvbiBlYWNoIGZ1bmN0aW9uIHNheWluZyB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLAord2hhdCBzb3J0cyBvZiBhcmd1bWVudHMgaXQgZ2V0cywgYW5kIHdoYXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZgorYXJndW1lbnRzIG1lYW4gYW5kIGFyZSB1c2VkIGZvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIGluCit3b3JkcyB0aGUgbWVhbmluZyBvZiB0aGUgQyBhcmd1bWVudCBkZWNsYXJhdGlvbnMsIGlmIGEgQyB0eXBlIGlzIGJlaW5nCit1c2VkIGluIGl0cyBjdXN0b21hcnkgZmFzaGlvbi4gIElmIHRoZXJlIGlzIGFueXRoaW5nIG5vbnN0YW5kYXJkIGFib3V0CitpdHMgdXNlIChzdWNoIGFzIGFuIGFyZ3VtZW50IG9mIHR5cGUgQGNvZGV7Y2hhciAqfSB3aGljaCBpcyByZWFsbHkgdGhlCithZGRyZXNzIG9mIHRoZSBzZWNvbmQgY2hhcmFjdGVyIG9mIGEgc3RyaW5nLCBub3QgdGhlIGZpcnN0KSwgb3IgYW55Citwb3NzaWJsZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3Qgd29yayB0aGUgd2F5IG9uZSB3b3VsZCBleHBlY3QgKHN1Y2ggYXMsCit0aGF0IHN0cmluZ3MgY29udGFpbmluZyBuZXdsaW5lcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayksIGJlIHN1cmUKK3RvIHNheSBzby4KKworQWxzbyBleHBsYWluIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlcmUgaXMgb25lLgorCitQbGVhc2UgcHV0IHR3byBzcGFjZXMgYWZ0ZXIgdGhlIGVuZCBvZiBhIHNlbnRlbmNlIGluIHlvdXIgY29tbWVudHMsIHNvCit0aGF0IHRoZSBFbWFjcyBzZW50ZW5jZSBjb21tYW5kcyB3aWxsIHdvcmsuICBBbHNvLCBwbGVhc2Ugd3JpdGUKK2NvbXBsZXRlIHNlbnRlbmNlcyBhbmQgY2FwaXRhbGl6ZSB0aGUgZmlyc3Qgd29yZC4gIElmIGEgbG93ZXItY2FzZQoraWRlbnRpZmllciBjb21lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2VudGVuY2UsIGRvbid0IGNhcGl0YWxpemUgaXQhCitDaGFuZ2luZyB0aGUgc3BlbGxpbmcgbWFrZXMgaXQgYSBkaWZmZXJlbnQgaWRlbnRpZmllci4gIElmIHlvdSBkb24ndAorbGlrZSBzdGFydGluZyBhIHNlbnRlbmNlIHdpdGggYSBsb3dlciBjYXNlIGxldHRlciwgd3JpdGUgdGhlIHNlbnRlbmNlCitkaWZmZXJlbnRseSAoZS5nLiwgYGBUaGUgaWRlbnRpZmllciBsb3dlci1jYXNlIGlzIEBkb3Rze30nJykuCisKK1RoZSBjb21tZW50IG9uIGEgZnVuY3Rpb24gaXMgbXVjaCBjbGVhcmVyIGlmIHlvdSB1c2UgdGhlIGFyZ3VtZW50CituYW1lcyB0byBzcGVhayBhYm91dCB0aGUgYXJndW1lbnQgdmFsdWVzLiAgVGhlIHZhcmlhYmxlIG5hbWUgaXRzZWxmCitzaG91bGQgYmUgbG93ZXIgY2FzZSwgYnV0IHdyaXRlIGl0IGluIHVwcGVyIGNhc2Ugd2hlbiB5b3UgYXJlIHNwZWFraW5nCithYm91dCB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIGl0c2VsZi4gIFRodXMsIGBgdGhlIGlub2RlCitudW1iZXIgTk9ERV9OVU0nJyByYXRoZXIgdGhhbiBgYGFuIGlub2RlJycuCisKK1RoZXJlIGlzIHVzdWFsbHkgbm8gcHVycG9zZSBpbiByZXN0YXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluCit0aGUgY29tbWVudCBiZWZvcmUgaXQsIGJlY2F1c2UgdGhlIHJlYWRlciBjYW4gc2VlIHRoYXQgZm9yIGhpbXNlbGYuCitUaGVyZSBtaWdodCBiZSBhbiBleGNlcHRpb24gd2hlbiB0aGUgY29tbWVudCBpcyBzbyBsb25nIHRoYXQgdGhlIGZ1bmN0aW9uCitpdHNlbGYgd291bGQgYmUgb2ZmIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KKworVGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBvbiBlYWNoIHN0YXRpYyB2YXJpYWJsZSBhcyB3ZWxsLCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisvKiBOb256ZXJvIG1lYW5zIHRydW5jYXRlIGxpbmVzIGluIHRoZSBkaXNwbGF5OworICAgemVybyBtZWFucyBjb250aW51ZSB0aGVtLiAgKi8KK2ludCB0cnVuY2F0ZV9saW5lczsKK0BlbmQgZXhhbXBsZQorCitFdmVyeSBAc2FtcHsjZW5kaWZ9IHNob3VsZCBoYXZlIGEgY29tbWVudCwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHNob3J0Citjb25kaXRpb25hbHMgKGp1c3QgYSBmZXcgbGluZXMpIHRoYXQgYXJlIG5vdCBuZXN0ZWQuICBUaGUgY29tbWVudCBzaG91bGQKK3N0YXRlIHRoZSBjb25kaXRpb24gb2YgdGhlIGNvbmRpdGlvbmFsIHRoYXQgaXMgZW5kaW5nLCBAZW1waHtpbmNsdWRpbmcKK2l0cyBzZW5zZX0uICBAc2FtcHsjZWxzZX0gc2hvdWxkIGhhdmUgYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbgorQGVtcGh7YW5kIHNlbnNlfSBvZiB0aGUgY29kZSB0aGF0IGZvbGxvd3MuICBGb3IgZXhhbXBsZToKKworQGV4YW1wbGUKK0Bncm91cAorI2lmZGVmIGZvbworICBAZG90c3t9CisjZWxzZSAvKiBub3QgZm9vICovCisgIEBkb3Rze30KKyNlbmRpZiAvKiBub3QgZm9vICovCitAZW5kIGdyb3VwCitAZ3JvdXAKKyNpZmRlZiBmb28KKyAgQGRvdHN7fQorI2VuZGlmIC8qIGZvbyAqLworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorYnV0LCBieSBjb250cmFzdCwgd3JpdGUgdGhlIGNvbW1lbnRzIHRoaXMgd2F5IGZvciBhIEBzYW1weyNpZm5kZWZ9OgorCitAZXhhbXBsZQorQGdyb3VwCisjaWZuZGVmIGZvbworICBAZG90c3t9CisjZWxzZSAvKiBmb28gKi8KKyAgQGRvdHN7fQorI2VuZGlmIC8qIGZvbyAqLworQGVuZCBncm91cAorQGdyb3VwCisjaWZuZGVmIGZvbworICBAZG90c3t9CisjZW5kaWYgLyogbm90IGZvbyAqLworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0Bub2RlIFN5bnRhY3RpYyBDb252ZW50aW9ucworQHNlY3Rpb24gQ2xlYW4gVXNlIG9mIEMgQ29uc3RydWN0cworCitQbGVhc2UgZXhwbGljaXRseSBkZWNsYXJlIGFsbCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLgorRG9uJ3Qgb21pdCB0aGVtIGp1c3QgYmVjYXVzZSB0aGV5IGFyZSBAY29kZXtpbnR9cy4KKworRGVjbGFyYXRpb25zIG9mIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGFwcGVhciBsYXRlciBpbiB0aGUKK3NvdXJjZSBmaWxlIHNob3VsZCBhbGwgZ28gaW4gb25lIHBsYWNlIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQorKHNvbWV3aGVyZSBiZWZvcmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gdGhlIGZpbGUpLCBvciBlbHNlCitzaG91bGQgZ28gaW4gYSBoZWFkZXIgZmlsZS4gIERvbid0IHB1dCBAY29kZXtleHRlcm59IGRlY2xhcmF0aW9ucyBpbnNpZGUKK2Z1bmN0aW9ucy4KKworSXQgdXNlZCB0byBiZSBjb21tb24gcHJhY3RpY2UgdG8gdXNlIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcyAod2l0aAorbmFtZXMgbGlrZSBAY29kZXt0ZW19KSBvdmVyIGFuZCBvdmVyIGZvciBkaWZmZXJlbnQgdmFsdWVzIHdpdGhpbiBvbmUKK2Z1bmN0aW9uLiAgSW5zdGVhZCBvZiBkb2luZyB0aGlzLCBpdCBpcyBiZXR0ZXIgZGVjbGFyZSBhIHNlcGFyYXRlIGxvY2FsCit2YXJpYWJsZSBmb3IgZWFjaCBkaXN0aW5jdCBwdXJwb3NlLCBhbmQgZ2l2ZSBpdCBhIG5hbWUgd2hpY2ggaXMKK21lYW5pbmdmdWwuICBUaGlzIG5vdCBvbmx5IG1ha2VzIHByb2dyYW1zIGVhc2llciB0byB1bmRlcnN0YW5kLCBpdCBhbHNvCitmYWNpbGl0YXRlcyBvcHRpbWl6YXRpb24gYnkgZ29vZCBjb21waWxlcnMuICBZb3UgY2FuIGFsc28gbW92ZSB0aGUKK2RlY2xhcmF0aW9uIG9mIGVhY2ggbG9jYWwgdmFyaWFibGUgaW50byB0aGUgc21hbGxlc3Qgc2NvcGUgdGhhdCBpbmNsdWRlcworYWxsIGl0cyB1c2VzLiAgVGhpcyBtYWtlcyB0aGUgcHJvZ3JhbSBldmVuIGNsZWFuZXIuCisKK0Rvbid0IHVzZSBsb2NhbCB2YXJpYWJsZXMgb3IgcGFyYW1ldGVycyB0aGF0IHNoYWRvdyBnbG9iYWwgaWRlbnRpZmllcnMuCisKK0Rvbid0IGRlY2xhcmUgbXVsdGlwbGUgdmFyaWFibGVzIGluIG9uZSBkZWNsYXJhdGlvbiB0aGF0IHNwYW5zIGxpbmVzLgorU3RhcnQgYSBuZXcgZGVjbGFyYXRpb24gb24gZWFjaCBsaW5lLCBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUsIGluc3RlYWQKK29mIHRoaXM6CisKK0BleGFtcGxlCitAZ3JvdXAKK2ludCAgICBmb28sCisgICAgICAgYmFyOworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAord3JpdGUgZWl0aGVyIHRoaXM6CisKK0BleGFtcGxlCitpbnQgZm9vLCBiYXI7CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitvciB0aGlzOgorCitAZXhhbXBsZQoraW50IGZvbzsKK2ludCBiYXI7CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CisoSWYgdGhleSBhcmUgZ2xvYmFsIHZhcmlhYmxlcywgZWFjaCBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgcHJlY2VkaW5nIGl0Cithbnl3YXkuKQorCitXaGVuIHlvdSBoYXZlIGFuIEBjb2Rle2lmfS1AY29kZXtlbHNlfSBzdGF0ZW1lbnQgbmVzdGVkIGluIGFub3RoZXIKK0Bjb2Rle2lmfSBzdGF0ZW1lbnQsIGFsd2F5cyBwdXQgYnJhY2VzIGFyb3VuZCB0aGUgQGNvZGV7aWZ9LUBjb2Rle2Vsc2V9LgorVGh1cywgbmV2ZXIgd3JpdGUgbGlrZSB0aGlzOgorCitAZXhhbXBsZQoraWYgKGZvbykKKyAgaWYgKGJhcikKKyAgICB3aW4gKCk7CisgIGVsc2UKKyAgICBsb3NlICgpOworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorYWx3YXlzIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK2lmIChmb28pCisgIEB7CisgICAgaWYgKGJhcikKKyAgICAgIHdpbiAoKTsKKyAgICBlbHNlCisgICAgICBsb3NlICgpOworICBAfQorQGVuZCBleGFtcGxlCisKK0lmIHlvdSBoYXZlIGFuIEBjb2Rle2lmfSBzdGF0ZW1lbnQgbmVzdGVkIGluc2lkZSBvZiBhbiBAY29kZXtlbHNlfQorc3RhdGVtZW50LCBlaXRoZXIgd3JpdGUgQGNvZGV7ZWxzZSBpZn0gb24gb25lIGxpbmUsIGxpa2UgdGhpcywKKworQGV4YW1wbGUKK2lmIChmb28pCisgIEBkb3Rze30KK2Vsc2UgaWYgKGJhcikKKyAgQGRvdHN7fQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAord2l0aCBpdHMgQGNvZGV7dGhlbn0tcGFydCBpbmRlbnRlZCBsaWtlIHRoZSBwcmVjZWRpbmcgQGNvZGV7dGhlbn0tcGFydCwKK29yIHdyaXRlIHRoZSBuZXN0ZWQgQGNvZGV7aWZ9IHdpdGhpbiBicmFjZXMgbGlrZSB0aGlzOgorCitAZXhhbXBsZQoraWYgKGZvbykKKyAgQGRvdHN7fQorZWxzZQorICBAeworICAgIGlmIChiYXIpCisgICAgICBAZG90c3t9CisgIEB9CitAZW5kIGV4YW1wbGUKKworRG9uJ3QgZGVjbGFyZSBib3RoIGEgc3RydWN0dXJlIHRhZyBhbmQgdmFyaWFibGVzIG9yIHR5cGVkZWZzIGluIHRoZQorc2FtZSBkZWNsYXJhdGlvbi4gIEluc3RlYWQsIGRlY2xhcmUgdGhlIHN0cnVjdHVyZSB0YWcgc2VwYXJhdGVseQorYW5kIHRoZW4gdXNlIGl0IHRvIGRlY2xhcmUgdGhlIHZhcmlhYmxlcyBvciB0eXBlZGVmcy4KKworVHJ5IHRvIGF2b2lkIGFzc2lnbm1lbnRzIGluc2lkZSBAY29kZXtpZn0tY29uZGl0aW9ucy4gIEZvciBleGFtcGxlLAorZG9uJ3Qgd3JpdGUgdGhpczoKKworQGV4YW1wbGUKK2lmICgoZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbykpID09IDApCisgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitpbnN0ZWFkLCB3cml0ZSB0aGlzOgorCitAZXhhbXBsZQorZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbyk7CitpZiAoZm9vID09IDApCisgIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7CitAZW5kIGV4YW1wbGUKKworRG9uJ3QgbWFrZSB0aGUgcHJvZ3JhbSB1Z2x5IHRvIHBsYWNhdGUgQGNvZGV7bGludH0uICBQbGVhc2UgZG9uJ3QgaW5zZXJ0IGFueQorY2FzdHMgdG8gQGNvZGV7dm9pZH0uICBaZXJvIHdpdGhvdXQgYSBjYXN0IGlzIHBlcmZlY3RseSBmaW5lIGFzIGEgbnVsbAorcG9pbnRlciBjb25zdGFudCwgZXhjZXB0IHdoZW4gY2FsbGluZyBhIHZhcmFyZ3MgZnVuY3Rpb24uCisKK0Bub2RlICBOYW1lcworQHNlY3Rpb24gTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCisKK1RoZSBuYW1lcyBvZiBnbG9iYWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW4gYSBwcm9ncmFtIHNlcnZlIGFzCitjb21tZW50cyBvZiBhIHNvcnQuICBTbyBkb24ndCBjaG9vc2UgdGVyc2UgbmFtZXMtLS1pbnN0ZWFkLCBsb29rIGZvcgorbmFtZXMgdGhhdCBnaXZlIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaWFibGUgb3IKK2Z1bmN0aW9uLiAgSW4gYSBHTlUgcHJvZ3JhbSwgbmFtZXMgc2hvdWxkIGJlIEVuZ2xpc2gsIGxpa2Ugb3RoZXIKK2NvbW1lbnRzLgorCitMb2NhbCB2YXJpYWJsZSBuYW1lcyBjYW4gYmUgc2hvcnRlciwgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIG9ubHkgd2l0aGluCitvbmUgY29udGV4dCwgd2hlcmUgKHByZXN1bWFibHkpIGNvbW1lbnRzIGV4cGxhaW4gdGhlaXIgcHVycG9zZS4KKworUGxlYXNlIHVzZSB1bmRlcnNjb3JlcyB0byBzZXBhcmF0ZSB3b3JkcyBpbiBhIG5hbWUsIHNvIHRoYXQgdGhlIEVtYWNzCit3b3JkIGNvbW1hbmRzIGNhbiBiZSB1c2VmdWwgd2l0aGluIHRoZW0uICBTdGljayB0byBsb3dlciBjYXNlOyByZXNlcnZlCit1cHBlciBjYXNlIGZvciBtYWNyb3MgYW5kIEBjb2Rle2VudW19IGNvbnN0YW50cywgYW5kIGZvciBuYW1lLXByZWZpeGVzCit0aGF0IGZvbGxvdyBhIHVuaWZvcm0gY29udmVudGlvbi4KKworRm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgdXNlIG5hbWVzIGxpa2UgQGNvZGV7aWdub3JlX3NwYWNlX2NoYW5nZV9mbGFnfTsKK2Rvbid0IHVzZSBuYW1lcyBsaWtlIEBjb2Rle2lDYW50UmVhZFRoaXN9LgorCitWYXJpYWJsZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGNvbW1hbmQtbGluZSBvcHRpb25zIGhhdmUgYmVlbgorc3BlY2lmaWVkIHNob3VsZCBiZSBuYW1lZCBhZnRlciB0aGUgbWVhbmluZyBvZiB0aGUgb3B0aW9uLCBub3QgYWZ0ZXIKK3RoZSBvcHRpb24tbGV0dGVyLiAgQSBjb21tZW50IHNob3VsZCBzdGF0ZSBib3RoIHRoZSBleGFjdCBtZWFuaW5nIG9mCit0aGUgb3B0aW9uIGFuZCBpdHMgbGV0dGVyLiAgRm9yIGV4YW1wbGUsCisKK0BleGFtcGxlCitAZ3JvdXAKKy8qIElnbm9yZSBjaGFuZ2VzIGluIGhvcml6b250YWwgd2hpdGVzcGFjZSAoLWIpLiAgKi8KK2ludCBpZ25vcmVfc3BhY2VfY2hhbmdlX2ZsYWc7CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworV2hlbiB5b3Ugd2FudCB0byBkZWZpbmUgbmFtZXMgd2l0aCBjb25zdGFudCBpbnRlZ2VyIHZhbHVlcywgdXNlCitAY29kZXtlbnVtfSByYXRoZXIgdGhhbiBAc2FtcHsjZGVmaW5lfS4gIEdEQiBrbm93cyBhYm91dCBlbnVtZXJhdGlvbgorY29uc3RhbnRzLgorCitVc2UgZmlsZSBuYW1lcyBvZiAxNCBjaGFyYWN0ZXJzIG9yIGxlc3MsIHRvIGF2b2lkIGNyZWF0aW5nIGdyYXR1aXRvdXMKK3Byb2JsZW1zIG9uIG9sZGVyIFN5c3RlbSBWIHN5c3RlbXMuICBZb3UgY2FuIHVzZSB0aGUgcHJvZ3JhbQorQGNvZGV7ZG9zY2hrfSB0byB0ZXN0IGZvciB0aGlzLiAgQGNvZGV7ZG9zY2hrfSBhbHNvIHRlc3RzIGZvciBwb3RlbnRpYWwKK25hbWUgY29uZmxpY3RzIGlmIHRoZSBmaWxlcyB3ZXJlIGxvYWRlZCBvbnRvIGFuIE1TLURPUyBmaWxlCitzeXN0ZW0tLS1zb21ldGhpbmcgeW91IG1heSBvciBtYXkgbm90IGNhcmUgYWJvdXQuCisKK0Bub2RlIFN5c3RlbSBQb3J0YWJpbGl0eQorQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBTeXN0ZW0gVHlwZXMKKworSW4gdGhlIFVuaXggd29ybGQsIGBgcG9ydGFiaWxpdHknJyByZWZlcnMgdG8gcG9ydGluZyB0byBkaWZmZXJlbnQgVW5peAordmVyc2lvbnMuICBGb3IgYSBHTlUgcHJvZ3JhbSwgdGhpcyBraW5kIG9mIHBvcnRhYmlsaXR5IGlzIGRlc2lyYWJsZSwgYnV0Citub3QgcGFyYW1vdW50LgorCitUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIEdOVSBzb2Z0d2FyZSBpcyB0byBydW4gb24gdG9wIG9mIHRoZSBHTlUga2VybmVsLAorY29tcGlsZWQgd2l0aCB0aGUgR05VIEMgY29tcGlsZXIsIG9uIHZhcmlvdXMgdHlwZXMgb2YgQHNje2NwdX0uICBUaGUKK2Ftb3VudCBhbmQga2luZHMgb2YgdmFyaWF0aW9uIGFtb25nIEdOVSBzeXN0ZW1zIG9uIGRpZmZlcmVudCBAc2N7Y3B1fXMKK3dpbGwgYmUgY29tcGFyYWJsZSB0byB0aGUgdmFyaWF0aW9uIGFtb25nIExpbnV4LWJhc2VkIEdOVSBzeXN0ZW1zIG9yCithbW9uZyBCU0Qgc3lzdGVtcyB0b2RheS4gIFNvIHRoZSBraW5kcyBvZiBwb3J0YWJpbGl0eSB0aGF0IGFyZSBhYnNvbHV0ZWx5CituZWNlc3NhcnkgYXJlIHF1aXRlIGxpbWl0ZWQuCisKK0J1dCBtYW55IHVzZXJzIGRvIHJ1biBHTlUgc29mdHdhcmUgb24gbm9uLUdOVSBVbml4IG9yIFVuaXgtbGlrZSBzeXN0ZW1zLgorU28gc3VwcG9ydGluZyBhIHZhcmlldHkgb2YgVW5peC1saWtlIHN5c3RlbXMgaXMgZGVzaXJhYmxlLCBhbHRob3VnaCBub3QKK3BhcmFtb3VudC4KKworVGhlIGVhc2llc3Qgd2F5IHRvIGFjaGlldmUgcG9ydGFiaWxpdHkgdG8gbW9zdCBVbml4LWxpa2Ugc3lzdGVtcyBpcyB0bwordXNlIEF1dG9jb25mLiAgSXQncyB1bmxpa2VseSB0aGF0IHlvdXIgcHJvZ3JhbSBuZWVkcyB0byBrbm93IG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IHBsYXRmb3JtIHRoYW4gQXV0b2NvbmYgY2FuIHByb3ZpZGUsIHNpbXBseQorYmVjYXVzZSBtb3N0IG9mIHRoZSBwcm9ncmFtcyB0aGF0IG5lZWQgc3VjaCBrbm93bGVkZ2UgaGF2ZSBhbHJlYWR5IGJlZW4KK3dyaXR0ZW4uCisKK0F2b2lkIHVzaW5nIHRoZSBmb3JtYXQgb2Ygc2VtaS1pbnRlcm5hbCBkYXRhIGJhc2VzIChlLmcuLCBkaXJlY3RvcmllcykKK3doZW4gdGhlcmUgaXMgYSBoaWdoZXItbGV2ZWwgYWx0ZXJuYXRpdmUgKEBjb2Rle3JlYWRkaXJ9KS4KKworQXMgZm9yIHN5c3RlbXMgdGhhdCBhcmUgbm90IGxpa2UgVW5peCwgc3VjaCBhcyBNU0RPUywgV2luZG93cywgdGhlCitNYWNpbnRvc2gsIFZNUywgYW5kIE1WUywgc3VwcG9ydGluZyB0aGVtIGlzIHVzdWFsbHkgc28gbXVjaCB3b3JrIHRoYXQgaXQKK2lzIGJldHRlciBpZiB5b3UgZG9uJ3QuCisKK1RoZSBwbGFubmVkIEdOVSBrZXJuZWwgaXMgbm90IGZpbmlzaGVkIHlldCwgYnV0IHlvdSBjYW4gdGVsbCB3aGljaAorZmFjaWxpdGllcyBpdCB3aWxsIHByb3ZpZGUgYnkgbG9va2luZyBhdCB0aGUgR05VIEMgTGlicmFyeSBNYW51YWwuICBUaGUKK0dOVSBrZXJuZWwgaXMgYmFzZWQgb24gTWFjaCwgc28gdGhlIGZlYXR1cmVzIG9mIE1hY2ggd2lsbCBhbHNvIGJlCithdmFpbGFibGUuICBIb3dldmVyLCBpZiB5b3UgdXNlIE1hY2ggZmVhdHVyZXMsIHlvdSdsbCBwcm9iYWJseSBoYXZlCit0cm91YmxlIGRlYnVnZ2luZyB5b3VyIHByb2dyYW0gdG9kYXkuCisKK0Bub2RlIENQVSBQb3J0YWJpbGl0eQorQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBAc2N7Y3B1fXMKKworRXZlbiBHTlUgc3lzdGVtcyB3aWxsIGRpZmZlciBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGFtb25nIEBzY3tjcHV9Cit0eXBlcy0tLWZvciBleGFtcGxlLCBkaWZmZXJlbmNlIGluIGJ5dGUgb3JkZXJpbmcgYW5kIGFsaWdubWVudAorcmVxdWlyZW1lbnRzLiAgSXQgaXMgYWJzb2x1dGVseSBlc3NlbnRpYWwgdG8gaGFuZGxlIHRoZXNlIGRpZmZlcmVuY2VzLgorSG93ZXZlciwgZG9uJ3QgbWFrZSBhbnkgZWZmb3J0IHRvIGNhdGVyIHRvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGFuCitAY29kZXtpbnR9IHdpbGwgYmUgbGVzcyB0aGFuIDMyIGJpdHMuICBXZSBkb24ndCBzdXBwb3J0IDE2LWJpdCBtYWNoaW5lcworaW4gR05VLgorCitEb24ndCBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBhbiBAY29kZXtpbnR9IG9iamVjdCBpcyBhbHNvIHRoZQorYWRkcmVzcyBvZiBpdHMgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZS4gIFRoaXMgaXMgZmFsc2Ugb24gYmlnLWVuZGlhbgorbWFjaGluZXMuICBUaHVzLCBkb24ndCBtYWtlIHRoZSBmb2xsb3dpbmcgbWlzdGFrZToKKworQGV4YW1wbGUKK2ludCBjOworQGRvdHN7fQord2hpbGUgKChjID0gZ2V0Y2hhcigpKSAhPSBFT0YpCisgIHdyaXRlKGZpbGVfZGVzY3JpcHRvciwgJmMsIDEpOworQGVuZCBleGFtcGxlCisKK1doZW4gY2FsbGluZyBmdW5jdGlvbnMsIHlvdSBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCitwb2ludGVycyBvZiB2YXJpb3VzIHR5cGVzLCBvciBiZXR3ZWVuIHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gIE9uIG1vc3QKK21hY2hpbmVzLCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYW55d2F5LiAgQXMgZm9yIHRoZSBmZXcgbWFjaGluZXMgd2hlcmUKK3RoZXJlIGlzIGEgZGlmZmVyZW5jZSwgYWxsIG9mIHRoZW0gc3VwcG9ydCBAc2N7YW5zaX0gQywgc28geW91IGNhbiB1c2UKK3Byb3RvdHlwZXMgKGNvbmRpdGlvbmFsaXplZCB0byBiZSBhY3RpdmUgb25seSBpbiBAc2N7YW5zaX0gQykgdG8gbWFrZQordGhlIGNvZGUgd29yayBvbiB0aG9zZSBzeXN0ZW1zLgorCitJbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyBvayB0byBwYXNzIGludGVnZXIgYW5kIHBvaW50ZXIgYXJndW1lbnRzCitpbmRpc2NyaW1pbmF0ZWx5IHRvIHRoZSBzYW1lIGZ1bmN0aW9uLCBhbmQgdXNlIG5vIHByb3RvdHlwZSBvbiBhbnkKK3N5c3RlbS4gIEZvciBleGFtcGxlLCBtYW55IEdOVSBwcm9ncmFtcyBoYXZlIGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbnMKK3RoYXQgcGFzcyB0aGVpciBhcmd1bWVudHMgYWxvbmcgdG8gQGNvZGV7cHJpbnRmfSBhbmQgZnJpZW5kczoKKworQGV4YW1wbGUKK2Vycm9yIChzLCBhMSwgYTIsIGEzKQorICAgICBjaGFyICpzOworICAgICBpbnQgYTEsIGEyLCBhMzsKK0B7CisgIGZwcmludGYgKHN0ZGVyciwgImVycm9yOiAiKTsKKyAgZnByaW50ZiAoc3RkZXJyLCBzLCBhMSwgYTIsIGEzKTsKK0B9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitJbiBwcmFjdGljZSwgdGhpcyB3b3JrcyBvbiBhbGwgbWFjaGluZXMsIGFuZCBpdCBpcyBtdWNoIHNpbXBsZXIgdGhhbiBhbnkKK2BgY29ycmVjdCcnIGFsdGVybmF0aXZlLiAgQmUgc3VyZSBAZW1waHtub3R9IHRvIHVzZSBhIHByb3RvdHlwZQorZm9yIHN1Y2ggZnVuY3Rpb25zLgorCitIb3dldmVyLCBhdm9pZCBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8uCitUaGVzZSBhc3N1bXB0aW9ucyByZWFsbHkgcmVkdWNlIHBvcnRhYmlsaXR5LCBhbmQgaW4gbW9zdCBwcm9ncmFtcyB0aGV5CithcmUgZWFzeSB0byBhdm9pZC4gIEluIHRoZSBjYXNlcyB3aGVyZSBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIGlzCitlc3NlbnRpYWwtLS1zdWNoIGFzLCBhIExpc3AgaW50ZXJwcmV0ZXIgd2hpY2ggc3RvcmVzIHR5cGUgaW5mb3JtYXRpb24gYXMKK3dlbGwgYXMgYW4gYWRkcmVzcyBpbiBvbmUgd29yZC0tLWl0IGlzIG9rIHRvIGRvIHNvLCBidXQgeW91J2xsIGhhdmUgdG8KK21ha2UgZXhwbGljaXQgcHJvdmlzaW9ucyB0byBoYW5kbGUgZGlmZmVyZW50IHdvcmQgc2l6ZXMuCisKK0Bub2RlIFN5c3RlbSBGdW5jdGlvbnMKK0BzZWN0aW9uIENhbGxpbmcgU3lzdGVtIEZ1bmN0aW9ucworCitDIGltcGxlbWVudGF0aW9ucyBkaWZmZXIgc3Vic3RhbnRpYWxseS4gIEBzY3thbnNpfSBDIHJlZHVjZXMgYnV0IGRvZXMgbm90CitlbGltaW5hdGUgdGhlIGluY29tcGF0aWJpbGl0aWVzOyBtZWFud2hpbGUsIG1hbnkgdXNlcnMgd2lzaCB0byBjb21waWxlCitHTlUgc29mdHdhcmUgd2l0aCBwcmUtQHNje2Fuc2l9IGNvbXBpbGVycy4gIFRoaXMgY2hhcHRlciBnaXZlcworcmVjb21tZW5kYXRpb25zIGZvciBob3cgdG8gdXNlIHRoZSBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgQyBsaWJyYXJ5CitmdW5jdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbG9zcyBvZiBwb3J0YWJpbGl0eS4KKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0Rvbid0IHVzZSB0aGUgdmFsdWUgb2YgQGNvZGV7c3ByaW50Zn0uICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKK2NoYXJhY3RlcnMgd3JpdHRlbiBvbiBzb21lIHN5c3RlbXMsIGJ1dCBub3Qgb24gYWxsIHN5c3RlbXMuCisKK0BpdGVtCitAY29kZXttYWlufSBzaG91bGQgYmUgZGVjbGFyZWQgdG8gcmV0dXJuIHR5cGUgQGNvZGV7aW50fS4gIEl0IHNob3VsZAordGVybWluYXRlIGVpdGhlciBieSBjYWxsaW5nIEBjb2Rle2V4aXR9IG9yIGJ5IHJldHVybmluZyB0aGUgaW50ZWdlcgorc3RhdHVzIGNvZGU7IG1ha2Ugc3VyZSBpdCBjYW5ub3QgZXZlciByZXR1cm4gYW4gdW5kZWZpbmVkIHZhbHVlLgorCitAaXRlbQorRG9uJ3QgZGVjbGFyZSBzeXN0ZW0gZnVuY3Rpb25zIGV4cGxpY2l0bHkuCisKK0FsbW9zdCBhbnkgZGVjbGFyYXRpb24gZm9yIGEgc3lzdGVtIGZ1bmN0aW9uIGlzIHdyb25nIG9uIHNvbWUgc3lzdGVtLgorVG8gbWluaW1pemUgY29uZmxpY3RzLCBsZWF2ZSBpdCB0byB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyB0byBkZWNsYXJlCitzeXN0ZW0gZnVuY3Rpb25zLiAgSWYgdGhlIGhlYWRlcnMgZG9uJ3QgZGVjbGFyZSBhIGZ1bmN0aW9uLCBsZXQgaXQKK3JlbWFpbiB1bmRlY2xhcmVkLgorCitXaGlsZSBpdCBtYXkgc2VlbSB1bmNsZWFuIHRvIHVzZSBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCBpbgorcHJhY3RpY2UgdGhpcyB3b3JrcyBmaW5lIGZvciBtb3N0IHN5c3RlbSBsaWJyYXJ5IGZ1bmN0aW9ucyBvbiB0aGUKK3N5c3RlbXMgd2hlcmUgdGhpcyByZWFsbHkgaGFwcGVuczsgdGh1cywgdGhlIGRpc2FkdmFudGFnZSBpcyBvbmx5Cit0aGVvcmV0aWNhbC4gIEJ5IGNvbnRyYXN0LCBhY3R1YWwgZGVjbGFyYXRpb25zIGhhdmUgZnJlcXVlbnRseSBjYXVzZWQKK2FjdHVhbCBjb25mbGljdHMuCisKK0BpdGVtCitJZiB5b3UgbXVzdCBkZWNsYXJlIGEgc3lzdGVtIGZ1bmN0aW9uLCBkb24ndCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcy4KK1VzZSBhbiBvbGQtc3R5bGUgZGVjbGFyYXRpb24sIG5vdCBhbiBAc2N7YW5zaX0gcHJvdG90eXBlLiAgVGhlIG1vcmUgeW91CitzcGVjaWZ5IGFib3V0IHRoZSBmdW5jdGlvbiwgdGhlIG1vcmUgbGlrZWx5IGEgY29uZmxpY3QuCisKK0BpdGVtCitJbiBwYXJ0aWN1bGFyLCBkb24ndCB1bmNvbmRpdGlvbmFsbHkgZGVjbGFyZSBAY29kZXttYWxsb2N9IG9yCitAY29kZXtyZWFsbG9jfS4KKworTW9zdCBHTlUgcHJvZ3JhbXMgdXNlIHRob3NlIGZ1bmN0aW9ucyBqdXN0IG9uY2UsIGluIGZ1bmN0aW9ucworY29udmVudGlvbmFsbHkgbmFtZWQgQGNvZGV7eG1hbGxvY30gYW5kIEBjb2Rle3hyZWFsbG9jfS4gIFRoZXNlCitmdW5jdGlvbnMgY2FsbCBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSwgcmVzcGVjdGl2ZWx5LCBhbmQKK2NoZWNrIHRoZSByZXN1bHRzLgorCitCZWNhdXNlIEBjb2Rle3htYWxsb2N9IGFuZCBAY29kZXt4cmVhbGxvY30gYXJlIGRlZmluZWQgaW4geW91ciBwcm9ncmFtLAoreW91IGNhbiBkZWNsYXJlIHRoZW0gaW4gb3RoZXIgZmlsZXMgd2l0aG91dCBhbnkgcmlzayBvZiB0eXBlIGNvbmZsaWN0LgorCitPbiBtb3N0IHN5c3RlbXMsIEBjb2Rle2ludH0gaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIGEgcG9pbnRlcjsgdGh1cywgdGhlCitjYWxscyB0byBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSB3b3JrIGZpbmUuICBGb3IgdGhlIGZldworZXhjZXB0aW9uYWwgc3lzdGVtcyAobW9zdGx5IDY0LWJpdCBtYWNoaW5lcyksIHlvdSBjYW4gdXNlCitAc3Ryb25ne2NvbmRpdGlvbmFsaXplZH0gZGVjbGFyYXRpb25zIG9mIEBjb2Rle21hbGxvY30gYW5kCitAY29kZXtyZWFsbG9jfS0tLW9yIHB1dCB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcworc3BlY2lmaWMgdG8gdGhvc2Ugc3lzdGVtcy4KKworQGl0ZW0KK1RoZSBzdHJpbmcgZnVuY3Rpb25zIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQuICBTb21lIFVuaXggc3lzdGVtcyBoYXZlCithIGhlYWRlciBmaWxlIEBmaWxle3N0cmluZy5ofTsgb3RoZXJzIGhhdmUgQGZpbGV7c3RyaW5ncy5ofS4gIE5laXRoZXIKK2ZpbGUgbmFtZSBpcyBwb3J0YWJsZS4gIFRoZXJlIGFyZSB0d28gdGhpbmdzIHlvdSBjYW4gZG86IHVzZSBBdXRvY29uZiB0bworZmlndXJlIG91dCB3aGljaCBmaWxlIHRvIGluY2x1ZGUsIG9yIGRvbid0IGluY2x1ZGUgZWl0aGVyIGZpbGUuCisKK0BpdGVtCitJZiB5b3UgZG9uJ3QgaW5jbHVkZSBlaXRoZXIgc3RyaW5ncyBmaWxlLCB5b3UgY2FuJ3QgZ2V0IGRlY2xhcmF0aW9ucyBmb3IKK3RoZSBzdHJpbmcgZnVuY3Rpb25zIGZyb20gdGhlIGhlYWRlciBmaWxlIGluIHRoZSB1c3VhbCB3YXkuCisKK1RoYXQgY2F1c2VzIGxlc3Mgb2YgYSBwcm9ibGVtIHRoYW4geW91IG1pZ2h0IHRoaW5rLiAgVGhlIG5ld2VyIEBzY3thbnNpfQorc3RyaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYXZvaWRlZCBhbnl3YXkgYmVjYXVzZSBtYW55IHN5c3RlbXMgc3RpbGwKK2Rvbid0IHN1cHBvcnQgdGhlbS4gIFRoZSBzdHJpbmcgZnVuY3Rpb25zIHlvdSBjYW4gdXNlIGFyZSB0aGVzZToKKworQGV4YW1wbGUKK3N0cmNweSAgIHN0cm5jcHkgICBzdHJjYXQgICBzdHJuY2F0CitzdHJsZW4gICBzdHJjbXAgICAgc3RybmNtcAorc3RyY2hyICAgc3RycmNocgorQGVuZCBleGFtcGxlCisKK1RoZSBjb3B5IGFuZCBjb25jYXRlbmF0ZSBmdW5jdGlvbnMgd29yayBmaW5lIHdpdGhvdXQgYSBkZWNsYXJhdGlvbiBhcworbG9uZyBhcyB5b3UgZG9uJ3QgdXNlIHRoZWlyIHZhbHVlcy4gIFVzaW5nIHRoZWlyIHZhbHVlcyB3aXRob3V0IGEKK2RlY2xhcmF0aW9uIGZhaWxzIG9uIHN5c3RlbXMgd2hlcmUgdGhlIHdpZHRoIG9mIGEgcG9pbnRlciBkaWZmZXJzIGZyb20KK3RoZSB3aWR0aCBvZiBAY29kZXtpbnR9LCBhbmQgcGVyaGFwcyBpbiBvdGhlciBjYXNlcy4gIEl0IGlzIHRyaXZpYWwgdG8KK2F2b2lkIHVzaW5nIHRoZWlyIHZhbHVlcywgc28gZG8gdGhhdC4KKworVGhlIGNvbXBhcmUgZnVuY3Rpb25zIGFuZCBAY29kZXtzdHJsZW59IHdvcmsgZmluZSB3aXRob3V0IGEgZGVjbGFyYXRpb24KK29uIG1vc3Qgc3lzdGVtcywgcG9zc2libHkgYWxsIHRoZSBvbmVzIHRoYXQgR05VIHNvZnR3YXJlIHJ1bnMgb24uCitZb3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgdGhlbSBAc3Ryb25ne2NvbmRpdGlvbmFsbHl9IG9uIGEKK2ZldyBzeXN0ZW1zLgorCitUaGUgc2VhcmNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHRvIHJldHVybiBAY29kZXtjaGFyICp9LiAgTHVja2lseSwKK3RoZXJlIGlzIG5vIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSB0eXBlIHRoZXkgcmV0dXJuLiAgQnV0IHRoZXJlIGlzCit2YXJpYXRpb24gaW4gdGhlaXIgbmFtZXMuICBTb21lIHN5c3RlbXMgZ2l2ZSB0aGVzZSBmdW5jdGlvbnMgdGhlIG5hbWVzCitAY29kZXtpbmRleH0gYW5kIEBjb2Rle3JpbmRleH07IG90aGVyIHN5c3RlbXMgdXNlIHRoZSBuYW1lcworQGNvZGV7c3RyY2hyfSBhbmQgQGNvZGV7c3RycmNocn0uICBTb21lIHN5c3RlbXMgc3VwcG9ydCBib3RoIHBhaXJzIG9mCituYW1lcywgYnV0IG5laXRoZXIgcGFpciB3b3JrcyBvbiBhbGwgc3lzdGVtcy4KKworWW91IHNob3VsZCBwaWNrIGEgc2luZ2xlIHBhaXIgb2YgbmFtZXMgYW5kIHVzZSBpdCB0aHJvdWdob3V0IHlvdXIKK3Byb2dyYW0uICAoTm93YWRheXMsIGl0IGlzIGJldHRlciB0byBjaG9vc2UgQGNvZGV7c3RyY2hyfSBhbmQKK0Bjb2Rle3N0cnJjaHJ9IGZvciBuZXcgcHJvZ3JhbXMsIHNpbmNlIHRob3NlIGFyZSB0aGUgc3RhbmRhcmQgQHNje2Fuc2l9CituYW1lcy4pICBEZWNsYXJlIGJvdGggb2YgdGhvc2UgbmFtZXMgYXMgZnVuY3Rpb25zIHJldHVybmluZyBAY29kZXtjaGFyCisqfS4gIE9uIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aG9zZSBuYW1lcywgZGVmaW5lIHRoZW0gYXMgbWFjcm9zCitpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgcGFpci4gIEZvciBleGFtcGxlLCBoZXJlIGlzIHdoYXQgdG8gcHV0IGF0IHRoZQorYmVnaW5uaW5nIG9mIHlvdXIgZmlsZSAob3IgaW4gYSBoZWFkZXIpIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbmFtZXMKK0Bjb2Rle3N0cmNocn0gYW5kIEBjb2Rle3N0cnJjaHJ9IHRocm91Z2hvdXQ6CisKK0BleGFtcGxlCisjaWZuZGVmIEhBVkVfU1RSQ0hSCisjZGVmaW5lIHN0cmNociBpbmRleAorI2VuZGlmCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorI2RlZmluZSBzdHJyY2hyIHJpbmRleAorI2VuZGlmCisKK2NoYXIgKnN0cmNociAoKTsKK2NoYXIgKnN0cnJjaHIgKCk7CitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCitIZXJlIHdlIGFzc3VtZSB0aGF0IEBjb2Rle0hBVkVfU1RSQ0hSfSBhbmQgQGNvZGV7SEFWRV9TVFJSQ0hSfSBhcmUKK21hY3JvcyBkZWZpbmVkIGluIHN5c3RlbXMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGV4aXN0LgorT25lIHdheSB0byBnZXQgdGhlbSBwcm9wZXJseSBkZWZpbmVkIGlzIHRvIHVzZSBBdXRvY29uZi4KKworQG5vZGUgSW50ZXJuYXRpb25hbGl6YXRpb24KK0BzZWN0aW9uIEludGVybmF0aW9uYWxpemF0aW9uCisKK0dOVSBoYXMgYSBsaWJyYXJ5IGNhbGxlZCBHTlUgZ2V0dGV4dCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gdHJhbnNsYXRlIHRoZQorbWVzc2FnZXMgaW4gYSBwcm9ncmFtIGludG8gdmFyaW91cyBsYW5ndWFnZXMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzCitsaWJyYXJ5IGluIGV2ZXJ5IHByb2dyYW0uICBVc2UgRW5nbGlzaCBmb3IgdGhlIG1lc3NhZ2VzIGFzIHRoZXkgYXBwZWFyCitpbiB0aGUgcHJvZ3JhbSwgYW5kIGxldCBnZXR0ZXh0IHByb3ZpZGUgdGhlIHdheSB0byB0cmFuc2xhdGUgdGhlbSBpbnRvCitvdGhlciBsYW5ndWFnZXMuCisKK1VzaW5nIEdOVSBnZXR0ZXh0IGludm9sdmVzIHB1dHRpbmcgYSBjYWxsIHRvIHRoZSBAY29kZXtnZXR0ZXh0fSBtYWNybworYXJvdW5kIGVhY2ggc3RyaW5nIHRoYXQgbWlnaHQgbmVlZCB0cmFuc2xhdGlvbi0tLWxpa2UgdGhpczoKKworQGV4YW1wbGUKK3ByaW50ZiAoZ2V0dGV4dCAoIlByb2Nlc3NpbmcgZmlsZSBgJXMnLi4uIikpOworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorVGhpcyBwZXJtaXRzIEdOVSBnZXR0ZXh0IHRvIHJlcGxhY2UgdGhlIHN0cmluZyBAY29kZXsiUHJvY2Vzc2luZyBmaWxlCitgJXMnLi4uIn0gd2l0aCBhIHRyYW5zbGF0ZWQgdmVyc2lvbi4KKworT25jZSBhIHByb2dyYW0gdXNlcyBnZXR0ZXh0LCBwbGVhc2UgbWFrZSBhIHBvaW50IG9mIHdyaXRpbmcgY2FsbHMgdG8KK0Bjb2Rle2dldHRleHR9IHdoZW4geW91IGFkZCBuZXcgc3RyaW5ncyB0aGF0IGNhbGwgZm9yIHRyYW5zbGF0aW9uLgorCitVc2luZyBHTlUgZ2V0dGV4dCBpbiBhIHBhY2thZ2UgaW52b2x2ZXMgc3BlY2lmeWluZyBhIEBkZm57dGV4dCBkb21haW4KK25hbWV9IGZvciB0aGUgcGFja2FnZS4gIFRoZSB0ZXh0IGRvbWFpbiBuYW1lIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlCit0cmFuc2xhdGlvbnMgZm9yIHRoaXMgcGFja2FnZSBmcm9tIHRoZSB0cmFuc2xhdGlvbnMgZm9yIG90aGVyIHBhY2thZ2VzLgorTm9ybWFsbHksIHRoZSB0ZXh0IGRvbWFpbiBuYW1lIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUKK3BhY2thZ2UtLS1mb3IgZXhhbXBsZSwgQHNhbXB7ZmlsZXV0aWxzfSBmb3IgdGhlIEdOVSBmaWxlIHV0aWxpdGllcy4KKworVG8gZW5hYmxlIGdldHRleHQgdG8gd29yayB3ZWxsLCBhdm9pZCB3cml0aW5nIGNvZGUgdGhhdCBtYWtlcworYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiB3b3JkcyBvciBzZW50ZW5jZXMuICBXaGVuIHlvdSB3YW50Cit0aGUgcHJlY2lzZSB0ZXh0IG9mIGEgc2VudGVuY2UgdG8gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGRhdGEsIHVzZSB0d28gb3IKK21vcmUgYWx0ZXJuYXRpdmUgc3RyaW5nIGNvbnN0YW50cyBlYWNoIGNvbnRhaW5pbmcgYSBjb21wbGV0ZSBzZW50ZW5jZXMsCityYXRoZXIgdGhhbiBpbnNlcnRpbmcgY29uZGl0aW9uYWxpemVkIHdvcmRzIG9yIHBocmFzZXMgaW50byBhIHNpbmdsZQorc2VudGVuY2UgZnJhbWV3b3JrLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCBub3QgdG8gZG86CisKK0BleGFtcGxlCitwcmludGYgKCIlZCBmaWxlJXMgcHJvY2Vzc2VkIiwgbmZpbGVzLAorICAgICAgICBuZmlsZXMgIT0gMSA/ICJzIiA6ICIiKTsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoZSBwcm9ibGVtIHdpdGggdGhhdCBleGFtcGxlIGlzIHRoYXQgaXQgYXNzdW1lcyB0aGF0IHBsdXJhbHMgYXJlIG1hZGUKK2J5IGFkZGluZyBgcycuICBJZiB5b3UgYXBwbHkgZ2V0dGV4dCB0byB0aGUgZm9ybWF0IHN0cmluZywgbGlrZSB0aGlzLAorCitAZXhhbXBsZQorcHJpbnRmIChnZXR0ZXh0ICgiJWQgZmlsZSVzIHByb2Nlc3NlZCIpLCBuZmlsZXMsCisgICAgICAgIG5maWxlcyAhPSAxID8gInMiIDogIiIpOworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAordGhlIG1lc3NhZ2UgY2FuIHVzZSBkaWZmZXJlbnQgd29yZHMsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlIGZvcmNlZCB0byB1c2UKK2BzJyBmb3IgdGhlIHBsdXJhbC4gIEhlcmUgaXMgYSBiZXR0ZXIgd2F5OgorCitAZXhhbXBsZQorcHJpbnRmICgobmZpbGVzICE9IDEgPyAiJWQgZmlsZXMgcHJvY2Vzc2VkIgorICAgICAgICAgOiAiJWQgZmlsZSBwcm9jZXNzZWQiKSwKKyAgICAgICAgbmZpbGVzKTsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoaXMgd2F5LCB5b3UgY2FuIGFwcGx5IGdldHRleHQgdG8gZWFjaCBvZiB0aGUgdHdvIHN0cmluZ3MKK2luZGVwZW5kZW50bHk6CisKK0BleGFtcGxlCitwcmludGYgKChuZmlsZXMgIT0gMSA/IGdldHRleHQgKCIlZCBmaWxlcyBwcm9jZXNzZWQiKQorICAgICAgICAgOiBnZXR0ZXh0ICgiJWQgZmlsZSBwcm9jZXNzZWQiKSksCisgICAgICAgIG5maWxlcyk7CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitUaGlzIGNhbiBiZSBhbnkgbWV0aG9kIG9mIGZvcm1pbmcgdGhlIHBsdXJhbCBvZiB0aGUgd29yZCBmb3IgYGBmaWxlJycsIGFuZAorYWxzbyBoYW5kbGVzIGxhbmd1YWdlcyB0aGF0IHJlcXVpcmUgYWdyZWVtZW50IGluIHRoZSB3b3JkIGZvcgorYGBwcm9jZXNzZWQnJy4KKworQSBzaW1pbGFyIHByb2JsZW0gYXBwZWFycyBhdCB0aGUgbGV2ZWwgb2Ygc2VudGVuY2Ugc3RydWN0dXJlIHdpdGggdGhpcworY29kZToKKworQGV4YW1wbGUKK3ByaW50ZiAoIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyVzIGJlZW4gZG9uZS5cbiIsCisgICAgICAgIGYtPnRyaWVkX2ltcGxpY2l0ID8gIiIgOiAiIG5vdCIpOworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorQWRkaW5nIEBjb2Rle2dldHRleHR9IGNhbGxzIHRvIHRoaXMgY29kZSBjYW5ub3QgZ2l2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yCithbGwgbGFuZ3VhZ2VzLCBiZWNhdXNlIG5lZ2F0aW9uIGluIHNvbWUgbGFuZ3VhZ2VzIHJlcXVpcmVzIGFkZGluZyB3b3JkcworYXQgbW9yZSB0aGFuIG9uZSBwbGFjZSBpbiB0aGUgc2VudGVuY2UuICBCeSBjb250cmFzdCwgYWRkaW5nCitAY29kZXtnZXR0ZXh0fSBjYWxscyBkb2VzIHRoZSBqb2Igc3RyYWlnaHRmb3dhcmRseSBpZiB0aGUgY29kZSBzdGFydHMKK291dCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitwcmludGYgKGYtPnRyaWVkX2ltcGxpY2l0CisgICAgICAgID8gIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyBiZWVuIGRvbmUuXG4iLAorICAgICAgICA6ICIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMgbm90IGJlZW4gZG9uZS5cbiIpOworQGVuZCBleGFtcGxlCisKK0Bub2RlIE1tYXAKK0BzZWN0aW9uIE1tYXAKKworRG9uJ3QgYXNzdW1lIHRoYXQgQGNvZGV7bW1hcH0gZWl0aGVyIHdvcmtzIG9uIGFsbCBmaWxlcyBvciBmYWlscworZm9yIGFsbCBmaWxlcy4gIEl0IG1heSB3b3JrIG9uIHNvbWUgZmlsZXMgYW5kIGZhaWwgb24gb3RoZXJzLgorCitUaGUgcHJvcGVyIHdheSB0byB1c2UgQGNvZGV7bW1hcH0gaXMgdG8gdHJ5IGl0IG9uIHRoZSBzcGVjaWZpYyBmaWxlIGZvcgord2hpY2ggeW91IHdhbnQgdG8gdXNlIGl0LS0tYW5kIGlmIEBjb2Rle21tYXB9IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIG9uCitkb2luZyB0aGUgam9iIGluIGFub3RoZXIgd2F5IHVzaW5nIEBjb2Rle3JlYWR9IGFuZCBAY29kZXt3cml0ZX0uCisKK1RoZSByZWFzb24gdGhpcyBwcmVjYXV0aW9uIGlzIG5lZWRlZCBpcyB0aGF0IHRoZSBHTlUga2VybmVsICh0aGUgSFVSRCkKK3Byb3ZpZGVzIGEgdXNlci1leHRlbnNpYmxlIGZpbGUgc3lzdGVtLCBpbiB3aGljaCB0aGVyZSBjYW4gYmUgbWFueQorZGlmZmVyZW50IGtpbmRzIG9mIGBgb3JkaW5hcnkgZmlsZXMuJycgIE1hbnkgb2YgdGhlbSBzdXBwb3J0CitAY29kZXttbWFwfSwgYnV0IHNvbWUgZG8gbm90LiAgSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgcHJvZ3JhbXMgaGFuZGxlCithbGwgdGhlc2Uga2luZHMgb2YgZmlsZXMuCisKK0Bub2RlIERvY3VtZW50YXRpb24KK0BjaGFwdGVyIERvY3VtZW50aW5nIFByb2dyYW1zCisKK0BtZW51CisqIEdOVSBNYW51YWxzOjogICAgICAgICAgICAgICAgIFdyaXRpbmcgcHJvcGVyIG1hbnVhbHMuCisqIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlsczo6ICAgIFNwZWNpZmljIHN0cnVjdHVyZSBjb252ZW50aW9ucy4KKyogTkVXUyBGaWxlOjogICAgICAgICAgICAgICAgICAgTkVXUyBmaWxlcyBzdXBwbGVtZW50IG1hbnVhbHMuCisqIENoYW5nZSBMb2dzOjogICAgICAgICAgICAgICAgIFJlY29yZGluZyBDaGFuZ2VzCisqIE1hbiBQYWdlczo6ICAgICAgICAgICAgICAgICAgIE1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LgorKiBSZWFkaW5nIG90aGVyIE1hbnVhbHM6OiAgICAgICBIb3cgZmFyIHlvdSBjYW4gZ28gaW4gbGVhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBvdGhlciBtYW51YWxzLgorQGVuZCBtZW51CisKK0Bub2RlIEdOVSBNYW51YWxzCitAc2VjdGlvbiBHTlUgTWFudWFscworCitUaGUgcHJlZmVycmVkIHdheSB0byBkb2N1bWVudCBwYXJ0IG9mIHRoZSBHTlUgc3lzdGVtIGlzIHRvIHdyaXRlIGEKK21hbnVhbCBpbiB0aGUgVGV4aW5mbyBmb3JtYXR0aW5nIGxhbmd1YWdlLiAgU2VlIHRoZSBUZXhpbmZvIG1hbnVhbCwKK2VpdGhlciB0aGUgaGFyZGNvcHksIG9yIHRoZSBvbi1saW5lIHZlcnNpb24gYXZhaWxhYmxlIHRocm91Z2gKK0Bjb2Rle2luZm99IG9yIHRoZSBFbWFjcyBJbmZvIHN1YnN5c3RlbSAoQGtiZHtDLWggaX0pLgorCitQcm9ncmFtbWVycyBvZnRlbiBmaW5kIGl0IG1vc3QgbmF0dXJhbCB0byBzdHJ1Y3R1cmUgdGhlIGRvY3VtZW50YXRpb24KK2ZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdGhleSBrbm93LiAgQnV0Cit0aGlzIHN0cnVjdHVyZSBpcyBub3QgbmVjZXNzYXJpbHkgZ29vZCBmb3IgZXhwbGFpbmluZyBob3cgdG8gdXNlIHRoZQorcHJvZ3JhbTsgaXQgbWF5IGJlIGlycmVsZXZhbnQgYW5kIGNvbmZ1c2luZyBmb3IgYSB1c2VyLgorCitBdCBldmVyeSBsZXZlbCwgZnJvbSB0aGUgc2VudGVuY2VzIGluIGEgcGFyYWdyYXBoIHRvIHRoZSBncm91cGluZyBvZgordG9waWNzIGludG8gc2VwYXJhdGUgbWFudWFscywgdGhlIHJpZ2h0IHdheSB0byBzdHJ1Y3R1cmUgZG9jdW1lbnRhdGlvbgoraXMgYWNjb3JkaW5nIHRvIHRoZSBjb25jZXB0cyBhbmQgcXVlc3Rpb25zIHRoYXQgYSB1c2VyIHdpbGwgaGF2ZSBpbiBtaW5kCit3aGVuIHJlYWRpbmcgaXQuICBTb21ldGltZXMgdGhpcyBzdHJ1Y3R1cmUgb2YgaWRlYXMgbWF0Y2hlcyB0aGUKK3N0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvZnR3YXJlIGJlaW5nIGRvY3VtZW50ZWQtLS1idXQKK29mdGVuIHRoZXkgYXJlIGRpZmZlcmVudC4gIE9mdGVuIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGxlYXJuaW5nIHRvCit3cml0ZSBnb29kIGRvY3VtZW50YXRpb24gaXMgbGVhcm5pbmcgdG8gbm90aWNlIHdoZW4geW91IGFyZSBzdHJ1Y3R1cmluZwordGhlIGRvY3VtZW50YXRpb24gbGlrZSB0aGUgaW1wbGVtZW50YXRpb24sIGFuZCB0aGluayBhYm91dCBiZXR0ZXIKK2FsdGVybmF0aXZlcy4KKworRm9yIGV4YW1wbGUsIGVhY2ggcHJvZ3JhbSBpbiB0aGUgR05VIHN5c3RlbSBwcm9iYWJseSBvdWdodCB0byBiZQorZG9jdW1lbnRlZCBpbiBvbmUgbWFudWFsOyBidXQgdGhpcyBkb2VzIG5vdCBtZWFuIGVhY2ggcHJvZ3JhbSBzaG91bGQKK2hhdmUgaXRzIG93biBtYW51YWwuICBUaGF0IHdvdWxkIGJlIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZQoraW1wbGVtZW50YXRpb24sIHJhdGhlciB0aGFuIHRoZSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB0aGUgdXNlcgordW5kZXJzdGFuZC4KKworSW5zdGVhZCwgZWFjaCBtYW51YWwgc2hvdWxkIGNvdmVyIGEgY29oZXJlbnQgQGVtcGh7dG9waWN9LiAgRm9yIGV4YW1wbGUsCitpbnN0ZWFkIG9mIGEgbWFudWFsIGZvciBAY29kZXtkaWZmfSBhbmQgYSBtYW51YWwgZm9yIEBjb2Rle2RpZmYzfSwgd2UKK2hhdmUgb25lIG1hbnVhbCBmb3IgYGBjb21wYXJpc29uIG9mIGZpbGVzJycgd2hpY2ggY292ZXJzIGJvdGggb2YgdGhvc2UKK3Byb2dyYW1zLCBhcyB3ZWxsIGFzIEBjb2Rle2NtcH0uICBCeSBkb2N1bWVudGluZyB0aGVzZSBwcm9ncmFtcwordG9nZXRoZXIsIHdlIGNhbiBtYWtlIHRoZSB3aG9sZSBzdWJqZWN0IGNsZWFyZXIuCisKK1RoZSBtYW51YWwgd2hpY2ggZGlzY3Vzc2VzIGEgcHJvZ3JhbSBzaG91bGQgZG9jdW1lbnQgYWxsIG9mIHRoZQorcHJvZ3JhbSdzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBhbGwgb2YgaXRzIGNvbW1hbmRzLiAgSXQgc2hvdWxkIGdpdmUKK2V4YW1wbGVzIG9mIHRoZWlyIHVzZS4gIEJ1dCBkb24ndCBvcmdhbml6ZSB0aGUgbWFudWFsIGFzIGEgbGlzdCBvZgorZmVhdHVyZXMuICBJbnN0ZWFkLCBvcmdhbml6ZSBpdCBsb2dpY2FsbHksIGJ5IHN1YnRvcGljcy4gIEFkZHJlc3MgdGhlCitxdWVzdGlvbnMgdGhhdCBhIHVzZXIgd2lsbCBhc2sgd2hlbiB0aGlua2luZyBhYm91dCB0aGUgam9iIHRoYXQgdGhlCitwcm9ncmFtIGRvZXMuCisKK0luIGdlbmVyYWwsIGEgR05VIG1hbnVhbCBzaG91bGQgc2VydmUgYm90aCBhcyB0dXRvcmlhbCBhbmQgcmVmZXJlbmNlLgorSXQgc2hvdWxkIGJlIHNldCB1cCBmb3IgY29udmVuaWVudCBhY2Nlc3MgdG8gZWFjaCB0b3BpYyB0aHJvdWdoIEluZm8sCithbmQgZm9yIHJlYWRpbmcgc3RyYWlnaHQgdGhyb3VnaCAoYXBwZW5kaXhlcyBhc2lkZSkuICBBIEdOVSBtYW51YWwKK3Nob3VsZCBnaXZlIGEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gYSBiZWdpbm5lciByZWFkaW5nIHRocm91Z2ggZnJvbSB0aGUKK3N0YXJ0LCBhbmQgc2hvdWxkIGFsc28gcHJvdmlkZSBhbGwgdGhlIGRldGFpbHMgdGhhdCBoYWNrZXJzIHdhbnQuCisKK1RoYXQgaXMgbm90IGFzIGhhcmQgYXMgaXQgZmlyc3Qgc291bmRzLiAgQXJyYW5nZSBlYWNoIGNoYXB0ZXIgYXMgYQorbG9naWNhbCBicmVha2Rvd24gb2YgaXRzIHRvcGljLCBidXQgb3JkZXIgdGhlIHNlY3Rpb25zLCBhbmQgd3JpdGUgdGhlaXIKK3RleHQsIHNvIHRoYXQgcmVhZGluZyB0aGUgY2hhcHRlciBzdHJhaWdodCB0aHJvdWdoIG1ha2VzIHNlbnNlLiAgRG8KK2xpa2V3aXNlIHdoZW4gc3RydWN0dXJpbmcgdGhlIGJvb2sgaW50byBjaGFwdGVycywgYW5kIHdoZW4gc3RydWN0dXJpbmcgYQorc2VjdGlvbiBpbnRvIHBhcmFncmFwaHMuICBUaGUgd2F0Y2h3b3JkIGlzLCBAZW1waHthdCBlYWNoIHBvaW50LCBhZGRyZXNzCit0aGUgbW9zdCBmdW5kYW1lbnRhbCBhbmQgaW1wb3J0YW50IGlzc3VlIHJhaXNlZCBieSB0aGUgcHJlY2VkaW5nIHRleHQufQorCitJZiBuZWNlc3NhcnksIGFkZCBleHRyYSBjaGFwdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYW51YWwgd2hpY2gKK2FyZSBwdXJlbHkgdHV0b3JpYWwgYW5kIGNvdmVyIHRoZSBiYXNpY3Mgb2YgdGhlIHN1YmplY3QuICBUaGVzZSBwcm92aWRlCit0aGUgZnJhbWV3b3JrIGZvciBhIGJlZ2lubmVyIHRvIHVuZGVyc3RhbmQgdGhlIHJlc3Qgb2YgdGhlIG1hbnVhbC4gIFRoZQorQmlzb24gbWFudWFsIHByb3ZpZGVzIGEgZ29vZCBleGFtcGxlIG9mIGhvdyB0byBkbyB0aGlzLgorCitEb24ndCB1c2UgVW5peCBtYW4gcGFnZXMgYXMgYSBtb2RlbCBmb3IgaG93IHRvIHdyaXRlIEdOVSBkb2N1bWVudGF0aW9uOworbW9zdCBvZiB0aGVtIGFyZSB0ZXJzZSwgYmFkbHkgc3RydWN0dXJlZCwgYW5kIGdpdmUgaW5hZGVxdWF0ZQorZXhwbGFuYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgY29uY2VwdHMuICAoVGhlcmUgYXJlLCBvZiBjb3Vyc2UKK2V4Y2VwdGlvbnMuKSAgQWxzbyBVbml4IG1hbiBwYWdlcyB1c2UgYSBwYXJ0aWN1bGFyIGZvcm1hdCB3aGljaCBpcworZGlmZmVyZW50IGZyb20gd2hhdCB3ZSB1c2UgaW4gR05VIG1hbnVhbHMuCisKK1BsZWFzZSBkbyBub3QgdXNlIHRoZSB0ZXJtIGBgcGF0aG5hbWUnJyB0aGF0IGlzIHVzZWQgaW4gVW5peAorZG9jdW1lbnRhdGlvbjsgdXNlIGBgZmlsZSBuYW1lJycgKHR3byB3b3JkcykgaW5zdGVhZC4gIFdlIHVzZSB0aGUgdGVybQorYGBwYXRoJycgb25seSBmb3Igc2VhcmNoIHBhdGhzLCB3aGljaCBhcmUgbGlzdHMgb2YgZmlsZSBuYW1lcy4KKworUGxlYXNlIGRvIG5vdCB1c2UgdGhlIHRlcm0gYGBpbGxlZ2FsJycgdG8gcmVmZXIgdG8gZXJyb25lb3VzIGlucHV0IHRvIGEKK2NvbXB1dGVyIHByb2dyYW0uICBQbGVhc2UgdXNlIGBgaW52YWxpZCcnIGZvciB0aGlzLCBhbmQgcmVzZXJ2ZSB0aGUgdGVybQorYGBpbGxlZ2FsJycgZm9yIHZpb2xhdGlvbnMgb2YgbGF3LgorCitAbm9kZSBNYW51YWwgU3RydWN0dXJlIERldGFpbHMKK0BzZWN0aW9uIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlscworCitUaGUgdGl0bGUgcGFnZSBvZiB0aGUgbWFudWFsIHNob3VsZCBzdGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbXMgb3IKK3BhY2thZ2VzIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbC4gIFRoZSBUb3Agbm9kZSBvZiB0aGUgbWFudWFsIHNob3VsZAorYWxzbyBjb250YWluIHRoaXMgaW5mb3JtYXRpb24uICBJZiB0aGUgbWFudWFsIGlzIGNoYW5naW5nIG1vcmUKK2ZyZXF1ZW50bHkgdGhhbiBvciBpbmRlcGVuZGVudCBvZiB0aGUgcHJvZ3JhbSwgYWxzbyBzdGF0ZSBhIHZlcnNpb24KK251bWJlciBmb3IgdGhlIG1hbnVhbCBpbiBib3RoIG9mIHRoZXNlIHBsYWNlcy4KKworRWFjaCBwcm9ncmFtIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbCBzaG91bGQgc2hvdWxkIGhhdmUgYSBub2RlIG5hbWVkCitAc2FtcHtAdmFye3Byb2dyYW19IEludm9jYXRpb259IG9yIEBzYW1we0ludm9raW5nIEB2YXJ7cHJvZ3JhbX19LiAgVGhpcworbm9kZSAodG9nZXRoZXIgd2l0aCBpdHMgc3Vibm9kZXMsIGlmIGFueSkgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ncmFtJ3MKK2NvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIGhvdyB0byBydW4gaXQgKHRoZSBzb3J0IG9mIGluZm9ybWF0aW9uIHBlb3BsZQord291bGQgbG9vayBpbiBhIG1hbiBwYWdlIGZvcikuICBTdGFydCB3aXRoIGFuIEBzYW1we0BAZXhhbXBsZX0KK2NvbnRhaW5pbmcgYSB0ZW1wbGF0ZSBmb3IgYWxsIHRoZSBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCB0aGUgcHJvZ3JhbQordXNlcy4KKworQWx0ZXJuYXRpdmVseSwgcHV0IGEgbWVudSBpdGVtIGluIHNvbWUgbWVudSB3aG9zZSBpdGVtIG5hbWUgZml0cyBvbmUgb2YKK3RoZSBhYm92ZSBwYXR0ZXJucy4gIFRoaXMgaWRlbnRpZmllcyB0aGUgbm9kZSB3aGljaCB0aGF0IGl0ZW0gcG9pbnRzIHRvCithcyB0aGUgbm9kZSBmb3IgdGhpcyBwdXJwb3NlLCByZWdhcmRsZXNzIG9mIHRoZSBub2RlJ3MgYWN0dWFsIG5hbWUuCisKK1RoZXJlIHdpbGwgYmUgYXV0b21hdGljIGZlYXR1cmVzIGZvciBzcGVjaWZ5aW5nIGEgcHJvZ3JhbSBuYW1lIGFuZAorcXVpY2tseSByZWFkaW5nIGp1c3QgdGhpcyBwYXJ0IG9mIGl0cyBtYW51YWwuCisKK0lmIG9uZSBtYW51YWwgZGVzY3JpYmVzIHNldmVyYWwgcHJvZ3JhbXMsIGl0IHNob3VsZCBoYXZlIHN1Y2ggYSBub2RlIGZvcgorZWFjaCBwcm9ncmFtIGRlc2NyaWJlZC4KKworQG5vZGUgTkVXUyBGaWxlCitAc2VjdGlvbiBUaGUgTkVXUyBGaWxlCisKK0luIGFkZGl0aW9uIHRvIGl0cyBtYW51YWwsIHRoZSBwYWNrYWdlIHNob3VsZCBoYXZlIGEgZmlsZSBuYW1lZAorQGZpbGV7TkVXU30gd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mIHVzZXItdmlzaWJsZSBjaGFuZ2VzIHdvcnRoCittZW50aW9uaW5nLiAgSW4gZWFjaCBuZXcgcmVsZWFzZSwgYWRkIGl0ZW1zIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBhbmQKK2lkZW50aWZ5IHRoZSB2ZXJzaW9uIHRoZXkgcGVydGFpbiB0by4gIERvbid0IGRpc2NhcmQgb2xkIGl0ZW1zOyBsZWF2ZQordGhlbSBpbiB0aGUgZmlsZSBhZnRlciB0aGUgbmV3ZXIgaXRlbXMuICBUaGlzIHdheSwgYSB1c2VyIHVwZ3JhZGluZyBmcm9tCithbnkgcHJldmlvdXMgdmVyc2lvbiBjYW4gc2VlIHdoYXQgaXMgbmV3LgorCitJZiB0aGUgQGZpbGV7TkVXU30gZmlsZSBnZXRzIHZlcnkgbG9uZywgbW92ZSBzb21lIG9mIHRoZSBvbGRlciBpdGVtcworaW50byBhIGZpbGUgbmFtZWQgQGZpbGV7T05FV1N9IGFuZCBwdXQgYSBub3RlIGF0IHRoZSBlbmQgcmVmZXJyaW5nIHRoZQordXNlciB0byB0aGF0IGZpbGUuCisKK0Bub2RlIENoYW5nZSBMb2dzCitAc2VjdGlvbiBDaGFuZ2UgTG9ncworCitLZWVwIGEgY2hhbmdlIGxvZyB0byBkZXNjcmliZSBhbGwgdGhlIGNoYW5nZXMgbWFkZSB0byBwcm9ncmFtIHNvdXJjZQorZmlsZXMuICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlIGludmVzdGlnYXRpbmcgYnVncyBpbiB0aGUKK2Z1dHVyZSB3aWxsIGtub3cgYWJvdXQgdGhlIGNoYW5nZXMgdGhhdCBtaWdodCBoYXZlIGludHJvZHVjZWQgdGhlIGJ1Zy4KK09mdGVuIGEgbmV3IGJ1ZyBjYW4gYmUgZm91bmQgYnkgbG9va2luZyBhdCB3aGF0IHdhcyByZWNlbnRseSBjaGFuZ2VkLgorTW9yZSBpbXBvcnRhbnRseSwgY2hhbmdlIGxvZ3MgY2FuIGhlbHAgeW91IGVsaW1pbmF0ZSBjb25jZXB0dWFsCitpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBieSBnaXZpbmcgeW91IGEKK2hpc3Rvcnkgb2YgaG93IHRoZSBjb25mbGljdGluZyBjb25jZXB0cyBhcm9zZSBhbmQgd2hvIHRoZXkgY2FtZSBmcm9tLgorCitAbWVudQorKiBDaGFuZ2UgTG9nIENvbmNlcHRzOjogICAgICAgICAKKyogU3R5bGUgb2YgQ2hhbmdlIExvZ3M6OiAgICAgICAgCisqIFNpbXBsZSBDaGFuZ2VzOjogICAgICAgICAgICAgIAorKiBDb25kaXRpb25hbCBDaGFuZ2VzOjogICAgICAgICAKK0BlbmQgbWVudQorCitAbm9kZSBDaGFuZ2UgTG9nIENvbmNlcHRzCitAc3Vic2VjdGlvbiBDaGFuZ2UgTG9nIENvbmNlcHRzCisKK1lvdSBjYW4gdGhpbmsgb2YgdGhlIGNoYW5nZSBsb2cgYXMgYSBjb25jZXB0dWFsIGBgdW5kbyBsaXN0Jycgd2hpY2gKK2V4cGxhaW5zIGhvdyBlYXJsaWVyIHZlcnNpb25zIHdlcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgdmVyc2lvbi4KK1Blb3BsZSBjYW4gc2VlIHRoZSBjdXJyZW50IHZlcnNpb247IHRoZXkgZG9uJ3QgbmVlZCB0aGUgY2hhbmdlIGxvZwordG8gdGVsbCB0aGVtIHdoYXQgaXMgaW4gaXQuICBXaGF0IHRoZXkgd2FudCBmcm9tIGEgY2hhbmdlIGxvZyBpcyBhCitjbGVhciBleHBsYW5hdGlvbiBvZiBob3cgdGhlIGVhcmxpZXIgdmVyc2lvbiBkaWZmZXJlZC4KKworVGhlIGNoYW5nZSBsb2cgZmlsZSBpcyBub3JtYWxseSBjYWxsZWQgQGZpbGV7Q2hhbmdlTG9nfSBhbmQgY292ZXJzIGFuCitlbnRpcmUgZGlyZWN0b3J5LiAgRWFjaCBkaXJlY3RvcnkgY2FuIGhhdmUgaXRzIG93biBjaGFuZ2UgbG9nLCBvciBhCitkaXJlY3RvcnkgY2FuIHVzZSB0aGUgY2hhbmdlIGxvZyBvZiBpdHMgcGFyZW50IGRpcmVjdG9yeS0taXQncyB1cCB0bworeW91LgorCitBbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIHJlY29yZCBjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHdpdGggYSB2ZXJzaW9uCitjb250cm9sIHN5c3RlbSBzdWNoIGFzIFJDUyBvciBDVlMuICBUaGlzIGNhbiBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseQordG8gYSBAZmlsZXtDaGFuZ2VMb2d9IGZpbGUuCisKK1RoZXJlJ3Mgbm8gbmVlZCB0byBkZXNjcmliZSB0aGUgZnVsbCBwdXJwb3NlIG9mIHRoZSBjaGFuZ2VzIG9yIGhvdyB0aGV5Cit3b3JrIHRvZ2V0aGVyLiAgSWYgeW91IHRoaW5rIHRoYXQgYSBjaGFuZ2UgY2FsbHMgZm9yIGV4cGxhbmF0aW9uLCB5b3UncmUKK3Byb2JhYmx5IHJpZ2h0LiAgUGxlYXNlIGRvIGV4cGxhaW4gaXQtLS1idXQgcGxlYXNlIHB1dCB0aGUgZXhwbGFuYXRpb24KK2luIGNvbW1lbnRzIGluIHRoZSBjb2RlLCB3aGVyZSBwZW9wbGUgd2lsbCBzZWUgaXQgd2hlbmV2ZXIgdGhleSBzZWUgdGhlCitjb2RlLiAgRm9yIGV4YW1wbGUsIGBgTmV3IGZ1bmN0aW9uJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZyB3aGVuCit5b3UgYWRkIGEgZnVuY3Rpb24sIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBiZWZvcmUgdGhlCitmdW5jdGlvbiBkZWZpbml0aW9uIHRvIGV4cGxhaW4gd2hhdCBpdCBkb2VzLgorCitIb3dldmVyLCBzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIHdyaXRlIG9uZSBsaW5lIHRvIGRlc2NyaWJlIHRoZQorb3ZlcmFsbCBwdXJwb3NlIG9mIGEgYmF0Y2ggb2YgY2hhbmdlcy4KKworVGhlIGVhc2llc3Qgd2F5IHRvIGFkZCBhbiBlbnRyeSB0byBAZmlsZXtDaGFuZ2VMb2d9IGlzIHdpdGggdGhlIEVtYWNzCitjb21tYW5kIEBrYmR7TS14IGFkZC1jaGFuZ2UtbG9nLWVudHJ5fS4gIEFuIGVudHJ5IHNob3VsZCBoYXZlIGFuCithc3RlcmlzaywgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgZmlsZSwgYW5kIHRoZW4gaW4gcGFyZW50aGVzZXMgdGhlIG5hbWUKK29mIHRoZSBjaGFuZ2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzIG9yIHdoYXRldmVyLCBmb2xsb3dlZCBieSBhIGNvbG9uLgorVGhlbiBkZXNjcmliZSB0aGUgY2hhbmdlcyB5b3UgbWFkZSB0byB0aGF0IGZ1bmN0aW9uIG9yIHZhcmlhYmxlLgorCitAbm9kZSBTdHlsZSBvZiBDaGFuZ2UgTG9ncworQHN1YnNlY3Rpb24gU3R5bGUgb2YgQ2hhbmdlIExvZ3MKKworSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBjaGFuZ2UgbG9nIGVudHJpZXM6CisKK0BleGFtcGxlCisqIHJlZ2lzdGVyLmVsIChpbnNlcnQtcmVnaXN0ZXIpOiBSZXR1cm4gbmlsLgorKGp1bXAtdG8tcmVnaXN0ZXIpOiBMaWtld2lzZS4KKworKiBzb3J0LmVsIChzb3J0LXN1YnIpOiBSZXR1cm4gbmlsLgorCisqIHRleC1tb2RlLmVsICh0ZXgtYmlidGV4LWZpbGUsIHRleC1maWxlLCB0ZXgtcmVnaW9uKToKK1Jlc3RhcnQgdGhlIHRleCBzaGVsbCBpZiBwcm9jZXNzIGlzIGdvbmUgb3Igc3RvcHBlZC4KKyh0ZXgtc2hlbGwtcnVubmluZyk6IE5ldyBmdW5jdGlvbi4KKworKiBleHByLmMgKHN0b3JlX29uZV9hcmcpOiBSb3VuZCBzaXplIHVwIGZvciBtb3ZlX2Jsb2NrX3RvX3JlZy4KKyhleHBhbmRfY2FsbCk6IFJvdW5kIHVwIHdoZW4gZW1pdHRpbmcgVVNFIGluc25zLgorKiBzdG10LmMgKGFzc2lnbl9wYXJtcyk6IFJvdW5kIHNpemUgdXAgZm9yIG1vdmVfYmxvY2tfZnJvbV9yZWcuCitAZW5kIGV4YW1wbGUKKworSXQncyBpbXBvcnRhbnQgdG8gbmFtZSB0aGUgY2hhbmdlZCBmdW5jdGlvbiBvciB2YXJpYWJsZSBpbiBmdWxsLiAgRG9uJ3QKK2FiYnJldmlhdGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgbmFtZXMsIGFuZCBkb24ndCBjb21iaW5lIHRoZW0uCitTdWJzZXF1ZW50IG1haW50YWluZXJzIHdpbGwgb2Z0ZW4gc2VhcmNoIGZvciBhIGZ1bmN0aW9uIG5hbWUgdG8gZmluZCBhbGwKK3RoZSBjaGFuZ2UgbG9nIGVudHJpZXMgdGhhdCBwZXJ0YWluIHRvIGl0OyBpZiB5b3UgYWJicmV2aWF0ZSB0aGUgbmFtZSwKK3RoZXkgd29uJ3QgZmluZCBpdCB3aGVuIHRoZXkgc2VhcmNoLgorCitGb3IgZXhhbXBsZSwgc29tZSBwZW9wbGUgYXJlIHRlbXB0ZWQgdG8gYWJicmV2aWF0ZSBncm91cHMgb2YgZnVuY3Rpb24KK25hbWVzIGJ5IHdyaXRpbmcgQHNhbXB7KiByZWdpc3Rlci5lbCAoQHtpbnNlcnQsanVtcC10b0B9LXJlZ2lzdGVyKX07Cit0aGlzIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2Ugc2VhcmNoaW5nIGZvciBAY29kZXtqdW1wLXRvLXJlZ2lzdGVyfSBvcgorQGNvZGV7aW5zZXJ0LXJlZ2lzdGVyfSB3b3VsZCBub3QgZmluZCB0aGF0IGVudHJ5LgorCitTZXBhcmF0ZSB1bnJlbGF0ZWQgY2hhbmdlIGxvZyBlbnRyaWVzIHdpdGggYmxhbmsgbGluZXMuICBXaGVuIHR3bworZW50cmllcyByZXByZXNlbnQgcGFydHMgb2YgdGhlIHNhbWUgY2hhbmdlLCBzbyB0aGF0IHRoZXkgd29yayB0b2dldGhlciwKK3RoZW4gZG9uJ3QgcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gdGhlbS4gIFRoZW4geW91IGNhbiBvbWl0IHRoZSBmaWxlCituYW1lIGFuZCB0aGUgYXN0ZXJpc2sgd2hlbiBzdWNjZXNzaXZlIGVudHJpZXMgYXJlIGluIHRoZSBzYW1lIGZpbGUuCisKK0Bub2RlIFNpbXBsZSBDaGFuZ2VzCitAc3Vic2VjdGlvbiBTaW1wbGUgQ2hhbmdlcworCitDZXJ0YWluIHNpbXBsZSBraW5kcyBvZiBjaGFuZ2VzIGRvbid0IG5lZWQgbXVjaCBkZXRhaWwgaW4gdGhlIGNoYW5nZQorbG9nLgorCitXaGVuIHlvdSBjaGFuZ2UgdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YgYSBmdW5jdGlvbiBpbiBhIHNpbXBsZSBmYXNoaW9uLAorYW5kIHlvdSBjaGFuZ2UgYWxsIHRoZSBjYWxsZXJzIG9mIHRoZSBmdW5jdGlvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlCitpbmRpdmlkdWFsIGVudHJpZXMgZm9yIGFsbCB0aGUgY2FsbGVycyB0aGF0IHlvdSBjaGFuZ2VkLiAgSnVzdCB3cml0ZSBpbgordGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBgYEFsbCBjYWxsZXJzIGNoYW5nZWQuJycKKworQGV4YW1wbGUKKyoga2V5Ym9hcmQuYyAoRmNvbW1hbmRfZXhlY3V0ZSk6IE5ldyBhcmcgU1BFQ0lBTC4KK0FsbCBjYWxsZXJzIGNoYW5nZWQuCitAZW5kIGV4YW1wbGUKKworV2hlbiB5b3UgY2hhbmdlIGp1c3QgY29tbWVudHMgb3IgZG9jIHN0cmluZ3MsIGl0IGlzIGVub3VnaCB0byB3cml0ZSBhbgorZW50cnkgZm9yIHRoZSBmaWxlLCB3aXRob3V0IG1lbnRpb25pbmcgdGhlIGZ1bmN0aW9ucy4gIEp1c3QgYGBEb2MKK2ZpeGVzJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZy4KKworVGhlcmUncyBubyBuZWVkIHRvIG1ha2UgY2hhbmdlIGxvZyBlbnRyaWVzIGZvciBkb2N1bWVudGF0aW9uIGZpbGVzLgorVGhpcyBpcyBiZWNhdXNlIGRvY3VtZW50YXRpb24gaXMgbm90IHN1c2NlcHRpYmxlIHRvIGJ1Z3MgdGhhdCBhcmUgaGFyZAordG8gZml4LiAgRG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBjb25zaXN0IG9mIHBhcnRzIHRoYXQgbXVzdCBpbnRlcmFjdCBpbiBhCitwcmVjaXNlbHkgZW5naW5lZXJlZCBmYXNoaW9uLiAgVG8gY29ycmVjdCBhbiBlcnJvciwgeW91IG5lZWQgbm90IGtub3cKK3RoZSBoaXN0b3J5IG9mIHRoZSBlcnJvbmVvdXMgcGFzc2FnZTsgaXQgaXMgZW5vdWdoIHRvIGNvbXBhcmUgd2hhdCB0aGUKK2RvY3VtZW50YXRpb24gc2F5cyB3aXRoIHRoZSB3YXkgdGhlIHByb2dyYW0gYWN0dWFsbHkgd29ya3MuCisKK0Bub2RlIENvbmRpdGlvbmFsIENoYW5nZXMKK0BzdWJzZWN0aW9uIENvbmRpdGlvbmFsIENoYW5nZXMKKworQyBwcm9ncmFtcyBvZnRlbiBjb250YWluIGNvbXBpbGUtdGltZSBAY29kZXsjaWZ9IGNvbmRpdGlvbmFscy4gIE1hbnkKK2NoYW5nZXMgYXJlIGNvbmRpdGlvbmFsOyBzb21ldGltZXMgeW91IGFkZCBhIG5ldyBkZWZpbml0aW9uIHdoaWNoIGlzCitlbnRpcmVseSBjb250YWluZWQgaW4gYSBjb25kaXRpb25hbC4gIEl0IGlzIHZlcnkgdXNlZnVsIHRvIGluZGljYXRlIGluCit0aGUgY2hhbmdlIGxvZyB0aGUgY29uZGl0aW9ucyBmb3Igd2hpY2ggdGhlIGNoYW5nZSBhcHBsaWVzLgorCitPdXIgY29udmVudGlvbiBmb3IgaW5kaWNhdGluZyBjb25kaXRpb25hbCBjaGFuZ2VzIGlzIHRvIHVzZSBzcXVhcmUKK2JyYWNrZXRzIGFyb3VuZCB0aGUgbmFtZSBvZiB0aGUgY29uZGl0aW9uLgorCitIZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUsIGRlc2NyaWJpbmcgYSBjaGFuZ2Ugd2hpY2ggaXMgY29uZGl0aW9uYWwgYnV0Citkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gb3IgZW50aXR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0OgorCitAZXhhbXBsZQorKiB4dGVybS5jIFtTT0xBUklTMl06IEluY2x1ZGUgc3RyaW5nLmguCitAZW5kIGV4YW1wbGUKKworSGVyZSBpcyBhbiBlbnRyeSBkZXNjcmliaW5nIGEgbmV3IGRlZmluaXRpb24gd2hpY2ggaXMgZW50aXJlbHkKK2NvbmRpdGlvbmFsLiAgVGhpcyBuZXcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hY3JvIEBjb2Rle0ZSQU1FX1dJTkRPV19QfSBpcwordXNlZCBvbmx5IHdoZW4gQGNvZGV7SEFWRV9YX1dJTkRPV1N9IGlzIGRlZmluZWQ6CisKK0BleGFtcGxlCisqIGZyYW1lLmggW0hBVkVfWF9XSU5ET1dTXSAoRlJBTUVfV0lORE9XX1ApOiBNYWNybyBkZWZpbmVkLgorQGVuZCBleGFtcGxlCisKK0hlcmUgaXMgYW4gZW50cnkgZm9yIGEgY2hhbmdlIHdpdGhpbiB0aGUgZnVuY3Rpb24gQGNvZGV7aW5pdF9kaXNwbGF5fSwKK3dob3NlIGRlZmluaXRpb24gYXMgYSB3aG9sZSBpcyB1bmNvbmRpdGlvbmFsLCBidXQgdGhlIGNoYW5nZXMgdGhlbXNlbHZlcworYXJlIGNvbnRhaW5lZCBpbiBhIEBzYW1weyNpZmRlZiBIQVZFX0xJQk5DVVJTRVN9IGNvbmRpdGlvbmFsOgorCitAZXhhbXBsZQorKiBkaXNwbmV3LmMgKGluaXRfZGlzcGxheSkgW0hBVkVfTElCTkNVUlNFU106IElmIFgsIGNhbGwgdGdldGVudC4KK0BlbmQgZXhhbXBsZQorCitIZXJlIGlzIGFuIGVudHJ5IGZvciBhIGNoYW5nZSB0aGF0IHRha2VzIGFmZmVjdCBvbmx5IHdoZW4KK2EgY2VydGFpbiBtYWNybyBpcyBAZW1waHtub3R9IGRlZmluZWQ6CisKK0BleGFtcGxlCisoZ2V0aG9zdG5hbWUpIFshSEFWRV9TT0NLRVRTXTogUmVwbGFjZSB3aXRoIHdpbnNvY2sgdmVyc2lvbi4KK0BlbmQgZXhhbXBsZQorCitAbm9kZSBNYW4gUGFnZXMKK0BzZWN0aW9uIE1hbiBQYWdlcworCitJbiB0aGUgR05VIHByb2plY3QsIG1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBvcgorZXhwZWN0ZWQgZm9yIGV2ZXJ5IEdOVSBwcm9ncmFtIHRvIGhhdmUgYSBtYW4gcGFnZSwgYnV0IHNvbWUgb2YgdGhlbSBkby4KK0l0J3MgeW91ciBjaG9pY2Ugd2hldGhlciB0byBpbmNsdWRlIGEgbWFuIHBhZ2UgaW4geW91ciBwcm9ncmFtLgorCitXaGVuIHlvdSBtYWtlIHRoaXMgZGVjaXNpb24sIGNvbnNpZGVyIHRoYXQgc3VwcG9ydGluZyBhIG1hbiBwYWdlCityZXF1aXJlcyBjb250aW51YWwgZWZmb3J0IGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBpcyBjaGFuZ2VkLiAgVGhlIHRpbWUKK3lvdSBzcGVuZCBvbiB0aGUgbWFuIHBhZ2UgaXMgdGltZSB0YWtlbiBhd2F5IGZyb20gbW9yZSB1c2VmdWwgd29yay4KKworRm9yIGEgc2ltcGxlIHByb2dyYW0gd2hpY2ggY2hhbmdlcyBsaXR0bGUsIHVwZGF0aW5nIHRoZSBtYW4gcGFnZSBtYXkgYmUKK2Egc21hbGwgam9iLiAgVGhlbiB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIG5vdCB0byBpbmNsdWRlIGEgbWFuIHBhZ2UsIGlmCit5b3UgaGF2ZSBvbmUuCisKK0ZvciBhIGxhcmdlIHByb2dyYW0gdGhhdCBjaGFuZ2VzIGEgZ3JlYXQgZGVhbCwgdXBkYXRpbmcgYSBtYW4gcGFnZSBtYXkKK2JlIGEgc3Vic3RhbnRpYWwgYnVyZGVuLiAgSWYgYSB1c2VyIG9mZmVycyB0byBkb25hdGUgYSBtYW4gcGFnZSwgeW91IG1heQorZmluZCB0aGlzIGdpZnQgY29zdGx5IHRvIGFjY2VwdC4gIEl0IG1heSBiZSBiZXR0ZXIgdG8gcmVmdXNlIHRoZSBtYW4KK3BhZ2UgdW5sZXNzIHRoZSBzYW1lIHBlcnNvbiBhZ3JlZXMgdG8gdGFrZSBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvcgorbWFpbnRhaW5pbmcgaXQtLS1zbyB0aGF0IHlvdSBjYW4gd2FzaCB5b3VyIGhhbmRzIG9mIGl0IGVudGlyZWx5LiAgSWYKK3RoaXMgdm9sdW50ZWVyIGxhdGVyIGNlYXNlcyB0byBkbyB0aGUgam9iLCB0aGVuIGRvbid0IGZlZWwgb2JsaWdlZCB0bworcGljayBpdCB1cCB5b3Vyc2VsZjsgaXQgbWF5IGJlIGJldHRlciB0byB3aXRoZHJhdyB0aGUgbWFuIHBhZ2UgZnJvbSB0aGUKK2Rpc3RyaWJ1dGlvbiB1bnRpbCBzb21lb25lIGVsc2UgYWdyZWVzIHRvIHVwZGF0ZSBpdC4KKworV2hlbiBhIHByb2dyYW0gY2hhbmdlcyBvbmx5IGEgbGl0dGxlLCB5b3UgbWF5IGZlZWwgdGhhdCB0aGUKK2Rpc2NyZXBhbmNpZXMgYXJlIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBtYW4gcGFnZSByZW1haW5zIHVzZWZ1bCB3aXRob3V0Cit1cGRhdGluZy4gIElmIHNvLCBwdXQgYSBwcm9taW5lbnQgbm90ZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hbgorcGFnZSBleHBsYWluaW5nIHRoYXQgeW91IGRvbid0IG1haW50YWluIGl0IGFuZCB0aGF0IHRoZSBUZXhpbmZvIG1hbnVhbAoraXMgbW9yZSBhdXRob3JpdGF0aXZlLiAgVGhlIG5vdGUgc2hvdWxkIHNheSBob3cgdG8gYWNjZXNzIHRoZSBUZXhpbmZvCitkb2N1bWVudGF0aW9uLgorCitAbm9kZSBSZWFkaW5nIG90aGVyIE1hbnVhbHMKK0BzZWN0aW9uIFJlYWRpbmcgb3RoZXIgTWFudWFscworCitUaGVyZSBtYXkgYmUgbm9uLWZyZWUgYm9va3Mgb3IgZG9jdW1lbnRhdGlvbiBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZQorcHJvZ3JhbSB5b3UgYXJlIGRvY3VtZW50aW5nLgorCitJdCBpcyBvayB0byB1c2UgdGhlc2UgZG9jdW1lbnRzIGZvciByZWZlcmVuY2UsIGp1c3QgYXMgdGhlIGF1dGhvciBvZiBhCituZXcgYWxnZWJyYSB0ZXh0Ym9vayBjYW4gcmVhZCBvdGhlciBib29rcyBvbiBhbGdlYnJhLiAgQSBsYXJnZSBwb3J0aW9uCitvZiBhbnkgbm9uLWZpY3Rpb24gYm9vayBjb25zaXN0cyBvZiBmYWN0cywgaW4gdGhpcyBjYXNlIGZhY3RzIGFib3V0IGhvdworYSBjZXJ0YWluIHByb2dyYW0gd29ya3MsIGFuZCB0aGVzZSBmYWN0cyBhcmUgbmVjZXNzYXJpbHkgdGhlIHNhbWUgZm9yCitldmVyeW9uZSB3aG8gd3JpdGVzIGFib3V0IHRoZSBzdWJqZWN0LiAgQnV0IGJlIGNhcmVmdWwgbm90IHRvIGNvcHkgeW91cgorb3V0bGluZSBzdHJ1Y3R1cmUsIHdvcmRpbmcsIHRhYmxlcyBvciBleGFtcGxlcyBmcm9tIHByZWV4aXN0aW5nIG5vbi1mcmVlCitkb2N1bWVudGF0aW9uLiAgQ29weWluZyBmcm9tIGZyZWUgZG9jdW1lbnRhdGlvbiBtYXkgYmUgb2s7IHBsZWFzZSBjaGVjaword2l0aCB0aGUgRlNGIGFib3V0IHRoZSBpbmRpdmlkdWFsIGNhc2UuCisKK0Bub2RlIE1hbmFnaW5nIFJlbGVhc2VzCitAY2hhcHRlciBUaGUgUmVsZWFzZSBQcm9jZXNzCisKK01ha2luZyBhIHJlbGVhc2UgaXMgbW9yZSB0aGFuIGp1c3QgYnVuZGxpbmcgdXAgeW91ciBzb3VyY2UgZmlsZXMgaW4gYQordGFyIGZpbGUgYW5kIHB1dHRpbmcgaXQgdXAgZm9yIEZUUC4gIFlvdSBzaG91bGQgc2V0IHVwIHlvdXIgc29mdHdhcmUgc28KK3RoYXQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIGEgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgWW91ciBNYWtlZmlsZQorc2hvdWxkIGNvbmZvcm0gdG8gdGhlIEdOVSBzdGFuZGFyZHMgZGVzY3JpYmVkIGJlbG93LCBhbmQgeW91ciBkaXJlY3RvcnkKK2xheW91dCBzaG91bGQgYWxzbyBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZHMgZGlzY3Vzc2VkIGJlbG93LiAgRG9pbmcgc28KK21ha2VzIGl0IGVhc3kgdG8gaW5jbHVkZSB5b3VyIHBhY2thZ2UgaW50byB0aGUgbGFyZ2VyIGZyYW1ld29yayBvZgorYWxsIEdOVSBzb2Z0d2FyZS4KKworQG1lbnUKKyogQ29uZmlndXJhdGlvbjo6ICAgICAgICAgICAgICAgSG93IENvbmZpZ3VyYXRpb24gU2hvdWxkIFdvcmsKKyogTWFrZWZpbGUgQ29udmVudGlvbnM6OglNYWtlZmlsZSBDb252ZW50aW9ucworKiBSZWxlYXNlczo6ICAgICAgICAgICAgICAgICAgICBNYWtpbmcgUmVsZWFzZXMKK0BlbmQgbWVudQorCitAbm9kZSBDb25maWd1cmF0aW9uCitAc2VjdGlvbiBIb3cgQ29uZmlndXJhdGlvbiBTaG91bGQgV29yaworCitFYWNoIEdOVSBkaXN0cmlidXRpb24gc2hvdWxkIGNvbWUgd2l0aCBhIHNoZWxsIHNjcmlwdCBuYW1lZAorQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgc2NyaXB0IGlzIGdpdmVuIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUKK2tpbmQgb2YgbWFjaGluZSBhbmQgc3lzdGVtIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHByb2dyYW0gZm9yLgorCitUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgbXVzdCByZWNvcmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzbwordGhhdCB0aGV5IGFmZmVjdCBjb21waWxhdGlvbi4KKworT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2UgYSBsaW5rIGZyb20gYSBzdGFuZGFyZCBuYW1lIHN1Y2ggYXMKK0BmaWxle2NvbmZpZy5ofSB0byB0aGUgcHJvcGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGNob3NlbiBzeXN0ZW0uCitJZiB5b3UgdXNlIHRoaXMgdGVjaG5pcXVlLCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBAZW1waHtub3R9IGNvbnRhaW4gYQorZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuaH0uICBUaGlzIGlzIHNvIHRoYXQgcGVvcGxlIHdvbid0IGJlIGFibGUgdG8KK2J1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCisKK0Fub3RoZXIgdGhpbmcgdGhhdCBAY29kZXtjb25maWd1cmV9IGNhbiBkbyBpcyB0byBlZGl0IHRoZSBNYWtlZmlsZS4gIElmCit5b3UgZG8gdGhpcywgdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgQGVtcGh7bm90fSBjb250YWluIGEgZmlsZSBuYW1lZAorQGZpbGV7TWFrZWZpbGV9LiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluY2x1ZGUgYSBmaWxlIEBmaWxle01ha2VmaWxlLmlufSB3aGljaAorY29udGFpbnMgdGhlIGlucHV0IHVzZWQgZm9yIGVkaXRpbmcuICBPbmNlIGFnYWluLCB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlCit3b24ndCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCisKK0lmIEBjb2Rle2NvbmZpZ3VyZX0gZG9lcyB3cml0ZSB0aGUgQGZpbGV7TWFrZWZpbGV9LCB0aGVuIEBmaWxle01ha2VmaWxlfQorc2hvdWxkIGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7TWFrZWZpbGV9IHdoaWNoIGNhdXNlcyBAY29kZXtjb25maWd1cmV9Cit0byBiZSByZXJ1biwgc2V0dGluZyB1cCB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHNldCB1cCBsYXN0Cit0aW1lLiAgVGhlIGZpbGVzIHRoYXQgQGNvZGV7Y29uZmlndXJlfSByZWFkcyBzaG91bGQgYmUgbGlzdGVkIGFzCitkZXBlbmRlbmNpZXMgb2YgQGZpbGV7TWFrZWZpbGV9LgorCitBbGwgdGhlIGZpbGVzIHdoaWNoIGFyZSBvdXRwdXQgZnJvbSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkCitoYXZlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgZXhwbGFpbmluZyB0aGF0IHRoZXkgd2VyZSBnZW5lcmF0ZWQKK2F1dG9tYXRpY2FsbHkgdXNpbmcgQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgaXMgc28gdGhhdCB1c2VycyB3b24ndCB0aGluaworb2YgdHJ5aW5nIHRvIGVkaXQgdGhlbSBieSBoYW5kLgorCitUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIHdyaXRlIGEgZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuc3RhdHVzfQord2hpY2ggZGVzY3JpYmVzIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCB3aGVuIHRoZQorcHJvZ3JhbSB3YXMgbGFzdCBjb25maWd1cmVkLiAgVGhpcyBmaWxlIHNob3VsZCBiZSBhIHNoZWxsIHNjcmlwdCB3aGljaCwKK2lmIHJ1biwgd2lsbCByZWNyZWF0ZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uLgorCitUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIGFjY2VwdCBhbiBvcHRpb24gb2YgdGhlIGZvcm0KK0BzYW1wey0tc3JjZGlyPUB2YXJ7ZGlybmFtZX19IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3VyY2VzIGFyZSBmb3VuZAorKGlmIGl0IGlzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBidWlsZAordGhlIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHNvIHRoYXQgdGhlIGFjdHVhbCBzb3VyY2UgZGlyZWN0b3J5CitpcyBub3QgbW9kaWZpZWQuCisKK0lmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgQHNhbXB7LS1zcmNkaXJ9LCB0aGVuIEBjb2Rle2NvbmZpZ3VyZX0gc2hvdWxkCitjaGVjayBib3RoIEBmaWxley59IGFuZCBAZmlsZXsuLn0gdG8gc2VlIGlmIGl0IGNhbiBmaW5kIHRoZSBzb3VyY2VzLiAgSWYKK2l0IGZpbmRzIHRoZSBzb3VyY2VzIGluIG9uZSBvZiB0aGVzZSBwbGFjZXMsIGl0IHNob3VsZCB1c2UgdGhlbSBmcm9tCit0aGVyZS4gIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJlcG9ydCB0aGF0IGl0IGNhbm5vdCBmaW5kIHRoZSBzb3VyY2VzLCBhbmQKK3Nob3VsZCBleGl0IHdpdGggbm9uemVybyBzdGF0dXMuCisKK1VzdWFsbHkgdGhlIGVhc3kgd2F5IHRvIHN1cHBvcnQgQHNhbXB7LS1zcmNkaXJ9IGlzIGJ5IGVkaXRpbmcgYQorZGVmaW5pdGlvbiBvZiBAY29kZXtWUEFUSH0gaW50byB0aGUgTWFrZWZpbGUuICBTb21lIHJ1bGVzIG1heSBuZWVkIHRvCityZWZlciBleHBsaWNpdGx5IHRvIHRoZSBzcGVjaWZpZWQgc291cmNlIGRpcmVjdG9yeS4gIFRvIG1ha2UgdGhpcworcG9zc2libGUsIEBjb2Rle2NvbmZpZ3VyZX0gY2FuIGFkZCB0byB0aGUgTWFrZWZpbGUgYSB2YXJpYWJsZSBuYW1lZAorQGNvZGV7c3JjZGlyfSB3aG9zZSB2YWx1ZSBpcyBwcmVjaXNlbHkgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCisKK1RoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgYWxzbyB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoIHNwZWNpZmllcyB0aGUKK3R5cGUgb2Ygc3lzdGVtIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIGZvci4gIFRoaXMgYXJndW1lbnQgc2hvdWxkIGxvb2sgbGlrZQordGhpczoKKworQGV4YW1wbGUKK0B2YXJ7Y3B1fS1AdmFye2NvbXBhbnl9LUB2YXJ7c3lzdGVtfQorQGVuZCBleGFtcGxlCisKK0ZvciBleGFtcGxlLCBhIFN1biAzIG1pZ2h0IGJlIEBzYW1we202OGstc3VuLXN1bm9zNC4xfS4KKworVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IG5lZWRzIHRvIGJlIGFibGUgdG8gZGVjb2RlIGFsbCBwbGF1c2libGUKK2FsdGVybmF0aXZlcyBmb3IgaG93IHRvIGRlc2NyaWJlIGEgbWFjaGluZS4gIFRodXMsIEBzYW1we3N1bjMtc3Vub3M0LjF9Cit3b3VsZCBiZSBhIHZhbGlkIGFsaWFzLiAgRm9yIG1hbnkgcHJvZ3JhbXMsIEBzYW1we3ZheC1kZWMtdWx0cml4fSB3b3VsZAorYmUgYW4gYWxpYXMgZm9yIEBzYW1we3ZheC1kZWMtYnNkfSwgc2ltcGx5IGJlY2F1c2UgdGhlIGRpZmZlcmVuY2VzCitiZXR3ZWVuIFVsdHJpeCBhbmQgQHNje0JTRH0gYXJlIHJhcmVseSBub3RpY2VhYmxlLCBidXQgYSBmZXcgcHJvZ3JhbXMKK21pZ2h0IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlbS4KK0BjIFJlYWwgNC40QlNEIG5vdyBydW5zIG9uIHNvbWUgU3Vucy4KKworVGhlcmUgaXMgYSBzaGVsbCBzY3JpcHQgY2FsbGVkIEBmaWxle2NvbmZpZy5zdWJ9IHRoYXQgeW91IGNhbiB1c2UKK2FzIGEgc3Vicm91dGluZSB0byB2YWxpZGF0ZSBzeXN0ZW0gdHlwZXMgYW5kIGNhbm9uaWNhbGl6ZSBhbGlhc2VzLgorCitPdGhlciBvcHRpb25zIGFyZSBwZXJtaXR0ZWQgdG8gc3BlY2lmeSBpbiBtb3JlIGRldGFpbCB0aGUgc29mdHdhcmUKK29yIGhhcmR3YXJlIHByZXNlbnQgb24gdGhlIG1hY2hpbmUsIGFuZCBpbmNsdWRlIG9yIGV4Y2x1ZGUgb3B0aW9uYWwKK3BhcnRzIG9mIHRoZSBwYWNrYWdlOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIC0tZW5hYmxlLUB2YXJ7ZmVhdHVyZX1AcntbfT1AdmFye3BhcmFtZXRlcn1AcntdfQorQ29uZmlndXJlIHRoZSBwYWNrYWdlIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9wdGlvbmFsIHVzZXItbGV2ZWwKK2ZhY2lsaXR5IGNhbGxlZCBAdmFye2ZlYXR1cmV9LiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gY2hvb3NlIHdoaWNoCitvcHRpb25hbCBmZWF0dXJlcyB0byBpbmNsdWRlLiAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgorQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7ZmVhdHVyZX0sIGlmIGl0IGlzIGJ1aWx0IGJ5IGRlZmF1bHQuCisKK05vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIEBzdHJvbmd7ZXZlcn0gY2F1c2Ugb25lIGZlYXR1cmUgdG8KK3JlcGxhY2UgYW5vdGhlci4gIE5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIGV2ZXIgc3Vic3RpdHV0ZSBvbmUKK3VzZWZ1bCBiZWhhdmlvciBmb3IgYW5vdGhlciB1c2VmdWwgYmVoYXZpb3IuICBUaGUgb25seSBwcm9wZXIgdXNlIGZvcgorQHNhbXB7LS1lbmFibGV9IGlzIGZvciBxdWVzdGlvbnMgb2Ygd2hldGhlciB0byBidWlsZCBwYXJ0IG9mIHRoZSBwcm9ncmFtCitvciBleGNsdWRlIGl0LgorCitAaXRlbSAtLXdpdGgtQHZhcntwYWNrYWdlfQorQGMgQHJ7W309QHZhcntwYXJhbWV0ZXJ9QHJ7XX0KK1RoZSBwYWNrYWdlIEB2YXJ7cGFja2FnZX0gd2lsbCBiZSBpbnN0YWxsZWQsIHNvIGNvbmZpZ3VyZSB0aGlzIHBhY2thZ2UKK3RvIHdvcmsgd2l0aCBAdmFye3BhY2thZ2V9LgorCitAYyAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgorQGMgQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7cGFja2FnZX0sIGlmIGl0IGlzIHVzZWQgYnkgZGVmYXVsdC4KKworUG9zc2libGUgdmFsdWVzIG9mIEB2YXJ7cGFja2FnZX0gaW5jbHVkZSAKK0BzYW1we2dudS1hc30gKG9yIEBzYW1we2dhc30pLCBAc2FtcHtnbnUtbGR9LCBAc2FtcHtnbnUtbGliY30sCitAc2FtcHtnZGJ9LAorQHNhbXB7eH0sIAorYW5kCitAc2FtcHt4LXRvb2xraXR9LgorCitEbyBub3QgdXNlIGEgQHNhbXB7LS13aXRofSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIHRvIHVzZSB0bworZmluZCBjZXJ0YWluIGZpbGVzLiAgVGhhdCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB3aGF0IEBzYW1wey0td2l0aH0KK29wdGlvbnMgYXJlIGZvci4KKworQGl0ZW0gLS1uZnAKK1RoZSB0YXJnZXQgbWFjaGluZSBoYXMgbm8gZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yLgorCitAaXRlbSAtLWdhcworVGhlIHRhcmdldCBtYWNoaW5lIGFzc2VtYmxlciBpcyBHQVMsIHRoZSBHTlUgYXNzZW1ibGVyLgorVGhpcyBpcyBvYnNvbGV0ZTsgdXNlcnMgc2hvdWxkIHVzZSBAc2FtcHstLXdpdGgtZ251LWFzfSBpbnN0ZWFkLgorCitAaXRlbSAtLXgKK1RoZSB0YXJnZXQgbWFjaGluZSBoYXMgdGhlIFggV2luZG93IFN5c3RlbSBpbnN0YWxsZWQuCitUaGlzIGlzIG9ic29sZXRlOyB1c2VycyBzaG91bGQgdXNlIEBzYW1wey0td2l0aC14fSBpbnN0ZWFkLgorQGVuZCB0YWJsZQorCitBbGwgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHRzIHNob3VsZCBhY2NlcHQgYWxsIG9mIHRoZXNlIGBgZGV0YWlsJycKK29wdGlvbnMsIHdoZXRoZXIgb3Igbm90IHRoZXkgbWFrZSBhbnkgZGlmZmVyZW5jZSB0byB0aGUgcGFydGljdWxhcgorcGFja2FnZSBhdCBoYW5kLiAgSW4gcGFydGljdWxhciwgdGhleSBzaG91bGQgYWNjZXB0IGFueSBvcHRpb24gdGhhdAorc3RhcnRzIHdpdGggQHNhbXB7LS13aXRoLX0gb3IgQHNhbXB7LS1lbmFibGUtfS4gIFRoaXMgaXMgc28gdXNlcnMgd2lsbAorYmUgYWJsZSB0byBjb25maWd1cmUgYW4gZW50aXJlIEdOVSBzb3VyY2UgdHJlZSBhdCBvbmNlIHdpdGggYSBzaW5nbGUgc2V0CitvZiBvcHRpb25zLgorCitZb3Ugd2lsbCBub3RlIHRoYXQgdGhlIGNhdGVnb3JpZXMgQHNhbXB7LS13aXRoLX0gYW5kIEBzYW1wey0tZW5hYmxlLX0KK2FyZSBuYXJyb3c6IHRoZXkgQHN0cm9uZ3tkbyBub3R9IHByb3ZpZGUgYSBwbGFjZSBmb3IgYW55IHNvcnQgb2Ygb3B0aW9uCit5b3UgbWlnaHQgdGhpbmsgb2YuICBUaGF0IGlzIGRlbGliZXJhdGUuICBXZSB3YW50IHRvIGxpbWl0IHRoZSBwb3NzaWJsZQorY29uZmlndXJhdGlvbiBvcHRpb25zIGluIEdOVSBzb2Z0d2FyZS4gIFdlIGRvIG5vdCB3YW50IEdOVSBwcm9ncmFtcyB0bworaGF2ZSBpZGlvc3luY3JhdGljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKworUGFja2FnZXMgdGhhdCBwZXJmb3JtIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgbWF5IHN1cHBvcnQgY3Jvc3MtY29tcGlsYXRpb24uCitJbiBzdWNoIGEgY2FzZSwgdGhlIGhvc3QgYW5kIHRhcmdldCBtYWNoaW5lcyBmb3IgdGhlIHByb2dyYW0gbWF5IGJlCitkaWZmZXJlbnQuICBUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIG5vcm1hbGx5IHRyZWF0IHRoZQorc3BlY2lmaWVkIHR5cGUgb2Ygc3lzdGVtIGFzIGJvdGggdGhlIGhvc3QgYW5kIHRoZSB0YXJnZXQsIHRodXMgcHJvZHVjaW5nCithIHByb2dyYW0gd2hpY2ggd29ya3MgZm9yIHRoZSBzYW1lIHR5cGUgb2YgbWFjaGluZSB0aGF0IGl0IHJ1bnMgb24uCisKK1RoZSB3YXkgdG8gYnVpbGQgYSBjcm9zcy1jb21waWxlciwgY3Jvc3MtYXNzZW1ibGVyLCBvciB3aGF0IGhhdmUgeW91LCBpcwordG8gc3BlY2lmeSB0aGUgb3B0aW9uIEBzYW1wey0taG9zdD1AdmFye2hvc3R0eXBlfX0gd2hlbiBydW5uaW5nCitAY29kZXtjb25maWd1cmV9LiAgVGhpcyBzcGVjaWZpZXMgdGhlIGhvc3Qgc3lzdGVtIHdpdGhvdXQgY2hhbmdpbmcgdGhlCit0eXBlIG9mIHRhcmdldCBzeXN0ZW0uICBUaGUgc3ludGF4IGZvciBAdmFye2hvc3R0eXBlfSBpcyB0aGUgc2FtZSBhcworZGVzY3JpYmVkIGFib3ZlLgorCitCb290c3RyYXBwaW5nIGEgY3Jvc3MtY29tcGlsZXIgcmVxdWlyZXMgY29tcGlsaW5nIGl0IG9uIGEgbWFjaGluZSBvdGhlcgordGhhbiB0aGUgaG9zdCBpdCB3aWxsIHJ1biBvbi4gIENvbXBpbGF0aW9uIHBhY2thZ2VzIGFjY2VwdCBhCitjb25maWd1cmF0aW9uIG9wdGlvbiBAc2FtcHstLWJ1aWxkPUB2YXJ7aG9zdHR5cGV9fSBmb3Igc3BlY2lmeWluZyB0aGUKK2NvbmZpZ3VyYXRpb24gb24gd2hpY2ggeW91IHdpbGwgY29tcGlsZSB0aGVtLCBpbiBjYXNlIHRoYXQgaXMgZGlmZmVyZW50Citmcm9tIHRoZSBob3N0LgorCitQcm9ncmFtcyBmb3Igd2hpY2ggY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBtZWFuaW5nZnVsIG5lZWQgbm90IGFjY2VwdCB0aGUKK0BzYW1wey0taG9zdH0gb3B0aW9uLCBiZWNhdXNlIGNvbmZpZ3VyaW5nIGFuIGVudGlyZSBvcGVyYXRpbmcgc3lzdGVtIGZvcgorY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBhIG1lYW5pbmdmdWwgdGhpbmcuCisKK1NvbWUgcHJvZ3JhbXMgaGF2ZSB3YXlzIG9mIGNvbmZpZ3VyaW5nIHRoZW1zZWx2ZXMgYXV0b21hdGljYWxseS4gIElmCit5b3VyIHByb2dyYW0gaXMgc2V0IHVwIHRvIGRvIHRoaXMsIHlvdXIgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgY2FuIHNpbXBseQoraWdub3JlIG1vc3Qgb2YgaXRzIGFyZ3VtZW50cy4KKworQGNvbW1lbnQgVGhlIG1ha2VmaWxlIHN0YW5kYXJkcyBhcmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHRoYXQgaXMgYWxzbworQGNvbW1lbnQgaW5jbHVkZWQgYnkgbWFrZS50ZXhpbmZvLiAgRG9uZSBieSByb2xhbmRAZ251LmFpLm1pdC5lZHUgb24gMS82LzkzLgorQGNvbW1lbnQgRm9yIHRoaXMgZG9jdW1lbnQsIHR1cm4gY2hhcHRlcnMgaW50byBzZWN0aW9ucywgZXRjLgorQGxvd2Vyc2VjdGlvbnMKK0BpbmNsdWRlIG1ha2Utc3Rkcy50ZXhpCitAcmFpc2VzZWN0aW9ucworCitAbm9kZSBSZWxlYXNlcworQHNlY3Rpb24gTWFraW5nIFJlbGVhc2VzCisKK1BhY2thZ2UgdGhlIGRpc3RyaWJ1dGlvbiBvZiBAY29kZXtGb28gdmVyc2lvbiA2OS45Nn0gdXAgaW4gYSBnemlwcGVkIHRhcgorZmlsZSB3aXRoIHRoZSBuYW1lIEBmaWxle2Zvby02OS45Ni50YXIuZ3p9LiAgSXQgc2hvdWxkIHVucGFjayBpbnRvIGEKK3N1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtmb28tNjkuOTZ9LgorCitCdWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgcHJvZ3JhbSBzaG91bGQgbmV2ZXIgbW9kaWZ5IGFueSBvZiB0aGUgZmlsZXMKK2NvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB0aGUgZmlsZXMgdGhhdCBmb3JtCitwYXJ0IG9mIHRoZSBwcm9ncmFtIGluIGFueSB3YXkgbXVzdCBiZSBjbGFzc2lmaWVkIGludG8gQGRmbntzb3VyY2UKK2ZpbGVzfSBhbmQgQGRmbntub24tc291cmNlIGZpbGVzfS4gIFNvdXJjZSBmaWxlcyBhcmUgd3JpdHRlbiBieSBodW1hbnMKK2FuZCBuZXZlciBjaGFuZ2VkIGF1dG9tYXRpY2FsbHk7IG5vbi1zb3VyY2UgZmlsZXMgYXJlIHByb2R1Y2VkIGZyb20KK3NvdXJjZSBmaWxlcyBieSBwcm9ncmFtcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgTWFrZWZpbGUuCisKK05hdHVyYWxseSwgYWxsIHRoZSBzb3VyY2UgZmlsZXMgbXVzdCBiZSBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgSXQgaXMgb2theQordG8gaW5jbHVkZSBub24tc291cmNlIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24sIHByb3ZpZGVkIHRoZXkgYXJlCit1cC10by1kYXRlIGFuZCBtYWNoaW5lLWluZGVwZW5kZW50LCBzbyB0aGF0IGJ1aWxkaW5nIHRoZSBkaXN0cmlidXRpb24KK25vcm1hbGx5IHdpbGwgbmV2ZXIgbW9kaWZ5IHRoZW0uICBXZSBjb21tb25seSBpbmNsdWRlIG5vbi1zb3VyY2UgZmlsZXMKK3Byb2R1Y2VkIGJ5IEJpc29uLCBAY29kZXtsZXh9LCBAVGVYe30sIGFuZCBAY29kZXttYWtlaW5mb307IHRoaXMgaGVscHMgYXZvaWQKK3VubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIG91ciBkaXN0cmlidXRpb25zLCBzbyB0aGF0IHVzZXJzIGNhbgoraW5zdGFsbCB3aGljaGV2ZXIgcGFja2FnZXMgdGhleSB3YW50IHRvIGluc3RhbGwuCisKK05vbi1zb3VyY2UgZmlsZXMgdGhhdCBtaWdodCBhY3R1YWxseSBiZSBtb2RpZmllZCBieSBidWlsZGluZyBhbmQKK2luc3RhbGxpbmcgdGhlIHByb2dyYW0gc2hvdWxkIEBzdHJvbmd7bmV2ZXJ9IGJlIGluY2x1ZGVkIGluIHRoZQorZGlzdHJpYnV0aW9uLiAgU28gaWYgeW91IGRvIGRpc3RyaWJ1dGUgbm9uLXNvdXJjZSBmaWxlcywgYWx3YXlzIG1ha2UKK3N1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZSB3aGVuIHlvdSBtYWtlIGEgbmV3IGRpc3RyaWJ1dGlvbi4KKworTWFrZSBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBkaXN0cmlidXRpb24gdW5wYWNrcyAoYXMKK3dlbGwgYXMgYW55IHN1YmRpcmVjdG9yaWVzKSBhcmUgYWxsIHdvcmxkLXdyaXRhYmxlIChvY3RhbCBtb2RlIDc3NykuCitUaGlzIGlzIHNvIHRoYXQgb2xkIHZlcnNpb25zIG9mIEBjb2Rle3Rhcn0gd2hpY2ggcHJlc2VydmUgdGhlCitvd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlcyBmcm9tIHRoZSB0YXIgYXJjaGl2ZSB3aWxsIGJlCithYmxlIHRvIGV4dHJhY3QgYWxsIHRoZSBmaWxlcyBldmVuIGlmIHRoZSB1c2VyIGlzIHVucHJpdmlsZWdlZC4KKworTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZSB3b3JsZC1yZWFkYWJsZS4KKworTWFrZSBzdXJlIHRoYXQgbm8gZmlsZSBuYW1lIGluIHRoZSBkaXN0cmlidXRpb24gaXMgbW9yZSB0aGFuIDE0CitjaGFyYWN0ZXJzIGxvbmcuICBMaWtld2lzZSwgbm8gZmlsZSBjcmVhdGVkIGJ5IGJ1aWxkaW5nIHRoZSBwcm9ncmFtCitzaG91bGQgaGF2ZSBhIG5hbWUgbG9uZ2VyIHRoYW4gMTQgY2hhcmFjdGVycy4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMKK3RoYXQgc29tZSBzeXN0ZW1zIGFkaGVyZSB0byBhIGZvb2xpc2ggaW50ZXJwcmV0YXRpb24gb2YgdGhlIFBPU0lYCitzdGFuZGFyZCwgYW5kIHJlZnVzZSB0byBvcGVuIGEgbG9uZ2VyIG5hbWUsIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgYXMKK3RoZXkgZGlkIGluIHRoZSBwYXN0LgorCitEb24ndCBpbmNsdWRlIGFueSBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGl0c2VsZi4gIElmIHRoZSB0YXIKK2ZpbGUgY29udGFpbnMgc3ltYm9saWMgbGlua3MsIHRoZW4gcGVvcGxlIGNhbm5vdCBldmVuIHVucGFjayBpdCBvbgorc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc3ltYm9saWMgbGlua3MuICBBbHNvLCBkb24ndCB1c2UgbXVsdGlwbGUKK25hbWVzIGZvciBvbmUgZmlsZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGJlY2F1c2UgY2VydGFpbiBmaWxlCitzeXN0ZW1zIGNhbm5vdCBoYW5kbGUgdGhpcyBhbmQgdGhhdCBwcmV2ZW50cyB1bnBhY2tpbmcgdGhlCitkaXN0cmlidXRpb24uCisKK1RyeSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGZpbGUgbmFtZXMgd2lsbCBiZSB1bmlxdWUgb24gTVMtRE9TLiAgQQorbmFtZSBvbiBNUy1ET1MgY29uc2lzdHMgb2YgdXAgdG8gOCBjaGFyYWN0ZXJzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKK3BlcmlvZCBhbmQgdXAgdG8gdGhyZWUgY2hhcmFjdGVycy4gIE1TLURPUyB3aWxsIHRydW5jYXRlIGV4dHJhCitjaGFyYWN0ZXJzIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgcGVyaW9kLiAgVGh1cywKK0BmaWxle2Zvb2JhcmhhY2tlci5jfSBhbmQgQGZpbGV7Zm9vYmFyaGFja2VyLm99IGFyZSBub3QgYW1iaWd1b3VzOyB0aGV5CithcmUgdHJ1bmNhdGVkIHRvIEBmaWxle2Zvb2JhcmhhLmN9IGFuZCBAZmlsZXtmb29iYXJoYS5vfSwgd2hpY2ggYXJlCitkaXN0aW5jdC4KKworSW5jbHVkZSBpbiB5b3VyIGRpc3RyaWJ1dGlvbiBhIGNvcHkgb2YgdGhlIEBmaWxle3RleGluZm8udGV4fSB5b3UgdXNlZAordG8gdGVzdCBwcmludCBhbnkgQGZpbGV7Ki50ZXhpbmZvfSBvciBAZmlsZXsqLnRleGl9IGZpbGVzLgorCitMaWtld2lzZSwgaWYgeW91ciBwcm9ncmFtIHVzZXMgc21hbGwgR05VIHNvZnR3YXJlIHBhY2thZ2VzIGxpa2UgcmVnZXgsCitnZXRvcHQsIG9ic3RhY2ssIG9yIHRlcm1jYXAsIGluY2x1ZGUgdGhlbSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZpbGUuCitMZWF2aW5nIHRoZW0gb3V0IHdvdWxkIG1ha2UgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlIGEgbGl0dGxlIHNtYWxsZXIgYXQKK3RoZSBleHBlbnNlIG9mIHBvc3NpYmxlIGluY29udmVuaWVuY2UgdG8gYSB1c2VyIHdobyBkb2Vzbid0IGtub3cgd2hhdAorb3RoZXIgZmlsZXMgdG8gZ2V0LgorCitAY29udGVudHMKKworQGJ5ZQorTG9jYWwgdmFyaWFibGVzOgordXBkYXRlLWRhdGUtbGVhZGluZy1yZWdleHA6ICJAYyBUaGlzIGRhdGUgaXMgYXV0b21hZ2ljYWxseSB1cGRhdGVkIHdoZW4geW91IHNhdmUgdGhpcyBmaWxlOlxuQHNldCBsYXN0dXBkYXRlICIKK3VwZGF0ZS1kYXRlLXRyYWlsaW5nLXJlZ2V4cDogIiIKK2V2YWw6IChsb2FkICIvZ2QvZ251b3JnL3VwZGF0ZS1kYXRlLmVsIikKK2V2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndXBkYXRlLWRhdGUpCitFbmQ6CmRpZmYgLS1naXQgYS9nYXMvQ09OVFJJQlVUT1JTIGIvZ2FzL0NPTlRSSUJVVE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZkMDNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL0NPTlRSSUJVVE9SUwpAQCAtMCwwICsxLDExMSBAQAorKFRoaXMgZmlsZSBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uKQkJCS0qLSB0ZXh0IC0qLQorCitJZiB5b3UndmUgY29udHJpYnV0ZWQgdG8gZ2FzIGFuZCB5b3VyIG5hbWUgaXNuJ3QgbGlzdGVkIGhlcmUsIGl0IGlzCitub3QgbWVhbnQgYXMgYSBzbGlnaHQuICBJIGp1c3QgZG9uJ3Qga25vdyBhYm91dCBpdC4gIEVtYWlsIG1lLAorcmFlYnVybkBjeWdudXMuY29tIGFuZCBJJ2xsIGNvcnJlY3QgdGhlIHNpdHVhdGlvbi4KKworVGhpcyBmaWxlIHdpbGwgZXZlbnR1YWxseSBiZSBkZWxldGVkOiBUaGUgZ2VuZXJhbCBpbmZvIHdpbGwgZ28gaW50bwordGhlIGRvY3VtZW50YXRpb24sIGFuZCBpbmZvIG9uIHNwZWNpZmljIGZpbGVzIHdpbGwgZ28gaW50byBhbiBBVVRIT1JTCitmaWxlLCBhcyByZXF1ZXN0ZWQgYnkgdGhlIEZTRi4KKworKysrKysrKysrKysrKysrKworCitEZWFuIEVsc25lciB3cm90ZSB0aGUgb3JpZ2luYWwgZ2FzIGZvciB2YXguICBbbW9yZSBkZXRhaWxzP10KKworSmF5IEZlbmxhc29uIG1haW50YWluZWQgZ2FzIGZvciBhIHdoaWxlLCBhZGRpbmcgc3VwcG9ydCBmb3IKK2dkYi1zcGVjaWZpYyBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgdGhlIDY4ayBzZXJpZXMgbWFjaGluZXMsIG1vc3Qgb2YKK3RoZSBwcmVwcm9jZXNzaW5nIHBhc3MsIGFuZCBleHRlbnNpdmUgY2hhbmdlcyBpbiBtZXNzYWdlcy5jLAoraW5wdXQtZmlsZS5jLCB3cml0ZS5jLgorCitLLiBSaWNoYXJkIFBpeGxleSBtYWludGFpbmVkIGdhcyBmb3IgYSB3aGlsZSwgYWRkaW5nIHZhcmlvdXMKK2VuaGFuY2VtZW50cyBhbmQgbWFueSBidWcgZml4ZXMsIGluY2x1ZGluZyBtZXJnaW5nIHN1cHBvcnQgZm9yIHNldmVyYWwKK3Byb2Nlc3NvcnMsIGJyZWFraW5nIGdhcyB1cCB0byBoYW5kbGUgbXVsdGlwbGUgb2JqZWN0IGZpbGUgZm9ybWF0CitiYWNrZW5kcyAoaW5jbHVkaW5nIGhlYXZ5IHJld3JpdGUsIHRlc3RpbmcsIGFuIGludGVncmF0aW9uIG9mIHRoZSBjb2ZmCithbmQgYi5vdXQgYmFja2VuZHMpLCBhZGRpbmcgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgaGVhdnkgdGVzdGluZyBhbmQKK3ZlcmlmaWNhdGlvbiBvZiBjcm9zcyBhc3NlbWJsZXJzIGFuZCBmaWxlIHNwbGl0cyBhbmQgcmVuYW1pbmcsCitjb252ZXJ0ZWQgZ2FzIHRvIHN0cmljdGx5IGFuc2kgQyBpbmNsdWRpbmcgZnVsbCBwcm90b3R5cGVzLCBhZGRlZAorc3VwcG9ydCBmb3IgbTY4MFszNF0wICYgY3B1MzIsIGNvbnNpZGVyYWJsZSB3b3JrIG9uIGk5NjAgaW5jbHVkaW5nIGEKK2NvZmYgcG9ydCAoaW5jbHVkaW5nIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIHJldmVyc2UgZW5naW5lZXJpbmcpLCBhCitzcGFyYyBvcGNvZGUgZmlsZSByZXdyaXRlLCBkZWNzdGF0aW9uLCByczYwMDAsIGFuZCBocDMwMGhwdXggaG9zdAorcG9ydHMsIHVwZGF0ZWQgImtub3ciIGFzc2VydGlvbnMgYW5kIG1hZGUgdGhlbSB3b3JrLCBtdWNoIG90aGVyCityZW9yZ2FuaXphdGlvbiwgY2xlYW51cCwgYW5kIGxpbnQuCisKK0tlbiBSYWVidXJuIGN1cnJlbnRseSBtYWludGFpbnMgZ2FzLCBhbmQgd3JvdGUgdGhlIGhpZ2gtbGV2ZWwgQkZECitpbnRlcmZhY2UgY29kZSB0byByZXBsYWNlIG1vc3Qgb2YgdGhlIGNvZGUgaW4gZm9ybWF0LXNwZWNpZmljIEkvTworbW9kdWxlcy4KKworVGhlIG9yaWdpbmFsIFZheC1WTVMgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgRGF2aWQgTC4gS2FzaHRhbi4KK0VyaWMgWW91bmdkYWxlIGFuZCBQYXQgUmFua2luIGhhdmUgZG9uZSBtdWNoIHdvcmsgd2l0aCBpdCBzaW5jZS4KKworVGhlIEludGVsIDgwMzg2IG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIHdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMuCisKK01pbmggVHJhbi1MZSBhdCBJbnRlbGxpQ29ycCBjb250cmlidXRlZCBzb21lIEFJWCAzODYgc3VwcG9ydC4KKworVGhlIE1vdG9yb2xhIDg4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyBjb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZgorQnVmZmFsbyBVbml2ZXJzaXR5IGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YKK0NvbXB1dGVyIFNjaWVuY2UuCisKK0tlaXRoIEtub3dsZXMgYXQgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiB3cm90ZSB0aGUgb3JpZ2luYWwgTUlQUworYmFjayBlbmQgKHRjLW1pcHMuYywgdGMtbWlwcy5oKSwgYW5kIGNvbnRyaWJ1dGVkIFJvc2UgZm9ybWF0IHN1cHBvcnQKK3RoYXQgaGFzbid0IGJlZW4gbWVyZ2VkIGluIHlldC4gIFJhbHBoIENhbXBiZWxsIHdvcmtlZCB3aXRoIHRoZSBNSVBTCitjb2RlIHRvIHN1cHBvcnQgYS5vdXQgZm9ybWF0LgorCitTdXBwb3J0IGZvciB0aGUgWmlsb2cgWjhrIGFuZCBIaXRhY2hpIEg4LzMwMCwgSDgvNTAwIGFuZCBTSCBwcm9jZXNzb3JzCisodGMtejhrLCB0Yy1oODMwMCwgdGMtaDg1MDAsIHRjLXNoKSwgYW5kIElFRUUgNjk1IG9iamVjdCBmaWxlIGZvcm1hdAorKG9iai1pZWVlKSwgd2FzIHdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFNvbHV0aW9ucy4KK1N0ZXZlIGFsc28gbW9kaWZpZWQgdGhlIENPRkYgYmFjayBlbmQgKG9iai1jb2ZmYmZkKSB0byB1c2UgQkZEIGZvcgorc29tZSBsb3ctbGV2ZWwgb3BlcmF0aW9ucywgZm9yIHVzZSB3aXRoIHRoZSBIaXRhY2hpLCAyOWsgYW5kIFppbG9nCit0YXJnZXRzLgorCitKb2huIEdpbG1vcmUgYnVpbHQgdGhlIEFNRCAyOTAwMCBzdXBwb3J0LCBhZGRlZCAuaW5jbHVkZSBzdXBwb3J0LCBhbmQKK3NpbXBsaWZpZWQgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygd2hpY2ggdmVyc2lvbnMgYWNjZXB0IHdoaWNoCitwc2V1ZG8tb3BzLiAgSGUgdXBkYXRlZCB0aGUgNjhrIG1hY2hpbmUgZGVzY3JpcHRpb24gc28gdGhhdCBNb3Rvcm9sYSdzCitvcGNvZGVzIGFsd2F5cyBwcm9kdWNlZCBmaXhlZC1zaXplIGluc3RydWN0aW9ucyAoZS5nLiBqc3IpLCB3aGlsZQorc3ludGhldGljIGluc3RydWN0aW9ucyByZW1haW5lZCBzaHJpbmthYmxlIChqYnNyKS4gIEpvaG4gZml4ZWQgbWFueQorYnVncywgaW5jbHVkaW5nIHRydWUgdGVzdGVkIGNyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBvbmUgYnVnIGluCityZWxheGF0aW9uIHRoYXQgdG9vayBhIHdlZWsgYW5kIHJlcXVpcmVkIHRoZSBwcm92ZXJiaWFsIG9uZS1iaXQgZml4LgorCitJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTb2x1dGlvbnMgbWVyZ2VkIHRoZSBNb3Rvcm9sYSBhbmQgTUlUCitzeW50YXhlcyBmb3IgdGhlIDY4aywgY29tcGxldGVkIHN1cHBvcnQgZm9yIHNvbWUgQ09GRiB0YXJnZXRzICg2OGssCitpMzg2IFNWUjMsIGFuZCBTQ08gVW5peCksIHdyb3RlIHRoZSBFQ09GRiBzdXBwb3J0IGJhc2VkIG9uIE1pY2hhZWwKK01laXNzbmVyJ3MgbWlwcy10ZmlsZSBwcm9ncmFtLCB3cm90ZSB0aGUgUG93ZXJQQyBhbmQgUlMvNjAwMCBzdXBwb3J0LAorYW5kIG1hZGUgYSBmZXcgb3RoZXIgbWlub3IgcGF0Y2hlcy4gIEhlIGhhbmRsZWQgdGhlIGJpbnV0aWxzIHJlbGVhc2VzCitmb3IgdmVyc2lvbnMgMi43IHRocm91Z2ggMi45LgorCitEYXZpZCBFZGVsc29obiBjb250cmlidXRlZCBmaXhlcyBmb3IgdGhlIFBvd2VyUEMgYW5kIEFJWCBzdXBwb3J0LgorCitTdGV2ZSBDaGFtYmVybGFpbiBtYWRlIGdhcyBhYmxlIHRvIGdlbmVyYXRlIGxpc3RpbmdzLgorCitTdXBwb3J0IGZvciB0aGUgSFA5MDAwLzMwMCB3YXMgY29udHJpYnV0ZWQgYnkgR2xlbm4gRW5nZWwgb2YgSFAuCisKK1N1cHBvcnQgZm9yIEVMRiBmb3JtYXQgZmlsZXMgaGFzIGJlZW4gd29ya2VkIG9uIGJ5IE1hcmsgRWljaGluIG9mCitDeWdudXMgU29sdXRpb25zIChvcmlnaW5hbCwgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiksIFBldGUKK0hvb2dlbmJvb20gYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCAoSFBQQSBtYWlubHkpLCBNaWNoYWVsIE1laXNzbmVyCitvZiB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIChpMzg2IG1haW5seSksIGFuZCBLZW4gUmFlYnVybiBvZgorQ3lnbnVzIFNvbHV0aW9ucyAoc3BhcmMsIGluaXRpYWwgNjQtYml0IHN1cHBvcnQpLgorCitTZXZlcmFsIGVuZ2luZWVycyBhdCBDeWdudXMgU29sdXRpb25zIGhhdmUgYWxzbyBwcm92aWRlZCBtYW55IHNtYWxsCitidWcgZml4ZXMgYW5kIGNvbmZpZ3VyYXRpb24gZW5oYW5jZW1lbnRzLgorCitUaGUgaW5pdGlhbCBBbHBoYSBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSBDYXJuZWdpZS1NZWxsb24KK1VuaXZlcnNpdHkuICBBZGRpdGlvbmFsIHdvcmsgd2FzIGRvbmUgYnkgS2VuIFJhZWJ1cm4gb2YgQ3lnbnVzCitTb2x1dGlvbnMuICBSaWNoYXJkIEhlbmRlcnNvbiB0aGVuIHJld3JvdGUgbXVjaCBvZiB0aGUgQWxwaGEgc3VwcG9ydC4KKworSWFuIERhbGwgdXBkYXRlZCB0aGUgc3VwcG9ydCBjb2RlIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMAorc2VyaWVzLCBhbmQgYWRkZWQgc3VwcG9ydCBmb3IgTWFjaCAzIGFuZCBOZXRCU0QgcnVubmluZyBvbiB0aGUgUEM1MzIuCisKK0tsYXVzIEthZW1wZiBwb3J0ZWQgdGhlIGFzc2VtYmxlciBhbmQgdGhlIGJpbnV0aWxzIHRvIG9wZW5WTVMvQWxwaGEuCisKK1N0ZXZlIEhhd29ydGggY29udHJpYnV0ZWQgdGhlIHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVjdGlvbiBjMzAKKyh0bXMzMjBjMzApLgorCitILkouIEx1IGhhcyBjb250cmlidXRlZCBtYW55IHBhdGNoZXMgYW5kIG11Y2ggdGVzdGluZy4KKworQWxhbiBNb2RyYSByZXdvcmtlZCBtdWNoIG9mIHRoZSBpMzg2IGJhY2tlbmQsIGltcHJvdmluZyB0aGUgZXJyb3IKK2NoZWNraW5nLCB1cGRhdGluZyB0aGUgY29kZSwgYW5kIGltcHJvdmluZyB0aGUgMTYgYml0IHN1cHBvcnQsIHVzaW5nCitwYXRjaGVzIGZyb20gdGhlIHdvcmsgb2YgTWFydHluYXMgS3VuaWdlbGlzIGFuZCBILkouIEx1LgorCitNYW55IG90aGVycyBoYXZlIGNvbnRyaWJ1dGVkIGxhcmdlIG9yIHNtYWxsIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMuICBJZgoreW91J3ZlIGNvbnRyaWJ1dGVkIHNpZ25pZmljYW50IHdvcmsgYW5kIGFyZSBub3QgbWVudGlvbmVkIG9uIHRoaXMgbGlzdCwgYW5kCit3YW50IHRvIGJlLCBsZXQgdXMga25vdy4gIFNvbWUgb2YgdGhlIGhpc3RvcnkgaGFzIGJlZW4gbG9zdDsgd2UgYXJlbid0CitpbnRlbnRpb25hbGx5IGxlYXZpbmcgYW55b25lIG91dC4KZGlmZiAtLWdpdCBhL2dhcy9DT1BZSU5HIGIvZ2FzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NDliZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2cgYi9nYXMvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmI2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMzE3MCBAQAorMTk5OS0wNC0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1jb3JlLmMgKG1jb3JlX3Nfc2VjdGlvbik6IER1bXAgbGl0ZXJhbHMgYmVmb3JlCisJY2hhbmdpbmcgc2VjdGlvbi4KKworMTk5OS0wNC0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBJbnNlcnQgcmVsb2MgYWRkZW5kIGludG8gaW5zbgorCWZvciBDT0ZGL1BFIHBvcnQuCisKK01vbiBBcHIgMjYgMTI6MzQ6MzcgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWZyMzAuaCAoVENfRklYX1RZUEUpOiBEZWxldGUsIGNnZW4gZmllbGRzIG1vdmVkIHRvIHdyaXRlLmguCisJKFRDX0lOSVRfRklYX0RBVEEpOiBEZWxldGUuCisJKiBjb25maWcvdGMtbTMyci5oIChUQ19GSVhfVFlQRSk6IERlbGV0ZSwgY2dlbiBmaWVsZHMgbW92ZWQgdG8gd3JpdGUuaC4KKwkoVENfSU5JVF9GSVhfREFUQSk6IERlbGV0ZS4KKwkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBOZXcgbWVtYmVyIGZ4X2NnZW4sIGlmZGVmIFVTSU5HX0NHRU4uCisJKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9jZ2VuIG1lbWJlci4KKwkqIGNnZW4uYyAoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwLGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBVcGRhdGUuCisJKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUuCisJKiBjb25maWcvdGMtbTMyci5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZS4KKwkobWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogVXBkYXRlLgorCShGWF9PUElORk9fUl9UWVBFKTogVXBkYXRlLgorCisJKiBmcmFncy5jIChmcmFnX3ZhcixmcmFnX3ZhcmlhbnQpOiBJbml0aWFsaXplIGZyX2NnZW4gaGVyZS4KKwkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KKwkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KKwkqIGZyYWdzLmggKHN0cnVjdCBmcmFnKTogTWFrZSBvcGluZGV4LCBvcGluZm8gaW50cy4KKworCSogY29uZmlnL3RjLWZyMzAuYyAoRlhfT1BJTkZPX1JfVFlQRSk6IERlbGV0ZSwgdW51c2VkLgorCisxOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KKworMTk5OS0wNC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWVkIGZ1bmN0aW9uIGZyb20KKwltZF9hcHBseV9maXguIAorCShtZF9hcHBseV9maXgzKTogRG8gbm90IGZpeCB1cCBhYnNvbHV0ZSByZWxvY2F0aW9ucyBhZ2FpbnN0CisJc3ltYm9saWMgdmFsdWVzLgorCisJKiBjb25maWcvdGMtbWNvcmUuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KKworMTk5OS0wNC0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBpbnRlcmNlcHRzIGZvciBzZWN0aW9uCisJY2hhbmdlcyBhbmQgZGF0YS1pbi10ZXh0IGRpcmVjdGl2ZXMuCisJKG1jb3JlX2NvbnMpOiBOZXcgZnVuY3Rpb246IGludGVyY2VwdCBjb25zKCkgb3BlcmF0aW9ucy4KKwkobWNvcmVfZmxvYXRfY29ucyk6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IGZsb2F0X2NvbnMoKQorCW9wZXJhdGlvbnMuIAorCShtY29yZV9zdHJpbmdlcik6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IHN0cmluZ2VyKCkgb3BlcmF0aW9ucy4KKworMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IENoYW5nZSBnZW5lcmF0ZV9hc21fbGluZW5vIGZpZWxkIHRvCisJdGFrZSBubyBwYXJhbWV0ZXJzLgorCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfR0VORVJBVEVfQVNNX0xJTkVOTyk6IERvbid0IGRlZmluZS4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGZpbmRfb3Bjb2RlX21hdGNoKTogQWRkIGRlZmF1bHQgY2FzZSB0bworCXN3aXRjaC4KKwkoZmluZF9tYWNyb19tYXRjaCk6IExpa2V3aXNlLgorCShsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgorCisJKiBjb25maWcvdGMtYWxwaGEuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lLgorCisxOTk5LTA0LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG92ZXJyaWRlcyBmb3IgLmJzcworCS50ZXh0IC5kYXRhIC5zZWN0aW9uIHBzZXVkbyBvcHMuCisJKG1jb3JlX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCisJKG1jb3JlX3NfdGV4dCk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCisJKG1jb3JlX3NfZGF0YSk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCisKKzE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzMyYml0bW9kZSk6IE5ldy4KKwkobWRfYmVnaW4pOiBTZXQgbWlwc18zMmJpdG1vZGUgaWYgbmVlZGVkLgorCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogRG9uJ3Qgc2V0IEVGX01JUFNfQVJDSC4KKwlTZXQgRUZfTUlQU18zMkJJVE1PREUuCisKK0ZyaSBBcHIgMTYgMTI6MjY6MzkgMTk5OSAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogRml4IHR5cG8gaW4gcHJldmlvdXMKKwljaGFuZ2UuCisKKzE5OTktMDQtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tY29yZS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KKworVGh1IEFwciAxNSAxNjo1MjowOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHRjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cmVzc2lvbik6IFRyeSB0byBoYW5kbGUgIjUgJXIzIiAKKwlleHByZXNzaW9ucyBjb3JyZWN0bHkuCisKKworMTk5OS0wNC0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUZfTUlQU19BUkNILgorCitNb24gQXByIDEyIDIzOjQ1OjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAgZm1weWZhZGQKKwlhbmQgZm1weW5mYWRkIGluc3RydWN0aW9ucy4KKworMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYXMuaCAoZW52aXJvbik6IERlY2xhcmUgaXQsIGlmIG5lZWRlZC4KKwkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KKwkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogQWNjZXB0IEBHT1QgcmVsb2NhdGlvbnMuCisJKGkzODZfZGlzcGxhY2VtZW50KTogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciByZXBsYWNlbWVudCBidWZmZXIuCisJQ2xlYW4gdXAgcmVwbGFjZW1lbnQgYnVmZmVyIGluaXRpYWxpemF0aW9uLgorCisxOTk5LTA0LTExICBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPjoKKworCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhIG5ldyBzeW1ib2wgaWYgb25lCisJYWxyZWFkeSBleGlzdHM7IGluc3RlYWQsIHVzZSB0aGUgZXhpc3Rpbmcgb25lLCBidXQgc2V0IGl0cyBzZWdtZW50CisJYW5kIGZyYWcgZGF0YSBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRlZmluZWQuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IExpa2V3aXNlLgorCitTYXQgQXByIDEwIDIwOjEwOjAyIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHRjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENhbGwgYXNfYmFkIGluc3RlYWQgb2YgYWJvcnQuCisKKzE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCByb3V0aW5lcyBmb3IgTUNvcmUKKwlhc3NlbWJsZXIuCisJKiBjb25maWcvdGMtbWNvcmUuaDogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBNQ29yZSBhc3NlbWJsZXIuIAorCSogY29uZmlnL29iai1jb2ZmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXQuCisKKwkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogZG9jL2FsbC50ZXhpOiBTZXQgTUNPUkUuCisJKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgTUNvcmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisJCisJKiB3cml0ZS5oOiBQcmV2ZW50IG11bHRpcGxlIGluY2x1c2lvbi4KKworMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIGFzaW50bC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KKwkqIGFzLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUgc3lzdGVtCisJZG9lcyBub3QgZGVmaW5lIGl0LgorCSogZ2FzcC5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlIHN5c3RlbQorCWRvZXMgbm90IGRlZmluZSBpdC4KKworCSogTWFrZWZpbGUuYW0gKG02OGstcGFyc2UuYyk6IElmIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UKKwlkaXJlY3RvcnksIGNvcHkgbTY4ay1wYXJzZS55IGludG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBiZWZvcmUKKwlydW5uaW5nIHlsd3JhcCwgdG8gcmVtb3ZlIHNwdXJpb3VzIGRpZmZlcmVuY2VzIHdoZW4gZ2VuZXJhdGluZworCXNuYXBzaG90cy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisJKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBKdXN0IGFsbG9jYXRlIHRoZSBudW1iZXIgb2YKKwlieXRlcyBuZWNlc3NhcnksIHJhdGhlciB0aGFuIGFsd2F5cyBhbGxvY2F0aW5nIDEwMjQuCisKKzE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCisJKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IEFkZCBjYXNlcyB0byBzd2l0Y2guICBSZWluZGVudC4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfc2NhbGUpOiBBZGQgcmV0dXJuIHZhbHVlLgorCShidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB0ZW1wX2Rpc3AyLgorCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHdhcm5pbmcuCisJKGkzODZfaW50ZWxfb3BlcmFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgZW5kX29mX29wZXJhbmRfc3RyaW5nLgorCShpMzg2X29wZXJhbmQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9wZXJhbmRfbW9kaWZpZXIuCisJKGkzODZfb3BlcmFuZCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KKworMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0OyBoYXZlIGl0IGRlZmluZQorCU1JUFNfU1RBQlNfRUxGLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisKKzE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZy90ZS1lcG9jLXBlLmg6IE5ldyBmaWxlLiAgRGVmaW5lIG1hY3JvcyBzcGVjaWZpYyB0bworCWFybS1lcG9jLXBlIHRhcmdldC4KKwkqIGNvbmZpZy90Yy1hcm0uaDogU2VsZWN0IGVwb2MtcGUtYXJtIHRhcmdldCBmb3JtYXQgaWYgY29uZmlndXJlZAorCWZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCisKK01vbiBNYXIgMjkgMTA6MTU6NDAgQ1NUIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisJKiB0Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6ICBBZGp1c3QgdmFsdWUgZm9yIGxpbmtvbmNlIHNlY3Rpb25zLgorCitXZWQgTWFyIDI0IDE0OjExOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IENsZWFuIHVwIGNvZGUgdG8KKwlkZXRlY3QgIixuIiB3aXRob3V0IGEgY29uZGl0aW9uLgorCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IExpa2V3aXNlLgorCisKK1R1ZSBNYXIgMjMgMTE6Mjg6MjMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd+Jyk6IFRoZSBjb25kaXRpb24gZm9yIGEgYnJhbmNoIG9uIGJpdAorCWluc3RydWN0aW9uIGlzIGVuY29kZWQgd2l0aCBvbmUgYml0LgorCisKKzE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogTWVudGlvbiB0aGF0CisJbGluZV9zZXBhcmF0b3JfY2hhcnMgc2hvdWxkIG5vdCBpbmNsdWRlIG5ld2xpbmUuICBGcm9tIHRoaQorCTx0dG5AbWluZ2xlLmdsdWcub3JnPi4KKworMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KKwkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2NwdV9vcGVuLgorCitTdW4gTWFyIDIxIDE4OjA4OjE4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHRjLWFscGhhLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgJzYnIGluIGFuIG9wY29kZS4KKworVGh1IE1hciAxOCAxMDo1NTozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2EnKTogRG8gbm90IGNhbGwgcGFfcGFyc2VfLi4uX2NtcHN1Yl9jbXBsdHIuCisKKworVGh1IE1hciAxOCAwMjozMDowNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2QnKTogRG8gbm90IGFsbG93ICIsbiIuCisJCisxOTk5LTAzLTE1ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogQ2hhbmdlICctJyBiYWNrIHRvIGEgc3ltYm9sIGNoYXIKKwlzbyB3ZSBjYW4gdXNlIG11bHRpcGxlIG9wY29kZXMgb24gYSBsaW5lIGFnYWluLgorCisJKiBjb25maWcvdGMtZDMwdi5jOiBCeSBkZWZhdWx0LCB3YXJuIGlmIGEgc3ltYm9sIGhhcworCXRoZSBzYW1lIG5hbWUgYXMgYSByZWdpc3Rlci4gIFBsdXMgc29tZSBtaW5vcgorCXVwZGF0ZXMgZnJvbSB0aGUgYnJhbmNoLgorCisxOTk5LTAzLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ184LAorCUJGRF9SRUxPQ18xNiBhbmQgQkZEX1JFTE9DXzY0LgorCisxOTk5LTAzLTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+CisKKwkqIGV4cHIuYyAoZXhwcik6IEFkZCBtaXNzaW5nIGVsc2UuCisKKzE5OTktMDMtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KKworMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQ1BVX1RZUEVTKTogQWRkIGZyMzAuCisJKGNnZW4ubyk6IEFkZCAkKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIGRlcGVuZGVuY3kuCisJKGZyMzAsbTMyciBkZXBlbmRlbmNpZXMpOiBVcGRhdGUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogY2dlbi5jIChnYXNfY2dlbl9yZWNvcmRfZml4dXApOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCisJKGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KKwkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBDYWxsIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtLgorCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogRGl0dG8uICBVcGRhdGUgY2FsbCB0byBzZXRfdm1hX29wZXJhbmQuCisJKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KKwkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCisJKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KKwkobWRfY29udmVydF9mcmFnKTogQ2FsbCBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bS4KKwkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCisJKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCisKKzE5OTktMDMtMDkgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCBtZXNzYWdlLgorCisxOTk5LTAzLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkb2MvYy1hcm0udGV4aSAoQVJNIFN5bnRheCk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKKwlhbmQgTERSIHJlZyw9PGV4cHI+IGluc3RydWN0aW9uLgorCisJKiBjb25maWcvdGMtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciAtbWNwdT1hcm04MTAsIC1tY3B1PWFybTkgYW5kCisJLW1jcHU9YXJtOXRkbWkuCisKK0ZyaSBGZWIgMTkgMDk6MzY6MzAgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkb2MvYy1hcm0udGV4aSAoQVJNLUNoYXJzKTogRml4IHR5cG8gaW4gdXNlIG9mICdAJy4KKworMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCVRoaXMgcGF0Y2ggd2FzIGNyZWF0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaAorCTxzY290dGJAY29yZWxjb21wdXRlci5jb20+CisJCisJKiBhcHAuYzogCisJICBTcGVjaWFsIGNhc2VkICdAJyBjaGFyYWN0ZXIuICBUaGUgJ0AnIGNoYXJhY3RlciBpcyB1c2VkIGFzIHRoZQorCSAgQVJNIGFzc2VtYmxlciBjb21tZW50IGNoYXJhY3RlciwgYXMgYSBzcGVjaWFsIGNoYXJhY3RlciAKKwkgIGFuZCBpbiBFTEYgLnN5bXZlciBwc2V1ZG8tb3AncywgYW5kIGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaW4KKwkgIC50eXBlIGFuZCAuc2VjdGlvbiBwc2V1ZG8tb3BzLgorCShzeW12ZXJfcHNldWRvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoc3ltdmVyX3N0YXRlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoc3RydWN0IGFwcF9zYXZlKTogQWRkIGZpZWxkICdzeW12ZXJfc3RhdGUnLgorCShhcHBfcHVzaCk6IFNhdmUgZ2xvYmFsIHN5bXZlcl9zdGF0ZSBpbnQgc3RydWN0IGFwcF9zYXZlLgorCShhcHBfcG9wKTogUmVzdG9yZSBnbG9iYWwgc3ltdmVyX3N0YXRlIGZyb20gc3RydWN0IGFwcF9zYXZlLgorICAJKGRvX3NjcnViX2NoYXJzKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mICdAJyBjaGFyYWN0ZXIgaW4KKwkuc3ltdmVyIHBzZXVkby1vcHMuIAorCisJKiBjb25maWd1cmUuaW46IE1vZGlmaWVkIHRvIHJlY29nbml6ZSBhcm12KiB1bmFtZSBzeW50YXggZnJvbSBBUk0KKwlMaW51eCBrZXJuZWwuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCQorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgJyUnIGFzIHdlbGwgYXMgJ0AnIGFzCisJYSBwcmVmaXggdG8gdGhlIHNlY3Rpb24ncyB0eXBlLgorCShvYmpfZWxmX3R5cGUpOiBBbGxvdyAnJScgYXMgd2VsbCBhcyAnQCcgYW5kICcjJyBhcyBwcmVmaXhlcyB0bworCXRoZSB0eXBlJ3MgdHlwZW5hbWUuCisKKwkqIGNvbmZpZy90Yy1hcm0uaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBnZW5lcmF0aW9uOgorCShwaWNfY29kZSk6IE5ldyBib29sZWFuLgorCShvYmpfcmVsb2NhdGVfZXh0ZXJuKTogRGVmaW5lLgorCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUKKwkoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgorCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KKwkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lLgorCQorCSogY29uZmlnL3RjLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgUElDIGdlbmVyYXRpb246CisJKGxpbmVfc2VwZXJhdG9yX2NoYXJzKTogQWxsb3cgJzsnIGFzIGEgc2VwZXJhdG9yIGZvciBMaW51eC4KKwkoaXNfaW1tZWRpYXRlX3ByZWZpeCk6IE5ldyBtYWNyby4KKwkoYXJtX3BhcnNlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgorCShzX2FybV9lbGZfY29ucyk6IE5ldyBmdW5jdGlvbi4KKwkoZG9fYnJhbmNoKTogU3BlY2lhbCBjYXNlIGZvciBCRkRfUkVMT0NfQVJNX1BMVDMyLgorCShtZF91bmRlZmluZWRfc3ltYm9sKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciB0aGUgR2xvYmFsIE9mZnNldAorCSAgVGFibGUncyBzeW1ib2wuCisJKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgUElDIHJlbG9jcy4KKwkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIFBJQyByZWxvY3MuCisJKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAnLWsnIGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8KKwkgIGVuYWJsZSBQSUMgZ2VuZXJhdGlvbi4KKwkoY29uc19maXhfbmV3X2FybSk6IE5ldyBmdW5jdGlvbi4KKwkoc19hcm1fZWxmX2NvbnMpOiBOZXcgZnVuY3Rpb24uCisKK1R1ZSBGZWIgMTYgMTY6MzE6NTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50cyBmb3IgdXNlcyBvZiBBQ19ERUZJTkUuCisJKiBhY2luY2x1ZGUubTQ6IExpa2V3aXNlLgorCSogYWNjb25maWcuaDogUmVtb3ZlLgorCSogYWNsb2NhbC5tNDogUmVidWlsZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCSogY29uZmlnLmluOiBSZWJ1aWxkLgorCisxOTk5LTAyLTE1ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcDogY2FzZSAnbycpOiBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgZm9yCisJbm9uLWNvbnN0YW50IG9mZnNldCBmcm9tIGEgYmFzZSByZWdpc3Rlci4KKworMTk5OS0wMi0xNCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQHJhZWJ1cm4ub3JnPgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSk6IFB1dCBcIGJlZm9yZSBuZXdsaW5lIGluCisJc3RyaW5ncyBhbHdheXMuCisKK1NhdCBGZWIgMTMgMTQ6MTA6MTAgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IEVuYWJsZSBFVjYgUEFMY29kZSB3aXRoIC1tMjEyNjQuCisJKGVtaXRfaW5zbik6IExvb2sgZm9yIHBjLXJlbGF0aXZlIGFuZCBuby1vdmVyZmxvdyBzcGVjaWZpZXJzIG9uCisJaW50ZXJuYWwgcmVsb2NhdGlvbiB0eXBlcy4KKworMTk5OS0wMi0xMyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBkb2MvYy1taXBzLnRleGkgKE1JUFMgT3B0cyk6IFVwZGF0ZWQgbGlzdCBvZiAtbU5OTk4gYW5kCisJLW1jcHU9Tk5OTiBmbGFncy4KKworCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIGFsbCB0aGUgbWlwc19OTk5OIHZhcmlhYmxlczsganVzdCB1c2UKKwltaXBzX2NwdSBpbnN0ZWFkLgorCShtaXBzXzQ2NTAsIG1pcHNfNDAxMCwgbWlwc180MTAwKTogVmFyaWFibGVzIHJlbW92ZWQuCisJKGhpbG9faW50ZXJsb2NrcywgZ3ByX2ludGVybG9ja3MsIGFwcGVuZF9pbnNuLCBtYWNyb19idWlsZCwgbWFjcm8sCisJbWFjcm8yLCBtaXBzMTZfbWFjcm8sIG1pcHNfaXApOiBUZXN0IG1pcHNfY3B1LCBub3QgdGhlIG1pcHNfTk5OTgorCXZhcmlhYmxlcy4KKwkobWRfYmVnaW4pOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIHRoZSBtaXBzX05OTk4gdmFyaWFibGVzOworCW1pcHNfY3B1IGlzIHNldCwgYW5kIHRoYXQncyBnb29kIGVub3VnaCBub3cuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhdmUgdGhlIC1tTk5OTiBvcHRpb25zIHNldCBtaXBzX2NwdSBpbnN0ZWFkIG9mCisJdGhlIG1pcHNfTk5OTiB2YXJpYWJsZS4gIFRoZSAtbm8tbU5OTk4gZmxhZ3MgYXJlIG5vdyBuby1vcHMuCisJKHNob3cpOiBOZXcgZnVuY3Rpb24sIHRvIGhhbmRsZSB3cmFwcGluZyBpbiB0aGUgQ1BVIGxpc3RzLgorCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIGxpc3RzIG9mIC1tY3B1IGFuZCAtbU5OTk4gc3dpdGNoZXMuCisKK1NhdCBGZWIgMTMgMDA6MTc6MjYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbnRlbF9vcGVyYW5kKTogSWdub3JlIGBTSE9SVCcgcmF0aGVyCisJdGhhbiB0cmVhdCBhcyBhbiBpbW1lZGlhdGUgc3BlY2lmaWVyLgorCitUaHUgRmViIDExIDE2OjE4OjMxIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmM6IFByb3RvdHlwZSBtYW55IGZ1bmN0aW9ucy4KKwkoc2V0X2ludGVsX3N5bnRheCk6IEFjY2VwdCBgcHJlZml4Jy9gbm9wcmVmaXgnIHNwZWNpZmllcnMuCisJKGkzODZfaW1tZWRpYXRlKTogUmVtb3ZlIHVudXNlZCBzZWNvbmQgYXJndW1lbnQuCisJKGkzODZfaW50ZWxfb3BlcmFuZCk6IEZpeCBpMzg2X2lzX3JlZyB0eXBvLgorCShpMzg2X29wZXJhbmQpOiBVc2UgYWxsb3dfbmFrZWRfcmVnLgorCShvdXRwdXRfaW52YWxpZCk6IE1ha2Ugb3BlcmFuZCBpbnQgZm9yIEsmUi4KKworVGh1IEZlYiAxMSAxMToyMTowMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFVuY29tbWVudC0tZml4ZWQgYnkgYXV0b21ha2UKKwlwYXRjaC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisxOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IENoYW5nZSBjZ2VuLW9wYy5oIHRvIGNnZW4tZGVzYy5oLgorCShjZ2VuLm8pOiBEaXR0by4KKwkoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBDb21tZW50IG91dC4KKwkoLnRjZGVwKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBSZWRvIHVzaW5nX2NnZW4gaGFuZGxpbmcuCisJRGVsZXRlIGNhbGwgdG8gQU1fQ1lHV0lOMzIuICBSZXBsYWNlIEFNX0VYRUVYVCB3aXRoIEFDX0VYRUVYVC4KKwkoQUNfT1VUUFVUKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCisJKiBjb25maWcuaW46IFJlYnVpbGQuCisJKiBjZ2VuLmM6IEluY2x1ZGUgY2dlbi1kZXNjLmgsIG5vdCBjZ2VuLW9wYy5oLgorCSgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCisJKGdhc19jZ2VuX2NwdV9kZXNjKTogUmVuYW1lZCBmcm9tIGdhc19jZ2VuX29wY29kZV9kZXNjLgorCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCisJQ0dFTl9PUEVSQU5EX0FUVFIgcmVuYW1lZCB0byBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRS4KKwkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwKTogUmVtb3ZlIHVubmVjZXNzYXJ5ICE9IDAgdGVzdC4KKwkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgorCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IERpdHRvLiAgUmVmZXIgdG8gb3BlcmFuZCB0YWJsZSB2aWEgY3B1CisJZGVzY3JpcHRvciwgbm90IGdsb2JhbCB2YXJpYWJsZS4KKwkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFJlZmVyIHRvIG9wZXJhbmRfdGFibGUgdmlhIGNwdQorCWRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgdmFyaWFibGUuICBSZWZlciB0byBpbnNlcnRfb3BlcmFuZCBoYW5kbGVyCisJdmlhIGNwdSBkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIGZ1bmN0aW9uLgorCSogY2dlbi5oICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCisJKiBjb25maWcvdGMtZnIzMC5jOiBJbmNsdWRlIG9wY29kZXMvZnIzMC1kZXNjLmguCisJKCopOiBnYXNfY2dlbl9vcGNvZGVfZGVzYyByZW5hbWVkIHRvIGdhc19jZ2VuX2NwdV9kZXNjLgorCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCisJVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9JTlNOX09QRVJBTkRTLgorCSogY29uZmlnL3RjLW0zMnIuYzogRGl0dG8uCisJKGFzc2VtYmxlX3R3b19pbnNucyk6IFVwZGF0ZSBjYWxscyB0byBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcy4KKwkobWRfYXNzZW1ibGUpOiBEaXR0by4KKwkobWRfY29udmVydF9mcmFnKTogVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX0VOVFJZLgorCisxOTk5LTAyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggaGFuZGxpbmcgb2YgbGFiZWwxIC0gbGFiZWwyCisJcmVsb2NhdGlvbnMgZm9yIEVMRiB0YXJnZXRzLgorCisxOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisxOTk5LTAyLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmg6IFRpZHkgT0JKX0VMRiBhbmQgT0JKX0NPRkYgZGVmaW5pdGlvbnMuCisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAorCWZvciBDT0ZGIHBvcnRzLgorCitXZWQgRmViICAzIDExOjM1OjQ3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgcGNhNTYgYW5kIGV2NiBvcHRpb25zLgorCitNb24gRmViICAxIDIwOjM3OjMwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL3RjLWkzODYuaCAoTE9OR19ET1VCTEVfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgorICAgICAgICAoSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgorICAgICAgICAoQllURV9QVFIpOiAgRGVmaW5lLgorICAgICAgICAoV09SRF9QVFIpOiAgRGVmaW5lLgorICAgICAgICAoRFdPUkRfUFRSKTogIERlZmluZS4KKyAgICAgICAgKFhXT1JEX1BUUik6ICBEZWZpbmUuCisgICAgICAgIChTSE9SVCk6ICBEZWZpbmUuCisgICAgICAgIChPRkZTRVRfRkxBVCk6ICBEZWZpbmUuCisgICAgICAgIChGTEFUKTogIERlZmluZS4KKyAgICAgICAgKE5PTkVfRk9VTkQpOiAgRGVmaW5lLgorICAgICAgICAoTm9fZFN1Zik6ICBEZWZpbmUuCisgICAgICAgIChOb194U3VmKTogIERlZmluZS4KKyAgICAgICAgKiBjb25maWcvdGMtaTM4Ni5jICAoc2V0X2ludGVsX3N5bnRheCk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGludGVsX3N5bnRheCk6ICBEZWNsYXJlLgorICAgICAgICAoYWxsb3dfbmFrZWRfcmVnKTogIERlY2xhcmUuCisgICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiAgU3VwcG9ydCAuaW50ZWxfc3ludGF4IGFuZCAuYXR0X3N5bnRheC4KKyAgICAgICAgKGludGVsX2Zsb2F0X29wZXJhbmQpOiAgTmV3IHJvdXRpbmUuCisgICAgICAgIChtZF9hc3NlbWJsZSk6ICBIYW5kbGUgSU5URUxfRFdPUkRfTU5FTV9TVUZGSVguCisgICAgICAgIEhhbmRsZSBicmFja2V0cyBhcyB3ZWxsIGFzIHBhcmVucy4gIENhbGwgaTM4Nl9pbnRlbF9vcGVyYW5kIGZvcgorICAgICAgICBpbnRlbCBzeW50YXguICBSZXZlcnNlIG9wZXJhbmRzIGlmIGFwcHJvcHJpYXRlLiAgSGFuZGxlIG5ldworICAgICAgICBzdWZmaXhlcy4gIEhhbmRsZSBtb3Z6eCBhbmQgbW92c3guCisgICAgICAgIChpMzg2X2lzX3JlZyk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGkzODZfaW1tZWRpYXRlKTogIE5ldyByb3V0aW5lLgorICAgICAgICAoaTM4Nl9zY2FsZSk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGkzODZfZGlzcGxhY2VtZW50KTogIE5ldyByb3V0aW5lLgorICAgICAgICAoaTM4Nl9vcGVyYW5kX21vZGlmaWVyKTogIE5ldyByb3V0aW5lLgorICAgICAgICAoYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGkzODZfcGFyc2Vfc2VnKTogIE5ldyByb3V0aW5lLgorICAgICAgICAoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGkzODZfaW50ZWxfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KKyAgICAgICAgKGkzODZfb3BlcmFuZCk6ICBDYWxsIGkzODZfZGlzcGxhY2VtZW50LCBpMzg2X2ltbWVkaWF0ZSwKKyAgICAgICAgaTM4Nl9zY2FsZSwgZXRjLiAgaW5zdGVhZCBvZiBoYW5kbGluZyBpbmxpbmUuCisgICAgICAgIChwYXJzZV9yZWdpc3Rlcik6ICBIYW5kbGUgcmVnaXN0ZXJzIHdpdGhvdXQgcHJlZml4LgorCitNb24gRmViICAxIDEyOjI0OjU4IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KKyAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgTmV3LgorICAgICAgICAodGh1bWItKi1vYWJpKTogIE5ldy4KKyAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKHRhcmdldF9vYWJpKTogIERlY2xhcmUuCisgICAgICAgIChtZF9hcHBseV9maXgzKTogU3VwcG9ydCBSRUwgcmVsb2NzLgorICAgICAgICAobWRfcGFyc2Vfb3B0aW9uKTogIEhhbmRsZSAtb2FiaS4KKyAgICAgICAgKGVsZjMyX2FybV90YXJnZXRfZm9ybWF0KTogIE5ldyByb3V0aW5lLgorICAgICAgICAobWRfbG9uZ29wdHMpOiAgQWRkIE9QVElPTl9PQUJJLgorICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIFJlZGVmaW5lIFRBUkdFVF9GT1JNQVQuCisKKworMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSGFuZGxlIG91dCBvZiByYW5nZSBlcnJvci4KKworCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMF9mb3JjZV9yZWxvY2F0aW9uKTogRGVmYXVsdCB0byAwLgorCisJKiBjb25maWcvdGMtZnIzMC5oIChvYmpfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCisJKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCisKKwkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IERvIG5vdCBhcHBseSBmaXhlcyB0byBWVEFCTEUKKwlyZWxvY3MuIAorCisxOTk5LTAxLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRG8gbm90IGdlbmVyYXRlIGEgc2VxdWVudGlhbAorCW1lcmdlIG9mIHR3byBpbnN0cnVjdGlvbnMgaWYgdGhlIGxlZnQgaW5zdHJ1Y2l0b24ga2lsbHMgdGhlIHJpZ2h0LgorCisxOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlLmluOiBSZWRvIHRlc3QgZm9yIHVzaW5nIGNnZW4uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzE5OTktMDEtMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYWRqdXN0X3N5bXRhYik6IFByZXZlbnQgYWNjaWRlbnRhbAorCXJlZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvLgorCitUdWUgSmFuICA1IDIxOjU4OjAzIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlKTogRGlzYWJsZSAiVW5tYXRjaGVkICVoaSByZWxvYyIKKwl3YXJuaW5nLgorCisxOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBGb3IgbWlwczE2LCBpbnNlcnQgYSBub3AgYmV0d2VlbgorCWEgcmVhZCBvZiBISSBvciBMTyBhbmQgYW4gaW1tZWRpYXRseSBmb2xsb3dpbmcgYnJhbmNoLgorCisxOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBBbm90aGVyIGNvcnJlY3Rpb24gdG8gdGhlIHNldHRpbmcgb2YKKwltaXBzX2VhYmk2NC4KKworMTk5OC0xMi0yMyAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ29ycmVjdCB0eXBlLW8gaW4gc2V0dGluZyBvZiBtaXBzX2VhYmk2NC4KKworMTk5OC0xMi0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGEgTk9QIGFmdGVyIGEgcmVsYXhhYmxlIDE2CisJYml0IGluc24gd2hlbiBvcHRpbWl6aW5nLCBzbyB0aGF0IHBhcmFsbGVsaXNlZCBpbnN0cnVjdGlvbnMgd2lsbAorCXN0YXJ0IG9uIGEgMzIgYml0IGJvdW5kYXJ5LgorCisxOTk4LTEyLTE5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lYWJpNjQpOiBOZXcuCisJKG1kX2JlZ2luKTogU2V0IG1pcHNfZWFiaTY0LgorCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogVXNlIGl0LgorCisxOTk4LTEyLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IAorCUNvcnJlY3Qgc2V0dGluZyBvZiBBQkkgaW4gZV9mbGFncy4KKworV2VkIERlYyAxNiAxNjoxNzoyMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2Fzc2VtYmxlKTogV2FybiBhYm91dCBpbnZhbGlkIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90cy4KKworMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luLG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuCisJCisxOTk4LTEyLTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IE1hcmsgYXMgYW4gZXJyb3IsIHJhdGhlciB0aGFuIGEKKwl3YXJuaW5nLCB2YWx1ZXMgdGhhdCBkb24ndCBmaXQgaW4gdGhlIGZpZWxkLgorCisxOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19hYmlfc3RyaW5nKTogTmV3LgorCShtZF9wYXJzZV9vcHRpb24sbWRfbG9uZ29wdHMpOiBBZGQgbWFiaS4KKwkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBlX2ZsYWdzIGJhc2VkIG9uIG1hYmkgZmxhZy4KKworMTk5OC0xMi0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuIAorCis5OC0xMi0xMSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IENoYW5nZSBtZXNzYWdlIGdpdmVuIGlmIHRoZQorCWluc3RydWN0aW9uIHJlcXVpcmVzIEg4LzMwMEggbW9kZSBhbmQgd2UncmUgbm90IGluIEhtb2RlLCB0bworCXN1Z2dlc3QgdGhhdCBpdCBtYXkgYmUgdGhlIG9wZXJhbmQgbW9kZXMgdGhhdCBhcmUgdGhlIHByb2JsZW0sIG5vdAorCW5lY2Vzc2FyaWx5IHRoZSBvcGNvZGUuCisKKzE5OTgtMTItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1mcjMwLmM6IEFkZCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisKK1R1ZSBEZWMgIDggMTk6NTE6NTAgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGhwcGEtKi1tcGVpeCopOiBOZXcgdGFyZ2V0LgorCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb21waWxlcik6IERlY2xhcmUuCisJKiBjb25maWcvb2JqLXNvbS5jIChjb21waWxlcl9zZWVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkob2JqX3NvbV9jb21waWxlcik6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSB0Y19kYXRhIHVzZXMgZm9yIGNoYW5nZSB0byBiZmQvc29tLmguCisgCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImNvbXBpbGVyIiBpZiBPQkpfU09NLgorCShwYV90eXBlX2FyZ3MpOiBTZXQgaHBwYV9wcml2X2xldmVsLgorCShwYV9jb21waWxlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYgT0JKX1NPTS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIERlYyAgOCAxNTowMDo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAob3V0cHV0X2xlYjEyOCk6IERvbid0IG1hcmsgYXMgaW5saW5lLgorCisxOTk4LTEyLTA4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3ZieXRlKTogUHJvdG90eXBlIGFuZCBuZXcgZnVuY3Rpb24gZm9yIAorCUFJWCAudmJ5dGUgdW5hbGlnbmVkIGRhdGEgc3VwcG9ydC4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkICd2Ynl0ZScgdG8gbGlzdCBvZiB2YWxpZCBwc2V1ZG9zLgorCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCBlaF9mcmFtZSB0byBsaXN0IG9mIEVMRiByZWxvY2F0YWJsZSAKKwlzZWN0aW9ucy4KKworMTk5OC0xMi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUsIGRvX2Fzc2VtYmxlKTogSW1wcm92ZSBlcnJvbmVvdXMKKwlpbnB1dCBoYW5kbGluZy4gCisKK01vbiBEZWMgIDcgMDk6NDg6MzQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGVsZjMyX2FybV9mb3JjZV9yZWxvY2F0aW9uKTogIENoZWNrIGZvcgorICAgICAgICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSC4KKworU3VuIERlYyAgNiAxMjo0NjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU197QklHLExJVFRMRX1fRU5ESUFOIGFmdGVyCisJY2hlY2tpbmcgdGhlIHRhcmdldCB0eXBlLgorCShtaXBzLWRlYy1ic2QqKTogU2V0IGVuZGlhbiB0byBsaXR0bGUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0CisJPHNub3diYWxsM0B1c2EubmV0PjoKKwkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX1dFQUspOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCisJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG9ial9jb2ZmX2VuZGVmKSBbYm90aCB2ZXJzaW9uc106IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCisJKGNvZmZfZnJvYl9zeW1ib2wpOiBMaWtld2lzZS4KKwkoeWFua19zeW1ib2xzKTogTGlrZXdpc2UuCisJKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgorCisJKiBjb25maWd1cmUuaW4gKG02OGstKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50CisJPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCisJKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGVtaXRfbGRncCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSByYXRoZXIgdGhhbgorCWFuIGFzc2VydGlvbiBmYWlsdXJlIGZvciBhIGNhc2Ugd2UgY2FuJ3QgaGFuZGxlIHdoZW4gT0JKX0VDT0ZGLgorCisJKiBleHByLmMgKG9wZXJhdG9yKTogQW5kIHdpdGggMHhmZiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNpZ25lZAorCWNoYXIuCisKKzE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogR2VuZXJhdGUKKwlCRkRfUkVMT0NfRlIzMF80OCBpbnN0ZWFkIG9mIEJGRF9SRUxPQ19GUjMwXzMyLgorCisxOTk4LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IEVuYWJsZSByZWxvY3MgZm9yCisJTERJOjIwIGluc24uCisKK1RodSBOb3YgMjYgMTE6MjM6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZnIzMC5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZXN0b3JlIHByZXZpb3VzIGNhbGN1bGF0aW9uCisJb2YgcGNyZWwgcG9pbnQuCisKK1R1ZSBOb3YgMjQgMTc6MjE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWZyMzAuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRml4IGNhbGN1bGF0aW9uIG9mCisJcGNyZWwgcG9pbnQuCisKK1R1ZSBOb3YgMjQgMTQ6NTQ6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN0YXRpYyAnZXR5cGUnIGhhdmUgZmlsZQorCXNjb3BlLgorCShkMTB2X2NsZWFudXApOiBPbmx5IGdlbmVyYXRlIHByZXZpb3VzIGluc24gaWYgYSBtdWx0aWxpbmUgaW5zbiBpcworCW5vdCBwZW5kaW5nLgorCitGcmkgTm92IDIwIDExOjQxOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogQWRkIHN1cHBvcnQgZm9yCisJRlIzMF9PUEVSQU5EX0kzMi4gCisKK1RodSBOb3YgMTkgMTU6MDE6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1hcm03eHh4IGFuZAorCS1tYXJtNnh4eCBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCisKKzE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKERFUCk6IFVzZSAkKHNyY2RpcikvLi4vbWtkZXAuCisJKGl0Ymwtb3BzLm8pOiBEZWxldGUgZHVwbGljYXRlIGRlcGVuZGVuY2llcy4KKwlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwlBZGQgZnIzMCBkZXBlbmRlbmNpZXMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVHVlIE5vdiAxNyAxMzo0Mjo0MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0CisJb3Bjb2RlIGxpc3QuCisJKiBsaXN0aW5nLmM6IElnbm9yZSBsaW5lIHRlcm1pbmF0b3IgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUKKwlzdHJpbmdzLiAKKworVGh1IE5vdiAxMiAxOToyMToyNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIHBvL2dhcy5wb3Q6IFJlZ2VuZXJhdGVkLgorCitUaHUgTm92IDEyIDEwOjU0OjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfaXNfY29sb25faW5zbik6IE5ldyBuYW1lIGZvcgorCWZyMzBfaXNfbGFiZWxfc3RhcnQoKS4gIEFsc28gY2hlY2tzIGZvciBkZWxheSBzbG90IGluc25zLgorCisJKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2lzX2xhYmVsX3N0YXJ0KTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUKKwlGUjMwIGluc3RydWN0aW9ucyB3aGljaCBjb250YWluIGEgY29sb24gaW4gdGhlIG1uZW1vbmljLgorCisJKiBjb25maWcvdGMtZnIzMC5oIChUQ19TVEFSVF9MQUJFTCk6IERlZmluZSB0aGlzIG1hY3JvLgorCitXZWQgTm92IDExIDA5OjU4OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1mcjMwLmM6IFJlbW92ZWQgY3VycmVudGx5IHN1cGVyZmxvdXMgY29kZS4KKworVHVlIE5vdiAxMCAxMzoxMzowNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZnIzMC5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy90Yy1mcjMwLmM6IFR3ZWFraW5nIHNvIHRoYXQgaXQgd2lsbCBjb21waWxlLgorCitUdWUgTm92IDEwIDE0OjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL3RjLWQxMHYuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KKyAgICAgICAgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiAgRGVmaW5lLgorICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCisgICAgICAgICogY29uZmlnL3RjLWQxMHYuYyAodGNfZ2VuX3JlbG9jKTogIEhhbmRsZSBWdGFibGUgcmVsb2NzLgorICAgICAgICAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgVnRhYmxlIHJlbG9jcy4KKyAgICAgICAgKGQxMHZfZml4X2FkanVzdGFibGUpOiAgTmV3LgorICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIE5ldy4KKworTW9uIE5vdiAgOSAxNDoyNTowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jOiBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgdG8gaWdub3JlIHBvdGVudGlhbAorCWNvbmZsaWN0cyBiZXR3ZWVuIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lcy4KKworV2VkIE5vdiAgNCAxODo0MjowMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGZyMzAtKi0qLgorCSogY29uZmlnL3RjLWZyMzAuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCisJKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIGRvYy9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCisJKiBwby9nYXMucG90OiBSZWdlbmVyYXRlZC4KKworTW9uIE5vdiAgMiAyMDo1NDoxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV90d29faW5zbnMpOiBFbnN1cmUgYm90aCBpbnNucworCWFyZSAxNiBiaXQgaW5zbnMuCisKK01vbiBOb3YgIDIgMjA6MTA6MTggMTk5OCAgTWFydGluIHZvbiBMb2V3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+CisKKwkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFNldCBjaGFyYWN0ZXJzIGFib3ZlIDEyNyB0byBiZSBzeW1ib2wKKwljaGFyYWN0ZXJzLgorCShkb19zY3J1Yl9jaGFycyk6IEFkZCBzb21lIGNhc3RzIHRvIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQKKwl1bndhbnRlZCBzaWduIGV4dGVuc2lvbi4KKwkqIHJlYWQuYyAobGV4X3R5cGUpOiBTZXQgY2hhcmFjdGVycyBhYm91dCAxMjcgdG8gYmUgc3ltYm9sCisJY2hhcmFjdGVycy4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogU2V0IGlkZW50aWZpZXJfY2hhcnMgYW5kCisJb3BlcmFuZF9jaGFycyBmb3IgdmFsdWVzIGFib3ZlIDEyNy4KKworTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgorICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQorCitUdWUgT2N0IDI3IDEzOjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYzogQWRkIHN1cHBvcnQgZm9yIHByb2R1Y2luZyBhIGxpc3RpbmcgZnJvbSBwaXBlZAorCWlucHV0LiAKKworVHVlIE9jdCAyNyAwODo1Njo0NCAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogUmVtb3ZlIG1pcHNfMzkwMC4KKwkoYXBwZW5kX2luc24pOiBBY2NvdW50IGZvciB0aGUgdHgzOSdzIG11bHRpcGx5IGJlaGF2aW9yLgorCisxOTk4LTEwLTI2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW0zMnIuYyAoYXNzZW1ibGVfdHdvX2luc25zKTogUmVuYW1lIGFzc2VtYmxlX3R3b19pbnNucworCWZyb20gYXNzZW1ibGVfcGFyYWxsZWxfaW5zbnMuICBBZGQgc3VwcG9ydCBmb3IgJy0+JyB0byBpbmRpY2F0ZQorCWV4cGxpY2l0bHkgc2VyaWFsaXppbmcgdGhlIGluc3RydWN0aW9ucy4KKwkobWRfYXNzZW1ibGUpOiBEaXR0by4KKworU2F0IE9jdCAyNCAxNToxMjoxOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZy90Yy1zaC5jIChzaF9maXhfYWRqdXN0YWJsZSk6ICBBZGp1c3QgRVhURVJOIGFuZAorICAgICAgICBXRUFLIGhhbmRsaW5nLgorCitUaHUgT2N0IDIyIDEyOjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIFJldmVydCBsYXN0IGNoYW5nZS4KKworVGh1IE9jdCAyMiAxMDowMzoxNSAxOTk4ICBSb24gVW5yYXUgIDxydW5yYXVAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyA6IHN1cHBvcnQgZnJhbWUgYW5kIHJlZ21hc2svZnJlZ21hc2sgd2hlbgorCSAgTUlQU19TVEFCU19FTEYgaXMgc3BlY2lmaWVkLgorCitXZWQgT2N0IDIxIDExOzM0OjUxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE9ubHkgaW5jbHVkZSBpZiBPQkpfRUxGLgorICAgICAgICAobWRfYXBwbHlfZml4KTogIERvbid0IHJldHVybiAxIGZvciBWVEFCTEUgcmVsb2NzLgorICAgICAgICAqIGNvbmZpZy90Yy1zaC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lIG9ubHkgaWYgT0JKX0VMRi4KKworVHVlIE9jdCAyMCAxMToxODoyOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGRvYy9jLWkzODYudGV4aTogUmVwbGFjZSBvY2N1cmVuY2VzIG9mICJvcGNvZGUiIHdpdGgKKwkiaW5zdHJ1Y3Rpb24gbW5lbW9uaWMiLCAiaW5zdHJ1Y3Rpb24iLCBvciAibW5lbW9uaWMiIHdoZW4KKwlyZWZlcnJpbmcgdG8gdGhlIG5hbWUgb2YgYW4gaW5zdHJ1Y3Rpb24uICBVc2UgIm9wY29kZSIgd2hlbgorCXJlZmVycmluZyB0byB0aGUgc2VxdWVuY2Ugb2YgbWFjaGluZSBieXRlcy4KKworCSogY29uZmlnL3RjLWkzODYuYyAob3Bjb2RlX2NoYXJzKTogUmVuYW1lIHRvIG1uZW1vbmljX2NoYXJzLgorCShpc19vcGNvZGVfY2hhcik6IFJlbmFtZSB0byBpc19tbmVtb25pY19jaGFyLgorCShtZF9hc3NlbWJsZSBhbmQgaTM4Nl9vcGVyYW5kKTogQ29ycmVjdCBlcnJvciBtZXNzYWdlcyBmcm9tCisgICAgICAgICJvcGNvZGUiIHRvICJpbnN0cnVjdGlvbiBtbmVtb25pYyIKKwlSZW5hbWUgdGhyb3VnaG91dCBvcGNvZGVbXSAtPiBtbmVtb25pY1tdLCBvcHAgLT4gbW5lbV9wLAorCU1BWF9PUENPREVfU0laRSAtPiBNQVhfTU5FTV9TSVpFLAorCURXT1JEX09QQ09ERV9TVUZGSVggLT4gRFdPUkRfTU5FTV9TVUZGSVgsCisJV09SRF9PUENPREVfU1VGRklYIC0+IFdPUkRfTU5FTV9TVUZGSVgsCisJQllURV9PUENPREVfU1VGRklYIC0+IEJZVEVfTU5FTV9TVUZGSVgsCisJU0hPUlRfT1BDT0RFX1NVRkZJWCAtPiBTSE9SVF9NTkVNX1NVRkZJWAorCUxPTkdfT1BDT0RFX1NVRkZJWCAtPiBMT05HX01ORU1fU1VGRklYCisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKCpfTU5FTV9TVUZGSVgpOiBSZW5hbWUgZnJvbSAqX09QQ09ERV9TVUZGSVguCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoZWNrIGZvciBnYXJiYWdlIGFmdGVyCisJcmVnaXN0ZXIgbmFtZS4KKworVHVlIE9jdCAyMCAxMDo0OTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgUENSRUwgcmVsb2MKKyAJZm9yIEJGRF9BU1NFTUJMRVIgdG8gb25seSBjaGFuZ2UgdmFsdWUgd2hlbiBDT0ZGIGlmIFRFX1BFLgorCitNb24gT2N0IDE5IDIwOjIwOjQyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL3RjLXNoLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCisgICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUIHJlbG9jcy4KKyAgICAgICAgKG1kX2FwcGx5X2ZpeCk6ICBMaWtld2lzZS4KKyAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBMaWtld2lzZS4KKyAgICAgICAgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KKworTW9uIE9jdCAxOSAxMjozNTo0MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5jIChnYXNfY2dlbl9maW5pc2hfaW5zbik6IFVwZGF0ZSBoYW5kbGluZyBvZiBDR0VOX0lOVF9JTlNOX1AuCisJKiBjZ2VuLmggKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogVXBkYXRlIHByb3RvdHlwZS4KKwkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfaW5zbik6IENHRU5fSU5UX0lOU04gLT4gQ0dFTl9JTlRfSU5TTl9QLgorCWNnZW5faW5zbl90IC0+IENHRU5fSU5TTl9JTlQuCisJKG1ha2VfcGFyYWxsZWwpOiBVcGRhdGUgaGFuZGxpbmcgb2YgQ0dFTl9JTlRfSU5TTl9QLgorCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogRGl0dG8uCisJKHRhcmdldF9tYWtlX3BhcmFsbGVsKTogTmV3IGZ1bmN0aW9uLgorCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KKworTW9uIE9jdCAxOSAxMzoxNjoxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZm9yY2VfcmVsb2NhdGlvbik6ICBGaXggdHlwby4KKworU3VuIE9jdCAxOCAxODo0ODo1NyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgZW50aXJlIG9wY29kZSBpcworCWNvbnZlcnRlZCBpbnRvIGxvd2VyIGNhc2UuCisKK0ZyaSBPY3QgMTYgMTM6MzY6MzQgQ0RUIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgorICAgICAgICAoZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jKTogIExpa2V3aXNlLgorICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCisgICAgICAgICogY29uZmlnL3RjLW0zMnIuYyAobTMycl9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCisgICAgICAgIChtMzJyX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCisKK1dlZCBPY3QgMTQgMTE6MzM6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLmx0b3JuIGRpcmVjdGl2ZS4KKworTW9uIE9jdCAxMiAxMTowNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQ29udmVydCBzZWNvbmQgb3Bjb2RlCisJdG8gbG93ZXIgY2FzZSBiZWZvcmUgcGFyc2luZy4KKworCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBJZ25vcmUgY29uZmxpY3RzIHdoZW4gZXhwbGljaXRseQorCXBhcmFsbGVsIGluc25zIG1vZGlmdCBidXRzIGluIHRoZSBQU1cgYXMgYSBzaWRlIGVmZmVjdC4KKworVGh1IE9jdCAgOCAxMDoxODozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IFRlc3QgZm9yIG1pc3NpbmcgZmxhZyBhbmQKKwljb250cm9sIHJlZ2lzdGVycy4KKwkKKwkobWRfYXBwbHlfZml4Myk6IEZpeCBlcnJvciBtZXNzYWdlcyB0byBhdm9pZAorCWFzc3VtcHRpb24gYWJvdXQgcHJlc2VuY2Ugb2YgYSBzeW1ib2wuCisKKwkocGFyYWxsZWxfb2spOiBEaXNhbGxvdyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgdGhhdCBib3RoIG1vZGlmeSB0aGUKKwlzYW1lIGZsYWcgcmVnaXN0ZXIuCisKKwkoZmluZF9mb3JtYXQpOiBHZW5lcmF0ZSBhIHdhcm5pbmcgaWYgYW4gb2RkIG51bWJlcmVkIHJlZ2lzdGVyIGlzCisJdXNlZCBhcyB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gYSBtdXRsaS1yZWdpc3RlciBpbnN0cnVjdGlvbi4KKworV2VkIE9jdCAgNyAxNDowOToxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRG8gbm90IGFzc3VtZSB0aGF0IGJhZAorCXJlbG9jYXRpb25zIGFyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgorCitUdWUgT2N0ICA2IDA5OjMxOjE1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogdGMtc3BhcmMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCisgICAgICAgIChlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCisgICAgICAgICogdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KKyAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KKyAgICAgICAgKGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgorCitNb24gT2N0ICA1IDA5OjI1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWduc3UuY29tPgorCisgICAgICAgICogc3ltYm9scy5jIChTX0lTX0ZVTkNUSU9OKTogIE5ldy4KKyAgICAgICAgKiBjb25maWcvdGMtdjg1MC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgorICAgICAgICAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCisgICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KKyAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jICh0Y19nZW5fcmVsb2MpOiAgVXNlIG9mZnNldCBpbnN0ZWFkCisgICAgICAgIG9mIGZ4X2FkZG51bWJlciBmb3IgVlRBQkxFIHJlbG9jIGFkZGVuZHMuCisgICAgICAgIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgorICAgICAgICAodjg1MF9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCisgICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgorCitNb24gT2N0ICA1IDAwOjQ4OjUyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdGMtaHBwYS5jIChmcF9vcGVyYW5kX2Zvcm1hdCk6IEFkZCBzb21lIGFkZGl0aW9uYWwgZm9ybWF0cy4KKwkocGFfaXApOiBEbyBub3QgYXV0b21hdGljYWxseSBwcm9tb3RlIGludG8gcGEyLjAgbW9kZS4KKwkocGFfbGV2ZWwpOiBIYW5kbGUgIi5sZXZlbCAyLjAiLgorCitTdW4gT2N0ICA0IDIwOjU3OjQzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgQU1EXzNETk9XX09QQ09ERS4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKHRlbXBsYXRlLmV4dGVuc2lvbl9vcGNvZGUpOiBDaGFuZ2UgdG8KKyAgICAgICAgdW5zaWduZWQgaW50IHRvIGFsbG93IGZ1bGwgcmFuZ2Ugb2YgOC1iaXQgb3Bjb2RlIHN1ZmZpeGVzLgorCShOb25lKTogUmVkZWZpbmUgYXMgMHhmZmZmLgorCisJRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KKwkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1TSU1EKTogTmV3IHNlY3Rpb24uCisKK1RodSBPY3QgIDEgMTU6Mzc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChkaXNjYXJkX3Jlc3Rfb2ZfbGluZSk6IE5ldyBmdW5jdGlvbi4KKwkqIHJlYWQuaDogRGVjbGFyZSBpdC4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBVc2UgaXQuCisKK1RodSBPY3QgIDEgMTA6MzM6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCisJKGZpbmRfb3Bjb2RlKTogQ29wZSB3aXRoIHRoZSBjYXNlIHdoZXJlIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzCisJYSBzeW1ib2wgbmFtZS4KKworV2VkIFNlcCAzMCAxMDo1MjozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogUmVuYW1lIHRvCisJdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24uCisJKHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uKTogRG8gbm90IHJlc29sdmVzIHN5bWJvbHMgaW4gb3RoZXIKKwlzZWN0aW9ucy4gCisKKwkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IERlZmluZS4KKworTW9uIFNlcCAyOCAxMTowMToyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGEgcmVnaXN0ZXIKKwlpcyBzdXBwbGllZCBmb3IgYW4gb3BlcmFuZCB0aGF0IHNob3VsZCBub3QgYmUgYSByZWdpc3Rlci4KKworRnJpIFNlcCAyNSAxMDowNDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogQnV0IGRvIGFsbG93IGRlbGF5ZWQgYnJhbmNoCisJaW5zdHJ1Y3Rpb25zIHRvIGhhdmUgYW5vdGhlciBpbnN0cnVjdGlvbiBpbiB0aGUgcmlnaHQgYmluLgorCitUaHUgU2VwIDI0IDA5OjI4OjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEbyBub3QgYWxsb3cgaW5zdHJ1Y3Rpb25zIGluCisJdGhlIHJpZ2h0IGNvbnRhaW5lciBpZiB0aGUgbGVmdCBjb250YWluZXIgaG9sZHMgYSBicmFuY2gKKwlpbnN0cnVjdGlvbi4gCisKK1dlZCBTZXAgMjMgMTA6NTQ6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQzMHYuYyAocmVnX25hbWVfc2VhcmNoKTogT25seSB3YXJuIGlmIGEgbmFtZSBtYXRjaGVzCisJYm90aCBhIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lLgorCShmaW5kX2Zvcm1hdCk6IEFsbG93IGNvcnJlY3QgcGFyc2luZyBvZiBNVlRTWVMgYW5kIE1WRlNZUyBpbnNucy4KKworVHVlIFNlcCAyMiAxNzo0OToxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogSW1wbGVtZW50IEVJVEhFUl9CVVRfUFJFRkVSX01VCisJZXhlY3V0aW9uIHVuaXQgY2xhc3MuCisKKwkocmVnX25hbWVfc2VhcmNoKTogSWYgYSBuYW1lIG1hdGNoZXMgYSByZWdpc3RlciBhbmQgYSBzeW1ib2wsCisJcHJlZmVyIHRoZSByZWdpc3Rlci4KKwkoZmluZF9mb3JtYXQpOiBEaXNhbGxvdyBmbGFnIHJlZ2lzdGVycyB3aGVuIGEgZ2VuZXJhbCBwdXJwb3NlCisJcmVnaXN0ZXIgaXMgcmVxdWlyZWQuCisJSWYgYSBudW1iZXIgaXMgcmVxdWlyZWQsIGJ1dCBhIHJlZ2lzdGVyIGhhcyBiZWVuIGdpdmVuLCBjaGVjayB0bworCXNlZSBpZiBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGV4aXN0cywgYW5kIGlmCisJc28sIHVzZSB0aGF0IHN5bWJvbC4KKworVHVlIFNlcCAyMiAxNjo0MDo1MiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORyk6IEFkZCBtaXNzaW5nIHBhcmVucy4KKworVHVlIFNlcCAyMiAxNTo0NDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IERvIG5vdCBhY2NlcHQgZmxhZyByZWdpc3RlcnMgYXMKKwlnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgorCShmaW5kX2Zvcm1hdCk6IElmIGFuIGltbWVkaWF0ZSB2YWx1ZSBpcyBleHBlY3RlZCBhdCBhIGdpdmVuIHBsYWNlCisJaW4gYSBmb3JtYXQsIGJ1dCBhIHJlZ2lzdGVyIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQgaW5zdGVhZCwgY2hlY2sKKwl0byBzZWUgaWYgdGhhdCByZWdpc3RlciBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkCisJc3ltYm9sIGFuZCBpZiBpdCBkb2VzLCB0aGVuIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuCisJKHJlZ19uYW1lX3NlYXJjaCk6IElmIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzIGEgc3ltYm9sIG5hbWUsCisJcHJlZmVyIHRoZSByZWdpc3RlciBuYW1lIHRvIHRoZSBzeW1ib2wgbmFtZS4KKworTW9uIFNlcCAyMSAxMDo0Mjo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogQWZ0ZXIgaW5zZXJ0aW5nIE5PUHMsIHJlc2V0CisJdGhlIHByZXZpb3VzIGluc24gdG8gZW1wdHkuCisKKzE5OTgtMDktMjAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYnJlYWsgc3RyaW5nIGludG8gdHdvCisJcGllY2VzLCBmb3JjaW5nIHRoZSB1c2Ugb2YgYW4gQU5TSSBjb21waWxlci4KKworU3VuIFNlcCAyMCAwMDo1ODoxMiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlnL3RjLW02OGsuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IE5ldyBtYWNyby4gIEZvcmNlIHZ0YWJsZQorCXJlbG9jcy4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRG8gbm90aGluZyBmb3IgdnRhYmxlIHJlbG9jcy4KKworVHVlIFNlcCAxNSAwODo1MTowNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKyAKKyAgICAgICAgKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogIEhhbmRsZSBhcm0KKyAgICAgICAgYXNzZW1ibGVyIHN5bnRheC4KKyAgICAgICAgKG9ial9lbGZfdnRhYmxlX2VudHJ5KTogIExpa2V3aXNlLgorICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGZvciBPQkpfRUxGLgorICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBWVEFCTEUgcmVsb2NhdGlvbnMuCisgICAgICAgICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KKyAgICAgICAgKGFybV9maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgorICAgICAgICAoZWxmMzJfYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCisgICAgICAgIChhcm1lbGZfZnJvYl9zeW1ib2wpOiAgUmVtb3ZlIGNvZmYtc3R5bGUgc3ltYm9sIHN1cHBvcnQuCisKK1dlZCBTZXAgIDkgMTE6Mjc6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRml4IHR5cG8gaW4gbGFzdCBwYXRjaC4KKworVHVlIFNlcCAgOCAxODoxMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKyAKKyAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogIE1vdmUgI2lmZGVmCisgICAgICAgIE9CSl9DT0ZGIHNvIHRoYXQgcm91dGluZSBpcyBkZWZpbmVkIGZvciBhLm91dCBmb3JtYXQuCisKK1R1ZSBTZXAgIDggMTU6NTY6MTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRGV0ZWN0IG5vbi1zZWdtZW50IHJlZ2lzdGVycworCXVzZWQgYXMgc2VnbWVudCBwcmVmaXhlcy4KKworU2F0IFNlcCAgNSAxOTowMDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVob3B0LmMgKGNoZWNrX2VoX2ZyYW1lKTogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIEZERSwgYW5kIGRvbid0CisJb3B0aW1pemUgYWNyb3NzIEZERSBib3VuZGFyaWVzLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IFByZXNlcnZlIGFueSBsaW5rIG9uY2UKKwlmbGFncyB3aGVuIHNldHRpbmcgdGhlIHNlY3Rpb24gZmxhZ3MuCisKK0ZyaSBTZXAgIDQgMTc6MDc6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5oIChvYmpfYWRqdXN0X3N5bXRhYik6IEZpeGVkIHR5cG8uCisJKiBjb25maWcvdGMtYXJtLmMgKGFybWVsZl9hZGp1c3Rfc3ltdGFiKTogUmVmb3JtYXR0ZWQuCisKK0ZyaSBTZXAgIDQgMTM6NTc6NDMgMTk5OCAgSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jej4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3NpZ25lZF9yYW5nZSk6IFNpZ24gZXh0ZW5kIDMyLWJpdCB3b3JkcworCXRvIHRoZSBob3N0IHdpZHRoLgorCitXZWQgU2VwICAyIDExOjMxOjE0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IEluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgc3RydWN0IGluIHRoZQorCW9ic3RhY2sgY2h1bmsgc2l6ZS4KKworCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBBZGp1c3QgdGhlIHNlZ2luZm8gZnJjaGFpbiBzdGFydAorCWlmIHRoZSBuZXcgc3Vic2VnIGNvbWVzIGJlZm9yZSB0aGUgb2xkLgorCitUdWUgU2VwICAxIDE1OjAxOjMzIDE5OTggIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3o+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFsbCBkaWdpdHMgaW4gYW4gaW5zdHJ1Y3Rpb24KKwl0byBoYW5kbGUgZWRnZTggYW5kIGVkZ2UxNi4KKworTW9uIEF1ZyAzMSAwOTo1MToxNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogUHJpbnQgZXJyb3IgbWVzc2FnZQorCWJlZm9yZSB3ZSBjbG9iYmVyIHRoZSBzeW1ib2wgaW52b2x2ZWQuCisKK01vbiBBdWcgMzEgMTA6NTg6MDYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWcvdGMtYXJtLmM6ICBSZW1vdmUgT0JKX0VMRiBkZWZpbml0aW9ucyBmb3IgCisgICAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgYW5kIFNfU0VUX1NUT1JBR0VfQ0xBU1MuICBPbmx5CisgICAgICAgIHVzZSBhcm1fYWRqdXN0X3N5bXRhYiBmb3IgT0JKX0NPRkYuCisgICAgICAgIChhcm1lbGZfYWRqdXN0X3N5bXRhYik6ICBOZXcgUm91dGluZS4KKyAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBEZWZpbmUgb2JqX2FkanVzdF9zeW10YWIgdG8KKyAgICAgICAgYXJtZWxmX2FkanVzdF9zeW10YWIgZm9yIE9CSl9FTEYuCisgICAgICAgIAorU2F0IEF1ZyAyOSAyMjoxODo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IE1ha2UgYWxsIGkzODYtZWxmIHRhcmdldHMgdXNlIGJmZF9nYXMuCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCisJKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBmaXggdnRhYmxlIHJlbG9jcy4KKwkobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgorCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgdGhlbS4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBBbHdheXMgZGVmaW5lLCBjYWxsaW5nCisJdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uLgorCitNb24gQXVnIDI0IDEzOjQwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfc2hvd191c2FnZSk6IEltcHJvdmUgZm9ybWF0dGluZyBvZiAtLWhlbHAgb3V0cHV0LgorCitGcmkgQXVnIDIxIDE4OjQzOjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogQ29weSBwcmV2aW91cyBvcGNvZGUgb3ZlcgorCWN1cnJlbnQgb3Bjb2RlIGFmdGVyIHdyaXRpbmcgdGhlIGZpcnN0IGluc3R1cmN0aW9uIG9mIGEgcmV2ZXJzZQorCXNlcXVlbnRpYWwgcGFpci4gCisJCitGcmkgQXVnIDIxIDA3OjMwOjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJlYWQuaCAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogQWRkIHByb3RvdHlwZS4KKwkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTWFrZSBub24tc3RhdGljLgorCitUaHUgQXVnIDIwIDIzOjE3OjA0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBPbmx5IHdhcm4gZm9yIGFkZHJlc3MvZGF0YSBzaXplCisJcHJlZml4ZXMuCisKK1RodSBBdWcgMjAgMTQ6NDU6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBEbyBub3QgYWRqdXN0IHJlbG9jYXRpb25zCisJYWdhaW5zdCBUaHVtYiBmdW5jdGlvbiBuYW1lcywgYXMgdGhlIGxpbmtlciBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLgorCisxOTk4LTA4LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KKworCSogZXhwci5jIChvcGVyYW5kKTogQ2hlY2sgYWxzbyB0aGF0IHRoZXJlIGlzIG5vIGFkdmFuY2UgaW4gb3BlcmFuZAorCWFmdGVyIGF0b2ZfZ2VuZXJpYyBpbiBvcmRlciB0byBkZWNpZGUgImlzIGl0IGxhYmVsIDBmIG9yIGZsb2F0aW5nCisJcG9pbnQgbnVtYmVyPyIuCisKK1dlZCBBdWcgMTkgMDk6MzA6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW0zMnIuYzogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggdG8gTTMyUiBzcGVjaWZpYworCWNvbW1hbmQgbGluZSBvcHRpb25zIHdpdGggYSBzaW5nbGUgZGFzaC4KKwkqIGRvYy9jLW0zMnIudGV4aTogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggd2l0aCBhIHNpbmdsZSBkYXNoLgorCitUdWUgQXVnIDE4IDExOjU5OjQzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgKiB0Yy1hcm0uaDogRGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZSBmb3IgT0JKX0VMRi4KKyAgICAgICAqIHRjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBOZXcgcm91dGluZS4KKworMTk5OC0wOC0xMyAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAoc19hbGlnbiwgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCwgc19zcGFjZSwKKwlzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCwgY29uc193b3JrZXIpOiBNb3ZlIGlnbm9yZV9yZXN0X29mX2xpbmUgb3IKKwlkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lIGJlZm9yZSBtcmlfY29tbWVudF9lbmQuCisJKGVxdWFscyk6IENoZWNrIGdhcmJhZ2UgYWZ0ZXIgZXhwcmVzc2lvbiBiZWZvcmUKKwltcmlfY29tbWVudF9lbmQgaW4gTVJJIG1vZGUuCisKK1RodSBBdWcgMTMgMTU6MDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgTV9TR0VfSS9NX1NHRVVJX0kgY2FzZSBmb3IgYQorCXNtYWxsIGltbWVkaWF0ZSBjb25zdGFudCB0byB1c2UgdGhlIGNvbnN0YW50IGl0c2VsZiByYXRoZXIgdGhhbgorCWFsd2F5cyB1c2luZyAxLgorCitXZWQgQXVnIDEyIDE4OjQ3OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZW50ZXIpOiBDYWxsIGFzX2JhZCByYXRoZXIgdGhhbiBhYm9ydC4KKwkocGFfbGVhdmUpOiBMaWtld2lzZS4KKworV2VkIEF1ZyAxMiAxMzoyNTowMyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBhIHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lCisJcHJlZml4ZXMuCisJKGkzODZfb3BlcmFuZCk6IEZpeCBhbiBlcnJvciBtZXNzYWdlLgorCitUdWUgQXVnIDExIDE0OjQ0OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGRvYy9jLWFybS50ZXhpIChBUk0gRGlyZWN0aXZlcyk6IERvY3VtZW50IC5yZXEgZGlyZWN0aXZlLgorCisJKiBjb25maWcvdGMtYXJtLmMgKHJlZ19yZXF1aXJlZF9oZXJlKTogRGlzcGxheSBlcnJvbmVvdXMgc3RyaW5nIGlmCisJdGhlIHJlZ2lzdGVyIG5hbWUgY291bGQgbm90IGJlIGRlY29kZWQuCisJRG8gbm90IHNldCBpbnN0Lmluc3RydWN0aW9uIGlmIHRoZSBzaWZ0IGlzIC0xLgorCitNb24gQXVnIDEwIDE1OjM5OjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBCaWFzIFdFQUsgc3ltYm9scyBqdXN0IGFzCisJd2UgZG8gZm9yIEVYVEVSTi4KKworTW9uIEF1ZyAxMCAxNTowNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQWx3YXlzIHBlcmZvcm0gYWxpZ25tZW50IHJlcXVlc3QsCisJZXZlbiBpZiBpdCBpcyBiZWxpdmVkIHRvIGJlIHVubmVjZXNzYXJ5LgorCitNb24gQXVnIDEwIDE3OjQ4OjA5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCWNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IFNpemUgaW1tZWRpYXRlIGNvbnN0YW50cyBieQorCXN1ZmZpeCAoZXJyb25lb3VzbHkgcmVtb3ZlZCBhcyBwYXJ0IG9mIEp1bHkgNyBjaGFuZ2UpLgorCitTdW4gQXVnICA5IDIwOjQ1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL29iai1lbGYuaDogIENoZWNrIGZvciByZWRlZmluaXRpb24gb2Ygb2JqX2Zyb2Jfc3ltYm9sLgorICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYzogIERlZmluZSBTX0dFVF9TVE9SQUdFX0NMQVNTIGFuZCBTX1NFVF9TVE9SQUdFX0NMQVNTLgorICAgICAgICAoYXJtZWxmX2Zyb2Jfc3ltYm9sKTogIE5ldyBSb3V0aW5lLgorICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBvYmpfZnJvYl9zeW1ib2wgaWYgT0JKX0VMRi4KKworU2F0IEF1ZyAgOCAxNToyMToyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3Qgd2VhayBzeW1zLgorCitXZWQgQXVnICA1IDE1OjU0OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBTZXQgQkZEIHByaXZhdGUgZmxhZ3MgZGVwZW5kaW5nIHVwb24KKwljb21tYW5kIGxpbmUgc3dpdGNoZXMgcGFzc2VkIHRvIGFzc2VtYmxlci4KKworTW9uIEF1ZyAgMyAxNDowMjo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5oIChHQVNfQ0dFTl9NQVhfRklYVVBTKTogR0FTXyBwcmVwZW5kZWQsIGFsbCB1c2VzIHVwZGF0ZWQuCisJKGdhc19jZ2VuX29wY29kZV9kZXNjKTogRGVjbGFyZS4KKwkoZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk6IERlY2xhcmUuCisJKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgorCUFsbCB1c2VzIHVwZGF0ZWQuCisJKiBjZ2VuLmMgKGdhc19jZ2VuX29wY29kZV9kZXNjKTogTmV3IGdsb2JhbAorCShnYXNfY2dlbl9pbml0X3BhcnNlKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX2luaXRfcGFyc2UuCisJKHF1ZXVlX2ZpeHVwKTogUmVuYW1lZCBmcm9tIGNnZW5fcXVldWVfZml4dXAuCisJKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgorCUFsbCB1c2VzIHVwZGF0ZWQuCisJKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KKwkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fZmluaXNoX2luc24uCisJKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCisJT3BlbiBvcGNvZGUgdGFibGUgYW5kIGluaXRpYWxpemUgaXQuCisJKG1ha2VfcGFyYWxsZWwpOiBVc2UgZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MuCisJKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBEaXR0by4gIFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCisJKG1kX2Fzc2VtYmxlKTogRGl0dG8uCisKK1NhdCBBdWcgIDEgMTk6Mjc6MzAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYXMuaCAoZGVidWdfaW5mb190eXBlKTogQWRkIGVudHJpZXMgZm9yIHVuc3BlY2lmaWVkIGFuZCBkd2FyZiouCisJKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVGFrZSBubyBhcmd1bWVudHM7IGNhbGwKKwlhc193aGVyZSBvdXJzZWx2ZXMuICBQcm92aWRlIGEgc3R1YiBmb3IgIUVDT0ZGX0RFQlVHR0lORy4KKwkqIGVjb2ZmLmg6IE1vdmUgRUNPRkZfREVCVUdHSU5HIHByb3RlY3Rpb24gaW5zaWRlIEdBU19FQ09GRl9ILgorCU1vdmUgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyBvdXRzaWRlIEVDT0ZGX0RFQlVHR0lORyBwcm90ZWN0aW9uLgorCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBUaWR5IEVDT0ZGIGJpdHMuICBVc2UKKwlERUJVR19VTlNQRUNJRklFRCByYXRoZXIgdGhhbiBERUJVR19OT05FIGZvciBpbml0aWFsIHRlc3QuCisJKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpIFtUQ19BTFBIQV06IERlZmluZSB0byBhIHZhcmlhYmxlLgorCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQ29uZGl0aW9uYWxpemUgb24gdmFsdWUgb2YgRUNPRkZfREVCVUdHSU5HLgorCShJTklUX1NUQUJfU0VDVElPTik6IExpa2V3aXNlLgorCShPQkpfUFJPQ0VTU19TVEFCKTogTGlrZXdpc2UuCisJCisJKiBjb25maWcvdGMtYWxwaGEuYyAobWRfbG9uZ29wdHMpOiBOZXcgb3B0aW9ucyAtbWRlYnVnLy1uby1tZGVidWcuCisJKG1kX3BhcnNlX29wdGlvbik6IFdhdGNoIGZvciB0aGVtLgorCShhbHBoYV9jdXJfZW50X3N5bSwgYWxwaGFfZmxhZ19tZGVidWcpOiBOZXcgdmFyaWFibGVzLgorCShtZF9iZWdpbik6IEtpbGwgbmV2ZXJkZWYgY29kZS4KKwkoc19hbHBoYV9lbnQsIHNfYWxwaGFfZW5kLCBzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBOZXcuCisJKHNfYWxwaGFfcHJvbG9ndWUpOiBXYXRjaCBhbHBoYV9jdXJfZW50X3N5bS4KKwkoc19hbHBoYV9jb2ZmX3dyYXBwZXIpOiBOZXcuCisJKG1kX3BzZXVkb190YWJsZSk6IFRyYXAgYWxsIEVDT0ZGIHBzZXVkb3MuCisJCitGcmkgSnVsIDMxIDE2OjQ1OjU0IDE5OTggIFJvbiBVbnJhdSA8cnVucmF1QGN5Z251cy5jb20+CisKKwlTdGFydCBvZiBjaGFuZ2VzIHRvIHJlbW92ZSBtZGVidWcgc2VjdGlvbiBmcm9tIG1pcHMqLWVsZgorCUJhc2VkIG9uIE1JUFNfU1RBQl9FTEYgZGVmaW5pdGlvbgorCSogYWNjb25maWcuaDogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKKwkqIGNvbmZpZy5pbjogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKKwkqIGNvbmZpZy9taXBzLWVsZi5oOiBvbmx5IHNldCBFQ09GRiBkZWJ1Z2dpbmcgaWYgbm90IHN0YWJzLWluLWVsZgorCSogY29uZmlnL3RjLW1pcHMuYyAoc19lbnQpOiBzZXQgQlNGX0ZVTkNUSU9OCisJKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IGZsdXNoIGZyYWcKKworRnJpIEp1bCAzMSAxNjoxNDo0NSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogKGFybS0qLWVsZik6ICBIYW5kbGUuCisgICAgICAgICh0aHVtYi0qLWVsZik6IEhhbmRsZS4KKyAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgorICAgICAgICAqIHJlYWQuYyAoc3RyaW5nZXIpOiBGaXggdHlwbyBpbiBjb21tZW50LgorICAgICAgICAqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgorICAgICAgICBUQ19BUk0gYW5kIE9CSl9FTEYuCisgICAgICAgICogY29uZmlnL3RjLWFybS5jIChtZF9zZWN0aW9uX2FsaWduKTogIERvbid0IGFsaWduIGR3YXJmIGRlYnVnCisgICAgICAgIHNlY3Rpb25zLgorICAgICAgICAodGNfZ2VuX3JlbG9jKTogIEFsd2F5cyBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0byBmaXhwLT5meF9vZmZzZXQKKyAgICAgICAgZm9yIE9CSl9FTEYuCisKK1RodSBKdWwgMzAgMjE6Mzg6NDMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQzMHYuYyAoe2N1cixwcmV2fV9sZWZ0X2tpbGxzX3JpZ2h0X3ApOiBOZXcgdmFyaWFibGVzLgorCSh3cml0ZV8yX3Nob3J0KTogRW1pdCB3YXJuaW5nIGlmIG5ldyBmbGFnIGlzIHNldC4KKwkoZG9fYXNzZW1ibGUpOiBTZXQgZmxhZ3MgaWYgbGVmdCBpbnN0cnVjdGlvbiBpcyBvbmUgb2Ygc3BlY2lhbAorCSJyaWdodC1pbnN0cnVjdGlvbi1raWxsZXIiIHR5cGUuCisKK1R1ZSBKdW4gMjggMTg6MTI6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+CisJCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfbnVtYmVyX3RvX2NoYXJzLCBjb25zX2ZpeF9uZXdfc3BhcmMpOgorCUFsd2F5cyBvdXRwdXQgd29yZHMgaW4gZGVidWdfaW5mbyBzZWN0aW9uIGFzIGJpZyBlbmRpYW4uCisJKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBDaG9vc2UgY29ycmVjdCBiZmQgdGFyZ2V0LgorCShtZF9hcHBseV9maXgzKTogUmVuYW1lIEJGRF9SRUxPQ19TUEFSQ18zMkxFIHRvIEJGRF9SRUxPQ19TUEFSQ19SRVYzMi4KKwkKK1R1ZSBKdWwgMjggMTE6MDE6MjEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEZpeCAiZXJybXNnIiBpbml0aWFsaXphdGlvbgorCXRvIHdvcmsgd2l0aCBpbnRlcm5hdGlvbmFsaXphdGlvbiBjb2RlLiAgSXNzdWUgYW4gZXJyb3Igd2hlbiB0d28KKwlvcGVyYW5kcyBtYXRjaCB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBtYXRjaC4KKworTW9uIEp1bCAyNyAxNjoyNTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGluc3RhbGxfdG9vbGRpcik6IEFsbG93IHRhcmdldCB0byBzcGVjaWZ5IHdoZXRoZXIKKwlpdCB3YW50cyB0byBiZSBpbnN0YWxsZWQgaW4gJCh0b29sZGlyKS9iaW4uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogU2V0IGluc3RhbGwtZXhlYy10b29sZGlyCisJZGVwZW5kZW5jeSB2aWEgY29uZmlndXJlLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKK0ZyaSBKdWwgMjQgMTk6NTg6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IFNwbGl0IGludG8gdHdvIC4uLgorCShpbnN0YWxsLWV4ZWMtYmluZGlyLGluc3RhbGwtZXhlYy10b29sZGlyKTogTmV3IHJ1bGVzLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKK0ZyaSBKdWwgMjQgMTY6MzE6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQorCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKKwlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitGcmkgSnVsIDI0IDA5OjEzOjQ2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkoY2dlbl9tZF9hcHBseV9maXgzKTogVXBkYXRlIGNhbGwgdG8gbWRfY2dlbl9sb29rdXBfcmVsb2MuCisJKGNnZW5fdGNfZ2VuX3JlbG9jKTogVXNlIHhtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCisJKiBjZ2VuLmggKGNnZW5fbWRfYXBwbHlfZml4MyxjZ2VuX3RjX2dlbl9yZWxvYyk6IERlY2xhcmUuCisJKG1kX2NnZW5fbG9va3VwX3JlbG9jKSk6IERlY2xhcmUuCisJKG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlY2xhcmUuCisJKiBjb25maWcvdGMtbTMyci5oIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBEZWNsYXJlLgorCShtMzJyX3JlbGF4X2ZyYWcpOiBEZWNsYXJlLgorCShjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEZWNscyBtb3ZlZCB0byBjZ2VuLmguCisJKGNnZW5fcmVjb3JkX2ZpeHVwX2V4cCxjZ2VuX3RjX2dlbl9yZWxvYyk6IERpdHRvLgorCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlbGV0ZSBkZWNsLgorCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9jcHVfZGVzYyk6ICNpZiAwIG91dC4KKwkoYXNzZW1ibGVfbm9wKTogRGVsZXRlLgorCShleHBhbmRfZGVidWdfc3ltcyk6IERlbGV0ZSB1bnVzZWQgYGV4cCcuCisJKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogUmVuYW1lZCBmcm9tIENHRU5fU1lNIChsb29rdXBfcmVsb2MpLgorCUFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgorCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IEFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgorCShtZF9hdG9mKTogRGVsZXRlIHVudXNlZCB3b3JkUC4KKworVGh1IEp1bCAyMyAxMzoxOTo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlICJlcnJtc2ciIGhhcyBhIG5vbi1OVUxMCisJdmFsdWUuCisKK1dlZCBKdWwgMjIgMTQ6MzY6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gZm9yIC5lbmQsIC5leGl0bSwgLmZhaWwsCisJLmlmYywgLmlmZXFzLCAuaWZnZSwgLmlmZ3QsIC5pZmxlLCAuaWZsdCwgLmlmbmMsIC5pZm5lLCAuaWZuZXMsCisJLnByaW50LCAucHVyZ2VtLCBhbmQgLnN0cnVjdC4gIFJlbW92ZSBkb2N1bWVudGF0aW9uIGZvcgorCS5hcHAtZmlsZS4KKworVHVlIEp1bCAyMSAxNjo1MDo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBzZXRfb3BlcmFuZCByZW5hbWVkIHRvIHNldF92bWFfb3BlcmFuZC4KKwlVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KKworRnJpIEp1bCAxNyAxMTo0MjoyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jIChtc19zaG93X3VzYWdlKTogRm9ybWF0dGluZyBjaGFuZ2VzLgorCitXZWQgSnVsIDE1IDE1OjM4OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgdHJhaWxpbmcKKwl3aGl0ZXNwYWNlIGFmdGVyIGEgcHJlZml4IG9wZXJhdG9yLgorCitUdWUgSnVsIDE0IDE1OjMyOjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgorCitUdWUgSnVsIDE0IDEyOjMzOjQ0IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChsb2cyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoc19yZXNlcnZlKTogVXNlIGxvZzIgdG8gY29udmVydCBhbGlnbm1lbnQgYmVmb3JlIGNhbGxpbmcKKwlyZWNvcmRfYWxpZ25tZW50LgorCShzX2NvbW1vbik6IFVzZSBsb2cyIHRvIGNvbnZlcnQgYWxpZ25tZW50IGJlZm9yZSBjYWxsaW5nCisJcmVjb3JkX2FsaWdubWVudCBhbmQgZnJhZ19hbGlnbi4KKwkoc3BhcmNfY29uc19hbGlnbik6IFVzZSBsb2cyLgorCitUdWUgSnVsIDE0IDExOjU4OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFNldCBzeW1ib2wgc2l6ZSBpZiBPQkpfRUxGLgorCShzX2NvbW1vbik6IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogUmVpbmRlbnQgYSBiaXQuICBDb3JyZWN0CisJaW5pdGlhbGl6YXRpb24gb2Ygd2FkZHIuCisJKHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCisKK1R1ZSBKdWwgMTQgMTE6MDA6MTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBkb2MvYy1pMzg2LnRleGk6IEZpeCBhIHR5cG8uICBVc2UgdGhlIHRlcm0gODAtYml0IHJlYWwgcmF0aGVyCisJdGhhbiB0ZW1wb3JhcnkgcmVhbC4KKworTW9uIEp1bCAxMyAxMzo1NTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRG9uJ3QgYWxpZ24gdGhlIHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUKKwlhbnkgZXJyb3JzLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBDb3JyZWN0IG51bWJlciBvZiBieXRlcyB3aGVuCisJY29weWluZyBhdXggaW5mb3JtYXRpb24uCisKKwkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IENhdGNoIGF0dGVtcHRzIHRvIHR1cm4gYW4gT19iaWcKKwlleHByZXNzaW9uIGludG8gYSBzeW1ib2wuCisKK01vbiBKdWwgMTMgMTM6Mjk6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogQ2hhbmdlIGFyZyBhbmQgcmV0dXJuCisJdHlwZSB0byB1bnNpZ25lZCBpbnQuCisJKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIHR5cGUgdXNlZCB0byBzdG9yZSBvZmZzZXRzIGZyb20gdW5zaWduZWQKKwlsb25nIHRvIGxvbmcuCisJKGkzODZfb3BlcmFuZCk6IFN3aXRjaCBlcnJvciBjaGVjayB0byBvbmx5IGNhbGwgUkVTVE9SRV9FTkRfU1RSSU5HCisJb25jZSBhZnRlciBwYXJzZV9yZWdpc3Rlci4KKworRnJpIEp1bCAxMCAxNjowMDowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9zaG93X3VzYWdlKTogQ2hhbmdlZCBmb3JtYXQgdG8gbWF0Y2ggdGhhdAorCW9mIGdjYywgbGQsIGV0Yy4KKworCSogYXMuYyAoc2hvd191c2FnZSk6IENoYW5nZWQgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgZ2NjLCBsZCwgZXRjLgorCitUaHUgSnVsICA5IDEyOjA5OjU3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWcvdGMtbTY4ay5jICh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHZ0YWJsZQorCXJlbG9jcy4KKwkobWRfYXBwbHlfZml4XzIpOiBGb3JjZSB0aGUgc3ltYm9sIG9mIHRoZSB2dGFibGUgcmVsb2MgdG8gYmUKKwl3ZWFrLgorCitUaHUgSnVsICA5IDExOjMxOjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL01ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KKwkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KKworV2VkIEp1bCAgOCAxMjoxODo1NiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKyAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBjYXNlICdpJyBhbmQgJ2onKTogTWFzayBvZmYgaGlnaCBiaXRzCisgICAgICAgIGZvciAlbG8gZXhwcmVzc2lvbnMuCisgICAgICAgIChtaXBzX2lwLCBjYXNlICd1Jyk6IE1vdmUgcmFuZ2UgY2hlY2sgYWZ0ZXIgY29kZSB0byBtYXNrCisgICAgICAgIG9mZiBiaXRzIGluICVoaS8lbG8gZXhwcmVzc2lvbnMuICBNYXNrIG9mZiBoaWdoIGJpdHMgZm9yCisgICAgICAgICVsbyBleHByZXNzaW9ucy4KKworVHVlIEp1bCAgNyAxNzo1NzozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRvYy9NYWtlZmlsZS5hbSAoZ2FzdmVyLnRleGkpOiBOZXcgdGFyZ2V0LgorCShhcy5pbmZvLCBhcy5kdmkpOiBEZXBlbmRzIHVwb24gZ2FzdmVyLnRleGkuCisJKiBkb2MvYXMudGV4aW5mbzogSW5jbHVkZSBnYXN2ZXIudGV4aS4gIE1lbnRpb24gdmVyc2lvbiBudW1iZXIgb24KKwl0aXRsZSBwYWdlIGFuZCBpbiB0b3Agbm9kZS4KKwkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KKworVHVlIEp1bCAgNyAxMTo0MjoxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGlzdGluZyk6IEZvciBFRElDVF9MSVNULCBza2lwIGFsbCBsaW5lcyB1cCB0bworCWJ1dCBub3QgaW5jbHVkaW5nIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGVkaWN0LgorCSogbGlzdGluZy5oIChMSVNUSU5HX0VPRik6IE5ldy4KKwkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogQ2FsbCBpdC4KKworVHVlIEp1bCAgNyAxMzowMDozNyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IERvbid0IHNldCB0aGUgc2l6ZSBvZiBhbgorIAlpbW1lZGlhdGUgYWRkcmVzcyBiYXNlZCBzb2xlbHkgb24gdGhlIHN1ZmZpeCBhbmQgdGhlIG1vZGUuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGFzc2VydGlvbiB0byBtYWtlIHN1cmUKKwlvdmVybGFwMiBkb2VzIG5vdCBzZXQgSW1tLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChzcGFjZV9jaGFycyk6IFJlbW92ZS4gVGhlIHNjcnViYmVyIGNvbnZlcnRzCisJc2VxdWVuY2VzIG9mIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuCisJKGlzX3NwYWNlX2NoYXJzKTogSnVzdCBjb21wYXJlIHdpdGggc3BhY2UuCisJKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSBzcGFjZV9jaGFycy4KKwkobWRfYXNzZW1ibGUpOiBKdXN0IHNraXAgYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCisJKGkzODZfb3BlcmFuZCk6IFJld3JpdGUgYmFzZS1pbmRleCBwYXJzaW5nIHRvIHVzZSBuZXcKKwlwYXJzZV9yZWdpc3RlciwgYW5kIHRvIHNraXAgd2hpdGUgc3BhY2UuICBTa2lwIHdoaXRlIHNwYWNlIGluIGEKKwludW1iZXIgb2Ygb3RoZXIgcGxhY2VzIHRvby4gIERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZgorCXBhcnNlX3JlZ2lzdGVyIGZhaWxzLgorCShwYXJzZV9yZWdpc3Rlcik6IENoYW5nZSByZWdfc3RyaW5nIHBhcmFtZXRlciB0byBiZSBub24tY29uc3QuCisJQWRkIGVuZF9vcCBwYXJhbWV0ZXIuICBTa2lwIHdoaXRlIHNwYWNlIGFmdGVyIHRoZSBgJScsIGFuZCByZXR1cm4KKwllbmQgb2YgcmVnaXN0ZXIgc3RyaW5nLiAgR2l2ZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW4KKwljYWxsZXIuCisKK0ZyaSBKdWwgIDMgMTU6MzQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXR0IFNlbWVyc2t5IDxtYXR0c0BzY2QuaHAuY29tPjoKKwkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIGNvbnN0LgorCShleHByX3NldF9wcmVjZWRlbmNlKTogTmV3IGZ1bmN0aW9uLgorCShleHByX2JlZ2luKTogRG9uJ3Qgc2V0IG9wZXJhdG9yIHJhbmtpbmdzLCBqdXN0IGNhbGwKKwlleHByX3NldF9wcmVjZWRlbmNlLgorCSogZXhwci5oIChleHByX3NldF9wcmVjZWRlbmNlKTogRGVjbGFyZS4KKwkqIHJlYWQuYyAoc19tcmkpOiBDYWxsIGV4cHJfc2V0X3ByZWNlZGVuY2UuCisKK1RodSBKdWwgIDIgMTY6MjQ6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbyAoU3RhdGVtZW50cyk6IFJlbW92ZSBwYXJhZ3JhcGggZGlzY3Vzc2luZworCWNvbnRpbnVpbmcgbGluZXMgd2l0aCBhIGJhY2tzbGFzaC4gIFRoaXMgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMsCisJaWYgaXQgZXZlciBkaWQuCisKK1RodSBKdWwgIDIgMTQ6MDY6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+CisKKyAgICAgICAgKiBvYmotdm1zLmM6IEFkZCBDKysgc3VwcG9ydCB3aXRoIGN0b3JzL2R0b3JzIHNlY3Rpb25zLiAgQWRkIHdlYWsKKwlzeW1ib2wgZGVmaW5pdGlvbnMuCisJKEN0b3JzX1N5bWJvbHMsIER0b3JzX1N5bWJvbHMpOiBOZXcgc3ltYm9sIGNoYWlucy4KKwkocHNfQ1RPUlMsIHBzX0RUT1JTKTogTmV3IHNlY3Rpb24gdHlwZXMuCisJKHZtc19maXh1cF94dG9yc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uCisJKEN0b3JzX1BzZWN0LCBEdG9yc19Qc2VjdCk6IERlZmluZS4KKwkoSVNfR1hYX1hUT1IpOiBEZWZpbmUKKwkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBDaGFuZ2UgY2hlY2sgb2YgZ3h4X2J1Z19maXhlZCB0byAwLgorCUZpbHRlciBzdGF0aWMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFuZCBhZGQgdG8KKwlDdG9yc19TeW1ib2xzL0R0b3JzX1N5bWJvbHMgY2hhaW4uCisJKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IFdyaXRlIEN0b3JzX1N5bWJvbHMvRHRvcnNfU3ltYm9scyB0bworCWFwcHJvcHJpYXRlIHNlY3Rpb24uCisKKyAgICAgICAgKiB0Yy1hbHBoYS5oIChUQVJHRVRfRk9STUFUKTogUmVuYW1lICJldmF4LWFscGhhIiB0byAidm1zLWFscGhhIi4KKwkqIG1ha2VmaWxlLnZtczogTWVyZ2UgdmF4L3ZtcyBzdXBwb3J0LgorCitXZWQgSnVsICAxIDIwOjA2OjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQsIG9ial9lbGZfdnRhYmxlX2VudHJ5KTogTmV3LgorCShlbGZfcHNldWRvX3RhYmxlKTogQWRkIHRoZW0uCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgorCShtZF9hcHBseV9maXgpOiBBY2NlcHQgdGhlbS4KKwkobWlwc19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgorCSh0Y19nZW5fcmVsb2MpOiBNdW5nIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkgZm9yIFJlbC4KKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFjY2VwdCB2dGFibGUgcmVsb2NzLgorCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgorCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgorCitXZWQgSnVsICAxIDE2OjM1OjMyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQ0dFTl9DUFVfUFJFRklYKTogTmV3IHZhcmlhYmxlLgorCShjZ2VuLm8pOiBVc2UgaXQuCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZS5pbjogQUNfU1VCU1QgY2dlbl9jcHVfcHJlZml4LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitXZWQgSnVsICAxIDIxOjM4OjU2IDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1zaCAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTJfREVMQVlfTEVOR1RIKTogRGVmaW5lLgorCUNoYW5nZWQgYWxsIHVzZXJzIG9mIENPTkQxMl9ERUxBWS4KKworRnJpIEp1biAyNiAxMToyMToxMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHNldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCisJKG1kX3BzZXVkb190YWJsZSk6IEFkZCBwc2V1ZG8tb3BzIHRvIHNldCB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUuCisJKG1kX2JlZ2luKTogRGVmYXVsdCB0byBtbjEwMzAwIG1vZGUuCisJKG1kX2Fzc2VtYmxlKTogT25seSBhY2NlcHQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY29yZSBtbjEwMzAwCisJY2hpcCBhbmQgdGhlIGFjdGl2ZSBtYWNoaW5lIHR5cGUuCisKK1dlZCBKdW4gMjQgMTk6MDY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogR2l2ZSB0aGUgc3RydWN0IGEgbmFtZS4KKwkqIGNvbmZpZy90Yy1oODMwMC5oICh0Y19yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgorCSogY29uZmlnL3RjLWg4NTAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCisJKiBjb25maWcvdGMtc2guaCAoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgorCSogY29uZmlnL3RjLXc2NS5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgorCSogY29uZmlnL3RjLXo4ay5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgorCitXZWQgSnVuIDI0IDEzOjQ1OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogIFJlc3RvcmUgb2xkIHNlY3Rpb24KKyAgICAgICAgYWZ0ZXIgY29tbW9uIHByb2Nlc3NpbmcuCisKK1dlZCBKdW4gMjQgMTE6NTA6NTQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBGb3JjZSBiaW5hcnkgZmlsZS4KKworVHVlIEp1biAyMyAxNzo0NzozMSAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0sIGJ1aWxkX2J5dGVzKTogUmVwbGFjZSBjYXN0IHRvCisJY2hhciB3aXRoIGNvZGUgdGhhdCBleHBsaWNpdGx5IHNpZ24tZXh0ZW5kcy4KKworVHVlIEp1biAyMyAxMzo1NDo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCQorCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiBSZXN0b3JlIHRleHQgc2VjdGlvbiBhcyB0aGUgY3VycmVudAorCXNlY3Rpb24gYWZ0ZXIgY3JlYXRpbmcgY2FsbCB0YWJsZSBzZWN0aW9ucy4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChTWU1fQVVYSU5GTyk6IE5ldyBtYWNybyB0byBjb25jZWFsIHVnbHkKKwljb2RlLiAKKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogUmVwbGFjZSBjb21wbGV4IGV4cHJlc2lvbgorCXdpdGggY2FsbCB0byBtYWNybyBTWU1fQVVYSU5GTy4KKworVHVlIEp1biAyMyAxNTowOToyNyAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQorCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEp1biAyMiAxOTo1Mjo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IEZpeCBjb3B5aW5nIG9mIGF1eGlsaWFyeQorCWluZm9ybWF0aW9uLgorCitNb24gSnVuIDIyIDE1OjE4OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQmUgcHJlcGFyZWQgZm9yIGEgc3BhY2UgYmV0d2VlbgorCXRoZSBvcGVuIHBhcmVudGhlc2lzIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmQsCisJYmVjYXVzZSBvZiB0aGUgSnVuZSAxNiBjaGFuZ2UuCisKK1N1biBKdW4gMjEgMjE6Mjc6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIHdlYWsgc3ltYm9scyBjb3JyZWN0bHkgaWYKKwlCRkRfQVNTRU1CTEVSLgorCitTdW4gSnVuIDIxIDEyOjI2OjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBbHdheXMgcGVyZm9ybSBhbGlnbm1lbnQgcmVxdWVzdCwKKwlldmVuIGlmIGl0IGlzIGJlbGl2ZWQgdG8gYmUgdW5uZWNlc3NhcnkuCisKK0ZyaSBKdW4gMTkgMTM6NTc6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IE5ldmVyIGFkanVzdCByZWxvY3MgYWdhaW5zdCB3ZWFrCisJc3ltYm9scy4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhY2NvcmRpbmdseS4KKworRnJpIEp1biAxOSAwOTo1MDoxNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBEbyBub3QgaGFyZGNvZGUgdGhlCisJc2hpZnQgYW1vdW50IGZvciBhIHJlcGVhdGVkIG9wZXJhbmQuICBUaGUgc2hpZnQgYW1vdW50IGZvciB0aGUKKwlyZXBlYXRlZCBjb3B5IGNvbWVzIGZyb20gdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQuCisKK0ZyaSBKdW4gMTkgMDA6NDQ6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X29wZXJhbmQpOiBGaXggdHlwb3MgaW4gbGRtL3N0bSBzdXBwb3J0LgorCitXZWQgSnVuIDE3IDEzOjA3OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCAtbWlwc04gdXNhZ2UuCisKK1R1ZSBKdW4gMTYgMTM6MDY6MjEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19zeW1ib2xfY2hhcnMgaXMgZGVmaW5lZCwgdHJlYXQgYWxsCisJY2hhcmFjdGVycyBpbiBpdCBhcyBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVC4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX3N5bWJvbF9jaGFycyk6IERlZmluZS4KKwkoZXh0cmFfc3ltYm9sX2NoYXJzKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGV4dHJhX3N5bWJvbF9jaGFycyk6IERlZmluZS4KKwkoY29tbWVudF9jaGFycyk6IERvbid0IHVzZSAnLycgYXMgY29tbWVudCBzdGFydCBpZiBURV9MSU5VWC4KKwkobGluZV9jb21tZW50X2NoYXJzKTogU2V0IHRvICcvJyBpZiBURV9MSU5VWC4KKwkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1wcmVmaXhlcyk6IFVwZGF0ZS4KKwkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCB0Y19zeW1ib2xfY2hhcnMuCisKK0ZyaSBKdW4gMTIgMTM6MzY6NTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgorCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCisKKzE5OTgtMDYtMTIgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogQ2hlY2tpbmcgZGlzcGxhY2VtZW50CisJY29uc3RyYWludCBpbiBpbnN0cnVjdGlvbnMgUkVQICYgUkVQSS4KKworVGh1IEp1biAxMSAwODo1Njo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogQ2F0Y2ggQkZEX1JFTE9DXzgsCisJQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfNjQgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2VzLiAgCisKKwkoY2hlY2tfcmFuZ2UpOiBJZiB0aGUgb3BlcmFuZCBpcyBzaGlmdGVkLCB0aGVuIHNoaWZ0IHRoZSBudW1iZXIKKwliZWZvcmUgY2hlY2tpbmcgaXRzIHJhbmdlLgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IEFkZCBtb3JlIGNoZWNrcyBmb3IgTlVMTCBwb2ludGVycy4gCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IFNldCBTRUNfQ09NTU9OIGJpdCBvbiBzcGVjaWFsCisJY29tbW9uIHNlY3Rpb25zLgorCitXZWQgSnVuIDEwIDE3OjI2OjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IENyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGFzIG5lZWRlZC4KKworMTk5OC0wNi0xMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBBZGRpdGlvbiBvZiBzd2FwcGluZworCWluc3RydWN0aW9ucyBmb3Igc2VxdWVudGlhbCBhbmQgcmV2ZXJzZSBzZXF1ZW50aWFsIG9yZGVyIHdoZW4KKwlnaXZlbiBvcmRlciBpcyBub3QgcG9zc2libGUuCisKK1R1ZSBKdW4gIDkgMTM6NTI6NTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisgCShERVBfSU5DTFVERVMpOiBGaXggcmVmZXJlbmNlIHRvIGludGwgYnVpbGQgZGlyZWN0b3J5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1R1ZSBKdW4gIDkgMTI6MjA6MDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBkb2MvYy1pMzg2LnRleGk6IFVwZGF0ZSAxNiBiaXQgZG9jdW1lbnRhdGlvbi4KKworCSogY29uZmlnL3RjLWkzODYuaDogQ2hhbmdlIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCisJSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZSBhcyB0aGV5IGFyZSB1c2VkIGZvciBhZGRyZXNzIHNpemUgYXMKKwl3ZWxsIGFzIGRhdGEgc2l6ZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmM6IExpa2V3aXNlLiAgQWRkIGNvZGUgdG8gcmVqZWN0IGFkZHIzMi9kYXRhMzIgaW4KKwkzMi1iaXQgbW9kZSwgc2ltaWxhcmx5IGFkZHIxNi9kYXRhMTYgYW5kIHZhcmlhbnRzLgorCitNb24gSnVuICA4IDE4OjMyOjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIHJldmVyc2UKKwlzZXF1ZW50aWFsIHdvcmQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgorCQorCShkb19hc3NlbWJsZSk6IEFkZCBleHRyYSBjb21tYW5kIGxpbmUgYXJndW1lbnQsIHRvIGFsbG93IG11bDMyCisJYXR0cmlidXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3MgcGFyYWxsZWwgaW5zbnMuCisJKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IE5PUHMgYmV0d2VlbiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc25zIHdoaWNoCisJY29udGFpbiBhbiAzMiBiaXQgbXVsdGlwbHkgYW5kIGEgMTYgbXVsdGlwbHkuCisKK01vbiBKdW4gIDggMTI6MjA6MzAgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5jOiBSRVBORSByZW5hbWVkIHRvIFJFUE5FX1BSRUZJWF9PUENPREUsIGFuZAorCWxpa2V3aXNlIGZvciBSRVBFLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChyZWxvYyk6IEFkZCBicmFjZXMuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogUmVuYW1lIGJpIHRvIHNpYiB0byBiZQorCWNvbnNpc3RlbnQgd2l0aCBJbnRlbCBuYW1pbmcuCisJKiBjb25maWcvdGMtaTM4Ni5oIChiYXNlX2luZGV4X2J5dGUpOiBSZW5hbWUgdG8gc2liX2J5dGUuICBEb24ndAorCXVzZSBiaXRmaWVsZHMgaW4gc2liX2J5dGUuCisJKG1vZHJtX2J5dGUpOiBEb24ndCB1c2UgYml0ZmllbGRzIGhlcmUgZWl0aGVyLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IEFkZCBjb25zdC4KKwkocGFyc2VfcmVnaXN0ZXIpOiBBZGQgY29uc3QgdG8gcmV0dXJuLCBwYXJhbSwgYW5kIGNoYXIgKnMuCisJKGkzODZfb3BlcmFuZCk6IEFkZCBjb25zdCB0byByZWdfZW50cnkgKnIuCisJKiBjb25maWcvdGMtaTM4Ni5oICh0ZW1wbGF0ZXMpOiBBZGQgY29uc3QgdG8gc3RhcnQsIGVuZC4KKworCUluc3BpcmVkIGJ5IGNvZGUgZm9yIDE2IGJpdCBnYXMgc3VwcG9ydCBmcm9tIE1hcnR5bmFzIEt1bmlnZWxpcworCTxtYXJ0eW5hc0BubTMua3R1Lmx0PjoKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGZ1bGwgc3VwcG9ydCBmb3IgMTYgYml0CisJbW9kcm0sIGFuZCBKdW1wLCBKdW1wQnl0ZSwgSnVtcER3b3JkLCBKdW1wSW50ZXJTZWdtZW50IGluc25zLgorCSh1c2VzX21lbV9hZGRybW9kZSk6IFJlbW92ZS4KKwkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBBZGQgc3VwcG9ydCBoZXJlIHRvby4KKwkobWRfcmVsYXhfdGFibGUpOiBSZXdyaXRlIGludGVyZmFjZSB0byBtZF9yZWxheCBmb3IgMTYgYml0CisJc3VwcG9ydC4KKwkoQllURSwgV09SRCwgRFdPUkQsIFVOS05PV05fU0laRSk6IFJlbW92ZS4KKwkob3Bjb2RlX3N1ZmZpeF90b190eXBlKTogUmVtb3ZlLgorCShDT0RFMTYsIFNNQUxMLCBTTUFMTDE2LCBCSUcsIEJJRzE2KTogRGVmaW5lLgorCShTSVpFX0ZST01fUkVMQVhfU1RBVEUpOiBNb2RpZnkgdG8gc3VpdCBhYm92ZS4KKwkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCisJKGkzODZfb3BlcmFuZCk6IEFkZCBzdXBwb3J0IGZvciAxNiBiaXQgYmFzZS9pbmRleCByZWdzLAorCWltbWVkaWF0ZXMsIGFuZCBkaXNwbGFjZW1lbnRzLiAgUmVtb3ZlIHNvbWUgdW5uZWNlc3NhcnkgY2FzdHMsIGFuZAorCWxvY2FsaXNlIGVuZF9vZl9vcGVyYW5kX3N0cmluZywgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwKKwlkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCB2YXJpYWJsZXMuICBBZGQgR0NDX0FTTV9PX0hBQ0suCisJKiBjb25maWcvdGMtaTM4Ni5oIChOT19CQVNFX1JFR0lTVEVSXzE2KTogRGVmaW5lLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChwcmVmaXhfaGFzaCk6IFJlbW92ZS4KKwkobWRfYmVnaW4pOiBSZXdyaXRlIHdpdGhvdXQgb2JzdGFja3MuICBSZW1vdmUgcHJlZml4IGhhc2ggdGFibGUKKwloYW5kbGluZy4gIFJld3JpdGUgbGV4aWNhbCB0YWJsZSBoYW5kbGluZy4KKwkoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRG9uJ3QgcHJpbnQgcHJlZml4IHN0YXRpc3RpY3MuCisJKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBpbnN0cnVjdGlvbiBwYXJzZXIgc28gdGhhdCBsaW5lIGlzIG5vdAorCWNvbnZlcnRlZCB0byBsb3dlciBjYXNlLiAgRG9uJ3QgZG8gYSBoYXNoX2ZpbmQgZm9yIHByZWZpeGVzLAorCWluc3RlYWQgcmVjb2duaXNlIHRoZW0gdmlhIG9wY29kZSBtb2RpZmllci4KKwkoZXhwZWN0aW5nX29wZXJhbmQsIHBhcmVuX25vdF9iYWxhbmNlZCk6IExvY2FsaXNlIHZhcmlhYmxlcy4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKElzUHJlZml4KTogRGVmaW5lLgorCShwcmVmaXhfZW50cnkpOiBSZW1vdmUuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKFBSRUZJWF9TRVBFUkFUT1IpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5jIChQUkVGSVhfU0VQQVJBVE9SKTogRGVmaW5lIGhlcmUgaW5zdGVhZCwgdXNpbmcKKwknXFwnIGluIGNhc2Ugd2hlcmUgY29tbWVudF9jaGFycyBjb250YWlucyAnLycuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKE1BVENIKTogRW5zdXJlIGdpdmVuIG9wZXJhbmQgYW5kIHRlbXBsYXRlCisJbWF0Y2ggZm9yIEp1bXBBYnNvbHV0ZS4gIE1ha2VzIGUuZy4gYGxqbXAgdGFibGUoJWVieCknIGludmFsaWQ7CisJeW91IG11c3Qgd3JpdGUgYGxqbXAgKnRhYmxlKCVlYngpJy4KKworCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgorCSogY29uZmlnL3RjLWkzODYuYyAoQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfMTZfUENSRUwpOiBEZWZpbmUKKwlhcyAwIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgorCShtZF9hc3NlbWJsZSk6IEFsbG93IGltbWVkaWF0ZSBvcGVyYW5kcyB3aXRob3V0IHN1ZmZpeCBvcgorCW90aGVyIHJlZyBvcGVyYW5kIHRvIGRlZmF1bHQgaW4gc2l6ZSB0byB0aGUgY3VycmVudCBjb2RlIHNpemUuCisKK01vbiBKdW4gIDggMDk6NDU6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisgCisgICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgUmVzdG9yZSBjcmVhdGlvbiBvZgorICAgICAgICAuY2FsbF90YWJsZV90ZXh0IGFuZCAuY2FsbF90YWJsZV9kYXRhIHNlY3Rpb25zLgorCitTYXQgSnVuICA2IDAwOjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU2V0IGV4ZWN1dGlvbiB0eXBlIHRvIHVua25vd24KKwlhZnRlciBlbWl0dGluZyBhIHdvcmQgb2Ygbm9vcHMuCisKK0ZyaSBKdW4gIDUgMjM6Mjc6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogRGlzcDE2IGlzIG1vZGUgMi4KKwkoaTM4Nl9vcGVyYW5kKTogU2ltcGxpZnkgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KKwlEaXNhbGxvdyBgaW4gNCglZHgpLCVhbCcuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogTWFrZSByZWdzLCBiYXNlX3JlZywgYW5kCisJaW5kZXhfcmVnIGNvbnN0LgorCShhZGRfcHJlZml4KTogQ2hhbmdlIHBhcmFtZXRlciBmcm9tIGNoYXIgdG8gaW50LgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChVZ2gpOiBEZWZpbmUgb3Bjb2RlIG1vZGlmaWVyLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBQcmludCB3YXJuaW5ncyBmb3IgVWdoIGluc25zLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFJld3JpdGUgTUFUQ0ggYW5kCisJQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCBtYWNyb3MgdG8gY2hlY2sgcmVnaXN0ZXIgdHlwZXMgbW9yZQorCXRob3JvdWdobHkuICBDaGVjayBmb3IgaWxsZWdhbCBzdWZmaXgvb3BlcmFuZCBjb21iaW5hdGlvbnMKKwl3aGVuIG1hdGNoaW5nIGluc25zIHdpdGggb3BlcmFuZHMuICBIYW5kbGUgbmV3IGBzJyBzdWZmaXgsIGFuZAorCWFzc29jaWF0ZWQgRmxvYXRNRiBvcGNvZGUgbW9kaWZpZXIgZm9yIGZsb2F0IGluc25zIHdpdGggbWVtb3J5CisJb3BlcmFuZHMuCisJKiBjb25maWcvdGMtaTM4Ni5oIChGbG9hdE1GKTogRGVmaW5lIG5ldyBvcGNvZGUgbW9kaWZpZXIuCisJKE5vX3NTdWYsIE5vX2JTdWYsIE5vX3dTdWYsIE5vX2xTdWYpOiBMaWtld2lzZS4KKwkoU0hPUlRfT1BDT0RFX1NVRkZJWCwgTE9OR19PUENPREVfU1VGRklYKTogRGVmaW5lLgorCSogY29uZmlnL3RjLWkzODYuYzogUmVuYW1lIFdPUkRfUFJFRklYX09QQ09ERSB0bworCURBVEFfUFJFRklYX09QQ09ERSB0aHJvdWdob3V0LgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChSRUdJU1RFUl9XQVJOSU5HUyk6IERlZmluZS4KKwkobWRfYXNzZW1ibGUpOiBSZXdyaXRlIHN1ZmZpeC9yZWdpc3RlciBvcGVyYW5kIGNoZWNraW5nIGNvZGUgdG8gYmUKKwltb3JlIHRob3JvdWdoLiAgUmVtb3ZlIEFiczgsMTYsMzIuICBDaGFuZ2Ugb2NjdXJyZW5jZXMgb2YgTWVtIHRvCisJQW55TWVtLCB0aGUgYmV0dGVyIHRvIGdyZXAuCisJKHBpKTogUmVtb3ZlIEFicy4KKwkoaTM4Nl9vcGVyYW5kKTogRG9uJ3Qgc2V0IE1lbSBiaXRzIGluIGkudHlwZXNbdGhpc19vcGVyYW5kXSB3aGVuCisJZ2l2ZW4gYSBtZW1vcnkgb3BlcmFuZC4gIERvbid0IHNldCBBYnMgYml0cyBlaXRoZXIuCisJKHR5cGVfbmFtZXMpOiBSZW1vdmUgTWVtKiwgQWJzKi4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKE1lbTgsIE1lbTE2LCBNZW0zMiwgQWJzOCwgQWJzMTYsIEFiczMyKTogRG9uJ3QKKwlkZWZpbmUgb3Bjb2RlX21vZGlmaWVycyBhcyB0aGVzZSBjYXNlcyBhcmUgaGFuZGxlZCBieSBEaXNwOCwKKwlEaXNwMTYsIERpc3AzMiBhbmQgc3VmZml4IGNoZWNrcy4KKwkoQ09NRVNfSU5fQk9USF9ESVJFQ1RJT05TKTogUmVtb3ZlLgorCShGbG9hdFIpOiBEZWZpbmUuIEl0J3MgT0sgdG8gc2hhcmUgdGhlIGJpdCB3aXRoIFJldmVyc2VSZWdSZWdtZW0uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZW1pdCBvcGVyYW5kIHNpemUgcHJlZml4CisJaWYgSWdub3JlRGF0YVNpemUgbW9kaWZpZXIgZ2l2ZW4uICBSZW1vdmUgU2hvcnRmb3JtVyBtb2RpZmllcgorCXRlc3QuICBBZGQgdGVzdCBmb3IgU2hvcnRGb3JtIGluIFcgYmFzZV9vcGNvZGUgbW9kaWZpY2F0aW9uLgorCU1lcmdlIFNlZzJTaG9ydEZvcm0gYW5kIFNlZzNTaG9ydEZvcm0gY29kZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKFNob3J0Rm9ybVcpOiBSZW1vdmUuCisJKElnbm9yZURhdGFTaXplKTogRGVmaW5lLgorCitGcmkgSnVuICA1IDEwOjUwOjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU3RvcmUgcHJldmlvdXMgc2VnbWVudCBzdGF0ZQorCXdpdGggcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCisKK1dlZCBKdW4JIDMgMTg6MjE6NTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChTQ0FMRTFfV0hFTl9OT19JTkRFWCk6IERlZmluZS4KKwkoZWJwLCBlc3ApOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlcy4KKwkoTUFUQ0gpOiBSZW1vdmUgdGVzdCBmb3IgSW5PdXRQb3J0UmVnLgorCShpMzg2X29wZXJhbmQpOiBQcm9wZXJseSBoYW5kbGUgSW5PdXRQb3J0UmVnIGhlcmUgaW5zdGVhZC4KKwlEaXNhbGxvd3MgYGluYiAoJWR4LDIpJywgYGluYiAlZXM6KCVkeCknIGFuZCBgbW92ICglZHgpLCVheCcKKwkobWRfYXNzZW1ibGUpOiBTaW1wbGlmeSBhbmQgY29ycmVjdCBtb2RybSBhbmQgc2liIGdlbmVyYXRpb24uCisJKGkzODZfb3BlcmFuZCk6IEFkZCB3YXJuaW5nIGZvciBzY2FsZSB3aXRob3V0IGluZGV4LgorCVJld3JpdGUgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KKworCSogY29uZmlnL3RjLWkzODYuYyAoRU5EX1NUUklOR19BTkRfU0FWRSk6IFByb3RlY3QgYXJndW1lbnRzIG9mCisJbWFjcm9zIGFuZCBlbmNsb3NlIGluIGRvIHdoaWxlKDApLgorCShSRVNUT1JFX0VORF9TVFJJTkcpOiBMaWtld2lzZS4KKwkobWRfYXNzZW1ibGUpOiBBZGQgb25lIHRvIHByaW50ZWQgb3BlcmFuZCBudW1iZXIgc28gd2Ugc3RhcnQKKwlmcm9tIDEgbm90IDAuICBBZGQgc29tZSBtb3JlIGdldHRleHQgaW52b2NhdGlvbnMuCisJKGkzODZfb3BlcmFuZCk6IEZpeCBgJSVzJyAtPiBgJSUlcycuIEluYyBwcmludGVkIG9wZXJhbmQKKwludW1iZXIgaGVyZSB0b28uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKFdBSVRfUFJFRklYLCBMT0NLUkVQX1BSRUZJWCwgQUREUl9QUkVGSVgsCisJREFUQV9QUkVGSVgsIFNFR19QUkVGSVgpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IFJlbW92ZSB3YWl0X3ByZWZpeCBmaWVsZC4KKwkoY2hlY2tfcHJlZml4KTogUmVtb3ZlIGZ1bmN0aW9uLgorCShhZGRfcHJlZml4KTogTmV3IGZ1bmN0aW9uLiAgQWRkIHByZWZpeCB0byBpLnByZWZpeCBhcyB3ZWxsIGFzCisJZG9pbmcgY2hlY2tzLgorCShtZF9hc3NlbWJsZSk6IENoYW5nZXMgZm9yIGFkZF9wcmVmaXguCVJlbW92ZSBoYWNrIGZvciB3YWl0CisJcHJlZml4LCBpbnN0ZWFkIGFsd2F5cyBvdXRwdXQgcHJlZml4ZXMgaW4gZml4ZWQgb3JkZXIuCVRlc3QKKwlmb3IgamN4ei9sb29wIHdoZW4gc2VsZWN0aW5nIGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMsCisJYW5kIGFkZCBhZGRyZXNzIHNpemUgcHJlZml4IHJhdGhlciB0aGFuIG9wZXJhbmQgc2l6ZSBwcmVmaXguCisJUmVtb3ZlIG9wZXJhbmQgLT4gYWRkcmVzcyBzaXplIGhhY2sgd2hlbiBlbWl0dGluZyBqY3h6L2xvb3AuCisJKGkzODZfb3BlcmFuZCk6IFJlbW92ZSBPX0Fic2VudCBjaGVjayBhcyBpdCdzIGRvbmUgaW4gZXhwci4KKworV2VkIEp1biAgMyAxNTowOToxMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG01MjAwIGFzIGEgY3B1X3R5cGUgb2YgbTY4ay4KKwkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGxpYnRvb2wuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBKdW4gIDMgMTQ6MTE6NTkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQWRkIG1vcmUgY2FsbHMKKwl0byByZWxheGFibGVfc3ltYm9sIHRvIHByZXZlbnQgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzeW1ib2wgZnJvbQorCWJlaW5nIHJlbGF4ZWQuCisKK1dlZCBKdW4gIDMgMTQ6MTA6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChyZWxheGFibGVfc3ltYm9sKTogSWYgVEFSR0VUX09TIGlzICJlbGYiLCBhbGwKKwlzeW1ib2xzIGFyZSByZWxheGFibGUuCisKK1dlZCBKdW4gIDMgMDk6MTY6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisgCisgICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgRG9uJ3QgY3JlYXRlIHNwZWNpYWwKKyAgICAgICAgc2VjdGlvbnMgYnkgZGVmYXVsdC4KKyAKK1R1ZSBKdW4gIDIgMTQ6NTI6NTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBkaXYgYW5kIHVkaXYsIGNsb3NlIHRoZQorCXJlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KKworVHVlIEp1biAgMiAxNTozNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgorCSogbWFjcm8uYyAobWFjcm9fbXJpX21vZGUpOiBOZXcgZnVuY3Rpb24uCisJKiBtYWNyby5oIChtYWNyb19tcmlfbW9kZSk6IERlY2xhcmUuCisJKiByZWFkLmMgKHNfbXJpKTogQ2FsbCBtYWNyb19tcmlfbW9kZSB3aGVuIHN3aXRjaGluZyBpbiBhbmQgb3V0IG9mCisJTVJJIG1vZGUuCisKK1R1ZSBKdW4gIDIgMTM6MzI6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBBbGxvdyBhbGlnbm1lbnQgcGFyYW1ldGVyIGluCisJT0JKX0VWQVggY2FzZS4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IERlZmVyIHJlc3RvcmluZyBjaGFyYWN0ZXIKKwl1bnRpbCBhZnRlciB4c3RyZHVwIGluIE9CSl9FVkFYIGNhc2UuCisKK1R1ZSBKdW4gIDIgMTM6MTE6MTMgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIGNvbmZpZy90Yy12YXguYyAobWRfY3JlYXRlX3Nob3J0X2p1bXApOiBGaXggb2ZmIGJ5IHR3byBidWcgaW4KKwlvZmZzZXQgY2FsY3VsYXRpb24uICBBbHNvLCB1c2UgVkFYX0JSVyBmcm9tIHZheC1pbnN0LmggaW5zdGVhZAorCW9mIGhhcmRjb2RlZCBtYWdpYyBudW1iZXIuCisJKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBVc2UgVkFYX0pNUCBhbmQgVkFYX0FCU09MVVRFX01PREUgbWFjcm9zLgorCitUdWUgSnVuICAyIDA5OjI1OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAoZG9fc19mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShzX2Z1bmMpOiBDYWxsIGl0LgorCSogcmVhZC5oIChkb19zX2Z1bmMpOiBBZGQgcHJvdG90eXBlLgorCitNb24gSnVuICAxIDEyOjQ3OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBPbmx5IGZpbGwgY29kZSBzZWN0aW9ucyB3aXRoCisJbm9wcyBpZiBmaWxsIHBhdHRlcm4gbm90IHNwZWNpZmllZC4KKworTW9uIEp1biAgMSAxNDowODozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEFuZHJldyBDcmFidHJlZSA8YW5kcmV3Y0B0eXBob29uLnJvc2UuaHAuY29tPjoKKwkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZSBpZiBURV9HTzMyLgorCitTdW4gTWF5IDMxIDE1OjQzOjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwlJbXBsZW1lbnQgLmZ1bmMvLmVuZGZ1bmMgcHNldWRvLW9wcy4KKwkqIHJlYWQuaCAoc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMsc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMpOiBEZWNsYXJlLgorCShzX2Z1bmMpOiBEZWNsYXJlLgorCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5mdW5jLC5lbmRmdW5jLgorCShzX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZnVuYyxzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyk6IE5ldworCWZ1bmN0aW9ucy4KKwkoaW5fZG9jX2Z1bmNfcCxjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTogTmV3IHN0YXRpYyBnbG9iYWxzLgorCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogRW1pdCBmdW5jdGlvbiByZWxhdGl2ZSBzdGFicyBpZiBpbiAuZnVuYy4KKworRnJpIE1heSAyOSAxODoxMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hMjlrLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtYWxwaGEuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1hcm0uaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1oODMwMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgorCSogY29uZmlnL3RjLWg4NTAwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaHBwYS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgorCSogY29uZmlnL3RjLWk4NjAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pOTYwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtdGljMzAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy13NjUuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy16OGsuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1hMjlrLmM6IERvbid0IGRlZmluZSBtZF9zaG9ydF9qdW1wX3NpemUsCisgCW1kX2xvbmdfanVtcF9zaXplLCBtZF9jcmVhdGVfc2hvcnRfanVtcCBvciBtZF9jcmVhdGVfbG9uZ19qdW1wLgorCSogY29uZmlnL3RjLWFscGhhLmM6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLWFscGhhLmg6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLWFybS5jOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1oODMwMC5jOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1oODUwMC5jOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLWk4NjAuYzogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1wcGMuYzogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtc2guYzogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtc3BhcmMuaDogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtdGljMzAuYzogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtdzY1LmM6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLXo4ay5jOiBMaWtld2lzZS4KKworRnJpIE1heSAyOSAxNjowMzoyNiAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCSogY29uZmlnL3RjLXZheC5jIChfKTogRGVsZXRlIHRoaXMgbWFjcm8gdXNlZCBmb3IgcGxhY2Vob2xkZXIKKwl2YWx1ZXMgaW4gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZTsgaXQgY29uZmxpY3RzIHdpdGggdGhlIF8oKSBtYWNybworCXVzZWQgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgorCitGcmkgTWF5IDI5IDEzOjQ2OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9iYXNlKTogRml4IGNhc2UgaW5zZW5zaXRpdmUgc3ltYm9sIG5hbWUKKwljb2RlLiAgRnJvbSBDaHJpcyBNb2xsZXIgPG1vbGxlckBib3BzLmNvbT4uCisKKwlCYXNlZCBvbiBwYXRjaCBmcm9tIEtsYXVzIEthZW1wZiA8a2thZW1wZkBwcm9naXMuZGU+OgorCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBicm9rZW5fd29yZCk6IEFkZCBzZWcgYW5kIHN1YnNlZyBmaWVsZHMuCisJKiByZWFkLmMgKGVtaXRfZXhwcik6IEluaXRpYWxpemUgc2VnIGFuZCBzdWJzZWcgZmllbGRzIG9mIGEgbmV3CisJYnJva2VuIHdvcmQuCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFN3aXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgc2VnbWVudAorCWFuZCBzdWJzZWdtZW50IHdoZW4gcHJvY2Vzc2luZyBhIGJyb2tlbiB3b3JkLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtcmlfYXNzZW1ibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2FsbCBtcmlfYXNzZW1ibGUgcmF0aGVyIHRoYW4KKwltZF9hc3NlbWJsZS4KKwkoc19tcmlfZWxzZSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgorCShzX21yaV9lbmRmLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCisKK1dlZCBNYXkgMjcgMTE6MTY6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfb3JnKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpZiBpdCBpcyBkZWZpbmVkLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBcblwgdG8gbmV3IHN0cmluZy4KKworVHVlIE1heSAyNiAxOToyNzo1MiAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQSk6IE5ldy4KKwkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGZvciBzYW1lLgorCShzcGFyY19tZF9lbmQpOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgorCShtZF9hcHBseV9maXgzLCB0Y19nZW5fcmVsb2MpOiBBbGxvdyBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KKwkoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQgdG8gY3JlYXRlIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgorCisJKiBjb25maWcvdGMtc3BhcmMuaCAoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQuCisJCitUaHUgTWF5IDIxIDE1OjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAoZmluZF9yZWFsX3N0YXJ0KTogUmVsYXggZGVmaW5pdGlvbiBvZiBsb2NhbAorCWxhYmVscy4KKworVHVlIE1heSAxOSAxNjo1OTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQXBwbHkgYWRkcmVzcyBhZGp1c3RtZW50IHRvIGFsbAorCXN5bWJvbHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIG5vdCBqdXN0IHRoZSBsYXN0IG9uZSBzcGVjaWZpZWQuCisKK1R1ZSBNYXkgMTkgMDg6MjU6MTkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBVc2UgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgorICAgICAgICBvciBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIHRvIHdyaXRlIGRhdGEuCisKK01vbiBNYXkgMTggMTc6MDk6MzAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgYXJ0aWZpY2lhbGx5IGNyZWF0ZWQKKwlyZWdpc3RlciBuYW1lIHN5bWJvbHMuCisKK01vbiBNYXkgMTggMTM6NDc6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSAic2VnbWVudCIgdG8gInNlY3Rpb24iIGluCisJZXJyb3IgbWVzc2FnZS4KKworTW9uIE1heSAxOCAxNjo1NTo0MCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSBzeW0xLXN5bTIgbWVzc2FnZSBhZ2Fpbi4KKworTW9uIE1heSAxOCAwOTozMTo0MyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igc3ltMS1zeW0yCisJZXJyb3JzIHdoZW4gc3ltMSBpcyBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGZyb20gc3ltMi4KKworV2VkIE1heSAxMyAxMDoxNjozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jICh3YXJuX3VubWF0Y2hlZF9oaWdoKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkoT1BUSU9OX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fV0FSTi4KKwkoT1BUSU9OX05PX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fTk9fV0FSTi4KKwkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLS17bm8tLH13YXJuLXVubWF0Y2hlZC1oaWdoLgorCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KKwkobWRfc2hvd191c2FnZSk6IExpa2V3aXNlLgorCShtMzJyX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgorCisJKiByZWFkLmMgKGdlbmVyYXRlX2ZpbGVfZGVidWcsZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTmV3IGZ1bmN0aW9ucy4KKwkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCB0aGVtLgorCSogcmVhZC5oIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IERlY2xhcmUuCisJKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2VuZXJhdGVfYXNtX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCisJKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBNb3ZlIGZpbGUgbmFtZSBoYW5kbGluZyBpbnRvCisJZ2VuZXJhdGVfYXNtX2ZpbGUuCisKK1R1ZSBNYXkgMTIgMTI6MDM6NDQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQzMHYuYyAoY3VyX211bDMyX3AsIHByZXZfbXVsMzJfcCk6IE1ha2Ugc3RhdGljLgorICAgICAgICAoZDMwdl9jdXJyZW50X2FsaWduLCBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnKTogTmV3IHZhcmlhYmxlcy4KKyAgICAgICAgKGQzMHZfbGFzdF9sYWJlbCk6IE5ldyB2YXJpYWJsZS4KKyAgICAgICAgKGQzMHZfYWxpZ24sIHNfZDMwdl9hbGlnbiwgc19kMzB2X3RleHQpOiBOZXcgZnVuY3Rpb25zLgorICAgICAgICAoc19kMzB2X2RhdGEsIHNfZDMwdl9zZWN0aW9uKTogTGlrZXdpc2UuCisgICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0uCisgICAgICAgIChtZF9iZWdpbik6IEluaXRpYWxpemUgZDMwdl9jdXJyZW50X2FsaWduX3NlZy4KKyAgICAgICAgKG1kX2Fzc2VtYmxlKTogQ2FsbCBkMzB2X2FsaWduIHdoZW4gbmVlZGVkIGJ5IGtub3duIGN1cnJlbnQgYWxpZ25tZW50LgorICAgICAgICAoZDMwdl9mcm9iX2xhYmVsLCBkMzB2X2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb25zLgorICAgICAgICAqIGNvbmZpZy90Yy1kMzB2LmggKG1kX2RvX2FsaWduKTogUmVtb3ZlLgorICAgICAgICAodGNfZnJvYl9sYWJlbCk6IENhbGwgZDMwdl9mcm9iX2xhYmVsLgorICAgICAgICAobWRfY29uc19hbGlnbik6IE5ldy4KKworCSogY29uZmlnL3RjLWQzMHYuYyAoZmluZF9mb3JtYXQpOiBDb252ZXJ0IGNvbXBsZXggZXhwcmVzc2lvbnMgdG8gCisJZXhwcmVzc2lvbiBzeW1ib2xzIGJlZm9yZSBwcm9jZXNzaW5nLiAgQ2xlYW4gdXAgY29kZSBmb3JtYXR0aW5nLgorCitTdW4gTWF5IDEwIDIyOjM1OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KKworVGh1IE1heSAgNyAxNTo0OTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlICJicmEiIGp1c3QgbGlrZSAiam1wIgorCWluc3RydWN0aW9ucy4KKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCisKK1RodSBNYXkgIDcgMTE6NDc6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IFVwZGF0ZSB3aXRoIGBtYWtlIGRlcC1hbScuCisJKEhGSUxFUyk6IEFkZCBjZ2VuLmguCisJKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmguCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEb24ndCBwYXNzIG5ld2xpbmUgdG8gYXNfd2Fybl93aGVyZS4KKworVGh1IE1heSAgNyAxMzoyMDo1NiAxOTk4ICBBbmRlcnMgQmxvbWRlbGwgIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+CisKKwkqIGdhc3AuYyAoZ3JhYl9sYWJlbCk6IFBlcm1pdCBhIGxhYmVsIHRvIGJlIGEgcHJlcHJvY2Vzc29yCisJdmFyaWFibGUgYnkgcGVybWl0dGluZyBhIGxhYmVsIHRvIHN0YXJ0IHdpdGggYSBiYWNrc2xhc2guCisKK1RodSBNYXkgIDcgMTI6NTA6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAodmFsaWRhdGVfbWlwc19pbnNuKTogUmVtb3ZlZCBoYWNrCisJZm9yIHByZXZpb3VzbHkgaW5hY2Nlc3NpYmxlIGJpdGZpZWxkcyBpbiBzb21lIElOU05fVFJBUAorCWluc3RydWN0aW9ucy4KKworVGh1IE1heSAgNyAxMToxMzowMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFib3J0IHdpdGggZXJyb3IgbWVzc2FnZQorCWlmIG9wY29kZSBvcGVyYW5kcyBkbyBub3QgbWF0Y2guCisJCitUaHUgTWF5ICA3IDA5OjM2OjA2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLCB2YWxpZGF0ZV9taXBzX2luc24pOiBJbXBsZW1lbnQKKwkncScgb3BlcmFuZCBmb3JtYXQgZm9yIDIwLWJpdCAiYnJlYWsiLyJzZGJicCIgaW5zdHJ1Y3Rpb25zLgorCShtaXBzX2lwKTogVHJ1bmNhdGUgb3ZlcmZsb3dlZCAiYnJlYWsiICdjJyBvcGVyYW5kLiAgSW1wbGVtZW50CisJc2ltaWxhciBuZXcgJ3EnIG9wZXJhbmQuCisKK1RodSBNYXkgIDcgMDc6NDc6MTQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBGaXggdHlwby4KKworVGh1IE1heSAgNyAwMjoxOToxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY2dlbi5oOiBOZXcgZmlsZS4KKwkqIGNnZW4uYzogSW5jbHVkZSBpdC4KKwkoTUFYX0ZJWFVQUyk6IFJlbmFtZWQgdG8gQ0dFTl9NQVhfRklYVVBTLgorCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFJlc3VsdCBpcyBub3cgdm9pZC4gIE5ldyBhcmcgYHJlc3VsdCcuCisJQWxsIGNhbGxlcnMgdXBkYXRlZC4KKwkqIGNvbmZpZy90Yy1tMzJyLmM6IEluY2x1ZGUgY2dlbi5oLgorCShtMjNyX2luc24pOiBOZXcgbWVtYmVycyBudW1fZml4dXBzLGZpeHVwcy4KKworV2VkIE1heSAgNiAxNjoyOToxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNsaWdodGx5IHJld29yayBzb21lIGNvZGUKKwl0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgorCitXZWQgTWF5ICA2IDE1OjI2OjM0IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCisJY2FsbGluZyBtYWtlLgorCisgICAgICAgICogbWFrZWZpbGUudm1zIChPQkpTKTogQWRkIGVob3B0Lm9iagorCitXZWQgTWF5ICA2IDE1OjExOjEyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBkb2MvYy12YXgudGV4aTogQ29ycmVjdCBhbmQgZXh0ZW5kIHZheC92bXMgZG9jdW1lbnRhdGlvbi4KKworV2VkIE1heSAgNiAxMTo1MTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFjY2VwdCBhIG5ldyBwYXJhbWV0ZXIgcmVxdWVzdGluZworCWEgc2hvcnQgZm9ybWF0IGluc24uCisJKG1kX2Fzc2VtYmxlKTogU2V0IGl0IGZvciBleHBsaWNpdGx5IHBhY2tlZCBpbnNucy4KKwkKK1R1ZSBNYXkgIDUgMTM6MjM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogRG8gbm90IHRha2UgYWRkcmVzcyBvZgorCW5hdGl2ZSBmaWVsZHMgd2hlbiBwZXJmb3JtaW5nIHRoZSBtZW1jcHkuCisKK1R1ZSBNYXkgIDUgMTM6MTA6NDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvLG1hY3JvMik6IEltcGxlbWVudCAKKwlNX0RNVUxPX0ksIE1fTVVMT19JLCBNX0RNVUxPVV9JLCBhbmQgTV9NVUxPVV9JLgorCitNb24gTWF5ICA0IDE3OjQ5OjE0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWcvdGMtbTY4ay5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBDaGFuZ2VkIHRvIGtlZXAKKwlyZWxvY2F0aW9ucyBhZ2FpbnN0IGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlbGF4YWJsZV9zeW1ib2wpOiBOZXcgbWFjcm8uCisJKG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXNlIGl0LgorCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogQWxzbyBoYW5kbGUgd2VhayBzeW1ib2xzLgorCitNb24gTWF5ICA0IDE2OjEyOjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogS2VlcCByZWxvY3MgZm9yIGFsbAorCXJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogV2hlbiBPQkpfRUxGLCBkb24ndCBhZGQgdGhlCisgCXZhbHVlcyBpbiB0d2ljZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCisgCWV4dGVybmFsbHkgZGVmaW5lZC4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0FPVVRdOiBXaGVuIFBJQywKKwlkb24ndCBhZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZQorCXN5bWJvbC4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogV2hlbiBnZW5lcmF0aW5nIGEub3V0IFBJQywKKwlmb3IgYSBQQyByZWxhdGl2ZSBmaXh1cCBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBkZWZpbmVkCisJc3ltYm9sLCBhcnJhbmdlIHRvIHN0b3JlIG9iamVjdCBmaWxlIGFuZCBhZGRlbmQgdmFsdWVzIGFzIHRob3VnaAorCXRoZSBzeW1ib2wgd2VyZSBub3QgZGVmaW5lZC4KKwkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCisKK1RodSBBcHIgMzAgMTM6MDk6MzkgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+CisKKwkqIHJlYWQuYyAoc2l6ZW9mX2xlYjEyOCk6IFJlZmVyZW5jZWQgZXh0ZXJuYWxseSBieSB3cml0ZS5jIHNvCisJZG9uJ3QgaW5saW5lLgorCitXZWQgQXByIDI5IDE1OjQ1OjU3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jICh7LGV4cGFuZF99ZGVidWdfc3ltKTogTmV3IGZ1bmN0aW9ucyB0byByZWNvcmQKKwlhbmQgZXhwYW5kIGEgJ2RlYnVnJyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uCisJdGhhdCBkb2VzIG5vdCBjYXVzZSBhIHNob3J0IGluc3RydWN0aW9uIHRvIGJlIGZpbGxlZCB3aXRoIGEgTk9QLgorCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgLmRlYnVnc3ltLgorCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQWRkIGNhbGxzIHRvIGV4cGFuZF9kZWJ1Z19zeW0gYXMKKwlhcHByb3ByaWF0ZS4KKwkobWRfYXNzZW1ibGUpOiBEaXR0by4KKworVHVlIEFwciAyOCAxOToxNjoyNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGFzLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgorCSogZ2FzcC5jIChtYWluKTogTGlrZXdpc2UuCisJKiBhc2ludGwuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCisJKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgorCitUdWUgQXByIDI4IDE4OjMzOjIzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IGdldHRleHQgdHlwby4KKwkKK1R1ZSBBcHIgMjggMTI6MTY6MzAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaHBwYS5jOiBDaGFuZ2UgYWxsIGNhbGxzIHRvIGJ6ZXJvIHRvIHVzZSBtZW1zZXQuCisJKHBhX2lwKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KKwkodGNfZ2VuX3JlbG9jLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KKwkocGFfZmluZF9zcGFjZV9ieV9udW1iZXIpOiBMaWtld2lzZS4KKwkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCisJKHBhX2Jsb2NrKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgorCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb3B5cmlnaHQpOiBEZWNsYXJlLgorCitUdWUgQXByIDI4IDExOjM1OjU2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IERvIG5vdCB1c2UgZHVtbXkgZmlyc3RfbGluZW5vCisJZm9yIGxpbmUgbnVtYmVycyBmb3IgYXNzZW1ibHkgc291cmNlLgorCitNb24gQXByIDI3IDE1OjU4OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworTW9uIEFwciAyNyAxMjowNzozMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IE5ldyBhcmcgcmVsYXhfcC4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCisKK01vbiBBcHIgMjcgMTU6MTY6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5oOiBDaGFuZ2Ugc3ltYm9sUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBzdHJ1Y3QKKwlzeW1ib2wuCisKK1N1biBBcHIgMjYgMTM6NDQ6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggaTE4biB0eXBvLgorCitTYXQgQXByIDI1IDIwOjEyOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9jdXJfcHJvY19zeW0pOiBOZXcgZnVuY3Rpb24uCisJKiBlY29mZi5oOiBQcm90b3lwZSBpdC4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jIFtFTEZdIChzX2FscGhhX3Byb2xvZ3VlKTogTmV3IGZ1bmN0aW9uLgorCVtFVkFYXSAoc19hbHBoYV9wcm9sb2d1ZSk6IERlbGV0ZS4KKwkobWRfcHNldWRvX3RhYmxlKTogVXBkYXRlLgorCitTYXQgQXByIDI1IDE0OjAwOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWk5NjAuYyAobWRfYXNzZW1ibGUpOiBDaGFuZ2UgYnBfZXJyb3JfbXNnIGZyb20gc3RhdGljCisJYXJyYXkgdG8gbG9jYWwgcG9pbnRlci4KKwkoZ2V0X2FyZ3MsIHBhcnNlX2V4cHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCisKK0ZyaSBBcHIgMjQgMTI6NDc6NDIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIHJlYWQuYyAoc19zZXQpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlIHRvIGZyYWdTICouCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRnVuY3Rpb24gbWFkZSBzdGF0aWMgdG8gbWF0Y2gKKwlwcmV2aW91cyBmb3J3YXJkIGRlY2xhcmF0aW9uLgorCShpbnNlcnRfcmVnLCBpbml0X3JlZ3RhYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IExpa2V3aXNlLgorCitGcmkgQXByIDI0IDA5OjI2OjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdG8gZXJyb3IKKwlzdHJpbmdzLiAgCisKKwkqIGNvbmZpZy90Yy1tMzJyLmMgKGNhbl9tYWtlX3BhcmFsbGVsKTogQWRkIGludGVybmF0aW9uYWxpc2F0aW9uCisJbWFjcm9zIHRvIGVycm9yIHN0cmluZ3MuCisKK1RodSBBcHIgMjMgMTk6MjM6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IENvcnJlY3QgdGVzdCBvZiB3aGV0aGVyIGEKKwlyZWxvYyBpcyBpbiB0aGUgVE9DIGNzZWN0LgorCShtZF9hcHBseV9maXgzKTogQ29ycmVjdCBnZXR0ZXh0IHR5cG8uCisKK1RodSBBcHIgMjMgMTQ6NTg6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jIChmaW5kX3JlYWxfc3RhcnQpOiBJZ25vcmUgc3ltYm9scyBzdGFydGluZyB3aXRoCisJLkwgLSB0aGV5IGFyZSBsb2NhbCBsYWJlbHMgYW5kIHRoZSBicmFuY2hlcyBhcmUgbm90IHJlYWxseQorCWZ1bmN0aW9uIGNhbGxzIGJ1dCByYXRoZXIgZmFyIGp1bXBzLgorCitXZWQgQXByIDIyIDE1OjU3OjIxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KKworV2VkIEFwciAyMiAxNDo1MjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUHJpbnQgb3BlcmFuZCBudW1iZXIgcmF0aGVyIHRoYW4KKwl1c2luZyBvcmRpbmFsX25hbWVzLgorCShpMzg2X29wZXJhbmQpOiBMaWtld2lzZS4KKworVHVlIEFwciAyMSAyMjozNDoyNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoSU5UTExJQlMpOiBEZWZpbmUgdG8gd29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UKKwlidWcuCisJQWxsIE1ha2VmaWxlczogUmVnZW5lcmF0ZWQuCisKKwkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQorCXN0cmluZ3MuCisJKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCisJSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KKwkqIGRlcC1pbi5zZWQ6IEFkZGVkIGFzaW50bC5oLgorCSogcG8vTWFrZS1pbjogTmV3IGZpbGUuCisJKiBnYXNwLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgorCUluY2x1ZGUgImFzaW50bC5oIi4KKwkqIHJlYWQuYyAoWl8pOiBSZW5hbWVkIGZyb20gYF8nLgorCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KKwkoUE9URklMRVMpOiBuZXcgbWFjcm8uCisJKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KKwkoJChPQkpTKSk6IEFkZGVkIGFzaW50bC5oLgorCShIRklMRVMpOiBMaWtld2lzZS4KKwkoSU5DTFVERVMpOiBBZGRlZCAtRExPQ0FMRURJUiwgLUkkKHRvcF9zcmNkaXIpLy4uL2ludGwuCisJKGFzX25ld19MREFERCk6IEFkZGVkICQoSU5UTExJQlMpLgorCShhc19uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgJChJTlRMREVQUykuCisJKGdhc3BfbmV3X0xEQUREKTogQWRkZWQgJChJTlRMTElCUykuCisJKGdhc3BfbmV3X0RFUEVOREVOQ0lFUyk6IE5ldyBtYWNyby4KKwkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIEdlbmVyYXRlIHBvL01ha2VmaWxlLmluIGFuZAorCXBvL01ha2VmaWxlLgorCShBTExfTElOR1VBUyk6IERlZmluZS4KKwkqIG1hY3JvLmM6IEluY2x1ZGUgImFzaW50bC5oIi4KKwkqIGFzLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgorCSogYXMuaDogSW5jbHVkZSAiYXNpbnRsLmgiLgorCSogY29uZmlnL3RjLWkzODYuYyAob3JkaW5hbF9uYW1lcyk6IFJlbW92ZWQuCisJKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBlcnJvciB0ZXh0IHRvIGF2b2lkIG9yZGluYWxfbmFtZXMuCisJKGkzODZfb3BlcmFuZCk6IExpa2V3aXNlLgorCShyZWxvYyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgorCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1hcm0uYyAoYmFkX2FyZ3MpOiBOb3cgYSAjZGVmaW5lLgorCShiYWRfcGMpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19zdGFiX3BhcnNlKTogQ2hhbmdlZCB0eXBlIG9mCisJYGxvbmdfY29uc3RfbXNnJy4KKwkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBVbmlmaWVkIHN0cmluZ3MgdG8gYXZvaWQgaTE4bgorCXByb2JsZW1zLgorCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X3JlbG9jX2NvZGUpOiBBZGRlZCBzb21lIGFzX2JhZCBjYWxscyB0bworCWF2b2lkIGkxOG4gcHJvYmxlbXMuCisJKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIGFzX2JhZF93aGVyZSB0byBhdm9pZAorCWkxOG4gcHJvYmxlbXMuCisJKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4KKwlwcm9ibGVtcy4KKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBDKysgY29tbWVudCBpbnRvIEMKKwljb21tZW50LgorCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEFkZGVkIGFzX3dhcm4gdG8gYXZvaWQgaTE4bgorCXByb2JsZW1zLgorCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IEFkZGVkIGFuIGZwcmludGYgdG8gYXZvaWQgaTE4bgorCXByb2JsZW1zLgorCSogY29uZC5jIChjb25kX2ZpbmlzaF9jaGVjayk6IEFkZGVkIGFzX2JhZCBjYWxsIHRvIGF2b2lkIGkxOG4KKwlwcm9ibGVtcy4KKwkqIGV4cHIuYyAoZXhwcik6IEFkZGVkIGFzX3dhcm4gY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgorCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogQ2hhbmdlZCBjb2RlIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCisJKGFzX2Fib3J0KTogTGlrZXdpc2UuCisJKiByZWFkLmMgKHBzZXVkb19zZXQpOiBBZGRlZCBhc19iYWQgY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgorCShzX3NwYWNlKTogTGlrZXdpc2UuCisJKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgorCitUdWUgQXByIDIxIDE3OjAxOjIyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogY29uZmlnL3RjLWkzODYuYyAoY2hlY2tfcHJlZml4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQgb3V0CisJZnJvbSBtZF9hc3NlbWJsZS4KKwkoc3RydWN0IF9pMzg2X2luc24pOiBBZGQgd2FpdF9wcmVmaXggZmllbGQuCisJKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHdhaXRfcHJlZml4IGxvY2FsIHZhcmlhYmxlLiAgVXNlCisJY2hlY2tfcHJlZml4IHdoZW4gYWRkaW5nIGEgcHJlZml4LgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIGN1cnJlbnRfdGVtcGxhdGVzIGxvY2FsIHZhcmlhYmxlLgorCShtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kKTogSW1wcm92ZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBpbgorCW1hbnkgcGxhY2VzLiAgQWRkIFJFU1RPUkVfRU5EX1NUUklORyBpbiBtYW55IHBsYWNlcyBiZWZvcmUgZXJyb3IKKwlyZXR1cm4uICBDbGFyaWZ5IHNvbWUgY29tbWVudHMuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogQ2hhbmdlIHNlZyBmaWVsZCB0byBhIHR3bworCWVsZW1lbnQgYXJyYXkuCisJKG1kX2Fzc2VtYmxlKTogUGFyc2Ugc3RyaW5nIGluc3RydWN0aW9uIG9wZXJhbmRzLCBsb29raW5nIGZvcgorCXNlZ21lbnQgb3ZlcnJpZGUgcHJlZml4ZXMuICBDaGVjayBmb3IgaW52YWxpZCBzZWdtZW50IHByZWZpeGVzIG9uCisJc3RyaW5nIGluc3RydWN0aW9uLgorCShpMzg2X29wZXJhbmQpOiBpLnNlZ1tdIGFuZCBtYXggbWVtX29wZXJhbmQgY2hhbmdlcyBmb3Igc3RyaW5nCisJaW5zbnMuCisJKiBjb25maWcvdGMtaTM4Ni5oIChFc1NlZyk6IERlZmluZS4KKworCSogY29uZmlnL3RjLWkzODYuaCAocmVnS2x1ZGdlKTogRGVmaW5lLgorCShpY2xyS2x1ZGdlLCBpbXVsS2x1ZGdlKTogRG9uJ3QgZGVmaW5lLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBNZXJnZSBpbXVsS2x1ZGdlIGFuZCBpY2xyS2x1ZGdlCisJY29kZS4gIE1vdmUgUmV2ZXJzZVJlZ1JlZ21lbSBmdWRnZXMgaW50byBNb2RybSBjYXNlLiAgUmVvcmRlcgorCW9wY29kZV9tb2RpZmllciBjaGVja3MgdG8gbG9vayBmb3IgbW9yZSBjb21tb24gY2FzZXMgZmlyc3QuICBBZGQKKwlkZWZhdWx0X3NlZyBmb3IgSXNTdHJpbmcgY2FzZS4KKworVHVlIEFwciAyMSAxNjoxODoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xFWCByYXRoZXIgdGhhbiBBQ19QUk9HX0xFWCBhbmQKKwlBQ19ERUNMX1lZVEVYVC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBhbmQgbGlidG9vbC4KKwkqIGFjbG9jYWwubTQsIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KKworCSogZG9jL01ha2VmaWxlLmFtIChhcy5kdmkpOiBOZXcgdGFyZ2V0LgorCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitTYXQgQXByIDE4IDAxOjIxOjA0IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCisJCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJCisJKiBjb25maWcvdGMtc3BhcmMuYyAobG9va3VwX2FyY2gpOiBBZGRlZCBhcmNoX3R5cGUgdG8gc3RydWN0CisJc3BhcmNfYXJjaC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogV2FybiBpZiAtRUwgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChTUEFSQ19CSUVORElBTikgQWx3YXlzIGRlZmluZS4KKwkKK1NhdCBBcHIgMTggMDE6MTk6MDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE5vdGUgd2hlbiB3ZSB1c2UgZ2V0IG1hdGNoIG9uCisgICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIG5hbWUuCisKK1dlZCBBcHIgMTUgMTU6MTc6MjcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSkgW09fc3ltYm9sXTogQWxzbyBzdG9yZSB0aGUgc3ltYm9sCisJYmFjayBpbnRvIHRoZSBleHByZXNzaW9uIHRvIGhhbmRsZSBhZGQvc3ViIHNpbXBsaWZpY2F0aW9uIGNvcnJlY3RseS4KKworV2VkIEFwciAxNSAwNzowNjowNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IFJlbW92ZSA0MzAwLgorCitNb24gQXByIDEzIDE2OjUxOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fbXNyKTogU3VwcG9ydCB1bmRvY3VtZW50ZWQgJ21zciBjcHNyX2ZsZywKKwkjPG4+JyBpbnN0cnVjdGlvbi4KKworVGh1IEFwciAgOSAxMDoyOTo0MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKG1heF9pbmRlbnRfbGV2ZWwpOiBOZXcgZ2xvYmFsLgorCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IFVzZSBpdC4KKwkqIGV4cHIuaCAoZXhwcl9idWlsZF9kb3QpOiBEZWNsYXJlLgorCSogZXhwci5jIChleHByX2J1aWxkX2RvdCk6IE5ldyBmdW5jdGlvbi4KKworV2VkIEFwciAgOCAxNjoxNjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKHByaW50X2JpbmFyeSk6IE5ldyBmdW5jdGlvbi4KKwkocHJpbnRfZXhwcl8xKTogQ2FsbCBpdC4KKworTW9uIEFwciAgNiAxMjowNjozOSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAiI0IiKTogSW5zdGFsbCB0aGUgb2Zmc2V0IG9mIHRoZQorCW9wZXJhbmQgaW4gdGhlIG9wY29kZS4KKworRnJpIEFwciAgMyAxMTo1ODoxOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGNvbmZpZy90Yy1pMzg2Lmg6IFJlb3JkZXIgb3BlcmFuZCBmbGFncyBhbmQgb3Bjb2RlIG1vZGlmaWVyCisJZmxhZ3MgZm9yIGNsYXJpdHkuICBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zOiBVbmtub3duLAorCUltbVVua25vd24sIERpc3BVbmtub3duLCBOb01vZHJtLgorCSogY29uZmlnL3RjLWkzODYuYyAodHlwZV9uYW1lcyk6IEFkZCBtaXNzaW5nIERlYnVnIHR5cGUuCisJKG1kX2Fzc2VtYmxlKTogQmV0dGVyIGR1cGxpY2F0ZSBwcmVmaXggY2hlY2tpbmcuICBRdWlja2VyIHN0cmluZworCWluc3RydWN0aW9uIGNoZWNrIHZpYSBuZXcgb3Bjb2RlX21vZGlmaWVyIGZsYWcuCisKK0ZyaSBBcHIgIDMgMTE6NDQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbyAoSW52b2tpbmcpOiBDbGFyaWZ5IC1XYSBleGFtcGxlLgorCitGcmkgQXByICAzIDA5OjEyOjIzIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjZXR1cy5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCB3ZWFrZXh0IGVudHJ5LiAKKwkoc19taXBzX3dlYWtleHQpOiBEZWZpbmUuCisJKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IERvbid0IGRlZmluZSBpZiBkZWZpbmVkKFRDX01JUFMpLgorCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRG9uJ3QgYWRkIHdlYWtleHQgaWYgCisJZGVmaW5lZChUQ19NSVBTKS4JCisJCitUaHUgQXByICAyIDIyOjQyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMKKwlpcyBhbiBlcnJvciBpZiB0aGUgdmFsdWUgY2FuIG5vdCBiZSBjb21wdXRlZCBhdCBhc3NlbWJseSB0aW1lLgorCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuLXJlbG9jKTogTGlrZXdpc2UuCisKK1RodSBBcHIgIDIgMTY6MzY6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXNwLmMgKG1haW4pOiBTZXQgbmV4dCBmaWVsZCBvZiBuZXcgaW5jbHVkZV9wYXRoIHN0cnVjdHVyZSB0bworCU5VTEwuICBGcm9tIEF2ZXJ5IFBlbm5hcnVuIDxhdmVyeXBAZ2RjLmNhPi4KKworCSogcmVhZC5jIChzX21yaV9zZWN0KTogQ2FsbCBhc19iYWQgcmF0aGVyIHRoYW4gYWJvcnQgZm9yIGFuCisJdW5zdXBwb3J0ZWQgTVJJIHRhcmdldC4KKworV2VkIEFwciAgMSAxMTowODoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKGFybV92YWxpZGF0ZV9maXgpOiBOZXcgZnVuY3Rpb24uICBEZXRlcm1pbmUgaWYKKwl0aGUgZGVzdGluYXRpb24gb2YgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFsdGVyZWQuCisJKGZpbmRfcmVhbF9zdGFydCk6IE5ldyBmdW5jdGlvbjogIExvY2F0ZSB0aGUgcmVhbCwgVGh1bWIgY29kZWQKKwlzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgorCShkb190X2JyYW5jaDIzKTogQWx0ZXIgdGhlIGRlc3RpbmF0aW9uIG9mIGJyYW5jaGVzIHRvIFRodW1iCisJZnVuY3Rpb25zLiAKKworCSogY29uZmlnL3RjLWFybS5oOiBEZWZpbmUgVENfVkFMSURBVEVfRklYLgorCitUdWUgTWFyIDMxIDEzOjI3OjMzIDE5OTggIERlYW4gTS4gRGVhdmVyICA8ZGVhdmVyQGFtdC50YXkxLmRlYy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAoZGVjb2RlX3NoaWZ0KTogSGFuZGxlIGFkZHJlc3NpbmcgbW9kZSAyIHcvcnJ4CisJYWxzby4KKworV2VkIEFwciAgMSAxMzoxMzoyMCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZG9jL2FzLnRleGluZm86IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KKwkqIGRvYy9jLWhwcGEudGV4aTogTGlrZXdpc2UuCisKK1R1ZSBNYXIgMzEgMTc6NTI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogTWFrZWZpbGUuYW0gKERFUF9JTkNMVURFUyk6IE5ldyB2YXJpYWJsZS4KKwkoLmRlcDEpOiBDaGFuZ2UgdG8gd29yayB3aGVuIHNyY2RpciBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4KKwkoLnRjZGVwLCAub2JqZGVwLCAuZGVwMiwgZGVwLnNlZCk6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK01vbiBNYXIgMzAgMTI6NDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5oLCBjb25maWcvdGMtaTM4Ni5jOiBSZXZlcnQgTWFyY2ggMjQKKwlMaW5lYXJBZGRyZXNzIHBhdGNoLgorCisJKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCisKK01vbiBNYXIgMzAgMTE6MjI6MDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChGV2FpdCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBmd2FpdCBwcmVmaXggYmVmb3JlIGFueQorCW90aGVyIHByZWZpeGVzLiAgQ2hlY2sgRldhaXQgZmxhZyBpbiBvcGNvZGUgdGFibGUgdG8gc2VlIHdoaWNoCisJaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgYW4gZndhaXQgcHJlZml4LgorCitNb24gTWFyIDMwIDEwOjEyOjAwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGNyZWF0ZSBhIHN0YWIgc3RyaW5nCisJc2VjdGlvbi4KKworU2F0IE1hciAyOCAyMjoyODowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6CisJKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBMaWtld2lzZS4KKwkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IExpa2V3aXNlLgorCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IExpa2V3aXNlLgorCSogZ2FzcC5jIChsZXZlbF8wLCBjaGFuZ2VfYmFzZSwgZG9pbnN0cik6IExpa2V3aXNlLgorCSogaGFzaC5jIChoYXNoX2Fzayk6IExpa2V3aXNlLgorCSogbGlzdGluZy5jIChsaXN0aW5nX3BhZ2UsIGNhbGNfaGV4LCBwcmludF9saW5lcyk6IExpa2V3aXNlLgorCShkZWJ1Z2dpbmdfcHNldWRvKTogTGlrZXdpc2UuCisJKiBtYWNyby5jIChkZWZpbmVfbWFjcm8sIGNoZWNrX21hY3JvKTogTGlrZXdpc2UuCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbiwgc19mbG9hdF9zcGFjZSk6IExpa2V3aXNlLgorCShpZ25vcmVfcmVzdF9vZl9saW5lLCBmbG9hdF9jb25zKTogTGlrZXdpc2UuCisJKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogTGlrZXdpc2UuCisJKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50LCBjdnNfZnJhZ190b19maWxsKTogTGlrZXdpc2UuCisJKGZpeHVwX3NlZ21lbnQsIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBMaWtld2lzZS4KKwkobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IExpa2V3aXNlLgorCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbiwgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KKwkoc3BhcmNfaXAsIHBhcnNlX2tleXdvcmRfYXJnLCBzX2NvbW1vbik6IExpa2V3aXNlLgorCSogcmVhZC5jIChvdXRwdXRfYmlnX3NsZWIxMjgpOiBJbml0aWFsaXplIGxvY2FscyB0byBhdm9pZAorCXdhcm5pbmdzLgorCShvdXRwdXRfYmlnX3VsZWIxMjgsIGVxdWFscyk6IExpa2V3aXNlLgorCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENoYW5nZSBudW1iZXJfb2ZfZGlnaXRzXyogbG9jYWxzCisJdG8gdW5zaWduZWQgaW50LiAgQ2hhbmdlIHplcm9zIHRvIHVuc2lnbmVkIGludC4KKwkqIGNvbmQuYyAoc19pZik6IEFkZCByZXR1cm4gdG8gZGVmYXVsdCBjYXNlLgorCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGFkZHJlc3NULgorCSogZnJhZ3MuaCAoZnJhZ19ub3dfZml4KTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogbGlzdGluZy5jIChmaWxlX2luZm9fc3RydWN0KTogQ2hhbmdlIGxpbmVudW0gdG8gdW5zaWduZWQgaW50LgorCShzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IENoYW5nZSBobGxfbGluZSB0byB1bnNpZ25lZCBpbnQuCisJKHByaW50X3NvdXJjZSk6IFVwZGF0ZSBmb3JtYXQgc3RyaW5nLgorCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDaGFuZ2Ugc2NhbiB0byB1bnNpZ25lZCBpbnQsIGFuZCBkb24ndAorCWJvdGhlciB0byBpbml0aWFsaXplIGl0LgorCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQgbG9uZy4KKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCBsYWJlbCByZWR1Y2VfZml4dXAuCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWVtb3J5X21vZGVsKTogT25seSBkZWZpbmUgaWYgT0JKX0VMRi4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgcmV0dXJuIHRvIGRlZmF1bHQgY2FzZS4KKworRnJpIE1hciAyNyAxMjo0Njo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGVjayBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzIGZvcgorIAltY2Y1MjAwIGp1c3QgYXMgd2UgZG8gZm9yIG02ODAwMC4KKwkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KKwkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KKworRnJpIE1hciAyNyAxMDozMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiAgU3RvcmUgcmVsb2NhdGlvbiBhZGRlbmQgaW4KKwlmaXh1cCBpbnN0ZWFkIG9mIGluc3RydWN0aW9uLgorCitUaHUgTWFyIDI2IDIzOjA3OjE4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBTd2FwIHRlbXBsYXRlIGFyZ3VtZW50cyB0bworCUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggbWFjcm8gaW4gcmV2ZXJzZSBkaXJlY3Rpb24gdGVzdC4KKwlUaGlzIG1hY3JvIGlzIGN1cnJlbnRseSBzeW1tZXRyaWMsIHNvIHBhc3NpbmcgdGhlbSB0aGUgd3JvbmcKKwl3YXkgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtLCBidXQgbWF5IGlmIHRoZSBtYWNybyBpcyBjaGFuZ2VkCisJaW4gdGhlIGZ1dHVyZS4KKwlBZnRlciBjb3B5aW5nIHRlbXBsYXRlIHRvIGkudG0sIHVzZSBpLnRtLiByYXRoZXIgdGhhbiB0LT4gdG8KKwlhY2Nlc3MgZmllbGRzLCBhbmQgbWFrZSB0IGEgY29uc3QqCisJTW92ZSBpLnRtLm9wZXJhbmRfdHlwZXNbXSBzd2FwIHRvIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb3B5LgorCitXZWQgTWFyIDI1IDEzOjQ0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGV4cHIuaCAoZXhwcl9idWlsZF91Y29uc3RhbnQpOiBBZGQgcHJvdG90eXBlLgorCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogQWRkIHByb3RvdHlwZXMuCisJKiBleHByLmMgKGV4cHJfYnVpbGRfdWNvbnN0YW50KTogTmV3IGZ1bmN0aW9uLgorCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogTmV3IGZ1bmN0aW9ucy4KKworV2VkIE1hciAyNSAxMzoxMDo0MiAxOTk4ICBCcnVubyBIYWlibGUgIDxicnVub0BsaW51aXgubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgorCisgICAgICAgICogZ2FzcC5jIChJUyopOiBDYXN0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIsIG5vdCB1bnNpZ25lZCBpbnQuCisgICAgICAgICogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgKiBtZXNzYWdlcy5jIChhc193YXJuKTogTGlrZXdpc2UuCisJKGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlKTogTGlrZXdpc2UuCisKK1dlZCBNYXIgMjUgMTI6NTk6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgorCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KKwkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitUdWUgTWFyIDI0IDE2OjUxOjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2NsZWFudXAsIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogQ2FsbAorCW0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2suCisKKwkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgZnVuY3Rpb24gdG8KKwllbWl0IGEgbm9wIGlmIGEgc2VjdGlvbiBlbmRzIHdpdGggYSAxNiBiaXQgaW5zdHJ1Y3Rpb24uCisKK1R1ZSBNYXIgMjQgMTk6NDg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfYnNzKTogQ29tcGlsZSB1bmNvbmRpdGlvbmFsbHkuICBDYWxsCisJc19sY29tbSByYXRoZXIgdGhhbiBvYmpfY29mZl9sY29tbS4KKwkob2JqX3BzZXVkb190YWJsZSk6IENvbXBpbGUgLmJzcyBwc2V1ZG8tb3AgdW5jb25kaXRpb25hbGx5LgorCitUdWUgTWFyIDI0IDE4OjMwOjU4IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KKworCSogY29uZmlnL3RjLWkzODYuaCAoTGluZWFyQWRkcmVzcyk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSWYgTGluZWFyQWRkcmVzcyBpcyBzZXQgZm9yIHRoZQorCWluc3RydWN0aW9uLCBkb24ndCB1c2UgYSBkZWZhdWx0IHNlZ21lbnQuCisKK01vbiBNYXIgMjMgMTg6NTM6NDAgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBNYXIgMjAgMTk6MTU6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KKworVGh1IE1hciAxOSAxNjowMzoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBmaXggY29kZSB0byB0ZXN0IHRoZSByYW5nZSBvZgorCVBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uLiAKKworCQorV2VkIE1hciAxOCAwOToyOTo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgorCisJKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgorCisxOTk4LTAzLTE3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogaXRibC1sZXgubCAoeXl3cmFwKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZCBhcyBhCisJbWFjcm8uCisKK0ZyaSBNYXIgMTMgMTY6MzE6MzggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBkZXBlbmQuYyAocXVvdGVfc3RyaW5nX2Zvcl9tYWtlKTogTmV3IGZ1bmN0aW9uLgorCSh3cmFwX291dHB1dCk6IFVzZSBpdC4KKworVGh1IE1hciAxMiAxODoyODoyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgYnNzIGZsYWcgaW4gc2VnX2luZm8KKwlzdHJ1Y3R1cmUgaWYgdHlwZSBpcyBTSFRfTk9CSVRTLiAgW0J1ZyBmaXggY291cnRlc3kgb2YgcnRoXQorCitTYXQgRmViIDI4IDE3OjI4OjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLCBtZF9wYXJzZV9vcHRpb24pOgorCVJlY29nbml6ZSAtR04gYW5kIC1yZWxheC4KKwkobWRfYmVnaW4pOiBJbml0aWFsaXplIGdwIHNpemUgZnJvbSAtRyBzd2l0Y2guCisJKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBBbHdheXMgZm9yY2UgaWYgLXJlbGF4LgorCShhbHBoYV9hbGlnbik6IFRha2UgYSBuZXcgYXJndW1lbnQgdGhhdCB3aWxsIHNwZWNpZnkgd2hlbiB0byAKKwllbWl0IGFuIFJfQUxQSEFfQUxJR04gcmVsb2NhdGlvbiAodGhvdWdoIHdlIGRvbid0IGRvIHRoYXQgbm93KS4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMuICBFbWl0IG5vcCBhbGlnbm1lbnQgcGFkZGluZyBhcyBub3ArdW5vcCBwYWlyLgorCitTYXQgRmViIDI4IDE3OjA2OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgW1RDX0FMUEhBXTogSW5jbHVkZSA8ZWxmL2FscGhhLmg+LgorCSogY29uZmlnL3RjLWFscGhhLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTmV3LgorCitUaHUgRmViIDI2IDE1OjQ5OjA0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRGVsYXllZCBqc3IgaW5zdHJ1Y3Rpb25zIGRvbid0CisJcmVxdWlyZSBwYWRkaW5nIHRvIHRoZSBuZXh0IGxvbmcgd29yZCBib3VuZGFyeS4KKworTW9uIEZlYiAyMyAxMToyOTowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5jOiAjaW5jbHVkZSBzeW1jYXQuaC4KKwkqIGNvbmZpZy90Yy1tMzJyLmM6IExpa2V3aXNlLgorCitNb24gRmViIDIzIDEwOjI3OjQwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgY2FzZSAnUCcpOiBNYWtlICdQJyBhcmd1bWVudHMgYmUKKwlhYnNvbHV0ZSBleHByZXNzaW9ucyBpbnN0ZWFkIG9mICckJyBwcmVmaXhlZCByZWdpc3RlciBuYW1lcy4KKworU2F0IEZlYiAyMSAyMjozNjo1MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfc2V0KTogUmVjb3JkIGZpbGUgYW5kIGxpbmUgaW5mbyBmb3Igc3ltYm9scyB3aGVuIC1hcy4KKwkocHNldWRvX3NldCk6IERvbid0IG92ZXJ3cml0ZSB0aGF0IGR1bW15IGZyYWdtZW50LgorCitGcmkgRmViIDIwIDE1OjAzOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3Rpb24iLgorCShwcGNfbmFtZWRfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKK1RodSBGZWIgMTkgMjI6MjU6NDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogdGMtcHBjLmMgKHBwY19iaWVpKTogQ2FjaGUgdGhlIGxhc3Qgc3ltYm9sIHdlIGluc2VydGVkCisJc28gd2UgZG9uJ3QgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgbGlzdC4KKworVHVlIEZlYiAxNyAxNzowMjoxNSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBGb3IgdGhlIGV4cGxpY2l0bHkgcGFyYWxsZWwKKyAJY2FzZSwgYWxsb3cgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyB0byBtb2RpZnkgdGhlIHNhbWUgZmxhZworIAliaXRzLgorCitUaHUgRmViIDE5IDE2OjA4OjE1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXRlZ29yaXplIHN5bWJvbHMgYnkKKwl1bmRlZmluZWRfc2VjdGlvbiByYXRoZXIgdGhhbiBzeV9mcmFnLT5saW5lID09IE5VTEwuCisKK1dlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgorCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgorCitUdWUgRmViIDE3IDE4OjU4OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IERlbGV0ZSBjYWxsIHRvIHZhbGlkYXRlX29wZXJhbmQuCisJVGVzdCByZXN1bHQgb2YgaW5zZXJ0X29wZXJhbmQgZm9yIGVycm9yLgorCitGcmkgRmViIDEzIDE2OjQxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBBZGQgY3lnbnVzLgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCisJKiBkb2MvTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCisJKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBGZWIgMTMgMDA6NDc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IEhhbmRsZSBvcGVyYW5kIHR5cGUgJ0MnLgorCShtYWNybyk6IEZpeCBoYW5kbGluZyBvZiBNX0NPUFswLTNdLgorCitUaHUgRmViIDEyIDE0OjA2OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb3NzIEhhcnZleSA8cm9zc0B0ZXJhZmxvcC5jb20+OgorCSogbWFjcm8uYyAoSVNTRVApOiBPbmx5IHRyZWF0ICc8JyBhbmQgJz4nIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzCisJaWYgbWFjcm9fYWx0ZXJuYXRlIG9yIG1hY3JvX21yaS4KKwkoZ2V0c3RyaW5nKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGJ5dGUgY29uc3RhbnRzIGJldHdlZW4gPCBhbmQgPi4KKwkoZ2V0X2FueV9zdHJpbmcpOiAnPCcgb25seSBzdGFydHMgYSBzdHJpbmcgaWYgbWFjcm9fYWx0ZXJuYXRlIG9yCisJbWFjcm9fbXJpLgorCShtYWNyb19leHBhbmRfYm9keSk6IFBlcm1pdCBrZXl3b3JkIHBhcmFtZXRlcnMgZm9sbG93aW5nCisJcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgorCisJTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46CisJKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgorCSogY29uZmlnL3RlLW5ic2QuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogTW92ZSBmcm9tIGhlcmUuLi4KKwkqIGNvbmZpZy90Yy1kMTB2LmMgKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiAuLi50bworCWhlcmUsIGFuZCBtYWtlIHN0YXRpYy4KKworCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBPbmx5IHVzZSBzZWdfaW5mbyBpZgorCUJGRF9BU1NFTUJMRVIgb3IgTUFOWV9TRUdNRU5UUy4KKworCSogYXMuYyAoc2hvd191c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCisJKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBMaWtld2lzZS4KKwkqIGRvYy9hcy50ZXhpbmZvIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCisKK1dlZCBGZWIgMTEgMjM6MjY6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRG9uJ3QgdXNlIG1pcHMgSUlJIG9yIG1pcHMgSVYKKwlpbnNucyByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIGEgcG9pbnRlciBpZiB3ZSdyZSBpbiBtaXBzIEkgb3IKKwlNSVBTIElJIG1vZGUuCisgICAgICAgIChtYWNybywgbWFjcm8yLCBzX2NwcmVzdG9yZSwgc19jcGFkZCk6IExpa2V3aXNlLgorCitUaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+CisKK0ZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6CisJKiB0Yy1kMTB2LmMgKHBhcmFsbGVsX29rLCBmaW5kX29wY29kZSk6CisJU3BsaXQgT1BFUkFORF9BQ0MgaW50byBPUEVSQU5EX0FDQzAgYW5kIE9QRVJBTkRfQUNDMS4KKwlJbnRyb2R1Y2UgT1BFUkFORF9HUFIuCisKK1dlZCBGZWIgMTEgMTY6Mjg6MTMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChzX2ZpbGwpOiBIYW5kbGUgbm9uLWNvbnN0YW50IHJlcGVhdCBjb3VudHMgYnkgY3JlYXRpbmcKKwlhbiByc19zcGFjZSBmcmFnbWVudC4KKworVHVlIEZlYiAxMCAxODozMTozMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBlcnJvciBhZGRlZCBKYW4gMiAxOTk4CisJZnJvbSBhc19iYWQgdG8gYXNfd2Fybi4KKworVHVlIEZlYiAxMCAxODowNDowMCAxOTk4ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KKworCSogYXMuYzogKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFVzZSBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCisJKiBhcy5oOiBEZWZpbmUgZGVmYXVsdCB2YWx1ZXMgb2YgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQorCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogVXNlIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKKworVHVlIEZlYiAxMCAxNzo1ODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVob3B0LmMgKGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50KTogSWYgbm90IEJGRF9BU1NFTUJMRVIsIHVzZQorCXNlZ19maXhfcm90UCByYXRoZXIgdGhhbiBmaXhfcm9vdCBmcm9tIHNlZ19pbmZvLgorCitUdWUgRmViIDEwIDE1OjMyOjIyIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgorCisJKiBleHByLmM6IEFkZCBzdXBwb3J0IGZvciAweDFfMl8zXzQgYmlnbnVtcy4KKworVHVlIEZlYiAxMCAxNDo0Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFRyZWF0IFxyIGFzIHdoaXRlc3BhY2UuCisKK01vbiBGZWIgIDkgMTQ6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogVXBkYXRlIGRlcGVuZGVuY2llcy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitTYXQgRmViICA3IDE1OjMzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCisKK0ZyaSBGZWIgIDYgMTY6MDg6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBtaXBzX2NwdSBpcyBzZXQsIHRoZW4gdXNlIGl0IGFzCisgICAgICAgIHRoZSBhcmd1bWVudCB0byBiZmRfc2V0X2FyY2hfbWFjaC4KKyAgICAgICAgKGxvYWRfYWRkcmVzcyk6IFVzZSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgYml0IHNpemUgb2YgYW4gYWRkcmVzcyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgdGhlIGlzYSBsZXZlbC4KKyAgICAgICAgKG1hY3JvLCBtYWNybzIsIHNfY3ByZXN0b3JlLCBzX2NwYWRkKTogTGlrZXdpc2UuCisKK0ZyaSBGZWIgIDYgMTQ6NDQ6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tdjg1MGFueSBjb21tYW5kIGxpbmUgb3B0aW9uLgorCitUaHUgRmViICA1IDEyOjM5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWhvcHQuYzogTmV3IGZpbGUuCisJKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IEFkZCByc19jZmEuCisJKGNoZWNrX2VoX2ZyYW1lLCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IERlY2xhcmUuCisJKGVoX2ZyYW1lX3JlbGF4X2ZyYWcsIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyk6IERlY2xhcmUuCisJKiByZWFkLmMgKGVtaXRfZXhwcik6IENhbGwgY2hlY2tfZWhfZnJhbWUuCisJKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSGFuZGxlIHJzX2NmYS4KKwkocmVsYXhfc2VnbWVudCk6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorIAkoR0FTX0NGSUxFUyk6IEFkZCBlaG9wdC5jLgorCShHRU5FUklDX09CSlMpOiBBZGQgZWhvcHQuby4KKwkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBEb2N1bWVudCByc19jZmEuCisKKwkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tdHJhZGl0aW9uYWwtZm9ybWF0LgorCShwYXJzZV9hcmdzKTogQWNjZXB0IC0tdHJhZGl0aW9uYWwtZm9ybWF0LgorCSogYXMuaCAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpOiBEZWNsYXJlLgorCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogSWYgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQsCisJc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQgb24gc3Rkb3V0cHV0LgorCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLXRyYWRpdGlvbmFsLWZvcm1hdC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEKKwlmaXh1cCBmb3IgYW4gdW5tYXRjaGVkICVoaSByZWxvYywgaXQgZG9lcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEKKwl2YXJpYW50IGZyYWcuCisKKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKwkqIGRvYy9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCisKK1dlZCBGZWIgIDQgMTU6NDE6NTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW0zMnIuYyAoY2hlY2tfZm9yX3NpZGVfZWZmZWN0cyk6IE5ldyBmdW5jdGlvbi4KKwkoY2FuX21ha2VfcGFyYWxsZWwpOiBBZGQgY2hlY2tzIGZvciBpbnN0cnVjdGlvbiBzaWRlIGVmZmVjdHMKKwljbGFzaGluZyB3aXRoIHRoZSBvdGhlciBpbnN0cnVjdGlvbi4KKwkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IEltcHJvdmUgd2FybmluZyBtZXNzYWdlcy4gIFJldHVybiBlcnJvcgorCW1lc3NhZ2UgZnJvbSBub24tc3dhcHBlZCBpbnN0cnVjdGlvbiBvcmRlci4KKworV2VkIEZlYiAgNCAyMDowMDoyNiAxOTk4ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEB0ZWtuZW1hLmRlbW9uLmNvLnVrPgorCisJKiBjb25maWcvdGMtYXJtLmM6IFJlbmFtZSBhcm1fYWZ0ZXJfcGFzc19ob29rKCkgdG8gYXJtX2NsZWFudXAoKS4KKworCSogY29uZmlnL3RjLWFybS5oOiBSZXBsYWNlIG1kX2FmdGVyX3Bhc3NfaG9vayBkZWZpbml0aW9uIHdpdGggYQorIAltZF9jbGVhbnVwIGRlZmluaXRpb24uICBUaGlzIG1vdmVzIHRoZSBmb3JjZWQgbGl0ZXJhbCBvdXRwdXQgdG8KKyAJdGhlIGVuZCBvZiB0aGUgc291cmNlIHBhc3MsIGFuZCBhdm9pZHMgbWFjcm8ncyBpbnNlcnRpbmcgbGl0ZXJhbHMKKyAJaW50byB0aGUgY29kZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFjcm8gZXhwYW5zaW9uLgorCitXZWQgRmViICA0IDEzOjE3OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0VMRl06IEEgcmVsb2MgYWdhaW5zdAorCWEgZ2FzIGludGVybmFsIHN5bWJvbCBpcyBhZGp1c3RhYmxlLgorCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgorCisJKiBhcy5oOiBJZiBnY2MgdmVyc2lvbiBncmVhdGVyIHRoYW4gMi42LCB1c2UgYF9fZm9ybWF0X18nIGFuZAorCWBfX3ByaW50Zl9fJyBpbiBmdW5jdGlvbiBhdHRyaWJ1dGVzLCByYXRoZXIgdGhhbiBgZm9ybWF0JyBhbmQKKwlgcHJpbnRmJy4KKworTW9uIEZlYiAgMiAxODozODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jOiBPbmx5IGluY2x1ZGUgZWxmL3NwYXJjLmggaWYgT0JKX0VMRi4KKworTW9uIEZlYiAgMiAxODozMDozNCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgorCisJQWRkIHRtczMyMGMzMCBzdXBwb3J0OgorCSogY29uZmlnL3RjLXRpYzMwLmg6IE5ldyBmaWxlLgorCSogY29uZmlnL3RjLXRpYzMwLmM6IE5ldyBmaWxlLgorCSogY29uZmlnL29iai1jb2ZmLmg6IElmIFRDX1RJQzMwLCBpbmNsdWRlIGNvZmYvdGljMzAuaCBhbmQgZGVmaW5lCisJVEFSR0VUX0ZPUk1BVCBhcyAiY29mZi10aWMzMCIuCisJKiBjb25maWd1cmUuaW4gKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgorCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShDUFVfVFlQRVMpOiBBZGQgdGljMzAuCisJKENQVV9PQkpfVkFMSUQpOiB0aWMzMC1hb3V0IGlzIHZhbGlkLgorCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtdGljMzAuYy4KKwkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgY29uZmlnL3RjLXRpYzMwLmguCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitNb24gRmViICAyIDEwOjIwOjM3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSW1wcm92ZW1lbnRzIHRvIGVycm9yIG1lc3NhZ2VzLgorCitNb24gRmViICAyIDEyOjM5OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IENoYW5nZSBCRkRfUkVMT0NfSEkxNiBhbmQKKyAJQkZEX1JFTE9DX0hJMTZfUyB0byBzdG9yZSB0aGUgaGlnaCBiaXRzIG9mIGFueSB2YWx1ZS4KKworCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IFVuZG8gY2hhbmdlIG9mIEZyaSBKdW4gMjcuCisJKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERvbid0IGxldCB0aGUKKwlhc3NlbWJsZXIgY2FsY3VsYXRlIHJlbG9jYXRpb25zIHRvIGFueSBleHRlcm5hbCBzeW1ib2wgYXQgYWxsLgorCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKSBbT0JKX0VMRl06IENvcnJlY3QgYnVncworCWludm9sdmluZyBnZW5lcmF0aW9uIG9mIHBjLXJlbGF0aXZlIHJlbG9jcy4KKwkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKSBbT0JKX0VMRl06IFRoZSBqb2IgdGhpcyBjb2RlIHVzZWQgdG8gZG8KKwloYXMgYmVlbiBtb3ZlZCB0byBtZF9hcHBseV9maXgzLgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggdGVzdCBmb3IgdG9vLWZhciBicmFuY2guCisJKHBwY19lbGZfc3VmZml4KTogV2FybiBhYm91dCAnaWRlbnRpZmllcitjb25zdGFudEBnb3QnIHN5bnRheCwKKwl3aGljaCBhY3R1YWxseSBtZWFucyAodGhlIGFkZHJlc3Mgb2YgaWRlbnRpZmllcidzIEdPVCBlbnRyeSkgKworCWNvbnN0YW50LCB3aGljaCBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bC4KKworRnJpIEphbiAzMCAxMTowMjozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiByZWFkLmggKGluY2x1ZGVfZGlycyk6IERlY2xhcmUuCisJKGluY2x1ZGVfZGlyX2NvdW50LGluY2x1ZGVfZGlyX21heGxlbik6IERlY2xhcmUuCisKK0ZyaSBKYW4gMzAgMTE6NDc6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENvcnJlY3QgY2hlY2sgZm9yIHNoYXJlZCBvcGNvZGVzIGxpYnJhcnkuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiBJZiB3ZSBjYW4ndCBvcGVuIHRoZSBmaWxlLCBzZXQgYXRfZW5kLgorCShsaXN0aW5nX3ByaW50KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBmaS4KKworCSogY29uZmlnL202OGstcGFyc2UueSAocmVnbGlzdHBhaXIpOiBIYW5kbGUgcmVnaXN0ZXIgbGlzdCBpbgorCWVpdGhlciBvcmRlci4KKworCSogY29uZmlnL3Ztcy1jb25mLmg6IERvbid0IHVuZGVmIFZFUlNJT04uCisKK1RodSBKYW4gMjkgMTQ6NDI6NDQgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIE1ha2VmaWxlLmFtIChDT05GSUdfT0JKUyk6IE5ldyB2YXJpYWJsZSwgY29udGFpbmluZyBwYXJ0IG9mIG9sZAorCU9CSlMgdmFyaWFibGUuCisJKEdFTkVSSUNfT0JKUyk6IE5ldyB2YXJpYWJsZSwgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb2xkIE9CSlMKKwl2YXJpYWJsZS4KKwkoT0JKUyk6IE5vdyBqdXN0ICQoQ09ORklHX09CSlMpIGFuZCAkKEdFTkVSSUNfT0JKUykuCisJKCQoc3JjZGlyKS9tYWtlLWdhcy5jb20pOiBSZW5hbWUgZnJvbSBtYWtlLWdhcy5jb20uCisJKHN0YW1wLW1rLmNvbSk6IFJlcGxhY2UgJChPQkpTKSB3aXRoICQoR0VORVJJQ19PQkpTKS4KKwkoRVhUUkFfRElTVCk6IERlZmluZS4KKwkqIHZtc2NvbmYuc2g6IEhhbmRsZSB7dGFyZy1jcHUsIG9iai1mb3JtYXQsIGF0b2YtdGFyZ30gbW9kdWxlcworCWV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gdmlhIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcy4KKwkoZ2NjLWFzLm9wdCk6IE5ldyBmaWxlIGNyZWF0ZWQgd2hlbiBtYWtlLWdhcy5jb20gaXMgcnVuLgorCSogY29uZmlnLWdhcy5jb206IENyZWF0ZSB7dGFyZy1jcHUuaCwgb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLAorCWl0YmwtY3B1Lmh9IHRvICNpbmNsdWRlIGFwcHJvcHJpYXRlIGZpbGUgcmF0aGVyIHRoYW4gY29weWluZyB0aGF0CisJZmlsZS4KKwkqIGNvbmZpZy92bXMtY29uZi5oOiBTeW5jaHJvbml6ZSB3aXRoIGN1cnJlbnQgY29uZmlnLmluLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1RodSBKYW4gMjkgMTg6NDg6MTkgMTk5OCAgQmlsbCBNb3llciAgPGJpbGxtQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWRkZWQgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsLgorCShwYXJhbGxlbF9vayk6IFJlbGF4ZWQgcGFyYWxsZWwgc3ViaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeSBjaGVjay4KKworV2VkIEphbiAyOCAxNDozNTowMCAxOTk4ICBCaWxsIE1veWVyIDxiaWxsbUBjeWdudXMuY29tPgorCisJKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogYWRkZWQgbmV3IGZsYWcuCisJKiB0Yy1kMTB2LmMgKG1kX3BhcnNlX29wdGlvbixtZF9sb25nb3B0cyk6IGFkZGVkICItLW5vd2FybnN3YXAiIAorCWNvbW1hbmQgbGluZSBhcmd1bWVudC4KKwkqIHRjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IGVtaXQgIlN3YXBwaW5nIGluc3RydWN0aW9ucyIKKwl3YXJuaW5nIG9ubHkgaWYgZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCBpcyBmYWxzZS4KKworV2VkIEphbiAyOCAxNjo0MToxOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitXZWQgSmFuIDI4IDE0OjUxOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IHNldCB0aGUgc2VnbWVudCBpZiBpdAorCWhhc24ndCBjaGFuZ2VkLCBhbmQgdGhpcyBpcyBPQkpfQU9VVCB3aXRob3V0IEJGRF9BU1NFTUJMRVIuCisKKwkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogQ29ycmVjdCB0eXBvLS1wYXNzIGFyZ3VtZW50IHRvCisJU19HRVRfU0VHTUVOVC4KKworV2VkIEphbiAyOCAxMzo1NDo1MCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCWFzLmggKHVubGluayk6IFJldmVyc2UgMTMtRmViLTk3IGNoYW5nZTsgdXNlIG9mIHVubGluayB2cyByZW1vdmUKKwlkZXBlbmRzIHVwb24gSEFWRV97VU5MSU5LLFJFTU9WRX0gdmFsdWVzIHJhdGhlciB0aGFuIGhvc3QKKwljb21waWxlci4KKworV2VkIEphbiAyOCAxMzo0ODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04pOiBEZWZpbmUuCisKK1dlZCBKYW4gMjggMDk6NTI6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IERpc3BsYXkgaW5zdHJ1Y3Rpb24gd2hlbgorCWFuIGVycm9yIGlzIGVuY291bnRlcmVkLgorCitUdWUgSmFuIDI3IDEzOjMyOjAxIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotc2NvMy4ydjUqKTogRGVmYXVsdHMgdG8gRUxGIG5vdy4KKwkoaTM4Ni0qLXNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgorCShpMzg2LSotc2NvMy4yKik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1R1ZSBKYW4gMjcgMTE6MDY6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYzogVGlkeSBlcnJvciBtZXNzYWdlIHByb2R1Y3Rpb24uCisKK1R1ZSBKYW4gMjcgMTI6MjQ6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbmV3IHZhcmlhYmxlIG5ld2ltbSB0byBob2xkCisJdmFsaWRhdGVfaW1tZWRpYXRlIHJldHVybiB2YWx1ZSBpbiB0aGUgcmlnaHQgdHlwZSBmb3IgY29tcGFyaXNvbnMKKwl0byBGQUlMLgorCitUdWUgSmFuIDI3IDA2OjUxOjU5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYyAoTUFYX0JZVEVTKTogVXNlIGxpc3RpbmcgdmFyaWFibGVzIG5vdCBjb25zdGFudHMuCisJKGRhdGFfYnVmZmVyKTogTm8gbG9uZ2VyIGFuIGFycmF5LCBidXQgYSBwb2ludGVyLgorCShjYWxjX2hleCk6IHNpemVvZihkYXRhX2J1ZmZlcikgLT4gTUFYX0JZVEVTLgorCShsaXN0aW5nX2xpc3RpbmcpOiBBbGxvY2F0ZSBkYXRhX2J1ZmZlci4KKworVHVlIEphbiAyNyAwNjozODozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0tbGlzdGluZy1saHMtd2lkdGgsIC0tbGlzdGluZy1saHMtd2lkdGgyLAorCS0tbGlzdGluZy1yaHMtd2lkdGgsIC0tbGlzdGluZy1jb250LWxpbmVzLgorCShzaG93X3VzYWdlKTogVXBkYXRlLgorCSogbGlzdGluZy5jIChsaXN0aW5nX2xoc193aWR0aCwgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kKTogTmV3IHZhcnMuCisJKGxpc3RpbmdfbGhzX2NvbnRfbGluZXMsIGxpc3RpbmdfcmhzX3dpZHRoKTogTmV3IHZhcnMuCisJKHByaW50X2xpbmVzKTogVXNlIHRoZSB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgY29uc3RhbnRzLgorCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4JCisJKiBsaXN0aW5nLmg6IERlY2xhcmUgdGhlIG5ldyB2YXJzLgorCQorVHVlIEphbiAyNyAwNTozMjowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0ta2VlcC1sb2NhbHMgYWxpYXMgZm9yIC1MLgorCUFkZCAtLXN0cmlwLWxvY2FsLWFic29sdXRlLgorCShzaG93X3VzYWdlKTogVXBkYXRlLgorCSogYXMuaCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSk6IE5ldyBmbGFnLgorCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogVXNlIGl0LgorCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgorCitNb24gSmFuIDI2IDEzOjA3OjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tMzJyLmM6IERldGVjdCBpZiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc3RydWN0aW9ucworCW1pZ2h0IGhhdmUgYW4gaW8gY29uZmxpY3QgYW5kIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAKKworVGh1IEphbiAyMiAxNzo1MTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjZ2VuLmMgKGNnZW5fc2F2ZV9maXh1cHMsIGNnZW5fcmVzdG9yZV9maXh1cHMsCisJY2dlbl9zd2FwX2ZpeHVwcyk6IEZ1bmN0aW9ucyB0byBzYXZlLCByZXN0b3JlIGFuZCBzd2FwIHRoZSBmaXh1cAorCWNoYWluIHdpdGggYSBiYWNrdXAgY29weS4KKwkoY2dlbl9hc21fZmluaXNoX2luc24pOiBSZXR1cm5zIGFkZHJlc3Mgb2YgY29uc3RydWN0ZWQgaW5zbi4KKworV2VkIEphbiAyMSAxNjo0OToxMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBsaXN0aW5nLmMgKGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW1vdmUgRklMRSwgYWRkIFBPUy4KKwkobGFzdF9vcGVuX2ZpbGVfaW5mbywgbGFzdF9vcGVuX2ZpbGUpOiBOZXc7IGEgb25lIGVudHJ5IEZJTEUqIGNhY2hlLgorCShmaWxlX2luZm8pOiBEb24ndCBvcGVuIHRoZSBmaWxlLgorCShidWZmZXJfbGluZSk6IENoZWNrIGZvciB0aGUgZmlsZSBpbiB0aGUgbGFzdF9vcGVuIGNhY2hlLCB1cGRhdGluZworCWFzIG5lY2Vzc2FyeS4KKwkocHJpbnRfc291cmNlKTogRG9uJ3QgcmVmZXJlbmNlIGZpbGVfaW5mby0+ZmlsZS4KKwkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCisJKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgZmlsZSBpbiB0aGUgY2FjaGUsIGlmIGFueS4KKworRnJpIEphbiAxNiAxNDo1MTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAoZHdhcmZfZmlsZV9zdHJpbmcpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCisJKGVtaXRfZXhwcik6IExvb2sgZm9yIGNvbnN0YW50IHNlcXVlbmNlIHRoYXQgbGVhZHMgdXAgdG8gYSBmaWxlCisJbmFtZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LgorCShzdHJpbmdlcik6IFVzZSBkd2FyZl9maWxlX3N0cmluZyB0byBkZWNpZGUgd2hldGhlciB0byBhY2NlcHQgYQorCXN0cmluZyBhcyBhIGZpbGUgbmFtZS4KKworRnJpIEphbiAxNiAxMTozMDozNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiB0Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYWJzbC0+cmVnbHN0IE1SSSBoYWNrLgorCShjcmFja19vcGVyYW5kKTogQWRkIHJlZy0+cmVnbHN0IE1SSSBoYWNrLgorCShyX3NlZyk6IFB1dCByZWdsc3Qgc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KKwkobTY4a19mcm9iX3N5bWJvbCk6IEZyb2IgcmVnbHN0IHN5bWJvbHMgaW50byBhYnNvbHV0ZV9zZWN0aW9uLgorCitUaHUgSmFuIDE1IDE0OjE5OjAxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHRjLXNoLmMgKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBTR1IgJiBEQlIuCisKK1RodSBKYW4gMTUgMTM6NDY6NDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogdGMtaDgzMDAuYyAocGFyc2VfcmVnKTogVGFrZSB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wgaW50bworCWFjY291bnQgd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIGEgcmVnaXN0ZXIgbmFtZS4KKwkqIHRjLWg4NTAwLmMgKHBhcnNlX3JlZyk6IExpa2V3aXNlLgorCitXZWQgSmFuIDE0IDE3OjUyOjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNnZW4uYzogRm9ybWF0dGluZyBjaGFuZ2VzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisKK1dlZCBKYW4gMTQgMTU6NDE6NDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFJld29yayBkaXZpc2lvbiBjb2RlIHRvIGF2b2lkIHVuZmlsbGVkCisJZGVsYXkgc2xvdC4KKworV2VkIEphbiAxNCAxODowNDoyMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKaW0gV2lsc29uCisJKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IFJlbW92ZSBub24tYW5zaSBkZWZhdWx0IGNhc2UuCisJKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcworCWNvcnJlY3RseS4KKworV2VkIEphbiAxNCAxNTowMjoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHRlc3QgcGluZm8gZmxhZ3MgaWYgSU5TTl9NQUNSTy4KKworTW9uIEphbiAxMiAxMzowNDo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5jOiAjaW5jbHVkZSBzZXRqbXAuaC4gIENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCisJKGV4cHJfam1wX2J1Zik6IE5ldyBzdGF0aWMgbG9jYWwuCisJKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IEFsbG93IHVzZSBvZiBsb25nam1wIGluIHBhcnNpbmcgdG8gaGFuZGxlIGVycm9ycy4KKwkoY2dlbl9tZF9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgorCSogdGMtbTMyci5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVzZSBDR0VOX0lOU05fTU5FTU9OSUMuCisKK1R1ZSBKYW4gIDYgMTU6MzY6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogc3ltYm9scy5jIChTX1NFVF9TRUdNRU5UKTogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGZvciBzZWN0aW9uIHN5bXMuCisJKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBDb3JyZWN0IHBhcmVudGhldGljYXRpb24uCisKK0ZyaSBKYW4gIDIgMTY6MDg6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBHaXZlIGFuIGVycm9yIGlmIHRoZXJlIGFyZQorCXVucmVjb2duaXplZCBjaGFyYWN0ZXJzIGFmdGVyIGFuIGV4cHJlc3Npb24uCisKK0ZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NwpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZy05Mjk1IGIvZ2FzL0NoYW5nZUxvZy05Mjk1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTQ4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvQ2hhbmdlTG9nLTkyOTUKQEAgLTAsMCArMSwxMzExMCBAQAorU2F0IERlYyAzMCAyMzo0Mjo1MSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBTaW1wbGlmeS4gIENvcnJlY3RseSBoYW5kbGUgc3ltICsgb2Zmc2V0CisJYWRkcmVzc2VzIGZvciBzdGF0aWMgdmFyaWFibGVzLgorCitUaHUgRGVjIDIxIDEyOjU0OjMyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtYXBwaW5nKTogTWFrZSBAZ290IGdpdmUgYSByZWFsIEdPVCByZWxvY2F0aW9uLAorCWFuZCB4Z290IGdpdmUgdGhlIG9sZCB0b2MxNiByZWxvY2F0aW9uLgorCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBhbGwgR09UIHJlbG9jYXRpb25zLgorCitXZWQgRGVjIDIwIDE0OjU3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogQ29ycmVjdGx5IGhhbmRsZSBhIGNvbnN0YW50IGluCisJU1ZSNF9QSUMgY2FzZS4gIEZyb20gUmljaGFyZCBLZW5uZXIgPGtlbm5lckB2bHNpMS51bHRyYS5ueXUuZWR1Pi4KKworRnJpIERlYyAxNSAxNDoyNTowNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBSZWNvZ25pemUgU0gzIHJlZ2lzdGVycy4KKwkoZ2V0X3NwZWNpZmljKTogSGFuZGxlIEFfU1NSLCBBX1NQQyBhbmQgQV9SRUdfQi4KKwkoYnVpbGRfTWJ5dGVzKTogSGFuZGxlIFJFR19CLgorCitGcmkgRGVjIDE1IDE2OjA3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfYXV4KTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KKworRnJpIERlYyAxNSAxMjoxMTo0OCAxOTk1ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IElmIGxpbmtpbmcsIGVkaXQgQUxMX0NGTEFHUyB0byBDRkxBR1MuCisKK1RodSBEZWMgMTQgMTU6MDk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgdGhlIHNfYWxpZ24gZmllbGQgdG8KKwl0aGUgbnVtYmVyIG9mIGJ5dGVzLCByYXRoZXIgdGhhbiB0byB0aGUgcG93ZXIgb2YgMi4KKworVHVlIERlYyAxMiAxMjoxOTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChESVNUQ0xFQU5fSEVSRSk6IE5ldyB2YXJpYWJsZS4KKwkoZGlzdGNsZWFuKTogVXNlIGl0LgorCShtYWludGFpbmVyLWNsZWFuKTogRGVwZW5kIHVwb24gY2xlYW4taGVyZSByYXRoZXIgdGhhbiBjbGVhbiwKKwlkaXN0Y2xlYW4sIGFuZCBjbGVhbi1pbmZvLiAgUnVuIG1ha2UgbWFpbnRhaW5lci1jbGVhbiBpbiBkb2MuCisJUmVtb3ZlIGZpbGVzIGxpc3RlZCBpbiBESVNUQ0xFQU5fSEVSRS4KKwkqIGRvYy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBTcGxpdCBvdXQgZnJvbQorCWRpc3RjbGVhbi4gIERlcGVuZCB1cG9uIGNsZWFuLWluZm8gYW5kIGRpc3RjbGVhbi4KKworTW9uIERlYyAxMSAxNjoyMzo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1hYy1hcy5yOiBGaXggY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZ3MuCisJKGNmcmcpOiBVc2UgUFJPR19OQU1FIGluc3RlYWQgb2YgbGl0ZXJhbCBuYW1lLgorCitNb24gRGVjIDExIDE0OjE0OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiB0Y191bnJlY29nbml6ZWRfbGluZSBpcyBkZWZpbmVkLAorCWNhbGwgaXQuCisJKiBjb25maWcvdGMtYTI5ay5oICh0Y191bnJlY29nbml6ZWRfbGluZSk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1hMjlrLmMgKGEyOWtfdW5yZWNvZ25pemVkX2xpbmUpOiBOZXcgZnVuY3Rpb24uCisJKG1kX29wZXJhbmQpOiBIYW5kbGUgYTI5ayBzdHlsZSBsb2NhbCBkb2xsYXIgbGFiZWxzLgorCitXZWQgRGVjICA2IDE3OjUyOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1tdWx0aS5oOiBJZiBPQkpfTUFZQkVfRUxGLCBkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUuCisKK1R1ZSBEZWMgIDUgMTM6MjY6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAoc19maWxsKTogSWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaXMgZGVmaW5lZCwgY2FsbAorCWl0LgorCitNb24gRGVjICA0IDE1OjEwOjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uLCBmaWxsX3NlY3Rpb24sIGZpeHVwX21kZXBzKToKKwlUcmVhdCByc19hbGlnbl9jb2RlIGxpa2UgcnNfYWxpZ24uCisKK1N1biBEZWMgIDMgMTY6NDY6NTQgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorCisJKiBjb25maWcvdGMtYXJtLmMgKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IFNldCBwcmVfaW5jIHdoZW4KKwljb252ZXJ0aW5nIGFuIGFic29sdXRlIGFkZHJlc3MgaW50byBhIFBDLXJlbGF0aXZlIG9uZS4KKworRnJpIERlYyAgMSAxMTo1Nzo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW46IERvbid0IGFsd2F5cyB1c2UgdGUtZ2VuZXJpYy5oIGZvciBlbXVsYXRpb24uCisJKHBvd2VycGMtYXBwbGUtbWFjb3MpOiBVc2UgZW11bGF0aW9uIHRlLW1hY29zLmguCisJKiBtcHctbWFrZS5zZWQgKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgaW4gTWFjLXNwZWNpZmljCisJaW5zdGFsbCBwcm9jZWR1cmUuCisKK0ZyaSBEZWMgIDEgMTA6NTk6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEltcHJvdmUgbWVzc2FnZSBhYm91dCB1bnN1cHBvcnRlZCBFTEYgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IENvcnJlY3QgY2hlY2sgZm9yIHdoZXRoZXIgZmlsbAorCXBhdHRlcm4gaXMgemVyby4gIEZyb20gTWFuZnJlZCBIb2xsc3RlaW4uCisKK1RodSBOb3YgMzAgMTM6MjU6NDkgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BlX3NlY3Rpb24pOiBUbyBnZXQgdGhlIGFsaWdubWVudCByaWdodCBmb3IKKwl0aGUgdmFyaW91cyBpZGF0YSBzZWN0aW9ucywgd2UgY2hlY2sgdGhlIG5hbWUgb24gdGhlIC5zZWN0aW9uIHBzZXVkby4KKworVGh1IE5vdiAzMCAxMToyMzo0MiAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBUQ19NODhLIGlzIGRlZmluZWQsIGRvIG5vdAorCWFkZCBzZWN0aW9uJ3MgcGFkZHIgdG8gYWRkX251bWJlcjsgY29tcGF0aWJpbGl0eSB0byBuYXRpdmUgYXMgYW5kCisJbGQgZm9yYmlkcy4KKworV2VkIE5vdiAyOSAyMzoxNDoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBUcmVhdCBtNjhrLXN5c3Y0IGxpa2UgbTY4ay1lbGYsIG5vdCBtNjhrLXN5c3YzLgorCisJKiBoYXNoLmMgKHN0cnVjdCBoYXNoX2VudHJ5KTogTW92ZWQgaGVyZS4uLgorCSogaGFzaC5oIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IC4uLmZyb20gaGVyZS4KKworCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgZnJlZSBhbmQgY2xlYXIgc3lfb2JqCisJaWYgaXQncyBhbHJlYWR5IGtub3duIHRvIGJlIG51bGwuCisKK1dlZCBOb3YgMjkgMTM6MDA6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBhZGp1c3QgdGhlIHZhbHVlIGZvciAzMgorCWJpdCByZWxvY3MgY29udmVydGVkIHRvIFBDIHJlbGF0aXZlIHJlbG9jcy4gIFRoaXMgdHVybmVkIG91dCB0bworCWFkZCB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiAudGV4dCB0d2ljZS4KKworVHVlIE5vdiAyOCAxMDo0MjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBJbiAncycgY2FzZSwgZnJlZSBzdHJpbmcgZnJvbQorCW9ic3RhY2suCisKKwkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IFJlbW92ZSB1bnVzZWQgZmllbGQKKwlzeV9uYW1lX29mZnNldC4KKwkqIGNvbmZpZy9vYmotbXVsdGkuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKSBbT0JKX01BWUJFX0VMRl06CisJRGl0dG8uCisKKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBNYWtlIGJpdGZpZWxkcyB1bnNpZ25lZC4KKworCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBNYWtlIFhfb3AgYW5kIFhfdW5zaWduZWQgYml0ZmllbGRzLAorCWFuZCBtb3ZlIHRoZW0gdG9nZXRoZXIuICBPbiBtb3N0IHN5c3RlbXMgdGhpcyB3aWxsIHJlZHVjZSB0aGUKKwlzdHJ1Y3R1cmUgc2l6ZSBieSBvbmUgd29yZC4KKwkob3BlcmF0b3JUKTogRGVmaW5lIE9fbWF4LgorCSogZXhwci5jIChleHByX2JlZ2luKTogVmVyaWZ5IHRoYXQgWF9vcCBpcyB3aWRlIGVub3VnaCB0byBob2xkCisJT19tYXguCisKKwkqIHJlYWQuYyAocG9wX2luc2VydCk6IFByaW50IGVycm9yIHJldHVybmVkIGJ5IGhhc2ggdGFibGUKKwlpbnNlcnRpb24gY29kZS4KKworCSogYXMuYyAoZHVtcF9zdGF0aXN0aWNzKTogU3BsaXQgb3V0IGZyb20gbWFpbjsgZHVtcCBzb21lIGhhc2gKKwl0YWJsZSBzdGF0cyBhbmQgdGFyZ2V0LXNwZWNpZmljIHN0YXRzLgorCShzdGFydF90aW1lKTogTm8gbG9uZ2VyIGF1dG9tYXRpYyB0byBtYWluLgorCShtYWluKTogU2V0IGZpbGUtbGV2ZWwgc3RhcnRfdGltZSBhbmQgY2FsbCBkdW1wX3N0YXRpc3RpY3MgYXQKKwlleGl0LiAgRXhpdCBieSBjYWxsaW5nIHhleGl0LgorCShzaG93X3VzYWdlKTogTWFrZSAtLXN0YXRpc3RpY3MgZGVzY3JpcHRpb24gbGVzcyBzcGVjaWZpYy4KKwkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgorCSogd3JpdGUuYyAod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KKwkobl9maXh1cHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShmaXhfbmV3X2ludGVybmFsKTogSW5jcmVtZW50IGl0LgorCSogcmVhZC5jIChyZWFkX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCisJKiByZWFkLmggKHJlYWRfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCisJKiBzeW1ib2wuYyAoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCisJKiBzeW1ib2wuaCAoc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgorCSogaGFzaC5jIChoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCisJKiBoYXNoLmggKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCisJKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgorCSh0Y19wcmludF9zdGF0aXN0aWNzKTogTmV3IG1hY3JvLgorCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwsIGFzX2Fzc2VydCwgYXNfYWJvcnQpOiBVc2UgeGV4aXQsIG5vdAorCWV4aXQuCisKKwkqIGhhc2guYyAoREVMRVRFRCk6IFJld3JpdGUgdG8gdXNlIGEgdmFsaWQgYnV0IHVuaXF1ZSBhZGRyZXNzLgorCShTVEFSVF9QT1dFUik6IFJlZHVjZSB0byAxMC4KKwkoZW51bSBzdGF0X2VudW0pOiBOZXcgZW51bWVyYXRvciwgcmVwbGFjaW5nIFNUQVRfKiBpbmRleCBtYWNyb3MuCisJQWRkIG5ldyB2YWx1ZXMgZm9yIGNvdW50aW5nIHN0cmNtcCBjYWxscy4KKwkoR1JPV19GQUNUT1IpOiBOZXcgbWFjcm8uCisJKGhhc2hfZ3Jvdyk6IFVzZSBHUk9XX0ZBQ1RPUi4gIFJld3JpdGUgZm9yIHF1aWNrIHJldHVybnMgaW5zdGVhZAorCW9mIG5lc3RpbmcgYmxvY2tzLgorCShGVUxMX1ZBTFVFKTogTmV3IG1hY3JvLiAgVXNlIDEvNCBvZiB0YWJsZSBzaXplIGluc3RlYWQgb2YgMS8yLgorCShoYXNoX25ldyk6IFVzZSBGVUxMX1ZBTFVFLgorCShzdHJ1Y3QgaGFzaF9jb250cm9sKTogRGVmaW5pdGlvbiBtb3ZlZCBoZXJlLgorCShoYXNoX2NvZGUpOiBEb24ndCBtYXNrIHRvIGxvdyBiaXRzLgorCShoYXNoX2Fzayk6IE1hc2sgcmV0dXJuZWQgaGFzaCBjb2RlIGhlcmUuICBDaGVjayBoYXNoIHZhbHVlIGJlZm9yZQorCWNhbGxpbmcgc3RyY21wOyBjb3VudCBzdHJjbXAgY2FsbHMuCisJKiBoYXNoLmggKHN0cnVjdCBoYXNoX2NvbnRyb2wpOiBEZWNsYXJlLCBkb24ndCBkZWZpbmUsIGhlcmUuCisJKEhBU0hfU1RBVExFTkdUSCk6IERlbGV0ZWQuCisJKHN0cnVjdCBoYXNoX2VudHJ5KTogQWRkIGZpZWxkIGZvciBoYXNoIGNvZGUuCisJKGhhc2hfc2F5LCBoYXNoX2FwcGx5KTogRG9uJ3QgZGVjbGFyZS4KKworCSogaGFzaC5jIChkZXN0cm95KTogUmV0dXJuIHZvaWQuCisJKGFwcGxpY2F0ZWUpOiBEaXR0by4KKwkobWFpbik6IEZpeCBkZWNsYXJhdGlvbnMuCisJKGhhc2hfYXBwbHkpOiBSZXR1cm4gdm9pZC4gIEFyZ3VtZW50IGBmdW5jdGlvbicgcmV0dXJucyB2b2lkLiAgUHV0CisJaW5zaWRlICIjaWZkZWYgVEVTVCIuCisJKGhhc2hfc2F5KTogRGVmaW5lIG9ubHkgaWYgVEVTVCBpcyBkZWZpbmVkLgorCSogaGFzaC5oIChoYXNoX2FwcGx5LCBoYXNoX3NheSk6IERlY2xhcmF0aW9ucyBkZWxldGVkLgorCitNb24gTm92IDI3IDEzOjE4OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgorCitUdWUgTm92IDIxIDE4OjM5OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFJlbW92ZSBsb2NhbCBkZWZpbml0aW9uLgorCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi42LgorCitNb24gTm92IDIwIDE3OjI2OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZGVidWdfbmFtZV9zZWN0aW9uX3NpemUpOiBSZW1vdmUuCisJKHBwY19zdGFieCk6IERvbid0IGluY3JlbWVudCBwcGNfZGVidWdfbmFtZV9zZWN0aW9uX3NpemUuCisJKHBwY19iYyk6IExpa2V3aXNlLgorCShwcGNfZnJvYl9maWxlKTogUmVtb3ZlLgorCSogY29uZmlnL3RjLXBwYy5oICh0Y19mcm9iX2ZpbGUpOiBEb24ndCBkZWZpbmUuCisJKHBwY19mcm9iX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgorCitNb24gTm92IDIwIDEzOjM3OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX2FscGhhKTogTWVudGlvbiBhbHBoYS1vcGNvZGUuaC4KKwkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogSW5jbHVkZSBvbmUtb3BlcmFuZCB2YXJpYW50cyBvZiBqbXAgYW5kCisJanNyLgorCisJKiBjb25maWcvdGUtZGVsdDg4Lmg6IFJlbmFtZWQgZnJvbSB0ZS1kZWx0YTg4LmgsIHRvIGF2b2lkIGNvbmZsaWN0CisJd2l0aCB0ZS1kZWx0YS5oIGluIDguMyBmaWxlIHN5c3RlbXMuCisJKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgorCitUaHUgTm92IDE2IDEyOjQ5OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoc19lcnIpOiBSZW1vdmU7IGp1c3QgdXNlIHRoZSBvbmUgaW4gcmVhZC5jLgorCisJKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IEluIE1SSSBtb2RlLCAnQCcgY2FuIHN0YXJ0IGFuIG9jdGFsCisJbnVtYmVyLgorCSogZXhwci5jIChvcGVyYW5kKTogSGFuZGxlIE1SSSBzdWZmaXhlcyBhZnRlciB1bmFkb3JuZWQgMC4KKworVGh1IE5vdiAxNiAwMDoyMTo0NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCVZlcnNpb24gMi42IHJlbGVhc2VkLgorCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNi4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hhbmdlIHVzZSBvZiBtZF9kb19hbGlnbgorCXRvIHBhc3MgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgZmlsbCB2YWx1ZSwgdG8gbWF0Y2ggb3RoZXIgdXNlcy4KKworV2VkIE5vdiAxNSAwMzo1MjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZJWF9UWVBFKTogQWRkIG1pc3Npbmcgc2VtaWNvbG9uLgorCisJKiBhcy5jIChtYWluKTogTW92ZSBtZF9lbmQgY2FsbCB0byBqdXN0IGFmdGVyIGNhbGwgdG8KKwlwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MuICBEZWxldGUgY3B1LXNwZWNpZmljIGNvZGUgaGVyZS4KKwkqIGNvbmZpZy90Yy1pOTYwLmggKG1kX2VuZCk6IE5ldyBtYWNybywgY2FsbHMgYnJ0YWJfZW1pdC4KKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfZW5kKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQuCisJKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZW5kKTogRGl0dG8uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaGVyZQorCWZyb20gSEFORExFX0FMSUdOIG1hY3JvLgorCSogY29uZmlnL3RjLWkzODYuaCAoSEFORExFX0FMSUdOKTogQ2FsbCBpdC4KKworCU1vbiBKdWwgMzEgMTQ6NTM6MTkgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IGNhc3QgZmlsbCBhbmQgMHg5MCB0byBjaGFyCisgCWJlZm9yZSBjb21wYXJpbmcKKworCU1vbiBNYXkgIDEgMTA6OTE6NDkgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6ICBNYWtlICIuYWxpZ24gbiwweDkwIiBnZW5lcmF0ZQorCW11bHRpLWJ5dGUgbm9wcyB0byBhdm9pZCBjaGFuZ2luZyBnY2MuICBUaGUgbmVjZXNzYXJ5IGdjYyBjaGFuZ2UKKwltaWdodCBicmVhayBvbGQgYXNzZW1ibGVycy4KKworCVNhdCBBcHIgMjIgMjA6NTM6MDUgMTk5NSAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbiwgSEFORExFX0FMSUdOKTogIEFkZCBtYWNyb3MgdG8KKwlnZW5lcmF0ZSBvcHRpbWFsIG11bHRpLWJ5dGUgbm9wIGluc3RydWN0aW9ucyBmb3IgIi5hbGlnbiBuIgorCSIuYWxpZ24gbiwweDkwIiwgYW5kIGFsaWducyByZXF1aXJpbmcgbW9yZSB0aGFuIDE1IGJ5dGVzIG9mCisJcGFkZGluZyBzdGlsbCBnZW5lcmF0ZSBtdWx0aXBsZSAweDkwJ3MgYXMgYmVmb3JlLgorCitNb24gTm92IDEzIDE3OjQwOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAoc19tcmlfdW50aWwpOiBDYWxsIHBvcF9tcmlfY29udHJvbC4KKworTW9uIE5vdiAxMyAyMDozOTowNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAocHBjLSotbWFjb3MqLCBwcGMtKi1tcHcqKTogTmV3IGNvbmZpZ3VyYXRpb25zLgorCSogY29uZmlndXJlOiBVcGRhdGUuCisJKiBtcHctbWFrZS5zZWQ6IFJlb3JkZXIgY29tbWFuZHMgdG8gbWFrZSBzZWQgaGFwcGllci4KKwkqIGNvbmZpZy90ZS1tYWNvcy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy90Yy1wcGMuaCAoVEFSR0VUX0ZPUk1BVCk6IFNldCBjb3JyZWN0bHkgZm9yIFBvd2VyTWFjLgorCitTdW4gTm92IDEyIDIxOjE0OjU2IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggb2ZmLWJ5LTIgYnVnIGluIGxlbmd0aCBjaGVjayBmb3IKKwljb25kaXRpb25hbCBicmFuY2hlcy4KKwkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCisKK1RodSBOb3YgIDkgMTY6MTQ6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYTI5ay5jIChtZF9hcHBseV9maXgpOiBXYXJuIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0bworCWdlbmVyYXRlIGEgcmVsb2Mgd2hpY2ggdGhlIGxpbmtlciB3aWxsIG5vdCBoYW5kbGUgY29ycmVjdGx5LiAgRml4CisJb3ZlcmZsb3cgY2hlY2tpbmctLVJfSVJFTCBpcyAxOCBiaXRzLCBub3QgMTcuCisKK1dlZCBOb3YgIDggMTk6NTk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IHN1YnRyYWN0IG1kX3BjcmVsX2Zyb20KKwlmcm9tIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgVENfQTI5Sy4KKworCSogY29uZmlnL3RjLWEyOWsuYyAobGluZV9zZXBhcmF0b3JfY2hhcnMpOiBSZXN0b3JlICdAJy4gIEV4aXN0aW5nCisJY29kZSBkZXBlbmRzIHVwb24gaXQuCisKKwkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX29wZXJhbmQpOiBIYW5kbGUgJGZsb2F0LCAkZG91YmxlLCBhbmQKKwkkZXh0ZW5kLiAgQmFzZWQgb24gY29kZSBmcm9tIEVyaWMgRnJldWRlbnRoYWwKKwk8ZnJldWRlbnRoYWxAbnl1LmVkdT4uCisJKiBjb25maWcvdGMtYTI5ay5oIChMRVhfRE9MTEFSKTogRGVmaW5lLgorCSogcmVhZC5jIChMRVhfRE9MTEFSKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCShsZXhfdHlwZSk6IFVzZSBMRVhfRE9MTEFSLgorCitXZWQgTm92ICA4IDE2OjM4OjE0IDE5OTUgIEVyaWMgRnJldWRlbnRoYWwgPGZyZXVkZW50aGFsQG55dS5lZHU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoYTI5ay1ueXUtc3ltMSk6IE5ldyB0YXJnZXQsIGp1c3QgbGlrZSBvdGhlciBhMjlrCisJdGFyZ2V0cy4KKworV2VkIE5vdiAgOCAxMTozODo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCk6IENhc3QgeG1hbGxvYyByZXR1cm4uCisKK1R1ZSBOb3YgIDcgMDk6MTQ6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIEJGRF9SRUxPQ19SVkEuIEN1cnJlbnRseQorCXVzZWQgb25seSBieSAiZGxsdG9vbC5jIi4KKworTW9uIE5vdiAgNiAxODo1MToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVbmRlZmluZSBpbmxpbmUgaWYgbm90IF9fR05VQ19fLgorCShtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCBkZWZpbmUgImV4dGVybiIuCisKK1NhdCBOb3YgIDQgMDA6NTE6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19iaWVpKTogRm9yY2Ugc3ltYm9sIGludG8gdGV4dF9zZWN0aW9uLgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX3Nob3dfdXNhZ2UpOiBQdXQgYmFja3NsYXNoIGF0IGVuZCBvZiBsaW5lLgorCitGcmkgTm92ICAzIDEzOjAyOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBEb24ndCB3YXJuIGFib3V0ID09IHdpdGggYQorCW5vbmV4aXN0ZW50IHBhcmFtZXRlciwgaW4gY2FzZSBpdCBpcyBpbiBhIGNvbW1lbnQgZmllbGQuCisKKwkqIGFzLmMgKG1haW4pOiBPbiBUQ19BMjlLLCBjYWxsIG1hY3JvX2luaXQgd2l0aCBtYWNyb19hbHRlcm5hdGUKKwlzZXQgdG8gMS4KKwkqIG1hY3JvLmMgKGdldF9hbnlfc3RyaW5nKTogRG9uJ3Qga2VlcCBxdW90ZXMgaWYgbWFjcm9fc3RyaXBfYXQgaXMKKwlzZXQsIGV2ZW4gaWYgbWFjcm9fYWx0ZXJuYXRlIGlzIHNldC4KKwkoZ2V0X2Fwb3N0X3Rva2VuKTogSWYgbWFjcm9fc3RyaXBfYXQsIG9ubHkgc2tpcCBraW5kIGlmIGl0IGlzICdAJy4KKwkoc3ViX2FjdHVhbCk6IElmIG1hY3JvX3N0cmlwX2F0LCBhbmQga2luZCBpcyAnQCcsIGRvbid0IGxvb2sgdXAKKwl0aGUgdG9rZW4gdW5sZXNzIGl0IGVuZGVkIGluICdAJy4KKwkqIGNvbmZpZy90Yy1hMjlrLmMgKGxpbmVfc2VwYXJhdG9yX2NoYXJzKTogUmVtb3ZlICdAJy4KKwkqIGRvYy9jLWEyOWsudGV4aTogRG9jdW1lbnQgbWFjcm8gdXNhZ2Ugb24gQTI5Sy4KKworVGh1IE5vdiAgMiAyMzowNzo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgbmV3ICdXJyBwbGFjZSwgbWVhbmluZyBhCisJc2lnbmVkIHdvcmQuCisJKGluc3RhbGxfb3BlcmFuZCk6IExpa2V3aXNlLgorCisJKiBjb25maWcvb2JqLWVsZi5jIChlY29mZl9kZWJ1Z19wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVybiIuCisKK1dlZCBOb3YgIDEgMTU6MTc6MDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbiAobTg4ay1tb3Rvcm9sYS1zeXN2Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWcvdGUtZGVsdGE4OC5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBtZF9kb19hbGlnbiBpZiBpdCBpcworCWRlZmluZWQuCisJKiBjb25maWcvdGMtbTg4ay5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4KKwkobWRfZG9fYWxpZ24pOiBEZWZpbmUuCisJKiBjb25maWcvdGMtbTg4ay5jOiBJbmNsdWRlICJzdWJzZWdzLmgiLgorCShtODhrX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgorCisJKiBjb25maWcvdGUtZGVsdGEuaCAoU1RSSVBfVU5ERVJTQ09SRSk6IERvbid0IGRlZmluZS4KKwkoQ09GRl9OT0xPQURfUFJPQkxFTSk6IERlZmluZS4KKwkoTE9DQUxfTEFCRUxTX0RPTExBUiwgTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgorCitXZWQgTm92ICAxIDE2OjA3OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEZvciBhIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aAorCW5vbi1jb25zdGFudCB0YXJnZXQsIHJlcXVpcmUgNyBhdmFpbGFibGUgYnl0ZXMgaW4gdGhlIGN1cnJlbnQKKwlmcmFnLCBub3QgNi4KKworVHVlIE9jdCAzMSAxNTozNzoxNiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmg6IEluY2x1ZGUgYmZkL2VsZi1iZmQuaCByYXRoZXIgdGhhbgorCWJmZC9saWJlbGYuaC4KKworVHVlIE9jdCAzMSAxNjozNDoyOCAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGFscGhhLSotbGludXgqKTogVXNlIGVjb2ZmLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2V4dGVybik6IE5ldyBmdW5jdGlvbi4KKwkoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBOZXcgZnVuY3Rpb24uCisJKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgd2VhayBzeW1ib2xzLgorCShlY29mZl9zZXR1cF9leHQpOiBMaWtld2lzZS4KKwkoZWNvZmZfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IHdlYWsgY29tbW9uIHN5bWJvbHMuCisJKiBlY29mZi5oIChlY29mZl9kaXJlY3RpdmVfZXh0ZXJuKTogRGVjbGFyZS4KKwkoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBEZWNsYXJlLgorCSogc3ltYm9scy5jIChTX0lTX1dFQUspOiBOZXcgZnVuY3Rpb24uCisJKiBzeW1ib2xzLmggKFNfSVNfV0VBSyk6IERlY2xhcmUuCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVybiIgYW5kCisJIndlYWtleHQiLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBSZW1vdmUgImV4dGVybiIuCisJKHNfZXh0ZXJuKTogUmVtb3ZlLgorCitUdWUgT2N0IDMxIDEzOjI5OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfbGdsb2JsKTogRG8gdGhlIHJpZ2h0IHRoaW5nLgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19iYik6IENhbGwgU0ZfU0VUX1BST0NFU1MuCisJKHBwY19lYik6IExpa2V3aXNlLiAgU2V0IHRoZSBzdG9yYWdlIGNsYXNzIHRvIENfQkxPQ0ssIG5vdCBDX0ZDTi4KKwkocHBjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2hhbmdlIENfQkxPQ0sgc3ltYm9scyB0byBDX0hJREVYVC4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2FsbAorCVNBX1NFVF9TWU1fRU5ETkRYIHdpdGggdGhlIGN1cnJlbnQgc3ltYm9sOyBjYWxsIGl0IHdpdGggdGhlIG5leHQKKwlvbmUuICBJZiBPQkpfWENPRkYsIHRyeSB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHN5bWJvbCBpcyBnb2luZworCXRvIGJlIGRyb3BwZWQuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJiYyIgYW5kICJlYyIuCisJKHBwY19zdGFiX3N5bWJvbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHBwY19jaGFuZ2VfY3NlY3QpOiBDaGVjayB0aGF0IHBwY190b2NfY3NlY3QgaXMgbm90IE5VTEwuCisJKHBwY19zdGFieCk6IFNldCBwcGNfc3RhYl9zeW1ib2wgYXJvdW5kIGNhbGwgdG8gc3ltYm9sX21ha2UuICBTZXQKKwlzeV90Yy5yZWFsX25hbWUgdG8gdGhlIHN0YWIgc3RyaW5nLgorCShwcGNfYmMsIHBwY19lYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCShwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogSWYgcHBjX3N0YWJfc3ltYm9sIGlzIHNldCwgZG9uJ3QKKwlkbyBhbnl0aGluZy4KKwkocHBjX3N5bWJvbF9uZXdfaG9vayk6IElmIHBwY19zdGFiX3N5bWJvbCBpcyBzZXQsIGRvbid0IGxvb2sgZm9yIGEKKwlzdWZmaXguCisJKHBwY19mcm9iX3N5bWJvbCk6IFNldCBCU0ZfTk9UX0FUX0VORCBmb3Igc3ltYm9scyB3aXRoIGNzZWN0IGF1eAorCWVudHJpZXMuCisKKwkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3B1c2gpOiBSZXNldCBzYl9pbmRleC4KKworTW9uIE9jdCAzMCAxNzo1Mjo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogRG9uJ3QgY3JlYXRlIGEgZnJhZyBpbiB0aGUgYWJzb2x1dGUKKwlzZWN0aW9uLgorCitTYXQgT2N0IDI4IDAxOjAyOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImRhdGEiIGFuZCAidGV4dCIuCisJKHBwY19jc2VjdCk6IE1vdmUgbW9zdCBvZiB0aGUgY29kZSB0byBwcGNfY2hhbmdlX2NzZWN0LCBhbmQgY2FsbAorCWl0LgorCShwcGNfY2hhbmdlX2NzZWN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBwcGNfY3NlY3QuCisJKHBwY19zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkocHBjX3Nhd19hYnMpOiBOZXcgc3RhdGljIHZhcmFibGUuCisJKHBwY19mcm9iX3N5bWJvbCk6IENyZWF0ZSBhdXggZW50cnkgZm9yIGFic29sdXRlIHN5bWJvbHMuICBXYXJuIGlmCisJYSBzeW1ib2wgaGFzIG5vIGNzZWN0LgorCShwcGNfYWRqdXN0X3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy90Yy1wcGMuaCAodGNfYWRqdXN0X3N5bXRhYik6IERlZmluZSBpZiBPQkpfWENPRkYuCisJKHBwY19hZGp1c3Rfc3ltdGFiKTogRGVjbGFyZSBpZiBPQkpfWENPRkYuCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgdGNfYWRqdXN0X3N5bXRhYiBpcyBkZWZpbmVkLAorCWNhbGwgaXQganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8gb2JqX2FkanVzdF9zeW10YWIuCisKKwkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IENoYW5nZSBuYW1lIHRvIGJlIGNvbnN0LgorCSogc3ltYm9scy5oIChzeW1ib2xfZmluZF9vcl9tYWtlKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCitUaHUgT2N0IDI2IDE5OjE4OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbyAoQWxpZ24pOiBNZW50aW9uIFNILgorCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLURpcmVjdGl2ZXMsIC5ldmVuKTogRGVzY3JpYmUgYmVoYXZpb3IsIG5vdAorCS5hbGlnbiB2YWx1ZS4KKwkqIGRvYy9jLXo4ay50ZXhpIChaODAwMCBEaXJlY3RpdmVzLCBnbG9iYWwpOiBGaXggbWlub3IgdHlwby4KKwkoWjgwMDAgRGlyZWN0aXZlcywgZXZlbik6IERvbid0IGdpdmUgbnVtZXJpYyBhbGlnbiB2YWx1ZSwgaW5zdGVhZAorCWV4cGxhaW4gYmVoYXZpb3IuCisKK1RodSBPY3QgMjYgMTE6NDU6MDMgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorCisJKiB0Yy1hcm0uYyAoZG9fbGRzdCk6IEFzc2VtYmxlIGxkci9zdHIgcjAsIFtyMV0gYXMgYSBwcmUtaW5jcmVtZW50CisJaW5zdHJ1Y3Rpb24uCisKK1dlZCBPY3QgMjUgMTE6NTk6MjQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCisJKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gbWFrZSBjbGVhbi1pbmZvLgorCitUdWUgT2N0IDI0IDE1OjIxOjMzIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG5ldyAiLm5zdWJzcGEiIG9wY29kZS4KKwkocGFfc3Vic3BhY2UpOiBGb3IgIi5uc3Vic3BhIiwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBzdWJzcGFjZQorCXdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMsIGV2ZW4gaWYgb25lIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlCisJc2FtZSBuYW1lLgorCitUdWUgT2N0IDI0IDE0OjUwOjM4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBSZW5hbWUgZnJvbQorCVRDX0ZPUkNFX1JFTE9DQVRJT04sIHRha2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gYXJndW1lbnQuICBJZgorCXRoZSBzZWN0aW9uIG9mIHRoZSB0YXJnZXQgc3ltYm9sIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudAorCXNlY3Rpb24sIGFsd2F5cyBmb3JjZSB0aGUgcmVsb2NhdGlvbiB0byBiZSB1c2VkLgorCShNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBOZXcgbWFjcm8gdG8gY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24uCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogUmVuYW1lIGZyb20gdGhlCisJbWRfcGNyZWxfZnJvbSBmdW5jdGlvbiwgdGFraW5nIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBhcmd1bWVudC4KKwlJbnZva2UgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIGluc3RlYWQgb2YgVENfRk9SQ0VfUkVMT0NBVElPTi4KKworCSogd3JpdGUuYyAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogRGVmaW5lIGluIHRlcm1zIG9mIHRoZQorCW9sZGVyIFRDX0ZPUkNFX1JFTE9DQVRJT04gaWYgbm90IGRlZmluZWQuCisJKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IElmIG5vdCBkZWZpbmVkLCBpbnZva2UgbWRfcGNyZWxfZnJvbS4KKwkoZml4dXBfc2VnbWVudCk6IFVzZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gaW5zdGVhZCBvZgorCW1kX3BjcmVsX2Zyb20sIGFuZCBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04gaW5zdGVhZCBvZgorCVRDX0ZPUkNFX1JFTE9DQVRJT04uCisJCitNb24gT2N0IDIzIDE2OjIwOjA0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBpbnB1dC1zY3J1Yi5jIChhc193aGVyZSk6IFNldCBuYW1lIHRvIG51bGwgcG9pbnRlciBpZiB3ZSBkb24ndAorCWhhdmUgYSBmaWxlIG5hbWUuCisJKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE9ubHkgcHJpbnQgZmlsZW5hbWUgaWYgbm9uLW51bGwuCisJKGFzX3Nob3dfd2hlcmUpOiBEaXR0bywgZm9yIGxpbmUgbnVtYmVyIHRvby4KKwkoYXNfd2Fybl9pbnRlcm5hbCwgYXNfYmFkX2ludGVybmFsKTogRGl0dG8uCisKKwkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogSWYgdGhlIGlucHV0IGZpbGUgY2FuJ3QgYmUKKwlvcGVuZWQsIGNvbnNpZGVyIGl0IGFuIGVycm9yLgorCitNb24gT2N0IDIzIDExOjE1OjQ0IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCBtaXBzXzQxMDAgY29udHJvbCwgYW5kIHN1cHBvcnQgZm9yCisgCWFjY2VwdGluZyB0aGUgNDEwMCBhcyBhIE1JUFMgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgKG1kX2JlZ2luLAorIAltYWNyb19idWlsZCwgbWlwc19pcCwgbWRfcGFyc2Vfb3B0aW9uKS4gQWRkaW5nIHN1aXRhYmxlCisgCWNvbW1hbmQtbGluZSBPUFRJT05zLCBhbmQgdXBkYXRpbmcgdGhlIGhlbHAgdGV4dCAobWRfc2hvd191c2FnZSkuCisJCitXZWQgT2N0IDE4IDEzOjIwOjMyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBzdWJzZWdzLmMgKHN1YnNlZ19iZWdpbik6IE9ubHkgc2V0IGFic29sdXRlX2ZyY2hhaW4uZml4Xyogd2hlbgorCUJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZC4KKworCSogVXNlIG9uZSBhY3RpdmUgZnJhZyBhbmQgb25lIG9ic3RhY2sgcGVyIGZyYWcgY2hhaW46CisJKiBmcmFncy5jIChmcmFncyk6IFZhcmlhYmxlIGRlbGV0ZWQuCisJKGZyYWdfYWxsb2MpOiBOZXcgZnVuY3Rpb24uCisJKGZyYWdfZ3JvdywgZnJhZ19tb3JlLCBmcmFnX3ZhcmlhbnQsIGZyYWdfbm93X2ZpeCwKKwlmcmFnX2FwcGVuZF8xX2NoYXIpOiBSZWZlciB0byBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrIGluc3RlYWQgb2YKKwlmcmFncyB2YXJpYWJsZS4KKwkoZnJhZ19uZXcpOiBEaXR0by4gIFZlcmlmeSB0aGF0IGZyY2hfbGFzdCBhbmQgZnJhZ19ub3cgbWF0Y2ggb24KKwllbnRyeSBhbmQgZXhpdCwgYW5kIHRoYXQgb2xkIGZyYWdfbm93IGhhcyBub24temVybyB0eXBlLiAgUmVwbGFjZQorCSJrbm93IiB1c2VzIHdpdGggImFzc2VydCIuICBVc2UgZnJhZ19hbGxvYyBpbnN0ZWFkIG9mIG11Y2tpbmcgd2l0aAorCW9ic3RhY2sgYWxpZ25tZW50LgorCSogZnJhZ3MuaCAoZnJhZ3MpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgorCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IEFkZCBuZXcgZmllbGQgZnJjaF9mcmFnX25vdy4KKwkqIHN1YnNlZ3MuYyAoZnJjaGFpbnMsIGR1bW15X2ZyYWcsIGFic29sdXRlX2ZyY2hhaW4pOiBOZXcgc3RhdGljCisJdmFyaWFibGVzLgorCShzdWJzZWdzX2JlZ2luKTogSW5pdGlhbGl6ZSBmcmNoYWlucyBvYnN0YWNrLiAgVW5kZXIgZ2NjLCBkb24ndAorCWdpdmUgaXQgYW55IHN0cmljdGVyIGFsaWdubWVudCB0aGFuIGZyY2hhaW5TIHN0cnVjdHVyZXMgbmVlZC4gIERvCisJbm90IGluaXRpYWxpemUgZnJhZ3Mgb2JzdGFjay4gIFNldCBmcmFnX25vdyB0byBwb2ludCB0bworCWR1bW15X29ic3RhY2suICBJbml0aWFsaXplIGFic29sdXRlX2ZyY2hhaW4uCisJKHN1YnNlZ19zZXRfcmVzdCk6IFNhdmUgYW5kIHJlc3RvcmUgZnJhZ19ub3cgaW4gZnJjaF9mcmFnX25vdworCWZpZWxkIG9mIGZyY2hhaW5TLiAgRG9uJ3QgY3JlYXRlIG5ldyBmcmFncyBvbiBzZWN0aW9uIHN3aXRjaCwgYW5kCisJdXNlIGZyYWdfYWxsb2Mgd2hlbiBjcmVhdGluZyBhIG5ldyBmcmFnIGNoYWluLiAgRm9yIGFic29sdXRlCisJc2VjdGlvbiwgc2V0IGZyY2hhaW5fbm93IHRvIGFic29sdXRlX2ZyY2hhaW4uICBWZXJpZnkgdGhhdAorCWZyY2hfbGFzdCBhbmQgZnJhZ19ub3cgbWF0Y2ggb24gZW50cnkgYW5kIGV4aXQuICBJbml0aWFsaXplCisJcGVyLWNoYWluIG9ic3RhY2ssIGFuZCB1bmRlciBnY2MsIHNldCByZXF1aXJlZCBhbGlnbm1lbnQgdG8gdGhhdAorCW5lZWRlZCBieSBmcmFnUyBzdHJ1Y3R1cmUuCisKKwkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBWZXJpZnkgZnJfdHlwZSBpcyBub256ZXJvLgorCisJKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogT25seSBjb3B5IGlucHV0IHN0cmluZyBpZiBhCisJZnJlc2ggY29weSBpcyBuZWVkZWQsIG5vdCBpZiB0aGUgc2VjdGlvbiBhbHJlYWR5IGV4aXN0cy4KKwkoc19zdGFiX2dlbmVyaWMpOiBDYWNoZSBzdGFiIHNlY3Rpb24gbmFtZSB0byBieXBhc3MgbG9va3Vwcywgc2luY2UKKwl1c3VhbGx5IGl0IHdpbGwgbWF0Y2guICBDb3VsZCBiZSBtYWRlIGZhc3RlciBzdGlsbCBieSBjaGFuZ2luZyB0aGUKKwltZW1vcnkgYWxsb2NhdGlvbiBydWxlcy4KKwkoc194c3RhYik6IENhY2hlIHNlY3Rpb24gbmFtZSB0byBieXBhc3MgcmVwZWF0ZWQgc3RyaW5nCisJYWxsb2NhdGlvbi4KKworCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBEZWxldGVkIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KKworCSogbGlzdGluZy5jIChmcmFnX25vdyk6IERvbid0IGRlY2xhcmUuCisKKwkqIGFzLmMgKGNodW5rc2l6ZSk6IE5ldyB2YXJpYWJsZS4KKwkoZGVidWdfbWVtb3J5KTogTmV3IHZhcmlhYmxlLgorCShtYWluKTogSWYgZGVidWdfbWVtb3J5IGlzIHNldCwgcmVkdWNlIGNodW5rc2l6ZSBhbmQKKwlfYmZkX2NodW5rc2l6ZS4KKwkqIGFzLmggKGNodW5rc2l6ZSk6IERlY2xhcmUgaXQuCisJKiByZWFkLmMgKHJlYWRfYmVnaW4pOiBVc2UgaXQuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMpOiBJbmNsdWRlICdnJy4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIGl0LgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIE1ha2VmaWxlIGFuZCBjb25maWcuc3RhdHVzIGZyb20KKwl0ZXN0c3VpdGUgZGlyZWN0b3J5LgorCShjbGVhbi1oZXJlKTogRG9uJ3QgZGVsZXRlIHRlc3RzdWl0ZS4gIEluc3RlYWQsIGRlbGV0ZSBvbmx5IHRoZQorCWZpbGVzIHdpdGhpbiBpdCB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nIHRlc3RzLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IENhbGwKKwlmcmFnX25vd19maXggaW5zdGVhZCBvZiBhY2Nlc3Npbmcgb2JzdGFjayBpbmZvIGRpcmVjdGx5LgorCSogY29uZmlnL3RjLWFybS5jIChzX2x0b3JnKTogRGl0dG8uCisJKG1kX2Fzc2VtYmxlKTogRGl0dG8uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQ2FsbCBmcmFnX2dyb3cgaW5zdGVhZCBvZgorCW9ic3RhY2tfcm9vbS4KKworV2VkIE9jdCAxOCAxMjoyMjo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogc3RhYnMuYyAoYW91dF9wcm9jZXNzX3N0YWIpOiBJbnNlcnQgZGVidWcgc3ltYm9sIGludG8gc3ltYm9sCisJY2hhaW4gYWZ0ZXIgcGFyc2luZyB2YWx1ZSBleHByZXNzaW9uLCBpZiBhbnksIHRvIGF2b2lkIHNlcGFyYXRpbmcKKwljb250aW51ZWQgLnN0YWJzIGxpbmVzLgorCitNb24gT2N0IDE2IDEwOjU2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfcHNldWRvX3RhYmxlKTogUmVtb3ZlLgorCShtaXBzX3BvcF9pbnNlcnQpOiBEb24ndCBjYWxsIHBvcF9pbnNlcnQgb24gbWlwc19lbGZfcHNldWRvX3RhYmxlLgorCitNb24gT2N0IDE2IDA3OjA3OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBVc2UgbmV3IGZsYWdzIFBQQ19PUENPREVfQ09NTU9OIGZvcgorCS1tY29tIHN1cHBvcnQgYW5kIFBQQ19PUENPREVfQU5ZIGZvciAtbWFueS4KKwkobWRfcGFyc2Vfb3B0aW9uKTogRGl0dG8uCisJKHBwY19hcmNoKTogRGl0dG8uCisJKG1kX2JlZ2luKTogRm9yIGR1cGxpY2F0ZSBpbnN0cnVjdGlvbnMsIHByaW50IGFsbCBkdXBsaWNhdGVzCisJYmVmb3JlIGFib3J0aW5nLgorCitTdW4gT2N0IDE1IDIyOjA2OjE0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgZm9yIC1tY29tIHRvIHR1cm4gb24KKwljb21tb24gbW9kZSBvcGVyYXRpb24uCisJKG1kX3Nob3dfdXNhZ2UpOiBBZGQgLW1jb20gdG8gdXNhZ2UgbWVzc2FnZS4KKworRnJpIE9jdCAxMyAxMzozMjo0NSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBleHByLmMgKG9wX3JhbmspOiBBZGQgT19zeW1ib2xfcnZhLgorCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19zeW1ib2xfcnZhLgorCSogcmVhZC5jIChjb25zX3dvcmtlcik6IFNldCBPX3N5bWJvbF9ydmEgd2hlbiBuZWNlc3NhcnkuCisJKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IFVuZGVyc3RhbmQgT19zeW1ib2xfcnZhLgorCitUdWUgT2N0IDEwIDExOjM0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYzogQ29ycmVjdCBzX2NvbnMgYXJndW1lbnRzLiAgRnJvbSBNaWNoYWVsCisJSm9vc3RlbiA8am9vc3RAb3JpLmNhZGxhYi5kZT4uCisKK01vbiBPY3QgIDkgMTk6NTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19tYWNybyk6IE1ha2UgY291bnQgdW5zaWduZWQuCisJKHBwY19iaWVpKTogU2V0IHNlZ21lbnQgdG8gbm93X3NlZyBhbmQgdmFsdWUgdG8gY29mZl9uX2xpbmVfbm9zLgorCShwcGNfZnJvYl9zeW1ib2wpOiBIYW5kbGUgQ19CSU5DTCBhbmQgQ19FSU5DTCBzeW1ib2xzIGJ5IHNldHRpbmcKKwl0aGUgZml4X2xpbmUgZmllbGQuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9uX2xpbmVfbm9zKTogUmVuYW1lIGZyb20gbl9saW5lX25vcywgYW5kCisJbWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCB1c2Vycy4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX25fbGluZV9ub3MpOiBEZWNsYXJlLgorCitGcmkgT2N0ICA2IDE2OjI0OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlndXJlLmluIChBQ19BUkdfV0lUSChiZmQtYXNzZW1ibGVyKSk6IEZpeCBoZWxwIG1lc3NhZ2UuCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQ29udmVydCBzcGVjaWZpZWQgYnl0ZQorCWFsaWdubWVudCB0byBwb3dlciBvZiB0d28uICBTZXQgc2l6ZSBvZiBsb2NhbCBic3Mgc3ltYm9sLgorCisJKiBjb25maWcvdGMtbTY4ay5jICh0Y19nZW5fcmVsb2MpOiBGaXggdHlwbyBpbiB2YXJpYWJsZSBuYW1lLgorCitGcmkgT2N0ICA2IDE1OjIyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2IuYywgbWFjcm8uYzogRGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSA8c3RyaW5nLmg+IG9yCisJPHN0cmluZ3MuaD4ganVzdCBhcyBhcy5oIGRvZXMuCisKK0ZyaSBPY3QgIDYgMDk6NTU6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogRml4IHNldHRpbmcgb2YgJHNyY2Rpci4KKworCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogRml4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LgorCSogY29uZmlnL3RjLWFybS5oIChBUk1fQklfRU5ESUFOKTogTW92ZSBkZWZpbml0aW9uIHNvIGRlZmluZWQgZm9yCisJYWxsIGNvZmYgdGFyZ2V0cy4KKworVGh1IE9jdCAgNSAyMDoxNzozMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogZG9jL2FzLnRleGluZm86IFNwbGl0IG91dCB0aGUgTlMzMmsgZmFtaWx5IGRvY3VtZW50YXRpb24sCisJZGVzcGl0ZSBpdHMgYmVpbmcgY29tbWVudGVkIG91dCBmb3Igbm93LgorCSogZG9jL2MtbnMzMmsudGV4aTogTmV3IGZpbGUuCisKKwkqIHNiLmMsIG1hY3JvLmM6IEluY2x1ZGUgc3RyaW5nLmguCisKKwkqIE1ha2VmaWxlLmluIChjb21wYXJpc29uKTogT25seSBjaGVjayAqLm87IHdlIGRvbid0IGNhcmUgaWYKKwl0aW1lc3RhbXBzIGluc2VydGVkIGJ5IHRoZSBuYXRpdmUgbGlua2VyIGRpZmZlci4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2FsaWduKTogT25seSBmaWxsIHdpdGggYSBuby1vcCBwYXR0ZXJuCisJaWYgYWxpZ25tZW50IHN0cmljdGVyIHRoYW4gNCBieXRlcyBpcyByZXF1ZXN0ZWQ7IGluIHRoYXQgY2FzZSwKKwlhbGlnbiB0byBhIDQtYnl0ZSBib3VuZGFyeSBmaXJzdC4KKworCVRodSBTZXAgMjggMTk6MzU6MjcgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19SU1lNX1BhcnNlKTogZWxpbWluYXRlICJtaWdodCBiZSB1c2VkCisJdW5pbml0aWFsaXplZCIgd2FybmluZyBmb3IgYE1heF9Tb3VyY2VfT2Zmc2V0Jy4KKworV2VkIE9jdCAgNCAxNjoxNzowMiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwYXJzZV90b2NfZW50cnkpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgW3RvY10KKwlxdWFsaWZpZXJzIGFuZCBkZXRlY3QgZXJyb3JzIGlmIHByZXNlbnQuCisJKG1kX2Fzc2VtYmxlKTogQWRkIGNhbGwgdG8gcGFyc2VfdG9jX2VudHJ5LiBBbHNvIGFkZGVkIHNvbWUgc3VwcG9ydAorCWZvciB0aGUgW3RvY3ZdIHF1YWxpZmllci4KKwkocHBjX3BlX3RvY2QpOiBOZXcgZnVuY3Rpb24gdG8gc3VwcG9ydCBkYXRhIGluIHRoZSB0b2Mgc2VjdGlvbi4KKworV2VkIE9jdCAgNCAxNDowMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY3JlYXRlIGFuIGF1eCBlbnRyeSBmb3IKKwlhbiBhYnNvbHV0ZSBzeW1ib2wuCisKK1R1ZSBPY3QgIDMgMTI6MTg6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChpc3dvcmQpOiBBY2NlcHQgYWxsIHZhbHVlcyBmcm9tIC02NTUzNiB0bworCSs2NTUzNSwJc28gflZBTCB3aWxsIG5vdCBiZSByZWplY3RlZC4KKworCSogY29uZC5jIChzX2VuZGlmKTogQ2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLiAgSW4gTVJJIG1vZGUsCisJc2tpcCBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBwc2V1ZG8tb3AuCisJKHNfZWxzZSk6IExpa2V3aXNlLgorCSogcmVhZC5jIChnZXRfbGluZV9zYik6IERvbid0IGxvb2sgcGFzdCBidWZmZXJfbGltaXQuCisJKHNfaW5jbHVkZSk6IEluIE1SSSBtb2RlLCBza2lwIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpbGUgbmFtZS4KKworTW9uIE9jdCAgMiAxNjoxNToyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG02OGtfcmVnX3BhcnNlKTogSW4gTVJJIG1vZGUsIHBlcm1pdAorCXBlcmlvZHMgaW4gcmVnaXN0ZXIgbmFtZXMuCisKK1NhdCBTZXAgMzAgMjM6MDM6MzEgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRFAgcmVsYXRpdmUgcmVsb2NzCisJYXJlIG5vdCBhZGp1c3RhYmxlIGluIFNPTSB0byBhdm9pZCBjb25mdXNpbmcgdGhlIG9wdGltaXppbmcKKwlsaW5rZXIuCisKK0ZyaSBTZXAgMjkgMTU6MTg6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQWRkIHNvbWUgc3VwcG9ydCBmb3IgaTk2MCBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgorCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGVuZGlhbi4KKwkoZ2V0X2FyZ3MpOiBEb24ndCBkaXNjYXJkIGEgc3BhY2UgYmV0d2VlbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KKwkoZ2V0X2NkaXNwKTogQ2hhbmdlIHRleHRfc2VjdGlvbiB0byBub3dfc2VnLgorCShzX2VuZGlhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtaTk2MC5oIChNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9UKTogRGVmaW5lLgorCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19sb2dpY2FsX25vdCwgT19sb2dpY2FsX2FuZCwgYW5kCisJT19sb2dpY2FsX29yLgorCSogZXhwci5jIChvcGVyYW5kKTogVHJlYXQgJyEnIGFzIGxvZ2ljYWwgbm90IG9wZXJhdG9yLiAgSWYKKwlUQ19JOTYwLCBpbiBNUkkgbW9kZSBwZXJtaXQgYHNpemVvZiBzZWNuYW1lJyBhbmQgYHN0YXJ0b2YKKwlzZWNuYW1lJy4KKwkob3BfcmFuayk6IEJ1bXAgdmFsdWVzIGJ5IDIgdG8gbWFrZSByb29tIGZvciAmJiBhbmQgfHwuICBBZGQKKwllbnRyaWVzIGZvciAhLCAmJiwgYW5kIHx8LgorCShleHByX2JlZ2luKTogT25seSBkbyBNUkkgY2hhbmdlcyBpZiBUQ19NNjhLLgorCShvcGVyYXRvcik6IFJlY29nbml6ZSB8fCBhbmQgJiYuCisJKGV4cHIpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgorCShwcmludF9leHByXzEpOiBMaWtld2lzZS4KKwkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBkZWJ1ZywgZXJyLCBpcmVwLCBpcmVwYywgcHJpbnQsIHB1cmdlbSwKKwlhbmQgcmVwLgorCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBIYW5kbGUgTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KKwkobXJpX2NvbW1lbnRfZmllbGQpOiBPbmx5IGhhbmRsZSB3ZWlyZCBjb21tZW50cyBpZiBUQ19NNjhLLgorCShzX2Vycik6IE5ldyBmdW5jdGlvbi4KKwkoc19vcmcpOiBPbmx5IHB1bnQgaW4gTVJJIG1vZGUgaWYgVENfTTY4Sy4KKwkoc19tcmlfc2VjdCk6IFdyaXRlIFRDX0k5NjAgdmVyc2lvbi4KKwkoc19wcmludCwgc19wdXJnZW0pOiBOZXcgZnVuY3Rpb25zLgorCSogcmVhZC5oIChzX2Vyciwgc19wcmludCwgc19wdXJnZW0pOiBEZWNsYXJlLgorCSogY29uZC5jIChzX2lmZXFzKTogSW1wbGVtZW50LgorCShpZ25vcmVfaW5wdXQpOiBIYW5kbGUgTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KKwkqIG1hY3JvLmMgKG1hY3JvX3N0cmlwX2F0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWFjcm9faW5pdCk6IEFkZCBzdHJpcF9hdCBwYXJhbWV0ZXIuCisJKGRvX2Zvcm1hbHMpOiBJZiBtYWNyb19zdHJpcF9hdCwgY2hhbmdlIE5BUkcgdG8gJE5BUkcuCisJKGRlZmluZV9tYWNybyk6IFNraXAgYSBjb21tYSBhZnRlciB0aGUgbWFjcm8gbmFtZS4KKwkoZ2V0X2Fwb3N0X3Rva2VuKTogU2tpcCBjaGFyYWN0ZXIgaWYgbWFjcm9fc3RyaXBfYXQsIGV2ZW4gaWYKKwltYWNyb19tcmkuCisJKG1hY3JvX2V4cGFuZF9ib2R5KTogSWYgbWFjcm9fc3RyaXBfYXQsIGRvbid0IHJlY29nbml6ZSBwYXJhbWV0ZXJzCisJaW4gc3RyaW5ncyB1bmxlc3MgdGhleSBhcmUgcHJlY2VkZWQgYnkgYW4gJ0AnLiAgSWYgbWFjcm9fc3RyaXBfYXQsCisJcGFzcyAnQCcgYXMgc3RyaXAgY2hhcmFjdGVyIHRvIHN1Yl9hY3R1YWwuICBJZiBtYWNyb19zdHJpcF9hdCwKKwlzdHJpcCAnQCcgY2hhcmFjdGVycy4KKwkobWFjcm9fZXhwYW5kKTogSWYgbWFjcm9fc3RyaXBfYXQsIGNoYW5nZSBOQVJHIHRvICROQVJHLgorCShkZWxldGVfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCisJKGV4cGFuZF9pcnApOiBTa2lwIGxlYWRpbmcgYW5kIHRyYWlsaW5nICciJyBjaGFyYWN0ZXJzIGlmIGlycGMuCisJKiBtYWNyby5oIChtYWNyb19pbml0KTogTWVudGlvbiBuZXcgc3RyaXBfYXQgcGFyYW1ldGVyLgorCShkZWxldGVfbWFjcm8pOiBEZWNsYXJlLgorCSogYXMuYyAobWFpbik6IElmIFRDX0k5NjAsIHBhc3MgZmxhZ19tcmkgdG8gbWFjcm9faW5pdCBhcworCXN0cmlwX2F0OyBvdGhlcndpc2UsIHBhc3MgMC4KKwkqIGdhc3AuYyAocHJvY2Vzc19wc2V1ZG9fb3ApOiBQYXNzIDAgdG8gbWFjcm9faW5pdCBhcyBzdHJpcF9hdC4KKwkobWFpbik6IExpa2V3aXNlLgorCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGk5NjAgTVJJIG1vZGUuCisKKwkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tZGVmc3ltLgorCitUaHUgU2VwIDI4IDE5OjI1OjA0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZy5pbjogVHJhbnNsYXRlICJwb3dlcnBjIiBpbnRvICJwcGMiLCByZW1vdmUgZ2VuIG9mCisJVkVSU0lPTiwgbW92ZSBnZW4gb2YgImNvbmYiIGhlcmUgZnJvbSBtYWtlZmlsZS4KKwkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peCBtYWtlZmlsZQorCWludG8gTVBXIHN5bnRheC4KKwkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCisJKiBtYWMtYXMucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZSBmaWxlLgorCSogYXMuaCAoaW5saW5lKTogRG9uJ3QgZGVjaWRlIGFib3V0IGRlZmluaW5nIGlmIF9fTVdFUktTX18sCisJcmVtb3ZlIHJlZHVuZGFudCBjb25kaXRpb25hbCBhbmQgZGVmaW5pdGlvbi4KKworCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBGaXggc3ludGF4IGZvciBPQkpfUFJPQ0VTU19TVEFCLgorCitUaHUgU2VwIDI4IDE1OjQzOjE1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFJlbW92ZWQgc29tZSBURV9QRSBzcGVjaWZpYyAKKwltYW5pcHVsYXRpb25zLCBzaW5jZSBJIGNhbid0IHByb3ZlIHRoZXkncmUgbmVlZGVkLgorCShtZF9iZWdpbik6IFJlbW92ZWQgaW5pdF9yZWd0YWJsZSwgaW5zZXJ0X3JlZywgYW5kIHRoZSBjYWxsIHBvaW50cy4KKwkocmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4gUGFyc2VzIGEgcmVnaXN0ZXIgbmFtZSwgaWYgYXBwcm9wcmlhdGUuCisJKG1kX2Fzc2VtYmxlKTogQWRkZWQgY2FsbCB0byByZWdpc3Rlcl9uYW1lIHRvIGhhbmRsZSBzeW1ib2xpYyBuYW1lcy4KKwkocHBjX3BlX3NlY3Rpb24pOiBSZW1vdmVkIGFsbCBkdXBsaWNhdGUgSU1BR0UgZGVmaW5lcywgYW5kIGluY2x1ZGUKKwljb2ZmL3BlLmggaW5zdGVhZC4KKworVGh1IFNlcCAyOCAxMjowOToxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCisJKHBwY19wZV9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZV9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KKworVGh1IFNlcCAyOCAwMToxMTo1OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uaCAoVEFSR0VUX0ZPUk1BVCk6IERlZmluZSBmb3IgYXJtLWNvZmYuCisKK1dlZCBTZXAgMjcgMTI6NTM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKFNfSVNfTE9DQUwpOiBBbGwgc3ltYm9scyBpbiByZWdfc2VjdGlvbiBhcmUgbG9jYWwuCisKKwkqIGNvbmZpZy90Yy1wcGMuaCAoT0JKX1hDT0ZGKTogRGVmaW5lIGlmIE9CSl9DT0ZGIGFuZCBub3QgVEVfUEUuCisJQ2hhbmdlIE9CSl9DT0ZGIGNoZWNrcyB0byBjaGVjayBPQkpfWENPRkYgaW5zdGVhZC4KKwkoVEFSR0VUX0ZPUk1BVCk6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KKwkoTEVYX1FNKTogRGVmaW5lIGlmIFRFX1BFLgorCSogY29uZmlnL3RjLXBwYy5jOiBSZXBsYWNlIE9CSl9DT0ZGIGJ5IE9CSl9YQ09GRiB0aHJvdWdob3V0LgorCVJlbW92ZSBjaGVja3Mgb2YgVEVfUEUgd2l0aGluICNpZmRlZiBPQkpfWENPRkYgc2VjdGlvbnMuCisJKGluaXRfcmVndGFibGUpOiBNYWtlIGkgdW5zaWduZWQuCisJKHBwY19zZXRfY3VycmVudF9zZWN0aW9uKTogUmVuYW1lIGZyb20gc2V0Q3VycmVudFNlY3Rpb24uICBDaGFuZ2UKKwlhbGwgY2FsbGVycy4KKwkocHBjX2FyY2gpOiBSZXR1cm4gYWZ0ZXIgYXNfZmF0YWwgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCisJKG1kX2Fzc2VtYmxlKTogT25seSBkZWNsYXJlIHJlbG9jIGlmIE9CSl9FTEYuICBBZGQgZGVmYXVsdCB0bworCXN3aXRjaCBvbiBmaXh1cHNbaV0ucmVsb2MgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCisJKElNQUdFX1NHTl9MTktfT1RIRVIpOiBGaXggbmVzdGVkIGNvbW1lbnQuCisJKHBwY19wZV9mdW5jdGlvbik6IERvbid0IGNhbGwgcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZS4KKwkocHBjX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlIFRFX1BFIHNlY3Rpb24gY2hlY2tzLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFJldHVybiBhZnRlciBhYm9ydCB0byBhdm9pZCBnY2MKKwl3YXJuaW5nLgorCShtZF9hcHBseV9maXgzKTogQWRkIEJGRF9SRUxPQ18xNl9HT1RfUENSRUwgdG8gc3dpdGNoLgorCSogcmVhZC5jIChMRVhfUU0pOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KKwkobGV4X3R5cGUpOiBVc2UgTEVYX1FNIGZvciAnPycuCisKKwkqIGNvbmZpZ3VyZS5pbjogTm8gbmVlZCB0byBjaGVjayB3aGV0aGVyICR7Y3B1X3R5cGV9IGlzIHBvd2VycGM7CisJaXQgbmV2ZXIgd2lsbCBiZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIFNlcCAyNyAxMTozMzozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IFJlbW92ZSBTZXAgMjYgY2hhbmdlcyB0byB0aGlzCisJZnVuY3Rpb24sIGtlZXBpbmcgb3RoZXIgU2VwLiAyNiBjaGFuZ2VzLgorCitXZWQgU2VwIDI3IDEwOjI5OjEzIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+CisKKwkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZGVkIHN1cHBvcnQgZm9yIHBwY2xlLSotW3BlfHdpbm50XQorCSh0YXJnZXRfZnJhZyk6IFJlbW92ZWQgYW4gZXh0cmFuZW91cyBQUEMgZGVmaW5pdGlvbi4KKwkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IFNhbWUKKwkqIGNvbmZpZy90Yy1wcGMuaDoKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQmFzZSBzdXBwb3J0IGZvciBuZXcgb3IgYWx0ZXJlZAorCXBzZXVkbyBvcHMgLSA8cHJldmlvdXMsIHBkYXRhLCB5ZGF0YSwgcmVsZGF0YSwgcmRhdGEsIHVhbG9uZywgem5vcCwKKwlzZWN0aW9uLCBjb21tLCBmdW5jdGlvbj4gVGhlcmUgd2lsbCBiZSBtb3JlLgorCShwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBQcmVkZWZpbmVkIHJlZyB0YWJsZSB0byBuYW1lIHJlZ2lzdGVycywgZXRjCisJKG1kX2JlZ2luKTogU2V0dXAgcmVnIHRhYmxlIGluaXRpYWxpemF0aW9uCisJKG1kX2Fzc2VtYmxlKTogSW5pdGlhbCBbdG9jXXgocnRvYykgc3VwcG9ydAorCShwcGNfZnJvYl9sYWJlbCk6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKKwkocHBjX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgbW9yZSBwcmVkZWZpbmVkIHNlY3Rpb25zCisgICAgICAgIChwcGNfZnJvYl9zZWN0aW9uKTogUmVtb3ZlZCBzb21lIHhjb2ZmIHNwZWNpZmljIHByb2Nlc3NpbmcgZnJvbSBURV9QRQorCShwcGNfZml4X2FkanVzdGFibGUpOiBSZW1vdmVkIGZyb20gVEVfUEUgbWFpbmxpbmUKKwkobWRfYXBwbHlfZml4Myk6IEZvciBURV9QRSB0b2MgZW50cmllcywgd2UgZG9uJ3QgbmVlZCB0byBtZXNzIAorICAgICAgICB3aXRoIGZ4X2FkZG51bWJlci4gUmVtb3ZlZCBmb3IgdGhlIHRpbWUgYmVpbmcuCisJKGxvdHMpOiBQdXQgYmFjayBtaXNzaW5nIGFzc2lnbm1lbnRzIHRvIHBwY19jdXJyZW50X2NzZWN0LgorCitUdWUgU2VwIDI2IDE0OjU3OjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFN1cHBvcnQgYWxsIG9mIHRoZSBWLjQKKwlyZWxvY2F0aW9ucy4KKwkocHBjX2VsZl9jb25zKTogUmVtb3ZlIHJlc3RyaWN0aW9uIHRoYXQgQCBzdWZmaXhlcyBtdXN0IGJlIGRvbmUKKwl3aXRoIC5sb25nLiAgQWRkIGVycm9yIGlmIHJlbG9jYXRpb24gZG9lcyBub3QgZml0IGluIHRoZSBudW1iZXIgb2YKKwlieXRlcyBwcm92aWRlZC4KKwkobWRfYXNzZW1ibGUpOiBGb3IgYWJzb2x1dGUgYnJhbmNoZXMsIG1hcCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucworCWJhY2sgaW50byBhbiBlcXVpdmFsZW50IGFic29sdXRlIHJlbG9jYXRpb24uCisJKG1kX3BjcmVsX2Zyb20pOiBJZiBUQ19GT1JDRV9SRUxPQ0FUSU9OIGlzIHRydWUsIHJlbG9jYXRpb24gb2Zmc2V0CisJaXMgMCwgbm90IHNlZ21lbnQgc3RhcnQuCisJKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBib3RoZXIgd3JpdGluZyBhZGRlbmQgaW50byB0aGUgaW5zdHJ1Y3Rpb24sCisJc2luY2UgaXQgaXMgaWdub3JlZCwgZ2l2ZW4gdGhhdCB3ZSB1c2UgUkVMQSByZWxvY2F0aW9ucyBmb3IgRUxGLgorCisJKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUgdG8gZm9yY2UgYWxsCisJYnJhbmNoIHByZWRpY3Rpb24gcmVsb2NhdGlvbnMgdG8gYWx3YXlzIGJlIGVtaXR0ZWQuCisKK01vbiBTZXAgMjUgMTY6MDg6NDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogTG93ZXIgY2FzZSByZWxvYyBiZWZvcmUKKwl0ZXN0aW5nLgorCShtZF9hc3NlbWJsZSk6IEJlIG1vcmUgcm9idXN0IGluIHRlcm1zIG9mIHJlbG9jYXRpb25zLgorCShtZF9hcHBseV9maXgzKTogQWxsb3cgMTQgYml0IHJlbG9jcyB0byBiZSBlbWl0dGVkIGZvciBleHRlcm5hbAorCXN5bWJvbHMgaW4gYWRkaXRpb24gdG8gMjYgYml0IHJlbG9jcy4gIFByb3Blcmx5IGluc2VydCAyNi8xNCBiaXQKKwlyZWxvYyB2YWx1ZSBmaWVsZHMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLgkKKworTW9uIFNlcCAyNSAwMDoyMzoxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IE91dHB1dCBsaXR0bGUgZW5kaWFuIGNvbnN0YW50cyBpbgorCWxpdHRsZSBlbmRpYW4gbW9kZS4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBQYXNzICZ0eXBlLCBub3QgdHlwZSwKKwlzX21yaV9zZWN0LgorCisJKiBjb25maWd1cmUuaW46IEZpeCB0eXBvOiBmbXQtZWxmIHRvIGZtdD1lbGYuCisKK0ZyaSBTZXAgMjIgMTY6MzQ6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogUmV3cml0ZSB0byB1c2UgYSB0YWJsZSBvZgorCXN0cmluZ3MgYW5kIHJlbG9jYXRpb25zIHRoZXkgcmVwcmVzZW50LiAgQWRkIEBicnssbn10YWtlbiBmb3IKKwlicmFuY2ggdGFrZW4vbm90IHRha2VuIHN1cHBvcnQuCisJKG1kX2FwcGx5X2ZpeDMpOiBBZGQgQkZEX1JFTE9DX1BQQ19CMTZfQlJ7LE59VEFLRU4gc3VwcG9ydC4KKworVGh1IFNlcCAyMSAyMToxMDoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiAtbXJlbG9jYXRhYmxlLWxpYiBub3cgb25seQorCXNldHMgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQiBhbmQgbm90IGFsc28gRUZfUFBDX1JFTE9DQVRBQkxFLgorCitUaHUgU2VwIDIxIDE2OjMwOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0KTogUGVybWl0IFNFR19BQlNPTFVURSBpbiBrbm93IGV4cHJlc3Npb24uCisJKiBleHByLmMgKGV4cHIpOiBBY2NvdW50IGZvciBuZXcgb3BlcmF0b3JUIHZhbHVlcyBpbiBrbm93CisJZXhwcmVzc2lvbi4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENsZWFyIGZpeHAtPmZ4X3N1YnN5IGlmIHRoZSByZWxvY2F0aW9uCisJaXMgZnVsbHkgcmVzb2x2ZWQuCisKK1RodSBTZXAgMjEgMTQ6MTE6NDkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZsYWdzKTogTmV3IHZhcmlhYmxlIHRvIGhvbGQgdGhlIGZsYWcgYml0cworCXRvIHNldCBpbiB0aGUgRUxGIGhlYWRlci4KKwkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIC1tcmVsb2NhdGFibGUtbGliLiAgTWFrZSBib3RoCisJLW1yZWxvY2F0YWJsZSBhbmQgLW1yZWxvY2F0YWJsZS1saWIgc2V0IHBwY19mbGFncy4KKwkobWRfYmVnaW4pOiBTZXQgRUxGIGZsYWdzIHdpdGggcHBjX2ZsYWdzLgorCitXZWQgU2VwIDIwIDEzOjAxOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgorCXJlYWxjbGVhbi4gIEFkZCBHTlUgc3RhbmRhcmQgbWFpbnRhaW5lci1jbGVhbiBlY2hvcy4KKwkqIGRvYy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCisJcmVhbGNsZWFuLgorCitUdWUgU2VwIDE5IDExOjMxOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBpbW1lZGlhdGUgb3BlcmFuZHMgZm9yICclJy4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBpbW1lZGlhdGUgb3BlcmFuZHMgZm9yICd8Jy4KKwlSZXBsYWNlICdQJyB3aXRoICcwJywgJzEnLCBhbmQgJzInLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2hhbmdlIGxlZnRzdG9wCisJYW5kIHJpZ2h0c3RvcCB0byBub3QgYmUgY29uc3QuCisJKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KKwkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IExpa2V3aXNlLiAgVXNlIG02OGtfaXBfb3AgdG8gZXhhbWluZQorCXRoZSBvcGVyYW5kLCBub3QgbTY4a19yZWdfcGFyc2UuCisJKHNfbXJpX2lmKTogSW4gTVJJIG1vZGUsIHN0b3AgYXQgdGhlIGZpcnN0ICcqJy4KKwkoc19tcmlfd2hpbGUpOiBMaWtld2lzZS4KKwkoc19tcmlfZWxzZSk6IEluIE1SSSBtb2RlLCBpZ25vcmUgdHJhaWxpbmcgY2hhcmFjdGVycy4KKwkoc19tcmlfZW5kaSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgorCShzX21yaV9lbmRmLCBzX21yaV9yZXBlYXQsIHNfbXJpX3VudGlsLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCisJKiBjb25maWcvbTY4ay1wYXJzZS55OiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgorCSogY29uZmlnL202OGstcGFyc2UuaDogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KKworTW9uIFNlcCAxOCAxNToyMjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBDaGFuZ2UgbGVmdHN0YXJ0CisJYW5kIHJpZ2h0c3RhcnQgdG8gbm90IGJlIGNvbnN0LgorCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTGlrZXdpc2UuCisJKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBMaWtld2lzZS4gIElmIHRoZSBsZWZ0IHNpZGUgb2YgdGhlCisJY29tcGFyaXNvbiBpcyBhIHJlZ2lzdGVyLCBhbmQgdGhlIHJpZ2h0IHNpZGUgaXMgbm90LCBzd2FwIHRoZSB0d28KKwlzaWRlcy4KKwkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG02OGtfcmVnX3BhcnNlKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgorCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdfcGFyc2UpOiBEZWNsYXJlLgorCisJKiByZWFkLmMgKG1yaV9jb21tZW50X2ZpZWxkKTogTmV3IGZ1bmN0aW9uLgorCShtcmlfY29tbWVudF9lbmQpOiBOZXcgZnVuY3Rpb24uCisJKHNfYWxpZ25fYnl0ZXMpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQuCisJKHNfYWxpZ25fcHR3bywgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCk6IExpa2V3aXNlLgorCShzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCk6IExpa2V3aXNlLgorCShzX3NwYWNlKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkIHJhdGhlciB0aGFuIGRvaW5nIGl0IGJ5IGhhbmQuCisJKGNvbnNfd29ya2VyLCBlcXVhbHMpOiBMaWtld2lzZS4KKwkoc19lbmQpOiBJZ25vcmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCAnKicgb3IgJyEnLgorCSogcmVhZC5oIChtcmlfY29tbWVudF9maWVsZCk6IERlY2xhcmUuCisJKG1yaV9jb21tZW50X2VuZCk6IERlY2xhcmUuCisJKiBjb25kLmMgKHNfaWYpOiBVc2UgbXJpX2NvbW1lbnRfZmllbGQuCisJKiBjb25maWcvdGMtbTY4ay5jIChzX2NoaXAsIHNfcmVnKTogTGlrZXdpc2UuCisKKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBIYW5kbGUgQUJTLXN5bSBpbiAtc3ltIGNhc2UgcmF0aGVyIHRoYW4KKwlzeW0tc3ltIGNhc2UuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLiAgUGVybWl0IG5lZ2F0aXZlCisJc3ltYm9scyBpZiBUQ19NNjhLLgorCSogY29uZmlnL3RjLW02OGsuYyAodGNfY29mZl9maXgycnR5cGUpOiBJZiBmeF90Y2JpdCBpcyBzZXQsIHJldHVybgorCVJfUkVMTE9OR19ORUcuCisJKHRjX2dlbl9yZWxvYyk6IElmIGZ4X3RjYml0IGlzIHNldCwgYWJvcnQuCisJKG1kX2FwcGx5X2ZpeF8yKTogRm9yIGEgbmVnYXRpdmUgcmVsb2MsIG1vdmUgZnhfc3Vic3kgdG8gZnhfYWRkc3ksCisJYW5kIHNldCBmeF90Y2JpdC4KKworCSogY29uZmlnL3RjLW02OGsuYyAoc19yZWcpOiBJZ25vcmUgY29tbWVudCBmaWVsZCBpbiBNUkkgbW9kZS4KKworTW9uIFNlcCAxOCAxNDo0NDowNCAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KKworCSogY29uZmlndXJlLmluIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworU3VuIFNlcCAxNyAyMjoxNzo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuZGlhbiB0byBsaXR0bGUgZm9yIG1pcHMtKi11bHRyaXgqLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgU2VwIDE1IDEzOjE2OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZXhwci5jIChjdXJyZW50X2xvY2F0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIEhhbmRsZSBtYWdpYworCXN5bWJvbCBgLic7IGluIGFic29sdXRlIHNlY3Rpb24sIHJldHVybiBhIGNvbnN0YW50LgorCShvcGVyYW5kKTogQ2FsbCBjdXJyZW50X2xvY2F0aW9uIGZvciAnLicgYW5kICckJywgaW5zdGVhZCBvZiBkb2luZworCWl0IGlubGluZS4gIEluIE1SSSBtb2RlLCBjYWxsIGN1cnJlbnRfbG9jYXRpb24gZm9yICcqJy4KKworRnJpIFNlcCAxNSAyMTozOToyOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLW02OGsuYzogQ2hhbmdlIHNvbWUgIkNPTlNUIiByZWZlcmVuY2VzIHRvICJjb25zdCIuCisKK0ZyaSBTZXAgMTUgMTc6Mjc6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlUdWUgU2VwIDEyIDE3OjA4OjIzIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgorCisJKiBjb25maWcvb2JqLXZtcy5jIChWTVNfc3RhYl9wYXJzZSk6IHNpbXBsaWZ5IGZpcnN0IGxvb3A7CisJdXNlIFNfR0VUX05BTUUvbW9kaWZ5L1NfU0VUX05BTUUgc2VxdWVuY2UgaW5zdGVhZCBvZiBhYnVzaW5nCisJU19HRVRfTkFNRSB3aGVuIHVwZGF0aW5nIHN5bWJvbCBuYW1lLgorCShsb2NhbF9zeW1ib2xzX0RTVCk6IGZpcnN0IHByZWZpeC9wb3N0Zml4IHR5cG8gZnJvbSBKdWx5IDIxc3QuCisJW3BsdXMgY29tbWVudCByZWZvcm1hdHRpbmcgLS1rcl0KKworV2VkIFNlcCAxMyAxMjozMzowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChFWFBFQ1QpOiBOZXcgdmFyaWFibGUuCisJKENIRUNLRkxBR1MpOiBSZW1vdmUuCisJKHNpdGUuZXhwKTogTmV3IHRhcmdldC4KKwkoY2hlY2spOiBSZXdyaXRlIHRvIGludm9rZSBydW50ZXN0IGRpcmVjdGx5LCByYXRoZXIgdGhhbiByZWN1cnJpbmcKKwlkb3duIGludG8gdGVzdHN1aXRlLgorCShjbGVhbi1oZXJlKTogUmVtb3ZlIHRlc3RzdWl0ZSBkaXJlY3RvcnkuCisJKGNsZWFuLCBkaXN0Y2xlYW4pOiBEb24ndCByZWN1ciBpbnRvIHRlc3RzdWl0ZS4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBBQ19DT05GSUdfU1VCRElSUyh0ZXN0c3VpdGUpLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBDaGFuZ2UgdG8gdGhlIHNlZ21lbnQgd2UgYXJlCisJcmVsYXhpbmcsIGluIGNhc2UgbWRfY29udmVydF9mcmFnLCBjYWxsZWQgYnkgY3Z0X2ZyYWdfdG9fZmlsbCwKKwl3YW50cyB0byBjYWxsIGZpeF9uZXcuCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUGVybWl0IFBDIHJlbGF0aXZlIGNvZGUgaWYgdGhlCisJc2VnbWVudCBvZiB0aGUgc3ltYm9sIGlzIHRoZSBjdXJyZW50IHNlZ21lbnQsIG5vdCBqdXN0IGluCisJdGV4dF9zZWN0aW9uLgorCShtZF9jb252ZXJ0X2ZyYWdfMSk6IERvbid0IGNhbGwgc3Vic2VnX2NoYW5nZS4KKwkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KKworVHVlIFNlcCAxMiAxMDozNjo0MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBGaXggZGVidWdnaW5nIHByaW50ZiwgYW5kIGxlYXZlIGl0CisJb3V0IGJ5IGRlZmF1bHQuCisKK01vbiBTZXAgMTEgMTE6Mzk6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkb2MvY29uZmlndXJlLmluOiBSZW1vdmUgdW51c2VkIGZpbGUuCisKKwkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEdyYWIgYWxsIGF2YWlsYWJsZSBzcGFjZXMgYXQgc3RhcnQgb2YKKwlsaW5lIGJlZm9yZSBwcmVzZXJ2aW5nIGEgc2luZ2xlIHNwYWNlLiAgUmVtb3ZlIHN0YXRlID09IDAgdGVzdAorCXdoaWNoIHdpbGwgbmV2ZXIgc3VjY2VlZC4KKwkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogRGVsZXRlIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZQorCWZvcm1hbCBoYXNoIHRhYmxlLgorCShtYWNyb19leHBhbmQpOiBJbiBNUkkgbW9kZSwgc3RvcCB3aGVuIHdoaXRlc3BhY2UgaXMgc2VlbiBpbiB0aGUKKwlhcmd1bWVudCBsaXN0LgorCisJKiBzYi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCisJKiBtYWNyby5jOiBMaWtld2lzZS4gIEFsc28gaW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KKworRnJpIFNlcCAgOCAwMDoyNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBrZWVwIGEgc3BhY2UgYmVmb3JlIGEKKwlwb3NzaWJsZSBjb21tZW50IGNoYXJhY3Rlci4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBJbiBNUkkgbW9kZSwgaWdub3JlIGFueXRoaW5nIGFmdGVyCisJYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdGFrZXMgbm8gb3BlcmFuZHMuCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBnYXNwIGluICQodG9vbGRpcikuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSGFuZGxlIGEgbm9uIHplcm8gYmFzZSByZWdpc3RlciBmb3IKKwlNX1V7TCxTfXtELFcsSH1fQS4KKworCSogZ2FzcC5jIChzaG93X3VzYWdlKTogUHV0IHByb2dyYW1fbmFtZSBhcmd1bWVudCBpbiBmaXJzdCBmcHJpbnRmLAorCW5vdCBzZWNvbmQuCisKK1RodSBTZXAgIDcgMTI6MzM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBleHByLmMgKG9wZXJhbmQpOiBIYW5kbGUgMDggYW5kIDA5IGluIE1SSSBtb2RlLgorCSogbWFjcm8uYyAoSVNTRVApOiBSZW1vdmUgZHVwbGljYXRlZCBgIicgY2hhcmFjdGVyLgorIAkoZ2V0X2FueV9zdHJpbmcpOiBDb3B5IHNvbWUgY2hhcmFjdGVycyBmb3Igd2hpY2ggSVNTRVAgaXMgdHJ1ZToKKwknOycsICc+JywgJygnLCAnKScuICBPdGhlcndpc2Ugd2UgY2FuIGdldCBpbiBhbiBpbmZpbml0ZSBsb29wLgorCSogcmVhZC5jIChzX3NwYWNlKTogSW4gTVJJIG1vZGUsIHRoZSBleHByZXNzaW9ucyBzdG9wIGF0IHRoZSBmaXJzdAorCXVucXVvdGVkIHNwYWNlLgorCShjb25zX3dvcmtlcik6IEluIE1SSSBtb2RlLCByZXN0b3JlIHRoZSB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYXQKKwl0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KKworCSogcmVhZC5jIChjb25zX3dvcmtlcik6IERvbid0IHVzZSAjZWxpZjsgb2xkIGNvbXBpbGVycyBkb24ndAorCXN1cHBvcnQgaXQuCisKK1dlZCBTZXAgIDYgMjE6MTM6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwgc2lsZW50bHkgZW5kIHF1b3RlZCBzdHJpbmdzCisJYXQgbmV3bGluZSBjaGFyYWN0ZXJzLiAgSW4gTVJJIG1vZGUsIGFsd2F5cyBrZWVwIHNwYWNlcyBpbiB0aGUKKwlvcGVyYW5kcyBmaWVsZC4gIEluIE1SSSBtb2RlLCB0cmVhdCBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgYXMgYQorCXJlZ3VsYXIgY29tbWVudCBjaGFyYWN0ZXIgZm9sbG93aW5nIGEgc3BhY2UuCisJKiBjb25kLmMgKGlnbm9yZV9pbnB1dCk6IFVzZSBzdHJuY2FzZWNtcCByYXRoZXIgdGhhbiBzdHJuY21wIHdoZW4KKwlsb29raW5nIGZvciBzcGVjaWFsIHBzZXVkby1vcHMuCisJKiByZWFkLmMgKGNvbnNfd29ya2VyKTogSW4gTVJJIG1vZGUsIHRoZSBleHByZXNzaW9ucyBzdG9wIGF0IHRoZQorCWZpcnN0IHVucXVvdGVkIHNwYWNlLgorCShlcXVhbHMpOiBMaWtld2lzZS4KKworV2VkIFNlcCAgNiAxNTowMzo1MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zaC5jIChnZXRfb3BlcmFuZHMpOiBSZWFkIHRoaXJkIGFyZyBpZiBpdCBleGlzdHMuCisJT3RoZXJ3aXNlLCBjbGVhciBpdC4KKwkoZ2V0X3NwZWNpZmljLCBjYXNlIEZfRlIwKTogQWRkLgorCitXZWQgU2VwICA2IDE1OjAzOjUzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKGdldF9zcGVjaWZpYyk6IERlbGV0ZSBhcmdfdG9fdGVzdC4KKwkobWRfYXNzZW1ibGUpOiBJbmNyZWFzZSBvcGVyYW5kIGFycmF5IGZyb20gMiB0byAzLgorCitUdWUgU2VwICA1IDE2OjQ3OjM2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIENZR05VUyBMT0NBTCBjb21tZW50cy4KKwkobWRfYmVnaW4pOiBVc2UgMC8xIGluc3RlYWQgb2YgVFJVRS9GQUxTRS4KKwkobWRfc2hvd191c2FnZSk6IEJyZWFrIHVwIGxvbmcgZm9ybWF0IHN0cmluZyBmb3IgdGhlIGJlbmVmaXQKKwlvZiBsYW1lIGNvbXBpbGVycy4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBEaXR0by4KKwkqIGdhc3AuYyAoc2hvd191c2FnZSk6IERpdHRvLgorCSogbWFjcm8uYyAoY2hlY2tfbWFjcm8pOiBDYXN0IHJlc3VsdCBvZiBoYXNoX2ZpbmQuCisKK1R1ZSBTZXAgIDUgMTQ6NDY6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogV2hlbiB0ZXN0aW5nIGZvciBhIGZyZWUoKSBkZWNsYXJhdGlvbiBpbiBzeXN0ZW0KKwloZWFkZXIgZmlsZXMsIGNhc3QgdGhlIGFkZHJlc3MgdG8gYSBmdW5jdGlvbiBwb2ludGVyLCBub3QgdG8gYW4KKwlpbnRlZ2VyLgorCisJKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogQ2FsbCBUQ19JTklUX0ZJWF9EQVRBIGlmIFRDX0ZJWF9UWVBFCisJaXMgZGVmaW5lZC4gIERvbid0IGluaXRpYWxpemUgZnhfYnNyLiAgVmVyaWZ5IHRoYXQgZnhfc2l6ZSBmaWVsZAorCWlzIHdpZGUgZW5vdWdoIHRvIGhvbGQgc3RvcmVkIHZhbHVlLgorCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IENoYW5nZSB0Y19maXhfZGF0YSB0byB0eXBlIFRDX0ZJWF9UWVBFIGlmCisJdGhhdCBpcyBkZWZpbmVkLCBvdGhlcndpc2Ugb21pdCBpdC4gIERlbGV0ZSBmeF9ic3IuICBDaGFuZ2UKKwlmeF9zaXplIHRvIHVuc2lnbmVkIGNoYXIuCisJKiBjb25maWcvdGMtaTk2MC5oIChUQ19GSVhfVFlQRSwgZnhfYnNyLCBUQ19JTklUX0ZJWF9EQVRBKTogTmV3CisJbWFjcm9zLgorCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZJWF9UWVBFLCBmeF9ic3IsIFRDX0lOSVRfRklYX0RBVEEpOiBOZXcKKwltYWNyb3MuCisJKiBjb25maWcvdGMtaHBwYS5oIChUQ19GSVhfVFlQRSk6IERlZmluZSBhcyBQVFIuCisKKwkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2FwcGx5X2ZpeCk6IERlbGV0ZSBjb2RlIGZvciBjaGVja2luZworCWZ4X2ltX2Rpc3AsIGFuZCBmb3IgaGFuZGxpbmcgbm9uLXplcm8gdmFsdWVzLCBzaW5jZSBpdCBuZXZlciBnZXRzCisJc2V0IGFmdGVyIGJlaW5nIGluaXRpYWxpemVkIHRvIHplcm8uCisKKwkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBNYWtlIGZ4X2ltX2Rpc3AgYWx3YXlzIDIgYml0cywgc2luY2UgdGhlCisJb25seSB0Yy0qIGZpbGVzIGFjdHVhbGx5IHVzaW5nIGl0IG5lZWQgdGhhdCBtdWNoLgorCisJTlMzMksgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgorCSogY29uZmlndXJlLmluOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCisJbnMzMmstcGM1MzItbGl0ZXMqIGxpa2UgbnMzMmstcGM1MzItbmV0YnNkKi4KKwkqIGNvbmZpZy90Yy1uczMyay5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KKworRnJpIFNlcCAgMSAxNzowMjoxNSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogR2V0IFRDX0ZPUkNFX1JFTE9DQVRJT04gdXAgdGhlCisJcmlnaHQgd2F5IQorCitGcmkgU2VwICAxIDA4OjIwOjE5IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uLCBtZF9iZWdpbiwgbWRfc2hvd191c2FnZSk6CisJQWRkIHN1cHBvcnQgZm9yICItbWNwdT12cjQzMDAiIGFzIHByb2Nlc3NvciBpZGVudGlmaWVyLgorCitUaHUgQXVnIDMxIDE2OjQxOjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBSZW1vdmUgY2hhbmdlIG9mIDI5dGguCisJKiBjb25maWcvdGMte2kzODYsYXJtfS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogS2VlcCBSVkEgcmVsb2NzLgorCitUdWUgQXVnIDI5IDE5OjQyOjU4IDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKSBbY2FzZSBQT1NUL1BSRS9CQVNFXTogRml4IHR5cG8gd2hlbgorIAlsb29raW5nIGF0IG91dGVyIGRpc3BsYWNlbWVudC4gIERvbid0IHNldCB0aGUgcG9zdGluZGV4IGJpdCBpZiB0aGUKKyAJaW5kZXggc3VwcHJlc3MgYml0IGlzIHNldCAoZm9yIG1lbW9yeSBpbmRpcmVjdCBhZGRyZXNzaW5nIG1vZGUpLgorCitUaHUgQXVnIDMxIDA2OjQ5OjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAodGNfZ2VuX3JlbG9jKTogRGVsZXRlIGR1cGxpY2F0ZWQgY29kZS4KKworV2VkIEF1ZyAzMCAyMzo1MTo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEZyZWUgc2F2ZWRfaW5wdXQgd2hlbiB0aGUgZnJvbSBidWZmZXIKKwlleGFjdGx5IGZpbGxzIHRoZSB0byBidWZmZXIuCisKK1dlZCBBdWcgMzAgMTM6NDY6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHBhcnNlX2tleXdvcmRfYXJnLCBwYXJzZV9jb25zdF9leHByX2FyZyk6IE5ldyBmbnMuCisJKHNwYXJjX2lwKTogQ2FsbCB0aGVtIGZvciBhc2ksIG1lbWJhciwgYW5kIHByZWZldGNoIHBhcnNpbmcuCisKK1R1ZSBBdWcgMjkgMTU6NDU6MzcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1lbWJhcl9tYXNrcyk6IERlbGV0ZWQuCisJKHNwYXJjX2lwKTogQ2xlYW4gdXAgQVNJIGFuZCBtZW1iYXIgc3VwcG9ydC4KKworVHVlIEF1ZyAyOSAxMzoyMDoyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBSdmEgaXMgbmV3IGVudHJ5LgorCShjb25zX3dvcmtlcik6IE5ldywgc3BsaXQgZnJvbSBjb25zLiAgSGFuZGxlcyBydmEuCisJKGNvbnMsIHNfcnZhKTogQ2FsbCBjb25zX3dvcmtlci4KKwkqIHJlYWQuaCAoc19ydmEpOiBOZXcgZGVjbGFyYXRpb24uCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgdGhyb3cgYXdheSBydmEgcmVsb2NzLgorCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBSVkEuCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJ0eXBlKTogSGFuZGxlIFJWQS4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0NPVU5UX1JFTE9DKTogUmVtZW1iZXIgUlZBcy4KKwkoVENfUlZBX1JFTE9DKTogTmV3IGRlZmluaXRpb24uCisKK1N1biBBdWcgMjcgMTc6NDE6MDUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jIChkb19zd2kpOiBBbGxvdyBvcHRpb25hbCBsZWFkaW5nICcjJy4KKworU2F0IEF1ZyAyNiAxNzoyNDoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBJZiBURV9ERUxUQSBpcyBkZWZpbmVkLAorCWluY2x1ZGUgJyMnLgorCSogY29uZmlnL3RjLW02OGsuaCAoTk9fUFNFVURPX0RPVCk6IERlZmluZSBpZiBURV9ERUxUQSBpcworCWRlZmluZWQuCisKKwkqIGNvbmZpZy90ZS1kZWx0YS5oOiBJbmNsdWRlIG9iai1mb3JtYXQuaC4KKwkqIGNvbmZpZy90ZS1zY28zODYuaDogTGlrZXdpc2UuCisJKiBjb25maWcvdGUtc3lzdjMyLmg6IExpa2V3aXNlLgorCisJKiBhcHAuYyAoc2NydWJfZmlsZSk6IFJlbW92ZS4KKwkoc2NydWJfZnJvbV9maWxlLCBzY3J1Yl90b19maWxlKTogUmVtb3ZlLgorCShzY3J1Yl9zdHJpbmcsIHNjcnViX2xhc3Rfc3RyaW5nKTogUmVtb3ZlLgorCShzY3J1Yl9mcm9tX3N0cmluZywgc2NydWJfdG9fc3RyaW5nKTogUmVtb3ZlLgorCShzYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXRfbGVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKHN0cnVjdCBhcHBfc2F2ZWQpOiBSZW1vdmUgc2NydWJfc3RyaW5nLCBzY3J1Yl9sYXN0X3N0cmluZywgYW5kCisJc2NydWJfZmlsZSBmaWVsZHMuICBBZGQgc2F2ZWRfaW5wdXQgYW5kIHNhdmVkX2lucHV0X2xlbiBmaWVsZHMuCisJKGFwcF9wdXNoKTogQWRqdXN0IHNhdmVkIGZpZWxkcyBmb3IgY2hhbmdlcyBpbiBzdHJ1Y3QgYXBwX3NhdmUuCisJSW5pdGlhbGl6ZSBzdGF0ZSBhbmQgc2F2ZWRfaW5wdXQuCisJKGFwcF9wb3ApOiBBZGp1c3Qgc2F2ZWQgZmllbGRzIGZvciBjaGFuZ2VzIGluIHN0cnVjdCBhcHBfc2F2ZS4KKwkoZG9fc2NydWJfY2hhcnMpOiBSZW5hbWUgZnJvbSBkb19zY3J1Yl9uZXh0X2NoYXIgYW5kIHJld3JpdGUgdG8KKwlwcm9jZXNzIGEgYnVmZmVyIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCisJKG1haW4sIGFzX3dhcm4pOiBSZW1vdmUgb2Jzb2xldGUgdGVzdGluZyBjb2RlLgorCSogYXMuaCAoZG9fc2NydWJfbmV4dF9jaGFyKTogRG9uJ3QgZGVjbGFyZS4KKwkoZG9fc2NydWJfY2hhcnMpOiBEZWNsYXJlLgorCShzY3J1Yl9mcm9tX2ZpbGUsIHNjcnViX2Zyb21fc3RyaW5nKTogRG9uJ3QgZGVjbGFyZS4KKwkoc2NydWJfdG9fZmlsZSwgc2NydWJfdG9fc3RyaW5nKTogRG9uJ3QgZGVjbGFyZS4KKwkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9nZXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIpOiBDYWxsIGRvX3NjcnViX2NoYXJzIHJhdGhlciB0aGFuCisJZG9fc2NydWJfbmV4dF9jaGFyLgorCSogcmVhZC5jIChzY3J1Yl9zdHJpbmcsIHNjcnViX3N0cmluZ19lbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoc2NydWJfZnJvbV9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIGRvX3NjcnViX2NoYXJzIHJhdGhlciB0aGFuCisJZG9fc2NydWJfbmV4dF9jaGFyLgorCitUaHUgQXVnIDI0IDE4OjUwOjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZ2FzcC5jIChhc19hYm9ydCk6IE5ldyBmdW5jdGlvbi4KKwkqIHNiLmMgKHNiX2J1aWxkKTogUmV2ZXJ0IHllc3RlcmRheSdzIHBhdGNoLgorCisJKiBNYWtlZmlsZS5pbiAoZ2FzcC5uZXcpOiBEZXBlbmQgdXBvbiAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEuCisJSnVzdCBsaW5rIGFnYWluc3QgbGliaWJlcnR5LCBub3QgYWdhaW5zdCAkKExJQlMpLgorCitXZWQgQXVnIDIzIDE1OjE4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogc2IuYyAoc2JfYnVpbGQpOiBVbmRlZmluZSBhYm9ydCBiZWZvcmUgY2FsbGluZyBpdCwgc2luY2UgZ2FzcAorCWRvZXMgbm90IHByb3ZpZGUgYXNfYWJvcnQuCisKK1dlZCBBdWcgMjMgMTA6NDA6NDEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHNldF90YXJnZXRfZW5kaWFuKTogTmV3IHN0YXRpYyB0byBzYXkgd2hldGhlcgorCXdlJ3ZlIGluaXRpYWxpemVkIHRhcmdldF9iaWdfZW5kaWFuIG9yIG5vdC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IHNldF90YXJnZXRfZW5kaWFuIGlmIHdlIHNldCB0aGUgdmFyaWFibGUKKwl0YXJnZXRfYmlnX2VuZGlhbi4KKwkobWRfYmVnaW4pOiBPbmx5IHNldCB0YXJnZXRfYmlnX2VuZGlhbiBpZiAhc2V0X3RhcmdldF9lbmRpYW4uCisKK1R1ZSBBdWcgMjIgMDM6MDA6MzMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJU2F0IEF1ZyAxOSAxODowODoxNiAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCSogY29uZmlnL29iai12bXMuaCAoRFNUX1NfQ19TUkNfU0VUUkVDX1csIERTVF9TX0NfU1JDX0RFRkxJTkVTX0IpOgorCU5ldyBtYWNyb3MuCisJKiBjb25maWcvb2JqLXZtcy5jIChWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24sCisJVk1TX1RCVF9Tb3VyY2VfTGluZXMpOiBNYWtlIHRyYWNlYmFjayBpbmZvIGJlIHJvYnVzdCBlbm91Z2ggdG8KKwloYW5kbGUgaHVnZSBzb3VyY2UgZmlsZXMuCisJKFZNU19UQlRfU291cmNlX0ZpbGUpOiBSZW9yZ2FuaXplIHRoZSBuYXRpdmUtIHZzIGNyb3NzLWFzc2VtYmx5CisJc3VwcG9ydCBzbyB0aGF0IGFjdHVhbCBvYmplY3QgZmlsZSBvdXRwdXQgaXMgY2xlYXJlci4KKwkoVk1TX1RCVF9Tb3VyY2VfRmlsZTogRmFiLCBOYW0sIERhdGVfWGFiLCBGaWxlX0hlYWRlcl9YYWIpOgorCVJlcGxhY2Ugc3RhdGljIHZhcmlhYmxlcyB3aXRoIGF1dG9tYXRpYyBvbmVzLgorCisJU2F0IEF1ZyAxMiAyMDoxODoxNSAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCSogY29uZmlnL29iai12bXMuYyAoTW9kdWxlX05hbWUpOiBuZXcgZmlsZSBzY29wZSB2YXJpYWJsZS4KKwkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4pOiB1c2UgaXQgaW5zdGVhZCBvZiBsb2NhbCB2YXJpYWJsZS4KKwkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogZGl0dG87IGFzc2lnbiBpdHMgdmFsdWUgaGVyZS4KKwkoV3JpdGVfVk1TX0VPTV9SZWNvcmQpOiBzZWNvbmQgYXJndW1lbnQgaGFzIHR5cGUgdmFsdWVULgorCShWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplKTogIHNpbXBsaWZ5IHNlYXJjaCBsb29wOyByZXR1cm4KKwl0eXBlIGlzIG9mZnNldFQ7IHNlY29uZCBhcmd1bWVudCBpcyB1bnNpZ25lZC4KKworCVNhdCBKdW4gMTcgMTk6MDU6MjUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IFVzZSB4c3RyZXJyb3IgaW5zdGVhZCBvZiBzdHJlcnJvci4KKworTW9uIEF1ZyAyMSAxMzo1NzoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBY2NlcHQgLS1kZWZzeW0gU1lNPVZBTFVFLgorCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLWRlZnN5bS4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgZW5kIHRoZQorCXN0YXRlbWVudCBpbnNpZGUgYSBxdW90YXRpb24uCisJKHNfc3BhY2UpOiBEb24ndCB3YXJuIGFib3V0IGEgemVybyByZXBlYXQgY291bnQgaW4gTVJJIG1vZGUuCisJKiBjb25maWcvdGMtbTY4ay5jIChjcmFja19vcGVyYW5kKTogSW4gTVJJIG1vZGUsIGRvbid0IGNvdW50CisJcGFyZW50aGVzZXMgaW5zaWRlIHF1b3Rlcy4KKwkobWRfYXNzZW1ibGUpOiBJbiBNUkkgbW9kZSwgYW55dGhpbmcgYWZ0ZXIgdGhlIG9wZXJhbmRzIGZpZWxkIGlzIGEKKwljb21tZW50LgorCShwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQWRqdXN0IHN0YXJ0IGFuZCBzdG9wIHRvIHJlbW92ZQorCXNwYWNlcy4KKwkoc19tcmlfZm9yKTogTGlrZXdpc2UuCisKKwkqIGNvbmQuYyAoc19pZmRlZik6IFJlc3RvcmUgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgc3ltYm9sIG5hbWUsCisJaW4gY2FzZSBpdCBpcyBhIG5ld2xpbmUuCisJKHNfaWYpOiBJZiBpZ25vcmluZyB0aGUgY3VycmVudCB0cmVlLCBkb24ndCB0cnkgdG8gcGFyc2UgdGhlCisJZXhwcmVzc2lvbi4KKworCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIExFWF9JU19TVFJJTkdRVU9URSBvcgorCUxFWF9JU19PTkVDSEFSX1FVT1RFIGlzIHNlZW4gaW4Jc3RhdGUgMTAsIHByZXNlcnZlIG9uZSBzcGFjZS4KKworCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IGlycCwgaXJwYywgbWFjcm8sIGFuZCByZXB0LiBNUkkgbW9kZQorCW5vdyBzdXBwb3J0cyBtYWNyb3MsIGlmYywgaWZuYywgaXJwLCBpcnBjLCByZXB0LCBhbmQgZW5kciwgd2l0aG91dAorCXVzaW5nIGdhc3AuCisKKwlBZGQgc3VwcG9ydCBmb3IgbWFjcm9zLgorCSogYXMuYzogSW5jbHVkZSBzYi5oIGFuZCBtYWNyby5oLgorCShtYXhfbWFjcm9fbmV4dCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisJKG1haW4pOiBDYWxsIG1hY3JvX2luaXQuCisJKG1hY3JvX2V4cHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogYXMuaCAobWF4X21hY3JvX25lc3QpOiBEZWNsYXJlLgorCSogcmVhZC5jIChsaW5lX2xhYmVsKTogUmVuYW1lIGZyb20gbXJpX2xpbmVfbGFiZWwuICBDaGFuZ2UgYWxsCisJdXNlcy4KKwkocG90YWJsZSk6IEFkZCBleGl0bSwgaXJwLCBpcnBjLCBtYWNybywgbWV4aXQsIHJlcHQuCisJKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEFsd2F5cyBjbGVhciBsaW5lX2xhYmVsIGF0IHRoZSBzdGFydCBvZiBhCisJbGluZSwgbm90IGp1c3Qgd2hlbiBmbGFnX21yaSBvciBMQUJFTFNfV0lUSE9VVF9DT0xPTlMuICBGaXgKKwlNUkkvTEFCRUxTX1dJVEhPVVRfQ09MT05TIGhhbmRsaW5nLiAgSW4gTVJJIG1vZGUsIHBlcm1pdCBsYWJlbDoKKwllcXUgdmFsLiAgU2V0IGxpbmVfbGFiZWwgd2hlbiBjYWxsaW5nIGNvbG9uLiAgSW4gTVJJIG1vZGUsIGEKKwlsZWFkaW5nICcuJyBkb2VzIG5vdCBpbXBseSBhIHBzZXVkby1vcC4gIENoZWNrIGZvciBtYWNybyBleHBhbnNpb24KKwliZWZvcmUgY2FsbGluZyBtZF9hc3NlbWJsZS4KKwkoc19pcnApOiBOZXcgZnVuY3Rpb24uCisJKGdldF9saW5lX3NiKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoc19tYWNybyk6IE5ldyBmdW5jdGlvbi4KKwkoc19tZXhpdCk6IE5ldyBmdW5jdGlvbi4KKwkoc19yZXB0KTogTmV3IGZ1bmN0aW9uLgorCSogcmVhZC5oIChsaW5lX2xhYmVsKTogUmVuYW1lIGZyb20gbXJpX2xpbmVfbGFiZWwuCisJKHNfaXJwLCBzX3JlcHQpOiBEZWNsYXJlLgorCShzX21hY3JvLCBzX21leGl0KTogRGVjbGFyZS4KKwkqIGlucHV0LXNjcnViLmM6IEluY2x1ZGUgc2IuaC4KKwkoc2JfaW5kZXgsIGZyb21fc2IpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkobWFjcm9fbmVzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHN0cnVjdCBpbnB1dF9zYXZlKTogQWRkIHNiX2luZGV4IGFuZCBmcm9tX3NiIGZpZWxkcy4gIENoYW5nZQorCW5leHRfc2F2ZWRfZmlsZSBmaWVsZCB0byBiZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgorCShuZXh0X3NhdmVkX2ZpbGUpOiBDaGFuZ2VkIHRvIGJlIHN0cnVjdCBpbnB1dF9zYXZlICouCisJKGlucHV0X3NjcnViX3B1c2gpOiBDaGFuZ2UgdG8gcmV0dXJuIHR5cGUgc3RydWN0IGlucHV0X3NhdmUgKi4KKwlTYXZlIHNiX2luZGV4IGFuZCBmcm9tX3NiLgorCShpbnB1dF9zY3J1Yl9wb3ApOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGUgdG8gc3RydWN0IGlucHV0X3NhdmUgKi4KKwlSZXN0b3JlIHNiX2luZGV4IGFuZCBmcm9tX3NiLgorCShpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogTmV3IGZ1bmN0aW9uLgorCShpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IEhhbmRsZSByZWFkaW5nIGZyb20gZnJvbV9zYi4KKwkoYnVtcF9saW5lX2NvdW50ZXJzKTogT25seSBpbmNyZW1lbnQgbGluZXMgaWYgbm90IHVzaW5nIGZyb21fc2IuCisJKiBjb25maWcvdGMtbTY4ay5jIChvcHRfdGFibGUpOiBBZGQgbmVzdC4KKwkob3B0X25lc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogZ2FzcC5jOiBJbmNsdWRlIHNiLmggYW5kIG1hY3JvLmguICBNb3ZlIGFsbCBzYiByZWxhdGVkIGZ1bmN0aW9ucworCWFuZCBkZWZpbml0aW9ucyB0byBzYi5oIGFuZCBzYi5jLiAgTW92ZSBhbGwgbWFjcm8gcmVsYXRlZAorCWZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgdG8gbWFjcm8uaCBhbmQgbWFjcm8uYy4KKwkqIHNiLmgsIHNiLmM6IE5ldyBmaWxlcywgZXh0cmFjdGVkIGZyb20gZ2FzcC5jLgorCSogbWFjcm8uaCwgbWFjcm8uYzogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbiAoT0JKUyk6IEFkZCBzYi5vIGFuZCBtYWNyby5vCisJKEdBU1BPQkpTKTogRGVmaW5lLgorCShnYXNwLm5ldyk6IERlcGVuZCB1cG9uICQoR0FTUE9CSlMpLiAgVXNlICQoR0FTUE9CSlMpIHRvIGxpbmsuCisJKFRBUkdfQ1BVX0RFUF9tNjhrKTogRGVwZW5kIHVwb24gc3Vic2Vncy5oLgorCShnYXNwLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgorCShzYi5vKTogTmV3IHRhcmdldC4KKwkobWFjcm8ubyk6IE5ldyB0YXJnZXQuCisJKGFzLm8pOiBEZXBlbmQgdXBvbiBzYi5oIGFuZCBtYWNyby5oLgorCShpbnB1dC1zY3J1Yi5vKTogRGVwZW5kIHVwb24gc2IuaC4KKwkocmVhZC5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KKworCSogY29uZC5jIChnZXRfbXJpX3N0cmluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNfaWZjKTogTmV3IGZ1bmN0aW9uLgorCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGlmYyBhbmQgaWZuYy4KKwkqIHJlYWQuaCAoc19pZmMpOiBEZWNsYXJlLgorCisJKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJbiBNUkkgbW9kZSwgc2V0IGxleCBvZiAnIHRvCisJTEVYX0lTX1NUUklOR1FVT1RFLgorCitNb24gQXVnIDIxIDEzOjQxOjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgQEhBLCBATCwgYW5kIEBIIHN1ZmZpeGVzIG9uCisJY29uc3RhbnQgZXhwcmVzc2lvbnMuCisKK1N1biBBdWcgMjAgMTU6NTQ6MzcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX3JlbG9jX3NpemUpOiBBZGQgY29uc3QgdG8gZGVjbGFyYXRpb24uCisKK0ZyaSBBdWcgMTggMTA6NTg6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfaW5jbHVkZSk6IEluIE1SSSBtb2RlLCBkb24ndCBleHBlY3QgcXVvdGVzIGFyb3VuZCB0aGUKKwlmaWxlIG5hbWUuCisJKiBsaXN0aW5nLmMgKGxpc3RpbmdfdGl0bGUpOiBEb24ndCByZXF1aXJlIHRoZSB0aXRsZSB0byBiZSBxdW90ZWQuCisKKwkqIGdhc3AuYyAoaW5jbHVkZV9wcmludF93aGVyZV9saW5lKTogQWx3YXlzIHN1YnRyYWN0IDEgZnJvbQorCWxpbmVjb3VudCBiZWZvcmUgcHJpbnRpbmcgaXQuCisJKHByb2Nlc3NfZmlsZSk6IEluIE1SSSBtb2RlLCBsaW5lcyBiZWdpbm5pbmcgd2l0aCAnKicgb3IgJyEnIGFyZQorCWNvbW1lbnRzLgorCShkb19yZWcpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgcmVxdWlyZSBwYXJlbnRoZXNlcy4KKwkoZG9faW5jbHVkZSk6IEluIE1SSSBtb2RlLCBkb24ndCByZXF1aXJlcyBxdW90ZXMuICBJZiB0aGUgZmlsZSBjYW4KKwlub3QgYmUgZm91bmQgaW4gdGhlIGluY2x1ZGUgcGF0aCwgdHJ5IG9wZW5pbmcgaXQgaW4gdGhlIGN1cnJlbnQKKwlkaXJlY3RvcnkuICBQcmludCB0aGUgZmlsZSBuYW1lIGNvcnJlY3RseSBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKwkoY2hhcnR5cGVfaW5pdCk6IEluIE1SSSBtb2RlLCBzZXQgRklSU1RCSVQgZm9yICcuJy4KKwkobWFpbik6IFNldCBjb21tZW50X2NoYXIgdG8gJzsnIHdoZW4gZW50ZXJpbmcgTVJJIG1vZGUuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgorCShtNjhrX2lwKTogUGFzcyA2NCByYXRoZXIgdGhhbiAtMSB0byBhZGRfRml4IGluICdCJyAnQicgY2FzZS4KKwkobWRfcGNyZWxfZnJvbSk6IElmIGZ4X3BjcmVsX2FkanVzdCBpcyA2NCwgdXNlIC0xIGluc3RlYWQuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IEZvciBPQkpfQU9VVCBjYXNlLCBhZGp1c3QKKwlCRkRfUkVMT0NfMTYgYW5kIEJGRF9SRUxPQ18zMiByZWxvY3MuCisKK1dlZCBBdWcgMTYgMTQ6NDg6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBhcy5oIChhbGxvY2EpOiBVc2Ugdm9pZCogZGVjbGFyYXRpb24gb24gSFAvVVguCisKK1dlZCBBdWcgMTYgMTI6NDk6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSWYgUElDLCBvbmx5IGNoYW5nZSBQQ1JFTF9TMgorCXRvIFdQTFQzMCBmb3IgYW4gdW5kZWZpbmVkIG9yIGV4dGVybmFsIHN5bWJvbC4gIERvbid0IGNvbnNpZGVyCisJUEMxMCBvciBQQzIyIHRvIGJlIGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2hlbiBjaG9vc2luZyBiZXR3ZWVuCisJZnhfYWRkbnVtYmVyIGFuZCBmeF9vZmZzZXQuCisKKwkqIGNvbmZpZy90Yy16OGsuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgZG8gaXQgaGVyZSwgY2FsbAorCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4uCisJKiBjb25maWcvdGMtejhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgorCisJKiBleHByLmMgKG9wZXJhbmQpOiBBZGQgc3VwcG9ydCBmb3IgLnN0YXJ0b2YuIGFuZCAuc2l6ZW9mLiBieQorCXVzaW5nIG1hZ2ljIHN5bWJvbCBuYW1lcyB3aGljaCB0aGUgbGlua2VyIHdpbGwgcmVjb2duaXplCisJc3BlY2lhbGx5LgorCSogZG9jL2FzLnRleGluZm86IFRha2Ugb3V0IG5vdGUgdGhhdCAuc3RhcnRvZi4gYW5kIC5zaXplb2YuIGFyZQorCW5vdCBzdXBwb3J0ZWQuCisKK1R1ZSBBdWcgMTUgMTU6MDg6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgTVJJIHN0cnVjdHVyZWQgY29udHJvbAorCWRpcmVjdGl2ZXM6IGlmLCBpZi5iLCBpZi53LCBpZi5sLCBlbHNlLCBlbHNlLnMsIGVsc2UubCwgZW5kaSwKKwlicmVhaywgYnJlYWsucywgYnJlYWsubCwgbmV4dCwgbmV4dC5zLCBuZXh0LmwsIGZvciwgZm9yLmIsIGZvci53LAorCWZvci5sLCBlbmRmLCByZXBlYXQsIHVudGlsLCB1bnRpbC5iLCB1bnRpbC53LCB1bnRpbC5sLCB3aGlsZSwKKwl3aGlsZS5iLCB3aGlsZS53LCB3aGlsZS5sLCBlbmR3LgorCShlbnVtIG1yaV9jb250cm9sX3R5cGUpOiBEZWZpbmUuCisJKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKTogRGVmaW5lLgorCShtcmlfY29udHJvbF9zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1yaV9jb250cm9sX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobXJpX2NvbnRyb2xfbGFiZWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShwdXNoX21yaV9jb250cm9sLCBwb3BfbXJpX2NvbnRyb2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKwkocGFyc2VfbXJpX2NvbmRpdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzd2FwX21yaV9jb25kaXRpb24sIHJldmVyc2VfbXJpX2NvbmRpdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNfbXJpX2lmLCBzX21yaV9lbHNlLCBzX21yaV9lbmRpKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0KTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKHNfbXJpX2Zvciwgc19tcmlfZW5kZik6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCShzX21yaV9yZXBlYXQsIHNfbXJpX3VudGlsKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKHNfbXJpX3doaWxlLCBzX21yaV9lbmR3KTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKiBnYXNwLmMgKG1yaWtpbmZvKTogUmVtb3ZlIElGLgorCSogZXhwci5jIChnZXRfc3ltYm9sX2VuZCk6IEFjY2VwdCBcMDAxIGFzIHBhcnQgb2YgYSBuYW1lLgorCisJKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCisJKiBzeW1ib2xzLmggKGNvbG9uKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCitNb24gQXVnIDE0IDIwOjUxOjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBBbHdheXMgZG8gaXQgdGhlIEJGRF9GQVNUX1NFQ1RJT05fRklMTAorCXdheS4gIFJlZm9ybWF0IGFuZCByZWluZGVudCB0aGF0IGNvZGUgdG8gR05VIHN0YW5kYXJkcy4KKwkoQkZEX0ZBU1RfU0VDVElPTl9GSUxMKTogRG9uJ3QgZGVmaW5lLgorCitNb24gQXVnIDE0IDE0OjA4OjA3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEb24ndCB0cnkgdG8gYXBwbHkgQkVHSU5fQlJUQUIKKwlvciBFTkRfQlJUQUIgZml4dXBzLgorCitNb24gQXVnIDE0IDE1OjQ1OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzcC5jIChkb19hbGlnbiwgZ2V0X2FueV9zdHJpbmcpOiBNYXJrIGFzIHN0YXRpYy4KKwkoZG9fYXNzaWduYSwgZG9fYXNzaWduYywgbmV3X2ZpbGUpOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLW02OGsuYyAoc19yZWcpOiBSZW5hbWUgbG9jYWwgb3AgdG8gcm9wIHRvIGF2b2lkCisJY29uZnVzaW9uIHdpdGggbWFjcm8gb3AuCisKKwkqIGdhc3AuYyAoc3RyaXBfY29tbWVudHMpOiBDb21tZW50IG91dDsgaXQncyBub3QgdXNlZC4KKwkoZG9fZW5kKTogQWRkIHBhcmFtZXRlci4gIEluIE1SSSBtb2RlLCBwcmludCBpdCBvdXQuCisJKGRvX2lycCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHN1Yl9hY3R1YWwpOiBDaGFuZ2UgcGFyYW1ldGVyIG0gdG8gZm9ybWFsX2hhc2gsIGNoYW5naW5nIHR5cGUKKwlmcm9tIG1hY3JvX2VudHJ5aCAqIHRvIGhhc2hfdGFibGUgKi4KKwkobWFjcm9fZXhwYW5kX2JvZHkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCisJbWFjcm9fZXhwYW5kLgorCShtYWNyb19leHBhbmQpOiBDYWxsIG1hY3JvX2V4cGFuZF9ib2R5LgorCShLXyopOiBGdWxseSBwYXJlbnRoZXNpemUuCisJKEtfSVJQLCBLX0lSUEMpOiBEZWZpbmUuCisJKG1yaWtpbmZvKTogQWRkIElSUCBhbmQgSVJQQy4KKwkocHJvY2Vzc19wc2V1ZG9fb3ApOiBJbiBNUkkgbW9kZSwgcHJpbnQgb3V0IEVORCBwc2V1ZG8tb3AuICBQYXNzCisJbGluZSB0byBkb19lbmQuICBIYW5kbGUgS19JUlAgYW5kIEtfSVJQQy4KKworCSogY29uZmlnL3RjLW02OGsuYyAoc19vcHQpOiBSZXNldCAqaW5wdXRfbGluZV9wb2ludGVyIGV2ZW4gaWYgd2UKKwlkb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBvcHRpb24uCisKK1N1biBBdWcgMTMgMTc6MDM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBmcmFncy5jIChmcmFnX2FsaWduKTogSGFuZGxlIGFic29sdXRlX3NlY3Rpb24uCisJKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50KTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogU2tpcCBpbnNucyB3aXRoIGFuIGluYXBwcm9wcmlhdGUKKwlJU0EgbGV2ZWwuCisKK1N1biBBdWcgMTMgMDA6MzU6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbnRyaWVzIGZvcgorCSJiZWdpbl9icnRhYiIgYW5kICJlbmRfYnJ0YWIiIHBzZXVkby1vcHMuCisJKHBhX2JydGFiKTogTmV3IGZ1bmN0aW9uLgorCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQkVHSU5fQlJUQUIgYW5kIFJfRU5EX0JSVEFCLgorCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3IgQlJUQUIgZml4dXBzCisJd2hlbiBPQkpfU09NIGlzIGRlZmluZWQuCisKK0ZyaSBBdWcgMTEgMjA6MzQ6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVEVfT0JKUyk6IEFkZCBlbXB0eSBkZWZpbml0aW9uLgorCitGcmkgQXVnIDExIDE5OjE2OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IERvbid0IHRyZWF0ICcgc3BlY2lhbGx5IGluIE1SSSBtb2RlLgorCShwcm9jZXNzX2ZpbGUpOiBEb24ndCB3YXJuIGFib3V0IG1pc3NpbmcgRU5EIGluIE1SSSBtb2RlLgorCShkb19pZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGdldF9tcmlfc3RyaW5nLCBkb19pZmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKwkoYnVmZmVyX2FuZF9uZXN0KTogVHJlYXQgTVJJIG1vZGUgbGlrZSBhbHRlcm5hdGUgc3ludGF4IG1vZGUuCisJKGRvX2FlbmRyKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgaW4gTVJJIG1vZGUuCisJKGRvX2FyZXBlYXQpOiBVc2UgUkVQVC9FTkRSIGluIE1SSSBtb2RlLgorCShkb19mb3JtYWxzKTogSW4gTVJJIG1vZGUsIGFkZCBzcGVjaWFsIE5BUkcgZm9ybWFsLgorCShtYWNyb19leHBhbmQpOiBWYXJpb3VzIGNoYW5nZXMgZm9yIE1SSSBtb2RlOiBwZXJtaXQgYSBxdWFsaWZpZXIKKwlvbiB0aGUgbWFjcm8gbmFtZTsgc2V0IHNwZWNpYWwgTkFSRyBmb3JtYWw7IHBlcm1pdCB1bm5hbWVkCisJcG9zaXRpb25hbCBhcmd1bWVudHM7IHVzZSAmJiB0byBjb25jYXRlbmF0ZSBuYW1lZCBwYXJhbWV0ZXJzOworCXBlcm1pdCBcZCB0byBzcGVjaWZ5IGFuIHVubmFtZWQgcGFyYW1ldGVyOyBwZXJtaXQgbmFtZWQgcGFyYW1ldGVycworCXRvIG5vdCBzdGFydCB3aXRoIFw7IHVzZSA9PSB0byBzZWUgaWYgYSBwYXJhbWV0ZXIgZXhpc3RzLgorCShnZXRzdHJpbmcpOiBJbiBNUkkgbW9kZSwgYWxsb3cgPD4gdG8gcXVvdGUgYSBzdHJpbmcuCisJKEtfSUZFUSwgS19JRk5FLCBLX0lGTFQsIEtfSUZMRSwgS19JRkdFLCBLX0lGR1QpOiBEZWZpbmUuCisJKEtfSUZDLCBLX0lGTkMpOiBEZWZpbmUuCisJKHN0cnVjdCBrZXl3b3JkKTogTmFtZSBzdHJ1Y3R1cmUgdXNlZCBpbiBraW5mbyBhcnJheS4KKwkobXJpa2luZm8pOiBOZXcgc3RhdGljIGFycmF5LgorCShwcm9jZXNzX3BzZXVkb19vcCk6IERvbid0IHJlcXVpcmUgbGVhZGluZyAnLicgaW4gTVJJIG1vZGUuCisJSGFuZGxlIG5ldyBNUkkgcHNldWRvLW9wIGRlZmluaXRpb25zLgorCShhZGRfa2V5d29yZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YgcHJvY2Vzc19pbml0LgorCShwcm9jZXNzX2luaXQpOiBVc2UgYWRkX2tleXdvcmQuICBJbiBNUkkgbW9kZSwgYWRkIG1yaWtpbmZvIHRhYmxlLgorCShsb25nX29wdGlvbnMpOiBBZGQgIm1yaSIuCisJKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1NLy0tbXJpLgorCShtYWluKTogQ2FsbCBwcm9jZXNzX2luaXQgYWZ0ZXIgcHJvY2Vzc2luZyBhcmd1bWVudHMuICBIYW5kbGUgLU0uCisJKiBkb2MvZ2FzcC50ZXhpOiBEb2N1bWVudCAtTS8tLW1yaS4KKworCSogZ2FzcC5jOiBJbmNsdWRlIGFuc2lkZWNsLmguICBNYWtlIGFsbCBsb2NhbCBmdW5jdGlvbnMgc3RhdGljLgorICAgICAgICBBZGQgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCisJKG1yaSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisJKHNiX2FkZF9jaGFyKTogQ2hhbmdlIHBhcmFtZXRlciBjIGZyb20gY2hhciB0byBpbnQuCisJKHNiX2FkZF9zdHJpbmcpOiBNYWtlIHBhcmFtZXRlciBzIGludG8gYSBjb25zdCBwb2ludGVyLgorCShzYl9hZGRfYnVmZmVyKTogTGlrZXdpc2UuCisJKGNoZWNrY29uc3QpOiBDaGFuZ2UgcGFyYW1ldGVyIG9wIGZyb20gY2hhciB0byBpbnQuCisJKGV4cF9nZXRfYWJzKTogTWFrZSBwYXJhbWV0ZXIgZW1zZyBpbnRvIGEgY29uc3QgcG9pbnRlci4KKwkoZG9fcmVzKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIGZyb20gY2hhciB0byBpbnQuCisJKGJ1ZmZlcl9hbmRfbmVzdCk6IE1ha2UgcGFyYW1ldGVycyBmcm9tIGFuZCB0byBpbnRvIGNvbnN0CisJcG9pbnRlcnMuCisJKGRvX3NkYXRhKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIGZyb20gY2hhciB0byBpbnQuCisJKG5ld19maWxlKTogTWFrZSBwYXJhbWV0ZXIgbmFtZSBpbnRvIGEgY29uc3QgcG9pbnRlci4KKwkoZG9fZGVmaW5lKTogTWFrZSBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYSBjb25zdCBwb2ludGVyLgorCisJKiBjb25maWcvdGMtaDgzMDAuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgZG8gaXQgaGVyZSwgY2FsbAorCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4uCisJKiBjb25maWcvdGMtaDgzMDAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCisKK0ZyaSBBdWcgMTEgMTM6MjM6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgbmV3IGZpZWxkIGZ4X25vX292ZXJmbG93LgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSWYgZnhfbm9fb3ZlcmZsb3cgaXMgbm9uLXplcm8sIGRvbid0CisJY29tcGxhaW4gaWYgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXNzZW1ibGUpOiBTZXQgZnhfbm9fb3ZlcmZsb3cgaWYgdGhlIGhhbGYKKwl3b3JkIHJlbG9jYXRpb25zIEJGRF9SRUxPQ197TE8xNixISTE2LEhJMTZfU30uCisKK1RodSBBdWcgMTAgMjA6NTY6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAoc19tcmlfc2VjdCkgW0JGRF9BU1NFTUJMRVJdOiBGaXggdHlwb3MgaW4gY2hvb3NpbmcgYW5kCisJc2V0dGluZyBzZWN0aW9uIGZsYWdzLgorCitUaHUgQXVnIDEwIDAwOjM4OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgorCSogZG9jL2FzLjE6IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogV2hlbiByZWNvZ25pemluZyAnIycsIHVzZSBpc2J5dGUgYW5kCisJaXdvcmQgcmF0aGVyIHRoYW4gZXhwcjggYW5kIGV4cHIxNi4gIFdoZW4gcmVjb2duaXppbmcgJ00nLCB1c2UKKwlpc3NieXRlIHJhdGhlciB0aGFuIGV4cHI4LiAgV2hlbiByZWNvZ25pemluZyAnUScgYW5kICd0JywganVzdAorCWNoZWNrIGZvciBPX2NvbnN0YW50IHJhdGhlciB0aGFuIHVzaW5nIGV4cHI4LgorCSogY29uZmlnL202OGstcGFyc2UuaCAoZXhwcjgsIGV4cHIxNik6IERvbid0IGRlZmluZS4KKwkqIE1ha2VmaWxlLmluIChtNjhrLXBhcnNlLm8pOiBEZXBlbmQgdXBvbiBtNjhrLXBhcnNlLmgsIG5vdAorCW02OGstcGFyc2UueS4KKworCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHNwYywgdHRsLCB4Y29tLCB4cmVmLgorCShzX21yaV9zZWN0KTogTmV3IGZ1bmN0aW9uLgorCSogcmVhZC5oIChzX21yaV9zZWN0KTogRGVjbGFyZS4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKSAoYm90aCB2ZXJzaW9ucyk6IEluIE1SSQorCW1vZGUsIGNhbGwgc19tcmlfc2VjdC4KKwkob2JqX3BzZXVkb190YWJsZSk6IEFkZCBzZWN0LnMgYW5kIHNlY3Rpb24ucy4gIE1vdmUgc2VjdCBvdXRzaWRlCisJb2YgaWZuZGVmIEJGRF9BU1NFTUJMRVIuCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkIHNlY3Rpb24ucywgc2VjdCwKKwlzZWN0LnMuCisJKG9ial9lbGZfc2VjdGlvbik6IEluIE1SSSBtb2RlLCBjYWxsIHNfbXJpX3NlY3QuCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcmVzdG9yZSwgc2F2ZS4KKwkoc3RydWN0IHNhdmVfb3B0cyk6IERlZmluZS4KKwkoc2F2ZV9zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHNfc2F2ZSwgc19yZXN0b3JlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisKKwkqIHJlYWQuYyAoc19zZXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHB0ci4KKwkoaGV4X2Zsb2F0KTogQ2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4uCisJKGVxdWFscyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcC4KKworCSogY29uZmlnL3RjLWEyOWsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaDg1MDAuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaHBwYS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pODYwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgorCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCisJKiBjb25maWcvdGMtbTg4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KKwkqIGNvbmZpZy90Yy10YWhvZS5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1zaC5jIChsaXR0bGUpOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4uCisJKG1kX2JlZ2luKTogTGlrZXdpc2UuCisJKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgorCShidWlsZF9yZWxheCk6IENoZWNrIHRhcmdldF9iaWdfZW5kaWFuIHJhdGhlciB0aGFuIHNobC4KKwkoYnVpbGRfTXl0ZXMsIG1kX2F0b2YpOiBMaWtld2lzZS4KKwkobWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KKwkobWRfbnVtYmVyX3RvX2NoYXJzKTogTGlrZXdpc2UuCisJCitXZWQgQXVnICA5IDEwOjUxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19hYnNwY2FkZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG02OGtfcXVpY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtNjhrX3JlbDMyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkIG9wdCBhbmQgcmVnLgorCShtNjhrX2lwKTogUGVybWl0IGFic29sdXRlIHN5bWJvbHMgaW4gJ2wnLydMJyByZWNvZ25pdGlvbi4gIENoZWNrCisJbTY4a19xdWljayBpbiAnTScgYW5kICdRJyByZWNvZ25pdGlvbi4gIENoZWNrIG02OGtfYWJzcGNhZGQgaW4KKwlESVNQIGhhbmRsaW5nLiAgQ2hlY2sgbTY4a19yZWwzMiBpbiBCQVNFL1BPU1QvUFJFIGhhbmRsaW5nLgorCShtZF9iZWdpbik6IEluIE1SSSBtb2RlLCBpbml0aWFsaXplIG02OGtfYWJzcGNhZGQgYW5kIG02OGtfcmVsMzIuCisJSW4gTVJJIG1vZGUsIGNoYW5nZSB1bnNpemVkIGJyYW5jaCBhbGlhc2VzIHRvIGJlIHZhcmlhYmxlIHNpemVkLgorCShzdHJ1Y3Qgb3B0X2FjdGlvbik6IERlZmluZS4KKwkob3B0X3RhYmxlKTogRGVmaW5lLgorCShzX29wdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNraXBfdG9fY29tbWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShvcHRfY2hpcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG9wdF9saXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkob3B0X2xpc3Rfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNfcmVnKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGFzLmggKGZsYWdfa2VlcF9sb2NhbHMpOiBDaGFuZ2UgZnJvbSB1bnNpZ25lZCBjaGFyIHRvIGludC4KKwkoZmxhZ19ub193YXJuaW5ncyk6IExpa2V3aXNlLgorCisJKiByZWFkLmMgKG1yaV9saW5lX2xhYmVsKTogTWFrZSBub24tc3RhdGljLgorCShwb3RhYmxlKTogQWRkIG5vcGFnZSwgcGFnZSwgcGxlbi4KKwkoc19vcmcpOiBFcnJvciBpZiBpbiBNUkkgbW9kZS4KKwkqIHJlYWQuaCAobXJpX2xpbmVfbGFiZWwpOiBEZWNsYXJlLgorCSogbGlzdGluZy5jIChsaXN0aW5nX25vcGFnZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGxpc3RpbmcuaCAobGlzdGluZ19ub3BhZ2UpOiBEZWNsYXJlLgorCisJKiBzeW1ib2xzLmMgKHN5bWJvbF9iZWdpbik6IFNldCBzeV9mcmFnIG9mIGFic19zeW1ib2wgdG8KKwkmemVyb19hZGRyZXNzX2ZyYWcuCisKKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogQ2hlY2sgdGhhdCBzeW1ib2wgaXMgbm90IE5VTEwKKwliZWZvcmUgY2hlY2tpbmcgc3lfbXJpX2NvbW1vbi4KKwkoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KKworCSogcmVhZC5jIChhYnNfc2VjdGlvbl9vZmZzZXQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShwb3RhYmxlKTogQWRkIG9mZnNldCwgc3RydWN0LgorCShkb19vcmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uOyBoYW5kbGUgY2hhbmdpbmcgdGhlIG9yaWdpbiBpbiB0aGUKKwlhYnNvbHV0ZSBzZWN0aW9uLgorCShzX29yZyk6IFVzZSBkb19vcmcuCisJKHNfc2V0KTogTGlrZXdpc2UuCisJKGVxdWFscyk6IExpa2V3aXNlLgorCShzX3NwYWNlKTogSW4gYWJzb2x1dGVfc2VjdGlvbiwganVzdCBpbmNyZWFzZSBhYnNfc2VjdGlvbl9vZmZzZXQuCisJKHNfc3RydWN0KTogTmV3IGZ1bmN0aW9uLgorCShlbWl0X2V4cHIpOiBIYW5kbGUgYWJzb2x1dGVfc2VjdGlvbiBzcGVjaWFsbHkuCisJKiByZWFkLmggKGFic19zZWN0aW9uX29mZnNldCk6IERlY2xhcmUuCisJKHNfc3RydWN0KTogRGVjbGFyZS4KKwkqIGZyYWdzLmMgKGZyYWdfbW9yZSk6IFdhcm4gaWYgaW4gYWJzb2x1dGVfc2VjdGlvbi4KKwkoZnJhZ19ub3dfZml4KTogSW4gYWJzb2x1dGVfc2VjdGlvbiwgcmV0dXJuIGFic19zZWN0aW9uX29mZnNldC4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IElmIHN3aXRjaGluZyB0byBhYnNvbHV0ZV9zZWN0aW9uLAorCWp1c3Qgc2V0IG5vd19zZWcgYW5kIG5vd19zdWJzZWcuCisJKHN1YnNlZ19zZXRfcmVzdCk6IFNwZWNpYWwgaGFuZGxpbmcgd2hlbiBzd2l0Y2hpbmcgdG8gb3IgZnJvbQorCWFic29sdXRlX3NlY3Rpb24uCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfZmxvYXRfY29wbnVtKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkIGZvcHQgYW5kIG1hc2syLgorCShtNjhrX2lwKTogVXNlIG02OGtfZmxvYXRfY29wbnVtLCBub3QgQ09QTlVNLCB3aGVuIHNldHRpbmcKKwljb3Byb2Nlc3NvciByZWdpc3RlciB0byB1c2UuICBJbiBjYXNlICdJJyB3aGVuIGNoZWNraW5nIG9wZXJhbmRzLAorCWNvcnJlY3QgY29wcm9jZXNzb3IgcmVnaXN0ZXIgbnVtYmVycy4gIEluIGNhc2UgJ0knIHdoZW4gc2V0dGluZworCW9wZXJhbmRzLCBkb24ndCBhZGQgMS4KKwkoc19mb3B0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKENPUE5VTSk6IERvbid0IGRlZmluZS4KKworCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIGlmZXEsIGlmZ2UsIGlmZ3QsIGlmbGUsIGlmbHQsIGlmbmUuCisJQ2hhbmdlIGlmIHRvIHBhc3MgT19uZSB0byBzX2lmLgorCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBEb24ndCBkZWZpbmUgYW4gbGFiZWwgd2l0aG91dCBhIGNvbG9uIGlmCisJaWdub3JlX2lucHV0IHJldHVybnMgdHJ1ZS4KKwkqIGNvbmQuYyAoc19pZik6IFRyZWF0IGFyZ3VtZW50IGFzIGFuIG9wZXJhdG9yVCBkZXNjcmliaW5nIGhvdyB0bworCWNvbXBhcmUgdGhlIGFyZ3VtZW50IGFnYWluc3QgemVyby4KKwkoaWdub3JlX2lucHV0KTogRG9uJ3QgcmVxdWlyZSBhbiBpbml0aWFsIGRvdCBpbiBNUkkgbW9kZSwgb3IgaWYKKwlOT19QU0VVRE9fRE9UIGlzIGRlZmluZWQuCisKKwkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBkY2IsIGRjYi5iLCBkY2IuZCwgZGNiLmwsIGRjYi5zLCBkY2IudywKKwlkY2IueCwgZHMuZCwgZHMucCwgZHMucywgZHMueCwgZWxzZWMsIGVuZGMsIGZhaWwsIGZvcm1hdCwgbGxlbiwKKwlub2Zvcm1hdC4KKwkocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgcHNldWRvLW9wIGhhbmRsZXIgaXMgc19lbmQsIHF1aXQKKwlpbW1lZGlhdGVseS4KKwkoc19lbmQpOiBOZXcgZnVuY3Rpb24uCisJKHNfZmFpbCk6IE5ldyBmdW5jdGlvbi4KKwkoc19mbG9hdF9zcGFjZSk6IE5ldyBmdW5jdGlvbi4KKwkoaGV4X2Zsb2F0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZmxvYXRfY29ucyk6IFVzZSBoZXhfZmxvYXQuCisJKiByZWFkLmggKHNfZmFpbCk6IERlY2xhcmUuCisJKHNfZmxvYXRfc3BhY2UpOiBEZWNsYXJlLgorCSogY29uZC5jIChzX2VuZCk6IFJlbW92ZS4KKwkqIGxpc3RpbmcuYyAobGlzdGluZ19wc2l6ZSk6IFRyZWF0IGFyZ3VtZW50IGFzIGluZGljYXRpbmcgd2hldGhlcgorCWEgaGVpZ2h0IGlzIGV4cGVjdGVkLgorCisJKiByZWFkLmMgKG1yaV9wZW5kaW5nX2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIG1yaV9wZW5kaW5nX2FsaWduLgorCShjb25zKTogU2V0IG1yaV9wZW5kaW5nX2FsaWduIGlmIGFwcHJvcHJpYXRlLgorCisJKiBjb25maWd1cmUuaW46IE1vdmUgcmFuZG9tIHNwZWNpYWwgdGFyZ2V0IGhhbmRsaW5nIGJlZm9yZQorCXBvc3NpYmxlIGJyZWFrLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgQXVnICA4IDIzOjQxOjI1IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogY29uZmlndXJlLmluOiBDb25zaXN0ZW50bHkgdXNlICR7dGFyZ2V0X2NwdV90eXBlfSByYXRoZXIgdGhhbgorCSR7Y3B1X3R5cGV9IGFmdGVyIHRoZSBsb29wLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKHRhcmctY3B1Lm8pOiBVc2UgQHRhcmdldF9jcHVfdHlwZUAgcmF0aGVyIHRoYW4KKwlAY3B1X3R5cGVALgorCitUdWUgQXVnICA4IDE3OjI3OjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBleHByLmggKG9wZXJhdG9yVCk6IFJlbW92ZSBjb21tYSBhZnRlciBsYXN0IGVudW1lcmF0b3IgdmFsdWUuCisKKwkqIGNvbmZpZy9vYmotdm1zLmM6IFNvbWUgd2hpdGVzcGFjZSBjbGVhbnVwIGZyb20gUGF0IFJhbmtpbi4KKworCSogYXMuaCAoYWxsb2NhKTogSWYgX19TVERDX18sIGRlY2xhcmUgdm9pZCogaW5zdGVhZCBvZiBjaGFyKi4KKworCVdlZCBBdWcgIDIgMTg6NTQ6MzcgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciwKKwlDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBSZW9yZ2FuaXplIHRoZSBgI2lmICFWTVMnIGNyb3NzLWFzc21lYmxlcgorCXN1cHBvcnQgY29kZS4KKwkoQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogQ2FsbCBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCB0byBmbHVzaAorCW91dHB1dCBidWZmZXItLWp1c3QgaW4gY2FzZS0tYmVmb3JlIGNsb3NpbmcgdGhlIGZpbGUuCisKK1R1ZSBBdWcgIDggMTM6MDc6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChhcmNocyk6IEFkZCA2OGVjMDAwLCA2OGhjMDAwLCA2OGhjMDAxLAorCTY4ZWMwMjAsIDY4ZWMwMzAsIDY4ZWMwNDAsIGFuZCA2ODMzMC4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkIGNoaXAgYW5kIGNvbWxpbmUuCisJKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIHN0cmNhc2VjbXAgd2hlbiBjb21wYXJpbmcgZGVmYXVsdF9jcHUKKwlhZ2FpbnN0IGFyY2hpdGVjdHVyZXMuCisJKG1yaV9jaGlwLCBzX2NoaXApOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKworCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgc3lfbXJpX2NvbW1vbiBiaXQuCisJKiByZWFkLmggKG1yaV9jb21vbl9zeW1ib2wpOiBEZWNsYXJlLgorCShzX21yaV9jb21tb24pOiBEZWNsYXJlLgorCSogcmVhZC5jIChtcmlfbGluZV9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1yaV9jb21tb25fc3ltYm9sKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkocG90YWJsZSk6IEFkZCAiY29tbW9uIiBhbmQgImNvbW1vbi5zIi4KKwkocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTVJJIG1vZGUsIHNldCBtcmlfbGluZV9sYWJlbCBmb3IgYSBsYWJlbAorCWF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisJKHNfbXJpX2NvbW1vbik6IE5ldyBmdW5jdGlvbi4KKwkoc19zcGFjZSk6IEhhbmRsZSBtcmlfY29tbW9uX3N5bWJvbC4KKwkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgcmV0dXJuIHZhbHVlIGZyb20gdm9pZCB0byBzeW1ib2xTICosCisJYW5kIHJldHVybiBuZXcgc3ltYm9sLiAgSWYgbXJpX2NvbW1vbl9zeW1ib2wgaXMgc2V0LCBhdHRhY2ggdGhlCisJbmV3IHN5bWJvbCB0byBpdC4KKwkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgYW4gc3lfbXJpX2NvbW1vbiBzeW1ib2wuCisJKiBzeW1ib2xzLmggKGNvbG9uKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBpbiBkZWNsYXJhdGlvbi4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2xlYXIgbXJpX2NvbW1vbl9zeW1ib2wuCisJKHN1YnNlZ19zZXQgKGJvdGggdmVyc2lvbnMpKTogTGlrZXdpc2UuCisJKiBmcmFncy5jIChmcmFnX21vcmUpOiBXYXJuIGlmIG1yaV9jb21tb25fc3ltYm9sIGlzIG5vdCBOVUxMLgorCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBTa2lwIHN5X21yaV9jb21tb24gc3ltYm9scy4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXNjYXJkIHN5X21yaV9jb21tb24gc3ltYm9scy4KKwkoZml4dXBfc2VnbWVudCk6IENoYW5nZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5X21yaV9jb21tb24gc3ltYm9scworCXRvIGJlIGFnYWluc3QgdGhlIGNvbW1vbiBzeW1ib2wgaXRzZWxmLgorCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IERpc2NhcmQgc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgorCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHJlbG9jYXRpb25zIGFnYWluc3Qgc3lfbXJpX2NvbW1vbiBzeW1ib2xzCisJdG8gYmUgYWdhaW5zdCB0aGUgY29tbW9uIHN5bWJvbCBpdHNlbGYuCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IERpc2NhcmQKKwlzeV9tcmlfY29tbW9uIHN5bWJvbHMuCisKKwkqIGRvYy9jLW02OGsudGV4aTogQWRkIGRvY3VtZW50YXRpb24gZm9yIENQVSBzcGVjaWZpYyBvcHRpb25zLCBhbmQKKwlmb3IgTW90b3JvbGEgc3ludGF4LgorCisJKiBjb25maWcvbTY4ay1wYXJzZS55IChtb3Rvcm9sYV9vcGVyYW5kKTogRm9yICglcGMpLCBzZXQgbW9kZSB0bworCURJU1AsIG5vdCBCQVNFLgorCitUdWUgQXVnICA4IDAyOjMxOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChyZWxheF9hbGlnbik6IEFkZCBleHRyYSBwYWRkaW5nIGZvciBsaW5rcmVsYXggb25seSBpZgorCUxJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkgaXMgZGVmaW5lZC4KKwkqIGNvbmZpZy90Yy1pOTYwLmggKExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkpOiBEZWZpbmUgaXQuCisJKiBkb2MvaW50ZXJuYWxzLnRleGkgKFJlbGF4YXRpb24pOiBXcml0ZSB1cCBzb21lIHN0dWZmIG9uIGxpbmtlcgorCXJlbGF4aW5nIGFuZCBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZLgorCitNb24gQXVnICA3IDE3OjE4OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL202OGstcGFyc2UueTogTmV3IGZpbGU6IGJpc29uIGdyYW1tYXIgZm9yIG02OGsgb3BlcmFuZHMsCisJaW5jbHVkaW5nIHN1cHBvcnQgZm9yIE1vdG9yb2xhIHN5bnRheC4KKwkqIGNvbmZpZy9tNjhrLXBhcnNlLmg6IE5ldyBmaWxlOyBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbgorCW02OGstcGFyc2UueSBhbmQgdGMtbTY4ay5jLgorCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBtNjhrLXBhcnNlLmguCisJKGVudW0gb3BlcmFuZF90eXBlKTogTW92ZSB0byBtNjhrLXBhcnNlLmgsIHdoZXJlIGl0IGlzIG5hbWVkCisJbTY4a19vcGVyYW5kX3R5cGUuICBSZW5hbWUgYWxsIHVzZXMuICBSZWFycmFuZ2Ugc29tZXdoYXQuICBBZGQKKwlGUFJFRy4gIFJlbmFtZSBBT0ZGIHRvIERJU1AuICBSZW5hbWUgQUlORFggdG8gQkFTRS4gIFJlbmFtZSBBUE9EWAorCXRvIFBPU1QuICBSZW5hbWUgQVBSRFggdG8gUFJFLiAgUmVtb3ZlIEFNSU5ELiAgUmVuYW1lIE1TQ1IgdG8KKwlDT05UUk9MLiAgUmVtb3ZlIERJTkRSLgorCShzdHJ1Y3QgbTY4a19leHApOiBNb3ZlIHRvIG02OGstcGFyc2UuaC4gIFJlbW92ZSBlX2JlZywgZV9lbmQgYW5kCisJZV9zZWcgZmllbGRzLiAgUmVuYW1lIGVfZXhwIHRvIGV4cC4gIFJlbmFtZSBlX3NpeiB0byBzaXplLCBhbmQKKwljaGFuZ2UgdHlwZSB0byBlbnVtIG02OGtfc2l6ZS4gIENoYW5nZSBhbGwgdXNlcy4KKwkoZW51bSBfcmVnaXN0ZXIpOiBNb3ZlIHRvIG02OGstcGFyc2UuaCwgd2hlcmUgaXQgaXMgbmFtZWQKKwltNjhrX3JlZ2lzdGVyLiAgUmVuYW1lIGFsbCB1c2VzLiAgQWRkIFpEQVRBMC03IGFuZCBaQUREUjAtNy4KKwkoc3RydWN0IG02OGtfb3ApOiBNb3ZlIHRvIG02OGstcGFyc2UuaC4gIENoYW5nZSBhbGwgZmllbGRzLgorCShzZWcpOiBEb24ndCBkZWZpbmUuCisJKGFkZF9leHApOiBSZW1vdmUuCisJKEZBSUwsIE9LKTogUmVtb3ZlLgorCShtNjhrX3JlZ19wYXJzZSk6IE1vdmUgdG8gbTY4ay1wYXJzZS55LCBhbmQgcmV3cml0ZS4KKwkoU0tJUF9XSElURSwgU0tJUF9XKTogUmVtb3ZlLgorCSh0cnlfbW90b19pbmRleCwgdHJ5X2luZGV4KTogUmVtb3ZlLgorCShtNjhrX2lwX29wKTogTW92ZSB0byBtNjhrLXBhcnNlLnksIGFuZCByZXdyaXRlIHRvIHVzZSBncmFtbWFyLgorCShtYWluKTogUmVtb3ZlIG9ic29sZXRlIHRlc3QgZnVuY3Rpb24uCisJKG02OGtfaXApOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB1c2UgbmV3IGdyYW1tYXIuCisJKGdldF9yZWdzKTogUmVtb3ZlLgorCShjcmFja19vcGVyYW5kKTogbTY4a19pcF9vcCBub3cgcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisJKGluaXRfdGFibGUpOiBBZGQgc3NwLCB6ZDAtNyBhbmQgemEwLTcuCisJKG1kX2Fzc2VtYmxlKTogTWFrZSBlciBjb25zdC4gIENvcnJlY3QgbG9vcCBvdmVyIG9wZXJhbmRzIHdoZW4KKwlsb29raW5nIGZvciBlcnJvciBtZXNzYWdlLgorCShtZF9iZWdpbik6IFNldCBhbHRfbm90ZW5kX3RhYmxlIGZvciAnKCcgYW5kICdAJy4KKwkoZ2V0X251bSk6IEV4cHJlc3Npb24gaXMgYWxyZWFkeSBwYXJzZWQuICBEb24ndCBzZXQgc2VnLgorCSogY29uZmlndXJlLmluOiBJZiBjcHVfdHlwZSBpcyBtNjhrLCBwdXQgbTY4ay1wYXJzZS5vIGluCisJZXh0cmEtb2JqZWN0cy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgbTY4ay1wYXJzZS5jLgorCShCSVNPTik6IFVzZSAuLi9iaXNvbi9iaXNvbiBpZiBpdCBleGlzdHMuCisJKEJJU09ORkxBR1MpOiBEZWZpbmUgYXMgZW1wdHkuCisJKFRBUkdfQ1BVX0RFUF9tNjhrKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmguCisJKG02OGstcGFyc2UuYywgbTY4ay1wYXJzZS5vKTogTmV3IHRhcmdldHMuCisKK01vbiBBdWcgIDcgMDI6NTQ6MjAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1zaC5jIChwYXJzZV9yZWcpOiBIYW5kbGUgbmV3IEZQIHJlZ2lzdGVycy4KKwkoZ2V0X3NwZWNpZmljKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGVzLgorCitGcmkgQXVnICA0IDEyOjI5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZXhwci5jIChvcF9lbmNvZGluZyk6IE1ha2Ugbm9uLWNvbnN0LiAgRG9uJ3Qgc2V0ICciJyB0bworICAgICAgICBPX2JpdF9ub3QuCisJKGV4cHJfYmVnaW4pOiBTZXQgb3BfZW5jb2RpbmdbJyInXSBpbiBNUkkgbW9kZS4KKworV2VkIEF1ZyAgMiAxODozOTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmM6IFJlbW92ZSBCUkVBS19VUF9CSUdfREVDTCBzdHVmZi4KKwkoc3RydWN0IG02OGtfaW5jYW50KTogQ2hhbmdlIG1fb3BlcmFuZHMgZmllbGQgdG8gYmUgY29uc3QuCisJKHN0cnVjdCBtNjhrX2l0KTogQ2hhbmdlIGFyZ3MgZmllbGQgdG8gYmUgY29uc3QuCisJKG02OGtfaXApOiBDaGFuZ2UgbG9jYWwgdmFyaWFibGUgcyB0byBiZSBjb25zdC4KKwkob3Bjb2RlX3B0cik6IFJlbW92ZS4KKwkobWRfYmVnaW4pOiBVc2UgbTY4a19udW1vcGNvZGVzLCBub3QgbnVtb3Bjb2Rlcy4gIFVzZQorCW02OGtfb3Bjb2Rlcywgbm90IHJlbW92ZWQgb3Bjb2RlX3B0ci4gIFVzZSBtNjhrX251bWFsaWFzZXMsIG5vdAorCW51bWFsaWFzZXMuCisKK1R1ZSBBdWcgIDEgMTc6MzU6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogQWRkICJjb250cm9sIiwgInN0YXR1cyIsICJpYWRkciIsCisJInNmY3IiLCBhbmQgImRmY3IiIGFzIHN5bm9ueW1zIGZvciBleGlzdGluZyBlbnRyaWVzLgorCShtZF9iZWdpbik6IEluIE1SSSBtb2RlLCBmb3JjZSBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgdG8gMS4KKwkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlZCB1bnVzZWQgbG9jYWxzIGkgYW5kIGFyY2guICBDaGFuZ2UgdHlwZQorCW9mIGFyY2ggKGFub3RoZXIgb25lKSB0byB1bnNpZ25lZCBsb25nLgorCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogQWRkIHJldHVybiBhZnRlciBhYm9ydCB0byBhdm9pZCB3YXJuaW5nLgorCisJSW5pdGlhbCBzdXBwb3J0IGZvciBNUkkgc3R5bGUgbGFiZWxzIGFuZCBleHByZXNzaW9ucy4KKwkqIGFzLmggKGZsYWdfbXJpKTogRGVjbGFyZS9kZWZpbmUuCisJKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtTSBhbmQgaXRzIHN5bm9ueW0gLS1tcmkuCisJKHBhcnNlX2FyZ3MpOiBBZGQgJ00nIHRvIHN0ZF9zaG9ydG9wdHMuICBBZGQgIm1yaSIgdG8KKwlzdGRfbG9uZ29wdHMuICBTZXQgZmxhZ19tcmkgaWYgLU0gaXMgc2Vlbi4KKwkobWFpbik6IENhbGwgcGFyc2VfYXJncyBiZWZvcmUgaW5wdXRfc2NydWJfYmVnaW4uICBDYWxsCisJZXhwcl9iZWdpbi4KKwkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IERvbid0IHNldCBsZXggZm9yICciJyBvciAnXCcnIGluIE1SSQorCW1vZGUuICBEbyBzZXQgbGV4IGZvciAnOycsICcqJywgYW5kICchJyBpbiBNUkkgbW9kZS4KKwkoZG9fc2NydWJfbmV4dF9jaGFyKTogUmVtb3ZlIE1SSSBpZmRlZiBpbiBMRVhfSVNfV0hJVEVTUEFDRSBjYXNlLgorCUluIE1SSSBtb2RlLCBrZWVwIHNwYWNlcyBiZXR3ZWVuIGxhYmVscyBhbmQgY29sb25zLiAgUmVtb3ZlIE1SSQorCWlmbmRlZiBhcm91bmQgTEVYX0lTX09ORUNIQVJfUVVPVEUgY2FzZS4gIEluIE1SSSBtb2RlLCBkb24ndCB1c2UKKwknIScgb3IgJyonIGFzIGNvbW1lbnQgY2hhcmFjdGVycyBldmVuIGlmIHRoZXkgYXJlIGluCisJY29tbWVudF9jaGFycy4KKwkqIHJlYWQuaCAobGV4X3R5cGUpOiBObyBsb25nZXIgY29uc3QuCisJKiByZWFkLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisJKGxleF90eXBlKTogTm8gbG9uZ2VyIGNvbnN0LgorCShyZWFkX2JlZ2luKTogSW4gTVJJIG1vZGUsIHNldCBsZXhfdHlwZSBvZiAnPycgdG8gMy4KKwkocG90YWJsZSk6IEFkZCBkYywgZGMuYiwgZGMuZCwgZGMubCwgZGMucywgZGMudywgZGMueCwgZHMsIGRzLmIsCisJZHMubCwgZHMudywgYW5kIHhkZWYuCisJKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENoYW5nZSBMQUJFTFNfV0lUSE9VVF9DT0xPTiBpZmRlZiB0byBjaGVjaworCWZvciBNUkkgbW9kZSBhdCBydW50aW1lIHJhdGhlciB0aGFuIGNvbXBpbGUgdGltZS4gIEhhbmRsZSB0aGUgRVFVCisJcHNldWRvLW9wIGluIE1SSSBtb2RlLiAgUmVtb3ZlIGJvZ3VzIE1SSSBpZmRlZiBhcm91bmQgZG9uZV9wc2V1ZG8uCisJQ2hhbmdlIE5PX1BTRVVET19ET1QgaWZkZWYgdG8gYWxzbyB0YWtlIGVmZmVjdCBmb3IgTVJJIG1vZGUgYXQKKwlydW50aW1lLgorCShjb25zKTogSW4gTVJJIG1vZGUsIGFsd2F5cyBjYWxsIHBhcnNlX21yaV9jb25zIHJhdGhlciB0aGFuCisJVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLgorCShwYXJzZV9tcmlfY29ucyk6IEFsd2F5cyBjb21waWxlLCBub3QganVzdCB3aGVuIE1SSSBpcyBkZWZpbmVkLgorCUNhbGwgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OLCBub3QgZXhwcmVzc2lvbiwgd2hlbiB0aGUgaW5wdXQgaXMKKwlub3QgYSBzdHJpbmcgY29uc3RhbnQuICBIYW5kbGUgQSBhbmQgRSBtb2RpZmllcnMuCisJKGZsb2F0X2NvbnMpOiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMuCisJKiBleHByLmggKG9wZXJhdG9yVCk6IEFkZCBPX2VxLCBPX25lLCBPX2x0LCBPX2xlLCBPX2dlLCBPX2d0LgorCShleHByX2JlZ2luKTogRGVjbGFyZS4KKwkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEluIE1SSSBtb2RlLCBpZiB0aGUgYmFzZSB3YXMgbm90CisJc3BlY2lmaWVkLCBsb29rIGZvciBhIHN1ZmZpeCBvbiB0aGUgbnVtYmVyIHRvIHNldCB0aGUgYmFzZS4KKwkobXJpX2NoYXJfY29uc3RhbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShvcGVyYW5kKTogUmVtb3ZlIE1SSSBpZmRlZi4gIEluIE1SSSBtb2RlLCBkbyB2YXJpb3VzIHRoaW5nczogUGFzcworCTAgYXMgdGhlIGJhc2Ugd2hlbiBjYWxsaW5nIGludGVnZXJfY29uc3RhbnQgaWYgdGhlcmUgd2FzIG5vCisJcHJlZml4LiAgQ2hlY2sgZm9yIGEgaGV4IGNvbnN0YW50IHN1ZmZpeCBpZiB3aGVuIGEgbGVhZGluZyAnMCcgaXMKKwlzZWVuLiAgRG9uJ3QgYWNjZXB0IDB4IG9yIDBiIGFzIGEgcHJlZml4LiAgQ2hlY2sgZm9yIEUnY2hhcnMnIGFuZAorCUEnY2hhcnMnLiAgSGFuZGxlIE1SSSBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgVHJlYXQgJyInIGFzIHRoZQorCXVuYXJ5IGJpdHdpc2Ugbm90IG9wZXJhdG9yLiAgVHJlYXQgJCBhcyB0aGUgcHJvZ3JhbSBjb3VudGVyLCBvciBhcworCXRoZSBwcmVmaXggZm9yIGEgaGV4IGNvbnN0YW50LiAgVHJlYXQgJSBhcyB0aGUgcHJlZml4IGZvciBhIGJpbmFyeQorCWNvbnN0YW50IGFuZCBAIGFzIHRoZSBwcmVmaXggZm9yIGFuIG9jdGFsIGNvbnN0YW50LiAgVHJlYXQgOiBhcworCXRoZSBwcmVmaXggZm9yIGEgaGV4IGNvbnN0YW50LgorCShvcF9lbmNvZGluZyk6IFNldCAnIicgdG8gT19iaXRfbm90LCAnPCcgdG8gT19sdCwgYW5kICc+JyB0byBPX2d0LgorCShvcF9yYW5rKTogTm8gbG9uZ2VyIGNvbnN0LiAgQ2hhbmdlIHJhbmsgdmFsdWVzLgorCShleHByX2JlZ2luKTogTmV3IGZ1bmN0aW9uLgorCShvcGVyYXRvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGV4cHIpOiBVc2Ugb3BlcmF0b3IuICBEb24ndCBib3RoZXIgdG8gbWVudGlvbiB0aGUgb3BlcmF0b3IgaW4KKwl3YXJuaW5ncy4gIFJlbW92ZSBib2d1cyAjaWYgMCBjb2RlLiAgSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgorCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IEluIE1SSSBtb2RlLCBhY2NlcHQgdW5kZXJzY29yZXMKKwlhcm91bmQgdGhlIGV4cG9uZW50IGluIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCisJKiBzeW1ib2xzLmggKHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpOiBEZWNsYXJlLgorCSogc3ltYm9scy5jIChzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkoc3ltYm9sX2NyZWF0ZSk6IENoZWNrIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUuCisJKHN5bWJvbF9maW5kX2Jhc2UpOiBMaWtld2lzZS4KKwkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbmV3IG9wZXJhdG9yVCB2YWx1ZXMuCisJKHByaW50X2V4cHJfMSk6IExpa2V3aXNlLgorCShTX0lTX0xPQ0FMKTogSW4gTVJJIG1vZGUsIG5hbWVzIGJlZ2lubmluZyB3aXRoIHR3byAnPycgY2hhcmFjdGVycworCWFyZSBsb2NhbC4KKworVHVlIEF1ZyAgMSAxMTozNToxOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiB0Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBNYWtlIHNvbWUgZXJyb3IgbWVzc2FnZXMgbW9yZQorCWV4cGxpY3QuCisKK01vbiBKdWwgMzEgMjE6NDA6NDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlTYXQgSnVsIDI5IDE4OjU1OjIzIDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgorCisJKiBjb25maWcvb2JqLXZtcy5jIChDT1BZX1NIT1JULCBDT1BZX0xPTkcsIFBVVF9TSE9SVCwgUFVUX0xPTkcpOgorCU1ha2UgZXhwYW5zaW9uIGJlIHNhZmUgZm9yIHVzZSBpbiBleHByZXNzaW9ucy4KKwkoUFVUX0NPVU5URURfU1RSSU5HKTogQnJhY2tldCBleHBhbnNpb24gd2l0aCBgZG8gey4uLn0gd2hpbGUgKDApJworCXJhdGhlciB0aGFuIGp1c3QgYHsuLi59Jy4KKworTW9uIEp1bCAzMSAxODoxOToyNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBnYXNwLmMgKG1haW4pOiBQYXJzZSAtSSBvcHRpb24uCisJKGRvX2luY2x1ZGUpOiBMb29rIHRocm91Z2ggaW5jbHVkZSBsaXN0LgorCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IERvbid0IG1vZGlmeSBudW1iZXJzIGluIHN0cmluZ3MuIAorCitNb24gSnVsIDMxIDEyOjE2OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4gIEZyb20gTmljbGFzCisJQW5kZXJzc29uIDxuaWNhbkBpZGEubGl1LnNlPi4KKworVGh1IEp1bCAyNyAyMDo0NzoxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkbyBmdXJ0aGVyIHBjcmVsCisJcHJvY2Vzc2luZyBhZnRlciBjb252ZXJ0aW5nIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCisJc2FtZSBzZWdtZW50LiAgRnJvbSBKaW0gV2lsc29uLgorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eG9sZGxkKTogQWRkIGFzIHN5bm9ueW0gZm9yCisJaTM4Ni0qLWxpbnV4KmFvdXQqLiAgRnJvbSBGcmVkIEZpc2guCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgSnVsIDI3IDE2OjE0OjU2IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgorCisJKiBjb25maWcvb2JqLXZtcy5jIChlbnVtIHBzX3R5cGUge3BzX1RFWFQscHNfREFUQSxwc19DT01NT04sCisJcHNfQ09OU1R9KTogTmV3IGNvbnN0YW50cy4KKwkoVk1TX1BzZWN0X1NwZWMpOiBVc2UgdGhlbSBpbnN0ZWFkIG9mIGxpdGVyYWwgc3RyaW5ncy4KKwkodm1zX3dyaXRlX29iamVjdF9maWxlLCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSk6IEFkanVzdCBjYWxsZXJzLgorCitXZWQgSnVsIDI2IDE4OjMxOjM1IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgorCisJKiBjb25maWcvb2JqLXZtcy5jIChjb25zdF9mbGFnKTogQ2hhbmdlIGZyb20gY2hhciB0byB1bnNpZ25lZCBjaGFyLgorCSogY29uZmlnL29iai12bXMuaCAoY29uc3RfZmxhZyk6IERpdHRvLgorCShzdHJ1Y3Qgbmxpc3QpOiBSZXBsYWNlIHVuaW9uIG5fdW4gYW5kIG5fdW4ue25fbmFtZSxuX25leHQsbl9zdHJ4fQorCWZpZWxkcyB3aXRoIGp1c3Qgbl9uYW1lOyBkZWxldGUgZmllbGQgbl92YWx1ZTsgY2hhbmdlIG5fb3RoZXIgZnJvbQorCWNoYXIgdG8gdW5zaWduZWQgY2hhciBhbmQgbl9kZXNjIGZyb20gc2hvcnQgdG8gaW50OyBpbnNlcnQgZXhwbGljaXQKKwlwYWRkaW5nIGZvciBhbGlnbm1lbnQuCisKK01vbiBKdWwgMjQgMjA6MDY6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIHN1YnNlZ3MuaCAoc3RydWN0IHNlZ19pbmZvX3RyYXNoKTogTWFrZSBiaXRmaWVsZCB0eXBlcyB2YWxpZC4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMb2NhbCBhZGRfbnVtYmVyIHNob3VsZCBub3QKKwliZSBkZWNsYXJlZCByZWdpc3RlciBzaW5jZSBpdHMgYWRkcmVzcyBpcyB0YWtlbiBmb3IKKwlNRF9BUFBMWV9GSVgzLgorCisJRnJpIEp1bCAyMSAxNToyODoxOCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCVNwbGl0IGh1Z2Ugdm1zX3dyaXRlX29iamVjdF9maWxlIHJvdXRpbmUgaW50byBtYW5hZ2FibGUgcGllY2VzLgorCisJKiBjb25maWcvb2JqLXZtcy5jICh2bXNfZml4dXBfdGV4dF9zZWN0aW9uLCBzeW50aGVzaXplX2RhdGFfc2VnbWVudCwKKwl2bXNfZml4dXBfZGF0YV9zZWN0aW9uLCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSwgbG9jYWxfc3ltYm9sc19EU1QsCisJdm1zX2J1aWxkX0RTVCk6IE5ldyByb3V0aW5lcy4KKwkodm1zX3dyaXRlX29iamVjdF9maWxlKTogQ2FsbCB0aGVtLgorCShzdHJ1Y3Qgdm1zX29ial9zdGF0ZSk6IE5ldyBmaWxlIHNjb3BlIHZhcmlhYmxlIHVzZWQgYnkgdGhlIGFib3ZlLgorCitNb24gSnVsIDI0IDE0OjEwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAidXNlcyIuCisJKHNfdXNlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNoX2NvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBDYWxsIHN1YnNlZ19jaGFuZ2UgYmVmb3JlIGNhbGxpbmcgZml4X25ldy4KKwkoc2hfaGFuZGxlX2FsaWduKTogTmV3IGZ1bmN0aW9uLgorCShTV0lUQ0hfVEFCTEUpOiBEZWZpbmUuCisJKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCisJKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBSX1NIX1VTRVMsIFJfU0hfQ09VTlQgYW5kIFJfU0hfQUxJR04uCisJKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogTGlrZXdpc2UuICBBbHNvIGhhbmRsZSBzd2l0Y2ggdGFibGUKKwllbnRyaWVzLgorCSogY29uZmlnL3RjLXNoLmggKEhBTkRMRV9BTElHTik6IERlZmluZS4KKwkoc2hfaGFuZGxlX2FsaWduKTogRGVjbGFyZS4KKwkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KKwkoc2hfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUuCisJKFRDX0NPVU5UX1JFTE9DKTogU2ltcGxpZnk7IHJlbHkgb24gVENfRk9SQ0VfUkVMT0NBVElPTiBpbnN0ZWFkLgorCSh0Y19mcm9iX2ZpbGUpOiBEZWZpbmUuCisJKHNoX2NvZmZfZnJvYl9maWxlKTogRGVjbGFyZS4KKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGNfZnJvYl9maWxlIGlmIGl0CisJaXMgZGVmaW5lZC4KKwkoZml4dXBfbWRlcHMpOiBDYWxsIEhBTkRMRV9BTElHTiBpZiBpdCBpcyBkZWZpbmVkLgorCShUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCShmaXh1cF9zZWdtZW50KTogVXNlIFRDX0ZPUkNFX1JFTE9DQVRJT04gdG8gZGVjaWRlIHdoZXRoZXIgdG8KKwljbGVhciB0aGUgc3ltYm9sIGZpZWxkcyBvZiBmaXhQLgorCitGcmkgSnVsIDIxIDIyOjM4OjAwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX1NEQVJFTAorCXJlbG9jYXRpb24uCisJKG1kX2FwcGx5X2ZpeDMpOiBEaXR0by4KKworVGh1IEp1bCAyMCAxMzowMDo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKTogUmVuYW1lIGFyZ3VtZW50IHNlZyB0byBzZWMsCisJc2luY2Ugc2VnIGlzIGEgbWFjcm8gbmFtZSBpbiB0aGlzIGZpbGUuCisKKwkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IERvbid0IHNldCBlbXVsYXRpb24uCisKK1dlZCBKdWwgMTkgMTY6MDg6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmggKFRFX1BFKTogRGVsZXRlLgorCSogY29uZmlnL3RjLWFybS5oIChCWVRFX09SREVSKTogRGVsZXRlLgorCShUQVJHRVRfRk9STUFUKTogUHJvdmlkZSB2YWx1ZSBmb3IgT0JKX0NPRkYgYW5kIFRFX1BFLgorCShBUk1fQklfRU5ESUFOKTogRGVmaW5lIGlmIE9CSl9DT0ZGIGFuZCBURV9QRS4KKwkqIGNvbmZpZy90Yy1hcm0uYyAoYnl0ZV9vcmRlcik6IERlbGV0ZS4KKwkobWRfbnVtYmVyX3RvX2NoYXJzKTogUmVmZXJlbmNlIHRhcmdldF9iaWdfZW5kaWFuLCBub3QgYnl0ZV9vcmRlci4KKwkobWRfY2hhcnNfdG9fbnVtYmVyKTogTGlrZXdpc2UuCisJKG1kX2xvbmdvcHRzKTogQWRkIC1FQi8tRUwgaWYgQVJNX0JJX0VORElBTi4KKwkobWRfcGFyc2Vfb3B0aW9ucyk6IFJlY29nbml6ZSAtRUIvLUVMLgorCShtZF9zaG93X3VzYWdlKTogTGlzdCAtRUIvLUVMLgorCitXZWQgSnVsIDE5IDExOjQ5OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzcC5jIChwcm9jZXNzX2Fzc2lnbnMpOiBVc2UgdG91cHBlciBiZWZvcmUgY29tcGFyaW5nIGFnYWluc3QKKwl1cHBlciBjYXNlIGxldHRlci4KKwkod2hhdGNvbmQpOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLXNoLmMgKHNoX3JlbGF4KTogUmVuYW1lIGZyb20gcmVsYXgsIGFuZCBtYWtlIGdsb2JhbC4KKwlSZW5hbWVkIGFsbCB1c2VzLgorCShpbnNlcnQpOiBQYXNzIGEgc2l6ZSBvZiAyLCBub3QgNC4KKwkoYnVpbGRfcmVsYXgpOiBSZW1vdmUgdW51c2VkIGxlbiB2YXJpYWJsZS4KKwkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLWxpdHRsZSBvcHRpb24uCisJKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIGFyZ3VtZW50LiAgUmV3cml0ZSB0byBnZW5lcmF0ZSByZWxvY3MKKwlyYXRoZXIgdGhhbiB0byBnZW5lcmF0ZSBjb21wbGV0ZSBpbnN0cnVjdGlvbnMgaGVyZS4KKwkobWRfYXBwbHlfZml4KTogQWRqdXN0IGFuZCBjbGFyaWZ5IFJfU0hfUENSRUxJTU04Qlk0IGNhc2UgZm9yCisJY2hhbmdlcyBpbiBpbnNlcnQgYW5kIG1kX3BjcmVsX2Zyb20uICBBZGQgY2FzZXMgZm9yIFJfU0hfUENESVNQCisJYW5kIFJfU0hfUENESVNQOEJZMi4KKwkobWRfcGNyZWxfZnJvbSk6IERvbid0IHN1YnRyYWN0IDEsIGFkZCAyLgorCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IFJlbW92ZS4KKwkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtc2guaCAoVENfQ09GRl9GSVgyUlRZUEUpOiBKdXN0IHJldHVybiBmeF9yX3R5cGUuCisJKHNoX3JlbGF4KTogRGVjbGFyZS4KKwkoVENfQ09VTlRfUkVMT0MpOiBJZiByZWxheGluZywgY291bnQgUEMgcmVsYXRpdmUgcmVsb2NzLgorCShUQ19SRUxPQ19NQU5HTEUpOiBEZWZpbmUuCisJKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KKwkodGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCisJKiB0Yy5oIChtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBwYXJhbWV0ZXIgdG8gbm9uIEJGRF9BU1NFTUJMRVIKKwlkZWNsYXJhdGlvbi4KKwkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBBZGQgc2VjIGFyZ3VtZW50IHRvIG5vbgorCUJGRF9BU1NFTUJMRVIgdmVyc2lvbi4gIFBhc3MgaXQgdG8gbWRfY29udmVydF9mcmFnLgorCSh3cml0ZV9vYmplY3RfZmlsZSk6IFBhc3MgU0VHX1RFWFQgdG8gY3ZzX2ZyYWdfdG9fZmlsbC4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogUGFzcyBzZWdtZW50IGluZm8gdG8KKwlUQ19SRUxPQ19NQU5HTEUuCisJKGZpeHVwX21kZXBzKTogUGFzcyBzZWdtZW50IHR5cGUgdG8gbWRfY29udmVydF9mcmFnLgorCSogY29uZmlnL3RjLWEyOWsuYyAobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgYXJndW1lbnQuCisJKiBjb25maWcvdGMtaDgzMDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtaDg1MDAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1pODYwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLWk5NjAuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLXRhaG9lLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLXZheC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy13NjUuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtejhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX1JFTE9DX01BTkdMRSk6IEFkZCBzZWdtZW50IGFyZ3VtZW50LgorCSogY29uZmlnL3RjLWg4NTAwLmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLXc2NS5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy16OGsuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCisKK01vbiBKdWwgMTcgMTU6MDI6NTQgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk6IERlbGV0ZSBhcyBmaWxlCisJc2NvcGUgdmFyaWFibGVzLgorCShEZWZpbmVfUm91dGluZSwgRGVmaW5lX0xvY2FsX1N5bWJvbHMpOiBUYWtlIEN1cnJlbnRfUm91dGluZSBhbmQKKwlUZXh0X1BzZWN0IGFzIGFyZ3VtZW50cy4KKwkoVk1TX0RCR19EZWZpbmVfUm91dGluZSk6IERlbGV0ZS4KKwkoVk1TX1RCVF9CbG9ja19FbmQpOiBDaGFuZ2UgYFNpemUnIGFyZ3VtZW50IGZyb20gaW50IHRvIHZhbHVlVC4KKwkodm1zX3dyaXRlX29iamVjdF9maWxlOiB0ZXh0IGFuZCBkYXRhIGZpeHVwIGxvb3BzKTogRGlmZmVyZW5jZQorCW9mIHR3byBzeW1ib2xzIGhhcyB0eXBlIG9mZnNldFQgcmF0aGVyIHRoYW4gaW50OyBjb252ZXJ0IHdpdGgKKwltZF9udW1iZXJfdG9fY2hhcnMgYmVmb3JlIHBhc3NpbmcgdG8gVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhLgorCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IGRlYnVnIHN5bWJvbCBsb29wKTogQ2FsbCBEZWZpbmVfUm91dGluZQorCWluc3RlYWQgb2YgVk1TX0RCR19EZWZpbmVfUm91dGluZS4KKworU2F0IEp1bCAxNSAwMDowMTozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IEFkZCBAZml4dXAgc28gdGhhdCB0aGUKKwljb21waWxlciBjYW4gbWFyayB3aGljaCByZWxvY3Mgbm90IHRvIGNvbXBsYWluIGFib3V0IHdpdGgKKwktbXJlbG9jYXRhYmxlLgorCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCAuZml4dXAgdG8gc2VjdGlvbnMgbm90IHRvIGNvbXBsYWluCisJYWJvdXQsIGFuZCBhbHNvIGRvbid0IGNvbXBsYWluIGZvciBCRkRfUkVMT0NfQ1RPUiByZWxvY2F0aW9ucyBpbgorCXdyaXRhYmxlIG5vbi1jb2RlIHNlZ21lbnRzLgorCShtZF9hcHBseV9maXgpOiBUcmVhdCBCRkRfUkVMT0NfQ1RPUiBqdXN0IGxpa2UgQkZEX1JFTE9DXzMyLgorCitGcmkgSnVsIDE0IDE5OjU0OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUFkZCBzdXBwb3J0IGZvciBTUEFSQyBTdW5PUyBQSUM6CisJKiBjb25maWcvdGMtc3BhcmMuaCAoc3BhcmNfcGljX2NvZGUpOiBBbHdheXMgZGVjbGFyZSwgbm90IGp1c3QKKwl3aGVuIE9CSl9FTEYuCisJKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZSB3aGVuIE9CSl9BT1VULgorCSh0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBkZWZpbml0aW9uIGZvciBPQkpfQU9VVC4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19waWNfY29kZSk6IEFsd2F5cyBkZWZpbmUsIG5vdCBqdXN0IHdoZW4KKwlPQkpfRUxGLgorCShtZF9hcHBseV9maXgpOiBBZGp1c3QgcmVsb2MgYWRkZW5kIGZvciBPQkpfQU9VVCBhbmQgUElDLiAgSW4KKwlCRkRfUkVMT0NfMzJfUENSRUxfUzIgY2FzZSwgZG9uJ3QgaW5jcmVtZW50IHZhbCBmb3IgYW4gZXh0ZXJuYWwKKwlzeW1ib2wgd2hlbiBQSUMuCisJKHRjX2dlbl9yZWxvYyk6IEdlbmVyYXRlIGRpZmZlcmVudCBQSUMgcmVsb2NzIHdoZW4gT0JKX0FPVVQsIGFzCisJd2VsbCBhcyB3aGVuIE9CSl9FTEYuCisJKG1kX3Nob3J0b3B0cyk6IElmIE9CSl9BT1VULCBpbmNsdWRlIGBrJy4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSWYgT0JKX0FPVVQsIGhhbmRsZSAnaycuCisJKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1rIGlmIE9CSl9BT1VULCBhbmQgLUtQSUMgaWYgT0JKX0VMRi4KKwkobWRfcGNyZWxfZnJvbSk6IERvbid0IGFkZCBpbiBzaXplIGZvciBhbiBleHRlcm5hbCBzeW1ib2wgd2hlbgorCVBJQy4KKworVGh1IEp1bCAxMyAyMToxNjo0MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuaCAoVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0spOiBEZWZpbmUgZm9yIFNPTS4KKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MgZm9yIGJvdGgKKwlzeW1ib2xzIGluIGEgZml4dXAgd2hlcmUgYSBkZWZpbmVkIHN5bWJvbCBpcyBzdWJ0cmFjdGVkIGZyb20gYW4KKwl1bmRlZmluZWQgc3ltYm9sICh3aGVuIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LIGlzIGRlZmluZWQpLgorCShmaXh1cF9zZWdtZW50KTogRG8gbm90aGluZyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaWYKKwlVTkRFRklORURfRElGRkVSRU5DRV9PSyBpcyBkZWZpbmVkLgorCitXZWQgSnVsIDEyIDIzOjMzOjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBTdXBwb3J0IE1EX0FQUExZX0ZJWDMuCisKK1dlZCBKdWwgMTIgMDE6MTI6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKGZpeF9uZXcpOiBVc2UgaW50LCBub3Qgc2hvcnQgaW50LCBmb3IgYXJndW1lbnQgdHlwZS4KKwkoZml4X25ld19leHApOiBEaXR0by4KKworCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbnMuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKE5PX0VDT0ZGX0RFQlVHR0lORyk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcKKwl3YXNuJ3QgcHJldmlvdXNseSBkZWZpbmVkLgorCShzX2V4dGVybik6IERvbid0IHNldCBlY29mZl9leHRlcm5fc2l6ZSBpZiBOT19FQ09GRl9ERUJVR0dJTkcuCisJKG5vcGljX25lZWRfcmVsYXgpOiBEb24ndCBjaGVjayBpdCBpZiBOT19FQ09GRl9ERUJVR0dJTkcuCisJKG1hY3JvX2J1aWxkKSBbIVVTRV9TVERBUkddOiBEb24ndCB1c2UgdmFyaWFkaWMgcHJvdG90eXBlLgorCShtaXBzX2xvY2FsX2xhYmVsKSBbTk9fRUNPRkZfREVCVUdHSU5HXTogRG9uJ3QgcHJlc2VydmUgcG90ZW50aWFsCisJRUNPRkYgZGVidWdnaW5nIHN5bWJvbHMuCisKKwkqIGVtdWwuaCAoc3RydWN0IGVtdWxhdGlvbik6IFVzZSB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGNoYXIsIGZvcgorCWJpdGZpZWxkcy4KKwkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtYXJtLmMgKHN5bWJvbF9tYWtlX2VtcHR5KSBbQkZEX0FTU0VNQkxFUl06IFNldAorCXVkYXRhLnAsIG5vdCB1ZGF0YS4KKworVHVlIEp1bCAxMSAxNDozMDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLW00MDEwIGFuZCAtbW5vLTQwMTAuCisKK1R1ZSBKdWwgMTEgMTQ6Mjg6NTUgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNDAxMCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGludGVybG9ja3MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtZF9iZWdpbik6IENoZWNrIGZvciBhIGNwdSBvZiAicjQwMTAiLiAgU2V0IG1pcHNfNDAxMCBjb3JyZWN0bHkuCisJSWYgbWlwc180NjUwIG9yIG1pcHNfNDAxMCwgc2V0IGludGVybG9ja3MuCisJKGFwcGVuZF9pbnNuKTogQ2hlY2sgaW50ZXJsb2Nrcywgbm90IG1pcHNfNDY1MC4KKwkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgorCShtaXBzX2lwKTogT25seSBwZXJtaXQgSU5TTl80MDEwIGluc3RydWN0aW9ucyBpZiBtaXBzXzQwMTAuCisJKG1kX2xvbmdvcHRzKTogQWRkICJtNDAxMCIgYW5kICJuby1tNDAxMCIuCisJKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWNwdT1yNDAxMC4gIEhhbmRsZSAtbTQwMTAgYW5kCisJLW5vLW00MDEwLgorCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgLW00MDEwIGFuZCAtbm8tbTQwMTAuCisKK1R1ZSBKdWwgMTEgMTM6MjI6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5jIChzdHJ1Y3QgZWZkcik6IEFkZCBuZXcgZmllbGQgZmFrZS4KKwkoaW5pdF9maWxlKTogSW5pdGlhbGl6ZSBmYWtlLgorCShhZGRfZmlsZSk6IEFkZCBuZXcgcGFyYW1ldGVyIGZha2UuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKGVjb2ZmX2J1aWxkX2RlYnVnKTogRG9uJ3Qgd2FybiBhYm91dCBhIG1pc3NpbmcgLmVuZCBmb3IgYSBmYWtlCisJZmlsZS4KKworTW9uIEp1bCAxMCAxNjowMTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogZG9jL2FzLnRleGluZm86IFNwbGl0IG91dCBtb3N0IGNwdSBjaGFwdGVycy4uLgorCSogZG9jL2MtKi50ZXhpOiAuLi50byBoZXJlLgorCisJKiByZWFkLmMgKHBvX2hhc2gpOiBOb3cgc3RhdGljLgorCitNb24gSnVsIDEwIDEzOjQ3OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+OgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBmcm9tIG1kX2FwcGx5X2ZpeDEuCisJQWNjZXB0IHBvaW50ZXIgdG8gdmFsdWUgYW5kIHNlZ21lbnQuICBGaXggT0JKX0VMRiBQQ1JFTCBjYXNlIHRvCisJaGFuZGxlIGdsb2JhbCBkZWZpbmVkIHN5bWJvbHMgY29ycmVjdGx5LgorCShtZF9hcHBseV9maXgpOiBSZW1vdmUgYm90aCB2ZXJzaW9ucy4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCisKKwkqIGNvbmZpZ3VyZS5pbjogV2hlbiBzd2l0Y2hpbmcgb24gJHtjcHV9LCB1c2UgJHtjcHV9LCBub3QKKwkkW3RhcmdldF9jcHV9LCBpbiBkZWZhdWx0IGNhc2UuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1NhdCBKdWwgIDggMTM6Mjc6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgorCXN1Yl9zeW1ib2xQLCBpbiBjYXNlIGl0IGlzbid0IGluIHRoZSBzeW1ib2wgdGFibGUuCisKK0ZyaSBKdWwgIDcgMTE6MTc6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfbGNvbW0pOiBGb3IgLmxjb21tIDEsIHNldCBhbGlnbiB0byAwLCBub3QgMS4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBJZiBTRl9HRVRfRlVOQ1RJT04sIHNldAorCUJTRl9GVU5DVElPTi4KKwkoc3ltYm9sX2dsb2JhbFAsIHN5bWJvbF9nbG9iYWxfbGFzdFApOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KKwkoeWFua19zeW1ib2xzKTogU29ydCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzIHRvIHRoZSBlbmQsIGp1c3QKKwliZWZvcmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzLgorCShnbHVlX3N5bWJvbHMpOiBBZGQgdHdvIGFyZ3VtZW50cywgYW5kIHVzZSB0aGVtIGluc3RlYWQgb2YKKwlyZWZlcnJpbmcgZGlyZWN0bHkgdG8gZ2xvYmFsIHZhcmlhYmxlcy4KKwkoY3Jhd2xfc3ltYm9scyk6IENhbGwgZ2x1ZV9zeW1ib2xzIHR3aWNlLCBvbmNlIGZvciBkZWZpbmVkIGdsb2JhbHMKKwlhbmQgb25jZSBmb3IgdW5kZWZpbmVkLiAgQWRkIGNvcnJlc3BvbmRpbmcga25vdyBjYWxscy4KKworCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsd2F5cyBhY2NlcHQgXHYuICBEb24ndCBtYWtlIGl0CisJY29uZGl0aW9uYWwgb24gQkFDS1NMQVNIX1YuCisJKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9vYmotYm91dC5oIChCQUNLU0xBU0hfVik6IERvbid0IGRlZmluZS4KKwkqIGNvbmZpZy90Yy1taXBzLmggKEJBQ0tTTEFTSF9WKTogRG9uJ3QgZGVmaW5lLgorCisJQWRkIFNQQVJDIEVMRiBQSUMgc3VwcG9ydC4KKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBQYXNzIGZpeFAgdG8gVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQLAorCW5vdCBmaXhQLT5meF9yX3R5cGUuCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfcGljX2NvZGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLiAKKwkobWRfYXBwbHlfZml4KTogSWYgZ2VuZXJhdGluZyBQSUMsIGFkanVzdCBmeF9hZGRudW1iZXIgZm9yIGFueSBub24KKwlQQyByZWxhdGl2ZSByZWxvYy4KKwkodGNfZ2VuX3JlbG9jKTogSWYgZ2VuZXJhdGluZyBQSUMsIGFkanVzdCB2YXJpb3VzIHJlbG9jIHR5cGVzLgorCVJlbW92ZSBmeF9wY3JlbCBhc3NlcnQsIHNpbmNlIGl0IGlzIG5vIGxvbmdlciB0cnVlLgorCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLUsgUElDLgorCSogY29uZmlnL3RjLXNwYXJjLmggKHNwYXJjX3BpY19jb2RlKTogRGVjbGFyZSBpZiBPQkpfRUxGLgorCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUgaWYgT0JKX0VMRi4KKwkodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgUEMgcmVsYXRpdmUgcmVsb2NzIGlmIFBJQy4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IFRha2UgYSBmaXhwLCBub3QgYQorCXJlbG9jIHR5cGUuCisKKwkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEFkZCBkZXBlbmRlbmN5IG9uIGNvbmYuaW4sIHNvIHRoYXQgY29uZgorCWlzIHJlYnVpbHQgd2hlbiBjb25mLmluIGNoYW5nZXMuCisKK1RodSBKdWwgIDYgMTY6NDk6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIEFsbCBmaWxlczogVXBkYXRlZCBGU0YgYWRkcmVzcy4KKworVGh1IEp1bCAgNiAxNjozMDozNCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmMgKGFkZF9maWxlKTogRG9uJ3QgY29sbGFwc2UgbXVsdGlwbGUgLmZpbGUgY29tbWFuZHMgaW50bworCWEgc2luZ2xlIGZpbGUgc3RydWN0dXJlLgorCShlY29mZl9idWlsZF9saW5lbm8pOiBTZXQgaWxpbmVCYXNlIHRvIHN1bSBvZiBwcmV2aW91cyBmaWxlJ3MKKwlpbGluZUJhc2UgYW5kIGNsaW5lLgorCitUaHUgSnVsICA2IDEyOjU0OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCVBhdGNoZXMgZnJvbSBKZXJyeSBCbGFrZWx5IDxnZXJyeV9ibGFrbGV5QHdlbGxmbGVldC5jb20+OgorCSogYXMuYyAobGlzdGluZ19maWxlbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHNob3dfdXNhZ2UpOiBNZW50aW9uIC1hPWZpbGUuCisJKHBhcnNlX2FyZ3MpOiBTdXBwb3J0ID0gb3B0aW9uIG9mIC1hIHRvIHNldCBuYW1lIG9mIGxpc3RpbmcgZmlsZS4KKwkobWFpbik6IFBhc3MgbGlzdGluZ19maWxlbmFtZSB0byBsaXN0aW5nX3ByaW50LgorCSogbGlzdGluZy5jIChsaXN0X2ZpbGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCSh2YXJpb3VzKTogUmVwbGFjZSBwcmludGYgd2l0aCBmcHJpbnRmIHRvIGxpc3RfZmlsZS4KKwkobGlzdGluZ19wcmludCk6IElmIG5hbWUgYXJndW1lbnQgaXMgbm90IE5VTEwsIG9wZW4gaXQgYXMKKwlsaXN0X2ZpbGUuCisJKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC1hPWZpbGUuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBEb24ndCBwZXJtaXQgcmVkZWZpbml0aW9uLCBldmVuCisJaWYgdGhlIHN5bWJvbCB3YXMgYWxyZWFkeSBpbiBic3Nfc2VjdGlvbi4gIEZpeCB3YXJuaW5nIG1lc3NhZ2UuCisKKwkqIGxpc3RpbmcuYyAoc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW5hbWUgZW5kX3BlbmRpbmcgZmllbGQgdG8KKwlhdF9lbmQuCisJKGZpbGVfaW5mbyk6IEluaXRpYWxpemUgYXRfZW5kLCBub3QgZW5kX3BlbmRpbmcuCisJKGJ1ZmZlcl9saW5lKTogSWYgYXRfZW5kIHNldCwganVzdCByZXR1cm4gaW1tZWRpYXRlbHkuICBEb24ndAorCXdvcnJ5IGFib3V0IGVuZF9wZW5kaW5nIGNhc2VzLiAgU2V0IGF0X2VuZCB3aGVuIEVPRiBpcyByZWFkLgorCShwcmludF9zb3VyY2UpOiBDaGVjayBhdF9lbmQsIG5vdCBlbmRfcGVuZGluZy4KKwkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5oIChhbHBoYV9kb19hbGlnbik6IERvbid0IGRlY2xhcmUuCisJKG1kX2RvX2FsaWduKTogRG9uJ3QgZGVmaW5lLgorCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgorCShhbHBoYV9kZWZpbmVfbGFiZWwpOiBEZWNsYXJlLgorCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KKwkoYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWNsYXJlLgorCSogY29uZmlnL3RjLWFscGhhLmMgKGluc25fbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShhdXRvX2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkIGNhc2VzIGZvciAudGV4dCwgLmRhdGEsIC5hbGlnbiwgLmJ5dGUsCisJLmh3b3JkLCAuaW50LCAubG9uZywgLm9jdGEsIC5xdWFkLCAuc2hvcnQsIC53b3JkLCAuZG91YmxlLCAuZmxvYXQsCisJYW5kIC5zaW5nbGUuICBDaGFuZ2UgLnRfZmxvYXRpbmcsIC5zX2Zsb2F0aW5nLCAuZl9mbG9hdGluZywKKwkuZ19mbG9hdGluZywgYW5kIC5kX2Zsb2F0aW5nIHRvIHVzZSBzX2FscGhhX2Zsb2F0X2NvbnMgcmF0aGVyIHRoYW4KKwlmbG9hdF9jb25zLgorCShzX2FscGhhX3RleHQsIHNfYWxwaGFfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCShzX3JkYXRhLCBzX3NkYXRhKTogQ2xlYXIgaW5zbl9sYWJlbCBhbmQgc2V0IGF1dG9fYWxpZ24uCisJKHNfZ3ByZWwzMik6IElmIGF1dG9fYWxpZ24sIGFsaWduLiAgQ2xlYXIgaW5zbl9sYWJlbC4KKwkoZW1pdF9pbnNuKTogQ2xlYXIgaW5zbl9sYWJlbC4KKwkoc19hbHBoYV9hbGlnbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGFscGhhX2FsaWduKTogTWFrZSBzdGF0aWMuICBUYWtlIGxhYmVsIGFyZ3VtZW50LgorCShhbHBoYV9mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNfYWxwaGFfY29ucywgc19hbHBoYV9mbG9hdF9jb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKGFscGhhX2RlZmluZV9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KKworV2VkIEp1bCAgNSAyMjo0OTozMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZi5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9yZWNvbmYuCisKKwlNb24gSnVsICAzIDE5OjQ3OjUzIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiBjb25maWcvb2JqLXZtcy5oICh2bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYpOiBVc2UgZnVsbCBwcm90b3R5cGUuCisJKHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCwgdGNfZnJvYl9sYWJlbCk6IE1vdmUgdGhlbSB0byBncm91cAorCXdpdGggb3RoZXIgcHJvdG90eXBlcy4KKwlbV0FOVF9WTVNfT0JKX0RFRlNdOiBPbmx5IGRlZmluZSB0aGUgbWFueSBPQkpfeCwgREJHX3gsIGFuZCBEU1RfeAorCW1hY3JvcyB3aGVuIHRoaXMgaXMgZGVmaW5lZC4KKwkqIGNvbmZpZy9vYmotdm1zLmM6IEZ1bGx5IHByb3RvdHlwZSBhbGwgbG9jYWwgZnVuY3Rpb25zLgorCVtzeW1ib2xTLCBmcmFnU106IFVzZSBjb25zaXN0ZW50bHkgaW5zdGVhZCBvZiB0aGVpciBzdHJ1Y3QgdGFncy4KKwlbV0FOVF9WTVNfT0JKX0RFRlNdOiBEZWZpbmUgdGhpcy4KKwkoc19jb25zdCk6IE1ha2UgZGVmaW5pdGlvbiBjb3JyZWN0bHkgbWF0Y2ggYWN0dWFsIHVzYWdlLgorCShWTVNfc3RhYl9wYXJzZSk6IE1ha2UgYGV4cGVjdGVkX3R5cGUnIGFyZyBiZSBpbnQgcmF0aGVyIHRoYW4gY2hhci4KKwkoZ2V0X1ZNU190aW1lX29uX3VuaXgpOiBEZWZpbmUgYXMgYHN0YXRpYyB2b2lkJy4KKwkoaGFzaF9zdHJpbmcpOiBNYWtlIGRlZmluaXRpb24gbWF0Y2ggYWN0dWFsIHVzYWdlOyBhcmd1bWVudCBpcworCWBjaGFyIGNvbnN0IConIHJhdGhlciB0aGFuIGB1bnNpZ25lZCBjaGFyIConLgorCShWTVNfQ2FzZV9IYWNrX1N5bWJvbCwgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzLCBWTVNfUHNlY3RfU3BlYywKKwlWTVNfR2xvYmFsX1N5bWJvbF9TcGVjKTogRGVjbGFyZSBzdHJpbmcgYXJncyBhcyBgY29uc3QgY2hhciAqJy4KKwlbSVNfR1hYX1ZUQUJMRV06IE5ldyBtYWNyby4KKwkodm1zX3dyaXRlX29iamVjdF9maWxlOiBHU0QgbG9vcCk6IFVzZSBpdC4KKwkodm1zX3dyaXRlX29iamVjdF9maWxlOiBkYXRhIHNlZ21lbnQpOiBSZW9yZ2FuaXplIGBmaWxsJyBsb29wLgorCitXZWQgSnVsICA1IDEyOjAxOjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3J0b3B0cyk6IEFkZCAiSzoiIGlmIE9CSl9FTEYuCisJKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9FTEYsIGNoZWNrIGZvciAtSy4gIERpZSBpZiAtSyBQSUMsIHNpbmNlCisJUElDIGNvZGUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKwkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2Ugc3RkX3Nob3J0b3B0cyB0byBiZSBhbiBhcnJheSByYXRoZXIKKwl0aGFuIGEgY29uc3RhbnQgc3RyaW5nLiAgT25seSBpbmNsdWRlICdLJyBpZiBXT1JLSU5HX0RPVF9XT1JEIGlzCisJbm90IGRlZmluZWQuICBPbmx5IGNoZWNrIGZvciAnSycgaW4gdGhhdCBjYXNlIGFzIHdlbGwuCisJKiBhcy5oIChmbGFnX3dhcm5fZGlzcGxhY2VtZW50KTogT25seSBkZWNsYXJlIGlmIFdPUktJTkdfRE9UX1dPUkQKKwlpcyBub3QgZGVmaW5lZC4KKworCSogY29uZi5pbjogQWRkIHVuZGVmIG9mIEhBVkVfU0JSSy4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xpbmUpOiBDYWxsIGxpc3Rpbmdfc291cmNlX2xpbmUsIGluCisJYm90aCBCRkRfQVNTRU1CTEVSIGFuZCBub24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24uCisKKwkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBXYXJuIGlmIHN5bWJvbCBpcyB3ZWFrLgorCShTX0NMRUFSX0VYVEVSTkFMKTogTGlrZXdpc2UuCisJKFNfU0VUX1dFQUspOiBXYXJuIGlmIHN5bWJvbCBpcyBnbG9iYWwuCisKKwkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdAorCXRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gYSBzZXQuCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgQGNvbmZpZ3VyZV9pbnB1dEA7IGl0J3Mgbm90IG5lZWRlZCBpbgorCWZpbGVzIG5hbWVkIE1ha2VmaWxlLgorCisJKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5zZXQiIHNvIHRoYXQgdGhlCisJZXhwbGljaXQgcHNldWRvLW9wIHdvcmtzLCB3aGlsZSBjb250aW51aW5nIHRvIHRyZWF0ICJzZXQiIGFzIGFuCisJaW5zdHJ1Y3Rpb24uCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2RlYnVnZ2luZ19zZWVuKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkoZWNvZmZfZGlyZWN0aXZlX2RlZik6IFNldCBlY29mZl9kZWJ1Z2dpbmdfc2Vlbi4KKwkoZWNvZmZfc3RhYik6IExpa2V3aXNlLgorCSogZWNvZmYuaDogTWFrZSBpZGVtcG90ZW50LgorCShlY29mZl9kZWJ1Z2dpbmdfc2Vlbik6IERlY2xhcmUuCisJKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIGVjb2ZmLmguCisJKG1pcHNfZGVidWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UpOiBSZW1vdmUgdW5uZWVkZWQgZGVjbGFyYXRpb25zLgorCShtZF9wYXJzZV9vcHRpb24pOiBJbiBjYXNlICdnJywgc2V0IG1pcHNfZGVidWcgdG8gZGVidWdnaW5nIGxldmVsLgorCShtaXBzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgorCSogdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IENhbGwgbWlwc19sb2NhbF9sYWJlbC4KKwkobWlwc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCisKK1dlZCBKdWwgIDUgMDA6NTk6MjIgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGFzLmMgKG1haW4pOiAgT25seSB1c2Ugc2JyayB3aGVuIEhBVkVfU0JSSyBkZWZpbmVkLgorCSogY29uZmlndXJlLmluOiAgQWRkIHRlc3QgZm9yIHNicmsuCisJKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIHVzaW5nIGF1dG9jb25mIDIuNC4KKworTW9uIEp1bCAgMyAxNTo1ODoxNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuaCAoTUFYX1JFTE9DX0VYUEFOU0lPTik6IEJ1bXAgdG8gNi4KKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUKKwlyZWxvY2F0aW9ucyBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIChwb3NzaWJseSBleHRlcm5hbCkKKwlzeW1ib2xzLgorCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRm9yIFNPTSwgcmVqZWN0IHJlZHVjdGlvbnMgaW52b2x2aW5nCisJdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCisJKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBleHByZXNzaW9ucworCWludm9sdmluZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4KKworTW9uIEp1bCAgMyAxNDoyMjo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmVbLmluXSAoaTM4Ni0qLXdpbjMyKTogTmV3IGhvc3QgYW5kIHRhcmdldC4KKworVGh1IEp1biAyOSAxNzoyNTo0MyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJU3VwcG9ydCBmb3IgbG9uZyBmaWxlbmFtZXMgbm9uLWJmZCBjb2ZmLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGZpbGVuYW1lX2xpc3RfaGVhZCwgZmlsZW5hbWVfbGlzdF90YWlsKTogTmV3LgorCSh5YW5rX3N5bWJvbHMpOiBOb3RpY2UgYW5kIHJlY29yZCBmaWxlbmFtZXMgd2hpY2ggYXJlIHRvbyBsb25nLgorCSh3X3N0cmluZ3MpOiBXcml0ZSBvdXQgZmlsZW5hbWUgc3RyaW5ncy4KKwkoY19kb3RfZmlsZV9zeW1ib2xzKTogUHV0IGxvbmcgZmlsZW5hbWVzIG9udG8gbGlzdC4KKworV2VkIEp1biAyOCAxNzozMzoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFBFIGRvZXNuJ3QgdXNlCisJdGhlIHN0cmFuZ2UgY29tbW9uIHN5bWJvbCBmb3JtYXQgdGhhdCBvdGhlciAzODZzIGZvcm1hdHMKKwlkby4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogSWYgTEVYX0FUIGRlZmluZWQgdGhlbgorCSdAJyBpcyBpbiB0aGUgc2V0IG9mIGlkZW50aWZpZXJzLgorCShpMzg2X29wZXJhbmQpOiBJZiBMRVhfQVQsIHRoZW4gZG9uJ3QgbG9vayBmb3IgQGdvdG8gc3R1ZmYuCisJKiBjb25maWcvdGUtcGUuaDogRGVmaW5lIExFWF9BVC4KKworV2VkIEp1biAyOCAxNzo0OTo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogZG9jL2FzLnRleGluZm8gKEg4LzUwMCBGbG9hdGluZyBQb2ludCk6IEluZGljYXRlIHRoYXQgSUVFRSBGUAorCW51bWJlcnMgYXJlIGZvciB0aGUgc3RhbmRhcmQgZW11bGF0aW9uIGNvZGUuCisJKFNIIEZsb2F0aW5nIFBvaW50KTogRGl0dG8uCisJKE92ZXJ2aWV3KTogRGVzY3JpYmUgbmV3IC0tZW11bGF0aW9uIG9wdGlvbiBmb3IgTUlQUy4KKwkqIGRvYy8qLm00OiBEZWxldGVkLgorCitUaHUgSnVuIDIyIDE5OjI2OjI1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIGkzODYtKi1tb3NzKiB0YXJnZXQuCisKK1RodSBKdW4gMjIgMTQ6NDE6MjMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENhc3QgZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUKKwlhcmd1bWVudCB0byBjaGFyICogdG8gYXZvaWQgd2FybmluZy4KKworV2VkIEp1biAyMSAxODowNzo1OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJQ2hhbmdlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OgorCSogY29uZmlnL3RjLW02OGsuYyAoaW5zd29yZCk6IEluY3JlbWVudCB0aGUgZnJhZyBvZmZzZXRzLgorCShzdHJ1Y3QgbTY4a19pdCk6IEFkZCByZWxvY1tdLnBjcmVsX2ZpeCBmaWVsZCB0byBob2xkIHBjLXJlbAorCWZpeHVwLgorCShhZGRfZml4KTogQWNjZXB0IGFkZGl0aW9uYWwgcGFyYW1ldGVyLCB0aGUgcGMtcmVsIGZpeHVwLiBBbGwKKwljYWxsZXJzIGNoYW5nZWQuICBGaXggb2Zmc2V0IGFkZHJlc3MgaWYgd2lkdGggPT0gJ2InLgorCShtNjhrX2lwKSBbY2FzZSBBSU5EWF06IEFsbG93IGV4cGxpY2l0IHNpemUgc3BlYy4gIERvbid0IG1ha2UgdGhlCisJb3V0ZXIgZGlzcGxhY2VtZW50IHBjLXJlbGF0aXZlLgorCShtZF9wY3JlbF9mcm9tKTogTWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgZXh0ZW5zaW9uIHdvcmQgb2YKKwl0aGUgb3BlcmFuZC4KKwkob3Bjb2RlX3B0cik6IE1ha2UgaXQgYSBtYWNybyBpZiBET19CUkVBS19VUF9CSUdfREVDTCBpcworCXVuZGVmaW5lZC4KKwkobWRfY29udmVydF9mcmFnXzEpOiBEb24ndCByZWZlcmVuY2UgZnJhZ1AtPmZyX29wY29kZVsyLi5dLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCkgW2Nhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRildOgorCVR1cm4gb24gbG9uZyBiaXQuCisJKG02OGtfaXApIFtjYXNlICdDJ106IERvbid0IHNldCBzZXQgbG9uZyBiaXQsIHNldCBpdCBpbiB0aGUgb3Bjb2RlCisgCXRhYmxlLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCkgW2Nhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRildOgorCVZhcmlhYmxlIHBhcnQgaW5jcmVhc2VzIGJ5IGZvdXIsIG5vdCBzaXguCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KSBbVENfTTY4S106IERvbid0IGRvIGZ1cnRoZXIgcGNyZWwKKwlwcm9jZXNzaW5nIGFmdGVyIGNvbnZlcnRpbmcgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKKwlzYW1lIHNlZ21lbnQuCisKKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBjb25kaXRpb25hbGl6ZSB0aGUgcGNyZWwgZml4IG9uCisJVENfTTY4Sy4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwLCBjYXNlICdBJyk6IElmIEFTSSBpcyBub3QgYSAiIyIKKwl2YWx1ZSwgZG9uJ3Qgc2hpZnQgaXQgYW4gZXh0cmEgdGltZS4KKworV2VkIEp1biAyMSAxNDoxODozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBnYXNwLmMgKGRvX3ByaW50LCBkb19mb3JtLCBidWZmZXJfYW5kX25lc3QpOiBVc2UgY2FzZSBpbnNlbnNpdGl2ZQorCXN0cmluZyBjb21wYXJlcy4KKworVHVlIEp1biAyMCAxNDo1NTowMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYXN0IHRpbWUoKSBhcmd1bWVudCB0bworCXRpbWVfdCAqLgorCitUdWUgSnVuIDIwIDEyOjAwOjUzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBGaXggdHlwbyBpbiBsYXN0CisJY2hhbmdlLgorCitNb24gSnVuIDE5IDE1OjI3OjE3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBaZXJvIG91dCBtZW1vcnkKKwlmcm9tIGZyYWdfbW9yZSBjYWxscy4KKworVGh1IEp1biAxNSAxNjo1MzozNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jOiBEb24ndCB1c2UgImJmZC8iIHdoZW4gaW5jbHVkaW5nIGxpYmJmZC5oCisJYW5kIGxpYmNvZmYuaC4KKwkoZmlsbF9zZWN0aW9uKTogQ2FsbCBQUk9HUkVTUy4KKwkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IEFkZCBiZmQgc3JjZGlyLgorCisJKiBtcHctY29uZmlnLmluOiBBZGQgYmZkX2dhcyBmbGFnIGFuZCBzZXQgZm9yIGVhY2ggY29uZmlnLgorCShpMzg2LXVua25vd24tZ28zMiwgbTY4ay11bmtub3duLWNvZmYpOiBSZWNvZ25pemUuCisJKiBtcHctbWFrZS5pbiAoSEFDS19PX1JBTUEsIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QKTogQWRkIHRvCisJY29uZmlnLmguCisKK1RodSBKdW4gMTUgMTA6MDQ6MjYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTCk6IFByZXBlbmQgJy4nIGlmIG5vdCBPQkpfQU9VVC4KKwkoRkFLRV9MQUJFTF9OQU1FKTogTGlrZXdpc2UuCisKK01vbiBKdW4gMTIgMjI6MjU6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogQ2hlY2sgZm9yIGludmFsaWQgcmVnaXN0ZXIgaW4gc2luZ2xlCisJcHJlY2lzaW9uIGZtcHlhZGQgYW5kIGZtcHlzdWIgaW5zdHJ1Y3Rpb25zLgorCitUaHUgSnVuICA4IDE5OjMzOjAyIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiBjb25maWcvb2JqLXZtcy5jIChteW5hbWUpOiBEZWxldGUgYWxsIHJlZmVyZW5jZXMuCisJKFZNU19zdGFiX3BhcnNlLCBXcml0ZV9WTVNfTUhEX1JlY29yZHMsIFZNU19DYXNlX0hhY2tfU3ltYm9sKToKKwlSZXBsYWNlIHByaW50ZiBjYWxscyB3aXRoIGFzX3Rza3Rzay4KKwkoUFVUX0xPTkcsIFBVVF9TSE9SVCk6IFVzZSBDT1BZX0xPTkcsIENPUFlfU0hPUlQuCisJKFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSk6IE1vdmUgc2Vjb25kIGJ1ZmZlciBjYXBhY2l0eSBjaGVjaworCWJlbG93IGJvdHRvbSBvZiBsb29wOyBmaXJzdCBjaGVjayBhdCB0b3Agc3VmZmljZXMgZm9yIGxvb3AgaXRzZWxmLgorCShmaW5kX2ZpbGUpOiBSZW1vdmUgcmVkdW5kYW50IHBvaW50ZXIgY2hlY2tzIGluIGZpcnN0IHR3byBsb29wczsKKwlyZXBsYWNlIHRoaXJkIGxvb3Agd2l0aCBwb2ludGVyIHRvIGxhc3QgbGlzdCBlbGVtZW50IGRldGVybWluZWQKKwlpbiBmaXJzdCBsb29wLgorCitUdWUgSnVuICA2IDEzOjUzOjA2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEhhbmRsZSBkZWZpbmVkIGFic29sdXRlIHN5bWJvbHMgYXMKKwlBU0kgdmFsdWVzLgorCisJKiBjb25maWcvb2JqLXZtcy5jICh2bXNfd3JpdGVfb2JqZWN0X2ZpbGUsIGNhc2UgTl9EQVRBKTogVXNlCisJc3RyY21wIGFnYWluc3QgRkFLRV9MQUJFTF9OQU1FIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhpcmQKKwljaGFyYWN0ZXIuICAoU3VnZ2VzdGVkIGJ5IFBhdCBSYW5raW4uKQorCitNb24gSnVuICA1IDIwOjEwOjQ2IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJQWRkIHN1cHBvcnQgZm9yIE5fQUJTIGFuZCBOX0FCU3xOX0VYVCB0eXBlIHN5bWJvbHMuCisKKwkqIGNvbmZpZy9vYmotdm1zLmggKExTWV9TX01fe0RFRixSRUx9LCBFTlZfU19NX3tERUYsTkVTVEVEfSk6CisJTmV3IG1hY3JvcyBmb3IgbG9jYWwgc3ltYm9scyAoZnJvbSA8bHN5ZGVmLmg+IGFuZCA8ZW52ZGVmLmg+KS4KKwkqIGNvbmZpZy9vYmotdm1zLmMgKEN1cnJlbnRfRW52aXJvbm1lbnQpOiBOZXcgZmlsZS1zY29wZSB2YXJpYWJsZS4KKwkoVk1TX0xvY2FsX0Vudmlyb25tZW50X1NldHVwKTogTmV3IHJvdXRpbmUuCisJKEdCTFNZTV9MQ0wpOiBOZXcgbWFjcm8uCisJKFZNU19HbG9iYWxfU3ltYm9sX1NwZWMpOiBIYW5kbGUgbG9jYWwgc3ltYm9scyB0b28uCisJKFZNU19Qc2VjdF9TcGVjKTogU2V0IEdMT0JBTFZBTFVFX0JJVCBmb3IgYWJzb2x1dGUgc3ltYm9scy4KKwkoVk1TX0VtaXRfR2xvYmFsdmFsdWVzKTogSGFuZGxlIGxvY2FsIGFuZCBnbG9iYWwgYWJzb2x1dGUgc3ltYm9scy4KKwkoVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlKTogRGl0dG8uCisJKHZtc193cml0ZV9vYmplY3RfZmlsZTogR1NEIHN5bWJvbCBsb29wKTogRGl0dG8uCisKK01vbiBKdW4gIDUgMTY6MTA6NDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUuCisKK01vbiBKdW4gIDUgMDI6MTc6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqKTogQWx3YXlzIHVzZSBHTlUgRUxGIGNvbmZpZy4KKworV2VkIE1heSAzMSAxNzo0OToxOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogY29uZmlnL29iai12bXMuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFVwZGF0ZSAqc3ltYm9sUFAKKwlpbiBgZWxzZScgY2xhdXNlIHdoZW4gcmVtb3ZpbmcgYSBzeW1ib2wuICBBbHNvLCByZXZpc2UgY29tbWVudHMKKwl0byBtYXRjaCB0aGUgY29kZS4KKwkodm1zX3dyaXRlX29iamVjdF9maWxlIChHU0Qgc3ltYm9sIGxvb3AsIGNhc2UgTl9EQVRBKSk6IE5ldmVyCisJb3V0cHV0IHN5bWJvbCBkZWZpbml0aW9ucyBmb3IgbG9jYWwgbnVtZXJpYyBsYWJlbHMuCisKK1R1ZSBNYXkgMzAgMTg6Mjk6MTAgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorCisJKiBjb25maWd1cmUuaW4gKGFyY2hpdGVjdHVyZSB2YXJpYW50cywgY2FzZXMgYXJtZWIgYW5kIGFybSopOiBSZW1vdmUKKwlzcGFjZXMgcm91bmQgYXNzaWdubWVudCB0byBlbmRpYW4uCisKK1R1ZSBNYXkgMzAgMTI6MzE6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBmb3IgdW5kZWZpbmVkIGxvY2FsIGRvbGxhcgorCWFuZCBmYiBsYWJlbHMuCisKKwkqIHN5bWJvbHMuYyAoZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUpOiBFeHRyYWN0IGluc3RhbmNlIG51bWJlcgorCWZyb20gdGhlIGNvcnJlY3QgbG9jYXRpb24uCisKK1NhdCBNYXkgMjcgMjE6Mjg6NDkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGUtZHB4Mi5oOiBJbmNsdWRlIG9iai1mb3JtYXQuaC4KKwkoQ09GRl9NQUdJQyk6IFJlbmFtZWQgZnJvbSBGSUxFX0hFQURFUl9NQUdJQy4KKworV2VkIE1heSAyNCAxMzo0NTozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZi5oOgorCUFkZCBzdXBwb3J0IGZvciBBUk0gcGUKKworVHVlIE1heSAyMyAxNzowMDozMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2CisJYW5kIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5LgorCitUdWUgTWF5IDIzIDE5OjE4OjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGFzLmMgKHBhcnNlX2FyZ3MpIFshIFVTRV9FTVVMQVRJT05TXTogQWx3YXlzIHByaW50IGFuIGVycm9yCisJbWVzc2FnZS4KKworCSogZG9jL2ludGVybmFscy50ZXhpOiBEb2N1bWVudCBvYmpfYXBwX2ZpbGUgYW5kCisJVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCisKK01vbiBNYXkgMjIgMjA6MDM6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IEFkZCBleHRyYSBsZWFkaW5nIGFyZ3VtZW50LCBmb3IgNCBNYXkKKwljaGFuZ2UuCisJKiBlY29mZi5oIChlY29mZl9zdGFiKTogRml4IGRlY2xhcmF0aW9uLgorCSogb2JqLmggKGZvcm1hdF9vcHMucHJvY2Vzc19zdGFiKTogSW5jbHVkZSBwcm90b3R5cGUuCisJKiBjb25maWcvb2JqLWVsZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogUGFzcyB0aHJvdWdoIHNlZyBhcmd1bWVudC4KKwkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1BST0NFU1NfU1RBQik6IERpdHRvLgorCisJKiBjb25maWcvZS1taXBzZWxmLmMgKG1pcHNlbGYpOiBOZXcgZW11bGF0aW9uIG1vZGUsIGRvZXNuJ3QgY2hhbmdlCisJZW5kaWFubmVzcyBmcm9tIGNvbmZpZ3VyZWQgZGVmYXVsdC4KKwkqIGNvbmZpZy9lLW1pcHNlY29mZi5jIChtaXBzZWNvZmYpOiBEaXR0by4KKwkqIGNvbmZpZ3VyZS5pbiAobWlwcyBlY29mZi9lbGYgdGFyZ2V0cyk6IEluY2x1ZGUgdGhlbS4KKwkqIGFzLmMgKG1pcHNlbGYsIG1pcHNlY29mZik6IERlY2xhcmUuCisKKwkqIGFzLmMgKGVtdWxhdGlvbl9uYW1lKTogTmV3IHZhcmlhYmxlLgorCShzZWxlY3RfZW11bGF0aW9uX21vZGUpOiBTZXQgZW11bGF0aW9uX25hbWUuICBEb24ndCBjaGFuZ2UgYXJndi4KKwkocGFyc2VfYXJncyk6IEhhbmRsZSAtLWVtdWxhdGlvbjsgY29tcGxhaW4gaWYgdGhlIHN1cHBsaWVkIG5hbWUKKwlpc24ndCB3aGF0IHNlbGVjdF9lbXVsYXRpb25fbmFtZSBjYW1lIHVwIHdpdGguCisKK1N1biBNYXkgMjEgMjE6MzY6MTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IFJldmVyc2UgY2hhbmdlcyBmcm9tIERlYy4gMTl0aCB3aGljaAorCWNoYW5nZWQgdGhlIHdheSB1bndpbmRzIHdlcmUgYnVpbHQgZm9yIEVMRi4gIFJlbHkgb24gcmVsb2NhdGlvbgorCXN5bWJvbCByZWR1Y3Rpb25zIHRvIGF2b2lkIHBsYWNpbmcgdGhlIGVuZCBvZiBmdW5jdGlvbiBtYXJrZXIKKwlzeW1ib2xzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLgorCitTYXQgTWF5IDIwIDEyOjMxOjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCUFkZGVkIGltcHJvdmVkIFZNUyBzdXBwb3J0IGZyb20gUGF0IFJhbmtpbjoKKworCUZyaSAxOSBNYXkgMTY6NTE6NDAgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIGNvbmZpZy9vYmotdm1zLmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKGZwdXNoLCBycHVzaCk6IE5ldyByb3V0aW5lcy4KKwkocHVzaCk6IFJlcGxhY2VkIGJ5IHRoZSBhYm92ZS4KKwkoZmluZF9zeW1ib2wpOiBTbGlnaHQgcmVvcmdhbml6YXRpb24gdG8gZXhwb3NlIHRhaWwgcmVjdXJzaW9uLgorCisJRnJpIE1hciAxNyAxODo0MDozNiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogIGRlbGV0ZSB0aGlzLgorCSogdm1zY29uZi5zaCAobWFrZS1nYXMuY29tKTogIGJ1aWxkIC4uL2xpYmliZXJ0eS9saWJlcnR5Lm9sYgorCWZpcnN0IGlmIG5lY2Vzc2FyeTsgbGluayBnYXMgYWdhaW5zdCBpdC4KKworRnJpIE1heSAxOSAxNjozNzozOSAxOTk1ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCisKKwkqIGdhc3AuYyAoaXN0cnVlKTogQ29ycmVjdGx5IHRlc3QgZm9yIHN0cmluZyBpbmVxdWFsaXR5LgorCitUaHUgTWF5IDE4IDA0OjI1OjExIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCisKKwkqIGNvbmZpZy90Yy1hcm0uYyAoQ1BfVF97UHJlLFVELFdCfSk6IERlZmluZSwgYml0cyBpbiBjby1wcm9jZXNzb3IKKwlpbnN0cnVjdGlvbnMuCisJKFtsc11mbV9mbGFncyk6IENvcnJlY3QgZXJyb3IgaW4gYml0bWFza3MuCisJKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IERlbGV0ZSBzZWNvbmQgcGFyYW1ldGVyLCBGTEFHUy4gIEFsbAorCWNhbGxlcnMgY2hhbmdlZC4gIFJlbW92ZSBhbGwgZGVhZCBjb2RlIHJlZmVycmluZyB0byBGTEFHUy4gIElmCisJYWRkcmVzcyBpcyBqdXN0ICJbUmVnXSIgdGhlbiBjb252ZXJ0IGludG8gYSBQUkUtSU5DUkVNRU5UIFVQIGZvcm1hdC4KKwkoZG9fZnBfbGRtc3RtKTogSGFuZGxlIGZ1bGwtZGVzY2VuZGluZyBhbmQgZW1wdHktYXNjZW5kaW5nIHN0YWNrCisJZm9ybWF0cyBleHBsaWNpdGx5LgorCisJKiBjb25maWcvdGMtYXJtLmMgKGludGVybmFsRXJyb3IpOiBEZWZpbmUuCisJKEFSTV97MSwyLDI1MCwzLDYsNyw3RE0sQU5ZLDJVUCxBTEwsM1VQLDZVUCxMT05HTVVMfSk6IERlZmluZSBwcm9jZXNzb3IKKwl2YXJpYW50cy4KKwkoRlBVX3tDT1JFLEZQQTEwLEZQQTExLE5PTkUsQUxMLE1FTU1VTFRJfSk6IERlZmluZSBmbG9hdGluZyBwb2ludAorCXZhcmlhbnRzLgorCSh7Q1BVLEZQVX1fREVGQVVMVCk6IERlZmluZS4KKwkoY3B1X3ZhcmlhbnQpOiBOZXcgdmFyaWFibGUuCisJKGFzbV9mbGcpOiBDaGFuZ2UgbW9yZV9mbGFncyB0byBmbGFnX2JpdHMuCisJQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuCisJKEZMQUdfe1MsUCxCLFQsRUQsRkQsRkEsRUEsSUIsSUEsREIsREEsTH0pOiBEZWxldGUuCisJKHNfZmxhZ1tdLCBsZHN0X2ZsYWdzW10sIGJ5dGVfZmxhZ1tdLCBjbXBfZmxhZ3NbXSwgbGRtX2ZsYWdzW10sCisJIHN0bV9mbGFnc1tdLCBsZm1fZmxhZ3NbXSwgc2ZtX2ZsYWdzW10sIHJvdW5kX2ZsYWdzW10sIGV4Y2VwdF9mbGFnc1tdLAorCSBjcGxvbmdfZmxhZ1tdKTogTmV3IHZhcmlhYmxlcy4KKwkoYXNtX29wY29kZSwgaW5zbnNbXSk6IE5ldyBmb3JtYXQsIGFkZCB2ZXJzaW9uIHN1cHBvcnQuCisJKGFybV9mbGdfaHNoKTogRGVsZXRlLgorCShkb19tdWwsIGRvX21sYSk6IFJlbW92ZSAiV2FybmluZyIgZnJvbSB3YXJuaW5nIG1lc3NhZ2VzLgorCShkb19hcml0KTogU2ltcGxpZnkuCisJKGRvX3N3YXApOiBNYWtlIGVycm9yIG1lc3NhZ2UgbW9yZSBhcHByb3ByaWF0ZS4KKwkobWRfYmVnaW4pOiBCdWlsZCBoYXNoIHRhYmxlcyBzdGFydGluZyBhdCBmaXJzdCBlbnRyeSBpbiB0YWJsZXMuCisJKG1kX251bWJlcl90b19jaGFycyk6IENvcGUgd2l0aCBiaWcvbGl0dGxlLWVuZGlhbiBzZWxlY3Rpb24uCisJKG1kX2NoYXJzX3RvX251bWJlcik6IE5ldyBmdW5jdGlvbi4KKwkobWRfYXBwbHlfZml4KTogUmV3cml0ZSB0byBtYWtlIGVuZGlhbiBpbmRlcGVuZGVudC4KKwkodGNfZ2VuX3JlbG9jKTogQmV0dGVyIGVycm9yIG1lc3NhZ2VzLgorCShtZF9hc3NlbWJsZSk6IFJlamVjdCBvcGNvZGVzIGZvcmJpZGRlbiBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNwdQorCXZhcmlhbnQuICBSZXdyaXRlIGhhbmRsaW5nIGNvZGUgZm9yIGluc3RydWN0aW9uIGZsYWdzLgorCShtZF9zaG9ydG9wdHMpOiBBZGQgb3B0aW9uICJtOiIuCisJKG1kX3BhcnNlX29wdGlvbik6IEdldCB0aGUgZGVzaXJlZCBjcHUvZnB1IHZhcmlhbnQuCisKKwlGcm9tOiBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQorCSogY29uZmlndXJlLmluIChhcmNoaXRlY3R1cmUgdmFyaWFudHMpOiBDaGVjayBmb3IgImFybWViIiBhbmQgImFybSoiLAorCXNldCBlbmRpYW5uZXNzIGFjY29yZGluZ2x5LgorCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBOZXcgaG9va3MgbWRfc3RhcnRfbGluZV9ob29rIGFuZAorCW1kX2FmdGVyX3Bhc3NfaG9vay4KKwkqIGNvbmZpZy9hcm0te2JpZyxsaXR9Lm10OiBOZXcgZmlsZXMKKwkqIGNvbmZpZy90Yy1hcm0uaCAoe0xJVFRMRSxCSUd9X0VORElBTiwgQllURV9PUkRFUik6IERlZmluZS4KKwkoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBkZXBlbmRpbmcgb24gZW5kaWFubmVzcyBhbmQgZW11bGF0aW9uIGFuZAorCW9iamVjdCBmb3JtYXQuCisJKG1kX2FmdGVyX3Bhc3NfaG9vaywgbWRfc3RhcnRfbGluZV9ob29rKTogRGVmaW5lLgorCSogY29uZmlnL3RjLWFybS5jOiBJbmNsdWRlIHN1YnNlZ3MuaCwgc3ltYm9scy5oIGFuZCBsaXN0aW5nLmguCisJKHNoaWZ0W10pOiBBZGQgdXBwcGVyIGNhc2UgZXF1aXZhbGVudHMuCisJKENQX1RfW1hZXSwgVFJBTlNfQklUKTogRGVmaW5lLgorCShjb25kc1tdKTogRGVsZXRlIGluaXRpYWwgTlVMTCBlbnRyeSwgYWRkICJsbyIgZW50cnkgYXMgc3lub255bSBmb3IKKwkiY2MiLgorCShMT05HRVNUX0ZMQUcsIGZsYWdzW10pOiBEZWxldGUuCisJKGFybV9wc3IpOiBOZXcgc3RydWN0dXJlLgorCShwc3JzW10pOiBOZXcgdmFyaWFibGUuCisJKFBTUl9BTEwpOiBEZWZpbmUuCisJKExPTkdFU1RfSU5TVCk6IEJ1bXAgdG8gNS4KKwkoTElURVJBTF9NQVNLLCBDT05EX01BU0ssIE9QQ09ERV9NQVNLLCBEQVRBX09QX1NISUZUKTogRGVmaW5lLgorCShPUENPREVfe0FORCxFT1IsU1VCLFJTQixBREQsQURDLFNCQyxSU0MsVFNULFRFUSxDTVAsQ01OLE9SUixNT1YsQklDLAorCSBNVk59KTogRGVmaW5lLgorCShpbnNuc1tdKTogQWRkIHNtdWxsLCB1bXVsbCwgc21sYWwsIHVtbGFsLCBsZGZtLCBzdGZtLCBtc3IgYW5kIG1ycworCWluc3RydWN0aW9ucy4gIEFkZCBub3AgYW5kIGFkciBwc2V1ZG8gb3BzLgorCShyZWdfdGFibGUpOiBBZGQgQVBDUyByZWdpc3RlciBuYW1lIHZhcmlhbnRzLgorCShhcm1fcHNyX2hzaCk6IE5ldyBoYXNoIHRhYmxlLgorCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImx0b3JnIiwgInBvb2wiLCAiZXh0ZW5kIiwgImxkb3VibGUiIGFuZAorCSJwYWNrZWQiLgorCShNQVhfTElURVJBTF9QT09MX1NJWkUpOiBEZWZpbmUuCisJKHN0cnVjdCBsaXRlcmFsUyk6IE5ldyBzdHJ1Y3R1cmUuCisJKGxpdGVyYWxzLCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSwgbGl0X3Bvb2xfbnVtLCBjdXJyZW50X3Bvb2xQKTogTmV3CisJdmFyaWFibGVzLgorCShhZGRfdG9fbGl0X3Bvb2wsIHN5bWJvbF9sb2NhdGUsIHN5bWJvbF9tYWtlX2VtcHR5KTogTmV3IGZ1bmN0aW9ucy4KKwkodmFsaWRhdGVfaW1tZWRpYXRlKTogUmV0dXJuIEZBSUwgb24gZmFpbHVyZS4KKwkoc19sdG9yZyk6IE5ldyBmdW5jdGlvbi4KKwkocHNyX3JlcXVpcmVkX2hlcmUsIHBzcmZfcmVxdWlyZWRfaGVyZSk6IE5ldyBmdW5jdGlvbnMuCisJKGNwX2FkZHJlc3NfcmVxdWlyZWRfaGVyZSk6IE5ldyBwYXJhbWV0ZXIsIGZsYWcsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCisJSWYgZmxhZyBpcyBub24temVybywgcmVzdHJpY3QgdGhlIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZXMuCisJKGRvX25vcCwgZG9fbXJzLCBkb19tc3IsIGRvX211bGwpOiBOZXcgZnVuY3Rpb25zLgorCShuZWdhdGVfZGF0YV9vcCk6IE5ldyBmdW5jdGlvbi4KKwkoZGF0YV9vcDIpOiBhY2NlcHQgI3gseSBtZWFuaW5nIHggcm90YXRlZCByaWdodCBieSB5LCBidXQgb25seSB3aGVuCisJc3VpdGFibGUgY29uc3RhbnRzLiAgSWYgaW1tZWRpYXRlIGlzIG5vdCBsZWdhbCwgdHJ5IGNoYW5naW5nIHRoZQorCW9wY29kZS4KKwkoZG9fYWRyKTogTmV3IGZ1bmN0aW9uLgorCShkb19sZHN0KTogYWNjZXB0ICJsZHIgcmVnLCA9ZXhwciIuICBQdXQgZXhwciBpbiB0aGUgcG9vbCBpZiBpdCBjYW4ndAorCWJlIGRvbmUgYXMgYW4gaW1tZWRpYXRlLgorCShkb19mcF9sZHN0KTogVXNlIENQX1RfW1hZXSwgbm90IGltbWVkaWF0ZSB2YWx1ZXMuCisJKGRvX2ZwX2xkbXN0bSk6IE5ldyBmdW5jdGlvbi4KKwkoYXJtX3Bzcl9wYXJzZSk6IE5ldyBmdW5jdGlvbi4KKwkob3V0cHV0X2luc3QpOiBVc2UgSU5TTl9TSVpFIGluIGNhbGwgdG8gbWRfbnVtYmVyX3RvX2NoYXJzLgorCShtZF9hc3NlbWJsZSk6IEFkZCBoYWNrIHNvIHRoYXQgIkxhYmVsIGluc3RydWN0aW9uIiBjYXVzZXMgYWxpZ25tZW50IG9mCisJdGhlIGxhYmVsLgorCShhcm1fYWZ0ZXJfcGFzc19ob29rLCBhcm1fc3RhcnRfbGluZV9ob29rLCBhcm1fZnJvYl9zeW1ib2wpOiBOZXcKKwlmdW5jdGlvbnMuCisKK1dlZCBNYXkgMTcgMDU6MjU6MTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgXCdzIGF0IGVuZCBvZiBsaW5lcyBpbgorCXN0cmluZ3MgZm9yIG5vbi1HQ0MgY29tcGlsZXJzLgorCitUdWUgTWF5IDE2IDE5OjM2OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KKwkoZWNvZmZfZm9ybWF0X29wcyk6IFVzZSBpdC4KKwkob2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sKTogTm93IHN0YXRpYy4KKworV2VkIE1heSAxNyAwMDo1OToxMiAxOTk1ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogV2FzIGFzc3VtaW5nIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gd2FzCisJYmlnZW5kaWFuIGFuZCBoZW5jZSAxNmJpdCByZWxvY3Mgd2l0aGluZyBpbnN0cnVjdGlvbnMgd291bGQKKwlBTFdBWVMgYmUgYXQgYWRkcmVzc2VzIGkrMi1pKzMuICBJbiBMRSBtb2RlIGl0IGlzIGkrMC1pKzEuCisKK1R1ZSBNYXkgMTYgMTY6Mjk6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1tdWx0aS5oIChvYmpfZnJvYl9zeW1ib2wsIG9ial9mcm9iX2ZpbGUsIFNfR0VUX1NJWkUsCisJU19TRVRfU0laRSwgU19HRVRfQUxJR04sIFNfU0VUX0FMSUdOLCBvYmpfY29weV9zeW1ib2xfYXR0cmlidXRlcywKKwlPQkpfUFJPQ0VTU19TVEFCKTogTmV3IG1hY3Jvcy4KKwkqIGNvbmZpZy90Yy1taXBzLmM6IFByb3RlY3QgYWdhaW5zdCByZWRlZmluaW5nIHRoZW0gYWxzbyB3aGVuCisJaW5jbHVkaW5nIG9iai1lbGYuaC4gIFRlc3Qgb25seSBPQkpfRUxGIGZvciBpbmNsdWRpbmcgZWxmL21pcHMuaC4KKwkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgZnVuY3Rpb24uICBTZXQgYnl0ZV9vcmRlciBoZXJlLgorCShtZF9wYXJzZV9vcHRpb24pOiBOb3QgaGVyZS4KKwkoYnl0ZV9vcmRlcik6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcuCisJKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IERlY2xhcmUuCisJKHRjX2luaXRfYWZ0ZXJfYXJncyk6IE5ldyBtYWNyby4KKworCSogcmVhZC5jIChzX2xjb21tKTogRG8gRUxGL0VDT0ZGIHRlc3QgYXQgcnVuIHRpbWUsIG5vdCBjb21waWxlCisJdGltZS4KKworRnJpIE1heSAxMiAxNDoxNzo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJSW5pdGlhbCBzdXBwb3J0IGZvciBQRSBvYmplY3QgZmlsZXMuCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZSAoaTM4Ni0qLXBlLCBpMzg2LSotKm50KTogQWRkLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDb3BlIHdpdGggUEUgd2llcmRuZXNzLgorCSogY29uZmlnL29iai1jb2ZmLmggKFRFX1BFKTogTmV3IHRhcmdldCBmb3JtYXQuCisKK1RodSBNYXkgMTEgMTQ6NTg6MjEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1lbGYuYyAoTkVFRF9FQ09GRl9ERUJVRyk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcKKwl3YXMgZGVmaW5lZCBieSBoZWFkZXIgZmlsZXMuICBUZXN0IGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKKwlpbnN0ZWFkIG9mIEVDT0ZGX0RFQlVHR0lORy4KKwkoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogTWFrZSBlbXB0eSBpZiBORUVEX0VDT0ZGX0RFQlVHIGlzIG5vdAorCWRlZmluZWQuCisJKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2ssIGVsZl9mcm9iX3N5bWJvbCwKKwllbGZfZnJvYl9maWxlKTogT25seSBjYWxsIGVjb2ZmIHJvdXRpbmVzIGlmIE5FRURfRUNPRkZfREVCVUcgaXMKKwlkZWZpbmVkLgorCShlbGZfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KTogRGVmaW5lIG9ubHkgaWYKKwlORUVEX0VDT0ZGX0RFQlVHIGlzIGRlZmluZWQuCisJKGVsZl9mb3JtYXRfb3BzKTogUmVmZXJlbmNlIGVsZl9lY29mZl9zZXRfZXh0IG9ubHkgaWYKKwlORUVEX0VDT0ZGX0RFQlVHLgorCitXZWQgTWF5IDEwIDE4OjA5OjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChPQkpTKTogSW5jbHVkZSBAZXh0cmFfb2JqZWN0c0AuCisJKG9iai1lbGYubywgb2JqLWVjb2ZmLm8sIGUtbWlwc2VsZi5vLCBlLW1pcHNlY29mZi5vKTogTmV3IHJ1bGVzCisJZm9yIGJ1aWxkaW5nIHRoZXNlIGluZGVwZW5kZW50bHkuCisJKiBlbXVsLXRhcmdldC5oLCBjb25maWcvZS1taXBzZWxmLmMsIGNvbmZpZy9lLW1pcHNlY29mZi5jOiBOZXcKKwlmaWxlcy4KKworCSogYWNjb25maWcuaCAoREVGQVVMVF9FTVVMQVRJT04sIEVNVUxBVElPTlMsIFVTRV9FTVVMQVRJT05TLAorCU9CSl9NQVlCRV8qLCBJMzg2Q09GRiwgTTY4S0NPRkYsIE04OEtDT0ZGKTogTmV3IG1hY3Jvcy4KKwkqIGFjbG9jYWwubTQgKEdBU19VTklRKTogTmV3IG1hY3JvLgorCisJKiBhcy5jIChlbXVsYXRpb25zLCBuX2VtdWxhdGlvbnMpIFtVU0VfRU1VTEFUSU9OU106IE5ldyB2YXJpYWJsZS4KKwkoc2VsZWN0X2VtdWxhdGlvbl9tb2RlLCBkZWZhdWx0X2VtdWxfYmZkX25hbWUsIGNvbW1vbl9lbXVsX2luaXQpCisJW1VTRV9FTVVMQVRJT05TXTogTmV3IGZ1bmN0aW9ucy4KKwkobWFpbikgW1VTRV9FTVVMQVRJT05TXTogQ2FsbCBzZWxlY3RfZW11bGF0aW9uX21vZGUgYmVmb3JlIG90aGVyCisJaW5pdGlhbGl6YXRpb24uCisJKiBlbXVsLmg6IE5ldyBmaWxlLgorCSogYXMuaCBbVVNFX0VNVUxBVElPTlNdOiBJbmNsdWRlIGl0LgorCisJKiBjb25maWd1cmUuaW46IEhhbmRsZSBlbmFibGUtdGFyZ2V0cyBvcHRpb24uICBJdGVyYXRlIG92ZXIgdGFyZ2V0CisJbGlzdCwgYnVpbGRpbmcgdXAgYSBsaXN0IG9mIG9iamVjdCBmaWxlIGZvcm1hdHMgYW5kIGVtdWxhdGlvbgorCWNvbmZpZ3VyYXRpb25zLiAgKE9ubHkgc3VwcG9ydHMgZW11bGF0aW9ucyBmb3IgTUlQUyBDUFUgc28gZmFyLikKKwlJZiBtdWx0aXBsZSBmb3JtYXRzIGFyZSBuZWVkZWQsIHNldCBvYmpfZm9ybWF0IHRvIG11bHRpIGFuZCBhZGQKKwlmb3JtYXQgY29uZmlnIGZpbGVzIHRvIGV4dHJhX2ZpbGVzLiAgSWYgZW11bGF0aW9uIG1vZGVzIGFyZQorCW5lZWRlZCwgYWRkIHRoZSByZWxldmFudCBmaWxlcyB0byBleHRyYV9maWxlcy4KKworCSogY29uZmlndXJlLmluOiBEZWZpbmUgSTM4NkNPRkYsIE02OEtDT0ZGLCBNODhLQ09GRiBmb3IgdGhvc2UKKwljb25maWd1cmF0aW9ucy4KKworCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IEZpbGVuYW1lIGFyZ3VtZW50IG5vdworCXBvaW50cyB0byBjb25zdC4KKwkqIGVjb2ZmLmggKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBVcGRhdGVkIGRlY2xhcmF0aW9uLgorCisJKiBvYmouaCAob2JqX3JlYWRfYmVnaW5faG9vayk6IERvbid0IGRlY2xhcmUgZnVuY3Rpb24gaWYgaXQncworCWFscmVhZHkgYSBtYWNyby4KKworCSogcmVhZC5jIChzX3NwYWNlLCBjb25zLCBzdHJpbmdlcik6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlzCisJZGVmaW5lZCwgY2FsbCBpdCBvbiBlbnRyeS4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisJaXMgZGVmaW5lZCwgY2FsbCBpdCBvbiBlbnRyeS4gIElmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIGlzCisJZGVmaW5lZCwgY2FsbCBpdCBiZWZvcmUgcmV0dXJuaW5nIG5vcm1hbGx5LgorCisJKiByZWFkLmggKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KKworCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQWRkZWQgbmV3IGZ1bmN0aW9uIHBvaW50ZXIgZmllbGRzCisJZWNvZmZfc2V0X2V4dCwgcmVhZF9iZWdpbl9ob29rLCBzeW1ib2xfbmV3X2hvb2suCisJKGVjb2ZmX2Zvcm1hdF9vcHMsIGVsZl9mb3JtYXRfb3BzKTogRGVjbGFyZS4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zX2dldF9zaXplLCBlbGZfc19zZXRfc2l6ZSwKKwllbGZfc19nZXRfYWxpZ24sIGVsZl9zX3NldF9hbGlnbiwgZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCisJZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KKwkoZWxmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCisJKGVsZl9mcm9iX3N5bWJvbCk6IE5vdyB0YWtlcyBhZGRpdGlvbmFsIGludCogYXJndW1lbnQuCisJKiBjb25maWcvb2JqLWVsZi5oIChlbGZfZnJvYl9zeW1ib2wpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKGVsZl9wb3BfaW5zZXJ0KTogRGVjbGFyZS4KKwkob2JqX3BvcF9pbnNlcnQpOiBEZWZpbmUgdG8gY2FsbCBlbGZfcG9wX2luc2VydC4KKwkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCisJb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9ucy4KKwkoZWNvZmZfZm9ybWF0X29wcyk6IE5ldyB2YXJpYWJsZS4KKworCSogY29uZmlnL3RlLWdlbmVyaWMuaDogSWYgT0JKX0hFQURFUiBpcyBkZWZpbmVkLCB1c2UgaXQgYXMgdGhlCisJZmlsZW5hbWUgdG8gaW5jbHVkZSBpbiBwbGFjZSBvZiBvYmotZm9ybWF0LmguCisJKiBjb25maWcvdGUtbXVsdGkuaDogTmV3IGZpbGUsIGNvcGllZCBmcm9tIHRlLWdlbmVyaWMuaC4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUgaXQgdG8gIm9iai1lbGYuaCIuCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUgaXQgdG8gIm9iai1lY29mZi5oIi4KKworCSogY29uZmlnL29iai1lbGYuYyAoRUNPRkZfREVCVUdHSU5HKTogRGVmYXVsdCB0byAwLgorCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rLCBlbGZfZnJvYl9zeW1ib2wsCisJZWxmX2Zyb2JfZmlsZSk6IFRlc3QgaXQgYXQgcnVuIHRpbWUuCisJKG9ial9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpOiBEZWZpbmUKKwl1bmNvbmRpdGlvbmFsbHkuCisJKGVsZl9wc2V1ZG9fdGFibGUpOiBSZW5hbWVkIGZyb20gb2JqX3BzZXVkb190YWJsZSwgbm93IHN0YXRpYy4KKwkoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogU3BsaXQgb2ZmIGludG8gc2VwYXJhdGUgdGFibGUuICBEZWZpbmUKKwlpdCB1bmNvbmRpdGlvbmFsbHkuCisJKGVsZl9wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgorCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgorCShvYmpfcG9wX2luc2VydCk6IE5ldyBtYWNyby4KKwkob2JqX2Vjb2ZmX3NldF9leHQpIFshT0JKX01BWUJFX0VMRl06IERlZmluZSB0byBlbGZfZWNvZmZfc2V0X2V4dC4KKwkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWZpbmUgdG8gZWNvZmZfc2V0X2V4dC4KKworCSogY29uZmlnL3RjLW1pcHMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCisJKG1pcHNfcG9wX2luc2VydCk6IERlY2xhcmUuCisJKG1kX3BvcF9pbnNlcnQpOiBDYWxsIGl0LgorCisJKiBjb25maWcvdGMtbWlwcy5jOiBJZiBPQkpfTUFZQkVfRUxGIGlzIGRlZmluZWQsIGluY2x1ZGUKKwlvYmotZWxmLmgsIGJ1dCBwcmVzZXJ2ZSBPVVRQVVRfRkxBVk9SIGFuZCBwcm90ZWN0IHNvbWUgb3RoZXIKKwltYWNyb3MgZnJvbSByZWRlZmluaXRpb24uCisJKEVDT0ZGX0RFQlVHR0lORyk6IERlZmF1bHQgdG8gMC4gIEFsbCByZWZlcmVuY2VzIGNoYW5nZWQgdG8KKwlydW4tdGltZSB0ZXN0cyBvciBtYWRlIHVuY29uZGl0aW9uYWwuCisJKHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSwgc19lbGZfc2VjdGlvbik6IERlbGV0ZWQuCisJKG1kX3BzZXVkb190YWJsZSk6IERvbid0IHJlZmVyIHRvIHRoZW0uICBTcGxpdCB0YWJsZSBpbnRvIHRocmVlCisJc2VjdGlvbnMsIGZvciBNSVBTLCBub24tRUNPRkZfREVCVUdHSU5HLCBhbmQgRUxGLgorCShtaXBzX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgorCShtZF9wb3BfaW5zZXJ0KTogTmV3IG1hY3JvLgorCShtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KKwkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgbWFjcm8uCisJKG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24pOiBEZWNsYXJlLgorCShtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBtYWNybywgY2FsbHMKKwltaXBzX2VuYWJsZV9hdXRvX2FsaWduLgorCitUdWUgTWF5ICA5IDE3OjA3OjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN1cHBvcnQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KKwkqIGNvbmZpZy9wcGMtYmlnLm10OiBOZXcgZmlsZSBmb3IgYmlnIGVuZGlhbiBQb3dlclBDIHN5c3RlbXMuCisJKiBjb25maWcvcHBjLWxpdC5tdDogTmV3IGZpbGUgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzeXN0ZW1zLgorCisJKiBjb25maWcvdGMtcHBjLmggKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KKwkoVEFSR0VUX0ZPUk1BVCk6IERlYWwgd2l0aCBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gRUxGIHZhcmlhbnRzLgorCShUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZSBhcyAxLCBub3QgZW1wdHkuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JpZ19lbmRpYW4pOiBEZWxldGUgdmFyaWFibGUsIHVzZQorCXRhcmdldF9iaWdfZW5kaWFuIGluc3RlYWQuCisJKG1kX3BhcnNlX29wdGlvbik6IFBhcnNlIC1tbGl0dGxlIGFuZCAtbWxpdHRsZS1lbmRpYW4gdG8gdXNlCisJbGl0dGxlIGVuZGlhbiBzdXBwb3J0LiAgUGFyc2UgLW1iaWcgYW5kIC1tYmlnLWVuZGlhbiB0byB1c2UgYmlnCisJZW5kaWFuIHN1cHBvcnQuCisJKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUgdG8gcmVmbGVjdCBjdXJyZW50IHN3aXRjaGVzLgorCShwcGNfc2V0X2NwdSk6IFJlY29nbml6ZSBwb3dlcnBjbGUgYXMgbGl0dGxlIGVuZGlhbiBQb3dlclBDLiAgVXNlCisJYXNfZmF0YWwsIG5vdCBhYm9ydCBpZiB1bmtub3duIG1hY2hpbmUuCisKK1R1ZSBNYXkgIDkgMTA6NTg6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IENhc3QgKnZhbHAgdG8gYW4gaW50ZWdlciB3aGVuCisJY29tcGFyaW5nIGFnYWluc3Qgc2lnbmVkIHZhbHVlcy4KKwkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTWFrZSAiZGlzdGFuY2UiIGFuIGludGVnZXIuCisKK1R1ZSBNYXkgIDkgMDA6NDc6MDMgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgdHlwZS4KKwkodGhpc19mb3JtYXQpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZSBuZXcgdmFyaWFibGUsIGlmIG5vdAorCWFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgorCitNb24gTWF5ICA4IDIxOjQ0OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHN1YnNlZ3MuaCAoc2VnX2luZm8pOiBQcm92aWRlIGR1bW15IHZlcnNpb24gZm9yCisJbm9uLUJGRF9BU1NFTUJMRVIsIG5vbi1NQU5ZX1NFR01FTlRTIGNvbmZpZ3VyYXRpb24uICBJdCBzaG91bGQKKwluZXZlciBnZXQgaW52b2tlZCwgYnV0IHRoaXMgaXMgZWFzaWVyIHRoYW4gY29uZGl0aW9uYWxpemluZyBzb21lCisJb2YgdGhlIHVzZXMuCisJKHN0cnVjdCBzZWdfaW5mb190cmFzaCk6IER1bW15IHR5cGUgdXNlZCBieSBhYm92ZSB0byBtYWtlIGNvZGUKKwljb21waWxlLgorCitGcmkgTWF5ICA1IDE0OjQ3OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lIHRvIDEsIG5vdAorCWVtcHR5LgorCSogY29uZmlnL29iai1lbGYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERpdHRvLgorCSogY29uZmlnL29iai1zb20uaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERpdHRvLgorCitUaHUgTWF5ICA0IDE5OjI2OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHN0YWJzLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBBbHdheXMgZGVmaW5lLiAgSWYKKwlTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGlzbid0IHNldCwgYWJvcnQuCisJKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZhdWx0IHRvIHplcm8uCisJKGFvdXRfcHJvY2Vzc19zdGFiKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbSBzX3N0YWJfZ2VuZXJpYy4KKwkoT0JKX1BST0NFU1NfU1RBQikgW0FPVVRfU1RBQlNdOiBEZWZpbmUgdG8gY2FsbCBhb3V0X3Byb2Nlc3Nfc3RhYiwKKwlpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCShzX3N0YWJfZ2VuZXJpYyk6IFRlc3QgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBhdCBydW4gdGltZS4gIElmCisJaXQncyBub3Qgc2V0LCBhbmQgT0JKX1BST0NFU1NfU1RBQiBpc24ndCBkZWZpbmVkLCBhYm9ydC4gIEFsd2F5cworCXBhc3Mgc2l4IGFyZ3VtZW50cyB0byBPQkpfUFJPQ0VTU19TVEFCLgorCSogcmVhZC5oIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogRGVjbGFyZSB1bmNvbmRpdGlvbmFsbHkuCisJKiBjb25maWcvb2JqLWFvdXQuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KKwkqIGNvbmZpZy9vYmotYm91dC5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgorCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfUFJPQ0VTU19TVEFCKTogQWRkIG5ldyBmaXJzdCBhcmd1bWVudCwKKwlpZ25vcmVkLgorCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1BST0NFU1NfU1RBQikgW0VDT0ZGX0RFQlVHR0lOR106IERpdHRvLgorCisJKiBjb25maWcvb2JqLWVjb2ZmLmggKEVDT0ZGX0RFQlVHR0lORyk6IERlZmluZSB0byAxLCBub3QgZW1wdHkuCisJKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEaXR0by4gIFRlc3QgdmFsdWUsIG5vdAorCXdoZXRoZXIgaXQncyBkZWZpbmVkLgorCitXZWQgTWF5ICAzIDIxOjM4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGFzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIsIExPQ0FMX0xBQkVMU19GQik6IElmIG5vdCBhbHJlYWR5CisJZGVmaW5lZCwgZGVmaW5lIHRoZW0gdG8gemVyby4KKwkqIGNvbmZpZy90Yy0qLmgsIGNvbmZpZy90ZS0qLmg6IElmIGRlZmluaW5nIHRoZW0sIGRlZmluZSB0aGVtIHRvCisJYmUgMSBpbnN0ZWFkIG9mIGVtcHR5LgorCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50LCBvcGVyYW5kKTogVGVzdCB0aGVtIGF0IHJ1biB0aW1lCisJaW5zdGVhZCBvZiBjb21waWxlIHRpbWUuCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERpdHRvLgorCSogc3ltYm9scy5jIChjb2xvbik6IERpdHRvLgorCShkb2xsYXJfKiwgZGVmaW5lX2RvbGxhcl9sYWJlbCwgZmJfKik6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCisJKiBzeW1ib2xzLmggKGRvbGxhcl8qLCBkZWZpbmVfZG9sbGFyX2xhYmVsLCBmYl8qKTogRGVjbGFyZQorCXVuY29uZGl0aW9uYWxseS4KKworV2VkIE1heSAgMyAxMzowODo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG8gbm90aGluZyBmb3IgYW4gb3V0IG9mIHJhbmdlCisJUEMgcmVsYXRpdmUgY2FsbCBzaW5jZSB0aG9zZSBvbmx5IG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZSBsaW5rZXIKKwljYW4gZml4IHRoZW0gdXAuCisJKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jYXRpb25zIGZvciBvdXQgb2YgcmFuZ2UgUEMKKwlyZWxhdGl2ZSBjYWxscy4KKworVHVlIE1heSAgMiAxNjozNDo0NyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlndXJlIChocHBhKi0qLWxpdGVzKik6IEhhbmRsZSBqdXN0IGxpa2UgaHBwYSotKi0qZWxmKi4KKwkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCisKK1R1ZSBNYXkgIDIgMTE6MjI6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChwb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgorCShwb3Bfb3ZlcnJpZGVfb2ssIHBvcF90YWJsZV9uYW1lKTogTmV3IHZhcmlhYmxlcy4KKwkobWRfcG9wX2luc2VydCwgb2JqX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm9zLgorCShwb2JlZ2luKTogVXNlIHRoZW0uCisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IFVzZSBVU0VfU1REQVJHIGFuZCBVU0VfVkFSQVJHUyBpbnN0ZWFkIG9mCisJTk9fU1REQVJHICZjLgorCisJKiByZWFkLmMgKHRhcmdldF9iaWdfZW5kaWFuKTogSWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaXMKKwlkZWZpbmVkLCBpbml0aWFsaXplIHRvIDEuCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3RhcmdldF9mb3JtYXQpOiBDaGFuZ2VkIHRvIGEgZnVuY3Rpb24sCisJY2hlY2tpbmcgZmxhdm9yIGFuZCBieXRlIG9yZGVyIGF0IHJ1biB0aW1lLgorCShtZF9wYXJzZV9vcHRpb24sIGNhc2VzIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMKTogU2V0CisJdGFyZ2V0X2JpZ19lbmRpYW4gaGVyZS4KKwkobWRfYmVnaW4pOiBOb3QgaGVyZS4KKwkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IEFkanVzdCBkZWNsYXJhdGlvbi4KKwkoVEFSR0VUX0ZPUk1BVCk6IENhbGwgbWlwc190YXJnZXRfZm9ybWF0LgorCisJKiBjb25maWcvdGMtbWlwcy5oIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKTogRGVmaW5lIGluIHRlcm1zIG9mCisJT1VUUFVUX0ZMQVZPUi4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKGdfc3dpdGNoX3ZhbHVlLCBnX3N3aXRjaF9zZWVuKTogRGVmaW5lCisJdW5jb25kaXRpb25hbGx5LgorCShtZF9iZWdpbiwgbWlwc19pcCwgbWRfcGFyc2Vfb3B0aW9uLCBzX2NoYW5nZV9zZWMsIHNfb3B0aW9uLAorCXNfYWJpY2FsbHMsIG5vcGljX25lZWRfcmVsYXgpOiBDaGVjayBVU0VfR0xPQkFMX1BPSU5URVJfT1BUIGF0IHJ1bgorCXRpbWUsIGluc3RlYWQgb2YgY29tcGlsaW5nIGNvbmRpdGlvbmFsbHkgb24gR1BPUFQuCisJKEdQT1BUKTogRG9uJ3QgZGVmaW5lLgorCShtZF9zaG9ydG9wdHMpOiBBbHdheXMgaW5jbHVkZSAtRy4KKwkoUkRBVEFfU0VDVElPTl9OQU1FKTogU2VsZWN0IGF0IHJ1biB0aW1lLgorCShtZF9iZWdpbik6IFRlc3QgZm9yIEVMRiBmb3JtYXQgYXQgcnVuIHRpbWUgaW5zdGVhZCBvZiBjb21waWxlIHRpbWUuCisJKG1pcHNfaXAsIHNfY2hhbmdlX3NlYyk6IERpdHRvLgorCShtZF9wYXJzZV9vcHRpb24sIGNhc2VzIE9QVElPTl9DQUxMX1NIQVJFRCBhbmQgT1BUSU9OX05PTl9TSEFSRUQpOgorCURpdHRvLgorCShPUFRJT05fQ0FMTF9TSEFSRUQsIE9QVElPTl9OT05fU0hBUkVELCBtaXBzX3JlZ21hc2tfZnJhZyk6IERlZmluZQorCXVuY29uZGl0aW9uYWxseS4KKworVHVlIE1heSAgMiAwMDoxNzowNCAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF8qKTogTmV3IHZhcmlhYmxlcy4KKwkodGFyZy1jcHUubyk6IERlcGVuZCBvbiBvbmUsIHNlbGVjdGVkIGJ5IGF1dG9jb25mIHN1YnN0aXR1dGlvbiwKKwlpbnN0ZWFkIG9mIFRBUkdfQ1BVX0RFUEVOREVOVFMuCisJKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgJGNwdV90eXBlLCAkb2JqX2Zvcm1hdCwgJGF0b2YsIGFuZAorCSRlbXVsYXRpb24gaW50byBNYWtlZmlsZS5pbi4KKwkqIGNvbmZpZy9oODMwMC5tdDogRGVsZXRlZC4KKwkqIGNvbmZpZy9oODUwMC5tdDogRGVsZXRlZC4KKwkqIGNvbmZpZy9pMzg2Y29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCisJKiBjb25maWcvbTY4ay5tdDogRGVsZXRlZC4KKwkqIGNvbmZpZy9tNjhrY29mZi5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCisJKiBjb25maWcvbTg4a2NvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgorCSogY29uZmlnL21pcHMtYmlnLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KKwkqIGNvbmZpZy9taXBzLWxpdC5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCisJKiBjb25maWcvc2gubXQ6IERlbGV0ZWQuCisJKiBjb25maWcvdzY1Lm10OiBEZWxldGVkLgorCSogY29uZmlnL3o4ay5tdDogRGVsZXRlZC4KKworCSogY29uZmlnL3RlLWRweDIuaCAoZHB4Mik6IERlbGV0ZWQgdW51c2VkIG1hY3JvLgorCSogY29uZmlnL3RlLWdlbmVyaWMuaCAoVEVfR0VORVJJQyk6IERpdHRvLgorCSogY29uZmlnL3RlLWdvMzIuaCAoVEVfR08zMik6IERpdHRvLgorCSogY29uZmlnL3RlLWhwMzAwLmggKFRFX0hQMzAwKTogRGl0dG8uCisJKiBjb25maWcvdGUtaHBwYS5oIChQQSwgX1RFX1BBX0gpOiBEaXR0by4KKwkqIGNvbmZpZy90ZS1pYzk2MC5oIChURV9JQzk2MCk6IERpdHRvLgorCSogY29uZmlnL3RlLW5ic2Q1MzIuaCAoVEVfTkVUQlNENTMyKTogRGl0dG8uCisJKiBjb25maWcvdGUtcGM1MzJtYWNoLmggKFRFX1BDNTMyTUFDSCk6IERpdHRvLgorCSogY29uZmlnL3RlLXBwY253LmggKFRFX1BQQ05XKTogRGl0dG8uCisJKiBjb25maWcvdGUtc2NvMzg2LmggKHNjb3VuaXgpOiBEaXR0by4KKworTW9uIE1heSAgMSAxNTo1OTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBJZiBvYmpfYXBwX2ZpbGUgaXMgZGVmaW5lZCwgY2FsbCBpdCB3aXRoCisJc3RyaW5nIGFzIGFyZ3VtZW50LiAgRG9uJ3QgY2FsbCBjX2RvdF9maWxlX3N5bWJvbCBvcgorCWVsZl9maWxlX3N5bWJvbC4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUgYXMgY19kb3RfZmlsZV9zeW1ib2wuCisJKiBjb25maWcvb2JqLWVsZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUgYXMgZWxmX2ZpbGVfc3ltYm9sLgorCisJKiBhcy5oIChPVVRQVVRfRkxBVk9SKTogRG9uJ3QgZGVmaW5lIGhlcmUuCisJKiBjb25maWcvb2JqLWFvdXQuaCAoT1VUUFVUX0ZMQVZPUikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUuCisJKiBjb25maWcvb2JqLWJvdXQuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChPVVRQVVRfRkxBVk9SKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZS4KKwkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT1VUUFVUX0ZMQVZPUik6IERlZmluZS4KKwkqIGNvbmZpZy9vYmotZWxmLmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCisKK1RodSBBcHIgMjcgMjA6MDc6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBVc2Ugb25lIGluIHNyY2RpciBpZiBwcmVzZW50LgorCShSVU5URVNURkxBR1MpOiBEZWZpbmUuCisKK1dlZCBBcHIgMjYgMTU6NTQ6MTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCVN1cHBvcnQgZm9yIG1vcmUgcG9ydGFibGUgYWxpZ25tZW50IGhhbmRsaW5nIGluIGFzc2VtYmx5IGNvZGUsCisJYmFzZWQgb24gcGF0Y2hlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+OgorCSogcmVhZC5jIChwb3RhYmxlKTogQWRkZWQgYmFsaWduIGFuZCBwMmFsaWduLCBmb3IgYWxpZ25pbmcgYnkKKwlieXRlcyBvciBwb3dlcnMgb2YgdHdvIGluZGVwZW5kZW50IG9mIHdoYXQgIi5hbGlnbiIgZG9lcyBmb3IgYQorCWdpdmVuIHRhcmdldC4KKwkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGVtLgorCitUdWUgQXByIDI1IDExOjEyOjA0IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAdGhlcHViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBMb29rIGZvciBtNjhrLSotdnh3b3JrcyogcmF0aGVyIHRoYW4KKwlqdXN0IG02OGstd3JzLXZ4d29ya3Mgc28gZ2FzIGNhbiBiZSBjb25maWd1cmVkIGZvcgorCW02OGstdnh3b3JrczUuMS4KKworRnJpIEFwciAyMSAxNToxOTowNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSWYgZnhfcl90eXBlIGlzIHplcm8sIGhhbmRsZQorCWZ4X3NpemUgb2YgMSwgYW5kIGFib3J0IG9uIHVucmVjb2duaXplZCBzaXplcy4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZpeCBidWcgaW4gbGFzdCBjaGFuZ2UgcmVnYXJkaW5nCisJbm9uLWlzdmFyIGNhc2UuCisKK1N1biBBcHIgMTYgMDE6NTI6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5oIChtZF9yZWxheF90YWJsZSwgVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6CisJTWlzc2VkIHRoaXMgb25lIGluIDExIEFwciBjaGFuZ2VzLgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRml4IHR5cG8uCisKK1RodSBBcHIgMTMgMTg6MTg6MDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEluc3RlYWQgb2YgYWJvcnRpbmcgb24gbGFyZ2UKKwlkaXNwbGFjZW1lbnRzLCBwcmludCBhbiBlcnJvciBtZXNzYWdlLiAgRG9uJ3QgaW52b2tlIHRoZSBjb2RlIHRoYXQKKwlmb2xsb3dlZCB0aGUgYWJvcnQgY2FsbCB1bnRpbCBpdCdzIGJlZW4gdmVyaWZpZWQuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgNjgwNjAgdG8gbGlzdC4gIFNwbGl0IGNwdQorCWxpc3QgaW50byB0aHJlZSBsaW5lcy4KKworVGh1IEFwciAxMyAxNDozNDozNiAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KKworCSogdGMtbTY4ay5jIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFRlc3QgZm9yIG02ODM2MC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCisJKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIG02ODM2MC4KKwkqIHRjLW02OGsuaCAoVEFSR0VUX1dPUkRfU0laRSk6IERlZmluZS4KKwkoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCisKKwkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IElmIFRBUkdFVF9XT1JEX1NJWkUgaXMgZGVmaW5lZCwKKwlzaWduLWV4dGVuZCBhcHByb3ByaWF0ZWx5LgorCitUaHUgQXByIDEzIDExOjIwOjE3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFByb3Blcmx5IHVzZSBQQVJBTVMgdG8KKwloaWRlIHByb3RvdHlwZSBmcm9tIG5vbi1BTlNJIGNvbXBpbGVycywgYW5kIGRvbid0IHVzZSBBTlNJIHN5bnRheAorCWZvciBhcmd1bWVudHMuCisKK1dlZCBBcHIgMTIgMTI6MjA6MTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluIChUREVGSU5FUyk6IFB1dCBlbXB0eSBkZWZpbml0aW9uIGludG8KKwltYWtlZmlsZSBmcmFnbWVudC4KKwkqIG1wdy1tYWtlLmluICh4bWFsbG9jLmMubyk6IFJlbW92ZS4KKwkoYXMubmV3KTogRGVwZW5kIG9uIFZlcnNpb24uci4KKwkoVmVyc2lvbi5yKTogR2VuZXJhdGUgZnJvbSB2ZXJzaW9uIGluZm8uCisKKwkqIG1wdy1tYWtlLmluOiBEZWxldGUgcmVmZXJlbmNlcyB0byBoZXgtdmFsdWUuYy4KKworCSogbXB3LWNvbmZpZy5pbjogQWRkIG1hcHBpbmcgZnJvbSBjb25maWdzIHRvIG9iamVjdCBmaWxlIGZvcm1hdHMsCisJZ2V0IFZFUlNJT04gZnJvbSBNYWtlZmlsZS5pbiBhbmQgYWRkIHRvIG1rLnRtcC4KKwkobWlwcy1pZHQtZWNvZmYpIFtUREVGSU5FU106IEFkZCBUQVJHRVRfQllURVNfQklHX0VORElBTi4KKwkqIG1wdy1tYWtlLmluIChWRVJTSU9OLCBnQyk6IERvbid0IGRlZmluZS4KKwkoQUxMX0NGTEFHUyk6IFJlbW92ZSAtZCBmbGFncy4KKwkoY29uZmlnLmgpOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBNUFcsIGFkZCBIQVZFX1NUREFSR19ILAorCUJGRF9BU1NFTUJMRVIuCisKKwkqIG1wdy1tYWtlLmluIChBTExfQ0ZMQUdTKTogQWRkIGRlZmluaXRpb24gb2YgSEFWRV9TVERBUkdfSCwKKwlpbmNsdWRlIG9mIDo6bGliaWJlcnR5Oi4KKwkoY29uZmlnLmgpOiBJZmRlZiBjb250ZW50cyBvbiBHQVNfVkVSU0lPTi4KKworCSogbXB3LW1ha2UuaW4gKGFzLmMpOiBDb21waWxlIHdpdGggQyBub3QgZ0MuCisJKGNvbmZpZy1zdGFtcCk6IFRvdWNoIGNvcnJlY3RseS4KKwkoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbCk6IERlcGVuZCBvbiBhbGwgYW5kIGluc3RhbGwtb25seS4KKworCSogbXB3LWNvbmZpZy5pbjogUGFyc2UgdGFyZ2V0IGFuZCB1c2UgdG8gZ2VuZXJhdGUgZm9yd2FyZCBpbmNsdWRlcworCXRvIHRjLSwgb2JqLSwgYW5kIGF0b2YtIGZpbGVzLCB1c2UgdGUtZ2VuZXJpYy5oIGZvciBlbXVsYXRpb24uCisJKiBtcHctbWFrZS5pbiAoVkVSU0lPTik6IERlZmluZS4KKwkoYXMuYyk6IENvbXBpbGUgd2l0aCBHQ0MuCisJKFRBUkdfT0JKRUNUUywgQ0xJQlMpOiBEZWZpbmUuCisJKGFzLm5ldyk6IFVzZSBMREZMQUdTLCBUQVJHX09CSkVDVFMsIENMSUJTIGFuZCBFWFRSQUxJQlMgaW4gbGluaworCWNvbW1hbmQuCisJKGNvbmZpZy5oLCBjb25maWctc3RhbXApOiBCdWlsZC4KKworCSogbXB3LW1ha2UuaW4gKEMsIENGTEFHUyk6IFJlbW92ZWQgZGVmaW5pdGlvbnMuCisJKEFMTF9DRkxBR1MpOiBEZWZpbmUuCisJU2V0IGRlZmF1bHQgcnVsZSB0byB1c2Uge0NDfSBpbnN0ZWFkIG9mIHtDfS4KKworCSogbXB3LW1ha2UuaW4gKGluc3RhbGwpOiBNb3ZlZCBoZXJlIGZyb20gbXB3LWJ1aWxkLmluLgorCSogbXB3LWJ1aWxkLmluOiBSZW1vdmVkLCBmdW5jdGlvbmFsaXR5IGluIG1wdy1tYWtlLmluCisKKwkqIG1wdy1tYWtlLmluIChDRkxBR1MpOiBBZGQgbW9yZSBpbmNsdWRlIHBhdGhzLgorCisJKiBtcHctY29uZmlnLmluICh2YXJhcmdzLmgsIHN5cy8qLmgpOiBEb24ndCBjcmVhdGUgd2hlbgorCWNvbmZpZ3VyaW5nLgorCSogbXB3LW1ha2UuaW4gKENGTEFHUyk6IEFkZCAtdyBmbGFnLgorCisJKiBtcHctbWFrZS5pbjogUmVwbGFjZSA4LWJpdCBjaGFycyB3aXRoIHRoZWlyIG5hbWVzLgorCisJKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgorCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KKworVHVlIEFwciAxMSAwMTo0MjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXQgbGVhc3QgYXV0b2NvbmYgMi4zLCBiZWNhdXNlIGVhcmxpZXIKKwl2ZXJzaW9ucyBsb3NlIG9uIHNvbWUgQUlYIHZlcnNpb25zLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogY29uZmlndXJlLmluOiBBZGQgbTY4ay0qLWVsZi4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpIFtPQkpfRUxGXTogSW5jbHVkZSAnIycuCisJKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBJZ25vcmUgInN3YmVnIi4KKwkobWRfYmVnaW4pOiBTZXQgYWx0X25vdGVuZF90YWJsZVsnJiddLCBzbyBzdnI0LXN0eWxlIGltbWVkaWF0ZQorCW9wZXJhbmRzIGFyZSBhY2NlcHRlZC4KKwkobWRfYXBwbHlfZml4KTogQXJndW1lbnQgVkFMUCBzaG91bGQgcG9pbnQgdG8gdmFsdWVULgorCShtZF9jb252ZXJ0X2ZyYWcpOiBBcmd1bWVudCBTRUMgc2hvdWxkIGJlIHR5cGUgc2VnVC4KKwkobWRfc2hvcnRvcHRzKSBbT0JKX0VMRl06IEFjY2VwdCAnUScgd2l0aCBhbiBhcmd1bWVudC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSWdub3JlIGl0LgorCShtZF9jb252ZXJ0X2ZyYWdfMSk6IEFkZCBpbiBmcmFnIGFkZHJlc3MgZm9yIHRoZSBzeW1ib2wgaW4gdGhlCisJZGlzcGxhY2VtZW50IGNhbGN1bGF0aW9uLgorCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9FTEZdOiBVc2UgImVsZjMyLW02OGsiLgorCShUQVJHRVRfQVJDSCk6IERlZmluZS4KKwkoUkVHSVNURVJfUFJFRklYX09QVElPTkFMKSBbT0JKX0VMRl06IERlZmF1bHQgdG8gMC4KKwkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSwgUkVHSVNURVJfUFJFRklYX09QVElPTkFMKTogSGFuZGxlCisJdGhlc2UgdGhlIHNhbWUgd2F5IGZvciBPQkpfRUxGIGFzIGZvciBNNjhLQ09GRi4KKworCSogZ2RiaW5pdC5pbjogQWRkIGJyZWFrcG9pbnQgaW4gYXNfYWJvcnQuCisKKwkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBJZiBvZmZzZXQgaXMgbGVzcyB0aGFuIHplcm8sCisJY29tcGxhaW4gYWJvdXQgaXQgc3BlY2lmaWNhbGx5LCBpbnN0ZWFkIG9mIHJlcG9ydGluZyBhbiBhc3NlcnRpb24KKwlmYWlsdXJlLgorCShyZWxheF9zZWdtZW50KTogQ29tcGxhaW4gYWJvdXQgLm9yZyBiYWNrd2FyZHMsIHRoZW4gaWdub3JlIGl0LgorCURvIGdlbmVyaWMgcnNfbWFjaGluZV9kZXBlbmRlbnQgcmVsYXhhdGlvbiBvbmx5IGlmCisJVENfR0VORVJJQ19SRUxBWF9UQUJMRSBpcyBkZWZpbmVkLCBhbmQgdXNlIGl0cyB2YWx1ZSBmb3IgdGhlIGJhc2UKKwlvZiB0aGUgdGFibGUuCisJKiB0Yy5oIChtZF9yZWxheF90YWJsZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KKwkqIGFzLmggKHN0cnVjdCByZWxheF90eXBlKTogQWRkIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHR5cGUuCisJKiBjb25maWcvdGMtYTI5ay5jOiBEZWxldGVkIG1kX3JlbGF4X3RhYmxlLgorCSogY29uZmlnL3RjLXthbHBoYSxhcm0saDgzMDAsaHBwYSxpODYwLG04OGssbWlwcyxwcGMsc3BhcmMsejhrfS5jOgorCURpdHRvLgorCSogY29uZmlnL3RjLXtoODUwMCxpMzg2LGk5NjAsbnMzMmssc2gsdGFob2UsdmF4LHc2NX0uaDogRGVjbGFyZQorCW1kX3JlbGF4X3RhYmxlIGhlcmUsIGFuZCBkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSB0byBleHBhbmQKKwl0byBtZF9yZWxheF90YWJsZS4KKwkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9yZWxheF90YWJsZSk6IE5vIGxvbmdlciBjb25zdC4KKwkqIGNvbmZpZy90Yy13NjUuYyAobWRfcmVsYXhfdGFibGUpOiBEaXR0by4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG9ydF9qdW1wX3NpemUsIG1kX2xvbmdfanVtcF9zaXplKToKKwlEZWxldGVkLgorCSogZG9jL2ludGVybmFscy50ZXhpOiBEZXNjcmliZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGFuZAorCVdPUktJTkdfRE9UX1dPUkQuICBNZW50aW9uIG1kXypfanVtcF9zaXplIChidXQgZGVzY3JpcHRpb24gbmVlZHMKKwl0byBiZSBmbGVzaGVkIG91dCBsYXRlcikuICBOb3RlIG02OGsgUENJTkRFWCBtb2RlIGhhcyBiZWVuIGNoZWNrZWQKKwlpbi4KKworTW9uIEFwciAxMCAxNTo1Nzo0MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChub3BpY19uZWVkX3JlbGF4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQKKwlvdXQgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4KKwkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBDYWxsIGl0LgorCShsb2FkX2FkZHJlc3MsIG1hY3JvKTogSW4gTk9fUElDIGJyYW5jaGVzLCBpZiBub3BpY19uZWVkX3JlbGF4CisJcmV0dXJucyBub256ZXJvLCBkb24ndCBhdHRlbXB0IEdQIG9wdGltaXphdGlvbi4KKworCSogY29uZmlnL3RjLW02OGsuYyAoUENJTkRFWCk6IE5ldyBtYWNyby4KKwkobWRfcmVsYXhfdGFibGUpOiBObyBsb25nZXIgY29uc3QuICBBZGQgUENJTkRFWCBlbnRyaWVzLgorCShtNjhrX2lwKTogRm9yIEFJTkRYIHdpdGggc2ltcGxlIHN5bWJvbCBvcGVyYW5kLCBnZW5lcmF0ZSBhCisJUENJTkRFWCBmcmFnIGlmIFBDIGlzIHVzZWQsIG9yIGRvIG5vcm1hbCBub24tQUlORFggcHJvY2Vzc2luZyBmb3IKKwlhZGRyZXNzIHJlZ2lzdGVyLgorCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IElmIGNwdSBpcyA2ODAwMCBvciA2ODAxMCwgZml4CisJbWRfcmVsYXhfdGFibGUgdG8gcHJldmVudCByZWxheGF0aW9uIG9mIFBDSU5ERVgvQllURSBtb2RlIHRvCisJU0hPUlQsIHNpbmNlIHRoZXkgZG9uJ3Qgc3VwcG9ydCB0aGF0IG1vZGUuCisJKG1kX2NvbnZlcnRfZnJhZ18xLCBjYXNlIFBDTEVBL0xPTkcpOiBBZGQgNCB0byBvZmZzZXQsIG5vdCAyLiAgQWRkCisJc3VwcG9ydCBmb3IgbmV3IFBDSU5ERVggbW9kZXMuCisJKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogUHJvY2VzcyBQQ0lOREVYL1NaX1VOREVGIG1vZGUuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZ18xLCBjYXNlIFBDTEVBL1NIT1JUKTogQWRkIDIgdG8KKwlvZmZzZXQuCisJKG02OGtfaXAsIGNhc2UgbW9zdCBwdW5jdHVhdGlvbi9BT0ZGKTogSWYgdXNpbmcgUEMsIGNhbGwgYWRkX2ZyYWcKKwl1c2luZyBQQ0xFQS4KKworCSogY29uZmlnL3RjLW02OGsuYzogRG9uJ3QgZXhwbGljaXRseSBpbmNsdWRlIGNvbmZpZy5oLiAgRGVsZXRlZCBhCisJYnVuY2ggb2YgIiNpZiAwIiBjb2RlIGFuZCB1c2VsZXNzIGNvbW1lbnRzLgorCShzdHJ1Y3QgbTY4a19jcHUpOiBOZXcgdHlwZS4KKwkoYXJjaHMsIG5fYXJjaHMpOiBOZXcgdmFyaWFibGVzLCB3aXRoIHNpbmdsZSBsaXN0IG9mIG5hbWUvZW51bQorCW1hcHBpbmcgYW5kIGFsaWFzZXMuCisJKG02OGtfaXApOiBEZWxldGUgdGhlIHRhYmxlIGhlcmUuCisJKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIHRoZSBuZXcgdGFibGUgaGVyZSBpbnN0ZWFkIG9mCisJb3Blbi1jb2RpbmcgaXQuCisJKG1kX3BhcnNlX29wdGlvbiwgY2FzZSAnbScpOiBEaXR0by4KKworCSogZG9jL01ha2VmaWxlLmluIChNYWtlZmlsZSk6IEZpeCBydWxlIGZvciBydW5uaW5nIGNvbmZpZy5zdGF0dXMuCisJKGludGVybmFscy5kdmksIGludGVybmFscy5wcywgaW50ZXJuYWxzLnBzNCk6IE5ldyB0YXJnZXRzLCBub3QKKwlidWlsdCBieSBkZWZhdWx0LgorCisJKiBkb2MvaW50ZXJuYWxzLnRleGk6IEFkZCBsb3VkIGRpc2NsYWltZXIuICBSZWZpbGwgdG8gNzkgY29sdW1ucywKKwlzcGVjaWZ5IGZpbGwtY29sdW1uIGluIGxvY2FsLXZhcmlhYmxlcyBzZWN0aW9uLiAgQ2hhbmdlCisJc3ViaGVhZGluZ3MgdG8gc3Vic2VjdGlvbnMgc28gdGhleSBjYW4gYmUgY3Jvc3MtcmVmZXJlbmNlZC4KKwlEZXNjcmliZSBicm9rZW4gd29yZHMsIGZyYWdzLCBmcmFnIGNoYWlucywgZ2VuZXJpYyByZWxheGF0aW9uLAorCXJlbGF4IHRhYmxlLCBtNjhrIHJlbGF4YXRpb24sIG02OGsgYWRkcmVzc2luZyBtb2RlcywgdGVzdCBzdWl0ZQorCWNvZGUuICBBZGQgYSBmZXcgd29yZHMgYWJvdXQgdmFyaW91cyBmaWxlIGZvcm1hdHMuCisKKwkqIGRvYy9hcy50ZXhpbmZvIChtNjhrKTogUmVjb21tZW5kIHVzaW5nIGAlJyB3aXRoIHJlZ2lzdGVycyBhcyB0aGUKKwlub3JtYWwgY2FzZSwgaW5zdGVhZCBvZiB0aGUgZXhjZXB0aW9uYWwgY2FzZS4KKworVGh1IE1hciAzMCAxNDozODo0NyAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKKwlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGRlZmF1bHRzIHRvIGEub3V0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitXZWQgTWFyIDI5IDE3OjE2OjMwIDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IENhc3QgbmVnYXRpdmUgb2Zmc2V0cyB0byBvZmZzZXRUCisJKGZvciBob3N0aW5nIG9uIDY0IGJpdCBtYWNoaW5lcykuCisKK1R1ZSBNYXIgMjEgMTY6NTM6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtbWlwczQgYW5kIC1tNDY1MC4KKworRnJpIE1hciAxNyAxNjo0NzoxMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQWRkIFBST0dSRVNTIG1hY3Jvcy4KKworRnJpIE1hciAxNyAxMjo0MDozNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IE1ha2Ugc3VyZSB0byBhbHdheXMgcmVzZXQgdGhlIGZyYWcKKwlhbmQgc2VjdGlvbiBmb3IgY29tbW9uIHN5bWJvbHMuCisKK1RodSBNYXIgMTYgMTc6MjY6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyBub24gUEMgcmVsYXRpdmUKKwlwb2ludGVycyBpbiB0aGUgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbiBhbHNvIHdoZW4gdXNpbmcgdGhlCisJLW1yZWxvY2F0YWJsZSBvcHRpb24uCisJKG1kX3BhcnNlX29wdGlvbik6IFN1cHBvcnQgLW00MDMgYXMgYSBQb3dlclBDIGNvbXB1dGVyLgorCShtZF9zaG93X3VzYWdlKTogRGl0dG8uCisKK1dlZCBNYXIgMTUgMTQ6NDU6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IFRoZSBjdXJfc2NvcGUgZmllbGQgb2YgYSBmaWxfcHRyCisJbWF5IGJlIE5VTEwgd2hlbiBnaXZlbiBzdHJhbmdlIGlucHV0LiAgRG9uJ3QgY29yZSBkdW1wLgorCitUdWUgTWFyIDE0IDIxOjM2OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IERvbid0IHVzZSBhZGRpdSBmb3IgZGxpIG9mIGFuCisJdW5zaWduZWQgc2VlbWluZ2x5IG5lZ2F0aXZlIG51bWJlci4gIERvbid0IGJvdGhlciBzaGlmdGluZyBhIHplcm8KKwl2YWx1ZS4KKwkobWlwc19pcCk6IEZvciBjYXNlICdqJywgaWYgdGhlcmUgYXJlIG1vcmUgYWx0ZXJuYXRpdmVzLCBhbmQgdGhlCisJSVNBIGxldmVsIGlzIGF0IGxlYXN0IDMsIGRvbid0IGFjY2VwdCBhbiB1bnNpZ25lZCBzZWVtaW5nbHkKKwluZWdhdGl2ZSBudW1iZXIuCisKK1R1ZSBNYXIgMTQgMTk6MTY6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChzX2FwcF9saW5lKTogRml4IGxhc3QgcGF0Y2ggdG8gZGVhbCB3aXRoIGEgbGluZSBudW1iZXIKKwlvZiAxLgorCitUdWUgTWFyIDE0IDE3OjAwOjU3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFVzZSBhc193YXJuX3doZXJlLCBub3QKKwlhc19iYWRfd2hlcmUgdG8gZ2l2ZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBlcnJvci4KKworTW9uIE1hciAxMyAxNzowMzo0NiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6ICBpc3N1ZSBhIHdhcm5pbmcgaWYgYSBjb25zdGFudAorCWlzIHVzZWQgYXMgYW4gb3BlcmFuZCB3aGVyZSBhbiBpbW1lZGlhdGUgdmFsdWUgaXMgbm90IGFsbG93ZWQuCisKK0ZyaSBNYXIgMTAgMTk6MjE6MTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmM6IFJlZG8gbXkgMTAgSmFuIGNoYW5nZSwgYnV0IGdldCBpdCByaWdodCB0aGlzCisJdGltZS4gOi0pCisJKGZpeHVwX3NlZ21lbnQpOiBJZiBsaW5rcmVsYXggaXMgc2V0LCBqdXN0IHJldHVybi4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrIHNwZWNpYWxseSB3aXRoCisJcmVnYXJkIHRvIGZpeHVwcy4KKwkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9iZWdpbik6IFNldCBsaW5rcmVsYXguCisJKiBjb25maWcvdGMtejhrLmMgKG1kX2JlZ2luKTogRGl0dG8uCisKK1RodSBNYXIgIDkgMTg6MDE6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9oZWFkZXJfYXBwZW5kKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0LgorCitUaHUgTWFyICA5IDEzOjUxOjMwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwlEZWxldGUgdGhpcyBwYXRjaCwgaXQgYnJlYWtzIHRoZSBoODMwMCBhc3NlbWJsZXIuCisJVHVlIEphbiAxMCAxMzozNDoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4aworCXNwZWNpYWxseSB3aXRoIHJlZ2FyZCB0byBmaXh1cHMuCisKK1RodSBNYXIgIDkgMTI6Mjg6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1yZWxvY2F0YWJsZSk6IENoYW5nZSB0eXBlIHRvIGJvb2xlYW4uCisJKG1kX2JlZ2luKTogU2V0IHRoZSBFRl9QUENfUkVMT0NBVEFCTEUgaWYgLW1yZWxvY2F0YWJsZS4KKworV2VkIE1hciAgOCAxNTozOTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ2hlY2sgZm9yIGEgY3B1IHN0cmluZyBvZiByODAwMCBvcgorCXIxMDAwMC4gIElmIG1pcHNfaXNhIGlzIDQsIHNldCB0aGUgbWFjaGluZSBudW1iZXIgdG8gODAwMC4KKwkoYXBwZW5kX2luc24pOiBJZiBtaXBzX2lzYSBpcyBhdCBsZWFzdCA0LCBkb24ndCBnZW5lcmF0ZSBub3BzIGZvcgorCWNvcHJvY2Vzc29yIGRlbGF5cy4gIENoZWNrIElOU05fUkVBRF9GUFJfUiB3aGVuIHNldHRpbmcKKwltaXBzX2Nwcm1hc2tbMV0uCisJKG1pcHNfZW1pdF9kZWxheXMpOiBJZiBtaXBzX2lzYSBpcyBhdCBsZWFzdCA0LCBkb24ndCBnZW5lcmF0ZSBub3BzCisJZm9yIGNvcHJvY2Vzc29yIGRlbGF5cy4KKwkobWlwc19pcCk6IENoZWNrIGZvciBJTlNOX0lTQTQgaW5zdHJ1Y3Rpb25zLiAgSGFuZGxlIG5ldyBhcmd1bWVudAorCXR5cGVzICdoJywgJ1InLCAnTicsIGFuZCAnTScuCisJKG1kX2xvbmdvcHRzKTogQWNjZXB0ICJtaXBzNCIuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtbWlwczQsIGFuZCAtbWNwdT0xMDAwMCBhbmQgLW1jcHU9ODAwMC4KKwkoc19taXBzc2V0KTogUGVybWl0IC5zZXQgbWlwczQuCisKK1dlZCBNYXIgIDggMDk6MzY6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgLnN0YWIgc2VjdGlvbnMgdG8KKwloYXZlIG5vbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aXRoIC1tcmVsb2NhdGFibGUuCisKK1dlZCBNYXIgIDggMDI6NTc6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAob3Bjb2RlX3B0cik6IFJldHVybiBwb2ludGVyIHRvIGNvbnN0LgorCShtZF9iZWdpbik6IE1ha2UgaGFzaCB0YWJsZSBlcnJvcnMgZmF0YWwuICBQcm9jZXNzIG9wY29kZSBhbGlhc2VzCisJYWZ0ZXIgbWFpbiBvcGNvZGUgdGFibGUuCisJKG1kX2FwcGx5X2ZpeF8yLCBjYXNlIDQpOiBSZWNvZGUgc2V0dGluZyBvZiBsb3dlcl9saW1pdCB0byBhdm9pZAorCWdjYyB3YXJuaW5nLgorCitUdWUgTWFyICA3IDE2OjA3OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL2FzLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uIGZvciBTUEFSQyBWOSwgZnJvbSBEb3VnIEV2YW5zCisJPGRqZUBjeWdudXMuY29tPi4KKworTW9uIE1hciAgNiAwOTo1ODozNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIGFsbCBvY2N1cmVuY2VzIG9mIHBhLTg5IHdpdGggcGEtMTEgdG8KKwliZSBjb25zaXN0ZW50IHdpdGggY3VycmVudCBuYW1pbmcgY29udmVudGlvbnMuCisJKG1kX2JlZ2luKTogU2V0IGEgZGVmYXVsdCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZS4KKwkocGFfaXApOiBJZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBzcGVjaWZpZXMgYSBuZXdlciBtYWNoaW5lIHR5cGUKKwl0aGFuIHRoZSBjdXJyZW50IG1hY2hpbmUgdHlwZSwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgbWFjaGluZQorCXR5cGUuCisJKG5lZWRfcGExMV9vcGNvZGUpOiBMaWtld2lzZS4KKworU3VuIE1hciAgNSAxOTozODowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ3onKTogRG9uJ3QgbG9zZSBhcmd1bWVudAorCXJlbG9jYXRpb24gYml0cyBmb3IgYWJzb2x1dGUgY2FsbHMuCisKK0ZyaSBNYXIgIDMgMTc6NDE6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWg4MzAwLiogKG1kX29wZXJhbmQpOiBDaGFuZ2UgZW1wdHkgZnVuY3Rpb24gdG8gZW1wdHkKKwltYWNyby4KKworCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzKTogTWFrZSBIOC8zMDAtSCB3YXJuaW5nIG1lc3NhZ2UKKwljbGVhcmVyLgorCisJKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IElmIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBmYWlscywKKwlwcmludCBhIG1lc3NhZ2UgYW5kIGV4aXQsIGluc3RlYWQgb2YgYWJvcnRpbmcuCisKK0ZyaSBNYXIgIDMgMTY6MjY6MTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiB0Yy5oIChtZF9hcHBseV9maXgzKTogSWYgTURfQVBQTFlfRklYMyBpcyBkZWZpbmVkLCBkZWNsYXJlCisJbWRfYXBwbHlfZml4My4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IElmIE1EX0FQUExZX0ZJWDMgaXMgZGVmaW5lZCwgY2FsbAorCW1kX2FwcGx5X2ZpeDMgd2l0aCB0aGUgbm9ybWFsIDIgYXJndW1lbnRzIGFuZCB0aGUgY3VycmVudCBzZWdtZW50CisJcG9pbnRlciBpbnN0ZWFkIG9mIG1kX2FwcGx5X2ZpeC4KKworCSogY29uZmlnL3RjLXBwYy5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogV2FybiBpZiAtbXJlbG9jYXRhYmxlCisJYW5kIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdGhhdCBpc24ndCBpbiB0aGUgLmdvdDIgc2VnbWVudAorCXdhcyBwZXJmb3JtZWQuCisJKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXggYW5kIHRha2Ugc2VnbWVudCBwb2ludGVyCisJYXMgdGhpcmQgYXJndW1lbnQuICBJZiBFTEYgb2JqZWN0IGZvcm1hdCwgY2FsbCBwcGNfZWxmX3ZhbGlkYXRlX2ZpeAorCWZvciBub3JtYWwgcmVsb2NhdGlvbnMuCisJKG1kX3BhcnNlX29wdGlvbik6IElmIEVMRiBvYmplY3QgZm9ybWF0LCByZWNvZ25pemUgdGhlCisJLW1yZWxvY2F0YWJsZSBzd2l0Y2guCisKK1RodSBNYXIgIDIgMTY6MzQ6NDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIGFzIDEwMCwgbm90IDAuCisKK1R1ZSBGZWIgMjggMTg6Mjk6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jLCBjb25maWcvdGMtYXJtLmggKG1kX29wZXJhbmQpOiBSZXBsYWNlZCBlbXB0eQorCWZ1bmN0aW9uIGluIC5jIGZpbGUgd2l0aCBlbXB0eSBtYWNybyBpbiAuaCBmaWxlLgorCSogY29uZmlnL3RjLWg4NTAwLiosIGNvbmZpZy90Yy1ocHBhLiosIGNvbmZpZy90Yy1pMzg2LiosCisJY29uZmlnL3RjLWk4NjAuKiwgY29uZmlnL3RjLWk5NjAuKiwgY29uZmlnL3RjLW5zMzJrLiosCisJY29uZmlnL3RjLXBwYy4qLCBjb25maWcvdGMtc2guKiwgY29uZmlnL3RjLXNwYXJjLiosCisJY29uZmlnL3RjLXRhaG9lLiosIGNvbmZpZy90Yy12YXguKiwgY29uZmlnL3RjLXc2NS4qLAorCWNvbmZpZy90Yy16OGsuKjogRGl0dG8uCisJKiBjb25maWcvdGMtbTY4ay4qOiBEaXR0by4KKworCSogY29uZmlnL3RjLW02OGsuYyAobW90ZV9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRvdHMgZnJvbSBvcGNvZGUKKwluYW1lcy4KKworCSogcmVhZC5jIChzX2FwcF9saW5lKTogSWdub3JlIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCisKK1R1ZSBGZWIgMjggMTU6MzQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFBMVCBvcgorCUdPVCByZWxvY3MgZWl0aGVyLgorCitNb24gRmViIDI3IDEzOjAzOjQxIDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGEyOWstKi12eHdvcmtzIGNvbmZpZ3VyYXRpb24uCisKK0ZyaSBGZWIgMjQgMTQ6NDE6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogVGFrZSBkYmwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lCisJaGFuZGxpbmcgb2Ygc2lnbmVkIDMyIGJpdCB2YWx1ZXMgaW4gNjQgYml0IG1vZGVzLiAgQ2hhbmdlIGFsbAorCWNhbGxlcnMuCisJKG1hY3JvKTogSGFuZGxlIE1fRExJIGFuZCBNX0RMQV9BQi4KKworV2VkIEZlYiAyMiAyMzoxMDo1NiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG9uJ3Qgc3VidHJhY3QgdGhlIHZhbHVlIG9mIHRoZQorCWFkZCBzeW1ib2wgaWYgaXQncyBhIGNvbW1vbiBzeW1ib2wgKHRoZSB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wKKwlpcyBpdHMgc2l6ZSwgbm90IGEgdmFsdWUgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlKS4KKworV2VkIEZlYiAyMiAyMToxMjoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogSWYgbGlzdGluZ19wcmV2X2xpbmUgaXMgY2FsbGVkLAorCWNhbGwgZnJhZ19ncm93IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBzdGlsbCByb29tIGZvciBhIHZhcmlhbnQuCisKK0ZyaSBGZWIgMTcgMTQ6NTA6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgMmJ5dGUsIDRieXRlIGFuZCA4Ynl0ZQorCWlmIE9CSl9FTEYuICBGcm9tIGdhcnlASW50cmVwaWQuQ09NIChHYXJ5IEZ1bmNrKS4KKworCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogV2FybiBpZiBhIHN5bWJvbCBpcyBib3RoCisJd2VhayBhbmQgY29tbW9uLgorCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogTGlrZXdpc2UuCisKK0ZyaSBGZWIgMTcgMTI6NDM6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IERvbid0IHJlZGVmaW5lIGJ5dGUgdW5kZXIKKwlFTEYuCisJKHBwY19lbGZfY29ucyk6IERvbid0IHN1cHBvcnQgQHBjcmVsIGFueSBtb3JlLCBzaW5jZSBESUZGX0VYUFJfT0sKKwlhbGxvd3MgdGhlIG5vcm1hbCBleHByZXNzaW9ucyB0byBnZW5lcmF0ZSBpdC4KKwkobWRfYXBwbHlfZml4KTogQ29udmVydCBCRkRfUkVMT0NfMzIgd2l0aCBwY3JlbCBiaXQgc2V0IGludG8KKwlCRkRfUkVMT0NfMzJfUENSRUwuICBBYm9ydCBpZiBlaXRoZXIgQkZEX1JFTE9DXzE2IG9yIEJGRF9SRUxPQ184CisJbmVlZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KKworCSogY29uZmlnL3RjLXBwYy5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUgdG8gYWxsb3cgUEMgcmVsYXRpdmUKKwlleHByZXNzaW9ucyB0byBiZSBoYW5kbGVkLgorCitUaHUgRmViIDE2IDE0OjMwOjEzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY3lnbnVzLmNvbT4KKworCSogZXhwci5jIChvcGVyYW5kKTogTW92ZSBtZF9vcGVyYW5kIGhhbmRsaW5nIHRvIGRlZmF1bHQgY2FzZQorCShzbyBpdCB3b3JrcykuCisKK1dlZCBGZWIgMTUgMTY6MDg6NDcgMTk5NSAgSmFzb24gTW9sZW5kYSAgPGNyYXNoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1oODUwMC5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgaWdub3JlZAorCXBhcmFtZXRlciwgdG8gbWF0Y2ggcHJvdG90eXBlLgorCitXZWQgRmViIDE1IDE1OjA3OjAwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBFTEYsIGdvIHRvIHBwY19lbGZfY29ucworCWluc3RlYWQgb2YgY29ucy4KKwkobWRfc2hvd191c2FnZSk6IFNob3cgYWxsIG9mIHRoZSBQb3dlclBjIG9wdGlvbnMuCisJKHBwY19lbGZfc3VmZml4KTogTmV3IGZ1bmN0aW9uIHRvIHJlY29nbml6ZSBFTEYgc3VmZml4ZXMgdGhhdAorCXNwZWNpZnkgYSByZWxvY2F0aW9uLCBzdWNoIGFzIEBHT1QuCisJKHBwY19lbGZfY29ucyk6IFJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgY29ucyBmdW5jdGlvbiB0aGF0CisJa25vd3MgYWJvdXQgdGhlIEVMRiBzdWZmaXhlcy4KKwkocHBjX2ZpeHVwKTogQWRkIHJlbG9jIGZpZWxkIHRvIGhvbGQgbm9uLXN0YW5kYXJkIHJlbG9jYXRpb24uCisJKG1kX2Fzc2VtYmxlKTogSGFuZGxlIEVMRiBzdWZmaXhlcyBsaWtlIEBHT1QuCisJKG1kX2NyZWF0ZV9zaG9ydF9qdW1wKTogRHVtbXkgaW4gY2FzZSBXT1JLSU5HX0RPVF9XT1JEIGlzIG5vdAorCWRlZmluZWQuCisJKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KKwkobWRfc2hvcnRfanVtcF9zaXplKTogRGl0dG8uCisJKG1kX2xvbmdfanVtcF9zaXplKTogRGl0dG8uCisJKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMzJfUENSRUwsIEJGRF9SRUxPQ19MTzE2LAorCUJGRF9SRUxPQ19ISTE2LCBCRkRfUkVMT0NfSEkxNl9TLCBCRkRfUkVMT0NfUFBDX1RPQzE2LCBhbmQKKwlCRkRfUkVMT0NfMTYgcmVsb2NhdGlvbnMuICBJZiByZWxvY2F0aW9uIGNhbiBub3QgYmUgZm91bmQsIHByaW50CisJdGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHJlbG9jYXRpb24uCisKK1dlZCBGZWIgMTUgMTE6NDY6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBBY2NlcHQgQkZEX1JFTE9DXzE2LCBmb3IKKwlEV0FSRi4gIEZyb20gZ2FyeUBJbnRyZXBpZC5DT00gKEdhcnkgRnVuY2spLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBNX1V7TCxTfURbX0FdICh1bmFsaWduZWQgZG91YmxlCisJbG9hZHMgYW5kIHN0b3JlcykuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEbyBhZGp1c3QgZ2xvYmFsCisJc3ltYm9scyBpZiBPQkpfQU9VVC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBEb24ndCB1c2UgdGhlIHRhcmdldCByZWdpc3RlciBhcyBhCisJYmFzZSByZWdpc3RlciB3aGVuIGJ1aWxkaW5nIHRoZSBhZGRyZXNzIGZvciBNX0x7VyxEfXtMLFJ9X0FCLgorCitNb24gRmViIDEzIDE0OjQ0OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoS1QwLCBLVDEpOiBEZWZpbmUuCisJKG1pcHNfaXApOiBSZWNvZ25pemUgJGt0MCBhbmQgJGt0MSBhcyByZWdpc3RlciBuYW1lcy4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lIGlmIE9CSl9FTEYuCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgT0JKX0VMRiwgc3VidHJhY3Qgb3V0IHRoZQorCXZhbHVlIG9mIGEgZGVmaW5lZCBzeW1ib2w7IHRoZSB2YWx1ZSB3YXMgYWRkZWQgaW4gYnkKKwlmaXh1cF9zZWdtZW50LiAgVGhpcyB3YXMgcHJldmlvdXNseSBjb3JyZWN0ZWQsIGlmIHRoZSByZWxvYyB3YXMKKwljaGFuZ2VkIHRvIGJlIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgaW4gdGNfZ2VuX3JlbG9jLgorCitGcmkgRmViIDEwIDE0OjA0OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IFVzZSBTX0lTX0VYVEVSTgorCXJhdGhlciB0aGFuICFTX0lTX0xPQ0FMLgorCitUaHUgRmViICA5IDE4OjE2OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBBZGp1c3QgY29uZGl0aW9ucyBmb3IgY2hhbmdpbmcKKwlCRkRfUkVMT0NfMzIgdG8gQkZEX1JFTE9DXzM4Nl9HT1RQQyB0byBoYW5kbGUgYSBzd2l0Y2ggaW4gZnJhZ3MuCisJUGF0Y2ggb3JpZ2luYWxseSBmcm9tIFJvYiBSeWFuIDxyb2JyQGNtdS5lZHU+LgorCisJKiBjb25maWcvdGMtaTM4Ni5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KKwkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUgcmV0dXJuIHZhbHVlLgorCShpMzg2X29wZXJhbmQpOiBEb24ndCB1c2UgYW4gYXNzaWdubWVudCBkaXJlY3RseSBhcyBhIGNvbmRpdGlvbi4KKworVGh1IEZlYiAgOSAxMDozNzoxMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSW4gc29tZSBjYXNlcyBzdWJ0cmFjdCB0aGUKKwl2YWx1ZSBvZiB0aGUgYWRkIHN5bWJvbCBmcm9tIHZhbHAuICBPZmZzZXRzIGJyYWluZGFtYWdlIGluIHRoZQorCSJtYWNoaW5lIGluZGVwZW5kZW50IiBmaXh1cF9zZWdtZW50LgorCitXZWQgRmViICA4IDE4OjUxOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIG1lc3NhZ2VzLmMgKGFzX2Fib3J0KTogTmV3IGZ1bmN0aW9uLgorCSogYXMuaCAoYXNfYWJvcnQpOiBEZWNsYXJlIGl0LgorCShhYm9ydCk6IE5ldyBtYWNyby4KKworCVRodSBKYW4gMTkgMTg6MTA6MDUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIGNvbmZpZy92bXMtY29uZi5oIChIQVZFX1VOSVNURF9IKTogIGRlZmluZSBpdCB1bmNvbmRpdGlvbmFsbHkuCisJKiBjb25maWctZ2FzLmNvbTogIHRlc3QgZm9yIGF2YWlsYWJpbGl0eSBvZiA8dW5pc3RkLmg+OyBjcmVhdGUgYQorCXJ1ZGltZW50YXJ5IG9uZSBpZiBuZWNlc3NhcnkuCisKK1R1ZSBGZWIgIDcgMTM6MzQ6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBwb3dlcnBjLSotZWFiaSBzdXBwb3J0LCB3aGljaCBpcyB0aGUgc2FtZSBhcworCXBvd2VycGMtKi1lbGYuCisJKGNvbmZpZ3VyZSk6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KKworTW9uIEZlYiAgNiAwMzozNzowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+IGZvciBpMzg2CisJMTYtYml0IGFuZCBtc2RvcyBzdXBwb3J0OgorCSogY29uZmlnL3RjLWkzODYuYyAoZmxhZ18xNmJpdF9jb2RlKTogTmV3IHZhcmlhYmxlLgorCShzZXRfMTZiaXRfY29kZV9mbGFnKTogTmV3IGZ1bmN0aW9uLgorCShtZF9wc2V1ZG9fdGFibGUpOiBBZGRlZCBlbnRyaWVzICJjb2RlMTYiIGFuZCAiY29kZTMyIi4KKwkobWRfYXNzZW1ibGUpOiBFbnN1cmUgdGhhdCBjb3JyZWN0IGRhdGEtc2l6ZSBwcmVmaXhlcyBnZXQgZW1pdHRlZCwKKwliYXNlZCBvbiB0aGUgY3VycmVudCBtb2RlLiAgRW5zdXJlIHRoYXQgMzItYml0IGFkZHJlc3Npbmcgd2lsbAorCWFsd2F5cyBiZSBkb25lLiAgTW92ZSBzZWdtZW50LXByZWZpeCBoYW5kbGluZyBjb2RlLiAgKFdoeT8pICBVc2UKKwkxNi1iaXQganVtcHMgZm9yIDE2LWJpdCBjb2RlLCAzMi1iaXQganVtcHMgZm9yIDMyLWJpdCBjb2RlLgorCSogY29uZmlnL3RjLWkzODYuaCAoTUFYX1BSRUZJWEVTKTogQnVtcCB0byA1LgorCShEYXRhMTYsIERhdGEzMik6IERlZmluZS4KKwkqIGRvYy9hcy50ZXhpbmZvIChpMzg2LTE2Yml0KTogTmV3IG5vZGUuCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2RvcyopOiBOZXcgdGFyZ2V0LCB1c2luZyBhLm91dCBmb3JtYXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgRmViICAyIDE1OjIxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGNwdTMyX2NvbnRyb2xfcmVncyk6IE5ldyBtYWNyby4KKwkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgaXQsIGZvciBjcHUzMiBwcm9jZXNzb3JzLgorCisJVHVlIEphbiAzMSAxNzoyMDo0NSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogY29uZmlnL29iai12bXMuYyAodm1zX3Rpcl9zdGFja19wc2VjdCk6ICBuZXcgcm91dGluZTsKKwkoVk1TX1NldF9EYXRhLCBWTVNfU2V0X1BzZWN0LCBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UsCisJVk1TX1RCVF9Sb3V0aW5lX0JlZ2luLCBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24pOiAgdXNlIGl0OworCShWTVNfR2xvYmFsX1N5bWJvbF9TcGVjLCBWTVNfUHJvY2VkdXJlX0VudHJ5X1B0KTogIHRyZWF0CisJUHNlY3RfTnVtYmVyIGFzIGB1bnNpZ25lZCcuCisKKwlUaHUgSmFuIDI2IDE3OjA2OjI4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiBjb25maWcvb2JqLXZtcy5jOiAgcGVyZm9ybWFuY2UgdHVuaW5nLgorCShWTVNfU3ltYm9sX3R5cGVfbGlzdCk6ICBjb252ZXJ0IGZyb20gc2luZ2xlIGxpc3QgaGVhZCB0byBzbWFsbAorCWFycmF5IG9mIGxpc3QgaGVhZHM7CisJKFNZTVRZUF9IQVNIKTogIG5ldyBtYWNybyBmb3IgYWNjZXNzaW5nIFZNU19TeW1ib2xfdHlwZV9saXN0W107CisJKGZpbmRfc3ltYm9sLCBzZXR1cF9iYXNpY190eXBlLCBWTVNfdHlwZWRlZl9wYXJzZSk6ICB1c2UgaXQ7CisJKFZNU19SU1lNX1BhcnNlKTogIG1vdmUgU19HRVRfVkFMVUUoKSBpbnNpZGUgc3dpdGNoIHRvIGF2b2lkCisJY2FsbGluZyBpdCBmb3IgdW5pbnRlcmVzdGluZyBjYXNlcy4KKworV2VkIEZlYiAgMSAyMzo1Mjo0NSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogR28gYWhlYWQgYW5kIGNhbGwKKwlocHBhX2ZpZWxkX2FkanVzdCB0byBnZXQgYSBuZXcgdmFsdWUgZm9yIFJfREFUQV9PTkVfU1lNQk9MCisJcmVsb2NhdGlvbnMgaW4gU09NLgorCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVmaW5lIHNvbWV3aGF0LgorCitGcmkgSmFuIDI3IDIxOjI5OjUzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5oIChOT19TVFJJTkdfRVNDQVBFUyk6IERvbid0IGRlZmluZSBpZiB3ZSBhcmUKKwl1c2luZyBFTEYuCisKK1RodSBKYW4gMjYgMTk6MDM6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IEFkZCBwYXJlbnMgYXJvdW5kIHwgaW5zaWRlICYuCisJKHNraXBfY29sb250aGluZyk6IFNldCBMXzggaWYgIjo4IiBpcyBzcGVjaWZpZWQuCisKK1RodSBKYW4gMjYgMTg6Mzg6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogUGVybWl0IG1mZGVjIHRvIGJlIGR1cGxpY2F0ZWQgb24gdGhlCisJNjAxLiAgQ2hlY2sgdGhhdCB0aGUgZXJyb3IgcmV0dXJuIGZyb20gaGFzaF9pbnNlcnQgaXMgImV4aXN0cyIuCisKK1RodSBKYW4gMjYgMTE6MzU6MzMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogQWRkIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIHBvd2VycGMtKi1lYWJpLgorCisJKiBjb25maWcvdGMtcHBjLmMgKEdPVF9zeW1ib2wpOiBEZWZpbmUgaWYgb2JqZWN0IGZvcm1hdCBpcyBFTEYuCisKKwkqIGNvbmZpZy90Yy1wcGMuaCAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lIGlmIG9iamVjdAorCWZvcm1hdCBpcyBFTEYgYW5kIG5vdCBkZWZpbmVkIHRvIGJlICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iLgorCitXZWQgSmFuIDI1IDE2OjIzOjEzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogdGMtc2guYyAobGl0dGxlKTogQWRkIGFyZ3VtZW50IElHTk9SRSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkIHNwYWNlIGZvciBjb25zaXN0ZW50IGZvcm1hdHRpbmcuCisJKENPTkQ4X1JBTkdFLCBDT05EMTJfUkFOR0UpOiBEZWxldGUgdW51c2VkIG1hY3Jvcy4KKwkoQ09ORDhfRiwgQ09ORDhfTSwgQ09ORDEyX0YsIENPTkQxMl9NLCBVTkNPTkQxMl9GLCBVTkNPTkQxMl9NKToKKwlDb3JyZWN0IG1pbmltdW0gYW5kIG1heGltdW0gYnJhbmNoIG9mZnNldHMuICBBZGQgY29tbWVudHMgZXhwbGFpbmluZworCXdoeSB0aGVzZSBudW1iZXJzIGFyZSBjb3JyZWN0LgorCitXZWQgSmFuIDI1IDE1OjMyOjA5IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCBtcHdyMiBhcyBhIHN5bm9ueW0gZm9yCisJbXB3cng7IG1wcGMzMiwgbTYwMywgYW5kIG02MDQgYXMgc3lub255bXMgZm9yIG1wcGM7IGFuZCBtcHBjNjQgYW5kCisJbTYyMCBmb3IgUG93ZXJQQzY0IG1vZGUuCisJKHBwY19zeW1ib2xfbmV3X2hvb2spOiBBZGQgVDAgYXMgc3lub255bSBmb3IgVEMwIHN1ZmZpeC4KKworVHVlIEphbiAyNCAxNjo0NDoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdmF4LmMgKHZpcCk6IEludHJvZHVjZSBuZXcgcHRyLXRvLWNvbnN0IGxvY2FsIHZhcmlhYmxlCisJZm9yIHNjYW5uaW5nIG9wZXJhbmQgc3RyaW5nLgorCisJU2F0IEphbiAyMSAxNzo1MDozOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogY29uZmlnL3ZheC1pbnN0LmggKHN0cnVjdCB2b3AsIGZpZWxkcyBgdm9wX3dhcm4nLCBgdm9wX2Vycm9yJyk6CisJbWFrZSB0aGVtIHBvaW50ZXJzIHRvIGNvbnN0IGNoYXI7CisJKHN0cnVjdCB2aXQsIGZpZWxkIGB2aXRfZXJyb3InKTogIGRpdHRvLgorCSogY29uZmlnL2F0b2YtdmF4LmMgKG1kX2F0b2YpOiAgcmVuYW1lIGxvY2FsIGBsaXR0bGVudW1fcG9pbnRlcicKKwl0byBgbGl0dGxlbnVtUCcgdG8gYXZvaWQgc2hhZG93aW5nIGZpbGUgc2NvcGUgdmFyaWFibGUuCisJKiBjb25maWcvdGMtdmF4LmMgKHZpcF9iZWdpbiwgdmlwX29wX2RlZmF1bHRzLCB2aXBfb3BfMSk6ICBtYWtlCisJc3RyaW5nIGFyZ3VtZW50cyBiZSBwb2ludGVycyB0byBjb25zdCBjaGFyOworCSh2aXApOiAgbWFrZSBgYWxsb3BlcnInIGNvbnN0IGNoYXIgKjsKKwkodmlwX29wKTogbWFrZSBgZXJyJyBhbmQgYHdybicgY29uc3QgY2hhciAqOyByZW5hbWUgYGFjY2VzcycgdG8KKwlgYWNjZXNzX21vZGUnIHRvIGF2b2lkIHNoYWRvd2luZyBsaWJyYXJ5IGZ1bmN0aW9uLgorCSogY29uZmlnL29iai12bXMuYyAoYHN5bWJvbF9uYW1lJyk6ICBtYWtlIGl0IGNvbnN0IGNoYXIgKjsKKwkoZ2V0X3N0cnVjdF9uYW1lKTogIGNhc3Qgb25lIHVzZSBvZiBgc3ltYm9sX25hbWUnIHRvIGNoYXIgKgorCVtjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IG1vZGlmeSB0aGUgcG9pbnRlcidzIHRhcmdldF07CisJKFBVVF9DT1VOVEVEX1NUUklORyk6ICB1c2UgcG9pbnRlciB0byBjb25zdCBjaGFyOworCShWTVNfdHlwZWRlZl9wYXJzZSk6ICBtYWtlIGBwbnQyJyBjb25zdCBjaGFyICo7CisJKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6ICBtYWtlIGBjcCcgY29uc3QgY2hhciAqOworCShWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMsIGFycmF5IGBBdHRyaWJ1dGVzJyk6ICBtYWtlIGNvbnN0LAorCWFuZCBtYWtlIGZpZWxkIGBOYW1lJyBwb2ludGVyIHRvIGNvbnN0IGNoYXI7CisKKwkqIGFzLmggKGBzZWdfbmFtZVtdJyBkZWNsYXJhdGlvbik6ICBwb2ludGVycyB0byBjb25zdCBjaGFyOworCShzdHJ1Y3QgX3BzZXVkb190eXBlLCBmaWVsZCBgcG9jX25hbWUnKTogIHBvaW50ZXIgdG8gY29uc3QgY2hhci4KKwkqIHN1YnNlZ3MuYyAoYHNlZ19uYW1lW10nIGRlZmluaXRpb24pOiAgZGl0dG87CisJKiBoYXNoLmMgKGhhc2hfYXNrKTogIHJlbmFtZSBhcmd1bWVudCBgYWNjZXNzJyB0byBgYWNjZXNzX3R5cGUnCisJdG8gYXZvaWQgc2hhZG93aW5nIGxpYnJhcnkgZnVuY3Rpb24uCisJKiB3cml0ZS5jICh2YXJpYWJsZSBgdGhlX29iamVjdF9maWxlJyk6ICBtb3ZlIGZyb20gZmlsZSBzY29wZQorCXRvIGJsb2NrIHNjb3BlIHdpdGhpbiB3cml0ZV9vYmplY3RfZmlsZSgpOyBmcmVlIGl0IGFmdGVyIHVzZTsKKwkoZml4dXBfc2VnbWVudCk6ICBjb25kaXRpb25hbGx5IGV4Y2x1ZGUgaXQgZm9yIE9CSl9WTVMuCisJKGN2dF9mcmFnX3RvX2ZpbGwpOiAgcmVuYW1lIGFyZ3VtZW50IGBoZWFkZXJzJyB0byBgaGVhZGVyc1AnCisJdG8gYXZvaWQgc2hhZG93aW5nIGZpbGUgc2NvcGUgdmFyaWFibGUuCisKK01vbiBKYW4gMjMgMjE6NDI6MzkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICdEJyk6IEZpeCB0eXBvIHdoaWNoIGNhdXNlZAorCW1pc2NvbXBpbGF0aW9uIG9mICJkaWFnIiBpbnN0cnVjdGlvbnMuCisKK01vbiBKYW4gMjMgMTU6NTE6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKworTW9uIEphbiAyMyAxNDowNzo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zaC5oICh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRhYmxlLgorCShtZF9hc3NlbWJsZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcC4KKwkobWRfY29udmVydF9mcmFnKTogQ2FzdCBmcl9hZGRyZXNzIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KKwkobWRfYXBwbHlfZml4KTogVXNlIGFzX3dhcm5fd2hlcmUgcmF0aGVyIHRoYW4gYXNfd2Fybi4KKwkoc2hfaW5pdF9hZnRlcl9hcmdzKTogUmVtb3ZlIGVtcHR5IGZ1bmN0aW9uLgorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbnUqZWxmKik6IE5ldyB0YXJnZXQuCisKK1NhdCBKYW4gMjEgMTk6MDI6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgorCisJKiBoYXNoLmMgKGhhc2hfYXNrKTogSWYgd2UgZmluZCB0aGUgc2xvdCBhZnRlciB3cmFwcGluZyBhcm91bmQsCisJYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAgRml4ZXMgYnVnIGluIEphbiAxOCBjaGFuZ2UuCisKK0ZyaSBKYW4gMjAgMTc6MDc6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogaGFzaC5jIChoYXNoX2NvZGUpOiBVbmRvIGxhc3QgY2hhbmdlLgorCitUaHUgSmFuIDE5IDE0OjQ5OjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzIHRvIGtlZXAKKwlnY2MgcXVpZXQuCisJKGdwZGlzcF9oaTE2X2hvd3RvKTogRG9uJ3QgdXNlICJjb25zdCIgd2l0aCByZWxvY19ob3d0b190eXBlLgorCShpbl9yYW5nZV9zaWduZWQpOiBBZGQgcGFyZW5zIGFyb3VuZCBzdWJ0cmFjdGlvbiBpbnNpZGUgc2hpZnQuCisJKiBnYXNwLmMgKGRvX2RhdGEpOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlICJvcG5hbWUiLgorCShpc3RydWUpOiBQcm92aWRlIGEgZGVmYXVsdCBjYXNlIHRvIHNldCAicmVzIiBhbmQga2VlcCAiZ2NjIC1XYWxsIgorCXF1aWV0LgorCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEZWxldGVkIHVudXNlZCB2YXJpYWJsZS4KKwkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEZWNsYXJlLgorCSogaGFzaC5jIChoYXNoX2Fzayk6IERlbGV0ZSBkaXNhYmxlZCBub24tc3RyY21wIHZlcnNpb24gb2YgdGhlCisJY29kZSwgYW5kIGF1dG9tYXRpYyB2YXJpYWJsZXMgdXNlZCBvbmx5IGluIHRob3NlIHNlY3Rpb25zLgorCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IE9ubHkgZGVmaW5lIGxvY2FsIHZhcmlhYmxlCisJInByZXZfZml4IiBpZiBCRkRfQVNTRU1CTEVSLgorCSogZmxvbnVtLWtvbnN0LmMgKGR1bW15MSk6IFJldHVybiB2b2lkLgorCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZSB0d28gY29tcGFyaXNvbnMgb2YKKwl1bnNpZ25lZCBudW1iZXJzIHZlcnN1cyB6ZXJvLgorCSogYXMuaCAoYmNvcHkpOiBJZiBuZWl0aGVyIG1lbWNweSBub3IgYmNvcHkgaXMgZGVmaW5lZCBhcyBhIG1hY3JvLAorCWRlZmluZSB0byB1c2UgbWVtY3B5LgorCisJKiBjb25maWcvdGMtYWxwaGEuYywgY29uZmlnL2FscGhhLW9wY29kZS5oOiBSZXZlcnQgMiBKdW5lIGNoYW5nZXMuCisJVHVybnMgb3V0IHdlIG5ldmVyIGdvdCB0aGUgYXNzaWdubWVudCBkb25lIGFmdGVyIGFsbC4KKworCUNsZWFudXAgb2YgVkFYIGFuZCBWTVMgY29kZSwgZnJvbSBQYXQgUmFua2luOgorCSogY29uZmlnL29iai12bXMuYzogQ2hhbmdlZCBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyB0byBsb3dlciBjYXNlLgorCShDaGFuZ2VkIGNhbGwgc2l0ZXMgaW4gd3JpdGUuYy4pICBEZWNsYXJlIFZNUyBzeXN0ZW0gZnVuY3Rpb24KKwluYW1lcyB1c2VkLCBjb25kaXRpb25hbCBvbiBhY3R1YWxseSBiZWluZyBvbiBWTVMuICBDaGFuZ2VkIG1hbnkKKwlmdW5jdGlvbnMgdGhhdCByZXR1cm5lZCBubyB1c2VmdWwgdmFsdWUgdG8gbm93IGJlIGRlY2xhcmVkIHRvCisJcmV0dXJuIHZvaWQuICBSZW1vdmVkIG1hbnkgdW51c2VkIHZhcmlhYmxlcy4gIFN1cHBseSBtaXNzaW5nCisJcmV0dXJuIHN0YXRlbWVudHMgb3IgdmFsdWVzLiAgU3VwcGx5IGBkZWZhdWx0JyBjYXNlIGluIHN3aXRjaAorCXN0YXRlbWVudHMuICBFbnN1cmUgbG9jYWwgdmFyaWFibGVzIGdldCBpbml0aWFsaXplZC4KKwkqIGNvbmZpZy90Yy12YXguYzogTWlub3IgY2hhbmdlcyB0byBzaWxlbmNlICJnY2MgLVdhbGwiLgorCSogY29uZmlnL29iai12bXMuaCwgY29uZmlnL3RjLXZheC5oOiBBZGRlZCBzb21lIG1pc3NpbmcKKwlkZWNsYXJhdGlvbnMuCisKK1dlZCBKYW4gMTggMTM6NDk6MjYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYXRvZi1nZW5lcmljLmMgKGZsb251bV9wcmludCkgW1RSQUNFXTogTmV3IGZ1bmN0aW9uLgorCShhdG9mX2dlbmVyaWMpIFtUUkFDRV06IFByaW50IG11bHRpcGxpZXIgYmVmb3JlIG11bHRpcGxpY2F0aW9uLAorCWFuZCBwcmludCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgYmVmb3JlIGFuZCBhZnRlciBjb3B5LgorCisJKiBmbG9udW0tbXVsdC5jIChmbG9udW1fbXVsdGlwKTogQXZvaWQgc2lnbiBleHRlbnNpb24gcHJvYmxlbXMKKwlhcm91bmQgbXVsdGlwbGljYXRpb24gb3BlcmF0aW9uLgorCisJKiBhdG9mLWdlbmVyaWMuYyAoQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QpOiBEZWZpbmUuCisJKGF0b2ZfZ2VuZXJpYykgW0FTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UXTogQ2hlY2sgZm9yICcuJworCWV4cGxpY2l0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIHN0cmNoci4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogV2hlbiBzY2FubmluZyBzdWNjZXNzaXZlIG9wY29kZQorCXRhYmxlIGVudHJpZXMsIGNoZWNrIG5hbWVzIGZvciBwb2ludGVyIGVxdWFsaXR5IGJlZm9yZSBkb2luZworCXN0cmluZyBjb21wYXJpc29ucy4KKworCSogaGFzaC5jIChoYXNoX2Fzayk6IENhbGwgc3RyY21wIGluc3RlYWQgb2YgZXhwYW5kaW5nIGl0IGlubGluZS4KKwkoaGFzaF9jb2RlKTogUmVwbGFjZWQgd2l0aCBhIHZlcnNpb24gZnJvbSBiZmQuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIENPRkZfRkxBR1MgaXNuJ3QKKwlkZWZpbmVkLCBkZWZhdWx0IGl0IHRvIHplcm8uCisKK1dlZCBKYW4gMTggMTI6MTY6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogQ2xlYXIgZnhfYnNyIG9uIHRob3NlIHRhcmdldHMgd2hpY2gKKwl1c2UgaXQuCisKKwkqIGV4cHIuYyAob3BlcmFuZCk6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCisJKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IExpa2V3aXNlLgorCShsaXN0X3N5bWJvbF90YWJsZSk6IFVzZSAlbHUgdG8gcHJpbnQgc2l6ZW9mLgorCSogc3ltYm9scy5jOiBDb21tZW50IG91dCB1bnVzZWQgZnVuY3Rpb24gaW5kZW50LgorCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IENhc3QgcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IE9ubHkgZGVjbGFyZSBzeW1ib2xfcHRyIGlmIGl0CisJd2lsbCBiZSB1c2VkLgorCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSByZWcuCisJKGdldF9vcGVyYW5kKTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBkaXJlY3Rpb24uICBSZW1vdmUgdW51c2VkCisJdmFyaWFibGUgc2l6ZS4KKwkoZ2V0X3NwZWNpZmljKTogRml4IGNvbW1lbnQgdG8gYXZvaWQgbmVzdGVkIGNvbW1lbnRzLgorCShjaGVja19vcGVyYW5kKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgorCShidWlsZF9ieXRlcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzIG91dHB1dF9wdHIsIHBhcnQsIGFuZAorCWhpZ2guCisJKGJ1aWxkX2J5dGVzKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgorCShjbGV2ZXJfbWVzc2FnZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc2Nhbi4KKwkobWRfYXNzZW1ibGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCisJKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgorCSogdGMtaDgzMDAuaCAodGNfcmVsb2NfbWFuZ2xlKTogRGVjbGFyZS4KKworVHVlIEphbiAxNyAxMDo1ODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfNDY1MCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1kX2JlZ2luKTogSGFuZGxlIGEgY3B1IHN0cmluZyBvZiAiNDY1MCIuICBJZiBtaXBzXzQ2NTAgd2FzIG5vdAorCWluaXRpYWxpemVkLCBzZXQgaXQgdG8gMC4KKwkoYXBwZW5kX2luc24pOiBEb24ndCBpbnNlcnQgbm9wcyBhcm91bmQgSEkgYW5kIExPIG9uIGEgNDY1MC4KKwkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgorCShtaXBzX2lwKTogVXNlIElOU05fSVNBIG1hc2sgdG8gY2hlY2sgSVNBIG9mIGluc3RydWN0aW9uLiAgQ2hlY2sKKwlmb3IgSU5TTl80NjUwLgorCShtZF9sb25nb3B0cyk6IEFkZCBtNDY1MCBhbmQgbm8tbTQ2NTAuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBtaXBzLWNwdT00NjUwLiAgSGFuZGxlIC1tNDY1MCBhbmQKKwktbm8tbTQ2NTAuCisJKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IE1JUFMgb3B0aW9ucy4KKworU2F0IEphbiAxNCAyMzo0ODoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0Bqb25ueT4KKworCSogY29uZmlnL3RjLXc2NS5jLCBjb25maWcvdGMtdzY1LmgsIGNvbmZpZy93NjUubXQ6IE5ld2ZpbGVzLgorCSogY29uZmlnL29iai1jb2ZmLmg6IENvcGUgd2l0aCB3NjUuCisJKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHc2NS4KKworVGh1IEphbiAxMiAxNzo1NjoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKSBbX19HTlVDX18gJiYgX19PUFRJTUlaRV9fXTogSWYgYGdldCcKKwlmdW5jdGlvbiBpcyBzY3J1Yl9mcm9tX2ZpbGUsIGNhbGwgc2NydWJfZnJvbV9maWxlIGRpcmVjdGx5LCBhbmQKKwlnZXQgZ2NjJ3MgaW5saW5pbmcgY2FwYWJpbGl0eSBpbnRvIHRoZSBhY3QuCisKKwkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6IEFkZCAuLi9saWJpYmVydHkvaGV4Lm8uCisJKE9CSlMpOiBEZWxldGUgaGV4LXZhbHVlLm8uCisJKFJFQUxfU09VUkNFUyk6IERlbGV0ZSBoZXgtdmFsdWUuYy4KKwkoaGV4LXZhbHVlLm8pOiBEZWxldGUgZGVwZW5kZW5jaWVzLgorCSogaGV4LXZhbHVlLmM6IERlbGV0ZWQuCisJKiBhcy5jIChtYWluKTogQ2FsbCBoZXhfaW5pdC4KKwkqIGV4cHIuYywgY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIFJlcGxhY2UKKwloZXhfdmFsdWUgYXJyYXkgcmVmZXJlbmNlcyB3aXRoIGhleF8qIG1hY3Jvcy4KKworV2VkIEphbiAxMSAxNzo1MTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaDgzMDAuaCAoQ09GRl9GTEFHUyk6IERvbid0IGRlZmluZS4KKwkqIGNvbmZpZy90Yy1oODUwMC5oIChDT0ZGX0ZMQUdTKSwgY29uZmlnL3RjLXNoLmggKENPRkZfRkxBR1MpLAorCWNvbmZpZy90Yy16OGsuaCAoQ09GRl9GTEFHUyk6IERpdHRvLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoS0VFUF9SRUxPQ19JTkZPKTogTWFrZSBzdXJlIGl0J3MgYWx3YXlzCisJZGVmaW5lZC4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZXMgQU9GRiBhbmQgQUlOREVYKTogRG9uJ3QKKwlnZW5lcmF0ZSA2ODAyMCBhZGRyZXNzaW5nIG1vZGVzIGZvciBhIDY4MDAwIHByb2Nlc3Nvci4KKwkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIGNhc2VzIFBDUkVMIGFuZCBQQ0xFQSk6IERpdHRvLgorCitUdWUgSmFuIDEwIDEzOjM0OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsKKwlzcGVjaWFsbHkgd2l0aCByZWdhcmQgdG8gZml4dXBzLgorCitNb24gSmFuICA5IDE2OjIyOjI4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKFJFTEFYX1JFTE9DMSwgUkVMQVhfUkVMT0MyKTogQ2FzdCB2YWx1ZXMgdG8KKwliZmRfdm1hIGJlZm9yZSBzdWJ0cmFjdGluZy4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IEhhbmRsZSByc19zcGFjZSBsaWtlIHJzX2ZpbGwsCisJYnV0IG1ha2Ugc3VyZSBmcl9zeW1ib2wgaXMgbnVsbC4KKwkoZmlsbF9zZWN0aW9uKTogRGl0dG8uCisKK1N1biBKYW4gIDggMTY6MTQ6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRml4IGhhbmRsaW5nIG9mIGZsb2F0aW5nIHBvaW50CisJdmFsdWVzIHdoZW4gR1BPUFQgaXMgbm90IGRlZmluZWQuCisKK0ZyaSBKYW4gIDYgMTY6NTk6NDEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZ2FzcC5jOiBJbmNsdWRlIHN0cmluZy5oLiAgUHV0IGNvbmZpZy5oIGJlZm9yZSBvdGhlciBpbmNsdWRlcy4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogRGVsYXkgY2FsbHMgdG8gZW1pdF9hZGQ2NCB1bnRpbAorCWFmdGVyIGFueSByZW1haW5pbmcgb3BlcmFuZHMgYXJlIGFsc28ga25vd24gdG8gbWF0Y2guCisKK0ZyaSBEZWMgMzAgMTg6MjE6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IEJ1aWxkIGEgZm9ybWF0IHN0cmluZyBiYXNlZCBvbgorCXRoZSBzaXplIG9mIHRoZSB2YWx1ZSB0byBiZSBwcmludGVkLCBhcyBsb25nIGFzICJ1bnNpZ25lZCBsb25nIiBpcworCWF0IGxlYXN0IGFzIHdpZGUsIGFmdGVyIGhhbmRsaW5nIHRoZSBzcGVjaWFsIGNhc2Ugb2YgNC1ieXRlCisJdmFsdWVzLgorCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kZW5jaWVzKTogTWFrZSAkKE9CSlMpIGRlcGVuZCBvbiBhcy5oIGFuZAorCWV2ZXJ5dGhpbmcgaXQgaW5jbHVkZXMuICBEZWxldGUgdGhvc2UgZmlsZXMgZnJvbSBwZXItZmlsZQorCWRlcGVuZGVuY2llcy4KKworCSogYXMuaCAocmVsYXhfc3Vic3RhdGVUKTogTm93IGRlZmluZWQgdG8gYmUgdW5zaWduZWQgaW50LgorCShyZWxheF9zdGF0ZVQpOiBTZXBhcmF0ZSB0eXBlZGVmIGZyb20gZW51bSBkZWZpbml0aW9uLgorCShlbnVtIF9yZWxheF9zdGF0ZSk6IFJlb3JkZXJlZCBmb3IgYmV0dGVyIHB1bmN0dWF0aW9uLiAgQWRkZWQgbmV3CisJdmFsdWVzIHJzX2FsaWduX2NvZGUgYW5kIHJzX3NwYWNlLgorCShsaW5lbm8sIHN0cnVjdCBsaW5lbm9fc3RydWN0KTogVW51c2VkLCBkZWxldGVkLgorCisJKiBhcy5oOiBObyBsb25nZXIgaW5jbHVkZSBhc3NlcnQuaC4KKwkoYXNfYXNzZXJ0KTogRGVjbGFyZS4KKwkoYXNzZXJ0KTogTmV3IGRlZmluaXRpb24sIGNhbGxzIGFzX2Fzc2VydCBsb25nZXIgbmVlZGVkLgorCShfX1BSRVRUWV9GVU5DVElPTl9fKTogUHJvdmlkZSBkZWZhdWx0IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MuCisJKiBtZXNzYWdlcy5jIChhc19hc3NlcnQpOiBOZXcgZnVuY3Rpb24uCisJKiBnZGJpbml0LmluOiBQdXQgYSBicmVha3BvaW50IHRoZXJlLgorCisJKiByZWFkLmMgKHNfc3BhY2UpOiBSZXdyaXRlIHRvIGhhbmRsZSBnZW5lcmFsIGV4cHJlc3Npb25zLgorCUdlbmVyYXRlIHJzX3NwYWNlIGZyYWdzIGZvciBub24tY29uc3RhbnQgdmFsdWVzLgorCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IFRyZWF0IHJzX2FsaWduX2NvZGUgYW5kIHJzX3NwYWNlCisJbGlrZSByc19hbGlnbiBhbmQgcnNfb3JnLiAgVmVyaWZ5IHRoYXQgZnJfb2Zmc2V0IGlzIG5vbi1uZWdhdGl2ZSwKKwlhbmQgZm9yY2UgZnJhZyB0eXBlIHRvIHJzX2ZpbGwgb25seSBhZnRlciBhc3NlcnRpb24gY2hlY2tzLgorCShyZWxheF9zZWdtZW50KTogVHJlYXQgcnNfYWxpZ25fY29kZSBsaWtlIHJzX2FsaWduLiAgVHJlYXQKKwlyc19zcGFjZSBsaWtlIHJzX29yZyBpbiB0aGUgZmlyc3Qgc3dpdGNoOyBpbiB0aGUgc2Vjb25kLCBmb3JjZSB0aGUKKwlvcGVyYW5kIHRvIGEgY29uc3RhbnQsIGFuZCB1c2UgaXQgZm9yIHRoZSBncm93dGggc2l6ZS4KKworV2VkIERlYyAyOCAyMDo1NzozNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBGb3Igc2VjdGlvbnMgd2l0aCB0aGUgWkVSTworCWF0dHJpYnV0ZSwgc2V0IHRoZSAiYnNzIiBmaWVsZCBpbiB0aGUgYXBwcm9wcmlhdGUgc2VnaW5mbyBzdHJ1Y3R1cmUuCisKK1dlZCBEZWMgMjggMTU6MDE6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogc3Vic2Vncy5oOiBJbmNsdWRlIG9ic3RhY2suaC4KKworVHVlIERlYyAyNyAxODoxNjowNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEVuYWJsZSBhbGlnbiogY29tcG9uZW50cyBub3cuCisKK1R1ZSBEZWMgMjAgMTQ6NTY6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZnJhZ3MuYyAoZnJhZ19pbml0KTogQ2FsbCBvYnN0YWNrX2JlZ2luIG9uIGBmcmFncycuCisJKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBEb24ndCBkbyBpdCBoZXJlLgorCSogYXMuYyAobWFpbik6IENhbGwgZnJhZ19pbml0IGJlZm9yZSBzdWJzZWdzX2JlZ2luLgorCisJKiBmcmFncy5jIChmcmFnX2FwcGVuZF8xX2NoYXIpOiBOZXcgZnVuY3Rpb24uCisJKiBmcmFncy5oIChmcmFnX2FwcGVuZF8xX2NoYXIpOiBEZWNsYXJlIGl0LgorCShGUkFHX0FQUEVORF8xX0NIQVIpOiBDYWxsIGl0LiAgT2xkIGRlZmluaXRpb24gaXMgY29tbWVudGVkIG91dAorCWZvciBub3cuCisKKwkqIGFzLmggKHN0cnVjdCBmcmFnKTogQWRkZWQgKGJ1dCBjb21tZW50ZWQgb3V0KSBuZXcgZmllbGRzIGZvcgorCXRyYWNraW5nIGN1cnJlbnQgYWxpZ25tZW50LgorCShmcmFnX25vd19maXgpOiBDaGFuZ2VkIG1hY3JvIHRvIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogRGVmaW5lIGZ1bmN0aW9uIGhlcmUuCisJKGZyYWdfbmV3KTogVXNlIGl0IGluc3RlYWQgb2YgYWNjZXNzaW5nIGBmcmFncycgZGlyZWN0bHkuCisJKiBmcmFncy5oIChmcmFncyk6IENoYW5nZSBjb21tZW50IHRvIGluZGljYXRlIGl0IHNob3VsZG4ndCBiZQorCWFjY2Vzc2VkIGRpcmVjdGx5LgorCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IE5ldyBmaWVsZCBmcmNoX29ic3RhY2ssIGludGVuZGVkIHRvCisJZXZlbnR1YWxseSByZXBsYWNlIGdsb2JhbCBgZnJhZ3MnIG9ic3RhY2suCisJKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IFVzZSBmcmFnX25vd19maXggaW5zdGVhZCBvZgorCWFjY2Vzc2luZyBgZnJhZ3MnIGRpcmVjdGx5LiAgSW5pdGlhbGl6ZSBmaWVsZHMgb2YgbmV3IGZyY2hhaW5TCisJZXhwbGljaXRseSBpbnN0ZWFkIG9mIHdpdGggbWVtc2V0LgorCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2xuKSBbIUJGRF9BU1NFTUJMRVJdOiBVc2UKKwlmcmFnX25vd19maXguCisJKiBjb25maWcvdGMtbWlwcy5jIChzX2xvYyksIGNvbmZpZy9vYmotdm1zLmMKKwkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKSwgc3ltYm9scy5jIChjb2xvbik6IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFVzZSBvZmZzZXRUIGFuZCBhZGRyZXNzVAorCWluc3RlYWQgb2YgbG9uZyBhbmQgdW5zaWduZWQgbG9uZy4KKwkobWRfYXBwbHlfZml4KTogQ2FzdCB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdC4KKworCSogY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWVsZi5oLAorCWNvbmZpZy9vYmotc29tLmgsIGNvbmZpZy90Yy1oODUwMC5jLCBjb25maWcvdGMtaHBwYS5jLAorCWNvbmZpZy90Yy1ocHBhLmgsIGNvbmZpZy90Yy1zaC5jLCBjb25maWcvdGMtejhrLmM6IERvbid0IHJlbHkgb24KKwl1c2Ugb2YgIi4uIiB3aGVuIGluY2x1ZGluZyBoZWFkZXIgZmlsZXMuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogUmVmb3JtYXQgY29uZGl0aW9uIGluIGFuIGBpZicKKwlzdGF0ZW1lbnQuCisKKwkqIE1ha2VmaWxlLmluIChTVUJESVJfSU5DTFVERVMpOiBEZWxldGVkLgorCitUdWUgRGVjIDIwIDEzOjQwOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmg6IEluY2x1ZGUgYmZkL2xpYmNvZmYuaCwgbm90IGxpYmNvZmYuaC4KKworTW9uIERlYyAxOSAxNjo1MzozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZXdyaXRlIHRvIGhhbmRsZSBPX2JpZyA2NCBiaXQKKwljb25zdGFudHMuCisJKG1pcHNfaXApOiBBY2NlcHQgT19iaWcgY29uc3RhbnRzIGluIGNhc2UgJ0knLiAgQ2hhbmdlIGNhc2UKKwknaScvJ2onIHRvIHRyZWF0IGFuIE9fYmlnIGNvbnN0YW50IGFzIGFuIG91dCBvZiByYW5nZSB2YWx1ZS4KKworTW9uIERlYyAxOSAxNDoxNTowNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBNYWtlIHN1cmUgU0VDX0hBU19DT05URU5UUyBpcworCWNsZWFyIGZvciBhIHNlY3Rpb24gd2l0aCB0aGUgIlpFUk8iIGF0dHJpYnV0ZS4KKworCSogUmVkdWNlIHVzZWxlc3Mgc3ltYm9scyBmb3IgRUxGIGluIGFuIGF0dGVtcHQgdG8gbWFrZSBzbWFsbGVyCisJb2JqZWN0cyBhbmQgc3BlZWQgdXAgdGhlIGxpbmtlci4KKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBjYWxsX2luZm8pOiBSZXBsYWNlIGVuZF9zeW1ib2wgZmllbGQKKwl3aXRoIGEgc2l6ZSBmaWVsZC4KKwkoaHBwYV9lbGZfbWFya19lbmRfZnVuY3Rpb24pOiBEZWxldGUgdW5uZWVkZWQgZnVuY3Rpb24uCisJKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IEZvciB0aGUgMm5kIHVud2luZCByZWxvY2F0aW9uLCB1c2UKKwl0aGUgZnVuY3Rpb24gc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBpbnN0ZWFkIG9mIGEgc3BlY2lhbCBzeW1ib2wKKwlmb3IgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisJKHByb2Nlc3NfZXhpdCk6IENvbXB1dGUgdGhlIGZ1bmN0aW9uIHNpemUgaGVyZS4gIERvbid0IGNhbGwKKwlocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiBhbnltb3JlLgorCShwYV9wcm9jZW5kKTogTGlrZXdpc2UuCisJKGhwcGFfZml4X2FkanVzdGFibGUpOiBPbmx5IHJlamVjdCAzMmJpdCByZWxvY2F0aW9ucyBmb3IgU09NLgorCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogU2ltcGxpZnkuCisKK01vbiBEZWMgMTkgMTM6NDk6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcy1zb255LWJzZCBhbmQgbWlwcy1kZWMtYnNkLCBidXQKKwlyZWplY3Qgb3RoZXIgdmVuZG9ycyB1bnRpbCB3ZSBjYW4gYmUgc3VyZSB3ZSdyZSBjb25zaXN0ZW50IHdpdGgKKwliZmQuCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBJbnN0ZWFkIG9mIGZvcm1hdHRpbmcKKwlhIGJ1ZmZlciB0byBwYXNzIHRvIGBlcnJvcicsIGp1c3QgY2FsbCBgYXNfZmF0YWwnIGRpcmVjdGx5LgorCShWTVNfUHNlY3RfU3BlYyk6IERpdHRvLgorCShWTVNfVEJUX01vZHVsZV9CZWdpbiwgVk1TX1RCVF9Tb3VyY2VfRmlsZSwgZ2VuMSwKKwlWTVNfdHlwZWRlZl9wYXJzZSwgVk1TX0xTWU1fUGFyc2UsIFZNU19FbWl0X0dsb2JhbHZhbHVlcyk6IENhbGwKKwlhc190c2t0c2sgaW5zdGVhZCBvZiBwcmludGYuCisJKFZNU19UQlRfTW9kdWxlX0JlZ2luLCBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24sCisJVk1TX1RCVF9Tb3VyY2VfRmlsZSwgVk1TX1RCVF9Tb3VyY2VfTGluZXMsCisJVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEsIFZNU19DaGVja19Gb3JfTWFpbik6IFVzZSBleHBsaWNpdAorCWludGVnZXJzIHJhdGhlciB0aGFuIHNpemVvZiBleHByZXNzaW9ucyB1c2luZyBiYXNpYyBpbnRlZ2VyIHR5cGVzLAorCWluIGNhc2UgaG9zdCBhbmQgdGFyZ2V0IGFyZW4ndCB0aGUgc2FtZS4gIFVzZSBtZW1jcHkgb3IgQ09QWV8qCisJbWFjcm9zIGluc3RlYWQgb2YgcG9zc2libHkgdW5hbGlnbmVkIHdvcmQgb3IgbG9uZ3dvcmQgYXNzaWdubWVudC4KKworCSogY29uZmlnL29iai12bXMuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBOZXcgbWFjcm8uCisJKiBjb25maWcvb2JqLXZtcy5jIChWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UsCisJVk1TX0NoZWNrX0Zvcl9NYWluLCBWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2Ugc3lfb2JqIGluc3RlYWQgb2YKKwlmb3JjaW5nIHN5X251bWJlciB0byBob2xkIGEgcG9pbnRlci4KKworRnJpIERlYyAxNiAxNDo0MDoxNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBEb24ndCBmaWxsIGluIG1kX3JlbGF4X3RhYmxlIGhlcmUuCisJKG1kX3JlbGF4X3RhYmxlKTogVXNlIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KKworCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX2V4cCwgZ2V0X29wZXJhbmRzLCBjbGV2ZXJfbWVzc2FnZSwKKwltZF9hc3NlbWJsZSwgdGNfY3Jhd2xfc3ltYm9sX2NoYWluLCBtZF91bmRlZmluZWRfc3ltYm9sLAorCXRjX2hlYWRlcnNfaG9vaywgbWRfb3BlcmFuZCwgbWRfbnVtYmVyX3RvX2NoYXJzKTogRG9uJ3QgdXNlIERFRlVOLgorCisJKiBNYWtlZmlsZS5pbiAoQ0hFQ0tGTEFHUyk6IERvbid0IHBhc3MgQVNfRk9SX1RBUkdFVCwKKwlDQ19GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQ7IHRoZXkncmUgbm90CisJdXNlZC4KKwkoQVNfRk9SX1RBUkdFVCwgQ0NfRk9SX1RBUkdFVCwgT0JKRFVNUCwgT0JKRFVNUF9GT1JfVEFSR0VULCBOTSwKKwlOTV9GT1JfVEFSR0VUKTogRG9uJ3QgZGVmaW5lLgorCShWTVNfT1RIRVJfT0JKUyk6IEFkZCB4bWFsbG9jLm8gYW5kIHhleGl0Lm8gZnJvbSBsaWJpYmVydHkuCisJKHRvb2xkaXIpOiBVc2UgZXhlY19wcmVmaXgsIG5vdCBsaWJkaXIuCisKK0ZyaSBEZWMgMTYgMTE6MDc6MTAgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuaDogSW5jbHVkZSBsaWJjb2ZmLmgsIG5vdCAuLi9iZmQvbGliY29mZi5oLgorCisJKiBhcy5oOiBJbmNsdWRlIHByb2dyZXNzLmguCisJKiBhcy5jIChtYWluKTogQ2FsbCBTVEFSVF9QUk9HUkVTUyBhbmQgRU5EX1BST0dSRVNTLgorCShtYWluLCBwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIFBST0dSRVNTLgorCitGcmkgRGVjIDE2IDAwOjQ2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgYmZkX2lzX3VuZF9zZWN0aW9uIGFuZAorCWJmZF9pc19hYnNfc2VjdGlvbiByYXRoZXIgdGhhbiBjb21wYXJpbmcgYWdhaW5zdCAmYmZkX3VuZF9zZWN0aW9uCisJYW5kICZiZmRfYWJzX3NlY3Rpb24uCisKK1RodSBEZWMgMTUgMTU6Mjc6MTQgMTk5NCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAobWRfYmVnaW4pOiBVc2UgYSBsb2NhbCB2YXJpYWJsZSB3aGVuCisJaW5pdGlhbGl6aW5nIG1kX3JlbGF4X3RhYmxlIHRvIGF2b2lkIGVycm9ycyBhYm91dCBtb2RpZnlpbmcgYQorCWNvbnN0IGRhdGEgc3RydWN0dXJlLgorCitUdWUgRGVjIDEzIDE1OjQyOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jICh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgT0JKX0VMRiBoYWNrIHdoaWNoCisJYXBwZWFycyB0byBubyBsb25nZXIgYmUgbmVlZGVkLgorCitUdWUgRGVjIDEzIDA4OjA0OjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBBY2NlcHQgQkZEX1JFTE9DX1BDUkVMKiB3aXRob3V0CisJcmVxdWlyaW5nIHRoYXQgdGhlIFhfb3Bfc3ltYm9sIGJlIGluIHRoZSB0ZXh0X3NlY3Rpb24uCisJKG1hY3JvKTogQ2hhbmdlIHRoZSB0ZXN0IGZvciBhIGxlZ2VsIGV4cHJlc3Npb24gZGlmZmVyZW5jZSB0bworCWNvcnJlc3BvbmQgdG8gY2hhbmdlcyBpbiBwc2V1ZG9fc2V0IGluIHJlYWQuYy4KKworRnJpIERlYyAgOSAyMTowNDoxNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpIFtSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEVdOiBVc2UKKwliZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgorCisJKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBJZiB0aGVyZSBpcyBubyBjdXJyZW50CisJcm91dGluZSwganVzdCByZXR1cm4uCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCwgY2FzZSAnQicsIHN1YmNhc2UgJ2MnKTogVXNlIG9wY29kZQorCXZhbHVlIGZyb20gcGF0dGVybiBpbnN0ZWFkIG9mIGFzc3VtaW5nIGpzci4KKwkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAoam1wKTogQWRkIGEgIjEsQmMiIGZvcm0uCisKK1RodSBEZWMgIDggMTc6NDg6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE5NX0ZPUl9UQVJHRVQpOiBVc2UgLi4vYmludXRpbHMvbm0ubmV3LCBub3QganVzdAorCXBsYWluIG5tLgorCisJKiBjb25maWd1cmUuaW4gKG5zMzJrLXBjNTMyLW1hY2gqKTogU2VsZWN0IGNvcnJlY3QgZW11bGF0aW9uLgorCShtaXBzLXNvbnktYnNkKik6IFVzZSBlY29mZi4KKwkobWlwcy0qLWdudSopOiBOZXcgdGFyZ2V0LCB1c2luZyBhb3V0IGZvcm1hdCwgZnJvbSBSb2xhbmQgTWNHcmF0aC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1R1ZSBOb3YgMjkgMTM6NTg6MTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCVVzZSBsaWJpYmVydHkgdmVyc2lvbiBvZiB4bWFsbG9jOgorCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUyk6IERlbGV0ZSB4bWFsbG9jLmMuCisJKE9CSlMpOiBEZWxldGUgeG1hbGxvYy5vLgorCSh4bWFsbG9jLm8pOiBEZWxldGUgZGVwZW5kZW5jaWVzLgorCSogYXMuYyAobWFpbik6IENhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIG9uY2UgcHJvZ3JhbSBuYW1lIGlzCisJa25vd24uCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChpbl9yYW5nZV9zaWduZWQsIGluX3JhbmdlX3Vuc2lnbmVkKTogTmV3CisJcm91dGluZXMsIHNwbGl0IGZyb20gaW5fcmFuZ2UuCisJKGluX3JhbmdlKTogRGVsZXRlZC4gIEFsbCBjYWxscyBjaGFuZ2VkIHRvIGluX3JhbmdlXypzaWduZWQuCisJKGNyZWF0ZV9saXRhX3NlY3Rpb24pOiBNYWNybyBkZWxldGVkLiAgU2luZ2xlIHVzZSBleHBhbmRlZCBpbgorCXBsYWNlLgorCShhbHBoYV9pcCk6IEhhbmRsZSBgdCcgYW5kIGA4JyBvcGVyYW5kIHR5cGVzLgorCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzEyX1BDUkVMLiAgUHJpbnQgbmFtZSBvZgorCXVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGVzLgorCSogY29uZmlnL2FscGhhLW9wY29kZS5oOiBBZGRlZCBIQUxUIGFuZCBEUkFJTkEuICBEaXNhYmxlZCBNT1ZJLAorCXNpbmNlIGl0IGRvZXNuJ3Qgd29yaywgYW5kIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgbmF0aXZlCisJYXNzZW1ibGVyLgorCisJKiBpbnB1dC1zY3J1Yi5jOiBDaGFuZ2Ugd29yZGluZyBvZiBhIGNvbW1lbnQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlCisJd2l0aCBDeWdudXMgc291cmNlLWNvbnRyb2wgdG9vbHMuCisKKwkqIGFzLmggKGVycm5vKSBbTkVFRF9ERUNMQVJBVElPTl9FUlJOT106IERlY2xhcmUuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBMaXN0IGJ1c2NyIGFuZCBwY3IgY29udHJvbAorCXJlZ2lzdGVycy4KKwkobTY4a19pcCwgY2FzZSAnSicpOiBIYW5kbGUgdGhlbS4KKworCURlbGV0ZSBzaWduYWwgaGFuZGxlciBjb2RlLiAgSXQncyBiZWVuIGRpc2FibGVkIHNpbmNlIE1hcmNoIDE5OTMKKwl3aXRob3V0IGNvbXBsYWludHMuCisJKiBhcy5jOiBEb24ndCBpbmNsdWRlIHNpZ25hbC5oLgorCShnb3Rfc2lnKTogVW51c2VkIGZ1bmN0aW9uIGRlbGV0ZWQsIGRlY2xhcmF0aW9uIGRlbGV0ZWQuCisJKFNJR1RZKTogTWFjcm8gZGVsZXRlZC4KKwkobWFpbik6IERlbGV0ZWQgZGlzYWJsZWQgY29kZSBmb3IgZXN0YWJsaXNoaW5nIHNpZ25hbCBoYW5kbGVyLgorCitNb24gTm92IDI4IDExOjM3OjM1IDE5OTQgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJbnNlcnQgbWlzc2luZyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJbGlrZSB3YXJuaW5nIHNheXMgd2UgZG8uCisKK01vbiBOb3YgMjggMDA6MTE6MTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKHBhX2NoZWNrX2VvZik6IERlY2xhcmUgbmV3IGV4dGVybiBmdW5jdGlvbi4KKwkodGNfZnJvYl9maWxlKTogRGVmaW5lIHRvIGNhbGwgcGFfY2hlY2tfZW9mLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSk6IE5ldworCWZ1bmN0aW9uIHRvIHZlcmlmeSB0aGUgY3VycmVudCBzcGFjZSBhbmQgc3Vic3BhY2UgYXJlIHJlYXNvbmFibGUuCisJQ2FsbCBmb3IgdGhlIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgYW5kIGJlZm9yZSBpbnN0cnVjdGlvbiBwYXJzaW5nLgorCShwYV9jaGVja19lb2YpOiBOZXcgZnVuY3Rpb24gdG8gdmVyaWZ5IGVudGVyL2V4aXQgYW5kIHByb2MvcHJvY2VuZAorCXBhaXJzIG1hdGNoIGF0IEVPRi4KKwkocGFfY29kZSk6IFNpbXBsaWZ5LgorCisJKiBjb25maWcvb2JqLXNvbS5jOiBEZWxldGUgI2lmIDAgY29kZS4KKworV2VkIE5vdiAyMyAxOTozNjowOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBiZXR3ZWVuIGNvZmYtc2hsIGFuZAorCWNvZmYtc2guCisJKiBjb25maWcvc2gubWggKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBHZXQgaXQgcmlnaHQuCisJKiBjb25maWcvdGMtc2guYyAgKGxpdHRsZSk6IE5ldyBmdW5jdGlvbi4KKwkobWRfcGFyc2Vfb3B0aW9uKTogTm90aWNlIG5ldyBvcHRpb24uCisJKGJ1aWxkX3JlbGF4LCBidWlsZF9NeXRlcywgbWRfYXRvZiwgbWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOgorCUNvcGUgd2l0aCBsaXR0bGUgZW5kaWFuIGRhdGEuCisJKiBjb25maWcvdGMtc2guaCAoQ09GRl9NQUdJQywgTElTVElOR19IRUFERVIpOiBFbmRpYW4gZGVwZW5kZW50LgorCitXZWQgTm92IDIzIDEwOjU0OjM4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIEVMRiB2YXJpYW50KTogUmV2ZXJ0IGxhc3QKKwljaGFuZ2UuICBUaGUgcmVhbCBidWcgd2FzIGluIGJmZC9lbGZjb2RlLmggYW5kIGhhcyBiZWVuIGZpeGVkLgorCitUdWUgTm92IDIyIDIzOjMxOjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIEVMRiB2YXJpYW50KTogQWRkIHNlY3Rpb24tPnZtYQorCXRvIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LgorCitUdWUgTm92IDIyIDE0OjM3OjU4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogRml4IHR5cG8uCisKK1R1ZSBOb3YgMjIgMTA6MjM6MjUgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV9zZXQpOiBJZ25vcmUgdGhlIC5zZXQgKG5vKW1vdmUgYW5kCisJICAuc2V0IChubyl2b2xhdGlsZSBkaXJlY3RpdmVzLgorCitUdWUgTm92IDE1IDIxOjQ0OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdWJzcGFjZSk6IE1ha2Ugc3VyZSB0byBhbHdheXMgcmVzZXQKKwljdXJyZW50X3N1YnNwYWNlLgorCShwYV90ZXh0LCBwYV9kYXRhKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2FsaWduKTogTmV3IGZ1bmN0aW9uLiAgQWxpZ25zIHRoZSBjdXJyZW50CisJb2Zmc2V0IHdpdGhpbiB0aGUgY3VycmVudCBzdWJzcGFjZSBhbG9uZyB3aXRoIHVwZGF0aW5nIHRoZQorCWFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaXRzZWxmLgorCShwYV9zdWJzcGFjZSk6IERlZmF1bHQgYWxpZ25tZW50IHRvIG9uZSBieXRlIHJhdGhlcm4gdGhhbiB6ZXJvCisJYnl0ZXMgdG8gYXZvaWQgc2V0dGluZyBhbGlnbm1lbnQgdG8gbG9nMigwKS4KKwkobWRfcHNldWRvX3RhYmxlKTogVXNlIHBhX2FsaWdubWVudCBmb3IgLmFsaWduLgorCitUdWUgTm92IDE1IDE1OjI0OjQ1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogQWx3YXlzIHB1dCBhIHNwYWNlIGFmdGVyICJmYXRhbCBlcnJvcjoiCisJd2hlbiBwcmludGluZyBtZXNzYWdlLgorCitUdWUgTm92IDE1IDExOjEwOjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWxldGUuCisJKHRjX2Zyb2Jfc3ltYm9sKTogTWFrZSBkZWZpbml0aW9uIGNvbmRpdGlvbmFsIG9uIE9CSl9TT00gb3IKKwlPQkpfRUxGLiAgRm9yIEVMRiBzdWJ0cmFjdCBvdXQgc3ltYm9sLT5zZWN0aW9uLT52bWEgZm9yIG5vbiBjb21tb24KKwlzeW1ib2xzLgorCitXZWQgTm92ICA5IDE0OjUzOjAzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90ZS1kZWx0YS5oOiBOZXcgZmlsZSwgZGVyaXZlZCBmcm9tIHRlLXN5c3YzMi5oLgorCitXZWQgTm92ICA5IDExOjUyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmYpOiBBbHdheXMgc2V0IGNvZmZfbGluZV9iYXNlLgorCitNb24gTm92ICA3IDAxOjU4OjQ5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byAyLjUuMy4KKworCSogY29uZmlndXJlLmluOiBDb21wYXJlIGdlbmVyaWMgY3B1IG5hbWUgYWdhaW5zdCAic3BhcmMiLCBub3QKKwkic3BhcmMqIiwgc2luY2Ugc3BhcmMgdmFyaWFudHMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gInNwYXJjIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEuCisKKwkqIGNvbmZpZy90Yy1hMjlrLmMgKG9jdGFsLCB0b0hleCk6IFZhcmlhYmxlcyBkZWxldGVkLgorCShpc29jdGFsKTogTWFjcm8gZGVsZXRlZC4KKwkobWRfYmVnaW4pOiBEb24ndCBpbml0aWFsaXplIHRoZW0uCisJKG1hY2hpbmVfaXAsIGNhc2UgJ1AnLydBJyk6IEZvciBhYnNvbHV0ZSBvcGVyYW5kLCBnZW5lcmF0ZSBhbgorCWVycm9yIG1lc3NhZ2UgaWYgaXQncyBvdXQgb2YgcmFuZ2UuCisJKG1kX2FwcGx5X2ZpeCwgY2FzZSBSRUxPQ19KVU1QVEFSRyk6IENoZWNrIHJhbmdlIGZvciBQQy1yZWxhdGl2ZQorCWp1bXBzLgorCShtZF9hcHBseV9maXgpOiBEZWxldGUgY29kZSBpbnNpZGUgIiNpZiAwIi4KKworVGh1IE5vdiAgMyAyMDoyMDo0MCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvZ28zMi5taDogVW51c2VkIGZpbGUgZGVsZXRlZC4KKworCSogcmVhZC5jIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IEluZGljYXRlIHRoYXQgdGhlIGVycm9yIG1heQorCW1lcmVseSBiZSB0aGF0IHRoZSBleHByZXNzaW9uIGNhbid0IGN1cnJlbnRseSBiZSByZWR1Y2VkLgorCitUaHUgTm92ICAzIDE2OjA5OjU5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIFRFX05ldEJTRCBkZWZpbmUgYXMKKwkgICJhLm91dC1tNjhrLW5ldGJzZCIuCisJKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IElmIFRFX05ldEJTRCBkZWZpbmUgYXMKKwkgICJhLm91dC1zcGFyYy1uZXRic2QiLgorCisJKiBjb25maWcvdGUtbmJzZC5oOiBOZXcgZmlsZSwgTmV0QlNEIHRhcmdldCBlbXVsYXRpb24KKwkqIGNvbmZpZy90ZS1uZXRic2QuaDogUmVtb3ZlZC4KKwkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1uZXRic2QqLG02OCotKi1uZXRic2QqLHNwYXJjKi0qLW5ldGJzZCopOgorCSAgU2V0IGJmZF9nYXMuICBVc2UgbmJzZCBlbXVsYXRpb24uCisKK1RodSBOb3YgIDMgMTc6NDQ6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCUNoYW5nZXMgZnJvbSBuZXQgMi41LjIgcmVsZWFzZSBicmFuY2g6CisKKwkqIGNvbmZpZ3VyZS5pbjogUHV0IEFDX0RFRklORShzcGFyY3Y5KSBvbiBpdHMgb3duIGxpbmUsIHNvIHRoYXQKKwl0aGUgc2hlbGwgdmFyaWFibGUgc2V0dGluZ3MgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBwZXJtYW5lbnQuICBGb3IKKwlDUFVzIHJlcXVpcmluZyBiZmRfZ2FzPXllcywgc2VsZWN0IGl0IGJhc2VkIG9uIENQVSBvbmx5LCBub3QKKwlpbmRpdmlkdWFsIHRhcmdldCBuYW1lcy4gIEhhbmRsZSBtNjhrLWhwLWhwdXgqLCBub3QganVzdCAtaHB1eC4KKworCSogY29uZmlnL3RjLXo4ay5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgZHVtbXkgYXJndW1lbnQKKwl0byBtYXRjaCBwcm90b3R5cGUgaW4gb2JqLWNvZmYuaC4KKworCSogY29uZmlndXJlLmluOiBTa2lwIHRlc3RzIGZvciBkZWZpbmluZyBXQU5UX0ZPUEVOX0JJTiBhbmQKKwlJQk1fQ09NUElMRVJfU1VYLgorCSogYWNjb25maWcuaDogRGVsZXRlZCB0aGVtLgorCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4wLgorCSogY29uZmlnL2dvMzIuY2ZnLCBjb25maWcvdm1zLWNvbmYuaDogVXBkYXRlZC4KKworCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIsIG1kX2NvbnZlcnRfZnJhZ18xKTogQWx3YXlzIHVzZQorCUlCTV9DT01QSUxFUl9TVVggdmVyc2lvbiBvZiBjb2RlLCB3aXRoIGNvbW1lbnRzIGluZGljYXRpbmcgd2h5LgorCisJKiBsaXN0aW5nLmMgKGZpbGVfaW5mbyk6IFVzZSB0ZXh0IG1vZGUgd2hlbiBvcGVuaW5nIGZpbGUgZm9yIHJlYWQuCisJVXNlICJyIiBkaXJlY3RseSwgbm8gbWFjcm8uCisJKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IERvbid0IHVzZSBGT1BFTl9SVCwganVzdCB1c2UKKwkiciIuCisJKiByZWFkLmMgKHNfaW5jbHVkZSk6IERpdHRvLgorCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogVHJ5IGJvdGggIndiIiBhbmQgInciLCBkb24ndAorCWJvdGhlciB3aXRoIEZPUEVOXyogbWFjcm9zLgorCSogYXMuaDogRG9uJ3QgaW5jbHVkZSBmb3Blbi0qLmguCisKKwkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogTWFrZSAicmV0IiB3aXRoIG5vIG9wZXJhbmRzIGVxdWl2YWxlbnQgdG8KKwkicmV0IHplcm8sKHJhKSIsIHRvIG1hdGNoIE9TRjEgYW5kIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBib3RoCisJb25lLW9wZXJhbmQgZm9ybXMuCisKKwlQYXRjaGVzIGZyb20gREogRGVsb3JpZToKKwkqIGFzLmggKGFsbG9jYSk6IHVuZGVmIGFsbG9jYSBiZWZvcmUgZGVmaW5pbmcgaXQganVzdCBpbiBjYXNlCisJKiBjb25maWcvZ28zMi5jZmc6IG5ldyBmaWxlIGZvciBhdXRvY29uZiB2YWx1ZXMKKwkqIGNvbmZpZy90ZS1nbzMyLmg6IG5ldyBmaWxlCisJKiBjb25maWd1cmUuYmF0OiBuZXcgZm9yIGF1dG9jb25mCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRml4IHR5cG8gaW4gR09UUEMgY2hlY2s7IGhhZCA9CisJZm9yID09LgorCisJKiBjb25maWd1cmUuaW46IElmIHRhcmdldF9mcmFnIGRvZXNuJ3QgZXhpc3QsIHVzZSAvZGV2L251bGwuCisKKwkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBGb3Igbm9uLVZNUyBzeXN0ZW1zLCByZS1hZGQgYHYnIHRvCisJc3RkX3Nob3J0b3B0cy4gIEFkZCAidmVyYm9zZSIgdG8gbGlzdCBvZiBsb25nIG9wdGlvbnMuCisKKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogV2hlbiBnZW5lcmF0aW5nIGFuIGFic29sdXRlIHNlY3Rpb24KKwlzeW1ib2wgYXMgYSBwbGFjZWhvbGRlciwgZG9uJ3QgbWFyayBpdCBhcyB1c2VkIGluIGEgcmVsb2NhdGlvbgorCWVudHJ5LCBoZXJlLgorCisJKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IENvbXBhcmUgdXNpbmcgbWFrZWZpbGUgY29kZSBmcm9tIGdjYywKKwlzdHJpcHBlZCBkb3duIHRvIGRpc2NhcmQgc3ViZGlyIHN0dWZmIGFuZCBhZGFwdGVkIHRvIGdpdmUgYQorCW5vbi16ZXJvIGV4aXQgc3RhdHVzIGlmIGVpdGhlciBmaWxlIGRpZmZlcnMuCisKK1RodSBOb3YgIDMgMTU6NDM6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBGaXggUkVMQVhfRU5DT0RFIGFyZ3VtZW50cyBmb3IKKwlOT19QSUMgY2FzZS4KKworVHVlIE5vdiAgMSAxNjoxMDo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKHNfY2hhbmdlX3NlYyk6IElmIG5vdCBHUE9QVCwgZG9uJ3QgcGVybWl0CisJc3dpdGNoaW5nIHRvIHRoZSByZWFkb25seSBkYXRhIHNlY3Rpb24uCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV90eXBlKTogRml4IHdhcm5pbmcgbWVzc2FnZS4KKworU3VuIE9jdCAzMCAwMDo1NzozNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvYyk6IERlbGV0ZSBkaXNhYmxlZCBjb2RlIHRvIHB1dCBlYWNoCisJcHJvYyBpbiBpdHMgb3duIHN1YnNwYWNlLCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0LgorCitUdWUgT2N0IDI1IDE0OjQ0OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBFbnN1cmUgdGhhdCBtaXBzMiBjYXNlIG9mIE1fTElfREQgaW4KKwkucmRhdGEgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2NwdSk6IEluaXRpYWxpemUgdG8gLTEuCisJKG1kX2JlZ2luKTogRG9uJ3QgbWlwc19jcHUgaWYgaXQgd2FzIGFscmVhZHkgc2V0LgorCShtZF9wYXJzZV9vcHRpb24pOiBGb3IgLW1pcHNOLCBkb24ndCBzZXQgbWlwc19jcHUgaWYgaXQgd2FzCisJYWxyZWFkeSBzZXQuICBGb3IgLW1jcHU9LCBqdXN0IHNldCBtaXBzX2NwdSwgbm90IG1pcHNfaXNhLgorCitGcmkgT2N0IDIxIDIwOjQyOjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgT0JKX0VMRiwgaGFuZGxlIC5zZWN0aW9uLgorCShzX2VsZl9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBEb24ndCBhYm9ydCBpZiB3ZSBkb24ndCByZWNvZ25pemUKKwl0aGUgc2VjdGlvbiB3aGVuIHNldHRpbmcgdGhlIHN0b3JhZ2UgY2xhc3M7IGRlZmF1bHQgdG8gc2NfRGF0YS4KKworVGh1IE9jdCAyMCAwMDo0MzozOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogU2V0IG5ld192YWwgdG8gOCBmb3IgYWxsCisJZml4dXBzIHRvIGJyYW5jaCBpbnN0cnVjdGlvbnMgKG5vdCBqdXN0IHBjLXJlbGF0aXZlIG9uZXMpIHdoaWNoCisJd2lsbCBnZW5lcmF0ZSBTT00gcmVsb2NhdGlvbnMuCisKK1dlZCBPY3QgMTkgMTM6NDE6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYTI5ay5jOiBJbmNsdWRlIGN0eXBlLmggd2l0aCBhbmdsZSBicmFja2V0cy4KKwkoZGVmaW5lX3NvbWVfcmVncyk6IEFkZCBuZXcgc3BlY2lhbCByZWdpc3RlciBuYW1lcyBkZWZpbmVkIG9uIHRoZQorCTI5MDQwLgorCShwYXJzZV9vcGVyYW5kKTogQWRkIGFyZ3VtZW50IG9wdC4gIElmIG5vbi16ZXJvLCBkb24ndCB3YXJuIGFib3V0CisJYSBtaXNzaW5nIG9wZXJhbmQuCisJKG1hY2hpbmVfaXApOiBJZiBoYW5kbGluZyBhcmd1bWVudCB0eXBlICdJJywgcGFzcyBvcHQgYXMgbm9uLXplcm8KKwl0byBwYXJzZV9vcGVyYW5kLiAgSGFuZGxlIG5ldyBvcHRpb25hbCBvcGVyYW5kIHR5cGUgJ0knLgorCShtZF91bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgKHNyTk4pLgorCitUdWUgT2N0IDE4IDAwOjQ1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogd3JpdGUuYyAocmVudW1iZXJfc2VjdGlvbnMpOiBOZXcgc3RhdGljIEJGRF9BU1NFTUJMRVIgZnVuY3Rpb24uCisJKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBpdCBhZnRlciByZW1vdmluZyBnYXMgY3JlYXRlZCBzZWN0aW9ucy4KKworTW9uIE9jdCAxNyAxODowNjowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IFVzZSB1ZGF0YS5wLCBub3QganVzdCB1ZGF0YS4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lY29mZl9zZXRfZXh0KTogTGlrZXdpc2UuCisJKGVsZl9nZXRfZXh0cik6IExpa2V3aXNlLgorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYXNfd2hlcmUgaXMKKwl1bnNpZ25lZCBpbnQgKiwgbm90IGludCAqLgorCitNb24gT2N0IDE3IDAyOjI2OjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jOiBFbGltaW5hdGUgYWxsIHVzZXMgb2YgZnhfYWRkbnVtYmVyLgorCSh0Y19nZW5fcmVsb2MpOiBTaW1wbGlmeS4gIEl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBzZXQgYQorCXJlbG9jJ3MgYWRkZW5kIGZpZWxkIHRvIHplcm8gZm9yIGZ1bmN0aW9uIHN5bWJvbHMuCisJKG1kX2FwcGx5X2ZpeCk6IFNpbXBsaWZ5LiAgRm9yIGZpeHVwcyB3aGljaCB3aWxsIHJlcXVpcmUgYSBTT00KKwlyZWxvYywganVzdCBjbGVhciBvdXQgdGhlIG5lY2Vzc2FyeSBiaXRzIGluIHRoZSBvdXRwdXQgZmlsZS4KKworRnJpIE9jdCAxNCAxOTowNjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQklTT04pOiBVc2UgYmlzb24gLXksIG5vdCBiaXNvbi4KKworVGh1IE9jdCAxMyAxOToyMjo1NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gMi41LgorCShjbGVhbi1oZXJlKTogRGVsZXRlIHN0YW1wLW1rLmNvbS4KKwkoZGlzdGNsZWFuKTogRGVsZXRlIC5nZGJpbml0LgorCSogVmVyc2lvbiAyLjUgcmVsZWFzZWQuCisKK1dlZCBPY3QgMTIgMjA6MzA6NTEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RlLW5ic2Q1MzIuaDogUmVuYW1lZCBmcm9tIHRlLW5ldGJzZDUzMi5oLgorCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkanVzdGVkLgorCitXZWQgT2N0IDEyIDE2OjMzOjM4IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2NwbHVzLWRlbS5jOiBSZW1vdmVkLiAgSXQgaXNuJ3QgdXNlZC4gIEV2ZW4gaWYgaXQgd2FzLAorCSAgaXQncyBiZXR0ZXIgdG8gdXNlIHRoZSBvbmUgaW4gbGliaWJlcnR5LgorCitXZWQgT2N0IDEyIDE4OjQ4OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBVbmRvIGxhc3QKKwljaGFuZ2U7IGl0IGJyZWFrcyB0aGUgcnM2MDAwIHN1cHBvcnQsIGFuZCBkb2Vzbid0IHNlZW0gdG8gYmUKKwluZWVkZWQuCisKK1dlZCBPY3QgMTIgMTE6NTY6NTAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaTM4Ni5oLHRlLW5ldGJzZDUzMi5oIChUQVJHRVRfRk9STUFUKTogQ2hhbmdlZCB0bworCSAgYS5vdXQtPGFyY2g+LW5ldGJzZCB0byBtYXRjaCBjb3JyZXNwb25kaW5nIGNoYW5nZXMgaW4gQkZELgorCitXZWQgT2N0IDEyIDExOjA2OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMKKwlyYXRoZXIgdGhhbiBleHBsaWNpdGx5IGFkZGluZyB0aGUgZnJhZyBhZGRyZXNzLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBBZGQgYSB6ZXJvIGVudHJ5IHRvIG1hcmsKKwl0aGUgZW5kIG9mIHRoZSBsaW5lIG51bWJlcnM7IHRoaXMgcmVwbGFjZXMgdGhlIHplcm8gZW50cnkgd2hpY2gKKwl1c2VkIHRvIGJlIGFkZGVkIGJ5IGNvZmZfYWRkX2xpbmVzeW0sIHJlbW92ZWQgT2N0IDcuCisJKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IElnbm9yZSBzZWN0aW9ucyB3aXRoIG5vIHNlZ2luZm8uCisKK1dlZCBPY3QgMTIgMDE6NDE6MzcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IENyZWF0ZSBhCisJInN0YWdlIiBzeW1saW5rIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGFnZSogZGlyZWN0b3J5LCBhbmQgdXNlIGl0CisJaW5zdGVhZCBpbiB0aGUgLUIgb3B0aW9ucy4KKwkoY29tcGFyaXNvbik6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCisKK1R1ZSBPY3QgMTEgMTY6NDg6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEZvciBub24tYS5vdXQgcmVsb2NhdGlvbnMsIGlmCisJcGMtcmVsYXRpdmUsIHVzZSBmeF9vZmZzZXQgb25seSwgaWdub3JlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4KKworVHVlIE9jdCAxMSAxNToyNDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB1c2UgU19JU19MT0NBTCB3aGVuIGNoZWNraW5nCisJZm9yIGFuIGVtYmVkZGVkIFBJQyBzd2l0Y2ggZXhwcmVzc2lvbiwgc2luY2UgdGhlIGRlZmluaXRpb24gb2YKKwlTX0lTX0xPQ0FMIHdhcyBjaGFuZ2VkLgorCitUdWUgT2N0IDExIDE1OjA1OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IFdoZW4gY29tcGFyaW5nIGFzLm5ldyBvciBnYXNwLm5ldywgdHJ5CisJcnVubmluZyB0aGUgYmluYXJ5IHRocm91Z2ggc2VkIHRvIGF2b2lkIGRpZmZlcmVuY2VzIGR1ZSB0bworCSJzdGFnZTEiIG9yICJzdGFnZTIiIGhhdmluZyBiZWVuIHdyaXR0ZW4gaW50byB0aGUgYmluYXJ5LgorCitTYXQgT2N0ICA4IDAxOjQ4OjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJRUxGIHN5bWJvbCBzaXplIGhhbmRsaW5nLCBiYXNlZCBvbiBjb2RlIGZyb20gRXJpYyBZb3VuZ2RhbGU6CisJKiBjb25maWcvb2JqLWVsZi5oIChPQkpfU1lNRklFTERfVFlQRSk6IE5ldyBtYWNyby4gIEFkZHMgYW4KKwlleHByZXNzaW9uIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCBzdHJ1Y3R1cmUsIHVzZWQgZm9yIGBzaXplJworCWV4cHJlc3Npb25zIHRoYXQgY291bGRuJ3QgYmUgcmVkdWNlZCB0byBjb25zdGFudHMgd2hlbiBpbml0aWFsbHkKKwlwcm9jZXNzZWQuCisJKGVsZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCisJKG9ial9mcm9iX3N5bWJvbCk6IENhbGwgZWxmX2Zyb2Jfc3ltYm9sIGFsd2F5cywgcmF0aGVyIHRoYW4KKwllY29mZl9mcm9iX3N5bWJvbCBvbmx5IGlmIEVDT0ZGX0RFQlVHR0lORyBkZWZpbmVkLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERlbGV0ZWQgdW51c2VkIGNvZGUuCisJQ2xlYXIgc3lfb2JqIGZpZWxkLgorCShvYmpfZWxmX3NpemUpOiBEZWxldGVkIHVudXNlZCBjb2RlLiAgSWYgc2l6ZSBpcyBub24tcmVkdWNpYmxlCisJZXhwcmVzc2lvbiwgYWxsb2NhdGUgc29tZSBzdG9yYWdlIGZvciB0aGUgc3lfb2JqIGZpZWxkIGFuZCBjb3B5CisJdGhlIGV4cHJlc3Npb24uCisJKGVsZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIENvbXB1dGVzIHNpemVzLCBjYWxscworCWVjb2ZmX2Zyb2Jfc3ltYm9sIGlmIGFwcHJvcHJpYXRlLgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRm9yIGkzODYgZWxmIGFuZCBjb2ZmIChmb3Igbm93KSwgZG9uJ3QKKwlhZGQgaW4gdmFsdWUgb2Ygc3ltYm9sIGZyb20gYW5vdGhlciBkZWZpbmVkIHNlY3Rpb24gb2YgdGhlIGZpbGUuCisKK0ZyaSBPY3QgIDcgMTc6NTQ6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW04OGsuaCAoVENfS0VFUF9GWF9PRkZTRVQpOiBEZWZpbmUuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFRlc3Qgb25seSBUQ19LRUVQX0ZYX09GRlNFVCwKKwlyYXRoZXIgdGhhbiBib3RoIGl0IGFuZCBUQ19NODhLLgorCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBOZXcgZnVuY3Rpb24uCisJKGNvZmZfZnJvYl9zZWN0aW9uKTogRm9yIG5vbi1lbXB0eSBzZWN0aW9ucywgY3JlYXRlIGF1eCBlbnRyeSBmb3IKKwl0aGUgc2VjdGlvbiBzeW1ib2wsIGluZGljYXRpbmcgdGhlIHNpemUuCisJKG5fbGluZV9ub3MpOiBOZXcgdmFyaWFibGUuCisJKGFkZF9saW5lbm8pOiBJbmNyZW1lbnQgaXQuCisJKGNvZmZfYWRkX2xpbmVzeW0pOiBJbmNyZW1lbnQgbl9saW5lX25vcywgZG9uJ3QgY2FsbCBhZGRfbGluZW5vLgorCShjb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbjsgbWFwIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyBvdmVyCisJc2VjdGlvbnMuCisJKG9ial9jb2ZmX2xpbmUpOiBPbmx5IHJlc2V0IGxpbmVfYmFzZSBmb3IgLmJmIHN5bWJvbHMuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zLCBjb2ZmX2Zyb2JfZmlsZSk6CisJRGVjbGFyZS4KKwkob2JqX2Zyb2JfZmlsZSk6IE5ldyBtYWNyby4KKworCSogY29uZmlnL29iai1jb2ZmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogUmVuYW1lZCBmcm9tCisJb2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wsIGFuZCByZXdyaXR0ZW4gZm9yIG5ldyBwYXJhbWV0ZXIgbGlzdC4KKworCU1vbiBPY3QgIDMgMjE6MDI6MzggMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIGNvbmZpZy9vYmotdm1zLmggKFNfSVNfTE9DQUwpOiBmaXggb2Jzb2xldGUgZmxhZ3NlZW5bXSByZWZlcmVuY2UuCisKK1dlZCBPY3QgIDUgMTE6NDk6MjYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBY2NlcHQgLmVzaXplIGFuZCAuZXR5cGUKKwlhcyBzeW5vbnltcyBmb3IgLnNpemUgYW5kIC50eXBlLgorCitXZWQgT2N0ICA1IDAwOjA4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zZWN0aW9uKTogUmVtb3ZlIGFzc2VydCBhYm91dAorCXNlY3Rpb24gYWxpZ25tZW50LgorCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBVc2Ugc2VjdGlvbiBhbGlnbm1lbnQsIG5vdAorCXh2ZWMgYWxpZ25fcG93ZXJfbWluIGZpZWxkLgorCitGcmkgU2VwIDMwIDE5OjA1OjIwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiB2bXNjb25mLnNoIChtYWtlLWdhcy5jb20pOiBoYW5kbGUgRENMIHZlcmlmaWNhdGlvbiB0byBlbmFibGUKKwlzZW5zaWJsZSBmZWVkYmFjayB0byB0aGUgdXNlciB3aGlsZSBnYXMgaXMgYmVpbmcgYnVpbHQuCisKK0ZyaSBTZXAgMzAgMTY6MjM6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZSwgbGlzdGluZyBvbmx5IG1ha2UtZ2FzLmNvbQorCWZvciBub3cuCisJKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQ7IGJ1aWxkcyBESVNUU1RVRkYuCisJKHJlYWxjbGVhbik6IFNlcGFyYXRlIHRhcmdldCwgZGVwZW5kIG9uIGNsZWFuIGFuZCBkaXN0Y2xlYW4sIHRoZW4KKwlkZWxldGUgRElTVFNUVUZGLgorCSogbWFrZS1nYXMuY29tOiBEZWxldGVkLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X3ZhbGlkYXRlX2ZpeCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcKKwlmdW5jdGlvbi4gIENvbnZlcnRzIHJlbG9jIGZvciAiZm9vLUdPVCIgdG8gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKKwlyZWxvYyBmb3IgImZvbyIuCisJKGkzODZfb3BlcmFuZCk6IERvbid0IGxvb2sgdXAgc2VjdGlvbiBzeW1ib2wgZm9yCisJdW5kZWZpbmVkX3NlY3Rpb24uCisJKHJlbG9jKTogQWx3YXlzIHBlcm1pdCByZXR1cm4gb2YgOC0gYW5kIDE2LWJpdCByZWxvY2F0aW9uIHR5cGVzLgorCUFkZCBhIHNwYWNlIGFmdGVyICJwYy1yZWxhdGl2ZSIgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCisJKHRjX2kzODZfZml4X2FkanVzdGFibGUpIFtCRkRfQVNTRU1CTEVSXTogUmVqZWN0CisJQkZEX1JFTE9DXzM4Nl9HT1RPRkYgcmVsb2NzLgorCShpMzg2X29wZXJhbmQpOiBGb3IgYW55IEdPVE9GRiByZWxvYywgY29udmVydCBpdCB0byBhIEJGRF9SRUxPQ18zMgorCXdpdGggYSAiZm9vLUdPVCIgdmFsdWUuCisJKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3ZhbGlkYXRlX2ZpeCk6IERlY2xhcmUgaXQuCisJKFRDX1ZBTElEQVRFX0ZJWCk6IE5ldyBtYWNybyAtLSBjYWxsIGl0LgorCShOT1BfT1BDT0RFKTogQ2FzdCB0byBgY2hhcicgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisKKwkqIGFzLmg6IElmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkIGFuZCB2YXJhcmdzLmggaXMgYXZhaWxhYmxlLCB1c2UKKwlpdCByYXRoZXIgdGhhbiBzdGRhcmcuaC4KKworCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZGVkIG5ldyBiaXRmaWVsZCBmeF9wbHQsIGZvciBmaXh1cHMKKwlyZWZlcnJpbmcgdG8gUExUIGVudHJpZXMuCisJKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9wbHQgdG8gemVyby4KKwkoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZS1mZXRjaCBgc3ltJyBhZnRlciB0b3Agb2YgcmVkdWN0aW9uIGxvb3AuCisJRG9uJ3QgYWRqdXN0IGZ4X29mZnNldCBieSBmcmFnIGFkZHJlc3MsIHNpbmNlIFNfR0VUX1ZBTFVFIG5vdworCWluY2x1ZGVzIHRoZSBmcmFnIGFkZHJlc3MuCisJKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2VkIGxvY2FsIHZhciBQQ1JFTCB0byB0eXBlIGludCwgYWRkZWQgUExULgorCUlmIFBDLXJlbGF0aXZlIGZpeHVwIHJlZmVycyB0byBhIFBMVCBlbnRyeSBmb3IgYSBzeW1ib2wgaW4gdGhlCisJY3VycmVudCBzZWN0aW9uLCBkb24ndCByZWR1Y2UgaXQuCisKKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogIEV4aXQgbG9vcCB0aHJvdWdoIGEgbGFiZWwuICBJZgorCURFQlVHNSBpcyBkZWZpbmVkLCBwcmludCBvdXQgZWFjaCBmaXh1cCBiZWZvcmUgYW5kIGFmdGVyCisJcHJvY2Vzc2luZy4KKwkoZml4dXBfc2VnbWVudCk6IElmIERFQlVHNSBpcyBkZWZpbmVkLCBwcmludCBvdXQgZWFjaCBmaXh1cCBiZWZvcmUKKwlhbmQgYWZ0ZXIgcHJvY2Vzc2luZy4KKwkocHJpbnRfZml4dXApOiBBZGRlZCBwcm90b3R5cGUuICBTaG93IGFkZHJlc3Mgb24gZmlyc3QgbGluZS4gIFNob3cKKwlmeF9vZmZzZXQgYW5kIGZ4X3N1YnN5LiAgWyFCRkRfQVNTRU1CTEVSXTogT25seSBzaG93IGZ4X3JfdHlwZSBpZgorCU5FRURfRlhfUl9UWVBFIGlzIGRlZmluZWQuCisKKwkqIHN5bWJvbHMuYyAocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBDaGVjayBTX0lTX0xPQ0FMLCBTX0lTX0VYVEVSTiwKKwlTX0lTX0RFQlVHLCBTX0lTX0RFRklORUQgYWxzby4KKworVGh1IFNlcCAyOSAxODo1NzowNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIG9uIC5nZGJpbml0LgorCSguZ2RiaW5pdCk6IFJlYnVpbGQgZnJvbSBnZGJpbml0LmluIGJ5IHJ1bm5pbmcgY29uZmlnLnN0YXR1cy4KKworCSogZ2RiaW5pdC5pbjogRGVmaW5lIG5ldyBmdW5jdGlvbiAicGYiLiAgRml4IGRvYyBvbiAicGUiIGFuZCAicHMiLgorCisJKiB3cml0ZS5jIChwcmludF9maXh1cCk6IFByaW50IHNvdXJjZSBsb2NhdGlvbiBvbiBmaXJzdCBsaW5lLgorCVNob3cgZnhfcl90eXBlIGFuZCBmeF9hZGRzeSBmaWVsZHMuCisKK1dlZCBTZXAgMjggMTQ6NTY6MzkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyBmb3IgYWxsIHNwYXJjIHRhcmdldHMgaW4gb25lIHBsYWNlLAorCWluc3RlYWQgb2Ygc2VwYXJhdGVseSBmb3IgZWFjaC4gIENvcnJlY3RseSBoYW5kbGUgdXNlci1zdXBwbGllZAorCSItLWVuYWJsZS1iZmQtZ2FzIiBvcHRpb24uCisKKwkqIGdkYmluaXQuaW46IE1vdmUgImJyZWFrIGFib3J0IiB0byBlbmQsIGluIGNhc2UgZ2RiIGNvbXBsYWlucy4KKworCSogYXMuaCAoUFJJTlRGX1dIRVJFX0xJS0UsIFBSSU5UX0xJS0UpIFtVU0VfU1REQVJHLCAhX19HTlVDX19dOgorCVVzZSBQQVJBTVMgbWFjcm8uCisKKwkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBEb24ndCBkbyBhbnkKKwlwcm9jZXNzaW5nIGlmIGFkZF9zeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGluIGV4cHJfc2VjdGlvbi4KKwkocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19hZGQpOiBGb3Igc3ltYm9sIHBsdXMKKwljb25zdGFudC12YWx1ZWQgc3ltYm9sLCBjb252ZXJ0IHRvIE9fc3ltYm9sIGFuZCByZS1yZWR1Y2UuCisJKFNfR0VUX1ZBTFVFKTogSWYgc3ltYm9sIG5lZWRzIHJlc29sdmluZywgcmVzb2x2ZSBpdC4KKwkoaW5kZW50X2xldmVsKTogTm8gbG9uZ2VyIHN0YXRpYy4KKwkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEb24ndCBwcmludCBmcmFnIGFkZHJlc3MgaWYgaXQgbWF0Y2hlcworCXplcm9fYWRkcmVzc19mcmFnLiAgRG9uJ3QgcHJpbnQgInJlc29sdmluZyIgaWYgYWxyZWFkeSByZXNvbHZlZC4KKwlQcmludCBzZWdtZW50IG5hbWUuICBEb24ndCBjYWxsIHByaW50X2V4cHJfMSBvbiBhbiB1bmRlZmluZWQKKwlzeW1ib2wuCisJKHByaW50X2V4cHJfMSk6IEZpeCB3aGl0ZXNwYWNlIGJlZm9yZSBwcmludGluZyBYX2FkZF9udW1iZXIuCisKKwkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IE5vIGxvbmdlciBzdGF0aWMuICBVc2Ugc3ltYm9sX2NyZWF0ZSwKKwlub3Qgc3ltYm9sX25ldywgZm9yIHN5bWJvbHMgaG9sZGluZyBleHByZXNzaW9uIHZhbHVlcy4KKwkqIGV4cHIuaCAobWFrZV9leHByX3N5bWJvbCk6IE1vdmUgZGVjbGFyYXRpb24gaGVyZS4KKwkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogSGFuZGxlIE9fYWRkIGJ5IGNyZWF0aW5nIGFuCisJZXhwcmVzc2lvbi12YWx1ZWQgc3ltYm9sLCBhbmQgY2FsbGluZyBmaXhfbmV3X2V4cCByZWN1cnNpdmVseS4KKwkoYWRqdXN0X3JlbG9jX3N5bXMpOiBJZiBhIGZpeHVwJ3Mgc3ltYm9sIHZhbHVlIGlzIGEgc3VtIG9mIGFuCisJdW5kZWZpbmVkIHN5bWJvbCBhbmQgYSBjb25zdGFudCwgZm9sZCB0aGUgY29uc3RhbnQgaW50byB0aGUgZml4dXAsCisJYW5kIHJlZmVyIHRvIHRoZSB1bmRlZmluZWQgc3ltYm9sIGRpcmVjdGx5LiAgVGhlbiBwcm9jZXNzIHRoZQorCWZpeHVwIGFnYWluIGZyb20gc2NyYXRjaC4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBCZWZvcmUgY2FsbGluZyBhZGp1c3RfcmVsb2Nfc3ltcywgbWFrZSBhIHBhc3MKKwl0aHJvdWdoIHRoZSBzeW1ib2wgbGlzdCB0cnlpbmcgdG8gcmVzb2x2ZSB2YWx1ZXMuCisKKwkqIHdyaXRlLmMgKHByaW50X2ZpeHVwKTogTmV3IHJvdXRpbmUsIGZvciBkZWJ1Z2dpbmcuCisJKHdyaXRlX3JlbG9jcyk6IENhbGwgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIERlbGV0ZWQgdmFyaW91cworCWhhY2tzIGZvciB3b3JraW5nIGFyb3VuZCBwcm9ibGVtcyB3aXRoIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlIHRvIDIuNC45MC4KKworV2VkIFNlcCAyOCAxMTo1MDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChnYXNwLm8pOiBEZXBlbmRzIHVwb24gY29uZmlnLmguCisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgorCShtZF9hcHBseV9maXgpOiBJZiBhbiB1bmNvbmRpdGlvbmFsIGIgb3IgYmFsIG92ZXJmbG93cywgYW5kIHdlIGFyZQorCW5vdCBhc3NlbWJsaW5nIFBJQyBjb2RlLCByZXBsYWNlIGl0IHdpdGggYSBqIG9yIGphbC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQ29ycmVjdCBicmFuY2ggb3ZlcmZsb3cgdGVzdC4KKwlVc2UgYXNfYmFkX3doZXJlIGFuZCBhc193YXJuX3doZXJlIHJhdGhlciB0aGFuIGFzX2JhZCBhbmQgYXNfd2Fybi4KKworTW9uIFNlcCAyNiAxNzoxNTo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEFkZCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvCisJYXNfZmF0YWwgY2FsbHMuICBIYW5kbGUgYmZkX3JlbG9jX292ZXJmbG93IGNhc2Ugc3BlY2lmaWNhbGx5IHdoZW4KKwlSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUuCisKK0ZyaSBTZXAgMjMgMTY6MTE6MjggMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYXMuaCAoVVNFX1NUREFSRywgVVNFX1ZBUkFSR1MpOiBEZWZpbmUgb25lIG9yIG5laXRoZXIgb2YgdGhlc2UKKwloZXJlLiAgVXNlIHRoZW0gZm9yIGRlY2lkaW5nIHdoaWNoIFBSSU5URipMSUtFIG1hY3JvIGRlZmluaXRpb25zCisJdG8gdXNlLgorCSogbWVzc2FnZXMuYzogVXNlIHRoZW0sIGluc3RlYWQgb2YgTk9fU1REQVJHLCBOT19WQVJBUkdTLgorCVshVVNFX1NUREFSRyAmJiAhVVNFX1ZBUkFSR1NdICh2YV9hbGlzdCwgdmFfZGNsLCAuLi4pOiBQcm92aWRlCisJZGVmYXVsdCBkZWZpbml0aW9ucyBtYXRjaGluZyB3aGF0IHdlIHdlcmUgZG9pbmcgYmVmb3JlLgorCShhc190c2t0c2spOiBSZW1vdmUgdGhlIG5vbi1zdGRhcmcsIG5vbi12YXJhcmdzIHZlcnNpb24sIGFuZAorCWFsd2F5cyB1c2UgdGhlIHZhcmFyZ3MgZm9ybSBpZiBub3QgdXNpbmcgc3RkYXJnLiAgSXQncyBzYWZlIHRvCisJYWx3YXlzIHVzZSB2ZnByaW50ZiwgYmVjYXVzZSBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGl0IGlmIHRoZQorCW5hdGl2ZSBzeXN0ZW0gZG9lc24ndC4gIEFsc28sIGFsd2F5cyBtYWtlIGZvcm1hdCBiZSBjb25zdC4KKwkoYXNfd2FybiwgYXNfd2Fybl93aGVyZSwgYXNfYmFkLCBhc19iYWRfd2hlcmUsIGFzX2ZhdGFsKTogRGl0dG8uCisKK0ZyaSBTZXAgMjMgMTQ6NDI6MzQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogQWx3YXlzIHVzZSBhZGRpdSB3aGVuIGFkZGluZyBhCisJY29uc3RhbnQgdG8gJHplcm8tLW5vIG5lZWQgdG8gdXNlIGRhZGRpdS4KKwkobWFjcm8pOiBIYWNrIHRoZSAtbWlwczMgb3ZlcmZsb3cgdGVzdHMgdG8gbm90IGZhaWwgd2hlbiBvZmZzZXRUCisJaXMgb25seSAzMiBiaXRzLgorCisJKiBzeW1ib2xzLmggKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBEZWNsYXJlLgorCitUaHUgU2VwIDIyIDIxOjU4OjI0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYzogQnVnZml4ZXMgYmFzZWQgaW4gcGFydCBvbiBwYXRjaGVzIGZyb20gUGF1bAorCUtyYW5lbmJ1cmcuCisJKGxpc3RpbmdfbmV3bGluZSk6IENoZWNrIGZpbGVuYW1lIGFzIHdlbGwgYXMgbGluZSBudW1iZXIgd2hlbgorCWRlY2lkaW5nIHdoZXRoZXIgdG8gcmVjb3JkIGl0LgorCShsaXN0X3N5bWJvbF90YWJsZSkgW1NfSVNfUkVHSVNURVJdOiBDaGVjayB0aGF0IFNfSVNfUkVHSVNURVIgaXMKKwlmYWxzZSAoaWYgZGVmaW5lZCkgYXMgd2VsbCBhcyBjaGVja2luZyBmb3IgcmVnX3NlY3Rpb24uCisJKGxpc3RpbmdfbGlzdGluZyk6IEl0ZXJhdGUgZmV0Y2hpbmcgbGluZXMgd2hpbGUgbGluZSBudW1iZXIgaXMgdG9vCisJbG93LCBhbmQgd2UgaGF2ZW4ndCBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisKKwkqIGNvbmZpZy92bXMtY29uZi5oOiBDaGFuZ2VkIEhBVkVfREVMRVRFIHRvIEhBVkVfUkVNT1ZFLgorCitUaHUgU2VwIDIyIDEzOjM5OjEwIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0B4MS5jeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogY2hlY2sgaWYKKwljdXJyZW50X3N0YWJzX2ZpbGVuYW1lIGlzIE5VTEwgYmVmb3JlIHN0cmNtcC4KKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZml4IGEgYnVnIGluIGdlbmVyYXRlX2FzbV9saW5lbm8KKwljaGVja2luZy4KKworV2VkIFNlcCAyMSAxODoxNzozNSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWcvaG8tKi5oOiBOb3ctdW51c2VkIGZpbGVzIGRlbGV0ZWQuCisKKwkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IE5ldyBmdW5jdGlvbi4gIENvcGllcyBCRkQKKwlzeW1ib2wgZmxhZ3MgYW5kIGNhbGxzIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTLgorCShyZXNvbHZlX3N5bWJvbF92YWx1ZSwgY2FzZSBPX3N5bWJvbCk6IENhbGwgaXQsIGlmIFhfYWRkX251bWJlciBpcworCXplcm8uICBEb24ndCBjYWxsIG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sLgorCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQ2FsbCBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLCBidXQgb25seSBpZgorCVhfYWRkX251bWJlciBpcyB6ZXJvLgorCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOiBEZWxldGVkLgorCisJKiBjb25maWcvdGMtaTk2MC5jOiBMb3RzIG9mIHdoaXRlc3BhY2UsIGNvbW1lbnQgcmVmb3JtYXR0aW5nLAorCXVzaW5nIEdOVSBpbmRlbnQuCisJKHN0cmNocik6IERvbid0IGRlY2xhcmUuCisJW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBjb21waWxlIG1kX2NvbnZlcnRfZnJhZywKKwltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfcmlfdG9fY2hhcnMsCisJbWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAuCisJKGJydGFiX2VtaXQpOiBVc2UgZGF0YV9zZWN0aW9uLCBub3QgU0VHX0RBVEEuCisKKwlNb24gU2VwIDE5IDE3OjE0OjQ0IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiBjb25maWcvdm1zLWNvbmYuaDogbmV3IGZpbGUsIG1hbnVhbGx5IGRlcml2ZWQgZnJvbSBjb25mLmluLgorCSogY29uZmlnLWdhcy5jb206IHVzZSBpdCwgYW5kIGVsaW1pbmF0ZSBvYnNvbGV0ZSAiaG9zdC5oIi4KKworV2VkIFNlcCAyMSAxMToxMTozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2N1cnJlbnRfYmxvY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShwcGNfc3RhYngpOiBTZXQgc3lfdGMud2l0aGluIG9mIGEgQ19TVFNZTSBzeW1ib2wgdG8KKwlwcGNfY3VycmVudF9ibG9jay4gIERvbid0IG1vdmUgYXJvdW5kIGFueSBzdGFiIHN5bWJvbCwganVzdCB0aG9zZQorCWZvciBjb21tb24gc3ltYm9scy4KKwkocHBjX2JzKTogU2V0IHBwY19jdXJyZW50X2Jsb2NrLgorCShwcGNfZXMpOiBDbGVhciBwcGNfY3VycmVudF9ibG9jay4KKwkocHBjX2Zyb2Jfc3ltYm9sKTogU2V0IHRoZSB2YWx1ZSBvZiBhIENfU1RTWU0gc3ltYm9sIHRvIHRoZSBvZmZzZXQKKwlmcm9tIHRoZSBjc2VjdCBvZiB0aGUgZW5jbG9zaW5nIGJsb2NrLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MpOiBSZW1vdmUuCisJKGFwcGVuZF9pbnNuKTogUmVtb3ZlIHNldHRpbmcgb2YgaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzLCBhbmQKKwlzcGVjaWFsIDQ2MDAgaGFuZGxpbmc7IGl0IHR1cm5zIG91dCBub3QgdG8gYmUgcmVxdWlyZWQuCisKK1R1ZSBTZXAgMjAgMTY6MTM6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9zaG9ydG9wdHMpOiBSZW1vdmUgRS4KKwkobWRfbG9uZ29wdHMpOiBBZGQgRUIgYW5kIEVMLgorCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLUVCIGFuZCAtRUwgYXMgc2VwYXJhdGUgb3B0aW9ucywgcmF0aGVyCisJdGhhbiBhcyBhIHNpbmdsZSAtRSBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4KKworTW9uIFNlcCAxOSAxMjo0MjowNSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlamVjdCByZWR1Y3Rpb25zCisJaW52b2x2aW5nIGdsb2JhbCBzeW1ib2xzIHRvby4KKworTW9uIFNlcCAxOSAxMjoxMjo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBhcy5oOiBUZXN0IE5FRURfREVDTEFSQVRJT05fKiwgbm90IE5FRURfKl9ERUNMQVJBVElPTi4KKworCSogY29uZmlndXJlLmluOiBUZXN0IGZvciByZW1vdmUsIG5vdCBkZWxldGUuICBGaXggY3Jvc3MtYXNzZW1ibGVyCisJdGVzdC4KKwkqIGFzLmg6IFRlc3QgSEFWRV9SRU1PVkUsIG5vdCBIQVZFX0RFTEVURTsgZGVmaW5lIHVubGluayB0bworCXJlbW92ZSwgbm90IGRlbGV0ZS4KKworCSogcmVhZC5jIChwc2V1ZG9fc2V0LCBjYXNlIE9fc3ltYm9sKTogSWYKKwlPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyBpcyBkZWZpbmVkLCBpbnZva2UgaXQuCisJW0JGRF9BU1NFTUJMRVJdOiBDb3B5IEJTRl9GVU5DVElPTiBzZXR0aW5nIHRvby4KKwkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRGVmaW5lLgorCisJV2VkIEF1ZyAxMCAxOToxNTozMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogY29uZmlnL29iai12bXMuaCAoRFNHX1NfQ19VQklUVSwgRFNUX0tfVkZMQUdTX0RTQywgRFNUX0tfVFNfQVRPTSwKKwltYW55IG90aGVycyk6IG5ldyBtYWNyb3M7IHZhbHVlcyBvYnRhaW5lZCBmcm9tICJEU1RSRUNSRFMuU0RMIi4KKwkqIGNvbmZpZy9vYmotdm1zLmggKHZhcmlvdXMpOiB1c2UgdGhlbS4KKwkoVVNFX0JJVFNUUklOR19ERVNDUklQVE9SKTogbmV3IG1hY3JvLCBmb3Igc2VsZWN0aW5nIGJpdGZpZWxkCisJcmVwcmVzZW50YXRpb24gKG9ubHkgZW51bSBiaXRmaWVsZHMgY2FuIGF2b2lkIGJlaW5nIGJpdHN0cmluZ3MpLgorCShiaXRmaWVsZF9zdWZmaXgsIHNldHVwX2Jhc2ljX3R5cGUpOiBuZXcgcm91dGluZXMuCisJKFZNU190eXBlZGVmX3BhcnNlKTogdXNlIHRoZW0uICBOb3cgcmVjb2duaXplIGJpdGZpZWxkcyBvZiBhbGwKKwlpbnRlZ3JhbCB0eXBlcywgbm90IGp1c3QgdHlwZSBgaW50Jy4gIENhdmVhdDogIHRoZSByZXByZXNlbnRhdGlvbgorCXVzZWQgZm9yIGJpdGZpZWxkcyBzdGlsbCBkb2VzIG5vdCB3b3JrIGZvciBvYmplY3RzIHBsYWNlZCBpbgorCXJlZ2lzdGVycywgYW5kIGdjYydzIG9wdGltaXplciBzb21ldGltZXMgcHV0cyBzbWFsbCBzdHJ1Y3RzIHRoZXJlLgorCisJVHVlIEp1biAxNCAxNzozMTo0NCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogcmVhZC5jIChzX3RleHQpIFsjaWYgT0JKX1ZNU106IGNsZWFyIHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04KKwliaXQgZnJvbSBjb25zdF9mbGFnLgorCSogY29uZmlnL29iai12bXMuaCAoSU5fREVGQVVMVF9TRUNUSU9OKTogZGVmaW5lIHRoaXMgbWFjcm8uCisJKHRjX2Zyb2JfbGFiZWwpOiBkZWZpbmUgdGhpcyB0byBjYWxsIHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCwKKwlhbmQgZGVjbGFyZSB0aGUgbGF0dGVyLgorCSogY29uZmlnL29iai12bXMuYyAodmF4X2dfZG91Ymxlcyk6IGRlY2xhcmUgdGhpcyBmaWxlLXNjb3BlCisJdmFyaWFibGUuCisJKGNvbnN0X2ZsYWcpOiBpbml0aWFsaXplIHRvIElOX0RFRkFVTFRfU0VDVElPTiBpbnN0ZWFkIG9mIDAuCisJKHZtc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCk6IG5ldyByb3V0aW5lICh0Y19mcm9iX2xhYmVsKS4KKwkoVk1TX1RCVF9Sb3V0aW5lX0VuZCk6IGRvbid0IGJvdGhlciBjaGVja2luZyBmb3IgYGdjY19jb21waWxlZC4nCisJYW5kIGBnY2MyX2NvbXBpbGVkLicgbGFiZWxzOyB0aGV5IHdvbid0IHJlYWNoIGhlcmUgYW55IG1vcmUuCisJKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBmb3IgdHlwZXMgYGRvdWJsZScgYW5kIGBjb21wbGV4CisJZG91YmxlJywgdXNlIGB2YXhfZ19kb3VibGVzJyBmbGFnIHRvIHNlbGVjdCB0eXBlIG9mIGRvdWJsZS4KKwkoVk1TX3dyaXRlX29iamVjdF9maWxlKSBbdHJhY2ViYWNrIHNldHVwXTogZG9uJ3QgcGFzcyBzeW1ib2xzCisJd2l0aCB0aGUgSU5fREVGQVVMVF9TRUNUSU9OIGF0dHJpYnV0ZSB0byB0aGUgVEJUX1JvdXRpbmVfQmVnaW4KKwlhbmQgVEJUX1JvdXRpbmVfRW5kIGZ1bmN0aW9ucy4KKworCU1vbiBKdW4gIDYgMjA6NTI6MjAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19UQlRfUm91dGluZV9FbmQpOiBjYWNoZSB0aGUgcmVzdWx0IG9mCisJU19HRVRfVkFMVUUoKSB0byBhdm9pZCBtYW55IHJlcGVhdGVkIGZ1bmN0aW9uIGNhbGxzLgorCShWTVNfQ2hlY2tfRm9yX01haW4pIFsjaWYgSEFDS19ERUNfQ19TVEFSVFVQXTogY2FwaXRhbGl6ZQorCV9DJE1BSU5fQVJHUyBpbiBhZHZhbmNlLCBpbiBjYXNlIC1oMyAobGVhdmUgc3ltYm9sIG5hbWUgYXMtaXMpCisJZ2V0cyByZXF1ZXN0ZWQuICBbQWxsIHRoZSBIQUNLX0RFQ19DX1NUQVJUVVAgY29kZSBhcHBlYXJzIHRvCisJYmUgb2Jzb2xldGU7IGdjYyBkb2VzIGl0IGF1dG9tYXRpY2FsbHkgZm9yIHZtcyB0YXJnZXQuICBJdCdzCisJYWxzbyBtaXNuYW1lZCwgYmVjYXVzZSBpdCBpcyBmb3IgdGhlICJWQVggQyIgcnVuLXRpbWUgbGlicmFyeSwKKwlub3QgdGhlIG5ld2VyICJERUMgQyIgb25lIHdoaWNoIGhhcyBtdWNoIGRpZmZlcmVudCBzdGFydHVwIGNvZGUuXQorCXt2YXJpb3VzfTogdXNlIGBTX1NFVF94eHgoc3ltYm9sLG5ld192YWx1ZSknIHJhdGhlciB0aGFuCisJYFNfR0VUX3h4eChzeW1ib2wpID0gbmV3X3ZhbHVlJy4KKworTW9uIFNlcCAxOSAxMjowNTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCk6IFVzZSBiZmRfYWJzX3NlY3Rpb25fcHRyLAorCW5vdCAmYmZkX2Fic19zZWN0aW9uLgorCitUaHUgU2VwIDE1IDE4OjM2OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZXhwci5jIChjbGVhbl91cF9leHByZXNzaW9uKTogVXNlIGFkZHJlc3NULCBub3QgYmZkX3ZtYS4KKworVHVlIFNlcCAxMyAyMDowNTo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZXhwci5jIChleHByKTogRG9uJ3QgcmVkdWNlIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQorCXNhbWUgZnJhZyBpZiB0aGUgc3ltYm9scyBhcmUgbm90IGluIG5vcm1hbCBzZWN0aW9ucy4KKworCSogY29uZmlnL29iai1zb20uaCAoU19TRVRfT1RIRVIsIFNfU0VUX1RZUEUpOiBEZWxldGUgYS5vdXQgY3J1ZC4KKwkoU19TRVRfREVTQywgU19HRVRfT1RIRVIsIFNfR0VUX1RZUEUsIFNfR0VUX0RFU0MpOiBMaWtld2lzZS4KKwkob2JqX2F0dGFjaF91bndpbmRfaW5mbyk6IERvIG5vdCBkZWZpbmUuICBOb3QgbmVlZGVkIGFueW1vcmUuCisJKiBjb25maWcvdGMtaHBwYS5jOiBEZWxldGUgd2hpdGVzcGFjZSBhdCBFT0wuCisJKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpOiBEZWxldGUgZnhfdW53aW5kIGZpZWxkIGFuZCBhbGwgcmVmZXJlbmNlcy4KKwkoZml4X25ld19ocHBhKTogTGFzdCBhcmcgaXMgbm93IGEgcG9pbnRlciB0byBhbiBpbnQuICBEbyBub3QKKwljYWxsIG9ial9hdHRhY2hfdW53aW5kX2luZm8gYW55bW9yZS4gIEZvciBTT00gUl9FTlRSWSBhbmQgUl9FWElUCisJZml4dXBzLCBzdG9yZSAzMmJpdHMgb2YgdW53aW5kIGluZm9ybWF0aW9uIGluIHRoZSBmeF9hZGRudW1iZXIKKwlmaWVsZCBvZiB0aGUgZml4dXAuCisJKG1kX2Fzc2VtYmxlLCBwYV9lbnRyeSwgcHJvY2Vzc19leGl0LCBwYV9wcm9jZW5kKTogRm9yIFNPTSBSX0VOVFJZCisJYW5kIFJfRVhJVCBmaXh1cHMsIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gZml4X25ld19ocHBhLCBhbmQgYQorCXBvaW50ZXIgdG8gMzIgYml0cyBvZiB1bndpbmQgaW5mby4KKwkodGNfZ2VuX3JlbG9jKTogRm9yIFNPTSBSX0VOVFJZIGFuZCBSX0VYSVQgZml4dXBzLCBzZXQgdGhlIHN5bWJvbAorCXBvaW50ZXIgdG8gdGhlIGR1bW15IHN5bWJvbDsgc2V0IHRoZSBhZGRlbmQgZmllbGQgdG8gZnhfYWRkbnVtYmVyLgorCShwYV9jb21tLCBwYV9lcXUsIHBhX3R5cGVfYXJncywgcGFfaW1wb3J0KTogVXNlIGJmZF9YWFhfc2VjdGlvbl9wdHIKKwlyYXRoZXIgdGhhbiAmYmZkX1hYWF9zZWN0aW9uLgorCitUdWUgU2VwIDEzIDIxOjE1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeF8xKTogRm9yIEdPVFBDIHJlbG9jcywgZGVjcmVtZW50CisJdmFsdWUgYnkgb25lOyBkaXNjYXJkIGFkanVzdG1lbnRzIHByZXZpb3VzbHkgYmVpbmcgbWFkZS4gIEZyb20KKwlFcmljIFlvdW5nZGFsZS4KKworCVZNUy0gYW5kIFZheC1yZWxhdGVkIGNoYW5nZXMgZnJvbSBQYXQgUmFua2luOgorCSogTWFrZWZpbGUuaW4gKFZNU19PVEhFUl9PQkpTKTogYWRkIGNvbmNhdCwgZ2V0b3B0LCBhbmQgZ2V0b3B0MS4KKwkqIHZtc2NvbmYuc2g6IG5vIGxvbmdlciBoYXZlIG1ha2UtZ2FzLmNvbSBlY2hvIHRleHQgYWJvdXQgbmVlZGluZworCXRvIG1vZGlmeSB0aGUgZ2NjLXZtcyBkcml2ZXIgd2hlbiBpbnRlbmRpbmcgdG8gdXNlIHdpdGggZ2NjIDEueC4KKwkqIGFzLmMgKHBhcnNlX29wdGlvbnMpOiBzdXBwcmVzcyAndicgZnJvbSBzdGRfc2hvcnRfb3B0aW9ucyBhbmQKKwllbGltaW5hdGUgVk1TLXNwZWNpZmljIGNvbmRpdGlvbmFsIGluaXRpYWxpemF0aW9uOworCVtkZWZhdWx0IGNhc2VdOiBjaGVjayBmb3IgJy12JyBpZiBtZF9wYXJzZV9vcHRpb25zIGRvZXNuJ3QgcmVjb2duaXplCisJYW4gb3B0aW9uOworCVtkZWZhdWx0IGNhc2UsICNpZiBWTVNdOiBjaGVjayBmb3IgZmlsZW5hbWUgYXJndW1lbnQgd2hlbiAnLXYnIHNlZW47CisJW2Nhc2UgJ3YnXTogZGVsZXRlLgorCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IGRvbid0IHJlbHkgb24gYHRoaXNfYWRkX251bWJlcicKKwlmb3IgT19iaWcgbGl0ZXJhbCBvcGVyYW5kcyAoZG91YmxlIGZsb2F0cyBhbmQgbG9uZyBsb25nIGludHMpOworCVtWTVMsIG1kX3Nob3J0b3B0c106IGFkZCBzZWNvbmQgY29sb24gYWZ0ZXIgJ3YnOworCShtZF9wYXJzZV9vcHRpb25zKSBbVk1TLCBjYXNlICd2J106ICBjaGVjayBmb3IgYXJndW1lbnQsIHNvCisJY2FsbGVyIGNhbiBoYW5kbGUgYC12JyB3L28gYXJnLgorCitUdWUgU2VwIDEzIDE2OjQ1OjA4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogIElmIFRDX0tFRVBfRlhfT0ZGU0VUCisJaXMgZGVmaW5lZCwgcHV0IHRoZSB0eF9vZmZzZXQgaW50byB0aGUgcl9vZmZzZXQuCisJKiBjb25maWcvdGMtc2guYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkICMKKwkodGNfcmVsb2NfbWFuZ2xlKTogRGVsZXRlZC4KKwkqIGNvbmZpZy90Yy1zaC5oIChUQ19LRUVQX0ZYX09GRlNFVCk6IERlZmluZS4KKwkoVENfUkVMT0NfTUFOR0xFKTogRGVsZXRlLgorCitUdWUgU2VwIDEzIDE2OjIwOjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGZsb251bS1rb25zdC5jOiBDaGFuZ2UgcHJlcHJvY2Vzc29yIHRlc3RzIG9mIEhPX1ZNUyB0byBqdXN0IFZNUy4KKwkqIGhleC12YWx1ZS5jOiBEaXR0by4KKwkqIGNvbmZpZy9vYmotdm1zLmM6IERpdHRvLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZXBsYWNlIGFzX2JhZC9leGl0IHNlcXVlbmNlIHdpdGgKKwlhIGNhbGwgdG8gYXNfZmF0YWwuCisJKiBjb25maWcvdGMtaTg2MC5jIChpODYwX2lwKTogRGl0dG8uCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IERpdHRvLgorCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogRGl0dG8uCisJKiBhcy5jIChwYXJzZV9hcmdzKTogRGl0dG8uCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBSZXBsYWNlIGFzX3dhcm4vZXhpdCBzZXF1ZW5jZSB3aXRoIGEKKwljYWxsIHRvIGFzX2ZhdGFsLgorCisJKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IFVzZSBFWElUX0ZBSUxVUkUuCisJKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUsIG91dHB1dF9maWxlX2Nsb3NlLAorCW91dHB1dF9maWxlX2NyZWF0ZSwgb3V0cHV0X2ZpbGVfY2xvc2UpOiBEaXR0by4KKwkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogRGl0dG8uCisJKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24sIG9ial9zb21fY29weXJpZ2h0KTogRGl0dG8uCisJKiBjb25maWcvb2JqLWllZWUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgorCSogY29uZmlnL3RjLXZheC5jIChtYWluKTogVXNlIEVYSVRfU1VDQ0VTUy4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1haW4pOiBEaXR0by4KKworCSogaGFzaC5jIChtYWluKTogUGFzcyBhIHZhbHVlIHRvIGV4aXQoKS4KKworCSogYXMuaCAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBNb3ZlZCBoZXJlLgorCSogYXMuYzogLi4uZnJvbSBoZXJlLgorCShwYXJzZV9hcmdzKTogVXNlIHRoZW0gYWx3YXlzLgorCShtYWluKTogVXNlIGV4aXQgcmF0aGVyIHRoYW4gcmV0dXJuLgorCisJKiBNYWtlZmlsZS5pbiAoKl9GT1JfVEFSR0VULCBJTlNUQUxMX1hGT1JNLCBpbnN0YWxsLCB1bmluc3RhbGwpOgorCVJld3JpdGUgaGFuZGxpbmcgb2YgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZS4KKworCSogY29uZmlndXJlLmluOiBUZXN0IGZvciBmdW5jdGlvbnMgdW5saW5rIGFuZCBkZWxldGUuCisJKiBhcy5oOiBJZiB1bmxpbmsgaXNuJ3QgYXZhaWxhYmxlIGJ1dCBkZWxldGUgaXMsIGRlZmluZSB1bmxpbmsgdG8KKwliZSBkZWxldGUuCisKKwlVcGRhdGUgZm9yIGF1dG9jb25mIDEuMTE4OgorCSogZ2RiaW5pdC5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgZnJvbSBvbGQgLmdkYmluaXQuCisJKiAuZ2RiaW5pdDogRGVsZXRlZC4KKwkqIGFjbG9jYWwubTQgKEdBU19HREJJTklUKTogRGVsZXRlZC4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIGl0LiAgSW5zdGVhZCwgZ2VuZXJhdGUgLmdkYmluaXQgZnJvbQorCWdkYmluaXQuaW4uICBEb24ndCBzdWJzdGl0dXRlIGNwdV90eXBlLCBvYmpfZm9ybWF0LCBlbXVsYXRpb24sCisJYXRvZi4gIFN3aXRjaGVkIG9yZGVyIG9mIEFDX0xJTktfRklMRVMgYXJndW1lbnRzLiAgVXNlIEFDX1BSRVJFUQorCXRvIGVuc3VyZSB0aGF0IG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mIGFyZW4ndCB1c2VkLgorCSogTWFrZWZpbGUuaW46IEFkZGVkIEBjb25maWd1cmVfaW5wdXRAIGxpbmUuCisJKGNvbmZpZ3VyZSk6IERlbGV0ZWQgcnVsZS4KKworVHVlIFNlcCAxMyAxMjowODoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQWZ0ZXIgaGFuZGxpbmcgdGhlIGRpZmZlcmVuY2UKKwlvZiB0d28gc3ltYm9scyBmcm9tIHRoZSBzYW1lIHNlZ21lbnQsIHNldCBmeF9zdWJzeSB0byBOVUxMLCB0bworCXNhdGlzZnkgZXhpc3RpbmcgVENfQ09VTlRfUkVMT0MgbWFjcm9zLgorCitUdWUgU2VwIDEzIDAxOjQ3OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGFjbG9jYWwubTQgKEdBU19HREJJTklUKTogTmV3IG1hY3JvLgorCSogY29uZmlndXJlLmluOiBVc2UgaXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitNb24gU2VwIDEyIDIwOjU2OjM4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKKworCSogLmdkYmluaXQgKHBlLCBwcyk6IERlZmluZSBuZXcgY29tbWFuZHMuCisJKiBzeW1ib2xzLmMgKGluZGVudF9sZXZlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGluZGVudCwgcHJpbnRfZXhwcl8xLCBwcmludF9zeW1ib2xfdmFsdWVfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlLAorCXByaW50X2V4cHIpOiBOZXcgZnVuY3Rpb25zLgorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogQWRkIGEgInRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgbWFrZSIKKwltZXNzYWdlIHRvIGNvbmZpZy5oLgorCisJUElDIGltcGxlbWVudGF0aW9uIGZvciBpMzg2LWxpbnV4LCBiYXNlZCBvbiBjb2RlIGZyb20gRXJpYworCVlvdW5nZGFsZSBhbmQgUGF1bCBLcmFuZW5idXJnLCB3aXRoIHNvbWUgd29yayBvZiBteSBvd246CisKKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBUZXN0IFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCBvbiBmaXh1cAorCWJlZm9yZSBwcm9jZXNzaW5nIHNhbWUtc2VjdGlvbiBwY3JlbCByZWxvY2F0aW9ucy4KKwkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmYXVsdCB0byAxLgorCisJKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBJZiBvcGVyYXRvciBpcyBPX3N5bWJvbCBhbmQKKwlYX2FkZF9udW1iZXIgaXMgemVybywganVzdCByZXR1cm4gdGhlIHN5bWJvbC4gIElmIG9wZXJhdG9yIGlzCisJT19jb25zdGFudCwgcmVzb2x2ZSB0aGUgc3ltYm9sJ3MgdmFsdWUgYmVmb3JlIHJldHVybmluZy4KKwkob3BlcmFuZCk6IFBlcm1pdCB1c2Ugb2YgIltdIiBmb3IgZ3JvdXBpbmcuCisJKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBGb3IgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUgc2FtZQorCWZyYWcsIGFkZCB0aGUgZGlmZmVyZW5jZSBvZiB0aGVpciBvZmZzZXRzIGludG8gWF9hZGRfbnVtYmVyLgorCShleHByKTogUmVkdWNlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gc2FtZSBmcmFnIHRvIHRoZWlyCisJZGlmZmVyZW5jZS4KKworCSogY29uZmlnL3RjLWkzODYuYyAoVENfUkVMT0MpOiBOZXcgbWFjcm8uCisJKHN0cnVjdCBfaTM4Nl9pbnNuKTogTmV3IGZpZWxkIGRpc3BfcmVsb2MuCisJKEdPVF9zeW1ib2wpOiBOZXcgdmFyaWFibGUuCisJKG9wZXJhbmRfc3BlY2lhbF9jaGFycyk6IEFkZGVkIHNxdWFyZS1icmFja2V0cyBhbmQgYXQtc2lnbi4KKwkocmVsb2MpIFtCRkRfQVNTRU1CTEVSXTogQWRkZWQgbmV3IGFyZ3VtZW50IE9USEVSOyBpZiBpdCBpcyBub3QKKwlOT19SRUxPQywganVzdCByZXR1cm4gaXQuCisJKHJlbG9jKSBbISBCRkRfQVNTRU1CTEVSXTogQWRkIHRoaXJkIGFyZ3VtZW50IHRvIGR1bW15IG1hY3JvLgorCShCRkRfUkVMT0NfMzg2X1BMVDMyLCBfR09UMzIsIF9HT1RPRkYpIFshIEJGRF9BU1NFTUJMRVJdOiBNb3JlCisJZHVtbXkgbWFjcm9zLgorCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucyB6ZXJvIGlmIHN5bWJvbCBpbgorCWZpeHVwIGlzIG5vdCBsb2NhbCwgdG8gcHJldmVudCByZWxvY2F0aW9ucyBhZ2FpbnN0IGV4dGVybmFscyBmcm9tCisJYmVpbmcgZHJvcHBlZC4KKwkobWRfYXNzZW1ibGUpOiBJbml0aWFsaXplIGRpc3BfcmVsb2MgZmllbGQgdG8gTk9fUkVMT0MuICBQYXNzCisJZGlzcF9yZWxvYyBmaWVsZCB0byByZWxvYygpIGZ1bmN0aW9uLCBhbmQgdXNlIFRDX1JFTE9DIHRvIGdlbmVyYXRlCisJdmFsdWUgdG8gcGFzcyB0byBmaXhfbmV3X2V4cC4KKwkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgMzItYml0IHJlbG9jIGFnYWluc3QgR09UX3N5bWJvbCBpbnRvIGEgR09UUEMKKwlyZWxvYy4KKwkoaTM4Nl9vcGVyYW5kKTogSW5pdGlhbGl6ZSBkaXNwX3JlbG9jIGZpZWxkIHRvIE5PX1JFTE9DLiAgSGFuZGxlCisJQEdPVE9GRiwgQFBMVCwgQEdPVCBvcGVyYW5kcy4gIEZvciBHT1RPRkYgcmVsb2NhdGlvbnMgd2l0aCBsb2NhbAorCXN5bWJvbHMsIGZvcmNlIGdlbmVyYXRpb24gb2YgdGhlIHNlY3Rpb24gc3ltYm9sLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IElmIEdPVF9zeW1ib2wgZXhpc3RzLCBkZWNpZGUKKwl3ZSdyZSBnZW5lcmF0aW5nIFBJQyBjb2RlLCBhbmQgY29udmVydCByZWxvY2F0aW9ucyBhZ2FpbnN0CisJdW5kZWZpbmVkIHN5bWJvbHMgZnJvbSBQQ1JFTCB0byBQTFQzMi4KKwkobWRfYXBwbHlfZml4XzEpIFtPQkpfRUxGXTogRml4IHVwIHZhbHVlcyBmb3IgZHluYW1pYy1saW5raW5nCisJcmVsb2NzLgorCShtZF91bmRlZmluZWRfc3ltYm9sKTogTm90aWNlIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSBhbmQgc2V0CisJYW5kIHJldHVybiBHT1Rfc3ltYm9sIGlmIGl0IG1hdGNoZXMuCisJKEYsIE1BUCk6IE1vdmUgbWFjcm8gZGVmaW5pdGlvbnMgb3V0c2lkZSBmdW5jdGlvbi4KKwkodGNfZ2VuX3JlbG9jKTogT25seSBzd2l0Y2ggb24gc2l6ZSBhbmQgcGNyZWwgaWYgY29kZSB3YXNuJ3QKKwlhbHJlYWR5IHN1cHBsaWVkIGFzIFBMVDMyLiBHT1QzMiwgR09UT0ZGLCBvciBHT1RQQy4gIENvbnZlcnQKKwlCRkRfUkVMT0NfMzIgdXNpbmcgR09UX3N5bWJvbCBpbnRvIEdPVFBDLgorCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0MsIHRjX2ZpeF9hZGp1c3RhYmxlLAorCVRDX1JFTE9DX0dMT0JBTF9PRkZTRVRfVEFCTEUsIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IE5ldworCW1hY3Jvcy4KKwkoTkVFRF9GWF9SX1RZUEUpOiBEZWZpbmUuCisJKExPQ0FMX0xBQkVMKTogQWNjZXB0ICIuWCIgcHJlZml4IHRvby4KKwkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmYXVsdCB0byAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIi4KKworTW9uIFNlcCAxMiAxNzo1MTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdHlwZSk6IFJld3JpdGUgdG8gYWNjZXB0IHN5bnRheAorCXJlcG9ydGVkbHkgdG8gYmUgdXNlZCBvbiBJcml4IDYuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAuZ2xvYmwgYW5kIC5nbG9iYWwuCisJKHNfbWlwc19nbG9ibCk6IE5ldyBzdGF0aWMgZnVuY3Rpb247IG5lZWRlZCBmb3IgSXJpeCA1IHN1cHBvcnQuCisJKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgQlNGX0ZVTkNUSU9OIGlzIHNldCBmb3IgYW4KKwlleHRlcm5hbCBzeW1ib2wgd2l0aCBubyB0eXBlLCBzZXQgdGhlIHR5cGUgdG8gc3RfUHJvYyByYXRoZXIgdGhhbgorCXN0X0dsb2JhbC4gIERvbid0IHNldCB0aGUgaW5kZXggb2YgYW4gZXh0ZXJuYWwgc3RfUHJvYyBvcgorCXN0X1N0YXRpY1Byb2Mgc3ltYm9sIHVubGVzcyBpdCBpcyBhbHNvIGEgbG9jYWwgc3ltYm9sLgorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYXNfd2hlcmUgaXMKKwl1bnNpZ25lZCBpbnQgKiwgbm90IGludCAqLgorCitUaHUgU2VwICA4IDE3OjE4OjI0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWNvZmYuaCA6IENoYW5nZSBuYW1lcyB0byAgT0JKX0dFTkVSQVRFX0FTTV9MSU5FTk8sCisJYW5kIGdlbmVyYXRlX2FzbV9saW5lbm8uCisJKiBjb25maWcvb2JqLWVsZi5oIDogZGl0dG8uCisJKiByZWFkLmggOiBkaXR0by4KKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogaWYgbm8gZmlsZSB3aGVuIGluc3QgaXMgcmVhZCwgc2V0CisJZ2VuZXJhdGVfYXNtX2xpbmVubyB0byB0cnVlLgorCSogZWNvZmYuaCA6IGNoYW5nZSBuYW1lIHRvIGdlbmVyYXRlX2FzbV9saW5lbm8gYW5kIGFkZCBmdW5jdGlvbgorCWVjb2ZmX25vX2N1cnJlbnRfZmlsZS4KKwkqIGVjb2ZmLmMgOiBjaGFuZ2UgbmFtZSB0byBnZW5lcmF0ZV9hc21fbGluZW5vLgorCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubykgOiBuZXcgZnVuY3Rpb24sIHRvIGdlbmVyYXRlCisJZWNvZmYgc3R5bGUgbGluZSBmb3IgYXNtIGZpbGUuCisKK1RodSBTZXAgIDggMTk6NDM6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoc2l6ZV9zZWN0aW9uKTogRG8gYW4gZnByaW50ZiB0byBzdGRlcnIgcmF0aGVyCisJdGhhbiBhIHByaW50Zi4KKwkoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUgcmF0aGVyIHRoYW4gYXNfYmFkLgorCitXZWQgU2VwICA3IDE3OjIxOjEyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy17aDgzMDAsc2h9LltjaF0gKHRjX2NvZmZfc3ltYm9sX2VtaXQpOiBGdW5jdGlvbiBkb2luZworCW5vdGhpbmcgYmVjb21lcyBtYWNybyBkb2luZyBub3RoaW5nLgorCitXZWQgU2VwICA3IDE5OjEwOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLgorCShjb25maWcuc3RhdHVzKTogUnVuIGNvbmZpZy5zdGF0dXMgZnJvbSAuIGluc3RlYWQgb2Ygc3JjZGlyLgorCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBVc2UgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgdG8KKwlkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUgdGhhdCBjb3VsZG4ndCBiZSBoYW5kbGVkLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLiAgRGVsZXRlZCBhYm9ydCBjYWxsCisJYWZ0ZXIgY2FsbCB0byBhc19mYXRhbC4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXgqKTogRG9uJ3Qgc2V0IGJmZF9nYXMuCisKKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQsCisJaW5zdGFsbCwgdW5pbnN0YWxsKTogRG9uJ3QgdXNlICJicm9rZW5zZWQiIGhhY2sgYW55IG1vcmUsIHRoZSBuZXcKKwlhdXRvY29uZiBjb2RlIHNob3VsZCBuZXZlciBsZXQgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiZSBlbXB0eS4KKworCVVwZGF0ZSBmb3IgYXV0b2NvbmYgYmV0YSAxLjExMjoKKwkqIGFjbG9jYWwubTQgKEdBU19DSEVDS19ERUNMX05FRURFRCwgR0FTX1dPUktJTkdfQVNTRVJUKTogTmV3CisJbWFjcm9zLgorCSogY29uZmlndXJlLmluOiBVc2UgdGhlbS4gIFVzZSBBQ19BUkdfUFJPR1JBTSAobm93IHByb3ZpZGVkIGJ5CisJYXV0b2NvbmYpIGluc3RlYWQgb2YgbXkgaGFja2VkLXVwIEFDX1BST0dSQU1fVFJBTlNGT1JNX05BTUUuICBNb3ZlCisJdGVzdCBmb3IgQ1JPU1NfQ09NUElMRSBqdXN0IGJlZm9yZSBBQ19GVU5DX0FMTE9DQSwgYW5kIGVtaXQgYQorCW1lc3NhZ2UgdG8gdHJ5IHRvIGVhc2UgY29uZnVzaW9uIGFib3V0IGF1dG9jb25mJ3MKKwkiY3Jvc3MtY29tcGlsaW5nIiBtZXNzYWdlLgorCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MsIE5FRURfREVDTEFSQVRJT05fRlJFRSwKKwlORUVEX0RFQ0xBUkFUSU9OX0VSUk5PKTogUmVuYW1lZCBmcm9tIE5FRURfKl9ERUNMQVJBVElPTi4KKwkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVnZW5lcmF0ZWQuCisKK1dlZCBTZXAgIDcgMTI6NDk6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoZWNrICR7aG9zdH0gYW5kICR7dGFyZ2V0fSByYXRoZXIgdGhhbgorCSR7aG9zdF9jYW5vbn0gYW5kICR7dGFyZ2V0X2Nhbm9ufS4KKwkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCisKK1R1ZSBTZXAgIDYgMTE6NDI6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2NwdSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGluc25zX3NpbmNlX2NhY2hlX2FjY2Vzcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1kX2JlZ2luKTogU2V0IG1pcHNfY3B1IGFzIHdlbGwgYXMgbWlwc19pc2EuCisJKGFwcGVuZF9pbnNuKTogSWYgbWlwc19jcHUgaXMgNDYwMCwgcmVxdWlyZSBmb3VyIG5vcCBpbnN0cnVjdGlvbnMKKwliZXR3ZWVuIGFuIGluc3RydWN0aW9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjYWNoZSBhbmQgY2VydGFpbiBDQUNIRQorCWluc3RydWN0aW9ucy4gIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc2VlbiBzaW5jZQorCWFuIGluc3RydWN0aW9uIHdoaWNoIGFjY2Vzc2VzIHRoZSBjYWNoZS4KKwkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IG1pcHNfY3B1IGFzIHdlbGwgYXMgbWlwc19pc2EuCisKK01vbiBTZXAgIDUgMDc6MDk6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGRvYy9NYWtlZmlsZS5pbiAoVlBBVEgpOiBEZWZpbmUgdXNpbmcgQHNyY2RpckAuCisJKHByZWZpeCwgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSwgZXhlY19wcmVmaXgpOiBVc2UgYXV0b2NvbmYgc3R5bGUKKwlALXN1YnN0aXR1dGlvbnMuCisKK1N1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKworCSogY29uZmlnL2hvLXJpc2NpeC5oLCBjb25maWcvdGMtYXJtLmMsIGNvbmZpZy90Yy1hcm0uaDogTmV3IGZpbGVzCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSB0aGUgYXJtLgorCitGcmkgU2VwICAyIDE2OjA1OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBEb24ndCB0cnkgdG8gZ2VuZXJhdGUgbGluZSBudW1iZXJzIGlmIHRoZQorCXN5bWJvbCB0YWJsZSBoYXMgYmVlbiBmcm96ZW4uCisKK1RodSBTZXAgIDEgMTk6NDg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogYWNsb2NhbC5tNCAoQUNfUFJPR19DQyk6IFVzZSBBQ19ERUZVTiwgYW5kIG9taXQgQUNfUFJPVklERS4KKworCSogY29uZmlndXJlLmluOiBIYW5kbGUgdXNlci1zcGVjaWZpZWQgYmZkLWFzc2VtYmxlciBvcHRpb24gd2l0aAorCXNlcGFyYXRlIHZhcmlhYmxlIGZyb20gcHJlZmVycmVkIGNvbmZpZ3VyYXRpb24sIHVudGlsIHRoZSB0d28gYXJlCisJcmVzb2x2ZWQuICBJbmRpY2F0ZSBiZmRfZ2FzPXByZWZlcnJlZCBmb3IgbGludXggYS5vdXQuICBVc2UKKwlBQ19QUk9HUkFNX1RSQU5TRk9STV9OQU1FLCBmb3Igd2hpY2ggYSBwYXRjaCBoYXMgYmVlbiBzZW50IHRvIGRqbS4KKwkqIE1ha2VmaWxlLmluICh0YXJnZXRfYWxpYXMsIHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBEZWZpbmUsCisJdXNpbmcgYXV0b2NvbmYgQC1zdWJzdGl0dXRpb25zLgorCitXZWQgQXVnIDMxIDE3OjQzOjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGF0b2YtZ2VuZXJpYy5jOiBEZWxldGVkIGFsbG9jYSBoYW5kbGluZyBoZXJlLgorCisJKiBNYWtlZmlsZS5pbiAocHJlZml4LCBleGVjX3ByZWZpeCk6IFVzZSBALXN1YnRpdHV0aW9ucy4KKworCSogYWNsb2NhbC5tNCAoQUNfT1VUUFVUX0xJTktTKTogRGVsZXRlZCByZWRlZmluaXRpb24sIHNpbmNlCisJYXV0b2NvbmYgMS4xMDkgaGFzIHRoaXMgZml4ZWQuCisJKiBjb25maWd1cmUuaW46IERvbid0IGNoYW5nZSBxdW90ZSBjaGFyYWN0ZXJzIGFyb3VuZCBBQ19NU0dfRVJST1IKKwlpbnZvY2F0aW9uLiAgRG9uJ3QgdXNlIEFDX0hFQURFUl9TVERDLCBzaW5jZSBpdCByZXF1aXJlcyBydW5uaW5nIGEKKwlwcm9ncmFtLiAgQ2FjaGUgTkVFRF8qX0RFQ0xBUkFUSU9OIHZhbHVlcy4KKwkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVnZW5lcmF0ZWQgd2l0aCBhIG1vZGlmaWVkIGF1dG9jb25mIDEuMTA5LgorCisJKiBhcy5oICh2b2xhdGlsZSk6IERvbid0IHRlc3Qgb3IgZGVmaW5lIGhlcmU7IG5vdCBuZWVkZWQuCisJKGFsbG9jYSk6IFJlcGxhY2UgYWxsb2NhLWNvbmYuaCBpbmNsdXNpb24gd2l0aCBjb2RlIHJlY29tbWVuZGVkIGluCisJYXV0b2NvbmYgZG9jdW1lbnRhdGlvbi4gIEluY2x1ZGUgY29uZmlnLmggZmlyc3QuCisKK1dlZCBBdWcgMzEgMTE6MjA6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19ERUZJTkVEKTogQWJzb2x1dGUgc3ltYm9scyBhcmUgZGVmaW5lZAorCWFsc28uCisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBJbml0aWFsaXplIGJmZF9nYXMgdG8gbm8uCisKK1R1ZSBBdWcgMzAgMTk6MzE6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogYXMuaDogSW5jbHVkZSBhbGxvY2EtY29uZi5oIGZyb20gImxpYmliZXJ0eSIsIG5vdAorCSIuLi9saWJpYmVydHkiLgorCitNb24gQXVnIDI5IDE2OjExOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgpOiBEb24ndCBnZW5lcmF0ZSBhIHJlbG9jIHdoZW4gYQorCXN5bWJvbCBpcyB1c2VkIGFzIGFuIG9mZnNldCBpbnRvIGEgQ1NFQ1QgdGhhdCBpcyBub3QgYSBUT0MuICBUaGVzZQorCXR5cGVzIG9mIGxvYWRzIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjIC1tbWluaW1hbC10b2MuCisKK1N1biBBdWcgMjggMTM6MjI6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBhcy5oIChmbGFnXyopOiBBZGRlZCBjb21tZW50cyBkZXNjcmliaW5nIG1lYW5pbmdzIG9mIHNvbWUgb2YKKwl0aGVzZSB2YXJpYWJsZXMuCisJKHN0cnVjdCBmcmFnKTogQWRkIHNvbWUgY29tbWVudHMgYWJvdXQgdGhlIG5zMzJrLXNwZWNpZmljIGZpZWxkcworCWFuZCB3aHkgdGhleSdyZSBoZXJlLgorCShTSVpFT0ZfU1RSVUNUX0ZSQUcpOiBDYXN0IGFkZHJlc3NlcyB0byBjaGFyKiwgbm90IGludC4KKwkoZmxhZ19wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KKworCSogYXMuYyAocGFyc2VfYXJncyk6IFNldCBmbGFnX3ByaW50X3N0YXRpc3RpY3MgaW5zdGVhZCBvZgorCXN0YXRpc3RpY3NfZmxhZy4gIE9wdGlvbnMgYXJyYXkgaXMgbm93IGNvbnN0LiAgQWRkZWQgbmV3IG9wdGlvbgorCSJkdW1wLWNvbmZpZyI7IGlmIHNwZWNpZmllZCwgcHJpbnQgVEFSR0VUX0FMSUFTLCBUQVJHRVRfQ0FOT05JQ0FMLAorCVRBUkdFVF9DUFUsIFRBUkdFVF9PQkpfRk9STUFULCBhbmQgVEFSR0VUX0ZPUk1BVCwgaWYgZGVmaW5lZC4KKwkobWFpbik6IENoYW5nZSB0ZXN0IHRvIGNoZWNrIGZsYWdfcHJpbnRfc3RhdGlzdGljcy4KKwkoc3RhdGlzdGljc19mbGFnKTogRGVsZXRlZC4KKworCSogZnJhZ3MuYyAoZnJhZ192YXJpYW50KTogUmVtb3ZlZCBQQ1JFTF9BREpVU1QgYW5kIEJTUiBhcmd1bWVudHMuCisJQWx3YXlzIGluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgorCSogZnJhZ3MuaCAoZnJhZ192YXJpYW50KTogRml4ZWQgcHJvdG90eXBlLgorCSogY29uZmlnL3RjLWk5NjAuYyAoZ2V0X2NkaXNwKTogRG9uJ3QgcGFzcyB0aGUgZXh0cmEgemVybyBhcmdzLgorCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogRG9uJ3QgcGFzcyB0aGUgYXJndW1lbnRzOyBjYWNoZQorCXRoZSB2YWx1ZSBvZiBmcmFnX25vdyBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGxhdGVyLgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBSZW1vdmUgbmV3CisJY29uZmlndXJlLWdlbmVyYXRlZCBmaWxlcy4KKworU2F0IEF1ZyAyNyAyMDoyNjoxMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCisKKwlDb252ZXJzaW9uIHRvIGF1dG9jb25mOgorCSogYWNjb25maWcuaCwgYWNsb2NhbC5tNDogTmV3IGZpbGVzLgorCSogY29uZmlndXJlLmluOiBSZXdyaXR0ZW4gKGV4Y2VwdCBmb3Igc29tZSB0YXJnZXQtc3BlY2lmaWMgY29kZSkKKwlmb3IgYXV0b2NvbmYuCisJKiBjb25mLmluLCBjb25maWd1cmU6IE5ldyBmaWxlcywgZ2VuZXJhdGVkIGZyb20gdGhlIGFib3ZlLgorCSogTWFrZWZpbGUuaW46IENoYW5nZWQgbWFnaWMgc2VxdWVuY2UgaW5kaWNhdGluZyBpbnNlcnRpb24gb2YKKwltYWtlZmlsZSBmcmFnbWVudHMuCisJKFZQQVRILCBzcmNkaXIsIENDLCBMSUJTLCBPQkpTIGRlcGVuZGVuY2llcyk6IFVzZSBALXN1YnN0aXR1dGlvbnMKKwlmcm9tIGNvbmZpZ3VyZS4KKwkoTElOS0VEX0hFQURFUlMpOiBEZWxldGVkIGEub3V0LmdudS5oLCBhLm91dC5oLCBhbmQgaG9zdC5oLgorCShjb25maWcuc3RhdHVzLCBjb25maWd1cmUpOiBSZXdyaXRlIHJ1bGVzLgorCShjb25maWctc3RhbXApOiBEZXBlbmQgb24gY29uZi4gIFNraXAgdmFyaWFibGVzIHRoYXQgY29uZmlndXJlIGlzCisJbm93IHN1YnN0aXR1dGluZyBpdHNlbGYuCisJKCoubyBkZXBlbmRlbmNpZXMpOiBEZWxldGVkIGhvc3QuaC4KKwkoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiBEb24ndCBkZWxldGUgaG9zdC5oLgorCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBzdGRpby5oLCBzdHJpbmcuaCwgc3lzL3R5cGVzLmguICBJbmNsdWRlCisJc2lnbmFsLmggYWZ0ZXIgYXMuaC4KKwkqIGFzLmg6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaCBmaXJzdC4gIEluY2x1ZGUgY3R5cGUuaCwgc3RyaW5nLmgsCisJc3RyaW5ncy5oLCBzdGRsaWIuaCwgdW5pc3RkLmgsIHN5cy90eXBlcy5oLCBmb3Blbi1iaW4uaCwKKwlmb3Blbi1zYW1lLmgsIGFzIHN1Z2dlc3RlZCBieSBhdXRvY29uZiB0ZXN0IHJlc3VsdHMuCisJW0JST0tFTl9BU1NFUlRdOiBEb24ndCBpbmNsdWRlIGFzc2VydC5oLgorCShzdHJkdXApOiBEZWNsYXJlLgorCSh2b2xhdGlsZSwgY29uc3QpOiBEZWZpbmUgaWYgbm90IF9fU1REQ19fIGFuZCBub3QgYWxyZWFkeSBkZWZpbmVkLgorCShtYWxsb2MsIHJlYWxsb2MpIFtORUVEX01BTExPQ19ERUNMQVJBVElPTl06IERlY2xhcmUuCisJKGZyZWUpIFtORUVEX0ZSRUVfREVDTEFSQVRJT05dOiBEZWNsYXJlLgorCSogZ2FzcC5jOiBJbmNsdWRlIGNvbmZpZy5oLCBzdGRsaWIuaCAoaWYgSEFWRV9TVERMSUJfSCkuICBEb24ndAorCWluY2x1ZGUgaG9zdC5oLgorCShtYWxsb2MpIFtORUVEX01BTExPQ19ERUNMQVJBVElPTl06IERlY2xhcmUuCisJKiBtZXNzYWdlcy5jOiBJbmNsdWRlIGFzLmggZmlyc3QuICBJbmNsdWRlIGVycm5vLmggb25seSBpZgorCUhBVkVfRVJSTk9fSC4gIElmIEhBVkVfVkFSQVJHU19IIGFuZCBub3QgX19TVERDX18sIHVuZGVmaW5lCisJSEFWRV9TVERBUkdfSC4gIFNldCBOT19TVERBUkcgYW5kIE5PX1ZBUkFSR1MgYXMgYXBwcm9wcmlhdGUuCisJKiBkb2MvTWFrZWZpbGUuaW4gKHNyY2RpciwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLAorCUlOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZiBALXN1YnN0aXR1dGlvbnMuCisKKwkqIGlucHV0LWZpbGUuYzogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaCBoZXJlLCAnY2F1c2UgYXMuaCBhbHJlYWR5CisJaW5jbHVkZXMgaXQuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGRlZCB2YXJpb3VzIHByb3RvdHlwZXMgZm9yIHN0YXRpYworCWZ1bmN0aW9ucy4KKwkoaW5fcmFuZ2UpOiBOZXcgZnVuY3Rpb24sIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBjYW4gZml0IGluIGFuCisJTi1iaXQgZmllbGQuCisJKGJ1aWxkX21lbSwgYnVpbGRfb3BlcmF0ZV9uKTogTmV3IGZ1bmN0aW9ucyBmb3IgY29uc3RydWN0aW5nCisJb3Bjb2RlIHZhbHVlcy4KKwkoZW1pdF9zbGxfbiwgZW1pdF9sZGFoX251bSwgZW1pdF9hZGRxX3IsIGVtaXRfbGRhX24pOiBOZXcKKwlmdW5jdGlvbnMgZm9yIGVtaXR0aW5nIHNpbmdsZSBpbnN0cnVjdGlvbnMsIG5vIGxvbmdlciByZXF1aXJpbmcgYQorCXJlY3Vyc2l2ZSBjYWxsIHRvIG1kX2Fzc2VtYmxlLgorCShlbWl0X2FkZDY0KTogTmV3IGZ1bmN0aW9uIGZvciBleHBhbmRpbmcgYSBSRUc6PVJFRytDT05TVAorCW9wZXJhdGlvbiBpbnRvIG9uZSBvciBtb3JlIGluc3RydWN0aW9ucywgdG8gaGFuZGxlIHdpZGUgY29uc3RhbnRzLgorCShjbGVhcl9pbnNuKTogTmV3IHZhcmlhYmxlLgorCShtZF9iZWdpbik6IEZpbGwgaXQgaW4gd2l0aCB6ZXJvcyBhbmQgQkZEX1JFTE9DX05PTkUgdmFsdWVzLgorCShhbHBoYV9pcCk6IFVzZSBpdCB0byBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlIGluc25zLgorCShhbHBoYV9pcCwgbGFiZWwgImltbWVkaWF0ZSIgYW5kIGNhc2VzICdQJywgJ0cnKTogVXNlIGVtaXRfYWRkNjQKKwlmb3IgY2FsY3VsYXRpb25zLgorCitGcmkgQXVnIDI2IDE0OjQ2OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKKworCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IFJldmVyc2Ugc3RpbGwtd3JvbmcgdGVzdCBvZgorCUVNSVRfU0VDVElPTl9TWU1CT0xTLgorCisJKiB3cml0ZS5jIChCRkRfRkFTVF9TRUNUSU9OX0ZJTEwpOiBBbHdheXMgZGVmaW5lLgorCSh3cml0ZV9jb250ZW50cyk6IElmIGZpbGxfc2l6ZSBpcyAxLCB1c2UgbWVtc2V0IGluc3RlYWQgb2YgbG9vcGluZworCWNhbGxpbmcgbWVtY3B5LgorCitXZWQgQXVnIDI0IDEyOjQ2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBEZWZpbmUgYXMgMCwgZm9yIGNvbXBhdGliaWxpdHkKKwl3aXRoIG5hdGl2ZSBNSVBTIGFzc2VtYmxlci4KKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWlyaXgqKTogRG9uJ3Qgc2V0IGVtdWxhdGlvbi4KKwkqIGNvbmZpZy90ZS1pcml4Lmg6IFJlbW92ZS4KKworCSogZWNvZmYuYyAoZWNvZmZfc3ltYm9sX25ld19ob29rKTogRG9uJ3QgYWRkIGEgbmV3IGZpbGUgaWYgd2UKKwloYXZlbid0IHNlZW4gYW55IGlucHV0IGZpbGVzIHlldC4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IEp1c3QgY2FsbCBzeW1ib2xfY3JlYXRlLCByYXRoZXIKKwl0aGFuIGNhbGxpbmcgc3ltYm9sX25ldyBhbmQgdGhlbiByZW1vdmluZyB0aGUgc3ltYm9sIGZyb20gdGhlCisJbGlzdC4KKworCSogYXMuYyAobWFpbik6IE1vdmUgYSBpbnNpZGUgdGhlICNpZiAwIGJsb2NrIHdoaWNoIHVzZXMgaXQuCisJKiBlY29mZi5jIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lKTogTWFrZSBjb25zdC4KKwkqIGZyYWdzLmggKGZyYWdfYWxpZ25fcGF0dGVybik6IERlY2xhcmUuCisJKiBnYXNwLmMgKG5ld19maWxlKTogQ2FzdCBpc3AgdG8gbG9uZywgYW5kIHVzZSAlbGQgdG8gcHJpbnQgaXQuCisJKiBjb25maWcvdGMtYWxwaGEuaCAobWRfb3BlcmFuZCk6IEFkZCBjYXN0IHRvIHZvaWQuCisJKGFscGhhX2RvX2FsaWduKTogRGVjbGFyZSBhcmd1bWVudCB0eXBlcy4KKwkodGNfZ2V0X3JlZ2lzdGVyKTogRGVjbGFyZS4KKwkoYWxwaGFfZnJvYl9lY29mZl9kYXRhKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KKwkoc19tYXNrKTogRG9uJ3QgZGVjbGFyZTsgZG9lcyBub3QgZXhpc3QuCisJKGxpbmVfY29tbWVudF9jaGFycyk6IFJlbW92ZSAvKiBmcm9tIGRlc2NyaXB0aXZlIGNvbW1lbnQuCisJKHRjX2dldF9yZWdpc3Rlcik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcmVnLgorCSh0Y19nZW5fcmVsb2MpOiBEb24ndCBib3RoZXIgdG8gY29tcGFyZSB1bnNpZ25lZCB0byB6ZXJvLgorCShzX2Jhc2UpOiBDb3JyZWN0IHdhcm5pbmcgdG8gYWN0dWFsbHkgcHJpbnQgcmVnaXN0ZXIgbnVtYmVyLgorCShtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJldHZhbCwgbG9zZSwgYW5kIGkuCisJKGFscGhhX2ZpeF9hZGp1c3RhYmxlKTogTW92ZSBkZWZhdWx0IGNhc2UgaW5zaWRlIHN3aXRjaCB0byBhdm9pZAorCXdhcm5pbmcuCisJKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBSZW1vdmUgdW51c2VkIGxvY2FscyByZWxvY19hZGRyLCBwLCBzeW0sCisJYW5kIGFkZGVuZC4KKwkoZW1pdF9ieXRlX21hbmlwX3IpOiBEZWNsYXJlIHR5cGVzIGZvciBhbGwgYXJndW1lbnRzLgorCShlbWl0X2V4dHJhY3RfciwgZW1pdF9pbnNlcnRfciwgZW1pdF9tYXNrX3IpOiBMaWtld2lzZS4KKwkoZW1pdF9zaWduX2V4dGVuZCwgZW1pdF9iaXNfciwgc19wcm9jKTogTGlrZXdpc2UuCisJKGFscGhhX2lwKTogVXNlIHNwcmludF92YWx1ZSB0byBwcmludCBvZmZzZXRUIHZhbHVlLiAgUmVtb3ZlCisJdW51c2VkIGxvY2FsIHNpemUuICBSZW1vdmUgdW51c2VkIGxhYmVsIGdldF9tYWNyby4KKwkoYWxwaGFfZG9fYWxpZ24pOiBNYWtlIGZpbGwgY29uc3QuCisJKG1kX2FwcGx5X2ZpeCk6IFJlbW92ZSB1bnVzZWQgbGFiZWwgY2hlY2tfem92LgorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpNTg2IGFzIGEgc3lub255bSBmb3IgaVszNF04Ni4KKworVHVlIEF1ZyAyMyAxMjozMjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjX2xpbmVfbmV3KTogQ2hhbmdlIGxpbmVfbnVtYmVyIGFyZ3VtZW50IGZyb20KKwl1bnNpZ25lZCBzaG9ydCB0byBpbnQgc28gdGhhdCB0aGUgdHlwZSBpbiB0aGUgcHJvdG90eXBlIG1hdGNoZXMKKwl0aGUgcHJvbW90ZWQgdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KKwkoc3RhY2tfZGVsZXRlKTogQ29tbWVudCBvdXQ7IG5vdCB1c2VkLgorCSogY29uZmlnL29iai1jb2ZmLmggKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IERlY2xhcmUgaWYgbm90CisJQkZEX0FTU0VNQkxFUiwgbm90IGlmIEJGRF9BU1NFTUJMRVIuICBEZWNsYXJlIGFyZ3VtZW50IHR5cGUuCisJKiBjb25maWcvdGMtbTY4ay5oICh0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IEFkZCBpZ25vcmVkCisJYXJndW1lbnQuCisKK1R1ZSBBdWcgMTYgMDE6NDg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogVW5kbyBsYXN0IGNoYW5nZS4gIFNldCBzeV9mcmFnIGZvcgorCXRoZSBjb21tb24gc3ltYm9sIHRvIHRoZSB6ZXJvIGFkZHJlc3MgZnJhZyAodGhlIGNvcnJlY3QgZml4KS4KKworVHVlIEF1ZyAxNiAwMTo0ODoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2NvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBVbmRvIGxhc3QgY2hhbmdlLiAgU2V0IHN5X2ZyYWcgZm9yCisJdGhlIGNvbW1vbiBzeW1ib2wgdG8gdGhlIHplcm8gYWRkcmVzcyBmcmFnICh0aGUgY29ycmVjdCBmaXgpLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogU2V0IHN5X3Jlc29sdmVkIGZvciB0aGUgY29tbW9uCisJc3ltYm9sLgorCitGcmkgQXVnIDEyIDE3OjUxOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEcm9wICJlbCIgZnJvbSB0aGUgZW5kIG9mCisJVEFSR0VUX0NQVS4gIENoZWNrIGZvciBtaXBzNjRvcmlvbi4KKworVHVlIEF1ZyAgOSAxOTo0Mzo0NSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgcHBjLSotbmV0d2FyZS4KKwkqIGNvbmZpZy90ZS1wcGNudy5oOiAgTmV3IGZpbGUgdG8gc3VwcG9ydCBQb3dlci1QQy9OZXR3YXJlCisJY29uZmlndXJhdGlvbnMuICBDdXJyZW50bHksIGl0IGp1c3QgZW5hYmxlcyB0aGUgdXNlIG9mIGJhY2tzbGFzaAorCWVzY2FwZXMgaW4gc3RyaW5nIGRpcmVjdGl2ZXMuCisKK1R1ZSBBdWcgIDkgMTE6MTI6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19zdGFieCk6IENhbGwgZXhwcmVzc2lvbiBkaXJlY3RseSwgcmF0aGVyCisJdGhhbiB2aWEgcHNldWRvX3NldC4gIElmIGV4cHJlc3Npb24gaXMgYSBzeW1ib2wsIG1vdmUgc3RhYiBzeW1ib2wKKwl0byBqdXN0IGFmdGVyIHN5bWJvbCBmcm9tIGV4cHJlc3Npb24uCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3Byb2NzKTogRG9uJ3QgZm9yY2UgYWRyIG9mIGZpcnN0IGZkciB0byBiZQorCXplcm8uICBVbmRvZXMgY2hhbmdlIG9mIEp1bmUgNCwgMTk5My4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IC1tY3B1PTQ0MDAsIDQ2MDAsIGFuZAorCW9yaW9uLgorCitNb24gQXVnICA4IDE2OjI4OjA4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGFzLmg6IFJlbW92ZSBGT1BFTl9XQiBwYXRjaCBvZiBBdWcgNi4KKwkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIGZvciBoby1nbzMyIGNvcnJlY3RseS4KKwkqIGNvbmZpZy9oby1nbzMyLmg6IEZpeCBjb3B5cmlnaHQuCisKK01vbiBBdWcgIDggMTE6NTk6NTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBEZWxldGUgcmVkdW5kYW50CisJdXBwZXItY2FzZSB2ZXJzaW9ucyBvZiB0aGUgcHNldWRvLW9wcy4KKworTW9uIEF1ZyAgOCAxMzo0MjoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYQorCW5vbiBQQyByZWxhdGl2ZSByZWxvYywgZG9uJ3QgcHV0IHRoZSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlLgorCitTYXQgQXVnICA2IDAxOjE1OjAyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGFzLmg6IElmIEZPUEVOX1dCIGlzIG5vdCBkZWZpbmVkLCBkbyB0aGUgcmlnaHQgdGhpbmcgaW4gYSBnbzMyCisJZW52aXJvbm1lbnQuCisKK01vbiBKdWwgMTEgMTE6MzQ6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWg4MzAwLmMgKHBpbnQpOiBOZXcgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHZhcnlpbmcKKwlzaXplIG9mIGludCBwc2V1ZG8gb3AuCisJKiBkb2MvYXMudGV4aW5mbzogRml4IHR5cG8gZGVzY3JpYmluZyAuaDgzMDBoIHBzZWR1b3AuCisKK01vbiBBdWcgIDEgMDI6NDA6NDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3BhY2UpOiBJbml0aWFsaXplIHNkX3N1YnNwYWNlcworCWZpZWxkIGluIHRoZSBzcGFjZSBjaGFpbi4KKworCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQorCWhwcGFfZ2VuX3JlbG9jX3R5cGUuCisKK1RodSBKdWwgMjggMTU6NDU6MzcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQ2hlY2sgbW9yZSBjYXJlZnVsbHkgZm9yCisJY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcy4KKwkobWRfcGFyc2Vfb3B0aW9uKSBbTk9fVjldOiBDb21wbGFpbiBpZiB2OSB3YXMgc2VsZWN0ZWQuCisJKG1kX3Nob3dfdXNhZ2UpOiBEZXJpdmUgYXJjaGl0ZWN0dXJlIGxpc3QgaW4gdXNhZ2UgbWVzc2FnZSBmcm9tCisJYXJjaGl0ZWN0dXJlX3BuYW1lIGFycmF5LgorCShjeXByZXNzKTogTWFjcm8gZGVsZXRlZC4KKwkob3BfaGFzaCk6IERvbid0IGluaXRpYWxpemUuCisJKHNfY29tbW9uKTogVXNlIGJmZF91bmRfc2VjdGlvbl9wdHIgaW5zdGVhZCBvZiBiZmRfdW5kX3NlY3Rpb24uCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChCU1IpOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjX2lwKTogVXNlIGl0IGZvciByaWdodC1zaGlmdCBvcGVyYXRpb25zIG9mIDMyIGJpdHMgb3IgbW9yZS4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSW1wbGVtZW50IG5ldyBvcGVyYW5kIHR5cGUgJ3gnLgorCitUdWUgSnVsIDI2IDE4OjIxOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5oOiBNb3ZlZCBjb21tb24gaW5jbHVkZXMgYW5kIFRBUkdFVF9GT1JNQVQKKwlkZWZpbml0aW9ucyB0b2dldGhlci4KKwkoV09SS0lOR19ET1RfV09SRCwgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRCwKKwlPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiwgQkZEX0hFQURFUlMsIEJGRCkgWyFCRkRfQVNTRU1CTEVSXToKKwlNb3ZlZCB0aGVzZSBkZWZpbml0aW9ucyB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIGJlZm9yZSB0aGUKKwlpbmNsdWRlcy4KKwkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUywgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMpOiBBbHdheXMKKwlkZWZpbmUgdGhlc2UuCisJKFNfR0VUX1pFUk9FUyk6IERlbGV0ZWQuCisJKFNfU0VUX1pFUk9FUyk6IE1vdmVkIHRvIG9iai1jb2ZmLmMuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl8qIHBzdWVkby1vcCBmbnMpOiBEZWxldGVkCisJZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisJKG9ial9wc2V1ZG9fdGFibGUpOiBNb3ZlZCB0byBvbmUgdmVyc2lvbiBlbmQgb2YgZmlsZSwKKwljb25kaXRpb25hbGl6ZWQgaW50ZXJuYWxseS4KKwkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3AsCisJdGFnX2hhc2gsIHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZCwgdGFnX2ZpbmRfb3JfbWFrZSk6IE1vdmVkCisJdG8gb25lIGNvbWJpbmVkIHZlcnNpb24gYXQgdG9wIG9mIGZpbGUsIHVuY29uZGl0aW9uYWwuICBEZWxldGVkCisJZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisJKHNfZ2V0X25hbWUpOiBNb3ZlZCBvbmUgY29weSBvZiBkZWNsYXJhdGlvbnMgdG8gc3RhcnQgb2YgZmlsZS4KKwkoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk6IERpdHRvLiAgRG9uJ3QgaW5pdGlhbGl6ZS4KKwkoU19TRVRfWkVST0VTKTogTW92ZWQgaGVyZSBmcm9tIG9iai1jb2ZmLmguCisJKHdyaXRlX29iamVjdF9maWxlKTogSWYgVENfQ09GRl9TRVRfTUFDSElORSBpcyBkZWZpbmVkLCBjYWxsIGl0IG9uCisJdGhlIGZpbGUgaGVhZGVycy4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKHNlZ19pbmZvX29mZl9ieV80KTogTm93IGNvbnN0IGFuZCBzdGF0aWMuCisJKFNFR19JTkZPX0ZST01fU0VHX05VTUJFUik6IFVudXNlZCBtYWNybyBkZWxldGVkLgorCShwcmV2aW91c19maWxlX3N5bWJvbCwgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2V4dGVyblAsCisJc3ltYm9sX2V4dGVybl9sYXN0UCwgbGFzdF9mdW5jdGlvblApIFshQkZEX0FTU0VNQkxFUl06IERvbid0CisJYm90aGVyIGV4cGxpY2l0bHkgaW5pdGlhbGl6aW5nIHRvIHplcm8gdmFsdWUuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbVENfSTk2MF06IFVzZSBTRl9HRVRfQkFMTkFNRQorCWFuZCBTRl9HRVRfQ0FMTE5BTUUgaW5zdGVhZCBvZiB0aGUgVENfU19JU18gdmVyc2lvbnMuCisKKwkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0NPRkZfU0VUX01BQ0hJTkUpOiBOZXcgbWFjcm8uICBDYWxscworCXRjX2hlYWRlcnNfaG9vay4KKworCSogY29uZmlnL3RjLWk5NjAuYyAodGFyZ19oYXNfaWNsYXNzKTogVXNlIElfQ1ggfCBJX0NYMiB3aGVyZSBJX0NYCisJd2FzIHVzZWQgcHJldmlvdXNseS4KKwkodGNfaGVhZGVyc19ob29rKTogSWYgSV9DWDIgaXMgZm91bmQsIHNldCBmbGFncyB0byBGX0k5NjBDQS4KKworCSogY29uZmlnL3RjLWk5NjAuYyAocG9faGFzaCk6IERlY2xhcmF0aW9uIGRlbGV0ZWQuCisJKG5leHRfb2JqZWN0X2ZpbGVfY2hhclApOiBEaXR0by4KKwkocmVnbmFtZXMsIGFyZWdzLCBjb2opOiBOb3cgY29uc3QuCisJKHBhcnNlX21lbW9wKTogU3RhdGljIGFycmF5IGRlZl9zY2FsZSBub3cgY29uc3QuCisJKG1kX2JlZ2luKTogQ2FzdCBhd2F5IGNvbnN0IHdoZW4gcGFzc2luZyBoYXNoIHJvdXRpbmVzIGFkZHJlc3NlcworCW9mIHZhbHVlcyBpbiByZWduYW1lcyBvciBhcmVncy4KKwkobWRfbG9uZ29wdHMpOiBBZGRlZCAibGluay1yZWxheCIgYW5kICJuby1yZWxheCIgaHlwaGVuYXRlZCBmb3Jtcy4KKwlDb250aW51ZSB0byBhY2NlcHQgb25lLXdvcmQgZm9ybXMuCisJKHN0cnVjdCB0YWJlbnRyeSwgYXJjaF90YWIpOiBNb3ZlZCB0byB0b3AgbGV2ZWwgZnJvbSBpbnNpZGUKKwltZF9wYXJzZV9vcHRpb24uICBOb3cgY29uc3QuCisJKG1kX3Nob3dfdXNhZ2UpOiBVc2UgYXJjaF90YWIgdG8gZ2VuZXJhdGUgdXNhZ2UgbWVzc2FnZS4gIFByaW50CisJaHlwaGVuYXRlZCBmb3JtcyBvZiByZWxheCBvcHRpb25zLgorCisJKiBjb25maWcvdGMtaTk2MC5oIChERUZJTkVfSTk2MF9BT1VULCBUQ19TX0lTXyosIFRDX1NfKl9TWVNQUk9DLAorCVRDX1NfRk9SQ0VfVE9fKik6IE1vdmVkIGZyb20gaGVyZS4uLgorCSogY29uZmlnL3RjLWk5NjAuYzogLi4uIHRvIGhlcmUuICBDaGFuZ2VkIERFRklORV9JOTYwX0FPVVQgc3R1ZmYKKwl0byB0ZXN0IE9CSl9BT1VUIGFuZCBPQkpfQk9VVCBkaXJlY3RseS4KKworCSogY29uZmlnL3RjLWk5NjAuaCAoQ1RSTCwgQ09CUiwgQ09KLCBSRUcsIE1FTSosIEZCUkEsIENBTExKLAorCU0xLU0zLCBSRUdfT1BDLCBSXyosIFNGUiwgTElULCBGUCwgT1AsIFIsIFJTLCBSTCwgUlNMLCBGLAorCXtSLEZ9eyxMfXsyLDR9LCBNLCBTRlJfT0ssIExJVF9PSywgRlBfT0ssIFJFR19BTElHTiwgTUVNT1AsIElfKik6CisJTWFjcm9zIGRlbGV0ZWQuCisKKwkqIGNvbmZpZy90Yy1pOTYwLmMgKEFSQ0hfSlgpOiBEZWZpbmUuCisJKGFyY2hfdGFiKTogSW5jbHVkZSBKWC4KKwkodGFyZ19oYXNfc2ZyLCB0YXJnX2hhc19pY2xhc3MpOiBIYW5kbGUgSlguCisJKHRjX2hlYWRlcnNfaG9vayk6IFNldCBmbGFncyB0byBGX0k5NjBKWCBmb3IgaTk2MEpYLgorCitGcmkgSnVsIDE1IDE1OjM2OjUxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBIYWQgbGFzdCBjaGFuZ2UgYmFja3dhcmRzLgorCitUaHUgSnVsIDE0IDEzOjIxOjA2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9hdG9mLW5zMzJrLmM6IERlbGV0ZWQuCisKKwkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFVzZQorCWJmZF9pbmRfc2VjdGlvbl9wdHIgYW5kIGJmZF91bmRfc2VjdGlvbl9wdHIuCisKKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ29tcGFyZSBzZWdUIHZhbHVlcyBkaXJlY3RseSwKKwl3aXRob3V0IGNhc3RpbmcgdG8gaW50IGZpcnN0LgorCisJKiBjb25maWcvdGMtbnMzMmsuYyAobWRfYmVnaW4pOiBSZXR1cm4gdmFsdWUgZnJvbSBoYXNoX2luc2VydAorCXNob3VsZCBiZSBwb2ludGVyIHRvIGNvbnN0LiAgRG9uJ3QgY2FsbCBleGl0IGV4cGxpY2l0bHkgYWZ0ZXIKKwljYWxsaW5nIGFzX2ZhdGFsOyBpdCB3b24ndCByZXR1cm4uCisJKGNvbnZlcnRfaWlmKTogTWFrZSBsb2NhbCB2YXJpYWJsZSBqIGJlIHBvaW50ZXIgdG8gYml0X2ZpeFMsIHNpbmNlCisJdGhhdCdzIGhvdyBpdCdzIHVzZWQuCisJKGVuY29kZV9vcGVyYW5kLCBjYXNlICdiJyk6IElnbm9yZSBzcHJpbnRmIHJldHVybiB2YWx1ZS4gIERvbid0IHRyeQorCWNvbnZlcnRpbmcgZnJlZXB0ciB0byBpbnQgYW5kIGJhY2suCisKKwlNZXJnZWQgaW4gTlMzMksgc3VwcG9ydCB1cGRhdGUgZnJvbSBJYW4gRGFsbCAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KToKKworCSogY29uZmlnL3RlLXBjNTMybWFjaC5oOiBOZXcgZmlsZS4gcGM1MzItbWFjaCB0YXJnZXQgZW11bGF0aW9uLgorCisJKiBjb25maWcvdGUtbmV0YnNkNTMyLmg6IE5ldyBmaWxlLiBOZXRic2Q1MzIgdGFyZ2V0IGVtdWxhdGlvbi4KKworCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBkZWZpbml0aW9uIG9mIE5PUF9PUENPREUuCisKKwkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgcHJvdG90eXBlIGZvciBmaXhfbmV3X25zMzJrX2V4cC4KKworCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBCRkRfQVNTRU1CTEVSIHN1cHBvcnQuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19nZW5fcmVsb2MpOiBOZXcgZnVuY3Rpb24gZm9yIEJGRF9BU1NFTUJMRVIuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChmaXhfbmV3X25zMzJrX2V4cCk6IEdldCByZWxvYyB0eXBlCisJZGlmZmVyZW50bHkgZm9yIEJGRF9BU1NFTUJMRVIuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEdldCByZWxvYworCXR5cGUgZGlmZmVyZW50bHkgZm9yIEJGRF9BU1NFTUJMRVIuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jcmVhdGVfbG9uZ19qdW1wKTogU2l6ZSBvZiBvcGNvZGUgaXMgb25lCisJbm90IDIuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDb2RlIGZvciB0aGUgQkZEX0FTU0VNQkxFUgorCWNhc2UuIEFsc28gdXNlIHNtYXJ0IG1kX3BjcmVsX2FkanVzdCBmdW5jdGlvbi4KKworCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2FwcGx5X2ZpeCk6IENvZGUgZm9yIHRoZSBCRkRfQVNTRU1CTEVSCisJY2FzZS4gQWxzbyB1c2Ugc21hcnQgbWRfZml4X3BjcmVsX2FkanVzdCBmdW5jdGlvbi4KKworCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2ZpeF9wY3JlbF9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FuCisJZmluZCBvZmZzZXQgZnJvbSBvcGNvZGUgdG8gb3BlcmFuZCBldmVuIGlmIGluIGFub3RoZXIgZnJhZworCWFuZCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmVsYXhpbmcuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9wY3JlbF9hZGp1c3QpOiBOZXcgZnVuY3Rpb24gd2hpY2ggY2FuCisJZmluZCBvZmZzZXQgZnJvbSBvcGNvZGUgdG8gb3BlcmFuZCBldmVuIGlmIGluIGFub3RoZXIgZnJhZworCWFuZCBpbiB0aGUgcHJlc2VuY2Ugb2YgcmVsYXhpbmcuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9udW1iZXJfdG9fZGlzcCk6IENoZWNrIHJhbmdlcyBwcm9wZXJseS4KKworCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2F0b2YpOiB1c2UgYXRvZl9pZWVlIGluc3RlYWQgb2Ygc3BlY2lhbAorCWF0b2ZfbnMzMmsuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChyZWxvYyk6IE5ldyAoc3RhdGljKSBmdW5jdGlvbiBmb3IKKwlCRkRfQVNTRU1CTEVSLgorCisJKiBjb25maWcvdGMtbnMzMmsuYyAoY29udmVydF9paWYpOiBNb3JlIGNvcnJlY3QgcGMgcmVsYXRpdmUgY29kZS4KKwltZF9yZWxheCBtdXN0IGJlIGFibGUgdG8gZmluZCBvcGNvZGUgYWRkcmVzcyBldmVuIGlmIGluIGFub3RoZXIgZnJhZy4KKworCSogY29uZmlnL3RjLW5zMzJrLmM6IE1vcmUgZXh0ZW5zaXZlIGNvbW1lbnRzLgorCisJKiBjb25maWcvdGMtbnMzMmsuYyAoZW5jb2RlX29wZXJhbmQpOiBTdXBwb3J0IG5ldyBvcGVyYW5kIGNsYXNzZXMgSQorCWFuZCBaLiBEcm9wIFEuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChmaXhfbmV3X25zMzJrX2V4cCk6IG5ldyBmdW5jdGlvbiBhbmQKKwljb3JyZXNwb25kaW5nIHByb3RvdHlwZS4KKworCSogY29uZmlnL3RjLW5zMzJrLmM6IG1ha2UgMzI1MzIgZGVmYXVsdCBtYWNoaW5lIGluc3RlYWQgb2YgMzIwMzIuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jOiBpbmNsdWRlIG9wY29kZS9uczMyay5oIGFmdGVyIGFzLmgKKworCSogYW91dF9nbnUuaDogcl9kaXNwIG5lZWRzIHRvIGJlIDIgYml0cyBmb3IgVENfTlMzMksKKworCSogd3JpdGUuaDogZnhfaW1fZGlzcCBuZWVkcyB0byBiZSAyIGJpdHMgYmlnIGZvciBUQ19OUzMySworCisJKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogVXNlIFRDX1BDUkVMX0FESlVTVCBtYWNybyAoaWYgZGVmaW5lZCkKKwlpbnN0ZWFkIG9mIGFkZGluZyBwY3JlbF9hZGp1c3QuCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQWRqdXN0IHRvX2FkZHIgZm9yIHRoZQorCUJST0tFTl9ET1RfV09SRCBmZWF0dXJlIGZvciB0aGUgQkZEX0FTU0VNQkxFUiBjYXNlLgorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBUQ19DT05TX0ZJWF9ORVcgaWYgaXQgaXMgZGVmaW5lZC4KKworCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBBZGQgY29kZSAoY3VycmVudGx5IGlmCisJQkZEX0ZBU1RfU0VDVElPTl9GSUxMIGlzIGRlZmluZWQpIHRvIG1ha2UgbGFyZ2UgZmlsbHMgYSBsb3QgZmFzdGVyLgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBuczMyayBmcm9tIHNwZWNpYWwgRlAgbGlzdC4gQWxsIHRoZSBuczMyaworCXNlcmllcyB1c2UgaWVlZSBmbG9hdC4KKworCSogY29uZmlndXJlLmluOiBBZGQgbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkIHRhcmdldHMKKworCSogYXMuaDogaW5jbHVkZSBleHByLmggYmVmb3JlIHRhcmctZW52LmguIFNvbWUgdGFyZ2V0IGRlcGVuZGVudCBmaWxlCisJd2FudCB0byB1c2UgZXhwciBzdHJ1Y3R1cmVzLgorCitXZWQgSnVsIDEzIDE0OjQ5OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoYW5nZSBycCB0byBiZSBhIGNvbnN0IHBvaW50ZXIuCisJKG1kX3BhcnNlX29wdGlvbik6IENsZWFyIGNwdSBmaWVsZCBvZiBjdXJyZW50X2FyY2hpdGVjdHVyZSBiZWZvcmUKKwlzZXR0aW5nIGEgbmV3IGNwdSB0eXBlLiAgQ2xlYXIgbm9fNjg4ODEgZm9yIG02ODg4MSBvciBtNjg4ODIuCisJQ2xlYXIgbm9fNjg4NTEgZm9yIG02ODg1MS4KKworVHVlIEp1bCAxMiAyMToyNzowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvaG8tc3lzdi5oIChyZWFsbG9jKTogRGVjbGFyZS4KKworCSogc3ltYm9scy5jIChzeW1ib2xfY3JlYXRlKTogTmV3IGZ1bmN0aW9uLCBtb3N0IG9mIHRoZSBndXRzIG9mIHRoZQorCW9sZCBzeW1ib2xfbmV3IGZ1bmN0aW9uLgorCShzeW1ib2xfbmV3KTogTm93IGp1c3QgY2hlY2tzIHN5bWJvbF90YWJsZV9mcm96ZW4sIGNhbGxzCisJc3ltYm9sX2NyZWF0ZSwgYW5kIGVudGVycyB0aGUgc3ltYm9sIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KKwkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyBub3QgdHJ1ZSwKKwlhbmQgdGhlIHN5bWJvbCB0YWJsZSBpcyBmcm96ZW4sIGNhbGwgc3ltYm9sX2NyZWF0ZSBpbnN0ZWFkIG9mCisJc3ltYm9sX25ldy4KKwkqIHN5bWJvbHMuaCAoc3ltYm9sX2NyZWF0ZSwgc3ltYm9sX3RhYmxlX2Zyb3plbik6IERlY2xhcmUuCisKKwkqIHN5bWJvbHMuYyAoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBBbHdheXMgYSBmdW5jdGlvbiBub3cuCisJKiBzdHJ1Yy1zeW1ib2wuaCAoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBEZWxldGVkIG1hY3JvCisJdmVyc2lvbi4KKworCSogc3ltYm9scy5jIChkZWJ1Z192ZXJpZnlfc3ltY2hhaW4pOiBOZXcgbWFjcm8sIGRlZmluZWQgdG8gYmUKKwl2ZXJpZnlfc3ltYm9sX2NoYWluIG9yIGEgY2FzdCB0byB2b2lkLCBkZXBlbmRpbmcgb24gREVCVUdfU1lNUy4KKwkobWFueSBmdW5jdGlvbnMpOiBJbnZva2UgZGVidWdfdmVyaWZ5X3N5bWNoYWluIHVuY29uZGl0aW9uYWxseS4KKworVHVlIEp1bCAxMiAxMjowNjo0MiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5oOiBjaGFuZ2UgY2FsbGluZyBpbnRlcmZhY2Ugb2YKKwlPQkpfR0VORVJBVEVfQVNNX0xJTkVfU1RBQi4KKwkqIGNvbmZpZy9vYmotZWxmLmg6IGRpdHRvLgorCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBkaXR0by4KKwkqIGVjb2ZmLmg6IGNoYW5nZSBjYWxsaW5nIGludGVyZmFjZSBvZgorCWVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIuCisJKiBlY29mZi5jIChhZGRfZmlsZSk6IHJlY29yZCBvZiBmaWxlbmFtZSB0byBoYW5kbGUgY2FzZSBvZiBpbmNsdWRlCisJZmlsZXMsIGFsc28gY2hhbmdlIGRlZmF1bHQgYnVpbHQtaW4gdHlwZSBmcm9tIGludCB0byB2b2lkIGZvcgorCWFzbSBmaWxlLgorCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IGhhbmRsZSBjYXNlIG9mIGluY2x1ZGUKKwlmaWxlcy4KKworTW9uIEp1bCAxMSAxNzoyMDoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogSW4gY2FzZSBNX0xBX0FCLCBTVlI0X1BJQywgbGFyZ2UKKwljb25zdGFudCwgYW5kIGNhc2UgbGRkX3N0ZCwgc2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0ZW1wb3JhcmlseSB0bworCWF2b2lkIGluc2VydGluZyBhbiB1bmV4cGVjdGVkIG5vcCBpbnN0cnVjdGlvbi4KKworU2F0IEp1bCAgOSAwMDowNToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IEhhbmRsZSBjb3VudCBjb3JyZWN0bHkgZm9yIGxhc3QKKwlsaW5lIG51bWJlci4KKworRnJpIEp1bCAgOCAxNToyMjowNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBnYXNwLmMgKHByb2Nlc3NfcHNldWRvX29wKTogUGFzcyByaWdodCBhcmdzIHRvIGRvIGRvX2FpZi4KKwkoZ2V0X2FueV9zdHJpbmcpOiBOZXcgYXJnICdwcmV0ZW5kX3F1b3RlJy4KKwkoZ2V0X2FuZF9wcm9jZXNzLCBkb19mb3JtYWxzLCBtYWNyb19leHBhbmQsIGRvX3NkYXRhLAorCXByb2Nlc3NfcHNldWRvX29wKTogVXNlIG5ldyBhcmcuCisKK0ZyaSBKdWwgIDggMTI6MjM6NDQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5oOiBkZWZpbmUgbWFjcm8gT0JKX0dFTkVSQVRFX0FTTV9MSU5FX1NUQUIuCisJKiBjb25maWcvb2JqLWVsZi5oOiBkaXR0by4KKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZ2VuZXJhdGUgbGluZSBzdGFicyBmb3IgYXNtIGZpbGUuCisJKiByZWFkLmg6IGFkZCBleHRlcm4gZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYi4KKwkqIGVjb2ZmLmggOiBhZGQgcHJvdG90eXBlIGZvciBlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKCkuCisJKiBlY29mZi5jIChhZGRfZmlsZSk6IGlmIHRoZXJlJ3Mgbm8gZmlsZW5hbWUgcHJvdmlkZWQsIHNldCBzd2l0Y2gKKwl0byBnZW5lcmF0ZSBsaW5lIHN0YWJzIGZvciAucyBmaWxlLgorCSogZWNvZmYuYyAoYWRkX3Byb2NlZHVyZSk6IGFkZCBzdGFicyBzeW1ib2wgZm9yIC5lbnQgZGlyZWN0aXZlLgorCSogZWNvZmYuYyAoZ2VuZXJhdGVfZWNvZmZfc3RhYik6IGNyZWF0ZXMgYW4gYXJ0aWZpY2lhbCBzdGFicy4KKwkqIGVjb2ZmLmMgKGdlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBnZW5lcmF0ZSBhIGFydGlmaXRpYWwgbGFiZWwKKwlmb3IgZWFjaCBsaW5lIGFuZCBnZW5lcmF0ZSBhIHN0YWJuIGZvciB0aGUgbGluZS4KKworVGh1IEp1bCAgNyAxNzowNDowMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBnYXNwLmMgKGdldF9hbnlfc3RyaW5nKTogQ29wZSB3aXRoIGdldHRpbmcgYSBzdHJpbmcgd2l0aCBhbgorCWFsdGVybmF0ZSBiYXNlIHNwZWNpZmllci4KKwkoZG9fYWlmLCBkb19hZWxzZSk6IE9ubHkgZW5hYmxlIG91dHB1dCBpZiBleHByZXNzaW9uIGlzIHRydWUgYW5kIHByZXZpb3VzCisJbGV2ZWwgd2FzIG9uLgorCShjaGFydHlwZV9pbml0KTogIEFkZCBCQVNFQklUIGNoYXJ0eXBlLgorCShwcm9jZXNzX3BzZXVkb19vcCk6ICBOb3RpY2UgbmVzdGVlZCBBSUZzLgorCitUaHUgSnVsICA3IDEyOjMwOjIyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IENvZGUgZm9yIDIgYml0IHJlbG9jIHR5cGUgdXNpbmcgaW4gdHJhcGEKKwlpbnNuLiAgKGZpeCBwciA1MTY1LCA1MTc0KQorCitUaHUgSnVsICA3IDExOjMxOjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChSX0RMVF9SRUwpOiBJZiBpdCBpc24ndCBkZWZpbmVkLCB0aGVuIGRlZmluZQorCXRvIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHRvIGF2b2lkIGxvc2luZyBvbiBvbGQgaHB1eCBzeXN0ZW1zLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IHJlZHVjdGlvbnMgZm9yCisJc3ltYm9scyBpbiBETFQgcmVsYXRpdmUgcmVsb2NzLgorCSh0Y19nZW5fcmVsb2MpOiBaZXJvIG91dCB0aGUgYWRkZW5kIGZpZWxkIGZvciBETFQgcmVsYXRpdmUgcmVsb2NzLgorCitXZWQgSnVsICA2IDAxOjA3OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfdGMpOiBJZiBub3QgT0JKX0NPRkYsIGZvcmNlIFRPQyBlbnRyeSB0bworCWFsaWduIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LgorCitUdWUgSnVsICA1IDE1OjQyOjA5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBIYW5kbGUgMzItYml0IGFkZGVuZHMuCisJKGdwZGlzcF9oaTE2X2hvd3RvKTogTm93IHBvaW50cyB0byBjb25zdC4KKwkobG9hZF9pbnNuX3RhYmxlLCBhbHBoYV9pcCk6IEZpeCB1c2VzIG9mIGNvbnN0LgorCisJKiBkb2MvaW50ZXJuYWxzLnRleGk6IFVwZGF0ZXMgdG8gQ09GRiBkZXNjcmlwdGlvbi4gIEFkZGVkICJAZW5kCisJZGVmbWFjIiBhcyBuZWVkZWQsIGFuZCBzb21lIGV4dHJhIGhlYWRpbmcgYW5kICJAYnllIiBzbyBpdCdsbAorCWZvcm1hdCBhcyBhIHNlcGFyYXRlIGRvY3VtZW50LgorCitUdWUgSnVsICA1IDEzOjU0OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfQUxJR04sIFNfU0VUX0FMSUdOKTogRGVmaW5lLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBTZXQgYWxpZ25tZW50IG9mIGNvbW1vbgorCXN5bWJvbC4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IElmIE9CSl9FTEYsIHNldCBhbGlnbm1lbnQgb2YKKwljb21tb24gc3ltYm9sLgorCitNb24gSnVsICA0IDE4OjI5OjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChpc19jb21wbGV4KTogTmV3IG1hY3JvLgorCShjb25zX2ZpeF9uZXdfaHBwYSk6ICJIYW5kbGUiIGNvbXBsZXggZXhwcmVzc2lvbnMuCisKK0ZyaSBKdWwgIDEgMDA6NDg6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgc19hbGlnbiBmaWVsZCBmcm9tCisJc2VjdGlvbl9hbGlnbm1lbnQgYXJyYXkuCisKK1RodSBKdW4gMzAgMTU6MDU6MjggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgYmZkX2NvbV9zZWN0aW9uX3B0ci4KKwkqIGFzLmggKGFic29sdXRlX3NlY3Rpb24sIHVuZGVmaW5lZF9zZWN0aW9uKTogVXNlIG5ldyBCRkQgbWFjcm9zCisJYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQgYmZkX3VuZF9zZWN0aW9uX3B0ci4KKworVGh1IEp1biAzMCAxNDozNjozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRm9yIE1fTElfU1MsIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0CisJYmFzZWQgb24gY29udGVudHMgb2YgaW1tX2V4cHIgYW5kIG9mZnNldF9leHByLCByYXRoZXIgdGhhbgorCW1pcHNfcGljLiAgRm9yIE1fTElfREQsIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0IGJhc2VkIG9uIHNlZ21lbnQKKwluYW1lIG9mIG9mZnNldF9leHByLCByYXRoZXIgdGhhbiBtaXBzX3BpYy4KKwkobWlwc19pcCk6IElmIGdfc3dpdGNoX3ZhbHVlIDwgNCwgdXNlIGltbWVkaWF0ZSB2YWx1ZXMgZm9yICdsJy4KKwlJZiBnX3N3aXRjaF92YWx1ZSA8IDgsIHVzZSAucmRhdGEgcmF0aGVyIHRoYW4gLmxpdCBmb3IgJ0wnLgorCitXZWQgSnVuIDI5IDE3OjMwOjQ2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogYXMuYyAoc2hvd191c2FnZSk6IEJyZWFrIGxvbmcgc3RyaW5nIGludG8gc2hvcnRlciBvbmVzLgorCShwYXJzZV9hcmdzKTogQWRkIC12LCBwcmludHMgdmVyc2lvbiBpZCBhbmQgY29udGludWVzLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEJyZWFrIGxvbmcgc3RyaW5nLgorCitNb24gSnVuIDI3IDA5OjQ3OjE2IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAiLVYiIGFuZCAiLVEiIGlmCisJT0JKX0VMRiBpcyBkZWZpbmVkLgorCitTdW4gSnVuIDI2IDE2OjMwOjQ4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogYXMuYyAobWFpbikgW0hPU1RfU1BFQ0lBTF9JTklUXTogTmV3IGhvb2ssIGZvciBob3N0LXNwZWNpZmljCisJaW5pdGlhbGl6YXRpb24uCisKK1dlZCBKdW4gMjIgMDA6MjQ6NTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZSBmb3IgT0JKX0VMRi4KKwlNb3JlIGdhcy9iZmQgbG9zc2FnZSBleHBvc2VkIGJ5IHRoZSBuZXcgbGlua2VyIGNvZGUuCisKK1R1ZSBKdW4gMjEgMTE6MzI6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBDbGVhciBzZWdpbmZvIGFmdGVyIGFsbG9jYXRpbmcgaXQuCisJKHN1YnNlZ19nZXQpOiBQYXNzIGFjdHVhbCBzaXplIG9mIHNlZ2luZm8gdG8gbWVtc2V0LgorCisJKiBzdWJzZWdzLmMgKGFic19zZWdfaW5mbywgdW5kX3NlZ19pbmZvKTogRGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCisJKHN1YnNlZ19jaGFuZ2UpOiBTdG9yZSBzZWdfaW5mbyBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBpbgorCWFic19zZWdfaW5mbywgYW5kIHN0b3JlIHNlZ19pbmZvIGZvciBiZmRfdW5kX3NlY3Rpb25fcHRyIGluCisJdW5kX3NlZ19pbmZvLgorCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgb3V0cHV0X3NlY3Rpb24gaWYgaXQgaXMKKwlhbHJlYWR5IHNldC4KKwkoc2VnX2luZm8pOiBEZWZpbmUgYXMgZnVuY3Rpb24uCisJKiBzdWJzZWdzLmggKHNlZ19pbmZvKTogRGVjbGFyZSBhcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBkZWZpbmluZworCWFzIG1hY3JvLgorCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ2FsbCBzZWdfaW5mbyByYXRoZXIgdGhhbgorCWJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YS4KKworTW9uIEp1biAyMCAxNjozMDo1NCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHBwYy0qLWVsZiopOiBOZXcgdGFyZ2V0LCBsaWtlIC1zeXN2NCouCisKKwkqIGV4cHIuYyAob3BlcmFuZCk6IElmICIwZiIgaXMgZm9sbG93ZWQgYnkgJ1wwJywgZG9uJ3QgZG8gZW9sCisJY2hlY2tzLgorCitNb24gSnVuIDIwIDE1OjE3OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfYXV4KTogQ2FsbCBzd2FwX3Rpcl9vdXQgYW5kIHN3YXBfcm5keF9vdXQKKwl2aWEgYmFja2VuZCBwb2ludGVyLCBub3QgZGlyZWN0bHkuCisKK0ZyaSBKdW4gMTcgMTg6MDU6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogTWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQorCWVsZW1lbnQgaW4gdGhlIGZvciBsb29wLgorCitGcmkgSnVuIDE3IDExOjAxOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jOiBNaXNjIHRyaXZpYWwgY2hhbmdlcyB0byBtYWtlIGdjYyAtV2FsbCBoYXBweS4KKworCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlY2xhcmUuCisKK1dlZCBKdW4gMTUgMjA6NDQ6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogYXMuYyAocGFyc2VfYXJncyk6IENhc3QgeG1hbGxvYyByZXR1cm4gdmFsdWUuCisKKwkqIE1ha2VmaWxlLmluIChjb25maWctc3RhbXApOiBJZiAkKGRlZnMpIGNvbnRhaW5zIG11bHRpcGxlIHdvcmRzLAorCWVtaXQgYSAjZGVmaW5lIGxpbmUgZm9yIGVhY2guCisJKiBjb25maWd1cmUuaW46IEZvciBzcGFyYzY0IHRhcmdldCwgdXNlIHNwYXJjIGNwdSBmaWxlcyBhbmQgYWRkCisJc3BhcmN2OSB0byBleHRyYV9kZWZzLiAgTm8gbG9uZ2VyIHRyZWF0IHNwYXJjNjQtKi1hb3V0KiBzcGVjaWFsbHkuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZW1iYXJfbWFza3MpOiBOb3cgc3RhdGljIGFuZCBjb25zdC4KKwkobWRfc2hvd191c2FnZSkgWyFOT19WOV06IEFkZCAtQXY5IHRvIHVzYWdlIG1lc3NhZ2UuCisJKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSBbc3BhcmN2OV06IEluaXRpYWxpemUgdG8gdjkuCisJKG1kX2JlZ2luKSBbc3BhcmN2OV06IERvbid0IGJvdGhlciBjaGFuZ2luZyBpdCB1bmNvbmRpdGlvbmFsbHkKKwloZXJlLgorCShzX3Jlc2VydmUpOiBEb24ndCBwYXNzIHVuZXhwZWN0ZWQgYXJndW1lbnQgdG8gYXNfYmFkIHdpdGgKKwliYWQtc2VnbWVudCBtZXNzYWdlLgorCisJKiBhcy5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCisKKwkqIGNvbmZpZy9hdG9mLWllZWUuYyAoaW50X3RvX2dlbik6IENvbW1lbnRlZCBvdXQgdW51c2VkIHJvdXRpbmUuCisKKwkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBSZW1vdmVkIGNoZWNrIG9mIG9wZXJhbmQgc2VjdGlvbi4KKworCUZyaSBKdW4gIDMgMTc6MjU6MDggMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIGNvbmZpZy9vYmotdm1zLmggKERCR19TX0NfQ09NUExYNCwgREJHX1NfQ19DT01QTFg4KTogZGVmaW5lCisJdGhlc2UgbmV3IFZNUyBzeW1ib2wtdHlwZSBtYWNyb3MgZm9yIGBjb21wbGV4IGZsb2F0JyBhbmQKKwlgY29tcGxleCBkb3VibGUnIHN1cHBvcnQuICBUaGVpciB2YWx1ZXMgY29tZSBmcm9tIHRoZSBleGlzdGluZworCURTQyRLX0RUWVBFX0ZDIGFuZCBEU0MkS19EVFlQRV9EQyBtYWNyb3MgaW4gPGRlc2NyaXAuaD4uCisJKERCR19TX0NfUkVBTDhfRywgREJHX1NfQ19DT01QTFg4X0cpOiBHX2Zsb2F0IHZlcnNpb25zIG9mCisJUkVBTDggYW5kIENPTVBMWDg7IG5vdCB1c2VkIHlldCwgYmVjYXVzZSBnY2Mgb3V0cHV0cyB0aGUgc2FtZQorCS5zdGFicyBmb3IgYGRvdWJsZScgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGAtbWcnIGlzIHVzZWQuCisJKiBjb25maWcvb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogYWRkIGVudHJpZXMKKwlmb3IgZ2NjMidzIHByZWRlZmluZWQgdHlwZXMgImNvbXBsZXggZmxvYXQiLCAiY29tcGxleCBkb3VibGUiLAorCWFuZCAiY29tcGxleCBsb25nIGRvdWJsZSIgKGlkZW50aWNhbCB0byBjb21wbGV4IGRvdWJsZSkuCisKK1dlZCBKdW4gMTUgMTI6MzI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IFVzZSBDX1NUQVQgZm9yIHRoZSAudGV4dAorCXNlY3Rpb24gc3ltYm9sLCBub3QgQ19MQUJFTC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFBlcm1pdCBhIG1vZGlmaWVyIGluICdvJyBjYXNlLCBhbmQKKwlwZXJtaXQgbm9uIGNvbnN0YW50IGV4cHJlc3Npb25zIGluICd1JyBjYXNlLiAgTGV0cyBgYGx1aQorCSQ4LCVoaShmb28pOyBsdyAkOCwlbG8oZm9vKSgkOCknJyB3b3JrIGNvcnJlY3RseS4KKworTW9uIEp1biAxMyAxMjowODo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFdhcm4gYWJvdXQgYW4gYXR0ZW1wdAorCXRvIHB1dCBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzZXQuCisKK1NhdCBKdW4gMTEgMTY6NDE6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCisJKiByZWFkLmMgKHBzZXVkb19zZXQpOiBPbmx5IHByZXNlcnZlIGV4dGVybmFsIGJpdCBmb3IgT0JKX0FPVVQgYW5kCisJT0JKX0JPVVQgaWYgbm90IEJGRF9BU1NFTUJMRVIuCisJKiBjb25maWcvYW91dF9nbnUuaCAoTl9XRUFLVSwgTl9XRUFLQSwgTl9XRUFLVCwgTl9XRUFLRCwgTl9XRUFLQik6CisJRGVmaW5lIGFzIGluIC4uL2luY2x1ZGUvYW91dC9hb3V0NjQuaC4KKwkqIGNvbmZpZy9vYmotYW91dC5oIChPQkpfU1lNRklFTERfVFlQRSk6IElmIG5vdCBCRkRfQVNTRU1CTEVSLAorCWRlZmluZSBhcyBjaGFyLgorCShTX0dFVF9XRUFLLCBTX1NFVF9XRUFLKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgorCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgorCShvYmpfZW1pdF9zeW1ib2xzKTogQWRqdXN0IHR5cGUgb2Ygd2VhayBzeW1ib2xzLgorCShvYmpfYW91dF93ZWFrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworRnJpIEp1biAxMCAxMzo0ODo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IERvbid0IHNldCBhbnkgZmxhZ3MgYmFzZWQgb24KKwl0aGUgdHlwZSBvZiBhIHNwZWNpYWwgc2VjdGlvbi4KKworCSogY29uZmlnL2hvLXN1bm9zLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPi4gIERvbid0IGRlY2xhcmUgbWFsbG9jLAorCXJlYWxsb2MsIGZyZWUsIG9yIGF0b2wuCisKK1dlZCBKdW4gIDggMDY6Mjg6MzcgMTk5NCAgQmlsbCBDb3ggIChiaWxsQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjaGVjayk6IERlbGV0ZSBhcy5uZXcgZGVwZW5kZW5jeSwgc28gdGhhdAorCXJlZ3Jlc3Npb24gdGVzdCBkb2Vzbid0IHRyaWdnZXIgYW4gYXNzZW1ibGVyIGJ1aWxkLgorCitUdWUgSnVuICA3IDEzOjMzOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuLCByZWFsY2xlYW4pOiBOZXcgdGFyZ2V0cy4KKwkqIGRvYy9NYWtlZmlsZS5pbiwgdGVzdHN1aXRlL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKworTW9uIEp1biAgNiAxMzoxMDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKFJEQVRBX1NFQ1RJT05fTkFNRSk6IERlZmluZS4KKwkobWFjcm8pOiBDb3JyZWN0IE1fTElfU1MgU1ZSNF9QSUMvRU1CRURERURfUElDIGNhc2UuICBBZnRlciBNX0xJX0QKKwlvciBNX0xfRE9CIG9yIGxhYmVsIGRvYiwgZm9yY2UgYSBuZXcgZnJhZyB0byBhdm9pZCBnZXR0aW5nCisJY29uZnVzZWQgaW4gdGNfZ2VuX3JlbG9jLgorCShtaXBzX2lwKTogVXNlIFJEQVRBX1NFQ1RJT05fTkFNRSwgbm90IC5yZGF0YS4KKwkoc19jaGFuZ2Vfc2VjKTogTGlrZXdpc2UuCisKK0ZyaSBKdW4gIDMgMjM6MzU6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBtZW1zZXQgdG8gemVybyBvdXQgbWVtb3J5LCByYXRoZXIgdGhhbgorCWdvaW5nIHRocm91Z2ggbWRfbnVtYmVyX3RvX2NoYXJzLiAgVGhpcyBwZXJtaXRzIGhhbmRsaW5nIHN5bWJvbGljCisJYXJndW1lbnRzIHdoZW4gdGhlIHNpemUgaXMgbGFyZ2VyIHRoYW4gc2l6ZW9mICh2YWx1ZVQpLCBpZgorCVRDX0NPTlNfRklYX05FVyBpcyBwcmVwYXJlZCB0byBoYW5kbGUgdGhlIGNhc2UgKGFzIGl0IGlzIG9uIE1JUFMpLgorCitGcmkgSnVuICAzIDEyOjUwOjEzIDE5OTQgIERhdmlkIEouIE1hY0tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogYXMuYyAoc2hvd191c2FnZSksIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKSwKKwljb25maWcvdGMtbWlwcy5jIChtZF9zaG93X3VzYWdlKTogRml4IHVwIG1lc3NhZ2VzLgorCisJKiBhcy5oOiBSZXBsYWNlIGZsYWdzZWVuIHdpdGggc2VwYXJhdGUgdmFyaWFibGVzLgorCSogYXMuYyAocGFyc2VfYXJncyk6IFNldCB0aGVtLiAgRG9uJ3QgYWNjZXB0IC0xIG9wdGlvbiwgb3IgLXYKKwlleHBsaWNpdGx5IChpdCdzIGEgc3lub255bSBmb3IgLS12ZXJzaW9uKS4KKwkqIGFzLmMsIGlucHV0LXNjcnViLmMsIG1lc3NhZ2VzLmMsIHJlYWQuYywgc3ltYm9scy5jLCB3cml0ZS5jLAorCWNvbmZpZy9vYmotYW91dC5jLCBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1ib3V0LmMsCisJY29uZmlnL29iai1ib3V0LmgsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmYuaCwKKwljb25maWcvb2JqLXZtcy5jLCBjb25maWcvdGMtaHBwYS5jLCBjb25maWcvdGMtaTM4Ni5jLAorCWNvbmZpZy90Yy1pOTYwLmMsIGNvbmZpZy90Yy1tNjhrLmMsIGNvbmZpZy90Yy1taXBzLmMsCisJY29uZmlnL3RjLXZheC5jOiBVc2UgdGhlIG5ldyBmbGFnIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZsYWdzZWVuLgorCSogY29uZmlnL3RjLXZheC5jIFtPQkpfVk1TXTogUmVjb2duaXplIC0rLCAtMSwgLXYsIGFuZCBkb2N1bWVudCBpbgorCXVzYWdlLgorCisJKiBhcy5jIChzaG93X3VzYWdlKTogUmVtb3ZlIHRhcmdldCBzcGVjaWZpYyBtZXNzYWdlczsKKwlpbnN0ZWFkLCBjYWxsIG1kX3Nob3dfdXNhZ2UuCisJKHBhcnNlX2FyZ3MpOiBVc2UgZ2V0b3B0X2xvbmdfb25seS4gIFRha2UgcG9pbnRlcnMgdG8gYXJnYyBhbmQKKwlhcmd2LgorCShtYWluKTogUGFzcyBwYXJzZV9hcmdzIHBvaW50ZXJzLgorCSogYXMuaDogUmVtb3ZlIDMgdmFyaWFibGVzIHRoYXQgYXJlIHJlZHVuZGFudCB3aXRoIGZsYWdzZWVuLgorCSogYXMuYywgbWVzc2FnZXMuYzogQ2hhbmdlIHRoZWlyIHVzZXJzIHRvIHVzZSBmbGFnc2Vlbi4KKwlEZWZpbmUgZ2V0b3B0IHN0dWZmLgorCSogdGMuaDogVXBkYXRlIG1kX3BhcnNlX29wdGlvbiBkZWNsLiAgQWRkIG1kX3Nob3dfdXNhZ2UgZGVjbC4KKwkqIGNvbmZpZy90Yy0qLmM6IEFkZCBtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLAorCW1kX2xvbmdvcHRzX3NpemUsIG1kX3Nob3dfdXNhZ2UuICBDaGFuZ2UgY2FsbGluZyBjb252ZW50aW9uIGZvcgorCW1kX3BhcnNlX29wdGlvbi4gIFJlbW92ZSBtZF9wYXJzZV9sb25nX29wdGlvbi4KKwkqIGNvbmZpZy90Yy1uczMyay5jOiBSZW5hbWUgYHN0cnVjdCBvcHRpb24nIHRvIGBzdHJ1Y3QgbnMzMmtfb3B0aW9uJy4KKwkqIGNvbmZpZy90Yy1pMzg2Lmg6IERvbid0IGRlZmluZSBtZF9wYXJzZV9vcHRpb24uCisKK1RodSBKdW4gIDIgMTM6NTQ6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBhcy5jIChzaG93X3VzYWdlKTogTmV3IGZ1bmN0aW9uLgorCShwYXJzZV9hcmdzKTogQ29kZSBtb3ZlZCBmcm9tIG1haW4uCisJUmVjb2duaXplIC0taGVscCBhbmQgLS12ZXJzaW9uLgorCSogY29uZmlnL3RjLW5zMzJrLmg6IERlZmluZSBUQ19OUzMySy4KKwkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBhbGwgb2YgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBjb21tYW5kCisJbGluZSBvcHRpb25zLgorCitUaHUgSnVuICAyIDEyOjA3OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGdhc3AuYyAoaGFzaF9uZXdfdGFibGUpOiBDbGVhciBuZXdseSBhbGxvY2F0ZWQgdGFibGUuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGVudW0gX3JlZ2lzdGVyKTogQWRkIDY4MDYwIGNvbnRyb2wgcmVnaXN0ZXJzCisJQlVTQ1IgYW5kIFBDUi4KKwkobGFzdF9tb3ZlY19yZWcpOiBOZXcgbWFjcm8uCisJKG02ODAwMF9jb250cm9sX3JlZ3MsIG02ODAxMF9jb250cm9sX3JlZ3MsIG02ODAyMF9jb250cm9sX3JlZ3MsCisJbTY4MDQwX2NvbnRyb2xfcmVncywgbTY4MDYwX2NvbnRyb2xfcmVncyk6IE5ldyBhcnJheXMuCisJKGNvbnRyb2xfcmVncyk6IE5ldyBwb2ludGVyLgorCShtNjhrX2lwKTogVXNlIGNvbnRyb2xfcmVncyBpbnN0ZWFkIG9mIHRlc3RpbmcgQ1BVIGV2ZXJ5IHRpbWUuCisJVXNlIGxhc3RfbW92ZWNfcmVnIHRvby4gIEluIGVycm9yIG1lc3NhZ2VzLCBoYW5kbGUgNjgwNjAsIGFuZAorCXByaW50IDY4MDYwIGZvciBtZmxvYXQsIHRvby4KKwkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBIYW5kbGUgIjY4MDYwIi4gIFVzZSBtNjgwNDB1cCBmb3IgbWFraW5nCisJbTY4ODUxIGNob2ljZS4gIFNldCBjb250cm9sX3JlZ3MuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAiNjgwNjAiLgorCSogY29uZmlndXJlLmluOiBTZXR0aW5nIGNwdV90eXBlLCByZWNvZ25pemUgbTY4MDYwIHRvby4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpIFshQkZEX0FTU0VNQkxFUl0KKwlbRElGRl9FWFBSX09LXTogRG8gY29udmVyc2lvbiB0byBwYy1yZWxhdGl2ZSBmb3IgZGlmZmVyZW5jZSwgZXZlbgorCWlmIHBjcmVsIGlzIGFscmVhZHkgc2V0LgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgdGhpc19nY2NfcmVxdWlyZXNfdGhlX2dudV9hc3NlbWJsZXIgaW4gYWxsCisJbG93ZXItY2FzZSwgaW4gY2FzZSB3ZSdyZSBpZ25vcmluZyBjYXNlIG9mIG9wY29kZXMgaW4gdGhlIGlucHV0CisJZmlsZS4KKworCSogZG9jL2FzLnRleGluZm8gKC5zZWN0aW9uKTogRG9jdW1lbnQgYXMgdW5hdmFpbGFibGUgZm9yIGEub3V0CisJdHlwZSBmb3JtYXRzLgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAobWFjaGluZSk6IE5ldyB2YXJpYWJsZS4KKwkobG9hZF9pbnNuKTogTmV3IG1hY3JvLgorCShsb2FkX2luc25fdGFibGUpOiBOZXcgZnVuY3Rpb24uCisJKG1kX2JlZ2luKTogQ2FsbCBsb2FkX2luc25fdGFibGUsIG9uY2UgZm9yIGJhc2ljIGluc3RydWN0aW9ucyBhbmQKKwlvbmNlIGZvciBhcHByb3ByaWF0ZSBQQUwgaW5zdHJ1Y3Rpb24gdGFibGUuCisJKG1kX3BhcnNlX29wdGlvbik6IFNldCBgbWFjaGluZScgYmFzZWQgb24gLW0jIyMjIyBhcmd1bWVudHMuCisJKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGFscGhhX3BhbDIxMDY0X29wY29kZXMpOiBTcGxpdCBvdXQgZnJvbQorCWFscGhhX29wY29kZXMuCisJKGFscGhhX3BhbDIxMTY0X29wY29kZXMpOiBOZXcgdGFibGUuCisJKE5VTTIxMDY0T1BDT0RFUywgTlVNMjExNjRPUENPREVTKTogTmV3IG1hY3Jvcy4KKworCSogY29uZmlndXJlLmluICh0YXJnZXQgaTM4Ni0qLW5ldGJzZDAuOCk6IFVzZSAzODZic2QgZW11bGF0aW9uLgorCisJKiBkb2MvTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mby1nYXNwKTogVXNlICQkZGlyIHdoZW4gaW5zdGFsbGluZworCWZpbGUuCisKK1dlZCBKdW4gIDEgMTA6NDg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRm9yY2UgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHRvIGJlCisJYWxpZ25lZCBjb3JyZWN0bHkuCisKK0ZyaSBNYXkgMjcgMTA6MDU6NTMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwlNZXJnZWQgaW4gY2hhbmdlcyBmcm9tIGdhcy0yLjMgbmV0IHJlbGVhc2U6CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byBjeWdudXMtMi4zLjEuCisKKwkqIGNvbmZpZy9vYmotdm1zLmM6IFJlcGxhY2VkIHVuY2hlY2tlZCB1c2VzIG9mIG1hbGxvYyB3aXRoCisJeG1hbGxvYy4KKworCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IE9ubHkgdGVzdCBCRkQ2NCwgbm90CisJQkZEX0FTU0VNQkxFUiB0b28uCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbQkZEX0FTU0VNQkxFUl0KKwlbRElGRl9FWFBSX09LXTogRG9uJ3QgY2hlY2sgcGNyZWwsIGp1c3QgY29udmVydCBpdC4KKworCSogY29uZmlnL29iai12bXMuYzogUmVtb3ZlZCBsb3RzIG9mIGV4dHJhIHNlbWljb2xvbnMgYWZ0ZXIKKwljb21wb3VuZCBzdGF0ZW1lbnRzLgorCShzdHJjaHIpOiBEb24ndCBkZWNsYXJlIGhlcmUuCisKKwkqIGNvbmZpZy9oby12YXguaCAocmVhbGxvYyk6IERlY2xhcmUuCisKKwkqIGNvbmZpZy9oby12bXMuaCAoc3RyY2hyLCBzdHJkdXApOiBEZWNsYXJlLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKSBbT0JKX0VMRl06IEFjY2VwdCBhbmQgaWdub3JlCisJb3B0aW9uIGAtcScuCisKKwlXZWQgTWF5IDE4IDIwOjUwOjM1IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiBjb25maWcvb2JqLXZtcy5oIChEQkdfU19DX1NRVUFELCBEQkdfU19DX1VRVUFEKTogZGVmaW5lIHRoZXNlCisJbmV3IFZNUyBzeW1ib2wtdHlwZSBtYWNyb3M7IHNpZ25lZCBhbmQgdW5zaWduZWQgcXVhZHdvcmQgaW50ZWdlcnMsCisJZm9yIGBsb25nIGxvbmcnIHN1cHBvcnQuICBUaGVpciB2YWx1ZXMgY29tZSBmcm9tIHRoZSBleGlzdGluZworCURTQyRLX0RUWVBFX1FVIGFuZCBEU0MkS19EVFlQRV9RIG1hY3JvcyBpbiA8ZGVzY3JpcC5oPi4gIFRoZQorCVZNUyBkZWJ1Z2dlciBub3cgcmVjb2duaXplcyBgbG9uZyBsb25nJyB2YXJpYWJsZXMgY29ycmVjdGx5LgorCSogY29uZmlnL29iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGFkZCBlbnRyaWVzCisJZm9yIGdjYzIncyBwcmVkZWZpbmVkIHR5cGVzICJsb25nIGRvdWJsZSIgKHNhbWUgYXMgZG91YmxlLCBhcworCXBlciBnY2MncyBjdXJyZW50IHN0YXRlKSwgImxvbmcgbG9uZyBpbnQiLCAibG9uZyBsb25nIHVuc2lnbmVkCisJaW50IiwgYW5kIGZpbmFsIGBvdGhlcndpc2UnIGNhc2UgKHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgdHlwZQorCWFuZCBzaXplIGZpZWxkcykuICBbY2F2ZWF0OiAgcHJlZGVmaW5lZCB0eXBlcyAiY29tcGxleCBpbnQiLAorCSJjb21wbGV4IGZsb2F0IiwgImNvbXBsZXggZG91YmxlIiwgYW5kICJjb21wbGV4IGxvbmcgZG91YmxlIiBhcmUKKwlzdGlsbCBtaXNzaW5nLl0KKworCSogY29uZmlnL2hvLXZtcy5oIChFWElUX0ZBSUxVUkUpOiBkZWZpbmUgYXMgMHgxMDAwMDAwMiBpbnN0ZWFkCisJb2YgMCwgYmVjYXVzZSB0aGUgbGF0dGVyIGluZGljYXRlcyBzdWNjZXNzIHJhdGhlciB0aGFuIGZhaWx1cmUKKwl3aGVuIHBhc3NlZCB0byBgZXhpdCcgb3IgcmV0dXJuIGZyb20gYG1haW4nIGNvbXBpbGVkIGJ5IGdjYzIuCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKGFycmF5X3N1ZmZpeCwgZ2VuZXJhdGVfc3VmZml4KTogcmVwbGFjZSB0d28KKwloYXJkY29kZWQgYDB4YTMncyB3aXRoIG1hY3JvIERCR19TX0NfQURWQU5DRURfVFlQRSBmcm9tIG9iai12bXMuaC4KKwkoVk1TX3R5cGVkZWZfcGFyc2UpOiBlbGltaW5hdGUgcmVkdW5kYW50IGlmLXRoZW4tZWxzZSB3aGVuCisJYWxsb2NhdGluZyBuZXcgc3ltYm9sIGVudHJ5IGFuZCBsaW5raW5nIGl0IHRvIFZNU19TeW1ib2xfdHlwZV9saXN0LgorCisJVHVlIE1heSAxNyAyMDo0NzozMSAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKKworCSogY29uZmlnL29iai12bXMuYyAoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogZG9uJ3QgdHJ5IHRvIGludGVycHJldAorCXRoZSBjb250ZW50cyBvZiB0aGUgR0FTX1ZFUlNJT04gc3RyaW5nIHdoZW4gZmFsbGluZyBiYWNrIHRvIGl0IGZvcgorCWxhbmd1YWdlIHByb2Nlc3NvciBpZGVudGlmaWNhdGlvbi4KKworCSogbWFrZS1nYXMuY29tLCB2bXNjb25mLnNoIChFTlZJUk9OKTogZml4IG1pc3NwZWxsaW5nIG9mCisJYHBzZWN0X2F0dHInIGluIGxpbmtlciBvcHRpb25zLgorCisJV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCisKKwkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSB0byBsYXRlc3QgbWFrZWZpbGUuaW4KKwkqIGNvbmZpZy90ZS1nbzMyLmg6IFtuZXddIGdvMzIncyBlbnZpcm9ubWVudAorCitGcmkgTWF5IDIwIDE3OjU5OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYXMuaDogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXJzIGZvciBzdHJzdHIuCisKK1RodSBNYXkgMTkgMTU6NDA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGNoYW5nZSB0aGUgc2l6ZSBpZgorCU9CSl9FTEYuCisKK1dlZCBNYXkgMTggMTM6MDg6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlZGlyZWN0IGxuIG91dHB1dCB0byAvZGV2L251bGwuICBJZiBsbgorCWZhaWxzIG9uIGdhc3AsIGluc3RhbGwgZ2FzcC5uZXcsIG5vdCBnYXNwLgorCitXZWQgTWF5IDE4IDA5OjE2OjM2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFVzZSBSX0hQUEFfQUJTX0NBTEwsIG5vdCBSX0hQUEEgZm9yCisJYWJzb2x1dGUgY2FsbHMuCisKK1R1ZSBNYXkgMTcgMTI6NTA6NDYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX2ZwX2NtcF9jb25kKTogUmVwb3J0IGFuIGVycm9yCisJb24gYSBwYXJ0aWFsIGNvbXBsZXRlciBtYXRjaC4KKworTW9uIE1heSAxNiAxMjowMzo0OSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYzogQ2hhbmdlIC5ocHBhX3Vud2luZCB0byAuUEFSSVNDLnVud2luZAorCXRocm91Z2hvdXQgY29kZS4KKwkoaXNfY29tcGxleCk6IERlbGV0ZSBkZWZpbml0aW9uIGFuZCBzdXBwb3J0IGZvciBjb21wbGV4IHJlbG9jYXRpb24KKwl0eXBlcy4KKwkodGNfZ2VuX3JlbG9jKTogRGVsZXRlIHNwZWNpYWwgdW53aW5kIGNydWQgZm9yIEVMRi4gIFNpbXBsaWZ5IGFuZAorCXJld3JpdGUgRUxGIGNvZGUgYmFzZWQgb24gOTQtMDItMDIgUEEgRUxGIGRyYWZ0IHNwZWMuCisJKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFVzZSBzdGFuZGFyZCBQQVJJU0NfRElSMzIgcmVsb2NzIGZvcgorCXRoZSB1bndpbmQgZGVzY3JpcHRvcnMuCisKK0ZyaSBNYXkgIDYgMTQ6MTM6MTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2dvMzIubWg6IE5ldyBtYWtlZmlsZSBmcmFnbWVudCBmb3IgZ28zMiBjcm9zc2luZy4KKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IFVzZSBuZXcgZnJhZ21lbnQuCisKK0ZyaSBNYXkgIDYgMTQ6MzU6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBnYXNwLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisJKG1haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGkuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYmVnaW4pOiBXaGVuIHVzaW5nIC1tYW55LCBwZXJtaXQgY29tcGFyaXNvbgorCWluc3RydWN0aW9ucyB0byBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIG9wY29kZSB0YWJsZS4KKworVGh1IE1heSAgNSAxOToxNDo0MyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjIuOTAuCisKKwkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldykgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBwZXJtaXQgYWRkaXRpb25zCisJdG8gdGhlIHN5bWJvbCB0YWJsZSBpZiBpdCdzIGFscmVhZHkgYmVlbiBzZXQgaW4gdGhlIG91dHB1dCBiZmQuCisJKHN5bWJvbF9iZWdpbikgWyEgRU1JVF9TRUNUSU9OX1NZTUJPTFNdIFtSRUxPQ19SRVFVSVJFU19TWU1CT0xdOgorCURvbid0IHVzZSBiZmRfYWJzX3NlY3Rpb24uc3ltYm9sIGZvciBnYXMgYWJzb2x1dGUgc3ltYm9sLgorCisJKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgY2xlYW4tZHZpLCBjbGVhbi1pbmZvKTogRGVsZXRlIGdhc3AKKwlmaWxlcyB0b28uCisKK1RodSBNYXkgIDUgMTg6MTI6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2VtaXRfZGVsYXlzKTogTWFrZSBjYWxsIHRvCisJbWlwc19ub19wcmV2X2luc24gdW5jb25kaXRpb25hbC4KKworVGh1IE1heSAgNSAxNzoyNTozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmYqLio6IE1lcmdlZCBjb2ZmYmZkIHZlcnNpb25zIGludG8gY29mZiB2ZXJzaW9ucywKKwl3aXRoIGEgc2luZ2xlICIjaWZkZWYgQkZEX0FTU0VNQkxFUiIgY29udHJvbGxpbmcgbW9zdCBvZiBpdCBmb3IKKwlub3cuICBEZWxldGVkIG9iai1jb2ZmYmZkLiogZmlsZXMuCisJKiBjb25maWd1cmUuaW46IEFsd2F5cyB1c2Ugb2JqLWNvZmYuKiBmb3IgQ09GRiB0YXJnZXRzLgorCitXZWQgTWF5ICA0IDEzOjM0OjExIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90ZS1kcHgyLmggKFRBUkdFVF9GT1JNQVQsIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6CisJRGVmaW5lLgorCSogY29uZmlndXJlLmluIChtNjhrLWJ1bGwtc3lzdjMqKTogRW5hYmxlLgorCisJKiBjb25maWcvY29mZl9nbnUuaDogRGVsZXRlZC4KKworV2VkIE1heSAgNCAxMToyOToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBub3QgVEVfU1VOMywgZGVmaW5lIGFzCisJImEub3V0LXplcm8uYmlnIi4KKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBNYWtlIGNvbW1vbiBzeW1ib2wgYW5kIFBDCisJcmVsYXRpdmUgYWRqdXN0bWVudHMgd2hlbiBURV9MWU5YIGlzIGRlZmluZWQgYXMgd2VsbCBhcyB3aGVuCisJVENfSTM4NiBpcyBkZWZpbmVkLgorCitXZWQgTWF5ICA0IDAyOjI5OjIxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBhcy5oIChzdHJzdHIpOiBSZXN0b3JlIGRlY2xhcmF0aW9uLgorCShzdWJzZWdfZ2V0KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUuCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgb2JqX2FkanVzdF9zeW10YWIgaXMgZGVmaW5lZCwKKwlpbnZva2UgaXQuICBUaGVuIGNhbGwgc2V0X3N5bXRhYiwgYW5kIGZpbmFsbHkgaW52b2tlICpfZnJvYl9maWxlCisJaG9va3MuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9hZGp1c3Rfc3ltdGFiKTogUmVuYW1lZCBmcm9tCisJY29mZl9mcm9iX2ZpbGUuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9hZGp1c3Rfc3ltdGFiKTogQ2hhbmdlZCBkZWNsYXJhdGlvbgorCWFjY29yZGluZ2x5LgorCShvYmpfYWRqdXN0X3N5bXRhYik6IE1hY3JvIGFsc28gY2hhbmdlZC4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IE5ldyB0YXJnZXQsIGhhbmRsZWQgbGlrZSBpMzg2LW1hY2guCisKK1R1ZSBNYXkgIDMgMjE6MDQ6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogU2VsZWN0IGxpdHRsZQorCWVuZGlhbiB2ZXJzaW9uLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoVEFSR0VUX0ZPUk1BVCkgW1RDX0k5NjBdOiBEaXR0by4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zZWN0aW9uKTogUm91bmQgdXAgdGhlIHNpemUgb2YKKwlldmVyeSBzZWN0aW9uIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGFsaWdubWVudCwgc28gdGhhdCBCRkQgZG9lc24ndAorCXN1cnByaXNlIHVzLgorCisJRWxpbWluYXRlIG1hbnkgc2ltcGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBDT0ZGIGJhY2sgZW5kczoKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IFJlbW92ZWQgYWxsIHVzZXMgb2YgREVGVU4gYW5kIERFRlVOX1ZPSUQuCisJTWFkZSBtaW5vciBzdHlsaXN0aWMgY2hhbmdlcywgZGVsZXRlZCBzb21lIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucy4KKwkoc3RhY2tfdG9wKTogRGVsZXRlZC4KKwkoc3ltYm9sX3RvX2NoYXJzKTogVXNlIGFic29sdXRlX3NlY3Rpb24gYW5kIHJlZ19zZWN0aW9uIGluc3RlYWQgb2YKKwl0aGUgY29ycmVzcG9uZGluZyBTRUdfKiBzeW1ib2xzLgorCShvYmpfY29mZl9lbmRlZiwgdGFnX2ZpbmRfb3JfbWFrZSwgZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgorCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6CisJTW92ZWQgdG8ganVzdCBhZnRlciBwc2V1ZG8tb3AgdGFibGUuICBBbGwgZnVuY3Rpb25zIG5vdyBzdGF0aWMuCisJKHN0YWNrX2RlbGV0ZSk6IFJlbW92ZWQgZGVjbGFyYXRpb24uCisJKHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZF9vcl9tYWtlLCB0YWdfZmluZCk6IE1vdmVkIHRvIGp1c3QKKwlhZnRlciBzdGFjayBmdW5jdGlvbnMuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaDogUmVvcmRlcmVkIHNvbWUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MuCisJKHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKTogRG9uJ3QgZGVjbGFyZS4KKwkoc3RhY2sgdHlwZWRlZik6IERlbGV0ZWQuCisJKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMpOiBBbHdheXMgdW5kZWYgdGhlbiBkZWZpbmU7IGRvbid0IHRlc3QuCisJKFNZTV9BVVhFTlQpOiBOZXcgbWFjcm8uCisJKFNBX0dFVF8qLCBTQV9TRVRfKik6IERlZmluZSBpbiB0ZXJtcyBvZiBTWU1fQVVYRU5UIHdoZW4gZmVhc2libGUuCisJKFNGX0dFVF8qLCBTRl9TRVRfKik6IERlZmluZSBpbiB0ZXJtcyBvZiBTRl9HRVQgd2hlbiBmZWFzaWJsZS4KKwkoU0FfR0VUX1NZTV9UQUdORFgsIFNBX0dFVF9TWU1fRU5ETkRYLCBTQV9TRVRfU1lNX1RBR05EWCwKKwlTQV9TRVRfU1lNX0VORE5EWCwgb2JqZWN0X2hlYWRlcnMgdHlwZWRlZiwgZGF0YV9zZWN0aW9uX2hlYWRlciwKKwl0ZXh0X3NlY3Rpb25faGVhZGVyKTogRGVsZXRlIG5vbi1CRkRfSEVBREVSUyB2ZXJzaW9ucywgc2luY2Ugd2UKKwlhbHdheXMgZGVmaW5lIHRoYXQgc3ltYm9sIG5vdy4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKHN0YWNrX3RvcCk6IERlbGV0ZWQuCisJKG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsCisJb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsIG9ial9jb2ZmX3ZhbCk6IENoYW5nZQorCWFyZ3VtZW50IG5hbWUgZnJvbSAiaWdub3JlZCIgdG8gImlnbm9yZSIuCisJKG9ial9jb2ZmX3ZhbCk6IFVzZSBmcmFnX25vd19maXguCisJKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIElHTk9SRV9ERUJVRyB2ZXJzaW9uLCBzaW5jZSBpdCBkb2Vzbid0CisJZ2V0IHVzZWQuCisJKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wKToKKwlNb3ZlZCB0byBqdXN0IGFmdGVyIHBzZXVkby1vcCB0YWJsZS4gIEFsbCBmdW5jdGlvbnMgbm93IHN0YXRpYy4KKwkodGFnX2luaXQsIHRhZ19pbnNlcnQsIHRhZ19maW5kX29yX21ha2UsIHRhZ19maW5kKTogTW92ZWQgdG8ganVzdAorCWFmdGVyIHN0YWNrIGZ1bmN0aW9ucy4KKwkqIGNvbmZpZy9vYmotY29mZi5oOiBSZW9yZGVyZWQgc29tZSBkZWNsYXJhdGlvbnMgYW5kIG1hY3Jvcy4KKwlQcm90ZWN0ZWQgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgorCShzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6IERvbid0IGRlY2xhcmUuCisJKHN0YWNrIHR5cGVkZWYpOiBEZWxldGVkLgorCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogQWx3YXlzIHVuZGVmIHRoZW4gZGVmaW5lOyBkb24ndCB0ZXN0LgorCShzdGRvdXRwdXQpOiBEZWxldGVkIGRlY2xhcmF0aW9uLgorCShUQVJHRVRfRk9STUFUKSBbVENfSTM4Nl06IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCisKK01vbiBNYXkgIDIgMTc6MDk6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogVXNlIGZpeF90YWlsIGZpZWxkIGV2ZW4gaWYKKwlCRkRfQVNTRU1CTEVSLgorCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogSW5pdGlhbGl6ZSBmaXhfdGFpbCBmaWVsZC4KKwkoc3Vic2VnX2dldCk6IExpa2V3aXNlLgorCSogd3JpdGUuYyAoZnJhZ3NfY2hhaW5lZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGZpeF9uZXdfaW50ZXJuYWwpOiBJZiBmcmFnc19jaGFpbmVkIGlzIHNldCwgdXNlIGZpeF9yb290IGFuZAorCWZpeF90YWlsIGZyb20gc2VnX2luZm8gKG5vd19zZWcpLCByYXRoZXIgdGhhbiBmcmNoYWluX25vdy4KKwkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IFNldCBmaXhfdGFpbCBmaWVsZC4KKwkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBTZXQgZnJhZ3NfY2hhaW5lZC4KKworVGh1IEFwciAyOCAwMTozOToxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAoc19vcHRpb24pOiBPbmx5IHJlZmVyIHRvIGdfc3dpdGNoXyogdmFyaWFibGVzCisJaWYgR1BPUFQgaXMgZGVmaW5lZC4KKwkoc19hYmljYWxscyk6IERpdHRvLgorCShtZF9hcHBseV9maXgpOiBDYXN0IGNoYXIqIHRvIHVuc2lnbmVkIGNoYXIqIHRvIGF2b2lkIHBvaW50ZXIKKwltaXNtYXRjaC4KKworV2VkIEFwciAyNyAxMTowNjozMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1nbzMyKTogVXNlcyBjb2ZmIG5vdy4KKwkqIGdhc3AuYyAobWFpbik6IE5vdyB0YWtlcyAtRCBvbiBjb21tYW5kIGxpbmUuCisJKHNob3dfdXNhZ2UpOiBEZXNjcmliZSBuZXcgb3B0aW9ucy4KKworVHVlIEFwciAyNiAxNzoxMDozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUHJpbnQgIk5PIERFRklORUQgU1lNQk9MUyIgYW5kCisJIk5PIFVOREVGSU5FRCBTWU1CT0xTIiBpZiB0aGVyZSBhcmVuJ3QgYW55LCBpbnN0ZWFkIG9mIGRpc3BsYXlpbmcKKwl0aGUgaGVhZGVyIHdpdGggYW4gZW1wdHkgbGlzdC4KKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IENoZWNrIENPRkZfTk9MT0FEX1BST0JMRU0KKwlhbHNvIGJlZm9yZSBzZXR0aW5nIFNUWVBfTk9MT0FEIGZvciAuYnNzIHNlY3Rpb24uCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCk6IE5ldyB2YXJpYWJsZS4KKwlJbml0aWFsaXplZCB0byB2YWx1ZSBvZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwsIGlmIGRlZmluZWQsIG9yCisJemVyby4KKwkobTY4a19yZWdfcGFyc2UpOiBJZiBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgaXMgc2V0LCBwZXJtaXQKKwlyZWdpc3RlciBwcmVmaXggdG8gYmUgYWJzZW50LgorCShtNjhrX2lwX29wKTogQWNjZXB0IGAmJyBhbHNvIGZvciBpbW1lZGlhdGUgY29uc3RhbnRzLgorCShpbnNlcnRfcmVnKTogRG9uJ3QgYm90aGVyIHdpdGggKHR3byE/KSBzYW5pdHkgY2hlY2tzIG9mIHRoZQorCXN5bWJvbCB0YWJsZSB3aGVuIGluc2VydGluZyBlYWNoIHJlZ2lzdGVyLgorCShtNjhrX3BhcnNlX2xvbmdfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLiAgU2V0CisJZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIGlmICJyZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWwiIGlzIHBhc3NlZC4KKwkqIGNvbmZpZy90Yy1tNjhrLmggKFJFR0lTVEVSX1BSRUZJWCk6IEFsd2F5cyBkZWZpbmUgaWYgbm90IGFscmVhZHkKKwlkZWZpbmVkLgorCShPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpOiBEb24ndCBkZWZpbmUuCisJKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsIGRlZmluZSBhcyB6ZXJvCisJb3Igb25lIGRlcGVuZGluZyBvbiBNNjhLQ09GRi4KKworCVNvbWUgY2hhbmdlcyB0byBoZWxwIEFwb2xsbyBzdXBwb3J0LCBmcm9tIHRyb3lAY2JtZS51bnN3LmVkdS5hdToKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKERBVEEsIEFERFIsIFNQLCBGUFJFRywgQ09QTlVNLCBCQUQsIEJBQyk6CisJRGVmaW5lIGFzIG1hY3JvcyBpbnN0ZWFkIG9mIGVudW1lcmF0b3JzLCBzaW5jZSB0aGUgQXBvbGxvIGNvbXBpbGVyCisJY2FuJ3QgaGFuZGxlICJlbnVtVmFsMSwgZW51bVZhbDIgPSBlbnVtVmFsMSIgd2hlbiBkZWZpbmluZyBhbiBlbnVtCisJdHlwZS4KKwkobWFrZV9wY3JlbF9hYnNvbHV0ZSkgW05PX1BDUkVMX1JFTE9DU106IE5ldyBmdW5jdGlvbi4KKwkodGNfY29mZl9maXgycnR5cGUpIFtOT19QQ1JFTF9SRUxPQ1NdOiBHZW5lcmF0ZSBvbmx5IFJfUkVMQllURSwKKwlSX0RJUjE2LCBhbmQgUl9ESVIzMiByZWxvY3MuCisJKiBjb25maWcvdGMtbTY4ay5oIFtURV9BUE9MTE9dIChDT0ZGX01BR0lDLCBDT0ZGX0FPVVRIRFJfTUFHSUMpOgorCVVzZSBBcG9sbG8gdmVyc2lvbnMuCisJW1RFX0FQT0xMT10gKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKTogVW5kZWZpbmUuICBUaGF0IGlzLAorCWRvIGluY2x1ZGUgdGhlIG9wdGlvbmFsIGhlYWRlciBmb3IgQXBvbGxvIHRhcmdldC4KKwkoQ09GRl9NQUdJQyk6IERvbid0IGRlZmluZSBhcyBNQzY4TUFHSUMgaWYgaXQncyBhbHJlYWR5IGRlZmluZWQuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmggW1RFX0RFTFRBXSAoTEVYX1BDVCk6IERlZmluZSBhcyAxLCBzbyB0aGF0IGAlJworCWNhbiBiZSB1c2VkIHdpdGhpbiBhIGxhYmVsIG5hbWUuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogRGVjbGFyZS4KKwkodGNfaW5pdF9hZnRlcl9hcmdzKTogRGVmaW5lIGFzIG02OGtfaW5pdF9hZnRlcl9hcmdzLgorCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgZnVuY3Rpb24sCisJY29udGFpbmluZyBvbmUtc2hvdCBjb2RlIGZyb20gbWRfYXNzZW1ibGUuICBBZGRlZCB3YXJuaW5nIGZvcgorCWNvbWJpbmF0aW9uIG9mIDY4MDQwIGFuZCA2ODg1MS4KKwkobWRfYXNzZW1ibGUpOiBTdGFydHVwLXRpbWUgY29kZSBkZWxldGVkLgorCitNb24gQXByIDI1IDE2OjE5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZG9jL01ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIGFzY29uZmlnLnRleGkuCisKK1N1biBBcHIgMjQgMDA6MTM6MDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogMTMgYml0IGltbWVkaWF0ZSBjb25zdGFudCAoZm9yIGJyZWFrCisJaW5zdHJ1Y3Rpb24pIGlzIHVuc2lnbmVkLgorCitGcmkgQXByIDIyIDE3OjU4OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBVc2UgYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZQorCWFuZCBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIHRvIHNldCB0aGUgR1AgdmFsdWUgYW5kIHRoZSByZWdpc3RlcgorCW1hc2tzLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgbm93IG9ic29sZXRlIGZha2UgLnJlZ2luZm8gc2VjdGlvbi4KKworRnJpIEFwciAyMiAxNToxNzowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcHJpbnQgcmVnaXN0ZXIgc3ltYm9scyBhcworCXVuZGVmaW5lZC4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEb24ndCBuZWVkIHRvIHN0cmlwCisJdW5kZXJzY29yZXMsIHNpbmNlIHN5bWJvbF9uZXcgd2lsbCBhbHJlYWR5IGhhdmUgZG9uZSBpdC4KKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRGl0dG8uCisKKwkqIGFzLmMgKG1haW4pOiBJZiB0Y19pbml0X2FmdGVyX2FyZ3MgaXMgZGVmaW5lZCwgaW52b2tlIGl0IGFmdGVyCisJYWxsIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCisJU29tZSBjaGFuZ2VzIHRvIGhlbHAgQXBvbGxvIHN1cHBvcnQsIGZyb20gdHJveUBjYm1lLnVuc3cuZWR1LmF1OgorCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKSBbVEVfQVBPTExPXTogQ3JlYXRlIC53dGV4dAorCXNlY3Rpb24gaW5zdGVhZCBvZiAudGV4dC4gIENhbGwgY3JlYXRlX3RhcmdldF9zZWdtZW50cy4KKwkqIHJlYWQuYyAoZGVtYW5kX2NvcHlfc3RyaW5nKTogTm8gbG9uZ2VyIHN0YXRpYy4KKworVGh1IEFwciAyMSAxNTo1MDowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUGVybWl0IGJyYW5jaGVzIHRvIGJlIHN3aXRjaGVkCisJd2l0aCB0aGUgcHJlY2VkaW5nIGluc3RydWN0aW9uIGV2ZW4gaWYgLnNldCBub2JvcHQgaGFzIGJlZW4gc2Vlbi4KKwkuc2V0IG5vYm9wdCBhY3R1YWxseSBjb250cm9scyB3aGV0aGVyIHRvIGJyaW5nIHVwIGFuIGluc3RydWN0aW9uCisJZnJvbSB0aGUgYnJhbmNoIHRhcmdldCwgd2hpY2ggZ2FzIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0LgorCitXZWQgQXByIDIwIDE4OjQ2OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5oLCBjb25maWcvb2JqLWNvZmYuYzogRGVsZXRlZCBhbGwgY29kZSB1c2VkIG9ubHkKKwl3aGVuIEJGRF9BU1NFTUJMRVIgaXMgbm90IGRlZmluZWQsIGFuZCBhbGwgY29uZGl0aW9uYWxzIHJlbGF0aW5nCisJdG8gc3VjaCBjb2RlLiAgTm8gc3VjaCB0YXJnZXRzIHJlbWFpbi4KKworCUZpeGVzIGZvciBzdGFicy1pbi1jb2ZmOgorCSogY29uZmlnL29iai1jb2ZmLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgorCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24sCisJY29mZl9mcm9iX3NlY3Rpb24pOiBEZWNsYXJlLgorCShvYmpfZnJvYl9zZWN0aW9uKTogTmV3IG1hY3JvOyB1c2VzIGNvZmZfZnJvYl9zZWN0aW9uLgorCShJTklUX1NUQUJfU0VDVElPTik6IE5ldyBtYWNybzsgdXNlcyBvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbi4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBBbHdheXMgcm91bmQgdXAgdG8KKwltdWx0aXBsZSBvZiBhbGlnbm1lbnQgcG93ZXIgc3BlY2lmaWVkIGluIGJmZCB0YXJnZXQgdmVjdG9yLgorCisJKiBnYXNwLmM6IEluY2x1ZGUgY3R5cGUuaC4KKworTW9uIEFwciAxOCAyMTowODowMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9hcy50ZXhpbmZvOiBSZW5hbWVkIGFzZG9jLWNvbmZpZy50ZXhpIHRvCisJYXNjb25maWcudGV4aS4KKworCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tYXMsIGluc3RhbGwtaW5mby1nYXNwKTogR2V0IGZpbGUKKwluYW1lcyBmcm9tIHNvdXJjZSBkaXJlY3Rvcnkgd2l0aG91dCBwYXRobmFtZS4KKworCSogY29uZmlnL29iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogV2hpbGUgbG9va2luZyBmb3IKKwlyZWdpc3RlciBtYXNrLCBza2lwIGVtcHR5IGZpbGwgZnJhZ3MgY2F1c2VkIGJ5IGVuYWJsaW5nIGxpc3RpbmcKKwlvdXRwdXQuCisKKwkqIGNvbmZpZy9oby1zeXN2Lmg6IEluY2x1ZGUgc3RyaW5nLmguCisKKwkqIGRvYy9pbnRlcm5hbHMudGV4aTogTmV3ICh3ZWxsLCByZWNlbnRseSBhZGRlZCkgZmlsZS4gIEp1c3QgYWRkZWQKKwlpbmZvIG9uIGFzX3dhcm4gYW5kIGZyaWVuZHMuCisKK01vbiBBcHIgMTggMTQ6Mjg6MjIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBVc2UgdGhlIGJ1aWx0LWluCisJZGVmYXVsdHMgZm9yIGRlZmluZWQsIHByaXZhdGUsIGFuZCBzcG51bSBmaWVsZHMgZm9yIHRoZQorCSRURVhUJCBhbmQgJFBSSVZBVEUkIHNwYWNlcy4gIERvIG5vdCBjbG9iYmVyIHNwbnVtLiAgRG8KKwlub3QgcmVzZXQgdGhlIHNlZ21lbnQgaWYganVzdCB1cGRhdGluZyBhIHNwYWNlLgorCShwYV9zcGFjZXNfYmVnaW4pOiBTZXQgQkZEIHNlY3Rpb24gZmxhZ3MgZm9yIGFsbCBidWlsdC1pbgorCXN1YnNwYWNlcy4KKworRnJpIEFwciAxNSAxMDo1MTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGZpcnN0X3Byb2NfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoYWRkX3Byb2NlZHVyZSk6IFNldCBmaXJzdF9wcm9jX3B0ciBpZiBpdCBoYXNuJ3QgYmVlbiBzZXQuCisJKGVjb2ZmX2J1aWxkX2xpbmVubyk6IElmIHRoZSBmaXJzdCBwcm9jZWR1cmUgZG9lcyBub3Qgc3RhcnQgYXQKKwlhZGRyZXNzIHplcm8sIGluc2VydCBhIGR1bW15IGxpbmUgdG8gY29tcGVuc2F0ZS4KKworCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IE1ha2UgZ2FzcC5uZXcKKwlhcyB3ZWxsIGFzIGFzLm5ldy4KKworVGh1IEFwciAxNCAxNToxMjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBleHByLmMgKG9wZXJhbmQpOiBUcnkgdG8gcGFyc2UgIjBmIiBhbmQgIjBiIiBzZXF1ZW5jZXMgYXMKKwlmbG9hdGluZyBwb2ludCBhbmQgYmluYXJ5IG51bWJlcnMgcmVzcGVjdGl2ZWx5OyBpZiBpdCBkb2Vzbid0CisJd29yaywgdHJlYXQgdGhlbSBhcyBsb2NhbCBsYWJlbHMuCisKKwkqIE1ha2VmaWxlLmluOiBNYWtlICQoT0JKUykgZGVwZW5kIG9uICQoQUxMX09CSl9ERVBTKS4KKwkqIGNvbmZpZ3VyZS5pbjogU2V0IEFMTF9PQkpfREVQUyBpbiBvdXRwdXQgTWFrZWZpbGUuCisKKwlCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIDxCQUlMRVlAaG1pdmF4Lmh1bWdlbi51cGVubi5lZHU+CisJKENoYXJsZXMgQmFpbGV5KToKKwkqIHZtc2NvbmYuc2g6IEluIGdlbmVyYXRlZCBmaWxlLCBnZXQgIi5vYmoiIHN1ZmZpeCByaWdodCwgYnVpbGQKKwlzb3VyY2UgZmlsZXMgZnJvbSBvdGhlciBkaXJlY3RvcmllcyBpbnRvIG9iamVjdHMgaW4gdGhlIGN1cnJlbnQKKwlkaXJlY3RvcnksIGFuZCBzcGVjaWZ5IFBTRUNUIGF0dHJpYnV0ZXMgZXhwbGljaXRseSB0byBsaW5rZXIuCisJQWxzbyBhZGRlZCBtaXNzaW5nIGxhYmVsLgorCSogTWFrZWZpbGUuaW4gKHN0YW1wLW1rLmNvbSk6IFJlZmVyZW5jZSBuZXcgdmFyaWFibGUKKwlWTVNfT1RIRVJfT0JKUyBmb3IgbGlzdCBvZiBub24tbG9jYWwgb2JqZWN0IGZpbGVzLCBpbnN0ZWFkIG9mCisJbGlzdGluZyB0aGVtIGhlcmUuCisJKFZNU19PVEhFUl9PQkpTKTogTmV3IHZhcmlhYmxlLCBhZGRlZCBtb3JlIGxpYmliZXJ0eSBmaWxlcy4KKwkqIG1ha2UtZ2FzLmNvbTogUmVnZW5lcmF0ZWQuCisKKwkqIGNvbmZpZy9oby12bXMuaCAodW5saW5rKTogRGVmaW5lIGFzIGRlbGV0ZS4KKworCSogY29uZmlnLWdhcy5jb206IEZpeCBxdW90aW5nIG9uIFRBUkdFVF9DQU5PTklDQUwgZGVmaW5pdGlvbi4KKwlEZWxldGUgZmlsZXMgYmVmb3JlIGNyZWF0aW5nIHRoZW0uCisKK1RodSBBcHIgMTQgMTM6MzQ6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGUtc3RhZ2UxLCBkZS1zdGFnZTIsIGRlLXN0YWdlMyk6IFVzZSBybSAtZi4KKworCSogY29uZmlnL3RjLW1pcHMuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBQZXJtaXQgQkZEX1JFTE9DX1BDUkVMX0xPMTYgZm9yCisJY2VydGFpbiBjYXNlcyBvZiAnaScsICdqJyBhbmQgJ28nLiAgQ2hhbmdlICd1JyB0byB0YWtlIGFuCisJYXJndW1lbnQsIHRoZSByZWxvYyB0eXBlLgorCShsb2FkX3JlZ2lzdGVyKTogUGFzcyByZWxvYyB0eXBlIHRvIG1hY3JvX2J1aWxkIGZvciAndScuCisJKG1hY3JvKTogTGlrZXdpc2UuICBGb3IgTV9MQV9BQiBwZXJtaXQgYSBkaWZmZXJlbmNlIGV4cHJlc3Npb24KKwl3aGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgYmV0d2VlbiBhbiBhcmJpdHJhcnkgc3ltYm9sIGFuZAorCWEgc3ltYm9sIGluIHRoZSAudGV4dCBzZWN0aW9uLgorCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGFuZAorCUJGRF9SRUxPQ19QQ1JFTF9MTzE2IHRvIGJlIGVtaXR0ZWQuCisJKG1kX2FwcGx5X2ZpeCk6IENoZWNrIHRoYXQgbW9zdCByZWxvY3MgYXJlIG5vdCBQQyByZWxhdGl2ZS4KKwlIYW5kbGUgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQgQkZEX1JFTE9DX1BDUkVMX0xPMTYuCisJKHRjX2dlbl9yZWxvYyk6IENoYW5nZSAjZXJyb3IgdG8gYXNfZmF0YWwuICBIYW5kbGUKKwlCRkRfUkVMT0NfUENSRUxfTE8xNiBhbmQgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUy4KKworVHVlIEFwciAxMiAxODoyNToxMyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IENhbGwgbWVtc2V0IHdpdGggYXJncyBpbiB0aGUgY29ycmVjdAorCW9yZGVyLgorCShzdWJzZWdfZ2V0KTogQ2xlYXIgbmV3bHkgYWxsb2NhdGVkIHNlZ2luZm8sIHNldCBpdHMgcG9pbnRlciBzbG90cworCXRvIE5VTEwgaW5zdGVhZCBvZiAwLgorCitNb24gQXByIDExIDA5OjAwOjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogSGFuZGxlIGNhc2Ugd2hlcmUgbGFiZWwgd2FzCisJZGVmaW5lZCBhZnRlciB0aGUgLnByb2MgZGlyZWN0aXZlLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogR2l2ZSBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYQorCXByb2NlbmQgZm9yIGEgcHJvY2VkdXJlIHdpdGhvdXQgYSBuYW1lLgorCitUaHUgQXByICA3IDE0OjI4OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBQYXNzIE5VTEwgZm9yIGV4cHJlc3Npb24gYXJndW1lbnQgdG8KKwltYWNyb19idWlsZCBmb3Igbm9yaSBjYXNlLgorCShTV0lUQ0hfVEFCTEUpOiBEZWZpbmUuCisJKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIGEgcmVsb2NhdGlvbiBmb3IgYSBzd2l0Y2ggdGFibGUKKwllbnRyeS4KKwkobWRfYXBwbHlfZml4KTogV3JpdGUgc3dpdGNoIHRhYmxlIGVudHJ5IHZhbHVlIGludG8gZmlsZS4KKwkodGNfZ2VuX3JlbG9jKTogVXNlIEJGRF9SRUxPQ19HUFJFTDMyIGZvciBhIHN3aXRjaCB0YWJsZSBlbnRyeSwKKwlhbmQgc2V0IHRoZSBhZGRlbmQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQKKwl0aGUgc3VidHJhaGVuZC4KKworVGh1IEFwciAgNyAxMDozODoxOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuaCAoZWxmX3RjX3N5bWJvbCk6IERlbGV0ZS4gIE5vIGxvbmdlciB1c2VkLgorCShlbGZfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgorCShocHBhX3RjX21ha2Vfc2VjdGlvbnMsIGhwcGFfdGNfc3ltYm9sKTogRGVsZXRlIGV4dGVybiBkZWNscy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogRGVsZXRlIGZ1bmN0aW9uLgorCShocHBhX3RjX3N5bWJvbCk6IExpa2V3aXNlLgorCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogRGVsZXRlIGVsZl90Y19zeW1ib2wgYW5kCisJZWxmX3RjX21ha2Vfc2VjdGlvbnMgc3R1ZmYuICBJdCB3YXMgdGhlcmUgdG8gc3VwcG9ydCBQQSBicmFpbmRhbWFnZQorCXdoaWNoIGhhcyBiZWVuIGZpeGVkLCBhbmQgaW4gdGhlIGNhc2Ugb2YgZWxmX3RjX21ha2Vfc2VjdGlvbnMgaXMKKwlyZWR1bmRhbnQgd2l0aCBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZy4KKworV2VkIEFwciAgNiAyMDo0ODozMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLSplbGYqKTogRG9uJ3QgcmVxdWlyZSAiLWhwLSIgZm9yIHRoZQorCW1hbnVmYWN0dXJlci4KKworVHVlIEFwciAgNSAxNTo0ODowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGb3IgY2FzZSAnbycsIHdoZW4gZ2VuZXJhdGluZworCWVtYmVkZGVkIFBJQyBjb2RlLCBhY2NlcHQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbG9jYWwgc3ltYm9scworCWFzIGJlaW5nIGNvbnN0YW50LgorCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBPbmx5IGZvcmNlIGEgcmVsb2MgdG8gYmUgZ2VuZXJhdGVkIGZvciBhCisJUEMgcmVsYXRpdmUgZml4dXAuCisJKG1kX2FwcGx5X2ZpeCk6IEZvciBCRkRfUkVMT0NfMzIgYW5kIEJGRF9SRUxPQ19MTzE2LCBwdXQgdGhlIGZpeHVwCisJdmFsdWUgaW50byB0aGUgZmlsZSBpZiB0aGUgZml4dXAgd2lsbCBub3QgZ2VuZXJhdGUgYSByZWxvYy4KKworVHVlIEFwciAgNSAxMToxNDoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBJZiBzZWN0aW9uIHBhc3NlZCBpc24ndCBic3MsCisJZG9uJ3Qgc3BldyByZW1haW5kZXIgb2YgaW5wdXQgZmlsZSBpbiBlcnJvciBtZXNzYWdlLgorCSh0Y19nZW5fcmVsb2MpOiBJZiBiZmRfcmVsb2NfdHlwZV9sb29rdXAgcmV0dXJucyBudWxsLCBwcmludCBlcnJvcgorCW1lc3NhZ2Ugd2l0aCByZWxvYyB0eXBlIGFuZCB0cnkgdG8gcHJvY2VzcyByZW1haW5kZXIgb2YgZmlsZS4KKworCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tYXMsIGluc3RhbGwtaW5mby1nYXNwKTogTmV3CisJdGFyZ2V0cywgbm93IGV4cGxpY2l0bHkgY2hlY2tpbmcgJChzcmNkaXIpIGZvciBpbmZvIGZpbGVzLgorCShpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gYm90aCBvZiB0aGVtOyBkbyBub3RoaW5nIG1vcmUuCisKK01vbiBBcHIgIDQgMTc6MDY6MDQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRml4IHRoaW5rbyBpbiBFTEYgdmVyc2lvbi4KKworTW9uIEFwciAgNCAxMjozOToyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogQ2hlY2sgUFBDX09QRVJBTkRfU0lHTkVECisJZmxhZyByYXRoZXIgdGhhbiBzaWduZWRwIGZpZWxkLiAgT25seSBwZXJtaXQgZXh0ZW5kZWQgcmFuZ2UgaWYKKwlQUENfT1BFUkFORF9TSUdOT1BUIGZsYWcgaXMgc2V0IGFuZCBhc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLgorCUJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4gKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShwcGNfYXJjaCk6IENoZWNrIGZvciBQUENfT1BDT0RFX1BQQyBiZWZvcmUgUFBDX09QQ09ERV9QT1dFUi4KKwkobWRfYmVnaW4pOiBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYSBzaXplIHNwZWNpZmljIGZsYWcgc2V0LCBvbmx5CisJYWRkIGl0IGlmIHdlIGFyZSBhc3NlbWJsaW5nIHRoYXQgc2l6ZS4KKworVGh1IE1hciAzMSAxNjo1MToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgYSBncnVlc29tZSBoYWNrIHRvIGdldAorCWNyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUgcmVsb2NzIHJpZ2h0IGZvciBDT0ZGIGFuZCBFTEYuCisKK01vbiBNYXIgMjggMTQ6Mzg6MjMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBBbHdheXMgZGVmaW5lLgorCShPQkpfUFJPQ0VTU19TVEFCKTogRG9uJ3QgZGVmaW5lLgorCitNb24gTWFyIDI4IDEyOjQwOjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9scyk6IERvbid0IGxldCBCRkQgY2xvYmJlcgorCXRoZSB0eXBlIG9mIHN5bWJvbCBzZXQgc3ltYm9scyB3aGljaCBoYXBwZW4gdG8gYmUgaW4gdGhlIGFic29sdXRlCisJb3IgdW5kZWZpbmVkIHNlY3Rpb24uCisKK01vbiBNYXIgMjggMTI6MzU6MDAgMTk5NCAgRGF2aWQgRWRlbHNvaG4gIChlZGVsc29obkBucGFjLnN5ci5lZHUpCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tcHdyeCAoUE9XRVIvMiBha2EKKwlSSU9TMiksIC1tcHdyIChQT1dFUiBha2EgUklPUzEpLCAtbXBwYyAoUG93ZXJQQyBha2EgTVBDNjAzLzYwNCksCisJYW5kIC1tYW55IChhbGwgYXJjaGl0ZWN0dXJlcykuCisKK1N1biBNYXIgMjcgMTQ6MDQ6MTkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IFNldCBhZGRlbmQgZm9yIHJlbG9jYXRpb24KKwlpbnZvbHZpbmcgYSBmdW5jdGlvbiBzeW1ib2wgd2hpY2ggaXMgbm90IGEgcGxhYmVsIHRvIHplcm8uCisJKG1kX2FwcGx5X2ZpeCk6IE5ldmVyIHBhc3MgYSBmdW5jdGlvbiBzeW1ib2wgdG8gZmllbGRfYWRqdXN0LgorCitGcmkgTWFyIDI1IDE3OjM1OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogSWYgTl9FWFQgaXMgc2V0IGZvciBhbgorCU5fSU5EUiBzeW1ib2wsIHNldCBCU0ZfRVhQT1JUIGFuZCBjbGVhciBCU0ZfTE9DQUwuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogSWYgRU1CRURERURfUElDLCBkb24ndCBzd2FwIGEKKwlicmFuY2ggd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IHVzZXMgJGF0LCBpbiBjYXNlIHRoZSBicmFuY2ggaXMKKwlsYXRlciBleHBhbmRlZC4KKwkobWFjcm8pOiBJZiBFTUJFRERFRF9QSUMsIGNhc2UgTV9KQUxfQSBtYXkgdXNlICRhdC4KKwkobWRfcGNyZWxfZnJvbSk6IElmIG5vdCBPQkpfQU9VVCwgcmV0dXJuIDQgZm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wKKwl0byBtYWtlIGl0IHBjcmVsX29mZnNldC4KKwkodGNfZ2VuX3JlbG9jKTogSWYgbm90IE9CSl9BT1VULCBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0bworCXJlbG9jLT5hZGRyZXNzOyBhbm90aGVyIGdydWVzb21lIGhhY2sgdG8gZ2V0IGdhcyByZWxvYyBoYW5kbGluZyB0bworCWRvIHRoZSByaWdodCB0aGluZy4KKworVGh1IE1hciAyNCAyMToyOToyOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBPbmx5IHNldCBHUCBwcm9sb2cgc2l6ZSBpZiB1c2luZworCVBWIHJlZ2lzdGVyLgorCShUMTIpOiBOZXcgbWFjcm8uCisJKGVtaXRfaW5zbik6IE5ldyBmdW5jdGlvbi4KKwkobWRfYXNzZW1ibGUpOiBDYWxsIGl0LgorCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogSGFuZGxlIEJGRF9SRUxPQ18yNiwgZm9yIGNhbGxfcGFsCisJaW5zdHJ1Y3Rpb25zLgorCShsaXR1c2VfcGVuZGluZyk6IE5ldyB2YXJpYWJsZS4gIFNldCBieSBhbnl0aGluZyB0aGF0IGdlbmVyYXRlcyBhCisJTElURVJBTCByZWxvYywgY2xlYXJlZCBieSBhbnl0aGluZyB0aGF0IGdlbmVyYXRlcyBhIExJVFVTRSByZWxvYywKKwl0ZXN0ZWQgYnkgY29kZSB0aGF0IG1pZ2h0IHdhbnQgdG8gZW1pdCBhIExJVFVTRSByZWxvYy4KKwkoZW1pdF91bmFsaWduZWRfaW8pOiBOZXcgZnVuY3Rpb24uICBDdXJyZW50bHkgY2FsbHMgbWRfYXNzZW1ibGUsCisJYnV0IGl0IHNob3VsZCBldmVudHVhbGx5IGJlIGNvbnZlcnRlZCB0byBnZW5lcmF0ZSB0aGUgaW5zbiBpdHNlbGYKKwlhbmQgY2FsbCBlbWl0X2luc24gZGlyZWN0bHkuCisJKGVtaXRfbG9hZF91bmFsLCBlbWl0X3N0b3JlX3VuYWwsIGVtaXRfYnl0ZV9tYW5pcF9yLAorCWVtaXRfZXh0cmFjdF9yLCBlbWl0X2luc2VydF9yLCBlbWl0X21hc2tfciwgZW1pdF9zaWduX2V4dGVuZCwKKwllbWl0X2Jpc19yKTogTGlrZXdpc2UuCisJKGFscGhhX2lwLCBjYXNlICdJJyk6IEhhbmRsZSB3aXRoIEJGRF9SRUxPQ18yMy4KKwkoYWxwaGFfaXAsIGxhYmVsIGdldF9tYWNybyk6IERvbid0IGVtaXQgdGhlIGZpbmFsIGluc3RydWN0aW9uIGlmCisJdGhlIG9wY29kZSBpcyB6ZXJvLgorCShhbHBoYV9pcCwgY2FzZSAnQicsIHN1YmNhc2UgJ2QnKTogTmV3IGNhc2UsIGZvciBzdWJ3b3JkIGFuZAorCXVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIG1hY3Jvcy4KKwkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18yNi4gIEdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgaWYKKwl0aGUgdmFsdWUgY2FuJ3QgYmUgcmVzb2x2ZWQuCisKK1dlZCBNYXIgMjMgMTY6MDY6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBGb3IgLW1lbWJlZGRlZC1waWMsIGZvcmNlCisJdGhlIC1HIHZhbHVlIHRvIDB4N2ZmZmZmZmYuICBGb3IgU1ZSNCBQSUMgb3B0aW9ucywgZG9uJ3QgY2FsbAorCWJmZF9zZXRfZ3Bfc2l6ZSBoZXJlLCBpdCdzIGRvbmUgaW4gbWRfYmVnaW4uICBEb24ndCBwZXJtaXQgLUcgd2l0aAorCS1tZW1iZWRkZWQtcGljLgorCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCisJKG1kX2FwcGx5X2ZpeCk6IFNldCBmaXhQLT5meF9kb25lIGFwcHJvcHJpYXRlbHkuCisJKHNfY2hhbmdlX3NlYyk6IEZvciBFTUJFRERFRF9QSUMsIGNoYW5nZSAuZGF0YSBhbmQgLnJkYXRhIHRvCisJLnNkYXRhLgorCSogY29uZmlnL3RjLW1pcHMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZS4KKwkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZS4KKwkoVENfSEFORExFX0ZYX0RPTkUpOiBEZWZpbmUuCisKK1R1ZSBNYXIgMjIgMTM6NTg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChlbnVtIG1pcHNfcGljX2xldmVsKTogTmV3IGVudW0uCisJKG1pcHNfcGljKTogQ2hhbmdlIGZyb20gaW50IHRvIGVudW0gbWlwc19waWNfbGV2ZWwuICBDaGFuZ2UgYWxsCisJdXNlcyAoMCBiZWNvbWVzIE5PX1BJQywgMiBiZWNvbWVzIFNWUjRfUElDKS4KKwkobG9hZF9hZGRyZXNzKTogSGFuZGxlIEVNQkVEREVEX1BJQy4KKwkobWFjcm8pOiBIYW5kbGUgRU1CRURERURfUElDIGluIGFsbCBQSUMgY2FzZXMuCisJKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWVtYmVkZGVkLXBpYyB0byB1c2UgRU1CRURERURfUElDLiAgSWYKKwlPQkpfRUxGLCBhY2NlcHQgLUtQSUMgYW5kIC1jYWxsX3NoYXJlZCB0byB1c2UgU1ZSNF9QSUMgYW5kIGFjY2VwdAorCS1ub25fc2hhcmVkIHRvIHVzZSBOT19QSUMgKHRoaXMgaXMgaG93IHRoZSBJcml4IDUgYXNzZW1ibGVyCisJd29ya3MpLiAgRG8gbm90IHBlcm1pdCAtRyB3aXRoIFNWUjRfUElDLgorCShzX2FiaWNhbGxzKTogV2FybiBpZiAtRyB3YXMgdXNlZCwgYW5kIGZvcmNlIC1HIDAuCisJKHRjX2dlbl9yZWxvYyk6IFNldCByZWxvYy0+YWRkZW5kIHRvIDAgZm9yIGEgUEMgcmVsYXRpdmUgcmVsb2MgZm9yCisJYW55dGhpbmcgYnV0IGEub3V0LCBub3QganVzdCBmb3IgRUxGLiAgRm9yIEVDT0ZGLCBkb24ndCBnZW5lcmF0ZSBhCisJQkZEX1JFTE9DXzE2X1BDUkVMX1MyIHJlbG9jIHVubGVzcyB1c2luZyBFTUJFRERFRF9QSUMuCisKKwkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogRGVmaW5lIHRvIGJlIDEuCisKK1N1biBNYXIgMjAgMTY6MzE6NTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGNyZWF0ZV9uZXdfc3BhY2UpOiBVc2UgaW50cywgbm90IGNoYXJzIGFzCisJcGFyYW1ldGVycyB0byBhdm9pZCBsb3Npbmcgd2hlbiBjb21waWxpbmcgd2l0aCBIUCBDQy4KKwkoY3JlYXRlX25ld19zdWJzcGFjZSwgdXBkYXRlX3N1YnNwYWNlLCBmaXhfbmV3X2hwcGEpOiBMaWtld2lzZS4KKworU3VuIE1hciAyMCAxNDo0MzoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogSWYgYGRlZnMnIGlzIGRlZmluZWQsIGVtaXQgYQorCXByZXByb2Nlc3NvciBkaXJlY3RpdmUgdG8gY3JlYXRlIGEgbWFjcm8gbmFtZWQgYnkgdGhpcyB2YWx1ZSBpbnRvCisJY29uZmlnLm5ldzsgZG9uJ3QgZXhwbGljaXRseSBnbyBmb3IgQkZEX0FTU0VNQkxFUi4KKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGBkZWZzJywgbm90IGBCRkRERUYnLiAgU2V0IGl0IHRvCisJTUFOWV9TRUdNRU5UUyBmb3IgYW55IG9iai1jb2ZmYmZkIHRhcmdldC4KKwkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChCRkRfSEVBREVSUywgQkZEKTogRGVmaW5lLgorCSogY29uZmlnL2kzODZjb2ZmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSBCRkQsIE1BTllfU0VHTUVOVFMsCisJb3IgQkZEX0hFQURFUlMuCisJKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZWQuCisJKiBjb25maWcvbTY4a2NvZmYubXQgKFRERUZJTkVTKTogRG9uJ3QgZGVmaW5lIHRob3NlIG1hY3Jvcy4KKwkqIGNvbmZpZy9tODhrY29mZi5tdCAoVERFRklORVMpOiBEaXR0by4KKwkqIGNvbmZpZy9lYm1vbjI5ay5tdDogRGVsZXRlZC4KKwkqIGNvbmZpZy9oODMwMGhkcy5tdDogRGVsZXRlZC4KKwkqIGNvbmZpZy9pYzk2MGNvZmYubXQ6IERlbGV0ZWQuCisJKiBjb25maWcvc3BhcmMubXQ6IERlbGV0ZWQuCisJKiBjb25maWcvaDgzMDAubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgorCSogY29uZmlnL2g4NTAwLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KKwkqIGNvbmZpZy9zaC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCisJKiBjb25maWcvejhrLm10IChMT0NBTF9MT0FETElCRVMpOiBEZWxldGVkLgorCShUREVGSU5FUyk6IERvbid0IGRlZmluZSB0aGUgY29mZmJmZCBtYWNyb3MuCisKKwkqIE1ha2VmaWxlLmluOiBJbnNlcnQgbWFrZWZpbGUgZnJhZ21lbnRzIGJlZm9yZSBPQkpTIGRlZmluaXRpb24uCisJKE9CSlMpOiBBZGQgJChURV9PQkpTKS4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBTdXBwbHkgInNlY3Rpb24iCisJdW5jb25kaXRpb25hbGx5LgorCisJKiB3cml0ZS5jIChzZXRfc3ltdGFiKTogRGVmaW5lIG9ubHkgaWYgQkZEX0FTU0VNQkxFUi4KKworU3VuIE1hciAyMCAxMjowNjowNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWFrZWZpbGUuaW4gKFNUQUdFU1RVRkYpOiBBZGQgZ2FzcC5uZXcuCisKK0ZyaSBNYXIgMTggMjA6MDk6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogd3JpdGUuYyAoc3ltYm9sX3RhYmxlX2Zyb3plbik6IE5ldyB2YXJpYWJsZSwgdG8gYmUgc2V0IGFmdGVyCisJYmZkX3NldF9zeW10YWIgaXMgY2FsbGVkLgorCShkdW1wX3NlY3Rpb25fcmVsb2NzKTogTm90ZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wKKwlvciBub3QuCisJKGFkanVzdF9yZWxvY19zeW1zKTogRm9yIG5vdywgYWx3YXlzIHN1cHBseSBhbiBhYnNvbHV0ZSBzeW1ib2wgZm9yCisJZml4dXBzIHdpdGhvdXQgc3ltYm9scyBidXQgbm90IHlldCBgZG9uZScuICBVc2Ugc2VjdGlvbl9zeW1ib2wgdG8KKwlnZXQgdGhlIHN5bWJvbCwgaW5zdGVhZCBvZiBnb2luZyBkaXJlY3RseSBmb3IgYWJzX3N5bWJvbC4KKwkod3JpdGVfcmVsb2NzKSBbREVCVUc0XTogQWJvcnQgaWYgYW55IHN5bWJvbCByZWZlcnJlZCB0byBieSBhCisJcmVsb2MgaXMgbm90IGEgc2VjdGlvbiBzeW1ib2wgYW5kIGlzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLgorCShzZXRfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IGZyb20gd3JpdGVfb2JqZWN0X2ZpbGUuCisJQ291bnRzIHN5bWJvbCB0YWJsZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYW4gZWFybGllciBjb3VudC4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHNldF9zeW10YWIsIGJ1dCBkbyBpdCBhZnRlciBwb3RlbnRpYWxseQorCWludm9raW5nIHRoZSAqX2Zyb2JfZmlsZSBtYWNyb3MuICBEb24ndCBib3RoZXIgY291bnRpbmcgc3ltYm9scy4KKwlDYWxsIHN5bWJvbF9yZW1vdmUsIGluc3RlYWQgb2YgZXhwYW5kaW5nIGl0IGluIHBsYWNlLiAgTW92ZWQgdGhlCisJY29uZGl0aW9uYWxpemVkIGBvYmplY3RfZmlsZV9zaXplJyBkZWNsYXJhdGlvbiBkb3duIHRvCisJY29uZGl0aW9uYWxpemVkIGJsb2NrIHdoZXJlIGl0J3MgdXNlZC4gIFdoZW4gdXNpbmcgdGhlIGFic29sdXRlCisJc3ltYm9sIGZvciBhIGZpeHVwIHdpdGhvdXQgYSBzeW1ib2wsIHNldCBzeV91c2VkX2luX3JlbG9jLgorCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIHNlY3Rpb25fc3ltYm9sIHRvIGdldAorCXRoZSBjb3JyZWN0IHN5bWJvbCBmb3IgdGhlIGFic29sdXRlIHNlY3Rpb24uCisKKwkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBVc2Ugc3ltYm9sX25ldyBpbnN0ZWFkIG9mCisJc3ltYm9sX21ha2UsIHNpbmNlIHdlIG1heSB3YW50IGl0IHRvIGdvIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KKwlNYWtlIHRoZSBuZXcgc3ltYm9sIGhhdmUgaW50ZXJuYWwgbGlua2FnZS4gIElmCisJb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jIHNheXMgaXQncyBva2F5LCB1c2UgdGhlIEJGRCBzZWN0aW9uCisJc3ltYm9sIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgR0FTIHN5bWJvbC4KKwkob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogRGVmYXVsdCB0byBhbHdheXMgcmV0dXJuaW5nIDAuCisJKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKSBbQkZEX0FTU0VNQkxFUl06CisJTmV3IG1hY3JvLgorCSogY29uZmlnL29iai1lbGYuaCAob2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IG1hY3JvLgorCisJKiBjb25maWcvdGMtc3BhcmMuYzogSW5jbHVkZSBzdWJzZWdzLmguCisJKGluX3NpZ25lZF9yYW5nZSk6IE5ldyBmdW5jdGlvbi4KKwkoc3BhcmNfaXApOiBVc2UgaXQuCisJKHNwYXJjX2lwLCBjYXNlICdpJyk6IFVzZSBCRkRfUkVMT0NfU1BBUkMxMywgbm90IF9CQVNFMTMuCisJKHNwYXJjX2lwLCBsYWJlbCAiaW1tZWRpYXRlIik6IFJlamVjdCBjb25zdGFudHMgZm9yIHBjcmVsCisJaW5zdHJ1Y3Rpb25zIG9ubHkgaWYgdGhlIHJlbG9jYXRpb24gdHlwZSBpbmRpY2F0ZXMgYSAiY2FsbCIKKwlpbnN0cnVjdGlvbiBhbmQgdGhlIG9mZnNldCBpcyB3aXRoaW4gcmFuZ2Ugb2YgYSAiam1wbCAlZzAiLiAgSWYKKwlpdCdzIG5vdCBpbiByYW5nZSwgdXNlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbCBwbHVzIGFuIG9mZnNldC4KKwkobWRfYXBwbHlfZml4KTogVXNlIGluX3NpZ25lZF9yYW5nZS4gIENvbWJpbmVkIF9TUEFSQzEzIGFuZAorCV9CQVNFMTMgY2FzZXMuCisJKHRjX2dlbl9yZWxvYyk6IFBlcm1pdCBCRkRfUkVMT0NfU1BBUkMxMy4KKworCSogY29uZmlnL2ljOTYwY29mZi5tdCAoVERFRklORVMpOiBGaXhlZCB0eXBvIChNQU5ZX1NFQ1RJT05TLCBub3QKKwlNQU5ZX1NFR01FTlRTKS4KKworCSogY29uZmlndXJlLmluOiBFbGltaW5hdGVkIGFsbCB0YXJnZXRzIHVzaW5nIG9iai1jb2ZmIGJ1dCBub3QKKwlkZWZpbmluZyBCRkRfQVNTRU1CTEVSOyBJIHRoaW5rIGFsbCBzdWNoIHRhcmdldHMgdGhhdCBhcmUKKwlzdXBwb3J0ZWQgd2lsbCBiZSBtYXRjaGVkIGJ5IHJlYWwgQ1BVLU9TIGNvbWJpbmF0aW9ucyBlYXJsaWVyIGluCisJdGhlIGNhc2Ugc3RhdGVtZW50LgorCSh0YXJnZXRzICotKi1jb2ZmKiwgKi1zeXN2KiwgKi0qLXNjbyosICotKi1zeXN2MzIpOiBEZWxldGVkLiAgTWFkZQorCXNvbWUgY29tbWVudHMgYWJvdXQgdGhlIGRweDIgY29uZmlndXJhdGlvbiwgYnV0IGxlZnQgaXQgZGlzYWJsZWQsCisJc2luY2UgaXQgY291bGRuJ3QgYmUgcmVhY2hlZCBiZWZvcmUuCisJKHRhcmdldCBhMjlrLWFtZC1lYm1vbm9sZCk6IERlbGV0ZWQuCisKK1RodSBNYXIgMTcgMTM6MzY6MDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2ltcG9ydCk6IENvcnJlY3RseSBoYW5kbGUgaW1wb3J0aW5nIG9mIGFuCisJYWxyZWFkeSBkZWZpbmVkIHN5bWJvbC4KKworV2VkIE1hciAxNiAxNzoxMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBPbmx5IGFjY2VwdCBvdmVybHkgbGFyZ2UgdmFsdWVzIGZvcgorCXRoZSAnaicgb3BlcmFuZCBpZiB0aGVyZSBhcmUgbm8gZnVydGhlciBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMKKwlpbnN0cnVjdGlvbi4KKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBJbml0aWFsaXplCisJc3RhYnN0cnNlZyB0byBTRUdfVU5LTk9XTiwgbm90IC0xLiAgQWZ0ZXIgbG9vcCwgY2hlY2sgd2hldGhlciBpdAorCWlzIG5vdCBTRUdfVU5LTk9XTiByYXRoZXIgdGhhbiBjaGVja2luZyB3aGV0aGVyIGl0IGlzID49IDAuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWxpZ24pOiBUYWtlIG5ldyBhcmd1bWVudCwgbGFiZWwsIGFuZCB1c2UKKwlpdCBpbnN0ZWFkIG9mIGdsb2JhbCBpbnNuX2xhYmVsLgorCShzX2FsaWduLCBzX2NvbnMsIHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBTYXZlIGluc25fbGFiZWwgYmVmb3JlCisJY2FsbCB0byBtaXBzX2VtaXRfZGVsYXkgYW5kIHBhc3MgaXQgdG8gbWlwc19hbGlnbi4KKworV2VkIE1hciAxNiAxMTo1NDoxMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXF1KTogSGFuZGxlIGJvdGggLnJlZyBhbmQgLmVxdSBjb3JyZWN0bHkuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NhbGxpbmZvKTogQWNjZXB0ICJtaWxsaWNvZGUiIGFzIGFuCisJYXJndW1lbnQgdG8gYSAuY2FsbGluZm8gZGlyZWN0aXZlLiAgRG9uJ3QgbG9vcCBmb3JldmVyIG9uIGVycm9ycy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXF1KTogVXNlIHBhX3BhcnNlX251bWJlciBzbyB0aGF0IHdlIGNhbgorCXVzZSBwcmUtZGVmaW5lZCByZWdpc3RlcnMgYXMgYXJndW1lbnRzLgorCitNb24gTWFyIDE0IDE0OjI5OjQ1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgYm90aCBTX0lTX0xPQ0FMIGFuZAorCVNfSVNfRVhURVJOQUwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGRpc2NhcmQgYSBzeW1ib2wuCisKKwkqIGNvbmZpZy1nYXMuY29tOiBTY2FuIE1ha2VmaWxlLmluLCBub3QgdmVyc2lvbi5jLCBmb3IgY3VycmVudAorCXZlcnNpb24gbnVtYmVyLiAgRGVsZXRlIGFsbCB2ZXJzaW9ucyBvZiB0ZW1wIGZpbGVzIHdoZW4gZmluaXNoZWQKKwl3aXRoIHRoZW0uICBDcmVhdGUgY29uZmlnLmguCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUpOiBDYWNoZSBzeW1ib2wKKwl2YWx1ZXMgdG8gcmVkdWNlIG51bWJlciBvZiBsb29rdXBzIHdpdGggU19HRVRfVkFMVUUuICBTa2lwIGRlYnVnCisJc3ltYm9scyB0byBhdm9pZCAiYSByZWFsbHkgbmFzdHkgYnVnIi4gIChGcm9tIEhvbGdlciBUZXV0c2NoLAorCWhvbGdlckBib3Ric28ucmhlaW4tbWFpbi5kZS4pCisJKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IEZvciAiX192dC4qIiBzeW1ib2xzLCBzZXQgU19HRVRfT1RIRVIKKwlmaWVsZC4gIChBbHNvIGZyb20gSG9sZ2VyIFRldXRzY2guKSAgV2F0Y2ggZm9yIGEgd291bGQtYmUgcmVnaXN0ZXIKKwltYXNrIHRoYXQgc3BhbnMgZnJhZ3MuCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9saW5lKTogU2V0IHN5bWJvbCBsbm5vIGZpZWxkIHdpdGgKKwl0aGlzX2Jhc2UsIG5vdCBsaW5lX2Jhc2UuICAoUGF0Y2ggZnJvbSBBbmRyZWFzIEFyZW5zLAorCWFyaUBvYmVsaXguYXYucnd0aC1hYWNoZW4uZGUuKQorCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJldGFpbiBzeW1ib2xzIHRoYXQKKwlsb29rIGxvY2FsIGlmIHRoZXkncmUgZXhwb3J0ZWQgb3IgdW5kZWZpbmVkLiAgVXNlZCB0byBiZSBkb25lIGZvcgorCWk5NjAgb25seS4KKworCSogcmVhZC5jIChzX2xjb21tLCBzX2NvbW0pOiBQcmludCBzeW1ib2wgbmFtZSBiZWluZyByZWRlZmluZWQuCisJR2V0IGl0IGZyb20gdGhlIGxvb2tlZC11cCBzeW1ib2wsIGluc3RlYWQgb2YgdXNpbmcgdGhlIHN0cmluZyBmcm9tCisJdGhlIGlucHV0IHN0cmVhbSwgd2hpY2ggaXMgbm8gbG9uZ2VyIG51bGwtdGVybWluYXRlZC4KKwkoTEVYX1BDVCk6IE5ldyBtYWNybywgZGVmYXVsdHMgdG8gMC4KKwkobGV4X3R5cGUpOiBVc2UgaXQgZm9yIGAlJy4KKworCSogY29uZmlnL3RjLXZheC5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgYC1oIycgb3B0aW9uIGZvciBWTVMuCisJKHZpcF9vcCk6IE5vdyBzdGF0aWMsIGFuZCByZXR1cm5zIHZvaWQuICBDYWxsZXJzIGNoYW5nZWQuICBBZGRlZAorCWZvcndhcmQgZGVjbC4KKwkodmlwKTogRGl0dG8uICBDYWxsIGFzX2ZhdGFsIGRpcmVjdGx5IGlmIGEgcHJvZ3JhbSBidWcgaXMKKwlkZXRlY3RlZC4KKwkob3BfaGFzaCk6IExldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHN1ZmZpY2UuCisKKwkqIE1ha2VmaWxlLmluIChsaXRlcmFsLm8pOiBQcm92aWRlIGRlcGVuZGVuY2llcy4KKworCSogY29uZmlndXJlLmluOiBTZXQgbmV3IG1ha2VmaWxlIHZhcmlhYmxlIE9QQ09ERVNfTElCLgorCSogTWFrZWZpbGUuaW4gKExJQlMpOiBVc2UgaXQuCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLWdhcy5jb20sIHN0YW1wLW1rLmNvbSk6IE5ldyB0YXJnZXRzLgorCSogdm1zY29uZi5zaDogTmV3IGZpbGUuCisJKiBtYWtlLWdhcy5jb206IFJlZ2VuZXJhdGVkIGZyb20gbmV3IHNjcmlwdC4KKworCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MqKTogSGFuZGxlIGFueSB2ZXJzaW9uIG51bWJlcgorCXN1ZmZpeCBhZnRlciAibHlueG9zIi4gIFNldCBlbXVsYXRpb24gdG8gbHlueC4KKworTW9uIE1hciAxNCAxMTozMDo0OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWxldGUgZGVjbGFyYXRpb24uCisKK0ZyaSBNYXIgMTEgMjI6MjU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtcHBjLmMgKG1kX3BjcmVsX2Zyb20pOiBSZXR1cm4gMCBmb3IgdW5kZWZpbmVkIEVMRgorCXN5bWJvbHMuCisJKHBwY19pc190b2Nfc3ltKTogQ2hhbmdlIC50b2MgdG8gLmdvdC4KKwkobWRfYXBwbHlfZml4KTogQ2hhbmdlIGhhbmRsaW5nIG9mIEVMRiByZWxvY3MuCisJKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgorCitGcmkgTWFyIDExIDE3OjQyOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKENsb3NlX1ZNU19PYmplY3RfRmlsZSk6IEFkZCBjb21tZW50IHBvaW50aW5nCisJb3V0IHNvbWUgY29kZSB0aGF0IGRvZXNuJ3QgYmVsb25nIGluIHRoaXMgZmlsZS4KKworCSogY29uZmlnL29iai12bXMuaDogSW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCisJKE5fR1NZTSwgLi4uLCBOX0xFTkcpOiBEZWxldGVkLgorCShOT19SRUxPQyk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZyBhcyBwYXJ0IG9mIGVudW0gcmVsb2NfdHlwZS4KKworCSogY29uZmlnL3RjLWFscGhhLmM6IEFkZCBjb21tZW50IHF1ZXN0aW9uaW5nIG5lZWQgZm9yIGFsbCB0aGUKKwljaGFyYWN0ZXJzIGluIEZMVF9DSEFSUy4KKworCSogYXMuYyAobWFpbikgW09CSl9WTVNdOiBEb24ndCBjYWxsIG91dHB1dF9maWxlX2Nsb3NlLgorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IFNldCBzdHJpY3Qgb3JkZXIgZm9yCisJc2VjdGlvbnMgd2l0aCByZWNvZ25pemVkIG5hbWVzLCBiZWZvcmUgY29tcHV0aW5nIFZNQSB2YWx1ZXMuCisKK0ZyaSBNYXIgMTEgMTc6NTY6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQWNjZXB0IG51bWJlcnMgYmV0d2VlbiAweDgwMDAgYW5kCisJMHhmZmZmIGZvciAnaicgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE1JUFMgYXNzZW1ibGVyLiAgVGhlc2UKKwludW1iZXJzIGFyZSBhY3R1YWxseSB0cmVhdGVkIGFzIG5lZ2F0aXZlLgorCitUaHUgTWFyIDEwIDEzOjM2OjI5IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCk6IExvY2FsIGxhYmVscyBhcmUgLkxmb28uCisKK1R1ZSBNYXIgIDggMjE6MTc6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmM6IE1pbm9yIGZvcm1hdHRpbmcvc3R5bGlzdGljIGNoYW5nZXMsIHBsdXM6CisJKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWNsYXJlLgorCShvYmpfcHNldWRvX3RhYmxlKTogTWFrZSBpdCBhdmFpbGFibGUgb25seSBpZiBNQU5ZX1NFQ1RJT05TLgorCShvYmpfc3ltYm9sX3RvX2NoYXJzKSBbQ1JPU1NfQ09NUElMRV06IFNvbWUgYXR0ZW1wcyB0byBtYWtlIHRoaXMKKwl3b3JrLiAgSXQgc3RpbGwgZG9lc24ndC4gIEl0IG5vdyBmYWlscyB0byBjb21waWxlLCBpbnN0ZWFkIG9mCisJc2lsZW50bHkgY29tcGlsaW5nIHRvIGRvIG5vdGhpbmcuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZSBvbmx5IGlmCisJTUFOWV9TRUNUSU9OUy4KKwkoT0JKX1BST0NFU1NfU1RBQikgWyEgTUFOWV9TRUNUSU9OU106IE5ldyBtYWNybywganVzdCBlbWl0cworCXdhcm5pbmcuCisKKwlIYW5kbGUgQWxwaGEgbG9hZC1pbW1lZGlhdGUtRlAgcHNldWRvLWluc3RydWN0aW9uczoKKwkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaCAobGRpZiwgbGRpZywgbGRpcywgbGRpdCk6IE5ldyBwYXR0ZXJucy4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChsaXQ4X3NlYywgbGl0NF9zZWMsIGxpdDhfc3ltLCBsaXQ0X3N5bSk6IE5ldworCXZhcmlhYmxlcy4KKwkoY3JlYXRlX2xpdGVyYWxfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoY3JlYXRlX2xpdGFfc2VjdGlvbik6IE5vdyBhIG1hY3JvLgorCShnZXRfbGl0OF9vZmZzZXQsIGdldF9saXQ0X29mZnNldCk6IE5ldyBmdW5jdGlvbnMuCisJKG1heWJlX3NldF9ncCk6IE5ldyBmdW5jdGlvbi4KKwkoc2VsZWN0X2dwX3ZhbHVlKTogQ2FsbCBpdC4KKwkobG9hZF9leHByZXNzaW9uKTogUHJlc2VydmUgYWRkZW5kIGlmIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sLgorCShhbHBoYV9pcCk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlIGBGJyBmb3IgZmxvYXRpbmctcG9pbnQKKwljb25zdGFudHM7IHN0b3JlIHRoZW0gaW4gLmxpdHs0LDh9IHNlY3Rpb25zLgorCShhbHBoYV9pcCwgY2FzZSAnRycpOiBFbWl0IExJVFVTRSByZWxvY2F0aW9ucyBmb3Igc3ltYm9sIGV4cHJzLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChzbWFsbGVzdF9pbW1fdHlwZSk6IE5ldmVyIHJldHVybiBJbW0xLgorCitUdWUgTWFyICA4IDE0OjE4OjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh3X3N0cmluZ3MpOiBPbmx5IGNvcHkgc3RyaW5ncyBvdXQgaWYKKwl0aGVpciBzeW1ib2xzIGFyZSBnb2luZyB0byBiZSB3cml0dGVuLgorCitUdWUgTWFyICA4IDExOjQ5OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKTogRGVjbGFyZSBhcmd1bWVudHMgY29uc3QuCisJKiBhcy5oIChhc19wZXJyb3IpOiBDaGFuZ2UgZGVjbGFyYXRpb24uCisKK01vbiBNYXIgIDcgMTY6MDg6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX2FkZHJlc3MpOiBXaGVuIGNhbGxpbmcgZnJhZ19ncm93LCBhbGxvdworCWZvciB0aGUgKHVwIHRvKSB0d28gbm9wcyB3aGljaCBtYXkgYmUgaW5zZXJ0ZWQgYnkgYXBwZW5kX2luc24gaWYKKwltaXBzX29wdGltaXplIGlzIDAuCisJKG1hY3JvKTogTGlrZXdpc2UuCisKK1RodSBNYXIgIDMgMTE6Mzc6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2F0b2YtaWVlZS5jIChtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKToKKwlBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nIGZyb20gZ2NjLgorCitXZWQgTWFyICAyIDEwOjMxOjAxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jOiBBZGQgYSBmZXcgY2FzdHMgdG8gbWFrZSBIUCBDIGNvbXBpbGVyIGhhcHB5LgorCisJKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24sIG9ial9zb21fY29weXJpZ2h0KTogQmUKKwlwcmVwYXJlZAorCXRvIGhhbmRsZSBhbiBlcnJvciBmcm9tIGJmZF9zb21fYXR0YWNoX2F1eF9oZHIuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmg6IFdyYXAgRUxGIHNwZWNpZmljIGRlY2xzIGluc2lkZSBhbiBpZmRlZi4KKworTW9uIEZlYiAyOCAxNTowMzoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXRvZik6IE9taXQgd2FybmluZyBhYm91dCBGUCB2YWx1ZXMuCisJKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAhIHRvIGxpc3QuCisJKG1kX2FwcGx5X2ZpeCk6IERvIHByb2Nlc3MgMzItIGFuZCA2NC1iaXQgcmVsb2NhdGlvbnMuCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9sY29tbSk6IFB1dCAiI2lmIDAiIGFyb3VuZCB0aGUKKwl1bnVzZWQgcGFydHMgKG1vc3Qgb2YgdGhlIGZ1bmN0aW9uKS4KKwkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBDYXN0IGFsbG9jYSByZXN1bHQuCisKKwkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLWNvZmYsIGk5NjAtKi12eHdvcmtzNS4qKTogVXNlIGNvZmZiZmQsIGFuZAorCWdhc190YXJnZXQgaWM5NjBjb2ZmLgorCSogY29uZmlnL2ljOTYwY29mZi5tdDogTmV3IGZpbGUuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaCBbVENfSTk2MF06IEluY2x1ZGUgY29mZi9pOTYwLmguCisJKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogVXNlIGNvZmYtSW50ZWwtbGl0dGxlLgorCSogY29uZmlnL3RlLWljOTYwLmggKENST1NTX0NPTVBJTEUpOiBEb24ndCB1bmRlZiB0aGlzLiAgV2UnbGwKKwlhbHdheXMgYnVpbGQgbGl0dGxlLWVuZGlhbiBvYmplY3QgZmlsZXMuCisJKiBjb25maWcvdGMtaTk2MC5jIChtZF9yZWxvY19zaXplKTogRG9uJ3QgZGVmaW5lIGF0IGFsbCBpZiBCRkQgb3IKKwlCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQuCisJKG1lbV9mbXQpOiBTaW5jZSBDT0ZGIGRvZXNuJ3QgaGFuZGxlIGNhbGx4IHJlbG9jYXRpb25zIHlldCwgdHJlYXQKKwl0aGVtIGxpa2Ugbm9ybWFsIDMyLWJpdCByZWxvY2F0aW9ucy4KKwkobWRfYXBwbHlfZml4KTogRm9yIGNhbGx4IHJlbG9jYXRpb25zLCBzdG9yZSB6ZXJvLgorCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IFN0b3JlIHN5bWJvbCBpbmRleCBmb3IgYWxsIGNhbGx4CisJcmVsb2NhdGlvbnMsIHJlZ2FyZGxlc3Mgb2YgbGluay1yZWxheCBzZXR0aW5nLgorCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbnMuCisJKGk5NjBfaGFuZGxlX2FsaWduKSBbISBPQkpfQk9VVF06IElmIGxpbmstcmVsYXggb3B0aW9uIGlzCisJc2VsZWN0ZWQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGNsZWFyIGl0LgorCSogY29uZmlnL3RjLWk5NjAuaCAoQkZEX0FSQ0gsIENPRkZfRkxBR1MsIENPRkZfTUFHSUMsCisJVENfQ09VTlRfUkVMT0MsIFRDX0NPRkZfRklYMlJUWVBFLCBUQ19DT0ZGX1NJWkVNQUNIREVQLAorCXRjX2ZpeF9hZGp1c3RhYmxlKTogTmV3IG1hY3Jvcy4KKwkodGNfY29mZl9maXgycnR5cGUsIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgorCitGcmkgRmViIDI1IDIwOjU2OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IENhbGwgUEEgRUxGIEJGRCB2ZXJzaW9uLgorCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkocGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KKwkoaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IExpa2V3aXNlLgorCShwYV9leHBvcnQpOiBEZWxldGUgY2FsbCB0byBwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24uCisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKGhwcGFfdGNfc3ltYm9sKTogQWRkIGV4dGVybiBkZWNsLgorCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRGVsZXRlIGV4dGVybiBkZWNsLgorCShocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbC4KKworRnJpIEZlYiAyNSAxMzoxNTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBDb3JyZWN0IHRlc3QgZm9yIHdoZXRoZXIgdG8KKwlmaWxsIGEgc2VjdGlvbiAoZnJvbSBNaW5oIFRyYW4tTGUgPFRSQU5MRUBpbnRlbGxpY29ycC5jb20+KS4KKworVGh1IEZlYiAyNCAxMTozMDoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IERvbid0IHJlcXVpcmUgdmVyc2lvbiBudW1iZXIgZm9yIGkzODYtKi1tYWNoLgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGRlZCAiLnRoaXNfR0NDX3JlcXVpcmVzX3RoZV9HTlVfYXNzZW1ibGVyIiwKKwl3aGljaCBpcyBpZ25vcmVkIGJ5IGdhcywgYnV0IHdpbGwgY2F1c2Ugb3RoZXIgYXNzZW1ibGVycyB0byBjaG9rZS4KKwlJbnRlbmRlZCBmb3IgdXNlIGJ5IGdjYyBwb3J0cyB0aGF0IHJlcXVpcmUgZ2FzIGluc3RlYWQgb2YgbmF0aXZlCisJYXNzZW1ibGVycy4KKworVGh1IEZlYiAyNCAwNzoxMDozMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL2hvLWhwcGFvc2YuaDogRml4IGJyYWlubyBpbiB0ZXN0IGZvciBBTlNJLUMuCisKK1dlZCBGZWIgMjMgMTY6NTE6NDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogR2l2ZSB0aGUgdXNlciBhIHJlYXNvbmFibGUgZXJyb3IKKwltZXNzYWdlIHJhdGhlciB0aGFuICJhc3NlcnRpb24gZmFpbGVkIiBpZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKKwlmYWlscy4KKworVHVlIEZlYiAyMiAxMDowNzozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9oby1tYWNoMy5oOiBOZXcgZmlsZS4KKworTW9uIEZlYiAyMSAxMTo0MToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogRG9uJ3Qgc2V0IGhkci0+bWFnaWMgaGVyZS4gIEl0IGlzCisJbm93IHNldCBpbiBiZmQvZWNvZmZsaW5rLmM6ZWNvZmZfd3JpdGVfc3ltaGRyLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiB1c2UgYmZkX2dldF9lcnJvciAoKSwKKwlub3QgYmZkX2Vycm9yLgorCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgorCisJKiByZWFkLmMgKHNfbGNvbW0pOiBVc2UgYW4gYWxpZ25tZW50IHBvd2VyIG9mIDMgZm9yIDggYnl0ZSAubGNvbW0KKwl2YXJpYWJsZXMuCisKKwkqIGNvbmZpZy9oby1ocHV4LmggKEJST0tFTl9BU1NFUlQpOiBEZWZpbmUgaWYgbm90IF9fR05VQ19fLgorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBjb3JyZWN0IGFyZ3VtZW50cyB0byBtZW1jcHkKKwkoYnJva2VuIDE5IEp1bCAxOTkzKS4gIEZyb20ga2pkQHBlc2NhZGVyby5zdGFuZm9yZC5lZHUgKEtlbm5ldGgKKwlEdWRhKS4KKworU3VuIEZlYiAyMCAxODowMTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jb2ZmX3NlY3Rpb24pOiBEZWNsYXJlLgorCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBGb3IgInNlY3Rpb24iLCB1c2UKKwlvYmpfY29mZl9zZWN0aW9uLgorCShvYmpfY29mZl9zZWN0aW9uKTogUmV3cml0ZS4KKworRnJpIEZlYiAxOCAxNDoxNjozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1tYWNoMyopOiBOZXcgdGFyZ2V0OyB1c2VzIEJGRC4KKwkqIGNvbmZpZy90ZS1tYWNoLmg6IE5ldyBmaWxlLgorCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy9vYmotYW91dC5oIChvYmpfYW91dF9mcm9iX2ZpbGUpOiBEZWNsYXJlIGl0LgorCShmcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSkgW1RFX01hY2hdOiBEb24ndCBhZGp1c3QKKwlwY3JlbDMyIHJlbG9jYXRpb25zLgorCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX01hY2hdOiBVc2UgYS5vdXQtbWFjaDMuCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogUmVtb3ZlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCisKK1RodSBGZWIgMTcgMTY6MjU6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJU29tZSBzdXBwb3J0IGZvciBQb3dlclBDIEVMRi4KKwkqIGNvbmZpZ3VyZS5pbjogSWYgY3B1IGlzIHBvd2VycGMqLCB1c2UgcHBjLgorCShwcGMtKi1zeXN2NCopOiBVc2Ugb2JqZWN0IGZvcm1hdCBlbGYuCisJKiBjb25maWcvdGMtcHBjLmg6IE9ubHkgZGVjbGFyZSBhIG51bWJlciBvZiB0aGluZ3MgaWYgT0JKX0NPRkYgaXMKKwlkZWZpbmVkLgorCShUQVJHRVRfQVJDSCk6IE1ha2UgaXQgY2FsbCBwcGNfYXJjaC4KKwkocHBjX2FyY2gpOiBEZWNsYXJlLgorCShUQVJHRVRfRk9STUFUKTogU2V0IGJhc2VkIG9uIE9CSl9DT0ZGIG9yIE9CSl9FTEYuCisJKE5PX1NUUklOR19FU0NBUEVTKTogRGVmaW5lLgorCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIGZvciBPQkpfRUxGLgorCSogY29uZmlnL3RjLXBwYy5jOiBPbmx5IGRlZmluZSBhIG51bWJlciBvZiBmdW5jdGlvbnMgb2YgT0JKX0NPRkYKKwlpcyBkZWZpbmVkLgorCShtZF9wc2V1ZG9fdGFibGUpOiBNb3N0IHBzZXVkby1vcHMgYXJlIE9CSl9DT0ZGIHNwZWNpZmljLiAgQWRkZWQKKwlPQkpfQ09GRiBzcGVjaWZpYyAiYmkiIGFuZCAiZWkiLgorCShtZF9wYXJzZV9vcHRpb24pOiBGaXggaGFuZGxpbmcgb2YgLXUuICBNYWtlIC1tNjAxIHNldAorCVBQQ19PUENPREVfNjAxLiAgSWYgT0JKX0VMRiwgYWNjZXB0IC1WIGFuZCAtUS4KKwkocHBjX3NldF9jcHUpOiBOZXcgZnVuY3Rpb24uCisJKHBwY19hcmNoKTogTmV3IGZ1bmN0aW9uLgorCShtZF9iZWdpbik6IENhbGwgcHBjX3NldF9jcHUuCisJKHBwY19pbnNlcnRfb3BlcmFuZCk6IEZvciBhIHNpZ25lZCBvcGVyYW5kIGFjY2VwdCBhbiB1bnNpZ25lZAorCXZhbHVlLCBmb3IgSUJNIGNvbXBhdGliaWxpdHkuCisJKHBwY19ieXRlKTogRG9uJ3QgY2FsbCBzdHJpbmdlciBmb3Igc3RyaW5nczsgaW5zdGVhZCwgdHJlYXQgdHdvCisJZG91YmxlIHF1b3RlcyBhcyBhIHNpbmdsZSBkb3VibGUgcXVvdGUuCisJKHBwY19jb21tKTogU2V0IHN5X3RjLm91dHB1dCBmb3IgYSAubGNvbW0gc3ltYm9sLgorCShwcGNfYmllaSk6IE5ldyBmdW5jdGlvbi4KKwkocHBjX3RjKTogSWYgbm90IE9CSl9DT0ZGLCBpZ25vcmUgZmlyc3QgYXJndW1lbnQuCisJKHBwY19maXhfYWRqdXN0YWJsZSk6IENhbGwgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgorCShwcGNfaXNfdG9jX3N5bSk6IE5ldyBmdW5jdGlvbi4KKwkobWRfYXBwbHlfZml4KTogVXNlIHBwY19pc190b2Nfc3ltLiAgSGFuZGxlIEJGRF9SRUxPQ18xNiBhbmQKKwlCRkRfUkVMT0NfOC4KKworVGh1IEZlYiAxNyAwOToyOTozNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcikgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2dldF9lcnJvciBhbmQKKwliZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCisKK1R1ZSBGZWIgMTUgMjA6MjM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBTdXBwb3J0IGk5NjAtdnh3b3JrcyB2ZXJzaW9ucyA+IDUuMCBhcyBjb2ZmLgorCURlZmF1bHQgaXMgc3RpbGwgYm91dCBpZiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZC4KKworCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IFVzZSBzd2l0Y2ggYW5kIHN0cmNhc2VjbXAgaW5zdGVhZAorCW9mIGxhcmdlIG51bWJlciBvZiBjb21wYXJlcyB3aGVuIGxvb2tpbmcgZm9yIGluZi9uYW4gdmFsdWVzLgorCitGcmkgRmViIDExIDEzOjEzOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBEbyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcworCWNvcnJlY3RseSB3aGVuIGJpZyBlbmRpYW4sIGFuZCBnaXZlIGVycm9ycyBvbiBvdmVyZmxvdyByYXRoZXIgdGhhbgorCWdlbmVyYXRpbmcgaW5jb3JyZWN0IGNvZGUuCisKK1RodSBGZWIgMTAgMTE6MjQ6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhcy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgorCisJKiByZWFkLmMgKGRvX2FsaWduKTogRG9uJ3QgZGVmaW5lIGxhYmVsIGp1c3RfcmVjb3JkX2FsaWdubWVudAorCXVubGVzcyBpdCBtaWdodCBiZSB1c2VkLgorCisJKiBhcy5jIChtYWluKTogSWYgbWRfcGFyc2VfbG9uZ19vcHRpb24gaXMgZGVmaW5lZCwgY2FsbCBpdCB3aXRoIGEKKwlsb25nIG9wdGlvbi4KKwkqIGNvbmZpZy90Yy1taXBzLmggKG1kX3BhcnNlX2xvbmdfb3B0aW9uKTogRGVmaW5lLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190cmFwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfYmVnaW4pOiBSZXBvcnQgYW4gZXJyb3IgaWYgbWlwc190cmFwIGlzIHNldCBhdCBJU0EgbGV2ZWwgMS4KKwkobWFjcm8pOiBJZiBtaXBzX3RyYXAsIHVzZSB0cmFwIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGJyZWFrCisJaW5zdHJ1Y3Rpb25zIGZvciBvdmVyZmxvdyBhbmQgZGl2aWRlIGJ5IHplcm8gZGV0ZWN0aW9uLgorCShtaXBzX3BhcnNlX2xvbmdfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLiAgU3VwcG9ydCAtLXRyYXAsCisJLS1uby1icmVhaywgLS1icmVhayBhbmQgLS1uby10cmFwLgorCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBvcHRpb25zLgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgInplcm8iLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogUmVtb3ZlICJ6ZXJvIi4KKwkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX3BzZXVkb190YWJsZSk6IExpa2V3aXNlLgorCitUaHUgRmViIDEwIDAxOjI0OjI3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlamVjdCBpbnRlZ2VyIHZhbHVlcyBmb3IKKwlwYy1yZWxhdGl2ZSBvcGVyYW5kIGZpZWxkcy4gIFRoaXMgZm9yY2VzICJjYWxsIDAiIHRvIGJlY29tZSAiam1wbAorCSVnMCwlbzciIHdpdGggbm8gcmVsb2NhdGlvbnMgbmVlZGVkLgorCitXZWQgRmViICA5IDEzOjA4OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYXMuaCAoeG1hbGxvYywgeHJlYWxsb2MpOiBEZWNsYXJlIHVzaW5nIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCisJKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogVXNlIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCisKKwkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBOT19TVFJJTkdfRVNDQVBFUyBpcyBkZWZpbmVkLAorCWRvbid0IHRyZWF0IGJhY2tzbGFzaCBzcGVjaWFsbHkgaW5zaWRlIHN0cmluZ3MuCisJKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaWtld2lzZS4KKworV2VkIEZlYiAgOSAwOTo0Mjo0NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBtZW1zZXQKKwlpbnN0ZWFkIG9mIG1lbWNweSB0byB6ZXJvIHRoZSBpbml0aWFsIHN0YWIgc3ltYm9sLCBkdWguCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCisJKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCisKK1R1ZSBGZWIgIDggMTc6MjU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KKworCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDYWxsIG1lbXNldCB3aXRoIHRoZSBhcmd1bWVudHMgaW4KKwl0aGUgcmlnaHQgb3JkZXIuICBFeHBsaWNpdGx5IGNsZWFyIGZpeF9yb290IGFuZCBmaXhfdGFpbCBmaWVsZHMuCisKK1R1ZSBGZWIgIDggMTY6MDA6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBGb3IgYWJzX3N5bWJvbCwgc2V0ICpwdW50CisJYW5kIGRvIG5vdGhpbmcgZWxzZS4KKworCSogc3ltYm9scy5jIChzeW1ib2xfYmVnaW4pOiBJbml0aWFsaXplIHZhbHVlIG9mIGFic19zeW1ib2wKKwlwcm9wZXJseS4KKworCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBVc2UgYWJzX3N5bWJvbCBpbnN0ZWFkIG9mIGNhbGxpbmcKKwlzZWN0aW9uX3N5bWJvbC4KKworCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBGaXggIi8qIiBpbiBjb21tZW50IHRvIHNpbGVuY2UKKwljb21wbGFpbnQgZnJvbSAiZ2NjIC1XYWxsIi4KKworCSogY29uZmlndXJlLmluIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldCwgbGlrZSBhbHBoYS0qLW9zZiouCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChHUF9BREpVU1RNRU5UKTogTW92ZSBkZWZpbml0aW9uIHRvIHN0YXJ0IG9mCisJZmlsZS4KKwkodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgYGNvZGUnLCBhbmQgY29kZQorCXRoYXQgdHJpZWQgdG8gdXNlIGl0IChpbmNvcnJlY3RseSkuICBGb3IgTElURVJBTCByZWxvYywgc2V0IGFkZGVuZAorCXRvIG5lZ2F0aXZlIG9mIEdQIHZhbHVlLgorCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogRG9uJ3QgYWRqdXN0IHJldHVybiB2YWx1ZSBieSBHUF9BREpVU1RNRU5ULgorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBQcmludCBzb21lIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgaWYKKwliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHJldHVybnMgYmZkX3JlbG9jX292ZXJmbG93LgorCitNb24gRmViICA3IDE1OjQ5OjI0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWd1cmUuaW4gKGhwcGEqLSplbGYqKTogTmV3IGNvbmZpZ3VyYXRpb24gZm9yIFBBIEVMRi4KKwkoaHBwYSotKi1vc2YqKTogRGVmYXVsdCBvYmplY3QgZm9ybWF0IGlzIFNPTS4KKworTW9uIEZlYiAgNyAxNjowNzozNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYXRvZik6IFdhcm4gdGhhdCBmbG9hdGluZy1wb2ludCB2YWx1ZXMKKwltaWdodCBub3QgYXNzZW1ibGUgcHJvcGVybHkuCisKKwkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGFscGhhLSotb3NmKik6IERvbid0IHNldCAiZGV2PXllcyIgYW55CisJbW9yZS4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IFBhcmVudGhlc2l6ZSBvcGVyYXRpb25zIGluCisJcmFuZ2UgY2hlY2tpbmcsIHRvIGF2b2lkIHByZWNlZGVuY2UgcXVlc3Rpb25zLgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAoYWRkcjMyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGl0IGZvciAiLTMyYWRkciIuCisJKGxvYWRfc3ltYm9sX2FkZHJlc3MpOiBJZiBhZGRyMzIgaXMgc2V0LCB1c2UgbGRsIGluc3RlYWQgb2YgbGRxLgorCisJKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQ2FsY3VsYXRlIG1heGltdW1fdXNlZnVsX2RpZ2l0cworCWFuZCBtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMsIHRvCisJZWxpbWluYXRlIHRoZSBvbmx5IHNvdXJjZXMgb2YgZGVwZW5kZW5jZSBvbiBmbG9hdGluZyBwb2ludAorCXN1cHBvcnQsIHdoaWNoIGRvZXNuJ3Qgd29yayB5ZXQgb24gdGhlIEFscGhhLgorCitNb24gRmViICA3IDAzOjU2OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpIFtUQ19BTFBIQV06IFNwZWNpZnkgdmVyc2lvbiBzdGFtcCBhcworCTB4MzBiIGZvciBBbHBoYSBmb3Igbm93LCB1bnRpbCAiLnZlcnN0YW1wIiBpcyBoYW5kbGVkLgorCisJKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBVc2Ugc2VnaW5mby0+ZnJjaGFpblAsIHdoaWNoCisJYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBsaXRlcmFsIHBvb2wgc2VjdGlvbiwgcmF0aGVyIHRoYW4KKwlmcmNoYWluX25vdywgd2hpY2ggcmVmZXJzIHRvIHdoYXRldmVyIHNlY3Rpb24gdGhlIGFzc2VtYmxlciB3YXMKKwlpbi4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IE9ubHkgZG8gcmFuZ2UgY2hlY2tpbmcgaWYgc2l6ZSBvZiBmaXh1cAorCWlzIHNtYWxsZXIgdGhhbiB3b3JkIHNpemUuICBPdGhlcndpc2UsIHdlIGFsd2F5cyB3aW5kIHVwIHdpdGgKKwl6ZXJvcy4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBDaGFuZ2Ugc2Vjb25kIGFyZ3VtZW50IGFuZAorCXJldHVybiB0eXBlIHRvIHZhbHVlVCwgdG8gYWdyZWUgd2l0aCB0Yy5oLgorCShhbHBoYV9kb19hbGlnbik6IExvY2FsIHN0YXRpYyBhcnJheSBub3BfcGF0dGVybiBpcyBub3cgdW5zaWduZWQKKwljaGFyLCB0byBhdm9pZCBvdmVyZmxvdyB3YXJuaW5ncy4KKwkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF9zZWN0aW9uX2FsaWduKTogRGVsZXRlIGRlY2xhcmF0aW9uLgorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zyb2JfZmlsZSk6IEVuc3VyZSB0aGF0IGVjb2ZmX2RhdGEgZm9yCisJb3V0cHV0IGJmZCBpcyBub24tbnVsbCBiZWZvcmUgaW5kaXJlY3RpbmcgdGhyb3VnaCBpdC4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2Zyb2JfZWNvZmZfZGF0YSk6IFJlbmFtZWQgZnJvbQorCWFscGhhX2Zyb2JfZmlsZS4KKwkqIGNvbmZpZy90Yy1hbHBoYS5oICh0Y19mcm9iX2ZpbGUpOiBNYWNybyBkZWxldGVkLgorCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpIFtUQ19BTFBIQV06IENhbGwKKwlhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEsIHRoZW4gZmlsbCBpbiBvcHRpb25hbC1oZWFkZXIgaW5mbyB3aXRoIGdwCisJdmFsdWUgYW5kIHJlZ2lzdGVyIG1hc2tzLgorCitTdW4gRmViICA2IDE2OjEzOjQ3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWd1cmUuaW4gKGhpdXgpOiBGaXhlcyBmcm9tIG0ta2FzYWhyQHNyYW1oYy5zcmEuY28uSlAuCisKKwkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBTYW1lIGNoYW5nZQorCWFzIGNvZmZiZmQgYW5kIGVsZiBiZWxvdy4gIFplcm8gdGhlIGluaXRpYWwgc3RhYiBzeW1ib2wgYWZ0ZXIKKwlhbGxvY2F0aW5nIGl0LgorCitTYXQgRmViICA1IDEyOjMwOjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogWmVybyB0aGUKKwlpbml0aWFsIHN0YWIgc3ltYm9sIGFmdGVyIGFsbG9jYXRpbmcgaXQuCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogRGl0dG8uCisKK1NhdCBGZWIgIDUgMTE6NTM6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogYWRkYlt0Zl0gc2hvdWxkIG9ubHkgYWNjZXB0CisJbm9uLW5lZ2F0ZWQgY29uZGl0aW9uIGNvbXBsZXRlcnMuICBBZGQgc3VwcG9ydCBmb3IgYWRkYiBwc2V1ZG8tb3AKKwl3aGljaCBhY2NlcHRzIGJvdGggbmVnYXRlZCBhbmQgbm9uLW5lZ2F0ZWQgY29tcGxldGVycy4KKworU2F0IEZlYiAgNSAwMDoxNTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwKik6IFVzZSBjcHVfdHlwZSBwcGMuCisJKHBwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgY29mZiBhbmQgZm9yY2UgYmZkX2dhcy4KKwkqIGNvbmZpZy90Yy1wcGMuaCwgY29uZmlnL3RjLXBwYy5jOiBOZXcgZmlsZXMgZm9yIFBvd2VyUEMvUE9XRVIKKwkoUlMvNjAwMCkgc3VwcG9ydC4gIEF0IHRoZSBtb21lbnQsIG9ubHkgWENPRkYgaXMgc3VwcG9ydGVkLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoU0FfU0VUX1NZTV9FTkRORFgpOiBNYWRlIG5vbi1zdGF0aWMuCisJKFNfU0VUX0RBVEFfVFlQRSk6IExpa2V3aXNlLgorCShjb2ZmX2xhc3RfZnVuY3Rpb24pOiBSZW5hbWVkIGZyb20gbG9jYWwgc3RhdGljIGxhc3RfZnVuY3Rpb25QIGluCisJY29mZl9mcm9iX3N5bWJvbCBhbmQgbWFkZSBleHRlcm5hbGx5IHZpc2libGUuCisJKGNvZmZfZnJvYl9zeW1ib2wpOiBOZXcgbG9jYWwgc3RhdGljIHNldF9lbmQ7IHVzZSBpdCB0byB0cnkgdG8KKwlhdm9pZCBjYWxsaW5nIFNBX1NFVF9TWU1fRU5ETkRYIG9uIGEgc3ltYm9sIHRoYXQgd2lsbCBiZSBwdW50ZWQuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoU19TRVRfREFUQV9UWVBFKTogRGVjbGFyZS4KKwkoU0FfU0VUX1NZTV9FTkRORFgpOiBEZWNsYXJlLgorCShjb2ZmX2xhc3RfZnVuY3Rpb24pOiBEZWNsYXJlLgorCisJKiBleHByLmMgKG9wZXJhbmQpOiBJZiBET0xMQVJfRE9UIGlzIGRlZmluZWQsIGFjY2VwdCBgJCcgYXMKKwllcXVpdmFsZW50IHRvIGAuJyB0byBtZWFuIHRoZSBjdXJyZW50IGxvY2F0aW9uLgorCisJKiByZWFkLmMgKExFWF9CUik6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KKwkobGV4X3R5cGUpOiBVc2UgTEVYX0JSIGFzIHRoZSB0eXBlIG9mIGB7JyxgfScsYFsnLGBdJy4KKworCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogSWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlzCisJZGVmaW5lZCwgY2FsbCBpdCB3aXRoIHByZXNlcnZlZF9jb3B5X29mX25hbWUuICBJZgorCXRjX3N5bWJvbF9uZXdfaG9vayBpcyBkZWZpbmVkLCBjYWxsIGl0IG9uIHRoZSBuZXcgc3ltYm9sLgorCShzeW1ib2xfZmluZF9iYXNlKTogSWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlzIGRlZmluZWQsCisJY2FsbCBpdCBvbiBhIGNvcHkgb2YgdGhlIG5hbWUgYXJndW1lbnQuCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2ltcGxpZmllZCB1c2FnZSBvZiBvYmpfZnJvYl9zeW1ib2wKKwlhbmQgdGNfZnJvYl9zeW1ib2wuICBBbHdheXMgY2FsbCBib3RoIGlmIHRoZSBzeW1ib2wgaXMgZ29pbmcgdG8gYmUKKwlvdXRwdXQuCisKKwkqIHdyaXRlLmMgKHJlbGF4X3NlZ21lbnQpOiBVc2UgJWxkIHJhdGhlciB0aGFuICVkIHdoZW4gcHJpbnRpbmcKKwlmcmFnUC0+ZnJfdmFyLCBhbmQgY2FzdCBpdCB0byBsb25nLgorCisJQ2hhbmdlZCByZWxvY3MgdG8gYmUgYmFzZWQgb24gc3Vic2VnbWVudHMgKHdoZW4gQkZEX0FTU0VNQkxFUikuCisJKiBzdWJzZWdzLmggKHN0cnVjdCBmcmNoYWluKTogSWYgQkZEX0FTU0VNQkxFUiwgYWRkZWQgbmV3IGZpZWxkcworCWZpeF9yb290IGFuZCBmaXhfdGFpbC4KKwkoc2VnbWVudF9pbmZvX3R5cGUpOiBJZiBCRkRfQVNTRU1CTEVSLCBkb24ndCBkZWZpbmUgZml4X3RhaWwKKwlmaWVsZC4KKwkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJZiBCRkRfQVNTRU1CTEVSLCBzZXQgZml4X3Jvb3RQIGFuZAorCWZpeF90YWlsUCBiYXNlZCBvbiBmcmNoYWluX25vdywgbm90IHNlZ19pbmZvIChub3dfc2VnKS4KKwkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IENoYWluIHRoZSBzdWJzZWdtZW50IHJlbG9jcyB0b2dldGhlci4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IERvbid0IGNsZWFyIGZpeF90YWlsIGZpZWxkLgorCShzdWJzZWdfZ2V0KTogTGlrZXdpc2UuCisJKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB2aWEKKwlmcmNoYWluX25vdywgbm90IHNlZ2luZm8uCisKK1RodSBGZWIgIDMgMjM6MDc6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVjb2ZmLmggKFRBUkdFVF9TWU1CT0xfRklFTERTKTogQ2hhbmdlZAorCWVjb2ZmX3VuZGVmaW5lZCB0byBlY29mZl9leHRlcm5fc2l6ZS4KKwkqIGNvbmZpZy9vYmotZWxmLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLW1pcHMuYyAoc19leHRlcm4pOiBTZXQgZWNvZmZfZXh0ZXJuX3NpemUgdG8gdGhlCisJZXh0ZXJuYWwgc3ltYm9sIHNpemUsIHJhdGhlcm4gdGhhbiBzZXR0aW5nIHRoZSBzeW1ib2wgdmFsdWUuCisJKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ2hlY2sgYm90aCBlY29mZl9leHRlcm5fc2l6ZSBhbmQKKwlzeW1ib2wgdmFsdWUgdG8gc2VlIGlmIEdQIHJlZmVyZW5jaW5nIGNhbiBiZSB1c2VkLgorCSogZWNvZmYuYyAoZWNvZmZfc3ltYm9sX25ld19ob29rKTogQ2xlYXIgZWNvZmZfZXh0ZXJuX3NpemUsIG5vdAorCWVjb2ZmX3VuZGVmaW5lZC4KKwkoZWNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBjaGVjayBlY29mZl91bmRlZmluZWQuCisJKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBHZXQgc2l6ZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sIGZyb20KKwlzeW0tPmVjb2ZmX2V4dGVybl9zaXplLCBub3QgU19HRVRfVkFMVUUgKHN5bSkuCisKK1dlZCBGZWIgIDIgMTM6NTU6MDggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIE1ha2VmaWxlLmluOiAgQXZvaWQgYnVnIGluIGxvc2luZyBocHV4IHNlZC4KKworV2VkIEZlYiAgMiAxMTo0MDoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGZpbGVfbWlwc19pc2EpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtZF9iZWdpbik6IFNldCBpdC4KKwkoc19taXBzc2V0KTogQWRkIHN1cHBvcnQgZm9yIC5zZXQgbWlwTiB0byBzZXQgdGhlIElTQSBsZXZlbC4KKworCSogZ2FzcC5jIChraW5mbyk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCisKK1R1ZSBGZWIgIDEgMTk6Mjg6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogZ2FzcC5jIChtYWxsb2MpOiBEb24ndCBkZWNsYXJlLCBzaW5jZSBob3N0Lmggb3Igc3lzdGVtIGhlYWRlcgorCWZpbGVzIG1heSBkZWNsYXJlIGl0IGRpZmZlcmVudGx5LgorCisJKiBjb25maWcvYXRvZi1pZWVlLmMgKGludF90b19nZW4pOiBOb3cgc3RhdGljLgorCisJKiBjb25maWcvaG8taTM4NmFpeC5oOiBJbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzdGRsaWIuaCwgbm90CisJaG8tc3lzdi5oLiAgQmFzZWQgbG9vc2VseSBvbiBhIHBhdGNoIGZyb20gTWluaCBUcmFuLUxlLgorCitUdWUgRmViICAxIDEwOjUwOjE3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGdhc3AuYzogSW5jbHVkZSBob3N0LmguCisKK1R1ZSBGZWIgIDEgMTI6MTM6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTWFrZSBhbiB1bnN1cHBvcnRlZCBpbnN0cnVjdGlvbiBhCisJd2FybmluZywgbm90IGFuIGVycm9yLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsCisJZG90X2Jzc19zeW1ib2wpOiBEb24ndCBkZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KKwkob2JqX3N5bWJvbF90b19jaGFycyk6IGJmZF9jb2ZmX3N3YXBfYXV4X291dCBub3cgdGFrZXMgbW9yZQorCWFyZ3VtZW50cy4KKwkoY29mZl9saW5lX2Jhc2UpOiBSZW5hbWVkIGZyb20gbGluZV9iYXNlLiAgQ2hhbmdlZCBhbGwgdXNlcy4KKwkoY29mZl9hZGRfbGluZXN5bSk6IFJlbmFtZWQgZnJvbSBhZGRfbGluZV9zeW0uICBNYWRlIG5vbi1zdGF0aWMuCisJQ2hhbmdlZCBhbGwgdXNlcy4KKwkqIGNvbmZpZy9vYmotY29mZi5oOiBJZiBUQ19QUEMsIGluY2x1ZGUgY29mZi9yczYwMDAuaC4KKwkoU19TRVRfU1RPUkFHRV9DTEFTUywgU19HRVRfU1RPUkFHRV9DTEFTUyk6IERlY2xhcmUgaWYKKwlCRkRfQVNTRU1CTEVSLgorCShjb2ZmX2xpbmVfYmFzZSk6IERlY2xhcmUuCisJKGNvZmZfYWRkX2xpbmVzeW0pOiBEZWNsYXJlIGlmIEJGRF9BU1NFTUJMRVIuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc3ltYm9sX3RvX2NoYXJzKTogYmZkX2NvZmZfc3dhcF9hdXhfb3V0CisJbm93IHRha2VzIG1vcmUgYXJndW1lbnRzLgorCitNb24gSmFuIDMxIDE3OjU1OjE0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogYXMuYyAoc3RhdGlzdGljc19mbGFnKTogUmVuYW1lZCBmcm9tIHF1aWV0X2ZsYWcuCisJKG1haW4pOiBHZXQgc3RhdGlzdGljcyB3aXRoIC0tc3RhdGlzdGljcyBpbnN0ZWFkIG9mIC1ub3F1aWV0LgorCitNb24gSmFuIDMxIDA3OjE5OjMwIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBTdXBwb3J0IGZvciBHbnUgQVNzZW1ibGVyIFByZXByb2Nlc3Nvci4KKwkqIGdhc3AuYzogTmV3IGZpbGUuCisJKiByZWFkLmMgKHNfbGNvbW0pOiBBbGlnbiBsY29tbSBkYXRhLgorCSogY29uZmlnL3RjLXo4ay5jICh0Y19yZWxvY19tYW5nbGUpOiBEb24ndCBhbGxvdyBzdWJ0cmFjdGlvbgorCWZyb20gZGlmZmVyZW50IHNlY3Rpb25zLgorCitTdW4gSmFuIDMwIDE0OjU4OjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgdGNfZnJvYl9maWxlIGlzIGRlZmluZWQsIGNhbGwgaXQKKwlqdXN0IGJlZm9yZSBjYWxsaW5nIG9ial9mcm9iX2ZpbGUuCisJKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZ3BfdmFsdWUpOiBSZW5hbWVkIGZyb20gZ3BfdmFsdWUKKwkocmVmZXJlbmNlcyBjaGFuZ2VkKSwgYW5kIG1hZGUgbm9uLXN0YXRpYy4KKwkoZ2V0RXhwcmVzc2lvbik6IFJldHVybiB2b2lkLgorCShzZWxlY3RfZ3BfdmFsdWUpOiBBYm9ydCBpZiBncF92YWx1ZSBpcyBub24temVyby4gIERlbGV0ZSBjYWxsIHRvCisJbm9uLWV4aXN0ZW50IGJmZF9zZXRfZ3BfdmFsdWUuCisJKGFscGhhX3ZhbGlkYXRlX2ZpeCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCisJKGFscGhhX2Zyb2Jfc3ltYm9sKTogRnVuY3Rpb24gZGVsZXRlZC4KKwkoYWxwaGFfbG9jYWxfbGFiZWwpOiBGdW5jdGlvbiBkZWxldGVkLgorCShhbHBoYV9mcm9iX2ZpbGUpOiBSZW5hbWVkIGZyb20gYWxwaGFfZW5kLgorCSogY29uZmlnL3RjLWFscGhhLmggKGFscGhhX2Zyb2Jfc3ltYm9sLCBhbHBoYV92YWxpZGF0ZV9maXgsCisJYWxwaGFfbG9jYWxfbGFiZWwsIGFscGhhX2VuZCk6IERlY2xhcmF0aW9ucyBkZWxldGVkLgorCShhbHBoYV9ncF92YWx1ZSwgYWxwaGFfZnJvYl9maWxlKTogRGVjbGFyZS4KKwkodGNfZnJvYl9zeW1ib2wsIFRDX1ZBTElEQVRFX0ZJWCwgbWRfZW5kKTogTWFjcm9zIGRlbGV0ZWQuCisJKExPQ0FMX0xBQkVMKTogTW92ZSBjb2RlIGhlcmUgZnJvbSB0Yy1hbHBoYS5jOmFscGhhX2xvY2FsX2xhYmVsLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBTaW1wbGlmaWVkIHNsaWdodGx5LgorCSh0Y19mcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCisKKwkqIHJlYWQuYyAoZG9fYWxpZ24pOiBOZXcgZnVuY3Rpb24sIG1vc3Qgb2YgZ3V0cyBvZiBzX2FsaWduXyoKKwlmdW5jdGlvbnMuICBMb29rIGZvciBtZF9kb19hbGlnbiBtYWNybywgZ2l2ZSBpdCBhIGNoYW5jZSB0byBieXBhc3MKKwlhbGwgYnV0IHJlY29yZGluZyBvZiBzZWN0aW9uIGFsaWdubWVudC4KKwkoc19hbGlnbl9ieXRlcywgc19hbGlnbl9wdHdvKTogQ2FsbCBkb19hbGlnbi4KKwkoc19sY29tbSkgW1RDX0FMUEhBXTogQWxpZ24gb2JqZWN0IHRvIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQKKwlkaXZpZGVzIG9iamVjdCBzaXplLgorCisJKiBmcmFncy5jIChmcmFnX2FsaWduX3BhdHRlcm4pOiBOZXcgZnVuY3Rpb24uCisJKGZyYWdfYWxpZ24pOiBSZXdyaXRlIGZvciBjbGFyaXR5LgorCisJKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIE9fY29uc3RhbnQgZXhwcmVzc2lvbi4KKwkodmlwX2JlZ2luKTogUmV0dXJucyBwb2ludGVyIHRvIGNvbnN0IGNoYXIuICBDYXN0IGhhc2hfaW5zZXJ0IGFyZworCXRvIFBUUiB0byBhdm9pZCBjb21waWxlciBjb21wbGFpbnRzIGFib3V0IGNvbnN0LgorCShtZF9iZWdpbik6IExvY2FsIHZhcmlhYmxlIGVycnR4dCBtdXN0IHBvaW50IHRvIGNvbnN0LgorCisJKiBjb25maWd1cmUuaW46IEhhbmRsZSBob3N0IHZheC0qLXVsdHJpeCogbGlrZSB2YXgtKi1ic2QqLiAgRG9uJ3QKKwlib3RoZXIgd2l0aCAqLSotdWx0cml4IG9yICotKi1zeXN2KiwgZXhjZXB0ICotKi1zeXN2LCBzaW5jZSBvbmx5CisJdGhlIGxhc3QgaGFzIGFuIGV4aXN0aW5nIGhvc3Qgc3VwcG9ydCBmaWxlLiAgRG8gaGFuZGxlIHZheC1ic2QgYW5kCisJdmF4LXVsdHJpeCB0YXJnZXRzLgorCitGcmkgSmFuIDI4IDExOjI2OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb25faGVhZGVyX2FwcGVuZCk6IERvIG5vdAorCWRlY2xhcmUgaWYgQkZEX0FTU0VNQkxFUi4KKwkoc3RhY2tfcG9wKTogQ29ycmVjdCB0ZXN0IGZvciBzdGFjayB1bmRlcmZsb3cuCisJKG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsCisJb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsIG9ial9jb2ZmX3ZhbCk6IERlY2xhcmUKKwl0eXBlIG9mIGlnbm9yZWQgYXJndW1lbnQgdG8gYXZvaWQgZ2NjIHdhcm5pbmcuCisJKGFsaWduKTogUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb24uCisKK1RodSBKYW4gMjcgMTg6MTQ6MTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWFscGhhLmMsIGNvbmZpZy90Yy1hbHBoYS5oLCBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IE5ldworCWZpbGVzLCBiYXNlZCBvbiBwb3J0IG9mIGdhcy0xLjM4IGNvbnRyaWJ1dGVkIGJ5IENNVSwgdXNpbmcgYS5vdXQKKwl2YXJpYW50LiAgVXBkYXRlZCBmb3IgZ2FzLTIueCBhbmQgRUNPRkYuICBGbG9hdGluZy1wb2ludCBjb25zdGFudHMKKwlhcmUgc3RpbGwgYnJva2VuLCBib290c3RyYXAgdGVzdGluZyBpbmNvbXBsZXRlLgorCisJKiBsaXRlcmFsLmM6IENvbW1lbnQgY2hhbmdlcy4KKworCSogbGlzdGluZy5jIChsaXN0aW5nX3NvdXJjZV9maWxlKTogQ2hlY2sgZm9yIG51bGwgbGlzdGluZ190YWlsCisJYmVmb3JlIGluZGlyZWN0aW5nIHRocm91Z2ggaXQuCisKKwkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogQWRkZWQgc3RydWN0IHRhZy4KKworCSogYXMuaDogSWYgX19HTlVDX18gYW5kIGlubGluZSBhcmUgYm90aCB1bmRlZmluZWQsIGRlZmluZSBpbmxpbmUKKwlhd2F5LgorCisJKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogRG9uJ3QgYXNzdW1lIHRoYXQgZnJfdmFyIGZvcgorCXJzX2FsaWduIG9yIHJzX29yZyBmcmFncyB3aWxsIGJlIDEuCisJKHJlbGF4X3NlZ21lbnQpOiBGb3IgcnNfYWxpZ24sIGlmIGZyX3ZhciBpcyBub3QgMSwgY29tcGxhaW4gaWYKKwlyZXF1aXJlZCBwYWRkaW5nIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBwYWQgcGF0dGVybi4KKwkoZml4dXBfc2VnbWVudCk6IExlYXZlIGdwLXJlbGF0aXZlIHJlbG9jYXRpb25zIGFsb25lLiAgRm9yIHBjcmVsCisJcmVsb2NhdGlvbnMgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHNlZ21lbnQsIGNsZWFyIGZ4X3BjcmVsIHdoZW4KKwljbGVhcmluZyBmeF9hZGRzeS4KKwkqIGFzLmg6IEFkanVzdCBjb21tZW50cyBvbiByc19hbGlnbi4KKworCSogYXRvZi1nZW5lcmljLmM6IFNvbWUgcmVmb3JtYXR0aW5nLgorCShhdG9mX2dlbmVyaWMpOiBCZSBjYXJlZnVsIHdoZW4gbWl4aW5nIHNpZ25lZC91bnNpZ25lZCB2YWx1ZXMgb2YKKwlkaWZmZXJlbnQgc2l6ZXMuCisKKwkqIHdyaXRlLmMsIGNvbmZpZy9vYmote2FvdXQsYm91dCxjb2ZmKn0uYywgY29uZmlnL3RjLXNwYXJjLmM6CisJUXVlcnkgdGhlIGZ4X2RvbmUgZmllbGQgaW5zdGVhZCBvZiBmeF9hZGRzeSB0byBzZWUgaWYgdGhlIGZpeHVwCisJc3RpbGwgbmVlZHMgdG8gYmUgYXBwbGllZC4gIFNldCBmeF9kb25lIGFuZCBjbGVhciBmeF9hZGRzeSBib3RoLAorCWZvciBub3cuICBJZiBUQ19IQU5ETEVTX0ZYX0RPTkUgaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIG1kX2FwcGx5X2ZpeAorCXdpbGwgb25seSBjbGVhciBmeF9hZGRzeSwgYW5kIHNldCBmeF9kb25lIGFjY29yZGluZ2x5IGFmdGVyCisJcmV0dXJuaW5nLgorCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX0hBTkRMRVNfRlhfRE9ORSk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBTZXQgZnhfZG9uZSBmb3Igbm9uLXBjcmVsIGZpeAorCXdpdGggbm8gZnhfYWRkc3kuCisKKwkqIHN5bWJvbHMuYyAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsIGRvdF9ic3Nfc3ltYm9sKToKKwlEZWxldGVkLgorCShzeW1ib2xfYmVnaW4pOiBNb3ZlZCB0byBlbmQgb2YgZmlsZSwgc28gZnVuY3Rpb24gaW5saW5pbmcgY2FuCisJd29yayBiZXR0ZXIuCisJKGZiX2xhYmVsX2NvdW50LCBmYl9sYWJlbF9tYXgpOiBEZWZhdWx0IEMgc3RhdGljIGluaXRpYWxpemVycyBhcmUKKwlzdWZmaWNpZW50LgorCSogc3ltYm9scy5oIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwgZG90X2Jzc19zeW1ib2wpOgorCURlY2xhcmF0aW9ucyBkZWxldGVkLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLAorCWRvdF9ic3Nfc3ltYm9sKTogRGVmaW5lZCBoZXJlLCBzdGF0aWMuCisKKwkqIGNvbmZpZy9vYmotYW91dC5jIFtCRkRfQVNTRU1CTEVSXTogVW5kZWYgTk9fUkVMT0MgYmVmb3JlCisJaW5jbHVkaW5nIGFvdXQvYW91dDY0LmguCisKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgZmFsc2UsCisJZG9uJ3Qgd3JpdGUgb3V0IGEgc2VjdGlvbiBzeW1ib2wgZXZlbiBpZiBpdCdzIHVzZWQgaW4gYQorCXJlbG9jYXRpb247IGFzc3VtZSByZWxvY2F0aW9ucyB3aWxsIGhhbmRsZSBzZWN0aW9uIG51bWJlcnMKKwlzb21laG93LiAgUmVuYW1lICJwdW50X2l0IiBsYWJlbCB0byAicHVudF9pdF9pZl91bnVzZWQiIHRvIHJlZmxlY3QKKwlpdCdzIHRydWUgdXNlLgorCShFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERlZmF1bHQgdG8gMS4KKwkoYWRqdXN0X3JlbG9jX3N5bXMpOiBEb24ndCBjcmVhdGUgYSBuZXcgc3ltYm9sIGZvciBhbiBhYnNvbHV0ZQorCXJlZmVyZW5jZTsganVzdCB1c2UgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sLgorCSh3cml0ZV9yZWxvY3MpOiBNYWtlIHByaW50b3V0IG9mIHJlbG9jIHZhbHVlcyBkZXBlbmRlbnQgb24gZmxhZworCURFQlVHMywgbm90IERFQlVHMi4KKwkqIGNvbmZpZy9vYmotYW91dC5oIChFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERlZmluZSBhcyAwLgorCSogY29uZmlnL29iai1lY29mZi5oIChFTUlUX1NFQ1RJT05fU1lNQk9MUyk6IERpdHRvLgorCitUaHUgSmFuIDI3IDE2OjQzOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChsZXhfdHlwZSk6IE5vIGxvbmdlciBtYWtlICd7JyBhIHZhbGlkIGNoYXJhY3RlciBmb3IKKwlzeW1ib2wgbmFtZXMuCisKKwkqIGFzLmMgKG1haW4pOiBQcmludCBsb25nIHZhbHVlcyB1c2luZyAlbGQuCisKKwkqIG1lc3NhZ2VzLmMgKGFzX3dhcm5faW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShhc193YXJuLCAzIHZlcnNpb25zKTogVXNlIGFzX3dhcm5faW50ZXJuYWwuCisJKGFzX3dhcm5fd2hlcmUsIDMgdmVyc2lvbnMpOiBOZXcgZnVuY3Rpb24uCisJKiBhcy5oIChhc193YXJuX3doZXJlKTogRGVjbGFyZS4KKworVHVlIEphbiAyNSAxODozMDozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGFzLmMgKHF1aWV0X2ZsYWcpOiBOZXcgZmxhZy4KKwkobWFpbik6IElmIC1ub3F1aWV0IGdpdmVuLCBkaXNwbGF5IGV4ZWN1dGlvbiB0aW1lIGFuZCBtZW1vcnkgdXNlZC4KKworVHVlIEphbiAyNSAxNTo1MzoxMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZG9jL3thbGwudGV4aSxhcy50ZXhpbmZvfTogQWRkIGRvY3VtZW50YXRpb24gZm9yIEhQUEEgcG9ydC4KKworTW9uIEphbiAyNCAxOToxODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLiAgUHV0IHVuZGVmaW5lZAorCXN5bWJvbHMgb2Yga25vd24gc2l6ZSBpbiB0aGUgdW5kZWZpbmVkIHNlY3Rpb24uICBQdXQgc21hbGwgY29tbW9uCisJc3ltYm9scyBpbiBhIC5zY29tbW9uIHNlY3Rpb24uCisJKiBlY29mZi5oIChlY29mZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCisJKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZS4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfd3JpdGVfc3ltYm9sX3AsIG9ial9lbGZfd3JpdGVfc3ltYm9sLAorCW9ial9lbGZfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHVudXNlZCBmdW5jdGlvbnMuCisJKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvYl9zeW1ib2wsIG9ial93cml0ZV9zeW1ib2wpOiBSZW1vdmVkCisJdW51c2VkIG1hY3Jvcy4KKwkob2JqX2VsZl9mcm9iX3N5bWJvbCwgb2JqX2VsZl93cml0ZV9zeW1ib2wpOiBSZW1vdmVkIGRlY2xhcmF0aW9ucworCW9mIHVudXNlZCBmdW5jdGlvbnMuCisJKG9ial9mcm9iX3N5bWJvbCk6IERlZmluZSBpZiBFQ09GRl9ERUJVR0dJTkcuCisKKwkqIHRjLW1pcHMuYyAoZ19zd2l0Y2hfc2Vlbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1kX3BhcnNlX29wdGlvbik6IFNldCBnX3N3aXRjaF9zZWVuIGZvciAtRyBvcHRpb24uCisJKHNfb3B0aW9uKTogSWYgY3JlYXRpbmcgUElDIGNvZGUsIGZvcmNlIHRoZSBHUCBzaXplIHRvIGJlIDAuICBXYXJuCisJaWYgLUcgc3dpdGNoIHVzZWQgd2l0aCBhIG5vbi16ZXJvIHZhbHVlLgorCisJKiBzeW1ib2xzLmMgKFNfSVNfQ09NTU9OKTogVXNlIGJmZF9pc19jb21fc2VjdGlvbiByYXRoZXIgdGhhbgorCWNvbXBhcmluZyBhZ2FpbnN0IGJmZF9jb21fc2VjdGlvbi4KKworTW9uIEphbiAyNCAxNDoxMjoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiByZWFkLmMgKHNfbGNvbW0pOiBUcmVhdCBBbHBoYSBsaWtlIE1JUFMgaW4gaGFuZGxpbmcgb2YgLnNic3MKKwlzZWN0aW9uLgorCitUaHUgSmFuIDIwIDEzOjE3OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGV4cHIuYyAob3BlcmFuZCk6IEZvciBmbG9hdGluZyBwb2ludCBvcGVyYW5kIHdpdGggdW51c3VhbCBmcAorCWNoYXIgZnJvbSBGTFRfQ0hBUlMsIHByZXNlcnZlIHRoZSBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIExpc2EKKwlSZXBrYS4KKworV2VkIEphbiAxOSAyMzoxNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBhbGwgZGF0YSBhbGxvY2F0aW9uCisJcHNldWRvLW9wczogLmh3b3JkLCAuaW50LCAubG9uZywgLm9jdGEsIC5xdWFkLCAuc2hvcnQsIC5zaW5nbGUuCisKK1R1ZSBKYW4gMTggMTU6NTE6NTkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmKTogRm9yIENfRUZDTiwgQ19CTE9DSyBhbmQKKwlDX0ZDTiBhc3N1bWUgLnZhbCBoYXMgYmVlbiBzZXQgdG8gLgorCitUdWUgSmFuIDE4IDE2OjE5OjU4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jOiBEaXNhYmxlIG11bHRpcGxlICRDT0RFJCBzdWJzcGFjZSBjb2RlLiAgSXQKKwljb25mdXNlcyBHREIgZm9yIHNvbWUgdW5rbm93biByZWFzb24uCisJKiBjb2ZuaWcvb2JqLXNvbS5jOiBMaWtld2lzZS4KKworVHVlIEphbiAxOCAxOTowNTozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsaXRlcmFsLmMgKGFkZF90b19saXRlcmFsX3Bvb2wpOiBIYW5kbGUgZHVwbGljYXRlcyBvZiB2YWx1ZXMKKwlhbHJlYWR5IHdyaXR0ZW4gdG8gbGl0ZXJhbCBwb29sLgorCitUdWUgSmFuIDE4IDE3OjIzOjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogVHJ5IHRvIGdldCBzeW1ib2xzCisJd2l0aCBleHBsaWNpdGx5IG1hcmtlZCBzdGFicyB0aHJvdWdoIEJGRDogaWYgYSBzeW1ib2wgbWFya2VkCisJTl9VTkRGIHwgTl9FWFQgaXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIG1vdmUgaXQgdG8gdGhlCisJdW5kZWZpbmVkIHNlY3Rpb247IG1vdmUgYSBzeW1ib2wgbWFya2VkIE5fSU5EUiBpbnRvCisJYmZkX2luZF9zZWN0aW9uIGFuZCBzZXQgdGhlIEJTRl9JTkRJUkVDVCBmbGFnOyBzZXQgdGhlCisJQlNGX1dBUk5JTkcgZmxhZyBmb3IgYSBzeW1ib2wgbWFrcmVkIE5fV0FSTklORy4KKworTW9uIEphbiAxNyAxNTo0MDoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmggKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IERlY2xhcmUuCisJKiBlY29mZi5jIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBSZXR1cm4gdHlwZSBpcyB2b2lkLgorCitNb24gSmFuIDE3IDAwOjE4OjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEV4cGxpY2l0bHkgY2hlY2sgZm9yIGNvbW1hIGJlZm9yZSAndScKKwlhbmQgJ2YnIHRlbXBsYXRlIG9wZXJhbmQuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogSGFuZGxlICdOJywgJ08nLCAnbycsICcwJywgJzEnLCAndScsCisJYW5kICcyJyBpbiBjb3ByIGFuZCBzZnUgaW5zdHJ1Y3Rpb24gdGVtcGxhdGVzLgorCitTdW4gSmFuIDE2IDE2OjQ0OjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBhcy5oIChzdWJzZWdfZm9yY2VfbmV3KTogQWRkIHByb3RvdHlwZS4KKworU2F0IEphbiAxNSAwOToyMDo1NSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWxsb3cgbGluZXMgbGlrZSAiIGZvb2xhYiA6Ii4KKworCSogcmVhZC5jIChlbWl0X2V4cHIpOiBGaXggY29tcHV0YXRpb24gb2YgbWFzay4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEZpeCBsb29wIHRlcm1pbmF0aW9uIHRlc3QuCisKK1RodSBKYW4gMTMgMTY6MTU6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogTmV3IGZ1bmN0aW9uLgorCShjdXJyZW50X2ZpbGVfaWR4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoYWRkX2ZpbGUpOiBVc2UgYW5kIGluY3JlbWVudCBjdXJyZW50X2ZpbGVfaWR4IGluc3RlYWQgb2YgaW5keAorCXBhcmFtZXRlci4KKworCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBNYWtlIGFsbCBiaXRmaWVsZHMgdW5zaWduZWQuCisKKwkqIGNvbmZpZy90Yy1pOTYwLmMgKGk5NjBfdmFsaWRhdGVfZml4KTogQWRkZWQgYXJndW1lbnQKKwlhZGRfc3ltYm9sUFAuICBJbmRpcmVjdCB0aHJvdWdoIGl0IHRvIGdldCAiYWRkX3N5bWJvbFAiLgorCSogY29uZmlnL3RjLWk5NjAuaCAoaTk2MF92YWxpZGF0ZV9maXgpOiBTdXBwbHkgcHJvdG90eXBlLgorCShUQ19WQUxJREFURV9GSVgpOiBQYXNzIGFkZHJlc3Mgb2YgYWRkX3N5bWJvbFAuCisKKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LCB1c2luZyB0ZS1uZXRic2QuaC4KKwkoaTM4Ni0qLW5ldGJzZDAuOCk6IE5ldyB0YXJnZXQsIGxpa2UgMzg2YnNkLgorCisJKiBjb25maWd1cmUuaW46IFNldCBCRkRERUYgaW4gTWFrZWZpbGUgdG8gImRlZmluZSIgb3IgInVuZGVmIi4KKwkqIE1ha2VmaWxlLmluIChjb25maWcuaCk6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgorCURlZmluZSBvciB1bmRlZiBCRkRfQVNTRU1CTEVSIGFzIHNwZWNpZmllZCBieSAkKEJGRERFRikuCisJKEFMTF9DRkxBR1MpOiBPbWl0ICQoQkZEREVGKS4KKwkqIGFzLmg6IEluY2x1ZGUgY29uZmlnLmguCisJKHN0cnVjdCBzeW1ib2wpOiBBZGRlZCBmb3J3YXJkIGRlY2xhcmF0aW9uLgorCShhZGRfdG9fbGl0ZXJhbF9wb29sKTogRml4IGRlY2xhcmF0aW9uLgorCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4KKworCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogVGFrZSBzeW1ib2wgYW5kIGFkZGVuZCBhcworCWFyZ3VtZW50cywgaW5zdGVhZCBvZiBleHByZXNzaW9uLCBmb3Igbm93LiAgRml4IGNhbGN1bGF0aW9uIG9mCisJb2Zmc2V0IHRvIHJldHVybi4KKworCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW05FRURfTElURVJBTF9QT09MXTogQWRkIGZpZWxkCisJbGl0ZXJhbF9wb29sX3NpemUuCisKK1RodSBKYW4gMTMgMTI6MTQ6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUKKworCSogc3Vic2Vncy5jIChzdWJzZWdfZ2V0KTogQWNjZXB0IG5ldyBhcmd1bWVudCAiZm9yY2VfbmV3Ii4gIElmCisJc2V0IHRoZW4gYSBuZXcgc2VnbWVudCBpcyBhbHdheXMgY3JlYXRlZC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKHN1YnNlZ19mb3JjZV9uZXcpOiBOZXcgZnVuY3Rpb24uICBTaW1pbGFyIHRvIHN1YnNlZ19uZXcsIGJ1dAorCWFsd2F5cyBmb3JjZSBhIG5ldyBzZWdtZW50IHRvIGJlIGNyZWF0ZWQuCisKKwkqIGNvbmZpZy9vYmotc29tLmMgKHNvbV9mcm9iX2ZpbGUpOiBDYWxsIGFkanVzdF9jb2RlX3NlY3Rpb25zCisJZm9yIGVhY2ggc2VjdGlvbi4KKwkoYWRqdXN0X2NvZGVfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBBZGp1c3RzIHRoZSBWTUEgZm9yIGFsbCB0aGUKKwkkQ09ERSQgc3Vic3BhY2VzLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9hc3NlbWJsZSk6IEFsc28gaGFuZGxlIGNyZWF0aW5nIGEgZml4dXAKKwlmb3IgdGhlIHVud2luZCBkZXNjcmlwdG9ycyBpZiBhIGZ1bmN0aW9uJ3MgbGFiZWwgZm9sbG93cyB0aGUKKwkuUFJPQyBhbmQgLkVOVFJZIGRpcmVjdGl2ZXMuCisJKHBhX2VudHJ5KTogRG9uJ3Qgc2V0IEJTRl9GVU5DVElPTiBmb3IgdGhlIGxhYmVsIHN5bWJvbCBoZXJlOyBpdAorCWlzIGRvbmUgZWxzZXdoZXJlLiAgRG9uJ3QgY3JlYXRlIGEgZml4dXAgZm9yIHRoZSB1bndpbmQKKwlkZXNjcmlwdG9ycyBpZiB0aGUgZnVuY3Rpb24ncyBsYWJlbCBoYXMgbm90IGJlZW4gZGVmaW5lZCB5ZXQuCisJKHBhX3Byb2MpOiBGb3IgU09NLCBwbGFjZSBlYWNoIHByb2NlZHVyZSB3aXRoaW4gYSBuZXcgJENPREUkCisJc3Vic3BhY2UuICBBZGp1c3QgdGhlIHNlZ21lbnQgYW5kIGZyYWcgZm9yIHRoZSBhc3NvY2lhdGVkCisJZnVuY3Rpb24gbGFiZWwgaWYgaXQgZXhpc3RzLgorCitXZWQgSmFuIDEyIDIyOjA1OjMzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBBZGQgbmV3ICJzZWdtZW50IiBmaWVsZC4KKwkoaHBwYV9maXhfbmV3KTogSW5pdGlhbGl6ZSBzZWdtZW50IGZpZWxkLgorCShtZF9hcHBseV9maXgpOiBEbyBub3RoaW5nIGZvciBwYy1yZWxhdGl2ZSBmaXh1cCB3aGljaCBpbnZvbHZlcworCWNyb3NzaW5nIGEgc2VnbWVudCBib3VuZGFyeS4KKwkocGFfcHJvY2VuZCk6IFVuZGVmaW5lIHRoZSBjdXJyZW50IGxhYmVsIGFmdGVyIGhhbmRsaW5nIC5QUk9DCisJYW5kIC5QUk9DRU5EIGRpcmVjdGl2ZXMuCisJKGR1bW15X3N5bWJvbCk6IE1ha2UgdHlwZSAic3ltYm9sUyAqIi4gIENoYW5nZSByZWZlcmVuY2VzIGFzCisJYXBwcm9wcmlhdGUuCisKK1dlZCBKYW4gMTIgMTM6Mjk6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhc3QgYXJyYXkgYXJndW1lbnQgdG8gdW5zaWduZWQKKwljaGFyLgorCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHN5bXNlZ2luZm8uCisJKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIHB1bnRfaXQgaWYgaXQgd29uJ3QgYmUgdXNlZC4KKwkoZml4dXBfc2VnbWVudCk6IERvbid0IGRlZmluZSBza2lwIGlmIGl0IHdvbid0IGJlIHVzZWQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgYXMgbWlwc190YXJnZXRfZm9ybWF0LgorCShtaXBzX3RhcmdldF9mb3JtYXQpOiBEZWNsYXJlLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190YXJnZXRfZm9ybWF0KTogRGVmaW5lIHdpdGggYXBwcm9wcmlhdGUKKwlkZWZhdWx0IGRlZmluaXRpb24uCisJKG1kX3BhcnNlX29wdGlvbik6IElmIC1FTCBvciAtRUIgaXMgdXNlZCwgY2hhbmdlIGJ5dGVfb3JkZXIgYW5kCisJbWlwc190YXJnZXRfZm9ybWF0IGFzIGFwcHJvcHJpYXRlLgorCitUdWUgSmFuIDExIDIxOjUyOjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQW5vdGhlciBhdHRlbXB0IHRvIGZpeCBidWdzCisJZGVhbGluZyB3aXRoIGxhYmVscyB3aXRob3V0IGNvbG9ucyAoZm9yIEhQUEEgYW5kIE1SSSkuCisKK1R1ZSBKYW4gMTEgMTc6MDE6MDYgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogVHJ1bmNhdGUgYXJncyB0byAlaGkvJWxvIHRvIDMyIGJpdHMuCisKKwkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCk6IEZpeCBjb21wdXRhdGlvbiBvZiB0b29fbWFueV9kaWdpdHMuCisJVmFyaWFibGUgZGlnaXRfMiByZW5hbWVkIHRvIHN0YXJ0LiAgRml4IGNoZWNrIGZvciB3aGV0aGVyIG51bWJlcgorCXdpbGwgZml0IGluIDMyIGJpdHMuCisJKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSB2YWx1ZVQgaW5zdGVhZCBvZiBsb25nLgorCitUdWUgSmFuIDExIDEzOjAxOjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuYzogSWYgVENfTUlQUywgaW5jbHVkZSBlbGYvbWlwcy5oLgorCShzcGVjaWFsX3NlY3Rpb25zKTogRGVmaW5lLgorCShvYmpfZWxmX3NwZWNpYWxfc2VjdGlvbik6IEdldCBkZWZhdWx0IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIGZyb20KKwlsaXN0IG9mIHNwZWNpYWwgc2VjdGlvbnMuCisJKiBjb25maWcvdGMtbWlwcy5jIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IERlZmluZS4KKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBGb3JjZSAuc2RhdGEgYW5kIC5zYnNzCisJc2VjdGlvbnMgdG8gYmUgY2xvc2UgdG9nZXRoZXIuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQ29ycmVjdGVkICRhdCB3YXJuaW5ncyBpbiBhIGNvdXBsZSBvZgorCXNwb3RzLgorCisJKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHJldl9saW5lKTogTmV3IGZ1bmN0aW9uLgorCSogbGlzdGluZy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KKwkobGlzdGluZ19wcmV2X2xpbmUpOiBOZXcgZnVuY3Rpb24uCisJKGNhbGNfaGV4KTogUmVzZXQgYnl0ZV9pbl9mcmFnIHRvIHplcm8gZm9yIGVhY2ggbmV3IGZyYWcuCisJKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IENhbGwgbGlzdGluZ19wcmV2X2xpbmUgYWZ0ZXIKKwllbWl0dGluZyBub3AgaW5zdHJ1Y3Rpb25zLgorCSogTWFrZWZpbGUuaW4gKGxpc3Rpbmcubyk6IERlcGVuZHMgdXBvbiBzdWJzZWdzLmguCisKK01vbiBKYW4gMTAgMDk6NTI6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogUHV0IGNoZWNrIGZvciBtaXNzaW5nIGxhYmVsIG9uIC5QUk9DCisJaGVyZS4gIEhhbmRsZSBjYXNlIHdoZXJlIGxhYmVsIG1heSBiZSBkZWZpbmVkIGFmdGVyIHRoZSAuUFJPQy4KKwkocGFfcHJvYyk6IEl0IGlzIG5vdCBhbiBlcnJvciBpZiB0aGUgcHJvY2VkdXJlJ3MgbGFiZWwgaXNuJ3QKKwlkZWZpbmVkIGJlZm9yZSB0aGUgLlBST0MgZGlyZWN0aXZlLgorCitTdW4gSmFuICA5IDA0OjQzOjMwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGUtbmV0YnNkLmg6IE5ldyBmaWxlLgorCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX05ldEJTRF06IFVzZSBiZmQgdGFyZ2V0CisJYS5vdXQtbmV0YnNkLTM4NiBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgorCitGcmkgSmFuICA3IDE3OjM4OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IERvbid0IGNsb2JiZXIgdGhlIEVDT0ZGIHN5bWJvbCBpbmZvcm1hdGlvbgorCXdpdGggdGhlIGFzc29jaWF0ZWQgc3RhYnMgaW5mb3JtYXRpb24uCisJKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBOZXZlciBzZXQgdGhlIHR5cGUgb2Ygc3RhYnMgc3ltYm9scyB0bworCXN0X0dsb2JhbC4gIERvbid0IHVwZGF0ZSB0aGUgc3ltYm9sIGluZGV4IG9yIGlmZCBpZiB0aGUgZ2FzIHN5bWJvbAorCWlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgRUNPRkYgc3ltYm9sICh3aGljaCBpcyBub3cgdGhlIGNhc2UgZm9yCisJc3RhYnMgc3ltYm9scykuCisKK0ZyaSBKYW4gIDcgMTE6MTQ6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEFkZCBhIExPU0lOR19DT01QSUxFUiBpZmRlZiB0aGF0CisJc3BsaXRzIHRoZSBmdW5jdGlvbi4KKwkobWFjcm8yKTogTmV3IGZ1bmN0aW9uLCBpZiBMT1NJTkdfQ09NUElMRVIgZGVmaW5lZC4KKworRnJpIEphbiAgNyAwOTozODoyNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogIERvbid0IGV2ZXIgZmlsbCBwYXN0IHRoZQorCWVuZCBvZiBhIHNlY3Rpb24uICh3cml0ZV9vYmplY3RfZmlsZSk6IFRlbXBvcmFyeSBmaXggLSBzZXR1cAorCXN0ZG91dHB1dC4KKworVGh1IEphbiAgNiAxODowNToyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogRml4IGhhbmRsaW5nIG9mIGFkZGVuZHMgaW4KKwlub24tcGNyZWxfb2Zmc2V0IHJlbG9jYXRpb25zLgorCitUaHUgSmFuICA2IDAxOjA2OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFdhcm4gYWJvdXQgdXNpbmcgJDEgYXMgd2VsbCBhcyAkYXQKKwl3aXRob3V0IC5zZXQgbm9hdC4KKworV2VkIEphbiAgNSAxNDoyMjoyMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsaXRlcmFsLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IExpc3QgaXQuCisKKwkqIGFzLmggKERFQlVHKTogRG9uJ3QgZGVmaW5lLgorCShzdHJ1Y3QgZXhwcmVzc2lvblMsIHN0cnVjdCBmaXgpOiBEZWNsYXJlIGluIGNhc2UgdGhleSdyZSB1c2VkIGluCisJcHJvdG90eXBlcy4KKwkoYWRkX3RvX2xpdGVyYWxfcG9vbCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgorCisJKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0FPVVRdOiBGaXggZm9yIG5ldyBuYW1lcworCWluIGJmZC4KKworCSogc3Vic2Vncy5jIChzdWJzZWdfZ2V0KTogTmV3IGZ1bmN0aW9uLiAgQ3JlYXRlcyBzZWdtZW50IGlmCisJbmVlZGVkLCByZXR1cm5zIHBvaW50ZXIsIGJ1dCBkb2Vzbid0IGNoYW5nZSBjdXJyZW50IHNlZ21lbnQuCisJKHN1YnNlZ19uZXcpOiBVc2UgaXQuCisKK1R1ZSBKYW4gIDQgMTU6MTI6NDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBBZGQgJChzcmNkaXIpLy4uIHRvIHBsYWNlcyB0byBzZWFyY2guCisJKiBjb25maWcvb2JqLWVjb2ZmLmM6IEluY2x1ZGUgZmlsZXMgYXMgImJmZC8iIGluc3RlYWQgb2YgIi4uL2JmZC8iLgorCSogYXBwLmMsIGZsb251bS5oLCBoZXgtdmFsdWUuYyAoY29uc3QpOiBDaGFuZ2UgI2lmIHRvIGJlIG1vcmUKKwlwb3J0YWJsZS4KKworVHVlIEphbiAgNCAyMjoxMTozNCAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9oby12c3RhLmgsIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFZTVGEKKwltaWNyby1rZXJuZWwuCisKK1RodSBEZWMgMzAgMTU6Mjc6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIG5vdyB0YWtlcyBhbgorCWFkZGl0aW9uYWwgYXJndW1lbnQsIHRvIHJldHVybiBhbiBlcnJvciBzdHJpbmcgKHdoaWNoIHdlIGlnbm9yZSkuCisKK1dlZCBEZWMgMjkgMTQ6Mzc6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEZpZWxkIHRjX2ZpeF9kYXRhIHNob3VsZCBiZSB0eXBlIFBUUiwgbm90CisJdm9pZCosIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLiAgQWRkZWQKKwlzaW5nbGUtYml0IGZpZWxkICJmeF9kb25lIi4KKworU3VuIERlYyAyNiAxNDozMTo0NyAxOTkzICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAYWRkZXIuY3lnbnVzLmNvbSkKKworCSogdGMtaHBwYS5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBDb252ZXJ0IHRvIGxvd2VyIGNhc2UuCisJRGVsZXRlIHNwdXJpb3VzIHJlZ2lzdGVyIG5hbWVzICIlcjRMIiwgZXRjLgorCShzZWxlY3Rvcl90YWJsZSk6IFNvcnQgYW5kIGNvbnZlcnQgdG8gbG93ZXIgY2FzZS4KKwkoY29uc19maXhfbmV3X2hwcGEpOiBgcmVsb2NfdHlwZScgPT4gYHJlbF90eXBlJy4KKwkocGFfaXApOiBBbHdheXMgdXNlIHN0cmNtcCBmb3Igbm9uLXRleHQgYW5kIHN0cmNhc2VjbXAgZm9yIHRleHQuCisJKHJlZ19uYW1lX3NlYXJjaCk6IFJld3JpdGUgdG8gY2FsbCBzdHJjYXNlY21wIG9ubHkgb25jZSBwZXIKKwlpdGVyYXRpb24uCisJKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IFJld3JpdGUgdG8gdXNlIGJpbmFyeSBzZWFyY2guCisJKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogVXNlIHN0cmNhc2VjbXAgZm9yIGNvbXBsZXRlciBjb21wYXJpc29ucy4KKwkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6ICRURVhUJCBhbmQgJFBSSVZBVEUkIGFyZSBzeW1ib2xzOyB1c2UgY2FzZQorCXNlbnNpdGl2ZSBjb21wYXJpc29ucy4KKwkocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IENhbm9uaWNhbGl6ZSBzdHJuY2FzZWNtcCBhcmcgdG8gbG93ZXIgY2FzZS4KKwkocGFfc3BhY2UpOiAiJHRleHQkIiA9PiAiJFRFWFQkIjsgIiRwcml2YXRlJCIgPT4gIiRQUklWQVRFJCIuICBVc2UKKwljYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uIGZvciBhbGwgc3ltYm9saWMgbmFtZXMuCisJKHBhX3N1YnNwYWNlKTogQ2Fub25pY2FsaXplIHN0cm5jYXNlY21wIGFyZyB0byBsb3dlciBjYXNlLgorCShwYV9zdWJzcGFjZV9zdGFydCk6IFVzZSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uIGZvciBzeW1ib2xpYyBuYW1lcy4KKworTW9uIERlYyAyMCAxMDozNzo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcykgW1JFTE9DX1JFUVVJUkVTX1NZTUJPTF06IElmIG5vCisJc3ltYm9sIGlzIHByZXNlbnQgKGkuZS4sIHJlbG9jYXRpb24gYWdhaW5zdCBhYnNvbHV0ZSksIGNyZWF0ZSBhCisJcGhvbnkgbG9jYWwgc3ltYm9sLCBhbmQgdXNlIGl0IGluIHRoZSByZWxvYy4KKwkoZml4dXBfc2VnbWVudCk6IFdoZW4gYWRqdXN0aW5nIGEgcmVsb2Mgd2l0aCBhbiBhYnNvbHV0ZSBzeW1ib2wsCisJaGF2ZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGNvbnRyb2wgY2xlYXJpbmcgYWRkX3N5bWJvbFAgdG9vLgorCSogY29uZmlnL3RjLXNwYXJjLmggKFJFTE9DX1JFUVVJUkVTX1NZTUJPTCk6IERlZmluZSwgZm9yIE9CSl9DT0ZGLgorCisJKiBzeW1ib2xzLmMgKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBEb24ndCB1c2UgYm90aCBCU0ZfRVhQT1JUCisJYW5kIEJTRl9HTE9CQUwsIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCisKKwkqIGFzLmMgKG1haW4pOiBPbmx5IGludm9rZSBtZF9lbmQgaWYgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8uCisJKiB0Yy5oIChtZF9lbmQpOiBEb24ndCBkZWNsYXJlIGl0LgorCSogY29uZmlnL3RjLSouW2NoXSAobWRfZW5kKTogRGVsZXRlZCwgaW4gY2FzZXMgd2hlcmUgaXQgZG9lc24ndCBkbworCWFueXRoaW5nLgorCSogY29uZmlnL3RjLXZheC5jICh2aXBfZW5kKTogRGVsZXRlZCBudWxsIGZ1bmN0aW9uLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWRfbWlwc19lbmQpOiBSZW5hbWVkIGZyb20gbWRfZW5kLgorCSogY29uZmlnL3RjLW1pcHMuaCAobWRfbWlwc19lbmQpOiBEZWNsYXJlLgorCShtZF9lbmQpOiBOZXcgbWFjcm8sIGNhbGxzIG1kX21pcHNfZW5kLgorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGNsb3NlIG91dHB1dCBmaWxlLgorCSogYXMuYyAobWFpbik6IENsb3NlIG91dHB1dCBmaWxlIChpZiBuZWVkZWQpIGFmdGVyIGNhbGxpbmcKKwlsaXN0aW5nX3ByaW50LCB3aGljaCBzaG91bGQgYmUgYWZ0ZXIgY2FsbGluZyB3cml0ZV9vYmplY3RfZmlsZSwKKwl3aGljaCBzZXRzIHRoZSBmcmFnIGFkZHJlc3Nlcy4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RpbSwgb2JqX2NvZmZfZW5kZWYsIG9ial9jb2ZmX2xpbmUsCisJb2JqX2NvZmZfc2NsLCBvYmpfY29mZl9zaXplLCBvYmpfY29mZl90YWcsIG9ial9jb2ZmX3R5cGUsCisJb2JqX2NvZmZfdmFsKTogQWRkIHVudXNlZCBpbnQgYXJndW1lbnQgdG8gc2F0aXNmeSBwcm90b3R5cGVzOyBnb2VzCisJd2l0aCBJYW4ncyAxMCBTZXAgY2hhbmdlcy4KKwkoU19HRVRfREFUQV9UWVBFLCBTX1NFVF9EQVRBX1RZUEUsIFNfR0VUX1NUT1JBR0VfQ0xBU1MsCisJU19TRVRfU1RPUkFHRV9DTEFTUyk6IE5vdyBmdW5jdGlvbiBpbnN0ZWFkIG9mIG1hY3Jvcy4KKwkob2JqX2VtaXRfbGluZW5vKSBbQkZEX0FTU0VNQkxFUl06IERlbGV0ZWQuCisJKHRhZ19pbnNlcnQpOiBMb2NhbCB2YXIgRVJST1JfU1RSSU5HIGlzIGNvbnN0LiAgVXNlICJjb25zdCIgbm90CisJIkNPTlNUIiBmb3IgYXJndW1lbnQgTkFNRS4gIEZpeGVkIHByb3RvdHlwZS4KKwkoY29mZl9mcm9iX3N5bWJvbCk6IFJlbW92ZWQgZXhwbGljaXQgIiNpZiAxIiBkaXJlY3RpdmUuICBJZgorCVNfSVNfRVhURVJOQUwsIHNldCBzdG9yYWdlIGNsYXNzIHRvIENfRVhULgorCShzX2dldF9uYW1lKTogVXNlICJjb25zdCIgbm90ICJDT05TVCIuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoU19HRVRfREFUQV9UWVBFLCBTX1NFVF9EQVRBX1RZUEUsCisJU19HRVRfU1RPUkFHRV9DTEFTUywgU19TRVRfU1RPUkFHRV9DTEFTUyk6IERlbGV0ZWQuCisJKG9ial9lbWl0X2xpbmVubyk6IERlY2xhcmUgb25seSBmb3Igbm9uLUJGRF9BU1NFTUJMRVIuICBGb3IKKwlCRkRfQVNTRU1CTEVSLCBkZWZpbmUgYXMgbWFjcm8gdGhhdCBhYm9ydHMuCisJKG9ial9leHRyYV9zdHVmZiwgdGNfaGVhZGVyc19ob29rKTogRGVjbGFyZSBvbmx5IGZvcgorCW5vbi1CRkRfQVNTRU1CTEVSLgorCShjb2ZmX2Zyb2Jfc3ltYm9sKTogRml4IHByb3RvdHlwZS4KKworU3VuIERlYyAxOSAwMDozNzoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBUZXN0IG9mIHBjcmVsX29mZnNldCBoYWQgc2Vuc2UKKwlyZXZlcnNlZC4KKworVGh1IERlYyAxNiAyMToxMzoxMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYmVnaW4pOiBJbml0aWFsaXplICJkdW1teV9sYWJlbCIuCisJKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBGb3IgcmVsb2NhdGlvbnMgd2hpY2ggaGF2ZSBubyBzeW1ib2wsCisJc2V0IHN5bV9wdHJfcHRyIHRvIGR1bW15X2xhYmVsLiAgQXZvaWRzIGxvc3NhZ2UgaW4gZ2VuZXJpYyBCRkQgY29kZS4KKworVGh1IERlYyAxNiAxNjowNzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiByZWFkLmMgKGxleF90eXBlKTogTm8gbG9uZ2VyIG1ha2UgJ1snIGEgdmFsaWQgY2hhcmFjdGVyIGZvcgorCXN5bWJvbCBuYW1lcy4KKworCSogY29uZmlnL3RjLXZheC5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IExvY2FsIHZhcmlhYmxlCisJTkJZVEVTX1JfTEVOR1RIIG5vdyBjb25zdC4KKworCSogY29uZmlnL29iai0qLmMsIGNvbmZpZy90Yy0qLmM6IE9taXQgc3VwZXJmbHVvdXMgInJldHVybiIKKwlzdGF0ZW1lbnRzIGF0IGVuZHMgb2YgZnVuY3Rpb25zLiAgRG9uJ3QgY2hlY2sgZm9yIG51bGwgcmV0dXJuIGZyb20KKwloYXNoX25ldywgc2luY2UgaXQgd29uJ3QgcmV0dXJuIGF0IGFsbCBpZiB0aGVyZSdzIG5vIG1lbW9yeQorCWF2YWlsYWJsZS4gIEFsc28sIGNoZWNrIGZvciBudWxsIHJldHVybiBmcm9tIGhhc2hfaW5zZXJ0LCByYXRoZXIKKwl0aGFuIHplcm8tbGVuZ3RoIHN0cmluZywgYXMgc3VjY2VzcyBpbmRpY2F0b3IuCisKKwkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCisJKiBzdWJzZWdzLmggKHNlY3Rpb25fc3ltYm9sKTogRGVjbGFyZS4KKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGl0LgorCitXZWQgRGVjIDE1IDE1OjM5OjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogTmV3IHZhcmlhYmxlLgorCShDSEVDS0ZMQUdTKTogUGFzcyBpdCBkb3duLgorCisJKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZnJhbWUpOiBQZXJtaXQgZXh0cmEgdHJhaWxpbmcgb3BlcmFuZHM7CisJdW51c2VkIGZvciBub3csIGJ1dCBzdXBwbGllZCBieSBBbHBoYSBPU0YxIGNvbXBpbGVyLgorCisJKiBhcy5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KKwkoaW50X3RvX2dlbik6IERvbid0IGRlY2xhcmUuCisKKwkqIGNvbmZpZy9hdG9mLXZheC5jIChhdG9mX3ZheCk6IE5VTEwgaXMgbm90IGEgdmFsaWQgY2hhcmFjdGVyCisJY29uc3RhbnQuCisKK1R1ZSBEZWMgMTQgMjE6Mzg6MjUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1vc2YqKTogRG8gbm90IGNvbnNpZGVyIHRoaXMgYSBkZXZlbG9wbWVudGFsCisJY29uZmlndXJhdGlvbi4KKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIGNhc2VzIHdoZXJlIG5vCisJcmVsb2NhdGlvbiB3aWxsIGJlIGVtaXR0ZWQgZm9yIDMyYml0IGZvcm1hdHMuCisKK01vbiBEZWMgMTMgMjM6MzM6NDAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvIG5vdCBjYWxsIGhwcGFfZmllbGRfYWRqdXN0CisJZm9yIGFueSBvZiB0aGUgJ1QnIGZpZWxkIHNlbGVjdG9ycy4KKworU2F0IERlYyAxMSAxMToyMzoxMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWg4NTAwLmMgKGJ1aWxkX2J5dGVzKTogR2V0IHJlbG9jIHR5cGUgcmlnaHQgZm9yIGEKKwklcGFnZSBvcGVyYXRpb24uIChtZF9hc3NlbWJsZSk6IERvbid0IG1vZGlmeSBpbnB1dF9saW5lX3BvaW50ZXIuCisJKG1kY29mZl9zaXplbWFjaGRlcCk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy90Yy1oODUwMC5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogTmV3IG1hY3JvLgorCSogY29uZmlnL3RjLXo4ay5jIChnZXRfb3BlcmFuZCk6IERlbGV0ZSBib2d1cyBjaGVjay4KKworV2VkIERlYyAgOCAxNjozMTo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKG51bWJlcl90b19jaGFyc18qKTogRGVsZXRlIGJvZ3VzIHJhbmdlIGNoZWNrLgorCisJKiBvdXRwdXQtZmlsZS5jIChUQVJHRVRfQVJDSCk6IE5vIGRlZmF1bHQuCisKK1R1ZSBEZWMgIDcgMTY6MDI6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFRydW5jYXRlIGRpc3BzIGJlZm9yZSBjYWxsaW5nCisJbWRfbnVtYmVyX3RvX2NoYXJzLiAgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgbW9kaWZ5CisJaW5wdXRfbGluZV9wb2ludGVyLgorCitNb24gRGVjICA2IDExOjQ5OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9hc3NlbWJsZSk6IERvbid0IHVwZGF0ZSBpbnB1dF9saW5lX3BvaW50ZXIuCisKK01vbiBEZWMgIDYgMTE6MjA6MDIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy9vYmotc29tLltjaF0gKG9ial9yZWFkX2JlZ2luX2hvb2spOiBSZW1vdmUgbGFzdCBjaGFuZ2UuCisJQnJlYWtzIHdpdGggdGhlIEhQIGNvbXBpbGVycy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGNhbGxfaW5mbyk6IFJlbW92ZSBmaWVsZHMgd2hpY2ggd2VyZQorCXNldCBidXQgbmV2ZXIgdXNlZC4gIFJlbW92ZSBhbGwgY29kZSB3aGljaCBzZXRzIHRob3NlIGZpZWxkcy4KKwkoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBMaWtld2lzZS4KKwkoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBMaWtld2lzZS4KKwkocGFfZGVzYyk6IERlbGV0ZSB1c2VsZXNzIGZ1bmN0aW9uLiAgRGVsZXRlIGFsbCByZWZlcmVuY2VzLgorCShocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBObyBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3IKKwl0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgorCitTdW4gRGVjICA1IDE3OjA1OjI5IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24pOiBQYXNzIHZlcnNpb24gc3RyaW5nIHRvCisJU09NIEJGRCBiYWNrZW5kLgorCShvYmpfc29tX2NvcHlyaWdodCk6IE5ldyBmdW5jdGlvbi4gIE11Y2ggbGlrZSBvYmpfc29tX3ZlcnNpb24uCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG9ial9jb3B5cmlnaHQpOiBEZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yCisJU09NIGFuZCBFTEYuCisJKHBhX2NvcHlyaWdodCk6IEp1c3QgYSBzdHViIG5vdy4KKworCSogY29uZmlnL29iai1zb20uYyAob2JqX3JlYWRfYmVnaW5faG9vayk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCisJKiBjb25maWcvb2JqLXNvbS5oIChvYmpfcmVhZF9iZWdpbl9ob29rKTogUHJvdmlkZSBkdW1teSBkZWZpbml0aW9uLgorCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERlbGV0ZS4gIFNPTSBpc24ndCBtYWtpbmcgdXNlIG9mIHRoZW0uCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgcmVsb2NhdGlvbgorCWV4cGFuc2lvbiBkdWUgdG8gcm91bmRpbmcgbW9kZSBzZWxlY3RvcnMuICBIYW5kbGUgUl9bUkRTTl1fTU9ERQorCXJlbG9jYXRpb25zIGZvciBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4KKworCSogY29uZmlnL3RjLWhwcGEuYyAoZXZhbHVhdGVfYWJzb2x1dGUpOiBTdXBwb3J0IGVfcnJzZWwgYW5kCisJZV9ybHNlbCBmaWVsZCBzZWxlY3RvcnMuCisKK0ZyaSBEZWMgIDMgMTg6MzM6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVsZi5oOiBJZiBFQ09GRl9ERUJVR0dJTkcsIHVuZGVmCisJU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBhbmQgSU5JVF9TVEFCX1NFQ1RJT04sIGFuZCBkZWZpbmUKKwlPQkpfUFJPQ0VTU19TVEFCIHRvIGNhbGwgZWNvZmZfc3RhYi4KKwkqIGNvbmZpZy9vYmotZWxmLmM6IERvbid0IGNvbXBpbGUgb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiBpZgorCUlOSVRfU1RBQl9TRUNUSU9OIGlzIG5vdCBkZWZpbmVkLgorCitGcmkgRGVjICAzIDEwOjU2OjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEZWxldGUgb2xkIHdyYXBwZXIgZnVuY3Rpb24uCisJKG1kX2FwcGx5X2ZpeF8xKTogUmVuYW1lIHRvIG1kX2FwcGx5X2ZpeC4gIEZpeCBhcmd1bWVudCBkZWNscy4KKwlGaXggY29tbWVudHMgaW4gdmFyaW91cyBwbGFjZXMuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCisJQXZvaWQgZGVyZWZlcmVuY2luZyBhIE5VTEwgZnhfYWRkc3kuCisJKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ4X2FkZHN5LgorCisJRnJpIERlYyAgMyAwOTo0NzozMCAxOTkzICBQZXRlIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCisKKwkqIHRjLWhwcGEuYzogKHRjX2dlbl9yZWxvYyk6IEFkZGVuZCBmb3IgYSBwbGFiZWwgcmVsb2NhdGlvbiBzaG91bGQKKwliZSBlaXRoZXIgMCBvciAyIChubyBzdGF0aWMgbGluayBvciBzdGF0aWMgbGluayByZXF1aXJlZCkuICBBbHdheXMKKwlhc3N1bWUgbm8gc3RhdGljIGxpbmsuCisKK1RodSBEZWMgIDIgMTE6NTI6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBNYWtlIGFkanVzdG1lbnQgdG8gYWRkZW5kIGJlCisJZGVwZW5kZW50IG9uIGhvd3RvIGZpZWxkcywgbm90IG9uIGZvcm1hdCBmbGF2b3VyLgorCisJKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IE5ldyBmaWVsZHMgc3lfb2JqIGFuZCBzeV90YywKKwlkZWZpbmVkIGFzIHR5cGVzIE9CSl9TWU1GSUVMRF9UWVBFIGFuZCBUQ19TWU1GSUVMRF9UWVBFLCBpZiB0aG9zZQorCW1hY3JvcyBhcmUgZGVmaW5lZC4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChUQ19TWU1GSUVMRF9UWVBFLCBPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZS4KKwkoVEFSR0VUX1NZTUJPTF9GSUVMRFMsIEk5NjBfU1lNX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KKwkoc3lfdGMsIHN5X29iaik6IERlZmluZSBzbyB0aGF0IHRoZSBmaWVsZHMgbG9vayBsaWtlIHRoZXkgdXNlZCB0bywKKwl1bnRpbCBhbGwgcmVmZXJlbmNlcyBnZXQgY2hhbmdlZC4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IExvdHMgb2YgdmFyaWFibGVzIG5vIGxvbmdlciByZWdpc3Rlci4KKwlSZW9yZGVyZWQgc29tZSBjb2RlIGZvciBlYXNpZXIgcmVhZGluZy4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kaW0pOiBkaW1faW5kZXggbm8gbG9uZ2VyIHJlZ2lzdGVyLgorCURlbGV0ZWQgc3VwZXJmbHVvdXMgcmV0dXJuIHN0YXRlbWVudC4KKwkob2JqX2NvZmZfbGluZSwgb2JqX2NvZmZfc2l6ZSwgb2JqX2NvZmZfc2NsLCBvYmpfY29mZl90eXBlLAorCW9ial9jb2ZmX3ZhbCwgdGFnX2luaXQsIHRhZ19pbnNlcnQpOiBEZWxldGVkIHN1cGVyZmx1b3VzIHJldHVybgorCXN0YXRlbWVudC4KKwkoYWxpZ24sIG9ial9jb2ZmX3NlY3Rpb24pOiBEZWxldGVkIGRlYnVnZ2luZyBwcmludGZzLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEaXNjYXJkIHNvbWUgcmVnaXN0ZXIgZGVjbHMuCisJVXNlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gbWVtY3B5IHRvIGNvcHkgdGVtcGxhdGUuCisJKG9wX2hhc2gsIHJlZ19oYXNoLCBwcmVmaXhfaGFzaCk6IERlZmF1bHQgQyBpbml0aWFsaXphdGlvbiBvZgorCXN0YXRpY3MgaXMgc3VmZmljaWVudC4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChwcmludF9pbnNuKTogQXJyYXkgUmVsb2MgaXMgbm93IGNvbnN0LCBhbmQKKwlwb2ludHMgdG8gY29uc3QuCisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogT25seSB1c2UgY29mZi1zcGFyYy1seW54IGlmCisJVEVfTFlOWDsgdXNlIGNvZmYtc3BhcmMgb3RoZXJ3aXNlLgorCVtVU0VfTkFUSVZFX0hFQURFUlNdOiBEZWxldGUgdGhpcyBjb2RlOyBpdCBpc24ndCB1c2VkLgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2FsbCBUQ19WQUxJREFURV9GSVgsIGlmIGRlZmluZWQsCisJYmVmb3JlIHByb2Nlc3NpbmcgYSBmaXh1cC4gIENhbGwgVENfQURKVVNUX1JFTE9DX0NPVU5UIGp1c3QgYmVmb3JlCisJcmV0dXJuaW5nLiAgUmVtb3ZlIHNvbWUgaTk2MC1jb2ZmLXNwZWNpZmljIGNvZGUuCisJKFRDX0FESlVTVF9SRUxPQ19DT1VOVCk6IERlZmF1bHQgdG8gZG9pbmcgbm90aGluZy4KKwkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX0FESlVTVF9SRUxPQ19DT1VOVCkgW09CSl9DT0ZGXTogRGVmaW5lLgorCShpOTYwX3ZhbGlkYXRlX2ZpeCk6IERlY2xhcmUuCisJKFRDX1ZBTElEQVRFX0ZJWCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pOTYwLmMgKGk5NjBfdmFsaWRhdGVfZml4KTogTmV3IGZ1bmN0aW9uLgorCisJKiB3cml0ZS5jIChudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKTogTmV3IGZ1bmN0aW9uLiAgV3JpdGUgb3V0CisJYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciwgZG9pbmcgc2l6ZSBhbmQgcmFuZ2UgY2hlY2tpbmcuCisJKG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBOZXcgZnVuY3Rpb24sIHNpbWlsYXIuCisJKiB3cml0ZS5oOiBEZWNsYXJlIHRoZW0uCisJKiBjb25maWcvdGMtKi5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBVc2UgdGhlbS4KKwkqIGNvbmZpZy90Yy12YXguYyAobWRfYXBwbHlfZml4KTogRGl0dG8uCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgpOiBEaXR0by4KKworCSogY29uZmlnL29iai1jb2ZmLmM6IFJlYXJyYW5nZWQgY29kZSBmb3IgaGFuZGxpbmcgbGluZSBudW1iZXIKKwlkYXRhLgorCShsaW5lX2ZzeW0pOiBSZW5hbWVkIGZyb20gZnVuY3Rpb25fbGluZW9mZiBpbiBCRkRfQVNTRU1CTEVSIGNhc2UsCisJc2luY2UgdGhlIHVzYWdlIGlzIGRpZmZlcmVudCBmcm9tIG5vbi1CRkRfQVNTRU1CTEVSIGNhc2UuCisJKGluX2Z1bmN0aW9uLCBjbGVhcl9mdW5jdGlvbiwgc2V0X2Z1bmN0aW9uKTogTmV3IG1hY3JvcywgdG8KKwljb21iaW5lIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50ZWQgaW4gZGlmZmVybmV0IHdheXMgaW4KKwlCRkRfQVNTRU1CTEVSIGFuZCBub24tLi4uIGNvZGUuICBVc2VkIGluIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHVzZWQKKwl0byBjaGVjayBmdW5jdGlvbl9saW5lb2ZmICZjLgorCShvYmpfZW1pdF9saW5lbm8pOiBTcGxpdCBpbnRvIHR3byBjb3BpZXMsIG9uZSBmb3IgQkZEX0FTU0VNQkxFUiwKKwlvbmUgZm9yIG5vdC4gIE5vbi1CRkRfQVNTRU1CTEVSIHZlcnNpb24gbm93IGhhcyB0ZW1wb3JhcnkgdmFyaWFibGUKKwl0byBjb250YWluIGNoYXIqIHBvaW50ZXIgcG9pbnRlZCB0byBieSBjaGFyKiogYXJndW1lbnQuICBBbHdheXMKKwlmb2xsb3cgQ1JPU1NfQ09NUElMRSBjb2RlOyBlYXNpZXIgdG8gcmVhZCB0aGF0IHdheS4KKwkob2JqX2NvZmZfbG4pOiBEb24ndCBjYWxsIGFkZF9saW5lbm8gb3IgY19saW5lX25ldyBpZiBhcHBsaW5lIGlzCisJc2V0LgorCShvYmpfY29mZl9lbmRlZikgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvcgorCSIuYmYiLCBpdCdzIGJlZW4gZG9uZSBlbHNld2hlcmUuCisJKGNvZmZfZnJvYl9zeW1ib2wpOiBJZiBpbG5lIG51bWJlciBkYXRhIGlzIHBlbmRpbmcsIGNhbGwKKwlhZGRfbGluZXN5bSB0byBmbHVzaCBpdC4KKwkoY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBkbyB0aGF0IGhlcmUuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9mcm9iX2ZpbGUpOiBEZWNsYXJlLgorCShvYmpfZnJvYl9maWxlKTogRGVmaW5lLCB0byBjYWxsIGl0LgorCisJKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2NyZWF0ZV9sb25nX2p1bXAsCisJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXg6IERlZmluZSB0aGVtIGFzIG1hY3JvcyBjYWxsaW5nCisJYXNfZmF0YWwuCisJKiBjb25maWcvdGMtc3BhcmMuYzogRG9uJ3QgZGVmaW5lIHRoZW0gYXMgZnVuY3Rpb25zLgorCisJKiBjb25maWd1cmUuaW46IEhhbmRsZSB0YXJnZXQgYWxwaGEtKi1vc2YqLiAgKE5vIGNwdSBmaWxlcyB5ZXQuKQorCitXZWQgRGVjICAxIDIzOjM3OjE0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBNYWtlZmlsZSAoY2xlYW4pOiBEZXBlbmQgb24gY2xlYW4taGVyZS4KKworV2VkIERlYyAgMSAxMTozNToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBjb25maWcvaG8tZ28zMi5oOiBJbmNsdWRlIGZvcGVuLWJpbi5oLgorCSogYXMuaDogSWYgRk9QRU5fV0IgaXNuJ3QgZGVmaW5lZCwgaW5jbHVkZSBmb3Blbi1zYW1lLmguCisJKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBVc2UgRk9QRU5fV0IgaW5zdGVhZCBvZiAidyIuCisJKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IFVzZSBGT1BFTl9SVCBpbnN0ZWFkIG9mICJyIi4KKwkqIGxpc3RpbmcuYyAoZmlsZV9pbmZvKTogVXNlIEZPUEVOX1JCIGluc3RlYWQgb2YgInJiIi4KKwkqIHJlYWQuYyAoc19pbmNsdWRlKTogVXNlIEZPUEVOX1JUIGluc3RlYWQgb2YgInIiLgorCisJKiBzdGFicy5jOiBJbmNsdWRlIG9ic3RhY2suaC4KKworCSogdGMuaCAobWRfY3JlYXRlX2xvbmdfanVtcCk6IERvbid0IGRlY2xhcmUgaWYgaXQncyBhbHJlYWR5CisJZGVmaW5lZCBhcyBhIG1hY3JvLgorCShtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEaXR0by4KKworCSogbWVzc2FnZXMuYyAoYXNfcGVycm9yKSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfZXJybXNnIGluc3RlYWQKKwlvZiBzdHJlcnJvci4gIENsZWFyIGJmZF9lcnJvci4KKworCSogY29uZmlnL3RlLWx5bnguaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLCBpZiBub3QgYWxyZWFkeQorCWRlZmluZWQuCisKK1dlZCBEZWMgIDEgMTA6NDE6NTYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShwYV9wcm9jZXNzX2V4aXQsIHBhX3Byb2NlbmQpOiBDYWxsIGl0IGZvciBFTEYgb2JqZWN0cy4KKworV2VkIERlYyAgMSAxMjoxMDo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogU3VidHJhY3QgOCBmcm9tIG9mZnNldCBpbiBub24gUElDIGwuZAorCWNhc2UuICBTZWUgY29tbWVudC4gIEZyb20gd2lsc29uQGN5Z251cy5jb206IGZvciBNX0xfREFCLCBzZXQKKwljb3Byb2MgYmVmb3JlIGRvaW5nIGdvdG8gbGQuCisKK1R1ZSBOb3YgMzAgMTM6NDA6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHdyaXRlLmMgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBQcm92aWRlIGEgZGVmYXVsdCBkZWZpbml0aW9uLgorCShmaXh1cF9zZWdtZW50KTogQWxsb3cgdGhlIHRhcmdldCBtYWNoaW5lIHRvIHNwZWNpZnkgdGhhdCBhCisJcmVsb2NhdGlvbiBtdXN0IGJlIGdlbmVyYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGZpeHVwLiAgUmVtb3ZlCisJI2lmbmRlZiBUQ19IUFBBIGhhY2suCisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeF8xKTogTmV2ZXIgY2hhbmdlIGZ4X2FkZHN5IHRvCisJYmUgTlVMTC4gIE9ubHkgZml4dXBfc2VnbWVudCBpcyBzdXBwb3NlZCB0byBkbyB0aGF0LgorCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCisKK1R1ZSBOb3YgMzAgMTE6MjE6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc3RhYnMubyk6IEFkZGVkIGRlcGVuZGVuY2llcy4KKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBjYWxsIGJmZF9zZXRfc3ltdGFiLgorCitTdW4gTm92IDI4IDEyOjExOjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogT3V0cHV0IGEgVEFCIGJlZm9yZSBhbnkKKwkuYXBwKiBkaXJlY3RpdmUuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IE1ha2Ugc3VyZSBhIHN1Yl9zeW1ib2wKKwlleGlzdHMgYmVmb3JlIHRyeWluZyB0byBwZWVrIGF0IGl0cyBuYW1lLgorCShwYV9zcGFjZSk6IERvIG5vdCBjYWxsIHBhX2FsaWduX3N1YnNlZy4gIFNlZSBocHBhL3Vuc29ydGVkL2FsaWduMy5zCisJZm9yIHRlc3RjYXNlLgorCShwYV9hbGlnbl9zdWJzZWcpOiBEZWxldGUgdW51c2VkL3Vud2FudGVkIGZ1bmN0aW9uLgorCitTYXQgTm92IDI3IDIyOjQ5OjA3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEZpeCB0ZXN0IGZvciB3aGVuIHRvIHN0aWNrIGEgY29sb24KKwlvbiB0aGUgZW5kIG9mIGEgbGFiZWwuICBNYWtlIGNvZGUgY29uZGl0aW9uYWwgb24gZWl0aGVyIE1SSSBvcgorCUxBQkVMU19XSVRIT1VUX0NPTE9OUy4KKworCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IElmIGEgbGluZSBiZWdpbnMgd2l0aCB3aGl0ZXNwYWNlLCBsZWF2ZQorCXRoZSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYWxvbmUuICBFYXQgYWxsIG90aGVycy4KKworCSogY29uZmlnL3RjLWhwcGEuaCAoTEFCRUxTX1dJVEhPVVRfQ09MT05TKTogRGVmaW5lLgorCitXZWQgTm92IDI0IDAxOjIyOjU0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wcm9jZW5kKTogRG8gbm90IGNhbGwgcHJvY2Vzc19leGl0LgorCShleGl0X3Byb2Nlc3NpbmdfY29tcGxldGUpOiBEZWxldGUgdW53YW50ZWQgdmFyaWFibGUgYW5kIGFsbAorCXJlZmVyZW5jZXMuCisKK1dlZCBOb3YgMjQgMDI6MzE6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5jIChlY29mZl9zZXR1cF9leHQpOiBSZW5hbWVkIGZyb20gZWNvZmZfYnVpbGRfZXh0LgorCUNoYW5nZWQgdG8gbm90IGFjdHVhbGx5IGJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24sIGFzCisJdGhhdCBpcyBub3cgZG9uZSBieSB0aGUgRUNPRkYgYmFjayBlbmQuCisJKGVjb2ZmX2J1aWxkX2RlYnVnKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKwkqIGVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4gICBvYmotZm9ybWF0LmMgZnVuY3Rpb24KKwljYWxsZWQgYnkgZWNvZmZfc2V0dXBfZXh0LgorCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBJZiBkZWJ1Z19pbmZvIGNvdW50IGlzIDAsCisJc2V0IGNvcnJlc3BvbmRpbmcgcG9pbnRlciB0byBOVUxMLiAgRG9uJ3Qgc2V0IHJhd19zaXplIGFuZAorCXJhd19zeW1lbnRzLgorCShvYmpfZWNvZmZfc2V0X3N5bV9pbmRleCk6IFJlbW92ZWQuCisJKG9ial9lY29mZl9zZXRfZXh0KTogTmV3IGZ1bmN0aW9uLgorCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfc2V0X3N5bV9pbmRleCk6IERvbid0IGRlZmluZS4KKwkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBEb24ndCBkZWNsYXJlLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwKKwllbGZfc2V0X2luZGV4KTogTmV3IGZ1bmN0aW9ucyB1c2VkIGZvciBFQ09GRl9ERUJVR0dJTkcuCisJKGVsZl9mcm9iX2ZpbGUpOiBSZXdvcmtlZCBFQ09GRiBkZWJ1ZyBnZW5lcmF0aW9uIHRvIHVzZQorCW5ldyBmdW5jdGlvbnMgaW4gYmZkL2Vjb2ZmbGluay5jLgorCitTdW4gTm92IDIxIDIzOjU0OjUyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9kZWZfc3Vic3BhY2VzKTogT25seSBjcmVhdGUgdGhlIHVud2luZAorCXN1YnNwYWNlIGZvciBFTEYuICBJbiB0aGUgU09NIHdvcmxkLCB0aGUgbGlua2VyIGlzIHJlc3BvbnNpYmxlCisJZm9yIGNyZWF0aW5nIHRoZSB1bndpbmQgc3Vic3BhY2VzLgorCitGcmkgTm92IDE5IDE2OjI1OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IFVzZSBQQVJBTVMgcmF0aGVyIHRoYW4gRVhGVU4uCisJKHlhbmtfc3ltYm9scyk6IERvbid0IGNhbGwgU19TRVRfRVhURVJOQUwgaWYgdGhlIHN0b3JhZ2UgY2xhc3MgaXMKKwlhbHJlYWR5IHNldC4gIEZpeGVzIC5kZWYgdmFyOyAudmFsIGV4dGVybmFsX3ZhcjsgLnNjbCAzOyAuZW5kZWYuCisJKGFkanVzdF9zdGFiX3NlY3Rpb24pOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgcmV0dXJuIHR5cGUuICBSZW1vdmUKKwl1bnVzZWQgdmFyaWFibGVzLgorCisJKiBjb25maWcvdGMtaTM4Ni5oOiBEZWNsYXJlIHRjX2NvZmZfZml4MnJ0eXBlIGFuZAorCXRjX2NvZmZfc2l6ZW1hY2hkZXAuCisKK0ZyaSBOb3YgMTkgMDQ6MzM6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpc2FibGUgb2JqX2NoZWNrX2ZpbGVfc3ltYm9scworCWhvb2s7IG9ubHkgYmFjayBlbmQgdXNpbmcgaXQgd2Fzbid0IHVzaW5nIGl0IGNvcnJlY3RseS4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBBbHdheXMgY2FsbCBvYmpfZnJvYl9zeW1ib2wgYW5kCisJdGNfZnJvYl9zeW1ib2w7IGFsd2F5cyByZXRhaW4gc3ltYm9sIGlmIGl0J3MgdXNlZCBieSBhIHJlbG9jYXRpb24sCisJcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXNlIHJvdXRpbmVzIGluZGljYXRlLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBSZW5hbWVkIGZyb20KKwljb2ZmX2NoZWNrX2ZpbGVfc3ltYm9scy4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY2hlY2tfZmlsZV9zeW1ib2xzKTogRGVsZXRlZC4KKwkoY29mZl9mcm9iX3N5bWJvbCk6IERlY2xhcmUuCisJKG9ial9mcm9iX3N5bWJvbCk6IENhbGwgaXQuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluLCBvYmpfZW1pdF9zdHJpbmdzLAorCW9ial9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KKwkoY19zZWN0aW9uX2hlYWRlcik6IERpdHRvLiAgRGVsZXRlIHN1cGVyZmx1b3VzIHJldHVybiBhdCBlbmQgb2YKKwlmdW5jdGlvbi4KKworCSogY29uZmlnL29iai1jb2ZmLmggW1RDX1NQQVJDXTogSW5jbHVkZSBjb2ZmL3NwYXJjLmgsIGFuZCBzcGVjaWZ5CisJY29mZi1zcGFyYy1seW54LgorCShTQV9HRVRfU1lNX1RBR05EWCk6IFVzZSBCRkRfSEVBREVSUyB2ZXJzaW9uIGZvciBCRkRfQVNTRU1CTEVSCisJdG9vLgorCShjX3NlY3Rpb25faGVhZGVyKTogUmV3cml0ZSBwcm90b3R5cGUgc28gdGhhdCBpdCBjb250YWlucyBubworCXByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcy4gIERvbid0IGRlY2xhcmUgaXQgYXQgYWxsIGlmCisJQkZEX0FTU0VNQkxFUi4KKworCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MpOiBOZXcgdGFyZ2V0LCB1c2luZyBjb2ZmIGFuZAorCUJGRF9BU1NFTUJMRVIuCisKKwkqIHN0YWJzLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IExpc3QgaXQuCisJKiByZWFkLmMgKFNUQUJfU0VDVElPTl9OQU1FLCBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsCisJZ2V0X3N0YWJfc3RyaW5nX29mZnNldCwgc19zdGFiX2dlbmVyaWMsIHNfc3RhYiwgc194c3RhYiwgc19kZXNjKToKKwlNb3ZlZCB0byBuZXcgZmlsZS4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjb2ZmIGZpbGVzIGxpa2UgZWxmCisJZmlsZXMuCisKK1dlZCBOb3YgMTcgMTc6MjM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4NSopOiBOZXcgdGFyZ2V0LiAgVXNlIGVsZiBhbmQgbWlwcy1iaWcuCisJKiBjb25maWcvb2JqLWVsZi5jOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGluY2x1ZGUgZWNvZmYuaC4KKwkob2JqX3BzZXVkb190YWJsZSk6IElmIEVDT0ZGX0RFQlVHR0lORywgZGVmaW5lIEVDT0ZGCisJcHNldWRvLW9wcy4KKwkob2JqX3JlYWRfYmVnaW5faG9vayk6IElmIEVDT0ZGX0RFQlVHR0lORywgY2FsbAorCWVjb2ZmX3JlYWRfYmVnaW5faG9vay4KKwkob2JqX3N5bWJvbF9uZXdfaG9vayk6IElmIEVDT0ZGX0RFQlVHR0lORywgY2FsbAorCWVjb2ZmX3N5bWJvbF9uZXdfaG9vay4KKwkob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IENhc3QgYWxsb2NhIHJlc3VsdC4KKwkoZWxmX2Zyb2JfZmlsZSk6IElmIEVDT0ZGX0RFQlVHR0lORywgZmluaXNoIHVwIEVDT0ZGIGRlYnVnZ2luZworCWluZm9ybWF0aW9uIGFuZCB3cml0ZSBpdCBvdXQgaW50byAubWRlYnVnIHNlY3Rpb24uCisJKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBOZXcgbWFjcm8uCisJKFRBUkdFVF9TWU1CT0xfRklFTERTKTogVXNlIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUy4KKwkoRUNPRkZfREVCVUdHSU5HKTogRGVmaW5lIGlmIFRDX01JUFMuCisJKFRBUkdFVF9TWU1CT0xfRklFTERTKTogSWYgRUNPRkZfREVCVUdHSU5HLCBvdmVycmlkZSB0byBhZGQKKwlmaWVsZHMgcmVxdWlyZWQgYnkgRUNPRkYuCisJKiBjb25maWcvdGMtbWlwcy5jOiBDaGVjayBFQ09GRl9ERUJVR0dJTkcgcmF0aGVyIHRoYW4KKwlPQkpfRUNPRkYgaW4gbWFueSBjYXNlcy4KKwkobWlwc19hbnlfbm9yZW9yZGVyKTogTmV3IHZhcmlhYmxlLgorCShtaXBzX2NwcmVzdG9yZV9vZmZzZXQpOiBJbml0aWFsaXplIHRvIC0xLgorCShtaXBzX2ZyYW1lX3JlZyk6IE5ldyB2YXJpYWJsZS4KKwkoUkVMQVhfRU5DT0RFLCBSRUxBWF9PTEQsIFJFTEFYX05FVywgUkVMQVhfUkVMT0MxLAorCVJFTEFYX1JFTE9DMiwgUkVMQVhfUkVMT0MzLCBSRUxBWF9XQVJOKTogTmV3IG1hY3Jvcy4KKwkobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlICJncHdvcmQiIGFuZCAiY3BhZGQiLgorCShtZF9iZWdpbik6IEluaXRpYWxpemUgb2sgdG8gZmFsc2UuICBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50CisJb2YgdGV4dCwgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRvIDQuICBTZXQgYWxpZ25tZW50IG9mCisJLnJlZ2luZm8gc2VjdGlvbiB0byAyLiAgSWYgRUNPRkZfREVCVUdHSU5HLCBjcmVhdGUgLm1kZWJ1ZworCXNlY3Rpb24uCisJKEFMSUdOX0VSUiwgQUxJR05fRVJSMik6IFJlbW92ZWQgdW51c2VkIGFuZCB1c2VsZXNzIGFsaWdubWVudAorCWNoZWNrLgorCShhcHBlbmRfaW5zbiwgbWFjcm9fYnVpbGQsIG1hY3JvX2J1aWxkX2x1aSk6IFRha2UgcGxhY2UKKwlhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCisJKGFwcGVuZF9pbnNuKTogSWYgYXBwZW5kaW5nIGEgbm9wLCBkb24ndCBlbWl0IG9uZS4KKwkobWFjcm9fYnVpbGQpOiBDaGFuZ2VkIGFzc2VydGlvbiBmb3IgJ2knLCAnaicsICdvJyBjYXNlLgorCShncF9yZWZlcmVuY2UpOiBSZW1vdmVkLgorCShsb2FkX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCisJKG1hY3JvKTogSWYgbWlwc19ub3Jlb3JkZXIgaXMgdXNlZCwgc2V0IG1pcHNfYW55X25vcmVvcmRlci4KKwlFeHRlbnNpdmUgY2hhbmdlcyB0byBoYW5kbGUgR1AgYW5kIFBJQyBzeW1ib2xzIGRpZmZlcmVudGx5LgorCUJ1aWxkIGJvdGggcG9zc2libGUgY29kZSBjaG9pY2VzIHVzaW5nIGEgdmFyaWFudCBmcmFnLCBhbmQKKwltYWtlIGEgZmluYWwgZGVjaXNpb24gYXQgdGhlIGVuZCBvZiBhc3NlbWJseSB3aGVuIGFsbAorCWluZm9ybWF0aW9uIGlzIGtub3duLiAgQWRkZWQgUElDIHN1cHBvcnQgZm9yIGFsbCBzeW1ib2wKKwlyZWZlcmVuY2VzLgorCShtaXBzX2lwKTogRG9uJ3QgcGVybWl0IGFueXRoaW5nIGJ1dCBhIG51bWJlciBhZnRlciAkIGZvciBhCisJY29wcm9jZXNzb3IgcmVnaXN0ZXIuICBEb24ndCB1c2UgLmxpdDQgb3IgLmxpdDggc2VjdGlvbnMgd2hlbgorCWdlbmVyYXRpbmcgUElDIGNvZGUuICBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50IG9mIC5saXQ0IG9yCisJLmxpdDggc2VjdGlvbiB0byA0LgorCShtZF9hcHBseV9maXgpOiBBY2NlcHQgYW5kIGlnbm9yZSBHT1QxNiBhbmQgR1BSRUwzMiByZWxvY3MuCisJKHNfY2hhbmdlX3NlYyk6IFNldCBhbGlnbm1lbnQgb2YgRUxGIC5yb2RhdGEgb3IgLnNkYXRhIHNlY3Rpb24KKwl0byA0LgorCShzX21pcHNzZXQpOiBJZiAuc2V0IG5vcmVvcmRlciwgc2V0IG1pcHNfYW55X25vcmVvcmRlci4KKwkoc19jcGxvYWQpOiBJZ25vcmUgLmNwbG9hZCBpZiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZS4gIFdhcm4KKwlpZiAuY3Bsb2FkIGlzIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbi4KKwkoc19jcHJlc3RvcmUpOiBJZ25vcmUgLmNwcmVzdG9yZSBpZiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZS4KKwkoc19ncHdvcmQsIHNfY3BhZGQpOiBOZXcgZnVuY3Rpb25zLgorCSh0Y19nZXRfcmVnaXN0ZXIpOiBBZGRlZCBmcmFtZSBhcmd1bWVudDsgaWYgdHJ1ZSwgc2V0CisJbWlwc19mcmFtZV9yZWcgdG8gcmV0dXJuIHZhbHVlLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KKwkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBEb24ndCBlcnJvciBvdXQsIGJ1dCBpbnN0ZWFkCisJZGV0ZXJtaW5lIGhvdyBtdWNoIGEgZnJhZyBzaG91bGQgZ3Jvdy4KKwkodGNfZ2VuX3JlbG9jKTogUmV0dXJuIG11bHRpcGxlIHJlbG9jcyBpZiBhcHByb3ByaWF0ZSwgYXMKKwlkZXRlcm1pbmVkIGJ5IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LgorCShtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUxGIGhlYWRlciBmbGFncyBiYXNlZCBvbgorCW1pcHNfYW55X25vcmVvcmRlciBhbmQgbWlwc19waWMuCisJKiBjb25maWcvdGMtbWlwcy5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUpOiBEZWZpbmUuCisJKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBEZWZpbmUgdG8gYmUgMy4KKwkobWRfcmVsYXhfZnJhZyk6IERlZmluZSB0byBiZSAwLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBEb24ndCBkZWZpbmUuCisJKHRjX2dldF9yZWdpc3Rlcik6IENoYW5nZWQgZGVjbGFyYXRpb24uCisKKwkqIGVjb2ZmLmgsIGVjb2ZmLmM6IE5ldyBmaWxlcyBwdWxsZWQgb3V0IG9mIGNvbmZpZy9vYmotZWNvZmYuYyB0bworCXN1cHBvcnQgZ2VuZXJhdGluZyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIE1JUFMgRUxGCisJdGFyZ2V0cy4gIENvbXBpbGVkIG9ubHkgaWYgRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQuICBDaGFuZ2VkCisJaGFuZGxpbmcgb2YgZXh0ZXJuYWwgc3ltYm9sczogaXQgbm93IGFsd2F5cyBnZW5lcmF0ZXMgZXhhY3RseQorCXRob3NlIGV4dGVybmFsIHN5bWJvbHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHN5bWJvbCBsaXN0LgorCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUyk6IEFkZGVkIGVjb2ZmLmMuCisJKFJFQUxfSEVBREVSUyk6IEFkZGVkIGVjb2ZmLmguCisJKE9CSlMpOiBBZGRlZCBlY29mZi5vLgorCShlY29mZi5vKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZy9vYmotZWNvZmYuYzogQWxtb3N0IGVudGlyZWx5IG1vdmVkIGludG8gZWNvZmYuYy4KKwlSZW1haW5pbmcgY29kZSBtb3N0bHkganVzdCBjYWxscyBlY29mZi5jIGNvZGUuCisJKiBjb25maWcvb2JqLWVjb2ZmLmg6IERlZmluZSBFQ09GRl9ERUJVR0dJTkcuCisJKFRBUkdFVF9TWU1CT0xfRklFTERTKTogTWFrZSBlY29mZl9zeW1ib2wgYSBwb2ludGVyIHRvIGEKKwlzdHJ1Y3QgbG9jYWxzeW0uCisJKG9ial9yZWFkX2JlZ2luX2hvb2ssIG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUgdG8gY2FsbAorCWZ1bmN0aW9ucyBpbiBlY29mZi5jLgorCShlY29mZl9zdGFiKTogRG9uJ3QgZGVjbGFyZSAobm93IGRlY2xhcmVkIGluIGVjb2ZmLmgpLgorCShvYmpfc2V0X3N5bV9pbmRleCk6IERlZmluZS4KKwkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBEZWNsYXJlLgorCisJKiBmcmFncy5oIChmcmFnX2dyb3cpOiBEZWNsYXJlLgorCSogZnJhZ3MuYyAoZnJhZ19ncm93KTogTWFkZSBub24tc3RhdGljLgorCisJKiB3cml0ZS5jIChpc19kbnJhbmdlKTogRG8gbm90IGRlZmluZSBpZiBtZF9yZWxheF9mcmFnIGlzIGRlZmluZWQuCisJKHJlbGF4X3NlZ21lbnQpOiBJZiBtZF9yZWxheF9mcmFnIGlzIGRlZmluZWQsIHVzZSBpdCB0byBoYW5kbGUgYQorCWZyYWcgb2YgdHlwZSByc19tYWNoaW5lX2RlcGVuZGVudCByYXRoZXIgdGhhbiBsb29raW5nIHRocm91Z2gKKwltZF9yZWxheF90YWJsZS4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiB3ZSBmaW5kIGEgYmFkIHBzZXVkby1vcCwKKwlkbyBhIGNvbnRpbnVlIHRvIGdvIG9uIHRvIHRoZSBuZXh0IGxpbmUgcmF0aGVyIHRoYW4gYSBicmVhay4KKwlSZW1vdmVkIGR1cGxpY2F0ZSBiYWQgcHNldWRvLW9wIGNvZGUgd2hpY2ggd2FzIG5ldmVyIGV4ZWN1dGVkLgorCisJKiByZWFkLmMgKHNfbGNvbW0pOiBEbyBub3QgcmVxdWlyZSBhIGNvbW1hIGFmdGVyIHRoZSBuYW1lLgorCisJKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQ2hhbmdlZCBoYWRvbmUgZmllbGQgdG8gYml0ZmllbGQuCisJQWRkZWQgYnNzIGJpdGZpZWxkLgorCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogU2V0IGJzcyBmbGFnIGZvciBic3Nfc2VjdGlvbi4KKwkqIHJlYWQuYyAoc19sY29tbSk6IFNldCBic3MgZmxhZyBmb3IgLnNic3Mgc2VjdGlvbiBpZiB1c2VkLgorCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogRG9uJ3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZm9yIGEKKwlic3Mgc2VjdGlvbi4gIFNldCBTRUNfUkVMT0MgaWYgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9ucywgZXZlbiBmb3IKKwlhIHplcm8gc2l6ZSBzZWN0aW9uLgorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJbiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUgY2FzZSwgYmFzZQorCWRhdGEgb2Zmc2V0IG9uIHJlbG9jWzBdLT5hZGRyZXNzIHJhdGhlciB0aGFuIHJlbG9jW2pdLT5hZGRyZXNzLCBzbworCXRoYXQgbXVsdGlwbGUgcmVsb2NzIGNhbiBhZmZlY3QgZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMuCisKKwkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyLCByZWxheF9hbmRfc2l6ZV9zZWcsCisJYWRqdXN0X3JlbG9jX3N5bXMsIHdyaXRlX3JlbG9jcyk6IE1ha2UgdGhpcmQgYXJndW1lbnQgUFRSLCBub3QKKwljaGFyICosIHRvIG1hdGNoIGRlZmluaXRpb24gb2YgYmZkX21hcF9vdmVyX3NlY3Rpb25zLgorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogRG9uJ3QgaW50ZXJwcmV0IGEgY29tbWVudCBjaGFyYWN0ZXIKKwlhcyBzdGFydGluZyBhIENQUCBsaW5lIGRpcmVjdGl2ZSB1bmxlc3MgaXQgaXMgYSAnIycgYW5kIGlzIHRoZQorCXZlcnkgZmlyc3QgY2hhcmFjdGVycyBvbiB0aGUgbGluZSAoaS5lLiwgZG8gbm90IHBlcm1pdCBsZWFkaW5nCisJd2hpdGVzcGFjZSkuCisKKwkqIG1lc3NhZ2VzLmMgKGlkZW50aWZ5KTogTWFrZSBmaWxlIGFyZ3VtZW50IG5vbi1jb25zdCwgdG8gbWF0Y2gKKwljYWxsZXJzLgorCitUdWUgTm92IDE2IDIwOjM4OjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEZpeCB0aGlua28gaW4gMjFiaXQgcmFuZ2UgY2hlY2suCisKK1NhdCBOb3YgMTMgMTg6MjI6NDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENvcGUgd2l0aCBJTU0xNiB0eXBlIHRvby4KKwkqIGNvbmZpZy90Yy16OGsuYyAoYnVpbGRfYnl0ZXMsIG1kX2FwcGx5X2ZpeCk6IFVuZGVyc3RhbmQgbkRJU1A3CisJcmVsb2NzLgorCitGcmkgTm92IDEyIDE2OjUxOjQ3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5bY2hdOiBGaXggYXNzb3J0ZWQgdHJpdmlhbCBpbmRlbnRpb24gcHJvYmxlbXMuCisJKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX3ZlcnNpb24pOiBBZGQgbWlzc2luZyAnOycuCisJKHNvbV9mcm9iX2ZpbGUpOiBEZWxldGUgd2hpdGVzcGFjZSBhdCBFT0wuCisKK0ZyaSBOb3YgMTIgMTU6MjY6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCBmb2xsb3dpbmcgMi4yIHJlbGVhc2UuCisKK0ZyaSBOb3YgMTIgMTQ6NTI6MTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IFVzZSBhIHJlYWwgdHlwZSBmb3IgdGhlCisJZmllbGQgc2VsZWN0b3IsIHJhdGhlciB0aGFuIGFuIGludC4gIEFsbCB1c2VzIG9mIGZpZWxkIHNlbGVjdG9ycworCWZpeGVkLgorCSh0Y19nZW5fcmVsb2MpOiBGb3IgU09NIFBMQUJFTHMsIGFsd2F5cyBzZXQgYWRkZW5kIHRvIHplcm8gZm9yIG5vdy4KKwkobWRfYXBwbHlfZml4XzEpOiBEbyBub3QgY2FsbCBocHBhX2ZpZWxkX2FkanVzdCBmb3IgYW55IFBMQUJFTAorCWZpZWxkLgorCisJVGh1IE5vdiAxMSAxNTo0OTowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfdHlwZV9hcmdzKTogRm9yIC5pbXBvcnQgc3RhdGVtZW50cywKKwlzaWxlbnRseSBpZ25vcmUgYXR0ZW1wdCB0byBjaGFuZ2UgdGhlIHN5bWJvbCB0eXBlIGZvciBhIGZ1bmN0aW9uCisJZnJvbSBTVF9FTlRSWSB0byBTVF9DT0RFIG9uIC5pbXBvcnQuCisKK1dlZCBOb3YgMTAgMTY6MTk6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiB3cml0ZS5oIChmaXhTKTogUmVuYW1lIGZ4X2NhbGxqIGZpZWxkIHRvIGZ4X3RjYml0LgorCSogd3JpdGUuYywgY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZmJmZC5jLAorCWNvbmZpZy90Yy1pOTYwLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworVHVlIE5vdiAgOSAwMDo0OTowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSBjb25maWctc3RhbXAgYW5kIGNvbmZpZy5oCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGV2YWx1YXRlX2Fic29sdXRlKTogQXZvaWQgcmVseWluZyBvbgorCUFOU0ktQyBmZWF0dXJlcy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfdHlwZV9hcmdzKTogUmVuYW1lZCBmcm9tIHBhX2V4cG9ydF9hcmdzLgorCUFjY2VwdCBuZXcgYXJndW1lbnQgImlzX2V4cG9ydCIuICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgV2hlbgorCXByb2Nlc3NpbmcgYSAuZXhwb3J0IGRpcmVjdGl2ZSBmb3IgYSBmdW5jdGlvbiwgZG8gbm90IGFsbG93CisJdGhlIHVzZXIgdG8gc2V0IHRoZSB0eXBlIHRvICJDT0RFIiwgaW5zdGVhZCB3YXJuIGFuZCBzZXQgdGhlCisJdHlwZSB0byAiRU5UUlkiLgorCitNb24gTm92ICA4IDEyOjA1OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgcHJpbnRJbnNuKTogSGFuZGxlICdrJyAoZnJvbSBUZWQKKwlMZW1vbiA8bWVsbG9uQHBlcHBlci5uY2QuY29tPikuCisJKG1pcHNfaXApOiBQZXJtaXQgb2RkIG51bWJlcmVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiAtbWlwczMuCisJKG1hY3JvKTogVXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwgcmVsb2NhdGlvbiBmb3IgTV9MSV9TUy4KKworTW9uIE5vdiAgOCAwNzo0NTowMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBoODMwMGgsIHdlIGhhdmUgbXVsdGlsaWIgbm93LgorCitNb24gTm92ICA4IDA2OjA5OjE4IDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBnZW5lcmljIG5ldHdhcmUgYXMgYmVpbmcgRUxGIGZvcm1hdC4KKwkJCVJlY29nbmlzZSB1bml4d2FyZSBpZiB0aGUgdXNlciBzdXBwbGllcyBpdC4KKworU3VuIE5vdiAgNyAwMTowMjowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogRmlyc3QgY3V0IGF0IGNsZWFuaW5nIHVwIFBBIGluc3RydWN0aW9uIHBhcnNpbmcuCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IEFjY2VwdCBwb2ludGVyIHRvCisJaW5zbiBzdHJ1Y3R1cmUgYXMgYW4gYXJndW1lbnQsIGFuZCBhIHBvaW50ZXIgdG8gYSBzdHJpbmcuICBBbGwKKwljYWxsZXJzIGNoYW5nZWQuICBBbHdheXMgcmVhZCBhbnkgZmllbGQgc2VsZWN0b3IgaGVyZS4gIENhbGwKKwlldmFsdWF0ZSBhYnNvbHV0ZSB0byBnZXQgYSByZXR1cm4gdmFsdWUuCisJKGV2YWx1YXRlX2Fic29sdXRlKTogQWRkZXB0IHBvaW50ZXIgdG8gaW5zbiBzdHJ1Y3R1cmUgYXMgaXRzCisJYXJndW1lbnQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgorCShJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFKTogTmV3IG1hY3JvIGZvciBpbnNlcnRpbmcgYSBiaXRmaWVsZAorCWludG8gYW4gaW5zdHJ1Y3Rpb24gYW5kIGNvbnRpbnVpbmcgdGhlIG1haW4gcGFfaXAgbG9vcC4KKwkoQ0hFQ0tfRklFTEQpOiBOZXcgbWFjcm8gZm9yIHNpbXBsZSByYW5nZSBjaGVja2luZyBvZiBmaWVsZHMuCisJKHBhX2lwKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuICBVc2UgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRQorCWFuZCBDSEVDS19GSUVMRC4gIEFsbCBpbW1lZGlhdGUgZmllbGRzIG5vdyBwYXNzIHRocm91Z2gKKwlwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiB3aGljaCB3aWxsIGFsc28gaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4KKwlEZWxldGUgZGVhZCBjb2RlLiAgU2ltcGxpZnkuCisJKG1kX2FwcGx5X2ZpeF8xKTogVXNlIENIRUNLX0ZJRUxEIHRvIHZlcmlmeSBhbnkgZml4ZXMgdGhhdCBhcmUKKwlhcHBsaWVkIGFyZSBpbiByYW5nZS4gIFVzZSBiZmRfcHV0XzMyIHJhdGhlciB0aGFuIGluc2VydGluZyBlYWNoCisJYnl0ZSBvZiB0aGUgZml4ZWQgaW5zdHJ1dGlvbiBpbnRvIHRoZSBidWZmZXIgb3Vyc2VsdmVzLgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRGVsZXRlIHtTRUcsR0xPQkFMfV9ESUZGX0FMTE9XRUQgY29kZSwKKwlpdCB3YXMgUEEgc3BlY2lmaWMgYW5kIGlzIG5vIGxvbmdlciBuZWVkZWQgKGl0J3Mgbm93IGhhbmRsZWQKKwl3aXRoaW4gdGhlIFBBIGJhY2tlbmQpLgorCSogY29uZmlnL3RjLWhwcGEuaCAoU0VHX0RJRkZfQUxMT1dFRCk6IERlbGV0ZSBkZWZpbml0aW9uLgorCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogSWYgdGhlIHN1YnRyYWN0IHN5bWJvbCBmb3IKKwlhIGZpeHVwIGlzICRnbG9iYWwkIGNoYW5nZSBpdCB0byBOVUxMIGFzICRnbG9iYWwkIGlzIHJlYWxseSBvbmx5CisJbmVlZGVkIGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB0aGUgYmFzZSB0eXBlIG9mIHJlbG9jYXRpb24gdG8gdXNlLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3N1YnNwYWNlKTogSW5pdGlhbGl6ZSBzdWJzcGFjZV9kZWZpbmVkLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYS1pcCwgY2FzZSAneicpOiBNYWtlIGZpZWxkIHNlbGVjdG9ycyB3b3JrCisJZm9yICd6JyBvcGVyYW5kcyAodGFyZ2V0IG9mIGJsZSBicmFuY2gpLgorCitTYXQgTm92ICA2IDIyOjQxOjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jOiAodXBkYXRlX3N1YnNwYWNlKTogRml4IHR5cGUgYW5kIG5hbWUgb2YgbGFzdAorCXBhcmFtZXRlci4gIEFsbCBjYWxsZXJzIGZpeGVkLgorCShtZF9iZWdpbiwgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yLCBwYV9lbnRyeSk6IExpbnQuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGNvbnNfZml4X25ld19ocHBhKTogUmVzZXQgZmllbGQgc2VsZWN0b3IKKwl0byBkZWZhdWx0IHN0YXRlIGFmdGVyIGl0J3MgYmVlbiB1c2VkLgorCitGcmkgTm92ICA1IDEyOjA4OjIxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogQ2hhbmdlCisJc3BhY2Uvc3Vic3BhY2Ugc29ydCBrZXlzIGZvciB0aGUgc3RhYiBzZWN0aW9ucyBzbyBhcyB0byBhdm9pZAorCWJ1Z3MgaW4gdGhlIGhwIGxpbmtlciBhbmQgcHhkYi4KKworVGh1IE5vdiAgNCAxNzowMDowNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogd3JpdGUuYyAoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIpOiBVcGRhdGUgcG9pbnRlciB0byBsYXN0CisJZnJhZyBmb3IgYSBzZWdtZW50IGluIHRoZSBzZWdpbmZvIHN0cnVjdHVyZS4KKworVGh1IE5vdiAwNCAwOTowOTozNSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQorCisJKiAgTWFrZWZpbGUuaW46IENoYW5nZWQgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKKworV2VkIE5vdiAgMyAxMjoxNjoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEhhbmRsZSBjb252ZXJzaW9uIG9mIHN1YnRyYWN0aW9uIHRvCisJcGMtcmVsYXRpdmUgYWRkcmVzc2luZyBldmVuIGlmIHBjLXJlbGF0aXZlIGZsYWcgaXMgYWxyZWFkeSBzZXQuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBVc2Ugc3RyY2hyLCBub3QgaW5kZXguICBEb24ndAorCWRlY2xhcmUgZWl0aGVyLgorCisJKiBkb2MvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSBpbnRlcm1lZGlhdGUgZmlsZXMgZnJvbSBkdmkKKwlidWlsZCwgYnV0IG5vdCB0aGUgZHZpIG9yIGluZm8gZmlsZXMuCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4taGVyZSk6IE5ldyB0YXJnZXQ7IGNsZWFucyB1cCBjdXJyZW50CisJZGlyZWN0b3J5IG9ubHkuCisJKGRpc3RjbGVhbik6IFVzZSBpdCBpbnN0ZWFkIG9mIGNsZWFuLgorCisJKiByZWFkLmMgKHNfeHN0YWIpOiBEb24ndCB1c2UgYWxsb2NhLgorCisJKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE5ldyByb3V0aW5lOyBwcmludCBtZXNzYWdlIGlkZW50aWZ5aW5nCisJZm9sbG93aW5nIG1lc3NhZ2VzIGFzIGNvbWluZyBmcm9tIGFzc2VtYmxlci4KKwkoYXNfc2hvd193aGVyZSwgYXNfYmFkX2ludGVybmFsLCBhc19iYWRfd2hlcmUpOiBDYWxsIGl0LgorCShhc19mYXRhbCk6IERvbid0IG5lZWQgdG8gaWRlbnRpZnkgcHJvZ3JhbSBhbnkgbW9yZS4KKworVHVlIE5vdiAgMiAxODowNDoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgorCisJKiByZWFkLmMgKHNfbGNvbW0pOiBQdXQgc21hbGwgb2JqZWN0cyBpbiAuc2JzcyBmb3IgTUlQUyBFTEYgYXMKKwl3ZWxsIGFzIE1JUFMgRUNPRkYuCisJKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGFsaWduZWQuCisKK1R1ZSBOb3YgIDIgMTU6MDc6MDcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHRjLWhwcGEuYzogQWRkICVkcCBhbmQgJXJwIGFzIHN5bm9ueW1zIGZvciAlcjI3IGFuZCAlcjIgaW4gdGhlCisJcHJlZGVmaW5lZCByZWdpc3RlciB0YWJsZS4KKwkocGFfcGFyc2VfbnVtYmVyKTogSGFuZGxlICVycCBpbiBjb21tb24gcmVnaXN0ZXIgc2hvcnRjdXQgY29kZS4KKwlDb25zaXN0ZW50bHkgc2V0IHJldHVybiB2YWx1ZSB0byAtMSBmb3IgYW4gZXJyb3IuICBDbGVhbiB1cCBlcnJvcgorCW1lc3NhZ2VzIGFuZCBvbmx5IHByaW50IHRoZW0gd2hlbiAicHJpbnRfZXJyb3JzIiBpcyB0cnVlLiAgSGFuZGxlCisJZW1wdHkgc3RyaW5nIGNhc2UgbGlrZSB0aGUgSFAgYXNzZW1ibGVyIC0tIGFzc3VtZSBhIHZhbHVlIG9mCisJemVyby4KKworCSogY29uZmlnL2hvLWhwdXguaDogRG8gbm90IGluY2x1ZGUgaG8tc3lzdi5oLiAgSW5zdGVhZCBpbmNsdWRlCisJc3RhbmRhcmQgaHB1eCBpbmNsdWRlIGZpbGVzIHRvIHBpY2sgdXAgdmFyaW91cyBmdW5jdGlvbiBkZWNscy4KKworCSogY29uZmlnL2hvLWhwcGFvc2YuaDogRGVsZXRlIF9JTyogbWFjcm9zLiAgVGhleSBhcmUgZGVmaW5lZCBpbgorCXN0ZGlvLmguICBEZWxldGUgYm9ndXMgZGVjbGFyYXRpb24gb2YgZnJlZS4gIEdldCBwYXRoIHRvCisJYWxsb2NhLWNvbmYuaCByaWdodC4KKworVHVlIE5vdiAgMiAxMzo1NzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogZXhwci5jIChvcGVyYW5kKTogRml4IGNoZWNrcyBmb3IgY2hhcmFjdGVycyBmb2xsb3dpbmcgIjBiIiBvcgorCSIwZiIuCisKK01vbiBOb3YgIDEgMjE6Mzc6MDQgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy9vYmotc29tLmggKG9ial9hdHRhY2hfdW53aW5kX2luZm8pOiBEZWZpbmUgYXMgYSBob29rCisJc28gR0FTIGNhbiBhdHRhY2ggdW53aW5kIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gdG8gYSBCRkQgc3ltYm9sLgorCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogSWYgbmVjZXNzYXJ5IGF0dGFjaCB1bndpbmQKKwlkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHRvIHRoZSBCRkQgc3ltYm9sLgorCShtZF9hcHBseV9maXgpOiBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIGNhbiBuZXZlciBiZSAiYXBwbGllZCIsCisJdGhleSBhcmUgc2ltcGx5IG1hcmtlcnMuICBNYWtlIFJfSFBQQV9VTldJTkRfKiBoYW5kbGluZyBPQkpfRUxGCisJZGVwZW5kZW50LgorCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBXaG9sZSBmdW5jdGlvbiBpcyBPQkpfRUxGIGRlcGVuZGVudC4KKwkocGFfZW50cnkpOiBCdWlsZCBhIFJfSFBQQV9FTlRSWSByZWxvY2F0aW9uIHdoZW4gY29uZmlndXJlZCBmb3IgU09NLgorCShwYV9leGl0KTogTGlrZXdpc2UsIGJ1dCBidWlsdCBhIFJfSFBQQV9FWElUIHJlbG9jYXRpb24uICBEbyBub3QKKwlidWlsZCAiZW5kLW9mLWZ1bmN0aW9uIiBzeW1ib2xzIGZvciBTT00sIHRoZXkgYXJlIG5vdCBuZWVkZWQuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHByb2Nlc3NfZXhpdCk6IENyZWF0ZSB0ZW1wb3Jhcnkgc3ltYm9scyB3aXRoCisJY29ycmVjdCBwcmVmaXhlcyBzbyB0aGV5IGNhbiBiZSBlbGltaW5hdGVkIGxhdGVyLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChjYWxsX2luZm8gc3RydWN0KTogRGVsZXRlIHVudXNlZCAiZnJhbWUiIGZpZWxkLgorCShwYV9jYWxsaW5mbyk6IEluc2VydCBmcmFtZXNpemUgaW50byB0aGUgdW53aW5kIGluZm9ybWF0aW9uIGFzCisJc29vbiBhcyBpdCdzIGF2YWlsYWJsZS4KKwkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRG8gbm90IGluc2VydCBmcmFtZXNpemUgaW50byB0aGUgdW53aW5kCisJaW5mb3JtYXRpb24gaGVyZS4KKworCSogQWRkIHN1cHBvcnQgZm9yIG1hcmtlciB0eXBlIHJlbG9jYXRpb25zLiAgVGhlc2UgbWFyayBhcmVhcworCW9mIGludGVyZXN0IHRvIHRoZSBsaW5rZXIuICBFTlRSWS9FWElUIHJlbG9jYXRpb25zIGZvciBTT00gYXJlCisJYW4gZXhhbXBsZSBvZiBtYXJrZXIgcmVsb2NhdGlvbnMuCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJbnN0ZWFkIG9mIGFzc3VtaW5nIHNpemUgb2YgYSByZWxvY2F0aW9uCisJaXMgNCBieXRlcywgcGljayB1cCB0aGUgc2l6ZSBmcm9tIHJlbG9jYXRpb24gaXRzZWxmLgorCShmaXh1cF9zZWdtZW50KTogRG8gbm90IGNvbXBsYWluIHRoYXQgYSB2YWx1ZSBpcyB0b28gc21hbGwgZm9yCisJbWFya2VyIHJlbG9jYXRpb25zLgorCisJKiBzdHJ1Yy1zeW1ib2wuaDogQWRkIG5ldyAic3lfdXNlZCIgZmllbGQgdG8gdGhlIHN5bWJvbCBzdHJ1Y3R1cmUuCisJKiBleHByLmMgKG9wZXJhbmQpOiBTZXQgc3lfdXNlZCBmb3IgYW55IHN5bWJvbCB1c2VkIGFzIGFuIG9wZXJhbmQuCisJKGV4cHIpOiBMaWtld2lzZSBmb3IgYW55IHN5bWJvbCB1c2VkIGluIGFuIGV4cHJlc3Npb24uCisJKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX3N5bWJvbCk6IERlZmluZS4gIFB1bnQgaW1wb3J0ZWQKKwlzeW1ib2xzIHdoaWNoIGFyZSBuZXZlciB1c2VkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzIHdoaWNoIGxvY2FsIHNjb3BlLgorCisJKiBjb25maWcvb2JqLXNvbS5oIChvYmpfZnJvYl9maWxlKTogRGVmaW5lLgorCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IFNldCBhbGlnbm1lbnQKKwlvZiBzdGFiIHNlY3Rpb25zLiAgTWFrZSBzcGFjZSBmb3IgdGhlIHNwZWNpYWwgc3RhYiBlbnRyeS4KKwkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBBZGp1c3QgdGhlIHNwZWNpYWwgZW50cnkgaW4gdGhlCisJc3RhYnMgc2VjdGlvbi4KKwkoc29tX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4gIFNpbXBseSBjYWxscyBhZGp1c3Rfc3RhYl9zZWN0aW9ucworCWZvciBlYWNoIHNlY3Rpb24uCisKK01vbiBOb3YgIDEgMTc6NTQ6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChQSUNfQ0FMTF9SRUcsIFNQLCBGUCk6IERlZmluZS4KKwkobWlwc19waWMsIG1pcHNfY3ByZXN0b3JlX29mZnNldCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgorCShtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgLmFiaWNhbGxzLCAuY3Bsb2FkLCBhbmQgLmNwcmVzdG9yZS4KKwlJZ25vcmUgLmJnbmIgYW5kIC5lbmRiLgorCShncF9yZWZlcmVuY2UpOiBfZ3BfZGlzcCBpcyBuZXZlciBhZGRyZXNzZWQgb2ZmIEdQLgorCShtYWNyb19idWlsZCk6IElnbm9yZSBtYWNyb3Mgd2hpbGUgc2VhcmNoaW5nIGZvciBpbnNuLiAgRm9yIGNhc2VzCisJaSwgaiwgYW5kIG8sIGFjY2VwdCB0aGUgcmVsb2MgdHlwZSBhcyBhbiBhcmd1bWVudCByYXRoZXIgdGhhbgorCWFzc3VtaW5nIEJGRF9SRUxPQ19MTzE2LiAgRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgQkZEX1JFTE9DX0xPMTYgdG8KKwlCRkRfUkVMT0NfTUlQU19HUFJFTC4gIEFkZGVkIG5ldyBjYXNlIGEuCisJKHNldF9hdCwgbG9hZF9yZWdpc3RlciwgbWFjcm8pOiBDaGFuZ2VkIGNhbGxzIHRvIG1hY3JvX2J1aWxkIHRvCisJcGFzcyBuZXcgYXJndW1lbnQgZm9yIGksIGogYW5kIG8gY2FzZXMuCisJKG1hY3JvKTogSGFuZGxlIE1fSkFMXzEsIE1fSkFMXzIgYW5kIE1fSkFMX0EuICBUaGVzZSByZXF1aXJlCisJc3BlY2lhbCBoYW5kbGluZyB3aGVuIGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZS4KKwkobWlwc19pcCwgdGNfZ2V0X3JlZ2lzdGVyLCBzX2ZyYW1lKTogVXNlIG1hY3JvcyBGUCwgU1AsIEdQIGFuZCBBVAorCXJhdGhlciB0aGFuIGhhcmQgY29kZWQgY29uc3RhbnRzLgorCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DX01JUFNfTElURVJBTCBhbmQKKwlCRkRfUkVMT0NfTUlQU19DQUxMMTYuCisJKHNfb3B0aW9uKTogU2V0IG1pcHNfcGljIGJhc2VkIG9uIC5vcHRpb24gcGljTi4KKwkoc19hYmljYWxscyk6IE5ldyBmdW5jdGlvbjsgc2V0IG1pcHNfcGljIHRvIDIuCisJKHNfY3Bsb2FkKTogTmV3IGZ1bmN0aW9uOyBoYW5kbGUgLmNwbG9hZC4KKwkoc19jcHJlc3RvcmUpOiBOZXcgZnVuY3Rpb247IGhhbmRsZSAuY3ByZXN0b3JlLgorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgLmJnbmIsCisJLmVuZGIgYW5kIC52ZXJzdGFtcCwgc2V0dGluZyB0aGVtIHRvIHNfaWdub3JlLgorCitTdW4gT2N0IDMxIDAwOjM2OjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvdGMtaHBwYS5jIChzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogQWRkIG5ldyBzc2RfZGVmaW5lZAorCWZpZWxkLiAgRGVmaW5lIFNVQlNQQUNFX0RFRklORUQgYWNjZXNzb3IgbWFjcm8uCisJKHBhX3N1YnNwYWNlKTogQWxsb3cgdXNlciB0byBvdmVycmlkZSBzdWJzcGFjZSBhdHRyaWJ1dGVzIGZvcgorCWJ1aWx0LWluIHN1YnNwYWNlcy4gIFNldCBzc2RfZGVmaW5lZCBhdCB0aGUgZW5kIG9mIGZjbiAtLSB0aGF0CisJd2F5IHRoZSBhdHRyaWJ1dGVzIGNhbiBvbmx5IGJlIGNoYW5nZWQgb25jZS4gIFBhc3MgbmV3bHkgYWxsb2NhdGVkCisJbmFtZSB0byBpc19kZWZpbmVkX3N1YnNwYWNlLCBub3QgYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBsaW5lLgorCUZpeCB0eXBvIGluIHNwYWNlL3N1YnNwYWNlIHJld29yay4KKwkoaXNfZGVmaW5lZF9zdWJzcGFjZSk6IERlbGV0ZSB1bnVzZWQgMm5kIGFyZy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2ltcG9ydCk6IElmIGN1cnJlbnRseSBpbiB0aGUgdGV4dCBzZWdtZW50CisJYW5kIGEgc3ltYm9sIGlzIGltcG9ydGVkIHdpdGhvdXQgdHlwZSBpbmZvcm1hdGlvbiwgc2V0IEJTRl9GVU5DVElPTgorCWZvciB0aGUgc3ltYm9sLgorCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ29ycmVjdCB0ZXN0IHRvIGRldGVybWluZSBpZgorCXRoZSBzZWN0aW9uJ3Mgc2l6ZSB3YXMgcm91bmRlZCB1cC4KKworCSogY29uZmlnL29iai1zb20uaCAob2JqX3NldF9zeW1ib2xfdHlwZSk6IERlZmluZSBhIGhvb2sgc28gR0FTCisJY2FuIHByb3Blcmx5IHNldCBhbGwgdGhlIFNPTSBzeW1ib2wgdHlwZXMuCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9zeW1ib2xfdHlwZSk6IE5ldyBlbnVtIHRvIHJlcHJlc2VudCB0aGUKKwlzeW1ib2wgdHlwZXMgd2hpY2ggY2FuIGJlIHNldCBmcm9tIGFuIElNUE9SVC9FWFBPUlQgc3RhdGVtZW50LgorCShwYV9leHBvcnRfYXJncyk6IFNldCB0aGUgcGFfc3ltYm9sX3R5cGUgdHlwZSBiYXNlZCBvbiBhcmd1bWVudHMuCisJSWYgZGVmaW5lZCwgY2FsbCBvYmpfc2V0X3N5bWJvbF90eXBlIHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBvbgorCXRvIHRoZSBCRkQgYmFja2VuZC4KKworCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogU2V0IFNFQ19ERUJVR0dJTkcgZm9yIGFueQorCXN0YWIgc2VjdGlvbiB3ZSBtYWtlLgorCShzX3N0YWJfZ2VuZXJpYyk6IExpa2V3aXNlLgorCitTYXQgT2N0IDMwIDE0OjI2OjIwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgdmFsdWUgb2YgdGhlIGZha2UgbGFiZWwuCisJKiB3cml0ZS5oIChMT0NBTF9MQUJFTCk6IERlbGV0ZSBET1RfTEFCRUxfUFJFRklYIGNvZGUuICBJbnN0ZWFkCisJYXNzdW1lIGJhY2tlbmRzIHdpbGwgZGVmaW5lIExPQ0FMX0xBQkVMIGlmIGFueXRoaW5nIG90aGVyIHRoYW4KKwknTCcgaXMgdXNlZCB0byBkZW5vdGUgYSBsb2NhbCBsYWJlbC4KKwkoRkFLRV9MQUJFTF9OQU1FKTogTmV3IG1hY3JvLiAgRGVmaW5lcyB0aGUgZGVmYXVsdCBuYW1lIHVzZWQgZm9yCisJdGhlICJmYWtlIiBsYWJlbC4KKwkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IERlbGV0ZSBET1RfTEFCRUxfUFJFRklYIGNvZGUKKwlhbmQgaW5zdGVhZCBzaW1wbHkgdXNlIHRoZSBzdHJpbmcgZGVmaW5lZCBieSBGQUtFX0xBQkVMX05BTUUuCisJKG9wZXJhbmQpOiBMaWtld2lzZS4KKwkqIHJlYWQuYyAoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBhcyBMJDBcMDAxIHNvIGl0J3MKKwlrbm93biB0byBiZSBhIGxvY2FsIGxhYmVsLgorCSogY29uZmlnL3RjLWkzODYuaCAoRE9UX0xBQkVMX1BSRUZJWCk6IERlbGV0ZS4KKwkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCisJKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCisJKiBjb25maWcvdGUtc2NvMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCisJKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCisKKwlSZXdvcmsgc3BhY2Uvc3Vic3BhY2UgaGFuZGxpbmcgaW4gUEEgY29kZSB0byBmdWxseSBzdXBwb3J0CisJU09NIHNwYWNlcy9zdWJzcGFjZXMuCisJKiBjb25maWcvdGMtaHBwYS5jIChVU0VfQUxJQVNFUyk6IE5ldyBvYmplY3QtZm9ybWF0IGRlcGVuZGVudCBkZWZpbmUKKwl0byBjb250cm9sIHRoZSB1c2Ugb2Ygc3BhY2Uvc3Vic3BhY2UgbmFtZSBhbGlhc2VzLgorCSh1cGRhdGVfc3Vic3BhY2UpOiBBY2NlcHQgc3BhY2UgY2hhaW4gZW50cnkgZm9yIGNvbnRhaW5pbmcgc3BhY2UKKwlhcyBhIG5ldyBwYXJhbWV0ZXIuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgorCShwYV9nZXRfbGFiZWwpOiBVc2UgY3VycmVudF9zcGFjZSByYXRoZXIgdGhhbiBwYV9zZWdtZW50X3RvX3NwYWNlLgorCShwYV9kZWZpbmVfbGFiZWwpOiBMaWtld2lzZS4KKwkocGFfdW5kZWZpbmVfbGFiZWwpOiBMaWtld2lzZS4KKwkobWRfYmVnaW4pOiBDaGFuZ2UgaW50byB0aGUgKHBvc3NpYmx5IG1vZGlmaWVkKSB0ZXh0X3NlY3Rpb24uCisJKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBDcmVhdGUgYSBuZXcgc2VnbWVudC9zcGFjZSBpZiBjcmVhdGVfZmxhZworCWlzIHRydWUsIGFuZCB0aGUgc3BhY2UgbmFtZSBpcyBub3Qgb25lIG9mIHRoZSB0d28gcHJlZGVmaW5lZCBzcGFjZXMuCisJKHBhX3N1YnNwYWNlKTogVXNlIGN1cnJlbnRfc3BhY2UgcmF0aGVyIHRoYW4gYSBsb29rdXAgdmlhCisJcGFfc2VnbWVudF90b19zcGFjZS4gIFJlc2V0IEJGRCBzZWN0aW9uIGZsYWdzIGFzIHJlcXVpcmVkIGJ5CisJdGhlIC5zdWJzcGFjZSBkaXJlY3RpdmUuICBMaWtld2lzZSBmb3IgdGhlIHNlY3Rpb24gYWxpZ25tZW50LgorCVBhc3MgdGhlIGN1cnJlbnQgc3BhY2UgdG8gdXBkYXRlX3N1YnNwYWNlIGFuZCBjcmVhdGVfbmV3X3N1YnNwYWNlLgorCShwYV9zcGFjZXNfYmVnaW4pOiBPbmx5IHVzZSBzcGFjZS9zdWJzcGFjZSBhbGlhc2VzIGlmIFVTRV9BTElBU0VTCisJaXMgdHJ1ZS4gIFdoZW4gbm90IHVzaW5nIGFsaWFzZXMsIGNyZWF0ZSBhIEJGRCBzZWN0aW9uIGZvciBlYWNoCisJc3Vic3BhY2UgZW5jb3VudGVyZWQuICBXaGVuIG5vdCB1c2luZyBhbGlhc2VzIHJlcGxhY2UgdGhlIGRlZmF1bHQKKwl0ZXh0LCBkYXRhLCBhbmQgYnNzIHNlZ21lbnRzIHdpdGggbmV3IG9uZXMuCisJKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBXaGVuIG5vdCB1c2luZyBhbGlhc2VzIGVhY2ggc3Vic3BhY2UgaGFzIGEKKwlzZWN0aW9uL3NlZ21lbnQgYW5kIHN1YnNlZ21lbnRzIGFyZSBub3QgbmVlZGVkLCBzbyBzZXQgdGhlIHN1YnNlZ21lbnQKKwl0byB6ZXJvLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogSWYgbmVlZGVkLCBjYWxsCisJb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgdG8gcGFzcyBzcGFjZSBhdHRyaWJ1dGVzIHRvIHRoZQorCUJGRCBiYWNrZW5kLgorCShjcmVhdGVfbmV3X3NwYWNlKTogTGlrZXdpc2UuCisJKGNyZWF0ZV9uZXdfc3Vic3BhY2UpOiBMaWtld2lzZSBmb3Igc3Vic3BhY2UgYXR0cmlidXRlcyB1c2luZworCW9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzLgorCSh1cGRhdGVfc3Vic3BhY2UpOiBMaWtld2lzZSBmb3Igc3Vic3BhY2UgYXR0cmlidXRlcyB1c2luZworCW9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogR2V0IHNlZ21lbnQgYW5kIHNvcnQga2V5CisJZm9yICRURVhUJCBhbmQgJFBSSVZBVEUkIGZyb20gdGhlIGRlZmF1bHQgc3BhY2Ugc3RydWN0dXJlLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9leHBvcnRfYXJncyk6IEFsd2F5cyBzZXQgQlNGX0ZVTkNUSU9OCisJYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlLgorCisJKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBQcmVsaW1pbmFyeSBzdGFiIGF0IGhhbmRsaW5nCisJU09NIHJlbG9jYXRpb25zLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogRGVsZXRlIGluY29ycmVjdCBjaGVjayBmb3Igc3ltYm9sCisJcmVkZWZpbml0aW9uLgorCisJKiBjb25maWcvb2JqLXNvbS5bY2hdOiBOZXcgZmlsZXMgZm9yIFNPTSBzdXBwb3J0LiAgTm90ZSBTT00KKwlzdXBwb3J0IGlzIG5vdCB5ZXQgY29tcGxldGUgaW4gR0FTIG9yIEJGRC4KKworCSogY29uZmlnL2hvLWhwcGFic2QuaDogIERlbGV0ZSBJTyogbWFjcm9zLCB0aGV5IGFyZSBkZWZpbmVkIGluCisJc3RkaW8uaC4gIERlbGV0ZSBkZWNsYXJhdGlvbiBvZiBmcmVlLiAgSW5jbHVkZSBzdGRsaWIuaCwgdW5pc3RkLmgsCisJYW5kIHN0cmluZy5oLgorCitGcmkgT2N0IDI5IDEzOjI2OjEyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgc2VjdGlvbiBuYW1lcyB1c2VkIGZvciBlbWJlZGRlZAorCXN0YWJzIHN1cHBvcnQuICBOZWVkZWQgZm9yIFNPTS4KKwkqIHJlYWQuYyAoU1RBQl9TRUNUSU9OX05BTUUpOiBEZWZhdWx0IHRoZSBuYW1lIG9mIHRoZSBzdGFiIHNlY3Rpb24KKwl0byAiLnN0YWIiLgorCShTVEFCX1NUUklOR19TRUNUSU9OX05BTUUpOiBMaWtld2lzZSBmb3IgdGhlIHN0YWIgc3RyaW5ncyBzZWN0aW9uLgorCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogSXMgbm93IHBhc3NlZCB0aGUgZnVsbCBuYW1lIGZvciB0aGUKKwlzdGFiIHN0cmluZyBzZWN0aW9uIHJhdGhlciB0aGFuIGEgbmFtZSBwcmVmaXguICBBbGwgcmVmZXJlbmNlcworCWNoYW5nZWQuCisJKHNfc3RhYl9nZW5lcmljKTogTmV3IGFyZ3VtZW50IGZvciB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLgorCWFsbCByZWZlcmVuY2VzIGNoYW5nZWQuCisJKHNfeHN0YWIpOiBBcHBlbmQgInN0ciIgdG8gdGhlIHN0YWIgc2VjdGlvbiBuYW1lIHRvIGdldCB0aGUKKwlzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBBcHBlbmQgInN0ciIKKwl0byBzdGFiIHNlY3Rpb24gbmFtZSB0byBnZXQgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4gIFBhc3MKKwl0aGUgZnVsbCBuYW1lIG9mIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogRGlzYWJsZSAiLVIiIG9wdGlvbiB0byBmb2xkCisJdGV4dGFuZCBkYXRhIHNlZ21lbnRzLiAgV2FybiB1c2VyICItUiIgaXMgdW5zdXBwb3J0ZWQgb24gdGhlCisJUEEuCisKK1RodSBPY3QgMjggMTI6MzY6MTMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IERlZmF1bHQgYWxpZ25tZW50IGlzIDggZm9yCisJLmFsaWduIGFuZCAuQUxJR04gZGlyZWN0aXZlcy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3BhY2UpOiBEbyBub3QgcmVwb3J0IGFuIGVycm9yIGZvciBhIC5zcGFjZQorCWRpcmVjdGl2ZSB3aGljaCBkb2VzIG5vdCBkZWZpbmUgYSAid2VsbC1rbm93biIgc3BhY2UgYW5kIGRvZXMKKwlub3QgaW5jbHVkZSBhIHNwYWNlIG51bWJlciBhcyBhbiBhcmd1bWVudC4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcyk6IENvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisJImRlZmluZWQiLCAibG9hZGFibGUiLCAiY29kZV9vbmx5IiBhbmQgInNwYWNlX2luZGV4IiBmaWVsZHMuCisJKHBhX2RlZl9zcGFjZXMpOiBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHRoZSAic3BudW0iLCAiZGVmaW5lZCIsCisJYW5kICJwcml2YXRlIiBmaWVsZHMuCisKKwkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGQgbmV3IHRjX2ZpeF9kYXRhIGZpZWxkIGZvciB0aGUgdmFyaW91cworCWJhY2tlbmRzIHRvIGF0dGFjaCBtYWNoaW5lIGRlcGVuZGVudCBmaXh1cCBpbmZvcm1hdGlvbiB0by4KKwkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIG5ldyB0Y19maXhfZGF0YSBmaWVsZC4KKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X3N0cnVjdCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBmaXhfZml4UCBhbmQKKwlmeF9uZXh0IGZpZWxkcy4KKwkoaHBwYV9maW5kX2hwcGFfZml4KTogRGVsZXRlIHVubmVjZXNzYXJ5IGZ1bmN0aW9uLiAgRml4IGFsbAorCWNhbGxlcnMgdG8gZ2V0IEhQUEEgZml4dXAgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGNfZml4X2RhdGEgZmllbGQKKwlpbiB0aGUgR0FTIGZpeHVwLgorCShocHBhX2ZpeF9yb290KTogRGVsZXRlIHVubmVjZXNzYXJ5IHZhcmlhYmxlLgorCShmaXhfbmV3X2hwcGEpOiBBdHRhY2ggSFBQQSBmaXh1cCBkYXRhIHRvIHRoZSBHQVMgZml4dXAuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NldF9zdGFydF9zeW1ib2wpOyBEZWxldGUgdW53YW50ZWQKKwlmdW5jdGlvbi4gIEZpeCBhbGwgY2FsbGVycy4KKwkoc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IERlbGV0ZSB1bnVzZWQgc3NkX3N0YXJ0X3N5bSBmaWVsZC4KKworCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbiB0byBkZXRlcm1pbmUKKwlpZiBhIHBhcnRpY3VsYXIgZml4dXAgaXMgYWRqdXN0YWJsZS4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBocHBhX2ZpeF9hZGp1c3RhYmxlIHRvCisJcGVyZm9ybSB0aGUgcmVhbCB3b3JrLgorCisJKiBjb25maWcvdGMtaHBwYS5oIChSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUpOiBNb3ZlIGRlZmluaXRpb24gb3V0CisJb2YgT0JKX1hYWCBjb25kaXRpb25hbHMuCisJKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLWhwcGEuYyAobG9nMik6IFJlbmFtZWQgZnJvbSBpc19wb3dlcl9vZl8yLiAgRml4IGFsbAorCWNhbGxlcnMuIE5vdyByZXR1cm5zIGxvZzIgKE4pIGZvciBwb3NpdGl2ZSBOIHdoaWNoIGFyZSBhbiBleGFjdAorCXBvd2VyIG9mIHR3byBvciAtMSBmb3IgYW4gZXJyb3IuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NhbGxpbmZvKTogUmFuZ2UgY2hlY2sgdmFsdWVzIHByb3ZpZGVkIGZvcgorCUVOVFJZX0dSLCBFTlRSWV9GUiBhbmQgRU5UUllfU1IuICBQcm9wZXJseSBhZGp1c3QgdmF1ZXMgYmVmb3JlCisJaW5zZXJ0aW5nIHRoZW0gaW50byB0aGUgdW53aW5kIHRhYmxlLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChORUVEU19GSVhVUCk6IERlbGV0ZSBkZWZpbml0aW9uIGFuZCBhbGwgcmVmZXJlbmNlcy4KKwkoaHBwYV9nZW5fcmVsb2NfdHlwZSk6IE5ldyBvYmplY3QgZm9ybWF0IGRlcGVuZGVudCBtYWNyby4KKwkocGFfaXApOiBEZWxldGUgdG9ucyBvZiBjb2RlIHdoaWNoIHdhcyBlaXRoZXIgT0JKX1NPTSBvciBPQkpfRUxGCisJY29uZGl0aW9uYWwuICBUaGUgY29kZSBjYW4gKGFuZCB3aWxsKSBiZSBzaGFyZWQgYmV0d2VlbiBTT00gJiBFTEYKKwlmb3JtYXRzIGluIHRoZSBuZWFyIGZ1dHVyZS4KKwkoY29uc19maXhfbmV3X2hwcGEsIG1kX2FwcGx5X2ZpeF8xKTogTGlrZXdpc2UuCisJKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgcHJvY2Vzc19leGl0LCBwYV9leGl0KTogTGlrZXdpc2UuCisJKHRjX2dlbl9yZWxvYyk6IFVzZSBocHBhX2dlbl9yZWxvYyByYXRoZXIgdGhhbiBhbiBvYmplY3QgZm9ybWF0CisJc3BlY2lmaWMgY2FsbC4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFNldCB0aGUgc2VnbWVudCBmb3IgYSBjb21tb24gc3ltYm9sCisJdG8gYmZkX3VuZF9zZWN0aW9uLgorCisJKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3ZlcnNpb24pOiBBZGQgZXh0ZXJuIHByb3RvdHlwZS4KKworCSogY29uZmlndXJlLmluIChocHBhLSotYnNkKik6IE5ldyBjb25maWd1cmF0aW9uLgorCUJGRCBpcyBhbHdheXMgdXNlZCBmb3IgR0FTIGdlbmVyYXRpbmcgU09NIG9iamVjdHMuCisKKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MgaWYgYW4KKwlhZGp1c3RtZW50IGlzIHJlamVjdGVkIGJ5IHRoZSB0YXJnZXQgbWFjaGluZS4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYmlnX2NvbnMpOiBEZWxldGUgZnVuY3Rpb24gYW5kIGl0cworCWRlY2xhcmF0aW9uLiAgQWxsIGNhbGxlcnMgY2hhbmdlZCB0byB1c2UgcGFfY29ucy4KKworCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZpeCBpbmRlbnRpb24gYW5kIG9wZW4vY2xvc2UgYnJhY2UKKwlwcm9ibGVtLgorCisJRnJvbSBQZXRlIEhvb2dlbmJvb206CisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9hdG9mKTogUmV0dXJuIGEgTlVMTCBvbiBzdWNjZXNzIHJhdGhlciB0aGFuCisJYW4gZW1wdHkgc3RyaW5nLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogQWR2YW5jZQorCWlucHV0X2xpbmVfcG9pdG5lciB3aGVuIGFuIGludmFsaWQgYXJndW1lbnQgaXMgZW5jb3VudGVyZWQuCisKK1RodSBPY3QgMjggMTM6MDk6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtYTI5ay5jIChtZF9iZWdpbik6IFdoZW4gb3Bjb2RlcyBhcmUgbWFzaGVkIHRvZ2V0aGVyIGluCisJdGhlIHRhYmxlLCByZXF1aXJlIHRoYXQgdGhlIG9uZSB3aXRob3V0IGJpdCAweDEwMDAwMDAgc2V0IGNvbWUKKwlmaXJzdC4gIFJlcXVpcmUgZnVydGhlciB0aGF0IGl0IGJlIGNhc2UgJ2InIG9yICdQJy4gIFRoZSBhMjlrCisJb3Bjb2RlIHRhYmxlIGFscmVhZHkgbWVldHMgdGhlc2UgY29uc3RyYWludHMuCisJKG1hY2hpbmVfaXApOiBXaGVuIGhhbmRsaW5nIGNhc2UgJ2knIG9yICdBJywgbWFrZSBzdXJlIHRoYXQgdGhlCisJYXBwcm9wcmlhdGUgb3Bjb2RlIHJlYWxseSBleGlzdHMgYnkgbG9va2luZyBhdCB0aGUgbmV4dCBlbnRyeSBpbgorCXRoZSBvcGNvZGUgdGFibGUuCisKK1dlZCBPY3QgMjcgMTE6NDg6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWRqdXN0IG9mZnNldHMgZm9yIFBDIHJlbGF0aXZlCisJZml4dXBzLiAgQWRkIDYgZm9yIGxvbmcgNy4zIGNhc2UsIDIgZm9yIHNob3J0IDcuMiBjYXNlLgorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9lbnQpOiBJZ25vcmUgYW4gb3B0aW9uYWwgbnVtYmVyCisJYWZ0ZXIgYSAuZW50IGRpcmVjdGl2ZS4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEhhbmRsZSAnPicgY2FzZSAoc2hpZnQgYW1vdW50CisJYmV0d2VlbiAzMiBhbmQgNjMgZm9yIGRvdWJsZSBzaGlmdCBpbnN0cnVjdGlvbikuICBEbyAmIDB4MWYgcmF0aGVyCisJdGhhbiAlIDMyLgorCShwcmludEluc24pOiBIYW5kbGUgJz4nLgorCitUdWUgT2N0IDI2IDE2OjU4OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogT3V0cHV0IHRoZSBzeW1ib2wKKwludW1iZXIgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgVW50ZXN0ZWQuICBQcm9iYWJseSBkb2VzIG5vdCB3b3JrIGZvcgorCWNyb3NzIGFzc2VtYmx5LiAgRnJvbSBjYWduZXlAY3MuYWRlbGFpZGUuZWR1LmF1IChBbmRyZXcgQ2FnbmV5KS4KKworCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBFcnJvciBpZiBhIHNob3J0IGJyYW5jaCB1c2VzCisJYW4gaWxsZWdhbCBvZmZzZXQgb2YgMCBvciAtMS4KKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IEFsaWduIC5zdGFiCisJc2VjdGlvbiB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5LgorCitUdWUgT2N0IDI2IDEwOjI0OjMxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQ0hFQ0tGTEFHUyk6IFBhc3MgZG93biBSVU5URVNURkxBR1MuCisKKwlGcm9tIEplZmYgTGF3OgorCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRUxGMzJfSFBQQV9SX0FEREVORCAtPgorCUhQUEFfUl9BRERFTkQuCisKK01vbiBPY3QgMjUgMTQ6MDY6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGaXggdXAgbWVtYmFyIGFyZ3VtZW50IGhhbmRsaW5nLgorCitNb24gT2N0IDI1IDExOjE3OjU4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zaC5jIChidWlsZF9NYnl0ZXMpOiBXcml0ZSB0aGUgcmVsb2NzIHRvIHRoZSBjb3JyZWN0CisJYWRkcmVzcy4gKG1kX2Fzc2VtYmxlKTogTWFrZSBlcnJvciBoYW5kbGluZyBhIGJpdCBtb3JlIGdyYWNlZnVsLgorCShtZF9hcHBseV9maXgpOiAgRG9uJ3Qgd2FybiBvbiBub24gYWxpZ25lZCBkaXNwbGFjZW1lbnQuCisKKwkqIGNvbmZpZy90Yy16OGsuYyAoZ2V0X3NwZWNpZmljLCBidWlsdF9ieXRlcyk6ICBVbmRlcnN0YW5kIGFsbCB0aGUKKwlhc3BlY3RzIG9mIGxkYS4KKworTW9uIE9jdCAyNSAxMDoyMDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBVc2UgIiQ8KiIgc28gVlBBVEggd2lsbCBmaW5kCisJYXMuaW5mbyogZXZlbiBpZiB0aGV5J3JlIGluICQoc3JjZGlyKSAoZS5nLiwgZm9yIEZTRgorCWRpc3RyaWJ1dGlvbnMpLgorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBGb3IgcmVsb2NzIHRoYXQgYXJlIHBjX3JlbGF0aXZlIGFuZAorCXBjcmVsX29mZnNldCBhbmQgbm90IHBhcnRpYWxfaW5wbGFjZSwgYWRqdXN0IHJlbG9jLT5hZGRlbmQgdG8KKwljb21wZW5zYXRlIGZvciBhIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYnVnLgorCisJKiBjb25maWcvdGMtc3BhcmMuaDogUmVtb3ZlZCByZW1haW5pbmcgbm9uLUJGRF9BU1NFTUJMRVIgY29kZS4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jOiBEaXR0by4KKwkodGNfZ2VuX3JlbG9jKTogSW5jbHVkZSBmeF9vZmZzZXQgZm9yIHBjcmVsIGZpeHVwcy4KKworU3VuIE9jdCAyNCAxNjo0OTowMCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHgxLmN5Z251cy5jb20pCisKKwkqIHRjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGR3b3JkIHBzZXVkbyBvcC4KKworRnJpIE9jdCAyMiAyMDo0MDo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIG1lc3NhZ2VzLmM6IHJlcGxhY2VkIGFsbCB2YXJpYWJsZXMgY2FsbGVkIEZvcm1hdCB3aXRoICdmb3JtYXQnLAorCSAgZm9yIGNvbnNpc3RlbmN5IHRocm91Z2hvdXQKKworCSogY29uZmlndXJlLmluOiBoYW5kbGUgbWlwcyotIGluc3RlYWQgb2YgbWlwcywgbWlwcyplbCBmb3IgbGl0dGxlCisJZW5kaWFuIGNvbmZpZ3VyYXRpb25zCisKK0ZyaSBPY3QgMjIgMTQ6NDU6NDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBpbnB1dC1zY3J1Yi5jIChwaHlzaWNhbF9pbnB1dF9maWxlLCBsb2dpY2FsX2lucHV0X2ZpbGUsCisJcGh5c2ljYWxfaW5wdXRfbGluZSwgbG9naWNhbF9pbnB1dF9saW5lKTogTWFkZSBzdGF0aWMuCisJKGFzX3doZXJlKTogUmV0dXJuIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgZG9uJ3QgcHJpbnQKKwl0aGVtIG91dC4KKwkqIG1lc3NhZ2VzLmMgKGFzX3Nob3dfd2hlcmUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgT3RoZXIKKwlmdW5jdGlvbnMgdXNlIGl0IGluc3RlYWQgb2YgYXNfd2hlcmUuCisJKGFzX2JhZF9pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGFzX2JhZCk6IFVzZSBhc19iYWRfaW50ZXJuYWwuCisJKGFzX2JhZF93aGVyZSk6IE5ldyBmdW5jdGlvbiwgbGlrZSBhc19iYWQgYnV0IHRha2luZyBhIGZpbGUgbmFtZQorCWFuZCBsaW5lIG51bWJlci4KKwkqIGFzLmggKGFzX2JhZF93aGVyZSk6IERlY2xhcmUuCisJKGFzX3doZXJlKTogQ2hhbmdlIHByb3RvdHlwZSBmb3IgbmV3IGFyZ3VtZW50cy4KKwkqIHdyaXRlLmggKGZpeFMpOiBBZGRlZCBmaWVsZHMgZnhfZmlsZSBhbmQgZnhfbGluZS4KKwkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBTYXZlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluIGZpeC4KKwkoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCisJKiBpbnB1dC1maWxlLmMgKGZfaW4sIGZpbGVfbmFtZSk6IE1hZGUgc3RhdGljLgorCSogY29uZC5jIChzdHJ1Y3QgZmlsZV9saW5lKTogSnVzdCB1c2UgZmlsZSBhbmQgbGluZSBmaWVsZHMuCisJKHNfZWxzZSk6IFVzZSBhc193aGVyZSBhbmQgYXNfYmFkX3doZXJlLCBub3QgZ2V0X2ZpbGVfbGluZSBhbmQKKwlzZXRfZmlsZV9saW5lLgorCShnZXRfZmlsZV9saW5lLCBzZXRfZmlsZV9saW5lKTogUmVtb3ZlZC4KKwkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogVXNlIGFzX3doZXJlLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIGFzX3doZXJlLgorCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSk6IFVzZSBhc193aGVyZS4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgYXNfd2hlcmUuCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IFVzZSBhc19iYWRfd2hlcmUuCisJKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNzZXJ0LgorCitUaHUgT2N0IDIxIDEyOjUyOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5oOiBEb24ndCBkZWZpbmUgUkVHSVNURVJfUFJFRklYIG9yCisJT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYIGlmIGVpdGhlciBpcyBhbHJlYWR5IGRlZmluZWQuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBEZWxldGUgc29tZSBjb2RlIGluICIjaWYgMCIuCisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgZm9yIGFsbCBzcGFyYyB0YXJnZXRzLiAgQWRkZWQgZmFjaWxpdHkKKwlmb3Iga2VlcGluZyBvciByZWplY3RpbmcgY29uZmlndXJhdGlvbnMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQ7CisJZGVmYXVsdCBpcyB0byBhc3N1bWUgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgYW5kIHJlamVjdCBjb25maWdzCisJc3RpbGwgYmVpbmcgd29ya2VkIG9uLiAgTWFyayBFbGYgY29uZmlndXJhdGlvbnMgKGV4Y2VwdCBzcGFyYyBhbmQKKwlpMzg2KSBhcyBkZXZlbG9wbWVudGFsLiAgRGVsZXRlZCBjYXNlcyBtYXRjaGluZyBzb21lIGdlbmVyaWMgbmFtZXMKKwlpbiBmYXZvciBvZiBtb3JlIHNwZWNpZmljIG5hbWVzLiAgKEUuZy4sIHdoZW4gd2UgZ2V0IEFscGhhCisJc3VwcG9ydCwgd2UnbGwgc3RpbGwgb25seSBzdXBwb3J0IFZNUyBmb3IgVmF4LikKKworCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2VuZCk6IE5ldyBtYWNyby4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9lbmQpOiBGdW5jdGlvbiBkZWxldGVkLgorCShCRkRfUkVMT0NfKik6IERlbGV0ZSBtYWNyb3MgdGhhdCB1c2VkIHRvIGhlbHAga2VlcCB0aGUgbm9uLWJmZAorCXZlcnNpb24gY29tcGlsaW5nLiAgQWxsIHNwYXJjIHRhcmdldHMgd2lsbCB1c2UgYmZkIG5vdy4KKwkqIHRjLmggKG1kX2VuZCk6IERvbid0IGRlY2xhcmUgaWYgaXQncyBkZWZpbmVkIGFzIGEgbWFjcm8uCisKKwlDaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGVyIEhvb2dlbmJvb206CisKKwkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IExpbWl0IG9jdGFsIGNoYXJhY3RlciBjb25zdGFudHMgdG8KKwl0aHJlZSBkaWdpdHMuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmg6IE1ham9yIGNsZWFudXAuICBVc2UgR05VLXN0eWxlIGNvbW1lbnRzLiAgV2FybgorCWFnYWluc3QgcGxhY2luZyBhZGRpdGlvbmFsIG9iamVjdC1maWxlIGRlcGVuZGVudCBjb2RlIGhlcmUuICBXYXJuCisJYWdhaW5zdCBjb250YW1pbmF0aW5nIGFsbCBvZiBHQVMgd2l0aCB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYworCXRocm91Z2ggaW5jbHVzaW9uIG9mIHRjLWhwcGEuaC4gIERlbGV0ZSBhbGwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKKwlmb3IgZnVuY3Rpb25zIG9ubHkgdXNlZCB3aXRoaW4gdGMtaHBwYS5jLCBsaWtld2lzZSBmb3Igc3RydWN0dXJlcywKKwl2YXJpYWJsZXMsIGFuZCAjZGVmaW5lcy4gIFRyeSB0byBncm91cCBPQkpfRUxGIGFuZCBPQkpfU09NCisJY29uZGl0aW9uYWwgY29kZSBpbiBhIGZldyBzbWFsbCBwbGFjZXMuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IE1ham9yIGNsZWFudXAuICBVc2UgR05VLXN0eWxlIGNvbW1lbnRzLiAgR3JvdXAKKwlzdHJ1Y3R1cmVzLCBnbG9iYWwgdmFyaWFibGVzLCBmb3J3YXJkIGRlY2xhcmF0aW9ucyB0b2dldGhlci4KKwlSZWR1Y2UgKG9yIGluIHNvbWUgY2FzZXMgZWxpbWluYXRlKSBPQkpfRUxGIGFuZCBPQkpfU09NCisJY29uZGl0aW9uYWwgY29kZSAtLSB0cnkgdG8gZ3JvdXAgY29uZGl0aW9uYWwgY29kZSB0b2dldGhlcgorCWludG8gYSBmZXcgcGxhY2VzLiAgIE1ha2UgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIHdoaWNoCisJYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGMtaHBwYS5jIHN0YXRpYy4gIFBBUkFNaXplIGFsbCBmdW5jdGlvbnMuCisJQWRkIGNvbW1lbnRzIHRvIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQgZnVuY3Rpb25zLCB2YXJpYWJsZXMsCisJI2RlZmluZXMsIGV0Yy4gIERlbGV0ZSB1bnVzZWQgbWVtYmVycyB3aXRoaW4gc3RydWN0dXJlcy4gIERlbGV0ZQorCWxkaWw7YmxlIGhhY2tzIC0tIGl0IGlzIGJlbGlldmVkIHRoZXkgd2VyZSBpbnN0YWxsZWQgdG8gd29yaworCWFyb3VuZCBvbGQgZ2FzIGJ1Z3MuICAgQXZvaWQgdXNpbmcgbWl4ZWQgY2FzZSBmb3IgbG9jYWwKKwlmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIHN0cnVjdHVyZXMuICBGaXggZm9ybWF0dGluZyBwcm9ibGVtcworCW5vdCBmb3VuZCBieSBHTlUtaW5kZW50LiAgQWRkIEZJWE1FIG5vdGljZXMgZm9yIHRoaW5ncyB3aGljaAorCXNob3VsZCBiZSB3b3JrZWQgb24gdGhlIG5lYXIgZnV0dXJlLiAgRGVsZXRlIGxvdHMgb2Ygb2xkCisJdXNlbGVzcyAoMS4zNiBQQS1TT00pIGNvZGUuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IChmaXhfbmV3X2hwcGEpOiBJbml0aWFsaXplIHRoZSBmeF9yX3R5cGUKKwlmaWVsZCBvZiB0aGUgZml4UyBzdHJ1Y3R1cmUuICBOZWVkZWQgdG8gYnVpbGQgdW53aW5kCisJZGVzY3JpcHRvcnMgY29ycmVjdGx5LgorCisJKiB3cml0ZS5jOiAoZml4dXBfc2VnbWVudCk6IEFsbG93IGV4cHJlc3Npb25zIHN1Y2ggYXMKKwlzeW0xLXN5bTIrY29uc3QgYXMgbG9uZyBhcyBzeW0yIGlzICRnbG9iYWwkLgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFByb3ZpZGUgYSBob29rIHNvIHRoYXQgYSB0YXJnZXQKKwljcHUgY29uZmlndXJhdGlvbiBjYW4gcmVqZWN0IGNlcnRhaW4gcmVsb2NhdGlvbiByZWR1Y3Rpb25zLgorCSogdGMtaHBwYS5oICh0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBtYWNyby4gIE9ubHkgYWNjZXB0IHJlbG9jYXRpb25zCisJd2hpY2ggZG8gbm90IGludm9sdmUgZnVuY3Rpb24gc3ltYm9scy4KKworCSogY29uZmlnL3RjLWhwcGEuaDogUmVpbmRlbnQgd2l0aCBHTlUtaW5kZW50LiAgRGVsZXRlIHJlZmVyZW5jZXMKKwl0byBPQkpfT1NGUk9TRS4gIEZpeCB0eXBvcyAoT0JKX1NPTUUgLT4gT0JKX1NPTSkuICBEZWxldGUgdW51c2VkCisJU1RBQl9GSVhVUCBtYWNyby4KKwkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IFVzZSBlbGZfc3ltYm9sX3R5cGUsIGluc3RlYWQKKwlvZiBlbGYzMl9zeW1ib2xfdHlwZS4KKwkocGFfZXhwb3J0X2FyZ3MpOiBMaWtld2lzZS4KKwkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgorCShwYV9kZXNjKTogRG8gbm90IGNhbGwgb2JqX2VsZl9kZXNjLiAgKElzIHBhX2Rlc2MgZXZlbiBuZWVkZWQKKwlhbnltb3JlPykKKwkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogRG8gbm90IGRlY2xhcmUgZWxmX2dldF9zeW10YWJfbWFwIGFueQorCW9yZS4KKworCSogY29uZmlnL3RjLWhwcGEuYzogKG1kX3NlY3Rpb25fYWxpZ24pOiBBbGlnbiBhbGwgc2VjdGlvbnMgdG8KKwlhIG11bHRpcGxlIG9mIHRoZSBzZWN0aW9uIGFsaWdubWVudCByYXRoZXIgdGhhbiBhbHdheXMgYQorCW11bHRpcGxlIG9mIDguCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfc3ltYm9sKTogSWYgdGhlIGFyZ3VtZW50IHJlbG9jYXRpb24KKwliaXRzIGFyZSB6ZXJvIChlZyB0aGV5IHNwZWNpZnkgbm8gcmVsb2NhdGlvbnMpLCB0aGVuIGRvIG5vdCBldmVuCisJYm90aGVyIGFkZGluZyB0aGVpciBlbnRyaWVzIHRvIHRoZXN5bWV4dG4gc2VjdGlvbi4KKworVGh1IE9jdCAyMSAxNTo0NDo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSAtc3BhcmMKKwlvcHRpb24sIHdoaWNoIGlzIHVzZWQgYnkgdGhlIFN1bk9TIG1ha2UgZGVmYXVsdCAucy5vIHJ1bGUuCisKK1dlZCBPY3QgMjAgMTI6MjY6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCwgbGFiZWwgImltbWVkaWF0ZSIpOiBDb252ZXJ0IHJlbG9jcworCW9wZXJhdGluZyBvbiB1cHBlciAzMiBiaXRzIG9mIGltbWVkaWF0ZSBjb25zdGFudHMgdG8gbG93ZXItaGFsZgorCXJlbG9jcyB3aXRoIGFkanVzdGVkIGNvbnN0YW50cy4KKworVHVlIE9jdCAxOSAxODoxMzoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tNjhrLmggKEFPVVRfTUFDSFRZUEUpOiBEZWZpbmUgdG8gYmUgZXh0ZXJuYWwgdmFyaWFibGUKKwltNjhrX2FvdXRfbWFjaHR5cGUuCisJKiBjb25maWcvdGMtbTY4ay5jIChvbWFnaWMpOiBSZW1vdmUgb2Jzb2xldGUgYW5kIHVudXNlZCB2YXJpYWJsZS4KKwkobTY4a19hb3V0X21hY2h0eXBlKTogTmV3IHZhcmlhYmxlLCBpZiBPQkpfQU9VVC4KKwkobWRfYXNzZW1ibGUpOiBJbml0aWFsaXplIG02OGtfYW91dF9tYWNodHlwZSBiYXNlZCBvbgorCWN1cnJlbnRfYXJjaGl0ZWN0dXJlLCBpZiBPQkpfQU9VVC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZSB0byBvbWFnaWMuCisKK1RodSBPY3QgMTQgMTY6NTE6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZ25vcmUgLmxpdmVyZWcgcHNldWRvLW9wLgorCShzX29wdGlvbik6IElnbm9yZSAub3B0aW9uIE8qIGFuZCAub3B0aW9uIHBpYyouCisJKHNfZW50KTogU2tpcCB3aGl0ZXNwYWNlIGJldHdlZW4gc3ltYm9sIGFuZCBvcHRpb25hbCBkaWdpdC4KKwkobXlfZ2V0U21hbGxFeHByZXNzaW9uKTogSGFuZGxlICgkeHgpIGNvcnJlY3RseTogYXNzdW1lIDAoJHh4KS4KKworCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsd2F5cyBhY2NlcHQgJ3gnIGFuZCAnWCcgYXMgZXNjYXBlCisJY2hhcmFjdGVycyBpbiBzdGF0ZSA2LgorCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogQWNjZXB0IFxYaCogYW5kIFx4aCogd2hlcmUgaCogYXJlCisJaGV4aWRlY2ltYWwgZGlnaXRzLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSk6IE1ha2UgY3Jvc3Mgc2VnbWVudCBjYWxscyB3b3JrCisJZm9yIEVMRiBieSBoYWNraW5nIGFyb3VuZCBiaXphcnJlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYmVoYXZpb3VyCisJdGhhdCBJIGRvbid0IGRhcmUgY2hhbmdlLgorCitUaHUgT2N0IDE0IDExOjMzOjI1IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQorCisJKiBjb25maWcvdGMtaTM4Ni5jOiAobWRfYmVnaW4pOiBEbyBub3QgemVybyBzdGF0aWMgYXJyYXlzLiAgRG9uJ3QKKwljYWxsIHN0cmNociBmb3IgZWFjaCBjaGFyYWN0ZXIgdG8gc2VlIGlmIGl0IGlzIGEgc3BlY2lhbCBjaGFyLAorCWluc3RlYWQgYWRkIGEgc2Vjb25kIGxvb3Agb3ZlciBzcGVjaWFsX2NoYXJzLiAgU2V0IGFsaWdubWVudAorCW9mIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byA0LgorCShwaSwgdGUsIHB0LCBwZSwgcHMpOiBBZGQgZGVjbGFyYXRpb25zIHNvIHRoYXQgREVCVUczODYgY2FuIGJlCisJdXNlZCBhZ2Fpbi4KKwkocmVsb2MpOiBEb24ndCByZXR1cm4gOCBhbmQgMTYgYml0IG5vbi1QQyByZWxhdGl2ZSByZWxvY2F0aW9ucyBvbgorCUVMRiwgc2luY2UgdGhlIEVMRiBvYmplY3QgZm9ybWF0IGRvZXMgbm90IGhhdmUgdGhlc2UgdHlwZSBvZgorCXJlbG9jYXRpb25zLiAgQ2hhbmdlIHRoZSBhYm9ydCBpbnRvIGFzIGFzX2JhZCBhbmQgcmV0dXJuCisJQkZEX1JFTE9DX05PTkUgdG8gc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4KKwkobWRfYXNzZW1ibGUpOiBLZWVwIHRyYWNrIG9mIHRoZSBpbnN0cnVjdGlvbiBzaXplLiAgQWxsb3cgd2hpdGUKKwlzcGFjZSBiZXR3ZWVuIHRoZSAkIGFuZCB0aGUgY29uc3RhbnQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgorCWdhc2VzIGFuZCBvdGhlciBhc3NlbWJsZXJzLgorCShpMzg2X29wZXJhbmQpOiBTa2lwIHNwYWNlcyBiZXR3ZWVuICQgYW5kIGV4cHJlc3Npb24uCisJKHRjX2dlbl9yZWxvYyk6IERvbid0IGFsbG93IGFueXRoaW5nIGJ1dCAzMiBiaXQgcmVsb2NhdGlvbnMgb24KKwlFTEYuICBDb252ZXJ0IGFib3J0IGludG8gYW4gYXNfYmFkIGFuZCBhc3NlcnQgaW50byBhc19mYXRhbC4KKworV2VkIE9jdCAxMyAxNjo1MDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KSBbRElGRl9FWFBSX09LXTogSWYKKwlzdWJfc3ltYm9sUCBpcyBpbiB0aGUgY3VycmVudCBzZWdtZW50LCBjb252ZXJ0IHRvIGEgUEMtcmVsYXRpdmUKKwlmaXh1cCBhbmQgZGlzY2FyZCB0aGUgc3ltYm9sLgorCitXZWQgT2N0IDEzIDE0OjAwOjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIHN0X0VuZCBzeW1ib2wKKwlmb3Igc3RfU3RhdGljUHJvYyBqdXN0IGxpa2Ugc3RfUHJvYy4KKworCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogTW92ZWQgI2VuZGlmIGZvciBPQkpfQk9VVAorCXNvIHRoYXQgT0JKX0JPVVQgZG9lc24ndCBmb3JnZXQgdG8gYWRqdXN0IGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoZQorCS5ic3Mgc2VjdGlvbi4KKworVHVlIE9jdCAxMiAxNzoyNjoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IElmIE9CSl9FTEYsIGluY2x1ZGUgZWxmL21pcHMuaC4KKwkobWlwc19yZWdtYXNrX2ZyYWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLCBpZiBPQkpfRUxGLgorCShtZF9iZWdpbik6IElmIE9CSl9FTEYsIGNyZWF0ZSAucmVnaW5mbyBzZWN0aW9uIGFuZCBzZXQKKwltaXBzX3JlZ21hc2tfZnJhZyB0byBhIGZyYWcuCisJKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24sIGlmIE9CSl9FTEYuICBTZXQKKwltaXBzX3JlZ21hc2tfZnJhZyB0byByZWdpc3RlciBtYXNrIGluZm9ybWF0aW9uLgorCSogY29uZmlnL3RjLW1pcHMuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcpOiBOZXcgbWFjcm8sIGRlZmluZWQKKwlpZiBPQkpfRUxGLgorCitUdWUgT2N0IDEyIDAzOjMzOjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBVc2UgbXluYW1lIHdoZW4gcHJpbnRpbmcgbWVzc2FnZXMuCisKKwkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2JlZ2luKTogVXNlIG51bGwgcG9pbnRlciwgbm90IGVtcHR5IHN0cmluZywKKwlhcyBpbml0aWFsICJyZXR1cm4iIHZhbHVlIGluIGNhc2UgaGFzaGluZyBpc24ndCBuZWVkZWQuCisKKwkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2F0b2YpOiBSZXR1cm4gbnVsbCwgbm90IGVtcHR5IHN0cmluZywgb24KKwlzdWNjZXNzLgorCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtaDg1MDAuYyAobWRfYXRvZiksCisJY29uZmlnL3RjLWhwcGEuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1pODYwLmMgKG1kX2F0b2YpLAorCWNvbmZpZy90Yy1pOTYwLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtbTg4ay5jIChtZF9hdG9mKSwKKwljb25maWcvdGMtbnMzMmsuYyAobWRfYXRvZiksIGNvbmZpZy90Yy1zaC5jIChtZF9hdG9mKTogRGl0dG8uCisKK01vbiBPY3QgMTEgMTY6NDY6MzEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCWZpeCBmb3IgcHIgMzU3MQorCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IFNwZWNpYWwgYWN0aW9uIGlmIDggYml0CisJYWRkcmVzcyBzZWVuLiAoY2hlY2tfb3BlcmFuZCk6IERvbid0IGNvbXBsYWluIGlmIHRydW5jYXRpbmcgdG9wCisJYml0cyBvZiBhbiA4IGJpdCBhZGRyZXNzLiAgKGJ1aWxkX2J5dGVzKTogQWxsb3cgYW4gaW1tZWRpYXRlIGFuZAorCWFuIGFic29sdXRlIGluIHRoZSBzYW1lIGluc24uCisKK01vbiBPY3QgMTEgMTc6MTg6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IERvbid0IGNyYXNoIGlmIHNlZ2luZm8gaXMgTlVMTC4KKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBXcml0ZSBvdXQgcmVnaXN0ZXIgbWFza3MKKwlieSBtb2RpZnlpbmcgLnJlZ2luZm8gc2VjdGlvbiwgbm90IGJ5IGRpcmVjdGx5IG1vZGlmeWluZyBCRkQKKwliYWNrZW5kIGRhdGEuCisKK01vbiBPY3QgMTEgMTQ6MTE6MzIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvaG8tc3Vub3MuaDogcmVtb3ZlIGV4dGVybiB0aW1lIGRlY2xhcmF0aW9uCisKK01vbiBPY3QgMTEgMTY6MTQ6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IERvIG1lbnRpb24gdGhhdCBpdCdzIHRoZSBhc3NlbWJsZXIgdGhhdAorCWdvdCB0aGUgZmF0YWwgZXJyb3IuCisKK0ZyaSBPY3QgIDggMTQ6MDk6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2dwcm1hc2ssIG1pcHNfY3BybWFzayk6IE5ldyB2YXJpYWJsZXMgdG8KKwlob2xkIHJlZ2lzdGVyIG1hc2tzLgorCShtZF9iZWdpbik6IEluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgorCShhcHBlbmRfaW5zbik6IFVwZGF0ZSBtaXBzX2dwcm1hc2sgYW5kIG1pcHNfY3BybWFzay4gIEFsc28gYWRkCisJcmVnaXN0ZXIgdmFyaWFibGVzIHBpbmZvIGFuZCBwcmV2X3BpbmZvLgorCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19ncHJtYXNrLCBtaXBzX2Nwcm1hc2spOiBEZWNsYXJlLgorCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBJZiBUQ19NSVBTLCBzZXQgZ3BybWFzaworCWFuZCBjcHJtYXNrIGZyb20gbWlwc19ncHJtYXNrIGFuZCBtaXBzX2Nwcm1hc2suCisKKwkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBUQVJHRVRfRk9STUFUIGlmIE9CSl9FTEYuCisJKiBjb25maWcvdGMtbWlwcy5jIChHUE9QVCk6IERlZmluZSBpZiBPQkpfRUNPRkYgb3IgT0JKX0VMRi4KKwkodmFyaW91cyk6IENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBHUCByZWZlcmVuY2VzIHRvIGFwcGx5IGlmCisJR1BPUFQsIG5vdCBpZiBPQkpfRUNPRkYuCisJKHNfY2hhbmdlX3NlYyk6IFJlYXJyYW5nZSBzb21ld2hhdC4gIElmIE9CSl9FTEYsIHVzZSAucm9kYXRhCisJaW5zdGVhZCBvZiAucmRhdGEuICBJZiBPQkpfRUxGLCBzZXQgc2VjdGlvbiBmbGFncyBmb3IgLnJvZGF0YSBhbmQKKwkuc2RhdGEgc2VjdGlvbnMuCisJKHNfZnJhbWUsIHNfbG9jLCBzX21hc2spOiBDb21tZW50IG91dCBlbnRpcmUgZnVuY3Rpb25zLCByYXRoZXIKKwl0aGFuIGp1c3QgYm9keS4gIFRoZXkncmUgbm90IHVzZWQgYW55aG93LgorCSogY29uZmlndXJlLmluOiBTZXQgY3B1X3R5cGUgdG8gbWlwcyBmb3IgbWlwcyouICBBY2NlcHQKKwltaXBzLSotZWxmbCogYW5kIG1pcHMtKi1lbGYqLgorCitUaHUgT2N0ICA3IDE4OjM2OjI5IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IEFsbG93IHRoZSBhbGlnbm1lbnQgZmllbGQgdG8KKwlub3QgYmUgc3BlY2lmaWVkLgorCitXZWQgT2N0ICA2IDEzOjAxOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAoY29uc19maXhfbmV3X21pcHMpOiBOZXcgZnVuY3Rpb24uICBUdXJuCisJQkZEX1JFTE9DXzY0IGludG8gQkZEX1JFTE9DXzMyLgorCSogY29uZmlnL3RjLW1pcHMuaCAoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgorCShjb25zX2ZpeF9uZXdfbWlwcyk6IERlY2xhcmUuCisKKwlDaGFuZ2VzIHRvIGxldCBjb25zIGhhbmRsZSBiaWdudW1zIGxpa2UgZ2VuZXJhbCBleHByZXNzaW9ucy4KKwkqIGV4cHIuaCAoZXhwcmVzc2lvblMpOiBOZXcgZmllbGQgWF91bnNpZ25lZC4KKwkqIGV4cHIuYyAob3BlcmFuZCk6IEluaXRpYWxpemUgWF91bnNpZ25lZCB0byAxLiAgU2V0IGl0IHRvIDAgZm9yCisJdW5hcnkgbWludXMgY2FzZS4KKwkoZXhwcikgRml4IHR5cG8gcmVzdWx0UCB0byByaWdodCBpZiBtaXNzaW5nIG9wZXJhbmQuICBTZXQKKwlYX3Vuc2lnbmVkIHRvIDEgd2hlbiBidWlsZGluZyBuZXcgZXhwcmVzc2lvbi4KKwkqIHJlYWQuYyAocG90YWJsZSk6IE1ha2UgIm9jdGEiIGFuZCAicXVhZCIgY2FsbCBjb25zLCBub3QKKwliaWdfY29ucy4KKwkoY29ucyk6IEhhbmRsZSBiaWdudW1zLiAgSWYgZ2l2ZW4gYW4gT19jb25zdGFudCAoc21hbGwgaW50ZWdlcikgdG8KKwlmaWxsIGEgYmlnIHNwYWNlLCB0dXJuIGl0IGludG8gYSBiaWdudW0uCisJKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBTZXQgWF91bnNpZ25lZCBmaWVsZC4KKwkoYmlnbnVtX2xvdywgYmlnbnVtX2xpbWl0LCBiaWdudW1faGlnaCwgZ3Jvd19iaWdudW0sIGJpZ19jb25zKToKKwlSZW1vdmVkLgorCSogcmVhZC5oIChiaWdfY29ucyk6IFJlbW92ZSBwcm90b3R5cGUuCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgZ2l2ZSBhIHdhcm5pbmcgaWYgYQorCXN5bWJvbCBpbiBleHByX3NlY3Rpb24gY2FuIG5vdCBiZSByZXNvbHZlZC4KKwkoU19TRVRfVkFMVUUpOiBDbGVhciBYX3Vuc2lnbmVkLgorCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiByZXNvbHZlX3N5bWJvbF92YWx1ZSBmYWlsZWQgb24gYQorCXN5bWJvbCB3ZSBhcmUgd3JpdGluZyBvdXQsIGdpdmUgYSB3YXJuaW5nLgorCSogY29uZmlnL3RjLWg4NTAwLmMgKHBhcnNlX3JlZ2xpc3QpOiBTZXQgWF91bnNpZ25lZC4KKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAib2N0YSIgYW5kICJxdWFkIiB0bworCWNhbGwgcGFfY29ucywgbm90IHBhX2JpZ19jb25zLgorCShwYV9iaWdfY29ucyk6IFJlbW92ZS4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKHBhX2JpZ19jb25zKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgorCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlICJxdWFkIiB0byBjYWxsIGNvbnMsCisJbm90IGJpZ19jb25zLgorCitUdWUgT2N0ICA1IDEwOjUzOjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogZG9jL2FzLnRleGluZm8gKENvcHlpbmcpOiBuZXcgbm9kZSwgdG8gaGFuZGxlIHRoZSByZWNlbnQgY2hhbmdlcworCWluIHRoZSB0ZXhpbmZvL2dwbC50ZXhpbmZvIGZpbGUKKworTW9uIE9jdCAgNCAxNzoxMDoxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHJlYWQuYyAoYmlnX2NvbnMpOiBIYW5kbGUgIjAiIGNvcnJlY3RseS4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4gY29ycmVjdGx5LgorCitNb24gT2N0ICA0IDE1OjM3OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IE1vZGUgNy4zIG9wZXJhbmQgdXNpbmcgUEMgc2hvdWxkCisJaGF2ZSBwYy1yZWxhdGl2ZSBmaXh1cC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogTW92ZSAiLWsiIGNhc2UgZG93biBuZWFyICItcGljIiBjYXNlLgorCisJKiBjb25maWd1cmUuaW46IEFscGhhYmV0aXplIGxpc3Qgb2YgY3B1IHR5cGUgYWx0ZXJuYXRpdmVzLiAgRW5hYmxlCisJT1MgdmFsdWVzIG9mICJsaW51eCplbGYqIiBhbmQgImxpbnV4KmNvZmYqIiB0byBzZWxlY3QgdGhvc2UKKwlmb3JtYXRzLCB3aXRoIGxpbnV4IGVtdWxhdGlvbi4gIERvbid0IGJvdGhlciBjaGVja2luZyBmb3IgdXBwZXItCisJb3IgbWl4ZWQtY2FzZSB2ZXJzaW9ucyBvZiAib3NlIi4KKworVGh1IFNlcCAzMCAxMTowNTozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWcvejhrLmMgKG1kX3BzZXVkb190YWJsZSk6IGFkZCAidW5zZWciLgorCitXZWQgU2VwIDI5IDE2OjE1OjExIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IGNvcnJlY3QgYSBmZXcgbWlzdGFrZXMKKwkgIGZvdW5kIHdoaWxlIGV4dGVuZGluZyB0aGUgZGlzc2Fzc2VtYmxlci4KKworVHVlIFNlcCAyOCAxMjowMjowNCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogU3BsaXQgaTM4NiBMeW54T1Mgb3V0IGZyb20gb3RoZXIgY29mZiB0YXJnZXRzLAorCWFkZCBhIHNwZWNpZmljIEx5bnggZW11bGF0aW9uLgorCUFkZCBtNjhrIEx5bnhPUyB0YXJnZXQuCisJKiBjb25maWcvdGMtaTM4Ni5jOiBEZWZpbmUgc3BlY2lmaWMgTHlueCB0YXJnZXQgZm9ybWF0LgorCSogY29uZmlnL3RjLW02OGsuYzogRGVmaW5lIHNwZWNpZmljIEx5bnggdGFyZ2V0IGZvcm1hdC4KKwkqIGNvbmZpZy90ZS1seW54Lmg6IE5ldyBmaWxlLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaDogRG9uJ3Qgc2V0IFRBUkdFVF9GT1JNQVQgdG8gYmUKKwkiY29mZi17aTM4NixtNjhrfSIgaWYgVEFSR0VUX0ZPUk1BVCBhbHJlYWR5IGRlZmluZWQuCisJKElOSVRfU1RBQl9TRUNUSU9OKTogRGVmaW5lLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEluY2x1ZGUgPHRpbWUuaD4uCisJKHdyaXRlX29iamVjdF9maWxlKTogTG9vayBmb3IgLnN0YWIgc2VjdGlvbnMgYW5kIGNhbGwKKwlhZGp1c3Rfc3RhYl9zZWN0aW9uLgorCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBmaWxscyBpbiB0aGUgZmlyc3Qgc3ltYm9sCisJb2YgYSBzdGFiIHNlY3Rpb24gd2l0aCBudW1iZXIgb2Ygc3ltYm9scyBhbmQgc3RyaW5nIHRhYmxlIHNpemUuCisJKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLCBjcmVhdGVzIHRoZSBpbml0aWFsCisJc3ltYm9sIGZvciBhIHN0YWIgc2VjdGlvbi4KKworTW9uIFNlcCAyNyAxNToyMTo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9hdG9mLXZheC5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwgb24gc3VjY2VzcyBpbnN0ZWFkIG9mCisJZW1wdHkgc3RyaW5nLgorCSogY29uZmlnL2F0b2YtdGFob2UuYyAobWRfYXRvZik6IERpdHRvLgorCSogcmVhZC5jIChmbG9hdF9jb25zKTogRXhwZWN0IGEgbnVsbCBwb2ludGVyIGZvciBzdWNjZXNzLCBub3QgYW4KKwllbXB0eSBzdHJpbmcuCisKKwkqIGhhc2guYyAoaGFzaF9pbnNlcnQsIGhhc2hfamFtLCBoYXNoX2dyb3cpOiBSZXR1cm4gbnVsbCBwb2ludGVyCisJb24gc3VjY2VzcywgaW5zdGVhZCBvZiBlbXB0eSBzdHJpbmcuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgorCisJKiBjb25maWcvdGMtdmF4LmM6IFVzZSBQQVJBTVMgaW4gZGVjbGFyYXRpb25zLgorCSh2aXBfb3ApOiBVc2UgTlVMTCBpbnN0ZWFkIG9mIGVtcHR5IHN0cmluZyBmb3Igc3VjY2VzcyBpbiBlcnJvcgorCWFuZCB3YXJuaW5nIGZpZWxkcy4KKworU3VuIFNlcCAyNiAyMzo0NToyOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGV4cHIuYyAoZXhwcikgW0RJRkZfRVhQUl9PS106IFBlcm1pdCBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scworCWluIGRpZmZlcmVudCBkZWZpbmVkIHNlZ21lbnRzLgorCisJKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTG9jYWxpemUgImFpbSIgdmFyaWFibGUuICBJZgorCURJRkZfRVhQUl9PSywgZG9uJ3QgaW1wb3NlIGNoZWNrcyBvbiBzeW1ib2wgc2VnbWVudCB0eXBlcy4KKwkoZml4dXBfc2VnbWVudCkgW0RJRkZfRVhQUl9PS106IElmIHN1Yl9zeW1ib2xQIGlzIGluIHRoZSBjdXJyZW50CisJc2VnbWVudCwgY29udmVydCB0byBhIFBDLXJlbGF0aXZlIGZpeHVwIGFuZCBkaXNjYXJkIHRoZSBzeW1ib2wuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGZsYWdfd2FudF9waWMpOiBOZXcgdmFyaWFibGUsIG1vc3RseSBpZ25vcmVkLgorCShtZF9wYXJzZV9vcHRpb24pIFtURV9TVU4zXTogU2V0IGl0IGZvciAiLWsiLgorCShtNjhrX2lwKTogR2VuZXJhdGUgcHJvcGVyIGZpeHVwIGZvciBtb2RlIDcuMy4KKwkqIGNvbmZpZy90Yy1tNjhrLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KKworU2F0IFNlcCAyNSAwNTowODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2luY2FudCwgZ2V0b25lLCBnZXR0d28pOiBNb3ZlZAorCWVhcmxpZXIgaW4gdGhlIGZpbGUuCisJKGluc29wLCBhZGRfZXhwKTogTm93IGRlZmluZWQgYXMgZnVuY3Rpb25zLCBmb3IgcmVhZGFiaWxpdHkuCisJKGluc29wKTogTm93IHRha2VzIHR3byBhcmd1bWVudHM7IGNhbGxlcnMgY2hhbmdlZC4KKworRnJpIFNlcCAyNCAxMjozNzo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tODhrLmMgKGdldF9vNik6IG5ldyBmdW5jdGlvbi4KKwkgIChnZXRfYmYsIGdldF9jbXAsIGdldF9jbmQsIGdldF9jciwgZ2V0X2ZjciwgZ2V0X2ltbTE2LCBnZXRfcmVnLAorCSAgZ2V0X3ZlYzksIGdldHZhbCwgZ2V0X3BjciwgY2FsY29wLCBtYXRjaF9uYW1lKTogbWFrZSBzdGF0aWMgYW5kCisJICBwcm90b3R5cGUuCisJICAoc19maWxlKTogcmVtb3ZlIGV4dHJhbmVvdXMgZm9yd2FyZCBkZWNsLgorCSAgKG1kX2JlZ2luKTogYWRkIGNvbnN0IHRvIHJldHZhbCBkZWNsLgorCSAgKGNhbGNvcCk6IGNvcGUgd2l0aCBpbnN0cnVjdGlvbnMgd2l0aG91dCBhcmd1bWVudHMuICBIYW5kbGUgJ28nCisJICB0eXBlIGFyZ3VtZW50LCB0aGUgbzYgZmllbGQgb2YgdGhlIHByb3QgaW5zbi4KKwkgIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IHJldHVybiBhIGR1bW15IHZhbHVlLgorCisJKiBjb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogY29tbWVudCBjaGFuZ2U7IG82IGZpZWxkIGlzCisJICBpbiBiaXRzIDEwIHRocm91Z2ggNy4gIGZsdC5bZHhzXXMgcmVxdWlyZXMgYW4gciByZWdpc3RlciBpbiB0aGUKKwkgIHNlY29uZCBhcmd1bWVudC4gIE5ldyBpbnN0cnVjdGlvbiBsZGEueC4gIE5ldyBpbnN0cnVjdGlvbiBtdWxzCisJICAoYWxpYXMgZm9yIG11bCkuCisKK0ZyaSBTZXAgMjQgMTM6NDM6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVjdXJzZSBsaWtlIGNsZWFuLgorCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBOZXcgdGFyZ2V0LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFNldCBCRkQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lCisJYmFzZWQgb24gTUlQUyBJU0EgbGV2ZWwuCisKK1RodSBTZXAgMjMgMTc6NTg6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhcy5jIChtYWluKTogImV4aGF1c3RlZCIsIG5vdCAiZXhodWFzdGVkIi4KKworCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgc3lfdXNlZF9pbl9yZWxvYyBmaWVsZC4KKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2V0IHN5X3VzZWRfaW5fcmVsb2MuCisJKHdyaXRlX29iamVjdF9maWxlKTogTmV2ZXIgc3RyaXAgc3ltYm9scyB3aXRoIHN5X3VzZWRfaW5fcmVsb2MKKwlzZXQuCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFJld3JvdGUgdG8gaGFuZGxlIGJvdGgKKwlTb2xhcmlzIGFuZCBTVlI0IHN0eWxlIC5zZWN0aW9uIHBzZXVkby1vcHMuCisJKG9ial9lbGZfaWRlbnQpOiBTZXQgU0VDX1JFQURPTkxZIGZvciAuY29tbWVudCBzZWN0aW9uLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIHRoaXMgaXMgRUxGLCBhbmQgd2UncmUKKwlnZW5lcmF0aW5nIGEgcmVsb2MsIGRvbid0IGFwcGx5IGEgZml4LgorCitUaHUgU2VwIDIzIDEzOjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHJlbGF4X2FsaWduKTogTm93IHN0YXRpYy4KKworTW9uIFNlcCAyMCAxOToyMzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IE1ha2Ugbm9uLXN0YXRpYy4gIE1ha2UKKwlhcmd1bWVudHMgY29uc3QuICBEb24ndCBhbGlnbiBzdHJpbmdzIHRvIDQgYnl0ZSBib3VuZGFyaWVzLgorCSogcmVhZC5oOiBEZWNsYXJlIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX0FMTE9DIGFzIHdlbGwgYXMKKwlTRUNfTE9BRCBmb3IgcHJvZ2JpdHMgc2VjdGlvbi4KKwkob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCisJKiBjb25maWcvb2JqLWVsZi5oIChJTklUX1NUQUJfU0VDVElPTik6IENhbGwKKwlvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uLgorCShPQkpfUFJPQ0VTU19TVEFCKTogUmVtb3ZlZCBkZWZpbml0aW9uLgorCitGcmkgU2VwIDE3IDE4OjEyOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfU0laRSk6IERlZmluZS4KKwkob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBJbml0aWFsaXplIGluIGFsbCBjYXNlcy4KKworVGh1IFNlcCAxNiAxNDoyMzowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHRjLmg6IERlY2xhcmUgdGNfZ2VuX3JlbG9jIGRpZmZlcmVudGx5IGRlcGVuZGluZyB1cG9uCisJUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogT25seSBzZXQgZmxhZ3Mgd2hlbiBmaXJzdAorCWNyZWF0aW5nIHRoZSBzZWN0aW9uLgorCitXZWQgU2VwIDE1IDEyOjE1OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGEgdHJhcCBpbnN0cnVjdGlvbgorCXdpdGggYSBicmFuY2guCisKK1R1ZSBTZXAgMTQgMTM6MzE6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6IE5ldyBmdW5jdGlvbnM7CisJc2V0IHByZXZpb3VzX3NlY3Rpb24gYW5kIHByZXZpb3VzX3N1YnNlY3Rpb24gYW5kIHRoZW4gY2FsbCBzX2RhdGEKKwlhbmQgc190ZXh0LCByZXNwZWN0aXZlbHkuCisJKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgZGF0YSBhbmQgdGV4dC4KKwkob2JqX2VsZl9zZWN0aW9uKTogQWRkIFNFQ19MT0FEIHRvIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YKKwlmbGFncy4gIFRyZWF0IC5yb2RhdGExIGxpa2UgLnJvZGF0YS4gIFNldCBTRUNfTE9BRCBhcyB3ZWxsIGFzCisJU0VDX0FMTE9DIGZvciAiYWxsb2MiIHN0cmluZy4gIERvbid0IGJvdGhlciB0cnlpbmcgdG8gZmluZCB0aGUKKwlzZWN0aW9uOyBqdXN0IHVzZSBzdWJzZWdfbmV3LgorCisJKiByZWFkLmMgKGNoYW5nZV90b19zZWN0aW9uKTogUmVtb3ZlZC4gIFRoaXMgaXMgbm93IGRvbmUgYnkKKwlzdWJzZWdfbmV3LgorCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogUmVhcnJhbmdlZCBzb21ld2hhdC4gIENyZWF0ZSB0aGUgc2VjdGlvbgorCXVzaW5nIHN1YnNlZ19uZXcuICBTdG9yZSB0aGUgc3RyaW5nIGluZGV4IGluIHNlZ19pbmZvLCByYXRoZXIgdGhhbgorCWluIGEgc3RhdGljIHZhcmlhYmxlLiAgRm9yY2UgdGhlIGZpcnN0IHN0cmluZyB0byBiZSBlbXB0eS4gIFVzZQorCWZyYWdfbW9yZSByYXRoZXIgdGhhbiBGUkFHX0FQUEVORF8xX0NIQVIuCisJKHNfc3RhYl9nZW5lcmljKTogUmV3cm90ZS4KKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGRlZCBzdGFidSB1bmlvbi4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IEluaXRpYWxpemUgc3RhYl9zdHJpbmdfc2l6ZSB0byAwLgorCSogY29uZmlnL29iai1hb3V0LmM6IERvbid0IGluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgorCShvYmpfYW91dF9zdGFiLCBvYmpfYW91dF9kZXNjKTogUmVtb3ZlZC4KKwkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYyBhbmQgc3RhYlggZW50cmllcy4KKwkqIGNvbmZpZy9vYmotYm91dC5jOiBTYW1lIGNoYW5nZXMgYXMgY29uZmlnL29iai1hb3V0LmMuCisJKiBjb25maWcvb2JqLWJvdXQuaCAoU19TRVRfVFlQRSk6IERlZmluZS4KKwkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBEZWNsYXJlLgorCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3N0YWIpOiBSZW1vdmVkLgorCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkZXNjIGFuZCBzdGFiWCBlbnRyaWVzLgorCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3VycmVudF9zdGFiX3N5bWJvbCk6IFJlbW92ZWQuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX3N5bWJvbF90eXBlKTogUmVtb3ZlZCBuX3N0cngsIG5fdHlwZSwKKwluX290aGVyLCBuX2Rlc2MgYW5kIG5fdmFsdWUgZmllbGRzLgorCShTX3tTLEd9RVRfe09GRlNFVCxPVEhFUixUWVBFLERFU0N9KTogUmVtb3ZlZC4KKwkoTUFLRV9TVEFCX1NZTUJPTCk6IFJlbW92ZWQuCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9lY29mZl9zdGFiKTogUmVuYW1lZCB0byBlY29mZl9zdGFiLgorCUNoYW5nZWQgYXJndW1lbnRzIGFuZCByZW1vdmVkIHBhcnNpbmcgY29kZS4KKwkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgc3RhYlggZW50cmllcy4KKwkqIGNvbmZpZy9vYmotZWNvZmYuaCAoZWNvZmZfc3RhYik6IERlY2xhcmUuCisJKE9CSl9QUk9DRVNTX1NUQUIpOiBEZWZpbmUuCisJKiBjb25maWcvb2JqLWVsZi5jOiBEb24ndCBpbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KKwkob2JqX2VsZl9zdGFiLCBvYmpfZWxmX3hzdGFiLCBvYmpfZWxmX2Rlc2MsCisJZWxmX3N0YWJfc3ltYm9sX3N0cmluZywgZWxmX3N0YWJfc3ltYm9sLCBvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6CisJUmVtb3ZlZC4KKwkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYywgc3RhYlggYW5kIHhzdGFicyBlbnRyaWVzLgorCShvYmpfZWxmX3ZlcnNpb24pOiBVc2Ugc3Vic2VnX25ldywgbm90IGJmZF9tYWtlX3NlY3Rpb24uICBEb24ndAorCXNldCBTRUNfTE9BRCBmb3IgLm5vdGUgc2VjdGlvbi4KKwkoYWRqdXN0X3N0YWJfc2VjdGlvbnMpOiBHZXQgZnJhZyBwb2ludGVyIGZyb20gc2VnX2luZm8sIHJhdGhlcgorCXRoYW4gbG9va2luZyB0aHJvdWdoIGZyYWdzLgorCSogY29uZmlnL29iai1lbGYuaCAoU197UyxHfUVUX3tPVEhFUixUWVBFLERFU0N9KTogUmVtb3ZlZC4KKwkoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUywgSU5JVF9TVEFCX1NFQ1RJT04sIE9CSl9QUk9DRVNTX1NUQUIpOgorCURlZmluZS4KKwkqIGNvbmZpZy9vYmotdm1zLmMgKG9ial9hb3V0X3N0YWIpOiBSZW1vdmVkLgorCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBzdGFiWCBlbnRyaWVzLgorCSogY29uZmlnL29iai12bXMuaCAoU19TRVRfVFlQRSk6IERlZmluZS4KKworCSogYXMuaDogRGVjbGFyZSBsaXN0aW5nLgorCSogcmVhZC5jOiBEb24ndCBkZWNsYXJlIGxpc3RpbmcuCisJKGVtaXRfZXhwcik6IENhc3QgZml4X25ld19leHAgYXJndW1lbnQuCisJKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBDb3JyZWN0IHByaW50ZiBmb3JtYXQuCisJKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgorCSogd3JpdGUuaDogRGVjbGFyZSB0ZXh0X2xhc3RfZnJhZyBhbmQgZGF0YV9sYXN0X2ZyYWcuCisJKiBjb25maWcvb2JqLWJvdXQuYyAob2JqX2JvdXRfbGluZSk6IEFkZGVkIGR1bW15IGFyZ3VtZW50LgorCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCSogY29uZmlnL3RjLWEyOWsuYzogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4gIEFsc28gZnVsbHkgYnJhY2tldCBzdHJ1Y3R1cmUKKwlpbml0aWFsaXphdGlvbnMsIGZpeCBwcmludGYgZm9ybWF0cywgYW5kIHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCitNb24gU2VwIDEzIDE2OjQ4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChzX2Rlc2MpOiBPbmx5IGNvbXBpbGUgYW5kIHVzZSBpZiBTX1NFVF9ERVNDIGlzIGRlZmluZWQuCisJKiBzdHJ1Yy1zeW1ib2wuaDogRGVjbGFyZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGFuZAorCXZlcmlmeV9zeW1ib2xfY2hhaW5fMiBldmVuIGlmIG5vdCBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTLgorCSogc3ltYm9scy5jICh2ZXJpZnlfc3ltYm9sX2NoYWluKTogUmVtb3ZlZCB1c2VsZXNzIGV4cHJlc3Npb24uCisJKiB3cml0ZS5jIChoZWFkZXJzLCB0aGVfb2JqZWN0X2ZpbGUpOiBPbmx5IHVzZSBpZiBub3QKKwlCRkRfQVNTRU1CTEVSIGFuZCBub3QgQkZELgorCShmaXh1cF9zZWdtZW50LCBjdnNfZnJhZ190b19maWxsKTogT25seSB1c2UgaWYgQkZEX0FTU0VNQkxFUiBvcgorCW5vdCBCRkQuCisJKG1lcmdlX2RhdGFfaW50b190ZXh0KTogT25seSB1c2UgaWYgQkZEX0FTU0VNQkxFUiBvciAobm90IEJGRCBhbmQKKwlub3QgT0JKX0FPVVQpLgorCSogd3JpdGUuaDogRGVjbGFyZSByZWxheF9zZWdtZW50LgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHN0YWNrX3BvcCwgc3RhY2tfcHVzaCwgc3RhY2tfaW5pdCk6IE1hZGUKKwlzdGF0aWMuCisJKHN0YWNrX3RvcCk6IENvbW1lbnRlZCBvdXQsIHNpbmNlIGl0J3Mgbm90IHVzZWQuCisJRml4ZWQgdXAgcHNldWRvLW9wIGZ1bmN0aW9ucyB0byB0YWtlIGFuIGlnbm9yZWQgaW50IGFyZ3VtZW50LgorCShzaXplX3NlY3Rpb24pOiBBZGRlZCBkZWZhdWx0IEJBRF9DQVNFIHRvIHN3aXRjaC4KKwlDaGFuZ2VkIGJ6ZXJvIGNhbGxzIHRvIG1lbXNldC4KKwkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChTX0lTX0xPQ0FMKTogQ2FsbCBzdHJjaHIgb24gU19HRVRfTkFNRQorCShzKSwgbm90IG9uIHMgaXRzZWxmLgorCSogY29uZmlnL3RjLWEyOWsuYyAoc191c2UpOiBUYWtlIGlnbm9yZWQgaW50IGFyZ3VtZW50LiAgT25seQorCWRlZmluZSBpZiBPQkpfQ09GRiBpcyBub3QgZGVmaW5lZC4KKwkqIGNvbmZpZy90Yy1pMzg2LmM6IChmaXRzX2luX3NpZ25lZF9ieXRlLCBzbWFsbGVzdF9pbW1fdHlwZSk6IE1ha2UKKwlhcmd1bWVudCBzaWduZWQgYWdhaW4uCisJKiBjb25maWcvdGMtbTY4ay5jIChzX2Jzcywgc19ldmVuLCBzX3Byb2MpOiBUYWtlIGlnbm9yZWQgaW50CisJYXJndW1lbnQuCisJKG02OGtfaXApOiBGdWxseSBicmFja2V0IGluaXRpYWxpemF0aW9uIG9mIGFyY2hzLgorCUNvcnJlY3Qgc2V2ZXJhbCBmb3JtYXRzIGZvciBfX0xJTkVfXyB0byBiZSAlZCByYXRoZXIgdGhhbiAlcy4KKwkoaW5pdF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6YXRpb24uCisJQ2FzdCB2YWx1ZXMgbGFyZ2VyIHRoYW4gMHg3ZiBhc3NpZ25lZCB0byBmcl9vcGNvZGUgdG8gY2hhci4KKworCSogc3Vic2Vncy5jOiBSZW5hbWVkIG5vbi1CRkRfQVNTRU1CTEVSIHN1YnNlZ19uZXcgdG8gc3Vic2VnX3NldC4KKwlXcm90ZSBub24tQkZEX0FTU0VNQkxFUiBzdWJzZWdfbmV3LiAgTm93IHN1YnNlZ19uZXcgYWx3YXlzIHRha2VzIGEKKwlzZWN0aW9uIG5hbWUsIGFuZCBzdWJzZWdfc2V0IGFsd2F5cyB0YWtlcyBhIHNlZ1QuICBDaGFuZ2VkIGFsbAorCWNhbGxlcnMgYXMgYXBwcm9wcmlhdGUuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAgKGNoYW5nZV90b19zZWN0aW9uKTogUmVuYW1lZCB0bworCW9ial9jb2ZmX2FkZF9zZWdtZW50LiAgQ29ycmVjdGVkLiAgTWFkZSBjYWxsZXJzIHVzZSBzdWJzZWdfbmV3LgorCSogY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9zZWdtZW50X25hbWUsIG9ial9hZGRfc2VnbWVudCk6CisJRGVmaW5lLgorCitNb24gU2VwIDEzIDEzOjE1OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCk6IFJlbW92ZSB0ZXN0IGZvciBuYW1lWzBdID09ICdMJy4KKworRnJpIFNlcCAxMCAxMToyMjowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWxmLmggKFNfU0VUX1NJWkUpOiBBY3R1YWxseSBzZXQgdGhlIHNpemUuCisKKwlHY2MgbGludC4KKwkqIEFkZGVkIGEgbnVtYmVyIG9mIGNhc3RzIHRvIGZ1bmN0aW9uIGNhbGxzLgorCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKSwgYXMuYyAobWFpbiksIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwKKwlvcGVyYW5kLCBleHByKSwgcmVhZC5jIChyZWFkX2JlZ2luLCBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFksCisJcmVhZF9hX3NvdXJjZV9maWxlLCBzX2FsaWduX2J5dGVzLCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLAorCWlnbm9yZV9yZXN0X29mX2xpbmUsIGJpZ19jb25zLCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50LCBzX2lnbm9yZSksCisJcmVhZC5oIChpc19uYW1lX2JlZ2lubmVyLCBpc19wYXJ0X29mX25hbWUpLCBjb25maWcvb2JqLWVsZi5jCisJKG9ial9lbGZfc2VjdGlvbiksIGNvbmZpZy90Yy1pMzg2LmMgKHBhcnNlX3JlZ2lzdGVyKSwKKwljb25maWcvdGMtc3BhcmMuYyAoaXNvY3RhbCwgc19wcm9jKTogQ2FzdCBjaGFyCisJYXJyYXkgaW5kaWNlcyB0byB1bnNpZ25lZCBjaGFyLgorCSogYXBwLmMgKHByb2Nlc3NfZXNjYXBlKTogTWFrZSBzdGF0aWMuICBBZGQgcHJvdG90eXBlLiAgQ2hhbmdlCisJYXJndW1lbnQgZnJvbSBjaGFyIHRvIGludC4KKwkqIGFzLmM6IEluY2x1ZGUgb3V0cHV0LWZpbGUuaCBmb3IgcHJvdG90eXBlcy4gIENvbW1lbnQgb3V0IHVudXNlZAorCWZ1bmN0aW9uIGdvdF9zaWcuCisJKiBNYWtlZmlsZS5pbiAoYXMubyk6IERlcGVuZCBvbiBvdXRwdXQtZmlsZS5oLgorCSogYXMuaCAoQkFEX0NBU0UpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBsb25nLCBhbmQgdXNlICVsZC4KKwkocHNldWRvX3R5cGVTKTogQWRkIHByb3RvdHlwZSB0byBwb2NfaGFuZGxlciBmaWVsZC4KKwkocHJpbnRfdmVyc2lvbl9pZCk6IEFkZCBwcm90b3R5cGUuCisJKHhtYWxsb2MsIHhyZWFsbG9jKTogQ2hhbmdlIHNpemUgYXJndW1lbnRzIHRvIHVuc2lnbmVkIGxvbmcuCisJKGRvX3NjcnViX25leHRfY2hhcik6IEFkZCBwcm90b3R5cGVzIGZvciBmdW5jdGlvbiBhcmd1bWVudHMuCisJKGhhZF9lcnJvcnMsIGhhZF93YXJuaW5ncywgc2NydWJfZnJvbV9maWxlKTogUmVtb3ZlIGR1cGxpY2F0ZQorCWRlY2xhcmF0aW9ucy4KKwkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBNYWtlIHNpemUgdmFyaWFibGVzIHVuc2lnbmVkLgorCSogY29uZC5jIChpZ25vcmVfaW5wdXQpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBwdHIuCisJKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50LCBpbnRlZ2VyX2NvbnN0YW50KTogTWFrZSBzdGF0aWMuICBBZGQKKwlwcm90b3R5cGVzLgorCSogZmxvbnVtLWNvcHkuYyAoZmxvbnVtX2NvcHkpOiBNYWtlIHNpemUgdmFyaWFibGVzIHVuc2lnbmVkLgorCSogZnJhZ3MuaDogQWRkIHByb3RvdHlwZSBmb3IgZnJhZ19pbml0LgorCSogaGFzaC5oLCBoYXNoLmM6IENoYW5nZSBoYXNoIHZhbHVlcyBmcm9tIGNoYXIgKiB0byBQVFIsIG1ha2UgaGFzaAorCXN0cmluZ3MgY29uc3QsIG1ha2UgcmV0dXJuZWQgZXJyb3Igc3RyaW5ncyBjb25zdCBjaGFyICouICBBZGRlZAorCXByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucy4KKwkqIGlucHV0LWZpbGUuaCwgaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX2J1ZmZlcl9zaXplKTogUmV0dXJuCisJdW5zaWduZWQgaW50LgorCSogaW5wdXQtc2NydWIuYyAoYnVmZmVyX2xlbmd0aCk6IE1ha2UgdW5zaWduZWQuCisJKGlucHV0X3NjcnViX3B1c2gsIGlucHV0X3NjcnViX3BvcCk6IE1ha2Ugc3RhdGljLgorCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IENhc3Qgc3ByaW50ZiBhcmd1bWVudCB0byB1bnNpZ25lZAorCWxvbmcgYW5kIHVzZSAlbHguICBQcmludCBuYW1lIG9mIHNlZ21lbnQgcmF0aGVyIHRoYW4gYWRkcmVzcyBvZgorCXN0cnVjdHVyZS4KKwkobGlzdGluZ19saXN0LCBsaXN0aW5nX3RpdGxlKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGludC4KKwkobGlzdGluZ19lamVjdCwgbGlzdGluZ19mbGFncywgbGlzdGluZ19wc2l6ZSk6IEFkZCBpbnQgYXJndW1lbnQuCisJKiBsaXN0aW5nLmg6IENvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24gY2hhbmdlcy4KKwkqIG9iai5oIChvYmpfZW1pdF9zeW1ib2xzKTogUmVuYW1lIHByb3RvdHlwZSBhcmd1bWVudCB0byBhdm9pZAorCXNoYWRvd2luZy4KKwkqIHJlYWQuaDogQ2hhbmdlIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uIHByb3RvdHlwZSB0byByZXR1cm4KKwlvZmZzZXRULiAgQWRkIHByb3RvdHlwZSBmb3IgbmV4dF9jaGFyX29mX3N0cmluZy4gIFZhcmlvdXMKKwlwcm90b3R5cGUgY2hhbmdlcy4KKwkqIHJlYWQuYzogUmVtb3ZlIHByb3RvdHlwZSBmb3IgbmV4dF9jaGFyX29mX3N0cmluZy4KKwkocG9iZWdpbik6IE1ha2UgZXJydHh0IGNvbnN0LiAgTWFrZSBuZXdfbGVuZ3RoLCB0bXBfbGVuIGFuZCBudW0KKwl1bnNpZ25lZC4KKwkoc19hYm9ydCwgc19hbGlnbl9wdHdvLCBzX2NvbW0sIHNfZGF0YSwgc19hcHBfbGluZSwgc19maWxsLAorCXNfZ2xvYmwsIHNfbHN5bSwgc19vcmcsIHNfc2V0LCBzX3RleHQsIHNfZGVzYyk6IEFkZCBpbnQgYXJndW1lbnQuCisJQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShzX2NvbW0pOiBDaGFuZ2UgdGVtcCBmcm9tIHZhbHVlVCB0byBvZmZzZXRULiAgQ2FzdCB0byBsb25nIHdoZW4KKwlwcmludGluZyBhbmQgdXNlICVsZCAob25seSBmb3IgZXJyb3IgbWVzc2FnZXMgYW55aG93KS4KKwkoc19sb25nLCBzX2ludCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb25zLgorCShjb25zKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGludC4KKwkoZW1pdF9leHByKTogVXNlICVseCB3aGVuIHByaW50aW5nIGxvbmdzLgorCShnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IFJldHVybiBvZmZzZXRULCBub3QgbG9uZy4KKwkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IENvbW1lbnQgb3V0IHVubGVzcworCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMuCisJKHNfc3RhYl9nZW5lcmljKTogUmVtb3ZlIHVudXNlZCBvZmZzZXQuICBEZWZpbmUgc2VnX2lzX25ldyBvbmx5CisJaWYgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUy4gIFVzZSB0b1Agb25seSBpbiBsb2NhbCBibG9jay4KKwkqIHN0cnVjLXN5bWJvbC5oICh2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBBZGQgcHJvdG90eXBlLgorCSogc3ltYm9scy5jOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuCisJKHN5bWJvbF9uZXcpOiBSZW5hbWUgdmFsdWUgdG8gdmFsdS4KKwkoY29sb24pOiBVc2UgJWxkIGFuZCBjYXN0IHRvIGxvbmcgaW4gZXJyb3IgbWVzc2FnZS4KKwkqIHN5bWJvbHMuaDogUmVtb3ZlIGR1cGxpY2F0ZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGRlY2xhcmF0aW9uLgorCSogdGMuaDogUmVtb3ZlIHVudXNlZCBtZF9lbWl0X3JlbG9jYXRpb25zIGRlY2xhcmF0aW9uLgorCSh0Y19nZW5fcmVsb2MpOiBBZGQgZGVjbGFyYXRpb24uCisJKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogQ2hhbmdlIGZpcnN0IGFyZ3VtZW50IG5hbWUgZGVwZW5kaW5nCisJb24gQkZEX0FTU0VNQkxFUi4KKwkod3JpdGVfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBvZmZzZXQsIGZyYWdzLiAgUmVtb3ZlIHRjX2dlbl9yZWxvYworCWRlY2xhcmF0aW9ucy4gIE1ha2UgbiB1bnNpZ25lZC4KKwkod3JpdGVfY29udGVudHMpOiBSZW1vdmUgdW51c2VkIGksIG4sIHJlbG9jcywgZml4cC4gIFJlbmFtZSBmcmFncworCXRvIGYgdG8gYXZvaWQgc2hhZG93aW5nLgorCSh3cml0ZV9vYmplY3RfZmlsZSk6IERlZmluZSBmcmFnUCBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSIG9yIG5vdAorCVdPUktJTkdfRE9UX1dPUkQuICBSZW1vdmUgdW51c2VkIGtlZXAuICBPbmx5IGRlY2xhcmUgcHVudCBhbmQKKwlwdW50X2l0IGlmIHRoZXkgd2lsbCBiZSB1c2VkLiAgTWFrZSBpIGFuZCBuIHVuc2lnbmVkLgorCShmaXh1cF9zZWdtZW50KTogQ2FzdCB0byBsb25nIGFuZCB1c2UgJWxkIGluIGVycm9yIG1lc3NhZ2UuCisJKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogTWFrZSBzaXplIGFyZ3VtZW50IHVuc2lnbmVkLgorCSogY29uZmlnL29iai1hb3V0Lmg6IFJlbW92ZSBuZXN0ZWQgY29tbWVudC4gIEFkZCBwcm90b3R5cGUgZm9yCisJb2JqX2FvdXRfZnJvYl9zeW1ib2wuCisJKG9ial9hb3V0X2xpbmUsIG9ial9hb3V0X2Rlc2MpOiBBZGQgaW50IGFyZ3VtZW50LgorCSogY29uZmlnL29iai1lY29mZi5jOiBDaGFuZ2VkIGJ1aWxkIHJvdXRpbmVzIHRvIHVzZSBhbiB1bnNpZ25lZAorCW9mZnNldC4KKwkoYWRkX3N0cmluZyk6IE1ha2UgbGVuIHVuc2lnbmVkIGxvbmcuCisJKG9ial9lY29mZl9zdGFiKTogVXNlICVsdSBpbiBlcnJvciBtZXNzYWdlLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBDb21tZW50IG91dCB1bnVzZWQgbGFiZWwKKwlhbGxvY2F0ZV9ic3MuCisJKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBSZXR1cm4gMCAoY3VycmVudGx5IGJyb2tlbikuCisJKG9ial9lbGZfZGVzYywgb2JqX2VsZl92ZXJzaW9uLCBvYmpfZWxmX3NpemUsIG9ial9lbGZfdHlwZSwKKwlvYmpfZWxmX2lkZW50LCBvYmpfZWxmX3dlYWssIG9ial9lbGZfbG9jYWwsIG9ial9lbGZfY29tbW9uLAorCW9ial9lbGZfbGluZSwgb2JqX2VsZl9wcmV2aW91cyk6IEFkZCBpbnQgYXJndW1lbnQuCisJKG9ial9lbGZfd3JpdGVfc3ltYm9sX3ApOiBNYWtlIHN0YXRpYy4KKwkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfd3JpdGVfc3ltYm9sKTogQWRkIHByb3RvdHlwZS4KKwkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIGRlY2xhcmVkIGluCisJcmVhZC5oLgorCSogY29uZmlnL3RjLWkzODYuYyAoRU5DT0RFX1JFTEFYX1NUQVRFKTogQ2FzdCB0byByZWxheF9zdWJzdGF0ZVQuCisJKHNfYnNzKTogQWRkIGludCBhcmd1bWVudC4KKwkoZml0c19pbl9zaWduZWRfYnl0ZSwgc21hbGxlc3RfaW1tX3R5cGUpOiBNYWtlIGFyZ3VtZW50IHVuc2lnbmVkLgorCShkdW1teSk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCisJKG1kX2Fzc2VtYmxlKTogUmVuYW1lIGxvY2FsIG8gdG8gb3AgdG8gYXZvaWQgc2hhZG93aW5nLgorCSh0Y19nZW5fcmVsb2MpOiBSZW5hbWUgbG9jYWwgcmVsb2MgdG8gcmVsIHRvIGF2b2lkIHNoYWRvd2luZy4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfZGF0YTEsIHNfZGF0YTIpOiBBZGQgaW50IGFyZ3VtZW50LgorCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgbWRfYXBwbHlfZml4KTogQ2FzdCB0byBsb25nIGFuZCB1c2UKKwklbGQgaW4gZXJyb3IgbWVzc2FnZXMuCisJKiBjb25maWcvdGMtc3BhcmMuYzogUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMuCisJKGdldEV4cHJlc3Npb24pOiBSZXdyaXRlIGNvbmRpdGlvbiB0byBhdm9pZCBlbXB0eSBjb25kaXRpb25hbAorCWJvZHkuCisJKHNfcmVnLCBzX3Byb2MsIHNfcmVzZXJ2ZSwgc19jb21tb24sIHNfc2VnLCBzX3h3b3JkKTogQWRkIGludAorCWFyZ3VtZW50LgorCitUaHUgU2VwICA5IDE3OjEwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCUNoYW5nZXMgZnJvbSBKZWZmIExhdzoKKworCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBGaXggdHlwby4KKwkocGFfaXApOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBhbmQgbGFiZWxzLiAgRG8gbm90IGNoZWNrIGZvcgorCXVuc2lnbmVkIHZhbHVlcyBiZWluZyA8IDAsIGl0IGNhbid0IGhhcHBlbi4KKwkoaXNfc2FtZV9mcmFnKTogUmV0dXJuIGEgdmFsdWUgaW4gcmVjdXJzaXZlIGNhbGwgY2FzZS4KKwkocGFfY2FsbGluZm8pOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlcyBhbmQgbGFiZWxzLgorCShwYV9jb21tKTogTGlrZXdpc2UuCisJKHBhX2NvcHlyaWdodCk6IExpa2V3aXNlLgorCShwYV9leHBvcnQpOiBMaWtld2lzZS4KKwkocGFfaW1wb3J0KTogTGlrZXdpc2UuCisJKHBhX3BhcmFtKTogTGlrZXdpc2UuCisJKHBhX3NwYWNlKTogTGlrZXdpc2UuCisJKHBhX3N1YnNwYWNlKTogTGlrZXdpc2UuCisKK1RodSBTZXAgIDkgMTU6MDU6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQsIHNfc3RhYl9nZW5lcmljKTogSWYKKwlCRkRfQVNTRU1CTEVSLCBjYWxsIHN1YnNlZ19zZXQgcmF0aGVyIHRoYW4gc3Vic2VnX25ldy4KKworV2VkIFNlcCAgOCAxNTowOToxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfTE9BRCB3aGVuIHVzaW5nCisJZGVmYXVsdCBmbGFnIHZhbHVlcy4KKworVHVlIFNlcCAgNyAxMDoyMjo1MiAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCisKKwkqIHJlYWQuYzogKGNoYW5nZV90b19zZWN0aW9uKTogRG9uJ3QgaW5jbHVkZSBib2R5IGlmIG5vdCBNQU5ZX1NFQ1RJT05TLgorCisJKiByZWFkLmM6IChzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6IE5ldyBmdW5jdGlvbnMgdG8gcGFyc2UKKwl2YXJpb3VzIHN0YWItcmVsYXRlZCBkaXJlY3RpdmVzLgorCSogcmVhZC5oOiAoc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOiBOZXcgZnVuY3Rpb24gcHJvdG90eXBlcy4KKwkqIHdyaXRlLmM6IChtZXJnZV9kYXRhX2ludG9fdGV4dCk6IEZpeCBpZmRlZiB0YW5nbGUuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3VycmVudF9zdGFiX3N5bWJvbCk6IEZha2Ugc3ltYm9sCisJZm9yIHN0YWIgcmVhZGVyIHRvIHVzZS4KKwkqIGNvbmZpZy9vYmotY29mZmJmZGguaCAob2JqX3N5bWJvbF90eXBlKTogQWRkZWQgZmllbGRzIGZvcgorCXN0YWIgcmVhZGVyLCBtYWNyb3MgdG8gYWNjZXNzLgorCitGcmkgU2VwICAzIDE2OjQ0OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IE5vIGxvbmdlciBzcGVjaWFsLWNhc2VkIG9uCisJc3BhcmN2OSwgc2luY2UgZWxmX3N5bWJvbF90eXBlIGlzIG5vdyBpbmRlcGVuZGVudCBvZiBzaXplLgorCisJKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogRml4ZWQgbmFtZSBvZiBlbGZfc3ltYm9sX3R5cGUuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKHN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QsIHN0cnVjdAorCWRlZmF1bHRfc3BhY2VfZGljdCk6IEZpZWxkICJzb3J0IiBpcyBub3cgdW5zaWduZWQgY2hhci4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcyk6IEFsaWduCisJY29sdW1ucyBmb3IgZWFzaWVyIHJlYWRpbmcuCisJKGJjbXAsIGluZGV4KTogRGVsZXRlZCBVU0ctc3BlY2lmaWMgZGVmaW5pdGlvbnMuICBTaG91bGQgYmUgZGVhbHQKKwl3aXRoIGluIGhvLSouaCwgb3IgaW4gbGliaWJlcnR5LiAgQ2hhbmdlZCBtZW50aW9uIG9mIGluZGV4IHRvCisJc3RyY2hyLgorCShsYWJlbF9zeW1ib2xQLCBsYWJlbF9zeW1ib2xfZGVmaW5lZCwgY2FsbGluZm9fZm91bmQsCisJd2l0aGluX2VudHJ5X2V4aXQsIGV4aXRfcHJvY2Vzc2luZ19jb21wbGV0ZSwgd2l0aGluX3Byb2NlZHVyZSwKKwlwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzLCBwYV9wc2V1ZG9fb3BfbW92ZXNfcGMsCisJbGFiZWxfc3ltYm9sc19yb290UCwgcGFfZ2V0X2xhYmVsLCBwYV9sYWJlbF9pc19kZWZpbmVkLAorCXBhX3VuZGVmaW5lX2xhYmVsKTogTm93IHN0YXRpYy4KKwkobW92ZXJzKTogTm93IGNvbnN0LCBpbiBhZGRpdGlvbiB0byBwb2ludGluZyB0byBjb25zdCBkYXRhLgorCSogY29uZmlnL3RjLWhwcGEuaCAobGFiZWxfc3ltYm9sU19yb290UCwgcGFfZ2V0X2xhYmVsLAorCXBhX2xhYmVsX2lzX2RlZmluZWQsIHBhX3VuZGVmaW5lX2xhYmVsLCBwYV9wc2V1ZG9fb3BfbW92ZXNfcGMpOgorCURlbGV0ZSBkZWNsYXJhdGlvbnMuCisKKwlNZXJnZWQgbW9yZSBjaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbToKKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3N1YnNwYWNlcyk6IFJlbW92ZQorCWVudHJpZXMgZm9yIC5zdGFiIGFuZCAuc3RhYnN0ci4KKworCSogY29uZmlnL29iai1lbGYuYzogKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiAgU2V0IHRoZQorCVNFQ19MT0FEIGF0dHJpYnV0ZSBmb3IgdGhlIC5zdGFic3RyIHNlY3Rpb24uCisJKG9ial9lbGZfc3RhYl9nZW5lcmljKTogIFNldCB0aGUgU0VDX0xPQUQgYXR0cmlidXRlIGZvciB0aGUKKwkuc3RhYiBzZWN0aW9uLgorCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBDaGFuZ2UgJyNpZiAxJyB0byAnI2lmIDAnLgorCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBJbmNvcnJlY3QgYnl0ZSBjb3VudCBvbiBjYWxsIHRvCisJbWRfbnVtYmVyX3RvX2NoYXJzIGZ1bmN0aW9uLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IFN0YXRpYyBmdW5jdGlvbnMgbmVlZAorCWFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyB0b28uCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N0cmluZ2VyKTogQ29ycmVjdGx5IGhhbmRsZSBlc2NhcGluZworCWNoYXJhY3RlcnMgd2hpY2ggc2hvdWxkIGFwcGVhciB1bmFsdGVyZWQgaW4gdGhlIG91dHB1dCBzdHJpbmcgKGZvcgorCWV4YW1wbGUgYW4gZXNjYXBlZCBkb3VibGUtcXVvdGUpLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IEFsd2F5cworCWluaXRpYWxpemUgbmFtZS4KKwkocGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIpOiBMaWtld2lzZS4KKwkocGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KKwkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLWhwcGEuaCAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBSZW1vdmUgcHJvdG90eXBlCisJZm9yIG5vdy4KKwkoY29uc19maXhfbmV3X2hwcGEpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEZpeCB0eXBlIG9mIHZhbHAgdG8gbWF0Y2gKKwlwcm90b3R5cGUuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgbGliaHBwYS5oLgorCisJKiBjb25maWcvdGMtaHBwYS5oOiBEZWxldGUgZXh0ZXJuIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMKKwlmb3VuZCBpbiBsaWJocHBhLmguCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NwYWNlKTogUmV3b3JrIHRvIGF2b2lkIHVud2FudGVkICNpZmRlZgorCU9CSl9FTEYgY29uZGl0aW9uYWxzLgorCSogY29uZmlnL3RjLWhwcGEuaCAoTE9DQUxfTEFCRUwpOiBDb3JyZWN0bHkgaWRlbnRpZnkgbG9jYWwgbGFiZWxzCisJb24gdGhlIFBBLgorCitUaHUgU2VwICAyIDEwOjQzOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBBY2NlcHQgJ3onLCBhbmQgaWdub3JlIGl0LgorCShtYWNybyk6IFVzZSAieixzLHQiIGZvciBkaXYgaW5zdHJ1Y3Rpb25zIHRvIG1hdGNoIGNvcnJlc3BvbmRpbmcKKwljaGFuZ2UgaW4gb3Bjb2RlIHRhYmxlLgorCShtaXBzX2lwKTogQWRkZWQgJ3onLS1tdXN0IGJlIHplcm8gcmVnaXN0ZXIuCisKK1dlZCBTZXAgIDEgMTU6NTY6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpIFtSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEVdOiBEZWNsYXJlCisJdGNfZ2VuX3JlbG9jIGNvcnJlY3RseS4KKworCSogY29uZmlndXJlLmluOiBVc2UgImNhc2UiIGluc3RlYWQgb2YgImlmIiB3aGVuIHBvc3NpYmxlLiAgUmV3cm90ZQorCU1ha2VmaWxlIGVkaXRpbmcgdG8gcmVkdWNlIHdvcmsgZG9uZS4gIFRyZWF0ICJocHBhKiIgYXMgImhwcGEiLgorCitXZWQgU2VwICAxIDEyOjE5OjA3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBhZGQgJ2QnIGFzIGFuIGFsaWFzIGZvcgorCSAgc2VjdGlvbiB0eXBlIG9mIGRhdGEuICAnZCcgc2VlbXMgdG8gYmUgdXNlZCBmb3IgbTg4ay4KKworV2VkIEF1ZyAyNSAyMjozMzoyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYWxpZ24sIHNfc3RyaW5nZXIsIHNfY29ucywgc19mbG9hdF9jb25zLAorCXNfbWlwc19zcGFjZSk6IFNldCBpbnNuX2xhYmVsIHRvIE5VTEwgdG8gYXZvaWQgY2hhbmdpbmcgaXQgYXQgdGhlCisJbmV4dCAuYWxpZ24gc3RhdGVtZW50LgorCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgamFsIHdpdGggaW5zdHJ1Y3Rpb24gdGhhdCBzZXRzIHRoZQorCXJlZ2lzdGVyIHRoYXQgamFsIHNldHMuCisKK1dlZCBBdWcgMjUgMTY6MTU6NTcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtODgxMTAuCisKK1dlZCBBdWcgMjUgMTM6Mzc6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJTWVyZ2VkIGNoYW5nZXMgZnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3IGF0IFV0YWg6CisJKiBjb25maWcvdGMtaHBwYS5jIChwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBTRUNfQUxMT0Mgc2hvdWxkCisJbm90IGJlIG9uIGZvciAuaHBwYV91bndpbmQuCisJKG1kX3BzZXVkb190YWJsZSk6IC5QQVJBTSBhbmQgLnBhcmFtIGFyZSB2YWxpZCBwc2V1ZG8tb3BzIGZvciBHQVMuCisJKHBhX3BhcmFtKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSAuUEFSQU0gZGlyZWN0aXZlcy4KKwkocGFfaXApOiBQYXNzICJpc2JyYW5jaCIgYXJndW1lbnQgZG93biB0byBwYV9wYXJzZV8qX2NvbXBsdHIKKwlmdW5jdGlvbnMuICBIYW5kbGUgJ3wnIGZvciBtb3ZiOyBhbGxvdyBtb3ZiLG4uCisJKHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyKTogRGVsZXRlIG9sZCB1c2VsZXNzCisJdmVyc2lvbi4gIEhhbmRsZSBjYXNlcyB3aGVyZSBubyBjb21wbGV0ZXIgZXhpc3RzIGZvcgorCWNvbWIsbiBvciBhZGRiLG4uCisJKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogSGFuZGxlIGNhc2VzIHdoZXJlIG5vCisJY29tcGxldGVyIGV4aXN0cyBmb3IgY29tYixuIG9yIGFkZGIsbi4gIE1ha2UgbG9naWMKKwltaXJyb3IgdGhhdCBvZiBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ci4KKwkocGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KKwkocGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIpOiBMaWtld2lzZS4KKwkqIHRjLWhwcGEuaCAocGFfcGFyYW0pOiBEZWNsYXJlLgorCitUdWUgQXVnIDI0IDE1OjQxOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IE5vdyBzdGF0aWMuCisJQWRkZWQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KKworCU1lcmdlZCBjaGFuZ2VzIGZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdyBhdCBVdGFoOgorCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9maWxlKTogQXJndW1lbnRzIHdlcmUgaW5jb3JyZWN0IG9uCisJY2FsbCB0byBlbGZfdGNfbWFrZV9zZWN0aW9ucy4KKwkob2JqX2VsZl92ZXJzaW9uKTogQSAubm90ZSBzZWN0aW9uIHNob3VsZG4ndCBoYXZlIHRoZSBTRUNfQUxMT0MKKwlhdHRyaWJ1dGUuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IEFkZCBzb21lIHByb2Nlc3NpbmcgdG8KKwloYW5kbGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIHRvCisJY3JlYXRlIGEgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgorCShwYV9leHBvcnRfYXJncyk6IE1ha2UgY2FsbCB0byBwYV9idWlsZF9zeW1leHRuX3NlY3Rpb24uCisJKGhwcGFfdGNfc3ltYm9sLCBocHBhX3RjX21ha2Vfc2VjdGlvbnMsCisJaHBwYV90Y19tYWtlX3N5bWV4dG5fc2VjdGlvbik6IE5ldyBmdW5jdGlvbnMuCisJKiBjb25maWcvdGMtaHBwYS5oOiBVcGRhdGUgZWxmX3RjX3N5bWJvbCBhbmQgZWxmX3RjX21ha2Vfc2VjdGlvbnMKKwltYWNyb3MuCisKKwkqIHJlYWQuYyAoZW1pdF9leHByKTogUGxhY2UgY2hlY2sgZm9yIFRDX0NPTlNfRklYX05FVyBpbiB0aGUKKwlCRkRfQVNTRU1CTEVSIGJyYW5jaCBhcyB3ZWxsLgorCisJKiBjb25maWcvdGMtaHBwYS5oOiBJZiBFTEYgaXMgdGhlIHRhcmdldCBvYmplY3QgZm9ybWF0LCBkZWZpbmUKKwlzb21lIEVMRi0gYW5kIGhwcGEtc3BlY2lmaWMgdHlwZXMgYW5kIGNvbnN0YW50cy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAoZ2V0RXhwcmVzc2lvbik6IEZpeCBhIHR5cG8uCisKKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIFRDX0VRVUFMX0lOX0lOU04gdG8gZGV0ZXJtaW5lCisJaWYgYSBgPScgaXMgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4KKwkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIGNhc2Ugd2hlcmUgZW5kLW9mLWxpbmUgbWFya2VycyBhcmUKKwlhbHNvIHVzZWQgd2l0aGluIGluc3RydWN0aW9ucy4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0VRVUFMX0lOX0lOU04sIFRDX0VPTF9JTl9JTlNOKTogRGVmaW5lLgorCisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IEtlZXAgcmVsb2NhdGlvbnMgZm9yCisJb3V0LW9mLXJhbmdlIGJyYW5jaGVzLydjYWxscyB1c2luZyAiYmwiIG9yIGNhbGxzIHdoaWNoIG1heSBuZWVkCisJYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicy4gIERvIG5vdCBuZWVkL2tlZXAgcmVsb2NhdGlvbnMgZm9yCisJY29uZGl0aW9uYWwgYnJhbmNoZXMuCisJKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBGaXggY2FsY3VsYXRpb24gb2YgZnVuY3Rpb24gc2l6ZS4KKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92ZXJzaW9uKTogTWFyayAubm90ZSBzZWN0aW9uIGFzCisJUkVBRE9OTFkuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogUGFzcyBleHAsIG5vdCB0aGUKKwlhZGRyZXNzIG9mIGV4cCwgdG8gZXhwcmVzc2lvbi4KKwkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogVHVybiBTRUNfSEFTX0NPTlRFTlRTIGZsYWcgb24uCisJKG1kX2FwcGx5X2ZpeF8xKTogRGVsZXRlIHVud2FudGVkIGNvbW1lbnRzLgorCShwcm9jZXNzX2V4aXQpOiBTeW1ib2xzIG1hcmtpbmcgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBhbHdheXMKKwlCU0ZfTE9DQUwuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IEluY2x1ZGUgZWxmMzItaHBwYS5oIGZyb20gQkZEIHRyZWUuCisJKHBhX3NwYWNlKTogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBnZGJfc2VjdGlvbi4KKworCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IENoYW5nZQorCWVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2sgdG8gZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IEZpeCBhcmd1bWVudCBsaXN0IHRvIG1hdGNoCisJYXJndW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMuCisJKGdldEV4cHJlc3Npb24pOiBGaXggdHlwby4KKwkocGFfZXhwb3J0X2FyZ3MpOiBDaGFuZ2UgZWxmX3N5bWJvbF90eXBlIHRvIGVsZjMyX3N5bWJvbF90eXBlLgorCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogTGlrZXdpc2UuICBOYW1lIGNoYW5nZWQgZnJvbQorCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vay4KKwkoc3RhcnRfc3ltYm9sX3Jvb3QsIHN0YXJ0X3N5bWJvbF9sYXN0KTogRGVsZXRlZC4KKworCSogY29uZmlnL3RjLWhwcGEuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKTogRml4IHR5cG8uCisKKwkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlcGxhY2UgInN5bWJvbFMiIHdpdGggInN0cnVjdCBzeW1ib2wiIHRvCisJYXZvaWQgY2hhbmdpbmcgaW5jbHVkZSBvcmRlcmluZy4KKworCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ3knKTogSGFuZGxlIGp1c3QgbGlrZSAndCcuCisKK01vbiBBdWcgMjMgMTI6NDc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChzZXRfYXQpOiBBZGRlZCB1bnNpZ25lZHAgYXJndW1lbnQuICBVc2UKKwlsb2FkX3JlZ2lzdGVyLgorCShzZXRfYXRfdW5zaWduZWQpOiBSZW1vdmVkOyBjaGFuZ2VkIGNhbGxlcnMgdG8gdXNlIHNldF9hdC4KKwkobG9hZF9yZWdpc3Rlcik6IFJlbW92ZWQgdW51c2VkIGlwIGFyZ3VtZW50LiAgQ2hhbmdlZCBjYWxsZXJzLgorCShhcHBlbmRfaW5zbik6IERvbid0IHN3YXAgYnJhbmNoIGFuZCBicmFuY2ggbGlrZWx5LgorCShtYWNyb19idWlsZCk6IEhhbmRsZSAndScuCisJKGxvYWRfcmVnaXN0ZXIpOiBIYW5kbGUgNjQgYml0IGNvbnN0YW50cy4KKwkobWFjcm8pOiBBZGRlZCBNX0RBQlMsIHJlbW92ZWQgTV9BQlNVLiAgTnVtZXJvdXMgY2hhbmdlcyB0bworCXN1cHBvcnQgNjQgYml0IGNvbnN0YW50cy4KKwkobWlwc19pcCk6IFVzZSBoZXggY29uc3RhbnRzIGluIHJhbmdlIGNoZWNrcyBmb3IgY2xhcml0eS4KKwkobWRfbnVtYmVyX3RvX2NoYXJzKTogU3VwcG9ydCA4IGJ5dGUgdmFsdWVzLgorCitGcmkgQXVnIDIwIDE2OjUwOjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW04OGsuaDogdXBkYXRlZCBjb3B5cmlnaHRzLgorCSAgKFRDX0NPTlNfUkVMT0MpOiBkZWNsYXJlIHRvIGJlIFJFTE9DXzMyLgorCitGcmkgQXVnIDIwIDExOjE2OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pc2EpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtZF9iZWdpbik6IEluaXRpYWxpemUgbWlwc19pc2EgYmFzZWQgb24gVEFSR0VUX0NQVS4gIERvbid0IHNhbml0eQorCWNoZWNrIG1hY3Jvcy4gIFNldCB0ZXh0IGFsaWdubWVudCBhbmQgR1Agc2l6ZSBoZXJlLgorCShtZF9hc3NlbWJsZSk6IERvbid0IHNldCB0ZXh0IGFsaWdubWVudCBhbmQgR1Agc2l6ZSBoZXJlLgorCShhcHBlbmRfaW5zbik6IERvbid0IGluc2VydCBOT1BzIGZvciBsb2FkIGRlbGF5cyBpZiBtaXBzX2lzYSA+PSAyLgorCVVzZSB0aGUgcmlnaHQgbWFzayBhbmQgc2hpZnQgZm9yIFdSSVRFX0ZQUl9UIGFuZCBXUklURV9GUFJfUy4gIEFkZAorCWEgTk9QIGFmdGVyIGEgYnJhbmNoIGxpa2VseS4KKwkobWlwc19lbWl0X2RlbGF5cyk6IERvbid0IGluc2VydCBOT1BTIGZvciBsb2FkIGRlbGF5cyBpZiBtaXBzX2lzYQorCT49IDIuCisJKG1hY3JvKTogU3VwcG9ydCByNjAwMCBhbmQgcjQwMDAgbWFjcm9zLgorCShtaXBzX2lwKTogQ2hlY2sgaW5zbiBJU0EgbGV2ZWwgYWdhaW5zdCBtaXBzX2lzYSBiZWZvcmUgdXNpbmcgaXQuCisJQWRkZWQgJ3gnIGNhc2UgZm9yIGlnbm9yZWQgcmVnaXN0ZXIuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAtbWlwc04gYW5kIC1tY3B1PVhYLgorCitGcmkgQXVnIDIwIDAxOjI2OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKSBbT0JKX0VMRl06IEhhbmRsZSAiLnplcm8iLgorCitUaHUgQXVnIDE5IDEyOjE1OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfbG9jYWwpOiBGdW5jdGlvbiBtb3ZlZCBhbmQgcmVuYW1lZC4uLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9sb2NhbCk6IC4uLnRvIGhlcmUuCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKSwgY29uZmlnL29iai1lbGYuYworCShvYmpfcHNldWRvX3RhYmxlKTogTW92ZSBoYW5kbGluZyBvZiAiLmxvY2FsIi4KKworCSogdGMuaCAobWRfcGFyc2Vfb3B0aW9uKTogRG9uJ3QgZGVjbGFyZSBpZiBkZWZpbmVkIGFzIGEgbWFjcm8uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKE5PX1JFTE9DKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZSBhcworCUJGRF9SRUxPQ19OT05FLgorCShtZF9wYXJzZV9vcHRpb24pOiBOZXcgbWFjcm8sIGNvbnZlcnRlZCBmcm9tIGZ1bmN0aW9uLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfcGFyc2Vfb3B0aW9uKTogRnVuY3Rpb24gZGVsZXRlZC4KKwkoY29tbWVudF9jaGFycykgW09CSl9FTEZdOiBJbmNsdWRlICIvIi4KKwkobGluZV9jb21tZW50X2NoYXJzKSBbT0JKX0VMRiB8fCBURV9JMzg2QUlYXTogRG9uJ3QgaW5jbHVkZSAiLyIuCisJKG1kX2Fzc2VtYmxlKTogQ2FzdCAweGU5IHRvIGNoYXIgZXhwbGljaXRseSwgdG8gYXZvaWQgY29tcGlsZXIKKwl3YXJuaW5nLgorCShtZF9hc3NlbWJsZSwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOgorCUNhbGwgcmVsb2MgZm9yIGZpeF9uZXcgdHlwZSwgb3IgdXNlIGNvcnJlY3QgZW51bWVyYXRvciwgaW5zdGVhZCBvZgorCWFsd2F5cyB1c2luZyBOT19SRUxPQy4KKwkoaTM4Nl9vcGVyYW5kKTogQ2hhbmdlICJpZm5kZWYgSTM4NkNPRkYiIHRvICJpZmRlZiBPQkpfQU9VVCIgZm9yCisJdGVzdHMgZm9yIHZhbGlkIHNlY3Rpb24uCisJKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBDb21wZW5zYXRlIGZvciBmcmFnIHN0YXJ0CisJYWRkcmVzcy4KKwkobWRfYXBwbHlfZml4XzEpIFtCRkRfQVNTRU1CTEVSXTogRm9yIHBjLXJlbGF0aXZlIHJlbG9jIHdpdGgKKwlzeW1ib2wsIGNvbXBlbnNhdGUgZm9yIGxvY2F0aW9uIG9mIHJlbG9jLgorCShyZWxvYywgQkZEX1JFTE9DXzMyLCBCRkRfUkVMT0NfMzJfUENSRUwpIFshQkZEX0FTU0VNQkxFUl06IERlZmluZQorCXRvIHJldHVybiB6ZXJvLgorCitXZWQgQXVnIDE4IDE2OjUxOjI5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuYzogVW5kZWYgTk9fUkVMT0MgYmVmb3JlIGluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgorCShvYmpfZWxmX3dlYWspOiBOZXcgZnVuY3Rpb24uCisJKG9ial9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgIi53ZWFrIi4KKwkob2JqX2VsZl9zZWN0aW9uKTogSWYgc2VjdGlvbiBkaXJlY3RpdmUgaW5jbHVkZXMgYSBzdHJpbmcsIGlnbm9yZQorCWl0IGZvciBub3cuICBBY2NlcHQgInByb2diaXRzIiBmbGFnLgorCShvYmpfZWxmX3R5cGUpOiBBY2NlcHQgYEAnIGJlZm9yZSBmbGFnIG5hbWUuCisKKwkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBHZXQgcmlkIG9mIGBpZigxKScKKwljb25kaXRpb24uCisJKGZpeHVwX3NlZ21lbnQpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9pc19jb21fc2VjdGlvbiwgcmF0aGVyCisJdGhhbiBjaGVja2luZyBmb3IgYmZkX2NvbV9zZWN0aW9uIGRpcmVjdGx5LgorCShmaXh1cF9zZWdtZW50KTogU2ltcGxpZnkgcmFuZ2UgY2hlY2suCisJKGZpeHVwX3NlZ21lbnQpIFtPQkpfQ09GRiAmJiBUQ19JOTYwXTogU2ltcGxpZnkgY3BwIGNvbmRpdGlvbgorCXRlc3QuCisKKwkqIHN5bWJvbHMuaCAoU19TRVRfV0VBSyk6IERlY2xhcmUuCisJKiBzeW1ib2xzLmMgKFNfU0VUX1dFQUspOiBOZXcgZnVuY3Rpb24uCisJKFNfU0VUX0VYVEVSTkFMLCBTX0NMRUFSX0VYVEVSTkFMKTogRG9uJ3QgYm90aGVyIHdpdGggQlNGX0VYUE9SVCwKKwlpdCdzIG5vdCBhIHNlcGFyYXRlIGZsYWcgYW55IG1vcmUuICBDbGVhciBCU0ZfV0VBSy4KKworCSogcmVhZC5jIChwb3RhYmxlKTogVHJlYXQgInN0cmluZyIgbGlrZSAiYXNjaXoiLgorCitXZWQgQXVnIDE4IDE1OjMwOjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbnMKKwlpZiAuc2V0IG5vYm9wdCBvciAuc2V0IHZvbGF0aWxlLgorCShncF9yZWZlcmVuY2UpOiAubGl0OCBhbmQgLmxpdDQgYXJlIGFjY2Vzc2VkIHZpYSB0aGUgR1AgcmVnaXN0ZXIuCisJKG1hY3JvKTogQWRkZWQgY2FzZXMgTV9MSV9TLCBNX0xJX1NTLiAgRml4ZWQgTV9MSV9EIGFuZCBNX0xJX0RELgorCShtaXBzX2lwKTogQWRkZWQgY2FzZXMgJ0YnLCAnTCcsICdmJywgJ2wnIGZvciBmbG9hdGluZyBwb2ludC4KKwkqIGNvbmZpZy9vYmotZWNvZmYuYzogUmVuYW1lZCBzb21lIHZhcmlhYmxlcyB0byBhdm9pZCBzaGFkb3cKKwl3YXJuaW5ncy4KKworTW9uIEF1ZyAxNiAxNDoxNjowMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0NPTU1PTik6IGFkZCBtaXNzaW5nIGJhY2tzbGFzaAorCisJKiBjb25maWd1cmUuaW4gKHo4ay0qLXtjb2ZmLHNpbX0pOiB1c2UgY29mZmJmZCBmb3IgdGhpcyB0YXJnZXQKKworVGh1IEF1ZyAxMiAxMTo0Nzo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBTdWdnZXN0ZWQgYnkKKwlkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBEb24ndCBhY2NlcHQgc3ltYm9saWMKKwluYW1lcyBmb3IgJ0UnIGFuZCAnRycgYXJndW1lbnQgdHlwZXMgKGNvcHJvY2Vzc29yIHJlZ2lzdGVycykgYW5kCisJZG9uJ3Qgd2FybiBpZiAkMSBpcyB1c2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KKwkobWFjcm8pOiBIYW5kbGUgTV97TCxTfVdDezAsMiwzfV9BQiBjb3JyZWN0bHkuCisKK01vbiBBdWcgIDkgMTI6MDk6MTQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgQkZEX1JFTE9DXzE2IGZvciAyLWJ5dGUgdmFsdWVzLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlCisJQkZEX1JFTE9DXzE2LgorCSogY29uZmlnL3RjLXNwYXJjLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCisKK01vbiBBdWcgIDkgMTM6MzY6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jIChtZXJnZV9kYXRhX2ludG9fdGV4dCk6IERlZmluZSBvbmx5IGlmIEJGRF9BU1NFTUJMRVIgaXMKKwlkZWZpbmVkIG9yIEJGRCBpcyBub3QuCisJKHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IERlY2xhcmUgbG9jYWwgdmFyaWFibGUgZnJhZ1AuCisKK0ZyaSBBdWcgIDYgMTU6MjI6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4LCBjYXNlIEJGRF9SRUxPQ18zMik6IEZpbGwgaW4KKwlieXRlcyB3aXRoIHJlYWwgdmFsdWVzLCBub3QgemVyb3MuCisKK0ZyaSBBdWcgIDYgMTA6NTc6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKG1pcHMtKi1yaXNjb3MqLCBtaXBzLSotc3lzdiopOiBOZXcgKHVudGVzdGVkKQorCXRhcmdldHMsIHVzaW5nIGVjb2ZmIGFuZCBtaXBzLWJpZy4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZAorCUpvaG5zb24pOiBBZGRlZCBjYXNlIGZvciAnQycgZm9yIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNvZGVzLgorCitUaHUgQXVnICA1IDEzOjA4OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfNjQpOiBGaWxsIGluCisJYnl0ZXMgd2l0aCByZWFsIHZhbHVlcywgbm90IHplcm9zLgorCShtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIGNvbnMgZm9yIC51YXh3b3JkLgorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlICIuOGJ5dGUiLgorCisJKiByZWFkLmMgKGVtaXRfZXhwcik6IFVzZSBCRkRfUkVMT0NfNjQgZm9yIDgtYnl0ZSBleHByZXNzaW9ucy4KKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBUZXN0IERFQlVHX1NZTVMgaW5zdGVhZCBvZiBERUJVRworCWZvciB2ZXJpZnlpbmcgc3ltYm9sIGNoYWluLgorCShtZXJnZV9kYXRhX2ludG9fdGV4dCwgcmVsYXhfYW5kX3NpemVfYWxsX3NlZ21lbnRzKTogTmV3CisJZnVuY3Rpb25zLCBzcGxpdCBvdXQgZnJvbSB3cml0ZV9vYmplY3RfZmlsZS4KKworVHVlIEF1ZyAgMyAxNTo0Mzo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljLCBpbiBkaXNhYmxlZCBjb2RlKTogSWYKKwlkZWJ1ZyBzZWN0aW9uIGlzIG5ldywgYWxsb2NhdGUgYW4gZXh0cmEgMTIgYnl0ZXMgYXQgaXRzIHN0YXJ0LiAgSWYKKwkiLnN0YWJzIiB0eXBlIGlzIE5fU08sIGZpbGwgaW4gZmlsZW5hbWUgc3ltYm9sIGZpZWxkIG9mIHRoYXQgZmlyc3QKKwllbnRyeS4gIFJldHVybiBlYXJseSBpZiAiZ29vZiIsIHRvIHNpbXBsaWZ5IGxhdGVyIGNvZGUgc2xpZ2h0bHkuCisJKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgorCShlbGZfZnJvYl9maWxlKTogQXBwbHkgYWRqdXN0X3N0YWJfc2VjdGlvbnMgdG8gZWFjaCBzZWN0aW9uLgorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfcHJldmlvdXMpOiBObyBsb25nZXIKKwlzdGF0aWMuCisJKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfcHJldmlvdXMpOiBEZWNsYXJlLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IENhbGwgdGhlbSBmb3IgInB1c2hzZWN0aW9uIgorCWFuZCAicG9wc2VjdGlvbiIsIGFuZCBjYWxsIGNvbnMgZm9yICJ1YXdvcmQiIGFuZCAidWFoYWxmIi4KKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl92ZXJzaW9uKTogVXNlIEVuZ2xpc2ggaW4gZXJyb3IKKwltZXNzYWdlcy4KKworVHVlIEF1ZyAgMyAxMToyOTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWNvZmYuYzogVXBkYXRlZCBmb3IgQkZEIEVDT0ZGIGNoYW5nZXMuICBOb3cgZ2V0cyB0aGUKKwlzd2FwcGluZyByb3V0aW5lcyBhbmQgZXh0ZXJuYWwgc3RydWN0dXJlIHNpemVzIHZpYSB0aGUKKwllY29mZl9iYWNrZW5kIGluZm9ybWF0aW9uLiAgTm8gbG9uZ2VyIGluY2x1ZGVzIGNvZmYvbWlwcy5oLgorCitNb24gQXVnICAyIDE3OjM1OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5jIChnZXRfdGFnKTogU2F2ZSB0YWcgbmFtZSBpbiBwZXJtYW5lbnQgbWVtb3J5CisJYW5kIGluIGhhc2hfcHRyLT5zdHJpbmcuCisKKwkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBSZXNldCBzdGF0ZSB0byAwIGFmdGVyIC5hcHBsaW5lIGlmCisJZmlsZSBuYW1lIGlzIG5vdCBzZWVuLgorCitNb24gQXVnICAyIDExOjUxOjQxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfNjQpOiBOZXcgY2FzZSwKKwlwYXJhbGxlbCB0byBCRkRfUkVMT0NfMzIuCisJKHRjX2dlbl9yZWxvYyk6IEFjY2VwdCBCRkRfUkVMT0NfNjQuCisKK1RodSBKdWwgMjkgMjI6MjE6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB3cml0ZS5jOiBEb24ndCB1c2Ugc2hvcnQgaW50IGluIGEgcHJvdG90eXBlLgorCisJKiBleHByLmMgKG9wZXJhbmQpOiBNYWtlIHJldHVybiB2YWx1ZSBzaW1wbHkgZGVwZW5kIG9uIGNvbnRlbnRzIG9mCisJcmV0dXJuZWQgZXhwcmVzc2lvbi4KKworVGh1IEp1bCAyOSAxODozODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogc3BhcmMqLWFvdXQgYW5kIHNwYXJjKi12eHdvcmtzIGFyZSBCRkQgYXNzZW1ibGVycworCitUaHUgSnVsIDI5IDE4OjM4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2hvLXN1bm9zLmg6IHJlbW92ZSBzb21lIG9sZCBmdW5jdGlvbiBkZWNscyB0aGF0IGNvbmZsaWN0CisJdy8gQU5TSSwgYW5kIHdoaWNoIHdlcmVuJ3QgbmVlZGVkIGFueXdheQorCitXZWQgSnVsIDI4IDE2OjM0OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2Jfc3ltYm9sKTogUmVuYW1lZCBmcm9tIHRjX2Zyb2Jfc3ltYm9sLAorCWFuZCBkaXNhYmxlZCBzaW5jZSBpdCBicmVha3MgSWFuJ3MgbmV3IHN5bWJvbC12YWx1ZSBjb2RlLgorCisJKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBBY2NlcHQgbW9yZSBkaWdpdHMgaWYgQkZENjQuCisKK1dlZCBKdWwgMjggMTE6MzA6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSWYgd2UgaGF2ZSBhIG5vcm1hbCBjb25zdGFudCB3aGVuIHdlCisJZXhwZWN0IGEgYmlnbnVtLCB0dXJuIGl0IGludG8gYSBiaWdudW0uICBPdXRwdXQgZXh0cmEgemVyb2VzCisJYmVmb3JlIGEgc2hvcnQgYmlnbnVtLCByYXRoZXIgdGhhbiBhZnRlci4KKworVHVlIEp1bCAyNyAxNTo1NDoyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IENvbmRpdGlvbmFsaXplIHZlcmlmeV9zeW1ib2xfY2hhaW4gY2FsbAorCW9uIERFQlVHX1NZTVMsIG5vdCBERUJVRy4KKwkoc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgorCShzeW1ib2xfaW5zZXJ0KTogTGlrZXdpc2UuCisKK1R1ZSBKdWwgMjcgMDg6NDU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX29wdGltaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoYXBwZW5kX2luc24pOiBJZiBtaXBzX29wdGltaXplID09IDAsIGFsd2F5cyBpbnNlcnQgTk9QCisJaW5zdHJ1Y3Rpb25zLiAgSWYgbWlwc19vcHRpbWl6ZSA8IDIsIGRvbid0IHN3YXAgYnJhbmNoZXMuCisJKG1kX3BhcnNlX29wdGlvbik6IElmIC1PeCBvciAtZ3gsIHNldCBtaXBzX29wdGltaXplIGFjY29yZGluZ2x5LgorCitNb24gSnVsIDI2IDE4OjAyOjQzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogaWYgdGVzdHN1aXRlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHNraXAgaXQuCisKK0ZyaSBKdWwgMjMgMTQ6MTM6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X2luc25fdW5yZW9yZGVyZWQsCisJcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbiBpZgorCXByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkIChzZWUgY29tbWVudCkuCisJKG1pcHNfbm9fcHJldl9pbnNuKTogQ2xlYXIgdGhlIHVucmVvcmRlcmVkIHZhcmlhYmxlcy4KKwkoc19taXBzc2V0KTogV2hlbiB0dXJuaW5nIG9uIHJlb3JkZXJpbmcsIHNldCB0aGUgdW5yZW9yZGVyZWQKKwl2YXJpYWJsZXMuCisKK0ZyaSBKdWwgMjMgMTM6MDk6NDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZWN0aW9ucyAiLmluaXQiIGFuZCAiLmZpbmkiCisJYXJlIGFsc28gbWFnaWMsIGFuZCBoYXZlIHNwZWNpYWwgZGVmYXVsdCBmbGFnIHNldHRpbmdzLgorCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogU2luY2UgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgZnVuY3Rpb24KKwlpc24ndCB1c2VkLCBkb24ndCBib3RoZXIgY2FsbGluZyBvYmpfZWxmX3dyaXRlX3N5bWJvbF9wLCBzaW5jZSBpdAorCWRvZXNuJ3QgYWNjb21wbGlzaCBhbnl0aGluZyBlbHNlLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2VjdGlvbl9hbGlnbik6IFJvdW5kIHVwIHNlY3Rpb24gc2l6ZSBvbmx5CisJZm9yIGEub3V0IGZvcm1hdC4KKworCSogc3ltYm9scy5jOiBEb24ndCBkZWZpbmUgREVCVUcgYnkgZGVmYXVsdC4KKworVGh1IEp1bCAyMiAxMjowOTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogSGFuZGxlIGEgT191bWludXMgZXhwcmVzc2lvbi4KKworCSogZXhwci5jIChleHByKTogRG9uJ3QgbGV0IGFic29sdXRlX3NlY3Rpb24gb3ZlcnJpZGUKKwl1bmRlZmluZWRfc2VjdGlvbiBmb3IgdGhlIHJldHVybiB2YWx1ZS4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJbiBOT19QU0VVRE9fRE9UIGNhc2UsIGlmIHdlIGZpbmQgYQorCXBzZXVkby1vcCB3aXRoIGEgcG9jX2hhbmRsZXIgZmllbGQgb2YgTlVMTCwgaWdub3JlIGl0IGFuZCB0cmVhdCBpdAorCWFzIGFuIGluc3RydWN0aW9uIGluc3RlYWQuCisJKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNldCIgd2l0aCBhIE5VTEwKKwlwb2NfaGFuZGxlciBmaWVsZC4KKworCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX2JlZ2luKTogVXNlIGEgbG9jYWwgdmFyaWFibGUgd2hlbgorCWluaXRpYWxpemluZyBtZF9yZWxheF90YWJsZSB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYQorCXN1cHBvc2VkbHkgY29uc3QgZGF0YSBzdHJ1Y3R1cmUuCisKK1RodSBKdWwgMjIgMTA6NTg6NTEgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWFvdXQuYzogT25seSBpbmNsdWRlIGFvdXQvYW91dDY0LmggaWYgQkZEX0FTU0VNQkxFUgorCWlzIGRlZmluZWQuCisKK1dlZCBKdWwgMjEgMTc6MzI6MDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2hvc3R9KTogIE1hcCAqLSotc3lzdjQqIHRvIGdhc19ob3N0PXN5c3YuCisJKiBjb25maWd1cmUuaW4gKGNhc2UgJHtnZW5lcmljX3RhcmdldH0pOiAgQWRkIGlbMzRdODYtKi1zeXN2NCoKKwljYXNlIHRvIHNldCBvYmpfZm9ybWF0PWVsZi4gIE11c3QgZ28gYmVmb3JlIGkzODYtKi1zeXN2KiBjYXNlIHRoYXQKKwlzZXRzIG9ial9mb3JtYXQ9Y29mZmJzZC4gIEFkZCAqLSotc3lzdjQqIHRvICotKi1lbGYgYW5kCisJKi0qLXNvbGFyaXMgY2FzZSwgYW5kIG1vdmUgdG8gYmVmb3JlICotc3lzdiogY2FzZSB0aGF0IHdhbnRzIHRvCisJc2V0IG9ial9mb3JtYXQgdG8gY29mZi4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBhbGwgJ2V4cC5YX29wJyB0bworCSdleHAtPlhfb3AnLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4KTogIEZpeCB2YWxwIHRvIGJlICd2YWx1ZVQgKicgZm9yCisJQkZEX0FTU0VNQkxFUiBjYXNlLgorCitXZWQgSnVsIDIxIDEyOjQ3OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1hb3V0LmM6IEluY2x1ZGUgYW91dC9hb3V0NjQuaC4KKwkob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBTZXQgQlNGX0RFQlVHR0lORyBmb3IgYSBjb25zdHJ1Y3RvcgorCXN5bWJvbCwgc28gdGhhdCBCRkQgZG9lc24ndCB0YW1wZXIgd2l0aCB0aGUgdHlwZS4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBJZiBOT19QU0VVRE9fRE9UIGlzIGRlZmluZWQsIGxvb2sKKwl1cCBvcGNvZGVzIGFzIHBzZXVkby1vcHMgZXZlbiBpZiB0aGV5IGRvbid0IHN0YXJ0IHdpdGggJy4nLgorCSogY29uZmlnL3RjLW04OGsuaCAoTk9fUFNFVURPX0RPVCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlZCBzcGVjaWFsIHBzZXVkby1vcAorCWhhbmRsaW5nLgorCShtZF9hcHBseV9maXgpOiBTZXQgZnhfb2Zmc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSByZWxvYy4KKwlPdXRwdXQgdGhlIGxvdyAxNiBiaXRzIGZvciBSRUxPQ19ISTE2LCBub3QgdGhlIGhpZ2ggMTYgYml0cy4KKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogSWYgVENfTTg4Sywgc2V0IHRoZQorCXJfb2Zmc2V0IGZpZWxkIG9mIHRoZSByZWxvYyB0byB0aGUgZml4dXAgb2Zmc2V0LgorCShmaXh1cF9zZWdtZW50cyk6IElmIFRDX004OEssIGRvbid0IHdhcm4gYWJvdXQgZml4dXAgb3ZlcmZsb3dzLgorCSogZG9jL2FzLnRleGluZm86IE1pbm9yIHVwZGF0ZXMuCisKK1R1ZSBKdWwgMjAgMTk6Mjg6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBFeHRlbnNpdmUgY2hhbmdlcyB0byBwZXJtaXQgc3ltYm9scyB0byBjb250YWluIGFueSBleHByZXNzaW9uCisJdHlwZSBhbmQgdG8gZGVsYXkgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHVudGlsIHRoZQorCXZhbHVlIGlzIGFjdHVhbGx5IG5lZWRlZC4gIFRoaXMgcGVybWl0cyBzZXR0aW5nIHN5bWJvbHMgdG8gdmFsdWVzCisJY2FsY3VsYXRlZCBiYXNlZCBvbiBvYmplY3QgY29kZSBzaXplLiAgRXhwcmVzc2lvbnMgd2VyZSBjaGFuZ2VkIHRvCisJbm8gbG9uZ2VyIGJlIGluIGEgc2VjdGlvbiwgdG8gc3RvcCB0aGUgb3ZlcmxvYWRpbmcgb2Ygc2VnbWVudCBhbmQKKwlleHByZXNzaW9uIHR5cGUgdGhhdCBwcmV2aW91c2x5IG9jY3VycmVkLgorCisJKiBhcy5jIChiaWdfc2VjdGlvbiwgcGFzczFfc2VjdGlvbiwgZGlmZl9zZWN0aW9uLCBhYnNlbnRfc2VjdGlvbik6CisJUmVtb3ZlZC4KKwkoZXhwcl9zZWN0aW9uKTogQWRkZWQgKHVzZWQgZm9yIGR1bW15IHN5bWJvbHMgd2hpY2ggaG9sZAorCWludGVybWVkaWF0ZSBleHByZXNzaW9uIHZhbHVlcykuCisJKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IENyZWF0ZSBleHByX3NlY3Rpb24sIGRvIG5vdCBjcmVhdGUgdGhlCisJc2VjdGlvbnMgbm93IHJlbW92ZWQuCisJKiBhcy5oIChzZWdUKTogUmVtb3ZlZCBTRUdfQUJTRU5ULCBTRUdfUEFTUzEsIFNFR19CSUcsIGFuZAorCVNFR19ESUZGRVJFTkNFLiAgQWRkZWQgU0VHX0VYUFIuCisJKFNFR19OT1JNQUwpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisJKiBzdWJzZWdzLmMgKHNlZ19uYW1lLCBzdWJzZWdzX2JlZ2luKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCisJKiBjb25maWcvb2JqLWFvdXQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgorCSogY29uZmlnL29iai1ib3V0LmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChzZWdfTl9UWVBFKTogRGl0dG8uCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoc2VnX05fVFlQRSk6IERpdHRvLgorCSogY29uZmlnL29iai12bXMuYyAoc2VnX05fVFlQRSk6IERpdHRvLgorCisJKiBleHByLmggKG9wZXJhdG9yVCk6IE1vdmVkIGluIGZyb20gZXhwci5jLCBhZGRlZCBzb21lIHZhbHVlcy4KKwkoZXhwcmVzc2lvblMpOiBBZGRlZCBYX29wIGZpZWxkLCByZW1vdmVkIFhfc2VnIGZpZWxkOyByZW5hbWVkCisJWF9zdWJ0cmFjdF9zeW1ib2wgdG8gWF9vcF9zeW1ib2wuCisJKiBleHByLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGFzc2lnbiBleHByZXNzaW9uIHR5cGVzIHJhdGhlciB0aGFuCisJc2VjdGlvbnMgYW5kIHRvIHNpbXBsaWZ5IHRoZSBwYXJzaW5nLgorCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGZpeF9uZXcpOiBSZW1vdmVkIHN1Yl9zeW1ib2wgYXJndW1lbnQuCisJKGZpeF9uZXdfZXhwKTogTmV3IGZ1bmN0aW9uLCB0YWtlcyBleHByZXNzaW9uIGFyZ3VtZW50LgorCSogd3JpdGUuaDogUHJvdG90eXBlIGNoYW5nZXMgZm9yIGZpeF9uZXcgYW5kIGZpeF9uZXdfZXhwLgorCSogY29uZC5jIChzX2lmKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKwkqIHJlYWQuYyAoc19sc3ltLCBwc2V1ZG9fc2V0LCBlbWl0X2V4cHIsIHBhcnNlX2JpdGZpZWxkX2NvbnMsCisJcGFyc2VfcmVwZWF0X2NvbnMsIGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiwKKwlnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uKTogRGl0dG8uCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOgorCURpdHRvLgorCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kZWYsIG9ial9jb2ZmX3ZhbCk6IERpdHRvLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2RlZiwgb2JqX2NvZmZfdmFsLAorCW9ial9jb2ZmX2VuZGVmLCB5YW5rX3N5bWJvbHMpOiBEaXR0by4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljLCBvYmpfZWxmX3NpemUpOiBEaXR0by4KKwkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2Fzc2VtYmxlLCBwYXJzZV9vcGVyYW5kLCBtYWNoaW5lX2lwLAorCXByaW50X2luc24sIG1kX29wZXJhbmQpOiBEaXR0by4KKwkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9leHAsIGNvbG9ubW9kMjQsIGNoZWNrX29wZXJhbmQsCisJZG9fYV9maXhfaW1tLCBidWlsZF9ieXRlcyk6IERpdHRvLgorCSogY29uZmlnL3RjLWg4NTAwLmMgKHBhcnNlX2V4cCwgc2tpcF9jb2xvbnRoaW5nLCBwYXJzZV9yZWdsaXN0LAorCWdldF9zcGVjaWZpYywgY2hlY2ssIGluc2VydCwgbWRfY29udmVydF9mcmFnKTogRGl0dG8uCisJKiBjb25maWcvdGMtaHBwYS5jICh0aGVfaW5zbiwgZml4X25ld19ocHBhLCBjb25zX2ZpeF9uZXdfaHBwYSwKKwltZF9hc3NlbWJsZSwgcGFfaXAsIGdldEV4cHJlc3Npb24sIGdldEFic29sdXRlRXhwcmVzc2lvbiwKKwlldmFsdWF0ZUFic29sdXRlLCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIHBhX2VudHJ5LAorCXByb2Nlc3NfZXhpdCk6IERpdHRvLgorCSogY29uZmlnL3RjLWhwcGEuaCAoU1RBQl9GSVhVUCwgaXNfRFBfcmVsYXRpdmUsIGlzX1BDX3JlbGF0aXZlLAorCWlzX2NvbXBsZXgpOiBEaXR0by4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHBlLCBtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kLAorCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCisJKiBjb25maWcvdGMtaTg2MC5jIChtZF9hc3NlbWJsZSwgZ2V0RXhwcmVzc2lvbiwgcHJpbnRfaW5zbik6CisJRGl0dG8uCisJKiBjb25maWcvdGMtaTk2MC5jIChwYXJzZV9leHByLCBzdWJzLCBzZWdzLCBtZF9jb252ZXJ0X2ZyYWcsCisJZ2V0X2NkaXNwLCBtZW1fZm10LCBwYXJzZV9sZGNvbnN0LCByZWxheF9jb2JyLCBzX3N5c3Byb2MsCisJaTk2MF9oYW5kbGVfYWxpZ24pOiBEaXR0by4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2V4cCwgc3RydWN0IG02OGtfaXQsIHNlZywgb3AsCisJc3VicywgYWRkX2ZpeCwgaXN2YXIsIG02OGtfaXAsIG1kX2Fzc2VtYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSwKKwltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCwgZ2V0X251bSk6CisJRGl0dG8uCisJKiBjb25maWcvdGMtbTg4ay5jIChtZF9hc3NlbWJsZSwgZ2V0X2ltbTE2LCBnZXRfcGNyLAorCW1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9hc3NlbWJsZSwgYXBwZW5kX2luc24sIGdwX3JlZmVyZW5jZSwKKwltYWNyb19idWlsZCwgbWFjcm8sIG15X2dldEV4cHJlc3Npb24pOiBEaXR0by4gIEFsc28gcmVtb3ZlZAorCWdldF9vcHRpb25hbF9hYnNvbHV0ZV9leHByZXNzaW9uOyBqdXN0IHVzZSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbgorCWluc3RlYWQuCisJKiBjb25maWcvdGMtbnMzMmsuYyAoZ2V0X2FkZHJfbW9kZSwgZXZhbHVhdGVfZXhwciwgY29udmVydF9paWYsCisJZml4X25ld19uczMyaywgZml4X25ld19uczMya19leHAsIGNvbnNfZml4X25ld19uczMyayk6IERpdHRvLgorCSogY29uZmlnL3RjLW5zMzJrLmggKGZpeF9uZXdfbnMzMmsgcHJvdG90eXBlKTogRGl0dG8uCisJKiBjb25maWcvdGMtc2guYyAocGFyc2VfZXhwLCBjaGVjaywgaW5zZXJ0LCBtZF9jb252ZXJ0X2ZyYWcpOgorCURpdHRvLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2Fzc2VtYmxlLCBzcGFyY19pcCwgZ2V0RXhwcmVzc2lvbiwKKwlwcmludF9pbnNuKTogRGl0dG8uCisJKiBjb25maWcvdGMtdGFob2UuYyAoc3RydWN0IHRvcCwgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsCisJdGlwX29wLCBtZF9hc3NlbWJsZSk6IERpdHRvLgorCSogY29uZmlnL3RjLXZheC5jIChzZWdfb2Zfb3BlcmFuZCwgbWRfYXNzZW1ibGUsCisJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEaXR0by4KKwkqIGNvbmZpZy90Yy16OGsuYyAocGFyc2VfZXhwLCBjaGVja19vcGVyYW5kLCBuZXdmaXgpOiBEaXR0by4KKworVHVlIEp1bCAyMCAxMjoxNzoxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogaTM4Ni1seW54IGlzIHRoZSBzYW1lIGFzIGkzODYtY29mZgorCitNb24gSnVsIDE5IDE1OjIxOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9wcmV2aW91cyk6IE5ldyBmdW5jdGlvbi4KKwkocHJldmlvdXNfc2VjdGlvbiwgcHJldmlvdXNfc3Vic2VjdGlvbik6IE5ldyB2YXJzLgorCShvYmpfZWxmX3NlY3Rpb24pOiBTYXZlIGN1cnJlbnQgcGxhY2UgaW4gY2FzZSBEV0FSRiBjb2RlIHdhbnRzIHVzCisJdG8gcG9wIGJhY2sgdG8gaXQuICBIYW5kbGUgdW5xdW90ZWQgc2VjdGlvbiBuYW1lIGFzIHdlbGwgYXMgcXVvdGVkCisJc2VjdGlvbiBuYW1lLiAgRG9uJ3QgY3Jhc2ggb24gaW52YWxpZCBzdHJpbmdzLgorCShvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlIG5ldyBwc2V1ZG9zICJwcmV2aW91cyIsICIyYnl0ZSIsIGFuZAorCSI0Ynl0ZSIuCisKKwkqIGNvbmZpZy9vYmotZWxmLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCisJKG9ial9lbGZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlIGFyZyBhcyBzdHJ1Y3Qgc3ltYm9sICouCisKKwkqIHRjLXNwYXJjLmggKExPQ0FMX0xBQkVMKSBbT0JKX0VMRl06IExvY2FsIGxhYmVscyBjYW4gc3RhcnQgd2l0aAorCSJMIiBvciAiXy5MXyIuCisKKwkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20KKwl3cml0ZV9jb250ZW50cy4gIFVzZSBtZW1zZXQgaW5zdGVhZCBvZiBiemVyby4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBBcHBseSB3cml0ZV9yZWxvY3MgdG8gZWFjaCBzZWN0aW9uIGJlZm9yZQorCWFwcGx5aW5nIHdyaXRlX2NvbnRlbnRzLgorCisJKiByZWFkLmMgKHJlYWRfYmVnaW4pOiBDYWxsIG9ic3RhY2tfYmVnaW4gd2l0aCB2YWx1ZXMgY2xvc2VyIHRvIDFLCisJbXVsdGlwbGVzLgorCShyZWFkX2Ffc291cmNlX2ZpbGUsIGJpZ19jb25zLCBmbG9hdF9jb25zKTogVXNlIG1lbWNweSBpbnN0ZWFkIG9mCisJYmNvcHkuCisKK01vbiBKdWwgMTkgMTQ6MzA6MDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogRG9uJ3QgZGVjcmVtZW50IHN0cmVuZCB3aGVuCisJY2FsY3VsYXRpbmcgb3BQLT5pc2l6OyB0aGlzIHBlcm1pdHMgdGhlIGV4cHJlc3Npb24gc2l6ZSB0byBiZQorCWRldGVybWluZWQgYXMgd2VsbCwgbGF0ZXIgb24uCisKKwkqIGV4cHIuYyAoY2xlYW5fdXBfZXhwcmVzc2lvbik6IERvbid0IGNhbmNlbCB0aGUgc3VidHJhY3Rpb24gb2YKKwl1bmRlZmluZWQgc3ltYm9scy4KKworCSogcmVhZC5jIChzX2RhdGEpLCBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZGF0YSk6IElmIC1SLAorCXN3aXRjaCB0byB0ZXh0IHNlY3Rpb24gcmF0aGVyIHRoYW4gZGF0YSBzZWN0aW9uLgorCitNb24gSnVsIDE5IDEyOjM1OjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSBBSU5EWCk6IEFkZCA2IHRvIG9wZXJhbmQKKwlleHByZXNzaW9uICh0byB0YWtlIHRoZSBwYy1yZWwgaW5zdHJ1Y3Rpb24gaXRzZWxmIGludG8gYWNjb3VudCkKKwliZWZvcmUgdXNpbmcgdGhlIGV4cHJlc3Npb24sIGluc3RlYWQgb2YgYWZ0ZXIuCisKK0ZyaSBKdWwgMTYgMDg6NTY6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBTaW1wbGlmaWVkIHBhcnNpbmcgbG9naWMuICBJZgorCVJFUEVBVF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQsIGFjY2VwdCBhIHJlcGVhdCBjb3VudC4KKworCSogc3ltYm9scy5jIChjb2xvbik6IFJhdGhlciB0aGFuIGEgc3BlY2lhbCBjYXNlIGZvciBUQ19IUFBBLAorCXVzZSBuZXcgbWFjcm8gdGNfZnJvYl9sYWJlbC4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IE1hbnkgY2hhbmdlcyB0byBzdXBwb3J0IHNpbXBsZSBhc3NlbWJsZXIKKwlvcHRpbWl6YXRpb24uCisJKGluc25fbGFiZWwsIHByZXZfaW5zbiwgcHJldl9wcmV2X2luc24sIGR1bW15X29wY29kZSwKKwlwcmV2X2luc25fdmFsaWQsIHByZXZfaW5zbl9mcmFnLCBwcmV2X2luc25fd2hlcmUsCisJcHJldl9pbnNuX2ZpeHAsIHByZXZfaW5zbl9pc19kZWxheV9zbG90KTogTmV3IHN0YXRpYworCXZhcmlhYmxlcy4KKwkoaW5zbl91c2VzX3JlZywgbWlwc19ub19wcmV2X2luc24sIG1pcHNfZW1pdF9kZWxheXMsCisJbWlwc19hbGlnbiwgc19zdHJpbmdlciwgc19taXBzX3NwYWNlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKG1pcHNfZGVmaW5lX2xhYmVsKTogTmV3IGdsb2JhbCBmdW5jdGlvbi4KKwkobWRfcHNldWRvX3RhYmxlKTogRm9yICJhc2NpaSIsICJhc2NpeiIsICJhc2NpaXoiLCBjYWxsCisJc19zdHJpbmdlci4gIENoYW5nZWQgYXJndW1lbnQgdG8gZmxvYXRfY29ucyBmcm9tIDAgb3IgMSB0byAnZicKKwlvciAnZCcuICBGb3IgInNwYWNlIiBjYWxsIHNfbWlwc19zcGFjZS4KKwkobWRfYmVnaW4pOiBDYWxsIG1pcHNfbm9fcHJldl9pbnNuLgorCShhcHBlbmRfaW5zbik6IE9ubHkgaW5zZXJ0IG5lY2Vzc2FyeSBOT1AgaW5zdHJ1Y3Rpb25zLgorCShtYWNybyk6IENhbGwgbWlwc19lbWl0X2RlbGF5cyBiZWZvcmUgc2V0dGluZyBtaXBzX25vcmVvcmRlci4KKwlJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBtaXBzX25vcmVvcmRlciByYXRoZXIgdGhhbiB1c2luZworCXNhdmVfcmVvcmRlcl9jb25kaXRpb24uICBEb24ndCBib3RoZXIgdG8gdXNlIG5vcmVvcmRlciBpbgorCU1fTF9ET0IgYW5kIE1fTF9EQUIsIHNpbmNlIGFwcGVuZF9pbnNuIHdpbGwgbm90IGluc2VydCBhIE5PUC4KKwkobWRfYXRvZik6IEhhbmRsZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvcnJlY3RseSBmb3IgYm90aAorCWJpZyBhbmQgbGl0dGxlIGVuZGlhbiB0YXJnZXRzLgorCShzX2FsaWduLCBzX2NvbnMpOiBDYWxsIG1pcHNfYWxpZ24gcmF0aGVyIHRoYW4gZnJhZ19hbGlnbi4KKwkoc19jaGFuZ2Vfc2VnLCBzX2NvbnMpOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMuCisJKHNfZmxvYXRfY29ucyk6IExldCBmbG9hdF9jb25zIGRvIHRoZSB3b3JrLgorCShzX21pcHNzZXQpOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMgd2hlbiBzZXR0aW5nIG5vcmVvcmRlci4KKwkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUgdG8gYmUKKwltaXBzX2RlZmluZV9sYWJlbC4KKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzLCBlY29mZl9idWlsZF9wcm9jcywKKwllY29mZl9mcm9iX2ZpbGVzKTogQ29uc2lzdGVudGx5IHVzZSBTX0dFVF9WQUxVRSByYXRoZXIgdGhhbgorCWJmZF9hc3ltYm9sX3ZhbHVlLiAgV2FybiBpZiB0YWtpbmcgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluCisJZGlmZmVyZW50IHNlZ21lbnRzLgorCitUaHUgSnVsIDE1IDExOjUxOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBEaXNjYXJkIGFsbCBvcGVuIHNjb3BlcywKKwl3aXRoIGEgd2FybmluZy4KKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBUQ19NODhLLCBkb24ndCBhZGp1c3QKKwlieSBtZF9wY3JlbF9mcm9tIGlmIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QgYSBzeW1ib2wgKHdlIHN0aWxsCisJbmVlZCBtZF9wY3JlbF9mcm9tIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gd2l0aGluIHRoZSBzYW1lCisJZmlsZSkuCisJKiBjb25maWcvdGMtbTg4ay5jIChtZF9wY3JlbF9mcm9tKTogQ29ycmVjdGVkIHJldHVybiB2YWx1ZS4KKwkob21hZ2ljKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUuCisKKwkqIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG04OGstY29mZi4KKwkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLWNvZmYqKTogTmV3IHRhcmdldC4gIFVzZSBjb2ZmYmZkIGFuZAorCW04OGtjb2ZmLgorCSogY29uZmlnL204OGtjb2ZmLm10OiBOZXcgZmlsZS4KKwkqIHJlYWQuYyAobGV4X3R5cGUpOiBOZXcgbWFjcm8gTEVYX0FUIHRvIHNldCBsZXggdHlwZSBvZiAnQCcuCisJKHBzZXVkb19zZXQpOiBIYW5kbGUgZGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBmcmFnbWVudHMKKwlieSBzYXZpbmcgdGhlIGVudGlyZSBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgorCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFJlc29sdmUgZGlmZmVyZW5jZQorCWV4cHJlc3Npb25zLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBJZiBUQ19NODhLLCBhY2NlcHQKKwkic2RlZiIgYXMgYSBzeW5vbnltIGZvciAiZGVmIi4KKwkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBJZiBUQ19NODhLLCBpbmNsdWRlIGNvZmYvbTg4ay5oIGFuZCBzZXQKKwlUQVJHRVRfRk9STUFULgorCShTX0lTX0xPQ0FMKTogQW55IHN5bWJvbCB3aGljaCBpbmNsdWRlcyBcMDAxIGluIHRoZSBuYW1lIGlzIGxvY2FsLgorCSogY29uZmlnL3RjLW04OGsuYywgY29uZmlnL3RjLW04OGsuaDogTnVtZXJvdXMgY2hhbmdlcyB0byBicmluZworCW04OGsgcG9ydCB1cCB0byBkYXRlLCBhbmQgdG8gYWRkIENPRkYgc3VwcG9ydC4KKworV2VkIEp1bCAxNCAxNTowOTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIFJlbW92ZWQgc3lfZm9yd2FyZCBhbmQgcmVwbGFjZWQgaXQgd2l0aCBhbiB1bmRlZmluZWQgZXhwcmVzc2lvbgorCWFzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KKwkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogUmVtb3ZlZCBzeV9mb3J3YXJkIGZpZWxkLiAgQWRkZWQKKwlzeV9yZXNvbHZlZCBhbmQgc3lfcmVzb2x2aW5nIHNpbmdsZSBiaXQgZmllbGRzLgorCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogRG9uJ3QgaW5pdGlhbGl6ZSBzeV9mb3J3YXJkIGZpZWxkLgorCShyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IE5ldyBmdW5jdGlvbiB0byBhZGp1c3Qgc3ltYm9sIHZhbHVlIGJ5CisJZnJhZ21lbnQgYWRkcmVzcywgdXNpbmcgcmVjdXJzaW9uIHRvIHJlc29sdmUgZm9yd2FyZCBzeW1ib2xzLgorCSogc3ltYm9scy5oOiBBZGRlZCBwcm90b3R5cGUgZm9yIG5ldyBmdW5jdGlvbi4KKwkqIHJlYWQuYyAocHNldWRvX3NldCk6IFNldCBzeW1ib2xQLT5zeV92YWx1ZSB0byBhbiB1bmRlZmluZWQKKwlleHByZXNzaW9uIHJhdGhlciB0aGFuIHNldHRpbmcgc3ltYm9sUC0+c3lfZm9yd2FyZC4KKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlIG9uCisJc3ltYm9scywga2VlcGluZyB0aGUgY29tbW9uIGNhc2UgKHRoZSBvbGQgYmVoYXZpb3VyKSBpbmxpbmUuCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIHN5X2ZvcndhcmQKKwloYW5kbGluZyAoc3Vic3VtZWQgYnkgd3JpdGUuYyBjaGFuZ2UpLgorCSogY29uZmlnL29iai1jb2ZmLmMsIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl92YWwpOiBTZXQKKwlzeV92YWx1ZSByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmLCB5YW5rX3N5bWJvbHMpOiBDaGVjaworCWV4cHJlc3Npb24gc2VnbWVudCByYXRoZXIgdGhhbiBzeV9mb3J3YXJkLgorCSh5YW5rX3N5bWJvbHMpOiBVc2UgcmVzb2x2ZV9zeW1ib2xfdmFsdWUuCisJKGNyYXdsX3N5bWJvbHMpOiBSZW1vdmVkIGV4dHJhIHBhc3Mgb3ZlciBzeW1ib2xzLgorCSogY29uZmlnL29iai1hb3V0LmMsIGNvbmZpZy9vYmotYm91dC5jLCBjb25maWcvb2JqLWNvZmYuYywKKwljb25maWcvb2JqLXZtcy5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmVtb3ZlZCBleHRyYSBwYXNzIG92ZXIKKwlzeW1ib2xzIHdoaWNoIGhhbmRsZWQgc3lfZm9yd2FyZDsgdXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlCisJaW5zdGVhZC4KKwkqIGNvbmZpZy9vYmotY29mZi5oLCBjb25maWcvb2JqLWNvZmZiZmQuaCAob2JqX2Zyb2JfZm9yd2FyZF9zeW1ib2wpOgorCURlZmluZS4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc3RhYl9nZW5lcmljKTogQ2hlY2sgZXhwcmVzc2lvbgorCXNlZ21lbnQgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KKwkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19DaGVja19Gb3JfTWFpbik6IERvbid0IGluaXRpYWxpemUKKwlzeV9mb3J3YXJkOyBkbyBpbml0aWFsaXplIHN5X3Jlc29sdmVkIGFuZCBzeV9yZXNvbHZpbmcuCisJKiBjb25maWcvdGMtaHBwYS5oIChTVEFCX0ZJWFVQKTogVXNlIHN5X3ZhbHVlLCBub3Qgc3lfZm9yd2FyZC4KKworCSogQ2hhbmdlcyB0byBrZWVwIGEgZnVsbCBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgbm90CisJanVzdCBhIGxvbmd3b3JkOgorCSogc3RydWMtc3ltYm9sLmg6IE5ldyBmaWVsZCBzeV92YWx1ZS4KKwkqIGFzLmg6IEluY2x1ZGUgZXhwci5oIGJlZm9yZSBzdHJ1Yy1zeW1ib2wuaC4KKwkqIGV4cHIuaDogVXNlIHN0cnVjdCBzeW1ib2wgcmF0aGVyIHRoYW4gc3ltYm9sUy4KKwkqIHN5bWJvbHMuYyAoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmV3cm90ZSB0byByZXRyaWV2ZSB2YWx1ZQorCW9mIHN5X3ZhbHVlIGZpZWxkOyBjb21waWxlIHVuY29uZGl0aW9uYWxseSwgbm90IGp1c3QgaWYKKwlCRkRfQVNTRU1CTEVSLgorCSogc3ltYm9scy5oOiBDb21waWxlIFNfe1NHfUVUX1ZBTFVFIHByb3RvdHlwZXMgdW5jb25kaXRpb25hbGx5LgorCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgQkZEIHN5bWJvbCB2YWx1ZSB0byBnYXMgc3ltYm9sCisJdmFsdWUuCisJKiBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai1ib3V0LmgsIGNvbmZpZy9vYmotY29mZi5oLAorCWNvbmZpZy9vYmotY29mZmJmZC5oLCBjb25maWcvb2JqLWdlbmVyaWMuaCwgY29uZmlnL29iai12bXMuaAorCShTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZW1vdmVkIG1hY3JvIGRlZmluaXRpb25zLgorCSogY29uZmlnL29iai1pZWVlLmMgKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJlbW92ZWQuCisJKiBjb25maWcvb2JqLWNvZmYuaCwgb2JqLWNvZmZiZmQuaDogUmV3cm90ZSBzZXZlcmFsIG1hY3JvcyB0byB1c2UKKwlTX0dFVF9WQUxVRSByYXRoZXIgdGhhbiBvc3RfZW50cnkubl92YWx1ZS4KKwkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfc3ltYm9sX3RvX2NoYXJzKSwgY29uZmlnL29iai1ib3V0LmMKKwkob2JqX3N5bWJvbF90b19jaGFycyksIGNvbmZpZy9vYmotY29mZi5jIChvYmpfc3ltYm9sX3RvX2NoYXJzKSwKKwljb25maWcvb2JqLWNvZmZiZmQuYyAoc3ltYm9sX3RvX2NoYXJzKTogR2V0IHZhbHVlIHRvIHdyaXRlIG91dAorCXVzaW5nIFNfR0VUX1ZBTFVFLS1kb24ndCBhc3N1bWUgaXQgaXMgYWxyZWFkeSBzZXQuCisJKiBjb25maWcvb2JqLWllZWUuYyAoZG9fc3ltYm9scyk6IFNldCBCRkQgc3ltYm9sIHZhbHVlIHRvIGdhcworCXN5bWJvbCB2YWx1ZS4KKwkqIGNvbmZpZy9vYmotdm1zLmMgKHZhcmlvdXMpOiBEb24ndCBhc3NpZ24gZGlyZWN0bHkgdG8KKwlTX0dFVF9WQUxVRTsgdXNlIFNfU0VUX1ZBTFVFIGluc3RlYWQuCisKK1dlZCBKdWwgMTQgMDk6MzU6MjMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBNYWtlIHNwYXJjNjQtKi1hb3V0KiB1c2UgYmZkIGdhcy4KKworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaDgzMDBoLgorCitUdWUgSnVsIDEzIDEyOjA5OjQ0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1oODUwMC5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgaGFzaC4KKwkocGFyc2VfZXhwLCBza2lwX2NvbG9udGhpbmcsIGJ1aWxkX2J5dGVzKTogQWRkIHN1cHBvcnQgZm9yCisJUl9IODUwMF9ISUdIMTYgcmVsb2NhdGlvbiB0eXBlLgorCitNb24gSnVsIDEyIDExOjE1OjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBbGxvdyBgQCcgdG8gaW50cm9kdWNlIGFuCisJYXR0cmlidXRlIG5hbWUuICBIYW5kbGUgYGV4ZWNpbnN0cicgYXR0cmlidXRlLgorCitNb24gSnVsIDEyIDA3OjIyOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHdhcm4gb24gJ2knIG9yICdqJyBtaXNtYXRjaCBpZgorCXRoZXJlIGlzIGFub3RoZXIgYWx0ZXJuYXRpdmUgZm9yIHRoZSBpbnN0cnVjdGlvbi4KKworRnJpIEp1bCAgOSAxNzozMTozNCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBkb2MvYXMudGV4aW5mbzogdXBkYXRlcyBmb3IgSDgvMzAwSAorCitUaHUgSnVsICA4IDE0OjQxOjQzIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAorCW1kX251bWJlcl90b19jaGFycywgbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkIHRvIHVzZSB2YWx1ZVQsCisJYWRkcmVzc1QsIHRvIG1hdGNoIHRjLmguCisKK1RodSBKdWwgIDggMTQ6MTU6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBSZXZhbXAgdG8gaGFuZGxlIGJvdGggc3ludGF4ZXMsCisJaW5kZXBlbmRlbnQgb2YgZm9ybWF0LgorCitUaHUgSnVsICA4IDA3OjI1OjI1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19DT05TX1JFTE9DKTogVXNlIFJfUkVMTE9ORyBpZiBoOC8zMDBoLgorCitXZWQgSnVsICA3IDE4OjExOjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBkZWZpbmUgQ1JPU1M9LURDUk9TU19DT01QSUxFIGlmIGl0IGlzIGEgY3Jvc3MKKwlidWlsZDsgYWxzbyByZWNvZ25pemUgaDgzMDAtKi1jb2ZmCisKK1dlZCBKdWwgIDcgMTA6MjE6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBzeW1ib2xzLmMgKGZiX2xhYmVsX2luc3RhbmNlLCBmYl9sYWJlbF9pbnN0YW5jZV9pbmMpOiBEb24ndCBkdW1wCisJY29yZSBqdXN0IGJlY2F1c2Ugc29tZWJvZHkgdXNlcyBhIGxhYmVsIGJlZm9yZSBpdCBpcyBkZWZpbmVkLgorCisJKiBjb25maWcvbWlwcy1vcGNvZGUuaDogTW92ZWQgdG8gb3Bjb2RlL21pcHMuaC4KKwkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgb3Bjb2RlL21pcHMuaCByYXRoZXIgdGhhbgorCW1pcHMtb3Bjb2RlLmguCisJKGFwcGVuZF9pbnNuKTogQW4gZXh0cmEgTk9QIGlzIG9ubHkgbmVlZGVkIGFmdGVyIGluc3RydWN0aW9ucworCXdoaWNoIHNldCBISSBvciBMTywgbm90IGFmdGVyIGluc3RydWN0aW9ucyB3aGljaCByZWFkIGl0LgorCShtYWNyb19idWlsZCwgbWlwc19pcCk6IFN1cHBvcnQgbmV3ICdFJywgJ0cnIGFuZCAnQicgYXJndW1lbnRzLgorCShtYWNybyk6IGNmYzEgYW5kIGN0YzEgbm93IHRha2UgInQsRyIgcmF0aGVyIHRoYW4gInQsZCIuCisJKiBjb25maWcvdGMtbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6CisJU2V0IHRvICQoc3JjZGlyKS8uLi9pbmNsdWRlL29wY29kZS9taXBzLmguCisKKwlHZXQgdGhlIE1JUFMgYXNzZW1ibGVyIHVwIHRvIHNwZWVkIHdpdGggb3RoZXIgZ2FzIGNoYW5nZXM6CisKKwkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfc2V0X3ZtYSwgZWNvZmZfZnJvYl9zeW1ib2wpOgorCVJlbW92ZWQ7IGRvbid0IGNoYW5nZSB0aGUgc3ltYm9sIHZhbHVlLgorCShlY29mZl9idWlsZF9zeW1ib2xzLCBlY29mZl9idWlsZF9wcm9jcywgZWNvZmZfZnJvYl9maWxlKTogVXNlCisJYmZkX2FzeW1ib2xfdmFsdWUgcmF0aGVyIHRoYW4gU19HRVRfVkFMVUUgdG8gaW5jbHVkZSBzZWN0aW9uCisJdm1hIGluIHN5bWJvbCB2YWx1ZS4KKwkoZWNvZmZfZnJvYl9maWxlKTogSWdub3JlIEJTRl9TRUNUSU9OX1NZTSBzeW1ib2xzLCBzaW5jZSBFQ09GRgorCWRvZXNuJ3Qgb3V0cHV0IHRoZW0uICBTZXQgdGhlIHZtYSBvZiBzZWN0aW9ucy4KKwkqIGNvbmZpZy9vYmotZWNvZmYuaDogRG9uJ3QgZGVmaW5lIG9ial9mcm9iX3N5bWJvbC4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IEFkanVzdG1lbnQgYnkgc2VjdGlvbiB2bWEgaXMgbm8KKwlsb25nZXIgbmVjZXNzYXJ5LgorCSh2YXJpb3VzKTogdXNlIHZhbHVlVCByYXRoZXIgdGhhbiBsb25nLgorCitXZWQgSnVsICA3IDA4OjMzOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmggKEVOVjY0KTogRGVmaW5lIGZvciB2OS4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfeHdvcmQpOiBGb3IgbnVtYmVycywgY2FsbCBiaWdfY29ucy4KKwkoc3BhcmNfaXAsIG1kX2FwcGx5X2ZpeCwgdGNfZ2VuX3JlbG9jKTogSGFuZGxlIHNvbWUgc3BhcmM2NAorCXJlbG9jYXRpb24gdHlwZXMuCisJKG1kX251bWJlcl90b19jaGFycyk6IEhhbmRsZSA4LWJ5dGUgdmFsdWUuCisKKwkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBGb3IgdjksIHVzZSA2NC1iaXQgc3ltYm9sIHR5cGUuCisKKwkqIGFzLmggKHZhbHVlVCk6IFR5cGVkZWYgbW92ZWQgaGVyZS4KKwkqIHN0cnVjLXN5bWJvbC5oICh2YWx1ZVQpOiAuLi5mcm9tIGhlcmUuCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IExvY2FscyBmcm9tX2FkZHIsIHRvX2FkZHIsCisJdGFibGVfYWRkciBhcmUgbm93IGFkZHJlc3NULiAgU3VwcGx5IHByb3RvdHlwZSBmb3IgYmZkX2FsbG9jIGZvcgorCW5vdy4KKwkoZml4dXBfc2VnbWVudCk6IExvY2FsIGFkZF9udW1iZXIgaXMgbm93IHZhbHVlVC4gIENvcnJlY3Qgc29tZQorCXJhbmdlLWNoZWNraW5nIGJ1Z3MuCisJKHJlbGF4X2FsaWduKTogVHlwZSBgaW50JyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgdGhlIGV4cG9uZW50LgorCShmaXhfbmV3KTogQXJndW1lbnQgb2Zmc2V0IGlzIHR5cGUgb2Zmc2V0VC4gIExvY2FscyBzaXplIGFuZAorCW5ld3NpemUgYXJlIHR5cGUgdmFsdWVULgorCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEZpZWxkcyBmeF9vZmZzZXQgYW5kIGZ4X2FkZG51bWJlciBhcmUgbm93CisJdHlwZSB2YWx1ZVQuCisJKGZpeF9uZXcpOiBGaXggcHJvdG90eXBlLgorCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogU3ltYm9sIHZhbHVlIGlzIHR5cGUgdmFsdWVULgorCShTX1NFVF9WQUxVRSwgU19HRVRfVkFMVUUpOiBMaWtld2lzZS4KKwkoU19JU18qKTogU3BlY2lmeSBpbnQgcmV0dXJuIHR5cGUgZXhwbGljaXRseS4KKwkqIHN5bWJvbHMuaCAoc3ltYm9sX25ldywgU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogRml4ZWQKKwlwcm90b3R5cGVzLgorCSogcmVhZC5jIChzX2NvbW0pOiBWYWx1ZXMgcmVhZCBhcmUgdHlwZSB2YWx1ZVQuCisJKiBleHByLmggKGV4cHJlc3Npb25TKTogRmllbGQgWF9hZGRfbnVtYmVyIGlzIGFuIG9mZnNldFQuCisJKiB0Yy5oIChtZF9jcmVhdGVfbG9uZ19qdW1wLCBtZF9jcmVhdGVfc2hvcnRfanVtcCwKKwltZF9zZWN0aW9uX2FsaWduKTogQWRkcmVzc2VzIGFyZSBub3cgdHlwZSBhZGRyZXNzVC4KKwkobWRfbnVtYmVyX3RvX2NoYXJzLCBtZF9hcHBseV9maXgpOiBQYXNzIHZhbHVlIGFzIHZhbHVlVC4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAorCW1kX251bWJlcl90b19jaGFycywgbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogSW5pdGlhbGl6ZSBgbGVuJyB2YXJpYWJsZSB0byBtYWtlCisJZ2NjIHNodXQgdXAuCisJKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLCBtZF9udW1iZXJfdG9fY2hhcnMsCisJbWRfc2VjdGlvbl9hbGlnbik6IEFkanVzdGVkLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogUGVybWl0IHVzZSBmb3Igb3RoZXIgdGhhbiBhLm91dAorCWZvcm1hdC4KKwkoc19jb21tb24pOiBIYW5kbGUgU29sYXJpcy0yIHZlcnNpb24uCisKKwkqIGNvbmZpZy9oby1nZW5lcmljLmggKGZyZWUpOiBSZXR1cm5zIHZvaWQgaWYgX19TVERDX18uCisKKwkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfZnJvYl9zeW1ib2wsIGVsZl9mcm9iX2ZpbGUsCisJZWxmX2ZpbGVfc3ltYm9sKTogRGVjbGFyZS4KKworCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCwgaW50ZWdlcl9jb25zdGFudCk6IE5vdyByZXR1cm4gdm9pZC4KKworVGh1IEp1bCAgMSAxMjoxMzo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggb24gc3BhcmMqLWZ1aml0c3Utbm9uZSByYXRoZXIgdGhhbgorCXNwYXJjbGl0ZSotZnVqaXRzdS1ub25lLgorCitXZWQgSnVuIDMwIDExOjEyOjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChjb25zKTogQ29uZGl0aW9uYWxpemUgcGFyc2luZyBvZiBleHByZXNzaW9uLiAgTW92ZQorCXB1dHRpbmcgdmFsdWUgaW50byBvYmplY3QgZmlsZSBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9uLiAgU2VwYXJhdGUKKwlvdXQgTVJJIGFuZCBXQU5UX0JJVEZJRUxEUyBjYXNlcyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4KKwkoZW1pdF9leHByKTogTmV3IGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgaW50byBvYmplY3QgZmlsZS4KKwlDb25kaXRpb25hbGl6ZSBvbiBUQ19DT05TX0ZJWF9ORVcgYW5kIFRDX0NPTlNfUkVMT0MgcmF0aGVyIHRoYW4gb24KKwlwcm9jZXNzb3IgdHlwZXMuCisJKHBhcnNlX2JpdGZpZWxkX2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgYml0ZmllbGQgZXhwcmVzc2lvbnMKKwlhcyB1c2VkIGJ5IGk5NjAgYXNzZW1ibGVycy4gIE9ubHkgY29tcGlsZWQgaWYKKwlCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQuCisJKHBhcnNlX21yaV9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIE1SSSBzdHlsZSBzdHJpbmdzLiAgT25seQorCWNvbXBpbGVkIGlmIE1SSSBpcyBkZWZpbmVkLgorCShwYXJzZV9yZXBlYXRfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSByZXBlYXQgY291bnRzLiAgT25seQorCWNvbXBpbGVkIGlmIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TIGlzIGRlZmluZWQuCisJKiByZWFkLmggKGVtaXRfZXhwcik6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIG5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy90Yy1hMjlrLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gYmUgUkVMT0NfMzIuCisJKiBjb25maWcvdGMtaDgzMDAuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBiZSBSX1JFTFdPUkQuCisJKiBjb25maWcvdGMtaHBwYS5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IE5ldyBmdW5jdGlvbiB0bworCXBhcnNlIGEgSFBQQSBleHByZXNzaW9uLCByYXRoZXIgdGhhbiBzcGVjaWFsIGNhc2UgaW4gY29ucworCWZ1bmN0aW9uLgorCShjb25zX2ZpeF9uZXdfaHBwYSk6IE5ldyBmdW5jdGlvbiB0byBlbWl0IGFuIEhQUEEgZml4dXAsIHJhdGhlcgorCXRoYW4gc3BlY2lhbCBjYXNlIGluIGVtaXRfZXhwciBmdW5jdGlvbi4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiwgVENfQ09OU19GSVhfTkVXKToKKwlEZWZpbmUgdG8gdXNlIG5ldyBmdW5jdGlvbnMgZnJvbSB0Yy1ocHBhLmMuCisJKiBjb25maWcvdGMtaTk2MC5oIChCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TKTogRGVmaW5lLgorCShXQU5UX0JJVEZJRUxEUyk6IFJlbW92ZWQ7IG5vdyBvYnNvbGV0ZS4KKwkqIGNvbmZpZy90Yy1taXBzLmggKFJFUEVBVF9DT05TX0VYUFJFU1NJT05TKTogRGVmaW5lLgorCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnNfZml4X25ld19uczMyayk6IE5ldyBmdW5jdGlvbiB0byBlbWl0IGFuCisJTlMzMksgZml4dXAsIHJhdGhlciB0aGFuIHNwZWNpYWwgY2FzZSBpbiBlbWl0X2V4cHIgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtbnMzMmsuaCAoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lIHRvIGJlCisJY29uc19maXhfbmV3X25zMzJrLiAgQWxzbyB1c2UgUEFSQU1TIHJhdGhlciB0aGFuIGNoZWNraW5nCisJX19TVERDX18uCisJKiBjb25maWcvdGMtc3BhcmMuaCAoVENfQ09OU19SRUxPQyk6IERlZmluZSB0byBSRUxPQ18zMi4KKworCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnLCBhZGp1c3RfcmVsb2Nfc3ltcywgd3JpdGVfY29udGVudHMpOgorCURvbid0IGNvcmUgZHVtcCBpZiBnYXMgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IGEgc2VjdGlvbi4KKworV2VkIEp1biAzMCAwNjoyMToyNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IElmIHNwYXJjdjkgaXMgZGVmaW5lZCwgcmVzZXQKKwljdXJyZW50X2FyY2hpdGVjdHVyZSB0byB2OSBhdXRvbWF0aWNhbGx5LgorCisJKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSBlbGY2NC1zcGFyYyBmb3IgdjkuCisKKwkqIGNvbmZpZy90Yy1zcGFyYzY0LmgsIGNvbmZpZy90Yy1zcGFyYzY0LmM6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogVXNlIHNwYXJjNjQgY3B1IGZpbGVzIGZvciB2OSwgYW5kIGRlZmF1bHQgdG8gZWxmCisJZm9ybWF0LgorCisJKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBBbHdheXMgZnVsbHkgcHJvY2VzcyBhIHNlY3Rpb24uCisJU2VjdGlvbiBzaXplIGlzIGxhc3QgZnJhZydzICh2bSlhZGRyZXNzIHBsdXMgaXRzIHNpemUuICBJZiBubworCXJlbG9jYXRpb25zIGFyZSBwcmVzZW50LCBmb3JjZSBTRUNfUkVMT0MgZmxhZyBjbGVhci4KKwkoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IE5ldyBkZWJ1Z2dpbmcgcm91dGluZS4KKwkoYWRqdXN0X3JlbG9jX3N5bXMpOiBOZXcgcm91dGluZSwgYnJva2VuIG91dCBmcm9tIHdyaXRlX2NvbnRlbnRzLgorCURvbid0IGFkanVzdCByZWxvY3MgdGhhdCBhcmUgYWxyZWFkeSByZWxhdGl2ZSB0byBzZWN0aW9uIHN5bWJvbC4KKwlMb29rIGZvciBvYmpfZml4X2FkanVzdGFibGUgbWFjcm8gdG8ga25vdyB3aGF0IGVsc2UgdG8gc2tpcCwKKwlpbnN0ZWFkIG9mIG9ial93cml0ZV9zeW1ib2wuICBMb29rIGZvciBzZWN0aW9uIHN5bWJvbCBzdG9yZWQgaW4KKwlzZWN0aW9uIGluZm9ybWF0aW9uLgorCSh3cml0ZV9vYmplY3RfZmlsZSk6IE1hcCBhZGp1c3RfcmVsb2Nfc3ltcyBvdmVyIGFsbCBzZWN0aW9ucy4KKwkod3JpdGVfY29udGVudHMpOiBDbGVhciBTRUNfUkVMT0MgZmxhZyBpZiBubyByZWxvY2F0aW9ucyBhcmUKKwlmb3VuZC4KKworCSogYXMuaCAoX19QVFJfVE9fSU5ULCBfX0lOVF9UT19QVFIpOiBOZXcgdmVyc2lvbnMgZm9yIFNhYmVyLCB0bworCWtlZXAgaXQgcXVpZXQuCisKKwkqIHdyaXRlLmMgKHJlbW92ZV9zdWJzZWdzKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgorCitGcmkgSnVuIDI1IDE0OjQyOjUzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbCwgZHZpLCBpbmZvLCBpbnN0YWxsLWluZm8sIGNsZWFuLWluZm8pOiBkbyBub3QKKwkgIGVjaG8gcmVjdXJzaW9uIGxpbmVzLgorCSAgKGluc3RhbGwtaW5mbywgY2xlYW4taW5mbyk6IGNvbGxhcHNlIGludG8gdGhlIGR2aSBhbmQgaW5mbyBydWxlLgorCitGcmkgSnVuIDI1IDEwOjQ3OjI0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlbW92ZSBzdXBwb3J0IGZvciAlZC8lcSBmcCByZWdzLgorCUFsbCBmcCByZWdzIGFyZSBub3cgc3BlY2lmaWVkIGFzICVmLgorCShwcml2X3JlZ190YWJsZSk6IGZwcSAtPiBmcS4KKworRnJpIEp1biAyNSAwMzo0MzowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogYXMuaCAoc3Ryc3RyKTogRGlzYWJsZSBkZWNsYXJhdGlvbiBmb3Igbm93LgorCShmcHJpbnRfdmFsdWUsIHNwcmludF92YWx1ZSk6IERlY2xhcmUuCisKKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogVXNlIG1lbXNldCB0byBjbGVhciBuZXcgZnJhZy4KKwkoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBJbml0aWFsaXplIGFsbCBzZWdpbmZvIGZpZWxkcy4KKworCSogZXhwci5jIChleHByX3BhcnQpOiBNYWRlIHNhbml0eSBjaGVja3MgYS5vdXQtc3BlY2lmaWMuCisJKGV4cHIpOiBEaXNhYmxlZCBzYW5pdHkgY2hlY2tzLgorCisJKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbQkZEX0FTU0VNQkxFUl06IEFkZCBmaWVsZCBmb3IKKwlzZWN0aW9uIHN5bWJvbC4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IEluaXRpYWxpemUgc2VjdGlvbiBzeW1ib2wgcG9pbnRlcgorCXdoZW4gc2V0dGluZyB1cCBhIG5ldyBzZWN0aW9uLgorCisJKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogUG9pbnQgQkZEIHN5bWJvbCdzIHVkYXRhCisJZmllbGQgYmFjayBhdCBnYXMgc3ltYm9sIHN0cnVjdHVyZS4KKworCSogc3ltYm9scy5jIChjb2xvbik6IENhc3Qgb2JzdGFja19uZXh0X2ZyZWUgdmFsdWUgdG8gY2hhciogYmVmb3JlCisJZG9pbmcgYXJpdGhtZXRpYyBvbiBpdC4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogTGlrZXdpc2UuCisJKiBhcy5oIChmcmFnX25vd19maXgpOiBMaWtld2lzZS4KKworCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogVXNlIHN1YnNlZ19uZXcgaW5zdGVhZCBvZgorCWNhbGxpbmcgYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IGRpcmVjdGx5LCBhbmQgY2FsbCBzdWJzZWdfc2V0CisJaW5zdGVhZCBvZiBzdWJzZWdfY2hhbmdlLiAgTm93IHJldHVybnMgdm9pZC4KKwkob2JqX2VsZl93cml0ZV9zeW1ib2wpOiBPbmx5IGNoZWNrIGxvY2FsIHN5bWJvbHMgZm9yIG5vdy4KKwkoZWxmX3N0YWJfc3ltYm9sKTogTm93IHN0YXRpYyBhbmQgdm9pZCwgYW5kIGRpc2FibGVkIHVudGlsIGl0CisJd29ya3MgY29tcGxldGVseS4KKwkob2JqX2VsZl9zaXplKTogRm9yIGV4cHJlc3Npb24gdmFsdWVzLCBmYWlsIHNpbGVudGx5IGZvciBub3cuCisJKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEbyBub3RoaW5nLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyCisJcmVsb2NhdGlvbi4KKwkoc19sb2NhbCkgW09CSl9FTEZdOiBOZXcgZnVuY3Rpb24uCisJKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBDYWxsIGl0IGZvciAibG9jYWwiLgorCShzX2NvbW1vbik6IFJlYXJyYW5nZSB0byBoYW5kbGUgU29sYXJpcyAuY29tbW9uIHBzZXVkbywgd2hpY2ggbWF5CisJc29tZXRpbWVzIHVzZSBic3Mgc3BhY2UgaW5zdGVhZCBvZiBjb21tb24uCisJKiBjb25maWcvb2JqLWVsZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IEFkZCBuZXcgYGxvY2FsJyBmaWVsZC4KKworVGh1IEp1biAyNCAxNjozMzo1MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogc2V0IGhvc3QgY29uZmlnIHRvIGhwdXggZm9yIGhwcGEqLWhwLWhwdXgKKworVGh1IEp1biAyNCAxMzozNTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogYXBwLmMgKGFwcF9wb3AsIGFwcF9wdXNoKTogRml4IGJ1ZyByZXBvcnRlZCBieSBDaHJpcyBBcnRodXIuCisKK1R1ZSBKdW4gMjIgMDE6MDQ6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IERvbid0IHNwZWNpYWwtY2FzZSBhLm91dCAtUiBmbGFnIGhlcmUuCisJKiBjb25maWcvb2JqLWFvdXQuYyAoc19zZWN0KTogRG8gaXQgaGVyZS4KKworCSogYXMuaCAoQkFEX0NBU0UpOiBEb24ndCBtYWtlIHNvbWUgbGFtZSBjb21waWxlcnMgdGhpbmsgd2Ugd2FudAorCXN1YnN0aXR1dGlvbiBpbnNpZGUgc3RyaW5ncy4KKworCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb2ZmIGZyb20gbWFpbi4KKwkobWFpbik6IENhbGwgaXQuCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKSBbT0JKX0VMRl06IFByaW50IHZlcnNpb24gaWQKKwlmb3IgLVYuICBJZ25vcmUgLVEgYW5kIC1zIG9wdGlvbnMgZm9yIG5vdy4KKworTW9uIEp1biAyMSAxNzozNzo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBtYWtlIGluc3RhbGxhdGlvbiAmIGJ1aWxkcyB3b3JrIGFnYWluIGZvciBjcm9zc2VzCisKK1N1biBKdW4gMjAgMTg6MTg6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBSZXdyaXRlIHRvIHByaW50IHdpZGUgKD4zMiBiaXRzKQorCXN5bWJvbCB2YWx1ZXMgY29ycmVjdGx5LgorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERlbGV0ZWQgdW51c2VkIHZhcmlhYmxlcy4KKwkoZml4dXBfc2VnbWVudCk6IFVzZSBzcHJpbnRfdmFsdWUuCisKKwkqIG1lc3NhZ2VzLmMgKHNwcmludF92YWx1ZSwgZnByaW50X3ZhbHVlKTogTmV3IHJvdXRpbmVzLgorCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2wpOiBOb3cgcmV0dXJucyB2b2lkLgorCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IEZpeCB0eXBvIGluIGxvZ2ljLgorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBMb29rIGluIC4uL2JmZCBmb3IgYmZkLmguCisKKwkqIGFzLmggKGFkZHJlc3NULCBvZmZzZXRUKTogTmV3IHR5cGVzLCB1c2luZyBCRkQgdHlwZXMgaWYKKwlhdmFpbGFibGUuCisJKHJlbGF4X2FkZHJlc3NULCBzdHJ1Y3QgZnJhZyk6IFVzZSB0aGVtLgorCSogc3RydWMtc3ltYm9sLmggKHZhbHVlVCwgc3RydWN0IGJyb2tlbl93b3JkKTogTGlrZXdpc2UuCisKKwkqIGFzLmggKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogTmFtZSBhcmd1bWVudCBpcyBjb25zdC4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBOYW1lIGFyZ3VtZW50IGlzIGNvbnN0LgorCitUaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KKwl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCisKK1N1biBKdW4gMjAgMDI6MzQ6MDQgMTk5MyAgQXNobGV5IFNhdWxzYnVyeSAoYW5zQHNpY3Muc2UpCisKKwkqIG04OGstb3Bjb2RlLmggOiBmaXhlZCB0aW55IHRpbnkgbWlzdGFrZSAtIHhjciB3YXMgaW5jb3JyZWN0bHkKKwlzcGVjaWZpZWQsIHNob3VsZCBoYXZlIGJvdGggUzEgYW5kIFMyIGZpZWxkcyBpZGVudGljYWwKKwlJZiBvbmx5IGZpbmRpbmcgdGhlIHByb2JsZW0gd2FzIGFzIGZhc3QgYXMgZml4aW5nIHRoZSBidWcgISEhIQorCitUdWUgSnVuIDE1IDE2OjAxOjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEbyB3cml0ZSBvdXQgbm9uLWxvYWRhYmxlIHNlY3Rpb25zLgorCURlYnVnIHNlY3Rpb25zIGNhbiBmYWxsIGluIHRoaXMgY2F0ZWdvcnkuCisKKwkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IENhbGwgZWxmX2ZpbGVfc3ltYm9sIGZvciBFTEYgZmlsZXMuCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZmlsZV9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiBSZW5hbWVkIGZyb20gcGFfLi4uLAorCWFkZGVkIGFyZ3VtZW50IHRvIHNwZWNpZnkgc2VjdGlvbiBiYXNlIG5hbWUuCisJKG9ial9lbGZfc3RhYl9nZW5lcmljKTogUmVuYW1lZCBmcm9tIC4uLl9zdGFiLiAgTmV3IGFyZ3VtZW50CisJc3BlY2lmaWVzIHNlY3Rpb24gYmFzZSBuYW1lLgorCShvYmpfZWxmX3N0YWIpOiBOZXcgZnVuY3Rpb24sIGNhbGxzIG9ial9lbGZfc3RhYl9nZW5lcmljIHdpdGgKKwkiLnN0YWIiIGFzIHNlY3Rpb24gYmFzZSBuYW1lLgorCShvYmpfZWxmX3hzdGFiKTogTmV3IGZ1bmN0aW9uLCBjYWxscyBvYmpfZWxmX3N0YWJfZ2VuZXJpYy4KKwkob2JqX2VsZl90eXBlKTogSGFuZGxlICJvYmplY3QiLiAgVXNlIGJpdHdpc2Utb3IgdG8gbWVyZ2UgaW4KKwlzeW1ib2wgZmxhZ3MgcmF0aGVyIHRoYW4gc2ltcGx5IHJlcGxhY2luZywgc28gZ2xvYmFsL2xvY2FsIGZsYWdzCisJYXJlIHByZXNlcnZlZC4KKwkob2JqX2VsZl9pZGVudCk6IFJld3JpdGUuCisKK1R1ZSBKdW4gMTUgMTc6MDM6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0OyB1c2UgSU5TVEFMTF9YRk9STQorCitXZWQgSnVuICA5IDExOjI2OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogLmFsaWduIHVzZXMgYSBwb3dlciBvZiB0d28KKwlmb3IgYW55IGEub3V0IHRhcmdldCwgbm90IGp1c3QgTGludXggYW5kIDM4NkJTRC4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEbyBub3QgZGVmaW5lIGZvciBhbnkgYS5vdXQKKwl0YXJnZXQuCisKK01vbiBKdW4gIDcgMTM6MzM6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTg4ay5jOiBEb24ndCBpbmNsdWRlIGZsb251bS5oLCBtZC5oLCBtODhrLmguICBUaGV5CisJZG9uJ3QgZXhpc3Qgb3IgZHVwbGljYXRlIG90aGVyIGluY2x1c2lvbnMuCisKKwkqIGNvbmZpZy90Yy12YXguaCAoTk9fUkVMT0MpOiBEZWZpbmUuCisKK01vbiBKdW4gIDcgMDk6NTU6MDMgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRml4IHBhcnNpbmcgb2YgYXNpIG51bWJlci4KKwlGaXggZXJyb3IgbWVzc2FnZS4KKworU2F0IEp1biAgNSAxOTozMjo1MiAxOTkzICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAbmFkYS5rdGguc2UpCisKKwkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogQWRkIDg4MTEwIGluc3RydWN0aW9ucy4KKwkqIGdhcy9jb25maWcvdGMtbTg4ay5jIChnZXRfcmVnKTogTmV3IGFyZyByZWdfcHJlZml4LiAgQ29tcGFyZSBmaXJzdAorCWNoYXIgdG8gcmVnX3ByZWZpeCBpbnN0ZWFkIG9mIHRvICdyJy4KKwkoY2FsY29wKTogQ2hhbmdlIGNhbGxzIHRvIGdldF9yZWcuCisJKGNhbGNvcCk6IEhhbmRsZSBuZXcgY2FzZSAneCcgdG8gc2V0IHJlZ19wcmVmaXguCisJKGNhbGNvcCk6IFNldCByZWdfcHJlZml4IHRvICdyJyBhZnRlciBlYWNoIGNhbGwgdG8gZ2V0X3JlZy4KKwkoY21wc2xvdCk6IEFkZCA4ODExMCBjb25kaXRpb25zLgorCisJKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmg6IFN3YXAgY2FzZXMgZm9yICJyb3QiIGZvciBjb25zaXN0ZW5jeS4KKworCSogZ2FzL2NvbmZpZy90Yy1tODhrLmMgKGdldF9iZik6IEFsd2F5cyByZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlcgorCWJlZm9yZSByZXR1cm5pbmcuCisKKwkqIGdhcy9jb25maWcvbTg4ay1vcGNvZGUuaCAobTg4a19vcGNvZGVzKTogTWFrZSBlcXVhbCBtbmVtb25pY3MKKwlhZGphY2VudDsgbW92LnMgYW5kIG1vdi5kIHN3YXBwZWQuCisJKG04OGtfb3Bjb2Rlcyk6IEZpeCB0eXBvIGByMicgLT4gYDInLgorCitGcmkgSnVuICA0IDE1OjU5OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9oODMwMC5jOiBTdXBwb3J0IGZvciBIOC8zMDAtSCBvcGNvZGVzLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod19zdHJpbmdzKTogU3RyaW5nIHRhYmxlIGxlbmd0aCBpcyA0CisJYnl0ZXMsIG5vIG1hdHRlciB3aGF0IHRoZSBob3N0IGludCBzaXplIGlzLgorCisJKiBjb25maWd1cmUuaW4gKGFscGhhLSotb3NmKik6IE5ldy4KKworRnJpIEp1biAgNCAwNzo1MToxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgZWNvZmYgYW5kCisJbWlwcy1saXQuCisJKG1pcHMtKi1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCisKKwkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfcHJvY3MpOiBGb3JjZSB0aGUgYWRyIG9mIHRoZQorCWZpcnN0IEZEUiBpbiBhIGZpbGUgdG8gYmUgemVyby4KKworVGh1IEp1biAgMyAxNDowOTo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogSnVtcCB0byAyLjEuNC4KKworCSogY29uZmlnL2hvLWhwcGFic2QuaDogTmV3IGZpbGUsIGZyb20gUGV0ZXIgSG9vZ2VuYm9vbS4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXNzZW1ibGUpOiBDYWxsIGJmZF9zZXRfZ3Bfc2l6ZSBvbmx5IGZvcgorCUVDT0ZGIGZvcm1hdC4KKworVHVlIEp1biAgMSAxNToyMTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogVGhlIDY4MDQwIGNwdSBkb2Vzbid0IHdhbnQgYQorCXNlcGFyYXRlICc4NTEgbW11LgorCisJKiBjb25maWcvb2JqLWVsZi5jLCBjb25maWcvb2JqLWVsZi5oOiBVcGRhdGUgZm9yIG5ldyB0eXBlLCBtYWNybywKKwlhbmQgcm91dGluZSBuYW1lcy4gIEFzc3VtaW5nIDMyIGJpdHMgZm9yIG5vdy4KKworCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IExvb2sgZm9yIG1hY3JvCisJZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vaywgaW5zdGVhZCBvZiBhc3N1bWluZyBhIGZ1bmN0aW9uCisJYWx3YXlzIGV4aXN0cy4KKwkqIGNvbmZpZy90Yy1ocHBhLmMgKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vayk6IFJlbmFtZWQgZnJvbQorCXRjX2ZpbmFsX3Byb2Nlc3NpbmdfaG9vay4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2spOiBVc2UgaXQuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19zeW1ib2wsIGVsZl90Y19tYWtlX3NlY3Rpb25zKTogTWFjcm9zCisJbW92ZWQgaGVyZSBmcm9tIG9iai1lbGYuaC4KKwkqIGNvbmZpZy9vYmotZWxmLmg6IERvbid0IGluY2x1ZGUgQ1BVLXNwZWNpZmljIGhlYWRlciBmaWxlcy4KKworU3VuIE1heSAzMCAxNjo0OTozNyAxOTkzICBQZXRlciBIb29nZW5ib29tICAoaG9vZ2VuQGZhc3QuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJhdGlvbnMgc2hvdWxkIG1hdGNoIG9uICdocHBhKicgbm90ICdocHBhJy4KKworCSogcmVhZC5jOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXggKGRlbm90ZWQKKwl3aXRoICcjaWZkZWYgVENfSFBQQScpLgorCisJKiBzeW1ib2xzLmM6IEFkZCBzdXBwb3J0IGZvciBIUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHN5bnRheCAoZGVub3RlZAorCXdpdGggJyNpZmRlZiBUQ19IUFBBJykuCisKKwkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogIEFkZCBzdXBwb3J0IGZvciBIUFBBLXN0eWxlCisJcmVsb2NhdGlvbnMuCisKKwkqIGNvbmZpZy9vYmotZWxmLmM6IFN0YWIgc3ltYm9scyB3ZXJlbid0IHdyaXR0ZW4gcHJvcGVybHkuCisJKG9ial9lbGZfdmVyc2lvbik6CisJKG9ial9lbGZfZGVzYyk6CisJKG9ial9lbGZfd3JpdGVfc3ltYm9sKToKKwkob2JqX2VsZl93cml0ZV9zeW1ib2xfcCk6CisJKG9ial9lbGZfZnJvYl9zeW1ib2wpOgorCShlbGZfc3RhYl9zeW1ib2wpOgorCShlbGZfZnJvYl9maWxlKToKKworCSogY29uZmlnL3RjLWhwcGEuYzogU3VwcG9ydCBmb3IgSFBQQSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zLgorCVJlbW92ZSBzb21lIHVudXNlZCBjb2RlLiAgU3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZQorCXN5bnRheC4KKworCSogYXBwLmM6CisKKwkqIHN5bWJvbHMuYzoKKworCSogY29uZmlnL29iai1lbGYuaDoKKwkob2JqX3dyaXRlX3N5bWJvbCk6CisJKG9ial9mcm9iX2ZpbGUpOgorCShlbGZfdGNfc3ltYm9sKToKKwkoZWxmX3RjX21ha2Vfc2VjdGlvbnMpOgorCisJKiBjb25maWcvdGMtaHBwYS5oOgorCitTdW4gTWF5IDMwIDIxOjQ0OjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9yZWFkX2JlZ2luX2hvb2ssIGFkZF9maWxlKTogQXNzdW1lCisJaGFzaF9uZXcgd2lsbCBoYXZlIHN1Y2NlZWRlZCBpZiBpdCByZXR1cm5zLgorCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYmVnaW4pOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLWkzODYuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBOb3cgbmJ5dGVzX3JfbGVuZ3RoIGlzCisJY29uc3QuCisJKG1vZGVfZnJvbV9kaXNwX3NpemUsIG9wY29kZV9zdWZmaWNfdG9fdHlwZSk6IE5vdyBpbmxpbmUgdW5kZXIKKwlnY2MuCisJKGZpdHNfaW5fe3NpZ25lZCx1bnNpZ25lZH1fe2J5dGUsd29yZH0pOiBMaWtld2lzZS4KKworCSogZXhwci5jOiBEZWxldGUgcmVnaXN0ZXIgZGVjbGFyYXRpb25zOyBnY2MgaWdub3JlcyB0aGVtIGFueXdheXMuCisKK0ZyaSBNYXkgMjggMTk6MDM6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBoYXNoLmMgKGhhc2hfbmV3KTogVXNlIHhtYWxsb2MsIHNpbmNlIG1hbnkgY2FsbGVycyBkb24ndCBjaGVjaworCWZvciBmYWlsdXJlLgorCitUaHUgTWF5IDI3IDEzOjAyOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZnJhZ3MuYyAoemVyb19hZGRyZXNzX2ZyYWcsIGJzc19hZGRyZXNzX2ZyYWcpOiBUaGVzZSBhcmUKKwlleHRlcm5hbC4KKworCSogdGMuaCAobWRfcmVsb2Nfc2l6ZSk6IFRoaXMgaXMgY29uc3QuCisJKiBjb25maWcvdGMte2EyOWssaDgzMDAsaDg1MDAsaTM4NixpODYwLGk5NjAsbTY4ayxuczMyayx6OGt9LmMKKwkobWRfcmVsb2Nfc2l6ZSk6IE5vdyBjb25zdC4KKworCSogY29uZmlnL2FvdXRfZ251LmggKGVudW0gbWFjaGluZV90eXBlLCBlbnVtIHJlbG9jX3R5cGUpOiBEZWxldGUKKwl0cmFpbGluZyBjb21tYXMuCisJKiBhcy5oIChlbnVtIF9zZWdUKTogRGl0dG8uCisKKwkqIHN0cnVjLXN5bWJvbC5oIChOX1RZUEVfc2VnKTogVGhpcyBzaG91bGQgYmUgY29uc3QuCisKK1RodSBNYXkgMjcgMTE6NDM6NTkgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCisKKwkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUpOiBDYXN0IGZpbGVfbmFtZSB0byBjaGFyICogaW4KKwlsaXN0aW5nX3NvdXJjZV9maWxlIGNhbGwuCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcpOiBDYXN0IGZpcnN0IGFyZ3VtZW50CisJb2Ygc3Vic2VnX25ldyBjYWxsIHRvIGVsaW1pbmF0ZSBjb25zdCBhdHRyaWJ1dGUuCisJKG9ial9lbGZfc3RhYik6IERpdHRvLgorCShvYmpfc3ltYm9sX25ld19ob29rKTogQ2FzdCBmaXJzdCBhcmd1bWVudCBvZiBiemVybyBjYWxsIHRvIGNoYXIgKi4KKworCSogcmVhZC5jIChzX2FsaWduX2J5dGVzKTogUHJvcGVybHkgcmVjb3JkIGFsaWdubWVudC4KKworCSogZXhwci5jIChfXyk6IFVuZGVmaW5lIF9fIG1hY3JvIGJlZm9yZSB1c2UsIHNpbmNlIE9TRi8xIHVzZXMgaXQKKwlmb3IgdGhlIHByb3RvdHlwZS9ubyBwcm90b3R5cGUgbWFjcm8uCisKKwkqIGFzLmMgKGdvdF9zaWcpOiBEb24ndCBkbyByZXR1cm4gKChTSUdUWSkgMCksIFNJR1RZIG1pZ2h0IHdlbGwgYmUKKwl2b2lkLgorCisJKiBhcy5oIChyZWxheF9zdGF0ZVQgZW51bSk6IERlbGV0ZSB0cmFpbGluZyBjb21tYS4KKworVGh1IE1heSAyNyAxMTowNzo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IExldCBsaW5lX2NvbW1lbnRfY2hhcnMgb3ZlcnJpZGUKKwljb21tZW50X2NoYXJzLgorCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBhIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIgaXMgbm90IGF0IHRoZQorCXN0YXJ0IG9mIGEgbGluZSwgdHJlYXQgaXQgYXMgYSBjb21tZW50IGNoYXJhY3RlciBpZiBpdCBpcyBvbmUuCisJRm9yIGEgQ1BQIGxpbmUgY29tbWVudCB1c2UgcHNldWRvLW9wIC5hcHBsaW5lIHJhdGhlciB0aGFuIC5saW5lLgorCSogaW5wdXQtc2NydWIuYyAobG9naWNhbF9pbnB1dF9saW5lKTogTWFrZSBpbnQgcmF0aGVyIHRoYW4KKwl1bnNpZ25lZC4KKwkoaW5wdXRfc2NydWJfcHVzaCwgaW5wdXRfc2NydWJfYmVnaW4pOiBJbml0aWFsaXplCisJbG9naWNhbF9pbnB1dF9saW5lIHRvIC0xIHJhdGhlciB0aGFuIDAuCisJKGJ1bXBfbGluZV9jb3VudGVycyk6IEluY3JlbWVudCBsb2dpY2FsX2lucHV0X2xpbmUuCisJKG5ld19sb2dpY2FsX2xpbmUpOiBJZiBsaW5lX251bWJlciBpcyAtMiwgZGVjcmVtZW50CisJbG9naWNhbF9pbnB1dF9saW5lLgorCShhc193aGVyZSk6IFVzZSBsb2dpY2FsX2lucHV0X2xpbmUgZXZlbiBpZiBpdCBpcyAwLgorCSogcmVhZC5oIChzX2FwcF9maWxlIHByb3RvdHlwZSk6IE5vdyB0YWtlcyBhbiBpbnQgYXJndW1lbnQuCisJKiByZWFkLmMgKHBvdGFibGUpOiBNYWtlIC5hcHBmaWxlIGNhbGwgc19hcHBfZmlsZSB3aXRoIDEuICBOZXcKKwkuYXBwbGluZSBwc2V1ZG8tb3AgY2FsbHMgc19hcHBfbGluZS4KKwkoc19hcHBfZmlsZSk6IElmIC5hcHBmaWxlLCBjYWxsIG5ld19sb2dpY2FsX2xpbmUgd2l0aCAtMiB0bworCWFjY291bnQgZm9yIG5ld2xpbmUgaW5zZXJ0ZWQgYnkgZG9fc2NydWJfbmV4dF9jaGFyLiAgSWYgbGlzdGluZywKKwljYWxsIGxpc3Rpbmdfc291cmNlX2ZpbGUuCisJKHNfYXBwX2xpbmUpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGZha2UgcHNldWRvLW9wIC5hcHBsaW5lLgorCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIC5hcHBsaW5lIGNhbGwKKwlvYmpfY29mZl9sbi4KKwkob2JqX2NvZmZfbG4pOiBBZGRlZCBhcmd1bWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIC5hcHBsaW5lLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9wc2V1ZG9fdGFibGUpOiBNYWtlIC5hcHBsaW5lIGNhbGwKKwlvYmpfY29mZl9sbi4KKwkob2JqX2NvZmZfbG4pOiBBZGRlZCBhcmd1bWVudCB0byBpbmRpY2F0ZSB3aGV0aGVyIC5hcHBsaW5lLgorCSogY29uZmlnL3RjLW1pcHMuYyAoc19maWxlKTogUGFzcyBhcmd1bWVudCB0byBzX2FwcF9maWxlLgorCitUdWUgTWF5IDI1IDExOjU5OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1ib3V0LmggKFNfR0VUX1ZBTFVFKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjYXN0LgorCitUaHUgTWF5IDIwIDE5OjE0OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBTdHJhaWdodGVuIG91dCBjaGVjayBmb3IKKwlpbnZhbGlkIHZhbHVlcy4KKworV2VkIE1heSAxOSAwNzozMzoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaDUwMDAuYyAoYnVpbGRfYnl0ZXMpOiBVbmRlcnN0YW5kIEByZCBtb2RlIGFuZCBidWlsZAorCXJlbG9jYXRpb25zIGNvcnJlY3RseS4KKworTW9uIE1heSAxNyAxNTowNjoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBMZWF2ZSBvdXQgVEVYSTJEVkkgZm9yIG5vdywgYmVjYXVzZQorCWl0J3Mgd3JvbmcuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogQXBwbHkgcmFuZ2UgY2hlY2tzIGFuZCB3YXJuCisJaWYgdmFsdWUgaXMgb3V0IG9mIHJhbmdlLgorCisJUGF0Y2ggZnJvbSBNaW5oIFRyYW4tTGU6CisJKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBGb3IgaW4vb3V0IHBvcnQgcmVnaXN0ZXIgdXNlZAorCWFzIGJhc2UgcmVnLCBpbmNsdWRlIEluT3V0UG9ydFJlZyBpbiBvcGVyYW5kIHR5cGUuCisJKE1BVENIKTogQWNjZXB0IG92ZXJsYXAgdmFsdWUgb2YgSW5PdXRQb3J0UmVnLgorCitNb24gTWF5IDE3IDA5OjI5OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5jIChhZGRfZmlsZSwgb2JqX2Vjb2ZmX2xvYywgb2JqX2Vjb2ZmX3N0YWIpOgorCUFkZCBjYWxscyB0byBsaXN0aW5nIHJvdXRpbmVzIHRvIHByb2R1Y2UgY29tYmluZWQgc291cmNlL2Fzc2VtYmxlcgorCWxpc3RpbmdzLgorCShvYmpfZWNvZmZfc3RhYik6IENyZWF0ZSBhIGZpbGUgcG9pbnRlciBpZiBub25lIHVzZWQgeWV0LgorCShlY29mZl9mcm9iX2ZpbGUpOiBTZXQgc3ltY291bnQgdG8gY29ycmVjdCB2YWx1ZS4KKworRnJpIE1heSAxNCAwNjo1MzozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIHZlcnNpb24gMi4xLCBpbiBwcmVwYXJhdGlvbiBmb3IKKwlyZWxlYXNlLgorCisJKiBjb25maWcvb2JqLWFvdXQuaCAoSF9HRVRfSEVBREVSX1NJWkUsIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKToKKwlEZWZpbmUgaW4gdGVybXMgb2YgY29uc3RhbnRzLCBub3QgQyBzdHJ1Y3R1cmUgc2l6ZXMuCisKKwkqIGNvbmZpZy90Yy1yczYwMDAuYywgY29uZmlnL3RjLXJzNjAwMC5oOiBEZWxldGUgZW1wdHkgZmlsZXMuCisKK1RodSBNYXkgMTMgMTc6MDE6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2hlYWRlcl9hcHBlbmQpOiBEb24ndCBkZWZpbmUgaWYgaXQncworCWRlZmluZWQgYXMgYSBtYWNyby4KKwkqIGNvbmZpZy9vYmotaHAzMDAuaCAob2JqX2hlYWRlcl9hcHBlbmQpOiBEZWZpbmUgaXQgYXMgYSBtYWNyby4KKwkqIGNvbmZpZy9vYmotaHAzMDAuYyAoaHAzMDBfaGVhZGVyX2FwcGVuZCk6IE5ldyBmdW5jdGlvbi4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGJvdGhlciBjbGVhbmluZyB1cCBkb2MgZmlsZXM7CisJdGhleSBhcmVuJ3QgZ29pbmcgdG8gYmUgaW4gdGhpcyBkaXJlY3RvcnkuCisKK1RodSBNYXkgMTMgMDc6NTE6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBIYW5kbGUgYWJzb2x1dGUKKwlzeW1ib2xzLgorCisJKiB0Yy5oIChUQ19DT0ZGX1NJWkVNQUNIREVQKTogRG9uJ3QgZGVmaW5lIGhlcmUuCisJKiBjb25maWcvdGMtc2guaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IERlZmluZSBoZXJlIGluc3RlYWQuCisKK01vbiBNYXkgMTAgMDY6MDE6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19TeW1ib2xfdHlwZV9saXN0KTogRG9uJ3QgYm90aGVyIHdpdGgKKwlpbml0aWFsaXphdGlvbi4KKworCSogY29uZmlndXJlLmluICh0YXJnZXRzKTogVHJlYXQgbTY4Ki0qLXN5c3YqIGxpa2UgbTY4ay0qLWNvZmYuCisKK1dlZCBNYXkgIDUgMTQ6MDA6NDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgZmxvYXRpbmcgcG9pbnQgZG91YmxlIHdvcmQKKwlsb2FkcyBhbmQgc3RvcmVzIGZvciBiaWcgZW5kaWFuIHRhcmdldC4KKworV2VkIE1heSAgNSAwODozOToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWkzODYuYzogUmVwbGFjZSBTRUdfKiB3aXRoICpfc2VjdGlvbiwgZml4IHVwIHN1YnNlZ18qCisJY2FsbHMuICBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUuCisJKiBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCisKKwlFTEYgc3VwcG9ydCwgbW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV0YWg6CisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24sIG9ial9lbGZfc3RhYiwgb2JqX2VsZl9saW5lLAorCW9ial9lbGZfdHlwZSk6IFJld3JpdGUuCisJKG9ial9lbGZfZnJvYl9zeW1ib2wsIGVsZl9zdGFiX3N5bWJvbF9zdHJpbmcsIGVsZl9zdGFiX3N5bWJvbCwKKwlvYmpfZWxmX2Rlc2MsIG9ial9lbGZfdmVyc2lvbiwgb2JqX3N5bWJvbF9uZXdfaG9vaywgb2JqX2VsZl9zaXplKToKKwlOZXcgZnVuY3Rpb25zLgorCShvYmpfZWxmX2lkZW50KTogRHVtbXkuCisJKiBjb25maWcvb2JqLWVsZi5oIChGQUxTRSwgVFJVRSwgU18qLCB0Y19mcm9iX3N5bWJvbCwKKwlUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE5ldyBtYWNyb3MuCisJKGdkYl9zZWN0aW9uKTogTmV3IHZhcmlhYmxlIGRlY2wuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2F0b2YpOiBSZXR1cm4gemVybywgbm90IGVtcHR5IHN0cmluZywgb24KKwlzdWNjZXNzLgorCisJQkZEX0FTU0VNQkxFUiBjb25kaXRpb25hbCBjaGFuZ2VzOgorCSogY29uZmlnL29iai1jb2ZmLmMgKGxpbmVub19yb290UCwgc2VnX05fVFlQRSwgKl9zZWN0aW9uX2hlYWRlcik6CisJRG9uJ3QgZGVmaW5lIHRoZXNlLgorCShTQV9TRVRfU1lNX0VORE5EWCwgU0FfU0VUX1NZTV9UQUdORFgpOiBOZXcgZnVuY3Rpb25zLgorCShmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24pOiBEaXR0by4KKwkob2JqX2NvZmZfZW5kZWYpOiBDYWxsIGZldGNoX2NvZmZfZGVidWdfc2VjdGlvbi4KKwkoc3RydWN0IGxpbmVfbm8pOiBOZXcgdHlwZS4KKwkoY19zeW1ib2xfbWVyZ2UpOiBOZXcgd2F5IGZvciBjb3B5aW5nIGF1eCBmaWVsZHMuCisJKGNfZG90X2ZpbGVfc3ltYm9sKTogUHV0IHN5bWJvbCBpbiBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgc2V0IGZsYWcKKwlCU0ZfREVCVUdHSU5HLgorCShmdW5jdGlvbl9saW5lb2ZmKTogTmV3IHN5bWJvbC4KKwkoZnVuY3Rpb25fbGluZW9mZiwgdGV4dF9saW5lbm9fbnVtYmVyLCBvdXJfbGluZW5vX251bWJlciwKKwlsaW5lbm9fbGFzdFApOiBEb24ndCBkZWZpbmUuCisJKGNfbGluZV9uZXcpOiBEb24ndCBkZWZpbmUuCisJKG9ial9lbWl0X2xpbmVubywgb2JqX2NvZmZfZW5kZWYpOiBVc2UgYWJvcnQgY2FsbHMgYXMsIHVoLAorCXBsYWNlaG9sZGVycywgdW50aWwKKwlsaW5lLW51bWJlciByZWNvcmRpbmcgZ2V0cyBpbXBsZW1lbnRlZC4KKwkob2JqX25ld19zeW1ib2xfaG9vayk6IE5ldyBjb2RlIGZvciBoYW5kbGluZyBhdXggZmllbGRzLgorCShhZGRfbGluZW5vLCBhZGRfbGluZXN5bSk6IE5ldyBmdW5jdGlvbnMuCisJKG9ial9jb2ZmX2xuKTogQ2FsbCBhZGRfbGluZW5vLCBub3QgY19saW5lX25ldy4KKwkob2JqX2NvZmZfZW5kZWYpOiBOZXcgY29kZSBmb3IgaGFuZGxpbmcgc3ltYm9sIG5hbWVzLiAgTmV3IGxpbmVubworCWNvZGUuICBMb29rIGZvciBzZWN0aW9uIG5hbWUgIipERUJVRyoiIGZvciBkZWJ1Z2dpbmcgc2VjdGlvbi4KKwkoYWxpZ24sIGNvZmZfY2hlY2tfZmlsZV9zeW1ib2xzLCBvYmpfY29mZl9zZWN0aW9uLAorCWNvZmZfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9ucy4KKwkqIGNvbmZpZy9vYmotY29mZi5oOiBSZW9yZGVyZWQgc29tZSBpbmNsdWRlcy4KKwkoQllURV9PUkRFUklORywgRklMRV9IRUFERVJfTUFHSUMsIHNlZ19OX1RZUEUsIE5fVFlQRV9zZWcsCisJREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFLCBBT1VUSERSLCBBT1VUSERSU0laRSk6IERvbid0CisJZGVmaW5lIHRoZXNlLgorCShUQVJHRVRfU1lNQk9MX0ZJRUxEUywgSTk2MF9TWU1fRklFTERTKTogTmV3IG1hY3Jvcy4KKwkoU1lNX0FVWEVOVCk6IE5ldyBtYWNybyAoZm9yIG5vbi1CRkRfQVNTRU1CTEVSIHRvbykgZm9yIGFjY2Vzc2luZworCWF1eCBlbnRyaWVzLiAgTW9zdCBTQV8qIG1hY3JvcyBub3cgdXNlIGl0IHVuY29uZGl0aW9uYWxseS4KKwkoU18qKTogVXNlIGBic3ltJyBmaWVsZCwgYW5kIGFjY2VzcyBCRkQgcHJpdmF0ZSBkYXRhLgorCShTRl8qKTogVXNlIGBzeV9mbGFncycgc3ltYm9sIGZpZWxkIGZvciBtb3N0IG9mIHRoZXNlLgorCShIXyosIG9iamVjdF9oZWFkZXJzLCBsaW5lbm8sIGxpbmVub18qUCwgT0JKX0VNSVRfTElORU5PKTogRG9uJ3QKKwlkZWZpbmUuCisJKCpfc2VjdGlvbl9oZWFkZXIpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jb252ZXJ0X2ZyYWcsIG1kX2FwcGx5X2ZpeCk6IENoYW5nZWQKKwlpbnRlcmZhY2UuCisJKHRjX2dlbl9yZWxvYykgW0kzODZDT0ZGXTogTmV3IGZ1bmN0aW9uLgorCSh0Y19hb3V0X2ZpeF90b19jaGFycywgdGNfY29mZl9maXgycnR5cGUpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfQVJDSCwgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBOZXcKKwltYWNyb3MuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChzdGFja19pbml0KTogRG9uJ3QgZG8gYXNzaWdubWVudHMgaW5zaWRlCisJY29uZGl0aW9ucy4KKwkob2JqX2NvZmZfZGVmKTogU2ltcGxpZmllZCBoYW5kbGluZyBvZiBzeW1ib2wgbmFtZSBhIGJpdC4KKwkodGFnX2luc2VydCk6IE5hbWUgYXJndW1lbnQgaXMgbm93IHBvaW50ZXIgdG8gQ09OU1QuCisJKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBDb21tZW50ZWQgb3V0LgorCisJKiBjb25maWcvb2JqLWNvZmYuaDogVXNlIFBBUkFNUyBtYWNybyBpbiBwcm90b3R5cGVzLgorCisJKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgaW5kaXJlY3QKKwl0aHJvdWdoIGZyY2hhaW5QIHBvaW50ZXIgaWYgaXQgaXMgbnVsbC4KKworCSogY29uZmlndXJlLmluOiBXYXJuIGlmIEJGRCBtb2RlIGlzIGV4cGxpY2l0bHkgdHVybmVkIG9mZiBidXQgaXMKKwlyZXF1aXJlZCBieSBzcGVjaWZpZWQgdGFyZ2V0LgorCShtaXBzIGVjb2ZmIHRhcmdldHMpOiBEb24ndCBuZWVkIHRvIHNldCBiZmRfZ2FzIGhlcmU7IGl0IGdldHMKKwl0YWtlbiBjYXJlIG9mIGxhdGVyLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoY3Jhd2xfc3ltYm9scyk6IERvbid0IGNsZWFyIHN5X2ZvcndhcmQKKwlmaWVsZC4KKwkoeWFua19zeW1ib2xzKTogTWVyZ2Ugc3ltYm9scyBvbmx5IGlmIHN5X2ZvcndhcmQgaXMgbnVsbC4KKworCSogY29uZmlnL3RjLW02OGsuaCAoQU9VVF9NQUNIVFlQRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5CisJZGVmaW5lZC4KKworCSogdGMuaCAobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IFNlY3Rpb24gYXJnIGlzIG5vdAorCXBvaW50ZXIuCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogRGl0dG8uCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCkgW09CSl9FTEZdOiBBbnl0aGluZyBzdGFydGluZworCXdpdGggIi4iIGlzIGEgbG9jYWwgbGFiZWwuCisKKwkqIGNvbmZpZy90ZS1ocHBhLmgsIGNvbmZpZy90Yy1ocHBhLmgsIGNvbmZpZy90Yy1ocHBhLmM6IE5ldyBjb25maWcKKwlmaWxlcy4KKworCSogY29uZmlnL3RlLWxpbnV4LmgsIGNvbmZpZy90ZS0zODZic2QuaDogTmV3IGNvbmZpZyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4LCBpMzg2LSotYnNkKTogVXNlIHRoZW0uCisJKiBjb25maWcvdGMtaTM4Ni5oIChUQVJHRVRfRk9STUFUKTogU2VsZWN0IGZvcm1hdCBiYXNlZCBvbiB0YXJnZXQKKwllbnZpcm9ubWVudC4KKwkoRE9UX0xBQkVMX1BSRUZJWCk6IERvbid0IGRlZmluZSBmb3IgMzg2YnNkIG9yIExpbnV4LgorCitXZWQgTWF5ICA1IDEzOjE0OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5jIChpbml0X2ZpbGUpOiBTZXQgZk1lcmdlIHRvIDAgc2luY2UgZGJ4IHNlZW1zCisJdG8gd2FudCBpdCB0aGF0IHdheS4KKwkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFR1cm4gbG9jYWwgc3RfUHJvYyBzeW1ib2xzIGludG8KKwlzdF9TdGF0aWNQcm9jIHN5bWJvbHMuICBTZXQgaW5kZXggZmllbGQgb2YgZXh0ZXJuYWwgc3RfUHJvYyBhbmQKKwlzdF9zdGF0aWNQcm9jIHN5bWJvbHMgY29ycmVjdGx5LgorCSogY29uZmlnL3RjLW1pcHMuaCAoTk9fTElTVElORyk6IERvbid0IGRlZmluZS4gIFBlb3BsZSBtaWdodCB3YW50CisJbGlzdGluZ3MuCisKK1R1ZSBNYXkgIDQgMjE6MjI6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWhwMzAwLmgsIGNvbmZpZy9vYmotaHAzMDAuYywgY29uZmlnL3RlLWhwMzAwLmg6IE5ldworCWZpbGVzLgorCSogY29uZmlndXJlLmluIChtNjhrLSotaHB1eCk6IFVzZSB0aGVtLgorCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3ByZV93cml0ZV9ob29rKTogVXNlIEFPVVRfVkVSU0lPTiBpZgorCWRlZmluZWQsIG90aGVyd2lzZSB6ZXJvLgorCisJKiBjb25maWcvYW91dF9nbnUuaCAoT01BR0lDKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KKworTW9uIE1heSAgMyAxNTo1OTozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWxsb3cgYW55IGFicyBleHByZXNzaW9uIGFzIGFuCisJYWRkcmVzcyBzcGFjZSBudW1iZXIuCisKK1dlZCBBcHIgMjggMTk6MTE6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotYW91dC5oIChUQVJHRVRfREVGQVVMVCk6IERvbid0IGRlZmF1bHQgdGhpcyBhdCBhbGwuCisKKwkqIGNvbmZpZy90Yy1hMjlrLmM6IEluY2x1ZGUgY3R5cGUuaC4KKwkoZGVmaW5lX3NvbWVfcmVncyk6IEFkZGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMgZm9yIDI5MDUwLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChjb21tZW50X2NoYXJzKSBbVEVfSTM4NkFJWF06IEluY2x1ZGUgIi8iLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IFNUWVBfUkVHIGhlcmUuCisJKGNoYW5nZV90b19zZWN0aW9uKTogU2V0IGl0IGhlcmUgaW5zdGVhZC4KKworV2VkIEFwciAyOCAxMzo0MDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWVjb2ZmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBNYWtlIHVwIGEgLmZpbGUgaWYgb25lCisJaGFzbid0IGJlZW4gc2VlbiB5ZXQuCisJKGFkZF9lY29mZl9zeW1ib2wpOiBEb24ndCByZWZlciB0byBjdXJfZmlsZV9wdHIgaWYgaXQgaXMgTlVMTC4KKworTW9uIEFwciAyNiAxODoyOTowNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNoLmNoLCBjb25maWcvdGMtc2guaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgSGl0YWNoaQorCVNILgorCitNb24gQXByIDI2IDEyOjI4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZXhwci5jIChvcGVyYW5kKTogRml4IHVuYXJ5IHBsdXMgb3BlcmF0b3IgKHByZXZpb3VzbHkgd2FzIHRoZQorCXNhbWUgYXMgJ34nIG9wZXJhdG9yISkuCisKK1dlZCBBcHIgMjEgMDA6MjA6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogRGVmaW5lIGV2ZW4gaWYgQkZEIGlzIGRlZmluZWQuCisJKHdyaXRlX29iamVjdF9maWxlKTogRG8gZGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuICBJbnZva2UKKwlvYmpfY2hlY2tfZmlsZV9zeW1ib2xzIGlmIGRlZmluZWQuICBDYWxsIHZlcmlmeV9zeW1ib2xfY2hhaW5fMgorCWluc3RlYWQgb2Ygb3Blbi1jb2RpbmcgaXQuICBGaXggc29tZSBidWdzIGluIHBhdGNoaW5nIHVwIHN5bWJvbAorCWNoYWluLgorCShyZWxheF9zZWdtZW50KTogTWFrZSBzb21lIGNvZGUgd2UgIm91Z2h0IHRvIGJlIGFibGUgdG8iIHVzZSBmb3IKKwlhbGwgdGFyZ2V0cyBubyBsb25nZXIgY29uZGl0aW9uYWxpemVkIG9uIG5zMzJrIHRhcmdldDsgaW5zdGVhZCwgZG8KKwlpdCBhbHdheXMsIGFuZCBpZiB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9ucyBmYWlsLCBhYm9ydC4KKworCSogc3ltYm9scy5jIChERUJVRyk6IEVuYWJsZWQuCisJKHN5bWJvbF9uZXcpOiBNYWtlIHN1cmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sIHdvcmtzLgorCSh2ZXJpZnlfc3ltYm9sX2NoYWluXzIpOiBOZXcgZnVuY3Rpb247IHRha2VzIG9uZSBzeW1ib2wgYXMKKwlhcmd1bWVudCwgYW55d2hlcmUgaW4gdGhlIGNoYWluLgorCShkb2xsYXJfbGFiZWwqKTogVXNlIGRlZmF1bHQgaW5pdGlhbGl6ZXJzLgorCisJKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIG1kX2JlZ2luIGhlcmUuLi4KKwkobWFpbik6IC4uLmFuZCBub3QgaGVyZS4KKworCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSBhLm91dC1zdW5vcy1iaWcgZm9yIGEub3V0LgorCSh0Y19mcm9iX3N5bWJvbCk6IE5ldyBtYWNybzogR2V0IHJpZCBvZiBzeW1ib2xzIGluIHJlZ19zZWN0aW9uLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChvbWFnaWMpOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCisJKGFkZF9maXgsIGFkZF9mcmFnKTogTm93IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG1hY3Jvcy4KKwkobTY4a19yZWdfcGFyc2UsIG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBnZXRfbnVtLAorCXNfZGF0YTEsIHNfZGF0YTIsIHNfYnNzKTogVXNlIG5ldyAqX3NlY3Rpb24gbmFtZXMsIGZvcgorCWNvbXBhdGliaWxpdHkgd2l0aCBCRkRfQVNTRU1CTEVSIG1vZGU7IHJld3JpdGUgc3dpdGNoIHN0YXRlbWVudHMKKwl0byBoYW5kbGUgbm9uLWludGVncmFsIHNlZ1QuCisJKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19hb3V0X2ZpeF90b19jaGFycywKKwl0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCisJKHRjX2dlbl9yZWxvYyk6IE5ldyByb3V0aW5lIGZvciBCRkRfQVNTRU1CTEVSLgorCShtZF9hcHBseV9maXgsIG1kX2FwcGx5X2ZpeF8yKTogUmVuYW1lZCBvbGQgbWRfYXBwbHlfZml4IHRvCisJbWRfYXBwbHlfZml4XzI7IG5ldyBtZF9hcHBseV9maXggZGVmaW5pdGlvbiB2YXJpZXMgaW50ZXJmYWNlCisJZGVwZW5kaW5nIG9uIEJGRF9BU1NFTUJMRVIuCisJKG1kX2NvbnZlcnRfZnJhZywgbWRfY29udmVydF9mcmFnXzEpOiBMaWtld2lzZS4gIFVzZSBuZXcgKl9zZWN0aW9uCisJbmFtZXMuCisKKwkqIGNvbmZpZy9vYmotdm1zLmM6IEluY2x1ZGUgY29uZmlnLmguCisJKHZlcnNpb25fc3RyaW5nKTogRGVsZXRlIGRlY2xhcmF0aW9uLgorCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBVc2UgR0FTX1ZFUlNJT04gaW5zdGVhZC4KKwkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tIFZNUyBjb2RlIGluCisJc3ltYm9scy5jLgorCShfZG9wcm50KTogRGVsZXRlZC4KKwkoVk1TX1N0b3JlX1N0cnVjdCwgVk1TX0RlZl9TdHJ1Y3QsIFZNU19TZXRfU3RydWN0LAorCVZNU19UQlRfQmxvY2tfRW5kLCBnZXRfVk1TX3RpbWVfb25fdW5peCwgZ2VuZXJhdGVfc3VmZml4LAorCVZNU19Qc2VjdF9TcGVjKTogRml4ZWQgdG8gY29tcGlsZSB1bmRlciB0cmFkaXRpb25hbCBDLgorCSogY29uZmlnL29iai12bXMuaDogVXNlIFBBUkFNUyBtYWNyby4KKwkodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogRGVjbGFyZS4KKwkoUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKTogTmV3IG1hY3JvLgorCSogc3ltYm9scy5jIChjb2xvbik6IFJlbW92ZSBzb21lIFZNUy1zcGVjaWZpYyBjb2RlLCBsb29rIGZvcgorCVJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTiBtYWNybyBpbnN0ZWFkLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRG9uJ3QgdHJ5IGV4cGFuZGluZyBEQmNjCisJaW5zdHJ1Y3Rpb25zLgorCisJKiBjb25maWcvdGMtaTM4Ni5jOiBSZW9yZGVyZWQgc29tZSBmdW5jdGlvbnMgc28gaW5saW5pbmcgbWlnaHQKKwl3b3JrLiAgVXNlIFBBUkFNUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisJKHJlbG9jKTogTmV3IHJvdXRpbmUuCisJKG1kX2Fzc2VtYmxlKTogUmVhcnJhbmdlIHN3aXRjaCBzdGF0ZW1lbnRzIHRvIHdvcmsgd2l0aAorCW5vbi1pbnRlZ3JhbCBzZWdULgorCisJKiBzdHJ1Yy1zeW1ib2wuaCBbQkZEX0FTU0VNQkxFUl06IFVuZGVmaW5lCisJU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyBiZWZvcmUgZGVmaW5pbmcgaXQuCisKKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ld19yZXN0KTogTm93IHN0YXRpYy4KKworCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogQmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIGRpZmZlcmVuY2Ugb2YKKwlzeW1ib2xzIGluIGRpZmZlcmVudCBmcmFncy4KKworCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUGFzcyBkb3duIHNvbWUgbmV3IHZhcmlhYmxlcywgaW5kaWNhdGluZworCXBhdGhuYW1lIG9yIHByb2dyYW0gbmFtZSBmb3IgY2MsIG5tLCBvYmpkdW1wLgorCisJKiBhcy5oIChPVVRQVVRfRkxBVk9SKTogTmV3IG1hY3JvLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IFVzZSBPVVRQVVRfRkxBVk9SLgorCisJKiBjb25maWd1cmUuaW46IEluaXRpYWxpemUgYmZkX2dhcyBwcm9wZXJseS4gIFdhcm4gdGhhdCBFTEYKKwlzdXBwb3J0IGlzIGluY29tcGxldGUuCisKK1RodSBBcHIgMTUgMjI6Mzk6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBBY2NlcHQgbnVsbCBwb2ludGVyIHJldHVybiBmcm9tIG1kX2F0b2YuCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwgZm9yIHN1Y2Nlc3MuCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXRvZik6IERpdHRvLgorCitUaHUgQXByIDE1IDE2OjA0OjM5IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGRvYy9hcy50ZXhpbmZvOiBmb3JtYXR0aW5nIGFuZCBjb21tZW50IGNsZWFudXBzOyBzaG93IFNQQVJDCisJYWx0ZXJuYXRpdmUgb3B0aW9ucyBpbiBzYW1lIHN0eWxlIGFzIG90aGVyIG1hY2hpbmVzOyBzaW1wbGlmeSBzb21lCisJY29uZGl0aW9uYWwgdXNlOyBpbmNsdWRlIEdQTCBhcyBzZXBhcmF0ZSBmaWxlIChmcm9tIHRleGluZm8gZGlyKQorCisJKiBkb2MvTWFrZWZpbGUuaW46IChhcy5pbmZvKSBpbmNsdWRlIGRpcmVjdG9yeSBjb250YWluaW5nIEdQTCBpbgorCW1ha2VpbmZvIHNlYXJjaCBwYXRoCisKKwkqIGRvYy9oOC50ZXhpOiBuZXcgZmlsZTsgY29uZGl0aW9uYWwgc2V0dGluZ3MgZm9yIEdBUyBtYW51YWwKKwlvbiBIaXRhY2hpIGNoaXBzCisKK1R1ZSBBcHIgMTMgMTU6MzE6NDAgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZG9jL2FzLnRleGluZm86IG1lbnRpb24gU1BBUkMgYXJjaGl0ZWN0dXJlIG9wdGlvbnMuCisKK0ZyaSBBcHIgIDkgMTc6NDM6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVhcnJhbmdlZCB3aGl0ZXNwYWNlIGluIHBlci1ob3N0L3Blci10YXJnZXQKKwlzZWN0aW9ucy4gIEFkZGVkIGhvb2tzIGZvciBkcm9wcGluZyBpbiBIUFBBIHN1cHBvcnQgKG5vdCBpbmNsdWRlZAorCXlldCkuICBTZXBhcmF0ZSBvdXQgb3ZlcnJpZGVzIG9mIHZhcmlhYmxlcyBiYXNlZCBvbiB0YXJnZXQgZm9ybWF0CisJYW5kIGJmZC1nYXMgc2VsZWN0aW9uIGZyb20gYWN0dWFsIHRhcmdldC1zcGVjaWZpYyBjb21tYW5kcy4gIEFkZAorCWVycm9yIG1lc3NhZ2UgZm9yIHJlY29nbml6ZWQgYnV0IHVuc3VwcG9ydGVkIGZvcm1hdCBuYW1lLgorCitGcmkgQXByICA5IDA5OjA1OjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1lY29mZi5oIChlY29mZl9idWlsZF9saW5lbm8pOiBNYWtlIGlsaW5lTWF4IGluCisJc3ltYm9saWMgaGVhZGVyIG1hdGNoIGNsaW5lIGluIEZEUjsgdGhlIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8KKwl3YW50IHRoYXQuCisKK1RodSBBcHIgIDggMTU6NTE6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBkb2MvTWFrZWZpbGUuaW46IGFzLnRleGluZm8gaXMgaW4gJChzcmNkaXIpLiAgVXNlCisJJChzcmNkaXIpL2FzLnRleGluZm8gZXhwbGljaXRseSBpbiBzZXZlcmFsIHBsYWNlcworCitUaHUgQXByICA4IDE1OjE1OjAyIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogdXBkYXRlIGR2aSwgY2xlYW4gdGFyZ2V0cyBmb3IgbmV3IHNvdXJjZQorCQkJICAgZmlsZSBzdHJ1Y3R1cmUKKworVGh1IEFwciAgOCAxMjo1Mjo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9oby1kZWNzdGF0bi5oOiBEZWZpbmUgQlJPS0VOX0FTU0VSVCBpZiBub3QgX19HTlVDX18sCisJcmF0aGVyIHRoYW4gdW5kZWZpbmluZyBrbm93LgorCSogY29uZmlndXJlLmluOiBNYXRjaCB1bHRyaXgqLCBub3QganVzdCB1bHRyaXguCisKK1dlZCBBcHIgIDcgMjA6MTg6MTAgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZG9jL2FzLnRleGluZm86IGNvbnZlcnRlZCBjb25kaXRpb25hbCBtYXJrdXAgdG8gdXNlIG5ldworCVRleGluZm8gZmFjaWxpdGllcywgYXZvaWRpbmcgbTQuCisKKwkqIGRvYy9hcy1hbGwudGV4aW5mbywgYWxsLm00LCBwcmV0ZXgubTQ6IGRlbGV0ZWQuCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogcmVjYXN0IGRvYyBjb25maWd1cmF0aW9uIHRvIHVzZSBhIGxpbmsgdG8gYW4KKwlpbmNsdWRlZCB0ZXhpbmZvIGZpbGUuCisKKwkqIGRvYy9hbGwudGV4aTogc2V0dGluZ3MgZm9yIGdlbmVyaWMgZm9ybSBvZiBkb2N1bWVudGF0aW9uLgorCitUdWUgQXByICA2IDExOjU2OjIxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChjb25zKTogWmVybyBvdXQgZnJhZyB3aGVuIGNyZWF0aW5nIHJlbG9jLgorCitNb24gQXByICA1IDA5OjQxOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAoZ3BfcmVmZXJlbmNlKTogQ2VydGFpbiBtYWdpYyBzeW1ib2xzIGNhbiBuZXZlcgorCWJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUCByZWdpc3Rlci4KKworCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEhhbmRsZSBzdGF0ZXMgOSBhbmQgMTAgY29ycmVjdGx5CisJd2hlbiBkZWFsaW5nIHdpdGggY2hhcmFjdGVycyBvZiB0eXBlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNULAorCUxFWF9JU19TVFJJTkdRVU9URSwgYW5kIExFWF9JU19PTkVDSEFSX1FVT1RFLgorCisJKiBjb25maWcvdGUtaXJpeC5oOiBOZXcgZmlsZTsgaXJpeCBuZWVkcyBhIGRpZmZlcmVudCBMT0NBTF9MQUJFTAorCWRlZmluaXRpb24gZnJvbSBvdGhlciBNSVBTIHRhcmdldHMuCisJKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4KTogVXNlIGVtdWxhdGlvbiBpcml4LgorCitTdW4gQXByICA0IDE1OjIxOjA5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaDg1MDAuYzogR2V0IHJlbGF4IHNpemUgb2YgYnJhbmNoIGluc3RydWN0aW9ucyByaWdodCwKKwkoZ2V0X29wZXJhbmQpOiBQYXJzZSBAc3ArIGNvcnJlY3RseS4KKworRnJpIEFwciAgMiAxNTo1OTo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgaW5jbHVkZQorCUNPRkYgc2VjdGlvbiBoZWFkZXIgZmllbGQuCisKKwkqIGNvbmZpZ3VyZS5pbjogUHJpbnQgZXJyb3IgbWVzc2FnZSBpZiBob3N0IG9yIHRhcmdldCBpcyBub3QKKwlzdXBwb3J0ZWQuCisKKwkqIGNvbmZpZ3VyZS5pbjogSWYgd2l0aC1iZmQtYXNzZW1ibGVyLCB1c2Ugb2JqLWNvZmYgaW5zdGVhZCBvZgorCW9iai1jb2ZmYmZkLgorCisJKiBjb25maWcvaG8tZ2VuZXJpYy5oOiBJbmNsdWRlIHN0cmluZy5oLgorCitGcmkgQXByICAyIDA4OjU0OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBUcmVhdCBhbnkgbGFiZWwgc3RhcnRpbmcgd2l0aAorCSckJyBhcyBsb2NhbCwgZm9yIGFueSBvYmplY3QgZmlsZSBmb3JtYXQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogT3B0aW1pemF0aW9ucyB0byBicmFuY2hpbmcgY29kZSBhbmQgYQorCWNvdXBsZSBvZiBidWcgZml4ZXMgZnJvbSByYWxwaGNAcHlycHM1LmVuZy5weXJhbWlkLmNvbSAoUmFscGgKKwlDYW1wYmVsbCkuCisKKwkqIGNvbmZpZy9oby1pcml4Lmg6IE5ldyBmaWxlOyBpZiBub3QgZ2NjLCBkZWZpbmUgQlJPS0VOX0FTU0VSVC4KKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeCopOiBTZXQgZ2FzX2hvc3QgdG8gaXJpeC4KKworV2VkIE1hciAzMSAxNzo1Mzo1NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IFNldCBvdXRwdXRfc2VjdGlvbiBvZiBuZXcgc2VjdGlvbi4KKwkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1seV9wYXNzKTogRG9uJ3Qgc2V0IG91dHB1dF9zZWN0aW9uIGhlcmUuCisJKiBleHByLmMgKGV4cHJfcGFydCwgZXhwcik6IFR1cm4gb2ZmIHNlY3Rpb24gYXNzZXJ0aW9ucyBmb3IgRUNPRkYsCisJc2luY2UgaXQgaGFzIGFkZGl0aW9uYWwgc2VjdGlvbnMuCisJKiByZWFkLmMgKHNfbGNvbW0pOiBGb3IgTUlQUyBFQ09GRiwgcHV0IHNtYWxsIG9iamVjdHMgaW4gLnNic3MsCisJbm90IGJzc19zZWN0aW9uLgorCSogY29uZmlnL29iai1lY29mZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IEFkZGVkCisJZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgorCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogSW5pdGlhbGl6ZQorCWVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KKwkoYWRkX2ZpbGUpOiBJZiB1c2luZyBzdGFicywganVzdCBvdXRwdXQgYSBzdGFicyBzeW1ib2wgcmF0aGVyIHRoYW4KKwljcmVhdGluZyBhIG5ldyBmZHIuCisJKG9ial9lY29mZl9iZWdpbiwgb2JqX2Vjb2ZmX2JlbmQpOiBJZ25vcmUgbGluZSBudW1iZXIgYnkgcmVhZGluZworCWl0IHdpdGggZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24sIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0IGJ5IGhhbmQuCisJKG9ial9lY29mZl9sb2MpOiBJZiB1c2luZyBzdGFicywganVzdCBvdXRwdXQgYSBzdGFicyBzeW1ib2wgcmF0aGVyCisJdGhhbiBFQ09GRiBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KKwkob2JqX2Vjb2ZmX3N0YWIpOiBBY2NlcHQgbm9uLXplcm8gdmFsdWVzIGZvciBzdGFicyBsaW5lIG51bWJlci4KKwkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFNldCBpZmlsZXN5bSBjb3JyZWN0bHkuICBTZXQgc3RvcmFnZSBjbGFzcworCXRvIHNtYWxsLCB1bmRlZmluZWQgYW5kL29yIHJlYWRvbmx5IHNlY3Rpb25zIGlmIGFwcHJvcHJpYXRlLgorCURvbid0IG91dHB1dCBzeW1ib2wgbmFtZXMgY29udGFpbmluZyBcMDAxIGNoYXJhY3RlcnMuCisJKGVjb2ZmX2Zyb2JfZmlsZSk6IE1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgZmRyIGlzIG91dHB1dC4KKwkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBUQ19NSVBTLgorCSogY29uZmlnL3RjLW1pcHMuYyAoZ19zd2l0Y2hfdmFsdWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtZF9hc3NlbWJsZSk6IFNldCBncCBzaXplIG9mIG91dHB1dCBCRkQuCisJKGdwX3JlZmVyZW5jZSk6IE5ldyBmdW5jdGlvbjsgcmV0dXJucyAxIGlmIGV4cHJlc3Npb24gY2FuIGJlCisJYWNjZXNzc2VkIHZpYSBncC4gIEFsd2F5cyByZXR1cm5zIDAgaWYgbm90IHVzaW5nIEVDT0ZGLgorCShtYWNyb19idWlsZCk6IENvbnZlcnQgQkZEX1JFTE9DX0xPMTYgdG8gQkZEX1JFTE9DX01JUFNfR1BSRUwgaWYKKwlwb3NzaWJsZS4KKwkobWFjcm8pOiBHZW5lcmF0ZSBzZXF1ZW5jZXMgdXNpbmcgZ3AgaWYgcG9zc2libGUuCisJKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSAtRUwgYW5kIC1FQi4gIFBhcnNlIC1HLgorCShtZF9hcHBseV9maXgpOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTCB0byBpZ25vcmVkIGNhc2UuCisJKHNfY2hhbmdlX3NlYyk6IEhhbmRsZSAucmRhdGEgYW5kIC5zZGF0YSBmb3IgRUNPRkYuCisJKHNfZXh0ZXJuKTogTWFyayBzeW1ib2wgYXMgZXh0ZXJuYWwuICBTZXQgZWNvZmZfdW5kZWZpbmVkIGZpZWxkLgorCitUdWUgTWFyIDMwIDEwOjExOjQxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogRG9uJ3QgY2FsbCBhc19wZXJyb3IgZm9yCisJZmlsZW5hbWUgcmVqZWN0ZWQgYnkgYXBwbGljYXRpb24uCisKKwkqIGFzLmMgKG1haW4pIFtCRkRfQVNTRU1CTEVSXTogSWYgZXJyb3JzIG9jY3VyLCBjbG9zZSBhbmQgdW5saW5rCisJdGhlIG91dHB1dCBmaWxlLgorCisJKiBkb2MvYXMudGV4aW5mbzogRG9uJ3QgdXNlIEB2YWx1ZSBpbiBub2RlIG5hbWVzIGZvciB0aGUgbW9tZW50OworCXJlZmVyZW5jZXMgZG9uJ3QgYXBwZWFyIHRvIHdvcmsgcmlnaHQuCisKKwkqIGFzLmggKGNvbnN0LCB2b2xhdGlsZSk6IFB1dCB0aGVzZSBkZWZpbml0aW9ucyBiYWNrLCBhbmQgdXNlCisJdGhlbS4KKworCSogZG9jL2FzLnRleGluZm86IEZpcnN0IHBhc3MgYXQgdXNpbmcgbmV3IHRleGluZm8gZmVhdHVyZXMgLS0KKwl2YXJpYWJsZXMsIGNvbmRpdGlvbmFsIHRlc3RzLiAgRmFyIGZyb20gY29tcGxldGUuCisKK01vbiBNYXIgMjkgMTY6MDU6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiByZWFkLmM6IFRlbXBvcmFyeSBoYWNrIHRvIGhhbmRsZSBzb21lIDY0LWJpdCBjb25zdGFudHMuICBUaGlzCisJc2hvdWxkIGJlIHJlZG9uZSBsYXRlci4KKwkodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlLgorCShiaWdfY29ucyk6IElmIGl0J3Mgc2V0LCByZXZlcnNlIG9yZGVyIG9mIGJ5dGVzIGJlaW5nIGNvcGllZC4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbik6IFNldCB0YXJnZXRfYmlnX2VuZGlhbi4KKworCSogcmVhZC5jIChzX2lnbm9yZSk6IERlbGV0ZSBkZWNsYXJhdGlvbiBvZiBpc19lbmRfb2ZfbGluZS4KKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHlhbmtfc3ltYm9scyk6IEJ1aWxkIGxpc3Qgb2YgZmlsZSBzeW1ib2wKKwlmb3J3YXJkIHBvaW50ZXJzIHByb3Blcmx5LgorCitNb24gTWFyIDI5IDEzOjQ3OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IEZpeCBidWcgd2hlcmUgbnJlbG9jcworCXdhc24ndCBiZWluZyBzdG9yZWQgaW50byBzY25oZHIuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaDogQWRkIHByb3RvdHlwZSBvZiBzX2dldF9zZWdtZW50LgorCSogcmVhZC5jIChUQ19TVEFSVF9MQUJFTCk6IERlZmF1bHQgZGVmaW5pdGlvbi4KKwkocmVhZF9hX3NvdXJjZV9maWxlKTogVXNlIFRDX1NUQVJUX0xBQkVMIG1hY3JvIHRvIHdvcmsgb3V0CisJaWYgYSBsYWJlbCBoYXMgYmVlbiBzZWVuLgorCitNb24gTWFyIDI5IDEyOjU2OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBTZXQgQkZEREVGIGFuZCBCRkRMSUIgYXQgdGhlIHRvcCBvZiBNYWtlZmlsZSwgbm90CisJdGhlIGJvdHRvbSAobWFrZSBleHBhbmRzIHZhcmlhYmxlcyBpbiBkZXBlbmRlbmNpZXMgd2hlbiB0aGUKKwlkZXBlbmRlbmNpZXMgYXJlIHJlYWQsIG5vdCB3aGVuIHRoZXkgYXJlIHVzZWQpLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IE5PTE9BRCBiaXQgZm9yCisJYTI5ayAuYnNzIHNlY3Rpb247IHRoZSBtb25kZmUgcHJvZ3JhbSBkb2Vzbid0IGxpa2UgaXQuCisKK1N1biBNYXIgMjggMDg6MTI6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tNjhrLmM6IFVzZSBQQVJBTVMgbWFjcm8sIGFuZCB1c2UgQ09OU1QgaW5zdGVhZCBvZgorCWNvbnN0LgorCShjdXJyZW50X2FyY2hpdGVjdHVyZSk6IERvbid0IG5lZWQgaW5pdGlhbGl6ZXIuCisKK0ZyaSBNYXIgMjYgMDg6MTI6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBkb2Mvbm9uZS5tNDogRGVmaW5lIFo4MDAwLgorCSogZG9jL01ha2VmaWxlLmluIChhcy0qLnRleGluZm8pOiBSZWZlciB0byAkKHNyY2RpcikuICBSZW1vdmUgdGhlCisJdGV4aW5mbyBmaWxlIGJlZm9yZSByZWNyZWF0aW5nIGl0LgorCShURVhJMkRWSSk6IE5lZWQgdG8gc2V0IFRFWElOUFVUUyBpZiAibWFrZSBhcy5kdmkiIGlzIHRvIHdvcmsgaW4KKwl0aGlzIGRpcmVjdG9yeS4KKwkoc3JjZGlyKTogRGVsZXRlIHNlY29uZCwgYm9ndXMgZGVmaW5pdGlvbi4KKwkoYXMuaW5mbyk6IExvb2sgZm9yIGFzLSoudGV4aW5mbyBpbiBjdXJyZW50IGRpcmVjdG9yeSByYXRoZXIgdGhhbgorCWluICQoc3JjZGlyKS4KKwkoYXMuZHZpKTogRGl0dG8uCisJKGR2aSk6IE5ldyBydWxlLgorCSogZG9jL2NvbmZpZ3VyZS5pbjogQ3JlYXRlIGxpbmtzIHRvIGFsbCBhcy0qLnRleGluZm8gZmlsZXMgaW4gdGhlCisJc291cmNlIGRpcmVjdG9yeSwgaWYgdGhhdCdzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKwkqIGNvbmZpZ3VyZS5pbiAocGVyLWhvc3QpOiAgQWNjZXB0IE1JUFMgaG9zdCB3aXRoIEJTRCB2ZXJzaW9uCisJbnVtYmVyLgorCShwZXItdGFyZ2V0KTogQ2xhc3NpZnkgaTQ4NiBhcyBpMzg2LiAgVXNlIGdlbmVyaWMgY3B1X3R5cGUgaW5zdGVhZAorCW9mIHRhcmdldF9jcHUgaW4gc2VsZWN0aW5nIGZvcm1hdCBldGMuCisKKwkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBVc2UgLmFwcGZpbGUsIG5vdCAuYXBwLWZpbGUuCisJKiByZWFkLmMgKHBvdGFibGUpOiBDaGFuZ2UgLmFwcC1maWxlIHRvIC5hcHBmaWxlLgorCisJKiBjb25maWcvaG8tZGVjc3RhdG4uaDogUmVuYW1lZCBmcm9tIGhvLWRlY3N0YXRpb24uaC4KKwkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0ZWQuCisKKwkqIGNvbmZpZy9vYmotYmZkLXN1bm9zLio6IFVudXNlZDsgZGVsZXRlZC4KKworCSogTWFrZWZpbGUuaW4gKHZlcnNpb24uYywgdmVycy1zdGFtcCk6IERlbGV0ZWQuCisJKGNvbmZpZy5oKTogRGVmaW5lIEdBU19WRVJTSU9OLgorCSogYXMuYyAodmVyc2lvbl9zdHJpbmcpOiBEZWxldGVkIGRlY2xhcmF0aW9uLgorCShtYWluKTogTG9vayBmb3IgR0FTX1ZFUlNJT04gaW5zdGVhZC4KKworCSogZG9jL2FzLnRleGluZm86IFVwZGF0ZWQgZGVzY3JpcHRpb24gb2YgLWEqIChsaXN0aW5nKSBvcHRpb25zLAorCWFuZCBkZXNjcmliZSBob3cgdG8gcGFzcyB0aGVtIHRocm91Z2ggZnJvbSBnY2MuCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogRG9uJ3QgYWxsb2NhdGUgc3RvcmFnZSBvcgorCXByb2Nlc3MgcmVsb2NzIGlmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NzIHRvIHByb2Nlc3MuICBBdm9pZHMKKwltYWxsb2MvZnJlZSBidWcgb24gU0NPIHRvby4KKworCSogYXMuaDogTW92ZSBsb2NhbCBpbmNsdWRlIGZpbGVzIGJlbG93IHN5c3RlbSBpbmNsdWRlIGZpbGVzLCB0bworCWF2b2lkIHNvbWUgcmVkZWZpbml0aW9uIGNvbXBsYWludHMgb24gc29tZSBzeXN0ZW1zLgorCShjb25zdCwgdm9sYXRpbGUpOiBEb24ndCBuZWVkIHRoZXNlIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBpZiB3ZQorCXVzZSBDT05TVCBhbmQgVk9MQVRJTEUgZnJvbSBhbnNpZGVjbC5oLgorCShzZWdfbmFtZSk6IFVzZSBDT05TVCwgbm90IGNvbnN0LgorCitGcmkgTWFyIDI2IDEwOjIyOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYzogUmVpbmRlbnRlZCB0byBHTlUgc3RhbmRhcmRzLgorCitUaHUgTWFyIDI1IDA4OjU5OjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBSZW1vdmUgYTI5ayBzcGVjaWFsIGNhc2UuCisJKGZpeHVwX3NlZ21lbnQpOiBBZGQgYTI5ayBzcGVjaWFsIGNhc2U7IHRoZSBsaW5rZXIgaXMgbm90IHByZXBhcmVkCisJdG8gc2VlIGEgc2VnbWVudCBvZmZzZXQgaGVyZS4KKworCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFkZGVkIG5ldyBzdGF0ZSwgMTAsIG1vZGlmeWluZyBzdGF0ZQorCTkgdG8gb25seSBrZWVwIGEgc3BhY2UgaW4gYmV0d2VlbiBpZGVudGlmaWVyIGNoYXJhY3RlcnMuCisKK1dlZCBNYXIgMjQgMDI6MTY6MjIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIHRhcmdldDsgYXMtJChjb25maWcpLnRleGluZm8gbWlnaHQgbGl2ZSBpbgorCXNyY2RpciwgbWlnaHQgYmUgaW4gb2JqZGlyLgorCisJKiBkb2MvTWFrZWZpbGUuaW46IGR2aSBkZXBlbmRzIG9uIGFzLmR2aQorCitNb24gTWFyIDIyIDIzOjU5OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0CisKK01vbiBNYXIgMjIgMTY6MjU6NTcgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgc3VwcG9ydCBmb3IgbWVtYmFyIG1hc2sgbmFtZXMuCisJQWRkIG1pc3NpbmcgY29sb25zIGluIHByZWZldGNoIGVycm9yIG1lc3NhZ2VzLiAgQWRkIHN1cHBvcnQgZm9yCisJQVNJIG5hbWVzLgorCitNb24gTWFyIDIyIDEwOjE5OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBVc2UgJEFUIGZvciBhbnkgZmxvYXRpbmcgcG9pbnQgbG9hZC4KKworU2F0IE1hciAyMCAxMjo1MDo1MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AdXJ0aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRm9yIG9wZXJhbmQgdHlwZSAnTScsIHJlamVjdAorCWJpZ251bXMsIGJ1dCBkb24ndCBlbWl0IGVycm9yIG1lc3NhZ2UuCisKK0ZyaSBNYXIgMTkgMjE6MDI6MTkgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAodGFyZy1jcHUubyk6IERlcGVuZCBvbiBjb25maWcuaC4KKworV2VkIE1hciAxNyAxNjo0NDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGRlZCBuZXcgc3RhdGUsIDksIHRvIGF2b2lkCisJZHJvcHBpbmcgYSBzcGFjZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gaWRlbnRpZmllci4KKwkqIGV4cHIuYywgd3JpdGUuYzogUmV3cm90ZSBhc3NlcnQgZXhwcmVzc2lvbnMgdG8gbm90IHVzZSBtdWx0aXBsZQorCWxpbmVzOyBJIGRvbid0IHRoaW5rIHRoYXQgY2FuIGJlIGRvbmUgcG9ydGFibHkuCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFVzZSAkQVQgaWYgdGFyZ2V0IHJlZ2lzdGVyIGlzIHplcm8gaW4KKwlsb2FkIGluc3RydWN0aW9uLCB3aGljaCBpdCBjYW4gYmUgZm9yIGEgZmxvYXRpbmcgcG9pbnQgbG9hZC4KKworTW9uIE1hciAxNSAxMjoxNzoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQ29tcHV0ZSB0aGUgcmVsb2NzIGJlZm9yZSB3cml0aW5nIG91dAorCXRoZSBzZWN0aW9uIGNvbnRlbnRzLgorCSogY29uZmlnL29iai1lY29mZi5oLCBjb25maWcvb2JqLWVjb2ZmLmM6IE51bWVyb3VzIGNoYW5nZXMgdG8gZ2V0CisJc3ltYm9sIHRhYmxlIGFuZCB2YWx1ZXMgcmlnaHQuCisJKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTCk6IElmIE9CSl9FQ09GRiwgYW55IGxhYmVsIHN0YXJ0aW5nCisJd2l0aCAkTCBpcyBsb2NhbC4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IElmIE9CSl9FQ09GRiwgYWRqdXN0IHRoZSBhZGRlbmQKKwlieSB0aGUgc2VjdGlvbiB2bWEuCisKKwkqIGNvbmZpZy96OGsubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBUaGUgcmVsZXZhbnQgZmlsZSBpcworCXo4ay1vcGMuaCwgbm90IHo4ay5oLgorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfZW5kZWYpOiBDb3JyZWN0IHRlc3QgZm9yIC5iZgorCXN5bWJvbC4KKworRnJpIE1hciAxMiAxODozMzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIHNwYXJjLXN1bi1zb2xhcmlzMiogaW5zdGVhZCBvZiAtc29sYXJpczIKKworRnJpIE1hciAxMiAxMjowMDowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGV4cHIuYywgd3JpdGUuYzogVWx0cml4IG5hdGl2ZSA0LjIgY2MgcmVxdWlyZXMgYXNzZXJ0IGNvbmRpdGlvbgorCXRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCisKK1RodSBNYXIgMTEgMTc6NTY6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgpOiBDcmVhdGUgZmlsZSwgd3JpdGluZyBvdXQgZGVmaW5pdGlvbnMgb2YKKwl0YXJnZXQgY3B1LCBhbGlhcywgYW5kIGNhbm9uaWNhbCBuYW1lLgorCShBTExfQ0ZMQUdTKTogTm8gbG9uZ2VyIGRlZmluZSBUQVJHRVRfQ1BVLgorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBQcmludCBhIG1lc3NhZ2UsIGluc3RlYWQgb2YgcXVpdHRpbmcKKwlzaWxlbnRseS4KKworCSogYXMuYyAobWFpbik6IERvbid0IGNhdGNoIGFueSBzaWduYWxzLCBmb3Igbm93LgorCisJKiB2ZXJzaW9uLmM6IERlbGV0ZWQuCisJKiBNYWtlZmlsZS5pbjogR2VuZXJhdGUgaXQsIHB1dHRpbmcgaW4gb25seSB0aGUgdmVyc2lvbiBudW1iZXIKKwlpdHNlbGYuCisJKFZFUlNJT04pOiBOZXcgdmFyaWFibGUuCisJKiBhcy5jOiBJbmNsdWRlIGNvbmZpZy5oLgorCShtYWluKTogUmVmb3JtYXR0ZWQgdmVyc2lvbiBzdHJpbmcuICBJbmNsdWRlIHRhcmdldCBhbGlhcy4gIERvbid0CisJcHJpbnQgaWYgbm90IHJlcXVlc3RlZCAoaS5lLiwgdW5rbm93biAtdiBhcmd1bWVudCkuCisKKwkqIGFzLmMgKHN0cmFsbG9jKTogRGVsZXRlZC4KKwkobWFpbik6IENhbGwgc3RyZHVwIGluc3RlYWQuCisKKwkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGFsbCA2ODMwMCBzZXJpZXMgY2hpcHMuCisJKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIGNvbmZpZy5oLgorCShtZF9hc3NlbWJsZSk6IEFzc3VtZSBUQVJHRVRfQ1BVIGlzIGRlZmluZWQuICBBY2NlcHQgc29tZSA2ODMwMAorCXNlcmllcyBjcHVzIGFzIGRlZmF1bHRzLgorCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgc29tZSBtNjgzMDAgc2VyaWVzIENQVXMgYXMgZGVmYXVsdHMuCisKK1dlZCBNYXIgMTAgMTc6NDE6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBhcy5jIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IERlZmluZSB0byBub3JtYWwgdmFsdWVzIGlmCisJbm90IGFscmVhZHkgZGVmaW5lZC4KKwkobWFpbiwgZ290X3NpZyk6IFVzZSB0aGVtLgorCSogY29uZmlnL2hvLXZtcy5oIChFWElUX1NVQ0NFU1MsIEVYSVRfRkFJTFVSRSk6IFJldmVyc2UgZGVmYXVsdAorCXZhbHVlcy4KKworVHVlIE1hciAgOSAwNzo0MDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotZWNvZmYuYywgY29uZmlnL29iai1lY29mZi5oOiBQcmVsaW1pbmFyeSBFQ09GRgorCXN1cHBvcnQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgYmFzZWQgb24gT0JKX0FPVVQgdnMuCisJT0JKX0VDT0ZGIGFzIHdlbGwgYXMgVEFSR0VUX0JZVEVTXypfRU5ESUFOLgorCShzdHJ1Y3QgbG9jLCBzdHJ1Y3QgcHJvYywgc3RydWN0IGZpbGUpOiBNb3ZlZCB0byB0Yy1taXBzLmMgd2l0aGluCisJI2lmbmRlZiBPQkpfRUNPRkYgYmxvY2ssIHNpbmNlIEVDT0ZGIHVzZXMgZGlmZmVyZW50IHZlcnNpb25zLgorCSogY29uZmlnL3RjLW1pcHMuYzogUmVhcnJhbmdlZCBmb3IgRUNPRkYgc3VwcG9ydC4gIEFkZGVkCisJcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuICBNb3ZlZCBleGlzdGluZyBtaW5pbWFsCisJZGVidWdnaW5nIGZvcm1hdCBzdXBwb3J0IGluZm8gI2lmbmRlZiBPQkpfRUNPRkYgYmxvY2tzLgorCShtYWNyb19idWlsZF9sdWkpOiBFbGltaW5hdGVkIHNpZ25fZXh0ZW5kIGFyZ3VtZW50LCBiZWNhdXNlIEVDT0ZGCisJZG9lcyBub3Qgc3VwcG9ydCBhIG5vbiBzaWduIGV4dGVuZGVkIGhpZ2ggMTYgYml0cyByZWxvYy4gIEFkanVzdGVkCisJYWxsIGNhbGxlcnMgYWNjb3JkaW5nbHkuCisJKHRjX2dldF9yZWdpc3Rlcik6IFJlbmFtZWQgZnJvbSBnZXRfcmVnaXN0ZXIsIGFuZCBtYWRlIG5vbi1zdGF0aWMuCisKKwkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10OiBOZXcgZmlsZXMuICBEZWZpbmUKKwlUQVJHRVRfQllURVNfQklHX0VORElBTiBhbmQgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4sCisJcmVzcGVjdGl2ZWx5LgorCSogY29uZmlndXJlLmluIChtaXBzLSotYnNkKik6IFVzZSBnYXNfdGFyZ2V0IG1pcHMtbGl0LgorCShtaXBzLSotdWx0cml4KiwgbWlwcy0qLWlyaXgqLCBtaXBzLSotZWNvZmYpOiBOZXcgdGFyZ2V0cywgdXNpbmcKKwlvYmpfZm9ybWF0IGVjb2ZmIGFuZCBnYXNfdGFyZ2V0IG1pcHMtbGl0IG9yIG1pcHMtYmlnLgorCitUdWUgTWFyICA5IDA3OjQzOjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiB2ZXJzaW9uLmM6IEJ1bXAgdG8gdmVyc2lvbiAyLjAuMS4KKworVHVlIE1hciAgOSAwNzo0MDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogQ2hlY2sgdGhhdCBzZWdfaW5mbyAoc2VjdGlvbikKKwlpcyBub3QgTlVMTC4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIG9ial9mcm9iX2ZpbGUgYWZ0ZXIgc2V0dGluZyB0aGUgc3ltYm9scywKKwlub3QgYmVmb3JlLgorCitUdWUgTWFyICA5IDAwOjAwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBWZXJzaW9uIDIuMCByZWxlYXNlZC4KKworTW9uIE1hciAgOCAxNDo1NzoxMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0NPVU5UX1JFTE9DKTogTG9vayBmb3IgZnhfYWRkc3kgb25seS4KKworRnJpIE1hciAgNSAwOTowNTo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHJlYWQuaDogRGVmaW5lIHN0cmluZ2VyIGhlcmUuCisJcmVhZC5jLCBjb25maWcvb2JqLWllZWUuYywgY29uZmlnL29iai10Y204OGsuYzogTm90IGFueSBvZiB0aGVzZQorCXBsYWNlcy4KKworVGh1IE1hciAgNCAxMTo1MjoyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChzX3NwYWNlKTogTXVsdGlwbHkgcmVwZWF0IGNvdW50IGJ5IG11bHQsIG5vdCBmaWxsLgorCitUaHUgTWFyICA0IDA1OjIwOjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiByZWFkLmM6IEluY2x1ZGUgY3R5cGUuaC4KKworV2VkIE1hciAgMyAxMDo0MTo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwlQYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGU6CisJKiBtYWtlLWdhcy5jb206IEZpbmQgb2JzdGFjay5vYmogaWYgaXQncyBub3QgaW4gdGhlIGN1cnJlbnQKKwlkaXJlY3RvcnkuCisJKiByZWFkLmMgKHNfaWdub3JlKTogRG9uJ3QgZGVjbGFyZSBpc19lbmRfb2ZfbGluZS4gIEl0J3MKKwlyZWR1bmRhbnQsIGFuZCB0cmlnZ2VycyBhIFZNUyBnY2MgY29tcGlsZXIgYnVnLgorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IE1hY3JvIFNVQl9TRUdNRU5UX0FMSUdOIG5vdyB0YWtlcworCWN1cnJlbnQgc2VnbWVudCBhcyBhbiBhcmd1bWVudC4gIChJZ25vcmVkIGluIGFsbCBjYXNlcyBidXQgVk1TLikKKwlBbGwgY2FsbGVycyBhbmQgZGVmaW5pdGlvbnMgY2hhbmdlZC4KKworVHVlIE1hciAgMiAxMTo1NjoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxpc3RpbmcuYzogQ2xlYW5lZCB1cCBhIGJpdCwgYWRkZWQgcHJvdG90eXBlcywgbWFkZSBOT19MSVNUSU5HCisJY2FzZSBjb21waWxlIGFnYWluLgorCitUdWUgTWFyICAyIDA4OjUzOjM0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChpc2J5dGUpOiBBY2NlcHQgYWxsIHZhbHVlcyBmcm9tIC0yNTUgdG8gKzI1NSwKKwlzbyAifjB4ODAiIHdvbid0IGJlIHJlamVjdGVkLgorCisJKiBjb25maWcvb2JqLWVsZi5jOiBObyBsb25nZXIgaW5jbHVkZSBlbGYvcmVsb2MuaC4KKwkob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUgZm9yIHRleHQgc2VjdGlvbi4KKwkob2JqX2VsZl9zdGFiLCBvYmpfZWxmX2Rlc2MpOiBEZWxldGVkIGRvLW5vdGhpbmcgYW5kIGNvbW1lbnRlZC1vdXQKKwlyb3V0aW5lcy4KKwkob2JqX2VsZl94c3RhYik6IE5ldyByb3V0aW5lLgorCShvYmpfZWxmX3NldF9zaXplKTogQ2FsbCBhc193YXJuLCBub3QgZnByaW50Zi4gIFBhc3MgZGVzaXJlZAorCWFyZ3VtZW50IHRvIHNfaWdub3JlLiAgUHV0ICIjaWYgMCIgYXJvdW5kIHVudXNlZCBjb2RlLgorCShvYmpfcHNldWRvX3RhYmxlKTogVXNlIHNfaWdub3JlIGluc3RlYWQgb2YgZG8tbm90aGluZyByb3V0aW5lcy4KKwlDYWxsIGVsZl94c3RhYnMgZm9yIC5zdGFicyBhbmQgLnhzdGFicyBvcGVyYXRvcnMuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKSBbT0JKX0VMRl06IE5vdyAiZWxmMzItc3BhcmMiLgorCisJKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpOiBTZXQgU0VDX1JFTE9DIG9ubHkgaWYgZml4dXBzIGFyZQorCXByZXNlbnQuCisKKwkqIGNvbmZpZ3VyZS5pbjogbWlwcy1ic2QgY29uZmlndXJhdGlvbiB3YXMgbWlzc2luZyBmb3JtYXQgc3BlYy4KKwlTaG91bGQgdXNlIGFvdXQuCisKKwkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERlcGVuZHMgb24gY29uZmlndXJlLmluLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IERvbid0IGNoZWNrIGZvciBhbGlnbm1lbnQgb2YKKwlmcmFnIGluIG1lbW9yeTsgYWxpZ25tZW50IG9mIGluc3RydWN0aW9ucyBpbiBzZWN0aW9uIGlzIGEgc2VwYXJhdGUKKwltYXR0ZXIuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkX2x1aSk6IEZpeCBzb21lIGFzc3VtcHRpb25zIG9mIEFOU0kKKwlDIGF2YWlsYWJpbGl0eS4KKworCSogbGlzdGluZy5oOiBBbHdheXMgcHJvdmlkZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIG5vdCBtYWNyb3MsIHNvCisJcGNjIHdvbid0IGxvc2UuCisKK1R1ZSBNYXIgIDIgMDA6NTA6NDMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIENPTlRSSUJVVE9SUzogIFVwZGF0ZSBHaWxtb3JlIGVudHJ5LgorCitNb24gTWFyICAxIDEyOjAzOjE2IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogIENvcnJlY3RseSBhc3NlbWJsZSBwcmVmZXRjaAorCWluc3RydWN0aW9ucy4gIEFjY2VwdCBpbnRlZ2VyIHByZWZldGNoIGZ1bmN0aW9uIG51bWJlcnMuCisKK1dlZCBGZWIgMjQgMTQ6NTg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc194d29yZCk6IE5vdyBjYWxsIGJpZ19jb25zLCBzbyBsYXJnZQorCWNvbnN0YW50cyBhcmUgYWNjZXB0ZWQsIGJ1dCBzeW1ib2xpYyB2YWx1ZXMgYXJlIG5vdC4gIEdDQyB3aWxsIG5vdAorCWdlbmVyYXRlIHRoZSBsYXR0ZXIgY3VycmVudGx5LgorCisJKiBmcmFncy5jIChmcmFnX2luaXQpOiBOZXcgZnVuY3Rpb24uCisJKHplcm9fYWRkcmVzc19mcmFnLCBic3NfYWRkcmVzc19mcmFnKTogTm93IGluaXRpYWxpemVkIGF0IHJ1bgorCXRpbWUuCisJKiBhcy5jIChtYWluKTogQ2FsbCBmcmFnX2luaXQuCisKK1dlZCBGZWIgMjQgMTA6MzI6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSW4gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVCBjYXNlOgorCURvbid0IHVuZ2V0IGNoMiBpZiB3ZSBkaWRuJ3QgZ2V0IGl0LgorCitXZWQgRmViIDI0IDA0OjE0OjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBkb2MvTWFrZWZpbGUuaW4gKFRFWElESVIpOiBVcGRhdGVkIGZvciBuZXcgbGF5b3V0LgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBBZGQgc3VwcG9ydCBmb3IgRUxGIHZlcnNpb24uCisJKHRjX2dlbl9yZWxvYykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0FSQ0gsIFRBUkdFVF9GT1JNQVQpIFtCRkRfQVNTRU1CTEVSXToKKwlOZXcgbWFjcm9zLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBOZXcgbWFjcm8uCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGb3IgUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBvZiBhCisJc3ltYm9sLCBmaXggdGhlIG9mZnNldCBzbyAiKzIiIGlzbid0IHJlcXVpcmVkLgorCisJKiBjb25maWcvdGMtaTk2MC5jIChsaW5lX2NvbW1lbnRfY2hhcnMsIGxpbmVfc2VwYXJhdG9yX2NoYXJzKToKKwlEZWZpbmUgYXMgY29tbW9uL2Jzcy4KKwkob3BfaGFzaCwgcmVnX2hhc2gsIGFyZWdfaGFzaCwgaWNsYXNzZXNfc2VlbiwgYnJfY250KTogRGVmYXVsdCBDCisJaW5pdGlhbGl6ZXJzIGFyZSBzdWZmaWNpZW50LgorCisJKiBjb25maWcvb2JqLWFvdXQuaCBbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgbGliYW91dC5oIGZyb20gYmZkLgorCShUQVJHRVRfRk9STUFUKSBbQkZEX0FTU0VNQkxFUl06IERlZmF1bHQgdG8gImEub3V0Ii4KKwkoU19TRVRfKiwgU19HRVRfKiwgb2JqX2Zyb2Jfc3ltYm9sKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBtYWNyb3MuCisJKFNfU0VUX1RZUEUpIFshQkZEX0FTU0VNQkxFUl06IE5ldyBtYWNyby4KKwkqIGNvbmZpZy9vYmotYW91dC5jOiBVc2UgUEFSQU1TIG1hY3JvIGZvciBkZWNsYXJhdGlvbnMuICBSZW1vdmUKKwkiSUdOT1JFX0RFQlVHIiBjb25kaXRpb25hbCwgc2luY2UgYm90aCBicmFuY2hlcyBhcmUgaWRlbnRpY2FsLgorCVVzZSBTX1NFVF9UWVBFLCBTX0dFVF9UWVBFLCBhbmQgU19HRVRfREVTQyBpbnN0ZWFkIG9mIGRpcmVjdGx5CisJcmVmZXJlbmNpbmcgc3ltYm9sIHN0cnVjdHVyZSBtZW1iZXJzLgorCShvYmpfYW91dF9mcm9iX3N5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCisKKwkqIGFzLmggKHN0cnVjdCBmcmFnKTogUmVvcmRlcmVkIGEgY291cGxlIG9mIGZpZWxkcyBmb3IgYmV0dGVyCisJcGFja2luZy4KKworCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCkgW0JGRF9BU1NFTUJMRVJdOiBSZWNvcmQgaXQgaW4gdGhlCisJc2VjdGlvbiBpbmZvLgorCSh3cml0ZV9jb250ZW50cykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCisJKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IEFsd2F5cyBoYW5kbGUgLVIgaGVyZS4gIENhbGwKKwlmaXhfbmV3IHdpdGggQkZEX1JFTE9DX05PTkUgaW5zdGVhZCBvZiAwIG9yIE5PX1JFTE9DLiAgQ2FsbAorCW9ial9mcm9iX2ZpbGUsIG9ial9mcm9iX3N5bWJvbCwgdGNfZnJvYl9zeW1ib2wgaWYgZGVmaW5lZC4KKwkoZml4dXBfc2VnbWVudCk6IE1ha2Ugc3VyZSBjb21tb24tc2VjdGlvbiBzeW1ib2xzIGdldCB0cmVhdGVkIHRoZQorCXNhbWUgYXMgdW5kZWZpbmVkIHN5bWJvbHMuCisJKGZpeF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogQXJndW1lbnQgcl90eXBlIGlzIG9mIHR5cGUKKwliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuICBVc2Ugc2VnX2ZpeF97cm9vdCx0YWlsfVAgZGVyaXZlZCBmcm9tCisJc2VjdGlvbiBpbmZvLgorCSogd3JpdGUuaCAoZml4X25ldyk6IFVwZGF0ZSBwcm90b3R5cGUuCisKKwkqIHRjLmggKG1kX29wZXJhbmQsIG1kX2NvbnZlcnRfZnJhZywgdGNfaGVhZGVyc19ob29rLAorCW1kX3NlY3Rpb25fYWxpZ24sIG1kX3VuZGVmaW5lZF9zeW1ib2wpOiBEb24ndCBwcm92aWRlIHByb3RvdHlwZXMKKwlpZiB0aGVzZSBhcmUgZGVmaW5lZCBhcyBtYWNyb3MuCisJKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBCRkQgdmVyc2lvbiBuZWVkcyBiZmQgYW5kCisJc2VjdGlvbiBwYXNzZWQuCisKKwkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IEFyZ3VtZW50IE5BTUUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCisJU2ltcGxpZmllZCBTVFJJUF9VTkRFUlNDT1JFIGNvZGUuICBSZW1vdmUgYXNzdW1wdGlvbnMgYWJvdXQgbnVsbAorCXBvaW50ZXJzIGluIGZyZXNobHkgYWxsb2NhdGVkIHN0b3JhZ2UuICBbQkZEX0FTU0VNQkxFUl06IEdldCBuZXcKKwlCRkQgc3ltYm9sLgorCShjb2xvbik6IERpc3BsYXkgb3RoZXIvZGVzYyBmaWVsZHMgb2YgcmVkZWZpbmVkIHN5bWJvbCBvbmx5IGlmCisJU19HRVRfT1RIRVIgYW5kIFNfR0VUX0RFU0MgYXJlIGRlZmluZWQuCisJKHN5bWJvbF9tYWtlKTogQXJndW1lbnQgTkFNRSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KKwkoc3ltYm9sX2ZpbmQsIHN5bWJvbF9maW5kX2Jhc2UpOiBMaWtld2lzZS4KKwkoU19JU18qLCBTX0dFVF8qLCBTX1NFVF8qKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbnMuCisJKiBzeW1ib2xzLmg6IEZpeCBwcm90b3R5cGVzIGZvciBuZXcgY29uc3QgYXJndW1lbnRzLiAgQWRkCisJcHJvdG90eXBlcyBmb3IgQkZEX0FTU0VNQkxFUiBTXyogZnVuY3Rpb25zLgorCisJKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpIFtCRkRfQVNTRU1CTEVSXTogQkZEIHZlcnNpb24gb2YgY29kZQorCWZvciBjaGFuZ2luZyB0byBhbiBleGlzdGluZyBzZWN0aW9uLgorCShzdWJzZWdfbmV3X3Jlc3QpIFtCRkRfQVNTRU1CTEVSXTogU3BsaXQgb2ZmIGZyb20gc3Vic2VnX25ldywKKwljYWxsZWQgYnkgc3Vic2VnX25ldyBhbmQgc3Vic2VnX3NldC4KKwkoc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBSZXdyaXR0ZW4gdG8gY2hhbmdlIHRvIG5ldyBzZWN0aW9uLAorCWdpdmVuIHNlY3Rpb24gbmFtZSBhbmQgc3Vic2VnIG51bWJlci4KKwkoc3Vic2VnX3NldCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb247IGNoYW5nZSB0byBhIHBvc3NpYmx5CisJbmV3IHNlY3Rpb24vc3Vic2VjdGlvbi4KKworCSogcmVhZC5jOiBEb24ndCBpbmNsdWRlIGN0eXBlLmguCisJKGNvbnMpIFtCRkRfQVNTRU1CTEVSXTogRm9yIHVuZGVmaW5lZCBzeW1ib2xzLCB1c2UgQkZEX1JFTE9DXzMyCisJZm9yIG5vdzsgc2hvdWxkIGJlIG1hY2hpbmUtZGVwZW5kZW50LgorCisJKiBjb25maWd1cmUuaW46IEFjY2VwdCAqLSotZWxmIGFuZCAqLSotc29sYXJpcyogYXMgRUxGIGZvcm1hdAorCXRhcmdldHMsIGZvcmNpbmcgQkZEIHVzZS4KKworV2VkIEZlYiAxNyAxODo1OTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jOiBVc2UgUEFSQU1TIG1hY3JvIGZvciBzdGF0aWMgZnVuY3Rpb24KKwlkZWNsYXJhdGlvbnMuICBVc2UgQkZEX1JFTE9DXyBtYWNyb3MgZXZlcnl3aGVyZSwgd2l0aAorCWNvbXBhdGliaWxpdHkgbWFjcm9zIGRlY2xhcmVkIGZvciBub24tQkZEIG1vZGUuCisJKHN0cnVjdCBzcGFyY19pdCkgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCisJaW5zdGVhZCBvZiBlbnVtIHJlbG9jX3R5cGUuCisJKGVtaXRfc3BhcmNfcmVsb2MpOiBDb21tZW50ZWQtb3V0IGZ1bmN0aW9uIGRlbGV0ZWQuCisJKG1kX2NvbnZlcnRfZnJhZyk6IERlbGV0ZWQuCisJKHRjX2FvdXRfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCisJKG1kX2FwcGx5X2ZpeCk6IENoYW5nZWQgY2FsbGluZyBzZXF1ZW5jZSAoY29uZGl0aW9uYWxseSkgZm9yIEJGRAorCXZlcnNpb24uCisJKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY29udmVydF9mcmFnKTogTmV3IG1hY3JvLgorCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfc3RhYik6IFJlZmVyIHRvIHVuZGVmaW5lZF9zZWN0aW9uLAorCW5vdCBTRUdfVU5LTk9XTi4gIFVzZSBTX1NFVF9UWVBFLCBTX0dFVF9UWVBFLCBTX0dFVF9ERVNDIGluc3RlYWQKKwlvZiByZWZlcmVuY2luZyBmaWVsZHMgZGlyZWN0bHkuCisKKwkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBOZXcgZnVuY3Rpb247IGV4dHJhY3RlZCBmcm9tCisJd3JpdGVfb2JqZWN0X2ZpbGUuCisJKHdyaXRlX29iamVjdF9maWxlKSBbISBCRkRfQVNTRU1CTEVSXTogQ2FsbCBpdC4KKwkocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbjsgcmVsYXggc2VjdGlvbgorCWFuZCBzZXQgaXRzIHNpemUgYW5kIGZsYWdzLgorCisJKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBSZXBsYWNlIHNvbWUKKwlmaWVsZHMgd2l0aCBCRkQgZXF1aXZhbGVudHMuICBUdXJuIG9uIGJhY2stcG9pbnRlcnMsIGFuZCBhZGQKKwl0YXJnZXQtc3BlY2lmaWMgZmllbGRzIGF0IGVuZC4KKworVGh1IEZlYiAxMSAwOToyMDozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgdmFkZHIgaGVyZS4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTZXQgaXQgaGVyZSBpbnN0ZWFkLCBzbyB0aGF0IGZpeHVwX3NlZ21lbnQKKwljYW4gc2VlIHRoZSBjb3JyZWN0IHZhbHVlLgorCitNb24gRmViICA4IDEzOjU2OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDaGVjayBmb3IgZXJyb3JzIGFuZCB3YXJuaW5ncyBhbmQKKwliYWlsIG91dCBiZWZvcmUgcHJvY2Vzc2luZyBjb250ZW50cy4KKwkoY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSk6IE5ldyBmdW5jdGlvbiwgZG9lcyBtb3N0IG9mIHRoZSB3b3JrCisJb2YgcmVtb3ZlX3N1YnNlZ3MuCisJKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKSBbQkZEX0FTU0VNQkxFUl06IE5ldyBmdW5jdGlvbi4KKwkocmVtb3ZlX3N1YnNlZ3MpIFshIEJGRF06IENhbGwgaXQuCisJKHdyaXRlX29iamVjdF9maWxlKSBbQkZEX0FTU0VNQkxFUl06IENvbnZlcnRlZCB0byB1c2UgQkZECisJc3RydWN0dXJlcyBhbmQgcm91dGluZXMuCisKKwkqIGNvbmZpZy9vYmotZWxmLio6IE5ldyBmaWxlcy4KKworCSogY29uZmlnL21pcHMubXQsIGNvbmZpZy9yczYwMDAubXQ6IERlbGV0ZWQuCisKKwkqIGNvbmZpZy9oODMwMC5tdDogRG9uJ3Qgc3BlY2lmeSBjb21waWxlciBoZXJlLgorCisJKiBjb25maWcvejhrLm10OiBUaGUgejhrIGNvZGUgZGVwZW5kcyBvbiB0aGUgejhrIG9wY29kZSB0YWJsZSwKKwlub3QgdGhlIGg4MzAwIG9uZS4KKwkqIGNvbmZpZy90Yy16OGsuaDogQ29tbWVudCBmaXguCisKKwkqIHdyaXRlLmM6IFJlb3JkZXJlZCBzb21lIGZ1bmN0aW9ucyBmb3IgYmV0dGVyIGlubGluaW5nLgorCShmaXh1cF9zZWdtZW50KTogTGlua3JlbGF4IGNvZGUgaXMgbm8gbG9uZ2VyIGNvbmRpdGlvbmFsIG9uCisJVENfSTk2MC4KKworVGh1IEZlYiAgNCAxMjo0NToxNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3toODUwMC5tdCwgdGMtaDg1MDAuYywgdGMtaDg1MDAuaCwgb2JqLWNvZmZiZmQuYywKKwlvYmotY29mZmJmZC5ofTogc3VwcG9ydCBmb3IgdGhlIEg4LzUwMAorCitXZWQgRmViICAzIDE5OjI4OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai12bXMuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUgVk1TIHZlcnNpb24gaGVyZS4KKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogTm90IGhlcmUuCisJKGZpeF9uZXcpOiBJbml0aWFsaXplIGZ4X2FkZG51bWJlci4KKworCSogbGlzdGluZy5jOiBEb24ndCBpbmNsdWRlIHRhcmdldC1jcHUuaCBleHBsaWNpdGx5LCBzaW5jZSBhcy5oCisJaW5jbHVkZXMgaXQuCisKK1RodSBKYW4gMjggMDA6MzU6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIHdyaXRlLmggW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWNsYXJlIG5leHRfb2JqZWN0X2ZpbGVfY2hhclAsCisJKl9maXhfcm9vdCwgKl9maXhfdGFpbCwgc2VnX2ZpeF9yb290UCwgc2VnX2ZpeF90YWlsUC4KKwkoc3RydWN0IGZpeCk6IFJlb3JkZXJlZCBmaWVsZHMgZm9yIGNvbXBhY3RuZXNzIGFuZCBlZmZpY2llbmN5LgorCUNvbnZlcnRlZCBzb21lIGxvZ2ljYWwgZmllbGRzIHRvIDEtYml0IGZpZWxkcy4KKworCSogY29uZmlnL29iai1hb3V0Lmg6IFVzZSBQQVJBTVMuCisJW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWZpbmUvZGVjbGFyZSBBT1VUX01BQ0hUWVBFLCBzZWdfTl9UWVBFLAorCU5fVFlQRV9zZWcsIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRS4KKworCSogcmVhZC5jOiBEb24ndCBpbmNsdWRlIGxpc3RpbmcuaDsgYXMuaCBpbmNsdWRlcyBpdC4gIFJlbW92ZWQKKwlET05UREVGIGNvZGUuCisJW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIHN1YnNlZ3MuaC4KKwkob2xkX2J1ZmZlciwgbmV3X2Jyb2tlbl93b3Jkcyk6IERlZmF1bHQgaW5pdGlhbGl6YXRpb24gaXMKKwlzdWZmaWNpZW50LgorCisJKiBvdXRwdXQtZmlsZS5jIFtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBiZmQuaCwgZGVmYXVsdCBUQVJHRVRfTUFDSAorCXRvIDAsIGRlZmluZSBzdGRvdXRwdXQuCisJKG91dHB1dF9maWxlX2NyZWF0ZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIGJmZF9wZXJyb3Igb24gZmFpbHVyZS4KKwlDYWxsIGJmZF9zZXRfYXJjaF9tYWNoLgorCShvdXRwdXRfZmlsZV9jbG9zZSkgW0JGRF9BU1NFTUJMRVJdOiBDYWxsIGJmZF9jbG9zZSwgbm90CisJYmZkX2Nsb3NlX2FsbF9kb25lLiAgQ2FsbCBiZmRfcGVycm9yIG9uIGZhaWx1cmUuCisJKG91dHB1dF9maWxlX2FwcGVuZCkgW0JGRF9BU1NFTUJMRVJdOiBEb24ndCBkZWZpbmUuCisKKwkqIGNvbmZpZy9tNjhrY29mZi5tdCAoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlIGRlZmluaXRpb24uCisKKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBbHdheXMgZGVmaW5lLiAgT21pdCBmaWVsZCBzY25oZHIKKwlpZiBub3QgTUFOWV9TRUdNRU5UUy4gIERlZmluZSBuZXcgZmllbGQgYmZkX3NlY3Rpb24gaWYKKwlCRkRfQVNTRU1CTEVSLgorCShzZWdfaW5mbyk6IE5ldyBtYWNyby4KKworCSogZXhwci5jLCBpbnB1dC1zY3J1Yi5jOiBVc2UgUEFSQU1TIG1hY3JvLiAgRGVsZXRlZCB1bnVzZWQKKwl2YXJpYWJsZXMsIGFuZCBzb21lIGlycmVsZXZhbnQgY29tbWVudHMuCisKKwkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogSW5jbHVkZSAkKEJGRERFRikuCisJKExJQlMpOiBJbmNsdWRlICQoQkZETElCKS4gIERvbid0IGJvdGhlciB3aXRoICQoQ0xJQikuCisJKiBjb25maWd1cmUuaW46ICBQZXJtaXQgLS13aXRoLWJmZC1hc3NlbWJsZXIgbm93LCB3aXRoIGEgd2FybmluZy4KKwlWYXJpYWJsZSBuZWVkX2JmZCBpcyBub3cgYSBib29sZWFuLCBhcyBpcyBuZXcgdmFyaWFibGUgYmZkX2dhcy4KKwlTZXQgQkZEREVGIGFuZCBCRkRMSUIgaW4gTWFrZWZpbGUgd2hlbiBhcHByb3ByaWF0ZS4KKworCSogYXMuYzogUmVtb3ZlZCAiI2lmZGVmIERPTlRERUYiIGFuZCAiI2lmZGVmIGNvbW1lbnQiIGNvZGUuCisJKG1haW4pOiBSZWZlciB0byBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQgaW5zdGVhZCBvZgorCWZsYWdzZWVuWydaJ10uCisKKwkqIGFzLmMgKG1haW4pIFtCRkRfQVNTRU1CTEVSXTogT3BlbiBvdXRwdXQgYmZkLgorCSgqX3NlY3Rpb24pIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lIHRoZW0uCisJKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcykgW0JGRF9BU1NFTUJMRVJdOiBJbml0aWFsaXplIHRoZW0sIGFuZAorCXNldCBzZWN0aW9uIGZsYWdzIHdoZW4gYXBwcm9wcmlhdGUuCisJKiBhcy5oIChTRUdfTk9STUFMKSBbQkZEX0FTU0VNQkxFUl06IFJlcXVpcmUgdGhhdCB0aGUgc3BlY2lmaWVkCisJc2VjdGlvbiBpcyBub3QgYWJzb2x1dGUsIHVuZGVmaW5lZCwgb3IgYW4gYXNzZW1ibGVyIGludGVybmFsIG9uZS4KKwkoYWJzb2x1dGVfc2VjdGlvbiwgdW5kZWZpbmVkX3NlY3Rpb24pOiBBbHdheXMgZGVmaW5lLgorCSogZXhwci5jLCByZWFkLmMsIHN5bWJvbHMuYzogUmVmZXIgdG8gKl9zZWN0aW9uLCBub3QgU0VHXyo7IGJyZWFrCisJc3dpdGNoIHN0YXRlbWVudHMgaW50byBpZi1lbHNlIHRyZWVzLgorCSogc3ltYm9scy5jIFtNQU5ZX1NFR01FTlRTXTogRGVsZXRlZCByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YKKwlTRUdfQlNTIGFuZCBTRUdfREFUQS4KKworCSogYXMuaCAoZnJhZ19ub3dfZml4KTogTmV3IG1hY3JvLgorCSogc3ltYm9scy5jIChjb2xvbik6IFVzZSBpdC4KKworV2VkIEphbiAyNyAyMTo0Mzo1MyBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmM6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KKwkqIGNvbmZpZy90Yy1taXBzLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KKwkqIGNvbmZpZy9oby1taXBzYnNkLmg6ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KKwkqIGNvbmZpZy9taXBzLW9wY29kZS5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCisJKiBjb25maWd1cmUuaW46ICBBZGRlZCBtaXBzIHN1cHBvcnQgZm9yIG1pcHMtZGVjLWJzZC4KKwkqIGF0b2YtZ2VuZXJpYy5jOiAgRGVmaW5lIFRSVUUgYW5kIEZBTFNFIGlmIG5vdCBkZWZpbmVkLgorCitUaHUgSmFuIDIxIDEyOjQ4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogdmVyc2lvbi5jOiBCdW1wZWQgdmVyc2lvbiBudW1iZXIgdG8gMS45My4wNS4KKworV2VkIEphbiAyMCAxNzoxMTo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IERvbid0IHVzZSAjZWxpZi4KKwkob2JqX2VtaXRfbGluZW5vKTogRG9uJ3QgbmVlZCByZXR1cm4gYXQgZW5kIG9mIHZvaWQgZnVuY3Rpb24uCisJKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEaXR0by4KKworCSogY29uZmlnL3RjLW02OGsuYzogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgorCSh0Y19hb3V0X2ZpeF90b19jaGFycyk6IEFycmF5IG5ieXRlc19yX2xlbmd0aCBpcyBub3cgY29uc3QuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX0NPVU5UX1JFTE9DKTogRG9uJ3QgZW1pdCByZWxvYyBpZiBvbmx5CisJb2Zmc2V0IGZpZWxkIGlzIHNldC4KKworRnJpIEphbiAgOCAwNTo0NDo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZvciAldWhpIGFuZCAldWxvLCBpZiBub3QKKwlFTlY2NCwgZW1pdCBubyByZWxvYy4KKwkobWRfcHNldWRvX3RhYmxlKTogRm9yICIueHdvcmQiLCBjYWxsIHNfeHdvcmQuCisJKHNfeHdvcmQpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChhcmNoaXRlY3R1cmVfcmVxdWVzdGVkLCB3YXJuX29uX2J1bXAsCisJbWRfcmVsYXhfdGFibGUpOiBVc2UgZGVmYXVsdCB6ZXJvIGluaXRpYWxpemF0aW9uLgorCShzX3Jlc2VydmUpOiBTaW5jZSBTRUdfRTIgaXMgZXF1aXZhbGVudCB0byBTRUdfQlNTLCBqdXN0IHVzZSB0aGUKKwlsYXR0ZXIsIGluc3RlYWQgb2Ygc2VsZWN0aW5nIHdpdGggcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscy4KKworVGh1IEphbiAgNyAwODo1ODoyMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIGFsbCBzcGFyY2xpdGUgdmFyaWFudHMKKworVGh1IEphbiAgNyAwNToyNToyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHJlYWQuYyAoc19kYXRhKSBbIUJGRF9BU1NFTUJMRVJdOiBGaXggdHlwbyBpbiA0IEphbiBjaGFuZ2UgLS0KKwlhY2NpZGVudGFsbHkgY2hhbmdlZCB0byB1c2Ugc3Vic2VnX2NoYW5nZSB3aGVyZSBpdCBzaG91bGQgaGF2ZQorCWJlZW4gc3Vic2VnX25ldy4KKworVHVlIEphbiAgNSAwODo0MjoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGV4cHIuYyAob3BlcmFuZCk6IElmIGNoYXJhY3RlciBvdGhlciB0aGFuIGNvbW1hIG9yIG5ld2xpbmUgaXMgYQorCWxvZ2ljYWwgZW5kLW9mLWxpbmUgY2hhcmFjdGVyLCB1c2UgdGhlIG5ld2xpbmUgY2FzZS4KKwlGcm9tIEVyaWMgWW91bmdkYWxlOgorCShvcGVyYW5kKTogU2V0IFhfYWRkX251bWJlciBmaWVsZCBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKwkob3BlcmFuZCk6IFRyZWF0IHplcm8gYnl0ZSBhcyBlbmQtb2Ytb3BlcmFuZC4KKworCSogY29uZmlndXJlLmluIChwZXItdGFyZ2V0KTogTG9vayBmb3Igd2l0aF9iZmRfYXNzZW1ibGVyIG9wdGlvbi4KKwlGb3Igbm93LCBvbmx5IGFjY2VwdCAibm8iLCB1bnRpbCB0aGUgbWVyZ2UgaXMgZG9uZS4KKworCU1lcmdlZCBjaGFuZ2VzIGZyb20gRXJpYyBZb3VuZ2RhbGUgKHlvdW5nZGFsZUB2NjU1MGMubnJsLm5hdnkubWlsKToKKwkqIGFzLmMsIGZsb251bS1rb25zdC5jLCBoZXgtdmFsdWUuYywgaW5wdXQtZmlsZS5jLCB2ZXJzaW9uLmMsCisJICBjb25maWcvb2JqLWFvdXQuaCwgY29uZmlnL29iai12bXMuYzogVk1TIC0+IEhPX1ZNUy4KKwkqIHJlYWQuYzogRmluaXNoIGNvbnZlcnNpb24gdG8gU18qIG1hY3JvcyBpbiB0aGUgVk1TIG9ubHkKKwkgIHBhcnRzIG9mIHRoZSBwcm9ncmFtLiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBoZXhfdmFsdWUuCisJKiBhcy5jLCByZWFkLmMsIHN5bWJvbHMuYywgd3JpdGUuYzogQ2hhbmdlICJpZmRlZiBWTVMiIHRvCisJICAiaWZkZWYgT0JKX1ZNUyIuCisJKiBleHByLmM6IEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIGhleF92YWx1ZS4KKwkqIHN5bWJvbHMuYzogRmluaXNoIGNvbnZlcnNpb24gdG8gU18qIG1hY3JvcyBpbiB0aGUgVk1TIG9ubHkKKwkgIHBhcnRzIG9mIHRoZSBwcm9ncmFtLiAgQWRkICJjb25zdCIgbW9kaWZpZXIgdG8KKwkgIG1kX1tsb25nLHNob3J0XV9qdW1wX3NpemUuIFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBjb25zdF9mbGFnCisJICAod2hpY2ggd2lsbCBiZSBkZWNsYXJlZCBpbiBvYmotdm1zLmgpLgorCSogd3JpdGUuYzogQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gbWRfW2xvbmcsc2hvcnRdX2p1bXBfc2l6ZS4KKwkgIEZpeCBhcmd1bWVudHMgdG8gVk1TX3dyaXRlX29iamVjdF9maWxlLgorCSogY29uZmlnLWdhcy5jb206IE5ldyBmaWxlLiAgU2NyaXB0IGZvciBWTVMgc3lzdGVtcyB0byBzZXQgdXAgdGhlCisJICBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIGdhcyBmb3IgVk1TLCBhbmQgY3JlYXRlIGNvbmZpZy5zdGF0dXMuCisJKiBtYWtlLWdhcy5jb206IFJlZG9uZSB0byB3b3JrIHdpdGggbmV3IHNjaGVtZS4KKwkqIG9iai12bXMuYzogUGF0Y2ggdG8gZml4IGJ1ZyB3aGVyZSB3ZSB3ZXJlIG5vdCBjb3JyZWN0bHkgcGFyc2luZyB0aGUKKwkgIHN0YWJzIGRpcmVjdGl2ZXMuCisJKiBvYmotdm1zLmM6ICBEZWZpbmUgbWFjcm9zIENPUFlfTE9ORyBhbmQgQ09QWV9TSE9SVCB3aGljaAorCSAgd2lsbCBzd2FwIGJ5dGVzIGlmIG5lZWRlZCBvbiBhIGJpZyBlbmRpYW4gc3lzdGVtLiAgVXNlIHRocm91Z2hvdXQKKwkgIGFzIG5lZWRlZC4KKwkqIG9iai12bXMuYyAob2JqX2FvdXRfc3RhYik6ICBBZGQgY29kZSB0byBnZW5lcmF0ZSBsaXN0aW5nIGZpbGUuCisJKiBvYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKTogQWRkIGFsaWFzIHRvIGNvcnJlY3RseSBoYW5kbGUgY2VydGFpbgorCSAgdHlwZXMgb2YgbWFsZm9ybWVkIHN0YWJzLiAgQ2hhbmdlIHBhcnNpbmcgYWxnb3JpdGhtIHNvIHRoYXQgd2UgYXJlCisJICBtb3JlIGNlcnRhaW4gb2YgaGF2aW5nIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3ZSBuZWVkIG9uIGhhbmQuCisJKiBvYmotdm1zLmMgKGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlKTogIE5ldyBmdW5jdGlvbiwgdXNlZCB0byBoZWxwCisJICByZXNvbHZlIHRoZSBkYXRhIHR5cGVzIG9mIGFzIG1hbnkgc3RydWN0IGVsZW1lbnRzIGFzIHBvc3NpYmxlCisJICB3aGVuIHNvbWUgcGFydCBvZiB0aGUgc3RydWN0IGlzIG5vdCBmdWxseSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4KKwkqIG9iai12bXMuYyAoVk1TX0xTWU1fUGFyc2UpOiAgQ29ycmVjdGx5IGhhbmRsZSBjYXNlIG9mIGNvbnRpbnVhdGlvbgorCSAgc3RhYnMgZGlyZWN0aXZlcy4KKwkqIG9iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogRGVmaW5lIGFsbCB2dGFibGUgcHNlY3RzCisJICBhcyBzeW1ib2xzIGFzIHdlbGwgaW4gdGhlIG9iamVjdCBmaWxlLiAgTG9vayBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zCisJICB0aGF0IHN0YXJ0IHdpdGggIl9fdnQuIiwgYW5kIHR1cm4gdGhlbSBpbnRvIHZhcmlhYmxlcywgc2luY2UgdGhlCisJICBnKysgY29tcGlsZXIgaXMgaW5jYXBhYmxlIG9mIGRvaW5nIHRoaXMuCisJKiB0Yy12YXguYzogQWRkICcxJyBvcHRpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBHQ0MKKwkgIHZlcnNpb25zLgorCSogYmlnbnVtLWNvcHkuYyAoYmlnbnVtX2NvcHkpOiBGaXggYnVnIHdoZXJlIHdlIHBhZCB3aXRoIHplcm9lcy4KKwkqIGlucHV0LXNjcnViLmMgKGFzX3doZXJlKTogRml4IGJ1ZyB3aGVyZSBhcyB3b3VsZCBjcmFzaCBpZiB3ZSBkaWQgbm90CisJICBoYXZlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB5ZXQuCisJKiBjb25maWcvaG8tdm1zLmg6IGRlZmluZSBIT19WTVMsIG5vdCBIT19WQVguCisKK01vbiBKYW4gIDQgMDU6MTc6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIHJlYWQuYyAoc19kYXRhKTogQWx3YXlzIHVzZSAiZGF0YV9zZWN0aW9uIiwgc2luY2UgaXQnbGwgbWFwIHRvCisJU0VHX0RBVEEgb3IgU0VHX0UxIGlmIG5lZWRlZC4KKwkoc19sY29tbSk6IExpa2V3aXNlIHdpdGggYnNzX3NlY3Rpb24uCisJKHNfZmlsbCk6IFVzZSBtZW1zZXQsIG5vdCBiemVyby4KKworVGh1IERlYyAzMSAwNDoyOToyNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogcmVhZC5jOiBEZWxldGVkIHNvbWUgY29kZSB1bmRlciAiI2lmZGVmIERPTlRERUYiIHRoYXQgd2FzIGZvcgorCWhhbmRsaW5nIEdEQiBzeW1ib2wgdGFibGUgZGF0YS4KKworCSogY29uZmlnL29iai1hb3V0LmggKHNlZ21lbnRfbmFtZSk6IERlbGV0ZSBkZWZpbml0aW9uLgorCShzZWdfbmFtZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KKwkqIGNvbmZpZy9vYmotYm91dC5oIChzZWdtZW50X25hbWUsIHNlZ19uYW1lKTogRGl0dG8uCisJKiBjb25maWcvb2JqLXZtcy5oIChzZWdtZW50X25hbWUsIHNlZ19uYW1lKTogRGl0dG8uCisJKiBjb25maWcvb2JqLWNvZmYuaCAoc2VnbWVudF9uYW1lKTogRGl0dG8uCisJKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoc2VnbWVudF9uYW1lKTogRGl0dG8uCisKKwkqIENoYW5nZXMgZm9yIEJGRF9BU1NFTUJMRVI6CisJKiBvYmouaCAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IERlY2xhcmUgb25seSBpZiBub3QKKwlCRkRfQVNTRU1CTEVSLgorCShvYmpfaGVhZGVyX2FwcGVuZCwgb2JqX3ByZV93cml0ZV9ob29rKTogRGl0dG8uCisJKiBhcy5oIChzdGRvdXRwdXQpOiBOZXcgdmFyLCBkZWZpbmVkIG9ubHkgaWYgQkZEX0FTU0VNQkxFUi4KKwkoc2VnVCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgdHlwZWRlZiBmb3IgImFzZWN0aW9uICoiLgorCShzZWdtZW50X25hbWUpIElmIEJGRF9BU1NFTUJMRVIsIGxvb2sgdXAgQkZEIHNlY3Rpb24gbmFtZTsKKwlvdGhlcndpc2UsIHVzZSBzZWdfbmFtZSBhcnJheS4KKwkoc2VnX25hbWUpOiBEZWNsYXJlIG9ubHkgaWYgbm90IEJGRF9BU1NFTUJMRVIuCisJKHNlY3Rpb25fYWxpZ25tZW50KTogRGVjbGFyZSBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSLgorCShiaWdfc2VjdGlvbiwgcmVnX3NlY3Rpb24sIHBhc3MxX3NlY3Rpb24sIGRpZmZfc2VjdGlvbiwKKwlhYnNlbnRfc2VjdGlvbiwgdGV4dF9zZWN0aW9uLCBkYXRhX3NlY3Rpb24sIGJzc19zZWN0aW9uKTogSWYKKwlCRkRfQVNTRU1CTEVSLCBkZWNsYXJlIGFzIHZhcmlhYmxlczsgb3RoZXJ3aXNlLCBkZWNsYXJlIGFzIG1hY3JvcywKKwltYXBwaW5nIHRvIHNlZ1QgZW51bSB2YWx1ZXMuCisJKHRjX2FvdXRfZml4X3RvX2NoYXJzLCBuZXh0X29iamVjdF9maWxlX2NoYXJQKTogRm9yY2UgcGFyc2UgZXJyb3JzCisJaWYgdGhlc2UgYXJlIHVzZWQgb3IgZGVmaW5lZCwgaWYgQkZEX0FTU0VNQkxFUi4KKwkoc3Vic2VnX3NldCwgc3Vic2VnX25ldykgW0JGRF9BU1NFTUJMRVJdOiBGdW5jdGlvbmFsaXR5IG9mIG9sZAorCXN1YnNlZ19uZXcgc3BsaXQgaW50byB0d28gZnVuY3Rpb25zLgorCShTRUdfTk9STUFMKTogRm9yIEJGRF9BU1NFTUJMRVIsIGFsd2F5cyByZXR1cm4gdHJ1ZSwgZm9yIG5vdy4KKworCSogYXMuaCAodm9sYXRpbGUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgorCShoYWRfZXJyb3JzLCBoYWRfd2FybmluZ3MpOiBQcm92aWRlIHByb3RvdHlwZXMgZm9yIEFOU0kgQyBldmVuIGlmCisJTk9fU1REQVJHLgorCShhc19iYWQsIGFzX2ZhdGFsLCBhc190c2t0c2ssIGFzX3dhcm4pOiBGb3IgR05VIEMgdmVyc2lvbiAyLAorCWRlY2xhcmUgd2l0aCBmb3JtYXQgYXR0cmlidXRlIGZvciAtV2Zvcm1hdCBjaGVja2luZy4KKworV2VkIERlYyAzMCAxMDoxODo1NyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFwcC5jLCBjb25maWcvdGMtKi5jOiBEb24ndCBpbmNsdWRlIHJlYWQuaCwgc2luY2UgaXQgaXMgYWxyZWFkeQorCWluY2x1ZGVkIGJ5IGFzLmguCisKKwkqIFRoZXNlIGFyZSBiYXNlZCBvbiBwYXRjaGVzIGZyb20gTWluaCBUcmFuLWxlCisJPG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tPi4KKwkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni1pYm0tYWl4Kik6IEFjY2VwdCBpNDg2IGZvciBob3N0LiAgVXNlCisJb2JqX2Zvcm1hdCBjb2ZmYmZkIGFuZCBnYXNfdGFyZ2V0IGkzODZjb2ZmIGZvciB0YXJnZXQuCisJKGlbMzRdODYtKi1pc2MqKTogTmV3IGhvc3QgKHVzZXMgc3lzdikuCisJKiBjb25maWcvaTM4NmFpeC5tdDogUmVtb3ZlZCAobm8gbG9uZ2VyIHVzZWQpLgorCSogY29uZmlnL21oLWkzODZhaXggKFJBTkxJQik6IFVzZSB0cnVlIHJhdGhlciB0aGFuIC9iaW4vdHJ1ZS4KKwkoTUlOVVNfRyk6IFJlbW92ZWQuCisJKExERkxBR1MpOiBBZGRlZCwgZGVmaW5lZCBhcyAtc2hsaWIuCisJKiBjb25maWcvdGUtaTM4NmFpeC5oIChSRVZFUlNFX1NPUlRfUkVMT0NTKTogVW5kZWZpbmUuCisJKiBjb25maWcvdGUtc2NvMzg2LmggKExPQ0FMX0xBQkVMKTogRG9uJ3QgZGVmaW5lLgorCShET1RfTEFCRUxfUFJFRklYKTogRGVmaW5lLgorCSogZXhwci5jIChvcGVyYW5kKTogSWYgRE9UX0xBQkVMX1BSRUZJWCwgdXNlIC5MMFwwMDEgYXMgYSBsYWJlbAorCW5hbWUgcmF0aGVyIHRoYW4gTDBcMDAxLgorCSogcmVhZC5jIChzX2xjb21tKTogTWFrZSBhIGZyYWcgaW4gU0VHX0JTUyByYXRoZXIgdGhhbiB1c2luZworCWxvY2FsX2Jzc19jb3VudGVyLgorCSogc3ltYm9scy5jLCBzeW1ib2xzLmggKGxvY2FsX2Jzc19jb3VudGVyKTogUmVtb3ZlZC4KKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogYnNzIG5vIGxvbmdlciB1c2VzCisJbG9jYWxfYnNzX2NvdW50ZXIuICBQYXNzIGNvcnJlY3QgZGF0YSBhbmQgYnNzIHNpemUgdG8KKwlWTVNfd3JpdGVfb2JqZWN0X2ZpbGUuCisJKiBjb25maWcvb2JqLXZtcy5jIChWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBBY2NlcHQgYnNzIHNpemUgYXMKKwlhcmd1bWVudCwgcmF0aGVyIHRoYW4gdXNpbmcgbG9jYWxfYnNzX2NvdW50ZXIuCisJKiBjb25maWcvdGMtbTg4ay5jIChzX2Jzcyk6IERvbid0IHVzZSBsb2NhbF9ic3NfY291bnRlci4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3Jlc2VydmUpOiBEb24ndCB1c2UgbG9jYWxfYnNzX2NvdW50ZXIuCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoaGFkX2xpbmVubywgaGFkX3JlbG9jKTogUmVtb3ZlZC4KKwkoc2l6ZV9zZWN0aW9uKTogUmVzdG9yZWQgc2FuaXR5IGNoZWNrLgorCShkb19yZWxvY3NfZm9yKTogQmFzZSBzZWN0aW9uIGFkZHJlc3Mgb24gc19wYWRkciByYXRoZXIgdGhhbgorCWNvbXB1dGluZyBpdC4gIEFkanVzdCBhMjlrIFJfSUhJSEFMRiBzcGVjaWFsIGNhc2UgdG8gYWNjb3VudCBmb3IKKwlzZWN0aW9uIHBhZGRyICh1c2VkIHRvIHJlcXVpcmUgcGFkZHIgdG8gYmUgemVybykuICBJZiB0aGVyZSBhcmUgbm8KKwlyZWNsb3MsIHNldCBzX3JlbHB0ciB0byAwLiAgU2V0IHJlbG9jYXRpb24gc2l6ZSBpbiBvYmplY3RfaGVhZGVycy4KKwkoZmlsbF9zZWN0aW9uKTogQWx3YXlzIHNldCBzX3ZhZGRyIGhlcmUsIHJlbW92aW5nCisJWkVST19CQVNFRF9TRUdNRU5UUyBjYXNlLiAgRm9yY2Ugc19zY25wdHIgZm9yIGJzcyB0byAwLiAgRG9uJ3Qgc2V0CisJTk9MT0FEIGZvciBpMzg2IC5ic3MsIGJlY2F1c2UgaXQgY29uZnVzZXMgdGhlIFNWUjMgbmF0aXZlIGxpbmtlci4KKwlTZXQgU1RZUF9JTkZPIGZvciAuY29tbWVudC4KKwkoY29mZl9oZWFkZXJfYXBwZW5kKTogVXNlIG9iamVjdCBoZWFkZXJzIGFuZCBIX3tTRVQsR0VUfV8qIG1hY3Jvcy4KKwlNYWtlIGFvdXRoZHIgd3JpdGluZyBkZXBlbmQgb24gT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIuCisJKGNyYXdsX3N5bWJvbHMpOiBIYW5kbGUgOCBjaGFyYWN0ZXIgc2VjdGlvbiBuYW1lIGNvcnJlY3RseS4gIFVzZQorCUhfe1NFVCxHRVR9XyogbWFjcm9zLgorCShkb19saW5lbm9zX2Zvcik6IFNldCBsaW5lbm8gc2l6ZSBpbiBvYmplY3RfaGVhZGVycy4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgSF97U0VULEdFVH1fKiBtYWNyb3MuICBEb24ndCBib3RoZXIgdG8KKwlzZXQgc192YWRkciBoZXJlLiAgSWYgc3RyaW5nX2J5dGVfY291bnQgcmVtYWlucyA0LCBzZXQgaXQgYmFjayB0bworCTAsIGFuZCBvbmx5IHdyaXRlIHN0cmluZ3Mgb3V0IGlmIHRoZXJlIGFyZSBzb21lLiAgQ2FsbAorCWZpbGxfc2VjdGlvbiBiZWZvcmUgZG9fcmVsb2NzX2ZvciBhbmQgZG9fbGluZW5vc19mb3IuCisJKG9ial9jb2ZmX3NlY3Rpb24pOiBIYW5kbGUgb3B0aW9uYWwgcXVvdGVkIHNlY29uZCBhcmd1bWVudCBnaXZpbmcKKwlzZWN0aW9uIGNoYXJhY3RlcmlzdGljcy4KKwkob2JqX2NvZmZfYnNzKTogQWRkZWQgdG8gaGFuZGxlIC5ic3MuCisJKG9ial9jb2ZmX2lkZW50KTogQWRkZWQgdG8gaGFuZGxlIC5pZGVudCAocHV0cyBzdHJpbmcgaW4gLmNvbW1lbnQKKwlzZWN0aW9uKS4KKwkob2JqX2NvZmZfbGNvbW0pOiBQdXQgY29tbW9uIHN5bWJvbHMgaW4gLmJzcywgbm90IC5kYXRhLgorCShmaXh1cF9tZGVwcyk6IENoYW5nZSB0byBzZWdtZW50LiAgQ2FsbCBmcmFnX3dhbmUgYWZ0ZXIKKwltZF9jb252ZXJ0X2ZyYWcuCisJKGZpeHVwX3NlZ21lbnQpOiBFeHBsaWNpdGx5IGNoZWNrIFNfSVNfQ09NTU9OIGJlZm9yZSBtYWtpbmcgMzg2CisJYWRqdXN0bWVudCAoYWxyZWFkeSBoYXBwZW5lZCBvbmx5IGZvciBjb21tb24gc3ltYm9scywgYnV0IHRoaXMgaXMKKwljbGVhcmVyKS4KKwkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUik6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHNfYnNzKTogRG9uJ3QgdXNlIGlmIEkzODZDT0ZGLgorCShtZF9wc2V1ZG9fdGFibGUpOiBJZ25vcmUgLm9wdGltIGFuZCAubm9vcHQuCisJKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtaTM4Ni5oIChSRVZFUlNFX1NPUlRfUkVMT0NTKTogVW5kZWYsIGZvciBTVlIzCisJY29tcGF0aWJpbGl0eS4KKwkoTE9DQUxfTEFCRUwpOiBSZW1vdmVkIGRlZmluaXRpb24uCisJKERPVF9MQUJFTF9QUkVGSVgpOiBEZWZpbmVkLgorCitNb24gRGVjIDI4IDEwOjMyOjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBhcHAuYyAoYXBwX3B1c2gpOiBVc2UgbWVtY3B5LCBub3QgYmNvcHkuCisJKGRvX3NjcnViX25leHRfY2hhcik6IEZvciBcIiwgcmV0dXJuICIgbm90ICcuCisJKHN5bWJvbF9jaGFycyk6IE5vdyBjb25zdC4KKworCSogZXhwci5jIChvcGVyYW5kKTogSWYgbm90IExPQ0FMX0xBQkVMU19GQiwgZG9uJ3QgbG9vayBmb3IgIjBmIgorCWFuZCAiMGIiLiAgSWYgTE9DQUxfTEFCRUxTX0RPTExBUiwgY2hlY2sgZm9yICIwJCIuCisKKwkqIGNvbmZpZy9vYmotY29mZi5oOiBEb24ndCB1c2UgI2VsaWYuCisKKwkqIGNvbmZpZy9oby1zdW5vcy5oOiBEb24ndCBpbmNsdWRlIHN5cy9zdGR0eXBlcy5oOyA0LjAuMyBkb2Vzbid0CisJaGF2ZSBpdC4gIChSZXBvcnRlZCBieSBOb2FoIEZyaWVkbWFuLCBmcmllZG1hbkBnbnUuYWkubWl0LmVkdS4pCisKK1dlZCBEZWMgMTYgMTI6MTI6MzMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB3cml0ZS5jLCBvYmotaWVlZS5jOiBkb24ndCBkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04gaWYgaXQgaXMKKwlhbHJlYWR5IGRlZmluZWQuCisKK1R1ZSBEZWMgMTUgMTI6NDA6MTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IGFsbG93IHNpbmdsZSBxdW90ZSBzdHJpbmdzIGlmIHNvCisJY29uZmlndXJlZC4KKworCSogY29uZmlnLyp6OGsqOiBjaGVja3BvaW50CisKK1N1biBEZWMgMTMgMDA6MDQ6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGF2b2lkIGNhbGxpbmcgeG1hbGxvYyAoMCkuCisKK1NhdCBEZWMgMTIgMTU6MjY6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsaXN0aW5nLmM6IENhbGwgeG1hbGxvYywgbm90IG1hbGxvYzsgZG9uJ3QgZGVjbGFyZSBtYWxsb2MuCisKKwkqIENoYW5nZXMgdG8gc3VwcG9ydCBTQ08gMy4ydjQ6CisJKiByZWFkLmMgKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IElmIG5vdCBTRUdfREFUQSBvcgorCVNFR19CU1MsIGZpbGwgd2l0aCBOT1BfT1BDT0RFLgorCSogY29uZmlnL2kzODZjb2ZmLm10OiBBZGQgb3Bjb2RlL2kzODYuaCB0byBUQVJHX0NQVV9ERVBFTkRFTlRTLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBJbmNyZW1lbnQgYWRkciBldmVuIGlmIG5vdAorCXVzaW5nIFpFUk9fQkFTRURfU0VHTUVOVFMuCisJKGZpbGxfc2VjdGlvbik6IElmIFpFUk9fQkFTRURfU0VHTUVOVFMsIHNldCBzZWdtZW50IGFkZHJlc3NlcywgYnV0CisJbmV2ZXIgc2V0IHNlZ21lbnQgYWRkcmVzcyBmb3IgU0VHX0UyICguYnNzKSBhbmQgZG9uJ3Qgd3JpdGUgb3V0CisJU0VHX0UyIGNvbnRlbnRzLiAgU2V0IC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB0byBTVFlQX1RFWFQuCisJKG9ial9jb2ZmX2VuZGVmKTogRG9uJ3QgbWVyZ2UgbGFiZWxzIG9yIHN5bWJvbHMgYXdhaXRpbmcgZm9yd2FyZAorCWRlZmluaXRpb25zLCBhbmQgZG9uJ3QgbWVyZ2UgdGFncyB3aXRoIG5vbi10YWdzLiAgQ2hlY2sgZm9yIC5iZgorCXJhdGhlciB0aGFuIGp1c3QgY2hlY2tpbmcgd2hldGhlciB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyBiIGFuZAorCXRoZSB0aGlyZCBjaGFyYWN0ZXIgaXMgZi4KKwkob2JqX2NvZmZfdmFsKTogZ2NjIGNhbiBnZW5lcmF0ZSB2YWx1ZXMgd2hpY2ggd2UgZG9uJ3QgaGFuZGxlCisJY29ycmVjdGx5OyBkaXNjYXJkIGluZm9ybWF0aW9uIGZvciBub3csIHNpbmNlIGl0IG9ubHkgYWZmZWN0cyB0aGUKKwlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisJKHRhZ19maW5kX29yX25hbWUpOiBEb24ndCBpbnNlcnQgdGFncyBpbiB0aGUgc3ltYm9sIHRhYmxlLgorCSh5YW5rX3N5bWJvbHMpOiBEb24ndCBtZXJnZSBsYWJlbHMuCisJKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOIGlmIGl0IGlzCisJYWxyZWFkeSBkZWZpbmVkLiAgRmlsbCBzdWJzZWdtZW50cyB3aXRoIE5PUF9PUENPREUsIG5vdCAwLiAgRG9uJ3QKKwlzZXQgc2VnbWVudCBhZGRyZXNzIGlmIFpFUk9fQkFTRURfU0VHTUVOVFMuCisJKG9ial9jb2ZmX3NlY3Rpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSBhIHRyYWlsaW5nIHF1b3RlZCBzdHJpbmcsIGFzCisJdXNlZCBpbiBBVCZUIGkzODYgc3ludGF4LgorCShmaXh1cF9zZWdtZW50KTogVGFrZSBzZWdtZW50IGFzIGFyZ3VtZW50LiAgT24gdGhlIGkzODYsIGFkanVzdCBQQworCXJlbGF0aXZlIGFkZGVuZHMgYnkgdGhlIHNlZ21lbnQgdmFkZHIuCisJKiB0Yy1pMzg2Lmg6IERlZmluZSBTVUJfU0VHTUVOVF9BTElHTi4KKwkqIHRjLWEyOWsuaDogRGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMuCisJKiB0Yy1pMzg2LmM6IChpMzg2X29wZXJhbmQpOiBJZiBJMzg2Q09GRiwgYWNjZXB0IGFueSBzZWdtZW50IHR5cGUuCisKK1R1ZSBEZWMgIDggMDA6MDY6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvb2JqLWNvZmZiZmQuYzogSW5jbHVkZSBsaWJjb2ZmLmguCisKKwkqIHZlcnNpb24uYzogTm93IHZlcnNpb24gMS45My4KKworTW9uIERlYyAgNyAwMDozOTowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfcHNldWRvX3RhYmxlKTogRm9yIDM4NmJzZCBhbmQgbGludXgsIGRvCisJcG93ZXItb2YtdHdvIGFsaWdubWVudCBmb3IgLmFsaWduLgorCisJKiBhcy5oOiBJZiBCUk9LRU5fQVNTRVJULCBqdXN0IHJlZGVmaW5lIGBhc3NlcnQnIHRvIGJlIHRyaXZpYWwsCisJYW5kIGxlYXZlIGV2ZXJ5dGhpbmcgZWxzZSBhbG9uZS4KKworRnJpIERlYyAgNCAxNjo1ODo0MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBEb24ndCBib3RoZXIgc2F2aW5nIGFzLm9sZC4KKworCSogd3JpdGUuYzogQ29uZGl0aW9uYWxpemUgb24gT0JKX1ZNUywgbm90IFZNUy4KKwkobWFnaWNfbnVtYmVyX2Zvcl9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBpZiBPQkpfVk1TLgorCisJKiBjb25maWcvb2JqLXZtcy5jOiBDaGFuZ2VzIGZvciB0cmFkaXRpb25hbCBDLgorCitUaHUgRGVjICAzIDAxOjI0OjA3IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBjb25maWcvaG8tZ2VuZXJpYy5oIChtYWxsb2MsIHJlYWxsb2MpOiBEZWNsYXJlLgorCisJKiBMb3RzIG9mIGNvbW1lbnQvd2hpdGVzcGFjZSBjaGFuZ2VzLgorCisJKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogU29tZSBmaWVsZHMgcmVvcmRlcmVkLCBuYXJyb3dlZC4KKworCSogcmVhZC5jIChNQVNLX0NIQVIpOiBEZWZpbmUgdXNpbmcgQyB0eXBlcywgbm90IG1hZ2ljIG51bWJlci4KKworCSogYXMuYywgaW5wdXQtZmlsZS5jOiBEZWxldGVkIHNvbWUgdW51c2VkIGNvZGUuCisKKwkqIGFwcC5jLCBhcy5oOiBEb2MgZml4LgorCisJKiBmbG9udW0ta29uc3QuYywgZmxvbnVtLW11bHQuYzogSW5jbHVkZSBhbnNpZGVjbC5oLgorCisJKiBhcy5oICh4bWFsbG9jKTogQXJndW1lbnQgaXMgbG9uZy4KKworCSogeG1hbGxvYy5jIChlcnJvcik6IFJlbW92ZSBkZWNsYXJhdGlvbjsgYXMuaCB0YWtlcyBjYXJlIG9mIGl0LgorCisJKiBkb2MvYXMudGV4aW5mbzogUmVncm91cGVkIGRvY3VtZW50YXRpb24gb2Ygc29tZSBjb21tYW5kLWxpbmUKKwlvcHRpb25zLiAgVXBkYXRlZCBvcHRpb25zIGRvY3VtZW50YXRpb24gZm9yIG02OGsuICBTb21lIG1pbm9yCisJd29yZGluZy9wdW5jdHVhdGlvbiBjaGFuZ2VzLgorCitNb24gTm92IDMwIDExOjQyOjExIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBY2NlcHQgdGFyZ2V0IE9TICJ2bXMiLgorCisJKiBzeW1ib2xzLmM6ICBNZXJnZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbHMsIHVzaW5nCisJUEFSQU1TIG1hY3JvLgorCisJKiB4bWFsbG9jLmM6IEp1c3QgaW5jbHVkZSBhcy5oLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQKKwlvdGhlciBoZWFkZXIgZmlsZXMuCisKKwkqIHN0cnN0ci5jLCBzdHJlcnJvci5jOiBEZWxldGVkLgorCSogTWFrZWZpbGUuaW46IERlbGV0ZWQgcmVmZXJlbmNlcy4KKworCSogY29uZmlnL3RjLW5zMzJrLmM6IERvbid0IGluY2x1ZGUgaGVhZGVyIGZpbGUgZm9yIHN0cmluZworCWRlY2xhcmF0aW9uczsgbGVhdmUgdGhhdCB0byBoby0qLmguCisKK0ZyaSBOb3YgMjcgMDQ6MTE6MzYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuIGF0IGNhbWJyaWRnZS1sYXB0b3AuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2NvZmZfZ251LmggW1RDX0k4NjBdOiBHdWVzc2VzIGZvciByZWxvYyB0eXBlIHZhbHVlcywKKwlpbXBvcnRlZCBmcm9tIEZTRiBzb3VyY2VzLgorCisJKiBtZXNzYWdlcy5jIChzdHJlcnJvcik6IERlY2xhcmUgdW5jb25kaXRpb25hbGx5LgorCisJKiBhcy5oOiBEZWxldGUgYWxsb2NhIGFuZCByZWdpc3RlciBkZWZpbml0aW9ucy4KKworCSogY29uZmlnL2F0b2YtaWVlZS5jIChtYXNrKTogTm93IGNvbnN0LgorCisJKiBvYnN0YWNrLmMsIG9ic3RhY2suaDogRGVsZXRlZC4KKworCSogYXMuaCAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpOiBOZXcgZmxhZy4KKwkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1SLgorCisJKiBhcy5oIChmbGFnX3N1cHByZXNzX3dhcm5pbmdzKTogTmV3IGZsYWcuCisJKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtVy4KKwkqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBDaGVjayBpdCBpbnN0ZWFkIG9mIGZsYWdzZWVuWydXJ10uCisKKwkqIGFzLmggKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCk6IE5ldyBmbGFnLgorCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVouCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oOiBEZWZpbmUgTkVFRF9GWF9SX1RZUEUuCisJKiBjb25maWcvdGMtYTI5ay5oOiBEaXR0by4KKwkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBEb24ndCBjb25kaXRpb25hbGl6ZSBmeF9yX3R5cGUgZmllbGQgb24gVEMKKwltYWNyb3MuCisKKwkqIGFzLmg6IE1lcmdlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNscywgdXNpbmcgUEFSQU1TCisJbWFjcm8uCisJKiBiaWdudW0uaCwgZXhwci5oLCBmbG9udW0uaCwgZnJhZ3MuaCwgaW5wdXQtZmlsZS5oLCBsaXN0aW5nLmgsCisJb2JqLmgsIG91dHB1dC1maWxlLmgsIHJlYWQuaCwgc3RydWMtc3ltYm9sLmgsIHN5bWJvbHMuaCwgdGMuaCwKKwl3cml0ZS5oOiBMaWtld2lzZS4KKwkqIHJlYWQuYzogTGlrZXdpc2UuCisKKwkqIHhtYWxsb2MuYzogQ29uZGl0aW9uYWxpemUgb24gSEFWRV9NQUxMT0NfSCwgbm90IFVTRy4gIEZvbGQgaW4KKwl4cmVhbGxvYyBmcm9tIHhyZWFsbG9jLmMuCisJKiB4cmVhbGxvYy5jOiBEZWxldGVkLgorCSogTWFrZWZpbGUuaW4gKFJFQUxfU09VUkNFUywgT0JKUyk6IEFkanVzdGVkLgorCisJKiBjb25maWd1cmUuaW46IEZvciBob3N0IENQVSBhMjlrLCByczYwMDAsIHZheCwgY29uc2lkZXIgdXNpbmcgYnNkCisJb3Igdm1zIGhvLSBmaWxlcy4KKworCSogY29uZmlnL2hvLXN5c3YuaCAoc2V0YnVmZmVyLCBIT19VU0cpOiBEZWxldGVkLgorCisJKiBjb25maWcvYXRvZi1pZWVlLmMgKGF0b2ZfaWVlZSk6IEV4cG9uZW50IGZpZWxkIGlzbid0IGEgcG9pbnRlcjsKKwlkb24ndCBpbml0aWFsaXplIGl0IHdpdGggTlVMTC4KKworCSogY29uZmlnL2hvLXZheC5oIChNX1ZBWCk6IERlbGV0ZWQ7IHdhcyB1bnVzZWQuCisKKwkqIFJFQURNRS12bXMsIGNvbmZpZy9oby12bXMuaCwgY29uZmlnL29iai12bXMuYywgY29uZmlnL29iai12bXMuaDoKKwlOZXcgZmlsZXMgaW1wb3J0ZWQgZnJvbSBGU0YgdmVyc2lvbiwgY29udHJpYnV0ZWQgYnkgRXJpYyBZb3VuZ2RhbGUuCisJKiBSRUFETUUtdm1zLWRiZywgY29uZmlnL3ZtczogRGVsZXRlZC4KKworCSogQ2hhbmdlTG9nLCBjb25maWcvQ2hhbmdlTG9nOiBNZXJnZWQuCisKKwkqIGNvbmZpZy8qdGFob2UqLCBjb25maWd1cmUuaW46IFRhaG9lIHN1cHBvcnQgYnJvdWdodCBpbiBmcm9tIEZTRgorCXZlcnNpb24uCisKKwkqIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9vcGVuKTogRWxpbWluYXRlIGNhbGwgdG8gc2V0dmJ1Zi4KKwlbVVNHXSAoc2V0YnVmZmVyKTogRGVsZXRlZCBtYWNyby4KKworTW9uIE5vdiAyMyAxMTowMDoxNiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogYWxsIGZpbGVzOiBXaGl0ZXNwYWNlIGNoYW5nZXMgZm9yIEdOVSBpbmRlbnRhdGlvbiBzdHlsZSwgZG9uZSBieQorCUdOVSBgaW5kZW50Jy4gIFNvbWUgY2xlYW51cCBzdGlsbCBuZWVkZWQsIGVzcGVjaWFsbHkgb2YgY29tbWVudHMuCisKKwkqIGNvbmZpZ3VyZS5pbjogTm8gdGUtMzg2YnNkLmggZmlsZSBleGlzdHM7IGRvbid0IHRyeSB0byB1c2UgaXQuCisKKwkqIG9iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogVXNlIGFzX3dhcm4sIG5vdCBmcHJpbnRmLgorCisJKiB0Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgY29tcGxhaW4gYWJvdXQgNjgwMDAgd2l0aCA2ODg4MTsKKwljb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uCisKK1RodSBOb3YgMTkgMTE6NDc6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwl6ODAwMCBkb2N1bWVudGF0aW9uCisJKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9hbGwubTQsIGRvYy9hcy1hbGwudGV4aW5mbywgZG9jL2FzLnRleGluZm86CisJYWxsIG1vZGlmaWVkLgorCitUdWUgTm92IDEwIDA5OjQ5OjI0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFzLm8sIG9iai1mb3JtYXQubyk6IGFkZGVkIGRlcGVuZGVuY3kgb24gc3Vic2Vncy5oLgorCisJKiBzdWJzZWdzLmg6IGFkZCBleHRlcm4gdG8gc2VnbWVudF9pbmZvIGRlY2xhcmF0aW9uLgorCisJKiByZWFkLmg6IGFkZGVkIGV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIGNvbW1lbnRfY2hhcnMsCisJbGluZV9jb21tZW50X2NoYXJzLCBhbmQgbGluZV9zZXBhcmF0b3JfY2hhcnMuCisJcmVhZC5jLCBhcHAuYzogcmVtb3ZlZCBkZWZpbml0aW9ucyBvZiBjb21tZW50X2NoYXJzLAorCWxpbmVfY29tbWVudF9jaGFycywgYW5kIGxpbmVfc2VwYXJhdG9yX2NoYXJzLgorCisJKiB0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogSWYgUkVHSVNURVJfUFJFRklYIGlzbid0IGRlZmluZWQsCisJc3RpbGwgYWNjZXB0IChidXQgZG9uJ3QgcmVxdWlyZSkgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYIGJlZm9yZQorCXRoZSByZWdpc3RlciBuYW1lLgorCShpbnNlcnRfcmVnKTogcHV0IFJFR0lTVEVSX1BSRUZJWCBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMgYmVmb3JlCisJcHV0dGluZyB0aGVtIGluIHRoZSBzeW1ib2wgdGFibGUuCisJKiB0Yy1tNjhrLmggKE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCk6IERlZmluZSB0byBiZSAiJSIsIGlmIG5vdAorCU02OEtDT0ZGLgorCisJKiBvYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBzZXQgU1RZUF9OT0xPQUQgYml0IGZvciAuYnNzCisJc2VjdGlvbi4KKworCSogYXRvZi1pZWVlLmMsIGF0b2YtbnMzMmsuYywgdGMtKi5jOiBtYWRlIEVYUF9DSEFSUywgRkxUX0NIQVJTLAorCWNvbW1lbnRfY2hhcnMsIGxpbmVfY29tbWVudF9jaGFycyBhbmQgbGluZV9zZXBlcmF0b3JfY2hhcnMKKwljb25zaXN0ZW50bHkgY29uc3QsIGFuZCBhbHdheXMgaW5pdGlhbGl6ZWQgdGhlbS4gIEluY2x1ZGVkIHJlYWQuaC4KKworVGh1IE5vdiAgNSAxNzo1NTo0MSAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCisKKwkqIHRjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIGNvZGUgdG8gZmxhZyBlcnJvciBpZiBhbiBhYnNvbHV0ZQorCWNvbnN0YW50IHdpbGwgbm90IGZpdCBpbiBhbiBpbW1lZGlhdGUgZmllbGQuCisJKG1kX2FwcGx5X2ZpeCwgUkVMT0NfQkFTRTEzIGNhc2UpOiBDaGVjayBmb3IgcmVsb2NhdGlvbiBvdmVyZmxvdy4KKworV2VkIE5vdiAgNCAwNzo1MDo0NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogb2JqLWNvZmYuYyAoY2FsbGpfdGFibGUpOiBEZWxldGUgZ2xvYmFsIHZhcmlhYmxlLgorCShvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IERlZmluZSBpdCBsb2NhbGx5IGhlcmUsIGFuZCBvbmx5IGlmCisJVENfSTk2MCBpcyBkZWZpbmVkLgorCisJKiB0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogVW5kZXJzY29yZSBpcyBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuCisJKG02OGtfaXApOiBEb24ndCB3YXJuIGFib3V0IGJpZ251bSB1c2VkIGFzIGZsb2F0IGJpdC1wYXR0ZXJuLgorCisJKiBvYmotY29mZi5jOiBSZXBsYWNlZCBBTlNJIGFuZCBub24tQU5TSSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKwl3aXRoIGEgc2luZ2xlIHNldCB1c2luZyBQQVJBTVMgbWFjcm8uCisKKwkqIHRjLWk5NjAuYyAodGNfYm91dF9maXhfdG9fY2hhcnMpOiBCaXQtZmllbGQgZml4dXBzIHdhbnQgYSBsZW5ndGgKKwlvZiAyLgorCisJKiB0Yy1pOTYwLmM6IE1pc3NlZCBhIGNvdXBsZSBvZiAwLT5OT19SRUxPQyBjb252ZXJzaW9ucy4KKworCSogdGMtaTk2MC5oIChOX0JBTE5BTUUsIE5fQ0FMTE5BTUUpOiBEZWZpbmUgYXMgY2hhci10eXBlIHZhbHVlcywKKwlzbyB3aWRlbmluZyB3b3JrcyBjb25zaXN0ZW50bHkuCisKK1dlZCBPY3QgMjggMDg6NTI6MzQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIHZlcnNpb24uYzogUHV0IGNvbmRpdGlvbmFsICJjb25zdCIgYmVmb3JlIHZlcnNpb25fc3RyaW5nLCBub3QKKwliZWZvcmUgZHVtbXkgZnVuY3Rpb24gZm9yIFZNUy4gIE5vdyB2ZXJzaW9uIDEuOTEuMDMuCisKKwkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBOZWVkIGRvdWJsZS1cIGJlZm9yZSBgMDAwJyB0byBzaG93CisJcHJpbnRlZCByZXAgb2YgbnVsbCBjaGFyYWN0ZXIuCisKK0ZyaSBPY3QgMjMgMTQ6NDA6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBvYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGNoZWNrIHJldHVybiB2YWx1ZSBvZgorCWJmZF9jbG9zZV9hbGxfZG9uZS4KKworVHVlIE9jdCAyMCAxMjoxODowOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIFN1cHBvcnQgZm9yIGkzODYtc3lzdi4KKwlvYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yLCB3cml0ZV9vYmplY3RfZmlsZSk6IHNldCBzZWdtZW50CisJYWRkcmVzc2VzIHRvIHJlYXNvbmFibGUgc2l6ZXMuICBOZXcgZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMgY2FuCisJYmUgdXNlZCB0byBzZXQgdGhlbSBhbGwgdG8gemVybyBhcyB3YXMgZG9uZSBiZWZvcmUuCisJKGZpbGxfc2VjdGlvbik6IHNlZ21lbnQgYWRkcmVzc2VzIG5vdyBzZXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUuCisJKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBTVFlQX05PTE9BRCBmb3IgLmJzcyBzZWN0aW9uLgorCShmaXh1cF9zZWdtZW50KTogMzg2IHVzZXMgc3RyYW5nZSBjb21tb24gc3ltYm9sIGZvcm1hdC4KKwl0Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogdXNlIFJfRElSMzIsIG5vdCBSX1JFTExPTkcsIGZvcgorCWNvbXBhdGliaWxpdHkgd2l0aCBTVlIzLjIgbGlua2VyLgorCSogY29uZmlndXJlLmluOiBpMzg2LXN5c3YgYW5kIGkzODYtc2NvIHVzZSBjb2ZmYmZkLgorCisJKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogZGlzY2FyZCB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwuCisKK1NhdCBPY3QgMTAgMTI6MzM6NDUgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBTdW5PUyA0IGFuZCBTb2xhcmlzMiBmb3IgU3VuNAorCWhvc3RzLCB1c2UgdGhlIHN5c3YgY29uZmlndXJhdGlvbiBmb3Igc29sYXJpczIKKworTW9uIE9jdCAgNSAwOToyODo1NyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSBmaXggaTk2MCtub24tYmZkIGNvZmYgYml0IHJvdC4KKwkqIG9iai1jb2ZmLmMgKGNfZG90X2ZpbGVfc3ltYm9sLCBvYmpfY29mZl9sbiwgb2JqX2NvZmZfbGluZSk6CisJc3VwcG9ydCBmb3IgQyBzb3VyY2UgbGlzdGluZ3MuIChvYmpfY29mZl9lbmRlZik6IGxvb2sgaW4gdGhlIHJpZ2h0CisJcGFydCBvZiB0aGUgc3ltYm9sIGZvciB0aGUgc3ltYm9sIG5hbWUKKworCSogdGMtbTY4ay5jIChnZXRfbnVtKTogbWFrZSBpdCB3b3JrIGZvciBhbGwgc2VnbWVudHMsIG5vdCBqdXN0IHRoZQorCWZpcnN0IHRocmVlLgorCitNb24gT2N0ICA1IDAzOjMwOjM2IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaTM4Ni0qLWJzZCBlbXVsYXRpb24uCisKK1RodSBPY3QgIDEgMjM6MDU6MTIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHVzZSB0aGUgY3B1LXZlbmRvci1vcyB0cmlwbGUgZm9yIGhvc3QgYW5kIHRhcmdldAorCitUdWUgU2VwIDI5IDEyOjIyOjUyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvYmotY29mZmJmZC5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGRvbid0IGZpeHVwIGZvciB0aGUgejhrCisJKiB0Yy16OGsuYzogbG90cyBvZiBidWcgZml4ZXMKKworVHVlIFNlcCAyOSAxMDo1MTo1NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHRjLWk5NjAuaCwgdGMtaTk2MC5jOiBhdm9pZCB0aGUgQU5TSSBwcmVwcm9jZXNzb3IgYWRkaXRpb24KKwkjZWxpZiwgc2luY2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBvbGQgY29tcGlsZXJzLgorCWhvLXJzNjAwMC5oLCB0Yy1tNjhrLmM6IHRoZSBuYXRpdmUgUlMvNjAwMCBjb21waWxlciBtaXNjb21waWxlcyBhCisJY291cGxlIG9mIGV4cHJlc3Npb25zIGluIHRjLW02OGsuYy4KKworTW9uIFNlcCAyOCAyMToxODoyNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHJlYWQuYyAoY29ucyk6IElmIE5PX1JFTE9DIGlzIGRlZmluZWQsIHVzZSBpdC4KKworCSogdGMtaTk2MC5jIChnZXRfY2Rpc3ApOiBVc2UgTk9fUkVMT0MsIG5vdCAwLCBpbiBjYWxsIHRvIGZpeF9uZXcuCisKK0ZyaSBTZXAgMjUgMTg6MTg6NTIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB0Yy1tNjhrLmg6IGlmIE02OEtDT0ZGLCBkZWZpbmUgRE9UX0xBQkVMX1BSRUZJWCAodG8gcmVxdWlyZQorCWxvY2FsIGxhYmVscyB0byBzdGFydCB3aXRoIGEgLikgYW5kIHNldCBSRUdJU1RFUl9QUkVGSVggdG8gJS4KKwl0Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogYWNjZXB0IFJFR0lTVEVSX1BSRUZJWCBpZiBkZWZpbmVkLgorCitGcmkgU2VwIDI1IDE3OjUzOjQzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBtZXNzYWdlcy5jOiAgQ29tbWVudCBjaGFuZ2VzLgorCitGcmkgU2VwIDI1IDE0OjEyOjU4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBreXJpYXRoLmN5Z251cy5jb20pCisKKwkqIGFzLmg6IFRlc3QgaWYgX19TVERDX18gaXMgZGVmaW5lZCBvbmx5LCBkb24ndCB0ZXN0IGl0cyB2YWx1ZS4KKwkqIG1lc3NhZ2VzLmM6IElmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgTk9fU1REQVJHLgorCitUaHUgU2VwIDI0IDEyOjQyOjMyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQorCisJKiBsaXN0aW5nLmMgKGRlYnVnZ2luZ19wc2V1ZG8pOiBBZGQgc3RhYnMgYW5kIHN0YWJuIGFzIHRoaW5ncyB0bworCWlnbm9yZS4KKworVHVlIFNlcCAyMiAxMzowMjowNyAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKKworCSogb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2ZvcixmaWxsX3NlY3Rpb24pOiBub3cgYWxsb2NhdGUgYWxsCisJc2VjdGlvbnMgc3RhcnRpbmcgZnJvbSB6ZXJvLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBjb25zZWN1dGl2ZS4KKwlUaGlzIG1ha2VzIHN1YnNlcXVlbnQgcmVsb2MgY2FsY3VsYXRpb25zIGVhc2llciwgZXNwIGlmIHRoZSBvYmplY3QKKwlmb3JtYXQgZG9lc24ndCB1bmRlcnN0YW5kIGFkZGVuZHMuIChvYmpfY29mZl9sY29tbSk6IChtYXliZSB0ZW1wb3JhcmlseSkKKwlhbGxvY2F0ZSBsY29tbSBpbiAuZGF0YSByYXRoZXIgdGhhbiBpbiAuYnNzLiAgSXQgc2VlbXMgdGhhdCBzb21lCisJdG9vbHMgY2FuJ3QgY29wZSB3aXRoIGEgbm9uLXplcm8gc2l6ZWQgYnNzIGJlZm9yZSBsaW5rYWdlLgorCitUdWUgU2VwIDIyIDE1OjEwOjUxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogdGMtbTY4ay5jOiBSZXBsYWNlICJlbnVtIG02OGtfYXJjaGl0ZWN0dXJlIiB3aXRoICJpbnQiCisJdGhyb3VnaG91dC4gIFRoYXQgZW51bSBubyBsb25nZXIgbWVhbnMgd2hhdCB3ZSB0aG91Z2h0IGl0IG1lYW50LgorCisJKiB0Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlLCBtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3CisJIi1tbm8tNjg4WzU4XTEiIG9wdGlvbnMuCisKKwkqIHRjLW02OGsuYzogQWRkZWQgQ1BVMzIgc3VwcG9ydC4KKworRnJpIFNlcCAxOCAwODowMjoxOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogdGMtbTY4ay5jIChtNjhrX2lwKTogQW4oZGlzcCkgaXMgbm90IHBjIHJlbGF0aXZlLgorCitUdWUgU2VwIDE1IDE3OjI1OjA1IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IFJlbW92ZSBkZXBlbmRlbmNlIG9uIExPQ0FMX0xPQURMSUJFUy4KKwlDaGFuZ2UgTElCREVQUyBkZXBlbmRlbmNlIHRvIExJQlMuCisKK1R1ZSBTZXAgMTUgMTU6MzI6MDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIGFzIGluCisJJCh0b29sZGlyKS9iaW4uCisKK1N1biBTZXAgMTMgMjA6MzA6MTAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBBZGRlZCBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JEIGRlZmluZSB0byBnaXZlIGFuIGVycm9yIGlmIGFueQorCS53b3JkIGlzIDwgLTMyNzY4IG9yID4gMzI3NjcuICBUaGUgLUogZmxhZyBjYXVzZXMgdGhlIGVycm9yIHRvIGJlCisJaWdub3JlZC4gIFRoaXMgaXMgdG8gY2F0Y2ggb3Zlci1zaXplZCBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uCisJc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IHRoZSBicm9rZW4gLndvcmQgaGFjay4KKwlhcy5jIChtYWluKTogcGVybWl0IC1KIGlmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCisJd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGNoZWNrIGZvciBzaWduZWQgLndvcmQgb3ZlcmZsb3cgaWYKKwlXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogZml4ZWQgbWlzc2luZyBwYXJlbnMgaW4gZXhwcmVzc2lvbgorCWNoZWNraW5nIGZvciBieXRlIG9yIHdvcmQgb3ZlcmZsb3cuCisKKwkqIG9iai1jb2ZmYmZkLmg6IGRlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgorCW9iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBjaGVjayBmb3Igc2lnbmVkIC53b3JkIG92ZXJmbG93IGlmCisJV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KKworCSogb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCk6IGZpeGVkIG1pc3NpbmcgcGFyZW5zIGluCisJZXhwcmVzc2lvbiBjaGVja2luZyBmb3IgYnl0ZSBvciB3b3JkIG92ZXJmbG93LgorCitGcmkgU2VwIDExIDEwOjIxOjA0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJU3VwcG9ydCBmb3IgaTM4NiBjb2ZmCisJKiBvYmotY29mZmJmZC5oIDogYWRkZWQgc3R1ZmYKKwkqIHRjLWkzODYuYyAodGNfY29mZl9maXgycnR5cGUpOiBuZXcgZnVuY3Rpb24KKwkqIHRjLWkzODYuaCA6IG5ldyBjb2ZmIGRlZmluZXMKKworVGh1IFNlcCAxMCAwOToyMzoxNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3B1c2gpOiBjYWxsIGlucHV0X2ZpbGVfYmVnaW4sIG5vdAorCWlucHV0X3NjcnViX2JlZ2luLgorCW1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IHByaW50ICI6ICIgYmV0d2VlbiB0aGUgcGFzc2VkIGluIGVycm9yIGFuZAorCXRoZSBzdHJlcnJvciwgbGlrZSBwZXJyb3IgZG9lcy4KKworV2VkIFNlcCAgOSAxMTowNjoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiB1c2UgZ2FzX3RhcmdldCBpbnN0ZWFkIG9mIG1vZGlmeWluZyB0YXJnZXRfY3B1LgorCUZyb20gU3RldmUgQ2hhbWJlcmxhaW46CisJTWFrZWZpbGUuaW46IEhhbmRsZSBtNjgqLSotY29mZiouCisJcmVhZC5jLCByZWFkLmg6IGFkZCBtdWx0IGFyZ3VtZW50IHRvIHNfc3BhY2UKKworCSogdGMtbTY4ay5jIChtNjhrX2lwLCBtNjhrX2lwX29wLCBnZXRfbnVtLCB0cnlfbW90b19pbmRleCk6IG1lcmdlCisJIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4OyBnYXMgY2FuIG5vdyBhc3NlbWJsZSBlaXRoZXIgdHlwZSBvZgorCSBmaWxlLgorCXRjLW02OGttb3RlLmMsIHRjLW02OGttb3RlLmg6IHJlbW92ZWQgbm93IHN1cGVyZmx1b3VzIGZpbGVzLgorCUZyb20gU3RldmUgQ2hhbWJlcmxhaW46CisJbTY4a2NvZmYubXQ6IGZvciBtNjhrIENPRkYuCisJb2JqLWNvZmZiZmQuYzogKGZpeHVwX21kZXBzKSBhZGRlZAorCSAoc2l6ZV9zZWN0aW9uKSByZW1vdmVkIGJhZCBzYW5pdHkgY2hlY2sKKwkgKGZpbGxfc2VjdGlvbikgYWRkZWQgcnNfbWFjaGluZV9kZXBlbmRlbnQgY2FzZQorCSAod3JpdGVfb2JqZWN0X2ZpbGUpIGNhbGwgZml4dXBfbWRlcHMKKwkgKGZpeHVwX3NlZ21lbnQpIHNldCBmeF9zdWJzeSB0byAwLgorCW9iai1jb2ZmYmZkLmg6IGRlZmluZSBXT1JLSU5HX0RPVF9XT1JEICh0b28gaGFyZCB0byBzdXBwb3J0KSBhbmQKKwkgaGFuZGxlIG02OGsuCisJdGMtbTY4ay5jLCBjb25maWcvdGMtbTY4ay5oOiBhZGRlZCBtNjhrIENPRkYgc3VwcG9ydCBhbmQgTW90b3JhbGEKKwkgcHNldWRvIG9wcy4KKworVHVlIFNlcCAgOCAxNzoxMDo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChMSUJTKTogSW5jbHVkZSBvcGNvZGUgbGlicmFyeS4KKworRnJpIFNlcCAgNCAxODoyMDo1NiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X251bSwgY2FzZSBTRUdfQklHKTogSWYgb25seSBzbWFsbCBpbnRlZ2VycworCWluY2x1ZGluZyB6ZXJvIGFyZSBhY2NlcHRlZCwgcGFzcyArMC4wLgorCitTdW4gQXVnIDMwIDIxOjI0OjQ2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IG1hcCAiYXMiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCisJaW5zdGFsbGluZy4KKworCSogZG9jL01ha2VmaWxlLmluOiBtYXAgImFzIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgorCWluc3RhbGxpbmcuCisKK1NhdCBBdWcgMjkgMTI6MTE6MTIgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogRGVwZW5kIG9uIExPQ0FMX0xPQURMSUJFUy4KKworRnJpIEF1ZyAyOCAxNjoyNToyMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG9iai1ib3V0LmgsIG9iai1ib3V0LmMgKG9ial9oZWFkZXJfYXBwZW5kLCBvYmpfc3ltYm9sX3RvX2NoYXJzKSwKKwl0Yy1pOTYwLmMgKG1kX3JpX3RvX2NoYXJzKTogQWx3YXlzIG91dHB1dCBib3V0IG9iamVjdCBmaWxlIGluCisJbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICh1c2VkIHRvIHVzZSBlbmRpYW5uZXNzIG9mIGhvc3QpLgorCitUdWUgQXVnIDI1IDE1OjUwOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IE5vdyBjb25zdC4gIEFsd2F5cyBpbmNsdWRlIDY4ODUxCisJZGF0YSwgc28gdGhhdCAiYmMiIGlzIGF2YWlsYWJsZSB0byA2ODA0MCBjYWNoZSBpbnN0cnVjdGlvbnMuCisJQWRkZWQgInR0MCIsICJ0dDEiLCBhbmQgNjhlYzAzMCB2YXJpYW50cy4KKwkobWRfYXNzZW1ibGUpOiBDb21wbGFpbiBpZiA2ODAwMCAob25seSkgYW5kIDY4ODgxIGFyZSBzcGVjaWZpZWQuCisJKGVudW0gX3JlZ2lzdGVyKTogQWRkZWQgVFQwLCBUVDEuCisJKG02OGtfaXAsIGNhc2VzICczJyBhbmQgJ3QnKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgY29kZXMuICBQYXNzCisJbGluZSBudW1iZXIgY29ycmVjdGx5IGluICJpbnRlcm5hbCBlcnJvciIgbWVzc2FnZXMuICBEb24ndCBwcmludAorCWFyY2hpdGVjdHVyZS1taXNtYXRjaCBtZXNzYWdlIGZvciBvcGVyYW5kIGVycm9ycy4KKworCUZyb20gQ29saW4gU21pdGggKGNvbGluQHdycy5jb20pOgorCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAnXycpOiBVc2UgYWRkd29yZCB0d2ljZSByYXRoZXIKKwl0aGFuIGluc3RhbGxfb3BlcmFuZC4KKworVHVlIEF1ZyAyNSAxNToxMzo0OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGlzdGluZy5jIChidWZmZXJfbGluZSk6IHJld2luZCB0byB0aGUgc3RhcnQgb2YgaW5jbHVkZQorCWZpbGVzLCB0aGV5IG1pZ2h0IGJlIGluY2x1ZGVkIHR3aWNlLgorCisJKiB6OGsuYywgejhrLmgsIHo4ay5tdDogejgwMDAgc3VwcG9ydCBzdHVmZgorCitNb24gQXVnIDI0IDEyOjQ1OjQzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGRlZmluZWQgVEFSR0VUX0NQVSBmb3IgQyBjb2RlIHNvIHRoYXQgaXQgY2FuIGNob29zZQorCW9uZSBlbGVtZW50IG9mIGEgZmFtaWx5LgorCisJKiB0Yy1tNjhrLmM6IHVzZSBUQVJHRVRfQ1BVIHRvIGNob29zZSBkZWZhdWx0IGNwdSB0eXBlLgorCisJKiB0ZS1nZW5lcmljLmg6IGRlZmF1bHQgdG8gTE9DQUxfTEFCRUxTX0RPTExBUiBhbmQgTE9DQUxfTEFCRUxTX0ZCCisJc28gdGhhdCB3ZSBjYW4gYXNzZW1ibGUgaGFuZC13cml0dGVuIGxpYmdjYyBjb2RlLgorCitGcmkgQXVnIDIxIDE0OjM4OjQ0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogbWVzc2FnZXMuYyAoYXNfd2Fybik6IFVzZSBmcHV0cywgbm90IGZwcmludGYsIHdpdGggYSBidWZmZXIgdGhhdAorCWhhcyBhbHJlYWR5IGJlZW4gZm9ybWF0dGVkIChidXQgbWF5IHN0aWxsIGNvbnRhaW4gJS1jaGFyYWN0ZXJzKS4KKwkoYXNfYmFkKTogTGlrZXdpc2UuCisKK1dlZCBBdWcgMTkgMTE6MjA6NTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB0Yy1tNjhrLmMsIHRjLW02OGttb3RlLmM6IHRoZSBjYXMyIGluc3RydWN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlCisJd3JpdHRlbiB3aXRoIGluZGlyZWN0aW9uIG9uIHRoZSBsYXN0IHR3byBvcGVyYW5kcywgd2hpY2ggY2FuIGJlCisJZWl0aGVyIGRhdGEgb3IgYWRkcmVzcyByZWdpc3RlcnMuICBBZGRlZCBhIG5ldyBvcGVyYW5kIHR5cGUgJ3InCisJd2hpY2ggYWNjZXB0cyBlaXRoZXIgcmVnaXN0ZXIgdHlwZS4gIEFkZGVkICcoJyB0byBub3RlbmQgc3R1ZmYgaW4KKwl0Yy1tNjhrbW90ZS5jIHRvIGFjY2VwdCAoYTApOihhMikgaW4gY2FzMiBpbnN0cnVjdGlvbi4KKworV2VkIEF1ZyAxOSAwOToyNTowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogYXMuaCAoZW51bSBfcmVsYXhfc3RhdGUpOiBTdGFydCBvZmYgYXQgb25lLCBub3QgemVybywgdG8gYmV0dGVyCisJY2F0Y2ggdW5pbml0aWFsaXplZC12YXJpYWJsZSBlcnJvcnMuCisJKGxpbmtyZWxheCk6IERlY2xhcmUgbmV3IHZhcmlhYmxlLgorCisJKiBtZXNzYWdlcy5jICh3YXJuaW5nX2NvdW50LCBlcnJvcl9jb3VudCk6IERlZmF1bHQgaW5pdGlhbGl6ZXIgaXMKKwlzdWZmaWNpZW50LgorCisJKiB3cml0ZS5jOiBNZXJnZWQgc29tZSBkZWNsYXJhdGlvbnMsIHVzaW5nIFBBUk1TIG1hY3JvLgorCSh0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QsIGJzc19mcmFnX3Jvb3QsIHRleHRfbGFzdF9mcmFnLAorCWRhdGFfbGFzdF9mcmFnKTogTm8gbG9uZ2VyIHN0YXRpYy4KKwkod3JpdGVfb2JqZWN0X2ZpbGUsIGNhc2UgcnNfYWxpZ24gb3IgcnNfb3JnKTogSWYgSEFORExFX0FMSUdOIGlzCisJZGVmaW5lZCwgY2FsbCBpdC4gIENoYW5nZSBzZWdtZW50cyBiZWZvcmUgY2FsbGluZyBmaXh1cF9zZWdtZW50LgorCShyZWxheF9hbGlnbik6IElmIGxpbmtyZWxheCwgcHJvdmlkZSBleHRyYSBwYWRkaW5nLgorCisJKiBvYmotYm91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IEVtaXQgYWxpZ25tZW50IHJlbG9jcyBkZXNwaXRlCisJdGhlaXIgbm90IGhhdmluZyBzeW1ib2xzIGFzc29jaWF0ZWQuCisKKwkqIHRjLWk5NjAuYyAobm9yZWxheCwgaW5zdHJ1bWVudF9icmFuY2hlcyk6IERlZmF1bHQgaW5pdGlhbGl6ZXIgaXMKKwlzdWZmaWNpZW50LgorCShsaW5rcmVsYXgpOiBEZWxldGUgdmFyaWFibGUgZGVmaW5pdGlvbi4KKwkobWVtX2ZtdCk6IENhbGwgZml4X25ldyB3aXRoIE5PX1JFTE9DLgorCSh0Y19ib3V0X2ZpeF90b19jaGFycyk6IEhhbmRsZSBhbGlnbm1lbnQgcmVsb2NzLgorCShpOTYwX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KKwkqIHRjLWk5NjAuaCAobGlua3JlbGF4KTogRGVsZXRlIGRlY2xhcmF0aW9uLgorCShIQU5ETEVfQUxJR04pOiBOZXcgbWFjcm87IGNhbGxzIGk5NjBfaGFuZGxlX2FsaWduLgorCShORUVEX0ZYX1JfVFlQRSwgTk9fUkVMT0MpOiBOZXcgbWFjcm9zLgorCitUdWUgQXVnIDE4IDE0OjU5OjIxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjb25maWcvc3BhcmMubXQ6IE5ldyBmaWxlLiAgR3JhYiBzcGFyYyBvcGNvZGUgdGFibGUgZnJvbSBiZmQKKwlsaWJyYXJ5LgorCitUdWUgQXVnIDE4IDE0OjE2OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLiAgUmVtb3ZlZAorCU1JTlVTX0csIHNldCBDRkxBR1MgdG8gZGVmYXVsdCB0byAtZywgYWRkZWQgRkxBR1NfVE9fUEFTUywgcGFzc2VkCisJRkxBR1NfVE9fUEFTUyB0byByZWN1cnNpdmUgbWFrZXMuCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCisKK01vbiBBdWcgMTcgMTU6MDk6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX3BvcCwgaW5wdXRfc2NydWJfcHVzaCk6IG1lbWNweSB3YXMKKwliZWluZyB1c2VkIHdpdGggYXJncyBzd2FwcGVkLCBjYXVzaW5nIG9jY2FzaW9uYWwgbG9zc2FnZSB3aGVuCisJcmVmaWxsaW5nIGJ1ZmZlcnMgYWZ0ZXIgYW4gaW5jbHVkZSBmaWxlLgorCitNb24gQXVnIDE3IDEzOjE4OjUxIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBtZXNzYWdlcy5jIChhc190c2t0c2spOiBVc2UgY29ycmVjdCBBTlNJIGZvcm0gZm9yIHN0ZGFyZworCXZlcnNpb24uICBEaXNjYXJkIGJvZ3VzIERPTlRERUYgdmVyc2lvbi4KKwkoYXNfd2FybiwgYXNfYmFkLCBhc19mYXRhbCk6IExpa2V3aXNlLgorCitGcmkgQXVnIDE0IDE4OjMxOjE0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSWYgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCBmb3IgdGhlCisJc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlLCBwcmludCBhIG1lc3NhZ2Ugc2F5aW5nIHNvIGFuZCBsaXN0aW5nIHdoYXQKKwlwcm9jZXNzb3JzIHN1cHBvcnQgaXQsIHJhdGhlciB0aGFuIHNheWluZyAib3BlcmFuZHMgbWlzbWF0Y2giLgorCitUaHUgQXVnIDEzIDEzOjUzOjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBhcy5oIFtCUk9LRU5fQVNTRVJUXTogSWYgZGVmaW5lZCwgdHVybiBvZmYgYWxsIGFzc2VydGlvbiBjaGVja3MuCisKKwkqIGNvbmZpZy9oby1yczYwMDAuaCAoTV9SUzYwMDApOiBEb24ndCBkZWZpbmUgaXQuCisJKGZyZWUpOiBEZWNsYXJlIGl0LgorCShCUk9LRU5fQVNTRVJUKTogRGVmaW5lIGl0IGlmIG5vdCBfX1NURENfXy4KKworVHVlIEF1ZyAxMSAxMjo1ODoxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogc3BhcmMubXQ6IE5ldyBmaWxlLgorCitNb24gQXVnIDEwIDE0OjM3OjA4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiB0Yy1tNjhrLmM6ICIuYWxpZ24gTiIgbWVhbnMgYWxpZ24gdG8gTi1ieXRlIGJvdW5kYXJ5ICpvbmx5KgorCWlmIFROX1NVTjM7IG90aGVyd2lzZSBhbGlnbiB0byAyKipOLWJ5dGUgYm91bmFyeS4KKworVGh1IEF1ZyAgNiAxMjoxMDozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChzX2ZpbGwpOiBtYWtlIHRoZSAuZmlsbCBzaXplIGNsYW1wZWQgZXJyb3IgYSB3YXJuIGFuZAorCWZpeCBidWcgd2hlcmUgMCdzIHdlcmUgYWx3YXlzIHBsYWNlZC4KKworCSogY29uZmlnL3RjLWg4MzAwLmM6IGlmIGEgOjggaXMgc2VlbiBhZnRlciBhbiBvcGVyYW5kLCBmaWxsIHRvcAorCXR3byBieXRlcyBvZiBhbnkgY29uc3RhbnQgd2l0aCAweGZmOgorCitXZWQgQXVnICA1IDEyOjAyOjQwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBmaXggdGhlIC5hbGlnbiB0aGluZworCXRoZSByaWdodCB3YXk7IGZvciBqdXN0IHRoZSA2OGsuIFN1biAzIC5hbGlnbiBpcyBuYnl0ZXMsIG5vdCBwdHdvLgorCitXZWQgQXVnICA1IDAxOjU0OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB0Yy1tNjhrLmMgKHRyeV9pbmRleCk6ICBFcnJvciBpZiBpbmRleCBzY2FsaW5nIHNwZWNpZmllZCBhbmQKKwlhc3NlbWJsaW5nIGZvciBhbiBvbGRlciBDUFUgdGhhbiBhIDY4MDIwLgorCitTYXQgQXVnICAxIDE5OjEwOjEzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtc3BhcmMuYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBJZiBwYy1yZWxhdGl2ZSwgdGFrZQorCWZ4X29mZnNldCBpbnRvIGFjY291bnQuCisKK0ZyaSBKdWwgMzEgMjE6NTM6MjggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcyBob3N0KTogQWNjZXB0ICJ1bHRyaXgiIHdpdGggdmVyc2lvbiBudW1iZXIuCisKKwkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQpOiBTZXBhcmF0ZSAiPS0iIHRvIGF2b2lkIGNvbmZ1c2luZworCWFuY2llbnQgb3IgYnJva2VuIGNvbXBpbGVycy4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IE1pc21hdGNoIGVycm9yIGNvdWxkIGFsc28gaW5kaWNhdGUKKwlwcm9jZXNzb3Ivb3Bjb2RlIG1pc21hdGNoLCBzbyByZXdvcmQgdGhlIGVycm9yIG1lc3NhZ2UuCisJKG1kX2Fzc2VtYmxlKTogSWYgbm8gQ1BVIGhhcyBiZWVuIHNldCAoZXZlbiBpZiBGUFUvUE1NVQorCWNoYXJhY3RlcmlzdGljcyBoYXZlIGJlZW4pLCBkZWZhdWx0IHRvIDY4MDIwLiAgRG9uJ3QgbmVlZCBleHRyYQorCXF1b3RlcyBhcm91bmQgZXJyb3Igc3RyaW5nLgorCitGcmkgSnVsIDMxIDEyOjI2OjM0IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogcmVhZC5jIChwb3RhYmxlKTogUmV2ZXJ0IHNhYydzIGluY29ycmVjdCBjaGFuZ2UgbWFkZSBKdWwgMTMuCisJQWxpZ24gcmVhbGx5IGlzIHN1cHBvc2VkIHRvIGJlIHB0d28gbm90IG5ieXRlcy4KKworTW9uIEp1bCAyMCAwMjo1MTo1OSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBfRG9fIGluY2x1ZGUgbGliaWJlcnR5LiAgKGZyb20gc2VmKQorCitGcmkgSnVsIDE3IDE1OjE1OjI4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBIYW5kbGUgIjBmIiBhbmQgIjBiIiBsYWJlbCByZWZlcmVuY2VzCisJcHJvcGVybHkuCisKK1RodSBKdWwgMTYgMDg6MjA6MTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBpZiByZWxheGluZywgZG9uJ3QgZG8gYW55dGhpbmcuCisJKiBjb25maWcvb2JqLWJvdXQuW2NoXSA6IG1haW50YWluIHRoZSBhX3JlbGF4YWJsZSBmaWxlIGhlYWRlciBpbmZvCisJKiBjb25maWcvdGMtaTk2MC5jOiBuZXcgb3B0aW9uIC1saW5rcmVsYXgKKworTW9uIEp1bCAxMyAxNDoxMTozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZXhwci5jIChleHByKTogYWxsb3cgU0VHX0JTUyBpbiBleHByZXNzaW9ucworCSogcmVhZC5jIChwb3RhYmxlKTogYWxpZ24gc2hvdWxkIGJlIG5ieXRlcywgbm90IHB0d28hCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGV4dHJhIGdsdWUgZm9yIG5ldyBic3MgYXR0cmlidXRlcworCShyZWxheF9zZWdtZW50KTogU0VHX0JTUyBpcyBvayBub3cKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXBfb3ApOiBjYW4gbm93IHBhcnNlIG1vcmUgQCggbW9kZXMKKworTW9uIEp1bCAgNiAxNzowOTozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBvYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBtYXJrIC5saXQgc2VjdGlvbnMgYXMgU1RZUF9MSVQKKworTW9uIEp1biAgMSAxNjoyMDoyMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBoYXZpbmcgc3VuMyBlbXVsYXRpb24gbW9kZSBmb3IKKwl2eHdvcmtzIGVudmlyb25tZW50LgorCisKK1R1ZSBKdW4gMzAgMjA6MjU6NTQgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKKworV2VkIEp1biAyNCAxMDo1Nzo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYXBwLmMgKHByb2Nlc3NfZXNjYXBlKTogbmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBlc2NhcGVzIHRoZSByaWdodAorCXdheSwgKGRvX3NjcnViX25leHRfY2hhcik6IHVzZSBuZXcgZnVuY3Rpb24KKwkqIGNvbmQuYyAoc19pZmRlZik6IGRvIGlmZGVmL2lmbmRlZiByaWdodAorCSogcmVhZC5jIChzX2ZpbGwpOiBtYWtlIHRoZSAsIGV4cHJlc3Npb25zIG9wdGlvbmFsIGxpa2UgdGhlIGRvYworCXNheXMKKwkqIGNvbmZpZy90Yy1oODMwMC5bY2hdOiBiZXR0ZXIgd2FybmluZ3MKKworVHVlIEp1biAgOSAwNzo1NDo1NCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogY3JlYXRlIGJzczBfZnJjaGFpblAgaW4gdGhlIHNhbWUgd2FzCisJYXMgZGF0YTBfZnJjaGFpblAKKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiB2YXJpb3VzIGNoYW5nZXMgdG8gaGFuZGxlIGRhdGEgaW4KKwl0aGUgQlNTIHNlZ21lbnQgaW4gbXVjaCB0aGUgc2FtZSB3YXMgYXMgc3R1ZmYgaW4gdGhlIERBVEEgc2VnbWVudC4KKworCSogdGMtbTY4ay5jIChtNjhraXApOiBGaXggdHlwbyBzbyB0aGF0IG9ubHkgYXJjaCdzID49NjgwMjAgZG8KKwlwY3JlbCBkYXRhIHN0dWZmLiAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiB3aGVuIHJlbGF4aW5nIGEKKwk2ODAxMCBieHggaW50byBhIGJyYSs2IGptcHh4LCBwdXQgdGhlIGJ5dGVzIG9mIHRoZSBqbXAgb3Bjb2RlIGludG8KKwl0aGUgcmlnaHQgcGxhY2UuIChzX2Jzcyk6IERvbid0IHB1dCAuYnNzIHN0dWZmIGludG8gU0VHX0RBVEEsIHB1dAorCWl0IGludG8gU0VHX0JTUworCitUaHUgSnVuICA0IDExOjU5OjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBleHByLmMoZXhwcik6IGFsbG93IFNFR19SRUdJU1RFUiBpbiBleHByZXNzaW9ucy4KKwkqIHJlYWQuYyhwc2V1ZG9fc2V0KTogcmVnaXN0ZXIgZXhwcmVzc2lvbnMgY2FuIGJlIHRoZSBzb3VyY2Ugb2YgYQorCXNldC4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX25ldyk6IE5vdyAtUiBmb3JjZXMgYWxsIGNoYW5nZXMgdG8gU0VHX0RBVEEgdG8KKwlnb3RvIFNFR19URVhUIChpZiBhLm91dCkKKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgYS5vdXQgZG9uJ3QgdXNlIHRoZSBvbGQgd2F5IGZvcgorCS1SLgorCSogY29uZmlnL29iai1hLm91dCAoc19zZWN0KTogY29tcGxhaW4gaWYgdGhlIHVzZXIgdHJpZXMgdG8gdXNlIGEKKwlzdWJzZWdtZW50IHdpdGggYSB2YWx1ZSB3aGljaCBtaWdodCBpbnRlcmZlcmUgd2l0aCBvdXQgLVIgaGFja2VyeS4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfcmVnX3BhcnNlKTogbG9va3VwIG5hbWVzIGluIHN5bWJvbCB0YWJsZQorCXJhdGhlciB0aGFuIHVzZSB1Z2x5IGlmIHRyZWUuIChpbml0X3JlZ3RhYmxlKTogaW5zZXJ0IHJlZ2lzdGVyCisJbmFtZXMgaW50byBzeW1ib2wgdGFibGUuCisKK1R1ZSBKdW4gIDIgMTY6NDc6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGtlZXAgdGhlIGZpeF90YWlsIGNsZWFuLCB3aGljaAorCWZpeGVzIGEgYnVnIGluIC1SIHdoZXJlIHJlbG9jYXRpb25zIHdlcmUgYmVpbmcgbG9zdC4KKworTW9uIEp1biAgMSAxNjoyMDoyMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBoYXZpbmcgc3VuMyBlbXVsYXRpb24gbW9kZSBmb3IKKwl2eHdvcmtzIGVudmlyb25tZW50LgorCitTdW4gTWF5IDMxIDA1OjMzOjAwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG02ODB4MCBhcyBhbiBtNjhrCisKK1RodSBNYXkgMjggMTE6MjI6MDIgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBzcGFyY2xpdGUgYXMgYSBzcGFyYyB2YXJpYW50LgorCisJKiB0Yy1zcGFyYy5jOiBVc2UgbmV3IEFSQ0hJVEVDVFVSRVNfQ09ORkxJQ1RfUCBtYWNyby4gIE1lbnRpb24gbmV3CisJLUFzcGFyY2xpdGUgZmxhZy4KKworVHVlIE1heSAyNiAxNjo0Nzo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWEyOWsuYzogbGludAorCSogbGlzdGluZy5jLCBleHByLmM6IHBhdGNoZXMgZnJvbSBBbmRyZXcgU21pdGgKKworVGh1IE1heSAxNCAxNzoyMjo0OCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogdXNlIG00IHJhdGhlciB0aGFuIGdtNC4KKworTW9uIE1heSAgNCAxODo1NjoxOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogb2JqLWNvZmZiZmQuYzogdXNlIGlzIGEgc3lub255bSBmb3Igc2VjdGlvbiwgKGRvX3JlbG9jc19mb3IpOgorCWNhbGMgdGhlIGJhc2Ugb2YgcmVsb2NzIGNvcnJlY3RseS4KKwkqIHRjLWEyOWsuYyAocGFyc2Vfb3BlcmFuZCk6IGFsbG93IGV4cHJlc3Npb25zIHRvIGJlIGluIGFueSBzZWN0aW9uLgorCitNb24gQXByIDI3IDEzOjEzOjMxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBhcy5jLCB3cml0ZS5jOiB1c2UgLUsgcmF0aGVyIHRoYW4gLWsgZm9yIHRoZSBicm9rZW4gd29yZCB3YXJuaW5nCisJICBvcHRpb24uCisKK1R1ZSBBcHIgMjEgMTM6MzU6MzAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBkbyBub3QgcHJpbnQgcmVjdXJzaW9uIGxpbmVzLgorCitXZWQgQXByIDE1IDIxOjE5OjMxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHRoZSB0b29sZGlyIGNvcHkgb2YgZ2FzIGdvZXMgZGlyZWN0bHkgaW4gdG9vbGRpci4KKworVHVlIEFwciAxNCAxNDo1MDoyMiAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBGb3IgYi5vdXQgZm9ybWF0LCByb3VuZCB1cCBzZWN0aW9uCisJc3RhcnQgYWRkcmVzc2VzIHRvIG1hdGNoIHJlcXVpcmVkIGFsaWdubWVudC4KKworVGh1IEFwciAgOSAwNTo0NToyOSAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIGludG8gJCh0b29sZGlyKS9iaW4sIHNpbmNlIHRoYXQncworCXdoZXJlIGdjYyBsb29rcyBmb3IgaXQuCisKK1R1ZSBBcHIgIDcgMTU6MTI6MTUgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlZCBzb21lIGxpbmVzIHRvIGJlIGxlc3MgY29uZnVzaW5nIGZvciBzb21lCisJbWFrZXMuCisKKwkqIGlucHV0LWZpbGUuYzogIENvbmRpdGlvbmFsaXplIG9uIF9JT0ZCRiwgbm90IFZNUy4KKworCSogcmVhZC5jLCB3cml0ZS5jOiAgQ2hhbmdlIGEgc2VyaWVzIG9mIGlmZGVmL2VsaWYgdG8KKwlpZmRlZi9lbHNlL2lmZGVmIGV0Yy4KKworRnJpIE1hciAyNyAxMjoyMToxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogc3ltYm9scy5jIChmYl9sYWJlbF9pbml0KTogZml4IHNpemVvZiB0byBtZW1zZXQuCisKK0ZyaSBNYXIgMTMgMTU6NDU6NDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIHRoZSBtYW4gcGFnZS4KKworCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBNQUtFSU5GTyBleHBsaWNpdGx5IG9uIGluZm8uCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogdXNlICQoTUFLRUlORk8pIG5vdCBtYWtlaW5mby4KKworRnJpIE1hciAxMyAwODowMzowMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZmxvbnVtLWNvbnN0LmM6IHJlbmFtZWQgZmxvbnVtLWtvbnN0LmMgdG8gc3RvcCBkb3MgbmFtZQorCWNvbmZsaWN0LgorCitUaHUgTWFyIDEyIDA0OjQyOjM4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiB0Yy1tNjhrLmgsIHRlLXN1bjMuaDogbW92ZWQgTE9DQUxfTEFCRUxTX0ZCIGRlZmluaXRpb24gZnJvbQorCSAgdGMtbTY4ay5oIHRvIHRlLXN1bjMuaC4KKworV2VkIE1hciAxMSAyMzozMjo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiB2eHdvcmtzNjggZ2V0cyB0ZS1zdW4zLmguCisKKwkqIGV4cHIuYzogcmVtb3ZlIGxpbWl0YXRpb24gdGhhdCBsb2NhbF9sYWJlbHNfZG9sbGFyIG9yCisJICBsb2NhbF9sYWJlbHNfZmIgbXVzdCBiZSA8IDEwLgorCisJKiBzeW1ib2xzLmM6IHJlbW92ZSBsb2NhbF9sYWJlbHNfZG9sbGFyLCByZXBsYWNlIHdpdGggYSBmdW5jdGlvbgorCSAgaW50ZXJmYWNlIGZvciBhIHNwYXJzZSBhcnJheS4gIEFsbCB1c2VycyBhZGp1c3RlZC4KKworCSogdGUtc3VuMy5oOiBhZGQgTE9DQUxfTEFCRUxTX0RPTExBUi4KKworU2F0IE1hciAgNyAwMDowNjoyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogY29tbWVudGVkIG91dCBsaW5lIGZvciBidWlsZGluZyBhcy1hbGwudGV4aW5mby4KKwkgIFRoaXMgaXMgdGVtcG9yYXJ5LgorCisJKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLWFsbC50ZXhpbmZvOiBhZGRlZCBtZW51IGl0ZW0gaG9va3MuCisKK0ZyaSBNYXIgIDYgMjE6NTc6MTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCisKK1R1ZSBNYXIgIDMgMTU6NDU6NTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCisKK1N1biBNYXIgIDEgMDQ6NDM6MTkgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQorCisJKiB3cml0ZS57YyxofSAoZml4X25ldyk6IE1ha2UgdGhlc2UgZGVjbGFyYXRpb25zIGNvbnNpc3RlbnQuCisKK1NhdCBGZWIgMjkgMTM6NTk6MTAgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc3RyZXJyb3Iubyk6IEFkZCBydWxlIHNvIHRoYXQgYnJva2VuIFN1biBtYWtlIGNhbgorCXdvcmsgaW4gc3ViZGlycy4KKworV2VkIEZlYiAyNiAxOToyNjoyOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVhZC5jLCBvYmotY29mZmJmZC5jIDogZml4IGg4MzAwIHNwZWNpZmljIGJpdCByb3QKKworCSogZXhwci5jIChvcGVyYW5kKTogaWYgY2FuJ3Qgd29yayBvdXQgd2hhdCBzb3J0IG9mIG9wZXJhbmQgaXQgaXMsCisJdGhlbiBsb29rIHRocm91Z2ggRkxUX0NIQVJTIGZvciBhIGhpbnQuCisKK1dlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCisJICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKKwkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgorCisJKiBkb2MvTWFrZWZpbGUuaW4sIGRvYy9jb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCisJICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKKwkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgorCitUdWUgRmViIDI1IDE0OjE3OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBleHByLmM6IElmIGFuIGV4cHJlc3Npb24gaXMgc2luZ2xlIGNvbW1hLCB0aGVuIHJldHVybiB3aXRoCisJU0VHX0FCU0VOVCByYXRoZXIgdGhhbiBhbiBlcnJvciAtIHNpbmNlIHRoZSBzcGFyYyBmcm9udCBlbmQgZG9lcworCXJlYWxseSBzdHJhbmdlIHRoaW5ncyB3aXRoIHRoaW5ncyBsaWtlIGZiZ2UsYQorCisJKiBhcy5oOiBpbmNsdWRlIGJmZC5oIGlmIHVzaW5nIG1hbnkgc2VjdGlvbnMKKwkqIGV4cHIuYzogTE9DQUxfTEFCRUxTX0ZCIGhhZCBiZWVuIGNoYW5nZWQgdG8gbG93ZXIgY2FzZSAtIHNvCisJbG9jYWwgbGFiZWxzIGRpZG4ndCB3b3JrLgorCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IGRvbid0IGNvcmUgZHVtcCB3aGVuIHRoZXJlJ3Mgbm8KKwlzeW1ib2wgdGhlcmUuCisJKiB3cml0ZS5jLCB3cml0ZS5oOiBjYWxsIGZpeF9uZXcgd2l0aCB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3Mgb24KKwl0aGUgSDguCisJKiBjb25maWcvdGMtaDgzMDAuW2NoXSA6IGZpeCBidWdzIHJlcG9ydGVkIGJ5IEhNU0ksIGFuZCBtYWtlCisJZXJyb3JzIG5pY2VzCisKK1NhdCBGZWIgMjIgMTI6MjY6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGFwcC5jOiBNUkkgY29tcGF0aWJpbGl0eSAtIGFsbG93IHNpbmdsZSBxdW90ZSB0byBzdGFydCBhIHN0cmluZy4KKwkqIGFzLmM6IGZpeCB0eXBvIHJlY2VudGx5IGludHJvZHVjZWQuCisJKiBhcy5oIDogRG9uJ3QgaW5jbHVkZSBhb3V0L3JlbG9jLmggLSBpdCdzIG5vdCByaWdodCBmb3IgQ09GRiEKKwkqIGV4cHIuYzogTXVjaCByZXdyaXRpbmcsIHRvIGFjY29tb2RhdGUgTVJJIHN5bnRheCBmb3IKKwlleHByZXNzaW9ucy4gQWxzbyBlYXNpZXIgdG8gcmVhZCBub3cuCisJKiBsaXN0aW5nLmM6IFB1dCBiYWNrIGRlZnVucworCSogcmVhZC5jOiBtb2RpZmllZCB0byBhY2NlcHQgTVJJIHN5bnRheCwgcHV0IGJhY2sgbGlzdGluZyBwc2V1ZG8KKwlvcHMgc28gdGhhdCBhbiBhc3NlbWJsZXIgYnVpbHQgd2l0aCBOT19MSVNUSU5HIGlnbm9yZXMgbGlzdCBvcHMKKwlyYXRoZXIgdGhhbiBwdWtlcy4KKwkqIHdyaXRlLmMsIHdyaXRlLmg6IGZpeHMgLSBvbmx5IGtlZXAgYSByZWxvYyB0eXBlIGluIGEgZml4IGlmIHRoZSB0YXJnZXQKKwltYWNoaW5lIGlzIGEgU1BBUkMgb3IgYSAyOUsuCisJKiBjb25maWcvb2JqLWFvdXQuYzogYWRkZWQgc19zZWN0IHBzZXVkbyBvcAorCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IGxpbnRzLCBzZXQgdGhlIGZpbGVoZHIgZmxhZ3MgcmlnaHQgYW5kCisJZmlsbCBpbiB0aGUgdGltZXN0YW1wLgorCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IFNpbmNlIHdlIGRvbid0IGluY2x1ZGUgYW91dC9yZWxvYy5oCisJYW55bW9yZSwgZGVmaW5lIGFsbCB0aGUgcmVsb2NzIHdoaWNoIHRoZSB0Yy08eD4gYml0IHdpbGwgdXNlIHNvIHdlCisJY2FuIHRyYW5zbGF0ZSBmcm9tIHRoZW0gdG8gdGhlIGNvZmYgdHlwZXMuCisJKiBjb25maWcvdGMtYTI5ay5jOiByZWxvY190eXBlIGlzbid0IGFuZSBlbnVtIGFueSBtb3JlCisJKiBjb25maWcvdGMtbTY4ay5jOiBBZGRlZCBOT19SRUxPQyBkZWZpbml0aW9uLgorCitGcmkgRmViIDIxIDA2OjIxOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHB1dCBoZWFkZXIgZmlsZXMgYmVmb3JlIEMgc291cmNlIGZvciBUQUdTOyByZW1vdmUKKwkgIHJlZmVyZW5jZXMgdG8gbm9uLWV4aXN0ZW50IHN5c2NhbGxzLmguCisKKwkqIHJlYWQuYywgd3JpdGUuYyBzdWJzZWdzLmM6IGJhY2sgb3V0IHRoZSAuYnNzIGNoYW5nZXMuCisKKwkqIG9iai1hb3V0LmM6IGRvIG5vdCBpbmNsdWRlIHN0YWIuZ251LmggaWYgTk9fTElTVElORy4KKworCSogdGMtaTg2MC5jLCBhLm91dC5nbnUuaDogbW92ZSBpODYwIHJlbG9jcyB0byBhIHByb3BlciBwbGFjZS4KKworCSogYS5vdXQuaDogcmVtb3ZlZC4KKworRnJpIEZlYiAyMSAwMTowODo0OCAxOTkyICBNaW5oIFRyYW4tTGUgKFRSQU5MRUBJTlRFTExJQ09SUC5DT00pCisKKwkqIHN5bWJvbHMuYyAobG9jYWxfbGFiZWxfbmFtZSk6IHN5bWJvbHMgbm93IHN0YXJ0IHdpdGggXkEuCisKKwkqIHJlYWQuYywgc3Vic2Vncy5jLCB3cml0ZS5jIG9iai1jb2ZmLmM6IGFkZGVkIGhhbmRsaW5nIG9mCisJICBgLmJzc2AgcHNldWRvIG9wIGZvciB1bml0aWFsaXplZCBkYXRhLiBUaGUgbmV3IGdjYyAoMS4zNy45eCkKKwkgIGdlbmVyYXRlIHRoZXNlIHNlY3Rpb25zLiAgLmFsaWduOiB3aWxsIHVzZSBOT1BfT1BDT0RFIG9yIDAKKwkgIGZvciBwYWRkaW5nLiBUaGlzIGlzIGp1c3QgZm9yIGJlaW5nIG5pY2UgdG8gdGhlCisJICBkaXNhc3NlbWJsZXIuCisKKwkqIGV4cHIuYyAob3BlcmFuZCk6IGNoYW5nZWQgdG8gZ2VuZXJhdGUgbG9jYWwgbGFiZWwgIlwwMDFMMCIKKwkgIHN0YXJ0aW5nIHdpdGggYSBeQSBzbyB0aGF0IGl0IGlzIHJlY29nbml6ZWQgYXMgYSBsb2NhbCBsYWJlbC4KKworCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogemVybyBic3NfZml4X3Jvb3QsIHRvby4KKworCSogdGMtaTM4Ni5jOiB0Yy1pMzg2LmM6IGFkZGVkIGhhbmRsaW5nIG9mIHRoZSBmb2xsb3dpbmcgb3Bjb2RlczoKKwkgIGkvbyBvcGNvZGVzIC0gaW5iLCBpbncsIG91dGIgYW5kIG91dHcuICBzdHJpbmcgbWFuaXB1bGF0aW9uIHdpdGgKKwkgIGF0dCBzeW50YXggLSBzY21wLCBzbG9kLCBzbW92LCBzc2NhLCBzc3RvLgorCisJKiBvYmotY29mZi5jOiAoZm9yIGFpeDM4NikgTW92ZWQgdGhlIHN5bWJvbHMgLnRleHQsIC5kYXRhIGFuZCAuYnNzCisJICB0byBqdXN0IGFmdGVyIC5maWxlIC4KKworCSAgSW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIHdoZXJlIGl0IHRyaWVzIHRvIHB1dCB0aGUgZXh0ZXJuYWwKKwkgIHN5bWJvbHMgYXBhcnQsIHdpdGggdGhlIGNvbmRpdGlvbjoKKwkgICAgKCFTX0lTX0RFRklORUQoc3ltYm9sUCkgJiYKKwkgICAgICFTX0lTX0RFQlVHKHN5bWJvbFApICYmCisJICAgICAhU0ZfR0VUX1NUQVRJQ1Moc3ltYm9sUCkpCisJICBpdCB3YXMgbW92aW5nIHRvbyBtYW55IHN5bWJvbHMgb3V0LiBTbyBJIHN3aXRjaCBpdCBiYWNrIHRvIHRoZQorCSAgY29uZGl0aW9uOgorCSAgICAoU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSA9PSBDX0VYVCAmJiAhU0ZfR0VUX0ZVTkNUSU9OKHN5bWJvbFApKQorCisJICBJbiBvYmpfZW1pdF9yZWxvY2F0aW9ucygpIGFkZGVkIHRoZSBjb25kaXRpb25hbCBvbiBLRUVQX1JFTE9DX0lORk8KKwkgIHNvIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBGX1JFTEZMRyB3aGljaCBtYWtlIHRoZSBsaW5rZXIgY29tcGxhaW4KKwkgIHRoYXQgc29tZWJvZHkgaGFzIHN0cmlwcGVkIHRoZSByZWxvY2F0aW9uIGluZm8uCisKKwkgIEFsc28sIHRoZSBBSVggbGQgcHJvZ3JhbSByZXF1aXJlIHRoYXQgdGhlIHJlbG9jYXRpb24gdGFibGUKKwkgIGlzIHNvcnRlZCBieSByX3ZhZGRyIGxpa2UgdGhlIHN0YW5kYXJkIEFUVCBhc3NlbWJsZXIgZG9lcy4KKworCSAgW2hlIGFsc28gY2hhbmdlZCB0aGUgc2l6ZW9mKHN0cnVjdCAuLi4pJ3MgaW50byB0aGUgY29mZgorCSAgc3R5bGUgRk9PU1ogbWFjcm9zLiAgSSdtIG5vdCBzdXJlIHRoaXMgaXMgcmlnaHQsIGJ1dCBJIGNhbid0CisJICByZW1lbWJlciB3aHkuICB4b3hvcmljaC5dCisKK0ZyaSBGZWIgMjEgMDE6MDg6NDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIGRvYzogdXNlIHRoZSBkb2MuICBCdWlsZCBpdCwgaW5zdGFsbAorCSAgaXQsIGNsZWFuIGl0LCBldGMuCisKK1R1ZSBGZWIgMTggMDI6MjE6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCisKKwkqIHJlYWQuYzogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzIG9ubHkuCisKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIHRoZSBuZXcgYXRvZi1uczMyLmMgZm9yIG5zMzJrLgorCisJKiB3cml0ZS5jOiBjb21tZW50IGNoYW5nZSBvbmx5LgorCisJKiB0Yy1tODhrLltoY106IHB1bGxlZCBpbiBmcm9tIGhhY2sncyB1bmZpbmlzaGVkIHdvcmsuICBUaGVzZQorCSAgYXJlbid0IHlldCBpbnRlZ3JhdGVkLgorCisJKiB0Yy1pODYwLltoY106IGJsZXcgb2ZmIHRoZSBkdXN0LiAgU29tZXRoaW5nIG11c3Qgc3RpbGwgYmUgZG9uZQorCSAgYWJvdXQgY29uZmxpY3RpbmcgcmVsb2NhdGlvbiB0eXBlcy4KKworCSogdGMtbnMzMmsuYzogUmVwbGFjZWQgcHJldmlvdXMgdGNfYW91dF9maXhfdG9fY2hhcnMgc3R1YiB3aXRoIHRoZQorCSAgcmVhbCB0aGluZy4KKworCSogdGMtaTk2MC5jLCB0Yy1zcGFyYy5jOiB3aGl0ZSBzcGFjZSBhbmQgY29tbWVudHMgb25seS4KKworCSogdGMtYTI5ay5oOiBkZWxldGUgZHVwbGljYXRlIG1hY3JvIGRlZmluaXRpb24uCisKKwkqIG5ldyBmaWxlIGF0b2YtbnMzMmsuYyBjb3BpZWQgZnJvbSBoYWNrJ3MgbGFzdCB1bnJlbGVhc2VkIGdhcy4KKworTW9uIEZlYiAxNyAwNzo1MTowNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW5zMzJrLmM6IGFjdHVhbGx5IG1ha2UgdGNfYW91dF9maXhfdG9fY2hhcnMgd29yaworCSAgcmF0aGVyIHRoYW4gYWJvcnQuCisKKwkqIG5lYXJseSBldmVyeXRoaW5nLiAgZmx1c2ggQ2hhbmdlTG9nLCBwYWNrYWdlIGFzIGdhcy0xLjkyLjEuCisJICBDaGFuZ2VMb2cncyBwcmlvciB0byB0aGlzIGFyZSBza2V0Y2h5IGF0IGJlc3QuICBJIGhhdmUgbG9ncy4KKwkgIFRoZXkganVzdCBhcmVuJ3QgQ2hhbmdlTG9ncy4KZGlmZiAtLWdpdCBhL2dhcy9DaGFuZ2VMb2ctOTY5NyBiL2dhcy9DaGFuZ2VMb2ctOTY5NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDJhZjgyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL0NoYW5nZUxvZy05Njk3CkBAIC0wLDAgKzEsNTk2MCBAQAorV2VkIERlYyAzMSAxMjoyOTo0NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogQ29ycmVjdCBicmFuY2ggcmFuZ2VzLgorCitNb24gRGVjIDIyIDEzOjA2OjA1IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgorCisgICAgICAgICogY29uZmlndXJlLmluIChpMzg2Ki1nbzMyLXJ0ZW1zKik6IEZpeCB0byBiZSB0aGUgc2FtZSBhcworCWlbMzQ1Nl04Ni1nbzMyLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitNb24gRGVjIDIyIDEyOjU0OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBUaGUgNDY1MCBkb2Vzbid0IHBlcm1pdCBNX0xEQzFfQUIsCisJTV9TREMxX0FCLCBNX0xfRE9CLCBNX0xfREFCLCBNX1NfREFCLCBvciBNX1NfRE9CLgorCShtaXBzX2lwKTogQWx3YXlzIGNoZWNrIGZvciBGUF9ELCBub3QganVzdCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQKKwlhcmUgbm90IHBhcnQgb2YgdGhlIHJlZ3VsYXIgSVNBLgorCitUaHUgRGVjIDE4IDE2OjQ5OjI4IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKGJ1aWxkX2luc24pOiBNYWtlIGBudW1iZXInIGEgbG9uZyBmb3IgNjQtYml0IGhvc3RzLgorCitUaHUgRGVjIDE4IDE2OjQyOjU3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChjcHVfdHlwZXMpOiAyMTE2NHBjL3BjYTU2IGRvZXMgbm90IGhhdmUgQ0lYLgorCitXZWQgRGVjIDE3IDIxOjIzOjA3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50IDMyYml0IGJpZ251bSk6IE1hc2sgb2ZmIGJpdHMgb3V0c2lkZQorCXRoZSByYW5nZSB3ZSBjYXJlIGFib3V0LgorCitXZWQgRGVjIDE3IDE1OjI5OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9zaG9ydG9wdHMpOiBBZGQgJ24nIGFuZCAnTicgb3B0aW9ucy4KKwkoZXhlY190eXBlX2VudW0pOiBFbnVtZXJhdGlvbiBnaXZpbmcgYWxsIG9mIHRoZSBleGVjIHR5cGVzLgorCSh3YXJuX25vcHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlIHRvIGdpdmUgbm9wIHdhcm5pbmcgbGV2ZWwuCisJKHtjdXIscHJldn1fbXVsMzJfcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyCisJdGhlIGN1cnJlbnQvcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSAzMi1iaXQgbXVsdGlwbHkuCisJKE9wdGltaXppbmcpOiBNYWtlIHN0YXRpYy4KKwkoTk9QezIsX0xFRlQsX1JJR0hUfSk6IE1hY3JvcyBmb3Igd29yZCBvZiBub3BzIGFuZCBsZWZ0L3JpZ2h0CisJbm9wcy4KKwkoZDMwdl9pbnNlcnRfb3BlcmFuZCk6IERlbGV0ZSBkZWNsYXJhdGlvbiBvZiB1bnVzZWQgZnVuY3Rpb24uCisJKHdyaXRlXzJfc2hvcnQpOiBNYWtlIGV4ZWNfdHlwZSBhcmd1bWVudCBlbnVtLCBub3QgaW50LgorCShwYXJhbGxlbF9vayk6IERpdHRvLgorCShjaGVja19yYW5nZSk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUocykuCisJKGJ1aWxkX2luc24pOiBEaXR0by4KKwkoZmluZF9mb3JtYXQpOiBEaXR0by4KKwkobWRfYXBwbHlfZml4Myk6IERpdHRvLgorCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgLW4gYW5kIC1OLgorCShtZF9wYXJzZV9vcHRpb24pOiBQYXJzZSAtbiBhbmQgLU4uCisJKHdyaXRlXzFfc2hvcnQpOiBJZiAtbiwgd2FybiBhYm91dCBhZGRpbmcgYSBub3AuICBVc2UKKwlOT1Bfe0xFRlQsUklHSFR9LgorCSh3cml0ZV8yX3Nob3J0KTogVXNlIGVudW1lcmF0aW9uIHZhbHVlcyBpbnN0ZWFkIG9mIGhhcmQgY29kZWQKKwlpbnRlZ2Vycy4gIFJlc2V0IGV4ZWNfdHlwZSBmb3IgZGVmYXVsdCBvcGVyYXRpb25zLiAgRm9yIGV4cGxpY2l0CisJcGFyYWxsZWwgb3BlcmF0aW9ucywgY2FsbCBwYXJhbGxlbF9vayB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcworCW9rLiAgSWYgd3JpdGluZyBvdXQgYSBwYXJhbGxlbCBvcGVyYXRpb24sIGFuZCB0aGUgcHJldmlvdXMKKwlpbnN0cnVjdGlvbiB3YXMgYSAzMi1iaXQgbXVsdGlwbHksIGluZGljYXRlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KKwlpcy4KKwkocGFyYWxsZWxfb2spOiBBbGxvdyBhZGQvdHggLi4uIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aAorCWFub3RoZXIgYWRkL3R4IC4uLiBhc3N1bWluZyB0aGUgZ3ByIHJlZ2lzdGVycyBkb24ndCBvdmVybGFwLgorCShtZF9hc3NlbWJsZSk6IFVzZSBleGVjIHR5cGUgZW51bWVyYXRpb24gdmFsdWVzLCBub3QgaGFyZCBjb2RlZAorCWludHMuICBDaGVjayBmb3IgbG9hZHMgb3IgMTYtYml0IG11bHRpcGxpZXMgZm9sbG93aW5nIGluIHRoZSBuZXh0CisJY3ljbGUgYWZ0ZXIgYSAzMi1iaXQgbXVsdGlwbHkuICBBZGQgbm9wcyBpZiB0aGF0IGlzIHRoZSBjYXNlLgorCShkb19hc3NlbWJsZSk6IENvcHkgcHJldl9tdWwzMl9wIHRvIGN1cl9tdWwzMl9wLCBhbmQgc2V0CisJY3VyX211bDMyX3AgaWYgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBhIDMyLWJpdCBtdWx0aXBseS4KKwkoZmluZF9mb3JtYXQpOiBDaGFuZ2Ugc3BhY2luZyBhbmQgbGF5b3V0LgorCitUdWUgRGVjIDE2IDE2OjU1OjQ1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdGljODAuYyAodGljODBfcmVsYXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtZF9sb25nb3B0cyk6IEFkZCBuZXcgT1BUSU9OX1JFTEFYIGFuZCBPUFRJT05fTk9fUkVMQVggb3B0aW9ucy4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyByZWxheCBvcHRpb25zLgorCShtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgbmV3IHJlbGF4IG9wdGlvbnMuCisJKGZpbmRfb3Bjb2RlKTogRG9uJ3QgdXNlIHNob3J0IGZvcm1zIG9mIFBDIHJlbGF0aXZlIGJyYW5jaGVzIGlmCisJdGljODBfcmVsYXggaXMgc2V0LgorCitUdWUgRGVjIDE2IDE1OjI2OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IFJlbW92ZSBub24tcmVnaXN0ZXIgYml0cyBmcm9tCisJdXNlZC9zZXQgZmxhZyBmaWVsZHMuICBNYWtlIGZsYWcgdmFycyB1bnNpZ25lZCBsb25nLiAgVXNlCisJRkxBR19BezAsMX0gZm9yIGFjY3VtdWxhdG9ycy4gIEFsbG93IGFueSAyIGluc25zIHRvIGJlIGRvbmUgaW4KKwlwYXJhbGxlbCBpZiB0aGV5IHVzZSB0aGUgc2FtZSBjb25kaXRpb25hbCBmbGFnIHdpdGggcmV2ZXJzZWQKKwltZWFuaW5nLiAgQWxsb3cgMiBhZGQvc3ViIGluc25zIHRoYXQgc2V0IHRoZSBjYXJyeSBvciBvdmVyZmxvdworCWZsYWdzIGJ1dCBkbyBub3QgcXVlcnkgdGhlbSB0byBiZSBkb25lIGluIHBhcmFsbGVsLiAgRG9uJ3QgYWxsb3cgMgorCXdvcmQgc3RvcmUgb3BlcmF0aW9ucyB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGggQUREcHBwIG9yCisJU1VCcHBwLiAgRG9uJ3QgYWxsb3cgbG9hZHMgdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoIDE2IGJpdAorCW11bHRpcGxpZXMuCisKK1R1ZSBEZWMgMTYgMDk6MjA6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jOiBQcmV2ZW50IHVzZSBvZiBpbnRlcndvcmtpbmcgc3VwcG9ydCBmb3IKKwlub24tQ09GRiB0YXJnZXRzLgorCitNb24gRGVjIDE1IDE1OjIwOjMyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGRvYy9hbGwudGV4aTogQWRkIE0zMlIgY3B1LgorCisJKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gb2YgbTMyciBwcm9jZXNzb3IuCisKKwkqIGRvYy9jLW0zMnIudGV4aTogTmV3IGZpbGUsIGRvY3VtZW50aW5nIG0zMnIgc3BlY2lmaWMgZmVhdHVyZXMuICAKKworCitNb24gRGVjIDE1IDEwOjMyOjI4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IENvcnJlY3RseSBpbnNlcnQgJ1AnIG9wZXJhbmRzIGludG8KKwl0aGUgaW5zdHJ1Y3Rpb24uCisKK0ZyaSBEZWMgMTIgMTE6NDQ6MjAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogSGFuZGxlIGluc3RydWN0aW9ucyB0aGF0IGhhdmUKKwlsb25nICgzMiBiaXQpIFBDIHJlbGF0aXZlIG9mZnNldHMuICBGaXggcGxhY2VzIHRoYXQgcHJldmlvdXNseQorCW1pc3VzZWQgUl9NUFBDUiBmb3IgMTUgYml0IG9mZnNldHMgdG8gdXNlIHRoZSBuZXcgUl9NUFBDUjE1VyB0eXBlLgorCShtZF9hcHBseV9maXgpOiBBZGQgY2FzZSB0byBoYW5kbGUgbG9uZyBQQyByZWxhdGl2ZSBvZmZzZXRzLgorCitGcmkgRGVjIDEyIDEwOjM1OjAxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGRvYy9jLWFybS50ZXhpIChBUk0gT3B0aW9ucyk6IERvY3VtZW50IHN1cHBvcnQgZm9yIG5ldyBBUk0KKwlwcm9jZXNzb3IgbmFtZXMuCisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIHN1cHBvcnQgZm9yIG5ldyBBUk0KKwlwcm9jZXNzb3IgbmFtZXMuCisKK1RodSBEZWMgMTEgMTc6NDY6NTAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IERvbid0IG92ZXJ3cml0ZSBvcGNvZGUgdGFibGUgZGF0YS4KKwkoaW5zb3AsIG02OGtfaXApOiBNYWtlIGBvcGNvZGUnIGNvbnN0IHNvIGl0IGRvZXNuJ3QgaGFwcGVuIGFnYWluLgorCitGcmkgRGVjICA1IDExOjIzOjU5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRml4IEJGRF9SRUxPQ18zMiBhZ2FpbnN0IGEKKwlzeW1ib2wgKyBvZmZzZXQuCisKKwkqIGNvbmZpZy90Yy12ODUwLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogVXNlCisJU0hUX1Y4NTBfe1N8VHxafUNPTU1PTiB0byBtYXJrIHNwZWNpYWwgY29tbW9uIHNlY3Rpb25zLgorCitUdWUgRGVjICAyIDE3OjA1OjEzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmM6IEJyb3VnaHQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBicmFuY2guCisKK01vbiBEZWMgIDEgMjA6MjQ6MTggMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWcvdGMtc2guYyAoU1dJVENIX1RBQkxFX0NPTlMpOiBIYW5kbGUgKGZpeCktPmZ4X3NpemUgPT0gMS4KKwkoU1dJVENIX1RBQkxFKTogSGFuZGxlIEJGRF9SRUxPQ184LgorCShtZF9hcHBseV9maXgpOiAjaWZuZGVmIEJGRF9BU1NFTUJMRVIgY29kZTogSGFuZGxlIGZpeFAtPmZ4X3NpemUgPT0gMS4KKwkoY29mZl9yZWxvY19tYXApOiBBZGQgQkZEX1JFTE9DXzhfUENSRUwgZW50cnkuCisJKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogU1dJVENIX1RBQkxFIGNhc2U6IEhhbmRsZSBCRkRfUkVMT0NfOC4KKworU2F0IE5vdiAyMiAxNjoxOToyMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiB0Yy1hbHBoYS5jIChyYW5nZV9zaWduZWRfMTYsIHJhbmdlX3NpZ25lZF8zMik6IFdvcmsgYXJvdW5kIGFuCisJYXBwYXJlbnQgYnVnIGluIGdjYydzIGxvbmcgbG9uZyBzdXBwb3J0IGNyb3NzaW5nIGZyb20geDg2LgorCitTYXQgTm92IDIyIDE0OjI2OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYzogQnJvdWdodCB1cCB0byBkYXRlIHdpdGggbGF0ZXN0IGNoYW5nZXMgb24gYXJtCisJYnJhbmNoLiAKKworU2F0IE5vdiAyMiAxNTo1MDowOSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogY29uZmlnLWdhcy5jb206IEdldCB2ZXJzaW9uIGluZm8gZnJvbSBjb25maWd1cmUuaW4uCisKKwkqIG1ha2VmaWxlLnZtczogaW5jbHVkZSBkZXBlbmQub2JqIGluIE9CSlMuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX3NlY3Rpb24pOiBSZW1vdmUgIi5sY29tbSIgaGFuZGxpbmcuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9iYXNlcmVnX2Nsb2JiZXJlZCk6IFJlbW92ZSB2YXJpYWJsZSBhbmQKKwlhbGwgY29ycmVzcG9uZGluZyBjb2RlLgorCitUaHUgTm92IDIwIDE1OjA2OjA4IDE5OTcgIFJpY2hhcmQgRWFybnNoYXcgPHJlYXJuc2hhQGFybS5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uaCAoVEFSR0VUX0ZPUk1BVCBmb3IgZ2VuZXJpYyBhLm91dCB0YXJnZXRzKTogQWxsb3cKKwlydW4tdGltZSBlbmRpYW4gc2VsZWN0aW9uLgorCitXZWQgTm92IDE5IDE3OjQ0OjQyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKyAgICAgICAgKiB0Yy1zaC5jIChwYXJzZV9yZWcpOiBQcm9wZXJseSBxdW90ZSBmb3IgZnY0LgorCitXZWQgTm92IDE5IDIzOjQ2OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEFkZCBtaXNzaW5nIGJyZWFrcyBpbiBjYXNlIG9uCisJc3ltYm9sIHZhbHVlIG9wZXJhdG9yLgorCitUdWUgTm92IDE4IDE4OjQ1OjE0IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rLCBmaW5kX29wY29kZSk6IAorCVNwbGl0IE9QRVJBTkRfRkxBRyBpbnRvIE9QRVJBTkRfRkZMQUcgYW5kIE9QRVJBTkRfQ0ZMQUcuCisKK1N1biBOb3YgMTYgMTA6MDU6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ2FzdCBzZWNvbmQgYXJnIG9mCisJbWRfYXBwbHlfZml4MyBjYWxsIHRvIHR5cGUgInZhbHVlVCAqIi4KKworVGh1IE5vdiAxMyAxMzo1MzoxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IE1ha2UgRnJlZUJTRCBhbiBhb3V0IC8gaTM4NmJzZAorIAl2YXJpYW50LgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKK1RodSBOb3YgMTMgMTE6MDc6MTQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogVXNlIHRoZSBtZW1iZXJzaGlwIGZpZWxkCisJZm9yIElOU05fTUFDUk8ncy4KKwkobWlwc19pcCk6IFNhbWUuCisKK1RodSBOb3YgMTMgMDI6MDQ6NTUgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBGb3IgT1BDT0RFX0ZBS0UsIGFkZCBjaGVjayBmb3IKKwlmaXJzdCBhcmd1bWVudCBpZiBpdCdzIHN1cHBvc2VkIHRvIGJlIGEgcmVnaXN0ZXIuCisKK1R1ZSBOb3YgMTEgMTk6MjU6MDUgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogIElmIGQxMHYsIHJlLWluc2VydCBhIHNwYWNlIGJlZm9yZQorCWEgJyMnIHdoZW4gaW4gc3RhdGUgMTAuCisKK1R1ZSBOb3YgMTEgMTM6MzM6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaDgzMDAuYzogSW5jbHVkZSAic3Vic2Vncy5oIi4KKwkodGNfcmVsb2NfbWFuZ2xlKTogSGFuZGxlIHJlZmVyZW5jZXMgdG8gc3ltYm9scyB3aGljaCBhcmUgbm90CisJYmVpbmcgb3V0cHV0LCBzbyB0aGF0IHJlZmVyZW5jZXMgdG8gYC4nIHdvcmsuCisKK01vbiBOb3YgMTAgMTM6NDM6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2FsbCBhZGRfZml4IHdoZW4gbmVlZGVkIGZvciAnXycKKwljYXNlLgorCisJKiBtYWNyby5jIChzdWJfYWN0dWFsKTogSWYgd2UgZG9uJ3QgZmluZCBhIHBhcmFtZXRlciBmb3IgYW4gJiwKKwlqdXN0IHN1YnN0aXR1dGUgJi4KKworRnJpIE5vdiAgNyAyMToyOTozMiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGRlZmF1bHQgY2FzZSwgY2FsbCBhc19iYWQKKwlpbnN0ZWFkIG9mIGZwcmludGYsIHRvIGdldCAiYXNzZW1ibGVyIG1lc3NhZ2VzOiIgbWVzc2FnZSBvdXRwdXQKKwliZWZvcmUgaW5zdGVhZCBvZiBhZnRlci4KKworRnJpIE5vdiAgNyAxMDozNjoyMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBmcmFncy5oOiBIYW5kbGUgbXVsdGlwbGUgaW5jbHVzaW9uLgorCitXZWQgTm92ICA1IDEwOjUxOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBhIHBhdGNoIGZyb20gSWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdS4KKwkqIGFzLmggKHN0cnVjdCBmcmFnLCBmcmFnIHN1cHBvcnQpOiBNb3ZlZCBmcm9tIGhlcmUuCisJKiBmcmFncy5oOiBUbyBoZXJlLgorCShzdHJ1Y3QgZnJhZywgbWVtYmVyIHRjX2ZyYWdfZGF0YSk6IE5ldyBtZW1iZXIgaWYgVENfRlJBR19UWVBFCisJaXMgZGVmaW5lZC4KKwkoc3RydWN0IGZyYWcsIG1lbWJlciBmcl9jZ2VuKTogUmVuYW1lZCBmcm9tIGZyX3RhcmcuY2dlbi4KKwkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBVcGRhdGUuCisJKiBjb25maWcvdGMtbTMyci5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVwZGF0ZS4KKwkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZSQUdfSU5JVCk6IFJlbmFtZWQgZnJvbSBtZF9pbml0X2ZyYWcuCisJKG1kX2NvbnZlcnRfZnJhZyk6IERpdHRvLgorCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0ZSQUdfVFlQRSk6IERlZmluZS4KKwkoZnJhZ19vcGNvZGVfZnJhZyxmcmFnX29wY29kZV9vZmZzZXQsZnJhZ19ic3IpOiBVcGRhdGUuCisJKFRDX0ZSQUdfSU5JVCk6IFVwZGF0ZS4KKworVHVlIE5vdiAgNCAxNjozNTo1NyAxOTk3ICBJYW4gRGFsbCAgPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+CisKKwkqIHdyaXRlLmMgKHByaW50X2ZpeHVwKTogVXNlIFRDX0ZJWF9EQVRBX1BSSU5UIChpZiBkZWZpbmVkKSB0bworCXByaW50IG91dCBNRCBmaWVsZHMgb2YgZml4LgorCSogZnJhZ3MuYyAoZnJhZ192YXIsIGZyYWdfdmFyaWFudCk6IFVzZSBUQ19GUkFHX0lOSVQgbWFjcm8gKGlmCisgCWRlZmluZWQpIHRvIGluaXRpYWxpemUgTUQgZmllbGRzIGluIGZyYWcuCisJKiBhcy5oIChzdHJ1Y3QgZnJhZywgbnMzMmsgc3VwcG9ydCk6IFJlbmFtZSBuczMyayB0byBmcl9uczMyay4KKwlEZWxldGUgcGNyZWxfYWRqdXN0LiAgQWRkIGZyX29wY29kZV9mcmFnUCwgZnJfb3Bjb2RlX29mZnNldC4KKwkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgY29tbWVudHMuIFJlbW92ZSBvYnNvbGV0ZQorIAlCRkRfRkFTVF9TRUNUSU9OX0ZJTEwgZGVmaW5pdGlvbiwgY2hhbmdlIHByb3RvdHlwZXMgZm9yCisgCWZpeF9uZXdfbnMzMmsgYW5kIGZpeF9uZXdfbnMzMmtfZXhwIHRvIGFkZCBuZXcgYXJndW1lbnRzCisgCW9wY29kZV9mcmFnIGFuZCBvcGNvZGVfb2Zmc2V0IGFuZCByZW1vdmUgcGNyZWxfYWRqdXN0LgorCShUQ19GSVhfVFlQRSk6IGFkZCBvcGNvZGVfZnJhZ1AgYW5kIG9wY29kZV9vZmZzZXQgZmllbGRzLgorCShUQ19GSVhfREFUQV9QUklOVCk6IG5ldyBtYWNybyB0byBwcmludCBvdXQgVENfRklYX1RZUEUuCisJKFRDX0ZSQUdfSU5JVCk6IG5ldyBtYWNybyB0byBpbml0aWFsaXplIG1hY2hpbmUgZGVwZW5kZW50IGZpZWxkIGluCisgCWZyYWdzLgorCShmcmFnX29wY29kZV9mcmFnLCBmcmFnX29wY29kZV9vZmZzZXQsIGZyYWdfYnNyKTogbWFjcm9zIHRvIGFjY2VzcworIAlNRCBmaWVsZHMgaW4gZnJhZyBzdHJ1Y3R1cmUuCisJKGZpeF9pbV9kaXNwLCBmaXhfYml0X2ZpeFAsIGZpeF9vcGNvZGVfZnJhZywgZml4X29wY29kZV9vZmZzZXQsCisgCWZpeF9ic3IpOiBtYWNyb3MgdG8gYWNjZXNzIE1EIGZpZWxkcyBpbiBmaXggc3RydWN0dXJlLgorCSogY29uZmlnL3RjLW5zMzJrLmM6IEF2b2lkIG92ZXJsZW5ndGggbGluZXMuIEFsaWduIGNvbW1lbnRzLiAgRG9uJ3QKKyAJdXNlIHN0cnVjdCBvcGNvZGVfbG9jYXRpb24gYXMgdGhlc2UgZmllbGRzIGFyZSBub3cgaW4gdGhlIGZyYWcKKwlzdHJ1Y3R1cmUuCisJKGNvbnZlcnRfaWlmKTogQ2FsbCBmcmFnX21vcmUgYXMgaXQgaXMgbmVlZGVkIGluc3RlYWQKKyAJb2YgdHJ5aW5nIHRvIGFsbG9jYXRlIGZvciB0aGUgd2hvbGUgaW5zbi4gQXZvaWQgY2FsbCBvZiBmcmFnX21vcmUKKyAJd2l0aCBuZWdhdGl2ZSBhcmd1bWVudC4KKwkobWRfcGNyZWxfYWRqdXN0LCBtZF9maXhfcGNyZWxfYWRqdXN0LCBtZF9hcHBseV9maXgsCisJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX3BjcmVsX2Zyb20sCisJdGNfYW91dF9maXhfdG9fY2hhcnMpOiB1c2UgYWNjZXNzb3IgbWFjcm9zIHRvIGdldCBtZCBmaWVsZHMgaW4gZml4CisgCWFuZCBmcmFnIHN0cnVjdHVyZXMuCisJKGZpeF9uZXdfbnMzMmssIGZpeF9uZXdfbnMzMmtfZXhwKTogYWRkIG5ldyBhcmd1bWVudHMgb3Bjb2RlX2ZyYWcgYW5kCisJb3Bjb2RlX29mZnNldCBhbmQgcmVtb3ZlIHBjcmVsX2FkanVzdC4KKwkoY29udmVydF9paWYsIGNvbnNfZml4X25ld19uczMyayk6IGNhbGwgZml4X25ld19uczMyaywKKyAJZml4X25ld19uczMya19leHAgd2l0aCBjaGFuZ2VkIGFyZ3VtZW50cy4KKworTW9uIE5vdiAgMyAxMzozMDoxNyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogdGMtbWlwcy5jIChtZF9iZWdpbik6IFJlb3JnYW5pemUgc2V0dGluZyBvZiBkZWZhdWx0IHZhbHVlcyBzbworCXRoYXQgbWlwc19jcHUgZGVwZW5kcyBvbiBUQVJHRVRfQ1BVLCBhbmQgbWlwc19vcHRzLmlzYSBkZXBlbmRzIG9uCisJbWlwc19jcHUuCisJKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZSBhbGwgY29kZSB0aGF0IHNldHMgZGVmYXVsdHM7IG1kX2JlZ2luCisJaGFuZGxlcyBhbGwgb2YgdGhpcyBub3cuCisKK1N1biBOb3YgIDIgMTQ6NDY6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoU1RBR0VTVFVGRik6IENoYW5nZSBiaW5fUFJPR1JBTVMgdG8KKwlub2luc3RfUFJPR1JBTVMuCisJKGJvb3RzdHJhcCwgYm9vdHN0cmFwMiwgYm9vdHN0cmFwMyk6IExpa2V3aXNlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcyBpbiB0aGUKKwlUT0Mgc2VjdGlvbiB0byBiZSBhZ2FpbnN0IHRoZSBjc2VjdC4KKworRnJpIE9jdCAzMSAxODoxOTo1NSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAodmFsaWRhdGVfbWlwc19pbnNuKTogTmV3IGZ1bmN0aW9uLCBjaGVja3MKKwltYXRjaCB2ZXJzdXMgbWFzayBiaXRzLCBhbmQgYWxzbyB2ZXJpZmllcyB0aGF0IGFsbCBiaXRzIHRvIGJlCisJb3V0cHV0IGFyZSBhY3R1YWxseSBzcGVjaWZpZWQgc29tZXdoZXJlLgorCShtZF9iZWdpbik6IENhbGwgaXQgZm9yIDMyLWJpdCBpbnN0cnVjdGlvbnMsIGluc3RlYWQgb2YgZG9pbmcKKwltYXRjaC9tYXNrIGNoZWNrIGhlcmUuICBJbiBjYXNlIG9mIGZhaWx1cmUsIHByaW50IGEgbWVzc2FnZSwgYnV0CisJY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIG9wY29kZSB0YWJsZSBiZWZvcmUgZXhpdGluZy4KKworVGh1IE9jdCAzMCAxMzo0NjoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggdGh1bWIgQURSIHBzZXVkbyBvcC4gIFBhdGNoCisJZnJvbSBUb255IFRob21wc29uIGF0IEFSTTogYXRob21wc29AYXJtLmNvbQorCitUaHUgT2N0IDMwIDExOjExOjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogQWxsb3cgb2RkIHJlZ2lzdGVycyBmb3IgbGQydyBhbmQKKwlmcmllbmRzLgorCitGcmkgT2N0IDI0IDE1OjU2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IFdoZW4gaGFuZGxpbmcgQGwsIGFsd2F5cyBzaWduCisJZXh0ZW5kIGlmIHRoZSBvcGVyYW5kIGV4cGVjdHMgYSBzaWduZWQgdmFsdWUuCisKKwkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIpOiBEb24ndCBkZWZpbmU7IHVzZQorCWRlZmF1bHQgd2hpY2ggaXMgdG8gcGVybWl0IGRvbGxhciBsYWJlbHMuCisKK0ZyaSBPY3QgMjQgMTE6MTk6MjIgMTk5NyAgSmFrdWIgSmVsaW5layAgPGpqQHN1bnNpdGUubWZmLmN1bmkuY3o+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19tZW1vcnlfbW9kZWwpOiBOZXcgdmFyaWFibGUuCisJKG1kX2xvbmdvcHRzKTogQWRkIC1UU08vLVBTTy8tUk1PIG9wdGlvbnMuCisJKG1kX3BhcnNlX29wdGlvbnMpOiBIYW5kbGUgdGhlbS4KKwkoc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBGb3IgNjQgRUxGLCBzZXQgcmVxdWlyZWQKKwltZW1vcnkgb3JkZXJpbmcgaW4gZV9mbGFncy4gRGVmYXVsdCB0byBSTU8gYW5kIGxldCB0aGUgdXNlcgorCW92ZXJyaWRlIGl0IHRocm91Z2ggY29tbWFuZCBsaW5lLgorCisJKiBjb25maWcvdGMtc3BhcmMuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcpOiBBZGQuCisKK1dlZCBPY3QgMjIgMTc6NDI6MTIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHY5YV9hc3JfdGFibGUpOiBOZXcgdmFyaWFibGUuCisJKHNwYXJjX2lwKTogSGFuZGxlIHY5YSBhc3Incy4KKwlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4uCisKK1dlZCBPY3QgMjIgMTc6MjI6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2RvX2FsaWduKTogTmV3IG1hY3JvLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2hhbmRsZV9hbGlnbik6IEhhbmRsZSByc19hbGlnbl9jb2RlLgorCVBhdGNoIGZyb20gSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4uCisKK1dlZCBPY3QgMjIgMTI6NTE6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAoc2hfc21hbGwpOiBOZXcgdmFyaWFibGUuCisJKE9QVElPTl9TTUFMTCk6IERlZmluZS4KKwkobWRfbG9uZ29wdHMpOiBBZGQgInNtYWxsIi4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIE9QVElPTl9TTUFMTC4KKwkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLXNtYWxsLgorCSogY29uZmlnL3RjLXNoLmggKHNoX3NtYWxsKTogRGVjbGFyZS4KKwkoU1VCX1NFR01FTlRfQUxJR04pOiBIYW5kbGUgc2hfc21hbGwuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IENoZWNrIHNoX3NtYWxsIGluIFRDX1NICisJY2FzZS4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGNvbnN0YW50IGluIE1fTElfRAorCWNhc2UgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgorCitUdWUgT2N0IDIxIDEwOjIwOjExIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzLCBjYXNlcyAuLi5fSDQ0LCAuLi5fSElYMjIpOiBMZWF2ZQorCW92ZXJmbG93IHNpZ25hbGxpbmcgdG8gbGlua2VyLgorCitNb24gT2N0IDIwIDE0OjU0OjA2IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IEZpeCBmb3IgZGVjIGMuCisKKwkqIGNvbmZpZy1nYXMuY29tOiBHaXZlIGV4cGxhbmF0aW9uIGZvciBkZWMgYyBzZXR1cCBpbiBlcnJvcgorCW1lc3NhZ2UuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBNYWtlIC5jb21tIHN5bWJvbHMgc2VwYXJhdGUKKwlzZWN0aW9ucyBvbiBvcGVudm1zL2FscGhhLgorCisJKiBjb25maWcvb2JqLWV2YXguYzogc3VwcG9ydCAud2VhayBwc2V1ZG8tb3AKKworTW9uIE9jdCAyMCAxMDoxMzozMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoZGVmYXVsdF9hcmNoX3NpemUpOiBOZXcgc3RhdGljIGxvY2FsLgorCShzdHJ1Y3Qgc3BhcmNfYXJjaCk6IFJlbmFtZSBhcmNoX3NpemUgdG8gZGVmYXVsdF9hcmNoX3NpemUuCisJTmV3IG1lbWJlciB1c2VyX29wdGlvbl9wLgorCShzcGFyY19hcmNoX3RhYmxlKTogQWx3YXlzIGluY2x1ZGUgdjksIHY5YS4gIE5ldyBlbnRyeSB2OS02NC4KKwkoaW5pdF9kZWZhdWx0X2FyY2gpOiBDaGVjayB3aGV0aGVyIGRlZmF1bHQgYXJjaCBpcyB2YWxpZC4KKwlTZXQgZGVmYXVsdF9hcmNoX3NpemUgaW4gYWRkaXRpb24gdG8gc3BhcmNfYXJjaF9zaXplLgorCShPUFRJT05fMzIsT1BUSU9OXzY0KTogRGVmaW5lLgorCShtZF9sb25nb3B0cyk6IE5ldyBlbnRyaWVzIGZvciAtMzIsIC02NC4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIHRoZW0uCisJKG1kX3Nob3dfdXNhZ2UpOiBQcmludCB0aGVtLiAgRW5zdXJlIGluaXRfZGVmYXVsdF9hcmNoIGNhbGxlZC4KKwkqIGNvbmZpZ3VyZS5pbiAoc3BhcmM2NCk6IFNldCBhcmNoIHRvIHY5LTY0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworU3VuIE9jdCAxOSAxMzo1MDo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCisJd3JpdGVfb2JqZWN0X2ZpbGUuCisJKHdyaXRlX29iamVjdF9maWxlKTogU29tZSBjb2RlIG1vdmVzIGludG8gc3Vic2Vnc19maW5pc2guCisJKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IERlY2xhcmUuCisJKiBhcy5jIChtYWluKTogQ2FsbCBzdWJzZWdzX2ZpbmlzaC4KKworCSogcmVhZC5jIChzX2luY2x1ZGUpOiBDaGVjayBmb3IgZXJyb3IgcmV0dXJuIGZyb20KKwlkZW1hbmRfY29weV9zdHJpbmcuCisKK1R1ZSBPY3QgMTQgMjA6NTA6NTggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChnZXRfbGluZV9zYik6IEFjY2VwdCBhbnkgZW9sIG1hcmtlciB3aGlsZSBzY2FubmluZyBtYWNyb3MuCisKK1R1ZSBPY3QgMTQgMTk6MTI6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFscGhhLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9hcHBseV9maXgpOiBOb3RpY2UgZnhfcGNyZWwgYW5kIHN1YnN0aXR1dGUKKwl0aGUgY29ycmVjdCByZWxvY2F0aW9uIHdoZW4gaXQgZXhpc3RzLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtcHBjLmg6IENvcnJlY3QgdHlwbyBpbiBjb21tZW50LgorCSogY29uZmlnL3RjLXY4NTAuaDogTGlrZXdpc2UuCisKK0ZyaSBPY3QgMTAgMTY6MDk6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IEFsbG93IHBhcmFsbGVsIGluc3RydWN0aW9uIGlzc3VlCisgCXdoZW4gc2Vjb25kIGluc3RydWN0aW9uIGlzIHdyaXRpbmcgdG8gZmlyc3QgaW5zdHJ1Y3Rpb25zIGlucHV0cy4KKwkKK01vbiBPY3QgMTMgMTU6Mjc6MTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoUEFHRV9TSVpFKTogRG91YmxlIHRvIDhrIGFzIGEgaGFjayB0byBhbGxvdyBzb21lIEMrKworCXRlbXBsYXRlZCBwcm9ncmFtcyB0byBidWlsZCB3aXRoIC1nLgorCitGcmkgT2N0IDEwIDE3OjQ4OjI5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3JlbGF4X3RhYmxlKTogQWRkIHN1cHBvcnQgZm9yIHJlbGF4aW5nCisJdW5jb25kaXRpb25hbCBicmFuY2hlcy4gIFRoaXMgcGF0Y2ggaXMgY291cnRlc3kgb2YgSmltIFdpbHNvbi4gCisJKG1kX2NvbnZlcnRfZnJhZyk6IEZpeCByZWxheGluZyBvZiBicmFuY2hlcy4gIFRoaXMgcGF0Y2ggaXMKKwljb3VydGVzeSBvZiBKaW0gV2lsc29uLgorCShtZF9hc3NlbWJsZSk6IENyZWF0ZSBkaWZmZXJlbnQgZml4dXBzIGZvciBjb25kaXRpb25hbCBhbmQKKwl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IEVzdGltYXRlIHNpemUgb2YgdmFyaWFibGUgcGFydCBvZgorCWZpeHVwIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgZm9yIGEgY29uZGl0aW9uYWwgb3IgYW4gdW5jb25kaXRpb25hbAorCWJyYW5jaC4gIFRoaXMgcGF0Y2ggaXMgY291cnRlc3kgb2YgSmltIFdpbHNvbi4KKwkodjg1MF9zZGF0YSwgdjg1MF90ZGF0YSwgdjg1MF96ZGF0YSwgdjg1MF9zYnNzLCB2ODUwX3Ric3MsCisJdjg1MF96YnNzLCB2ODUwX3Jvc2RhdGEsIHY4NTBfcm96ZGF0YSwgdjg1MF9ic3MpOiBBZGQgY2FsbCB0bworCW9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpLiAKKwkodjg1MF9jb21tKTogTmV3IGZ1bmN0aW9uLgorCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgbmV3IHBzZXVkbyBvcHMgLnpjb21tLCAuc2NvbW0gYW5kIC50Y29tbS4KKwkobWRfYmVnaW4pOiBBZGQgYnNzIGZsYWcgdG8gc2VnX2luZm8gb2YgYnNzIHNlY3Rpb25zLgorCisJQWRkIHN1cHBvcnQgZm9yIC5zY29tbW9uLCAudGNvbW1vbiBhbmQgLnpjb21tb24gc2VjdGlvbnMuCisKKwkqIGNvbmZpZy90Yy12ODUwLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogQWRkIC5zY29tbW9uLAorCS56Y29tbW9uLCAudGJzcywgLmNhbGxfdGFibGVfZGF0YSBhbmQgLmNhbGxfdGFibGVfdGV4dC4KKworRnJpIE9jdCAxMCAxNTowMToxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKTogU2V0IERFRkFVTFRfQVJDSCBmcm9tIGNvcnJlY3QgdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworRnJpIE9jdCAxMCAxMToyMjo0NSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZXMgdG8gbWFrZSBzdXJlIHRoZSBBVF9XT1JECisJZXhwcmVzc2lvbiBpcyBub3QgY29uZnVzZWQgd2l0aCAtMS4KKworRnJpIE9jdCAxMCAxMTo1NDo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRmxhZyBTUCBhcyBtb2RpZmllZCBmb3IgQC1zcAorIAlvcGVyYW5kIC0gT1BFUkFORF9BVE1JTlVTLgorCitGcmkgT2N0IDEwIDAwOjQ3OjQ0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IE5vdGUgdGhhdCBhdXRvIGluY3JlbWVudCBhbmQKKwlkZWNyZW1lbnQgbW9kaWZ5IHRoZSBpbmRleCByZWdpc3Rlci4KKworVGh1IE9jdCAgOSAxNToxNzo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIFJvYmluIEtpcmtoYW0gPFJvYmluLktpcmtoYW1AbWxiLmRtdC5jc2lyby5hdT46CisJKiBjb25maWcvdGMtbTY4ay5jIChhcmNocyk6IEFkZCA2ODMwNiwgNjgzMDcsIDY4MzIyLCA2ODM1NiwgNjgzMzQsCisJNjgzMzYsIDY4MzQxLCA2ODM0OS4KKwkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogQWRkIC1tNjhlYzAwMCAtbTY4aGMwMDAgLW02OGhjMDAxCisJLW02ODMwNiwgLW02ODMwNywgLW02ODMyMiwgLW02ODM1NiwgLW02OGVjMDIwLCAtbTY4ZWMwMzAsCisJLW02OGVjMDQwLCAtbTY4ZWMwNjAsIC1tNjgzMzAsIC1tNjgzMzQsIC1tNjgzMzYsIC1tNjgzNDEsCisJLW02ODM0OS4KKworCSogZG9jL01ha2VmaWxlLmFtIChDUFVfRE9DUyk6IERlZmluZS4KKwkoYXMuaW5mbyk6IERlcGVuZCB1cG9uICQoQ1BVX0RPQ1MpLgorCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBBTV9QUk9HX0lOU1RBTEw7IGl0J3MgY2FsbGVkIGJ5CisJQU1fSU5JVF9BVVRPTUFLRS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IE9jdCAgOSAwMTo0NDozNiAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiB0Yy1kMTB2LmggKFRDX1NUQVJUX0xBQkVMKTogRG9uJ3QgZGVmaW5lLgorCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgorCitUaHUgT2N0ICA5IDAwOjA3OjIzIDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBGaXggYnVnIHRoYXQgd291bGRuJ3QgYWxsb3cKKwl0byBwYWlyIGEgYnJhbmNoIGFuZCBsaW5rIHdpdGggYW55dGhpbmcgYnV0IGFuIGV4ZSBpbnN0cnVjdGlvbi4KKworV2VkIE9jdCAgOCAxNjoyODo1MyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogRGlzYWJsZSB0aGUgc3ltK2NvbnN0IC5nb3QKKwlvcHRpbWl6YXRpb24gdG8gcmVkdWNlIHRoZSBhbGlnbm1lbnQgc3VycHJpc2VzIGZvciBnY2MuCisKK1dlZCBPY3QgIDggMTY6MTE6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmggKFRDX1NQQVJDKTogRG9uJ3QgZGVmaW5lIFRBUkdFVF9GT1JNQVQuCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IEhhbmRsZSBjb2ZmIGhlcmUuCisJKHNwYXJjX2lwKTogQWRkICVoaXgsJWxveC4KKwkobWRfYXBwbHlfZml4Myk6IENhbGwgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgorCUFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfU1BBUkNfe0hJWDIyLExPWDEwfS4KKwkodGNfZ2VuX3JlbG9jKTogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTB9LgorCitXZWQgT2N0ICA4IDEyOjMzOjMyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFscGhhLSotKiB0byBhbHBoYSotKi0qOyBjb25maWcuZ3Vlc3Mgbm93CisJcmVjb2duaXplcyBhbHBoYWV2NSBldGMuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBPY3QgIDggMDA6MDQ6MDUgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVwbGFjZSB0aGUgVEFSR0VUX0NQVSB2YWx1ZQorCW9mIG1pcHNyMzkwMCB3aXRoIG1pcHN0eDM5LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgcHJpbnQgdGhlICdvcGNvZGUgcmVxdWlyZXMgCisJLW1pcHNYWCBtZXNzYWdlJyBpZiB0aGUgaW5zbiBpc24ndCBhbiBJU0EgaW5zbi4KKworVHVlIE9jdCAgNyAxMjo0ODozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCBzdXBwb3J0KTogTW92ZWQgdG8gdGMtc3BhcmMuYy4KKwlSZWRlZmluZSBUQVJHRVRfRk9STUFUIHRvIGNhbGwgc3BhcmNfdGFyZ2V0X2Zvcm1hdC4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbl91bnNpZ25lZF9yYW5nZSk6IE5ldyBmdW5jdGlvbi4KKwkoc3BhcmNfYXJjaF9zaXplKTogTWFrZSBzdGF0aWMuCisJKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjX2lwKTogRGVsZXRlIHZhcmlhYmxlIGltbWVkaWF0ZV9tYXguICBSZXdyaXRlICVoaS9ldGMgcmVsb2MKKwloYW5kbGluZy4gIEFkZCBzdXBwb3J0IGZvciAlaGgsJWhtLCVsbSwlaDQ0LCVtNDQsJWw0NC4KKwkob3V0cHV0X2luc24pOiBTZXQgYGZ4X25vX292ZXJmbG93Jy4KKwkobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfezcsSDQ0LE00NCxMNDR9LgorCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KKworTW9uIE9jdCAgNiAxNDowNDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3NlY3Rpb24pOiBSZW1vdmUuCisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEVuaGFuY2UgZXJyb3IgbWVzc2FnZS4KKworRnJpIE9jdCAgMyAxNTo0MDozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IFVuZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIGJlZm9yZQorCWluY2x1ZGluZyBvYmotZWxmLmggaW4gT0JKX01BWUJFX0VMRiBjYXNlLgorCShtaXBzX3RhcmdldF9mb3JtYXQpOiBSZXR1cm4gTlVMTCBhZnRlciBhYm9ydCB0byBhdm9pZCB3YXJuaW5nLgorCisJKiBlY29mZi5jIChnZW5lcmF0ZV9lY29mZl9zdGFiKTogUmVtb3ZlIHVudXNlZCBzdGF0aWMgZnVuY3Rpb24uCisKKwkqIGV4cHIuYyAob3BlcmF0b3IpOiBBY2NlcHQgPT0uICBGcm9tIEFuZGVycyBCbG9tZGVsbAorCTxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+LgorCisJKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IFdoZW4gZ2VuZXJhdGluZyBhIGRlbm9ybWFsCisJbnVtYmVyLCBoYW5kbGUgYW4gb3ZlcmZsb3cgaW50byB0aGUgc21hbGxlc3Qgbm9ybWFsaXplZCBudW1iZXIuCisKK01vbiBTZXAgMjkgMTU6MjQ6NTIgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBhcy5oLCBpbnB1dC1zY3J1Yi5jIChuZXdfbG9naWNhbF9saW5lKTogTmV3IHJldHVybiB2YWx1ZS4KKwkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IERvbid0IG5vdGUgdGhlIHNhbWUgZmlsZSBzZXZlcmFsIHRpbWVzCisJaW4gYSByb3cuCisKK1RodSBTZXAgMjUgMTM6MDg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVtb3ZlIGAgb3BlcmFuZCBzcGVjaWZpZXIuCisKK1dlZCBTZXAgMjQgMTY6NTQ6NDAgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmUuaW4gKHNoKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2Ugc2gtKi1lbGYqLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitXZWQgU2VwIDI0IDExOjMwOjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEhhbmRsZSBxIGFuZCB2IG9wZXJhbmQgc3BlY2lmaWVycy4KKworCSogZG9jL2MtaTM4Ni50ZXhpIChpMzg2LUZsb2F0KTogUmVtb3ZlIGluY29ycmVjdCBhc3NlcnRpb24gdGhhdAorCWZuKiBpbnN0cnVjdGlvbnMgZG8gbm90IGluc2VydCBpbXBsaWNpdCBmd2FpdC4gIFRoaXMgd2FzIGNoYW5nZWQKKwlKYW4gMjksIDE5OTYuCisKKwkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKHl5bGV4KTogUGVybWl0IGFuIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBmb3IKKwl0aGUgc2NhbGUgZmFjdG9yLgorCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBTZXQgdG8gY29uZmlnL202OGstcGFyc2UueSwKKwlub3QgbTY4ay1wYXJzZS55LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIFNlcCAyMyAxNzo0ODowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IENsZWFyIG1yaV9zdGF0ZSBhdCBlbmQgb2YgLm1yaQorCXBzZXVkby1vcC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogQ2hhbmdlIGZyb20gYSBzdGF0aWMKKwl2YXJpYWJsZSB0byBhIG1hY3JvLCBzbyB0aGF0IGl0IHZhcmllcyB3aXRoIHRoZSB2YXJpYWJsZXMgdXBvbgorCXdoaWNoIGl0IGRlcGVuZHMuCisJKGdwcl9pbnRlcmxvY2tzLCBjb3BfaW50ZXJsb2Nrcyk6IExpa2V3aXNlLgorCShtZF9iZWdpbik6IERvbid0IGluaXRpYWxpemUgdGhlbS4KKworRnJpIFNlcCAxOSAxNzowODo0MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXNlIHN0cmNhc2Vjb21wIGluc3RlYWQKKwlvZiBzdHJjbXAgd2hlcmUgYXBwcm9wcmlhdGUuCisKK1RodSBTZXAgMTggMTQ6MTE6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3BlIHdpdGggYSB6ZXJvIGRhdGEgYXJlYQorCXJlbG9jYXRpb24gd2l0aCBhIGNvbnN0YW50IG9mZnNldC4KKwkobWRfYXNzZW1ibGUpOiBQcm9kdWNlIGVycm9yIG1lc3NhZ2Ugd2hlbiBzcGVjaWFsIGRhdGEgYXJlYQorCXJlbG9jYXRpb25zIGFyZSB1c2VkIG9uIGluc3RydWN0aW9ucyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGVtLgorCShtZF9hc3NlbWJsZSk6IFJlc2V0IHByb2Nlc3NvciBtYXNrIGlmIGRlZmluZWQgYnkgY29tbWFuZCBsaW5lCisJc3dpdGNoLiAKKworVGh1IFNlcCAxOCAxMToyNDowMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYzogUmVvcmdhbml6ZSBmaWxlLgorCShwYXJzZV9rZXl3b3JkX2FyZyk6IEFsbG93IG51bWJlcnMgaW4gcmVnIG5hbWVzLgorCShTUEVDSUFMX0NBU0VfTk9ORSk6IE5ldyBtYWNyby4KKwkobWRfYXNzZW1ibGUpOiBVc2UgaXQuCisJKGxvb2t1cF9hcmNoLGluaXRfZGVmYXVsdF9hcmNoKTogTmV3IGZ1bmN0aW9ucy4KKwkoZGVmYXVsdF9hcmNoLGRlZmF1bHRfaW5pdF9wLHNwYXJjX2FyY2hfdGFibGUpOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkoc3BhcmNfYXJjaF9zaXplKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkobWF4X2FyY2hpdGVjdHVyZSk6IEluaXRpYWxpemUgaW4gaW5pdF9kZWZhdWx0X2FyY2guCisJKG1kX3BhcnNlX29wdGlvbnMpOiBDYWxsIGluaXRfZGVmYXVsdF9hcmNoIGlmIG5lY2Vzc2FyeS4KKwlSZXdyaXRlIC14YXJjaC8tQSBwcm9jZXNzaW5nLgorCShtZF9zaG93X3VzYWdlKTogUHJpbnQgLUEgdmFsdWVzIGZyb20gc3BhcmNfYXJjaF90YWJsZS4KKwkobWRfYmVnaW4pOiBDYWxsIGluaXRfZGVmYXVsdF9hcmNoIGlmIG5lY2Vzc2FyeS4KKwkoc3BhcmNfbWRfZW5kKTogSGFuZGxlIGJvdGggMzIgYW5kIDY0IGJpdCBlbnZpcm9ubWVudHMuCisJKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IExpa2V3aXNlLgorCSogYWNjb25maWcuaCAoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgorCShERUZBVUxUX0FSQ0gpOiBBZGQuCisJKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKTogRGVmYXVsdCBERUZBVUxUX0FSQ0ggYmFzZWQgb24gdGFyZ2V0IGNwdS4KKwkoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogY29uZmlnL3Ztcy1jb25mLmggKFNQQVJDX1Y5LFNQQVJDX0FSQ0g2NCk6IERlbGV0ZS4KKworV2VkIFNlcCAxNyAxNjo1NDoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFJlY29kZWQgdG8gdXNlIENIRUNLXyAoKQorCW1hY3JvLiAKKwkoaGFuZGxlX3RkYW9mZiwgaGFuZGxlX3pkYW9mZiwgaGFuZGxlX3NkYW9mZik6IE5ldyBmdW5jdGlvbnMuCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGVkIHR5cG8uCisJKiBjb25maWcvdGMtdjg1MC5jIEFkZCBuZXcgc2VjdGlvbnM6IGNhbGxfdGFibGVfZGF0YSBhbmQKKwljYWxsX3RhYmxlX3RleHQuCisJKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIHN1cHBvcnQgZm9yIGN0b2ZmKCkgcmVsb2NhdGlvbiBwcmVmaXguIAorCShoYW5kbGVfY3RvZmYpOiBOZXcgRnVuY3Rpb24uCisKKwkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogRG9jdW1lbnQgY2FsbCB0YWJsZSByZWxvY2F0aW9ucy4KKworVHVlIFNlcCAxNiAxNDoxODoyMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBzdXBwb3J0IGZvciBhIDE2IGJpdAorCWRpc3BsYWNlbWVudCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgorCitNb24gU2VwIDE1IDIxOjI4OjA5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAoZml4X25ld19ocHBhKTogTWFrZSBkZWNsYXJhdGlvbiBtYXRjaAorCWRlZmluaXRpb24uCisKK01vbiBTZXAgMTUgMTg6MzM6MDYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAocHJvY2Vzc29yX21hc2spOiBOZXcgdmFyaWFibGUuCisJKHNldF9tYWNoaW5lLCBtZF9wYXJzZV9vcHRpb24pOiBTZXQgcHJvY2Vzc29yX21hc2suCisJKG1kX2Fzc2VtYmxlKTogQ2hlY2sgdGhhdCBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgdG8gdGFyZ2V0CisJcHJvY2Vzc29yLiAKKworCSogY29uZmlnL3RjLXY4NTAuaCAoVEFSR0VUX1BST0NFU1NPUik6IE5ldyBjb25zdGFudC4KKworTW9uIFNlcCAxNSAxMToyODowNCAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCU1lcmdlIGluIHdvcmsgZnJvbSBNYXJ0aW4gSHVudDoKKworCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEZvciBtdmZzeXMgYW5kIG12dHN5cywKKwlDUiBpcyAwIGZvciBQU1dMIGFuZCBQU1dILgorCisJKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IERvbid0IGFjY2VwdAorCWlsbGVnYWwgY29uZGl0aW9uIGNvZGVzIGZvciBjbXB1IGluc3RydWN0aW9uLgorCisJKiBjb25maWcvdGMtZDMwdi5jOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTAorCXVzZWQgaW4gZCppIGluc3RydWN0aW9ucy4KKworCSogY29uZmlnL3RjLWQzMHYuYyAoY2hlY2tfc2l6ZSk6IE5ldyBmdW5jdGlvbi4gIENoZWNrCisJcmVsb2NhdGlvbnMgZm9yIG92ZXJmbG93cy4KKwkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRml4IHJlbG9jYXRpb25zIGJldHdlZW4gc2VjdGlvbnMuCisJKG1kX2FwcGx5X2ZpeDMpOiBVc2UgbmV3IHJlbG9jYXRpb24gdHlwZXMgZm9yIDE1IGFuZCAyMQorCWJpdCByZWxvY2F0aW9ucyBpbiB0aGUgcmlnaHQgY29udGFpbmVyLiBOZWVkZWQgYmVjYXVzZQorCXRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgZWlnaHQtYnl0ZSBhbGlnbmVkCisJYnV0IHRoZSByZWxvY2F0aW9ucyBtdXN0IGJlLgorCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogQ2hlY2sgZm9yIG92ZXJmbG93LgorCShmaW5kX2Zvcm1hdCk6IElmICIucyIgb3IgIi5sIiBhcmUgdXNlZCwgZG9uJ3QgdHJ5CisJdG8gY29tcHV0ZSBicmFuY2ggc2l6ZXMuCisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQ2hlY2sgZm9yICIucyIgb3IKKwkiLmwiIGV4dGVuc2lvbnMgdG8gb3Bjb2RlIG5hbWVzLgorCShmaW5kX2Zvcm1hdCk6IEdlbmVyYXRlIHRoZSBjb3JyZWN0IGluc3RydWN0aW9ucyB3aGVuCisJIi5zIiBvciAiLmwiIGFyZSB1c2VkLgorCisJKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogQ2hlY2sgZm9yIG9kZCByZWdpc3RlcnMKKwlvbiBpbnN0cnVjdGlvbnMgdGhhdCByZXF1aXJlIGV2ZW4gcmVnaXN0ZXJzLgorCisJKiBjb25maWcvdGMtZDMwdi5oIChtZF9zdGFydF9saW5lX2hvb2spOiBEZWZpbmUuCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9zdGFydF9saW5lX2hvb2spOiBOZXcgaG9vay4KKwlDaGVja3MgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgZm9yIGEgIi4iLiAgSWYgaXQKKwlmaW5kcyBvbmUsIGFzc3VtZSBhIHBzZXVkby1vcCBhbmQgZmx1c2ggYW55IHVud3JpdHRlbgorCWluc3RydWN0aW9ucy4KKworCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXBwbHlfZml4Myk6IEZpeCBwcm9ibGVtCisJd2l0aCBkZXRlcm1pbmluZyB3aGVuIGZpeHVwcyB3ZXJlIGRvbmUuCisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBGaXggYnVnIHdoZXJlIHRoZSBudW1lcmljCisJcGFydCBvZiBhIHN5bWJvbCAoZm9yIGV4YW1wbGUsICJmb28rOCIpIHdhcyBiZWluZyB3cml0dGVuCisJaW50byB0aGUgaW5zdHJ1Y3Rpb24uCisJKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAud29yZCB0byBiZSAzMiBiaXRzIGFuZCBhZGQKKwkuaHdvcmQgYXMgMTYgYml0cy4KKworCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBDaGVjayB0byBzZWUgaWYgZmlyc3QKKwlpbnN0cnVjdGlvbiBpcyBhIGp1bXAuCisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogTWFqb3IgY29kZSByZW9yZ2FuaXphdGlvbi4KKworV2VkIFNlcCAxMCAxMDowNzowOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcnJlY3RlZCBzcGVsbGluZyBtaXN0YWtlLgorCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHY4NTAgZW11bGF0aW9uLgorCitUdWUgU2VwICA5IDE3OjE0OjMzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChDUFVfVFlQRVMpOiBBZGQgYXJjLgorCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCB0Yy1hcmMuYy4KKwkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgdGMtYXJjLmguCisJKGRlcGVuZGVuY2llcyk6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFyYy0qLWVsZiouCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlnL3RjLWFyYy5bY2hdOiBOZXcgZmlsZXMuCisKK1R1ZSBTZXAgIDkgMTA6MTk6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBoaTAoKSByZWxvYyBwcmVmaXguCisJQ29ycmVjdCBkZXNjcmlwdGlvbiBvZiBoaSgpIHJlbG9jIHByZWZpeC4KKworCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBuZXcgcmVsb2MgcHJlZml4LgorCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgaGlsbygpIHJlbG9jIHByZWZpeC4KKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ18zMi4KKworCSogZG9jL2Mtdjg1MC50ZXhpOiBEb2N1bWVudCBuZXcgcHNldWRvIG9wcyBhbmQgY29tbWFuZCBsaW5lCisJb3B0aW9ucy4KKworCSogY29uZmlnL3RjLXY4NTAuYyAoc2V0X21hY2hpbmUpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtdjg1MC5jICgudjg1MCk6IE5ldyBwc2V1ZG8gb3AuCisJKiBjb25maWcvdGMtdjg1MC5jICgudjg1MGUpOiBOZXcgcHNldWRvIG9wLgorCSogY29uZmlnL3RjLXY4NTAuYyAoLnY4NTBlYSk6IE5ldyBwc2V1ZG8gb3AuCisJCisKK01vbiBTZXAgIDggMjM6MDg6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJU3VwcG9ydCAtYWxoIGFuZCAtYWxkIGZvciBEV0FSRiAxOgorCSogbGlzdGluZy5jIChzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IEFkZCBkZWJ1Z2dpbmcgZmllbGQuCisJKGxpc3RpbmdfbmV3bGluZSk6IEluaXRpYWxpemUgdGhlIGRlYnVnZ2luZyBmaWVsZC4gIElmIEVMRiwgaWYgdGhlCisJc2VjdGlvbiBzdGFydHMgd2l0aCAuZGVidWcgb3IgLmxpbmUsIHNldCB0aGUgZGVidWdnaW5nIGZpZWxkIGluCisJdGhlIGxpc3Rpbmcgc3RydWN0dXJlLgorCShkZWJ1Z2dpbmdfcHNldWRvKTogQWRkIGxpc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYKKwl0aGUgZGVidWdnaW5nIGZpZWxkIGlzIHNldCwgY29uc2lkZXIgaXQgdG8gYmUgYSBkZWJ1Z2dpbmcgcHNldWRvLgorCUlmIEVMRiwgc2tpcCBibGFuayBsaW5lcyBiZXR3ZWVuIGRlYnVnZ2luZyBsaW5lcy4KKwkqIHJlYWQuYyAoZW1pdF9leHByKTogSWYgRUxGLCBsb29rIGZvciBsaW5lIG51bWJlcnMuCisJKHN0cmluZ2VyKTogSWYgRUxGLCBsb29rIGZvciBmaWxlIG5hbWVzLgorCitNb24gU2VwICA4IDEyOjMzOjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBPbmx5IHRlc3QgZm9yIG92ZXJmbG93CisJaWYgdGhlcmUgaXMgbm8gaW5zZXJ0IGZ1bmN0aW9uLgorCisJKiBjb25maWcvdGMtdjg1MC5oIChUQVJHRVRfTUFDSElORSk6IE5ldyBjb25zdGFudC4KKworCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IEFkZAorCS1td2Fybl91bnNpZ25lZF9vdmVyZmxvdy4gCisJKG1kX2JlZ2luKTogU2V0IEJGRCBtYWNoaW5lIG51bWJlciBiYXNlZCBvbiBtYWNoaW5lIHZhcmlhYmxlLgorCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgLW12ODUwLCAtbXY4NTBlIGFuZCAtbXY4NTBlYSBvcHRpb25zLgorCitNb24gU2VwICA4IDExOjIwOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXMuaDogRG9uJ3QgZGVjbGFyZSBhbGxvY2EgaWYgaXQgaXMgYSBtYWNyby4KKwkqIG1hY3JvLmM6IExpa2V3aXNlLgorCitTdW4gU2VwICA3IDAwOjMwOjE5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAobWRfcGFyc2Vfb3B0aW9uKTogTW92ZSBtW10gb3V0IHRvIHRvcCBsZXZlbCBhbmQKKyAgICAgICAgcmVuYW1lIHRvIGNwdV90eXBlc1tdLgorICAgICAgICAoc19hbHBoYV9hcmNoKTogTmV3IGZ1bmN0aW9uLgorICAgICAgICAobWRfcHNldWRvX3RhYmxlKTogQWRkICJhcmNoIi4KKworICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IE1lcmdlIHRoZSB0d28gbG9vcHMgdGhyb3VnaCB0aGUKKyAgICAgICAgb3Bjb2RlIHRhYmxlLgorICAgICAgICAoc19hbHBoYV9wcm9jKTogQWRkIGluaXRpYWwgU0tJUF9XSElURVNQQUNFLgorICAgICAgICAoc19hbHBoYV9zZXQpOiBMaWtld2lzZS4gIFVzZSBnZXRfc3ltYm9sX2VuZCBpbnN0ZWFkIGxvY2FsIHdoaWxlIGxvb3AuCisKK1NhdCBTZXAgIDYgMTk6Mzg6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHJlYWQuaCAoc19sY29tbV9ieXRlcyk6IEFkZCBwcm90b3R5cGUgKGZvciByZWFsIHRoaXMgdGltZSkuCisKK1RodSBTZXAgIDQgMTI6MTA6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZnJvYl9zeW1ib2wpOiBPbmx5IHNldCBCU0ZfT0JKRUNUIGZvcgorCXN5bWJvbHMgb24gSXJpeC4KKworV2VkIFNlcCAgMyAxMToyMTozMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwuCisKK1R1ZSBTZXAgIDIgMTg6MzI6MzAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfY29udmVydF9mcmFnKTogUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGFyZXgKKwlyZWxhdGl2ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgbm90IHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgorCShtZF9hc3NlbWJsZSk6IFNpbWlsYXJseS4KKworVHVlIFNlcCAgMiAxNTo1ODo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkb2MvYy12ODUwLnRleGk6IEV4cGxhbmF0aW9ucyBvZiBvZmZzZXRzIGluIFNEQS9aREEgYXJlYXMKKwljb3JyZWNldGQuIAorCisJKiBjb25maWcvdGMtdjg1MC5jOiBBZGQgc3VwcG9ydCBmb3IgU0RBL1REQS9aREEgc2VjdGlvbnMuCisJKHY4NTBfcmVsb2NfcHJlZml4KTogRHVwbGljYXRlIGNvZGUgZWxpbWluYXRlZC4gIEFkZCBjb2RlIHRvCisJcmVjb2duaXNlIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLgorCShtZF9hc3NlbWJsZSk6IENhbGN1bGF0aW9uIG9mIHRoZSBzaXplIG9mIGEgZml4dXBzIGNvcnJlY3RlZC4KKworCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgU0RBL1REQS9aREEKKwlzZWN0aW9ucy4gCQorCitUdWUgU2VwICAyIDE1OjQwOjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBVc2Ugb3Bjb2RlLT5uYW1lIGluc3RlYWQgb2YKKyAJb3Bjb2RlLT5vcGNvZGUgYXMgdGhlIHNlbnRpbmFsLiBaZXJvIGlzIGEgdmFsaWQgb3Bjb2RlLgorCitUdWUgQXVnIDI2IDE2OjUxOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL2FzLnRleGluZm8gKE1hY2hpbmUgRGVwZW5kZW5jaWVzKTogQWRkIHY4NTAgdG8gbWVudS4KKwkqIGRvYy9jLXY4NTAudGV4aTogQ2hhbmdlIG5vZGUgbmFtZSB0byBtYXRjaCBvdGhlciBjaGFwdGVyIG5vZGVzLgorCitUdWUgQXVnIDI2IDA5OjQ2OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGRvYy9jLXY4NTAudGV4aSAoVjg1MCBPcGNvZGVzKTogQ29ycmVjdCBuYW1lIGZvciB0aW55IGRhdGEgYXJlYQorCXBvaW50ZXIuIAorCitUdWUgQXVnIDI2IDEyOjIzOjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSWYgQkZENjQsIGRvbid0IG1ha2UgYSBiaWdudW0gaWYgdGhlCisJbnVtYmVyIHdpbGwgZml0IGluIDY0IGJpdHMuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBDaGVjayBleHBsaWNpdGx5IGZvciBPX2JpZywKKwlyYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgorCisJKiBhcy5oOiBEb24ndCBkZWZpbmUgYWxsb2NhIGlmIF9fR05VQ19fLiAgSnVzdCBkZWNsYXJlIGl0LgorCSogbWFjcm8uYzogQ29weSBhbGxvY2EgaGFuZGxpbmcgZnJvbSBhcy5oLgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBDb3JyZWN0IDE2IGJpdCBub29wcy4gIEZyb20KKwlHYWJyaWVsIFBhdWJlcnQgPHBhdWJlcnRAaXJhbS5lcz4uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSW4gSnVtcEJ5dGUgY2FzZSwgd2hlbiBsb29raW5nCisJZm9yIGEgV09SRF9QUkVGSVhfT1BDT0RFLCBjaGFuZ2UgaXQgdG8gQUREUl9QUkVGSVhfT1BDT0RFIGlmIHRoaXMKKwlpcyBqY3h6IG9yIGEgbG9vcCBpbnN0cnVjdGlvbi4KKworTW9uIEF1ZyAyNSAxNjowNDoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgJ2hwJyBhcyBhbGlhcyBmb3IKKwlyMi4KKwkobWRfYmVnaW4pOiBTZXQgdXAgbWFjaGluZSBhcmNoaXRlY3R1cmUgYW5kIHR5cGUuCisKK01vbiBBdWcgMjUgMTQ6MjU6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogU3RvcmUgdGhlIHZhbHVlIGJhY2sgaW50byB0aGUKKwlzeW1ib2wgZXhwcmVzc2lvbiwgdG8gaGFuZGxlIGFkZCBvciBzdWJ0cmFjdCBzaW1wbGlmaWNhdGlvbgorCWNvcnJlY3RseS4gIEhhbmRsZSBPX3N5bWJvbF9ydmEuICBBZGQgZGVmYXVsdCBjYXNlLgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19jaGFuZ2VfY3NlY3QpOiBUZW1wb3JhcmlseSBsb3dlciB0aGUKKwljaHVua3NpemUgd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBzdWJzZWN0aW9uLgorCSogYXMuYyAoY2h1bmtzaXplKTogSW5pdGlhbGl6ZSB0byB6ZXJvLgorCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBDaGFuZ2UgNTAwMCB0byBjaHVua3NpemUgd2hlbgorCWNhbGxpbmcgb2JzdGFja19iZWdpbi4KKworTW9uIEF1ZyAyNSAxMToyMTo0OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFJlc3RvcmUgaW5wdXRfbGluZV9wb2ludGVyIHVwb24KKwlleGl0LiAKKwkKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX3JlZ2lzdGVyX2xpc3QpOiBTdXBwb3J0IGNvbnN0YW50CisJZXhwcmVzc2lvbnMgYXMgcmVnaXN0ZXIgbGlzdHMuCisKK01vbiBBdWcgMjUgMTA6MTk6MzQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZG9jL2Mtdjg1MC50ZXhpOiBDaGFuZ2UgdGhlIG1ham9yIG5vZGUgdG8gdjg1MCBNYWNoaW5lCisJRGVwZW5kZW5jaWVzLiAKKworRnJpIEF1ZyAyMiAxMToxNjoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbzogQWRkIGluY2x1c2lvbiBvZiBjLXY4NTAudGV4aQorCisJKiBkb2MvYy12ODUwLnRleGk6IE5ldyBmaWxlLgorCisJKiByZWFkLmMgKGlzX2VuZF9vZl9saW5lKTogTWFrZSBOVUwgY2hhcmFjdGVyIGJlIGNvbnNpZGVyZWQgdG8gYmUKKwlhIGxpbmUgdGVybWluYXRvci4KKworRnJpIEF1ZyAyMiAxMDo0NTozMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChwYXJzZV9yZWdpc3Rlcl9saXN0KTogQWRkIHN1cHBvcnQgZm9yIGN1cmx5CisJYnJhY2Ugc3ludGF4LgorCShjY19uYW1lcyk6IEFkZCAiZSIgYW5kICJuZSIgY29uZGl0aW9ucy4KKworVGh1IEF1ZyAyMSAxMTowMDozNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBTdXBwb3J0IGEgZG91YmxlIGRhc2ggYXMgc3RhcnRpbmcgYQorCWNvbW1lbnQgdGhhdCBleHRlbmRzIHRvIGVuZCBvZiBsaW5lLgorCitUaHUgQXVnIDIxIDEwOjU0OjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfc2VjdGlvbiwgdjg1MF9ic3MsIHY4NTBfb2Zmc2V0KTogTmV3CisJZnVuY3Rpb25zLgorCShtZF9wc2V1ZG9fdGFibGUpOiBOZXcgcHNldWRvIG9wczogLmJzcywgLm9mZnNldCwgLnNlY3Rpb24KKworVGh1IEF1ZyAyMSAwMDo1OTo1MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTMyci5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVwZGF0ZSByZWNvcmRlZAorCWluc24gd2hlbiBjaGFuZ2luZyB0byBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KKworV2VkIEF1ZyAyMCAwMDo0NToyMCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwkqIHRjLXNoLmMgKHBhcnNlX3JlZywgZ2V0X3NwZWNpZmljLCBidWlsZF9NeXRlcyk6IEFkZCBTSDQKKwlmbG9hdGluZyBwb2ludCBleHRlbnNpb25zLgorCShwYXJzZV9yZWcpOiBwYXJzZSBzZ3IgYW5kIGRici4KKworVHVlIEF1ZyAxOSAxNzowNzozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jIChzeXN0ZW1fcmVnaXN0ZXJfbmFtZSk6IFN1cHBvcnQgbnVtYmVycyBmb3IKKwlzeXN0ZW0gcmVnaXN0ZXIgSURzLgorCitUdWUgQXVnIDE5IDA4OjU5OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfbGNvbW1faW50ZXJuYWwpOiBSZW5hbWVkIGZyb20gc19sY29tbSwgYWRkZWQgYXJnIHRvCisJZmxhZyB3aGVuIGFsaWdubWVudCBpcyBpbiBieXRlcyBpbnN0ZWFkIG9mIHBvd2VyIG9mIDIsIGFuZCBjb2RlIHRvCisJdXNlIHRoYXQgZmxhZyB0byBjb252ZXJ0IGFsaWdubWVudCB0byBieXRlcy4KKwkoc19sY29tbSwgc19sY29tbV9ieXRlcyk6ICBOZXcgaGVscGVycyB0aGF0IGNhbGwgc19sY29tbV9pbnRlcm5hbC4KKwkqIHJlYWQuaCAoc19sY29tbV9ieXRlcyk6IEFkZCBwcm90b3R5cGUuCisJKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBBTElHTk1FTlRfSU5fU19GTEFHUyBpcworCWRlZmluZWQsIHdyaXRlIGFsaWdubWVudCB0byBhbGlnbm1lbnQgYml0cyBpbiBzZWN0aW9uIGhlYWRlciBzX2ZsYWdzCisJcmF0aGVyIHRoYW4gdGhlIHNfYWxpZ24gZmllbGQuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoQUxJR05NRU5UX0lOX1NfRkxBR1MpOiBEZWZpbmUgZm9yIFRDX1RJQzgwLgorCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX3BzZXVkb190YWJsZSk6IFVzZSBzX2xjb21tX2J5dGVzIGZvciBic3MKKwlwc2V1ZG8sIGluc3RlYWQgb2Ygc19sY29tbSB3aGljaCB3YW50cyBhIHBvd2VyIG9mIHR3byBmb3IgYWxpZ25tZW50LgorCitNb24gQXVnIDE4IDIwOjQyOjIzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIG1hY3JvLmMgKGNoZWNrX21hY3JvKTogdXNlIGFsbG9jYSBpbnN0ZWFkIG9mIHhtYWxsb2MgdG8gcGx1ZyBsZWFrLgorCitNb24gQXVnIDE4IDIwOjMzOjA2IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGFzLmMgKHNob3dfdXNhZ2UpOiBBZGQgLWFtLgorCSogaW5wdXQtc2NydWIuYyAoaW5wdXRfc2NydWJfaW5jbHVkZV9zYik6IERvbid0IGFkZCBsZWFkaW5nIFxuCisJaWYgd2UndmUgYWxyZWFkeSBnb3Qgb25lLgorCSogbGlzdGluZy5jIChzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IEFkZCBsaW5lX2NvbnRlbnRzLgorCShsaXN0aW5nX25ld2xpbmUpOiBQdXQgdW51c2VkIGFyZ3VtZW50IHRvIHdvcms6IGlmIG5vbi1udWxsLCBzYXZlIGl0Li4uCisJKGxpc3RpbmdfbGlzdGluZyk6IC4uLiBhbmQgcmVndXJnaXRhdGUgZHVyaW5nIGxpc3RpbmcgaW5zdGVhZCBvZiBsaW5lCisJZnJvbSBmaWxlLgorCSogbGlzdGluZy5oIChMSVNUSU5HX01BQ0VYUCk6IE5ldyBkZWZpbmUuCisJKExJU1RJTkdfTkVXTElORSk6IEFyZ3VtZW50IGlzIE5VTEwuCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIGV4cGFuZGluZyBtYWNyb3MsIGJyZWFrIHVwIGlucHV0CisJbGluZXMgYW5kIHBhc3MgdGhlbSB0byBsaXN0aW5nX25ld2xpbmUuCisJKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLWFjIGFuZCAtYW0uCisKKwkqIGNvbmQuYyAoc19pZmMpOiBBZGQgbWlzc2luZyBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgorCitNb24gQXVnIDE4IDExOjI2OjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IDE2IGJpdCBQQworCXJlbGF0aXZlIHJlbG9jLgorCitNb24gQXVnIDE4IDExOjI0OjIxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBzdXBwb3J0X3Y4NTBlIGZsYWcgYW5kIGNvbW1hbmQgbGluZQorCW9wdGlvbi4gCisJCisJKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0CisKKwkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQKKworTW9uIEF1ZyAxOCAxMToyNDoyMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgc3VwcG9ydF92ODUwZWEgZmxhZyBhbmQgY29tbWFuZCBsaW5lCisJb3B0aW9uLiAKKwkKKwkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0CisKKwkqIGNvbmZpZ3VyZSAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0CisKK0ZyaSBBdWcgMTUgMTQ6MDA6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IERvbid0IGNkIGludG8gdGVzdHN1aXRlIHVudGlsIGFmdGVyCisJc2V0dGluZyBFWFBFQ1QgYW5kIFRDTF9MSUJSQVJZLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGFzLmggKGVudW0gZGVidWdfaW5mb190eXBlKTogRGVmaW5lLgorCShkZWJ1Z190eXBlKTogRGVjbGFyZS4KKwkqIGFzLmMgKGRlYnVnX3R5cGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShzaG93X3VzYWdlKTogQWRkIC0tZ3N0YWJzLgorCShwYXJzZV9hcmdzKTogSGFuZGxlIC0tZ3N0YWJzLgorCSogcmVhZC5jIChnZW5lcmF0ZV9hc21fbGluZW5vKTogUmVtb3ZlLgorCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBPdXRwdXQgc3RhYnMgZGVidWdnaW5nIGlmIGFwcHJvcHJpYXRlLgorCUNoYW5nZSBjaGVja3Mgb2YgZ2VuZXJhdGVfYXNtX2xpbmVubyB0byBjaGVjayBkZWJ1Z190eXBlLiAgT25seQorCWdlbmVyYXRlIEVDT0ZGIGRlYnVnZ2luZyBpZiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZC4KKwkqIHJlYWQuaCAoZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERvbid0IGRlY2xhcmUuCisJKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBEZWNsYXJlLgorCSogc3RhYnMuYyAoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IE5ldyBmdW5jdGlvbi4KKwkqIGVjb2ZmLmMgKGFkZF9maWxlKTogVXNlIGRlYnVnX3R5cGUsIG5vdCBnZW5lcmF0ZV9hc21fbGluZW5vLgorCURvbid0IHR1cm4gb2ZmIGRlYnVnZ2luZy4KKwkoYWRkX2ZpbGUpOiBSZW1vdmUgb2xkICNpZiAwIGNvZGUuCisJKGVjb2ZmX25ld19maWxlKTogU2V0IGRlYnVnX3R5cGUsIG5vdCBnZW5lcmF0ZV9hc21fbGluZW5vLgorCShlY29mZl9kaXJlY3RpdmVfZW5kKTogRG9uJ3QgZ2VuZXJhdGUgc3RhYnMgbGluZSBzeW1ib2xzLgorCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogRG9uJ3QgY2hlY2sgc3RhYnNfc2Vlbi4gIERvbid0IHNldAorCWdlbmVyYXRlX2FzbV9saW5lbm8uCisJKGxpbmVfbGFiZWxfY250KTogUmVtb3ZlLgorCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogUmVtb3ZlLgorCSogZWNvZmYuaCAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYik6IERvbid0IGRlY2xhcmUuCisJKiBkb2MvYXMudGV4aW5mbywgZG9jL2FzLjE6IERvY3VtZW50IC0tZ3N0YWJzLgorCitXZWQgQXVnIDEzIDE4OjU4OjU2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlLCBtZF9zaG93X3VzYWdlLCBtZF9wYXJzZV9vcHRpb24pOgorCUFkZCBzdXBwb3J0IGZvciB2ODUwZWEgaW5zdHJ1Y3Rpb25zLgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSwgbWRfc2hvd191c2FnZSwgbWRfcGFyc2Vfb3B0aW9uKToKKwlBZGQgc3VwcG9ydCBmb3Igdjg1MGUgaW5zdHJ1Y3Rpb25zLgorCQorCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBGaXggZXJyb3IgcmVjb3ZlcnkgdG8gcmVsb2FkCisJdGV4dCBvZiBlbnRpcmUgb3Bjb2RlLiAKKworVHVlIEF1ZyAxMiAxMDoyNzozNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBkb2MvaW50ZXJuYWxzLnRleGk6IERvY3VtZW50IHJzX2xlYjEyOC4KKworVHVlIEF1ZyAxMiAxMjoxNzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIFNJWkVfQllURQorCWluIEFCU0wgY2FzZSwgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4KKworTW9uIEF1ZyAxMSAyMTo0ODowMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IEFkZCByc19sZWIxMjguCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgc2xlYjEyOCBhbmQgdWxlYjEyOC4KKwkoc2l6ZW9mXypsZWIxMjgsIG91dHB1dF8qbGViMTI4LCBlbWl0X2xlYjEyOF9leHByLCBzX2xlYjEyOCk6IE5ldworCWZ1bmN0aW9ucy4KKwkqIHJlYWQuaDogVXBkYXRlIHByb3RvdHlwZXMuCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogU3RyZWFtbGluZSBxdWl0ZSBhIGJpdC4gIFJldHVybgorCXRoZSBzeW1ib2wgdmFsdWUsIGFkZCBhIHNlY29uZCBGSU5BTElaRSBhcmd1bWVudCB0aGF0IHByZXZlbnRzIAorCWNoYW5nZXMgZnJvbSBiZWluZyBjb21pdHRlZC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwsIHJlbGF4X3NlZ21lbnQpOiBIYW5kbGUgcnNfbGViMTI4LgorCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IHRoZSBuZXcgcHNldWRvcy4KKworU3VuIEF1ZyAxMCAxNDo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQWRkIHNpdGUuYmFrLCBzaXRlLmV4cCwgc3RhZ2UsCisJc3RhZ2UxLCBhbmQgc3RhZ2UyLgorCShESVNUQ0xFQU5GSUxFUyk6IERlZmluZS4KKwkqIGRvYy9NYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBEZWZpbmUuCisJKiBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitXZWQgQXVnICA2IDAwOjMwOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gaWYgZW5kaWFuIGlzIHNldC4KKwlEb24ndCBzZXQgdGFyZyBvciBnYXNfdGFyZ2V0LiAgRGVmaW5lIFNDT19FTEYgYW5kCisJVEFSR0VUX1NPTEFSSVNfQ09NTUVOVCB3aGVuIGFwcHJvcHJpYXRlLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBmb3IKKwl0YXJnZXRfZnJhZy4KKwkqIE1ha2VmaWxlLmFtOiBSZW1vdmUgQHRhcmdldF9mcmFnQC4KKwkoSU5DTFVERVMpOiBSZW1vdmUgJChJTlRFUk5BTF9DRkxBR1MpLCAkKENST1NTKSwgJChIREVGSU5FUyksIGFuZAorCSQoVERFRklORVMpLgorCShkZXAtYW0pOiBNYXJrIGFzIHBob255LgorCSogYWNjb25maWcuaDogQWRkIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCBUQVJHRVRfU09MQVJJU19DT01NRU5ULAorCWFuZCBTQ09fRUxGLgorCSogY29uZmlnL2FybS1iaWcubXQsIGNvbmZpZy9hcm0tbGl0Lm10OiBSZW1vdmUuCisJKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdDogUmVtb3ZlLgorCSogY29uZmlnL3BwYy1iaWcubXQsIGNvbmZpZy9wcGMtbGl0Lm10OiBSZW1vdmUuCisJKiBjb25maWcvcHBjLXNvbC5tdDogUmVtb3ZlLgorCSogY29uZmlnL2kzODZjb2ZmLm10LCBjb25maWcvbTY4a2NvZmYubXQ6IFJlbW92ZS4KKwkqIGNvbmZpZy9tODhrY29mZi5tdDogUmVtb3ZlLgorCSogY29uZmlnL3NjbzUubXQ6IFJlbW92ZS4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogTWFrZWZpbGUuYW0gKCQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oKTogTmV3IHRhcmdldCwgdG8KKwlmdXJ0aGVyIHRyeSB0byBjaXJjdW12ZW50IHRoZSAueS5oIHJ1bGUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVHVlIEF1ZyAgNSAxMjozMjowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgorCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZSwgZnJvbSBvbGQgYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUKKwlzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKKwlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQUNfUFJPR19ZQUNDLAorCUFDX1BST0dfTEVYLCBhbmQgQUNfREVDTF9ZWVRFWFQuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKKwlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIERvbid0IGNhbGwgQ1lfQ1lHV0lOMzIgb3IgQ1lfRVhFRVhULgorCSogY29uZmlnLmluOiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhdXRvaGVhZGVyLgorCSogY29uZi5pbjogUmVtb3ZlLgorCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFLCBWRVJTSU9OLCBhbmQgVVNJTkdfQ0dFTi4KKwkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgorCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IENoYW5nZSBHQVNfVkVSU0lPTiB0byBWRVJTSU9OLgorCShwYXJzZV9hcmdzKTogTGlrZXdpc2UuCisJKiBjb25maWcvb2JqLXZtcy5jOiAoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogTGlrZXdpc2UuCisJKiBkb2MvTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgZG9jL01ha2VmaWxlLmluLgorCSogTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCisJKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBjb25kLmMgKHNfZWxzZSk6IElmIG5vdCBsaXN0aW5nIGZhbHNlIGNvbmRpdGlvbmFscywgdHVybiBsaXN0aW5nCisJb2ZmIGluIHRoZSBmYWxzZSBicmFuY2ggb2YgdGhlIGVsc2UuCisKK01vbiBBdWcgIDQgMTE6Mjg6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZpeCBoYW5kbGluZyBvZiBhIGRvdWJsZSBsb2FkIGZyb20gYQorCXN5bWJvbCBwbHVzIGFuIG9mZnNldC4KKworCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IFNldCBmTWVyZ2UgdG8gMCBmb3IgYW4gRkRSIHdoaWNoCisJaGFzIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgc3ltYm9sLgorCitTdW4gQXVnICAzIDIzOjIzOjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisgCisgICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfdWNvbnMpOiBOZXcgZnVuY3Rpb24uCisgICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgdW5hbGlnbmVkIGRhdGEgcHNldWRvcyBmb3IgRFdBUkYuCisKK1RodSBKdWwgMzEgMTU6MTM6NDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElnbm9yZSB0aGUgcmVzdCBvZiB0aGUgY3VycmVudAorCWxpbmUgaWYgd2UgZW5jb3VudGVyIGFuIGVycm9yLgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFNpZ24gZXh0ZW5kIGNvbnN0YW50cyB2YWx1ZQorCWZvciBoaSBhbmQgaGkwIGV4cHJlc3Npb25zLgorCSh2ODUwX2luc2VydF9vcGVyYW5kKTogRW5hYmxlIHJhbmdlIGNoZWNraW5nIGZvciBnZW5lcmljIDE2Yml0CisJb3BlcmFuZHMuCisKK1R1ZSBKdWwgMjkgMTQ6MjA6NDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFR1cm4gb24gZnhfbm9fb3ZlcmZsb3cgZm9yCisJTE8xNiwgSEkxNiBhbmQgSEkxNl9TIHJlbG9jcy4KKworTW9uIEp1bCAyOCAxODo0MTo0MSAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlLmluOiBVc2UgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm8gdG8gbG9vayBmb3IKKyAgICAgICAgd2luMzIgZGVwZW5kZW5jaWVzLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZiAyLjEyLgorICAgICAgICAqIE1ha2VmaWxlLmluOiBBZGQgJChFWEVFWFQpIHRvIGFsbCBleGVjdXRhYmxlcy4KKworRnJpIEp1bCAyNSAxMDo1NDo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHRjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogSW1wcm92ZSB3YXJuaW5ncyBmb3Igb3V0IG9mIHJhbmdlCisJdW5jb25kaXRpb25hbCBicmFuY2hlcy4KKwkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBhbnl0aGluZyB3aXRoIGEgUlIlIG9yIExSJQorCWZpZWxkIHNlbGVjdG9yLgorCitUaHUgSnVsIDI0IDE1OjIxOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHRjLXNwYXJjLmMgKG1kX2JlZ2luKTogQ2FzdCBzcGFyY19vcGNvZGVzIHRvIFBUUiBmb3IgaGFzaF9pbnNlcnQuCisKK1RodSBKdWwgMjQgMTc6NTE6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtYWNyby5jIChkZWZpbmVfbWFjcm8pOiBNYWtlIHN1cmUgdGhlIGluZGV4IGlzIGluIHJhbmdlIGJlZm9yZQorCWNoZWNraW5nIGZvciAnKCcuCisKK1RodSBKdWwgMjQgMTI6MTM6MTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogUmVtb3ZlICJleHRlbmRlZCIgYW5kIHJlcGxhY2Ugd2l0aAorIAkiZngiIGFuZCAiZnhmcmFnIi4gIEFkZCAiZmZyYWciLiAgQ2hhbmdlIGNvZGUgdG8gaW5pdGlhbGl6ZSBhbmQgdXNlCisJdGhlIHJpZ2h0IGYvZmZyYWcgYW5kIGZ4L2Z4ZnJhZyBwYWlycyBzaW5jZSBpbnN0cnVjdGlvbiBtYXkgYmUgc3BsaXQKKyAJYWNyb3NzIGZyYWdzLgorCitUdWUgSnVsIDIyIDE4OjM4OjU2IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KKworCSogY29uZmlnL3RlLWdvMzIuaCAoVVNFX0FMSUdOX1BUV08pOiBEZWZpbmUuCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBVU0VfQUxJR05fUFRXTyBpcworCWRlZmluZWQsIHVzZSBzX2FsaWduX3B0d28gZm9yIC5hbGlnbi4KKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW1zZG9zZGpncHAqKTogTmV3IHRhcmdldC4KKwkoaTM4Ni0qLWdvMzIqKTogU2V0IGVtIHRvIGdvMzIgYW5kIHRhcmcgdG8gY29mZmdvMzIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1R1ZSBKdWwgMjIgMTI6NDE6NDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKGxhc3Rfb3Bjb2RlKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkobWRfYXNzZW1ibGUpOiBEb24ndCBpc3N1ZSAiRlAgYnJhbmNoIGluIGRlbGF5IHNsb3QiIHdhcm5pbmcgaWYKKwl0aGUgZGVsYXkgc2xvdCBoYXMgYmVlbiBhbm51bGxlZC4KKworVHVlIEp1bCAyMiAxMzoyNToxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogQ2hlY2sgZm9yIFBDIHJlbGF0aXZlIHJlbG9jCisJY29kZSBpZiBCRkRfQVNTRU1CTEVSLgorCitNb24gSnVsIDIxIDA4OjU3OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAoc3lzdGVtX3JlZ2lzdGVycyk6IEZpeCBvcmRlcmluZyBvZiByZWdpc3RlcnMuCisKK1R1ZSBKdWwgMTUgMTY6Mjk6NTQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogSW5pdGlhbGl6ZSBleHRlbmRlZCB3b3JkIHRvIHplcm8KKwl3aGVuIGl0IHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyIGJ5IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK01vbiBKdWwgMTQgMjM6MTA6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFJlc3RvcmUgY2hlY2sgb2YgZm10IGFyZ3VtZW50LgorCShtaXBzX2lwKTogRml4IElTQSBjaGVja3MuCisKK01vbiBKdWwgMTQgMTk6MzA6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy10aWM4MC5jIChidWlsZF9pbnNuKTogRml4IGVuZGlhbm5lc3MgcHJvYmxlbSB3aXRoCisJT19iaWcgb3BlcmFuZHMuCisKK1N1biBKdWwgMTMgMjA6NDM6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChjaGVja19hYnNvbHV0ZV9leHByKTogQ2hhbmdlIHdhcm5pbmcgdG8KKwllcnJvci4KKworRnJpIEp1bCAxMSAxMDoxODo0NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUmVmaW5lIGNvZGUgdG8gY2hlY2sgaWYgYW4KKwlpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgb24gYSBwYXJ0aWN1bGFyIGNwdSB2YXJpYW50LgorCShtaXBzX2lwKTogTGlrZXdpc2UuCisKK01vbiBKdWwgIDcgMjI6NTM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogQ2hhbmdlIGlmbmRlZgorCU9CSl9BT1VUIHRvIGlmZGVmIE9CSl9FTEYuCisJKG1kX2FwcGx5X2ZpeDMpOiBXaGVuIG1hbmdsaW5nIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvYyBmb3IKKwlCRkRfQVNTRU1CTEVSLCBoYW5kbGUgb25lIEVMRiBjYXNlIGZvciBDT0ZGIGFzIHdlbGwsIGFuZCBhZGQgYSBQRQorCWNhc2UuCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogQ2hhbmdlIHNwZWNpYWwgY2FzZSBmb3IgaTM4Ni1jb2ZmIHRvCisgCW5vdCBhcHBseSBmb3IgaTM4Ni1wZS4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBPbmx5IGNvdW50IGZpeHVwcworCXdoaWNoIHdlcmUgbm90IGRvbmUuCisJKGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IFJlbmFtZSBmcm9tIGNvZmZfZnJvYl9maWxlLgorCShjb2ZmX2Zvcm1hdF9vcHMpOiBJbml0aWFsaXplIGZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQgcmF0aGVyCisJdGhhbiBmcm9iX2ZpbGUgZmllbGQuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBkZWNsYXJlLgorCShjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWNsYXJlLgorCShvYmpfZnJvYl9maWxlKTogRG9uJ3QgZGVmaW5lLgorCShvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlZmluZS4KKwkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgdG8geWVzIGZvciBpMzg2LSotY3lnd2luMzIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBKdWwgIDIgMTI6MDU6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IE5ldmVyIHN1YnRyYWN0IHNlY3Rpb24KKwlhZGRyZXNzIGZyb20gUEMgcmVsYXRpdmUgcmVsb2Mgd2hpY2ggd2lsbCBiZSBmdWxseSByZXNvbHZlZC4KKworVHVlIEp1bCAgMSAxNToyMzowNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmMgKHBhZ2VfdHlwZSk6IFJlbmFtZWQgZnJvbSBwYWdlX3QgdG8gYXZvaWQgY29uZmxpY3QKKwl3aXRoIGhwdXgxMCBoZWFkZXIgZmlsZXMuCisKK01vbiBKdW4gMzAgMTI6Mjc6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBKYXNvbiBNZXJyaWxsIDxqYXNvbkBjeWdudXMuY29tPjoKKwkqIHJlYWQuYyAoZG9fYWxpZ24pOiBJZiBCRkRfQVNTRU1CTEVSLCBvbmx5IHVzZSBOT1BfT1BDT0RFIGlmCisJU0VDX0NPREUgaXMgc2V0LgorCSogY29uZmlnL3RjLWkzODYuaCAobWRfbWF5YmVfdGV4dCk6IERlZmluZS4KKwkobWRfZG9fYWxpZ24pOiBVc2UgbWRfbWF5YmVfdGV4dC4KKworRnJpIEp1biAyNyAxOToxNToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IE9ubHkgY2hlY2sgZm9yIEdPVCB0eXBlCisJcmVsb2NhdGlvbnMsIGRvbid0IGNoZWNrIGZvciBzeW1ib2wgYmVpbmcgZXh0ZXJuYWwsIHdlYWssIGV0Yy4KKworTW9uIEp1biAxNiAxOToxMjo1MSAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgbGV0IHRoZSBhc3NlbWJsZXIKKwljYWxjdWxhdGUgcmVsb2NhdGlvbnMgdG8gYW55IGV4dGVybmFsIHN5bWJvbCwgYmVjYXVzZSB3ZSBtaWdodCBiZQorCWxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0IGFuZCB0aGUgc3ltYm9sIG1pZ2h0IGJlIG92ZXJyaWRlbiBvciBtb3ZlZAorCShmb3IgaW5zdGFuY2UsIG1vdmVkIGludG8gYSBzdGF0aWMgZXhlY3V0YWJsZSdzIC5ic3Mgc2VjdGlvbikuCisJKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlbGV0ZS4gVGhpcyBpcyBhbiBpMzg2IHdpZXJkbmVzcy4KKworCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IEdPVC1iYXNlZCByZWxvY2F0aW9ucyBjYW4ndAorCWJlIGNhbGN1bGF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIEBwbHQgb3IgQGxvY2FsIGJyYW5jaAorCXdob3NlIGRlc3RpbmF0aW9uIGxpZXMgaW4gdGhlIHNhbWUgZmlsZSwgYnkgaWdub3JpbmcgdGhlIEBwbHQgb3IKKwlAbG9jYWwgYW5kIGFpbWluZyB0aGUgYnJhbmNoIGF0IGl0cyBkZXN0aW5hdGlvbi4KKworTW9uIEp1biAxNiAxMzo1OToxOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBzeW1ib2xzLmMgKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBDb3B5IEJTRl9PQkpFQ1QgZmxhZy4KKwkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogQ29weSBzaXplCisJZXhwcmVzc2lvbi4KKworCSogY29uZmlnL29iai1tdWx0aS5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IERlZmluZSBpbnN0ZWFkCisJb2Ygb2JqX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMuCisKK01vbiBKdW4gMTYgMTI6NDU6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IEluIDMyIGJpdCBtb2RlLCB3aXRoIGEKKwlzaWduZWQgb3BlcmFuZCwgc2lnbiBleHRlbmQgYSAzMiBiaXQgdmFsdWUgdG8gdGhlIGhvc3Qgc2l6ZS4KKworCSogTWFrZWZpbGUuaW4gKENGTEFHUyk6IFN1YnNpdHV0ZSBmcm9tIGNvbmZpZ3VyZSBzY3JpcHQuICBGcm9tCisJSmVmZiBNYWtleSA8amVmZkBjdHMuY29tPi4KKworCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogVXNlIGFsbG9jYSByYXRoZXIgdGhhbiBhIGZpeGVkCisJYnVmZmVyIHNpemUgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHN5bWJvbC4KKworCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBQdXQgQGV4dHJhX29iamVjdHNAIG9uIHRoZSBzYW1lIGxpbmUgYXMKKwltYWNyby5vLgorCitUaHUgSnVuIDEyIDEyOjE2OjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJbiBub24gQkZEX0FTU0VNQkxFUiBjb2RlLCBhcyB3ZQorCXN0ZXAgdGhyb3VnaCB0aGUgZnJhZ3MgY2FsbGluZyBjdnRfZnJhZ190b19maWxsLCBzd2l0Y2ggdG8KKwlTRUdfREFUQSB3aGVuIHdlIHJlYWNoIGRhdGFfZnJhZ19yb290LgorCitUdWUgSnVuIDEwIDE3OjA4OjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBBbGxvdyBhbiBlbXB0eSByZWdpc3RlcgorCWxpc3QgZm9yIGluc3RydWN0aW9ucyB3aGljaCB1c2UgcmVnaXN0ZXIgbGlzdHMuCisKK1R1ZSBKdW4gMTAgMTE6MTg6MDkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogTWFrZSB0ZW1wIHVuc2lnbmVkIGxvbmcuCisKKwkqIGNvbmZpZy90Yy1hcm0uYyAoYXJtX2FkanVzdF9zeW10YWIpOiBPbmx5IHNldCBzdG9yYWdlIGNsYXNzZXMgaWYKKwlPQkpfQ09GRi4KKworCSogY29uZmlnL3RjLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IgbWFueSBzdGF0aWMgZnVuY3Rpb25zLgorCShzdHJ1Y3QgYXNtX29wY29kZSApOiBBZGQgcHJvdG90eXBlcyBmb3IgcGFybXMgZmllbGQuCisJKHN0cnVjdCB0aHVtYl9vcGNvZGUgKTogTGlrZXdpc2UuCisJKGZwX29wMik6IFJlbW92ZSB1bnVzZWQgZmxhZ3MgcGFyYW1ldGVyLgorCShvdXRwdXRfaW5zdCk6IE1ha2Ugc3RhdGljLgorCShhcm1fYWZ0ZXJfcGFzc19ob29rKTogUmVtb3ZlIHVudXNlZCBpZ25vcmUgcGFyYW1ldGVyLgorCSogY29uZmlnL3RjLWFybS5oIChhcm1fYWZ0ZXJfcGFzc19ob29rKTogRGVjbGFyZS4KKwkoYXJtX3N0YXJ0X2xpbmVfaG9vayk6IERlY2xhcmUuCisJKGFybV9mcm9iX2xhYmVsKTogRGVjbGFyZS4KKworTW9uIEp1biAgOSAxMjo1NTo0NSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBkZXBlbmQuYyAod3JhcF9vdXRwdXQpOiBuZXcgcHJvdG90eXBlLgorCitNb24gSnVuICA5IDEyOjUyOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IENoZWNrIGZvciBvdmVyZmxvdy4KKworCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2VjdGlvbl9hbGlnbik6IElmIGEub3V0IGFuZCBCRkQsIGZvcmNlCisJc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuCisKK0ZyaSBKdW4gIDYgMTc6MTU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guaCAobWRfY29uc19hbGlnbik6IERlZmluZS4KKwkoc2hfY29uc19hbGlnbik6IERlY2xhcmUuCisJKiBjb25maWcvdGMtc2guYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC51YXdvcmQgYW5kIC51YWxvbmcuCisJKHNoX25vX2FsaWduX2NvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShzX3VhY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNoX2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCisJKHNoX2hhbmRsZV9hbGlnbik6IFdhcm4gYWJvdXQgbWlzYWxpZ25lZCBkYXRhLgorCSogZG9jL2Mtc2gudGV4aTogRG9jdW1lbnQgLnVhd29yZCBhbmQgLnVhbG9uZy4KKworVGh1IEp1biAgNSAxNTozODoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZCk6IEluIE1SSSBtb2RlLCB0cmVhdCBzaW5nbGUgcXVvdGUgYXMgYQorCXNlcGFyYXRvciBjaGFyYWN0ZXIgd2hlbiBjaGVja2luZyBmb3IgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LgorCitUdWUgSnVuICAzIDE2OjE1OjEzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfcGFyc2Vfb3B0aW9uKTogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tCisJYXJtVC05NzAzMjgtYnJhbmNoLgorCisJKiBjb25maWcvdGMtYXJtLmg6IE1lcmdlIGluIGNoYW5nZXMgZnJvbSBhcm1ULTk3MDMyOC1icmFuY2guCisKKwkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBUaHVtYiBhcmNoaXRlY3R1cmUgc3VwcG9ydCBmcm9tCisJYXJtVC05NzAzLTI4LWJyYW5jaC4KKworTW9uIEp1biAgMiAxNjoyNTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkb2MvYWxsLnRleGk6IEFkZCBlbmFibGluZyBvZiBBUk0gZG9jdW1lbnRhdGlvbi4KKworCSogZG9jL2FzLnRleGluZm86IEFkZCBBUk0gZG9jdW1lbnRhdGlvbiBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KKworTW9uIEp1biAgMiAxMTo1NToxMiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgcjM5MDAgc3VwcG9ydC4KKworVGh1IE1heSAyOSAxMjo1ODoyNiAxOTk3ICBCZW4gUGZhZmYgIDxwZmFmZmJlbkBwaWxvdC5tc3UuZWR1PgorCisJKiBhcy5jOiAocGFyc2VfYXJncykgYC10JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQuCisKK1dlZCBNYXkgMjggMTU6NDU6MDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5jIChtZF9iZWdpbik6IENoYW5nZSBjYWxsIHRvCisJY29mZl9hcm1fYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkgdG8gYSBjYWxsIHRvCisJYmZkX3NldF9wcml2YXRlX2ZsYWdzKCkuIAorCitXZWQgTWF5IDI4IDE2OjE3OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBEb24ndCB0cnkgdG8gY29udmVydCB0aGUgdHlwZQorIAlvZiBhIEJGRF9SRUxPQ19SVkEgcmVsb2MuCisKK1dlZCBNYXkgMjggMTA6NDg6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaHBwYS5jICh0Y19maXhfYWRqdXN0YWJsZSk6IFJlamVjdCBhYnNvbHV0ZSBjYWxscy9qdW1wcy4KKwkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgYSByZWxvY2F0aW9uIGZvciBhbiBhYnNvbHV0ZQorCWNhbGwvanVtcC4KKworTW9uIE1heSAyNiAxMzoyNDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRvYy9hcy50ZXhpbmZvOiBEb24ndCB1c2UgQHZhbHVlIGluIHNlY3Rpb24gbmFtZXMgb3IgaW5kZXgKKwllbnRyaWVzOyBpdCBjb25mdXNlcyB0ZXhpbmZvLnRleC4KKworRnJpIE1heSAyMyAwMDowOTozNSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGRvYy9hcy50ZXhpbmZvOiBVcGRhdGVkIGZvciAtTUQgb3B0aW9uLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZGVkIGRlcGVuZC5jLgorCShPQkpTKTogQWRkZWQgZGVwZW5kLm8uCisJKiBhcy5oIChzdGFydF9kZXBlbmRlbmNpZXMsIHJlZ2lzdGVyX2RlcGVuZGVuY3ksCisJcHJpbnRfZGVwZW5kZW5jaWVzKTogTmV3IGRlY2xhcmF0aW9ucy4KKwkqIGRlcGVuZC5jOiBOZXcgZmlsZS4KKwkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBBZGRlZCAtTUQgb3B0aW9uLgorCShtYWluKTogQ2FsbCBwcmludF9kZXBlbmRlbmNpZXMuCisJKHNob3dfdXNhZ2UpOiBBZGRlZCBoZWxwIGZvciAtTUQuCisJKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBDYWxsIHJlZ2lzdGVyX2RlcGVuZGVuY3kuCisJKHNfaW5jbHVkZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeSB3aGVuIGZpbGUgaXMgZm91bmQuCisJKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeS4KKworV2VkIE1heSAyMSAxNzozOToyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChzeW1ib2xfdG9fY2hhcnMpOiBJZiBURV9QRSwgZG9uJ3QgYWRkIHRoZQorCXNlY3Rpb24gYWRkcmVzcyB0byB0aGUgc3ltYm9sIHZhbHVlLgorCitUdWUgTWF5IDIwIDExOjIzOjMxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCxtaXBzX2lwKTogTW92ZSB0aGUgSU5TTl9JU0EgZmllbGQKKwlpbnRvIHRoZSBuZXcgbWVtYmVyc2hpcCBmaWVsZC4KKworVGh1IE1heSAxNSAxMDowMDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogSWYgbm8gY3B1IHR5cGUgaXMgc3BlY2lmaWVkIG9uIHRoZQorCWNvbW1hbmQgbGluZSB0aGVuIHRoZSBBUk03IGlzIG5vdyBjaG9zZW4gYnkgZGVmYXVsdCB3aGVuIHNldHRpbmcKKwl0aGUgQkZEIG1hY2hpbmUgYW5kIGFyY2hpdGVjdHVyZS4KKworV2VkIE1heSAxNCAwOTo1NDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtYXJtLmMgKGdsb2JhbCB2YXJpYWJsZXMpOiBBZGRlZCAndXNlc19hcGNzXzI2JyBmbGFnIHRvCisJaG9sZCBBUENTIHNlbGVjdGlvbi4KKyAgCShtZF9iZWdpbik6IEFkZGVkIGNvZGUgdG8gZ2VuZXJhdGUgZmxhZ3MgdG8gYmUgc2V0IGludG8gdGhlIENPRkYKKwloZWFkZXIgYW5kIHRoZSBjYWxscyB0byB0aGUgQkZEIGZ1bmN0aW9ucyB0byBkbyB0aGlzLgorICAJKG1kX3BhcnNlX29wdGlvbiwgbWRfc2hvd191c2FnZSk6IEFkZGVkIG5ldyBjb21tYW5kIGxpbmUKKwlvcHRpb25zIC1tYXBjcy0zMiwgLW1hcGNzLTI2LCAtbWFybXYyLCAtbWFybXYyYSwgLW1hcm12MywKKwktbWFybXYzbSwgLW1hcm12NCwgLW1hcm12NHQuIAorCisJKiB0Yy1hcm0uaCAoTE9DQUxfTEFCRUwpOiBSZW1vdmVkIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgbWFjcm8KKwlhcyBpdCBpcyBuZXZlciB1c2VkLgorCitUdWUgTWF5IDEzIDIyOjI2OjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfY29udmVydF9mcmFnKTogUHJlZml4IHRlbXBvcmFyeQorCWxhYmVsIG5hbWUgd2l0aCAiLiIuCisJKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KKworVHVlIE1heSAxMyAxNDo0NDozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKHNldF9hdCk6IENoZWNrIGZvciBiaWdudW0uCisJKGNoZWNrX2Fic29sdXRlX2V4cHIsIG1hY3JvLCBtaXBzMTZfbWFjcm8pOiBMaWtld2lzZS4KKworVHVlIE1heSAxMyAxMDo0NTo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2FwcGx5X2ZpeCk6IENoZWNrIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zCisJZm9yIG92ZXJmbG93L3VuZGVyZmxvdywgb25seSBpbnNlcnQgbG93ZXIgMTUgYml0cyBpbnRvIGluc3RydWN0aW9uLgorCitNb24gTWF5IDEyIDEzOjMzOjA4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHBpKTogQ2hlY2sgZm9yIFJlZ01NWC4KKworVGh1IE1heSAgOCAxMToxMDoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGV4cHIuYyAoZXhwcik6IFdoZW4gc3VidHJhY3RpbmcgdmFsdWVzIGluIHRoZSBzYW1lIGZyYWcsCisJc3VidHJhY3QgWF9hZGRfbnVtYmVyIHJhdGhlciB0aGFuIGFkZGluZyBpdC4KKworV2VkIE1heSAgNyAxNTozOTo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEp1c3QgcGFzcyBOVUxMIHRvCisgCW1kX2RvX2FsaWduLCBub3QgdGhlIGFkZHJlc3Mgb2YgYSBjaGFyIGhvbGRpbmcgTk9QX09QQ09ERS4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBIYW5kbGUgY29uc3RhbnRzIGZvciBNX0xJX0QgYW5kCisJTV9MSV9ERC4KKwkobWlwc19pcCk6IEZvciAnRicsICdMJywgJ2YnLCBhbmQgJ2wnLCBnZW5lcmF0ZSBhIGNvbnN0YW50IHJhdGhlcgorCXRoYW4gYW4gYWRkcmVzcyBpZiB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgbG9va3Mgc3VmZmljaWVudGx5CisJc2ltcGxlLgorCitUdWUgTWF5ICA2IDEyOjE4OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfc2VjdGlvbl9hbGlnbik6IElmIGEub3V0IGFuZCBCRkQsIGZvcmNlCisJc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuCisKK01vbiBNYXkgIDUgMTc6MTY6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25kLmM6IEluY2x1ZGUgIm1hY3JvLmgiLgorCShzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUpOiBBZGQgbWFjcm9fbmVzdCBmaWVsZC4KKwkoaW5pdGlhbGl6ZV9jZnJhbWUpOiBJbml0aWFsaXplIG1hY3JvX25lc3QuCisJKGNvbmRfZmluaXNoX2NoZWNrKTogQWRkIG5lc3QgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShjb25kX2V4aXRfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCisJKiBhcy5oIChjb25kX2ZpbmlzaF9jaGVjayk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkoY29uZF9leGl0X21hY3JvKTogRGVjbGFyZS4KKwkqIGlucHV0LXNjcnViLmMgKG1hY3JvX25lc3QpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogQ2FsbCBjb25kX2ZpbmlzaF9jaGVjay4KKwkqIG1hY3JvLmggKG1hY3JvX25lc3QpOiBEZWNsYXJlLgorCSogcmVhZC5jIChzX21leGl0KTogQ2FsbCBjb25kX2V4aXRfbWFjcm8uCisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKFJlZ01NWCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHBpKTogQ2hlY2sgZm9yIGFsbCByZWdpc3RlciB0eXBlcy4KKwkodHlwZV9uYW1lcyk6IEFkZCBSZWdNTVguCisJKG1kX2Fzc2VtYmxlKTogSGFuZGxlIFJlZ01NWC4KKworV2VkIEFwciAzMCAxMjo0NzowMCAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogQ2xlYXIgdGhlIExPQ0FMIGJpdCAjaWZkZWYKKwlURV9ERUxUQS4KKworVHVlIEFwciAyOSAyMDoyMzoxMCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG5vcGljX25lZWRfcmVsYXgpOiBBZGQgbmV3IHBhcmFtZXRlcgorCWJlZm9yZV9yZWxheGluZy4gIFVzZSBpdCB3aGVuIHRlc3RpbmcgZWNvZmZfZXh0ZXJuX3NpemUuCisJKGxvYWRfYWRkcmVzcywgbWFjcm8sIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRml4IGFsbAorCWNhbGxlcnMuCisKK1R1ZSBBcHIgMjkgMTk6NTQ6MzYgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgInN1YnNlY3Rpb24iLgorIAkob2JqX2VsZl9zdWJzZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworVHVlIEFwciAyOSAxOTo1Mjo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2hlYWRlcl9hcHBlbmQpOiBEb24ndCByZXNldCBzdHJpbmdfc2l6ZQorCWVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLgorCitGcmkgQXByIDI1IDE0OjE3OjQ2IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgaXRibC1wYXJzZS5oLgorCitGcmkgQXByIDI1IDEyOjAzOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL2ludGVybmFscy50ZXhpIChQb3J0aW5nIEdBUyk6IENvcnJlY3QgZG9jdW1lbnRhdGlvbiBmb3IKKwljdXJyZW50IGNvbmZpZ3VyZSBoYW5kbGluZyBvZiB0YXJnLWNwdS5oLCBldC4gYWwuCisJKENQVSBiYWNrZW5kKTogRG9jdW1lbnQgbGlzdGluZyBtYWNyb3MuCisKKwkqIGxpc3RpbmcuYyAoZGF0YV9idWZmZXIpOiBTZXQgc2l6ZSBiYXNlZCBvbiBvdGhlciBsaXN0aW5nIG1hY3JvcywKKwlyYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgMTAwLgorCShkYXRhX2J1ZmZlcl9zaXplKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KKwkoY2FsY19oZXgpOiBNYWtlIGRhdGFfYnVmZmVyX3NpemUgYSBsb2NhbCB2YXJpYWJsZS4gIERvbid0IGxlYXZlCisJYW55IHNsb3Agd2hlbiBmaWxsaW5nIGRhdGFfYnVmZmVyLgorCitNb24gQXByIDIxIDE1OjMzOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAuc2V0IGF1dG9leHRlbmQuCisKK1NhdCBBcHIgMTkgMjM6MDk6MjUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BwZXRyYS5hcHBsaS5zZT4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotb3BlbmJzZCosIG02OGstKi1vcGVuYnNkKiwKKwltaXBzLWRlYy1vcGVuYnNkKiwgcHBjLSotKmJzZCosIG5zMzJrLXBjNTMyLW9wZW5ic2QqLAorCXNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworU2F0IEFwciAxOSAyMjo1MjowMyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IElmIFRDX01JUFMsIHNldCBCU0ZfT0JKRUNUCisJZm9yIGFsbCB1bmRlZmluZWQgc3ltYm9scy4KKworRnJpIEFwciAxOCAxMzozNzozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogSGFuZGxlIHplcm8gbGVuZ3RoIGNzZWN0cworCWNvcnJlY3RseS4KKworRnJpIEFwciAxOCAxMTo1MTozNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgorCisJKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLW9wZW5ic2QqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IEFwciAxNyAxMzo1OTo0NyAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLW9wZW5ic2QqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIEFwciAxNiAxMjozMToyNCAxOTk3ICBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IEZpeCBwYXJhbGxlbCBjaGVja2luZworCWZvciBpbnN0cnVjdGlvbnMgdXNpbmcgY29uZGl0aW9uYWwgZXhlY3V0aW9uLgorCitUdWUgQXByIDE1IDE4OjExOjQ0IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX3VzZXNfcmVnKTogQ29ycmVjdCB0ZXN0IGZvciBmcHIgcGFpcnMuCisKK1R1ZSBBcHIgMTUgMTM6MDQ6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoc3Jjcm9vdCk6IFJlbW92ZS4KKyAJKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgorCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KKwkoYWxsLCBkdmkpOiBEb24ndCBzZXQgc3Jjcm9vdC4KKwkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGFzLm5ldywgZ2FzcC5uZXcsIGFuZCBpbnN0YWxsZGlycy4gIFVzZQorCSQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nCisJJChJTlNUQUxMX1hGT1JNKSBhbmQgJChJTlNUQUxMX1hGT1JNMSkuCisJKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KKwkqIGRvYy9NYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCisJKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4gIFVzZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCisJZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nICQoSU5TVEFMTF9YRk9STSkgYW5kCisJJChJTlNUQUxMX1hGT1JNMSkuCisJKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbC1pbmZvLWFzKTogUnVuIG1raW5zdGFsbGRpcnMuCisJKGluc3RhbGwtaW5mby1nYXNwKTogTGlrZXdpc2UuCisKK01vbiBBcHIgMTQgMTE6NTk6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCisKKwkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBDaGVjayBmb3IgZGl2aXNpb24gYnkgemVyby4KKworCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKKwkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KKwkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBBcHIgMTAgMTQ6NDA6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2dlbi5jIChjZ2VuX3BhcnNlX29wZXJhbmQpOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fcGFyc2Vfb3BlcmFuZC4KKwlOZXcgYXJndW1lbnQgYHdhbnQnLiAgVXBkYXRlIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCB2YWx1ZXMuCisJSW5pdGlhbGl6ZSBpZiBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVC4KKwkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogU2V0IGNnZW5fcGFyc2Vfb3BlcmFuZF9mbi4KKwkobWRfYXNzZW1ibGUpOiBDYWxsIGNnZW5fYXNtX2luaXRfcGFyc2UuCisJVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24sIGNhbGwgYXNfYmFkIGlmIGFzc2VtYmx5IGZhaWxlZC4KKworV2VkIEFwciAgOSAxMTo0OTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBIYW5kbGUgI2ouCisKK1R1ZSBBcHIgIDggMTY6Mzc6NTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDcmVhdGUgZml4dXAgYXQgdGhlCisJcmlnaHQgYWRkcmVzcyBmb3IgY2FsbCBsYWJlbDozMixyZWdzLGltbS4KKworTW9uIEFwciAgNyAxNDo1ODoyMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlX3N0YXJ0KTogSWYgT0JKX0VMRiwgdGhlbiBhbHdheXMgcmV0dXJuCisJemVyby4KKwkqIGNvbmZpZy90Yy1ocHBhLmggKHRjX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgcmVzZXQgdGhlIHZhbHVlIG9mIHRoZQorCXN5bWJvbCBmb3IgT0JKX0VMRiBhbnltb3JlLgorCitNb24gQXByICA3IDEwOjU0OjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlIGRlcGVuZGVuY2llcy4KKyAJKFRBUkdfQ1BVKTogTmV3IHZhcmlhYmxlLgorCShjZ2VuLm8pOiBEZXBlbmQgb24gY2dlbi5oLCAkKFRBUkdfQ1BVKS1vcGMuaC4KKwkoLmRlcDEpOiBEZWxldGUgY3JlYXRpbmcgb2YgY2dlbi1vcGMuaC4KKwkoLnRjZGVwKTogUHV0IHByb3BlciBjb250ZW50cyBpbiBjZ2VuLW9wYy5oLgorCSogY29uZmlndXJlLmluIChtMzJyKTogRGVsZXRlIHNldHRpbmcgb2YgZXh0cmFfZmlsZXMsIGV4dHJhX2xpbmtzLgorCShBQ19PVVRQVVQpOiBDcmVhdGUgY2dlbi1vcGMuaC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1NhdCBBcHIgIDUgMTM6MTk6MTIgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIGJ1aWxkIGdhc3AuZXhlLgorCitGcmkgQXByICA0IDE2OjEwOjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKHJlbGF4X2ZyYWcpOiBNYWtlIG5vbi1zdGF0aWMuCisJKiB3cml0ZS5oIChyZWxheF9mcmFnKTogQWRkIHByb3RvdHlwZSBmb3IuCisJKiBjb25maWcvdGMtbTMyci5oIChtZF9kb19hbGlnbik6IE5ldyBhcmcgYG1heCcuCisJKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogTGlrZXdpc2UuCisJVXBkYXRlIGNhbGxzIHRvIGZyYWdfYWxpZ24sIGZyYWdfYWxpZ25fcGF0dGVybi4KKwkoZmlsbF9pbnNuKTogVXBkYXRlIGNhbGwgdG8gbTMycl9kb19hbGlnbi4KKwkobTMycl9zY29tbSk6IFVwZGF0ZSBjYWxsIHRvIGZyYWdfYWxpZ24uCisKKwkqIGNvbmZpZy90Yy1tMzJyLltjaF06IE5ldyBmaWxlcy4KKwkqIGNnZW4uYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoQ1BVX1RZUEVTKTogQWRkIG0zMnIuCisJKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIHRjLW0zMnIuYy4KKwkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgdGMtbTMyci5oLgorCShESVNUQ0xFQU5fSEVSRSk6IEFkZCBjZ2VuLW9wYy5oLgorCSguZGVwMSwudGNkZXApOiBDcmVhdGUgZW1wdHkgY2dlbi1vcGMuaC4KKwkoY2dlbi5vKTogQWRkIGRlcGVuZGVuY2llcy4KKwkoZGVwZW5kZW5jaWVzKTogUmVnZW5lcmF0ZS4KKwkqIGFzLmggKHN0cnVjdCBmcmFnKTogTmV3IG1lbWJlciBmcl90YXJnLgorCShmcl9wY3JlbF9hZGp1c3QsZnJfYnNyKTogTW92ZSBpbnRvIHVuaW9uIGZyX3RhcmcubnMzMmsuCisJKiBjb25mLmluIChVU0lOR19DR0VOKTogTmV3IG1hY3JvLgorCSogY29uZmlndXJlLmluIChtMzJyLSotKik6IEFkZCBlbnRyeSBmb3IuCisJQWRkIGNnZW4ubyB0byBleHRyYV9vYmplY3RzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZnJhZ3MuYyAoZnJhZ192YXIpOiBmcl9wY3JlbF9hZGp1c3QgcmVuYW1lZCB0bworCWZyX3RhcmcubnMzMmsucGNyZWxfYWRqdXN0LiAgZnJfYnNyIHJlbmFtZWQgdG8gZnJfdGFyZy5uczMyay5ic3IuCisJKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgorCSogd3JpdGUuYyAocmVsYXhfZnJhZyk6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLW5zMzJrLmMgKCopOiBMaWtld2lzZS4KKworRnJpIEFwciAgNCAxMzoyNjoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX0VPTF9JTl9JTlNOKTogQ2hlY2sgZXhwbGljaXRseSBmb3IgJyEnLAorCXJhdGhlciB0aGFuIGZvciBhbnkgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgorCisJKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBJZiBocHBhX3Jlbl9yZWxvY190eXBlIGZhaWxzLAorCWNhbGwgYWJvcnQgKGkuZS4sIGFzX2Fib3J0KSByYXRoZXIgdGhhbiBjcmFzaGluZy4KKworCSogY29uZmlnL3RjLW1pcHMuYzogUHJvdGVjdCB1c2VzIG9mIFNUT19NSVBTMTYgd2l0aCBhbiBpZmRlZiBvZgorCU9CSl9FTEYsIHJhdGhlciB0aGFuIG9mIFNfR0VUX09USEVSLgorCisJKiBNYWtlZmlsZS5pbiAoRElTVENMRUFOX0hFUkUpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgorCitUaHUgQXByICAzIDEzOjE2OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gMi44LjEuCisKKwkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KKworV2VkIEFwciAgMiAxMjoyNDoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIENPUFlJTkc6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X21hY3JvKTogSGFuZGxlIE1fRE1VTCBhbmQgTV9NVUwuCisKK1R1ZSBBcHIgIDEgMTg6Mjk6NDcgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERvbid0IHNldCBpbnRlcmxvY2tzIGZvciA0MTAwLgorCitUdWUgQXByICAxIDE2OjI0OjI4IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBjb25maWctZ2FzLmNvbTogVXBkYXRlIHRvIGhhbmRsZSBib3RoIHZheCBhbmQgYWxwaGEuCisJKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byB1c2UgY29uZmlnLWdhcy4KKwkqIGNvbmYtYS1nYXMuY29tOiBSZW1vdmUgZmlsZS4KKworVHVlIEFwciAgMSAxNjowODoyMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgdW5uZWNlc3NhcnkgaXRibC1wYXJzZS5oLCBpYnRsLXBhcnNlLmMsIGFuZAorCWl0YmwtbGV4LmMgZGVwZW5kZW5jaWVzLiAgUmVtb3ZlIHJ1bGVzIGZvciBpdGJsLWxleC5vLAorCWl0YmwtcGFyc2UubywgYW5kIGl0Ymwtb3BzLm87IGp1c3QgdXNlIHRoZSBub3JtYWwgLmMubyBydWxlLgorCitUdWUgQXByICAxIDExOjI1OjU2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdGljODAuYyAobGluZV9jb21tZW50X2NoYXIpOiBNYWtlICcjJyBzdGFydCBjb21tZW50cworCWF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggLlMgZmlsZXMgd2hlcmUKKwljcHAgbGVhdmVzIHRoZSBmaWxlbmFtZSB0cmFuc2l0aW9ucyBiZWdpbm5pbmcgd2l0aCAnIycuCisKK1R1ZSBBcHIgIDEgMDA6MDc6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jOiBPbmx5IGNvbXBpbGUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIGFuZAorCXRjX2NvZmZfc2l6ZW1hY2hkZXAgaWYgT0JKX0NPRkYuCisKK01vbiBNYXIgMzEgMjM6NTM6NDQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogY29uZmlnL3RjLXBwYy5jIChyZWdpc3Rlcl9uYW1lKTogRGVjbGFyZS4KKworTW9uIE1hciAzMSAxNjozMTowNCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworTW9uIE1hciAzMSAxNDoxNToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkICJzdGFibiIuCisJKG1pcHMxNl9tYXJrX2xhYmVscyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGFwcGVuZF9pbnNuKTogQ2FsbCBtaXBzMTZfbWFya19sYWJlbHMuCisJKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KKwkoc19pbnNuKTogTGlrZXdpc2UuICBEb24ndCBjYWxsIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMuCisJKHNfbWlwc19zdGFiKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworCSogY29uZmlndXJlLmluOiBVc2UgRUxGIGZvciBtaXBzLSotZ251Ki4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworTW9uIE1hciAzMSAxNDowMTo0MCAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogU2V0IHRvICJjb2ZmLW02OGstc3lzdiIgaWYKKwlURV9ERUxUQS4KKworRnJpIE1hciAyOCAxODowMzoxOSAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIGNvbW1vbmJmZGxpYi4gIElmIGl0IGlzIHNldCwKKwlzZXQgT1BDT0RFU19MSUIgdG8gZW1wdHkuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBNYXIgMjggMTU6MjU6MjQgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogY29uZmlndXJlLmluIChzcGFyYy0qLWxpbnV4KmFvdXQqLCBzcGFyYy0qLWxpbnV4Kik6IE5ldworCXRhcmdldHMuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK0ZyaSBNYXIgMjggMTM6MDg6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpdGJsLXBhcnNlLnkgKHl5ZXJyb3IpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUuCisKKwlGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT46CisJKiBjb25maWd1cmUuaW46IFNldCBlbXVsYXRpb25zIGZvciBtaXBzLSotbGludXgqLSouCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKHN0cnVjdCBtaXBzX3NldF9vcHRpb25zKTogRGVmaW5lLgorCShtaXBzX29wdHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtaXBzX2lzYSk6IFJlbW92ZS4gIE5vdyBhIGZpZWxkIGluIG1pcHNfb3B0cy4gIENoYW5nZSBhbGwKKwlyZWZlcmVuY2VzLgorCShtaXBzMTYsIG1pcHMxNl9hdXRvZXh0ZW5kLCBtaXBzX3dhcm5fYWJvdXRfbWFjcm9zKTogTGlrZXdpc2UuCisJKG1pcHNfbm9yZW9yZGVyLCBtaXBzX25vbW92ZSwgbWlwc19ub2F0LCBtaXBzX25vYm9wdCk6IExpa2V3aXNlLgorCShzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2spOiBEZWZpbmUuCisJKG1pcHNfb3B0c19zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHNfbWlwc3NldCk6IEFkZCBzdXBwb3J0IGZvciAuc2V0IHB1c2ggYW5kIC5zZXQgcG9wLgorCSogZG9jL2MtbWlwcy50ZXhpOiBEb2N1bWVudCAuc2V0IHB1c2ggYW5kIC5zZXQgcG9wLgorCisJKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBEZWNsYXJlIGl0LgorCSogY29uZmlnL3RjLW1pcHMuYyAoc19jaGFuZ2Vfc2VjKTogQ2FsbCBpdCBpZiBPQkpfRUxGLgorCitUaHUgTWFyIDI3IDEyOjIzOjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXMuYyAocGFyc2VfYXJncyk6IFVwZGF0ZSBjb3B5cmlnaHQgZGF0ZSBpbiB2ZXJzaW9uIG1lc3NhZ2UuCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbi1oZXJlKTogUmVtb3ZlIGRlcGVuZGVuY3kgZmlsZXMuCisKKwkqIHJlYWQuYyAoc19jb21tKTogQ2hlY2sgU19JU19DT01NT04gYXMgd2VsbCBhcyBTX0lTX0RFRklORUQuCisJKHNfbXJpX2NvbW1vbik6IENoZWNrIFNfSVNfQ09NTU9OIHVuY29uZGl0aW9uYWxseS4KKwkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGVjayBTX0lTX0NPTU1PTiBhcyB3ZWxsIGFzIFNfSVNfREVGSU5FRC4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKG5vcGljX25lZWRfcmVsYXgpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IExpa2V3aXNlLgorCShwcGNfcGVfY29tbSk6IExpa2V3aXNlLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBMaWtld2lzZS4gIFNldCBzZWdtZW50IG9mCisJY29tbW9uIHN5bWJvbCB0byBiZmRfY29tX3NlY3Rpb25fcHRyLgorCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogTGlrZXdpc2UuCisJKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgorCitUaHUgTWFyIDI3IDAwOjI5OjQ2IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogR2V0IHRoZSByZWxvY3MgcmlnaHQuCisKK1dlZCBNYXIgMjYgMTM6MzU6MTUgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBPbmx5IGRlZmluZSBpZgorCUJGRF9BU1NFTUJMRVIuCisKK1dlZCBNYXIgMjYgMTE6MzI6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlcik6IEhhbmRsZSB2ZXJ5IGxvbmcgaW5wdXQKKwlsaW5lcyBjb3JyZWN0bHkuCisKKwkqIGxpc3RpbmcuYyAocHJpbnRfbGluZXMpOiBBZGQgbGluZW5vIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLgorCShsaXN0aW5nX2xpc3RpbmcpOiBPbmx5IGNhbGwgY2FsY19oZXggZm9yIHRoZSByaWdodCBsaW5lLgorCShsaXN0aW5nX2xpc3QpOiBTZXQgdGhlIG5ldyBlZGljdCBiYXNlZCBvbiB0aGUgY3VycmVudCBlZGljdCwgaW4KKwlvcmRlciB0byBoYW5kbGUgbGlzdGluZyBjb21tYW5kcyBpbiBtYWNyb3MgY29ycmVjdGx5LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX3VzZXNfcmVnKTogTWFwIHJlZ2lzdGVyIG51bWJlcnMgaW4gbWlwczE2CisJaW5zdHJ1Y3Rpb25zLgorCisJKiBjb25kLmMgKGNvbmRfZmluaXNoX2NoZWNrKTogTmV3IGZ1bmN0aW9uLgorCSogYXMuaCAoY29uZF9maW5pc2hfY2hlY2spOiBEZWNsYXJlLgorCSogYXMuYyAobWFpbik6IENhbGwgY29uZF9maW5pc2hfY2hlY2suCisKK1R1ZSBNYXIgMjUgMTQ6NDU6NTQgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogSWYgdHdvIGluc3RydWN0aW9ucworCWFyZSBzdXBwb3NlZCB0byBiZSBhc3NlbWJsZWQgaW4gcGFyYWxsZWwgYW5kIHRoZSBmaXJzdCBvbmUgaXMKKwlsb25nLCBwcmludCBhbiBlcnJvciBhbmQgc3RvcC4KKwkobWRfYXBwbHlfZml4Myk6IERvbid0IGNhbGN1bGF0ZSBhYnNvbHV0ZSByZWxvY3MuICBKdXN0IHdyaXRlCisJdGhlbSBvdXQuCisKK01vbiBNYXIgMjQgMTI6MTE6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5oIChpY2xyS2x1ZGdlKTogRGVmaW5lLgorCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgaWNscktsdWRnZS4KKworCSogY29uZmlnL3RjLWFscGhhLmggKHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVmaW5lIGlmCisJT0JKX0VDT0ZGLgorCShhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlY2xhcmUgaWYgT0JKX0VDT0ZGLgorCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2RlYnVnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IGFscGhhX2RlYnVnIGlmIC1nIGlzIHNlZW4uCisgCShhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IE5ldyBmdW5jdGlvbiBpZiBPQkpfRUNPRkYuCisKK1N1biBNYXIgMjMgMTg6MDM6MzEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBFbmFibGUgcmFuZ2UtY2hlY2tpbmcgY29kZS4KKwkocG9zdGZpeCk6IFN0b3AgYXQgc3BhY2Ugb3IgY29tbWEuCisJKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UuCisKK1NhdCBNYXIgMjIgMTM6NDQ6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogQWRkZWQgYXV0b21hdGljIGRlcGVuZGVuY3kgYnVpbGRpbmcuCisJKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KKworRnJpIE1hciAyMSAxNTo0MjozNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotaWVlZS5jIChzZWdtZW50X25hbWUpOiBEb24ndCBkZWZpbmUgZnVuY3Rpb24gaWYgdGhpcworCWlzIGEgbWFjcm8uCisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KKwkqIGNvbmZpZy90Yy1oODMwMC5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KKwkqIGNvbmZpZy90Yy1oODUwMC5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KKwkqIGNvbmZpZy90Yy13NjUuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvdGMtejhrLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgorCisJKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2FsbCBvYmpfZnJvYl9sYWJlbCBpZiBpdCBpcyBkZWZpbmVkLgorCSogY29uZmlnL29iai12bXMuaCAob2JqX2Zyb2JfbGFiZWwpOiBSZW5hbWUgZnJvbSB0Y19mcm9iX2xhYmVsLgorCisJKiBjb25maWd1cmUuaW46IERvbid0IHNldCBmaWxlcyBhbmQgbGlua3MuICBEb24ndCBjYWxsCisJQUNfTElOS19GSUxFUy4gIFN1YnN0aXR1dGUgdGVfZmlsZS4gIENyZWF0ZSB0YXJnLWNwdS5oLAorCW9iai1mb3JtYXQuaCwgdGFyZy1lbnYuaCwgYW5kIGl0YmwtY3B1LmggaW4gQUNfT1VUUFVULgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0MpOiBOZXcgdmFyaWFibGUuCisJKFRBUkdfQ1BVX08sIFRBUkdfQ1BVX0gpOiBOZXcgdmFyaWFibGVzLgorCShPQkpfRk9STUFUX0MsIE9CSl9GT1JNQVRfTywgT0JKX0ZPUk1BVF9IKTogTmV3IHZhcmlhYmxlcy4KKwkoVEFSR19FTlZfSCwgQVRPRl9UQVJHX0MsIEFUT0ZfVEFSR19PKTogTmV3IHZhcmlhYmxlcy4KKwkoU09VUkNFUyk6IFJlbmFtZSBmcm9tIFJFQUxfU09VUkNFUy4gIERlbGV0ZSBvbGQgZGVmaW5pdGlvbi4KKwkoTElOS0VEX1NPVVJDRVMpOiBSZW1vdmUuCisJKEhFQURFUlMpOiBSZW5hbWUgZnJvbSBSRUFMX0hFQURFUlMuICBEZWxldGUgb2xkIGRlZmluaXRpb24uCisJKExJTktFRF9IRUFERVJTKTogUmVtb3ZlLgorCShPQkpTKTogVXNlICQoVEFSR19DUFVfTyksIGV0Yy4sIHJhdGhlciB0aGFuIHRhcmctY3B1Lm8sIGV0Yy4KKwkoJChPQkpTKSk6IERlcGVuZCB1cG9uICQoVEFSR19FTlZfSCksIGV0Yy4sIHJhdGhlciB0aGFuCisJdGFyZy1jcHUuaCwgZXRjLgorCSgkKFRBUkdfQ1BVX08pLCAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykpOiBOZXcgdGFyZ2V0cy4KKwkodGFyZy1jcHUubywgb2JqLWZvcm1hdC5vLCBhdG9mLXRhcmcubyk6IFJlbW92ZSB0YXJnZXRzLgorCShpdGJsLWNwdS5oKTogUmVtb3ZlIHRhcmdldC4KKwkoRElTVENMRUFOX0hFUkUpOiBSZW1vdmUgdGFyZy1jcHUuYywgb2JqLWZvcm1hdC5jLCBhdG9mLXRhcmcuYywKKwlhdG9mLXRhcmcuaC4KKworVGh1IE1hciAyMCAxOToxODo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRvYy9hcy50ZXhpbmZvIChTeW1ib2wgTmFtZXMpOiBEb24ndCB1c2Ugb2Jzb2xldGUgQGN0cmwgbWFjcm8uCisKK1RodSBNYXIgMjAgMTY6NDk6MTQgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1yaV9jaGlwKTogUmVwbGFjZSBjYWxscyB0byBnZXRfc3ltYm9sX2VuZCBieQorCW9wZW4gY29kZWQgbG9vcCB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG5hbWUgdG8gc3RhcnQgd2l0aCBhCisJbmFtZSBiZWdpbm5lci4KKworVGh1IE1hciAyMCAxMzo0MjowMSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KKworCSogZnJhZ3MuYyAoZnJhZ192YXIpOiBDaGFuZ2Ugb2Zmc2V0IHBhcmFtZXRlciB0byBvZmZzZXRULgorCShmcmFnX3ZhcmlhbnQpOiBMaWtld2lzZS4KKwkqIGZyYWdzLmggKGZyYWdfdmFyaWFudCwgZnJhZ192YXIpOiBVcGRhdGUgZGVjbGFyYXRpb25zLgorCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfaXQpOiBDaGFuZ2UgZm9mZiBmaWVsZCB0bworCW9mZnNldFQuCisJKGFkZF9mcmFnKTogQ2hhbmdlIG9mZiBwYXJhbWV0ZXIgdG8gb2Zmc2V0VC4KKwkqIFNldmVyYWwgZmlsZXM6IEFkZCBjYXN0cyB0byBjYWxscyB0byBmcmFnX3Zhci4KKworCSogTWFrZWZpbGUuaW4gKG02OGstcGFyc2UuYyk6IERlcGVuZCB1cG9uIGl0YmwtcGFyc2UuYywgdG8KKwlzZXJpYWxpemUgYSBwYXJhbGxlbCBtYWtlLgorCShpdGJsLXBhcnNlLmgpOiBTcGxpdCB0YXJnZXQgb3V0IGZyb20gaXRibC1wYXJzZS5jLgorCitUaHUgTWFyIDIwIDEyOjQ4OjQ1IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIGNvbmZpZy9tNjhrLXBhcnNlLnkgKG1vdG9yb2xhX29wZXJhbmQpOiBBbGxvdyAoemRpcmVnLEVYUFIpLgorCisJKiBjb25maWcvdGUtZGVsdGEuaCAoQ09GRl9DT01NT05fQURERU5EKTogRGVmaW5lLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGVjayBDT0ZGX0NPTU1PTl9BRERFTkQgd2hlbgorCXN0b3JpbmcgdGhlIHZhbHVlIG9mIGEgY29tbW9uIHN5bWJvbC4KKworV2VkIE1hciAxOSAxMTozNzo1NyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZ2x1ZV9zeW1ib2xzKTogVW51c2VkIHZhcmlhYmxlIHN5bWJvbFAKKwlyZW1vdmVkLgorCShjcmF3bF9zeW1ib2xzKTogRG8gbm90IG1vZGlmeSBzeW1ib2xfcm9vdFAgYW5kIHN5bWJvbF9sYXN0UCBoZXJlOworCXRoYXQgaXMgZG9uZSBieSBzeW1ib2xfcmVtb3ZlIGFuZCBzeW1ib2xfaW5zZXJ0LgorCisJKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IFJldHVybiAwIGZvciBhIGRlYnVnZ2luZworCXN5bWJvbC4KKworV2VkIE1hciAxOSAxMTowNjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBJbiAzMiBiaXQgbW9kZSwgd2hlbiBub3QKKwlkZWFsaW5nIHdpdGggYSA2NCBiaXQgbnVtYmVyLCBwZXJtaXQgdGhlIHVwcGVyIDMyIGJpdHMgdG8gYmUgc2V0CisJZXZlbiBpZiBiaXQgMzEgaXMgbm90IHNldC4KKworVHVlIE1hciAxOCAyMzozMDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAiZXF1aXYiLgorCShzX3NldCk6IEhhbmRsZSAuZXF1aXYgYmFzZWQgb24gYXJndW1lbnQuCisJKiBkb2MvYXMudGV4aW5mbyAoRXF1aXYpOiBOZXcgbm9kZSB0byBkb2N1bWVudCAuZXF1aXYuCisJKEVycik6IE5ldyBub2RlIHRvIGRvY3VtZW50IC5lcnIuCisKK1R1ZSBNYXIgMTggMTU6NTA6MTMgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+CisKKwkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgorCSogYXMuYyAoc2hvd191c2FnZSwgcGFyc2VfYXJncyk6IE1ha2Ugc3RhdGljLgorCSogZnJhZ3MuaCAoZnJhZ19hbGxvYyk6IERlY2xhcmUuCisJKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IERvbid0IGRlY2xhcmUgZnJhZ19hbGxvYy4KKwkqIHN5bWJvbHMuYyAoZG9sbGFyX2xhYmVsX2luc3RhbmNlKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGxvbmcuCisJKiBzeW1ib2xzLmggKHByaW50X3N5bWJvbF92YWx1ZSk6IERlY2xhcmUuCisJKHByaW50X2V4cHIsIHByaW50X2V4cHJfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBEZWNsYXJlLgorCSogd3JpdGUuYyAoZml4X25ld19leHApOiBEb24ndCBkZWNsYXJlIG1ha2VfZXhwcl9zeW1ib2wuCisJKHJlbW92ZV9zdWJzZWdzLCByZWxheF9mcmFnKTogTWFrZSBzdGF0aWMuCisJKiBjb25maWcvYXRvZi12YXguYyAoYXRvZl92YXhfc2l6ZW9mKTogQ2hhbmdlIGxldHRlciB0byBpbnQuCisJKHdoYXRfa2luZF9vZl9mbG9hdCk6IExpa2V3aXNlLgorCShhdG9mX3ZheCk6IE1ha2Ugc3RhdGljLiAgQ2hhbmdlIHdoYXRfa2luZCB0byBpbnQuCisJKG1kX2F0b2YpOiBDaGFuZ2Ugd2hhdF9zdGF0ZW1lbnRfdHlwZSB0byBpbnQuCisJKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1hbHBoYS5jICh2YXhfbWRfYXRvZik6IERlY2xhcmUuCisJKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZSBhbmQgdmF4X21kX2F0b2YuCisJKiBjb25maWcvdGMtaTM4Ni5jIChzZXRfMTZiaXRfY29kZV9mbGFnKTogTWFrZSBzdGF0aWMuCisJKiBjb25maWcvdGMtaTM4Ni5oICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGFkZF9maXgpOiBDaGFuZ2Ugd2lkdGggdG8gaW50LgorCShpbnNlcnRfcmVnKTogQ2hhbmdlIHJlZ25hbWUgdG8gY29uc3QuCisJKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KKwkoZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSk6IERvbid0IGRlY2xhcmUuCisJKiBjb25maWcvdGMtbTg4ay5jIChtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUuCisJKiBjb25maWcvdGMtc3BhcmMuYyAoY21wX3JlZ19lbnRyeSk6IENoYW5nZSBhcmdzIHRvIGNvbnN0IFBUUi4KKwkocGFyc2Vfa2V5d29yZF9hcmcpOiBDaGFuZ2UgbG9va3VwX2ZuIHRvIHRha2UgY29uc3QgYXJnLgorCShtZF9hdG9mKTogRG9uJ3QgZGVjbGFyZSBhdG9mX2llZWUuCisJKiBjb25maWcvdGMtc3BhcmMuaDogQWRkIGlmZGVmIGZvciBtdWx0aXBsZSBpbmNsdXNpb24uCisJKHRjX2FvdXRfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWNsYXJlLgorCitNb24gTWFyIDE3IDExOjIxOjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXMuaCAoYmZkX2FsbG9jX2J5X3NpemVfdCk6IERvbid0IGRlY2xhcmUuCisJKiBNYW55IGZpbGVzOiBVc2UgeG1hbGxvYyByYXRoZXIgdGhhbiBiZmRfYWxsb2NfYnlfc2l6ZV90LgorCitTdW4gTWFyIDE2IDEzOjQ5OjIxIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogRG9uJ3QgY2FsbCBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4uCisJKHN5bWJvbF9hcHBlbmQpOiBTZXQgc3lfbmV4dCBhbmQgc3lfcHJldmlvdXMgd2hlbiBhZGRpbmcgYSBzaW5nbGUKKwlzeW1ib2wgdG8gYW4gZW1wdHkgbGlzdC4gIENhbGwgZGVidWdfdmVyaWZ5X3N5bWNoYWluLgorCSh2ZXJpZnlfc3ltYm9sX2NoYWluKTogVXNlIGFzc2VydCwgbm90IGtub3cuCisKK1NhdCBNYXIgMTUgMjA6Mjc6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE5FV1M6IE5vdGUgQmVPUyBzdXBwb3J0LgorCSogY29uZmlndXJlLmluOiAocHBjLSotYmVvcyk6IE5ldyB0YXJnZXQsIHVzZSBjb2ZmIGFzIG9iamVjdCBmb3JtYXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KKwkKK1NhdCBNYXIgMTUgMTk6MTQ6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZm9yIG91dAorCW9mIHJhbmdlIGJyYW5jaC4KKworCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmNpZXMgb24gb2JzdGFjay5oIHdoZXJlIG5lZWRlZC4KKworRnJpIE1hciAxNCAxNTozMzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSGFuZGxlIHRoZQorCWNhc2Ugb2YgYSBzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbCB3aGVuIHVzaW5nIFNWUjRfUElDLgorCisJKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX3NwYXJjKTogQWRkIG9wY29kZS9zcGFyYy5oLgorCitUaHUgTWFyIDEzIDExOjIwOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYWxsIExJU1RJTkdfTkVXTElORSBiZWZvcmUKKwlIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgd2hlbiBoYW5kbGluZyBhbiBNUkkgbGluZSBsYWJlbC4KKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9kYXRhKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAorCWFuZCBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBpZiB0aGV5IGFyZSBkZWZpbmVkLgorCShvYmpfZWxmX3RleHQsIG9ial9lbGZfcHJldmlvdXMpOiBMaWtld2lzZS4KKworV2VkIE1hciAxMiAxMTo0MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotbXVsdGkuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBEZWZpbmUgaWYKKwlPQkpfTUFZQkVfRUxGLgorCShPQkpfU1lNRklFTERfVFlQRSk6IERlZmluZSBhcyBzdHJ1Y3QgZWxmX29ial9zeSBpZgorCU9CSl9NQVlCRV9FTEYuCisJKiBjb25maWcvb2JqLWVsZi5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERvbid0IGRlZmluZSBpZgorCU9CSl9TWU1GSUVMRF9UWVBFIGlzIGRlZmluZWQuCisKKwkqIGRvYy9hcy50ZXhpbmZvIChic3MpOiBJbXByb3ZlIGRlc2NyaXB0aW9uIG9mIC5ic3Mgc2VjdGlvbi4gIEluCisJRUxGIG9yIENPRkYsIHlvdSBhcmUgcGVybWl0dGVkIHRvIHN3aXRjaCBpbnRvIHRoZSBzZWN0aW9uLgorCShDb21tKTogUmV3cml0ZSBkZXNjcmlwdGlvbiBvZiBjb21tb24gc3ltYm9scy4KKwkoTGNvbW0pOiBNZW50aW9uIHRoYXQgc29tZSB0YXJnZXRzIHBlcm1pdCBhIHRoaXJkIGFyZ3VtZW50LgorCitUdWUgTWFyIDExIDAxOjEzOjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogRG9uJ3QgY2FsbCBTX0NMRUFSX0VYVEVSTkFMLgorCisJKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHR5cGUgb2YgbG9jYWwgdG8gaW50LiAgRnJvbSBBbGFuIE1vZHJhCisJPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KKworCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IERvbid0IHVzZSBhIHNwZWNpYWwgbm9wCisJYWxpZ25tZW50IGlmIGEgemVybyBmaWxsIHBhdHRlcm4gd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCisKKwkqIHJlYWQuYyAoZXF1YWxzKTogQWx3YXlzIHBlcm1pdCByZWdpc3RlciBuYW1lcyB0byBiZSByZWRlZmluZWQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZml4X2FkanVzdGFibGUpOiBQZXJtaXQgYSByZWxvYyBhZ2FpbnN0IGEKKwltaXBzMTYgc3ltYm9sIHRvIGJlIGFkanVzdGVkIGlmIGEgc3ltYm9sIGlzIGJlaW5nIHN1YnRyYWN0ZWQgZnJvbQorCWl0LgorCisJRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zeW12ZXIpOiBDaGVjayBmb3IgZHVwbGljYXRlIG9yCisJaWxsZWdhbCBzeW1ib2wgdmVyc2lvbiBuYW1lcy4KKwkoZWxmX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgZm9yIGV4dGVybmFsIGRlZmF1bHQgdmVyc2lvbnMuCisKK1N1biBNYXIgIDkgMjM6NDk6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgorCSogY29uZmlnL29iai1lbGYuaCAoc3RydWN0IGVsZl9vYmpfc3kpOiBEZWZpbmUuCisJKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lIHRvIGVsZl9vYmpfc3kgc3RydWN0LiAgQ2hhbmdlIGFsbAorCXVzZXJzLgorCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zeW12ZXIpOiBKdXN0IHJlY29yZCB0aGUgbmFtZS4KKwkob2JqX3N5bWJvbF9uZXdfaG9vayk6IEluaXRpYWxpemVkIHZlcnNpb25lZF9uYW1lIGZpZWxkLgorCShlbGZfZnJvYl9zeW1ib2wpOiBJZiB0aGVyZSBpcyBhIHZlcnNpb25lZF9uYW1lLCBlaXRoZXIgcmVuYW1lIHRoZQorCXN5bWJvbCwgb3IgYWRkIGFuIGFsaWFzIHdpdGggdGhhdCBuYW1lLgorCitUaHUgTWFyICA2IDEzOjU1OjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUuCisJKG1kX2NvbnZlcnRfZnJhZyk6IEltcGxlbWVudC4KKwkobWRfYXNzZW1ibGUpOiBIYW5kbGUgcmVsYXhhYmxlIG9wZXJhbmRzL2luc3RydWN0aW9ucyBjb3JyZWN0bHkuCisJKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSW1wbGVtZW50LgorCSogY29uZmlnL3RjLW1uMTAzMDAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KKworCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBGaXggdHlwb3MuCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgdXNlIGFueSBNTjEwMzAwIHNwZWNpZmljCisJcmVsb2NzIGFueW1vcmUuICBUd2VhayBmeF9vZmZzZXQgZm9yIHBjLXJlbGF0aXZlIHJlbG9jcy4KKworV2VkIE1hciAgNSAxNTo0NjoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmQuYyAoc19pZmMpOiBDYWxsIG1yaV9jb21tZW50X2ZpZWxkIGFuZCBtcmlfY29tbWVudF9lbmQgd2hlbgorCWluIE1SSSBtb2RlLgorCitUdWUgTWFyICA0IDE5OjM0OjIxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJzZWN0IiBhbmQgInNlY3Rpb24iCisJcHNldWRvLW9wcy4KKwkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9iZWdpbik6IERlY2xhcmUgZXh0ZXJuYWwgdmFyaWFibGUKKwljb2ZmX2ZsYWdzIGFuZCBpbnNlcnQgYW4gRl9BUjMyV1IgYml0IGludG8gaXQuCisKK1R1ZSBNYXIgIDQgMTA6MDE6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKGVxdWFscyk6IEFkZCByZWFzc2lnbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKiByZWFkLmggKGVxdWFscyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKworU2F0IE1hciAgMSAwMTowNDowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogRG9uJ3QgYXNzdW1lIHRoYXQgd2UKKwljYW4gcmVseSBvbiB0aGUgZnJhZyBhZGRyZXNzIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZnJhZyBpcworCWVhcmxpZXIgb3IgbGF0ZXIuCisKK0ZyaSBGZWIgMjggMTQ6NDA6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5oIChMT0NBTF9MQUJFTCk6IE9ubHkgZGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgorCShTX0xPQ0FMX05BTUUpOiBMaWtld2lzZS4KKwkoRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIHVuY29uZGl0aW9uYWxseS4KKwkqIHN5bWJvbHMuYyAoY29sb24pOiBDYWxsIGJmZF9pc19sb2NhbF9sYWJlbCwgbm90IExPQ0FMX0xBQkVMLCBpZgorCUJGRF9BU1NFTUJMRVIuCisJKFNfSVNfTE9DQUwpOiBDYWxsIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCBub3QgTE9DQUxfTEFCRUwuCisJKiBjb25maWcvdGMtKi5oOiBPbmx5IGRlZmluZSBMT0NBTF9MQUJFTCBpZiBub3QgQkZEX0FTU0VNQkxFUi4KKwlEb24ndCBkZWZpbmUgRkFLRV9MQUJFTF9OQU1FLgorCSogY29uZmlnL3RlLWljOTYwLmg6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLW1pcHMuaCAodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUuCisJKG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWNsYXJlLgorCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IE5ldyBmdW5jdGlvbi4KKwkobWlwc19sb2NhbF9sYWJlbCk6IFJlbW92ZS4KKworCSogY29uZmlnL3RlLXNjbzM4Ni5oOiBSZW1vdmU7IG5vdCB1c2VkLgorCitUaHUgRmViIDI3IDE1OjM5OjE2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtdGljODAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBhbGlnbiBwc2V1ZG8gb3AgdG8gZG8KKwlieXRlIGFsaWdubWVudCByYXRoZXIgdGhhbiBwb3dlci1vZi10d28gYWxpZ25tZW50IHRoYXQgaXMgdGhlCisJR0FTIGRlZmF1bHQuCisKK1RodSBGZWIgMjcgMTM6Mjk6MDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBhIHJlbG9jIHdpZHRoIG9mICdXJy4KKworCSogZ2FzcC5jIChoYXNoX2FkZF90b19zdHJpbmdfdGFibGUpOiBDb3JyZWN0IG1pc3NwZWxsaW5nIGluIGVycm9yCisJbWVzc2FnZSwgYW5kIGFkZCBuZXdsaW5lLgorCShwcm9jZXNzX2ZpbGUpOiBEb24ndCBwcm9jZXNzIGFzc2lnbm1lbnRzIGluIHRoZSBsYWJlbCBpZiB0aGlzIGlzCisJYSBlcXUgb3IgYXNzaWduIHBzZXVkby1vcC4KKwkocHJvY2Vzc19wc2V1ZG9fb3ApOiBTd2FwIGZpcnN0IGFyZ3VtZW50IHRvIGRvX2Fzc2lnbiBmb3IgS19BU1NJR04KKwlhbmQgS19FUVUsIHRvIG1hdGNoIGRvY3VtZW50YXRpb24uCisKK1RodSBGZWIgMjcgMTI6MDA6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogQWRkICdyJyBzZWN0aW9uIGF0dHJpYnV0ZQorCXRvIGRlbm90ZSByZWFkLW9ubHkgZGF0YSBzZWN0aW9ucy4KKworVGh1IEZlYiAyNyAwMDoyNjozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogU2V0IEJTRl9PQkpFQ1QgaW4gZmxhZ3MuCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBMaWtld2lzZSwgaWYgQkZEX0FTU0VNQkxFUi4KKworCSogZXhwci5jIChvcGVyYW5kKTogU2ltcGxpZnkgMGIgaGFuZGxpbmcuICBEb24ndCB0cmVhdCAwYiBhcyBhCisJYmluYXJ5IG51bWJlciBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgJysnIG9yICctJy4KKworV2VkIEZlYiAyNiAyMDo0NzoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXRpYzgwLmMgKEZMVF9DSEFSUyk6IENoYW5nZSBmcm9tICJkRCIgdG8gImZGIi4KKwkoZmluZF9vcGNvZGUpOiBNYXRjaCBvcGVyYW5kcyB0aGF0IGNhbiBiZSBmbG9hdHMuCisJKGJ1aWxkX2luc24pOiBIYW5kbGUgT19iaWcgKGZsb2F0KSBleHByZXNzaW9ucyBhbmQgYnVpbGQKKwljb3JyZWN0IG9wY29kZS4KKworV2VkIEZlYiAyNiAxODoxOTowMCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LCBhbHNvIG1ha2UgZW1wdHkKKwllbXVsYXRpb24gbGlzdCBmb3IgdGhpcyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFVwZGF0ZS4KKwkqIHRjLW1pcHMuYyAoRUNPRkZfTElUVExFX0ZPUk1BVCk6IERlZmluZS4KKwkobWlwc190YXJnZXRfZm9ybWF0KTogVXNlLgorCSogdGUtbG5ld3MuaDogTmV3IGZpbGUuCisKK1dlZCBGZWIgMjYgMTU6MzM6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy10aWM4MC5jIChmaW5kX29wY29kZSwgYnVpbGRfaW5zbik6IENoYW5nZXMgdG8gbWF0Y2gKKwlvcGVyYW5kcyB3aXRoIDptIG9yIDpzIG1vZGlmaWVycyBhbmQgZ2VuZXJhdGUgdGhlIHJpZ2h0IG9wY29kZXMKKwlmb3IgdGhlbS4KKworV2VkIEZlYiAyNiAxMTo1NjoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oKTogVXNlICQoQklTT04pIGFuZAorCSQoQklTT05GTEFHUyksIG5vdCAkKFlBQ0MpIGFuZCAkKFlBQ0NGTEFHUykuCisKK1R1ZSBGZWIgMjUgMjI6MDI6MjMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogY29uZmlnL3RjLW02OGsuYyAoaW5zdHJpbmcpOiBVc2VsZXNzIGxvY2FsIGRlY2xhcmF0aW9uIG9mCisJY3JhY2tfb3BlcmFuZCByZW1vdmVkLgorCSogZXhwci5oIChleHByZXNzaW9uUyk6IENoYW5nZWQgdHlwZSBvZiBYX29wIGZpZWxkIHRvIG9wZXJhdG9yVCBpZgorCV9fR05VQ19fLgorCitUdWUgRmViIDI1IDEzOjE3OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT46CisJKiBjb25maWd1cmUuaW46IEFkZCBpMzg2Y29mZiBhbmQgaTM4NmVsZiB0byBlbXVsYXRpb24gbGlzdC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGFzLmMgKGkzODZjb2ZmLCBpMzg2ZWxmKTogRGVjbGFyZS4KKwkqIG9iai5oIChjb2ZmX2Zvcm1hdF9vcHMpOiBEZWNsYXJlLgorCSogY29uZmlnL29iai1jb2ZmLmMgKE9CSl9IRUFERVIpOiBEZWZpbmUuCisJKGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayk6IFJlbmFtZSBmcm9tIG9ial9zeW1ib2xfbmV3X2hvb2suCisJKGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayk6IFJlbmFtZSBmcm9tIG9ial9yZWFkX2JlZ2luX2hvb2suCisJKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgInZlcnNpb24iLgorCShjb2ZmX3BvcF9pbnNlcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobm9fZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGNvZmZfZm9ybWF0X29wcyk6IE5ldyB2YXJpYWJsZS4KKwkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2spOiBEZWNsYXJlLgorCShvYmpfc3ltYm9sX25ld19ob29rKTogRGVmaW5lLgorCShjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2spOiBEZWNsYXJlLgorCShvYmpfcmVhZF9iZWdpbl9ob29rKTogRGVmaW5lLgorCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl90YXJnZXRfZm9ybWF0KTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1pMzg2LmM6IENoZWNrIE9CSl9NQVlCRV9FTEYgYXMgd2VsbCBhcyBPQkpfRUxGOyBjaGVjaworCU9VVFBVVF9GTEFWT1Igd2hlbiBhcHByb3ByaWF0ZS4KKwkoaTM4Nl90YXJnZXRfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgorCSogTWFrZWZpbGUuaW4gKG9iai1jb2ZmLm8pOiBOZXcgdGFyZ2V0LgorCShlLWkzODZjb2ZmLm8sIGUtaTM4NmVsZi5vKTogTmV3IHRhcmdldHMuCisKKwlGcm9tIFN0ZXBoZW4gV2lsbGlhbXMgPHN0ZXZlQGljYXJ1cy5pY2FydXMuY29tPjoKKwkqIGNvbmZpZy90Yy1pOTYwLmggKFRDX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgaWYgT0JKX0NPRkYuCisJKF90Y19nZXRfYmFsX29mX2NhbGwpOiBEb24ndCBkZWNsYXJlLgorCSh0Y19nZXRfYmFsX29mX2NhbGwpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBkb24ndCBkZWZpbmUgYXMgbWFjcm8uCisJKiBjb25maWcvdGMtaTk2MC5jICh0Y19zZXRfYmFsX29mX2NhbGwpOiBJZiBPQkpfQ09GRiwgc3RvcmUgYmFsUAorCWluIHN5X3RjIGZpZWxkLCBub3QgeF9iYWxudHJ5IGZpZWxkLgorCSh0Y19nZXRfYmFsX29mX2NhbGwpOiBSZW5hbWUgZnJvbSBfdGNfZ2V0X2JhbF9vZl9jYWxsLiAgQ2hhbmdlCisJcmV0dXJuIHR5cGUgdG8gc3ltYm9sUyAqLiAgSWYgT0JKX0NPRkYsIHJldHJpZXZlIHZhbHVlIGZyb20gc3lfdGMKKwlmaWVsZCwgbm90IHhfYmFsbnRyeSBmaWVsZC4KKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogUGVybWl0IGEgLm5vdGUgc2VjdGlvbiB0bworCWhhdmUgdGhlIFNIRl9BTExPQyBhdHRyaWJ1dGUuCisKKwkqIE1ha2VmaWxlLmluICgkKE9CSlMpKTogRG9uJ3QgZGVwZW5kIHVwb24gJChJVF9IRFJTKS4KKwkoVEFSR19DUFVfREVQX21pcHMpOiBEZXBlbmQgdXBvbiAkKHNyY2RpcikvaXRibC1vcHMuaC4KKwkoaXRibC1sZXgubyk6IERlcGVuZCB1cG9uIGl0YmwtcGFyc2UuaC4KKworCSogaXRibC1wYXJzZS55ICh5eWVycm9yKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGludC4gIENoYW5nZSB0bworCXVzZSBvbGQgc3R5bGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisKKwkqIE1ha2VmaWxlLmluIChpdGJsLWxleC5vKTogUmVtb3ZlIC1XYWxsLgorCShpdGJsLXBhcnNlLm8pOiBMaWtld2lzZS4KKworCSogY29uZC5jIChzX2lmZGVmKTogSWYgd2Ugc2hvdWxkIG9taXQgY29uZGl0aW9uYWxzIGZyb20gbGlzdGluZ3MsCisJY2FsbCBsaXN0aW5nX2xpc3QuCisJKHNfaWYsIHNfaWZjLCBzX2VuZGlmLCBzX2Vsc2UsIHNfaWZlcXMpOiBMaWtld2lzZS4KKwkqIGxpc3RpbmcuYyAobGlzdF9pbmZvX3N0cnVjdCk6IEFkZCBFRElDVF9OT0xJU1RfTkVYVC4KKwkobGlzdGluZ19saXN0aW5nKTogSGFuZGxlIEVESUNUX05PTElTVF9ORVhULgorCShsaXN0aW5nX2xpc3QpOiBBbiBhcmd1bWVudCBvZiAyIG1lYW5zIEVESUNUX05PTElTVF9ORVhULgorCSogbGlzdGluZy5oIChMSVNUSU5HX05PQ09ORCk6IERlZmluZS4KKwkoTElTVElOR19TS0lQX0NPTkQpOiBEZWZpbmUuCisJKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiBjIGFzIGEgc3Vib3B0aW9uIG9mIC1hLgorCShwYXJzZV9hcmdzKTogSGFuZGxlIGMgYXMgYSBzdWJvcHRpb24gb2YgLWEuCisJKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLWFsYy4KKworTW9uIEZlYiAyNCAyMzozNDoxNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBSX0FCUyB0eXBlIGZpeHVwcy4KKworTW9uIEZlYiAyNCAxODoyNzo0MyAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLnN5bXZlci4KKworTW9uIEZlYiAyNCAxNToxOTo1NyAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYzogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0byAKKwlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCisKK01vbiBGZWIgMjQgMTA6NDA6NDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jOiBGaXggdHlwbyBpbiBjb21tZW50IHNlY3Rpb24uCisJKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIGVudHJ5IGZvciBic3MsIHdoaWNoIHRha2VzCisgCWFuIGFkZGl0aW9uYWwgYWxpZ25tZW50IGFyZ3VtZW50LgorCShmaW5kX29wY29kZSk6IEFsbG93IE9fc3ltYm9sIHJlbG9jcyBmb3IgYW55IDMyIGJpdCBmaWVsZCwgbm90IGp1c3QKKyAJYmFzZSByZWxhdGl2ZSBvbmVzLgorCShidWlsZF9pbnNuKTogSGFuZGxlIE9fc3ltYm9sIHJlbG9jcyBmb3IgYW55IDMyIGJpdCBmaWVsZCwgbm90IGp1c3QKKyAJYmFzZSByZWxhdGl2ZSBvbmVzLgorCitNb24gRmViIDI0IDAyOjIzOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlbW92ZSBkZXBlbmRhbmNpZXMgb24gaXRibC1jcHUuaC4KKwkqIGFzLmM6IERlZmluZSBzdHVicyBmb3IgaXRibF9wYXJzZSBhbmQgaXRibF9pbml0IGlmIEhBVkVfSVRCTF9DUFUgCisJaXMgbm90IGRlZmluZWQuCisKK01vbiBGZWIgMjQgMDI6MDM6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBpdGJsLW9wcy5oOiBJbmNsdWRlIGFzLmguCisKK01vbiBGZWIgMjQgMDE6MDQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBhcy5jOiBSZW1vdmUgLXQgb3B0aW9uLgorCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IE1vdmUgaXRibC1jcHUuaCB0byBtaXBzIHNwZWNpZmljIGNvbmZpZ3VyZS4KKwkqIGl0Ymwtb3BzLmg6IEluY2x1ZGUgaXRibC1jcHUuaCBvbmx5IGlmIEhBVkVfSVRCTF9DUFUgaXMgZGVmaW5lZC4KKwkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSBIQVZFX0lUQkxfQ1BVLgorCitTdW4gRmViIDIzIDE4OjAxOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogaXRibC1vcHMuYzogRG9uJ3QgZGVmaW5lIERFQlVHLgorCitTdW4gRmViIDIzIDE3OjQ5OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBpdGJsLXRlc3QuYyB0byByZWZsZWN0IGl0cyBuZXcgbG9jYXRpb24uCisKK1N1biBGZWIgMjMgMTU6NTA6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBpdGJsLW9wcy5jOiBBZGQgdGVzdCBmb3IgaXRibF9oYXZlX2VudHJpZXMuCisJKiBjb25maWcvdGMtbWlwcy5jOiBSZW1vdmUgdGVzdCBmb3IgaXRibF9oYXZlX2VudHJpZXMuCisJKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzIHRvIG1pcHNfaW5pdF9hZnRlcl9hcmdzLgorCitTdW4gRmViIDIzIDE4OjEzOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IFJlbW92ZSBpdGJsLXBhcnNlLnksIGl0YmwtbGV4LmwsIGFuZAorCWl0Ymwtb3BzLmMuICBBZGQgaXRibC1wYXJzZS5jIGFuZCBpdGJsLWxleC5jLgorCShMRVgsIExFWEZMQUdTKTogRGVmaW5lLgorCSogaXRibC1vcHMuYyAoYXBwZW5kX2luc25zX2FzX21hY3Jvcyk6IFJlbW92ZSBib2d1cyBBU1NFUlQuCisKK1NhdCBGZWIgMjIgMjE6MjU6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBpdGJsLXBhcnNlLnk6IEZpeCBpbmRlbnRhdGlvbiBtaXN0YWtlcyBmcm9tIGluZGVudCBwcm9ncmFtLgorCSogaXRibC1sZXgubDogRml4IGluZGVudGF0aW9uIG1pc3Rha2VzIGZyb20gaW5kZW50IHByb2dyYW0uCisJKiBpdGJsLW9wcy5oOiBBZGQgaW5jbHVkZSBmb3IgYW5zaWRlY2wuaC4KKwlBZGQgUEFSQU1TIGFyb3VuZCBmdW5jdGlvbiBhcmd1bWVudHMuCisJQWRkIGRlY2xhcmF0aW9uIGZvciBpdGJsX2hhdmVfZW50cmllcy4KKwkqIGl0Ymwtb3BzLmM6IEFkZCBQQVJBTVMgYXJvdW5kIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKwkqIE1ha2VmaWxlLmluOiBBZGQgaXRibCBidWlsZCBydWxlcy4KKwlBZGQgZGVwZW5kYW5jaWVzIGZvciBpdGJsIGZpbGVzIHRvIG1pcHMgdGFyZ2V0LgorCSogYXMuYzogQWRkIGl0Ymwgc3VwcG9ydC4KKwlBZGQgbmV3IG9wdGlvbiAiLS1pbnN0dGJsIiBmb3IgZHluYW1pY2FsbHkgZXh0ZW5kaW5nIGluc3RydWN0aW9uIHNldC4KKwkqIGFzLmg6IERlY2xhcmUgaW5zdHRibF9maWxlX25hbWU7CisJdGhlIG5hbWUgb2YgZmlsZSBkZWZpbmluZyBleHRlbnNpb25zIHRvIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzZXQgCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogQWRkIGl0YmwtcGFyc2UubywgaXRibC1sZXgubywgYW5kIAorCWl0Ymwtb3BzLm8gdG8gZXh0cmFfb2JqZWN0cyBmb3IgbWlwcyBjb25maWd1cmF0aW9uLgorCUFkZCBpbmNsdWRlIGZpbGUgbGluayBmcm9tIGl0YmwtY3B1LmggdG8gCisJY29uZmlnL2l0YmwtJHt0YXJnZXRfY3B1X3R5cGV9LmguCisJKiBjb25maWcvdGMtbWlwcy5jOiBBbGxvdyBjb3B6IGluc3RydWN0aW9ucy4KKwlBZGQgbm90ZXMgZm9yIGZ1dHVyZSBhZGRpdGlvbnMgdG8gdGhlIGl0Ymwgc3VwcG9ydC4KKwlBZGQgZGVidWcgbWFjcm9zLgorCShtYWNybyk6IENhbGwgaXRibF9hc3NlbWJsZSB0byBhc3NlbWJsZSBpdGJsIGluc3RydWN0aW9ucy4KKwlTZWUgaWYgYW4gdW5rbm93biByZWdpc3RlciBpcyBzcGVjaWZpZWQgaW4gYW4gaXRibCBlbnRyeS4KKworU2F0IEZlYiAyMiAyMDo1MzowMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKwkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBGaXggdHlwbyBpbiBtZF9zZWN0aW9uX2FsaWduCisJZGVzY3JpcHRpb24uCisJKiBjb25maWcvdGMtdGljODAuaCAoTkVFRF9GWF9SX1RZUEUpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtdGljODAuYyAoZmluZF9vcGNvZGUpOiBBZGQgY29kZSB0byBzdXBwb3J0IE9fc3ltYm9sCisJb3BlcmFuZHMuCisJKGJ1aWxkX2luc24pOiBHcmFiIGEgZnJhZyBlYXJseSBzbyB3ZSBjYW4gdXNlIHRoZSBhZGRyZXNzIGluCisgCWZpeHVwcy4gIFRha2Ugb25lJ3MgY29tcGxlbWVudCBvZiBCSVROVU0gdmFsdWVzIGJlZm9yZSBpbnNlcnRpb24KKyAJaW4gb3Bjb2RlLiAgQWRkIGNvZGUgdG8gc3VwcG9ydCBPX3N5bWJvbCBvcGVyYW5kcy4KKwkobWRfYXBwbHlfZml4KTogUmVwbGFjZSB1bmltcGxlbWVudGVkIHdhcm5pbmcgd2l0aCBpbXBsZW1lbnRhdGlvbi4KKwkobWRfcGNyZWxfZnJvbSk6IERpdHRvLgorCSh0Y19jb2ZmX2ZpeDJydHlwZSk6IERpdHRvLgorCitGcmkgRmViIDIxIDE0OjM0OjMxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IE5ldyBmdW5jdGlvbi4gCisJKiBjb25maWcvdGMtZDMwdi5oOiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCisJKiBjb25maWcvdGMtZDEwdi5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZXR1cm4gMCBpZgorICAgICAgICByZWxvY2F0aW9uIGlzIGluIGRpZmZlcmVudCBzZWN0aW9uLgorCitGcmkgRmViIDIxIDEwOjA4OjI1IDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogdGMtbWlwcy5jIChtaXBzX2lwKTogSWYgY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgRUxGIHN5c3RlbSwKKwlkb24ndCBzZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IHRvIDIqKjQuCisKK0ZyaSBGZWIgMjEgMTE6NTU6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgJyonLgorCisJKiBhcHAuYyAoTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8yTkQpOiBEb24ndCBkZWZpbmUuCisJKGRvX3NjcnViX2JlZ2luKTogRG9uJ3Qgc2V0IGxleFsnKiddLgorCShkb19zY3J1Yl9jaGFycyk6IFdoZW4gaGFuZGxpbmcgTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1QsIGRvbid0CisgCWNoZWNrIGZvciBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzJORC4gIEluc3RlYWQsIGp1c3QgY2hlY2sgZm9yCisJYSBsaXRlcmFsICcqJy4KKworCSogY29uZmlndXJlLmluOiBTZXQgZW09c3ZyNCBmb3IgbTY4ay0qLXN5c3Y0Ki4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGNvbmZpZy90ZS1zdnI0Lmg6IE5ldyBmaWxlLgorCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb21tZW50X2NoYXJzKTogT25seSBpbmNsdWRlIGAjJyBpZgorCVRFX1NWUjQgb3IgVEVfREVMVEEuCisKK1RodSBGZWIgMjAgMjI6MjQ6MzkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlCisJc2hvcnQgY29uZGl0aW9uYWwgYnJhbmNoIGFyb3VuZCBhIGxvbmcgdW5jb25kaXRpb25hbCBicmFuY2guCisKK1RodSBGZWIgMjAgMTM6NTY6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfbG4gW2JvdGggdmVyc2lvbnNdKTogQ2FsbAorCW5ld19sb2dpY2FsX2xpbmUuCisKKwkqIGNvbmZpZy90Yy1hcm0uYyAoZml4X25ld19hcm0pOiBVc2UgbWFrZV9leHByX3N5bWJvbCB0byBoYW5kbGUgYQorCWNvbXBsZXggZXhwcmVzc2lvbi4KKworCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IElmIGJvdGggbGVmdCBhbmQgcmlnaHQKKwlvcGVyYW5kcyBhcmUgdW5kZWZpbmVkLCB3YXJuIGFib3V0IGJvdGggb2YgdGhlbS4KKworV2VkIEZlYiAxOSAwMDo1MzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9wc2V1ZG9fdGFibGUpOiBBZGQgInN5bXZlciIuCisJKG9ial9lbGZfc3ltdmVyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogQ29weSB0aGUgc3Rfb3RoZXIKKwlmaWVsZC4KKworCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IE1ha2UgdHlwZSBhbmQgcHJpbnRmIGZvcm1hdCBhZ3JlZS4KKworCSogcmVhZC5jIChnZXRfbGluZV9zYik6IERvbid0IGVuZCB0aGUgbGluZSBvbiBhIHNlbWljb2xvbiBpbnNpZGUgYQorCXN0cmluZy4KKworVHVlIEZlYiAxOCAxODo0Mjo1MSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQzMHYuYywgY29uZmlnL3RjLWQzMHYuaDogTmV3IGZpbGVzLgorCisgCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCQorCSogY29uZmlndXJlLmluOiBBZGQgY2FzZSBmb3IgZDMwdi4KKworU3VuIEZlYiAxNiAxNzo0NzoyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFscGhhLmggKG1kX29wZXJhbmQpOiBEZWZpbmUgd2l0aCBhIG51bGwgZXhwYW5zaW9uLAorCWxpa2UgYWxsIHRoZSBvdGhlciB0YXJnZXRzLgorCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEFkZCBtaXNzaW5nIHdvcmQgaW4gCisJbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgZGVzY3JpcHRpb24uICBGaXggdHlwbyBpbiBtZF9jb252ZXJ0X2ZyYWcKKwlkZXNjcmlwdGlvbi4KKwkqIGNvbmZpZy90Yy10aWM4MDogTWlub3IgY29tbWVudCBhZGRpdGlvbnMvY2hhbmdlcy4KKwkKK0ZyaSBGZWIgMTQgMTg6MDk6NTkgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogY29uZmlnL3RjLW02OGsuYyAoTE9DQUxfTEFCRUwpOiBNYWNybyByZWRlZmluZWQgaWYgVEVfREVMVEEuCisJKHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IE1hY3JvIGRlZmluZWQgaWYgVEVfREVMVEEuCisgCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2RlZik6IFVzZQorCXRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpZiBkZWZpbmVkLgorCShvYmpfY29mZl90YWcsIG9ial9jb2ZmX3ZhbCk6IExpa2V3aXNlLgorCSogZXhwci5jIChvcGVyYW5kKTogUmVqZWN0ICd+JyBhcyBvcGVyYXRvciBpZiBpc19uYW1lX2JlZ2lubmVyLgorCitGcmkgRmViIDE0IDE3OjI0OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIG5vdGVzIGZyb20gUGV0ZXIgRXJpa3Nzb24gPHBldGVyQGlmbS5saXUuc2U+LiAgVGhlIHRhcmdldAorCWRvZXMgbm90IGFjdHVhbGx5IHdvcmssIHRob3VnaDoKKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni1zZXF1ZW50LWJzZCopOiBOZXcgdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlnL3RjLWR5bml4Lmg6IE5ldyBmaWxlLgorCSogY29uZmlnL3RjLWkzODYuaDogRGVmaW5lIFRBUkdFVF9GT1JNQVQgaWYgVEVfRFlOSVguCisKKwkqIHJlYWQuYyAoZG9fYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwlSZW1vdmUgdXNlbGVzcyBzdGF0aWMgdmFyaWFibGVzLgorCShzX2FsaWduKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIERvIGNvbW1vbiBwb3J0aW9uIG9mCisJc19hbGlnbl9ieXRlcyBhbmQgc19hbGlnbl9wdHdvLgorCShzX2FsaWduX2J5dGVzLCBzX2FsaWduX3B0d28pOiBKdXN0IGNhbGwgc19hbGlnbi4KKwkqIGZyYWdzLmMgKGZyYWdfYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkoZnJhZ19hbGlnbl9wYXR0ZXJuKTogTGlrZXdpc2UuCisJKiBmcmFncy5oIChmcmFnX2FsaWduLCBmcmFnX2FsaWduX3BhdHRlcm4pOiBVcGRhdGUgZGVjbGFyYXRpb25zLgorCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IExpbWl0IGFsaWdubWVudCBjaGFuZ2UgdG8gZnJfc3VidHlwZS4KKwlGaXggc29tZSB0eXBlcyB0byBiZSBhZGRyZXNzVC4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9vYmotaWVlZS5jIChzaXplX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX2RvX2FsaWduKTogQWRkIG1heCBwYXJhbWV0ZXIuCisJKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLW04OGsuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1zaC5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCisJKiBhcy5oOiBJbXByb3ZlIGNvbW1lbnRzIG9uIHJzX2FsaWduIGFuZCByc19hbGlnbl9jb2RlLgorCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBhbGlnbm1lbnQgYXJndW1lbnRzLgorCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IERvY3VtZW50IHVzZSBvZiBmcl9zdWJ0eXBlIGZpZWxkIGZvcgorCXJzX2FsaWduIGFuZCByc19hbGlnbl9jb2RlLgorCitGcmkgRmViIDE0IDE1OjU2OjA2IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jOiBDaGFuZ2VkIG9wY29kZSBwYXJzaW5nLgorCitUaHUgRmViIDEzIDIwOjAyOjE2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcve3RjLWFscGhhLmgsIHRjLWQxMHYuaCwgdGMtZ2VuZXJpYy5oLCB0Yy1pOTYwLmgsCisJdGMtbW4xMDIwMC5oLCB0Yy1tbjEwMzAwLmgsIHRjLXNoLmgsIHRjLXZheC5oLCB0Yy13NjUuaH06CisJQWRkIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiB6ZXJvIGZvciBUQVJHRVRfQllURVNfQklHX0VORElBTi4KKwkqIGNvbmZpZy97dGMtYXJtLmgsIHRjLWhwcGEuaCwgdGMtaTM4Ni5oLCB0Yy1taXBzLmgsIHRjLW5zMzJrLmgsCisgCXRjLXBwYy5oLCB0Yy1zcGFyYy5ofTogTW92ZSBkZWZpbml0aW9uIG9mIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCisJdG8gYSBsb2NhdGlvbiBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBpbmNsdWRlIGZpbGVzLgorCSogY29uZmlnL3RjLWkzODYuYzogUmVtb3ZlIG1pc2xlYWRpbmcgY29tbWVudC4KKwkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBBZGQgZGVzY3JpcHRpb24gb2YgZnVuY3Rpb24KKwltZF91bmRlZmluZWRfc3ltYm9sLgorCSogY29uZmlnL3RjLXRpYzgwLmM6IEFkZCBjb2RlIHRvIGluc2VydCBwcmVkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUKKwlzeW1ib2wgdGFibGUgc28gdGhleSBjYW4gYmUgcGFyc2VkIGJ5IHRoZSBzdGFuZGFyZCBleHByZXNzaW9uIHBhcnNlci4KKwlSZW1vdmUgY3VzdG9tIGNvZGUgdGhhdCB1c2UgdG8gcGFyc2UgdGhlbS4KKwkqIGNvbmZpZy90Yy10aWM4MC5oOiBNb3ZlIGRlZmluaXRpb24gb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KKwl0byBhIGxvY2F0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGluY2x1ZGUgZmlsZXMuCisJCitUaHUgRmViIDEzIDIxOjQ0OjE4IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBhcy5oOiBHTlUgYyBwcm92aWRlcyB1bmxpbmsoKSBmdW5jdGlvbi4KKworCVVuaWZ5IHNlY3Rpb24gaGFuZGxpbmcgb24gb3BlblZNUy9BbHBoYToKKwkqIGNvbmZpZy90Yy1hbHBoYS5jKHNfYWxwaGFfbGluayk6IFJlbW92ZS4KKwkoc19hbHBoYV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgorCVJlbW92ZSBjYXNlLWhhY2tpbmcgb2Ygc3ltYm9scworCUFkZCAuY29kZV9hZGRyZXNzIHBzZXVkby1vcC4KKwkoQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTogTmV3IHJlbG9jYXRpb24uCisJKHNfYWxwaGFfY29kZV9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgorCShhbHBoYV9jdG9yc19zZWN0aW9uLCBhbHBoYV9kdG9yc19zZWN0aW9uKTogTmV3IHNlY3Rpb25zIGZvciBDKysKKwlzdGF0aWMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLgorCUFkZCBkZWJ1ZyBjb2RlIGZvciBjcmFzaCBkZWJ1Z3MsIHRvIGJlIHJlbW92ZWQgd2hlbiB0cmFjZWJhY2sgY29kZQorCWlzIGFkZGVkIHRvIG9iamVjdCBjb2RlLgorCShzX2FscGhhX25hbWUpOiBOZXcgZnVuY3Rpb24gZm9yIC5uYW1lIHBzZXVkby1vcC4KKwkoYWxwaGFfcHJpbnRfdG9rZW4pOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgdG9rZW4gZXhwcmVzc2lvbnMgd2l0aAorCWFscGhhIHNwZWNpZmljIGV4dGVuc2lvbnMuCisKKwkqIG1ha2VmaWxlLnZtczogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBjdXJyZW50IGdjYyBzbmFwc2hvdC4KKworVGh1IEZlYiAxMyAxNjoyOTowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZG9jL01ha2VmaWxlLmluIChURVhJMkRWSSk6IFNldCB0byBqdXN0IG5hbWUgb2YgcHJvZ3JhbS4KKwkoRFZJUFMpOiBTZXQgdG8gZHZpcHMuCisJKHBzLCBhcy5wcywgZ2FzcC5wcyk6IE5ldyB0YXJnZXRzLgorCShpbnRlcm5hbHMuaW5mbywgZ2FzcC5kdmksIGludGVybmFscy5kdmkpOiBTZXQgYm90aCBURVhJTlBVVFMKKyAJYW5kIE1BS0VJTkZPIGVudiB2YXJpYWJsZXMuCisJKGludGVybmFscy5wcyk6IFVzZSBEVklQUyBtYWNyby4KKwkoY2xlYW4pOiBSZW1vdmUgY29yZSBhbmQgYmFja3VwIGZpbGVzLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIGZyb20gYnVpbGRpbmcgaW50ZXJuYWxzLgorCShjbGVhbi1kdmkpOiBEaXR0by4KKwkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBGaXggdHlwby4KKwkoR0FTIHByb2Nlc3NpbmcpOiBEaXR0by4KKwkoQ1BVIGJhY2tlbmQpOiBEaXR0by4KKwkqIGVjb2ZmLmMgKGluaXRfZmlsZSk6IFVzZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB2YWx1ZSBkaXJlY3RseS4KKwkqIG1wdy1jb25maWcuaW46IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBhcyAxLgorCSogcmVhZC5jOiBSZW1vdmUgdWdseSBoYWNrIHRoYXQgZGVhbHQgd2l0aCBjb25maWcgZmlsZXMgbm90CisJY29ycmVjdGx5IGRlZmluaW5nIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgorCSh0YXJnZXRfYmlnX2VuZGlhbik6IFVzZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBkaXJlY3RseS4KKwkqIGNvbmZpZy9hcm0tYmlnLm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KKwkqIGNvbmZpZy9hcm0tbGl0Lm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMC4KKwkqIGNvbmZpZy9taXBzLWJpZy5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCisJKiBjb25maWcvbWlwcy1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAwLgorCSogY29uZmlnL3BwYy1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgorCSogY29uZmlnL3BwYy1zb2wubXQ6IFJlcGxhY2UgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4KKwl3aXRoIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGRlZmluZWQgdG8gMC4KKwkqIGNvbmZpZy90Yy1hcm0uaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgorCWFuZCBzaW1wbGlmeS4gIFRlc3QgdmFsdWUgb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIG5vdCBqdXN0CisJd2hldGhlciBpdCBpcyBkZWZpbmVkIG9yIG5vdC4KKwkqIGNvbmZpZy90Yy1taXBzLmg6IFJlbW92ZSB1c2Ugb2YgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4uCisJKiBjb25maWcvdGMtcHBjLmg6IFJlbW92ZSB1c2Ugb2YgVEFSR0VUX0JZVEVTX0xJVFRMRV9FTkRJQU4KKwlhbmQgc2ltcGxpZnkuIFRlc3QgdmFsdWUgb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIG5vdCBqdXN0CisJd2hldGhlciBpdCBpcyBkZWZpbmVkIG9yIG5vdC4KKwkqIGNvbmZpZy90aWM4MC5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIHRvIGNvZmYtdGljODAuCisJKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lIHRvIDAuCisKK1RodSBGZWIgMTMgMTQ6NDA6MTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogQ29ycmVjdCB0ZXh0IGluIGFzX2ZhdGFsIGVycm9yIG1lc3NhZ2UsCisJYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAtPiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLgorCitUaHUgRmViIDEzIDE0OjQ4OjAzIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKExFWF9USUxERSk6IERlZmluZSBpZiBURV9ERUxUQS4KKwkqIHJlYWQuYyAoTEVYX1RJTERFKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCShsZXhfdHlwZSk6IFVzZSBMRVhfVElMREUuCisJKiBleHByLmMgKGdldF9zeW1ib2xfZW5kKTogQ2hlY2sgZmlyc3QgY2hhciB3aXRoIGlzX25hbWVfYmVnaW5uZXIsCisJbm90IGlzX3BhcnRfb2ZfbmFtZS4KKworVGh1IEZlYiAxMyAxMTo0MDo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIG1pc3NpbmcgYmFja3NsYXNoIGF0IGVuZAorCW9mIGNvbnRpbnVlZCBsaW5lLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IENvcnJlY3QgYmFzZSBhZGRyZXNzCisJZm9yIGFuIGV4dGVuZGVkIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9ub3BfZnJhZyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHByZXZfbm9wX2ZyYWdfaG9sZHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShwcmV2X25vcF9mcmFnX3JlcXVpcmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkocHJldl9ub3BfZnJhZ19zaW5jZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGFwcGVuZF9pbnNuKTogSWYgd2UgYXJlbid0IHJlb3JkZXJpbmcsIGFuZCBwcmV2X25vcF9mcmFnIGlzIG5vdAorCU5VTEwsIGFuZCB3ZSBkb24ndCBuZWVkIGFueSBub3BzLCB0aGVuIGRlY3JlYXNlIHRoZSBzaXplIG9mCisJcHJldl9ub3BfZnJhZy4gIERvbid0IGluc2VydCBub3BzIGJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb25zIGluCisJbm9yZW9yZGVyIHNlY3Rpb25zLiAgUmVtZW1iZXIgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb25zCisJd2hlcmUgaW4gbm9yZW9yZGVyIHNlY3Rpb25zIGV2ZW4gd2hlbiBub3QgcmVvcmRlcmluZy4KKwkobWlwc19ub19wcmV2X2luc24pOiBBZGQgcHJlc2VydmVyIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKKwljYWxsZXJzLiAgUmVmZXIgcHJldl9ub3BfZnJhZyB2YXJpYWJsZXMgd2hlbiBhcHByb3ByaWF0ZS4KKwkobWlwc19lbWl0X2RlbGF5cyk6IFNldCB1cCBwcmV2X25vcF9mcmFnLgorCShzX21pcHNzZXQpOiBDbGVhciBwcmV2X25vcF9mcmFnIGlmIHJlb3JkZXJpbmcuCisKK1dlZCBGZWIgMTIgMTQ6MzY6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFJlbW92ZSB1c2VsZXNzIGNvZGUgd2hpY2gKKwloYW5kbGVkIHN3YXBwaW5nIGEgbWlwczE2IGp1bXAgd2l0aCBhIG1pcHMxNiBpbnN0cnVjdGlvbiB3aXRoIGEKKwlyZWxvYy4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogV2hlbiBkZWJ1Z2dpbmcsIHNldAorCW1pcHNfb3B0aW1pemUgdG8gMSwgbm90IDAuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSBhbiBleHRlbmQgb3BlcmFuZC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobXlfZ2V0RXhwcmVzc2lvbik6IEluIG1pcHMxNiBtb2RlLCBpZiBpdCBsb29rcworCWxpa2UgdGhlIGV4cHJlc3Npb24gd2FzIGJhc2VkIG9uIGAuJywgYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGUKKwlzeW1ib2wuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogV2FybiBhYm91dCBhbiBhdHRlbXB0IHRvIHB1dCBhbgorIAlleHRlbmRlZCBpbnN0cnVjdGlvbiBpbiBhIGRlbGF5IHNsb3Qgd2hlbiBub3QgcmVvcmRlcmluZy4KKwkobWRfY29udmVydF9mcmFnKTogV2FybiBpZiBhbiBleHRlbmRlZCBpbnN0cnVjdGlvbiBhcHBlYXJzIGluIGEKKwlkZWxheSBzbG90LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCAiaW5zbiIuCisJKHNfaW5zbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5pbnNuLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IEFkZCB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgdG8gdGhlCisJc3ltYm9sIHRhYmxlLgorCShtaXBzMTZfaXApOiBGaXJzdCBwYXJzZSB0aGUgZXhwcmVzc2lvbiwgYW5kIHRoZW4gc2VlIHdoZXRoZXIgaXQKKwljYW1lIHVwIHdpdGggYSByZWdpc3RlciwgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZpcnN0IHNlZSB3aGV0aGVyCisJd2UgYXJlIGxvb2tpbmcgYXQgYSByZWdpc3Rlci4KKworVHVlIEZlYiAxMSAxNToxMzozOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXRpYzgwLmM6IE51bWVyb3VzIGNoYW5nZXMgYW5kIGFkZGl0aW9ucyB0byBmbGVzaAorCW91dCBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkganVzdCBzdHVicywgYW5kIGZpeCBzb21lCisJcHJvYmxlbXMgZm91bmQgdXNpbmcgdGhlIG5ldyBUSWM4MCB0ZXN0c3VpdGUgY2FzZXMuCisKK1R1ZSBGZWIgMTEgMTU6NTI6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgJWdwcmVsIG1vZGlmaWVyLgorCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DX01JUFMxNl9HUFJFTC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBPdXRwdXQganVtcCBpbnN0cnVjdGlvbiBhcyBhCisJcGFpciBvZiAyIGJ5dGUgaW5zdHJ1Y3Rpb25zLCByYXRoZXIgdGhhbiBhcyBhIHNpbmdsZSA0IGJ5dGUKKwlpbnN0cnVjdGlvbi4KKworTW9uIEZlYiAxMCAyMjowNjowMCAxOTk3ICBEYXduIFBlcmNoaWsgIChkYXduQGN5Z251cy5jb20pCisKKwkqIGl0Ymwtb3BzLmMsIGl0YmwtbGV4LmwsIGl0YmwtcGFyc2UueSwgaXRibC1vcHMuaCwKKwljb25maWcvaXRibC1taXBzLmg6IEFkZCBjb3B5cmlnaHQgbWVzc2FnZSBhbmQgZml4IGluZGVudGF0aW9uLgorCitNb24gRmViIDEwIDE4OjA5OjAwIDE5OTcgIERhd24gUGVyY2hpayAgKGRhd25AY3lnbnVzLmNvbSkKKworCSogaXRibC1vcHMuYzogTmV3IGZpbGUuICBBZGQgc3VwcG9ydCBmb3IgZHluYW1pY2FsbHkgcmVhZCAKKwlpbnN0cnVjdGlvbiByZWdpc3RlcnMsIG9wY29kZXMgYW5kIGZvcm1hdHMuICBCdWlsZCBpbnRlcm5hbCB0YWJsZSAKKwlmb3IgbmV3IGluc3RydWN0aW9ucyBhbmQgcHJvdmlkZSBjYWxsYmFja3MgZm9yIGFzc2VtYmxlciBhbmQgCisJZGlzYXNzZW1ibGVyLgorCSogaXRibC1sZXgubCwgaXRibC1wYXJzZS55OiBMZXggYW5kIHlhY2MgcGFyc2VycyBmb3IgaW5zdHJ1Y3Rpb24gCisJc3BlYyB0YWJsZS4KKwkqIGl0Ymwtb3BzLmg6IE5ldyBmaWxlLiAgSGVhZGVyIGZpbGUgZm9yIGl0Ymwgc3VwcG9ydC4KKwkqIGNvbmZpZy9pdGJsLW1pcHMuaDogTmV3IGZpbGUuICBNaXBzIHNwZWNpZmljIGRlZmluaXRpb25zIGZvcgorCWl0Ymwgc3VwcG9ydC4KKworRnJpIEZlYiAgNyAwOTo1MjozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogSWYgYSBjb25zdGFudCBvcGVyYW5kIHdvbid0CisJZml0IGludG8gdGhlIGNvbnN0YW50IGZpZWxkIG9mIGEgcmVsYXhhYmxlIG9wZXJhbmQsIHRoZW4gaXQgZG9lcworCW5vdCBtYXRjaC4KKworVGh1IEZlYiAgNiAyMDowODoxMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVHJlYXQKKwlhIGpzciB0YXJnZXQgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiBqdXN0IGxpa2UgYSBqc3IgdG8KKwlhbiB1bmRlZmluZWQgdGFyZ2V0LgorCitUaHUgRmViICA2IDE2OjUyOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY2F0aW9ucworCWFnYWluc3QgYW55IG1pcHMxNiBzeW1ib2xzLCBub3QganVzdCBleHRlcm5hbGx5IHZpc2libGUgb25lcy4KKwkobWRfYXBwbHlfZml4KTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCisKK1dlZCBGZWIgIDUgMTE6MTE6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBBY2NlcHQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGluCisJdGhlIG9wZXJhbmQgb2YgdGhlIGV4aXQgaW5zdHJ1Y3Rpb24uCisKK1R1ZSBGZWIgIDQgMTQ6MTI6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgd2UgbGVhdmUgYW4gZXF1YXRlZCBzeW1ib2wKKwlhcyBPX3N5bWJvbCwgY29weSBvdmVyIHRoZSBzZWdtZW50LgorCitNb24gRmViICAzIDEyOjM1OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogSWYgd2UgYXJlbid0IGFkanVzdGluZyB0aGlzCisJZml4dXAgdG8gYmUgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wsIGFkanVzdCB0aGUgdmFsdWUKKwlhY2NvcmRpbmdseS4KKworCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IGNoYW5nZSBYX2FkZF9udW1iZXIgZm9yCisJYW4gZXF1YXRlZCBzeW1ib2wuCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBBdm9pZCBsb29waW5nIG9uIGVxdWF0ZWQgc3ltYm9scy4KKwlBZGp1c3QgZnhfb2Zmc2V0IGJ5IFhfYWRkX251bWJlciBmb3IgZWFjaCBzeW1ib2wuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IEF2b2lkIGxvb3Bpbmcgb24gZXF1YXRlZAorCXN5bWJvbHMuCisJKGZpeHVwX3NlZ21lbnQpOiBBZGQgYSBsb29wIHRvIHRyYWNrIGRvd24gZXF1YXRlZCBzeW1ib2xzIGFuZAorCWFkanVzdCBmeF9vZmZzZXQgYXBwcm9wcmlhdGVseS4KKworRnJpIEphbiAzMSAxNToyMTowMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX3JlbGF4X3RhYmxlKTogQWRkIGVudHJpZXMgdG8gYWxsb3cKKwlqbXAgLT4gYnJhIHJlbGF4aW5nLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBIYW5kbGUgam1wLT5icmEgcmVsYXhpbmcuCisJKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGptcC0+YnJhIHJlbGF4aW5nLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgorCitGcmkgSmFuIDMxIDEzOjE1OjA1IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogQWRkIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlCisJbm9wIGluc3RydWN0aW9ucy4KKworRnJpIEphbiAzMSAxMDo0NjoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChlbmZvcmNlX2FsaWduZWRfZGF0YSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHNwYXJjX2NvbnNfYWxpZ24pOiBEb24ndCBkbyBhbnl0aGluZyB1bmxlc3MgZW5mb3JjZV9hbGlnbmVkX2RhdGEKKwlpcyBzZXQuCisJKG1kX2xvbmdvcHRzKTogQWRkICJlbmZvcmNlLWFsaWduZWQtZGF0YSIuCisJKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEuCisJKiBkb2MvYy1zcGFyYy50ZXhpIChTcGFyYy1BbGlnbmVkLURhdGEpOiBOZXcgbm9kZTsgZG9jdW1lbnQKKwllbmZvcmNlLWFsaWduZWQtZGF0YS4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBJZiBPQkpfWENPRkYsIGFkZCAibG9uZyIsCisgCSJ3b3JkIiwgYW5kICJzaG9ydCIuCisJKHBwY194Y29mZl9jb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IEdpdmUgYW4gZXJyb3IgaWYgYSAuc3BhY2Ugc3ltYm9sIGlzCisJY29tbW9uIG9yIHVuZGVmaW5lZC4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBEb24ndCBoYW5kbGUgbXJpX3BlbmRpbmdfYWxpZ24gaWYKKwl0aGUgaGFuZGxlciBpcyBzX2dsb2JsIG9yIHNfaWdub3JlLgorCitUaHUgSmFuIDMwIDExOjQ2OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgIm51bW9wcyIuCisJKiBjb25maWcvdGMtdGljODAuYzogTWFueSBhZGRpdGlvbnMgdG8gcHJldmlvdXMgcGxhY2Vob2xkZXIgZmlsZS4KKwkqIGNvbmZpZy90Yy10aWM4MC5oOiBEaXR0by4KKworVGh1IEphbiAzMCAxMjoyODoxOCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IEltcHJvdmUgdGhlIG5vcCBwYXR0ZXJucy4KKworVGh1IEphbiAzMCAxMjowODo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtbWlwcy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IENhbGwgbWlwc19maXhfYWRqdXN0YWJsZS4KKwkobWlwc19maXhfYWRqdXN0YWJsZSk6IERlY2xhcmUuCisKKwlJZGVhcyBmcm9tIFNyaW5pdmFzIEFkZGFnYXJsYSA8c3Jpbml2YXNAY2RvdGQuZXJuZXQuaW4+OgorCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBBZnRlciBkb2luZyBhbiBtcmlfcGVuZGluZ19hbGlnbiwKKwlhZGp1c3QgdGhlIGxpbmVfbGFiZWwgaWYgdGhlcmUgaXMgb25lLgorCShzX3NwYWNlKTogU2V0IG1yaV9wZW5kaW5nX2FsaWduIGlmIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMgd2VyZQorCW91dHB1dC4KKworV2VkIEphbiAyOSAxNTozMToxMiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuaCAobWRfZG9fYWxpZ24pOiBBZGQgdGhpcyBob29rIHRvIGNhbGwKKwlkMTB2X2NsZWFudXAoKSB3aGVuIGEgIi5hbGlnbiIgaXMgZGV0ZWN0ZWQuCisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogQ29ycmVjdGx5IGNhbGN1bGF0ZQorCWJyYW5jaCBkaXNwbGFjZW1lbnQgd2hlbiAuYWxpZ25zIGFyZSBwcmVzZW50LgorCitXZWQgSmFuIDI5IDA5OjQyOjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUuCisJKG1kX2NvbnZlcnRfZnJhZyk6IEltcGxlbWVudC4KKwkobWRfYXNzZW1ibGUpOiBIYW5kbGUgcmVsYXhhYmxlIG9wZXJhbmRzL2luc3RydWN0aW9ucyBjb3JyZWN0bHkuCisJKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogSW1wbGVtZW50LgorCSogY29uZmlnL3RjLW1uMTAyMDAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KKworVHVlIEphbiAyOCAxNToyNzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogR2l2ZSBhbiBlcnJvciBmb3IganVtcHMgdG8gYQorCW1pc2FsaWduZWQgYWRkcmVzcy4KKwkobWRfYXBwbHlfZml4KTogTWFrZSBhIGJyYW5jaCB0byBhbiBvZGQgYWRkcmVzcyBhbiBlcnJvciByYXRoZXIKKwl0aGFuIGEgd2FybmluZy4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWRfY29udmVydF9mcmFnKTogSWYgdGhlIHVzZXIgZXhwbGljaXRseQorCXJlcXVlc3RlZCBhbiBleHRlbmRlZCBvcGNvZGUsIHBhc3Mgd2FybiBhcyB0cnVlIHRvIG1pcHMxNl9pbW1lZC4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlIGEgbWlzc2luZyBleHByZXNzaW9uIGxpa2UKKwlhbiBleHBsaWNpdCAwLCBzbyB0aGF0IGV4cGxpY2l0bHkgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zIHdvcmsKKwljb3JyZWN0bHkuCisKK01vbiBKYW4gMjcgMTc6NDE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogRG9uJ3QgZ2VuZXJhdGUgYSBsb2NhbCBFQ09GRgorCXN5bWJvbCBmb3IgYSBjb21tb24gc3ltYm9sLgorCitXZWQgSmFuIDIyIDEwOjM5OjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwlQYXRjaCBwcmVzdW1lZCB0byBoYXZlIGJlZW4gY2hlY2tlZCBpbiBhd2hpbGUgYWdvIGJ1dCB3YXNuJ3QuCisJTW9uIE5vdiAyNSAxMDo0NToxNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKwkqIHdyaXRlLmM6IERlbGV0ZSAiaWZuZGVmIG1kX3JlbGF4X2ZyYWciIGFyb3VuZCBpc19kbnJhbmdlLgorCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX29yZyk6IE1vdmUgY29kZSBpbnNpZGUgYnJhY2VzLiAgTW92ZSBsb2NhbHMKKwl0YXJnZXQsYWZ0ZXIgaW5zaWRlIHRvby4KKwkocmVsYXhfc2VnbWVudCwgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudCk6IEd1dHMgbW92ZWQgdG8gLi4uCisJKHJlbGF4X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCisJQ2FsbCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gaWYgZGVmaW5lZC4KKworTW9uIEphbiAyMCAxMDo1Njo0NyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFJlamVjdCBwYy1yZWxhdGl2ZSBhZGRyZXNzZXMgZm9yIHRoZQorIAkncCcgb3BlcmFuZCBzcGVjaWZpZXIuCisKK01vbiBKYW4gMjAgMTA6Mzk6MzYgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKEhBVkVfTE9OR19CUkFOQ0gpOiBOZXcgbWFjcm8sIHJldHVybnMgdHJ1ZSBmb3IKKyAJbTY4ayBmYW1pbHkgY3B1cyB3aGljaCBzdXBwb3J0IGxvbmcgYnJhbmNoIGFkZHJlc3NpbmcgbW9kZXMuCisJKG02OGtfaXAsIG1kX2NvbnZlcnRfZnJhZ18xLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwKKyAJbWRfY3JlYXRlX2xvbmdfanVtcCk6IFVzZSBpdC4KKworTW9uIEphbiAyMCAxMjo0MjowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IFNFQ19BTExPQyBvciBTRUNfTE9BRCBmb3IKKwl0aGUgLnJlZ2luZm8gb3IgLk1JUFMub3B0aW9ucyBzZWN0aW9uIGlmIGNvbmZpZ3VyZWQgZm9yIGFuCisJZW1iZWRkZWQgdGFyZ2V0LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IERvbid0IHNldCBpbnRlcmxvY2tzIGZvcgorCW1pcHNfNDY1MC4KKworV2VkIEphbiAxNSAxMzo1MTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTWFrZSBzdXJlIHRoZSBzeW1ib2wgZW5kcyB3aXRoCisJd2hpdGVzcGFjZSBiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgJz0nLgorCitUdWUgSmFuIDE0IDE1OjA3OjI3IDE5OTcgIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChzY29faWQpOiBNb3ZlZCBmcm9tIGhlcmUuLi4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKHNjb19pZCk6IC4uLnRvIGhlcmUuICBBZGRpbmcgdGhlIGlkZW50aWZpZXIKKwlyZWFsbHkgaXMgYW4gU0NPIEVMRiBzcGVjaWZpYyB0aGluZywgbm90IGp1c3QgYSBTQ08geDg2IHNwZWNpZmljCisJdGhpbmcuCisKK01vbiBKYW4gMTMgMjI6NDM6MDEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IERvbid0IHJlcXVpcmUgJ2NvZmYnLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitUaHUgSmFuICA5IDA5OjA4OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDaGVjayBmb3Igb3ZlcmZsb3cgb2YgYSBuZWdhdGl2ZSB2YWx1ZQorCWNvcnJlY3RseS4KKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBsYWJlbF9saW5lKTogRGVmaW5lLgorCShsYWJlbHMsIGN1cnJlbnRfbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkobWRfYXNzZW1ibGUpOiBNYXJrIGN1cnJlbnRfbGFiZWwgYXMgdGV4dCwgYW5kIGNsZWFyIGl0LgorCShtNjhrX2Zyb2JfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCisJKG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCisJKG02OGtfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvdGMtbTY4ay5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgorCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KKwkodGNfZnJvYl9zeW1ib2wpOiBEb24ndCB3YXJuLCBqdXN0IGNhbGwgbTY4a19mcm9iX3N5bWJvbC4KKwkodGNfZnJvYl9jb2ZmX3N5bWJvbCk6IExpa2V3aXNlLgorCisJKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFdoZW4gZGVmaW5pbmcgYSBtYWNybyBpbiBNUkkgbW9kZSwKKwlkb24ndCBhZGQgdGhlIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLgorCitUdWUgSmFuICA3IDExOjIxOjQyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuX3JlbG9jKTogSGFuZGxlIHN5bTEtc3ltMiBmaXh1cHMKKwloZXJlIHNpbmNlIGZpeHVwX3NlZ21lbnQgZG9lc24ndCAobGlua3JlbGF4IGlzIHNldCkuCisJKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KKworTW9uIEphbiAgNiAxNToxOTozMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogVHdlYWsgZnhfb2Zmc2V0IGZvciBwYy1yZWxhdGl2ZQorCXJlbG9jcy4KKworRnJpIEphbiAgMyAxNjo0NzowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QpOiBUd2VhayBmeF9yX2ZpZWxkJ3MgdHlwZQorCXRvIGF2b2lkIHdhcm5pbmdzIHdpdGggdGhlIG5hdGl2ZSBIUCBjb21waWxlci4KKwkoZml4X25ld19ocHBhKTogU2ltaWxhcmx5IGZvciB0aGUgcl90eXBlIGFyZ3VtZW50LgorCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uKTogRW5jbG9zZQorCWluIGFuICNpZiBPQkpfRUxGIHRvIGtlZXAgZ2NjIC1XYWxsIHF1aWV0LgorCShtZF9hcHBseV9maXgpOiBBbHdheXMgaW5pdGlhbGl6ZSAicmVzdWx0Ii4KKworCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBHZW5lcmF0ZSByZWxvY2F0aW9ucy4KKworRnJpIEphbiAgMyAxODoxNzoyMyAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlnL3RjLW02OGsuYyAoc19ldmVuKTogQWRqdXN0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGN1cnJlbnQKKwlzZWN0aW9uLgorCitGcmkgSmFuICAzIDE3OjEwOjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZmlsZV9zeW1ib2wpOiBXaGVuIHVzaW5nIEVDT0ZGIGRlYnVnZ2luZywKKwlwYXNzIG9uIHRoZSBuZXcgZmlsZSBob29rLgorCisJKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZml4X2FkanVzdGFibGUpOiBOb3QgcXVpdGUgdGhlIHNhbWUgYXMKKwkhYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiwgYXMgbG9jYWwgTElURVJBTHMgY2FuIGJlIGFkanVzdGVkIHRvIGJlCisJcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24uCisKK0ZyaSBKYW4gIDMgMTI6MDk6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoeWFua19zeW1ib2xzKTogSWYgdGNfZnJvYl9jb2ZmX3N5bWJvbCBpcworCWRlZmluZWQsIGNhbGwgaXQuCisJKiBjb25maWcvdGMtbTY4ay5oICh0Y19mcm9iX3N5bWJvbCk6IENoZWNrIHdoZXRoZXIgdGV4dCBsYWJlbCBpcworCWFsaWduZWQgdG8gb2RkIGJvdW5kYXJ5LgorCSh0Y19mcm9iX2NvZmZfc3ltYm9sKTogRGVmaW5lLgorCisJKiBkb2MvYXMudGV4aW5mbyAoU2V0KTogQ2hhbmdlIHBhcmVudGhlc2l6ZWQgQHhyZWYgdG8gQHB4cmVmLgorCisJKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IEluIE1SSSBtb2RlLCBqdXN0IGNvcHkgYSBzaW5nbGUgJi4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENhbGwgZnJhZ19ncm93IGJlZm9yZSBhZGRpbmcgYQorCVBDSU5ERVggZnJhZy4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFjY2VwdCAnQicgYXMgYSBzaXplIGZvciBhbgorCWltbWVkaWF0ZSB2YWx1ZS4KKwkobWRfYXNzZW1ibGUpOiBJZiB0aGUgc2l6ZSBpcyAnQicsIHNldCBmeF9zaWduZWQuCisJKG1kX2FwcGx5X2ZpeF8yKTogVXNlIGZ4X3NpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KKworCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IEFkZCBmeF9zaWduZWQgZmllbGQuCisJKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9ub19vdmVyZmxvdyBhbmQKKwlmeF9zaWduZWQgZmllbGRzLgorCShmaXh1cF9zZWdtZW50KTogVXNlIGZ4X3NpZ25lZCB3aGVuIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ2hlY2sgZnhfbm9fb3ZlcmZsb3cgYW5kCisJZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgorCitUaHUgSmFuICAyIDEzOjM3OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTk9URVMsIE5PVEVTLmNvbmZpZzogUmVtb3ZlZC4gIFRoZXNlIGFyZSByYXJlbHksIGlmIGV2ZXIsCisJdXBkYXRlZCwgYW5kIGFsbCB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGluIGRvYy9pbnRlcm5hbHMudGV4aS4KKworCUJhc2VkIG9uIHBhdGNoIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2hlY2sgZm9yIGNvbmRpdGlvbmFsIG9wZXJhdG9ycworCWJlZm9yZSBkb2luZyBhbiBNUkkgcGVuZGluZyBhbGlnbm1lbnQuCisJKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wKTogRGVjbGFyZS4KKwkodGNfY29uZGl0aW9uYWxfcHNldWRvcCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfY29uZGl0aW9uYWxfcHNldWRvcCk6IE5ldyBmdW5jdGlvbi4KKwkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEZXNjcmliZQorCXRjX2NvbmRpdGlvbmFsX3BzZXVkb29wLgorCisJQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgorCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpOiBOZXcgc3RhdGljCisJdmFyaWFibGUuCisJKG1kX2JlZ2luKTogQ2hlY2sgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgYmVmb3JlIHNldHRpbmcKKwltNjhrX3JlbDMyLgorCShtNjhrX21yaV9tb2RlX2NoYW5nZSk6IExpa2V3aXNlLgorCShtZF9sb25nb3B0cyk6IEFkZCAtLWRpc3Atc2l6ZS1kZWZhdWx0LTE2IGFuZAorCS0tZGlzcC1zaXplLWRlZmF1bHQtMzIuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KKwkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCisJKiBkb2MvYy1tNjhrLnRleGkgKE02OEstT3B0cyk6IERvY3VtZW50IG5ldyBvcHRpb25zLgorCisJQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgorCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pbmRleF93aWR0aF9kZWZhdWx0KTogTmV3IHN0YXRpYworCXZhcmlhYmxlLgorCShtNjhrX2lwKTogVXNlIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCB0byBzZXQgdGhlIHNpemUgb2YgYSBiYXNlCisJcmVnaXN0ZXIgd2hvc2Ugc2l6ZSB3YXMgbm90IGdpdmVuLgorCShtZF9sb25nb3B0cyk6IEFkZCAtLWJhc2Utc2l6ZS1kZWZhdWx0LTE2IGFuZAorCS0tYmFzZS1zaXplLWRlZmF1bHQtMzIuCisJKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KKwkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gbmV3IG9wdGlvbnMuCisJKiBkb2MvYy1tNjhrLnRleGkgKE02OEstT3B0cyk6IERvY3VtZW50IG5ldyBvcHRpb25zLgorCisJKiBkb2MvYy1taXBzLnRleGk6IE1lbnRpb24gSVNBIGxldmVsIDQsIGFuZCB0aGUgLW1pcHMxNiBvcHRpb24uCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1pcHMtKi1saW51eCogdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmV3cml0ZSA2NCBiaXQgaGFuZGxpbmcgdG8KKwl3b3JrIGlmIHZhbHVlVCBpcyBvbmx5IDMyIGJpdHMuCisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IFRocm91Z2hvdXQsIGNoZWNrIHRhcmdldF9iaWdfZW5kaWFuIHJhdGhlcgorIAl0aGFuIGJ5dGVfb3JkZXIuCisgCShieXRlX29yZGVyKTogUmVtb3ZlLgorCShtaXBzX2luaXRfYWZ0ZXJfYXJncyk6IFJlbW92ZS4KKwkqIGNvbmZpZy90Yy1taXBzLmggKExJVFRMRV9FTkRJQU4sIEJJR19FTkRJQU4pOiBEb24ndCBkZWZpbmUuCisJKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVjbGFyZS4KKwkodGNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVmaW5lLgorCisJKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2FmdGVyX3JlbG9jcyk6IERlZmluZSBpZgorCU9CSl9NQVlCRV9FTEYuCisJKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KKwkoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBMaWtld2lzZS4KKworVHVlIERlYyAzMSAxNToxMjozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWYgdGhpcyBpcyBzc3Que2gsd30gb3IKKwlzbGQue2gsd30gYW5kIHRoZSBvcGVyYW5kIGlzIHJlbG9jYXRhYmxlLCBhZGp1c3QgdGhlIGFkZW5kIGJ5CisJc2hpZnRpbmcgaXQgcmlnaHQgb25lIGJpdC4KKworVHVlIERlYyAzMSAxMjo1Njo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogQ2hlY2sgbXJpX3BlbmRpbmdfYWxpZ24gYWZ0ZXIKKwljaGVja2luZyBmb3IgYSBtYWNyby4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZQorCTxyZmdAbW9ua2V5cy5jb20+LgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6IFJlbmFtZSBmcm9tIG1kX2FwcGx5X2ZpeCwgYW5kCisgCWFkZCBzZWdtZW50IGFyZ3VtZW50LiAgSWYgT0JKX0VMRiwgdHJlYXQgYSByZWxvY2F0aW9uIGFnYWluc3QgYQorIAlzeW1ib2wgaW4gYSBsaW5rb25jZSBzZWN0aW9uIGxpa2UgYSByZWxvY2F0aW9uIGFnYWluc3QgYW4gZXh0ZXJuYWwKKyAJc3ltYm9sLgorCSogY29uZmlnL3RjLXNwYXJjLmggKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCisKK01vbiBEZWMgMzAgMTE6MzU6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBBZGQgY2FzZSBmb3IgTV9BQlMuCisKK0ZyaSBEZWMgMjcgMjI6NTE6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE5PVEVTLmNvbmZpZyAoSW1wbGVtZW50YXRpb24pOiBhcy5oICNkZWZpbmUncyAiR0FTIiBub3QgImdhcyIsCisJaW5jbHVkZXMgY29uZmlnLmggaW5zdGVhZCBvZiBob3N0LmgsIHRjLmggaW5zdGVhZCBvZiB0cC5oLCBhbmQKKwl0YXJnLWVudi5oIGluc3RlYWQgb2YgdGFyZ2V0LWVudmlyb25tZW50LmguCisJQWxzbywgb2JqLWZvcm1hdC5oIGluY2x1ZGVzIHRhcmctY3B1LmggaW5zdGVhZCBvZgorIAl0YXJnZXQtcHJvY2Vzc29yLmguCisJKiBjb25maWd1cmUuaW4gKGNhc2UgJHtnZW5lcmljX3RhcmdldH0pOiBBZGQgdGljODAtKi1jb2ZmIGVudHJ5LgorCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCisJKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZi90aWM4MC5oKTogSW5jbHVkZSBpZiBUQ19USUM4MCBkZWZpbmVkLgorCShUQVJHRVRfRk9STUFUKTogRGVmaW5lIHRvICJjb2ZmLXRpYzgwIi4KKwkqIGNvbmZpZy90Yy10aWM4MC5jOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KKwkqIGNvbmZpZy90Yy10aWM4MC5oOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KKwkKK0ZyaSBEZWMgMjcgMTE6NDI6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbyAoTSk6IE1lbnRpb24gZXhwbGljaXRseSB0aGF0IC1NIGNoYW5nZXMgbWFjcm8KKwloYW5kbGluZy4KKworVGh1IERlYyAxOSAxMjowNjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogSWYgdGhlIGZpeHVwIHN5bWJvbCBoYXMgYmVlbgorCWVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCwgY29udmVydCB0aGUgZml4dXAgdG8gYmVpbmcgYWdhaW5zdAorCXRoZSB0YXJnZXQgc3ltYm9sLiAgUmVtb3ZlIG9ic29sZXRlIGNvZGUgaGFuZGxpbmcgYSBzcGVjaWFsIGNhc2UKKwlmb3IgaTM4NiBQSUMuCisKK1dlZCBEZWMgMTggMjI6NTQ6MzkgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KKworV2VkIERlYyAxOCAxNjowMDo0MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAoZG9fYXNzZW1ibGUpOiBDb3JyZWN0IHByZXZpb3VzIGJ1ZyBmaXguCisKK1dlZCBEZWMgMTggMTU6Mjc6NDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogRml4IGJ1ZyB3aGljaCBjYXVzZWQKKwlzZWNvbmQgaW5zdHJ1Y3Rpb24gaW4gYSBsaW5lIHRvIGJlIGNhc2Ugc2Vuc2l0aXplLgorCitXZWQgRGVjIDE4IDEwOjA4OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobW4xMDIwMF9pbnNlcnRfb3BlcmFuZCk6IERvbid0CisJcmFuZ2UgY2hlY2sgb3BlcmFuZHMgd2l0aCBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSyBzZXQuCisJKGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KKworVHVlIERlYyAxNyAxMDo1OTozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IFVuZG8gcGFydCBvZiBsYXN0IEZyaWRheSdzIGFsaWdubWVudCBjaGFuZ2VzLgorIAkobWRfYmVnaW4pOiBBbHdheXMgYWxpZ24gdGhlIHRleHQgc2VjdGlvbiB0byBhIGZvdXIgYnl0ZQorCWJvdW5kYXJ5LgorCShhcHBlbmRfaW5zbik6IFJlbW92ZSBjYWxsIHRvIHJlY29yZF9hbGlnbi4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbl9sYWJlbCk6IFJlbW92ZS4KKwkoc3RydWN0IGluc25fbGFiZWxfbGlzdCk6IERlZmluZS4KKwkoaW5zbl9sYWJlbHMsIGZyZWVfaW5zbl9sYWJlbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkobWlwc19jbGVhcl9pbnNuX2xhYmVscyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGFwcGVuZF9pbnNuKTogTWFyayBhbGwgbWlwczE2IHRleHQgbGFiZWxzLCBhbmQgbWFrZSB0aGVtIG9kZC4KKwlIYW5kbGUgYWxsIGxhYmVscyBhZnRlciBlbWl0dGluZyBhIG5vcCwgbm90IGp1c3Qgb25lLiAgQ2FsbAorCW1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgcmF0aGVyIHRoYW4ganVzdCBjbGVhcmluZyBpbnNuX2xhYmVsLgorCShtaXBzX2VtaXRfZGVsYXlzKTogQWRkIGluc25zIHBhcmFtZXRlciwgYW5kIHVzZSBpdCB0byBkZWNpZGUKKwl3aGV0aGVyIHRvIG1hcmsgbWlwczE2IGxhYmVscy4gIEhhbmRsZSBhbGwgbGFiZWxzLCBub3QganVzdCBvbmUuCisJRm9yY2UgbWlwczE2IGxhYmVscyB0byBiZSBvZGQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKG1pcHMxNl9pbW1lZCk6IERvbid0IGNoZWNrIGZvciBhbiBvZGQgYnJhbmNoIHRhcmdldC4KKwkobWRfYXBwbHlfZml4KTogRG9uJ3QgY2hlY2sgbWlwczE2IG1vZGUgZm9yIGEgYnJhbmNoIHJlbG9jLgorCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IElnbm9yZSB0aGUgbG93IGJpdCBpbiBhIGJyYW5jaCB0YXJnZXQuCisJKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgorCShtaXBzX25vX3ByZXZfaW5zbik6IENhbGwgbWlwc19jbGVhcl9pbnNuX2xhYmVscyByYXRoZXIgdGhhbiBqdXN0CisJY2xlYXJpbmcgaW5zbl9sYWJlbC4KKwkobWlwc19hbGlnbiwgbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCwgc19jb25zKTogTGlrZXdpc2UuCisJKHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBMaWtld2lzZS4KKwkoc19hbGlnbik6IFVzZSBpbnNuX2xhYmVscyByYXRoZXIgdGhhbiBpbnNuX2xhYmVsLgorCShzX2NvbnMsIHNfZmxvYXRfY29ucywgc19ncHdvcmQpOiBMaWtld2lzZS4KKwkobWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgorCShtaXBzX2RlZmluZV9sYWJlbCk6IFJld3JpdGUgdG8gYWRkIHRvIGluc25fbGFiZWxzIGxpc3QuCisJKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgorCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gY29tZXMKKwlvdXQgb2RkLCBpbmNyZW1lbnQgaXQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogT25seSB1cGRhdGUgcHJldl9pbnNuIHdoZW4gbm90CisJcmVvcmRlcmluZyBpZiBwbGFjZSBpcyBOVUxMLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBDaGVjayBmb3IgYSBtaXNzaW5nIGV4cHJlc3Npb24KKwl3aGVuIHVzaW5nIHRoZSByZWdpc3RlciBpbmRpcmVjdCBhZGRyZXNzaW5nIG1vZGUuCisKK01vbiBEZWMgMTYgMTA6MDg6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDIwMC5jIChtbjEwMjAwX2luc2VydF9vcGVyYW5kKTogRG9uJ3QKKwljaGVjayAyNGJpdCBvcGVyYW5kcyBmb3Igb3ZlcmZsb3cuCisJKGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KKworTW9uIERlYyAxNiAxMTo1MDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRvYy9hcy50ZXhpbmZvIChTZWN0aW9uKTogRG9jdW1lbnQgaG93IHRvIHVzZSB0aGUgLnNlY3Rpb24KKwlwc2V1ZG8tb3AgZm9yIENPRkYgYW5kIEVMRi4KKworU3VuIERlYyAxNSAxNToyNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRml4IGxpbmtvbmNlIGNoZWNrIGZvciBFTEYuCisKK1NhdCBEZWMgMTQgMjI6Mzc6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X2luc25fcmVsb2NfdHlwZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKFJFTEFYX01JUFMxNl9FTkNPREUpOiBBZGQgZHNsb3QgYW5kIGphbF9kc2xvdCBhcmd1bWVudHMsIGFuZAorCXN0b3JlIHRoZW0uICBBZGp1c3Qgb3RoZXIgUkVMQVhfTUlQUzE2IG1hY3Jvcy4KKwkoUkVMQVhfTUlQUzE2X0RTTE9UKTogRGVmaW5lLgorCShSRUxBWF9NSVBTMTZfSkFMX0RTTE9UKTogRGVmaW5lLgorCShhcHBlbmRfaW5zbik6IFBhc3MgbmV3IGFyZ3VtZW50cyB0byBSRUxBWF9NSVBTMTZfRU5DT0RFLiAgQ29ycmVjdAorCWhhbmRsaW5nIG9mIHdoZXRoZXIgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZml4dXAuICBTZXQKKwlwcmV2X2luc25fcmVsb2NfdHlwZS4KKwkobWlwc19ub19wcmV2X2luc24pOiBDbGVhciBwcmV2X2luc25fcmVsb2NfdHlwZS4KKwkobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBVc2UgdGhlIHJpZ2h0IGJhc2UgYWRkcmVzcyBmb3IgYSBQQworCXJlbGF0aXZlIGFkZCBvciBsb2FkLgorCShtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4gIElmIGEgUEMgcmVsYXRpdmUgYWRkIG9yIGxvYWQgaXMKKwl1c2VkLCByZWNvcmQgdGhlIGFsaWdubWVudCBmb3IgdGhlIHNlY3Rpb24uCisKK0ZyaSBEZWMgMTMgMTM6MDA6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IERvbid0IHJlZHVjZSBhIHJlbG9jIGFnYWluc3QgYQorCWxpbmtvbmNlIHNlY3Rpb24gaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBSZW1vdmUgbm9wIGluc3RydWN0aW9ucyBhZnRlcgorCWJyYW5jaCBpbnN0cnVjdGlvbnMuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogSWYgY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgRUxGCisJc3lzdGVtLCBkb24ndCBzZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IHRvIDIqKjQuCisJKHNfY2hhbmdlX3NlYyk6IExpa2V3aXNlLgorCShhcHBlbmRfaW5zbik6IENhbGwgcmVjb3JkX2FsaWdubWVudCBmb3IgdGhlIHNlY3Rpb24uCisJKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBhbGlnbiB0aGUgc2VjdGlvbiBzaXplIGZvciBhbiBlbWJlZGRlZAorCUVMRiBzeXN0ZW0uCisKK1RodSBEZWMgMTIgMTY6NDA6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IE1ha2Ugc3VyZSB0aGF0IHN5bWJvbHMgYXJlCisJcmVzb2x2ZWQ7IGV4cHJlc3Npb24gc3ltYm9scyBtYXkgaGF2ZSBiZWVuIHNraXBwZWQuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgorCitUaHUgRGVjIDEyIDE1OjE4OjIxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IE1vdmUgQHBsdCB0bworCUJGRF9SRUxPQ18yNF9QTFRfUENSRUwgcmVsb2NhdGlvbi4KKwkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTC4KKworVHVlIERlYyAxMCAxMzo1MTo1NSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IFJlbW92ZSBjb2RlIHRoYXQgY2FsbGVkCisJcGFyYWxsZWxfb2soKSB3aGVuIHRoZSBwcm9ncmFtbWVyIHNwZWNpZmllZCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCisKK1R1ZSBEZWMgMTAgMTI6MjM6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVwZGF0ZSB0byBoYW5kbGUgZW5kaWFubmVzcworCWlzc3VlcyBjb3JyZWN0bHkuCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogT3Bjb2RlIDB4MCBpcyB2YWxpZCEKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCisKK1R1ZSBEZWMgMTAgMTE6Mzc6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbQorCWluIGEgZnJhZyBhZnRlciBhIG1pcHMxNiBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggaXQgd2l0aCBhIGp1bXAKKwlpbnN0cnVjdGlvbi4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBHaXZlIGFuIGVycm9yIGZvciBhbgorCWF0dGVtcHQgdG8gdXNlIGEgbm9uIGFic29sdXRlIHN5bWJvbCBpbiBhbiBleHRlbmRpbmcgZnJhZy4KKworTW9uIERlYyAgOSAxNjo0ODoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmM6IEZsZXNoIG91dCBhc3NlbWJsZXIgc3VwcG9ydCBmb3IgTU4xMDIwMC4KKwkqIGNvbmZpZy90Yy1tbjEwMjAwLmg6IExpa2V3aXNlLgorCitNb24gRGVjICA5IDE3OjA5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogQXQgdGhlIGVuZCBvZiBhIEMgY29tbWVudCwgcGFzcyBzcGFjZSB0bworCVVOR0VUIHJhdGhlciB0aGFuIFBVVC4gIFNldCBvbGRfc3RhdGUgYmVmb3JlIHNldHRpbmcgc3RhdGUgdG8gLTIuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQXZvaWQgYW4gaW5maW5pdGUgbG9vcAorCXdoZW4gZXh0ZW5kaW5nIGJlY2F1c2UgdGhlIHZhbHVlIGlzIGV4YWN0bHkgbWF4dGlueSArIDEuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKFJFTEFYX01JUFMxNl9FTkNPREUpOiBBZGQgc21hbGwgYW5kIGV4dAorCWFyZ3VtZW50cywgYW5kIHN0b3JlIHRoZW0uICBBZGp1c3Qgb3RoZXIgUkVMQVhfTUlQUzE2IG1hY3Jvcy4KKwkoUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwpOiBEZWZpbmUuCisJKFJFTEFYX01JUFMxNl9VU0VSX0VYVCk6IERlZmluZS4KKwkobWlwczE2X3NtYWxsLCBtaXBzMTZfZXh0KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKGFwcGVuZF9pbnNuKTogUGFzcyBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQgdG8KKwlSRUxBWF9NSVBTMTZfRU5DT0RFLgorCShtaXBzMTZfaXApOiBTZXQgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0LgorCShtaXBzMTZfaW1tZWQpOiBEb24ndCBjaGVjayBtaXBzMTZfYXV0b2V4dGVuZC4KKwkobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBDaGVjayBVU0VSX1NNQUxMIGFuZCBVU0VSX0VYVC4KKworCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogUHJpbnQgYW4gZXJyb3IgZm9yIGFuIG91dCBvZiByYW5nZQorCWZpeHVwLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgorCisJKiBhcy5jIChtYWluKTogVW5saW5rIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBhcmUgZXJyb3JzIHdoaWxlCisJZ2VuZXJhdGluZyB0aGUgZml4dXBzLgorCitGcmkgRGVjICA2IDE4OjQ4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBEb24ndCBjYWxsCisJU19HRVRfVkFMVUUuCisJKG1kX2NvbnZlcnRfZnJhZyk6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgYmVmb3JlIGNhbGxpbmcKKwlTX0dFVF9WQUxVRSwgYW5kIGRvbid0IGFkZCBpbiB0aGUgZnJhZyBhZGRyZXNzLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaW1tZWQpOiBBZGQgZmlsZSBhbmQgbGluZSBwYXJhbWV0ZXJzLAorCWFuZCB1c2UgdGhlbSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisKK0ZyaSBEZWMgIDYgMTU6MzY6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jOiBGaXggdmFyaW91cyBnY2MgLVdhbGwgd2FybmluZ3MuCisJUmVtb3ZlICckJyBwcmVmaXhpbmcgZm9yIHJlZ2lzdGVycy4KKworRnJpIERlYyAgNiAwMDo1NTo0OCAxOTk2ICBNYXJ0aW4gIDxodW50QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogQ2hlY2sgdG8gc2VlIGlmIHByZXZfc2VnCisJaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzaW5nIGl0LgorCShkMTB2X2NsZWFudXApOiBObyBsb25nZXIgdXNlcyBpdHMgYXJndW1lbnQsIHNvIG1ha2UgaXQgdm9pZC4KKworCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogQ2hhbmdlIHByb3RvdHlwZS4KKwkKK1RodSBEZWMgIDUgMTE6MDM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgZGlzY2FyZCB0aGUgc3ltYm9sIGZvciBhIFBDCisJcmVsYXRpdmUgZml4dXAgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLgorCitXZWQgRGVjICA0IDE1OjQyOjQxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChtZF9hc3NlbWJsZSwgZDEwdl9jbGVhbnVwKTogRml4IGJ1ZworCXdpdGggbXVsdGlwbGUgc2VjdGlvbnMuCisKK1dlZCBEZWMgIDQgMTM6MDA6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9sb25nb3B0cyk6IFJlbmFtZSBtaXBzLTE2IHRvIG1pcHMxNiwgYW5kCisJbm8tbWlwcy0xNiB0byBuby1taXBzMTYuCisJKHNfbWlwc3NldCk6IEFjY2VwdCAuc2V0IG1pcHMxNiBhbmQgLnNldCBub21pcHMxNi4KKworV2VkIERlYyAgNCAxMDozNTozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBUYWtlIGV4cHJlc3Npb25TIHBvaW50ZXIKKwlhcmd1bWVudCwgYW5kIGNoZWNrIGZvciArLy0gY29uc3RhbnQgZm9sbG93aW5nIHRoZSBzdWZmaXgsIGZvbGRpbmcKKwlpdCBpbnRvIHRoZSBleHByZXNzaW9uLgorCShwcGNfZWxmX2NvbnMpOiBDaGFuZ2UgcHBjX2VsZl9zdWZmaXggY2FsbHMuCisJKG1kX2Fzc2VtYmxlKTogRGl0dG8uCisJKHNobGliKTogUmVwbGFjZSBib29sZWFuIG1yZWxvY2F0YWJsZSB3aXRoIGVudW1lcmF0aW9uIHNobGliLgorCShtZF9wYXJzZV9vcHRpb24pOiBEaXNjcmltaW5hdGUgYmV0d2VlbiBQSUMgc3R5bGUgc2hhcmVkIGxpYnJhcmllcworCWFuZCAtbXJlbG9jYXRhYmxlLgorCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IERvbid0IHJlcG9ydCB3YXJuaW5ncyBmb3IgUElDIHN0eWxlIHNoYXJlZAorCWxpYnJhcmllcy4KKworVHVlIERlYyAgMyAyMzoxODoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuaCAoe3RjLHBwY31fY29tbWVudF9jaGFycyk6IERlZmluZSwgc28gdGhhdCB3ZSBjYW4KKwljaGFuZ2UgdGhlIGNvbW1lbnQgY2hhcmFjdGVycy4KKworCSogY29uZmlnL3RjLXBwYy5jIChjb21tZW50X2NoYXJzKTogRGVsZXRlIGluIGZhdm9yIG9mCisJdGNfY29tbWVudF9jaGFycy4KKwkocHBjX3tlYWJpLHNvbGFyaXN9X2NvbW1lbnRfY2hhcnMpOiBFYWJpIGFuZCBTb2xhcmlzIHZlcnNpb25zIG9mCisJY29tbWVudCBjaGFycy4KKwkocHBjX2NvbW1lbnRfY2hhcnMpOiBTZWxlY3QgYXBwcm9wcmlhdGUgY29tbWVudCBjaGFycyBieSBkZWZhdWx0LgorCShtc29sYXJpcyk6IE5ldyBmbGFnIGZvciAtbXssbm8tfXNvbGFyaXMuCisJKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtSyBwaWMuICBBZGQgc3VwcG9ydCBmb3IKKwktbXssbm8tfXNvbGFyaXMuCisJKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUuCisJKG1kX2JlZ2luKTogRG8gbm90IHNldCBFTEYgZmxhZ3MgaWYgU29sYXJpcy4KKwkocHBjX2VsZl9zdWZmaXgpOiBAbG9jYWwgc2V0cyBSX1BQQ19MT0NBTDI0UEMgcmVsb2NhdGlvbi4KKwkobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19MT0NBTDI0UEMuCisKK01vbiBEZWMgIDIgMTM6NDg6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcy5jIChtYWluKTogQ29ycmVjdCBoYW5kbGluZyBvZiBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQuCisKK1N1biBEZWMgIDEgMjE6NDY6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW5fcmVsb2MpOiBHZXQgdGhlIGFkZGVuZCBmcm9tCisJZnhfb2Zmc2V0LCBub3QgZnhfYWRkbnVtYmVyLgorCisJKiBjb25maWcvdGMtbW4xMDMwMC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGRvIGFueQorCXJlbG9jIGFkanVzdG1lbnRzLgorCitTYXQgTm92IDMwIDE3OjM0OjQ4IDE5OTYgIEVsaW90IERyZXNzZWxoYXVzICA8ZWxpb3RAd2FsbHkuZWRjLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYzogQ29ycmVjdCBtaXNzcGVsbGluZzogYmFsZW5jZWQgdG8gYmFsYW5jZWQuCisKK1dlZCBOb3YgMjcgMTM6MjU6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9zZWN0aW9uX2FsaWduKTogQ2hlY2sgZm9yIGFuIGFsaWdubWVudCBvZgorCTQsIG5vdCBhbiBhbGlnbm1lbnQgb2YgMTYuICBDb3JyZWN0cyBBdWd1c3QgNyBwYXRjaC4KKworVHVlIE5vdiAyNiAxMDozMzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IERvbid0IGdpdmUgYW4gZXJyb3IgaWYgbm8KKwlhbGlnbm1lbnQgaXMgc3BlY2lmaWVkLgorCisJQWRkIHN1cHBvcnQgZm9yIG1pcHMxNiAoMTYgYml0IE1JUFMgaW1wbGVtZW50YXRpb24pOgorCSogY29uZmlnL3RjLW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyBmb3IgbWlwczE2IHN1cHBvcnQsIG5vdAorCWxpc3RlZCBoZXJlLgorCShSRUxBWF9PTEQsIFJFTEFYX05FVyk6IFVzZSBvbmx5IDcgYml0cyBlYWNoLgorCShpbnNuX3VzZXNfcmVnKTogQ2hhbmdlIGxhc3QgcGFyYW1ldGVyIHRvIGFuIGVudW0uCisJKiBjb25maWcvdGMtbWlwcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSKTogRGVmaW5lIGFzIDAuCisJKG1kX3JlbGF4X2ZyYWcpOiBEZWZpbmUgYXMgbWlwc19yZWxheF9mcmFnLgorCShtaXBzX3JlbGF4X2ZyYWcpOiBEZWNsYXJlLgorCShzdHJ1Y3QgbWlwc19jbF9pbnNuKTogQWRkIHVzZV9leHRlbmQgYW5kIGV4dGVuZCBmaWVsZHMuCisJKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgorCSogY29uZmlnL29iai1lbGYuaCAoU19HRVRfT1RIRVIpOiBEZWZpbmUuCisJKFNfU0VUX09USEVSKTogRGVmaW5lLgorCitNb24gTm92IDI1IDE4OjAyOjI5IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BiZWF1dHkuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEltcGxlbWVudCBjYXNlcyBmb3IgbmV3IDwsID4sIG0sIG4sCisgCW8gYW5kIHAgb3BlcmFuZCBzcGVjaWZpZXJzLgorCitNb24gTm92IDI1IDEwOjQ1OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiB3cml0ZS5jOiBEZWxldGUgImlmbmRlZiBtZF9yZWxheF9mcmFnIiBhcm91bmQgaXNfZG5yYW5nZS4KKwkocmVsYXhfc2VnbWVudCwgY2FzZSByc19vcmcpOiBNb3ZlIGNvZGUgaW5zaWRlIGJyYWNlcy4gIE1vdmUgbG9jYWxzCisJdGFyZ2V0LGFmdGVyIGluc2lkZSB0b28uCisJKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQpOiBHdXRzIG1vdmVkIHRvIC4uLgorCShyZWxheF9mcmFnKTogTmV3IGZ1bmN0aW9uLgorCUNhbGwgbWRfcHJlcGFyZV9yZWxheF9zY2FuIGlmIGRlZmluZWQuCisJKiBjb25maWcvdGMtbTY4ay5oIChtZF9wcmVwYXJlX3JlbGF4X3NjYW4pOiBSZW5hbWVkIGZyb20KKwlNNjhLX0FJTV9LTFVER0UuCisKK01vbiBOb3YgMjUgMDg6NDk6MzYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jIChhZGRyZXNzX3JlZ2lzdGVycyk6IFVzZSAnJCcgYXMgcmVnaXN0ZXIKKwlwcmVmaXggaW5zdGVhZCBvZiAnJScuCisJKGRhdGFfcmVnaXN0ZXJzLCBvdGhlcl9yZWdpc3RlcnMsIG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKGFkZHJlc3NfcmVnaXN0ZXJzKTogVXNlICclJyBwcmVmaXggZm9yIHJlZ3MuCisJKGRhdGFfcmVnaXN0ZXJzLCBvdGhlcl9yZWdpc3RlcnMsIG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGx5IGRldGVybWluZSB0aGUKKwljb3JyZWN0IGxvY2F0aW9uIGFuZCB0eXBlIGZvciBlYWNoIHJlbG9jYXRpb24uCisJKG1kX3BjcmVsX2Zyb20pOiBTaW1wbGlmeS4KKworRnJpIE5vdiAyMiAxNTo0MjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJbXByb3ZlIHdhcm5pbmcgd2hlbiBicmFuY2ggaXMKKwljb252ZXJ0ZWQgaW50byBicmFuY2ggYXJvdW5kIGJyYW5jaC4KKworVGh1IE5vdiAyMSAxMTo1NjoxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKERJRkZfRVhQUl9PSyk6IERvbid0IGRlZmluZSB0aGlzLgorCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCByZWxvY3MgYWdhaW5zdCB3ZWFrIHN5bWJvbHMgb3IgCisJcGMtcmVsYXRpdmUgcmVsb2NzLgorCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYmVnaW4pOiBTZXQgbGlua3JlbGF4LgorCShtZF9hc3NlbWJsZSk6IENyZWF0ZSBmaXh1cHMgYXMgbmVlZGVkLgorCShtZF9hcHBseV9maXgzKTogR3V0LiAgSXQgc2hvdWxkbid0IGV2ZXIgZ2V0IGNhbGxlZCBhbnltb3JlLgorCitUdWUgTm92IDE5IDE3OjQ4OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBXaGVuIGF1dG9tYXRpY2FsbHkgY29udmVydGluZworCXNlcmlhbCBvcHMgdG8gcGFyYWxsZWwsIGRvIG5vdCBjb25zaWRlciBhIGJyYW5jaCBhcyB0aGUgZmlyc3QKKwlpbnN0cnVjdGlvbi4KKworVHVlIE5vdiAxOSAxMzozNToyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVC4KKworTW9uIE5vdiAxOCAxNToyNjo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBQcm92aWRlIHByb3RvdHlwZQorCXZpYSBQQVJBTVMuCisJKGNoZWNrX29wZXJhbmQpOiBMaWtld2lzZS4KKworTW9uIE5vdiAxOCAxNToyMjoyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogQnJhbmNoIGFuZCBsaW5rIGluc3RydWN0aW9ucworCW1vZGlmeSByMTMuCisJKHdyaXRlXzJfc2hvcnQpOiBDYWxsIHBhcmFsbGVsX29rIHRvIGNoZWNrIHdoZXRoZXIgdHdvIHNob3J0CisJaW5zdHJ1Y3Rpb25zIHRoZSB1c2VyIHJlcXVlc3RlZCBleGVjdXRlIGluIHBhcmFsbGVsLCBjYW4gYmUKKwlleGVjdXRlZCB0aGF0IHdheS4KKworVGh1IE5vdiAxNCAxMToxNzo0OSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEZpeCBidWcgdGhhdCB3b3VsZG4ndAorCWFsbG93IGEgYnJhbmNoIGFuZCBsaW5rIGluIHBhcmFsbGVsIHdpdGggYW4gZXhlIGluc3RydWN0aW9uLgorCitGcmkgTm92ICA4IDEzOjU1OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkb2MvYy1kMTB2LnRleGk6IEFkZCBpbmZvIG9uIEB3b3JkIG1vZGlmaWVyLgorCitXZWQgTm92ICA2IDEzOjQ2OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKwkKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBNTjEwMzAwX09QRVJBTkRfU1BMSVQKKwlvcGVyYW5kcyBhcmUgYXNzdW1lZCB0byBiZSAzMmJpdHMuICBVc2UgImJpdHMiIGZpZWxkIHRvIGhvbGQgdGhlCisJbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElULgorCShtbjEwMzAwX2NoZWNrX29wZXJhbmQpOiBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZHMgYXJlIGFzc3VtZWQKKwl0byBiZSAzMmJpdHMuCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBTaGlmdCBsb3cgcGFydAorCW9mIGEgTU4xMDMwMF9PUEVSQU5EX1NQTElUIG9wZXJhbmQgYnkgb3BlcmFuZC0+c2hpZnQuCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBIYW5kbGUKKwlNTjEwMzAwX09QRVJBTkRfU1BMSVQuCisKK1R1ZSBOb3YgIDUgMTM6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEluc2VydCBvcGVyYW5kcyBpbnRvCisJdGhlIGV4dGVuc2lvbiBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuCisJKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBBY2NlcHQgcG9pbnRlciB0byBleHRlbnNpb24gd29yZAorCWFyZ3VtZW50LiAgTWFrZSBpbnNuIGEgcG9pbnRlciBhcmd1bWVudCB0b28uICBSZXR1cm4gdHlwZQorCWlzIG5vdyB2b2lkLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KKworTW9uIE5vdiAgNCAxMjo1Mzo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBIYW5kbGUKKwlyZXBlYXRlZCByZWdpc3RlciBvcGVyYW5kcy4KKworRnJpIE5vdiAgMSAxMDo0Mjo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRvYy9hcy50ZXhpbmZvOiBBZGRlZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgorCisJKiBjb25maWcvdGMtYWxwaGEuYzogQ2hhbmdlIHVzZXMgb2Ygdm9pZCAqIHRvIFBUUi4gIENoYW5nZSB0aGUKKwlhbHBoYV9tYWNybyBlbWl0IGZpZWxkIHRvIGV4cGVjdCBhIGNvbnN0IGFyZ3VtZW50LCBhbmQgY2hhbmdlIHRoZQorCWFyZyBmaWVsZCB0byBiZSBjb25zdC4gIEZpeCBzb21lIHNwYWNpbmcgdG8gZm9sbG93IHRoZSBHTlUKKwlzdGFuZGFyZC4KKworRnJpIE5vdiAgMSAxMDozMjowMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBrbm93bGVkZ2Ugb2YgMjExNjRwYworCShwY2E1NikgYW5kIDIxMjY0IChldjYpIGNwdXMuCisJKG1kX2FwcGx5X2ZpeCk6IFByaXZhdGUgcmVsb2NhdGlvbiB0eXBlcyBhcmUgbm93IG5lZ2F0aXZlLgorCShhbHBoYV9mb3JjZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCisJKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgorCShlbWl0X2luc24pOiBMaWtld2lzZS4KKwkoZW1pdF9sZFh1KTogRG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gdGhlIGhhcmR3YXJlIGNhbiBkbyBieXRlIGluc25zLgorCShlbWl0X3N0WCk6IExpa2V3aXNlLgorCShlbWl0X3NleHRYKTogTGlrZXdpc2UuCisKK1RodSBPY3QgMzEgMTY6MzM6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgb24KKwlhIHN5bWJvbCBmb3VuZCBpbiBhIHJlbG9jLgorCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSW1wcm92ZSB0aGUgZXJyb3IgbWVzc2FnZSBpZgorCWFuIHVuZGVmaW5lZCBzeW1ib2wgaXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgorCitXZWQgT2N0IDMwIDIwOjE1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZG9jL2ludGVybmFscy50ZXhpOiBSZXdyaXRlLCBhbmQgYWRkIGEgbG90IG9mIGRvY3VtZW50YXRpb24uCisJKiBkb2MvTWFrZWZpbGUuaW4gKGludGVybmFscy5pbmZvKTogTmV3IHRhcmdldC4KKworV2VkIE9jdCAzMCAxNDo1NTo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy12ODUwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcworCWFnYWluc3Qgd2VhayBzeW1ib2xzLgorCitUdWUgT2N0IDI5IDEyOjI4OjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBsb3NlIGZvciByZWxheGFibGUKKwlhZGRyZXNzZXMgbGlrZSAuKzYuCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IE1ha2Ugc3VyZSB3ZSBpbnNlcnQgdGhlCisJZml4dXAgYXQgdGhlIHJpZ2h0IGFkZHJlc3Mgd2l0aGluIHRoZSBmcmFnLgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBEb24ndCBzZXQgZnJhZ1AtPmZyX2ZpeAorCXRvIGFuIGFic29sdXRlIHZhbHVlLCBpbnN0ZWFkIGluY3JlbWVudCBpdCBhcyBuZWVkZWQuCisKKwkqIGNvbmZpZy90Yy12ODUwLmggKFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtdjg1MC5jOiBGaXggc29tZSBpbmRlbnRpb24gcHJvYmxlbXMuCisJKG1kX3JlbGF4X3RhYmxlKTogRGVmaW5lIGZvciBEOS0+RDk5IGJyYW5jaCBkaXNwbGFjZW1lbnQKKwlyZWxheGluZy4KKwkobWRfY29udmVydF9mcmFnKTogRG8gc29tZXRoaW5nIHVzZWZ1bCBpbnN0ZWFkIG9mIGFib3J0aW5nLgorCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IExpa2V3aXNlLgorCShtZF9hc3NlbWJsZSk6IE5vdGUgaWYgdGhlIG1hdGNoaW5nIGluc3RydWN0aW9uIGhhcyBhIHJlbGF4YWJsZQorCW9wZXJhbmQuICBJZiBpdCBkb2VzLCBhbGxvY2F0ZSBmcmFnIHdpdGggZnJhZ192YXIgYW5kIGRvbid0CisJZG8gYW55IGZpeHVwcy4KKworTW9uIE9jdCAyOCAxMDo0ODo0MCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuaCAobWRfY2xlYW51cCk6IE5ldyBmdW5jdGlvbi4gIFRoaXMgaXMgbmVlZGVkIHRvCisJd3JpdGUgb3V0IGFueSBidWZmZXJlZCBpbnN0cnVjdGlvbnMgd2hlbiBhICIuZW5kIiBpcyBmb3VuZC4KKworTW9uIE9jdCAyOCAxMDo0Mzo0NSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBOZXcgaG9vayBtZF9jbGVhbnVwKCkuCisKK0ZyaSBPY3QgMjUgMDA6MDE6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IFVzZSBtYWtlX2V4cHJfc3ltYm9sIHRvIGJ1aWxkIGFuCisJZXhwcmVzc2lvbiBzeW1ib2wgZm9yIGEgY29tcGxleCBmaXh1cC4KKworVGh1IE9jdCAyNCAxNDozMTowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogU2V2ZXJhbCBkaXNndXN0aW5nCisJaGFja3MgdG8gaW1wcm92ZSBwYXJzaW5nIG9mIGNvbXBsZXggaGksIGxvLCB6ZGEsIGV0YworCWV4cHJlc3Npb25zLgorCShtZF9hc3NlbWJsZSk6IERvbid0IGRlbWFuZCBhbmQgZWF0IGEgdHJhaWxpbmcgJyknIGFmdGVyIGZpbmRpbmcKKwlhIHY4NTAgcmVsb2NhdGlvbiBwcmVmaXguICBTaWduIGV4dGVuZCB0aGUgY29uc3RhbnQgaW4gYQorCUJGRF9SRUxPQ19MTzE2IGV4cHJlc3Npb24uICBEbyBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIgYSBjb21wbGV0ZQorCW9wZXJhbmQuCisJKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwKTogRG9uJ3QgZWF0IGEgdHJhaWxpbmcgJyknIGFmdGVyCisJZmluZGluZyBhIHY4NTAgcmVsb2NhdGlvbiBwcmVmaXguCisKKwkqIGNvbmZpZy90Yy12ODUwLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTik6IERlZmluZS4KKwkoVENfQ09OU19GSVhfTkVXKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtdjg1MC5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCk6IE5ldyBmdW5jdGlvbi4KKwkoY29uc19maXhfbmV3X3Y4NTApOiBMaWtld2lzZS4KKworCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgVERBIHJlbG9jcy4KKworV2VkIE9jdCAyMyAxODoyMDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEdpdmUgYSBiZXR0ZXIgd2FybmluZyBtZXNzYWdlCisJZm9yIGFuIHVua25vd24gcmVsb2NhdGlvbiB0eXBlLgorCitXZWQgT2N0IDIzIDE2OjIxOjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC53b3JkOyBhbGxvY2F0ZXMKKwk0IGJ5dGVzIG9mIHNwYWNlLgorCitUdWUgT2N0IDIyIDIyOjAxOjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgVERBT0ZGIHJlbG9jcworCWRpZmZlcmVudGx5IGZvciBtb3ZlYSAmIHNzdC9zbGQgaW5zbnMuCisKK1R1ZSBPY3QgMjIgMTc6MDk6MzIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IERvbid0IGFsbG93IGlsbGVnYWwgY29tYmluYXRpb25zCisJb2YgaW5zdHJ1Y3Rpb25zLgorCitUdWUgT2N0IDIyIDExOjI4OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogb2JqLmggKHN0cnVjdCBmb3JtYXRfb3BzKTogQWRkIGZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQuCisJKiBjb25maWcvb2JqLW11bHRpLmggKG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgorCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mb3JtYXRfb3BzKTogSW5pdGlhbGl6ZSBuZXcKKwlmcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGZpZWxkLgorCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zvcm1hdF9vcHMpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy1taXBzLmM6IFVuZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIGJlZm9yZQorCWluY2x1ZGluZyBvYmotZWxmLmguCisKK01vbiBPY3QgMjEgMTE6Mzg6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChjb25zX2ZpeF9uZXdfbWlwcyk6IE9ubHkgdHJlYXQgOCBieXRlIHJlbG9jCisJc3BlY2lhbGx5IGlmIG5vdCBFTEYuCisJKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfNjQuCisJKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfNjQuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBpbmNyZW1lbnQgdmFsdWUgZm9yIGEgUEMKKyAJcmVsYXRpdmUgcmVsb2Mgd2hlbiBCRkRfQVNTRU1CTEVSIGFuZCBPQkpfQU9VVCAobW9yZSB1Z2x5IGdhcworIAlyZWxvYyBoYWNraW5nKS4KKworCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfREVGSU5FKTogbm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbjoKKwlEb24ndCBjaGVjayBTX0dFVF9PVEhFUi4KKworRnJpIE9jdCAxOCAxNDowNjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBBY2NlcHQgYW4gb2RkIGZsb2F0aW5nIHBvaW50CisJcmVnaXN0ZXIgd2l0aCBsLnMgb3Igcy5zLgorCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3BzZXVkb190YWJsZSk6IFVzZSBvYmpfYW91dF90eXBlIGZvcgorCS50eXBlIHBzZXVkby1vcC4KKwkob2JqX2FvdXRfdHlwZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKK1RodSBPY3QgMTcgMTc6NTU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoJChPQkpTKSk6IERlcGVuZCB1cG9uIGxpYmliZXJ0eS5oLgorCitXZWQgT2N0IDE2IDExOjI4OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBSZWNvZ25pemUgemRhb2ZmLCB0ZGFvZmYKKwlhbmQgc2Rhb2ZmIGV4cHJlc3Npb25zLgorCisJKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgYWRkIHN5bWJvbCB2YWx1ZSB0byBhZGRlbmQgaWYKKwlUQ19WODUwIGFuZCBPQkpfRUxGLgorCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgYW55CisJcGMtcmVsYXRpdmUgZml4dXBzLgorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogVW5kbyB5ZXN0ZXJkYXkncyBjaGFuZ2VzLgorCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IExpa2V3aXNlLgorCitUdWUgT2N0IDE1IDIzOjE5OjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGNyZWxfZnJvbSk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCisJKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IERlZmluZS4KKworTW9uIE9jdCAxNCAxMzo1OToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBBZGQgY2FzdCB0byBvZmZzZXRUIHdoZW4gdXNpbmcKKwlhIGNvbnN0YW50IHdpdGggJn4uCisKK01vbiBPY3QgMTQgMTE6MjQ6MjggMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBNb3ZlIEVDT0ZGIGRlYnVnIHByb2Nlc3NpbmcgdG8gLi4uCisJKGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogLi4uIGhlcmUuICBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZnJvbV9maWxlX2FmdGVyX3JlbG9jcyk6IE5ldyBtYWNyby4KKwkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCAqZnJvYl9hZnRlcl9yZWxvY3MgYWZ0ZXIgdGhlCisJY2FsbCB0byB3cml0ZV9yZWxvY3MuCisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVc2UgbmV3IEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCByZWxvYy4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IERvbid0IFNFVF9WQUxVRSBvbiB0aGUgc2VjdGlvbgorCXN5bWJvbCwgYXMgdGhpcyBtZXNzZXMgdXAgbGlua2luZy4gIEluc3RlYWQsIGV4cGFuZCB0aGUgcmVjdXJzaXZlIGNhbGwKKwlpbmxpbmUgYW5kIGNoYW5nZSB1cCB0aGUgYXBwcm9wcmlhdGUgYml0cyB0byBnZXQgdGhlIDB4ODAwMCBvZmZzZXQKKwlpbiB0aGUgcmVsb2MgYWRkZW5kLgorCitUaHUgT2N0IDEwIDE3OjMwOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogUGVybWl0IHRoZSBkaWZmZXJlbmNlIG9mCisJdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUgc2VnbWVudCB0byBiZSBhZGp1c3RlZC4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgQ1BVLVZFTkRPUi1saW51eC1nbnUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBPY3QgMTAgMTc6MjI6MTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IENoYW5nZSBtb3N0IHdhcm5pbmdzIGludG8KKwllcnJvcnMuCisJKHBwY19lbGZfdmFsaWRhdGVfZml4KTogRGl0dG8uCisJKG1kX2Fzc2VtYmxlKTogRGl0dG8uCisJKHBwY190Yyk6IERpdHRvLgorCShwcGNfcGVfc2VjdGlvbik6IERpdHRvLgorCShwcGNfZnJvYl9zeW1ib2wpOiBEaXR0by4KKworVGh1IE9jdCAxMCAxMjowNTo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogUGFzcyBhbiBleHRyYSBzaGlmdCBjb3VudAorCXRvIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgYmFzZWQgb24gdGhlIG9wY29kZSBmb3JtYXQuCisJKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBBY2NlcHQgYW5kIHVzZSBleHRyYSBzaGlmdCBjb3VudAorCXBhcmFtZXRlci4KKworCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVc2UgRk1UXyogbWFjcm9zIGZvcgorCWZvcm1hdHMgcmF0aGVyIHRoYW4gaGFyZC1jb2RlZCBjb25zdGFudHMuCisKKwkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogRm9ybWF0IEQ1IGluc3RydWN0aW9ucworCWFyZSA3IGJ5dGVzIGxvbmcuICBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb25zIGluIGJpZy1lbmRpYW4gZm9ybWF0LgorCitUdWUgT2N0ICA4IDE0OjU2OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBUd2VhayBmdXJ0aGVyIHNvCisJdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBwYXJzZWQgY29ycmVjdGx5LgorCitUdWUgT2N0ICA4IDEzOjAyOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXMuaDogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkoeG1hbGxvYywgeHJlYWxsb2MpOiBEb24ndCBkZWNsYXJlLgorCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBsaWJpYmVydHkuaC4KKwkqIGV4cHIuYywgcmVhZC5jLCBzdGFicy5jLCBjb25maWcvb2JqLWNvZmYuYzogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtbWlwcy5jOiBMaWtld2lzZS4KKwkqIG1lc3NhZ2VzLmM6IExpa2V3aXNlLgorCSh4c3RyZXJyb3IpOiBEb24ndCBkZWNsYXJlLgorCSogeG1hbGxvYy5jOiBSZW1vdmUuCisKK01vbiBPY3QgIDcgMTY6NTM6MjMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMDMwMC5oIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIFJlbW92ZS4KKwkoc3lzdGVtX3JlZ2lzdGVycywgY2NfbmFtZXMpOiBMaWtld2lzZS4KKwkoYWRkcmVzc19yZWdpc3RlcnMsIGRhdGFfcmVnaXN0ZXJzLCBvdGhlcl9yZWdpc3RlcnMpOiBOZXcgcmVnaXN0ZXIKKwlhcnJheXMuCisJKHJlZ2lzdGVyX25hbWUsIHN5c3RlbV9yZWdpc3Rlcl9uYW1lLCBjY19uYW1lKTogUmVtb3ZlLgorCShtbjEwMzAwX3JlbG9jX3ByZWZpeCk6IExpa2V3aXNlLgorCShkYXRhX3JlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSwgb3RoZXJfcmVnaXN0ZXJfbmFtZSk6IExpa2V3aXNlLgorCShtZF9hc3NlbWJsZSk6IFJvdWdoIGN1dCBhdCBwYXJzaW5nIG9wZXJhbmRzLiAgUmVtb3ZlIGxvdHMgb2YKKwl1bndhbnRlZCBjb2RlLgorCShtZF9hcHBseV9maXgzKTogRGlzYWJsZSBmb3Igbm93LgorCitNb24gT2N0ICA3IDExOjM4OjM0IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChzZWxlY3RfY29udHJvbF9yZWdzKTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQKKwlvdXQgb2YgbTY4a19pbml0X2FmdGVyX2FyZ3MuCisJKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIGl0LgorCShtcmlfY2hpcCk6IFVzZSBpdCBoZXJlIGFzIHdlbGwgdG8gdXBkYXRlIHNldCBvZiBhbGxvd2VkIGNvbnRyb2wKKwlyZWdzIGZvciBtb3ZlYy4KKworTW9uIE9jdCAgNyAxMToyNDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9iZWdpbik6IE5ldyBmdW5jdGlvbi4KKwkob2JqX2VsZl9zZWN0aW9uKTogQWRkIHRoZSBzZWN0aW9uIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLgorCSogY29uZmlnL29iai1lbGYuaCAob2JqX2JlZ2luKTogRGVmaW5lLgorCShlbGZfYmVnaW4pOiBEZWNsYXJlLgorCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBvYmpfYmVnaW4gaWYgaXQgaXMKKwlkZWZpbmVkLgorCitGcmkgT2N0ICA0IDE4OjM3OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBTdWJ0cmFjdCB0aGUgc2VjdGlvbiBhZGRyZXNzCisJZnJvbSBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIFRDX002OEsuCisKK1RodSBPY3QgIDMgMTU6MTU6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogTWFrZSAudWFoYWxmLCAudWF3b3JkLCBhbmQKKwkudWF4d29yZCBhdmFpbGFibGUgZXZlbiBpZiBub3QgT0JKX0VMRi4KKwkobWRfYXRvZik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgd29yZFAuCisKK1RodSBPY3QgIDMgMDA6MTY6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtbW4xMHgwMC5jLCBjb25maWcvdGMtbW4xMHgwMC5oOiBOZXcgZmlsZXMKKwlmb3IgTWF0c3VzaGl0YSBNTjEweDAwIHN1cHBvcnQuCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtbjEweDAwLSotKgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCitXZWQgT2N0ICAyIDE1OjU0OjAzIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBvYmotZXZheC5oOiBtb3ZlIG9wZW52bXMgZGVmaW5pdGlvbnMgZnJvbSBoZXJlIHRvIHRjLWFscGhhLmMuCisJKiB0Yy1hbHBoYS5jOiBhZGQgc3VwcG9ydCBmb3Igdm1zX2Nhc2VfaGFjayBsaWtlIGluIHZheC92bXMuCisJKGxvYWRfZXhwcmVzc2lvbik6IHRyYWNrIGNsb2JiZXJpbmcgb2YgYmFzZSByZWcgYmVmb3JlIGptcC9qc3IuCisJKHNfYWxwaGFfZmlsZSk6IHBhc3MgY2FzZV9oYWNrIGZsYWdzIGFuZCBzb3VyY2UgZmlsZW5hbWUgdmlhCisJc3ltYm9sIHRhYmxlIHRvIGJmZC4KKwkqIHRjLWFscGhhLmggKFRDX0NPTlNfRklYX05FVyk6IGRlZmluZQorCitUdWUgT2N0ICAxIDE2OjE2OjAxIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG1pcHMtKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIG1pcHMtKi1lbGYqLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgT2N0ICAxIDEyOjM3OjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChzX21hY3JvKTogV2FybiBpZiBhIG1hY3JvIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKKwlwc2V1ZG8tb3AuCisJKHNfc3BhY2UpOiBJbiBtNjhrIE1SSSBtb2RlLCBhbGlnbiB0byBhIHdvcmQgYm91bmRhcnkuCisJKiBtYWNyby5jIChkZWZpbmVfbWFjcm8pOiBBZGQgbmFtZXAgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAorCWNhbGxlcnMuCisJKiBtYWNyby5oIChkZWZpbmVfbWFjcm8pOiBVcGRhdGUgZGVjbGFyYXRpb24uCisKKwkqIGFzLmMgKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCisJKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgdmVyc2lvbiBwcmludGluZyB0byBtYXRjaCBjdXJyZW50IEdOVQorCXN0YW5kYXJkcy4KKwkqIGdhc3AuYyAoc2hvd191c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KKwkobWFpbik6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VIHN0YW5kYXJkcy4KKworCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IENvcnJlY3QgYWNjZXNzIGNvbnRyb2wgdW5pdAorCXJlZ2lzdGVyIG51bWJlcnMuICBGcm9tIEtlbiBSb3NlIDxyb3NlQG5ldGNvbS5jb20+LgorCisJKiBjb25maWcvdGMtYWxwaGEuYzogQWRkIHNvbWUgc3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgCShhbHBoYV9tYWNyb3MpOiBNb3ZlIHRvIHRvcCBvZiBmaWxlLiAgTWFrZSBzdGF0aWMuCisJKGFscGhhX251bV9tYWNyb3MpOiBNb3ZlIHRvIHRvcCBvZiBmaWxlLgorCitUdWUgT2N0ICAxIDA5OjM2OjE5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHRjLXY4NTAuaDogIERlZmluZSBMT0NBTF9MQUJFTCB0byByZWNvZ25pc2UgXy5MXyogc3ltYm9scworCWdlbmVyYXRlZCBieSBEV0FSRi4KKworU2F0IFNlcCAyOCAwMzozODowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBSZW1vdmUgYm9ndXMgY29kZSBpbiBCRkQ2NCBjYXNlLAorCWFuZCBqdXN0IGNhbGwgc3ByaW50Zl92bWEuCisKK1RodSBTZXAgMjYgMTY6MDQ6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBleHByLmMgKGV4cHIpOiBDaGFuZ2UgPj49IHRvID4+IChmaXggdHlwbykuICAoRnJvbSBtZWlzc25lcikuCisKK1R1ZSBTZXAgMjQgMTk6MDU6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKGZsb2F0X2NvbnMpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlmIGl0IGlzCisJZGVmaW5lZC4KKworVHVlIFNlcCAyNCAxMjoyMjoxOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAobWRfb3BlcmFuZCk6IENyZWF0ZWQuICBBbGxvd3Mgb3BlcmFuZHMgdG8gCisJc3RhcnQgd2l0aCAnIycuCisJKiBjb25maWcvdGMtZDEwdi5oIChtZF9vcGVyYW5kKTogVW5kZWZpbmVkLgorCitNb24gU2VwIDIzIDEyOjEzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAoYWRkX2ZpeCk6IFRyZWF0IGEgd2lkdGggb2YgJzMnIGxpa2UgJ0InLgorCShtZF9hc3NlbWJsZSk6IEEgZml4dXAgd2lkdGggb2YgJzMnIG1lYW5zIGEgMSBieXRlIHJlbG9jLgorCitUaHUgU2VwIDE5IDEyOjIxOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGp1c3QgUEMgcmVsYXRpdmUKKwlyZWxvYyBmb3IgdGhlIGk5NjAgZm9yIGEgcmVsb2MgaW4gdGhlIHNhbWUgc2VjdGlvbi4gIFRoaXMgdW5kb2VzCisJb25lIG9mIHRoZSB0d28gY2hhbmdlcyBtYWRlIEF1ZyAxOS4KKworV2VkIFNlcCAxOCAxMjoxMTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IEJvdGggdmVyc2lvbnM6IE1vdmUgQ19TVEFUCisJc3ltYm9scyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKworTW9uIFNlcCAxNiAxMTo0MTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGV4cHIuYyAoZXhwcik6IEFsd2F5cyB1c2UgdW5zaWduZWQgcmlnaHQgc2hpZnRzIGZvciA+Pi4KKworVGh1IFNlcCAxMiAxMDoyNTo0NSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IFVwZGF0ZSB0d28gdGh1bWIgaW5zdHJ1Y3Rpb24KKyAJc2xvdHMgd2hlbiBwcm9jZXNzaW5nIEJMIGZpeHVwcy4KKworCSogY29uZmlnL3RjLWFybS5jIChvdXRwdXRfaW5zdCk6IEVuc3VyZSBUaHVtYiBCTCBmaXh1cCBpcyBtYXJrZWQKKyAJb24gdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGluc3RydWN0aW9uLgorCitXZWQgU2VwIDExIDAwOjA5OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IENyZWF0ZSBhbiBleHByZXNzaW9uIHN5bWJvbCBmb3IgYSBjb21wbGV4CisJc3RhYnMgZXhwcmVzc2lvbiwgcmF0aGVyIHRoYW4gZ2l2aW5nIGFuIGVycm9yLgorCisJKiBlY29mZi5jIChlY29mZl9uZXdfZmlsZSk6IERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBzdGlsbCBpbgorCXRoZSBzYW1lIGZpbGUuCisKK1R1ZSBTZXAgMTAgMTE6NDU6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IEZpbGwgaW4gdGhlIHZhbHVlIGZvciBhIGNvbnN0YW50CisJanVtcCwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSByZWxvYy4KKworTW9uIFNlcCAgOSAxMDo1Nzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBhbiBpbnN0cnVjdGlvbiB3aGljaAorCXNldHMgYSBjb25kaXRpb24gY29kZSB3aXRoIGFuIGluc3RydWN0aW9uIHdoaWNoIHVzZXMgYSBjb25kaXRpb24KKwljb2RlLgorCShtaXBzX2lwKTogSW4gY2FzZXMgJ04nIGFuZCAnTScsIGxvb2sgZm9yICRmY2NOIHJhdGhlciB0aGFuIGFuCisJaW1tZWRpYXRlIHZhbHVlLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IFJlY29nbml6ZSByNTAwMCBmb3IgY3B1LgorCShtaXBzX2lwKTogR2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmIHRoZSBJU0EgbGV2ZWwgaXMgd3JvbmcuCisJKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtbWNwdT1bdl1bcl01MDAwLgorCitTYXQgU2VwICA3IDEzOjI1OjU1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogY29uZmlnL3RjLW1pcHMuYyAoQ09VTlRfVE9QX1pFUk9FUyk6IEFkZGVkIG1hY3JvIHRvIGNvdW50CisgCWxlYWRpbmcgemVyb2VzLgorCShsb2FkX3JlZ2lzdGVyKTogRW5zdXJlIGhpMzIgYml0cyBhcmUgbm90IGxvc3QgZHVyaW5nIGxvMzJiaXQKKyAJcHJvY2Vzc2luZy4gRml4IHNoaWZ0IG9mZnNldCB0aGF0IHdhcyBvdmVyZmxvd2luZyBpbnRvIHRoZSBuZXh0CisgCWluc3RydWN0aW9uIGZpZWxkLiBBZGQgY29kZSB0byBnZW5lcmF0ZSBzaG9ydGVyIHNlcXVlbmNlcyBmb3IKKyAJY29uc3RhbnRzIHdpdGggYSBzaW5nbGUgY29udGlndW91cyBzZXFldWVuY2Ugb2Ygb25lcy4KKworRnJpIFNlcCAgNiAxNzowNzoxMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAoZDEwdl9kb3Rfd29yZCk6IE5ldyBmdW5jdGlvbiB0byBzdXBwb3J0CisJIkB3b3JkIiB3aXRoIHRoZSB3b3JkIHBzZXVkby1vcC4KKwkobWRfYXBwbHlfZml4Myk6IENsZWFudXAgYW5kIGNoYW5nZXMgdG8gc3VwcG9ydCBjb3JyZWN0IHNpemVzCisJZm9yIDE2IGFuZCAxOC1iaXQgcmVsb2NzLgorCitGcmkgU2VwICA2IDE2OjAwOjI5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1hb3V0KTogU2V0IGBlbScuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlnL3RlLXNwYXJjYW91dC5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KKwlJZmRlZiBURV9TUEFSQ09VVCBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBhbmQgU1BBUkNfQklFTkRJQU4uCisJKiBjb25maWcvdGMtc3BhcmMuYyAoSU5TTl9CSUdfRU5ESUFOKTogTmV3IG1hY3JvLgorCShTUEVDSUFMX0NBU0Vfe1NFVFNXLFNFVFh9KTogRGVmaW5lLgorCSh7Tk9QLE9SLEZNT1ZTLFNFVEhJLFNMTFgsU1JBfV9JTlNOKTogRGVmaW5lLgorCShtZF9iZWdpbik6IERlbGV0ZSBzZXR0aW5nIG9mIGB0YXJnZXRfYmlnX2VuZGlhbicuCisJKG91dHB1dF9pbnNuKTogTmV3IGZ1bmN0aW9uLgorCShtZF9hc3NlbWJsZSk6IFJld3JpdGUuICBBZGQgYHNldHgnIHN1cHBvcnQuCisJKHNwYXJjX2lwKTogSGFuZGxlIGAwJyBvcGVyYW5kIGNoYXIuICBSZWNvZ25pemUgc2V0dXcsIHNldHN3LCBzZXR4CisJc3BlY2lhbCBjYXNlcy4KKwkobWRfYXRvZik6IEFkZCBsaXR0bGUgZW5kaWFuIHN1cHBvcnQuCisJKG1kX251bWJlcl90b19jaGFycyk6IExpa2V3aXNlLgorCShtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KKwkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLUVMLC1FQiBpZmRlZiBTUEFSQ19CSUVORElBTi4KKwkobWRfcGFyc2Vfb3B0aW9uKTogTGlrZXdpc2UuCisJKG1kX3Nob3dfdXNhZ2UpOiBQcmludCAtRUwsIC1FQiBpZmRlZiBTUEFSQ19CSUVORElBTi4KKworVGh1IFNlcCAgNSAxMzo0MDoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmMgKGVjb2ZmX25ld19maWxlKTogTmV3IGZ1bmN0aW9uLgorCSogZWNvZmYuaCAoZWNvZmZfbmV3X2ZpbGUpOiBEZWNsYXJlLgorCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfYXBwX2ZpbGUpOiBEZWZpbmUuCisKK1RodSBTZXAgIDUgMTM6Mzk6MjUgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBCaWFzIHRoZSAubGl0OCBzZWN0aW9uCisJc3ltYm9sIGJ5IDMyayBzbyB0aGF0IG91ciAxNi1iaXQgc2lnbmVkIG9mZnNldCBjYW4gYWRkcmVzcyB0aGUKKwllbnRpcmUgY2h1bmsuICBSZXBvcnRlZCBieSA8bWF0dEBsa2cuZGVjLmNvbT4uCisKK1dlZCBTZXAgIDQgMTA6MjM6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0bXAuCisKK1dlZCBTZXAgIDQgMTE6MjQ6MjkgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGNvZGUgdGhhdAorIAl3YXMgY2F1c2luZyB0aGUgaGlnaCAzMmJpdHMgb2YgNjRiaXQgY29uc3RhbnRzIHRvIGJlIGxvc3QuCisJCitUdWUgU2VwICAzIDEzOjUyOjU2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBjaGFuZ2VzIHRvIHN1cHBvcnQgZnVuY3Rpb24KKwlwb2ludGVycyBhbmQgIkB3b3JkIiBzeW50YXguCisKK1R1ZSBTZXAgIDMgMTE6NTc6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtdjg1MC5jOiBSZW1vdmUgY29tbWVudGVkIG91dCBhbmQgI2lmIDAnZCBjb2RlLgorCSh2ODUwX3JlbG9jX3ByZWZpeCk6IFByb3ZpZGUgcHJvdG90eXBlLgorCShwb3N0Zml4LCBnZXRfcmVsb2MsIGJ1aWxkX2luc24pOiBSZW1vdmUgcHJvdG90eXBlcyBmb3Igbm9uZXhpc3RhbnQKKwlmdW5jdGlvbnMuCisJKG1kX2JlZ2luLCBtZF9hc3NlbWJsZSwgbWRfYXBwbHlfZml4Myk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCShtZF9hc3NlbWJsZSk6IEFkZCBkZWZhdWx0IHRvIGNhc2Ugc3RhdGVtZW50LgorCitTYXQgQXVnIDMxIDE2OjAzOjAwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb21wdXRlIHNpemUgb2YgdGhlIGluc3RyY3Rpb24KKwlmcm9tIHRoZSBvcGNvZGUuCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBzaW1wbGUgYnl0ZSwgc2hvcnQgYW5kCisJd29yZCBmaXh1cHMgdG9vLgorCitGcmkgQXVnIDMwIDIzOjUwOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IFVzZSBsaXR0bGUgZW5kaWFuIGdldC9wdXQKKwlyb3V0aW5lcyB0byBmZXRjaC9zdG9yZSB0aGUgdXBkYXRlZCBpbnN0cnVjdGlvbiBmcm9tL3RvIG1lbW9yeS4KKwkodjg1MF9pbnNlcnRfb3BlcmFuZCk6IElmIHRoZSBvcGVyYW5kIGhhcyBhIHNwZWNpYWxpemVkIGluc2VydAorCXJvdXRpbmUsIGNhbGwgaXQuCisKK0ZyaSBBdWcgMzAgMTg6MzU6MjYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEFsaWduIGNhbGxpbmcgY29udmVudGlvbiB0bworIAliZSBsaWtlIGlkZW50aWNhbCBmdW5jdGlvbiBmb3VuZCBpbiB0Yy1wcGMuYy4KKwkoZ2V0X3JlbG9jKTogUmVtb3ZlZC4KKwkodjg1MF9yZWxvY19wcmVmaXgpOiBOZXcgZnVuY3Rpb24sIHBhcnNlIGxvKCksIGhpKCkgYW5kIGhpMCgpLgorCShtZF9hc3NlbWJsZSk6IGVtaXQgZml4dXBzLgorCShtZF9wY3JlbF9mcm9tKTogcmVuYW1lZCBmcm9tIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgZW1pdCBwcm9wZXIKKyAJZGlzcGxhY2VtZW50LgorCShtZF9hcHBseV9maXgzKTogaGFuZGxlIGZpeHVwcy9yZWxvY3MuCisJKiBjb25maWcvdGMtdjg1MC5oIChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBSZW1vdmVkIGRlZmluaXRpb24uCisJCitGcmkgQXVnIDMwIDE4OjEyOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUFkZCBTSCBFTEYgc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZS5pbiAoc2gtKi1lbGYqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZy90Yy1zaC5oIChUQVJHRVRfQVJDSCk6IERlZmluZS4KKwkoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KKyAJKFRDX0NPRkZfRklYMlJUWVBFKTogT25seSBkZWZpbmUgaWYgT0JKX0NPRkYuCisJKEJGRF9BUkNILCBDT0ZGX01BR0lDLCBUQ19DT1VOVF9SRUxPQyk6IExpa2V3aXNlLgorCShUQ19SRUxPQ19NQU5HTEUsIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IExpa2V3aXNlLgorCShET19OT1RfU1RSSVAsIE5FRURfRlhfUl9UWVBFLCBUQ19LRUVQX0ZYX09GRlNFVCk6IExpa2V3aXNlLgorCShUQ19DT0ZGX1NJWkVNQUNIREVQLCB0Y19mcm9iX2ZpbGUpOiBMaWtld2lzZS4KKwkoU1VCX1NFR01FTlRfQUxJR04pOiBMaWtld2lzZS4KKwkoUkVMT0NfMzIpOiBEb24ndCBkZWZpbmUuCisJKHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCisJKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZSBpZiBPQkpfRUxGLgorCShUQVJHRVRfRk9STUFUKTogRGVmaW5lIGlmIE9CSl9FTEYuCisJKiBjb25maWcvdGMtc2guYzogVXNlIEJGRCByZWxvYyBjb2RlcyBpbnN0ZWFkIG9mIFNIIENPRkYgcmVsb2MKKwludW1iZXJzIHRocm91Z2hvdXQuCisJKHRjX2NyYXdsX3N5bWJvbF9jaGFpbik6IE9ubHkgZGVmaW5lIGlmIE9CSl9DT0ZGLgorCSh0Y19oZWFkZXJzX2hvb2ssIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBMaWtld2lzZS4KKwkoc3RydWN0IHNoX2NvdW50X3JlbG9jcyk6IERlZmluZS4KKwkoc2hfY291bnRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgorCXNoX2Zyb2JfZmlsZS4gIEFkZCBCRkRfQVNTRU1CTEVSIGNvZGUuCisJKHNoX2Zyb2Jfc2VjdGlvbik6IExpa2V3aXNlLgorCShzaF9mcm9iX2ZpbGUpOiBDYWxsIHNoX2Zyb2Jfc2VjdGlvbi4KKwkobWRfY29udmVydF9mcmFnKTogSWYgQkZEX0FTU0VNQkxFUiwgY2hhbmdlIHR5cGUgb2YgaGVhZGVycywgYW5kCisJY2FsbCBzZWN0aW9uX3N5bWJvbCByYXRoZXIgdGhhbiBzZWdfaW5mbyAoc2VnKS0+ZG90LgorCShtZF9zZWN0aW9uX2FsaWduKTogQWRkIE9CSl9FTEYgdmVyc2lvbi4KKwkoU1dJVENIX1RBQkxFX0NPTlMpOiBEZWZpbmUuCisJKFNXSVRDSF9UQUJMRSk6IFVzZSBTV0lUQ0hfVEFCTEVfQ09OUy4KKwkobWRfYXBwbHlfZml4KTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlcyBpZiBCRkRfQVNTRU1CTEVSLiAgT25seQorCWhhbmRsZSBmeF9yX3R5cGUgPT0gMCBpZiBub3QgQkZEX0FTU0VNQkxFUi4gIFJldHVybiAwIGlmCisJQkZEX0FTU0VNQkxFUi4KKwkoc3RydWN0IHJlbG9jX21hcCk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KKwkoY29mZl9yZWxvY19tYXApOiBMaWtld2lzZS4KKwkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBVc2UgY29mZl9yZWxvY19tYXAgdG8gY29udmVydCBmeF9yX3R5cGUuCisJKHRjX2dlbl9yZWxvYyk6IE5ldyBmdW5jdGlvbiBpZiBCRkRfQVNTRU1CTEVSLgorCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSWZkZWYgb3V0IGZ4X3doZXJlIHRlc3Qgd2hpY2ggdHJpZ2dlcnMKKwlpbmFwcHJvcHJpYXRlbHkgZm9yIFNIIEVMRi4KKwkod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IGFuZAorCW9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBpZiB0aGV5IGFyZSBkZWZpbmVkLgorCisJKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSBCRkRfUkVMT0NfMTYsIG5vdAorCUJGRF9SRUxPQ19OT05FLCB3aGVuIGNhbGxpbmcgZml4X25ld19leHAgZm9yIGEgYnJva2VuIHdvcmQuCisKKwkqIHJlYWQuYyAoZW1pdF9leHByKTogRml4IGNvbnZlcnNpb24gb2YgYnl0ZSBjb3VudCB0byBCRkQgcmVsb2MKKwljb2RlLgorCitGcmkgQXVnIDMwIDE0OjQ3OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZpeCBwcm9ibGVtIHdpdGggY2FsY3VsYXRpbmcgCisJYnJhbmNoIHNpemVzIGluIGFjcm9zcyBzZWN0aW9ucy4KKworRnJpIEF1ZyAzMCAwMDo0NDoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy04NTAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgaGkoKSBjb3JyZWN0bHkuICBIYW5kbGUKKwloaTAoKSB0b28uCisKK1dlZCBBdWcgMjggMjM6MTE6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtdjg1MC5jIChtZF9iZWdpbik6IERlYWwgd2l0aCBlbmQgb2Ygb3Bjb2RlCisJdGFibGUgbWFya2VyLgorCitXZWQgQXVnIDI4IDE5OjIwOjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZpeCBhIGJ1ZyB3aGljaCBjb3VsZCBnZW5lcmF0ZQorCXRoZSB3cm9uZyBvcGNvZGUgZm9yIGNhc2VzIGxpa2Ugc3QydyB3aGVyZSB0aGVyZSBhcmUgbWFueSBmb3JtcworCW9mIHRoZSBzYW1lIGluc3RydWN0aW9uLgorCitUdWUgQXVnIDI3IDEzOjUzOjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZXhwci5jIChvcGVyYW5kKTogSWYgbWRfcGFyc2VfbmFtZSBpcyBkZWZpbmVkLCBjYWxsIGl0IGJlZm9yZQorCWNhbGxpbmcgc3ltYm9sX2ZpbmRfb3JfbWFrZS4KKwkqIGNvbmZpZy90Yy1wcGMuaCAobWRfcGFyc2VfbmFtZSk6IERlZmluZS4KKwkocHBjX3BhcnNlX25hbWUpOiBEZWNsYXJlLgorCSogY29uZmlnL3RjLXBwYy5jIChyZWdfbmFtZV9zZWFyY2gpOiBBZGQgcmVncyBhbmQgcmVnY291bnQKKwlwYXJhbWV0ZXJzLgorCShyZWdpc3Rlcl9uYW1lKTogVXBkYXRlIGNhbGwgdG8gcmVnX25hbWVfc2VhcmNoLgorCShjcl9vcGVyYW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoY3JfbmFtZXMpOiBOZXcgc3RhdGljIGNvbnN0IGFycmF5LgorCShwcGNfcGFyc2VfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkobWRfYXNzZW1ibGUpOiBJZiBQUENfT1BFUkFORF9DUiBpcyBzZXQgaW4gdGhlIG9wZXJhbmQgZmxhZ3MsIHNldAorCWNyX29wZXJhbmQgYmVmb3JlIGNhbGxpbmcgZXhwcmVzc2lvbi4KKworVHVlIEF1ZyAyNyAwOTowNTo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEFkZCBuZXcgYXJndW1lbnQgdG8KKwlocHBhX2dlbl9yZWxvY190eXBlIGNhbGwuCisKK01vbiBBdWcgMjYgMTg6MjQ6NTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeGVkICIud29yZCIuICBGaXhlZCBwcm9ibGVtIHdpdGggcmFuZ2UgY2hlY2tpbmcKKwlvbiBhZGRyZXNzZXMuICBJbXByb3ZlZCBlcnJvciBtZXNzYWdlcy4KKwkqIGRvYy9jLWQxMHYudGV4aTogQWRkZWQgZG9jcyBmb3IgcmVnaXN0ZXIgcGFpcnMuCisKK01vbiBBdWcgMjYgMTM6Mzk6MjcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRml4IGJ1ZyBpbiBwYXJhbGxlbCAKKwljaGVja2luZyBjb2RlLgorCitNb24gQXVnIDI2IDE0OjM4OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoaW5pdF9maWxlKTogSW5pdGlhbGl6ZSBmTWVyZ2UgdG8gMS4KKwkoYWRkX2ZpbGUpOiBSZXN0b3JlIG9sZCBmaWxlIG1lcmdpbmcgY29kZSwgYnV0IG9ubHkgbWVyZ2UgZmlsZXMgaWYKKwlmTWVyZ2UgaXMgc2V0LgorCShlY29mZl9kaXJlY3RpdmVfbG9jKTogQ2xlYXIgZk1lcmdlIGZpZWxkIG9mIGN1cnJlbnQgZmlsZS4KKwkoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IExpa2V3aXNlLgorCitGcmkgQXVnIDIzIDExOjQwOjQ3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkb2MvYy1kMTB2LnRleGk6IEZpeCB0eXBvLiAKKworRnJpIEF1ZyAyMyAxMDo0MTozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdCBiaXQgbWFza2luZyBmb3IKKwloaSBhbmQgbG8gZXhwcmVzc2lvbnMuCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogUm91Z2ggY3V0IGF0IGRlbWFuZGluZworCSJlcCIgb3IgInIzMCIgaW4gc3N0IGFuZCBzbGQgaW5zdHJ1Y3Rpb25zLgorCShtZF9hcHBseV9maXgzKTogRG9uJ3QgYWJvcnQuICBKdXN0IHdhcm4gdGhhdCB3ZSBkb24ndAorCWhhdmUgcmVsb2NzIHlldC4KKworCSogY29uZmlnL3RjLXY4NTAuYyAoQ0NfTkFNRV9DTlQpOiBEZWZpbmUuCisJKGNjX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKG1kX2Fzc2VtYmxlKTogSGFuZGxlIFY4NTBfT1BFUkFORF9DQyBjb3JyZWN0bHkuCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUKKwkiaW5zbiIhCisKKwkqIGNvbmZpZy90Yy12ODUwLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEdlbmVyYWxpemUgdG8gc2VhcmNoCisJYW55IGdpdmVuIHJlZ2lzdGVyIHRhYmxlLgorCShyZWdpc3Rlcl9uYW1lKTogUGFzcyBhcHByb3ByaWF0ZSB0YWJsZSBhbmQgc2l6ZSB0byByZWdfbmFtZV9zZWFyY2guCisJKHN5c3RlbV9yZWdpc3Rlcl9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShTWVNSRUdfTkFNRV9DTlQpOiBEZWZpbmUuCisJKG1kX2Fzc2VtYmxlKTogSGFuZGxlIG9wZXJhbmRzIHdoaWNoIGFyZSBzeXN0ZW0gcmVnaXN0ZXJzLgorCQorCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZiB3ZSBmaW5kIGEgcmVnaXN0ZXIsIGJ1dCB0aGUKKwlvcGNvZGUgZG9lc24ndCB3YW50IGEgcmVnaXN0ZXIsIHRoZW4gd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoLgorCShtZF9hc3NlbWJsZSk6IEdldCBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBmcm9tIHRoZSBvcGNvZGUgdGFibGUuCisKK1RodSBBdWcgMjIgMTA6MjA6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBITERFTlYuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLgorCShhcy5uZXcpOiBVc2UgJChITERFTlYpLgorCisJKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZW5kZWYpOiBBdm9pZCBhIGRpdmlzaW9uIGJ5IHplcm8gZXJyb3IKKwlpZiBhbiBhcnJheSBkaW1lbnNpb24gaXMgbm90IGtub3duLgorCitUaHUgQXVnIDIyIDEwOjUwOjAwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jOiBGaXggYSByZWxvYyBidWcgY2F1c2VkIGJ5IG15IGxhc3QgY2hhbmdlLiAKKwkqIGRvYy9jLWQxMHYudGV4aTogQ2xlYW51cC4KKwkKK1R1ZSBBdWcgMjAgMTU6MTU6MTYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy12ODUwLmM6IE5ldyBmaWxlLgorCSogY29uZmlnL3RjLXY4NTAuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUgKHY4NTAtKi1lbGYpOiBOZXcgdGFyZ2V0LgorCSogY29uZmlndXJlLmluICh2ODUwLSotZWxmKTogTmV3IHRhcmdldC4KKwkKK1dlZCBBdWcgMjEgMTU6NTA6NTQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGRvYy9jLWQxMHYudGV4aTogTmV3IGZpbGUuCisJKiBkb2MvYWxsLnRleGk6IEFkZGVkIEQxMFYgc3R1ZmYuCisJKiBkb2MvYXMudGV4aW5mbzogQWRkZWQgRDEwViBzdHVmZi4KKworVHVlIEF1ZyAyMCAxNDoxMDowMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYzogQWxsIHJlZmVyZW5jZXMgdG8gZGVmaW5lZCBzeW1ib2xzIHNob3VsZAorIAlub3cgdXNlIHRoZSBvcHRpbWFsIGluc3RydWN0aW9uLiAgLmZsb2F0IGFuZCAuZG91YmxlIG5vdyB3b3JrLiAKKworTW9uIEF1ZyAxOSAxNDo0MTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQWRqdXN0IFBDIHJlbGF0aXZlIHJlbG9jIGJ5CisJc2VjdGlvbiBhZGRyZXNzIGZvciB0aGUgaTk2MCBhcyBpcyBkb25lIGZvciB0aGUgaTM4Ni4KKworVGh1IEF1ZyAxNSAxNjozNzo1OSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW46IEFkZCB3aWxkY2FyZHMgZm9yIGNvbmZpZyBtYXRjaGluZywgYWRkIG1pcHMtKi0qCisJY2FzZSwgZm9yd2FyZC1pbmNsdWRlIGJmZC9lbGYtYmZkLmguCisKK1RodSBBdWcgMTUgMTM6MjQ6MzAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBvcGNvZGUKKyAgICAgICAgdGFibGUgdG8gaGVscCBkZXRlcm1pbmluZSB3aGljaCBpbnN0cnVjdGlvbnMgY2FuIGJlIGRvbmUKKyAgICAgICAgaW4gcGFyYWxsZWwuIAorCitUaHUgQXVnIDE1IDE3OjAxOjMxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogY29uZmlnL3RjLWFybS5jOiBNYWpvciBjaGFuZ2VzIHRvIGFkZCBUaHVtYiBzdXBwb3J0LCB3aXRoIGxvdHMKKyAJb2YgY2hhbmdlIGlucHV0IGZyb20gPHJlYXJuc2hhQGFybWx0ZC5jby51az4uCisJUmV2ZXJ0ZWQgdG8gSU5TTl9TSVpFIG1hY3JvLCByYXRoZXIgdGhhbiBpbnNuX3NpemUgdmFyaWFibGUuCisJKGluc25zKTogQWRkZWQgQVJNICJieCIgaW5zdHJ1Y3Rpb24gc3VwcG9ydC4KKwkodGluc25zKTogQWRkZWQgVGh1bWIgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiBzdHJ1Y3R1cmUuCisJKGFybV90b3BzX2hzaCk6IEFkZGVkIGhhc2ggc3RydWN0dXJlIGZvciBUaHVtYiBvcGNvZGVzLgorCShtZF9wc2V1ZG9fdGFibGUpOiBBZGRlZCAiLmFybSIsICIudGh1bWIiIGFuZCAiLmNvZGUiIHBzZXVkby1vcHMuCisJKG9wY29kZV9zZWxlY3Qsc19hcm0sc190aHVtYixzX2NvZGUpOiBBZGRlZC4KKwkoZGVjb2RlX3NoaWZ0KTogQWxsb3cgdXBwZXItY2FzZSBSUlguCisJKGRvX2xkc3QpOiBTaW1wbGVyIGhhbGZ3b3JkIHN1cHBvcnQuCisJKGRvX2xkbXN0bSk6IEltcHJvdmVkLgorCShyZWdfbGlzdCwgZG9fYngsIHRodW1iX3JlZywgdGh1bWJfYWRkX3N1YiwgdGh1bWJfc2hpZnQsCisgCXRodW1iX21vdl9jb21wYXJlLCB0aHVtYl9sb2FkX3N0b3JlLCBkb190X2FyaXQsIGRvX3RfYWRkLAorIAlkb190X2FzciwgZG9fdF9icmFuY2gsIGRvX3RfYngsIGRvX3RfY29tcGFyZSwgZG9fdF9sZG1zdG0sCisgCWRvX3RfbGRyYiwgZG9fdF9sZHJoLCBkb190X2xkcywgZG9fdF9sc2wsIGRvX3RfbHNyLCBkb190X21vdiwKKyAJZG9fdF9wdXNoX3BvcCwgZG9fdF9zdHIsIGRvX3Rfc3RyYiwgZG9fdF9zdHJoLCBkb190X3N1YiwgZG9fdF9zd2ksCisgCWRvX3RfYWRyKTogQWRkZWQuCisJKG1kX2FwcGx5X2ZpeDMpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX0FSTV9USFVNQl8qIHJlbG9jYXRpb25zLgorCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW10aHVtYi4KKwkobWRfc2hvd191c2FnZSk6IFVwZGF0ZWQgdG8gcmVmbGVjdCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbi4KKwkoYXJtX2RhdGFfaW5fY29kZSwgYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IEFkZGVkLgorCSogY29uZmlnL3RjLWFybS5oOiBQcm92aWRlIFRDX0ZJWF9UWVBFIHRvIGFsbG93IHByaXZhdGUgQVJNCisgCWZyYWdtZW50IGluZm9ybWF0aW9uIHRvIGJlIGhlbGQuCisKK1RodSBBdWcgMTUgMTY6MTI6MDAgMTk5NiAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorCisJKiB0Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFsc28gc2V0IGZpeFAtPmZ4X2RvbmUgaWYgZnhfYWRkc3kgaXMgCisJbm9uLW51bGwsIGJ1dCBpcyBhIGNvbnN0YW50LgorCShmaXhfbmV3X2FybSk6IENhbGwgbWFrZV9leHByX3N5bWJvbCB0byBtYWtlIHRoZSBleHByZXNzaW9uIHN5bWJvbAorCXNvIHRoYXQgZXJyb3IgcmVwb3J0aW5nIHdpbGwgd29yayBjb3JyZWN0bHkuCisKK1dlZCBBdWcgMTQgMTA6Mzc6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcworCWFnYWluc3Qgd2VhayBzeW1ib2xzLgorCitUdWUgQXVnIDEzIDE3OjM5OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ1RJT04pOiBEZWZpbmUgaWYgT0JKX1hDT0ZGLgorCShwcGNfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUgaWYgT0JKX1hDT0ZGLgorCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZm9yY2VfcmVsb2NhdGlvbik6IE5ldyBmdW5jdGlvbiBpZgorCU9CSl9YQ09GRi4KKworTW9uIEF1ZyAxMiAxNjo0OTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmggKEJZVEVfT1JERVIpOiBEb24ndCBkZWZpbmUuICBObyBsb25nZXIgdXNlZC4KKworRnJpIEF1ZyAgOSAxNzo0ODoyOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYzogRml4IHByb2JsZW0gd2l0aCByZWxvY3MuIAorCitGcmkgQXVnICA5IDE0OjE2OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogSWYgbm90IEJGRF9BU1NFTUJMRVIsIGFsd2F5cyBhbGlnbgorCXdpdGggbm9wcyBpZiBub3QgaW4gZGF0YV9zZWN0aW9uIG9yIGJzc19zZWN0aW9uLgorCitUaHUgQXVnICA4IDEyOjMyOjU2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJQWRkIHN1cHBvcnQgZm9yIG9wZW5WTVMvQWxwaGEuCisJKiBhcy5oIChQUklOVEZfTElLRSk6IERvbid0IGRlZmluZSBpZiBWTVMsIGZvciBub3cuCisJKiBjb25maWcvb2JqLWV2YXguYzogTmV3IGZpbGUuCisJKiBjb25maWcvb2JqLWV2YXguaDogTmV3IGZpbGUuCisJKiBjb25maWcvdGMtYWxwaGEuYzogQWRkIHN1cHBvcnQgZm9yIEVWQVggZm9ybWF0IGlmIE9CSl9FVkFYIGlzCisJZGVmaW5lZC4KKwkqIGNvbmZpZy90Yy1hbHBoYS5oOiBBZGQgc3VwcG9ydCBmb3IgRVZBWCBmb3JtYXQgaWYgT0JKX0VWQVggaXMKKwlkZWZpbmVkLiAgQWRkIGNhc2UgZm9yIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyLgorCSogY29uZmlnL3Ztcy1hLWNvbmYuaDogTmV3IGZpbGUuCisJKiBjb25mLWEtZ2FzLmNvbTogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IEFkZCB0YXJnZXQgYWxwaGEtKi0qdm1zKi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCisJKiByZWFkLmMgKHNfbGNvbW0pOiBBbGlnbiBic3Nfc2VnIG9uIDggYnl0ZSBib3VuZGFyeSBpZiBPQkpfRVZBWC4KKwlEb24ndCBjYWxsIGZmcyBvbiBvcGVuVk1TL0FscGhhLgorCitXZWQgQXVnICA3IDE0OjE5OjAzIDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIGNvbmZpZ3VyZS5pbjogTWFrZSBHQVNfQ0hFQ0tfREVDTF9ORUVERUQgaW5jbHVkZSA8c3RyaW5nLmg+IG9yCisJPHN0cmluZ3MuaD4gaWYgdGhleSBleGlzdC4gIENhbGwgR0FTX0NIRUNLX0RFQ0xfTkVFREVEIG9uIHN0cnN0cgorCWFuZCBzYnJrLgorCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCisJKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KKwkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZC4KKwkqIGFzLmg6IE9ubHkgaW5jbHVkZSA8c3RyaW5ncy5oPiBpZiBIQVZFX1NUUklOR1NfSC4KKwkoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KKwkqIGFzLmM6IElmIEhBVkVfU0JSSyBhbmQgTkVFRF9ERUNMQVJBVElPTl9TQlJLLCBkZWNsYXJlIHNicmsuCisKK1dlZCBBdWcgIDcgMTE6NTA6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uCisJYnkgYSBjb25zdGFudCBiZWZvcmUgZW50ZXJpbmcgdGhlIG1haW4gc3dpdGNoLiAgUmVqZWN0IGF0dGVtcHRzIHRvCisJYXBwbHkgYW4gYXJpdGhtZXRpYyBmdW5jdGlvbiB0byBub24tYWJzb2x1dGUgc3ltYm9scywgZXhjZXB0IGZvcgorCXRoZSBzcGVjaWFsIGNhc2Ugb2Ygc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUKKwlzZWN0aW9uLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9zZWN0aW9uX2FsaWduKTogRG8gYWxpZ24gaWYgT0JKX0VMRiwgYnV0CisJbm90IHRvIG1vcmUgdGhhbiBhIDE2IGJ5dGUgYm91bmRhcnkuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IEFjY2VwdCBhbGwgcmVsb2NzOyByZW1vdmUKKwkjaWZuZGVmIE9CSl9FTEYgbGluZXMuICBGcm9tIEVyaWMgVmFsZXR0ZSA8dmFsZXR0ZUBjcmYuY2Fub24uZnI+LgorCSh0Y19nZW5fcmVsb2MpOiBJZiBvdXQgb2YgbWVtb3J5IGNhbGwgYXNfZmF0YWwgcmF0aGVyIHRoYW4KKwlhc3NlcnQuICBJZiBubyBob3d0byBmb3VuZCwgY2FsbCBhc19iYWRfd2hlcmUgcmF0aGVyIHRoYW4KKwlhc19mYXRhbC4gIENoYW5nZSB0aGUgZXJyb3IgbWVzc2FnZSBzbGlnaHRseS4gIFNldCBob3d0byB0byBhCisJbm9uLU5VTEwgdmFsdWUgaW4gb3JkZXIgdG8ga2VlcCBnb2luZy4KKworVHVlIEF1ZyAgNiAxMjo1ODowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgY29kZSB0byBzdXBwb3J0IDMyLWJpdCBmaXh1cHMgZm9yIHN0YWJzLgorCitUdWUgQXVnICA2IDExOjE1OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IE5ldyBvcGVyYW5kICJzaXplIiBkZXJpdmVkCisJZnJvbSAiLmIiLCAiLnciIGFuZCAiLmwiIGV4dGVuc2lvbnMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgSWYKKwl0aGUgYmFzZSBpbnN0cnVjdGlvbiBoYXMgbm8gb3BlcmFuZHMsIHRoZW4gdXNlIHRoZSBzaXplIHRvCisJZGV0ZXJtaW5lIHdoaWNoIHNwZWNpZmljIGluc3RydWN0aW9uIHRvIHVzZS4KKworTW9uIEF1ZyAgNSAxNDoyMToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pOTYwLmMgKG1lbV9mbXQpOiBDYWxsIHBhcnNlX2V4cHIgYmVmb3JlIGVtaXQuCisKK0ZyaSBBdWcgIDIgMTE6MjM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtZF9zZWN0aW9uX2FsaWduKTogRG9uJ3QgY2hhbmdlIGFkZHIgaWYKKwlPQkpfRUxGLgorCitUaHUgQXVnICAxIDIzOjUxOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYzogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZXMuCisJCitXZWQgSnVsIDMxIDE0OjQ2OjExIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jOiBEaXNhYmxlIHJhbmdlIGNoZWNraW5nIG9uIDE2LWJpdCB2YWx1ZXMuCisKK1dlZCBKdWwgMzEgMTY6Mjc6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogU2V0IG9rX2FyY2ggZm9yIGV2ZXJ5IGluc3RydWN0aW9uLAorCW5vdCBqdXN0IHRoZSBvbmVzIHRoYXQgZG9uJ3QgbWF0Y2guCisKK1dlZCBKdWwgMzEgMTE6NDU6MTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeGVkIGJ1Z3MgaW4gc2hvcnQgcmVsb2NzIGFuZCByYW5nZSBjaGVja2luZy4KKworV2VkIEp1bCAzMSAxNTo0MTo0MiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1hcm0uYzogQ2hhbmdlZCBJTlNOX1NJWkUgdG8gdmFyaWFibGUgaW5zbl9zaXplLCBhcworIAlwcmUtY3Vyc29yIHRvIGFkZGluZyBUaHVtYiBzdXBwb3J0LiBBbHNvIGFkZGVkIGNwdV92YXJpYW50IGZsYWcKKyAJaW5mb3JtYXRpb24gdG8gZWFjaCBvZiB0aGUgYXNtX2ZsZyBzdHJ1Y3R1cmVzLgorCShtZF9wYXJzZV9vcHRpb24pOiBVcGRhdGVkIEFSTTcgcGFyc2luZyB0byBhbGxvdyAndCcgZm9yCisgCXRodW1iL2hhbGZ3b3JkIHN1cHBvcnQsIGFzd2VsbCBhcyAnbScgZm9yIGxvbmcgbXVsdGlwbHkuCisJKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGVkIGhlbHAgbWVzc2FnZS4KKwkobWRfYXNzZW1ibGUpOiBDaGVjayB0aGF0IGluc3RydWN0aW9uIGZsYWdzIGFyZSBhcHBsaWNhdGVkIHRvIHRoZQorIAljdXJyZW50IGNwdSB2YXJpYW50LgorCShtZF9hcHBseV9maXgzLCB0Y19nZW5fcmVsb2MpOiBBZGQgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCBhbmQKKyAJQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwgcmVsb2NhdGlvbiBzdXBwb3J0IGZvciBuZXcgaGFsZndvcmQgYW5kCisgCXNpZ25leHRlbnNpb24gaW5zdHJ1Y3Rpb25zLgorCShkb19sZHN0KTogR2VuZXJhdGUgaGFsZndvcmQgYW5kIHNpZ25leHRlbnNpb24gdmFyaWFudHMgaWYKKyAJbW5lbW9uaWMgZmxhZ3MgbWF0Y2guCisJKGxkc3RfZXh0ZW5kKTogRG8gbm90IGFsbG93IHNoaWZ0cyBpbiB0aGUgb2Zmc2V0IGZpZWxkIG9mIGhhbGZ3b3JkCisgCW9yIHNpZ25leHRlbnNpb24gaW5zdHJ1Y3Rpb25zLgorCSh2YWxpZGF0ZV9vZmZzZXRfaW1tKTogUHJvdmlkZSBjaGVjayBvbiBoYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbgorIAlpbW1lZGlhdGUgcmFuZ2UuCisJKGFkZF90b19saXRfcG9vbCk6IE1lcmdlIGlkZW50aWNhbCBsaXRlcmFsIHBvb2wgdmFsdWVzLgorCitUdWUgSnVsIDMwIDE0OjI4OjIzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAoc2VsZWN0b3JfdGFibGUpOiBBZGQgJ0UnIHNlbGVjdG9yLgorCShjb25zX2ZpeF9uZXdfaHBwYSk6IERvbid0IGNva2Ugb24gZV9lc2VsLgorCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQ09NUDIgd2hlbiB1c2VkCisJdG8gaGVscCBnZW5lcmF0ZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGVzLgorCShtZF9hcHBseV9maXgpOiBEb24ndCB0cnkgdG8gYXBwbHkgZml4dXBzIHdpdGggYW4gZV9lc2VsCisJc2VsZWN0b3IuCisJKGhwcGFfZml4X2FkanVzdGFibGUpOiBGaXh1cHMgd2l0aCBlX2VzZWwgc2VsZWN0b3JzCisJYXJlIG5vdCBhZGp1c3RhYmxlLgorCitUdWUgSnVsIDMwIDE1OjUxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAyYnl0ZSwgNGJ5dGUsIGFuZCA4Ynl0ZQorCXBzZXVkby1vcHMuCisKK0ZyaSBKdWwgMjYgMTE6NDM6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGxvdHMgb2YgZXJyb3IgY2hlY2tpbmcuICBBZGRlZCBoYWNrcworCXRvIHN1cHBvcnQgYWNjdW11bGF0b3Igc2hpZnRzLgorCQorRnJpIEp1bCAyNiAxMTo1NjowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN5bWJvbHMuYyAoU19TRVRfRVhURVJOQUwpOiBMZXQgLndlYWsgb3ZlcnJpZGUuCisJKFNfQ0xFQVJfRVhURVJOQUwpOiBMaWtld2lzZS4KKwkoU19TRVRfV0VBSyk6IFJlbW92ZSBlcnJvcjsganVzdCBsZXQgLndlYWsgb3ZlcnJpZGUuCisKK1RodSBKdWwgMjUgMTU6MjI6NTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlKTogTm93IGhhbmRsZXMgbXVsdGlsaW5lCisJaW5zdHJ1Y3Rpb25zLgorCitUaHUgSnVsIDI1IDEyOjAzOjMzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jOiBGaXggcGFja2FnaW5nIGJ1Zy4gQWRkZWQgcmFuZ2UgY2hlY2tpbmcuCisJQWRkZWQga2x1ZGdlIGZvciBkaXZzIGluc3RydWN0aW9uLiAgRml4ZWQgbWlub3IgcHJvYmxlbSB3aXRoCisJbXVsdGlwbGUgdGV4dCBzZWN0aW9ucy4KKwkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IENoYW5nZSBwcm90b3R5cGUuIAorCQorVHVlIEp1bCAyMyAxMDo0OTozNiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXBwbHlfZml4Myk6IEZpeCBhbGwgaW5zdHJ1Y3Rpb24KKwlhZGRyZXNzZXMgdG8gYmUgcmlnaHQtc2hpZnRlZCBieSAyLgorCitNb24gSnVsIDIyIDExOjMyOjM2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtZDEwdi5jOiBNYW55IGNoYW5nZXMgdG8gZ2V0IHJlbG9jcyB3b3JraW5nLgorIAkocmVnaXN0ZXJfbmFtZSk6IE5vIGxvbmdlciBjcmVhdGVzIGEgc3ltYm9sIGZvciByZWdpc3RlciBuYW1lcy4KKyAJKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IG1vdmVkIHRvIG9wY29kZXMvZDEwdi1vcGMuYy4KKwkoZDEwdl9pbnNlcnRfb3BlcmFuZCk6IE5vdyB3b3JrcyBjb3JyZWN0bHkgZm9yIGVpdGhlciBjb250YWluZXIuCisJKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBEZWNsYXJlLiAKKwkKK01vbiBKdWwgMjIgMTQ6MDE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBCRkRfUkVMT0NfUENSRUxfSEkxNl9TIGFuZAorCUJGRF9SRUxPQ19QQ1JFTF9MTzE2IGFyZSBleHBlY3RlZCB0byBiZSBQQyByZWxhdGl2ZS4KKworTW9uIEp1bCAyMiAxMjo0Njo1NSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogdGMtYWxwaGEuYzogUGF0Y2hlcyB0byB0cmFjayBjdXJyZW50IG1pbmltdW0gYWxpZ25tZW50IHRvIHJlZHVjZQorCXRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIGNyZWF0ZWQgd2l0aCBmcmFnX2FsaWduLgorCShhbHBoYV9jdXJyZW50X2FsaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoc19hbHBoYV90ZXh0KTogUmVzZXQgYWxpZ25tZW50IHRvIDAuCisJKHNfYWxwaGFfZGF0YSwgc19hbHBoYV9yZGF0YSwgc19hbHBoYV9zZGF0YSk6IExpa2V3aXNlLgorCShzX2FscGhhX3N0cmluZ2VyLCBzX2FscGhhX3NwYWNlKTogTmV3IGZ1bmN0aW9ucy4KKwkoc19hbHBoYV9jb25zLCBhbHBoYV9mbHVzaF9wZW5kaW5nX291dHB1dCk6IFJlbW92ZSBmdW5jdGlvbnMuCisJKGFscGhhX2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb24gdG8gcmVwbGFjZSBib3RoIG9mIHRoZW0uCisJKGVtaXRfaW5zbik6IE9ubHkgYWxpZ24gaWYgYWxwaGFfY3VycmVudF9hbGlnbiBpcyBsZXNzIHRoYW4gMjsKKwlyZXNldCBhbHBoYV9jdXJyZW50X2FsaWduIHRvIDIuCisJKHNfYWxwaGFfZ3ByZWwzMik6IExpa2V3aXNlLgorCShzX2FscGhhX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uICBCYXNpY2FsbHkgZHVwbGljYXRlIHRoZSBvdGhlcgorCWFscGhhIHNlY3Rpb24gY2hhbmdlIGhvb2tzLiAgT25seSBkZWZpbmUgZm9yIEVMRi4KKwkoc19hbHBoYV9mbG9hdF9jb25zKTogU2ltcGxpZnkgYWxpZ25tZW50IGhhbmRsaW5nLgorCShtZF9wc2V1ZG9fdGFibGUpOiBPbmx5IGRlZmluZSAicmRhdGEiIGFuZCAic2RhdGEiIGlmIE9CSl9FQ09GRi4KKwlJZiBPQkpfRUxGLCBkZWZpbmUgInNlY3Rpb24iLCAic2VjdGlvbi5zIiwgInNlY3QiLCBhbmQgInNlY3QucyIuCisJRG9uJ3QgZGVmaW5lIHRoZSBzX2FscGhhX2NvbnMgcHNldWRvLW9wcy4gIERvIGRlZmluZQorCXNfYWxwaGFfc3RyaW5nZXIgYW5kIHNfYWxwaGFfc3BhY2UgcHNldWRvLW9wcy4KKwkoYWxwaGFfYWxpZ24pOiBTa2lwIGlmIGxlc3MgdGhhbiBjdXJyZW50IGRlZmF1bHQgYWxpZ25tZW50LiAgU2V0CisJZGVmYXVsdCBhbGlnbm1lbnQuCisJKiB0Yy1hbHBoYS5oIChtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IFJlbW92ZS4KKwkobWRfY29uc19hbGlnbik6IEFkZC4KKworCSogdGMtYWxwaGEuYzogQWRkIG9vZGxlcyBvZiBmdW5jdGlvbiBkZXNjcmlwdGlvbiBjb21tZW50cy4KKwkobWRfYmlnbnVtX3RvX2NoYXJzKTogUmVtb3ZlOyB0aGVyZSBhcmUgbm8gY2FsbGVycy4KKwkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gc29tZSBtb3JlIHZhcmlhbnRzLgorCitUaHUgSnVsIDE4IDE1OjU0OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gQW5kcmV3IEdpZXJ0aCA8QU5EUkVXR0BtaWNyb2xpc2UuY28udWs+OgorCSogY29uZmlndXJlLmluIChzcGFyYy0qLXN5c3Y0Kik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgdWFoYWxmLCB1YXdvcmQsIGFuZAorCXVheHdvcmQgdG8gdXNlIHNfdWFjb25zLgorCShzcGFyY19ub19hbGlnbl9jb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoc191YWNvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzcGFyY19jb25zX2FsaWduKTogSWYgc3BhcmNfbm9fYWxpZ25fY29ucyBpcyBzZXQsIGp1c3QgY2xlYXIgaXQKKwlhbmQgcmV0dXJuLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBSZW1vdmUgdW51c2VkIGxhYmVsIGFsbG9jYXRlX2Jzcy4KKworCSogY29uZmlndXJlLmluOiBBZGQgbWlwcy0qLWlyaXg2KiB0YXJnZXQuICBIYW5kbGUgSXJpeCA2IGxpa2UgSXJpeAorCTUgd2l0aCByZWdhcmQgdG8gc2hhcmVkIGxpYnJhcmllcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFVzZSB0aGUgY29ycmVjdCBsZW5ndGggd2hlbgorCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHRoZSB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZXJyb3IgbWVzc2FnZS4KKworVGh1IEp1bCAxOCAxMjo1NzoxMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLSopOiBBbGxvdyBkMTB2LSotKiwgZG9uJ3QgcmVxdWlyZSBkMTB2LSotZWxmKi4KKworV2VkIEp1bCAxNyAxNDoyNToxMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWQxMHYuYzogTmV3IGZpbGUuCisJKiBjb25maWcvdGMtZDEwdi5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZSAoZDEwdi0qLWVsZik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKGQxMHYtKi1lbGYpOiBOZXcgdGFyZ2V0LgorCQorRnJpIEp1bCAxMiAyMDo1NDoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1LIFBJQy4KKworV2VkIEp1bCAxMCAxMjozOTowOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2FsaWduKTogQ2hhbmdlIGZpbGwgcGFyYW1ldGVyCisJdG8gYSBwb2ludGVyLiAgVGFrZSBOVUxMIGFzIDAgb3Igbm9wIGRlcGVuZGluZyBvbiBzZWN0aW9uLiAgQ2hhbmdlCisJYWxsIGNhbGxlcnMuCisJKHNfYWxwaGFfYWxpZ24pOiBSZW5hbWUgbG9jYWwgdmFyaWFibGVzLgorCisJKiBkb2MvYXMudGV4aW5mbyAoLmFsaWduKTogRG9jdW1lbnQgYWN0aW9uIG9mIG9taXR0ZWQKKwlmaWxsIHBhcmFtZXRlci4KKworV2VkIEp1bCAxMCAwMDoyMzozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEdpdmUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZQorCXdoZW4gYW4gdW5zdXBwb3J0ZWQgUEMgcmVsYXRpdmUgcmVsb2MgaXMgc2VlbiwgcmF0aGVyIHRoYW4gY2FsbGluZworCWFib3J0LgorCisJKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBSZW1vdmUgbm90X2NwcF9saW5lIGxvY2FsIHZhcmlhYmxlLgorCUluc3RlYWQsIGNoZWNrIHN0YXRlIHdoZW4gJyMnIGNvbW1lbnQgaXMgc2Vlbi4KKworTW9uIEp1bCAgOCAxNDoxMTo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcmVnbWFza19mcmFnKTogT25seSBkZWZpbmUgaWYgT0JKX0VMRiBvcgorIAlPQkpfTUFZQkVfRUxGLgorCSh0Y19nZW5fcmVsb2MpOiBJZiBmaXh1cCB3YXMgY2hhbmdlZCB0byBiZSBQQyByZWxhdGl2ZSwgY2hhbmdlCisgCXJlbG9jIHR5cGUgYWNjb3JkaW5nbHkuICBVc2UgbmFtZSBvZiByZWxvYyBpbiBlcnJvciBtZXNzYWdlLgorCisJKiBhcy5oOiBEb24ndCBkZWZpbmUgY29uc3Qgb3Igdm9sYXRpbGUuCisJKiBmbG9udW0uaDogRG9uJ3QgZGVmaW5lIGNvbnN0LgorCisJKiBjb25maWcvdGMtbTY4ay5jICh0Y19nZW5fcmVsb2MpOiBDaGFuZ2UgdGhlIGNvZGUgYXBwcm9wcmlhdGVseQorCWlmIGZ4X3BjcmVsIGlzIHNldC4gIENvcnJlY3Qgc2V0dGluZyB0aGUgYWRkZW5kIGNhc2UgaW4gdGhlCisJT0JKX0VMRiBjYXNlIChmcm9tIEFuZHJlYXMgU2Nod2FiCisJPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4pLgorCShtZF9zaG93X3VzYWdlKTogQ29ycmVjdCAtbWZjNTIwMCB0byAtbTUyMDAuCisKK0ZyaSBKdWwgIDUgMTA6MzI6NTggMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBkb2MvYy1tNjhrLnRleGk6IERvY3VtZW50IC1tNTIwMCBmbGFnLgorCSogZG9jL2FzLnRleGluZm86IExpa2V3aXNlLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogVGhlIGNvbGRmaXJlIGRvZXMgbm90IHN1cHBvcnQgOHgKKyAJc2NhbGUgZmFjdG9yLgorCitGcmkgSnVsICA1IDExOjA3OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3ltYm9scy5jIChTX1NFVF9FWFRFUk5BTCk6IENoYW5nZSBhc193YXJuIHRvIGFzX2JhZC4KKwkoU19DTEVBUl9FWFRFUk5BTCwgU19TRVRfV0VBSyk6IExpa2V3aXNlLgorCitUaHUgSnVsICA0IDExOjU5OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBTZXQgdG8gY3lnbnVzLTIuNy4xLgorCisJKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCisKK1RodSBKdWwgIDQgMTA6MTE6MzMgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogT25seSBwZXJmb3JtIHJhbmdlIGNoZWNrIHdoZW4KKyAJZGVhbGluZyB3aXRoIE9fY29uc3RhbnQgZXhwcmVzc2lvbnMuCisKK1dlZCBKdWwgIDMgMTU6MDI6MjEgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBtNjhrLXBhcnNlLmggKG02OGtfcmVnaXN0ZXIpOiBBZGQgbmV3IGNvbGRmaWxlIGNvbnRyb2wKKwlyZWdpc3RlcnMuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1jZjUyMDBfY29udHJvbF9yZWdzKTogTmV3IHZhcmlhYmxlLCAKKwlhcnJheSBvZiBjb250cm9sIHJlZ2lzdGVycyBmb3IgdGhlIGNvbGRmaXJlLgorCShjcHVfb2ZfYXJjaCk6IEFkZGVkIG1jZjUyMDAuCisJKGFyY2hzKTogQWRkZWQgbWNmNTIwMC4KKwkoaW5pdF90YWJsZSk6IEFkZCBuZXcgY29udHJvbCByZWdpc3RlcnMuCisJKG02OGtfaXApOiBBZGRlZCBzdXBwb3J0IGZvciBuZXcgY29udHJvbCByZWdpc3RlcnMuCisJKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgLW01MjAwIHRvIHVzYWdlIHRleHQuCisKK1dlZCBKdWwgIDMgMTY6MDU6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmggKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQpOiBEZWNsYXJlLgorCSogcmVhZC5jIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50KTogUmVtb3ZlIGRlY2xhcmF0aW9uLgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIG9mIHx8CisJd2l0aGluICYmLgorCShtZF9hc3NlbWJsZSk6IEZpeCBoYW5kbGluZyBvZiBAbCB3aXRoIGFuIHVuc2lnbmVkIGNvbnN0YW50LiAgQWRkCisJZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KKworCSogY29uZmlnL3RjLWkzODYuaCAoQU9VVF9NQUNIVFlQRSk6IERlZmluZSBhcyAwIGlmIFRFXzM4NkJTRC4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBUb20gUXVpZ2dsZSA8cXVpZ2dsZUBzZ2kuY29tPjoKKwkqIGVjb2ZmLmMgKGxhc3RfbGluZW5vKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoYWRkX3Byb2NlZHVyZSk6IFNldCBsYXN0X2xpbmVuby4KKwkoZWNvZmZfZGlyZWN0aXZlX2xvYyk6IExpa2V3aXNlLgorCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogTGlrZXdpc2UuCisJKGVjb2ZmX2ZpeF9sb2MpOiBOZXcgZnVuY3Rpb24uCisJKiBlY29mZi5oIChlY29mZl9maXhfbG9jKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogV2hlbiBpbnNlcnRpbmcgbm9wcywgYW5kIHVzaW5nCisJRUNPRkYgZGVidWdnaW5nLCBjYWxsIGVjb2ZmX2ZpeF9sb2MuCisKK1R1ZSBKdWwgIDIgMjM6MDI6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMpOiBJZiBhbiBvcGVyYW5kIHR5cGUgaXMgCisJbWFya2VkIGFzIFNSQ19JTl9EU1QgcmV0cmlldmUgaXQgZnJvbSB0aGUgImRlc3RpbmF0aW9uIiBvcC4KKworU2F0IEp1biAyOSAxMzozODozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IFNldCBlbXVsYXRpb24gdG8gcmlzY2l4LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlnL3RlLXJpc2NpeC5oOiBOZXcgZmlsZSB0byBkZWZpbmUgVEVfUklTQ0lYLgorCisJKiBjb25maWcvdGMtc2guaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuCisKK0ZyaSBKdW4gMjggMTU6MTQ6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IEp1c3QgcnVuIGNvbmZpZy5zdGF0dXMgYXMgb3RoZXIKKwl0b29scyBkby4KKworRnJpIEp1biAyOCAxMTowOTozOCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW4gKFRBUkdFVF9PUyk6IEFkZCBkZWZpbml0aW9uIHRvIGNvbmYuCisKK1RodSBKdW4gMjcgMjA6Mzk6NDAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFBhcmVudGhlc2l6ZQorCWNvcF9pbnRlcmxvY2tzIGV4cHJlc3Npb25zLgorCitUaHUgSnVuIDI3IDEyOjE4OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGlzdGluZy5jIChsaXN0aW5nX3ByaW50KTogQ2xvc2UgdGhlIGxpc3RpbmcgZmlsZSBpZiBpdCBpcyBub3QKKwlzdGRvdXQuICBDbG9zZSB0aGUgb3RoZXIgZmlsZXMgb3BlbmVkIGZvciB0aGUgbGlzdGluZy4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NvbnNfYWxpZ24pOiBEZWZpbmUuCisJKHNwYXJjX2NvbnNfYWxpZ24pOiBEZWNsYXJlLgorCShIQU5ETEVfQUxJR04pOiBEZWZpbmUuCisJKHNwYXJjX2hhbmRsZV9hbGlnbik6IERlY2xhcmUuCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbi4KKwkoc3BhcmNfaGFuZGxlX2FsaWduKTogTmV3IGZ1bmN0aW9uLgorCSogcmVhZC5jIChjb25zX3dvcmtlcik6IENhbGwgbWRfY29uc19hbGlnbiBpZiBpdCBpcyBkZWZpbmVkLgorCisJKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEFkZCBmcl9maWxlIGFuZCBmcl9saW5lIGZpZWxkcy4KKwkqIGZyYWdzLmMgKGZyYWdfbmV3KTogU2V0IGZyX2ZpbGUgYW5kIGZyX2xpbmUuCisJKGZyYWdfdmFyKTogTGlrZXdpc2UuCisJKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgorCisJKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IFJlbW92ZSB1bnVzZWQgYWxpZ25fbWFzayBhbmQgYWxpZ25fb2Zmc2V0CisJZmllbGRzLgorCisJKiBsaXN0aW5nLmMgKGNhbGNfaGV4KTogT2Zmc2V0IGJ5IGZyX2ZpeCB3aGVuIGV4YW1pbmluZyBmcl92YXIuCisJRnJvbSA8dWRkZWJvcmdAY2FybWVuLnNlPi4KKworV2VkIEp1biAyNiAxMzoyMTozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLW9zZiopOiBOZXcgdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBjb25maWcvdGMtbTY4ay5jOiBBZGQgNjhlYzA2MCBhcyBhIHN5bm9ueW0gZm9yIDY4MDYwLgorCitXZWQgSnVuIDI2IDE2OjIzOjA4IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgY29wX2ludGVybG9ja3MsIHRvIGF2b2lkIE5PUCBpbnNlcnRpb24KKyAJYmV0d2VlbiBjby1wcm9jZXNzb3IgY29tcGFyaXNvbnMgYW5kIGJyYW5jaGVzIGZvciB0aGUgVlI0MzAwLgorCitNb24gSnVuIDI0IDE4OjAyOjUwIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAorCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisJKGRvY2Rpcik6IFJlbW92ZWQuCisJKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCisJKiBkb2MvTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsCisJaW5jbHVkZWRpcik6IFVzZSBhdXRvY29uZiBzZXQgdmFsdWVzLgorCShkb2NkaXIpOiBSZW1vdmVkLgorCitNb24gSnVuIDI0IDExOjU4OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGlzdGluZy5jIChsaXN0aW5nX2VqZWN0KTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgbGlzdGluZyBpcyAwLgorCShsaXN0aW5nX2xpc3QpOiBMaWtld2lzZS4KKwkobGlzdGluZ19zb3VyY2VfbGluZSk6IExpa2V3aXNlLgorCShsaXN0aW5nX3RpdGxlKTogRG9uJ3Qgc2F2ZSB0aXRsZSBpZiBsaXN0aW5nIGlzIDAuCisJKGxpc3Rpbmdfc291cmNlX2ZpbGUpOiBDaGVjayBsaXN0aW5nIHJhdGhlciB0aGFuIGxpc3RpbmdfdGFpbC4KKworCSogY29uZmlndXJlLmluOiBPbiBhbHBoYSotKi1vc2YqLCBsaW5rIGFnYWluc3QgbGliYmZkLmEgaWYgbm90CisJdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworRnJpIEp1biAyMSAxODoyMjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBjYXNlICdpJy8naicsIGRvbid0IHJlcXVpcmUgYW4KKwlhYnNvbHV0ZSBleHByZXNzaW9uIGlmIGEgcmVsb2NhdGlvbiB0eXBlIHdhcyBzcGVjaWZpZWQuCisKK0ZyaSBKdW4gMjEgMTc6NDA6MTYgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KKworCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworRnJpIEp1biAyMSAxNjowMToxOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogY29uZmlndXJlLmluOiBBZGQgYWxwaGEtKi1saW51eGVjb2ZmKiB0YXJnZXQuICBVc2UgZWxmIGZvcgorCWFscGhhLSotbGludXgqIHRhcmdldC4gIEZvcmNlIGJmZF9nYXMgZm9yIGFscGhhLSouICBSZXF1aXJlCisJb3Bjb2RlcyBsaWJyYXJ5IGZvciBhbHBoYS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCisJKiBjb25maWcvdGMtYWxwaGEuYzogU3Vic3RhbnRpYWwgcmV3cml0ZSB0byBhZGQgRUxGIHN1cHBvcnQgYW5kCisJdXNlIG5ldyBvcGNvZGUgdGFibGUuCisJKiBjb25maWcvdGMtYWxwaGEuaCAobWRfdW5kZWZpbmVkX3N5bWJvbCk6IERvbid0IGRlZmluZS4KKwkoTE9DQUxfTEFCRUwpOiBEZWZpbmUgZGlmZmVyZW50bHkgaWYgT0JKX0VMRi4KKwkoRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lIGlmIE9CSl9FTEYuCisJKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IFJlbW92ZS4KKwkqIGNvbmZpZy9vYmotZWxmLmg6IElmIFRDX0FMUEhBLCBkZWZpbmUgRUNPRkZfREVCVUdHSU5HLgorCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9hbHBoYSk6IERlcGVuZCB1cG9uCisJaW5jbHVkZS9vcGNvZGUvYWxwaGEuaCByYXRoZXIgdGhhbiBjb25maWcvYWxwaGEtb3Bjb2RlLmguCisKK1RodSBKdW4gMjAgMTk6MTA6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBHaXZlIGFuIGVycm9yIGlmIHRoZQorCXJlbG9jYXRpb24gc3ltYm9sIHdhcyBub3QgcmVzb2x2ZWQuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJlZmV0Y2ggdGhlIHN5bWJvbCBzZWN0aW9uIGFmdGVyCisJY2FsbGluZyBTX0dFVF9WQUxVRSwgc2luY2UgaXQgbWF5IGhhdmUgY2hhbmdlZC4KKworCSogZXhwci5jIChzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSk6IERlZmluZS4KKwkoZXhwcl9zeW1ib2xfbGluZXMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtYWtlX2V4cHJfc3ltYm9sKTogQWRkIGVudHJ5IHRvIGV4cHJfc3ltYm9sX2xpbmVzLgorCShleHByX3N5bWJvbF93aGVyZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGV4cHIuaDogVXNlIGV4dGVybiBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisJKGV4cHJfc3ltYm9sX3doZXJlKTogRGVjbGFyZS4KKwkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBUcnkgdG8gdXNlIGV4cHJfc3ltYm9sX3doZXJlCisJcmF0aGVyIHRoYW4gcHJpbnRpbmcgdGhlIG1lYW5pbmdsZXNzIG5hbWUgb2YgYW4gZXhwcmVzc2lvbgorCXN5bWJvbC4KKworVGh1IEp1biAyMCAxNTo1Nzo0MSAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogRGVsZXRlZC4KKwkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX251bWJlcl90b19jaGFycyk6IE5ldyBtYWNyby4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGJ1aWxkX29wZXJhdGVfbiwgYnVpbGRfbWVtKTogTW92ZWQgZWFybGllciBpbgorCXRoZSBmaWxlLgorCShsb2FkX3N5bWJvbF9hZGRyZXNzLCBsb2FkX2V4cHJlc3Npb24pOiBVc2UgYnVpbGRfbWVtLgorCShidWlsZF9vcGVyYXRlKTogTmV3IGZ1bmN0aW9uLgorCShlbWl0X2FkZHFfcik6IFVzZSBpdC4KKworCVdlZCBNYXIgMTMgMjI6MTQ6MTQgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIHN5bWJvbHMuYyAoY29sb24pOiAgI2lmIFZNUywgdXNlIFNfU0VUX09USEVSIHRvIHN0b3JlIGBjb25zdF9mbGFnJy4KKworCVR1ZSBNYXIgIDUgMTQ6MzE6NDUgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIGNvbmZpZy90Yy12YXguaCAoTk9QX09QQ09ERSk6IERlZmluZS4KKworCVN1biBGZWIgIDQgMjE6MDE6MDMgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIGNvbmZpZy9vYmotdm1zLmggKFNfSVNfQ09NTU9OKTogRGVmaW5lLgorCShTX0lTX0xPQ0FMKTogQ2hlY2sgZm9yIFwwMDIgYXMgd2VsbCBhcyBcMDAxLgorCShMT05HV09SRF9BTElHTk1FTlQpOiBOZXcgbWFjcm8uCisJKFNVQl9TRUdNRU5UX0FMSUdOKTogVXNlIGl0LgorCisJRnJpIEphbiAyNiAxNzo0NDowOSAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCSogY29uZmlnL3Ztcy1jb25mLmg6IFJlY29uY2lsZSB3aXRoIGNvbmYuaW4uCisKK1dlZCBKdW4gMTkgMTE6MzE6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChpc19kbnJhbmdlKTogT25seSBkZWZpbmUgaWYgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBpcworCWRlZmluZWQuCisKKwkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCB0aGF0IGFueSBudW1iZXIgb2YgaGV4IGRpZ2l0cyBjYW4KKwlmb2xsb3cgXHguCisKKwkqIGFzLmMgKHN0cnVjdCBkZWZzeW1fbGlzdCk6IERlZmluZS4KKwkoZGVmc3ltcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHBhcnNlX2FyZ3MpOiBKdXN0IHB1dCAtLWRlZnN5bSBhcmd1bWVudHMgb24gZGVmc3ltcyBsaXN0LCByYXRoZXIKKwl0aGFuIGRlZmluaW5nIHRoZW0uCisJKG1haW4pOiBEZWZpbmUgZGVmc3ltcyBhZnRlciBvdXRwdXQgZmlsZSBpcyBjcmVhdGVkLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IFBSRSBhbmQgUE9TVCBpbmRleGluZyBtb2RlIG9uCisJY3B1MzIuICBGcm9tIEVyaWMgTm9ydW0gPEVyaWMuTm9ydW1AdXNhc2suY2E+LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gY2FzZXMgJ0knLCAnaScsIGFuZCAnaicsIHNldAorCWluc25fZXJyb3IgcmF0aGVyIHRoYW4gY2FsbGluZyBjaGVja19hYnNvbHV0ZV9leHByLgorCisJKiBhcy5jIChlbXVsYXRpb25fbmFtZSk6IFJlbW92ZSB1bnVzZWQgc3RhdGljIHZhcmlhYmxlLgorCShkZWZhdWx0X2VtdWxfYmZkX25hbWUpOiBBZGQgcmV0dXJuIE5VTEwgdG8gYXZvaWQgd2FybmluZy4KKwkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBuYW1lIGFuZAorCW5hbWVfZW5kLgorCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRtcC4KKwkqIGhhc2guYyAoaGFzaF9ncm93KTogUGFyZW50aGVzaXplICsgd2l0aGluIDw8LgorCShoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBVc2UgJWx1LCBub3QgJWQsIHRvIHByaW50IHVuc2lnbmVkCisJbG9uZyB2YXJpYWJsZXMuCisJKiBtZXNzYWdlcy5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCisJKGZwcmludF92YWx1ZSk6IEFkZCBjYXN0IHRvIGF2b2lkIHByaW50ZiB3YXJuaW5nLgorCShzcHJpbnRfdmFsdWUpOiBMaWtld2lzZS4KKwkqIHJlYWQuYzogSW5jbHVkZSAiZWNvZmYuaCIuCisJKGVtaXRfZXhwcik6IEFkZCBjYXN0cyB0byBhdm9pZCBwcmludGYgd2FybmluZ3MuCisJKiByZWFkLmg6IFVzZSBleHRlcm4gZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKwkocG9wX2luc2VydCk6IERlY2xhcmUuCisJKiBzdGFicy5jOiBJbmNsdWRlICJlY29mZi5oIi4KKwkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgdG1wLAorCWZvcm1lcl9sYXN0X2ZyYWdQLCBhbmQgbmV3X2ZyYWdQLgorCSogc3Vic2Vncy5oIChzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgorCSogc3ltYm9scy5jIChkZWJ1Z192ZXJpZnlfc3ltY2hhaW4pOiBDaGFuZ2UgbWFjcm8gdG8gZGlzY2FyZAorCWFyZ3VtZW50cy4KKwkqIHdyaXRlLmMgKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBMaWtld2lzZS4KKwkqIHdyaXRlLmg6IFVzZSBleHRlcm4gZm9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKwkod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCisJKiBjb25maWcvZS1taXBzZWNvZmYuYyAobWlwc2Vjb2ZmX2JmZF9uYW1lKTogUmV0dXJuIE5VTEwgdG8gYXZvaWQKKwl3YXJuaW5nLgorCSogY29uZmlnL2UtbWlwc2VsZi5jIChtaXBzZWxmX2JmZF9uYW1lKTogTGlrZXdpc2UuCisJKiBjb25maWcvb2JqLWVsZi5oIChlbGZfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuCisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBJZiBPQkpfRUxGLCBhbHdheXMKKwllbWl0IHJlbG9jYXRpb25zIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scy4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKHRjX2dlbl9yZWxvYyk6IE91dHB1dCBhIHNlbnNpYmxlIGVycm9yCisgCW1lc3NhZ2UgaWYgYmZkX3JlbG9jX3R5cGVfbG9va3VwIGZhaWxzLCByYXRoZXIgdGhhbiBjYWxsaW5nCisgCWFzc2VydC4KKworCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBBZGQKKwlCRkRfUkVMT0NfMTJfUENSRUwgdG8gc3dpdGNoLgorCitUdWUgSnVuIDE4IDIwOjI5OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pMzg2LmggKExPQ0FMX0xBQkVMLEZBS0VfTEFCRUxfTkFNRSk6IFVzZSBkZWZhdWx0cyBmb3IKKwlURV9QRSAoTGZvbywgbm90IC5MZm9vKS4KKworVHVlIEp1biAxOCAxNzoxMzozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAoc19maWxsKTogRG9uJ3Qgd2FybiBhYm91dCBhIHplcm8gcmVwZWF0IGNvdW50LgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3Qgd2FybiBhYm91dCB1c2luZyBBVCBhcyBhCisJY29wcm9jZXNzb3IgcmVnaXN0ZXIuCisKKwkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogV2hlbiBjaGVja2luZyB0aGUgc2l6ZSBvZiBhCisJcmVnaXN0ZXIgdG8gc2V0IHRoZSBzaXplIG9mIGFuIGluc3RydWN0aW9uLCBkbyBhIGJpdHdpc2UgYW5kIHdpdGgKKwlSZWc4IGFuZCBSZWcxNiByYXRoZXIgdGhhbiByZXF1aXJpbmcgdGhlIHR5cGUgdG8gYmUgZXhhY3RseSBSZWc4CisJb3IgUmVnMTYuCisKK1R1ZSBKdW4gMTggMTM6MTk6NTEgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9yZWcpOiBUd2VhayBlcnJvciBtZXNzYWdlcy4KKwkoYnVpbGRfYnl0ZXMpOiBMaWtld2lzZS4KKwkoc2tpcF9jb2xvbnRoaW5nKTogSGFuZGxlIDozMiBzdWZmaXguCisJKGdldF9zcGVjaWZpYyk6IFByb21vdGUgTF8yNCB0byBMXzMyIGlmIGl0IG1ha2VzIGEgbWF0Y2guCisJRG9uJ3QgYWx3YXlzIHByb21vdGUgTF84IHRvIExfMTYuCisJKGRvX2FfZml4X2ltbSk6IENsZWFuIHVwIExfMzIgYW5kIExfMjQgaGFuZGxpbmcuCisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChTbW9kZSk6IE5ldyB2YXJpYWJsZS4KKwkoaDgzMDBobW9kZSk6IFR1cm4gb2ZmIEhtb2RlLgorCShoODMwMHNtb2RlKTogTmV3IGZ1bmN0aW9uLiAgVHVybiBvbiBTbW9kZSBhbmQgSG1vZGUuCisJKG1kX3BzZXVkb190YWJsZSk6IE5ldyAiLmg4MzAwcyIgcHNldWRvLW9wLgorCShwYXJzZV9yZWcpOiBIYW5kbGUgImV4ciIgcmVnaXN0ZXIuCisJKGdldF9vcGVyYW5kKTogSGFuZGxlIGJpemFycmUgc3ludGF4IGZvciAic3RtLmwiIGFuZCAibGRtLmwiLgorCUhhbmRsZSAibWFjaCIgYW5kICJtYWNobCIgb3BlcmFuZHMgZm9yIGxkbWFjLgorCShnZXRfc3BlY2lmaWMpOiBIYW5kbGUgInN0bS5sIiBhbmQgImxkbS5sIi4KKwkoYnVpbGRfYnl0ZXMpOiBIYW5kbGUgInN0bS5sIiBhbmQgImxkbS5sIjsgaGFuZGxlIE1BQ1JFRyBvcGVyYW5kcy4KKwkqIGNvbmZpZy90Yy1oODMwMC5oIChDT0ZGX01BR0lDKTogSGFuZGxlIEg4L1MgbWFnaWMgbnVtYmVyLgorCShTbW9kZSk6IERlY2xhcmUuCisKK01vbiBKdW4gMTcgMTU6NTA6NTMgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBkb2MvYXMudGV4aW5mbzogUmVvcmRlciBjaGFwdGVyIG9mIG1hY2hpbmUgZGVwZW5kZW50IG9wdGlvbnMgc28KKyAJdGhhdCBpdCBpcyBzb3J0ZWQgYnkgY2hpcCBuYW1lLiAgCisKKwkqIGRvYy9hcy50ZXhpbmZvOiBVc2UgY29uc2lzdGFudCBzcGVsbGluZyBvZiBWYXguCisJKiBkb2MvYy12YXgudGV4aTogTGlrZXdpc2UuCisKK01vbiBKdW4gMTcgMTE6MjY6NTYgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmJlZ2luX3RyeSIgYW5kICIuZW5kX3RyeSIKKwlwc2V1ZG8gb3BzLgorCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIFJfQkVHSU5fVFJZIGFuZCBSX0VORF9UUlkuCisJKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgorCShwYV90cnkpOiBOZXcgZnVuY3Rpb24uCisJKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIHJlbG9jcyBmb3IgQkVHSU5fVFJZIGFuZCBFTkRfVFJZLgorCitTdW4gSnVuIDE2IDIyOjU3OjQ3IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgIi5sZXZlbCIgcHNldWRvIG9wLgorCShwYV9sZXZlbCk6IE5ldyBmdW5jdGlvbi4KKworRnJpIEp1biAxNCAyMDowNjo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgbGlzdGluZyBpcyAwLgorCitUaHUgSnVuIDEzIDE3OjUwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IElmIHN5bWJvbF90YWJsZV9mcm96ZW4gaXMgc2V0LCBjYWxsCisJc3ltYm9sX2NyZWF0ZSwgbm90IHN5bWJvbF9uZXcuCisKK1dlZCBKdW4gMTIgMTQ6MTA6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IERvbid0IHNldCBzeV91c2VkX2luX3JlbG9jIGZvciBhbgorCWFic29sdXRlIHN5bWJvbCB1bmxlc3MgVENfRk9SQ0VfUkVMT0NBVElPTiByZXR1cm5zIHRydWUuCisKKwkqIGNvbmZpZy9vYmotY29mZi5jIChwcmV2aW91c19maWxlX3N5bWJvbCk6IFJlbW92ZSBCRkRfQVNTRU1CTEVSCisJdmVyc2lvbi4KKwkoY19kb3RfZmlsZV9zeW1ib2wpOiBCRkRfQVNTRU1CTEVSIHZlcnNpb246IERvbid0IHNldCB0aGUgdmFsdWUgb2YKKwl0aGUgc3ltYm9sIHRvIGEgcG9pbnRlci4gIERvbid0IHNldCBwcmV2aW91c19maWxlX3N5bWJvbC4KKwlTaW1wbGlmeSBzeW1ib2wgbGlzdCByZWFycmFuZ2VtZW50LgorCShjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBDX0ZJTEUgc3ltYm9scy4KKwkoY29mZl9hZGp1c3Rfc3ltdGFiKTogRG9uJ3QgY2hlY2sgcHJldmlvdXNfZmlsZV9zeW1ib2wuCisKK01vbiBKdW4gMTAgMTQ6NTI6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBOZXcgZnVuY3Rpb24gZm9yIC5sY29tbQorCWRpcmVjdGl2ZS4KKwkobWRfcHNldWRvX3RhYmxlKTogQWRkIHBwY19lbGZfbGNvbW0uCisKK01vbiBKdW4gMTAgMTE6NDU6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWNjZXB0IEFCU0wgZm9yICdPJywgc28gdGhhdCBgYmZleHR1CisJZDB7MjQ6MX0sZDAnIHdvcmtzIHdpdGhvdXQgYW4gaW1tZWRpYXRlIHByZWZpeCBvbiB0aGUgYml0IG51bWJlcnMuCisJKG1kX2JlZ2luKTogQWRkIGRpZ2l0cyB0byBhbHRfbm90ZW5kX3RhYmxlLgorCShtZF9wYXJzZV9vcHRpb24pOiBNYWtlIHMgYSBjb25zdCBwb2ludGVyLgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJlbXB0eSIuCisJKHNfZW1wdHkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAoc3RydWN0IGZpbGVuYW1lX2xpc3QpOiBPbmx5IGRlZmluZSBpZiBub3QKKwlCRkRfQVNTRU1CTEVSLgorCShmaWxlbmFtZV9saXN0X2hlYWQsIGZpbGVuYW1lX2xpc3RfdGFpbCk6IExpa2V3aXNlLgorCShjX3NlY3Rpb25fc3ltYm9sKTogUmVtb3ZlIHVudXNlZCBCRkRfQVNTRU1CTEVSIHZlcnNpb24uCisJKG9ial9jb2ZmX2VuZGVmLCBCRkRfQVNTRU1CTEVSIHZlcnNpb24pOiBEb24ndCBzZXQgdGhlIGRlYnVnZ2luZworCWZsYWcgZm9yIENfTU9TLCBDX01PRSwgQ19NT1UsIG9yIENfRU9TIHN5bWJvbHMsIHNpbmNlIHRoZXkgc2hvdWxkCisJaGF2ZSBhIHNlY3Rpb24gb2YgTl9BQlMgcmF0aGVyIHRoYW4gTl9ERUJVRy4gIElmIHdlIGRvIGEgbWVyZ2UsCisJcmVtb3ZlIHRoZSBuZXcgc3ltYm9sIGZyb20gdGhlIGxpc3QuCisgCShvYmpfY29mZl9lbmRlZiwgYm90aCB2ZXJzaW9ucyk6IENhbGwgdGFnX2luc2VydCBldmVuIGlmIHRoZXJlIGlzCisJYW4gb2xkIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUsIGlmIHRoZSBvbGQgc3ltYm9sIGRvZXMgbm90CisJaGFwcGVuIHRvIGJlIGEgdGFnLgorCShjb2ZmX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgU0ZfR0VUX1RBRywgQ19FT0YsIGFuZCBDX0ZJTEUgb3V0c2lkZSBvZgorCXRoZSBTRl9HRVRfREVCVUcgY29uZGl0aW9uLiAgRG9uJ3QgY2FsbCBTQV9TRVRfU1lNX0VORE5EWCB3aXRoIGEKKwlzeW1ib2wgdGhhdCB3aWxsIGJlIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LgorCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBBbHdheXMgY2FsbCBzZWN0aW9uX3N5bWJvbCBmb3IgLnRleHQsCisJLmRhdGEsIGFuZCAuYnNzLgorCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IExpa2V3aXNlLiAgQWxzbywgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCXN0cm5hbWUuCisKKwkqIGNvbmZpZy90Yy1uczMyay5jIChjb252ZXJ0X2lpZik6IENhbGwgZnJhZ19ncm93IHJhdGhlciB0aGFuCisJbWFuaXB1bGF0aW5nIGZyYWdzIGRpcmVjdGx5LgorCShtZF9udW1iZXJfdG9fZmllbGQpOiBBZGp1c3QgbWVtX3B0ciBjb3JyZWN0bHkgaWYgRU5ESUFOIGlzCisJZGVmaW5lZC4KKworCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgJy8nIGlzIExJTkVfQ09NTUVOVF9TVEFSVCwgY2hlY2sKKyAJd2hldGhlciB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgJyonIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHdlIGFyZQorCWF0IHRoZSBzdGFydCBvZiBhIGxpbmUuICBQZXJtaXQgTElORV9DT01NRU5UX1NUQVJUIHRvIHN0YXJ0IGEKKwljb21tZW50IGluIHN0YXRlIDEgKHNlZW4gc29tZSB3aGl0ZXNwYWNlKSBhcyB3ZWxsLCB0byBtYXRjaCB0aGUKKwlkb2N1bWVudGF0aW9uLgorCisJKiBnYXNwLmMgKGRvX2FsaWduKTogUGVybWl0IGEgZmlsbCB2YWx1ZSBmb3IgLmFsaWduLgorCitXZWQgSnVuICA1IDE3OjA5OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogV2FybiBpZiBhIG5ld2xpbmUgaXMgc2VlbiBpbiB0aGUKKwltaWRkbGUgb2YgYSBzdHJpbmcuICBDYWxsIGJ1bXBfbGluZV9jb3VudGVycyB3aGVuIGFwcHJvcHJpYXRlLgorCitXZWQgSnVuICA1IDE3OjA4OjM2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBzeW1ib2xzLmMgKGNvbG9uKTogVXNlIExPQ0FMX0xBQkVMLgorCitUdWUgSnVuICA0IDEwOjU1OjE2IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGNoZWNrIHRvIHNlZSBpZiB0b29sZGlyIGV4aXN0cy4KKwlNYWtlICQodG9vbGRpcikgYW5kICQodG9vbGRpcikvYmluLgorCitUdWUgSnVuICA0IDEwOjE0OjUzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3BwYy1zb2wubXQgKFRERUZJTkVTKTogRG9uJ3QgdHVybiBvbiAtbXJlZ25hbWVzIGJ5CisJZGVmYXVsdC4KKworTW9uIEp1biAgMyAxMTozNDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCBjYWxsIGFzX3dhcm4gaWYgd2UgYXJlIHNldHRpbmcKKwlpbnNuX2Vycm9yLiAgRG9uJ3QgcHV0IHRoZSBzdHJpbmcgIkVSUk9SIiBpbiBpbnNuX2Vycm9yLiAgU2V0CisJaW5zbl9lcnJvciByYXRoZXIgdGhhbiBjYWxsaW5nIGFzX3dhcm4gZm9yIGFuIHVuc3VwcG9ydGVkIG9wY29kZS4KKworU2F0IEp1biAgMSAyMTo1MTo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IENoZWNrIGZvciBhIDY0IGJpdCBmb3JtYXQKKwliZWZvcmUgcGVybWl0dGluZyAtNjQuCisJKiBvdXRwdXQtZmlsZS5jIChvdXRwdXRfZmlsZV9jcmVhdGUpOiBSZW1vdmUgZHVwbGljYXRlCisJYmZkX3BlcnJvci4KKworRnJpIE1heSAzMSAwMTowODowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogSWYgLTY0LCBjcmVhdGUgYSAuTUlQUy5vcHRpb25zCisJc2VjdGlvbiByYXRoZXIgdGhhbiBhIC5yZWdpbmZvIHNlY3Rpb24uCisJKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBJZiAtNjQsIHdyaXRlIG91dCA2NCBiaXQgUmVnSW5mbworCWluZm9ybWF0aW9uLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogSWYgbWlwc19pc2EgPCAzLCBwZXJtaXQgYSAzMgorCWJpdCB2YWx1ZSB3aXRoIHRoZSBoaWdoIGJpdCBzZXQuCisKK1RodSBNYXkgMzAgMTk6MDA6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHNfbGNvbW0pOiBTZXQgc2VjdGlvbiBmbGFncyBmb3IgLnNic3Mgc2VjdGlvbi4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc182NCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IElmIG1pcHNfNjQsIHJldHVybiBlbGY2NCB0YXJnZXRzIHJhdGhlciB0aGFuCisJZWxmMzIgb25lcy4KKwkobWRfbG9uZ29wdHMpOiBBZGQgIjMyIiBhbmQgIjY0Ii4KKwkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC0zMiBhbmQgLTY0LgorCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtMzIgYW5kIC02NC4KKwkoY29uc19maXhfbmV3X21pcHMpOiBJZiBtaXBzXzY0LCBkb24ndCBjb252ZXJ0IGFuIDggYnl0ZSByZWxvYyB0bworCWEgNCBieXRlIG9uZS4KKworVGh1IE1heSAzMCAxMDozNjoxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAoY29tbWVudF9jaGFycyk6IE1ha2UgJyEnIGEgY29tbWVudCBjaGFyYWN0ZXIKKwlmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgorCisJKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IFVuZGVyIFBvd2VyUEMgU29sYXJpcywgY29udmVydCBhCisJLnN0YWJkIHdpdGggNCBhcmd1bWVudHMgaW50byBhIC5zdGFibi4KKworV2VkIE1heSAyOSAxNjo0MzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogV2hlbiBwYXNzaW5nIFhfYWRkX251bWJlciB0bworCW1hY3JvX2J1aWxkLCBjYXN0IGl0IHRvIGludCBmaXJzdC4KKworVHVlIE1heSAyOCAxMzoyOTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy16OGsuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIGZ4X3JfdHlwZSBvZiAwLCBhcworCWNyZWF0ZWQgYnkgZW1pdF9leHByLgorCisJKiBzeW1ib2xzLmMgKHN5bWJvbF9jcmVhdGUpOiBJZiBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgZmFpbHMsIGNhbGwKKwlhc19wZXJyb3IgcmF0aGVyIHRoYW4gYXNzZXJ0LgorCitGcmkgTWF5IDI0IDE4OjI0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE1hcmsgc2VjdGlvbnMgY3JlYXRlZCB0byBob2xkCisJZmxvYXRpbmcgcG9pbnQgaW5mb3JtYXRpb24gYXMgcmVhZCBvbmx5LgorCitGcmkgTWF5IDI0IDEyOjA3OjU0IDE5OTYgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19zZXRfY3B1KTogQ2hhbmdlIGRlZmF1bHRzIHRvIG1hdGNoIEFJWC4KKworVGh1IE1heSAyMyAxNzozNDoyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAuc2tpcCBhcyBhIHN5bm9ueW0gZm9yIC5zcGFjZS4KKworCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBGb3IgUG93ZXJQQyBFTEYsIGFsbG93IC5zdGFiZCB0byB0YWtlCisJNCBhcmd1bWVudHMsIHByb3ZpZGluZyB0aGUgNHRoIGFyZ3VtZW50IGlzIDAsIHRvIGFsbG93CisJY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBTb2xhcmlzIGFzc2VtYmxlci4KKworVGh1IE1heSAxNiAxNTo1MTo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zaC5oIChzdHJ1Y3Qgc2hfc2VnbWVudF9pbmZvX3R5cGUpOiBEZWZpbmUuCisJKFRDX1NFR01FTlRfSU5GT19UWVBFKTogRGVmaW5lLgorCShzaF9mcm9iX2xhYmVsKTogRGVjbGFyZS4KKwkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KKwkoc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWNsYXJlLgorCShtZF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6IElmIHJlbGF4aW5nLCBlbWl0IGEgUl9TSF9DT0RFCisgCXJlbG9jIGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgbmVjZXNzYXJ5LgorCShzaF9mcm9iX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgorCShzaF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KKwkoc2hfY29mZl9mcm9iX2ZpbGUpOiBJZ25vcmUgQUxJR04sIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MKKwl3aGVuIGxvb2tpbmcgZm9yIHRoZSByZWxvYyBmb3IgdGhlIHRhcmdldCBvZiAudXNlcy4KKwkobWRfY29udmVydF9mcmFnKTogRml4IHByaW50ZiBmb3JtYXQgKCUweGx4IHRvIDB4JWx4KS4KKwkoc2hfZm9yY2VfcmVsb2NhdGlvbik6IEZvcmNlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MgdG8gYmUKKwllbWl0dGVkLgorCShtZF9hcHBseV9maXgpOiBJZ25vcmUgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcy4KKwkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBGb3JjZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzIHRvIHVzZQorCXRoZSBhYnNvbHV0ZSBzeW1ib2wuCisKKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGQgdGNfc2VnbWVudF9pbmZvX2RhdGEgZmllbGQgaWYKKwlUQ19TRUdNRU5UX0lORk9fVFlQRSBpcyBkZWZpbmVkLgorCitXZWQgTWF5IDE1IDEyOjIzOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN1cmUgdGhlIG9wY29kZSBzdWZmaXgKKwltYXRjaGVzIHRoZSByZWdpc3RlciBzaXplLgorCitXZWQgTWF5IDE1IDA4OjMzOjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNvdW50X2VudHJpZXNfaW5fY2hhaW4pOiBJZ25vcmUgRml4dXBzIHdpdGgKKwlmeF9kb25lIHNldC4gCisJKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KKwkoZml4dXBfc2VnbWVudCk6IERvbid0IGp1c3QgcXVpdCBpZiBsaW5rcmVsYXggaXMgc2V0LiAgVHJ5IHRvCisJYXBwbHkgbm9uIHBjLXJlbGF0aXZlIHN5bTEtc3ltMiBmaXh1cHMsIGV2ZW4gaWYgbGlua3JlbGF4IGlzCisJbm9uemVyby4KKworRnJpIE1heSAxMCAxNDoxNjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBbGxvdyBHT1QgYW5kIHNlY3Rpb24KKwlyZWxhdGl2ZSByZWxvY2F0aW9ucyB3aXRoIC1tcmVsb2NhdGFibGUuICBBbHNvIGFsbG93IHVuZml4ZWQKKwlyZWxvY3MgaW4gLmV4X3NoYXJlZC4KKworVHVlIE1heSAgNyAxMToyNDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBDaGVjayB0aGF0IEZOQU1FX09GRlNFVCBpcworCW5vbi16ZXJvIGJlZm9yZSBhc3N1bWluZyB0aGlzIGlzIGEgbG9uZyBmaWxlIG5hbWUuCisJKHdfc3RyaW5ncyk6IExpa2V3aXNlLgorCShjX2RvdF9maWxlX3N5bWJvbCk6IFNldCBGTkFNRV9PRkZTRVQgdG8gMSBmb3IgYSBsb25nIGZpbGUgbmFtZS4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKHdfc3RyaW5ncyk6IE1vdmUgZGVjbGFyYXRpb24gb2YgaSBpbnNpZGUKKwkjaWZkZWYgYmxvY2sgd2hpY2ggdXNlcyBpdC4KKworVHVlIE1heSAgNyAwMDo0OTo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0pOiBSZW5hbWUgbGFzdCBhcmd1bWVudCB0bworCSJyZWxheG1vZGUiLiAgT3V0cHV0IHJlbG9jcyB3aGljaCBpZGVudGlmeSB2YXJpb3VzIHJlbGF4aW5nCisJcG9zc2liaWxpdGllcyBmb3IgbW92Lltid2xdIGluc3RydWN0aW9ucy4KKwkoYnVpbGRfYnl0ZXMpOiBQYXNzIGluIGEgcmVsYXhpbmcgbW9kZSB0byBkb19hX2ZpeF9pbW0uCisKK01vbiBNYXkgIDYgMTU6MjY6MjggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWFybS5oIChUQ19IQU5ETEVTX0ZYX0RPTkUpOiBEZWZpbmUuCisJKE1EX0FQUExZX0ZJWDMpOiBEZWZpbmUuCisJKiBjb25maWcvdGMtYXJtLmMgKG15X2dldF9leHByZXNzaW9uKTogT25seSB3YXRjaCBmb3IgYmFkIHNlZ21lbnRzCisJaWYgT0JKX0FPVVQuCisJKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWVkIGZyb20gbWRfYXBwbHlfZml4LgorCUlmIHBjcmVsIHJlbG9jIGFuZCBzeW1ib2wgaXMgaW4gZGlmZmVyZW50IHNlY3Rpb24sIHVuZG8gZWZmZWN0cworCW9mIG1kX3BjcmVsX2Zyb20uCisKK1NhdCBNYXkgIDQgMTI6NDk6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0CisJYW55IHJlbG9jIHdpdGggYW4gTFIlIG9yIFJSJSBmaWVsZCBzZWxlY3RvciBmb3IgU09NLgorCitTYXQgTWF5ICA0IDExOjI2OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEFkZCBzdWJzZWdzLmggdG8gYXBwcm9wcmlhdGUgVEFSR19DUFVfREVQXyoKKyAJdmFyaWFibGVzLgorCitGcmkgTWF5ICAzIDE3OjU4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBtZXJnZSBhIHN5bWJvbCB3aXRoCisJU0ZfR0VUX1NUQVRJQ1Mgc2V0LgorCSh5YW5rX3N5bWJvbHMpOiBMaWtld2lzZS4KKworV2VkIE1heSAgMSAxMzozODoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBJZiBNQU5ZX1NFR01FTlRTIGFuZCBub3QKKwlCRkRfQVNTRU1CTEVSLCBhZGQgbmFtZSBmaWVsZC4KKwkqIGNvbmZpZy9vYmotY29mZi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCisJKGNvZmZfaGVhZGVyX2FwcGVuZCk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCisJKGNyYXdsX3N5bWJvbHMpOiBKdXN0IHVzZSB0aGUgbmFtZSBmaWVsZCBmb3IgdGhlIHN5bWJvbCBuYW1lLAorCXdpdGhvdXQgd29ycnlpbmcgYWJvdXQgbnVsbCBieXRlIHRlcm1pbmF0aW9uLgorCSh3X3N0cmluZ3MpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgorCSh3cml0ZV9vYmplY3RfZmlsZSk6IExpa2V3aXNlLiAgQWxzbywgdXNlIHRoZSBuYW1lIGZpZWxkLCByYXRoZXIKKwl0aGFuIHNjbmhkci5zX25hbWUuCisJKG9ial9jb2ZmX2FkZF9zZWdtZW50KTogUGVybWl0IGxvbmcgc2VjdGlvbiBuYW1lcy4KKwkob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgdGhlIG5hbWUgZmllbGQsIHJhdGhlciB0aGFuCisJc2NuaGRyLnNfbmFtZS4KKwkoYWRqdXN0X3N0YWJfc2VjdGlvbik6IExpa2V3aXNlLgorCSogY29uZmlnL3RlLXBlLmggKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgorCisJKiBjb25maWcvdGMtaTk2MC5jIChicnRhYl9lbWl0KTogRG9uJ3Qgc2V0IGZ4X2ltX2Rpc3AgZmllbGQuCisJKG1lbV9mbXQpOiBMaWtld2lzZS4KKwkobWRfYXBwbHlfZml4KTogRG9uJ3QgY2hlY2sgZnhfaW1fZGlzcCBmaWVsZC4KKworVGh1IEFwciAyNSAxMTozOTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkICogYWZ0ZXIgc3BhcmMqLSotdnh3b3Jrcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogSWYgdGNfY29tbWVudF9jaGFycyBpcyBub3QgZGVmaW5lZCwKKwlkZWZpbmUgaXQgdG8gY29tbWVudF9jaGFycy4gIFVzZSB0Y19jb21tZW50X2NoYXJzIHJhdGhlciB0aGFuCisJY29tbWVudF9jaGFycy4KKwkoZG9fc2NydWJfY2hhcnMpOiBVc2UgdGNfY29tbWVudF9jaGFycyByYXRoZXIgdGhhbiBjb21tZW50X2NoYXJzLgorCSogY29uZmlnL3RjLW02OGsuaCAodGNfY29tbWVudF9jaGFycyk6IERlZmluZS4KKwkobTY4a19jb21tZW50X2NoYXJzKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfY29tbWVudF9jaGFycyk6IFJlbmFtZSBmcm9tCisJY29tbWVudF9jaGFycy4gIENoYW5nZSBpbnRvIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhbiBhcnJheS4KKwkobWRfbG9uZ29wdHMpOiBBZGQgImJpdHdpc2Utb3IiLgorCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgT1BUSU9OX0JJVFdJU0VfT1IuCisJKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0tYml0d2lzZS1vci4KKwkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLS1iaXR3aXNlLW9yLgorCitXZWQgQXByIDI0IDExOjI4OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFByZXZlbnQgYXR0ZW1wdHMgdG8gdXNlIGxvbmcgb2Zmc2V0cworIAlpbiA2ODAwMCBtb2RlLgorCisJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IEJGRF9BU1NFTUJMRVIgdmVyc2lvbjoKKwljYWxsIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuICBOb24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgorCWNvcnJlY3QgaGFuZGxpbmcgb2YgaW5wdXQgbGluZSBwb2ludGVyLCBhbmQgY2FsbAorCWRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCisKK01vbiBBcHIgMjIgMTg6MDI6MzcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBibHVlcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoaW5fYml0ZmllbGRfcmFuZ2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzcGFyY19pcCk6IE5ldyBjYXNlcyBYLFkuICBVc2UgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUC4KKwkobWRfYXBwbHlfZml4LCBjYXNlcyBCRkRfUkVMT0NfMzJfUENSRUxfUzIsCisJQkZEX1JFTE9DX1NQQVJDX3tXRElTUDE2LFdESVNQMTl9KTogRml4IHVuZGVmaW5lZCBjb2RlLgorCShtZF9hcHBseV9maXgpOiBOZXcgY2FzZXMgQkZEX1JFTE9DX1NQQVJDX1s1Nl0uCisJKHRjX2dlbl9yZWxvYyk6IE5ldyBjYXNlcyBCRkRfUkVMT0NfU1BBUkNfWzU2XS4KKworVGh1IEFwciAxOCAxODo1ODozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5jOiBCRkRfQVNTRU1CTEVSOgorIAkoY29mZl9sYXN0X2JmKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoY29mZl9mcm9iX3N5bWJvbCk6IFNldCBlbmRuZHggb2YgYSAuYmYgc3ltYm9sLgorCU5vbiBCRkRfQVNTRU1CTEVSOgorCShvYmpfY29mZl9lbmRlZik6IENhbGwgU0ZfU0VUX1BST0NFU1Mgb24gYSAuYmYgc3ltYm9sLgorCShsYXN0X2JmUCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHlhbmtfc3ltYm9scyk6IFNldCBlbmRuZHggb2YgYSAuYmYgc3ltYm9sLgorCitUaHUgQXByIDE4IDExOjUzOjU4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgU29sYXJpcydzIC1sZQorCWFuZCAtcyBvcHRpb25zLiAgQWRkIC1iZSBmb3IgZ29vZCBtZWFzdXJlLgorCitXZWQgQXByIDE3IDEyOjMxOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcmVhZC5jIChzX3NwYWNlKTogU3VwcG9ydCBub24tY29uc3RhbnQgZmlsbCB2YWx1ZS4gIEhhbmRsZSBmaWxsCisJdmFsdWUgY29ycmVjdGx5IGZvciBhIHNpemUgb3RoZXIgdGhhbiAxLgorCitUdWUgQXByIDE2IDE1OjE3OjQwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hcm0uYyAobXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24pOiBVcGRhdGUgY2FsbCB0bworCWdlbl90b193b3JkcywgWF9QUkVDSVNJT04gY2hhbmdlZCBmcm9tIDYgdG8gNS4KKworVHVlIEFwciAxNiAxMDoyNTo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocmVnaXN0ZXJfbmFtZSxyZWdfbmFtZV9zZWFyY2gpOiBNb3ZlIHJlZ2lzdGVyCisJbmFtZSBsb29rdXAgZnJvbSBQRSBzcGVjaWZpYyBjb2RlIHRvIGFsbCB0YXJnZXRzLiAgQWRkIHN1cHBvcnQgZm9yCisJLW1yZWduYW1lcy8tbW5vLXJlZ25hbWVzIHRvIGNvbnRyb2wgd2hldGhlciByZWdpc3RlciBuYW1lcyBhcmUKKwlleHBhbmRlZCBvciBub3QuCisJKG1kX2Fzc2VtYmxlKTogQ2FsbCByZWdpc3Rlcl9uYW1lIGZvciBhbGwgcGxhdGZvcm1zLgorCShtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1yZWduYW1lcy8tbW5vLXJlZ25hbWVzLgorCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGNsZSotKi1zb2xhcmlzKTogQWRkIHN1cHBvcnQuCisJKHBvd2VycGMqLSotbGludXgpOiBEaXR0by4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogY29uZmlnL3BwYy1zb2wubXQ6IE5ldyBjb25maWcgZmlsZSBmb3IgUG93ZXJQQyBTb2xhcmlzLgorCitNb24gQXByIDE1IDEyOjI2OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19mcm9iX2ZpbGUpOiBQZXJtaXQgbXVsdGlwbGUgJWhpIHJlbG9jcyB0bworCWJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSAlbG8gcmVsb2MuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHZhbHVlVAorCWJlZm9yZSBjb21wYXJpbmcgYWdhaW5zdCBNQVhfR1BSRUxfT0ZGU0VULCBzbyB0aGF0IG5lZ2F0aXZlCisJbnVtYmVycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJKG1hY3JvKTogTGlrZXdpc2UuCisKK1RodSBBcHIgMTEgMTI6Mzk6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAobGFzdF9pbnNuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfYXNzZW1ibGUpOiBXYXJuIGFib3V0IHB1dHRpbmcgZmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMgaW4gYQorCWRlbGF5IHNsb3QuICBJZiBhcmNoaXRlY3R1cmUgaXMgbGVzcyB0aGFuIHY5LCBpbnNlcnQgTk9QCisJaW5zdHJ1Y3Rpb25zIGJldHdlZW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGFuZCBmbG9hdGluZworCXBvaW50IGJyYW5jaGVzLiAgKFRoZSBTdW5PUyBhc3NlbWJsZXIgZG9lcyBib3RoIHRoZXNlIG9wZXJhdGlvbnMuKQorCVNhdmUgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorCShzcGFyY19pcCk6IEFkZCBwaW5zbiBwYXJhbWV0ZXIuICBDaGFuZ2UgY2FsbGVyLgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IENvcnJlY3QgY2hlY2sKKwlmb3IgYnl0ZSBqdW1wIHRvIG5leHQgaW5zdHJ1Y3Rpb24gdG8gc2tpcCBlbXB0eSBmcmFncy4KKworV2VkIEFwciAxMCAxNjo0ODoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IElmIHdlIGFyZSBnb2luZyB0byBjYWxsIGVtaXRfYWRkNjQKKwlmb3IgYWRkcSB3aXRoIGEgMTYgYml0IHNpZ25lZCB2YWx1ZSwganVzdCBlbWl0IGEgbGRhIGluc3RydWN0aW9uCisJaW5zdGVhZC4KKworV2VkIEFwciAxMCAxNDozNDo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0pOiBEb24ndCBjdXQgb2ZmIGhpZ2ggYml0cworCW9mIGEgMzJiaXQgb3BlcmFuZC4KKworTW9uIEFwciAgOCAxNDo0Mjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgorCWRpcmVjdG9yaWVzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgQXByICA1IDE3OjAxOjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWg4MzAwLmMgKGdldF9zcGVjaWZpYyk6IFJlbW92ZSBzb21lICNpZiAwIGNvZGUuCisJKGJ1aWxkX2J5dGVzKTogUmVtb3ZlIGFsbCBBQlNNT1YgcmVsYXRlZCBjb2RlOyBpdCdzIHVubmVjZXNzYXJ5LgorCitGcmkgQXByICA1IDE1OjEzOjEwIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWcvYXRvZi1pZWVlLmM6IEZpeCBoYW5kbGluZyBvZiBkZW5vcm1hbGl6ZWQgZXh0ZW5kZWQKKwlwcmVjaXNpb24gbnVtYmVycyBhbmQgb3ZlcmZsb3cvdW5kZXJmbG93IGRldGVjdGlvbi4KKwkoTUFYX1BSRUNJU0lPTiwgWF9QUkVDSVNJT04sIFBfUFJFQ0lTSU9OKTogQ2hhbmdlZCBmcm9tIDYgdG8gNSwgdG8KKwlub3QgaW5jbHVkZSB0aGUgMTYgYml0IGdhcCBpbiB0aGUgbTY4ayBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LgorCitGcmkgQXByICA1IDE0OjI5OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgaTM4Ni0qLWZyZWVic2RlbGYqIHRhcmdldDsgZnJvbSBKb2huIFBvbHN0cmEKKwk8amRwQHBvbHN0cmEuY29tPi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworRnJpIEFwciAgNSAxODozOToyOCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1taXBzLmM6IEFsbG93IG5vbi16ZXJvIG9mZnNldHMgZnJvbSAuc2RhdGEgc3ltYm9scyB0bworIAliZSBhY2Nlc3NlZCB1c2luZyB0aGUgJGdwIHJlZ2lzdGVyLgorCSogY29uZmlnL3RjLW1pcHMuaCAoTUFYX0dQUkVMX09GRlNFVCk6IEFkZGVkLgorCitXZWQgQXByICAzIDEwOjU2OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19tZF9lbmQpOiBTZXQgYmZkIG1hY2hpbmUgbnVtYmVyIHRvCisJYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQgaWYgY3VycmVudF9hcmNoaXRlY3R1cmUgaXMgc3BhcmNsZXQuCisKK01vbiBBcHIgIDEgMTY6NTU6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKGdldF9saW5lX3NiKTogQnVtcCBsaW5lIGNvdW50ZXJzIGJhc2VkIG9uCisJaW5wdXRfbGluZV9wb2ludGVyWy0xXSwgbm90ICppbnB1dF9saW5lX3BvaW50ZXIuICBEb24ndCBib3RoZXIgdG8KKwljYWxsIExJU1RJTkdfTkVXTElORS4KKwkoc19tYWNybyk6IERvbid0IGNhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KKwkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFdoZW4gaGFuZGxpbmcgQyBzdHlsZSBjb21tZW50cywgdW5nZXQKKwljaDIgcmF0aGVyIHRoYW4gY2guCisKK0ZyaSBNYXIgMjkgMTY6MTU6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmggKGVudW0gbGlua29uY2VfdHlwZSk6IERlZmluZS4KKwkoc19saW5rb25jZSk6IERlY2xhcmUuCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgImxpbmtvbmNlIi4KKwkoc19saW5rb25jZSk6IE5ldyBmdW5jdGlvbi4KKwkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpOiBBZGQgbGlua29uY2UgZmllbGQgdG8KKwlNQU5ZX1NFR01FTlRTICYmICEgQkZEX0FTU0VNQkxFUiBzZWN0aW9uLgorCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9oYW5kbGVfbGlua19vbmNlKTogRGVmaW5lIGlmIFRFX1BFLgorCShvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlKTogRGVjbGFyZSBpZiBURV9QRS4KKwkqIGNvbmZpZy9vYmotY29mZi5jOiBJZiBURV9QRSBhbmQgbm90IEJGRF9BU1NFTUJMRVIsICNpbmNsdWRlCisJImNvZmYvcGUuaCIuCisJKG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UpOiBOZXcgZnVuY3Rpb24sIGRlZmluZWQgaWYgVEVfUEUuCisJKGNfc2VjdGlvbl9zeW1ib2wpOiBJZiBURV9QRSwgc2V0IHRoZSB4X2NvbWRhdCBmaWVsZCBpbiB0aGUgYXV4CisJZW50cnkgYmFzZWQgb24gdGhlIGxpbmtvbmNlIGZpZWxkIGluIHNlZ21lbnRfaW5mby4KKwkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAubGlua29uY2UuCisKK0ZyaSBNYXIgMjkgMTE6MzE6MjcgMTk5NiAgSi5ULiBDb25rbGluICAoanRjQGxpc2EuY3lnbnVzLmNvbSkKKworCSogZG9jL2FzLjE6IENoYW5nZWQgdG8gYmUgcmVjb2duaXplZCBieSBjYXRtYW4gLXcgb24gU29sYXJpcy4KKworVGh1IE1hciAyOCAxNToyNzo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogQ2FsbCB0aGUgbGlzdGluZyBmdW5jdGlvbnMgYmVmb3JlCisJZG9pbmcgdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NpbmcsIHdoaWNoIG1heSBpbnZvbHZlIGZyZWVpbmcgdGhlCisJc3RyaW5nLiAgUGFzcyBzdHJpbmcsIG5vdCBzdHJpbmcgKyBzdHJvZmYsIHRvIE9CSl9QUk9DRVNTX1NUQUIgaW4KKwlTRVBBUkFURV9TVEFCX1NFQ1RJT05TIGNhc2UuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IFJlbW92ZSBuZXN0ZWQgY29tbWVudC4KKwkodGNfZ2VuX3JlbG9jKTogTW92ZSBsYWJlbCBkb25lIGluc2lkZSB0aGUgaWZkZWYgaW4gd2hpY2ggaXQgaXMKKwl1c2VkLgorCShtZF9hcHBseV9maXgpOiBQYXNzIHBvaW50ZXJzIHRvIGNvcnJlY3QgdHlwZXMgdG8gbGliaHBwYS5oCisJZnVuY3Rpb25zLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgorCisJKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGUpOiBEZWZpbmUuCisJKG1pcHNfZnJvYl9maWxlKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1taXBzLmMgKHN0cnVjdCBtaXBzX2hpX2ZpeHVwKTogRGVmaW5lLgorCShtaXBzX2hpX2ZpeHVwX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShpbW1fdW5tYXRjaGVkX2hpKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobWRfYXNzZW1ibGUpOiBDbGVhciBpbW1fcmVsb2MsIGltbV91bm1hdGNoZWRfaGksIGFuZAorCW9mZnNldF9yZWxvYy4gIFBhc3MgaW1tX3VubWF0Y2hlZF9oaSB0byBhcHBlbmRfaW5zbi4KKwkoYXBwZW5kX2luc24pOiBBZGQgdW5tYXRjaGVkX2hpIHBhcmFtZXRlci4gIElmIGl0IGlzIHNldCwgYWRkIHRoZQorCW5ldyBmaXh1cCB0byBtaXBzX2hpX2ZpeHVwX2xpc3QuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKG1pcHNfaXApOiBTZXQgaW1tX3VubWF0Y2hlZF9oaSB3aGVuIGFwcHJvcHJpYXRlLgorCShtaXBzX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KKworVGh1IE1hciAyOCAxMTo0Nzo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjLSotc29sYXJpczIqKTogUmVuYW1lZCBmcm9tIHNwYXJjKi0qLXNvbGFyaXMyKi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1R1ZSBNYXIgMjYgMTg6MTk6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhcy5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZS4KKworRnJpIE1hciAyMiAxMToxMzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFzLmggKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCisJKiBzdGFicy5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oCisJKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCisJKHNfc3RhYl9nZW5lcmljKTogTGlrZXdpc2UuCisJKiBhcy5jIChwYXJzZV9hcmdzKTogTGlrZXdpc2UuCisJKiByZWFkLmMgKHNfbXJpX3NlY3QpOiBMaWtld2lzZS4KKworCSogZ2FzcC5jIChjaGFuZ2VfYmFzZSk6IFJlY29nbml6ZSBcKC4uLikgY29uc3RydWN0IGRvY3VtZW50ZWQgdG8KKwlwYXNzIHRocm91Z2ggZW5jbG9zZWQgY2hhcmFjdGVycyBsaXRlcmFsbHkgdGhyb3VnaCB0byB0aGUgb3V0cHV0LgorCShwcm9jZXNzX2Fzc2lnbnMpOiBMaWtld2lzZS4gIEFsc28sIGJlIG1vcmUgY2FyZWZ1bCB0byBhdm9pZAorCWxvb2tpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisKK1RodSBNYXIgMjEgMTM6MTg6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTM4Ni5jIChtZF9wYXJzZV9vcHRpb24pOiBJZiBPQkpfRUxGLCBpZ25vcmUgLWsgZm9yCisJRnJlZUJTRCBjb21wYXRpYmlsaXR5LiAgRnJvbSBKb2huIFBvbHN0cmEgPGpkcEBwb2xzdHJhLmNvbT4uCisKK1dlZCBNYXIgMjAgMTg6MTM6MzIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYy1pOTYwLnRleGk6IEZpeCB0eXBvcy4KKworV2VkIE1hciAyMCAxNzowNToxNiAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgorCisJKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IEFkZGVkIGN2dHN0IGluc3RydWN0aW9uLgorCitNb24gTWFyIDE4IDEzOjEyOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IERvbid0IHRyeSB0byBtYWtlIGEgc3ltYm9sIG91dCBvZiB0aGUgc3RhYgorCXN0cmluZy4gIEV4dHJhY3QgdGhlIGFkZGVuZCBmcm9tIHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbi4KKworRnJpIE1hciAxNSAxNzoxMDo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IElmIHdoaXRlc3BhY2UgaXMgc2VlbiBpbiBzdGF0ZSAxMSwgYW5kCisJTEFCRUxTX1dJVEhPVVRfQ09MT05TIGlzIG5vdCBkZWZpbmVkLCBhbmQgd2UgYXJlIG5vdCBpbiBtNjhrIE1SSQorCW1vZGUsIGNoYW5nZSB0aGUgc3RhdGUgdG8gMyByYXRoZXIgdGhhbiAxLgorCitUaHUgTWFyIDE0IDE4OjE4OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmggKENfUkVHSVNURVJfU0VDVElPTik6IENoYW5nZSBmcm9tIDIwIHRvIDUwLCB0bworCWNvcnJlc3BvbmQgdG8gMTEgTWFyY2ggY2hhbmdlLgorCitUaHUgTWFyIDE0IDE1OjI3OjEwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWg4MzAwLmMgKGJ1aWxkX2J5dGVzLCBNRU1JTkQgY2FzZSk6IEdlbmVyYXRlCisJYW4gUl9NRU1fSU5ESVJFQ1QgcmVsb2MgcmF0aGVyIHRoYW4gUl9SRUxCWVRFLgorCitUdWUgTWFyIDEyIDEyOjIxOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgorCitNb24gTWFyIDExIDE4OjU3OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBJbXByb3ZlIGhhbmRsaW5nIG9mCisJWF9QUkVDSVNJT04gbnVtYmVycy4gIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBBbmRyZWFzIFNjaHdhYgorCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+LgorCitNb24gTWFyIDExIDA5OjU5OjUzIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGFzLmggKFNFR19OT1JNQUwsIFNFR19MSVNUKTogQnVtcCBzZWdtZW50IGxpbWl0IGZyb20gMTAgdG8gNDAuCisJKFNFR19MQVNUKTogTmV3LgorCSogc3Vic2Vncy5jIChNQU5ZX1NFR01FTlRTKTogSW5jcmVhc2Ugc2VnbWVudCBsaW1pdC4KKwkqIG9iai1jb2ZmLmMgKHNlZ19OX1RZUEUsIHNlZ19pbmZvX29mZl9ieV80KTogTGlrZXdpc2UuCisJKGRvX3JlbG9jc19mb3IsIHdfc3ltYm9scywgb2JqX2NvZmZfYWRkX3NlZ21lbnQsIGRvX2xpbmVub3NfZm9yLAorCWNyYXdsX3N5bWJvbHMsIGNvZmZfaGVhZGVyX2FwcGVuZCk6IExvb3AgdG8gU0VHX0xBU1QgcmF0aGVyIHRoYW4KKwlTRUdfRTkuCisJCitUaHUgTWFyICA3IDE1OjE3OjM5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBIYW5kbGUgb3BlcmFuZCBjaGFyICdPJyAobmVnIHJlZykuCisKK1RodSBNYXIgIDcgMDk6MTk6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvdGMtaHBwYS5jIChTVUJTRUdfTUlMTEkpOiBEZWZpbmUuCisJKHBhX2RlZl9zdWJzcGFjZXMpOiBBZGQgJE1JTExJQ09ERSQuCisJKHBhX3NwYWNlc19iZWdpbik6IFNldCBzZWN0aW9uIGZsYWdzIGZvciAkTUlMTElDT0RFJC4KKworV2VkIE1hciAgNiAxNDoxMTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IE9ubHkgU0VDX0xPQUQgaWYgdGhlIHR5cGUgaXMKKwlub3QgU0hUX05PQklUUy4gIERvbid0IHRhbXBlciB3aXRoIGZsYWdzIGJhc2VkIG9uIHR5cGUgaWYgYQorCXNwZWNpYWwgc2VjdGlvbiB3YXMgZm91bmQgKHJldmVydCBGZWIgMjkgY2hhbmdlKS4KKworCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogT25seSBhbGlnbiB1c2luZyB0aGUgbm9wIHBhdHRlcm4KKwlpZiBhbGlnbmluZyB0byBhIGxvbmd3b3JkIGJvdW5kYXJ5IG9yIGdyZWF0ZXIuCisKK1R1ZSBNYXIgIDUgMTU6MTA6NDMgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBQYXNzIDEgbm90IDIgdG8gZnJhZ19hbGlnbi4KKworTW9uIE1hciAgNCAyMDo1MDo1NyAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1jeWd3aW4zMik6IERvbid0IHVzZSBiZmRfZ2FzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworTW9uIE1hciAgNCAxMDoxMzowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90Yy1ocHBhLmM6IEFkZCBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBSX04wU0VMIGFuZAorCVJfTjFTRUwgc2luY2UgdGhleSdyZSBub3QgZGVmaW5lZCBmb3Igb2xkIHZlcnNpb25zIG9mIGhwdXguCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCB0eXBvIGluIFJfQ09NUDIgY29kZS4KKwlTZXQgInN5bV9wdHJfcHRyIiBhbmQgImFkZGVuZCIgZmllbGRzIHRvIGR1bW15IHZhbHVlcyBmb3IKKwlSX04wU0VMIGFuZCBSX04xU0VMLgorCitGcmkgTWFyICAxIDEwOjIwOjUyIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBmbG9udW0ta29uc3QuYzogQWRkIHR3byBtb3JlIGNvbnN0YW50cyBmb3IgMWUrLTIwNDggYW5kCisJMWUrLTQwOTYsIGFuZCBjb3JyZWN0IHRoZSBvdGhlciBjb25zdGFudHMuCisKKwkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgT19sb2dpY2FsX25vdC4KKworVGh1IEZlYiAyOSAxMzo1ODozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IEFsbG93IHByZWRlZmluZWQgc2VjdGlvbgorCXR5cGVzIHRvIHNldCB0aGUgbm9iaXRzIHR5cGUuICBBdm9pZCBhIHNoYWRvd2VkIGRlY2xhcmF0aW9uLgorCitXZWQgRmViIDI4IDE1OjM4OjU2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZvciBTT00sIGRvbid0CisJcmVkdWNlIHJlbG9jcyB1c2luZyBlX25scnNlbCBmaWVsZCBzZWxlY3RvcnMuCisKKwkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogRG9uJ3QgdXNlICNlbGlmLiAgU29tZSBjb21waWxlcnMKKwlkb24ndCBoYW5kbGUgaXQuCisKKwkqIGNvbmZpZy90Yy1ocHBhLmMgKHNlbGVjdG9yX3RhYmxlKTogQWRkICJuIiwgIm5sIiwgYW5kICJubHIiIHRvCisJdGhlIHNlbGVjdG9yIHRhYmxlLgorCShwYV9jaGtfZmllbGRfc2VsZWN0b3IpOiBIYW5kbGUgbmV3IGZpZWxkIHNlbGVjdG9ycyBmb3IgU09NLgorCitUdWUgRmViIDI3IDE0OjQyOjI3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWd1cmUuaW4gKG02OGstKi1saW51eCphb3V0KiwgbTY4ay0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlnL3RlLWxpbnV4LmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpIFtURV9MSU5VWF06IERlZmluZSB0bworCSJhLm91dC1tNjhrLWxpbnV4Ii4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBEb24ndCBpbmNsdWRlICcjJyBpZiBURV9MSU5VWAorCWlzIGRlZmluZWQuCisKK01vbiBGZWIgMjYgMTg6NTg6NTggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSB0byBoYW5kbGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KKworTW9uIEZlYiAyNiAxMDozNDoxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUHJpbnQgYWxsIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0CisJdGhlIGluc24gb24gbWlzbWF0Y2guCisKK0ZyaSBGZWIgMjMgMjE6NDQ6MzkgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgYTI5LWNvZmYuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBGZWIgMjIgMTY6Mzk6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAoc2hfY29mZl9mcm9iX2ZpbGUpOiBEb24ndCBjb25zaWRlciB0aGUgYWRkcmVzcworCW9mIHRoZSBzZWN0aW9uIHdoZW4gbG9va2luZyBmb3IgdGhlIFJfU0hfVVNFUyBmaXh1cCwgYmVjYXVzZSB0aGUKKwlmcmFnIGFkZHJlc3NlcyBoYXZlIG5vdCB5ZXQgYmVlbiBhZGp1c3RlZC4KKworCSogZ2RiaW5pdC5pbjogU2V0IGEgYnJlYWtwb2ludCBvbiBhc193YXJuX3doZXJlLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEFkZCBtaXNzaW5nIGFyZ3VtZW50cyB0byBtYWNyb19idWlsZAorCW9taXR0ZWQgaW4gbGFzdCBjaGFuZ2UuICBGcm9tIEppbSBXaWxzb24gPHdpbHNvbkBjeWdudXMuY29tPi4KKworV2VkIEZlYiAyMSAxNzowMDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1oODMwMC5jICh0Y19yZWxvY19tYW5nbGUpOiBDaGFuZ2UgcmVsb2MgYmFzZWQgb24gc2l6ZQorCWlmIGl0IGlzIFRDX0NPTlNfUkVMT0MuICBTZXQgYSBzaXplIG9mIDQgdG8gUl9SRUxMT05HLgorCitXZWQgRmViIDIxIDA5OjI1OjM5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZWNvZ25pemUgJWFzcjAgZm9yIHY4LgorCitUdWUgRmViIDIwIDIxOjQ4OjAzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc3BhcmMuYyAocGFyc2Vfa2V5d29yZF9hcmcpOiBBY2NlcHQgbGVhZGluZyAnJScuCisJKHNwYXJjX2lwKTogQWNjZXB0ICVhc3JbMS4uMzFdIGZvciB2OCBhbmQgJWFzclslMTYuLjMxXSBmb3IgdjkuCisJUmVjb2duaXplIFt1VV0gZm9ybWF0IGFyZ3MgYXMgc3BhcmNsZXQgY3ByZWdzLgorCitUdWUgRmViIDIwIDIyOjI1OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKHNoX2hhbmRsZV9hbGlnbik6IERvbid0IGVtaXQgUl9TSF9BTElHTiByZWxvY3MKKwlpbiBic3Nfc2VjdGlvbi4KKworTW9uIEZlYiAxOSAxNDoxNjoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBDaGVjayBTX0lTX1dFQUsgYXMKKwl3ZWxsIGFzIFNfSVNfRVhURVJOQUwuCisJKHRjX2ZpeF9hZGp1c3RhYmxlKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSW4gT0JKX0VMRiBjYXNlLCBjaGVjayBmb3IKKwlTX0lTX1dFQUsgYXMgd2VsbCBhcyBTX0lTX0VYVEVSTkFMIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byByZXR1cm4KKwllYXJseS4KKwkodGNfZ2VuX3JlbG9jKTogQ2hlY2sgU19JU19XRUFLIGFzIHdlbCBhcyBTX0lTX0VYVEVSTkFMIHdoZW4KKwlkZWNpZGluZyB3aGV0aGVyIHRvIGNvbnZlcnQgQkZEX1JFTE9DXzMyX1BDUkVMX1MyIGlmIFBJQy4KKworTW9uIEZlYiAxOSAwMjoxNTo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKG1heF9hcmNoaXRlY3R1cmUpOiBDaGFuZ2UgdG8gc3BhcmNsaXRlIGZvcgorCTMyIGJpdCBhcmNoLgorCShkZWZhdWx0X2NvbXBhdGlibGUpOiBEZWxldGUuCisJKHNwYXJjX2Zmcyk6IE5ldyBmdW5jdGlvbi4KKwkobWRfYmVnaW4pOiBPbmx5IGNhbGwgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1Agb25jZS4KKwkoc3BhcmNfaXApOiBSZXdyaXRlIGFyY2hpdGVjdHVyZSBtYXRjaCBhbmQgYnVtcCBsb2dpYy4KKworU3VuIEZlYiAxOCAxNTowMzo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCisgCXRyeWluZyB0byB1c2UgLXJwYXRoLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgRmViIDE2IDE2OjUzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1jb2ZmLmggKFNGX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCisJKFNGX0dFVF9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgorCShTRl9TRVRfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IFNldCBBREpfTE5OT1BUUiB3aGVuIExOTk9QVFIKKwlpcyBzZXQuCisJKHdfc3ltYm9scyk6IElmIEFESl9MTk5PUFRSIGlzIHNldCwgYWRkIHRoZSBzZWN0aW9uIGxubm9wdHIgZmllbGQKKwl0byB0aGUgc3ltYm9sIGxubm9wdHIgZmllbGQsIHRvIGdldCB0aGUgY29ycmVjdCBmaWxlIG9mZnNldC4KKworVGh1IEZlYiAxNSAxNDo0ODozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IE9uIHRoZSBQb3dlclBDLCBmb3JjZSBhbGwKKwlzeW1ib2xzIHRoYXQgYXJlIG5vdCBmdW5jdGlvbiwgZmlsZSwgb3Igc2VjdGlvbiBzeW1ib2xzIHRvIGJlCisJb2JqZWN0IHR5cGVzLgorCitUaHUgRmViIDE1IDExOjIwOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBTZXQgYW5kIHN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKFJQQVRIX0VOVlZBUik6IE5ldyB2YXJpYWJsZS4KKwkoY2hlY2spOiBVc2UgJChSUEFUSF9FTlZWQVIpIHJhdGhlciB0aGFuIExEX0xJQlJBUllfUEFUSC4KKworCSogY29uZmlndXJlLmluOiBBY2NlcHQgaTY4Ni4gIEZyb20gSC5KLiBMdSA8aGpsQHpvb20uY29tPjogaTM4NgorCWRvZXNuJ3QgbmVlZCBvcGNvZGVzLiAgSWYgY29uZmlndXJpbmcgc2hhcmVkLCBvcGNvZGVzIG5lZWRzIGJmZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIEZlYiAxNCAxNjozMzoxMiAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgorCisJKiByZWFkLmMgKHNfbXJpX3NlY3QpOiBEb24ndCByZXR1cm4gJ1wwJyBpbiB0eXBlLiAgU2V0IGFsbAorCWFwcHJvcHJpYXRlIGZsYWdzIGluIEJGRCBzZWN0aW9uLgorCisJKiBjb25maWd1cmUuaW4gKG02OGstKi1wc29zKik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWcvdGUtcHNvcy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmMgKGNvbW1lbnRfY2hhcnMpOiBEb24ndCBpbmNsdWRlICcjJyBpZiBURV9QU09TCisJaXMgZGVmaW5lZC4KKworV2VkIEZlYiAxNCAxMzo0MzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGR1cGxpY2F0ZSBzZXR0aW5nIG9mIGNwdV90eXBlLiAgQ2hlY2sKKwl3aGV0aGVyIG9wY29kZXMgbGlicmFyeSBpcyByZXF1aXJlZCBmb3Igb24gYWxsIHRhcmdldHMsIG5vdCBqdXN0CisJcHJpbWFyeSBvbmUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfYmlnX2dvdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHNfZXh0ZXJuKTogRG9uJ3QgZGVjbGFyZS4KKwkocmVnX25lZWRzX2RlbGF5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobWFjcm9fYnVpbGQpOiBQZXJtaXQgR09UL0NBTExfSEkvTE8gcmVsb2NzLgorCShtYWNyb19idWlsZF9sdWkpOiBJZiBwbGFjZSBpcyBub3QgTlVMTCwgdXNlIHRoZSBudW1iZXIgaW4gdGhlCisJZXhwcmVzc2lvbi4KKwkobG9hZF9hZGRyZXNzKTogSGFuZGxlIG1pcHNfYmlnX2dvdCBjYXNlLgorCShtYWNybyk6IEhhbmRsZSBtaXBzX2JpZ19nb3QgZm9yIE1fTEFfQUIsIE1fSkFMX0EsIGFuZCBsb2FkIGFuZAorCXN0b3JlIG1hY3Jvcy4KKwkoT1BUSU9OX1hHT1QpOiBEZWZpbmUuCisJKG1kX2xvbmdvcHRzKTogQWRkICJ4Z290IiBpZiBPQkpfRUxGLgorCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLXhnb3QuCisJKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC14Z290LgorCShtZF9hcHBseV9maXgpOiBQZXJtaXQgR09UL0NBTExfSEkvTE8gcmVsb2NzLgorCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgR09UL0NBTExfSEkvTE8gcmVsb2NzLgorCitXZWQgRmViIDE0IDExOjIyOjI3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKSBbb3BlcmFuZCBraW5kICcjJ106IFdoZW4gZml4aW5nCisJdGhlIGJ5dGUgcmVsb2NhdGlvbiwgcG9pbnQgaXQgdG8gdGhlIGxvdyBieXRlIG9mIHRoZSB3b3JkLgorCitUdWUgRmViIDEzIDE1OjMxOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTZXQgSERMRkxBR1MgZm9yICotKi1ocHV4IHdpdGggLS1lbmFibGUtc2hhcmVkLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitNb24gRmViIDEyIDE1OjUzOjQ2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhbnkgc3BhcmMqIGNwdS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK01vbiBGZWIgMTIgMTU6NDE6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgIm1yaSIgYW5kICIubXJpIi4KKwkoc19tcmkpOiBOZXcgZnVuY3Rpb24uCisJKiByZWFkLmggKHNfbXJpKTogRGVjbGFyZS4KKwkqIGFwcC5jIChzY3J1Yl9tNjhrX21yaSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKG1yaV9wc2V1ZG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShkb19zY3J1Yl9iZWdpbik6IEFkZCBtNjhrX21yaSBwYXJhbWV0ZXIuICBVc2UgaXQgcmF0aGVyIHRoYW4KKwlmbGFnX202OGtfbXJpLiAgSW5pdGlhbGl6ZSBzY3J1Yl9tNjhrX21yaS4KKwkobXJpX3N0YXRlLCBtcmlfbGFzdF9jaCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgorCShzdHJ1Y3QgYXBwX3NhdmUpOiBBZGQgc2NydWJfbTY4a19tcmksIG1yaV9zdGF0ZSwgYW5kIG1yaV9sYXN0X2NoCisJZmllbGRzLgorCShhcHBfcHVzaCk6IFNhdmUgbmV3IGZpZWxkcy4KKwkoYXBwX3BvcCk6IFJlc3RvcmUgbmV3IGZpZWxkcy4KKwkoZG9fc2NydWJfY2hhcnMpOiBDaGVjayBzY3J1Yl9tNjhrX21yaSByYXRoZXIgdGhhbiBmbGFnX21yaV9tcmkuCisJSWYgVENfTTY4SywgdXNlIGEgdHJpdmlhbCBzdGF0ZSBtYWNoaW5lIHRvIGxvb2sgZm9yIG9jY3VycmVuY2VzIG9mCisJdGhlIC5tcmkgcHNldWRvLW9wLCBhbmQgY2hhbmdlIHRoZSBtb2RlIGFwcHJvcHJpYXRlbHkuCisJKiBhcy5oIChkb19zY3J1Yl9iZWdpbik6IFVwZGF0ZSBwcm90b3R5cGUuCisJKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9iZWdpbik6IFBhc3MgZmxhZ19tNjhrX21yaSB0bworCWRvX3NjcnViX2JlZ2luLgorCSogY29uZmlnL3RjLW02OGsuYyAocmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuKTogTmV3IHN0YXRpYworCXZhcmlhYmxlLgorCShtNjhrX21yaV9tb2RlX2NoYW5nZSk6IE5ldyBmdW5jdGlvbi4KKwkobWRfcGFyc2Vfb3B0aW9uKTogU2V0IHJlZ19wcmVmaXhfb3B0aW9uYWxfc2Vlbi4KKwkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfbXJpX21vZGVfY2hhbmdlKTogRGVjbGFyZS4KKwkoTVJJX01PREVfQ0hBTkdFKTogRGVmaW5lLgorCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5tcmkgcHNldWRvLW9wLgorCisJKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgdHJlYXQgJyMnIGFzIGEKKwljb21tZW50IGNoYXJhY3Rlci4KKworTW9uIEZlYiAxMiAxNToxNjoyOSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCVN1cHBvcnQgZm9yIE9CSl9FTEYgb24gbTY4aywgbW9zdGx5IGluc2lkZSAjaWZkZWYgT0JKX0VMRjoKKwkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKGVudW0gcGljX3JlbG9jYXRpb24pOiBEZWZpbmUuCisJKHN0cnVjdCBtNjhrX2V4cCk6IEFkZCBwaWNfcmVsb2MgZmllbGQuCisJKiBjb25maWcvdGMtbTY4ay5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUuCisJKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lIHRvIGNhbGwgdGNfbTY4a19maXhfYWRqdXN0YWJsZS4KKwkoTk9fUkVMT0MpOiBEZWZpbmUgdG8gQkZEX1JFTE9DX05PTkUgaWYgQkZEX0FTU0VNQkxFUiwgdG8gemVybworCW90aGVyd2lzZS4KKwkqIGNvbmZpZy90Yy1tNjhrLmM6IERlbGV0ZSBkZWZpbml0aW9uIG9mIE5PX1JFTE9DLgorIAkoc3RydWN0IG02OGtfaXQpOiBBZGQgcGljX3JlbG9jIGZpZWxkLgorCShhZGRfZml4KTogQ29weSBvdmVyIHBpY19yZWxvYyBmaWVsZC4KKwkobWRfcHNldWRvX3RhYmxlKTogSW50ZXJwcmV0IC5hbGlnbiBwYXJhbWV0ZXIgYXMgYnl0ZSBjb3VudC4KKwkobW90ZV9wc2V1ZG9fdGFibGUpOiBMaWtld2lzZS4KKwkodGNfbTY4a19maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2V0X3JlbG9jX2NvZGUpOiBOZXcgZnVuY3Rpb24uCisJKG1kX2Fzc2VtYmxlKTogVXNlIGl0IGFzIGxhc3QgYXJndW1lbnQgdG8gZml4X25ld19leHAuCisJKG1kX2FwcGx5X2ZpeF8yKTogRm9yIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc3ltYm9sIGRvbid0IHB1dCB0aGUKKwlhZGRlbmQgaW50byB0aGUgZGF0YS4KKwkodGNfZ2VuX3JlbG9jKTogRGlmZmVyZW50IGFkZGVuZCBjb21wdXRhdGlvbiBmb3IgT0JKX0VMRi4KKwkobTY4a19pcCk6IERvbid0IHJlbGF4IGFuIG9wZXJhbmQgdGhhdCByZXF1aXJlcyBwaWMgcmVsb2NhdGlvbi4KKwkobWRfYmVnaW4pOiBBbGlnbiAudGV4dCwgLmRhdGEgYW5kIC5ic3Mgb24gNCBieXRlIGJvdW5kYXJ5IGJ5CisJZGVmYXVsdC4KKwkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgorIAlUQ19NNjhLIGFuZCBPQkpfRUxGLgorCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBIYW5kbGUgQFBMVFBDLCBldGMuCisJKG1vdG9yb2xhX29wZXJhbmQpOiBBZGQgcnVsZSBmb3IgYCh6YXBjLCBFWFBSKScuCisKK01vbiBGZWIgMTIgMTA6MDc6MzMgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KKworCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQpOiBGaXhlZCBzbyB0aGF0IHdoaXRlc3BhY2UKKwkqcmVhbGx5KiBpcyBwZXJtaXNzaWJsZSBiZWZvcmUgdGhlIGNvbW1hLgorCitNb24gRmViIDEyIDAwOjEyOjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogQWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnkgYmVmb3JlCisJaW5zZXJ0aW5nIG5vcCBpbnN0cnVjdGlvbnMuCisKK0ZyaSBGZWIgIDkgMTA6NTQ6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGUtYXV4Lmg6IENoYW5nZSBpbmNsdWRlIG9mIGF1eC5oIHRvIGF1eC1jb2ZmLmguCisKK1RodSBGZWIgIDggMjA6MDI6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtaTk2MC5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBDb3JyZWN0IHN0b3JhZ2UKKwljbGFzcyBzZXR0aW5nIGZvciBhIENBTExOQU1FIHN5bWJvbCBpbiBDT0ZGLgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBQYXNzIG5lZ2F0aXZlIG51bWJlcnMgZm9yIG5ldyAuYmFsaWduW3dsXSBhbmQKKwkucDJhbGlnblt3bF0gcHNldWRvLW9wcy4KKwkoc19hbGlnbl9ieXRlcyk6IFRyZWF0IGEgbmVnYXRpdmUgYXJndW1lbnQgYXMgc3BlY2lmeWluZyB0aGUgZmlsbAorCWxlbmd0aC4KKwkoc19hbGlnbl9wdHdvKTogTGlrZXdpc2UuCisKK1dlZCBGZWIgIDcgMTQ6MTI6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgYmFsaWdudywgYmFsaWdubCwgcDJhbGlnbncsIGFuZCBwMmFsaWdubC4KKwkoZG9fYWxpZ24pOiBUYWtlIG5ldyBsZW4gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgUGFzcyBpdAorCXRvIG1kX2RvX2FsaWduLgorCShzX2FsaWduX2J5dGVzKTogQXJnIG5vdyBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsbCBwYXR0ZXJuLgorCShzX2FsaWduX3B0d28pOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFBhc3MgbGVuZ3RoIHRvCisJbWRfZG9fYWxpZ24uCisJKiBjb25maWcvdGMtaTM4Ni5oIChtZF9kb19hbGlnbik6IFRha2UgbmV3IGxlbiBwYXJhbWV0ZXIuCisJKiBjb25maWcvdGMtbTg4ay5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IExpa2V3aXNlLgorCSogY29uZmlnL3RjLXNoLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCisJKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KKwkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgcHNldWRvLW9wcy4KKworCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX21kZXBzKTogRGl2aWRlIG9mZnNldCBieSBmcl92YXIsIGFzIGlzCisJZG9uZSBpbiBjdnRfZnJhZ190b19maWxsLgorCisJKiBjb25maWcvdGMtc2guaCAoc2hfZG9fYWxpZ24pOiBEZWNsYXJlLgorCShtZF9kb19hbGlnbik6IERlZmluZS4KKwkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IE5ldyBmdW5jdGlvbi4KKworCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfbGluZW5vKTogRG9uJ3QgdHJ5IHRvIHN0b3JlIHRoZSBhZGRyZXNzCisJZGlmZmVyZW5jZSBpZiB0aGUgbmV4dCBhZGRyZXNzIGlzIGJlZm9yZSB0aGUgY3VycmVudCBvbmUuCisKKwkqIGNvbmZpZy90Yy1tNjhrLmMgKHN0cnVjdCBtNjhrX2NwdSk6IEFkZCBhbGlhcyBmaWVsZC4KKwkoYXJjaHMpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KKwkobTY4a19pcCk6IERvbid0IGxpc3QgYWxpYXMgbmFtZXMgd2hlbiBsaXN0aW5nIENQVXMgd2hpY2ggc3VwcG9ydAorCWFuIGluc3RydWN0aW9uLgorCisJKiBhcy5jIChtYWluKTogQ2FsbCBwYXJzZV9hcmdzIGJlZm9yZSByZWFkX2JlZ2luLgorCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgZmxhZ19tNjhrX21yaSwgZG9uJ3QgcHV0IGEgZG90IGluCisJZnJvbnQgb2YgZ2VuZXJhdGVkIHBzZXVkby1vcHMuCisJKiByZWFkLmMgKHBvdGFibGUpOiBJZ25vcmUgIm5hbWUiLgorCShzX2FwcF9maWxlKTogUGVybWl0IGEgc2luZ2xlIHF1b3RlIGFmdGVyIHRoZSBzdHJpbmcsIHNpbmNlIG9uZQorCW1heSBhcHBlYXIgaW4gbTY4ayBNUkkgbW9kZS4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgSWYgbGlua2luZyBhZ2FpbnN0CisJc2hhcmVkIEJGRCBhbmQgb3Bjb2RlcywgZml4IGxpYnJhcnkgbmFtZSBvbiBTdW5PUywgYW5kIHRyeSB0byBzZXQKKwktcnBhdGggcmVhc29uYWJseS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIEZlYiAgNiAxNToxNjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFzLmggKGZsYWdfbTY4a19tcmkpOiBEZWNsYXJlLgorCSogYXMuYyAocGFyc2VfYXJncyk6IElmIFRDX002OEssIHNldCBmbGFnX202OGtfbXJpIGZvciAtTS4KKwkqIE1hbnkgZmlsZXM6IEZvciBNUkkgc3ludGF4IHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIG02OGsgTVJJCisJYXNzZW1ibGVyLCBjaGVjayBmbGFnX202OGtfbXJpIHJhdGhlciB0aGFuIGZsYWdfbXJpIG9yCisJTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVC4KKworTW9uIEZlYiAgNSAxNjoyOToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1pOTYwLmMgKEFSQ0hfSFgpOiBEZWZpbmUuCisJKGFyY2hfdGFiKTogQWRkIEhYLgorCSh0YXJnX2hhc19zZnIpOiBIYW5kbGUgQVJDSF9IWC4KKwkodGFyZ19oYXNfaWNsYXNzKTogSGFuZGxlIEFSQ0hfSFguCisJKHRjX2NvZmZfZml4MnJ0eXBlKTogQWRkIHJldHVybiAwIHRvIGF2b2lkIHdhcm5pbmcuCisJKHRjX2hlYWRlcnNfaG9vayk6IElmIHRoZSBhcmNoaXRlY3R1cmUgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5LAorCXVzZSBpdCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLiAgU2V0IHRoZSBleHRlcm4gdmFyaWFibGUgY29mZl9mbGFncworCXJhdGhlciB0aGFuIGhlYWRlcnMtPmZpbGVoZHIuZl9mbGFncywgc2luY2UgdGhlIGxhdHRlciBpcyBzZXQKKwl1bmNvbmRpdGlvbmFsbHkgaW4gb2JqLWNvZmYuYy4KKwkoaTk2MF9oYW5kbGVfYWxpZ24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGZpeHAuCisKKwlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KKwlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgorCSogY29uZmlndXJlLmluOiBTZXQgT1BDT0RFUyBhbmQgQkZEIHRvIHNlYXJjaCBkaXJlY3Rvcmllcy4KKwlTdWJzdGl0dXRlIE9QQ09ERVNfREVQIGFuZCBCRkRERVAuICBPbiBTdW5PUywgc2V0IEhMREZMQUdTLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKExERkxBR1MsIEhMREZMQUdTKTogTmV3IHZhcmlhYmxlcy4KKwkoTElCREVQUyk6IE5ldyB2YXJpYWJsZS4KKwkoYXMubmV3MDogRGVwZW5kIHVwb24gJChMSUJERVBTKSByYXRoZXIgdGhhbiAkKExJQlMpLiAgVXNlCisJJChITERGTEFHUykgaW4gbGluay4KKwkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KKworRnJpIEZlYiAgMiAxNzo0MTo1MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgorCisJKiBjb25maWcvdGMtcHBjLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTWFrZSAuc2RhdGEyLCAuc2JzczIsCisJLlBQQy5FTUIuc2RhdGEwLCBhbmQgLlBQQy5FTUIuc2JzczAgc2VjdGlvbnMgYWxsIGRlZmF1bHQgdG8KKwlyZWFkLW9ubHksIG5vdCByZWFkL3dyaXRlLgorCitGcmkgRmViICAyIDE0OjA5OjI1IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTExfWEZPUk0pOiBSZW1vdmUgLWUuCisKK0ZyaSBGZWIgIDIgMTI6MzI6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBVc2UgU19JU19ERUZJTkVEIGFuZCBTX0lTX0NPTU1PTiByYXRoZXIKKwl0aGFuIGNvbXBhcmluZyBTX0dFVF9TRUdNRU5UIHRvIHVuZGVmaW5lZF9zZWN0aW9uLgorCSh3cml0ZV9vYmplY3RfZmlsZSk6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KKwl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KKwkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBVc2UgU19JU19ERUZJTkVEIGFuZAorCVNfSVNfQ09NTU9OIHJhdGhlciB0aGFuIGNvbXBhcmluZyBTX0dFVF9TRUdNRU5UIHRvCisJdW5kZWZpbmVkX3NlY3Rpb24uCisJKFNfR0VUX1ZBTFVFKTogTGlrZXdpc2UuICBBdm9pZCByZWN1cnNpb24gcHJvYmxlbXMgaWYgU19JU19ERUZJTkVECisJb3IgU19JU19DT01NT04gY2FsbCBTX0dFVF9WQUxVRS4KKwkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0NPTU1PTik6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KKwkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IElmIGEgcmVsb2MgaXMgZXF1YXRlZAorCXRvIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLCBjb252ZXJ0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0CisJdGhlIHRhcmdldCBzeW1ib2wuCisJKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCisJdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCisJKiBjb25maWcvb2JqLWJvdXQuaCAoU19JU19DT01NT04pOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCisJKiBjb25maWcvb2JqLWJvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBJZiBhIHJlbG9jIGlzIGVxdWF0ZWQKKwl0byBhbiB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbCwgY29udmVydCB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAorCXRoZSB0YXJnZXQgc3ltYm9sLgorCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgorCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgorCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBVc2UgU19JU19ERUZJTkVEIGFuZAorCVNfSVNfQ09NTU9OIHJhdGhlciB0aGFuIGNvbXBhcmluZyBTX0dFVF9TRUdNRU5UIHRvCisJdW5kZWZpbmVkX3NlY3Rpb24uCisJKHlhbmtfc3ltYm9scyk6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIG9yCisJY29tbW9uIHN5bWJvbC4KKworVGh1IEZlYiAgMSAxNTozNDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogQ2hlY2sgZm9yIFwwMDIgYXMgd2VsbCBhcyBcMDAxLgorCSogY29uZmlnL29iai1ib3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KKworCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSBhZGQgbTY4ay1wYXJzZS5vIHRvCisJJHtleHRyYV9vYmplY3RzfSBvbmNlLCBubyBtYXR0ZXIgaG93IG1hbnkgbTY4ayB0YXJnZXRzIGhhdmUgYmVlbgorCWVuYWJsZWQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBKYW4gMzEgMTg6MzE6NDYgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotY3lnd2luMzIsIHBwYy0qLWN5Z3dpbjMyKTogTmV3LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitXZWQgSmFuIDMxIDE0OjAzOjE3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBjb25maWcvdGMtbTY4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImV4dGVuZCIgYW5kICJsZG91YmxlIi4KKwkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLmV4dGVuZCBhbmQgLmxkb3VibGUuCisKKwkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZy90ZS1hdXguaDogTmV3IGZpbGUuCisJKiBjb25maWcvb2JqLWNvZmYuYyAoY29tcGFyZV9leHRlcm5hbF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uCisJaWYgVEVfQVVYLgorCShkb19yZWxvY3NfZm9yKTogU29ydCByZWxvY3MgaWYgVEVfQVVYLgorCShmaXh1cF9zZWdtZW50KTogSWYgVEVfQVVYLCBzdG9yZSBjb21tb24gc3ltYm9sIHZhbHVlIGluIHNlZ21lbnQuCisJKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGlmIFRFX0FVWC4KKworV2VkIEphbiAzMSAxMjoyNDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogQ2hlY2sgZm9yIFwwMDIgYXMgd2VsbCBhcyBcMDAxLgorCisJKiBjb25maWcvdGMtbWlwcy5jIChzX21pcHNfZ2xvYmwpOiBTZXQgQlNGX09CSkVDVCBpZiBpdCBpcyBub3QKKwlCU0ZfRlVOQ1RJT04uCisJKHNfY3Bsb2FkKTogU2V0IEJTRl9PQkpFQ1QgZm9yIF9ncF9kaXNwIHN5bWJvbC4KKwkqIHJlYWQuYyAoc19sY29tbSk6IElmIFNfU0VUX1NJWkUgaXMgZGVmaW5lZCwgc2V0IHRoZSBzaXplIG9mIHRoZQorCXN5bWJvbC4KKwkqIGVjb2ZmLmMgKGFkZF9wcm9jZWR1cmUpOiBTZXQgdGhlIEJTRl9GVU5DVElPTiBmbGFnLgorCShlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgU19TRVRfU0laRSBpcyBkZWZpbmVkLCBzZXQgdGhlIHNpemUgb2YKKwlhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIHN5bWJvbC4KKwkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IElmIFRDX01JUFMsIHNldCBCU0ZfT0JKRUNUCisJZm9yIGFsbCBjb21tb24gc3ltYm9scy4KKworVHVlIEphbiAzMCAxMjozNToyNCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLWk5NjAuYyAocGFyc2VfbWVtb3ApOiBJbiBNUkkgbW9kZSwgZG9uJ3QgdXNlIGltcGxpY2l0CisJc2NhbGluZyBvZiBpbmRleC4KKworCSogZXhwci5jIChvcGVyYW5kKTogQWNjZXB0IDB4IGhleCBjb25zdGFudHMgaW4gTVJJIG1vZGUgaWYgbm90IG9uCisJbTY4ay4KKworTW9uIEphbiAyOSAxMjoyMTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdHlwZSk6IFNldCBCU0ZfT0JKRUNUIGZsYWcgZm9yIGEgdHlwZQorCW9mIG9iamVjdC4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KKworCSogZWNvZmYuYyAobG9jYWxzeW1fdCk6IEFkZCBhZGRlbmQgZmllbGQuCisJKGFkZF9lY29mZl9zeW1ib2wpOiBBZGQgYWRkZW5kIGFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShjb2ZmX3N5bV92YWx1ZSk6IE1ha2Ugc3RhdGljLgorCShjb2ZmX3N5bV9hZGRlbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShlY29mZl9kaXJlY3RpdmVfZGVmKTogSW5pdGlhbGl6ZSBjb2ZmX3N5bV9hZGRlbmQuCisJKGVjb2ZmX2RpcmVjdGl2ZV92YWwpOiBBY2NlcHQgc3ltYm9sICsgY29uc3RhbnQuCisJKGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZik6IFBhc3MgY29mZl9zeW1fYWRkZW5kIHRvIGFkZF9lY29mZl9zeW1ib2wuCisJKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJbmNsdWRlIHRoZSBhZGRlbmQgaW4gdGhlIHN5bWJvbCB2YWx1ZS4KKworRnJpIEphbiAyNiAxOToyODo1MiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IElnbm9yZSBvdmVyZmxvdyBvbiAKKwlCRkRfUkVMT0NfMTZfR09UT0ZGIGFuZCBCRkRfUkVMT0NfUFBDX1RPQzE2LgorCitGcmkgSmFuIDI2IDE2OjE0OjE3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogU0RBMjEgcmVsb2NhdGlvbnMgYXJlIG5vdyA0CisJYnl0ZXMgaW4gc2l6ZSwgc28gb2Zmc2V0IGFwcHJvcHJpYXRlbHkgaW4gYmlnIGVuZGlhbiBtb2RlIHdoZW4KKwl3cml0aW5nIHRoZSBib3R0b20gMiBieXRlcy4KKworVGh1IEphbiAyNSAyMDoyNjoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKGRlZmF1bHRfY29tcGF0aWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCisJKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSBpdC4gIFJld3JpdGUgd2Fybl9vbl9idW1wIGhhbmRsaW5nLgorCShzcGFyY19pcCk6IElmIG5vIGFyY2hpdGVjdHVyZSBvciAtYnVtcCBzcGVjaWZpZWQsIGRvbid0IG1hcmsgYXMKKwltaXNtYXRjaGVkIHRob3NlIGluIGRlZmF1bHRfY29tcGF0aWJsZS4KKworVGh1IEphbiAyNSAxMjoyMTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlTQ08gRUxGIHN1cHBvcnQgZnJvbSBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+OgorCSogY29uZmlndXJlLmluIChpMzg2LSotc2NvKmVsZiopOiBVc2UgZm10IGVsZiwgdGFyZyBzY281LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlnL3NjbzUubXQ6IE5ldyBmaWxlOyBzZXQgVERFRklORVMgdG8gLURTQ09fRUxGLgorCSogY29uZmlnL3RjLWkzODYuYyAoc2NvX2lkKTogTmV3IGZ1bmN0aW9uLCBpZiBTQ09fRUxGLgorCSogY29uZmlnL3RjLWkzODYuaCAodGNfaW5pdF9hZnRlcl9hcmdzKTogRGVmaW5lIGlmIFNDT19FTEYuCisJKHNjb19pZCk6IERlY2xhcmUgaWYgU0NPX0VMRi4KKworVGh1IEphbiAyNSAwMzoxMDo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmMgKGluaXRpYWxfYXJjaGl0ZWN0dXJlLGNhbl9idW1wX3Y5X3ApOiBEZWxldGVkLgorCSh7bWF4LHdhcm5fYWZ0ZXJ9X2FyY2hpdGVjdHVyZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgorCShtZF9iZWdpbik6IFJlcGxhY2UgTlVNT1BDT0RFUyB3aXRoIHNwYXJjX251bV9vcGNvZGVzLgorCUlmIGJvdGggYXJjaGl0ZWN0dXJlIGFuZCAtYnVtcCByZXF1ZXN0ZWQsIHNldCBtYXhfYXJjaGl0ZWN0dXJlIHRvIG1heC4KKwkoc3BhcmNfbWRfZW5kKTogU2ltcGxpZnkuCisJKHNwYXJjX2lwKTogUmVwbGFjZSByZWZlcmVuY2VzIHRvIGNhbl9idW1wX3Y5X3Agd2l0aCBtYXhfYXJjaGl0ZWN0dXJlLgorCVJld3JpdGUgY29kZSB0byBidW1wIGFyY2hpdGVjdHVyZSBhbmQgY2hlY2sgZm9yIGNvbmZsaWN0cy4KKwkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLXhhcmNoPXt2OHBsdXMsdjhwbHVzYX0gZm9yIGNvbXBhdGliaWxpdHkKKwl3aXRoIFNvbGFyaXMgYXNzZW1ibGVyLgorCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4gIENhbGwgc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoLgorCShtZF9zaG93X3VzYWdlKTogVXBkYXRlLgorCitXZWQgSmFuIDI0IDIyOjExOjAzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IEZpeCByZWZlcmVuY2UgdG8gJCR7c3JjZGlyfS4KKworTW9uIEphbiAyMiAwOToyMTozNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgI2lmZGVmIFNQQVJDX0FSQ0g2NCBpbnN0ZWFkIG9mCisJI2lmZGVmIHNwYXJjdjkgd2hlbiBjaG9vc2luZyB2YWx1ZS4KKwkoRU5WNjQpOiBEZWxldGUuCisJKG1kX2VuZCk6IERlZmluZS4KKwkoc3BhcmNfbWRfZW5kKTogRGVjbGFyZS4KKwkqIGNvbmZpZy90Yy1zcGFyYy5jIChTUEFSQ19WOSk6IFJlbmFtZWQgZnJvbSBzcGFyY3Y5LgorCShpbml0aWFsX2FyY2hpdGVjdHVyZSk6IE5ldyBzdGF0aWMgbG9jYWwuCisJKGNhbl9idW1wX3Y5X3ApOiBMaWtld2lzZS4KKwkoTk9fVjkpOiBEZWxldGUgYWxsIG9jY3VycmVuY2VzLgorCShzcGFyY19tZF9lbmQpOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjX2lwKTogTmV3IGxvY2FsIHY5X2FyZ19wLiAgUmV3b3JrIGZwIHJlZyBudW1iZXIgdGVzdC4KKwlEb24ndCBidW1wIGFyY2hpdGVjdHVyZSB0byB2OSB1bmxlc3MgY2FuX2J1bXBfdjlfcCBzZXQuCisJKG1kX3BhcnNlX29wdGlvbik6IC1BPGFyY2g+IHBhc3NlZCwgc2V0IGNhbl9idW1wX3Y5X3AgYWNjb3JkaW5nbHkuCisJKiBjb25maWd1cmUuaW4gKHNwYXJjNjQgdGFyZ2V0IGNwdSk6IERvbid0IHNldCBvYmpfZm9ybWF0IGhlcmUuCisJKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCisJKHNwYXJjNjQtKi1lbGYqKTogRGVmaW5lIFNQQVJDX0FSQ0g2NC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBhY2NvbmZpZy5oIChTUEFSQ19WOSk6IFJlbmFtZWQgZnJvbSBzcGFyY3Y5LgorCShTUEFSQ19BUkNINjQpOiBBZGQuCisJKiBjb25mLmluOiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZy92bXNjb25mLmg6IFVwZGF0ZS4KKworTW9uIEphbiAyMiAxNzoyNDo0NyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBPcHRpbWlzZSAiZGxpIiBsb2Fkcy4KKwkobWRfc2hvd191c2FnZSk6IGFkZCAiLW1jcHU9dnI0MTAwIiB0byBoZWxwIHRleHQuCisKK01vbiBKYW4gMjIgMTE6NTM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgYSBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbgorCXVuZGVmaW5lZCBzeW1ib2wsIHByZXNlcnZlIHRoZSBYX29wIG9mIE9fc3ltYm9sLgorCShTX0dFVF9WQUxVRSk6IEZpeCBjaGVjayB0byBwZXJtaXQgdGhpcyBjYXNlLgorCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSWYgYSByZWxvYyBpcyBhZ2FpbnN0IGFuIHVuZGVmaW5lZAorCXN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sLCBjaGFuZ2UgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKKwl0aGUgbGF0dGVyIHN5bWJvbC4KKwkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2NzZWN0KTogQW4gdW5uYW1lZCBjc2VjdCBpcyBzdG9yYWdlIGNsYXNzCisJWE1DX1BSLgorCitNb24gSmFuIDIyIDEwOjU5OjQ4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1lbGYuYyAoZWxmL3BwYy5oKTogSW5jbHVkZSBlbGYvcHBjLmggaWYgdGFyZ2V0CisJY29tcHV0ZXIgaXMgUG93ZXJQQy4KKworCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogQWRkIG1vcmUgZW1iZWRkZWQgcmVsb2NhdGlvbnMuCisKKwkqIGNvbmZpZy90Yy1wcGMuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgc2VjdGlvbnMKKwltZW50aW9uZWQgaW4gdGhlIGVhYmkuCisKK1RodSBKYW4gMTggMTc6NTg6MTkgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3JlbGRhdGEpOiBDaGFuZ2VkIGFsaWduZW1lbnQgb24gcmVsZGF0YV9zZWN0aW9uCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZGF0YSk6IENoYW5nZWQgdGhlIGFsaWdubWVudCBvbiBwZGF0YV9zZWN0aW9uCisKK01vbiBKYW4gMTUgMTc6NDM6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKG1hcHBpbmcpOiBBZGQgbW9yZSByZWxvY2F0aW9uIHN1ZmZpeGVzLgorCitTdW4gSmFuIDE0IDIxOjI5OjM2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IC5nY2NfZXhjZXB0X3RhYmxlCisJYXMgYSBzZWN0aW9uIGl0IGlzIG9rIHRvIGhhdmUgdW5hZG9ybmVkIC1tcmVsb2NhdGFibGUgcG9pbnRlcnMgaW4uCisKK1NhdCBKYW4gMTMgMTE6MDk6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19zZWN0aW9uKik6IFdyYXAgdGhlc2UgZnVuY3Rpb25zIGluc2lkZQorCSNpZmRlZiBPQkpfRUxGLgorCitGcmkgSmFuIDEyIDE1OjMyOjA3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWRkIGhvb2tzIHNvIG1hY2hpbmUKKwlkZXBlbmRlbnQgc2VjdGlvbiBhdHRyaWJ1dGVzIGNhbiBiZSBoYW5kbGVkLgorCisJKiBjb25maWcvdGMtcHBjLmg6IChtZF9lbGZfc2VjdGlvbl97bGV0dGVyLHR5cGUsd29yZCxmbGFnc30pOiBOZXcKKwltYWNyb3MgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGUgc2VjdGlvbiBmbGFnIGFuZCBvcmRlcmVkIHNlY3Rpb24KKwl0eXBlLgorCisJKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc2VjdGlvbl97bGV0dGVyLHR5cGUsd29yZCxmbGFnc30pOiBOZXcKKwlmdW5jdGlvbnMgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGUgc2VjdGlvbiBmbGFnIGFuZCBvcmRlcmVkCisJc2VjdGlvbiB0eXBlLgorCitGcmkgSmFuIDEyIDEyOjA0OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IERvbid0IHRyeSB0byBsb29rIHVwIHRoZSBzZWN0aW9uCisJc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGhhdmUgYSBzeW1ib2wKKwl3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBzZWN0aW9uLCBidXQgbm8gY29ubmVjdGlvbiB0byBpdC4KKworCSogcmVhZC5jIChjb25zX3dvcmtlcik6IE9ubHkgY2FsbCBtcmlfY29tbWVudF9lbmQgZnJvbSBmbGFnX21yaS4KKwlGcm9tIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPi4KKworCSogZXhwci5jIChvcGVyYW5kKTogU2tpcCB3aGl0ZXNwYWNlIGFmdGVyIGEgY2xvc2UgcGFyZW50aGVzaXMuCisJRnJvbSBKYW1lcyBDYXJsc29uIDxjYXJsc29uQHh5bG9naWNzLmNvbT4uCisKK1R1ZSBKYW4gIDIgMTI6NDM6MjMgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogQ2FsbCBhc19iYWRfd2hlcmUgaW5zdGVhZCBvZgorCWFzX3dhcm5fd2hlcmUgZm9yIHJlbG9jYXRpb24gb3ZlcmZsb3cuCisJKHBhcnNlX3JlZyk6IEFjY2VwdCByZWdpc3RlciBuYW1lIG9ubHkgaWYgbmV4dCBjaGFyYWN0ZXIgaXMKKwlub3QgYWxwaGFudW1lcmljLgorCitGb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTkyOTUKZGlmZiAtLWdpdCBhL2dhcy9NYWtlZmlsZS5hbSBiL2dhcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODhmMjFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTY5NSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgorCisjIyBXb3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZSBidWcuCitJTlRMTElCUyA9IEBJTlRMTElCU0AKKworQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251CisKK1NVQkRJUlMgPSBkb2MgcG8KKwordG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQorCitZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXSA7IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTC4uL2Jpc29uL2Jpc29uIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCitMRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXSA7IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXggOyAgZWxzZSBlY2hvIGZsZXggOyBmaWAKKworREVQID0gJChzcmNkaXIpLy4uL21rZGVwCisKK1RBUkdfQ1BVID0gQHRhcmdldF9jcHVfdHlwZUAKK1RBUkdfQ1BVX0MgPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmMKK1RBUkdfQ1BVX08gPSB0Yy1AdGFyZ2V0X2NwdV90eXBlQC5vCitUQVJHX0NQVV9IID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5oCitPQkpfRk9STUFUX0MgPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuYworT0JKX0ZPUk1BVF9PID0gb2JqLUBvYmpfZm9ybWF0QC5vCitPQkpfRk9STUFUX0ggPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuaAorVEFSR19FTlZfSCA9ICQoc3JjZGlyKS9jb25maWcvdGUtQHRlX2ZpbGVALmgKK0FUT0ZfVEFSR19DID0gJChzcmNkaXIpL2NvbmZpZy9hdG9mLUBhdG9mQC5jCitBVE9GX1RBUkdfTyA9IGF0b2YtQGF0b2ZALm8KKworIyB1c2UgQHRhcmdldF9jcHVfdHlwZUAgZm9yIHJlZmVyaW5nIHRvIGNvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUKK0lUX0hEUlM9aXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAorSVRfU1JDUz1pdGJsLXBhcnNlLmMgaXRibC1sZXguYyAkKHNyY2RpcikvaXRibC1vcHMuYworSVRfREVQUz0kKHNyY2RpcikvaXRibC1wYXJzZS55ICQoc3JjZGlyKS9pdGJsLWxleC5sICQoc3JjZGlyKS9jb25maWcvaXRibC1AdGFyZ2V0X2NwdV90eXBlQC5oCitJVF9PQkpTPWl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KKworIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KKworQ1BVX1RZUEVTID0gXAorCWEyOWsgXAorCWFscGhhIFwKKwlhcmMgXAorCWFybSBcCisJZDEwdiBcCisJZDMwdiBcCisJZnIzMCBcCisJaDgzMDAgXAorCWg4NTAwIFwKKwlocHBhIFwKKwlpMzg2IFwKKwlpODYwIFwKKwlpOTYwIFwKKwltMzJyIFwKKwltNjhrIFwKKwltODhrIFwKKwltY29yZSBcCisJbWlwcyBcCisJbW4xMDIwMCBcCisJbW4xMDMwMCBcCisJbnMzMmsgXAorCXBwYyBcCisJc2ggXAorCXNwYXJjIFwKKwl0YWhvZSBcCisJdGljMzAgXAorCXRpYzgwIFwKKwl2YXggXAorCXc2NSBcCisJdjg1MCBcCisJejhrCisKKyMgT2JqZWN0IGZvcm1hdCB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgorIyBXZSBkZWxpYmVyYXRlbHkgb21pdCBzb20sIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgYXMgYSBjcm9zcyBhc3NlbWJsZXIuCisKK09CSl9GT1JNQVRTID0gXAorCWFvdXQgXAorCWJvdXQgXAorCWNvZmYgXAorCWVjb2ZmIFwKKwllbGYgXAorCWV2YXggXAorCWhwMzAwIFwKKwlpZWVlIFwKKwl2bXMKKworIyBUaGlzIGlzIGFuIHNoIGNhc2Ugd2hpY2ggc2V0cyB2YWxpZCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgQ1BVCisjIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIGMgYW5kIHRoZSBPUyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBvCisjIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGhlbHBzIGN1dHMgZG93biBvbiB0aGUgYW1vdW50IG9mIGRlcGVuZGVuY3kKKyMgaW5mb3JtYXRpb24uCisKK0NQVV9PQkpfVkFMSUQgPSBcCisJdmFsaWQ9IDsgXAorCWNhc2UgJCRvIGluIFwKKwlhb3V0KSBcCisJICBjYXNlICQkYyBpbiBcCisJICBhMjlrIHwgYXJtIHwgaTM4NiB8IGk4NjAgfCBtNjhrIHwgbWlwcyB8IG5zMzJrIHwgc3BhcmMgfCB0YWhvZSB8IHRpYzMwIHwgdmF4KSBcCisJICAgIHZhbGlkPXllcyA7OyBcCisJICBlc2FjIDs7IFwKKwlib3V0KSBcCisJICBjYXNlICQkYyBpbiBcCisJICBpOTYwKSB2YWxpZD15ZXMgOzsgXAorCSAgZXNhYyA7OyBcCisJY29mZikgdmFsaWQ9eWVzIDs7IFwKKwllY29mZikgXAorCSAgY2FzZSAkJGMgaW4gXAorCSAgbWlwcyB8IGFscGhhKSB2YWxpZD15ZXMgOzsgXAorCSAgZXNhYyA7OyBcCisJZWxmKSB2YWxpZD15ZXMgOzsgXAorCWV2YXgpIFwKKwkgIGNhc2UgJCRjIGluIFwKKwkgIGFscGhhKSB2YWxpZD15ZXMgOzsgXAorCSAgZXNhYyA7OyBcCisJaHAzMDApIFwKKwkgIGNhc2UgJCRjIGluIFwKKwkgIG02OGspIHZhbGlkPXllcyA7OyBcCisJICBlc2FjIDs7IFwKKwl2bXMpIFwKKwkgIGNhc2UgJCRjIGluIFwKKwkgIHZheCkgdmFsaWQ9eWVzIDs7IFwKKwkgIGVzYWMgOzsgXAorCWVzYWM7CisKKyMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCisKK0NQVV9NVUxUSV9WQUxJRCA9IFwKKwl2YWxpZD0gOyBcCisJY2FzZSAkJGMgaW4gXAorCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAorCWVzYWM7CisKKyMgUmVndWxhciBzb3VyY2UgZmlsZXMuCisKK0dBU19DRklMRVMgPSBcCisJYXBwLmMgXAorCWFzLmMgXAorCWF0b2YtZ2VuZXJpYy5jIFwKKwliaWdudW0tY29weS5jIFwKKwljb25kLmMgXAorCWRlcGVuZC5jIFwKKwllY29mZi5jIFwKKwllaG9wdC5jIFwKKwlleHByLmMgXAorCWZsb251bS1jb3B5LmMgXAorCWZsb251bS1rb25zdC5jIFwKKwlmbG9udW0tbXVsdC5jIFwKKwlmcmFncy5jIFwKKwloYXNoLmMgXAorCWlucHV0LWZpbGUuYyBcCisJaW5wdXQtc2NydWIuYyBcCisJbGlzdGluZy5jIFwKKwlsaXRlcmFsLmMgXAorCW1hY3JvLmMgXAorCW1lc3NhZ2VzLmMgXAorCW91dHB1dC1maWxlLmMgXAorCXJlYWQuYyBcCisJc2IuYyBcCisJc3RhYnMuYyBcCisJc3Vic2Vncy5jIFwKKwlzeW1ib2xzLmMgXAorCXdyaXRlLmMKKworQ0ZJTEVTID0gJChHQVNfQ0ZJTEVTKSBnYXNwLmMgaXRibC1vcHMuYworCitIRklMRVMgPSBcCisJYXMuaCBcCisJYXNpbnRsLmggXAorCWJpZ251bS5oIFwKKwliaXRfZml4LmggXAorCWNnZW4uaCBcCisJZWNvZmYuaCBcCisJZW11bC10YXJnZXQuaCBcCisJZW11bC5oIFwKKwlleHByLmggXAorCWZsb251bS5oIFwKKwlmcmFncy5oIFwKKwloYXNoLmggXAorCWlucHV0LWZpbGUuaCBcCisJaXRibC1vcHMuaCBcCisJbGlzdGluZy5oIFwKKwltYWNyby5oIFwKKwlvYmouaCBcCisJb3V0cHV0LWZpbGUuaCBcCisJcmVhZC5oIFwKKwlzYi5oIFwKKwlzdHJ1Yy1zeW1ib2wuaCBcCisJc3Vic2Vncy5oIFwKKwlzeW1ib2xzLmggXAorCXRjLmggXAorCXdyaXRlLmgKKworIyBDUFUgZmlsZXMgaW4gY29uZmlnLgorCitUQVJHRVRfQ1BVX0NGSUxFUyA9IFwKKwljb25maWcvdGMtYTI5ay5jIFwKKwljb25maWcvdGMtYWxwaGEuYyBcCisJY29uZmlnL3RjLWFyYy5jIFwKKwljb25maWcvdGMtYXJtLmMgXAorCWNvbmZpZy90Yy1kMTB2LmMgXAorCWNvbmZpZy90Yy1kMzB2LmMgXAorCWNvbmZpZy90Yy1oODMwMC5jIFwKKwljb25maWcvdGMtaDg1MDAuYyBcCisJY29uZmlnL3RjLWhwcGEuYyBcCisJY29uZmlnL3RjLWkzODYuYyBcCisJY29uZmlnL3RjLWk4NjAuYyBcCisJY29uZmlnL3RjLWk5NjAuYyBcCisJY29uZmlnL3RjLW0zMnIuYyBcCisJY29uZmlnL3RjLW02OGsuYyBcCisJY29uZmlnL3RjLW04OGsuYyBcCisJY29uZmlnL3RjLW1jb3JlLmMgXAorCWNvbmZpZy90Yy1taXBzLmMgXAorCWNvbmZpZy90Yy1tbjEwMjAwLmMgXAorCWNvbmZpZy90Yy1tbjEwMzAwLmMgXAorCWNvbmZpZy90Yy1uczMyay5jIFwKKwljb25maWcvdGMtcHBjLmMgXAorCWNvbmZpZy90Yy1zaC5jIFwKKwljb25maWcvdGMtc3BhcmMuYyBcCisJY29uZmlnL3RjLXRhaG9lLmMgXAorCWNvbmZpZy90Yy10aWMzMC5jIFwKKwljb25maWcvdGMtdGljODAuYyBcCisJY29uZmlnL3RjLXZheC5jIFwKKwljb25maWcvdGMtdzY1LmMgXAorCWNvbmZpZy90Yy12ODUwLmMgXAorCWNvbmZpZy90Yy16OGsuYworCitUQVJHRVRfQ1BVX0hGSUxFUyA9IFwKKwljb25maWcvdGMtYTI5ay5oIFwKKwljb25maWcvdGMtYWxwaGEuaCBcCisJY29uZmlnL3RjLWFyYy5oIFwKKwljb25maWcvdGMtYXJtLmggXAorCWNvbmZpZy90Yy1kMTB2LmggXAorCWNvbmZpZy90Yy1kMzB2LmggXAorCWNvbmZpZy90Yy1oODMwMC5oIFwKKwljb25maWcvdGMtaDg1MDAuaCBcCisJY29uZmlnL3RjLWhwcGEuaCBcCisJY29uZmlnL3RjLWkzODYuaCBcCisJY29uZmlnL3RjLWk4NjAuaCBcCisJY29uZmlnL3RjLWk5NjAuaCBcCisJY29uZmlnL3RjLW0zMnIuaCBcCisJY29uZmlnL3RjLW02OGsuaCBcCisJY29uZmlnL3RjLW04OGsuaCBcCisJY29uZmlnL3RjLW1jb3JlLmggXAorCWNvbmZpZy90Yy1taXBzLmggXAorCWNvbmZpZy90Yy1tbjEwMjAwLmggXAorCWNvbmZpZy90Yy1tbjEwMzAwLmggXAorCWNvbmZpZy90Yy1uczMyay5oIFwKKwljb25maWcvdGMtcHBjLmggXAorCWNvbmZpZy90Yy1zaC5oIFwKKwljb25maWcvdGMtc3BhcmMuaCBcCisJY29uZmlnL3RjLXRhaG9lLmggXAorCWNvbmZpZy90Yy10aWMzMC5oIFwKKwljb25maWcvdGMtdGljODAuaCBcCisJY29uZmlnL3RjLXZheC5oIFwKKwljb25maWcvdGMtdzY1LmggXAorCWNvbmZpZy90Yy12ODUwLmggXAorCWNvbmZpZy90Yy16OGsuaAorCisjIE9CSiBmaWxlcyBpbiBjb25maWcKKworT0JKX0ZPUk1BVF9DRklMRVMgPSBcCisJY29uZmlnL29iai1hb3V0LmMgXAorCWNvbmZpZy9vYmotYm91dC5jIFwKKwljb25maWcvb2JqLWNvZmYuYyBcCisJY29uZmlnL29iai1lY29mZi5jIFwKKwljb25maWcvb2JqLWVsZi5jIFwKKwljb25maWcvb2JqLWV2YXguYyBcCisJY29uZmlnL29iai1ocDMwMC5jIFwKKwljb25maWcvb2JqLWllZWUuYyBcCisJY29uZmlnL29iai1zb20uYyBcCisJY29uZmlnL29iai12bXMuYworCitPQkpfRk9STUFUX0hGSUxFUyA9IFwKKwljb25maWcvb2JqLWFvdXQuaCBcCisJY29uZmlnL29iai1ib3V0LmggXAorCWNvbmZpZy9vYmotY29mZi5oIFwKKwljb25maWcvb2JqLWVjb2ZmLmggXAorCWNvbmZpZy9vYmotZWxmLmggXAorCWNvbmZpZy9vYmotZXZheC5oIFwKKwljb25maWcvb2JqLWhwMzAwLmggXAorCWNvbmZpZy9vYmotaWVlZS5oIFwKKwljb25maWcvb2JqLXNvbS5oIFwKKwljb25maWcvb2JqLXZtcy5oCisKKyMgRW11bGF0aW9uIGhlYWRlciBmaWxlcyBpbiBjb25maWcKKworVEFSR19FTlZfSEZJTEVTID0gXAorCWNvbmZpZy90ZS0zODZic2QuaCBcCisJY29uZmlnL3RlLWF1eC5oIFwKKwljb25maWcvdGUtZGVsdGEuaCBcCisJY29uZmlnL3RlLWRlbHQ4OC5oIFwKKwljb25maWcvdGUtZHB4Mi5oIFwKKwljb25maWcvdGUtZHluaXguaCBcCisJY29uZmlnL3RlLWdlbmVyaWMuaCBcCisJY29uZmlnL3RlLWdvMzIuaCBcCisJY29uZmlnL3RlLWhwMzAwLmggXAorCWNvbmZpZy90ZS1ocHBhLmggXAorCWNvbmZpZy90ZS1pMzg2YWl4LmggXAorCWNvbmZpZy90ZS1pYzk2MC5oIFwKKwljb25maWcvdGUtbGludXguaCBcCisJY29uZmlnL3RlLWxuZXdzLmggXAorCWNvbmZpZy90ZS1seW54LmggXAorCWNvbmZpZy90ZS1tYWNoLmggXAorCWNvbmZpZy90ZS1tYWNvcy5oIFwKKwljb25maWcvdGUtbXVsdGkuaCBcCisJY29uZmlnL3RlLW5ic2QuaCBcCisJY29uZmlnL3RlLW5ic2Q1MzIuaCBcCisJY29uZmlnL3RlLXBjNTMybWFjaC5oIFwKKwljb25maWcvdGUtcGUuaCBcCisJY29uZmlnL3RlLXBwY253LmggXAorCWNvbmZpZy90ZS1wc29zLmggXAorCWNvbmZpZy90ZS1yaXNjaXguaCBcCisJY29uZmlnL3RlLXNwYXJjYW91dC5oIFwKKwljb25maWcvdGUtc3VuMy5oIFwKKwljb25maWcvdGUtc3ZyNC5oIFwKKwljb25maWcvdGUtc3lzdjMyLmgKKworIyBNdWx0aSBmaWxlcyBpbiBjb25maWcKKworTVVMVElfQ0ZJTEVTID0gXAorCWNvbmZpZy9lLWkzODZjb2ZmLmMgXAorCWNvbmZpZy9lLWkzODZlbGYuYyBcCisJY29uZmlnL2UtbWlwc2Vjb2ZmLmMgXAorCWNvbmZpZy9lLW1pcHNlbGYuYworCitDT05GSUdfT0JKUyA9IFwKKwkkKFRBUkdfQ1BVX08pIFwKKwkkKE9CSl9GT1JNQVRfTykgXAorCSQoQVRPRl9UQVJHX08pIFwKKwkkKGV4dHJhX29iamVjdHMpCisKK0dFTkVSSUNfT0JKUyA9IFwKKwlhcHAubyBcCisJYXMubyBcCisJYXRvZi1nZW5lcmljLm8gXAorCWJpZ251bS1jb3B5Lm8gXAorCWNvbmQubyBcCisJZGVwZW5kLm8gXAorCWVob3B0Lm8gXAorCWV4cHIubyBcCisJZmxvbnVtLWtvbnN0Lm8gXAorCWZsb251bS1jb3B5Lm8gXAorCWZsb251bS1tdWx0Lm8gXAorCWZyYWdzLm8gXAorCWhhc2gubyBcCisJaW5wdXQtZmlsZS5vIFwKKwlpbnB1dC1zY3J1Yi5vIFwKKwlsaXRlcmFsLm8gXAorCW1lc3NhZ2VzLm8gXAorCW91dHB1dC1maWxlLm8gXAorCXJlYWQubyBcCisJc3Vic2Vncy5vIFwKKwlzeW1ib2xzLm8gXAorCXdyaXRlLm8gXAorCWxpc3RpbmcubyBcCisJZWNvZmYubyBcCisJc3RhYnMubyBcCisJc2IubyBcCisJbWFjcm8ubworCitPQkpTID0gJChDT05GSUdfT0JKUykgJChHRU5FUklDX09CSlMpCisKK1BPVEZJTEVTID0gJChNVUxUSV9DRklMRVMpICQoVEFSR0VUX0VOVl9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpIFwKKwkkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCisJJChIRklMRVMpICQoQ0ZJTEVTKSAkKEdBU19DRklMRVMpCitwby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQorCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAorCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgorCitub2luc3RfUFJPR1JBTVMgPSBhcy1uZXcgZ2FzcC1uZXcKK25vaW5zdF9TQ1JJUFRTID0gLmdkYmluaXQKKworJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCitzdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKKwlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KKwl0b3VjaCBzdGFtcC1tay5jb20KKworRVhUUkFfRElTVCA9IG1ha2UtZ2FzLmNvbQorCitESVNUU1RVRkYgPSBtYWtlLWdhcy5jb20gbTY4ay1wYXJzZS5jIGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggaXRibC1sZXguYworZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbworCitESVNUQ0xFQU5GSUxFUyA9IHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIHRhcmctZW52LmggaXRibC1jcHUuaCBjZ2VuLWRlc2MuaAorCisjIE5vdyBmaWd1cmUgb3V0IGZyb20gdGhvc2UgdmFyaWFibGVzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rLgorCitCQVNFRElSID0gJChzcmNkaXIpLy4uCitCRkRESVIgPSAkKEJBU0VESVIpL2JmZAorSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCisKKyMgVGhpcyBpcyB0aGUgdmFyaWFibGUgYWN0dWFsbHkgdXNlZCB3aGVuIHdlIGNvbXBpbGUuCisjIFNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBoZWFkZXIgZmlsZXMuCisjIEJvdGggLiBhbmQgc3JjZGlyIGFyZSB1c2VkLCBpbiB0aGF0IG9yZGVyLAorIyBzbyB0aGF0IHRtLmggYW5kIGNvbmZpZy5oIHdpbGwgYmUgZm91bmQgaW4gdGhlIGNvbXBpbGF0aW9uCisjIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KK0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKHNyY2RpcikvY29uZmlnIC1JJChJTkNESVIpIC1JJChzcmNkaXIpLy4uIC1JJChCRkRESVIpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKKworIyBUaGlzIHNob3VsZCBiZSBwYXJhbGxlbCB0byBJTkNMVURFUywgYnV0IHNob3VsZCByZXBsYWNlICQoc3JjZGlyKQorIyB3aXRoICQke3NyY2Rpcn0sIGFuZCBzaG91bGQgd29yayBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZAorIyB3aGVuIGJ1aWxkaW5nIGRlcGVuZGVuY2llcywgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBidWlsZGluZyBpcyBkb25lCisjIGluIGEgc3ViZGlyZWN0b3J5LgorREVQX0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAtSSQke3NyY2Rpcn0vY29uZmlnIC1JJCR7c3JjZGlyfS8uLi9pbmNsdWRlIC1JJCR7c3JjZGlyfS8uLiAtSSQke3NyY2Rpcn0vLi4vYmZkIC1JJCR7c3JjZGlyfS8uLi9pbnRsIC1JLi4vLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCisKKyMgSG93IHRvIGxpbmsgd2l0aCBib3RoIG91ciBzcGVjaWFsIGxpYnJhcnkgZmFjaWxpdGllcworIyBhbmQgdGhlIHN5c3RlbSdzIGluc3RhbGxlZCBsaWJyYXJpZXMuCisKK0dBU0xJQlMgPSBAT1BDT0RFU19MSUJAIEBCRkRMSUJAIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQorCisjIEZpbGVzIHRvIGJlIGNvcGllZCBhd2F5IGFmdGVyIGVhY2ggc3RhZ2UgaW4gYnVpbGRpbmcuCitTVEFHRVNUVUZGID0gKi5vICQobm9pbnN0X1BST0dSQU1TKQorCiskKE9CSlMpOiBAQUxMX09CSl9ERVBTQAorCithc19uZXdfU09VUkNFUyA9ICQoR0FTX0NGSUxFUykKK2FzX25ld19MREFERCA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKKwkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMTElCUykKK2FzX25ld19ERVBFTkRFTkNJRVMgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCisJJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTERFUFMpCisKKyMgU3R1ZmYgdGhhdCBldmVyeSBvYmplY3QgZmlsZSBkZXBlbmRzIHVwb24uICBJZiBhbnl0aGluZyBpcyByZW1vdmVkCisjIGZyb20gdGhpcyBsaXN0LCByZW1vdmUgaXQgZnJvbSBkZXAtaW4uc2VkIGFzIHdlbGwuCiskKE9CSlMpOiBjb25maWcuaCBhcy5oICQoVEFSR19FTlZfSCkgJChPQkpfRk9STUFUX0gpICQoVEFSR19DUFVfSCkgZmxvbnVtLmggXAorCWV4cHIuaCBzdHJ1Yy1zeW1ib2wuaCB3cml0ZS5oIGZyYWdzLmggaGFzaC5oIHJlYWQuaCBzeW1ib2xzLmggdGMuaCBcCisJb2JqLmggbGlzdGluZy5oIGJpZ251bS5oIGJpdF9maXguaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYXNpbnRsLmgKKworZ2FzcF9uZXdfU09VUkNFUyA9IGdhc3AuYyBtYWNyby5jIHNiLmMgaGFzaC5jCitnYXNwX25ld19MREFERCA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQorZ2FzcF9uZXdfREVQRU5ERU5DSUVTID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCisKK0VYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCisgICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgOyBcCisgICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAorCitSVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAorCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKKwkgICBmaWAKK1JVTlRFU1RGTEFHUz0KKworY2hlY2stREVKQUdOVTogc2l0ZS5leHAKKwlpZiBbIC1kIHRlc3RzdWl0ZSBdOyB0aGVuIFwKKwkgIHRydWU7IFwKKwllbHNlIFwKKwkgIG1rZGlyIHRlc3RzdWl0ZTsgXAorCWZpCisJcm0gLWYgdGVzdHN1aXRlL3NpdGUuZXhwCisJY3Agc2l0ZS5leHAgdGVzdHN1aXRlL3NpdGUuZXhwCisJcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCisJc3JjZGlyPWBjZCAke3NyY2Rpcn07IHB3ZGAgOyBleHBvcnQgc3JjZGlyIDsgXAorCUVYUEVDVD0ke0VYUEVDVH0gOyBleHBvcnQgRVhQRUNUIDsgXAorCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCisJICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCisJICBleHBvcnQgVENMX0xJQlJBUlk7IFwKKwlmaTsgXAorCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAorCWNkIHRlc3RzdWl0ZTsgXAorCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAorCQkkKFJVTlRFU1RGTEFHUyk7IFwKKwllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAorCWZpCisKKyMgVGhlIGltcGxpY2l0IC5jLm8gcnVsZSBkb2Vzbid0IHdvcmsgZm9yIHRoZXNlLCBwZXJoYXBzIGJlY2F1c2Ugb2YKKyMgdGhlIHZhcmlhYmxlcywgb3IgcGVyaGFwcyBiZWNhdXNlIHRoZSBzb3VyY2VzIGFyZSBub3Qgb24gdnBhdGguCiskKFRBUkdfQ1BVX08pOiAkKFRBUkdfQ1BVX0MpICQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKQorCSQoQ09NUElMRSkgLWMgJChUQVJHX0NQVV9DKQorJChBVE9GX1RBUkdfTyk6ICQoQVRPRl9UQVJHX0MpCisJJChDT01QSUxFKSAtYyAkKEFUT0ZfVEFSR19DKQorCisjIGVjb2ZmLmMgb25seSBoYXMgZnVsbCBkZXBlbmRlbmNpZXMgd2hlbiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZCwKKyMgc28gdGhlIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHN0dWZmIGRvZXNuJ3Qgd29yay4KK2Vjb2ZmLm8gOiBlY29mZi5jIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCisJJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKKwkkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oCisKKyMgV2UgbmVlZCBhbGwgdGhlc2UgZXhwbGljaXQgcnVsZXMgZm9yIHRoZSBtdWx0aSBzdHVmZi4gIEJlY2F1c2Ugb2YKKyMgdGhlc2UgcnVsZXMsIHdlIGRvbid0IG5lZWQgb25lIGZvciBPQkpfRk9STUFUX08uCisKK29iai1hb3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYworb2JqLWJvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCitvYmotY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYworb2JqLWVjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCitvYmotZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKK29iai1ldmF4Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYworb2JqLWhwMzAwLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCitvYmotaWVlZS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKK29iai1tdWx0aS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYworb2JqLXNvbS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCitvYmotdm1zLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKKworZS1taXBzZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCitlLW1pcHNlY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKK2UtaTM4NmNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCitlLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYworCisjIFRoZSBtNjhrIG9wZXJhbmQgcGFyc2VyLgorCitFWFRSQV9hc19uZXdfU09VUkNFUyA9IGNvbmZpZy9tNjhrLXBhcnNlLnkKKworIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgorIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQorIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCisjIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCisjIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKKyMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCisjIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQorIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgorIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKKyMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCittNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55CisJZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAorCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCisJICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAorCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCisJICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKKwkgIGY9bTY4ay1wYXJzZS55OyBcCisJZWxzZSB0cnVlOyBmaTsgXAorCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCisJaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKKwkgIHJtIC1mIG02OGstcGFyc2UueTsgXAorCWVsc2UgdHJ1ZTsgZmkKK202OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCisKKyMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCittNjhrLXBhcnNlLmg6IDsgQHRydWUKKyQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCisKKyMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgorCitpdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAoraXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKKworaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCisKK2l0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAorCitpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55CisJJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCisKKyMgc3RhbmQtYWxvbmUgaXRibCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIKKworRVhUUkFfUFJPR1JBTVMgPSBpdGJsLXRlc3QKK2l0YmxfdGVzdF9TT1VSQ0VTID0gaXRibC1wYXJzZS55IGl0YmwtbGV4LmwKK2l0YmxfdGVzdF9MREFERCA9IGl0YmwtdGVzdC1vcHMubyBpdGJsLXRlc3QubyAkKEdBU0xJQlMpIEBMRVhMSUJACisKK2l0YmwtdGVzdC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCisJJChDT01QSUxFKSAtbyBpdGJsLXRlc3Qtb3BzLm8gLURTVEFORF9BTE9ORSAtYyAkKHNyY2RpcikvaXRibC1vcHMuYworCitpdGJsLXRlc3QubzogJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jICQoc3JjZGlyKS9pdGJsLW9wcy5oCisJJChDT01QSUxFKSAtYyAtRFNUQU5EX0FMT05FICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYworCisjIENHRU4gaW50ZXJmYWNlLgorCitDR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAorCitjZ2VuLm86IGNnZW4uYyBjZ2VuLmggY2dlbi1kZXNjLmggc3Vic2Vncy5oIFwKKwkkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKwkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIFwKKwkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktb3BjLmgKKworIyBSZW1ha2UgdGhlIGluZm8gZmlsZXMuCisKK01PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGNvcmUgc3RhbXAtbWsuY29tIFwKKwl0ZXN0c3VpdGUvKi5vIHRlc3RzdWl0ZS8qLm91dCB0ZXN0c3VpdGUvZ2FzLmxvZyB0ZXN0c3VpdGUvZ2FzLnN1bSBcCisJdGVzdHN1aXRlL3NpdGUuZXhwIHNpdGUuYmFrIHNpdGUuZXhwIHN0YWdlIHN0YWdlMSBzdGFnZTIKKworQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLnRjZGVwIC5vYmpkZXAgLmRlcDIgLmRlcDEgLmRlcGEgLmRlcCAuZGVwZGlyCisKKy5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAorLlBIT05ZOiBpbnN0YWxsLWV4ZWMtYmluZGlyIGluc3RhbGwtZXhlYy10b29sZGlyCisKK2luc3RhbGwtZXhlYy1sb2NhbDogaW5zdGFsbC1leGVjLWJpbmRpciBAaW5zdGFsbF90b29sZGlyQAorCitpbnN0YWxsLWV4ZWMtYmluZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKKwkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKQorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKKwkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCitpbnN0YWxsLWV4ZWMtdG9vbGRpcjogJChub2luc3RfUFJPR1JBTVMpCisJJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgorCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCisJaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKKwkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCisJICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAorCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKKwllbHNlIFwKKwkgIHRydWUgOyBcCisJZmkKKworIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCisKKy5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCisKK2Jvb3RzdHJhcDogYXMtbmV3CisJJChNQUtFKSBzdGFnZTEKKwlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKKwkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKKwkkKE1BS0UpIHN0YWdlMgorCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQorCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQorCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgorCitib290c3RyYXAyOgorCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQorCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQorCSQoTUFLRSkgc3RhZ2UyCisJcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCisJJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCisJJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCisKK2Jvb3RzdHJhcDM6CisJcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCisJJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCisJJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCisKKyMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCitzdGFnZTE6CisJLW1rZGlyIHN0YWdlMQorCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQorCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCisKK3N0YWdlMjoKKwktbWtkaXIgc3RhZ2UyCisJLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCisJaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKKworc3RhZ2UzOgorCS1ta2RpciBzdGFnZTMKKwktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKKwlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQorCithZ2FpbnN0PXN0YWdlMgorCisjIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgorIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgorIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KK2NvbXBhcmlzb246CisJeD0wIDsgXAorCWZvciBmaWxlIGluICoubyA7IGRvIFwKKwkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCisJICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAorCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKKwkgICAgICB0cnVlIDsgXAorCSAgICBlbHNlIFwKKwkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAorCSAgICAgIHg9MSA7IFwKKwkgICAgZmkgOyBcCisJICBlbHNlIHRydWU7IGZpIDsgXAorCWRvbmUgOyBcCisJZXhpdCAkJHgKKwktcm0gLWYgdG1wLWZvbyoKKworLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMworCitkZS1zdGFnZTE6CisJLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQorCS0gcm1kaXIgc3RhZ2UxCisKK2RlLXN0YWdlMjoKKwktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCisJLSBybWRpciBzdGFnZTIKKworZGUtc3RhZ2UzOgorCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKKwktIHJtZGlyIHN0YWdlMworCisjIEF1dG9tYXRpYyBkZXBlbmRlbmN5IGNvbXB1dGF0aW9uLiAgVGhpcyBpcyBhIHJlYWwgcGFpbiwgYmVjYXVzZSB0aGUKKyMgZGVwZW5kZW5jaWVzIGNoYW5nZSBiYXNlZCBvbiB0YXJnZXRfY3B1X3R5cGUgYW5kIG9ial9mb3JtYXQuICBXZQorIyBjdXJyZW50bHkgaWdub3JlIGFueSBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGVtdWxhdGlvbiBmaWxlcy4KKworREVQX0ZJTEVfREVQUyA9ICAkKENGSUxFUykgJChIRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKKwkkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQorCisuZGVwOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgLnRjZGVwIC5vYmpkZXAgLmRlcDIKKwlybSAtZiAuZGVwMQorCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCisJJChNQUtFKSBERVA9JChERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gLmRlcDEKKwlybSAtcmYgLmRlcGRpcgorCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwYQorCXNlZCAtZiBkZXAuc2VkIDwgLnRjZGVwID4+IC5kZXBhCisJc2VkIC1mIGRlcC5zZWQgPCAub2JqZGVwID4+IC5kZXBhCisJc2VkIC1mIGRlcC5zZWQgPCAuZGVwMiA+PiAuZGVwYQorCWVjaG8gJyQkKE9CSlMpOiAkJChERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCisJZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKFRDREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQorCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKE9CSkRFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKKwllY2hvICcjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVknID4+IC5kZXBhCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXBhIC5kZXAKKworIyBUaGlzIHJ1bGUgbmVlZHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgorLmRlcDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKKwlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCisJc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKKwljZCAuZGVwZGlyOyBcCisJZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKKwllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCisJZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKKwllY2hvICcnID4gaXRibC1jcHUuaDsgXAorCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAorCSQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpICQ/CisJc2VkIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyA8IC5kZXBkaXIvLmRlcCA+IC5kZXAxCisJcm0gLWYgLmRlcGRpci8uZGVwCisKKyMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgorLnRjZGVwOiAkKFRBUkdFVF9DUFVfQ0ZJTEVTKQorCXJtIC1mIC50Y2RlcGEKKwlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCisJc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKKwljZCAuZGVwZGlyOyBcCisJZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCisJICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAorCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKKwkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCisJICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiQke2N9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaDsgXAorCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKKwkgICAgICBjcCAkJHtzcmNkaXJ9L2NvbmZpZy90Yy0kJHtjfS5jIGR1bW15LmM7IFwKKwkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKKwkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCisJICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvVENERVBfJCR7Y31fJCR7b30gPS8iIFwKKwkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCisJCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKKwkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLnRjZGVwYTsgXAorCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKKwkgICAgZWxzZSB0cnVlOyBmaTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKwllY2hvICdUQ0RFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXCcgPj4gLnRjZGVwYQorCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gLnRjZGVwYQorCWVjaG8gJyAgJCQoSU5DRElSKS9vcGNvZGUvaHBwYS5oICQkKEJGRERJUikvc29tLmgnID4+IC50Y2RlcGEKKwkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgorCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAorCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKKwkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCisJICAgIG89ZWNvZmY7IFwKKwkgICAgJChDUFVfT0JKX1ZBTElEKSBcCisJICAgIGVjaG8gJ1RDREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC50Y2RlcGE7IFwKKwkgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC50Y2RlcGE7IFwKKwkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC50Y2RlcGE7IFwKKwkgICAgZWxzZSB0cnVlOyBmaTsgXAorCSAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfZWxmKScgPj4gLnRjZGVwYTsgXAorCSAgZWxzZSB0cnVlOyBmaTsgXAorCWRvbmUKKwltdiAtZiAudGNkZXBhIC50Y2RlcAorCisjIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIG9iai0qLmMgZmlsZXMuCisub2JqZGVwOiAkKE9CSl9GT1JNQVRfQ0ZJTEVTKQorCXJtIC1mIC5vYmpkZXBhCisJaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQorCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCisJY2QgLmRlcGRpcjsgXAorCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAorCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKKwkgICAgJChDUFVfT0JKX1ZBTElEKSBcCisJICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCisJICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCisJICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCisJICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAorCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCisJICAgICAgcm0gLWYgZHVtbXkuYzsgXAorCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKKwkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKKwkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCisJICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvT0JKREVQXyQke2N9XyQke299ID0vIiBcCisJCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAorCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCisJCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5vYmpkZXBhOyBcCisJICAgICAgcm0gLWYgZHVtbXkuYzsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCWVjaG8gJ09CSkRFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gLm9iamRlcGEKKwllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC5vYmpkZXBhCisJZWNobyAnICAkJChCRkRESVIpL3NvbS5oICAkJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcJyA+PiAub2JqZGVwYQorCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiAub2JqZGVwYQorCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCisJZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCisJICAkKENQVV9NVUxUSV9WQUxJRCkgXAorCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgbz1lY29mZjsgXAorCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKKwkgICAgZWNobyAnT0JKREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5vYmpkZXBhOyBcCisJICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLm9iamRlcGE7IFwKKwkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgICBlY2hvICckJChPQkpERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWxmKScgPj4gLm9iamRlcGE7IFwKKwkgIGVsc2UgdHJ1ZTsgZmk7IFwKKwlkb25lCisJbXYgLWYgLm9iamRlcGEgLm9iamRlcAorCisjIFdvcmsgb3V0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggQ1BVL09CSiBjb21iaW5hdGlvbi4KKyMgTm90ZSB0aGF0IFNPTSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG5hdGl2ZS4KKy5kZXAyOiAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQorCXJtIC1mIC5kZXAyYQorCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKKwlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAorCWNkIC5kZXBkaXI7IFwKKwlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKKwkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCisJICAgICQoQ1BVX09CSl9WQUxJRCkgXAorCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAorCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAorCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKKwkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKKwkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCisJICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCisJCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAorCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCisJCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5kZXAyYTsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCWVjaG8gJ0RFUF9ocHBhX3NvbSA9ICQkKEJGRERJUikvc29tLmgnID4+IC5kZXAyYQorCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCisJZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCisJICAkKENQVV9NVUxUSV9WQUxJRCkgXAorCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgbz1lY29mZjsgXAorCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKKwkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5kZXAyYTsgXAorCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC5kZXAyYTsgXAorCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAorCSAgICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5kZXAyYTsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gLmRlcDJhOyBcCisJICBlbHNlIHRydWU7IGZpOyBcCisJZG9uZQorCW12IC1mIC5kZXAyYSAuZGVwMgorCitkZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKKwlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAorCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAorCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCisJCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAorCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKKworZGVwOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKKworZGVwLWluOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KKwljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorCitkZXAtYW06IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCisKKy5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgorIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgorCithcHAubzogYXBwLmMKK2FzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCisgIHNiLmggbWFjcm8uaAorYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCitiaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCitjb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAorZGVwZW5kLm86IGRlcGVuZC5jCitlY29mZi5vOiBlY29mZi5jCitlaG9wdC5vOiBlaG9wdC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKK2V4cHIubzogZXhwci5jICQoSU5DRElSKS9vYnN0YWNrLmgKK2Zsb251bS1jb3B5Lm86IGZsb251bS1jb3B5LmMKK2Zsb251bS1rb25zdC5vOiBmbG9udW0ta29uc3QuYworZmxvbnVtLW11bHQubzogZmxvbnVtLW11bHQuYworZnJhZ3MubzogZnJhZ3MuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAoraGFzaC5vOiBoYXNoLmMKK2lucHV0LWZpbGUubzogaW5wdXQtZmlsZS5jIGlucHV0LWZpbGUuaAoraW5wdXQtc2NydWIubzogaW5wdXQtc2NydWIuYyBpbnB1dC1maWxlLmggc2IuaAorbGlzdGluZy5vOiBsaXN0aW5nLmMgaW5wdXQtZmlsZS5oIHN1YnNlZ3MuaAorbGl0ZXJhbC5vOiBsaXRlcmFsLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKK21hY3JvLm86IG1hY3JvLmMgc2IuaCBtYWNyby5oCittZXNzYWdlcy5vOiBtZXNzYWdlcy5jCitvdXRwdXQtZmlsZS5vOiBvdXRwdXQtZmlsZS5jIG91dHB1dC1maWxlLmgKK3JlYWQubzogcmVhZC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIHNiLmggbWFjcm8uaCBcCisgIGVjb2ZmLmgKK3NiLm86IHNiLmMgc2IuaAorc3RhYnMubzogc3RhYnMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBlY29mZi5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgorc3Vic2Vncy5vOiBzdWJzZWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKK3N5bWJvbHMubzogc3ltYm9scy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCit3cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKK2dhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAorZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAorICBlbXVsLXRhcmdldC5oCitlLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAorZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCisgIGVtdWwtdGFyZ2V0LmgKK2UtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCisKK1RDREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAorVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKK1RDREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKK1RDREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCisgICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYworVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCisgIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCisgICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYworVENERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKKyAgJChJTkNESVIpL29wY29kZS9hbHBoYS5oICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCitUQ0RFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCitUQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKKyAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCitUQ0RFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCisgICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKK1RDREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKK1RDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCitUQ0RFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorVENERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCisgICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAorICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCitUQ0RFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCitUQ0RFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKK1RDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCisgIGNnZW4uaAorVENERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLWRlc2MuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtb3BjLmggXAorICBjZ2VuLmgKK1RDREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAorVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCitUQ0RFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaAorVENERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKK1RDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAorVENERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKKyAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmJmZC5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCitUQ0RFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAorVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKK1RDREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAorVENERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCitUQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCitUQ0RFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCitUQ0RFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCitUQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCitUQ0RFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oICQoSU5DRElSKS9vYnN0YWNrLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAorVENERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKKyAgY2dlbi5oCitUQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCisgIGNnZW4uaAorVENERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKK1RDREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKK1RDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAorVENERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAorICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAorVENERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCitUQ0RFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCitUQ0RFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaAorVENERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvbWNvcmUtb3BjLmggXAorICAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorVENERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaAorVENERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCisgIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCitUQ0RFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKKyAgaXRibC1vcHMuaAorVENERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggXAorICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVjb2ZmLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCitUQ0RFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCitUQ0RFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKK1RDREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKK1RDREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAorVENERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorVENERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCAkKElOQ0RJUikvb2JzdGFjay5oCitUQ0RFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorVENERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaAorVENERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oICQoSU5DRElSKS9lbGYvcHBjLmggXAorICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCitUQ0RFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAorVENERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKK1RDREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS9zcGFyYy5oCitUQ0RFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKK1RDREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3NwYXJjLmggXAorICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCitUQ0RFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCitUQ0RFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKK1RDREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCitUQ0RFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKK1RDREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAorVENERVBfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAorVENERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCitUQ0RFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCitUQ0RFUF92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAorVENERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAorVENERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCitUQ0RFUF92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCitUQ0RFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKK1RDREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCitUQ0RFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCitUQ0RFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKK1RDREVQX3o4a19jb2ZmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCBcCisgICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorVENERVBfejhrX2VsZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCBcCisgICQoQkZERElSKS9lbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAorICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCitUQ0RFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCBcCisgICQoQkZERElSKS9zb20uaAorVENERVBfaTM4Nl9tdWx0aSA9ICQoVENERVBfaTM4Nl9jb2ZmKSAkKFRDREVQX2kzODZfZWxmKQorVENERVBfbWlwc19tdWx0aSA9ICQoVENERVBfbWlwc19jb2ZmKSAkKFRDREVQX21pcHNfZWNvZmYpIFwKKyAgJChUQ0RFUF9taXBzX2VsZikKK09CSkRFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKKyAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKEJGRERJUikvbGliZWNvZmYuaAorT0JKREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAorT0JKREVQX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2Lmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKKyAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKK09CSkRFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggXAorICAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorT0JKREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChCRkRESVIpL2xpYmVjb2ZmLmgKK09CSkRFUF9taXBzX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKKyAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfc3BhcmNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX3RhaG9lX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorT0JKREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKK09CSkRFUF92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorT0JKREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4Lmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCitPQkpERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKK09CSkRFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCitPQkpERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorT0JKREVQX3Y4NTBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCitPQkpERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorT0JKREVQX2hwcGFfc29tID0gJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliaHBwYS5oICQoQkZERElSKS9zb20uaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKK09CSkRFUF9pMzg2X211bHRpID0gJChPQkpERVBfaTM4Nl9jb2ZmKSAkKE9CSkRFUF9pMzg2X2VsZikKK09CSkRFUF9taXBzX211bHRpID0gJChPQkpERVBfbWlwc19jb2ZmKSAkKE9CSkRFUF9taXBzX2Vjb2ZmKSBcCisgICQoT0JKREVQX21pcHNfZWxmKQorREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCitERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaAorREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKKyAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCitERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCitERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKK0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaAorREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oCitERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oCitERVBfZDMwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oCitERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oCitERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmgKK0RFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaAorREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKKyAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCitERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oCitERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oCitERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCitERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCitERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oCitERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oCitERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oCitERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmgKK0RFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKKyAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCitERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaAorREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaAorREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaAorREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaAorREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCitERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmgKK0RFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaAorREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmgKK0RFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmgKK0RFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCitERVBfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oCitERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmgKK0RFUF92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCitERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmgKK0RFUF92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKK0RFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oCitERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oCitERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKK0RFUF96OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAorREVQX2hwcGFfc29tID0gJChCRkRESVIpL3NvbS5oCitERVBfaTM4Nl9tdWx0aSA9ICQoREVQX2kzODZfY29mZikgJChERVBfaTM4Nl9lbGYpCitERVBfbWlwc19tdWx0aSA9ICQoREVQX21pcHNfY29mZikgJChERVBfbWlwc19lY29mZikgXAorICAkKERFUF9taXBzX2VsZikKKyQoT0JKUyk6ICQoREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKKyQoVEFSR19DUFVfTyk6ICQoVENERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQorJChPQkpfRk9STUFUX08pOiAkKE9CSkRFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCisjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2dhcy9NYWtlZmlsZS5pbiBiL2dhcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRmZmYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjQ4OCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbGliZGlyID0gQGxpYmRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK21hbmRpciA9IEBtYW5kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCisKK0RFU1RESVIgPQorCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorCit0b3BfYnVpbGRkaXIgPSAuCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACisKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQUxMX09CSl9ERVBTID0gQEFMTF9PQkpfREVQU0AKK0FTID0gQEFTQAorQkZETElCID0gQEJGRExJQkAKK0NBVEFMT0dTID0gQENBVEFMT0dTQAorQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKK0NDID0gQENDQAorREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACitETExUT09MID0gQERMTFRPT0xACitFWEVFWFQgPSBARVhFRVhUQAorR01PRklMRVMgPSBAR01PRklMRVNACitHTVNHRk1UID0gQEdNU0dGTVRACitHVF9OTyA9IEBHVF9OT0AKK0dUX1lFUyA9IEBHVF9ZRVNACitJTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACitJTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACitJTlRMREVQUyA9IEBJTlRMREVQU0AKK0lOVExPQkpTID0gQElOVExPQkpTQAorTEQgPSBATERACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorTVNHRk1UID0gQE1TR0ZNVEAKK05NID0gQE5NQAorT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACitQQUNLQUdFID0gQFBBQ0tBR0VACitQT0ZJTEVTID0gQFBPRklMRVNACitQT1NVQiA9IEBQT1NVQkAKK1JBTkxJQiA9IEBSQU5MSUJACitVU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKK1VTRV9OTFMgPSBAVVNFX05MU0AKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2F0b2YgPSBAYXRvZkAKK2NnZW5fY3B1X3ByZWZpeCA9IEBjZ2VuX2NwdV9wcmVmaXhACitleHRyYV9vYmplY3RzID0gQGV4dHJhX29iamVjdHNACitpbnN0YWxsX3Rvb2xkaXIgPSBAaW5zdGFsbF90b29sZGlyQAorbCA9IEBsQAorb2JqX2Zvcm1hdCA9IEBvYmpfZm9ybWF0QAordGFyZ2V0X2NwdV90eXBlID0gQHRhcmdldF9jcHVfdHlwZUAKK3RlX2ZpbGUgPSBAdGVfZmlsZUAKKworSU5UTExJQlMgPSBASU5UTExJQlNACisKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQorCitTVUJESVJTID0gZG9jIHBvCisKK3Rvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKKworWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAorTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCisKK0RFUCA9ICQoc3JjZGlyKS8uLi9ta2RlcAorCitUQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACitUQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCitUQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubworVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAorT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKK09CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubworT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKK1RBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCitBVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYworQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCisKKyMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCitJVF9IRFJTID0gaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAorSVRfU1JDUyA9IGl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCitJVF9ERVBTID0gJChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAorSVRfT0JKUyA9IGl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KKworIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KKworQ1BVX1RZUEVTID0gXAorCWEyOWsgXAorCWFscGhhIFwKKwlhcmMgXAorCWFybSBcCisJZDEwdiBcCisJZDMwdiBcCisJZnIzMCBcCisJaDgzMDAgXAorCWg4NTAwIFwKKwlocHBhIFwKKwlpMzg2IFwKKwlpODYwIFwKKwlpOTYwIFwKKwltMzJyIFwKKwltNjhrIFwKKwltODhrIFwKKwltY29yZSBcCisJbWlwcyBcCisJbW4xMDIwMCBcCisJbW4xMDMwMCBcCisJbnMzMmsgXAorCXBwYyBcCisJc2ggXAorCXNwYXJjIFwKKwl0YWhvZSBcCisJdGljMzAgXAorCXRpYzgwIFwKKwl2YXggXAorCXc2NSBcCisJdjg1MCBcCisJejhrCisKKworIyBPYmplY3QgZm9ybWF0IHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCisjIFdlIGRlbGliZXJhdGVseSBvbWl0IHNvbSwgc2luY2UgaXQgZG9lcyBub3Qgd29yayBhcyBhIGNyb3NzIGFzc2VtYmxlci4KKworT0JKX0ZPUk1BVFMgPSBcCisJYW91dCBcCisJYm91dCBcCisJY29mZiBcCisJZWNvZmYgXAorCWVsZiBcCisJZXZheCBcCisJaHAzMDAgXAorCWllZWUgXAorCXZtcworCisKKyMgVGhpcyBpcyBhbiBzaCBjYXNlIHdoaWNoIHNldHMgdmFsaWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIENQVQorIyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBjIGFuZCB0aGUgT1MgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgbworIyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBoZWxwcyBjdXRzIGRvd24gb24gdGhlIGFtb3VudCBvZiBkZXBlbmRlbmN5CisjIGluZm9ybWF0aW9uLgorCitDUFVfT0JKX1ZBTElEID0gXAorCXZhbGlkPSA7IFwKKwljYXNlICQkbyBpbiBcCisJYW91dCkgXAorCSAgY2FzZSAkJGMgaW4gXAorCSAgYTI5ayB8IGFybSB8IGkzODYgfCBpODYwIHwgbTY4ayB8IG1pcHMgfCBuczMyayB8IHNwYXJjIHwgdGFob2UgfCB0aWMzMCB8IHZheCkgXAorCSAgICB2YWxpZD15ZXMgOzsgXAorCSAgZXNhYyA7OyBcCisJYm91dCkgXAorCSAgY2FzZSAkJGMgaW4gXAorCSAgaTk2MCkgdmFsaWQ9eWVzIDs7IFwKKwkgIGVzYWMgOzsgXAorCWNvZmYpIHZhbGlkPXllcyA7OyBcCisJZWNvZmYpIFwKKwkgIGNhc2UgJCRjIGluIFwKKwkgIG1pcHMgfCBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKKwkgIGVzYWMgOzsgXAorCWVsZikgdmFsaWQ9eWVzIDs7IFwKKwlldmF4KSBcCisJICBjYXNlICQkYyBpbiBcCisJICBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKKwkgIGVzYWMgOzsgXAorCWhwMzAwKSBcCisJICBjYXNlICQkYyBpbiBcCisJICBtNjhrKSB2YWxpZD15ZXMgOzsgXAorCSAgZXNhYyA7OyBcCisJdm1zKSBcCisJICBjYXNlICQkYyBpbiBcCisJICB2YXgpIHZhbGlkPXllcyA7OyBcCisJICBlc2FjIDs7IFwKKwllc2FjOworCisKKyMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCisKK0NQVV9NVUxUSV9WQUxJRCA9IFwKKwl2YWxpZD0gOyBcCisJY2FzZSAkJGMgaW4gXAorCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAorCWVzYWM7CisKKworIyBSZWd1bGFyIHNvdXJjZSBmaWxlcy4KKworR0FTX0NGSUxFUyA9IFwKKwlhcHAuYyBcCisJYXMuYyBcCisJYXRvZi1nZW5lcmljLmMgXAorCWJpZ251bS1jb3B5LmMgXAorCWNvbmQuYyBcCisJZGVwZW5kLmMgXAorCWVjb2ZmLmMgXAorCWVob3B0LmMgXAorCWV4cHIuYyBcCisJZmxvbnVtLWNvcHkuYyBcCisJZmxvbnVtLWtvbnN0LmMgXAorCWZsb251bS1tdWx0LmMgXAorCWZyYWdzLmMgXAorCWhhc2guYyBcCisJaW5wdXQtZmlsZS5jIFwKKwlpbnB1dC1zY3J1Yi5jIFwKKwlsaXN0aW5nLmMgXAorCWxpdGVyYWwuYyBcCisJbWFjcm8uYyBcCisJbWVzc2FnZXMuYyBcCisJb3V0cHV0LWZpbGUuYyBcCisJcmVhZC5jIFwKKwlzYi5jIFwKKwlzdGFicy5jIFwKKwlzdWJzZWdzLmMgXAorCXN5bWJvbHMuYyBcCisJd3JpdGUuYworCisKK0NGSUxFUyA9ICQoR0FTX0NGSUxFUykgZ2FzcC5jIGl0Ymwtb3BzLmMKKworSEZJTEVTID0gXAorCWFzLmggXAorCWFzaW50bC5oIFwKKwliaWdudW0uaCBcCisJYml0X2ZpeC5oIFwKKwljZ2VuLmggXAorCWVjb2ZmLmggXAorCWVtdWwtdGFyZ2V0LmggXAorCWVtdWwuaCBcCisJZXhwci5oIFwKKwlmbG9udW0uaCBcCisJZnJhZ3MuaCBcCisJaGFzaC5oIFwKKwlpbnB1dC1maWxlLmggXAorCWl0Ymwtb3BzLmggXAorCWxpc3RpbmcuaCBcCisJbWFjcm8uaCBcCisJb2JqLmggXAorCW91dHB1dC1maWxlLmggXAorCXJlYWQuaCBcCisJc2IuaCBcCisJc3RydWMtc3ltYm9sLmggXAorCXN1YnNlZ3MuaCBcCisJc3ltYm9scy5oIFwKKwl0Yy5oIFwKKwl3cml0ZS5oCisKKworIyBDUFUgZmlsZXMgaW4gY29uZmlnLgorCitUQVJHRVRfQ1BVX0NGSUxFUyA9IFwKKwljb25maWcvdGMtYTI5ay5jIFwKKwljb25maWcvdGMtYWxwaGEuYyBcCisJY29uZmlnL3RjLWFyYy5jIFwKKwljb25maWcvdGMtYXJtLmMgXAorCWNvbmZpZy90Yy1kMTB2LmMgXAorCWNvbmZpZy90Yy1kMzB2LmMgXAorCWNvbmZpZy90Yy1oODMwMC5jIFwKKwljb25maWcvdGMtaDg1MDAuYyBcCisJY29uZmlnL3RjLWhwcGEuYyBcCisJY29uZmlnL3RjLWkzODYuYyBcCisJY29uZmlnL3RjLWk4NjAuYyBcCisJY29uZmlnL3RjLWk5NjAuYyBcCisJY29uZmlnL3RjLW0zMnIuYyBcCisJY29uZmlnL3RjLW02OGsuYyBcCisJY29uZmlnL3RjLW04OGsuYyBcCisJY29uZmlnL3RjLW1jb3JlLmMgXAorCWNvbmZpZy90Yy1taXBzLmMgXAorCWNvbmZpZy90Yy1tbjEwMjAwLmMgXAorCWNvbmZpZy90Yy1tbjEwMzAwLmMgXAorCWNvbmZpZy90Yy1uczMyay5jIFwKKwljb25maWcvdGMtcHBjLmMgXAorCWNvbmZpZy90Yy1zaC5jIFwKKwljb25maWcvdGMtc3BhcmMuYyBcCisJY29uZmlnL3RjLXRhaG9lLmMgXAorCWNvbmZpZy90Yy10aWMzMC5jIFwKKwljb25maWcvdGMtdGljODAuYyBcCisJY29uZmlnL3RjLXZheC5jIFwKKwljb25maWcvdGMtdzY1LmMgXAorCWNvbmZpZy90Yy12ODUwLmMgXAorCWNvbmZpZy90Yy16OGsuYworCisKK1RBUkdFVF9DUFVfSEZJTEVTID0gXAorCWNvbmZpZy90Yy1hMjlrLmggXAorCWNvbmZpZy90Yy1hbHBoYS5oIFwKKwljb25maWcvdGMtYXJjLmggXAorCWNvbmZpZy90Yy1hcm0uaCBcCisJY29uZmlnL3RjLWQxMHYuaCBcCisJY29uZmlnL3RjLWQzMHYuaCBcCisJY29uZmlnL3RjLWg4MzAwLmggXAorCWNvbmZpZy90Yy1oODUwMC5oIFwKKwljb25maWcvdGMtaHBwYS5oIFwKKwljb25maWcvdGMtaTM4Ni5oIFwKKwljb25maWcvdGMtaTg2MC5oIFwKKwljb25maWcvdGMtaTk2MC5oIFwKKwljb25maWcvdGMtbTMyci5oIFwKKwljb25maWcvdGMtbTY4ay5oIFwKKwljb25maWcvdGMtbTg4ay5oIFwKKwljb25maWcvdGMtbWNvcmUuaCBcCisJY29uZmlnL3RjLW1pcHMuaCBcCisJY29uZmlnL3RjLW1uMTAyMDAuaCBcCisJY29uZmlnL3RjLW1uMTAzMDAuaCBcCisJY29uZmlnL3RjLW5zMzJrLmggXAorCWNvbmZpZy90Yy1wcGMuaCBcCisJY29uZmlnL3RjLXNoLmggXAorCWNvbmZpZy90Yy1zcGFyYy5oIFwKKwljb25maWcvdGMtdGFob2UuaCBcCisJY29uZmlnL3RjLXRpYzMwLmggXAorCWNvbmZpZy90Yy10aWM4MC5oIFwKKwljb25maWcvdGMtdmF4LmggXAorCWNvbmZpZy90Yy13NjUuaCBcCisJY29uZmlnL3RjLXY4NTAuaCBcCisJY29uZmlnL3RjLXo4ay5oCisKKworIyBPQkogZmlsZXMgaW4gY29uZmlnCisKK09CSl9GT1JNQVRfQ0ZJTEVTID0gXAorCWNvbmZpZy9vYmotYW91dC5jIFwKKwljb25maWcvb2JqLWJvdXQuYyBcCisJY29uZmlnL29iai1jb2ZmLmMgXAorCWNvbmZpZy9vYmotZWNvZmYuYyBcCisJY29uZmlnL29iai1lbGYuYyBcCisJY29uZmlnL29iai1ldmF4LmMgXAorCWNvbmZpZy9vYmotaHAzMDAuYyBcCisJY29uZmlnL29iai1pZWVlLmMgXAorCWNvbmZpZy9vYmotc29tLmMgXAorCWNvbmZpZy9vYmotdm1zLmMKKworCitPQkpfRk9STUFUX0hGSUxFUyA9IFwKKwljb25maWcvb2JqLWFvdXQuaCBcCisJY29uZmlnL29iai1ib3V0LmggXAorCWNvbmZpZy9vYmotY29mZi5oIFwKKwljb25maWcvb2JqLWVjb2ZmLmggXAorCWNvbmZpZy9vYmotZWxmLmggXAorCWNvbmZpZy9vYmotZXZheC5oIFwKKwljb25maWcvb2JqLWhwMzAwLmggXAorCWNvbmZpZy9vYmotaWVlZS5oIFwKKwljb25maWcvb2JqLXNvbS5oIFwKKwljb25maWcvb2JqLXZtcy5oCisKKworIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZworCitUQVJHX0VOVl9IRklMRVMgPSBcCisJY29uZmlnL3RlLTM4NmJzZC5oIFwKKwljb25maWcvdGUtYXV4LmggXAorCWNvbmZpZy90ZS1kZWx0YS5oIFwKKwljb25maWcvdGUtZGVsdDg4LmggXAorCWNvbmZpZy90ZS1kcHgyLmggXAorCWNvbmZpZy90ZS1keW5peC5oIFwKKwljb25maWcvdGUtZ2VuZXJpYy5oIFwKKwljb25maWcvdGUtZ28zMi5oIFwKKwljb25maWcvdGUtaHAzMDAuaCBcCisJY29uZmlnL3RlLWhwcGEuaCBcCisJY29uZmlnL3RlLWkzODZhaXguaCBcCisJY29uZmlnL3RlLWljOTYwLmggXAorCWNvbmZpZy90ZS1saW51eC5oIFwKKwljb25maWcvdGUtbG5ld3MuaCBcCisJY29uZmlnL3RlLWx5bnguaCBcCisJY29uZmlnL3RlLW1hY2guaCBcCisJY29uZmlnL3RlLW1hY29zLmggXAorCWNvbmZpZy90ZS1tdWx0aS5oIFwKKwljb25maWcvdGUtbmJzZC5oIFwKKwljb25maWcvdGUtbmJzZDUzMi5oIFwKKwljb25maWcvdGUtcGM1MzJtYWNoLmggXAorCWNvbmZpZy90ZS1wZS5oIFwKKwljb25maWcvdGUtcHBjbncuaCBcCisJY29uZmlnL3RlLXBzb3MuaCBcCisJY29uZmlnL3RlLXJpc2NpeC5oIFwKKwljb25maWcvdGUtc3BhcmNhb3V0LmggXAorCWNvbmZpZy90ZS1zdW4zLmggXAorCWNvbmZpZy90ZS1zdnI0LmggXAorCWNvbmZpZy90ZS1zeXN2MzIuaAorCisKKyMgTXVsdGkgZmlsZXMgaW4gY29uZmlnCisKK01VTFRJX0NGSUxFUyA9IFwKKwljb25maWcvZS1pMzg2Y29mZi5jIFwKKwljb25maWcvZS1pMzg2ZWxmLmMgXAorCWNvbmZpZy9lLW1pcHNlY29mZi5jIFwKKwljb25maWcvZS1taXBzZWxmLmMKKworCitDT05GSUdfT0JKUyA9IFwKKwkkKFRBUkdfQ1BVX08pIFwKKwkkKE9CSl9GT1JNQVRfTykgXAorCSQoQVRPRl9UQVJHX08pIFwKKwkkKGV4dHJhX29iamVjdHMpCisKKworR0VORVJJQ19PQkpTID0gXAorCWFwcC5vIFwKKwlhcy5vIFwKKwlhdG9mLWdlbmVyaWMubyBcCisJYmlnbnVtLWNvcHkubyBcCisJY29uZC5vIFwKKwlkZXBlbmQubyBcCisJZWhvcHQubyBcCisJZXhwci5vIFwKKwlmbG9udW0ta29uc3QubyBcCisJZmxvbnVtLWNvcHkubyBcCisJZmxvbnVtLW11bHQubyBcCisJZnJhZ3MubyBcCisJaGFzaC5vIFwKKwlpbnB1dC1maWxlLm8gXAorCWlucHV0LXNjcnViLm8gXAorCWxpdGVyYWwubyBcCisJbWVzc2FnZXMubyBcCisJb3V0cHV0LWZpbGUubyBcCisJcmVhZC5vIFwKKwlzdWJzZWdzLm8gXAorCXN5bWJvbHMubyBcCisJd3JpdGUubyBcCisJbGlzdGluZy5vIFwKKwllY29mZi5vIFwKKwlzdGFicy5vIFwKKwlzYi5vIFwKKwltYWNyby5vCisKKworT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQorCitQT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCisJJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAorCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQorCisKK25vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldworbm9pbnN0X1NDUklQVFMgPSAuZ2RiaW5pdAorCitFWFRSQV9ESVNUID0gbWFrZS1nYXMuY29tCisKK0RJU1RTVFVGRiA9IG1ha2UtZ2FzLmNvbSBtNjhrLXBhcnNlLmMgaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCBpdGJsLWxleC5jCisKK0RJU1RDTEVBTkZJTEVTID0gdGFyZy1jcHUuaCBvYmotZm9ybWF0LmggdGFyZy1lbnYuaCBpdGJsLWNwdS5oIGNnZW4tZGVzYy5oCisKKyMgTm93IGZpZ3VyZSBvdXQgZnJvbSB0aG9zZSB2YXJpYWJsZXMgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsuCisKK0JBU0VESVIgPSAkKHNyY2RpcikvLi4KK0JGRERJUiA9ICQoQkFTRURJUikvYmZkCitJTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKKworIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSBhY3R1YWxseSB1c2VkIHdoZW4gd2UgY29tcGlsZS4KKyMgU3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcy4KKyMgQm90aCAuIGFuZCBzcmNkaXIgYXJlIHVzZWQsIGluIHRoYXQgb3JkZXIsCisjIHNvIHRoYXQgdG0uaCBhbmQgY29uZmlnLmggd2lsbCBiZSBmb3VuZCBpbiB0aGUgY29tcGlsYXRpb24KKyMgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoc3JjZGlyKS9jb25maWcgLUkkKElOQ0RJUikgLUkkKHNyY2RpcikvLi4gLUkkKEJGRERJUikgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgorCisjIFRoaXMgc2hvdWxkIGJlIHBhcmFsbGVsIHRvIElOQ0xVREVTLCBidXQgc2hvdWxkIHJlcGxhY2UgJChzcmNkaXIpCisjIHdpdGggJCR7c3JjZGlyfSwgYW5kIHNob3VsZCB3b3JrIGluIGEgc3ViZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkCisjIHdoZW4gYnVpbGRpbmcgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHRoZSBkZXBlbmRlbmN5IGJ1aWxkaW5nIGlzIGRvbmUKKyMgaW4gYSBzdWJkaXJlY3RvcnkuCitERVBfSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkIC1JJCR7c3JjZGlyfS9jb25maWcgLUkkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgLUkkJHtzcmNkaXJ9Ly4uIC1JJCR7c3JjZGlyfS8uLi9iZmQgLUkkJHtzcmNkaXJ9Ly4uL2ludGwgLUkuLi8uLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKKworIyBIb3cgdG8gbGluayB3aXRoIGJvdGggb3VyIHNwZWNpYWwgbGlicmFyeSBmYWNpbGl0aWVzCisjIGFuZCB0aGUgc3lzdGVtJ3MgaW5zdGFsbGVkIGxpYnJhcmllcy4KKworR0FTTElCUyA9IEBPUENPREVTX0xJQkAgQEJGRExJQkAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCisKKyMgRmlsZXMgdG8gYmUgY29waWVkIGF3YXkgYWZ0ZXIgZWFjaCBzdGFnZSBpbiBidWlsZGluZy4KK1NUQUdFU1RVRkYgPSAqLm8gJChub2luc3RfUFJPR1JBTVMpCisKK2FzX25ld19TT1VSQ0VTID0gJChHQVNfQ0ZJTEVTKQorYXNfbmV3X0xEQUREID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAorCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExMSUJTKQorCithc19uZXdfREVQRU5ERU5DSUVTID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAorCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExERVBTKQorCisKK2dhc3BfbmV3X1NPVVJDRVMgPSBnYXNwLmMgbWFjcm8uYyBzYi5jIGhhc2guYworZ2FzcF9uZXdfTERBREQgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKK2dhc3BfbmV3X0RFUEVOREVOQ0lFUyA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQorCitFWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAorICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IDsgXAorICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworCitSVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAorCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKKwkgICBmaWAKKworUlVOVEVTVEZMQUdTID0gCisKKyMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCisKK0VYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQorCisjIHN0YW5kLWFsb25lIGl0YmwgYXNzZW1ibGVyICYgZGlzYXNzZW1ibGVyCisKK0VYVFJBX1BST0dSQU1TID0gaXRibC10ZXN0CitpdGJsX3Rlc3RfU09VUkNFUyA9IGl0YmwtcGFyc2UueSBpdGJsLWxleC5sCitpdGJsX3Rlc3RfTERBREQgPSBpdGJsLXRlc3Qtb3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAorCisjIENHRU4gaW50ZXJmYWNlLgorCitDR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAorCisjIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KKworTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAorCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKKwl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgorCisKK0NMRUFORklMRVMgPSBkZXAuc2VkIC50Y2RlcCAub2JqZGVwIC5kZXAyIC5kZXAxIC5kZXBhIC5kZXAgLmRlcGRpcgorCithZ2FpbnN0ID0gc3RhZ2UyCisKKyMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQorIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCisjIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgorCitERVBfRklMRV9ERVBTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCisJJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0NGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKKworCitUQ0RFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKKworVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKKworVENERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAorCitUQ0RFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAorICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKKworVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCisgIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCisgICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYworCitUQ0RFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKKworVENERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCisgICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYworCitUQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKKyAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCisKK1RDREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKKyAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorCitUQ0RFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCisKK1RDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCisKK1RDREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCisKK1RDREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAorICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKKworVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAorICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCisKK1RDREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKKworVENERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCisKK1RDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCisgIGNnZW4uaAorCitUQ0RFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCisgIGNnZW4uaAorCitUQ0RFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKKworVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCisKK1RDREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCisKK1RDREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCisKK1RDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAorCitUQ0RFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAorICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKKworVENERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS9pMzg2LmgKKworVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKKworVENERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCisKK1RDREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAorCitUQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCisKK1RDREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKKworVENERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAorCitUQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCisKK1RDREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCisgICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCisKK1RDREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCisgIGNnZW4uaAorCitUQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKKyAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCisgIGNnZW4uaAorCitUQ0RFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAorCitUQ0RFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCisgICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCisKK1RDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAorCitUQ0RFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAorICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCisgICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCisKK1RDREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAorCitUQ0RFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpL2NvbmZpZy9tODhrLW9wY29kZS5oCisKK1RDREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oCisKK1RDREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKKyAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKKworVENERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS9taXBzLmggaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKKyAgJChJTkNESVIpL2NvZmYvZWNvZmYuaAorCitUQ0RFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIFwKKyAgaXRibC1vcHMuaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKKworVENERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAorICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCisgIGl0Ymwtb3BzLmgKKworVENERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggXAorICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVjb2ZmLmggXAorICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCisKK1RDREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKKworVENERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCisKK1RDREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKKworVENERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCisKK1RDREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworVENERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCAkKElOQ0RJUikvb2JzdGFjay5oCisKK1RDREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCisKK1RDREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKKworVENERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oICQoSU5DRElSKS9lbGYvcHBjLmggXAorICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCisKK1RDREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCisKK1RDREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCisKK1RDREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS9zcGFyYy5oCisKK1RDREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAorCitUQ0RFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKKyAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorCitUQ0RFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKKyAgJChJTkNESVIpL29wY29kZS90YWhvZS5oCisKK1RDREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAorCitUQ0RFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggJChJTkNESVIpL29ic3RhY2suaCBcCisgICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAorCitUQ0RFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKKworVENERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCisKK1RDREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKKworVENERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCisKK1RDREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmgKKworVENERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKKworVENERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAorCitUQ0RFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKKworVENERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAorCitUQ0RFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKKworVENERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy93NjUtb3BjLmgKKworVENERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAorCitUQ0RFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKKworVENERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oIFwKKyAgJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK1RDREVQX3o4a19lbGYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggXAorICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAorCitUQ0RFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCBcCisgICQoQkZERElSKS9zb20uaAorCitUQ0RFUF9pMzg2X211bHRpID0gJChUQ0RFUF9pMzg2X2NvZmYpICQoVENERVBfaTM4Nl9lbGYpCitUQ0RFUF9taXBzX211bHRpID0gJChUQ0RFUF9taXBzX2NvZmYpICQoVENERVBfbWlwc19lY29mZikgXAorICAkKFRDREVQX21pcHNfZWxmKQorCitPQkpERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorCitPQkpERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF9hbHBoYV9lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKKyAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKEJGRERJUikvbGliZWNvZmYuaAorCitPQkpERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKKyAgJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAorICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKK09CSkRFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfYXJtX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9kMTB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX2QzMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2Lmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKKyAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKKyAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF9pMzg2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorCitPQkpERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCisKK09CSkRFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggXAorICAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCisKK09CSkRFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKKyAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKEJGRERJUikvbGliZWNvZmYuaAorCitPQkpERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCisgICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCisgICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorCitPQkpERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaAorCitPQkpERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKKworT0JKREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oCisKK09CSkRFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAorCitPQkpERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4Lmggc3Vic2Vncy5oIFwKKyAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAorCitPQkpERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmgKKworT0JKREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKKworT0JKREVQX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCisKK09CSkRFUF96OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBzdWJzZWdzLmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCisKK09CSkRFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvc29tLmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCisKK09CSkRFUF9pMzg2X211bHRpID0gJChPQkpERVBfaTM4Nl9jb2ZmKSAkKE9CSkRFUF9pMzg2X2VsZikKK09CSkRFUF9taXBzX211bHRpID0gJChPQkpERVBfbWlwc19jb2ZmKSAkKE9CSkRFUF9taXBzX2Vjb2ZmKSBcCisgICQoT0JKREVQX21pcHNfZWxmKQorCitERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaAorCitERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCisgIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAorCitERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCisKK0RFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAorREVQX2FyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmgKKworREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaAorCitERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX2QxMHZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMTB2LmgKKworREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oCisKK0RFUF9mcjMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaAorCitERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaAorCitERVBfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaAorCitERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCisgICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorCitERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaAorCitERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaAorCitERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCitERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmgKKworREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oCisKK0RFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9tNjhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oCisKK0RFUF9tNjhrX2hwMzAwID0gJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuaCAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggXAorICAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9tODhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oCisKK0RFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oCisKK0RFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAorICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCisgIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAorCitERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaAorCitERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmgKKworREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oCisKK0RFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfbnMzMmtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oCisKK0RFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmgKKworREVQX3NoX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zaC5oICQoQkZERElSKS9saWJjb2ZmLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKKworREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKKyAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCisKK0RFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCisKK0RFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfdGljMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAorCitERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAorICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmgKKworREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaAorCitERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF92YXhfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaAorCitERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAorICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCisKK0RFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmgKKworREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCisgICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCisKK0RFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oCisKK0RFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKKyAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaAorCitERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKKworREVQX2hwcGFfc29tID0gJChCRkRESVIpL3NvbS5oCitERVBfaTM4Nl9tdWx0aSA9ICQoREVQX2kzODZfY29mZikgJChERVBfaTM4Nl9lbGYpCitERVBfbWlwc19tdWx0aSA9ICQoREVQX21pcHNfY29mZikgJChERVBfbWlwc19lY29mZikgXAorICAkKERFUF9taXBzX2VsZikKKworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSAgLmdkYmluaXQKK25vaW5zdF9QUk9HUkFNUyA9ICBhcy1uZXckKEVYRUVYVCkgZ2FzcC1uZXckKEVYRUVYVCkKK1BST0dSQU1TID0gICQobm9pbnN0X1BST0dSQU1TKQorCisKK0RFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitMREZMQUdTID0gQExERkxBR1NACitMSUJTID0gQExJQlNACitpdGJsX3Rlc3RfT0JKRUNUUyA9ICBpdGJsLXBhcnNlLm8gaXRibC1sZXgubworaXRibF90ZXN0X0RFUEVOREVOQ0lFUyA9ICBpdGJsLXRlc3Qtb3BzLm8gaXRibC10ZXN0Lm8gXAorLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCitpdGJsX3Rlc3RfTERGTEFHUyA9IAorYXNfbmV3X09CSkVDVFMgPSAgYXBwLm8gYXMubyBhdG9mLWdlbmVyaWMubyBiaWdudW0tY29weS5vIGNvbmQubyBcCitkZXBlbmQubyBlY29mZi5vIGVob3B0Lm8gZXhwci5vIGZsb251bS1jb3B5Lm8gZmxvbnVtLWtvbnN0Lm8gXAorZmxvbnVtLW11bHQubyBmcmFncy5vIGhhc2gubyBpbnB1dC1maWxlLm8gaW5wdXQtc2NydWIubyBsaXN0aW5nLm8gXAorbGl0ZXJhbC5vIG1hY3JvLm8gbWVzc2FnZXMubyBvdXRwdXQtZmlsZS5vIHJlYWQubyBzYi5vIHN0YWJzLm8gXAorc3Vic2Vncy5vIHN5bWJvbHMubyB3cml0ZS5vCithc19uZXdfTERGTEFHUyA9IAorZ2FzcF9uZXdfT0JKRUNUUyA9ICBnYXNwLm8gbWFjcm8ubyBzYi5vIGhhc2gubworZ2FzcF9uZXdfTERGTEFHUyA9IAorU0NSSVBUUyA9ICAkKG5vaW5zdF9TQ1JJUFRTKQorCitMRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAorTEVYTElCID0gQExFWExJQkAKK1lMV1JBUCA9ICQodG9wX3NyY2RpcikvLi4veWx3cmFwCitDRkxBR1MgPSBAQ0ZMQUdTQAorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0RJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ09QWUlORyBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gXAorTWFrZWZpbGUuaW4gTkVXUyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBjb25maWcuaW4gY29uZmlnL202OGstcGFyc2UuYyBcCitjb25maWd1cmUgY29uZmlndXJlLmluIGdkYmluaXQuaW4gaXRibC1sZXguYyBpdGJsLXBhcnNlLmMKKworCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCitUQVIgPSB0YXIKK0daSVBfRU5WID0gLS1iZXN0CitTT1VSQ0VTID0gJChpdGJsX3Rlc3RfU09VUkNFUykgJChhc19uZXdfU09VUkNFUykgJChFWFRSQV9hc19uZXdfU09VUkNFUykgJChnYXNwX25ld19TT1VSQ0VTKQorT0JKRUNUUyA9ICQoaXRibF90ZXN0X09CSkVDVFMpICQoYXNfbmV3X09CSkVDVFMpICQoZ2FzcF9uZXdfT0JKRUNUUykKKworYWxsOiBhbGwtcmVkaXJlY3QKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLlMgLmMgLmwgLmxvIC5vIC5zIC55CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKKwljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQorCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCisJY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCisKK2NvbmZpZy5oOiBzdGFtcC1oCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJCXJtIC1mIHN0YW1wLWg7IFwKKwkJJChNQUtFKSBzdGFtcC1oOyBcCisJZWxzZSA6OyBmaQorc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCisJICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKwlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAorJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCisJCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKKwllbHNlIDo7IGZpCiskKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKKwlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKKworbW9zdGx5Y2xlYW4taGRyOgorCitjbGVhbi1oZHI6CisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGNvbmZpZy5oCisKK21haW50YWluZXItY2xlYW4taGRyOgorLmdkYmluaXQ6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzIGdkYmluaXQuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgQ09ORklHX0ZJTEVTPSRAOmdkYmluaXQuaW4gQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCittb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUzoKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCisKK2Rpc3RjbGVhbi1ub2luc3RQUk9HUkFNUzoKKworbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUzoKKworLmMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKKy5zLm86CisJJChDT01QSUxFKSAtYyAkPAorCisuUy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCisKK2NsZWFuLWNvbXBpbGU6CisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK21haW50YWluZXItY2xlYW4tY29tcGlsZToKKworLmMubG86CisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8CisKKy5zLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAorCisuUy5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisKK21haW50YWluZXItY2xlYW4tbGlidG9vbDoKKworaXRibC10ZXN0JChFWEVFWFQpOiAkKGl0YmxfdGVzdF9PQkpFQ1RTKSAkKGl0YmxfdGVzdF9ERVBFTkRFTkNJRVMpCisJQHJtIC1mIGl0YmwtdGVzdCQoRVhFRVhUKQorCSQoTElOSykgJChpdGJsX3Rlc3RfTERGTEFHUykgJChpdGJsX3Rlc3RfT0JKRUNUUykgJChpdGJsX3Rlc3RfTERBREQpICQoTElCUykKKworYXMtbmV3JChFWEVFWFQpOiAkKGFzX25ld19PQkpFQ1RTKSAkKGFzX25ld19ERVBFTkRFTkNJRVMpCisJQHJtIC1mIGFzLW5ldyQoRVhFRVhUKQorCSQoTElOSykgJChhc19uZXdfTERGTEFHUykgJChhc19uZXdfT0JKRUNUUykgJChhc19uZXdfTERBREQpICQoTElCUykKKworZ2FzcC1uZXckKEVYRUVYVCk6ICQoZ2FzcF9uZXdfT0JKRUNUUykgJChnYXNwX25ld19ERVBFTkRFTkNJRVMpCisJQHJtIC1mIGdhc3AtbmV3JChFWEVFWFQpCisJJChMSU5LKSAkKGdhc3BfbmV3X0xERkxBR1MpICQoZ2FzcF9uZXdfT0JKRUNUUykgJChnYXNwX25ld19MREFERCkgJChMSUJTKQorLmwuYzoKKwkkKExFWCkgJChBTV9MRkxBR1MpICQoTEZMQUdTKSAkPCAmJiBtdiAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQAorLnkuYzoKKwkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQ8IHkudGFiLmMgJCouYyB5LnRhYi5oICQqLmggLS0gJChBTV9ZRkxBR1MpICQoWUZMQUdTKQorY29uZmlnL202OGstcGFyc2UuaDogY29uZmlnL202OGstcGFyc2UuYworaXRibC1wYXJzZS5oOiBpdGJsLXBhcnNlLmMKKworCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorCitAU0VUX01BS0VACisKK2FsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKK2luc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCittb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAorCWRvbmU7IFwKKwl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCisKK3RhZ3M6IFRBR1MKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKKwkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKKwkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQorCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKyAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisgICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAorCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKKworbW9zdGx5Y2xlYW4tdGFnczoKKworY2xlYW4tdGFnczoKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQKKworbWFpbnRhaW5lci1jbGVhbi10YWdzOgorCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKKworIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgorIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgorIyB0YXJmaWxlLgorZGlzdGNoZWNrOiBkaXN0CisJLXJtIC1yZiAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6CisJbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKKwlta2RpciAkKGRpc3RkaXIpLz1pbnN0CisJZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKKwljZCAkKGRpc3RkaXIpLz1idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKKwktcm0gLXJmICQoZGlzdGRpcikKKwlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAorCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCisJZWNobyAiJCRkYXNoZXMiOyBcCisJZWNobyAiJCRiYW5uZXIiOyBcCisJZWNobyAiJCRkYXNoZXMiCitkaXN0OiBkaXN0ZGlyCisJLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQorCS1ybSAtcmYgJChkaXN0ZGlyKQorZGlzdC1hbGw6IGRpc3RkaXIKKwktY2htb2QgLVIgYStyICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCisJLXJtIC1yZiAkKGRpc3RkaXIpCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwktcm0gLXJmICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpCisJLWNobW9kIDc3NyAkKGRpc3RkaXIpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAorCSAgZmk7IFwKKwlkb25lCisJZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKworREVKQVRPT0wgPSAkKFBBQ0tBR0UpCisKK1JVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKK3NpdGUuZXhwOiBNYWtlZmlsZQorCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKKwlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCisJQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10CisJQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAorCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAorCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAorCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAorCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10CisJQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKKwlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKKwlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKKwlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAorCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10CisJQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10CisJQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKKwlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCisJQG12ICRALXQgc2l0ZS5leHAKK2luZm8tYW06CitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorZHZpLWFtOgorZHZpOiBkdmktcmVjdXJzaXZlCitjaGVjay1hbToKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCitjaGVjazogY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsY2hlY2stYW06CitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtaW5mby1hbTogCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKK2FsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtZXhlYy1sb2NhbAoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCisKK2luc3RhbGwtZGF0YS1hbToKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK3VuaW5zdGFsbC1hbToKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKFNDUklQVFMpIGNvbmZpZy5oCithbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgorCisKK21vc3RseWNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgorCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICJpdGJsLWxleGxjb25maWcvbTY4ay1wYXJzZWhjb25maWcvbTY4ay1wYXJzZWNpdGJsLXBhcnNlaGl0YmwtcGFyc2VjIiB8fCBybSAtZiBpdGJsLWxleGwgY29uZmlnL202OGstcGFyc2VoIGNvbmZpZy9tNjhrLXBhcnNlYyBpdGJsLXBhcnNlaCBpdGJsLXBhcnNlYworbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAorCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCQltb3N0bHljbGVhbi10YWdzIG1vc3RseWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RQUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAorCQljbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KKworY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitkaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCisJCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIFwKKwkJY2xlYW4tYW0KKwktcm0gLWYgbGlidG9vbAorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCittYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAorCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCisJCW1haW50YWluZXItY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCQlkaXN0Y2xlYW4tYW0KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCisuUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCittb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAorY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCittb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAorbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAorY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCit1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCit1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKK2FsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgXAorZHZpLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAorbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKK2Rpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCitpbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKK2luc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAoraW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gXAoraW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKK2luc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KKworcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKKwlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKKwkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KKworJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCitzdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKKwlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KKwl0b3VjaCBzdGFtcC1tay5jb20KK2Rpc3RzdHVmZjogJChESVNUU1RVRkYpIGluZm8KKworJChPQkpTKTogQEFMTF9PQkpfREVQU0AKKworIyBTdHVmZiB0aGF0IGV2ZXJ5IG9iamVjdCBmaWxlIGRlcGVuZHMgdXBvbi4gIElmIGFueXRoaW5nIGlzIHJlbW92ZWQKKyMgZnJvbSB0aGlzIGxpc3QsIHJlbW92ZSBpdCBmcm9tIGRlcC1pbi5zZWQgYXMgd2VsbC4KKyQoT0JKUyk6IGNvbmZpZy5oIGFzLmggJChUQVJHX0VOVl9IKSAkKE9CSl9GT1JNQVRfSCkgJChUQVJHX0NQVV9IKSBmbG9udW0uaCBcCisJZXhwci5oIHN0cnVjLXN5bWJvbC5oIHdyaXRlLmggZnJhZ3MuaCBoYXNoLmggcmVhZC5oIHN5bWJvbHMuaCB0Yy5oIFwKKwlvYmouaCBsaXN0aW5nLmggYmlnbnVtLmggYml0X2ZpeC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBhc2ludGwuaAorCitjaGVjay1ERUpBR05VOiBzaXRlLmV4cAorCWlmIFsgLWQgdGVzdHN1aXRlIF07IHRoZW4gXAorCSAgdHJ1ZTsgXAorCWVsc2UgXAorCSAgbWtkaXIgdGVzdHN1aXRlOyBcCisJZmkKKwlybSAtZiB0ZXN0c3VpdGUvc2l0ZS5leHAKKwljcCBzaXRlLmV4cCB0ZXN0c3VpdGUvc2l0ZS5leHAKKwlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7IFwKKwlzcmNkaXI9YGNkICR7c3JjZGlyfTsgcHdkYCA7IGV4cG9ydCBzcmNkaXIgOyBcCisJRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBcCisJaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKKwkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKKwkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAorCWZpOyBcCisJcnVudGVzdD0kKFJVTlRFU1QpOyBcCisJY2QgdGVzdHN1aXRlOyBcCisJaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNkaXJ9L3Rlc3RzdWl0ZSBcCisJCSQoUlVOVEVTVEZMQUdTKTsgXAorCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCisJZmkKKworIyBUaGUgaW1wbGljaXQgLmMubyBydWxlIGRvZXNuJ3Qgd29yayBmb3IgdGhlc2UsIHBlcmhhcHMgYmVjYXVzZSBvZgorIyB0aGUgdmFyaWFibGVzLCBvciBwZXJoYXBzIGJlY2F1c2UgdGhlIHNvdXJjZXMgYXJlIG5vdCBvbiB2cGF0aC4KKyQoVEFSR19DUFVfTyk6ICQoVEFSR19DUFVfQykgJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApCisJJChDT01QSUxFKSAtYyAkKFRBUkdfQ1BVX0MpCiskKEFUT0ZfVEFSR19PKTogJChBVE9GX1RBUkdfQykKKwkkKENPTVBJTEUpIC1jICQoQVRPRl9UQVJHX0MpCisKKyMgZWNvZmYuYyBvbmx5IGhhcyBmdWxsIGRlcGVuZGVuY2llcyB3aGVuIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLAorIyBzbyB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kgc3R1ZmYgZG9lc24ndCB3b3JrLgorZWNvZmYubyA6IGVjb2ZmLmMgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3N5bS5oIFwKKwkkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggXAorCSQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmgKKworIyBXZSBuZWVkIGFsbCB0aGVzZSBleHBsaWNpdCBydWxlcyBmb3IgdGhlIG11bHRpIHN0dWZmLiAgQmVjYXVzZSBvZgorIyB0aGVzZSBydWxlcywgd2UgZG9uJ3QgbmVlZCBvbmUgZm9yIE9CSl9GT1JNQVRfTy4KKworb2JqLWFvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCitvYmotYm91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKK29iai1jb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCitvYmotZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmMKK29iai1lbGYubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYworb2JqLWV2YXgubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCitvYmotaHAzMDAubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmMKK29iai1pZWVlLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYworb2JqLW11bHRpLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1tdWx0aS5jCitvYmotc29tLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKK29iai12bXMubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYworCitlLW1pcHNlbGYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMKK2UtbWlwc2Vjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKKwkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYworZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYworCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKK2UtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCisJJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jCisKKyMgSWYgbTY4ay1wYXJzZS55IGlzIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwgdGhlbiB5bHdyYXAgd2lsbCB1c2UgYW4KKyMgYWJzb2x1dGUgcGF0aCB3aGVuIGl0IGludm9rZXMgeWFjYywgd2hpY2ggd2lsbCBjYXVzZSB5YWNjIHRvIHB1dCB0aGUKKyMgYWJzb2x1dGUgcGF0aCBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gIFRoYXQncyBhIHBhaW4gd2hlbiBpdCBjb21lcworIyB0byBnZW5lcmF0aW5nIHNuYXBzaG90cywgYmVjYXVzZSBpdCBpbnRyb2R1Y2VzIHNwdXJpb3VzIGRpZmZzLgorIyBTaW5jZSB3aGVuIHdlIG1ha2UgdGhlIHNuYXBzaG90cyAkKHNyY2RpcikgPSAiLiIsIHdlIGNoZWNrIGZvciB0aGF0CisjIGNhc2UgYW5kIGhhbmRsZSBpdCBkaWZmZXJlbnRseS4gIFRoaXMgbWVhbnMgdGhhdCBhbnlib2R5IHdobworIyBjb25maWd1cmVzIHdpdGggJChzcmNkaXIpID0gIi4iIHdpbGwgaGF2ZSB0byBzZXQgdGhlaXIgcGF0aCBpbiB0aGUKKyMgZGVidWdnZXIgaWYgdGhleSB3YW50IHRvIGRlYnVnIG02OGstcGFyc2UueS4gIFRoaXMgaXMgYmFkLCBidXQgb24KKyMgdGhlIG90aGVyIGhhbmQgaXQncyBnb29kIHRoYXQgcGVvcGxlIHdobyB1c2UgdGhlIHByZWJ1aWx0CisjIG02OGstcGFyc2UuYyBkb24ndCBnZXQgYSBzcHVyaW91cyBhYnNvbHV0ZSBwYXRoLgorbTY4ay1wYXJzZS5jOiAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueQorCWY9JChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLnk7IFwKKwlpZiBbICQkZiA9ICIuL2NvbmZpZy9tNjhrLXBhcnNlLnkiIF07IHRoZW4gXAorCSAgbG4gLXMgY29uZmlnL202OGstcGFyc2UueSAuID4gL2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IFwKKwkgICBsbiBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAorCSAgIGNwIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyBcCisJICBmPW02OGstcGFyc2UueTsgXAorCWVsc2UgdHJ1ZTsgZmk7IFwKKwkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQkZiB5LnRhYi5jIG02OGstcGFyc2UuYyAtLTsgXAorCWlmIFsgJCRmID0gIm02OGstcGFyc2UueSIgXTsgdGhlbiBcCisJICBybSAtZiBtNjhrLXBhcnNlLnk7IFwKKwllbHNlIHRydWU7IGZpCittNjhrLXBhcnNlLm86IG02OGstcGFyc2UuYyAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAorCisjIERvbid0IGxldCB0aGUgLnkuaCBydWxlIGNsb2JiZXIgbTY4ay1wYXJzZS5oLgorbTY4ay1wYXJzZS5oOiA7IEB0cnVlCiskKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaDogOyBAdHJ1ZQorCisjIFRoZSBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGxleGljYWwgYW5hbHl6ZXIgYW5kIHBhcnNlci4KKworaXRibC1sZXguYzogJChzcmNkaXIpL2l0YmwtbGV4LmwKK2l0YmwtbGV4Lm86IGl0YmwtbGV4LmMgaXRibC1wYXJzZS5oCisKK2l0YmwtcGFyc2UubzogaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCAkKHNyY2RpcikvaXRibC1vcHMuaAorCitpdGJsLW9wcy5vOiAkKHNyY2RpcikvaXRibC1vcHMuYyAkKHNyY2RpcikvaXRibC1vcHMuaCBpdGJsLXBhcnNlLmgKKworaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaDogJChzcmNkaXIpL2l0YmwtcGFyc2UueQorCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJChzcmNkaXIpL2l0YmwtcGFyc2UueSB5LnRhYi5jIGl0YmwtcGFyc2UuYyB5LnRhYi5oIGl0YmwtcGFyc2UuaCAtLSAtZAorCitpdGJsLXRlc3Qtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAorCSQoQ09NUElMRSkgLW8gaXRibC10ZXN0LW9wcy5vIC1EU1RBTkRfQUxPTkUgLWMgJChzcmNkaXIpL2l0Ymwtb3BzLmMKKworaXRibC10ZXN0Lm86ICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYyAkKHNyY2RpcikvaXRibC1vcHMuaAorCSQoQ09NUElMRSkgLWMgLURTVEFORF9BTE9ORSAkKHNyY2RpcikvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKKworY2dlbi5vOiBjZ2VuLmMgY2dlbi5oIGNnZW4tZGVzYy5oIHN1YnNlZ3MuaCBcCisJJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisJJChzcmNkaXIpLy4uL29wY29kZXMvJChDR0VOX0NQVV9QUkVGSVgpLWRlc2MuaCBcCisJJChzcmNkaXIpLy4uL29wY29kZXMvJChDR0VOX0NQVV9QUkVGSVgpLW9wYy5oCisKKy5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAorLlBIT05ZOiBpbnN0YWxsLWV4ZWMtYmluZGlyIGluc3RhbGwtZXhlYy10b29sZGlyCisKK2luc3RhbGwtZXhlYy1sb2NhbDogaW5zdGFsbC1leGVjLWJpbmRpciBAaW5zdGFsbF90b29sZGlyQAorCitpbnN0YWxsLWV4ZWMtYmluZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKKwkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKQorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKKwkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCitpbnN0YWxsLWV4ZWMtdG9vbGRpcjogJChub2luc3RfUFJPR1JBTVMpCisJJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgorCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCisJaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKKwkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCisJICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAorCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKKwllbHNlIFwKKwkgIHRydWUgOyBcCisJZmkKKworIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCisKKy5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCisKK2Jvb3RzdHJhcDogYXMtbmV3CisJJChNQUtFKSBzdGFnZTEKKwlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKKwkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKKwkkKE1BS0UpIHN0YWdlMgorCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQorCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQorCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgorCitib290c3RyYXAyOgorCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQorCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQorCSQoTUFLRSkgc3RhZ2UyCisJcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCisJJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCisJJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCisKK2Jvb3RzdHJhcDM6CisJcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCisJJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCisJJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCisKKyMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCitzdGFnZTE6CisJLW1rZGlyIHN0YWdlMQorCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQorCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCisKK3N0YWdlMjoKKwktbWtkaXIgc3RhZ2UyCisJLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCisJaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKKworc3RhZ2UzOgorCS1ta2RpciBzdGFnZTMKKwktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKKwlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQorCisjIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgorIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgorIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KK2NvbXBhcmlzb246CisJeD0wIDsgXAorCWZvciBmaWxlIGluICoubyA7IGRvIFwKKwkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCisJICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAorCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKKwkgICAgICB0cnVlIDsgXAorCSAgICBlbHNlIFwKKwkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAorCSAgICAgIHg9MSA7IFwKKwkgICAgZmkgOyBcCisJICBlbHNlIHRydWU7IGZpIDsgXAorCWRvbmUgOyBcCisJZXhpdCAkJHgKKwktcm0gLWYgdG1wLWZvbyoKKworLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMworCitkZS1zdGFnZTE6CisJLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQorCS0gcm1kaXIgc3RhZ2UxCisKK2RlLXN0YWdlMjoKKwktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCisJLSBybWRpciBzdGFnZTIKKworZGUtc3RhZ2UzOgorCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKKwktIHJtZGlyIHN0YWdlMworCisuZGVwOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgLnRjZGVwIC5vYmpkZXAgLmRlcDIKKwlybSAtZiAuZGVwMQorCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCisJJChNQUtFKSBERVA9JChERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gLmRlcDEKKwlybSAtcmYgLmRlcGRpcgorCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwYQorCXNlZCAtZiBkZXAuc2VkIDwgLnRjZGVwID4+IC5kZXBhCisJc2VkIC1mIGRlcC5zZWQgPCAub2JqZGVwID4+IC5kZXBhCisJc2VkIC1mIGRlcC5zZWQgPCAuZGVwMiA+PiAuZGVwYQorCWVjaG8gJyQkKE9CSlMpOiAkJChERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCisJZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKFRDREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQorCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKE9CSkRFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKKwllY2hvICcjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVknID4+IC5kZXBhCisJJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXBhIC5kZXAKKworIyBUaGlzIHJ1bGUgbmVlZHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgorLmRlcDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKKwlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCisJc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKKwljZCAuZGVwZGlyOyBcCisJZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKKwllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCisJZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKKwllY2hvICcnID4gaXRibC1jcHUuaDsgXAorCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAorCSQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpICQ/CisJc2VkIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyA8IC5kZXBkaXIvLmRlcCA+IC5kZXAxCisJcm0gLWYgLmRlcGRpci8uZGVwCisKKyMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgorLnRjZGVwOiAkKFRBUkdFVF9DUFVfQ0ZJTEVTKQorCXJtIC1mIC50Y2RlcGEKKwlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCisJc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKKwljZCAuZGVwZGlyOyBcCisJZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCisJICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAorCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKKwkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCisJICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKKwkgICAgICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiQke2N9IictZGVzYy5oIicgPiBjZ2VuLWRlc2MuaDsgXAorCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKKwkgICAgICBjcCAkJHtzcmNkaXJ9L2NvbmZpZy90Yy0kJHtjfS5jIGR1bW15LmM7IFwKKwkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKKwkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCisJICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvVENERVBfJCR7Y31fJCR7b30gPS8iIFwKKwkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCisJCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKKwkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLnRjZGVwYTsgXAorCSAgICAgIHJtIC1mIGR1bW15LmM7IFwKKwkgICAgZWxzZSB0cnVlOyBmaTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKwllY2hvICdUQ0RFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXCcgPj4gLnRjZGVwYQorCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gLnRjZGVwYQorCWVjaG8gJyAgJCQoSU5DRElSKS9vcGNvZGUvaHBwYS5oICQkKEJGRERJUikvc29tLmgnID4+IC50Y2RlcGEKKwkjIFdlIGRvbid0IHRyeSB0byBoYW5kbGUgYWxsIG11bHRpIGNhc2VzLgorCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAorCSAgJChDUFVfTVVMVElfVkFMSUQpIFwKKwkgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCisJICAgIG89ZWNvZmY7IFwKKwkgICAgJChDUFVfT0JKX1ZBTElEKSBcCisJICAgIGVjaG8gJ1RDREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC50Y2RlcGE7IFwKKwkgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC50Y2RlcGE7IFwKKwkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC50Y2RlcGE7IFwKKwkgICAgZWxzZSB0cnVlOyBmaTsgXAorCSAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfZWxmKScgPj4gLnRjZGVwYTsgXAorCSAgZWxzZSB0cnVlOyBmaTsgXAorCWRvbmUKKwltdiAtZiAudGNkZXBhIC50Y2RlcAorCisjIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIG9iai0qLmMgZmlsZXMuCisub2JqZGVwOiAkKE9CSl9GT1JNQVRfQ0ZJTEVTKQorCXJtIC1mIC5vYmpkZXBhCisJaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQorCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCisJY2QgLmRlcGRpcjsgXAorCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAorCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKKwkgICAgJChDUFVfT0JKX1ZBTElEKSBcCisJICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCisJICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCisJICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCisJICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAorCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCisJICAgICAgcm0gLWYgZHVtbXkuYzsgXAorCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKKwkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKKwkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCisJICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvT0JKREVQXyQke2N9XyQke299ID0vIiBcCisJCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAorCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCisJCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5vYmpkZXBhOyBcCisJICAgICAgcm0gLWYgZHVtbXkuYzsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCWVjaG8gJ09CSkRFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gLm9iamRlcGEKKwllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC5vYmpkZXBhCisJZWNobyAnICAkJChCRkRESVIpL3NvbS5oICAkJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcJyA+PiAub2JqZGVwYQorCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiAub2JqZGVwYQorCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCisJZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCisJICAkKENQVV9NVUxUSV9WQUxJRCkgXAorCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgbz1lY29mZjsgXAorCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKKwkgICAgZWNobyAnT0JKREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5vYmpkZXBhOyBcCisJICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLm9iamRlcGE7IFwKKwkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgICBlY2hvICckJChPQkpERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWxmKScgPj4gLm9iamRlcGE7IFwKKwkgIGVsc2UgdHJ1ZTsgZmk7IFwKKwlkb25lCisJbXYgLWYgLm9iamRlcGEgLm9iamRlcAorCisjIFdvcmsgb3V0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggQ1BVL09CSiBjb21iaW5hdGlvbi4KKyMgTm90ZSB0aGF0IFNPTSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG5hdGl2ZS4KKy5kZXAyOiAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQorCXJtIC1mIC5kZXAyYQorCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKKwlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAorCWNkIC5kZXBkaXI7IFwKKwlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKKwkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCisJICAgICQoQ1BVX09CSl9WQUxJRCkgXAorCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAorCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAorCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKKwkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKKwkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCisJICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCisJCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAorCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCisJCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5kZXAyYTsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCWVjaG8gJ0RFUF9ocHBhX3NvbSA9ICQkKEJGRERJUikvc29tLmgnID4+IC5kZXAyYQorCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCisJZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCisJICAkKENQVV9NVUxUSV9WQUxJRCkgXAorCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKKwkgICAgbz1lY29mZjsgXAorCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKKwkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5kZXAyYTsgXAorCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC5kZXAyYTsgXAorCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAorCSAgICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5kZXAyYTsgXAorCSAgICBlbHNlIHRydWU7IGZpOyBcCisJICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gLmRlcDJhOyBcCisJICBlbHNlIHRydWU7IGZpOyBcCisJZG9uZQorCW12IC1mIC5kZXAyYSAuZGVwMgorCitkZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKKwlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAorCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAorCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCisJCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAorCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKKworZGVwOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKKworZGVwLWluOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KKwljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorCitkZXAtYW06IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCisKKy5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgorIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgorCithcHAubzogYXBwLmMKK2FzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCisgIHNiLmggbWFjcm8uaAorYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCitiaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCitjb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAorZGVwZW5kLm86IGRlcGVuZC5jCitlY29mZi5vOiBlY29mZi5jCitlaG9wdC5vOiBlaG9wdC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKK2V4cHIubzogZXhwci5jICQoSU5DRElSKS9vYnN0YWNrLmgKK2Zsb251bS1jb3B5Lm86IGZsb251bS1jb3B5LmMKK2Zsb251bS1rb25zdC5vOiBmbG9udW0ta29uc3QuYworZmxvbnVtLW11bHQubzogZmxvbnVtLW11bHQuYworZnJhZ3MubzogZnJhZ3MuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaAoraGFzaC5vOiBoYXNoLmMKK2lucHV0LWZpbGUubzogaW5wdXQtZmlsZS5jIGlucHV0LWZpbGUuaAoraW5wdXQtc2NydWIubzogaW5wdXQtc2NydWIuYyBpbnB1dC1maWxlLmggc2IuaAorbGlzdGluZy5vOiBsaXN0aW5nLmMgaW5wdXQtZmlsZS5oIHN1YnNlZ3MuaAorbGl0ZXJhbC5vOiBsaXRlcmFsLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKK21hY3JvLm86IG1hY3JvLmMgc2IuaCBtYWNyby5oCittZXNzYWdlcy5vOiBtZXNzYWdlcy5jCitvdXRwdXQtZmlsZS5vOiBvdXRwdXQtZmlsZS5jIG91dHB1dC1maWxlLmgKK3JlYWQubzogcmVhZC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIHNiLmggbWFjcm8uaCBcCisgIGVjb2ZmLmgKK3NiLm86IHNiLmMgc2IuaAorc3RhYnMubzogc3RhYnMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBlY29mZi5oIFwKKyAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgorc3Vic2Vncy5vOiBzdWJzZWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKK3N5bWJvbHMubzogc3ltYm9scy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCit3cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKK2dhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAorZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAorICBlbXVsLXRhcmdldC5oCitlLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAorZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCisgIGVtdWwtdGFyZ2V0LmgKK2UtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCiskKE9CSlMpOiAkKERFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCiskKFRBUkdfQ1BVX08pOiAkKFRDREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKKyQoT0JKX0ZPUk1BVF9PKTogJChPQkpERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQorIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9ORVdTIGIvZ2FzL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0NDA3NgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9ORVdTCkBAIC0wLDAgKzEsMjg3IEBACistKi0gdGV4dCAtKi0KKworQ2hhbmdlcyBpbiAyLjEwOgorCitTdXBwb3J0IGZvciB0aGUgTW90b3JvbGxhIE1Db3JlIDIxMCBwcm9jZXNzb3IgYWRkZWQuCisKK0EgbmV3IHBzZXVkby1vcCAuaW50ZWxfc3ludGF4IGhhcyBiZWVuIGltcGxlbWVudGVkIHRvIGFsbG93IGdhcyB0byBwYXJzZSBpMzg2IGFzc2VtYmx5Citwcm9ncmFtcyB3aXRoIGludGVsIHN5bnRheC4KKworTmV3IHBzZXVkby1vcHMgLmZ1bmMsLmVuZGZ1bmMgdG8gYWlkIGluIGRlYnVnZ2luZyB1c2VyLXdyaXR0ZW4gYXNzZW1ibGVyIGNvZGUuCisKK0Z1bGwgMTYtYml0IG1vZGUgc3VwcG9ydCBmb3IgaTM4Ni4KKworR3JlYXRseSBpbXByb3ZlZCBpbnN0cnVjdGlvbiBvcGVyYW5kIGNoZWNraW5nIGZvciBpMzg2LiAgVGhpcyBjaGFuZ2Ugd2lsbAorcHJvZHVjZSBlcnJvcnMgb3Igd2FybmluZ3Mgb24gaW5jb3JyZWN0IGFzc2VtYmx5IGNvZGUgdGhhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZgorZ2FzIGFjY2VwdGVkLiAgSWYgeW91IGdldCB1bmV4cGVjdGVkIG1lc3NhZ2VzIGZyb20gY29kZSB0aGF0IHdvcmtlZCB3aXRoIG9sZGVyCit2ZXJzaW9ucyBvZiBnYXMsIHBsZWFzZSBkb3VibGUgY2hlY2sgdGhlIGNvZGUgYmVmb3JlIHJlcG9ydGluZyBhIGJ1Zy4KKworV2VhayBzeW1ib2wgc3VwcG9ydCBhZGRlZCBmb3IgQ09GRiB0YXJnZXRzLgorCitNaXRzdWJpc2hpIEQzMFYgc3VwcG9ydCBhZGRlZC4KKworVGV4YXMgSW5zdHJ1bWVudHMgYzgwICh0bXMzMjBjODApIHN1cHBvcnQgYWRkZWQuCisKK0NoYW5nZXMgaW4gMi45OgorCitUZXhhcyBJbnN0cnVtZW50cyBjMzAgKHRtczMyMGMzMCkgc3VwcG9ydCBhZGRlZC4KKworVGhlIGFzc2VtYmxlciBub3cgb3B0aW1pemVzIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGVnY3MKK2FuZCBnY2MgMi44LiAgVGhlIG5ldyAtLXRyYWRpdGlvbmFsLWZvcm1hdCBvcHRpb24gZGlzYWJsZXMgdGhpcyBvcHRpbWl6YXRpb24uCisKK0FkZGVkIC0tZ3N0YWJzIG9wdGlvbiB0byBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisKK1RoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBtIChlLmcuLCAtYWxtKSB0byBleHBhbmQgbWFjcm9zIGluIGEKK2xpc3RpbmcuCisKK0FkZGVkIC1NRCBvcHRpb24gdG8gcHJpbnQgZGVwZW5kZW5jaWVzLgorCitDaGFuZ2VzIGluIDIuODoKKworQmVPUyBzdXBwb3J0IGFkZGVkLgorCitNSVBTMTYgc3VwcG9ydCBhZGRlZC4KKworTW90b3JvbGEgQ29sZEZpcmUgNTIwMCBzdXBwb3J0IGFkZGVkIChjb25maWd1cmUgZm9yIG02OGsgYW5kIHVzZSAtbTUyMDApLgorCitBbHBoYS9WTVMgc3VwcG9ydCBhZGRlZC4KKworbTY4ayBvcHRpb25zIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYsIC0tYmFzZS1zaXplLWRlZmF1bHQtMzIsCistLWRpc3Atc2l6ZS1kZWZhdWx0LTE2LCBhbmQgLS1kaXNwLXNpemUtZGVmYXVsdC0zMiBhZGRlZC4KKworVGhlIGFsaWdubWVudCBkaXJlY3RpdmVzIG5vdyB0YWtlIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUKK21heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcKK21vcmUgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4KKworVGhlIEVMRiBhc3NlbWJsZXIgaGFzIGEgbmV3IHBzZXVkby1vcCwgLnN5bXZlciwgdXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCisKK1RoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBjIChlLmcuLCAtYWxjKSwgdG8gc2tpcCBmYWxzZSBjb25kaXRpb25hbHMKK2luIGxpc3RpbmdzLgorCitBZGRlZCBuZXcgcHNldWRvLW9wLCAuZXF1aXY7IGl0J3MgbGlrZSAuZXF1LCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiB0aGUKK3N5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCisKK0NoYW5nZXMgaW4gMi43OgorCitUaGUgUG93ZXJQQyBhc3NlbWJsZXIgbm93IGFsbG93cyB0aGUgdXNlIG9mIHN5bWJvbGljIHJlZ2lzdGVyIG5hbWVzIChyMCwgZXRjLikKK2lmIC1tcmVnbmFtZXMgaXMgdXNlZC4gIFN5bWJvbGljIG5hbWVzIHByZWNlZGVkIGJ5IGEgJyUnICglcjAsIGV0Yy4pIGNhbiBiZQordXNlZCBhbnkgdGltZS4gIFBvd2VyUEMgODYwIG1vdmUgdG8vZnJvbSBTUFIgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBhZGRlZC4KKworQWxwaGEgTGludXggKEVMRikgc3VwcG9ydCBhZGRlZC4KKworUG93ZXJQQyBFTEYgc3VwcG9ydCBhZGRlZC4KKworbTY4ayBMaW51eCAoRUxGKSBzdXBwb3J0IGFkZGVkLgorCitpOTYwIEh4L0p4IHN1cHBvcnQgYWRkZWQuCisKK2kzODYvUG93ZXJQQyBnbnUtd2luMzIgc3VwcG9ydCBhZGRlZC4KKworU0NPIEVMRiBzdXBwb3J0IGFkZGVkLiAgRm9yIE9wZW5TZXJ2ZXIgNSB0YXJnZXRzIChpMzg2LXVua25vd24tc2NvMy4ydjUpIHRoZQorZGVmYXVsdCBpcyB0byBidWlsZCBDT0ZGLW9ubHkgc3VwcG9ydC4gIFRvIGdldCBhIHNldCBvZiB0b29scyB0aGF0IGdlbmVyYXRlIEVMRgorKHRoZXknbGwgdW5kZXJzdGFuZCBib3RoIENPRkYgYW5kIEVMRiksIHlvdSBtdXN0IGNvbmZpZ3VyZSB3aXRoCit0YXJnZXQ9aTM4Ni11bmtub3duLXNjbzMuMnY1ZWxmLgorCittODhrLW1vdG9yb2xhLXN5c3YzKiBzdXBwb3J0IGFkZGVkLgorCitDaGFuZ2VzIGluIDIuNjoKKworR2FzIG5vdyBkaXJlY3RseSBzdXBwb3J0cyBtYWNyb3MsIHdpdGhvdXQgcmVxdWlyaW5nIEdBU1AuCisKK0dhcyBub3cgaGFzIGFuIE1SSSBhc3NlbWJsZXIgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNlIC1NIG9yIC0tbXJpIHRvIHNlbGVjdCBNUkkKK21vZGUuICBUaGUgcHNldWRvLW9wIGBgLm1yaSAxJycgd2lsbCBzd2l0Y2ggaW50byB0aGUgTVJJIG1vZGUgdW50aWwgdGhlIGBgLm1yaQorMCcnIGlzIHNlZW47IHRoaXMgY2FuIGJlIGNvbnZlbmllbnQgZm9yIGlubGluZSBhc3NlbWJsZXIgY29kZS4KKworQWRkZWQgLS1kZWZzeW0gU1lNPVZBTFVFIG9wdGlvbi4KKworQWRkZWQgLW1pcHM0IHN1cHBvcnQgdG8gTUlQUyBhc3NlbWJsZXIuCisKK0FkZGVkIFBJQyBzdXBwb3J0IHRvIFNvbGFyaXMgYW5kIFNQQVJDIFN1bk9TIDQgYXNzZW1ibGVyLgorCitDaGFuZ2VzIGluIDIuNDoKKworQ29udmVydGVkIHRoaXMgZGlyZWN0b3J5IHRvIHVzZSBhbiBhdXRvY29uZi1nZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4KKworQVJNIHN1cHBvcnQsIGZyb20gUmljaGFyZCBFYXJuc2hhdy4KKworVXBkYXRlZCBWTVMgc3VwcG9ydCwgZnJvbSBQYXQgUmFua2luLCBpbmNsdWRpbmcgY29uc2lkZXJhYmx5IGltcHJvdmVkIGRlYnVnZ2luZworc3VwcG9ydC4KKworU3VwcG9ydCBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGluIHRoZSA2ODA2MC4KKworSGFuZGxlcyAoaWdub3JlcykgYSBuZXcgZGlyZWN0aXZlICIudGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCB0bworcHJvdmlkZSBmb3IgcG9zc2libGUgZnV0dXJlIGdjYyBjaGFuZ2VzLCBmb3IgdGFyZ2V0cyB3aGVyZSBnYXMgcHJvdmlkZXMgc29tZQorZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIElmIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGlzCit1c2VkLCBpdCBzaG91bGQgYmVjb21lIG9idmlvdXMgcHJldHR5IHF1aWNrbHkgd2hhdCB0aGUgcHJvYmxlbSBpcy4KKworVXNhZ2UgbWVzc2FnZSBpcyBhdmFpbGFibGUgd2l0aCAiLS1oZWxwIi4KKworVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yIChnYXNwKSBpcyBpbmNsdWRlZC4gIChBY3R1YWxseSwgaXQgd2FzIGluIDIuMworYWxzbywgYnV0IGRpZG4ndCBnZXQgaW50byB0aGUgTkVXUyBmaWxlLikKKworV2VhayBzeW1ib2wgc3VwcG9ydCBmb3IgYS5vdXQuCisKK0EgYnVnIGluIHRoZSBsaXN0aW5nIGNvZGUgd2hpY2ggY291bGQgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBoYXMgYmVlbiBmaXhlZC4KK0J1Z3MgaW4gbGlzdGluZ3Mgd2hlbiBnZW5lcmF0aW5nIGEgQ09GRiBvYmplY3QgZmlsZSBoYXZlIGFsc28gYmVlbiBmaXhlZC4KKworSW5pdGlhbCBpMzg2LXN2cjQgUElDIGltcGxlbWVudGF0aW9uIGZyb20gRXJpYyBZb3VuZ2RhbGUsIGJhc2VkIG9uIGNvZGUgYnkgUGF1bAorS3JhbmVuYnVyZy4KKworSW1wcm92ZWQgQWxwaGEgc3VwcG9ydC4gIEltbWVkaWF0ZSBjb25zdGFudHMgY2FuIGhhdmUgYSBtdWNoIGxhcmdlciByYW5nZSBub3cuCitTdXBwb3J0IGZvciB0aGUgMjExNjQgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgRGlnaXRhbC4KKworVXBkYXRlZCBuczMyayAocGM1MzItbWFjaCwgbmV0YnNkNTMyKSBzdXBwb3J0IGZyb20gSWFuIERhbGwuCisKK0NoYW5nZXMgaW4gMi4zOgorCitNYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllIGFuZCBLZW4gUmFlYnVybi4KKworUlMvNjAwMCBhbmQgUG93ZXJQQyBzdXBwb3J0IGJ5IElhbiBUYXlsb3IuCisKK1ZNUyBjb21tYW5kIHNjcmlwdHMgKG1ha2UtZ2FzLmNvbSwgY29uZmlnLWdhcy5jb20pIGhhdmUgYmVlbiB3b3JrZWQgb24gYSBiaXQsCitiYXNlZCBvbiBtYWlsIHJlY2VpdmVkIGZyb20gdmFyaW91cyBwZW9wbGUuICBUaGUgYC1oIycgb3B0aW9uIHNob3VsZCB3b3JrIGFnYWluCit0b28uCisKK0hQLVBBIHdvcmssIGJ5IEplZmYgTGF3LiAgTm90ZSwgZm9yIHRoZSBQQSwgZ2FzLTIuMyBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrCit3aXRoIGdkYi00LjEyIGFuZCBnY2MtMi42LiAgQXMgZ2NjLTIuNiBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LCBhIHNwZWNpYWwKK3ZlcnNpb24gb2YgZ2NjLTIuNS44IGhhcyBiZWVuIHBhdGNoZWQgdG8gd29yayB3aXRoIGdhcy0yLjMuICBZb3UgY2FuIHJldHJpZXZlCit0aGlzIHNwZWNpYWwgdmVyc2lvbiBvZiBnY2MtMi41LjggdmlhIGFub255bW91cyBmdHAgZnJvbSBqYWd1YXIuY3MudXRhaC5lZHUKK2luIHRoZSAiZGlzdCIgZGlyZWN0b3J5LgorCitWYXggc3VwcG9ydCBpbiBnYXMgZml4ZWQgZm9yIEJTRCwgc28gaXQgYnVpbGRzIGFuZCBzZWVtcyB0byBydW4gYSBjb3VwbGUgc2ltcGxlCit0ZXN0cyBva2F5LiAgSSBoYXZlbid0IHB1dCBpdCB0aHJvdWdoIGV4dGVuc2l2ZSB0ZXN0aW5nLiAgKEdOVSBtYWtlIGlzCitjdXJyZW50bHkgcmVxdWlyZWQgZm9yIEJTRCA0LjMgYnVpbGRzLikKKworU3VwcG9ydCBmb3IgdGhlIERFQyBBbHBoYSwgcnVubmluZyBPU0YvMSAoRUNPRkYgZm9ybWF0KS4gIFRoZSBnYXMgc3VwcG9ydCBpcworYmFzZWQgb24gY29kZSBkb25hdGVkIGJ5IENNVSwgd2hpY2ggdXNlZCBhbiBhLm91dC1iYXNlZCBmb3JtYXQuICBJJ20gYWZyYWlkIHRoZQorYWxwaGEtYS5vdXQgc3VwcG9ydCBpcyBwcmV0dHkgYmFkbHkgbWFuZ2xlZCwgYW5kIG11Y2ggb2YgaXQgcmVtb3ZlZDsgbWFraW5nIGl0Cit3b3JrIHdpbGwgcmVxdWlyZSByZXdyaXRpbmcgaXQgYXMgQkZEIHN1cHBvcnQgZm9yIHRoZSBmb3JtYXQgYW55d2F5cy4KKworSXJpeCA1IHN1cHBvcnQuCisKK1RoZSB0ZXN0IHN1aXRlcyBoYXZlIGJlZW4gZml4ZWQgdXAgYSBiaXQsIHNvIHRoYXQgdGhleSBzaG91bGQgd29yayB3aXRoIGEKK2NvdXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZXhwZWN0IGFuZCBkZWphZ251LgorCitTeW1ib2xzJyB2YWx1ZXMgYXJlIG5vdyBoYW5kbGVkIGludGVybmFsbHkgYXMgZXhwcmVzc2lvbnMsIHBlcm1pdHRpbmcgbW9yZQorZmxleGliaWxpdHkgaW4gZXZhbHVhdGluZyB0aGVtIGluIHNvbWUgY2FzZXMuICBTb21lIGRldGFpbHMgb2YgcmVsb2NhdGlvbgoraGFuZGxpbmcgaGF2ZSBhbHNvIGNoYW5nZWQsIGFuZCBzaW1wbGUgY29uc3RhbnQgcG9vbCBtYW5hZ2VtZW50IGhhcyBiZWVuIGFkZGVkLAordG8gbWFrZSB0aGUgQWxwaGEgcG9ydCBlYXNpZXIuCisKK05ldyBvcHRpb24gIi0tc3RhdGlzdGljcyIgZm9yIHByaW50aW5nIG91dCBwcm9ncmFtIHJ1biB0aW1lcy4gIFRoaXMgaXMgaW50ZW5kZWQKK3RvIGJlIHVzZWQgd2l0aCB0aGUgZ2NjICItUSIgb3B0aW9uLCB3aGljaCBwcmludHMgb3V0IHRpbWVzIHNwZW50IGluIHZhcmlvdXMKK3BoYXNlcyBvZiBjb21waWxhdGlvbi4gIChZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBvZiB0aGVtIHByaW50ZWQgb3V0IHdpdGgKKyJnY2MgLVEgLVdhLC0tc3RhdGlzdGljcyIsIEkgdGhpbmsuKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NoYW5nZXMgaW4gMi4yOgorCitSUy82MDAwIEFJWCBhbmQgTUlQUyBTR0kgSXJpeCA1IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCisKK0NvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHN0aWxsIGluIGRldmVsb3BtZW50IChhbmQgdGhlcmVmb3JlIGFyZSBjb252ZW5pZW50IHRvCitoYXZlIGxpc3RlZCBpbiBjb25maWd1cmUuaW4pIHN0aWxsIGdldCByZWplY3RlZCB3aXRob3V0IGEgbWlub3IgY2hhbmdlIHRvCitnYXMvTWFrZWZpbGUuaW4sIHNvIHBlb3BsZSBub3QgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBzaG91bGRuJ3QgZ2V0IHRoZQoraW1wcmVzc2lvbiB0aGF0IHN1cHBvcnQgZm9yIHN1Y2ggY29uZmlndXJhdGlvbnMgaXMgYWN0dWFsbHkgYmVsaWV2ZWQgdG8gYmUKK3JlbGlhYmxlLgorCitUaGUgcHJvZ3JhbSBuYW1lICh1c3VhbGx5ICJhcyIpIGlzIHByaW50ZWQgd2hlbiBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgaXMKK2Rpc3BsYXllZC4gIFRoaXMgc2hvdWxkIHByZXZlbnQgc29tZSBjb25mdXNpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiBvY2Nhc2lvbmFsCittZXNzYWdlcyBhYm91dCAiaW50ZXJuYWwgZXJyb3JzIi4KKworRUxGIHN1cHBvcnQgaXMgZmFsbGluZyBpbnRvIHBsYWNlLiAgU3VwcG9ydCBmb3IgdGhlIDM4NiBzaG91bGQgYmUgd29ya2luZy4KK1N1cHBvcnQgZm9yIFNQQVJDIFNvbGFyaXMgaXMgaW4uICBIUFBBIHN1cHBvcnQgZnJvbSBVdGFoIGlzIGJlaW5nIGludGVncmF0ZWQuCisKK1N5bWJvbCB2YWx1ZXMgYXJlIG1haW50YWluZWQgYXMgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiBiZWluZyBpbW1lZGlhdGVseSBib2lsZWQKK2Rvd24gdG8gYWRkLXN5bWJvbCwgc3ViLXN5bWJvbCwgYW5kIGNvbnN0YW50LiAgVGhpcyBwZXJtaXRzIHNsaWdodGx5IG1vcmUKK2NvbXBsZXggY2FsY3VsYXRpb25zIGludm9sdmluZyBzeW1ib2xzIHdob3NlIHZhbHVlcyBhcmUgbm90IGFscmVhZGV5IGtub3duLgorCitEQlgtc3R5bGUgZGVidWdnaW5nIGluZm8gKCJzdGFicyIpIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIENPRkYgZm9ybWF0cy4KK0lmIGFueSBzdGFicyBkaXJlY3RpdmVzIGFyZSBzZWVuIGluIHRoZSBzb3VyY2UsIEdBUyB3aWxsIGNyZWF0ZSB0d28gbmV3CitzZWN0aW9uczogYSAiLnN0YWIiIGFuZCBhICIuc3RhYnN0ciIgc2VjdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlIC5zdGFiCitzZWN0aW9uIGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGEub3V0IHN5bWJvbCBmb3JtYXQsIGFuZCAuc3RhYnN0ciBpcworaXRzIHN0cmluZyB0YWJsZS4gIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3QgaGF2ZSBjb25maWd1cmVkIEdDQwordG8gZ2VuZXJhdGUgc3RhYnMgKGJ5IGRlZmluaW5nIERCWF9ERUJVR0dJTkdfSU5GTyksIGFuZCBtdXN0IGhhdmUgYSBHREIKK3RoYXQgY2FuIHVzZSB0aGUgc3RhYiBzZWN0aW9ucyAoNC4xMSBvciBsYXRlcikuCisKK0x5bnhPUywgb24gaTM4NiBhbmQgbTY4ayBwbGF0Zm9ybXMsIGlzIG5vdyBzdXBwb3J0ZWQuICBTUEFSQyBMeW54T1MKK3N1cHBvcnQgaXMgaW4gcHJvZ3Jlc3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hhbmdlcyBpbiAyLjE6CisKK1NldmVyYWwgc21hbGwgZml4ZXMgZm9yIGkzODYtYWl4IChQUy8yKSBzdXBwb3J0IGZyb20gTWluaCBUcmFuLUxlIGhhdmUgYmVlbgoraW5jb3Jwb3JhdGVkLCBidXQgbm90IHdlbGwgdGVzdGVkIHlldC4KKworQWx0ZXJlZCB0aGUgb3Bjb2RlIHRhYmxlIHNwbGl0IGZvciBtNjhrOyBpdCBzaG91bGQgcmVxdWlyZSBsZXNzIFZNIHRvIGNvbXBpbGUKK3dpdGggZ2NjIG5vdy4KKworU29tZSBtaW5vciBhZGp1c3RtZW50cyB0byBhZGQgKENvbnZlcmdlbnQgVGVjaG5vbG9naWVzJykgTWluaWZyYW1lIHN1cHBvcnQsCitzdWdnZXN0ZWQgYnkgUm9uYWxkIENvbGUuCisKK0hQUEEgc3VwcG9ydCAocnVubmluZyBPU0Ygb25seSwgbm90IEhQVVgpIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFV0YWguICBUaGlzCitpbmNsdWRlcyBpbXByb3ZlZCBFTEYgc3VwcG9ydCwgd2hpY2ggSSd2ZSBzdGFydGVkIGFkYXB0aW5nIGZvciBTUEFSQyBTb2xhcmlzCisyLnguICBJbnRlZ3JhdGlvbiBpc24ndCBjb21wbGV0ZWx5LCBzbyBpdCBwcm9iYWJseSB3b24ndCB3b3JrLgorCitIUDkwMDAvMzAwIHN1cHBvcnQsIGRvbmF0ZWQgYnkgSFAsIGhhcyBiZWVuIG1lcmdlZCBpbi4KKworSWFuIFRheWxvciBoYXMgZmluaXNoZWQgdGhlIE1JUFMgRUNPRkYgKFVsdHJpeCwgSXJpeCkgc3VwcG9ydC4KKworQmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAoZS5nLiwgaHBwYS1ocHV4KS4KKworVGVzdCBzdWl0ZSBmcmFtZXdvcmsgaXMgc3RhcnRpbmcgdG8gYmVjb21lIHJlYXNvbmFibGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hhbmdlcyBpbiAyLjA6CisKK01vc3RseSBidWcgZml4ZXMuCisKK1NvbWUgbW9yZSBtZXJnaW5nIG9mIEJGRCBhbmQgRUxGIGNvZGUsIGJ1dCBFTEYgc3RpbGwgZG9lc24ndCB3b3JrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NoYW5nZXMgaW4gMS45NDoKKworQkZEIG1lcmdlIGlzIHBhcnRseSBkb25lLiAgQWR2ZW50dXJvdXMgc291bHMgbWF5IHRyeSBnaXZpbmcgY29uZmlndXJlIHRoZQorIi0td2l0aC1iZmQtYXNzZW1ibGVyIiBvcHRpb24uICBDdXJyZW50bHksIEVMRiBmb3JtYXQgcmVxdWlyZXMgaXQsIGEub3V0IGZvcm1hdAorYWNjZXB0cyBpdDsgU1BBUkMgQ1BVIGFjY2VwdHMgaXQuICBJdCdzIHRoZSBkZWZhdWx0IG9ubHkgZm9yIE9TICJlbGYiIG9yCisic29sYXJpcyIuICAoRUxGIGlzbid0IHJlYWxseSBzdXBwb3J0ZWQgeWV0LiAgSXQgbmVlZHMgd29yay4gIEkndmUgZ290IHNvbWUKK2NvZGUgZnJvbSBVdGFoIGZvciBIUC1QQSBFTEYsIGFuZCBmcm9tIERHIGZvciBtODhrIEVMRiwgYnV0IHRoZXkncmUgbm90IGZ1bGx5CittZXJnZWQgeWV0LikKKworVGhlIDY4SyBvcGNvZGUgdGFibGUgaGFzIGJlZW4gc3BsaXQgaW4gaGFsZi4gIEl0IHNob3VsZCBub3cgY29tcGlsZSB1bmRlciBnY2MKK3dpdGhvdXQgY29uc3VtaW5nIHJpZGljdWxvdXMgYW1vdW50cyBvZiBtZW1vcnkuCisKK0EgY291cGxlIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gcmVkdWNlZCBpbiBzaXplLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluCitzYXZpbmcgYSBsaXR0bGUgYml0IG9mIHNwYWNlIGF0IHJ1bnRpbWUuCisKK1N1cHBvcnQgZm9yIE1JUFMsIGZyb20gT1NGIGFuZCBSYWxwaCBDYW1wYmVsbCwgaGFzIGJlZW4gbWVyZ2VkIGluLiAgVGhlIE9TRgorY29kZSBwcm92aWRlZCBST1NFIGZvcm1hdCBzdXBwb3J0LCB3aGljaCBJIGhhdmVuJ3QgbWVyZ2VkIGluIHlldC4gIChJIGNhbiBtYWtlCitpdCBhdmFpbGFibGUsIGlmIGFueW9uZSB3YW50cyB0byB0cnkgaXQgb3V0LikgIFJhbHBoJ3MgY29kZSwgZm9yIEJTRCA0LjQsCitzdXBwb3J0cyBhLm91dCBmb3JtYXQuICBXZSBkb24ndCBoYXZlIEVDT0ZGIHN1cHBvcnQgaW4ganVzdCB5ZXQ7IGl0J3MgY29taW5nLgorCitTdXBwb3J0IGZvciB0aGUgSGl0YWNoaSBIOC81MDAgaGFzIGJlZW4gYWRkZWQuCisKK1ZNUyBob3N0IGFuZCB0YXJnZXQgc3VwcG9ydCBzaG91bGQgYmUgd29ya2luZyBub3csIHRoYW5rcyBjaGllZmx5IHRvIEVyaWMKK1lvdW5nZGFsZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDaGFuZ2VzIGluIDEuOTMuMDE6CisKK0ZvciBtNjhrLCBzdXBwb3J0IGZvciBtb3JlIHByb2Nlc3NvcnMgaGFzIGJlZW4gYWRkZWQ6IDY4MDQwLCBDUFUzMiwgNjg4NTEuCisKK0ZvciBpMzg2LCAuYWxpZ24gaXMgbm93IHBvd2VyLW9mLXR3bzsgd2FzIG51bWJlci1vZi1ieXRlcy4KKworRm9yIG02OGssICIlIiBpcyBub3cgYWNjZXB0ZWQgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLiAgRm9yIENPRkYgZm9ybWF0LCB3aGljaAorZG9lc24ndCB1c2UgdW5kZXJzY29yZSBwcmVmaXhlcyBmb3IgQyBsYWJlbHMsIGl0IGlzIHJlcXVpcmVkLCBzbyB2YXJpYWJsZSAiYTAiCitjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSByZWdpc3Rlci4KKworTGFzdCBwdWJsaWMgcmVsZWFzZSB3YXMgMS4zOC4gIExvdHMgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHNpbmNlIHRoZW4sIGxvdHMKK29mIG5ldyBDUFVzIGFuZCBmb3JtYXRzLCBsb3RzIG9mIGJ1Z3MgZml4ZWQuCisKKwwKK0xvY2FsIHZhcmlhYmxlczoKK2ZpbGwtY29sdW1uOiA3OQorRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRSBiL2dhcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjMjdkYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9SRUFETUUKQEAgLTAsMCArMSwyNzQgQEAKKwkJUkVBRE1FIGZvciBHQVMKKworQSBudW1iZXIgb2YgdGhpbmdzIGhhdmUgY2hhbmdlZCBzaW5jZSB2ZXJzaW9uIDEgYW5kIHRoZSB3b25kZXJmdWwgd29ybGQgb2YgZ2FzCitsb29rcyB2ZXJ5IGRpZmZlcmVudC4gIFRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2YgaXJyZWxldmFudCBnYXJiYWdlIGx5aW5nIGFyb3VuZAordGhhdCB3aWxsIGJlIGNsZWFuZWQgdXAgaW4gdGltZS4gIERvY3VtZW50YXRpb24gaXMgc2NhcmNlLCBhcyBhcmUgbG9ncyBvZiB0aGUKK2NoYW5nZXMgbWFkZSBzaW5jZSB0aGUgbGFzdCBnYXMgcmVsZWFzZS4gIE15IGFwb2xvZ2llcywgYW5kIEknbGwgdHJ5IHRvIGdldAorc29tZXRoaW5nIHVzZWZ1bC4KKworVW5wYWNraW5nIGFuZCBJbnN0YWxsYXRpb24gLSBTdW1tYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU2VlIC4uL2JpbnV0aWxzL1JFQURNRS4KKworVG8gYnVpbGQganVzdCB0aGUgYXNzZW1ibGVyLCBtYWtlIHRoZSB0YXJnZXQgYWxsLWdhcy4KKworRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PQorCitUaGUgR0FTIHJlbGVhc2UgaW5jbHVkZXMgdGV4aW5mbyBzb3VyY2UgZm9yIGl0cyBtYW51YWwsIHdoaWNoIGNhbiBiZSBwcm9jZXNzZWQKK2ludG8gYGluZm8nIG9yIGBkdmknIGZvcm1zLgorCitUaGUgRFZJIGZvcm0gaXMgc3VpdGFibGUgZm9yIHByaW50aW5nIG9yIGRpc3BsYXlpbmc7IHRoZSBjb21tYW5kcyBmb3IgZG9pbmcKK3RoaXMgdmFyeSBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uICBPbiBtYW55IHN5c3RlbXMsIGBscHIgLWQnIHdpbGwgcHJpbnQgYSBEVkkKK2ZpbGUuICBPbiBvdGhlcnMsIHlvdSBtYXkgbmVlZCB0byBydW4gYSBwcm9ncmFtIHN1Y2ggYXMgYGR2aXBzJyB0byBjb252ZXJ0IHRoZQorRFZJIGZpbGUgaW50byBhIGZvcm0geW91ciBzeXN0ZW0gY2FuIHByaW50LgorCitJZiB5b3Ugd2lzaCB0byBidWlsZCB0aGUgRFZJIGZpbGUsIHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBUZVggaW5zdGFsbGVkIG9uIHlvdXIKK3N5c3RlbS4gIFlvdSBjYW4gcmVidWlsZCBpdCBieSB0eXBpbmc6CisKKwljZCBnYXMvZG9jCisJbWFrZSBhcy5kdmkKKworVGhlIEluZm8gZm9ybSBpcyB2aWV3YWJsZSB3aXRoIHRoZSBHTlUgRW1hY3MgYGluZm8nIHN1YnN5c3RlbSwgb3IgdGhlCitzdGFuZGFsb25lIGBpbmZvJyBwcm9ncmFtLCBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgR05VIFRleGluZm8gZGlzdHJpYnV0aW9uLgorVG8gYnVpbGQgdGhlIGluZm8gZmlsZXMsIHlvdSB3aWxsIG5lZWQgdGhlIGBtYWtlaW5mbycgcHJvZ3JhbS4gIFR5cGU6CisKKwljZCBnYXMvZG9jCisJbWFrZSBpbmZvCisKK1NwZWNpZnlpbmcgbmFtZXMgZm9yIGhvc3RzIGFuZCB0YXJnZXRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUaGUgc3BlY2lmaWNhdGlvbnMgdXNlZCBmb3IgaG9zdHMgYW5kIHRhcmdldHMgaW4gdGhlIGBjb25maWd1cmUnCitzY3JpcHQgYXJlIGJhc2VkIG9uIGEgdGhyZWUtcGFydCBuYW1pbmcgc2NoZW1lLCBidXQgc29tZSBzaG9ydAorcHJlZGVmaW5lZCBhbGlhc2VzIGFyZSBhbHNvIHN1cHBvcnRlZC4gIFRoZSBmdWxsIG5hbWluZyBzY2hlbWUgZW5jb2RlcwordGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uIGluIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKKworICAgICBBUkNISVRFQ1RVUkUtVkVORE9SLU9TCisKKyAgIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSB0aGUgYWxpYXMgYHN1bjQnIGFzIGEgSE9TVCBhcmd1bWVudCBvciBpbiBhCitgLS10YXJnZXQ9VEFSR0VUJyBvcHRpb24uICBUaGUgZXF1aXZhbGVudCBmdWxsIG5hbWUgaXMKK2BzcGFyYy1zdW4tc3Vub3M0Jy4KKworICAgVGhlIGBjb25maWd1cmUnIHNjcmlwdCBhY2NvbXBhbnlpbmcgR0FTIGRvZXMgbm90IHByb3ZpZGUgYW55IHF1ZXJ5CitmYWNpbGl0eSB0byBsaXN0IGFsbCBzdXBwb3J0ZWQgaG9zdCBhbmQgdGFyZ2V0IG5hbWVzIG9yIGFsaWFzZXMuIAorYGNvbmZpZ3VyZScgY2FsbHMgdGhlIEJvdXJuZSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdWInIHRvIG1hcAorYWJicmV2aWF0aW9ucyB0byBmdWxsIG5hbWVzOyB5b3UgY2FuIHJlYWQgdGhlIHNjcmlwdCwgaWYgeW91IHdpc2gsIG9yCit5b3UgY2FuIHVzZSBpdCB0byB0ZXN0IHlvdXIgZ3Vlc3NlcyBvbiBhYmJyZXZpYXRpb25zLS1mb3IgZXhhbXBsZToKKworICAgICAlIHNoIGNvbmZpZy5zdWIgc3VuNAorICAgICBzcGFyYy1zdW4tc3Vub3M0MTEKKyAgICAgJSBzaCBjb25maWcuc3ViIHN1bjMKKyAgICAgbTY4ay1zdW4tc3Vub3M0MTEKKyAgICAgJSBzaCBjb25maWcuc3ViIGRlY3N0YXRpb24KKyAgICAgbWlwcy1kZWMtdWx0cml4NDIKKyAgICAgJSBzaCBjb25maWcuc3ViIGhwMzAwYnNkCisgICAgIG02OGstaHAtYnNkCisgICAgICUgc2ggY29uZmlnLnN1YiBpMzg2dgorICAgICBpMzg2LXVua25vd24tc3lzdgorICAgICAlIHNoIGNvbmZpZy5zdWIgaTc4NnYKKyAgICAgSW52YWxpZCBjb25maWd1cmF0aW9uIGBpNzg2dic6IG1hY2hpbmUgYGk3ODZ2JyBub3QgcmVjb2duaXplZAorCisKK2Bjb25maWd1cmUnIG9wdGlvbnMKKz09PT09PT09PT09PT09PT09PT0KKworICAgSGVyZSBpcyBhIHN1bW1hcnkgb2YgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYW5kIGFyZ3VtZW50cyB0aGF0IGFyZQorbW9zdCBvZnRlbiB1c2VmdWwgZm9yIGJ1aWxkaW5nIEdBUy4gIGBjb25maWd1cmUnIGFsc28gaGFzIHNldmVyYWwgb3RoZXIKK29wdGlvbnMgbm90IGxpc3RlZCBoZXJlLgorCisgICAgIGNvbmZpZ3VyZSBbLS1oZWxwXQorICAgICAgICAgICAgICAgWy0tcHJlZml4PURJUl0KKyAgICAgICAgICAgICAgIFstLXNyY2Rpcj1QQVRIXQorICAgICAgICAgICAgICAgWy0taG9zdD1IT1NUXQorICAgICAgICAgICAgICAgWy0tdGFyZ2V0PVRBUkdFVF0KKyAgICAgICAgICAgICAgIFstLXdpdGgtT1BUSU9OXQorICAgICAgICAgICAgICAgWy0tZW5hYmxlLU9QVElPTl0KKworWW91IG1heSBpbnRyb2R1Y2Ugb3B0aW9ucyB3aXRoIGEgc2luZ2xlIGAtJyByYXRoZXIgdGhhbiBgLS0nIGlmIHlvdQorcHJlZmVyOyBidXQgeW91IG1heSBhYmJyZXZpYXRlIG9wdGlvbiBuYW1lcyBpZiB5b3UgdXNlIGAtLScuCisKK2AtLWhlbHAnCisgICAgIFByaW50IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBgY29uZmlndXJlJywgYW5kIGV4aXQuCisKK2AtcHJlZml4PURJUicKKyAgICAgQ29uZmlndXJlIHRoZSBzb3VyY2UgdG8gaW5zdGFsbCBwcm9ncmFtcyBhbmQgZmlsZXMgdW5kZXIgZGlyZWN0b3J5CisgICAgIGBESVInLgorCitgLS1zcmNkaXI9UEFUSCcKKyAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQorICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCisKK2AtLWhvc3Q9SE9TVCcKKyAgICAgQ29uZmlndXJlIEdBUyB0byBydW4gb24gdGhlIHNwZWNpZmllZCBIT1NULiAgTm9ybWFsbHkgdGhlCisgICAgIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGZpZ3VyZSB0aGlzIG91dCBhdXRvbWF0aWNhbGx5LgorCisgICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCisgICAgIGhvc3RzLgorCitgLS10YXJnZXQ9VEFSR0VUJworICAgICBDb25maWd1cmUgR0FTIGZvciBjcm9zcy1hc3NlbWJsaW5nIHByb2dyYW1zIGZvciB0aGUgc3BlY2lmaWVkCisgICAgIFRBUkdFVC4gIFdpdGhvdXQgdGhpcyBvcHRpb24sIEdBUyBpcyBjb25maWd1cmVkIHRvIGFzc2VtYmxlIC5vIGZpbGVzCisgICAgIHRoYXQgcnVuIG9uIHRoZSBzYW1lIG1hY2hpbmUgKEhPU1QpIGFzIEdBUyBpdHNlbGYuCisKKyAgICAgVGhlcmUgaXMgbm8gY29udmVuaWVudCB3YXkgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUKKyAgICAgdGFyZ2V0cy4KKworYC0tZW5hYmxlLU9QVElPTicKKyAgICAgVGhlc2UgZmxhZ3MgdGVsbCB0aGUgcHJvZ3JhbSBvciBsaWJyYXJ5IGJlaW5nIGNvbmZpZ3VyZWQgdG8gCisgICAgIGNvbmZpZ3VyZSBpdHNlbGYgZGlmZmVyZW50bHkgZnJvbSB0aGUgZGVmYXVsdCBmb3IgdGhlIHNwZWNpZmllZAorICAgICBob3N0L3RhcmdldCBjb21iaW5hdGlvbi4gIFNlZSBiZWxvdyBmb3IgYSBsaXN0IG9mIGAtLWVuYWJsZScKKyAgICAgb3B0aW9ucyByZWNvZ25pemVkIGluIHRoZSBnYXMgZGlzdHJpYnV0aW9uLgorCitgY29uZmlndXJlJyBhY2NlcHRzIG90aGVyIG9wdGlvbnMsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29uZmlndXJpbmcKK290aGVyIEdOVSB0b29scyByZWN1cnNpdmVseTsgYnV0IHRoZXNlIGFyZSB0aGUgb25seSBvcHRpb25zIHRoYXQgYWZmZWN0CitHQVMgb3IgaXRzIHN1cHBvcnRpbmcgbGlicmFyaWVzLgorCitUaGUgYC0tZW5hYmxlJyBvcHRpb25zIHJlY29nbml6ZWQgYnkgc29mdHdhcmUgaW4gdGhlIGdhcyBkaXN0cmlidXRpb24gYXJlOgorCitgLS1lbmFibGUtdGFyZ2V0cz0uLi4nCisgICAgIFRoaXMgY2F1c2VzIG9uZSBvciBtb3JlIHNwZWNpZmllZCBjb25maWd1cmF0aW9ucyB0byBiZSBhZGRlZCB0byB0aG9zZSBmb3IKKyAgICAgd2hpY2ggQkZEIHN1cHBvcnQgaXMgY29tcGlsZWQuICBDdXJyZW50bHkgZ2FzIGNhbm5vdCB1c2UgYW55IGZvcm1hdCBvdGhlcgorICAgICB0aGFuIGl0cyBjb21waWxlZC1pbiBkZWZhdWx0LCBzbyB0aGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwuCisKK2AtLWVuYWJsZS1iZmQtYXNzZW1ibGVyJworICAgICBUaGlzIGNhdXNlcyB0aGUgYXNzZW1ibGVyIHRvIHVzZSB0aGUgbmV3IGNvZGUgYmVpbmcgbWVyZ2VkIGludG8gaXQgdG8gdXNlCisgICAgIEJGRCBkYXRhIHN0cnVjdHVyZXMgaW50ZXJuYWxseSwgYW5kIHVzZSBCRkQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzLgorICAgICBGb3IgbW9zdCB0YXJnZXRzLCB0aGlzIGlzbid0IHN1cHBvcnRlZCB5ZXQuICBGb3IgbW9zdCB0YXJnZXRzIHdoZXJlIGl0IGhhcworICAgICBiZWVuIGRvbmUsIGl0J3MgYWxyZWFkeSB0aGUgZGVmYXVsdC4gIFNvIGdlbmVyYWxseSB5b3Ugd29uJ3QgbmVlZCB0byB1c2UKKyAgICAgdGhpcyBvcHRpb24uCisKK1N1cHBvcnRlZCBwbGF0Zm9ybXMKKz09PT09PT09PT09PT09PT09PT0KKworQXQgdGhpcyBwb2ludCBJIGJlbGlldmUgZ2FzIHRvIGJlIGFuc2kgb25seSBjb2RlIGZvciBtb3N0IHRhcmdldCBjcHUncy4gIFRoYXQKK2lzLCB0aGVyZSBzaG91bGQgYmUgcmVsYXRpdmVseSBmZXcsIGlmIGFueSBob3N0IHN5c3RlbSBkZXBlbmRlbmNpZXMuICBTbworcG9ydGluZyAoYXMgYSBjcm9zcy1hc3NlbWJsZXIpIHRvIGhvc3RzIG5vdCB5ZXQgc3VwcG9ydGVkIHNob3VsZCBiZSBmYWlybHkKK2Vhc3kuICBQb3J0aW5nIHRvIGEgbmV3IHRhcmdldCBzaG91bGRuJ3QgYmUgdG9vIHRvdWdoIGlmIGl0J3MgYSB2YXJpYW50IG9mIG9uZQorYWxyZWFkeSBzdXBwb3J0ZWQuCisKK05hdGl2ZSBhc3NlbWJsaW5nIHNob3VsZCB3b3JrIG9uOgorCisJc3VuMworCXN1bjQKKwkzODZic2QKKwlic2QvMzg2CisJZGVsdGEgKG02OGstc3lzdiBmcm9tIE1vdG9yb2xhKQorCWRlbHRhODggKG04OGstc3lzdiBmcm9tIE1vdG9yb2xhKQorCUdOVS9saW51eAorCW02OGsgaHB1eCA4LjAgKGhwdXggNy4wIG1heSBiZSBhIHByb2JsZW0pCisJdmF4IGJzZCwgdWx0cml4LCB2bXMKKwlocDkwMDBzMzAwCisJZGVjc3RhdGlvbgorCWlyaXggNAorCWlyaXggNQorCW1pbmlmcmFtZSAobTY4ay1zeXN2IGZyb20gQ29udmVyZ2VudCBUZWNobm9sb2dpZXMpCisJaTM4Ni1haXggKHBzLzIpCisJaHBwYSAoaHB1eCA0LjNic2QsIG9zZjEpCisJQUlYCisJdW5peHdhcmUKKwlzY28gMy4ydjQuMgorCXNjbyBvcGVuc2VydmVyIDUuMCAoYS5rLmEuIDMuMnY1LjAgKQorCXNwYXJjIHNvbGFyaXMKKwluczMyayAobmV0YnNkLCBsaXRlcykKKworSSBiZWxpZXZlIHRoYXQgZ2FzIGFzIGEgY3Jvc3MtYXNzZW1ibGVyIGNhbiBjdXJyZW50bHkgYmUgdGFyZ2V0dGVkIGZvcgorbW9zdCBvZiB0aGUgYWJvdmUgaG9zdHMsIHBsdXMKKworCWRlY3N0YXRpb24tYnNkIChhLm91dCBmb3JtYXQsIHRvIGJlIHVzZWQgaW4gQlNEIDQuNCkKKwllYm1vbjI5aworCWdvMzIgKERPUyBvbiBpMzg2LCB3aXRoIERKR1BQIC0tIG9sZCBhLm91dCB2ZXJzaW9uKQorCWg4LzMwMCwgaDgvNTAwIChIaXRhY2hpKQorCWkzODYtYWl4IChwcy8yKQorCWk5NjAtY29mZgorCW1pcHMgZWNvZmYgKGRlY3N0YXRpb24tdWx0cml4LCBpcmlzLCBtaXBzIG1hZ251bSwgbWlwcy1pZHQtZWNvZmYpCisJTWl0c3ViaXNoaSBkMTB2IGFuZCBkMzB2CisJbmluZHk5NjAKKwlwb3dlcnBjIEVBQkkKKwlTSCAoSGl0YWNoaSkKKwlzY28zODYKKwlUSSB0aWMzMCBhbmQgdGljODAKKwl2YXggYnNkIG9yIHVsdHJpeD8KKwl2bXMKKwl2eHdvcmtzNjhrCisJdnh3b3Jrczk2MAorCXo4MDAwIChaaWxvZykKKworTUlQUyBFQ09GRiBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLCBidXQgR0FTIHdpbGwgbm90IHJ1biBhIEMtc3R5bGUKK3ByZXByb2Nlc3Nvci4gIElmIHlvdSB3YW50IHRoYXQsIHJlbmFtZSB5b3VyIGZpbGUgdG8gaGF2ZSBhICIuUyIgc3VmZml4LCBhbmQKK3J1biBnY2Mgb24gaXQuICBPciBydW4gImdjYyAteGFzc2VtYmxlci13aXRoLWNwcCBmb28ucyIuCisKK1N1cHBvcnQgZm9yIEVMRiBzaG91bGQgd29yayBub3cgZm9yIHNwYXJjLCBocHBhLCBpMzg2LCBhbHBoYSwgbTY4aywKK01JUFMsIHBvd2VycGMuCisKK1N1cHBvcnQgZm9yIHNlcXVlbnQgKG5zMzJrKSwgdGFob2UsIGk4NjAsIG04OGsgbWF5IGJlIHN1ZmZlcmluZyBmcm9tIGJpdHJvdC4KKworSWYgeW91IHRyeSBvdXQgZ2FzIG9uIHNvbWUgaG9zdCBvciB0YXJnZXQgbm90IGxpc3RlZCBhYm92ZSwgcGxlYXNlIGxldCBtZSBrbm93Cit0aGUgcmVzdWx0cywgc28gSSBjYW4gdXBkYXRlIHRoZSBsaXN0LgorCitDb21waWxlciBTdXBwb3J0IEhhY2tzCis9PT09PT09PT09PT09PT09PT09PT09CisKK09uIGEgZmV3IHRhcmdldHMsIHRoZSBhc3NlbWJsZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gc3VwcG9ydCBhIGZlYXR1cmUKK3RoYXQgaXMgcG90ZW50aWFsbHkgdXNlZnVsIHdoZW4gYXNzZW1ibGluZyBjb21waWxlciBvdXRwdXQsIGJ1dCB3aGljaAorbWF5IGNvbmZ1c2UgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMuICBJZiBhc3NlbWJsZXIgZW5jb3VudGVycyBhCisud29yZCBwc2V1ZG8tb3Agb2YgdGhlIGZvcm0gc3ltYm9sMS1zeW1ib2wyICh0aGUgZGlmZmVyZW5jZSBvZiB0d28KK3N5bWJvbHMpLCBhbmQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhvc2UgdHdvIHN5bWJvbHMgd2lsbCBub3QgZml0IGluIDE2CitiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgY3JlYXRlIGEgYnJhbmNoIGFyb3VuZCBhIGxvbmcganVtcCB0bworc3ltYm9sMSwgYW5kIGluc2VydCB0aGlzIGludG8gdGhlIG91dHB1dCBkaXJlY3RseSBiZWZvcmUgdGhlIG5leHQKK2xhYmVsOiBUaGUgLndvcmQgd2lsbCAoaW5zdGVhZCBvZiBjb250YWluaW5nIGdhcmJhZ2UsIG9yIGdpdmluZyBhbgorZXJyb3IgbWVzc2FnZSkgY29udGFpbiAodGhlIGFkZHJlc3Mgb2YgdGhlIGxvbmcganVtcCktc3ltYm9sMi4gIFRoaXMKK2FsbG93cyB0aGUgYXNzZW1ibGVyIHRvIGFzc2VtYmxlIGp1bXAgdGFibGVzIHRoYXQganVtcCB0byBsb2NhdGlvbnMKK3ZlcnkgZmFyIGF3YXkgaW50byBjb2RlIHRoYXQgd29ya3MgcHJvcGVybHkuICBJZiB0aGUgbmV4dCBsYWJlbCBpcworbW9yZSB0aGFuIDMySyBhd2F5IGZyb20gdGhlIC53b3JkLCB5b3UgbG9zZSAoc2lsZW50bHkpOyBSTVMgY2xhaW1zCit0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuLiAgSWYgdGhlIC1LIG9wdGlvbiBpcyBnaXZlbiwgeW91IHdpbGwgZ2V0IGEKK3dhcm5pbmcgbWVzc2FnZSB3aGVuIHRoaXMgaGFwcGVucy4KKworCitSRVBPUlRJTkcgQlVHUyBJTiBHQVMKKz09PT09PT09PT09PT09PT09PT09PQorCitCdWdzIGluIGdhcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnLiAgVGhleSBtYXkgYmUKK2Nyb3NzLXBvc3RlZCB0byBidWctZ2NjIGlmIHRoZXkgYWZmZWN0IHRoZSB1c2Ugb2YgZ2FzIHdpdGggZ2NjLiAgVGhleQorc2hvdWxkIG5vdCBiZSByZXBvcnRlZCBqdXN0IHRvIGJ1Zy1nY2MsIHNpbmNlIEkgZG9uJ3QgcmVhZCB0aGF0IGxpc3QsCithbmQgdGhlcmVmb3JlIHdvdWxkbid0IHNlZSB0aGVtLgorCitJZiB5b3UgcmVwb3J0IGEgYnVnIGluIEdBUywgcGxlYXNlIHJlbWVtYmVyIHRvIGluY2x1ZGU6CisKK0EgZGVzY3JpcHRpb24gb2YgZXhhY3RseSB3aGF0IHdlbnQgd3JvbmcsIGFuZCBleGFjdGx5IHdoYXQgc2hvdWxkIGhhdmUKK2hhcHBlbmVkIGluc3RlYWQuCisKK1RoZSB0eXBlIG9mIG1hY2hpbmUgKFZBWCwgNjgwMjAsIGV0YykgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKEJTRCwgU3VuT1MsIERZTklYLAorVk1TLCBldGMpIEdBUyB3YXMgcnVubmluZyBvbi4KKworVGhlIGNvbmZpZ3VyYXRpb24gbmFtZShzKSBnaXZlbiB0byB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LiAgVGhlCisiY29uZmlnLnN0YXR1cyIgZmlsZSBzaG91bGQgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLgorCitUaGUgb3B0aW9ucyBnaXZlbiB0byBHQVMgYXQgcnVuIHRpbWUuCisKK1RoZSBhY3R1YWwgaW5wdXQgZmlsZSB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbS4KKworSXQgaXMgc2lsbHkgdG8gcmVwb3J0IGEgYnVnIGluIEdBUyB3aXRob3V0IGluY2x1ZGluZyBhbiBpbnB1dCBmaWxlIGZvciBHQVMuCitEb24ndCBhc2sgdXMgdG8gZ2VuZXJhdGUgdGhlIGZpbGUganVzdCBiZWNhdXNlIHlvdSBtYWRlIGl0IGZyb20gZmlsZXMgeW91Cit0aGluayB3ZSBoYXZlIGFjY2VzcyB0by4KKworMS4gWW91IG1pZ2h0IGJlIG1pc3Rha2VuLgorMi4gSXQgbWlnaHQgdGFrZSB1cyBhIGxvdCBvZiB0aW1lIHRvIGluc3RhbGwgdGhpbmdzIHRvIHJlZ2VuZXJhdGUgdGhhdCBmaWxlLgorMy4gV2UgbWlnaHQgZ2V0IGEgZGlmZmVyZW50IGZpbGUgZnJvbSB0aGUgb25lIHlvdSBnb3QsIGFuZCBtaWdodCBub3Qgc2VlIGFueQorICAgYnVnLgorCitUbyBzYXZlIHVzIHRoZXNlIGRlbGF5cyBhbmQgdW5jZXJ0YWludGllcywgYWx3YXlzIHNlbmQgdGhlIGlucHV0IGZpbGUgZm9yIHRoZQorcHJvZ3JhbSB0aGF0IGZhaWxlZC4gIEEgc21hbGxlciB0ZXN0IGNhc2UgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHByb2JsZW0gaXMgb2YKK2NvdXJzZSBwcmVmZXJhYmxlLCBidXQgYmUgc3VyZSBpdCBpcyBhIGNvbXBsZXRlIGlucHV0IGZpbGUsIGFuZCB0aGF0IGl0IHJlYWxseQorZG9lcyBkZW1vbnN0cmF0ZSB0aGUgcHJvYmxlbTsgYnV0IGlmIHBhcmluZyBpdCBkb3duIHdvdWxkIGNhdXNlIGxhcmdlIGRlbGF5cworaW4gZmlsaW5nIHRoZSBidWcgcmVwb3J0LCBkb24ndCBib3RoZXIuCisKK0lmIHRoZSBpbnB1dCBmaWxlIGlzIHZlcnkgbGFyZ2UsIGFuZCB5b3UgYXJlIG9uIHRoZSBpbnRlcm5ldCwgeW91IG1heSB3YW50IHRvCittYWtlIGl0IGF2YWxpYWJsZSBmb3IgYW5vbnltb3VzIEZUUCBpbnN0ZWFkIG9mIG1haWxpbmcgaXQuICBJZiB5b3UgZG8sIGluY2x1ZGUKK2luc3RydWN0aW9ucyBmb3IgRlRQJ2luZyBpdCBpbiB5b3VyIGJ1ZyByZXBvcnQuCisKK0lmIHlvdSBleHBlY3QgdG8gYmUgY29udHJpYnV0aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHRlc3QgY2FzZXMsIGl0IHdvdWxkIGJlCitoZWxwZnVsIGlmIHlvdSB3b3VsZCBsb29rIGF0IHRoZSB0ZXN0IHN1aXRlIGluY2x1ZGVkIGluIHRoZSByZWxlYXNlIChiYXNlZCBvbgordGhlIERlamEgR251IHRlc3RpbmcgZnJhbWV3b3JrLCBhdmFpbGFibGUgZnJvbSB0aGUgdXN1YWwgZnRwIHNpdGVzKSBhbmQgd3JpdGUKK3Rlc3QgY2FzZXMgdG8gZml0IGludG8gdGhhdCBmcmFtZXdvcmsuICBUaGlzIGlzIGNlcnRhaW5seSBub3QgcmVxdWlyZWQuCmRpZmYgLS1naXQgYS9nYXMvUkVBRE1FLXZtcyBiL2dhcy9SRUFETUUtdm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmM2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvUkVBRE1FLXZtcwpAQCAtMCwwICsxLDI0OCBAQAorCVRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgYSBjb3VwbGUgb2YgdGhpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIFZNUy4KK1RoZXJlIGFyZSBjdXJyZW50bHkgdHdvICJjaGFwdGVycyIsIHRoZSBmaXJzdCBkZWFscyB3aXRoIGNyb3NzLWFzc2VtYmx5IAoraXNzdWVzLCBhbmQgdGhlIHNlY29uZCBkZWFscyB3aXRoIHRoZSBWTVMgZGVidWdnZXIgYW5kIEdOVS1DQy4KKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqIE5vdGVzIGZvciBDcm9zcyBBc3NlbWJseSB3aXRoIFZNUyAqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlJZiB5b3Ugd2lzaCB0byBidWlsZCBnYXMgb24gYSBub24tVk1TIHN5c3RlbSB0byBjcm9zcy1hc3NlbWJsZSwgCit5b3Ugc2hvdWxkIHVzZToKKworY29uZmlndXJlICR7aG9zdHR5cGV9IC10YXJnZXQ9dm1zCisKK2FuZCB0aGVuIGZvbGxvdyB0aGUgdXN1YWwgcHJvY2VkdXJlLiAgVGhlIG9iamVjdCBmaWxlcyBnZW5lcmF0ZWQgb24KK1VuaXggd2lsbCBiZSBjb3JyZWN0IGZyb20gYSBiaW5hcnkgcG9pbnQgb2YgdmlldywgYnV0IHRoZSByZWFsIHRyaWNrIGlzCitnZXR0aW5nIHRoZW0gdG8gdGhlIFZNUyBtYWNoaW5lLiAgVGhlIGZvcm1hdCBvZiB0aGUgb2JqZWN0IGZpbGUgaXMKK2EgdmFyaWFibGUtbGVuZ3RoIHJlY29yZCwgYnV0IGVhY2ggcmVjb3JkIGNvbnRhaW5zIGJpbmFyeSBkYXRhLiAgZ2FzCit3cml0ZXMgdGhlIHJlY29yZHMgaW4gdGhlIHNhbWUgZm9ybWF0IHRoYXQgVk1TIHdvdWxkIGV4cGVjdCwKK25hbWVseSBhIHR3by1ieXRlIGNvdW50IGZvbGxvd2VkIGJ5IHRoYXQgbnVtYmVyIG9mIGJ5dGVzLgorCisJSWYgeW91IHRyeSB0byBjb3B5IHRoZSBmaWxlIHRvIGEgVk1TIHN5c3RlbSB1c2luZyBmdHAsIHRoZSBmdHAKK3Byb3RvY29sIHdpbGwgc2NyZXcgdXAgdGhlIGZpbGUgYnkgbG9va2luZyBmb3IgbnVsbHMgKHJlY29yZCB0ZXJtaW5hdG9yIGZvcgordW5peCkgYW5kIGl0IHdpbGwgaW5zZXJ0IGl0J3Mgb3duIHJlY29yZCB0ZXJtaW5hdG9ycyBhdCB0aGF0IHBvaW50LiAgVGhpcword2lsbCBvYnZpb3VzbHkgY29ycnVwdCB0aGUgZmlsZS4gCisKKwlJZiB5b3UgdHJ5IHRvIHRyYW5zZmVyIHRoZSBmaWxlIHdpdGggZnRwIGluIGJpbmFyeSBtb2RlLCB0aGUKK2ZpbGUgaXRzZWxmIHdpbGwgbm90IGJlIGNvcnJ1cHQsIGJ1dCBWTVMgd2lsbCB0aGluayB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zCitmaXhlZC1sZW5ndGggcmVjb3JkcyBvZiA1MTIgYnl0ZXMuICBZb3UgY2FuIHVzZSB0aGUgcHVibGljLWRvbWFpbiBGSUxFIAordXRpbGl0eSB0byBjaGFuZ2UgdGhpcyB3aXRoIGEgY29tbWFuZCBsaWtlOgorCiskRklMRSBmb28uby90eXBlPXZhcmlhYmxlCisKK0lmIHlvdSBkbyBub3QgaGF2ZSB0aGlzIHV0aWxpdHkgYXZhaWxhYmxlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gY2FuIGJlIAordXNlZCB0byBwZXJmb3JtIHRoaXMgdGFzazoKKworCSNpbmNsdWRlIDxmYWIuaD4KKwkKKwkjZGVmaW5lIFJNRSRDX1NFVFJGTSAxCisJIAorCXN0cnVjdCBGQUIgKiBmYWI7CisJCisJbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSl7CisJCWludCBpLCBzdGF0dXM7CisJCWZhYiA9IChzdHJ1Y3QgRkFCKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgRkFCKSk7CisJCSpmYWIgPSBjYyRybXNfZmFiOwkvKiBpbml0aWFsaXplIEZBQiovCisJCWZhYi0+ZmFiJGJfZmFjID0gRkFCJE1fUFVUOworCQlmYWItPmZhYiRsX2ZvcCB8PSBGQUIkTV9FU0M7CisJCWZhYi0+ZmFiJGxfY3R4ID0gUk1FJENfU0VUUkZNOworCQlmYWItPmZhYiR3X2lmaSA9IDA7CisJCWZvcihpPTE7aTxhcmdjO2krKyl7CisJCSAgcHJpbnRmKCJTZXR0aW5nICVzIHRvIHZhcmlhYmxlIGxlbmd0aCByZWNvcmRzLlxuIixhcmd2W2ldKTsKKwkJICBmYWItPmZhYiRsX2ZuYSA9IGFyZ3ZbaV07CisJICAgICAgIAkgIGZhYi0+ZmFiJGJfZm5zID0gc3RybGVuKGFyZ3ZbaV0pOworCQkgIHN0YXR1cyA9IHN5cyRvcGVuKGZhYiwwLDApOworCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7CisJCSAgZmFiLT5mYWIkYl9yZm0gPSBGQUIkQ19WQVI7CisJCSAgc3RhdHVzID0gc3lzJG1vZGlmeShmYWIsMCwwKTsKKwkJICBpZigoc3RhdHVzICYgNykgIT0gMSkgbGliJHNpZ25hbChzdGF0dXMpOworCQkgIHN0YXR1cyA9IHN5cyRjbG9zZShmYWIsMCwwKTsKKwkJICBpZigoc3RhdHVzICYgNykgIT0gMSkgbGliJHNpZ25hbChzdGF0dXMpOworCQl9OworCX0KKworCUlmIHlvdSBoYXZlIE5GUyBydW5uaW5nIG9uIHRoZSBWTVMgc3lzdGVtLCB3aGF0IHlvdSBuZWVkIHRvIGRvCitkZXBlbmRzIHVwb24gd2hpY2ggTkZTIHNvZnR3YXJlIHlvdSBhcmUgcnVubmluZyBvbiB0aGUgVk1TIHN5c3RlbS4gIFRoZXJlCithcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IFRDUC9JUCBwYWNrYWdlcyBmb3IgVk1TIGF2YWlsYWJsZSwgYW5kIG9ubHkgdmVyeQorbGltaXRlZCB0ZXN0aW5nIGhhcyBiZWVuIHBlcmZvcm1lZC4gICBJbiB0aGUgdGVzdHMgdGhhdCBoYXMgYmVlbiBkb25lIHNvCitmYXIsIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB3aWxsIGFsd2F5cyBiZSBjb3JyZWN0IHdoZW4gdHJhbnNmZXJyaW5nIHRoZQorZmlsZSB2aWEgTkZTLCBidXQgdGhlIHJlY29yZCBhdHRyaWJ1dGVzIG1heSBvciBtYXkgbm90IGJlIGNvcnJlY3QuIAorCisJT25lIHByb3ByaWV0YXJ5IFRDUC9JUC9ORlMgcGFja2FnZSBmb3IgVk1TIGlzIGtub3duIHRvIAorYXV0b21hdGljYWxseSBmaXggdGhlIHJlY29yZCBhdHRyaWJ1dGVzIG9mIHRoZSBvYmplY3QgZmlsZSBpZiB5b3UgTkZTIG1vdW50CithIHVuaXggZGlzayBmcm9tIHRoZSBWTVMgc3lzdGVtLCBhbmQgaWYgdGhlIGZpbGUgaGFzIGEgIi5vYmoiIGV4dGVuc2lvbiBvbgordGhlIHVuaXggc3lzdGVtLiAgT3RoZXIgVENQL0lQIHBhY2thZ2VzIG1pZ2h0IGRvIHRoaXMgZm9yIHlvdSBhcyB3ZWxsLCBidXQKK3RoZXkgaGF2ZSBub3QgYmVlbiBjaGVja2VkLgorCitObyBtYXR0ZXIgd2hhdCBtZXRob2QgeW91IHVzZSB0byBnZXQgdGhlIGZpbGUgdG8gdGhlIFZNUyBzeXN0ZW0sIGl0IGlzCithbHdheXMgYSBnb29kIGlkZWEgdG8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIGNvcnJlY3QgdHlwZSBieQorZG9pbmcgYSAiJGRpci9mdWxsIiBvbiB0aGUgb2JqZWN0IGZpbGUuIFRoZSBkZXNpcmVkIHJlY29yZCBhdHRyaWJ1dGVzIHdpbGwKK2JlICJOb25lIi4gIFVuZGVzaXJhYmxlIHJlY29yZCBhdHRyaWJ1dGVzIHdpbGwgYmUgIlN0cmVhbS1MRiIgb3IgYW55dGhpbmcKK2Vsc2UuIAorCitPbmNlIHlvdSBnZXQgdGhlIGZpbGVzIG9uIHRoZSBWTVMgc3lzdGVtLCB5b3UgY2FuIGNoZWNrIHRoZWlyIGludGVncml0eSAKK3dpdGggdGhlICIkYW5hbC9vYmoiIGNvbW1hbmQuICAoTmF0dXJhbGx5IGF0IHNvbWUgcG9pbnQgeW91IHNob3VsZCByZW5hbWUKK3RoZSAubyBmaWxlcyB0byAub2JqKS4gIEFzIGZhciBhcyB0aGUgZGVidWdnZXIgaXMgY29uY2VybmVkLCB0aGUgcmVjb3JkcyAKK3dpbGwgYmUgY29ycmVjdCwgYnV0IHRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlcywKK3NpbmNlIGl0IG9ubHkgaGFzIHRoZSBmaWxlIG5hbWUsIGFuZCBub3QgdGhlIGZ1bGwgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCitZb3UgbXVzdCBnaXZlIHRoZSBkZWJ1Z2dlciBzb21lIGhlbHAgYnkgdGVsbGluZyBpdCB3aGljaCBkaXJlY3RvcmllcyB0byAKK3NlYXJjaCBmb3IgdGhlIGluZGl2aWR1YWwgZmlsZXMgLSBvbmNlIHlvdSBoYXZlIGRvbmUgdGhpcyB5b3Ugc2hvdWxkIGJlIAorYWJsZSB0byBwcm9jZWVkIG5vcm1hbGx5LgorCisJSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIG5hbWVzIGZvciB5b3VyIGZpbGVzIHdoaWNoIHdpbGwgYmUgdmFsaWQKK3VuZGVyIFZNUywgc2luY2Ugb3RoZXJ3aXNlIHlvdSB3aWxsIGhhdmUgbm8gd2F5IG9mIGdldHRpbmcgdGhlIGRlYnVnZ2VyIHRvCitmaW5kIHRoZSBzb3VyY2UgZmlsZSB3aGVuIGRldWdnaW5nLgorCitUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIG9iamVjdCBmaWxlIG5vcm1hbGx5IGNvbnRpbnMgc3BlY2lmaWMKK2luZm9ybWF0aW9uIHRoYXQgdGhlIGRlYnVnZ2VyIGNhbiB1c2UgdG8gcG9zaXRpdmVseSBpZGVudGlmeSBhIGZpbGUsIGFuZCBpZgoreW91IGFyZSBhc3NlbWJsaW5nIG9uIGEgdW5peCBzeXN0ZW0gdGhpcyBpbmZvcm1hdGlvbiBzaW1wbHkgZG9lcyBub3QgZXhpc3QKK2luIGEgbWVhbmluZ2Z1bCB3YXkuICBZb3UgbXVzdCBoZWxwIHRoZSBkZWJ1Z2dlciBieSB1c2luZyB0aGUgIlNFVCBGSUxFPSIKK2NvbW1hbmQgdG8gdGVsbCB0aGUgZGVidWdnZXIgd2hlcmUgdG8gbG9vayBmb3Igc291cmNlIGZpbGVzLiBUaGUgZGVidWdnZXIKK3JlY29yZHMgd2lsbCBiZSBjb3JyZWN0LCBleGNlcHQgdGhhdCB0aGUgZGVidWdnZXIgd2lsbCBub3QgYmUgaW5pdGlhbGx5CithYmxlIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlcy4gIFlvdSBjYW4gdXNlIHRoZSAiU0VUIEZJTEUiIGNvbW1hbmQgdG8gdGVsbAordGhlIGRlYnVnZ2VyIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBzb3VyY2UgZmlsZXMuIAorCitJIGhhdmUgb25seSB0ZXN0ZWQgdGhpcyB3aXRoIGEgU1ZyNCBpNDg2IG1hY2hpbmUsIGFuZCBldmVyeXRoaW5nIHNlZW1zIHRvCit3b3JrIE9LLCB3aXRoIHRoZSBsaW1pdGVkIHRlc3RpbmcgdGhhdCBJIGhhdmUgZG9uZS4gIE90aGVyIG1hY2hpbmVzIG1heQorb3IgbWF5IG5vdCB3b3JrLiAgWW91IHNob3VsZCByZWFkIHRoZSBjaGFwdGVycyBvbiBjcm9zcy1jb21waWxlcnMgaW4gdGhlIGdjYworbWFudWFsIGJlZm9yZSBmb29saW5nIHdpdGggdGhpcy4gIFNpbmNlIGdhcyBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueSBmbG9hdGluZworcG9pbnQgYXJpdGhtZXRpYywgdGhlIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyB0aGF0IGFyZSBnZW5lcmF0ZWQgaGVyZSBzaG91bGQKK2JlIGNvcnJlY3QgLSB0aGUgb25seSBjb25jZXJuIGlzIHdpdGggY29uc3RhbnQgZm9sZGluZyBpbiB0aGUgbWFpbiBjb21waWxlci4KK1RoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIGZsb2F0cyBhbmQgZG91YmxlcyBhcmUgc2ltaWxhciBvbiB0aGUgNDg2ICh3aXRoIAorYSBidWlsdGluIDgwMzg3KSBhbmQgdGhlIFZBWCwgYWx0aG91Z2ggdGhlcmUgaXMgYSBmYWN0b3Igb2YgMiB0byA0CitkaWZmZXJlbmNlIGluIHRoZSByYW5nZS4gIFRoZSBkb3VibGUsIGFzIGltcGxlbWVudGVkIG9uIHRoZSA0ODYsIGlzIHF1aXRlCitzaW1pbGFyIHRvIHRoZSBHX0ZMT0FUIG9uIHRoZSBWQVguIAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqIE5vdGVzIGZvciB1c2luZyBHTlUgQ0Mgd2l0aCB0aGUgVk1TIGRlYnVnZ2VyKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworCTEpIFlvdSBzaG91bGQgYmUgYXdhcmUgdGhhdCBHTlUtQywgYXMgd2l0aCBhbnkgb3RoZXIgZGVjZW50IGNvbXBpbGVyLAord2lsbCBkbyB0aGluZ3Mgd2hlbiBvcHRpbWl6YXRpb24gaXMgdHVybmVkIG9uIHRoYXQgeW91IG1heSBub3QgZXhwZWN0LiAKK1NvbWV0aW1lcyBpbnRlcm1lZGlhdGUgcmVzdWx0cyBhcmUgbm90IHdyaXR0ZW4gdG8gdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBvbmx5Cit1c2VkIGluIG9uZSBwbGFjZSwgYW5kIHNvbWV0aW1lcyB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHVzZWQgYXQgYWxsIHdpbGwgbm90IGJlCit3cml0dGVuIHRvIHRoZSBzeW1ib2wgdGFibGUuICBBbHNvLCBwYXJhbWV0ZXJzIHRvIGlubGluZSBmdW5jdGlvbnMgYXJlIG9mdGVuCitpbmFjY2Vzc2libGUuIFlvdSBjYW4gc2VlIHRoZSBhc3NlbWJseSBjb2RlIGVxdWl2YWxlbnQgYnkgdXNpbmcgS1A3IGluIHRoZQorZGVidWdnZXIsIGFuZCBmcm9tIHRoaXMgeW91IGNhbiB0ZWxsIGlmIGluIGZhY3QgYSB2YXJpYWJsZSBzaG91bGQgaGF2ZSB0aGUKK3ZhbHVlIHRoYXQgeW91IGV4cGVjdC4gIFlvdSBjYW4gZmluZCBvdXQgaWYgYSB2YXJpYWJsZSBsaXZlcyB3aXRoaW5nIGEgcmVnaXN0ZXIKK2J5IGRvaW5nIGEgJ3Nob3cgc3ltYm9sL2FkZHInLgorCisJMikgT3Zlcmx5IGNvbXBsZXggZGF0YSB0eXBlcywgc3VjaCBhczoKKworaW50ICgqKCooKigqKCooKiBzYXJyNilbMV0pWzFdKVsyXSlbM10pWzRdKVs1XTsKKword2lsbCBub3QgYmUgZGVidWdnZWQgcHJvcGVybHksIHNpbmNlIHRoZSBkZWJ1Z2dpbmcgcmVjb3JkIG92ZXJmbG93cyBhbiBpbnRlcm5hbAorZGVidWdnZXIgYnVmZmVyLiAgZ2NjLWFzIHdpbGwgY29udmVydCB0aGVzZSB0byAqdm9pZCBhcyBmYXIgYXMgdGhlIGRlYnVnZ2VyCitzeW1ib2wgdGFibGUgaXMgY29uY2VybmVkLCB3aGljaCB3aWxsIGF2b2lkIGFueSBwcm9ibGVtcywgYW5kIHRoZSBhc3NlbWJsZXIKK3dpbGwgZ2l2ZSB5b3UgYSBtZXNzYWdlIGluZm9ybWluZyB5b3UgdGhhdCB0aGlzIGhhcyBoYXBwZW5lZC4KKworCTMpIFlvdSBtdXN0LCBvZiBjb3Vyc2UsIGNvbXBpbGUgYW5kIGxpbmsgd2l0aCAvZGVidWcuICBJZiB5b3UgbGluaword2l0aG91dCBkZWJ1ZywgeW91IHN0aWxsIGdldCB0cmFjZWJhY2sgdGFibGUgaW4gdGhlIGV4ZWN1dGFibGUsIGJ1dCB0aGVyZSBpcyBubworc3ltYm9sIHRhYmxlIGZvciB2YXJpYWJsZXMuCisKKwk0KSBJbmNsdWRlZCBpbiB0aGUgcGF0Y2hlcyB0byBWTVMuQyBhcmUgZml4ZXMgdG8gdHdvIGJ1Z3MgdGhhdCBhcmUKK3VucmVsYXRlZCB0byB0aGUgY2hhbmdlcyB0aGF0IEkgaGF2ZSBtYWRlLiAgT25lIG9mIHRoZXNlIG1hZGUgaXQgaW1wb3NzaWJsZSB0bworZGVidWcgc21hbGwgcHJvZ3JhbXMgc29tZXRpbWVzLCBhbmQgdGhlIG90aGVyIGNhdXNlZCB0aGUgZGVidWdnZXIgdG8gYmVjb21lCitjb25mdXNlZCBhYm91dCB3aGljaCByb3V0aW5lIGl0IHdhcyBpbiwgYW5kIGdpdmUgdGhpcyBpbmNvcnJlY3QgaW5mbyBpbgordHJhY2ViYWNrcy4KKworCTUpIElmIHlvdSBhcmUgdXNpbmcgdGhlIEdOVS1DKysgY29tcGlsZXIsIHlvdSBzaG91bGQgbW9kaWZ5IHRoZQorY29tcGlsZXIgZHJpdmVyIGZpbGUgR05VX0NDOlswMDAwMDBdR0NDLkNPTSAob3IgR1hYLkNPTSkuICBJZiB5b3UgaGF2ZSBhCitzZXBlcmF0ZSBHWFguQ09NLCB0aGVuIHlvdSBuZWVkIHRvIGNoYW5nZSBvbmUgbGluZSBpbiBHWFguQ09NIHRvOgorJCBpZiBmJGxvY2F0ZSgiRCIscDIpIC5uZS4gUDJfTGVuZ3RoIHRoZW4gRGVidWcgPSAiICIiLUcwIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpY2UgemVyby0tLT4gIF4KK0lmIHlvdSBhcmUgdXNpbmcgYSBHQ0MuQ09NIHRoYXQgZG9lcyBib3RoIEMgYW5kIEMrKywgYWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgdG8KK0dDQy5DT006CisKKyQhCiskISBVc2Ugb2xkIHN0eWxlIGRlYnVnZ2luZyByZWNvcmRzIGZvciBWTVMKKyQhCiskIGlmIChEZWJ1Zy5uZXMuIiIgKS5hbmQuIFBsdXMgdGhlbiBEZWJ1ZyA9ICIgIiItRzAiIiIKKworYWZ0ZXIgdGhlIHZhcmlhYmxlcyBQbHVzIGFuZCBEZWJ1ZyBhcmUgc2V0LiAgVGhlIHJlYXNvbiBmb3IgdGhpcywgaXMgdGhhdCBDKysKK2NvbXBpbGVyIGJ5IGRlZmF1bHQgZ2VuZXJhdGVzIGRlYnVnZ2luZyByZWNvcmRzIHRoYXQgYXJlIG1vcmUgY29tcGxleCwKK3dpdGggbWFueSBuZXcgc3ludGFjdGljYWwgZWxlbWVudHMgdGhhdCBhbGxvdyBmb3IgdGhlIG5ldyBmZWF0dXJlcyBvZiB0aGUKK2xhbmd1YWdlLiAgVGhlIC1HMCBzd2l0Y2ggdGVsbHMgdGhlIEMrKyBjb21waWxlciB0byB1c2UgdGhlIG9sZCBzdHlsZSBkZWJ1Z2dpbmcKK3JlY29yZHMuICBVbnRpbCB0aGUgZGVidWdnZXIgdW5kZXJzdGFuZHMgQysrIHRoZXJlIGlzIG5vdCBhbnkgcG9pbnQgdG8gdHJ5IGFuZAordXNlIHRoZSBleHBhbmRlZCBzeW50YXguCisKKwk2KSBXaGVuIHlvdSBoYXZlIG5lc3RlZCBzY29wZXMsIGkuZS46CittYWluKCl7CisJaW50IGk7CisJe2ludCBpOworCQl7aW50IGk7Cit9O307fQorYW5kIHlvdSBzYXkgIkVYQU0gaSIgdGhlIGRlYnVnZ2VyIG5lZWRzIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmFyaWFibGUgeW91CithY3R1YWxseSB3YW50IHRvIHJlZmVyZW5jZS4gIEkgaGF2ZSBhcnJhbmdlZCB0aGluZ3MgdG8gZGVmaW5lIGEgYmxvY2sgdG8gdGhlCitkZWJ1Z2dlciB3aGVuIHlvdSB1c2UgYnJhY2tldHMgdG8gZW50ZXIgYSBuZXcgc2NvcGUsIHNvIGluIHRoZSBleGFtcGxlIGFib3ZlLAordGhlIHZhcmlhYmxlcyB3b3VsZCBiZSBkZXNjcmliZWQgYXM6CitURVNUXG1haW5caQorVEVTVFxtYWluXCQwXGkKK1RFU1RcbWFpblwkMFwkMFxpCitBdCBlYWNoIGxldmVsLCB0aGUgYmxvY2sgbmFtZSBpcyBhIG51bWJlciB3aXRoIGEgZG9sbGFyIHNpZ24gcHJlZml4LCB0aGUKK251bWJlcnMgc3RhcnQgd2l0aCAwIGFuZCBjb3VudCB1cHdhcmQuICBXaGVuIHlvdSBzYXkgRVhBTSBpLCB0aGUgZGVidWdnZXIgbG9va3MKK2F0IHRoZSBjdXJyZW50IFBDLCBhbmQgZGVjaWRlcyB3aGljaCBibG9jayBpdCBpcyBjdXJyZW50bHkgaW4uICBJdCB3b3JrcyBmcm9tCit0aGUgaW5uZXJtb3N0IGxldmVsIG91dHdhcmQgdW50aWwgaXQgZmluZHMgYSBibG9jayB0aGF0IGhhcyB0aGUgdmFyaWFibGUgImkiCitkZWZpbmVkLiAgWW91IGNhbiBhbHdheXMgc3BlY2lmeSB0aGUgc2NvcGUgZXhwbGljaXRseS4KKworCTcpICBXaXRoIEMrKywgdGhlcmUgY2FuIGJlIGEgbG90IG9mIGlubGluZSBmdW5jdGlvbnMsIGFuZCBpdCB3b3VsZCBiZQorcmF0aGVyIHJlc3RyaWN0aXZlIHRvIGZvcmNlIHRoZSB1c2VyIHRvIGRlYnVnIHRoZSBwcm9ncmFtIGJ5IGNvbnZlcnRpbmcgYWxsIG9mCit0aGUgaW5saW5lIGZ1bmN0aW9ucyB0byBub3JtYWwgZnVuY3Rpb25zLiAgV2hhdCBJIGhhdmUgZG9uZSBpcyB0byBlc3NlbnRpYWxseQorImFkZCIgKHdpdGggdGhlIGRlYnVnZ2VyKSBzb3VyY2UgbGluZXMgZnJvbSB0aGUgaW5jbHVkZSBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlCitpbmxpbmUgZnVuY3Rpb25zLiAgVGh1cyB3aGVuIHlvdSBzdGVwIGludG8gYW4gaW5saW5lIGZ1bmN0aW9uIGl0IGFwcGVhcnMgYXMgaWYKK3lvdSBoYXZlIGNhbGxlZCB0aGUgZnVuY3Rpb24sIGFuZCB5b3UgY2FuIGV4YW1pbmUgdmFyaWFibGVzIGFuZCBzbyBmb3J0aC4gCitUaGVyZSBhcmUgc2V2ZXJhbCAqdmVyeSogaW1wb3J0YW50IGRpZmZlcmVuY2VzLCBob3dldmVyLiAgRmlyc3Qgb2YgYWxsLCBzaW5jZQordGhlcmUgaXMgbm8gZnVuY3Rpb24gY2FsbCBpbnZvbHZlZCwgeW91IGNhbm5vdCBzdGVwIG92ZXIgdGhlIGlubGluZSBmdW5jdGlvbgorY2FsbCAtIHlvdSBhbHdheXMgc3RlcCBpbnRvIGl0LiBTZWNvbmRseSwgc2luY2UgdGhlIHNhbWUgc291cmNlIGxpbmVzIGFyZSB1c2VkCitpbiBtYW55IGxvY2F0aW9ucywgdGhlcmUgaXMgYSBzZXBlcmF0ZSBjb3B5IG9mIHRoZSBzb3VyY2UgZm9yICplYWNoKiB1c2FnZS4gCitXaXRob3V0IHRoaXMsIGJyZWFrcG9pbnRzIGRvIG5vdCB3b3JrLCBzaW5jZSB3ZSBtdXN0IGhhdmUgYSAxLXRvLTEgbWFwcGluZworYmV0d2VlbiBzb3VyY2UgbGluZXMgYW5kIFBDLgorCVNpbmNlIHlvdSBjYW5ub3Qgc3RlcCBvdmVyIGlubGluZSBmdW5jdGlvbiBjYWxscywgaXQgY2FuIGJlIGEgcmVhbCBwYWluCitpZiB5b3UgYXJlIG5vdCByZWFsbHkgaW50ZXJlc3RlZCBpbiB3aGF0IGlzIGdvaW5nIG9uIGZvciB0aGF0IGZ1bmN0aW9uIGNhbGwuCitXaGF0IEkgaGF2ZSBkb25lIGlzIHRvIHVzZSB0aGUgIi1EIiBzd2l0Y2ggZm9yIHRoZSBhc3NlbWJsZXIgdG8gdG9nZ2xlIHRoZQorZm9sbG93aW5nIGJlaGF2aW9yLiAgV2l0aCB0aGUgIi1EIiBzd2l0Y2gsIGFsbCBpbmxpbmUgZnVuY3Rpb25zIGFyZSBpbmNsdWRlZCBpbgordGhlIG9iamVjdCBmaWxlLCBhbmQgeW91IGNhbiBkZWJ1ZyBldmVyeXRoaW5nLiAgV2l0aG91dCB0aGUgIi1EIiBzd2l0Y2gKKyhkZWZhdWx0IGNhc2Ugd2l0aCBWTVMgaW1wbGVtZW50YXRpb24pLCBpbmxpbmUgZnVuY3Rpb25zIGFyZSBpbmNsdWRlZCAqb25seSogaWYKK3RoZXkgZGlkIG5vdCBjb21lIGZyb20gc3lzdGVtIGhlYWRlciBmaWxlcyAoaS5lLiBmcm9tIEdOVV9DQ19JTkNMVURFOiBvcgorR05VX0dYWF9JTkNMVURFOikuICBUaHVzLCB3aXRob3V0IHRoZSBzd2l0Y2ggdGhlIHVzZXIgb25seSBkZWJ1Z3MgaGlzL2hlciBvd24KK2lubGluZSBmdW5jdGlvbnMsIGFuZCBub3QgdGhlIHN5c3RlbSBvbmVzLiAoVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB5b3UgZG8KK2EgbG90IG9mIHN0cmVhbSBJL08gaW4gQysrKS4gIFRoaXMgcHJvYmFibHkgd2lsbCBub3QgcHJvdmlkZSBlbm91Z2ggZ3JhbnVsYXJpdHkKK2ZvciBtYW55IHVzZXJzLCBidXQgZm9yIG5vdyB0aGlzIGlzIHN0aWxsIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCwgYW5kIEkgd291bGQKK2xpa2UgdG8gcmVmbGVjdCB1cG9uIGl0IGFuZCBnZXQgc29tZSBmZWVkYmFjayBiZWZvcmUgSSBnbyBhbnkgZnVydGhlci4gCitQb3NzaWJsZSBzb2x1dGlvbnMgaW5jbHVkZSBhbiBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcsIGEgbG9naWNhbCBuYW1lLCBvciBhIG5ldworY29tbWFuZCBsaW5lIG9wdGlvbiBpbiBnY2MuYyAod2hpY2ggaXMgdGhlbiBwYXNzZWQgdGhyb3VnaCBzb21laG93IHRvIHRoZSBndXRzCitvZiB0aGUgYXNzZW1ibGVyKS4KKwlUaGUgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIGhlYWRlciBmaWxlcyBhcHBlYXIgYWZ0ZXIgdGhlIHNvdXJjZSBjb2RlCitmb3IgdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZSBzb3VyY2UgZmlsZSBpdHNlbGYgaXMKK251bWJlcmVkIHdpdGggdGhlIHNhbWUgbGluZSBudW1iZXJzIHRoYXQgeW91IGdldCB3aXRoIGFuIGVkaXRvci4gIEluIGFkZGl0aW9uLAordGhlIGVudGlyZSBoZWFkZXIgZmlsZSBpcyBub3QgaW5jbHVkZWQsIHNpbmNlIHRoZSBhc3NlbWJsZXIgbWFrZXMgYSBsaXN0IG9mCit0aGUgbWluIGFuZCBtYXggc291cmNlIGxpbmVzIHRoYXQgYXJlIHVzZWQsIGFuZCBvbmx5IGluY2x1ZGVzIHRob3NlIGxpbmVzIGZyb20KK3RoZSBmaXJzdCB0byB0aGUgbGFzdCBhY3R1YWxseSB1c2VkLiAoSXQgaXMgZWFzeSB0byBjaGFuZ2UgaXQgdG8gaW5jbHVkZSB0aGUKK3dob2xlIGZpbGUpLgorCisJOCkgV2hlbiB5b3UgYXJlIGRlYnVnZ2luZyBDKysgb2JqZWN0cywgdGhlIG9iamVjdCAidGhpcyIgaXMgcmVmZXJlZCB0bworYXMgIiR0aGlzIi4gIEFjdHVhbGx5LCB0aGUgY29tcGlsZXIgd3JpdGVzIGl0IGFzICIudGhpcyIsIGJ1dCB0aGUgcGVyaW9kIGlzCitub3QgZ29vZCBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBJIGhhdmUgYSByb3V0aW5lIHRvIGNvbnZlcnQgaXQgdG8gYSAkLiAgKEl0CithY3R1YWxseSBjb252ZXJ0cyBhbGwgcGVyaW9kcyB0byAkLCBidXQgb25seSBmb3IgdmFyaWFibGVzLCBzaW5jZSB0aGlzIHdhcworaW50ZW5kZWQgdG8gYWxsb3cgdXMgdG8gYWNjZXNzICJ0aGlzIi4KKworCTkpIElmIHlvdSB1c2UgdGhlIGFzbSgiLi4uIikga2V5d29yZCBmb3IgZ2xvYmFsIHN5bWJvbHMsIHlvdSB3aWxsIG5vdAorYmUgYWJsZSB0byBzZWUgdGhhdCBzeW1ib2wgd2l0aCB0aGUgZGVidWdnZXIuICBUaGUgcmVhc29uIGlzIHRoYXQgdGhlcmUgYXJlIHR3bworcmVjb3JkcyBmb3IgdGhlIHN5bWJvbCBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlcyBvZiB0aGUgYXNzZW1ibGVyLiAgT25lCitjb250YWlucyB0aGUgaW5mbyBzdWNoIGFzIHBzZWN0IG51bWJlciBhbmQgb2Zmc2V0LCBhbmQgdGhlIG90aGVyIG9uZSBjb250YWlucwordGhlIGluZm9ybWF0aW9uIGhhdmluZyB0byBkbyB3aXRoIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhcmlhYmxlLiAgSW4gb3JkZXIgdG8KK2RlYnVnIGFzIHN5bWJvbCwgeW91IG5lZWQgdG8gYmUgYWJsZSB0byBjb29yZWxhdGUgdGhlc2UgcmVjb3JkcywgYW5kIHRoZSBvbmx5Cit3YXkgdG8gZG8gdGhpcyBpcyBieSBuYW1lLiAgVGhlIHJlY29yZCB3aXRoIHRoZSBzdG9yYWdlIGF0dHJpYnV0ZXMgd2lsbCB0YWtlCit0aGUgbmFtZSB1c2VkIGluIHRoZSBhc20gZGlyZWN0aXZlLCBhbmQgdGhlIHJlY29yZCB0aGF0IHNwZWNpZmllcyB0aGUgZGF0YSB0eXBlCitoYXMgdGhlIGFjdHVhbCB2YXJpYWJsZSBuYW1lLCBhbmQgdGh1cyB3aGVuIHlvdSB1c2UgdGhlIGFzbSBkaXJlY3RpdmUgdG8gY2hhbmdlCithIHZhcmlhYmxlIG5hbWUsIHRoZSBzeW1ib2wgYmVjb21lcyBpbnZpc2libGUuCisKKwkxMCkgT2xkZXIgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyICggR05VLUMgMS4zNy45MiBhbmQgZWFybGllcikgcGxhY2UKK2dsb2JhbCBjb25zdGFudHMgaW4gdGhlIHRleHQgcHNlY3QuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBzaW5jZSB0byB0aGUgbGlua2VyCit0aGlzIGFwcGVhcnMgdG8gYmUgYW4gZW50cnkgcG9pbnQuICBJIHNlbnQgYSBwYXRjaCB0byB0aGUgY29tcGlsZXIgdG8gUk1TLAord2hpY2ggd2lsbCBnZW5lcmF0ZSBhIC5jb25zdCBzZWN0aW9uIGZvciB0aGVzZSB2YXJpYWJsZXMsIGFuZCBwYXRjaGVkIHRoZQorYXNzZW1ibGVyIHRvIHB1dCB0aGVzZSB2YXJpYWJsZXMgaW50byBhIHBzZWN0IGp1c3QgbGlrZSB0aGF0IGZvciBub3JtYWwKK3ZhcmlhYmxlcywgZXhjZXB0IHRoYXQgdGhleSBhcmUgbWFya2VkIE5PV1JULiAgc3RhdGljIGNvbnN0YW50cyBhcmUgc3RpbGwKK3BsYWNlZCBpbiB0aGUgdGV4dCBwc2VjdCwgc2luY2UgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW55IGV4dGVybmFsIGFjY2Vzcy4KZGlmZiAtLWdpdCBhL2dhcy9hY2luY2x1ZGUubTQgYi9nYXMvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTJjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvYWNpbmNsdWRlLm00CkBAIC0wLDAgKzEsNTYgQEAKK2RubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCitBQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQorQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKK0FDX1RSWV9MSU5LKFskNF0sCitbCit0eXBlZGVmICQzOworJDIgeDsKK3ggPSAoJDIpICQxOworXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKK0FDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKK2lmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgorIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCisJICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQorZmkKK10pZG5sCitkbmwKK2RubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAorZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCitkbmwgd29ya2luZyBwcm9wZXJseSEKK2RubCBHQVNfV09SS0lOR19BU1NFUlQKK0FDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCitBQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKK0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD5dLCBbCisvKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCitzdGF0aWMgaW50IGEsIGIsIGMsIGQ7CitzdGF0aWMgY2hhciAqczsKK2Fzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKKy8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCithc3NlcnQgKGEgPT0gYgorICAgICAgICB8fCBjID09IGQpOworXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAorQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKK3Rlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCitdKWRubAorZG5sCitkbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCitkbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCitkbmwgR0FTX1VOSVEobGlzdHZhcikKK0FDX0RFRlVOKEdBU19VTklRLAorW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKK19nYXNfdW5pcV9uZXdsaXN0PSIiCitkbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCitmb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KKyAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgorICBfZ2FzX3VuaXFfZHVtbXkpIDs7CisgICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCisgICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7CisgICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OworICAgICBlc2FjIDs7CisgIGVzYWMKK2RvbmUKKyQxPVskXV9nYXNfdW5pcV9uZXdsaXN0CitdKWRubApkaWZmIC0tZ2l0IGEvZ2FzL2FjbG9jYWwubTQgYi9nYXMvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZkNjBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2FjbG9jYWwubTQKQEAgLTAsMCArMSw4MjIgQEAKK2RubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40CisKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKK2RubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitkbmwgUEFSVElDVUxBUiBQVVJQT1NFLgorCitkbmwgR0FTX0NIRUNLX0RFQ0xfTkVFREVEKG5hbWUsIHR5cGVkZWZuYW1lLCB0eXBlZGVmLCBoZWFkZXJzKQorQUNfREVGVU4oR0FTX0NIRUNLX0RFQ0xfTkVFREVELFsKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciAkMSkKK0FDX0NBQ0hFX1ZBTChnYXNfY3ZfZGVjbF9uZWVkZWRfJDEsCitBQ19UUllfTElOSyhbJDRdLAorWwordHlwZWRlZiAkMzsKKyQyIHg7Cit4ID0gKCQyKSAkMTsKK10sIGdhc19jdl9kZWNsX25lZWRlZF8kMT1ubywgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPXllcykpZG5sCitBQ19NU0dfUkVTVUxUKCRnYXNfY3ZfZGVjbF9uZWVkZWRfJDEpCitpZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KKyBBQ19ERUZJTkUoW05FRURfREVDTEFSQVRJT05fXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAorCSAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKK2ZpCitdKWRubAorZG5sCitkbmwgU29tZSBub24tQU5TSSBwcmVwcm9jZXNzb3JzIGJvdGNoIHJlcXVvdGluZyBpbnNpZGUgc3RyaW5ncy4gIFRoYXQncyBiYWQKK2RubCBlbm91Z2gsIGJ1dCBvbiBzb21lIG9mIHRob3NlIHN5c3RlbXMsIHRoZSBhc3NlcnQgbWFjcm8gcmVsaWVzIG9uIHJlcXVvdGluZworZG5sIHdvcmtpbmcgcHJvcGVybHkhCitkbmwgR0FTX1dPUktJTkdfQVNTRVJUCitBQ19ERUZVTihHQVNfV09SS0lOR19BU1NFUlQsCitbQUNfTVNHX0NIRUNLSU5HKFtmb3Igd29ya2luZyBhc3NlcnQgbWFjcm9dKQorQUNfQ0FDSEVfVkFMKGdhc19jdl9hc3NlcnRfb2ssCitBQ19UUllfTElOSyhbI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+XSwgWworLyogY2hlY2sgZm9yIHJlcXVvdGluZyBwcm9ibGVtcyAqLworc3RhdGljIGludCBhLCBiLCBjLCBkOworc3RhdGljIGNoYXIgKnM7Cithc3NlcnQgKCFzdHJjbXAocywgImZvbyBiYXIgYmF6IHF1dXgiKSk7CisvKiBjaGVjayBmb3IgbmV3bGluZSBoYW5kbGluZyAqLworYXNzZXJ0IChhID09IGIKKyAgICAgICAgfHwgYyA9PSBkKTsKK10sIGdhc19jdl9hc3NlcnRfb2s9eWVzLCBnYXNfY3ZfYXNzZXJ0X29rPW5vKSlkbmwKK0FDX01TR19SRVNVTFQoJGdhc19jdl9hc3NlcnRfb2spCit0ZXN0ICRnYXNfY3ZfYXNzZXJ0X29rID0geWVzIHx8IEFDX0RFRklORShCUk9LRU5fQVNTRVJULCAxLCBbYXNzZXJ0IGJyb2tlbj9dKQorXSlkbmwKK2RubAorZG5sIFNpbmNlIG1hbnkgQm91cm5lIHNoZWxsIGltcGxlbWVudGF0aW9ucyBsYWNrIHN1YnJvdXRpbmVzLCB1c2UgdGhpcworZG5sIGhhY2sgdG8gc2ltcGxpZnkgdGhlIGNvZGUgaW4gY29uZmlndXJlLmluLgorZG5sIEdBU19VTklRKGxpc3R2YXIpCitBQ19ERUZVTihHQVNfVU5JUSwKK1tfZ2FzX3VuaXFfbGlzdD0iWyRdJDEiCitfZ2FzX3VuaXFfbmV3bGlzdD0iIgorZG5sIFByb3RlY3QgYWdhaW5zdCBlbXB0eSBpbnB1dCBsaXN0LgorZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSBbJF1fZ2FzX3VuaXFfbGlzdCA7IGRvCisgIGNhc2UgWyRdX2dhc191bmlxX2kgaW4KKyAgX2dhc191bmlxX2R1bW15KSA7OworICAqKSBjYXNlICIgWyRdX2dhc191bmlxX25ld2xpc3QgIiBpbgorICAgICAgICoiIFskXV9nYXNfdW5pcV9pICIqKSA7OworICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSJbJF1fZ2FzX3VuaXFfbmV3bGlzdCBbJF1fZ2FzX3VuaXFfaSIgOzsKKyAgICAgZXNhYyA7OworICBlc2FjCitkb25lCiskMT1bJF1fZ2FzX3VuaXFfbmV3bGlzdAorXSlkbmwKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCisjIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KKyMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgc2VyaWFsIDEKKworZG5sIFVzYWdlOgorZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKKworQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQorUEFDS0FHRT1bJDFdCitBQ19TVUJTVChQQUNLQUdFKQorVkVSU0lPTj1bJDJdCitBQ19TVUJTVChWRVJTSU9OKQorZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQorZmkKK2lmZWxzZShbJDNdLCwKK0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKK0FDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKK2RubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgorbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KKyMKKworQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAorICAgZmkKKyAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgZmkKKworICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCitkbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgorQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAorW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICQxPSQyCisgICBBQ19NU0dfUkVTVUxUKGZvdW5kKQorZWxzZQorICAgJDE9IiQzL21pc3NpbmcgJDIiCisgICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCitmaQorQUNfU1VCU1QoJDEpXSkKKworCisjIHNlcmlhbCAyNSBBTV9QUk9HX0xJQlRPT0wKK0FDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwKK1tBQ19SRVFVSVJFKFtBTV9FTkFCTEVfU0hBUkVEXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0VOQUJMRV9TVEFUSUNdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19MRF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX05NXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCitkbmwKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKK0FDX1NVQlNUKExJQlRPT0wpZG5sCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCitsaWJ0b29sX2ZsYWdzPQordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKK3Rlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKK3Rlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKK3Rlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgIiRob3N0IiBpbgorKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTMyIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgOzsKKworKi0qLWN5Z3dpbiopCisgIEFNX1NZU19MSUJUT09MX0NZR1dJTgorICA7OworCitlc2FjCisKKyMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCitDQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKK0xEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKK0RMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCiske0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCiskbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAorfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQorCisjIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAorIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KK2V4ZWMgNT4+Li9jb25maWcubG9nCitdKQorCisjIEFNX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCisjIFVzYWdlOiBBTV9FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KKyMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KKyMgICBgeWVzJy4KK0FDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsCitbZGVmaW5lKFtBTV9FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoc2hhcmVkLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BTV9FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAorY2hhbmdlcXVvdGUoWywgXSlkbmwKK1twPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKK25vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisqKQorICBlbmFibGVfc2hhcmVkPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhY10sCitlbmFibGVfc2hhcmVkPUFNX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKK10pCisKKyMgQU1fRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAorQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsCitbQU1fRU5BQkxFX1NIQVJFRChubyldKQorCisjIEFNX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKK0FDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLAorW0FNX0VOQUJMRV9TVEFUSUMobm8pXSkKKworIyBBTV9FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZworIyBVc2FnZTogQU1fRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLAorW2RlZmluZShbQU1fRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKHN0YXRpYywKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QU1fRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CitubykgZW5hYmxlX3N0YXRpYz1ubyA7OworKikKKyAgZW5hYmxlX3N0YXRpYz1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3N0YXRpYz1BTV9FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCitdKQorCisKKyMgQU1fUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oQU1fUFJPR19MRCwKK1tBQ19BUkdfV0lUSChnbnUtbGQsCitbICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKK3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKKyAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAorICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCitjaGFuZ2VxdW90ZSgsKWRubAorICAvKiB8IFtBLVphLXpdOlxcKikKK2NoYW5nZXF1b3RlKFssXSlkbmwKKyAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKyAgICAgICAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpXSkKK0xEPSIkYWNfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTEQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQordGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKK0FDX1NVQlNUKExEKQorQU1fUFJPR19MRF9HTlUKK10pCisKK0FDX0RFRlVOKEFNX1BST0dfTERfR05VLAorW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAorWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitpZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCisgIGFjX2N2X3Byb2dfZ251X2xkPXllcworZWxzZQorICBhY19jdl9wcm9nX2dudV9sZD1ubworZmldKQorXSkKKworIyBBTV9QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihBTV9QUk9HX05NLAorW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAorW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGFjX2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gJFBBVEggL2JpbjsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCisgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgorICAgICAgZWxzZQorICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIgorICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KK2ZpXSkKK05NPSIkYWNfY3ZfcGF0aF9OTSIKK0FDX01TR19SRVNVTFQoWyROTV0pCitBQ19TVUJTVChOTSkKK10pCisKKyMgQU1fU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCitBQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sCitbQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKK0FDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKK10pCisKKyMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KKworQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKK1tBQ19QUkVSRVEoWzIuMTJdKQorQUNfQ09ORklHX0hFQURFUihbJDFdKQorZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCitkbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCitkbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAorZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgorQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAoraWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAorPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKKzw8YW1faW5keD0xCitmb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCisgIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KKyAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KKyAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAorICAgIDs7CisgIGVzYWMKKyAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCitkb25lPDw+PmRubD4+KQorY2hhbmdlcXVvdGUoWyxdKSldKQorCisKK2RubCBBTV9QUk9HX0xFWAorZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKK0FDX0RFRlVOKEFNX1BST0dfTEVYLAorW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKK0FDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKK0FDX1BST0dfTEVYCitBQ19ERUNMX1lZVEVYVF0pCisKKyMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQorIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgorCisjIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAzCisKK0FDX0RFRlVOKENZX1dJVEhfTkxTLAorICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQorICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCisgICAgQUNfQVJHX0VOQUJMRShubHMsCisgICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKKyAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCisgICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKKyAgICBBQ19TVUJTVChVU0VfTkxTKQorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKKyAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCisgICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAorICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCisgICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0CisgICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKKyAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCisJZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCisJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCisJICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKKwkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKKwkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAorCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCisJCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKKwkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKKwkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAorCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCisJICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKKwkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKKwkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisJCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKKwkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKKwkJICBbQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmVdLAorCQkgIFtDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYl0pCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwldKQorCisJZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCisgICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCisKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KKwkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KKwkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgorICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCisgICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQorICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKKwkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKKyAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQorCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgICBJTlNUT0JKRVhUPS5tbworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCisJSU5UTExJQlM9JElOVExERVBTCisJTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICAgIGZpCisKKyAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KKyAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisJZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQorCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCisJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgQUNfTVNHX1JFU1VMVCgKKwkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCisJICBYR0VUVEVYVD0iOiIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisgICAgICBQT1NVQj1wbworICAgIGVsc2UKKyAgICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgIGZpCisKKyAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCisgICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBVU0VfTkxTPXllcworICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCisgICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncworICAgIGRubCBpbiBjb25maWd1cmUuaW4uCisgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KKyAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKKyAgICBBQ19TVUJTVChDQVRBTE9HUykKKyAgICBBQ19TVUJTVChDQVRPQkpFWFQpCisgICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCisgICAgQUNfU1VCU1QoR01PRklMRVMpCisgICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKKyAgICBBQ19TVUJTVChJTlRMREVQUykKKyAgICBBQ19TVUJTVChJTlRMTElCUykKKyAgICBBQ19TVUJTVChJTlRMT0JKUykKKyAgICBBQ19TVUJTVChQT0ZJTEVTKQorICAgIEFDX1NVQlNUKFBPU1VCKQorICBdKQorCitBQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKKyAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAorICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAorICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAorICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCisKKyAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKKyAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQorICAgZmkKKworICAgQU1fTENfTUVTU0FHRVMKKyAgIENZX1dJVEhfTkxTCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQorICAgICBmaQorCisgICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQorICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCisgICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCisKKyAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKKyAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgorICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKKyAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKKworCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKKyAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgorCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgorICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCisgICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0CisgICBkbmwgcGFja2FnZXMuCisgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KKyAgICAgR1RfTk89IiNOTyMiCisgICAgIEdUX1lFUz0KKyAgIGVsc2UKKyAgICAgR1RfTk89CisgICAgIEdUX1lFUz0iI1lFUyMiCisgICBmaQorICAgQUNfU1VCU1QoR1RfTk8pCisgICBBQ19TVUJTVChHVF9ZRVMpCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCisKKyAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgorICAgbD0KKyAgIEFDX1NVQlNUKGwpCisKKyAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCisgICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKKyAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgorICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCisgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCisgICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgorCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgorCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCisJIGVsc2UKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgorCSBmaQorICAgICAgZWxzZQorCSBwb3NyY3ByZWZpeD0iLi4vIgorICAgICAgZmkKKyAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCisgICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKKwkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKKyAgIGZpCisgIF0pCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK2RubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKK2RubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKK0FDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCitbIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgorQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCitbY2FzZSAiWyRdJDEiIGluCisgIC8qKQorICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiBbJDNdOyB0aGVuCisJYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKK2RubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgoraWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKK10pZG5sCisgIDs7Citlc2FjXSlkbmwKKyQxPSIkYWNfY3ZfcGF0aF8kMSIKK2lmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFskXSQxKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKCQxKWRubAorXSkKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCitBQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKKyAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCisgICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKKyAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAorCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQorICAgIGZpCisgIGZpXSkKKworIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCisjIEZyb20gSmltIE1leWVyaW5nCisKKyMgc2VyaWFsIDEKKworQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQorICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCitbICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAorICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAorICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKKyAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKKyAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgQUNfU1VCU1QoTUFJTlQpZG5sCitdCispCisKKyMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCisKK0FDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAorW0FDX1NVQlNUKCQxX1RSVUUpCitBQ19TVUJTVCgkMV9GQUxTRSkKK2lmICQyOyB0aGVuCisgICQxX1RSVUU9CisgICQxX0ZBTFNFPScjJworZWxzZQorICAkMV9UUlVFPScjJworICAkMV9GQUxTRT0KK2ZpXSkKKwpkaWZmIC0tZ2l0IGEvZ2FzL2FwcC5jIGIvZ2FzL2FwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOGRmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvYXBwLmMKQEAgLTAsMCArMSwxMjU1IEBACisvKiBUaGlzIGlzIHRoZSBBc3NlbWJsZXIgUHJlLVByb2Nlc3NvcgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogTW9kaWZpZWQgYnkgQWxsZW4gV2lyZnMtQnJvY2ssIEluc3RhbnRpYXRpb25zIEluYyAyLzkwICovCisvKiBBcHAsIHRoZSBhc3NlbWJsZXIgcHJlLXByb2Nlc3Nvci4gIFRoaXMgcHJlLXByb2Nlc3NvciBzdHJpcHMgb3V0IGV4Y2VzcworICAgc3BhY2VzLCB0dXJucyBzaW5nbGUtcXVvdGVkIGNoYXJhY3RlcnMgaW50byBhIGRlY2ltYWwgY29uc3RhbnQsIGFuZCB0dXJucworICAgIyA8bnVtYmVyPiA8ZmlsZW5hbWU+IDxnYXJiYWdlPiBpbnRvIGEgLmxpbmUgPG51bWJlcj5cbi5maWxlIDxmaWxlbmFtZT4KKyAgIHBhaXIuICBUaGlzIG5lZWRzIGJldHRlciBlcnJvci1oYW5kbGluZy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFzLmgiCQkJLyogRm9yIEJBRF9DQVNFKCkgb25seSAqLworCisjaWYgKF9fU1REQ19fICE9IDEpCisjaWZuZGVmIGNvbnN0CisjZGVmaW5lIGNvbnN0ICAvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworLyogV2hldGhlciB3ZSBhcmUgc2NydWJiaW5nIGluIG02OGsgTVJJIG1vZGUuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tCisgICBmbGFnX202OGtfbXJpLCBiZWNhdXNlIHRoZSB0d28gZmxhZ3Mgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGUgLm1yaQorICAgcHNldWRvLW9wIGF0IGRpZmZlcmVudCB0aW1lcy4gICovCitzdGF0aWMgaW50IHNjcnViX202OGtfbXJpOworCisvKiBUaGUgcHNldWRvLW9wIHdoaWNoIHN3aXRjaGVzIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUuICBTZWUgdGhlCisgICBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG1yaV9wc2V1ZG9bXSA9ICIubXJpIDAiOworCisjaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCisvKiBUaGUgcHNldWRvLW9wIGZvciB3aGljaCB3ZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSBgQCcgY2hhcmFjdGVycy4gCisgICBTZWUgdGhlIGNvbW1lbnQgaW4gZG9fc2NydWJfY2hhcnMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgICBzeW12ZXJfcHNldWRvW10gPSAiLnN5bXZlciI7CitzdGF0aWMgY29uc3QgY2hhciAqIHN5bXZlcl9zdGF0ZTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciBsZXhbMjU2XTsKK3N0YXRpYyBjb25zdCBjaGFyIHN5bWJvbF9jaGFyc1tdID0KKyIkLl9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSI7CisKKyNkZWZpbmUgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQJCTEKKyNkZWZpbmUgTEVYX0lTX1dISVRFU1BBQ0UJCTIKKyNkZWZpbmUgTEVYX0lTX0xJTkVfU0VQQVJBVE9SCQkzCisjZGVmaW5lIExFWF9JU19DT01NRU5UX1NUQVJUCQk0CisjZGVmaW5lIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQJNQorI2RlZmluZQlMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVAk2CisjZGVmaW5lCUxFWF9JU19TVFJJTkdRVU9URQkJOAorI2RlZmluZQlMRVhfSVNfQ09MT04JCQk5CisjZGVmaW5lCUxFWF9JU19ORVdMSU5FCQkJMTAKKyNkZWZpbmUJTEVYX0lTX09ORUNIQVJfUVVPVEUJCTExCisjaWZkZWYgVENfVjg1MAorI2RlZmluZSBMRVhfSVNfRE9VQkxFREFTSF8xU1QJCTEyCisjZW5kaWYKKyNpZmRlZiBUQ19NMzJSCisjZGVmaW5lIExFWF9JU19ET1VCTEVCQVJfMVNUCQkxMworI2VuZGlmCisjZGVmaW5lIElTX1NZTUJPTF9DT01QT05FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCisjZGVmaW5lIElTX1dISVRFU1BBQ0UoYykJCShsZXhbY10gPT0gTEVYX0lTX1dISVRFU1BBQ0UpCisjZGVmaW5lIElTX0xJTkVfU0VQQVJBVE9SKGMpCQkobGV4W2NdID09IExFWF9JU19MSU5FX1NFUEFSQVRPUikKKyNkZWZpbmUgSVNfQ09NTUVOVChjKQkJCShsZXhbY10gPT0gTEVYX0lTX0NPTU1FTlRfU1RBUlQpCisjZGVmaW5lIElTX0xJTkVfQ09NTUVOVChjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUKQorI2RlZmluZQlJU19ORVdMSU5FKGMpCQkJKGxleFtjXSA9PSBMRVhfSVNfTkVXTElORSkKKworc3RhdGljIGludCBwcm9jZXNzX2VzY2FwZSBQQVJBTVMgKChpbnQpKTsKKworLyogRklYTUUtc29vbjogVGhlIGVudGlyZSBsZXhlci9wYXJzZXIgdGhpbmd5IHNob3VsZCBiZQorICAgYnVpbHQgc3RhdGljYWxseSBhdCBjb21waWxlIHRpbWUgcmF0aGVyIHRoYW4gZHluYW1pY2FsbHkKKyAgIGVhY2ggYW5kIGV2ZXJ5IHRpbWUgdGhlIGFzc2VtYmxlciBpcyBydW4uICB4b3hvcmljaC4gKi8KKwordm9pZCAKK2RvX3NjcnViX2JlZ2luIChtNjhrX21yaSkKKyAgICAgaW50IG02OGtfbXJpOworeworICBjb25zdCBjaGFyICpwOworICBpbnQgYzsKKworICBzY3J1Yl9tNjhrX21yaSA9IG02OGtfbXJpOworCisgIGxleFsnICddID0gTEVYX0lTX1dISVRFU1BBQ0U7CisgIGxleFsnXHQnXSA9IExFWF9JU19XSElURVNQQUNFOworICBsZXhbJ1xyJ10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKKyAgbGV4WydcbiddID0gTEVYX0lTX05FV0xJTkU7CisgIGxleFsnOyddID0gTEVYX0lTX0xJTkVfU0VQQVJBVE9SOworICBsZXhbJzonXSA9IExFWF9JU19DT0xPTjsKKworICBpZiAoISBtNjhrX21yaSkKKyAgICB7CisgICAgICBsZXhbJyInXSA9IExFWF9JU19TVFJJTkdRVU9URTsKKworI2lmbmRlZiBUQ19IUFBBCisgICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfT05FQ0hBUl9RVU9URTsKKyNlbmRpZgorCisjaWZkZWYgU0lOR0xFX1FVT1RFX1NUUklOR1MKKyAgICAgIGxleFsnXCcnXSA9IExFWF9JU19TVFJJTkdRVU9URTsKKyNlbmRpZgorICAgIH0KKworICAvKiBOb3RlOiBpZiBhbnkgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoZSBsb29wCisgICAgIGluIHN0YXRlIDUgb2YgZG9fc2NydWJfY2hhcnMgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KKworICAvKiBOb3RlIHRoYXQgdGhlc2Ugb3ZlcnJpZGUgdGhlIHByZXZpb3VzIGRlZmF1bHRzLCBlLmcuIGlmICc7JyBpcyBhCisgICAgIGNvbW1lbnQgY2hhciwgdGhlbiBpdCBpc24ndCBhIGxpbmUgc2VwYXJhdG9yLiAgKi8KKyAgZm9yIChwID0gc3ltYm9sX2NoYXJzOyAqcDsgKytwKQorICAgIHsKKyAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7CisgICAgfQkJCQkvKiBkZWNsYXJlIHN5bWJvbCBjaGFyYWN0ZXJzICovCisKKyAgZm9yIChjID0gMTI4OyBjIDwgMjU2OyArK2MpCisgICAgbGV4W2NdID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7CisKKyNpZmRlZiB0Y19zeW1ib2xfY2hhcnMKKyAgLyogVGhpcyBtYWNybyBwZXJtaXRzIHRoZSBwcm9jZXNzb3IgdG8gc3BlY2lmeSBhbGwgY2hhcmFjdGVycyB3aGljaAorICAgICBtYXkgYXBwZWFycyBpbiBhbiBvcGVyYW5kLiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHNjcnViYmVyIGZyb20KKyAgICAgZGlzY2FyZGluZyBtZWFuaW5nZnVsIHdoaXRlc3BhY2UgaW4gY2VydGFpbiBjYXNlcy4gIFRoZSBpMzg2CisgICAgIGJhY2tlbmQgdXNlcyB0aGlzIHRvIHN1cHBvcnQgcHJlZml4ZXMsIHdoaWNoIGNhbiBjb25mdXNlIHRoZQorICAgICBzY3J1YmJlciBhcyB0byB3aGV0aGVyIGl0IGlzIHBhcnNpbmcgb3BlcmFuZHMgb3Igb3Bjb2Rlcy4gICovCisgIGZvciAocCA9IHRjX3N5bWJvbF9jaGFyczsgKnA7ICsrcCkKKyAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOworI2VuZGlmCisKKyAgLyogVGhlIG02OGsgYmFja2VuZCB3YW50cyB0byBiZSBhYmxlIHRvIGNoYW5nZSBjb21tZW50X2NoYXJzLiAgKi8KKyNpZm5kZWYgdGNfY29tbWVudF9jaGFycworI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIGNvbW1lbnRfY2hhcnMKKyNlbmRpZgorICBmb3IgKHAgPSB0Y19jb21tZW50X2NoYXJzOyAqcDsgcCsrKQorICAgIHsKKyAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0NPTU1FTlRfU1RBUlQ7CisgICAgfQkJCQkvKiBkZWNsYXJlIGNvbW1lbnQgY2hhcnMgKi8KKworICBmb3IgKHAgPSBsaW5lX2NvbW1lbnRfY2hhcnM7ICpwOyBwKyspCisgICAgeworICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOworICAgIH0JCQkJLyogZGVjbGFyZSBsaW5lIGNvbW1lbnQgY2hhcnMgKi8KKworICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKKyAgICB7CisgICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19MSU5FX1NFUEFSQVRPUjsKKyAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBzZXBhcmF0b3JzICovCisKKyAgLyogT25seSBhbGxvdyBzbGFzaC1zdGFyIGNvbW1lbnRzIGlmIHNsYXNoIGlzIG5vdCBpbiB1c2UuCisgICAgIEZJWE1FOiBUaGlzIGlzbid0IHJpZ2h0LiAgV2Ugc2hvdWxkIGFsd2F5cyBwZXJtaXQgdGhlbS4gICovCisgIGlmIChsZXhbJy8nXSA9PSAwKQorICAgIHsKKyAgICAgIGxleFsnLyddID0gTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1Q7CisgICAgfQorCisgIGlmIChtNjhrX21yaSkKKyAgICB7CisgICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7CisgICAgICBsZXhbJzsnXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOworICAgICAgbGV4WycqJ10gPSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOworICAgICAgLyogVGhlIE1SSSBkb2N1bWVudGF0aW9uIHNheXMgJyEnIGlzIExFWF9JU19DT01NRU5UX1NUQVJULCBidXQKKyAgICAgICAgIHRoZW4gaXQgY2FuJ3QgYmUgdXNlZCBpbiBhbiBleHByZXNzaW9uLiAgKi8KKyAgICAgIGxleFsnISddID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKKyAgICB9CisKKyNpZmRlZiBUQ19WODUwCisgIGxleFsnLSddID0gTEVYX0lTX0RPVUJMRURBU0hfMVNUOworI2VuZGlmCisjaWZkZWYgVENfTTMyUgorICBsZXhbJ3wnXSA9IExFWF9JU19ET1VCTEVCQVJfMVNUOworI2VuZGlmCisjaWZkZWYgVENfRDMwVgorICAvKiBtdXN0IGRvIHRoaXMgaXMgd2Ugd2FudCBWTElXIGluc3RydWN0aW9uIHdpdGggIi0+IiBvciAiPC0iICovCisgIGxleFsnLSddID0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ7CisjZW5kaWYKK30JCQkJLyogZG9fc2NydWJfYmVnaW4oKSAqLworCisvKiBTYXZlZCBzdGF0ZSBvZiB0aGUgc2NydWJiZXIgKi8KK3N0YXRpYyBpbnQgc3RhdGU7CitzdGF0aWMgaW50IG9sZF9zdGF0ZTsKK3N0YXRpYyBjaGFyICpvdXRfc3RyaW5nOworc3RhdGljIGNoYXIgb3V0X2J1ZlsyMF07CitzdGF0aWMgaW50IGFkZF9uZXdsaW5lczsKK3N0YXRpYyBjaGFyICpzYXZlZF9pbnB1dDsKK3N0YXRpYyBpbnQgc2F2ZWRfaW5wdXRfbGVuOworc3RhdGljIGNvbnN0IGNoYXIgKm1yaV9zdGF0ZTsKK3N0YXRpYyBjaGFyIG1yaV9sYXN0X2NoOworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiBhcHAgYWNyb3NzICNpbmNsdWRlJ3MuICBOb3RlIHRoYXQKKyAgIGFwcCBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgdG8gdGhlIHBhcnNpbmcgb2YgdGhlIC5pbmNsdWRlJ3MsIHNvIG91cgorICAgc3RhdGUgYXQgdGhlIHRpbWUgLmluY2x1ZGUgaXMgaW50ZXJwcmV0ZWQgaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCisgICBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gc2F2ZSBpdCBhbGwuICAqLworCitzdHJ1Y3QgYXBwX3NhdmUKKyAgeworICAgIGludCAgICAgICAgICBzdGF0ZTsKKyAgICBpbnQgICAgICAgICAgb2xkX3N0YXRlOworICAgIGNoYXIgKiAgICAgICBvdXRfc3RyaW5nOworICAgIGNoYXIgICAgICAgICBvdXRfYnVmW3NpemVvZiAob3V0X2J1ZildOworICAgIGludCAgICAgICAgICBhZGRfbmV3bGluZXM7CisgICAgY2hhciAqICAgICAgIHNhdmVkX2lucHV0OworICAgIGludCAgICAgICAgICBzYXZlZF9pbnB1dF9sZW47CisgICAgaW50ICAgICAgICAgIHNjcnViX202OGtfbXJpOworICAgIGNvbnN0IGNoYXIgKiBtcmlfc3RhdGU7CisgICAgY2hhciAgICAgICAgIG1yaV9sYXN0X2NoOworI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgorICAgIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7CisjZW5kaWYKKyAgfTsKKworY2hhciAqCithcHBfcHVzaCAoKQoreworICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkOworCisgIHNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzYXZlZCkpOworICBzYXZlZC0+c3RhdGUgPSBzdGF0ZTsKKyAgc2F2ZWQtPm9sZF9zdGF0ZSA9IG9sZF9zdGF0ZTsKKyAgc2F2ZWQtPm91dF9zdHJpbmcgPSBvdXRfc3RyaW5nOworICBtZW1jcHkgKHNhdmVkLT5vdXRfYnVmLCBvdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKKyAgc2F2ZWQtPmFkZF9uZXdsaW5lcyA9IGFkZF9uZXdsaW5lczsKKyAgc2F2ZWQtPnNhdmVkX2lucHV0ID0gc2F2ZWRfaW5wdXQ7CisgIHNhdmVkLT5zYXZlZF9pbnB1dF9sZW4gPSBzYXZlZF9pbnB1dF9sZW47CisgIHNhdmVkLT5zY3J1Yl9tNjhrX21yaSA9IHNjcnViX202OGtfbXJpOworICBzYXZlZC0+bXJpX3N0YXRlID0gbXJpX3N0YXRlOworICBzYXZlZC0+bXJpX2xhc3RfY2ggPSBtcmlfbGFzdF9jaDsKKyNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKKyAgc2F2ZWQtPnN5bXZlcl9zdGF0ZSA9IHN5bXZlcl9zdGF0ZTsKKyNlbmRpZgorCisgIC8qIGRvX3NjcnViX2JlZ2luKCkgaXMgbm90IHVzZWZ1bCwganVzdCB3YXN0ZXMgdGltZS4gKi8KKworICBzdGF0ZSA9IDA7CisgIHNhdmVkX2lucHV0ID0gTlVMTDsKKworICByZXR1cm4gKGNoYXIgKikgc2F2ZWQ7Cit9CisKK3ZvaWQgCithcHBfcG9wIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGFwcF9zYXZlICpzYXZlZCA9IChzdHJ1Y3QgYXBwX3NhdmUgKikgYXJnOworCisgIC8qIFRoZXJlIGlzIG5vIGRvX3NjcnViX2VuZCAoKS4gKi8KKyAgc3RhdGUgPSBzYXZlZC0+c3RhdGU7CisgIG9sZF9zdGF0ZSA9IHNhdmVkLT5vbGRfc3RhdGU7CisgIG91dF9zdHJpbmcgPSBzYXZlZC0+b3V0X3N0cmluZzsKKyAgbWVtY3B5IChvdXRfYnVmLCBzYXZlZC0+b3V0X2J1Ziwgc2l6ZW9mIChvdXRfYnVmKSk7CisgIGFkZF9uZXdsaW5lcyA9IHNhdmVkLT5hZGRfbmV3bGluZXM7CisgIHNhdmVkX2lucHV0ID0gc2F2ZWQtPnNhdmVkX2lucHV0OworICBzYXZlZF9pbnB1dF9sZW4gPSBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuOworICBzY3J1Yl9tNjhrX21yaSA9IHNhdmVkLT5zY3J1Yl9tNjhrX21yaTsKKyAgbXJpX3N0YXRlID0gc2F2ZWQtPm1yaV9zdGF0ZTsKKyAgbXJpX2xhc3RfY2ggPSBzYXZlZC0+bXJpX2xhc3RfY2g7CisjaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCisgIHN5bXZlcl9zdGF0ZSA9IHNhdmVkLT5zeW12ZXJfc3RhdGU7CisjZW5kaWYKKworICBmcmVlIChhcmcpOworfQkJCQkvKiBhcHBfcG9wKCkgKi8KKworLyogQEAgVGhpcyBhc3N1bWVzIHRoYXQgXG4gJmMgYXJlIHRoZSBzYW1lIG9uIGhvc3QgYW5kIHRhcmdldC4gIFRoaXMgaXMgbm90CisgICBuZWNlc3NhcmlseSB0cnVlLiAgKi8KK3N0YXRpYyBpbnQgCitwcm9jZXNzX2VzY2FwZSAoY2gpCisgICAgIGludCBjaDsKK3sKKyAgc3dpdGNoIChjaCkKKyAgICB7CisgICAgY2FzZSAnYic6CisgICAgICByZXR1cm4gJ1xiJzsKKyAgICBjYXNlICdmJzoKKyAgICAgIHJldHVybiAnXGYnOworICAgIGNhc2UgJ24nOgorICAgICAgcmV0dXJuICdcbic7CisgICAgY2FzZSAncic6CisgICAgICByZXR1cm4gJ1xyJzsKKyAgICBjYXNlICd0JzoKKyAgICAgIHJldHVybiAnXHQnOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIHJldHVybiAnXCcnOworICAgIGNhc2UgJyInOgorICAgICAgcmV0dXJuICdcIic7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBjaDsKKyAgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHByb2Nlc3MgaW5wdXQgY2hhcmFjdGVycy4gIFRoZSBHRVQKKyAgIHBhcmFtZXRlciBpcyB1c2VkIHRvIHJldHJpZXZlIG1vcmUgaW5wdXQgY2hhcmFjdGVycy4gIEdFVCBzaG91bGQKKyAgIHNldCBpdHMgcGFyYW1ldGVyIHRvIHBvaW50IHRvIGEgYnVmZmVyLCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YKKyAgIHRoZSBidWZmZXI7IGl0IHNob3VsZCByZXR1cm4gMCBhdCBlbmQgb2YgZmlsZS4gIFRoZSBzY3J1YmJlZCBvdXRwdXQKKyAgIGNoYXJhY3RlcnMgYXJlIHB1dCBpbnRvIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQgVE9TVEFSVDsgdGhlIFRPU1RBUlQKKyAgIGJ1ZmZlciBpcyBUT0xFTiBieXRlcyBpbiBsZW5ndGguICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyCisgICBvZiBzY3J1YmJlZCBjaGFyYWN0ZXJzIHB1dCBpbnRvIFRPU1RBUlQuICBUaGlzIHdpbGwgYmUgVE9MRU4gdW5sZXNzCisgICBlbmQgb2YgZmlsZSB3YXMgc2Vlbi4gIFRoaXMgZnVuY3Rpb24gaXMgYXJyYW5nZWQgYXMgYSBzdGF0ZQorICAgbWFjaGluZSwgYW5kIHNhdmVzIGl0cyBzdGF0ZSBzbyB0aGF0IGl0IG1heSByZXR1cm4gYXQgYW55IHBvaW50LgorICAgVGhpcyBpcyB0aGUgd2F5IHRoZSBvbGQgY29kZSB1c2VkIHRvIHdvcmsuICAqLworCitpbnQKK2RvX3NjcnViX2NoYXJzIChnZXQsIHRvc3RhcnQsIHRvbGVuKQorICAgICBpbnQgKCpnZXQpIFBBUkFNUyAoKGNoYXIgKiopKTsKKyAgICAgY2hhciAqdG9zdGFydDsKKyAgICAgaW50IHRvbGVuOworeworICBjaGFyICp0byA9IHRvc3RhcnQ7CisgIGNoYXIgKnRvZW5kID0gdG9zdGFydCArIHRvbGVuOworICBjaGFyICpmcm9tOworICBjaGFyICpmcm9tZW5kOworICBpbnQgZnJvbWxlbjsKKyAgcmVnaXN0ZXIgaW50IGNoLCBjaDIgPSAwOworCisgIC8qU3RhdGUgMDogYmVnaW5uaW5nIG9mIG5vcm1hbCBsaW5lCisJICAxOiBBZnRlciBmaXJzdCB3aGl0ZXNwYWNlIG9uIGxpbmUgKGZsdXNoIG1vcmUgd2hpdGUpCisJICAyOiBBZnRlciBmaXJzdCBub24td2hpdGUgKG9wY29kZSkgb24gbGluZSAoa2VlcCAxd2hpdGUpCisJICAzOiBhZnRlciBzZWNvbmQgd2hpdGUgb24gbGluZSAoaW50byBvcGVyYW5kcykgKGZsdXNoIHdoaXRlKQorCSAgNDogYWZ0ZXIgcHV0dGluZyBvdXQgYSAubGluZSwgcHV0IG91dCBkaWdpdHMKKwkgIDU6IHBhcnNpbmcgYSBzdHJpbmcsIHRoZW4gZ28gdG8gb2xkLXN0YXRlCisJICA2OiBwdXR0aW5nIG91dCBcIGVzY2FwZSBpbiBhICJkIHN0cmluZy4KKwkgIDc6IEFmdGVyIHB1dHRpbmcgb3V0IGEgLmFwcGZpbGUsIHB1dCBvdXQgc3RyaW5nLgorCSAgODogQWZ0ZXIgcHV0dGluZyBvdXQgYSAuYXBwZmlsZSBzdHJpbmcsIGZsdXNoIHVudGlsIG5ld2xpbmUuCisJICA5OiBBZnRlciBzZWVpbmcgc3ltYm9sIGNoYXIgaW4gc3RhdGUgMyAoa2VlcCAxd2hpdGUgYWZ0ZXIgc3ltY2hhcikKKwkgMTA6IEFmdGVyIHNlZWluZyB3aGl0ZXNwYWNlIGluIHN0YXRlIDkgKGtlZXAgd2hpdGUgYmVmb3JlIHN5bWNoYXIpCisJIDExOiBBZnRlciBzZWVpbmcgYSBzeW1ib2wgY2hhcmFjdGVyIGluIHN0YXRlIDAgKGVnIGEgbGFiZWwgZGVmaW5pdGlvbikKKwkgLTE6IG91dHB1dCBzdHJpbmcgaW4gb3V0X3N0cmluZyBhbmQgZ28gdG8gdGhlIHN0YXRlIGluIG9sZF9zdGF0ZQorCSAtMjogZmx1c2ggdGV4dCB1bnRpbCBhICcqJyAnLycgaXMgc2VlbiwgdGhlbiBnbyB0byBzdGF0ZSBvbGRfc3RhdGUKKyNpZmRlZiBUQ19WODUwCisgICAgICAgICAxMjogQWZ0ZXIgc2VlaW5nIGEgZGFzaCwgbG9va2luZyBmb3IgYSBzZWNvbmQgZGFzaCBhcyBhIHN0YXJ0IG9mIGNvbW1lbnQuCisjZW5kaWYKKyNpZmRlZiBUQ19NMzJSCisJIDEzOiBBZnRlciBzZWVpbmcgYSB2ZXJ0aWNhbCBiYXIsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIHZlcnRpY2FsIGJhciBhcyBhIHBhcmFsbGVsIGV4cHJlc3Npb24gc2VwZXJhdG9yLgorI2VuZGlmCisJICAqLworCisgIC8qIEkgYWRkZWQgc3RhdGVzIDkgYW5kIDEwIGJlY2F1c2UgdGhlIE1JUFMgRUNPRkYgYXNzZW1ibGVyIHVzZXMKKyAgICAgY29uc3RydWN0cyBsaWtlIGBgLmxvYyAxIDIwJycuICBUaGlzIHdhcyB0dXJuaW5nIGludG8gYGAubG9jCisgICAgIDEyMCcnLiAgU3RhdGVzIDkgYW5kIDEwIGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgbmV2ZXIgZHJvcHBlZCBpbgorICAgICBiZXR3ZWVuIGNoYXJhY3RlcnMgd2hpY2ggY291bGQgYXBwZWFyIGluIGEgaWRlbnRpZmllci4gIElhbgorICAgICBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgorCisgICAgIEkgYWRkZWQgc3RhdGUgMTEgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiTGZvbyBhZGQgJXIyNSwlcjI2LCVyMjciIHdvcmtzCisgICAgIGNvcnJlY3RseSBvbiB0aGUgUEEgKGFuZCBhbnkgb3RoZXIgdGFyZ2V0IHdoZXJlIGNvbG9ucyBhcmUgb3B0aW9uYWwpLgorICAgICBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1LgorCisgICAgIEkgYWRkZWQgc3RhdGUgMTMgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiY21wIHIxLCByMiB8fCB0cmFwICMxIiBkb2VzIG5vdAorICAgICBnZXQgc3F1YXNoZWQgaW50byAiY21wIHIxLHIyfHx0cmFwIzEiLCB3aXRoIHRoZSBhbGwgaW1wb3J0YW50IHNwYWNlCisgICAgIGJldHdlZW4gdGhlICd0cmFwJyBhbmQgdGhlICcjMScgYmVpbmcgZWxpbWluYXRlZC4gIG5pY2tjQGN5Z251cy5jb20gICovCisKKyAgLyogVGhpcyBtYWNybyBnZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4gICovCisKKyNkZWZpbmUgR0VUKCkJCQkJXAorICAoZnJvbSA8IGZyb21lbmQJCQlcCisgICA/ICogKHVuc2lnbmVkIGNoYXIgKikgKGZyb20rKykJXAorICAgOiAoKHNhdmVkX2lucHV0ICE9IE5VTEwJCVwKKyAgICAgICA/IChmcmVlIChzYXZlZF9pbnB1dCksCQlcCisJICBzYXZlZF9pbnB1dCA9IE5VTEwsCQlcCisJICAwKQkJCQlcCisgICAgICAgOiAwKSwJCQkJXAorICAgICAgZnJvbWxlbiA9ICgqZ2V0KSAoJmZyb20pLAkJXAorICAgICAgZnJvbWVuZCA9IGZyb20gKyBmcm9tbGVuLAkJXAorICAgICAgKGZyb21sZW4gPT0gMAkJCVwKKyAgICAgICA/IEVPRgkJCQlcCisgICAgICAgOiAqICh1bnNpZ25lZCBjaGFyICopIChmcm9tKyspKSkpCisKKyAgLyogVGhpcyBtYWNybyBwdXNoZXMgYSBjaGFyYWN0ZXIgYmFjayBvbiB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KKworI2RlZmluZSBVTkdFVCh1Y2gpICgqLS1mcm9tID0gKHVjaCkpCisKKyAgLyogVGhpcyBtYWNybyBwdXRzIGEgY2hhcmFjdGVyIGludG8gdGhlIG91dHB1dCBidWZmZXIuICBJZiB0aGlzCisgICAgIGNoYXJhY3RlciBmaWxscyB0aGUgb3V0cHV0IGJ1ZmZlciwgdGhpcyBtYWNybyBqdW1wcyB0byB0aGUgbGFiZWwKKyAgICAgVE9GVUxMLiAgV2UgdXNlIHRoaXMgcmF0aGVyIHVnbHkgYXBwcm9hY2ggYmVjYXVzZSB3ZSBuZWVkIHRvCisgICAgIGhhbmRsZSB0d28gZGlmZmVyZW50IHRlcm1pbmF0aW9uIGNvbmRpdGlvbnM6IEVPRiBvbiB0aGUgaW5wdXQKKyAgICAgc3RyZWFtLCBhbmQgYSBmdWxsIG91dHB1dCBidWZmZXIuICBJdCB3b3VsZCBiZSBzaW1wbGVyIGlmIHdlCisgICAgIGFsd2F5cyByZWFkIGluIHRoZSBlbnRpcmUgaW5wdXQgc3RyZWFtIGJlZm9yZSBwcm9jZXNzaW5nIGl0LCBidXQKKyAgICAgSSBkb24ndCB3YW50IHRvIG1ha2Ugc3VjaCBhIHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgYXNzZW1ibGVyJ3MKKyAgICAgbWVtb3J5IHVzYWdlLiAgKi8KKworI2RlZmluZSBQVVQocGNoKQkJCVwKKyAgZG8JCQkJCVwKKyAgICB7CQkJCQlcCisgICAgICAqdG8rKyA9IChwY2gpOwkJCVwKKyAgICAgIGlmICh0byA+PSB0b2VuZCkJCQlcCisgICAgICAgIGdvdG8gdG9mdWxsOwkJCVwKKyAgICB9CQkJCQlcCisgIHdoaWxlICgwKQorCisgIGlmIChzYXZlZF9pbnB1dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyb20gPSBzYXZlZF9pbnB1dDsKKyAgICAgIGZyb21lbmQgPSBmcm9tICsgc2F2ZWRfaW5wdXRfbGVuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZyb21sZW4gPSAoKmdldCkgKCZmcm9tKTsKKyAgICAgIGlmIChmcm9tbGVuID09IDApCisJcmV0dXJuIDA7CisgICAgICBmcm9tZW5kID0gZnJvbSArIGZyb21sZW47CisgICAgfQorCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIFRoZSBjYXNlcyBpbiB0aGlzIHN3aXRjaCBlbmQgd2l0aCBjb250aW51ZSwgaW4gb3JkZXIgdG8KKyAgICAgICAgIGJyYW5jaCBiYWNrIHRvIHRoZSB0b3Agb2YgdGhpcyB3aGlsZSBsb29wIGFuZCBnZW5lcmF0ZSB0aGUKKyAgICAgICAgIG5leHQgb3V0cHV0IGNoYXJhY3RlciBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUuICAqLworICAgICAgc3dpdGNoIChzdGF0ZSkKKwl7CisJY2FzZSAtMToKKwkgIGNoID0gKm91dF9zdHJpbmcrKzsKKwkgIGlmICgqb3V0X3N0cmluZyA9PSAnXDAnKQorCSAgICB7CisJICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7CisJICAgICAgb2xkX3N0YXRlID0gMzsKKwkgICAgfQorCSAgUFVUIChjaCk7CisJICBjb250aW51ZTsKKworCWNhc2UgLTI6CisJICBmb3IgKDs7KQorCSAgICB7CisJICAgICAgZG8KKwkJeworCQkgIGNoID0gR0VUICgpOworCisJCSAgaWYgKGNoID09IEVPRikKKwkJICAgIHsKKwkJICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIpKTsKKwkJICAgICAgZ290byBmcm9tZW9mOworCQkgICAgfQorCisJCSAgaWYgKGNoID09ICdcbicpCisJCSAgICBQVVQgKCdcbicpOworCQl9CisJICAgICAgd2hpbGUgKGNoICE9ICcqJyk7CisKKwkgICAgICB3aGlsZSAoKGNoID0gR0VUICgpKSA9PSAnKicpCisJCTsKKworCSAgICAgIGlmIChjaCA9PSBFT0YpCisJCXsKKwkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50IikpOworCQkgIGdvdG8gZnJvbWVvZjsKKwkJfQorCisJICAgICAgaWYgKGNoID09ICcvJykKKwkJYnJlYWs7CisKKwkgICAgICBVTkdFVCAoY2gpOworCSAgICB9CisKKwkgIHN0YXRlID0gb2xkX3N0YXRlOworCSAgVU5HRVQgKCcgJyk7CisJICBjb250aW51ZTsKKworCWNhc2UgNDoKKwkgIGNoID0gR0VUICgpOworCSAgaWYgKGNoID09IEVPRikKKwkgICAgZ290byBmcm9tZW9mOworCSAgZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwkgICAgUFVUIChjaCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSkKKwkJY2ggPSBHRVQgKCk7CisJICAgICAgaWYgKGNoID09ICciJykKKwkJeworCQkgIFVOR0VUIChjaCk7CisJCSAgaWYgKHNjcnViX202OGtfbXJpKQorCQkgICAgb3V0X3N0cmluZyA9ICJcblx0YXBwZmlsZSAiOworCQkgIGVsc2UKKwkJICAgIG91dF9zdHJpbmcgPSAiXG5cdC5hcHBmaWxlICI7CisJCSAgb2xkX3N0YXRlID0gNzsKKwkJICBzdGF0ZSA9IC0xOworCQkgIFBVVCAoKm91dF9zdHJpbmcrKyk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicpCisJCSAgICBjaCA9IEdFVCAoKTsKKwkJICBzdGF0ZSA9IDA7CisJCSAgUFVUIChjaCk7CisJCX0KKwkgICAgfQorCSAgY29udGludWU7CisKKwljYXNlIDU6CisJICAvKiBXZSBhcmUgZ29pbmcgdG8gY29weSBldmVyeXRoaW5nIHVwIHRvIGEgcXVvdGUgY2hhcmFjdGVyLAorICAgICAgICAgICAgIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYSBiYWNrc2xhc2guICBXZSB0cnkgdG8KKyAgICAgICAgICAgICBvcHRpbWl6ZSB0aGUgY29weWluZyBpbiB0aGUgc2ltcGxlIGNhc2Ugd2l0aG91dCB1c2luZyB0aGUKKyAgICAgICAgICAgICBHRVQgYW5kIFBVVCBtYWNyb3MuICAqLworCSAgeworCSAgICBjaGFyICpzOworCSAgICBpbnQgbGVuOworCisJICAgIGZvciAocyA9IGZyb207IHMgPCBmcm9tZW5kOyBzKyspCisJICAgICAgeworCQljaCA9ICpzOworCQkvKiBUaGlzIGNvbmRpdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgdGhlIHR5cGUgb2YgYW55CisgICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUuICAqLworCQlpZiAoY2ggPT0gJ1xcJworCQkgICAgfHwgY2ggPT0gJyInCisJCSAgICB8fCBjaCA9PSAnXCcnCisJCSAgICB8fCBjaCA9PSAnXG4nKQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgbGVuID0gcyAtIGZyb207CisJICAgIGlmIChsZW4gPiB0b2VuZCAtIHRvKQorCSAgICAgIGxlbiA9IHRvZW5kIC0gdG87CisJICAgIGlmIChsZW4gPiAwKQorCSAgICAgIHsKKwkJbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKKwkJdG8gKz0gbGVuOworCQlmcm9tICs9IGxlbjsKKwkgICAgICB9CisJICB9CisKKwkgIGNoID0gR0VUICgpOworCSAgaWYgKGNoID09IEVPRikKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIpKTsKKwkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKKwkgICAgICBVTkdFVCAoJ1xuJyk7CisJICAgICAgUFVUICgnIicpOworCSAgICB9CisJICBlbHNlIGlmIChsZXhbY2hdID09IExFWF9JU19TVFJJTkdRVU9URSkKKwkgICAgeworCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOworCSAgICAgIFBVVCAoY2gpOworCSAgICB9CisjaWZuZGVmIE5PX1NUUklOR19FU0NBUEVTCisJICBlbHNlIGlmIChjaCA9PSAnXFwnKQorCSAgICB7CisJICAgICAgc3RhdGUgPSA2OworCSAgICAgIFBVVCAoY2gpOworCSAgICB9CisjZW5kaWYKKwkgIGVsc2UgaWYgKHNjcnViX202OGtfbXJpICYmIGNoID09ICdcbicpCisJICAgIHsKKwkgICAgICAvKiBKdXN0IHF1aWV0bHkgdGVybWluYXRlIHRoZSBzdHJpbmcuICBUaGlzIHBlcm1pdHMgbGluZXMgbGlrZQorCQkgICBibmUJbGFiZWwJbG9vcCBpZiB3ZSBoYXZlbid0IHJlYWNoIGVuZCB5ZXQKKwkJICovCisJICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7CisJICAgICAgVU5HRVQgKGNoKTsKKwkgICAgICBQVVQgKCdcJycpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBQVVQgKGNoKTsKKwkgICAgfQorCSAgY29udGludWU7CisKKwljYXNlIDY6CisJICBzdGF0ZSA9IDU7CisJICBjaCA9IEdFVCAoKTsKKwkgIHN3aXRjaCAoY2gpCisJICAgIHsKKwkgICAgICAvKiBIYW5kbGUgc3RyaW5ncyBicm9rZW4gYWNyb3NzIGxpbmVzLCBieSB0dXJuaW5nICdcbicgaW50bworCQkgJ1xcJyBhbmQgJ24nLiAgKi8KKwkgICAgY2FzZSAnXG4nOgorCSAgICAgIFVOR0VUICgnbicpOworCSAgICAgIGFkZF9uZXdsaW5lcysrOworCSAgICAgIFBVVCAoJ1xcJyk7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnIic6CisJICAgIGNhc2UgJ1xcJzoKKwkgICAgY2FzZSAnYic6CisJICAgIGNhc2UgJ2YnOgorCSAgICBjYXNlICduJzoKKwkgICAgY2FzZSAncic6CisJICAgIGNhc2UgJ3QnOgorCSAgICBjYXNlICd2JzoKKwkgICAgY2FzZSAneCc6CisJICAgIGNhc2UgJ1gnOgorCSAgICBjYXNlICcwJzoKKwkgICAgY2FzZSAnMSc6CisJICAgIGNhc2UgJzInOgorCSAgICBjYXNlICczJzoKKwkgICAgY2FzZSAnNCc6CisJICAgIGNhc2UgJzUnOgorCSAgICBjYXNlICc2JzoKKwkgICAgY2FzZSAnNyc6CisJICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUykgfCBkZWZpbmVkKE9OTFlfU1RBTkRBUkRfRVNDQVBFUykKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhc193YXJuIChfKCJVbmtub3duIGVzY2FwZSAnXFwlYycgaW4gc3RyaW5nOiBJZ25vcmVkIiksIGNoKTsKKwkgICAgICBicmVhazsKKyNlbHNlICAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KKwkgICAgZGVmYXVsdDoKKwkgICAgICAvKiBBY2NlcHQgXHggYXMgeCBmb3IgYW55IHggKi8KKwkgICAgICBicmVhazsKKyNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KKworCSAgICBjYXNlIEVPRjoKKwkgICAgICBhc193YXJuIChfKCJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiKSk7CisJICAgICAgUFVUICgnIicpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBQVVQgKGNoKTsKKwkgIGNvbnRpbnVlOworCisJY2FzZSA3OgorCSAgY2ggPSBHRVQgKCk7CisJICBzdGF0ZSA9IDU7CisJICBvbGRfc3RhdGUgPSA4OworCSAgaWYgKGNoID09IEVPRikKKwkgICAgZ290byBmcm9tZW9mOworCSAgUFVUIChjaCk7CisJICBjb250aW51ZTsKKworCWNhc2UgODoKKwkgIGRvCisJICAgIGNoID0gR0VUICgpOworCSAgd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKKwkgIGlmIChjaCA9PSBFT0YpCisJICAgIGdvdG8gZnJvbWVvZjsKKwkgIHN0YXRlID0gMDsKKwkgIFBVVCAoY2gpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBPSywgd2UgYXJlIHNvbWV3aGVyZSBpbiBzdGF0ZXMgMCB0aHJvdWdoIDQgb3IgOSB0aHJvdWdoIDExICovCisKKyAgICAgIC8qIGZsdXNoY2hhcjogKi8KKyAgICAgIGNoID0gR0VUICgpOworCisgICAgcmVjeWNsZToKKworI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgorICAgICAgLyogV2UgbmVlZCB0byB3YXRjaCBvdXQgZm9yIC5zeW12ZXIgZGlyZWN0aXZlcy4gIFNlZSB0aGUgY29tbWVudCBsYXRlcgorCSBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGlmIChzeW12ZXJfc3RhdGUgPT0gTlVMTCkKKwl7CisJICBpZiAoKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkgJiYgY2ggPT0gc3ltdmVyX3BzZXVkb1swXSkKKwkgICAgc3ltdmVyX3N0YXRlID0gc3ltdmVyX3BzZXVkbyArIDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFdlIGFkdmFuY2UgdG8gdGhlIG5leHQgc3RhdGUgaWYgd2UgZmluZCB0aGUgcmlnaHQKKwkgICAgIGNoYXJhY3Rlci4gICovCisJICBpZiAoY2ggIT0gJ1wwJyAmJiAoKnN5bXZlcl9zdGF0ZSA9PSBjaCkpCisJICAgICsrc3ltdmVyX3N0YXRlOworCSAgZWxzZSBpZiAoKnN5bXZlcl9zdGF0ZSAhPSAnXDAnKQorCSAgICAvKiBXZSBkaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyLCBvciB3ZSBkaWRuJ3QKKwkgICAgICAgZ2V0IGEgdmFsaWQgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFmdGVyIHNlZWluZyB0aGUKKwkgICAgICAgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLworCSAgICBzeW12ZXJfc3RhdGUgPSBOVUxMOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogV2UndmUgcmVhZCB0aGUgZW50aXJlIHBzZXVkby1vcC4gIElmIHRoaXMgaXMgdGhlIGVuZAorCQkgb2YgdGhlIGxpbmUsIGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCisJICAgICAgaWYgKElTX05FV0xJTkUgKGNoKSkKKwkJc3ltdmVyX3N0YXRlID0gTlVMTDsKKwkgICAgfQorCX0KKyNlbmRpZiAvKiBUQ19BUk0gJiYgT0JKX0VMRiAqLworCisjaWZkZWYgVENfTTY4SworICAgICAgLyogV2Ugd2FudCB0byBoYXZlIHBzZXVkby1vcHMgd2hpY2ggY29udHJvbCB3aGV0aGVyIHdlIGFyZSBpbgorICAgICAgICAgTVJJIG1vZGUgb3Igbm90LiAgVW5mb3J0dW5hdGVseSwgc2luY2UgbTY4ayBNUkkgbW9kZSBhZmZlY3RzCisgICAgICAgICB0aGUgc2NydWJiZXIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIGEgc3BlY2lhbCBwdXJwb3NlCisgICAgICAgICByZWNvZ25pemVyIGhlcmUuICAqLworICAgICAgaWYgKG1yaV9zdGF0ZSA9PSBOVUxMKQorCXsKKwkgIGlmICgoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQorCSAgICAgICYmIGNoID09IG1yaV9wc2V1ZG9bMF0pCisJICAgIG1yaV9zdGF0ZSA9IG1yaV9wc2V1ZG8gKyAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBhZHZhbmNlIHRvIHRoZSBuZXh0IHN0YXRlIGlmIHdlIGZpbmQgdGhlIHJpZ2h0CisJICAgICBjaGFyYWN0ZXIsIG9yIGlmIHdlIG5lZWQgYSBzcGFjZSBjaGFyYWN0ZXIgYW5kIHdlIGdldCBhbnkKKwkgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBvciBpZiB3ZSBuZWVkIGEgJzAnIGFuZCB3ZSBnZXQgYQorCSAgICAgJzEnICh0aGlzIGlzIHNvIHRoYXQgd2Ugb25seSBuZWVkIG9uZSBzdGF0ZSB0byBoYW5kbGUKKwkgICAgIGBgLm1yaSAwJycgYW5kIGBgLm1yaSAxJycpLiAgKi8KKwkgIGlmIChjaCAhPSAnXDAnCisJICAgICAgJiYgKCptcmlfc3RhdGUgPT0gY2gKKwkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnICcKKwkJICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfV0hJVEVTUEFDRSkKKwkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnMCcKKwkJICAgICAgJiYgY2ggPT0gJzEnKSkpCisJICAgIHsKKwkgICAgICBtcmlfbGFzdF9jaCA9IGNoOworCSAgICAgICsrbXJpX3N0YXRlOworCSAgICB9CisJICBlbHNlIGlmICgqbXJpX3N0YXRlICE9ICdcMCcKKwkJICAgfHwgKGxleFtjaF0gIT0gTEVYX0lTX1dISVRFU1BBQ0UKKwkJICAgICAgICYmIGxleFtjaF0gIT0gTEVYX0lTX05FV0xJTkUpKQorCSAgICB7CisJICAgICAgLyogV2UgZGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGNoYXJhY3Rlciwgb3Igd2UgZGlkbid0CisJCSBnZXQgYSB2YWxpZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYWZ0ZXIgc2VlaW5nIHRoZQorCQkgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZQorCQkgYmVnaW5uaW5nLiAgKi8KKwkgICAgICBtcmlfc3RhdGUgPSBOVUxMOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSd2ZSByZWFkIHRoZSBlbnRpcmUgcHNldWRvLW9wLiAgbWlwc19sYXN0X2NoIGlzCisgICAgICAgICAgICAgICAgIGVpdGhlciAnMCcgb3IgJzEnIGluZGljYXRpbmcgd2hldGhlciB0byBlbnRlciBvcgorICAgICAgICAgICAgICAgICBsZWF2ZSBNUkkgbW9kZS4gICovCisJICAgICAgZG9fc2NydWJfYmVnaW4gKG1yaV9sYXN0X2NoID09ICcxJyk7CisJICAgICAgbXJpX3N0YXRlID0gTlVMTDsKKworCSAgICAgIC8qIFdlIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBjaGFyYWN0ZXIgYXMgdXN1YWwuICBUaGUKKyAgICAgICAgICAgICAgICAgbWFpbiBnYXMgcmVhZGVyIG11c3QgYWxzbyBoYW5kbGUgdGhlIC5tcmkgcHNldWRvLW9wCisgICAgICAgICAgICAgICAgIHRvIGNvbnRyb2wgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCB0aGUgbGlrZS4gICovCisJICAgIH0KKwl9CisjZW5kaWYKKworICAgICAgaWYgKGNoID09IEVPRikKKwl7CisJICBpZiAoc3RhdGUgIT0gMCkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIikpOworCSAgICAgIHN0YXRlID0gMDsKKwkgICAgICBQVVQgKCdcbicpOworCSAgICB9CisJICBnb3RvIGZyb21lb2Y7CisJfQorCisgICAgICBzd2l0Y2ggKGxleFtjaF0pCisJeworCWNhc2UgTEVYX0lTX1dISVRFU1BBQ0U6CisJICBkbworCSAgICB7CisJICAgICAgY2ggPSBHRVQgKCk7CisJICAgIH0KKwkgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKKwkgIGlmIChjaCA9PSBFT0YpCisJICAgIGdvdG8gZnJvbWVvZjsKKworCSAgaWYgKHN0YXRlID09IDApCisJICAgIHsKKwkgICAgICAvKiBQcmVzZXJ2ZSBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhdCB0aGUKKwkJIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLworCSAgICAgIHN0YXRlID0gMTsKKwkgICAgICBVTkdFVCAoY2gpOworCSAgICAgIFBVVCAoJyAnKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBpZiAoSVNfQ09NTUVOVCAoY2gpCisJICAgICAgfHwgY2ggPT0gJy8nCisJICAgICAgfHwgSVNfTElORV9TRVBBUkFUT1IgKGNoKSkKKwkgICAgeworCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKKwkJeworCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCisJCSAgVU5HRVQgKGNoKTsKKwkJICBQVVQgKCcgJyk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBnb3RvIHJlY3ljbGU7CisJICAgIH0KKworCSAgLyogSWYgd2UncmUgaW4gc3RhdGUgMiBvciAxMSwgd2UndmUgc2VlbiBhIG5vbi13aGl0ZQorCSAgICAgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuICBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIKKwkgICAgIGlzICc6JywgdGhpcyBpcyB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwgbmFtZSB3aGljaCB3ZQorCSAgICAgbm9ybWFsbHkgbXVzdCBpZ25vcmUuICBJbiBNUkkgbW9kZSwgdGhvdWdoLCBzcGFjZXMgYXJlCisJICAgICBub3QgcGVybWl0dGVkIGJldHdlZW4gdGhlIGxhYmVsIGFuZCB0aGUgY29sb24uICAqLworCSAgaWYgKChzdGF0ZSA9PSAyIHx8IHN0YXRlID09IDExKQorCSAgICAgICYmIGxleFtjaF0gPT0gTEVYX0lTX0NPTE9OCisJICAgICAgJiYgISBzY3J1Yl9tNjhrX21yaSkKKwkgICAgeworCSAgICAgIHN0YXRlID0gMTsKKwkgICAgICBQVVQgKGNoKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBzd2l0Y2ggKHN0YXRlKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICBzdGF0ZSsrOworCSAgICAgIGdvdG8gcmVjeWNsZTsJLyogUHVudGVkIGxlYWRpbmcgc3AgKi8KKwkgICAgY2FzZSAxOgorCSAgICAgIC8qIFdlIGNhbiBhcnJpdmUgaGVyZSBpZiB3ZSBsZWF2ZSBhIGxlYWRpbmcgd2hpdGVzcGFjZQorCQkgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KKwkgICAgICBnb3RvIHJlY3ljbGU7CisJICAgIGNhc2UgMjoKKwkgICAgICBzdGF0ZSA9IDM7CisJICAgICAgaWYgKHRvICsgMSA8IHRvZW5kKQorCQl7CisJCSAgLyogT3B0aW1pemUgY29tbW9uIGNhc2UgYnkgc2tpcHBpbmcgVU5HRVQvR0VULiAgKi8KKwkJICBQVVQgKCcgJyk7CS8qIFNwIGFmdGVyIG9wY28gKi8KKwkJICBnb3RvIHJlY3ljbGU7CisJCX0KKwkgICAgICBVTkdFVCAoY2gpOworCSAgICAgIFBVVCAoJyAnKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAzOgorCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKKwkJeworCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCisJCSAgVU5HRVQgKGNoKTsKKwkJICBQVVQgKCcgJyk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBnb3RvIHJlY3ljbGU7CS8qIFNwIGluIG9wZXJhbmRzICovCisJICAgIGNhc2UgOToKKwkgICAgY2FzZSAxMDoKKwkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCisJCXsKKwkJICAvKiBJbiBNUkkgbW9kZSwgd2Uga2VlcCB0aGVzZSBzcGFjZXMuICAqLworCQkgIHN0YXRlID0gMzsKKwkJICBVTkdFVCAoY2gpOworCQkgIFBVVCAoJyAnKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIHN0YXRlID0gMTA7CS8qIFNwIGFmdGVyIHN5bWJvbCBjaGFyICovCisJICAgICAgZ290byByZWN5Y2xlOworCSAgICBjYXNlIDExOgorCSAgICAgIGlmIChmbGFnX202OGtfbXJpCisjaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCisJCSAgfHwgMQorI2VuZGlmCisJCSAgKQorCQlzdGF0ZSA9IDE7CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2Uga25vdyB0aGF0IGNoIGlzIG5vdCAnOicsIHNpbmNlIHdlIHRlc3RlZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICBjYXNlIGFib3ZlLiAgVGhlcmVmb3JlIHRoaXMgaXMgbm90IGEgbGFiZWwsIHNvIGl0CisgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBvcGNvZGUsIGFuZCB3ZSd2ZSBqdXN0IHNlZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlIGFmdGVyIGl0LiAgKi8KKwkJICBzdGF0ZSA9IDM7CisJCX0KKwkgICAgICBVTkdFVCAoY2gpOworCSAgICAgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgbGFiZWwgZGVmaW5pdGlvbi4gICovCisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgQkFEX0NBU0UgKHN0YXRlKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOgorCSAgY2gyID0gR0VUICgpOworCSAgaWYgKGNoMiA9PSAnKicpCisJICAgIHsKKwkgICAgICBmb3IgKDs7KQorCQl7CisJCSAgZG8KKwkJICAgIHsKKwkJICAgICAgY2gyID0gR0VUICgpOworCQkgICAgICBpZiAoY2gyICE9IEVPRiAmJiBJU19ORVdMSU5FIChjaDIpKQorCQkJYWRkX25ld2xpbmVzKys7CisJCSAgICB9CisJCSAgd2hpbGUgKGNoMiAhPSBFT0YgJiYgY2gyICE9ICcqJyk7CisKKwkJICB3aGlsZSAoY2gyID09ICcqJykKKwkJICAgIGNoMiA9IEdFVCAoKTsKKworCQkgIGlmIChjaDIgPT0gRU9GIHx8IGNoMiA9PSAnLycpCisJCSAgICBicmVhazsKKworCQkgIC8qIFRoaXMgVU5HRVQgd2lsbCBlbnN1cmUgdGhhdCB3ZSBjb3VudCBuZXdsaW5lcworICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KKwkJICBVTkdFVCAoY2gyKTsKKwkJfQorCisJICAgICAgaWYgKGNoMiA9PSBFT0YpCisJCWFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IikpOworCisJICAgICAgY2ggPSAnICc7CisJICAgICAgZ290byByZWN5Y2xlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoY2gyICE9IEVPRikKKwkJVU5HRVQgKGNoMik7CisJICAgICAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCisJCXN0YXRlID0gMzsKKwkgICAgICBQVVQgKGNoKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIExFWF9JU19TVFJJTkdRVU9URToKKwkgIGlmIChzdGF0ZSA9PSAxMCkKKwkgICAgeworCSAgICAgIC8qIFByZXNlcnZlIHRoZSB3aGl0ZXNwYWNlIGluIGZvbyAiYmFyIiAqLworCSAgICAgIFVOR0VUIChjaCk7CisJICAgICAgc3RhdGUgPSAzOworCSAgICAgIFBVVCAoJyAnKTsKKworCSAgICAgIC8qIFBVVCBkaWRuJ3QganVtcCBvdXQuICBXZSBjb3VsZCBqdXN0IGJyZWFrLCBidXQgd2UKKyAgICAgICAgICAgICAgICAga25vdyB3aGF0IHdpbGwgaGFwcGVuLCBzbyBvcHRpbWl6ZSBhIGJpdC4gICovCisJICAgICAgY2ggPSBHRVQgKCk7CisJICAgICAgb2xkX3N0YXRlID0gMzsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKKwkgICAgb2xkX3N0YXRlID0gMzsKKwkgIGVsc2UKKwkgICAgb2xkX3N0YXRlID0gc3RhdGU7CisJICBzdGF0ZSA9IDU7CisJICBQVVQgKGNoKTsKKwkgIGJyZWFrOworCisjaWZuZGVmIElFRUVfU1RZTEUKKwljYXNlIExFWF9JU19PTkVDSEFSX1FVT1RFOgorCSAgaWYgKHN0YXRlID09IDEwKQorCSAgICB7CisJICAgICAgLyogUHJlc2VydmUgdGhlIHdoaXRlc3BhY2UgaW4gZm9vICdiJyAqLworCSAgICAgIFVOR0VUIChjaCk7CisJICAgICAgc3RhdGUgPSAzOworCSAgICAgIFBVVCAoJyAnKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgY2ggPSBHRVQgKCk7CisJICBpZiAoY2ggPT0gRU9GKQorCSAgICB7CisJICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiKSk7CisJICAgICAgY2ggPSAwOworCSAgICB9CisJICBpZiAoY2ggPT0gJ1xcJykKKwkgICAgeworCSAgICAgIGNoID0gR0VUICgpOworCSAgICAgIGlmIChjaCA9PSBFT0YpCisJCXsKKwkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBlc2NhcGUgY2hhcmFjdGVyIikpOworCQkgIGNoID0gJ1xcJzsKKwkJfQorCSAgICAgIGVsc2UKKwkJY2ggPSBwcm9jZXNzX2VzY2FwZSAoY2gpOworCSAgICB9CisJICBzcHJpbnRmIChvdXRfYnVmLCAiJWQiLCAoaW50KSAodW5zaWduZWQgY2hhcikgY2gpOworCisJICAvKiBOb25lIG9mIHRoZXNlICd4IGNvbnN0YW50cyBmb3IgdXMuICBXZSB3YW50ICd4Jy4gICovCisJICBpZiAoKGNoID0gR0VUICgpKSAhPSAnXCcnKQorCSAgICB7CisjaWZkZWYgUkVRVUlSRV9DSEFSX0NMT1NFX1FVT1RFCisJICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIikpOworI2Vsc2UKKwkgICAgICBpZiAoY2ggIT0gRU9GKQorCQlVTkdFVCAoY2gpOworI2VuZGlmCisJICAgIH0KKwkgIGlmIChzdHJsZW4gKG91dF9idWYpID09IDEpCisJICAgIHsKKwkgICAgICBQVVQgKG91dF9idWZbMF0pOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAoc3RhdGUgPT0gOSkKKwkgICAgb2xkX3N0YXRlID0gMzsKKwkgIGVsc2UKKwkgICAgb2xkX3N0YXRlID0gc3RhdGU7CisJICBzdGF0ZSA9IC0xOworCSAgb3V0X3N0cmluZyA9IG91dF9idWY7CisJICBQVVQgKCpvdXRfc3RyaW5nKyspOworCSAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgTEVYX0lTX0NPTE9OOgorCSAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCisJICAgIHN0YXRlID0gMzsKKwkgIGVsc2UgaWYgKHN0YXRlICE9IDMpCisJICAgIHN0YXRlID0gMTsKKwkgIFBVVCAoY2gpOworCSAgYnJlYWs7CisKKwljYXNlIExFWF9JU19ORVdMSU5FOgorCSAgLyogUm9sbCBvdXQgYSBidW5jaCBvZiBuZXdsaW5lcyBmcm9tIGluc2lkZSBjb21tZW50cywgZXRjLiAgKi8KKwkgIGlmIChhZGRfbmV3bGluZXMpCisJICAgIHsKKwkgICAgICAtLWFkZF9uZXdsaW5lczsKKwkgICAgICBVTkdFVCAoY2gpOworCSAgICB9CisJICAvKiBmYWxsIHRocnUgaW50by4uLiAqLworCisJY2FzZSBMRVhfSVNfTElORV9TRVBBUkFUT1I6CisJICBzdGF0ZSA9IDA7CisJICBQVVQgKGNoKTsKKwkgIGJyZWFrOworCisjaWZkZWYgVENfVjg1MAorCWNhc2UgTEVYX0lTX0RPVUJMRURBU0hfMVNUOgorCSAgY2gyID0gR0VUKCk7CisJICBpZiAoY2gyICE9ICctJykKKwkgICAgeworCSAgICAgIFVOR0VUIChjaDIpOworCSAgICAgIGdvdG8gZGVfZmF1bHQ7CisJICAgIH0KKwkgIC8qIHJlYWQgYW5kIHNraXAgdG8gZW5kIG9mIGxpbmUgKi8KKwkgIGRvCisJICAgIHsKKwkgICAgICBjaCA9IEdFVCAoKTsKKwkgICAgfQorCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKTsKKwkgIGlmIChjaCA9PSBFT0YpCisJICAgIHsKKwkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOworCSAgICB9CisJICBzdGF0ZSA9IDA7CisJICBQVVQgKCdcbicpOworCSAgYnJlYWs7CisjZW5kaWYJICAgIAorI2lmZGVmIFRDX00zMlIKKwljYXNlIExFWF9JU19ET1VCTEVCQVJfMVNUOgorCSAgY2gyID0gR0VUKCk7CisJICBpZiAoY2gyICE9ICd8JykKKwkgICAgeworCSAgICAgIFVOR0VUIChjaDIpOworCSAgICAgIGdvdG8gZGVfZmF1bHQ7CisJICAgIH0KKwkgIC8qIFJlc2V0IGJhY2sgdG8gc3RhdGUgMSBhbmQgcHJldGVuZCB0aGF0IHdlIGFyZSBwYXJzaW5nIGEgbGluZSBmcm9tCisJICAgICBqdXN0IGFmdGVyIHRoZSBmaXJzdCB3aGl0ZSBzcGFjZS4gICovCisJICBzdGF0ZSA9IDE7CisJICBQVVQgKCd8Jyk7CisJICBQVVQgKCd8Jyk7CisJICBicmVhazsKKyNlbmRpZgkgICAgCisJY2FzZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOgorCSAgLyogRklYTUUtc29tZWRheTogVGhlIHR3byBjaGFyYWN0ZXIgY29tbWVudCBzdHVmZiB3YXMgYmFkbHkKKwkgICAgIHRob3VnaHQgb3V0LiAgT24gaTM4Niwgd2Ugd2FudCAnLycgYXMgbGluZSBjb21tZW50IHN0YXJ0CisJICAgICBBTkQgd2Ugd2FudCBDIHN0eWxlIGNvbW1lbnRzLiAgaGVuY2UgdGhpcyBoYWNrLiAgVGhlCisJICAgICB3aG9sZSBsZXhpY2FsIHByb2Nlc3Mgc2hvdWxkIGJlIHJld29ya2VkLiAgeG94b3JpY2guICAqLworCSAgaWYgKGNoID09ICcvJykKKwkgICAgeworCSAgICAgIGNoMiA9IEdFVCAoKTsKKwkgICAgICBpZiAoY2gyID09ICcqJykKKwkJeworCQkgIG9sZF9zdGF0ZSA9IDM7CisJCSAgc3RhdGUgPSAtMjsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIFVOR0VUIChjaDIpOworCQl9CisJICAgIH0gLyogYmFkIGhhY2sgKi8KKworCSAgaWYgKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkJLyogT25seSBjb21tZW50IGF0IHN0YXJ0IG9mIGxpbmUuICAqLworCSAgICB7CisJICAgICAgaW50IHN0YXJ0Y2g7CisKKwkgICAgICBzdGFydGNoID0gY2g7CisKKwkgICAgICBkbworCQl7CisJCSAgY2ggPSBHRVQgKCk7CisJCX0KKwkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSk7CisJICAgICAgaWYgKGNoID09IEVPRikKKwkJeworCQkgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7CisJCSAgUFVUICgnXG4nKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JyB8fCBzdGF0ZSAhPSAwIHx8IHN0YXJ0Y2ggIT0gJyMnKQorCQl7CisJCSAgLyogTm90IGEgY3BwIGxpbmUuICAqLworCQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgIUlTX05FV0xJTkUgKGNoKSkKKwkJICAgIGNoID0gR0VUICgpOworCQkgIGlmIChjaCA9PSBFT0YpCisJCSAgICBhc193YXJuIChfKCJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIpKTsKKwkJICBzdGF0ZSA9IDA7CisJCSAgUFVUICgnXG4nKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIC8qIExva3MgbGlrZSBgIyAxMjMgImZpbGVuYW1lIicgZnJvbSBjcHAuICAqLworCSAgICAgIFVOR0VUIChjaCk7CisJICAgICAgb2xkX3N0YXRlID0gNDsKKwkgICAgICBzdGF0ZSA9IC0xOworCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKKwkJb3V0X3N0cmluZyA9ICJcdGFwcGxpbmUgIjsKKwkgICAgICBlbHNlCisJCW91dF9zdHJpbmcgPSAiXHQuYXBwbGluZSAiOworCSAgICAgIFBVVCAoKm91dF9zdHJpbmcrKyk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworI2lmZGVmIFRDX0QxMFYKKwkgIC8qIEFsbCBpbnNucyBlbmQgaW4gYSBjaGFyIGZvciB3aGljaCBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCBpcyB0cnVlLgorCSAgICAgVHJhcCBpcyB0aGUgb25seSBzaG9ydCBpbnNuIHRoYXQgaGFzIGEgZmlyc3Qgb3BlcmFuZCB0aGF0IGlzCisJICAgICBuZWl0aGVyIHJlZ2lzdGVyIG5vciBsYWJlbC4KKwkgICAgIFdlIG11c3QgcHJldmVudCBleGVmMGYgfHx0cmFwICMxIHRvIGRlZ2VuZXJhdGUgdG8gZXhlZjBmIHx8dHJhcCMxIC4KKwkgICAgIFdlIGNhbid0IG1ha2UgJyMnIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UIGJlY2F1c2UgaXQgaXMgYWxyZWFkeQorCSAgICAgTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVC4gIEhvd2V2ZXIsIGl0IGlzIHRoZSBvbmx5IGNoYXJhY3RlciBpbgorCSAgICAgbGluZV9jb21tZW50X2NoYXJzIGZvciBkMTB2LCBoZW5jZSB3ZSBjYW4gcmVjb2duaXplIGl0IGFzIHN1Y2guICAqLworCSAgLyogQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gcmVzZXQgdGhlIHN0YXRlIHRvIDEgd2hlbgorCSAgICAgd2Ugc2VlICd8fCcsICc8Jy0gb3IgJy0+JywgYnV0IHRoYXQgc2VlbXMgdG8gYmUgb3ZlcmtpbGwuICAqLworCSAgaWYgKHN0YXRlID09IDEwKSBQVVQgKCcgJyk7CisjZW5kaWYKKwkgIC8qIFdlIGhhdmUgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIHdoaWNoIGlzIG5vdCBhdCB0aGUKKwkgICAgIHN0YXJ0IG9mIGEgbGluZS4gIElmIHRoaXMgaXMgYWxzbyBhIG5vcm1hbCBjb21tZW50CisJICAgICBjaGFyYWN0ZXIsIGZhbGwgdGhyb3VnaC4gIE90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGRlZmF1bHQKKwkgICAgIGNoYXJhY3Rlci4gICovCisJICBpZiAoc3RyY2hyICh0Y19jb21tZW50X2NoYXJzLCBjaCkgPT0gTlVMTAorCSAgICAgICYmICghIHNjcnViX202OGtfbXJpCisJCSAgfHwgKGNoICE9ICchJyAmJiBjaCAhPSAnKicpKSkKKwkgICAgZ290byBkZV9mYXVsdDsKKwkgIGlmIChzY3J1Yl9tNjhrX21yaQorCSAgICAgICYmIChjaCA9PSAnIScgfHwgY2ggPT0gJyonIHx8IGNoID09ICcjJykKKwkgICAgICAmJiBzdGF0ZSAhPSAxCisJICAgICAgJiYgc3RhdGUgIT0gMTApCisJICAgIGdvdG8gZGVfZmF1bHQ7CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgTEVYX0lTX0NPTU1FTlRfU1RBUlQ6CisjaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCisJICAvKiBPbiB0aGUgQVJNLCBgQCcgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgorCSAgICAgVW5mb3J0dW5hdGVseSB0aGlzIGlzIGFsc28gYSBzcGVjaWFsIGNoYXJhY3RlciBpbiBFTEYgLnN5bXZlcgorCSAgICAgZGlyZWN0aXZlcyAoYW5kIC50eXBlLCB0aG91Z2ggd2UgZGVhbCB3aXRoIHRob3NlIGFub3RoZXIgd2F5KS4gIFNvCisJICAgICB3ZSBjaGVjayBpZiB0aGlzIGxpbmUgaXMgc3VjaCBhIGRpcmVjdGl2ZSwgYW5kIHRyZWF0IHRoZSBjaGFyYWN0ZXIKKwkgICAgIGFzIGRlZmF1bHQgaWYgc28uICBUaGlzIGlzIGEgaGFjay4gICovCisJICBpZiAoKHN5bXZlcl9zdGF0ZSAhPSBOVUxMKSAmJiAoKnN5bXZlcl9zdGF0ZSA9PSAwKSkKKwkgICAgZ290byBkZV9mYXVsdDsKKyNlbmRpZgorCSAgZG8KKwkgICAgeworCSAgICAgIGNoID0gR0VUICgpOworCSAgICB9CisJICB3aGlsZSAoY2ggIT0gRU9GICYmICFJU19ORVdMSU5FIChjaCkpOworCSAgaWYgKGNoID09IEVPRikKKwkgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKKwkgIHN0YXRlID0gMDsKKwkgIFBVVCAoJ1xuJyk7CisJICBicmVhazsKKworCWNhc2UgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ6CisJICBpZiAoc3RhdGUgPT0gMTApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIGNoYXJhY3RlciBmb2xsb3dpbmcgYW5vdGhlciBzeW1ib2wKKwkJIGNoYXJhY3Rlciwgd2l0aCB3aGl0ZXNwYWNlIGluIGJldHdlZW4uICBXZSBza2lwcGVkCisJCSB0aGUgd2hpdGVzcGFjZSBlYXJsaWVyLCBzbyBvdXRwdXQgaXQgbm93LiAgKi8KKwkgICAgICBVTkdFVCAoY2gpOworCSAgICAgIHN0YXRlID0gMzsKKwkgICAgICBQVVQgKCcgJyk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKHN0YXRlID09IDMpCisJICAgIHN0YXRlID0gOTsKKworCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBjYXNlLiAgUXVpY2tseSBjb3B5IENIIGFuZCBhbGwgdGhlCisgICAgICAgICAgICAgZm9sbG93aW5nIHN5bWJvbCBjb21wb25lbnQgb3Igbm9ybWFsIGNoYXJhY3RlcnMuICAqLworCSAgaWYgKHRvICsgMSA8IHRvZW5kCisJICAgICAgJiYgbXJpX3N0YXRlID09IE5VTEwKKyNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKKwkgICAgICAmJiBzeW12ZXJfc3RhdGUgPT0gTlVMTAorI2VuZGlmCisJICAgICAgKQorCSAgICB7CisJICAgICAgY2hhciAqczsKKwkgICAgICBpbnQgbGVuOworCisJICAgICAgZm9yIChzID0gZnJvbTsgcyA8IGZyb21lbmQ7IHMrKykKKwkJeworCQkgIGludCB0eXBlOworCisJCSAgY2gyID0gKiAodW5zaWduZWQgY2hhciAqKSBzOworCQkgIHR5cGUgPSBsZXhbY2gyXTsKKwkJICBpZiAodHlwZSAhPSAwCisJCSAgICAgICYmIHR5cGUgIT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCisJCSAgICBicmVhazsKKwkJfQorCSAgICAgIGlmIChzID4gZnJvbSkKKwkJeworCQkgIC8qIEhhbmRsZSB0aGUgbGFzdCBjaGFyYWN0ZXIgbm9ybWFsbHksIGZvcgorICAgICAgICAgICAgICAgICAgICAgc2ltcGxpY2l0eS4gICovCisJCSAgLS1zOworCQl9CisJICAgICAgbGVuID0gcyAtIGZyb207CisJICAgICAgaWYgKGxlbiA+ICh0b2VuZCAtIHRvKSAtIDEpCisJCWxlbiA9ICh0b2VuZCAtIHRvKSAtIDE7CisJICAgICAgaWYgKGxlbiA+IDApCisJCXsKKwkJICBQVVQgKGNoKTsKKwkJICBpZiAobGVuID4gOCkKKwkJICAgIHsKKwkJICAgICAgbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKKwkJICAgICAgdG8gKz0gbGVuOworCQkgICAgICBmcm9tICs9IGxlbjsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHN3aXRjaCAobGVuKQorCQkJeworCQkJY2FzZSA4OiAqdG8rKyA9ICpmcm9tKys7CisJCQljYXNlIDc6ICp0bysrID0gKmZyb20rKzsKKwkJCWNhc2UgNjogKnRvKysgPSAqZnJvbSsrOworCQkJY2FzZSA1OiAqdG8rKyA9ICpmcm9tKys7CisJCQljYXNlIDQ6ICp0bysrID0gKmZyb20rKzsKKwkJCWNhc2UgMzogKnRvKysgPSAqZnJvbSsrOworCQkJY2FzZSAyOiAqdG8rKyA9ICpmcm9tKys7CisJCQljYXNlIDE6ICp0bysrID0gKmZyb20rKzsKKwkJCX0KKwkJICAgIH0gCisJCSAgY2ggPSBHRVQgKCk7CisJCX0KKwkgICAgfQorCisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWRlZmF1bHQ6CisJZGVfZmF1bHQ6CisJICAvKiBTb21lIHJlbGF0aXZlbHkgYG5vcm1hbCcgY2hhcmFjdGVyLiAgKi8KKwkgIGlmIChzdGF0ZSA9PSAwKQorCSAgICB7CisJICAgICAgc3RhdGUgPSAxMTsJLyogTm93IHNlZWluZyBsYWJlbCBkZWZpbml0aW9uICovCisJICAgIH0KKwkgIGVsc2UgaWYgKHN0YXRlID09IDEpCisJICAgIHsKKwkgICAgICBzdGF0ZSA9IDI7CS8qIERpdHRvICovCisJICAgIH0KKwkgIGVsc2UgaWYgKHN0YXRlID09IDkpCisJICAgIHsKKwkgICAgICBpZiAobGV4W2NoXSAhPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCkKKwkJc3RhdGUgPSAzOworCSAgICB9CisJICBlbHNlIGlmIChzdGF0ZSA9PSAxMCkKKwkgICAgeworCSAgICAgIHN0YXRlID0gMzsKKwkgICAgfQorCSAgUFVUIChjaCk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qTk9UUkVBQ0hFRCovCisKKyBmcm9tZW9mOgorICAvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICAqLworICByZXR1cm4gdG8gLSB0b3N0YXJ0OworCisgdG9mdWxsOgorICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgU2F2ZSBhbnkgaW5wdXQgd2UgaGF2ZSBub3QgeWV0CisgICAgIHByb2Nlc3NlZC4gICovCisgIGlmIChmcm9tZW5kID4gZnJvbSkKKyAgICB7CisgICAgICBjaGFyICpzYXZlOworCisgICAgICBzYXZlID0gKGNoYXIgKikgeG1hbGxvYyAoZnJvbWVuZCAtIGZyb20pOworICAgICAgbWVtY3B5IChzYXZlLCBmcm9tLCBmcm9tZW5kIC0gZnJvbSk7CisgICAgICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKKwlmcmVlIChzYXZlZF9pbnB1dCk7CisgICAgICBzYXZlZF9pbnB1dCA9IHNhdmU7CisgICAgICBzYXZlZF9pbnB1dF9sZW4gPSBmcm9tZW5kIC0gZnJvbTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKKwl7CisJICBmcmVlIChzYXZlZF9pbnB1dCk7CisJICBzYXZlZF9pbnB1dCA9IE5VTEw7CisJfQorICAgIH0KKyAgcmV0dXJuIHRvIC0gdG9zdGFydDsKK30KKworLyogZW5kIG9mIGFwcC5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuYyBiL2dhcy9hcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZGQzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvYXMuYwpAQCAtMCwwICsxLDEwMTAgQEAKKy8qIGFzLmMgLSBHQVMgbWFpbiBwcm9ncmFtLgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKgorICogTWFpbiBwcm9ncmFtIGZvciBBUzsgYSAzMi1iaXQgYXNzZW1ibGVyIG9mIEdOVS4KKyAqIFVuZGVyc3RhbmRzIGNvbW1hbmQgYXJndW1lbnRzLgorICogSGFzIGEgZmV3IHJvdXRpbmVzIHRoYXQgZG9uJ3QgZml0IGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSB0aGV5CisgKiBhcmUgc2hhcmVkLgorICoKKyAqCisgKgkJCWJ1Z3MKKyAqCisgKiA6IGluaXRpYWxpc2VycworICoJU2luY2Ugbm8tb25lIGVsc2Ugc2F5cyB0aGV5IHdpbGwgc3VwcG9ydCB0aGVtIGluIGZ1dHVyZTogSQorICogZG9uJ3Qgc3VwcG9ydCB0aGVtIG5vdy4KKyAqCisgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNkZWZpbmUgQ09NTU9OCisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgorI2luY2x1ZGUgInNiLmgiCisjaW5jbHVkZSAibWFjcm8uaCIKKworI2lmbmRlZiBIQVZFX0lUQkxfQ1BVCisjZGVmaW5lIGl0YmxfcGFyc2UoaXRibF9maWxlKSAxCisjZGVmaW5lIGl0YmxfaW5pdCgpCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0JSSworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSworZXh0ZXJuIFBUUiBzYnJrICgpOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MgUEFSQU1TICgoaW50ICosIGNoYXIgKioqKSk7CitzdGF0aWMgdm9pZCBkdW1wX3N0YXRpc3RpY3MgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIFBBUkFNUyAoKGludCBhcmdjLCBjaGFyICoqYXJndikpOworc3RhdGljIGludCBtYWNyb19leHByIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOworCitpbnQgbGlzdGluZzsJCQkvKiB0cnVlIGlmIGEgbGlzdGluZyBpcyB3YW50ZWQgKi8KKworc3RhdGljIGNoYXIgKmxpc3RpbmdfZmlsZW5hbWUgPSBOVUxMOwkvKiBOYW1lIG9mIGxpc3RpbmcgZmlsZS4gICovCisKKy8qIFR5cGUgb2YgZGVidWdnaW5nIHRvIGdlbmVyYXRlLiAgKi8KKworZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZSA9IERFQlVHX05PTkU7CisKKy8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCisKK2ludCBtYXhfbWFjcm9fbmVzdCA9IDEwMDsKKworY2hhciAqbXluYW1lOwkJCS8qIGFyZ3ZbMF0gKi8KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitzZWdUIHJlZ19zZWN0aW9uLCBleHByX3NlY3Rpb247CitzZWdUIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbjsKKyNlbmRpZgorCisvKiBUaGUgZGVmYXVsdCBvYnN0YWNrIGNodW5rIHNpemUuICBJZiB3ZSBzZXQgdGhpcyB0byB6ZXJvLCB0aGUKKyAgIG9ic3RhY2sgY29kZSB3aWxsIHVzZSB3aGF0ZXZlciB3aWxsIGZpdCBpbiBhIDQwOTYgYnl0ZSBibG9jay4gICovCitpbnQgY2h1bmtzaXplID0gMDsKKworLyogVG8gbW9uaXRvciBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmVjdGl2ZWx5LCBtYWtlIHRoaXMgbm9uLXplcm8uCisgICBUaGVuIHRoZSBjaHVuayBzaXplcyBmb3IgZ2FzIGFuZCBiZmQgd2lsbCBiZSByZWR1Y2VkLiAgKi8KK2ludCBkZWJ1Z19tZW1vcnkgPSAwOworCisvKiBXZSBidWlsZCBhIGxpc3Qgb2YgZGVmc3ltcyBhcyB3ZSByZWFkIHRoZSBvcHRpb25zLCBhbmQgdGhlbiBkZWZpbmUKKyAgIHRoZW0gYWZ0ZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBldmVyeXRoaW5nLiAgKi8KKworc3RydWN0IGRlZnN5bV9saXN0Cit7CisgIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKKyAgY2hhciAqbmFtZTsKKyAgdmFsdWVUIHZhbHVlOworfTsKKworc3RhdGljIHN0cnVjdCBkZWZzeW1fbGlzdCAqZGVmc3ltczsKKworLyogS2VlcCBhIHJlY29yZCBvZiB0aGUgaXRibCBmaWxlcyB3ZSByZWFkIGluLiAqLworCitzdHJ1Y3QgaXRibF9maWxlX2xpc3QKK3sKKyAgc3RydWN0IGl0YmxfZmlsZV9saXN0ICpuZXh0OworICBjaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqaXRibF9maWxlczsKKwwKK3ZvaWQKK3ByaW50X3ZlcnNpb25faWQgKCkKK3sKKyAgc3RhdGljIGludCBwcmludGVkOworICBpZiAocHJpbnRlZCkKKyAgICByZXR1cm47CisgIHByaW50ZWQgPSAxOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIHVzaW5nIEJGRCB2ZXJzaW9uICVzIiksCisJICAgVkVSU0lPTiwgVEFSR0VUX0FMSUFTLCBCRkRfVkVSU0lPTik7CisjZWxzZQorICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIiksIFZFUlNJT04sIFRBUkdFVF9BTElBUyk7CisjZW5kaWYKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfdXNhZ2UgKHN0cmVhbSkKKyAgICAgRklMRSAqc3RyZWFtOworeworICBmcHJpbnRmIChzdHJlYW0sIF8oIlVzYWdlOiAlcyBbb3B0aW9uLi4uXSBbYXNtZmlsZS4uLl1cbiIpLCBteW5hbWUpOworCisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorT3B0aW9uczpcblwKKyAgLWFbc3ViLW9wdGlvbi4uLl0JdHVybiBvbiBsaXN0aW5nc1xuXAorICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG5cCisgICAgYyAgIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzXG5cCisgICAgZCAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcblwKKyAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuXAorICAgIGwgICBpbmNsdWRlIGFzc2VtYmx5XG5cCisgICAgbSAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuXAorICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcblwKKyAgICBzICAgaW5jbHVkZSBzeW1ib2xzXG5cCisgICAgPWZpbGUgc2V0IGxpc3RpbmcgZmlsZSBuYW1lIChtdXN0IGJlIGxhc3Qgc3ViLW9wdGlvbilcbiIpKTsKKyAgCisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorICAtRAkJICAgICAgICAgIHByb2R1Y2UgYXNzZW1ibGVyIGRlYnVnZ2luZyBtZXNzYWdlc1xuXAorICAtLWRlZnN5bSBTWU09VkFMICAgICAgICBkZWZpbmUgc3ltYm9sIFNZTSB0byBnaXZlbiB2YWx1ZVxuXAorICAtZgkJICAgICAgICAgIHNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudCBwcmVwcm9jZXNzaW5nXG5cCisgIC0tZ3N0YWJzCSAgICAgICAgICBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cblwKKyAgLS1oZWxwCQkgIHNob3cgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG5cCisgIC1JIERJUgkJICBhZGQgRElSIHRvIHNlYXJjaCBsaXN0IGZvciAuaW5jbHVkZSBkaXJlY3RpdmVzXG5cCisgIC1KCQkgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcblwKKyAgLUsJCSAgICAgICAgICB3YXJuIHdoZW4gZGlmZmVyZW5jZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG5cCisgIC1MLC0ta2VlcC1sb2NhbHMgICAgICAgIGtlZXAgbG9jYWwgc3ltYm9scyAoZS5nLiBzdGFydGluZyB3aXRoIGBMJylcbiIpKTsKKyAgCisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorICAtTSwtLW1yaQkgICAgICAgICAgYXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuXAorICAtLU1EIEZJTEUJICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuXAorICAtbm9jcHAJCSAgaWdub3JlZFxuXAorICAtbyBPQkpGSUxFCSAgICAgICAgICBuYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgT0JKRklMRSAoZGVmYXVsdCBhLm91dClcblwKKyAgLVIJCSAgICAgICAgICBmb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvblxuXAorICAtLXN0YXRpc3RpY3MJICAgICAgICAgIHByaW50IHZhcmlvdXMgbWVhc3VyZWQgc3RhdGlzdGljcyBmcm9tIGV4ZWN1dGlvblxuXAorICAtLXN0cmlwLWxvY2FsLWFic29sdXRlICBzdHJpcCBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzXG5cCisgIC0tdHJhZGl0aW9uYWwtZm9ybWF0CSAgVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIgd2hlbiBwb3NzaWJsZVxuXAorICAtLXZlcnNpb24JCSAgcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG5cCisgIC1XCQkJICBzdXBwcmVzcyB3YXJuaW5nc1xuXAorICAtLWl0YmwgSU5TVFRCTAkgIGV4dGVuZCBpbnN0cnVjdGlvbiBzZXQgdG8gaW5jbHVkZSBpbnN0cnVjdGlvbnNcblwKKwkJCSAgbWF0Y2hpbmcgdGhlIHNwZWNpZmljYXRpb25zIGRlZmluZWQgaW4gZmlsZSBJTlNUVEJMXG5cCisgIC13CQkJICBpZ25vcmVkXG5cCisgIC1YCQkJICBpZ25vcmVkXG5cCisgIC1aCQkJICBnZW5lcmF0ZSBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9yc1xuIikpOworICAKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCisgIC0tbGlzdGluZy1saHMtd2lkdGgJICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2ZcblwKKwkJCSAgdGhlIGxpc3RpbmdcblwKKyAgLS1saXN0aW5nLWxocy13aWR0aDIJICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBjb250aW51YXRpb24gbGluZXNcblwKKwkJCSAgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbjsgaWdub3JlZCBpZiBzbWFsbGVyIHRoYW5cblwKKwkJCSAgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdCBsaW5lXG5cCisgIC0tbGlzdGluZy1yaHMtd2lkdGgJICBzZXQgdGhlIG1heCB3aWR0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lcyBmcm9tXG5cCisJCQkgIHRoZSBzb3VyY2UgZmlsZVxuXAorICAtLWxpc3RpbmctY29udC1saW5lcwkgIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29udGludWF0aW9uIGxpbmVzIHVzZWRcblwKKwkJCSAgZm9yIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW4gb2YgdGhlIGxpc3RpbmdcbiIpKTsKKworICBtZF9zaG93X3VzYWdlIChzdHJlYW0pOworCisgIGZwcmludGYgKHN0cmVhbSwgXygiXG5SZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKK30KKworI2lmZGVmIFVTRV9FTVVMQVRJT05TCisjZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJBU19FTVVMQVRJT04iCisKK2V4dGVybiBzdHJ1Y3QgZW11bGF0aW9uIG1pcHNiZWxmLCBtaXBzbGVsZiwgbWlwc2VsZjsKK2V4dGVybiBzdHJ1Y3QgZW11bGF0aW9uIG1pcHNiZWNvZmYsIG1pcHNsZWNvZmYsIG1pcHNlY29mZjsKK2V4dGVybiBzdHJ1Y3QgZW11bGF0aW9uIGkzODZjb2ZmLCBpMzg2ZWxmOworCitzdGF0aWMgc3RydWN0IGVtdWxhdGlvbiAqY29uc3QgZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05TIH07CitzdGF0aWMgY29uc3QgaW50IG5fZW11bGF0aW9ucyA9IHNpemVvZiAoZW11bGF0aW9ucykgLyBzaXplb2YgKGVtdWxhdGlvbnNbMF0pOworCitzdGF0aWMgdm9pZCBzZWxlY3RfZW11bGF0aW9uX21vZGUgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CisKK3N0YXRpYyB2b2lkCitzZWxlY3RfZW11bGF0aW9uX21vZGUgKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGk7CisgIGNoYXIgKnAsICplbSA9IDA7CisKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICBpZiAoIXN0cm5jbXAgKCItLWVtIiwgYXJndltpXSwgNCkpCisgICAgICBicmVhazsKKworICBpZiAoaSA9PSBhcmdjKQorICAgIGdvdG8gZG9fZGVmYXVsdDsKKworICBwID0gc3RyY2hyIChhcmd2W2ldLCAnPScpOworICBpZiAocCkKKyAgICBwKys7CisgIGVsc2UKKyAgICBwID0gYXJndltpKzFdOworCisgIGlmICghcCB8fCAhKnApCisgICAgYXNfZmF0YWwgKF8oIm1pc3NpbmcgZW11bGF0aW9uIG1vZGUgbmFtZSIpKTsKKyAgZW0gPSBwOworCisgZG9fZGVmYXVsdDoKKyAgaWYgKGVtID09IDApCisgICAgZW0gPSBnZXRlbnYgKEVNVUxBVElPTl9FTlZJUk9OKTsKKyAgaWYgKGVtID09IDApCisgICAgZW0gPSBERUZBVUxUX0VNVUxBVElPTjsKKworICBpZiAoZW0pCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IG5fZW11bGF0aW9uczsgaSsrKQorCWlmICghc3RyY21wIChlbXVsYXRpb25zW2ldLT5uYW1lLCBlbSkpCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG5fZW11bGF0aW9ucykKKwlhc19mYXRhbCAoXygidW5yZWNvZ25pemVkIGVtdWxhdGlvbiBuYW1lIGAlcyciKSwgZW0pOworICAgICAgdGhpc19lbXVsYXRpb24gPSBlbXVsYXRpb25zW2ldOworICAgIH0KKyAgZWxzZQorICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1swXTsKKworICB0aGlzX2VtdWxhdGlvbi0+aW5pdCAoKTsKK30KKworY29uc3QgY2hhciAqCitkZWZhdWx0X2VtdWxfYmZkX25hbWUgKCkKK3sKKyAgYWJvcnQgKCk7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkCitjb21tb25fZW11bF9pbml0ICgpCit7CisgIHRoaXNfZm9ybWF0ID0gdGhpc19lbXVsYXRpb24tPmZvcm1hdDsKKworICBpZiAodGhpc19lbXVsYXRpb24tPmxlYWRpbmdfdW5kZXJzY29yZSA9PSAyKQorICAgIHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPSB0aGlzX2Zvcm1hdC0+ZGZsX2xlYWRpbmdfdW5kZXJzY29yZTsKKworICBpZiAodGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuICE9IDIpCisgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSB0aGlzX2VtdWxhdGlvbi0+ZGVmYXVsdF9lbmRpYW47CisKKyAgaWYgKHRoaXNfZW11bGF0aW9uLT5mYWtlX2xhYmVsX25hbWUgPT0gMCkKKyAgICB7CisgICAgICBpZiAodGhpc19lbXVsYXRpb24tPmxlYWRpbmdfdW5kZXJzY29yZSkKKwl0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID0gIkwwXDAwMSI7CisgICAgICBlbHNlCisJLyogV2hhdCBvdGhlciBwYXJhbWV0ZXJzIHNob3VsZCB3ZSB0ZXN0PyAgKi8KKwl0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID0gIi5MMFwwMDEiOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogU2luY2UgaXQgaXMgZWFzeSB0byBkbyBoZXJlIHdlIGludGVycHJldCB0aGUgc3BlY2lhbCBhcmcgIi0iCisgKiB0byBtZWFuICJ1c2Ugc3RkaW4iIGFuZCB3ZSBzZXQgdGhhdCBhcmd2W10gcG9pbnRpbmcgdG8gIiIuCisgKiBBZnRlciB3ZSBoYXZlIG11bmdlZCBhcmd2W10sIHRoZSBvbmx5IHRoaW5ncyBsZWZ0IGFyZSBzb3VyY2UgZmlsZQorICogbmFtZShzKSBhbmQgIiIocykgZGVub3Rpbmcgc3RkaW4uIFRoZXNlIGZpbGUgbmFtZXMgYXJlIHVzZWQKKyAqIChwZXJoYXBzIG1vcmUgdGhhbiBvbmNlKSBsYXRlci4KKyAqCisgKiBjaGVjayBmb3IgbmV3IG1hY2hpbmUtZGVwIGNtZGxpbmUgb3B0aW9ucyBpbgorICogbWRfcGFyc2Vfb3B0aW9uIGRlZmluaXRpb25zIGluIGNvbmZpZy90Yy0qLmMKKyAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfYXJncyAocGFyZ2MsIHBhcmd2KQorICAgICBpbnQgKnBhcmdjOworICAgICBjaGFyICoqKnBhcmd2OworeworICBpbnQgb2xkX2FyZ2MsIG5ld19hcmdjOworICBjaGFyICoqb2xkX2FyZ3YsICoqbmV3X2FyZ3Y7CisKKyAgLyogU3RhcnRpbmcgdGhlIHNob3J0IG9wdGlvbiBzdHJpbmcgd2l0aCAnLScgaXMgZm9yIHByb2dyYW1zIHRoYXQKKyAgICAgZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKKyAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50CisgICAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuICAqLworCisgIGNoYXIgKnNob3J0b3B0czsKKyAgZXh0ZXJuIENPTlNUIGNoYXIgKm1kX3Nob3J0b3B0czsKKyAgc3RhdGljIGNvbnN0IGNoYXIgc3RkX3Nob3J0b3B0c1tdID0KKyAgICB7CisgICAgICAnLScsICdKJywKKyNpZm5kZWYgV09SS0lOR19ET1RfV09SRAorICAgICAgLyogLUsgaXMgbm90IG1lYW5pbmdmdWwgaWYgLndvcmQgaXMgbm90IGJlaW5nIGhhY2tlZC4gICovCisgICAgICAnSycsCisjZW5kaWYKKyAgICAgICdMJywgJ00nLCAnUicsICdXJywgJ1onLCAnZicsICdhJywgJzonLCAnOicsICdEJywgJ0knLCAnOicsICdvJywgJzonLAorI2lmbmRlZiBWTVMKKyAgICAgIC8qIC12IHRha2VzIGFuIGFyZ3VtZW50IG9uIFZNUywgc28gd2UgZG9uJ3QgbWFrZSBpdCBhIGdlbmVyaWMKKyAgICAgICAgIG9wdGlvbi4gICovCisgICAgICAndicsCisjZW5kaWYKKyAgICAgICd3JywgJ1gnLAorICAgICAgLyogTmV3IG9wdGlvbiBmb3IgZXh0ZW5kaW5nIGluc3RydWN0aW9uIHNldCAoc2VlIGFsc28gLS1pdGJsIGJlbG93KSAqLworICAgICAgJ3QnLCAnOicsCisgICAgICAnXDAnCisgICAgfTsKKyAgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHM7CisgIGV4dGVybiBzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW107CisgIGV4dGVybiBzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZTsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gc3RkX2xvbmdvcHRzW10gPSB7CisjZGVmaW5lIE9QVElPTl9IRUxQIChPUFRJT05fU1REX0JBU0UpCisgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKKyAgICB7ImtlZXAtbG9jYWxzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdMJ30sCisgICAgeyJtcmkiLCBub19hcmd1bWVudCwgTlVMTCwgJ00nfSwKKyNkZWZpbmUgT1BUSU9OX05PQ1BQIChPUFRJT05fU1REX0JBU0UgKyAxKQorICAgIHsibm9jcHAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQ1BQfSwKKyNkZWZpbmUgT1BUSU9OX1NUQVRJU1RJQ1MgKE9QVElPTl9TVERfQkFTRSArIDIpCisgICAgeyJzdGF0aXN0aWNzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFUSVNUSUNTfSwKKyNkZWZpbmUgT1BUSU9OX1ZFUlNJT04gKE9QVElPTl9TVERfQkFTRSArIDMpCisgICAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJTSU9OfSwKKyNkZWZpbmUgT1BUSU9OX0RVTVBDT05GSUcgKE9QVElPTl9TVERfQkFTRSArIDQpCisgICAgeyJkdW1wLWNvbmZpZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFVNUENPTkZJR30sCisjZGVmaW5lIE9QVElPTl9WRVJCT1NFIChPUFRJT05fU1REX0JBU0UgKyA1KQorICAgIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSQk9TRX0sCisjZGVmaW5lIE9QVElPTl9FTVVMQVRJT04gKE9QVElPTl9TVERfQkFTRSArIDYpCisgICAgeyJlbXVsYXRpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VNVUxBVElPTn0sCisjZGVmaW5lIE9QVElPTl9ERUZTWU0gKE9QVElPTl9TVERfQkFTRSArIDcpCisgICAgeyJkZWZzeW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRlNZTX0sCisjZGVmaW5lIE9QVElPTl9JTlNUVEJMIChPUFRJT05fU1REX0JBU0UgKyA4KQorICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC10IGFib3ZlKS4KKyAgICAgICBUaGUgIi10IGZpbGUiIG9yICItLWl0YmwgZmlsZSIgb3B0aW9uIGV4dGVuZHMgdGhlIGJhc2ljIHNldCBvZgorICAgICAgIHZhbGlkIGluc3RydWN0aW9ucyBieSByZWFkaW5nICJmaWxlIiwgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhCisgICAgICAgbGlzdCBvZiBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgVGhlIGFkZGl0aW9uYWwgb3Bjb2RlcyBhbmQgdGhlaXIKKyAgICAgICBmb3JtYXRzIGFyZSBhZGRlZCB0byB0aGUgYnVpbHQtaW4gc2V0IG9mIGluc3RydWN0aW9ucywgYW5kCisgICAgICAgbW5lbW9uaWNzIGZvciBuZXcgcmVnaXN0ZXJzIG1heSBhbHNvIGJlIGRlZmluZWQuICAqLworICAgIHsiaXRibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU5TVFRCTH0sCisjZGVmaW5lIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSCAoT1BUSU9OX1NURF9CQVNFICsgOSkKKyAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSH0sCisjZGVmaW5lIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDIgKE9QVElPTl9TVERfQkFTRSArIDEwKQorICAgIHsibGlzdGluZy1saHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIMn0sCisjZGVmaW5lIE9QVElPTl9MSVNUSU5HX1JIU19XSURUSCAoT1BUSU9OX1NURF9CQVNFICsgMTEpCisgICAgeyJsaXN0aW5nLXJocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19SSFNfV0lEVEh9LAorI2RlZmluZSBPUFRJT05fTElTVElOR19DT05UX0xJTkVTIChPUFRJT05fU1REX0JBU0UgKyAxMikKKyAgICB7Imxpc3RpbmctY29udC1saW5lcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19DT05UX0xJTkVTfSwKKyNkZWZpbmUgT1BUSU9OX0RFUEZJTEUgKE9QVElPTl9TVERfQkFTRSArIDEzKQorICAgIHsiTUQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFUEZJTEV9LAorI2RlZmluZSBPUFRJT05fR1NUQUJTIChPUFRJT05fU1REX0JBU0UgKyAxNCkKKyAgICB7ImdzdGFicyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR1NUQUJTfSwKKyNkZWZpbmUgT1BUSU9OX1NUUklQX0xPQ0FMX0FCU09MVVRFIChPUFRJT05fU1REX0JBU0UgKyAxNSkKKyAgICB7InN0cmlwLWxvY2FsLWFic29sdXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURX0sCisjZGVmaW5lIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQgKE9QVElPTl9TVERfQkFTRSArIDE2KQorICAgIHsidHJhZGl0aW9uYWwtZm9ybWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVR9CisgIH07CisKKyAgLyogQ29uc3RydWN0IHRoZSBvcHRpb24gbGlzdHMgZnJvbSB0aGUgc3RhbmRhcmQgbGlzdCBhbmQgdGhlCisgICAgIHRhcmdldCBkZXBlbmRlbnQgbGlzdC4gICovCisgIHNob3J0b3B0cyA9IGNvbmNhdCAoc3RkX3Nob3J0b3B0cywgbWRfc2hvcnRvcHRzLCAoY2hhciAqKSBOVUxMKTsKKyAgbG9uZ29wdHMgPSAoc3RydWN0IG9wdGlvbiAqKSB4bWFsbG9jIChzaXplb2YgKHN0ZF9sb25nb3B0cykgKyBtZF9sb25nb3B0c19zaXplKTsKKyAgbWVtY3B5IChsb25nb3B0cywgc3RkX2xvbmdvcHRzLCBzaXplb2YgKHN0ZF9sb25nb3B0cykpOworICBtZW1jcHkgKChjaGFyICopIGxvbmdvcHRzICsgc2l6ZW9mIChzdGRfbG9uZ29wdHMpLAorCSAgbWRfbG9uZ29wdHMsIG1kX2xvbmdvcHRzX3NpemUpOworCisgIC8qIE1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBvbGQgYXJndi4gICovCisgIG9sZF9hcmdjID0gKnBhcmdjOworICBvbGRfYXJndiA9ICpwYXJndjsKKworICAvKiBJbml0aWFsaXplIGEgbmV3IGFyZ3YgdGhhdCBjb250YWlucyBubyBvcHRpb25zLiAgKi8KKyAgbmV3X2FyZ3YgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogKG9sZF9hcmdjICsgMSkpOworICBuZXdfYXJndlswXSA9IG9sZF9hcmd2WzBdOworICBuZXdfYXJnYyA9IDE7CisgIG5ld19hcmd2W25ld19hcmdjXSA9IE5VTEw7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogZ2V0b3B0X2xvbmdfb25seSBpcyBsaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4KKwkgaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4gICovCisgICAgICBpbnQgbG9uZ2luZDsKKyAgICAgIGludCBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAob2xkX2FyZ2MsIG9sZF9hcmd2LCBzaG9ydG9wdHMsIGxvbmdvcHRzLAorCQkJCSAgICZsb25naW5kKTsKKworICAgICAgaWYgKG9wdGMgPT0gLTEpCisJYnJlYWs7CisKKyAgICAgIHN3aXRjaCAob3B0YykKKwl7CisJZGVmYXVsdDoKKwkgIC8qIG1kX3BhcnNlX29wdGlvbiBzaG91bGQgcmV0dXJuIDEgaWYgaXQgcmVjb2duaXplcyBvcHRjLAorCSAgICAgMCBpZiBub3QuICAqLworCSAgaWYgKG1kX3BhcnNlX29wdGlvbiAob3B0Yywgb3B0YXJnKSAhPSAwKQorCSAgICBicmVhazsKKwkgIC8qIGAtdicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYWwgc2hvcnRfb3B0cyBsaXN0LCBzbyBjaGVjayBmb3IKKwkgICAgIGl0IGV4cGxpY2l0eSBoZXJlIGJlZm9yZSBkZWNpZGluZyB3ZSd2ZSBnb3R0ZW4gYSBiYWQgYXJndW1lbnQuICAqLworCSAgaWYgKG9wdGMgPT0gJ3YnKQorCSAgICB7CisjaWZkZWYgVk1TCisJICAgICAgLyogVGVsbGluZyBnZXRvcHQgdG8gdHJlYXQgLXYncyB2YWx1ZSBhcyBvcHRpb25hbCBjYW4gcmVzdWx0CisJCSBpbiBpdCBwaWNraW5nIHVwIGEgZm9sbG93aW5nIGZpbGVuYW1lIGFyZ3VtZW50IGhlcmUuICBUaGUKKwkJIFZNUyBjb2RlIGluIG1kX3BhcnNlX29wdGlvbiBjYW4gcmV0dXJuIDAgaW4gdGhhdCBjYXNlLAorCQkgYnV0IGl0IGhhcyBubyB3YXkgb2YgcHVzaGluZyB0aGUgZmlsZW5hbWUgYXJndW1lbnQgYmFjay4gICovCisJICAgICAgaWYgKG9wdGFyZyAmJiAqb3B0YXJnKQorCQluZXdfYXJndltuZXdfYXJnYysrXSA9IG9wdGFyZywgIG5ld19hcmd2W25ld19hcmdjXSA9IE5VTEw7CisJICAgICAgZWxzZQorI2Vsc2UKKwkgICAgICBjYXNlICd2JzoKKyNlbmRpZgorCSAgICAgIGNhc2UgT1BUSU9OX1ZFUkJPU0U6CisJCXByaW50X3ZlcnNpb25faWQgKCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIC8qRkFMTFRIUlUqLworCisJY2FzZSAnPyc6CisJICBleGl0IChFWElUX0ZBSUxVUkUpOworCisJY2FzZSAxOgkJCS8qIEZpbGUgbmFtZS4gICovCisJICBpZiAoIXN0cmNtcCAob3B0YXJnLCAiLSIpKQorCSAgICBvcHRhcmcgPSAiIjsKKwkgIG5ld19hcmd2W25ld19hcmdjKytdID0gb3B0YXJnOworCSAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRJT05fSEVMUDoKKwkgIHNob3dfdXNhZ2UgKHN0ZG91dCk7CisJICBleGl0IChFWElUX1NVQ0NFU1MpOworCisJY2FzZSBPUFRJT05fTk9DUFA6CisJICBicmVhazsKKworCWNhc2UgT1BUSU9OX1NUQVRJU1RJQ1M6CisJICBmbGFnX3ByaW50X3N0YXRpc3RpY3MgPSAxOworCSAgYnJlYWs7CisKKwljYXNlIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURToKKwkgIGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUgPSAxOworCSAgYnJlYWs7CisKKwljYXNlIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQ6CisJICBmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCA9IDE7CisJICBicmVhazsKKworCWNhc2UgT1BUSU9OX1ZFUlNJT046CisJICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLworCSAgcHJpbnRmIChfKCJHTlUgYXNzZW1ibGVyICVzXG4iKSwgVkVSU0lPTik7CisJICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOworCSAgcHJpbnRmIChfKCJcCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7CisJICBwcmludGYgKF8oIlRoaXMgYXNzZW1ibGVyIHdhcyBjb25maWd1cmVkIGZvciBhIHRhcmdldCBvZiBgJXMnLlxuIiksCisJCSAgVEFSR0VUX0FMSUFTKTsKKwkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7CisKKwljYXNlIE9QVElPTl9FTVVMQVRJT046CisjaWZkZWYgVVNFX0VNVUxBVElPTlMKKwkgIGlmIChzdHJjbXAgKG9wdGFyZywgdGhpc19lbXVsYXRpb24tPm5hbWUpKQorCSAgICBhc19mYXRhbCAoXygibXVsdGlwbGUgZW11bGF0aW9uIG5hbWVzIHNwZWNpZmllZCIpKTsKKyNlbHNlCisJICBhc19mYXRhbCAoXygiZW11bGF0aW9ucyBub3QgaGFuZGxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKSk7CisjZW5kaWYKKwkgIGJyZWFrOworCisJY2FzZSBPUFRJT05fRFVNUENPTkZJRzoKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiYWxpYXMgPSAlc1xuIiksIFRBUkdFVF9BTElBUyk7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oImNhbm9uaWNhbCA9ICVzXG4iKSwgVEFSR0VUX0NBTk9OSUNBTCk7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oImNwdS10eXBlID0gJXNcbiIpLCBUQVJHRVRfQ1BVKTsKKyNpZmRlZiBUQVJHRVRfT0JKX0ZPUk1BVAorCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJmb3JtYXQgPSAlc1xuIiksIFRBUkdFVF9PQkpfRk9STUFUKTsKKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9GT1JNQVQKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiYmZkLXRhcmdldCA9ICVzXG4iKSwgVEFSR0VUX0ZPUk1BVCk7CisjZW5kaWYKKwkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7CisKKwljYXNlIE9QVElPTl9ERUZTWU06CisJICB7CisJICAgIGNoYXIgKnM7CisJICAgIGxvbmcgaTsKKwkgICAgc3RydWN0IGRlZnN5bV9saXN0ICpuOworCisJICAgIGZvciAocyA9IG9wdGFyZzsgKnMgIT0gJ1wwJyAmJiAqcyAhPSAnPSc7IHMrKykKKwkgICAgICA7CisJICAgIGlmICgqcyA9PSAnXDAnKQorCSAgICAgIGFzX2ZhdGFsIChfKCJiYWQgZGVmc3ltOyBmb3JtYXQgaXMgLS1kZWZzeW0gbmFtZT12YWx1ZSIpKTsKKwkgICAgKnMrKyA9ICdcMCc7CisJICAgIGkgPSBzdHJ0b2wgKHMsIChjaGFyICoqKSBOVUxMLCAwKTsKKwkgICAgbiA9IChzdHJ1Y3QgZGVmc3ltX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKwkgICAgbi0+bmV4dCA9IGRlZnN5bXM7CisJICAgIG4tPm5hbWUgPSBvcHRhcmc7CisJICAgIG4tPnZhbHVlID0gaTsKKwkgICAgZGVmc3ltcyA9IG47CisJICB9CisJICBicmVhazsKKworCWNhc2UgT1BUSU9OX0lOU1RUQkw6CisJY2FzZSAndCc6CisJICB7CisJICAgIC8qIG9wdGFyZyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbnN0cnVjdGlvbiAKKwkgICAgICAgZm9ybWF0cywgb3Bjb2RlcywgcmVnaXN0ZXIgbmFtZXMsIGV0Yy4gKi8KKwkgICAgc3RydWN0IGl0YmxfZmlsZV9saXN0ICpuOworCisJICAgIGlmIChvcHRhcmcgPT0gTlVMTCkKKwkgICAgICB7CisJCWFzX3dhcm4gKCBfKCJObyBmaWxlIG5hbWUgZm9sbG93aW5nIC10IG9wdGlvblxuIikgKTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICAKKwkgICAgbiA9IChzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKwkgICAgbi0+bmV4dCA9IGl0YmxfZmlsZXM7CisJICAgIG4tPm5hbWUgPSBvcHRhcmc7CisJICAgIGl0YmxfZmlsZXMgPSBuOworCisJICAgIC8qIFBhcnNlIHRoZSBmaWxlIGFuZCBhZGQgdGhlIG5ldyBpbnN0cnVjdGlvbnMgdG8gb3VyIGludGVybmFsCisJICAgICAgIHRhYmxlLiAgSWYgbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gdGFibGVzIGFyZSBzcGVjaWZpZWQsIHRoZSAKKwkgICAgICAgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHRhYmxlIGdldHMgYXBwZW5kZWQgb250byB0aGUgZXhpc3RpbmcgCisJICAgICAgIGludGVybmFsIHRhYmxlLiAqLworCSAgICBpdGJsX2ZpbGVzLT5uYW1lID0geHN0cmR1cCAob3B0YXJnKTsKKwkgICAgaWYgKGl0YmxfcGFyc2UgKGl0YmxfZmlsZXMtPm5hbWUpICE9IDApCisJICAgICAgeworCQlmcHJpbnRmIChzdGRlcnIsIF8oIkZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIHRhYmxlICVzXG4iKSwgCisJCQkgaXRibF9maWxlcy0+bmFtZSk7CisJCWV4aXQgKEVYSVRfU1VDQ0VTUyk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIE9QVElPTl9ERVBGSUxFOgorCSAgc3RhcnRfZGVwZW5kZW5jaWVzIChvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlIE9QVElPTl9HU1RBQlM6CisJICBkZWJ1Z190eXBlID0gREVCVUdfU1RBQlM7CisJICBicmVhazsKKyAKKwljYXNlICdKJzoKKwkgIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKKwkgIGJyZWFrOworCisjaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKKwljYXNlICdLJzoKKwkgIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQgPSAxOworCSAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgJ0wnOgorCSAgZmxhZ19rZWVwX2xvY2FscyA9IDE7CisJICBicmVhazsKKworCWNhc2UgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIOgorCSAgbGlzdGluZ19saHNfd2lkdGggPSBhdG9pKG9wdGFyZyk7CisJICBpZiAobGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIDwgbGlzdGluZ19saHNfd2lkdGgpCisJICAgIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IGxpc3RpbmdfbGhzX3dpZHRoOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyOgorCSAgeworCSAgICBpbnQgdG1wID0gYXRvaShvcHRhcmcpOworCSAgICBpZiAodG1wID4gbGlzdGluZ19saHNfd2lkdGgpCisJICAgICAgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kID0gdG1wOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEg6CisJICBsaXN0aW5nX3Joc193aWR0aCA9IGF0b2kob3B0YXJnKTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUzoKKwkgIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMgPSBhdG9pKG9wdGFyZyk7CisJICBicmVhazsKKworCWNhc2UgJ00nOgorCSAgZmxhZ19tcmkgPSAxOworI2lmZGVmIFRDX002OEsKKwkgIGZsYWdfbTY4a19tcmkgPSAxOworI2VuZGlmCisJICBicmVhazsKKworCWNhc2UgJ1InOgorCSAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAxOworCSAgYnJlYWs7CisKKwljYXNlICdXJzoKKwkgIGZsYWdfbm9fd2FybmluZ3MgPSAxOworCSAgYnJlYWs7CisKKwljYXNlICdaJzoKKwkgIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCA9IDE7CisJICBicmVhazsKKworCWNhc2UgJ2EnOgorCSAgaWYgKG9wdGFyZykKKwkgICAgeworCSAgICAgIHdoaWxlICgqb3B0YXJnKQorCQl7CisJCSAgc3dpdGNoICgqb3B0YXJnKQorCQkgICAgeworCQkgICAgY2FzZSAnYyc6CisJCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0NPTkQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnZCc6CisJCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0RFQlVHOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ2gnOgorCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfSExMOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ2wnOgorCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTElTVElORzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdtJzoKKwkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX01BQ0VYUDsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICduJzoKKwkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PRk9STTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdzJzoKKwkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX1NZTUJPTFM7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnPSc6CisJCSAgICAgIGxpc3RpbmdfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcgKyAxKTsKKwkJICAgICAgb3B0YXJnICs9IHN0cmxlbiAobGlzdGluZ19maWxlbmFtZSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgYXNfZmF0YWwgKF8oImludmFsaWQgbGlzdGluZyBvcHRpb24gYCVjJyIpLCAqb3B0YXJnKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgb3B0YXJnKys7CisJCX0KKwkgICAgfQorCSAgaWYgKCFsaXN0aW5nKQorCSAgICBsaXN0aW5nID0gTElTVElOR19ERUZBVUxUOworCSAgYnJlYWs7CisKKwljYXNlICdEJzoKKwkgIC8qIERFQlVHIGlzIGltcGxlbWVudGVkOiBpdCBkZWJ1Z3MgZGlmZmVyZW50ICovCisJICAvKiB0aGluZ3MgZnJvbSBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiAqLworCSAgZmxhZ19kZWJ1ZyA9IDE7CisJICBicmVhazsKKworCWNhc2UgJ2YnOgorCSAgZmxhZ19ub19jb21tZW50cyA9IDE7CisJICBicmVhazsKKworCWNhc2UgJ0knOgorCSAgewkJCS8qIEluY2x1ZGUgZmlsZSBkaXJlY3RvcnkgKi8KKwkgICAgY2hhciAqdGVtcCA9IHhzdHJkdXAgKG9wdGFyZyk7CisJICAgIGFkZF9pbmNsdWRlX2RpciAodGVtcCk7CisJICAgIGJyZWFrOworCSAgfQorCisJY2FzZSAnbyc6CisJICBvdXRfZmlsZV9uYW1lID0geHN0cmR1cCAob3B0YXJnKTsKKwkgIGJyZWFrOworCisJY2FzZSAndyc6CisJICBicmVhazsKKworCWNhc2UgJ1gnOgorCSAgLyogLVggbWVhbnMgdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzICovCisJICBicmVhazsKKwl9CisgICAgfQorCisgIGZyZWUgKHNob3J0b3B0cyk7CisgIGZyZWUgKGxvbmdvcHRzKTsKKworICAqcGFyZ2MgPSBuZXdfYXJnYzsKKyAgKnBhcmd2ID0gbmV3X2FyZ3Y7Cit9CisKK3N0YXRpYyBsb25nIHN0YXJ0X3RpbWU7CisKK2ludCAKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IG1hY3JvX2FsdGVybmF0ZTsKKyAgaW50IG1hY3JvX3N0cmlwX2F0OworICBpbnQga2VlcF9pdDsKKworICBzdGFydF90aW1lID0gZ2V0X3J1bl90aW1lICgpOworCisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgaWYgKGRlYnVnX21lbW9yeSkKKyAgICB7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgZXh0ZXJuIGxvbmcgX2JmZF9jaHVua3NpemU7CisgICAgICBfYmZkX2NodW5rc2l6ZSA9IDY0OworI2VuZGlmCisgICAgICBjaHVua3NpemUgPSA2NDsKKyAgICB9CisKKyNpZmRlZiBIT1NUX1NQRUNJQUxfSU5JVAorICBIT1NUX1NQRUNJQUxfSU5JVCAoYXJnYywgYXJndik7CisjZW5kaWYKKworICBteW5hbWUgPSBhcmd2WzBdOworICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKG15bmFtZSk7CisKKyAgU1RBUlRfUFJPR1JFU1MgKG15bmFtZSwgMCk7CisKKyNpZm5kZWYgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRQorI2RlZmluZSBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FICJhLm91dCIKKyNlbmRpZgorCisgIG91dF9maWxlX25hbWUgPSBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FOworCisgIGhleF9pbml0ICgpOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgYmZkX2luaXQgKCk7CisgIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChteW5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfRU1VTEFUSU9OUworICBzZWxlY3RfZW11bGF0aW9uX21vZGUgKGFyZ2MsIGFyZ3YpOworI2VuZGlmCisKKyAgUFJPR1JFU1MgKDEpOworICBzeW1ib2xfYmVnaW4gKCk7CisgIGZyYWdfaW5pdCAoKTsKKyAgc3Vic2Vnc19iZWdpbiAoKTsKKyAgcGFyc2VfYXJncyAoJmFyZ2MsICZhcmd2KTsgCisgIHJlYWRfYmVnaW4gKCk7CisgIGlucHV0X3NjcnViX2JlZ2luICgpOworICBleHByX2JlZ2luICgpOworCisgIGlmIChmbGFnX3ByaW50X3N0YXRpc3RpY3MpCisgICAgeGF0ZXhpdCAoZHVtcF9zdGF0aXN0aWNzKTsKKworICBtYWNyb19hbHRlcm5hdGUgPSAwOworICBtYWNyb19zdHJpcF9hdCA9IDA7CisjaWZkZWYgVENfSTk2MAorICBtYWNyb19zdHJpcF9hdCA9IGZsYWdfbXJpOworI2VuZGlmCisjaWZkZWYgVENfQTI5SworICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBBTUQgMjlLIGZhbWlseSBtYWNybyBhc3NlbWJsZXIKKyAgICAgc3BlY2lmaWNhdGlvbi4gICovCisgIG1hY3JvX2FsdGVybmF0ZSA9IDE7CisgIG1hY3JvX3N0cmlwX2F0ID0gMTsKKyNlbmRpZgorCisgIG1hY3JvX2luaXQgKG1hY3JvX2FsdGVybmF0ZSwgZmxhZ19tcmksIG1hY3JvX3N0cmlwX2F0LCBtYWNyb19leHByKTsKKworICBQUk9HUkVTUyAoMSk7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIG91dHB1dF9maWxlX2NyZWF0ZSAob3V0X2ZpbGVfbmFtZSk7CisgIGFzc2VydCAoc3Rkb3V0cHV0ICE9IDApOworI2VuZGlmCisKKyNpZmRlZiB0Y19pbml0X2FmdGVyX2FyZ3MKKyAgdGNfaW5pdF9hZnRlcl9hcmdzICgpOworI2VuZGlmCisKKyAgaXRibF9pbml0ICgpOworCisgIC8qIE5vdyB0aGF0IHdlIGhhdmUgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBoYXZlIGNyZWF0ZWQgdGhlIG91dHB1dAorICAgICBmaWxlLCBkZWZpbmUgYW55IHN5bWJvbHMgcmVxdWVzdGVkIGJ5IC0tZGVmc3ltIGNvbW1hbmQgbGluZQorICAgICBhcmd1bWVudHMuICAqLworICB3aGlsZSAoZGVmc3ltcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKnN5bTsKKyAgICAgIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKKworICAgICAgc3ltID0gc3ltYm9sX25ldyAoZGVmc3ltcy0+bmFtZSwgYWJzb2x1dGVfc2VjdGlvbiwgZGVmc3ltcy0+dmFsdWUsCisJCQkmemVyb19hZGRyZXNzX2ZyYWcpOworICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltKTsKKyAgICAgIG5leHQgPSBkZWZzeW1zLT5uZXh0OworICAgICAgZnJlZSAoZGVmc3ltcyk7CisgICAgICBkZWZzeW1zID0gbmV4dDsKKyAgICB9CisKKyAgUFJPR1JFU1MgKDEpOworCisgIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndik7CS8qIEFzc2VtYmxlIGl0LiAqLworCisgIGNvbmRfZmluaXNoX2NoZWNrICgtMSk7CisKKyNpZmRlZiBtZF9lbmQKKyAgbWRfZW5kICgpOworI2VuZGlmCisKKyAgaWYgKHNlZW5fYXRfbGVhc3RfMV9maWxlICgpCisgICAgICAmJiAoZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0IHx8IGhhZF9lcnJvcnMgKCkgPT0gMCkpCisgICAga2VlcF9pdCA9IDE7CisgIGVsc2UKKyAgICBrZWVwX2l0ID0gMDsKKworI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCisgIC8qIFRoaXMgdXNlZCB0byBiZSBkb25lIGF0IHRoZSBzdGFydCBvZiB3cml0ZV9vYmplY3RfZmlsZSBpbgorICAgICB3cml0ZS5jLCBidXQgdGhhdCBjYXVzZWQgcHJvYmxlbXMgd2hlbiBkb2luZyBsaXN0aW5ncyB3aGVuCisgICAgIGtlZXBfaXQgd2FzIHplcm8uICBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGFib3ZlIG1kX2VuZCwgYnV0CisgICAgIEkgZGlkbid0IHdhbnQgdG8gcmlzayB0aGUgY2hhbmdlLiAgKi8KKyAgc3Vic2Vnc19maW5pc2ggKCk7CisjZW5kaWYKKworICBpZiAoa2VlcF9pdCkKKyAgICB3cml0ZV9vYmplY3RfZmlsZSAoKTsKKworI2lmbmRlZiBOT19MSVNUSU5HCisgIGxpc3RpbmdfcHJpbnQgKGxpc3RpbmdfZmlsZW5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgT0JKX1ZNUyAvKiBkb2VzIGl0cyBvd24gZmlsZSBoYW5kbGluZyAqLworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisgIGlmIChrZWVwX2l0KQorI2VuZGlmCisgICAgb3V0cHV0X2ZpbGVfY2xvc2UgKG91dF9maWxlX25hbWUpOworI2VuZGlmCisKKyAgaWYgKGhhZF9lcnJvcnMgKCkgPiAwICYmICEgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQorICAgIGtlZXBfaXQgPSAwOworCisgIGlmICgha2VlcF9pdCkKKyAgICB1bmxpbmsgKG91dF9maWxlX25hbWUpOworCisgIGlucHV0X3NjcnViX2VuZCAoKTsKKworICBFTkRfUFJPR1JFU1MgKG15bmFtZSk7CisKKyAgLyogVXNlIHhleGl0IGluc3RlYWQgb2YgcmV0dXJuLCBiZWNhdXNlIHVuZGVyIFZNUyBlbnZpcm9ubWVudHMgdGhleQorICAgICBtYXkgbm90IHBsYWNlIHRoZSBzYW1lIGludGVycHJldGF0aW9uIG9uIHRoZSB2YWx1ZSBnaXZlbi4gICovCisgIGlmIChoYWRfZXJyb3JzICgpID4gMCkKKyAgICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKKworICAvKiBPbmx5IGdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZSBpZiBhc3NlbWJsZXIgd2FzIHN1Y2Nlc3NmdWwuICAqLworICBwcmludF9kZXBlbmRlbmNpZXMgKCk7CisKKyAgeGV4aXQgKEVYSVRfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3N0YXRpc3RpY3MgKCkKK3sKKyNpZmRlZiBIQVZFX1NCUksKKyAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7CisjZW5kaWYKKyAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7CisKKyAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBhc3NlbWJseTogJWxkLiUwNmxkXG4iKSwKKwkgICBteW5hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKKyNpZmRlZiBIQVZFX1NCUksKKyAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksCisJICAgbXluYW1lLCAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7CisjZW5kaWYKKworICBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7CisgIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7CisgIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOworICByZWFkX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7CisKKyNpZmRlZiB0Y19wcmludF9zdGF0aXN0aWNzCisgIHRjX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7CisjZW5kaWYKKyNpZmRlZiBvYmpfcHJpbnRfc3RhdGlzdGljcworICBvYmpfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKKyNlbmRpZgorfQorDAorCisvKgkJCXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpCisgKgorICogSGVyZSB0byBhdHRlbXB0IDEgcGFzcyBvdmVyIGVhY2ggaW5wdXQgZmlsZS4KKyAqIFdlIHNjYW4gYXJndlsqXSBsb29raW5nIGZvciBmaWxlbmFtZXMgb3IgZXhhY3RseSAiIiB3aGljaCBpcworICogc2hvcnRoYW5kIGZvciBzdGRpbi4gQW55IGFyZ3YgdGhhdCBpcyBOVUxMIGlzIG5vdCBhIGZpbGUtbmFtZS4KKyAqIFdlIHNldCBuZWVkX3Bhc3NfMiBUUlVFIGlmLCBhZnRlciB0aGlzLCB3ZSBzdGlsbCBoYXZlIHVucmVzb2x2ZWQKKyAqIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICh1bmtub3duIHZhbHVlKSstKHVua25vd24gdmFsdWUpLgorICoKKyAqIE5vdGUgdGhlIHVuKnggc2VtYW50aWNzOiB0aGVyZSBpcyBvbmx5IDEgbG9naWNhbCBpbnB1dCBmaWxlLCBidXQgaXQKKyAqIG1heSBiZSBhIGNhdGVuYXRpb24gb2YgbWFueSAncGh5c2ljYWwnIGlucHV0IGZpbGVzLgorICovCitzdGF0aWMgdm9pZCAKK3BlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgc2F3X2FfZmlsZSA9IDA7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBmbGFnd29yZCBhcHBsaWNhYmxlOworI2VuZGlmCisKKyAgbmVlZF9wYXNzXzIgPSAwOworCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyNpZmRlZiBNQU5ZX1NFR01FTlRTCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQorICAgICAgc2VnbWVudF9pbmZvW2ldLmZpeF9yb290ID0gMDsKKyAgfQorICAvKiBDcmVhdGUgdGhlIHRocmVlIGZpeGVkIG9uZXMgKi8KKyAgeworICAgIHNlZ1Qgc2VnOworCisjaWZkZWYgVEVfQVBPTExPCisgICAgc2VnID0gc3Vic2VnX25ldyAoIi53dGV4dCIsIDApOworI2Vsc2UKKyAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLnRleHQiLCAwKTsKKyNlbmRpZgorICAgIGFzc2VydCAoc2VnID09IFNFR19FMCk7CisgICAgc2VnID0gc3Vic2VnX25ldyAoIi5kYXRhIiwgMCk7CisgICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UxKTsKKyAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLmJzcyIsIDApOworICAgIGFzc2VydCAoc2VnID09IFNFR19FMik7CisjaWZkZWYgVEVfQVBPTExPCisgICAgY3JlYXRlX3RhcmdldF9zZWdtZW50cyAoKTsKKyNlbmRpZgorICB9CisKKyNlbHNlIC8qIG5vdCBNQU5ZX1NFR01FTlRTICovCisgIHRleHRfZml4X3Jvb3QgPSBOVUxMOworICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKKyAgYnNzX2ZpeF9yb290ID0gTlVMTDsKKyNlbmRpZiAvKiBub3QgTUFOWV9TRUdNRU5UUyAqLworI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLworICAvKiBDcmVhdGUgdGhlIHN0YW5kYXJkIHNlY3Rpb25zLCBhbmQgdGhvc2UgdGhlIGFzc2VtYmxlciB1c2VzCisgICAgIGludGVybmFsbHkuICAqLworICB0ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3IChURVhUX1NFQ1RJT05fTkFNRSwgMCk7CisgIGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKERBVEFfU0VDVElPTl9OQU1FLCAwKTsKKyAgYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3IChCU1NfU0VDVElPTl9OQU1FLCAwKTsKKyAgLyogQEAgRklYTUUgLS0gd2UncmUgc2V0dGluZyB0aGUgUkVMT0MgZmxhZyBzbyB0aGF0IHNlY3Rpb25zIGFyZSBhc3N1bWVkCisgICAgIHRvIGhhdmUgcmVsb2NzLCBvdGhlcndpc2Ugd2UgZG9uJ3QgZmluZCBvdXQgaW4gdGltZS4gKi8KKyAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7CisgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sCisJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQworCQkJCSAgICAgICB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZKSk7CisgIC8qIEBAIEZJWE1FIC0tIFNFQ19DT0RFIHNlZW1zIHRvIG1lYW4gY29kZSBvbmx5LCByYXRoZXIgdGhhbiBjb2RlIHBvc3NpYmx5LiovCisgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sCisJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQykpOworICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOworICBzZWdfaW5mbyAoYnNzX3NlY3Rpb24pLT5ic3MgPSAxOworICBzdWJzZWdfbmV3IChCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMCk7CisgIHN1YnNlZ19uZXcgKEJGRF9VTkRfU0VDVElPTl9OQU1FLCAwKTsKKyAgcmVnX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiKkdBUyBgcmVnJyBzZWN0aW9uKiIsIDApOworICBleHByX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiKkdBUyBgZXhwcicgc2VjdGlvbioiLCAwKTsKKworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KKworICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOworCisgIC8qIFRoaXMgbWF5IGFkZCBzeW1ib2wgdGFibGUgZW50cmllcywgd2hpY2ggcmVxdWlyZXMgaGF2aW5nIGFuIG9wZW4gQkZELAorICAgICBhbmQgc2VjdGlvbnMgYWxyZWFkeSBjcmVhdGVkLCBpbiBCRkRfQVNTRU1CTEVSIG1vZGUuICAqLworICBtZF9iZWdpbiAoKTsKKworI2lmZGVmIG9ial9iZWdpbgorICBvYmpfYmVnaW4gKCk7CisjZW5kaWYKKworICBhcmd2Kys7CQkJLyogc2tpcCBhcmd2WzBdICovCisgIGFyZ2MtLTsJCQkvKiBza2lwIGFyZ3ZbMF0gKi8KKyAgd2hpbGUgKGFyZ2MtLSkKKyAgICB7CisgICAgICBpZiAoKmFyZ3YpCisJewkJCS8qIElzIGl0IGEgZmlsZS1uYW1lIGFyZ3VtZW50PyAqLworCSAgUFJPR1JFU1MgKDEpOworCSAgc2F3X2FfZmlsZSsrOworCSAgLyogYXJndi0+IiIgaWYgc3RkaW4gZGVzaXJlZCwgZWxzZS0+ZmlsZW5hbWUgKi8KKwkgIHJlYWRfYV9zb3VyY2VfZmlsZSAoKmFyZ3YpOworCX0KKyAgICAgIGFyZ3YrKzsJCQkvKiBjb21wbGV0ZWQgdGhhdCBhcmd2ICovCisgICAgfQorICBpZiAoIXNhd19hX2ZpbGUpCisgICAgcmVhZF9hX3NvdXJjZV9maWxlICgiIik7Cit9CQkJCS8qIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpICovCisKKy8qIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgbWFjcm8gY29kZSBhbmQgZ2FzIGV4cHJlc3Npb24gaGFuZGxpbmcuICAqLworCitzdGF0aWMgaW50CittYWNyb19leHByIChlbXNnLCBpZHgsIGluLCB2YWwpCisgICAgIGNvbnN0IGNoYXIgKmVtc2c7CisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgaW50ICp2YWw7Cit7CisgIGNoYXIgKmhvbGQ7CisgIGV4cHJlc3Npb25TIGV4OworCisgIHNiX3Rlcm1pbmF0ZSAoaW4pOworCisgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IGluLT5wdHIgKyBpZHg7CisgIGV4cHJlc3Npb24gKCZleCk7CisgIGlkeCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIGluLT5wdHI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisKKyAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKKyAgICBhc19iYWQgKCIlcyIsIGVtc2cpOworCisgICp2YWwgPSAoaW50KSBleC5YX2FkZF9udW1iZXI7CisKKyAgcmV0dXJuIGlkeDsKK30KKworLyogZW5kIG9mIGFzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9hcy5oIGIvZ2FzL2FzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyZGZhZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9hcy5oCkBAIC0wLDAgKzEsNjQ1IEBACisvKiBhcy5oIC0gZ2xvYmFsIGhlYWRlciBmaWxlCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgR0FTCisjZGVmaW5lIEdBUyAxCisvKgorICogSSB0aGluayB0aGlzIHN0dWZmIGlzIGxhcmdlbHkgb3V0IG9mIGRhdGUuICB4b3hvcmljaC4KKyAqCisgKiBDQVBJVEFMSVNFRCBuYW1lcyBhcmUgI2RlZmluZWQuCisgKiAibG93ZXJjYXNlSCIgaXMgI2RlZmluZWQgaWYgImxvd2VyY2FzZS5oIiBoYXMgYmVlbiAjaW5jbHVkZS1kLgorICogImxvd2VyY2FzZVQiIGlzIGEgdHlwZWRlZiBvZiAibG93ZXJjYXNlIiBvYmplY3RzLgorICogImxvd2VyY2FzZVAiIGlzIHR5cGUgInBvaW50ZXIgdG8gb2JqZWN0IG9mIHR5cGUgJ2xvd2VyY2FzZSciLgorICogImxvd2VyY2FzZVMiIGlzIHR5cGVkZWYgc3RydWN0IC4uLiBsb3dlcmNhc2VTLgorICoKKyAqICNkZWZpbmUgREVCVUcgdG8gZW5hYmxlIGFsbCB0aGUgImtub3ciIGFzc2VydGlvbiB0ZXN0cy4KKyAqICNkZWZpbmUgU1VTUEVDVCB3aGVuIGRlYnVnZ2luZyBoYXNoIGNvZGUuCisgKiAjZGVmaW5lIENPTU1PTiBhcyAiZXh0ZXJuIiBmb3IgYWxsIG1vZHVsZXMgZXhjZXB0IG9uZSwgd2hlcmUgeW91ICNkZWZpbmUKKyAqCUNPTU1PTiBhcyAiIi4KKyAqIElmIFRFU1QgaXMgI2RlZmluZWQsIHRoZW4gd2UgYXJlIHRlc3RpbmcgYSBtb2R1bGU6ICNkZWZpbmUgQ09NTU9OIGFzICIiLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworLyogVGhpcyBpcyB0aGUgY29kZSByZWNvbW1lbmRlZCBpbiB0aGUgYXV0b2NvbmYgZG9jdW1lbnRhdGlvbiwgYWxtb3N0CisgICB2ZXJiYXRpbS4gIElmIGl0IGRvZXNuJ3Qgd29yayBmb3IgeW91LCBsZXQgbWUga25vdywgYW5kIG5vdGlmeQorICAgZGptQGdudS5haS5taXQuZWR1IGFzIHdlbGwuICAqLworLyogQWRkZWQgI3VuZGVmIGZvciBESiBEZWxvcmllLiAgVGhlIHJpZ2h0IGZpeCBpcyB0byBlbnN1cmUgdGhhdCBhcy5oCisgICBpcyBpbmNsdWRlZCBmaXJzdCwgYmVmb3JlIGV2ZW4gYW55IHN5c3RlbSBoZWFkZXIgZmlsZXMsIGluIGFsbCBmaWxlcworICAgdGhhdCB1c2UgaXQuICBLUiAxOTk0LjExLjAzICovCisvKiBBZGRlZCB2b2lkKiB2ZXJzaW9uIGZvciBTVERDIGNhc2UuICBUaGlzIGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAgdGhlIGRlY2xhcmF0aW9uIGluIGJpc29uLnNpbXBsZSwgdXNlZCBmb3IgbTY4ayBvcGVyYW5kIHBhcnNpbmcuCisgICAtLUtSIDE5OTUuMDguMDggKi8KKy8qIEZvcmNlIHZvaWQqIGRlY2wgZm9yIGhwdXguICBUaGlzIGlzIHdoYXQgQmlzb24gdXNlcy4gIC0tS1IgMTk5NS4wOC4xNiAqLworCisvKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLworI2lmZGVmIF9fR05VQ19fCisjIGlmbmRlZiBhbGxvY2EKKyMgIGlmZGVmIF9fU1REQ19fCitleHRlcm4gdm9pZCAqYWxsb2NhICgpOworIyAgZWxzZQorZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBpZiBIQVZFX0FMTE9DQV9ICisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgZWxzZQorIyAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICBlbHNlCisjICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KKyMgICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQorZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKKyMgICAgZWxzZQorZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYgLyogX19TVERDX18sIF9faHB1eCAqLworIyAgIGVuZGlmIC8qIGFsbG9jYSAqLworIyAgZW5kaWYgLyogX0FJWCAqLworIyBlbmRpZiAvKiBIQVZFX0FMTE9DQV9IICovCisjZW5kaWYKKworLyogTm93LCB0ZW5kIHRvIHRoZSByZXN0IG9mIHRoZSBjb25maWd1cmF0aW9uLiAgKi8KKworLyogU3lzdGVtIGluY2x1ZGUgZmlsZXMgZmlyc3QuLi4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorLyogZm9yIHNpemVfdCwgcGlkX3QgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisvKiBUaGUgZmlyc3QgZ2V0b3B0IHZhbHVlIGZvciBtYWNoaW5lLWluZGVwZW5kZW50IGxvbmcgb3B0aW9ucy4KKyAgIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KKyNkZWZpbmUgT1BUSU9OX1NURF9CQVNFIDE1MAorLyogVGhlIGZpcnN0IGdldG9wdCB2YWx1ZSBmb3IgbWFjaGluZS1kZXBlbmRlbnQgbG9uZyBvcHRpb25zLgorICAgMTcwIGdpdmVzIHRoZSBzdGFuZGFyZCBvcHRpb25zIHJvb20gdG8gZ3Jvdy4gICovCisjZGVmaW5lIE9QVElPTl9NRF9CQVNFIDE3MAorCisjaWZkZWYgREVCVUcKKyN1bmRlZiBOREVCVUcKKyNlbmRpZgorI2lmICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX01JTk9SX18gPD0gNQorI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fICAoKGNoYXIqKTApCisjZW5kaWYKKyNpZiAwCisKKy8qIEhhbmRsZSBsb3NzYWdlIHdpdGggYXNzZXJ0LmguICAqLworI2lmbmRlZiBCUk9LRU5fQVNTRVJUCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZWxzZSAvKiBCUk9LRU5fQVNTRVJUICovCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBhc3NlcnQocCkgKChwKSA/IDAgOiAoYXNfYXNzZXJ0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pLCAwKSkKKyNlbHNlCisjZGVmaW5lIGFzc2VydChwKSAoKHApLCAwKQorI2VuZGlmCisjZW5kaWYgLyogQlJPS0VOX0FTU0VSVCAqLworCisjZWxzZQorCisjZGVmaW5lIGFzc2VydChQKSAoKFApID8gMCA6IChhc19hc3NlcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKQorI3VuZGVmIGFib3J0CisjZGVmaW5lIGFib3J0KCkJCWFzX2Fib3J0IChfX0ZJTEVfXywgX19MSU5FX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18pCisKKyNlbmRpZgorCisKKy8qIE5vdyBHTlUgaGVhZGVyIGZpbGVzLi4uICovCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjaW5jbHVkZSA8YmZkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaWJpYmVydHkuaD4KKworLyogRGVmaW5lIHRoZSBzdGFuZGFyZCBwcm9ncmVzcyBtYWNyb3MuICAqLworI2luY2x1ZGUgPHByb2dyZXNzLmg+CisKKy8qIFRoaXMgZG9lc24ndCBnZXQgdGFrZW4gY2FyZSBvZiBhbnl3aGVyZS4gICovCisjaWZuZGVmIF9fTVdFUktTX18gIC8qIE1ldHJvd2Vya3MgQyBjaG9rZXMgb24gdGhlICJkZWZpbmVkIChpbmxpbmUpIiAqLworI2lmICFkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQgKGlubGluZSkKKyNkZWZpbmUgaW5saW5lCisjZW5kaWYKKyNlbmRpZiAvKiAhX19NV0VSS1NfXyAqLworCisvKiBPdGhlciBzdHVmZiBmcm9tIGNvbmZpZy5oLiAgKi8KKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgorZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKKyNlbmRpZgorI2lmZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCitleHRlcm4gUFRSIG1hbGxvYyAoKTsKK2V4dGVybiBQVFIgcmVhbGxvYyAoKTsKKyNlbmRpZgorI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorZXh0ZXJuIHZvaWQgZnJlZSAoKTsKKyNlbmRpZgorI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCisvKiBUaGlzIGlzIG5lZWRlZCBmb3IgVk1TLiAgKi8KKyNpZiAhIGRlZmluZWQgKEhBVkVfVU5MSU5LKSAmJiBkZWZpbmVkIChIQVZFX1JFTU9WRSkKKyNkZWZpbmUgdW5saW5rIHJlbW92ZQorI2VuZGlmCisKKy8qIEhhY2sgdG8gbWFrZSAiZ2NjIC1XYWxsIiBub3QgY29tcGxhaW4gYWJvdXQgb2JzdGFjayBtYWNyb3MuICAqLworI2lmICFkZWZpbmVkIChtZW1jcHkpICYmICFkZWZpbmVkIChiY29weSkKKyNkZWZpbmUgYmNvcHkoc3JjLGRlc3Qsc2l6ZSkJbWVtY3B5KGRlc3Qsc3JjLHNpemUpCisjZW5kaWYKKworLyogTWFrZSBTYWJlciBoYXBwaWVyIG9uIG9ic3RhY2suaC4gICovCisjaWZkZWYgU0FCRVIKKyN1bmRlZiAgX19QVFJfVE9fSU5UCisjZGVmaW5lIF9fUFRSX1RPX0lOVChQKSAoKGludCkoUCkpCisjdW5kZWYgIF9fSU5UX1RPX1BUUgorI2RlZmluZSBfX0lOVF9UT19QVFIoUCkgKChjaGFyICopKFApKQorI2VuZGlmCisKKyNpZm5kZWYgX19MSU5FX18KKyNkZWZpbmUgX19MSU5FX18gInVua25vd24iCisjZW5kaWYgLyogX19MSU5FX18gKi8KKworI2lmbmRlZiBfX0ZJTEVfXworI2RlZmluZSBfX0ZJTEVfXyAidW5rbm93biIKKyNlbmRpZiAvKiBfX0ZJTEVfXyAqLworCisjaWZuZGVmIEZPUEVOX1dCCisjaWZkZWYgR08zMgorI2luY2x1ZGUgImZvcGVuLWJpbi5oIgorI2Vsc2UKKyNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVYSVRfU1VDQ0VTUworI2RlZmluZSBFWElUX1NVQ0NFU1MgMAorI2RlZmluZSBFWElUX0ZBSUxVUkUgMQorI2VuZGlmCisKKyNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSB4ZnJlZQorCisjZGVmaW5lIHhmcmVlIGZyZWUKKworI2luY2x1ZGUgImFzaW50bC5oIgorCisjZGVmaW5lIEJBRF9DQVNFKHZhbCkgXAoreyBcCisgICAgICBhc19mYXRhbChfKCJDYXNlIHZhbHVlICVsZCB1bmV4cGVjdGVkIGF0IGxpbmUgJWQgb2YgZmlsZSBcIiVzXCJcbiIpLCBcCisJICAgICAgIChsb25nKSB2YWwsIF9fTElORV9fLCBfX0ZJTEVfXyk7IFwKKwkgICB9CisMCisjaW5jbHVkZSAiZmxvbnVtLmgiCisKKy8qIFRoZXNlIGFyZSBhc3NlbWJsZXItd2lkZSBjb25jZXB0cyAqLworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorZXh0ZXJuIGJmZCAqc3Rkb3V0cHV0OwordHlwZWRlZiBiZmRfdm1hIGFkZHJlc3NUOwordHlwZWRlZiBiZmRfc2lnbmVkX3ZtYSBvZmZzZXRUOworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBhZGRyZXNzVDsKK3R5cGVkZWYgbG9uZyBvZmZzZXRUOworI2VuZGlmCisKKy8qIFR5cGUgb2Ygc3ltYm9sIHZhbHVlLCBldGMuICBGb3IgdXNlIGluIHByb3RvdHlwZXMuICAqLwordHlwZWRlZiBhZGRyZXNzVCB2YWx1ZVQ7CisKKyNpZm5kZWYgQ09NTU9OCisjaWZkZWYgVEVTVAorI2RlZmluZSBDT01NT04JCQkvKiBkZWNsYXJlIG91ciBDT01NT05zIHN0b3JhZ2UgaGVyZS4gKi8KKyNlbHNlCisjZGVmaW5lIENPTU1PTiBleHRlcm4JCS8qIG91ciBjb21tb25zIGxpdmUgZWxzd2hlcmUgKi8KKyNlbmRpZgorI2VuZGlmCisvKiBDT01NT04gbm93IGRlZmluZWQgKi8KKworI2lmZGVmIERFQlVHCisjaWZuZGVmIGtub3cKKyNkZWZpbmUga25vdyhwKSBhc3NlcnQocCkJLyogVmVyaWZ5IG91ciBhc3N1bXB0aW9ucyEgKi8KKyNlbmRpZiAvKiBub3QgeWV0IGRlZmluZWQgKi8KKyNlbHNlCisjZGVmaW5lIGtub3cocCkJCQkvKiBrbm93KCkgY2hlY2tzIGFyZSBuby1vcC5lZCAqLworI2VuZGlmCisMCisvKiBpbnB1dF9zY3J1Yi5jICovCisKKy8qCisgKiBTdXBwbGllcyBzYW5pdGlzZWQgYnVmZmVycyB0byByZWFkLmMuCisgKiBBbHNvIHVuZGVyc3RhbmRzIHByaW50aW5nIGxpbmUtbnVtYmVyIHBhcnQgb2YgZXJyb3IgbWVzc2FnZXMuCisgKi8KKwwKKworLyogc3Vic2Vncy5jICAgICBTdWItc2VnbWVudHMuIEFsc28sIHNlZ21lbnQoPWV4cHJlc3Npb24gdHlwZSlzLiovCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorCisjaWZkZWYgTUFOWV9TRUdNRU5UUworI2luY2x1ZGUgImJmZC5oIgorI2RlZmluZSBOX1NFR01FTlRTIDQwCisjZGVmaW5lIFNFR19OT1JNQUwoeCkgKCh4KSA+PSBTRUdfRTAgJiYgKHgpIDw9IFNFR19FMzkpCisjZGVmaW5lIFNFR19MSVNUIFNFR19FMCxTRUdfRTEsU0VHX0UyLFNFR19FMyxTRUdfRTQsU0VHX0U1LFNFR19FNixTRUdfRTcsU0VHX0U4LFNFR19FOSxcCisJCSBTRUdfRTEwLFNFR19FMTEsU0VHX0UxMixTRUdfRTEzLFNFR19FMTQsU0VHX0UxNSxTRUdfRTE2LFNFR19FMTcsU0VHX0UxOCxTRUdfRTE5LFwKKwkJIFNFR19FMjAsU0VHX0UyMSxTRUdfRTIyLFNFR19FMjMsU0VHX0UyNCxTRUdfRTI1LFNFR19FMjYsU0VHX0UyNyxTRUdfRTI4LFNFR19FMjksXAorCQkgU0VHX0UzMCxTRUdfRTMxLFNFR19FMzIsU0VHX0UzMyxTRUdfRTM0LFNFR19FMzUsU0VHX0UzNixTRUdfRTM3LFNFR19FMzgsU0VHX0UzOQorI2RlZmluZSBTRUdfVEVYVCBTRUdfRTAKKyNkZWZpbmUgU0VHX0RBVEEgU0VHX0UxCisjZGVmaW5lIFNFR19CU1MgU0VHX0UyCisjZGVmaW5lIFNFR19MQVNUIFNFR19FMzkKKyNlbHNlCisjZGVmaW5lIE5fU0VHTUVOVFMgMworI2RlZmluZSBTRUdfTk9STUFMKHgpICgoeCkgPT0gU0VHX1RFWFQgfHwgKHgpID09IFNFR19EQVRBIHx8ICh4KSA9PSBTRUdfQlNTKQorI2RlZmluZSBTRUdfTElTVCBTRUdfVEVYVCxTRUdfREFUQSxTRUdfQlNTCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIF9zZWdUCisgIHsKKyAgICBTRUdfQUJTT0xVVEUgPSAwLAorICAgIFNFR19MSVNULAorICAgIFNFR19VTktOT1dOLAorICAgIFNFR19HT09GLAkJCS8qIE9ubHkgaGFwcGVucyBpZiBBUyBoYXMgYSBsb2dpYyBlcnJvci4gKi8KKyAgICAvKiBJbnZlbnRlZCBzbyB3ZSBkb24ndCBjcmFzaCBwcmludGluZyAqLworICAgIC8qIGVycm9yIG1lc3NhZ2UgaW52b2x2aW5nIHdlaXJkIHNlZ21lbnQuICovCisgICAgU0VHX0VYUFIsCQkJLyogSW50ZXJtZWRpYXRlIGV4cHJlc3Npb24gdmFsdWVzLiAqLworICAgIFNFR19ERUJVRywJCQkvKiBEZWJ1ZyBzZWdtZW50ICovCisgICAgU0VHX05UViwJCQkvKiBUcmFuc2ZlcnQgdmVjdG9yIHByZWxvYWQgc2VnbWVudCAqLworICAgIFNFR19QVFYsCQkJLyogVHJhbnNmZXJ0IHZlY3RvciBwb3N0bG9hZCBzZWdtZW50ICovCisgICAgU0VHX1JFR0lTVEVSCQkvKiBNeXRoaWNhbDogYSByZWdpc3Rlci12YWx1ZWQgZXhwcmVzc2lvbiAqLworICB9IHNlZ1Q7CisKKyNkZWZpbmUgU0VHX01BWElNVU1fT1JESU5BTCAoU0VHX1JFR0lTVEVSKQorI2Vsc2UKK3R5cGVkZWYgYXNlY3Rpb24gKnNlZ1Q7CisjZGVmaW5lIFNFR19OT1JNQUwoU0VHKQkJKChTRUcpICE9IGFic29sdXRlX3NlY3Rpb24JXAorCQkJCSAmJiAoU0VHKSAhPSB1bmRlZmluZWRfc2VjdGlvbglcCisJCQkJICYmIChTRUcpICE9IHJlZ19zZWN0aW9uCVwKKwkJCQkgJiYgKFNFRykgIT0gZXhwcl9zZWN0aW9uKQorI2VuZGlmCit0eXBlZGVmIGludCBzdWJzZWdUOworCisvKiBXaGF0IHN1YnNlZyB3ZSBhcmUgYWNjcmV0aW5nIG5vdz8gKi8KK0NPTU1PTiBzdWJzZWdUIG5vd19zdWJzZWc7CisKKy8qIFNlZ21lbnQgb3VyIGluc3RydWN0aW9ucyBlbWl0IHRvLiAqLworQ09NTU9OIHNlZ1Qgbm93X3NlZzsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyNkZWZpbmUgc2VnbWVudF9uYW1lKFNFRykJYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgU0VHKQorI2Vsc2UKK2V4dGVybiBjaGFyIGNvbnN0ICpjb25zdCBzZWdfbmFtZVtdOworI2RlZmluZSBzZWdtZW50X25hbWUoU0VHKQlzZWdfbmFtZVsoaW50KSAoU0VHKV0KKyNlbmRpZgorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKK2V4dGVybiBpbnQgc2VjdGlvbl9hbGlnbm1lbnRbXTsKKyNlbmRpZgorCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorZXh0ZXJuIHNlZ1QgcmVnX3NlY3Rpb24sIGV4cHJfc2VjdGlvbjsKKy8qIFNob3VsZG4ndCB0aGVzZSBiZSBlbGltaW5hdGVkIHNvbWVkYXk/ICAqLworZXh0ZXJuIHNlZ1QgdGV4dF9zZWN0aW9uLCBkYXRhX3NlY3Rpb24sIGJzc19zZWN0aW9uOworI2RlZmluZSBhYnNvbHV0ZV9zZWN0aW9uCWJmZF9hYnNfc2VjdGlvbl9wdHIKKyNkZWZpbmUgdW5kZWZpbmVkX3NlY3Rpb24JYmZkX3VuZF9zZWN0aW9uX3B0cgorI2Vsc2UKKyNkZWZpbmUgcmVnX3NlY3Rpb24JCVNFR19SRUdJU1RFUgorI2RlZmluZSBleHByX3NlY3Rpb24JCVNFR19FWFBSCisjZGVmaW5lIHRleHRfc2VjdGlvbgkJU0VHX1RFWFQKKyNkZWZpbmUgZGF0YV9zZWN0aW9uCQlTRUdfREFUQQorI2RlZmluZSBic3Nfc2VjdGlvbgkJU0VHX0JTUworI2RlZmluZSBhYnNvbHV0ZV9zZWN0aW9uCVNFR19BQlNPTFVURQorI2RlZmluZSB1bmRlZmluZWRfc2VjdGlvbglTRUdfVU5LTk9XTgorI2VuZGlmCisKKy8qIHJlbGF4KCkgKi8KKworZW51bSBfcmVsYXhfc3RhdGUKKyAgeworICAgIC8qIFZhcmlhYmxlIGNoYXJzIHRvIGJlIHJlcGVhdGVkIGZyX29mZnNldCB0aW1lcy4KKyAgICAgICBGcl9zeW1ib2wgdW51c2VkLiBVc2VkIHdpdGggZnJfb2Zmc2V0ID09IDAgZm9yIGEKKyAgICAgICBjb25zdGFudCBsZW5ndGggZnJhZy4gKi8KKyAgICByc19maWxsID0gMSwKKworICAgIC8qIEFsaWduLiAgVGhlIGZyX29mZnNldCBmaWVsZCBob2xkcyB0aGUgcG93ZXIgb2YgMiB0byB3aGljaCB0bworICAgICAgIGFsaWduLiAgVGhlIGZyX3ZhciBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlCisgICAgICAgZmlsbCBwYXR0ZXJuLiAgVGhlIGZyX3N1YnR5cGUgZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCisgICAgICAgYnl0ZXMgdG8gc2tpcCB3aGVuIGFsaWduaW5nLCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLworICAgIHJzX2FsaWduLAorCisgICAgLyogQWxpZ24gY29kZS4gIFRoZSBmcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIHBvd2VyIG9mIDIgdG8gd2hpY2gKKyAgICAgICB0byBhbGlnbi4gIFRoaXMgdHlwZSBpcyBvbmx5IGdlbmVyYXRlZCBieSBtYWNoaW5lIHNwZWNpZmljCisgICAgICAgY29kZSwgd2hpY2ggaXMgbm9ybWFsbHkgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSBmaWxsCisgICAgICAgcGF0dGVybi4gIFRoZSBmcl9zdWJ0eXBlIGZpZWxkIGhvbGRzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAgIGJ5dGVzIHRvIHNraXAgd2hlbiBhbGlnbmluZywgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KKyAgICByc19hbGlnbl9jb2RlLAorCisgICAgLyogT3JnOiBGcl9vZmZzZXQsIGZyX3N5bWJvbDogYWRkcmVzcy4gMSB2YXJpYWJsZSBjaGFyOiBmaWxsCisgICAgICAgY2hhcmFjdGVyLiAqLworICAgIHJzX29yZywKKworI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECisgICAgLyogSkY6IGd1bnBvaW50ICovCisgICAgcnNfYnJva2VuX3dvcmQsCisjZW5kaWYKKworICAgIC8qIG1hY2hpbmUtc3BlY2lmaWMgcmVsYXhhYmxlIChvciBzaW1pbGFybHkgYWx0ZXJhYmxlKSBpbnN0cnVjdGlvbiAqLworICAgIHJzX21hY2hpbmVfZGVwZW5kZW50LAorCisgICAgLyogLnNwYWNlIGRpcmVjdGl2ZSB3aXRoIGV4cHJlc3Npb24gb3BlcmFuZCB0aGF0IG5lZWRzIHRvIGJlIGNvbXB1dGVkCisgICAgICAgbGF0ZXIuICBTaW1pbGFyIHRvIHJzX29yZywgYnV0IGRpZmZlcmVudC4KKyAgICAgICBmcl9zeW1ib2w6IG9wZXJhbmQKKyAgICAgICAxIHZhcmlhYmxlIGNoYXI6IGZpbGwgY2hhcmFjdGVyICAqLworICAgIHJzX3NwYWNlLAorCisgICAgLyogQSBEV0FSRiBsZWIxMjggdmFsdWU7IG9ubHkgRUxGIHVzZXMgdGhpcy4gIFRoZSBzdWJ0eXBlIGlzIDAgZm9yCisgICAgICAgdW5zaWduZWQsIDEgZm9yIHNpZ25lZC4gICovCisgICAgcnNfbGViMTI4LAorCisgICAgLyogRXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIHdoaWNoIHdlIG1heSBiZSBhYmxlIHRvIG9wdGltaXplLiAgKi8KKyAgICByc19jZmEKKyAgfTsKKwordHlwZWRlZiBlbnVtIF9yZWxheF9zdGF0ZSByZWxheF9zdGF0ZVQ7CisKKy8qIFRoaXMgdHlwZSBpcyB1c2VkIGluIHByb3RvdHlwZXMsIHNvIGl0IGNhbid0IGJlIGEgdHlwZSB0aGF0IHdpbGwgYmUKKyAgIHdpZGVuZWQgZm9yIGFyZ3VtZW50IHBhc3NpbmcuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVsYXhfc3Vic3RhdGVUOworCisvKiBFbm91Z2ggYml0cyBmb3IgYWRkcmVzcywgYnV0IHN0aWxsIGFuIGludGVnZXIgdHlwZS4KKyAgIENvdWxkIGJlIGEgcHJvYmxlbSwgY3Jvc3MtYXNzZW1ibGluZyBmb3IgNjQtYml0IG1hY2hpbmVzLiAgKi8KK3R5cGVkZWYgYWRkcmVzc1QgcmVsYXhfYWRkcmVzc1Q7CisMCisvKiBtYWluIHByb2dyYW0gImFzLmMiIChjb21tYW5kIGFyZ3VtZW50cyBldGMpICovCisKK0NPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfbm9fY29tbWVudHM7IC8qIC1mICovCitDT01NT04gdW5zaWduZWQgY2hhciBmbGFnX2RlYnVnOyAvKiAtRCAqLworQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2s7IC8qIC1KICovCisjaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKK0NPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQ7IC8qIC1LICovCisjZW5kaWYKKworLyogVHJ1ZSBpZiBsb2NhbCBzeW1ib2xzIHNob3VsZCBiZSByZXRhaW5lZC4gICovCitDT01NT04gaW50IGZsYWdfa2VlcF9sb2NhbHM7IC8qIC1MICovCisKKy8qIFRydWUgaWYgd2UgYXJlIGFzc2VtYmxpbmcgaW4gTVJJIG1vZGUuICAqLworQ09NTU9OIGludCBmbGFnX21yaTsKKworLyogVHJ1ZSBpZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiBtNjhrIE1SSSBtb2RlLiAgKi8KK0NPTU1PTiBpbnQgZmxhZ19tNjhrX21yaTsKKworLyogU2hvdWxkIHRoZSBkYXRhIHNlY3Rpb24gYmUgbWFkZSByZWFkLW9ubHkgYW5kIGFwcGVuZGVkIHRvIHRoZSB0ZXh0CisgICBzZWN0aW9uPyAgKi8KK0NPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0OyAvKiAtUiAqLworCisvKiBUcnVlIGlmIHdhcm5pbmdzIHNob3VsZCBiZSBpbmhpYml0ZWQuICAqLworQ09NTU9OIGludCBmbGFnX25vX3dhcm5pbmdzOyAvKiAtVyAqLworCisvKiBUcnVlIGlmIHdlIHNob3VsZCBhdHRlbXB0IHRvIGdlbmVyYXRlIG91dHB1dCBldmVuIGlmIG5vbi1mYXRhbCBlcnJvcnMKKyAgIGFyZSBkZXRlY3RlZC4gICovCitDT01NT04gdW5zaWduZWQgY2hhciBmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQ7IC8qIC1aICovCisKKy8qIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgYXNzZW1ibGVyIHNob3VsZCBvdXRwdXQgdGltZSBhbmQgc3BhY2UgdXNhZ2UuICovCitDT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3ByaW50X3N0YXRpc3RpY3M7CisKKy8qIFRydWUgaWYgbG9jYWwgYWJzb2x1dGUgc3ltYm9scyBhcmUgdG8gYmUgc3RyaXBwZWQuICAqLworQ09NTU9OIGludCBmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlOworCisvKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIHRyYWRpdGlvbmFsIGZvcm1hdCBvYmplY3QgZmlsZS4gICovCitDT01NT04gaW50IGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0OworCisvKiBuYW1lIG9mIGVtaXR0ZWQgb2JqZWN0IGZpbGUgKi8KK0NPTU1PTiBjaGFyICpvdXRfZmlsZV9uYW1lOworCisvKiBuYW1lIG9mIGZpbGUgZGVmaW5pbmcgZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gc2V0ICovCitDT01NT04gY2hhciAqaW5zdHRibF9maWxlX25hbWU7CisKKy8qIFRSVUUgaWYgd2UgbmVlZCBhIHNlY29uZCBwYXNzLiAqLworQ09NTU9OIGludCBuZWVkX3Bhc3NfMjsKKworLyogVFJVRSBpZiB3ZSBzaG91bGQgZG8gbm8gcmVsYXhpbmcsIGFuZAorICAgbGVhdmUgbG90cyBvZiBwYWRkaW5nLiAgKi8KK0NPTU1PTiBpbnQgbGlua3JlbGF4OworCisvKiBUUlVFIGlmIHdlIHNob3VsZCBwcm9kdWNlIGEgbGlzdGluZy4gICovCitleHRlcm4gaW50IGxpc3Rpbmc7CisKKy8qIFR5cGUgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdlIHNob3VsZCBnZW5lcmF0ZS4gIFdlIGN1cnJlbnRseQorICAgb25seSBzdXBwb3J0IHN0YWJzIGFuZCBFQ09GRi4gICovCisKK2VudW0gZGVidWdfaW5mb190eXBlCisgIHsKKyAgICBERUJVR19VTlNQRUNJRklFRCwKKyAgICBERUJVR19OT05FLAorICAgIERFQlVHX1NUQUJTLAorICAgIERFQlVHX0VDT0ZGLAorICAgIERFQlVHX0RXQVJGLAorICAgIERFQlVHX0RXQVJGMgorICB9OworCitleHRlcm4gZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZTsKKwwKKy8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCitleHRlcm4gaW50IG1heF9tYWNyb19uZXN0OworCisvKiBPYnN0YWNrIGNodW5rIHNpemUuICBLZWVwIGxhcmdlIGZvciBlZmZpY2llbnQgc3BhY2UgdXNlLCBtYWtlIHNtYWxsIHRvCisgICBpbmNyZWFzZSBtYWxsb2MgY2FsbHMgZm9yIG1vbml0b3JpbmcgbWVtb3J5IGFsbG9jYXRpb24uICAqLworZXh0ZXJuIGludCBjaHVua3NpemU7CisKK3N0cnVjdCBfcHNldWRvX3R5cGUKKyAgeworICAgIC8qIGFzc2VtYmxlciBtbmVtb25pYywgbG93ZXIgY2FzZSwgbm8gJy4nICovCisgICAgY29uc3QgY2hhciAqcG9jX25hbWU7CisgICAgLyogRG8gdGhlIHdvcmsgKi8KKyAgICB2b2lkICgqcG9jX2hhbmRsZXIpIFBBUkFNUyAoKGludCkpOworICAgIC8qIFZhbHVlIHRvIHBhc3MgdG8gaGFuZGxlciAqLworICAgIGludCBwb2NfdmFsOworICB9OworCit0eXBlZGVmIHN0cnVjdCBfcHNldWRvX3R5cGUgcHNldWRvX3R5cGVTOworCisvKiBQcmVmZXIgdmFyYXJncyBmb3Igbm9uLUFOU0kgY29tcGlsZXIsIHNpbmNlIHNvbWUgd2lsbCBiYXJmIGlmIHRoZQorICAgZWxsaXBzaXMgZGVmaW5pdGlvbiBpcyB1c2VkIHdpdGggYSBuby1hcmd1bWVudHMgZGVjbGFyYXRpb24uICAqLworI2lmIGRlZmluZWQgKEhBVkVfVkFSQVJHU19IKSAmJiAhZGVmaW5lZCAoX19TVERDX18pCisjdW5kZWYgSEFWRV9TVERBUkdfSAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChIQVZFX1NUREFSR19IKQorI2RlZmluZSBVU0VfU1REQVJHCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgZGVmaW5lZCAoSEFWRV9WQVJBUkdTX0gpCisjZGVmaW5lIFVTRV9WQVJBUkdTCisjZW5kaWYKKworI2lmZGVmIFVTRV9TVERBUkcKKyNpZiAoX19HTlVDX18gPj0gMikgJiYgIWRlZmluZWQoVk1TKQorLyogZm9yIHVzZSB3aXRoIC1XZm9ybWF0ICovCisKKyNpZiBfX0dOVUNfTUlOT1JfXyA8IDYKKy8qIFN1cHBvcnQgZm9yIGRvdWJsZSB1bmRlcnNjb3JlcyBpbiBhdHRyaWJ1dGUgbmFtZXMgd2FzIGFkZGVkIGluIGdjYworICAgMi42LCBzbyBhdm9pZCB0aGVtIGlmIHdlIGFyZSB1c2luZyBhbiBlYXJsaWVyIHZlcnNpb24uICAqLworI2RlZmluZSBfX3ByaW50Zl9fIHByaW50ZgorI2RlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAorI2VuZGlmCisKKyNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKSBcCisgIHZvaWQgRkNOIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgXAorICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAyKSkpCisjZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikgXAorICB2b2lkIEZDTiAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBcCisgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSkKKworI2Vsc2UgLyogX19HTlVDX18gPCAyIHx8IGRlZmluZWQoVk1TKSAqLworCisjZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKQorI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pCXZvaWQgRkNOIFBBUkFNUyAoKGNoYXIgKmZpbGUsIFwKKwkJCQkJCSAgdW5zaWduZWQgaW50IGxpbmUsIFwKKwkJCQkJICAJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCisKKyNlbmRpZiAvKiBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZChWTVMpICovCisKKyNlbHNlIC8qICEgVVNFX1NUREFSRyAqLworCisjZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gKCkKKyNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKQl2b2lkIEZDTiAoKQorCisjZW5kaWYgLyogISBVU0VfU1REQVJHICovCisKK1BSSU5URl9MSUtFIChhc19iYWQpOworUFJJTlRGX0xJS0UgKGFzX2ZhdGFsKTsKK1BSSU5URl9MSUtFIChhc190c2t0c2spOworUFJJTlRGX0xJS0UgKGFzX3dhcm4pOworUFJJTlRGX1dIRVJFX0xJS0UgKGFzX2JhZF93aGVyZSk7CitQUklOVEZfV0hFUkVfTElLRSAoYXNfd2Fybl93aGVyZSk7CisKK3ZvaWQgYXNfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKK3ZvaWQgYXNfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOworCit2b2lkIGZwcmludF92YWx1ZSBQQVJBTVMgKChGSUxFICpmaWxlLCBhZGRyZXNzVCB2YWx1ZSkpOwordm9pZCBzcHJpbnRfdmFsdWUgUEFSQU1TICgoY2hhciAqYnVmLCBhZGRyZXNzVCB2YWx1ZSkpOworCitpbnQgaGFkX2Vycm9ycyBQQVJBTVMgKCh2b2lkKSk7CitpbnQgaGFkX3dhcm5pbmdzIFBBUkFNUyAoKHZvaWQpKTsKKwordm9pZCBwcmludF92ZXJzaW9uX2lkIFBBUkFNUyAoKHZvaWQpKTsKK2NoYXIgKmFwcF9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKK2NoYXIgKmF0b2ZfaWVlZSBQQVJBTVMgKChjaGFyICpzdHIsIGludCB3aGF0X2tpbmQsIExJVFRMRU5VTV9UWVBFICogd29yZHMpKTsKK2NoYXIgKmlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgY2hhciAqcG9zaXRpb24pKTsKK2NoYXIgKmlucHV0X3NjcnViX25ld19maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CitjaGFyICppbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICoqYnVmcCkpOworaW50IGRvX3NjcnViX2NoYXJzIFBBUkFNUyAoKGludCAoKmdldCkgKGNoYXIgKiopLCBjaGFyICp0bywgaW50IHRvbGVuKSk7CitpbnQgZ2VuX3RvX3dvcmRzIFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICogd29yZHMsIGludCBwcmVjaXNpb24sCisJCQkgIGxvbmcgZXhwb25lbnRfYml0cykpOworaW50IGhhZF9lcnIgUEFSQU1TICgodm9pZCkpOworaW50IGlnbm9yZV9pbnB1dCBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkIGNvbmRfZmluaXNoX2NoZWNrIFBBUkFNUyAoKGludCkpOwordm9pZCBjb25kX2V4aXRfbWFjcm8gUEFSQU1TICgoaW50KSk7CitpbnQgc2Vlbl9hdF9sZWFzdF8xX2ZpbGUgUEFSQU1TICgodm9pZCkpOwordm9pZCBhcHBfcG9wIFBBUkFNUyAoKGNoYXIgKmFyZykpOwordm9pZCBhc19ob3dtdWNoIFBBUkFNUyAoKEZJTEUgKiBzdHJlYW0pKTsKK3ZvaWQgYXNfcGVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmdyaXBlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwordm9pZCBhc193aGVyZSBQQVJBTVMgKChjaGFyICoqbmFtZXAsIHVuc2lnbmVkIGludCAqbGluZXApKTsKK3ZvaWQgYnVtcF9saW5lX2NvdW50ZXJzIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgZG9fc2NydWJfYmVnaW4gUEFSQU1TICgoaW50KSk7Cit2b2lkIGlucHV0X3NjcnViX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgaW5wdXRfc2NydWJfY2xvc2UgUEFSQU1TICgodm9pZCkpOwordm9pZCBpbnB1dF9zY3J1Yl9lbmQgUEFSQU1TICgodm9pZCkpOworaW50IG5ld19sb2dpY2FsX2xpbmUgUEFSQU1TICgoY2hhciAqZm5hbWUsIGludCBsaW5lX251bWJlcikpOwordm9pZCBzdWJzZWdzX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgc3Vic2VnX2NoYW5nZSBQQVJBTVMgKChzZWdUIHNlZywgaW50IHN1YnNlZykpOworc2VnVCBzdWJzZWdfbmV3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN1YnNlZ1Qgc3Vic2VnKSk7CitzZWdUIHN1YnNlZ19mb3JjZV9uZXcgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgc3Vic2VnVCBzdWJzZWcpKTsKK3ZvaWQgc3Vic2VnX3NldCBQQVJBTVMgKChzZWdUIHNlZywgc3Vic2VnVCBzdWJzZWcpKTsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitzZWdUIHN1YnNlZ19nZXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKKyNlbmRpZgorCit2b2lkIHN0YXJ0X2RlcGVuZGVuY2llcyBQQVJBTVMgKChjaGFyICopKTsKK3ZvaWQgcmVnaXN0ZXJfZGVwZW5kZW5jeSBQQVJBTVMgKChjaGFyICopKTsKK3ZvaWQgcHJpbnRfZGVwZW5kZW5jaWVzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RydWN0IGV4cHJlc3Npb25TOworc3RydWN0IGZpeDsKK3N0cnVjdCBzeW1ib2w7CitzdHJ1Y3QgcmVsYXhfdHlwZTsKK3R5cGVkZWYgc3RydWN0IGZyYWcgZnJhZ1M7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisvKiBsaXRlcmFsLmMgKi8KK3ZhbHVlVCBhZGRfdG9fbGl0ZXJhbF9wb29sIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgdmFsdWVULCBzZWdULCBpbnQpKTsKKyNlbmRpZgorCitpbnQgY2hlY2tfZWhfZnJhbWUgUEFSQU1TICgoc3RydWN0IGV4cHJlc3Npb25TICosIHVuc2lnbmVkIGludCAqKSk7CitpbnQgZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggUEFSQU1TICgoZnJhZ1MgKikpOworaW50IGVoX2ZyYW1lX3JlbGF4X2ZyYWcgUEFSQU1TICgoZnJhZ1MgKikpOwordm9pZCBlaF9mcmFtZV9jb252ZXJ0X2ZyYWcgUEFSQU1TICgoZnJhZ1MgKikpOworCisjaW5jbHVkZSAiZXhwci5oIgkJLyogQmVmb3JlIHRhcmctKi5oICovCisKKy8qIHRoaXMgb25lIHN0YXJ0cyB0aGUgY2hhaW4gb2YgdGFyZ2V0IGRlcGVuZGFudCBoZWFkZXJzICovCisjaW5jbHVkZSAidGFyZy1lbnYuaCIKKworI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgorI2luY2x1ZGUgIndyaXRlLmgiCisjaW5jbHVkZSAiZnJhZ3MuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAicmVhZC5oIgorI2luY2x1ZGUgInN5bWJvbHMuaCIKKworI2luY2x1ZGUgInRjLmgiCisjaW5jbHVkZSAib2JqLmgiCisKKyNpZmRlZiBVU0VfRU1VTEFUSU9OUworI2luY2x1ZGUgImVtdWwuaCIKKyNlbmRpZgorI2luY2x1ZGUgImxpc3RpbmcuaCIKKworI2lmbmRlZiBMT0NBTF9MQUJFTFNfRE9MTEFSCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMAorI2VuZGlmCisKKyNpZm5kZWYgTE9DQUxfTEFCRUxTX0ZCCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAwCisjZW5kaWYKKworI2lmbmRlZiBURVhUX1NFQ1RJT05fTkFNRQorI2RlZmluZSBURVhUX1NFQ1RJT05fTkFNRQkiLnRleHQiCisjZGVmaW5lIERBVEFfU0VDVElPTl9OQU1FCSIuZGF0YSIKKyNkZWZpbmUgQlNTX1NFQ1RJT05fTkFNRQkiLmJzcyIKKyNlbmRpZgorCisjZW5kaWYgLyogR0FTICovCisKKy8qIGVuZCBvZiBhcy5oICovCmRpZmYgLS1naXQgYS9nYXMvYXNpbnRsLmggYi9nYXMvYXNpbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczM2M4NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9hc2ludGwuaApAQCAtMCwwICsxLDQ0IEBACisvKiBhc2ludGwuaCAtIGdhcy1zcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaWZkZWYgSEFWRV9MT0NBTEVfSAorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX05MUworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQorIyBpZmRlZiBnZXR0ZXh0X25vb3AKKyMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQorIyBlbHNlCisjICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorIyBlbmRpZgorI2Vsc2UKKy8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCisjIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKKyMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQorIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQorIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKKyMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvYXRvZi1nZW5lcmljLmMgYi9nYXMvYXRvZi1nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZjY2NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9hdG9mLWdlbmVyaWMuYwpAQCAtMCwwICsxLDYzNiBAQAorLyogYXRvZl9nZW5lcmljLmMgLSB0dXJuIGEgc3RyaW5nIG9mIGRpZ2l0cyBpbnRvIGEgRmxvbnVtCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImFzLmgiCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKDApCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAoMSkKKyNlbmRpZgorCisjaWZkZWYgVFJBQ0UKK3N0YXRpYyB2b2lkIGZsb251bV9wcmludCBQQVJBTVMgKChjb25zdCBGTE9OVU1fVFlQRSAqKSk7CisjZW5kaWYKKworI2RlZmluZSBBU1NVTUVfREVDSU1BTF9NQVJLX0lTX0RPVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgkJCQkJCQkJCSoKKyAqCUdpdmVuIGEgc3RyaW5nIG9mIGRlY2ltYWwgZGlnaXRzICwgd2l0aCBvcHRpb25hbCBkZWNpbWFsCSoKKyAqCW1hcmsgYW5kIG9wdGlvbmFsIGRlY2ltYWwgZXhwb25lbnQgKHBsYWNlIHZhbHVlKSBvZiB0aGUJCSoKKyAqCWxvd2VzdF9vcmRlciBkZWNpbWFsIGRpZ2l0OiBwcm9kdWNlIGEgZmxvYXRpbmcgcG9pbnQJCSoKKyAqCW51bWJlci4gVGhlIG51bWJlciBpcyAnZ2VuZXJpYycgZmxvYXRpbmcgcG9pbnQ6IG91cgkJKgorICoJY2FsbGVyIHdpbGwgZW5jb2RlIGl0IGZvciBhIHNwZWNpZmljIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLgkqCisgKgkJCQkJCQkJCSoKKyAqCUFzc3VtcHRpb25zCQkJCQkJCSoKKyAqCQl1c2VzIGJhc2UgKHJhZGl4KSAyCQkJCQkqCisgKgkJdGhpcyBtYWNoaW5lIHVzZXMgMidzIGNvbXBsZW1lbnQgYmluYXJ5IGludGVnZXJzCSoKKyAqCQl0YXJnZXQgZmxvbnVtcyB1c2UgIiAgICAgICIgICAgICAgICAiICAgICAgICIJCSoKKyAqCQl0YXJnZXQgZmxvbnVtcyBleHBvbmVudHMgZml0IGluIGEgbG9uZwkJCSoKKyAqCQkJCQkJCQkJKgorIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKworICBTeW50YXg6CisKKyAgPGZsb251bT4gOjo9IDxvcHRpb25hbC1zaWduPiA8ZGVjaW1hbC1udW1iZXI+IDxvcHRpb25hbC1leHBvbmVudD4KKyAgPG9wdGlvbmFsLXNpZ24+IDo6PSAnKycgfCAnLScgfCB7ZW1wdHl9CisgIDxkZWNpbWFsLW51bWJlcj4gOjo9IDxpbnRlZ2VyPgorICB8IDxpbnRlZ2VyPiA8cmFkaXgtY2hhcmFjdGVyPgorICB8IDxpbnRlZ2VyPiA8cmFkaXgtY2hhcmFjdGVyPiA8aW50ZWdlcj4KKyAgfCA8cmFkaXgtY2hhcmFjdGVyPiA8aW50ZWdlcj4KKworICA8b3B0aW9uYWwtZXhwb25lbnQ+IDo6PSB7ZW1wdHl9CisgIHwgPGV4cG9uZW50LWNoYXJhY3Rlcj4gPG9wdGlvbmFsLXNpZ24+IDxpbnRlZ2VyPgorCisgIDxpbnRlZ2VyPiA6Oj0gPGRpZ2l0PiB8IDxkaWdpdD4gPGludGVnZXI+CisgIDxkaWdpdD4gOjo9ICcwJyB8ICcxJyB8ICcyJyB8ICczJyB8ICc0JyB8ICc1JyB8ICc2JyB8ICc3JyB8ICc4JyB8ICc5JworICA8ZXhwb25lbnQtY2hhcmFjdGVyPiA6Oj0ge29uZSBjaGFyYWN0ZXIgZnJvbSAic3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MifQorICA8cmFkaXgtY2hhcmFjdGVyPiA6Oj0ge29uZSBjaGFyYWN0ZXIgZnJvbSAic3RyaW5nX29mX2RlY2ltYWxfbWFya3MifQorCisgICovCisKK2ludAorYXRvZl9nZW5lcmljIChhZGRyZXNzX29mX3N0cmluZ19wb2ludGVyLAorCSAgICAgIHN0cmluZ19vZl9kZWNpbWFsX21hcmtzLAorCSAgICAgIHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLAorCSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpCisgICAgIC8qIHJldHVybiBwb2ludGVyIHRvIGp1c3QgQUZURVIgbnVtYmVyIHdlIHJlYWQuICovCisgICAgIGNoYXIgKiphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyOworICAgICAvKiBBdCBtb3N0IG9uZSBwZXIgbnVtYmVyLiAqLworICAgICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrczsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3M7CisgICAgIEZMT05VTV9UWVBFICphZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOworeworICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCBtZWFucyBPSy4gKi8KKyAgY2hhciAqZmlyc3RfZGlnaXQ7CisgIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsOworICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsOworICBsb25nIGRlY2ltYWxfZXhwb25lbnQ7CisgIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZTsKKyAgY2hhciBkaWdpdHNfc2lnbl9jaGFyOworCisgIC8qCisgICAqIFNjYW4gdGhlIGlucHV0IHN0cmluZywgYWJzdHJhY3RpbmcgKDEpZGlnaXRzICgyKWRlY2ltYWwgbWFyayAoMykgZXhwb25lbnQuCisgICAqIEl0IHdvdWxkIGJlIHNpbXBsZXIgdG8gbW9kaWZ5IHRoZSBzdHJpbmcsIGJ1dCB3ZSBkb24ndDsganVzdCB0byBiZSBuaWNlCisgICAqIHRvIGNhbGxlci4KKyAgICogV2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGRpZ2l0cyB3ZSBoYXZlLCBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgZm9yCisgICAqIHRoZSBkaWdpdHMnIHZhbHVlLgorICAgKi8KKworICBjaGFyICpwOworICBjaGFyIGM7CisgIGludCBzZWVuX3NpZ25pZmljYW50X2RpZ2l0OworCisjaWZkZWYgQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QKKyAgYXNzZXJ0IChzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrc1swXSA9PSAnLicKKwkgICYmIHN0cmluZ19vZl9kZWNpbWFsX21hcmtzWzFdID09IDApOworI2RlZmluZSBJU19ERUNJTUFMX01BUksoYykJKChjKSA9PSAnLicpCisjZWxzZQorI2RlZmluZSBJU19ERUNJTUFMX01BUksoYykJKDAgIT0gc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywgKGMpKSkKKyNlbmRpZgorCisgIGZpcnN0X2RpZ2l0ID0gKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXI7CisgIGMgPSAqZmlyc3RfZGlnaXQ7CisKKyAgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQorICAgIHsKKyAgICAgIGRpZ2l0c19zaWduX2NoYXIgPSBjOworICAgICAgZmlyc3RfZGlnaXQrKzsKKyAgICB9CisgIGVsc2UKKyAgICBkaWdpdHNfc2lnbl9jaGFyID0gJysnOworCisgIHN3aXRjaCAoZmlyc3RfZGlnaXRbMF0pCisgICAgeworICAgIGNhc2UgJ24nOgorICAgIGNhc2UgJ04nOgorICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoIm5hbiIsIGZpcnN0X2RpZ2l0LCAzKSkKKwl7CisJICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5zaWduID0gMDsKKwkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsKKwkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlciA9CisJICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKKwkgICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyID0gZmlyc3RfZGlnaXQgKyAzOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdpJzoKKyAgICBjYXNlICdJJzoKKyAgICAgIGlmICghc3RybmNhc2VjbXAgKCJpbmYiLCBmaXJzdF9kaWdpdCwgMykpCisJeworCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9CisJICAgIGRpZ2l0c19zaWduX2NoYXIgPT0gJysnID8gJ1AnIDogJ04nOworCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+ZXhwb25lbnQgPSAwOworCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bGVhZGVyID0KKwkgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bG93OworCisJICBmaXJzdF9kaWdpdCArPSAzOworCSAgaWYgKCFzdHJuY2FzZWNtcCAoImluaXR5IiwgZmlyc3RfZGlnaXQsIDUpKQorCSAgICBmaXJzdF9kaWdpdCArPSA1OworCisJICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IGZpcnN0X2RpZ2l0OworCisJICByZXR1cm4gMDsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbCA9IDA7CisgIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbCA9IDA7CisgIGRlY2ltYWxfZXhwb25lbnQgPSAwOworICBzZWVuX3NpZ25pZmljYW50X2RpZ2l0ID0gMDsKKyAgZm9yIChwID0gZmlyc3RfZGlnaXQ7CisgICAgICAgKCgoYyA9ICpwKSAhPSAnXDAnKQorCSYmICghYyB8fCAhSVNfREVDSU1BTF9NQVJLIChjKSkKKwkmJiAoIWMgfHwgIXN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MsIGMpKSk7CisgICAgICAgcCsrKQorICAgIHsKKyAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCisJeworCSAgaWYgKHNlZW5fc2lnbmlmaWNhbnRfZGlnaXQgfHwgYyA+ICcwJykKKwkgICAgeworCSAgICAgICsrbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbDsKKwkgICAgICBzZWVuX3NpZ25pZmljYW50X2RpZ2l0ID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZmlyc3RfZGlnaXQrKzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBicmVhazsJCS8qIHAgLT4gY2hhciBhZnRlciBwcmUtZGVjaW1hbCBkaWdpdHMuICovCisJfQorICAgIH0JCQkJLyogRm9yIGVhY2ggZGlnaXQgYmVmb3JlIGRlY2ltYWwgbWFyay4gKi8KKworI2lmbmRlZiBPTERfRkxPQVRfUkVBRFMKKyAgLyogSWdub3JlIHRyYWlsaW5nIDAncyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gIFRoZSBvcmlnaW5hbCBjb2RlIGhlcmUKKyAgICogKGlmZGVmJ2Qgb3V0KSBkb2VzIG5vdCBkbyB0aGlzLCBhbmQgbnVtYmVycyBsaWtlCisgICAqCTQuMjk0OTY3Mjk2MDAwMDAwMDAwMDBlKzA5CSgyKiozMSkKKyAgICogY29tZSBvdXQgaW5leGFjdCBmb3Igc29tZSByZWFzb24gcmVsYXRlZCB0byBsZW5ndGggb2YgdGhlIGRpZ2l0CisgICAqIHN0cmluZy4KKyAgICovCisgIGlmIChjICYmIElTX0RFQ0lNQUxfTUFSSyAoYykpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHplcm9zID0gMDsJLyogTGVuZ3RoIG9mIGN1cnJlbnQgc3RyaW5nIG9mIHplcm9zICovCisKKyAgICAgIGZvciAocCsrOyAoYyA9ICpwKSAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYyk7IHArKykKKwl7CisJICBpZiAoYyA9PSAnMCcpCisJICAgIHsKKwkgICAgICB6ZXJvcysrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgKz0gMSArIHplcm9zOworCSAgICAgIHplcm9zID0gMDsKKwkgICAgfQorCX0KKyAgICB9CisjZWxzZQorICBpZiAoYyAmJiBJU19ERUNJTUFMX01BUksgKGMpKQorICAgIHsKKyAgICAgIGZvciAocCsrOworCSAgICgoKGMgPSAqcCkgIT0gJ1wwJykKKwkgICAgJiYgKCFjIHx8ICFzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkpOworCSAgIHArKykKKwl7CisJICBpZiAoaXNkaWdpdCAoYykpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIG1heSBiZSByZXRyYWN0ZWQgYmVsb3cuICovCisJICAgICAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsKys7CisKKwkgICAgICBpZiAoIC8qIHNlZW5fc2lnbmlmaWNhbnRfZGlnaXQgfHwgKi8gYyA+ICcwJykKKwkJeworCQkgIHNlZW5fc2lnbmlmaWNhbnRfZGlnaXQgPSBUUlVFOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghc2Vlbl9zaWduaWZpY2FudF9kaWdpdCkKKwkJeworCQkgIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbCA9IDA7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0JCQkvKiBGb3IgZWFjaCBkaWdpdCBhZnRlciBkZWNpbWFsIG1hcmsuICovCisgICAgfQorCisgIHdoaWxlIChudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwKKwkgJiYgZmlyc3RfZGlnaXRbbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbAorCQkJKyBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWxdID09ICcwJykKKyAgICAtLW51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKKyNlbmRpZgorCisgIGlmIChmbGFnX202OGtfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlIChjID09ICdfJykKKwljID0gKisrcDsKKyAgICB9CisgIGlmIChjICYmIHN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfZXhwb25lbnRfbWFya3MsIGMpKQorICAgIHsKKyAgICAgIGNoYXIgZGlnaXRzX2V4cG9uZW50X3NpZ25fY2hhcjsKKworICAgICAgYyA9ICorK3A7CisgICAgICBpZiAoZmxhZ19tNjhrX21yaSkKKwl7CisJICB3aGlsZSAoYyA9PSAnXycpCisJICAgIGMgPSAqKytwOworCX0KKyAgICAgIGlmIChjICYmIHN0cmNociAoIistIiwgYykpCisJeworCSAgZGlnaXRzX2V4cG9uZW50X3NpZ25fY2hhciA9IGM7CisJICBjID0gKisrcDsKKwl9CisgICAgICBlbHNlCisJeworCSAgZGlnaXRzX2V4cG9uZW50X3NpZ25fY2hhciA9ICcrJzsKKwl9CisKKyAgICAgIGZvciAoOyAoYyk7IGMgPSAqKytwKQorCXsKKwkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYykpCisJICAgIHsKKwkgICAgICBkZWNpbWFsX2V4cG9uZW50ID0gZGVjaW1hbF9leHBvbmVudCAqIDEwICsgYyAtICcwJzsKKwkgICAgICAvKgorCSAgICAgICAqIEJVRyEgSWYgd2Ugb3ZlcmZsb3cgaGVyZSwgd2UgbG9zZSEKKwkgICAgICAgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID09ICctJykKKwl7CisJICBkZWNpbWFsX2V4cG9uZW50ID0gLWRlY2ltYWxfZXhwb25lbnQ7CisJfQorICAgIH0KKworICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IHA7CisKKworCisgIG51bWJlcl9vZl9kaWdpdHNfYXZhaWxhYmxlID0KKyAgICBudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsICsgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsOworICByZXR1cm5fdmFsdWUgPSAwOworICBpZiAobnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPT0gMCkKKyAgICB7CisgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5leHBvbmVudCA9IDA7CS8qIE5vdCBzdHJpY3RseSBuZWNlc3NhcnkgKi8KKyAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlcgorCT0gLTEgKyBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sb3c7CisgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5zaWduID0gZGlnaXRzX3NpZ25fY2hhcjsKKyAgICAgIC8qIFdlIGhhdmUganVzdCBjb25jb2N0ZWQgKCsvLSkwLjBFMCAqLworCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGNvdW50OwkJLyogTnVtYmVyIG9mIHVzZWZ1bCBkaWdpdHMgbGVmdCB0byBzY2FuLiAqLworCisgICAgICBMSVRUTEVOVU1fVFlQRSAqZGlnaXRzX2JpbmFyeV9sb3c7CisgICAgICB1bnNpZ25lZCBpbnQgcHJlY2lzaW9uOworICAgICAgdW5zaWduZWQgaW50IG1heGltdW1fdXNlZnVsX2RpZ2l0czsKKyAgICAgIHVuc2lnbmVkIGludCBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZTsKKyAgICAgIHVuc2lnbmVkIGludCBtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0czsKKyAgICAgIHVuc2lnbmVkIGludCBtb3JlX3RoYW5fZW5vdWdoX2xpdHRsZW51bXNfZm9yX2RpZ2l0czsKKyAgICAgIHVuc2lnbmVkIGludCBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zOworICAgICAgdW5zaWduZWQgaW50IHNpemVfb2ZfZGlnaXRzX2luX2NoYXJzOworICAgICAgRkxPTlVNX1RZUEUgcG93ZXJfb2ZfMTBfZmxvbnVtOworICAgICAgRkxPTlVNX1RZUEUgZGlnaXRzX2Zsb251bTsKKworICAgICAgcHJlY2lzaW9uID0gKGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmhpZ2gKKwkJICAgLSBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sb3cKKwkJICAgKyAxKTsJLyogTnVtYmVyIG9mIGRlc3RpbmF0aW9uIGxpdHRsZW51bXMuICovCisKKyAgICAgIC8qIEluY2x1ZGVzIGd1YXJkIGJpdHMgKHR3byBsaXR0bGVudW1zIHdvcnRoKSAqLworI2lmIDAgLyogVGhlIGludGVnZXIgdmVyc2lvbiBiZWxvdyBpcyB2ZXJ5IGNsb3NlLCBhbmQgaXQgZG9lc24ndAorCSByZXF1aXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgKHdoaWNoIGlzIGN1cnJlbnRseSBidWdneSBvbgorCSB0aGUgQWxwaGEpLiAgKi8KKyAgICAgIG1heGltdW1fdXNlZnVsX2RpZ2l0cyA9ICgoKGRvdWJsZSkgKHByZWNpc2lvbiAtIDIpKQorCQkJICAgICAgICogKChkb3VibGUpIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpKQorCQkJICAgICAgIC8gKExPR19UT19CQVNFXzJfT0ZfMTApKQorCSsgMjsJCQkvKiAyIDo6IGd1YXJkIGRpZ2l0cy4gKi8KKyNlbHNlCisgICAgICBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMgPSAoKChwcmVjaXNpb24gLSAyKSkKKwkJCSAgICAgICAqICggKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykpCisJCQkgICAgICAgKiAxMDAwMDAwIC8gMzMyMTkyOCkKKwkrIDI7CQkJLyogMiA6OiBndWFyZCBkaWdpdHMuICovCisjZW5kaWYKKworICAgICAgaWYgKG51bWJlcl9vZl9kaWdpdHNfYXZhaWxhYmxlID4gbWF4aW11bV91c2VmdWxfZGlnaXRzKQorCXsKKwkgIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlID0gbWF4aW11bV91c2VmdWxfZGlnaXRzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSA9IG51bWJlcl9vZl9kaWdpdHNfYXZhaWxhYmxlOworCX0KKworICAgICAgLyogQ2FzdCB0aGVzZSB0byBTSUdORUQgTE9ORyBmaXJzdCwgb3RoZXJ3aXNlLCBvbiBzeXN0ZW1zIHdpdGgKKwkgTE9ORyB3aWRlciB0aGFuIElOVCAoc3VjaCBhcyBBbHBoYSBPU0YvMSksIHVuc2lnbmVkbmVzcyBtYXkKKwkgY2F1c2UgdW5leHBlY3RlZCByZXN1bHRzLiAgKi8KKyAgICAgIGRlY2ltYWxfZXhwb25lbnQgKz0gKChsb25nKSBudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsCisJCQkgICAtIChsb25nKSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSk7CisKKyNpZiAwCisgICAgICBtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cworCT0gKCgoKGRvdWJsZSkgbnVtYmVyX29mX2RpZ2l0c190b191c2UpICogTE9HX1RPX0JBU0VfMl9PRl8xMCkgKyAxKTsKKyNlbHNlCisgICAgICBtb3JlX3RoYW5fZW5vdWdoX2JpdHNfZm9yX2RpZ2l0cworCT0gKG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlICogMzMyMTkyOCAvIDEwMDAwMDAgKyAxKTsKKyNlbmRpZgorCisgICAgICBtb3JlX3RoYW5fZW5vdWdoX2xpdHRsZW51bXNfZm9yX2RpZ2l0cworCT0gKG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCisJICAgLyBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCisJKyAyOworCisgICAgICAvKiBDb21wdXRlIChkaWdpdHMpIHBhcnQuIEluICIxMi4zNEU1NiIgdGhpcyBpcyB0aGUgIjEyMzQiIHBhcnQuCisJIEFyaXRobWV0aWMgaXMgZXhhY3QgaGVyZS4gSWYgbm8gZGlnaXRzIGFyZSBzdXBwbGllZCB0aGVuIHRoaXMKKwkgcGFydCBpcyBhIDAgdmFsdWVkIGJpbmFyeSBpbnRlZ2VyLiAgQWxsb2NhdGUgcm9vbSB0byBidWlsZCB1cAorCSB0aGUgYmluYXJ5IG51bWJlciBhcyBsaXR0bGVudW1zLiAgV2Ugd2FudCB0aGlzIG1lbW9yeSB0bworCSBkaXNhcHBlYXIgd2hlbiB3ZSBsZWF2ZSB0aGlzIGZ1bmN0aW9uLiAgQXNzdW1lIG5vIGFsaWdubWVudAorCSBwcm9ibGVtcyA9PiAocm9vbSBmb3IgbiBvYmplY3RzKSA9PSBuICogKHJvb20gZm9yIDEKKwkgb2JqZWN0KS4gICovCisKKyAgICAgIHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgPSBtb3JlX3RoYW5fZW5vdWdoX2xpdHRsZW51bXNfZm9yX2RpZ2l0czsKKyAgICAgIHNpemVfb2ZfZGlnaXRzX2luX2NoYXJzID0gc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcworCSogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisKKyAgICAgIGRpZ2l0c19iaW5hcnlfbG93ID0gKExJVFRMRU5VTV9UWVBFICopCisJYWxsb2NhIChzaXplX29mX2RpZ2l0c19pbl9jaGFycyk7CisKKyAgICAgIG1lbXNldCAoKGNoYXIgKikgZGlnaXRzX2JpbmFyeV9sb3csICdcMCcsIHNpemVfb2ZfZGlnaXRzX2luX2NoYXJzKTsKKworICAgICAgLyogRGlnaXRzX2JpbmFyeV9sb3dbXSBpcyBhbGxvY2F0ZWQgYW5kIHplcm9lZC4gKi8KKworICAgICAgLyoKKyAgICAgICAqIFBhcnNlIHRoZSBkZWNpbWFsIGRpZ2l0cyBhcyBpZiAqIGRpZ2l0c19sb3cgd2FzIGluIHRoZSB1bml0cyBwb3NpdGlvbi4KKyAgICAgICAqIEVtaXQgYSBiaW5hcnkgbnVtYmVyIGludG8gZGlnaXRzX2JpbmFyeV9sb3dbXS4KKyAgICAgICAqCisgICAgICAgKiBVc2UgYSBsYXJnZS1wcmVjaXNpb24gdmVyc2lvbiBvZjoKKyAgICAgICAqICgoKDFzdC1kaWdpdCkgKiAxMCArIDJuZC1kaWdpdCkgKiAxMCArIDNyZC1kaWdpdCAuLi4pICogMTAgKyBsYXN0LWRpZ2l0CisgICAgICAgKi8KKworICAgICAgZm9yIChwID0gZmlyc3RfZGlnaXQsIGNvdW50ID0gbnVtYmVyX29mX2RpZ2l0c190b191c2U7IGNvdW50OyBwKyssIC0tY291bnQpCisJeworCSAgYyA9ICpwOworCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogTXVsdGlwbHkgYnkgMTAuIEFzc3VtZSBjYW4gbmV2ZXIgb3ZlcmZsb3cuCisJICAgICAgICogQWRkIHRoaXMgZGlnaXQgdG8gZGlnaXRzX2JpbmFyeV9sb3dbXS4KKwkgICAgICAgKi8KKworCSAgICAgIGxvbmcgY2Fycnk7CisJICAgICAgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOworCSAgICAgIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fbGltaXQ7CisKKwkgICAgICBsaXR0bGVudW1fbGltaXQgPSBkaWdpdHNfYmluYXJ5X2xvdworCQkrIG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzCisJCS0gMTsKKworCSAgICAgIGNhcnJ5ID0gYyAtICcwJzsJLyogY2hhciAtPiBiaW5hcnkgKi8KKworCSAgICAgIGZvciAobGl0dGxlbnVtX3BvaW50ZXIgPSBkaWdpdHNfYmluYXJ5X2xvdzsKKwkJICAgbGl0dGxlbnVtX3BvaW50ZXIgPD0gbGl0dGxlbnVtX2xpbWl0OworCQkgICBsaXR0bGVudW1fcG9pbnRlcisrKQorCQl7CisJCSAgbG9uZyB3b3JrOworCisJCSAgd29yayA9IGNhcnJ5ICsgMTAgKiAobG9uZykgKCpsaXR0bGVudW1fcG9pbnRlcik7CisJCSAgKmxpdHRsZW51bV9wb2ludGVyID0gd29yayAmIExJVFRMRU5VTV9NQVNLOworCQkgIGNhcnJ5ID0gd29yayA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJCX0KKworCSAgICAgIGlmIChjYXJyeSAhPSAwKQorCQl7CisJCSAgLyoKKwkJICAgKiBXZSBoYXZlIGEgR1JPU1MgaW50ZXJuYWwgZXJyb3IuCisJCSAgICogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorCQkgICAqLworCQkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICArK2NvdW50OwkJLyogJy4nIGRvZXNuJ3QgYWx0ZXIgZGlnaXRzIHVzZWQgY291bnQuICovCisJICAgIH0KKwl9CisKKworICAgICAgLyoKKyAgICAgICAqIERpZ2l0c19iaW5hcnlfbG93W10gcHJvcGVybHkgZW5jb2RlcyB0aGUgdmFsdWUgb2YgdGhlIGRpZ2l0cy4KKyAgICAgICAqIEZvcmdldCBhYm91dCBhbnkgaGlnaC1vcmRlciBsaXR0bGVudW1zIHRoYXQgYXJlIDAuCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChkaWdpdHNfYmluYXJ5X2xvd1tzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zIC0gMV0gPT0gMAorCSAgICAgJiYgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyA+PSAyKQorCXNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMtLTsKKworICAgICAgZGlnaXRzX2Zsb251bS5sb3cgPSBkaWdpdHNfYmluYXJ5X2xvdzsKKyAgICAgIGRpZ2l0c19mbG9udW0uaGlnaCA9IGRpZ2l0c19iaW5hcnlfbG93ICsgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyAtIDE7CisgICAgICBkaWdpdHNfZmxvbnVtLmxlYWRlciA9IGRpZ2l0c19mbG9udW0uaGlnaDsKKyAgICAgIGRpZ2l0c19mbG9udW0uZXhwb25lbnQgPSAwOworICAgICAgLyoKKyAgICAgICAqIFRoZSB2YWx1ZSBvZiBkaWdpdHNfZmxvbnVtIC4gc2lnbiBzaG91bGQgbm90IGJlIGltcG9ydGFudC4KKyAgICAgICAqIFdlIGhhdmUgYWxyZWFkeSBkZWNpZGVkIHRoZSBvdXRwdXQncyBzaWduLgorICAgICAgICogV2UgdHJ1c3QgdGhhdCB0aGUgc2lnbiB3b24ndCBpbmZsdWVuY2UgdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBudW1iZXIhCisgICAgICAgKiBTbyB3ZSBnaXZlIGl0IGEgdmFsdWUgZm9yIHRoZXNlIHJlYXNvbnM6CisgICAgICAgKiAoMSkgY291cnRlc3kgdG8gaHVtYW5zIHJlYWRpbmcvZGVidWdnaW5nCisgICAgICAgKiAgICAgdGhlc2UgbnVtYmVycyBzbyB0aGV5IGRvbid0IGdldCBleGNpdGVkIGFib3V0IHN0cmFuZ2UgdmFsdWVzCisgICAgICAgKiAoMikgaW4gZnV0dXJlIHRoZXJlIG1heSBiZSBtb3JlIG1lYW5pbmcgYXR0YWNoZWQgdG8gc2lnbiwKKyAgICAgICAqICAgICBhbmQgd2hhdCB3YXMKKyAgICAgICAqICAgICBoYXJtbGVzcyBub2lzZSBtYXkgYmVjb21lIGRpc3J1cHRpdmUsIGlsbC1jb25kaXRpb25lZCAob3Igd29yc2UpCisgICAgICAgKiAgICAgaW5wdXQuCisgICAgICAgKi8KKyAgICAgIGRpZ2l0c19mbG9udW0uc2lnbiA9ICcrJzsKKworICAgICAgeworCS8qCisJICogQ29tcHV0ZSB0aGUgbWFudHNzYSAoJiBleHBvbmVudCkgb2YgdGhlIHBvd2VyIG9mIDEwLgorCSAqIElmIHN1Y2Vzc2Z1bCwgdGhlbiBtdWx0aXBseSB0aGUgcG93ZXIgb2YgMTAgYnkgdGhlIGRpZ2l0cworCSAqIGdpdmluZyByZXR1cm5fYmluYXJ5X21hbnRpc3NhIGFuZCByZXR1cm5fYmluYXJ5X2V4cG9uZW50LgorCSAqLworCisJTElUVExFTlVNX1RZUEUgKnBvd2VyX2JpbmFyeV9sb3c7CisJaW50IGRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmU7CisJLyogVGhpcyByZWZlcnMgdG8gdGhlICItNTYiIGluICIxMi4zNEUtNTYiLiAqLworCS8qIEZBTFNFOiBkZWNpbWFsX2V4cG9uZW50IGlzIHBvc2l0aXZlIChvciAwKSAqLworCS8qIFRSVUU6ICBkZWNpbWFsX2V4cG9uZW50IGlzIG5lZ2F0aXZlICovCisJRkxPTlVNX1RZUEUgdGVtcG9yYXJ5X2Zsb251bTsKKwlMSVRUTEVOVU1fVFlQRSAqdGVtcG9yYXJ5X2JpbmFyeV9sb3c7CisJdW5zaWduZWQgaW50IHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtczsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9vZl9wb3dlcl9pbl9jaGFyczsKKworCXNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyA9IHByZWNpc2lvbjsKKwkvKiBQcmVjaXNpb24gaGFzIGEgYnVpbHQtaW4gZnVkZ2UgZmFjdG9yIHNvIHdlIGdldCBhIGZldyBndWFyZCBiaXRzLiAqLworCisJZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZSA9IGRlY2ltYWxfZXhwb25lbnQgPCAwOworCWlmIChkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlKQorCSAgeworCSAgICBkZWNpbWFsX2V4cG9uZW50ID0gLWRlY2ltYWxfZXhwb25lbnQ7CisJICB9CisKKwkvKiBGcm9tIG5vdyBvbjogdGhlIGRlY2ltYWwgZXhwb25lbnQgaXMgPiAwLiBJdHMgc2lnbiBpcyBzZXBhcmF0ZS4gKi8KKworCXNpemVfb2ZfcG93ZXJfaW5fY2hhcnMgPSBzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXMKKwkgICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKyAyOworCisJcG93ZXJfYmluYXJ5X2xvdyA9IChMSVRUTEVOVU1fVFlQRSAqKSBhbGxvY2EgKHNpemVfb2ZfcG93ZXJfaW5fY2hhcnMpOworCXRlbXBvcmFyeV9iaW5hcnlfbG93ID0gKExJVFRMRU5VTV9UWVBFICopIGFsbG9jYSAoc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyk7CisJbWVtc2V0ICgoY2hhciAqKSBwb3dlcl9iaW5hcnlfbG93LCAnXDAnLCBzaXplX29mX3Bvd2VyX2luX2NoYXJzKTsKKwkqcG93ZXJfYmluYXJ5X2xvdyA9IDE7CisJcG93ZXJfb2ZfMTBfZmxvbnVtLmV4cG9uZW50ID0gMDsKKwlwb3dlcl9vZl8xMF9mbG9udW0ubG93ID0gcG93ZXJfYmluYXJ5X2xvdzsKKwlwb3dlcl9vZl8xMF9mbG9udW0ubGVhZGVyID0gcG93ZXJfYmluYXJ5X2xvdzsKKwlwb3dlcl9vZl8xMF9mbG9udW0uaGlnaCA9IHBvd2VyX2JpbmFyeV9sb3cgKyBzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXMgLSAxOworCXBvd2VyX29mXzEwX2Zsb251bS5zaWduID0gJysnOworCXRlbXBvcmFyeV9mbG9udW0ubG93ID0gdGVtcG9yYXJ5X2JpbmFyeV9sb3c7CisJdGVtcG9yYXJ5X2Zsb251bS5oaWdoID0gdGVtcG9yYXJ5X2JpbmFyeV9sb3cgKyBzaXplX29mX3Bvd2VyX2luX2xpdHRsZW51bXMgLSAxOworCS8qCisJICogKHBvd2VyKSA9PSAxLgorCSAqIFNwYWNlIGZvciB0ZW1wb3JhcnlfZmxvbnVtIGFsbG9jYXRlZC4KKwkgKi8KKworCS8qCisJICogLi4uCisJICoKKwkgKiBXSElMRQltb3JlIGJpdHMKKwkgKiBETwlmaW5kIG5leHQgYml0ICh3aXRoIHBsYWNlIHZhbHVlKQorCSAqCW11bHRpcGx5IGludG8gcG93ZXIgbWFudGlzc2EKKwkgKiBPRAorCSAqLworCXsKKwkgIGludCBwbGFjZV9udW1iZXJfbGltaXQ7CisJICAvKiBBbnkgMTBeKDJebikgd2hvc2UgIm4iIGV4Y2VlZHMgdGhpcyAqLworCSAgLyogdmFsdWUgd2lsbCBmYWxsIG9mZiB0aGUgZW5kIG9mICovCisJICAvKiBmbG9udW1fWFhYWF9wb3dlcnNfb2ZfdGVuW10uICovCisJICBpbnQgcGxhY2VfbnVtYmVyOworCSAgY29uc3QgRkxPTlVNX1RZUEUgKm11bHRpcGxpY2FuZDsJLyogLT4gMTBeKDJebikgKi8KKworCSAgcGxhY2VfbnVtYmVyX2xpbWl0ID0gdGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbjsKKworCSAgbXVsdGlwbGljYW5kID0gKGRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmUKKwkJCSAgPyBmbG9udW1fbmVnYXRpdmVfcG93ZXJzX29mX3RlbgorCQkJICA6IGZsb251bV9wb3NpdGl2ZV9wb3dlcnNfb2ZfdGVuKTsKKworCSAgZm9yIChwbGFjZV9udW1iZXIgPSAxOy8qIFBsYWNlIHZhbHVlIG9mIHRoaXMgYml0IG9mIGV4cG9uZW50LiAqLworCSAgICAgICBkZWNpbWFsX2V4cG9uZW50Oy8qIFF1aXQgd2hlbiBubyBtb3JlIDEgYml0cyBpbiBleHBvbmVudC4gKi8KKwkgICAgICAgZGVjaW1hbF9leHBvbmVudCA+Pj0gMSwgcGxhY2VfbnVtYmVyKyspCisJICAgIHsKKwkgICAgICBpZiAoZGVjaW1hbF9leHBvbmVudCAmIDEpCisJCXsKKwkJICBpZiAocGxhY2VfbnVtYmVyID4gcGxhY2VfbnVtYmVyX2xpbWl0KQorCQkgICAgeworCQkgICAgICAvKiBUaGUgZGVjaW1hbCBleHBvbmVudCBoYXMgYSBtYWduaXR1ZGUgc28gZ3JlYXQKKwkJCSB0aGF0IG91ciB0YWJsZXMgY2FuJ3QgaGVscCB1cyBmcmFnbWVudCBpdC4KKwkJCSBBbHRob3VnaCB0aGlzIHJvdXRpbmUgaXMgaW4gZXJyb3IgYmVjYXVzZSBpdAorCQkJIGNhbid0IGltYWdpbmUgYSBudW1iZXIgdGhhdCBiaWcsIHNpZ25hbCBhbgorCQkJIGVycm9yIGFzIGlmIGl0IGlzIHRoZSB1c2VyJ3MgZmF1bHQgZm9yCisJCQkgcHJlc2VudGluZyBzdWNoIGEgYmlnIG51bWJlci4gICovCisJCSAgICAgIHJldHVybl92YWx1ZSA9IEVSUk9SX0VYUE9ORU5UX09WRVJGTE9XOworCQkgICAgICAvKiBxdWl0IG91dCBvZiBsb29wIGdyYWNlZnVsbHkgKi8KKwkJICAgICAgZGVjaW1hbF9leHBvbmVudCA9IDA7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworI2lmZGVmIFRSQUNFCisJCSAgICAgIHByaW50ZiAoImJlZm9yZSBtdWx0aXBseSwgcGxhY2VfbnVtYmVyID0gJWQuLCBwb3dlcl9vZl8xMF9mbG9udW06XG4iLAorCQkJICAgICAgcGxhY2VfbnVtYmVyKTsKKworCQkgICAgICBmbG9udW1fcHJpbnQgKCZwb3dlcl9vZl8xMF9mbG9udW0pOworCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7CisjZW5kaWYKKyNpZmRlZiBUUkFDRQorCQkgICAgICBwcmludGYgKCJtdWx0aXBsaWVyOlxuIik7CisJCSAgICAgIGZsb251bV9wcmludCAobXVsdGlwbGljYW5kICsgcGxhY2VfbnVtYmVyKTsKKwkJICAgICAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOworI2VuZGlmCisJCSAgICAgIGZsb251bV9tdWx0aXAgKG11bHRpcGxpY2FuZCArIHBsYWNlX251bWJlciwKKwkJCQkgICAgICZwb3dlcl9vZl8xMF9mbG9udW0sICZ0ZW1wb3JhcnlfZmxvbnVtKTsKKyNpZmRlZiBUUkFDRQorCQkgICAgICBwcmludGYgKCJhZnRlciBtdWx0aXBseTpcbiIpOworCQkgICAgICBmbG9udW1fcHJpbnQgKCZ0ZW1wb3JhcnlfZmxvbnVtKTsKKwkJICAgICAgKHZvaWQpIHB1dGNoYXIgKCdcbicpOworI2VuZGlmCisJCSAgICAgIGZsb251bV9jb3B5ICgmdGVtcG9yYXJ5X2Zsb251bSwgJnBvd2VyX29mXzEwX2Zsb251bSk7CisjaWZkZWYgVFJBQ0UKKwkJICAgICAgcHJpbnRmICgiYWZ0ZXIgY29weTpcbiIpOworCQkgICAgICBmbG9udW1fcHJpbnQgKCZwb3dlcl9vZl8xMF9mbG9udW0pOworCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7CisjZW5kaWYKKwkJICAgIH0gLyogSWYgdGhpcyBiaXQgb2YgZGVjaW1hbF9leHBvbmVudCB3YXMgY29tcHV0YWJsZS4qLworCQl9IC8qIElmIHRoaXMgYml0IG9mIGRlY2ltYWxfZXhwb25lbnQgd2FzIHNldC4gKi8KKwkgICAgfSAvKiBGb3IgZWFjaCBiaXQgb2YgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGV4cG9uZW50ICovCisjaWZkZWYgVFJBQ0UKKwkgIHByaW50ZiAoImFmdGVyIGNvbXB1dGluZyBwb3dlcl9vZl8xMF9mbG9udW06XG4iKTsKKwkgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7CisJICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7CisjZW5kaWYKKwl9CisKKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIHBvd2VyX29mXzEwX2Zsb251bSBpcyBwb3dlciBvZiB0ZW4gaW4gYmluYXJ5IChtYW50aXNzYSkgLCAoZXhwb25lbnQpLgorICAgICAgICogSXQgbWF5IGJlIHRoZSBudW1iZXIgMSwgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBORUVEIHRvIG11bHRpcGx5LgorICAgICAgICoKKyAgICAgICAqIE11bHRpcGx5IChkZWNpbWFsIGRpZ2l0cykgYnkgcG93ZXJfb2ZfMTBfZmxvbnVtLgorICAgICAgICovCisKKyAgICAgIGZsb251bV9tdWx0aXAgKCZwb3dlcl9vZl8xMF9mbG9udW0sICZkaWdpdHNfZmxvbnVtLCBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKKyAgICAgIC8qIEFzc2VydCBzaWduIG9mIHRoZSBudW1iZXIgd2UgbWFkZSBpcyAnKycuICovCisgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5zaWduID0gZGlnaXRzX3NpZ25fY2hhcjsKKworICAgIH0KKyAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworI2lmZGVmIFRSQUNFCitzdGF0aWMgdm9pZAorZmxvbnVtX3ByaW50IChmKQorICAgICBjb25zdCBGTE9OVU1fVFlQRSAqZjsKK3sKKyAgTElUVExFTlVNX1RZUEUgKmxwOworICBjaGFyIGxpdHRsZW51bV9mb3JtYXRbMTBdOworICBzcHJpbnRmIChsaXR0bGVudW1fZm9ybWF0LCAiICUlMCVkeCIsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogMik7CisjZGVmaW5lIHByaW50X2xpdHRsZW51bShMUCkJKHByaW50ZiAobGl0dGxlbnVtX2Zvcm1hdCwgTFApKQorICBwcmludGYgKCJmbG9udW0gQCVwICVjIGUlbGQiLCBmLCBmLT5zaWduLCBmLT5leHBvbmVudCk7CisgIGlmIChmLT5sb3cgPCBmLT5oaWdoKQorICAgIGZvciAobHAgPSBmLT5oaWdoOyBscCA+PSBmLT5sb3c7IGxwLS0pCisgICAgICBwcmludF9saXR0bGVudW0gKCpscCk7CisgIGVsc2UKKyAgICBmb3IgKGxwID0gZi0+bG93OyBscCA8PSBmLT5oaWdoOyBscCsrKQorICAgICAgcHJpbnRfbGl0dGxlbnVtICgqbHApOworICBwcmludGYgKCJcbiIpOworICBmZmx1c2ggKHN0ZG91dCk7Cit9CisjZW5kaWYKKworLyogZW5kIG9mIGF0b2ZfZ2VuZXJpYy5jICovCmRpZmYgLS1naXQgYS9nYXMvYmlnbnVtLWNvcHkuYyBiL2dhcy9iaWdudW0tY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmZjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvYmlnbnVtLWNvcHkuYwpAQCAtMCwwICsxLDgwIEBACisvKiBiaWdudW1fY29weS5jIC0gY29weSBhIGJpZ251bQorICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2luY2x1ZGUgImFzLmgiCisKKy8qCisgKgkJCWJpZ251bV9jb3B5ICgpCisgKgorICogQ29weSBhIGJpZ251bSBmcm9tIGluIHRvIG91dC4KKyAqIElmIHRoZSBvdXRwdXQgaXMgc2hvcnRlciB0aGFuIHRoZSBpbnB1dCwgY29weSBsb3dlci1vcmRlciBsaXR0bGVudW1zLgorICogUmV0dXJuIDAgb3IgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBsaXR0bGVudW1zIGRyb3BwZWQuCisgKiBBc3N1bWVzIGxpdHRsZW51bSBhcnJheXMgYXJlIGRlbnNlbHkgcGFja2VkOiBubyB1bnVzZWQgY2hhcnMgYmV0d2VlbgorICogdGhlIGxpdHRsZW51bXMuIFVzZXMgbWVtY3B5KCkgdG8gbW92ZSBsaXR0bGVudW1zLCBhbmQgd2FudHMgdG8KKyAqIGtub3cgbGVuZ3RoIChpbiBjaGFycykgb2YgdGhlIGlucHV0IGJpZ251bS4KKyAqLworCisvKiB2b2lkICovCitpbnQKK2JpZ251bV9jb3B5IChpbiwgaW5fbGVuZ3RoLCBvdXQsIG91dF9sZW5ndGgpCisgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICppbjsKKyAgICAgcmVnaXN0ZXIgaW50IGluX2xlbmd0aDsJLyogaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCisgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpvdXQ7CisgICAgIHJlZ2lzdGVyIGludCBvdXRfbGVuZ3RoOwkvKiBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KK3sKKyAgaW50IHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZDsKKworICBpZiAob3V0X2xlbmd0aCA8IGluX2xlbmd0aCkKKyAgICB7CisgICAgICBMSVRUTEVOVU1fVFlQRSAqcDsJLyogLT4gbW9zdCBzaWduaWZpY2FudCAobm9uLXplcm8pIGlucHV0CisJCQkJICAgICAgbGl0dGxlbnVtLiAqLworCisgICAgICBtZW1jcHkgKCh2b2lkICopIG91dCwgKHZvaWQgKikgaW4sCisJICAgICAgKHVuc2lnbmVkIGludCkgb3V0X2xlbmd0aCA8PCBMSVRUTEVOVU1fU0hJRlQpOworICAgICAgZm9yIChwID0gaW4gKyBpbl9sZW5ndGggLSAxOyBwID49IGluOyAtLXApCisJeworCSAgaWYgKCpwKQorCSAgICBicmVhazsKKwl9CisgICAgICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSBwIC0gaW4gLSBpbl9sZW5ndGggKyAxOworCisgICAgICBpZiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkIDwgMCkKKwl7CisJICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSAwOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtZW1jcHkgKChjaGFyICopIG91dCwgKGNoYXIgKikgaW4sCisJICAgICAgKHVuc2lnbmVkIGludCkgaW5fbGVuZ3RoIDw8IExJVFRMRU5VTV9TSElGVCk7CisKKyAgICAgIGlmIChvdXRfbGVuZ3RoID4gaW5fbGVuZ3RoKQorCXsKKwkgIG1lbXNldCAoKGNoYXIgKikgKG91dCArIGluX2xlbmd0aCksCisJCSAgJ1wwJywKKwkJICAodW5zaWduZWQgaW50KSAob3V0X2xlbmd0aCAtIGluX2xlbmd0aCkgPDwgTElUVExFTlVNX1NISUZUKTsKKwl9CisKKyAgICAgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IDA7CisgICAgfQorCisgIHJldHVybiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkKTsKK30JCQkJLyogYmlnbnVtX2NvcHkoKSAqLworCisvKiBlbmQgb2YgYmlnbnVtLWNvcHkuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpZ251bS5oIGIvZ2FzL2JpZ251bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjJmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvYmlnbnVtLmgKQEAgLTAsMCArMSw1MiBAQAorLyogYmlnbnVtLmgtYXJiaXRyYXJ5IHByZWNpc2lvbiBpbnRlZ2VycworICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCQkJCQkJCQkJKgorICoJQXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuCQkJCSoKKyAqCUZvciBzcGVlZCwgd2Ugd29yayBpbiBncm91cHMgb2YgYml0cywgZXZlbiB0aG91Z2ggdGhpcwkJKgorICoJY29tcGxpY2F0ZXMgYWxnb3JpdGhtcy4JCQkJCQkqCisgKglFYWNoIGdyb3VwIG9mIGJpdHMgaXMgY2FsbGVkIGEgJ2xpdHRsZW51bScuCQkJKgorICoJQSBidW5jaCBvZiBsaXR0bGVudW1zIHJlcHJlc2VudGluZyBhIChwb3NzaWJseSBsYXJnZSkJCSoKKyAqCWludGVnZXIgaXMgY2FsbGVkIGEgJ2JpZ251bScuCQkJCQkqCisgKglCaWdudW1zIGFyZSA+PSAwLgkJCQkJCSoKKyAqCQkJCQkJCQkJKgorIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMJKDE2KQorI2RlZmluZQlMSVRUTEVOVU1fUkFESVgJCQkoMSA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCisjZGVmaW5lCUxJVFRMRU5VTV9NQVNLCQkJKDB4RkZGRikKKyNkZWZpbmUgTElUVExFTlVNX1NISUZUCQkJKDEpCisjZGVmaW5lIENIQVJTX1BFUl9MSVRUTEVOVU0JCSgxIDw8IExJVFRMRU5VTV9TSElGVCkKKyNpZm5kZWYgQklUU19QRVJfQ0hBUgorI2RlZmluZSBCSVRTX1BFUl9DSEFSCQkJKDgpCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBMSVRUTEVOVU1fVFlQRTsKKworLyogSkYgdHJ1bmNhdGVkIHRoaXMgdG8gZ2V0IGFyb3VuZCBhIHByb2JsZW0gd2l0aCBHQ0MgKi8KKyNkZWZpbmUJTE9HX1RPX0JBU0VfMl9PRl8xMCAoMy4zMjE5MjgwOTQ4ODczNjIzNDc4NzAzMTk0Mjk0ODkzOTAxNzU4NjUxKQorLyogV0FSTklORzogSSBoYXZlbid0IGNoZWNrZWQgdGhhdCB0aGUgdHJhaWxpbmcgZGlnaXRzIGFyZSBjb3JyZWN0ISAqLworCisvKiBsZW5ndGhzIGFyZSBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KKworaW50IGJpZ251bV9jb3B5IFBBUkFNUyAoKExJVFRMRU5VTV9UWVBFICogaW4sIGludCBpbl9sZW5ndGgsCisJCQkgTElUVExFTlVNX1RZUEUgKiBvdXQsIGludCBvdXRfbGVuZ3RoKSk7CisKKy8qIGVuZCBvZiBiaWdudW0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpdF9maXguaCBiL2dhcy9iaXRfZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MjlhNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9iaXRfZml4LmgKQEAgLTAsMCArMSw1MSBAQAorLyogd3JpdGUuaAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGJpdF9maXggd2FzIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgbWFjaGluZXMgdGhhdCBuZWVkIHZhcmlhYmxlcworICAgdG8gYmUgaW5zZXJ0ZWQgaW4gYml0ZmllbGRzIG90aGVyIHRoYW4gMSwgMiBhbmQgNCBieXRlcy4KKyAgIEZ1cnRoZXJtb3JlIGl0IGdpdmVzIHVzIGEgcG9zc2liaWxsaXR5IHRvIG1hc2sgaW4gYml0cyBpbiB0aGUgc3ltYm9sCisgICB3aGVuIGl0J3MgZml4ZWQgaW4gdGhlIG9iamVjdGNvZGUgYW5kIGNoZWNrIHRoZSBzeW1ib2xzIGxpbWl0cy4KKworICAgVGhlIG9yLW1hc2sgaXMgdXNlZCB0byBzZXQgdGhlIGh1ZmZtYW4gYml0cyBpbiBkaXNwbGFjZW1lbnRzIGZvciB0aGUKKyAgIG5zMzJrIHBvcnQuCisgICBUaGUgYWNiaSwgYWRkcWksIG1vdnFpLCBjbXBxaSBpbnN0cnVjdGlvbiByZXF1aXJlcyBhbiBhc3NlbWJsZXIgdGhhdAorICAgY2FuIGhhbmRsZSBiaXRmaWVsZHMuIEllIGhhbmRsZSBhbiBleHByZXNzaW9uLCBldmFsdWF0ZSBpdCBhbmQgaW5zZXJ0CisgICB0aGUgcmVzdWx0IGluIGFuIHNvbWUgYml0ZmllbGQuICggZXg6IDUgYml0cyBpbiBhIHNob3J0IGZpZWxkIG9mIGEgb3Bjb2RlKQorICAgKi8KKworI2lmbmRlZiBfX2JpdF9maXhfaF9fCisjZGVmaW5lIF9fYml0X2ZpeF9oX18KKworc3RydWN0IGJpdF9maXgKKyAgeworICAgIGludCBmeF9iaXRfc2l6ZTsJCS8qIExlbmd0aCBvZiBiaXRmaWVsZCAqLworICAgIGludCBmeF9iaXRfb2Zmc2V0OwkJLyogQml0IG9mZnNldCB0byBiaXRmaWVsZCAqLworICAgIGxvbmcgZnhfYml0X2Jhc2U7CQkvKiBXaGVyZSBkbyB3ZSBhcHBseSB0aGUgYml0Zml4LgorCQkJCSAgICAgIElmIHRoaXMgaXMgemVybywgZGVmYXVsdCBpcyBhc3N1bWVkLiAqLworICAgIGxvbmcgZnhfYml0X2Jhc2VfYWRqOwkvKiBBZGp1c3RtZW50IG9mIGJhc2UgKi8KKyAgICBsb25nIGZ4X2JpdF9tYXg7CQkvKiBTaWduZXh0ZW5kZWQgbWF4IGZvciBiaXRmaWVsZCAqLworICAgIGxvbmcgZnhfYml0X21pbjsJCS8qIFNpZ25leHRlbmRlZCBtaW4gZm9yIGJpdGZpZWxkICovCisgICAgbG9uZyBmeF9iaXRfYWRkOwkJLyogT3IgbWFzaywgdXNlZCBmb3IgaHVmZm1hbiBwcmVmaXggKi8KKyAgfTsKK3R5cGVkZWYgc3RydWN0IGJpdF9maXggYml0X2ZpeFM7CisKKyNlbmRpZiAvKiBfX2JpdF9maXhfaF9fICovCisKKy8qIGVuZCBvZiBiaXRfZml4LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jZ2VuLmMgYi9nYXMvY2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjMzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY2dlbi5jCkBAIC0wLDAgKzEsNjYzIEBACisvKiBHQVMgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKK0dBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJjZ2VuLWRlc2MuaCIKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJjZ2VuLmgiCisKKy8qIE9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLCBtdXN0IGJlIHNldCBieSBtZF9iZWdpbi4gICovCisKK0NHRU5fQ1BVX0RFU0MgZ2FzX2NnZW5fY3B1X2Rlc2M7CisKKy8qIENhbGxiYWNrIHRvIGluc2VydCBhIHJlZ2lzdGVyIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KKyAgIEEgdGFyZ2V0IG1heSBjaG9vc2UgdG8gbGV0IEdBUyBwYXJzZSB0aGUgcmVnaXN0ZXJzLgorICAgPz8/IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCisKK3ZvaWQKK2NnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAobmFtZSwgbnVtYmVyKQorICAgICBjaGFyICogbmFtZTsKKyAgICAgaW50IG51bWJlcjsKK3sKKyAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCisgICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChuYW1lLCByZWdfc2VjdGlvbiwKKwkJCQkgICAgICBudW1iZXIsICYgemVyb19hZGRyZXNzX2ZyYWcpKTsKK30KKworLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcworICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCisgICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuCisKKyAgIFRoaXMgaXMgdXNlZCBieSBjcHUncyB3aXRoIHNpbXBsZSBvcGVyYW5kcy4gIEl0IGtlZXBzIGtub3dsZWRnZSBvZiB3aGF0CisgICBhbiBgZXhwcmVzc2lvblMnIGlzIGFuZCB3aGF0IGEgYGZpeHVwJyBpcyBvdXQgb2YgQ0dFTiB3aGljaCBmb3IgdGhlIHRpbWUKKyAgIGJlaW5nIGlzIHByZWZlcmFibGUuCisKKyAgIE9QSU5ERVggaXMgdGhlIGluZGV4IGluIHRoZSBvcGVyYW5kIHRhYmxlLgorICAgT1BJTkZPIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNob29zZXMgdG8gaGVscCBpbiByZWxvYyBkZXRlcm1pbmF0aW9uLiAgKi8KKworc3RydWN0IGZpeHVwCit7CisgIGludCBvcGluZGV4OworICBpbnQgb3BpbmZvOworICBleHByZXNzaW9uUyBleHA7Cit9OworCitzdGF0aWMgc3RydWN0IGZpeHVwIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107CitzdGF0aWMgaW50IG51bV9maXh1cHM7CisKKy8qIFByZXBhcmUgdG8gcGFyc2UgYW4gaW5zdHJ1Y3Rpb24uCisgICA/Pz8gTWF5IHdpc2ggdG8gbWFrZSB0aGlzIHN0YXRpYyBhbmQgZGVsZXRlIGNhbGxzIGluIG1kX2Fzc2VtYmxlLiAgKi8KKwordm9pZAorZ2FzX2NnZW5faW5pdF9wYXJzZSAoKQoreworICBudW1fZml4dXBzID0gMDsKK30KKworLyogUXVldWUgYSBmaXh1cC4gICovCisKK3N0YXRpYyB2b2lkCitxdWV1ZV9maXh1cCAob3BpbmRleCwgb3BpbmZvLCBleHBQKQorICAgICBpbnQgICAgICAgICAgIG9waW5kZXg7CisgICAgIGV4cHJlc3Npb25TICogZXhwUDsKK3sKKyAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLworICBpZiAobnVtX2ZpeHVwcyA+PSBHQVNfQ0dFTl9NQVhfRklYVVBTKQorICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisgIGZpeHVwc1tudW1fZml4dXBzXS5leHAgICAgID0gKiBleHBQOworICBmaXh1cHNbbnVtX2ZpeHVwc10ub3BpbmRleCA9IG9waW5kZXg7CisgIGZpeHVwc1tudW1fZml4dXBzXS5vcGluZm8gID0gb3BpbmZvOworICArKyBudW1fZml4dXBzOworfQorCisvKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGxvdyBhIGJhY2t1cCBvZiB0aGUgZml4dXAgY2hhaW4gdG8gYmUgbWFkZSwKKyAgIGFuZCB0byBoYXZlIHRoaXMgYmFja3VwIGJlIHN3YXBwZWQgd2l0aCB0aGUgY3VycmVudCBjaGFpbi4gIFRoaXMgYWxsb3dzCisgICBjZXJ0YWluIHBvcnRzLCBlZyB0aGUgbTMyciwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zIGFuZCBzd2FwIHRoZWlyIGZpeHVwcworICAgYXQgdGhlIHNhbWUgdGltZS4gICovCisvKiA/Pz8gSSB0aGluayB3aXRoIGNnZW5fYXNtX2ZpbmlzaF9pbnNuIChvciBzb21ldGhpbmcgZWxzZSkgdGhlcmUgaXMgbm8KKyAgIG1vcmUgbmVlZCBmb3IgdGhpcy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZml4dXAgc2F2ZWRfZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKK3N0YXRpYyBpbnQgc2F2ZWRfbnVtX2ZpeHVwczsKKwordm9pZAorZ2FzX2NnZW5fc2F2ZV9maXh1cHMgKCkKK3sKKyAgc2F2ZWRfbnVtX2ZpeHVwcyA9IG51bV9maXh1cHM7CisgIAorICBtZW1jcHkgKHNhdmVkX2ZpeHVwcywgZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKKworICBudW1fZml4dXBzID0gMDsKK30KKwordm9pZAorZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCkKK3sKKyAgbnVtX2ZpeHVwcyA9IHNhdmVkX251bV9maXh1cHM7CisgIAorICBtZW1jcHkgKGZpeHVwcywgc2F2ZWRfZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKKworICBzYXZlZF9udW1fZml4dXBzID0gMDsKK30KKwordm9pZAorZ2FzX2NnZW5fc3dhcF9maXh1cHMgKCkKK3sKKyAgaW50IHRtcDsKKyAgc3RydWN0IGZpeHVwIHRtcF9maXh1cDsKKworICBpZiAobnVtX2ZpeHVwcyA9PSAwKQorICAgIHsKKyAgICAgIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzICgpOworICAgIH0KKyAgZWxzZSBpZiAoc2F2ZWRfbnVtX2ZpeHVwcyA9PSAwKQorICAgIHsKKyAgICAgIGdhc19jZ2VuX3NhdmVfZml4dXBzICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRtcCA9IHNhdmVkX251bV9maXh1cHM7CisgICAgICBzYXZlZF9udW1fZml4dXBzID0gbnVtX2ZpeHVwczsKKyAgICAgIG51bV9maXh1cHMgPSB0bXA7CisgICAgICAKKyAgICAgIGZvciAodG1wID0gR0FTX0NHRU5fTUFYX0ZJWFVQUzsgdG1wLS07KQorCXsKKwkgIHRtcF9maXh1cCAgICAgICAgICA9IHNhdmVkX2ZpeHVwcyBbdG1wXTsKKwkgIHNhdmVkX2ZpeHVwcyBbdG1wXSA9IGZpeHVwcyBbdG1wXTsKKwkgIGZpeHVwcyBbdG1wXSAgICAgICA9IHRtcF9maXh1cDsKKwl9CisgICAgfQorfQorCisvKiBEZWZhdWx0IHJvdXRpbmUgdG8gcmVjb3JkIGEgZml4dXAuCisgICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ldy4KKyAgIEl0IGV4aXN0cyBiZWNhdXNlIHdlIHJlY29yZCBJTlNOIHdpdGggdGhlIGZpeHVwLgorCisgICBGUkFHIGFuZCBXSEVSRSBhcmUgdGhlaXIgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdG8gZml4X25ld19leHAuCisgICBMRU5HVEggaXMgaW4gYml0cy4KKyAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KKworICAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgorICAgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQorICAgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55CisgICBvcGVyYW5kIHR5cGUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4gbWRfYXBwbHlfZml4LiAgKi8KKworZml4UyAqCitnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgc3ltYm9sLCBvZmZzZXQpCisgICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7CisgICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOworICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOworICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7CisgICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKKyAgICAgc3ltYm9sUyAqICAgICAgICAgICAgc3ltYm9sOworICAgICBvZmZzZXRUICAgICAgICAgICAgICBvZmZzZXQ7Cit7CisgIGZpeFMgKiBmaXhQOworCisgIC8qIEl0IG1heSBzZWVtIHN0cmFuZ2UgdG8gdXNlIG9wZXJhbmQtPmF0dHJzIGFuZCBub3QgaW5zbi0+YXR0cnMgaGVyZSwKKyAgICAgYnV0IGl0IGlzIHRoZSBvcGVyYW5kIHRoYXQgaGFzIGEgcGMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCisKKyAgZml4UCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBsZW5ndGggLyA4LCBzeW1ib2wsIG9mZnNldCwKKwkJICBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAob3BlcmFuZCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLAorCQkgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCisJCSAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAorCQkgICAgICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOworICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOworICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKKworICByZXR1cm4gZml4UDsKK30KKworLyogRGVmYXVsdCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGdpdmVuIGFuIGV4cHJlc3Npb24uCisgICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ld19leHAuCisgICBJdCBleGlzdHMgYmVjYXVzZSB3ZSByZWNvcmQgSU5TTiB3aXRoIHRoZSBmaXh1cC4KKworICAgRlJBRyBhbmQgV0hFUkUgYXJlIHRoZWlyIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRvIGZpeF9uZXdfZXhwLgorICAgTEVOR1RIIGlzIGluIGJpdHMuCisgICBPUElORk8gaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIgY2hvb3NlcyB0byBoZWxwIGluIHJlbG9jIGRldGVybWluYXRpb24uCisKKyAgIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKKyAgIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKKyAgIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQorICAgb3BlcmFuZCB0eXBlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluIG1kX2FwcGx5X2ZpeC4gICovCisKK2ZpeFMgKgorZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwgb3BlcmFuZCwgb3BpbmZvLCBleHApCisgICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7CisgICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOworICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOworICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7CisgICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7CisgICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKKyAgICAgZXhwcmVzc2lvblMgKiAgICAgICAgZXhwOworeworICBmaXhTICogZml4UDsKKworICAvKiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRvIHVzZSBvcGVyYW5kLT5hdHRycyBhbmQgbm90IGluc24tPmF0dHJzIGhlcmUsCisgICAgIGJ1dCBpdCBpcyB0aGUgb3BlcmFuZCB0aGF0IGhhcyBhIHBjIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLworCisgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIGxlbmd0aCAvIDgsIGV4cCwKKwkJICAgICAgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKG9wZXJhbmQsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwKKwkJICAgICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKKwkJICAgICAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAorCQkJICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOworICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOworICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKKworICByZXR1cm4gZml4UDsKK30KKworLyogVXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBuZXh0IHR3byBwcm9jZWR1cmVzLiAgKi8KK3N0YXRpYyBqbXBfYnVmIGV4cHJfam1wX2J1ZjsKKworLyogQ2FsbGJhY2sgZm9yIGNnZW4gaW50ZXJmYWNlLiAgUGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgKlNUUlAuCisgICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2VzcyAoaW4gd2hpY2ggY2FzZQorICAgKlNUUlAgaXMgYWR2YW5jZWQgcGFzdCB0aGUgcGFyc2VkIHRleHQpLgorICAgV0FOVCBpcyBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgdGhlIGNhbGxlciBpcyBsb29raW5nIGZvci4KKyAgIElmIFdBTlQgPT0gQ0dFTl9BU01fUEFSU0VfSU5JVCB0aGUgY2FsbGVyIGlzIGJlZ2lubmluZyB0byB0cnkgdG8gbWF0Y2gKKyAgIGEgdGFibGUgZW50cnkgd2l0aCB0aGUgaW5zbiwgcmVzZXQgdGhlIHF1ZXVlZCBmaXh1cHMgY291bnRlci4KKyAgIEFuIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCBpcyBzdG9yZWQgaW4gUkVTVUxUUC4KKyAgIE9QSU5ERVggaXMgdGhlIG9wZXJhbmQncyB0YWJsZSBlbnRyeSBpbmRleC4KKyAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KKyAgIFRoZSByZXN1bHRpbmcgdmFsdWUgaXMgc3RvcmVkIGluIFZBTFVFUC4gICovCisKK2NvbnN0IGNoYXIgKgorZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIHdhbnQsIHN0clAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0UCwgdmFsdWVQKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlIHdhbnQ7CisgICAgIGNvbnN0IGNoYXIgKiogc3RyUDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIGludCBvcGluZm87CisgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqIHJlc3VsdFA7CisgICAgIGJmZF92bWEgKiB2YWx1ZVA7Cit7CisjaWZkZWYgX19TVERDX18KKyAgLyogVGhlc2UgYXJlIHZvbGF0aWxlIHRvIHN1cnZpdmUgdGhlIHNldGptcC4gICovCisgIGNoYXIgKiB2b2xhdGlsZSBob2xkOworICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiB2b2xhdGlsZSByZXN1bHRQXzE7CisjZWxzZQorICBzdGF0aWMgY2hhciAqIGhvbGQ7CisgIHN0YXRpYyBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiByZXN1bHRQXzE7CisjZW5kaWYKKyAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7CisgIGV4cHJlc3Npb25TIGV4cDsKKworICBpZiAod2FudCA9PSBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCkKKyAgICB7CisgICAgICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJlc3VsdFBfMSA9IHJlc3VsdFA7CisgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IChjaGFyICopICogc3RyUDsKKworICAvKiBXZSByZWx5IG9uIG1kX29wZXJhbmQgdG8gbG9uZ2ptcCBiYWNrIHRvIHVzLgorICAgICBUaGlzIGlzIGRvbmUgdmlhIGdhc19jZ2VuX21kX29wZXJhbmQuICAqLworICBpZiAoc2V0am1wIChleHByX2ptcF9idWYpICE9IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgaG9sZDsKKyAgICAgICogcmVzdWx0UF8xID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKKyAgICAgIHJldHVybiAiaWxsZWdhbCBvcGVyYW5kIjsKKyAgICB9CisKKyAgZXhwcmVzc2lvbiAoJiBleHApOworCisgICogc3RyUCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKworICAvKiBGSVhNRTogTmVlZCB0byBjaGVjayBgd2FudCcuICAqLworCisgIHN3aXRjaCAoZXhwLlhfb3ApCisgICAgeworICAgIGNhc2UgT19pbGxlZ2FsIDoKKyAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOworICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19hYnNlbnQgOgorICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7CisgICAgICAqIHJlc3VsdFAgPSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX2NvbnN0YW50IDoKKyAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKKyAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX3JlZ2lzdGVyIDoKKyAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKKyAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUkVHSVNURVI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHF1ZXVlX2ZpeHVwIChvcGluZGV4LCBvcGluZm8sICYgZXhwKTsKKyAgICAgICogdmFsdWVQID0gMDsKKyAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUVVFVUVEOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBlcnJtc2c7Cit9CisKKy8qIG1kX29wZXJhbmQgaGFuZGxlciB0byBjYXRjaCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbnMgYW5kIGhhbHQgdGhlCisgICBwYXJzaW5nIHByb2Nlc3Mgc28gdGhlIG5leHQgZW50cnkgY2FuIGJlIHRyaWVkLgorCisgICA/Pz8gVGhpcyBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5IGJ5IGFkZGluZyBjb2RlIHRvIGBleHByZXNzaW9uJy4gICovCisKK3ZvaWQKK2dhc19jZ2VuX21kX29wZXJhbmQgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOworeworICBsb25nam1wIChleHByX2ptcF9idWYsIDEpOworfQorCisvKiBGaW5pc2ggYXNzZW1ibGluZyBpbnN0cnVjdGlvbiBJTlNOLgorICAgQlVGIGNvbnRhaW5zIHdoYXQgd2UndmUgYnVpbHQgdXAgc28gZmFyLgorICAgTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJpdHMuCisgICBSRUxBWF9QIGlzIG5vbi16ZXJvIGlmIHJlbGF4YWJsZSBpbnNucyBzaG91bGQgYmUgZW1pdHRlZCBhcyBzdWNoLgorICAgT3RoZXJ3aXNlIHRoZXkncmUgZW1pdHRlZCBpbiBub24tcmVsYXhhYmxlIGZvcm1zLgorICAgVGhlICJyZXN1bHQiIGlzIHN0b3JlZCBpbiBSRVNVTFQgaWYgbm9uLU5VTEwuICAqLworCit2b2lkCitnYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbiwgYnVmLCBsZW5ndGgsIHJlbGF4X3AsIHJlc3VsdCkKKyAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKKyAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7CisgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgICAgIGludCByZWxheF9wOworICAgICBmaW5pc2hlZF9pbnNuUyAqIHJlc3VsdDsKK3sKKyAgaW50IGk7CisgIGludCByZWxheF9vcGVyYW5kOworICBjaGFyICogZjsKKyAgdW5zaWduZWQgaW50IGJ5dGVfbGVuID0gbGVuZ3RoIC8gODsKKworICAvKiA/Pz8gVGFyZ2V0IGZvbyBpc3N1ZXMgdmFyaW91cyB3YXJuaW5ncyBoZXJlLCBzbyBvbmUgbWlnaHQgd2FudCB0byBwcm92aWRlCisgICAgIGEgaG9vayBoZXJlLiAgSG93ZXZlciwgb3VyIGNhbGxlciBpcyBkZWZpbmVkIGluIHRjLWZvby5jIHNvIHRoZXJlCisgICAgIHNob3VsZG4ndCBiZSBhIG5lZWQgZm9yIGEgaG9vay4gICovCisKKyAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KKyAgICAgV2UgdXNlIChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpIHRvIGNvbXB1dGUgd2hlcmUgd2UgYXJlIGFuZCB3ZQorICAgICBkb24ndCB3YW50IGZyYWdfbm93IHRvIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLgorCisgICAgIFJlbGF4YWJsZSBpbnN0cnVjdGlvbnM6IFdlIG5lZWQgdG8gZW5zdXJlIHdlIGFsbG9jYXRlIGVub3VnaAorICAgICBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgaW5zbi4gICovCisKKyAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpKQorICAgIGFib3J0ICgpOyAvKiBUaGVzZSBjdXJyZW50bHkgc2hvdWxkbid0IGdldCBoZXJlLiAgKi8KKworICAvKiBJcyB0aGVyZSBhIHJlbGF4YWJsZSBpbnNuIHdpdGggdGhlIHJlbGF4YWJsZSBvcGVyYW5kIG5lZWRpbmcgYSBmaXh1cD8gICovCisKKyAgcmVsYXhfb3BlcmFuZCA9IC0xOworICBpZiAocmVsYXhfcCAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkpCisgICAgeworICAgICAgLyogU2NhbiB0aGUgZml4dXBzIGZvciB0aGUgb3BlcmFuZCBhZmZlY3RlZCBieSByZWxheGluZworCSAoaS5lLiB0aGUgYnJhbmNoIGFkZHJlc3MpLiAgKi8KKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9maXh1cHM7ICsrIGkpCisJeworCSAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGZpeHVwc1tpXS5vcGluZGV4KSwKKwkJCQkgICAgICAgQ0dFTl9PUEVSQU5EX1JFTEFYKSkKKwkgICAgeworCSAgICAgIHJlbGF4X29wZXJhbmQgPSBpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAocmVsYXhfb3BlcmFuZCAhPSAtMSkKKyAgICB7CisgICAgICBpbnQgbWF4X2xlbjsKKyAgICAgIGZyYWdTICogb2xkX2ZyYWc7CisKKyNpZmRlZiBUQ19DR0VOX01BWF9SRUxBWAorICAgICAgbWF4X2xlbiA9IFRDX0NHRU5fTUFYX1JFTEFYIChpbnNuLCBieXRlX2xlbik7CisjZWxzZQorICAgICAgbWF4X2xlbiA9IENHRU5fTUFYX0lOU05fU0laRTsKKyNlbmRpZgorICAgICAgLyogRW5zdXJlIHZhcmlhYmxlIHBhcnQgYW5kIGZpeGVkIHBhcnQgYXJlIGluIHNhbWUgZnJhZ21lbnQuICAqLworICAgICAgLyogRklYTUU6IEhhdmluZyB0byBkbyB0aGlzIHNlZW1zIGxpa2UgYSBoYWNrLiAgKi8KKyAgICAgIGZyYWdfZ3JvdyAobWF4X2xlbik7CisKKyAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZml4ZWQgcGFydC4gICovCisgICAgICBmID0gZnJhZ19tb3JlIChieXRlX2xlbik7CisKKyAgICAgIC8qIENyZWF0ZSBhIHJlbGF4YWJsZSBmcmFnbWVudCBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCisgICAgICBvbGRfZnJhZyA9IGZyYWdfbm93OworCisgICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCisJCW1heF9sZW4gLSBieXRlX2xlbiAvKiBtYXggY2hhcnMgKi8sCisJCTAgLyogdmFyaWFibGUgcGFydCBhbHJlYWR5IGFsbG9jYXRlZCAqLywKKwkJLyogRklYTUU6IFdoZW4gd2UgbWFjaGluZSBnZW5lcmF0ZSB0aGUgcmVsYXggdGFibGUsCisJCSAgIG1hY2hpbmUgZ2VuZXJhdGUgYSBtYWNybyB0byBjb21wdXRlIHN1YnR5cGUuICAqLworCQkxIC8qIHN1YnR5cGUgKi8sCisJCWZpeHVwc1tyZWxheF9vcGVyYW5kXS5leHAuWF9hZGRfc3ltYm9sLAorCQlmaXh1cHNbcmVsYXhfb3BlcmFuZF0uZXhwLlhfYWRkX251bWJlciwKKwkJZik7CisKKyAgICAgIC8qIFJlY29yZCB0aGUgb3BlcmFuZCBudW1iZXIgd2l0aCB0aGUgZnJhZ21lbnQgc28gbWRfY29udmVydF9mcmFnCisJIGNhbiB1c2UgZ2FzX2NnZW5fbWRfcmVjb3JkX2ZpeHVwIHRvIHJlY29yZCB0aGUgYXBwcm9wcmlhdGUgcmVsb2MuICAqLworICAgICAgb2xkX2ZyYWctPmZyX2NnZW4uaW5zbiAgICA9IGluc247CisgICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZGV4ID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5kZXg7CisgICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZm8gID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5mbzsKKyAgICAgIGlmIChyZXN1bHQpCisJcmVzdWx0LT5mcmFnID0gb2xkX2ZyYWc7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZiA9IGZyYWdfbW9yZSAoYnl0ZV9sZW4pOworICAgICAgaWYgKHJlc3VsdCkKKwlyZXN1bHQtPmZyYWcgPSBmcmFnX25vdzsKKyAgICB9CisKKyAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKKyAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbm93LiAgKi8KKyNpZiBDR0VOX0lOVF9JTlNOX1AKKyAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGYsIGxlbmd0aCwgKmJ1Zik7CisjZWxzZQorICBtZW1jcHkgKGYsIGJ1ZiwgYnl0ZV9sZW4pOworI2VuZGlmCisKKyAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZpeHVwczsgKytpKQorICAgIHsKKyAgICAgIGZpeFMgKmZpeFA7CisgICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPQorCWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywgZml4dXBzW2ldLm9waW5kZXgpOworCisgICAgICAvKiBEb24ndCBjcmVhdGUgZml4dXBzIGZvciB0aGVzZS4gIFRoYXQncyBkb25lIGR1cmluZyByZWxheGF0aW9uLgorCSBXZSBkb24ndCBuZWVkIHRvIHRlc3QgZm9yIENHRU5fSU5TTl9SRUxBWCBhcyB0aGV5IGNhbid0IGdldCBoZXJlCisJIChzZWUgYWJvdmUpLiAgKi8KKyAgICAgIGlmIChyZWxheF9wCisJICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkKKwkgICYmIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChvcGVyYW5kLCBDR0VOX09QRVJBTkRfUkVMQVgpKQorCWNvbnRpbnVlOworCisjaWZuZGVmIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAorI2RlZmluZSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAorI2VuZGlmCisKKwlmaXhQID0gbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkJCQkgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLAorCQkJCQkgZml4dXBzW2ldLm9waW5mbywKKwkJCQkJICYgZml4dXBzW2ldLmV4cCk7CisJaWYgKHJlc3VsdCkKKwkgIHJlc3VsdC0+Zml4dXBzW2ldID0gZml4UDsKKyAgICB9CisKKyAgaWYgKHJlc3VsdCkKKyAgICB7CisgICAgICByZXN1bHQtPm51bV9maXh1cHMgPSBudW1fZml4dXBzOworICAgICAgcmVzdWx0LT5hZGRyID0gZjsKKyAgICB9Cit9CisKKy8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKKyAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKKyAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCisgICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAorICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKKyAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCisgICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGZpeHVwLiAgKi8KKworLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzb21lIG9mIHRoZSBmaXh1cHMgYW5kIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24KKyAgIGhhbmRsZXMgdGhlIHJlc3QuICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChvciBzb21lIG90aGVyIGJmZCBmdW5jdGlvbikKKyAgIHNob3VsZCBoYW5kbGUgdGhlbSBhbGwuICAqLworCitpbnQKK2dhc19jZ2VuX21kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHVlUCwgc2VnKQorICAgICBmaXhTICogICBmaXhQOworICAgICB2YWx1ZVQgKiB2YWx1ZVA7CisgICAgIHNlZ1QgICAgIHNlZzsKK3sKKyAgY2hhciAqIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOworICB2YWx1ZVQgdmFsdWU7CisgIC8qIGNhbm9uaWNhbCBuYW1lLCBzaW5jZSB1c2VkIGEgbG90ICovCisgIENHRU5fQ1BVX0RFU0MgY2QgPSBnYXNfY2dlbl9jcHVfZGVzYzsKKyAgCisgIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVwIGluY2x1ZGVzCisgICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQorICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCisgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKKyAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KKyAgICAgdXNlICp2YWx1ZXAgc2luY2UgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KKyAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKKyAgICAgKnZhbHVlcCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCisgICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVwIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQorICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KKworICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKKyAgICB7CisgICAgICB2YWx1ZSA9ICogdmFsdWVQOworICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChmaXhQLT5meF9wY3JlbCkKKyAgICB2YWx1ZSA9ICogdmFsdWVQOworICBlbHNlCisgICAgeworICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7CisgICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKKwl7CisJICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCisJICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KKyAJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmICgoaW50KSBmaXhQLT5meF9yX3R5cGUgPj0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKKyAgICB7CisgICAgICBpbnQgb3BpbmRleCA9IChpbnQpIGZpeFAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7CisgICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPSBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9waW5kZXgpOworICAgICAgY29uc3QgY2hhciAqZXJybXNnOworICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7CisgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzID0gYWxsb2NhIChDR0VOX0NQVV9TSVpFT0ZfRklFTERTIChjZCkpOworICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gZml4UC0+ZnhfY2dlbi5pbnNuOworCisgICAgICAvKiBJZiB0aGUgcmVsb2MgaGFzIGJlZW4gZnVsbHkgcmVzb2x2ZWQgZmluaXNoIHRoZSBvcGVyYW5kIGhlcmUuICAqLworICAgICAgLyogRklYTUU6IFRoaXMgZHVwbGljYXRlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGNvZGUgaW4gQkZELiAgKi8KKyAgICAgIGlmIChmaXhQLT5meF9kb25lCisJICAvKiBGSVhNRTogSWYgcGFydGlhbF9pbnBsYWNlIGlzbid0IHNldCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdvbid0CisJICAgICBmaW5pc2ggdGhlIGpvYi4gIFRlc3RpbmcgZm9yIHBjcmVsIGlzIGEgdGVtcG9yYXJ5IGhhY2suICAqLworCSAgfHwgZml4UC0+ZnhfcGNyZWwpCisJeworCSAgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFIChjZCkgKGZpZWxkcywgQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKTsKKwkgIENHRU5fQ1BVX1NFVF9WTUFfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLCAoYmZkX3ZtYSkgdmFsdWUpOworCisjaWYgQ0dFTl9JTlRfSU5TTl9QCisJICB7CisJICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZSA9CisJICAgICAgY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpOworCisJICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLworCSAgICBlcnJtc2cgPSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLAorCQkJCQkJICAgJmluc25fdmFsdWUsIChiZmRfdm1hKSAwKTsKKwkgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbiksCisJCQkJIGluc25fdmFsdWUpOworCSAgfQorI2Vsc2UKKwkgICAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCisJICAgIGVycm1zZyA9IENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EIChjZCkgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHdoZXJlLAorCQkJCQkJICAgKGJmZF92bWEpIDApOworI2VuZGlmCisJICBpZiAoZXJybXNnKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsICIlcyIsIGVycm1zZyk7CisJfQorCisgICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKKwlyZXR1cm4gMTsKKworICAgICAgLyogVGhlIG9wZXJhbmQgaXNuJ3QgZnVsbHkgcmVzb2x2ZWQuICBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUKKwkgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24gYW5kIGxlYXZlIGl0IHRvCisJIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgd2hlbgorCSBwYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UuICAqLworCisgICAgICByZWxvY190eXBlID0gbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApOworICAgICAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX05PTkUpCisJeworCSAgZml4UC0+Znhfcl90eXBlID0gcmVsb2NfdHlwZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKKwkgIGZpeFAtPmZ4X2RvbmUgPSAxOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZml4UC0+ZnhfZG9uZSkKKyAgICB7CisgICAgICAvKiBXZSdyZSBmaW5pc2hlZCB3aXRoIHRoaXMgZml4dXAuICBJbnN0YWxsIGl0IGJlY2F1c2UKKwkgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICAqLworICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCisJeworCWNhc2UgQkZEX1JFTE9DXzg6CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCB2YWx1ZSwgMSk7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ18xNjoKKwkgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHZhbHVlLCAyKTsKKwkgIGJyZWFrOworCWNhc2UgQkZEX1JFTE9DXzMyOgorCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgdmFsdWUsIDQpOworCSAgYnJlYWs7CisJLyogRklYTUU6IGxhdGVyIGFkZCBzdXBwb3J0IGZvciA2NCBiaXRzLiAgKi8KKwlkZWZhdWx0OgorCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGluc3RhbGwgZml4IGZvciByZWxvYyB0eXBlICVkIChgJXMnKSIpLAorCQkJZml4UC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7CisJICBicmVhazsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBmaW5pc2ggdGhpbmdzIHVwLiAgKi8KKyAgICB9CisKKyAgLyogVHVjayBgdmFsdWUnIGF3YXkgZm9yIHVzZSBieSB0Y19nZW5fcmVsb2MuCisgICAgIFNlZSB0aGUgY29tbWVudCBkZXNjcmliaW5nIGZ4X2FkZG51bWJlciBpbiB3cml0ZS5oLgorICAgICBUaGlzIGZpZWxkIGlzIG1pc25hbWVkIChvciBtaXN1c2VkIDotKS4gICovCisgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOworCisgIHJldHVybiAxOworfQorCisvKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQgZm9ybWF0LgorCisgICBGSVhNRTogVG8gd2hhdCBleHRlbnQgY2FuIHdlIGdldCBhbGwgcmVsZXZhbnQgdGFyZ2V0cyB0byB1c2UgdGhpcz8gICovCisKK2FyZWxlbnQgKgorZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQorICAgICBhc2VjdGlvbiAqIHNlY3Rpb247CisgICAgIGZpeFMgKiAgICAgZml4UDsKK3sKKyAgYXJlbGVudCAqIHJlbG9jOworCisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisKKyAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7CisgIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCisJCSAgICBmaXhQLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7CisKKyAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJiBmaXhQLT5meF9hZGRzeS0+YnN5bTsKKworICAvKiBVc2UgZnhfb2Zmc2V0IGZvciB0aGVzZSBjYXNlcyAqLworICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKKyAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpCisgICAgcmVsb2MtPmFkZGVuZCAgPSBmaXhQLT5meF9vZmZzZXQ7CisgIGVsc2UKKyAgICByZWxvYy0+YWRkZW5kICA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKKworICByZWxvYy0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKKyAgcmV0dXJuIHJlbG9jOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2NnZW4uaCBiL2dhcy9jZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMTczMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jZ2VuLmgKQEAgLTAsMCArMSw5NCBAQAorLyogR0FTIGNnZW4gc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBHQVNfQ0dFTl9ICisjZGVmaW5lIEdBU19DR0VOX0gKKworLyogT3Bjb2RlIHRhYmxlIGhhbmRsZS4gICovCitleHRlcm4gQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKKworLyogTWF4aW11bSBudW1iZXIgb2YgZml4dXBzIGluIGFuIGluc24uCisgICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcywgYWxsb3cgdGFyZ2V0IHRvIG92ZXJyaWRlIGFuZCBkbyBzbyB0aGVyZS4gICovCisjZGVmaW5lIEdBU19DR0VOX01BWF9GSVhVUFMgMworCisvKiBTdHJ1Y3QgZGVmaW5pbmcgcmVzdWx0IG9mIGdhc19jZ2VuX2ZpbmlzaF9pbnNuLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogZnJhZyBjb250YWluaW5nIHRoZSBpbnNuICovCisgIGZyYWdTICogZnJhZzsKKyAgLyogQWRkcmVzcyBvZiBpbnNuIGluIGZyYWcuICAqLworICBjaGFyICogYWRkcjsKKyAgLyogTnVtYmVyIG9mIGZpeHVwcyB0aGlzIGluc24gaGFzLiAgKi8KKyAgaW50IG51bV9maXh1cHM7CisgIC8qIEFycmF5IG9mIGZpeHVwcy4gICovCisgIGZpeFMgKiBmaXh1cHNbR0FTX0NHRU5fTUFYX0ZJWFVQU107Cit9IGZpbmlzaGVkX2luc25TOworCisvKiBDYWxsYmFjayBmb3Igb3BlcmFuZCBwYXJzaW5nLgorICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCisgICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICogZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLAorCSAgICAgIGNvbnN0IGNoYXIgKiosIGludCwgaW50LCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwKKwkgICAgICBiZmRfdm1hICopKTsKKworLyogQ2FsbCB0aGlzIGZyb20gbWRfYXNzZW1ibGUgdG8gaW5pdGlhbGl6ZSB0aGUgYXNzZW1ibGVyIGNhbGxiYWNrLiAgKi8KK2V4dGVybiB2b2lkIGdhc19jZ2VuX2luaXRfcGFyc2UgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBnYXNfY2dlbl9zYXZlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBnYXNfY2dlbl9zd2FwX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7CisgICAgIAorLyogQWRkIGEgcmVnaXN0ZXIgdG8gdGhlIGFzc2VtYmxlcidzIGhhc2ggdGFibGUuCisgICBUaGlzIG1ha2VzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCisgICA/Pz8gVGhpcyBpc24ndCBjdXJyZW50bHkgdXNlZCwgYnV0IGl0IGNvdWxkIGJlIGluIHRoZSBmdXR1cmUuICAqLworZXh0ZXJuIHZvaWQgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKy8qIEFmdGVyIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKSBpcyBkb25lLCB0aGlzIGlzIGNhbGxlZCB0bworICAgb3V0cHV0IHRoZSBpbnNuIGFuZCByZWNvcmQgYW55IGZpeHVwcy4gICovCitleHRlcm4gdm9pZCBnYXNfY2dlbl9maW5pc2hfaW5zbiBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwKKwkJCQkJICBDR0VOX0lOU05fQllURVNfUFRSLCB1bnNpZ25lZCBpbnQsCisJCQkJCSAgaW50LCBmaW5pc2hlZF9pbnNuUyAqKSk7CisKKy8qIFJlY29yZCBhIGZpeHVwLiAgKi8KK2V4dGVybiBmaXhTICogZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCisJCQkJCSAgICAgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAorCQkJCQkgICAgIHN5bWJvbFMgKiwgb2Zmc2V0VCkpOworZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCisJCQkJCQkgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAorCQkJCQkJIGV4cHJlc3Npb25TICopKTsKKworLyogbWRfYXBwbHlfZml4MyBoYW5kbGVyICovCitleHRlcm4gaW50IGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOworCisvKiB0Y19nZW5fcmVsb2MgaGFuZGxlciAqLworZXh0ZXJuIGFyZWxlbnQgKmdhc19jZ2VuX3RjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKKworLyogVGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gbG9va3VwIGEgcmVsb2MuICAqLworZXh0ZXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQorbWRfY2dlbl9sb29rdXBfcmVsb2MgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IENHRU5fT1BFUkFORCAqLAorCQkJICAgICAgZml4UyAqKSk7CisKKy8qIE9wdGlvbmFsIHRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgKi8KK2V4dGVybiBmaXhTICoKK21kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGNvbnN0IENHRU5fSU5TTiAqLCBpbnQsCisJCQkJICBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAorCQkJCSAgZXhwcmVzc2lvblMgKikpOworCisjZW5kaWYgLyogR0FTX0NHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmQuYyBiL2dhcy9jb25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhMmE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25kLmMKQEAgLTAsMCArMSw0NjEgQEAKKy8qIGNvbmQuYyAtIGNvbmRpdGlvbmFsIGFzc2VtYmx5IHBzZXVkby1vcHMsIGFuZCAuaW5jbHVkZQorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAibWFjcm8uaCIKKworI2luY2x1ZGUgIm9ic3RhY2suaCIKKworLyogVGhpcyBpcyBhbGxvY2F0ZWQgdG8gZ3JvdyBhbmQgc2hyaW5rIGFzIC5pZmRlZi8uZW5kaWYgcGFpcnMgYXJlIHNjYW5uZWQuICovCitzdHJ1Y3Qgb2JzdGFjayBjb25kX29ic3RhY2s7CisKK3N0cnVjdCBmaWxlX2xpbmUKK3sKKyAgY2hhciAqZmlsZTsKKyAgdW5zaWduZWQgaW50IGxpbmU7Cit9OworCisvKiBXZSBwdXNoIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGZvciBlYWNoIC5pZiwgYW5kIHBvcCBpdCBhdCB0aGUKKyAgIC5lbmRpZi4gICovCisKK3N0cnVjdCBjb25kaXRpb25hbF9mcmFtZQoreworICAvKiBUaGUgc291cmNlIGZpbGUgJiBsaW5lIG51bWJlciBvZiB0aGUgImlmIi4gICovCisgIHN0cnVjdCBmaWxlX2xpbmUgaWZfZmlsZV9saW5lOworICAvKiBUaGUgc291cmNlIGZpbGUgJiBsaW5lIG9mIHRoZSAiZWxzZSIuICAqLworICBzdHJ1Y3QgZmlsZV9saW5lIGVsc2VfZmlsZV9saW5lOworICAvKiBUaGUgcHJldmlvdXMgY29uZGl0aW9uYWwuICAqLworICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKnByZXZpb3VzX2NmcmFtZTsKKyAgLyogSGF2ZSB3ZSBzZWVuIGFuIGVsc2UgeWV0PyAgKi8KKyAgaW50IGVsc2Vfc2VlbjsKKyAgLyogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIGlucHV0LiAgKi8KKyAgaW50IGlnbm9yaW5nOworICAvKiBXaGV0aGVyIGEgY29uZGl0aW9uYWwgYXQgYSBoaWdoZXIgbGV2ZWwgaXMgaWdub3JpbmcgaW5wdXQuICAqLworICBpbnQgZGVhZF90cmVlOworICAvKiBNYWNybyBuZXN0aW5nIGxldmVsIGF0IHdoaWNoIHRoaXMgY29uZGl0aW9uYWwgd2FzIGNyZWF0ZWQuICAqLworICBpbnQgbWFjcm9fbmVzdDsKK307CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfY2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY2ZyYW1lKSk7CitzdGF0aWMgY2hhciAqZ2V0X21yaV9zdHJpbmcgUEFSQU1TICgoaW50LCBpbnQgKikpOworCitzdGF0aWMgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpjdXJyZW50X2NmcmFtZSA9IE5VTEw7CisKK3ZvaWQgCitzX2lmZGVmIChhcmcpCisgICAgIGludCBhcmc7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltYm9sUDsJLyogUG9pbnRzIHRvIHN5bWJvbCAqLworICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgaWYgKCFpc19uYW1lX2JlZ2lubmVyICgqbmFtZSkpCisgICAgeworICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGlkZW50aWZpZXIgZm9yIFwiLmlmZGVmXCIiKSk7CisgICAgICBvYnN0YWNrXzFncm93ICgmY29uZF9vYnN0YWNrLCAwKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBjOworCisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgICAgIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKKyAgICAgIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISgoc3ltYm9sUCAhPSAwKSBeIGFyZyk7CisgICAgICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCisJCQlvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsCisJCQkJICAgICAgc2l6ZW9mIChjZnJhbWUpKSk7CisKKyAgICAgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQorCSAgJiYgY2ZyYW1lLmlnbm9yaW5nCisJICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCisJICAgICAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCisJbGlzdGluZ19saXN0ICgyKTsKKworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CQkJCS8qIGlmIGEgdmFsaWQgaWRlbnRpZnllciBuYW1lICovCit9CQkJCS8qIHNfaWZkZWYoKSAqLworCit2b2lkIAorc19pZiAoYXJnKQorICAgICBpbnQgYXJnOworeworICBleHByZXNzaW9uUyBvcGVyYW5kOworICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOworICBpbnQgdDsKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKiBMZWFkaW5nIHdoaXRlc3BhY2UgaXMgcGFydCBvZiBvcGVyYW5kLiAqLworCisgIGlmIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZykKKyAgICB7CisgICAgICBvcGVyYW5kLlhfYWRkX251bWJlciA9IDA7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXhwcmVzc2lvbiAoJm9wZXJhbmQpOworICAgICAgaWYgKG9wZXJhbmQuWF9vcCAhPSBPX2NvbnN0YW50KQorCWFzX2JhZCAoXygibm9uLWNvbnN0YW50IGV4cHJlc3Npb24gaW4gXCIuaWZcIiBzdGF0ZW1lbnQiKSk7CisgICAgfQorCisgIHN3aXRjaCAoKG9wZXJhdG9yVCkgYXJnKQorICAgIHsKKyAgICBjYXNlIE9fZXE6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA9PSAwOyBicmVhazsKKyAgICBjYXNlIE9fbmU6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciAhPSAwOyBicmVhazsKKyAgICBjYXNlIE9fbHQ6IHQgPSBvcGVyYW5kLlhfYWRkX251bWJlciA8IDA7IGJyZWFrOworICAgIGNhc2UgT19sZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyIDw9IDA7IGJyZWFrOworICAgIGNhc2UgT19nZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID49IDA7IGJyZWFrOworICAgIGNhc2UgT19ndDogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID4gMDsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBJZiB0aGUgYWJvdmUgZXJyb3IgaXMgc2lnbmFsZWQsIHRoaXMgd2lsbCBkaXNwYXRjaAorICAgICB1c2luZyBhbiB1bmRlZmluZWQgcmVzdWx0LiAgTm8gYmlnIGRlYWwuICAqLworICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7CisgIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISB0OworICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCisJCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOworCisgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQorICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCisgICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCisJICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKKyAgICBsaXN0aW5nX2xpc3QgKDIpOworCisgIGlmIChmbGFnX21yaSkKKyAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBzX2lmKCkgKi8KKworLyogR2V0IGEgc3RyaW5nIGZvciB0aGUgTVJJIElGQyBvciBJRk5DIHBzZXVkby1vcHMuICAqLworCitzdGF0aWMgY2hhciAqCitnZXRfbXJpX3N0cmluZyAodGVybWluYXRvciwgbGVuKQorICAgICBpbnQgdGVybWluYXRvcjsKKyAgICAgaW50ICpsZW47Cit7CisgIGNoYXIgKnJldDsKKyAgY2hhciAqczsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIHMgPSByZXQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCisgICAgeworICAgICAgKytzOworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJeworCSAgKnMrKyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIGlmIChzWy0xXSA9PSAnXCcnKQorCSAgICB7CisJICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJykKKwkJYnJlYWs7CisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgIH0KKwl9CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gdGVybWluYXRvcgorCSAgICAgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgd2hpbGUgKHMgPiByZXQgJiYgKHNbLTFdID09ICcgJyB8fCBzWy0xXSA9PSAnXHQnKSkKKwktLXM7CisgICAgfQorCisgICpsZW4gPSBzIC0gcmV0OworICByZXR1cm4gcmV0OworfQorCisvKiBUaGUgTVJJIElGQyBhbmQgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KKwordm9pZAorc19pZmMgKGFyZykKKyAgICAgaW50IGFyZzsKK3sKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisgIGNoYXIgKnMxLCAqczI7CisgIGludCBsZW4xLCBsZW4yOworICBpbnQgcmVzOworICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOworCisgIGlmIChmbGFnX21yaSkKKyAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7CisKKyAgczEgPSBnZXRfbXJpX3N0cmluZyAoJywnLCAmbGVuMSk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIGFzX2JhZCAoXygiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiKSk7CisgIGVsc2UKKyAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBzMiA9IGdldF9tcmlfc3RyaW5nICgnOycsICZsZW4yKTsKKworICByZXMgPSBsZW4xID09IGxlbjIgJiYgc3RybmNtcCAoczEsIHMyLCBsZW4xKSA9PSAwOworCisgIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKKyAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIChyZXMgXiBhcmcpOworICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCisJCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOworCisgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQorICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCisgICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCisJICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKKyAgICBsaXN0aW5nX2xpc3QgKDIpOworCisgIGlmIChmbGFnX21yaSkKKyAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkIAorc19lbmRpZiAoYXJnKQorICAgICBpbnQgYXJnOworeworICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmhvbGQ7CisKKyAgaWYgKGN1cnJlbnRfY2ZyYW1lID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJcIi5lbmRpZlwiIHdpdGhvdXQgXCIuaWZcIiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKKwkgICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZworCSAgJiYgKGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAorCSAgICAgIHx8ICEgY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQorCWxpc3RpbmdfbGlzdCAoMSk7CisKKyAgICAgIGhvbGQgPSBjdXJyZW50X2NmcmFtZTsKKyAgICAgIGN1cnJlbnRfY2ZyYW1lID0gY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZTsKKyAgICAgIG9ic3RhY2tfZnJlZSAoJmNvbmRfb2JzdGFjaywgaG9sZCk7CisgICAgfQkJCQkvKiBpZiBvbmUgcG9wIHRvbyBtYW55ICovCisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30JCQkJLyogc19lbmRpZigpICovCisKK3ZvaWQgCitzX2Vsc2UgKGFyZykKKyAgICAgaW50IGFyZzsKK3sKKyAgaWYgKGN1cnJlbnRfY2ZyYW1lID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiKSk7CisKKyAgICB9CisgIGVsc2UgaWYgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4pCisgICAgeworICAgICAgYXNfYmFkIChfKCJkdXBsaWNhdGUgXCJlbHNlXCIgLSBpZ25vcmVkIikpOworICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKKwkJICAgIGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5saW5lLAorCQkgICAgXygiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJlbHNlXCIiKSk7CisgICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKKwkJICAgIGN1cnJlbnRfY2ZyYW1lLT5pZl9maWxlX2xpbmUubGluZSwKKwkJICAgIF8oImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiaWZcIiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc193aGVyZSAoJmN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAorCQkmY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUpOworCisgICAgICBpZiAoIWN1cnJlbnRfY2ZyYW1lLT5kZWFkX3RyZWUpCisJeworCSAgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nID0gIWN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZzsKKwkgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKSkKKwkgICAgeworCSAgICAgIGlmICghIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZykKKwkJbGlzdGluZ19saXN0ICgxKTsKKwkgICAgICBlbHNlCisJCWxpc3RpbmdfbGlzdCAoMik7CisJICAgIH0KKwl9CQkJLyogaWYgbm90IGEgZGVhZCB0cmVlICovCisKKyAgICAgIGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4gPSAxOworICAgIH0JCQkJLyogaWYgZXJyb3IgZWxzZSBkbyBpdCAqLworCisgIGlmIChmbGFnX21yaSkKKyAgICB7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CQkJCS8qIHNfZWxzZSgpICovCisKK3ZvaWQgCitzX2lmZXFzIChhcmcpCisgICAgIGludCBhcmc7Cit7CisgIGNoYXIgKnMxLCAqczI7CisgIGludCBsZW4xLCBsZW4yOworICBpbnQgcmVzOworICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgY2ZyYW1lOworCisgIHMxID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4xKTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIi5pZmVxcyBzeW50YXggZXJyb3IiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBzMiA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuMik7CisKKyAgcmVzID0gbGVuMSA9PSBsZW4yICYmIHN0cm5jbXAgKHMxLCBzMiwgbGVuMSkgPT0gMDsKKworICBpbml0aWFsaXplX2NmcmFtZSAoJmNmcmFtZSk7CisgIGNmcmFtZS5pZ25vcmluZyA9IGNmcmFtZS5kZWFkX3RyZWUgfHwgISAocmVzIF4gYXJnKTsKKyAgY3VycmVudF9jZnJhbWUgPSAoKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqKQorCQkgICAgb2JzdGFja19jb3B5ICgmY29uZF9vYnN0YWNrLCAmY2ZyYW1lLCBzaXplb2YgKGNmcmFtZSkpKTsKKworICBpZiAoTElTVElOR19TS0lQX0NPTkQgKCkKKyAgICAgICYmIGNmcmFtZS5pZ25vcmluZworICAgICAgJiYgKGNmcmFtZS5wcmV2aW91c19jZnJhbWUgPT0gTlVMTAorCSAgfHwgISBjZnJhbWUucHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCisgICAgbGlzdGluZ19saXN0ICgyKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBzX2lmZXFzKCkgKi8KKworaW50IAoraWdub3JlX2lucHV0ICgpCit7CisgIGNoYXIgKnM7CisKKyAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICBpZiAoZmxhZ19tNjhrX21yaQorI2lmZGVmIE5PX1BTRVVET19ET1QKKyAgICAgIHx8IDEKKyNlbmRpZgorICAgICAgKQorICAgIHsKKyAgICAgIGlmIChzWy0xXSAhPSAnLicpCisJLS1zOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChzWy0xXSAhPSAnLicpCisJcmV0dXJuIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMKSAmJiAoY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKTsKKyAgICB9CisKKyAgLyogV2UgY2Fubm90IGlnbm9yZSBjZXJ0YWluIHBzZXVkbyBvcHMuICAqLworICBpZiAoKChzWzBdID09ICdpJworCXx8IHNbMF0gPT0gJ0knKQorICAgICAgICYmICghc3RybmNhc2VjbXAgKHMsICJpZiIsIDIpCisJICAgfHwgIXN0cm5jYXNlY21wIChzLCAiaWZkZWYiLCA1KQorCSAgIHx8ICFzdHJuY2FzZWNtcCAocywgImlmbmRlZiIsIDYpKSkKKyAgICAgIHx8ICgoc1swXSA9PSAnZScKKwkgICB8fCBzWzBdID09ICdFJykKKwkgICYmICghc3RybmNhc2VjbXAgKHMsICJlbHNlIiwgNCkKKwkgICAgICB8fCAhc3RybmNhc2VjbXAgKHMsICJlbmRpZiIsIDUpCisJICAgICAgfHwgIXN0cm5jYXNlY21wIChzLCAiZW5kYyIsIDQpKSkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMKSAmJiAoY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKTsKK30JCQkJLyogaWdub3JlX2lucHV0KCkgKi8KKworc3RhdGljIHZvaWQgCitpbml0aWFsaXplX2NmcmFtZSAoY2ZyYW1lKQorICAgICBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmNmcmFtZTsKK3sKKyAgbWVtc2V0IChjZnJhbWUsIDAsIHNpemVvZiAoKmNmcmFtZSkpOworICBhc193aGVyZSAoJmNmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCisJICAgICZjZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lKTsKKyAgY2ZyYW1lLT5wcmV2aW91c19jZnJhbWUgPSBjdXJyZW50X2NmcmFtZTsKKyAgY2ZyYW1lLT5kZWFkX3RyZWUgPSBjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5pZ25vcmluZzsKKyAgY2ZyYW1lLT5tYWNyb19uZXN0ID0gbWFjcm9fbmVzdDsKK30KKworLyogR2l2ZSBhbiBlcnJvciBpZiBhIGNvbmRpdGlvbmFsIGlzIHVudGVybWluYXRlZCBpbnNpZGUgYSBtYWNybyBvcgorICAgdGhlIGFzc2VtYmx5IGFzIGEgd2hvbGUuICBJZiBORVNUIGlzIG5vbiBuZWdhdGl2ZSwgd2UgYXJlIGJlaW5nCisgICBjYWxsZWQgYmVjYXVzZSBvZiB0aGUgZW5kIG9mIGEgbWFjcm8gZXhwYW5zaW9uLiAgSWYgTkVTVCBpcworICAgbmVnYXRpdmUsIHdlIGFyZSBiZWluZyBjYWxsZWQgYXQgdGhlIG9mIHRoZSBpbnB1dCBmaWxlcy4gICovCisKK3ZvaWQKK2NvbmRfZmluaXNoX2NoZWNrIChuZXN0KQorICAgICBpbnQgbmVzdDsKK3sKKyAgaWYgKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPm1hY3JvX25lc3QgPj0gbmVzdCkKKyAgICB7CisgICAgICBpZiAobmVzdCA+PSAwKQorCWFzX2JhZCAoXygiZW5kIG9mIG1hY3JvIGluc2lkZSBjb25kaXRpb25hbCIpKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIpKTsKKyAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAorCQkgICAgY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lLAorCQkgICAgXygiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIpKTsKKyAgICAgIGlmIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9zZWVuKQorCWFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCisJCSAgICAgIGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5saW5lLAorCQkgICAgICBfKCJoZXJlIGlzIHRoZSBcImVsc2VcIiBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIikpOworICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBleGl0IG91dCBvZiBhIG1hY3JvLiAgV2UgYXNzdW1lCisgICB0aGF0IGFueSBjb25kaXRpb25hbHMgd2hpY2ggYmVnYW4gd2l0aGluIHRoZSBtYWNybyBhcmUgY29ycmVjdGx5CisgICBuZXN0ZWQsIGFuZCBqdXN0IHBvcCB0aGVtIG9mZiB0aGUgc3RhY2suICAqLworCit2b2lkCitjb25kX2V4aXRfbWFjcm8gKG5lc3QpCisgICAgIGludCBuZXN0OworeworICB3aGlsZSAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+bWFjcm9fbmVzdCA+PSBuZXN0KQorICAgIHsKKyAgICAgIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqaG9sZDsKKworICAgICAgaG9sZCA9IGN1cnJlbnRfY2ZyYW1lOworICAgICAgY3VycmVudF9jZnJhbWUgPSBjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lOworICAgICAgb2JzdGFja19mcmVlICgmY29uZF9vYnN0YWNrLCBob2xkKTsKKyAgICB9Cit9CisKKy8qIGVuZCBvZiBjb25kLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWctZ2FzLmNvbSBiL2dhcy9jb25maWctZ2FzLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjUyNDhhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy1nYXMuY29tCkBAIC0wLDAgKzEsMTg2IEBACiskIWNvbmZpZy1nYXMuY29tCiskISBUaGlzIGZpbGUgc2V0cyB0aGluZ3MgdXAgdG8gYnVpbGQgZ2FzIG9uIGEgVk1TIHN5c3RlbSB0byBnZW5lcmF0ZSBvYmplY3QKKyQhIGZpbGVzIGZvciBhIFZNUyBzeXN0ZW0uICBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZQorJCEgZG8gbm90IGhhdmUgL2Jpbi9zaCB0byBleGVjdXRlIGl0LgorJCEKKyQhCiskIGdhc19ob3N0PSJ2bXMiCiskIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKKyQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCiskIGlmIGFyY2guZXFzLiJWQVgiCiskIHRoZW4KKyQgIGNwdV90eXBlPSJ2YXgiCiskICBvYmpfZm9ybWF0PSJ2bXMiCiskICBhdG9mPSJ2YXgiCiskIGVsc2UKKyQgIGNwdV90eXBlPSJhbHBoYSIKKyQgIG9ial9mb3JtYXQ9ImV2YXgiCiskICBhdG9mPSJpZWVlIgorJCBlbmRpZgorJCBlbXVsYXRpb249ImdlbmVyaWMiCiskIQorJAlERUxFVEUJPSAiZGVsZXRlL25vQ29uZmlybSIKKyQJRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgorJCEKKyQhIFRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbgorJCBjYWxsIG1ha2UgInRhcmctY3B1LmgiICJbLmNvbmZpZ110Yy0nJ2NwdV90eXBlJy5oIgorJCBjYWxsIG1ha2UgInRhcmctZW52LmgiICJbLmNvbmZpZ110ZS0nJ2VtdWxhdGlvbicuaCIKKyQhCiskISBDb2RlIHRvIGhhbmRsZSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgorJCBjYWxsIG1ha2UgIm9iai1mb3JtYXQuaCIgIlsuY29uZmlnXW9iai0nJ29ial9mb3JtYXQnLmgiCiskIQorJCEgKG5vdCBjdXJyZW50bHkgdXNlZCBmb3IgdmF4IG9yIGFscGhhKQorJCBjYWxsIG1ha2UgIml0YmwtY3B1LmgiICJbLmNvbmZpZ11pdGJsLScnY3B1X3R5cGUnLmgiCiskIQorJCEKKyQhIENyZWF0ZSB0aGUgZmlsZSB2ZXJzaW9uLm9wdCwgd2hpY2ggaGVscHMgaWRlbnRpZnkgdGhlIGV4ZWN1dGFibGUuCiskIQorJGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCiskc2VhcmNoIENPTkZJR1VSRS5JTiAiQU1fSU5JVF9BVVRPTUFLRSIvRXhhY3QvT3V0cHV0PWNvbmZpZy1nYXMtdG1wLnRtcAorJG9wZW4gaWZpbGUkIGNvbmZpZy1nYXMtdG1wLnRtcAorJHJlYWQgaWZpbGUkIGxpbmUKKyRjbG9zZSBpZmlsZSQKKyRERUxFVEUgY29uZmlnLWdhcy10bXAudG1wOyoKKyQhIERpc2NhcmQgIkFNX0lOSVRfQVVUT01BS0UoZ2FzLCAiIGFuZCAiKSIgcGFydHMuCiskaWprPWYkbG9jYXRlKCIsIixsaW5lKSsyCiskbGluZT1mJGV4dHJhY3QoaWprLGYkbGVuZ3RoKGxpbmUpLWlqayxsaW5lKQorJGlqaz1mJGxvY2F0ZSgiKSIsbGluZSkKKyRsaW5lPWYkZXh0cmFjdCgwLGlqayxsaW5lKQorJCEKKyQgaWYgZiRzZWFyY2goInZlcnNpb24ub3B0IikubmVzLiIiIHRoZW4gREVMRVRFIHZlcnNpb24ub3B0OyoKKyRjb3B5IF9OTDogdmVyc2lvbi5vcHQKKyRvcGVuL0FwcGVuZCBpZmlsZSQgdmVyc2lvbi5vcHQKKyR3cml0ZSBpZmlsZSQgImlkZW50aWZpY2F0aW9uPSIrIiIiIitsaW5lKyIiIiIKKyRjbG9zZSBpZmlsZSQKKyQhCiskISBOb3cgd3JpdGUgY29uZmlnLmguCiskIQorJCBpZiBmJHNlYXJjaCgiY29uZmlnLmgiKS5uZXMuIiIgdGhlbiBERUxFVEUgY29uZmlnLmg7KgorJGNvcHkgX05MOiBjb25maWcuaAorJG9wZW4vQXBwZW5kIGlmaWxlJCBjb25maWcuaAorJHdyaXRlIGlmaWxlJCAiLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLWdhcy5jb20uICovCiskd3JpdGUgaWZpbGUkICIjaWZuZGVmIFZFUlNJT04iCiskd3JpdGUgaWZpbGUkICIjZGVmaW5lIFZFUlNJT04gICAgICAiIiIsbGluZSwiIiIiCiskd3JpdGUgaWZpbGUkICIjZW5kaWYiCiskd3JpdGUgaWZpbGUkICIvKi0tKi8iCiskaWYgYXJjaCAuZXFzLiAiVkFYIgorJHRoZW4KKyRhcHBlbmQgWy5jb25maWdddm1zLWNvbmYuaCBpZmlsZSQ6CiskZWxzZQorJCBhcHBlbmQgWy5jb25maWdddm1zLWEtY29uZi5oIGlmaWxlJDoKKyRlbmRpZgorJGNsb3NlIGlmaWxlJAorJEVDSE8gIkNyZWF0ZWQgY29uZmlnLmguIgorJCEKKyQhIENoZWNrIGZvciwgYW5kIHBvc3NpYmx5IG1ha2UsIGhlYWRlciBmaWxlIDx1bmlzdGQuaD4uCiskIQorJCBpZiBmJHNlYXJjaCgidG1wLWNoay1oLioiKS5uZXMuIiIgdGhlbiAgREVMRVRFIHRtcC1jaGstaC4qOyoKKyQhY2FuJ3QgdXNlIHNpbXBsZSBgI2luY2x1ZGUgSERSJyB3aXRoIGBnY2MgL0RlZmluZT0iSERSPTxmb28uaD4iJworJCFiZWNhdXNlIHRoZSAyLjYuWzAtM10gcHJlcHJvY2Vzc29yIGhhbmRsZXMgaXQgd3JvbmcgKFZNUy1zcGVjaWZpYyBnY2MgYnVnKQorJCBjcmVhdGUgdG1wLWNoay1oLmMKK2ludCB0bXBfY2hrX2g7CS8qIGd1YXJhbnRlZSBub24tZW1wdHkgb3V0cHV0ICovCisjaWZkZWYgSEFWRV9TVERJT19ICisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JWElPX0gKKyNpbmNsdWRlIDx1bml4aW8uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JWExJQl9ICisjaW5jbHVkZSA8dW5peGxpYi5oPgorI2VuZGlmCiskIG9uIHdhcm5pbmcgdGhlbiAgY29udGludWUKKyQgQ0hFQ0sgPSAiY2FsbCB0bXBfY2hrX2giCiskIENIRUNLICJIQVZFX1NURElPX0giCiskIGlmIC5ub3QuJHN0YXR1cworJCB0aGVuCXR5cGUgc3lzJGlucHV0OgorCis/IGNvdWxkIG5vdCBjb21waWxlIDxzdGRpby5oPi4KKworICBJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggREVDIEMgb3IgVkFYIEMsIGNyZWF0ZSBjb25maWcuc3RhdHVzIGFzIGFuCisgIGVtcHR5IGZpbGUgYW5kIHN0YXJ0IGdudSBtYWtlIGFnYWluLgorCisgIElmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBHTlUgQywgdGhlcmUgaXMgc29tZSBzZXR1cCBwcm9ibGVtIGFuZAorICBnYXMgY29uZmlndXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KKworJAlERUxFVEUgdG1wLWNoay1oLmM7KgorJAlleGl0ICV4MDAyQworJCBlbmRpZgorJCEKKyQgQ0hFQ0sgIkhBVkVfVU5JU1REX0giCiskIGlmIC5ub3QuJHN0YXR1cworJCB0aGVuCiskICBpZiBmJHRybmxubSgiSEZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGhmaWxlJAorJCAgQ0hFQ0sgIkhBVkVfVU5JWElPX0giCiskICBnb3RfdW5peGlvID0gKCRzdGF0dXMgLmFuZC4gMSkKKyQgIENIRUNLICJIQVZFX1VOSVhMSUJfSCIKKyQgIGdvdF91bml4bGliID0gKCRzdGF0dXMgLmFuZC4gMSkKKyQgIGNyZWF0ZSBbXXVuaXN0ZC5oCSF3aXRoIHJ1ZGltZW50YXJ5IGNvbnRlbnRzCisvKiA8dW5pc3RkLmg+IHN1YnN0aXR1dGUgZm9yIGJ1aWxkaW5nIGdhcyAqLworI2lmbmRlZiBVTklTVERfSAorI2RlZmluZSBVTklTVERfSAorCiskICBvcGVuL0FwcGVuZCBoZmlsZSQgW111bmlzdGQuaAorJCAgaWYgZ290X3VuaXhpbworJCAgdGhlbiAgd3JpdGUgaGZpbGUkICIjaW5jbHVkZSA8dW5peGlvLmg+IgorJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgorLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGlvLmg+ICovCitleHRlcm4gaW50IGNyZWF0KCksIG9wZW4oKSwgY2xvc2UoKSwgcmVhZCgpLCB3cml0ZSgpOworZXh0ZXJuIGludCBhY2Nlc3MoKSwgZHVwKCksIGR1cDIoKSwgZnN0YXQoKSwgc3RhdCgpOworZXh0ZXJuIGxvbmcgbHNlZWsoKTsKKyQgIGVuZGlmCiskICB3cml0ZSBoZmlsZSQgIiIKKyQgIGlmIGdvdF91bml4bGliCiskICB0aGVuICB3cml0ZSBoZmlsZSQgIiNpbmNsdWRlIDx1bml4bGliLmg+IgorJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgorLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGxpYi5oPiAqLworZXh0ZXJuIGNoYXIgKnNicmsoKSwgKmdldGN3ZCgpLCAqY3VzZXJpZCgpOworZXh0ZXJuIGludCBicmsoKSwgY2hkaXIoKSwgY2htb2QoKSwgY2hvd24oKSwgbWtkaXIoKTsKK2V4dGVybiB1bnNpZ25lZCBnZXR1aWQoKSwgdW1hc2soKTsKKyQgIGVuZGlmCiskICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6CisKKyNlbmRpZiAvKlVOSVNURF9IKi8KKyQgIGNsb3NlIGhmaWxlJAorJCAgRUNITyAiQ3JlYXRlZCAiIltddW5pc3RkLmgiIi4iCiskIGVuZGlmICFnY2MgJyNpbmNsdWRlIDx1bmlzdGQuaD4nIGZhaWxlZAorJCBERUxFVEUgdG1wLWNoay1oLmM7KgorJAorJHRtcF9jaGtfaDogc3Vicm91dGluZQorJCAgc2V0IG5vT24KKyQgIGhuYW1lID0gZiRlZGl0KCI8IiArIChwMSAtICJIQVZFXyIgLSAiX0giKSArICIuaD4iLCJMT1dFUkNBU0UiKQorJCAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnaG5hbWUnLiIKKyQgIGlmIGYkc2VhcmNoKCJ0bXAtY2hrLWgub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKKyQgIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCiskICBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KKyQgIGdjYyAvSW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pIC9EZWZpbmU9KCInJ3AxJyIpIHRtcC1jaGstaC5jCiskIWNhbid0IGp1c3QgY2hlY2sgJHN0YXR1czsgZ2NjIDIuNi5bMC0zXSBwcmVwcm9jZXNzb3IgZG9lc24ndCBzZXQgaXQgY29ycmVjdGx5CiskICBvayA9ICgoJHN0YXR1cy5hbmQuMSkuYW5kLihmJHNlYXJjaCgidG1wLWNoay1oLm9iaiIpLm5lcy4iIikpIC5vci4gJXgxMDAwMDAwMAorJCAgZGVhc3NpZ24gc3lzJGVycm9yCSFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKKyQgIGRlYXNzaWduIHN5cyRvdXRwdXQKKyQgIGlmIG9rIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKKyQgIGV4aXQgb2sKKyQgZW5kc3Vicm91dGluZSAhdG1wX2Noa19oCiskCiskIQorJCEgRG9uZQorJCEKKyQgaWYgZiRzZWFyY2goImNvbmZpZy5zdGF0dXMiKSAubmVzLiAiIiB0aGVuIERFTEVURSBjb25maWcuc3RhdHVzOyoKKyQgb3Blbi93cml0ZSBjZmlsZSBbXWNvbmZpZy5zdGF0dXMKKyQgd3JpdGUgY2ZpbGUgIkxpbmtzIGFyZSBub3cgc2V0IHVwIGZvciB1c2Ugd2l0aCBhICIrYXJjaCsiIHJ1bm5pbmcgVk1TLiIKKyQgY2xvc2UgY2ZpbGUKKyQgdHlwZSBbXWNvbmZpZy5zdGF0dXMKKyRleGl0CiskIQorJCEKKyRtYWtlOiBzdWJyb3V0aW5lCiskICBpZiBmJHNlYXJjaChwMSkubmVzLiIiIHRoZW4gREVMRVRFICdwMSc7KgorJCAgY3JlYXRlICdwMScKKyQgIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCiskICBvcGVuL0FwcGVuZCBpZmlsZSQgJ3AxJworJCAgd3JpdGUgaWZpbGUkICIjaW5jbHVkZSAiIicnZiRzdHJpbmcocDIgLSAiWy5jb25maWddIiknIiIiCiskICBjbG9zZSBpZmlsZSQKKyQgIEVDSE8gIkNyZWF0ZWQgJydwMScgZm9yICcncDInLiIKKyRlbmRzdWJyb3V0aW5lICFtYWtlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnLmluIGIvZ2FzL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYyYWRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy5pbgpAQCAtMCwwICsxLDI3MyBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLworI3VuZGVmIFlZVEVYVF9QT0lOVEVSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVtb3ZlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1JFTU9WRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0JSSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVU5MSU5LCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0VSUk5PX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX05MX1RZUEVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUREFSR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1ZBTFVFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFSQVJHU19ICisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI3VuZGVmIFZFUlNJT04KKworLyogRGVmaW5lIGlmIGRlZmF1bHRpbmcgdG8gRUxGIG9uIFNDTyA1LiAqLworI3VuZGVmIFNDT19FTEYKKworLyogVXNlIEVMRiBzdGFicyBmb3IgTUlQUywgbm90IEVDT0ZGIHN0YWJzICovCisjdW5kZWYgTUlQU19TVEFCU19FTEYKKworLyogRGVmaW5lIGlmIGRlZmF1bHQgdGFyZ2V0IGlzIFBvd2VyUEMgU29sYXJpcy4gKi8KKyN1bmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCisKKy8qIERlZmluZSBhcyAxIGlmIGJpZyBlbmRpYW4uICovCisjdW5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KKworLyogRGVmYXVsdCBhcmNoaXRlY3R1cmUuICovCisjdW5kZWYgREVGQVVMVF9BUkNICisKKy8qIFVzaW5nIGNnZW4gY29kZT8gKi8KKyN1bmRlZiBVU0lOR19DR0VOCisKKy8qIFVzaW5nIGkzODYgQ09GRj8gKi8KKyN1bmRlZiBJMzg2Q09GRgorCisvKiBVc2luZyBtNjhrIENPRkY/ICovCisjdW5kZWYgTTY4S0NPRkYKKworLyogVXNpbmcgbTg4ayBDT0ZGPyAqLworI3VuZGVmIE04OEtDT0ZGCisKKy8qIGEub3V0IHN1cHBvcnQ/ICovCisjdW5kZWYgT0JKX01BWUJFX0FPVVQKKworLyogYi5vdXQgc3VwcG9ydD8gKi8KKyN1bmRlZiBPQkpfTUFZQkVfQk9VVAorCisvKiBDT0ZGIHN1cHBvcnQ/ICovCisjdW5kZWYgT0JKX01BWUJFX0NPRkYKKworLyogRUNPRkYgc3VwcG9ydD8gKi8KKyN1bmRlZiBPQkpfTUFZQkVfRUNPRkYKKworLyogRUxGIHN1cHBvcnQ/ICovCisjdW5kZWYgT0JKX01BWUJFX0VMRgorCisvKiBnZW5lcmljIHN1cHBvcnQ/ICovCisjdW5kZWYgT0JKX01BWUJFX0dFTkVSSUMKKworLyogSFAzMDAgc3VwcG9ydD8gKi8KKyN1bmRlZiBPQkpfTUFZQkVfSFAzMDAKKworLyogSUVFRSBzdXBwb3J0PyAqLworI3VuZGVmIE9CSl9NQVlCRV9JRUVFCisKKy8qIFNPTSBzdXBwb3J0PyAqLworI3VuZGVmIE9CSl9NQVlCRV9TT00KKworLyogVk1TIHN1cHBvcnQ/ICovCisjdW5kZWYgT0JKX01BWUJFX1ZNUworCisvKiBVc2UgZW11bGF0aW9uIHN1cHBvcnQ/ICovCisjdW5kZWYgVVNFX0VNVUxBVElPTlMKKworLyogU3VwcG9ydGVkIGVtdWxhdGlvbnMuICovCisjdW5kZWYgRU1VTEFUSU9OUworCisvKiBEZWZhdWx0IGVtdWxhdGlvbi4gKi8KKyN1bmRlZiBERUZBVUxUX0VNVUxBVElPTgorCisvKiBvbGQgQ09GRiBzdXBwb3J0PyAqLworI3VuZGVmIE1BTllfU0VHTUVOVFMKKworLyogVXNlIEJGRCBpbnRlcmZhY2U/ICovCisjdW5kZWYgQkZEX0FTU0VNQkxFUgorCisvKiBUYXJnZXQgYWxpYXMuICovCisjdW5kZWYgVEFSR0VUX0FMSUFTCisKKy8qIENhbm9uaWNhbCB0YXJnZXQuICovCisjdW5kZWYgVEFSR0VUX0NBTk9OSUNBTAorCisvKiBUYXJnZXQgQ1BVLiAqLworI3VuZGVmIFRBUkdFVF9DUFUKKworLyogVGFyZ2V0IHZlbmRvci4gKi8KKyN1bmRlZiBUQVJHRVRfVkVORE9SCisKKy8qIFRhcmdldCBPUy4gKi8KKyN1bmRlZiBUQVJHRVRfT1MKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIENvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXI/ICovCisjdW5kZWYgQ1JPU1NfQ09NUElMRQorCisvKiBhc3NlcnQgYnJva2VuPyAqLworI3VuZGVmIEJST0tFTl9BU1NFUlQKKworLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgorCisvKiBEZWZpbmUgaWYgbWFsbG9jIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCisKKy8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorCisvKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKKworLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCisKKy8qIERlZmluZSBpZiBlcnJubyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCisKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYW91dF9nbnUuaCBiL2dhcy9jb25maWcvYW91dF9nbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRmOWNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9hb3V0X2dudS5oCkBAIC0wLDAgKzEsNDU1IEBACisvKiBUaGlzIGZpbGUgaXMgYW91dF9nbnUuaAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9fQV9PVVRfR05VX0hfXworI2RlZmluZSBfX0FfT1VUX0dOVV9IX18KKworLyogVGhlcmUgYXJlIHR3byBtYWluIGZsYXZvdXJzIG9mIGEub3V0LCBvbmUgd2hpY2ggdXNlcyB0aGUgc3RhbmRhcmQKKyAgIHJlbG9jYXRpb25zLCBhbmQgb25lIHdoaWNoIHVzZXMgZXh0ZW5kZWQgcmVsb2NhdGlvbnMuCisKKyAgIFRvZGF5LCB0aGUgZXh0ZW5kZWQgcmVsb2MgdXNlcyBhcmUKKyAgIFRDX1NQQVJDLCBUQ19BMjlLCisKKyAgIGVhY2ggbXVzdCBkZWZpbmUgdGhlIGVudW0gcmVsb2NfdHlwZQorCisqLworCisjZGVmaW5lIFVTRV9FWFRFTkRFRF9SRUxPQyAoZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKSkKKworI2lmIGRlZmluZWQoVENfU1BBUkMpIHx8IGRlZmluZWQoVENfQTI5SykKK2VudW0gcmVsb2NfdHlwZQorICB7CisgICAgUkVMT0NfOCwgUkVMT0NfMTYsIFJFTE9DXzMyLC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLworICAgIFJFTE9DX0RJU1A4LCBSRUxPQ19ESVNQMTYsIFJFTE9DX0RJU1AzMiwJLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLworICAgIFJFTE9DX1dESVNQMzAsIFJFTE9DX1dESVNQMjIsCisgICAgUkVMT0NfSEkyMiwgUkVMT0NfMjIsCisgICAgUkVMT0NfMTMsIFJFTE9DX0xPMTAsCisgICAgUkVMT0NfU0ZBX0JBU0UsIFJFTE9DX1NGQV9PRkYxMywKKyAgICBSRUxPQ19CQVNFMTAsIFJFTE9DX0JBU0UxMywgUkVMT0NfQkFTRTIyLAkvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCisgICAgUkVMT0NfUEMxMCwgUkVMT0NfUEMyMiwJLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLworICAgIFJFTE9DX0pNUF9UQkwsCQkvKiBQLkkuQy4ganVtcCB0YWJsZSAqLworICAgIFJFTE9DX1NFR09GRjE2LAkJLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KKyAgICBSRUxPQ19HTE9CX0RBVCwgUkVMT0NfSk1QX1NMT1QsIFJFTE9DX1JFTEFUSVZFLAorICAgIFJFTE9DXzEwLCBSRUxPQ18xMSwKKyAgICBSRUxPQ19XRElTUDJfMTQsCisgICAgUkVMT0NfV0RJU1AxOSwKKyAgICBSRUxPQ19ISEkyMiwKKyAgICBSRUxPQ19ITE8xMCwKKworICAgIC8qIDI5SyByZWxvY2F0aW9uIHR5cGVzICovCisgICAgUkVMT0NfSlVNUFRBUkcsIFJFTE9DX0NPTlNULCBSRUxPQ19DT05TVEgsCisKKyAgICBSRUxPQ19XRElTUDE0LCBSRUxPQ19XRElTUDIxLAorCisgICAgTk9fUkVMT0MKKyAgfTsKKworI2VuZGlmIC8qIFRDX1NQQVJDIG9yIFRDX0EyOUsgKi8KKworCisjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KKworI2lmbmRlZiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KKworLyogVGhpcyBpcyB0aGUgbGF5b3V0IG9uIGRpc2sgb2YgYSBVbml4IFY3LCBCZXJrZWxleSwgU3VuT1MsIFZheCBVbHRyaXgKKyAgICJzdHJ1Y3QgZXhlYyIuICBEb24ndCBhc3N1bWUgdGhhdCBvbiB0aGlzIG1hY2hpbmUsIHRoZSAic3RydWN0IGV4ZWMiCisgICB3aWxsIGxheSBvdXQgdGhlIHNhbWUgc2l6ZXMgb3IgYWxpZ25tZW50cy4gICovCisKK3N0cnVjdCBleGVjX2J5dGVzCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGFfaW5mb1s0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFfdGV4dFs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFfZGF0YVs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFfYnNzWzRdOworICAgIHVuc2lnbmVkIGNoYXIgYV9zeW1zWzRdOworICAgIHVuc2lnbmVkIGNoYXIgYV9lbnRyeVs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGFfdHJzaXplWzRdOworICAgIHVuc2lnbmVkIGNoYXIgYV9kcnNpemVbNF07CisgIH07CisKKy8qIEhvdyBiaWcgdGhlICJzdHJ1Y3QgZXhlYyIgaXMgb24gZGlzayAqLworI2RlZmluZQlFWEVDX0JZVEVTX1NJWkUJKDggKiA0KQorCisvKiBUaGlzIGlzIHRoZSBsYXlvdXQgaW4gbWVtb3J5IG9mIGEgInN0cnVjdCBleGVjIiB3aGlsZSB3ZSBwcm9jZXNzIGl0LiAgKi8KKworc3RydWN0IGV4ZWMKK3sKKyAgdW5zaWduZWQgbG9uZyBhX2luZm87CQkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCisgIHVuc2lnbmVkIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLworICB1bnNpZ25lZCBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLworICB1bnNpZ25lZCBhX2VudHJ5OwkJLyogc3RhcnQgYWRkcmVzcyAqLworICB1bnNpZ25lZCBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGFfZHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KK307CisKKyNlbmRpZiAvKiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18gKi8KKworLyogdGhlc2UgZ28gaW4gdGhlIE5fTUFDSFRZUEUgZmllbGQgKi8KKy8qIFRoZXNlIHN5bWJvbHMgY291bGQgYmUgZGVmaW5lZCBieSBjb2RlIGZyb20gU3Vucy4uLnB1bnQgJ2VtICovCisjdW5kZWYgTV9VTktOT1dOCisjdW5kZWYgTV82ODAxMAorI3VuZGVmIE1fNjgwMjAKKyN1bmRlZiBNX1NQQVJDCitlbnVtIG1hY2hpbmVfdHlwZQorICB7CisgICAgTV9VTktOT1dOID0gMCwKKyAgICBNXzY4MDEwID0gMSwKKyAgICBNXzY4MDIwID0gMiwKKyAgICBNX1NQQVJDID0gMywKKyAgICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bidzIG51bWJlcnMgKi8KKyAgICBNXzM4NiA9IDEwMCwKKyAgICBNXzI5SyA9IDEwMSwKKyAgICBNX1JTNjAwMCA9IDEwMiwJCS8qIElCTSBSUy82MDAwICovCisgICAgLyogSFAvQlNEIGZvcm1hdHMgKi8KKyAgICBNX0hQMjAwID0gMjAwLAkJLyogaHAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCisgICAgTV9IUDMwMCA9IDMwMCwJCS8qIGhwMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLworICAgIE1fSFBVWDIzID0gMHgwMjBDCQkvKiBocDIwMC8zMDAgSFBVWCBiaW5hcnkgKi8KKyAgfTsKKworI2RlZmluZSBOX01BR0lDKGV4ZWMpICgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQorI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQorI2RlZmluZSBOX0ZMQUdTKGV4ZWMpICgoKGV4ZWMpLmFfaW5mbyA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAorICAgICgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKKyAgICAgfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKKyAgICAgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisjZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSBcCisgICAgKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCisKKyNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKKyAgICAoKGV4ZWMpLmFfaW5mbyA9IFwKKyAgICAgKChleGVjKS5hX2luZm8mMHhmZjAwZmZmZikgfCAoKCgoaW50KShtYWNodHlwZSkpJjB4ZmYpIDw8IDE2KSkKKworI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAorICAgICgoZXhlYykuYV9pbmZvID0gXAorICAgICAoKGV4ZWMpLmFfaW5mbyYweDAwZmZmZmZmKSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKKworLyogQ29kZSBpbmRpY2F0aW5nIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNpZm5kZWYgT01BR0lDCisjZGVmaW5lIE9NQUdJQyAwNDA3CisjZW5kaWYKKy8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLworI2RlZmluZSBOTUFHSUMgMDQxMAorLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgWk1BR0lDIDA0MTMKKworLyogVmlydHVhbCBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBmcm9tIHRoZSBhLm91dCBmaWxlLiAgRm9yIE9NQUdJQywKKyAgIChhbG1vc3QgYWx3YXlzICJ1bmxpbmtlZCAubydzIiB0aGVzZSBkYXlzKSwgc2hvdWxkIGJlIHplcm8uCisgICBGb3IgbGlua2VkIGZpbGVzLCBzaG91bGQgcmVmbGVjdCByZWFsaXR5IGlmIHdlIGtub3cgaXQuICAqLworCisjaWZuZGVmIE5fVFhUQUREUgorI2RlZmluZSBOX1RYVEFERFIoeCkJKE5fTUFHSUMoeCk9PU9NQUdJQz8gMCA6IFRFWFRfU1RBUlRfQUREUikKKyNlbmRpZgorCisjaWZuZGVmIE5fQkFETUFHCisjZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCisJCQkgICAmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAorCQkJICAgJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMpCisjZW5kaWYKKworLyogQnkgZGVmYXVsdCwgc2VnbWVudCBzaXplIGlzIGNvbnN0YW50LiAgQnV0IG9uIHNvbWUgbWFjaGluZXMsIGl0IGNhbgorICAgYmUgYSBmdW5jdGlvbiBvZiB0aGUgYS5vdXQgaGVhZGVyIChlLmcuIG1hY2hpbmUgdHlwZSkuICAqLworI2lmbmRlZglOX1NFR1NJWkUKKyNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQorI2VuZGlmCisKKy8qIFRoaXMgY29tcGxleGl0eSBpcyBmb3IgZW5jYXBzdWxhdGVkIENPRkYgc3VwcG9ydCAqLworI2lmbmRlZiBfTl9IRFJPRkYKKyNkZWZpbmUgX05fSERST0ZGKHgpCShOX1NFR1NJWkUoeCkgLSBzaXplb2YgKHN0cnVjdCBleGVjKSkKKyNlbmRpZgorCisjaWZuZGVmIE5fVFhUT0ZGCisjZGVmaW5lIE5fVFhUT0ZGKHgpCShOX01BR0lDKHgpID09IFpNQUdJQyA/CVwKKwkJCSBfTl9IRFJPRkYoKHgpKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDoJXAorCQkJIHNpemVvZiAoc3RydWN0IGV4ZWMpKQorI2VuZGlmCisKKworI2lmbmRlZiBOX0RBVE9GRgorI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCisjZW5kaWYKKworI2lmbmRlZiBOX1RSRUxPRkYKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKKyNlbmRpZgorCisjaWZuZGVmIE5fRFJFTE9GRgorI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQorI2VuZGlmCisKKyNpZm5kZWYgTl9TWU1PRkYKKyNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQorI2VuZGlmCisKKyNpZm5kZWYgTl9TVFJPRkYKKyNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQorI2VuZGlmCisKKy8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLworI2lmbmRlZiBOX1RYVEFERFIKKyNkZWZpbmUJTl9UWFRBRERSKHgpCTAKKyNlbmRpZgorCisjaWZuZGVmIE5fREFUQUREUgorI2RlZmluZSBOX0RBVEFERFIoeCkgXAorICAgIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkgXAorICAgICA6ICAoTl9TRUdTSVpFKHgpICsgKChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dC0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCisjZW5kaWYKKworLyogQWRkcmVzcyBvZiBic3Mgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNkZWZpbmUgTl9CU1NBRERSKHgpIChOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQorDAorc3RydWN0IG5saXN0CisgIHsKKyAgICB1bmlvbgorICAgICAgeworCWNoYXIgKm5fbmFtZTsKKwlzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKKwlsb25nIG5fc3RyeDsKKyAgICAgIH0KKyAgICBuX3VuOworICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOworICAgIGNoYXIgbl9vdGhlcjsKKyAgICBzaG9ydCBuX2Rlc2M7CisgICAgdW5zaWduZWQgbG9uZyBuX3ZhbHVlOworICB9OworCisjZGVmaW5lIE5fVU5ERiAwCisjZGVmaW5lIE5fQUJTIDIKKyNkZWZpbmUgTl9URVhUIDQKKyNkZWZpbmUgTl9EQVRBIDYKKyNkZWZpbmUgTl9CU1MgOAorI2RlZmluZQlOX0NPTU0JMHgxMgkJLyogY29tbW9uICh2aXNpYmxlIGluIHNoYXJlZCBsaWIgY29tbW9ucykgKi8KKyNkZWZpbmUgTl9GTiAweDFGCQkvKiBGaWxlIG5hbWUgb2YgYSAubyBmaWxlICovCisKKy8qIE5vdGU6IE5fRVhUIGNhbiBvbmx5IHVzZWZ1bGx5IGJlIE9SLWVkIHdpdGggTl9VTkRGLCBOX0FCUywgTl9URVhULAorICAgTl9EQVRBLCBvciBOX0JTUy4gIFdoZW4gdGhlIGxvdy1vcmRlciBiaXQgb2Ygb3RoZXIgdHlwZXMgaXMgc2V0LAorICAgKGUuZy4gTl9XQVJOSU5HIHZlcnN1cyBOX0ZOKSwgdGhleSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcy4gICovCisjZGVmaW5lIE5fRVhUIDEKKyNkZWZpbmUgTl9UWVBFIDAzNgorI2RlZmluZSBOX1NUQUIgMDM0MAorCisvKiBUaGUgZm9sbG93aW5nIHR5cGUgaW5kaWNhdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sIGFzIGJlaW5nCisgICBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGUgb3RoZXIgc3ltYm9sCisgICBhcHBlYXJzIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UsIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN5bWJvbC4KKworICAgSW5kaXJlY3Rpb24gaXMgYXN5bW1ldHJpY2FsLiAgVGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIHdpbGwgYmUgdXNlZAorICAgdG8gc2F0aXNmeSByZXF1ZXN0cyBmb3IgdGhlIGluZGlyZWN0IHN5bWJvbCwgYnV0IG5vdCB2aWNlIHZlcnNhLgorICAgSWYgdGhlIG90aGVyIHN5bWJvbCBkb2VzIG5vdCBoYXZlIGEgZGVmaW5pdGlvbiwgbGlicmFyaWVzIHdpbGwKKyAgIGJlIHNlYXJjaGVkIHRvIGZpbmQgYSBkZWZpbml0aW9uLiAgKi8KKworI2RlZmluZSBOX0lORFIgMHhhCisKKy8qIFRoZSBmb2xsb3dpbmcgc3ltYm9scyByZWZlciB0byBzZXQgZWxlbWVudHMuCisgICBBbGwgdGhlIE5fU0VUW0FUREJdIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcm0gb25lIHNldC4KKyAgIFNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNldCBpbiB0aGUgdGV4dCBzZWN0aW9uLCBhbmQgZWFjaCBzZXQKKyAgIGVsZW1lbnQncyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCisgICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgorCisgICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCisgICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCisgICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAorICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCisKKy8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KKyNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCisKKy8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLworI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCisKKy8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCisgICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKKyAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCisKKyNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKKworLyogV2VhayBzeW1ib2xzLiAgVGhlc2UgYXJlIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgYS5vdXQgZm9ybWF0LiAgVGhlCisgICBzZW1hbnRpY3MgYXJlIHRob3NlIG9mIEVMRiB3ZWFrIHN5bWJvbHMuICBXZWFrIHN5bWJvbHMgYXJlIGFsd2F5cworICAgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhlIE5fV0VBSz8gdmFsdWVzIGFyZSBzcXVlZXplZCBpbnRvIHRoZQorICAgYXZhaWxhYmxlIHNsb3RzLiAgVGhlIHZhbHVlIG9mIGEgTl9XRUFLVSBzeW1ib2wgaXMgMC4gIFRoZSB2YWx1ZXMKKyAgIG9mIHRoZSBvdGhlciB0eXBlcyBhcmUgdGhlIGRlZmluaXRpb25zLiAgKi8KKyNkZWZpbmUgTl9XRUFLVQkweDBkCQkvKiBXZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLworI2RlZmluZSBOX1dFQUtBIDB4MGUJCS8qIFdlYWsgYWJzb2x1dGUgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9XRUFLVCAweDBmCQkvKiBXZWFrIHRleHQgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9XRUFLRCAweDEwCQkvKiBXZWFrIGRhdGEgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9XRUFLQiAweDExCQkvKiBXZWFrIGJzcyBzeW1ib2wuICAqLworDAorLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgorICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCisgICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KKyAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KKworLyogVGhlIGZvbGxvd2luZyBlbnVtIGFuZCBzdHJ1Y3Qgd2VyZSBib3Jyb3dlZCBmcm9tIFN1bk9TJ3MKKyAgIC91c3IvaW5jbHVkZS9zdW40L2Eub3V0LmggIGFuZCBleHRlbmRlZCB0byBoYW5kbGUKKyAgIG90aGVyIG1hY2hpbmVzLiAgSXQgaXMgY3VycmVudGx5IHVzZWQgb24gU1BBUkMgYW5kIEFNRCAyOTAwMC4KKworICAgcmVsb2NfZXh0X2J5dGVzIGlzIGhvdyBpdCBsb29rcyBvbiBkaXNrLiAgcmVsb2NfaW5mb19leHRlbmRlZCBpcworICAgaG93IHdlIG1pZ2h0IHByb2Nlc3MgaXQgb24gYSBuYXRpdmUgaG9zdC4gICovCisjaWYgVVNFX0VYVEVOREVEX1JFTE9DCisKK3N0cnVjdCByZWxvY19leHRfYnl0ZXMKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRyZXNzWzRdOworICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFszXTsKKyAgICB1bnNpZ25lZCBjaGFyIHJfYml0c1sxXTsKKyAgICB1bnNpZ25lZCBjaGFyIHJfYWRkZW5kWzRdOworICB9OworCisKKyNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwkweDgwCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwMQorCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkweDFGCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHCTAKKyNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUJMHhGOAorI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCisKKyNkZWZpbmUJUkVMT0NfRVhUX1NJWkUJMTIJLyogQnl0ZXMgcGVyIHJlbG9jYXRpb24gZW50cnkgKi8KKworc3RydWN0IHJlbG9jX2luZm9fZXh0ZW5kZWQKK3sKKyAgdW5zaWduZWQgbG9uZyByX2FkZHJlc3M7CisgIHVuc2lnbmVkIGludCByX2luZGV4OjI0OworIyBkZWZpbmUJcl9zeW1ib2xudW0gIHJfaW5kZXgKKyAgdW5zaWduZWQgcl9leHRlcm46MTsKKyAgdW5zaWduZWQ6MjsKKyAgLyogIFJTLzYwMDAgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBlbnVtIGJpdGZpZWxkCisJICAgIGVudW0gcmVsb2NfdHlwZSByX3R5cGU6NTsgKi8KKyAgZW51bSByZWxvY190eXBlIHJfdHlwZTsKKyAgbG9uZyBpbnQgcl9hZGRlbmQ7Cit9OworCisjZWxzZQorCisvKiBUaGUgc3RhbmRhcmQsIG9sZC1mYXNoaW9uZWQsIEJlcmtlbGV5IGNvbXBhdGlibGUgcmVsb2NhdGlvbiBzdHJ1Y3QgKi8KKworCisKKyNpZmRlZiBUQ19JODYwCisvKiBOT1RFOiB0aHJlZSBiaXRzIG1heCwgc2VlIHN0cnVjdCByZWxvY19pbmZvX2k4NjAucl90eXBlICovCitlbnVtIGk4NjBfcmVsb2NfdHlwZQorICB7CisgICAgTk9fUkVMT0MgPSAwLCBCUkFERFIsIExPVzAsIExPVzEsIExPVzIsIExPVzMsIExPVzQsIFNQTElUMCwgU1BMSVQxLCBTUExJVDIsIFJFTE9DXzMyLAorICB9OworCit0eXBlZGVmIGVudW0gaTg2MF9yZWxvY190eXBlIHJlbG9jX3R5cGU7CisKKy8qIE5PVEU6IHR3byBiaXRzIG1heCwgc2VlIHJlbG9jX2luZm9faTg2MC5yX3R5cGUgKi8KK2VudW0gaGlnaGxvd190eXBlCisgIHsKKyAgICBOT19TUEVDID0gMCwgUEFJUiwgSElHSCwgSElHSEFESiwKKyAgfTsKKworCitzdHJ1Y3QgcmVsb2NfaW5mb19pODYwCit7CisgIHVuc2lnbmVkIGxvbmcgcl9hZGRyZXNzOworICAvKgorCSAqIFVzaW5nIGJpdCBmaWVsZHMgaGVyZSBpcyBhIGJhZCBpZGVhIGJlY2F1c2UgdGhlIG9yZGVyIGlzIG5vdCBwb3J0YWJsZS4gOi0oCisJICovCisgIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKKyAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKKyAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7CisgIC8qIGNvbWJpbmluZyB0aGUgdHdvIGZpZWxkIHNpbXBsaWZpZXMgdGhlIGFyZ3VtZW50IHBhc3NpbmcgaW4gIm5ld19maXgoKSIgKi8KKyAgLyogYW5kIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcgU3BhcmMgI2lmZGVmJ3MgKi8KKyAgLyogcl90eXBlOiAgaGlnaGxvd190eXBlIC0gYml0cyA1LDQ7IHJlbG9jX3R5cGUgLSBiaXRzIDMtMCAqLworICB1bnNpZ25lZCBpbnQgcl90eXBlOjY7CisgIGxvbmcgcl9hZGRlbmQ7Cit9OworCisjZW5kaWYgLyogVENfSTg2MCAqLworCisKK3N0cnVjdCByZWxvY19zdGRfYnl0ZXMKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRyZXNzWzRdOworICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFszXTsKKyAgICB1bnNpZ25lZCBjaGFyIHJfYml0c1sxXTsKKyAgfTsKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJMHg4MAorI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJMHgwMQorCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJMHg2MAorI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUJLyogVG8gc2hpZnQgdG8gdW5pdHMgcGxhY2UgKi8KKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkweDA2CisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQorCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJMHgxMAorI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCTB4MDgKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkweDA4CisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCTB4MDgKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJMHgwNAorI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJMHgwNAorCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkweDAyCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkweDAyCisKKyNkZWZpbmUJUkVMT0NfU1REX1NJWkUJOAkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLworCisjZW5kaWYgLyogVVNFX0VYVEVOREVEX1JFTE9DICovCisKKyNpZm5kZWYgQ1VTVE9NX1JFTE9DX0ZPUk1BVAorc3RydWN0IHJlbG9jYXRpb25faW5mbworeworICAvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KKyAgaW50IHJfYWRkcmVzczsKKyAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCisgIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKKyAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAorCSAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcworCSAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCisgIHVuc2lnbmVkIGludCByX3BjcmVsOjE7CisgIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KKwkgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKKyAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KKwkgICByX3N5bWJvbG51bSBpcyB0aGUgaW5kZXggb2YgdGhlIHN5bWJvbAorCSAgIGluIGZpbGUncyB0aGUgc3ltYm9sIHRhYmxlLgorCSAgIDAgPT4gcmVsb2NhdGUgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIHNlZ21lbnQuCisJICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCisJICAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7CisgIC8qIFRoZSBuZXh0IHRocmVlIGJpdHMgYXJlIGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgc2VlbSB0bworCSAgIGJlIHVuZG9jdW1lbnRlZC4gICovCisjaWZkZWYgVENfTlMzMksKKyAgdW5zaWduZWQgaW50IHJfYnNyOjE7CisgIHVuc2lnbmVkIGludCByX2Rpc3A6MjsKKyNlbHNlCisgIHVuc2lnbmVkIGludCByX2Jhc2VyZWw6MTsJLyogTGlua2FnZSB0YWJsZSByZWxhdGl2ZSAqLworICB1bnNpZ25lZCBpbnQgcl9qbXB0YWJsZToxOwkvKiBwYy1yZWxhdGl2ZSB0byBqdW1wIHRhYmxlICovCisgIHVuc2lnbmVkIGludCByX3JlbGF0aXZlOjE7CS8qICJyZWxhdGl2ZSByZWxvY2F0aW9uIiAqLworI2VuZGlmIC8qIFRDX05TMzJLICovCisgIC8qIHVudXNlZCAqLworICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KK307CisKKyNlbmRpZiAvKiBDVVNUT01fUkVMT0NfRk9STUFUICovCisKKyNlbmRpZiAvKiBfX0FfT1VUX0dOVV9IX18gKi8KKworLyogZW5kIG9mIGFvdXRfZ251LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYXRvZi1pZWVlLmMgYi9nYXMvY29uZmlnL2F0b2YtaWVlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL2F0b2YtaWVlZS5jCkBAIC0wLDAgKzEsNjk2IEBACisvKiBhdG9mX2llZWUuYyAtIHR1cm4gYSBGbG9udW0gaW50byBhbiBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImFzLmgiCisKKy8qIEZsb251bXMgcmV0dXJuZWQgaGVyZS4gICovCitleHRlcm4gRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7CisKK3N0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgdW5nZXRfYml0cyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgUEFSQU1TICgoTElUVExFTlVNX1RZUEUgKikpOworCitleHRlcm4gY29uc3QgY2hhciBFWFBfQ0hBUlNbXTsKKy8qIFByZWNpc2lvbiBpbiBMaXR0bGVOdW1zLiAqLworLyogRG9uJ3QgY291bnQgdGhlIGdhcCBpbiB0aGUgbTY4ayBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LiAgKi8KKyNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoNSkKKyNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCisjZGVmaW5lIERfUFJFQ0lTSU9OICg0KQorI2RlZmluZSBYX1BSRUNJU0lPTiAoNSkKKyNkZWZpbmUgUF9QUkVDSVNJT04gKDUpCisKKy8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCisjZGVmaW5lIEdVQVJEICgyKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrW10gPQoreworICAweDAwMDAwMDAwLAorICAweDAwMDAwMDAxLAorICAweDAwMDAwMDAzLAorICAweDAwMDAwMDA3LAorICAweDAwMDAwMDBmLAorICAweDAwMDAwMDFmLAorICAweDAwMDAwMDNmLAorICAweDAwMDAwMDdmLAorICAweDAwMDAwMGZmLAorICAweDAwMDAwMWZmLAorICAweDAwMDAwM2ZmLAorICAweDAwMDAwN2ZmLAorICAweDAwMDAwZmZmLAorICAweDAwMDAxZmZmLAorICAweDAwMDAzZmZmLAorICAweDAwMDA3ZmZmLAorICAweDAwMDBmZmZmLAorICAweDAwMDFmZmZmLAorICAweDAwMDNmZmZmLAorICAweDAwMDdmZmZmLAorICAweDAwMGZmZmZmLAorICAweDAwMWZmZmZmLAorICAweDAwM2ZmZmZmLAorICAweDAwN2ZmZmZmLAorICAweDAwZmZmZmZmLAorICAweDAxZmZmZmZmLAorICAweDAzZmZmZmZmLAorICAweDA3ZmZmZmZmLAorICAweDBmZmZmZmZmLAorICAweDFmZmZmZmZmLAorICAweDNmZmZmZmZmLAorICAweDdmZmZmZmZmLAorICAweGZmZmZmZmZmLAorfTsKKwwKKworc3RhdGljIGludCBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOworc3RhdGljIGludCBsaXR0bGVudW1zX2xlZnQ7CitzdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOworCitzdGF0aWMgaW50CituZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQorICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Cit7CisgIGludCByZXR1cm5fdmFsdWU7CisKKyAgaWYgKCFsaXR0bGVudW1zX2xlZnQpCisgICAgcmV0dXJuICgwKTsKKyAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCisgICAgeworICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKKyAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07CisgICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOworCisgICAgICBpZiAoLS1saXR0bGVudW1zX2xlZnQpCisJeworCSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOworCSAgLS1saXR0bGVudW1fcG9pbnRlcjsKKwkgIHJldHVybl92YWx1ZSB8PSAoKmxpdHRsZW51bV9wb2ludGVyID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pICYgbWFza1tudW1iZXJfb2ZfYml0c107CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7CisgICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgqbGl0dGxlbnVtX3BvaW50ZXIgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7CisgICAgfQorICByZXR1cm4gKHJldHVybl92YWx1ZSk7Cit9CisKKy8qIE51bSBoYWQgYmV0dGVyIGJlIGxlc3MgdGhhbiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgKi8KK3N0YXRpYyB2b2lkCit1bmdldF9iaXRzIChudW0pCisgICAgIGludCBudW07Cit7CisgIGlmICghbGl0dGxlbnVtc19sZWZ0KQorICAgIHsKKyAgICAgICsrbGl0dGxlbnVtX3BvaW50ZXI7CisgICAgICArK2xpdHRsZW51bXNfbGVmdDsKKyAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBudW07CisgICAgfQorICBlbHNlIGlmIChiaXRzX2xlZnRfaW5fbGl0dGxlbnVtICsgbnVtID4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQorICAgIHsKKyAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBudW0gLSAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7CisgICAgICArK2xpdHRsZW51bV9wb2ludGVyOworICAgICAgKytsaXR0bGVudW1zX2xlZnQ7CisgICAgfQorICBlbHNlCisgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSArPSBudW07Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3JkcykKKyAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOworeworICBhc19iYWQgKF8oImNhbm5vdCBjcmVhdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIikpOworICB3b3Jkc1swXSA9IChMSVRUTEVOVU1fVFlQRSkgKCh1bnNpZ25lZCkgLTEpID4+IDE7IC8qIFplcm8gdGhlIGxlZnRtb3N0IGJpdCAqLworICB3b3Jkc1sxXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7CisgIHdvcmRzWzJdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKKyAgd29yZHNbM10gPSAoTElUVExFTlVNX1RZUEUpIC0xOworICB3b3Jkc1s0XSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7CisgIHdvcmRzWzVdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKglXYXJuaW5nOiB0aGlzIHJldHVybnMgMTYtYml0IExJVFRMRU5VTXMuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIJKgorICoJdG8gZmlndXJlIG91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlCSoKKyAqCWJ5dGVzL3dvcmQgdG8gYmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIEJpZ2VuZGlhbnMgYmV3YXJlIQkqCisgKgkJCQkJCQkJCSoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5vdGUgdGhhdCBhdG9mLWllZWUgYWx3YXlzIGhhcyBYIGFuZCBQIHByZWNpc2lvbnMgZW5hYmxlZC4gIGl0IGlzIHVwCisgICB0byBtZF9hdG9mIHRvIGZpbHRlciB0aGVtIG91dCBpZiB0aGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyBub3Qgc3VwcG9ydAorICAgdGhlbS4gICovCisKKy8qIFJldHVybnMgcG9pbnRlciBwYXN0IHRleHQgY29uc3VtZWQuICovCitjaGFyICoKK2F0b2ZfaWVlZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQorICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KKyAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KKyAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCit7CisgIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUKKyAgICAgemVyb2VkLCB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLworICBzdGF0aWMgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKKyAgY2hhciAqcmV0dXJuX3ZhbHVlOworICAvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCisgIGludCBwcmVjaXNpb247CisgIGxvbmcgZXhwb25lbnRfYml0czsKKyAgRkxPTlVNX1RZUEUgc2F2ZV9nZW5fZmxvbnVtOworCisgIC8qIFdlIGhhdmUgdG8gc2F2ZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgYmVjYXVzZSBpdAorICAgICBjb250YWlucyBzdG9yYWdlIGFsbG9jYXRpb24gYWJvdXQgdGhlIGFycmF5IG9mIExJVFRMRU5VTXMgd2hlcmUKKyAgICAgdGhlIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gIFdlIHdpbGwgYWxsb2NhdGUgb3VyIG93biBhcnJheSBvZgorICAgICBsaXR0bGVudW1zIGJlbG93LCBidXQgaGF2ZSB0byByZXN0b3JlIHRoZSBnbG9iYWwgb25lIG9uIGV4aXQuICAqLworICBzYXZlX2dlbl9mbG9udW0gPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKKworICByZXR1cm5fdmFsdWUgPSBzdHI7CisgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOworICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5oaWdoID0gTlVMTDsKKyAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyID0gTlVMTDsKKyAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQgPSAwOworICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID0gJ1wwJzsKKworICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5CisgICAgIGhhdmUgMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCisKKyAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOworCisgIHN3aXRjaCAod2hhdF9raW5kKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdTJzoKKyAgICAgIHByZWNpc2lvbiA9IEZfUFJFQ0lTSU9OOworICAgICAgZXhwb25lbnRfYml0cyA9IDg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgcHJlY2lzaW9uID0gRF9QUkVDSVNJT047CisgICAgICBleHBvbmVudF9iaXRzID0gMTE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgIGNhc2UgJ2UnOgorICAgIGNhc2UgJ0UnOgorICAgICAgcHJlY2lzaW9uID0gWF9QUkVDSVNJT047CisgICAgICBleHBvbmVudF9iaXRzID0gMTU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorCisgICAgICBwcmVjaXNpb24gPSBQX1BSRUNJU0lPTjsKKyAgICAgIGV4cG9uZW50X2JpdHMgPSAtMTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKKyAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQorCisgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmhpZ2gKKyAgICA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKKworICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsIEVYUF9DSEFSUywKKwkJICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCisgICAgeworICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisgIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7CisKKyAgLyogUmVzdG9yZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIncyBzdG9yYWdlIGFsbG9jIChhbmQKKyAgICAgZXZlcnl0aGluZyBlbHNlKS4gICovCisgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gc2F2ZV9nZW5fZmxvbnVtOworCisgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKy8qIFR1cm4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgaW50byBhIHJlYWwgZmxvYXQvZG91YmxlL2V4dGVuZGVkLiAgKi8KK2ludAorZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKQorICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CisgICAgIGludCBwcmVjaXNpb247CisgICAgIGxvbmcgZXhwb25lbnRfYml0czsKK3sKKyAgaW50IHJldHVybl92YWx1ZSA9IDA7CisKKyAgbG9uZyBleHBvbmVudF8xOworICBsb25nIGV4cG9uZW50XzI7CisgIGxvbmcgZXhwb25lbnRfMzsKKyAgbG9uZyBleHBvbmVudF80OworICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7CisgIExJVFRMRU5VTV9UWVBFIHdvcmQxOworICBMSVRUTEVOVU1fVFlQRSAqbHA7CisgIExJVFRMRU5VTV9UWVBFICp3b3Jkc19lbmQ7CisKKyAgd29yZHNfZW5kID0gd29yZHMgKyBwcmVjaXNpb247CisjaWZkZWYgVENfTTY4SworICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQorICAgIC8qIE9uIHRoZSBtNjhrIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0IGhhcyBhIGdhcCBvZiAxNiBiaXRzCisgICAgICAgYmV0d2VlbiB0aGUgZXhwb25lbnQgYW5kIHRoZSBtYW50aXNzYS4gICovCisgICAgd29yZHNfZW5kKys7CisjZW5kaWYKKworICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ID4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyKQorICAgIHsKKyAgICAgIC8qIDAuMGUwIHNlZW4uICovCisgICAgICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCisJd29yZHNbMF0gPSAweDAwMDA7CisgICAgICBlbHNlCisJd29yZHNbMF0gPSAweDgwMDA7CisgICAgICBtZW1zZXQgKCZ3b3Jkc1sxXSwgJ1wwJywKKwkgICAgICAod29yZHNfZW5kIC0gd29yZHMgLSAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKKyAgICB9CisKKyAgLyogTmFOOiAgRG8gdGhlIHJpZ2h0IHRoaW5nICovCisgIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09IDApCisgICAgeworICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKKwl7CisJICB3b3Jkc1swXSA9IDB4N2ZmZjsKKwkgIHdvcmRzWzFdID0gMHhmZmZmOworCX0KKyAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKKwl7CisjaWZkZWYgVENfTTY4SworCSAgd29yZHNbMF0gPSAweDdmZmY7CisJICB3b3Jkc1sxXSA9IDA7CisJICB3b3Jkc1syXSA9IDB4ZmZmZjsKKwkgIHdvcmRzWzNdID0gMHhmZmZmOworCSAgd29yZHNbNF0gPSAweGZmZmY7CisJICB3b3Jkc1s1XSA9IDB4ZmZmZjsKKyNlbHNlIC8qICEgVENfTTY4SyAqLworI2lmZGVmIFRDX0kzODYKKwkgIHdvcmRzWzBdID0gMHhmZmZmOworCSAgd29yZHNbMV0gPSAweGMwMDA7CisJICB3b3Jkc1syXSA9IDA7CisJICB3b3Jkc1szXSA9IDA7CisJICB3b3Jkc1s0XSA9IDA7CisjZWxzZSAvKiAhIFRDX0kzODYgKi8KKwkgIGFib3J0ICgpOworI2VuZGlmIC8qICEgVENfSTM4NiAqLworI2VuZGlmIC8qICEgVENfTTY4SyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICB3b3Jkc1swXSA9IDB4N2ZmZjsKKwkgIHdvcmRzWzFdID0gMHhmZmZmOworCSAgd29yZHNbMl0gPSAweGZmZmY7CisJICB3b3Jkc1szXSA9IDB4ZmZmZjsKKwl9CisgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworICAgIH0KKyAgZWxzZSBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnUCcpCisgICAgeworICAgICAgLyogK0lORjogIERvIHRoZSByaWdodCB0aGluZyAqLworICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKKwl7CisJICB3b3Jkc1swXSA9IDB4N2Y4MDsKKwkgIHdvcmRzWzFdID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCisJeworI2lmZGVmIFRDX002OEsKKwkgIHdvcmRzWzBdID0gMHg3ZmZmOworCSAgd29yZHNbMV0gPSAwOworCSAgd29yZHNbMl0gPSAwOworCSAgd29yZHNbM10gPSAwOworCSAgd29yZHNbNF0gPSAwOworCSAgd29yZHNbNV0gPSAwOworI2Vsc2UgLyogISBUQ19NNjhLICovCisjaWZkZWYgVENfSTM4NgorCSAgd29yZHNbMF0gPSAweDdmZmY7CisJICB3b3Jkc1sxXSA9IDB4ODAwMDsKKwkgIHdvcmRzWzJdID0gMDsKKwkgIHdvcmRzWzNdID0gMDsKKwkgIHdvcmRzWzRdID0gMDsKKyNlbHNlIC8qICEgVENfSTM4NiAqLworCSAgYWJvcnQgKCk7CisjZW5kaWYgLyogISBUQ19JMzg2ICovCisjZW5kaWYgLyogISBUQ19NNjhLICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHdvcmRzWzBdID0gMHg3ZmYwOworCSAgd29yZHNbMV0gPSAwOworCSAgd29yZHNbMl0gPSAwOworCSAgd29yZHNbM10gPSAwOworCX0KKyAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKKyAgICB9CisgIGVsc2UgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJ04nKQorICAgIHsKKyAgICAgIC8qIE5lZ2F0aXZlIElORiAqLworICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKKwl7CisJICB3b3Jkc1swXSA9IDB4ZmY4MDsKKwkgIHdvcmRzWzFdID0gMHgwOworCX0KKyAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKKwl7CisjaWZkZWYgVENfTTY4SworCSAgd29yZHNbMF0gPSAweGZmZmY7CisJICB3b3Jkc1sxXSA9IDA7CisJICB3b3Jkc1syXSA9IDA7CisJICB3b3Jkc1szXSA9IDA7CisJICB3b3Jkc1s0XSA9IDA7CisJICB3b3Jkc1s1XSA9IDA7CisjZWxzZSAvKiAhIFRDX002OEsgKi8KKyNpZmRlZiBUQ19JMzg2CisJICB3b3Jkc1swXSA9IDB4ZmZmZjsKKwkgIHdvcmRzWzFdID0gMHg4MDAwOworCSAgd29yZHNbMl0gPSAwOworCSAgd29yZHNbM10gPSAwOworCSAgd29yZHNbNF0gPSAwOworI2Vsc2UgLyogISBUQ19JMzg2ICovCisJICBhYm9ydCAoKTsKKyNlbmRpZiAvKiAhIFRDX0kzODYgKi8KKyNlbmRpZiAvKiAhIFRDX002OEsgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgd29yZHNbMF0gPSAweGZmZjA7CisJICB3b3Jkc1sxXSA9IDB4MDsKKwkgIHdvcmRzWzJdID0gMHgwOworCSAgd29yZHNbM10gPSAweDA7CisJfQorICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOworICAgIH0KKyAgLyoKKyAgICogVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgd2Ugc3VwcG9ydCBoYXZlOgorICAgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCisgICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgorICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCisgICAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkKHMpIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisgICAqCisgICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgorICAgKiBtYW50aXNzYS4KKyAgICovCisgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisgIGxpdHRsZW51bV9wb2ludGVyID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyOworICBsaXR0bGVudW1zX2xlZnQgPSAoMQorCQkgICAgICsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCisJCSAgICAgLSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cpOworICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCisgIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOyAhbmV4dF9iaXRzICgxKTsgKytleHBvbmVudF9za2lwcGFnZSk7OworICBleHBvbmVudF8xID0gKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50CisJCSsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCisJCSsgMQorCQktIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyk7CisgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbgorICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIuICovCisgIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOworICAvKiBSYWRpeCAyLiAqLworICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOworICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCisgIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKCgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpIC0gMik7CisgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KKworICBscCA9IHdvcmRzOworCisgIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLworICB3b3JkMSA9ICgoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCisJICAgPyAwCisJICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKKworICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCisgIGlmIChleHBvbmVudF80IDw9IDApCisgICAgeworICAgICAgaW50IHByZWNfYml0czsKKyAgICAgIGludCBudW1fYml0czsKKworICAgICAgdW5nZXRfYml0cyAoMSk7CisgICAgICBudW1fYml0cyA9IC1leHBvbmVudF80OworICAgICAgcHJlY19iaXRzID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICogcHJlY2lzaW9uIC0gKGV4cG9uZW50X2JpdHMgKyAxICsgbnVtX2JpdHMpOworI2lmZGVmIFRDX0kzODYKKyAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKKwl7CisJICAvKiBPbiB0aGUgaTM4NiBhIGRlbm9ybWFsaXplZCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaXMKKwkgICAgIHNoaWZ0ZWQgZG93biBieSBvbmUsIGVmZmVjdGl2ZWx5IGRlY3JlYXNpbmcgdGhlIGV4cG9uZW50CisJICAgICBiaWFzIGJ5IG9uZS4gICovCisJICBwcmVjX2JpdHMgLT0gMTsKKwkgIG51bV9iaXRzICs9IDE7CisJfQorI2VuZGlmCisKKyAgICAgIGlmIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBleHBvbmVudF9iaXRzKQorCXsKKwkgIC8qIEJpZ2dlciB0aGFuIG9uZSBsaXR0bGVudW0gKi8KKwkgIG51bV9iaXRzIC09IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHM7CisJICAqbHArKyA9IHdvcmQxOworCSAgaWYgKG51bV9iaXRzICsgZXhwb25lbnRfYml0cyArIDEgPj0gcHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQorCSAgICB7CisJICAgICAgLyogRXhwb25lbnQgb3ZlcmZsb3cgKi8KKwkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7CisJICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOworCSAgICB9CisjaWZkZWYgVENfTTY4SworCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTiAmJiBleHBvbmVudF9iaXRzID09IDE1KQorCSAgICAqbHArKyA9IDA7CisjZW5kaWYKKwkgIHdoaWxlIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCisJICAgIHsKKwkgICAgICBudW1fYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJICAgICAgKmxwKysgPSAwOworCSAgICB9CisJICBpZiAobnVtX2JpdHMpCisJICAgICpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAobnVtX2JpdHMpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTiAmJiBleHBvbmVudF9iaXRzID09IDE1KQorCSAgICB7CisJICAgICAgKmxwKysgPSB3b3JkMTsKKyNpZmRlZiBUQ19NNjhLCisJICAgICAgKmxwKysgPSAwOworI2VuZGlmCisJICAgICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bV9iaXRzKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgd29yZDEgfD0gbmV4dF9iaXRzICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSAoZXhwb25lbnRfYml0cyArIG51bV9iaXRzKSk7CisJICAgICAgKmxwKysgPSB3b3JkMTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKKwkqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKKworICAgICAgLyogUm91bmQgdGhlIG1hbnRpc3NhIHVwLCBidXQgZG9uJ3QgY2hhbmdlIHRoZSBudW1iZXIgKi8KKyAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQorCXsKKwkgIC0tbHA7CisJICBpZiAocHJlY19iaXRzID4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQorCSAgICB7CisJICAgICAgaW50IG4gPSAwOworCSAgICAgIGludCB0bXBfYml0czsKKworCSAgICAgIG4gPSAwOworCSAgICAgIHRtcF9iaXRzID0gcHJlY19iaXRzOworCSAgICAgIHdoaWxlICh0bXBfYml0cyA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKKwkJeworCQkgIGlmIChscFtuXSAhPSAoTElUVExFTlVNX1RZUEUpIC0gMSkKKwkJICAgIGJyZWFrOworCQkgIC0tbjsKKwkJICB0bXBfYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJCX0KKwkgICAgICBpZiAodG1wX2JpdHMgPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgfHwgKGxwW25dICYgbWFza1t0bXBfYml0c10pICE9IG1hc2tbdG1wX2JpdHNdKQorCQl7CisJCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKKworCQkgIGZvciAoY2FycnkgPSAxOyBjYXJyeSAmJiAobHAgPj0gd29yZHMpOyBscC0tKQorCQkgICAgeworCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OworCQkgICAgICAqbHAgPSBjYXJyeTsKKwkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFRoaXMgaXMgYW4gb3ZlcmZsb3cgb2YgdGhlIGRlbm9ybWFsIG51bWJlcnMuICBXZQorICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBmb3JnZXQgd2hhdCB3ZSBoYXZlIHByb2R1Y2VkLCBhbmQgaW5zdGVhZAorICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KKwkJICBscCA9IHdvcmRzOworCQkgIHdvcmQxID0gKChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKKwkJCSAgID8gMAorCQkJICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKKwkJICB3b3JkMSB8PSAoMQorCQkJICAgIDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKKwkJCQktIGV4cG9uZW50X2JpdHMpKTsKKwkJICAqbHArKyA9IHdvcmQxOworCQkgIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKKwkJICAgICpscCsrID0gMDsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmICgoKmxwICYgbWFza1twcmVjX2JpdHNdKSAhPSBtYXNrW3ByZWNfYml0c10pCisJICAgICpscCArPSAxOworCX0KKworICAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKKyAgICB9CisgIGVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKSBleHBvbmVudF80ID49IG1hc2tbZXhwb25lbnRfYml0c10pCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEV4cG9uZW50IG92ZXJmbG93LiBMb3NlIGltbWVkaWF0ZWx5LgorICAgICAgICovCisKKyAgICAgIC8qCisgICAgICAgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCisgICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KKyAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCisgICAgICAgKi8KKyAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKKyAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd29yZDEgfD0gKGV4cG9uZW50XzQgPDwgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHMpKQorCXwgbmV4dF9iaXRzICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzKTsKKyAgICB9CisKKyAgKmxwKysgPSB3b3JkMTsKKworICAvKiBYX1BSRUNJU0lPTiBpcyBzcGVjaWFsOiBvbiB0aGUgNjhrLCBpdCBoYXMgMTYgYml0cyBvZiB6ZXJvIGluIHRoZQorICAgICBtaWRkbGUuICBFaXRoZXIgd2F5LCBpdCBpcyB0aGVuIGZvbGxvd2VkIGJ5IGEgMSBiaXQuICovCisgIGlmIChleHBvbmVudF9iaXRzID09IDE1ICYmIHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKKyAgICB7CisjaWZkZWYgVENfTTY4SworICAgICAgKmxwKysgPSAwOworI2VuZGlmCisgICAgICAqbHArKyA9ICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKQorCSAgICAgICB8IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpOworICAgIH0KKworICAvKiBUaGUgcmVzdCBvZiB0aGUgd29yZHMgYXJlIGp1c3QgbWFudGlzc2EgYml0cy4gKi8KKyAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQorICAgICpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOworCisgIGlmIChuZXh0X2JpdHMgKDEpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgY2Fycnk7CisgICAgICAvKgorICAgICAgICogU2luY2UgdGhlIE5FWFQgYml0IGlzIGEgMSwgcm91bmQgVVAgdGhlIG1hbnRpc3NhLgorICAgICAgICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCisgICAgICAgKiB1cyB0byBsZXQgdGhlIG1hbnRpc3NhIG92ZXJmbG93IGludG8gdGhlIGV4cG9uZW50LCBhbmQKKyAgICAgICAqIGl0ICdkb2VzIHRoZSByaWdodCB0aGluZycuIEhvd2V2ZXIsIHdlIGxvc2UgaWYgdGhlCisgICAgICAgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCisgICAgICAgKiBJcyB0aGF0IGNsZWFyPworICAgICAgICovCisKKyAgICAgIC8qICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKKwkgUGxlYXNlIGFsbG93IGF0IGxlYXN0IDEgbW9yZSBiaXQgaW4gY2FycnkgdGhhbiBpcyBpbiBhIExJVFRMRU5VTS4KKwkgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5CisJIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCisJIGRvbid0IGdldCBhIHN0aWNreSBzaWduIGJpdCBhZnRlciBzaGlmdGluZyByaWdodCwgYW5kIHRoYXQKKwkgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KKwkgI2VuZGlmICovCisgICAgICBmb3IgKGNhcnJ5ID0gMSwgbHAtLTsgY2FycnkgJiYgKGxwID49IHdvcmRzKTsgbHAtLSkKKwl7CisJICBjYXJyeSA9ICpscCArIGNhcnJ5OworCSAgKmxwID0gY2Fycnk7CisJICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOworCX0KKyAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKKwl7CisJICAvKiBFeHRlbmRlZCBwcmVjaXNpb24gbnVtYmVycyBoYXZlIGFuIGV4cGxpY2l0IGludGVnZXIgYml0CisJICAgICB0aGF0IHdlIG1heSBoYXZlIHRvIHJlc3RvcmUuICAqLworCSAgaWYgKGxwID09IHdvcmRzKQorCSAgICB7CisjaWZkZWYgVENfTTY4SworCSAgICAgIC8qIE9uIHRoZSBtNjhrIHRoZXJlIGlzIGEgZ2FwIG9mIDE2IGJpdHMuICBXZSBtdXN0CisJCSBleHBsaWNpdGx5IHByb3BhZ2F0ZSB0aGUgY2FycnkgaW50byB0aGUgZXhwb25lbnQuICovCisJICAgICAgd29yZHNbMF0gKz0gd29yZHNbMV07CisJICAgICAgd29yZHNbMV0gPSAwOworCSAgICAgIGxwKys7CisjZW5kaWYKKwkgICAgICAvKiBQdXQgYmFjayB0aGUgaW50ZWdlciBiaXQuICAqLyAKKwkgICAgICBscFsxXSB8PSAxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKTsKKwkgICAgfQorIAl9CisgICAgICBpZiAoKHdvcmQxIF4gKndvcmRzKSAmICgxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSkpCisJeworCSAgLyogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQorCSAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCisJICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgorCSAgICovCisJICAqd29yZHMgJj0gfigxIDw8IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSk7CisJICAvKiBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7ICovCisJICAvKiByZXR1cm4gcmV0dXJuX3ZhbHVlOyAqLworCX0KKyAgICB9CisgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KKworI2lmIDAgLyogdW51c2VkICovCisvKiBUaGlzIHJvdXRpbmUgaXMgYSByZWFsIGtsdWRnZS4gIFNvbWVvbmUgcmVhbGx5IHNob3VsZCBkbyBpdCBiZXR0ZXIsCisgICBidXQgSSdtIHRvbyBsYXp5LCBhbmQgSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgc3R1ZmYgYWxsIHRvbyB3ZWxsCisgICBhbnl3YXkuIChKRikgICovCitzdGF0aWMgdm9pZAoraW50X3RvX2dlbiAoeCkKKyAgICAgbG9uZyB4OworeworICBjaGFyIGJ1ZlsyMF07CisgIGNoYXIgKmJ1ZnA7CisKKyAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgeCk7CisgIGJ1ZnAgPSAmYnVmWzBdOworICBpZiAoYXRvZl9nZW5lcmljICgmYnVmcCwgIi4iLCBFWFBfQ0hBUlMsICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCisgICAgYXNfYmFkIChfKCJFcnJvciBjb252ZXJ0aW5nIG51bWJlciB0byBmbG9hdGluZyBwb2ludCAoRXhwb25lbnQgb3ZlcmZsb3c/KSIpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgVEVTVAorY2hhciAqCitwcmludF9nZW4gKGdlbikKKyAgICAgRkxPTlVNX1RZUEUgKmdlbjsKK3sKKyAgRkxPTlVNX1RZUEUgZjsKKyAgTElUVExFTlVNX1RZUEUgYXJyWzEwXTsKKyAgZG91YmxlIGR2OworICBmbG9hdCBmdjsKKyAgc3RhdGljIGNoYXIgc2J1Zls0MF07CisKKyAgaWYgKGdlbikKKyAgICB7CisgICAgICBmID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7CisgICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9ICpnZW47CisgICAgfQorICBnZW5fdG9fd29yZHMgKCZhcnJbMF0sIDQsIDExKTsKKyAgbWVtY3B5ICgmZHYsICZhcnJbMF0sIHNpemVvZiAoZG91YmxlKSk7CisgIHNwcmludGYgKHNidWYsICIleCAleCAleCAleCAlLjE0RyAgICIsIGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSwgZHYpOworICBnZW5fdG9fd29yZHMgKCZhcnJbMF0sIDIsIDgpOworICBtZW1jcHkgKCZmdiwgJmFyclswXSwgc2l6ZW9mIChmbG9hdCkpOworICBzcHJpbnRmIChzYnVmICsgc3RybGVuIChzYnVmKSwgIiV4ICV4ICUuMTJnXG4iLCBhcnJbMF0sIGFyclsxXSwgZnYpOworCisgIGlmIChnZW4pCisgICAgeworICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSBmOworICAgIH0KKworICByZXR1cm4gKHNidWYpOworfQorCisjZW5kaWYKKworLyogZW5kIG9mIGF0b2YtaWVlZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2F0b2YtdGFob2UuYyBiL2dhcy9jb25maWcvYXRvZi10YWhvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDQ4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL2F0b2YtdGFob2UuYwpAQCAtMCwwICsxLDQzMSBAQAorCisvKiBhdG9mX3RhaG9lLmMgLSB0dXJuIGEgc3RyaW5nIGludG8gYSBUYWhvZSBmbG9hdGluZyBwb2ludCBudW1iZXIKKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICovCisKKy8qIFRoaXMgaXMgcmVhbGx5IGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIGF0b2ZfdmF4LmMuIEkgZ2xvbW1lZCBpdCB3aG9sZXNhbGUKKyAgIGFuZCB0aGVuIHNoYXZlZCBpdCBkb3duLiBJIGRvbid0IGV2ZW4ga25vdyBob3cgaXQgd29ya3MuIChEb24ndCB5b3UgZmluZAorICAgbXkgaG9uZXN0eSByZWZyZXNoaW5nPyAgYm93ZW5AY3MuQnVmZmFsby5FRFUgKERldm9uIEUgQm93ZW4pCisKKyAgIEkgZG9uJ3QgYWxsb3cgdXBwZXJjYXNlIGxldHRlcnMgaW4gdGhlIHByZWNpc2lvbiBkZXNjcnBpdG9ycy4gSWUgJ2YnIGFuZAorICAgJ2QnIGFyZSBhbGxvd2VkIGJ1dCAnRicgYW5kICdEJyBhcmVuJ3QgKi8KKworI2luY2x1ZGUgImFzLmgiCisKKy8qIFByZWNpc2lvbiBpbiBMaXR0bGVOdW1zLiAqLworI2RlZmluZSBNQVhfUFJFQ0lTSU9OICg0KQorI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKKyNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCisKKy8qIFByZWNpc2lvbiBpbiBjaGFycy4gKi8KKyNkZWZpbmUgRF9QUkVDSVNJT05fQ0hBUlMgKDgpCisjZGVmaW5lIEZfUFJFQ0lTSU9OX0NIQVJTICg0KQorCisvKiBMZW5ndGggaW4gTGl0dGxlTnVtcyBvZiBndWFyZCBiaXRzLiAqLworI2RlZmluZSBHVUFSRCAoMikKKworc3RhdGljIGNvbnN0IGxvbmcgaW50IG1hc2tbXSA9Cit7CisgIDB4MDAwMDAwMDAsCisgIDB4MDAwMDAwMDEsCisgIDB4MDAwMDAwMDMsCisgIDB4MDAwMDAwMDcsCisgIDB4MDAwMDAwMGYsCisgIDB4MDAwMDAwMWYsCisgIDB4MDAwMDAwM2YsCisgIDB4MDAwMDAwN2YsCisgIDB4MDAwMDAwZmYsCisgIDB4MDAwMDAxZmYsCisgIDB4MDAwMDAzZmYsCisgIDB4MDAwMDA3ZmYsCisgIDB4MDAwMDBmZmYsCisgIDB4MDAwMDFmZmYsCisgIDB4MDAwMDNmZmYsCisgIDB4MDAwMDdmZmYsCisgIDB4MDAwMGZmZmYsCisgIDB4MDAwMWZmZmYsCisgIDB4MDAwM2ZmZmYsCisgIDB4MDAwN2ZmZmYsCisgIDB4MDAwZmZmZmYsCisgIDB4MDAxZmZmZmYsCisgIDB4MDAzZmZmZmYsCisgIDB4MDA3ZmZmZmYsCisgIDB4MDBmZmZmZmYsCisgIDB4MDFmZmZmZmYsCisgIDB4MDNmZmZmZmYsCisgIDB4MDdmZmZmZmYsCisgIDB4MGZmZmZmZmYsCisgIDB4MWZmZmZmZmYsCisgIDB4M2ZmZmZmZmYsCisgIDB4N2ZmZmZmZmYsCisgIDB4ZmZmZmZmZmYKK307CisMCisKKy8qIFNoYXJlZCBiZXR3ZWVuIGZsb251bV9nZW4ydGFob2UgYW5kIG5leHRfYml0cyAqLworc3RhdGljIGludCBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOworc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKK3N0YXRpYyBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX2VuZDsKKworI2lmIF9fU1REQ19fID09IDEKKworaW50IGZsb251bV9nZW4ydGFob2UgKGludCBmb3JtYXRfbGV0dGVyLCBGTE9OVU1fVFlQRSAqIGYsIExJVFRMRU5VTV9UWVBFICogd29yZHMpOworCisjZWxzZSAvKiBub3QgX19TVERDX18gKi8KKworaW50IGZsb251bV9nZW4ydGFob2UgKCk7CisKKyNlbmRpZiAvKiBub3QgX19TVERDX18gKi8KKworCitzdGF0aWMgaW50CituZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQorICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Cit7CisgIGludCByZXR1cm5fdmFsdWU7CisKKyAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCisgICAgeworICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKKyAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07CisgICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOworICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOworICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKKyAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQorCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmCisJICBtYXNrW251bWJlcl9vZl9iaXRzXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtIC09IG51bWJlcl9vZl9iaXRzOworICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tudW1iZXJfb2ZfYml0c10gJgorCSgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKKyAgICB9CisgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK21ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQorICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Cit7CisgICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLworfQorDAorc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLword2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQorICAgICBjaGFyIGxldHRlcjsJCS8qIEluOiBsb3dlcmNhc2UgcGxlYXNlLiBXaGF0IGtpbmQgb2YgZmxvYXQ/ICovCisgICAgIGludCAqcHJlY2lzaW9uUDsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZsb2F0LiAqLworICAgICBsb25nIGludCAqZXhwb25lbnRfYml0c1A7CS8qIE51bWJlciBvZiBleHBvbmVudCBiaXRzLiAqLworeworICBpbnQgcmV0dmFsOwkJCS8qIDA6IE9LLiAqLworCisgIHJldHZhbCA9IDA7CisgIHN3aXRjaCAobGV0dGVyKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICAgICpwcmVjaXNpb25QID0gRl9QUkVDSVNJT047CisgICAgICAqZXhwb25lbnRfYml0c1AgPSA4OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgICpwcmVjaXNpb25QID0gRF9QUkVDSVNJT047CisgICAgICAqZXhwb25lbnRfYml0c1AgPSA4OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dmFsID0gNjk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAocmV0dmFsKTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyoJCQkJCQkJCQkqCisqCVdhcm5pbmc6IHRoaXMgcmV0dXJucyAxNi1iaXQgTElUVExFTlVNcywgYmVjYXVzZSB0aGF0IGlzCSoKKyoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgorKglvdXQgYW55IGFsaWdubWVudCBwcm9ibGVtcyBhbmQgdG8gY29uc3BpcmUgZm9yIHRoZSBieXRlcy93b3JkCSoKKyoJdG8gYmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIEJpZ2VuZGlhbnMgYmV3YXJlIQkJKgorKgkJCQkJCQkJCSoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2hhciAqCQkJCS8qIFJldHVybiBwb2ludGVyIHBhc3QgdGV4dCBjb25zdW1lZC4gKi8KK2F0b2ZfdGFob2UgKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKKyAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCisgICAgIGNoYXIgd2hhdF9raW5kOwkJLyogJ2QnLCAnZicsICdnJywgJ2gnICovCisgICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsJLyogQnVpbGQgdGhlIGJpbmFyeSBoZXJlLiAqLworeworICBGTE9OVU1fVFlQRSBmOworICBMSVRUTEVOVU1fVFlQRSBiaXRzW01BWF9QUkVDSVNJT04gKyBNQVhfUFJFQ0lTSU9OICsgR1VBUkRdOworICAvKiBFeHRyYSBiaXRzIGZvciB6ZXJvZWQgbG93LW9yZGVyIGJpdHMuICovCisgIC8qIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUgemVyb2VkLCAqLworICAvKiB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLworICBjaGFyICpyZXR1cm5fdmFsdWU7CisgIGludCBwcmVjaXNpb247CQkvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCisgIGxvbmcgaW50IGV4cG9uZW50X2JpdHM7CisKKyAgcmV0dXJuX3ZhbHVlID0gc3RyOworICBmLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOworICBmLmhpZ2ggPSBOVUxMOworICBmLmxlYWRlciA9IE5VTEw7CisgIGYuZXhwb25lbnQgPSBOVUxMOworICBmLnNpZ24gPSAnXDAnOworCisgIGlmICh3aGF0X2tpbmRfb2ZfZmxvYXQgKHdoYXRfa2luZCwgJnByZWNpc2lvbiwgJmV4cG9uZW50X2JpdHMpKQorICAgIHsKKyAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7CS8qIFdlIGxvc3QuICovCisgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7CisgICAgfQorICBpZiAocmV0dXJuX3ZhbHVlKQorICAgIHsKKyAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKKworICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCisgICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLworICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCisgICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKKworICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCisJeworCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZmxvbnVtX2dlbjJ0YWhvZSAod2hhdF9raW5kLCAmZiwgd29yZHMpKQorCSAgICB7CisJICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KKwwKKy8qCisgKiBJbjogYSBmbG9udW0sIGEgVGFob2UgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LgorICogT3V0OiBhIFRhaG9lIGZsb2F0aW5nLXBvaW50IGJpdCBwYXR0ZXJuLgorICovCisKK2ludAkJCQkvKiAwOiBPSy4gKi8KK2Zsb251bV9nZW4ydGFob2UgKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQorICAgICBjaGFyIGZvcm1hdF9sZXR0ZXI7CS8qIE9uZSBvZiAnZCcgJ2YnLiAqLworICAgICBGTE9OVU1fVFlQRSAqZjsKKyAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBEZWxpdmVyIGFuc3dlciBoZXJlLiAqLworeworICBMSVRUTEVOVU1fVFlQRSAqbHA7CisgIGludCBwcmVjaXNpb247CisgIGxvbmcgaW50IGV4cG9uZW50X2JpdHM7CisgIGludCByZXR1cm5fdmFsdWU7CQkvKiAwID09IE9LLiAqLworCisgIHJldHVybl92YWx1ZSA9IHdoYXRfa2luZF9vZl9mbG9hdCAoZm9ybWF0X2xldHRlciwgJnByZWNpc2lvbiwgJmV4cG9uZW50X2JpdHMpOworICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCisgICAgeworICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCisJeworCSAgLyogMC4wZTAgc2Vlbi4gKi8KKwkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbG9uZyBpbnQgZXhwb25lbnRfMTsKKwkgIGxvbmcgaW50IGV4cG9uZW50XzI7CisJICBsb25nIGludCBleHBvbmVudF8zOworCSAgbG9uZyBpbnQgZXhwb25lbnRfNDsKKwkgIGludCBleHBvbmVudF9za2lwcGFnZTsKKwkgIExJVFRMRU5VTV9UWVBFIHdvcmQxOworCisJICAvKiBKRjogRGVhbCB3aXRoIG5ldyBOYW4sICtJbmYgYW5kIC1JbmYgY29kZXMgKi8KKwkgIGlmIChmLT5zaWduICE9ICctJyAmJiBmLT5zaWduICE9ICcrJykKKwkgICAgeworCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKKwkgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworCSAgICB9CisJICAvKgorCSAgICogQWxsIHRhaG9lIGZsb2F0aW5nX3BvaW50IGZvcm1hdHMgaGF2ZToKKwkgICAqIEJpdCAxNSBpcyBzaWduIGJpdC4KKwkgICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgorCSAgICogQml0cyBuLTE6MCAoaWYgYW55KSBhcmUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGZyYWN0aW9uLgorCSAgICogQml0cyAxNTowIG9mIHRoZSBuZXh0IHdvcmQgYXJlIHRoZSBuZXh0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKwkgICAqIEFuZCBzbyBvbiBmb3IgZWFjaCBvdGhlciB3b3JkLgorCSAgICoKKwkgICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgorCSAgICogbWFudGlzc2EuCisJICAgKi8KKworCSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKKwkgIGxpdHRsZW51bV9wb2ludGVyID0gZi0+bGVhZGVyOworCSAgbGl0dGxlbnVtX2VuZCA9IGYtPmxvdzsKKwkgIC8qIFNlZWsgKGFuZCBmb3JnZXQpIDFzdCBzaWduaWZpY2FudCBiaXQgKi8KKwkgIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOworCSAgICAgICAhbmV4dF9iaXRzICgxKTsKKwkgICAgICAgZXhwb25lbnRfc2tpcHBhZ2UrKykKKwkgICAgeworCSAgICB9CisJICBleHBvbmVudF8xID0gZi0+ZXhwb25lbnQgKyBmLT5sZWFkZXIgKyAxIC0gZi0+bG93OworCSAgLyogUmFkaXggTElUVExFTlVNX1JBRElYLCBwb2ludCBqdXN0IGhpZ2hlciB0aGFuIGYgLT4gbGVhZGVyLiAqLworCSAgZXhwb25lbnRfMiA9IGV4cG9uZW50XzEgKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJICAvKiBSYWRpeCAyLiAqLworCSAgZXhwb25lbnRfMyA9IGV4cG9uZW50XzIgLSBleHBvbmVudF9za2lwcGFnZTsKKwkgIC8qIEZvcmdldCBsZWFkaW5nIHplcm9zLCBmb3JnZXQgMXN0IGJpdC4gKi8KKwkgIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKDEgPDwgKGV4cG9uZW50X2JpdHMgLSAxKSk7CisJICAvKiBPZmZzZXQgZXhwb25lbnQuICovCisKKwkgIGlmIChleHBvbmVudF80ICYgfm1hc2tbZXhwb25lbnRfYml0c10pCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIEV4cG9uZW50IG92ZXJmbG93LiBMb3NlIGltbWVkaWF0ZWx5LgorCSAgICAgICAqLworCisJICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworCisJICAgICAgLyoKKwkgICAgICAgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCisJICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCisJICAgICAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KKwkgICAgICAgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbHAgPSB3b3JkczsKKworCSAgICAgIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLworCSAgICAgIC8qIEFzc3VtZSAyJ3MgY29tcGxlbWVudCBpbnRlZ2Vycy4gKi8KKwkgICAgICB3b3JkMSA9ICgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQorCQl8ICgoZi0+c2lnbiA9PSAnKycpID8gMCA6IDB4ODAwMCkKKwkJfCBuZXh0X2JpdHMgKDE1IC0gZXhwb25lbnRfYml0cyk7CisJICAgICAgKmxwKysgPSB3b3JkMTsKKworCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLworCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQorCQl7CisJCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOworCQl9CisKKwkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKKwkJeworCQkgIC8qCisJCSAgICogU2luY2UgdGhlIE5FWFQgYml0IGlzIGEgMSwgcm91bmQgVVAgdGhlIG1hbnRpc3NhLgorCQkgICAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cworCQkgICAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAorCQkgICAqIGl0ICdkb2VzIHRoZSByaWdodCB0aGluZycuIEhvd2V2ZXIsIHdlIGxvc2UgaWYgdGhlCisJCSAgICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgorCQkgICAqIElzIHRoYXQgY2xlYXI/CisJCSAgICovCisKKwkJICB1bnNpZ25lZCBsb25nIGludCBjYXJyeTsKKworCQkgIC8qCisJCSAgICAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCisJCSAgICBQbGVhc2UgYWxsb3cgYXQgbGVhc3QgMSBtb3JlIGJpdCBpbiBjYXJyeSB0aGFuIGlzIGluIGEgTElUVExFTlVNLgorCQkgICAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5CisJCSAgICBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQorCQkgICAgZG9uJ3QgZ2V0IGEgc3RpY2t5IHNpZ24gYml0IGFmdGVyIHNoaWZ0aW5nIHJpZ2h0LCBhbmQgdGhhdAorCQkgICAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KKwkJICAgICNlbmRpZgorCQkgICAgKi8KKwkJICBmb3IgKGNhcnJ5ID0gMSwgbHAtLTsKKwkJICAgICAgIGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7CisJCSAgICAgICBscC0tKQorCQkgICAgeworCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OworCQkgICAgICAqbHAgPSBjYXJyeTsKKwkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKKwkJICAgIH0KKworCQkgIGlmICgod29yZDEgXiAqd29yZHMpICYgKDEgPDwgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKSkKKwkJICAgIHsKKwkJICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworCQkgICAgICAvKgorCQkgICAgICAgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCisJCSAgICAgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgorCQkgICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgorCQkgICAgICAgKi8KKwkJICAgIH0KKwkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KKwkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KKwl9CQkJLyogaWYgKDAuMGUwKSAqLworICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLworICByZXR1cm4gKHJldHVybl92YWx1ZSk7Cit9CisMCisvKgorICoJCW1kX2F0b2YoKQorICoKKyAqIEluOglpbnB1dF9saW5lX3BvaW50ZXIgLT4gdGhlIDFzdCBjaGFyYWN0ZXIgb2YgYSBmbG9hdGluZy1wb2ludAorICoJCW51bWJlci4KKyAqCTEgbGV0dGVyIGRlbm90aW5nIHRoZSB0eXBlIG9mIHN0YXRlbWVudCB0aGF0IHdhbnRzIGEKKyAqCQliaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJldHVybmVkLgorICoJQWRkcmVzcyBvZiB3aGVyZSB0byBidWlsZCBmbG9hdGluZyBwb2ludCBsaXRlcmFsLgorICoJCUFzc3VtZWQgdG8gYmUgJ2JpZyBlbm91Z2gnLgorICoJQWRkcmVzcyBvZiB3aGVyZSB0byByZXR1cm4gc2l6ZSBvZiBsaXRlcmFsIChpbiBjaGFycykuCisgKgorICogT3V0OglJbnB1dF9saW5lX3BvaW50ZXIgLT4gb2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KKyAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCisgKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgorICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgorICovCisKK2NoYXIgKgorbWRfYXRvZiAod2hhdF9zdGF0ZW1lbnRfdHlwZSwgbGl0ZXJhbFAsIHNpemVQKQorICAgICBjaGFyIHdoYXRfc3RhdGVtZW50X3R5cGU7CisgICAgIGNoYXIgKmxpdGVyYWxQOworICAgICBpbnQgKnNpemVQOworeworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfUFJFQ0lTSU9OXTsKKyAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OworICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOworICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7CisKKyAgc3dpdGNoICh3aGF0X3N0YXRlbWVudF90eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoJCQkvKiAuZmZsb2F0ICovCisgICAgY2FzZSAnZCc6CQkJLyogLmRmbG9hdCAqLworICAgICAga2luZF9vZl9mbG9hdCA9IHdoYXRfc3RhdGVtZW50X3R5cGU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBraW5kX29mX2Zsb2F0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIH07CisKKyAgaWYgKGtpbmRfb2ZfZmxvYXQpCisgICAgeworICAgICAgcmVnaXN0ZXIgTElUVExFTlVNX1RZUEUgKmxpbWl0OworCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBhdG9mX3RhaG9lIChpbnB1dF9saW5lX3BvaW50ZXIsCisJCQkJICAgICAgIGtpbmRfb2ZfZmxvYXQsCisJCQkJICAgICAgIHdvcmRzKTsKKyAgICAgIC8qCisgICAgICAgKiBUaGUgYXRvZl90YWhvZSgpIGJ1aWxkcyB1cCAxNi1iaXQgbnVtYmVycy4KKyAgICAgICAqIFNpbmNlIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBiZSBydW5uaW5nIG9uCisgICAgICAgKiBhIGRpZmZlcmVudC1lbmRpYW4gbWFjaGluZSwgYmUgdmVyeSBjYXJlZnVsIGFib3V0CisgICAgICAgKiBjb252ZXJ0aW5nIHdvcmRzIHRvIGNoYXJzLgorICAgICAgICovCisgICAgICBudW1iZXJfb2ZfY2hhcnMgPSAoa2luZF9vZl9mbG9hdCA9PSAnZicgPyBGX1BSRUNJU0lPTl9DSEFSUyA6CisJCQkgKGtpbmRfb2ZfZmxvYXQgPT0gJ2QnID8gRF9QUkVDSVNJT05fQ0hBUlMgOiAwKSk7CisgICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYX1BSRUNJU0lPTiAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworICAgICAgZm9yIChsaXR0bGVudW1fcG9pbnRlciA9IHdvcmRzOworCSAgIGxpdHRsZW51bV9wb2ludGVyIDwgbGltaXQ7CisJICAgbGl0dGxlbnVtX3BvaW50ZXIrKykKKwl7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdGVyYWxQLCAqbGl0dGxlbnVtX3BvaW50ZXIsCisJCQkgICAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisJICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKwl9OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7CisgICAgfTsKKworICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7CisgIHJldHVybiBraW5kX29mX2Zsb2F0ID8gMCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOworfQorCisvKiBhdG9mX3RhaG9lLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvYXRvZi12YXguYyBiL2dhcy9jb25maWcvYXRvZi12YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI5MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9hdG9mLXZheC5jCkBAIC0wLDAgKzEsNTE3IEBACisvKiBhdG9mX3ZheC5jIC0gdHVybiBhIEZsb251bSBpbnRvIGEgVkFYIGZsb2F0aW5nIHBvaW50IG51bWJlcgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCA5MywgOTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhcy5oIgorCitzdGF0aWMgaW50IGF0b2ZfdmF4X3NpemVvZiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7CitzdGF0aWMgaW50IHdoYXRfa2luZF9vZl9mbG9hdCBQQVJBTVMgKChpbnQsIGludCAqLCBsb25nICopKTsKK3N0YXRpYyBjaGFyICphdG9mX3ZheCBQQVJBTVMgKChjaGFyICosIGludCwgTElUVExFTlVNX1RZUEUgKikpOworCisvKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KKyNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoOCkKKyNkZWZpbmUgSF9QUkVDSVNJT04gKDgpCisjZGVmaW5lIEdfUFJFQ0lTSU9OICg0KQorI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKKyNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCisKKy8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCisjZGVmaW5lIEdVQVJEICgyKQorCitpbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKKwkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7CisKKy8qIE51bWJlciBvZiBjaGFycyBpbiBmbG9udW0gdHlwZSAnbGV0dGVyJy4gKi8KK3N0YXRpYyBpbnQKK2F0b2ZfdmF4X3NpemVvZiAobGV0dGVyKQorICAgICBpbnQgbGV0dGVyOworeworICBpbnQgcmV0dXJuX3ZhbHVlOworCisgIC8qCisgICAqIFBlcm1pdHRpbmcgdXBwZXJjYXNlIGxldHRlcnMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KKyAgICogUGxlYXNlIHVzZSBvbmx5IGxvd2VyLWNhc2VkIGxldHRlcnMgaW4gY2FzZSB0aGUgdXBwZXItY2FzZWQKKyAgICogb25lcyBiZWNvbWUgdW5zdXBwb3J0ZWQhCisgICAqLworICBzd2l0Y2ggKGxldHRlcikKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgICByZXR1cm5fdmFsdWUgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICBjYXNlICdnJzoKKyAgICBjYXNlICdHJzoKKyAgICAgIHJldHVybl92YWx1ZSA9IDg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2gnOgorICAgIGNhc2UgJ0gnOgorICAgICAgcmV0dXJuX3ZhbHVlID0gMTY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm5fdmFsdWUgPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gKHJldHVybl92YWx1ZSk7Cit9CQkJCS8qIGF0b2ZfdmF4X3NpemVvZiAqLworCitzdGF0aWMgY29uc3QgbG9uZyBtYXNrW10gPQoreworICAweDAwMDAwMDAwLAorICAweDAwMDAwMDAxLAorICAweDAwMDAwMDAzLAorICAweDAwMDAwMDA3LAorICAweDAwMDAwMDBmLAorICAweDAwMDAwMDFmLAorICAweDAwMDAwMDNmLAorICAweDAwMDAwMDdmLAorICAweDAwMDAwMGZmLAorICAweDAwMDAwMWZmLAorICAweDAwMDAwM2ZmLAorICAweDAwMDAwN2ZmLAorICAweDAwMDAwZmZmLAorICAweDAwMDAxZmZmLAorICAweDAwMDAzZmZmLAorICAweDAwMDA3ZmZmLAorICAweDAwMDBmZmZmLAorICAweDAwMDFmZmZmLAorICAweDAwMDNmZmZmLAorICAweDAwMDdmZmZmLAorICAweDAwMGZmZmZmLAorICAweDAwMWZmZmZmLAorICAweDAwM2ZmZmZmLAorICAweDAwN2ZmZmZmLAorICAweDAwZmZmZmZmLAorICAweDAxZmZmZmZmLAorICAweDAzZmZmZmZmLAorICAweDA3ZmZmZmZmLAorICAweDBmZmZmZmZmLAorICAweDFmZmZmZmZmLAorICAweDNmZmZmZmZmLAorICAweDdmZmZmZmZmLAorICAweGZmZmZmZmZmCit9OworDAorCisvKiBTaGFyZWQgYmV0d2VlbiBmbG9udW1fZ2VuMnZheCBhbmQgbmV4dF9iaXRzICovCitzdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07CitzdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOworc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOworCitzdGF0aWMgaW50CituZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQorICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Cit7CisgIGludCByZXR1cm5fdmFsdWU7CisKKyAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCisgICAgeworICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKKyAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07CisgICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOworICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOworICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKKyAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQorCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7CisgICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKKyAgICB9CisgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK21ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQorICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Cit7CisgICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLworfQorDAorc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLword2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQorICAgICBpbnQgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KKyAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCisgICAgIGxvbmcgKmV4cG9uZW50X2JpdHNQOwkvKiBOdW1iZXIgb2YgZXhwb25lbnQgYml0cy4gKi8KK3sKKyAgaW50IHJldHZhbDsJCQkvKiAwOiBPSy4gKi8KKworICByZXR2YWwgPSAwOworICBzd2l0Y2ggKGxldHRlcikKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgICAqcHJlY2lzaW9uUCA9IEZfUFJFQ0lTSU9OOworICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICAqcHJlY2lzaW9uUCA9IERfUFJFQ0lTSU9OOworICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZyc6CisgICAgICAqcHJlY2lzaW9uUCA9IEdfUFJFQ0lTSU9OOworICAgICAgKmV4cG9uZW50X2JpdHNQID0gMTE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2gnOgorICAgICAgKnByZWNpc2lvblAgPSBIX1BSRUNJU0lPTjsKKyAgICAgICpleHBvbmVudF9iaXRzUCA9IDE1OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dmFsID0gNjk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAocmV0dmFsKTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCQkJCQkJCQkJKgorICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgorICoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgorICoJb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUgYnl0ZXMvd29yZAkqCisgKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCisgKgkJCQkJCQkJCSoKKyBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLworYXRvZl92YXggKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKKyAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCisgICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KKyAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCit7CisgIEZMT05VTV9UWVBFIGY7CisgIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07CisgIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KKyAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCisgIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCisgIGNoYXIgKnJldHVybl92YWx1ZTsKKyAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KKyAgbG9uZyBleHBvbmVudF9iaXRzOworCisgIHJldHVybl92YWx1ZSA9IHN0cjsKKyAgZi5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKKyAgZi5oaWdoID0gTlVMTDsKKyAgZi5sZWFkZXIgPSBOVUxMOworICBmLmV4cG9uZW50ID0gMDsKKyAgZi5zaWduID0gJ1wwJzsKKworICBpZiAod2hhdF9raW5kX29mX2Zsb2F0ICh3aGF0X2tpbmQsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKSkKKyAgICB7CisgICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiBXZSBsb3N0LiAqLworICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworICAgIH0KKworICBpZiAocmV0dXJuX3ZhbHVlKQorICAgIHsKKyAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKKworICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCisgICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLworICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCisgICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKKworICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCisJeworCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZmxvbnVtX2dlbjJ2YXggKHdoYXRfa2luZCwgJmYsIHdvcmRzKSkKKwkgICAgeworCSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorICByZXR1cm4gKHJldHVybl92YWx1ZSk7Cit9CQkJCS8qIGF0b2ZfdmF4KCkgKi8KKwwKKy8qCisgKiBJbjogYSBmbG9udW0sIGEgdmF4IGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KKyAqIE91dDogYSB2YXggZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCisgKi8KKworaW50CQkJCS8qIDA6IE9LLiAqLworZmxvbnVtX2dlbjJ2YXggKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQorICAgICBjaGFyIGZvcm1hdF9sZXR0ZXI7CS8qIE9uZSBvZiAnZCcgJ2YnICdnJyAnaCcuICovCisgICAgIEZMT05VTV9UWVBFICpmOworICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCit7CisgIExJVFRMRU5VTV9UWVBFICpscDsKKyAgaW50IHByZWNpc2lvbjsKKyAgbG9uZyBleHBvbmVudF9iaXRzOworICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCA9PSBPSy4gKi8KKworICByZXR1cm5fdmFsdWUgPSB3aGF0X2tpbmRfb2ZfZmxvYXQgKGZvcm1hdF9sZXR0ZXIsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKTsKKworICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCisgICAgeworICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCisJeworCSAgLyogMC4wZTAgc2Vlbi4gKi8KKwkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbG9uZyBleHBvbmVudF8xOworCSAgbG9uZyBleHBvbmVudF8yOworCSAgbG9uZyBleHBvbmVudF8zOworCSAgbG9uZyBleHBvbmVudF80OworCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOworCSAgTElUVExFTlVNX1RZUEUgd29yZDE7CisKKwkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLworCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQorCSAgICB7CisJICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOworCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7CisJICAgIH0KKwkgIC8qCisJCQkgKiBBbGwgdmF4ZW4gZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyAoc28gZmFyKSBoYXZlOgorCQkJICogQml0IDE1IGlzIHNpZ24gYml0LgorCQkJICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCisJCQkgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCisJCQkgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgorCQkJICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCisJCQkgKgorCQkJICogQWxsIHRoaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGEgS0YxMT8/IChXaGljaCBpcyBzdGlsbCBmYXN0ZXIKKwkJCSAqIHRoYW4gbG90cyBvZiB2YXhlbiBJIGNhbiB0aGluayBvZiwgYnV0IGl0IGFsc28gaGFzIGhpZ2hlcgorCQkJICogbWFpbnRlbmFuY2UgY29zdHMgLi4uIHNpZ2gpLgorCQkJICoKKwkJCSAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgorCQkJICogbWFudGlzc2EuCisJCQkgKi8KKworI2lmZGVmIE5FVkVSCQkJLyoqKioqKiogVGhpcyB6ZXJvaW5nIHNlZW1zIHJlZHVuZGFudCAtIERlYW4gM21heTg2ICoqKioqKioqKiovCisJICAvKgorCQkJICogTm8gbWF0dGVyIGhvdyBmZXcgYml0cyB3ZSBnb3QgYmFjayBmcm9tIHRoZSBhdG9mKCkKKwkJCSAqIHJvdXRpbmUsIGFkZCBlbm91Z2ggemVybyBsaXR0bGVudW1zIHNvIHRoZSByZXN0IG9mIHRoZQorCQkJICogY29kZSB3b24ndCBydW4gb3V0IG9mICJzaWduaWZpY2FudCIgYml0cyBpbiB0aGUgbWFudGlzc2EuCisJCQkgKi8KKwkgIHsKKwkgICAgTElUVExFTlVNX1RZUEUgKmx0cDsKKwkgICAgZm9yIChsdHAgPSBmLT5sZWFkZXIgKyAxOworCQkgbHRwIDw9IGYtPmxvdyArIHByZWNpc2lvbjsKKwkJIGx0cCsrKQorCSAgICAgIHsKKwkJKmx0cCA9IDA7CisJICAgICAgfQorCSAgfQorI2VuZGlmCisKKwkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJICBsaXR0bGVudW1fcG9pbnRlciA9IGYtPmxlYWRlcjsKKwkgIGxpdHRsZW51bV9lbmQgPSBmLT5sb3c7CisJICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCisJICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsKKwkgICAgICAgIW5leHRfYml0cyAoMSk7CisJICAgICAgIGV4cG9uZW50X3NraXBwYWdlKyspOzsKKworCSAgZXhwb25lbnRfMSA9IGYtPmV4cG9uZW50ICsgZi0+bGVhZGVyICsgMSAtIGYtPmxvdzsKKwkgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbiBmLT5sZWFkZXIuICovCisJICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKKwkgIC8qIFJhZGl4IDIuICovCisJICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOworCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLworCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKKwkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KKworCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKKwkgICAgeworCSAgICAgIC8qCisJCQkJICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCisJCQkJICovCisKKwkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7CisKKwkgICAgICAvKgorCQkJCSAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKKwkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KKwkJCQkgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgorCQkJCSAqLworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBscCA9IHdvcmRzOworCisJICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCisJICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLworCSAgICAgIHdvcmQxID0gKCgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQorCQkgICAgICAgfCAoKGYtPnNpZ24gPT0gJysnKSA/IDAgOiAweDgwMDApCisJCSAgICAgICB8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKSk7CisJICAgICAgKmxwKysgPSB3b3JkMTsKKworCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLworCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQorCQl7CisJCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOworCQl9CisKKwkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKKwkJeworCQkgIC8qCisJCQkJCSAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KKwkJCQkJICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCisJCQkJCSAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAorCQkJCQkgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQorCQkJCQkgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCisJCQkJCSAqIElzIHRoYXQgY2xlYXI/CisJCQkJCSAqLworCisJCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKKworCQkgIC8qCisJCQkJCSAgI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQorCQkJCQkgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCisJCQkJCSAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5CisJCQkJCSAgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKKwkJCQkJICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0CisJCQkJCSAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KKwkJCQkJICAjZW5kaWYKKwkJCQkJICAqLworCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOworCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKKwkJICAgICAgIGxwLS0pCisJCSAgICB7CisJCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7CisJCSAgICAgICpscCA9IGNhcnJ5OworCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOworCQkgICAgfQorCisJCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQorCQkgICAgeworCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7CisJCSAgICAgIC8qCisJCQkJCQkgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCisJCQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KKwkJCQkJCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCisJCQkJCQkgKi8KKwkJICAgIH0KKwkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KKwkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KKwl9CQkJLyogaWYgKDAuMGUwKSAqLworICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLworICByZXR1cm4gKHJldHVybl92YWx1ZSk7Cit9CQkJCS8qIGZsb251bV9nZW4ydmF4KCkgKi8KKworCisvKiBKRiB0aGlzIHVzZWQgdG8gYmUgaW4gdmF4LmMgYnV0IHRoaXMgbG9va3MgbGlrZSBhIGJldHRlciBwbGFjZSBmb3IgaXQgKi8KKworLyoKKyAqCQltZF9hdG9mKCkKKyAqCisgKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT50aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50CisgKgkJbnVtYmVyLgorICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQorICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCisgKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCisgKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCisgKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KKyAqCisgKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+b2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KKyAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCisgKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgorICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgorICovCisKKyNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAoOCkJLyogRm9yIC5oZmxvYXRzLiAqLworCitjaGFyICoKK21kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKKyAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7CisgICAgIGNoYXIgKmxpdGVyYWxQOworICAgICBpbnQgKnNpemVQOworeworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TXTsKKyAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OworICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOworICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtUDsKKworICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCisgICAgeworICAgIGNhc2UgJ0YnOgkJCS8qIC5mbG9hdCAqLworICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KKyAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZic7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0QnOgkJCS8qIC5kb3VibGUgKi8KKyAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCisgICAgICBraW5kX29mX2Zsb2F0ID0gJ2QnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdnJzoJCQkvKiAuZ2Zsb2F0ICovCisgICAgICBraW5kX29mX2Zsb2F0ID0gJ2cnOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdoJzoJCQkvKiAuaGZsb2F0ICovCisgICAgICBraW5kX29mX2Zsb2F0ID0gJ2gnOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAga2luZF9vZl9mbG9hdCA9IDA7CisgICAgICBicmVhazsKKyAgICB9OworCisgIGlmIChraW5kX29mX2Zsb2F0KQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaW1pdDsKKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYXRvZl92YXggKGlucHV0X2xpbmVfcG9pbnRlciwKKwkJCQkgICAgIGtpbmRfb2ZfZmxvYXQsCisJCQkJICAgICB3b3Jkcyk7CisgICAgICAvKgorICAgICAgICogVGhlIGF0b2ZfdmF4KCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgorICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KKyAgICAgICAqIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKKyAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCisgICAgICAgKi8KKyAgICAgIG51bWJlcl9vZl9jaGFycyA9IGF0b2ZfdmF4X3NpemVvZiAoa2luZF9vZl9mbG9hdCk7CisgICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworICAgICAgZm9yIChsaXR0bGVudW1QID0gd29yZHM7IGxpdHRsZW51bVAgPCBsaW1pdDsgbGl0dGxlbnVtUCsrKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1QLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisJICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKwl9OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7CisgICAgfTsKKworICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7CisgIHJldHVybiBraW5kX29mX2Zsb2F0ID8gMCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOworfQorCisvKiBlbmQgb2YgYXRvZi12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVkNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAiZW11bC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqCitpMzg2Y29mZl9iZmRfbmFtZSAoKQoreworICBhYm9ydCAoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgZW11bF9iZmRfbmFtZQlpMzg2Y29mZl9iZmRfbmFtZQorI2RlZmluZSBlbXVsX2Zvcm1hdAkmY29mZl9mb3JtYXRfb3BzCisKKyNkZWZpbmUgZW11bF9uYW1lCSJpMzg2Y29mZiIKKyNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBpMzg2Y29mZgorI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKKyNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZlbGYuYyBiL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NzAxZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAiZW11bC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqCitpMzg2ZWxmX2JmZF9uYW1lICgpCit7CisgIGFib3J0ICgpOworICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBlbXVsX2JmZF9uYW1lCWkzODZlbGZfYmZkX25hbWUKKyNkZWZpbmUgZW11bF9mb3JtYXQJJmVsZl9mb3JtYXRfb3BzCisKKyNkZWZpbmUgZW11bF9uYW1lCSJpMzg2ZWxmIgorI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIGkzODZlbGYKKyNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCisjaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYyBiL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJmNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgImVtdWwuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKm1pcHNlY29mZl9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK21pcHNlY29mZl9iZmRfbmFtZSAoKQoreworICBhYm9ydCAoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWNvZmZfYmZkX25hbWUKKyNkZWZpbmUgZW11bF9mb3JtYXQJJmVjb2ZmX2Zvcm1hdF9vcHMKKworI2RlZmluZSBlbXVsX25hbWUJIm1pcHNiZWNvZmYiCisjZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlY29mZgorI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDEKKyNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgorCisjdW5kZWYgIGVtdWxfbmFtZQorI3VuZGVmICBlbXVsX3N0cnVjdF9uYW1lCisjdW5kZWYgIGVtdWxfZGVmYXVsdF9lbmRpYW4KKworI2RlZmluZSBlbXVsX25hbWUJIm1pcHNsZWNvZmYiCisjZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2xlY29mZgorI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKKyNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgorCisjdW5kZWYgZW11bF9uYW1lCisjdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQorI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KKworI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlY29mZiIKKyNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzZWNvZmYKKyNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAyCisjaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMgYi9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTcyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgImVtdWwuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKm1pcHNlbGZfYmZkX25hbWUgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgY29uc3QgY2hhciAqCittaXBzZWxmX2JmZF9uYW1lICgpCit7CisgIGFib3J0ICgpOworICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBlbXVsX2JmZF9uYW1lCW1pcHNlbGZfYmZkX25hbWUKKyNkZWZpbmUgZW11bF9mb3JtYXQJJmVsZl9mb3JtYXRfb3BzCisKKyNkZWZpbmUgZW11bF9uYW1lCSJtaXBzYmVsZiIKKyNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzYmVsZgorI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDEKKyNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgorCisjdW5kZWYgIGVtdWxfbmFtZQorI3VuZGVmICBlbXVsX3N0cnVjdF9uYW1lCisjdW5kZWYgIGVtdWxfZGVmYXVsdF9lbmRpYW4KKworI2RlZmluZSBlbXVsX25hbWUJIm1pcHNsZWxmIgorI2RlZmluZSBlbXVsX3N0cnVjdF9uYW1lIG1pcHNsZWxmCisjZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMAorI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCisKKyN1bmRlZiBlbXVsX25hbWUKKyN1bmRlZiBlbXVsX3N0cnVjdF9uYW1lCisjdW5kZWYgZW11bF9kZWZhdWx0X2VuZGlhbgorCisjZGVmaW5lIGVtdWxfbmFtZQkibWlwc2VsZiIKKyNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzZWxmCisjZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4gMgorI2luY2x1ZGUgImVtdWwtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2dvMzIuY2ZnIGIvZ2FzL2NvbmZpZy9nbzMyLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU5Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9nbzMyLmNmZwpAQCAtMCwwICsxLDkzIEBACisvKiBjb25maWcuaCBmb3IgZ28zMiAqLw0KKw0KKyNkZWZpbmUgSTM4NkNPRkYgMQ0KKw0KKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovDQorI3VuZGVmIENfQUxMT0NBDQorDQorLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLg0KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovDQorI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5EDQorDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovDQorI3VuZGVmIEhBVkVfQUxMT0NBX0gNCisNCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLw0KKyN1bmRlZiBpbmxpbmUNCisNCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUNCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUNCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuDQorCVNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMNCisJU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzDQorCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duDQorICovDQorI3VuZGVmIFNUQUNLX0RJUkVDVElPTg0KKw0KKy8qIFNob3VsZCBnYXMgdXNlIGhpZ2gtbGV2ZWwgQkZEIGludGVyZmFjZXM/ICAqLw0KKyN1bmRlZiBCRkRfQVNTRU1CTEVSDQorDQorLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLA0KKyAgIHNpbmNlIGJ5dGUgb3JkZXJzIGFuZCB2YWx1ZSBzaXplcyBkb24ndCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8NCisjdW5kZWYgQ1JPU1NfQ09NUElMRQ0KKw0KKy8qIFNvbWUgZ2FzIGNvZGUgd2FudHMgdG8ga25vdyB0aGVzZSBwYXJhbWV0ZXJzLiAgKi8NCisjZGVmaW5lIFRBUkdFVF9BTElBUwkJImkzODYiDQorI2RlZmluZSBUQVJHRVRfQ1BVCQkiaTM4NiINCisjZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwJImkzODYtaTM4NiINCisjZGVmaW5lIFRBUkdFVF9PUwkJImRqZ3BwIg0KKyNkZWZpbmUgVEFSR0VUX1ZFTkRPUgkJImRqZ3BwIg0KKw0KKy8qIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIGZvciBleGFtcGxlIERPUywgcmVxdWlyZSB0aGUgdXNlIG9mICJ3YiIgbW9kZSB3aGVuDQorICAgb3BlbmluZyBhIGJpbmFyeSBmaWxlIGZvciB3cml0aW5nLiAgSWYgb25seSAidyIgaXMgdXNlZCwgdGhlIGZpbGUgd2lsbCBub3QNCisgICBiZSBjb3JyZWN0LiAgSG93ZXZlciwgc29tZSBvdGhlciBzeXN0ZW1zIHJlamVjdCBzdWNoIGEgbW9kZS4gIFRoaXMgaW5kaWNhdGVzDQorICAgd2hpY2ggLi4vaW5jbHVkZS9mb3Blbi0qLmggaGVhZGVyIGZpbGUgd2Ugd2FudCB0byBpbmNsdWRlLCBzbyB0aGF0IHdlIGNhbg0KKyAgIGdldCBtYWNyb3MgdGhhdCdsbCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoaXMgc3lzdGVtLiAgKi8NCisjZGVmaW5lIFdBTlRfRk9QRU5fQklOIDENCisNCisvKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLw0KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQw0KKw0KKy8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLw0KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUNCisNCisvKiBTb21ldGltZXMgZXJybm8uaCBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaXRzZWxmLiAgKi8NCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTw0KKw0KKyNkZWZpbmUgTUFOWV9TRUdNRU5UUyAxDQorDQorLyogTmVlZGVkIG9ubHkgZm9yIHNwYXJjIGNvbmZpZ3VyYXRpb24gKi8NCisjdW5kZWYgc3BhcmN2OQ0KKw0KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVtb3ZlIGZ1bmN0aW9uLiAgKi8NCisjZGVmaW5lIEhBVkVfUkVNT1ZFIDENCisNCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovDQorI2RlZmluZSBIQVZFX1VOTElOSyAxDQorDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLw0KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDENCisNCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLw0KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxDQorDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8NCisjZGVmaW5lIEhBVkVfU1REQVJHX0ggMQ0KKw0KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovDQorI2RlZmluZSBIQVZFX1NURExJQl9IIDENCisNCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLw0KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxDQorDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovDQorI3VuZGVmIEhBVkVfU1RSSU5HU19IDQorDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8NCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQ0KKw0KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovDQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDENCisNCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8NCisjdW5kZWYgSEFWRV9WQVJBUkdTX0gNCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2l0YmwtbWlwcy5oIGIvZ2FzL2NvbmZpZy9pdGJsLW1pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ4MmJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9pdGJsLW1pcHMuaApAQCAtMCwwICsxLDQ3IEBACisKKy8qIGl0YmwtbWlwcy5oCisKKyAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIERlZmluZXMgZm9yIE1pcHMgaXRibCBjb3Agc3VwcG9ydCAqLworCisjaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKKworLyogVmFsdWVzIGZvciBwcm9jZXNzb3JzIHdpbGwgYmUgZnJvbSAwIHRvIE5VTUJFUl9PRl9QUk9DRVNTT1JTLTEgKi8KKyNkZWZpbmUgTlVNQkVSX09GX1BST0NFU1NPUlMgNAorI2RlZmluZSBNQVhfQklUUE9TIDMxCisKKy8qIE1pcHMgc3BlY2lmaWNzICovCisjZGVmaW5lIE1JUFNfT1BDT0RFX0NPUDAgKDB4MjEpCS8qIENPUHorQ08sIGJpdHMgMzEtMjU6IDAxMDB6ejEgKi8KKyNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKE1JUFNfT1BDT0RFX0NPUDB8ejw8MSk8PDI1KQorI2RlZmluZSBNSVBTX0lTX0NPUF9JTlNOKGluc24pICgoTUlQU19PUENPREVfQ09QMCYoaW5zbj4+MjUpKSBcCisJPT0gTUlQU19PUENPREVfQ09QMCkKKyNkZWZpbmUgTUlQU19ERUNPREVfQ09QX05VTShpbnNuKSAoKH5NSVBTX09QQ09ERV9DT1AwJihpbnNuPj4yNSkpPj4xKQorI2RlZmluZSBNSVBTX0RFQ09ERV9DT1BfQ09GVU4oaW5zbikgKCh+TUlQU19FTkNPREVfQ09QX05VTSgzKSkmKGluc24pKQorCisvKiBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBnZW5lcmljIGNvZGUgKi8KKyNkZWZpbmUgSVRCTF9JU19JTlNOKGluc24pIE1JUFNfSVNfQ09QX0lOU04oaW5zbikKKyNkZWZpbmUgSVRCTF9ERUNPREVfUE5VTShpbnNuKSBNSVBTX0RFQ09ERV9DT1BfTlVNKGluc24pCisjZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQorCisjZGVmaW5lIElUQkxfT1BDT0RFX1NUUlVDVCBtaXBzX29wY29kZQorI2RlZmluZSBJVEJMX09QQ09ERVMgbWlwc19vcGNvZGVzCisjZGVmaW5lIElUQkxfTlVNX09QQ09ERVMgTlVNT1BDT0RFUworI2RlZmluZSBJVEJMX05VTV9NQUNST1MgTV9OVU1fTUFDUk9TCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UuaCBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzEzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL202OGstcGFyc2UuaApAQCAtMCwwICsxLDI4MyBAQAorLyogbTY4ay1wYXJzZS5oIC0tIGhlYWRlciBmaWxlIGZvciBtNjhrIGFzc2VtYmxlcgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBNNjhLX1BBUlNFX0gKKyNkZWZpbmUgTTY4S19QQVJTRV9ICisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGluZ3Mgd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZQorICAgb3BlcmFuZCBwYXJzZXIgaW4gbTY4ay55IGFuZCB0aGUgbTY4ayBhc3NlbWJsZXIgcHJvcGVyIGluCisgICB0Yy1tNjhrLmMuICAqLworCisvKiBUaGUgdmFyaW91cyBtNjhrIHJlZ2lzdGVycy4gICovCisKKy8qIERBVEEgYW5kIEFERFIgaGF2ZSB0byBiZSBjb250aWd1b3VzLCBzbyB0aGF0IHJlZy1EQVRBIGdpdmVzCisgICAwLTc9PWRhdGEgcmVnLCA4LTE1PT1hZGRyIHJlZyBmb3Igb3BlcmFuZHMgdGhhdCB0YWtlIGJvdGggdHlwZXMuCisKKyAgIFdlIGRvbid0IHVzZSBmb3JtcyBsaWtlICJBRERSMCA9IEFERFIiIGhlcmUgYmVjYXVzZSB0aGlzIGZpbGUgaXMKKyAgIGxpa2VseSB0byBiZSB1c2VkIG9uIGFuIEFwb2xsbywgYW5kIHRoZSBicm9rZW4gQXBvbGxvIGNvbXBpbGVyCisgICBnaXZlcyBhbiBgdW5kZWZpbmVkIHZhcmlhYmxlJyBlcnJvciBpZiB3ZSBkbyB0aGF0LCBhY2NvcmRpbmcgdG8KKyAgIHRyb3lAY2JtZS51bnN3LmVkdS5hdS4gICovCisKKyNkZWZpbmUgREFUQSBEQVRBMAorI2RlZmluZSBBRERSIEFERFIwCisjZGVmaW5lIFNQIEFERFI3CisjZGVmaW5lIEJBRCBCQUQwCisjZGVmaW5lIEJBQyBCQUMwCisKK2VudW0gbTY4a19yZWdpc3RlcgoreworICBEQVRBMCA9IDEsCQkJLyogICAxLSA4ID09IGRhdGEgcmVnaXN0ZXJzIDAtNyAqLworICBEQVRBMSwKKyAgREFUQTIsCisgIERBVEEzLAorICBEQVRBNCwKKyAgREFUQTUsCisgIERBVEE2LAorICBEQVRBNywKKworICBBRERSMCwKKyAgQUREUjEsCisgIEFERFIyLAorICBBRERSMywKKyAgQUREUjQsCisgIEFERFI1LAorICBBRERSNiwKKyAgQUREUjcsCisKKyAgRlAwLAkJCQkvKiBFaWdodCBGUCByZWdpc3RlcnMgKi8KKyAgRlAxLAorICBGUDIsCisgIEZQMywKKyAgRlA0LAorICBGUDUsCisgIEZQNiwKKyAgRlA3LAorCisgIENPUDAsCQkJCS8qIENvLXByb2Nlc3NvciAjMC0jNyAqLworICBDT1AxLAorICBDT1AyLAorICBDT1AzLAorICBDT1A0LAorICBDT1A1LAorICBDT1A2LAorICBDT1A3LAorCisgIFBDLAkJCQkvKiBQcm9ncmFtIGNvdW50ZXIgKi8KKyAgWlBDLAkJCQkvKiBIYWNrIGZvciBQcm9ncmFtIHNwYWNlLCBidXQgMCBhZGRyZXNzaW5nICovCisgIFNSLAkJCQkvKiBTdGF0dXMgUmVnICovCisgIENDUiwJCQkJLyogQ29uZGl0aW9uIGNvZGUgUmVnICovCisKKyAgLyogVGhlc2UgaGF2ZSB0byBiZSBncm91cGVkIHRvZ2V0aGVyIGZvciB0aGUgbW92ZWMgaW5zdHJ1Y3Rpb24gdG8gd29yay4gKi8KKyAgVVNQLAkJCQkvKiAgVXNlciBTdGFjayBQb2ludGVyICovCisgIElTUCwJCQkJLyogIEludGVycnVwdCBzdGFjayBwb2ludGVyICovCisgIFNGQywKKyAgREZDLAorICBDQUNSLAorICBWQlIsCisgIENBQVIsCisgIE1TUCwKKyAgSVRUMCwKKyAgSVRUMSwKKyAgRFRUMCwKKyAgRFRUMSwKKyAgTU1VU1IsCisgIFRDLAorICBTUlAsCisgIFVSUCwKKyAgQlVTQ1IsCQkJLyogNjgwNjAgYWRkZWQgdGhlc2UgKi8KKyAgUENSLAorICBST01CQVIsCQkJLyogbWNmNTIwMCBhZGRlZCB0aGVzZSAqLworICBSQU1CQVIwLAorICBSQU1CQVIxLAorICBNQkFSLAorI2RlZmluZSBsYXN0X21vdmVjX3JlZyBNQkFSCisgIC8qIGVuZCBvZiBtb3ZlYyBvcmRlcmluZyBjb25zdHJhaW50cyAqLworCisgIEZQSSwKKyAgRlBTLAorICBGUEMsCisKKyAgRFJQLAkJCQkvKiA2ODg1MSBvciA2ODAzMCBNTVUgcmVncyAqLworICBDUlAsCisgIENBTCwKKyAgVkFMLAorICBTQ0MsCisgIEFDLAorICBCQUQwLAorICBCQUQxLAorICBCQUQyLAorICBCQUQzLAorICBCQUQ0LAorICBCQUQ1LAorICBCQUQ2LAorICBCQUQ3LAorICBCQUMwLAorICBCQUMxLAorICBCQUMyLAorICBCQUMzLAorICBCQUM0LAorICBCQUM1LAorICBCQUM2LAorICBCQUM3LAorICBQU1IsCQkJCS8qIGFrYSBNTVVTUiBvbiA2ODAzMCAoYnV0IG5vdCBNTVVTUiBvbiA2ODA0MCkKKwkJCQkgICBhbmQgQUNVU1Igb24gNjhlYzAzMCAqLworICBQQ1NSLAorCisgIElDLAkJCQkvKiBpbnN0cnVjdGlvbiBjYWNoZSB0b2tlbiAqLworICBEQywJCQkJLyogZGF0YSBjYWNoZSB0b2tlbiAqLworICBOQywJCQkJLyogbm8gY2FjaGUgdG9rZW4gKi8KKyAgQkMsCQkJCS8qIGJvdGggY2FjaGVzIHRva2VuICovCisKKyAgVFQwLAkJCQkvKiA2ODAzMCBhY2Nlc3MgY29udHJvbCB1bml0IHJlZ3MgKi8KKyAgVFQxLAorCisgIFpEQVRBMCwJCQkvKiBzdXBwcmVzc2VkIGRhdGEgcmVnaXN0ZXJzLiAgKi8KKyAgWkRBVEExLAorICBaREFUQTIsCisgIFpEQVRBMywKKyAgWkRBVEE0LAorICBaREFUQTUsCisgIFpEQVRBNiwKKyAgWkRBVEE3LAorCisgIFpBRERSMCwJCQkvKiBzdXBwcmVzc2VkIGFkZHJlc3MgcmVnaXN0ZXJzLiAgKi8KKyAgWkFERFIxLAorICBaQUREUjIsCisgIFpBRERSMywKKyAgWkFERFI0LAorICBaQUREUjUsCisgIFpBRERSNiwKKyAgWkFERFI3LAorfTsKKworLyogU2l6ZSBpbmZvcm1hdGlvbi4gICovCisKK2VudW0gbTY4a19zaXplCit7CisgIC8qIFVuc3BlY2lmaWVkLiAgKi8KKyAgU0laRV9VTlNQRUMsCisKKyAgLyogQnl0ZS4gICovCisgIFNJWkVfQllURSwKKworICAvKiBXb3JkICgyIGJ5dGVzKS4gICovCisgIFNJWkVfV09SRCwKKworICAvKiBMb25nd29yZCAoNCBieXRlcykuICAqLworICBTSVpFX0xPTkcKK307CisKKy8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGluZGV4IHJlZ2lzdGVyLiAgKi8KKworc3RydWN0IG02OGtfaW5kZXhyZWcKK3sKKyAgLyogVGhlIGluZGV4IHJlZ2lzdGVyIGl0c2VsZi4gICovCisgIGVudW0gbTY4a19yZWdpc3RlciByZWc7CisKKyAgLyogVGhlIHNpemUgdG8gdXNlLiAgKi8KKyAgZW51bSBtNjhrX3NpemUgc2l6ZTsKKworICAvKiBUaGUgdmFsdWUgdG8gc2NhbGUgYnkuICAqLworICBpbnQgc2NhbGU7Cit9OworCisjaWZkZWYgT0JKX0VMRgorLyogVGhlIHR5cGUgb2YgYSBQSUMgZXhwcmVzc2lvbi4gICovCisKK2VudW0gcGljX3JlbG9jYXRpb24KK3sKKyAgcGljX25vbmUsCQkJLyogbm90IHBpYyAqLworICBwaWNfcGx0X3BjcmVsLAkJLyogQFBMVFBDICovCisgIHBpY19nb3RfcGNyZWwsCQkvKiBAR09UUEMgKi8KKyAgcGljX3BsdF9vZmYsCQkJLyogQFBMVCAqLworICBwaWNfZ290X29mZgkJCS8qIEBHT1QgKi8KK307CisjZW5kaWYKKworLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXhwcmVzc2lvbi4gICovCisKK3N0cnVjdCBtNjhrX2V4cAoreworICAvKiBUaGUgc2l6ZSB0byB1c2UuICAqLworICBlbnVtIG02OGtfc2l6ZSBzaXplOworCisjaWZkZWYgT0JKX0VMRgorICAvKiBUaGUgdHlwZSBvZiBwaWMgcmVsb2NhdGlvbiBpZiBhbnkuICAqLworICBlbnVtIHBpY19yZWxvY2F0aW9uIHBpY19yZWxvYzsKKyNlbmRpZgorCisgIC8qIFRoZSBleHByZXNzaW9uIGl0c2VsZi4gICovCisgIGV4cHJlc3Npb25TIGV4cDsKK307CisKKy8qIFRoZSBvcGVyYW5kIG1vZGVzLiAgKi8KKworZW51bSBtNjhrX29wZXJhbmRfdHlwZQoreworICBJTU1FRCA9IDEsCisgIEFCU0wsCisgIERSRUcsCisgIEFSRUcsCisgIEZQUkVHLAorICBDT05UUk9MLAorICBBSU5EUiwKKyAgQUlOQywKKyAgQURFQywKKyAgRElTUCwKKyAgQkFTRSwKKyAgUE9TVCwKKyAgUFJFLAorICBSRUdMU1QKK307CisKKy8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgcGFyc2VkIG9wZXJhbmQuICAqLworCitzdHJ1Y3QgbTY4a19vcAoreworICAvKiBUaGUgdHlwZSBvZiBvcGVyYW5kLiAgKi8KKyAgZW51bSBtNjhrX29wZXJhbmRfdHlwZSBtb2RlOworCisgIC8qIFRoZSBtYWluIHJlZ2lzdGVyLiAgKi8KKyAgZW51bSBtNjhrX3JlZ2lzdGVyIHJlZzsKKworICAvKiBUaGUgcmVnaXN0ZXIgbWFzayBmb3IgbW9kZSBSRUdMU1QuICAqLworICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgLyogQW4gZXJyb3IgbWVzc2FnZS4gICovCisgIGNvbnN0IGNoYXIgKmVycm9yOworCisgIC8qIFRoZSBpbmRleCByZWdpc3Rlci4gICovCisgIHN0cnVjdCBtNjhrX2luZGV4cmVnIGluZGV4OworCisgIC8qIFRoZSBkaXNwbGFjZW1lbnQuICAqLworICBzdHJ1Y3QgbTY4a19leHAgZGlzcDsKKworICAvKiBUaGUgb3V0ZXIgZGlzcGxhY2VtZW50LiAgKi8KKyAgc3RydWN0IG02OGtfZXhwIG9kaXNwOworfTsKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoTTY4S19QQVJTRV9IKSAqLworCisvKiBUaGUgcGFyc2luZyBmdW5jdGlvbi4gICovCisKK2V4dGVybiBpbnQgbTY4a19pcF9vcCBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBtNjhrX29wICopKTsKKworLyogV2hldGhlciByZWdpc3RlciBwcmVmaXhlcyBhcmUgb3B0aW9uYWwuICAqLworZXh0ZXJuIGludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWw7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UueSBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTRlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL202OGstcGFyc2UueQpAQCAtMCwwICsxLDEwNjEgQEAKKy8qIG02OGsueSAtLSBiaXNvbiBncmFtbWFyIGZvciBtNjhrIG9wZXJhbmQgcGFyc2luZworICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4gYW5kIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBob2xkcyBhIGJpc29uIGdyYW1tYXIgdG8gcGFyc2UgbTY4ayBvcGVyYW5kcy4gIFRoZSBtNjhrCisgICBoYXMgYSBjb21wbGljYXRlZCBvcGVyYW5kIHN5bnRheCwgYW5kIGdhcyBzdXBwb3J0cyB0d28gbWFpbgorICAgdmFyaWF0aW9ucyBvZiBpdC4gIFVzaW5nIGEgZ3JhbW1hciBpcyBwcm9iYWJseSBvdmVya2lsbCwgYnV0IGF0CisgICBsZWFzdCBpdCBtYWtlcyBjbGVhciBleGFjdGx5IHdoYXQgd2UgZG8gc3VwcG9ydC4gICovCisKKyV7CisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInRjLW02OGsuaCIKKyNpbmNsdWRlICJtNjhrLXBhcnNlLmgiCisKKy8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLAorICAgZXRjKSwgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMgSWYgb3RoZXIgcGFyc2VyCisgICBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZSBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0CisgICBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyIGdlbmVyYXRvcnMgbmVlZCB0byBiZQorICAgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLworCisjZGVmaW5lCXl5bWF4ZGVwdGggbTY4a19tYXhkZXB0aAorI2RlZmluZQl5eXBhcnNlCW02OGtfcGFyc2UKKyNkZWZpbmUJeXlsZXgJbTY4a19sZXgKKyNkZWZpbmUJeXllcnJvcgltNjhrX2Vycm9yCisjZGVmaW5lCXl5bHZhbAltNjhrX2x2YWwKKyNkZWZpbmUJeXljaGFyCW02OGtfY2hhcgorI2RlZmluZQl5eWRlYnVnCW02OGtfZGVidWcKKyNkZWZpbmUJeXlwYWN0CW02OGtfcGFjdAkKKyNkZWZpbmUJeXlyMQltNjhrX3IxCQkJCisjZGVmaW5lCXl5cjIJbTY4a19yMgkJCQorI2RlZmluZQl5eWRlZgltNjhrX2RlZgkJCisjZGVmaW5lCXl5Y2hrCW02OGtfY2hrCQkKKyNkZWZpbmUJeXlwZ28JbTY4a19wZ28JCQorI2RlZmluZQl5eWFjdAltNjhrX2FjdAkJCisjZGVmaW5lCXl5ZXhjYQltNjhrX2V4Y2EKKyNkZWZpbmUgeXllcnJmbGFnIG02OGtfZXJyZmxhZworI2RlZmluZSB5eW5lcnJzCW02OGtfbmVycnMKKyNkZWZpbmUJeXlwcwltNjhrX3BzCisjZGVmaW5lCXl5cHYJbTY4a19wdgorI2RlZmluZQl5eXMJbTY4a19zCisjZGVmaW5lCXl5X3l5cwltNjhrX3l5cworI2RlZmluZQl5eXN0YXRlCW02OGtfc3RhdGUKKyNkZWZpbmUJeXl0bXAJbTY4a190bXAKKyNkZWZpbmUJeXl2CW02OGtfdgorI2RlZmluZQl5eV95eXYJbTY4a195eXYKKyNkZWZpbmUJeXl2YWwJbTY4a192YWwKKyNkZWZpbmUJeXlsbG9jCW02OGtfbGxvYworI2RlZmluZSB5eXJlZHMJbTY4a19yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLworI2RlZmluZSB5eXRva3MJbTY4a190b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLworI2RlZmluZSB5eWxocwltNjhrX3l5bGhzCisjZGVmaW5lIHl5bGVuCW02OGtfeXlsZW4KKyNkZWZpbmUgeXlkZWZyZWQgbTY4a195eWRlZnJlZAorI2RlZmluZSB5eWRnb3RvCW02OGtfeXlkZ290bworI2RlZmluZSB5eXNpbmRleCBtNjhrX3l5c2luZGV4CisjZGVmaW5lIHl5cmluZGV4IG02OGtfeXlyaW5kZXgKKyNkZWZpbmUgeXlnaW5kZXggbTY4a195eWdpbmRleAorI2RlZmluZSB5eXRhYmxlCSBtNjhrX3l5dGFibGUKKyNkZWZpbmUgeXljaGVjawkgbTY4a195eWNoZWNrCisKKyNpZm5kZWYgWVlERUJVRworI2RlZmluZSBZWURFQlVHIDEKKyNlbmRpZgorCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgZW51bSBtNjhrX3JlZ2lzdGVyIG02OGtfcmVnX3BhcnNlIFBBUkFNUyAoKGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworLyogVGhlIHBhcnNlciBzZXRzIGZpZWxkcyBwb2ludGVkIHRvIGJ5IHRoaXMgZ2xvYmFsIHZhcmlhYmxlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbTY4a19vcCAqb3A7CisKKyV9CisKKyV1bmlvbgoreworICBzdHJ1Y3QgbTY4a19pbmRleHJlZyBpbmRleHJlZzsKKyAgZW51bSBtNjhrX3JlZ2lzdGVyIHJlZzsKKyAgc3RydWN0IG02OGtfZXhwIGV4cDsKKyAgdW5zaWduZWQgbG9uZyBtYXNrOworICBpbnQgb25lcmVnOworfQorCisldG9rZW4gPHJlZz4gRFIgQVIgRlBSIEZQQ1IgTFBDIFpBUiBaRFIgTFpQQyBDUkVHCisldG9rZW4gPGluZGV4cmVnPiBJTkRFWFJFRworJXRva2VuIDxleHA+IEVYUFIKKworJXR5cGUgPGluZGV4cmVnPiB6aXJlZyB6ZGlyZWcKKyV0eXBlIDxyZWc+IHphZHIgemRyIGFwYyB6YXBjIHpwYyBvcHR6YXBjIG9wdGN6YXBjCisldHlwZSA8ZXhwPiBvcHRjZXhwciBvcHRleHByYworJXR5cGUgPG1hc2s+IHJlZ2xpc3QgaXJlZ2xpc3QgcmVnbGlzdHBhaXIKKyV0eXBlIDxvbmVyZWc+IHJlZ2xpc3RyZWcKKworJSUKKworLyogQW4gb3BlcmFuZC4gICovCisKK29wZXJhbmQ6CisJICBnZW5lcmljX29wZXJhbmQKKwl8IG1vdG9yb2xhX29wZXJhbmQKKwl8IG1pdF9vcGVyYW5kCisJOworCisvKiBBIGdlbmVyaWMgb3BlcmFuZC4gICovCisKK2dlbmVyaWNfb3BlcmFuZDoKKwkgIERSCisJCXsKKwkJICBvcC0+bW9kZSA9IERSRUc7CisJCSAgb3AtPnJlZyA9ICQxOworCQl9CisJfCBBUgorCQl7CisJCSAgb3AtPm1vZGUgPSBBUkVHOworCQkgIG9wLT5yZWcgPSAkMTsKKwkJfQorCXwgRlBSCisJCXsKKwkJICBvcC0+bW9kZSA9IEZQUkVHOworCQkgIG9wLT5yZWcgPSAkMTsKKwkJfQorCXwgRlBDUgorCQl7CisJCSAgb3AtPm1vZGUgPSBDT05UUk9MOworCQkgIG9wLT5yZWcgPSAkMTsKKwkJfQorCXwgQ1JFRworCQl7CisJCSAgb3AtPm1vZGUgPSBDT05UUk9MOworCQkgIG9wLT5yZWcgPSAkMTsKKwkJfQorCXwgRVhQUgorCQl7CisJCSAgb3AtPm1vZGUgPSBBQlNMOworCQkgIG9wLT5kaXNwID0gJDE7CisJCX0KKwl8ICcjJyBFWFBSCisJCXsKKwkJICBvcC0+bW9kZSA9IElNTUVEOworCQkgIG9wLT5kaXNwID0gJDI7CisJCX0KKwl8ICcmJyBFWFBSCisJCXsKKwkJICBvcC0+bW9kZSA9IElNTUVEOworCQkgIG9wLT5kaXNwID0gJDI7CisJCX0KKwl8IHJlZ2xpc3QKKwkJeworCQkgIG9wLT5tb2RlID0gUkVHTFNUOworCQkgIG9wLT5tYXNrID0gJDE7CisJCX0KKwk7CisKKy8qIEFuIG9wZXJhbmQgaW4gTW90b3JvbGEgc3ludGF4LiAgVGhpcyBpbmNsdWRlcyBNUkkgc3ludGF4IGFzIHdlbGwsCisgICB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBkaWZmZXJlbnQgaW4gdGhhdCBpdCBwZXJtaXRzIGNvbW11dGF0aXZpdHkKKyAgIG9mIGluZGV4IGFuZCBiYXNlIHJlZ2lzdGVycywgYW5kIHBlcm1pdHMgYW4gb2Zmc2V0IGV4cHJlc3Npb24gdG8KKyAgIGFwcGVhciBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgcGFyZW50aGVzZXMuICAqLworCittb3Rvcm9sYV9vcGVyYW5kOgorCSAgJygnIEFSICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBBSU5EUjsKKwkJICBvcC0+cmVnID0gJDI7CisJCX0KKwl8ICcoJyBBUiAnKScgJysnCisJCXsKKwkJICBvcC0+bW9kZSA9IEFJTkM7CisJCSAgb3AtPnJlZyA9ICQyOworCQl9CisJfCAnLScgJygnIEFSICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBBREVDOworCQkgIG9wLT5yZWcgPSAkMzsKKwkJfQorCXwgJygnIEVYUFIgJywnIHphcGMgJyknCisJCXsKKwkJICBvcC0+cmVnID0gJDQ7CisJCSAgb3AtPmRpc3AgPSAkMjsKKwkJICBpZiAoKCQ0ID49IFpBRERSMCAmJiAkNCA8PSBaQUREUjcpCisJCSAgICAgIHx8ICQ0ID09IFpQQykKKwkJICAgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBlbHNlCisJCSAgICBvcC0+bW9kZSA9IERJU1A7CisJCX0KKwl8ICcoJyB6YXBjICcsJyBFWFBSICcpJworCQl7CisJCSAgb3AtPnJlZyA9ICQyOworCQkgIG9wLT5kaXNwID0gJDQ7CisJCSAgaWYgKCgkMiA+PSBaQUREUjAgJiYgJDIgPD0gWkFERFI3KQorCQkgICAgICB8fCAkMiA9PSBaUEMpCisJCSAgICBvcC0+bW9kZSA9IEJBU0U7CisJCSAgZWxzZQorCQkgICAgb3AtPm1vZGUgPSBESVNQOworCQl9CisJfCBFWFBSICcoJyB6YXBjICcpJworCQl7CisJCSAgb3AtPnJlZyA9ICQzOworCQkgIG9wLT5kaXNwID0gJDE7CisJCSAgaWYgKCgkMyA+PSBaQUREUjAgJiYgJDMgPD0gWkFERFI3KQorCQkgICAgICB8fCAkMyA9PSBaUEMpCisJCSAgICBvcC0+bW9kZSA9IEJBU0U7CisJCSAgZWxzZQorCQkgICAgb3AtPm1vZGUgPSBESVNQOworCQl9CisJfCAnKCcgTFBDICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBESVNQOworCQkgIG9wLT5yZWcgPSAkMjsKKwkJfQorCXwgJygnIFpBUiAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBvcC0+cmVnID0gJDI7CisJCX0KKwl8ICcoJyBMWlBDICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBCQVNFOworCQkgIG9wLT5yZWcgPSAkMjsKKwkJfQorCXwgJygnIEVYUFIgJywnIHphcGMgJywnIHppcmVnICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBCQVNFOworCQkgIG9wLT5yZWcgPSAkNDsKKwkJICBvcC0+ZGlzcCA9ICQyOworCQkgIG9wLT5pbmRleCA9ICQ2OworCQl9CisJfCAnKCcgRVhQUiAnLCcgemFwYyAnLCcgenBjICcpJworCQl7CisJCSAgaWYgKCQ0ID09IFBDIHx8ICQ0ID09IFpQQykKKwkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKKwkJICBvcC0+bW9kZSA9IEJBU0U7CisJCSAgb3AtPnJlZyA9ICQ2OworCQkgIG9wLT5kaXNwID0gJDI7CisJCSAgb3AtPmluZGV4LnJlZyA9ICQ0OworCQkgIG9wLT5pbmRleC5zaXplID0gU0laRV9VTlNQRUM7CisJCSAgb3AtPmluZGV4LnNjYWxlID0gMTsKKwkJfQorCXwgJygnIEVYUFIgJywnIHpkaXJlZyBvcHRjemFwYyAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBvcC0+cmVnID0gJDU7CisJCSAgb3AtPmRpc3AgPSAkMjsKKwkJICBvcC0+aW5kZXggPSAkNDsKKwkJfQorCXwgJygnIHpkaXJlZyAnLCcgRVhQUiAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBvcC0+ZGlzcCA9ICQ0OworCQkgIG9wLT5pbmRleCA9ICQyOworCQl9CisJfCBFWFBSICcoJyB6YXBjICcsJyB6aXJlZyAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBvcC0+cmVnID0gJDM7CisJCSAgb3AtPmRpc3AgPSAkMTsKKwkJICBvcC0+aW5kZXggPSAkNTsKKwkJfQorCXwgJygnIHphcGMgJywnIHppcmVnICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBCQVNFOworCQkgIG9wLT5yZWcgPSAkMjsKKwkJICBvcC0+aW5kZXggPSAkNDsKKwkJfQorCXwgRVhQUiAnKCcgemFwYyAnLCcgenBjICcpJworCQl7CisJCSAgaWYgKCQzID09IFBDIHx8ICQzID09IFpQQykKKwkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKKwkJICBvcC0+bW9kZSA9IEJBU0U7CisJCSAgb3AtPnJlZyA9ICQ1OworCQkgIG9wLT5kaXNwID0gJDE7CisJCSAgb3AtPmluZGV4LnJlZyA9ICQzOworCQkgIG9wLT5pbmRleC5zaXplID0gU0laRV9VTlNQRUM7CisJCSAgb3AtPmluZGV4LnNjYWxlID0gMTsKKwkJfQorCXwgJygnIHphcGMgJywnIHpwYyAnKScKKwkJeworCQkgIGlmICgkMiA9PSBQQyB8fCAkMiA9PSBaUEMpCisJCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7CisJCSAgb3AtPm1vZGUgPSBCQVNFOworCQkgIG9wLT5yZWcgPSAkNDsKKwkJICBvcC0+aW5kZXgucmVnID0gJDI7CisJCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKKwkJICBvcC0+aW5kZXguc2NhbGUgPSAxOworCQl9CisJfCBFWFBSICcoJyB6ZGlyZWcgb3B0Y3phcGMgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IEJBU0U7CisJCSAgb3AtPnJlZyA9ICQ0OworCQkgIG9wLT5kaXNwID0gJDE7CisJCSAgb3AtPmluZGV4ID0gJDM7CisJCX0KKwl8ICcoJyB6ZGlyZWcgb3B0Y3phcGMgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IEJBU0U7CisJCSAgb3AtPnJlZyA9ICQzOworCQkgIG9wLT5pbmRleCA9ICQyOworCQl9CisJfCAnKCcgJ1snIEVYUFIgb3B0Y3phcGMgJ10nICcsJyB6aXJlZyBvcHRjZXhwciAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gUE9TVDsKKwkJICBvcC0+cmVnID0gJDQ7CisJCSAgb3AtPmRpc3AgPSAkMzsKKwkJICBvcC0+aW5kZXggPSAkNzsKKwkJICBvcC0+b2Rpc3AgPSAkODsKKwkJfQorCXwgJygnICdbJyBFWFBSIG9wdGN6YXBjICddJyBvcHRjZXhwciAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gUE9TVDsKKwkJICBvcC0+cmVnID0gJDQ7CisJCSAgb3AtPmRpc3AgPSAkMzsKKwkJICBvcC0+b2Rpc3AgPSAkNjsKKwkJfQorCXwgJygnICdbJyB6YXBjICddJyAnLCcgemlyZWcgb3B0Y2V4cHIgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IFBPU1Q7CisJCSAgb3AtPnJlZyA9ICQzOworCQkgIG9wLT5pbmRleCA9ICQ2OworCQkgIG9wLT5vZGlzcCA9ICQ3OworCQl9CisJfCAnKCcgJ1snIHphcGMgJ10nIG9wdGNleHByICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBQT1NUOworCQkgIG9wLT5yZWcgPSAkMzsKKwkJICBvcC0+b2Rpc3AgPSAkNTsKKwkJfQorCXwgJygnICdbJyBFWFBSICcsJyB6YXBjICcsJyB6aXJlZyAnXScgb3B0Y2V4cHIgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IFBSRTsKKwkJICBvcC0+cmVnID0gJDU7CisJCSAgb3AtPmRpc3AgPSAkMzsKKwkJICBvcC0+aW5kZXggPSAkNzsKKwkJICBvcC0+b2Rpc3AgPSAkOTsKKwkJfQorCXwgJygnICdbJyB6YXBjICcsJyB6aXJlZyAnXScgb3B0Y2V4cHIgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IFBSRTsKKwkJICBvcC0+cmVnID0gJDM7CisJCSAgb3AtPmluZGV4ID0gJDU7CisJCSAgb3AtPm9kaXNwID0gJDc7CisJCX0KKwl8ICcoJyAnWycgRVhQUiAnLCcgemFwYyAnLCcgenBjICddJyBvcHRjZXhwciAnKScKKwkJeworCQkgIGlmICgkNSA9PSBQQyB8fCAkNSA9PSBaUEMpCisJCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7CisJCSAgb3AtPm1vZGUgPSBQUkU7CisJCSAgb3AtPnJlZyA9ICQ3OworCQkgIG9wLT5kaXNwID0gJDM7CisJCSAgb3AtPmluZGV4LnJlZyA9ICQ1OworCQkgIG9wLT5pbmRleC5zaXplID0gU0laRV9VTlNQRUM7CisJCSAgb3AtPmluZGV4LnNjYWxlID0gMTsKKwkJICBvcC0+b2Rpc3AgPSAkOTsKKwkJfQorCXwgJygnICdbJyB6YXBjICcsJyB6cGMgJ10nIG9wdGNleHByICcpJworCQl7CisJCSAgaWYgKCQzID09IFBDIHx8ICQzID09IFpQQykKKwkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKKwkJICBvcC0+bW9kZSA9IFBSRTsKKwkJICBvcC0+cmVnID0gJDU7CisJCSAgb3AtPmluZGV4LnJlZyA9ICQzOworCQkgIG9wLT5pbmRleC5zaXplID0gU0laRV9VTlNQRUM7CisJCSAgb3AtPmluZGV4LnNjYWxlID0gMTsKKwkJICBvcC0+b2Rpc3AgPSAkNzsKKwkJfQorCXwgJygnICdbJyBvcHRleHByYyB6ZGlyZWcgb3B0Y3phcGMgJ10nIG9wdGNleHByICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBQUkU7CisJCSAgb3AtPnJlZyA9ICQ1OworCQkgIG9wLT5kaXNwID0gJDM7CisJCSAgb3AtPmluZGV4ID0gJDQ7CisJCSAgb3AtPm9kaXNwID0gJDc7CisJCX0KKwk7CisKKy8qIEFuIG9wZXJhbmQgaW4gTUlUIHN5bnRheC4gICovCisKK21pdF9vcGVyYW5kOgorCSAgb3B0emFwYyAnQCcKKwkJeworCQkgIC8qIFdlIHVzZSBvcHR6YXBjIHRvIGF2b2lkIGEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LiAgKi8KKwkJICBpZiAoJDEgPCBBRERSMCB8fCAkMSA+IEFERFI3KQorCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOworCQkgIG9wLT5tb2RlID0gQUlORFI7CisJCSAgb3AtPnJlZyA9ICQxOworCQl9CisJfCBvcHR6YXBjICdAJyAnKycKKwkJeworCQkgIC8qIFdlIHVzZSBvcHR6YXBjIHRvIGF2b2lkIGEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LiAgKi8KKwkJICBpZiAoJDEgPCBBRERSMCB8fCAkMSA+IEFERFI3KQorCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOworCQkgIG9wLT5tb2RlID0gQUlOQzsKKwkJICBvcC0+cmVnID0gJDE7CisJCX0KKwl8IG9wdHphcGMgJ0AnICctJworCQl7CisJCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLworCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCisJCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7CisJCSAgb3AtPm1vZGUgPSBBREVDOworCQkgIG9wLT5yZWcgPSAkMTsKKwkJfQorCXwgb3B0emFwYyAnQCcgJygnIEVYUFIgJyknCisJCXsKKwkJICBvcC0+cmVnID0gJDE7CisJCSAgb3AtPmRpc3AgPSAkNDsKKwkJICBpZiAoKCQxID49IFpBRERSMCAmJiAkMSA8PSBaQUREUjcpCisJCSAgICAgIHx8ICQxID09IFpQQykKKwkJICAgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBlbHNlCisJCSAgICBvcC0+bW9kZSA9IERJU1A7CisJCX0KKwl8IG9wdHphcGMgJ0AnICcoJyBvcHRleHByYyB6aXJlZyAnKScKKwkJeworCQkgIG9wLT5tb2RlID0gQkFTRTsKKwkJICBvcC0+cmVnID0gJDE7CisJCSAgb3AtPmRpc3AgPSAkNDsKKwkJICBvcC0+aW5kZXggPSAkNTsKKwkJfQorCXwgb3B0emFwYyAnQCcgJygnIEVYUFIgJyknICdAJyAnKCcgb3B0ZXhwcmMgemlyZWcgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IFBPU1Q7CisJCSAgb3AtPnJlZyA9ICQxOworCQkgIG9wLT5kaXNwID0gJDQ7CisJCSAgb3AtPmluZGV4ID0gJDk7CisJCSAgb3AtPm9kaXNwID0gJDg7CisJCX0KKwl8IG9wdHphcGMgJ0AnICcoJyBFWFBSICcpJyAnQCcgJygnIEVYUFIgJyknCisJCXsKKwkJICBvcC0+bW9kZSA9IFBPU1Q7CisJCSAgb3AtPnJlZyA9ICQxOworCQkgIG9wLT5kaXNwID0gJDQ7CisJCSAgb3AtPm9kaXNwID0gJDg7CisJCX0KKwl8IG9wdHphcGMgJ0AnICcoJyBvcHRleHByYyB6aXJlZyAnKScgJ0AnICcoJyBFWFBSICcpJworCQl7CisJCSAgb3AtPm1vZGUgPSBQUkU7CisJCSAgb3AtPnJlZyA9ICQxOworCQkgIG9wLT5kaXNwID0gJDQ7CisJCSAgb3AtPmluZGV4ID0gJDU7CisJCSAgb3AtPm9kaXNwID0gJDk7CisJCX0KKwk7CisKKy8qIEFuIGluZGV4IHJlZ2lzdGVyLCBwb3NzaWJseSBzdXBwcmVzc2VkLCB3aGljaCBuZWVkIG5vdCBoYXZlIGEgc2l6ZQorICAgb3Igc2NhbGUuICAqLworCit6aXJlZzoKKwkgIElOREVYUkVHCisJfCB6YWRyCisJCXsKKwkJICAkJC5yZWcgPSAkMTsKKwkJICAkJC5zaXplID0gU0laRV9VTlNQRUM7CisJCSAgJCQuc2NhbGUgPSAxOworCQl9CisJOworCisvKiBBIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSBhbiBpbmRleCByZWdpc3RlciwgYnV0IHdoaWNoIG1heSBub3QgYmUgYW4KKyAgIGFkZHJlc3MgcmVnaXN0ZXIuICBUaGlzIG5vbnRlcm1pbmFsIGlzIHVzZWQgdG8gYXZvaWQgYW1iaWd1aXR5IHdoZW4KKyAgIHRyeWluZyB0byBwYXJzZSBzb21ldGhpbmcgbGlrZSAoMCxkNSxhNikgYXMgY29tcGFyZWQgdG8gKDAsYTYsZDUpLiAgKi8KKworemRpcmVnOgorCSAgSU5ERVhSRUcKKwl8IHpkcgorCQl7CisJCSAgJCQucmVnID0gJDE7CisJCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOworCQkgICQkLnNjYWxlID0gMTsKKwkJfQorCTsKKworLyogQW4gYWRkcmVzcyBvciBkYXRhIHJlZ2lzdGVyLCBvciBhIHN1cHByZXNzZWQgYWRkcmVzcyBvciBkYXRhCisgICByZWdpc3Rlci4gICovCisKK3phZHI6CisJICB6ZHIKKwl8IEFSCisJfCBaQVIKKwk7CisKKy8qIEEgZGF0YSByZWdpc3RlciB3aGljaCBtYXkgYmUgc3VwcHJlc3NlZC4gICovCisKK3pkcjoKKwkgIERSCisJfCBaRFIKKwk7CisKKy8qIEVpdGhlciBhbiBhZGRyZXNzIHJlZ2lzdGVyIG9yIHRoZSBQQy4gICovCisKK2FwYzoKKwkgIEFSCisJfCBMUEMKKwk7CisKKy8qIEVpdGhlciBhbiBhZGRyZXNzIHJlZ2lzdGVyLCBvciB0aGUgUEMsIG9yIGEgc3VwcHJlc3NlZCBhZGRyZXNzCisgICByZWdpc3Rlciwgb3IgYSBzdXBwcmVzc2VkIFBDLiAgKi8KKworemFwYzoKKwkgIGFwYworCXwgTFpQQworCXwgWkFSCisJOworCisvKiBBbiBvcHRpb25hbCB6YXBjLiAgKi8KKworb3B0emFwYzoKKwkgIC8qIGVtcHR5ICovCisJCXsKKwkJICAkJCA9IFpBRERSMDsKKwkJfQorCXwgemFwYworCTsKKworLyogVGhlIFBDLCBvcHRpb25hbGx5IHN1cHByZXNzZWQuICAqLworCit6cGM6CisJICBMUEMKKwl8IExaUEMKKwk7CisKKy8qICcsJyB6YXBjIHdoZW4gaXQgbWF5IGJlIG9taXR0ZWQuICAqLworCitvcHRjemFwYzoKKwkgIC8qIGVtcHR5ICovCisJCXsKKwkJICAkJCA9IFpBRERSMDsKKwkJfQorCXwgJywnIHphcGMKKwkJeworCQkgICQkID0gJDI7CisJCX0KKwk7CisKKy8qICcsJyBFWFBSIHdoZW4gaXQgbWF5IGJlIG9taXR0ZWQuICAqLworCitvcHRjZXhwcjoKKwkgIC8qIGVtcHR5ICovCisJCXsKKwkJICAkJC5leHAuWF9vcCA9IE9fYWJzZW50OworCQkgICQkLnNpemUgPSBTSVpFX1VOU1BFQzsKKwkJfQorCXwgJywnIEVYUFIKKwkJeworCQkgICQkID0gJDI7CisJCX0KKwk7CisKKy8qIEVYUFIgJywnIHdoZW4gaXQgbWF5IGJlIG9taXR0ZWQuICAqLworCitvcHRleHByYzoKKwkgIC8qIGVtcHR5ICovCisJCXsKKwkJICAkJC5leHAuWF9vcCA9IE9fYWJzZW50OworCQkgICQkLnNpemUgPSBTSVpFX1VOU1BFQzsKKwkJfQorCXwgRVhQUiAnLCcKKwkJeworCQkgICQkID0gJDE7CisJCX0KKwk7CisKKy8qIEEgcmVnaXN0ZXIgbGlzdCBmb3IgdGhlIG1vdmVtIGluc3RydWN0aW9uLiAgKi8KKworcmVnbGlzdDoKKwkgIHJlZ2xpc3RwYWlyCisJfCByZWdsaXN0cGFpciAnLycgaXJlZ2xpc3QKKwkJeworCQkgICQkID0gJDEgfCAkMzsKKwkJfQorCXwgcmVnbGlzdHJlZyAnLycgaXJlZ2xpc3QKKwkJeworCQkgICQkID0gKDEgPDwgJDEpIHwgJDM7CisJCX0KKwk7CisKKy8qIFdlIHVzZSBpcmVnbGlzdCB3aGVuIHdlIGtub3cgd2UgYXJlIGxvb2tpbmcgYXQgYSByZWdsaXN0LCBhbmQgd2UKKyAgIGNhbiBzYWZlbHkgcmVkdWNlIGEgc2ltcGxlIHJlZ2lzdGVyIHRvIHJlZ2xpc3RyZWcuICBJZiB3ZSBwZXJtaXR0ZWQKKyAgIHJlZ2xpc3QgdG8gcmVkdWNlIHRvIHJlZ2xpc3RyZWcsIGl0IHdvdWxkIGJlIGFtYmlndW91cyB3aGV0aGVyIGEKKyAgIHBsYWluIHJlZ2lzdGVyIHdlcmUgYSBEUkVHL0FSRUcvRlBSRUcgb3IgYSBSRUdMU1QuICAqLworCitpcmVnbGlzdDoKKwkgIHJlZ2xpc3RyZWcKKwkJeworCQkgICQkID0gMSA8PCAkMTsKKwkJfQorCXwgcmVnbGlzdHBhaXIKKwl8IHJlZ2xpc3RwYWlyICcvJyBpcmVnbGlzdAorCQl7CisJCSAgJCQgPSAkMSB8ICQzOworCQl9CisJfCByZWdsaXN0cmVnICcvJyBpcmVnbGlzdAorCQl7CisJCSAgJCQgPSAoMSA8PCAkMSkgfCAkMzsKKwkJfQorCTsKKworcmVnbGlzdHBhaXI6CisJICByZWdsaXN0cmVnICctJyByZWdsaXN0cmVnCisJCXsKKwkJICBpZiAoJDEgPD0gJDMpCisJCSAgICAkJCA9ICgxIDw8ICgkMyArIDEpKSAtIDEgLSAoKDEgPDwgJDEpIC0gMSk7CisJCSAgZWxzZQorCQkgICAgJCQgPSAoMSA8PCAoJDEgKyAxKSkgLSAxIC0gKCgxIDw8ICQzKSAtIDEpOworCQl9CisJOworCityZWdsaXN0cmVnOgorCSAgRFIKKwkJeworCQkgICQkID0gJDEgLSBEQVRBMDsKKwkJfQorCXwgQVIKKwkJeworCQkgICQkID0gJDEgLSBBRERSMCArIDg7CisJCX0KKwl8IEZQUgorCQl7CisJCSAgJCQgPSAkMSAtIEZQMCArIDE2OworCQl9CisJfCBGUENSCisJCXsKKwkJICBpZiAoJDEgPT0gRlBJKQorCQkgICAgJCQgPSAyNDsKKwkJICBlbHNlIGlmICgkMSA9PSBGUFMpCisJCSAgICAkJCA9IDI1OworCQkgIGVsc2UKKwkJICAgICQkID0gMjY7CisJCX0KKwk7CisKKyUlCisKKy8qIFRoZSBzdHJpbmcgdG8gcGFyc2UgaXMgc3RvcmVkIGhlcmUsIGFuZCBtb2RpZmllZCBieSB5eWxleC4gICovCisKK3N0YXRpYyBjaGFyICpzdHI7CisKKy8qIFRoZSBvcmlnaW5hbCBzdHJpbmcgcG9pbnRlci4gICovCisKK3N0YXRpYyBjaGFyICpzdHJvcmlnOworCisvKiBJZiAqQ0NQIGNvdWxkIGJlIGEgcmVnaXN0ZXIsIHJldHVybiB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFuZCBhZHZhbmNlCisgICAqQ0NQLiAgT3RoZXJ3aXNlIGRvbid0IGNoYW5nZSAqQ0NQLCBhbmQgcmV0dXJuIDAuICAqLworCitzdGF0aWMgZW51bSBtNjhrX3JlZ2lzdGVyCittNjhrX3JlZ19wYXJzZSAoY2NwKQorICAgICByZWdpc3RlciBjaGFyICoqY2NwOworeworICBjaGFyICpzdGFydCA9ICpjY3A7CisgIGNoYXIgYzsKKyAgY2hhciAqcDsKKyAgc3ltYm9sUyAqc3ltYm9scDsKKworICBpZiAoZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsKQorICAgIHsKKyAgICAgIGlmICgqc3RhcnQgPT0gUkVHSVNURVJfUFJFRklYKQorCXN0YXJ0Kys7CisgICAgICBwID0gc3RhcnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCpzdGFydCAhPSBSRUdJU1RFUl9QUkVGSVgpCisJcmV0dXJuIDA7CisgICAgICBwID0gc3RhcnQgKyAxOworICAgIH0KKworICBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgqcCkpCisgICAgcmV0dXJuIDA7CisKKyAgcCsrOworICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqcCkgJiYgKnAgIT0gJy4nICYmICpwICE9ICc6JyAmJiAqcCAhPSAnKicpCisgICAgcCsrOworCisgIGMgPSAqcDsKKyAgKnAgPSAwOworICBzeW1ib2xwID0gc3ltYm9sX2ZpbmQgKHN0YXJ0KTsKKyAgKnAgPSBjOworCisgIGlmIChzeW1ib2xwICE9IE5VTEwgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9scCkgPT0gcmVnX3NlY3Rpb24pCisgICAgeworICAgICAgKmNjcCA9IHA7CisgICAgICByZXR1cm4gU19HRVRfVkFMVUUgKHN5bWJvbHApOworICAgIH0KKworICAvKiBJbiBNUkkgbW9kZSwgc29tZXRoaW5nIGxpa2UgZm9vLmJhciBjYW4gYmUgZXF1YXRlZCB0byBhIHJlZ2lzdGVyCisgICAgIG5hbWUuICAqLworICB3aGlsZSAoZmxhZ19tcmkgJiYgYyA9PSAnLicpCisgICAgeworICAgICAgKytwOworICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKnApICYmICpwICE9ICcuJyAmJiAqcCAhPSAnOicgJiYgKnAgIT0gJyonKQorCXArKzsKKyAgICAgIGMgPSAqcDsKKyAgICAgICpwID0gJ1wwJzsKKyAgICAgIHN5bWJvbHAgPSBzeW1ib2xfZmluZCAoc3RhcnQpOworICAgICAgKnAgPSBjOworICAgICAgaWYgKHN5bWJvbHAgIT0gTlVMTCAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xwKSA9PSByZWdfc2VjdGlvbikKKwl7CisJICAqY2NwID0gcDsKKwkgIHJldHVybiBTX0dFVF9WQUxVRSAoc3ltYm9scCk7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVGhlIGxleGVyLiAgKi8KKworc3RhdGljIGludAoreXlsZXggKCkKK3sKKyAgZW51bSBtNjhrX3JlZ2lzdGVyIHJlZzsKKyAgY2hhciAqczsKKyAgaW50IHBhcmVuczsKKyAgaW50IGMgPSAwOworICBpbnQgdGFpbCA9IDA7CisgIGNoYXIgKmhvbGQ7CisKKyAgaWYgKCpzdHIgPT0gJyAnKQorICAgICsrc3RyOworCisgIGlmICgqc3RyID09ICdcMCcpCisgICAgcmV0dXJuIDA7CisKKyAgLyogVmFyaW91cyBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIGp1c3QgcmV0dXJuZWQgZGlyZWN0bHkuICAqLworICBzd2l0Y2ggKCpzdHIpCisgICAgeworICAgIGNhc2UgJ0AnOgorICAgICAgLyogSW4gTVJJIG1vZGUsIHRoaXMgY2FuIGJlIHRoZSBzdGFydCBvZiBhbiBvY3RhbCBudW1iZXIuICAqLworICAgICAgaWYgKGZsYWdfbXJpKQorCXsKKwkgIGlmIChpc2RpZ2l0IChzdHJbMV0pCisJICAgICAgfHwgKChzdHJbMV0gPT0gJysnIHx8IHN0clsxXSA9PSAnLScpCisJCSAgJiYgaXNkaWdpdCAoc3RyWzJdKSkpCisJICAgIGJyZWFrOworCX0KKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSAnIyc6CisgICAgY2FzZSAnJic6CisgICAgY2FzZSAnLCc6CisgICAgY2FzZSAnKSc6CisgICAgY2FzZSAnLyc6CisgICAgY2FzZSAnWyc6CisgICAgY2FzZSAnXSc6CisgICAgICByZXR1cm4gKnN0cisrOworICAgIGNhc2UgJysnOgorICAgICAgLyogSXQgc28gaGFwcGVucyB0aGF0IGEgJysnIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIG9mIGFuCisgICAgICAgICBvcGVyYW5kLiAgSWYgaXQgYXBwZWFycyBhbnl3aGVyZSBlbHNlLCBpdCBtdXN0IGJlIGEgdW5hcnkKKyAgICAgICAgIHBsdXMgb24gYW4gZXhwcmVzc2lvbi4gICovCisgICAgICBpZiAoc3RyWzFdID09ICdcMCcpCisJcmV0dXJuICpzdHIrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJy0nOgorICAgICAgLyogQSAnLScgY2FuIG9ubHkgYXBwZWFyIGluIC0oYXIpLCBybi1ybiwgb3IgYXJALS4gIElmIGl0CisgICAgICAgICBhcHBlYXJzIGFueXdoZXJlIGVsc2UsIGl0IG11c3QgYmUgYSB1bmFyeSBtaW51cyBvbiBhbgorICAgICAgICAgZXhwcmVzc2lvbi4gICovCisgICAgICBpZiAoc3RyWzFdID09ICdcMCcpCisJcmV0dXJuICpzdHIrKzsKKyAgICAgIHMgPSBzdHIgKyAxOworICAgICAgaWYgKCpzID09ICcoJykKKwkrK3M7CisgICAgICBpZiAobTY4a19yZWdfcGFyc2UgKCZzKSAhPSAwKQorCXJldHVybiAqc3RyKys7CisgICAgICBicmVhazsKKyAgICBjYXNlICcoJzoKKyAgICAgIC8qIEEgJygnIGNhbiBvbmx5IGFwcGVhciBpbiBgKHJlZyknLCBgKGV4cHIsLi4uJywgYChbJywgYEAoJywgb3IKKyAgICAgICAgIGApKCcuICBJZiBpdCBhcHBlYXJzIGFueXdoZXJlIGVsc2UsIGl0IG11c3QgYmUgc3RhcnRpbmcgYW4KKyAgICAgICAgIGV4cHJlc3Npb24uICAqLworICAgICAgaWYgKHN0clsxXSA9PSAnWycKKwkgIHx8IChzdHIgPiBzdHJvcmlnCisJICAgICAgJiYgKHN0clstMV0gPT0gJ0AnCisJCSAgfHwgc3RyWy0xXSA9PSAnKScpKSkKKwlyZXR1cm4gKnN0cisrOworICAgICAgcyA9IHN0ciArIDE7CisgICAgICBpZiAobTY4a19yZWdfcGFyc2UgKCZzKSAhPSAwKQorCXJldHVybiAqc3RyKys7CisgICAgICAvKiBDaGVjayBmb3IgdGhlIGNhc2Ugb2YgJyhleHByLC4uLicgYnkgc2Nhbm5pbmcgYWhlYWQuICBJZiB3ZQorICAgICAgICAgZmluZCBhIGNvbW1hIG91dHNpZGUgb2YgYmFsYW5jZWQgcGFyZW50aGVzZXMsIHdlIHJldHVybiAnKCcuCisgICAgICAgICBJZiB3ZSBmaW5kIGFuIHVuYmFsYW5jZWQgcmlnaHQgcGFyZW50aGVzaXMsIHRoZW4gcHJlc3VtYWJseQorICAgICAgICAgdGhlICcoJyByZWFsbHkgc3RhcnRzIGFuIGV4cHJlc3Npb24uICAqLworICAgICAgcGFyZW5zID0gMDsKKyAgICAgIGZvciAocyA9IHN0ciArIDE7ICpzICE9ICdcMCc7IHMrKykKKwl7CisJICBpZiAoKnMgPT0gJygnKQorCSAgICArK3BhcmVuczsKKwkgIGVsc2UgaWYgKCpzID09ICcpJykKKwkgICAgeworCSAgICAgIGlmIChwYXJlbnMgPT0gMCkKKwkJYnJlYWs7CisJICAgICAgLS1wYXJlbnM7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpzID09ICcsJyAmJiBwYXJlbnMgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEEgY29tbWEgY2FuIG5vdCBub3JtYWxseSBhcHBlYXIgaW4gYW4gZXhwcmVzc2lvbiwgc28KKwkJIHRoaXMgaXMgYSBjYXNlIG9mICcoZXhwciwuLi4nLiAgKi8KKwkgICAgICByZXR1cm4gKnN0cisrOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBTZWUgaWYgaXQncyBhIHJlZ2lzdGVyLiAgKi8KKworICByZWcgPSBtNjhrX3JlZ19wYXJzZSAoJnN0cik7CisgIGlmIChyZWcgIT0gMCkKKyAgICB7CisgICAgICBpbnQgcmV0OworCisgICAgICB5eWx2YWwucmVnID0gcmVnOworCisgICAgICBpZiAocmVnID49IERBVEEwICYmIHJlZyA8PSBEQVRBNykKKwlyZXQgPSBEUjsKKyAgICAgIGVsc2UgaWYgKHJlZyA+PSBBRERSMCAmJiByZWcgPD0gQUREUjcpCisJcmV0ID0gQVI7CisgICAgICBlbHNlIGlmIChyZWcgPj0gRlAwICYmIHJlZyA8PSBGUDcpCisJcmV0dXJuIEZQUjsKKyAgICAgIGVsc2UgaWYgKHJlZyA9PSBGUEkKKwkgICAgICAgfHwgcmVnID09IEZQUworCSAgICAgICB8fCByZWcgPT0gRlBDKQorCXJldHVybiBGUENSOworICAgICAgZWxzZSBpZiAocmVnID09IFBDKQorCXJldHVybiBMUEM7CisgICAgICBlbHNlIGlmIChyZWcgPj0gWkRBVEEwICYmIHJlZyA8PSBaREFUQTcpCisJcmV0ID0gWkRSOworICAgICAgZWxzZSBpZiAocmVnID49IFpBRERSMCAmJiByZWcgPD0gWkFERFI3KQorCXJldCA9IFpBUjsKKyAgICAgIGVsc2UgaWYgKHJlZyA9PSBaUEMpCisJcmV0dXJuIExaUEM7CisgICAgICBlbHNlCisJcmV0dXJuIENSRUc7CisKKyAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIGEgZGF0YSBvciBhZGRyZXNzIHJlZ2lzdGVyLiAgV2UKKwkgbXVzdCBjaGVjayBmb3IgYSBzaXplIG9yIHNjYWxlOyBpZiB3ZSBmaW5kIG9uZSwgd2UgbXVzdAorCSByZXR1cm4gSU5ERVhSRUcuICAqLworCisgICAgICBzID0gc3RyOworCisgICAgICBpZiAoKnMgIT0gJy4nICYmICpzICE9ICc6JyAmJiAqcyAhPSAnKicpCisJcmV0dXJuIHJldDsKKworICAgICAgeXlsdmFsLmluZGV4cmVnLnJlZyA9IHJlZzsKKworICAgICAgaWYgKCpzICE9ICcuJyAmJiAqcyAhPSAnOicpCisJeXlsdmFsLmluZGV4cmVnLnNpemUgPSBTSVpFX1VOU1BFQzsKKyAgICAgIGVsc2UKKwl7CisJICArK3M7CisJICBzd2l0Y2ggKCpzKQorCSAgICB7CisJICAgIGNhc2UgJ3cnOgorCSAgICBjYXNlICdXJzoKKwkgICAgICB5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfV09SRDsKKwkgICAgICArK3M7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2wnOgorCSAgICBjYXNlICdMJzoKKwkgICAgICB5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfTE9ORzsKKwkgICAgICArK3M7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgeXllcnJvciAoXygiaWxsZWdhbCBzaXplIHNwZWNpZmljYXRpb24iKSk7CisJICAgICAgeXlsdmFsLmluZGV4cmVnLnNpemUgPSBTSVpFX1VOU1BFQzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgeXlsdmFsLmluZGV4cmVnLnNjYWxlID0gMTsKKworICAgICAgaWYgKCpzID09ICcqJyB8fCAqcyA9PSAnOicpCisJeworCSAgZXhwcmVzc2lvblMgc2NhbGU7CisKKwkgICsrczsKKworCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisJICBleHByZXNzaW9uICgmc2NhbGUpOworCSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisKKwkgIGlmIChzY2FsZS5YX29wICE9IE9fY29uc3RhbnQpCisJICAgIHl5ZXJyb3IgKF8oInNjYWxlIHNwZWNpZmljYXRpb24gbXVzdCByZXNvbHZlIHRvIGEgbnVtYmVyIikpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3dpdGNoIChzY2FsZS5YX2FkZF9udW1iZXIpCisJCXsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJY2FzZSA4OgorCQkgIHl5bHZhbC5pbmRleHJlZy5zY2FsZSA9IHNjYWxlLlhfYWRkX251bWJlcjsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICB5eWVycm9yIChfKCJpbnZhbGlkIHNjYWxlIHZhbHVlIikpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIHN0ciA9IHM7CisKKyAgICAgIHJldHVybiBJTkRFWFJFRzsKKyAgICB9CisKKyAgLyogSXQgbXVzdCBiZSBhbiBleHByZXNzaW9uLiAgQmVmb3JlIHdlIGNhbGwgZXhwcmVzc2lvbiwgd2UgbmVlZCB0bworICAgICBsb29rIGFoZWFkIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHNpemUgc3BlY2lmaWNhdGlvbi4gIFdlIG11c3QgZG8KKyAgICAgdGhhdCBmaXJzdCwgYmVjYXVzZSBvdGhlcndpc2UgZm9vLmwgd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBzeW1ib2wKKyAgICAgZm9vLmwsIHJhdGhlciB0aGFuIGFzIHRoZSBzeW1ib2wgZm9vIHdpdGggYSBsb25nIHNpemUKKyAgICAgc3BlY2lmaWNhdGlvbi4gIFRoZSBncmFtbWFyIHJlcXVpcmVzIHRoYXQgYWxsIGV4cHJlc3Npb25zIGVuZCBhdAorICAgICB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kLCBvciB3aXRoICcsJywgJygnLCAnXScsICcpJy4gICovCisKKyAgcGFyZW5zID0gMDsKKyAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnOyBzKyspCisgICAgeworICAgICAgaWYgKCpzID09ICcoJykKKwl7CisJICBpZiAocGFyZW5zID09IDAKKwkgICAgICAmJiBzID4gc3RyCisJICAgICAgJiYgKHNbLTFdID09ICcpJyB8fCBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc1stMV0pKSkKKwkgICAgYnJlYWs7CisJICArK3BhcmVuczsKKwl9CisgICAgICBlbHNlIGlmICgqcyA9PSAnKScpCisJeworCSAgaWYgKHBhcmVucyA9PSAwKQorCSAgICBicmVhazsKKwkgIC0tcGFyZW5zOworCX0KKyAgICAgIGVsc2UgaWYgKHBhcmVucyA9PSAwCisJICAgICAgICYmICgqcyA9PSAnLCcgfHwgKnMgPT0gJ10nKSkKKwlicmVhazsKKyAgICB9CisKKyAgeXlsdmFsLmV4cC5zaXplID0gU0laRV9VTlNQRUM7CisgIGlmIChzIDw9IHN0ciArIDIKKyAgICAgIHx8IChzWy0yXSAhPSAnLicgJiYgc1stMl0gIT0gJzonKSkKKyAgICB0YWlsID0gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN3aXRjaCAoc1stMV0pCisJeworCWNhc2UgJ3MnOgorCWNhc2UgJ1MnOgorCWNhc2UgJ2InOgorCWNhc2UgJ0InOgorCSAgeXlsdmFsLmV4cC5zaXplID0gU0laRV9CWVRFOworCSAgYnJlYWs7CisJY2FzZSAndyc6CisJY2FzZSAnVyc6CisJICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX1dPUkQ7CisJICBicmVhazsKKwljYXNlICdsJzoKKwljYXNlICdMJzoKKwkgIHl5bHZhbC5leHAuc2l6ZSA9IFNJWkVfTE9ORzsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICBpZiAoeXlsdmFsLmV4cC5zaXplICE9IFNJWkVfVU5TUEVDKQorCXRhaWwgPSAyOworICAgIH0KKworI2lmZGVmIE9CSl9FTEYKKyAgeworICAgIC8qIExvb2sgZm9yIEBQTFRQQywgZXRjLiAgKi8KKyAgICBjaGFyICpjcDsKKworICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX25vbmU7CisgICAgY3AgPSBzIC0gdGFpbDsKKyAgICBpZiAoY3AgLSA2ID4gc3RyICYmIGNwWy02XSA9PSAnQCcpCisgICAgICB7CisJaWYgKHN0cm5jbXAgKGNwIC0gNiwgIkBQTFRQQyIsIDYpID09IDApCisJICB7CisJICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX3BsdF9wY3JlbDsKKwkgICAgdGFpbCArPSA2OworCSAgfQorCWVsc2UgaWYgKHN0cm5jbXAgKGNwIC0gNiwgIkBHT1RQQyIsIDYpID09IDApCisJICB7CisJICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX2dvdF9wY3JlbDsKKwkgICAgdGFpbCArPSA2OworCSAgfQorICAgICAgfQorICAgIGVsc2UgaWYgKGNwIC0gNCA+IHN0ciAmJiBjcFstNF0gPT0gJ0AnKQorICAgICAgeworCWlmIChzdHJuY21wIChjcCAtIDQsICJAUExUIiwgNCkgPT0gMCkKKwkgIHsKKwkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfcGx0X29mZjsKKwkgICAgdGFpbCArPSA0OworCSAgfQorCWVsc2UgaWYgKHN0cm5jbXAgKGNwIC0gNCwgIkBHT1QiLCA0KSA9PSAwKQorCSAgeworCSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19nb3Rfb2ZmOworCSAgICB0YWlsICs9IDQ7CisJICB9CisgICAgICB9CisgIH0KKyNlbmRpZgorCisgIGlmICh0YWlsICE9IDApCisgICAgeworICAgICAgYyA9IHNbLXRhaWxdOworICAgICAgc1stdGFpbF0gPSAwOworICAgIH0KKworICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7CisgIGV4cHJlc3Npb24gKCZ5eWx2YWwuZXhwLmV4cCk7CisgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKworICBpZiAodGFpbCAhPSAwKQorICAgIHsKKyAgICAgIHNbLXRhaWxdID0gYzsKKyAgICAgIHN0ciA9IHM7CisgICAgfQorCisgIHJldHVybiBFWFBSOworfQorCisvKiBQYXJzZSBhbiBtNjhrIG9wZXJhbmQuICBUaGlzIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZAorICAgZnJvbSBvdXRzaWRlIHRoaXMgZmlsZS4gICovCisKK2ludAorbTY4a19pcF9vcCAocywgb3BhcmcpCisgICAgIGNoYXIgKnM7CisgICAgIHN0cnVjdCBtNjhrX29wICpvcGFyZzsKK3sKKyAgbWVtc2V0IChvcGFyZywgMCwgc2l6ZW9mICpvcGFyZyk7CisgIG9wYXJnLT5lcnJvciA9IE5VTEw7CisgIG9wYXJnLT5pbmRleC5yZWcgPSBaREFUQTA7CisgIG9wYXJnLT5pbmRleC5zY2FsZSA9IDE7CisgIG9wYXJnLT5kaXNwLmV4cC5YX29wID0gT19hYnNlbnQ7CisgIG9wYXJnLT5vZGlzcC5leHAuWF9vcCA9IE9fYWJzZW50OworCisgIHN0ciA9IHN0cm9yaWcgPSBzOworICBvcCA9IG9wYXJnOworCisgIHJldHVybiB5eXBhcnNlICgpOworfQorCisvKiBUaGUgZXJyb3IgaGFuZGxlci4gICovCisKK3N0YXRpYyB2b2lkCit5eWVycm9yIChzKQorICAgICBjb25zdCBjaGFyICpzOworeworICBvcC0+ZXJyb3IgPSBzOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oIGIvZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDY0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL204OGstb3Bjb2RlLmgKQEAgLTAsMCArMSw1NTkgQEAKKy8qIG04OGstb3Bjb2RlLmggLS0gSW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAorICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5CisgICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKK0dBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKKyNkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKgorICBDaGFyYWN0ZXIgY29kZXMgZm9yIG9wX3NwZWMgZmllbGQgYmVsb3cuCisgIFJlc2VydmVkIGZvciBzZWxmLW1hdGNoaW5nOiBbIF0gLAorCisgIGQgPSBHUkYgRGVzdGluYXRpb24gcmVnaXN0ZXIgKDIxOjUpCisgIHggPSBYUkYgcmVnaXN0ZXIgcHJlZml4LiAgTWFrZXMgbmV4dCBkLCAxLCBvciAyLCBtYXRjaCBhbiBleHRlbmRlZCByZWdpc3Rlci4KKyAgMSA9IFNvdXJjZSByZWdpc3RlciAxICgxNjo1KQorICAyID0gU291cmNlIHJlZ2lzdGVyIDIgKDA6NSkKKyAgMyA9IEJvdGggc291cmNlIHJlZ2lzdGVycyAoc2FtZSB2YWx1ZSkgKDA6NSBhbmQgMTY6NSkKKyAgSSA9IElNTTE2ICgwOjE2KQorICBiID0gYml0IGZpZWxkIHNwZWMuICgwOjEwKQorICBwID0gMTYgYml0IHBjIGRpc3BsLiAoMDoxNikKKyAgUCA9IDI2IGJpdCBwYyBkaXNwbC4gKDA6MjYpCisgIEIgPSBiYjAvYmIxIGNvbmRpdGlvbiAoMjE6NSkKKyAgTSA9IGJjbmQgY29uZGl0aW9uICgyMTo1KQorICBmID0gZmNyICg1OjYpCisgIGMgPSBjciAoNTo2KQorICBWID0gVkVDOSAoMDo5KQorICBvID0gTzYgZmllbGQgb2YgInByb3QiIGluc24gKDEwOjcpCisgID8gPSBHaXZlIHdhcm5pbmcgZm9yIHRoaXMgaW5zbi9vcGVyYW5kIGNvbWJpbmF0aW9uCisgKi8KKworLyogaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IG04OGtfb3Bjb2RlCit7CisgIHVuc2lnbmVkIGludCBvcGNvZGU7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKm9wX3NwZWM7Cit9OworCisvKiBhbmQgaW50cm9kdWNpbmcuLi4gdGhlIE1vdG9yb2xhIDg4MTAwIGFuZCA4ODExMCBpbnN0cnVjdGlvbiBzZXRzLi4uICovCisKKy8qIEJ5IGRlZmF1bHQsIGluY2x1ZGUgdGhlIDg4MTEwIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIE1DODgxMTAKKworI2lmIGRlZmluZWQgKE1DODgxMTApCisjZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpCisjZGVmaW5lIF9NQzg4MTEwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKKyNlbHNlCisjZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKKyNkZWZpbmUgX01DODgxMTAoT1BDT0RFLE1ORU0sT1BfU1BFQykKKyNlbmRpZgorCisjZGVmaW5lIF9NQzg4eHh4KE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKKworLyogRXF1YWwgbW5lbW9uaWNzIG11c3QgYmUgYWRqYWNlbnQuCisgICBNb3JlIHNwZWNpZmljIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBtdXN0IGdvIGJlZm9yZSBtb3JlIGdlbmVyYWwuCisgICBGb3IgZXhhbXBsZSwgImQsMSwyIiBtdXN0IGdvIGJlZm9yZSAiZCwxLEkiIGFzIGEgcmVnaXN0ZXIgZm9yIHMyCisgICB3b3VsZCBvdGhlcndpc2UgYmUgY29uc2lkZXJlZCBhIHZhcmlhYmxlIG5hbWUuICAqLworCitzdGF0aWMgc3RydWN0IG04OGtfb3Bjb2RlIG04OGtfb3Bjb2Rlc1tdID0KK3sKKyAgLyoJICAgT3Bjb2RlCU1uZW1vbmljCU9wc3BlYyAqLworCisgIF9NQzg4eHh4ICgweGY0MDA3MDAwLCAiYWRkIiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDcwMDAwMDAwLCAiYWRkIiwJCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDA3MjAwLCAiYWRkLmNpIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDczMDAsICJhZGQuY2lvIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDcxMDAsICJhZGQuY28iLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImFkZHUiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4NjAwMDAwMDAsICJhZGR1IiwJCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDA2MjAwLCAiYWRkdS5jaSIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDA2MzAwLCAiYWRkdS5jaW8iLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwNjEwMCwgImFkZHUuY28iLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwNDAwMCwgImFuZCIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg0MDAwMDAwMCwgImFuZCIsCQkiZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwNDQwMCwgImFuZC5jIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4NDQwMDAwMDAsICJhbmQudSIsCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGQwMDAwMDAwLCAiYmIwIiwJCSJCLDEscCIpCisgIF9NQzg4eHh4ICgweGQ0MDAwMDAwLCAiYmIwLm4iLAkiQiwxLHAiKQorICBfTUM4OHh4eCAoMHhkODAwMDAwMCwgImJiMSIsCQkiQiwxLHAiKQorICBfTUM4OHh4eCAoMHhkYzAwMDAwMCwgImJiMS5uIiwJIkIsMSxwIikKKyAgX01DODh4eHggKDB4ZTgwMDAwMDAsICJiY25kIiwJCSJNLDEscCIpCisgIF9NQzg4eHh4ICgweGVjMDAwMDAwLCAiYmNuZC5uIiwJIk0sMSxwIikKKyAgX01DODh4eHggKDB4YzAwMDAwMDAsICJiciIsCQkiUCIpCisgIF9NQzg4eHh4ICgweGM0MDAwMDAwLCAiYnIubiIsCQkiUCIpCisgIF9NQzg4eHh4ICgweGM4MDAwMDAwLCAiYnNyIiwJCSJQIikKKyAgX01DODh4eHggKDB4Y2MwMDAwMDAsICJic3IubiIsCSJQIikKKyAgX01DODh4eHggKDB4ZjQwMDgwMDAsICJjbHIiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjAwMDgwMDAsICJjbHIiLAkJImQsMSxiIikKKyAgX01DODh4eHggKDB4ZjQwMDdjMDAsICJjbXAiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4N2MwMDAwMDAsICJjbXAiLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXYiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4NzgwMDAwMDAsICJkaXYiLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXZzIiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDc4MDAwMDAwLCAiZGl2cyIsCQkiZCwxLEkiKQorICBfTUM4ODExMCAoMHhmNDAwNjkwMCwgImRpdnUuZCIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDA2ODAwLCAiZGl2dSIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg2ODAwMDAwMCwgImRpdnUiLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDkwMDAsICJleHQiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjAwMDkwMDAsICJleHQiLAkJImQsMSxiIikKKyAgX01DODh4eHggKDB4ZjQwMDk4MDAsICJleHR1IiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGYwMDA5ODAwLCAiZXh0dSIsCQkiZCwxLGIiKQorICBfTUM4OHh4eCAoMHg4NDAwMjgwMCwgImZhZGQuc3NzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGE4MDAsICJmYWRkLnNzcyIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAyODgwLCAiZmFkZC5zc2QiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYTgyMCwgImZhZGQuc3NkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGE4NDAsICJmYWRkLnNzeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAyYTAwLCAiZmFkZC5zZHMiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYTg4MCwgImZhZGQuc2RzIiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDJhODAsICJmYWRkLnNkZCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBhOGEwLCAiZmFkZC5zZGQiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYThjMCwgImZhZGQuc2R4IiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGE5MDAsICJmYWRkLnN4cyIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBhOTIwLCAiZmFkZC5zeGQiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYTk0MCwgImZhZGQuc3h4IiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDI4MjAsICJmYWRkLmRzcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBhYTAwLCAiZmFkZC5kc3MiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMjhhMCwgImZhZGQuZHNkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGFhMjAsICJmYWRkLmRzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBhYTQwLCAiZmFkZC5kc3giLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMmEyMCwgImZhZGQuZGRzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGFhODAsICJmYWRkLmRkcyIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAyYWEwLCAiZmFkZC5kZGQiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYWFhMCwgImZhZGQuZGRkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGFhYzAsICJmYWRkLmRkeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBhYjAwLCAiZmFkZC5keHMiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYWIyMCwgImZhZGQuZHhkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGFiNDAsICJmYWRkLmR4eCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBhYzAwLCAiZmFkZC54c3MiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYWMyMCwgImZhZGQueHNkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGFjNDAsICJmYWRkLnhzeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBhYzgwLCAiZmFkZC54ZHMiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYWNhMCwgImZhZGQueGRkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGFjYzAsICJmYWRkLnhkeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBhZDAwLCAiZmFkZC54eHMiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYWQyMCwgImZhZGQueHhkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGFkNDAsICJmYWRkLnh4eCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAzYTgwLCAiZmNtcC5zZGQiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYmE4MCwgImZjbXAuc2RkIiwJImQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwM2EwMCwgImZjbXAuc2RzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGJhMDAsICJmY21wLnNkcyIsCSJkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGJiMDAsICJmY21wLnNkeCIsCSJkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDM4ODAsICJmY21wLnNzZCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBiODgwLCAiZmNtcC5zc2QiLAkiZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAzODAwLCAiZmNtcC5zc3MiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjgwMCwgImZjbXAuc3NzIiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjkwMCwgImZjbXAuc3N4IiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYmM4MCwgImZjbXAuc3hkIiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYmMwMCwgImZjbXAuc3hzIiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYmQwMCwgImZjbXAuc3h4IiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwM2FhMCwgImZjbXB1LnNkZCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBiYWEwLCAiZmNtcHUuc2RkIiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwM2EyMCwgImZjbXB1LnNkcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBiYTIwLCAiZmNtcHUuc2RzIiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYmIyMCwgImZjbXB1LnNkeCIsCSJkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDM4YTAsICJmY21wdS5zc2QiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjhhMCwgImZjbXB1LnNzZCIsCSJkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDM4MjAsICJmY21wdS5zc3MiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjgyMCwgImZjbXB1LnNzcyIsCSJkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGI5MjAsICJmY21wdS5zc3giLAkiZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiY2EwLCAiZmNtcHUuc3hkIiwJImQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYmMyMCwgImZjbXB1LnN4cyIsCSJkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGJkMjAsICJmY21wdS5zeHgiLAkiZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDAwODgwLCAiZmN2dC5kcyIsCSJkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwODg4MCwgImZjdnQuZHMiLAkieGQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODhjMCwgImZjdnQuZHgiLAkieGQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwMDgyMCwgImZjdnQuc2QiLAkiZCwyIikKKyAgX01DODgxMTAgKDB4ODQwMDg4MjAsICJmY3Z0LnNkIiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDg4NDAsICJmY3Z0LnN4IiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDg5MjAsICJmY3Z0LnhkIiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDg5MDAsICJmY3Z0LnhzIiwJInhkLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDcwMDAsICJmZGl2LnNzcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBmMDAwLCAiZmRpdi5zc3MiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwNzA4MCwgImZkaXYuc3NkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGYwMjAsICJmZGl2LnNzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmMDQwLCAiZmRpdi5zc3giLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwNzIwMCwgImZkaXYuc2RzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGYwODAsICJmZGl2LnNkcyIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDA3MjgwLCAiZmRpdi5zZGQiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjBhMCwgImZkaXYuc2RkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGYwYzAsICJmZGl2LnNkeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmMTAwLCAiZmRpdi5zeHMiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjEyMCwgImZkaXYuc3hkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGYxNDAsICJmZGl2LnN4eCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDA3MDIwLCAiZmRpdi5kc3MiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjIwMCwgImZkaXYuZHNzIiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDcwYTAsICJmZGl2LmRzZCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBmMjIwLCAiZmRpdi5kc2QiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjI0MCwgImZkaXYuZHN4IiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDcyMjAsICJmZGl2LmRkcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBmMjgwLCAiZmRpdi5kZHMiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwNzJhMCwgImZkaXYuZGRkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGYyYTAsICJmZGl2LmRkZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmMmMwLCAiZmRpdi5kZHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjMwMCwgImZkaXYuZHhzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGYzMjAsICJmZGl2LmR4ZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmMzQwLCAiZmRpdi5keHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjQwMCwgImZkaXYueHNzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGY0MjAsICJmZGl2LnhzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmNDQwLCAiZmRpdi54c3giLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjQ4MCwgImZkaXYueGRzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGY0YTAsICJmZGl2LnhkZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmNGMwLCAiZmRpdi54ZHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjUwMCwgImZkaXYueHhzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGY1MjAsICJmZGl2Lnh4ZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmNTQwLCAiZmRpdi54eHgiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHhmNDAwZWMwMCwgImZmMCIsCQkiZCwyIikKKyAgX01DODh4eHggKDB4ZjQwMGU4MDAsICJmZjEiLAkJImQsMiIpCisgIF9NQzg4eHh4ICgweDgwMDA0ODAwLCAiZmxkY3IiLAkiZCxmIikKKyAgX01DODh4eHggKDB4ODQwMDIwMjAsICJmbHQuZHMiLAkiZCwyIikKKyAgX01DODgxMTAgKDB4ODQwMDIyMjAsICJmbHQuZHMiLAkieGQsMiIpCisgIF9NQzg4eHh4ICgweDg0MDAyMDAwLCAiZmx0LnNzIiwJImQsMiIpCisgIF9NQzg4MTEwICgweDg0MDAyMjAwLCAiZmx0LnNzIiwJInhkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwMjI0MCwgImZsdC54cyIsCSJ4ZCwyIikKKyAgX01DODh4eHggKDB4ODQwMDAwMDAsICJmbXVsLnNzcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDA4MDAwLCAiZm11bC5zc3MiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMDA4MCwgImZtdWwuc3NkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMDgwMjAsICJmbXVsLnNzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4MDQwLCAiZm11bC5zc3giLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMDIwMCwgImZtdWwuc2RzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMDgwODAsICJmbXVsLnNkcyIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAwMjgwLCAiZm11bC5zZGQiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwODBhMCwgImZtdWwuc2RkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDgwYzAsICJmbXVsLnNkeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4MTAwLCAiZm11bC5zeHMiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODEyMCwgImZtdWwuc3hkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDgxNDAsICJmbXVsLnN4eCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAwMDIwLCAiZm11bC5kc3MiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwODIwMCwgImZtdWwuZHNzIiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDAwYTAsICJmbXVsLmRzZCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDA4MjIwLCAiZm11bC5kc2QiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODI0MCwgImZtdWwuZHN4IiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDAyMjAsICJmbXVsLmRkcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDA4MjgwLCAiZm11bC5kZHMiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMDJhMCwgImZtdWwuZGRkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMDgyYTAsICJmbXVsLmRkZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4MmMwLCAiZm11bC5kZHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODMwMCwgImZtdWwuZHhzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDgzMjAsICJmbXVsLmR4ZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4MzQwLCAiZm11bC5keHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODQwMCwgImZtdWwueHNzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDg0MjAsICJmbXVsLnhzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4NDQwLCAiZm11bC54c3giLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODQ4MCwgImZtdWwueGRzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDg0YTAsICJmbXVsLnhkZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4NGMwLCAiZm11bC54ZHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwODUwMCwgImZtdWwueHhzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDg1MjAsICJmbXVsLnh4ZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDA4NTQwLCAiZm11bC54eHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwNzhhMCwgImZzcXJ0LmRkIiwJImQsMiIpCisgIF9NQzg4MTEwICgweDg0MDBmOGEwLCAiZnNxcnQuZGQiLAkieGQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwNzg4MCwgImZzcXJ0LmRzIiwJImQsMiIpCisgIF9NQzg4MTEwICgweDg0MDBmODgwLCAiZnNxcnQuZHMiLAkieGQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjhjMCwgImZzcXJ0LmR4IiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDc4MjAsICJmc3FydC5zZCIsCSJkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjgyMCwgImZzcXJ0LnNkIiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMDc4MDAsICJmc3FydC5zcyIsCSJkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjgwMCwgImZzcXJ0LnNzIiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGY4NDAsICJmc3FydC5zeCIsCSJ4ZCx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBmOTIwLCAiZnNxcnQueGQiLAkieGQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwZjkwMCwgImZzcXJ0LnhzIiwJInhkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGY5NDAsICJmc3FydC54eCIsCSJ4ZCx4MiIpCisgIF9NQzg4eHh4ICgweDgwMDA4ODAwLCAiZnN0Y3IiLAkiMyxmIikKKyAgX01DODh4eHggKDB4ODQwMDMwMDAsICJmc3ViLnNzcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBiMDAwLCAiZnN1Yi5zc3MiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMzA4MCwgImZzdWIuc3NkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGIwMjAsICJmc3ViLnNzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiMDQwLCAiZnN1Yi5zc3giLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMzIwMCwgImZzdWIuc2RzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGIwODAsICJmc3ViLnNkcyIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAzMjgwLCAiZnN1Yi5zZGQiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjBhMCwgImZzdWIuc2RkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGIwYzAsICJmc3ViLnNkeCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiMTAwLCAiZnN1Yi5zeHMiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjEyMCwgImZzdWIuc3hkIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGIxNDAsICJmc3ViLnN4eCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDAzMDIwLCAiZnN1Yi5kc3MiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjIwMCwgImZzdWIuZHNzIiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDMwYTAsICJmc3ViLmRzZCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBiMjIwLCAiZnN1Yi5kc2QiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjI0MCwgImZzdWIuZHN4IiwJInhkLHgxLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDMyMjAsICJmc3ViLmRkcyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg0MDBiMjgwLCAiZnN1Yi5kZHMiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4NDAwMzJhMCwgImZzdWIuZGRkIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODQwMGIyYTAsICJmc3ViLmRkZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiMmMwLCAiZnN1Yi5kZHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjMwMCwgImZzdWIuZHhzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGIzMjAsICJmc3ViLmR4ZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiMzQwLCAiZnN1Yi5keHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjQwMCwgImZzdWIueHNzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGI0MjAsICJmc3ViLnhzZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiNDQwLCAiZnN1Yi54c3giLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjQ4MCwgImZzdWIueGRzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGI0YTAsICJmc3ViLnhkZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiNGMwLCAiZnN1Yi54ZHgiLAkieGQseDEseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYjUwMCwgImZzdWIueHhzIiwJInhkLHgxLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGI1MjAsICJmc3ViLnh4ZCIsCSJ4ZCx4MSx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBiNTQwLCAiZnN1Yi54eHgiLAkieGQseDEseDIiKQorICBfTUM4OHh4eCAoMHg4MDAwYzgwMCwgImZ4Y3IiLAkJImQsMyxmIikKKyAgX01DODh4eHggKDB4ODQwMGZjMDEsICJpbGxvcDEiLAkiIikKKyAgX01DODh4eHggKDB4ODQwMGZjMDIsICJpbGxvcDIiLAkiIikKKyAgX01DODh4eHggKDB4ODQwMGZjMDMsICJpbGxvcDMiLAkiIikKKyAgX01DODh4eHggKDB4ODQwMDQ4ODAsICJpbnQuc2QiLAkiZCwyIikKKyAgX01DODgxMTAgKDB4ODQwMGM4ODAsICJpbnQuc2QiLAkiZCx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDA0ODAwLCAiaW50LnNzIiwJImQsMiIpCisgIF9NQzg4MTEwICgweDg0MDBjODAwLCAiaW50LnNzIiwJImQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwYzkwMCwgImludC5zeCIsCSJkLHgyIikKKyAgX01DODh4eHggKDB4ZjQwMGMwMDAsICJqbXAiLAkJIjIiKQorICBfTUM4OHh4eCAoMHhmNDAwYzQwMCwgImptcC5uIiwJIjIiKQorICBfTUM4OHh4eCAoMHhmNDAwYzgwMCwgImpzciIsCQkiMiIpCisgIF9NQzg4eHh4ICgweGY0MDBjYzAwLCAianNyLm4iLAkiMiIpCisgIF9NQzg4eHh4ICgweGY0MDAxNDAwLCAibGQiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDE2MDAsICJsZCIsCQkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4MTQwMDAwMDAsICJsZCIsCQkiZCwxLEkiKQorICBfTUM4ODExMCAoMHhmMDAwMTYwMCwgImxkIiwJCSJ4ZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjAwMDE0MDAsICJsZCIsCQkieGQsMSwyIikKKyAgX01DODgxMTAgKDB4MDQwMDAwMDAsICJsZCIsCQkieGQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDFlMDAsICJsZC5iIiwJCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMWMwMCwgImxkLmIiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4MWMwMDAwMDAsICJsZC5iIiwJCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDAxZDAwLCAibGQuYi51c3IiLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwMWYwMCwgImxkLmIudXNyIiwJImQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDAwZTAwLCAibGQuYnUiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDBjMDAsICJsZC5idSIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDBjMDAwMDAwLCAibGQuYnUiLAkiZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwMGQwMCwgImxkLmJ1LnVzciIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDAwZjAwLCAibGQuYnUudXNyIiwJImQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDAxMjAwLCAibGQuZCIsCQkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDEwMDAsICJsZC5kIiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDEwMDAwMDAwLCAibGQuZCIsCQkiZCwxLEkiKQorICBfTUM4ODExMCAoMHhmMDAwMTIwMCwgImxkLmQiLAkJInhkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMTAwMCwgImxkLmQiLAkJInhkLDEsMiIpCisgIF9NQzg4MTEwICgweDAwMDAwMDAwLCAibGQuZCIsCQkieGQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDExMDAsICJsZC5kLnVzciIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDAxMzAwLCAibGQuZC51c3IiLAkiZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjAwMDExMDAsICJsZC5kLnVzciIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMTMwMCwgImxkLmQudXNyIiwJInhkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMWEwMCwgImxkLmgiLAkJImQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDAxODAwLCAibGQuaCIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHgxODAwMDAwMCwgImxkLmgiLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDE5MDAsICJsZC5oLnVzciIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDAxYjAwLCAibGQuaC51c3IiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDBhMDAsICJsZC5odSIsCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMDgwMCwgImxkLmh1IiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4MDgwMDAwMDAsICJsZC5odSIsCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDAwOTAwLCAibGQuaHUudXNyIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDBiMDAsICJsZC5odS51c3IiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDE1MDAsICJsZC51c3IiLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwMTcwMCwgImxkLnVzciIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMTUwMCwgImxkLnVzciIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMTcwMCwgImxkLnVzciIsCSJ4ZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjAwMDFhMDAsICJsZC54IiwJCSJ4ZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjAwMDE4MDAsICJsZC54IiwJCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHgzYzAwMDAwMCwgImxkLngiLAkJInhkLDEsSSIpCisgIF9NQzg4MTEwICgweGYwMDAxOTAwLCAibGQueC51c3IiLAkieGQsMSwyIikKKyAgX01DODgxMTAgKDB4ZjAwMDFiMDAsICJsZC54LnVzciIsCSJ4ZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDM2MDAsICJsZGEiLAkJImQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDA2MDAwLCAibGRhIiwJCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLworICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYSIsCQkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KKyAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxWzJdIikJLyogT3V0cHV0IGFkZHUgKi8KKyAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLworICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5iIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCisgIF9NQzg4eHh4ICgweGY0MDAzMjAwLCAibGRhLmQiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuZCIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLworICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5kIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCisgIF9NQzg4MTEwICgweGY0MDAzZTAwLCAibGRhLngiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDNhMDAsICJsZGEuaCIsCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5oIiwJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCisgIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhLmgiLAkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KKyAgX01DODh4eHggKDB4ODAwMDQwMDAsICJsZGNyIiwJCSJkLGMiKQorICBfTUM4OHh4eCAoMHhmNDAwYTAwMCwgIm1hayIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmMDAwYTAwMCwgIm1hayIsCQkiZCwxLGIiKQorICBfTUM4OHh4eCAoMHg0ODAwMDAwMCwgIm1hc2siLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4NGMwMDAwMDAsICJtYXNrLnUiLAkiZCwxLEkiKQorICBfTUM4ODExMCAoMHg4NDAwYzAwMCwgIm1vdi5zIiwJImQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwNDIwMCwgIm1vdi5zIiwJInhkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYzA4MCwgIm1vdi5kIiwJImQseDIiKQorICBfTUM4ODExMCAoMHg4NDAwNDI4MCwgIm1vdi5kIiwJInhkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwYzMwMCwgIm1vdiIsCQkieGQseDIiKQorICBfTUM4OHh4eCAoMHhmNDAwNmMwMCwgIm11bCIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg2YzAwMDAwMCwgIm11bCIsCQkiZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwNmUwMCwgIm11bHMiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWxzIiwJCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDA2YzAwLCAibXVsdSIsCQkiZCwxLDIiKQkvKiBzeW5vbnltIGZvciBtdWwgKi8KKyAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWx1IiwJCSJkLDEsSSIpCS8qIHN5bm9ueW0gZm9yIG11bCAqLworICBfTUM4ODExMCAoMHhmNDAwNmQwMCwgIm11bHUuZCIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDg0MDA1MDgwLCAibmludC5zZCIsCSJkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwZDA4MCwgIm5pbnQuc2QiLAkiZCx4MiIpCisgIF9NQzg4eHh4ICgweDg0MDA1MDAwLCAibmludC5zcyIsCSJkLDIiKQorICBfTUM4ODExMCAoMHg4NDAwZDAwMCwgIm5pbnQuc3MiLAkiZCx4MiIpCisgIF9NQzg4MTEwICgweDg0MDBkMTAwLCAibmludC5zeCIsCSJkLHgyIikKKyAgX01DODh4eHggKDB4ZjQwMDU4MDAsICJvciIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg1ODAwMDAwMCwgIm9yIiwJCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDA1YzAwLCAib3IuYyIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg1YzAwMDAwMCwgIm9yLnUiLAkJImQsMSxJIikKKyAgX01DODgxMTAgKDB4ODgwMDIwMjAsICJwYWRkLmIiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMjA0MCwgInBhZGQuaCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDAyMDYwLCAicGFkZCIsCQkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMjBhMCwgInBhZGRzLnUuYiIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDAyMGMwLCAicGFkZHMudS5oIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDIwZTAsICJwYWRkcy51IiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDIxMjAsICJwYWRkcy51cy5iIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDIxNDAsICJwYWRkcy51cy5oIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDIxNjAsICJwYWRkcy51cyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDAyMWEwLCAicGFkZHMucy5iIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDIxYzAsICJwYWRkcy5zLmgiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMjFlMCwgInBhZGRzLnMiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMzg2MCwgInBjbXAiLAkJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDAwMDAsICJwbXVsIiwJCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA2NDIwLCAicHBhY2suMzIuYiIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA2MjQwLCAicHBhY2suMTYuaCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA2NDQwLCAicHBhY2suMzIuaCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA2MTYwLCAicHBhY2suOCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA2MjYwLCAicHBhY2suMTYiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwNjQ2MCwgInBwYWNrLjMyIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDc4MDAsICJwcm90IiwJCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA3MDAwLCAicHJvdCIsCQkiZCwxLG8iKQorICBfTUM4ODExMCAoMHg4ODAwMzAyMCwgInBzdWIuYiIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDAzMDQwLCAicHN1Yi5oIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDMwNjAsICJwc3ViIiwJCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDAzMGEwLCAicHN1YnMudS5iIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDMwYzAsICJwc3Vicy51LmgiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMzBlMCwgInBzdWJzLnUiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMzEyMCwgInBzdWJzLnVzLmIiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMzE0MCwgInBzdWJzLnVzLmgiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMzE2MCwgInBzdWJzLnVzIiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ODgwMDMxYTAsICJwc3Vicy5zLmIiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHg4ODAwMzFjMCwgInBzdWJzLnMuaCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDAzMWUwLCAicHN1YnMucyIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweDg4MDA2ODAwLCAicHVucGsubiIsCSJkLDEiKQorICBfTUM4ODExMCAoMHg4ODAwNjgyMCwgInB1bnBrLmIiLAkiZCwxIikKKyAgX01DODgxMTAgKDB4ODgwMDY4NDAsICJwdW5way5oIiwJImQsMSIpCisgIF9NQzg4eHh4ICgweGY0MDBhODAwLCAicm90IiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGYwMDBhODAwLCAicm90IiwJCSJkLDEsYiIpCisgIF9NQzg4eHh4ICgweGY0MDBmYzAwLCAicnRlIiwJCSIiKQorICBfTUM4OHh4eCAoMHhmNDAwODgwMCwgInNldCIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmMDAwODgwMCwgInNldCIsCQkiZCwxLGIiKQorICBfTUM4OHh4eCAoMHhmNDAwMjYwMCwgInN0IiwJCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMjQwMCwgInN0IiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDI0MDAwMDAwLCAic3QiLAkJImQsMSxJIikKKyAgX01DODgxMTAgKDB4ZjAwMDI2MDAsICJzdCIsCQkieGQsMVsyXSIpCisgIF9NQzg4MTEwICgweGYwMDAyNDAwLCAic3QiLAkJInhkLDEsMiIpCisgIF9NQzg4MTEwICgweDM0MDAwMDAwLCAic3QiLAkJInhkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDAyZTAwLCAic3QuYiIsCQkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDJjMDAsICJzdC5iIiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDJjMDAwMDAwLCAic3QuYiIsCQkiZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwMmQwMCwgInN0LmIudXNyIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDJmMDAsICJzdC5iLnVzciIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmNDAwMmQ4MCwgInN0LmIudXNyLnd0IiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ZjQwMDJmODAsICJzdC5iLnVzci53dCIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmNDAwMmM4MCwgInN0LmIud3QiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHhmNDAwMmU4MCwgInN0LmIud3QiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDIyMDAsICJzdC5kIiwJCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMjAwMCwgInN0LmQiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4MjAwMDAwMDAsICJzdC5kIiwJCSJkLDEsSSIpCisgIF9NQzg4MTEwICgweGYwMDAyMjAwLCAic3QuZCIsCQkieGQsMVsyXSIpCisgIF9NQzg4MTEwICgweGYwMDAyMDAwLCAic3QuZCIsCQkieGQsMSwyIikKKyAgX01DODgxMTAgKDB4MzAwMDAwMDAsICJzdC5kIiwJCSJ4ZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwMjEwMCwgInN0LmQudXNyIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDIzMDAsICJzdC5kLnVzciIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMjEwMCwgInN0LmQudXNyIiwJInhkLDEsMiIpCisgIF9NQzg4MTEwICgweGYwMDAyMzAwLCAic3QuZC51c3IiLAkieGQsMVsyXSIpCisgIF9NQzg4MTEwICgweGY0MDAyMTgwLCAic3QuZC51c3Iud3QiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHhmNDAwMjM4MCwgInN0LmQudXNyLnd0IiwJImQsMVsyXSIpCisgIF9NQzg4MTEwICgweGYwMDAyMTgwLCAic3QuZC51c3Iud3QiLAkieGQsMSwyIikKKyAgX01DODgxMTAgKDB4ZjAwMDIzODAsICJzdC5kLnVzci53dCIsCSJ4ZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjQwMDIwODAsICJzdC5kLnd0IiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ZjQwMDIyODAsICJzdC5kLnd0IiwJImQsMVsyXSIpCisgIF9NQzg4MTEwICgweGYwMDAyMDgwLCAic3QuZC53dCIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMjI4MCwgInN0LmQud3QiLAkieGQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDAyYTAwLCAic3QuaCIsCQkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDI4MDAsICJzdC5oIiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDI4MDAwMDAwLCAic3QuaCIsCQkiZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwMjkwMCwgInN0LmgudXNyIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDJiMDAsICJzdC5oLnVzciIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmNDAwMjk4MCwgInN0LmgudXNyLnd0IiwJImQsMSwyIikKKyAgX01DODgxMTAgKDB4ZjQwMDJiODAsICJzdC5oLnVzci53dCIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmNDAwMjg4MCwgInN0Lmgud3QiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHhmNDAwMmE4MCwgInN0Lmgud3QiLAkiZCwxWzJdIikKKyAgX01DODh4eHggKDB4ZjQwMDI1MDAsICJzdC51c3IiLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwMjcwMCwgInN0LnVzciIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMjUwMCwgInN0LnVzciIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMjcwMCwgInN0LnVzciIsCSJ4ZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjQwMDI1ODAsICJzdC51c3Iud3QiLAkiZCwxLDIiKQorICBfTUM4ODExMCAoMHhmNDAwMjc4MCwgInN0LnVzci53dCIsCSJkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMjU4MCwgInN0LnVzci53dCIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMjc4MCwgInN0LnVzci53dCIsCSJ4ZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjQwMDI0ODAsICJzdC53dCIsCSJkLDEsMiIpCisgIF9NQzg4MTEwICgweGY0MDAyNjgwLCAic3Qud3QiLAkiZCwxWzJdIikKKyAgX01DODgxMTAgKDB4ZjAwMDI0ODAsICJzdC53dCIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMjY4MCwgInN0Lnd0IiwJInhkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMmEwMCwgInN0LngiLAkJInhkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMjgwMCwgInN0LngiLAkJInhkLDEsMiIpCisgIF9NQzg4MTEwICgweDM4MDAwMDAwLCAic3QueCIsCQkieGQsMSxJIikKKyAgX01DODgxMTAgKDB4ZjAwMDI5MDAsICJzdC54LnVzciIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMmIwMCwgInN0LngudXNyIiwJInhkLDFbMl0iKQorICBfTUM4ODExMCAoMHhmMDAwMjk4MCwgInN0LngudXNyLnd0IiwJInhkLDEsMiIpCisgIF9NQzg4MTEwICgweGYwMDAyYjgwLCAic3QueC51c3Iud3QiLAkieGQsMVsyXSIpCisgIF9NQzg4MTEwICgweGYwMDAyODgwLCAic3QueC53dCIsCSJ4ZCwxLDIiKQorICBfTUM4ODExMCAoMHhmMDAwMmE4MCwgInN0Lngud3QiLAkieGQsMVsyXSIpCisgIF9NQzg4eHh4ICgweDgwMDA4MDAwLCAic3RjciIsCQkiMyxjIikKKyAgX01DODh4eHggKDB4ZjQwMDc0MDAsICJzdWIiLAkJImQsMSwyIikKKyAgX01DODh4eHggKDB4NzQwMDAwMDAsICJzdWIiLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDc2MDAsICJzdWIuY2kiLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwNzcwMCwgInN1Yi5jaW8iLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHhmNDAwNzUwMCwgInN1Yi5jbyIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDA2NDAwLCAic3VidSIsCQkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg2NDAwMDAwMCwgInN1YnUiLAkJImQsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDY2MDAsICJzdWJ1LmNpIiwJImQsMSwyIikKKyAgX01DODh4eHggKDB4ZjQwMDY3MDAsICJzdWJ1LmNpbyIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGY0MDA2NTAwLCAic3VidS5jbyIsCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweGYwMDBkMDAwLCAidGIwIiwJCSJCLDEsViIpCisgIF9NQzg4eHh4ICgweGYwMDBkODAwLCAidGIxIiwJCSJCLDEsViIpCisgIF9NQzg4eHh4ICgweGY0MDBmODAwLCAidGJuZCIsCQkiMSwyIikKKyAgX01DODh4eHggKDB4ZjgwMDAwMDAsICJ0Ym5kIiwJCSIxLEkiKQorICBfTUM4OHh4eCAoMHhmMDAwZTgwMCwgInRjbmQiLAkJIk0sMSxWIikKKyAgX01DODh4eHggKDB4ODQwMDU4ODAsICJ0cm5jLnNkIiwJImQsMiIpCisgIF9NQzg4MTEwICgweDg0MDBkODgwLCAidHJuYy5zZCIsCSJkLHgyIikKKyAgX01DODh4eHggKDB4ODQwMDU4MDAsICJ0cm5jLnNzIiwJImQsMiIpCisgIF9NQzg4MTEwICgweDg0MDBkODAwLCAidHJuYy5zcyIsCSJkLHgyIikKKyAgX01DODgxMTAgKDB4ODQwMGQ5MDAsICJ0cm5jLnN4IiwJImQseDIiKQorICBfTUM4OHh4eCAoMHg4MDAwYzAwMCwgInhjciIsCQkiZCwzLGMiKQorICBfTUM4OHh4eCAoMHhmNDAwMDYwMCwgInhtZW0iLAkJImQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDAwNDAwLCAieG1lbSIsCQkiZCwxLDIiKQorICBfTUM4ODEwMCAoMHgwNDAwMDAwMCwgInhtZW0iLAkJIj9kLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDAwMjAwLCAieG1lbS5idSIsCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMDAwMCwgInhtZW0uYnUiLAkiZCwxLDIiKQorICBfTUM4ODEwMCAoMHgwMDAwMDAwMCwgInhtZW0uYnUiLAkiP2QsMSxJIikKKyAgX01DODh4eHggKDB4ZjQwMDAzMDAsICJ4bWVtLmJ1LnVzciIsCSJkLDFbMl0iKQorICBfTUM4OHh4eCAoMHhmNDAwMDEwMCwgInhtZW0uYnUudXNyIiwJImQsMSwyIikKKyAgX01DODgxMDAgKDB4MDAwMDAxMDAsICJ4bWVtLmJ1LnVzciIsCSI/ZCwxLEkiKQorICBfTUM4OHh4eCAoMHhmNDAwMDcwMCwgInhtZW0udXNyIiwJImQsMVsyXSIpCisgIF9NQzg4eHh4ICgweGY0MDAwNTAwLCAieG1lbS51c3IiLAkiZCwxLDIiKQorICBfTUM4ODEwMCAoMHgwNDAwMDEwMCwgInhtZW0udXNyIiwJIj9kLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDA1MDAwLCAieG9yIiwJCSJkLDEsMiIpCisgIF9NQzg4eHh4ICgweDUwMDAwMDAwLCAieG9yIiwJCSJkLDEsSSIpCisgIF9NQzg4eHh4ICgweGY0MDA1NDAwLCAieG9yLmMiLAkiZCwxLDIiKQorICBfTUM4OHh4eCAoMHg1NDAwMDAwMCwgInhvci51IiwJImQsMSxJIikKKyAgX01DODh4eHggKDB4MDAwMDAwMDAsICIiLAkJMCkKK307CisKKyNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBtODhrX29wY29kZXMpLyhzaXplb2YgbTg4a19vcGNvZGVzWzBdKSkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWFvdXQuYyBiL2dhcy9jb25maWcvb2JqLWFvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE5MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5jCkBAIC0wLDAgKzEsNjI5IEBACisvKiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKK0dBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCit0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSAiYXMuaCIKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjdW5kZWYgTk9fUkVMT0MKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2VuZGlmCisjaW5jbHVkZSAib2JzdGFjay5oIgorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKy8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLworY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KK3sKKyAgTl9BQlMsCisgIE5fVEVYVCwKKyAgTl9EQVRBLAorICBOX0JTUywKKyAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KKyAgTl9VTkRGLAkJCS8qIGVycm9yICovCisgIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCisgIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLworICBOX1VOREYsCQkJLyogbnR2ICovCisgIE5fVU5ERiwJCQkvKiBwdHYgKi8KKyAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLworfTsKKworY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KK3sJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCisgIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCisgIFNFR19HT09GLAorICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLworICBTRUdfR09PRiwKKyAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KKyAgU0VHX0dPT0YsCisgIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCisgIFNFR19HT09GLAorICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KKyAgU0VHX0dPT0YsCisgIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKKyAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAorICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKKyAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLworICBTRUdfR09PRiwKK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgb2JqX2FvdXRfbGluZSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG9ial9hb3V0X3dlYWsgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBvYmpfYW91dF90eXBlIFBBUkFNUyAoKGludCkpOworCitjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJsaW5lIiwgb2JqX2FvdXRfbGluZSwgMH0sCS8qIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyICovCisgIHsibG4iLCBvYmpfYW91dF9saW5lLCAwfSwJLyogY29mZiBsaW5lIG51bWJlciB0aGF0IHdlIHVzZSBhbnl3YXkgKi8KKworICB7IndlYWsiLCBvYmpfYW91dF93ZWFrLCAwfSwJLyogbWFyayBzeW1ib2wgYXMgd2Vhay4gICovCisKKyAgeyJ0eXBlIiwgb2JqX2FvdXRfdHlwZSwgMH0sCisKKyAgLyogY29mZiBkZWJ1ZyBwc2V1ZG9zIChpZ25vcmVkKSAqLworICB7ImRlZiIsIHNfaWdub3JlLCAwfSwKKyAgeyJkaW0iLCBzX2lnbm9yZSwgMH0sCisgIHsiZW5kZWYiLCBzX2lnbm9yZSwgMH0sCisgIHsiaWRlbnQiLCBzX2lnbm9yZSwgMH0sCisgIHsibGluZSIsIHNfaWdub3JlLCAwfSwKKyAgeyJsbiIsIHNfaWdub3JlLCAwfSwKKyAgeyJzY2wiLCBzX2lnbm9yZSwgMH0sCisgIHsic2l6ZSIsIHNfaWdub3JlLCAwfSwKKyAgeyJ0YWciLCBzX2lnbm9yZSwgMH0sCisgIHsidmFsIiwgc19pZ25vcmUsIDB9LAorICB7InZlcnNpb24iLCBzX2lnbm9yZSwgMH0sCisKKyAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwJLyogRm9yIHN1bjM4NmkgY2MgKD8pICovCisKKyAgLyogb3RoZXIgc3R1ZmYgKi8KKyAgeyJBQk9SVCIsIHNfYWJvcnQsIDB9LAorCisgIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLworfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLworCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKK3ZvaWQKK29ial9hb3V0X2Zyb2Jfc3ltYm9sIChzeW0sIHB1bnQpCisgICAgIHN5bWJvbFMgKnN5bTsKKyAgICAgaW50ICpwdW50OworeworICBmbGFnd29yZCBmbGFnczsKKyAgYXNlY3Rpb24gKnNlYzsKKyAgaW50IGRlc2MsIHR5cGUsIG90aGVyOworCisgIGZsYWdzID0gc3ltLT5ic3ltLT5mbGFnczsKKyAgZGVzYyA9IFNfR0VUX0RFU0MgKHN5bSk7CisgIHR5cGUgPSBTX0dFVF9UWVBFIChzeW0pOworICBvdGhlciA9IFNfR0VUX09USEVSIChzeW0pOworICBzZWMgPSBzeW0tPmJzeW0tPnNlY3Rpb247CisKKyAgLyogT25seSBmcm9iIHNpbXBsZSBzeW1ib2xzIHRoaXMgd2F5IHJpZ2h0IG5vdy4gICovCisgIGlmICghICh0eXBlICYgfiAoTl9UWVBFIHwgTl9FWFQpKSkKKyAgICB7CisgICAgICBpZiAodHlwZSA9PSAoTl9VTkRGIHwgTl9FWFQpCisJICAmJiBzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbikKKwlzeW0tPmJzeW0tPnNlY3Rpb24gPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOworCisgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpICE9IE5fSU5EUgorCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQQorCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUVAorCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAorCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQgorCSAgJiYgdHlwZSAhPSBOX1dBUk5JTkcKKwkgICYmIChzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbgorCSAgICAgIHx8IHNlYyA9PSAmYmZkX3VuZF9zZWN0aW9uKSkKKwlyZXR1cm47CisgICAgICBpZiAoZmxhZ3MgJiBCU0ZfRVhQT1JUKQorCXR5cGUgfD0gTl9FWFQ7CisKKyAgICAgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKKwl7CisJY2FzZSBOX1NFVEE6CisJY2FzZSBOX1NFVFQ6CisJY2FzZSBOX1NFVEQ6CisJY2FzZSBOX1NFVEI6CisJICAvKiBTZXQgdGhlIGRlYnVnZ2luZyBmbGFnIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIHNvIHRoYXQKKwkgICAgIEJGRCBsZWF2ZXMgdGhlbSBhbG9uZS4gICovCisJICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7CisKKwkgIC8qIFlvdSBjYW4ndCBwdXQgYSBjb21tb24gc3ltYm9sIGluIGEgc2V0LiAgVGhlIHdheSBhIHNldAorCSAgICAgZWxlbWVudCB3b3JrcyBpcyB0aGF0IHRoZSBzeW1ib2wgaGFzIGEgZGVmaW5pdGlvbiBhbmQgYQorCSAgICAgbmFtZSwgYW5kIHRoZSBsaW5rZXIgYWRkcyB0aGUgZGVmaW5pdGlvbiB0byB0aGUgc2V0IG9mCisJICAgICB0aGF0IG5hbWUuICBUaGF0IGRvZXMgbm90IHdvcmsgZm9yIGEgY29tbW9uIHN5bWJvbCwKKwkgICAgIGJlY2F1c2UgdGhlIGxpbmtlciBjYW4ndCB0ZWxsIHdoaWNoIGNvbW1vbiBzeW1ib2wgdGhlCisJICAgICB1c2VyIG1lYW5zLiAgRklYTUU6IFVzaW5nIGFzX2JhZCBoZXJlIG1heSBiZQorCSAgICAgaW5hcHByb3ByaWF0ZSwgc2luY2UgdGhlIHVzZXIgbWF5IHdhbnQgdG8gZm9yY2UgYQorCSAgICAgcGFydGljdWxhciB0eXBlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBzZW1hbnRpY3Mgb2Ygc2V0czsKKwkgICAgIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudCBhbnlib2R5IHRvIGJlCisJICAgICBtaXNsZWFkIGludG8gdGhpbmtpbmcgdGhhdCB0aGVpciBjb2RlIHdpbGwgd29yay4gICovCisJICBpZiAoU19JU19DT01NT04gKHN5bSkpCisJICAgIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIiksCisJCSAgICBTX0dFVF9OQU1FIChzeW0pKTsKKwkgIC8qIFNpbWlsYXJseSwgeW91IGNhbid0IHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGluIGEgc2V0LiAgKi8KKwkgIGVsc2UgaWYgKCEgU19JU19ERUZJTkVEIChzeW0pKQorCSAgICBhc19iYWQgKF8oIkF0dGVtcHQgdG8gcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW50byBzZXQgJXMiKSwKKwkJICAgIFNfR0VUX05BTUUgKHN5bSkpOworCisJICBicmVhazsKKwljYXNlIE5fSU5EUjoKKwkgIC8qIFB1dCBpbmRpcmVjdCBzeW1ib2xzIGluIHRoZSBpbmRpcmVjdCBzZWN0aW9uLiAgKi8KKwkgIHN5bS0+YnN5bS0+c2VjdGlvbiA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7CisJICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9JTkRJUkVDVDsKKwkgIGlmICh0eXBlICYgTl9FWFQpCisJICAgIHsKKwkgICAgICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9FWFBPUlQ7CisJICAgICAgc3ltLT5ic3ltLT5mbGFncyAmPX4gQlNGX0xPQ0FMOworCSAgICB9CisJICBicmVhazsKKwljYXNlIE5fV0FSTklORzoKKwkgIC8qIE1hcmsgd2FybmluZyBzeW1ib2xzLiAgKi8KKwkgIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX1dBUk5JTkc7CisJICBicmVhazsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOworICAgIH0KKworICBTX1NFVF9UWVBFIChzeW0sIHR5cGUpOworCisgIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLworICBpZiAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKQorICAgIHsKKyAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKKwlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKKwkJU19HRVRfTkFNRSAoc3ltKSk7CisgICAgfQorfQorCit2b2lkCitvYmpfYW91dF9mcm9iX2ZpbGUgKCkKK3sKKyAgLyogUmVsb2NhdGlvbiBwcm9jZXNzaW5nIG1heSByZXF1aXJlIGtub3dpbmcgdGhlIFZNQXMgb2YgdGhlIHNlY3Rpb25zLgorICAgICBTaW5jZSB3cml0aW5nIHRvIGEgc2VjdGlvbiB3aWxsIGNhdXNlIHRoZSBCRkQgYmFjayBlbmQgdG8gY29tcHV0ZSB0aGUKKyAgICAgVk1BcywgZmFrZSBpdCBvdXQgaGVyZS4uLi4gICovCisgIGJmZF9ieXRlIGIgPSAwOworICBib29sZWFuIHggPSB0cnVlOworICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24pICE9IDApCisgICAgeworICAgICAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sICZiLCAoZmlsZV9wdHIpIDAsCisJCQkJICAgIChiZmRfc2l6ZV90eXBlKSAxKTsKKyAgICB9CisgIGVsc2UgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uKSAhPSAwKQorICAgIHsKKyAgICAgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCAmYiwgKGZpbGVfcHRyKSAwLAorCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgMSk7CisgICAgfQorICBhc3NlcnQgKHggPT0gdHJ1ZSk7Cit9CisKKyNlbHNlCisKKy8qIFJlbG9jYXRpb24uICovCisKKy8qCisgKgkJZW1pdF9yZWxvY2F0aW9ucygpCisgKgorICogQ3Jhd2wgYWxvbmcgYSBmaXhTIGNoYWluLiBFbWl0IHRoZSBzZWdtZW50J3MgcmVsb2NhdGlvbnMuCisgKi8KK3ZvaWQKK29ial9lbWl0X3JlbG9jYXRpb25zICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCisgICAgIGNoYXIgKip3aGVyZTsKKyAgICAgZml4UyAqZml4UDsJCS8qIEZpeHVwIGNoYWluIGZvciB0aGlzIHNlZ21lbnQuICovCisgICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOworeworICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCisgICAgaWYgKGZpeFAtPmZ4X2RvbmUgPT0gMCkKKyAgICAgIHsKKwlzeW1ib2xTICpzeW07CisKKwlzeW0gPSBmaXhQLT5meF9hZGRzeTsKKwl3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCisJICAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCisJICBzeW0gPSBzeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKKwlmaXhQLT5meF9hZGRzeSA9IHN5bTsKKworCWlmICghIHN5bS0+c3lfcmVzb2x2ZWQgJiYgISBTX0lTX0RFRklORUQgKHN5bSkpCisJICB7CisJICAgIGNoYXIgKmZpbGU7CisJICAgIHVuc2lnbmVkIGludCBsaW5lOworCisJICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltLCAmZmlsZSwgJmxpbmUpKQorCSAgICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygidW5yZXNvbHZlZCByZWxvY2F0aW9uIikpOworCSAgICBlbHNlCisJICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIpLAorCQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKKwkgIH0KKworCXRjX2FvdXRfZml4X3RvX2NoYXJzICgqd2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKTsKKwkqd2hlcmUgKz0gbWRfcmVsb2Nfc2l6ZTsKKyAgICAgIH0KK30KKworI2lmbmRlZiBvYmpfaGVhZGVyX2FwcGVuZAorLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KK3ZvaWQKK29ial9oZWFkZXJfYXBwZW5kICh3aGVyZSwgaGVhZGVycykKKyAgICAgY2hhciAqKndoZXJlOworICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKK3sKKyAgdGNfaGVhZGVyc19ob29rIChoZWFkZXJzKTsKKworI2lmZGVmIENST1NTX0NPTVBJTEUKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2luZm8sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfaW5mbykpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9pbmZvKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKKyAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKKyAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKKyAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKKworI2Vsc2UgLyogQ1JPU1NfQ09NUElMRSAqLworCisgIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZoZWFkZXJzLT5oZWFkZXIsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyKSk7CisjZW5kaWYgLyogQ1JPU1NfQ09NUElMRSAqLworCit9CisjZW5kaWYKKwordm9pZAorb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApCisgICAgIGNoYXIgKip3aGVyZTsKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpLCBTX0dFVF9PRkZTRVQgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX0RFU0MgKHN5bWJvbFApKSwgU19HRVRfREVTQyAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfREVTQyAoc3ltYm9sUCkpKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7CisKKyAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKK30KKwordm9pZAorb2JqX2VtaXRfc3ltYm9scyAod2hlcmUsIHN5bWJvbF9yb290UCkKKyAgICAgY2hhciAqKndoZXJlOworICAgICBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgLyogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uICAqLworICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCisgICAgeworICAgICAgLyogVXNlZCB0byBzYXZlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUuIEl0IGlzIHVzZWQgdG8gcG9pbnQKKwkgdG8gdGhlIHN0cmluZyBpbiBtZW1vcnkgYnV0IG11c3QgYmUgYSBmaWxlIG9mZnNldC4gKi8KKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnRlbXA7CisKKyAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKKyAgICAgIFNfU0VUX09GRlNFVCAoc3ltYm9sUCwgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQpOworCisgICAgICAvKiBBbnkgc3ltYm9sIHN0aWxsIHVuZGVmaW5lZCBhbmQgaXMgbm90IGEgZGJnIHN5bWJvbCBpcyBtYWRlIE5fRVhULiAqLworICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKKwlTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisKKyAgICAgIC8qIEFkanVzdCB0aGUgdHlwZSBvZiBhIHdlYWsgc3ltYm9sLiAgKi8KKyAgICAgIGlmIChTX0dFVF9XRUFLIChzeW1ib2xQKSkKKwl7CisJICBzd2l0Y2ggKFNfR0VUX1RZUEUgKHN5bWJvbFApKQorCSAgICB7CisJICAgIGNhc2UgTl9VTkRGOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtVKTsgYnJlYWs7CisJICAgIGNhc2UgTl9BQlM6CSBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtBKTsgYnJlYWs7CisJICAgIGNhc2UgTl9URVhUOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtUKTsgYnJlYWs7CisJICAgIGNhc2UgTl9EQVRBOiBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtEKTsgYnJlYWs7CisJICAgIGNhc2UgTl9CU1M6ICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1dFQUtCKTsgYnJlYWs7CisJICAgIGRlZmF1bHQ6IGFzX2JhZCAoXygiJXM6IGJhZCB0eXBlIGZvciB3ZWFrIHN5bWJvbCIpLCB0ZW1wKTsgYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIG9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKTsKKyAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOworICAgIH0KK30KKworI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLworCitzdGF0aWMgdm9pZAorb2JqX2FvdXRfbGluZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4KKyAgICAgQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlCisgICAgIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCisgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBvYmpfYW91dF9saW5lKCkgKi8KKworLyogSGFuZGxlIC53ZWFrLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLworCitzdGF0aWMgdm9pZAorb2JqX2FvdXRfd2VhayAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgYzsKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworICBkbworICAgIHsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOworICAgICAgaWYgKGMgPT0gJywnKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgU0tJUF9XSElURVNQQUNFICgpOworCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKKwkgICAgYyA9ICdcbic7CisJfQorICAgIH0KKyAgd2hpbGUgKGMgPT0gJywnKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIC50eXBlLiAgT24ge05ldCxPcGVufUJTRCwgdGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgbl9vdGhlciBmaWVsZCwKKyAgIHdoaWNoIGlzIHRoZW4gYXBwYXJlbnRseSB1c2VkIHdoZW4gZG9pbmcgZHluYW1pYyBsaW5raW5nLiAgT2xkZXIKKyAgIHZlcnNpb25zIG9nYXMgaWdub3JlZCB0aGUgLnR5cGUgcHNldWRvLW9wLCBzbyB3ZSBhbHNvIGlnbm9yZSBpdCBpZgorICAgd2UgY2FuJ3QgcGFyc2UgaXQuICAqLworCitzdGF0aWMgdm9pZAorb2JqX2FvdXRfdHlwZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgYzsKKyAgc3ltYm9sUyAqc3ltOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgaWYgKHN5bSAhPSBOVUxMKQorICAgIHsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwl7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJykKKwkgICAgeworCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvYmplY3QiLCA2KSA9PSAwKQorCQlTX1NFVF9PVEhFUiAoc3ltLCAxKTsKKwkgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmdW5jdGlvbiIsIDgpID09IDApCisJCVNfU0VUX09USEVSIChzeW0sIDIpOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBJZ25vcmUgZXZlcnl0aGluZyBlbHNlIG9uIHRoZSBsaW5lLiAgKi8KKyAgc19pZ25vcmUgKDApOworfQorCit2b2lkCitvYmpfcmVhZF9iZWdpbl9ob29rICgpCit7Cit9CisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorCit2b2lkCitvYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgc3ltYm9sUyAqKnN5bWJvbFBQOworICBpbnQgc3ltYm9sX251bWJlciA9IDA7CisKKyAgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKTsKKworICBzeW1ib2xQUCA9ICZzeW1ib2xfcm9vdFA7CS8qLT5sYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLworICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN5bWJvbFAtPnN5X21yaV9jb21tb24pCisJeworCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApKQorCSAgICBhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAorCQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOworCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKSkKKwl7CisJICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfVEVYVCk7CisJfQkJCS8qIGlmIHB1c2luZyBkYXRhIGludG8gdGV4dCAqLworCisgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7CisKKyAgICAgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgorCSBzeW1ib2xzLiAgKi8KKyAgICAgIGlmIChzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCisJICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCisJeworCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlIGJyYXZlCisJIG5ldyBzeW10YWIuICBTeW1ib2xzIHRoYXQgZG8gYXJlOgorCisJICogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQorCSAqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQorCisJIFN5bWJvbHMgdGhhdCBkb24ndCBhcmU6CisJICogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKKwkgKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCisJICogImxvY2FsIGxhYmVscyIgYXMgZGVmaW5lZCBieSBTX0xPQ0FMX05BTUUobmFtZSkgaWYgdGhlIC1MCisJIHN3aXRjaCB3YXMgcGFzc2VkIHRvIGdhcy4KKworCSBBbGwgb3RoZXIgc3ltYm9scyBhcmUgb3V0cHV0LiAgV2UgY29tcGxhaW4gaWYgYSBkZWxldGVkCisJIHN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAqLworCisKKyAgICAgIGlmICghU19JU19SRUdJU1RFUiAoc3ltYm9sUCkKKwkgICYmICghU19HRVRfTkFNRSAoc3ltYm9sUCkKKwkgICAgICB8fCBTX0lTX0RFQlVHIChzeW1ib2xQKQorCSAgICAgIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApCisJICAgICAgfHwgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkKKwkgICAgICB8fCAoU19HRVRfTkFNRSAoc3ltYm9sUClbMF0gIT0gJ1wwMDEnCisJCSAgJiYgKGZsYWdfa2VlcF9sb2NhbHMgfHwgIVNfTE9DQUxfTkFNRSAoc3ltYm9sUCkpKSkpCisJeworCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOworCisJICAvKiBUaGUgKyAxIGFmdGVyIHN0cmxlbiBhY2NvdW50IGZvciB0aGUgXDAgYXQgdGhlCisJCQkgICBlbmQgb2YgZWFjaCBzdHJpbmcgKi8KKwkgIGlmICghU19JU19TVEFCRCAoc3ltYm9sUCkpCisJICAgIHsKKwkgICAgICAvKiBPcmRpbmFyeSBjYXNlLiAqLworCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7CisJICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOworCSAgICB9CisJICBlbHNlCQkJLyogLlN0YWJkIGNhc2UuICovCisJICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKKwkgIHN5bWJvbFBQID0gJihzeW1ib2xfbmV4dCAoc3ltYm9sUCkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCisJICAgIC8qIFRoaXMgd2FybmluZyBzaG91bGQgbmV2ZXIgZ2V0IHRyaWdnZXJlZCBhbnkgbW9yZS4KKwkgICAgICAgV2VsbCwgbWF5YmUgaWYgeW91J3JlIGRvaW5nIHR3aXN0ZWQgdGhpbmdzIHdpdGgKKwkgICAgICAgcmVnaXN0ZXIgbmFtZXMuLi4gICovCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkLiIpLCBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoU19HRVRfTkFNRSAoc3ltYm9sUCkpKTsKKwkgICAgfQkJCS8qIG9vcHMuICovCisKKwkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLworCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOworCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLworICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCisKKyAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOworfQorCisvKgorICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KKyAqLworCit2b2lkCitvYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKKyAgICAgY2hhciAqKndoZXJlOworeworICBzeW1ib2xTICpzeW1ib2xQOworCisjaWZkZWYgQ1JPU1NfQ09NUElMRQorICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7CisgICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKKyNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KKyAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOworI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KKworICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCisgICAgeworICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQorCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIFNfR0VUX05BTUUgKHN5bWJvbFApLAorCQkodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOworICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KK30KKworI2lmbmRlZiBBT1VUX1ZFUlNJT04KKyNkZWZpbmUgQU9VVF9WRVJTSU9OIDAKKyNlbmRpZgorCit2b2lkCitvYmpfcHJlX3dyaXRlX2hvb2sgKGhlYWRlcnMpCisgICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOworeworICBIX1NFVF9EWU5BTUlDIChoZWFkZXJzLCAwKTsKKyAgSF9TRVRfVkVSU0lPTiAoaGVhZGVycywgQU9VVF9WRVJTSU9OKTsKKyAgSF9TRVRfTUFDSFRZUEUgKGhlYWRlcnMsIEFPVVRfTUFDSFRZUEUpOworICB0Y19hb3V0X3ByZV93cml0ZV9ob29rIChoZWFkZXJzKTsKK30KKwordm9pZAorREVGVU5fVk9JRCAoc19zZWN0KQoreworICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLworICBjaGFyICpzZWN0aW9uX25hbWU7CisgIGNoYXIgKnNlY3Rpb25fbmFtZV9lbmQ7CisgIGNoYXIgYzsKKworICB1bnNpZ25lZCBpbnQgbGVuOworICB1bnNpZ25lZCBpbnQgZXhwOworICBjaGFyICpzYXZlOworCisgIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBzZWN0aW9uX25hbWVfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIGxlbiA9IHNlY3Rpb25fbmFtZV9lbmQgLSBzZWN0aW9uX25hbWU7CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKGMgPT0gJywnKQorICAgIHsKKyAgICAgIGV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgIH0KKyAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICBleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOworICAgICAgZXhwID0gMDsKKyAgICB9CisgIGlmIChleHAgPj0gMTAwMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giKSk7CisgICAgfQorCisgIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKKyAgICB7CisgICAgICBzdWJzZWdfc2V0IChTRUdfVEVYVCwgKHN1YnNlZ1QpIGV4cCk7CisgICAgfQorCisgIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi5kYXRhIikgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCisJc3Vic2VnX3NldCAoU0VHX1RFWFQsIChzdWJzZWdUKSBleHAgKyAxMDAwKTsKKyAgICAgIGVsc2UKKwlzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGV4cCk7CisgICAgfQorCisgICpzZWN0aW9uX25hbWVfZW5kID0gYzsKK30KKworI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLworCisvKiBlbmQgb2Ygb2JqLWFvdXQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYW91dC5oIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOTA3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1hb3V0LmgKQEAgLTAsMCArMSwyMzkgQEAKKy8qIG9iai1hb3V0LmgsIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCBmb3IgZ2FzLCB0aGUgYXNzZW1ibGVyLgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworLyogVGFnIHRvIHZhbGlkYXRlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCBwcm9jZXNzaW5nICovCisjZGVmaW5lIE9CSl9BT1VUIDEKKworI2luY2x1ZGUgInRhcmctY3B1LmgiCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKKyNpbmNsdWRlICJiZmQvbGliYW91dC5oIgorCisjZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKKworI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCisKKyNpZm5kZWYgVk1TCisjaW5jbHVkZSAiYW91dF9nbnUuaCIJCS8qIE5lZWRlZCB0byBkZWZpbmUgc3RydWN0IG5saXN0LiBTaWdoLiAqLworI2Vsc2UKKyNpbmNsdWRlICJhX291dC5oIgorI2VuZGlmCisKKyNpZm5kZWYgQU9VVF9NQUNIVFlQRQorI2RlZmluZSBBT1VUX01BQ0hUWVBFIDAKKyNlbmRpZiAvKiBBT1VUX01BQ0hUWVBFICovCisKK2V4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107CitleHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107CisKKyNpZm5kZWYgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCisjZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQkoT01BR0lDKQorI2VuZGlmIC8qIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAqLworCisjZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCisKKy8qIFNZTUJPTCBUQUJMRSAqLworLyogU3ltYm9sIHRhYmxlIGVudHJ5IGRhdGEgdHlwZSAqLworCit0eXBlZGVmIHN0cnVjdCBubGlzdCBvYmpfc3ltYm9sX3R5cGU7CS8qIFN5bWJvbCB0YWJsZSBlbnRyeSAqLworCisvKiBTeW1ib2wgdGFibGUgbWFjcm9zIGFuZCBjb25zdGFudHMgKi8KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKworI2RlZmluZSBTX1NFVF9PVEhFUihTLFYpCQkoYW91dF9zeW1ib2woKFMpLT5ic3ltKS0+b3RoZXIgPSAoVikpCisjZGVmaW5lIFNfU0VUX1RZUEUoUyxUKQkJCShhb3V0X3N5bWJvbCgoUyktPmJzeW0pLT50eXBlID0gKFQpKQorI2RlZmluZSBTX1NFVF9ERVNDKFMsRCkJCQkoYW91dF9zeW1ib2woKFMpLT5ic3ltKS0+ZGVzYyA9IChEKSkKKyNkZWZpbmUgU19HRVRfT1RIRVIoUykJCQkoYW91dF9zeW1ib2woKFMpLT5ic3ltKS0+b3RoZXIpCisjZGVmaW5lIFNfR0VUX1RZUEUoUykJCQkoYW91dF9zeW1ib2woKFMpLT5ic3ltKS0+dHlwZSkKKyNkZWZpbmUgU19HRVRfREVTQyhTKQkJCShhb3V0X3N5bWJvbCgoUyktPmJzeW0pLT5kZXNjKQorCithc2VjdGlvbiAqdGV4dF9zZWN0aW9uLCAqZGF0YV9zZWN0aW9uLCAqYnNzX3NlY3Rpb247CisKKyNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUFVOVCkJb2JqX2FvdXRfZnJvYl9zeW1ib2wgKFMsICZQVU5UKQorI2RlZmluZSBvYmpfZnJvYl9maWxlKCkJCW9ial9hb3V0X2Zyb2JfZmlsZSAoKQorZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBpbnQgKikpOworZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkoMSkKKworI2Vsc2UKKworLyogV2UgdXNlIHRoZSBzeV9vYmogZmllbGQgdG8gcmVjb3JkIHdoZXRoZXIgYSBzeW1ib2wgaXMgd2Vhay4gICovCisjZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIGNoYXIKKworLyoKKyAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgorICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KKyAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgorICovCisKKy8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLworI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKKworLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCisjZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCisgIChTX0dFVF9UWVBFIChzKSAhPSBOX1VOREYgfHwgU19HRVRfREVTQyAocykgIT0gMCkKKworI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCisgIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCisKKyNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCisKKy8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLworI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQorLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLworI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAorICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAorICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKKyAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCisgICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCisgICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAorICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCisgICAgICAgJiYgISBTX0lTX0VYVEVSTkFMKHMpCQkJCVwKKyAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKKy8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCisjZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCisvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCisjZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKKworLyogQWNjZXNzb3JzICovCisvKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCisjZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fbmFtZSkKKy8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cngpCisvKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sICovCisjZGVmaW5lIFNfR0VUX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1RZUEUpCisvKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLworI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShOX1RZUEVfc2VnW1NfR0VUX1RZUEUocyldKQorLyogVGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLworI2RlZmluZSBTX0dFVF9PVEhFUihzKQkJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIpCisvKiBUaGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KKyNkZWZpbmUgU19HRVRfREVTQyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYykKKy8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB3ZWFrLiAgKi8KKyNkZWZpbmUgU19HRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqKQorCisvKiBNb2RpZmllcnMgKi8KKy8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLworLyogc2V0IHNlZ21lbnQgKi8KKyNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQorLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLworI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQorLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KKyNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKKy8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCisjZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQorLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLworI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCisvKiBTZXQgdGhlIG5fdHlwZSBmaWVsZCAqLworI2RlZmluZSBTX1NFVF9UWVBFKHMsdCkJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodCkpCisvKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLworI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQorLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLworI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCisvKiBNYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4gIFRoaXMgY2F1c2VzIG5fdHlwZSB0byBiZSBhZGp1c3RlZCB3aGVuCisgICB0aGUgc3ltYm9sIGlzIHdyaXR0ZW4gb3V0LiAgKi8KKyNkZWZpbmUgU19TRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqID0gMSkKKworLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLworCisjZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKQkoSF9HRVRfSEVBREVSX1NJWkUoaCkgXAorCQkJCSArIEhfR0VUX1RFWFRfU0laRShoKSBcCisJCQkJICsgSF9HRVRfREFUQV9TSVpFKGgpIFwKKwkJCQkgKyBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSBcCisJCQkJICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkgXAorCQkJCSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpIFwKKwkJCQkgKyBIX0dFVF9TVFJJTkdfU0laRShoKSkKKworI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKEVYRUNfQllURVNfU0laRSkKKyNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQorI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCisjZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCisjZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSkKKyNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfZHJzaXplKQorI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoKGgpLT5oZWFkZXIuYV9zeW1zKQorI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCisjZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKKyNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQorCisjZGVmaW5lIEhfR0VUX0RZTkFNSUMoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gPj4gMzEpCisjZGVmaW5lIEhfR0VUX1ZFUlNJT04oaCkJCSgoKGgpLT5oZWFkZXIuYV9pbmZvID4+IDI0KSAmIDB4N2YpCisjZGVmaW5lIEhfR0VUX01BQ0hUWVBFKGgpCQkoKChoKS0+aGVhZGVyLmFfaW5mbyA+PiAxNikgJiAweGZmKQorI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gJiAweGZmZmYpCisKKyNkZWZpbmUgSF9TRVRfRFlOQU1JQyhoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKCgodikgPDwgMzEpIFwKKwkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAorCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAorCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUdJQ19OVU1CRVIoaCkpKSkKKworI2RlZmluZSBIX1NFVF9WRVJTSU9OKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKKwkJCQkJCQkgICAgICAgfCAoKHYpIDw8IDI0KSBcCisJCQkJCQkJICAgICAgIHwgKEhfR0VUX01BQ0hUWVBFKGgpIDw8IDE2KSBcCisJCQkJCQkJICAgICAgIHwgKEhfR0VUX01BR0lDX05VTUJFUihoKSkpKQorCisjZGVmaW5lIEhfU0VUX01BQ0hUWVBFKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKKwkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAorCQkJCQkJCSAgICAgICB8ICgodikgPDwgMTYpIFwKKwkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFHSUNfTlVNQkVSKGgpKSkpCisKKyNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKKwkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAorCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAorCQkJCQkJCSAgICAgICB8ICgodikpKSkKKworI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfdGV4dCA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX1RFWFQsICh2KSkpCisjZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfREFUQSwgKHYpKSkKKyNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfQlNTLCAodikpKQorCisjZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKKwkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQorCisjZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQorI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogMTIpCisKKyNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KQkJKChoKS0+aGVhZGVyLmFfZW50cnkgPSAodikpCisjZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQorCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCisgICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KKyAgfQorCitvYmplY3RfaGVhZGVyczsKKworLyogbGluZSBudW1iZXJpbmcgc3R1ZmYuICovCisjZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KKworc3RydWN0IGZpeDsKK3ZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsIHN0cnVjdCBmaXggKmZpeFAsIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzcykpOworCisjZW5kaWYKKworI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpCXs7fQorCisjZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTCQkwCisKKyNkZWZpbmUgQU9VVF9TVEFCUworCisvKiBlbmQgb2Ygb2JqLWFvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYm91dC5jIGIvZ2FzL2NvbmZpZy9vYmotYm91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjgwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1ib3V0LmMKQEAgLTAsMCArMSwzNDggQEAKKy8qIGIub3V0IG9iamVjdCBmaWxlIGZvcm1hdAorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKKyAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKK2NvbnN0IHNob3J0CQkJLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCisgIHNlZ19OX1RZUEVbXSA9Cit7CisgIE5fQUJTLAorICBOX1RFWFQsCisgIE5fREFUQSwKKyAgTl9CU1MsCisgIE5fVU5ERiwJCQkvKiB1bmtub3duICovCisgIE5fVU5ERiwJCQkvKiBlcnJvciAqLworICBOX1VOREYsCQkJLyogZXhwcmVzc2lvbiAqLworICBOX1VOREYsCQkJLyogZGVidWcgKi8KKyAgTl9VTkRGLAkJCS8qIG50diAqLworICBOX1VOREYsCQkJLyogcHR2ICovCisgIE5fUkVHSVNURVIsCQkJLyogcmVnaXN0ZXIgKi8KK307CisKK2NvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tOX1RZUEUgKyAyXSA9Cit7CQkJCS8qIE5fVFlQRSA9PSAweDFFID0gMzItMiAqLworICBTRUdfVU5LTk9XTiwJCQkvKiBOX1VOREYgPT0gMCAqLworICBTRUdfR09PRiwKKyAgU0VHX0FCU09MVVRFLAkJCS8qIE5fQUJTID09IDIgKi8KKyAgU0VHX0dPT0YsCisgIFNFR19URVhULAkJCS8qIE5fVEVYVCA9PSA0ICovCisgIFNFR19HT09GLAorICBTRUdfREFUQSwJCQkvKiBOX0RBVEEgPT0gNiAqLworICBTRUdfR09PRiwKKyAgU0VHX0JTUywJCQkvKiBOX0JTUyA9PSA4ICovCisgIFNFR19HT09GLAorICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCisgIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKKyAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCisgIFNFR19SRUdJU1RFUiwJCQkvKiBkdW1teSBOX1JFR0lTVEVSIGZvciByZWdzID0gMzAgKi8KKyAgU0VHX0dPT0YsCit9OworCitzdGF0aWMgdm9pZCBvYmpfYm91dF9saW5lIFBBUkFNUyAoKGludCkpOworCitjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJsaW5lIiwgb2JqX2JvdXRfbGluZSwgMH0sCS8qIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyICovCisKKy8qIGNvZmYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICBDdXJyZW50bHkgaWdub3JlZCBzaWxlbnRseSAqLworICB7ImRlZiIsIHNfaWdub3JlLCAwfSwKKyAgeyJkaW0iLCBzX2lnbm9yZSwgMH0sCisgIHsiZW5kZWYiLCBzX2lnbm9yZSwgMH0sCisgIHsibG4iLCBzX2lnbm9yZSwgMH0sCisgIHsic2NsIiwgc19pZ25vcmUsIDB9LAorICB7InNpemUiLCBzX2lnbm9yZSwgMH0sCisgIHsidGFnIiwgc19pZ25vcmUsIDB9LAorICB7InR5cGUiLCBzX2lnbm9yZSwgMH0sCisgIHsidmFsIiwgc19pZ25vcmUsIDB9LAorCisvKiBvdGhlciBzdHVmZiB3ZSBkb24ndCBoYW5kbGUgKi8KKyAgeyJBQk9SVCIsIHNfaWdub3JlLCAwfSwKKyAgeyJpZGVudCIsIHNfaWdub3JlLCAwfSwKKworICB7TlVMTH0JCQkvKiBlbmQgc2VudGluZWwgKi8KK307CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KKworLyogUmVsb2NhdGlvbi4gKi8KKworLyoKKyAqCQllbWl0X3JlbG9jYXRpb25zKCkKKyAqCisgKiBDcmF3bCBhbG9uZyBhIGZpeFMgY2hhaW4uIEVtaXQgdGhlIHNlZ21lbnQncyByZWxvY2F0aW9ucy4KKyAqLwordm9pZAorb2JqX2VtaXRfcmVsb2NhdGlvbnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKKyAgICAgY2hhciAqKndoZXJlOworICAgICBmaXhTICpmaXhQOwkJLyogRml4dXAgY2hhaW4gZm9yIHRoaXMgc2VnbWVudC4gKi8KKyAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Cit7CisgIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICBpZiAoZml4UC0+ZnhfZG9uZSA9PSAwCisJICB8fCBmaXhQLT5meF9yX3R5cGUgIT0gTk9fUkVMT0MpCisJeworCSAgc3ltYm9sUyAqc3ltOworCisJICBzeW0gPSBmaXhQLT5meF9hZGRzeTsKKwkgIHdoaWxlIChzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKKwkJICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCisJICAgIHN5bSA9IHN5bS0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOworCSAgZml4UC0+ZnhfYWRkc3kgPSBzeW07CisKKwkgIHRjX2JvdXRfZml4X3RvX2NoYXJzICgqd2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKTsKKwkgICp3aGVyZSArPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOworCX0JCQkvKiBpZiB0aGVyZSdzIGEgc3ltYm9sICovCisgICAgfQkJCQkvKiBmb3IgZWFjaCBmaXh1cCAqLworCit9CQkJCS8qIGVtaXRfcmVsb2NhdGlvbnMoKSAqLworCisvKiBBb3V0IGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLworCisvKiBDb252ZXJ0IGEgbHZhbHVlIHRvIG1hY2hpbmUgZGVwZW5kZW50IGRhdGEgKi8KK3ZvaWQKK29ial9oZWFkZXJfYXBwZW5kICh3aGVyZSwgaGVhZGVycykKKyAgICAgY2hhciAqKndoZXJlOworICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKK3sKKyAgLyogQWx3YXlzIGxlYXZlIGluIGhvc3QgYnl0ZSBvcmRlciAqLworCisgIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiA9IHNlY3Rpb25fYWxpZ25tZW50W1NFR19URVhUXTsKKworICBpZiAoaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduIDwgMikKKyAgICB7CisgICAgICBoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24gPSAyOworICAgIH0JCQkJLyogZm9yY2UgdG8gYXQgbGVhc3QgMiAqLworCisgIGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbiA9IHNlY3Rpb25fYWxpZ25tZW50W1NFR19EQVRBXTsKKyAgaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0JTU107CisKKyAgaGVhZGVycy0+aGVhZGVyLmFfdGxvYWQgPSAwOworICBoZWFkZXJzLT5oZWFkZXIuYV9kbG9hZCA9IG1kX3NlY3Rpb25fYWxpZ24gKFNFR19EQVRBLCBIX0dFVF9URVhUX1NJWkUgKGhlYWRlcnMpKTsKKworICBoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUgPSBsaW5rcmVsYXg7CisKKyNpZmRlZiBDUk9TU19DT01QSUxFCisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9tYWdpYywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9tYWdpYykpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9tYWdpYyk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90ZXh0LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RleHQpKTsKKyAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kYXRhLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhdGEpKTsKKyAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9ic3MsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Jzcyk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9zeW1zLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3N5bXMpKTsKKyAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcyk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSkpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90bG9hZCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90bG9hZCkpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90bG9hZCk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kbG9hZCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kbG9hZCkpOworICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kbG9hZCk7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbik7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbik7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24sIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbik7CisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlKSk7CisgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSk7CisjZWxzZSAvKiAhIENST1NTX0NPTVBJTEUgKi8KKyAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJmhlYWRlcnMtPmhlYWRlciwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIpKTsKKyNlbmRpZiAvKiAhIENST1NTX0NPTVBJTEUgKi8KK30JCQkJLyogYV9oZWFkZXJfYXBwZW5kKCkgKi8KKwordm9pZAorb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApCisgICAgIGNoYXIgKip3aGVyZTsKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpLCBTX0dFVF9PRkZTRVQgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX09GRlNFVCAoc3ltYm9sUCkpKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmKFNfR0VUX0RFU0MgKHN5bWJvbFApKSwgU19HRVRfREVTQyAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfREVTQyAoc3ltYm9sUCkpKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLm5fdmFsdWUsIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZW9mIChzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSkpOworCisgIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wsIHNpemVvZiAob2JqX3N5bWJvbF90eXBlKSk7Cit9CQkJCS8qIG9ial9zeW1ib2xfdG9fY2hhcnMoKSAqLworCit2b2lkCitvYmpfZW1pdF9zeW1ib2xzICh3aGVyZSwgc3ltYm9sX3Jvb3RQKQorICAgICBjaGFyICoqd2hlcmU7CisgICAgIHN5bWJvbFMgKnN5bWJvbF9yb290UDsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworICAvKgorCSAqIEVtaXQgYWxsIHN5bWJvbHMgbGVmdCBpbiB0aGUgc3ltYm9sIGNoYWluLgorCSAqLworICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCisgICAgeworICAgICAgLyogVXNlZCB0byBzYXZlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUuIEl0IGlzIHVzZWQgdG8gcG9pbnQKKwkJICAgdG8gdGhlIHN0cmluZyBpbiBtZW1vcnkgYnV0IG11c3QgYmUgYSBmaWxlIG9mZnNldC4gKi8KKyAgICAgIGNoYXIgKnRlbXA7CisKKyAgICAgIHRlbXAgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKKyAgICAgIFNfU0VUX09GRlNFVCAoc3ltYm9sUCwgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQpOworCisgICAgICAvKiBBbnkgc3ltYm9sIHN0aWxsIHVuZGVmaW5lZCBhbmQgaXMgbm90IGEgZGJnIHN5bWJvbCBpcyBtYWRlIE5fRVhULiAqLworICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKKwlTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisKKyAgICAgIG9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKTsKKyAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHRlbXApOworICAgIH0KK30JCQkJLyogZW1pdF9zeW1ib2xzKCkgKi8KKwordm9pZAorb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIDApOworICBTX1NFVF9ERVNDIChzeW1ib2xQLCAwKTsKK30KKworc3RhdGljIHZvaWQKK29ial9ib3V0X2xpbmUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgLyogQXNzdW1lIGRlbGltaXRlciBpcyBwYXJ0IG9mIGV4cHJlc3Npb24uICovCisgIC8qIEJTRDQuMiBhcyBmYWlscyB3aXRoIGRlbGlnaHRmdWwgYnVnLCBzbyB3ZSAqLworICAvKiBhcmUgbm90IGJlaW5nIGluY29tcGF0aWJsZSBoZXJlLiAqLworICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCAoaW50KSAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30JCQkJLyogb2JqX2JvdXRfbGluZSgpICovCisKK3ZvaWQKK29ial9yZWFkX2JlZ2luX2hvb2sgKCkKK3sKK30KKwordm9pZAorb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Cit7CisgIHN5bWJvbFMgKipzeW1ib2xQUDsKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgaW50IHN5bWJvbF9udW1iZXIgPSAwOworCisgIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycyk7CisKKyAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKi0+bGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KKyAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCAmJiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0RBVEEpKQorCXsKKwkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIFNFR19URVhUKTsKKwl9CQkJLyogaWYgcHVzaW5nIGRhdGEgaW50byB0ZXh0ICovCisKKyAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKKworICAgICAgLyogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byB1bmRlZmluZWQgb3IgY29tbW9uCisJIHN5bWJvbHMuICAqLworICAgICAgaWYgKHN5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKKwkgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKSkKKwl7CisJICAqc3ltYm9sUFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIE9LLCBoZXJlIGlzIGhvdyB3ZSBkZWNpZGUgd2hpY2ggc3ltYm9scyBnbyBvdXQgaW50byB0aGUKKwkgYnJhdmUgbmV3IHN5bXRhYi4gIFN5bWJvbHMgdGhhdCBkbyBhcmU6CisJCQorCSAqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKKwkgKiBzeW1ib2xzIHdpdGggZGVidWcgaW5mbyBpbiB0aGVpciBOX1RZUEUKKwkJCisJIFN5bWJvbHMgdGhhdCBkb24ndCBhcmU6CisJICogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKKwkgKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCisJICogImxvY2FsIGxhYmVscyIgYXMgZGVmaW5lZCBieSBTX0xPQ0FMX05BTUUobmFtZSkKKwkgaWYgdGhlIC1MIHN3aXRjaCB3YXMgcGFzc2VkIHRvIGdhcy4KKwkJCisJIEFsbCBvdGhlciBzeW1ib2xzIGFyZSBvdXRwdXQuICBXZSBjb21wbGFpbiBpZiBhIGRlbGV0ZWQKKwkgc3ltYm9sIHdhcyBtYXJrZWQgZXh0ZXJuYWwuICovCisKKworICAgICAgaWYgKDEKKwkgICYmICFTX0lTX1JFR0lTVEVSIChzeW1ib2xQKQorCSAgJiYgKCFTX0dFVF9OQU1FIChzeW1ib2xQKQorCSAgICAgIHx8IFNfSVNfREVCVUcgKHN5bWJvbFApCisjaWZkZWYgVENfSTk2MAorICAgICAgLyogRklYTUUtU09PTiB0aGlzIGlmZGVmIHNlZW1zIGhpZ2hseSBkdWJpb3VzIHRvIG1lLiAgeG94b3JpY2guICovCisJICAgICAgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKKwkgICAgICB8fCBTX0lTX0VYVEVSTkFMIChzeW1ib2xQKQorI2VuZGlmIC8qIFRDX0k5NjAgKi8KKwkgICAgICB8fCAoU19HRVRfTkFNRSAoc3ltYm9sUClbMF0gIT0gJ1wwMDEnICYmIChmbGFnX2tlZXBfbG9jYWxzIHx8ICFTX0xPQ0FMX05BTUUgKHN5bWJvbFApKSkpKQorCXsKKwkgIHN5bWJvbFAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXIrKzsKKworCSAgLyogVGhlICsgMSBhZnRlciBzdHJsZW4gYWNjb3VudCBmb3IgdGhlIFwwIGF0IHRoZQorCQkJICAgZW5kIG9mIGVhY2ggc3RyaW5nICovCisJICBpZiAoIVNfSVNfU1RBQkQgKHN5bWJvbFApKQorCSAgICB7CisJICAgICAgLyogT3JkaW5hcnkgY2FzZS4gKi8KKwkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OworCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKKwkgICAgfQorCSAgZWxzZQkJCS8qIC5TdGFiZCBjYXNlLiAqLworCSAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7CisJICBzeW1ib2xQUCA9ICYoc3ltYm9sX25leHQgKHN5bWJvbFApKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJMb2NhbCBzeW1ib2wgJXMgbmV2ZXIgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisJICAgIH0JCQkvKiBvb3BzLiAqLworCisJICAvKiBVbmhvb2sgaXQgZnJvbSB0aGUgY2hhaW4gKi8KKwkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKKwl9CQkJLyogaWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIGluIHRoZSBvdXRwdXQgKi8KKyAgICB9CQkJCS8qIGZvciBlYWNoIHN5bWJvbCAqLworCisgIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoZWFkZXJzLCBzeW1ib2xfbnVtYmVyKTsKK30KKworLyoKKyAqIEZpbmQgc3RyaW5ncyBieSBjcmF3bGluZyBhbG9uZyBzeW1ib2wgdGFibGUgY2hhaW4uCisgKi8KKwordm9pZAorb2JqX2VtaXRfc3RyaW5ncyAod2hlcmUpCisgICAgIGNoYXIgKip3aGVyZTsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworI2lmZGVmIENST1NTX0NPTVBJTEUKKyAgLyogR290dGEgZG8gbWRfIGJ5dGUtb3JkZXJpbmcgc3R1ZmYgZm9yIHN0cmluZ19ieXRlX2NvdW50IGZpcnN0IC0gS1dLICovCisgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBzdHJpbmdfYnl0ZV9jb3VudCwgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOworICAqd2hlcmUgKz0gc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCk7CisjZWxzZSAvKiBDUk9TU19DT01QSUxFICovCisgIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZzdHJpbmdfYnl0ZV9jb3VudCwgKHVuc2lnbmVkIGxvbmcpIHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKTsKKyNlbmRpZiAvKiBDUk9TU19DT01QSUxFICovCisKKyAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIGlmIChTX0dFVF9OQU1FIChzeW1ib2xQKSkKKwlhcHBlbmQgKHdoZXJlLCBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDEpKTsKKyAgICB9CQkJCS8qIHdhbGsgc3ltYm9sIGNoYWluICovCit9CisKKy8qIGVuZCBvZiBvYmotYm91dC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ib3V0LmggYi9nYXMvY29uZmlnL29iai1ib3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1MzlhMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLWJvdXQuaApAQCAtMCwwICsxLDMxNiBAQAorLyogYi5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0CisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQorICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBDYW1icmlkZ2UsIE1BCisgICAwMjEzOSwgVVNBLiAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbCBHTlUKKyAqIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCBiLm91dCBmb3JtYXQgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgorICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCisgKgorICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAorICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCisgKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKKyAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwgb3IKKyAqIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgorICoKKyAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KKyAqCisgKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCisgKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKKyAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0CisgKgkgIGFjY29tbW9kYXRlKS4KKyAqCisgKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKKyAqCisgKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCisgKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCisgKgorICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQorICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCisgKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKKyAqCSAgbW9kaWZpY2F0aW9uLgorICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCisgKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTworICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09CisgKgorICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgorICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQorICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKKyAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCisgKi8KKworCisjZGVmaW5lIE9CSl9CT1VUIDEKKworI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCisKKyNpbmNsdWRlICJ0YXJnLWNwdS5oIgorCisjZGVmaW5lIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUJImIub3V0IgorCitleHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOworZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOworCisjZGVmaW5lIEJNQUdJQwkwNDE1CisvKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KKyAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KKyAqLworI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KKyNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCisjZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KKworI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKKyNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShCTUFHSUMpCisjZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCisKKy8qIEZJTEUgSEVBREVSCisgKglBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KKyAqCUFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKKyAqCQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgorICoJCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4KKyAqLworc3RydWN0IGV4ZWMKKyAgeworICAgIC8qIFN0YW5kYXJkIHN0dWZmICovCisgICAgdW5zaWduZWQgbG9uZyBhX21hZ2ljOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlCSovCisgICAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CS8qIExlbmd0aCBvZiB0ZXh0CQkJKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJLyogTGVuZ3RoIG9mIGRhdGEJCQkqLworICAgIHVuc2lnbmVkIGxvbmcgYV9ic3M7CS8qIExlbmd0aCBvZiBydW50aW1lIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICovCisgICAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CS8qIExlbmd0aCBvZiBzeW1ib2wgdGFibGUJCSovCisgICAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MJCSovCisgICAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCisgICAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvCSovCisKKyAgICAvKiBBZGRlZCBmb3IgaTk2MCAqLworICAgIHVuc2lnbmVkIGxvbmcgYV90bG9hZDsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfZGxvYWQ7CS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MJCSovCisgICAgdW5zaWduZWQgY2hhciBhX3RhbGlnbjsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudAkJKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFfZGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50CQkqLworICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudAkJKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFfcmVsYXhhYmxlOwkvKiBDb250YWlucyBlbm91Z2ggaW5mbyB0byByZWxheCAgICAgKi8KKyAgfTsKKworI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX21hZ2ljKSE9Qk1BR0lDKQorI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQorI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCisjZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQorI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCisjZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCisjZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKKworLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQorICovCitzdHJ1Y3Qgbmxpc3QKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJY2hhciAqbl9uYW1lOworCXN0cnVjdCBubGlzdCAqbl9uZXh0OworCWxvbmcgbl9zdHJ4OwkJLyogSW5kZXggaW50byBzdHJpbmcgdGFibGUJKi8KKyAgICAgIH0KKyAgICBuX3VuOworICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KKyAgICBjaGFyIG5fb3RoZXI7CQkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLworICAgIHNob3J0IG5fZGVzYzsKKyAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7CisgIH07CisKK3R5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsKKworLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQorICovCisjZGVmaW5lIE5fVU5ERgkwCQkvKiBVbmRlZmluZWQgc3ltYm9sCSovCisjZGVmaW5lIE5fQUJTCTIJCS8qIEFic29sdXRlIHN5bWJvbAkqLworI2RlZmluZSBOX1RFWFQJNAkJLyogVGV4dCBzeW1ib2wJCSovCisjZGVmaW5lIE5fREFUQQk2CQkvKiBEYXRhIHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9CU1MJOAkJLyogQlNTIHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9GTgkzMQkJLyogRmlsZW5hbWUgc3ltYm9sCSovCisKKyNkZWZpbmUgTl9FWFQJMQkJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLworI2RlZmluZSBOX1RZUEUJMDM2CQkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCisjZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KKworI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCisgIHsKKyAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCisgICAgdW5zaWduZWQKKyAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCisgICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCisJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0CisJCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgorCQkgKi8KKyAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6CisJCSAqCTAgPT4gMSBieXRlCisJCSAqCTEgPT4gMiBieXRlcworCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCisJCSAqLworICAgICAgcl9leHRlcm46MSwgcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLworICAgICAgcl9kaXNwOjEsCQkJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLworICAgICAgcl9jYWxsajoxLAkJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KKyAgICAgIG51dGhpbjoxOwkJCS8qIFVudXNlZAkJCQkqLworICB9OworCisjZW5kaWYgLyogQ1VTVE9NX1JFTE9DX0ZPUk1BVCAqLworCisvKgorICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCisgKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgorICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCisgKi8KKworLyogUHJlZGljYXRlcyAqLworLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCisjZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQorCisvKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KKyNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKSB8fCAoU19HRVRfREVTQyhzKSAhPSAwKSkKKworI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCisgIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCisKKyNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCisKKy8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLworI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQorLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLworI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAorICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAorICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKKyAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCisgICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCisgICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAorICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCisgICAgICAgJiYgIVNfSVNfRVhURVJOQUwocykJCQkJXAorICAgICAgICYmIFNfR0VUX1NFR01FTlQocykgPT0gYWJzb2x1dGVfc2VjdGlvbikpCisvKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLworI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQorLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLworI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSBOVUxMKQorCisvKiBBY2Nlc3NvcnMgKi8KKy8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KKyNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lKQorLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLworI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCkKKy8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KKyNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKKy8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCisjZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCisvKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCisjZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKKy8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLworI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQorCisvKiBNb2RpZmllcnMgKi8KKy8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLworLyogc2V0IHNlZ21lbnQgKi8KKyNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQorLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLworI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQorLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KKyNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKKy8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCisjZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQorLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLworI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCisvKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLworI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQorLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLworI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCisvKiBTZXQgdGhlIG5fdHlwZSB2YWx1ZSAqLworI2RlZmluZSBTX1NFVF9UWVBFKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodikpCisKKy8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KKworI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkJKHNpemVvZihzdHJ1Y3QgZXhlYykgKyBcCisJCQkJIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKKwkJCQkgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgKyBcCisJCQkJIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpICsgXAorCQkJCSBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKSArIFwKKwkJCQkgKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKKworI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihzdHJ1Y3QgZXhlYykpCisjZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKKyNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQorI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQorI2RlZmluZSBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKQkoKGgpLT5oZWFkZXIuYV90cnNpemUpCisjZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSkKKyNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfc3ltcykKKyNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpCQkoKGgpLT5oZWFkZXIuYV9pbmZvKQorI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCisjZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKKyNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQorCisjaWZkZWYgRVhFQ19NQUNISU5FX1RZUEUKKyNkZWZpbmUgSF9HRVRfTUFDSElORV9UWVBFKGgpCQkoKGgpLT5oZWFkZXIuYV9tYWNodHlwZSkKKyNlbmRpZiAvKiBFWEVDX01BQ0hJTkVfVFlQRSAqLworI2lmZGVmIEVYRUNfVkVSU0lPTgorI2RlZmluZSBIX0dFVF9WRVJTSU9OKGgpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uKQorI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLworCisjZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gKHYpKQorI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gKHYpKQorCisjZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKKwkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQorCisjZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQorI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCisKKyNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX21hZ2ljID0gKHYpKQorCisjZGVmaW5lIEhfU0VUX0VOVFJZX1BPSU5UKGgsdikJCSgoaCktPmhlYWRlci5hX2VudHJ5ID0gKHYpKQorI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKKyNpZmRlZiBFWEVDX01BQ0hJTkVfVFlQRQorI2RlZmluZSBIX1NFVF9NQUNISU5FX1RZUEUoaCx2KQkJKChoKS0+aGVhZGVyLmFfbWFjaHR5cGUgPSAodikpCisjZW5kaWYgLyogRVhFQ19NQUNISU5FX1RZUEUgKi8KKyNpZmRlZiBFWEVDX1ZFUlNJT04KKyNkZWZpbmUgSF9TRVRfVkVSU0lPTihoLHYpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uID0gKHYpKQorI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLworCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCisgICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KKyAgfQorCitvYmplY3RfaGVhZGVyczsKKworLyogdW51c2VkIGhvb2tzLiAqLworI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9CisjZGVmaW5lIG9ial9wcmVfd3JpdGVfaG9vayhhKQkJezt9CisKKyNpZiBfX1NURENfXworc3RydWN0IGZpeDsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCisJCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKKwkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKK2V4dGVybiB2b2lkIHRjX2JvdXRfZml4X3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKndoZXJlLAorCQkJCQkgIHN0cnVjdCBmaXggKmZpeFAsCisJCQkJCSAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzKSk7CisKKyNkZWZpbmUgQU9VVF9TVEFCUworCisvKiBlbmQgb2Ygb2JqLWJvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzlmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1jb2ZmLmMKQEAgLTAsMCArMSw0NDgyIEBACisvKiBjb2ZmIG9iamVjdCBmaWxlIGZvcm1hdAorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWNvZmYuaCIKKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKworLyogSSB0aGluayB0aGlzIGlzIHByb2JhYmx5IGFsd2F5cyBjb3JyZWN0LiAgKi8KKyNpZm5kZWYgS0VFUF9SRUxPQ19JTkZPCisjZGVmaW5lIEtFRVBfUkVMT0NfSU5GTworI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9ial9jb2ZmX2JzcyBQQVJBTVMgKChpbnQpKTsKK2NvbnN0IGNoYXIgKnNfZ2V0X25hbWUgUEFSQU1TICgoc3ltYm9sUyAqIHMpKTsKK3N0YXRpYyBzeW1ib2xTICpkZWZfc3ltYm9sX2luX3Byb2dyZXNzOworCisMCisvKiBzdGFjayBzdHVmZiAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGVsZW1lbnRfc2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgY2hhciAqZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIHBvaW50ZXI7CisgIH0KK3N0YWNrOworCitzdGF0aWMgc3RhY2sgKgorc3RhY2tfaW5pdCAoY2h1bmtfc2l6ZSwgZWxlbWVudF9zaXplKQorICAgICB1bnNpZ25lZCBsb25nIGNodW5rX3NpemU7CisgICAgIHVuc2lnbmVkIGxvbmcgZWxlbWVudF9zaXplOworeworICBzdGFjayAqc3Q7CisKKyAgc3QgPSAoc3RhY2sgKikgbWFsbG9jIChzaXplb2YgKHN0YWNrKSk7CisgIGlmICghc3QpCisgICAgcmV0dXJuIDA7CisgIHN0LT5kYXRhID0gbWFsbG9jIChjaHVua19zaXplKTsKKyAgaWYgKCFzdC0+ZGF0YSkKKyAgICB7CisgICAgICBmcmVlIChzdCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHN0LT5wb2ludGVyID0gMDsKKyAgc3QtPnNpemUgPSBjaHVua19zaXplOworICBzdC0+Y2h1bmtfc2l6ZSA9IGNodW5rX3NpemU7CisgIHN0LT5lbGVtZW50X3NpemUgPSBlbGVtZW50X3NpemU7CisgIHJldHVybiBzdDsKK30KKworI2lmIDAKKy8qIE5vdCBjdXJyZW50bHkgdXNlZC4gICovCitzdGF0aWMgdm9pZAorc3RhY2tfZGVsZXRlIChzdCkKKyAgICAgc3RhY2sgKnN0OworeworICBmcmVlIChzdC0+ZGF0YSk7CisgIGZyZWUgKHN0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhciAqCitzdGFja19wdXNoIChzdCwgZWxlbWVudCkKKyAgICAgc3RhY2sgKnN0OworICAgICBjaGFyICplbGVtZW50OworeworICBpZiAoc3QtPnBvaW50ZXIgKyBzdC0+ZWxlbWVudF9zaXplID49IHN0LT5zaXplKQorICAgIHsKKyAgICAgIHN0LT5zaXplICs9IHN0LT5jaHVua19zaXplOworICAgICAgaWYgKChzdC0+ZGF0YSA9IHhyZWFsbG9jIChzdC0+ZGF0YSwgc3QtPnNpemUpKSA9PSAoY2hhciAqKSAwKQorCXJldHVybiAoY2hhciAqKSAwOworICAgIH0KKyAgbWVtY3B5IChzdC0+ZGF0YSArIHN0LT5wb2ludGVyLCBlbGVtZW50LCBzdC0+ZWxlbWVudF9zaXplKTsKKyAgc3QtPnBvaW50ZXIgKz0gc3QtPmVsZW1lbnRfc2l6ZTsKKyAgcmV0dXJuIHN0LT5kYXRhICsgc3QtPnBvaW50ZXI7Cit9CisKK3N0YXRpYyBjaGFyICoKK3N0YWNrX3BvcCAoc3QpCisgICAgIHN0YWNrICpzdDsKK3sKKyAgaWYgKHN0LT5wb2ludGVyIDwgc3QtPmVsZW1lbnRfc2l6ZSkKKyAgICB7CisgICAgICBzdC0+cG9pbnRlciA9IDA7CisgICAgICByZXR1cm4gKGNoYXIgKikgMDsKKyAgICB9CisgIHN0LT5wb2ludGVyIC09IHN0LT5lbGVtZW50X3NpemU7CisgIHJldHVybiBzdC0+ZGF0YSArIHN0LT5wb2ludGVyOworfQorDAorLyoKKyAqIE1haW50YWluIGEgbGlzdCBvZiB0aGUgdGFnbmFtZXMgb2YgdGhlIHN0cnVjdHJlcy4KKyAqLworCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdGFnX2hhc2g7CisKK3N0YXRpYyB2b2lkCit0YWdfaW5pdCAoKQoreworICB0YWdfaGFzaCA9IGhhc2hfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAordGFnX2luc2VydCAobmFtZSwgc3ltYm9sUCkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nOworCisgIGlmICgoZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKHRhZ19oYXNoLCBuYW1lLCAoY2hhciAqKSBzeW1ib2xQKSkpCisgICAgeworICAgICAgYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byBzdHJ1Y3R1cmUgdGFibGUgZmFpbGVkOiAlcyIpLAorCQluYW1lLCBlcnJvcl9zdHJpbmcpOworICAgIH0KK30KKworc3RhdGljIHN5bWJvbFMgKgordGFnX2ZpbmQgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisjaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQorICBpZiAoKm5hbWUgPT0gJ18nKQorICAgIG5hbWUrKzsKKyNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCisgIHJldHVybiAoc3ltYm9sUyAqKSBoYXNoX2ZpbmQgKHRhZ19oYXNoLCBuYW1lKTsKK30KKworc3RhdGljIHN5bWJvbFMgKgordGFnX2ZpbmRfb3JfbWFrZSAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworICBpZiAoKHN5bWJvbFAgPSB0YWdfZmluZCAobmFtZSkpID09IE5VTEwpCisgICAgeworICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLAorCQkJICAgIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7CisKKyAgICAgIHRhZ19pbnNlcnQgKFNfR0VUX05BTUUgKHN5bWJvbFApLCBzeW1ib2xQKTsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKKyNlbmRpZgorICAgIH0JCQkJLyogbm90IGZvdW5kICovCisKKyAgcmV0dXJuIHN5bWJvbFA7Cit9CisKKy8qIFdlIGFjY2VwdCB0aGUgLmJzcyBkaXJlY3RpdmUgdG8gc2V0IHRoZSBzZWN0aW9uIGZvciBiYWNrd2FyZAorICAgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2FzLiAgKi8KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX2JzcyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQorICAgIHN1YnNlZ19uZXcgKCIuYnNzIiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworICBlbHNlCisgICAgc19sY29tbSAoMCk7Cit9CisKKy8qIEhhbmRsZSAud2Vhay4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX3dlYWsgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50IGM7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisgCisgIGRvCisgICAgeworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworCisjaWZkZWYgQkZEX0FTU0VNTEVSCisgICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKKyNlbmRpZgorCisjaWZkZWYgVEVfUEUKKyAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTlRfV0VBSyk7CisjZWxzZQorICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19XRUFLRVhUKTsKKyNlbmRpZgorCisgICAgICBpZiAoYyA9PSAnLCcpCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQorCSAgICBjID0gJ1xuJzsKKwl9CisgICAgfQorICB3aGlsZSAoYyA9PSAnLCcpOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKK3N0YXRpYyB2b2lkIFNBX1NFVF9TWU1fVEFHTkRYIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7CisKKyNkZWZpbmUgR0VUX0ZJTEVOQU1FX1NUUklORyhYKSBcCisoKGNoYXIqKSgmKChYKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnQtPnhfZmlsZS54X24ueF9vZmZzZXQpKVsxXSkKKworLyogQEAgSWNrLiAgKi8KK3N0YXRpYyBzZWdUCitmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24gKCkKK3sKKyAgc3RhdGljIHNlZ1QgZGVidWdfc2VjdGlvbjsKKyAgaWYgKCFkZWJ1Z19zZWN0aW9uKQorICAgIHsKKyAgICAgIENPTlNUIGFzeW1ib2wgKnM7CisgICAgICBzID0gYmZkX21ha2VfZGVidWdfc3ltYm9sIChzdGRvdXRwdXQsIChjaGFyICopIDAsIDApOworICAgICAgYXNzZXJ0IChzICE9IDApOworICAgICAgZGVidWdfc2VjdGlvbiA9IHMtPnNlY3Rpb247CisgICAgfQorICByZXR1cm4gZGVidWdfc2VjdGlvbjsKK30KKwordm9pZAorU0FfU0VUX1NZTV9FTkRORFggKHN5bSwgdmFsKQorICAgICBzeW1ib2xTICpzeW07CisgICAgIHN5bWJvbFMgKnZhbDsKK3sKKyAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50cnksICpwOworCisgIGVudHJ5ID0gJmNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZVsxXTsKKyAgcCA9IGNvZmZzeW1ib2wgKHZhbC0+YnN5bSktPm5hdGl2ZTsKKyAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAgPSBwOworICBlbnRyeS0+Zml4X2VuZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitTQV9TRVRfU1lNX1RBR05EWCAoc3ltLCB2YWwpCisgICAgIHN5bWJvbFMgKnN5bTsKKyAgICAgc3ltYm9sUyAqdmFsOworeworICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7CisKKyAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltLT5ic3ltKS0+bmF0aXZlWzFdOworICBwID0gY29mZnN5bWJvbCAodmFsLT5ic3ltKS0+bmF0aXZlOworICBlbnRyeS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgucCA9IHA7CisgIGVudHJ5LT5maXhfdGFnID0gMTsKK30KKworc3RhdGljIGludAorU19HRVRfREFUQV9UWVBFIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOworfQorCitpbnQKK1NfU0VUX0RBVEFfVFlQRSAoc3ltLCB2YWwpCisgICAgIHN5bWJvbFMgKnN5bTsKKyAgICAgaW50IHZhbDsKK3sKKyAgY29mZnN5bWJvbCAoc3ltLT5ic3ltKS0+bmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSB2YWw7CisgIHJldHVybiB2YWw7Cit9CisKK2ludAorU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKQorICAgICBzeW1ib2xTICpzeW07Cit7CisgIHJldHVybiBjb2Zmc3ltYm9sIChzeW0tPmJzeW0pLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzOworfQorCitpbnQKK1NfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgdmFsKQorICAgICBzeW1ib2xTICpzeW07CisgICAgIGludCB2YWw7Cit7CisgIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSB2YWw7CisgIHJldHVybiB2YWw7Cit9CisKKy8qIE1lcmdlIGEgZGVidWcgc3ltYm9sIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24gaW50byBhIG5vcm1hbCBzeW1ib2wuICovCisKK3ZvaWQKK2Nfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQorICAgICBzeW1ib2xTICpkZWJ1ZzsKKyAgICAgc3ltYm9sUyAqbm9ybWFsOworeworICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7CisKKyAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCisgICAgeworICAgICAgLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCisgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwsIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSk7CisgICAgfQorCisgIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQorICAgIHsKKyAgICAgIC8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLworICAgICAgbWVtY3B5IChTWU1fQVVYSU5GTyAobm9ybWFsKSwgU1lNX0FVWElORk8gKGRlYnVnKSwKKwkgICAgICAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpCisJICAgICAgICogc2l6ZW9mICgqU1lNX0FVWElORk8gKGRlYnVnKSkpKTsKKyAgICB9CisKKyAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCisgIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Cit9CisKK3ZvaWQKK2NfZG90X2ZpbGVfc3ltYm9sIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKGZpbGVuYW1lLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOworCisgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7CisgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOworCisgIHN5bWJvbFAtPmJzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKKworI2lmbmRlZiBOT19MSVNUSU5HCisgIHsKKyAgICBleHRlcm4gaW50IGxpc3Rpbmc7CisgICAgaWYgKGxpc3RpbmcpCisgICAgICB7CisJbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZW5hbWUpOworICAgICAgfQorICB9CisjZW5kaWYKKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGlzIGZpcnN0IG9uIHRoZSBzeW1ib2wgY2hhaW4gKi8KKyAgaWYgKHN5bWJvbF9yb290UCAhPSBzeW1ib2xQKQorICAgIHsKKyAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworICAgICAgc3ltYm9sX2luc2VydCAoc3ltYm9sUCwgc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCBvbiB0aGUgbGlzdCAqLworfQorCisvKiBMaW5lIG51bWJlciBoYW5kbGluZyAqLworCitzdHJ1Y3QgbGluZV9ubyB7CisgIHN0cnVjdCBsaW5lX25vICpuZXh0OworICBmcmFnUyAqZnJhZzsKKyAgYWxlbnQgbDsKK307CisKK2ludCBjb2ZmX2xpbmVfYmFzZTsKKworLyogU3ltYm9sIG9mIGxhc3QgZnVuY3Rpb24sIHdoaWNoIHdlIHNob3VsZCBoYW5nIGxpbmUjcyBvZmYgb2YuICAqLworc3RhdGljIHN5bWJvbFMgKmxpbmVfZnN5bTsKKworI2RlZmluZSBpbl9mdW5jdGlvbigpCQkobGluZV9mc3ltICE9IDApCisjZGVmaW5lIGNsZWFyX2Z1bmN0aW9uKCkJKGxpbmVfZnN5bSA9IDApCisjZGVmaW5lIHNldF9mdW5jdGlvbihGKQkJKGxpbmVfZnN5bSA9IChGKSwgY29mZl9hZGRfbGluZXN5bSAoRikpCisKKwwKK3ZvaWQKK2NvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgbG9uZyAgIHN6ID0gKE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTICsgMSkgKiBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpOworICBjaGFyICogcyAgPSAoY2hhciAqKSB4bWFsbG9jIChzeik7CisgIAorICBtZW1zZXQgKHMsIDAsIHN6KTsKKyAgY29mZnN5bWJvbCAoc3ltYm9sUC0+YnN5bSktPm5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIHM7CisKKyAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBUX05VTEwpOworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCAwKTsKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMCk7CisKKyAgaWYgKFNfSVNfU1RSSU5HIChzeW1ib2xQKSkKKyAgICBTRl9TRVRfU1RSSU5HIChzeW1ib2xQKTsKKyAgCisgIGlmIChTX0lTX0xPQ0FMIChzeW1ib2xQKSkKKyAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOworfQorCisMCisvKgorICogSGFuZGxlIC5sbiBkaXJlY3RpdmVzLgorICovCisKK3N0YXRpYyBzeW1ib2xTICpjdXJyZW50X2xpbmVub19zeW07CitzdGF0aWMgc3RydWN0IGxpbmVfbm8gKmxpbmVfbm9zOworLyogQEAgQmxpbmRseSBhc3N1bWUgYWxsIC5sbiBkaXJlY3RpdmVzIHdpbGwgYmUgaW4gdGhlIC50ZXh0IHNlY3Rpb24uLi4gICovCitpbnQgY29mZl9uX2xpbmVfbm9zOworCitzdGF0aWMgdm9pZAorYWRkX2xpbmVubyAoZnJhZywgb2Zmc2V0LCBudW0pCisgICAgIGZyYWdTICpmcmFnOworICAgICBpbnQgb2Zmc2V0OworICAgICBpbnQgbnVtOworeworICBzdHJ1Y3QgbGluZV9ubyAqbmV3X2xpbmUgPQorICAgIChzdHJ1Y3QgbGluZV9ubyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaW5lX25vKSk7CisgIGlmICghY3VycmVudF9saW5lbm9fc3ltKQorICAgIHsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgbmV3X2xpbmUtPm5leHQgPSBsaW5lX25vczsKKyAgbmV3X2xpbmUtPmZyYWcgPSBmcmFnOworICBuZXdfbGluZS0+bC5saW5lX251bWJlciA9IG51bTsKKyAgbmV3X2xpbmUtPmwudS5vZmZzZXQgPSBvZmZzZXQ7CisgIGxpbmVfbm9zID0gbmV3X2xpbmU7CisgIGNvZmZfbl9saW5lX25vcysrOworfQorCit2b2lkCitjb2ZmX2FkZF9saW5lc3ltIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgaWYgKGxpbmVfbm9zKQorICAgIHsKKyAgICAgIGNvZmZzeW1ib2wgKGN1cnJlbnRfbGluZW5vX3N5bS0+YnN5bSktPmxpbmVubyA9IChhbGVudCAqKSBsaW5lX25vczsKKyAgICAgIGNvZmZfbl9saW5lX25vcysrOworICAgICAgbGluZV9ub3MgPSAwOworICAgIH0KKyAgY3VycmVudF9saW5lbm9fc3ltID0gc3ltOworfQorCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfbG4gKGFwcGxpbmUpCisgICAgIGludCBhcHBsaW5lOworeworICBpbnQgbDsKKworICBpZiAoISBhcHBsaW5lICYmIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIubG4gcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIGlmICghYXBwbGluZSkKKyAgICB7CisgICAgICBhZGRfbGluZW5vIChmcmFnX25vdywgZnJhZ19ub3dfZml4ICgpLCBsKTsKKyAgICB9CisKKyAgaWYgKGFwcGxpbmUpCisgICAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgbCAtIDEpOworCisjaWZuZGVmIE5PX0xJU1RJTkcKKyAgeworICAgIGV4dGVybiBpbnQgbGlzdGluZzsKKworICAgIGlmIChsaXN0aW5nKQorICAgICAgeworCWlmICghIGFwcGxpbmUpCisJICBsICs9IGNvZmZfbGluZV9iYXNlIC0gMTsKKwlsaXN0aW5nX3NvdXJjZV9saW5lIChsKTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyoKKyAqCQkJZGVmKCkKKyAqCisgKiBIYW5kbGUgLmRlZiBkaXJlY3RpdmVzLgorICoKKyAqIE9uZSBtaWdodCBhc2sgOiB3aHkgY2FuJ3Qgd2Ugc3ltYm9sX25ldyBpZiB0aGUgc3ltYm9sIGRvZXMgbm90CisgKiBhbHJlYWR5IGV4aXN0IGFuZCBmaWxsIGl0IHdpdGggZGVidWcgaW5mb3JtYXRpb24uICBCZWNhdXNlIG9mCisgKiB0aGUgQ19FRkNOIHNwZWNpYWwgc3ltYm9sLiBJdCB3b3VsZCBjbG9iYmVyIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIGZ1bmN0aW9uIHN5bWJvbCBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBub3RpY2UgdGhhdCBpdCBpcworICogYSBDX0VGQ04uIEFuZCBhIHNlY29uZCByZWFzb24gaXMgdGhhdCB0aGUgY29kZSBpcyBtb3JlIGNsZWFyIHRoaXMKKyAqIHdheS4gKGF0IGxlYXN0IEkgdGhpbmsgaXQgaXMgOi0pLgorICoKKyAqLworCisjZGVmaW5lIFNLSVBfU0VNSV9DT0xPTigpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJzsnKQorI2RlZmluZSBTS0lQX1dISVRFU1BBQ0VTKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8IFwKKwkJCQkgICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXHQnKSBcCisgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9kZWYgKHdoYXQpCisgICAgIGludCB3aGF0OworeworICBjaGFyIG5hbWVfZW5kOwkJLyogQ2hhciBhZnRlciB0aGUgZW5kIG9mIG5hbWUgKi8KKyAgY2hhciAqc3ltYm9sX25hbWU7CQkvKiBOYW1lIG9mIHRoZSBkZWJ1ZyBzeW1ib2wgKi8KKyAgY2hhciAqc3ltYm9sX25hbWVfY29weTsJLyogVGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG5hbWUgKi8KKyAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2xlbmd0aDsKKworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCisKKyAgU0tJUF9XSElURVNQQUNFUyAoKTsKKworICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCisgIGlmIChzeW1ib2xfbmFtZVswXSA9PSAnXycgJiYgc3ltYm9sX25hbWVbMV0gIT0gMCkKKyAgICBzeW1ib2xfbmFtZSsrOworI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KKworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworICBzeW1ib2xfbmFtZV9sZW5ndGggPSBzdHJsZW4gKHN5bWJvbF9uYW1lKTsKKyAgc3ltYm9sX25hbWVfY29weSA9IHhtYWxsb2MgKHN5bWJvbF9uYW1lX2xlbmd0aCArIDEpOworICBzdHJjcHkgKHN5bWJvbF9uYW1lX2NvcHksIHN5bWJvbF9uYW1lKTsKKyNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKKyAgc3ltYm9sX25hbWVfY29weSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWVfY29weSk7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBuZXcgc3ltYm9sICovCisgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xfbWFrZSAoc3ltYm9sX25hbWVfY29weSk7CisgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7CisgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwKTsKKworICBpZiAoU19JU19TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgIFNGX1NFVF9TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit1bnNpZ25lZCBpbnQgZGltX2luZGV4OworCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfZW5kZWYgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworICAvKiBESU0gQlVHIEZJWCBzYWNAY3lnbnVzLmNvbSAqLworICBkaW1faW5kZXggPSAwOworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCisKKyAgLyogU2V0IHRoZSBzZWN0aW9uIG51bWJlciBhY2NvcmRpbmcgdG8gc3RvcmFnZSBjbGFzcy4gKi8KKyAgc3dpdGNoIChTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKKyAgICB7CisgICAgY2FzZSBDX1NUUlRBRzoKKyAgICBjYXNlIENfRU5UQUc6CisgICAgY2FzZSBDX1VOVEFHOgorICAgICAgU0ZfU0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgQ19GSUxFOgorICAgIGNhc2UgQ19UUERFRjoKKyAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24gKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENfRUZDTjoKKyAgICAgIFNGX1NFVF9MT0NBTCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CS8qIERvIG5vdCBlbWl0IHRoaXMgc3ltYm9sLiAqLworICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIENfQkxPQ0s6CisgICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CS8qIFdpbGwgbmVlZCBwcm9jZXNzaW5nIGJlZm9yZSB3cml0aW5nICovCisgICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgQ19GQ046CisgICAgICB7CisJQ09OU1QgY2hhciAqbmFtZTsKKwlTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCB0ZXh0X3NlY3Rpb24pOworCisJbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPmJzeW0pOworCWlmIChuYW1lWzFdID09ICdiJyAmJiBuYW1lWzJdID09ICdmJykKKwkgIHsKKwkgICAgaWYgKCEgaW5fZnVuY3Rpb24gKCkpCisJICAgICAgYXNfd2FybiAoXygiYCVzJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb24iKSwgbmFtZSk7CisvKgkgICAgU0FfU0VUX1NZTV9MTk5PIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxMjM0NSk7Ki8KKwkgICAgLyogV2lsbCBuZWVkIHJlbG9jYXRpbmcgKi8KKwkgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworCSAgICBjbGVhcl9mdW5jdGlvbiAoKTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisjaWZkZWYgQ19BVVRPQVJHCisgICAgY2FzZSBDX0FVVE9BUkc6CisjZW5kaWYgLyogQ19BVVRPQVJHICovCisgICAgY2FzZSBDX0FVVE86CisgICAgY2FzZSBDX1JFRzoKKyAgICBjYXNlIENfQVJHOgorICAgIGNhc2UgQ19SRUdQQVJNOgorICAgIGNhc2UgQ19GSUVMRDoKKyAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDX01PUzoKKyAgICBjYXNlIENfTU9FOgorICAgIGNhc2UgQ19NT1U6CisgICAgY2FzZSBDX0VPUzoKKyAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGFic29sdXRlX3NlY3Rpb24pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENfRVhUOgorICAgIGNhc2UgQ19XRUFLRVhUOgorI2lmZGVmIFRFX1BFCisgICAgY2FzZSBDX05UX1dFQUs6CisjZW5kaWYKKyAgICBjYXNlIENfU1RBVDoKKyAgICBjYXNlIENfTEFCRUw6CisgICAgICAvKiBWYWxpZCBidXQgc2V0IHNvbWV3aGVyZSBlbHNlIChzX2NvbW0sIHNfbGNvbW0sIGNvbG9uKSAqLworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgQ19VU1RBVElDOgorICAgIGNhc2UgQ19FWFRERUY6CisgICAgY2FzZSBDX1VMQUJFTDoKKyAgICAgIGFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIpLAorCSAgICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7CisgICAgICBicmVhazsKKyAgICB9CQkJCS8qIHN3aXRjaCBvbiBzdG9yYWdlIGNsYXNzICovCisKKyAgLyogTm93IHRoYXQgd2UgaGF2ZSBidWlsdCBhIGRlYnVnIHN5bWJvbCwgdHJ5IHRvIGZpbmQgaWYgd2Ugc2hvdWxkCisgICAgIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc3ltYm9sIG9yIG5vdC4gIElmIGEgc3ltYm9sIGlzIENfRUZDTiBvcgorICAgICBTRUdfQUJTT0xVVEUgb3IgdW50YWdnZWQgU0VHX0RFQlVHIGl0IG5ldmVyIG1lcmdlcy4gKi8KKworICAvKiBUd28gY2FzZXMgZm9yIGZ1bmN0aW9ucy4gIEVpdGhlciBkZWJ1ZyBmb2xsb3dlZCBieSBkZWZpbml0aW9uIG9yCisgICAgIGRlZmluaXRpb24gZm9sbG93ZWQgYnkgZGVidWcuICBGb3IgZGVmaW5pdGlvbiBmaXJzdCwgd2Ugd2lsbAorICAgICBtZXJnZSB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIGRlZmluaXRpb24uICBGb3IgZGVidWcgZmlyc3QsIHRoZQorICAgICBsaW5lbm8gZW50cnkgTVVTVCBwb2ludCB0byB0aGUgZGVmaW5pdGlvbiBmdW5jdGlvbiBvciBlbHNlIGl0CisgICAgIHdpbGwgcG9pbnQgb2ZmIGludG8gc3BhY2Ugd2hlbiBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKCkgbWVyZ2VzCisgICAgIHRoZSBkZWJ1ZyBzeW1ib2wgaW50byB0aGUgcmVhbCBzeW1ib2wuICBUaGVyZWZvciwgbGV0J3MgcHJlc3VtZQorICAgICB0aGUgZGVidWcgc3ltYm9sIGlzIGEgcmVhbCBmdW5jdGlvbiByZWZlcmVuY2UuICovCisKKyAgLyogRklYTUUtU09PTiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmluaXRpb24gbGFiZWwvc3ltYm9sIGlzCisgICAgIG5ldmVyIHNlZW4sIHRoaXMgd2lsbCBwcm9iYWJseSBsZWF2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIGF0IGxpbmsKKyAgICAgdGltZS4gKi8KKworICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19FRkNOCisgICAgICB8fCAoIXN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwKKwkJCQkJIFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSwKKwkJICAgIipERUJVRyoiKQorCSAgJiYgIVNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgICAgfHwgU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gYWJzb2x1dGVfc2VjdGlvbgorICAgICAgfHwgKHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgRE9fTk9UX1NUUklQKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBzeW1ib2xfbGFzdFApCisJc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLAorCQkgICAgICAgJnN5bWJvbF9sYXN0UCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhpcyBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIG1lcmdlIHRoZSBuZXdseSBjcmVhdGVkIHN5bWJvbAorCSBpbnRvIHRoZSBvbGQgb25lLiAgVGhpcyBpcyBub3QgbWFuZGF0b3J5LiBUaGUgbGlua2VyIGNhbgorCSBoYW5kbGUgZHVwbGljYXRlIHN5bWJvbHMgY29ycmVjdGx5LiBCdXQgSSBndWVzcyB0aGF0IGl0IHNhdmUKKwkgYSAqbG90KiBvZiBzcGFjZSBpZiB0aGUgYXNzZW1ibHkgZmlsZSBkZWZpbmVzIGEgbG90IG9mCisJIHN5bWJvbHMuIFtsb2ljXSAqLworCisgICAgICAvKiBUaGUgZGVidWcgZW50cnkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIGlzIG1lcmdlZCBpbnRvIHRoZQorCSBwcmV2aW91cyBkZWZpbml0aW9uLiAqLworCisgICAgICBjX3N5bWJvbF9tZXJnZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sUCk7CisgICAgICBzeW1ib2xfcmVtb3ZlIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKworICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IHN5bWJvbFA7CisKKyAgICAgIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCisJICB8fCBTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQorCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19TVEFUKQorCXsKKwkgIC8qIEZvciBmdW5jdGlvbnMsIGFuZCB0YWdzLCBhbmQgc3RhdGljIHN5bWJvbHMsIHRoZSBzeW1ib2wKKwkgICAgICptdXN0KiBiZSB3aGVyZSB0aGUgZGVidWcgc3ltYm9sIGFwcGVhcnMuICBNb3ZlIHRoZQorCSAgICAgZXhpc3Rpbmcgc3ltYm9sIHRvIHRoZSBjdXJyZW50IHBsYWNlLiAqLworCSAgLyogSWYgaXQgYWxyZWFkeSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgbGlzdCwgZG8gbm90aGluZyAqLworCSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQorCSAgICB7CisJICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisJICAgICAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKm9sZHRhZzsKKworICAgICAgb2xkdGFnID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCisJCQkJIERPX05PVF9TVFJJUCk7CisgICAgICBpZiAob2xkdGFnID09IE5VTEwgfHwgISBTRl9HRVRfVEFHIChvbGR0YWcpKQorCXRhZ19pbnNlcnQgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAorCQkgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgfQorCisgIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgIHsKKyAgICAgIGtub3cgKHNpemVvZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPD0gc2l6ZW9mIChsb25nKSk7CisgICAgICBzZXRfZnVuY3Rpb24gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworCisgICAgICBpZiAoc3ltYm9sUCA9PSBOVUxMKQorCXsKKwkgIC8qIFRoYXQgaXMsIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUKKwkgICAgIGZ1bmN0aW9uLi4uICovCisJICBzeW1ib2xfdGFibGVfaW5zZXJ0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKKwl9IC8qIGRlZmluaXRpb24gZm9sbG93cyBkZWJ1ZyAqLworICAgIH0gLyogQ3JlYXRlIHRoZSBsaW5lIG51bWJlciBlbnRyeSBwb2ludGluZyB0byB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZCAqLworCisgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBOVUxMOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfZGltIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGludCBkaW1faW5kZXg7CisKKyAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KKworICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKKworICBmb3IgKGRpbV9pbmRleCA9IDA7IGRpbV9pbmRleCA8IERJTU5VTTsgZGltX2luZGV4KyspCisgICAgeworICAgICAgU0tJUF9XSElURVNQQUNFUyAoKTsKKyAgICAgIFNBX1NFVF9TWU1fRElNRU4gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGRpbV9pbmRleCwKKwkJCWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKworICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQorCXsKKwljYXNlICcsJzoKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYXNfd2FybiAoXygiYmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIGlnbm9yZWQiKSk7CisJICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCWNhc2UgJ1xuJzoKKwljYXNlICc7JzoKKwkgIGRpbV9pbmRleCA9IERJTU5VTTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX2xpbmUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IHRoaXNfYmFzZTsKKworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFByb2JhYmx5IHN0YWJzLXN0eWxlIGxpbmU/ICAqLworICAgICAgb2JqX2NvZmZfbG4gKDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0aGlzX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgaWYgKCFzdHJjbXAgKCIuYmYiLCBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkpCisgICAgY29mZl9saW5lX2Jhc2UgPSB0aGlzX2Jhc2U7CisKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7CisgIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgY29mZl9saW5lX2Jhc2UpOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyNpZm5kZWYgTk9fTElTVElORworICBpZiAoc3RyY21wICgiLmJmIiwgU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpID09IDApCisgICAgeworICAgICAgZXh0ZXJuIGludCBsaXN0aW5nOworCisgICAgICBpZiAobGlzdGluZykKKwlsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBjb2ZmX2xpbmVfYmFzZSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9zaXplIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCisKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7CisgIFNBX1NFVF9TWU1fU0laRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfc2NsIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KKworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl90YWcgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqc3ltYm9sX25hbWU7CisgIGNoYXIgbmFtZV9lbmQ7CisKKyAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKKyAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKKyAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKKyNlbmRpZgorCisgIC8qIEFzc3VtZSB0aGF0IHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgLnRhZyBpcyBhbHdheXMgZGVmaW5lZC4KKyAgICAgVGhpcyB3YXMgYSBiYWQgYXNzdW1wdGlvbi4gIEkndmUgYWRkZWQgZmluZF9vcl9tYWtlLiB4b3hvcmljaC4gKi8KKyAgU0FfU0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsCisJCSAgICAgdGFnX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpKTsKKyAgaWYgKFNBX0dFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSAwTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIiksIHN5bWJvbF9uYW1lKTsKKyAgICB9CQkJCS8qIG5vdCBkZWZpbmVkICovCisKKyAgU0ZfU0VUX1RBR0dFRCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfdHlwZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLworCisgIFNfU0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworCisgIGlmIChJU0ZDTiAoU19HRVRfREFUQV9UWVBFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkgJiYKKyAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IENfVFBERUYpCisgICAgeworICAgICAgU0ZfU0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKKyAgICB9CQkJCS8qIGlzIGEgZnVuY3Rpb24gKi8KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfdmFsIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KKworICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCisgICAgeworICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKKyAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKKyNlbmRpZgorICAgICAgaWYgKCFzdHJjbXAgKHN5bWJvbF9uYW1lLCAiLiIpKQorCXsKKwkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKwkgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOworCSAgLyogSWYgdGhlIC52YWwgaXMgIT0gZnJvbSB0aGUgLmRlZiAoZS5nLiBzdGF0aWNzKSAqLworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIHN5bWJvbF9uYW1lKSkKKwl7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPQorCSAgICBzeW1ib2xfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSk7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wX3N5bWJvbCA9IE5VTEw7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAwOworCisJICAvKiBJZiB0aGUgc2VnbWVudCBpcyB1bmRlZmluZWQgd2hlbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgaXMKKwkgICAgIHJlc29sdmVkLCB0aGVuIGNvcHkgdGhlIHNlZ21lbnQgaWQgZnJvbSB0aGUgZm9yd2FyZAorCSAgICAgc3ltYm9sLiAgKi8KKwkgIFNGX1NFVF9HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisJfQorICAgICAgLyogT3RoZXJ3aXNlLCBpdCBpcyB0aGUgbmFtZSBvZiBhIG5vbiBkZWJ1ZyBzeW1ib2wgYW5kIGl0cyB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgbGF0ZXIuICovCisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKyAgICB9CQkJCS8qIGlmIHN5bWJvbCBiYXNlZCAqLworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK2NvZmZfb2JqX3JlYWRfYmVnaW5faG9vayAoKQoreworICAvKiBUaGVzZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAgVXN1YWxseSAxOCBieXRlcy4gKi8KKyNpZm5kZWYgQkZEX0hFQURFUlMKKyAga25vdyAoc2l6ZW9mIChTWU1FTlQpID09IHNpemVvZiAoQVVYRU5UKSk7CisgIGtub3cgKFNZTUVTWiA9PSBBVVhFU1opOworI2VuZGlmCisgIHRhZ19pbml0ICgpOworfQorCisKK3N5bWJvbFMgKmNvZmZfbGFzdF9mdW5jdGlvbjsKK3N0YXRpYyBzeW1ib2xTICpjb2ZmX2xhc3RfYmY7CisKK3ZvaWQKK2NvZmZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnQpCisgICAgIHN5bWJvbFMgKnN5bXA7CisgICAgIGludCAqcHVudDsKK3sKKyAgc3RhdGljIHN5bWJvbFMgKmxhc3RfdGFnUDsKKyAgc3RhdGljIHN0YWNrICpibG9ja19zdGFjazsKKyAgc3RhdGljIHN5bWJvbFMgKnNldF9lbmQ7CisgIHN5bWJvbFMgKm5leHRfc2V0X2VuZCA9IE5VTEw7CisKKyAgaWYgKHN5bXAgPT0gJmFic19zeW1ib2wpCisgICAgeworICAgICAgKnB1bnQgPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoY3VycmVudF9saW5lbm9fc3ltKQorICAgIGNvZmZfYWRkX2xpbmVzeW0gKChzeW1ib2xTICopIDApOworCisgIGlmICghYmxvY2tfc3RhY2spCisgICAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyopKTsKKworICBpZiAoU19JU19XRUFLIChzeW1wKSkKKyAgICB7CisjaWZkZWYgVEVfUEUKKyAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfTlRfV0VBSyk7CisjZWxzZQorICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19XRUFLRVhUKTsKKyNlbmRpZgorICAgIH0KKworICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltcCkKKyAgICAgICYmICFTX0lTX1dFQUsgKHN5bXApCisgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSAhPSBDX1NUQVQpCisgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19FWFQpOworCisgIGlmICghU0ZfR0VUX0RFQlVHIChzeW1wKSkKKyAgICB7CisgICAgICBzeW1ib2xTICpyZWFsOworICAgICAgaWYgKCFTRl9HRVRfTE9DQUwgKHN5bXApCisJICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bXApCisJICAmJiAocmVhbCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKHN5bXApLCBET19OT1RfU1RSSVApKQorCSAgJiYgcmVhbCAhPSBzeW1wKQorCXsKKwkgIGNfc3ltYm9sX21lcmdlIChzeW1wLCByZWFsKTsKKwkgICpwdW50ID0gMTsKKwl9CisgICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltcCkgJiYgIVNGX0dFVF9MT0NBTCAoc3ltcCkpCisJeworCSAgYXNzZXJ0IChTX0dFVF9WQUxVRSAoc3ltcCkgPT0gMCk7CisJICBTX1NFVF9FWFRFUk5BTCAoc3ltcCk7CisJfQorICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19OVUxMKQorCXsKKwkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1wKSA9PSB0ZXh0X3NlY3Rpb24KKwkgICAgICAmJiBzeW1wICE9IHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5zeW0pCisJICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfTEFCRUwpOworCSAgZWxzZQorCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX1NUQVQpOworCX0KKyAgICAgIGlmIChTRl9HRVRfUFJPQ0VTUyAoc3ltcCkpCisJeworCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfQkxPQ0spCisJICAgIHsKKwkgICAgICBpZiAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ltcCksICIuYmIiKSkKKwkJc3RhY2tfcHVzaCAoYmxvY2tfc3RhY2ssIChjaGFyICopICZzeW1wKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBzeW1ib2xTICpiZWdpbjsKKwkJICBiZWdpbiA9ICooc3ltYm9sUyAqKikgc3RhY2tfcG9wIChibG9ja19zdGFjayk7CisJCSAgaWYgKGJlZ2luID09IDApCisJCSAgICBhc193YXJuIChfKCJtaXNtYXRjaGVkIC5lYiIpKTsKKwkJICBlbHNlCisJCSAgICBuZXh0X3NldF9lbmQgPSBiZWdpbjsKKwkJfQorCSAgICB9CisJICBpZiAoY29mZl9sYXN0X2Z1bmN0aW9uID09IDAgJiYgU0ZfR0VUX0ZVTkNUSU9OIChzeW1wKSkKKwkgICAgeworCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4cDsKKwkgICAgICBjb2ZmX2xhc3RfZnVuY3Rpb24gPSBzeW1wOworCSAgICAgIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wKSA8IDEpCisJCVNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bXAsIDEpOworCSAgICAgIGF1eHAgPSAmY29mZnN5bWJvbCAoc3ltcC0+YnN5bSktPm5hdGl2ZVsxXS51LmF1eGVudDsKKwkgICAgICBtZW1zZXQgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sIDAsCisJCSAgICAgIHNpemVvZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOworCSAgICB9CisJICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FRkNOKQorCSAgICB7CisJICAgICAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwKQorCQlhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7CisJICAgICAgU0FfU0VUX1NZTV9GU0laRSAoY29mZl9sYXN0X2Z1bmN0aW9uLAorCQkJCShsb25nKSAoU19HRVRfVkFMVUUgKHN5bXApCisJCQkJCS0gU19HRVRfVkFMVUUgKGNvZmZfbGFzdF9mdW5jdGlvbikpKTsKKwkgICAgICBuZXh0X3NldF9lbmQgPSBjb2ZmX2xhc3RfZnVuY3Rpb247CisJICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gMDsKKwkgICAgfQorCX0KKyAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKKwlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0VYVCk7CisgICAgICBlbHNlIGlmIChTRl9HRVRfTE9DQUwgKHN5bXApKQorCSpwdW50ID0gMTsKKworICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCisJc3ltcC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCisgICAgICAvKiBtb3JlIC4uLiAqLworICAgIH0KKworICBpZiAoU0ZfR0VUX1RBRyAoc3ltcCkpCisgICAgbGFzdF90YWdQID0gc3ltcDsKKyAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FT1MpCisgICAgbmV4dF9zZXRfZW5kID0gbGFzdF90YWdQOworCisjaWZkZWYgT0JKX1hDT0ZGCisgIC8qIFRoaXMgaXMgcHJldHR5IGhvcnJpYmxlLCBidXQgd2UgaGF2ZSB0byBzZXQgKnB1bnQgY29ycmVjdGx5IGluCisgICAgIG9yZGVyIHRvIGNhbGwgU0FfU0VUX1NZTV9FTkRORFggY29ycmVjdGx5LiAgKi8KKyAgaWYgKCEgc3ltcC0+c3lfdXNlZF9pbl9yZWxvYworICAgICAgJiYgKChzeW1wLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAorCSAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltcCkKKwkgICAgICAmJiAhIHN5bXAtPnN5X3RjLm91dHB1dAorCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApICE9IENfRklMRSkpKQorICAgICpwdW50ID0gMTsKKyNlbmRpZgorCisgIGlmIChzZXRfZW5kICE9IChzeW1ib2xTICopIE5VTEwKKyAgICAgICYmICEgKnB1bnQKKyAgICAgICYmICgoc3ltcC0+YnN5bS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgIT0gMAorCSAgfHwgKFNfSVNfREVGSU5FRCAoc3ltcCkKKwkgICAgICAmJiAhIFNfSVNfQ09NTU9OIChzeW1wKQorCSAgICAgICYmICghIFNfSVNfRVhURVJOQUwgKHN5bXApIHx8IFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpKSkpCisgICAgeworICAgICAgU0FfU0VUX1NZTV9FTkRORFggKHNldF9lbmQsIHN5bXApOworICAgICAgc2V0X2VuZCA9IE5VTEw7CisgICAgfQorCisgIGlmIChuZXh0X3NldF9lbmQgIT0gTlVMTAorICAgICAgJiYgISAqcHVudCkKKyAgICBzZXRfZW5kID0gbmV4dF9zZXRfZW5kOworCisgIGlmICghICpwdW50CisgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0ZDTgorICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChzeW1wKSwgIi5iZiIpID09IDApCisgICAgeworICAgICAgaWYgKGNvZmZfbGFzdF9iZiAhPSBOVUxMKQorCVNBX1NFVF9TWU1fRU5ETkRYIChjb2ZmX2xhc3RfYmYsIHN5bXApOworICAgICAgY29mZl9sYXN0X2JmID0gc3ltcDsKKyAgICB9CisKKyAgaWYgKGNvZmZzeW1ib2wgKHN5bXAtPmJzeW0pLT5saW5lbm8pCisgICAgeworICAgICAgaW50IGk7CisgICAgICBzdHJ1Y3QgbGluZV9ubyAqbHB0cjsKKyAgICAgIGFsZW50ICpsOworCisgICAgICBscHRyID0gKHN0cnVjdCBsaW5lX25vICopIGNvZmZzeW1ib2wgKHN5bXAtPmJzeW0pLT5saW5lbm87CisgICAgICBmb3IgKGkgPSAwOyBscHRyOyBscHRyID0gbHB0ci0+bmV4dCkKKwlpKys7CisgICAgICBscHRyID0gKHN0cnVjdCBsaW5lX25vICopIGNvZmZzeW1ib2wgKHN5bXAtPmJzeW0pLT5saW5lbm87CisKKyAgICAgIC8qIFdlIG5lZWQgaSBlbnRyaWVzIGZvciBsaW5lIG51bWJlcnMsIHBsdXMgMSBmb3IgdGhlIGZpcnN0CisJIGVudHJ5IHdoaWNoIEJGRCB3aWxsIG92ZXJyaWRlLCBwbHVzIDEgZm9yIHRoZSBsYXN0IHplcm8KKwkgZW50cnkgKGEgbWFya2VyIGZvciBCRkQpLiAgKi8KKyAgICAgIGwgPSAoYWxlbnQgKikgeG1hbGxvYyAoKGkgKyAyKSAqIHNpemVvZiAoYWxlbnQpKTsKKyAgICAgIGNvZmZzeW1ib2wgKHN5bXAtPmJzeW0pLT5saW5lbm8gPSBsOworICAgICAgbFtpICsgMV0ubGluZV9udW1iZXIgPSAwOworICAgICAgbFtpICsgMV0udS5zeW0gPSBOVUxMOworICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCisJeworCSAgaWYgKGxwdHItPmZyYWcpCisJICAgIGxwdHItPmwudS5vZmZzZXQgKz0gbHB0ci0+ZnJhZy0+ZnJfYWRkcmVzczsKKwkgIGxbaV0gPSBscHRyLT5sOworCSAgbHB0ciA9IGxwdHItPm5leHQ7CisJfQorICAgIH0KK30KKwordm9pZAorY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zIChhYmZkLCBzZWMsIHgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIHg7Cit7CisgIHN5bWJvbFMgKnNlY3N5bTsKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKKyAgaW50IG5sbm5vLCBucmVsb2NzID0gMDsKKworICAvKiBSUy82MDAwIGdhcyBjcmVhdGVzIGEgLmRlYnVnIHNlY3Rpb24gbWFudWFsbHkgaW4gcHBjX2Zyb2JfZmlsZSBpbgorICAgICB0Yy1wcGMuYy4gIERvIG5vdCBnZXQgY29uZnVzZWQgYnkgaXQuICAqLworICBpZiAoc2VnaW5mbyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAoIXN0cmNtcCAoc2VjLT5uYW1lLCAiLnRleHQiKSkKKyAgICBubG5ubyA9IGNvZmZfbl9saW5lX25vczsKKyAgZWxzZQorICAgIG5sbm5vID0gMDsKKyAgeworICAgIC8qIEBAIEhvcGUgdGhhdCBub25lIG9mIHRoZSBmaXh1cHMgZXhwYW5kIHRvIG1vcmUgdGhhbiBvbmUgcmVsb2MKKyAgICAgICBlbnRyeS4uLiAgKi8KKyAgICBmaXhTICpmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7CisgICAgd2hpbGUgKGZpeHApCisgICAgICB7CisJaWYgKCEgZml4cC0+ZnhfZG9uZSkKKwkgIG5yZWxvY3MrKzsKKwlmaXhwID0gZml4cC0+ZnhfbmV4dDsKKyAgICAgIH0KKyAgfQorICBpZiAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpID09IDAKKyAgICAgICYmIG5yZWxvY3MgPT0gMAorICAgICAgJiYgbmxubm8gPT0gMAorICAgICAgJiYgc2VjICE9IHRleHRfc2VjdGlvbgorICAgICAgJiYgc2VjICE9IGRhdGFfc2VjdGlvbgorICAgICAgJiYgc2VjICE9IGJzc19zZWN0aW9uKQorICAgIHJldHVybjsKKyAgc2Vjc3ltID0gc2VjdGlvbl9zeW1ib2wgKHNlYyk7CisgIFNBX1NFVF9TQ05fTlJFTE9DIChzZWNzeW0sIG5yZWxvY3MpOworICBTQV9TRVRfU0NOX05MSU5OTyAoc2Vjc3ltLCBubG5ubyk7Cit9CisKK3ZvaWQKK2NvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQoreworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zLCAoY2hhciopIDApOworfQorCisvKgorICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6CisgKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9CisgKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgorICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCisgKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCisgKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQorICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0CisgKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCisgKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKKyAqIHN1YnNlZ21lbnQgbnVtYmVyLgorICovCisKK3ZvaWQKK29ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgLyogU3RyaXAgb3V0IHRoZSBzZWN0aW9uIG5hbWUgKi8KKyAgY2hhciAqc2VjdGlvbl9uYW1lOworICBjaGFyIGM7CisgIGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGludCBleHA7CisgIGZsYWd3b3JkIGZsYWdzOworICBhc2VjdGlvbiAqc2VjOworCisgIGlmIChmbGFnX21yaSkKKyAgICB7CisgICAgICBjaGFyIHR5cGU7CisKKyAgICAgIHNfbXJpX3NlY3QgKCZ0eXBlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOworICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIGV4cCA9IDA7CisgIGZsYWdzID0gU0VDX05PX0ZMQUdTOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKKwlleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgIGVsc2UKKwl7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJworCQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCisJCXsKKwkJY2FzZSAnYic6IGZsYWdzIHw9IFNFQ19BTExPQzsgZmxhZ3MgJj1+IFNFQ19MT0FEOyBicmVhazsKKwkJY2FzZSAnbic6IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7CisJCWNhc2UgJ2QnOgorCQljYXNlICd3JzogZmxhZ3MgJj1+IFNFQ19SRUFET05MWTsgYnJlYWs7CisJCWNhc2UgJ3gnOiBmbGFncyB8PSBTRUNfQ09ERTsgYnJlYWs7CisJCWNhc2UgJ3InOiBmbGFncyB8PSBTRUNfUkVBRE9OTFk7IGJyZWFrOworCisJCWNhc2UgJ2knOiAvKiBTVFlQX0lORk8gKi8KKwkJY2FzZSAnbCc6IC8qIFNUWVBfTElCICovCisJCWNhc2UgJ28nOiAvKiBTVFlQX09WRVIgKi8KKwkJICBhc193YXJuIChfKCJ1bnN1cHBvcnRlZCBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCisJCQkgICAqaW5wdXRfbGluZV9wb2ludGVyKTsKKwkJICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgIGFzX3dhcm4oXygidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIiksCisJCQkgICppbnB1dF9saW5lX3BvaW50ZXIpOworCQkgIGJyZWFrOworCQl9CisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgIH0KKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICciJykKKwkgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJfQorICAgIH0KKworICBzZWMgPSBzdWJzZWdfbmV3IChuYW1lLCAoc3Vic2VnVCkgZXhwKTsKKworICBpZiAoZmxhZ3MgIT0gU0VDX05PX0ZMQUdTKQorICAgIHsKKyAgICAgIGZsYWd3b3JkIG9sZGZsYWdzOworCisgICAgICBvbGRmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMpOworICAgICAgb2xkZmxhZ3MgJj0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVM7CisgICAgICBmbGFncyB8PSBvbGRmbGFnczsKKworICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpKQorCWFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKKwkJIGJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VjKSwKKwkJIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwordm9pZAorY29mZl9hZGp1c3Rfc3ltdGFiICgpCit7CisgIGlmIChzeW1ib2xfcm9vdFAgPT0gTlVMTAorICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sX3Jvb3RQKSAhPSBDX0ZJTEUpCisgICAgY19kb3RfZmlsZV9zeW1ib2wgKCJmYWtlIik7Cit9CisKK3ZvaWQKK2NvZmZfZnJvYl9zZWN0aW9uIChzZWMpCisgICAgIHNlZ1Qgc2VjOworeworICBzZWdUIHN0cnNlYzsKKyAgY2hhciAqcDsKKyAgZnJhZ1MgKmZyYWdwOworICBiZmRfdm1hIHNpemUsIG5fZW50cmllcywgbWFzazsKKworICAvKiBUaGUgQ09GRiBiYWNrIGVuZCBpbiBCRkQgcmVxdWlyZXMgdGhhdCBhbGwgc2VjdGlvbiBzaXplcyBiZQorICAgICByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9uIGFsaWdubWVudHMuCisgICAgIFNlZW1zIGtpbmRhIHNpbGx5IHRvIG1lLCBidXQgdGhhdCdzIHRoZSB3YXkgaXQgaXMuICAqLworICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWMpOworICBtYXNrID0gKChiZmRfdm1hKSAxIDw8IChiZmRfdm1hKSBzZWMtPmFsaWdubWVudF9wb3dlcikgLSAxOworICBpZiAoc2l6ZSAmIG1hc2spCisgICAgeworICAgICAgc2l6ZSA9IChzaXplICsgbWFzaykgJiB+bWFzazsKKyAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYywgc2l6ZSk7CisgICAgfQorCisgIC8qIElmIHRoZSBzZWN0aW9uIHNpemUgaXMgbm9uLXplcm8sIHRoZSBzZWN0aW9uIHN5bWJvbCBuZWVkcyBhbiBhdXgKKyAgICAgZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LCBpbmRpY2F0aW5nIHRoZSBzaXplLiAgV2UgZG9uJ3Qga25vdworICAgICBhbGwgdGhlIHZhbHVlcyB5ZXQ7IGNvZmZfZnJvYl9zeW1ib2wgd2lsbCBmaWxsIHRoZW0gaW4gbGF0ZXIuICAqLworICBpZiAoc2l6ZSAhPSAwCisgICAgICB8fCBzZWMgPT0gdGV4dF9zZWN0aW9uCisgICAgICB8fCBzZWMgPT0gZGF0YV9zZWN0aW9uCisgICAgICB8fCBzZWMgPT0gYnNzX3NlY3Rpb24pCisgICAgeworICAgICAgc3ltYm9sUyAqc2Vjc3ltID0gc2VjdGlvbl9zeW1ib2wgKHNlYyk7CisKKyAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHNlY3N5bSwgQ19TVEFUKTsKKyAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHNlY3N5bSwgMSk7CisgICAgICBTRl9TRVRfU1RBVElDUyAoc2Vjc3ltKTsKKyAgICAgIFNBX1NFVF9TQ05fU0NOTEVOIChzZWNzeW0sIHNpemUpOworICAgIH0KKworICAvKiBAQCB0aGVzZSBzaG91bGQgYmUgaW4gYSAic3RhYnMuaCIgZmlsZSwgb3IgbWF5YmUgYXMuaCAqLworI2lmbmRlZiBTVEFCX1NFQ1RJT05fTkFNRQorI2RlZmluZSBTVEFCX1NFQ1RJT05fTkFNRSAiLnN0YWIiCisjZW5kaWYKKyNpZm5kZWYgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FCisjZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiLnN0YWJzdHIiCisjZW5kaWYKKyAgaWYgKHN0cmNtcCAoU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FLCBzZWMtPm5hbWUpKQorICAgIHJldHVybjsKKworICBzdHJzZWMgPSBzZWM7CisgIHNlYyA9IHN1YnNlZ19nZXQgKFNUQUJfU0VDVElPTl9OQU1FLCAwKTsKKyAgLyogc2l6ZSBpcyBhbHJlYWR5IHJvdW5kZWQgdXAsIHNpbmNlIG90aGVyIHNlY3Rpb24gd2lsbCBiZSBsaXN0ZWQgZmlyc3QgKi8KKyAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc3Ryc2VjKTsKKworICBuX2VudHJpZXMgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykgLyAxMiAtIDE7CisKKyAgLyogRmluZCBmaXJzdCBub24tZW1wdHkgZnJhZy4gIEl0IHNob3VsZCBiZSBsYXJnZSBlbm91Z2guICAqLworICBmcmFncCA9IHNlZ19pbmZvIChzZWMpLT5mcmNoYWluUC0+ZnJjaF9yb290OworICB3aGlsZSAoZnJhZ3AgJiYgZnJhZ3AtPmZyX2ZpeCA9PSAwKQorICAgIGZyYWdwID0gZnJhZ3AtPmZyX25leHQ7CisgIGFzc2VydCAoZnJhZ3AgIT0gMCAmJiBmcmFncC0+ZnJfZml4ID49IDEyKTsKKworICAvKiBTdG9yZSB0aGUgdmFsdWVzLiAgKi8KKyAgcCA9IGZyYWdwLT5mcl9saXRlcmFsOworICBiZmRfaF9wdXRfMTYgKHN0ZG91dHB1dCwgbl9lbnRyaWVzLCAoYmZkX2J5dGUgKikgcCArIDYpOworICBiZmRfaF9wdXRfMzIgKHN0ZG91dHB1dCwgc2l6ZSwgKGJmZF9ieXRlICopIHAgKyA4KTsKK30KKwordm9pZAorb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKKyAgICAgc2VnVCBzZWc7Cit7CisgIGNoYXIgKmZpbGU7CisgIGNoYXIgKnA7CisgIGNoYXIgKnN0YWJzdHJfbmFtZTsKKyAgdW5zaWduZWQgaW50IHN0cm9mZjsKKworICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KKyAgcCA9IGZyYWdfbW9yZSAoMTIpOworICAvKiBaZXJvIGl0IG91dC4gKi8KKyAgbWVtc2V0IChwLCAwLCAxMik7CisgIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKKyAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZy0+bmFtZSkgKyA0KTsKKyAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZy0+bmFtZSk7CisgIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7CisgIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7CisgIGtub3cgKHN0cm9mZiA9PSAxKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOworfQorCisjaWZkZWYgREVCVUcKKy8qIGZvciBkZWJ1Z2dpbmcgKi8KK2NvbnN0IGNoYXIgKgorc19nZXRfbmFtZSAocykKKyAgICAgc3ltYm9sUyAqczsKK3sKKyAgcmV0dXJuICgocyA9PSBOVUxMKSA/ICIoTlVMTCkiIDogU19HRVRfTkFNRSAocykpOworfQorCit2b2lkCitzeW1ib2xfZHVtcCAoKQoreworICBzeW1ib2xTICpzeW1ib2xQOworCisgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKKyAgICB7CisgICAgICBwcmludGYoXygiMHglbHg6IFwiJXNcIiB0eXBlID0gJWxkLCBjbGFzcyA9ICVkLCBzZWdtZW50ID0gJWRcbiIpLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN5bWJvbFAsCisJICAgICBTX0dFVF9OQU1FKHN5bWJvbFApLAorCSAgICAgKGxvbmcpIFNfR0VUX0RBVEFfVFlQRShzeW1ib2xQKSwKKwkgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCksCisJICAgICAoaW50KSBTX0dFVF9TRUdNRU5UKHN5bWJvbFApKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisjZWxzZSAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLworCisjaW5jbHVkZSAiZnJhZ3MuaCIKKy8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgaW5jbHVkZSBpbnRlcm5hbCBiZmQgdGhpbmdzLiAqLworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImxpYmJmZC5oIgorI2luY2x1ZGUgImxpYmNvZmYuaCIKKworI2lmZGVmIFRFX1BFCisjaW5jbHVkZSAiY29mZi9wZS5oIgorI2VuZGlmCisKKy8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuICBGaWxsIHdpdGggbm9wIHNvCisgICB0aGF0IHdlIGNhbiBzdGljayBzZWN0aW9ucyB0b2dldGhlciB3aXRob3V0IGNhdXNpbmcgdHJvdWJsZS4gICovCisjaWZuZGVmIE5PUF9PUENPREUKKyNkZWZpbmUgTk9QX09QQ09ERSAweDAwCisjZW5kaWYKKworLyogVGhlIHplcm9lcyBpZiBzeW1ib2wgbmFtZSBpcyBsb25nZXIgdGhhbiA4IGNoYXJzICovCisjZGVmaW5lIFNfU0VUX1pFUk9FUyhzLHYpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5femVyb2VzID0gKHYpKQorCisjZGVmaW5lIE1JTihhLGIpICgoYSkgPCAoYik/IChhKSA6IChiKSkKKy8qIFRoaXMgdmVjdG9yIGlzIHVzZWQgdG8gdHVybiBhbiBpbnRlcm5hbCBzZWdtZW50IGludG8gYSBzZWN0aW9uICMKKyAgIHN1aXRhYmxlIGZvciBpbnNlcnRpb24gaW50byBhIGNvZmYgc3ltYm9sIHRhYmxlCisgKi8KKworY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KK3sJCQkJLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCisgIENfQUJTX1NFQ1RJT04sCisgIDEsICAgIDIsICAzLCAgIDQsICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLAorICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwKKyAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsCisgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLAorICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfVU5LTk9XTiAqLworICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfR09PRiAqLworICBDX1VOREVGX1NFQ1RJT04sCQkvKiBTRUdfRVhQUiAqLworICBDX0RFQlVHX1NFQ1RJT04sCQkvKiBTRUdfREVCVUcgKi8KKyAgQ19OVFZfU0VDVElPTiwJCS8qIFNFR19OVFYgKi8KKyAgQ19QVFZfU0VDVElPTiwJCS8qIFNFR19QVFYgKi8KKyAgQ19SRUdJU1RFUl9TRUNUSU9OLAkJLyogU0VHX1JFR0lTVEVSICovCit9OworCitpbnQgZnVuY3Rpb25fbGluZW9mZiA9IC0xOwkvKiBPZmZzZXQgaW4gbGluZSNzIHdoZXJlIHRoZSBsYXN0IGZ1bmN0aW9uCisJCQkJICAgc3RhcnRlZCAodGhlIG9kZCBlbnRyeSBmb3IgbGluZSAjMCkgKi8KKworLyogc3RydWN0dXJlIHVzZWQgdG8ga2VlcCB0aGUgZmlsZW5hbWVzIHdoaWNoCisgICBhcmUgdG9vIGxvbmcgYXJvdW5kIHNvIHRoYXQgd2UgY2FuIHN0aWNrIHRoZW0KKyAgIGludG8gdGhlIHN0cmluZyB0YWJsZSAqLworc3RydWN0IGZpbGVuYW1lX2xpc3QgCit7CisgIGNoYXIgKmZpbGVuYW1lOworICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9oZWFkOworc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X3RhaWw7CisKK3N0YXRpYyBzeW1ib2xTICpsYXN0X2xpbmVfc3ltYm9sOworCisvKiBBZGQgNCB0byB0aGUgcmVhbCB2YWx1ZSB0byBnZXQgdGhlIGluZGV4IGFuZCBjb21wZW5zYXRlIHRoZQorICAgbmVnYXRpdmVzLiBUaGlzIHZlY3RvciBpcyB1c2VkIGJ5IFNfR0VUX1NFR01FTlQgdG8gdHVybiBhIGNvZmYKKyAgIHNlY3Rpb24gbnVtYmVyIGludG8gYSBzZWdtZW50IG51bWJlcgorKi8KK3N0YXRpYyBzeW1ib2xTICpwcmV2aW91c19maWxlX3N5bWJvbDsKK3ZvaWQgY19zeW1ib2xfbWVyZ2UgKCk7CitzdGF0aWMgaW50IGxpbmVfYmFzZTsKKworc3ltYm9sUyAqY19zZWN0aW9uX3N5bWJvbCAoKTsKK2JmZCAqYWJmZDsKKworc3RhdGljIHZvaWQgZml4dXBfc2VnbWVudCBQQVJBTVMgKChzZWdtZW50X2luZm9fdHlwZSAqc2VnUCwKKwkJCQkgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlKSk7CisKKworc3RhdGljIHZvaWQgZml4dXBfbWRlcHMgUEFSQU1TICgoZnJhZ1MgKiwKKwkJCQkgb2JqZWN0X2hlYWRlcnMgKiwKKwkJCQkgc2VnVCkpOworCisKK3N0YXRpYyB2b2lkIGZpbGxfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiBhYmZkLAorCQkJCSAgb2JqZWN0X2hlYWRlcnMgKiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKikpOworCisKK3N0YXRpYyBpbnQgY19saW5lX25ldyBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sLCBsb25nIHBhZGRyLAorCQkJICAgICAgIGludCBsaW5lX251bWJlciwKKwkJCSAgICAgICBmcmFnUyAqIGZyYWcpKTsKKworCitzdGF0aWMgdm9pZCB3X3N5bWJvbHMgUEFSQU1TICgoYmZkICogYWJmZCwgY2hhciAqd2hlcmUsCisJCQkgICAgICAgc3ltYm9sUyAqIHN5bWJvbF9yb290UCkpOworCitzdGF0aWMgdm9pZCBhZGp1c3Rfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VnVCBzZWcpKTsKKworc3RhdGljIHZvaWQgb2JqX2NvZmZfbGNvbW0gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBvYmpfY29mZl90ZXh0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2NvZmZfZGF0YSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG9ial9jb2ZmX2lkZW50IFBBUkFNUyAoKGludCkpOwordm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOworCisvKiBTZWN0aW9uIHN0dWZmCisKKyAgIFdlIGFsbG93IG1vcmUgdGhhbiBqdXN0IHRoZSBzdGFuZGFyZCAzIHNlY3Rpb25zLCBpbmZhY3QsIHdlIGFsbG93CisgICA0MCBzZWN0aW9ucywgKHRob3VnaCB0aGUgdXN1YWwgdGhyZWUgaGF2ZSB0byBiZSB0aGVyZSkuCisKKyAgIFRoaXMgc3RydWN0dXJlIHBlcmZvcm1zIHRoZSBtYXBwaW5ncyBmb3IgdXM6CisqLworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHNlZ1Qgc2VnX3Q7CisgIGludCBpOworfSBzZWdfaW5mb190eXBlOworCitzdGF0aWMgY29uc3Qgc2VnX2luZm9fdHlwZSBzZWdfaW5mb19vZmZfYnlfNFtdID0KK3sKKyB7U0VHX1BUViwgIH0sCisge1NFR19OVFYsICB9LAorIHtTRUdfREVCVUcsIH0sCisge1NFR19BQlNPTFVURSwgIH0sCisge1NFR19VTktOT1dOLAkgfSwKKyB7U0VHX0UwfSwge1NFR19FMX0sIHtTRUdfRTJ9LCB7U0VHX0UzfSwge1NFR19FNH0sCisge1NFR19FNX0sIHtTRUdfRTZ9LCB7U0VHX0U3fSwge1NFR19FOH0sIHtTRUdfRTl9LAorIHtTRUdfRTEwfSx7U0VHX0UxMX0se1NFR19FMTJ9LHtTRUdfRTEzfSx7U0VHX0UxNH0sCisge1NFR19FMTV9LHtTRUdfRTE2fSx7U0VHX0UxN30se1NFR19FMTh9LHtTRUdfRTE5fSwKKyB7U0VHX0UyMH0se1NFR19FMjF9LHtTRUdfRTIyfSx7U0VHX0UyM30se1NFR19FMjR9LAorIHtTRUdfRTI1fSx7U0VHX0UyNn0se1NFR19FMjd9LHtTRUdfRTI4fSx7U0VHX0UyOX0sCisge1NFR19FMzB9LHtTRUdfRTMxfSx7U0VHX0UzMn0se1NFR19FMzN9LHtTRUdfRTM0fSwKKyB7U0VHX0UzNX0se1NFR19FMzZ9LHtTRUdfRTM3fSx7U0VHX0UzOH0se1NFR19FMzl9LAorIHsoc2VnVCk0MH0sCisgeyhzZWdUKTQxfSwKKyB7KHNlZ1QpNDJ9LAorIHsoc2VnVCk0M30sCisgeyhzZWdUKTQ0fSwKKyB7KHNlZ1QpNDV9LAorIHsoc2VnVCkwfSwKKyB7KHNlZ1QpMH0sCisgeyhzZWdUKTB9LAorIHtTRUdfUkVHSVNURVJ9Cit9OworCisKKworI2RlZmluZSBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSKHgpIChzZWdfaW5mb19vZmZfYnlfNFsoeCkrNF0pCisKK3N0YXRpYyByZWxheF9hZGRyZXNzVAorcmVsYXhfYWxpZ24gKGFkZHJlc3MsIGFsaWdubWVudCkKKyAgICAgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsKKyAgICAgbG9uZyBhbGlnbm1lbnQ7Cit7CisgIHJlbGF4X2FkZHJlc3NUIG1hc2s7CisgIHJlbGF4X2FkZHJlc3NUIG5ld19hZGRyZXNzOworCisgIG1hc2sgPSB+KCh+MCkgPDwgYWxpZ25tZW50KTsKKyAgbmV3X2FkZHJlc3MgPSAoYWRkcmVzcyArIG1hc2spICYgKH5tYXNrKTsKKyAgcmV0dXJuIChuZXdfYWRkcmVzcyAtIGFkZHJlc3MpOworfQorCisKK3NlZ1QKK3NfZ2V0X3NlZ21lbnQgKHgpCisgICAgIHN5bWJvbFMgKiB4OworeworICByZXR1cm4gU0VHX0lORk9fRlJPTV9TRUNUSU9OX05VTUJFUiAoeC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtKS5zZWdfdDsKK30KKworLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNoYWluIGFuZCBmaWxsIGluIHRoZSBzZWN0aW9uIGhlYWRlcgorICAgdG8gY29udGFpbiBhbGwgb2YgaXQsIGFsc28gZmlsbCBpbiB0aGUgYWRkciBvZiB0aGUgc2VjdGlvbnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NpemVfc2VjdGlvbiAoYWJmZCwgaWR4KQorICAgICBiZmQgKiBhYmZkOworICAgICB1bnNpZ25lZCBpbnQgaWR4OworeworCisgIHVuc2lnbmVkIGludCBzaXplID0gMDsKKyAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmNoYWluUC0+ZnJjaF9yb290OworICB3aGlsZSAoZnJhZykKKyAgICB7CisgICAgICBzaXplID0gZnJhZy0+ZnJfYWRkcmVzczsKKyAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJPdXQgb2Ygc3RlcFxuIikpOworCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7CisJfQorCisgICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCisJeworI2lmZGVmIFRDX0NPRkZfU0laRU1BQ0hERVAKKwljYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50OgorCSAgc2l6ZSArPSBUQ19DT0ZGX1NJWkVNQUNIREVQIChmcmFnKTsKKwkgIGJyZWFrOworI2VuZGlmCisJY2FzZSByc19zcGFjZToKKwkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOworCWNhc2UgcnNfZmlsbDoKKwljYXNlIHJzX29yZzoKKwkgIHNpemUgKz0gZnJhZy0+ZnJfZml4OworCSAgc2l6ZSArPSBmcmFnLT5mcl9vZmZzZXQgKiBmcmFnLT5mcl92YXI7CisJICBicmVhazsKKwljYXNlIHJzX2FsaWduOgorCWNhc2UgcnNfYWxpZ25fY29kZToKKwkgIHsKKwkgICAgYWRkcmVzc1Qgb2ZmOworCisJICAgIHNpemUgKz0gZnJhZy0+ZnJfZml4OworCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKKwkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQorCSAgICAgIG9mZiA9IDA7CisJICAgIHNpemUgKz0gb2ZmOworCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIEJBRF9DQVNFIChmcmFnLT5mcl90eXBlKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OworICAgIH0KKyAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfc2l6ZSA9IHNpemU7CisgIHJldHVybiBzaXplOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2NvdW50X2VudHJpZXNfaW5fY2hhaW4gKGlkeCkKKyAgICAgdW5zaWduZWQgaW50IGlkeDsKK3sKKyAgdW5zaWduZWQgaW50IG5yZWxvY3M7CisgIGZpeFMgKmZpeHVwX3B0cjsKKworICAvKiBDb3VudCB0aGUgcmVsb2NhdGlvbnMgKi8KKyAgZml4dXBfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7CisgIG5yZWxvY3MgPSAwOworICB3aGlsZSAoZml4dXBfcHRyICE9IChmaXhTICopIE5VTEwpCisgICAgeworICAgICAgaWYgKGZpeHVwX3B0ci0+ZnhfZG9uZSA9PSAwICYmIFRDX0NPVU5UX1JFTE9DIChmaXh1cF9wdHIpKQorCXsKKyNpZmRlZiBUQ19BMjlLCisJICBpZiAoZml4dXBfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfQ09OU1RIKQorCSAgICBucmVsb2NzICs9IDI7CisJICBlbHNlCisJICAgIG5yZWxvY3MrKzsKKyNlbHNlCisJICBucmVsb2NzKys7CisjZW5kaWYKKwl9CisKKyAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKKyAgICB9CisgIHJldHVybiBucmVsb2NzOworfQorCisjaWZkZWYgVEVfQVVYCisKK3N0YXRpYyBpbnQgY29tcGFyZV9leHRlcm5hbF9yZWxvY3MgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKKworLyogQVVYJ3MgbGQgZXhwZWN0cyByZWxvY2F0aW9ucyB0byBiZSBzb3J0ZWQgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzICh4LCB5KQorICAgICBjb25zdCBQVFIgeDsKKyAgICAgY29uc3QgUFRSIHk7Cit7CisgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYSA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgeDsKKyAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpiID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSB5OworICBiZmRfdm1hIGFhZHIgPSBiZmRfZ2V0YjMyIChhLT5yX3ZhZGRyKTsKKyAgYmZkX3ZtYSBiYWRyID0gYmZkX2dldGIzMiAoYi0+cl92YWRkcik7CisgIHJldHVybiAoYWFkciA8IGJhZHIgPyAtMSA6IGJhZHIgPCBhYWRyID8gMSA6IDApOworfQorCisjZW5kaWYKKworLyogb3V0cHV0IGFsbCB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbiAqLwordm9pZAorZG9fcmVsb2NzX2ZvciAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIG9iamVjdF9oZWFkZXJzICogaDsKKyAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Cit7CisgIHVuc2lnbmVkIGludCBucmVsb2NzOworICB1bnNpZ25lZCBpbnQgaWR4OworICB1bnNpZ25lZCBsb25nIHJlbG9jX3N0YXJ0ID0gKmZpbGVfY3Vyc29yOworCisgIGZvciAoaWR4ID0gU0VHX0UwOyBpZHggPCBTRUdfTEFTVDsgaWR4KyspCisgICAgeworICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX25hbWVbMF0pCisJeworCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcHRyOworCSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRlcm5hbF9yZWxvY192ZWM7CisJICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKKwkgIHVuc2lnbmVkIGludCBiYXNlID0gc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcGFkZHI7CisJICBmaXhTICpmaXhfcHRyID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7CisJICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKKworCSAgaWYgKG5yZWxvY3MpCisJICAgIC8qIEJ5cGFzcyB0aGlzIHN0dWZmIGlmIG5vIHJlbG9jcy4gIFRoaXMgYWxzbyBpbmNpZGVudGFsbHkKKwkgICAgICAgYXZvaWRzIGEgU0NPIGJ1Zywgd2hlcmUgZnJlZShtYWxsb2MoMCkpIHRlbmRzIHRvIGNyYXNoLiAgKi8KKwkgICAgeworCSAgICAgIGV4dGVybmFsX3JlbG9jX3NpemUgPSBucmVsb2NzICogUkVMU1o7CisJICAgICAgZXh0ZXJuYWxfcmVsb2NfdmVjID0KKwkJKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBtYWxsb2MgKGV4dGVybmFsX3JlbG9jX3NpemUpOworCisJICAgICAgZXh0X3B0ciA9IGV4dGVybmFsX3JlbG9jX3ZlYzsKKworCSAgICAgIC8qIEZpbGwgaW4gdGhlIGludGVybmFsIGNvZmYgc3R5bGUgcmVsb2Mgc3RydWN0IGZyb20gdGhlCisJCSBpbnRlcm5hbCBmaXggbGlzdC4gICovCisJICAgICAgd2hpbGUgKGZpeF9wdHIpCisJCXsKKwkJICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50cjsKKworCQkgIC8qIE9ubHkgb3V0cHV0IHNvbWUgb2YgdGhlIHJlbG9jYXRpb25zICovCisJCSAgaWYgKGZpeF9wdHItPmZ4X2RvbmUgPT0gMCAmJiBUQ19DT1VOVF9SRUxPQyAoZml4X3B0cikpCisJCSAgICB7CisjaWZkZWYgVENfUkVMT0NfTUFOR0xFCisJCSAgICAgIFRDX1JFTE9DX01BTkdMRSAoJnNlZ21lbnRfaW5mb1tpZHhdLCBmaXhfcHRyLCAmaW50ciwKKwkJCQkgICAgICAgYmFzZSk7CisKKyNlbHNlCisJCSAgICAgIHN5bWJvbFMgKmRvdDsKKwkJICAgICAgc3ltYm9sUyAqc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OworCisJCSAgICAgIGludHIucl90eXBlID0gVENfQ09GRl9GSVgyUlRZUEUgKGZpeF9wdHIpOworCQkgICAgICBpbnRyLnJfdmFkZHIgPQorCQkJYmFzZSArIGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZTsKKworI2lmZGVmIFRDX0tFRVBfRlhfT0ZGU0VUCisJCSAgICAgIGludHIucl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7CisjZWxzZQorCQkgICAgICBpbnRyLnJfb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisJCSAgICAgIHdoaWxlIChzeW1ib2xfcHRyLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCisJCQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sX3B0cikKKwkJCQkgfHwgU19JU19DT01NT04gKHN5bWJvbF9wdHIpKSkKKwkJCXsKKwkJCSAgc3ltYm9sUyAqbjsKKworCQkJICAvKiBXZSBtdXN0IGF2b2lkIGxvb3BpbmcsIGFzIHRoYXQgY2FuIG9jY3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYSBiYWRseSB3cml0dGVuIHByb2dyYW0uICAqLworCQkJICBuID0gc3ltYm9sX3B0ci0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOworCQkJICBpZiAobiA9PSBzeW1ib2xfcHRyKQorCQkJICAgIGJyZWFrOworCQkJICBzeW1ib2xfcHRyID0gbjsKKwkJCX0KKworCQkgICAgICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLworCQkgICAgICBpZiAoc3ltYm9sX3B0cikKKwkJCXsKKwkJCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9wdHIsIDEpOworCQkJICBpZiAoISBzeW1ib2xfcHRyLT5zeV9yZXNvbHZlZCkKKwkJCSAgICB7CisJCQkgICAgICBjaGFyICpmaWxlOworCQkJICAgICAgdW5zaWduZWQgaW50IGxpbmU7CisKKwkJCSAgICAgIGlmIChleHByX3N5bWJvbF93aGVyZSAoc3ltYm9sX3B0ciwgJmZpbGUsICZsaW5lKSkKKwkJCQlhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCisJCQkJCSAgICAgIF8oInVucmVzb2x2ZWQgcmVsb2NhdGlvbiIpKTsKKwkJCSAgICAgIGVsc2UKKwkJCQlhc19iYWQgKF8oImJhZCByZWxvY2F0aW9uOiBzeW1ib2wgYCVzJyBub3QgaW4gc3ltYm9sIHRhYmxlIiksCisJCQkJCVNfR0VUX05BTUUgKHN5bWJvbF9wdHIpKTsKKwkJCSAgICB9CisJCQkgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OworCQkJICBpZiAoZG90KQorCQkJICAgIHsKKwkJCSAgICAgIGludHIucl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBpbnRyLnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOworCQkJICAgIH0KKworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGludHIucl9zeW1uZHggPSAtMTsKKwkJCX0KKyNlbmRpZgorCisJCSAgICAgICh2b2lkKSBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmludHIsIGV4dF9wdHIpOworCQkgICAgICBleHRfcHRyKys7CisKKyNpZiBkZWZpbmVkKFRDX0EyOUspCisKKwkJICAgICAgLyogVGhlIDI5ayBoYXMgYSBzcGVjaWFsIGtsdWRnZSBmb3IgdGhlIGhpZ2ggMTYgYml0CisJCQkgcmVsb2MuICBUd28gcmVsb2NhdGlvbnMgYXJlIGVtaXRlZCwgUl9JSElIQUxGLAorCQkJIGFuZCBSX0lIQ09OU1QuIFRoZSBzZWNvbmQgb25lIGRvZXNuJ3QgY29udGFpbiBhCisJCQkgc3ltYm9sLCBidXQgdXNlcyB0aGUgdmFsdWUgZm9yIG9mZnNldC4gICovCisKKwkJICAgICAgaWYgKGludHIucl90eXBlID09IFJfSUhJSEFMRikKKwkJCXsKKwkJCSAgLyogbm93IGVtaXQgdGhlIHNlY29uZCBiaXQgKi8KKwkJCSAgaW50ci5yX3R5cGUgPSBSX0lIQ09OU1Q7CisJCQkgIGludHIucl9zeW1uZHggPSBmaXhfcHRyLT5meF9hZGRudW1iZXI7CisJCQkgICh2b2lkKSBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmludHIsIGV4dF9wdHIpOworCQkJICBleHRfcHRyKys7CisJCQl9CisjZW5kaWYKKwkJICAgIH0KKworCQkgIGZpeF9wdHIgPSBmaXhfcHRyLT5meF9uZXh0OworCQl9CisKKyNpZmRlZiBURV9BVVgKKwkgICAgICAvKiBTb3J0IHRoZSByZWxvYyB0YWJsZSAqLworCSAgICAgIHFzb3J0ICgoUFRSKSBleHRlcm5hbF9yZWxvY192ZWMsIG5yZWxvY3MsCisJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpLCBjb21wYXJlX2V4dGVybmFsX3JlbG9jcyk7CisjZW5kaWYKKworCSAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2MgdGFibGUgKi8KKwkgICAgICBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jX3ZlYywgMSwgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKKwkJCSBhYmZkKTsKKwkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY192ZWMpOworCisJICAgICAgLyogRmlsbCBpbiBzZWN0aW9uIGhlYWRlciBpbmZvLiAgKi8KKwkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19yZWxwdHIgPSAqZmlsZV9jdXJzb3I7CisJICAgICAgKmZpbGVfY3Vyc29yICs9IGV4dGVybmFsX3JlbG9jX3NpemU7CisJICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfbnJlbG9jID0gbnJlbG9jczsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm8gcmVsb2NzICovCisJICAgICAgc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfcmVscHRyID0gMDsKKwkgICAgfQorCX0KKyAgICB9CisgIC8qIFNldCByZWxvY2F0aW9uX3NpemUgZmllbGQgaW4gZmlsZSBoZWFkZXJzICovCisgIEhfU0VUX1JFTE9DQVRJT05fU0laRSAoaCwgKmZpbGVfY3Vyc29yIC0gcmVsb2Nfc3RhcnQsIDApOworfQorCisKKy8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQsIGZpbGwKKyAgIGluIHRoZSBzY25oZHJzIHdpdGggdGhlIGluZm8gb24gdGhlIGZpbGUgcG9zdGlvbnMKKyovCitzdGF0aWMgdm9pZAorZmlsbF9zZWN0aW9uIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKKyAgICAgYmZkICogYWJmZDsKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmg7CisgICAgIHVuc2lnbmVkIGxvbmcgKmZpbGVfY3Vyc29yOworeworCisgIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBpbnQgcGFkZHIgPSAwOworCisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzID0gJihzZWdtZW50X2luZm9baV0uc2NuaGRyKTsKKworICAgICAgUFJPR1JFU1MgKDEpOworCisgICAgICBpZiAocy0+c19uYW1lWzBdKQorCXsKKwkgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7CisJICBjaGFyICpidWZmZXI7CisKKwkgIGlmIChzLT5zX3NpemUgPT0gMCkKKwkgICAgcy0+c19zY25wdHIgPSAwOworCSAgZWxzZQorCSAgICB7CisJICAgICAgYnVmZmVyID0geG1hbGxvYyAocy0+c19zaXplKTsKKwkgICAgICBzLT5zX3NjbnB0ciA9ICpmaWxlX2N1cnNvcjsKKwkgICAgfQorCSAga25vdyAocy0+c19wYWRkciA9PSBwYWRkcik7CisKKwkgIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi50ZXh0IikgPT0gMCkKKwkgICAgcy0+c19mbGFncyB8PSBTVFlQX1RFWFQ7CisJICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5kYXRhIikgPT0gMCkKKwkgICAgcy0+c19mbGFncyB8PSBTVFlQX0RBVEE7CisJICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5ic3MiKSA9PSAwKQorCSAgICB7CisJICAgICAgcy0+c19zY25wdHIgPSAwOworCSAgICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9CU1M7CisKKwkgICAgICAvKiBAQCBTaG91bGQgbWFrZSB0aGUgaTM4NiBhbmQgYTI5ayBjb2ZmIHRhcmdldHMgZGVmaW5lCisJCSBDT0ZGX05PTE9BRF9QUk9CTEVNLCBhbmQgaGF2ZSBvbmx5IG9uZSB0ZXN0IGhlcmUuICAqLworI2lmbmRlZiBUQ19JMzg2CisjaWZuZGVmIFRDX0EyOUsKKyNpZm5kZWYgQ09GRl9OT0xPQURfUFJPQkxFTQorCSAgICAgIC8qIEFwcGFyZW50bHkgdGhlIFNWUjMgbGlua2VyIChhbmQgZXhlYyBzeXNjYWxsKSBhbmQgVURJCisJCSBtb25kZmUgcHJvZ3JlbSBhcmUgY29uZnVzZWQgYnkgbm9sb2FkIHNlY3Rpb25zLiAgKi8KKwkgICAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfTk9MT0FEOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCSAgICB9CisJICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5saXQiKSA9PSAwKQorCSAgICBzLT5zX2ZsYWdzID0gU1RZUF9MSVQgfCBTVFlQX1RFWFQ7CisJICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5pbml0IikgPT0gMCkKKwkgICAgcy0+c19mbGFncyB8PSBTVFlQX1RFWFQ7CisJICBlbHNlIGlmIChzdHJjbXAgKHMtPnNfbmFtZSwgIi5maW5pIikgPT0gMCkKKwkgICAgcy0+c19mbGFncyB8PSBTVFlQX1RFWFQ7CisJICBlbHNlIGlmIChzdHJuY21wIChzLT5zX25hbWUsICIuY29tbWVudCIsIDgpID09IDApCisJICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9JTkZPOworCisJICB3aGlsZSAoZnJhZykKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBmaWxsX3NpemU7CisJICAgICAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQorCQl7CisJCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6CisJCSAgaWYgKGZyYWctPmZyX2ZpeCkKKwkJICAgIHsKKwkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzLAorCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKKwkJCSAgICAgICh1bnNpZ25lZCBpbnQpIGZyYWctPmZyX2ZpeCk7CisJCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7CisJCSAgICB9CisKKwkJICBicmVhazsKKwkJY2FzZSByc19zcGFjZToKKwkJICBhc3NlcnQgKGZyYWctPmZyX3N5bWJvbCA9PSAwKTsKKwkJY2FzZSByc19maWxsOgorCQljYXNlIHJzX2FsaWduOgorCQljYXNlIHJzX2FsaWduX2NvZGU6CisJCWNhc2UgcnNfb3JnOgorCQkgIGlmIChmcmFnLT5mcl9maXgpCisJCSAgICB7CisJCSAgICAgIG1lbWNweSAoYnVmZmVyICsgZnJhZy0+ZnJfYWRkcmVzcywKKwkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwsCisJCQkgICAgICAodW5zaWduZWQgaW50KSBmcmFnLT5mcl9maXgpOworCQkgICAgICBvZmZzZXQgKz0gZnJhZy0+ZnJfZml4OworCQkgICAgfQorCisJCSAgZmlsbF9zaXplID0gZnJhZy0+ZnJfdmFyOworCQkgIGlmIChmaWxsX3NpemUgJiYgZnJhZy0+ZnJfb2Zmc2V0ID4gMCkKKwkJICAgIHsKKwkJICAgICAgdW5zaWduZWQgaW50IGNvdW50OworCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmID0gZnJhZy0+ZnJfZml4OworCQkgICAgICBmb3IgKGNvdW50ID0gZnJhZy0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKKwkJCXsKKwkJCSAgaWYgKGZpbGxfc2l6ZSArIGZyYWctPmZyX2FkZHJlc3MgKyBvZmYgPD0gcy0+c19zaXplKQorCQkJICAgIHsKKwkJCSAgICAgIG1lbWNweSAoYnVmZmVyICsgZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiwKKwkJCQkgICAgICBmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LAorCQkJCSAgICAgIGZpbGxfc2l6ZSk7CisJCQkgICAgICBvZmYgKz0gZmlsbF9zaXplOworCQkJICAgICAgb2Zmc2V0ICs9IGZpbGxfc2l6ZTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgYnJlYWs7CisJCWNhc2UgcnNfYnJva2VuX3dvcmQ6CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKKwkgICAgfQorCisJICBpZiAocy0+c19zaXplICE9IDApCisJICAgIHsKKwkgICAgICBpZiAocy0+c19zY25wdHIgIT0gMCkKKwkJeworCQkgIGJmZF93cml0ZSAoYnVmZmVyLCBzLT5zX3NpemUsIDEsIGFiZmQpOworCQkgICpmaWxlX2N1cnNvciArPSBzLT5zX3NpemU7CisJCX0KKwkgICAgICBmcmVlIChidWZmZXIpOworCSAgICB9CisJICBwYWRkciArPSBzLT5zX3NpemU7CisJfQorICAgIH0KK30KKworLyogQ29mZiBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfaGVhZGVyX2FwcGVuZCAoYWJmZCwgaCkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOworeworICB1bnNpZ25lZCBpbnQgaTsKKyAgY2hhciBidWZmZXJbMTAwMF07CisgIGNoYXIgYnVmZmVyb1sxMDAwXTsKKyNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworICB1bnNpZ25lZCBsb25nIHN0cmluZ19zaXplID0gNDsKKyNlbmRpZgorCisgIGJmZF9zZWVrIChhYmZkLCAwLCAwKTsKKworI2lmbmRlZiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgorICBIX1NFVF9NQUdJQ19OVU1CRVIgKGgsIENPRkZfTUFHSUMpOworICBIX1NFVF9WRVJTSU9OX1NUQU1QIChoLCAwKTsKKyAgSF9TRVRfRU5UUllfUE9JTlQgKGgsIDApOworICBIX1NFVF9URVhUX1NUQVJUIChoLCBzZWdtZW50X2luZm9bU0VHX0UwXS5mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKKyAgSF9TRVRfREFUQV9TVEFSVCAoaCwgc2VnbWVudF9pbmZvW1NFR19FMV0uZnJjaGFpblAtPmZyY2hfcm9vdC0+ZnJfYWRkcmVzcyk7CisgIEhfU0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgsIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgJmgtPmFvdXRoZHIsCisJCQkJCQkJICAgICBidWZmZXJvKSk7CisjZWxzZSAvKiBkZWZpbmVkIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUikgKi8KKyAgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCwgMCk7CisjZW5kaWYgLyogZGVmaW5lZCAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpICovCisKKyAgaSA9IGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsICZoLT5maWxlaGRyLCBidWZmZXIpOworCisgIGJmZF93cml0ZSAoYnVmZmVyLCBpLCAxLCBhYmZkKTsKKyAgYmZkX3dyaXRlIChidWZmZXJvLCBIX0dFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoKSwgMSwgYWJmZCk7CisKKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKKyAgICB7CisgICAgICBpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0pCisJeworCSAgdW5zaWduZWQgaW50IHNpemU7CisKKyNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworCSAgLyogU3VwcG9ydCBsb25nIHNlY3Rpb24gbmFtZXMgYXMgZm91bmQgaW4gUEUuICBUaGlzIGNvZGUKKyAgICAgICAgICAgICBtdXN0IGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIHdyaXRlX29iamVjdF9maWxlIGFuZAorICAgICAgICAgICAgIHdfc3RyaW5ncy4gICovCisJICBpZiAoc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgPiBTQ05OTUxFTikKKwkgICAgeworCSAgICAgIG1lbXNldCAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUsIDAsIFNDTk5NTEVOKTsKKwkgICAgICBzcHJpbnRmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgIi8lbHUiLCBzdHJpbmdfc2l6ZSk7CisJICAgICAgc3RyaW5nX3NpemUgKz0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgKyAxOworCSAgICB9CisjZW5kaWYKKworCSAgc2l6ZSA9IGJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwKKwkJCQkJICAgJihzZWdtZW50X2luZm9baV0uc2NuaGRyKSwKKwkJCQkJICAgYnVmZmVyKTsKKwkgIGlmIChzaXplID09IDApCisJICAgIGFzX2JhZCAoXygiYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IGZhaWxlZCIpKTsKKwkgIGJmZF93cml0ZSAoYnVmZmVyLCBzaXplLCAxLCBhYmZkKTsKKwl9CisgICAgfQorfQorCisKK2NoYXIgKgorc3ltYm9sX3RvX2NoYXJzIChhYmZkLCB3aGVyZSwgc3ltYm9sUCkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgY2hhciAqd2hlcmU7CisgICAgIHN5bWJvbFMgKiBzeW1ib2xQOworeworICB1bnNpZ25lZCBpbnQgbnVtYXV4ID0gc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX251bWF1eDsKKyAgdW5zaWduZWQgaW50IGk7CisgIHZhbHVlVCB2YWw7CisKKyAgLyogVHVybiBhbnkgc3ltYm9scyB3aXRoIHJlZ2lzdGVyIGF0dHJpYnV0ZXMgaW50byBhYnMgc3ltYm9scyAqLworICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gcmVnX3NlY3Rpb24pCisgICAgeworICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYWJzb2x1dGVfc2VjdGlvbik7CisgICAgfQorICAvKiBBdCB0aGUgc2FtZSB0aW1lLCByZWxvY2F0ZSBhbGwgc3ltYm9scyB0byB0aGVpciBvdXRwdXQgdmFsdWUgKi8KKworI2lmbmRlZiBURV9QRQorICB2YWwgPSAoc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbFApXS5zY25oZHIuc19wYWRkcgorCSArIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7CisjZWxzZQorICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7CisjZW5kaWYKKworICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsKTsKKworICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fdmFsdWUgPSB2YWw7CisKKyAgd2hlcmUgKz0gYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeSwKKwkJCQkgIHdoZXJlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYXV4OyBpKyspCisgICAgeworICAgICAgd2hlcmUgKz0gYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChhYmZkLAorCQkJCSAgICAgICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFtpXSwKKwkJCQkgICAgICBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApLAorCQkJCSAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApLAorCQkJCSAgICAgIGksIG51bWF1eCwgd2hlcmUpOworICAgIH0KKyAgcmV0dXJuIHdoZXJlOworCit9CisKK3ZvaWQKK2NvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgY2hhciB1bmRlcnNjb3JlID0gMDsJCS8qIFN5bWJvbCBoYXMgbGVhZGluZyBfICovCisKKyAgLyogRWZmZWN0aXZlIHN5bWJvbCAqLworICAvKiBTdG9yZSB0aGUgcG9pbnRlciBpbiB0aGUgb2Zmc2V0LiAqLworICBTX1NFVF9aRVJPRVMgKHN5bWJvbFAsIDBMKTsKKyAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBUX05VTEwpOworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCAwKTsKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMCk7CisgIC8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KKyAgc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9mbGFncyA9IDA7CisgIC8qIEF1eGlsaWFyeSBlbnRyaWVzICovCisgIG1lbXNldCAoKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLCAwLCBBVVhFU1opOworCisgIGlmIChTX0lTX1NUUklORyAoc3ltYm9sUCkpCisgICAgU0ZfU0VUX1NUUklORyAoc3ltYm9sUCk7CisgIGlmICghdW5kZXJzY29yZSAmJiBTX0lTX0xPQ0FMIChzeW1ib2xQKSkKKyAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOworfQorCisvKgorICogSGFuZGxlIC5sbiBkaXJlY3RpdmVzLgorICovCisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9sbiAoYXBwbGluZSkKKyAgICAgaW50IGFwcGxpbmU7Cit7CisgIGludCBsOworCisgIGlmICghIGFwcGxpbmUgJiYgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5sbiBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiB3cm9uZyBjb250ZXh0ICovCisKKyAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBjX2xpbmVfbmV3ICgwLCBmcmFnX25vd19maXggKCksIGwsIGZyYWdfbm93KTsKKworICBpZiAoYXBwbGluZSkKKyAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsIC0gMSk7CisKKyNpZm5kZWYgTk9fTElTVElORworICB7CisgICAgZXh0ZXJuIGludCBsaXN0aW5nOworCisgICAgaWYgKGxpc3RpbmcpCisgICAgICB7CisJaWYgKCEgYXBwbGluZSkKKwkgIGwgKz0gbGluZV9iYXNlIC0gMTsKKwlsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBsKTsKKyAgICAgIH0KKworICB9CisjZW5kaWYKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyoKKyAqCQkJZGVmKCkKKyAqCisgKiBIYW5kbGUgLmRlZiBkaXJlY3RpdmVzLgorICoKKyAqIE9uZSBtaWdodCBhc2sgOiB3aHkgY2FuJ3Qgd2Ugc3ltYm9sX25ldyBpZiB0aGUgc3ltYm9sIGRvZXMgbm90CisgKiBhbHJlYWR5IGV4aXN0IGFuZCBmaWxsIGl0IHdpdGggZGVidWcgaW5mb3JtYXRpb24uICBCZWNhdXNlIG9mCisgKiB0aGUgQ19FRkNOIHNwZWNpYWwgc3ltYm9sLiBJdCB3b3VsZCBjbG9iYmVyIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIGZ1bmN0aW9uIHN5bWJvbCBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBub3RpY2UgdGhhdCBpdCBpcworICogYSBDX0VGQ04uIEFuZCBhIHNlY29uZCByZWFzb24gaXMgdGhhdCB0aGUgY29kZSBpcyBtb3JlIGNsZWFyIHRoaXMKKyAqIHdheS4gKGF0IGxlYXN0IEkgdGhpbmsgaXQgaXMgOi0pLgorICoKKyAqLworCisjZGVmaW5lIFNLSVBfU0VNSV9DT0xPTigpCXdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJzsnKQorI2RlZmluZSBTS0lQX1dISVRFU1BBQ0VTKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8IFwKKwkJCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9kZWYgKHdoYXQpCisgICAgIGludCB3aGF0OworeworICBjaGFyIG5hbWVfZW5kOwkJLyogQ2hhciBhZnRlciB0aGUgZW5kIG9mIG5hbWUgKi8KKyAgY2hhciAqc3ltYm9sX25hbWU7CQkvKiBOYW1lIG9mIHRoZSBkZWJ1ZyBzeW1ib2wgKi8KKyAgY2hhciAqc3ltYm9sX25hbWVfY29weTsJLyogVGVtcG9yYXJ5IGNvcHkgb2YgdGhlIG5hbWUgKi8KKyAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2xlbmd0aDsKKworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCisKKyAgU0tJUF9XSElURVNQQUNFUyAoKTsKKworICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gKHN5bWJvbFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKCpkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7CisgIG1lbXNldCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCwgc2l6ZW9mICgqZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOworCisgIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworICBzeW1ib2xfbmFtZV9sZW5ndGggPSBzdHJsZW4gKHN5bWJvbF9uYW1lKTsKKyAgc3ltYm9sX25hbWVfY29weSA9IHhtYWxsb2MgKHN5bWJvbF9uYW1lX2xlbmd0aCArIDEpOworICBzdHJjcHkgKHN5bWJvbF9uYW1lX2NvcHksIHN5bWJvbF9uYW1lKTsKKyNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKKyAgc3ltYm9sX25hbWVfY29weSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWVfY29weSk7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBuZXcgc3ltYm9sICovCisjaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQorICBTX1NFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAoKnN5bWJvbF9uYW1lX2NvcHkgPT0gJ18nCisJCQkJICAgICAgID8gc3ltYm9sX25hbWVfY29weSArIDEKKwkJCQkgICAgICAgOiBzeW1ib2xfbmFtZV9jb3B5KSk7CisjZWxzZSAvKiBTVFJJUF9VTkRFUlNDT1JFICovCisgIFNfU0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9uYW1lX2NvcHkpOworI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KKyAgLyogZnJlZShzeW1ib2xfbmFtZV9jb3B5KTsgKi8KKyAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfbmFtZV9vZmZzZXQgPSAodW5zaWduZWQgbG9uZykgfjA7CisgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X251bWJlciA9IH4wOworICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCk7CisKKyAgaWYgKFNfSVNfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKKyAgICBTRl9TRVRfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwordW5zaWduZWQgaW50IGRpbV9pbmRleDsKKworCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfZW5kZWYgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUCA9IDA7CisgIC8qIERJTSBCVUcgRklYIHNhY0BjeWdudXMuY29tICovCisgIGRpbV9pbmRleCA9IDA7CisgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLmVuZGVmIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KKworICAvKiBTZXQgdGhlIHNlY3Rpb24gbnVtYmVyIGFjY29yZGluZyB0byBzdG9yYWdlIGNsYXNzLiAqLworICBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgIHsKKyAgICBjYXNlIENfU1RSVEFHOgorICAgIGNhc2UgQ19FTlRBRzoKKyAgICBjYXNlIENfVU5UQUc6CisgICAgICBTRl9TRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKKyAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBDX0ZJTEU6CisgICAgY2FzZSBDX1RQREVGOgorICAgICAgU0ZfU0VUX0RFQlVHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKKyAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIFNFR19ERUJVRyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ19FRkNOOgorICAgICAgU0ZfU0VUX0xPQ0FMIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogRG8gbm90IGVtaXQgdGhpcyBzeW1ib2wuICovCisgICAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgQ19CTE9DSzoKKyAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsJLyogV2lsbCBuZWVkIHByb2Nlc3NpbmcgYmVmb3JlIHdyaXRpbmcgKi8KKyAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBDX0ZDTjoKKyAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIFNFR19FMCk7CisKKyAgICAgIGlmIChzdHJjbXAgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCAiLmJmIikgPT0gMCkKKwl7CQkJLyogLmJmICovCisJICBpZiAoZnVuY3Rpb25fbGluZW9mZiA8IDApCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImAuYmYnIHN5bWJvbCB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIikpOworCSAgICB9CQkJLyogbWlzc2luZyBmdW5jdGlvbiBzeW1ib2wgKi8KKwkgIFNBX0dFVF9TWU1fTE5OT1BUUiAobGFzdF9saW5lX3N5bWJvbCkgPSBmdW5jdGlvbl9saW5lb2ZmOworCisJICBTRl9TRVRfUFJPQ0VTUyAobGFzdF9saW5lX3N5bWJvbCk7CisJICBTRl9TRVRfQURKX0xOTk9QVFIgKGxhc3RfbGluZV9zeW1ib2wpOworCSAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworCSAgZnVuY3Rpb25fbGluZW9mZiA9IC0xOworCX0KKyAgICAgIC8qIFZhbHVlIGlzIGFsd2F5cyBzZXQgdG8gLiAqLworICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OworICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisgICAgICBicmVhazsKKworI2lmZGVmIENfQVVUT0FSRworICAgIGNhc2UgQ19BVVRPQVJHOgorI2VuZGlmIC8qIENfQVVUT0FSRyAqLworICAgIGNhc2UgQ19BVVRPOgorICAgIGNhc2UgQ19SRUc6CisgICAgY2FzZSBDX01PUzoKKyAgICBjYXNlIENfTU9FOgorICAgIGNhc2UgQ19NT1U6CisgICAgY2FzZSBDX0FSRzoKKyAgICBjYXNlIENfUkVHUEFSTToKKyAgICBjYXNlIENfRklFTEQ6CisgICAgY2FzZSBDX0VPUzoKKyAgICAgIFNGX1NFVF9ERUJVRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDX0VYVDoKKyAgICBjYXNlIENfV0VBS0VYVDoKKyNpZmRlZiBURV9QRQorICAgIGNhc2UgQ19OVF9XRUFLOgorI2VuZGlmCisgICAgY2FzZSBDX1NUQVQ6CisgICAgY2FzZSBDX0xBQkVMOgorICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDX1VTVEFUSUM6CisgICAgY2FzZSBDX0VYVERFRjoKKyAgICBjYXNlIENfVUxBQkVMOgorICAgICAgYXNfd2FybiAoXygidW5leHBlY3RlZCBzdG9yYWdlIGNsYXNzICVkIiksIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKKyAgICAgIGJyZWFrOworICAgIH0JCQkJLyogc3dpdGNoIG9uIHN0b3JhZ2UgY2xhc3MgKi8KKworICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGJ1aWx0IGEgZGVidWcgc3ltYm9sLCB0cnkgdG8gZmluZCBpZiB3ZSBzaG91bGQKKyAgICAgbWVyZ2Ugd2l0aCBhbiBleGlzdGluZyBzeW1ib2wgb3Igbm90LiAgSWYgYSBzeW1ib2wgaXMgQ19FRkNOIG9yCisgICAgIGFic29sdXRlX3NlY3Rpb24gb3IgdW50YWdnZWQgU0VHX0RFQlVHIGl0IG5ldmVyIG1lcmdlcy4gIFdlIGFsc28KKyAgICAgZG9uJ3QgbWVyZ2UgbGFiZWxzLCB3aGljaCBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlLCBub3IKKyAgICAgc3ltYm9scyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIHNpbmNlIHRoZXkgYXJlIHR5cGljYWxseQorICAgICB1bmlxdWUsIG5vciBkbyB3ZSBtZXJnZSB0YWdzIHdpdGggbm9uLXRhZ3MuICAqLworCisgIC8qIFR3byBjYXNlcyBmb3IgZnVuY3Rpb25zLiAgRWl0aGVyIGRlYnVnIGZvbGxvd2VkIGJ5IGRlZmluaXRpb24gb3IKKyAgICAgZGVmaW5pdGlvbiBmb2xsb3dlZCBieSBkZWJ1Zy4gIEZvciBkZWZpbml0aW9uIGZpcnN0LCB3ZSB3aWxsCisgICAgIG1lcmdlIHRoZSBkZWJ1ZyBzeW1ib2wgaW50byB0aGUgZGVmaW5pdGlvbi4gIEZvciBkZWJ1ZyBmaXJzdCwgdGhlCisgICAgIGxpbmVubyBlbnRyeSBNVVNUIHBvaW50IHRvIHRoZSBkZWZpbml0aW9uIGZ1bmN0aW9uIG9yIGVsc2UgaXQKKyAgICAgd2lsbCBwb2ludCBvZmYgaW50byBzcGFjZSB3aGVuIGNyYXdsX3N5bWJvbHMoKSBtZXJnZXMgdGhlIGRlYnVnCisgICAgIHN5bWJvbCBpbnRvIHRoZSByZWFsIHN5bWJvbC4gIFRoZXJlZm9yLCBsZXQncyBwcmVzdW1lIHRoZSBkZWJ1ZworICAgICBzeW1ib2wgaXMgYSByZWFsIGZ1bmN0aW9uIHJlZmVyZW5jZS4gKi8KKworICAvKiBGSVhNRS1TT09OIElmIGZvciBzb21lIHJlYXNvbiB0aGUgZGVmaW5pdGlvbiBsYWJlbC9zeW1ib2wgaXMKKyAgICAgbmV2ZXIgc2VlbiwgdGhpcyB3aWxsIHByb2JhYmx5IGxlYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgYXQgbGluaworICAgICB0aW1lLiAqLworCisgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBDX0VGQ04KKyAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfTEFCRUwKKyAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSBTRUdfREVCVUcKKwkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKKyAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KKyAgICAgIHx8IGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudAorICAgICAgfHwgKHN5bWJvbFAgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgRE9fTk9UX1NUUklQKSkgPT0gTlVMTAorICAgICAgfHwgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IFNGX0dFVF9UQUcgKHN5bWJvbFApKSkKKyAgICB7CisgICAgICBzeW1ib2xfYXBwZW5kIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsCisJCSAgICAgJnN5bWJvbF9sYXN0UCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhpcyBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIG1lcmdlIHRoZSBuZXdseSBjcmVhdGVkIHN5bWJvbAorCSBpbnRvIHRoZSBvbGQgb25lLiAgVGhpcyBpcyBub3QgbWFuZGF0b3J5LiBUaGUgbGlua2VyIGNhbgorCSBoYW5kbGUgZHVwbGljYXRlIHN5bWJvbHMgY29ycmVjdGx5LiBCdXQgSSBndWVzcyB0aGF0IGl0IHNhdmUKKwkgYSAqbG90KiBvZiBzcGFjZSBpZiB0aGUgYXNzZW1ibHkgZmlsZSBkZWZpbmVzIGEgbG90IG9mCisJIHN5bWJvbHMuIFtsb2ljXSAqLworCisgICAgICAvKiBUaGUgZGVidWcgZW50cnkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIGlzIG1lcmdlZCBpbnRvIHRoZQorCSBwcmV2aW91cyBkZWZpbml0aW9uLiAgKi8KKworICAgICAgY19zeW1ib2xfbWVyZ2UgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbFApOworICAgICAgLyogRklYTUUtU09PTiBTaG91bGQgKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgYmUgZnJlZSdkPyB4b3hvcmljaC4gKi8KKyAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xQOworCisgICAgICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQorCSAgfHwgU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKKwkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfU1RBVCkKKwl7CisJICAvKiBGb3IgZnVuY3Rpb25zLCBhbmQgdGFncywgYW5kIHN0YXRpYyBzeW1ib2xzLCB0aGUgc3ltYm9sCisJICAgICAqbXVzdCogYmUgd2hlcmUgdGhlIGRlYnVnIHN5bWJvbCBhcHBlYXJzLiAgTW92ZSB0aGUKKwkgICAgIGV4aXN0aW5nIHN5bWJvbCB0byB0aGUgY3VycmVudCBwbGFjZS4gKi8KKwkgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KKwkgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKKwkgICAgeworCSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsCisJCQkgICAgICZzeW1ib2xfbGFzdFApOworCSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwKKwkJCSAgICAgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisJICAgIH0JCQkvKiBpZiBub3QgYWxyZWFkeSBpbiBwbGFjZSAqLworCX0JCQkvKiBpZiBmdW5jdGlvbiAqLworICAgIH0JCQkJLyogbm9ybWFsIG9yIG1lcmdhYmxlICovCisKKyAgaWYgKFNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKm9sZHRhZzsKKworICAgICAgb2xkdGFnID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCisJCQkJIERPX05PVF9TVFJJUCk7CisgICAgICBpZiAob2xkdGFnID09IE5VTEwgfHwgISBTRl9HRVRfVEFHIChvbGR0YWcpKQorCXRhZ19pbnNlcnQgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAorCQkgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgfQorCisgIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQorICAgIHsKKyAgICAgIGtub3cgKHNpemVvZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPD0gc2l6ZW9mIChsb25nKSk7CisgICAgICBmdW5jdGlvbl9saW5lb2ZmCisJPSBjX2xpbmVfbmV3IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOworCisgICAgICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisKKyAgICAgIGlmIChzeW1ib2xQID09IE5VTEwpCisJeworCSAgLyogVGhhdCBpcywgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZQorCSAgICAgZnVuY3Rpb24uLi4gKi8KKwkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworCX0JCQkvKiBkZWZpbml0aW9uIGZvbGxvd3MgZGVidWcgKi8KKyAgICB9CQkJCS8qIENyZWF0ZSB0aGUgbGluZSBudW1iZXIgZW50cnkgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQgKi8KKworICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gTlVMTDsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX2RpbSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpbnQgZGltX2luZGV4OworCisgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCisKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7CisKKyAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQorICAgIHsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7CisgICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCisJCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisKKyAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKKwl7CisJY2FzZSAnLCc6CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOworCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKwljYXNlICdcbic6CisJY2FzZSAnOyc6CisJICBkaW1faW5kZXggPSBESU1OVU07CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9saW5lIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGludCB0aGlzX2Jhc2U7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBvYmpfY29mZl9sbiAoMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG5hbWUgPSBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKKyAgdGhpc19iYXNlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisKKyAgLyogT25seSAuYmYgc3ltYm9scyBpbmRpY2F0ZSB0aGUgdXNlIG9mIGEgbmV3IGJhc2UgbGluZSBudW1iZXI7IHRoZQorICAgICBsaW5lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIC5lZiwgLmJiLCAuZWIgYXJlIHJlbGF0aXZlIHRvIHRoZQorICAgICBzdGFydCBvZiB0aGUgY29udGFpbmluZyBmdW5jdGlvbi4gICovCisgIGlmICghc3RyY21wICgiLmJmIiwgbmFtZSkpCisgICAgeworI2lmIDAgLyogWFhYIENhbiB3ZSBldmVyIGhhdmUgbGluZSBudW1iZXJzIGdvaW5nIGJhY2t3YXJkcz8gICovCisgICAgICBpZiAodGhpc19iYXNlID4gbGluZV9iYXNlKQorI2VuZGlmCisJeworCSAgbGluZV9iYXNlID0gdGhpc19iYXNlOworCX0KKworI2lmbmRlZiBOT19MSVNUSU5HCisgICAgICB7CisJZXh0ZXJuIGludCBsaXN0aW5nOworCWlmIChsaXN0aW5nKQorCSAgeworCSAgICBsaXN0aW5nX3NvdXJjZV9saW5lICgodW5zaWduZWQgaW50KSBsaW5lX2Jhc2UpOworCSAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorCisgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOworICBTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHRoaXNfYmFzZSk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX3NpemUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KKworICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKKyAgU0FfU0VUX1NZTV9TSVpFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9zY2wgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLworCisgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX3RhZyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpzeW1ib2xfbmFtZTsKKyAgY2hhciBuYW1lX2VuZDsKKworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOworICBzeW1ib2xfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKKyAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKKyNlbmRpZgorCisgIC8qIEFzc3VtZSB0aGF0IHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgLnRhZyBpcyBhbHdheXMgZGVmaW5lZC4KKyAgICAgVGhpcyB3YXMgYSBiYWQgYXNzdW1wdGlvbi4gIEkndmUgYWRkZWQgZmluZF9vcl9tYWtlLiB4b3hvcmljaC4gKi8KKyAgU0FfU0VUX1NZTV9UQUdORFggKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsCisJCSAgICAgKGxvbmcpIHRhZ19maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKSk7CisgIGlmIChTQV9HRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gMEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIpLCBzeW1ib2xfbmFtZSk7CisgICAgfQkJCQkvKiBub3QgZGVmaW5lZCAqLworCisgIFNGX1NFVF9UQUdHRUQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX3R5cGUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KKworICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKworICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCisgICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQorICAgIHsKKyAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisgICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX3ZhbCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCisKKyAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQorICAgIHsKKyAgICAgIGNoYXIgKnN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgY2hhciBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisjaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCisgIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7CisjZW5kaWYKKworICAgICAgaWYgKCFzdHJjbXAgKHN5bWJvbF9uYW1lLCAiLiIpKQorCXsKKwkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKwkgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOworCSAgLyogSWYgdGhlIC52YWwgaXMgIT0gZnJvbSB0aGUgLmRlZiAoZS5nLiBzdGF0aWNzKSAqLworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIHN5bWJvbF9uYW1lKSkKKwl7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPQorCSAgICBzeW1ib2xfZmluZF9vcl9tYWtlIChzeW1ib2xfbmFtZSk7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX29wX3N5bWJvbCA9IE5VTEw7CisJICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAwOworCisJICAvKiBJZiB0aGUgc2VnbWVudCBpcyB1bmRlZmluZWQgd2hlbiB0aGUgZm9yd2FyZCByZWZlcmVuY2UgaXMKKwkgICAgIHJlc29sdmVkLCB0aGVuIGNvcHkgdGhlIHNlZ21lbnQgaWQgZnJvbSB0aGUgZm9yd2FyZAorCSAgICAgc3ltYm9sLiAgKi8KKwkgIFNGX1NFVF9HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7CisKKwkgIC8qIEZJWE1FOiBnY2MgY2FuIGdlbmVyYXRlIGFkZHJlc3MgZXhwcmVzc2lvbnMKKwkgICAgIGhlcmUgaW4gdW51c3VhbCBjYXNlcyAoc2VhcmNoIGZvciAib2JzY3VyZSIKKwkgICAgIGluIHNkYm91dC5jKS4gIFdlIGp1c3QgaWdub3JlIHRoZSBvZmZzZXQKKwkgICAgIGhlcmUsIHRodXMgZ2VuZXJhdGluZyBpbmNvcnJlY3QgZGVidWdnaW5nCisJICAgICBpbmZvcm1hdGlvbi4gIFdlIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUKKwkgICAgIGxpbmUganVzdCBiZWxvdy4gICovCisJfQorICAgICAgLyogT3RoZXJ3aXNlLCBpdCBpcyB0aGUgbmFtZSBvZiBhIG5vbiBkZWJ1ZyBzeW1ib2wgYW5kCisJIGl0cyB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgbGF0ZXIuICovCisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisKKyAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIHRvIGF2b2lkIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlCisJIEZJWE1FIGNhc2UgbWVudGlvbmVkIGp1c3QgYWJvdmUuICAqLworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAorCQkgICAodmFsdWVUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgICAgfQkJCQkvKiBpZiBzeW1ib2wgYmFzZWQgKi8KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisjaWZkZWYgVEVfUEUKKworLyogSGFuZGxlIHRoZSAubGlua29uY2UgcHNldWRvLW9wLiAgVGhpcyBpcyBwYXJzZWQgYnkgc19saW5rb25jZSBpbgorICAgcmVhZC5jLCB3aGljaCB0aGVuIGNhbGxzIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmljIHJvdXRpbmUuICAqLworCit2b2lkCitvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlICh0eXBlKQorICAgICBlbnVtIGxpbmtvbmNlX3R5cGUgdHlwZTsKK3sKKyAgc2VnX2luZm8gKG5vd19zZWcpLT5zY25oZHIuc19mbGFncyB8PSBJTUFHRV9TQ05fTE5LX0NPTURBVDsKKworICAvKiBXZSBzdG9yZSB0aGUgdHlwZSBpbiB0aGUgc2VnX2luZm8gc3RydWN0dXJlLCBhbmQgdXNlIGl0IHRvIHNldCB1cAorICAgICB0aGUgYXV4aWxpYXJ5IGVudHJ5IGZvciB0aGUgc2VjdGlvbiBzeW1ib2wgaW4gY19zZWN0aW9uX3N5bWJvbC4gICovCisgIHNlZ19pbmZvIChub3dfc2VnKS0+bGlua29uY2UgPSB0eXBlOworfQorCisjZW5kaWYgLyogVEVfUEUgKi8KKwordm9pZAorY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rICgpCit7CisgIC8qIFRoZXNlIGhhZCBiZXR0ZXIgYmUgdGhlIHNhbWUuICBVc3VhbGx5IDE4IGJ5dGVzLiAqLworI2lmbmRlZiBCRkRfSEVBREVSUworICBrbm93IChzaXplb2YgKFNZTUVOVCkgPT0gc2l6ZW9mIChBVVhFTlQpKTsKKyAga25vdyAoU1lNRVNaID09IEFVWEVTWik7CisjZW5kaWYKKyAgdGFnX2luaXQgKCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYW5kIHB1dHMgYWxsIHRoZQorICAgZXh0ZXJuYWxzIG9udG8gYW5vdGhlciBjaGFpbiAqLworCisvKiBUaGUgY2hhaW4gb2YgZ2xvYmFscy4gICovCitzeW1ib2xTICpzeW1ib2xfZ2xvYmFsUDsKK3N5bWJvbFMgKnN5bWJvbF9nbG9iYWxfbGFzdFA7CisKKy8qIFRoZSBjaGFpbiBvZiBleHRlcm5hbHMgKi8KK3N5bWJvbFMgKnN5bWJvbF9leHRlcm5QOworc3ltYm9sUyAqc3ltYm9sX2V4dGVybl9sYXN0UDsKKworc3RhY2sgKmJsb2NrX3N0YWNrOworc3ltYm9sUyAqbGFzdF9mdW5jdGlvblA7CitzdGF0aWMgc3ltYm9sUyAqbGFzdF9iZlA7CitzeW1ib2xTICpsYXN0X3RhZ1A7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3lhbmtfc3ltYm9scyAoKQoreworICBzeW1ib2xTICpzeW1ib2xQOworICB1bnNpZ25lZCBpbnQgc3ltYm9sX251bWJlciA9IDA7CisgIHVuc2lnbmVkIGludCBsYXN0X2ZpbGVfc3ltbm8gPSAwOworCisgIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X3NjYW4gPSBmaWxlbmFtZV9saXN0X2hlYWQ7CisKKyAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOworICAgICAgIHN5bWJvbFA7CisgICAgICAgc3ltYm9sUCA9IHN5bWJvbFAgPyBzeW1ib2xfbmV4dCAoc3ltYm9sUCkgOiBzeW1ib2xfcm9vdFApCisgICAgeworICAgICAgaWYgKHN5bWJvbFAtPnN5X21yaV9jb21tb24pCisJeworCSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUCisjaWZkZWYgVEVfUEUKKwkgICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05UX1dFQUsKKyNlbmRpZgorCSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfV0VBS0VYVCkKKwkgICAgYXNfYmFkIChfKCIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiKSwKKwkJICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKKwkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoIVNGX0dFVF9ERUJVRyAoc3ltYm9sUCkpCisJeworCSAgLyogRGVidWcgc3ltYm9scyBkbyBub3QgbmVlZCBhbGwgdGhpcyBydWJiaXNoICovCisJICBzeW1ib2xTICpyZWFsX3N5bWJvbFA7CisKKwkgIC8qIEwqIGFuZCBDX0VGQ04gc3ltYm9scyBuZXZlciBtZXJnZS4gKi8KKwkgIGlmICghU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKQorCSAgICAgICYmICFTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKKwkgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSAhPSBDX0xBQkVMCisJICAgICAgJiYgc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50CisJICAgICAgJiYgKHJlYWxfc3ltYm9sUCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKHN5bWJvbFApLCBET19OT1RfU1RSSVApKQorCSAgICAgICYmIHJlYWxfc3ltYm9sUCAhPSBzeW1ib2xQKQorCSAgICB7CisJICAgICAgLyogRklYTUUtU09PTjogd2hlcmUgZG8gZHVwcyBjb21lIGZyb20/CisJCSBNYXliZSB0YWcgcmVmZXJlbmNlcyBiZWZvcmUgZGVmaW5pdGlvbnM/IHhveG9yaWNoLiAqLworCSAgICAgIC8qIE1vdmUgdGhlIGRlYnVnIGRhdGEgZnJvbSB0aGUgZGVidWcgc3ltYm9sIHRvIHRoZQorCQkgcmVhbCBzeW1ib2wuIERvIE5PVCBkbyB0aGUgb3Bvc2l0ZSAoaS5lLiBtb3ZlIGZyb20KKwkJIHJlYWwgc3ltYm9sIHRvIGRlYnVnIHN5bWJvbCBhbmQgcmVtb3ZlIHJlYWwgc3ltYm9sIGZyb20gdGhlCisJCSBsaXN0LikgQmVjYXVzZSBzb21lIHBvaW50ZXJzIHJlZmVyIHRvIHRoZSByZWFsIHN5bWJvbAorCQkgd2hlcmVhcyBubyBwb2ludGVycyByZWZlciB0byB0aGUgZGVidWcgc3ltYm9sLiAqLworCSAgICAgIGNfc3ltYm9sX21lcmdlIChzeW1ib2xQLCByZWFsX3N5bWJvbFApOworCSAgICAgIC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgc3ltYm9sIGJ5IHRoZSByZWFsIG9uZSAqLworCSAgICAgIC8qIFRoZSBzeW1ib2xzIHdpbGwgbmV2ZXIgYmUgdGhlIGxhc3Qgb3IgdGhlIGZpcnN0CisJCSBiZWNhdXNlIDogMXN0IHN5bWJvbCBpcyAuZmlsZSBhbmQgMyBsYXN0IHN5bWJvbHMgYXJlCisJCSAudGV4dCwgLmRhdGEsIC5ic3MgKi8KKwkgICAgICBzeW1ib2xfcmVtb3ZlIChyZWFsX3N5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworCSAgICAgIHN5bWJvbF9pbnNlcnQgKHJlYWxfc3ltYm9sUCwgc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisJICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisJICAgICAgc3ltYm9sUCA9IHJlYWxfc3ltYm9sUDsKKwkgICAgfQkJCS8qIGlmIG5vdCBsb2NhbCBidXQgZHVwJ2QgKi8KKworCSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfRTEpKQorCSAgICB7CisJICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX0UwKTsKKwkgICAgfQkJCS8qIHB1c2ggZGF0YSBpbnRvIHRleHQgKi8KKworCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOworCisJICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19OVUxMKQorCSAgICB7CisJICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICFTRl9HRVRfTE9DQUwgKHN5bWJvbFApKQorCQl7CisJCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOworCQl9CisJICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0UwKQorCQl7CisJCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19MQUJFTCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOworCQl9CisJICAgIH0KKworCSAgLyogTWFpbmx5IHRvIHNwZWVkIHVwIGlmIG5vdCAtZyAqLworCSAgaWYgKFNGX0dFVF9QUk9DRVNTIChzeW1ib2xQKSkKKwkgICAgeworCSAgICAgIC8qIEhhbmRsZSB0aGUgbmVzdGVkIGJsb2NrcyBhdXhpbGlhcnkgaW5mby4gKi8KKwkgICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19CTE9DSykKKwkJeworCQkgIGlmICghc3RyY21wIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgIi5iYiIpKQorCQkgICAgc3RhY2tfcHVzaCAoYmxvY2tfc3RhY2ssIChjaGFyICopICZzeW1ib2xQKTsKKwkJICBlbHNlCisJCSAgICB7CQkvKiAuZWIgKi8KKwkJICAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqYmVnaW5fc3ltYm9sUDsKKwkJICAgICAgYmVnaW5fc3ltYm9sUCA9ICooc3ltYm9sUyAqKikgc3RhY2tfcG9wIChibG9ja19zdGFjayk7CisJCSAgICAgIGlmIChiZWdpbl9zeW1ib2xQID09IChzeW1ib2xTICopIDApCisJCQlhc193YXJuIChfKCJtaXNtYXRjaGVkIC5lYiIpKTsKKwkJICAgICAgZWxzZQorCQkJU0FfU0VUX1NZTV9FTkRORFggKGJlZ2luX3N5bWJvbFAsIHN5bWJvbF9udW1iZXIgKyAyKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIC8qIElmIHdlIGFyZSBhYmxlIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24sIGFuZCB3ZQorCSAgICAgICBhcmUgb3V0IG9mIGEgZnVuY3Rpb24gKGxhc3RfZnVuY3Rpb25QID09IDApIHRoZW4sIHRoZQorCSAgICAgICBmdW5jdGlvbiBzeW1ib2wgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggYW4gYXV4aWxpYXJ5CisJICAgICAgIGVudHJ5LiAqLworCSAgICAgIGlmIChsYXN0X2Z1bmN0aW9uUCA9PSAoc3ltYm9sUyAqKSAwICYmCisJCSAgU0ZfR0VUX0ZVTkNUSU9OIChzeW1ib2xQKSkKKwkJeworCQkgIGxhc3RfZnVuY3Rpb25QID0gc3ltYm9sUDsKKworCQkgIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQKSA8IDEpCisJCSAgICB7CisJCSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOworCQkgICAgfQkJLyogbWFrZSBpdCBhdCBsZWFzdCAxICovCisKKwkJICAvKiBDbG9iYmVyIHBvc3NpYmxlIHN0YWxlIC5kaW0gaW5mb3JtYXRpb24uICovCisjaWYgMAorCQkgIC8qIElmZmVkIG91dCBieSBzdGV2ZSAtIHRoaXMgZnJpZXMgdGhlIGxubm9wdHIgaW5mbyB0b28gKi8KKwkJICBiemVybyAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0ueF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbiwKKwkJCSBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4pKTsKKyNlbmRpZgorCQl9CisJICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRkNOKQorCQl7CisJCSAgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltYm9sUCksICIuYmYiKSA9PSAwKQorCQkgICAgeworCQkgICAgICBpZiAobGFzdF9iZlAgIT0gTlVMTCkKKwkJCVNBX1NFVF9TWU1fRU5ETkRYIChsYXN0X2JmUCwgc3ltYm9sX251bWJlcik7CisJCSAgICAgIGxhc3RfYmZQID0gc3ltYm9sUDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRUZDTikKKwkJeworCQkgIC8qIEkgZG9uJ3QgZXZlbiBrbm93IGlmIHRoaXMgaXMgbmVlZGVkIGZvciBzZGIuIEJ1dAorCQkgICAgIHRoZSBzdGFuZGFyZCBhc3NlbWJsZXIgZ2VuZXJhdGVzIGl0LCBzby4uLiAgKi8KKwkJICBpZiAobGFzdF9mdW5jdGlvblAgPT0gKHN5bWJvbFMgKikgMCkKKwkJICAgIGFzX2ZhdGFsIChfKCJDX0VGQ04gc3ltYm9sIG91dCBvZiBzY29wZSIpKTsKKwkJICBTQV9TRVRfU1lNX0ZTSVpFIChsYXN0X2Z1bmN0aW9uUCwKKwkJCQkgICAgKGxvbmcpIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgLQorCQkJCQkgICAgU19HRVRfVkFMVUUgKGxhc3RfZnVuY3Rpb25QKSkpOworCQkgIFNBX1NFVF9TWU1fRU5ETkRYIChsYXN0X2Z1bmN0aW9uUCwgc3ltYm9sX251bWJlcik7CisJCSBsYXN0X2Z1bmN0aW9uUCA9IChzeW1ib2xTICopIDA7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKFNGX0dFVF9UQUcgKHN5bWJvbFApKQorCXsKKwkgIC8qIEZpcnN0IGRlc2NyaXB0b3Igb2YgYSBzdHJ1Y3R1cmUgbXVzdCBwb2ludCB0bworCSAgICAgICB0aGUgZmlyc3Qgc2xvdCBhZnRlciB0aGUgc3RydWN0dXJlIGRlc2NyaXB0aW9uLiAqLworCSAgbGFzdF90YWdQID0gc3ltYm9sUDsKKworCX0KKyAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRU9TKQorCXsKKwkgIC8qICsyIHRha2UgaW4gYWNjb3VudCB0aGUgY3VycmVudCBzeW1ib2wgKi8KKwkgIFNBX1NFVF9TWU1fRU5ETkRYIChsYXN0X3RhZ1AsIHN5bWJvbF9udW1iZXIgKyAyKTsKKwl9CisgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0ZJTEUpCisJeworCSAgLyogSWYgdGhlIGZpbGVuYW1lIHdhcyB0b28gbG9uZyB0byBmaXQgaW4gdGhlCisJICAgICBhdXhlbnQsIHB1dCBpdCBpbiB0aGUgc3RyaW5nIHRhYmxlICovCisJICBpZiAoU0FfR0VUX0ZJTEVfRk5BTUVfWkVST1MgKHN5bWJvbFApID09IDAKKwkgICAgICAmJiBTQV9HRVRfRklMRV9GTkFNRV9PRkZTRVQgKHN5bWJvbFApICE9IDApCisJICAgIHsKKwkgICAgICBTQV9TRVRfRklMRV9GTkFNRV9PRkZTRVQgKHN5bWJvbFAsIHN0cmluZ19ieXRlX2NvdW50KTsKKwkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUpICsgMTsKKwkgICAgICBmaWxlbmFtZV9saXN0X3NjYW4gPSBmaWxlbmFtZV9saXN0X3NjYW4tPm5leHQ7CisJICAgIH0KKwkgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkpCisJICAgIHsKKwkgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgbGFzdF9maWxlX3N5bW5vKTsKKwkgICAgICBsYXN0X2ZpbGVfc3ltbm8gPSBzeW1ib2xfbnVtYmVyOworCSAgICB9CQkJLyogbm8gb25lIHBvaW50cyBhdCB0aGUgZmlyc3QgLmZpbGUgc3ltYm9sICovCisJfQkJCS8qIGlmIGRlYnVnIG9yIHRhZyBvciBlb3Mgb3IgZmlsZSAqLworCisjaWZkZWYgdGNfZnJvYl9jb2ZmX3N5bWJvbAorICAgICAgdGNfZnJvYl9jb2ZmX3N5bWJvbCAoc3ltYm9sUCk7CisjZW5kaWYKKworICAgICAgLyogV2UgbXVzdCBwdXQgdGhlIGV4dGVybmFsIHN5bWJvbHMgYXBhcnQuIFRoZSBsb2FkZXIKKwkgZG9lcyBub3QgYm9tYiBpZiB3ZSBkbyBub3QuIEJ1dCB0aGUgcmVmZXJlbmNlcyBpbgorCSB0aGUgZW5kbmR4IGZpZWxkIGZvciBhIC5iYiBzeW1ib2wgYXJlIG5vdCBjb3JyZWN0ZWQKKwkgaWYgYW4gZXh0ZXJuYWwgc3ltYm9sIGlzIHJlbW92ZWQgYmV0d2VlbiAuYmIgYW5kIC5iZS4KKwkgSS5lIGluIHRoZSBmb2xsb3dpbmcgY2FzZSA6CisJIFsyMF0gLmJiIGVuZG5keCA9IDIyCisJIFsyMV0gZm9vIGV4dGVybmFsCisJIFsyMl0gLmJlCisJIGxkIHdpbGwgbW92ZSB0aGUgc3ltYm9sIDIxIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYnV0CisJIGVuZG5keCB3aWxsIHN0aWxsIGJlIDIyIGluc3RlYWQgb2YgMjEuICovCisKKworICAgICAgaWYgKFNGX0dFVF9MT0NBTCAoc3ltYm9sUCkpCisJeworCSAgLyogcmVtb3ZlIENfRUZDTiBhbmQgTE9DQUwgKEwuLi4pIHN5bWJvbHMgKi8KKwkgIC8qIG5leHQgcG9pbnRlciByZW1haW5zIHZhbGlkICovCisJICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKworCX0KKyAgICAgIGVsc2UgaWYgKHN5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKKwkgICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQorCXsKKwkgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgorCSAgICAgc3ltYm9scy4gICovCisJICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKwl9CisgICAgICBlbHNlIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKQorCSAgICAgICAmJiAhU19JU19ERUJVRyAoc3ltYm9sUCkKKwkgICAgICAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQorCSAgICAgICAmJiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQKKyNpZmRlZiBURV9QRQorCQkgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05UX1dFQUsKKyNlbmRpZgorCQkgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX1dFQUtFWFQpKQorCXsKKwkgIC8qIGlmIGV4dGVybmFsLCBSZW1vdmUgZnJvbSB0aGUgbGlzdCAqLworCSAgc3ltYm9sUyAqaG9sZCA9IHN5bWJvbF9wcmV2aW91cyAoc3ltYm9sUCk7CisKKwkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworCSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApOworCSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2V4dGVybl9sYXN0UCwgJnN5bWJvbF9leHRlcm5QLCAmc3ltYm9sX2V4dGVybl9sYXN0UCk7CisJICBzeW1ib2xQID0gaG9sZDsKKwl9CisgICAgICBlbHNlIGlmICghIFNfSVNfREVCVUcgKHN5bWJvbFApCisJICAgICAgICYmICEgU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCisJICAgICAgICYmICEgU0ZfR0VUX0ZVTkNUSU9OIChzeW1ib2xQKQorCSAgICAgICAmJiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQKKyNpZmRlZiBURV9QRQorCQkgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05UX1dFQUsKKyNlbmRpZgorCQkgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05UX1dFQUspKQorCXsKKwkgIHN5bWJvbFMgKmhvbGQgPSBzeW1ib2xfcHJldmlvdXMgKHN5bWJvbFApOworCisJICAvKiBUaGUgTydSZWlsbHkgQ09GRiBib29rIHNheXMgdGhhdCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzCisgICAgICAgICAgICAgY29tZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUsIGp1c3QgYmVmb3JlCisgICAgICAgICAgICAgdW5kZWZpbmVkIGdsb2JhbCBzeW1ib2xzLiAgKi8KKworCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisJICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCk7CisJICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfZ2xvYmFsX2xhc3RQLCAmc3ltYm9sX2dsb2JhbFAsCisJCQkgJnN5bWJvbF9nbG9iYWxfbGFzdFApOworCSAgc3ltYm9sUCA9IGhvbGQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKKwkgICAgeworCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7CisJICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7CisJICAgIH0JCQkvKiBmaXggImxvbmciIG5hbWVzICovCisKKwkgIHN5bWJvbFAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXI7CisJICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQKTsKKwl9CQkJLyogaWYgbG9jYWwgc3ltYm9sICovCisgICAgfQkJCQkvKiB0cmF2ZXJzZSB0aGUgc3ltYm9sIGxpc3QgKi8KKyAgcmV0dXJuIHN5bWJvbF9udW1iZXI7CisKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50CitnbHVlX3N5bWJvbHMgKGhlYWQsIHRhaWwpCisgICAgIHN5bWJvbFMgKipoZWFkOworICAgICBzeW1ib2xTICoqdGFpbDsKK3sKKyAgdW5zaWduZWQgaW50IHN5bWJvbF9udW1iZXIgPSAwOworCisgIHdoaWxlICgqaGVhZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKnRtcCA9ICpoZWFkOworCisgICAgICAvKiBhcHBlbmQgKi8KKyAgICAgIHN5bWJvbF9yZW1vdmUgKHRtcCwgaGVhZCwgdGFpbCk7CisgICAgICBzeW1ib2xfYXBwZW5kICh0bXAsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisKKyAgICAgIC8qIGFuZCBwcm9jZXNzICovCisgICAgICBpZiAoU0ZfR0VUX1NUUklORyAodG1wKSkKKwl7CisJICB0bXAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7CisJICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKFNfR0VUX05BTUUgKHRtcCkpICsgMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdG1wLT5zeV9uYW1lX29mZnNldCA9IDA7CisJfQkJCS8qIGZpeCAibG9uZyIgbmFtZXMgKi8KKworICAgICAgdG1wLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyOworICAgICAgc3ltYm9sX251bWJlciArPSAxICsgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAodG1wKTsKKyAgICB9CQkJCS8qIGFwcGVuZCB0aGUgZW50aXJlIGV4dGVybiBjaGFpbiAqLworCisgIHJldHVybiBzeW1ib2xfbnVtYmVyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0aWVfdGFncyAoKQoreworICB1bnNpZ25lZCBpbnQgc3ltYm9sX251bWJlciA9IDA7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIHN5bWJvbFAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXI7CisKKyAgICAgIGlmIChTRl9HRVRfVEFHR0VEIChzeW1ib2xQKSkKKwl7CisJICBTQV9TRVRfU1lNX1RBR05EWAorCSAgICAoc3ltYm9sUCwKKwkgICAgICgoc3ltYm9sUyAqKSBTQV9HRVRfU1lNX1RBR05EWCAoc3ltYm9sUCkpLT5zeV9udW1iZXIpOworCX0KKworICAgICAgc3ltYm9sX251bWJlciArPSAxICsgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCk7CisgICAgfQorCisgIHJldHVybiBzeW1ib2xfbnVtYmVyOworfQorCitzdGF0aWMgdm9pZAorY3Jhd2xfc3ltYm9scyAoaCwgYWJmZCkKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmg7CisgICAgIGJmZCAqIGFiZmQ7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIC8qIEluaXRpYWxpemUgdGhlIHN0YWNrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbWF0Y2hpbmcgLmJiIC5iZSAqLworCisgIGJsb2NrX3N0YWNrID0gc3RhY2tfaW5pdCAoNTEyLCBzaXplb2YgKHN5bWJvbFMgKikpOworCisgIC8qIFRoZSBzeW1ib2wgbGlzdCBzaG91bGQgYmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBzZXF1ZW5jZQorICAgKiBvcmRlciA6CisgICAqIC4gLmZpbGUgc3ltYm9sCisgICAqIC4gZGVidWcgZW50cmllcyBmb3IgZnVuY3Rpb25zCisgICAqIC4gZmFrZSBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMsIGluY2x1ZGluZyAudGV4dCAuZGF0YSBhbmQgLmJzcworICAgKiAuIGRlZmluZWQgc3ltYm9scworICAgKiAuIHVuZGVmaW5lZCBzeW1ib2xzCisgICAqIEJ1dCB0aGlzIGlzIG5vdCBtYW5kYXRvcnkuIFRoZSBvbmx5IGltcG9ydGFudCBwb2ludCBpcyB0byBwdXQgdGhlCisgICAqIHVuZGVmaW5lZCBzeW1ib2xzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAqLworCisgIC8qIElzIHRoZXJlIGEgLmZpbGUgc3ltYm9sID8gSWYgbm90IGluc2VydCBvbmUgYXQgdGhlIGJlZ2lubmluZy4gKi8KKyAgaWYgKHN5bWJvbF9yb290UCA9PSBOVUxMCisgICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xfcm9vdFApICE9IENfRklMRSkKKyAgICB7CisgICAgICBjX2RvdF9maWxlX3N5bWJvbCAoImZha2UiKTsKKyAgICB9CisKKyAgLyoKKyAgICogQnVpbGQgdXAgc3RhdGljIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucywgdGhleSBhcmUgZmlsbGVkIGluIGxhdGVyCisgICAqLworCisKKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKKyAgICBpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0pCisgICAgICBzZWdtZW50X2luZm9baV0uZG90ID0gY19zZWN0aW9uX3N5bWJvbCAoc2VnbWVudF9pbmZvW2ldLm5hbWUsCisJCQkJCSAgICAgIGkgLSBTRUdfRTAgKyAxKTsKKworICAvKiBUYWtlIGFsbCB0aGUgZXh0ZXJuYWxzIG91dCBhbmQgcHV0IHRoZW0gaW50byBhbm90aGVyIGNoYWluICovCisgIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoLCB5YW5rX3N5bWJvbHMgKCkpOworICAvKiBUYWtlIHRoZSBleHRlcm5hbHMgYW5kIGdsdWUgdGhlbSBvbnRvIHRoZSBlbmQuKi8KKyAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsCisJCQkgICAoSF9HRVRfU1lNQk9MX0NPVU5UIChoKQorCQkJICAgICsgZ2x1ZV9zeW1ib2xzICgmc3ltYm9sX2dsb2JhbFAsCisJCQkJCSAgICAmc3ltYm9sX2dsb2JhbF9sYXN0UCkKKwkJCSAgICArIGdsdWVfc3ltYm9scyAoJnN5bWJvbF9leHRlcm5QLAorCQkJCQkgICAgJnN5bWJvbF9leHRlcm5fbGFzdFApKSk7CisKKyAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsIHRpZV90YWdzICgpKTsKKyAga25vdyAoc3ltYm9sX2dsb2JhbFAgPT0gTlVMTCk7CisgIGtub3cgKHN5bWJvbF9nbG9iYWxfbGFzdFAgPT0gTlVMTCk7CisgIGtub3cgKHN5bWJvbF9leHRlcm5QID09IE5VTEwpOworICBrbm93IChzeW1ib2xfZXh0ZXJuX2xhc3RQID09IE5VTEwpOworfQorCisvKgorICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KKyAqLworCit2b2lkCit3X3N0cmluZ3MgKHdoZXJlKQorICAgICBjaGFyICp3aGVyZTsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3RfaGVhZDsKKworICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgKHZhbHVlVCkgc3RyaW5nX2J5dGVfY291bnQsIDQpOworICB3aGVyZSArPSA0OworCisjaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKKyAgLyogU3VwcG9ydCBsb25nIHNlY3Rpb24gbmFtZXMgYXMgZm91bmQgaW4gUEUuICBUaGlzIGNvZGUgbXVzdAorICAgICBjb29yZGluYXRlIHdpdGggdGhhdCBpbiBjb2ZmX2hlYWRlcl9hcHBlbmQgYW5kIHdyaXRlX29iamVjdF9maWxlLiAgKi8KKyAgeworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKKyAgICAgIHsKKwlpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0KKwkgICAgJiYgc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgPiBTQ05OTUxFTikKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IHNpemU7CisKKwkgICAgc2l6ZSA9IHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpICsgMTsKKwkgICAgbWVtY3B5ICh3aGVyZSwgc2VnbWVudF9pbmZvW2ldLm5hbWUsIHNpemUpOworCSAgICB3aGVyZSArPSBzaXplOworCSAgfQorICAgICAgfQorICB9CisjZW5kaWYgLyogQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMgKi8KKworICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7CisgICAgICAgc3ltYm9sUDsKKyAgICAgICBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBzaXplOworCisgICAgICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCisJeworCSAgc2l6ZSA9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKKwkgIG1lbWNweSAod2hlcmUsIFNfR0VUX05BTUUgKHN5bWJvbFApLCBzaXplKTsKKwkgIHdoZXJlICs9IHNpemU7CisJfQorICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRklMRQorCSAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfWkVST1MgKHN5bWJvbFApID09IDAKKwkgICYmIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCkgIT0gMCkKKwl7CisJICBzaXplID0gc3RybGVuIChmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lKSArIDE7CisJICBtZW1jcHkgKHdoZXJlLCBmaWxlbmFtZV9saXN0X3NjYW4tPmZpbGVuYW1lLCBzaXplKTsKKwkgIGZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3Rfc2NhbiAtPm5leHQ7CisJICB3aGVyZSArPSBzaXplOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkb19saW5lbm9zX2ZvciAoYWJmZCwgaCwgZmlsZV9jdXJzb3IpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIG9iamVjdF9oZWFkZXJzICogaDsKKyAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Cit7CisgIHVuc2lnbmVkIGludCBpZHg7CisgIHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAqZmlsZV9jdXJzb3I7CisKKyAgZm9yIChpZHggPSBTRUdfRTA7IGlkeCA8IFNFR19MQVNUOyBpZHgrKykKKyAgICB7CisgICAgICBzZWdtZW50X2luZm9fdHlwZSAqcyA9IHNlZ21lbnRfaW5mbyArIGlkeDsKKworCisgICAgICBpZiAocy0+c2NuaGRyLnNfbmxubm8gIT0gMCkKKwl7CisJICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVfcHRyOworCisJICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpidWZmZXIgPQorCSAgKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKikgeG1hbGxvYyAocy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1opOworCisJICBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICpkc3QgPSBidWZmZXI7CisKKwkgIC8qIFJ1biB0aHJvdWdoIHRoZSB0YWJsZSB3ZSd2ZSBidWlsdCBhbmQgdHVybiBpdCBpbnRvIGl0cyBleHRlcm5hbAorCSBmb3JtLCB0YWtlIHRoaXMgY2hhbmNlIHRvIHJlbW92ZSBkdXBsaWNhdGVzICovCisKKwkgIGZvciAobGluZV9wdHIgPSBzLT5saW5lbm9fbGlzdF9oZWFkOworCSAgICAgICBsaW5lX3B0ciAhPSAoc3RydWN0IGxpbmVub19saXN0ICopIE5VTEw7CisJICAgICAgIGxpbmVfcHRyID0gbGluZV9wdHItPm5leHQpCisJICAgIHsKKworCSAgICAgIGlmIChsaW5lX3B0ci0+bGluZS5sX2xubm8gPT0gMCkKKwkJeworCQkgIC8qIFR1cm4gYSBwb2ludGVyIHRvIGEgc3ltYm9sIGludG8gdGhlIHN5bWJvbHMnIGluZGV4ICovCisJCSAgbGluZV9wdHItPmxpbmUubF9hZGRyLmxfc3ltbmR4ID0KKwkJICAgICgoc3ltYm9sUyAqKSBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9zeW1uZHgpLT5zeV9udW1iZXI7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9wYWRkciArPSAoKHN0cnVjdCBmcmFnICopIChsaW5lX3B0ci0+ZnJhZykpLT5mcl9hZGRyZXNzOworCQl9CisKKworCSAgICAgICh2b2lkKSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsICYobGluZV9wdHItPmxpbmUpLCBkc3QpOworCSAgICAgIGRzdCsrOworCisJICAgIH0KKworCSAgcy0+c2NuaGRyLnNfbG5ub3B0ciA9ICpmaWxlX2N1cnNvcjsKKworCSAgYmZkX3dyaXRlIChidWZmZXIsIDEsIHMtPnNjbmhkci5zX25sbm5vICogTElORVNaLCBhYmZkKTsKKwkgIGZyZWUgKGJ1ZmZlcik7CisKKwkgICpmaWxlX2N1cnNvciArPSBzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWjsKKwl9CisgICAgfQorICBIX1NFVF9MSU5FTk9fU0laRSAoaCwgKmZpbGVfY3Vyc29yIC0gc3RhcnQpOworfQorCisKKy8qIE5vdyB3ZSBydW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBmcmFnIGNoYWlucyBpbiBhIHNlZ21lbnQgYW5kCisgICBtYWtlIGFsbCB0aGUgc3Vic2VnbWVudCBmcmFncyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUKKyAgIGxpc3QsIGFzIGlmIHRoZSBzZWcgMCB3YXMgZXh0cmEgbG9uZyAqLworCitzdGF0aWMgdm9pZAorcmVtb3ZlX3N1YnNlZ3MgKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKKyAgICB7CisgICAgICBmcmNoYWluUyAqaGVhZCA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUDsKKyAgICAgIGZyYWdTIGR1bW15OworICAgICAgZnJhZ1MgKnByZXZfZnJhZyA9ICZkdW1teTsKKworICAgICAgd2hpbGUgKGhlYWQgJiYgaGVhZC0+ZnJjaF9zZWcgPT0gaSkKKwl7CisJICBwcmV2X2ZyYWctPmZyX25leHQgPSBoZWFkLT5mcmNoX3Jvb3Q7CisJICBwcmV2X2ZyYWcgPSBoZWFkLT5mcmNoX2xhc3Q7CisJICBoZWFkID0gaGVhZC0+ZnJjaF9uZXh0OworCX0KKyAgICAgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IDA7CisgICAgfQorfQorCit1bnNpZ25lZCBsb25nIG1hY2hpbmU7CitpbnQgY29mZl9mbGFnczsKK2V4dGVybiB2b2lkCit3cml0ZV9vYmplY3RfZmlsZSAoKQoreworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5fcHRyOworCisgIG9iamVjdF9oZWFkZXJzIGhlYWRlcnM7CisgIHVuc2lnbmVkIGxvbmcgZmlsZV9jdXJzb3I7CisgIGJmZCAqYWJmZDsKKyAgdW5zaWduZWQgaW50IGFkZHI7CisgIGFiZmQgPSBiZmRfb3BlbncgKG91dF9maWxlX25hbWUsIFRBUkdFVF9GT1JNQVQpOworCisKKyAgaWYgKGFiZmQgPT0gMCkKKyAgICB7CisgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgb3V0X2ZpbGVfbmFtZSk7CisgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOworICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgQkZEX0FSQ0gsIG1hY2hpbmUpOworCisgIHN0cmluZ19ieXRlX2NvdW50ID0gNDsKKworICBmb3IgKGZyY2hhaW5fcHRyID0gZnJjaGFpbl9yb290OworICAgICAgIGZyY2hhaW5fcHRyICE9IChzdHJ1Y3QgZnJjaGFpbiAqKSBOVUxMOworICAgICAgIGZyY2hhaW5fcHRyID0gZnJjaGFpbl9wdHItPmZyY2hfbmV4dCkKKyAgICB7CisgICAgICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN1Yi1zZWdtZW50cyBhbmQgYWxpZ24gdGhlbSB1cC4gIEFsc28KKwkgY2xvc2UgYW55IG9wZW4gZnJhZ3MuICBXZSB0YWNrIGEgLmZpbGwgb250byB0aGUgZW5kIG9mIHRoZQorCSBmcmFnIGNoYWluIHNvIHRoYXQgYW55IC5hbGlnbidzIHNpemUgY2FuIGJlIHdvcmtlZCBieSBsb29raW5nCisJIGF0IHRoZSBuZXh0IGZyYWcuICAqLworCisgICAgICBzdWJzZWdfc2V0IChmcmNoYWluX3B0ci0+ZnJjaF9zZWcsIGZyY2hhaW5fcHRyLT5mcmNoX3N1YnNlZyk7CisjaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCisjZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMQorI2VuZGlmCisjaWZkZWYgbWRfZG9fYWxpZ24KKyAgICAgIG1kX2RvX2FsaWduIChTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksIChjaGFyICopIE5VTEwsIDAsIDAsCisJCSAgIGFsaWdubWVudF9kb25lKTsKKyNlbmRpZgorICAgICAgZnJhZ19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCBOT1BfT1BDT0RFLCAwKTsKKyNpZmRlZiBtZF9kb19hbGlnbgorICAgIGFsaWdubWVudF9kb25lOgorI2VuZGlmCisgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKKyAgICAgIGZyYWdfbm93LT5mcl9maXggPSAwOworICAgICAga25vdyAoZnJhZ19ub3ctPmZyX25leHQgPT0gTlVMTCk7CisgICAgfQorCisKKyAgcmVtb3ZlX3N1YnNlZ3MgKCk7CisKKworICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQorICAgIHsKKyAgICAgIHJlbGF4X3NlZ21lbnQgKHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290LCBpKTsKKyAgICB9CisKKyAgSF9TRVRfTlVNQkVSX09GX1NFQ1RJT05TICgmaGVhZGVycywgMCk7CisKKyAgLyogRmluZCBvdXQgaG93IGJpZyB0aGUgc2VjdGlvbnMgYXJlLCBhbmQgc2V0IHRoZSBhZGRyZXNzZXMuICAqLworICBhZGRyID0gMDsKKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKKyAgICB7CisgICAgICBsb25nIHNpemU7CisKKyAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19wYWRkciA9IGFkZHI7CisgICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfdmFkZHIgPSBhZGRyOworCisgICAgICBpZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF0pCisJeworCSAgSF9TRVRfTlVNQkVSX09GX1NFQ1RJT05TICgmaGVhZGVycywKKwkJCQkgICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TICgmaGVhZGVycykgKyAxKTsKKworI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCisJICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZQorCSAgICAgbXVzdCBjb29yZGluYXRlIHdpdGggdGhhdCBpbiBjb2ZmX2hlYWRlcl9hcHBlbmQgYW5kCisJICAgICB3X3N0cmluZ3MuICAqLworCSAgeworCSAgICB1bnNpZ25lZCBpbnQgbGVuOworCisJICAgIGxlbiA9IHN0cmxlbiAoc2VnbWVudF9pbmZvW2ldLm5hbWUpOworCSAgICBpZiAobGVuID4gU0NOTk1MRU4pCisJICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gbGVuICsgMTsKKwkgIH0KKyNlbmRpZiAvKiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyAqLworCX0KKworICAgICAgc2l6ZSA9IHNpemVfc2VjdGlvbiAoYWJmZCwgKHVuc2lnbmVkIGludCkgaSk7CisgICAgICBhZGRyICs9IHNpemU7CisKKyAgICAgIC8qIEkgdGhpbmsgdGhlIHNlY3Rpb24gYWxpZ25tZW50IGlzIG9ubHkgdXNlZCBvbiB0aGUgaTk2MDsgdGhlCisJIGk5NjAgbmVlZHMgaXQsIGFuZCBpdCBzaG91bGQgZG8gbm8gaGFybSBvbiBvdGhlciB0YXJnZXRzLiAgKi8KKyNpZmRlZiBBTElHTk1FTlRfSU5fU19GTEFHUworICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2ZsYWdzIHw9IChzZWN0aW9uX2FsaWdubWVudFtpXSAmIDB4RikgPDwgODsKKyNlbHNlCisgICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfYWxpZ24gPSAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W2ldOworI2VuZGlmCisKKyAgICAgIGlmIChpID09IFNFR19FMCkKKwlIX1NFVF9URVhUX1NJWkUgKCZoZWFkZXJzLCBzaXplKTsKKyAgICAgIGVsc2UgaWYgKGkgPT0gU0VHX0UxKQorCUhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIHNpemUpOworICAgICAgZWxzZSBpZiAoaSA9PSBTRUdfRTIpCisJSF9TRVRfQlNTX1NJWkUgKCZoZWFkZXJzLCBzaXplKTsKKyAgICB9CisKKyAgLyogVHVybiB0aGUgZ2FzIG5hdGl2ZSBzeW1ib2wgdGFibGUgc2hhcGUgaW50byBhIGNvZmYgc3ltYm9sIHRhYmxlICovCisgIGNyYXdsX3N5bWJvbHMgKCZoZWFkZXJzLCBhYmZkKTsKKworICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPT0gNCkKKyAgICBzdHJpbmdfYnl0ZV9jb3VudCA9IDA7CisKKyAgSF9TRVRfU1RSSU5HX1NJWkUgKCZoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7CisKKyNpZmRlZiB0Y19mcm9iX2ZpbGUKKyAgdGNfZnJvYl9maWxlICgpOworI2VuZGlmCisKKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKKyAgICB7CisgICAgICBmaXh1cF9tZGVwcyAoc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3QsICZoZWFkZXJzLCBpKTsKKyAgICAgIGZpeHVwX3NlZ21lbnQgKCZzZWdtZW50X2luZm9baV0sIGkpOworICAgIH0KKworICAvKiBMb29rIGZvciAiLnN0YWIiIHNlZ21lbnRzIGFuZCBmaWxsIGluIHRoZWlyIGluaXRpYWwgc3ltYm9scworICAgICBjb3JyZWN0bHkuICovCisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCisgICAgeworICAgICAgbmFtZSA9IHNlZ21lbnRfaW5mb1tpXS5uYW1lOworCisgICAgICBpZiAobmFtZSAhPSBOVUxMCisJICAmJiBzdHJuY21wICgiLnN0YWIiLCBuYW1lLCA1KSA9PSAwCisJICAmJiBzdHJuY21wICgiLnN0YWJzdHIiLCBuYW1lLCA4KSAhPSAwKQorCWFkanVzdF9zdGFiX3NlY3Rpb24gKGFiZmQsIGkpOworICAgIH0KKworICBmaWxlX2N1cnNvciA9IEhfR0VUX1RFWFRfRklMRV9PRkZTRVQgKCZoZWFkZXJzKTsKKworICBiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBmaWxlX2N1cnNvciwgMCk7CisKKyAgLyogUGxhbnQgdGhlIGRhdGEgKi8KKworICBmaWxsX3NlY3Rpb24gKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOworCisgIGRvX3JlbG9jc19mb3IgKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOworCisgIGRvX2xpbmVub3NfZm9yIChhYmZkLCAmaGVhZGVycywgJmZpbGVfY3Vyc29yKTsKKworICBIX1NFVF9GSUxFX01BR0lDX05VTUJFUiAoJmhlYWRlcnMsIENPRkZfTUFHSUMpOworI2lmbmRlZiBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUAorICBIX1NFVF9USU1FX1NUQU1QICgmaGVhZGVycywgKGxvbmcpdGltZSgodGltZV90ICopMCkpOworI2Vsc2UKKyAgSF9TRVRfVElNRV9TVEFNUCAoJmhlYWRlcnMsIDApOworI2VuZGlmCisjaWZkZWYgVENfQ09GRl9TRVRfTUFDSElORQorICBUQ19DT0ZGX1NFVF9NQUNISU5FICgmaGVhZGVycyk7CisjZW5kaWYKKworI2lmbmRlZiBDT0ZGX0ZMQUdTCisjZGVmaW5lIENPRkZfRkxBR1MgMAorI2VuZGlmCisKKyNpZmRlZiBLRUVQX1JFTE9DX0lORk8KKyAgSF9TRVRfRkxBR1MgKCZoZWFkZXJzLCAoKEhfR0VUX0xJTkVOT19TSVpFKCZoZWFkZXJzKSA/IDAgOiBGX0xOTk8pIHwKKwkJCSAgQ09GRl9GTEFHUyB8IGNvZmZfZmxhZ3MpKTsKKyNlbHNlCisgIEhfU0VUX0ZMQUdTICgmaGVhZGVycywgKChIX0dFVF9MSU5FTk9fU0laRSgmaGVhZGVycykgICAgID8gMCA6IEZfTE5OTykgICB8CisJCQkgIChIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoJmhlYWRlcnMpID8gMCA6IEZfUkVMRkxHKSB8CisJCQkgIENPRkZfRkxBR1MgfCBjb2ZmX2ZsYWdzKSk7CisjZW5kaWYKKworICB7CisgICAgdW5zaWduZWQgaW50IHN5bXRhYmxlX3NpemUgPSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRSAoJmhlYWRlcnMpOworICAgIGNoYXIgKmJ1ZmZlcjEgPSB4bWFsbG9jIChzeW10YWJsZV9zaXplICsgc3RyaW5nX2J5dGVfY291bnQgKyAxKTsKKworICAgIEhfU0VUX1NZTUJPTF9UQUJMRV9QT0lOVEVSICgmaGVhZGVycywgYmZkX3RlbGwgKGFiZmQpKTsKKyAgICB3X3N5bWJvbHMgKGFiZmQsIGJ1ZmZlcjEsIHN5bWJvbF9yb290UCk7CisgICAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID4gMCkKKyAgICAgIHdfc3RyaW5ncyAoYnVmZmVyMSArIHN5bXRhYmxlX3NpemUpOworICAgIGJmZF93cml0ZSAoYnVmZmVyMSwgMSwgc3ltdGFibGVfc2l6ZSArIHN0cmluZ19ieXRlX2NvdW50LCBhYmZkKTsKKyAgICBmcmVlIChidWZmZXIxKTsKKyAgfQorCisgIGNvZmZfaGVhZGVyX2FwcGVuZCAoYWJmZCwgJmhlYWRlcnMpOworI2lmIDAKKyAgLyogUmVjZW50IGNoYW5nZXMgdG8gd3JpdGUgbmVlZCB0aGlzLCBidXQgd2hlcmUgaXQgc2hvdWxkCisgICAgIGdvIGlzIHVwIHRvIEtlbi4uICovCisgIGlmIChiZmRfY2xvc2VfYWxsX2RvbmUgKGFiZmQpID09IGZhbHNlKQorICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBjbG9zZSAlczogJXMiKSwgb3V0X2ZpbGVfbmFtZSwKKwkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisjZWxzZQorICB7CisgICAgZXh0ZXJuIGJmZCAqc3Rkb3V0cHV0OworICAgIHN0ZG91dHB1dCA9IGFiZmQ7CisgIH0KKyNlbmRpZgorCit9CisKKy8qIEFkZCBhIG5ldyBzZWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBzdWJzZWdfbmV3IHZpYSB0aGUKKyAgIG9ial9uZXdfc2VnbWVudCBtYWNyby4gICovCisKK3NlZ1QKK29ial9jb2ZmX2FkZF9zZWdtZW50IChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICB1bnNpZ25lZCBpbnQgaTsKKworI2lmbmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworICBjaGFyIGJ1ZltTQ05OTUxFTiArIDFdOworCisgIHN0cm5jcHkgKGJ1ZiwgbmFtZSwgU0NOTk1MRU4pOworICBidWZbU0NOTk1MRU5dID0gJ1wwJzsKKyAgbmFtZSA9IGJ1ZjsKKyNlbmRpZgorCisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19MQVNUICYmIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lWzBdOyBpKyspCisgICAgaWYgKHN0cmNtcCAobmFtZSwgc2VnbWVudF9pbmZvW2ldLm5hbWUpID09IDApCisgICAgICByZXR1cm4gKHNlZ1QpIGk7CisKKyAgaWYgKGkgPT0gU0VHX0xBU1QpCisgICAgeworICAgICAgYXNfYmFkIChfKCJUb28gbWFueSBuZXcgc2VjdGlvbnM7IGNhbid0IGFkZCBcIiVzXCIiKSwgbmFtZSk7CisgICAgICByZXR1cm4gbm93X3NlZzsKKyAgICB9CisKKyAgLyogQWRkIGEgbmV3IHNlY3Rpb24uICAqLworICBzdHJuY3B5IChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgbmFtZSwKKwkgICBzaXplb2YgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lKSk7CisgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19mbGFncyA9IFNUWVBfUkVHOworICBzZWdtZW50X2luZm9baV0ubmFtZSA9IHhzdHJkdXAgKG5hbWUpOworCisgIHJldHVybiAoc2VnVCkgaTsKK30KKworLyoKKyAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgorICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQorICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcworICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbworICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKKyAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAorICoJCQkJCQkgJ3InIGZvciByZWFkLW9ubHkgZGF0YQorICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCisgKiBzdWJzZWdtZW50IG51bWJlci4KKyAqLworCit2b2lkCitvYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCisgIGNoYXIgKnNlY3Rpb25fbmFtZSwgKm5hbWU7CisgIGNoYXIgYzsKKyAgdW5zaWduZWQgaW50IGV4cDsKKyAgbG9uZyBmbGFnczsKKworICBpZiAoZmxhZ19tcmkpCisgICAgeworICAgICAgY2hhciB0eXBlOworCisgICAgICBzX21yaV9zZWN0ICgmdHlwZSk7CisgICAgICBmbGFncyA9IDA7CisgICAgICBpZiAodHlwZSA9PSAnQycpCisJZmxhZ3MgPSBTVFlQX1RFWFQ7CisgICAgICBlbHNlIGlmICh0eXBlID09ICdEJykKKwlmbGFncyA9IFNUWVBfREFUQTsKKyAgICAgIHNlZ21lbnRfaW5mb1tub3dfc2VnXS5zY25oZHIuc19mbGFncyB8PSBmbGFnczsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBzZWN0aW9uX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICBuYW1lID0geG1hbGxvYyAoaW5wdXRfbGluZV9wb2ludGVyIC0gc2VjdGlvbl9uYW1lICsgMSk7CisgIHN0cmNweSAobmFtZSwgc2VjdGlvbl9uYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBleHAgPSAwOworICBmbGFncyA9IDA7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKKwlleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgIGVsc2UKKwl7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJworCQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCisJCXsKKwkJY2FzZSAnYic6IGZsYWdzIHw9IFNUWVBfQlNTOyAgICBicmVhazsKKwkJY2FzZSAnaSc6IGZsYWdzIHw9IFNUWVBfSU5GTzsgICBicmVhazsKKwkJY2FzZSAnbCc6IGZsYWdzIHw9IFNUWVBfTElCOyAgICBicmVhazsKKwkJY2FzZSAnbic6IGZsYWdzIHw9IFNUWVBfTk9MT0FEOyBicmVhazsKKwkJY2FzZSAnbyc6IGZsYWdzIHw9IFNUWVBfT1ZFUjsgICBicmVhazsKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ3cnOiBmbGFncyB8PSBTVFlQX0RBVEE7ICAgYnJlYWs7CisJCWNhc2UgJ3gnOiBmbGFncyB8PSBTVFlQX1RFWFQ7ICAgYnJlYWs7CisJCWNhc2UgJ3InOiBmbGFncyB8PSBTVFlQX0xJVDsJYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYXNfd2FybihfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKKwkJCSAgKmlucHV0X2xpbmVfcG9pbnRlcik7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgfQorCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQorCSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwl9CisgICAgfQorCisgIHN1YnNlZ19uZXcgKG5hbWUsIChzdWJzZWdUKSBleHApOworCisgIHNlZ21lbnRfaW5mb1tub3dfc2VnXS5zY25oZHIuc19mbGFncyB8PSBmbGFnczsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl90ZXh0IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHN1YnNlZ19uZXcgKCIudGV4dCIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKK30KKworCitzdGF0aWMgdm9pZAorb2JqX2NvZmZfZGF0YSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCisgICAgc3Vic2VnX25ldyAoIi50ZXh0IiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkgKyAxMDAwKTsKKyAgZWxzZQorICAgIHN1YnNlZ19uZXcgKCIuZGF0YSIsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKK30KKworc3RhdGljIHZvaWQKK29ial9jb2ZmX2lkZW50IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOwkJLyogc2F2ZSBjdXJyZW50IHNlZwkqLworICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKKyAgc3Vic2VnX25ldyAoIi5jb21tZW50IiwgMCk7CQkvKiAuY29tbWVudCBzZWcJCSovCisgIHN0cmluZ2VyICgxKTsJCQkJLyogcmVhZCBzdHJpbmcJCSovCisgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7CS8qIHJlc3RvcmUgY3VycmVudCBzZWcJKi8KK30KKwordm9pZAorY19zeW1ib2xfbWVyZ2UgKGRlYnVnLCBub3JtYWwpCisgICAgIHN5bWJvbFMgKmRlYnVnOworICAgICBzeW1ib2xTICpub3JtYWw7Cit7CisgIFNfU0VUX0RBVEFfVFlQRSAobm9ybWFsLCBTX0dFVF9EQVRBX1RZUEUgKGRlYnVnKSk7CisgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKG5vcm1hbCwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVidWcpKTsKKworICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpID4gU19HRVRfTlVNQkVSX0FVWElMSUFSWSAobm9ybWFsKSkKKyAgICB7CisgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwsIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSk7CisgICAgfQkJCQkvKiB0YWtlIHRoZSBtb3N0IHdlIGhhdmUgKi8KKworICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpID4gMCkKKyAgICB7CisgICAgICBtZW1jcHkgKChjaGFyICopICZub3JtYWwtPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdLAorCSAgICAgIChjaGFyICopICZkZWJ1Zy0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sCisJICAgICAgKHVuc2lnbmVkIGludCkgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSAqIEFVWEVTWikpOworICAgIH0JCQkJLyogTW92ZSBhbGwgdGhlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiAqLworCisgIC8qIE1vdmUgdGhlIGRlYnVnIGZsYWdzLiAqLworICBTRl9TRVRfREVCVUdfRklFTEQgKG5vcm1hbCwgU0ZfR0VUX0RFQlVHX0ZJRUxEIChkZWJ1ZykpOworfQkJCQkvKiBjX3N5bWJvbF9tZXJnZSgpICovCisKK3N0YXRpYyBpbnQKK2NfbGluZV9uZXcgKHN5bWJvbCwgcGFkZHIsIGxpbmVfbnVtYmVyLCBmcmFnKQorICAgICBzeW1ib2xTICogc3ltYm9sOworICAgICBsb25nIHBhZGRyOworICAgICBpbnQgbGluZV9udW1iZXI7CisgICAgIGZyYWdTICogZnJhZzsKK3sKKyAgc3RydWN0IGxpbmVub19saXN0ICpuZXdfbGluZSA9CisgIChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZW5vX2xpc3QpKTsKKworICBzZWdtZW50X2luZm9fdHlwZSAqcyA9IHNlZ21lbnRfaW5mbyArIG5vd19zZWc7CisgIG5ld19saW5lLT5saW5lLmxfbG5ubyA9IGxpbmVfbnVtYmVyOworCisgIGlmIChsaW5lX251bWJlciA9PSAwKQorICAgIHsKKyAgICAgIGxhc3RfbGluZV9zeW1ib2wgPSBzeW1ib2w7CisgICAgICBuZXdfbGluZS0+bGluZS5sX2FkZHIubF9zeW1uZHggPSAobG9uZykgc3ltYm9sOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ld19saW5lLT5saW5lLmxfYWRkci5sX3BhZGRyID0gcGFkZHI7CisgICAgfQorCisgIG5ld19saW5lLT5mcmFnID0gKGNoYXIgKikgZnJhZzsKKyAgbmV3X2xpbmUtPm5leHQgPSAoc3RydWN0IGxpbmVub19saXN0ICopIE5VTEw7CisKKworICBpZiAocy0+bGluZW5vX2xpc3RfaGVhZCA9PSAoc3RydWN0IGxpbmVub19saXN0ICopIE5VTEwpCisgICAgeworICAgICAgcy0+bGluZW5vX2xpc3RfaGVhZCA9IG5ld19saW5lOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHMtPmxpbmVub19saXN0X3RhaWwtPm5leHQgPSBuZXdfbGluZTsKKyAgICB9CisgIHMtPmxpbmVub19saXN0X3RhaWwgPSBuZXdfbGluZTsKKyAgcmV0dXJuIExJTkVTWiAqIHMtPnNjbmhkci5zX25sbm5vKys7Cit9CisKK3ZvaWQKK2NfZG90X2ZpbGVfc3ltYm9sIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKCIuZmlsZSIsCisJCQlTRUdfREVCVUcsCisJCQkwLAorCQkJJnplcm9fYWRkcmVzc19mcmFnKTsKKworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0ZJTEUpOworICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKKworICBpZiAoc3RybGVuIChmaWxlbmFtZSkgPiBGSUxOTUxFTikKKyAgICB7CisgICAgICAvKiBGaWxlbmFtZSBpcyB0b28gbG9uZyB0byBmaXQgaW50byBhbiBhdXhlbnQsCisJIHdlIHN0aWNrIGl0IGludG8gdGhlIHN0cmluZyB0YWJsZSBpbnN0ZWFkLiAgV2Uga2VlcAorCSBhIGxpbmtlZCBsaXN0IG9mIHRoZSBmaWxlbmFtZXMgd2UgZmluZCBzbyB3ZSBjYW4gZW1pdAorCSB0aGVtIGxhdGVyLiovCisgICAgICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZiA9ICgoc3RydWN0IGZpbGVuYW1lX2xpc3QgKikKKwkJCQkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCkpKTsKKworICAgICAgZi0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICAgIGYtPm5leHQgPSAwOworCisgICAgICBTQV9TRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCwgMCk7CisgICAgICBTQV9TRVRfRklMRV9GTkFNRV9PRkZTRVQgKHN5bWJvbFAsIDEpOworCisgICAgICBpZiAoZmlsZW5hbWVfbGlzdF90YWlsKSAKKwlmaWxlbmFtZV9saXN0X3RhaWwtPm5leHQgPSBmOworICAgICAgZWxzZQorCWZpbGVuYW1lX2xpc3RfaGVhZCA9IGY7CisgICAgICBmaWxlbmFtZV9saXN0X3RhaWwgPSBmOyAgICAgIAorICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBTQV9TRVRfRklMRV9GTkFNRSAoc3ltYm9sUCwgZmlsZW5hbWUpOworICAgIH0KKyNpZm5kZWYgTk9fTElTVElORworICB7CisgICAgZXh0ZXJuIGludCBsaXN0aW5nOworICAgIGlmIChsaXN0aW5nKQorICAgICAgeworCWxpc3Rpbmdfc291cmNlX2ZpbGUgKGZpbGVuYW1lKTsKKyAgICAgIH0KKworICB9CisKKyNlbmRpZgorICBTRl9TRVRfREVCVUcgKHN5bWJvbFApOworICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgcHJldmlvdXNfZmlsZV9zeW1ib2wpOworCisgIHByZXZpb3VzX2ZpbGVfc3ltYm9sID0gc3ltYm9sUDsKKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGlzIGZpcnN0IG9uIHRoZSBzeW1ib2wgY2hhaW4gKi8KKyAgaWYgKHN5bWJvbF9yb290UCAhPSBzeW1ib2xQKQorICAgIHsKKyAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworICAgICAgc3ltYm9sX2luc2VydCAoc3ltYm9sUCwgc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICB9Cit9CQkJCS8qIGNfZG90X2ZpbGVfc3ltYm9sKCkgKi8KKworLyoKKyAqIEJ1aWxkIGEgJ3NlY3Rpb24gc3RhdGljJyBzeW1ib2wuCisgKi8KKworc3ltYm9sUyAqCitjX3NlY3Rpb25fc3ltYm9sIChuYW1lLCBpZHgpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBpZHg7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIERPX05PVF9TVFJJUCk7CisgIGlmIChzeW1ib2xQID09IE5VTEwpCisgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIGlkeCwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE1tbW0uICBJIGp1c3QgbG92ZSB2aW9sYXRpbmcgaW50ZXJmYWNlcy4gIE1ha2VzIG1lIGZlZWwuLi5kaXJ0eS4gICovCisgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBpZHgpOworICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKKyAgICB9CisKKyAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TVEFUKTsKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7CisKKyAgU0ZfU0VUX1NUQVRJQ1MgKHN5bWJvbFApOworCisjaWZkZWYgVEVfREVMVEEKKyAgLyogbWFuZnJlZEBzLWRpcmVrdG5ldC5kZTogc2VjdGlvbiBzeW1ib2xzICptdXN0KiBoYXZlIHRoZSBMT0NBTCBiaXQgY2xlYXJlZCwKKyAgICAgd2hpY2ggaXMgc2V0IGJ5IHRoZSBuZXcgZGVmaW5pdGlvbiBvZiBMT0NBTF9MQUJFTCBpbiB0Yy1tNjhrLmguICAqLworICBTRl9DTEVBUl9MT0NBTCAoc3ltYm9sUCk7CisjZW5kaWYKKyNpZmRlZiBURV9QRQorICAvKiBJZiB0aGUgLmxpbmtvbmNlIHBzZXVkby1vcCB3YXMgdXNlZCBmb3IgdGhpcyBzZWN0aW9uLCB3ZSBtdXN0CisgICAgIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgYXV4aWxpYXJ5IGVudHJ5IGZvciB0aGUgc2VjdGlvbgorICAgICBzeW1ib2wuICAqLworICBpZiAoc2VnbWVudF9pbmZvW2lkeF0ubGlua29uY2UgIT0gTElOS09OQ0VfVU5TRVQpCisgICAgeworICAgICAgaW50IHR5cGU7CisKKyAgICAgIHN3aXRjaCAoc2VnbWVudF9pbmZvW2lkeF0ubGlua29uY2UpCisJeworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwljYXNlIExJTktPTkNFX0RJU0NBUkQ6CisJICB0eXBlID0gSU1BR0VfQ09NREFUX1NFTEVDVF9BTlk7CisJICBicmVhazsKKwljYXNlIExJTktPTkNFX09ORV9PTkxZOgorCSAgdHlwZSA9IElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOworCSAgYnJlYWs7CisJY2FzZSBMSU5LT05DRV9TQU1FX1NJWkU6CisJICB0eXBlID0gSU1BR0VfQ09NREFUX1NFTEVDVF9TQU1FX1NJWkU7CisJICBicmVhazsKKwljYXNlIExJTktPTkNFX1NBTUVfQ09OVEVOVFM6CisJICB0eXBlID0gSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSDsKKwkgIGJyZWFrOworCX0KKworICAgICAgU1lNX0FVWEVOVCAoc3ltYm9sUCktPnhfc2NuLnhfY29tZGF0ID0gdHlwZTsKKyAgICB9CisjZW5kaWYgLyogVEVfUEUgKi8KKworICByZXR1cm4gc3ltYm9sUDsKK30JCQkJLyogY19zZWN0aW9uX3N5bWJvbCgpICovCisKK3N0YXRpYyB2b2lkCit3X3N5bWJvbHMgKGFiZmQsIHdoZXJlLCBzeW1ib2xfcm9vdFApCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGNoYXIgKndoZXJlOworICAgICBzeW1ib2xTICogc3ltYm9sX3Jvb3RQOworeworICBzeW1ib2xTICpzeW1ib2xQOworICB1bnNpZ25lZCBpbnQgaTsKKworICAvKiBGaXJzdCBmaWxsIGluIHRob3NlIHZhbHVlcyB3ZSBoYXZlIG9ubHkganVzdCB3b3JrZWQgb3V0ICovCisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19MQVNUOyBpKyspCisgICAgeworICAgICAgc3ltYm9sUCA9IHNlZ21lbnRfaW5mb1tpXS5kb3Q7CisgICAgICBpZiAoc3ltYm9sUCkKKwl7CisJICBTQV9TRVRfU0NOX1NDTkxFTiAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX3NpemUpOworCSAgU0FfU0VUX1NDTl9OUkVMT0MgKHN5bWJvbFAsIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19ucmVsb2MpOworCSAgU0FfU0VUX1NDTl9OTElOTk8gKHN5bWJvbFAsIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19ubG5ubyk7CisJfQorICAgIH0KKworICAvKgorICAgICAqIEVtaXQgYWxsIHN5bWJvbHMgbGVmdCBpbiB0aGUgc3ltYm9sIGNoYWluLgorICAgICAqLworICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCisgICAgeworICAgICAgLyogVXNlZCB0byBzYXZlIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWUuIEl0IGlzIHVzZWQgdG8gcG9pbnQKKwkgICAgICAgdG8gdGhlIHN0cmluZyBpbiBtZW1vcnkgYnV0IG11c3QgYmUgYSBmaWxlIG9mZnNldC4gKi8KKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnRlbXA7CisKKyAgICAgIC8qIFdlIGNhbid0IGZpeCB0aGUgbG5ub3B0ciBmaWVsZCBpbiB5YW5rX3N5bWJvbHMgd2l0aCB0aGUgb3RoZXIKKyAgICAgICAgIGFkanVzdG1lbnRzLCBiZWNhdXNlIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCB3ZSBrbm93IHdoZXJlIHRoZXkKKyAgICAgICAgIGdvIGluIHRoZSBmaWxlLiAgKi8KKyAgICAgIGlmIChTRl9HRVRfQURKX0xOTk9QVFIgKHN5bWJvbFApKQorCXsKKwkgIFNBX0dFVF9TWU1fTE5OT1BUUiAoc3ltYm9sUCkgKz0KKwkgICAgc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbFApXS5zY25oZHIuc19sbm5vcHRyOworCX0KKworICAgICAgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChzeW1ib2xQKTsKKworICAgICAgdGVtcCA9IFNfR0VUX05BTUUgKHN5bWJvbFApOworICAgICAgaWYgKFNGX0dFVF9TVFJJTkcgKHN5bWJvbFApKQorCXsKKwkgIFNfU0VUX09GRlNFVCAoc3ltYm9sUCwgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQpOworCSAgU19TRVRfWkVST0VTIChzeW1ib2xQLCAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWVtc2V0IChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbmFtZSwgMCwgU1lNTk1MRU4pOworCSAgc3RybmNweSAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX25hbWUsIHRlbXAsIFNZTU5NTEVOKTsKKwl9CisgICAgICB3aGVyZSA9IHN5bWJvbF90b19jaGFycyAoYWJmZCwgd2hlcmUsIHN5bWJvbFApOworICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgdGVtcCk7CisgICAgfQorCit9CQkJCS8qIHdfc3ltYm9scygpICovCisKK3N0YXRpYyB2b2lkCitvYmpfY29mZl9sY29tbSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzX2xjb21tKDApOworICByZXR1cm47CisjaWYgMAorICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGludCB0ZW1wOworICBjaGFyICpwOworCisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICpwID0gYzsKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCisgICAgeworICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgKnAgPSAwOworCisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlKG5hbWUpOworCisgIGlmIChTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IFNFR19VTktOT1dOICYmCisgICAgICBTX0dFVF9WQUxVRShzeW1ib2xQKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghIG5lZWRfcGFzc18yKQorCXsKKwkgIGNoYXIgKnA7CisJICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsgCS8qIHNhdmUgY3VycmVudCBzZWcgICAgICovCisJICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKKworCSAgc3Vic2VnX3NldCAoU0VHX0UyLCAxKTsKKwkgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKwkgIHAgPSBmcmFnX3Zhcihyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKKwkJICAgICAgIChvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKSAwKTsKKwkgICpwID0gMDsKKwkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7IC8qIHJlc3RvcmUgY3VycmVudCBzZWcgKi8KKwkgIFNfU0VUX1NFR01FTlQoc3ltYm9sUCwgU0VHX0UyKTsKKwkgIFNfU0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCwgQ19TVEFUKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgYXNfYmFkKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQiKSwgbmFtZSk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSgpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitmaXh1cF9tZGVwcyAoZnJhZ3MsIGgsIHRoaXNfc2VnbWVudCkKKyAgICAgZnJhZ1MgKiBmcmFnczsKKyAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOworICAgICBzZWdUIHRoaXNfc2VnbWVudDsKK3sKKyAgc3Vic2VnX2NoYW5nZSAodGhpc19zZWdtZW50LCAwKTsKKyAgd2hpbGUgKGZyYWdzKQorICAgIHsKKyAgICAgIHN3aXRjaCAoZnJhZ3MtPmZyX3R5cGUpCisJeworCWNhc2UgcnNfYWxpZ246CisJY2FzZSByc19hbGlnbl9jb2RlOgorCWNhc2UgcnNfb3JnOgorI2lmZGVmIEhBTkRMRV9BTElHTgorCSAgSEFORExFX0FMSUdOIChmcmFncyk7CisjZW5kaWYKKwkgIGZyYWdzLT5mcl90eXBlID0gcnNfZmlsbDsKKwkgIGZyYWdzLT5mcl9vZmZzZXQgPQorCSAgICAoKGZyYWdzLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3MtPmZyX2FkZHJlc3MgLSBmcmFncy0+ZnJfZml4KQorCSAgICAgLyBmcmFncy0+ZnJfdmFyKTsKKwkgIGJyZWFrOworCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6CisJICBtZF9jb252ZXJ0X2ZyYWcgKGgsIHRoaXNfc2VnbWVudCwgZnJhZ3MpOworCSAgZnJhZ193YW5lIChmcmFncyk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgOworCX0KKyAgICAgIGZyYWdzID0gZnJhZ3MtPmZyX25leHQ7CisgICAgfQorfQorCisjaWYgMQorCisjaWZuZGVmIFRDX0ZPUkNFX1JFTE9DQVRJT04KKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIDAKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZml4dXBfc2VnbWVudCAoc2VnUCwgdGhpc19zZWdtZW50X3R5cGUpCisgICAgIHNlZ21lbnRfaW5mb190eXBlICogc2VnUDsKKyAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsKK3sKKyAgcmVnaXN0ZXIgZml4UyAqIGZpeFA7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKmFkZF9zeW1ib2xQOworICByZWdpc3RlciBzeW1ib2xTICpzdWJfc3ltYm9sUDsKKyAgbG9uZyBhZGRfbnVtYmVyOworICByZWdpc3RlciBpbnQgc2l6ZTsKKyAgcmVnaXN0ZXIgY2hhciAqcGxhY2U7CisgIHJlZ2lzdGVyIGxvbmcgd2hlcmU7CisgIHJlZ2lzdGVyIGNoYXIgcGNyZWw7CisgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgcmVnaXN0ZXIgc2VnVCBhZGRfc3ltYm9sX3NlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOworCisgIGZvciAoZml4UCA9IHNlZ1AtPmZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICBmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7CisgICAgICBrbm93IChmcmFnUCk7CisgICAgICB3aGVyZSA9IGZpeFAtPmZ4X3doZXJlOworICAgICAgcGxhY2UgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOworICAgICAgc2l6ZSA9IGZpeFAtPmZ4X3NpemU7CisgICAgICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OworICAgICAgc3ViX3N5bWJvbFAgPSBmaXhQLT5meF9zdWJzeTsKKyAgICAgIGFkZF9udW1iZXIgPSBmaXhQLT5meF9vZmZzZXQ7CisgICAgICBwY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOworCisgICAgICAvKiBXZSB3YW50IGZ1bmN0aW9uLXJlbGF0aXZlIHN0YWJzIHRvIHdvcmsgb24gc3lzdGVtcyB3aGljaAorCSBtYXkgdXNlIGEgcmVsYXhpbmcgbGlua2VyOyB0aHVzIHdlIG11c3QgaGFuZGxlIHRoZSBzeW0xLXN5bTIKKwkgZml4dXBzIGZ1bmN0aW9uLXJlbGF0aXZlIHN0YWJzIGdlbmVyYXRlcy4KKworCSBPZiBjb3Vyc2UsIGlmIHlvdSBhY3R1YWxseSBlbmFibGUgcmVsYXhpbmcgaW4gdGhlIGxpbmtlciwgdGhlCisJIGxpbmUgYW5kIGJsb2NrIHNjb3BpbmcgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgaW5jb3JyZWN0CisJIGluIHNvbWUgY2FzZXMuICBUaGUgb25seSB3YXkgdG8gcmVhbGx5IGZpeCB0aGlzIGlzIHRvIHN1cHBvcnQKKwkgYSByZWxvYyBpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuICAqLworICAgICAgaWYgKGxpbmtyZWxheAorCSAgJiYgKCFzdWJfc3ltYm9sUCB8fCBwY3JlbCkpCisJY29udGludWU7CisKKyNpZmRlZiBUQ19JOTYwCisgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQgJiYgU0ZfR0VUX0NBTExOQU1FIChhZGRfc3ltYm9sUCkpCisJeworCSAgLyogUmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIGFzc29jaWF0ZWQgJ2JhbCcgZW50cnkKKwkgICAgIHBvaW50IHN5bWJvbC4gKi8KKworCSAgaWYgKCFTRl9HRVRfQkFMTkFNRSAodGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCkpKQorCSAgICB7CisJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICAgIF8oIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIpLAorCQkJICAgIFNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKTsKKwl9CisjZW5kaWYKKworICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZDsgdGhpcyBtYXkgbm90IGhhdmUKKyAgICAgICAgIGhhcHBlbmVkIGlmIHRoZXNlIGFyZSBleHByZXNzaW9uIHN5bWJvbHMuICAqLworICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwgJiYgISBhZGRfc3ltYm9sUC0+c3lfcmVzb2x2ZWQpCisJcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2xQLCAxKTsKKworICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwpCisJeworCSAgLyogSWYgdGhpcyBmaXh1cCBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdoaWNoIGhhcyBiZWVuIGVxdWF0ZWQKKwkgICAgIHRvIGFub3RoZXIgc3ltYm9sLCBjb252ZXJ0IGl0IHRvIHRoZSBvdGhlciBzeW1ib2wuICAqLworCSAgaWYgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCisJICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sUCkKKwkJICB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKSkKKwkgICAgeworCSAgICAgIHdoaWxlIChhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAorCQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbFApCisJCQkgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkpCisJCXsKKwkJICBzeW1ib2xTICpuOworCisJCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1ciB3aXRoIGEKKwkJICAgICBiYWRseSB3cml0dGVuIHByb2dyYW0uICAqLworCQkgIG4gPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOworCQkgIGlmIChuID09IGFkZF9zeW1ib2xQKQorCQkgICAgYnJlYWs7CisJCSAgYWRkX251bWJlciArPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOworCQkgIGFkZF9zeW1ib2xQID0gbjsKKwkJfQorCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFA7CisJICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHN1Yl9zeW1ib2xQICE9IE5VTEwgJiYgISBzdWJfc3ltYm9sUC0+c3lfcmVzb2x2ZWQpCisJcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN1Yl9zeW1ib2xQLCAxKTsKKworICAgICAgaWYgKGFkZF9zeW1ib2xQICE9IE5VTEwKKwkgICYmIGFkZF9zeW1ib2xQLT5zeV9tcmlfY29tbW9uKQorCXsKKwkgIGtub3cgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sKTsKKwkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKKwkgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7CisJICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKKwl9CisKKyAgICAgIGlmIChhZGRfc3ltYm9sUCkKKwl7CisJICBhZGRfc3ltYm9sX3NlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCk7CisJfQkJCS8qIGlmIHRoZXJlIGlzIGFuIGFkZGVuZCAqLworCisgICAgICBpZiAoc3ViX3N5bWJvbFApCisJeworCSAgaWYgKGFkZF9zeW1ib2xQID09IE5VTEwgfHwgYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCisJICAgIHsKKwkgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKKwkJeworCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKKwkJICBhZGRfc3ltYm9sUCA9IE5VTEw7CisJCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOworCQl9CisKKwkgICAgICAvKiBJdCdzIGp1c3QgLXN5bS4gICovCisJICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorCQl7CisJCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOworCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKKwkJICBmaXhQLT5meF9kb25lID0gMTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworI2lmbmRlZiBUQ19NNjhLCisJCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJCV8oIk5lZ2F0aXZlIG9mIG5vbi1hYnNvbHV0ZSBzeW1ib2wgJXMiKSwKKwkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCkpOworI2VuZGlmCisJCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOworCQl9CQkvKiBub3QgYWJzb2x1dGUgKi8KKworCSAgICAgIC8qIGlmIHN1Yl9zeW1ib2wgaXMgaW4gdGhlIHNhbWUgc2VnbWVudCB0aGF0IGFkZF9zeW1ib2wKKwkJIGFuZCBhZGRfc3ltYm9sIGlzIGVpdGhlciBpbiBEQVRBLCBURVhULCBCU1Mgb3IgQUJTT0xVVEUgKi8KKwkgICAgfQorCSAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFkZF9zeW1ib2xfc2VnbWVudAorCQkgICAmJiBTRUdfTk9STUFMIChhZGRfc3ltYm9sX3NlZ21lbnQpKQorCSAgICB7CisJICAgICAgLyogRGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMgZnJvbSBzYW1lIHNlZ21lbnQuICBDYW4ndAorCQkgbWFrZSBkaWZmZXJlbmNlIG9mIDIgdW5kZWZpbmVkczogJ3ZhbHVlJyBtZWFucworCQkgc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgTl9VTkRGLiAqLworI2lmZGVmIFRDX0k5NjAKKwkgICAgICAvKiBNYWtlcyBubyBzZW5zZSB0byB1c2UgdGhlIGRpZmZlcmVuY2Ugb2YgMiBhcmJpdHJhcnkgc3ltYm9scworCSAgICAgICAgIGFzIHRoZSB0YXJnZXQgb2YgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KKwkgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCisJCXsKKwkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkJXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiKSk7CisJCX0KKyNlbmRpZiAvKiBUQ19JOTYwICovCisJICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApIC0KKwkJU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKKwkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7CisKKwkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQorCQl7CisJCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOworCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKKwkJICBmaXhQLT5meF9kb25lID0gMTsKKyNpZmRlZiBUQ19NNjhLIC8qIGlzIHRoaXMgcmlnaHQ/ICovCisJCSAgcGNyZWwgPSAwOworCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKKyNlbmRpZgorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIERpZmZlcmVudCBzZWdtZW50cyBpbiBzdWJ0cmFjdGlvbi4gKi8KKwkgICAgICBrbm93ICghKFNfSVNfRVhURVJOQUwgKHN1Yl9zeW1ib2xQKSAmJiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKSk7CisKKwkgICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKKwkJeworCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKKwkJfQorI2lmZGVmIERJRkZfRVhQUl9PSworCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZQorI2lmIDAgLyogT2theSBmb3IgNjhrLCBhdCBsZWFzdC4uLiAqLworCQkgICAgICAgJiYgIXBjcmVsCisjZW5kaWYKKwkJICAgICAgICkKKwkJeworCQkgIC8qIE1ha2UgaXQgcGMtcmVsYXRpdmUuICAqLworCQkgIGFkZF9udW1iZXIgKz0gKG1kX3BjcmVsX2Zyb20gKGZpeFApCisJCQkJIC0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKSk7CisJCSAgcGNyZWwgPSAxOworCQkgIGZpeFAtPmZ4X3BjcmVsID0gMTsKKwkJICBzdWJfc3ltYm9sUCA9IDA7CisJCSAgZml4UC0+Znhfc3Vic3kgPSAwOworCQl9CisjZW5kaWYKKwkgICAgICBlbHNlCisJCXsKKwkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkJXygiQ2FuJ3QgZW1pdCByZWxvYyB7LSAlcy1zZWcgc3ltYm9sIFwiJXNcIn0gQCBmaWxlIGFkZHJlc3MgJWxkLiIpLAorCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApKSwKKwkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCksCisJCQkJKGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7CisJCX0JCS8qIGlmIGFic29sdXRlICovCisJICAgIH0KKwl9CQkJLyogaWYgc3ViX3N5bWJvbFAgKi8KKworICAgICAgaWYgKGFkZF9zeW1ib2xQKQorCXsKKwkgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdGhpc19zZWdtZW50X3R5cGUgJiYgcGNyZWwpCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIFRoaXMgZml4dXAgd2FzIG1hZGUgd2hlbiB0aGUgc3ltYm9sJ3Mgc2VnbWVudCB3YXMKKwkgICAgICAgKiBTRUdfVU5LTk9XTiwgYnV0IGl0IGlzIG5vdyBpbiB0aGUgbG9jYWwgc2VnbWVudC4KKwkgICAgICAgKiBTbyB3ZSBrbm93IGhvdyB0byBkbyB0aGUgYWRkcmVzcyB3aXRob3V0IHJlbG9jYXRpb24uCisJICAgICAgICovCisjaWZkZWYgVENfSTk2MAorCSAgICAgIC8qIHJlbG9jX2NhbGxqKCkgbWF5IHJlcGxhY2UgYSAnY2FsbCcgd2l0aCBhICdjYWxscycgb3IgYSAnYmFsJywKKwkgICAgICAgKiBpbiB3aGljaCBjYXNlcyBpdCBtb2RpZmllcyAqZml4UCBhcyBhcHByb3ByaWF0ZS4gIEluIHRoZSBjYXNlCisJICAgICAgICogb2YgYSAnY2FsbHMnLCBubyBmdXJ0aGVyIHdvcmsgaXMgcmVxdWlyZWQsIGFuZCAqZml4UCBoYXMgYmVlbgorCSAgICAgICAqIHNldCB1cCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBjb2RlIGJlbG93IGEgbm8tb3AuCisJICAgICAgICovCisJICAgICAgcmVsb2NfY2FsbGogKGZpeFApOworI2VuZGlmIC8qIFRDX0k5NjAgKi8KKworCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKKwkgICAgICBhZGRfbnVtYmVyIC09IG1kX3BjcmVsX2Zyb20gKGZpeFApOworCisJICAgICAgLyogV2UgdXNlZCB0byBkbworCQkgICBhZGRfbnVtYmVyIC09IHNlZ1AtPnNjbmhkci5zX3ZhZGRyOworCQkgaWYgZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkuICBJIG5vdworCQkgdGhpbmsgdGhhdCB3YXMgYW4gZXJyb3IgcHJvcGFnYXRlZCBmcm9tIHRoZSBjYXNlIHdoZW4KKwkJIHdlIGFyZSBnb2luZyB0byBlbWl0IHRoZSByZWxvY2F0aW9uLiAgSWYgd2UgYXJlIG5vdAorCQkgZ29pbmcgdG8gZW1pdCB0aGUgcmVsb2NhdGlvbiwgdGhlbiB3ZSBqdXN0IHdhbnQgdG8KKwkJIHNldCBhZGRfbnVtYmVyIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbHMuCisJCSBUaGlzIGlzIGEgY2FzZSB0aGF0IHdvdWxkIG9ubHkgYXJpc2Ugd2hlbiB0aGVyZSBpcyBhCisJCSBQQyByZWxhdGl2ZSByZWZlcmVuY2UgZnJvbSBhIHNlY3Rpb24gb3RoZXIgdGhhbiAudGV4dAorCQkgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgc2FtZSBzZWN0aW9uLCBhbmQgdGhlCisJCSByZWZlcmVuY2UgaXMgbm90IHJlbGF4ZWQuICBTaW5jZSBqdW1wIGluc3RydWN0aW9ucyBvbgorCQkgdGhlIGkzODYgYXJlIHJlbGF4ZWQsIHRoaXMgY291bGQgb25seSBhcmlzZSB3aXRoIGEKKwkJIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLworCisJICAgICAgcGNyZWwgPSAwOwkvKiBMaWUuIERvbid0IHdhbnQgZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLworCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCisJCXsKKwkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7CisJCSAgZml4UC0+ZnhfZG9uZSA9IDE7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3dpdGNoIChhZGRfc3ltYm9sX3NlZ21lbnQpCisJCXsKKwkJY2FzZSBhYnNvbHV0ZV9zZWN0aW9uOgorI2lmZGVmIFRDX0k5NjAKKwkJICByZWxvY19jYWxsaiAoZml4UCk7CS8qIFNlZSBjb21tZW50IGFib3V0IHJlbG9jX2NhbGxqKCkgYWJvdmUqLworI2VuZGlmIC8qIFRDX0k5NjAgKi8KKwkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7CisJCSAgYWRkX3N5bWJvbFAgPSBOVUxMOworCisJCSAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKKwkJICAgIHsKKwkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOworCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKKwkJICAgIH0KKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKworCisjaWYgZGVmaW5lZChUQ19BMjlLKSB8fCAoZGVmaW5lZChURV9QRSkgJiYgZGVmaW5lZChUQ19JMzg2KSkgfHwgZGVmaW5lZChUQ19NODhLKQorCQkgIC8qIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBoYW5kbGVkIGluIHRoZSBsaW5rZXIsIGJ1dAorCQkgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yYmlkcy4gICovCisJCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOworI2Vsc2UKKwkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgKworCQkgICAgc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKV0uc2NuaGRyLnNfcGFkZHI7CisjZW5kaWYKKwkJICBicmVhazsKKworCQljYXNlIFNFR19VTktOT1dOOgorI2lmZGVmIFRDX0k5NjAKKwkJICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCisJCSAgICB7CisJCSAgICAgIC8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYQorCQkgICAgICAgKiAxMy1iaXQgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkCisJCSAgICAgICAqIGZvciBsb2NhbCBicmFuY2hlczogZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUKKwkJICAgICAgICogcmVsb2NhdGlvbi4KKwkJICAgICAgICovCisJCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCQkgICAgXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7CisJCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKKwkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQkJLyogQ09CUiAqLworI2VuZGlmIC8qIFRDX0k5NjAgKi8KKyNpZiAoKGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpIHx8IGRlZmluZWQgKFRFX0FVWCkpICYmICFkZWZpbmVkKFRFX1BFKSkgfHwgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKQorCQkgIC8qIDM4NiBDT0ZGIHVzZXMgYSBwZWN1bGlhciBmb3JtYXQgaW4gd2hpY2ggdGhlCisJCSAgICAgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sIGlzIHN0b3JlZCBpbiB0aGUgLnRleHQKKwkJICAgICBzZWdtZW50IChJJ3ZlIGNoZWNrZWQgdGhpcyBvbiBTVlIzLjIgYW5kIFNDTworCQkgICAgIDMuMi4yKSBJYW4gVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uICAqLworCQkgIC8qIFRoaXMgaXMgYWxzbyB0cnVlIGZvciA2OGsgQ09GRiBvbiBzeXN2IG1hY2hpbmVzCisJCSAgICAgKENoZWNrZWQgb24gTW90b3JvbGEgc3lzdjY4IFIzVjYgYW5kIFIzVjcuMSwgYW5kIGFsc28gb24KKwkJICAgICBVTklYIFN5c3RlbSBWL002ODAwMCwgUmVsZWFzZSAxLjAgZnJvbSBBVFQvQmVsbCBMYWJzKQorCQkgICAgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uICovCisJCSAgaWYgKFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpCisJCSAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7CisjZW5kaWYKKwkJICBicmVhazsKKworCisJCX0JCS8qIHN3aXRjaCBvbiBzeW1ib2wgc2VnICovCisJICAgIH0JCQkvKiBpZiBub3QgaW4gbG9jYWwgc2VnICovCisJfQkJCS8qIGlmIHRoZXJlIHdhcyBhICsgc3ltYm9sICovCisKKyAgICAgIGlmIChwY3JlbCkKKwl7CisjaWYgIWRlZmluZWQoVENfTTg4SykgJiYgIShkZWZpbmVkKFRFX1BFKSAmJiBkZWZpbmVkKFRDX0kzODYpKSAmJiAhZGVmaW5lZChUQ19BMjlLKQorCSAgLyogVGhpcyBhZGp1c3RtZW50IGlzIG5vdCBjb3JyZWN0IG9uIHRoZSBtODhrLCBmb3Igd2hpY2ggdGhlCisJICAgICBsaW5rZXIgZG9lcyBhbGwgdGhlIGNvbXB1dGF0aW9uLiAgKi8KKwkgIGFkZF9udW1iZXIgLT0gbWRfcGNyZWxfZnJvbSAoZml4UCk7CisjZW5kaWYKKwkgIGlmIChhZGRfc3ltYm9sUCA9PSAwKQorCSAgICB7CisJICAgICAgZml4UC0+ZnhfYWRkc3kgPSAmYWJzX3N5bWJvbDsKKwkgICAgfQkJCS8qIGlmIHRoZXJlJ3MgYW4gYWRkX3N5bWJvbCAqLworI2lmIGRlZmluZWQgKFRDX0kzODYpIHx8IGRlZmluZWQgKFRFX0xZTlgpIHx8IGRlZmluZWQgKFRDX0k5NjApIHx8IGRlZmluZWQgKFRDX002OEspCisJICAvKiBPbiB0aGUgMzg2IHdlIG11c3QgYWRqdXN0IGJ5IHRoZSBzZWdtZW50IHZhZGRyIGFzIHdlbGwuCisJICAgICBJYW4gVGF5bG9yLgorCisJICAgICBJIGNoYW5nZWQgdGhlIGk5NjAgdG8gd29yayB0aGlzIHdheSBhcyB3ZWxsLiAgVGhpcyBpcworCSAgICAgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IEdOVSBsaW5rZXIgYmVoYXZpb3VyLiAgSSBkbworCSAgICAgbm90IGtub3cgd2hhdCBvdGhlciBpOTYwIENPRkYgYXNzZW1ibGVycyBkby4gIFRoaXMgaXMgbm90CisJICAgICBhIGNvbW1vbiBjYXNlOiBub3JtYWxseSwgb25seSBhc3NlbWJsZXIgY29kZSB3aWxsIGNvbnRhaW4KKwkgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MsIGFuZCBvbmx5IGJyYW5jaGVzIHdoaWNoIGRvIG5vdAorCSAgICAgb3JpZ2luYXRlIGluIHRoZSAudGV4dCBzZWN0aW9uIHdpbGwgaGF2ZSBhIG5vbi16ZXJvCisJICAgICBhZGRyZXNzLgorCisJICAgICBJIGNoYW5nZWQgdGhlIG02OGsgdG8gd29yayB0aGlzIHdheSBhcyB3ZWxsLiAgVGhpcyB3aWxsCisJICAgICBicmVhayBleGlzdGluZyBQQyByZWxhdGl2ZSByZWxvY3MgZnJvbSBzZWN0aW9ucyB3aGljaCBkbworCSAgICAgbm90IHN0YXJ0IGF0IGFkZHJlc3MgMCwgYnV0IGl0IHdpbGwgbWFrZSBsZCAtciB3b3JrLgorCSAgICAgSWFuIFRheWxvciwgNCBPY3QgOTYuICAqLworCisJICBhZGRfbnVtYmVyIC09IHNlZ1AtPnNjbmhkci5zX3ZhZGRyOworI2VuZGlmCisJfQkJCS8qIGlmIHBjcmVsICovCisKKyAgICAgIGlmICghZml4UC0+ZnhfYml0X2ZpeFAgJiYgISBmaXhQLT5meF9ub19vdmVyZmxvdykKKwl7CisjaWZuZGVmIFRDX004OEsKKwkgIC8qIFRoZSBtODhrIHVzZXMgdGhlIG9mZnNldCBmaWVsZCBvZiB0aGUgcmVsb2MgdG8gZ2V0IGFyb3VuZAorCSAgICAgdGhpcyBwcm9ibGVtLiAgKi8KKwkgIGlmICgoc2l6ZSA9PSAxCisJICAgICAgICYmICgoYWRkX251bWJlciAmIH4weEZGKQorCQkgICB8fCAoZml4UC0+Znhfc2lnbmVkICYmIChhZGRfbnVtYmVyICYgMHg4MCkpKQorCSAgICAgICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRikgIT0gKC0xICYgfjB4RkYpCisJCSAgIHx8IChhZGRfbnVtYmVyICYgMHg4MCkgPT0gMCkpCisJICAgICAgfHwgKHNpemUgPT0gMgorCQkgICYmICgoYWRkX251bWJlciAmIH4weEZGRkYpCisJCSAgICAgIHx8IChmaXhQLT5meF9zaWduZWQgJiYgKGFkZF9udW1iZXIgJiAweDgwMDApKSkKKwkJICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRkZGKSAhPSAoLTEgJiB+MHhGRkZGKQorCQkgICAgICB8fCAoYWRkX251bWJlciAmIDB4ODAwMCkgPT0gMCkpKQorCSAgICB7CisJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICAgIF8oIlZhbHVlIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0IDB4JWx4IiksCisJCQkgICAgKGxvbmcpIGFkZF9udW1iZXIsIHNpemUsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7CisJICAgIH0KKyNlbmRpZgorI2lmZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKKwkgIC8qIFdhcm4gaWYgYSAud29yZCB2YWx1ZSBpcyB0b28gbGFyZ2Ugd2hlbiB0cmVhdGVkIGFzIGEKKwkgICAgIHNpZ25lZCBudW1iZXIuICBXZSBhbHJlYWR5IGtub3cgaXQgaXMgbm90IHRvbyBuZWdhdGl2ZS4KKwkgICAgIFRoaXMgaXMgdG8gY2F0Y2ggb3Zlci1sYXJnZSBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uCisJICAgICB0aGUgNjhrLiAgKi8KKwkgIGlmICghZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sKKwkgICAgICAmJiBzaXplID09IDIKKwkgICAgICAmJiBhZGRfbnVtYmVyID4gMHg3ZmZmKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkgIF8oIlNpZ25lZCAud29yZCBvdmVyZmxvdzsgc3dpdGNoIG1heSBiZSB0b28gbGFyZ2U7ICVsZCBhdCAweCVseCIpLAorCQkJICAobG9uZykgYWRkX251bWJlciwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7CisjZW5kaWYKKwl9CQkJLyogbm90IGEgYml0IGZpeCAqLworICAgICAgLyogT25jZSB0aGlzIGZpeCBoYXMgYmVlbiBhcHBsaWVkLCB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dAorCSBhbnl0aGluZyBub3RoaW5nIG1vcmUgbmVlZCBiZSBkb25lLiAgKi8KKyNpZmRlZiBNRF9BUFBMWV9GSVgzCisgICAgICBtZF9hcHBseV9maXgzIChmaXhQLCAodmFsdWVUICopICZhZGRfbnVtYmVyLCB0aGlzX3NlZ21lbnRfdHlwZSk7CisjZWxzZQorICAgICAgbWRfYXBwbHlfZml4IChmaXhQLCBhZGRfbnVtYmVyKTsKKyNlbmRpZgorICAgIH0JCQkJLyogRm9yIGVhY2ggZml4UyBpbiB0aGlzIHNlZ21lbnQuICovCit9CQkJCS8qIGZpeHVwX3NlZ21lbnQoKSAqLworCisjZW5kaWYKKworLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWIgc2VjdGlvbiBpcyBzcGVjaWFsLiAgKi8KKwordm9pZAorb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKKyAgICAgc2VnVCBzZWc7Cit7CisgIGNoYXIgKmZpbGU7CisgIGNoYXIgKnA7CisgIGNoYXIgKnN0YWJzdHJfbmFtZTsKKyAgdW5zaWduZWQgaW50IHN0cm9mZjsKKworICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KKyAgcCA9IGZyYWdfbW9yZSAoMTIpOworICAvKiBaZXJvIGl0IG91dC4gKi8KKyAgbWVtc2V0IChwLCAwLCAxMik7CisgIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKKyAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tzZWddLm5hbWUpICsgNCk7CisgIHN0cmNweSAoc3RhYnN0cl9uYW1lLCBzZWdtZW50X2luZm9bc2VnXS5uYW1lKTsKKyAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKKyAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKKyAga25vdyAoc3Ryb2ZmID09IDEpOworICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Cit9CisKKy8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYiBzZWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2FkanVzdF9zdGFiX3NlY3Rpb24oYWJmZCwgc2VnKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlZ1Qgc2VnOworeworICBzZWdUIHN0YWJzdHJzZWcgPSBTRUdfVU5LTk9XTjsKKyAgY29uc3QgY2hhciAqc2VjbmFtZSwgKm5hbWUyOworICBjaGFyICpuYW1lOworICBjaGFyICpwID0gTlVMTDsKKyAgaW50IGksIHN0cnN6ID0gMCwgbnN5bXM7CisgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW3NlZ10uZnJjaGFpblAtPmZyY2hfcm9vdDsKKworICAvKiBMb29rIGZvciB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUgc2VjdGlvbi4gKi8KKworICBzZWNuYW1lID0gc2VnbWVudF9pbmZvW3NlZ10ubmFtZTsKKyAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWNuYW1lKSArIDQpOworICBzdHJjcHkgKG5hbWUsIHNlY25hbWUpOworICBzdHJjYXQgKG5hbWUsICJzdHIiKTsKKworICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQorICAgIHsKKyAgICAgIG5hbWUyID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7CisgICAgICBpZiAobmFtZTIgIT0gTlVMTCAmJiBzdHJuY21wKG5hbWUyLCBuYW1lLCA4KSA9PSAwKQorCXsKKwkgIHN0YWJzdHJzZWcgPSBpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBmb3VuZCB0aGUgc2VjdGlvbiwgZ2V0IGl0cyBzaXplLiAqLworICBpZiAoc3RhYnN0cnNlZyAhPSBTRUdfVU5LTk9XTikKKyAgICBzdHJzeiA9IHNpemVfc2VjdGlvbiAoYWJmZCwgc3RhYnN0cnNlZyk7CisKKyAgbnN5bXMgPSBzaXplX3NlY3Rpb24gKGFiZmQsIHNlZykgLyAxMiAtIDE7CisKKyAgLyogTG9vayBmb3IgdGhlIGZpcnN0IGZyYWcgb2Ygc3VmZmljaWVudCBzaXplIGZvciB0aGUgaW5pdGlhbCBzdGFiCisgICAgIHN5bWJvbCwgYW5kIGNvbGxlY3QgYSBwb2ludGVyIHRvIGl0LiAqLworICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5mcl9maXggPCAxMikKKyAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKKyAgYXNzZXJ0IChmcmFnICE9IDApOworICBwID0gZnJhZy0+ZnJfbGl0ZXJhbDsKKyAgYXNzZXJ0IChwICE9IDApOworCisgIC8qIFdyaXRlIGluIHRoZSBudW1iZXIgb2Ygc3RhYiBzeW1ib2xzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCisgICAgIHRhYmxlLiAqLworICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKKyAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Cit9CisKKyNlbmRpZiAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLworCitjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJkZWYiLCBvYmpfY29mZl9kZWYsIDB9LAorICB7ImRpbSIsIG9ial9jb2ZmX2RpbSwgMH0sCisgIHsiZW5kZWYiLCBvYmpfY29mZl9lbmRlZiwgMH0sCisgIHsibGluZSIsIG9ial9jb2ZmX2xpbmUsIDB9LAorICB7ImxuIiwgb2JqX2NvZmZfbG4sIDB9LAorICB7ImFwcGxpbmUiLCBvYmpfY29mZl9sbiwgMX0sCisgIHsic2NsIiwgb2JqX2NvZmZfc2NsLCAwfSwKKyAgeyJzaXplIiwgb2JqX2NvZmZfc2l6ZSwgMH0sCisgIHsidGFnIiwgb2JqX2NvZmZfdGFnLCAwfSwKKyAgeyJ0eXBlIiwgb2JqX2NvZmZfdHlwZSwgMH0sCisgIHsidmFsIiwgb2JqX2NvZmZfdmFsLCAwfSwKKyAgeyJzZWN0aW9uIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCisgIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAorICAvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBNUkkgc2hvcnQgYXR0cmlidXRlLiAgKi8KKyAgeyJzZWN0aW9uLnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKKyAgeyJzZWN0LnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKKyAgLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2FzLiAgKi8KKyAgeyJic3MiLCBvYmpfY29mZl9ic3MsIDB9LAorICB7IndlYWsiLCBvYmpfY29mZl93ZWFrLCAwfSwKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICB7InVzZSIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAorICB7InRleHQiLCBvYmpfY29mZl90ZXh0LCAwfSwKKyAgeyJkYXRhIiwgb2JqX2NvZmZfZGF0YSwgMH0sCisgIHsibGNvbW0iLCBvYmpfY29mZl9sY29tbSwgMH0sCisgIHsiaWRlbnQiLCBvYmpfY29mZl9pZGVudCwgMH0sCisjZWxzZQorICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAkvKiBGb3Igc3VuMzg2aSBjYyAoPykgKi8KKyAgeyJpZGVudCIsIHNfaWdub3JlLCAwfSwJLyogd2UgZG9uJ3QgeWV0IGhhbmRsZSB0aGlzLiAqLworI2VuZGlmCisgIHsidmVyc2lvbiIsIHNfaWdub3JlLCAwfSwKKyAgeyJBQk9SVCIsIHNfYWJvcnQsIDB9LAorI2lmZGVmIFRDX004OEsKKyAgLyogVGhlIG04OGsgdXNlcyBzZGVmIGluc3RlYWQgb2YgZGVmLiAgKi8KKyAgeyJzZGVmIiwgb2JqX2NvZmZfZGVmLCAwfSwKKyNlbmRpZgorICB7TlVMTH0JCQkvKiBlbmQgc2VudGluZWwgKi8KK307CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KKwwKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKKy8qIFN1cHBvcnQgZm9yIGEgQ09GRiBlbXVsYXRpb24uICAqLworCitzdGF0aWMgdm9pZAorY29mZl9wb3BfaW5zZXJ0ICgpCit7CisgIHBvcF9pbnNlcnQgKG9ial9wc2V1ZG9fdGFibGUpOworfQorCitzdGF0aWMgaW50Citjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCisgICAgIGFzZWN0aW9uICpzZWM7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbm9fZnVuYyAoKQoreworICBhYm9ydCAoKTsKK30KKworY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgY29mZl9mb3JtYXRfb3BzID0KK3sKKyAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgIDAsCisgIDEsCisgIGNvZmZfZnJvYl9zeW1ib2wsCisgIG5vX2Z1bmMsCisgIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcywKKyAgMCwgMCwKKyAgMCwgMCwKKyAgMCwKKyNpZiAwCisgIG9ial9nZW5lcmF0ZV9hc21fbGluZW5vLAorI2Vsc2UKKyAgbm9fZnVuYywKKyNlbmRpZgorI2lmIDAKKyAgb2JqX3N0YWIsCisjZWxzZQorICBub19mdW5jLAorI2VuZGlmCisgIGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCisgIGNvZmZfcG9wX2luc2VydCwKKyNpZiAwCisgIG9ial9zZXRfZXh0LAorI2Vsc2UKKyAgbm9fZnVuYywKKyNlbmRpZgorICBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2ssCisgIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vaywKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTA0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1jb2ZmLmgKQEAgLTAsMCArMSw4NDEgQEAKKy8qIGNvZmYgb2JqZWN0IGZpbGUgZm9ybWF0CisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBPQkpfRk9STUFUX0gKKyNkZWZpbmUgT0JKX0ZPUk1BVF9ICisKKyNkZWZpbmUgT0JKX0NPRkYgMQorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisjZGVmaW5lIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKKyNkZWZpbmUgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKKyNkZWZpbmUgQkZEX0hFQURFUlMKKyNkZWZpbmUgQkZECisKKyNlbmRpZgorCisjaW5jbHVkZSAidGFyZy1jcHUuaCIKKworI2luY2x1ZGUgImJmZC5oIgorCisvKiBUaGlzIGludGVybmFsX2xpbmVubyBjcmFwIGlzIHRvIHN0b3AgbmFtZXNwYWNlIHBvbGx1dGlvbiBmcm9tIHRoZQorICAgYmZkIGludGVybmFsIGNvZmYgaGVhZGVyZmlsZS4gKi8KKyNkZWZpbmUgaW50ZXJuYWxfbGluZW5vIGJmZF9pbnRlcm5hbF9saW5lbm8KKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjdW5kZWYgaW50ZXJuYWxfbGluZW5vCisKKy8qIENQVS1zcGVjaWZpYyBzZXR1cDogICovCisKKyNpZmRlZiBUQ19BUk0KKyNpbmNsdWRlICJjb2ZmL2FybS5oIgorI2lmbmRlZiBUQVJHRVRfRk9STUFUCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYXJtIgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFRDX1BQQworI2lmZGVmIFRFX1BFCisjaW5jbHVkZSAiY29mZi9wb3dlcnBjLmgiCisjZWxzZQorI2luY2x1ZGUgImNvZmYvcnM2MDAwLmgiCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVENfU1BBUkMKKyNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCisjZW5kaWYKKworI2lmZGVmIFRDX0kzODYKKyNpbmNsdWRlICJjb2ZmL2kzODYuaCIKKworI2lmZGVmIFRFX1BFCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgInBlLWkzODYiCisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfRk9STUFUCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaTM4NiIKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBUQ19NNjhLCisjaW5jbHVkZSAiY29mZi9tNjhrLmgiCisjaWZuZGVmIFRBUkdFVF9GT1JNQVQKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1tNjhrIgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFRDX0EyOUsKKyNpbmNsdWRlICJjb2ZmL2EyOWsuaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1hMjlrLWJpZyIKKyNlbmRpZgorCisjaWZkZWYgVENfSTk2MAorI2luY2x1ZGUgImNvZmYvaTk2MC5oIgorI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLUludGVsLWxpdHRsZSIKKyNlbmRpZgorCisjaWZkZWYgVENfWjhLCisjaW5jbHVkZSAiY29mZi96OGsuaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi16OGsiCisjZW5kaWYKKworI2lmZGVmIFRDX0g4MzAwCisjaW5jbHVkZSAiY29mZi9oODMwMC5oIgorI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWg4MzAwIgorI2VuZGlmCisKKyNpZmRlZiBUQ19IODUwMAorI2luY2x1ZGUgImNvZmYvaDg1MDAuaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODUwMCIKKyNlbmRpZgorCisjaWZkZWYgVENfU0gKKyNpbmNsdWRlICJjb2ZmL3NoLmgiCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQJCQkJCVwKKyAgKHNobAkJCQkJCQlcCisgICA/IChzaF9zbWFsbCA/ICJjb2ZmLXNobC1zbWFsbCIgOiAiY29mZi1zaGwiKQkJXAorICAgOiAoc2hfc21hbGwgPyAiY29mZi1zaC1zbWFsbCIgOiAiY29mZi1zaCIpKQorI2VuZGlmCisKKyNpZmRlZiBUQ19NODhLCisjaW5jbHVkZSAiY29mZi9tODhrLmgiCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTg4a2JjcyIKKyNlbmRpZgorCisjaWZkZWYgVENfVzY1CisjaW5jbHVkZSAiY29mZi93NjUuaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi13NjUiCisjZW5kaWYKKworI2lmZGVmIFRDX1RJQzMwCisjaW5jbHVkZSAiY29mZi90aWMzMC5oIgorI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLXRpYzMwIgorI2VuZGlmCisKKyNpZmRlZiBUQ19USUM4MAorI2luY2x1ZGUgImNvZmYvdGljODAuaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi10aWM4MCIKKyNkZWZpbmUgQUxJR05NRU5UX0lOX1NfRkxBR1MgMQorI2VuZGlmCisKKyNpZmRlZiBUQ19NQ09SRQorI2luY2x1ZGUgImNvZmYvbWNvcmUuaCIKKyNpZm5kZWYgVEFSR0VUX0ZPUk1BVAorI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1tY29yZSIKKyNlbmRpZgorI2VuZGlmCisKKy8qIFRhcmdldHMgbWF5IGFsc28gc2V0IHRoaXMuICBBbHNvLCBpZiBCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQsIHRoaXMKKyAgIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZGVmaW5lZC4gICovCisjdW5kZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUworI2RlZmluZSBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTIDEKKworI2lmbmRlZiBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUworI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUyAxCisjZW5kaWYgLyogT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgKi8KKworZXh0ZXJuIHZvaWQgY29mZl9vYmpfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vaworCitleHRlcm4gdm9pZCBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rIGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vaworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICBUaGlzIGZpbGUgcmVhbGx5IGNvbnRhaW5zIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIENPRkYgYmFjayBlbmQuCisgICBUaGV5IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtZXJnZWQsIGJ1dCB0aGlzIGlzIG9ubHkgYQorICAgcHJlbGltaW5hcnksIG1lY2hhbmljYWwgbWVyZ2luZy4gIE1hbnkgZGVmaW5pdGlvbnMgdGhhdCBhcmUKKyAgIGlkZW50aWNhbCBiZXR3ZWVuIHRoZSB0d28gYXJlIHN0aWxsIGZvdW5kIGluIGJvdGggdmVyc2lvbnMuCisKKyAgIFRoZSBmaXJzdCB2ZXJzaW9uLCB3aXRoIEJGRF9BU1NFTUJMRVIgZGVmaW5lZCwgdXNlcyBoaWdoLWxldmVsIEJGRAorICAgaW50ZXJmYWNlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiAgVGhlIHNlY29uZCB2ZXJzaW9uLCB3aXRoCisgICBCRkRfQVNTRU1CTEVSIG5vdCBkZWZpbmVkLCBhbHNvIHVzZXMgQkZELCBidXQgbW9zdGx5IGZvciBzd2FwcGluZworICAgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmb3IgZG9pbmcgdGhlIGFjdHVhbCBJL08uICBUaGUgbGF0dGVyIGRlZmluZXMKKyAgIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9scyBCRkQgYW5kIEJGRF9IRUFERVJTLiAgVHJ5IG5vdCB0byBsZXQgdGhpcworICAgY29uZnVzZSB5b3UuCisKKyAgIFRoZXNlIHR3byBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWVyZ2VkLCBhbmQgZXZlbnR1YWxseSB0aGUKKyAgIEJGRF9BU1NFTUJMRVIgdmVyc2lvbiBzaG91bGQgdGFrZSBvdmVyIGNvbXBsZXRlbHkuICBSZWxlYXNlIHRpbWluZworICAgaXNzdWVzIGFuZCBuYW1lc3BhY2UgcHJvYmxlbXMgY29udmluY2VkIG1lIHRvIG1lcmdlIHRoZSB0d28KKyAgIHRvZ2V0aGVyIGluIHRoaXMgZmFzaGlvbiwgYSBsaXR0bGUgc29vbmVyIHRoYW4gSSB3b3VsZCBoYXZlIGxpa2VkLgorICAgVGhlIHJlYWwgbWVyZ2Ugc2hvdWxkIGJlIG11Y2ggYmV0dGVyIGRvbmUgYnkgdGhlIHRpbWUgdGhlIG5leHQKKyAgIHJlbGVhc2UgY29tZXMgb3V0LgorCisgICBGb3Igbm93LCB0aGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpczoKKwk8Y29tbW9uPgorCSNpZmRlZiBCRkRfQVNTRU1CTEVSCisJPG9uZSB2ZXJzaW9uPgorCSNlbHNlCisJPG90aGVyIHZlcnNpb24+CisJI2VuZGlmCisJPGNvbW1vbj4KKyAgIFVuZm9ydHVuYXRlbHksIHRoZSBjb21tb24gcG9ydGlvbnMgYXJlIHZlcnkgc21hbGwgYXQgdGhlIG1vbWVudCwKKyAgIGFuZCBtYW55IGRlY2xhcmF0aW9ucyBvciBkZWZpbml0aW9ucyBhcmUgZHVwbGljYXRlZC4gIFRoZSBzdHJ1Y3R1cmUKKyAgIG9mIG9iai1jb2ZmLmMgaXMgc2ltaWxhci4KKworICAgU2VlIGRvYy9pbnRlcm5hbHMudGV4aSBmb3IgYSBicmllZiBkaXNjdXNzaW9uIG9mIHRoZSBoaXN0b3J5LCBpZgorICAgeW91IGNhcmUuCisKKyAgIEtlbiBSYWVidXJuLCA1IE1heSAxOTk0CisKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKKyNpbmNsdWRlICJiZmQvbGliY29mZi5oIgorCisjZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKKworLyogU1lNQk9MIFRBQkxFICovCisKKy8qIEFsdGVyIHRoZSBmaWVsZCBuYW1lcywgZm9yIG5vdywgdW50aWwgd2UndmUgZml4ZWQgdXAgdGhlIG90aGVyCisgICByZWZlcmVuY2VzIHRvIHVzZSB0aGUgbmV3IG5hbWUuICAqLworI2lmZGVmIFRDX0k5NjAKKyNkZWZpbmUgVENfU1lNRklFTERfVFlQRQlzdHJ1Y3Qgc3ltYm9sICoKKyNkZWZpbmUgc3lfdGMJCQliYWwKKyNlbmRpZgorCisjZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFCXVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgc3lfb2JqCQkJc3lfZmxhZ3MKKworI2RlZmluZSBTWU1fQVVYRU5UKFMpCSgmY29mZnN5bWJvbCAoKFMpLT5ic3ltKS0+bmF0aXZlWzFdLnUuYXV4ZW50KQorI2RlZmluZSBTWU1fQVVYSU5GTyhTKQkoJmNvZmZzeW1ib2wgKChTKS0+YnN5bSktPm5hdGl2ZVsxXSkKKworI2RlZmluZSBET19OT1RfU1RSSVAJMAorCitleHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOworCisvKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCisjZGVmaW5lIFNfR0VUX05VTUJFUl9BVVhJTElBUlkocykJKGNvZmZzeW1ib2woKHMpLT5ic3ltKS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKKy8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KKyNkZWZpbmUgU19TRVRfTlVNQkVSX0FVWElMSUFSWShzLHYpCShTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzKSA9ICh2KSkKKworLyogVHJ1ZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBzdHJpbmcgdGFibGUsIGkuZS4gaXRzIGxlbmd0aCBpcyA+IDguICovCisjZGVmaW5lIFNfSVNfU1RSSU5HKHMpCQkoc3RybGVuKFNfR0VUX05BTUUocykpID4gOCA/IDEgOiAwKQorCitleHRlcm4gaW50IFNfU0VUX0RBVEFfVFlQRSBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIGludCkpOworZXh0ZXJuIGludCBTX1NFVF9TVE9SQUdFX0NMQVNTIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgaW50KSk7CitleHRlcm4gaW50IFNfR0VUX1NUT1JBR0VfQ0xBU1MgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CitleHRlcm4gdm9pZCBTQV9TRVRfU1lNX0VORE5EWCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIHN0cnVjdCBzeW1ib2wgKikpOworCisvKiBBdXhpbGlhcnkgZW50cnkgbWFjcm9zLiBTQV8gc3RhbmRzIGZvciBzeW1ib2wgYXV4aWxpYXJ5ICovCisvKiBPbWl0IHRoZSB0diByZWxhdGVkIGZpZWxkcyAqLworLyogQWNjZXNzb3JzICovCisKKyNkZWZpbmUgU0FfR0VUX1NZTV9UQUdORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sKQorI2RlZmluZSBTQV9HRVRfU1lNX0xOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKKyNkZWZpbmUgU0FfR0VUX1NZTV9TSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCisjZGVmaW5lIFNBX0dFVF9TWU1fRlNJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZSkKKyNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PUFRSKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQorI2RlZmluZSBTQV9HRVRfU1lNX0VORE5EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4KQorI2RlZmluZSBTQV9HRVRfU1lNX0RJTUVOKHMsaSkJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV0pCisjZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FKHMpCShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUpCisjZGVmaW5lIFNBX0dFVF9TQ05fU0NOTEVOKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW4pCisjZGVmaW5lIFNBX0dFVF9TQ05fTlJFTE9DKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2MpCisjZGVmaW5lIFNBX0dFVF9TQ05fTkxJTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm8pCisKKyNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubz0odikpCisjZGVmaW5lIFNBX1NFVF9TWU1fU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU9KHYpKQorI2RlZmluZSBTQV9TRVRfU1lNX0ZTSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZT0odikpCisjZGVmaW5lIFNBX1NFVF9TWU1fTE5OT1BUUihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NZTV9ESU1FTihzLGksdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV09KHYpKQorI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRShzLHYpCXN0cm5jcHkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lLCh2KSxGSUxOTUxFTikKKyNkZWZpbmUgU0FfU0VUX1NDTl9TQ05MRU4ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NDTl9OUkVMT0Mocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NDTl9OTElOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vPSh2KSkKKworLyoKKyAqIEludGVybmFsIHVzZSBvbmx5IGRlZmluaXRpb25zLiBTRl8gc3RhbmRzIGZvciBzeW1ib2wgZmxhZ3MuCisgKgorICogVGhlc2UgdmFsdWVzIGNhbiBiZSBhc3NpZ25lZCB0byBzeV9zeW1ib2wub3N0X2ZsYWdzIGZpZWxkIG9mIGEgc3ltYm9sUy4KKyAqCisgKiBZb3UnbGwgYnJlYWsgaTk2MCBpZiB5b3Ugc2hpZnQgdGhlIFNZU1BST0MgYml0cyBhbnl3aGVyZSBlbHNlLiAgZm9yCisgKiBtb3JlIG9uIHRoZSBiYWxuYW1lL2NhbGxuYW1lIGhhY2ssIHNlZSB0Yy1pOTYwLmguICBiLm91dCBpcyBkb25lCisgKiBkaWZmZXJlbnRseS4KKyAqLworCisjZGVmaW5lIFNGX0k5NjBfTUFTSwkoMHgwMDAwMDFmZikJLyogQml0cyAwLTggYXJlIHVzZWQgYnkgdGhlIGk5NjAgcG9ydC4gKi8KKyNkZWZpbmUgU0ZfU1lTUFJPQwkoMHgwMDAwMDAzZikJLyogYml0cyAwLTUgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIHN5c3Byb2MgbnVtYmVyICovCisjZGVmaW5lIFNGX0lTX1NZU1BST0MJKDB4MDAwMDAwNDApCS8qIGJpdCA2IG1hcmtzIHN5bWJvbHMgdGhhdCBhcmUgc3lzcHJvY3MgKi8KKyNkZWZpbmUgU0ZfQkFMTkFNRQkoMHgwMDAwMDA4MCkJLyogYml0IDcgbWFya3MgQkFMTkFNRSBzeW1ib2xzICovCisjZGVmaW5lIFNGX0NBTExOQU1FCSgweDAwMDAwMTAwKQkvKiBiaXQgOCBtYXJrcyBDQUxMTkFNRSBzeW1ib2xzICovCisKKyNkZWZpbmUgU0ZfTk9STUFMX01BU0sJKDB4MDAwMGZmZmYpCS8qIGJpdHMgMTItMTUgYXJlIGdlbmVyYWwgcHVycG9zZS4gKi8KKworI2RlZmluZSBTRl9TVEFUSUNTCSgweDAwMDAxMDAwKQkvKiBNYXJrIHRoZSAudGV4dCAmIGFsbCBzeW1ib2xzICovCisjZGVmaW5lIFNGX0RFRklORUQJKDB4MDAwMDIwMDApCS8qIFN5bWJvbCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLworI2RlZmluZSBTRl9TVFJJTkcJKDB4MDAwMDQwMDApCS8qIFN5bWJvbCBuYW1lIGxlbmd0aCA+IDggKi8KKyNkZWZpbmUgU0ZfTE9DQUwJKDB4MDAwMDgwMDApCS8qIFN5bWJvbCBtdXN0IG5vdCBiZSBlbWl0dGVkICovCisKKyNkZWZpbmUgU0ZfREVCVUdfTUFTSwkoMHhmZmZmMDAwMCkJLyogYml0cyAxNi0zMSBhcmUgZGVidWcgaW5mbyAqLworCisjZGVmaW5lIFNGX0ZVTkNUSU9OCSgweDAwMDEwMDAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgZnVuY3Rpb24gKi8KKyNkZWZpbmUgU0ZfUFJPQ0VTUwkoMHgwMDAyMDAwMCkJLyogUHJvY2VzcyBzeW1ib2wgYmVmb3JlIHdyaXRlICovCisjZGVmaW5lIFNGX1RBR0dFRAkoMHgwMDA0MDAwMCkJLyogSXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFnICovCisjZGVmaW5lIFNGX1RBRwkJKDB4MDAwODAwMDApCS8qIElzIGEgdGFnICovCisjZGVmaW5lIFNGX0RFQlVHCSgweDAwMTAwMDAwKQkvKiBJcyBpbiBkZWJ1ZyBvciBhYnMgc2VjdGlvbiAqLworI2RlZmluZSBTRl9HRVRfU0VHTUVOVAkoMHgwMDIwMDAwMCkJLyogR2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBmb3J3YXJkIHN5bWJvbC4gKi8KKy8qIEFsbCBvdGhlciBiaXRzIGFyZSB1bnVzZWQuICovCisKKy8qIEFjY2Vzc29ycyAqLworI2RlZmluZSBTRl9HRVQocykJCSgocyktPnN5X2ZsYWdzKQorI2RlZmluZSBTRl9HRVRfREVCVUcocykJCSgocyktPmJzeW0tPmZsYWdzICYgQlNGX0RFQlVHR0lORykKKyNkZWZpbmUgU0ZfU0VUX0RFQlVHKHMpCQkoKHMpLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HKQorI2RlZmluZSBTRl9HRVRfTk9STUFMX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfTk9STUFMX01BU0spCisjZGVmaW5lIFNGX0dFVF9ERUJVR19GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFQlVHX01BU0spCisjZGVmaW5lIFNGX0dFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0ZJTEUpCisjZGVmaW5lIFNGX0dFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RBVElDUykKKyNkZWZpbmUgU0ZfR0VUX0RFRklORUQocykJKFNGX0dFVCAocykgJiBTRl9ERUZJTkVEKQorI2RlZmluZSBTRl9HRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpICYgU0ZfU1RSSU5HKQorI2RlZmluZSBTRl9HRVRfTE9DQUwocykJCShTRl9HRVQgKHMpICYgU0ZfTE9DQUwpCisjZGVmaW5lIFNGX0dFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpICYgU0ZfRlVOQ1RJT04pCisjZGVmaW5lIFNGX0dFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpICYgU0ZfUFJPQ0VTUykKKyNkZWZpbmUgU0ZfR0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSAmIFNGX1RBR0dFRCkKKyNkZWZpbmUgU0ZfR0VUX1RBRyhzKQkJKFNGX0dFVCAocykgJiBTRl9UQUcpCisjZGVmaW5lIFNGX0dFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSAmIFNGX0dFVF9TRUdNRU5UKQorI2RlZmluZSBTRl9HRVRfSTk2MChzKQkJKFNGX0dFVCAocykgJiBTRl9JOTYwX01BU0spCS8qIHVzZWQgYnkgaTk2MCAqLworI2RlZmluZSBTRl9HRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLworI2RlZmluZSBTRl9HRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX0dFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX0dFVF9TWVNQUk9DKHMpCShTRl9HRVQgKHMpICYgU0ZfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCisKKy8qIE1vZGlmaWVycyAqLworI2RlZmluZSBTRl9TRVQocyx2KQkJKFNGX0dFVCAocykgPSAodikpCisjZGVmaW5lIFNGX1NFVF9OT1JNQUxfRklFTEQocyx2KShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9OT1JNQUxfTUFTSykpCisjZGVmaW5lIFNGX1NFVF9ERUJVR19GSUVMRChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9ERUJVR19NQVNLKSkKKyNkZWZpbmUgU0ZfU0VUX0ZJTEUocykJCShTRl9HRVQgKHMpIHw9IFNGX0ZJTEUpCisjZGVmaW5lIFNGX1NFVF9TVEFUSUNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUQVRJQ1MpCisjZGVmaW5lIFNGX1NFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpIHw9IFNGX0RFRklORUQpCisjZGVmaW5lIFNGX1NFVF9TVFJJTkcocykJKFNGX0dFVCAocykgfD0gU0ZfU1RSSU5HKQorI2RlZmluZSBTRl9TRVRfTE9DQUwocykJCShTRl9HRVQgKHMpIHw9IFNGX0xPQ0FMKQorI2RlZmluZSBTRl9DTEVBUl9MT0NBTChzKQkoU0ZfR0VUIChzKSAmPSB+U0ZfTE9DQUwpCisjZGVmaW5lIFNGX1NFVF9GVU5DVElPTihzKSAgICAgIChTRl9HRVQgKHMpIHw9IFNGX0ZVTkNUSU9OKQorI2RlZmluZSBTRl9TRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9QUk9DRVNTKQorI2RlZmluZSBTRl9TRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpIHw9IFNGX1RBR0dFRCkKKyNkZWZpbmUgU0ZfU0VUX1RBRyhzKQkJKFNGX0dFVCAocykgfD0gU0ZfVEFHKQorI2RlZmluZSBTRl9TRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgfD0gU0ZfR0VUX1NFR01FTlQpCisjZGVmaW5lIFNGX1NFVF9JOTYwKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0k5NjBfTUFTSykpCS8qIHVzZWQgYnkgaTk2MCAqLworI2RlZmluZSBTRl9TRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKyNkZWZpbmUgU0ZfU0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKyNkZWZpbmUgU0ZfU0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgfD0gU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX1NFVF9TWVNQUk9DKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX1NZU1BST0MpKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKworLyogLS0tLS0tLS0tLS0tLS0gIExpbmUgbnVtYmVyIGhhbmRsaW5nIC0tLS0tLS0gKi8KK2V4dGVybiBpbnQgdGV4dF9saW5lbm9fbnVtYmVyOworZXh0ZXJuIGludCBjb2ZmX2xpbmVfYmFzZTsKK2V4dGVybiBpbnQgY29mZl9uX2xpbmVfbm9zOworCisjZGVmaW5lIG9ial9lbWl0X2xpbmVubyhXSEVSRSxMSU5FLEZJTEVfU1RBUlQpCWFib3J0ICgpCitleHRlcm4gdm9pZCBjb2ZmX2FkZF9saW5lc3ltIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworCisKK3ZvaWQgY19kb3RfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKKyNkZWZpbmUgb2JqX2FwcF9maWxlIGNfZG90X2ZpbGVfc3ltYm9sCisKK2V4dGVybiB2b2lkIGNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBpbnQgKikpOworZXh0ZXJuIHZvaWQgY29mZl9hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGNvZmZfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKK2V4dGVybiB2b2lkIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CitleHRlcm4gdm9pZCBjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woUyxQKSAJY29mZl9mcm9iX3N5bWJvbChTLCZQKQorI2lmbmRlZiBvYmpfYWRqdXN0X3N5bXRhYgorI2RlZmluZSBvYmpfYWRqdXN0X3N5bXRhYigpCWNvZmZfYWRqdXN0X3N5bXRhYigpCisjZW5kaWYKKyNkZWZpbmUgb2JqX2Zyb2Jfc2VjdGlvbihTKQljb2ZmX2Zyb2Jfc2VjdGlvbiAoUykKKyNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MoKSBjb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKmNvZmZfbGFzdF9mdW5jdGlvbjsKKworLyogRm9yd2FyZCB0aGUgc2VnbWVudCBvZiBhIGZvcndhcmRlZCBzeW1ib2wsIGhhbmRsZSBhc3NpZ25tZW50cyB0aGF0CisgICBqdXN0IGNvcHkgc3ltYm9sIHZhbHVlcywgZXRjLiAgKi8KKyNpZm5kZWYgVEVfSTM4NkFJWAorI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAorICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSBcCisgICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAorICAgOiAwKQorI2Vsc2UKKyNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoZGVzdCxzcmMpIFwKKyAgKFNGX0dFVF9HRVRfU0VHTUVOVCAoZGVzdCkgJiYgU19HRVRfU0VHTUVOVCAoZGVzdCkgPT0gU0VHX1VOS05PV04gXAorICAgPyAoU19TRVRfU0VHTUVOVCAoZGVzdCwgU19HRVRfU0VHTUVOVCAoc3JjKSksIDApIFwKKyAgIDogMCkKKyNlbmRpZgorCisvKiBzYW5pdHkgY2hlY2sgKi8KKworI2lmZGVmIFRDX0k5NjAKKyNpZm5kZWYgQ19MRUFGU1RBVAoraGV5ICEgV2hlcmUgaXMgdGhlIENfTEVBRlNUQVQgZGVmaW5pdGlvbiA/IGk5NjAgLSBjb2ZmIHN1cHBvcnQgaXMgZGVwZW5kaW5nIG9uIGl0LgorI2VuZGlmIC8qIG5vIENfTEVBRlNUQVQgKi8KKyNlbmRpZiAvKiBUQ19JOTYwICovCisKKyNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCisKKyNpZmRlZiBUQ19BMjlLCisvKiBBbGxvdyB0cmFuc2xhdGUgZnJvbSBhb3V0IHJlbG9jcyB0byBjb2ZmIHJlbG9jcyAqLworI2RlZmluZSBOT19SRUxPQyAyMAorI2RlZmluZSBSRUxPQ18zMiAxCisjZGVmaW5lIFJFTE9DXzggMgorI2RlZmluZSBSRUxPQ19DT05TVCAzCisjZGVmaW5lIFJFTE9DX0NPTlNUSCA0CisjZGVmaW5lIFJFTE9DX0pVTVBUQVJHIDUKKyNkZWZpbmUgUkVMT0NfQkFTRTIyIDYKKyNkZWZpbmUgUkVMT0NfSEkyMiA3CisjZGVmaW5lIFJFTE9DX0xPMTAgOAorI2RlZmluZSBSRUxPQ19CQVNFMTMgOQorI2RlZmluZSBSRUxPQ19XRElTUDIyIDEwCisjZGVmaW5lIFJFTE9DX1dESVNQMzAgMTEKKyNlbmRpZgorCitleHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107CisKKy8qIE1hZ2ljIG51bWJlciBvZiBwYWdlZCBleGVjdXRhYmxlLiAqLworI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJMHg4MzAwCisKKworLyogU1lNQk9MIFRBQkxFICovCisKKy8qIFN5bWJvbCB0YWJsZSBlbnRyeSBkYXRhIHR5cGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogQmFzaWMgc3ltYm9sICovCisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgb3N0X2VudHJ5OworICAvKiBBdXhpbGlhcnkgZW50cnkuICovCisgIHVuaW9uIGludGVybmFsX2F1eGVudCBvc3RfYXV4ZW50W09CSl9DT0ZGX01BWF9BVVhFTlRSSUVTXTsKKyAgLyogb2JqX2NvZmYgaW50ZXJuYWwgdXNlIG9ubHkgZmxhZ3MgKi8KKyAgdW5zaWduZWQgaW50IG9zdF9mbGFnczsKK30gb2JqX3N5bWJvbF90eXBlOworCisjaWZuZGVmIERPX05PVF9TVFJJUAorI2RlZmluZSBET19OT1RfU1RSSVAJMAorI2VuZGlmCisvKiBTeW1ib2wgdGFibGUgbWFjcm9zIGFuZCBjb25zdGFudHMgKi8KKworLyogUG9zc2libGUgYW5kIHVzZWZ1bGwgc2VjdGlvbiBudW1iZXIgaW4gc3ltYm9sIHRhYmxlCisgKiBUaGUgdmFsdWVzIG9mIFRFWFQsIERBVEEgYW5kIEJTUyBtYXkgbm90IGJlIHBvcnRhYmxlLgorICovCisKKyNkZWZpbmUgQ19BQlNfU0VDVElPTgkJTl9BQlMKKyNkZWZpbmUgQ19VTkRFRl9TRUNUSU9OCQlOX1VOREVGCisjZGVmaW5lIENfREVCVUdfU0VDVElPTgkJTl9ERUJVRworI2RlZmluZSBDX05UVl9TRUNUSU9OCQlOX1RWCisjZGVmaW5lIENfUFRWX1NFQ1RJT04JCVBfVFYKKyNkZWZpbmUgQ19SRUdJU1RFUl9TRUNUSU9OCTUwCisKKy8qCisgKiAgTWFjcm9zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KKyAqICBUaGlzIHN5bnRheGljIGluZGlyZWN0aW9uIGFsbG93cyBpbmRlcGVuZGVuY2UgcmVnYXJkaW5nIGEub3V0IG9yIGNvZmYuCisgKiAgVGhlIGFyZ3VtZW50IChzKSBvZiBhbGwgdGhlc2UgbWFjcm9zIGlzIGEgcG9pbnRlciB0byBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KKyAqLworCisvKiBQcmVkaWNhdGVzICovCisvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKi8KKyNkZWZpbmUgU19JU19FWFRFUk5BTChzKSAgICAgICAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfVU5ERUZfU0VDVElPTikKKy8qIFRydWUgaWYgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQsIGllIDoKKyAgIHNlY3Rpb24gPiAwIChEQVRBLCBURVhUIG9yIEJTUykKKyAgIHNlY3Rpb24gPT0gMCBhbmQgdmFsdWUgPiAwIChleHRlcm5hbCBic3Mgc3ltYm9sKSAqLworI2RlZmluZSBTX0lTX0RFRklORUQocykgXAorICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPiBDX1VOREVGX1NFQ1RJT04gXAorICAgfHwgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfVU5ERUZfU0VDVElPTiBcCisgICAgICAgJiYgU19HRVRfVkFMVUUgKHMpID4gMCkgXAorICAgfHwgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfQUJTX1NFQ1RJT04pKQorLyogVHJ1ZSBpZiBhIGRlYnVnIHNwZWNpYWwgc3ltYm9sIGVudHJ5ICovCisjZGVmaW5lIFNfSVNfREVCVUcocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX0RFQlVHX1NFQ1RJT04pCisvKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGxvY2FsIHN5bWJvbCBuYW1lICovCisvKiBBIHN5bWJvbCBuYW1lIHdob3NlIG5hbWUgaW5jbHVkZXMgXkEgaXMgYSBnYXMgaW50ZXJuYWwgcHNldWRvIHN5bWJvbCAqLworI2RlZmluZSBTX0lTX0xPQ0FMKHMpIFwKKyAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfUkVHSVNURVJfU0VDVElPTiBcCisgICB8fCAoU19MT0NBTF9OQU1FKHMpICYmICEgZmxhZ19rZWVwX2xvY2FscyAmJiAhIFNfSVNfREVCVUcgKHMpKSBcCisgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMScpICE9IE5VTEwgXAorICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDInKSAhPSBOVUxMIFwKKyAgIHx8IChmbGFnX3N0cmlwX2xvY2FsX2Fic29sdXRlIFwKKyAgICAgICAmJiAhU19JU19FWFRFUk5BTChzKSBcCisgICAgICAgJiYgKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19BQlNfU0VDVElPTikpCisvKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLworI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IDAgXAorCQkJCSAmJiBTX0dFVF9WQUxVRSAocykgPT0gMCkKKy8qCisgKiBUcnVlIGlmIGEgc3ltYm9sIGNhbiBiZSBtdWx0aXBseSBkZWZpbmVkIChic3Mgc3ltYm9scyBoYXZlIHRoaXMgZGVmCisgKiB0aG91Z2ggaXQgaXMgYmFkIHByYWN0aWNlKQorICovCisjZGVmaW5lIFNfSVNfQ09NTU9OKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gMCBcCisJCQkJICYmIFNfR0VUX1ZBTFVFIChzKSAhPSAwKQorLyogVHJ1ZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGluIHRoZSBzdHJpbmcgdGFibGUsIGkuZS4gaXRzIGxlbmd0aCBpcyA+IDguICovCisjZGVmaW5lIFNfSVNfU1RSSU5HKHMpCQkoc3RybGVuKFNfR0VUX05BTUUocykpID4gOCA/IDEgOiAwKQorCisvKiBUcnVlIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgYXMgd2Vhay4gICovCisjaWZkZWYgVEVfUEUKKyNkZWZpbmUgU19JU19XRUFLKHMpIFwKKyAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9PSBDX05UX1dFQUsgXAorICAgfHwgKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID09IENfV0VBS0VYVCkKKyNlbHNlCisjZGVmaW5lIFNfSVNfV0VBSyhzKSBcCisgICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQorI2VuZGlmCisKKy8qIEFjY2Vzc29ycyAqLworLyogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLworI2RlZmluZSBTX0dFVF9OQU1FKHMpCQkoKGNoYXIqKShzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCkKKy8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpICAgICAgICAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCkKKy8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCisjZGVmaW5lIFNfR0VUX1NFR01FTlQocykgICBzX2dldF9zZWdtZW50KHMpCisvKiBUaGUgZGF0YSB0eXBlICovCisjZGVmaW5lIFNfR0VUX0RBVEFfVFlQRShzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fdHlwZSkKKy8qIFRoZSBzdG9yYWdlIGNsYXNzICovCisjZGVmaW5lIFNfR0VUX1NUT1JBR0VfQ0xBU1MocykJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcykKKy8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KKyNkZWZpbmUgU19HRVRfTlVNQkVSX0FVWElMSUFSWShzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4KQorCisvKiBNb2RpZmllcnMgKi8KKy8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCisjZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKSh2KSkKKy8qIFNldCB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgKi8KKyNkZWZpbmUgU19TRVRfT0ZGU0VUKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX29mZnNldCA9ICh2KSkKKy8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCisjZGVmaW5lIFNfU0VUX1NFR01FTlQocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPSBTRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHYpKQorLyogVGhlIGRhdGEgdHlwZSAqLworI2RlZmluZSBTX1NFVF9EQVRBX1RZUEUocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fdHlwZSA9ICh2KSkKKy8qIFRoZSBzdG9yYWdlIGNsYXNzICovCisjZGVmaW5lIFNfU0VUX1NUT1JBR0VfQ0xBU1Mocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID0gKHYpKQorLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLworI2RlZmluZSBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZKHMsdikJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX251bWF1eCA9ICh2KSkKKworLyogQWRkaXRpb25hbCBtb2RpZmllcnMgKi8KKy8qIFRoZSBzeW1ib2wgaXMgZXh0ZXJuYWwgKGRvZXMgbm90IG1lYW4gdW5kZWZpbmVkKSAqLworI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKSAgICAgICB7IFNfU0VUX1NUT1JBR0VfQ0xBU1MocywgQ19FWFQpIDsgU0ZfQ0xFQVJfTE9DQUwocyk7IH0KKworLyogQXV4aWxpYXJ5IGVudHJ5IG1hY3Jvcy4gU0FfIHN0YW5kcyBmb3Igc3ltYm9sIGF1eGlsaWFyeSAqLworLyogT21pdCB0aGUgdHYgcmVsYXRlZCBmaWVsZHMgKi8KKy8qIEFjY2Vzc29ycyAqLworI2RlZmluZSBTWU1fQVVYRU5UKFMpCSgmKFMpLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSkKKworI2RlZmluZSBTQV9HRVRfU1lNX1RBR05EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfdGFnbmR4LmwpCisjZGVmaW5lIFNBX0dFVF9TWU1fTE5OTyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQorI2RlZmluZSBTQV9HRVRfU1lNX1NJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKKyNkZWZpbmUgU0FfR0VUX1NZTV9GU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplKQorI2RlZmluZSBTQV9HRVRfU1lNX0xOTk9QVFIocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCisjZGVmaW5lIFNBX0dFVF9TWU1fRU5ETkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCkKKyNkZWZpbmUgU0FfR0VUX1NZTV9ESU1FTihzLGkpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsoaSldKQorI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRShzKQkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lKQorI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRV9PRkZTRVQocykgIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X29mZnNldCkKKyNkZWZpbmUgU0FfR0VUX0ZJTEVfRk5BTUVfWkVST1MocykgICAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF96ZXJvZXMpCisjZGVmaW5lIFNBX0dFVF9TQ05fU0NOTEVOKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW4pCisjZGVmaW5lIFNBX0dFVF9TQ05fTlJFTE9DKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2MpCisjZGVmaW5lIFNBX0dFVF9TQ05fTkxJTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm8pCisKKy8qIE1vZGlmaWVycyAqLworI2RlZmluZSBTQV9TRVRfU1lNX1RBR05EWChzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF90YWduZHgubD0odikpCisjZGVmaW5lIFNBX1NFVF9TWU1fTE5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm89KHYpKQorI2RlZmluZSBTQV9TRVRfU1lNX1NJWkUocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NZTV9GU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemU9KHYpKQorI2RlZmluZSBTQV9TRVRfU1lNX0xOTk9QVFIocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cj0odikpCisjZGVmaW5lIFNBX1NFVF9TWU1fRU5ETkRYKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NZTV9ESU1FTihzLGksdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV09KHYpKQorI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRShzLHYpCXN0cm5jcHkoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X2ZuYW1lLCh2KSxGSUxOTUxFTikKKyNkZWZpbmUgU0FfU0VUX0ZJTEVfRk5BTUVfT0ZGU0VUKHMsdikgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfb2Zmc2V0PSh2KSkKKyNkZWZpbmUgU0FfU0VUX0ZJTEVfRk5BTUVfWkVST1Mocyx2KSAgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfemVyb2VzPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NDTl9TQ05MRU4ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfc2NubGVuPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NDTl9OUkVMT0Mocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbnJlbG9jPSh2KSkKKyNkZWZpbmUgU0FfU0VUX1NDTl9OTElOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc2NuLnhfbmxpbm5vPSh2KSkKKworLyoKKyAqIEludGVybmFsIHVzZSBvbmx5IGRlZmluaXRpb25zLiBTRl8gc3RhbmRzIGZvciBzeW1ib2wgZmxhZ3MuCisgKgorICogVGhlc2UgdmFsdWVzIGNhbiBiZSBhc3NpZ25lZCB0byBzeV9zeW1ib2wub3N0X2ZsYWdzIGZpZWxkIG9mIGEgc3ltYm9sUy4KKyAqCisgKiBZb3UnbGwgYnJlYWsgaTk2MCBpZiB5b3Ugc2hpZnQgdGhlIFNZU1BST0MgYml0cyBhbnl3aGVyZSBlbHNlLiAgZm9yCisgKiBtb3JlIG9uIHRoZSBiYWxuYW1lL2NhbGxuYW1lIGhhY2ssIHNlZSB0Yy1pOTYwLmguICBiLm91dCBpcyBkb25lCisgKiBkaWZmZXJlbnRseS4KKyAqLworCisjZGVmaW5lIFNGX0k5NjBfTUFTSwkoMHgwMDAwMDFmZikJLyogQml0cyAwLTggYXJlIHVzZWQgYnkgdGhlIGk5NjAgcG9ydC4gKi8KKyNkZWZpbmUgU0ZfU1lTUFJPQwkoMHgwMDAwMDAzZikJLyogYml0cyAwLTUgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIHN5c3Byb2MgbnVtYmVyICovCisjZGVmaW5lIFNGX0lTX1NZU1BST0MJKDB4MDAwMDAwNDApCS8qIGJpdCA2IG1hcmtzIHN5bWJvbHMgdGhhdCBhcmUgc3lzcHJvY3MgKi8KKyNkZWZpbmUgU0ZfQkFMTkFNRQkoMHgwMDAwMDA4MCkJLyogYml0IDcgbWFya3MgQkFMTkFNRSBzeW1ib2xzICovCisjZGVmaW5lIFNGX0NBTExOQU1FCSgweDAwMDAwMTAwKQkvKiBiaXQgOCBtYXJrcyBDQUxMTkFNRSBzeW1ib2xzICovCisKKyNkZWZpbmUgU0ZfTk9STUFMX01BU0sJKDB4MDAwMGZmZmYpCS8qIGJpdHMgMTItMTUgYXJlIGdlbmVyYWwgcHVycG9zZS4gKi8KKworI2RlZmluZSBTRl9TVEFUSUNTCSgweDAwMDAxMDAwKQkvKiBNYXJrIHRoZSAudGV4dCAmIGFsbCBzeW1ib2xzICovCisjZGVmaW5lIFNGX0RFRklORUQJKDB4MDAwMDIwMDApCS8qIFN5bWJvbCBpcyBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLworI2RlZmluZSBTRl9TVFJJTkcJKDB4MDAwMDQwMDApCS8qIFN5bWJvbCBuYW1lIGxlbmd0aCA+IDggKi8KKyNkZWZpbmUgU0ZfTE9DQUwJKDB4MDAwMDgwMDApCS8qIFN5bWJvbCBtdXN0IG5vdCBiZSBlbWl0dGVkICovCisKKyNkZWZpbmUgU0ZfREVCVUdfTUFTSwkoMHhmZmZmMDAwMCkJLyogYml0cyAxNi0zMSBhcmUgZGVidWcgaW5mbyAqLworCisjZGVmaW5lIFNGX0ZVTkNUSU9OCSgweDAwMDEwMDAwKQkvKiBUaGUgc3ltYm9sIGlzIGEgZnVuY3Rpb24gKi8KKyNkZWZpbmUgU0ZfUFJPQ0VTUwkoMHgwMDAyMDAwMCkJLyogUHJvY2VzcyBzeW1ib2wgYmVmb3JlIHdyaXRlICovCisjZGVmaW5lIFNGX1RBR0dFRAkoMHgwMDA0MDAwMCkJLyogSXMgYXNzb2NpYXRlZCB3aXRoIGEgdGFnICovCisjZGVmaW5lIFNGX1RBRwkJKDB4MDAwODAwMDApCS8qIElzIGEgdGFnICovCisjZGVmaW5lIFNGX0RFQlVHCSgweDAwMTAwMDAwKQkvKiBJcyBpbiBkZWJ1ZyBvciBhYnMgc2VjdGlvbiAqLworI2RlZmluZSBTRl9HRVRfU0VHTUVOVAkoMHgwMDIwMDAwMCkJLyogR2V0IHRoZSBzZWN0aW9uIG9mIHRoZSBmb3J3YXJkIHN5bWJvbC4gKi8KKyNkZWZpbmUgU0ZfQURKX0xOTk9QVFIJKDB4MDA0MDAwMDApCS8qIEhhcyBhIGxubm9wdHIgKi8KKy8qIEFsbCBvdGhlciBiaXRzIGFyZSB1bnVzZWQuICovCisKKy8qIEFjY2Vzc29ycyAqLworI2RlZmluZSBTRl9HRVQocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZmxhZ3MpCisjZGVmaW5lIFNGX0dFVF9OT1JNQUxfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9OT1JNQUxfTUFTSykKKyNkZWZpbmUgU0ZfR0VUX0RFQlVHX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVCVUdfTUFTSykKKyNkZWZpbmUgU0ZfR0VUX0ZJTEUocykJCShTRl9HRVQgKHMpICYgU0ZfRklMRSkKKyNkZWZpbmUgU0ZfR0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgJiBTRl9TVEFUSUNTKQorI2RlZmluZSBTRl9HRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFRklORUQpCisjZGVmaW5lIFNGX0dFVF9TVFJJTkcocykJKFNGX0dFVCAocykgJiBTRl9TVFJJTkcpCisjZGVmaW5lIFNGX0dFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgJiBTRl9MT0NBTCkKKyNkZWZpbmUgU0ZfR0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgJiBTRl9GVU5DVElPTikKKyNkZWZpbmUgU0ZfR0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgJiBTRl9QUk9DRVNTKQorI2RlZmluZSBTRl9HRVRfREVCVUcocykJCShTRl9HRVQgKHMpICYgU0ZfREVCVUcpCisjZGVmaW5lIFNGX0dFVF9UQUdHRUQocykJKFNGX0dFVCAocykgJiBTRl9UQUdHRUQpCisjZGVmaW5lIFNGX0dFVF9UQUcocykJCShTRl9HRVQgKHMpICYgU0ZfVEFHKQorI2RlZmluZSBTRl9HRVRfR0VUX1NFR01FTlQocykJKFNGX0dFVCAocykgJiBTRl9HRVRfU0VHTUVOVCkKKyNkZWZpbmUgU0ZfR0VUX0FESl9MTk5PUFRSKHMpCShTRl9HRVQgKHMpICYgU0ZfQURKX0xOTk9QVFIpCisjZGVmaW5lIFNGX0dFVF9JOTYwKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0k5NjBfTUFTSykJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX0dFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX0dFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKyNkZWZpbmUgU0ZfR0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKyNkZWZpbmUgU0ZfR0VUX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKworLyogTW9kaWZpZXJzICovCisjZGVmaW5lIFNGX1NFVChzLHYpCQkoU0ZfR0VUIChzKSA9ICh2KSkKKyNkZWZpbmUgU0ZfU0VUX05PUk1BTF9GSUVMRChzLHYpKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX05PUk1BTF9NQVNLKSkKKyNkZWZpbmUgU0ZfU0VUX0RFQlVHX0ZJRUxEKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0RFQlVHX01BU0spKQorI2RlZmluZSBTRl9TRVRfRklMRShzKQkJKFNGX0dFVCAocykgfD0gU0ZfRklMRSkKKyNkZWZpbmUgU0ZfU0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgfD0gU0ZfU1RBVElDUykKKyNkZWZpbmUgU0ZfU0VUX0RFRklORUQocykJKFNGX0dFVCAocykgfD0gU0ZfREVGSU5FRCkKKyNkZWZpbmUgU0ZfU0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVFJJTkcpCisjZGVmaW5lIFNGX1NFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgfD0gU0ZfTE9DQUwpCisjZGVmaW5lIFNGX0NMRUFSX0xPQ0FMKHMpCShTRl9HRVQgKHMpICY9IH5TRl9MT0NBTCkKKyNkZWZpbmUgU0ZfU0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgfD0gU0ZfRlVOQ1RJT04pCisjZGVmaW5lIFNGX1NFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1BST0NFU1MpCisjZGVmaW5lIFNGX1NFVF9ERUJVRyhzKQkJKFNGX0dFVCAocykgfD0gU0ZfREVCVUcpCisjZGVmaW5lIFNGX1NFVF9UQUdHRUQocykJKFNGX0dFVCAocykgfD0gU0ZfVEFHR0VEKQorI2RlZmluZSBTRl9TRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9UQUcpCisjZGVmaW5lIFNGX1NFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSB8PSBTRl9HRVRfU0VHTUVOVCkKKyNkZWZpbmUgU0ZfU0VUX0FESl9MTk5PUFRSKHMpCShTRl9HRVQgKHMpIHw9IFNGX0FESl9MTk5PUFRSKQorI2RlZmluZSBTRl9TRVRfSTk2MChzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9JOTYwX01BU0spKQkvKiB1c2VkIGJ5IGk5NjAgKi8KKyNkZWZpbmUgU0ZfU0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgfD0gU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX1NFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9DQUxMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCisjZGVmaW5lIFNGX1NFVF9JU19TWVNQUk9DKHMpCShTRl9HRVQgKHMpIHw9IFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLworI2RlZmluZSBTRl9TRVRfU1lTUFJPQyhzLHYpCShTRl9HRVQgKHMpIHw9ICgodikgJiBTRl9TWVNQUk9DKSkJLyogdXNlZCBieSBpOTYwICovCisKKy8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KKworLyoKKyAqIEZpbGUgcG9zaXRpb24gY2FsY3VsYXRvcnMuIEJld2FyZSB0byB1c2UgdGhlbSB3aGVuIGFsbCB0aGUKKyAqIGFwcHJvcHJpYXRlIGZpZWxkcyBhcmUgc2V0IGluIHRoZSBoZWFkZXIuCisgKi8KKworI2lmZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCisjZGVmaW5lIE9CSl9DT0ZGX0FPVVRIRFJTWiAoMCkKKyNlbHNlCisjZGVmaW5lIE9CSl9DT0ZGX0FPVVRIRFJTWiAoQU9VVEhEUlNaKQorI2VuZGlmIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCisKKyNkZWZpbmUgSF9HRVRfRklMRV9TSVpFKGgpIFwKKyAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAorCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKKwkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgKyBcCisJICAgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICsgSF9HRVRfTElORU5PX1NJWkUoaCkgKyBcCisJICAgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgKyBcCisJICAgKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKKyNkZWZpbmUgSF9HRVRfVEVYVF9GSUxFX09GRlNFVChoKSBcCisgICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKKwkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opCisjZGVmaW5lIEhfR0VUX0RBVEFfRklMRV9PRkZTRVQoaCkgXAorICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCisJICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAorCSAgIEhfR0VUX1RFWFRfU0laRShoKSkKKyNkZWZpbmUgSF9HRVRfQlNTX0ZJTEVfT0ZGU0VUKGgpIDAKKyNkZWZpbmUgSF9HRVRfUkVMT0NBVElPTl9GSUxFX09GRlNFVChoKSBcCisgICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKKwkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCisJICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpKQorI2RlZmluZSBIX0dFVF9MSU5FTk9fRklMRV9PRkZTRVQoaCkgXAorICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCisJICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAorCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKKwkgICBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkpCisjZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9GSUxFX09GRlNFVChoKSBcCisgICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKKwkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCisJICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAorCSAgIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSArIEhfR0VUX0xJTkVOT19TSVpFKGgpKQorCisvKiBBY2Nlc3NvcnMgKi8KKy8qIGFvdXRoZHIgKi8KKyNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpICAgICAgICAgICAoKGgpLT5hb3V0aGRyLm1hZ2ljKQorI2RlZmluZSBIX0dFVF9WRVJTSU9OX1NUQU1QKGgpCQkoKGgpLT5hb3V0aGRyLnZzdGFtcCkKKyNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpICAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLnRzaXplKQorI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkgICAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZHNpemUpCisjZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpICAgICAgICAgICAgICAgKChoKS0+YW91dGhkci5ic2l6ZSkKKyNkZWZpbmUgSF9HRVRfRU5UUllfUE9JTlQoaCkgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmVudHJ5KQorI2RlZmluZSBIX0dFVF9URVhUX1NUQVJUKGgpCQkoKGgpLT5hb3V0aGRyLnRleHRfc3RhcnQpCisjZGVmaW5lIEhfR0VUX0RBVEFfU1RBUlQoaCkJCSgoaCktPmFvdXRoZHIuZGF0YV9zdGFydCkKKy8qIGZpbGVoZHIgKi8KKyNkZWZpbmUgSF9HRVRfRklMRV9NQUdJQ19OVU1CRVIoaCkJKChoKS0+ZmlsZWhkci5mX21hZ2ljKQorI2RlZmluZSBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkJKChoKS0+ZmlsZWhkci5mX25zY25zKQorI2RlZmluZSBIX0dFVF9USU1FX1NUQU1QKGgpCQkoKGgpLT5maWxlaGRyLmZfdGltZGF0KQorI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfUE9JTlRFUihoKQkoKGgpLT5maWxlaGRyLmZfc3ltcHRyKQorI2RlZmluZSBIX0dFVF9TWU1CT0xfQ09VTlQoaCkJCSgoaCktPmZpbGVoZHIuZl9uc3ltcykKKyNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKEhfR0VUX1NZTUJPTF9DT1VOVChoKSAqIFNZTUVTWikKKyNkZWZpbmUgSF9HRVRfU0laRU9GX09QVElPTkFMX0hFQURFUihoKQkoKGgpLT5maWxlaGRyLmZfb3B0aGRyKQorI2RlZmluZSBIX0dFVF9GTEFHUyhoKQkJCSgoaCktPmZpbGVoZHIuZl9mbGFncykKKy8qIEV4dHJhIGZpZWxkcyB0byBhY2hpZXZlIGJzZCBhLm91dCBjb21wYXRpYmlsaXR5IGFuZCBmb3IgY29udmVuaWVuY2UgKi8KKyNkZWZpbmUgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICAgCSgoaCktPnJlbG9jYXRpb25fc2l6ZSkKKyNkZWZpbmUgSF9HRVRfU1RSSU5HX1NJWkUoaCkgICAgICAgICAgICAoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKKyNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkgICAgICAgICAgICAoKGgpLT5saW5lbm9fc2l6ZSkKKworI2lmbmRlZiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUgorI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihGSUxIRFIpIFwKKwkJCQkJICsgc2l6ZW9mKEFPVVRIRFIpXAorCQkJCQkgKyAoSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaKSkKKyNlbHNlIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCisjZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKEZJTEhEUikgXAorCQkJCQkgKyAoSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaKSkKKyNlbmRpZiAvKiBPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUiAqLworCisjZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSh0ZXh0X3NlY3Rpb25faGVhZGVyLnNfbnJlbG9jICogUkVMU1opCisjZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCShkYXRhX3NlY3Rpb25faGVhZGVyLnNfbnJlbG9jICogUkVMU1opCisKKy8qIE1vZGlmaWVycyAqLworLyogYW91dGhkciAqLworI2RlZmluZSBIX1NFVF9NQUdJQ19OVU1CRVIoaCx2KSAgICAgICAgICgoaCktPmFvdXRoZHIubWFnaWMgPSAodikpCisjZGVmaW5lIEhfU0VUX1ZFUlNJT05fU1RBTVAoaCx2KQkoKGgpLT5hb3V0aGRyLnZzdGFtcCA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLnRzaXplID0gKHYpKQorI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KSAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZHNpemUgPSAodikpCisjZGVmaW5lIEhfU0VUX0JTU19TSVpFKGgsdikgICAgICAgICAgICAgKChoKS0+YW91dGhkci5ic2l6ZSA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KSAgICAgICAgICAoKGgpLT5hb3V0aGRyLmVudHJ5ID0gKHYpKQorI2RlZmluZSBIX1NFVF9URVhUX1NUQVJUKGgsdikJCSgoaCktPmFvdXRoZHIudGV4dF9zdGFydCA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfREFUQV9TVEFSVChoLHYpCQkoKGgpLT5hb3V0aGRyLmRhdGFfc3RhcnQgPSAodikpCisvKiBmaWxlaGRyICovCisjZGVmaW5lIEhfU0VUX0ZJTEVfTUFHSUNfTlVNQkVSKGgsdikJKChoKS0+ZmlsZWhkci5mX21hZ2ljID0gKHYpKQorI2RlZmluZSBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCx2KQkoKGgpLT5maWxlaGRyLmZfbnNjbnMgPSAodikpCisjZGVmaW5lIEhfU0VUX1RJTUVfU1RBTVAoaCx2KQkJKChoKS0+ZmlsZWhkci5mX3RpbWRhdCA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIoaCx2KQkoKGgpLT5maWxlaGRyLmZfc3ltcHRyID0gKHYpKQorI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpICAgICgoaCktPmZpbGVoZHIuZl9uc3ltcyA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUihoLHYpICgoaCktPmZpbGVoZHIuZl9vcHRoZHIgPSAodikpCisjZGVmaW5lIEhfU0VUX0ZMQUdTKGgsdikJCSgoaCktPmZpbGVoZHIuZl9mbGFncyA9ICh2KSkKKy8qIEV4dHJhIGZpZWxkcyB0byBhY2hpZXZlIGJzZCBhLm91dCBjb21wYXRpYmlsaXR5IGFuZCBmb3IgY29udmluaWVuY2UgKi8KKyNkZWZpbmUgSF9TRVRfUkVMT0NBVElPTl9TSVpFKGgsdCxkKSAJKChoKS0+cmVsb2NhdGlvbl9zaXplID0gKHQpKyhkKSkKKyNkZWZpbmUgSF9TRVRfU1RSSU5HX1NJWkUoaCx2KSAgICAgICAgICAoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKKyNkZWZpbmUgSF9TRVRfTElORU5PX1NJWkUoaCx2KSAgICAgICAgICAoKGgpLT5saW5lbm9fc2l6ZSA9ICh2KSkKKworLyogU2VnbWVudCBmbGlwcGluZyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBhb3V0aGRyOwkvKiBhLm91dCBoZWFkZXIgKi8KKyAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgZmlsZWhkcjsJLyogRmlsZSBoZWFkZXIsIG5vdCBtYWNoaW5lIGRlcC4gKi8KKyAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KKyAgbG9uZyByZWxvY2F0aW9uX3NpemU7CS8qIEN1bXVsYXRlZCBzaXplIG9mIHJlbG9jYXRpb24KKwkJCSAgIGluZm9ybWF0aW9uIGZvciBhbGwgc2VjdGlvbnMgaW4KKwkJCSAgIGJ5dGVzLiAqLworICBsb25nIGxpbmVub19zaXplOwkJLyogU2l6ZSBvZiB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24KKwkJCQkgICB0YWJsZSBpbiBieXRlcyAqLworfSBvYmplY3RfaGVhZGVyczsKKworCisKK3N0cnVjdCBsaW5lbm9fbGlzdAoreworICBzdHJ1Y3QgYmZkX2ludGVybmFsX2xpbmVubyBsaW5lOworICBjaGFyICpmcmFnOwkJCS8qIEZyYWcgdG8gd2hpY2ggdGhlIGxpbmUgbnVtYmVyIGlzIHJlbGF0ZWQgKi8KKyAgc3RydWN0IGxpbmVub19saXN0ICpuZXh0OwkvKiBGb3J3YXJkIGNoYWluIHBvaW50ZXIgKi8KK307CisKKworCisKKyNkZWZpbmUgb2JqX3NlZ21lbnRfbmFtZShpKSAoc2VnbWVudF9pbmZvWyhpbnQpIChpKV0uc2NuaGRyLnNfbmFtZSkKKworI2RlZmluZSBvYmpfYWRkX3NlZ21lbnQocykgb2JqX2NvZmZfYWRkX3NlZ21lbnQgKHMpCisKK2V4dGVybiBzZWdUIG9ial9jb2ZmX2FkZF9zZWdtZW50IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCitleHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gdm9pZCBjX2RvdF9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOworI2RlZmluZSBvYmpfYXBwX2ZpbGUgY19kb3RfZmlsZV9zeW1ib2wKK2V4dGVybiB2b2lkIG9ial9leHRyYV9zdHVmZiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKKworZXh0ZXJuIHNlZ1Qgc19nZXRfc2VnbWVudCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICogcHRyKSk7CisKK2V4dGVybiB2b2lkIGNfc2VjdGlvbl9oZWFkZXIgUEFSQU1TICgoc3RydWN0IGludGVybmFsX3NjbmhkciAqIGhlYWRlciwKKwkJCQkgICAgICBjaGFyICpuYW1lLAorCQkJCSAgICAgIGxvbmcgY29yZV9hZGRyZXNzLAorCQkJCSAgICAgIGxvbmcgc2l6ZSwKKwkJCQkgICAgICBsb25nIGRhdGFfcHRyLAorCQkJCSAgICAgIGxvbmcgcmVsb2NfcHRyLAorCQkJCSAgICAgIGxvbmcgbGluZW5vX3B0ciwKKwkJCQkgICAgICBsb25nIHJlbG9jX251bWJlciwKKwkJCQkgICAgICBsb25nIGxpbmVub19udW1iZXIsCisJCQkJICAgICAgbG9uZyBhbGlnbm1lbnQpKTsKKworI2lmbmRlZiB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sKK3ZvaWQgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworI2VuZGlmCisKKy8qIHNhbml0eSBjaGVjayAqLworCisjaWZkZWYgVENfSTk2MAorI2lmbmRlZiBDX0xFQUZTVEFUCitoZXkgISBXaGVyZSBpcyB0aGUgQ19MRUFGU1RBVCBkZWZpbml0aW9uID8gaTk2MCAtIGNvZmYgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gaXQuCisjZW5kaWYgLyogbm8gQ19MRUFGU1RBVCAqLworI2VuZGlmIC8qIFRDX0k5NjAgKi8KK2V4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIGRhdGFfc2VjdGlvbl9oZWFkZXI7CitleHRlcm4gc3RydWN0IGludGVybmFsX3NjbmhkciB0ZXh0X3NlY3Rpb25faGVhZGVyOworCisvKiBGb3J3YXJkIHRoZSBzZWdtZW50IG9mIGEgZm9yd2FyZGVkIHN5bWJvbC4gICovCisjZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGRlc3Qsc3JjKSBcCisgIChTRl9HRVRfR0VUX1NFR01FTlQgKGRlc3QpIFwKKyAgID8gKFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpLCAwKSBcCisgICA6IDApCisKKyNpZmRlZiBURV9QRQorI2RlZmluZSBvYmpfaGFuZGxlX2xpbmtfb25jZSh0KSBvYmpfY29mZl9wZV9oYW5kbGVfbGlua19vbmNlICh0KQorZXh0ZXJuIHZvaWQgb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAoKTsKKyNlbmRpZgorCisjZW5kaWYgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KKworLyogSW4gQ09GRiwgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCB1c2luZyAuZGVmLy52YWwgU1lNLy5lbmRlZiwgaXQncyBPSworICAgdG8gcmVkZWZpbmUgdGhlIHN5bWJvbCBsYXRlciBvbi4gIFRoaXMgY2FuIGhhcHBlbiBpZiBDIHN5bWJvbHMgdXNlCisgICBhIHByZWZpeCwgYW5kIGEgc3ltYm9sIGlzIGRlZmluZWQgYm90aCB3aXRoIGFuZCB3aXRob3V0IHRoZSBwcmVmaXgsCisgICBhcyBpbiBzdGFydC9fc3RhcnQvX19zdGFydCBpbiBnY2MvbGliZ2NjMS10ZXN0LmMuICAqLworI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oc3ltKQkJXAorKFNGX0dFVF9HRVRfU0VHTUVOVCAoc3ltKQkJCQlcCisgPyAoc3ltLT5zeV9mcmFnID0gZnJhZ19ub3csCQkJCVwKKyAgICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpLAkJCVwKKyAgICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpLAkJCVwKKyAgICAwKQkJCQkJCQlcCisgOiAwKQorCisvKiBTdGFicyBpbiBhIGNvZmYgZmlsZSBnbyBpbnRvIHRoZWlyIG93biBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCisKKy8qIFdlIG5lZWQgMTIgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHRvIGhvbGQgc29tZSBpbml0aWFsCisgICBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gdm9pZCBvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7CisjZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKKworI2VuZGlmIC8qIE9CSl9GT1JNQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuYyBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzY2U4OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qIEVDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdC4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorICAgVGhpcyBmaWxlIHdhcyBwdXQgdG9nZXRoZXIgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWVjb2ZmLmgiCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiYmZkL2xpYmNvZmYuaCIKKyNpbmNsdWRlICJiZmQvbGliZWNvZmYuaCIKKworLyogQWxtb3N0IGFsbCBvZiB0aGUgRUNPRkYgc3VwcG9ydCBpcyBhY3R1YWxseSBpbiBlY29mZi5jIGluIHRoZSBtYWluCisgICBnYXMgZGlyZWN0b3J5LiAgVGhpcyBmaWxlIG1vc3RseSBqdXN0IGFycmFuZ2VzIHRvIGNhbGwgdGhhdCBvbmUgYXQKKyAgIHRoZSByaWdodCB0aW1lcy4gICovCisKK3N0YXRpYyBpbnQgZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOworc3RhdGljIHZvaWQgb2JqX2Vjb2ZmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKK3N0YXRpYyB2b2lkIGVjb2ZmX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOworCisvKiBUaGVzZSBhcmUgdGhlIHBzZXVkby1vcHMgd2Ugc3VwcG9ydCBpbiB0aGlzIGZpbGUuICBPbmx5IHRob3NlCisgICByZWxhdGluZyB0byBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXJlIHN1cHBvcnRlZCBoZXJlLgorCisgICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rCisgICBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLCBidXQgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZDogLmFlbnQsCisgICAuYmduYiwgLmVuZGIsIC52ZXJzdGFtcCwgLnZyZWcuCisKKyAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCisgICBNSVBTIENQVSBzcGVjaWZpYywgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRjLW1pcHMuYzogLmFsaWFzLAorICAgLmV4dGVybiwgLmdhbGl2ZSwgLmdqYWxkZWYsIC5nanJsaXZlLCAubGl2ZXJlZywgLm5vYWxpYXMsIC5vcHRpb24sCisgICAucmRhdGEsIC5zZGF0YSwgLnNldC4KKworICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKKyAgIG5vdCBNSVBTIENQVSBzcGVjaWZpYywgYnV0IGFyZSBhbHNvIG5vdCBFQ09GRiBzcGVjaWZpYy4gIEkgaGF2ZQorICAgb25seSBsaXN0ZWQgdGhlIG9uZXMgd2hpY2ggYXJlIG5vdCBhbHJlYWR5IGluIHJlYWQuYy4gIEl0J3Mgbm90CisgICBjb21wbGV0ZWx5IGNsZWFyIHdoZXJlIHRoZXNlIHNob3VsZCBiZSBkZWZpbmVkLCBidXQgdGMtbWlwcy5jIGlzCisgICBwcm9iYWJseSB0aGUgbW9zdCByZWFzb25hYmxlIHBsYWNlOiAuYXNjaWl6LCAuYXNtMCwgLmVuZHIsIC5lcnIsCisgICAuaGFsZiwgLmxhYiwgLnJlcGVhdCwgLnN0cnVjdCwgLndlYWtleHQuICAqLworCitjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KK3sKKyAgLyogQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIC5sbiBpcyBub3QgdXNlZDsgLmxvYyBpcyB1c2VkCisgICAgIGluc3RlYWQuICAqLworICB7ICJkZWYiLAllY29mZl9kaXJlY3RpdmVfZGVmLAkwIH0sCisgIHsgImRpbSIsCWVjb2ZmX2RpcmVjdGl2ZV9kaW0sCTAgfSwKKyAgeyAiZW5kZWYiLAllY29mZl9kaXJlY3RpdmVfZW5kZWYsCTAgfSwKKyAgeyAiZmlsZSIsCWVjb2ZmX2RpcmVjdGl2ZV9maWxlLAkwIH0sCisgIHsgInNjbCIsCWVjb2ZmX2RpcmVjdGl2ZV9zY2wsCTAgfSwKKyAgeyAic2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCisgIHsgImVzaXplIiwJZWNvZmZfZGlyZWN0aXZlX3NpemUsCTAgfSwKKyAgeyAidGFnIiwJZWNvZmZfZGlyZWN0aXZlX3RhZywJMCB9LAorICB7ICJ0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKKyAgeyAiZXR5cGUiLAllY29mZl9kaXJlY3RpdmVfdHlwZSwJMCB9LAorICB7ICJ2YWwiLAllY29mZl9kaXJlY3RpdmVfdmFsLAkwIH0sCisKKyAgLyogRUNPRkYgc3BlY2lmaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgeyAiYmVnaW4iLAllY29mZl9kaXJlY3RpdmVfYmVnaW4sCTAgfSwKKyAgeyAiYmVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAkwIH0sCisgIHsgImVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmQsCTAgfSwKKyAgeyAiZW50IiwJZWNvZmZfZGlyZWN0aXZlX2VudCwJMCB9LAorICB7ICJmbWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9mbWFzaywJMCB9LAorICB7ICJmcmFtZSIsCWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSwJMCB9LAorICB7ICJsb2MiLAllY29mZl9kaXJlY3RpdmVfbG9jLAkwIH0sCisgIHsgIm1hc2siLAllY29mZl9kaXJlY3RpdmVfbWFzaywJMCB9LAorCisgIC8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLworICB7ICJleHRlcm4iLAllY29mZl9kaXJlY3RpdmVfZXh0ZXJuLAkwIH0sCisKKyNpZm5kZWYgVENfTUlQUworICAvKiBGb3IgVENfTUlQUywgdGMtbWlwcy5jIGFkZHMgdGhpcy4gKi8KKyAgeyAid2Vha2V4dCIsCWVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0LCAwIH0sCisjZW5kaWYKKworICAvKiBUaGVzZSBhcmUgdXNlZCBvbiBJcml4LiAgSSBkb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhlbS4gICovCisgIHsgImJnbmIiLAlzX2lnbm9yZSwJCTAgfSwKKyAgeyAiZW5kYiIsCXNfaWdub3JlLAkJMCB9LAorICB7ICJ2ZXJzdGFtcCIsCXNfaWdub3JlLAkJMCB9LAorCisgIC8qIFNlbnRpbmVsLiAgKi8KKyAgeyBOVUxMIH0KK307CisKKy8qIFN3YXAgb3V0IHRoZSBzeW1ib2xzIGFuZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIEJGRC4gICovCisKK3ZvaWQKK2Vjb2ZmX2Zyb2JfZmlsZSAoKQoreworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKKyAgICA9ICZlY29mZl9iYWNrZW5kIChzdGRvdXRwdXQpLT5kZWJ1Z19zd2FwOworICBiZmRfdm1hIGFkZHI7CisgIGFzZWN0aW9uICpzZWM7CisgIEhEUlIgKmhkcjsKKyAgY2hhciAqYnVmOworICBjaGFyICpzZXQ7CisKKyAgLyogU2V0IHRoZSBzZWN0aW9uIFZNQSB2YWx1ZXMuICBXZSBmb3JjZSB0aGUgLnNkYXRhIGFuZCAuc2JzcworICAgICBzZWN0aW9ucyB0byB0aGUgZW5kIHRvIGVuc3VyZSB0aGF0IHRoZWlyIFZNQSBhZGRyZXNzZXMgYXJlIGNsb3NlCisgICAgIHRvZ2V0aGVyIHNvIHRoYXQgdGhlIEdQIHJlZ2lzdGVyIGNhbiBhZGRyZXNzIGJvdGggb2YgdGhlbS4gIFdlCisgICAgIHB1dCB0aGUgLmJzcyBzZWN0aW9uIGFmdGVyIHRoZSAuc2JzcyBzZWN0aW9uLgorCisgICAgIEFsc28sIGZvciB0aGUgQWxwaGEsIHdlIG11c3Qgc29ydCB0aGUgc2VjdGlvbnMsIHRvIG1ha2Ugc3VyZSB0aGV5CisgICAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICAoQWN0dWFsbHksIG1heWJlCisgICAgIHRoaXMgaXMgYSBqb2IgZm9yIEJGRC4gIEJ1dCB0aGUgVk1BcyBjb21wdXRlZCB3b3VsZCBiZSBvdXQgb2YKKyAgICAgd2hhY2sgaWYgd2UgY29tcHV0ZWQgdGhlbSBnaXZlbiBvdXIgaW5pdGlhbCwgcmFuZG9tIG9yZGVyaW5nLgorICAgICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhhdCB3b3VsZG4ndCBicmVhayB0aGluZ3M7IEkgY291bGQgZG8gc29tZQorICAgICBleHBlcmltZW50aW5nIHNvbWV0aW1lIGFuZCBmaW5kIG91dC4KKworICAgICBUaGlzIG91dHB1dCBvcmRlcmluZyBvZiBzZWN0aW9ucyBpcyBtYWdpYywgb24gdGhlIEFscGhhLCBhdAorICAgICBsZWFzdC4gIFRoZSAubGl0YSBzZWN0aW9uIG11c3QgY29tZSBiZWZvcmUgLmxpdDggYW5kIC5saXQ0LAorICAgICBvdGhlcndpc2UgdGhlIE9TRi8xIGxpbmtlciBtYXkgc2lsZW50bHkgdHJhc2ggdGhlIC5saXR7NCw4fQorICAgICBzZWN0aW9uIGNvbnRlbnRzLiAgQWxzbywgLnRleHQgbXVzdCBwcmVjZWVkIC5yZGF0YS4gIFRoZXNlIGRpZmZlcgorICAgICBmcm9tIHRoZSBvcmRlciBkZXNjcmliZWQgaW4gc29tZSBwYXJ0cyBvZiB0aGUgREVDIE9TRi8xIEFzc2VtYmx5CisgICAgIExhbmd1YWdlIFByb2dyYW1tZXIncyBHdWlkZSwgYnV0IHRoYXQgb3JkZXIgZG9lc24ndCBzZWVtIHRvIHdvcmsKKyAgICAgd2l0aCB0aGVpciBsaW5rZXIuCisKKyAgICAgSSBkb24ndCBrbm93IGlmIHNlY3Rpb24gb3JkZXJpbmcgb24gdGhlIE1JUFMgaXMgaW1wb3J0YW50LiAgKi8KKworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9IHsKKyAgICAvKiB0ZXh0IHNlZ21lbnQgKi8KKyAgICAiLnRleHQiLCAiLnJkYXRhIiwgIi5pbml0IiwgIi5maW5pIiwKKyAgICAvKiBkYXRhIHNlZ21lbnQgKi8KKyAgICAiLmRhdGEiLCAiLmxpdGEiLCAiLmxpdDgiLCAiLmxpdDQiLCAiLnNkYXRhIiwgIi5nb3QiLAorICAgIC8qIGJzcyBzZWdtZW50ICovCisgICAgIi5zYnNzIiwgIi5ic3MiLAorICB9OworI2RlZmluZSBuX25hbWVzIChzaXplb2YgKG5hbWVzKSAvIHNpemVvZiAobmFtZXNbMF0pKQorCisgIGFkZHIgPSAwOworICB7CisgICAgLyogU2VjdGlvbnMgdGhhdCBtYXRjaCBuYW1lcywgb3JkZXIgdG8gYmUgc3RyYWlnaHRlbmVkIG91dCBsYXRlci4gICovCisgICAgYXNlY3Rpb24gKnNlY3Nbbl9uYW1lc107CisgICAgLyogTGlua2VkIGxpc3Qgb2Ygc2VjdGlvbnMgd2l0aCBub24tbWF0Y2hpbmcgbmFtZXMuICBSYW5kb20gb3JkZXJpbmcuICAqLworICAgIGFzZWN0aW9uICpvdGhlcl9zZWN0aW9ucyA9IDA7CisgICAgLyogUG9pbnRlciB0byBuZXh0IHNlY3Rpb24sIHNpbmNlIHdlJ3JlIGRlc3Ryb3lpbmcgdGhlIG9yaWdpbmFsCisgICAgICAgb3JkZXJpbmcuICAqLworICAgIGFzZWN0aW9uICpuZXh0OworCisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9uYW1lczsgaSsrKQorICAgICAgc2Vjc1tpXSA9IDA7CisgICAgZm9yIChzZWMgPSBzdGRvdXRwdXQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IG5leHQpCisgICAgICB7CisJbmV4dCA9IHNlYy0+bmV4dDsKKwlmb3IgKGkgPSAwOyBpIDwgbl9uYW1lczsgaSsrKQorCSAgaWYgKCFzdHJjbXAgKHNlYy0+bmFtZSwgbmFtZXNbaV0pKQorCSAgICB7CisJICAgICAgc2Vjc1tpXSA9IHNlYzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCWlmIChpID09IG5fbmFtZXMpCisJICB7CisJICAgIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjLCBhZGRyKTsKKwkgICAgYWRkciArPSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIHNlYyk7CisJICAgIHNlYy0+bmV4dCA9IG90aGVyX3NlY3Rpb25zOworCSAgICBvdGhlcl9zZWN0aW9ucyA9IHNlYzsKKwkgIH0KKyAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9uYW1lczsgaSsrKQorICAgICAgaWYgKHNlY3NbaV0pCisJeworCSAgc2VjID0gc2Vjc1tpXTsKKwkgIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjLCBhZGRyKTsKKwkgIGFkZHIgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOworCX0KKyAgICBmb3IgKGkgPSBuX25hbWVzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoc2Vjc1tpXSkKKwl7CisJICBzZWMgPSBzZWNzW2ldOworCSAgc2VjLT5uZXh0ID0gb3RoZXJfc2VjdGlvbnM7CisJICBvdGhlcl9zZWN0aW9ucyA9IHNlYzsKKwl9CisgICAgc3Rkb3V0cHV0LT5zZWN0aW9ucyA9IG90aGVyX3NlY3Rpb25zOworICB9CisKKyAgLyogQnVpbGQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisgIGFzc2VydCAoZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KSAhPSAwKTsKKyAgaGRyID0gJmVjb2ZmX2RhdGEgKHN0ZG91dHB1dCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOworICBlY29mZl9idWlsZF9kZWJ1ZyAoaGRyLCAmYnVmLCBkZWJ1Z19zd2FwKTsKKworICAvKiBGaW5pc2ggdXAgdGhlIGVjb2ZmX3RkYXRhIHN0cnVjdHVyZS4gICovCisgIHNldCA9IGJ1ZjsKKyNkZWZpbmUgU0VUKHB0ciwgY291bnQsIHR5cGUsIHNpemUpIFwKKyAgaWYgKGhkci0+Y291bnQgPT0gMCkgXAorICAgIGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCktPmRlYnVnX2luZm8ucHRyID0gKHR5cGUpIE5VTEw7IFwKKyAgZWxzZSBcCisgICAgeyBcCisgICAgICBlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnB0ciA9ICh0eXBlKSBzZXQ7IFwKKyAgICAgIHNldCArPSBoZHItPmNvdW50ICogc2l6ZTsgXAorICAgIH0KKworICBTRVQgKGxpbmUsIGNiTGluZSwgdW5zaWduZWQgY2hhciAqLCBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKKyAgU0VUIChleHRlcm5hbF9kbnIsIGlkbk1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7CisgIFNFVCAoZXh0ZXJuYWxfcGRyLCBpcGRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUpOworICBTRVQgKGV4dGVybmFsX3N5bSwgaXN5bU1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSk7CisgIFNFVCAoZXh0ZXJuYWxfb3B0LCBpb3B0TWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKKyAgU0VUIChleHRlcm5hbF9hdXgsIGlhdXhNYXgsIHVuaW9uIGF1eF9leHQgKiwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSk7CisgIFNFVCAoc3MsIGlzc01heCwgY2hhciAqLCBzaXplb2YgKGNoYXIpKTsKKyAgU0VUIChzc2V4dCwgaXNzRXh0TWF4LCBjaGFyICosIHNpemVvZiAoY2hhcikpOworICBTRVQgKGV4dGVybmFsX3JmZCwgY3JmZCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSk7CisgIFNFVCAoZXh0ZXJuYWxfZmRyLCBpZmRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOworICBTRVQgKGV4dGVybmFsX2V4dCwgaWV4dE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSk7CisKKyN1bmRlZiBTRVQKKworICAvKiBGaWxsIGluIHRoZSByZWdpc3RlciBtYXNrcy4gICovCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGdwcm1hc2sgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZnBybWFzayA9IDA7CisgICAgdW5zaWduZWQgbG9uZyAqY3BybWFzayA9IE5VTEw7CisKKyNpZmRlZiBUQ19NSVBTCisgICAgLyogRmlsbCBpbiB0aGUgTUlQUyByZWdpc3RlciBtYXNrcy4gIEl0J3MgcHJvYmFibHkgbm90IHdvcnRoCisgICAgICAgc2V0dGluZyB1cCBhIGdlbmVyaWMgaW50ZXJmYWNlIGZvciB0aGlzLiAgKi8KKyAgICBncHJtYXNrID0gbWlwc19ncHJtYXNrOworICAgIGNwcm1hc2sgPSBtaXBzX2Nwcm1hc2s7CisjZW5kaWYKKworI2lmZGVmIFRDX0FMUEhBCisgICAgYWxwaGFfZnJvYl9lY29mZl9kYXRhICgpOworCisgICAgaWYgKCEgYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSAoc3Rkb3V0cHV0LCBhbHBoYV9ncF92YWx1ZSkpCisgICAgICBhc19mYXRhbCAoXygiQ2FuJ3Qgc2V0IEdQIHZhbHVlIikpOworCisgICAgZ3BybWFzayA9IGFscGhhX2dwcm1hc2s7CisgICAgZnBybWFzayA9IGFscGhhX2Zwcm1hc2s7CisjZW5kaWYKKworICAgIGlmICghIGJmZF9lY29mZl9zZXRfcmVnbWFza3MgKHN0ZG91dHB1dCwgZ3BybWFzaywgZnBybWFzaywgY3BybWFzaykpCisgICAgICBhc19mYXRhbCAoXygiQ2FuJ3Qgc2V0IHJlZ2lzdGVyIG1hc2tzIikpOworICB9Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBFQ09GRiBjb2RlIHRvIHNldCB0aGUgZXh0ZXJuYWwgaW5mb3JtYXRpb24KKyAgIGZvciBhIHN5bWJvbC4gIFdlIGp1c3QgcGFzcyBpdCBvbiB0byBCRkQsIHdoaWNoIGV4cGVjdHMgdGhlIHN3YXBwZWQKKyAgIGluZm9ybWF0aW9uIHRvIGJlIHN0b3JlZCBpbiB0aGUgbmF0aXZlIGZpZWxkIG9mIHRoZSBzeW1ib2wuICAqLworCit2b2lkCitvYmpfZWNvZmZfc2V0X2V4dCAoc3ltLCBleHQpCisgICAgIHN5bWJvbFMgKnN5bTsKKyAgICAgRVhUUiAqZXh0OworeworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKKyAgICA9ICZlY29mZl9iYWNrZW5kIChzdGRvdXRwdXQpLT5kZWJ1Z19zd2FwOworICBlY29mZl9zeW1ib2xfdHlwZSAqZXN5bTsKKworICBrbm93IChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW0tPmJzeW0pID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cik7CisgIGVzeW0gPSBlY29mZnN5bWJvbCAoc3ltLT5ic3ltKTsKKyAgZXN5bS0+bG9jYWwgPSBmYWxzZTsKKyAgZXN5bS0+bmF0aXZlID0geG1hbGxvYyAoZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOworICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X291dCkgKHN0ZG91dHB1dCwgZXh0LCBlc3ltLT5uYXRpdmUpOworfQorCitzdGF0aWMgaW50CitlY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKQorICAgICBhc2VjdGlvbiAqc2VjOworeworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK29ial9lY29mZl9mcm9iX3N5bWJvbCAoc3ltLCBwdW50cCkKKyAgICAgc3ltYm9sUyAqc3ltOworICAgICBpbnQgKnB1bnRwOworeworICBlY29mZl9mcm9iX3N5bWJvbCAoc3ltKTsKK30KKworc3RhdGljIHZvaWQKK2Vjb2ZmX3BvcF9pbnNlcnQgKCkKK3sKKyAgcG9wX2luc2VydCAob2JqX3BzZXVkb190YWJsZSk7Cit9CisKK2NvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVjb2ZmX2Zvcm1hdF9vcHMgPQoreworICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCisgIDAsCisgIDEsCisgIG9ial9lY29mZl9mcm9iX3N5bWJvbCwKKyAgZWNvZmZfZnJvYl9maWxlLAorICAwLAorICAwLCAwLAorICAwLCAwLAorICAwLAorICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vLAorICBlY29mZl9zdGFiLAorICBlY29mZl9zZWNfc3ltX29rX2Zvcl9yZWxvYywKKyAgZWNvZmZfcG9wX2luc2VydCwKKyAgZWNvZmZfc2V0X2V4dCwKKyAgZWNvZmZfcmVhZF9iZWdpbl9ob29rLAorICBlY29mZl9zeW1ib2xfbmV3X2hvb2ssCit9OwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWNvZmYuaCBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZTYxOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLWVjb2ZmLmgKQEAgLTAsMCArMSw2NyBAQAorLyogRUNPRkYgb2JqZWN0IGZpbGUgZm9ybWF0IGhlYWRlciBmaWxlLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBPQkpfRUNPRkYgMQorCisvKiBVc2UgdGhlIGdlbmVyaWMgRUNPRkYgZGVidWdnaW5nIGNvZGUuICAqLworI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQorCisjZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCisKKyNpbmNsdWRlICJ0YXJnLWNwdS5oIgorCisjaW5jbHVkZSAiZWNvZmYuaCIKKworLyogRm9yIGVhY2ggZ2FzIHN5bWJvbCB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIGZpbGUgaXQgY2FtZSBmcm9tLCBvZgorICAgd2hldGhlciB3ZSBoYXZlIGdlbmVyYXRlZCBhbiBFQ09GRiBzeW1ib2wgZm9yIGl0LCBhbmQgd2hldGhlciB0aGUKKyAgIHN5bWJvbHMgaXMgdW5kZWZpbmVkICh0aGlzIGxhc3QgaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGEgLmV4dGVybgorICAgc3ltYm9scyBmcm9tIGEgLmNvbW0gc3ltYm9sKS4gICovCisKKyNkZWZpbmUgVEFSR0VUX1NZTUJPTF9GSUVMRFMgXAorICBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsgXAorICBzdHJ1Y3QgbG9jYWxzeW0gKmVjb2ZmX3N5bWJvbDsgXAorICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7CisKKy8qIE1vZGlmeSB0aGUgRUNPRkYgc3ltYm9sLiAgKi8KKyNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHN5bXAsIHB1bnQpIGVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wKQorCisvKiBUaGlzIGlzIHVzZWQgdG8gd3JpdGUgdGhlIHN5bWJvbGljIGRhdGEgaW4gdGhlIGZvcm1hdCB0aGF0IEJGRAorICAgZXhwZWN0cyBpdC4gICovCitleHRlcm4gdm9pZCBlY29mZl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBvYmpfZnJvYl9maWxlKCkgZWNvZmZfZnJvYl9maWxlICgpCisKKy8qIFdlIHVzZSB0aGUgRUNPRkYgZnVuY3Rpb25zIGFzIG91ciBob29rcy4gICovCisjZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2sgZWNvZmZfcmVhZF9iZWdpbl9ob29rCisjZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2sgZWNvZmZfc3ltYm9sX25ld19ob29rCisKKy8qIFJlY29yZCBmaWxlIHN3aXRjaGVzIGluIHRoZSBFQ09GRiBzeW1ib2wgdGFibGUuICAqLworI2RlZmluZSBvYmpfYXBwX2ZpbGUobmFtZSkgZWNvZmZfbmV3X2ZpbGUgKG5hbWUpCisKKy8qIEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnkgc3RhYnMgcHJvY2Vzc2luZyBpbiByZWFkLmMuICAqLworI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykgXAorICBlY29mZl9zdGFiICgoc2VnKSwgKHdoYXQpLCAoc3RyaW5nKSwgKHR5cGUpLCAob3RoZXIpLCAoZGVzYykpCisKKyNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMJCTAKKyNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJMQorCisjZGVmaW5lIG9ial9lY29mZl9zZXRfZXh0IGVjb2ZmX3NldF9leHQKK2V4dGVybiB2b2lkIG9ial9lY29mZl9zZXRfZXh0IFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgRVhUUiAqKSk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1lbGYuYyBiL2dhcy9jb25maWcvb2JqLWVsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGM0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1lbGYuYwpAQCAtMCwwICsxLDE3NjQgQEAKKy8qIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lbGYuaCIKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisKKyNpZm5kZWYgRUNPRkZfREVCVUdHSU5HCisjZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCisjZWxzZQorI2RlZmluZSBORUVEX0VDT0ZGX0RFQlVHCisjZW5kaWYKKworI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKKyNpbmNsdWRlICJlY29mZi5oIgorI2VuZGlmCisKKyNpZmRlZiBUQ19BTFBIQQorI2luY2x1ZGUgImVsZi9hbHBoYS5oIgorI2VuZGlmCisKKyNpZmRlZiBUQ19NSVBTCisjaW5jbHVkZSAiZWxmL21pcHMuaCIKKyNlbmRpZgorCisjaWZkZWYgVENfUFBDCisjaW5jbHVkZSAiZWxmL3BwYy5oIgorI2VuZGlmCisKK3N0YXRpYyBiZmRfdm1hIGVsZl9zX2dldF9zaXplIFBBUkFNUyAoKHN5bWJvbFMgKikpOworc3RhdGljIHZvaWQgZWxmX3Nfc2V0X3NpemUgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYmZkX3ZtYSBlbGZfc19nZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqKSk7CitzdGF0aWMgdm9pZCBlbGZfc19zZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7CitzdGF0aWMgdm9pZCBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOworc3RhdGljIGludCBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOworc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworCisjaWZkZWYgTkVFRF9FQ09GRl9ERUJVRworc3RhdGljIGJvb2xlYW4gZWxmX2dldF9leHRyIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7CitzdGF0aWMgdm9pZCBlbGZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9ial9lbGZfbGluZSBQQVJBTVMgKChpbnQpKTsKK3ZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl9zaXplIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl90eXBlIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl9pZGVudCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG9ial9lbGZfd2VhayBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG9ial9lbGZfbG9jYWwgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBvYmpfZWxmX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG9ial9lbGZfc3ltdmVyIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl92dGFibGVfaW5oZXJpdCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG9ial9lbGZfdnRhYmxlX2VudHJ5IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl9kYXRhIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl90ZXh0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgb2JqX2VsZl9zdWJzZWN0aW9uIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVsZl9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsiY29tbSIsIG9ial9lbGZfY29tbW9uLCAwfSwKKyAgeyJpZGVudCIsIG9ial9lbGZfaWRlbnQsIDB9LAorICB7ImxvY2FsIiwgb2JqX2VsZl9sb2NhbCwgMH0sCisgIHsicHJldmlvdXMiLCBvYmpfZWxmX3ByZXZpb3VzLCAwfSwKKyAgeyJzZWN0aW9uIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKKyAgeyJzZWN0aW9uLnMiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAorICB7InNlY3QiLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAorICB7InNlY3QucyIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCisgIHsic2l6ZSIsIG9ial9lbGZfc2l6ZSwgMH0sCisgIHsidHlwZSIsIG9ial9lbGZfdHlwZSwgMH0sCisgIHsidmVyc2lvbiIsIG9ial9lbGZfdmVyc2lvbiwgMH0sCisgIHsid2VhayIsIG9ial9lbGZfd2VhaywgMH0sCisKKyAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIHN0YWJzLWluLWVsZiBjb25maWd1cmF0aW9ucy4gICovCisgIHsibGluZSIsIG9ial9lbGZfbGluZSwgMH0sCisKKyAgLyogVGhpcyBpcyBhIEdOVSBleHRlbnNpb24gdG8gaGFuZGxlIHN5bWJvbCB2ZXJzaW9ucy4gICovCisgIHsic3ltdmVyIiwgb2JqX2VsZl9zeW12ZXIsIDB9LAorCisgIC8qIEEgR05VIGV4dGVuc2lvbiB0byBjaGFuZ2Ugc3Vic2VjdGlvbiBvbmx5LiAgKi8KKyAgeyJzdWJzZWN0aW9uIiwgb2JqX2VsZl9zdWJzZWN0aW9uLCAwfSwKKworICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gYWlkIGluIGdhcmJhZ2UgY29sbGVjdGluZyBDKysgdnRhYmxlcy4gICovCisgIHsidnRhYmxlX2luaGVyaXQiLCBvYmpfZWxmX3Z0YWJsZV9pbmhlcml0LCAwfSwKKyAgeyJ2dGFibGVfZW50cnkiLCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSwgMH0sCisKKyAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIGR3YXJmLiAqLworICB7IjJieXRlIiwgY29ucywgMn0sCisgIHsiNGJ5dGUiLCBjb25zLCA0fSwKKyAgeyI4Ynl0ZSIsIGNvbnMsIDh9LAorCisgIC8qIFdlIG5lZWQgdG8gdHJhcCB0aGUgc2VjdGlvbiBjaGFuZ2luZyBjYWxscyB0byBoYW5kbGUgLnByZXZpb3VzLiAgKi8KKyAgeyJkYXRhIiwgb2JqX2VsZl9kYXRhLCAwfSwKKyAgeyJ0ZXh0Iiwgb2JqX2VsZl90ZXh0LCAwfSwKKworICAvKiBFbmQgc2VudGluZWwuICAqLworICB7TlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZVtdID0KK3sKKyNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCisgIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBFQ09GRi4gLmxuIGlzIG5vdCB1c2VkOyAubG9jCisgICAgIGlzIHVzZWQgaW5zdGVhZC4gICovCisgIHsgImRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9kZWYsCTAgfSwKKyAgeyAiZGltIiwJZWNvZmZfZGlyZWN0aXZlX2RpbSwJMCB9LAorICB7ICJlbmRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwJMCB9LAorICB7ICJmaWxlIiwJZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCTAgfSwKKyAgeyAic2NsIiwJZWNvZmZfZGlyZWN0aXZlX3NjbCwJMCB9LAorICB7ICJ0YWciLAllY29mZl9kaXJlY3RpdmVfdGFnLAkwIH0sCisgIHsgInZhbCIsCWVjb2ZmX2RpcmVjdGl2ZV92YWwsCTAgfSwKKworICAvKiBDT0ZGIGRlYnVnZ2luZyByZXF1aXJlcyBwc2V1ZG8tb3BzIC5zaXplIGFuZCAudHlwZSwgYnV0IEVMRgorICAgICBhbHJlYWR5IGhhcyBtZWFuaW5ncyBmb3IgdGhvc2UuICBXZSB1c2UgLmVzaXplIGFuZCAuZXR5cGUKKyAgICAgaW5zdGVhZC4gIFRoZXNlIGFyZSBvbmx5IGdlbmVyYXRlZCBieSBnY2MgYW55aG93LiAgKi8KKyAgeyAiZXNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAorICB7ICJldHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCisKKyAgLyogRUNPRkYgc3BlY2lmaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgeyAiYmVnaW4iLAllY29mZl9kaXJlY3RpdmVfYmVnaW4sCTAgfSwKKyAgeyAiYmVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAkwIH0sCisgIHsgImVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmQsCTAgfSwKKyAgeyAiZW50IiwJZWNvZmZfZGlyZWN0aXZlX2VudCwJMCB9LAorICB7ICJmbWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9mbWFzaywJMCB9LAorICB7ICJmcmFtZSIsCWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSwJMCB9LAorICB7ICJsb2MiLAllY29mZl9kaXJlY3RpdmVfbG9jLAkwIH0sCisgIHsgIm1hc2siLAllY29mZl9kaXJlY3RpdmVfbWFzaywJMCB9LAorCisgIC8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLworICB7ICJleHRlcm4iLAllY29mZl9kaXJlY3RpdmVfZXh0ZXJuLAkwIH0sCisKKyAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLworICB7ICJhbGlhcyIsCXNfaWdub3JlLAkJMCB9LAorICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCisgIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKKyAgeyAibGFiIiwJc19pZ25vcmUsCQkwIH0sCisgIHsgIm5vYWxpYXMiLAlzX2lnbm9yZSwJCTAgfSwKKyAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKKyAgeyAidnJlZyIsCXNfaWdub3JlLAkJMCB9LAorI2VuZGlmCisKKyAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCit9OworCisjdW5kZWYgTk9fUkVMT0MKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzLiAgKi8KKwordm9pZAorZWxmX2JlZ2luICgpCit7CisgIC8qIEFkZCBzeW1ib2xzIGZvciB0aGUga25vd24gc2VjdGlvbnMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCisgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAorCQkJCQkJCQlURVhUX1NFQ1RJT05fTkFNRSkpKTsKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCisJCQkJCQkJCURBVEFfU0VDVElPTl9OQU1FKSkpOworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKKwkJCQkJCQkJQlNTX1NFQ1RJT05fTkFNRSkpKTsKK30KKwordm9pZAorZWxmX3BvcF9pbnNlcnQgKCkKK3sKKyAgcG9wX2luc2VydCAoZWxmX3BzZXVkb190YWJsZSk7CisgIGlmIChFQ09GRl9ERUJVR0dJTkcpCisgICAgcG9wX2luc2VydCAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTsKK30KKworc3RhdGljIGJmZF92bWEKK2VsZl9zX2dldF9zaXplIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgcmV0dXJuIFNfR0VUX1NJWkUgKHN5bSk7Cit9CisKK3N0YXRpYyB2b2lkCitlbGZfc19zZXRfc2l6ZSAoc3ltLCBzeikKKyAgICAgc3ltYm9sUyAqc3ltOworICAgICBiZmRfdm1hIHN6OworeworICBTX1NFVF9TSVpFIChzeW0sIHN6KTsKK30KKworc3RhdGljIGJmZF92bWEKK2VsZl9zX2dldF9hbGlnbiAoc3ltKQorICAgICBzeW1ib2xTICpzeW07Cit7CisgIHJldHVybiBTX0dFVF9BTElHTiAoc3ltKTsKK30KKworc3RhdGljIHZvaWQKK2VsZl9zX3NldF9hbGlnbiAoc3ltLCBhbGlnbikKKyAgICAgc3ltYm9sUyAqc3ltOworICAgICBiZmRfdm1hIGFsaWduOworeworICBTX1NFVF9BTElHTiAoc3ltLCBhbGlnbik7Cit9CisKK3N0YXRpYyB2b2lkCitlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQorICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOworeworICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKK30KKworc3RhdGljIGludAorZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCisgICAgIGFzZWN0aW9uICpzZWM7Cit7CisgIHJldHVybiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYyk7Cit9CisKK3ZvaWQKK2VsZl9maWxlX3N5bWJvbCAocykKKyAgICAgY2hhciAqczsKK3sKKyAgc3ltYm9sUyAqc3ltOworCisgIHN5bSA9IHN5bWJvbF9uZXcgKHMsIGFic29sdXRlX3NlY3Rpb24sICh2YWx1ZVQpIDAsIChzdHJ1Y3QgZnJhZyAqKSAwKTsKKyAgc3ltLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9GSUxFOworCisgIGlmIChzeW1ib2xfcm9vdFAgIT0gc3ltKQorICAgIHsKKyAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisgICAgICBzeW1ib2xfaW5zZXJ0IChzeW0sIHN5bWJvbF9yb290UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisjaWZkZWYgREVCVUcKKyAgICAgIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKKyAgZWNvZmZfbmV3X2ZpbGUgKHMpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitvYmpfZWxmX2NvbW1vbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGNoYXIgKnA7CisgIGludCB0ZW1wLCBzaXplOworICBzeW1ib2xTICpzeW1ib2xQOworICBpbnQgaGF2ZV9hbGlnbjsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLworICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqcCA9IGM7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLworICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHNpemUgPSB0ZW1wOworICAqcCA9IDA7CisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKnAgPSBjOworICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCisgICAgeworICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQorCXsKKwkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAorCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7CisJfQorICAgIH0KKyAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgaGF2ZV9hbGlnbiA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBoYXZlX2FsaWduID0gMTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgIH0KKyAgaWYgKCEgaGF2ZV9hbGlnbiB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKKyAgICB7CisgICAgICBpZiAoISBoYXZlX2FsaWduKQorCXRlbXAgPSAwOworICAgICAgZWxzZQorCXsKKwkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKwkgIGlmICh0ZW1wIDwgMCkKKwkgICAgeworCSAgICAgIHRlbXAgPSAwOworCSAgICAgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKKwkgICAgfQorCX0KKyAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKKwl7CisJICBzZWdUIG9sZF9zZWM7CisJICBpbnQgb2xkX3N1YnNlYzsKKwkgIGNoYXIgKnBmcmFnOworCSAgaW50IGFsaWduOworCisJLyogYWxsb2NhdGVfYnNzOiAqLworCSAgb2xkX3NlYyA9IG5vd19zZWc7CisJICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKKwkgIGlmICh0ZW1wKQorCSAgICB7CisJICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCisJICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbik7CisJICAgICAgaWYgKHRlbXAgIT0gMSkKKwkJeworCQkgIGFzX2JhZCAoXygiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOworCQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYWxpZ24gPSAwOworCSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKKwkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKKwkgIGlmIChhbGlnbikKKwkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOworCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQorCSAgICBzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOworCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OworCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAorCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKKwkgICpwZnJhZyA9IDA7CisJICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKKwkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKKwkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOworCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7CisJfQorICAgICAgZWxzZQorCXsKKwlhbGxvY2F0ZV9jb21tb246CisJICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7CisJICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7CisJICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisJICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCisJaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLworICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKKwkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQorCXsKKwkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQorCSAgICA7CisJICBpbnB1dF9saW5lX3BvaW50ZXItLTsKKwkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OworCX0KKyAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQorCTsKKyAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOworICAgIH0KKworICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfT0JKRUNUOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIHJldHVybjsKKworICB7CisgIGJhZF9jb21tb25fc2VnbWVudDoKKyAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQorICAgICAgcCsrOworICAgIGMgPSAqcDsKKyAgICAqcCA9ICdcMCc7CisgICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOworICAgICpwID0gYzsKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOworICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfZWxmX2xvY2FsIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCBjOworICBzeW1ib2xTICpzeW1ib2xQOworCisgIGRvCisgICAgeworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7CisgICAgICBzeW1ib2xQLT5sb2NhbCA9IDE7CisgICAgICBpZiAoYyA9PSAnLCcpCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQorCSAgICBjID0gJ1xuJzsKKwl9CisgICAgfQorICB3aGlsZSAoYyA9PSAnLCcpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorb2JqX2VsZl93ZWFrIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCBjOworICBzeW1ib2xTICpzeW1ib2xQOworCisgIGRvCisgICAgeworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7CisgICAgICBzeW1ib2xQLT5sb2NhbCA9IDE7CisgICAgICBpZiAoYyA9PSAnLCcpCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQorCSAgICBjID0gJ1xuJzsKKwl9CisgICAgfQorICB3aGlsZSAoYyA9PSAnLCcpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgc2VnVCBwcmV2aW91c19zZWN0aW9uOworc3RhdGljIGludCBwcmV2aW91c19zdWJzZWN0aW9uOworCisvKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgY29kZSBzdXBwb3J0cyB0d28gZGlmZmVyZW50CisgICBzeW50YXhlcy4KKworICAgVGhlIGZpcnN0IGlzIGZvdW5kIG9uIFNvbGFyaXMsIGFuZCBsb29rcyBsaWtlCisgICAgICAgLnNlY3Rpb24gIi5zZWMxIiwjYWxsb2MsI2V4ZWNpbnN0ciwjd3JpdGUKKyAgIEhlcmUgdGhlIG5hbWVzIGFmdGVyICcjJyBhcmUgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZQorICAgc2VjdGlvbi4gIEknbSBub3Qgc3VyZSBob3cgaXQgZGV0ZXJtaW5lcyB0aGUgU0hUXyogdHlwZSAoQkZECisgICBkb2Vzbid0IHJlYWxseSBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgdHlwZSwgYW55aG93KS4KKworICAgVGhlIHNlY29uZCBmb3JtYXQgaXMgZm91bmQgb24gVW5peFdhcmUsIGFuZCBwcm9iYWJseSBtb3N0IFNWUjQKKyAgIG1hY2hpbmVzLCBhbmQgbG9va3MgbGlrZQorICAgICAgIC5zZWN0aW9uIC5zZWMxLCJhIixAcHJvZ2JpdHMKKyAgIFRoZSBxdW90ZWQgc3RyaW5nIG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBhLCB3LCB4LCBhbmQKKyAgIHJlcHJlc2VudHMgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZSBzZWN0aW9uLiAgVGhlIHN0cmluZworICAgYmVnaW5uaW5nIHdpdGggJ0AnIGNhbiBiZSBwcm9nYml0cyBvciBub2JpdHMuICBUaGVyZSBzaG91bGQgYmUKKyAgIG90aGVyIHBvc3NpYmlsaXRpZXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGV5IGFyZS4gIEluIGFueSBjYXNlLAorICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGxldCB1cyBzZXQgdGhlIHNlY3Rpb24gdHlwZS4gICovCisKKy8qIENlcnRhaW4gbmFtZWQgc2VjdGlvbnMgaGF2ZSBwYXJ0aWN1bGFyIGRlZmluZWQgdHlwZXMsIGxpc3RlZCBvbiBwLgorICAgNC0xOSBvZiB0aGUgQUJJLiAgKi8KK3N0cnVjdCBzcGVjaWFsX3NlY3Rpb24KK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IHR5cGU7CisgIGludCBhdHRyaWJ1dGVzOworfTsKKworc3RhdGljIHN0cnVjdCBzcGVjaWFsX3NlY3Rpb24gc3BlY2lhbF9zZWN0aW9uc1tdID0KK3sKKyAgeyAiLmJzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKKyAgeyAiLmNvbW1lbnQiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKKyAgeyAiLmRhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKKyAgeyAiLmRhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUJCX0sCisgIHsgIi5kZWJ1ZyIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAorICB7ICIuZmluaSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAorICB7ICIuaW5pdCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAorICB7ICIubGluZSIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAorICB7ICIubm90ZSIsCVNIVF9OT1RFLAkwCQkJCX0sCisgIHsgIi5yb2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCisgIHsgIi5yb2RhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MJCQl9LAorICB7ICIudGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAorCisjaWZkZWYgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKKyAgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKKyNlbmRpZgorCisjaWYgMAorICAvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gbmFtZXMgYXJlIHNwZWNpYWwsIGJ1dCB0aGV5IGNhbiBub3QKKyAgICAgcmVhc29uYWJseSBhcHBlYXIgaW4gYXNzZW1ibGVyIGNvZGUuICBTb21lIG9mIHRoZSBhdHRyaWJ1dGVzIGFyZQorICAgICBwcm9jZXNzb3IgZGVwZW5kZW50LiAgKi8KKyAgeyAiLmR5bmFtaWMiLAlTSFRfRFlOQU1JQywJU0hGX0FMTE9DIC8qICsgU0hGX1dSSVRFICovIAl9LAorICB7ICIuZHluc3RyIiwJU0hUX1NUUlRBQiwJU0hGX0FMTE9DCQkJfSwKKyAgeyAiLmR5bnN5bSIsCVNIVF9EWU5TWU0sCVNIRl9BTExPQwkJCX0sCisgIHsgIi5nb3QiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKKyAgeyAiLmhhc2giLAlTSFRfSEFTSCwJU0hGX0FMTE9DCQkJfSwKKyAgeyAiLmludGVycCIsCVNIVF9QUk9HQklUUywJLyogU0hGX0FMTE9DICovCQkJfSwKKyAgeyAiLnBsdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAorICB7ICIuc2hzdHJ0YWIiLFNIVF9TVFJUQUIsCTAJCQkJfSwKKyAgeyAiLnN0cnRhYiIsCVNIVF9TVFJUQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCisgIHsgIi5zeW10YWIiLAlTSFRfU1lNVEFCLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAorI2VuZGlmCisKKyAgeyBOVUxMLAkwLAkJMAkJCQl9Cit9OworCit2b2lkCitvYmpfZWxmX3NlY3Rpb24gKHh4eCkKKyAgICAgaW50IHh4eDsKK3sKKyAgY2hhciAqc3RyaW5nOworICBpbnQgbmV3X3NlYzsKKyAgc2VnVCBzZWM7CisgIGludCB0eXBlLCBhdHRyOworICBpbnQgaTsKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIHN5bWJvbFMgKnNlY3N5bTsKKworI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOworI2VuZGlmCisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIGNoYXIgbXJpX3R5cGU7CisKKyAgICAgIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOworICAgICAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7CisKKyAgICAgIHNfbXJpX3NlY3QgKCZtcmlfdHlwZSk7CisKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaworICAgICAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7CisjZW5kaWYKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBHZXQgbmFtZSBvZiBzZWN0aW9uLiAgKi8KKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCisgICAgeworICAgICAgc3RyaW5nID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZ4eHgpOworICAgICAgaWYgKHN0cmluZyA9PSBOVUxMKQorCXsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjaGFyIGM7CisgICAgICB3aGlsZSAoMCA9PSBzdHJjaHIgKCJcblx0LDsgIiwgKnApKQorCXArKzsKKyAgICAgIGlmIChwID09IGlucHV0X2xpbmVfcG9pbnRlcikKKwl7CisJICBhc193YXJuIChfKCJNaXNzaW5nIHNlY3Rpb24gbmFtZSIpKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgYyA9ICpwOworICAgICAgKnAgPSAwOworICAgICAgc3RyaW5nID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChwIC0gaW5wdXRfbGluZV9wb2ludGVyICsgMSkpOworICAgICAgc3RyY3B5IChzdHJpbmcsIGlucHV0X2xpbmVfcG9pbnRlcik7CisgICAgICAqcCA9IGM7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOworICAgIH0KKworICAvKiBTd2l0Y2ggdG8gdGhlIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCisgIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOworICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKKworICBuZXdfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgc3RyaW5nKSA9PSBOVUxMOworICBzZWMgPSBzdWJzZWdfbmV3IChzdHJpbmcsIDApOworCisgIC8qIElmIHRoaXMgc2VjdGlvbiBhbHJlYWR5IGV4aXN0ZWQsIHdlIGRvbid0IGJvdGhlciB0byBjaGFuZ2UgdGhlCisgICAgIGZsYWcgdmFsdWVzLiAgKi8KKyAgaWYgKCEgbmV3X3NlYykKKyAgICB7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCisgICAgICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKKyNlbmRpZgorCisgICAgICByZXR1cm47CisgICAgfQorCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICB0eXBlID0gU0hUX05VTEw7CisgIGF0dHIgPSAwOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICAvKiBTa2lwIHRoZSBjb21tYS4gICovCisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworCisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCisJeworCSAgLyogUGljayB1cCBhIHN0cmluZyB3aXRoIGEgY29tYmluYXRpb24gb2YgYSwgdywgeC4gICovCisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKKwkgICAgeworCSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKKwkJeworCQljYXNlICdhJzoKKwkJICBhdHRyIHw9IFNIRl9BTExPQzsKKwkJICBicmVhazsKKwkJY2FzZSAndyc6CisJCSAgYXR0ciB8PSBTSEZfV1JJVEU7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkgIGF0dHIgfD0gU0hGX0VYRUNJTlNUUjsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICB7CisJCSAgICBjaGFyICpiYWRfbXNnID0gXygiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCBpbiBzdHJpbmciKTsKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIKKwkJICAgIGludCBtZF9hdHRyID0gbWRfZWxmX3NlY3Rpb25fbGV0dGVyICgqaW5wdXRfbGluZV9wb2ludGVyLCAmYmFkX21zZyk7CisJCSAgICBpZiAobWRfYXR0cikKKwkJICAgICAgYXR0ciB8PSBtZF9hdHRyOworCQkgICAgZWxzZQorI2VuZGlmCisJCSAgICAgIHsKKwkJCWFzX3dhcm4gKGJhZF9tc2cpOworCQkJaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkJCXJldHVybjsKKwkJICAgICAgfQorCQkgIH0KKwkJfQorCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgICB9CisKKwkgIC8qIFNraXAgdGhlIGNsb3NpbmcgcXVvdGUuICAqLworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisKKwkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwkgICAgeworCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJScpCisJCXsKKwkJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkJICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAicHJvZ2JpdHMiLAorCQkJICAgICAgIHNpemVvZiAicHJvZ2JpdHMiIC0gMSkgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgdHlwZSA9IFNIVF9QUk9HQklUUzsKKwkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IHNpemVvZiAicHJvZ2JpdHMiIC0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJub2JpdHMiLAorCQkJCSAgICBzaXplb2YgIm5vYml0cyIgLSAxKSA9PSAwKQorCQkgICAgeworCQkgICAgICB0eXBlID0gU0hUX05PQklUUzsKKwkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IHNpemVvZiAibm9iaXRzIiAtIDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworI2lmZGVmIG1kX2VsZl9zZWN0aW9uX3R5cGUKKwkJICAgIGludCBtZF90eXBlID0gbWRfZWxmX3NlY3Rpb25fdHlwZSAoJmlucHV0X2xpbmVfcG9pbnRlcik7CisJCSAgICBpZiAobWRfdHlwZSkKKwkJICAgICAgdHlwZSA9IG1kX3R5cGU7CisJCSAgICBlbHNlCisjZW5kaWYKKwkJICAgICAgeworCQkJYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKKwkJCWlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJCSAgICAgIH0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRvCisJICAgIHsKKwkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyMnKQorCQl7CisJCSAgYXNfd2FybiAoXygiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZSAtIGNoYXJhY3RlciBmb2xsb3dpbmcgbmFtZSBpcyBub3QgJyMnIikpOworCQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIndyaXRlIiwKKwkJCSAgIHNpemVvZiAid3JpdGUiIC0gMSkgPT0gMCkKKwkJeworCQkgIGF0dHIgfD0gU0hGX1dSSVRFOworCQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzaXplb2YgIndyaXRlIiAtIDE7CisJCX0KKwkgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJhbGxvYyIsCisJCQkJc2l6ZW9mICJhbGxvYyIgLSAxKSA9PSAwKQorCQl7CisJCSAgYXR0ciB8PSBTSEZfQUxMT0M7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHNpemVvZiAiYWxsb2MiIC0gMTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImV4ZWNpbnN0ciIsCisJCQkJc2l6ZW9mICJleGVjaW5zdHIiIC0gMSkgPT0gMCkKKwkJeworCQkgIGF0dHIgfD0gU0hGX0VYRUNJTlNUUjsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc2l6ZW9mICJleGVjaW5zdHIiIC0gMTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworI2lmZGVmIG1kX2VsZl9zZWN0aW9uX3dvcmQKKwkJICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX3dvcmQgKCZpbnB1dF9saW5lX3BvaW50ZXIpOworCQkgIGlmIChtZF9hdHRyKQorCQkgICAgYXR0ciB8PSBtZF9hdHRyOworCQkgIGVsc2UKKyNlbmRpZgorCQkgICAgeworCQkgICAgICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgc2VjdGlvbiBhdHRyaWJ1dGUiKSk7CisJCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJCSAgICAgIHJldHVybjsKKwkJICAgIH0KKwkJfQorCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwkgICAgfQorCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOworCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisJfQorICAgIH0KKworICAvKiBTZWUgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgc2VjdGlvbnMuICAqLworICBmb3IgKGkgPSAwOyBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJpbmdbMV0gPT0gc3BlY2lhbF9zZWN0aW9uc1tpXS5uYW1lWzFdCisJICAmJiBzdHJjbXAgKHN0cmluZywgc3BlY2lhbF9zZWN0aW9uc1tpXS5uYW1lKSA9PSAwKQorCXsKKwkgIGlmICh0eXBlID09IFNIVF9OVUxMKQorCSAgICB0eXBlID0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlOworCSAgZWxzZSBpZiAodHlwZSAhPSBzcGVjaWFsX3NlY3Rpb25zW2ldLnR5cGUpCisJICAgIGFzX3dhcm4gKF8oIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gdHlwZSBmb3IgJXMiKSwgc3RyaW5nKTsKKworCSAgaWYgKChhdHRyICZ+IHNwZWNpYWxfc2VjdGlvbnNbaV0uYXR0cmlidXRlcykgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0IGEgLm5vdGUgc2VjdGlvbiB0byBiZQorICAgICAgICAgICAgICAgICBhbGxvY2F0YWJsZS4gIElmIHRoZSBsaW5rZXIgc2VlcyBhbiBhbGxvY2F0ZWFibGUKKyAgICAgICAgICAgICAgICAgLm5vdGUgc2VjdGlvbiwgaXQgd2lsbCBjcmVhdGUgYSBQVF9OT1RFIHNlZ21lbnQgaW4KKyAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlLiAgKi8KKwkgICAgICBpZiAoc3RyY21wIChzdHJpbmcsICIubm90ZSIpICE9IDAKKwkJICB8fCBhdHRyICE9IFNIRl9BTExPQykKKwkJYXNfd2FybiAoXygiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiBhdHRyaWJ1dGVzIGZvciAlcyIpLAorCQkJIHN0cmluZyk7CisJICAgIH0KKwkgIGF0dHIgfD0gc3BlY2lhbF9zZWN0aW9uc1tpXS5hdHRyaWJ1dGVzOworCisJICBicmVhazsKKwl9CisgICAgfQorCisgIGZsYWdzID0gKFNFQ19SRUxPQworCSAgIHwgKChhdHRyICYgU0hGX1dSSVRFKSA/IDAgOiBTRUNfUkVBRE9OTFkpCisJICAgfCAoKGF0dHIgJiBTSEZfQUxMT0MpID8gU0VDX0FMTE9DIDogMCkKKwkgICB8ICgoKGF0dHIgJiBTSEZfQUxMT0MpICYmIHR5cGUgIT0gU0hUX05PQklUUykgPyBTRUNfTE9BRCA6IDApCisJICAgfCAoKGF0dHIgJiBTSEZfRVhFQ0lOU1RSKSA/IFNFQ19DT0RFIDogMCkpOworICBpZiAoc3BlY2lhbF9zZWN0aW9uc1tpXS5uYW1lID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHR5cGUgPT0gU0hUX1BST0dCSVRTKQorCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOworICAgICAgZWxzZSBpZiAodHlwZSA9PSBTSFRfTk9CSVRTKQorCXsKKwkgIGZsYWdzIHw9IFNFQ19BTExPQzsKKwkgIGZsYWdzICY9fiBTRUNfTE9BRDsKKwl9CisKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9mbGFncworICAgICAgZmxhZ3MgPSBtZF9lbGZfc2VjdGlvbl9mbGFncyAoZmxhZ3MsIGF0dHIsIHR5cGUpOworI2VuZGlmCisgICAgfQorCisgIC8qIFByZXZlbnQgU0VDX0hBU19DT05URU5UUyBmcm9tIGJlaW5nIGluYWR2ZXJ0ZW50bHkgc2V0LiAgKi8KKyAgaWYgKHR5cGUgPT0gU0hUX05PQklUUykKKyAgICBzZWdfaW5mbyAoc2VjKS0+YnNzID0gMTsKKworICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7CisKKyAgLyogQWRkIGEgc3ltYm9sIGZvciB0aGlzIHNlY3Rpb24gdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCisgIHNlY3N5bSA9IHN5bWJvbF9maW5kIChzdHJpbmcpOworICBpZiAoc2Vjc3ltICE9IE5VTEwpCisgICAgc2Vjc3ltLT5ic3ltID0gc2VjLT5zeW1ib2w7CisgIGVsc2UKKyAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoc2VjKSk7CisKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaworICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKKyNlbmRpZgorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIENoYW5nZSB0byB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitvYmpfZWxmX2RhdGEgKGkpCisgICAgIGludCBpOworeworI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOworI2VuZGlmCisKKyAgcHJldmlvdXNfc2VjdGlvbiA9IG5vd19zZWc7CisgIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOworICBzX2RhdGEgKGkpOworCisjaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKKyAgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7CisjZW5kaWYKK30KKworLyogQ2hhbmdlIHRvIHRoZSAudGV4dCBzZWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK29ial9lbGZfdGV4dCAoaSkKKyAgICAgaW50IGk7Cit7CisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKKyAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7CisgIHNfdGV4dCAoaSk7CisKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaworICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorb2JqX2VsZl9zdWJzZWN0aW9uIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKKyAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7CisKKyAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBzdWJzZWdfc2V0IChub3dfc2VnLCAoc3Vic2VnVCkgdGVtcCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaworICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKKyNlbmRpZgorfQorCisvKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgcHJvY2Vzc29yIGJhY2tlbmRzIGlmIHRoZXkgY2hhbmdlCisgICBzZWN0aW9ucy4gICovCisKK3ZvaWQKK29ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKQoreworICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKKyAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Cit9CisKK3ZvaWQKK29ial9lbGZfcHJldmlvdXMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKHByZXZpb3VzX3NlY3Rpb24gPT0gMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIi5wcmV2aW91cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnNlY3Rpb247IGlnbm9yZWQiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBzdWJzZWdfc2V0IChwcmV2aW91c19zZWN0aW9uLCBwcmV2aW91c19zdWJzZWN0aW9uKTsKKyAgcHJldmlvdXNfc2VjdGlvbiA9IDA7CisKKyNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaworICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorb2JqX2VsZl9saW5lIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIC8qIEFzc3VtZSBkZWxpbWl0ZXIgaXMgcGFydCBvZiBleHByZXNzaW9uLiAgQlNENC4yIGFzIGZhaWxzIHdpdGgKKyAgICAgZGVsaWdodGZ1bCBidWcsIHNvIHdlIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCisgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGlzIGhhbmRsZXMgdGhlIC5zeW12ZXIgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIHNwZWNpZnkgYQorICAgc3ltYm9sIHZlcnNpb24uICBUaGUgc3ludGF4IGlzIGBgLnN5bXZlciBOQU1FLFNZTVZFUk5BTUUnJy4KKyAgIFNZTVZFUk5BTUUgbWF5IGNvbnRhaW4gRUxGX1ZFUl9DSFIgKCdAJykgY2hhcmFjdGVycy4gIFRoaXMKKyAgIHBzZXVkby1vcCBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgc3ltYm9sIG5hbWVkIFNZTVZFUk5BTUUKKyAgIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHN5bWJvbCBOQU1FLiAgKi8KKworc3RhdGljIHZvaWQKK29ial9lbGZfc3ltdmVyIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgYzsKKyAgc3ltYm9sUyAqc3ltOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBpZiAoc3ltLT5zeV9vYmoudmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciKSwKKwkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIGlmIChjICE9IEVMRl9WRVJfQ0hSKQorCWJyZWFrOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKKyAgICB9CisKKyAgc3ltLT5zeV9vYmoudmVyc2lvbmVkX25hbWUgPSB4c3RyZHVwIChuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBpZiAoc3RyY2hyIChzeW0tPnN5X29iai52ZXJzaW9uZWRfbmFtZSwgRUxGX1ZFUl9DSFIpID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIpLAorCSAgICAgIHN5bS0+c3lfb2JqLnZlcnNpb25lZF9uYW1lLCBTX0dFVF9OQU1FIChzeW0pKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9pbmhlcml0IHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZQorICAgdG8gdGhlIGxpbmtlciB0aGUgaGllcmFyY2h5IGluIHdoaWNoIGEgcGFydGljdWxhciB0YWJsZSByZXNpZGVzLiAgVGhlCisgICBzeW50YXggaXMgIi52dGFibGVfaW5oZXJpdCBDSElMRE5BTUUsIFBBUkVOVE5BTUUiLiAgKi8KKworc3RhdGljIHZvaWQKK29ial9lbGZfdnRhYmxlX2luaGVyaXQgKGlnbm9yZSkKK3sKKyAgY2hhciAqY25hbWUsICpwbmFtZTsKKyAgc3ltYm9sUyAqY3N5bSwgKnBzeW07CisgIGNoYXIgYywgYmFkID0gMDsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCisgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgY25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgY3N5bSA9IHN5bWJvbF9maW5kIChjbmFtZSk7CisKKyAgLyogR0NGSVhNRTogc2hvdWxkIGNoZWNrIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gLnZ0YWJsZV9pbmhlcml0cyBmb3IKKyAgICAgdGhlIHNhbWUgY2hpbGQgc3ltYm9sLiAgQWxzbywgd2UgY2FuIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMgaWYgdGhlCisgICAgIGNoaWxkIHN5bWJvbCBpcyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcGxhY2VkIGluIGEgZnJhZ21lbnQuICAqLworCisgIGlmIChjc3ltID09IE5VTEwgfHwgY3N5bS0+c3lfZnJhZyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGAlcycgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQiLAorCSAgICAgIGNuYW1lKTsKKyAgICAgIGJhZCA9IDE7CisgICAgfQorCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9pbmhlcml0Iik7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKKyAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJworICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnCisJICB8fCBpc3NwYWNlKGlucHV0X2xpbmVfcG9pbnRlclsxXSkpKQorICAgIHsKKyAgICAgIHBzeW0gPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIHBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChwbmFtZSk7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworICBpZiAoYmFkKQorICAgIHJldHVybjsKKworICBhc3NlcnQgKGNzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCk7CisgIGZpeF9uZXcgKGNzeW0tPnN5X2ZyYWcsIGNzeW0tPnN5X3ZhbHVlLlhfYWRkX251bWJlciwgMCwgcHN5bSwgMCwgMCwKKwkgICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpOworfQorICAKKy8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9lbnRyeSBwc2V1ZG8tb3AsIHdoaWNoIGlzIHVzZWQgdG8gaW5kaWNhdGUKKyAgIHRvIHRoZSBsaW5rZXIgdGhhdCBhIHZ0YWJsZSBzbG90IHdhcyB1c2VkLiAgVGhlIHN5bnRheCBpcworICAgIi52dGFibGVfZW50cnkgdGFibGVuYW1lLCBvZmZzZXQiLiAgKi8KKworc3RhdGljIHZvaWQKK29ial9lbGZfdnRhYmxlX2VudHJ5IChpZ25vcmUpCit7CisgIGNoYXIgKm5hbWU7CisgIHN5bWJvbFMgKnN5bTsKKyAgb2Zmc2V0VCBvZmZzZXQ7CisgIGNoYXIgYzsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCisgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkICgiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAudnRhYmxlX2VudHJ5Iik7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQorICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIG9mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisgIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDAsIHN5bSwgb2Zmc2V0LCAwLAorCSAgIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK29ial9yZWFkX2JlZ2luX2hvb2sgKCkKK3sKKyNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCisgIGlmIChFQ09GRl9ERUJVR0dJTkcpCisgICAgZWNvZmZfcmVhZF9iZWdpbl9ob29rICgpOworI2VuZGlmCit9CisKK3ZvaWQKK29ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7Cit7CisgIHN5bWJvbFAtPnN5X29iai5zaXplID0gTlVMTDsKKyAgc3ltYm9sUC0+c3lfb2JqLnZlcnNpb25lZF9uYW1lID0gTlVMTDsKKworI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICBlY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOworI2VuZGlmCit9CisKK3ZvaWQKK29ial9lbGZfdmVyc2lvbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBpbnQgYzsKKyAgY2hhciBjaDsKKyAgY2hhciAqcDsKKyAgYXNlY3Rpb24gKnNlZyA9IG5vd19zZWc7CisgIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKKyAgRWxmX0ludGVybmFsX05vdGUgaV9ub3RlOworICBFbGZfRXh0ZXJuYWxfTm90ZSBlX25vdGU7CisgIGFzZWN0aW9uICpub3RlX3NlY3AgPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgaW50IGksIGxlbjsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCisgICAgeworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qIC0+IDFzdCBjaGFyIG9mIHN0cmluZy4gKi8KKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgICAgIHdoaWxlIChpc19hX2NoYXIgKGMgPSBuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKKwk7CisgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOworICAgICAgKihpbnB1dF9saW5lX3BvaW50ZXIgLSAxKSA9ICdcMCc7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICAgICAgLyogY3JlYXRlIHRoZSAubm90ZSBzZWN0aW9uICovCisKKyAgICAgIG5vdGVfc2VjcCA9IHN1YnNlZ19uZXcgKCIubm90ZSIsIDApOworICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCisJCQkgICAgIG5vdGVfc2VjcCwKKwkJCSAgICAgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7CisKKyAgICAgIC8qIHByb2Nlc3MgdGhlIHZlcnNpb24gc3RyaW5nICovCisKKyAgICAgIGxlbiA9IHN0cmxlbiAobmFtZSk7CisKKyAgICAgIGlfbm90ZS5uYW1lc3ogPSAoKGxlbiArIDEpICsgMykgJiB+MzsgLyogcm91bmQgdGhpcyB0byB3b3JkIGJvdW5kYXJ5ICovCisgICAgICBpX25vdGUuZGVzY3N6ID0gMDsJLyogbm8gZGVzY3JpcHRpb24gKi8KKyAgICAgIGlfbm90ZS50eXBlID0gTlRfVkVSU0lPTjsKKyAgICAgIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoZV9ub3RlLm5hbWVzeikpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUubmFtZXN6LCA0KTsKKyAgICAgIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoZV9ub3RlLmRlc2NzeikpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUuZGVzY3N6LCA0KTsKKyAgICAgIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoZV9ub3RlLnR5cGUpKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLnR5cGUsIDQpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgY2ggPSAqKG5hbWUgKyBpKTsKKwkgIHsKKwkgICAgRlJBR19BUFBFTkRfMV9DSEFSIChjaCk7CisJICB9CisJfQorICAgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CisKKyAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmciKSk7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorb2JqX2VsZl9zaXplIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBjaGFyICpwOworICBleHByZXNzaW9uUyBleHA7CisgIHN5bWJvbFMgKnN5bTsKKworICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqcCA9IGM7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgICpwID0gMDsKKyAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBgJXMnIGluIC5zaXplIGRpcmVjdGl2ZSIpLCBuYW1lKTsKKyAgICAgICpwID0gYzsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgZXhwcmVzc2lvbiAoJmV4cCk7CisgIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiKSk7CisgICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKKyAgICB9CisgICpwID0gMDsKKyAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICpwID0gYzsKKyAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCisgICAgU19TRVRfU0laRSAoc3ltLCBleHAuWF9hZGRfbnVtYmVyKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN5bS0+c3lfb2JqLnNpemUgPSAoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOworICAgICAgKnN5bS0+c3lfb2JqLnNpemUgPSBleHA7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIEVMRiAudHlwZSBwc2V1ZG8tb3AuICBUaGlzIHNldHMgdGhlIHR5cGUgb2YgYSBzeW1ib2wuCisgICBUaGVyZSBhcmUgZm91ciBzeW50YXhlczoKKyAgIAorICAgVGhlIGZpcnN0ICh1c2VkIG9uIFNvbGFyaXMpIGlzCisgICAgICAgLnR5cGUgU1lNLCNmdW5jdGlvbgorICAgVGhlIHNlY29uZCAodXNlZCBvbiBVbml4V2FyZSkgaXMKKyAgICAgICAudHlwZSBTWU0sQGZ1bmN0aW9uCisgICBUaGUgdGhpcmQgKHJlcG9ydGVkbHkgdG8gYmUgdXNlZCBvbiBJcml4IDYuMCkgaXMKKyAgICAgICAudHlwZSBTWU0gU1RUX0ZVTkMKKyAgIFRoZSBmb3VydGggKHVzZWQgb24gTmV0QlNEL0FybSBhbmQgTGludXgvQVJNKSBpcworICAgICAgIC50eXBlIFNZTSwlZnVuY3Rpb24KKyAgICovCisKK3N0YXRpYyB2b2lkCitvYmpfZWxmX3R5cGUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBjOworICBpbnQgdHlwZTsKKyAgY29uc3QgY2hhciAqdHlwZW5hbWU7CisgIHN5bWJvbFMgKnN5bTsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICggICAqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJworICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKKyAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQorICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIHR5cGVuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgdHlwZSA9IDA7CisgIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAiZnVuY3Rpb24iKSA9PSAwCisgICAgICB8fCBzdHJjbXAgKHR5cGVuYW1lLCAiU1RUX0ZVTkMiKSA9PSAwKQorICAgIHR5cGUgPSBCU0ZfRlVOQ1RJT047CisgIGVsc2UgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJvYmplY3QiKSA9PSAwCisJICAgfHwgc3RyY21wICh0eXBlbmFtZSwgIlNUVF9PQkpFQ1QiKSA9PSAwKQorICAgIHR5cGUgPSBCU0ZfT0JKRUNUOworICBlbHNlCisgICAgYXNfYmFkIChfKCJpZ25vcmluZyB1bnJlY29nbml6ZWQgc3ltYm9sIHR5cGUgXCIlc1wiIiksIHR5cGVuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBzeW0tPmJzeW0tPmZsYWdzIHw9IHR5cGU7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK29ial9lbGZfaWRlbnQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3RhdGljIHNlZ1QgY29tbWVudF9zZWN0aW9uOworICBzZWdUIG9sZF9zZWN0aW9uID0gbm93X3NlZzsKKyAgaW50IG9sZF9zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKKworICBpZiAoIWNvbW1lbnRfc2VjdGlvbikKKyAgICB7CisgICAgICBjaGFyICpwOworICAgICAgY29tbWVudF9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jb21tZW50IiwgMCk7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY29tbWVudF9zZWN0aW9uLAorCQkJICAgICBTRUNfUkVBRE9OTFkgfCBTRUNfSEFTX0NPTlRFTlRTKTsKKyAgICAgIHAgPSBmcmFnX21vcmUgKDEpOworICAgICAgKnAgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHN1YnNlZ19zZXQgKGNvbW1lbnRfc2VjdGlvbiwgMCk7CisgIHN0cmluZ2VyICgxKTsKKyAgc3Vic2VnX3NldCAob2xkX3NlY3Rpb24sIG9sZF9zdWJzZWN0aW9uKTsKK30KKworI2lmZGVmIElOSVRfU1RBQl9TRUNUSU9OCisKKy8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFicyBzZWN0aW9uIGlzIHNwZWNpYWwuICAqLworCit2b2lkCitvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCisgICAgIHNlZ1Qgc2VnOworeworICBjaGFyICpmaWxlOworICBjaGFyICpwOworICBjaGFyICpzdGFic3RyX25hbWU7CisgIHVuc2lnbmVkIGludCBzdHJvZmY7CisKKyAgLyogRm9yY2UgdGhlIHNlY3Rpb24gdG8gYWxpZ24gdG8gYSBsb25nd29yZCBib3VuZGFyeS4gIFdpdGhvdXQgdGhpcywKKyAgICAgVW5peFdhcmUgYXIgY3Jhc2hlcy4gICovCisgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKKworICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KKyAgcCA9IGZyYWdfbW9yZSAoMTIpOworICAvKiBaZXJvIGl0IG91dC4gKi8KKyAgbWVtc2V0IChwLCAwLCAxMik7CisgIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKKyAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZ21lbnRfbmFtZSAoc2VnKSkgKyA0KTsKKyAgc3RyY3B5IChzdGFic3RyX25hbWUsIHNlZ21lbnRfbmFtZSAoc2VnKSk7CisgIHN0cmNhdCAoc3RhYnN0cl9uYW1lLCAic3RyIik7CisgIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsIHN0YWJzdHJfbmFtZSk7CisgIGtub3cgKHN0cm9mZiA9PSAxKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOworICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Cit9CisKKyNlbmRpZgorCisvKiBGaWxsIGluIHRoZSBjb3VudHMgaW4gdGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWJzIHNlY3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorYWRqdXN0X3N0YWJfc2VjdGlvbnMgKGFiZmQsIHNlYywgeHh4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiB4eHg7Cit7CisgIGNoYXIgKm5hbWU7CisgIGFzZWN0aW9uICpzdHJzZWM7CisgIGNoYXIgKnA7CisgIGludCBzdHJzeiwgbnN5bXM7CisKKyAgaWYgKHN0cm5jbXAgKCIuc3RhYiIsIHNlYy0+bmFtZSwgNSkpCisgICAgcmV0dXJuOworICBpZiAoIXN0cmNtcCAoInN0ciIsIHNlYy0+bmFtZSArIHN0cmxlbiAoc2VjLT5uYW1lKSAtIDMpKQorICAgIHJldHVybjsKKworICBuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlYy0+bmFtZSkgKyA0KTsKKyAgc3RyY3B5IChuYW1lLCBzZWMtPm5hbWUpOworICBzdHJjYXQgKG5hbWUsICJzdHIiKTsKKyAgc3Ryc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOworICBpZiAoc3Ryc2VjKQorICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKKyAgZWxzZQorICAgIHN0cnN6ID0gMDsKKyAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOworCisgIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKKyAgYXNzZXJ0IChwICE9IDApOworCisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKK30KKworI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVDT0ZGIGNvZGUuICBJdCBpcyBzdXBwb3NlZCB0bworICAgcmVjb3JkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgYmFja2VuZCBjYW4KKyAgIHdyaXRlIGl0IG91dCBjb3JyZWN0bHkuICBUaGUgRUxGIGJhY2tlbmQgZG9lc24ndCBhY3R1YWxseSBoYW5kbGUKKyAgIHRoaXMgYXQgdGhlIG1vbWVudCwgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLiAgV2Ugc2F2ZSB0aGUgaW5mb3JtYXRpb24KKyAgIGluIHRoZSBzeW1ib2wuICAqLworCit2b2lkCitlbGZfZWNvZmZfc2V0X2V4dCAoc3ltLCBleHQpCisgICAgIHN5bWJvbFMgKnN5bTsKKyAgICAgc3RydWN0IGVjb2ZmX2V4dHIgKmV4dDsKK3sKKyAgc3ltLT5ic3ltLT51ZGF0YS5wID0gKFBUUikgZXh0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaXMKKyAgIHN1cHBvc2VkIHRvICpFWFQgdG8gdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybgorICAgd2hldGhlciB0aGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gICovCisKK3N0YXRpYyBib29sZWFuCitlbGZfZ2V0X2V4dHIgKHN5bSwgZXh0KQorICAgICBhc3ltYm9sICpzeW07CisgICAgIEVYVFIgKmV4dDsKK3sKKyAgaWYgKHN5bS0+dWRhdGEucCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgKmV4dCA9ICooRVhUUiAqKSBzeW0tPnVkYXRhLnA7CisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaGFzCisgICBub3RoaW5nIHRvIGRvIGZvciBFTEYuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitlbGZfc2V0X2luZGV4IChzeW0sIGluZHgpCisgICAgIGFzeW1ib2wgKnN5bTsKKyAgICAgYmZkX3NpemVfdHlwZSBpbmR4OworeworfQorCisjZW5kaWYgLyogTkVFRF9FQ09GRl9ERUJVRyAqLworCit2b2lkCitlbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQorICAgICBzeW1ib2xTICpzeW1wOworICAgICBpbnQgKnB1bnRwOworeworI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICBlY29mZl9mcm9iX3N5bWJvbCAoc3ltcCk7CisjZW5kaWYKKworICBpZiAoc3ltcC0+c3lfb2JqLnNpemUgIT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHN5bXAtPnN5X29iai5zaXplLT5YX29wKQorCXsKKwljYXNlIE9fc3VidHJhY3Q6CisJICBTX1NFVF9TSVpFIChzeW1wLAorCQkgICAgICAoU19HRVRfVkFMVUUgKHN5bXAtPnN5X29iai5zaXplLT5YX2FkZF9zeW1ib2wpCisJCSAgICAgICArIHN5bXAtPnN5X29iai5zaXplLT5YX2FkZF9udW1iZXIKKwkJICAgICAgIC0gU19HRVRfVkFMVUUgKHN5bXAtPnN5X29iai5zaXplLT5YX29wX3N5bWJvbCkpKTsKKwkgIGJyZWFrOworCWNhc2UgT19jb25zdGFudDoKKwkgIFNfU0VUX1NJWkUgKHN5bXAsCisJCSAgICAgIChTX0dFVF9WQUxVRSAoc3ltcC0+c3lfb2JqLnNpemUtPlhfYWRkX3N5bWJvbCkKKwkJICAgICAgICsgc3ltcC0+c3lfb2JqLnNpemUtPlhfYWRkX251bWJlcikpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFzX2JhZCAoXygiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIikpOworCSAgYnJlYWs7CisJfQorICAgICAgZnJlZSAoc3ltcC0+c3lfb2JqLnNpemUpOworICAgICAgc3ltcC0+c3lfb2JqLnNpemUgPSBOVUxMOworICAgIH0KKworICBpZiAoc3ltcC0+c3lfb2JqLnZlcnNpb25lZF9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGdpdmVuIGEgbmV3IG5hbWUgd2l0aCB0aGUgLnN5bXZlciBkaXJlY3RpdmUuCisKKyAgICAgICAgIElmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLCBqdXN0IHJlbmFtZSB0aGUgc3ltYm9sIHRvCisgICAgICAgICBpbmNsdWRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gIFRoaXMgd2lsbCBtYWtlIHRoZSByZWxvY3MgYmUKKyAgICAgICAgIGFnYWluc3QgdGhlIGNvcnJlY3QgdmVyc2lvbmVkIHN5bWJvbC4KKworCSBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiwgYWRkIGFuIGFsaWFzLiAgRklYTUU6IFVzaW5nIGFuIGFsaWFzCisJIHdpbGwgcGVybWl0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gcmVmZXIgdG8gdGhlIHJpZ2h0CisJIHN5bWJvbC4gIEhvd2V2ZXIsIGl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgaXQgaXMgdGhlIGJlc3QKKwkgYXBwcm9hY2guICAqLworCisgICAgICBpZiAoISBTX0lTX0RFRklORUQgKHN5bXApKQorCXsKKwkgIGNoYXIgKnA7CisKKwkgIC8qIFZlcmlmeSB0aGF0IHRoZSBuYW1lIGlzbid0IHVzaW5nIHRoZSBAQCBzeW50YXgtLXRoaXMgaXMKKyAgICAgICAgICAgICByZXNlcnZlZCBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiB0byBsaW5rCisgICAgICAgICAgICAgYWdhaW5zdC4gICovCisJICBwID0gc3RyY2hyIChzeW1wLT5zeV9vYmoudmVyc2lvbmVkX25hbWUsIEVMRl9WRVJfQ0hSKTsKKwkgIGtub3cgKHAgIT0gTlVMTCk7CisJICBpZiAocFsxXSA9PSBFTEZfVkVSX0NIUikKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciKSwKKwkJICAgICAgc3ltcC0+c3lfb2JqLnZlcnNpb25lZF9uYW1lKTsKKwkgICAgICAqcHVudHAgPSB0cnVlOworCSAgICB9CisJICBTX1NFVF9OQU1FIChzeW1wLCBzeW1wLT5zeV9vYmoudmVyc2lvbmVkX25hbWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzeW1ib2xTICpzeW1wMjsKKworCSAgLyogRklYTUU6IENyZWF0aW5nIGEgbmV3IHN5bWJvbCBoZXJlIGlzIHJpc2t5LiAgV2UncmUgaW4gdGhlCisgICAgICAgICAgICAgZmluYWwgbG9vcCBvdmVyIHRoZSBzeW1ib2wgdGFibGUuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aAorICAgICAgICAgICAgIGl0IG9ubHkgYmVjYXVzZSB0aGUgc3ltYm9sIGdvZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwKKyAgICAgICAgICAgICB3aGVyZSB0aGUgbG9vcCB3aWxsIHN0aWxsIHNlZSBpdC4gIEl0IHdvdWxkIHByb2JhYmx5IGJlCisgICAgICAgICAgICAgYmV0dGVyIHRvIGRvIHRoaXMgaW4gb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0LiAqLworCisJICBzeW1wMiA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5bXAtPnN5X29iai52ZXJzaW9uZWRfbmFtZSk7CisKKwkgIC8qIE5vdyB3ZSBhY3QgYXMgdGhvdWdoIHdlIHNhdyBzeW1wMiA9IHN5bS4gICovCisKKwkgIFNfU0VUX1NFR01FTlQgKHN5bXAyLCBTX0dFVF9TRUdNRU5UIChzeW1wKSk7CisKKwkgIC8qIFN1YnRyYWN0aW5nIG91dCB0aGUgZnJhZyBhZGRyZXNzIGhlcmUgaXMgYSBoYWNrIGJlY2F1c2UKKyAgICAgICAgICAgICB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmluYWwgbG9vcC4gICovCisJICBTX1NFVF9WQUxVRSAoc3ltcDIsIFNfR0VUX1ZBTFVFIChzeW1wKSAtIHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MpOworCisJICBzeW1wMi0+c3lfZnJhZyA9IHN5bXAtPnN5X2ZyYWc7CisKKwkgIC8qIFRoaXMgd2lsbCBjb3B5IG92ZXIgdGhlIHNpemUgaW5mb3JtYXRpb24uICAqLworCSAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltcDIsIHN5bXApOworCisJICBpZiAoU19JU19XRUFLIChzeW1wKSkKKwkgICAgU19TRVRfV0VBSyAoc3ltcDIpOworCisJICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCisJICAgIFNfU0VUX0VYVEVSTkFMIChzeW1wMik7CisJfQorICAgIH0KKworICAvKiBEb3VibGUgY2hlY2sgd2VhayBzeW1ib2xzLiAgKi8KKyAgaWYgKHN5bXAtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspCisgICAgeworICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW1wKSkKKwlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKKwkJU19HRVRfTkFNRSAoc3ltcCkpOworICAgIH0KKworI2lmZGVmIFRDX01JUFMKKyAgLyogVGhlIElyaXggNSBhbmQgNiBhc3NlbWJsZXJzIHNldCB0aGUgdHlwZSBvZiBhbnkgY29tbW9uIHN5bWJvbCBhbmQKKyAgICAgYW55IHVuZGVmaW5lZCBub24tZnVuY3Rpb24gc3ltYm9sIHRvIFNUVF9PQkpFQ1QuICBXZSB0cnkgdG8gYmUKKyAgICAgY29tcGF0aWJsZSwgc2luY2UgbmV3ZXIgSXJpeCA1IGFuZCA2IGxpbmtlcnMgY2FyZS4gIEhvd2V2ZXIsIHdlCisgICAgIG9ubHkgc2V0IHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIFNUVF9PQkpFQ1QgaWYgd2UgYXJlIG9uIElyaXgsCisgICAgIGJlY2F1c2UgdGhhdCBpcyB0aGUgb25seSB0aW1lIGdjYyB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyAgICAgLmdsb2JhbCBkaXJlY3RpdmVzIHRvIG1hcmsgZnVuY3Rpb25zLiAgKi8KKworICBpZiAoU19JU19DT01NT04gKHN5bXApKQorICAgIHN5bXAtPmJzeW0tPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7CisKKyAgaWYgKHN0cnN0ciAoVEFSR0VUX09TLCAiaXJpeCIpICE9IE5VTEwKKyAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltcCkgJiYgKChzeW1wLT5ic3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkpKQorICAgIHN5bXAtPmJzeW0tPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7CisjZW5kaWYKKworI2lmZGVmIFRDX1BQQworICAvKiBGcm9iIHRoZSBQb3dlclBDLCBzbyB0aGF0IHRoZSBzeW1ib2wgYWx3YXlzIGhhcyBvYmplY3QgdHlwZQorICAgICBpZiBpdCBpcyBub3Qgc29tZSBvdGhlciB0eXBlLiAgVnhXb3JrcyBuZWVkcyB0aGlzLiAgKi8KKyAgaWYgKChzeW1wLT5ic3ltLT5mbGFncyAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfRklMRSB8IEJTRl9TRUNUSU9OX1NZTSkpID09IDAKKyAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltcCkpCisgICAgc3ltcC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKKyNlbmRpZgorfQorCit2b2lkCitlbGZfZnJvYl9maWxlICgpCit7CisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBhZGp1c3Rfc3RhYl9zZWN0aW9ucywgKFBUUikgMCk7CisKKyNpZmRlZiBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZworICBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyAoKTsKKyNlbmRpZgorfQorCisvKiBJdCBpcyByZXF1aXJlZCB0aGF0IHdlIGxldCB3cml0ZV9yZWxvY3MgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8KKyAgIG9wdGltaXplIGF3YXkgZml4dXBzIGJlZm9yZSBvdXRwdXQgaGFzIGJlZ3VuLCBzaW5jZSBpdCBpcyBwb3NzaWJsZQorICAgdG8gZWxpbWluYXRlIGFsbCBmaXh1cHMgZm9yIGEgc2VjdGlvbiBhbmQgdGh1cyB3ZSBuZXZlciBzaG91bGQKKyAgIGhhdmUgZ2VuZXJhdGVkIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24uICAqLworCit2b2lkCitlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQoreworI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICAvKiBHZW5lcmF0ZSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqZGVidWdfc3dhcDsKKyAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnOworICAgICAgY2hhciAqYnVmOworICAgICAgYXNlY3Rpb24gKnNlYzsKKworICAgICAgZGVidWdfc3dhcAorCT0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKHN0ZG91dHB1dCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7CisgICAgICBrbm93IChkZWJ1Z19zd2FwICE9IChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqKSBOVUxMKTsKKyAgICAgIGVjb2ZmX2J1aWxkX2RlYnVnICgmZGVidWcuc3ltYm9saWNfaGVhZGVyLCAmYnVmLCBkZWJ1Z19zd2FwKTsKKworICAgICAgLyogU2V0IHVwIHRoZSBwb2ludGVycyBpbiBkZWJ1Zy4gICovCisjZGVmaW5lIFNFVChwdHIsIG9mZnNldCwgdHlwZSkgXAorICAgIGRlYnVnLnB0ciA9ICh0eXBlKSAoYnVmICsgZGVidWcuc3ltYm9saWNfaGVhZGVyLm9mZnNldCkKKworICAgICAgU0VUIChsaW5lLCBjYkxpbmVPZmZzZXQsIHVuc2lnbmVkIGNoYXIgKik7CisgICAgICBTRVQgKGV4dGVybmFsX2RuciwgY2JEbk9mZnNldCwgUFRSKTsKKyAgICAgIFNFVCAoZXh0ZXJuYWxfcGRyLCBjYlBkT2Zmc2V0LCBQVFIpOworICAgICAgU0VUIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBQVFIpOworICAgICAgU0VUIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBQVFIpOworICAgICAgU0VUIChleHRlcm5hbF9hdXgsIGNiQXV4T2Zmc2V0LCB1bmlvbiBhdXhfZXh0ICopOworICAgICAgU0VUIChzcywgY2JTc09mZnNldCwgY2hhciAqKTsKKyAgICAgIFNFVCAoZXh0ZXJuYWxfZmRyLCBjYkZkT2Zmc2V0LCBQVFIpOworICAgICAgU0VUIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBQVFIpOworICAgICAgLyogc3NleHQgYW5kIGV4dGVybmFsX2V4dCBhcmUgc2V0IHVwIGp1c3QgYmVsb3cuICAqLworCisjdW5kZWYgU0VUCisKKyAgICAgIC8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCisgICAgICBkZWJ1Zy5zc2V4dCA9IGRlYnVnLnNzZXh0X2VuZCA9IE5VTEw7CisgICAgICBkZWJ1Zy5leHRlcm5hbF9leHQgPSBkZWJ1Zy5leHRlcm5hbF9leHRfZW5kID0gTlVMTDsKKyAgICAgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLCB0cnVlLAorCQkJCSAgICAgICBlbGZfZ2V0X2V4dHIsIGVsZl9zZXRfaW5kZXgpKQorCWFzX2ZhdGFsIChfKCJGYWlsZWQgdG8gc2V0IHVwIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjogJXMiKSwKKwkJICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisKKyAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIubWRlYnVnIik7CisgICAgICBhc3NlcnQgKHNlYyAhPSBOVUxMKTsKKworICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKTsKKworICAgICAgLyogV2Ugc2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBjYWxsIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cworCSB0byBmb3JjZSB0aGUgRUxGIGJhY2tlbmQgdG8gYWxsb2NhdGUgYSBmaWxlIHBvc2l0aW9uLCBhbmQgdGhlbgorCSB3cml0ZSBvdXQgdGhlIGRhdGEuICBGSVhNRTogSXMgdGhpcyByZWFsbHkgdGhlIGJlc3Qgd2F5IHRvIGRvCisJIHRoaXM/ICAqLworICAgICAgc2VjLT5fcmF3X3NpemUgPSBiZmRfZWNvZmZfZGVidWdfc2l6ZSAoc3Rkb3V0cHV0LCAmZGVidWcsIGRlYnVnX3N3YXApOworCisgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLCAoUFRSKSBOVUxMLAorCQkJCSAgICAgIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpIDApKQorCWFzX2ZhdGFsIChfKCJDYW4ndCBzdGFydCB3cml0aW5nIC5tZGVidWcgc2VjdGlvbjogJXMiKSwKKwkJICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisKKyAgICAgIGtub3cgKHN0ZG91dHB1dC0+b3V0cHV0X2hhc19iZWd1biA9PSB0cnVlKTsKKyAgICAgIGtub3cgKHNlYy0+ZmlsZXBvcyAhPSAwKTsKKworICAgICAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChzdGRvdXRwdXQsICZkZWJ1ZywgZGVidWdfc3dhcCwKKwkJCQkgICBzZWMtPmZpbGVwb3MpKQorCWFzX2ZhdGFsIChfKCJDb3VsZCBub3Qgd3JpdGUgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIpLAorCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICB9CisjZW5kaWYgLyogTkVFRF9FQ09GRl9ERUJVRyAqLworfQorCisjaWZkZWYgU0NPX0VMRgorCisvKiBIZWF2aWx5IHBsYWdhcml6ZWQgZnJvbSBvYmpfZWxmX3ZlcnNpb24uICBUaGUgaWRlYSBpcyB0byBlbWl0IHRoZQorICAgU0NPIHNwZWNpZmljIGlkZW50aWZpZXIgaW4gdGhlIC5ub3RlcyBzZWN0aW9uIHRvIHNhdGlzZnkgdGhlIFNDTworICAgbGlua2VyLgorCisgICBUaGlzIGxvb2tzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCByZWFsbHkgaXMuICBBcyBvcHBvc2VkIHRvIHRoZQorICAgIm9idmlvdXMiIHNvbHV0aW9uLCB0aGlzIHNob3VsZCBoYW5kbGUgdGhlIGNyb3NzIGRldiBjYXNlcworICAgY29ycmVjdGx5LiAgKGkuZSwgaG9zdGluZyBvbiBhIDY0IGJpdCBiaWcgZW5kaWFuIHByb2Nlc3NvciwgYnV0CisgICBnZW5lcmF0aW5nIFNDTyBFbGYgY29kZSkgRWZmaWNpZW5jeSBpc24ndCBhIGNvbmNlcm4sIGFzIHRoZXJlCisgICBzaG91bGQgYmUgZXhhY3RseSBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMgcGVyIG9iamVjdCBtb2R1bGUuCisKKyAgIFNDTyBPcGVuU2VydmVyIDUgaWRlbnRpZmllcyBpdCdzIEVMRiBtb2R1bGVzIHdpdGggYSBzdGFuZGFyZCBFTEYKKyAgIC5ub3RlIHNlY3Rpb24uCisKKyAgIGludF8zMiBuYW1lc3ogID0gNCA7ICBOYW1lIHNpemUgCisgICBpbnRfMzIgZGVzY3N6ICA9IDEyIDsgRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gCisgICBpbnRfMzIgdHlwZSAgICA9IDEgOyAgCisgICBjaGFyICAgbmFtZVs0XSA9ICJTQ08iIDsgT3JpZ2luYXRvciBuYW1lIEFMV0FZUyBTQ08gKyBOVUxMIAorICAgaW50XzMyIHZlcnNpb24gPSAobWFqb3IgdmVyICMgPDwgMTYpICB8IHZlcnNpb24gb2YgdG9vbHMgOworICAgaW50XzMyIHNvdXJjZSAgPSAodG9vbF9pZCA8PCAxNiApIHwgMSA7CisgICBpbnRfMzIgaW5mbyAgICA9IDAgOyAgICBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBTQ08gdG9vbHMsIGJ1dCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgdGhlIHNvdXJjZSAKKwkJCSAgIGVudmlyb25tZW50IHRvIHNldCB0aGVtLiAgU0NPIGxkIGN1cnJlbnRseQorCQkJICAgaWdub3JlcyB0aGVtLCBhbmQgcmVjb21tZW5kcyB3ZSBzZXQgdGhlbQorCQkJICAgdG8gemVyby4gICovCisKKyNkZWZpbmUgU0NPX01BSk9SX1ZFUlNJT04gMHgxCisjZGVmaW5lIFNDT19NSU5PUl9WRVJTSU9OIDB4MQorCit2b2lkCitzY29faWQgKCkKK3sKKworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBpbnQgYzsKKyAgY2hhciBjaDsKKyAgY2hhciAqcDsKKyAgYXNlY3Rpb24gKnNlZyA9IG5vd19zZWc7CisgIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKKyAgRWxmX0ludGVybmFsX05vdGUgaV9ub3RlOworICBFbGZfRXh0ZXJuYWxfTm90ZSBlX25vdGU7CisgIGFzZWN0aW9uICpub3RlX3NlY3AgPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgaW50IGksIGxlbjsKKworICAvKiBjcmVhdGUgdGhlIC5ub3RlIHNlY3Rpb24gKi8KKworICBub3RlX3NlY3AgPSBzdWJzZWdfbmV3ICgiLm5vdGUiLCAwKTsKKyAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCisJCQkgbm90ZV9zZWNwLAorCQkJIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOworCisgIC8qIHByb2Nlc3MgdGhlIHZlcnNpb24gc3RyaW5nICovCisKKyAgaV9ub3RlLm5hbWVzeiA9IDQ7IAorICBpX25vdGUuZGVzY3N6ID0gMTI7CQkvKiAxMiBkZXNjcmlwdGl2ZSBieXRlcyAqLworICBpX25vdGUudHlwZSA9IE5UX1ZFUlNJT047CS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcgKi8KKworICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGlfbm90ZS5uYW1lc3opKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUubmFtZXN6LCA0KTsKKworICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGlfbm90ZS5kZXNjc3opKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUuZGVzY3N6LCA0KTsKKworICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGlfbm90ZS50eXBlKSk7CisgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLnR5cGUsIDQpOworCisgIHAgPSBmcmFnX21vcmUgKDQpOworICBzdHJjcHkgKHAsICJTQ08iKTsgCisKKyAgLyogTm90ZTogdGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEVMRiB3ZSdyZSByZXByZXNlbnRpbmcgKi8KKyAgcCA9IGZyYWdfbW9yZSAoNCk7CisgIG1kX251bWJlcl90b19jaGFycyAocCwgKFNDT19NQUpPUl9WRVJTSU9OIDw8IDE2KSB8IChTQ09fTUlOT1JfVkVSU0lPTiksIDQpOworCisgIC8qIEhlcmUsIHdlIHBpY2sgYSBtYWdpYyBudW1iZXIgZm9yIG91cnNlbHZlcyAoeWVzLCBJICJyZWdpc3RlcmVkIgorICAgICBpdCB3aXRoIFNDTy4gIFRoZSBib3R0b20gYml0IHNob3dzIHRoYXQgd2UgYXJlIGNvbXBhdCB3aXRoIHRoZQorICAgICBTQ08gQUJJLiAgKi8KKyAgcCA9IGZyYWdfbW9yZSAoNCk7CisgIG1kX251bWJlcl90b19jaGFycyAocCwgMHg0YzUyMDAwMCB8IDB4MDAwMSwgNCk7CisKKyAgLyogSWYgd2Uga25ldyAob3IgY2FyZWQpIHdoYXQgdGhlIHNvdXJjZSBsYW5ndWFnZSBvcHRpb25zIHdlcmUsIHdlJ2QKKyAgICAgZmlsbCB0aGVtIGluIGhlcmUuICBTQ08gaGFzIGdpdmVuIHVzIHBlcm1pc3Npb24gdG8gaWdub3JlIHRoZXNlCisgICAgIGFuZCBqdXN0IHNldCB0aGVtIHRvIHplcm8uICAqLworICBwID0gZnJhZ19tb3JlICg0KTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAweDAwMDAsIDQpOworIAorICBmcmFnX2FsaWduICgyLCAwLCAwKTsKKworICAvKiBXZSBwcm9iYWJseSBjYW4ndCByZXN0b3JlIHRoZSBjdXJyZW50IHNlZ21lbnQsIGZvciB0aGVyZSBsaWtlbHkKKyAgICAgaXNuJ3Qgb25lIHlldC4uLiAgKi8KKyAgaWYgKHNlZyAmJiBzdWJzZWcpCisgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOworCit9CisKKyNlbmRpZiAvKiBTQ09fRUxGICovCisKK2NvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVsZl9mb3JtYXRfb3BzID0KK3sKKyAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKKyAgMCwKKyAgMSwKKyAgZWxmX2Zyb2Jfc3ltYm9sLAorICBlbGZfZnJvYl9maWxlLAorICBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcywKKyAgZWxmX3NfZ2V0X3NpemUsIGVsZl9zX3NldF9zaXplLAorICBlbGZfc19nZXRfYWxpZ24sIGVsZl9zX3NldF9hbGlnbiwKKyAgZWxmX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCisjaWZkZWYgTkVFRF9FQ09GRl9ERUJVRworICBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vLAorICBlY29mZl9zdGFiLAorI2Vsc2UKKyAgMCwKKyAgMCwJCQkJLyogcHJvY2Vzc19zdGFiICovCisjZW5kaWYKKyAgZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAorICBlbGZfcG9wX2luc2VydCwKKyNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCisgIGVsZl9lY29mZl9zZXRfZXh0LAorI2Vsc2UKKyAgMCwKKyNlbmRpZgorICBvYmpfcmVhZF9iZWdpbl9ob29rLAorICBvYmpfc3ltYm9sX25ld19ob29rLAorfTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVsZi5oIGIvZ2FzL2NvbmZpZy9vYmotZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0YmM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLWVsZi5oCkBAIC0wLDAgKzEsMTk0IEBACisvKiBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKKyAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLworCisjaWZuZGVmIF9PQkpfRUxGX0gKKyNkZWZpbmUgX09CSl9FTEZfSAorCisjZGVmaW5lIE9CSl9FTEYgMQorCisjZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lbGZfZmxhdm91cgorCisjaW5jbHVkZSA8YmZkLmg+CisKKyNkZWZpbmUgQllURVNfSU5fV09SRCA0CQkvKiBmb3Igbm93ICovCisjaW5jbHVkZSAiYmZkL2VsZi1iZmQuaCIKKworLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHN5bWJvbC4gICovCisKKy8qIEZJWE1FOiBGb3Igc29tZSByZWFzb24sIHRoaXMgc3RydWN0dXJlIGlzIG5lZWRlZCBib3RoIGhlcmUgYW5kIGluCisgICBvYmotbXVsdGkuaC4gICovCisjaWZuZGVmIE9CSl9TWU1GSUVMRF9UWVBFCitzdHJ1Y3QgZWxmX29ial9zeQoreworICAvKiBVc2UgdGhpcyB0byBrZWVwIHRyYWNrIG9mIC5zaXplIGV4cHJlc3Npb25zIHRoYXQgaW52b2x2ZQorICAgICBkaWZmZXJlbmNlcyB0aGF0IHdlIGNhbid0IGNvbXB1dGUgeWV0LiAgKi8KKyAgZXhwcmVzc2lvblMgKnNpemU7CisKKyAgLyogVGhlIG5hbWUgc3BlY2lmaWVkIGJ5IHRoZSAuc3ltdmVyIGRpcmVjdGl2ZS4gICovCisgIGNoYXIgKnZlcnNpb25lZF9uYW1lOworfTsKKyNlbmRpZgorCisjZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBlbGZfb2JqX3N5CisKKy8qIFN5bWJvbCBmaWVsZHMgdXNlZCBieSB0aGUgRUxGIGJhY2sgZW5kLiAgKi8KKyNkZWZpbmUgRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTIGludCBsb2NhbDoxOworCisvKiBEb24ndCBjaGFuZ2UgdGhpczsgY2hhbmdlIEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyBpbnN0ZWFkLiAgKi8KKyNkZWZpbmUgVEFSR0VUX1NZTUJPTF9GSUVMRFMgRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTCisKKyNpbmNsdWRlICJ0YXJnLWNwdS5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAgIUZBTFNFCisjZW5kaWYKKworI2RlZmluZSBvYmpfYmVnaW4oKSBlbGZfYmVnaW4gKCkKK2V4dGVybiB2b2lkIGVsZl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBhZGRyZXNzIHNpemUhICovCisjZGVmaW5lIGVsZl9zeW1ib2woYXN5bWJvbCkgKChlbGZfc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCisKKyNkZWZpbmUgU19HRVRfU0laRShTKSAoZWxmX3N5bWJvbCAoKFMpLT5ic3ltKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplKQorI2RlZmluZSBTX1NFVF9TSVpFKFMsVikgXAorICAoZWxmX3N5bWJvbCgoUyktPmJzeW0pLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgPSAoVikpCisKKyNkZWZpbmUgU19HRVRfQUxJR04oUykgKGVsZl9zeW1ib2wgKChTKS0+YnN5bSktPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWUpCisjZGVmaW5lIFNfU0VUX0FMSUdOKFMsVikgXAorICAoZWxmX3N5bWJvbCAoKFMpLT5ic3ltKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSA9IChWKSkKKworI2RlZmluZSBTX0dFVF9PVEhFUihTKSAoZWxmX3N5bWJvbCAoKFMpLT5ic3ltKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcikKKyNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKSBcCisgIChlbGZfc3ltYm9sICgoUyktPmJzeW0pLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyID0gKFYpKQorCitleHRlcm4gYXNlY3Rpb24gKmdkYl9zZWN0aW9uOworCisjZGVmaW5lIG9ial9mcm9iX2ZpbGUgIGVsZl9mcm9iX2ZpbGUKK2V4dGVybiB2b2lkIGVsZl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICBlbGZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcworZXh0ZXJuIHZvaWQgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIG9ial9hcHBfZmlsZSBlbGZfZmlsZV9zeW1ib2wKK2V4dGVybiB2b2lkIGVsZl9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHZvaWQgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgb2JqX2VsZl9zZWN0aW9uIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgb2JqX2VsZl9wcmV2aW91cyBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIG9ial9lbGZfdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKKworLyogQkZEIHdhbnRzIHRvIHdyaXRlIHRoZSB1ZGF0YSBmaWVsZCwgd2hpY2ggaXMgYSBuby1ubyBmb3IgdGhlCisgICBnbG9iYWxseSBkZWZpbmVkIHNlY3Rpb25zLiAgKi8KKyNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJKChTRUMpLT5vd25lciAhPSAwKQorCisvKiBXaGVuIHNldHRpbmcgb25lIHN5bWJvbCBlcXVhbCB0byBhbm90aGVyLCBieSBkZWZhdWx0IHdlIHByb2JhYmx5CisgICB3YW50IHRoZW0gdG8gaGF2ZSB0aGUgc2FtZSAic2l6ZSIsIHdoYXRldmVyIGl0IG1lYW5zIGluIHRoZSBjdXJyZW50CisgICBjb250ZXh0LiAgKi8KKyNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoREVTVCxTUkMpCQkJXAorZG8JCQkJCQkJCVwKKyAgewkJCQkJCQkJXAorICAgIGlmICgoU1JDKS0+c3lfb2JqLnNpemUpCQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJaWYgKChERVNUKS0+c3lfb2JqLnNpemUgPT0gTlVMTCkJCQlcCisJICAoREVTVCktPnN5X29iai5zaXplID0JCQkJCVwKKwkgICAgKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsJXAorCSooREVTVCktPnN5X29iai5zaXplID0gKihTUkMpLT5zeV9vYmouc2l6ZTsJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCVwKKwlpZiAoKERFU1QpLT5zeV9vYmouc2l6ZSAhPSBOVUxMKQkJCVwKKwkgIGZyZWUgKChERVNUKS0+c3lfb2JqLnNpemUpOwkJCQlcCisJKERFU1QpLT5zeV9vYmouc2l6ZSA9IE5VTEw7CQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgICBTX1NFVF9TSVpFICgoREVTVCksIFNfR0VUX1NJWkUgKFNSQykpOwkJCVwKKyAgICBTX1NFVF9PVEhFUiAoKERFU1QpLCBTX0dFVF9PVEhFUiAoU1JDKSk7CQkJXAorICB9CQkJCQkJCQlcCit3aGlsZSAoMCkKKworLyogU3RhYnMgZ28gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAxCisKKy8qIFdlIG5lZWQgMTIgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIHRvIGhvbGQgc29tZSBpbml0aWFsCisgICBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gdm9pZCBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKKyNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCisKKyNpZmRlZiBUQ19BTFBIQQorI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgYWxwaGFfZmxhZ19tZGVidWcKK2V4dGVybiBpbnQgYWxwaGFfZmxhZ19tZGVidWc7CisjZW5kaWYKKworLyogRm9yIG5vdywgYWx3YXlzIHNldCBFQ09GRl9ERUJVR0dJTkcgZm9yIGEgTUlQUyB0YXJnZXQuICAqLworI2lmZGVmIFRDX01JUFMKKyNpZmRlZiBNSVBTX1NUQUJTX0VMRgorI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAorI2Vsc2UKKyNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDEKKyNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLworI2VuZGlmIC8qIFRDX01JUFMgKi8KKworI2lmZGVmIEVDT0ZGX0RFQlVHR0lORworLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHNvbWUKKyAgIGFkZGl0aW9uYWwgZmllbGRzIGZvciBlYWNoIHN5bWJvbC4gICovCisjdW5kZWYgVEFSR0VUX1NZTUJPTF9GSUVMRFMKKyNkZWZpbmUgVEFSR0VUX1NZTUJPTF9GSUVMRFMgXAorICBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMgXAorICBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsgXAorICBzdHJ1Y3QgbG9jYWxzeW0gKmVjb2ZmX3N5bWJvbDsgXAorICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7CisKKy8qIFdlIHNtdWdnbGUgc3RhYnMgaW4gRUNPRkYgcmF0aGVyIHRoYW4gdXNpbmcgYSBzZXBhcmF0ZSBzZWN0aW9uLgorICAgVGhlIElyaXggbGlua2VyIGNhbiBub3QgaGFuZGxlIGEgc2VwYXJhdGUgc3RhYnMgc2VjdGlvbi4gICovCisKKyN1bmRlZiAgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUworI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TICghRUNPRkZfREVCVUdHSU5HKQorCisjdW5kZWYgIElOSVRfU1RBQl9TRUNUSU9OCisjZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgXAorICAoKHZvaWQpKEVDT0ZGX0RFQlVHR0lORyA/IDAgOiAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKSwgMCkpKQorCisjZGVmaW5lIE9CSl9QUk9DRVNTX1NUQUIoc2VnLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKQkJXAorICBpZiAoRUNPRkZfREVCVUdHSU5HKQkJCQkJCQlcCisgICAgZWNvZmZfc3RhYiAoKHNlZyksICh3aGF0KSwgKHN0cmluZyksICh0eXBlKSwgKG90aGVyKSwgKGRlc2MpKQorI2VuZGlmIC8qIEVDT0ZGX0RFQlVHR0lORyAqLworCitleHRlcm4gdm9pZCBlbGZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBpbnQgKikpOworI2lmbmRlZiBvYmpfZnJvYl9zeW1ib2wKKyNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHN5bXAsIHB1bnQpIGVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgJnB1bnQpCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZWxmX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBvYmpfcG9wX2luc2VydCgpCWVsZl9wb3BfaW5zZXJ0KCkKKworI2lmbmRlZiBPQkpfTUFZQkVfRUxGCisjZGVmaW5lIG9ial9lY29mZl9zZXRfZXh0IGVsZl9lY29mZl9zZXRfZXh0CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3QgZWNvZmZfZXh0cjsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgZWxmX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqKSk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9PQkpfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguYyBiL2dhcy9jb25maWcvb2JqLWV2YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODE4YzgzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotZXZheC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIG9iai1ldmF4LmMgLSBFVkFYIChvcGVuVk1TL0FscGhhKSBvYmplY3QgZmlsZSBmb3JtYXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpIG9mCisgICAgIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAgIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWV2YXguaCIKKworI2luY2x1ZGUgImFzLmgiCisKK3N0YXRpYyB2b2lkIHNfZXZheF93ZWFrIFBBUkFNUyAoKGludCkpOworCitjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyAid2VhayIsIHNfZXZheF93ZWFrLCAwfSwKKyAgezAsIDAsIDB9LAorfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLworCit2b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgKCkge30KKworLyogSGFuZGxlIHRoZSB3ZWFrIHNwZWNpZmljIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX2V2YXhfd2VhayAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgYzsKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKworICBkbworICAgIHsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOworICAgICAgaWYgKGMgPT0gJywnKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgU0tJUF9XSElURVNQQUNFICgpOworCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKKwkgICAgYyA9ICdcbic7CisJfQorICAgIH0KKyAgd2hpbGUgKGMgPT0gJywnKTsKKworICBpZiAoZmxhZ19tcmkpCisgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGNvbW1lbnQtY29sdW1uOiAwCisgKiBmaWxsLWNvbHVtbjogMTMxCisgKiBFbmQ6CisgKi8KKworLyogZW5kIG9mIG9iai1ldmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguaCBiL2dhcy9jb25maWcvb2JqLWV2YXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDlkYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotZXZheC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpIG9mCisgICAgIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgICBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCisgKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyAqLworCisvKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAqLworI2RlZmluZSBPQkpfRVZBWCAxCisKKy8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gKi8KKyNpbmNsdWRlICJ0YXJnLWNwdS5oIgorCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCisjZW5kaWYKKworLyoKKyAqIFNZTUJPTFMKKyAqLworCisvKgorICogSWYgeW91ciBvYmplY3QgZm9ybWF0IG5lZWRzIHRvIHJlb3JkZXIgc3ltYm9scywgZGVmaW5lIHRoaXMuICBXaGVuCisgKiBkZWZpbmVkLCBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGFuZCBmdW5jdGlvbnMgYXJlCisgKiBtYWRlIGF2YWlsYWJsZSBmb3IgcHVzaCwgaW5zZXJ0LCBhcHBlbmQsIGFuZCBkZWxldGUuICBJZiBub3QgZGVmaW5lZCwKKyAqIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBzaW5nbHkgbGlua2VkIGxpc3QsIG9ubHkgdGhlIGFwcGVuZCBhbmQgY2xlYXIKKyAqIGZhY2lsaXRpZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHRoZXkgYXJlIG1hY3Jvcy4KKyAqLworCisvKiAjZGVmaW5lIFNZTUJPTFNfTkVFRF9QQUNLUE9JTlRFUlMgKi8KKworLyogICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdm9pZCAqbm90aGluZzsKKyAgfQorb2JqX3N5bWJvbF90eXBlOwkJLyogc2hvdWxkIGJlIHRoZSBmb3JtYXQncyBzeW1ib2wgc3RydWN0dXJlICovCisKK3R5cGVkZWYgdm9pZCAqb2JqZWN0X2hlYWRlcnM7CisKKyNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgwKQkvKiB5b3VyIG1hZ2ljIG51bWJlciAqLworCisjZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICovCisKKyNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKSAgICAgICAgezt9CisKKyNkZWZpbmUgU19TRVRfT1RIRVIoUyxWKQorI2RlZmluZSBTX1NFVF9UWVBFKFMsVCkKKyNkZWZpbmUgU19TRVRfREVTQyhTLEQpCisjZGVmaW5lIFNfR0VUX09USEVSKFMpCTAKKyNkZWZpbmUgU19HRVRfVFlQRShTKQkwCisjZGVmaW5lIFNfR0VUX0RFU0MoUykJMAorCisjZGVmaW5lIFBEU0NfU19LX0tJTkRfRlBfU1RBQ0sgOQorI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSIDEwCisjZGVmaW5lIFBEU0NfU19LX0tJTkRfTlVMTCA4CisKKyNkZWZpbmUgUERTQ19TX0tfTUlOX1NUQUNLX1NJWkUgMzIKKyNkZWZpbmUgUERTQ19TX0tfTUlOX1JFR0lTVEVSX1NJWkUgMjQKKyNkZWZpbmUgUERTQ19TX0tfTlVMTF9TSVpFIDE2CisKKyNkZWZpbmUgUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgMHg4MAkvKiBsb3cgYnl0ZSAqLworI2RlZmluZSBQRFNDX1NfTV9OQVRJVkUgMHgxMAkJLyogaGlnaCBieXRlICovCisjZGVmaW5lIFBEU0NfU19NX05PX0pBQ0tFVCAweDIwCQkvKiBoaWdoIGJ5dGUgKi8KKworI2RlZmluZSBMS1BfU19LX1NJWkUgMTYKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGNvbW1lbnQtY29sdW1uOiAwCisgKiBmaWxsLWNvbHVtbjogMTMxCisgKiBFbmQ6CisgKi8KKworLyogZW5kIG9mIG9iai1ldmF4LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYyBiL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZjM2QxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5jIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgorICAgb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBzb3VyY2UgZmlsZXMuCisKKyAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCitjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKKworLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KKy8qIEFzIGluIDBmMTIuNDU2ICovCisvKiBvciAgICAwZDEuMjM0NWUxMiAqLworY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOworCisvKiBUaGVzZSBjaGFycyBzdGFydCBhIGNvbW1lbnQgYW55d2hlcmUgaW4gYSBzb3VyY2UgZmlsZSAoZXhjZXB0IGluc2lkZQorICAgYW5vdGhlciBjb21tZW50ICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGNvbW1lbnQtY29sdW1uOiAwCisgKiBmaWxsLWNvbHVtbjogMTMxCisgKiBFbmQ6CisgKi8KKworLyogZW5kIG9mIG9iai1nZW5lcmljLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaCBiL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzE4ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5oCisgICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCisgKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyAqLworCisvKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAqLworI2RlZmluZSBPQkpfR0VORVJJQyAxCisKKy8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gKi8KKyNpbmNsdWRlICJ0YXJnLWNwdS5oIgorCisvKgorICogU1lNQk9MUworICovCisKKy8qCisgKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KKyAqIGRlZmluZWQsIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGZ1bmN0aW9ucyBhcmUKKyAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAorICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgorICogZmFjaWxpdGllcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhleSBhcmUgbWFjcm9zLgorICovCisKKy8qICNkZWZpbmUgU1lNQk9MU19ORUVEX1BBQ0tQT0lOVEVSUyAqLworCisvKiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICB2b2lkICpub3RoaW5nOworICB9CisKK29ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOworCisvKiBzeW1ib2xzIGhhdmUgbmFtZXMgKi8KKyNkZWZpbmUgU19HRVRfTkFNRShzKQkJKCJmb28iKQkvKiBnZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2xQICovCisjZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJOworLyogc3ltYm9scyBoYXZlIHNlZ21lbnRzICovCisjZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKFNFR19VTktOT1dOKQorI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsdikJOworLyogc3ltYm9scyBtYXkgYmUgZXh0ZXJuYWwgKi8KKyNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoMCkKKyNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJOworCisvKiBzeW1ib2xzIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgKi8KKyNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoMCkKKworCisjZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KKworI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogY29tbWVudC1jb2x1bW46IDAKKyAqIGZpbGwtY29sdW1uOiAxMzEKKyAqIEVuZDoKKyAqLworCisvKiBlbmQgb2Ygb2JqLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYyBiL2dhcy9jb25maWcvb2JqLWhwMzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5Y2M1MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLWhwMzAwLmMKQEAgLTAsMCArMSw1MiBAQAorLyogVGhpcyBmaWxlIGlzIG9iai1ocDMwMC5oCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy9vYmotYW91dC5jIgorCisvKiBBb3V0IGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwordm9pZAoraHAzMDBfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCisgICAgIGNoYXIgKip3aGVyZTsKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Cit7CisgIHRjX2hlYWRlcnNfaG9vayAoaGVhZGVycyk7CisKKyNkZWZpbmUgRE8oRklFTEQpCVwKKyAgeyBcCisgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5GSUVMRCwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuRklFTEQpKTsgXAorICAgICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5GSUVMRCk7IFwKKyAgfQorCisgIERPIChhX2luZm8pOworICBETyAoYV9zcGFyZTEpOworICBETyAoYV9zcGFyZTIpOworICBETyAoYV90ZXh0KTsgICAgICAKKyAgRE8gKGFfZGF0YSk7ICAgICAKKyAgRE8gKGFfYnNzKTsgICAgIAorICBETyAoYV90cnNpemUpOyAKKyAgRE8gKGFfZHJzaXplKTsKKyAgRE8gKGFfc3BhcmUzKTsKKyAgRE8gKGFfc3BhcmU0KTsKKyAgRE8gKGFfc3BhcmU1KTsKKyAgRE8gKGFfZW50cnkpOyAKKyAgRE8gKGFfc3BhcmU2KTsKKyAgRE8gKGFfc3BhcmU3KTsKKyAgRE8gKGFfc3ltcyk7ICAKKyAgRE8gKGFfc3BhcmU4KTsKK30KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWhwMzAwLmggYi9nYXMvY29uZmlnL29iai1ocDMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDAwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1ocDMwMC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIFRoaXMgZmlsZSBpcyBvYmotaHAzMDAuaAorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fCisKK3N0cnVjdCBleGVjX2J5dGVzCit7CisgIHVuc2lnbmVkIGNoYXIgYV9pbmZvWzRdOyAgIC8qIGFfbWFjaHR5cGUvYV9tYWdpYyAqLworICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUxWzRdOworICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUyWzRdOworICB1bnNpZ25lZCBjaGFyIGFfdGV4dFs0XTsgICAvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgY2hhciBhX2RhdGFbNF07ICAgLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGNoYXIgYV9ic3NbNF07ICAgIC8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgY2hhciBhX3Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgY2hhciBhX2Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgY2hhciBhX3NwYXJlM1s0XTsgLyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KKyAgdW5zaWduZWQgY2hhciBhX3NwYXJlNFs0XTsgLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU1WzRdOyAvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyIGFfZW50cnlbNF07ICAvKiBzdGFydCBhZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTZbNF07IC8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU3WzRdOyAvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KKyAgdW5zaWduZWQgY2hhciBhX3N5bXNbNF07ICAgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGNoYXIgYV9zcGFyZThbNF07Cit9OworCisvKiBIb3cgYmlnIHRoZSAic3RydWN0IGV4ZWMiIGlzIG9uIGRpc2sgKi8KKyNkZWZpbmUgRVhFQ19CWVRFU19TSVpFICgxNiAqIDQpCisKK3N0cnVjdCBleGVjCit7CisgIHVuc2lnbmVkIGxvbmcgYV9pbmZvOworICB1bnNpZ25lZCBsb25nIGFfc3BhcmUxOworICB1bnNpZ25lZCBsb25nIGFfc3BhcmUyOworICB1bnNpZ25lZCBsb25nIGFfdGV4dDsgICAgICAKKyAgdW5zaWduZWQgbG9uZyBhX2RhdGE7ICAgICAKKyAgdW5zaWduZWQgbG9uZyBhX2JzczsgICAgIAorICB1bnNpZ25lZCBsb25nIGFfdHJzaXplOyAKKyAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMzsKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNDsKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNTsKKyAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OyAKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNjsKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNzsKKyAgdW5zaWduZWQgbG9uZyBhX3N5bXM7ICAKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlODsKK307CisKKyNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShPTUFHSUMpCisjZGVmaW5lIEFPVVRfVkVSU0lPTgkweDAyCisjZGVmaW5lIEFPVVRfTUFDSFRZUEUJMHgwYworI2RlZmluZSBPTUFHSUMJCTB4MTA2CisgICAgCisjZGVmaW5lIG9ial9oZWFkZXJfYXBwZW5kCWhwMzAwX2hlYWRlcl9hcHBlbmQKKyNpbmNsdWRlICJjb25maWcvb2JqLWFvdXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWllZWUuYyBiL2dhcy9jb25maWcvb2JqLWllZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGEwNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotaWVlZS5jCkBAIC0wLDAgKzEsNjI3IEBACisvKiBvYmotZm9ybWF0IGZvciBpZWVlLTY5NSByZWNvcmRzLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisKKy8qCisgIGNyZWF0ZWQgYnkKKworICBzdGV2ZSBjaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCisgICovCisKKy8qCisgIHRoaXMgd2lsbCBob3BlZnVsbHkgYmVjb21lIHRoZSBwb3J0IHRocm91Z2ggd2hpY2ggYmZkIGFuZCBnYXMgdGFsaywKKyAgZm9yIHRoZSBtb21lbnQsIG9ubHkgaWVlZSBpcyBrbm93biB0byB3b3JrIHdlbGwuCisgICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgorI2luY2x1ZGUgImZyYWdzLmgiCisKK2JmZCAqYWJmZDsKKworLyogSG93IG1hbnkgYWRkcmVzc2VzIGRvZXMgdGhlIC5hbGlnbiB0YWtlPyAqLworc3RhdGljIHJlbGF4X2FkZHJlc3NUCityZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQorICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwkvKiBBZGRyZXNzIG5vdy4gKi8KKyAgICAgcmVnaXN0ZXIgbG9uZyBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KK3sKKyAgcmVsYXhfYWRkcmVzc1QgbWFzazsKKyAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7CisKKyAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOworICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOworICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Cit9CQkJCS8qIHJlbGF4X2FsaWduKCkgKi8KKworLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNoYWluIGFuZCBjcmVhdGUgYSBiZmQgc2VjdGlvbgorICAgdG8gY29udGFpbiBhbGwgb2YgaXQgKi8KK3N0YXRpYyB2b2lkCitERUZVTiAoc2l6ZV9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKKyAgICAgICBiZmQgKiBhYmZkIEFORAorICAgICAgIHVuc2lnbmVkIGludCBpZHgpCit7CisgIGFzZWN0aW9uICpzZWM7CisgIHVuc2lnbmVkIGludCBzaXplID0gMDsKKyAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmFnX3Jvb3Q7CisgIHdoaWxlIChmcmFnKQorICAgIHsKKyAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCisJeworCSAgcHJpbnRmIChfKCJPdXQgb2Ygc3RlcFxuIikpOworCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7CisJfQorICAgICAgc2l6ZSArPSBmcmFnLT5mcl9maXg7CisgICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCisJeworCWNhc2UgcnNfZmlsbDoKKwljYXNlIHJzX29yZzoKKwkgIHNpemUgKz0gZnJhZy0+ZnJfb2Zmc2V0ICogZnJhZy0+ZnJfdmFyOworCSAgYnJlYWs7CisJY2FzZSByc19hbGlnbjoKKwljYXNlIHJzX2FsaWduX2NvZGU6CisJICB7CisJICAgIGFkZHJlc3NUIG9mZjsKKworCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKKwkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQorCSAgICAgIG9mZiA9IDA7CisJICAgIHNpemUgKz0gb2ZmOworCSAgfQorCX0KKyAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OworICAgIH0KKyAgaWYgKHNpemUpCisgICAgeworICAgICAgY2hhciAqbmFtZSA9IHNlZ21lbnRfaW5mb1tpZHhdLm5hbWU7CisgICAgICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQorCXsKKwkgIG5hbWUgPSAiLmRhdGEiOworCX0KKyAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnVzZXJfc3R1ZmYgPSAoY2hhciAqKSAoc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSkpOworICAgICAgLyogTWFrZSBpdCBvdXRwdXQgdGhyb3VnaCBpdHNlbGYgKi8KKyAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7CisgICAgICBzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBzaXplKTsKKyAgICB9Cit9CisKKy8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQgKi8KK3N0YXRpYyB2b2lkCitERUZVTiAoZmlsbF9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKKyAgICAgICBiZmQgKiBhYmZkIEFORAorICAgICAgIHVuc2lnbmVkIGludCBpZHgpCit7CisgIGFzZWN0aW9uICpzZWMgPSBzZWdtZW50X2luZm9baWR4XS51c2VyX3N0dWZmOworICBpZiAoc2VjKQorICAgIHsKKyAgICAgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJhZ19yb290OworICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisgICAgICB3aGlsZSAoZnJhZykKKwl7CisJICB1bnNpZ25lZCBpbnQgZmlsbF9zaXplOworCSAgdW5zaWduZWQgaW50IGNvdW50OworCSAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQorCSAgICB7CisJICAgIGNhc2UgcnNfZmlsbDoKKwkgICAgY2FzZSByc19hbGlnbjoKKwkgICAgY2FzZSByc19vcmc6CisJICAgICAgaWYgKGZyYWctPmZyX2ZpeCkKKwkJeworCQkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKKwkJCQkJICAgIHNlYywKKwkJCQkJICAgIGZyYWctPmZyX2xpdGVyYWwsCisJCQkJCSAgICBmcmFnLT5mcl9hZGRyZXNzLAorCQkJCQkgICAgZnJhZy0+ZnJfZml4KTsKKwkJfQorCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7CisJICAgICAgZmlsbF9zaXplID0gZnJhZy0+ZnJfdmFyOworCSAgICAgIGlmIChmaWxsX3NpemUpCisJCXsKKwkJICB1bnNpZ25lZCBpbnQgb2ZmID0gZnJhZy0+ZnJfZml4OworCQkgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQorCQkgICAgeworCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKKwkJCQkJCWZyYWctPmZyX2xpdGVyYWwgKworCQkJCQkJZnJhZy0+ZnJfZml4LAorCQkJCQkJZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiwKKwkJCQkJCWZpbGxfc2l6ZSk7CisJCSAgICAgIG9mZiArPSBmaWxsX3NpemU7CisJCSAgICB9CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgZnJhZyA9IGZyYWctPmZyX25leHQ7CisJfQorICAgIH0KK30KKworLyogQ291bnQgdGhlIHJlbG9jYXRpb25zIGluIGEgY2hhaW4gKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorREVGVU4gKGNvdW50X2VudHJpZXNfaW5fY2hhaW4sIChpZHgpLAorICAgICAgIHVuc2lnbmVkIGludCBpZHgpCit7CisgIHVuc2lnbmVkIGludCBucmVsb2NzOworICBmaXhTICpmaXh1cF9wdHI7CisKKyAgLyogQ291bnQgdGhlIHJlbG9jYXRpb25zICovCisgIGZpeHVwX3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OworICBucmVsb2NzID0gMDsKKyAgd2hpbGUgKGZpeHVwX3B0ciAhPSAoZml4UyAqKSBOVUxMKQorICAgIHsKKyAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKKyAgICAgIG5yZWxvY3MrKzsKKyAgICB9CisgIHJldHVybiBucmVsb2NzOworfQorCisvKiBvdXRwdXQgYWxsIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uICovCit2b2lkCitERUZVTiAoZG9fcmVsb2NzX2ZvciwgKGlkeCksCisgICAgICAgdW5zaWduZWQgaW50IGlkeCkKK3sKKyAgdW5zaWduZWQgaW50IG5yZWxvY3M7CisgIGFyZWxlbnQgKipyZWxvY19wdHJfdmVjdG9yOworICBhcmVsZW50ICpyZWxvY192ZWN0b3I7CisgIGFzeW1ib2wgKipwdHJzOworICBhc2VjdGlvbiAqc2VjdGlvbiA9IChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW2lkeF0udXNlcl9zdHVmZik7CisgIHVuc2lnbmVkIGludCBpOworICBmaXhTICpmcm9tOworICBpZiAoc2VjdGlvbikKKyAgICB7CisgICAgICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKKworICAgICAgcmVsb2NfcHRyX3ZlY3RvciA9IChhcmVsZW50ICoqKSBtYWxsb2MgKChucmVsb2NzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpOworICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKikgbWFsbG9jIChucmVsb2NzICogc2l6ZW9mIChhcmVsZW50KSk7CisgICAgICBwdHJzID0gKGFzeW1ib2wgKiopIG1hbGxvYyAobnJlbG9jcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgICAgICBmcm9tID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnJlbG9jczsgaSsrKQorCXsKKwkgIGFyZWxlbnQgKnRvID0gcmVsb2NfdmVjdG9yICsgaTsKKwkgIGFzeW1ib2wgKnM7CisJICByZWxvY19wdHJfdmVjdG9yW2ldID0gdG87CisJICB0by0+aG93dG8gPSAocmVsb2NfaG93dG9fdHlwZSAqKSAoZnJvbS0+Znhfcl90eXBlKTsKKworI2lmIDAJICAvKiBXZSBjYW4ndCByZXByZXNlbnQgY29tcGxpY2F0ZWQgdGhpbmdzIGluIGEgcmVsb2MgeWV0ICovCisJICBpZiAoZnJvbS0+ZnhfYWRkc3kgPT0gMCB8fCBmcm9tLT5meF9zdWJzeSAhPSAwKSBhYm9ydCgpOworI2VuZGlmCisKKwkgIHMgPSAmKGZyb20tPmZ4X2FkZHN5LT5zeV9zeW1ib2wuc3kpOworCSAgdG8tPmFkZHJlc3MgPSAoKGNoYXIgKikgKGZyb20tPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKworCQkJCSAgIGZyb20tPmZ4X3doZXJlKSkKKwkgICAgLSAoKGNoYXIgKikgKCYoZnJvbS0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCkpKTsKKwkgIHRvLT5hZGRlbmQgPSBmcm9tLT5meF9vZmZzZXQ7CisJICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgd2hpY2ggd2Ugd2FudCB0byByZWxvY2F0ZSB0bywgdHVybgorCSAgICAgdGhpcyByZWxvYWN0aW9uIGludG8gYSBzZWN0aW9uIHJlbGF0aXZlLgorCisJICAgICBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcGNyZWxhdGl2ZSwgYW5kIHdlIGtub3cgdGhlCisJICAgICBkZXN0aW5hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byBrZWVwIHRoZSByZWxvY2F0aW9uIC0gc2luY2UKKwkgICAgIHRoZSBsaW5rZXIgbWlnaHQgcmVsYXggc29tZSBvZiB0aGUgYnl0ZXMsIGJ1dCBpdCBzdG9wcworCSAgICAgYmVpbmcgcGMgcmVsYXRpdmUgYW5kIHR1cm5zIGludG8gYW4gYWJzb2x1dGUgcmVsb2NhdGlvbi4gKi8KKwkgIGlmIChzKQorCSAgICB7CisJICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9VTkRFRklORUQpID09IDApCisJCXsKKwkJICB0by0+c2VjdGlvbiA9IHMtPnNlY3Rpb247CisKKwkJICAvKiBXZSBjYW4gcmVmZXIgZGlyZWN0bHkgdG8gdGhlIHZhbHVlIGZpZWxkIGhlcmUsCisJCSAgICAgcmF0aGVyIHRoYW4gdXNpbmcgU19HRVRfVkFMVUUsIGJlY2F1c2UgdGhpcyBpcworCQkgICAgIG9ubHkgY2FsbGVkIGFmdGVyIGRvX3N5bWJvbHMsIHdoaWNoIHNldHMgdXAgdGhlCisJCSAgICAgdmFsdWUgZmllbGQuICAqLworCQkgIHRvLT5hZGRlbmQgKz0gcy0+dmFsdWU7CisKKwkJICB0by0+c3ltX3B0cl9wdHIgPSAwOworCQkgIGlmICh0by0+aG93dG8tPnBjcmVsX29mZnNldCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBpcyBhIHBjcmVsIHJlbG9jYXRpb24sIHRoZSBhZGRlbmQgc2hvdWxkIGJlIGFkanVzdGVkICovCisJCSAgICAgIHRvLT5hZGRlbmQgLT0gdG8tPmFkZHJlc3MgKyAxOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgdG8tPnNlY3Rpb24gPSAwOworCQkgICpwdHJzID0gJihmcm9tLT5meF9hZGRzeS0+c3lfc3ltYm9sLnN5KTsKKwkJICB0by0+c3ltX3B0cl9wdHIgPSBwdHJzOworCisJCSAgaWYgKHRvLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQorCQkgICAgeworCQkgICAgICAvKiBUaGlzIGlzIGEgcGNyZWwgcmVsb2NhdGlvbiwgdGhlIGFkZGVuZCBzaG91bGQgYmUgYWRqdXN0ZWQgKi8KKwkJICAgICAgdG8tPmFkZGVuZCAtPSB0by0+YWRkcmVzcyAtIDE7CisJCSAgICB9CisJCX0KKworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0by0+c2VjdGlvbiA9IDA7CisJICAgIH0KKworCSAgcHRycysrOworCSAgZnJvbSA9IGZyb20tPmZ4X25leHQ7CisJfQorCisgICAgICAvKiBhdHRhdGNoIHRvIHRoZSBzZWN0aW9uICovCisgICAgICBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9IHJlbG9jX3B0cl92ZWN0b3I7CisgICAgICBzZWN0aW9uLT5yZWxvY19jb3VudCA9IG5yZWxvY3M7CisgICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfTE9BRDsKKyAgICB9Cit9CisKKy8qIGRvIHRoZSBzeW1ib2xzLi4gKi8KK3N0YXRpYyB2b2lkCitERUZVTiAoZG9fc3ltYm9scywgKGFiZmQpLAorICAgICAgIGJmZCAqIGFiZmQpCit7CisgIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7CisgIHN5bWJvbFMgKnB0cjsKKyAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfdmVjOworICBhc3ltYm9sICpzeW1ib2xfdmVjOworICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOworICB1bnNpZ25lZCBpbnQgaW5kZXg7CisKKworICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsKKyAgICAgICBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsKKyAgICAgICBwdHIgPSBwdHItPnN5X25leHQpCisgICAgeworICAgICAgaWYgKFNFR19OT1JNQUwgKHB0ci0+c3lfc3ltYm9sLnNlZykpCisJeworCSAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9CisJICAgIChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW3B0ci0+c3lfc3ltYm9sLnNlZ10udXNlcl9zdHVmZik7CisJICBTX1NFVF9WQUxVRSAocHRyLCBTX0dFVF9WQUxVRSAocHRyKSArIHB0ci0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7CisJICBpZiAocHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgPT0gMCkKKwkgICAgeworCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzID0gQlNGX0xPQ0FMOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN3aXRjaCAocHRyLT5zeV9zeW1ib2wuc2VnKQorCSAgICB7CisJICAgIGNhc2UgU0VHX0FCU09MVVRFOgorCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9BQlNPTFVURTsKKwkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5zZWN0aW9uID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTRUdfVU5LTk9XTjoKKwkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5mbGFncyA9IEJTRl9VTkRFRklORUQ7CisJICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgICBwdHItPnN5X3N5bWJvbC5zeS52YWx1ZSA9IFNfR0VUX1ZBTFVFIChwdHIpOworICAgICAgY291bnQrKzsKKyAgICB9CisgIHN5bWJvbF9wdHJfdmVjID0gKGFzeW1ib2wgKiopIG1hbGxvYyAoKGNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOworCisgIGluZGV4ID0gMDsKKyAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7CisgICAgICAgcHRyICE9IChzeW1ib2xTICopIE5VTEw7CisgICAgICAgcHRyID0gcHRyLT5zeV9uZXh0KQorICAgIHsKKyAgICAgIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9ICYocHRyLT5zeV9zeW1ib2wuc3kpOworICAgICAgaW5kZXgrKzsKKyAgICB9CisgIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9IDA7CisgIGFiZmQtPm91dHN5bWJvbHMgPSBzeW1ib2xfcHRyX3ZlYzsKKyAgYWJmZC0+c3ltY291bnQgPSBjb3VudDsKK30KKworLyogVGhlIGdlbmVyaWMgYXMtPmJmZCBjb252ZXJ0ZXIuIE90aGVyIGJhY2tlbmRzIG1heSBoYXZlIHNwZWNpYWwgY2FzZQorICAgY29kZSAqLworCit2b2lkCitERUZVTl9WT0lEIChiZmRfYXNfd3JpdGVfaG9vaykKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKKyAgICB7CisgICAgICBzaXplX3NlY3Rpb24gKGFiZmQsIGkpOworICAgIH0KKworCisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCisgICAgZmlsbF9zZWN0aW9uIChhYmZkLCBpKTsKKworICBkb19zeW1ib2xzIChhYmZkKTsKKworICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQorICAgIGRvX3JlbG9jc19mb3IgKGkpOworCit9CisKK1NfU0VUX1NFR01FTlQgKHgsIHkpCisgICAgIHN5bWJvbFMgKng7CisgICAgIGludCB5OworeworICB4LT5zeV9zeW1ib2wuc2VnID0geTsKK30KKworU19JU19ERUZJTkVEICh4KQorICAgICBzeW1ib2xTICp4OworeworICBpZiAoU0VHX05PUk1BTCAoeC0+c3lfc3ltYm9sLnNlZykpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBzd2l0Y2ggKHgtPnN5X3N5bWJvbC5zZWcpCisgICAgeworICAgIGNhc2UgU0VHX1VOS05PV046CisgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCitTX0lTX0VYVEVSTkFMICh4KQoreworICBhYm9ydCAoKTsKK30KKworU19HRVRfREVTQyAoeCkKK3sKKyAgYWJvcnQgKCk7Cit9CisKK1NfR0VUX1NFR01FTlQgKHgpCisgICAgIHN5bWJvbFMgKng7Cit7CisgIHJldHVybiB4LT5zeV9zeW1ib2wuc2VnOworfQorCitTX1NFVF9FWFRFUk5BTCAoeCkKKyAgICAgc3ltYm9sUyAqeDsKK3sKKyAgeC0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOworfQorCitTX1NFVF9OQU1FICh4LCB5KQorICAgICBzeW1ib2xTICp4OworICAgICBjaGFyICp5OworeworICB4LT5zeV9zeW1ib2wuc3kubmFtZSA9IHk7Cit9CisKK1NfR0VUX09USEVSICh4KQoreworICBhYm9ydCAoKTsKK30KKworU19JU19ERUJVRyAoeCkKK3sKKyAgYWJvcnQgKCk7Cit9CisKKyNpZm5kZWYgc2VnbWVudF9uYW1lCitjaGFyICoKK3NlZ21lbnRfbmFtZSAoKQoreworICBhYm9ydCAoKTsKK30KKyNlbmRpZgorCit2b2lkCitvYmpfcmVhZF9iZWdpbl9ob29rICgpCit7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfaWVlZV9zZWN0aW9uIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7CisgIGV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107CisgIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGNoYXIgKnMgPSBwOworICBpbnQgaTsKKyAgLyogTG9vayB1cCB0aGUgbmFtZSwgaWYgaXQgZG9lc24ndCBleGlzdCwgbWFrZSBpdCAqLworICB3aGlsZSAoKnAgJiYgKnAgIT0gJyAnICYmICpwICE9ICcsJyAmJiAhaXNfZW5kX29mX2xpbmVbKnBdKQorICAgIHsKKyAgICAgIHArKzsKKyAgICB9CisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCisgICAgeworICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUpCisJeworCSAgaWYgKHN0cm5jbXAgKHNlZ21lbnRfaW5mb1tpXS5uYW1lLCBzLCBwIC0gcykgPT0gMCkKKwkgICAgeworCSAgICAgIGdvdG8gb2s7CisKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisgIGlmIChpID09IFNFR19VTktOT1dOKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgc2VjdGlvbnMiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUgPSAxOworICBzZWdtZW50X2luZm9baV0ubmFtZSA9IG1hbGxvYyAocCAtIHMgKyAxKTsKKyAgbWVtY3B5IChzZWdtZW50X2luZm9baV0ubmFtZSwgcywgcCAtIHMpOworICBzZWdtZW50X2luZm9baV0ubmFtZVtwIC0gc10gPSAwOworb2s6CisgIHN1YnNlZ19zZXQgKGksIDApOworICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWypwXSkKKyAgICBwKys7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7CisKK30KKworCit2b2lkIGNvbnMgKCk7Cit2b2lkIHNfaWdub3JlICgpOworCisKK3ZvaWQgc19nbG9ibCAoKTsKK2NvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQoreworICB7InNlY3Rpb24iLCBvYmpfaWVlZV9zZWN0aW9uLCAwfSwKKyAgeyJkYXRhLmIiLCBjb25zLCAxfSwKKyAgeyJkYXRhLnciLCBjb25zLCAyfSwKKyAgeyJkYXRhLmwiLCBjb25zLCA0fSwKKyAgeyJleHBvcnQiLCBzX2dsb2JsLCAwfSwKKyAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCisgIHsiZW5kIiwgc19pZ25vcmUsIDB9LAorICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKKyAgeyJzZGF0YSIsIHN0cmluZ2VyLCAwfSwKKyAgMCwKKworfTsKKworCisKK3ZvaWQKK29ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7Cit7CisgIHN5bWJvbFAtPnN5X3N5bWJvbC5zeS50aGVfYmZkID0gYWJmZDsKK30KKworCisKKworCisjaWYgMQorZXh0ZXJuIHZvaWQKK0RFRlVOX1ZPSUQgKHdyaXRlX29iamVjdF9maWxlKQoreworICBpbnQgaTsKKyAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5fcHRyOworICBzdHJ1Y3QgZnJhZyAqZnJhZ19wdHI7CisKKyAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgImllZWUiKTsKKworICBpZiAoYWJmZCA9PSAwKQorICAgIHsKKyAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKKyAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisgICAgfQorICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7CisgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9oODMwMCwgMCk7CisgIHN1YnNlZ19zZXQgKDEsIDApOworICBzdWJzZWdfc2V0ICgyLCAwKTsKKyAgc3Vic2VnX3NldCAoMywgMCk7CisgIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7CisgICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7CisgICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQorICAgIHsKKyAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiBBbHNvIGNsb3NlIGFueQorCSBvcGVuIGZyYWdzLiBXZSB0YWNrIGEgLmZpbGwgb250byB0aGUgZW5kIG9mIHRoZSBmcmFnIGNoYWluIHNvCisJIHRoYXQgYW55IC5hbGlnbidzIHNpemUgY2FuIGJlIHdvcmtlZCBieSBsb29raW5nIGF0IHRoZSBuZXh0CisJIGZyYWcuICAqLworCisgICAgICBzdWJzZWdfc2V0IChmcmNoYWluX3B0ci0+ZnJjaF9zZWcsIGZyY2hhaW5fcHRyLT5mcmNoX3N1YnNlZyk7CisjaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCisjZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgorI2VuZGlmCisgICAgICBmcmFnX2FsaWduIChTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksIDAsIDApOworICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7CisgICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKKyAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOworICAgIH0KKworICAvKiBOb3cgYnVpbGQgb25lIGJpZyBmcmFnIGNoYWluIGZvciBlYWNoIHNlZ21lbnQsIGxpbmtlZCB0aHJvdWdoCisJICAgZnJfbmV4dC4gKi8KKyAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKKyAgICB7CisKKyAgICAgIGZyYWdTICoqcHJldl9mcmFnX3B0cl9wdHI7CisgICAgICBzdHJ1Y3QgZnJjaGFpbiAqbmV4dF9mcmNoYWluX3B0cjsKKworICAgICAgLyoJc3RydWN0IGZyYWcgKipoZWFkX3B0ciA9IHNlZ21lbnRfaW5mb1tpXS5mcmFnX3Jvb3Q7Ki8KKworICAgICAgc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290OworI2lmIDAKKyAgICAgIC8qIEltIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBmb3IgKi8KKyAgICAgIGZvciAoZnJjaGFpbl9wdHIgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKKwkgICBmcmNoYWluX3B0ciAhPSAoc3RydWN0IGZyY2hhaW4gKikgTlVMTDsKKwkgICBmcmNoYWluX3B0ciA9IGZyY2hhaW5fcHRyLT5mcmNoX25leHQpCisJeworCSAgKmhlYWRfcHRyID0gZnJjaGFpbl9wdHI7CisJICBoZWFkX3B0ciA9ICZmcmNoYWluX3B0ci0+bmV4dDsKKwl9CisKKworI2VuZGlmCisgICAgfQorCisgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCisgICAgeworICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCwgaSk7CisgICAgfQorCisgIC8qIE5vdyB0aGUgYWRkcmVzc2VzIG9mIHRoZSBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQgKi8KKworICBiZmRfYXNfd3JpdGVfaG9vayAoKTsKKyAgYmZkX2Nsb3NlIChhYmZkKTsKK30KKworI2VuZGlmCisKK0hfU0VUX1RFWFRfU0laRSAoYSwgYikKK3sKKyAgYWJvcnQgKCk7Cit9CisKK0hfR0VUX1RFWFRfU0laRSAoKQoreworICBhYm9ydCAoKTsKK30KKworSF9TRVRfQlNTX1NJWkUgKCkKK3sKKyAgYWJvcnQgKCk7Cit9CisKK0hfU0VUX1NUUklOR19TSVpFICgpCit7CisgIGFib3J0ICgpOworfQorCitIX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCkKK3sKKyAgYWJvcnQgKCk7Cit9CisKK0hfU0VUX01BR0lDX05VTUJFUiAoKQoreworICBhYm9ydCAoKTsKK30KKworSF9HRVRfRklMRV9TSVpFICgpCit7CisgIGFib3J0ICgpOworfQorCitIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoKQoreworICBhYm9ydCAoKTsKK30KKworLyogZW5kIG9mIG9iai1pZWVlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWllZWUuaCBiL2dhcy9jb25maWcvb2JqLWllZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBmMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotaWVlZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIFRoaXMgZmlsZSBpcyBvYmotaWVlZS5oCisKKyAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgQkZEIDEKKworI2luY2x1ZGUgPGJmZC5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICBhc3ltYm9sIHN5OworICBpbnQgc2VnOworfQorCitvYmpfc3ltYm9sX3R5cGU7CisKKyNkZWZpbmUgU19HRVRfTkFNRShzKSAoKChzKS0+c3lfc3ltYm9sLnN5Lm5hbWUpKQorCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgaW50IHg7CisgIH0KKworb2JqZWN0X2hlYWRlcnM7CisKKyNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFIDEKKworCitpbnQgbGluZW5vX3Jvb3RQOworCisKKyNkZWZpbmUgSUVFRV9TVFlMRQorCisvKiBlbmQgb2Ygb2JqLWllZWUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuYyBiL2dhcy9jb25maWcvb2JqLW11bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExNTA5MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLW11bHRpLmMKQEAgLTAsMCArMSw0IEBACisvKiBmb28gKi8KKworI2luY2x1ZGUgImFzLmgiCisKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLW11bHRpLmggYi9nYXMvY29uZmlnL29iai1tdWx0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOGQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL29iai1tdWx0aS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIGhpICovCisKKyNpbmNsdWRlICJlbXVsLmgiCisjaW5jbHVkZSAidGFyZy1jcHUuaCIKKworI2RlZmluZSBPVVRQVVRfRkxBVk9SCQkodGhpc19mb3JtYXQtPmZsYXZvcikKKyNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUCkJKHRoaXNfZm9ybWF0LT5mcm9iX3N5bWJvbCkoUywmKFApKQorI2RlZmluZSBvYmpfZnJvYl9maWxlCQkodGhpc19mb3JtYXQtPmZyb2JfZmlsZSkKKyNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKHRoaXNfZm9ybWF0LT5mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKQorI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dAkodGhpc19mb3JtYXQtPmVjb2ZmX3NldF9leHQpCisjZGVmaW5lIG9ial9wb3BfaW5zZXJ0CQkodGhpc19mb3JtYXQtPnBvcF9pbnNlcnQpCisjZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2soKQkodGhpc19mb3JtYXQtPnJlYWRfYmVnaW5faG9vaz90aGlzX2Zvcm1hdC0+cmVhZF9iZWdpbl9ob29rKCk6KHZvaWQpMCkKKyNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vawkodGhpc19mb3JtYXQtPnN5bWJvbF9uZXdfaG9vaykKKyNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jICh0aGlzX2Zvcm1hdC0+c2VjX3N5bV9va19mb3JfcmVsb2MpCisjZGVmaW5lIFNfR0VUX1NJWkUJCSh0aGlzX2Zvcm1hdC0+c19nZXRfc2l6ZSkKKyNkZWZpbmUgU19TRVRfU0laRQkJKHRoaXNfZm9ybWF0LT5zX3NldF9zaXplKQorI2RlZmluZSBTX0dFVF9BTElHTgkJKHRoaXNfZm9ybWF0LT5zX2dldF9hbGlnbikKKyNkZWZpbmUgU19TRVRfQUxJR04JCSh0aGlzX2Zvcm1hdC0+c19zZXRfYWxpZ24pCisjZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTICh0aGlzX2Zvcm1hdC0+Y29weV9zeW1ib2xfYXR0cmlidXRlcykKKyNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQgkodGhpc19mb3JtYXQtPnByb2Nlc3Nfc3RhYikKKworI2lmIGRlZmluZWQgKE9CSl9NQVlCRV9FQ09GRikgfHwgKGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICYmIGRlZmluZWQgKFRDX01JUFMpKQorI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQorI2VuZGlmCisKKy8qIEZJWE1FOiBXaGF0J3MgdGhlIHN0b3J5IGhlcmU/ICBXaHkgZG8gd2UgaGF2ZSB0byBkZWZpbmUKKyAgIE9CSl9TWU1GSUVMRF9UWVBFIGJvdGggaGVyZSBhbmQgaW4gb2JqLWVsZi5oPyAgKi8KKyNpZmRlZiBPQkpfTUFZQkVfRUxGCitzdHJ1Y3QgZWxmX29ial9zeQoreworICBleHByZXNzaW9uUyAqc2l6ZTsKKyAgY2hhciAqdmVyc2lvbmVkX25hbWU7Cit9OworI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgZWxmX29ial9zeQorI2RlZmluZSBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMgaW50IGxvY2FsOjE7CisjZWxzZQorI2RlZmluZSBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMKKyNlbmRpZgorCisjaWZkZWYgRUNPRkZfREVCVUdHSU5HCitzdHJ1Y3QgZWZkcjsKK3N0cnVjdCBsb2NhbHN5bTsKKyNkZWZpbmUgRUNPRkZfREVCVUdfVEFSR0VUX1NZTUJPTF9GSUVMRFMgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7IHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOyB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7CisjZWxzZQorI2RlZmluZSBFQ09GRl9ERUJVR19UQVJHRVRfU1lNQk9MX0ZJRUxEUworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX1NZTUJPTF9GSUVMRFMgXAorCUVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUyBcCisJRUNPRkZfREVCVUdfVEFSR0VUX1NZTUJPTF9GSUVMRFMKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXNvbS5jIGIvZ2FzL2NvbmZpZy9vYmotc29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZjE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvb2JqLXNvbS5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuCisKKyAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCisgICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLworCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKworLyogU09NIGRvZXMgbm90IG5lZWQgYW55IHBzZXVkby1vcHMuICAqLworCitjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KK3sKKyAge05VTEx9Cit9OworCitzdGF0aWMgaW50IHZlcnNpb25fc2VlbiA9IDA7CitzdGF0aWMgaW50IGNvcHlyaWdodF9zZWVuID0gMDsKK3N0YXRpYyBpbnQgY29tcGlsZXJfc2VlbiA9IDA7CisKKy8qIFVudXNlZCBieSBTT00uICAqLwordm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9CisKKy8qIEhhbmRsZSBhIC5jb21waWxlciBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgdGhlCisgICBjb21waWxhdGlvbiB1bml0IGF1eGlsaWFyeSBoZWFkZXIgZm9yIE1QRSBzdWNoIHRoYXQgdGhlIGxpbmtlZGl0b3IKKyAgIGNhbiBoYW5kbGUgU09NIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlcy4gVGhlIGZvcm1hdCBvZiB0aGUgcXVvdGVkCisgICBzdHJpbmcgaXMgInNvdXJjZWZpbGUgbGFuZ3VhZ2UgdmVyc2lvbiIgYW5kIGlzIGRlbGltaXRlZCBieSBibGFua3MuKi8KKwordm9pZAorb2JqX3NvbV9jb21waWxlciAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICBjaGFyICpidWY7CisgIGNoYXIgYzsKKyAgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKmxhbmd1YWdlX25hbWU7CisgIGNoYXIgKnA7CisgIGNoYXIgKnZlcnNpb25faWQ7CisKKyAgaWYgKGNvbXBpbGVyX3NlZW4pCisgICAgeworICAgICAgYXNfYmFkICgiT25seSBvbmUgLmNvbXBpbGVyIHBzZXVkby1vcCBwZXIgZmlsZSEiKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKKyAgICB7CisgICAgICBidWYgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQorCTsKKyAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc19iYWQgKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIik7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBQYXJzZSB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBTa2lwIHRoZQorICAgICBxdW90ZS4gICovCisgIGZpbGVuYW1lID0gYnVmICsgMTsKKyAgcCA9IGZpbGVuYW1lOworICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykKKyAgICBwKys7CisgIGlmICgqcCA9PSAnXDAwMCcpCisgICAgeworICAgICAgYXNfYmFkICgiLmNvbXBpbGVyIGRpcmVjdGl2ZSBtaXNzaW5nIGxhbmd1YWdlIGFuZCB2ZXJzaW9uIik7CisgICAgICByZXR1cm47CisgICAgfQorICAqcCA9ICdcMDAwJzsKKworICBsYW5ndWFnZV9uYW1lCT0gKytwOworICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykgcCsrOworICBpZiAoKnAgPT0gJ1wwMDAnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyB2ZXJzaW9uIik7CisgICAgICByZXR1cm47CisgICAgfQorICAqcCA9ICdcMDAwJzsKKworICB2ZXJzaW9uX2lkCT0gKytwOworICB3aGlsZSAoKnAgIT0gJ1wwMDAnKSBwKys7CisgIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgcXVvdGUuICAqLworICAqKC0tcCkgPSAnXDAwMCc7CisKKyAgY29tcGlsZXJfc2VlbiA9IDE7CisgIGlmICghIGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKHN0ZG91dHB1dCwgZmlsZW5hbWUsIGxhbmd1YWdlX25hbWUsCisJCQkJCSAiR05VIFRvb2xzIiwgdmVyc2lvbl9pZCkpCisgICAgeworICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7CisgICAgICBhc19mYXRhbCAoIkZBVEFMOiBBdHRhY2hpbmcgY29tcGlsZXIgaGVhZGVyICVzIiwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7CisgICAgfQorICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIGEgLnZlcnNpb24gZGlyZWN0aXZlLiAgKi8KKwordm9pZAorb2JqX3NvbV92ZXJzaW9uICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGNoYXIgKnZlcnNpb24sIGM7CisKKyAgaWYgKHZlcnNpb25fc2VlbikKKyAgICB7CisgICAgICBhc19iYWQgKF8oIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCisgICAgeworICAgICAgdmVyc2lvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCisJOworICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHZlcnNpb25fc2VlbiA9IDE7CisgIGlmIChiZmRfc29tX2F0dGFjaF9hdXhfaGRyIChzdGRvdXRwdXQsIFZFUlNJT05fQVVYX0lELCB2ZXJzaW9uKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKKyAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKKyAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisgICAgfQorICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIGEgLmNvcHlyaWdodCBkaXJlY3RpdmUuICAgVGhpcyBwcm9iYWJseSBpc24ndCBjb21wbGV0ZSwgYnV0CisgICBpdCdzIG9mIGR1YmlvdXMgdmFsdWUgYW55d2F5IGFuZCAoSU1ITykgbm90IHdvcnRoIHRoZSB0aW1lIHRvIGZpbmlzaC4KKyAgIElmIHlvdSBjYXJlIGFib3V0IGNvcHlyaWdodCBzdHJpbmdzIHRoYXQgbXVjaCwgeW91IGZpeCBpdC4gICovCisKK3ZvaWQKK29ial9zb21fY29weXJpZ2h0ICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGNoYXIgKmNvcHlyaWdodCwgYzsKKworICBpZiAoY29weXJpZ2h0X3NlZW4pCisgICAgeworICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCisgICAgeworICAgICAgY29weXJpZ2h0ID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKKwk7CisgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29weXJpZ2h0X3NlZW4gPSAxOworICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBDT1BZUklHSFRfQVVYX0lELCBjb3B5cmlnaHQpID09IGZhbHNlKQorICAgIHsKKyAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOworICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7CisgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFBlcmZvcm0gYW55IGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSBmb3Igc3RhYnMgc3VwcG9ydC4KKworICAgRm9yIFNPTSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3BhY2Ugd2hpY2ggd2lsbCBjb250YWluIHRoZQorICAgdHdvIHN0YWJzIHN1YnNwYWNlcy4gIEFkZGl0aW9uYWxseSB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKKyAgIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMgYW5kIHNldCBzcGFjZS9zdWJzcGFjZSBhdHRyaWJ1dGVzCisgICB3aGljaCBCRkQgZG9lcyBub3QgdW5kZXJzdGFuZC4gICovCisKK3ZvaWQKK29ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKKyAgICAgc2VnVCBzZWc7Cit7CisgIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKKyAgc2VnVCBzcGFjZTsKKyAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOworICBjaGFyICpwLCAqZmlsZTsKKyAgdW5zaWduZWQgaW50IHN0cm9mZjsKKworICAvKiBNYWtlIHRoZSBzcGFjZSB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGRlYnVnIHN1YnNwYWNlcy4gICovCisgIHNwYWNlID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsICIkR0RCX0RFQlVHJCIpOworCisgIC8qIFNldCBTT00gc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgSW4gcGFydGljdWxhciB3ZSBzZXQKKyAgICAgdGhlIHNwYWNlICJkZWZpbmVkIiwgInByaXZhdGUiLCAic29ydF9rZXkiLCBhbmQgInNwbnVtIiB2YWx1ZXMuIAorCisgICAgIER1ZSB0byBhIGJ1ZyBpbiBweGRiIChjYWxsZWQgYnkgaHB1eCBsaW5rZXIpLCB0aGUgc29ydCBrZXlzCisgICAgIG9mIHRoZSB2YXJpb3VzIHN0YWJzIHNwYWNlcy9zdWJzcGFjZXMgbmVlZCB0byBiZSAic21hbGwiLiAgV2UKKyAgICAgcmVzZXJ2ZSByYW5nZSA3Mi83MyB3aGljaCBhcHBlYXIgdG8gd29yayB3ZWxsLiAgKi8KKyAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlLCAxLCAxLCA3MiwgMik7CisgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc3BhY2UsIDIpOworCisgIC8qIFNldCB0aGUgY29udGFpbmluZyBzcGFjZSBmb3IgYm90aCBzdGFiIHNlY3Rpb25zIHRvIGJlICRHREJfREVCVUckCisgICAgIChqdXN0IGNyZWF0ZWQgYWJvdmUpLiAgQWxzbyBzZXQgc29tZSBhdHRyaWJ1dGVzIHdoaWNoIEJGRCBkb2VzCisgICAgIG5vdCB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgYWNjZXNzIGJpdHMsIHNvcnQga2V5cywgYW5kIGxvYWQKKyAgICAgcXVhZHJhbnQuICAqLworICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZSwgMHgxZiwgNzMsIDApOworICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7CisKKyAgLyogTWFrZSBzb21lIHNwYWNlIGZvciB0aGUgZmlyc3Qgc3BlY2lhbCBzdGFiIGVudHJ5IGFuZCB6ZXJvIHRoZSBtZW1vcnkuCisgICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsZW5ndGggb2YgdGhpcyBmaWxlJ3MKKyAgICAgc3RhYiBzdHJpbmcgYW5kIHRoZSBsaWtlLiAgVXNpbmcgaXQgYXZvaWRzIHRoZSBuZWVkIHRvIAorICAgICByZWxvY2F0ZSB0aGUgc3RhYiBzdHJpbmdzLgorCisgICAgIFRoZSAkR0RCX1NUUklOR1MkIHNwYWNlIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mCisgICAgIHRoZSBjYWxsIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuICAqLworICBwID0gZnJhZ19tb3JlICgxMik7CisgIG1lbXNldCAocCwgMCwgMTIpOworICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7CisgIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsICIkR0RCX1NUUklOR1MkIik7CisgIGtub3cgKHN0cm9mZiA9PSAxKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOworICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7CisKKyAgLyogU2V0IHRoZSBjb250YWluaW5nIHNwYWNlIGZvciBib3RoIHN0YWIgc2VjdGlvbnMgdG8gYmUgJEdEQl9ERUJVRyQKKyAgICAgKGp1c3QgY3JlYXRlZCBhYm92ZSkuICBBbHNvIHNldCBzb21lIGF0dHJpYnV0ZXMgd2hpY2ggQkZEIGRvZXMKKyAgICAgbm90IHVuZGVyc3RhbmQuICBJbiBwYXJ0aWN1bGFyLCBhY2Nlc3MgYml0cywgc29ydCBrZXlzLCBhbmQgbG9hZAorICAgICBxdWFkcmFudC4gICovCisgIHNlZyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIkR0RCX1NUUklOR1MkIik7CisgIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLCAweDFmLCA3MiwgMCk7CisgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKKworICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Cit9CisKKy8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCithZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIHh4eDsKK3sKKyAgYXNlY3Rpb24gKnN0cnNlYzsKKyAgY2hhciAqcDsKKyAgaW50IHN0cnN6LCBuc3ltczsKKworICBpZiAoc3RyY21wICgiJEdEQl9TWU1CT0xTJCIsIHNlYy0+bmFtZSkpCisgICAgcmV0dXJuOworCisgIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJEdEQl9TVFJJTkdTJCIpOworICBpZiAoc3Ryc2VjKQorICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKKyAgZWxzZQorICAgIHN0cnN6ID0gMDsKKyAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOworCisgIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKKyAgYXNzZXJ0IChwICE9IDApOworCisgIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOworICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKK30KKworLyogQ2FsbGVkIGxhdGUgaW4gdGhlIGFzc3NlbWJseSBwaGFzZSB0byBhZGp1c3QgdGhlIHNwZWNpYWwKKyAgIHN0YWIgZW50cnkgYW5kIHRvIHNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgZWFjaCBjb2RlIHN1YnNwYWNlLiAgKi8KKwordm9pZAorc29tX2Zyb2JfZmlsZSAoKQoreworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmggYi9nYXMvY29uZmlnL29iai1zb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA4N2IxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotc29tLmgKQEAgLTAsMCArMSw3MyBAQAorLyogU09NIG9iamVjdCBmaWxlIGZvcm1hdC4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLgorCisgICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAorICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAgKi8KKworI2lmbmRlZiBfT0JKX1NPTV9ICisjZGVmaW5lIF9PQkpfU09NX0gKKworI2RlZmluZSBPQkpfU09NIDEKKworI2luY2x1ZGUgPGJmZC5oPgorI2luY2x1ZGUgImJmZC9zb20uaCIKKyNpbmNsdWRlICJ0YXJnLWNwdS5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAhRkFMU0UKKyNlbmRpZgorCisvKiBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gYWRkcmVzcyBzaXplISAgKi8KKyNkZWZpbmUgc29tX3N5bWJvbChhc3ltYm9sKSAoKHNvbV9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKKworZXh0ZXJuIHZvaWQgc29tX2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIHZvaWQgb2JqX3NvbV92ZXJzaW9uIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgb2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7CitleHRlcm4gdm9pZCBvYmpfc29tX2NvcHlyaWdodCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIG9ial9zb21fY29tcGlsZXIgUEFSQU1TICgoaW50KSk7CisKKyNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKSB7O30KKworLyogU09NIGhhcyBzZXZlcmFsIGF0dHJpYnV0ZXMgZm9yIHNwYWNlcy9zdWJzcGFjZXMgd2hpY2ggY2FuIG5vdAorICAgYmUgZWFzaWx5IGV4cHJlc3NlZCBpbiBCRkQuICBXZSB1c2UgdGhlc2UgbWFjcm9zIHRvIHRyaWdnZXIgY2FsbHMKKyAgIGludG8gdGhlIFNPTSBCRkQgYmFja2VuZCB0byBzZXQgdGhlc2UgYXR0cmlidXRlcy4gICovCisjZGVmaW5lIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzICBiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMKKyNkZWZpbmUgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzCisKKy8qIExpa2V3aXNlIGZvciBzeW1ib2wgdHlwZXMuICAqLworI2RlZmluZSBvYmpfc2V0X3N5bWJvbF90eXBlIGJmZF9zb21fc2V0X3N5bWJvbF90eXBlCisKKy8qIFN0YWJzIGdvIGluIGEgc2VwYXJhdGUgc2VjdGlvbnMuICBHREIgZXhwZWN0cyB0byBmaW5kIHRoZW0gaW4gc2VjdGlvbnMKKyAgIHdpdGggdGhlIG5hbWVzICRHREJfU1lNQk9MUyQgYW5kICRHREJfU1RSSU5HUyQgcmF0aGVyIHRoYW4gLnN0YWIgYW5kCisgICAuc3RhYnN0ci4gICovCisjZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMQorI2RlZmluZSBTVEFCX1NFQ1RJT05fTkFNRSAiJEdEQl9TWU1CT0xTJCIKKyNkZWZpbmUgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FICIkR0RCX1NUUklOR1MkIgorCisvKiBXZSB1c2UgSU5JVF9TVEFCX1NFQ1RJT04gdG8gcmVjb3JkIHRoZSBzcGFjZS9zdWJzcGFjZSByZWxhdGlvbnNoaXBzCisgICBmb3IgdGhlIHZhcmlvdXMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCisKKy8qIFdlJ2xsIGJlIHVwZGF0aW5nIHRoZSBtYWdpYyAxc3Qgc3RhYiBlbnRyeSBvbmNlIHRoZSBlbnRpcmUgYXNzZW1ibHkKKyAgIGZhaWwgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgKi8KKyNkZWZpbmUgb2JqX2Zyb2JfZmlsZSgpIHNvbV9mcm9iX2ZpbGUoKQorCisjZW5kaWYgLyogX09CSl9TT01fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotdm1zLmMgYi9nYXMvY29uZmlnL29iai12bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA4ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotdm1zLmMKQEAgLTAsMCArMSw1NTQ5IEBACisvKiB2bXMuYyAtLSBXcml0ZSBvdXQgYSBWQVgvVk1TIG9iamVjdCBmaWxlCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBEYXZpZCBMLiBLYXNodGFuICovCisvKiBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZSB0byB3cml0ZSBWTVMgZGVidWcgcmVjb3JkcyBmb3IgcHJvZ3JhbQorICAgdmFyaWFibGVzICovCisKKy8qIFdhbnQgYWxsIG9mIG9iai12bXMuaCAoYXMgb2JqLWZvcm1hdC5oLCB2aWEgdGFyZy1lbnYuaCwgdmlhIGFzLmgpLiAgKi8KKyNkZWZpbmUgV0FOVF9WTVNfT0JKX0RFRlMKKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKworLyogV2hhdCB3ZSBkbyBpZiB0aGVyZSBpcyBhIGdvb2YuICovCisjZGVmaW5lIGVycm9yIGFzX2ZhdGFsCisKKyNpZmRlZiBWTVMJCQkvKiBUaGVzZSBhcmUgb2Ygbm8gdXNlIGlmIHdlIGFyZSBjcm9zcyBhc3NlbWJsaW5nLiAqLworI2luY2x1ZGUgPGZhYi5oPgkJLyogRGVmaW5lIEZpbGUgQWNjZXNzIEJsb2NrCSAgKi8KKyNpbmNsdWRlIDxuYW0uaD4JCS8qIERlZmluZSBOQU0gQmxvY2sJCSAgKi8KKyNpbmNsdWRlIDx4YWIuaD4JCS8qIERlZmluZSBYQUIgLSBhbGwgZGlmZmVyZW50IHR5cGVzKi8KK2V4dGVybiBpbnQgc3lzJG9wZW4oKSwgc3lzJGNsb3NlKCksIHN5cyRhc2N0aW0oKTsKKyNlbmRpZgorCisvKgorICoJVmVyc2lvbiBzdHJpbmcgb2YgdGhlIGNvbXBpbGVyIHRoYXQgcHJvZHVjZWQgdGhlIGNvZGUgd2UgYXJlCisgKglhc3NlbWJsaW5nLiAgKEFuZCB0aGlzIGFzc2VtYmxlciwgaWYgd2UgZG8gbm90IGhhdmUgY29tcGlsZXIgaW5mby4pCisgKi8KK2NoYXIgKmNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOworCitleHRlcm4gaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKyAqLworZXh0ZXJuIGludCBmbGFnX29uZTsJCQkvKiAtMTsgY29tcGF0aWJpbGl0eSB3aXRoIGdjYyAxLnggKi8KK2V4dGVybiBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCAqLworZXh0ZXJuIGludCBmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZTsJLyogLWggTlVNICovCisKKy8qIEZsYWcgdGhhdCBkZXRlcm1pbmVzIGhvdyB3ZSBtYXAgbmFtZXMuICBUaGlzIHRha2VzIHNldmVyYWwgdmFsdWVzLCBhbmQKKyAqIGlzIHNldCB3aXRoIHRoZSAtaCBzd2l0Y2guICBBIHZhbHVlIG9mIHplcm8gaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKKyAqIHVwcGVyIGNhc2UsIGFuZCB0aGUgcHJlc2VuY2Ugb2YgdGhlIC1oIHN3aXRjaCBpbmhpYml0cyB0aGUgY2FzZSBoYWNrLgorICogTm8gLWggc3dpdGNoIGF0IGFsbCBzZXRzIHZtc19uYW1lX21hcHBpbmcgdG8gMCwgYW5kIGFsbG93cyBjYXNlIGhhY2tpbmcuCisgKiBBIHZhbHVlIG9mIDIgKHNldCB3aXRoIC1oMikgaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKKyAqIGFsbCBsb3dlciBjYXNlLCB3aXRoIG5vIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMyAoc2V0IHdpdGggLWgzKSBpbXBsaWVzCisgKiB0aGF0IGNhc2Ugc2hvdWxkIGJlIHByZXNlcnZlZC4gICovCisKKy8qIElmIHRoZSAtKyBzd2l0Y2ggaXMgZ2l2ZW4sIHRoZW4gdGhlIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcworICogbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycywgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGUgLWggc3dpdGNoLgorICovCisKK2NoYXIgdm1zX25hbWVfbWFwcGluZyA9IDA7CisKK3N0YXRpYyBzeW1ib2xTICpFbnRyeV9Qb2ludF9TeW1ib2wgPSAwOwkvKiBQb2ludGVyIHRvICJfbWFpbiIgKi8KKworLyoKKyAqCVdlIGF1Z21lbnQgdGhlICJnYXMiIHN5bWJvbCBzdHJ1Y3R1cmUgd2l0aCB0aGlzCisgKi8KK3N0cnVjdCBWTVNfU3ltYm9sCit7CisgIHN0cnVjdCBWTVNfU3ltYm9sICpOZXh0OworICBzeW1ib2xTICpTeW1ib2w7CisgIGludCBTaXplOworICBpbnQgUHNlY3RfSW5kZXg7CisgIGludCBQc2VjdF9PZmZzZXQ7Cit9OworCitzdHJ1Y3QgVk1TX1N5bWJvbCAqVk1TX1N5bWJvbHMgPSAwOworc3RydWN0IFZNU19TeW1ib2wgKkN0b3JzX1N5bWJvbHMgPSAwOworc3RydWN0IFZNU19TeW1ib2wgKkR0b3JzX1N5bWJvbHMgPSAwOworCisvKiBXZSBuZWVkIHRoaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmFyaW91cyBpbnB1dCBmaWxlcywgc28gdGhhdCB3ZSBjYW4KKyAqIGdpdmUgdGhlIGRlYnVnZ2VyIHRoZSBjb3JyZWN0IHNvdXJjZSBsaW5lLgorICovCisKK3N0cnVjdCBpbnB1dF9maWxlCit7CisgIHN0cnVjdCBpbnB1dF9maWxlICpuZXh0OworICBzdHJ1Y3QgaW5wdXRfZmlsZSAqc2FtZV9maWxlX2ZwbnQ7CisgIGludCBmaWxlX251bWJlcjsKKyAgaW50IG1heF9saW5lOworICBpbnQgbWluX2xpbmU7CisgIGludCBvZmZzZXQ7CisgIGNoYXIgZmxhZzsKKyAgY2hhciAqbmFtZTsKKyAgc3ltYm9sUyAqc3BudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfZmlsZSAqZmlsZV9yb290ID0gKHN0cnVjdCBpbnB1dF9maWxlICopIE5VTEw7CisKKworLyoKKyAqIFN0eWxlcyBvZiBQU0VDVFMgKHByb2dyYW0gc2VjdGlvbnMpIHRoYXQgd2UgZ2VuZXJhdGU7IGp1c3Qgc2hvcnRoYW5kCisgKiB0byBhdm9pZCBsaXN0cyBvZiBzZWN0aW9uIGF0dHJpYnV0ZXMuICBVc2VkIGJ5IFZNU19Qc2VjdF9TcGVjKCkuCisgKi8KK2VudW0gcHNfdHlwZQoreworICBwc19URVhULCBwc19EQVRBLCBwc19DT01NT04sIHBzX0NPTlNULCBwc19DVE9SUywgcHNfRFRPUlMKK307CisKKy8qCisgKiBUaGlzIGVudW0gaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHZhcmlhYmxlcyB0aGF0CisgKiBtYXkgYmUgcHJlc2VudC4KKyAqLworCitlbnVtIGFkdmFuY2VkX3R5cGUKK3sKKyAgQkFTSUMsIFBPSU5URVIsIEFSUkFZLCBFTlVNLCBTVFJVQ1QsIFVOSU9OLCBGVU5DVElPTiwgVk9JRCwgQUxJQVMsIFVOS05PV04KK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhYnMgZGlyZWN0aXZlcywgYW5kIHRoZQorICogaW5mb3JtYXRpb24gaXMgZmlsbGVkIGluIGJ5IFZNU190eXBlZGVmX3BhcnNlLiAgRXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZAorICogdG8gZ2VuZXJhdGUgdGhlIGRlYnVnZ2luZyByZWNvcmQgZm9yIGEgZ2l2ZW4gc3ltYm9sIGlzIHByZXNlbnQgaGVyZS4KKyAqIFRoaXMgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5LCB1c2luZyBuZXN0ZWQgc3RydWN0L3VuaW9ucywgYnV0IGZvciBub3cKKyAqIEkgYW0gaGFwcHkgdGhhdCBpdCB3b3Jrcy4KKyAqLworc3RydWN0IFZNU19EQkdfU3ltYm9sCit7CisgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqbmV4dDsKKyAgLyogZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGlzICovCisgIGVudW0gYWR2YW5jZWRfdHlwZSBhZHZhbmNlZDsKKyAgLyogdGhpcyByZWNvcmQgaXMgZm9yIHRoaXMgdHlwZSAqLworICBpbnQgZGJ4X3R5cGU7CisgIC8qIEZvciBhZHZhbmNlZCB0eXBlcyB0aGlzIGlzIHRoZSB0eXBlIHJlZmVycmVkIHRvLiAgSS5lLiwgdGhlIHR5cGUKKyAgICAgYSBwb2ludGVyIHBvaW50cyB0bywgb3IgdGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQgbWFrZXMgdXAgYW4KKyAgICAgYXJyYXkuICAqLworICBpbnQgdHlwZTI7CisgIC8qIFVzZSB0aGlzIHR5cGUgd2hlbiBnZW5lcmF0aW5nIGEgdmFyaWFibGUgZGVmICovCisgIGludCBWTVNfdHlwZTsKKyAgLyogdXNlZCBmb3IgYXJyYXlzIC0gdGhpcyB3aWxsIGJlIHByZXNlbnQgZm9yIGFsbCAqLworICBpbnQgaW5kZXhfbWluOworICAvKiBlbnRyaWVzLCBidXQgd2lsbCBiZSBtZWFuaW5nbGVzcyBmb3Igbm9uLWFycmF5cyAqLworICBpbnQgaW5kZXhfbWF4OworICAvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHR5cGUuICBGb3IgYW4gYXJyYXksIHRoaXMgaXMgdGhlIHNpemUKKyAgICAgb2Ygb25lIGVsZW1lbnQgaW4gdGhlIGFycmF5ICovCisgIGludCBkYXRhX3NpemU7CisgIC8qIE51bWJlciBvZiB0aGUgc3RydWN0dXJlL3VuaW9uL2VudW0gLSB1c2VkIGZvciByZWYgKi8KKyAgaW50IHN0cnVjX251bWI7Cit9OworCisjZGVmaW5lIFNZTVRZUExTVF9TSVpFICgxPDw0KQkvKiAxNjsgbXVzdCBiZSBwb3dlciBvZiB0d28gKi8KKyNkZWZpbmUgU1lNVFlQX0hBU0goeCkgKCh1bnNpZ25lZCkoeCkgJiAoU1lNVFlQTFNUX1NJWkUtMSkpCitzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKlZNU19TeW1ib2xfdHlwZV9saXN0W1NZTVRZUExTVF9TSVpFXTsKKworLyoKKyAqIFdlIG5lZWQgdGhpcyBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiBmb3J3YXJkIHJlZmVyZW5jZXMgdG8KKyAqIHN0cnVjdC91bmlvbi9lbnVtIHRoYXQgaGF2ZSBub3QgYmVlbiBkZWZpbmVkIHlldC4gIFdoZW4gdGhleSBhcmUgdWx0aW1hdGVseQorICogZGVmaW5lZCwgdGhlbiB3ZSBjYW4gZ28gYmFjayBhbmQgZ2VuZXJhdGUgdGhlIFRJUiBjb21tYW5kcyB0byBtYWtlIGEgYmFjaworICogcmVmZXJlbmNlLgorICovCisKK3N0cnVjdCBmb3J3YXJkX3JlZgoreworICBzdHJ1Y3QgZm9yd2FyZF9yZWYgKm5leHQ7CisgIGludCBkYnhfdHlwZTsKKyAgaW50IHN0cnVjX251bWI7CisgIGNoYXIgcmVzb2x2ZWQ7Cit9OworCitzdHJ1Y3QgZm9yd2FyZF9yZWYgKmZfcmVmX3Jvb3QgPSAoc3RydWN0IGZvcndhcmRfcmVmICopIE5VTEw7CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBjb21wYXJlIHRoZSBuYW1lcyBvZiBjZXJ0YWluIHR5cGVzIHRvIHZhcmlvdXMKKyAqIGZpeGVkIHR5cGVzIHRoYXQgYXJlIGtub3duIGJ5IHRoZSBkZWJ1Z2dlci4KKyAqLworI2RlZmluZSB0eXBlX2NoZWNrKFgpICAhc3RyY21wIChzeW1ib2xfbmFtZSwgWCkKKworLyoKKyAqIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgd2UgYXJlCisgKiB3b3JraW5nIG9uIHdoaWxlIHdlIGFyZSBwYXJzaW5nIHRoZSBzdGFicyBkaXJlY3RpdmVzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7CisKKy8qIFdlIHVzZSB0aGlzIGNvdW50ZXIgdG8gYXNzaWduIG51bWJlcnMgdG8gYWxsIG9mIHRoZSBzdHJ1Y3R1cmVzLCB1bmlvbnMKKyAqIGFuZCBlbnVtcyB0aGF0IHdlIGRlZmluZS4gIFdoZW4gd2UgYWN0dWFsbHkgZGVjbGFyZSBhIHZhcmlhYmxlIHRvIHRoZQorICogZGVidWdnZXIsIHdlIGNhbiBzaW1wbHkgZG8gaXQgYnkgbnVtYmVyLCByYXRoZXIgdGhhbiBkZXNjcmliaW5nIHRoZQorICogd2hvbGUgdGhpbmcgZWFjaCB0aW1lLgorICovCisKK3N0YXRpYyBzdHJ1Y3R1cmVfY291bnQgPSAwOworCisvKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbWFraW5nIHRoZSBsYXN0IGF0dGVtcHQgdG8KKyAgIHBhcnNlIHRoZSBzdGFicywgYW5kIHRoYXQgd2Ugc2hvdWxkIGRlZmluZSBhcyBtdWNoIGFzIHdlIGNhbiwgYW5kIGlnbm9yZQorICAgdGhlIHJlc3QgKi8KKworc3RhdGljIGludCBmaW5hbF9wYXNzOworCisvKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgbnVtYmVyCisgKiBmb3IgYSBnaXZlbiB2YXJpYWJsZS4gIElmIHRoaXMgaXMgPCAwLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHN0cnVjdHVyZQorICogaGFzIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIHRvIHRoZSBkZWJ1Z2dlci4gIFRoaXMgaXMgc3RpbGwgY29vbCwgc2luY2UKKyAqIHRoZSBWTVMgb2JqZWN0IGxhbmd1YWdlIGhhcyB3YXlzIG9mIGZpeGluZyB0aGluZ3MgdXAgYWZ0ZXIgdGhlIGZhY3QsCisgKiBzbyB3ZSBqdXN0IG1ha2UgYSBub3RlIG9mIHRoaXMsIGFuZCBnZW5lcmF0ZSBmaXh1cHMgYXQgdGhlIGVuZC4KKyAqLworc3RhdGljIGludCBzdHJ1Y3RfbnVtYmVyOworCisvKiBUaGlzIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBEX2Zsb2F0IGFuZCBHX2Zsb2F0IGZvciB0ZWxsaW5nCisgICB0aGUgZGVidWdnZXIgYWJvdXQgZG91Ymxlcy4gIGdjYyBvdXRwdXRzIHRoZSBzYW1lIC5zdGFicyByZWdhcmRsZXNzCisgICBvZiB3aGV0aGVyIC1tZyBpcyB1c2VkIHRvIHNlbGVjdCBhbHRlcm5hdGUgZG91Ymxlcy4gICovCisKK3N0YXRpYyBpbnQgdmF4X2dfZG91YmxlcyA9IDA7CisKKy8qIExvY2FsIHN5bWJvbCByZWZlcmVuY2VzICh1c2VkIHRvIGhhbmRsZSBOX0FCUyBzeW1ib2xzOyBnY2MgZG9lcyBub3QKKyAgIGdlbmVyYXRlIHRob3NlLCBidXQgdGhleSdyZSBwb3NzaWJsZSB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibGVyIGlucHV0KQorICAgYXJlIGFsd2F5cyBtYWRlIHJlbGF0aXZlIHRvIHNvbWUgcGFydGljdWxhciBlbnZpcm9ubWVudC4gIElmIHRoZSBjdXJyZW50CisgICBpbnB1dCBoYXMgYW55IHN1Y2ggc3ltYm9scywgdGhlbiB3ZSBleHBlY3QgdGhpcyB0byBnZXQgaW5jcmVtZW50ZWQKKyAgIGV4YWN0bHkgb25jZSBhbmQgZW5kIHVwIGhhdmluZyBhbGwgb2YgdGhlbSBiZSBpbiBlbnZpcm9ubWVudCAjMC4gICovCisKK3N0YXRpYyBpbnQgQ3VycmVudF9FbnZpcm9ubWVudCA9IC0xOworCisvKiBFdmVyeSBvYmplY3QgZmlsZSBtdXN0IHNwZWNpZnkgYW4gbW9kdWxlIG5hbWUsIHdoaWNoIGlzIGFsc28gdXNlZCBieQorICAgdHJhY2ViYWNrIHJlY29yZHMuICBTZXQgaW4gV3JpdGVfVk1TX01IRF9SZWNvcmRzKCkuICAqLworCitzdGF0aWMgY2hhciBNb2R1bGVfTmFtZVsyNTUrMV07CisKKy8qCisgKiBWYXJpYWJsZSBkZXNjcmlwdG9ycyBhcmUgdXNlZCB0ZWxsIHRoZSBkZWJ1Z2dlciB0aGUgZGF0YSB0eXBlcyBvZiBjZXJ0YWluCisgKiBtb3JlIGNvbXBsaWNhdGVkIHZhcmlhYmxlcyAoYmFzaWNhbGx5IGFueXRoaW5nIGludm9sdmluZyBhIHN0cnVjdHVyZSwKKyAqIHVuaW9uLCBlbnVtLCBhcnJheSBvciBwb2ludGVyKS4gIFNvbWUgbm9uLXBvaW50ZXIgdmFyaWFibGVzIG9mIHRoZQorICogYmFzaWMgdHlwZXMgdGhhdCB0aGUgZGVidWdnZXIga25vd3MgYWJvdXQgZG8gbm90IHJlcXVpcmUgYSB2YXJpYWJsZQorICogZGVzY3JpcHRvci4KKyAqCisgKiBTaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGhhdmUgYSB2YXJpYWJsZSBkZXNjcmlwdG9yIGxvbmdlciB0aGFuIDEyOAorICogYnl0ZXMgYnkgdmlydHVlIG9mIHRoZSB3YXkgdGhhdCB0aGUgVk1TIG9iamVjdCBsYW5ndWFnZSBpcyBzZXQgdXAsCisgKiBpdCBtYWtlcyBub3Qgc2Vuc2UgdG8gbWFrZSB0aGUgYXJyYXlzIGFueSBsb25nZXIgdGhhbiB0aGlzLCBvciB3b3JyeWluZworICogYWJvdXQgZHluYW1pYyBzaXppbmcgb2YgdGhlIGFycmF5LgorICoKKyAqIFRoZXNlIGFyZSB0aGUgYXJyYXlzIGFuZCBjb3VudGVycyB0aGF0IHdlIHVzZSB0byBidWlsZCBhIHZhcmlhYmxlCisgKiBkZXNjcmlwdG9yLgorICovCisKKyNkZWZpbmUgTUFYX0RFQlVHX1JFQ09SRCAxMjgKK3N0YXRpYyBjaGFyIExvY2FsW01BWF9ERUJVR19SRUNPUkRdOwkvKiBidWZmZXIgZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBjaGFyIEFzdWZmaXhbTUFYX0RFQlVHX1JFQ09SRF07CS8qIGJ1ZmZlciBmb3IgYXJyYXkgZGVzY3JpcHRvciAqLworc3RhdGljIGludCBMcG50OwkJLyogaW5kZXggaW50byBMb2NhbCAqLworc3RhdGljIGludCBBcG9pbnQ7CQkvKiBpbmRleCBpbnRvIEFzdWZmaXggKi8KK3N0YXRpYyBjaGFyIG92ZXJmbG93OwkJLyogZmxhZyB0byBpbmRpY2F0ZSB3ZSBoYXZlIHdyaXR0ZW4gdG9vIG11Y2gqLworc3RhdGljIGludCB0b3RhbF9sZW47CQkvKiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHZhcmlhYmxlCisJCQkJZGVzY3JpcHRvciBwbHVzIGFycmF5IGRlc2NyaXB0b3IgLSB1c2VkIGZvciBsZW4gYnl0ZSovCisKKy8qIEZsYWcgaWYgd2UgaGF2ZSB0b2xkIHVzZXIgYWJvdXQgZmluZGluZyBnbG9iYWwgY29uc3RhbnRzIGluIHRoZSB0ZXh0CisgICBzZWN0aW9uLiAqLworc3RhdGljIGludCBnYXZlX2NvbXBpbGVyX21lc3NhZ2UgPSAwOworCisKKy8qCisgKglHbG9iYWwgZGF0YSAoT2JqZWN0IHJlY29yZHMgbGltaXRlZCB0byA1MTIgYnl0ZXMgYnkgVkFYLTExICJDIiBydW50aW1lKQorICovCitzdGF0aWMgaW50IFZNU19PYmplY3RfRmlsZV9GRDsJLyogRmlsZSBEZXNjcmlwdG9yIGZvciBvYmplY3QgZmlsZSAqLworc3RhdGljIGNoYXIgT2JqZWN0X1JlY29yZF9CdWZmZXJbNTEyXTsJLyogQnVmZmVyIGZvciBvYmplY3QgZmlsZSByZWNvcmRzICAqLworc3RhdGljIGludCBPYmplY3RfUmVjb3JkX09mZnNldDsvKiBPZmZzZXQgdG8gZW5kIG9mIGRhdGEJICAgKi8KK3N0YXRpYyBpbnQgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGU7CS8qIFR5cGUgb2YgcmVjb3JkIGluIGFib3ZlCSAgICovCisKKy8qCisgKglNYWNyb3MgZm9yIG1vdmluZyBkYXRhIGFyb3VuZC4gIE11c3Qgd29yayBvbiBiaWctZW5kaWFuIHN5c3RlbXMuCisgKi8KKyNpZmRlZiBWTVMgIC8qIFRoZXNlIGFyZSBtb3JlIGVmZmljaWVudCBmb3IgVk1TLT5WTVMgc3lzdGVtcyAqLworI2RlZmluZSBDT1BZX0xPTkcoZGVzdCx2YWwpCSggKihsb25nICopKGRlc3QpID0gKHZhbCkgKQorI2RlZmluZSBDT1BZX1NIT1JUKGRlc3QsdmFsKQkoICooc2hvcnQgKikoZGVzdCkgPSAodmFsKSApCisjZWxzZQorI2RlZmluZSBDT1BZX0xPTkcoZGVzdCx2YWwpCW1kX251bWJlcl90b19jaGFycyAoKGRlc3QpLCAodmFsKSwgNCkKKyNkZWZpbmUgQ09QWV9TSE9SVChkZXN0LHZhbCkJbWRfbnVtYmVyX3RvX2NoYXJzICgoZGVzdCksICh2YWwpLCAyKQorI2VuZGlmCisvKgorICoJTWFjcm9zIGZvciBwbGFjaW5nIGRhdGEgaW50byB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIuCisgKi8KKyNkZWZpbmUgUFVUX0xPTkcodmFsKSBcCisJKCBDT1BZX0xPTkcgKCZPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldF0sICh2YWwpKSwgXAorCSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgKz0gNCApCisKKyNkZWZpbmUgUFVUX1NIT1JUKHZhbCkgXAorCSggQ09QWV9TSE9SVCAoJk9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0XSwgKHZhbCkpLCBcCisJICBPYmplY3RfUmVjb3JkX09mZnNldCArPSAyICkKKworI2RlZmluZSBQVVRfQ0hBUih2YWwpICggT2JqZWN0X1JlY29yZF9CdWZmZXJbT2JqZWN0X1JlY29yZF9PZmZzZXQrK10gPSAodmFsKSApCisKKyNkZWZpbmUgUFVUX0NPVU5URURfU1RSSU5HKGNwKSBkbyB7IFwKKwkJCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY3ApOyBcCisJCQlQVVRfQ0hBUiAoKGNoYXIpIHN0cmxlbiAocCkpOyBcCisJCQl3aGlsZSAoKnApIFBVVF9DSEFSICgqcCsrKTsgfSB3aGlsZSAoMCkKKworLyoKKyAqCU1hY3JvIGZvciBkZXRlcm1pbmluZyBpZiBhIE5hbWUgaGFzIHBzZWN0IGF0dHJpYnV0ZXMgYXR0YWNoZWQKKyAqCXRvIGl0LgorICovCisjZGVmaW5lIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HCQkiJCRQc2VjdEF0dHJpYnV0ZXNfIgorI2RlZmluZSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEgJMTgKKworI2RlZmluZSBIQVNfUFNFQ1RfQVRUUklCVVRFUyhOYW1lKSBcCisJCShzdHJuY21wICgoKk5hbWUgPT0gJ18nID8gTmFtZSArIDEgOiBOYW1lKSwgXAorCQkJICBQU0VDVF9BVFRSSUJVVEVTX1NUUklORywgXAorCQkJICBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEgpID09IDApCisMCisKKyAvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KK2NvbnN0IHNob3J0IHNlZ19OX1RZUEVbXSA9Cit7CisgIE5fQUJTLAorICBOX1RFWFQsCisgIE5fREFUQSwKKyAgTl9CU1MsCisgIE5fVU5ERiwJCQkvKiB1bmtub3duICovCisgIE5fVU5ERiwJCQkvKiBlcnJvciAqLworICBOX1VOREYsCQkJLyogZXhwcmVzc2lvbiAqLworICBOX1VOREYsCQkJLyogZGVidWcgKi8KKyAgTl9VTkRGLAkJCS8qIG50diAqLworICBOX1VOREYsCQkJLyogcHR2ICovCisgIE5fUkVHSVNURVIsCQkJLyogcmVnaXN0ZXIgKi8KK307CisKK2NvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tOX1RZUEUgKyAyXSA9Cit7CQkJCS8qIE5fVFlQRSA9PSAweDFFID0gMzItMiAqLworICBTRUdfVU5LTk9XTiwJCQkvKiBOX1VOREYgPT0gMCAqLworICBTRUdfR09PRiwKKyAgU0VHX0FCU09MVVRFLAkJCS8qIE5fQUJTID09IDIgKi8KKyAgU0VHX0dPT0YsCisgIFNFR19URVhULAkJCS8qIE5fVEVYVCA9PSA0ICovCisgIFNFR19HT09GLAorICBTRUdfREFUQSwJCQkvKiBOX0RBVEEgPT0gNiAqLworICBTRUdfR09PRiwKKyAgU0VHX0JTUywJCQkvKiBOX0JTUyA9PSA4ICovCisgIFNFR19HT09GLAorICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCisgIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKKyAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCisgIFNFR19SRUdJU1RFUiwJCQkvKiBkdW1teSBOX1JFR0lTVEVSIGZvciByZWdzID0gMzAgKi8KKyAgU0VHX0dPT0YsCit9OworDAorCisvKiBMb2NhbCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIHJldHVybiBhIHZhbHVlLiAgKi8KKworc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICpmaW5kX2ZpbGUgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitzdGF0aWMgc3RydWN0IFZNU19EQkdfU3ltYm9sICpmaW5kX3N5bWJvbCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBzeW1ib2xTICpEZWZpbmVfUm91dGluZSBQQVJBTVMgKChzeW1ib2xTICosaW50LHN5bWJvbFMgKixpbnQpKTsKKworc3RhdGljIGNoYXIgKmN2dF9pbnRlZ2VyIFBBUkFNUyAoKGNoYXIgKixpbnQgKikpOworc3RhdGljIGNoYXIgKmZpeF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIGNoYXIgKmdldF9zdHJ1Y3RfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIG9mZnNldFQgVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSBQQVJBTVMgKChzeW1ib2xTICosdW5zaWduZWQpKTsKKworc3RhdGljIGludCBWTVNfVEJUX1NvdXJjZV9GaWxlIFBBUkFNUyAoKGNoYXIgKixpbnQpKTsKK3N0YXRpYyBpbnQgZ2VuMSBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKK3N0YXRpYyBpbnQgZm9yd2FyZF9yZWZlcmVuY2UgUEFSQU1TICgoY2hhciAqKSk7CitzdGF0aWMgaW50IGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqKSk7CitzdGF0aWMgaW50IFZNU190eXBlZGVmX3BhcnNlIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIGludCBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgVk1TX1BzZWN0X1NwZWMgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxlbnVtIHBzX3R5cGUsCisJCQkJICAgc3RydWN0IFZNU19TeW1ib2wgKikpOworCisvKiBMb2NhbCBzdXBwb3J0IHJvdXRpbmVzIHdoaWNoIGRvbid0IGRpcmVjdGx5IHJldHVybiBhbnkgdmFsdWUuICAqLworCitzdGF0aWMgdm9pZCBzX2NvbnN0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBDbG9zZV9WTVNfT2JqZWN0X0ZpbGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgdm1zX3Rpcl9zdGFja19wc2VjdCBQQVJBTVMgKChpbnQsaW50LGludCkpOworc3RhdGljIHZvaWQgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBWTVNfU2V0X0RhdGEgUEFSQU1TICgoaW50LGludCxpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBWTVNfU3RvcmVfU3RydWN0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgVk1TX0RlZl9TdHJ1Y3QgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBWTVNfU2V0X1N0cnVjdCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIFZNU19UQlRfTW9kdWxlX0JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIFZNU19UQlRfTW9kdWxlX0VuZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBWTVNfVEJUX1JvdXRpbmVfQmVnaW4gUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOworc3RhdGljIHZvaWQgVk1TX1RCVF9Sb3V0aW5lX0VuZCBQQVJBTVMgKChpbnQsc3ltYm9sUyAqKSk7CitzdGF0aWMgdm9pZCBWTVNfVEJUX0Jsb2NrX0JlZ2luIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsY2hhciAqKSk7CitzdGF0aWMgdm9pZCBWTVNfVEJUX0Jsb2NrX0VuZCBQQVJBTVMgKCh2YWx1ZVQpKTsKK3N0YXRpYyB2b2lkIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiBQQVJBTVMgKChpbnQsaW50LGludCxpbnQpKTsKK3N0YXRpYyB2b2lkIFZNU19UQlRfU291cmNlX0xpbmVzIFBBUkFNUyAoKGludCxpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBmcHVzaCBQQVJBTVMgKChpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBycHVzaCBQQVJBTVMgKChpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBhcnJheV9zdWZmaXggUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKK3N0YXRpYyB2b2lkIG5ld19mb3J3YXJkX3JlZiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKK3N0YXRpYyB2b2lkIGJpdGZpZWxkX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKixpbnQpKTsKK3N0YXRpYyB2b2lkIHNldHVwX2Jhc2ljX3R5cGUgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKK3N0YXRpYyB2b2lkIFZNU19EQkdfcmVjb3JkIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCxpbnQsY2hhciAqKSk7CitzdGF0aWMgdm9pZCBWTVNfbG9jYWxfc3RhYl9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICopKTsKK3N0YXRpYyB2b2lkIFZNU19zdGFiX3BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsaW50LGludCxpbnQpKTsKK3N0YXRpYyB2b2lkIFZNU19HU1lNX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQpKTsKK3N0YXRpYyB2b2lkIFZNU19MQ1NZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7CitzdGF0aWMgdm9pZCBWTVNfU1RTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOworc3RhdGljIHZvaWQgVk1TX1JTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKixpbnQpKTsKK3N0YXRpYyB2b2lkIFZNU19MU1lNX1BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIERlZmluZV9Mb2NhbF9TeW1ib2xzIFBBUkFNUyAoKHN5bWJvbFMgKixzeW1ib2xTICosc3ltYm9sUyAqLGludCkpOworc3RhdGljIHZvaWQgV3JpdGVfVk1TX01IRF9SZWNvcmRzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIFdyaXRlX1ZNU19FT01fUmVjb3JkIFBBUkFNUyAoKGludCx2YWx1ZVQpKTsKK3N0YXRpYyB2b2lkIFZNU19DYXNlX0hhY2tfU3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixjaGFyICopKTsKK3N0YXRpYyB2b2lkIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50ICopKTsKK3N0YXRpYyB2b2lkIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMgUEFSQU1TICgodW5zaWduZWQsdW5zaWduZWQsY2hhciAqKSk7CitzdGF0aWMgdm9pZCBWTVNfUHJvY2VkdXJlX0VudHJ5X1B0IFBBUkFNUyAoKGNoYXIgKixpbnQsaW50LGludCkpOworc3RhdGljIHZvaWQgVk1TX1NldF9Qc2VjdCBQQVJBTVMgKChpbnQsaW50LGludCkpOworc3RhdGljIHZvaWQgVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEgUEFSQU1TICgoaW50LGNoYXIgKixpbnQsaW50KSk7CitzdGF0aWMgdm9pZCBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCwKKwkJCQkJCSAgICBpbnQsaW50LGludCxpbnQpKTsKK3N0YXRpYyB2b2lkIFZNU19GaXhfSW5kaXJlY3RfUmVmZXJlbmNlIFBBUkFNUyAoKGludCxpbnQsZnJhZ1MgKixmcmFnUyAqKSk7CisKKy8qIFN1cHBvcnQgY29kZSB3aGljaCB1c2VkIHRvIGJlIGlubGluZSB3aXRoaW4gdm1zX3dyaXRlX29iamVjdF9maWxlLiAgKi8KK3N0YXRpYyB2b2lkIHZtc19maXh1cF90ZXh0X3NlY3Rpb24gUEFSQU1TICgodW5zaWduZWQsc3RydWN0IGZyYWcgKixzdHJ1Y3QgZnJhZyAqKSk7CitzdGF0aWMgdm9pZCBzeW50aGVzaXplX2RhdGFfc2VnbWVudCBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCxzdHJ1Y3QgZnJhZyAqKSk7CitzdGF0aWMgdm9pZCB2bXNfZml4dXBfZGF0YV9zZWN0aW9uIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkKSk7CitzdGF0aWMgdm9pZCBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCkpOworc3RhdGljIHZvaWQgbG9jYWxfc3ltYm9sc19EU1QgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKikpOworc3RhdGljIHZvaWQgdm1zX2J1aWxkX0RTVCBQQVJBTVMgKCh1bnNpZ25lZCkpOworc3RhdGljIHZvaWQgdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IFZNU19TeW1ib2wgKiwgaW50KSk7CisMCisKKy8qIFRoZSBmb2xsb3dpbmcgY29kZSBkZWZpbmVzIHRoZSBzcGVjaWFsIHR5cGVzIG9mIHBzZXVkby1vcHMgdGhhdCB3ZQorICAgdXNlIHdpdGggVk1TLiAgKi8KKwordW5zaWduZWQgY2hhciBjb25zdF9mbGFnID0gSU5fREVGQVVMVF9TRUNUSU9OOworCitzdGF0aWMgdm9pZAorc19jb25zdCAoYXJnKQorICAgICBpbnQgYXJnOwkvKiAzcmQgZmllbGQgZnJvbSBvYmpfcHNldWRvX3RhYmxlW107IG5vdCBuZWVkZWQgaGVyZSAqLworeworICAvKiBTaW5jZSB3ZSBkb24ndCBuZWVkIGBhcmcnLCB1c2UgaXQgYXMgb3VyIHNjcmF0Y2ggdmFyaWFibGUgc28gdGhhdAorICAgICB3ZSB3b24ndCBnZXQgYW55ICJub3QgdXNlZCIgd2FybmluZ3MgYWJvdXQgaXQuICAqLworICBhcmcgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIChzdWJzZWdUKSBhcmcpOworICBjb25zdF9mbGFnID0gMTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsiY29uc3QiLCBzX2NvbnN0LCAwfSwKKyAgezAsIDAsIDB9LAorfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLworCisKKy8qIFJvdXRpbmUgdG8gcGVyZm9ybSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oKS4gICovCisKK2ludAordm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgLyoKKyAgICoJSWYgdGhlIG5ldyBzeW1ib2wgaXMgLmNvbW0gQU5EIGl0IGhhcyBhIHNpemUgb2YgemVybywKKyAgICoJd2UgaWdub3JlIGl0IChpLmUuIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyBpdCkKKyAgICovCisgIGlmIChTRUdNRU5UX1RPX1NZTUJPTF9UWVBFICgoaW50KSBub3dfc2VnKSA9PSAoTl9VTkRGIHwgTl9FWFQpCisgICAgICAmJiBmcmFnX25vd19maXggKCkgPT0gMCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCJjb21waWxlciBlbWl0dGVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksCisJICAgICAgIFNfR0VUX05BTUUgKHN5bSkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAvKgorICAgKglJZiB0aGUgb2xkIHN5bWJvbCBpcyAuY29tbSBhbmQgaXQgaGFzIGEgc2l6ZSBvZiB6ZXJvLAorICAgKgl3ZSBvdmVycmlkZSBpdCB3aXRoIHRoZSBuZXcgc3ltYm9sIHZhbHVlLgorICAgKi8KKyAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bSkgJiYgU19JU19ERUZJTkVEIChzeW0pICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IDApCisgICAgeworICAgICAgYXNfd2FybiAoXygiY29tcGlsZXIgcmVkZWZpbmVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcyciKSwKKwkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7CisgICAgICBzeW0tPnN5X2ZyYWcgID0gZnJhZ19ub3c7CisgICAgICBTX1NFVF9PVEhFUiAoc3ltLCBjb25zdF9mbGFnKTsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7CisgICAgICAvKiBLZWVwIE5fRVhUIGJpdC4gICovCisgICAgICBzeW0tPnN5X3N5bWJvbC5uX3R5cGUgfD0gU0VHTUVOVF9UT19TWU1CT0xfVFlQRSAoKGludCkgbm93X3NlZyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogYHRjX2Zyb2JfbGFiZWwnIGhhbmRsZXIgZm9yIGNvbG9uKHN5bWJvbHMuYyksIHVzZWQgdG8gZXhhbWluZSB0aGUKKyAgIGR1bW15IGxhYmVsKHMpIGdjYyBpbnNlcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmaWxlIGl0IGdlbmVyYXRlcy4KKyAgIGdjYyAxLnggcHV0ICJnY2NfY29tcGlsZWQuIjsgZ2NjIDIueCAoYXMgb2YgMi43KSBwdXRzICJnY2MyX2NvbXBpbGVkLiIKKyAgIGFuZCAiX19nbnVfbGFuZ3VhZ2VfPG5hbWU+IiBhbmQgcG9zc2libHkgIl9fdmF4Xzx0eXBlPl9kb3VibGVzIi4gICovCisKK3ZvaWQKK3Ztc19jaGVja19mb3Jfc3BlY2lhbF9sYWJlbCAoc3ltYm9sUCkKK3N5bWJvbFMgKnN5bWJvbFA7Cit7CisgIC8qIFNwZWNpYWwgbGFiZWxzIG9ubHkgb2NjdXIgcHJpb3IgdG8gZXhwbGljaXQgc2VjdGlvbiBkaXJlY3RpdmVzLiAgKi8KKyAgaWYgKChjb25zdF9mbGFnICYgSU5fREVGQVVMVF9TRUNUSU9OKSAhPSAwKQorICAgIHsKKyAgICAgIGNoYXIgKnN5bV9uYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7CisKKyAgICAgIGlmICgqc3ltX25hbWUgPT0gJ18nKQorCSsrc3ltX25hbWU7CisKKyAgICAgIGlmICghc3RyY21wIChzeW1fbmFtZSwgIl9fdmF4X2dfZG91YmxlcyIpKQorCXZheF9nX2RvdWJsZXMgPSAxOworI2lmIDAJLyogbm90IG5lY2Vzc2FyeSAqLworICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJfX3ZheF9kX2RvdWJsZXMiKSkKKwl2YXhfZ19kb3VibGVzID0gMDsKKyNlbmRpZgorI2lmIDAJLyogdGhlc2UgYXJlIHBvdGVudGlhbCBhbHRlcm5hdGl2ZXMgdG8gdGMtdmF4LmMncyBtZF9wYXJzZV9vcHRpb25zKCkgKi8KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiZ2NjX2NvbXBpbGVkLiIpKQorCWZsYWdfb25lID0gMTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiX19nbnVfbGFuZ3VhZ2VfY3BsdXNwbHVzIikpCisJZmxhZ19oYXNoX2xvbmdfbmFtZXMgPSAxOworI2VuZGlmCisgICAgfQorICByZXR1cm47Cit9CisKKwordm9pZAorb2JqX3JlYWRfYmVnaW5faG9vayAoKQoreworICByZXR1cm47Cit9CisKKwordm9pZAorb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisgIHN5bWJvbFMgKipzeW1ib2xQUDsKKyAgaW50IHN5bWJvbF9udW1iZXIgPSAwOworCisgIHN5bWJvbFBQID0gJnN5bWJvbF9yb290UDsJLyogLT4gbGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KKyAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKKworICAgICAvKiBPSywgaGVyZSBpcyBob3cgd2UgZGVjaWRlIHdoaWNoIHN5bWJvbHMgZ28gb3V0IGludG8gdGhlCisJYnJhdmUgbmV3IHN5bXRhYi4gIFN5bWJvbHMgdGhhdCBkbyBhcmU6CisKKwkqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKKwkqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQorCSogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQorCSogImxvY2FsIGxhYmVscyIgbmVlZGVkIGZvciBQSUMgZml4dXBzCisKKwlTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgorCSogc3ltYm9scyB0aGF0IGFyZSByZWdpc3RlcnMKKworCUFsbCBvdGhlciBzeW1ib2xzIGFyZSBvdXRwdXQuICBXZSBjb21wbGFpbiBpZiBhIGRlbGV0ZWQKKwlzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gICovCisKKyAgICAgIGlmICghU19JU19SRUdJU1RFUiAoc3ltYm9sUCkpCisJeworCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOworCSAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAwOworCSAgc3ltYm9sUFAgPSAmKHN5bWJvbF9uZXh0IChzeW1ib2xQKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKSkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOworCSAgICB9CQkJLyogb29wcy4gKi8KKworCSAgLyogVW5ob29rIGl0IGZyb20gdGhlIGNoYWluLiAgKi8KKwkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKKwl9CQkJLyogaWYgdGhpcyBzeW1ib2wgc2hvdWxkIGJlIGluIHRoZSBvdXRwdXQgKi8KKworICAgIH0JCQkvKiBmb3IgZWFjaCBzeW1ib2wgKi8KKworICBIX1NFVF9TVFJJTkdfU0laRSAoaGVhZGVycywgc3RyaW5nX2J5dGVfY291bnQpOworICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaGVhZGVycywgc3ltYm9sX251bWJlcik7Cit9CQkJCS8qIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4oKSAqLworDAorCisgLyoqKioqKiBWTVMgT0JKRUNUIEZJTEUgSEFDS0lORyBST1VUSU5FUyAqKioqKioqLworCisKKy8qIENyZWF0ZSB0aGUgVk1TIG9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK0NyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUgKCkKK3sKKyNpZglkZWZpbmVkKGV1bmljZSkgfHwgIWRlZmluZWQoVk1TKQorICBWTVNfT2JqZWN0X0ZpbGVfRkQgPSBjcmVhdCAob3V0X2ZpbGVfbmFtZSwgMDc3NywgInZhciIpOworI2Vsc2UJLyogZXVuaWNlICovCisgIFZNU19PYmplY3RfRmlsZV9GRCA9IGNyZWF0IChvdXRfZmlsZV9uYW1lLCAwLCAicmZtPXZhciIsCisJCQkgICAgICAiY3R4PWJpbiIsICJtYmM9MTYiLCAiZGVxPTY0IiwgImZvcD10ZWYiLAorCQkJICAgICAgInNocj1uaWwiKTsKKyNlbmRpZgkvKiBldW5pY2UgKi8KKyAgLyogRGVhbCB3aXRoIGVycm9ycy4gICovCisgIGlmIChWTVNfT2JqZWN0X0ZpbGVfRkQgPCAwKQorICAgIGFzX2ZhdGFsIChfKCJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIpLCBvdXRfZmlsZV9uYW1lKTsKKyAgLyogSW5pdGlhbGl6ZSBvYmplY3QgZmlsZSBoYWNraW5nIHZhcmlhYmxlcy4gICovCisgIE9iamVjdF9SZWNvcmRfT2Zmc2V0ID0gMDsKKyAgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUgPSAtMTsKK30KKworCisvKiBGbHVzaCB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK0ZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKQoreworICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKKyAgICByZXR1cm47CisKKyNpZm5kZWYgVk1TCQkJLyogRm9yIGNyb3NzLWFzc2VtYmx5IHB1cnBvc2VzLiAqLworICB7CisgICAgY2hhciBSZWNMZW5bMl07CisKKyAgICAvKiAiVmFyaWFibGUtbGVuZ3RoIHJlY29yZCIgZmlsZXMgaGF2ZSBhIHR3byBieXRlIGxlbmd0aCBmaWVsZAorICAgICAgIHByZXBlbmRlZCB0byBlYWNoIHJlY29yZC4gIEl0J3Mgbm9ybWFsbHkgb3V0LW9mLWJhbmQsIGFuZCBuYXRpdmUKKyAgICAgICBWTVMgb3V0cHV0IHdpbGwgaW5zZXJ0IGl0IGF1dG9tYXRpY2FsbHkgZm9yIHRoaXMgdHlwZSBvZiBmaWxlLgorICAgICAgIFdoZW4gY3Jvc3MtYXNzZW1ibGluZywgd2UgbXVzdCB3cml0ZSBpdCBleHBsaWNpdGx5LiAgKi8KKyAgICBtZF9udW1iZXJfdG9fY2hhcnMgKFJlY0xlbiwgT2JqZWN0X1JlY29yZF9PZmZzZXQsIDIpOworICAgIGlmICh3cml0ZSAoVk1TX09iamVjdF9GaWxlX0ZELCBSZWNMZW4sIDIpICE9IDIpCisgICAgICBlcnJvciAoXygiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIChsZW5ndGggcHJlZml4KSIpKTsKKyAgICAvKiBXZSBhbHNvIG5lZWQgdG8gZm9yY2UgdGhlIGFjdHVhbCByZWNvcmQgdG8gYmUgYW4gZXZlbiBudW1iZXIgb2YKKyAgICAgICBieXRlcy4gIEZvciBuYXRpdmUgb3V0cHV0LCB0aGF0J3MgYXV0b21hdGljOyB3aGVuIGNyb3NzLWFzc2VtYmxpbmcsCisgICAgICAgcGFkIHdpdGggYSBOVUwgYnl0ZSBpZiBsZW5ndGggaXMgb2RkLiAgRG8gc28gX2FmdGVyXyB3cml0aW5nIHRoZQorICAgICAgIHByZS1wYWRkZWQgbGVuZ3RoLiAgU2luY2Ugb3VyIGJ1ZmZlciBpcyBkZWZpbmVkIHdpdGggZXZlbiBzaXplLAorICAgICAgIGFuIG9kZCBvZmZzZXQgaW1wbGllcyB0aGF0IGl0IGhhcyBzb21lIHJvb20gbGVmdC4gICovCisgICAgaWYgKChPYmplY3RfUmVjb3JkX09mZnNldCAmIDEpICE9IDApCisgICAgICBPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldCsrXSA9ICdcMCc7CisgIH0KKyNlbmRpZiAvKiBub3QgVk1TICovCisKKyAgLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUuICAqLworICBpZiAod3JpdGUgKFZNU19PYmplY3RfRmlsZV9GRCwgT2JqZWN0X1JlY29yZF9CdWZmZXIsIE9iamVjdF9SZWNvcmRfT2Zmc2V0KQorICAgICAgIT0gT2JqZWN0X1JlY29yZF9PZmZzZXQpCisgICAgZXJyb3IgKF8oIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSIpKTsKKworICAvKiBUaGUgYnVmZmVyIGlzIG5vdyBlbXB0eS4gICovCisgIE9iamVjdF9SZWNvcmRfT2Zmc2V0ID0gMDsKK30KKworCisvKiBEZWNsYXJlIGEgcGFydGljdWxhciB0eXBlIG9mIG9iamVjdCBmaWxlIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoVHlwZSkKKyAgICAgaW50IFR5cGU7Cit7CisgIC8qIElmIHRoZSB0eXBlIG1hdGNoZXMsIHdlIGFyZSBkb25lLiAgKi8KKyAgaWYgKFR5cGUgPT0gQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUpCisgICAgcmV0dXJuOworICAvKiBPdGhlcndpc2U6IGZsdXNoIHRoZSBidWZmZXIuICAqLworICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7CisgIC8qIFJlbWVtYmVyIHRoZSBuZXcgdHlwZS4gICovCisgIEN1cnJlbnRfT2JqZWN0X1JlY29yZF9UeXBlID0gVHlwZTsKK30KKworCisvKiBDbG9zZSB0aGUgVk1TIE9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK0Nsb3NlX1ZNU19PYmplY3RfRmlsZSAoKQoreworICAvKiBGbHVzaCAoc2hvdWxkIG5ldmVyIGJlIG5lY2Vzc2FyeSkgYW5kIHJlc2V0IHNhdmVkIHJlY29yZC10eXBlIGNvbnRleHQuICAqLworICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoLTEpOworCisjaWZuZGVmIFZNUwkJCS8qIEZvciBjcm9zcy1hc3NlbWJseSBwdXJwb3Nlcy4gKi8KKyAgeworICAgIGNoYXIgUmVjTGVuWzJdOworICAgIGludCBtaW51c19vbmUgPSAtMTsKKworICAgIC8qIFdyaXRlIGEgMiBieXRlIHJlY29yZC1sZW5ndGggZmllbGQgb2YgLTEgaW50byB0aGUgZmlsZSwgd2hpY2gKKyAgICAgICBtZWFucyBlbmQtb2YtYmxvY2sgd2hlbiByZWFkLCBoZW5jZSBlbmQtb2YtZmlsZSB3aGVuIG9jY3VycmluZworICAgICAgIGluIHRoZSBmaWxlJ3MgbGFzdCBibG9jay4gIEl0IGlzIG9ubHkgbmVlZGVkIGZvciB2YXJpYWJsZS1sZW5ndGgKKyAgICAgICByZWNvcmQgZmlsZXMgdHJhbnNmZXJyZWQgdG8gVk1TIGFzIGZpeGVkLWxlbmd0aCByZWNvcmQgZmlsZXMKKyAgICAgICAodHlwaWNhbCBmb3IgYmluYXJ5IEZUUDsgTkZTIHNob3VsZG4ndCBuZWVkIGl0LCBidXQgaXQgd29uJ3QgaHVydCkuICAqLworICAgIG1kX251bWJlcl90b19jaGFycyAoUmVjTGVuLCBtaW51c19vbmUsIDIpOworICAgIHdyaXRlIChWTVNfT2JqZWN0X0ZpbGVfRkQsIFJlY0xlbiwgMik7CisgIH0KKyNlbHNlCisgICAgLyogV2hlbiB3cml0dGVuIG9uIGEgVk1TIHN5c3RlbSwgdGhlIGZpbGUgaGVhZGVyIChjZiBpbm9kZSkgd2lsbCByZWNvcmQKKyAgICAgICB0aGUgYWN0dWFsIGVuZC1vZi1maWxlIHBvc2l0aW9uIGFuZCBubyBpbmxpbmUgbWFya2VyIGlzIG5lZWRlZC4gICovCisjZW5kaWYKKworICBjbG9zZSAoVk1TX09iamVjdF9GaWxlX0ZEKTsKK30KKwwKKworIC8qKioqKiogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiByb3V0aW5lcyAqKioqKiovCisKKworLyogU3RhY2sgUHNlY3QgYmFzZSBmb2xsb3dlZCBieSBzaWduZWQsIHZhcnlpbmctc2l6ZWQgb2Zmc2V0LgorICAgQ29tbW9uIHRvIHNldmVyYWwgb2JqZWN0IHJlY29yZHMuICAqLworCitzdGF0aWMgdm9pZAordm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgRm9yY2UpCisgICAgIGludCBQc2VjdF9JbmRleDsKKyAgICAgaW50IE9mZnNldDsKKyAgICAgaW50IEZvcmNlOworeworICBpbnQgcHNlY3Rfd2lkdGgsIG9mZnNldF93aWR0aDsKKworICBwc2VjdF93aWR0aCA9ICgodW5zaWduZWQpIFBzZWN0X0luZGV4ID4gMjU1KSA/IDIgOiAxOworICBvZmZzZXRfd2lkdGggPSAoRm9yY2UgfHwgT2Zmc2V0ID4gMzI3NjcgfHwgT2Zmc2V0IDwgLTMyNzY4KSA/IDQKKwkJIDogKE9mZnNldCA+IDEyNyB8fCBPZmZzZXQgPCAtMTI4KSA/IDIgOiAxOworI2RlZmluZSBTdGFfUChwLG8pICgoKG8pPDwxKSB8ICgocCktMSkpCisgIC8qIGJ5dGUgb3Igd29yZCBwc2VjdDsgYnl0ZSwgd29yZCwgb3IgbG9uZ3dvcmQgb2Zmc2V0ICovCisgIHN3aXRjaCAoU3RhX1AocHNlY3Rfd2lkdGgsb2Zmc2V0X3dpZHRoKSkKKyAgICB7CisgICAgICBjYXNlIFN0YV9QKDEsMSk6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9QQik7CisJCQlQVVRfQ0hBUiAoKGNoYXIpKHVuc2lnbmVkIGNoYXIpIFBzZWN0X0luZGV4KTsKKwkJCVBVVF9DSEFSICgoY2hhcikgT2Zmc2V0KTsKKwkJCWJyZWFrOworICAgICAgY2FzZSBTdGFfUCgxLDIpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfUFcpOworCQkJUFVUX0NIQVIgKChjaGFyKSh1bnNpZ25lZCBjaGFyKSBQc2VjdF9JbmRleCk7CisJCQlQVVRfU0hPUlQgKE9mZnNldCk7CisJCQlicmVhazsKKyAgICAgIGNhc2UgU3RhX1AoMSw0KToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1BMKTsKKwkJCVBVVF9DSEFSICgoY2hhcikodW5zaWduZWQgY2hhcikgUHNlY3RfSW5kZXgpOworCQkJUFVUX0xPTkcgKE9mZnNldCk7CisJCQlicmVhazsKKyAgICAgIGNhc2UgU3RhX1AoMiwxKToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1dQQik7CisJCQlQVVRfU0hPUlQgKFBzZWN0X0luZGV4KTsKKwkJCVBVVF9DSEFSICgoY2hhcikgT2Zmc2V0KTsKKwkJCWJyZWFrOworICAgICAgY2FzZSBTdGFfUCgyLDIpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BXKTsKKwkJCVBVVF9TSE9SVCAoUHNlY3RfSW5kZXgpOworCQkJUFVUX1NIT1JUIChPZmZzZXQpOworCQkJYnJlYWs7CisgICAgICBjYXNlIFN0YV9QKDIsNCk6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9XUEwpOworCQkJUFVUX1NIT1JUIChQc2VjdF9JbmRleCk7CisJCQlQVVRfTE9ORyAoT2Zmc2V0KTsKKwkJCWJyZWFrOworICAgIH0KKyN1bmRlZiBTdGFfUAorfQorCisKKy8qIFN0b3JlIGltbWVkaWF0ZSBkYXRhIGluIGN1cnJlbnQgUHNlY3QuICAqLworCitzdGF0aWMgdm9pZAorVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChQb2ludGVyLCBTaXplLCBSZWNvcmRfVHlwZSkKKyAgICAgY29uc3QgY2hhciAqUG9pbnRlcjsKKyAgICAgaW50IFNpemU7CisgICAgIGludCBSZWNvcmRfVHlwZTsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKFJlY29yZF9UeXBlKTsKKyAgLyogV2UgY2FuIG9ubHkgc3RvcmUgYXMgbW9zdCAxMjggYnl0ZXMgYXQgYSB0aW1lIGR1ZSB0byB0aGUgd2F5IHRoYXQKKyAgICAgVElSIGNvbW1hbmRzIGFyZSBlbmNvZGVkLiAgKi8KKyAgd2hpbGUgKFNpemUgPiAwKQorICAgIHsKKyAgICAgIGkgPSAoU2l6ZSA+IDEyOCkgPyAxMjggOiBTaXplOworICAgICAgU2l6ZSAtPSBpOworICAgICAgLyogSWYgd2UgY2Fubm90IGFjY29tbW9kYXRlIHRoaXMgcmVjb3JkLCBmbHVzaCB0aGUgYnVmZmVyLiAgKi8KKyAgICAgIGlmICgoT2JqZWN0X1JlY29yZF9PZmZzZXQgKyBpICsgMSkgPj0gc2l6ZW9mIE9iamVjdF9SZWNvcmRfQnVmZmVyKQorCUZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKKyAgICAgIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUuICAqLworICAgICAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisJUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKKyAgICAgIC8qIFN0b3JlIHRoZSBjb3VudC4gIFRoZSBTdG9yZSBJbW1lZGlhdGUgVElSIGNvbW1hbmQgaXMgaW1wbGllZCBieQorICAgICAgICAgYSBuZWdhdGl2ZSBjb21tYW5kIGJ5dGUsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbW1lZGlhdGUgZGF0YQorICAgICAgICAgaXMgYWJzKGNvbW1hbmRfYnl0ZSkuICBTbywgd2Ugd3JpdGUgdGhlIG5lZ2F0ZWQgbGVuZ3RoIHZhbHVlLiAgKi8KKyAgICAgIFBVVF9DSEFSICgoY2hhcikgKC1pICYgMHhmZikpOworICAgICAgLyogTm93IHN0b3JlIHRoZSBkYXRhLiAgKi8KKyAgICAgIHdoaWxlICgtLWkgPj0gMCkKKwlQVVRfQ0hBUiAoKlBvaW50ZXIrKyk7CisgICAgfQorICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKKyAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Cit9CisKKworLyogTWFrZSBhIGRhdGEgcmVmZXJlbmNlLiAgKi8KKworc3RhdGljIHZvaWQKK1ZNU19TZXRfRGF0YSAoUHNlY3RfSW5kZXgsIE9mZnNldCwgUmVjb3JkX1R5cGUsIEZvcmNlKQorICAgICBpbnQgUHNlY3RfSW5kZXg7CisgICAgIGludCBPZmZzZXQ7CisgICAgIGludCBSZWNvcmRfVHlwZTsKKyAgICAgaW50IEZvcmNlOworeworICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOworICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZS4gICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQorICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7CisgIC8qIFN0YWNrIHRoZSBQc2VjdCBiYXNlIHdpdGggaXRzIG9mZnNldC4gICovCisgIHZtc190aXJfc3RhY2tfcHNlY3QgKFBzZWN0X0luZGV4LCBPZmZzZXQsIEZvcmNlKTsKKyAgLyogU2V0IHJlbG9jYXRpb24gYmFzZS4gICovCisgIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKKyAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCisgICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOworfQorCisKKy8qIE1ha2UgYSBkZWJ1Z2dlciByZWZlcmVuY2UgdG8gYSBzdHJ1Y3QsIHVuaW9uIG9yIGVudW0uICAqLworCitzdGF0aWMgdm9pZAorVk1TX1N0b3JlX1N0cnVjdCAoU3RydWN0X0luZGV4KQorICAgICBpbnQgU3RydWN0X0luZGV4OworeworICAvKiBXZSBhcmUgd3JpdGluZyBhIGRlYnVnIHJlY29yZC4gICovCisgIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0RCRyk7CisgIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisgICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKKyAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKKyAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOworICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU1RLREwpOworICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fTCk7CisgIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQorICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKK30KKworCisvKiBNYWtlIGEgZGVidWdnZXIgcmVmZXJlbmNlIHRvIHBhcnRpYWxseSBkZWZpbmUgYSBzdHJ1Y3QsIHVuaW9uIG9yIGVudW0uICAqLworCitzdGF0aWMgdm9pZAorVk1TX0RlZl9TdHJ1Y3QgKFN0cnVjdF9JbmRleCkKKyAgICAgaW50IFN0cnVjdF9JbmRleDsKK3sKKyAgLyogV2UgYXJlIHdyaXRpbmcgYSBkZWJ1ZyByZWNvcmQuICAqLworICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19EQkcpOworICAvKiBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZS4gICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQorICAgIFBVVF9DSEFSIChPQkpfU19DX0RCRyk7CisgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9VVyk7CisgIFBVVF9TSE9SVCAoU3RydWN0X0luZGV4KTsKKyAgUFVUX0NIQVIgKFRJUl9TX0NfQ1RMX0RGTE9DKTsKKyAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCisgICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOworfQorCitzdGF0aWMgdm9pZAorVk1TX1NldF9TdHJ1Y3QgKFN0cnVjdF9JbmRleCkKKyAgICAgaW50IFN0cnVjdF9JbmRleDsKK3sJCQkJLyogc2VlIHByZXZpb3VzIGZ1bmN0aW9ucyBmb3IgY29tbWVudHMgKi8KKyAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfREJHKTsKKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisgICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKKyAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKKyAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOworICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU1RMT0MpOworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCisgICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOworfQorDAorCisgLyoqKioqKiBUcmFjZWJhY2sgSW5mb3JtYXRpb24gcm91dGluZXMgKioqKioqLworCisKKy8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgTW9kdWxlIEJlZ2luIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfVEJUX01vZHVsZV9CZWdpbiAoKQoreworICByZWdpc3RlciBjaGFyICpjcCwgKmNwMTsKKyAgaW50IFNpemU7CisgIGNoYXIgTG9jYWxbMjU2XTsKKworICAvKiBBcnJhbmdlIHRvIHN0b3JlIHRoZSBkYXRhIGxvY2FsbHkgKGxlYXZlIHJvb20gZm9yIHNpemUgYnl0ZSkuICAqLworICBjcCA9ICZMb2NhbFsxXTsKKyAgLyogQmVnaW4gbW9kdWxlLiAgKi8KKyAgKmNwKysgPSBEU1RfU19DX01PREJFRzsKKyAgKmNwKysgPSAwOwkJLyogZmxhZ3M7IG5vdCB1c2VkICovCisgIC8qCisgICAqCUxhbmd1YWdlIHR5cGUgPT0gIkMiCisgICAqCisgICAqIChGSVhNRTogIHRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBpbnB1dC4uLikKKyAgICovCisgIENPUFlfTE9ORyAoY3AsIERTVF9TX0NfQyk7CisgIGNwICs9IDQ7CisgIC8qIFN0b3JlIHRoZSBtb2R1bGUgbmFtZS4gICovCisgICpjcCsrID0gKGNoYXIpIHN0cmxlbiAoTW9kdWxlX05hbWUpOworICBjcDEgPSBNb2R1bGVfTmFtZTsKKyAgd2hpbGUgKCpjcDEpCisgICAgKmNwKysgPSAqY3AxKys7CisgIC8qIE5vdyB3ZSBjYW4gc3RvcmUgdGhlIHJlY29yZCBzaXplLiAgKi8KKyAgU2l6ZSA9IChjcCAtIExvY2FsKTsKKyAgTG9jYWxbMF0gPSBTaXplIC0gMTsKKyAgLyogUHV0IGl0IGludG8gdGhlIG9iamVjdCByZWNvcmQuICAqLworICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBTaXplLCBPQkpfU19DX1RCVCk7Cit9CisKKworLyogV3JpdGUgdGhlIFRyYWNlYmFjayBNb2R1bGUgRW5kIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfVEJUX01vZHVsZV9FbmQgKCkKK3sKKyAgY2hhciBMb2NhbFsyXTsKKworICAvKiBFbmQgbW9kdWxlLiAgKi8KKyAgTG9jYWxbMF0gPSAxOworICBMb2NhbFsxXSA9IERTVF9TX0NfTU9ERU5EOworICAvKiBQdXQgaXQgaW50byB0aGUgb2JqZWN0IHJlY29yZC4gICovCisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDIsIE9CSl9TX0NfVEJUKTsKK30KKworCisvKiBXcml0ZSBhIFRyYWNlYmFjayBSb3V0aW5lIEJlZ2luIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfVEJUX1JvdXRpbmVfQmVnaW4gKHN5bWJvbFAsIFBzZWN0KQorICAgICBzeW1ib2xTICpzeW1ib2xQOworICAgICBpbnQgUHNlY3Q7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKmNwLCAqY3AxOworICBjaGFyICpOYW1lOworICBpbnQgT2Zmc2V0OworICBpbnQgU2l6ZTsKKyAgY2hhciBMb2NhbFs1MTJdOworCisgIC8qIFN0cmlwIHRoZSBsZWFkaW5nICJfIiBmcm9tIHRoZSBuYW1lLiAgKi8KKyAgTmFtZSA9IFNfR0VUX05BTUUgKHN5bWJvbFApOworICBpZiAoKk5hbWUgPT0gJ18nKQorICAgIE5hbWUrKzsKKyAgLyogR2V0IHRoZSB0ZXh0IHBzZWN0IG9mZnNldC4gICovCisgIE9mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKKyAgLyogU2V0IHRoZSByZWNvcmQgc2l6ZS4gICovCisgIFNpemUgPSAxICsgMSArIDQgKyAxICsgc3RybGVuIChOYW1lKTsKKyAgTG9jYWxbMF0gPSBTaXplOworICAvKiBEU1QgdHlwZSAicm91dGluZSBiZWdpbiIuICAqLworICBMb2NhbFsxXSA9IERTVF9TX0NfUlROQkVHOworICAvKiBVc2VzIENhbGxTL0NhbGxHLiAgKi8KKyAgTG9jYWxbMl0gPSAwOworICAvKiBTdG9yZSB0aGUgZGF0YSBzbyBmYXIuICAqLworICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCAzLCBPQkpfU19DX1RCVCk7CisgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhIE9CSl9TX0NfVEJUIHJlY29yZC4gICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQorICAgIFBVVF9DSEFSIChPQkpfU19DX1RCVCk7CisgIC8qIFN0YWNrIHRoZSBhZGRyZXNzLiAgKi8KKyAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3QsIE9mZnNldCwgMCk7CisgIC8qIFN0b3JlIHRoZSBkYXRhIHJlZmVyZW5jZS4gICovCisgIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKKyAgLyogU3RvcmUgdGhlIGNvdW50ZWQgc3RyaW5nIGFzIGRhdGEuICAqLworICBjcCA9IExvY2FsOworICBjcDEgPSBOYW1lOworICBTaXplID0gc3RybGVuIChjcDEpICsgMTsKKyAgKmNwKysgPSBTaXplIC0gMTsKKyAgd2hpbGUgKCpjcDEpCisgICAgKmNwKysgPSAqY3AxKys7CisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfVEJUKTsKK30KKworCisvKiBXcml0ZSBhIFRyYWNlYmFjayBSb3V0aW5lIEVuZCByZWNvcmQuCisKKyAgIFdlICptdXN0KiBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSB0byBmaW5kIHRoZSBuZXh0IHJvdXRpbmUsIHNpbmNlIHRoZQorICAgYXNzZW1iZXIgaGFzIGEgd2F5IG9mIHJlYXNzZW1ibGluZyB0aGUgc3ltYm9sIHRhYmxlIE9VVCBPRiBPUkRFUiBUaHVzCisgICB0aGUgbmV4dCByb3V0aW5lIGluIHRoZSBzeW1ib2wgbGlzdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIG5leHQgb25lIGluCisgICBtZW1vcnkuICBGb3IgZGVidWdnaW5nIHRvIHdvcmsgY29ycmVjdGx5IHdlIG11c3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUKKyAgIHJvdXRpbmUuICAqLworCitzdGF0aWMgdm9pZAorVk1TX1RCVF9Sb3V0aW5lX0VuZCAoTWF4X1NpemUsIHNwKQorICAgICBpbnQgTWF4X1NpemU7CisgICAgIHN5bWJvbFMgKnNwOworeworICBzeW1ib2xTICpzeW1ib2xQOworICBpbnQgU2l6ZSA9IDB4N2ZmZmZmZmY7CisgIGNoYXIgTG9jYWxbMTZdOworICB2YWx1ZVQgc3ltX3ZhbHVlLCBzcF92YWx1ZSA9IFNfR0VUX1ZBTFVFIChzcCk7CisKKyAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgU19HRVRfVFlQRSAoc3ltYm9sUCkgPT0gTl9URVhUKQorCXsKKwkgIGlmICgqU19HRVRfTkFNRSAoc3ltYm9sUCkgPT0gJ0wnKQorCSAgICBjb250aW51ZTsKKwkgIHN5bV92YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKKwkgIGlmIChzeW1fdmFsdWUgPiBzcF92YWx1ZSAmJiBzeW1fdmFsdWUgPCBTaXplKQorCSAgICBTaXplID0gc3ltX3ZhbHVlOworCisJICAvKgorCSAgICogRHVtbXkgbGFiZWxzIGxpa2UgImdjY19jb21waWxlZC4iIHNob3VsZCBubyBsb25nZXIgcmVhY2ggaGVyZS4KKwkgICAqLworI2lmIDAKKwkgIGVsc2UKKwkgIC8qIGNoZWNrIGlmIGdjY19jb21waWxlZC4gaGFzIHNpemUgb2YgemVybyAqLworCSAgaWYgKHN5bV92YWx1ZSA9PSBzcF92YWx1ZSAmJgorCSAgICAgIHNwICE9IHN5bWJvbFAgJiYKKwkgICAgICAoIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ApLCAiZ2NjX2NvbXBpbGVkLiIpIHx8CisJICAgICAgICFzdHJjbXAgKFNfR0VUX05BTUUgKHNwKSwgImdjYzJfY29tcGlsZWQuIikpKQorCSAgICBTaXplID0gc3ltX3ZhbHVlOworI2VuZGlmCisJfQorICAgIH0KKyAgaWYgKFNpemUgPT0gMHg3ZmZmZmZmZikKKyAgICBTaXplID0gTWF4X1NpemU7CisgIFNpemUgLT0gc3BfdmFsdWU7CQkvKiBhbmQgZ2V0IHRoZSBzaXplIG9mIHRoZSByb3V0aW5lICovCisgIC8qIFJlY29yZCBTaXplLiAgKi8KKyAgTG9jYWxbMF0gPSA2OworICAvKiBEU1QgdHlwZSBpcyAicm91dGluZSBlbmQiLiAgKi8KKyAgTG9jYWxbMV0gPSBEU1RfU19DX1JUTkVORDsKKyAgTG9jYWxbMl0gPSAwOwkJLyogdW51c2VkICovCisgIC8qIFNpemUgb2Ygcm91dGluZS4gICovCisgIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBTaXplKTsKKyAgLyogU3RvcmUgdGhlIHJlY29yZC4gICovCisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDcsIE9CSl9TX0NfVEJUKTsKK30KKworCisvKiBXcml0ZSBhIFRyYWNlYmFjayBCbG9jayBCZWdpbiByZWNvcmQuICAqLworCitzdGF0aWMgdm9pZAorVk1TX1RCVF9CbG9ja19CZWdpbiAoc3ltYm9sUCwgUHNlY3QsIE5hbWUpCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7CisgICAgIGludCBQc2VjdDsKKyAgICAgY2hhciAqTmFtZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqY3AsICpjcDE7CisgIGludCBPZmZzZXQ7CisgIGludCBTaXplOworICBjaGFyIExvY2FsWzUxMl07CisKKyAgLyogU2V0IHRoZSByZWNvcmQgc2l6ZS4gICovCisgIFNpemUgPSAxICsgMSArIDQgKyAxICsgc3RybGVuIChOYW1lKTsKKyAgTG9jYWxbMF0gPSBTaXplOworICAvKiBEU1QgdHlwZSBpcyAiYmVnaW4gYmxvY2siOyB3ZSBzaW11bGF0ZSB3aXRoIGEgcGhvbnkgcm91dGluZS4gICovCisgIExvY2FsWzFdID0gRFNUX1NfQ19CTEtCRUc7CisgIC8qIFVzZXMgQ2FsbFMvQ2FsbEcuICAqLworICBMb2NhbFsyXSA9IDA7CisgIC8qIFN0b3JlIHRoZSBkYXRhIHNvIGZhci4gICovCisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfREJHKTsKKyAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgZGVidWcgcmVjb3JkLiAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisgICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKKyAgLyogTm93IGdldCB0aGUgc3ltYm9sIGFkZHJlc3MuICAqLworICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BMKTsKKyAgUFVUX1NIT1JUIChQc2VjdCk7CisgIC8qIEdldCB0aGUgdGV4dCBwc2VjdCBvZmZzZXQuICAqLworICBPZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7CisgIFBVVF9MT05HIChPZmZzZXQpOworICAvKiBTdG9yZSB0aGUgZGF0YSByZWZlcmVuY2UuICAqLworICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fUElEUik7CisgIC8qIFN0b3JlIHRoZSBjb3VudGVkIHN0cmluZyBhcyBkYXRhLiAgKi8KKyAgY3AgPSBMb2NhbDsKKyAgY3AxID0gTmFtZTsKKyAgU2l6ZSA9IHN0cmxlbiAoY3AxKSArIDE7CisgICpjcCsrID0gU2l6ZSAtIDE7CisgIHdoaWxlICgqY3AxKQorICAgICpjcCsrID0gKmNwMSsrOworICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBTaXplLCBPQkpfU19DX0RCRyk7Cit9CisKKworLyogV3JpdGUgYSBUcmFjZWJhY2sgQmxvY2sgRW5kIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfVEJUX0Jsb2NrX0VuZCAoU2l6ZSkKKyAgICAgdmFsdWVUIFNpemU7Cit7CisgIGNoYXIgTG9jYWxbMTZdOworCisgIExvY2FsWzBdID0gNjsJCS8qIHJlY29yZCBsZW5ndGggKi8KKyAgLyogRFNUIHR5cGUgaXMgImJsb2NrIGVuZCI7IHNpbXVsYXRlIHdpdGggYSBwaG9ueSBlbmQgcm91dGluZS4gICovCisgIExvY2FsWzFdID0gRFNUX1NfQ19CTEtFTkQ7CisgIExvY2FsWzJdID0gMDsJCS8qIHVudXNlZCwgbXVzdCBiZSB6ZXJvICovCisgIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBTaXplKTsKKyAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19EQkcpOworfQorDAorCisvKiBXcml0ZSBhIExpbmUgbnVtYmVyIDwtPiBQcm9ncmFtIENvdW50ZXIgY29ycmVsYXRpb24gcmVjb3JkLiAgKi8KKworc3RhdGljIHZvaWQKK1ZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoTGluZV9OdW1iZXIsIE9mZnNldCwgUHNlY3QsIERvX0RlbHRhKQorICAgICBpbnQgTGluZV9OdW1iZXI7CisgICAgIGludCBPZmZzZXQ7CisgICAgIGludCBQc2VjdDsKKyAgICAgaW50IERvX0RlbHRhOworeworICByZWdpc3RlciBjaGFyICpjcDsKKyAgY2hhciBMb2NhbFs2NF07CisKKyAgaWYgKERvX0RlbHRhID09IDApCisgICAgeworICAgICAgLyoKKyAgICAgICAqICBJZiBub3QgZGVsdGEsIHNldCBvdXIgUEMvTGluZSBudW1iZXIgY29ycmVsYXRpb24uCisgICAgICAgKi8KKyAgICAgIGNwID0gJkxvY2FsWzFdOwkvKiBQdXQgc2l6ZSBpbiBMb2NhbFswXSBsYXRlci4gICovCisgICAgICAvKiBEU1QgdHlwZSBpcyAiTGluZSBOdW1iZXIvUEMgY29ycmVsYXRpb24iLiAgKi8KKyAgICAgICpjcCsrID0gRFNUX1NfQ19MSU5FX05VTTsKKyAgICAgIC8qIFNldCBMaW5lIG51bWJlci4gICovCisgICAgICBpZiAoTGluZV9OdW1iZXIgLSAxIDw9IDI1NSkKKwl7CisJICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTlVNX0I7CisJICAqY3ArKyA9IChjaGFyKSAoTGluZV9OdW1iZXIgLSAxKTsKKwl9CisgICAgICBlbHNlIGlmIChMaW5lX051bWJlciAtIDEgPD0gNjU1MzUpCisJeworCSAgKmNwKysgPSBEU1RfU19DX1NFVF9MSU5FX05VTTsKKwkgIENPUFlfU0hPUlQgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgKmNwKysgPSBEU1RfU19DX1NFVF9MSU5VTV9MOworCSAgQ09QWV9MT05HIChjcCwgTGluZV9OdW1iZXIgLSAxKSwgIGNwICs9IDQ7CisJfQorICAgICAgLyogU2V0IFBDLiAgKi8KKyAgICAgICpjcCsrID0gRFNUX1NfQ19TRVRfQUJTX1BDOworICAgICAgLyogU3RvcmUgc2l6ZSBub3cgdGhhdCB3ZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCisgICAgICBMb2NhbFswXSA9IGNwIC0gJkxvY2FsWzFdOworCS8qIEFjY291bnQgZm9yIHRoZSBzcGFjZSB0aGF0IFRJUl9TX0NfU1RPX1BJRFIgd2lsbCB1c2UgZm9yIHRoZSBQQy4gICovCisJTG9jYWxbMF0gKz0gNDsJCS8qIHNpemUgaW5jbHVkZXMgbGVuZ3RoIG9mIGFub3RoZXIgbG9uZ3dvcmQgKi8KKyAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGNwIC0gTG9jYWwsIE9CSl9TX0NfVEJUKTsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhIE9CSl9TX0NfVEJUIHJlY29yZC4gICovCisgICAgICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKKwlQVVRfQ0hBUiAoT0JKX1NfQ19UQlQpOworICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3QsIE9mZnNldCwgMCk7CisgICAgICBQVVRfQ0hBUiAoVElSX1NfQ19TVE9fUElEUik7CisgICAgICAvKiBEbyBhIFBDIG9mZnNldCBvZiAwIHRvIHJlZ2lzdGVyIHRoZSBsaW5lIG51bWJlci4gICovCisgICAgICBMb2NhbFswXSA9IDI7CisgICAgICBMb2NhbFsxXSA9IERTVF9TX0NfTElORV9OVU07CisgICAgICBMb2NhbFsyXSA9IDA7CQkvKiBJbmNyZW1lbnQgUEMgYnkgMCBhbmQgcmVnaXN0ZXIgbGluZSAjICovCisgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCAzLCBPQkpfU19DX1RCVCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKERvX0RlbHRhIDwgMCkKKwl7CisJICAvKgorCSAgICogIFdoZW4gZGVsdGEgaXMgbmVnYXRpdmUsIHRlcm1pbmF0ZSB0aGUgbGluZSBudW1iZXJzLgorCSAgICovCisJICBMb2NhbFswXSA9IDEgKyAxICsgNDsKKwkgIExvY2FsWzFdID0gRFNUX1NfQ19MSU5FX05VTTsKKwkgIExvY2FsWzJdID0gRFNUX1NfQ19URVJNX0w7CisJICBDT1BZX0xPTkcgKCZMb2NhbFszXSwgT2Zmc2V0KTsKKwkgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDcsIE9CSl9TX0NfVEJUKTsKKwkgIHJldHVybjsKKwl9CisgICAgICAvKgorICAgICAgICogIERvIGEgUEMvTGluZSBkZWx0YS4KKyAgICAgICAqLworICAgICAgY3AgPSAmTG9jYWxbMV07CisgICAgICAqY3ArKyA9IERTVF9TX0NfTElORV9OVU07CisgICAgICBpZiAoTGluZV9OdW1iZXIgPiAxKQorCXsKKwkgIC8qIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBsaW5lIG51bWJlci4gICovCisJICBpZiAoTGluZV9OdW1iZXIgLSAxIDw9IDI1NSkKKwkgICAgeworCSAgICAgICpjcCsrID0gRFNUX1NfQ19JTkNSX0xJTlVNOworCSAgICAgICpjcCsrID0gTGluZV9OdW1iZXIgLSAxOworCSAgICB9CisJICBlbHNlIGlmIChMaW5lX051bWJlciAtIDEgPD0gNjU1MzUpCisJICAgIHsKKwkgICAgICAqY3ArKyA9IERTVF9TX0NfSU5DUl9MSU5VTV9XOworCSAgICAgIENPUFlfU0hPUlQgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKmNwKysgPSBEU1RfU19DX0lOQ1JfTElOVU1fTDsKKwkgICAgICBDT1BZX0xPTkcgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gNDsKKwkgICAgfQorCX0KKyAgICAgIC8qCisgICAgICAgKglJbmNyZW1lbnQgdGhlIFBDCisgICAgICAgKi8KKyAgICAgIGlmIChPZmZzZXQgPD0gMTI4KQorCXsKKwkgIC8qIFNtYWxsIG9mZnNldHMgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgbnVtYmVycywgcmF0aGVyIHRoYW4gdGhlCisJICAgICB1c3VhbCBub24tbmVnYXRpdmUgdHlwZSBjb2RlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGF0YSBmaWVsZC4gICovCisJICAqY3ArKyA9IChjaGFyKSAtT2Zmc2V0OworCX0KKyAgICAgIGVsc2UgaWYgKE9mZnNldCA8PSA2NTUzNSkKKwl7CisJICAqY3ArKyA9IERTVF9TX0NfREVMVEFfUENfVzsKKwkgIENPUFlfU0hPUlQgKGNwLCBPZmZzZXQpLCAgY3AgKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgKmNwKysgPSBEU1RfU19DX0RFTFRBX1BDX0w7CisJICBDT1BZX0xPTkcgKGNwLCBPZmZzZXQpLCAgY3AgKz0gNDsKKwl9CisgICAgICAvKiBTZXQgc2l6ZSBub3cgdGhhdCBiZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCisgICAgICBMb2NhbFswXSA9IGNwIC0gJkxvY2FsWzFdOworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOworICAgIH0KK30KKwwKKworLyogRGVzY3JpYmUgYSBzb3VyY2UgZmlsZSB0byB0aGUgZGVidWdnZXIuICAqLworCitzdGF0aWMgaW50CitWTVNfVEJUX1NvdXJjZV9GaWxlIChGaWxlbmFtZSwgSURfTnVtYmVyKQorICAgICBjaGFyICpGaWxlbmFtZTsKKyAgICAgaW50IElEX051bWJlcjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqY3A7CisgIGludCBsZW4sIHJmbywgZmZiLCBlYms7CisgIGNoYXIgY2R0WzhdOworICBjaGFyIExvY2FsWzUxMl07CisjaWZkZWYgVk1TCQkJLyogVXNlZCBmb3IgbmF0aXZlIGFzc2VtYmx5ICovCisgIHVuc2lnbmVkIFN0YXR1czsKKyAgc3RydWN0IEZBQiBmYWI7CQkJLyogUk1TIGZpbGUgYWNjZXNzIGJsb2NrICovCisgIHN0cnVjdCBOQU0gbmFtOwkJCS8qIGZpbGUgbmFtZSBpbmZvcm1hdGlvbiAqLworICBzdHJ1Y3QgWEFCREFUIHhhYmRhdDsJCQkvKiBkYXRlK3RpbWUgZmllbGRzICovCisgIHN0cnVjdCBYQUJGSEMgeGFiZmhjOwkJCS8qIGZpbGUgaGVhZGVyIGNoYXJhY3RlcmlzdGljcyAqLworICBjaGFyIHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyWzI1NSArIDFdOworCisgIC8qCisgICAqCVNldCB1cCBSTVMgc3RydWN0dXJlczoKKyAgICovCisgIC8qIEZBQiAtLSBmaWxlIGFjY2VzcyBibG9jayAqLworICBtZW1zZXQgKChjaGFyICopICZmYWIsIDAsIHNpemVvZiBmYWIpOworICBmYWIuZmFiJGJfYmlkID0gRkFCJENfQklEOworICBmYWIuZmFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiBmYWI7CisgIGZhYi5mYWIkbF9mbmEgPSBGaWxlbmFtZTsKKyAgZmFiLmZhYiRiX2ZucyA9ICh1bnNpZ25lZCBjaGFyKSBzdHJsZW4gKEZpbGVuYW1lKTsKKyAgZmFiLmZhYiRsX25hbSA9IChjaGFyICopICZuYW07CisgIGZhYi5mYWIkbF94YWIgPSAoY2hhciAqKSAmeGFiZGF0OworICAvKiBOQU0gLS0gZmlsZSBuYW1lIGJsb2NrICovCisgIG1lbXNldCAoKGNoYXIgKikgJm5hbSwgMCwgc2l6ZW9mIG5hbSk7CisgIG5hbS5uYW0kYl9iaWQgPSBOQU0kQ19CSUQ7CisgIG5hbS5uYW0kYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIG5hbTsKKyAgbmFtLm5hbSRsX3JzYSA9IHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyOworICBuYW0ubmFtJGJfcnNzID0gKHVuc2lnbmVkIGNoYXIpIChzaXplb2YgcmVzdWx0YW50X3N0cmluZ19idWZmZXIgLSAxKTsKKyAgLyogWEFCcyAtLSBleHRlbmRlZCBhdHRyaWJ1dGVzIGJsb2NrcyAqLworICBtZW1zZXQgKChjaGFyICopICZ4YWJkYXQsIDAsIHNpemVvZiB4YWJkYXQpOworICB4YWJkYXQueGFiJGJfY29kID0gWEFCJENfREFUOworICB4YWJkYXQueGFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiB4YWJkYXQ7CisgIHhhYmRhdC54YWIkbF9ueHQgPSAoY2hhciAqKSAmeGFiZmhjOworICBtZW1zZXQgKChjaGFyICopICZ4YWJmaGMsIDAsIHNpemVvZiB4YWJmaGMpOworICB4YWJmaGMueGFiJGJfY29kID0gWEFCJENfRkhDOworICB4YWJmaGMueGFiJGJfYmxuID0gKHVuc2lnbmVkIGNoYXIpIHNpemVvZiB4YWJmaGM7CisgIHhhYmZoYy54YWIkbF9ueHQgPSAwOworICAvKgorICAgKglHZXQgdGhlIGZpbGUgaW5mb3JtYXRpb24KKyAgICovCisgIFN0YXR1cyA9IHN5cyRvcGVuICgmZmFiKTsKKyAgaWYgKCEoU3RhdHVzICYgMSkpCisgICAgeworICAgICAgYXNfdHNrdHNrIChfKCJDb3VsZG4ndCBmaW5kIHNvdXJjZSBmaWxlIFwiJXNcIiwgc3RhdHVzPSUlWCV4IiksCisJCSBGaWxlbmFtZSwgU3RhdHVzKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgc3lzJGNsb3NlICgmZmFiKTsKKyAgLyogTm93IGV4dHJhY3QgZmllbGRzIG9mIGludGVyZXN0LiAgKi8KKyAgbWVtY3B5IChjZHQsIChjaGFyICopICZ4YWJkYXQueGFiJHFfY2R0LCA4KTsJLyogY3JlYXRpb24gZGF0ZSAqLworICBlYmsgPSB4YWJmaGMueGFiJGxfZWJrOwkJLyogZW5kLW9mLWZpbGUgYmxvY2sgKi8KKyAgZmZiID0geGFiZmhjLnhhYiR3X2ZmYjsJCS8qIGZpcnN0IGZyZWUgYnl0ZSBvZiBsYXN0IGJsb2NrICovCisgIHJmbyA9IHhhYmZoYy54YWIkYl9yZm87CQkvKiByZWNvcmQgZm9ybWF0ICovCisgIGxlbiA9IG5hbS5uYW0kYl9yc2w7CQkJLyogbGVuZ3RoIG9mIEZpbGVuYW1lICovCisgIHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyW2xlbl0gPSAnXDAnOworICBGaWxlbmFtZSA9IHJlc3VsdGFudF9zdHJpbmdfYnVmZmVyOwkvKiBmdWxsIGZpbGVuYW1lICovCisjZWxzZQkJCQkvKiBDcm9zcy1hc3NlbWJseSAqLworICAvKiBbUGVyaGFwcyB3ZSBvdWdodCB0byB1c2UgYWN0dWFsIHZhbHVlcyBkZXJpdmVkIGZyb20gc3RhdCgpIGhlcmU/XSAgKi8KKyAgbWVtc2V0IChjZHQsIDAsIDgpOwkJCS8qIG51bGwgVk1TIHF1YWR3b3JkIGJpbmFyeSB0aW1lICovCisgIGViayA9IGZmYiA9IHJmbyA9IDA7CisgIGxlbiA9IHN0cmxlbiAoRmlsZW5hbWUpOworICBpZiAobGVuID4gMjU1KQkvKiBhIHNpbmdsZSBieXRlIGlzIHVzZWQgYXMgY291bnQgcHJlZml4ICovCisgICAgeworICAgICAgRmlsZW5hbWUgKz0gKGxlbiAtIDI1NSk7CQkvKiB0YWlsIGVuZCBpcyBtb3JlIHNpZ25pZmljYW50ICovCisgICAgICBsZW4gPSAyNTU7CisgICAgfQorI2VuZGlmIC8qIFZNUyAqLworCisgIGNwID0gJkxvY2FsWzFdOwkJCS8qIGZpbGwgaW4gcmVjb3JkIGxlbmd0aCBsYXRlciAqLworICAqY3ArKyA9IERTVF9TX0NfU09VUkNFOwkJLyogRFNUIHR5cGUgaXMgInNvdXJjZSBmaWxlIiAqLworICAqY3ArKyA9IERTVF9TX0NfU1JDX0ZPUk1GRUVEOwkJLyogZm9ybWZlZWRzIGNvdW50IGFzIHNvdXJjZSByZWNvcmRzICovCisgICpjcCsrID0gRFNUX1NfQ19TUkNfREVDTEZJTEU7CQkvKiBkZWNsYXJlIHNvdXJjZSBmaWxlICovCisgIGtub3cgKGNwID09ICZMb2NhbFs0XSk7CisgICpjcCsrID0gMDsJCQkJLyogZmlsbCBpbiB0aGlzIGxlbmd0aCBiZWxvdyAqLworICAqY3ArKyA9IDA7CQkJCS8qIGZsYWdzOyBtdXN0IGJlIHplcm8gKi8KKyAgQ09QWV9TSE9SVCAoY3AsIElEX051bWJlciksICBjcCArPSAyOwkvKiBmaWxlIElEIG51bWJlciAqLworICBtZW1jcHkgKGNwLCBjZHQsIDgpLCAgY3AgKz0gODsJLyogY3JlYXRpb24gZGF0ZSt0aW1lICovCisgIENPUFlfTE9ORyAoY3AsIGViayksICBjcCArPSA0OwkvKiBlbmQtb2YtZmlsZSBibG9jayAqLworICBDT1BZX1NIT1JUIChjcCwgZmZiKSwgIGNwICs9IDI7CS8qIGZpcnN0IGZyZWUgYnl0ZSBvZiBsYXN0IGJsb2NrICovCisgICpjcCsrID0gKGNoYXIpIHJmbzsJCQkvKiBSTVMgcmVjb3JkIGZvcm1hdCAqLworICAvKiBGaWxlbmFtZS4gICovCisgICpjcCsrID0gKGNoYXIpIGxlbjsKKyAgd2hpbGUgKC0tbGVuID49IDApCisgICAgKmNwKysgPSAqRmlsZW5hbWUrKzsKKyAgLyogTGlicmFyeSBtb2R1bGUgbmFtZSAobm9uZSkuICAqLworICAqY3ArKyA9IDA7CisgIC8qIE5vdyB0aGF0IHNpemUgaXMga25vd24sIGZpbGwgaXQgaW4gYW5kIHdyaXRlIG91dCB0aGUgcmVjb3JkLiAgKi8KKyAgTG9jYWxbNF0gPSBjcCAtICZMb2NhbFs1XTsJCS8qIHNvdXJjZSBmaWxlIGRlY2xhcmF0aW9uIHNpemUgKi8gCisgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07CQkvKiBUQlQgcmVjb3JkIHNpemUgKi8KKyAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOworICByZXR1cm4gMTsKK30KKworCisvKiBUcmFjZWJhY2sgaW5mb3JtYXRpb24gaXMgZGVzY3JpYmVkIGluIHRlcm1zIG9mIGxpbmVzIGZyb20gY29tcGlsZXIKKyAgIGxpc3RpbmcgZmlsZXMsIG5vdCBsaW5lcyBmcm9tIHNvdXJjZSBmaWxlcy4gIFdlIG5lZWQgdG8gc2V0IHVwIHRoZQorICAgY29ycmVsYXRpb24gYmV0d2VlbiBsaXN0aW5nIGxpbmUgbnVtYmVycyBhbmQgc291cmNlIGxpbmUgbnVtYmVycy4KKyAgIFNpbmNlIGdjYydzIC5zdGFibiBkaXJlY3RpdmVzIHJlZmVyIHRvIHRoZSBzb3VyY2UgbGluZXMsIHdlIGp1c3QKKyAgIG5lZWQgdG8gZGVzY3JpYmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlLiAgKi8KKworc3RhdGljIHZvaWQKK1ZNU19UQlRfU291cmNlX0xpbmVzIChJRF9OdW1iZXIsIFN0YXJ0aW5nX0xpbmVfTnVtYmVyLCBOdW1iZXJfT2ZfTGluZXMpCisgICAgIGludCBJRF9OdW1iZXI7CisgICAgIGludCBTdGFydGluZ19MaW5lX051bWJlcjsKKyAgICAgaW50IE51bWJlcl9PZl9MaW5lczsKK3sKKyAgY2hhciAqY3A7CisgIGludCBjaHVua19saW1pdDsKKyAgY2hhciBMb2NhbFsxMjhdOwkvKiByb29tIGVub3VnaCB0byBkZXNjcmliZSAxMzEwNzAwIGxpbmVzLi4uICovCisKKyAgY3AgPSAmTG9jYWxbMV07CS8qIFB1dCBzaXplIGluIExvY2FsWzBdIGxhdGVyLiAgKi8KKyAgKmNwKysgPSBEU1RfU19DX1NPVVJDRTsJCS8qIERTVCB0eXBlIGlzICJzb3VyY2UgZmlsZSIuICAqLworICAqY3ArKyA9IERTVF9TX0NfU1JDX1NFVEZJTEU7CQkvKiBTZXQgU291cmNlIEZpbGUuICAqLworICBDT1BZX1NIT1JUIChjcCwgSURfTnVtYmVyKSwgIGNwICs9IDI7CS8qIEZpbGUgSUQgTnVtYmVyLiAgKi8KKyAgLyogU2V0IHJlY29yZCBudW1iZXIgYW5kIGRlZmluZSBsaW5lcy4gIFNpbmNlIG5vIGxvbmd3b3JkIGZvcm0gb2YKKyAgICAgU1JDX0RFRkxJTkVTIGlzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aCBhbnkgaHVnZQorICAgICBmaWxlcyBhIGNodW5rIGF0IGEgdGltZS4gIEl0IGRvZXNuJ3QgbWF0dGVyIGZvciB0cmFjZWJhY2tzLCBzaW5jZQorICAgICB1bnNwZWNpZmllZCBsaW5lcyBhcmUgbWFwcGVkIG9uZS10by1vbmUgYW5kIHdvcmsgb3V0IHJpZ2h0LCBidXQgaXQKKyAgICAgZG9lcyBtYXR0ZXIgd2l0aGluIHRoZSBkZWJ1Z2dlci4gIFdpdGhvdXQgdGhpcyBleHBsaWNpdCBtYXBwaW5nLAorICAgICBpdCB3aWxsIGNvbXBsYWluIGFib3V0IGxpbmVzIG5vdCBleGlzdGluZyBpbiB0aGUgbW9kdWxlLiAgKi8KKyAgY2h1bmtfbGltaXQgPSAoc2l6ZW9mIExvY2FsIC0gNSkgLyA2OworICBpZiAoTnVtYmVyX09mX0xpbmVzID4gNjU1MzUgKiBjaHVua19saW1pdCkJLyogYXZvaWQgYnVmZmVyIG92ZXJmbG93ICovCisgICAgTnVtYmVyX09mX0xpbmVzID0gNjU1MzUgKiBjaHVua19saW1pdDsKKyAgd2hpbGUgKE51bWJlcl9PZl9MaW5lcyA+IDY1NTM1KQorICAgIHsKKyAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX0w7CisgICAgICBDT1BZX0xPTkcgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSA0OworICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUZMSU5FU19XOworICAgICAgQ09QWV9TSE9SVCAoY3AsIDY1NTM1KSwgIGNwICs9IDI7CisgICAgICBTdGFydGluZ19MaW5lX051bWJlciArPSA2NTUzNTsKKyAgICAgIE51bWJlcl9PZl9MaW5lcyAtPSA2NTUzNTsKKyAgICB9CisgIC8qIFNldCByZWNvcmQgbnVtYmVyIGFuZCBkZWZpbmUgbGluZXMsIG5vcm1hbCBjYXNlLiAgKi8KKyAgaWYgKFN0YXJ0aW5nX0xpbmVfTnVtYmVyIDw9IDY1NTM1KQorICAgIHsKKyAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX1c7CisgICAgICBDT1BZX1NIT1JUIChjcCwgU3RhcnRpbmdfTGluZV9OdW1iZXIpLCAgY3AgKz0gMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqY3ArKyA9IERTVF9TX0NfU1JDX1NFVFJFQ19MOworICAgICAgQ09QWV9MT05HIChjcCwgU3RhcnRpbmdfTGluZV9OdW1iZXIpLCAgY3AgKz0gNDsKKyAgICB9CisgICpjcCsrID0gRFNUX1NfQ19TUkNfREVGTElORVNfVzsKKyAgQ09QWV9TSE9SVCAoY3AsIE51bWJlcl9PZl9MaW5lcyksICBjcCArPSAyOworICAvKiBTZXQgc2l6ZSBub3cgdGhhdCBiZSBrbm93IGl0LCB0aGVuIG91dHB1dCB0aGUgZGF0YS4gICovCisgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07CisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGNwIC0gTG9jYWwsIE9CSl9TX0NfVEJUKTsKK30KKwwKKworIC8qKioqKiogRGVidWdnZXIgSW5mb3JtYXRpb24gc3VwcG9ydCByb3V0aW5lcyAqKioqKiovCisKKworLyogVGhpcyByb3V0aW5lIGxvY2F0ZXMgYSBmaWxlIGluIHRoZSBsaXN0IG9mIGZpbGVzLiAgSWYgYW4gZW50cnkgZG9lcworICAgbm90IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4gIEZvciBpbmNsdWRlIGZpbGVzLCBhIG5ldyBlbnRyeSBpcyBhbHdheXMKKyAgIGNyZWF0ZWQgc3VjaCB0aGF0IGlubGluZSBmdW5jdGlvbnMgY2FuIGJlIHByb3Blcmx5IGRlYnVnZ2VkLiAgKi8KKworc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICoKK2ZpbmRfZmlsZSAoc3ApCisgICAgIHN5bWJvbFMgKnNwOworeworICBzdHJ1Y3QgaW5wdXRfZmlsZSAqc2FtZV9maWxlID0gMDsKKyAgc3RydWN0IGlucHV0X2ZpbGUgKmZwbnQsICpsYXN0ID0gMDsKKyAgY2hhciAqc3BfbmFtZTsKKworICBmb3IgKGZwbnQgPSBmaWxlX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChmcG50LT5zcG50ID09IHNwKQorCXJldHVybiBmcG50OworICAgICAgbGFzdCA9IGZwbnQ7CisgICAgfQorICBzcF9uYW1lID0gU19HRVRfTkFNRSAoc3ApOworICBmb3IgKGZwbnQgPSBmaWxlX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHNwX25hbWUsIGZwbnQtPm5hbWUpID09IDApCisJeworCSAgaWYgKGZwbnQtPmZsYWcgPT0gMSkKKwkgICAgcmV0dXJuIGZwbnQ7CisJICBzYW1lX2ZpbGUgPSBmcG50OworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZnBudCA9IChzdHJ1Y3QgaW5wdXRfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbnB1dF9maWxlKSk7CisgIGlmICghZmlsZV9yb290KQorICAgIGZpbGVfcm9vdCA9IGZwbnQ7CisgIGVsc2UKKyAgICBsYXN0LT5uZXh0ID0gZnBudDsKKyAgZnBudC0+bmV4dCA9IDA7CisgIGZwbnQtPm5hbWUgPSBzcF9uYW1lOworICBmcG50LT5taW5fbGluZSA9IDB4N2ZmZmZmZmY7CisgIGZwbnQtPm1heF9saW5lID0gMDsKKyAgZnBudC0+b2Zmc2V0ID0gMDsKKyAgZnBudC0+ZmxhZyA9IDA7CisgIGZwbnQtPmZpbGVfbnVtYmVyID0gMDsKKyAgZnBudC0+c3BudCA9IHNwOworICBmcG50LT5zYW1lX2ZpbGVfZnBudCA9IHNhbWVfZmlsZTsKKyAgcmV0dXJuIGZwbnQ7Cit9CisKKworLyogVGhpcyByb3V0aW5lIGNvbnZlcnRzIGEgbnVtYmVyIHN0cmluZyBpbnRvIGFuIGludGVnZXIsIGFuZCBzdG9wcyB3aGVuCisgICBpdCBzZWVzIGFuIGludmFsaWQgY2hhcmFjdGVyLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHJlYWQuICBObyBlcnJvciBpcyBnZW5lcmF0ZWQuICAqLworCitzdGF0aWMgY2hhciAqCitjdnRfaW50ZWdlciAoc3RyLCBydG4pCisgICAgIGNoYXIgKnN0cjsKKyAgICAgaW50ICpydG47Cit7CisgIGludCBpdmFsID0gMCwgc2duID0gMTsKKworICBpZiAoKnN0ciA9PSAnLScpCisgICAgc2duID0gLTEsICArK3N0cjsKKyAgd2hpbGUgKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKQorICAgIGl2YWwgPSAxMCAqIGl2YWwgKyAqc3RyKysgLSAnMCc7CisgICpydG4gPSBzZ24gKiBpdmFsOworICByZXR1cm4gc3RyOworfQorDAorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGdlbmVyYXRlIG9iamVjdAorICogcmVjb3JkcyB0aGF0IHdpbGwgZGVzY3JpYmUgcHJvZ3JhbSB2YXJpYWJsZXMgdG8gdGhlIFZNUyBkZWJ1Z2dlci4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFueSBvZiB0aGUgcm91dGluZXMgbmVlZGVkIHRvIG91dHB1dCBkZWJ1Z2dpbmcgaW5mbworICogaW50byB0aGUgb2JqZWN0IGZpbGUgdGhhdCB0aGUgVk1TIGRlYnVnZ2VyIG5lZWRzIHRvIHVuZGVyc3RhbmQgc3ltYm9scy4KKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgdmVyeSBsYXRlIGluIHRoZSBhc3NlbWJseSBwcm9jZXNzLCBhbmQgdGh1cworICogd2UgY2FuIGJlIGZhaXJseSBsYXggYWJvdXQgY2hhbmdpbmcgdGhpbmdzLCBzaW5jZSB0aGUgR1NEIGFuZCB0aGUgVElSCisgKiBzZWN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBvdXRwdXQuCisgKi8KKworCisvKiBUaGlzIHJvdXRpbmUgZml4ZXMgdGhlIG5hbWVzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBDKyssICIudGhpcyIgaXMgYSBnb29kCisgICBleGFtcGxlLiAgVGhlIHBlcmlvZCBkb2VzIG5vdCB3b3JrIGZvciB0aGUgZGVidWdnZXIsIHNpbmNlIGl0IGxvb2tzIGxpa2UKKyAgIHRoZSBzeW50YXggZm9yIGEgc3RydWN0dXJlIGVsZW1lbnQsIGFuZCB0aHVzIGl0IGdldHMgbWlnaHRpbHkgY29uZnVzZWQuCisKKyAgIFdlIGFsc28gdXNlIHRoaXMgdG8gc3RyaXAgdGhlIFBzZWN0QXR0cmlidXRlIGhhY2sgZnJvbSB0aGUgbmFtZSBiZWZvcmUgd2UKKyAgIHdyaXRlIGEgZGVidWdnZXIgcmVjb3JkLiAgKi8KKworc3RhdGljIGNoYXIgKgorZml4X25hbWUgKHBudCkKKyAgICAgY2hhciAqcG50OworeworICBjaGFyICpwbnQxOworCisgIC8qIEtpbGwgYW55IGxlYWRpbmcgIl8iLiAgKi8KKyAgaWYgKCpwbnQgPT0gJ18nKQorICAgIHBudCsrOworCisgIC8qIElzIHRoZXJlIGEgUHNlY3QgQXR0cmlidXRlIHRvIHNraXA/PyAgKi8KKyAgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChwbnQpKQorICAgIHsKKyAgICAgIC8qIFllczogU2tpcCBpdC4gICovCisgICAgICBwbnQgKz0gUFNFQ1RfQVRUUklCVVRFU19TVFJJTkdfTEVOR1RIOworICAgICAgd2hpbGUgKCpwbnQpCisJeworCSAgaWYgKChwbnRbMF0gPT0gJyQnKSAmJiAocG50WzFdID09ICckJykpCisJICAgIHsKKwkgICAgICBwbnQgKz0gMjsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcG50Kys7CisJfQorICAgIH0KKworICAvKiBIZXJlIHdlIGZpeCB0aGUgLnRoaXMgLT4gJHRoaXMgY29udmVyc2lvbi4gICovCisgIGZvciAocG50MSA9IHBudDsgKnBudDEgIT0gMDsgcG50MSsrKQorICAgIGlmICgqcG50MSA9PSAnLicpCisgICAgICAqcG50MSA9ICckJzsKKworICByZXR1cm4gcG50OworfQorCisKKy8qIFdoZW4gZGVmaW5pbmcgYSBzdHJ1Y3R1cmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZmluZCB0aGUgbmFtZSBvZgorICAgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUuICBJdCBpcyBhc3N1bWVkIHRoYXQgc3RyIHBvaW50cyB0byB0aGUgZXF1YWwgc2lnbgorICAgaW4gdGhlIGRlZmluaXRpb24sIGFuZCBpdCBtb3ZlcyBiYWNrd2FyZCB1bnRpbCBpdCBmaW5kcyB0aGUgc3RhcnQgb2YgdGhlCisgICBuYW1lLiAgSWYgaXQgZmluZHMgYSAwLCB0aGVuIGl0IGtub3dzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgZGVmIGlzIGluIHRoZQorICAgb3V0ZXJtb3N0IGxldmVsLCBhbmQgdGh1cyBzeW1ib2xfbmFtZSBwb2ludHMgdG8gdGhlIHN5bWJvbCBuYW1lLiAgKi8KKworc3RhdGljIGNoYXIgKgorZ2V0X3N0cnVjdF9uYW1lIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgY2hhciAqcG50OworICBwbnQgPSBzdHI7CisgIHdoaWxlICgoKnBudCAhPSAnOicpICYmICgqcG50ICE9ICdcMCcpKQorICAgIHBudC0tOworICBpZiAoKnBudCA9PSAnXDAnKQorICAgIHJldHVybiAoY2hhciAqKSBzeW1ib2xfbmFtZTsKKyAgKnBudC0tID0gJ1wwJzsKKyAgd2hpbGUgKCgqcG50ICE9ICc7JykgJiYgKCpwbnQgIT0gJz0nKSkKKyAgICBwbnQtLTsKKyAgaWYgKCpwbnQgPT0gJzsnKQorICAgIHJldHVybiBwbnQgKyAxOworICB3aGlsZSAoKCpwbnQgPCAnMCcpIHx8ICgqcG50ID4gJzknKSkKKyAgICBwbnQrKzsKKyAgd2hpbGUgKCgqcG50ID49ICcwJykgJiYgKCpwbnQgPD0gJzknKSkKKyAgICBwbnQrKzsKKyAgcmV0dXJuIHBudDsKK30KKworCisvKiBTZWFyY2ggc3ltYm9sIGxpc3QgZm9yIHR5cGUgbnVtYmVyIGRieF90eXBlLgorICAgUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QuICAqLworCitzdGF0aWMgc3RydWN0IFZNU19EQkdfU3ltYm9sICoKK2ZpbmRfc3ltYm9sIChkYnhfdHlwZSkKKyAgICAgaW50IGRieF90eXBlOworeworICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7CisKKyAgc3BudCA9IFZNU19TeW1ib2xfdHlwZV9saXN0W1NZTVRZUF9IQVNIIChkYnhfdHlwZSldOworICB3aGlsZSAoc3BudCkKKyAgICB7CisgICAgICBpZiAoc3BudC0+ZGJ4X3R5cGUgPT0gZGJ4X3R5cGUpCisJYnJlYWs7CisgICAgICBzcG50ID0gc3BudC0+bmV4dDsKKyAgICB9CisgIGlmICghc3BudCB8fCBzcG50LT5hZHZhbmNlZCAhPSBBTElBUykKKyAgICByZXR1cm4gc3BudDsKKyAgcmV0dXJuIGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Cit9CisKKworI2lmIDAJCS8qIG9ic29sZXRlICovCisvKiB0aGlzIHJvdXRpbmUgcHV0cyBpbmZvIGludG8gZWl0aGVyIExvY2FsIG9yIEFzdWZmaXgsIGRlcGVuZGluZyBvbiB0aGUgc2lnbgorICogb2Ygc2l6ZS4gIFRoZSByZWFzb24gaXMgdGhhdCBpdCBpcyBlYXNpZXIgdG8gYnVpbGQgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3IKKyAqIGJhY2t3YXJkcywgd2hpbGUgdGhlIGFycmF5IGRlc2NyaXB0b3IgaXMgYmVzdCBidWlsdCBmb3J3YXJkcy4gIEluIHRoZSBlbmQKKyAqIHRoZXkgZ2V0IHB1dCB0b2dldGhlciwgaWYgdGhlcmUgaXMgbm90IGEgc3RydWN0L3VuaW9uL2VudW0gYWxvbmcgdGhlIHdheQorICovCitzdGF0aWMgdm9pZAorcHVzaCAodmFsdWUsIHNpemUxKQorICAgICBpbnQgdmFsdWUsIHNpemUxOworeworICBpZiAoc2l6ZTEgPCAwKQorICAgIHsKKyAgICAgIHNpemUxID0gLXNpemUxOworICAgICAgaWYgKExwbnQgPCBzaXplMSkKKwl7CisJICBvdmVyZmxvdyA9IDE7CisJICBMcG50ID0gMTsKKwkgIHJldHVybjsKKwl9CisgICAgICBMcG50IC09IHNpemUxOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmTG9jYWxbTHBudCArIDFdLCB2YWx1ZSwgc2l6ZTEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChBcG9pbnQgKyBzaXplMSA+PSBNQVhfREVCVUdfUkVDT1JEKQorCXsKKwkgIG92ZXJmbG93ID0gMTsKKwkgIEFwb2ludCA9IE1BWF9ERUJVR19SRUNPUkQgLSAxOworCSAgcmV0dXJuOworCX0KKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoJkFzdWZmaXhbQXBvaW50XSwgdmFsdWUsIHNpemUxKTsKKyAgICAgIEFwb2ludCArPSBzaXplMTsKKyAgICB9Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorZnB1c2ggKHZhbHVlLCBzaXplKQorICAgICBpbnQgdmFsdWUsIHNpemU7Cit7CisgIGlmIChBcG9pbnQgKyBzaXplID49IE1BWF9ERUJVR19SRUNPUkQpCisgICAgeworICAgICAgb3ZlcmZsb3cgPSAxOworICAgICAgQXBvaW50ID0gTUFYX0RFQlVHX1JFQ09SRCAtIDE7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoc2l6ZSA9PSAxKQorICAgIEFzdWZmaXhbQXBvaW50KytdID0gKGNoYXIpIHZhbHVlOworICBlbHNlCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmQXN1ZmZpeFtBcG9pbnRdLCB2YWx1ZSwgc2l6ZSk7CisgICAgICBBcG9pbnQgKz0gc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitycHVzaCAodmFsdWUsIHNpemUpCisgICAgIGludCB2YWx1ZSwgc2l6ZTsKK3sKKyAgaWYgKExwbnQgPCBzaXplKQorICAgIHsKKyAgICAgIG92ZXJmbG93ID0gMTsKKyAgICAgIExwbnQgPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKHNpemUgPT0gMSkKKyAgICAgIExvY2FsW0xwbnQtLV0gPSAoY2hhcikgdmFsdWU7CisgIGVsc2UKKyAgICB7CisgICAgICBMcG50IC09IHNpemU7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZMb2NhbFtMcG50ICsgMV0sIHZhbHVlLCBzaXplKTsKKyAgICB9Cit9CisKKworLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgYXJyYXkgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBhcnJheS4gICovCisKK3N0YXRpYyB2b2lkCithcnJheV9zdWZmaXggKHNwbnQyKQorICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQyOworeworICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7CisgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7CisgIGludCByYW5rOworICBpbnQgdG90YWxfc2l6ZTsKKworICByYW5rID0gMDsKKyAgc3BudCA9IHNwbnQyOworICB3aGlsZSAoc3BudC0+YWR2YW5jZWQgIT0gQVJSQVkpCisgICAgeworICAgICAgc3BudCA9IGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7CisgICAgICBpZiAoIXNwbnQpCisJcmV0dXJuOworICAgIH0KKyAgc3BudDEgPSBzcG50OworICB0b3RhbF9zaXplID0gMTsKKyAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKKyAgICB7CisgICAgICByYW5rKys7CisgICAgICB0b3RhbF9zaXplICo9IChzcG50MS0+aW5kZXhfbWF4IC0gc3BudDEtPmluZGV4X21pbiArIDEpOworICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKKyAgICB9CisgIHRvdGFsX3NpemUgPSB0b3RhbF9zaXplICogc3BudDEtPmRhdGFfc2l6ZTsKKyAgZnB1c2ggKHNwbnQxLT5kYXRhX3NpemUsIDIpOwkvKiBlbGVtZW50IHNpemUgKi8KKyAgaWYgKHNwbnQxLT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCisgICAgZnB1c2ggKDAsIDEpOworICBlbHNlCisgICAgZnB1c2ggKHNwbnQxLT5WTVNfdHlwZSwgMSk7CS8qIGVsZW1lbnQgdHlwZSAqLworICBmcHVzaCAoRFNDX0tfQ0xBU1NfQSwgMSk7CS8qIGRlc2NyaXB0b3IgY2xhc3MgKi8KKyAgZnB1c2ggKDAsIDQpOwkJCS8qIGJhc2UgYWRkcmVzcyAqLworICBmcHVzaCAoMCwgMSk7CQkJLyogc2NhbGUgZmFjdG9yIC0tIG5vdCBhcHBsaWNhYmxlICovCisgIGZwdXNoICgwLCAxKTsJCQkvKiBkaWdpdCBjb3VudCAtLSBub3QgYXBwbGljYWJsZSAqLworICBmcHVzaCAoMHhjMCwgMSk7CQkvKiBmbGFnczogbXVsdGlwbGllciBibG9jayAmIGJvdW5kcyBwcmVzZW50ICovCisgIGZwdXNoIChyYW5rLCAxKTsJCS8qIG51bWJlciBvZiBkaW1lbnNpb25zICovCisgIGZwdXNoICh0b3RhbF9zaXplLCA0KTsKKyAgZnB1c2ggKDAsIDQpOwkJCS8qIHBvaW50ZXIgdG8gZWxlbWVudCBbMF1bMF0uLi5bMF0gKi8KKyAgc3BudDEgPSBzcG50OworICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQorICAgIHsKKyAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWF4IC0gc3BudDEtPmluZGV4X21pbiArIDEsIDQpOworICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKKyAgICB9CisgIHNwbnQxID0gc3BudDsKKyAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKKyAgICB7CisgICAgICBmcHVzaCAoc3BudDEtPmluZGV4X21pbiwgNCk7CisgICAgICBmcHVzaCAoc3BudDEtPmluZGV4X21heCwgNCk7CisgICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOworICAgIH0KK30KKworCisvKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBzdGFydCBvZiBhIHZhcmlhYmxlIGRlc2NyaXB0b3IgYmFzZWQgdXBvbgorICAgYSBzdHJ1Y3QvdW5pb24vZW51bSB0aGF0IGhhcyB5ZXQgdG8gYmUgZGVmaW5lZC4gIFdlIGRlZmluZSB0aGlzIHNwb3QgYXMKKyAgIGEgbmV3IGxvY2F0aW9uLCBhbmQgc2F2ZSBmb3VyIGJ5dGVzIGZvciB0aGUgYWRkcmVzcy4gIFdoZW4gdGhlIHN0cnVjdCBpcworICAgZmluYWxseSBkZWZpbmVkLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBwbHVnIGluIHRoZSBjb3JyZWN0IGFkZHJlc3MuICAqLworCitzdGF0aWMgdm9pZAorbmV3X2ZvcndhcmRfcmVmIChkYnhfdHlwZSkKKyAgICAgaW50IGRieF90eXBlOworeworICBzdHJ1Y3QgZm9yd2FyZF9yZWYgKmZwbnQ7CisgIGZwbnQgPSAoc3RydWN0IGZvcndhcmRfcmVmICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZvcndhcmRfcmVmKSk7CisgIGZwbnQtPm5leHQgPSBmX3JlZl9yb290OworICBmX3JlZl9yb290ID0gZnBudDsKKyAgZnBudC0+ZGJ4X3R5cGUgPSBkYnhfdHlwZTsKKyAgZnBudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OworICBmcG50LT5yZXNvbHZlZCA9ICdOJzsKKyAgcnB1c2ggKERTVF9LX1RTX0lORCwgMSk7CS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLworICB0b3RhbF9sZW4gPSA1OworICBycHVzaCAodG90YWxfbGVuLCAyKTsKKyAgc3RydWN0X251bWJlciA9IC1mcG50LT5zdHJ1Y19udW1iOworfQorCisKKy8qIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3IgdXNlZCB0byBkZXNjcmliZSBub24tYmFzaWMKKyAgIHZhcmlhYmxlcy4gIEl0IGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSB1bnRpbCBpdCBnZXRzIHRvIHRoZSBib3R0b20gb2YgaXQKKyAgIGFsbCwgYW5kIHRoZW4gYnVpbGRzIHRoZSBkZXNjcmlwdG9yIGJhY2t3YXJkcy4gIEl0IGlzIGVhc2llc3QgdG8gZG8gaXQKKyAgIHRoaXMgd2F5IHNpbmNlIHdlIG11c3QgcGVyaW9kaWNhbGx5IHdyaXRlIGxlbmd0aCBieXRlcywgYW5kIGl0IGlzIGVhc2llc3QKKyAgIGlmIHdlIGtub3cgdGhlIHZhbHVlIHdoZW4gaXQgaXMgdGltZSB0byB3cml0ZSBpdC4gICovCisKK3N0YXRpYyBpbnQKK2dlbjEgKHNwbnQsIGFycmF5X3N1ZmZpeF9sZW4pCisgICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKKyAgICAgaW50IGFycmF5X3N1ZmZpeF9sZW47Cit7CisgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7CisgIGludCBpOworCisgIHN3aXRjaCAoc3BudC0+YWR2YW5jZWQpCisgICAgeworICAgIGNhc2UgVk9JRDoKKyAgICAgIHJwdXNoIChEQkdfU19DX1ZPSUQsIDEpOworICAgICAgdG90YWxfbGVuICs9IDE7CisgICAgICBycHVzaCAodG90YWxfbGVuLCAyKTsKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgQkFTSUM6CisgICAgY2FzZSBGVU5DVElPTjoKKyAgICAgIGlmIChhcnJheV9zdWZmaXhfbGVuID09IDApCisJeworCSAgcnB1c2ggKHNwbnQtPlZNU190eXBlLCAxKTsKKwkgIHJwdXNoIChEQkdfU19DX0JBU0lDLCAxKTsKKwkgIHRvdGFsX2xlbiA9IDI7CisJICBycHVzaCAodG90YWxfbGVuLCAyKTsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIHJwdXNoICgwLCA0KTsKKyAgICAgIHJwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsKKyAgICAgIHJwdXNoIChEU1RfS19UU19EU0MsIDEpOwkvKiBkZXNjcmlwdG9yIHR5cGUgc3BlY2lmaWNhdGlvbiAqLworICAgICAgdG90YWxfbGVuID0gLTI7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFNUUlVDVDoKKyAgICBjYXNlIFVOSU9OOgorICAgIGNhc2UgRU5VTToKKyAgICAgIHN0cnVjdF9udW1iZXIgPSBzcG50LT5zdHJ1Y19udW1iOworICAgICAgaWYgKHN0cnVjdF9udW1iZXIgPCAwKQorCXsKKwkgIG5ld19mb3J3YXJkX3JlZiAoc3BudC0+ZGJ4X3R5cGUpOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgcnB1c2ggKERCR19TX0NfU1RSVUNULCAxKTsKKyAgICAgIHRvdGFsX2xlbiA9IDU7CisgICAgICBycHVzaCAodG90YWxfbGVuLCAyKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgUE9JTlRFUjoKKyAgICAgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKKyAgICAgIGkgPSAxOworICAgICAgaWYgKCFzcG50MSkKKwluZXdfZm9yd2FyZF9yZWYgKHNwbnQtPnR5cGUyKTsKKyAgICAgIGVsc2UKKwlpID0gZ2VuMSAoc3BudDEsIDApOworICAgICAgaWYgKGkpCisJewkvKiAoKnZvaWQpIGlzIGEgc3BlY2lhbCBjYXNlLCBkbyBub3QgcHV0IHBvaW50ZXIgc3VmZml4ICovCisJICBycHVzaCAoREJHX1NfQ19QT0lOVEVSLCAxKTsKKwkgIHRvdGFsX2xlbiArPSAzOworCSAgcnB1c2ggKHRvdGFsX2xlbiwgMik7CisJfQorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBBUlJBWToKKyAgICAgIHNwbnQxID0gc3BudDsKKyAgICAgIHdoaWxlIChzcG50MS0+YWR2YW5jZWQgPT0gQVJSQVkpCisJeworCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudDEtPnR5cGUyKTsKKwkgIGlmICghc3BudDEpCisJICAgIHsKKwkgICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIpLAorCQkJIHNwbnQtPnR5cGUyKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKy8qIEl0IGlzIHRvbyBsYXRlIHRvIGdlbmVyYXRlIGZvcndhcmQgcmVmZXJlbmNlcywgc28gdGhlIHVzZXIgZ2V0cyBhIG1lc3NhZ2UuCisgKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBvbiBhIGNvbXBpbGVyIGVycm9yICovCisgICAgICAodm9pZCkgZ2VuMSAoc3BudDEsIDEpOworICAgICAgaSA9IEFwb2ludDsKKyAgICAgIGFycmF5X3N1ZmZpeCAoc3BudCk7CisgICAgICBhcnJheV9zdWZmaXhfbGVuID0gQXBvaW50IC0gaTsKKyAgICAgIHN3aXRjaCAoc3BudDEtPmFkdmFuY2VkKQorCXsKKwljYXNlIEJBU0lDOgorCWNhc2UgRlVOQ1RJT046CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcnB1c2ggKDAsIDIpOworCSAgdG90YWxfbGVuICs9IDI7CisJICBycHVzaCAodG90YWxfbGVuLCAyKTsKKwkgIHJwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsKKwkgIHJwdXNoICgxLCAxKTsJCS8qIGZsYWdzOiBlbGVtZW50IHZhbHVlIHNwZWMgaW5jbHVkZWQgKi8KKwkgIHJwdXNoICgxLCAxKTsJCS8qIG9uZSBkaW1lbnNpb24gKi8KKwkgIHJwdXNoIChEQkdfU19DX0NPTVBMRVhfQVJSQVksIDEpOworCX0KKyAgICAgIHRvdGFsX2xlbiArPSBhcnJheV9zdWZmaXhfbGVuICsgODsKKyAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoJLyogbGludCBzdXBwcmVzc2lvbiAqLworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBUaGlzIGdlbmVyYXRlcyBhIHN1ZmZpeCBmb3IgYSB2YXJpYWJsZS4gIElmIGl0IGlzIG5vdCBhIGRlZmluZWQgdHlwZSB5ZXQsCisgICB0aGVuIGRieF90eXBlIGNvbnRhaW5zIHRoZSB0eXBlIHdlIGFyZSBleHBlY3Rpbmcgc28gd2UgY2FuIGdlbmVyYXRlIGEKKyAgIGZvcndhcmQgcmVmZXJlbmNlLiAgVGhpcyBjYWxscyBnZW4xIHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIGRlc2NyaXB0b3IsIGFuZAorICAgdGhlbiBpdCBwdXRzIHRoZSBpY2luZyBvbiBhdCB0aGUgZW5kLiAgSXQgdGhlbiBkdW1wcyB3aGF0ZXZlciBpcyBuZWVkZWQKKyAgIHRvIGdldCBhIGNvbXBsZXRlIGRlc2NyaXB0b3IgKGkuZS4gc3RydWN0IHJlZmVyZW5jZSwgYXJyYXkgc3VmZml4KS4gICovCisKK3N0YXRpYyB2b2lkCitnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIGRieF90eXBlKQorICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7CisgICAgIGludCBkYnhfdHlwZTsKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgcHZvaWRbNl0gPSB7CisJCTUsCQkvKiByZWNvcmQubGVuZ3RoID09IDUgKi8KKwkJRFNUX0tfVFlQU1BFQywJLyogcmVjb3JkLnR5cGUgPT0gMSAodHlwZSBzcGVjaWZpY2F0aW9uKSAqLworCQkwLAkJLyogbmFtZS5sZW5ndGggPT0gMCwgbm8gbmFtZSBmb2xsb3dzICovCisJCTEsIDAsCQkvKiB0eXBlLmxlbmd0aCA9PSAxIHsyIGJ5dGVzLCBsaXR0bGUgZW5kaWFufSAqLworCQlEQkdfU19DX1ZPSUQJLyogdHlwZS50eXBlID09IDUgKHBvaW50ZXIgdG8gdW5zcGVjaWZpZWQpICovCisgIH07CisgIGludCBpOworCisgIEFwb2ludCA9IDA7CisgIExwbnQgPSBNQVhfREVCVUdfUkVDT1JEIC0gMTsKKyAgdG90YWxfbGVuID0gMDsKKyAgc3RydWN0X251bWJlciA9IDA7CisgIG92ZXJmbG93ID0gMDsKKyAgaWYgKCFzcG50KQorICAgIG5ld19mb3J3YXJkX3JlZiAoZGJ4X3R5cGUpOworICBlbHNlCisgICAgeworICAgICAgaWYgKHNwbnQtPlZNU190eXBlICE9IERCR19TX0NfQURWQU5DRURfVFlQRSkKKwlyZXR1cm47CQkvKiBubyBzdWZmaXggbmVlZGVkICovCisgICAgICBnZW4xIChzcG50LCAwKTsKKyAgICB9CisgIHJwdXNoICgwLCAxKTsJCS8qIG5vIG5hbWUgKGxlbj09MCkgKi8KKyAgcnB1c2ggKERTVF9LX1RZUFNQRUMsIDEpOworICB0b3RhbF9sZW4gKz0gNDsKKyAgcnB1c2ggKHRvdGFsX2xlbiwgMSk7CisgIC8qIElmIHRoZSB2YXJpYWJsZSBkZXNjcmlwdG9yIG92ZXJmbG93cyB0aGUgcmVjb3JkLCBvdXRwdXQgYSBkZXNjcmlwdG9yCisgICAgIGZvciBhIHBvaW50ZXIgdG8gdm9pZC4gICovCisgIGlmICgodG90YWxfbGVuID49IE1BWF9ERUJVR19SRUNPUkQpIHx8IG92ZXJmbG93KQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIlZhcmlhYmxlIGRlc2NyaXB0b3IgJWQgdG9vIGNvbXBsaWNhdGVkLiAgRGVmaW5lZCBhcyBgdm9pZCAqJy4iKSwKKwkJc3BudC0+ZGJ4X3R5cGUpOworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChwdm9pZCwgNiwgT0JKX1NfQ19EQkcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaSA9IDA7CisgIHdoaWxlIChMcG50IDwgTUFYX0RFQlVHX1JFQ09SRCAtIDEpCisgICAgTG9jYWxbaSsrXSA9IExvY2FsWysrTHBudF07CisgIExwbnQgPSBpOworICAvKiB3ZSB1c2UgdGhpcyBmb3IgcmVmZXJlbmNlIHRvIHN0cnVjdHVyZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCAqLworICBpZiAoc3RydWN0X251bWJlciA+IDApCisgICAgeworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOworICAgICAgTHBudCA9IDA7CisgICAgICBWTVNfU3RvcmVfU3RydWN0IChzdHJ1Y3RfbnVtYmVyKTsKKyAgICB9CisgIC8qIFdlIHVzZSB0aGlzIGZvciBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEgc3RydWN0dXJlIHRoYXQgaGFzIHlldCB0bworICAgICBiZSBkZWZpbmVkLiAgV2Ugc3RvcmUgZm91ciBieXRlcyBvZiB6ZXJvIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGFjdHVhbAorICAgICBhZGRyZXNzIG9uY2UgaXQgaXMga25vd24uICAqLworICBpZiAoc3RydWN0X251bWJlciA8IDApCisgICAgeworICAgICAgc3RydWN0X251bWJlciA9IC1zdHJ1Y3RfbnVtYmVyOworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOworICAgICAgTHBudCA9IDA7CisgICAgICBWTVNfRGVmX1N0cnVjdCAoc3RydWN0X251bWJlcik7CisgICAgICBDT1BZX0xPTkcgKCZMb2NhbFtMcG50XSwgMEwpOworICAgICAgTHBudCArPSA0OworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOworICAgICAgTHBudCA9IDA7CisgICAgfQorICBpID0gMDsKKyAgd2hpbGUgKGkgPCBBcG9pbnQpCisgICAgTG9jYWxbTHBudCsrXSA9IEFzdWZmaXhbaSsrXTsKKyAgaWYgKExwbnQgIT0gMCkKKyAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7CisgIExwbnQgPSAwOworfQorCisKKwkvKiAibm92ZWwgbGVuZ3RoIiB0eXBlIGRvZXNuJ3Qgd29yayBmb3Igc2ltcGxlIGF0b21pYyB0eXBlcyAqLworI2RlZmluZSBVU0VfQklUU1RSSU5HX0RFU0NSSVBUT1IodCkgKCh0KS0+YWR2YW5jZWQgPT0gQkFTSUMpCisjdW5kZWYgU0VUVVBfQkFTSUNfVFlQRVMKKworLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHR5cGUgZGVzY3JpcHRpb24gZm9yIGEgYml0ZmllbGQuICAqLworCitzdGF0aWMgdm9pZAorYml0ZmllbGRfc3VmZml4IChzcG50LCB3aWR0aCkKKyAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OworICAgICBpbnQgd2lkdGg7Cit7CisgIExvY2FsW0xwbnQrK10gPSAxMzsJCQkvKiByZWMubGVuPT0xMyAqLworICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFlQU1BFQzsJLyogYSB0eXBlIHNwZWNpZmljYXRpb24gcmVjb3JkICovCisgIExvY2FsW0xwbnQrK10gPSAwOwkJCS8qIG5vdCBuYW1lZCAqLworICBDT1BZX1NIT1JUICgmTG9jYWxbTHBudF0sIDkpOwkJLyogdHlwLmxlbj09OSAqLworICBMcG50ICs9IDI7CisgIExvY2FsW0xwbnQrK10gPSBEU1RfS19UU19OT1ZfTEVORzsJLyogVGhpcyB0eXBlIGlzIGEgIm5vdmVsIGxlbmd0aCIKKwkJCQkJICAgaW5jYXJuYXRpb24gb2Ygc29tZSBvdGhlciB0eXBlLiAgKi8KKyAgQ09QWV9MT05HICgmTG9jYWxbTHBudF0sIHdpZHRoKTsJLyogc2l6ZSBpbiBiaXRzID09IG5vdmVsIGxlbmd0aCAqLworICBMcG50ICs9IDQ7CisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIExwbnQsIE9CSl9TX0NfREJHKTsKKyAgTHBudCA9IDA7CisgIC8qIGFzc2VydCggc3BudC0+c3RydWNfbnVtYiA+IDAgKTsgKi8KKyAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CS8qIG91dHB1dCA0IG1vcmUgYnl0ZXMgKi8KK30KKworCisvKiBGb3JtYWxseSBkZWZpbmUgYSBidWlsdGluIHR5cGUsIHNvIHRoYXQgaXQgY2FuIHNlcnZlIGFzIHRoZSB0YXJnZXQgb2YKKyAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZS4gIEl0IG1ha2VzIGJpdGZpZWxkX3N1ZmZpeCgpIGVhc2llciBieSBhdm9pZGluZworICAgdGhlIG5lZWQgdG8gdXNlIGEgZm9yd2FyZCByZWZlcmVuY2UgZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2gKKyAgIHR5cGUgdXNlZCBpbiBhIGJpdGZpZWxkLiAgKi8KKworc3RhdGljIHZvaWQKK3NldHVwX2Jhc2ljX3R5cGUgKHNwbnQpCisgICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKK3sKKyNpZmRlZiBTRVRVUF9CQVNJQ19UWVBFUworICAvKiBUaGlzIHdvdWxkIGJlIHZlcnkgdXNlZnVsIGlmICJub3ZlbCBsZW5ndGgiIGZpZWxkcyBhY3R1YWxseSB3b3JrZWQKKyAgICAgd2l0aCBiYXNpYyB0eXBlcyBsaWtlIHRoZXkgZG8gd2l0aCBlbnVtZXJhdGVkIHR5cGVzLiAgSG93ZXZlciwKKyAgICAgdGhleSBkbyBub3QsIHNvIHRoaXMgaXNuJ3Qgd29ydGggZG9pbmcganVzdCBzbyB0aGF0IHlvdSBjYW4gdXNlCisgICAgIEVYQU1JTkUvVFlQRT0oX19sb25nX2xvbmdfaW50KSBpbnN0ZWFkIG9mIEVYQU1JTkUvUVVBRC4gICovCisgIGNoYXIgKnA7CisjaWZuZGVmIFNFVFVQX1NZTk9OWU1fVFlQRVMKKyAgLyogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgY29tcGF0aWJsZSB0aGluZ3MgbGlrZSBgaW50JyBhbmQgYGxvbmcgaW50JworICAgICBvdWdodCB0byBoYXZlIGRpc3RpbmN0IHR5cGUgcmVjb3JkcyByYXRoZXIgdGhhbiBzaGFyaW5nIG9uZS4gICovCisgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDI7CisKKyAgLyogZmlyc3QgY2hlY2sgd2hldGhlciB0aGlzIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBzZWVuIGJ5IGFub3RoZXIgbmFtZSAqLworICBmb3IgKHNwbnQyID0gVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQX0hBU0ggKHNwbnQtPlZNU190eXBlKV07CisgICAgICAgc3BudDI7CisgICAgICAgc3BudDIgPSBzcG50Mi0+bmV4dCkKKyAgICBpZiAoc3BudDIgIT0gc3BudCAmJiBzcG50Mi0+Vk1TX3R5cGUgPT0gc3BudC0+Vk1TX3R5cGUpCisgICAgICB7CisJc3BudC0+c3RydWNfbnVtYiA9IHNwbnQyLT5zdHJ1Y19udW1iOworCXJldHVybjsKKyAgICAgIH0KKyNlbmRpZgorCisgIC8qIGBzdHJ1Y3R1cmUgbnVtYmVyJyBkb2Vzbid0IHJlYWxseSBtZWFuIGBzdHJ1Y3R1cmUnOyBpdCBtZWFucyBhbiBpbmRleAorICAgICBpbnRvIGEgbGlua2VyIG1haW50YWluZWQgc2V0IG9mIHNhdmVkIGxvY2F0aW9ucyB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZAorICAgICBhZ2FpbiBsYXRlci4gICovCisgIHNwbnQtPnN0cnVjX251bWIgPSArK3N0cnVjdHVyZV9jb3VudDsKKyAgVk1TX0RlZl9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOwkvKiByZW1lbWJlciB3aGVyZSB0aGlzIHR5cGUgbGl2ZXMgKi8KKyAgLyogZGVmaW5lIHRoZSBzaW1wbGUgc2NhbGFyIHR5cGUgKi8KKyAgTG9jYWxbTHBudCsrXSA9IDYgKyBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDI7CS8qIHJlYy5sZW4gKi8KKyAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RZUFNQRUM7CS8qIHJlYy50eXA9PXR5cGUgc3BlY2lmaWNhdGlvbiAqLworICBMb2NhbFtMcG50KytdID0gc3RybGVuIChzeW1ib2xfbmFtZSkgKyAyOworICBMb2NhbFtMcG50KytdID0gJ18nOwkJCS8qIHByZWZpeCBuYW1lIHdpdGggIl9fIiAqLworICBMb2NhbFtMcG50KytdID0gJ18nOworICBmb3IgKHAgPSBzeW1ib2xfbmFtZTsgKnA7IHArKykKKyAgICBMb2NhbFtMcG50KytdID0gKnAgPT0gJyAnID8gJ18nIDogKnA7CisgIENPUFlfU0hPUlQgKCZMb2NhbFtMcG50XSwgMik7CQkvKiB0eXAubGVuPT0yICovCisgIExwbnQgKz0gMjsKKyAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RTX0FUT007CS8qIHR5cC5raW5kIGlzIHNpbXBsZSB0eXBlICovCisgIExvY2FsW0xwbnQrK10gPSBzcG50LT5WTVNfdHlwZTsJLyogdHlwLnR5cGUgKi8KKyAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOworICBMcG50ID0gMDsKKyNlbmRpZgkvKiBTRVRVUF9CQVNJQ19UWVBFUyAqLworICByZXR1cm47Cit9CisKKworLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHN5bWJvbCBkZWZpbml0aW9uIGZvciBhIEMgc3ltYm9sIGZvciB0aGUgZGVidWdnZXIuCisgICBJdCB0YWtlcyBhIHBzZWN0IGFuZCBvZmZzZXQgZm9yIGdsb2JhbCBzeW1ib2xzOyBpZiBwc2VjdCA8IDAsIHRoZW4gdGhpcyBpcworICAgYSBsb2NhbCB2YXJpYWJsZSBhbmQgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byBGUC4gIEluIHRoaXMgY2FzZSBpdCBjYW4KKyAgIGJlIGVpdGhlciBhIHZhcmlhYmxlIChPZmZzZXQgPCAwKSBvciBhIHBhcmFtZXRlciAoT2Zmc2V0ID4gMCkuICAqLworCitzdGF0aWMgdm9pZAorVk1TX0RCR19yZWNvcmQgKHNwbnQsIFBzZWN0LCBPZmZzZXQsIE5hbWUpCisgICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKKyAgICAgaW50IFBzZWN0OworICAgICBpbnQgT2Zmc2V0OworICAgICBjaGFyICpOYW1lOworeworICBjaGFyICpOYW1lX3BudDsKKyAgaW50IGxlbjsKKyAgaW50IGkgPSAwOworCisgIC8qIGlmIHRoZXJlIGFyZSBiYWQgY2hhcmFjdGVycyBpbiBuYW1lLCBjb252ZXJ0IHRoZW0gKi8KKyAgTmFtZV9wbnQgPSBmaXhfbmFtZSAoTmFtZSk7CisKKyAgbGVuID0gc3RybGVuIChOYW1lX3BudCk7CisgIGlmIChQc2VjdCA8IDApCisgICAgewkJCQkvKiB0aGlzIGlzIGEgbG9jYWwgdmFyaWFibGUsIHJlZmVyZW5jZWQgdG8gU1AgKi8KKyAgICAgIExvY2FsW2krK10gPSA3ICsgbGVuOworICAgICAgTG9jYWxbaSsrXSA9IHNwbnQtPlZNU190eXBlOworICAgICAgTG9jYWxbaSsrXSA9IChPZmZzZXQgPiAwKSA/IERCR19DX0ZVTkNUSU9OX1BBUkFNIDogREJHX0NfTE9DQUxfU1lNOworICAgICAgQ09QWV9MT05HICgmTG9jYWxbaV0sIE9mZnNldCk7CisgICAgICBpICs9IDQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47CisgICAgICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7CisgICAgICBMb2NhbFtpKytdID0gRFNUX0tfVkFMS0lORF9BRERSOworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOworICAgICAgaSA9IDA7CisgICAgICBWTVNfU2V0X0RhdGEgKFBzZWN0LCBPZmZzZXQsIE9CSl9TX0NfREJHLCAwKTsKKyAgICB9CisgIExvY2FsW2krK10gPSBsZW47CisgIHdoaWxlICgqTmFtZV9wbnQgIT0gJ1wwJykKKyAgICBMb2NhbFtpKytdID0gKk5hbWVfcG50Kys7CisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKKyAgaWYgKHNwbnQtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKKyAgICBnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIDApOworfQorCisKKy8qIFRoaXMgcm91dGluZSBwYXJzZXMgdGhlIHN0YWJzIGVudHJpZXMgaW4gb3JkZXIgdG8gbWFrZSB0aGUgZGVmaW5pdGlvbgorICAgZm9yIHRoZSBkZWJ1Z2dlciBvZiBsb2NhbCBzeW1ib2xzIGFuZCBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KKworc3RhdGljIHZvaWQKK1ZNU19sb2NhbF9zdGFiX1BhcnNlIChzcCkKKyAgICAgc3ltYm9sUyAqc3A7Cit7CisgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKKyAgY2hhciAqcG50OworICBjaGFyICpwbnQxOworICBjaGFyICpzdHI7CisgIGludCBkYnhfdHlwZTsKKworICBkYnhfdHlwZSA9IDA7CisgIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKKyAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6Jyk7CisgIGlmICghcG50KQorICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCisgIHBudDEgPSBwbnQrKzsJCQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyLCBhbmQgc2tpcCBjb2xvbiAqLworICBpZiAoKnBudCA9PSAnYycpCisgICAgcmV0dXJuOwkJCS8qIGlnbm9yZSBzdGF0aWMgY29uc3RhbnRzICovCisKKy8qIHRoZXJlIGlzIG9uZSBsaXR0bGUgY2F0Y2ggdGhhdCB3ZSBtdXN0IGJlIGF3YXJlIG9mLiAgU29tZXRpbWVzIGZ1bmN0aW9uCisgKiBwYXJhbWV0ZXJzIGFyZSBvcHRpbWl6ZWQgaW50byByZWdpc3RlcnMsIGFuZCB0aGUgY29tcGlsZXIsIGluIGl0cyBpbmZpaXRlCisgKiB3aXNkb20gb3V0cHV0cyBzdGFicyByZWNvcmRzIGZvciAqYm90aCouICBJbiBnZW5lcmFsIHdlIHdhbnQgdG8gdXNlIHRoZQorICogcmVnaXN0ZXIgaWYgaXQgaXMgcHJlc2VudCwgc28gd2UgbXVzdCBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIHN5bWJvbHMgZm9yCisgKiB0aGlzIGZ1bmN0aW9uIHRvIHNlZSBpZiB0aGlzIHBhcmFtZXRlciBpcyBhc3NpZ25lZCB0byBhIHJlZ2lzdGVyLgorICovCisgIHsKKyAgICBzeW1ib2xTICpzcDE7CisgICAgY2hhciAqc3RyMTsKKyAgICBjaGFyICpwbnQyOworCisgICAgaWYgKCpwbnQgPT0gJ3AnKQorICAgICAgeworCWZvciAoc3AxID0gc3ltYm9sX25leHQgKHNwKTsgc3AxOyBzcDEgPSBzeW1ib2xfbmV4dCAoc3AxKSkKKwkgIHsKKwkgICAgaWYgKCFTX0lTX0RFQlVHIChzcDEpKQorCSAgICAgIGNvbnRpbnVlOworCSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwMSkgPT0gTl9GVU4pCisJICAgICAgeworCQlwbnQyID0gKGNoYXIgKikgc3RyY2hyIChTX0dFVF9OQU1FIChzcDEpLCAnOicpICsgMTsKKwkJaWYgKCpwbnQyID09ICdGJyB8fCAqcG50MiA9PSAnZicpCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwMSkgIT0gTl9SU1lNKQorCSAgICAgIGNvbnRpbnVlOworCSAgICBzdHIxID0gU19HRVRfTkFNRSAoc3AxKTsJLyogYW5kIGdldCB0aGUgbmFtZSAqLworCSAgICBwbnQyID0gc3RyOworCSAgICB3aGlsZSAoKnBudDIgIT0gJzonKQorCSAgICAgIHsKKwkJaWYgKCpwbnQyICE9ICpzdHIxKQorCQkgIGJyZWFrOworCQlwbnQyKys7CisJCXN0cjErKzsKKwkgICAgICB9CisJICAgIGlmICgqc3RyMSA9PSAnOicgJiYgKnBudDIgPT0gJzonKQorCSAgICAgIHJldHVybjsJLyogdGhleSBhcmUgdGhlIHNhbWUhICBsZXRzIHNraXAgdGhpcyBvbmUgKi8KKwkgIH0JCQkvKiBmb3IgKi8KKwlwbnQrKzsJCQkvKiBza2lwIHAgaW4gY2FzZSBubyByZWdpc3RlciAqLworICAgICAgfQkJCS8qIGlmICovCisgIH0JCQkJLyogcCBibG9jayAqLworCisgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQsICZkYnhfdHlwZSk7CisgIHNwbnQgPSBmaW5kX3N5bWJvbCAoZGJ4X3R5cGUpOworICBpZiAoIXNwbnQpCisgICAgcmV0dXJuOwkJCS8qRHVubm8gd2hhdCB0aGlzIGlzKi8KKyAgKnBudDEgPSAnXDAnOworICBWTVNfREJHX3JlY29yZCAoc3BudCwgLTEsIFNfR0VUX1ZBTFVFIChzcCksIHN0cik7CisgICpwbnQxID0gJzonOwkJCS8qIGFuZCByZXN0b3JlIHRoZSBzdHJpbmcgKi8KKyAgcmV0dXJuOworfQorCisKKy8qIFRoaXMgcm91dGluZSBwYXJzZXMgYSBzdGFicyBlbnRyeSB0byBmaW5kIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZAorICAgdG8gZGVmaW5lIGEgdmFyaWFibGUuICBJdCBpcyB1c2VkIGZvciBnbG9iYWwgYW5kIHN0YXRpYyB2YXJpYWJsZXMuCisgICBCYXNpY2FsbHkgd2UgbmVlZCB0byBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wuICBXaXRoIG9sZGVyCisgICB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIsIGNvbnN0IHN5bWJvbHMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHksIGluCisgICB0aGF0IGlmIHRoZXkgYXJlIGdsb2JhbCB0aGV5IGFyZSB3cml0dGVuIGludG8gdGhlIHRleHQgcHNlY3QuICBUaGUKKyAgIGdsb2JhbCBzeW1ib2wgZW50cnkgZm9yIHN1Y2ggYSBjb25zdCBpcyBhY3R1YWxseSB3cml0dGVuIGFzIGEgcHJvZ3JhbQorICAgZW50cnkgcG9pbnQgKFl1ayEhKSwgc28gaWYgd2UgY2Fubm90IGZpbmQgYSBzeW1ib2wgaW4gdGhlIGxpc3Qgb2YKKyAgIHBzZWN0cywgd2UgbXVzdCBzZWFyY2ggdGhlIGVudHJ5IHBvaW50cyBhcyB3ZWxsLiAgc3RhdGljIGNvbnN0cyBhcmUKKyAgIGV2ZW4gaGFyZGVyLCBzaW5jZSB0aGV5IGFyZSBuZXZlciBhc3NpZ25lZCBhIG1lbW9yeSBhZGRyZXNzLiAgVGhlCisgICBjb21waWxlciBwYXNzZXMgYSBzdGFiIHRvIHRlbGwgdXMgdGhlIHZhbHVlLCBidXQgSSBhbSBub3Qgc3VyZSB3aGF0CisgICB0byBkbyB3aXRoIGl0LiAgKi8KKworc3RhdGljIHZvaWQKK1ZNU19zdGFiX3BhcnNlIChzcCwgZXhwZWN0ZWRfdHlwZSwgdHlwZTEsIHR5cGUyLCBUZXh0X1BzZWN0KQorICAgICBzeW1ib2xTICpzcDsKKyAgICAgaW50IGV4cGVjdGVkX3R5cGU7CS8qIGNoYXIgKi8KKyAgICAgaW50IHR5cGUxLCB0eXBlMiwgVGV4dF9Qc2VjdDsKK3sKKyAgY2hhciAqcG50OworICBjaGFyICpwbnQxOworICBjaGFyICpzdHI7CisgIHN5bWJvbFMgKnNwMTsKKyAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OworICBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwOworICBpbnQgZGJ4X3R5cGU7CisKKyAgZGJ4X3R5cGUgPSAwOworICBzdHIgPSBTX0dFVF9OQU1FIChzcCk7CisgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpOworICBpZiAoIXBudCkKKyAgICByZXR1cm47CQkJLyogbm8gY29sb24gcHJlc2VudCAqLworICBwbnQxID0gcG50OwkJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIqLworICBwbnQrKzsKKyAgaWYgKCpwbnQgPT0gZXhwZWN0ZWRfdHlwZSkKKyAgICB7CisgICAgICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmRieF90eXBlKTsKKyAgICAgIHNwbnQgPSBmaW5kX3N5bWJvbCAoZGJ4X3R5cGUpOworICAgICAgaWYgKCFzcG50KQorCXJldHVybjsJCS8qRHVubm8gd2hhdCB0aGlzIGlzKi8KKyAgICAgIC8qCisgICAgICAgKiBOb3cgd2UgbmVlZCB0byBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSB0byBmaW5kIHRoZSBwc2VjdCBhbmQKKyAgICAgICAqIG9mZnNldCBmb3IgdGhpcyB2YXJpYWJsZS4KKyAgICAgICAqLworICAgICAgKnBudDEgPSAnXDAnOworICAgICAgdnNwID0gVk1TX1N5bWJvbHM7CisgICAgICB3aGlsZSAodnNwKQorCXsKKwkgIHBudCA9IFNfR0VUX05BTUUgKHZzcC0+U3ltYm9sKTsKKwkgIGlmIChwbnQgJiYgKnBudCsrID09ICdfJworCSAgICAgIC8qIG1ha2Ugc3VyZSBuYW1lIGlzIHRoZSBzYW1lIGFuZCBzeW1ib2wgdHlwZSBtYXRjaGVzICovCisJICAgICAgJiYgc3RyY21wIChwbnQsIHN0cikgPT0gMAorCSAgICAgICYmIChTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IHR5cGUxCisJCSAgfHwgU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSB0eXBlMikpCisJICAgIGJyZWFrOworCSAgdnNwID0gdnNwLT5OZXh0OworCX0KKyAgICAgIGlmICh2c3ApCisJeworCSAgVk1TX0RCR19yZWNvcmQgKHNwbnQsIHZzcC0+UHNlY3RfSW5kZXgsIHZzcC0+UHNlY3RfT2Zmc2V0LCBzdHIpOworCSAgKnBudDEgPSAnOic7CQkvKiBhbmQgcmVzdG9yZSB0aGUgc3RyaW5nICovCisJICByZXR1cm47CisJfQorICAgICAgLyogVGhlIHN5bWJvbCB3YXMgbm90IGluIHRoZSBzeW1ib2wgbGlzdCwgYnV0IGl0IG1heSBiZSBhbgorICAgICAgICAgImVudHJ5IHBvaW50IiBpZiBpdCB3YXMgYSBjb25zdGFudC4gICovCisgICAgICBmb3IgKHNwMSA9IHN5bWJvbF9yb290UDsgc3AxOyBzcDEgPSBzeW1ib2xfbmV4dCAoc3AxKSkKKwl7CisJICAvKgorCSAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCisJICAgKi8KKwkgIGlmIChTX0lTX0RFQlVHIChzcDEpIHx8IChTX0dFVF9UWVBFIChzcDEpICE9IE5fVEVYVCkpCisJICAgIGNvbnRpbnVlOworCSAgcG50ID0gU19HRVRfTkFNRSAoc3AxKTsKKwkgIGlmICgqcG50ID09ICdfJykKKwkgICAgcG50Kys7CisJICBpZiAoc3RyY21wIChwbnQsIHN0cikgPT0gMCkKKwkgICAgeworCSAgICAgIGlmICghZ2F2ZV9jb21waWxlcl9tZXNzYWdlICYmIGV4cGVjdGVkX3R5cGUgPT0gJ0cnKQorCQl7CisJCSAgY2hhciAqbG9uZ19jb25zdF9tc2cgPSBfKCJcCisqKipXYXJuaW5nIC0gdGhlIGFzc2VtYmx5IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBoYXMgcGxhY2VkIFxuXAorIGdsb2JhbCBjb25zdGFudChzKSBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoZXNlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0byBcblwKKyBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcblwKKyBoYXZlIHR3byBvcHRpb25zOiAxKSBnZXQgYSBwYXRjaGVkIGNvbXBpbGVyIHRoYXQgZG9lcyBub3QgcHV0IGdsb2JhbCBcblwKKyBjb25zdGFudHMgaW4gdGhlIHRleHQgcHNlY3QsIG9yIDIpIHJlbW92ZSB0aGUgJ2NvbnN0JyBrZXl3b3JkIGZyb20gXG5cCisgZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG5cCisgSSBkaWRuJ3Qgd2FybiB5b3UhIFxuIik7CisKKwkJICBhc190c2t0c2sgKGxvbmdfY29uc3RfbXNnKTsKKwkJICBnYXZlX2NvbXBpbGVyX21lc3NhZ2UgPSAxOworCQl9CisJICAgICAgVk1TX0RCR19yZWNvcmQgKHNwbnQsCisJCQkgICAgICBUZXh0X1BzZWN0LAorCQkJICAgICAgU19HRVRfVkFMVUUgKHNwMSksCisJCQkgICAgICBzdHIpOworCSAgICAgICpwbnQxID0gJzonOworCSAgICAgIC8qIGZvb2wgYXNzZW1ibGVyIHRvIG5vdCBvdXRwdXQgdGhpcyBhcyBhIHJvdXRpbmUgaW4gdGhlIFRCVCAqLworCSAgICAgIHBudDEgPSBTX0dFVF9OQU1FIChzcDEpOworCSAgICAgICpwbnQxID0gJ0wnOworCSAgICAgIFNfU0VUX05BTUUgKHNwMSwgcG50MSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKyAgKnBudDEgPSAnOic7CQkJLyogYW5kIHJlc3RvcmUgdGhlIHN0cmluZyAqLworICByZXR1cm47Cit9CisKKworLyogU2ltcGxlciBpbnRlcmZhY2VzIGludG8gVk1TX3N0YWJfcGFyc2UoKS4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfR1NZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCisgICAgIHN5bWJvbFMgKnNwOworICAgICBpbnQgVGV4dF9Qc2VjdDsKK3sJCQkJLyogR2xvYmFsIHZhcmlhYmxlcyAqLworICBWTVNfc3RhYl9wYXJzZSAoc3AsICdHJywgKE5fVU5ERiB8IE5fRVhUKSwgKE5fREFUQSB8IE5fRVhUKSwgVGV4dF9Qc2VjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitWTVNfTENTWU1fUGFyc2UgKHNwLCBUZXh0X1BzZWN0KQorICAgICBzeW1ib2xTICpzcDsKKyAgICAgaW50IFRleHRfUHNlY3Q7Cit7CQkJCS8qIFN0YXRpYyBzeW1ib2xzIC0gdW5pbml0aWFsaXplZCAqLworICBWTVNfc3RhYl9wYXJzZSAoc3AsICdTJywgTl9CU1MsIC0xLCBUZXh0X1BzZWN0KTsKK30KKworc3RhdGljIHZvaWQKK1ZNU19TVFNZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCisgICAgIHN5bWJvbFMgKnNwOworICAgICBpbnQgVGV4dF9Qc2VjdDsKK3sJCQkJLyogU3RhdGljIHN5bWJvbHMgLSBpbml0aWFsaXplZCAqLworICBWTVNfc3RhYl9wYXJzZSAoc3AsICdTJywgTl9EQVRBLCAtMSwgVGV4dF9Qc2VjdCk7Cit9CisKKworLyogRm9yIHJlZ2lzdGVyIHN5bWJvbHMsIHdlIG11c3QgZmlndXJlIG91dCB3aGF0IHJhbmdlIG9mIGFkZHJlc3NlcworICAgd2l0aGluIHRoZSBwc2VjdCBhcmUgdmFsaWQuICBXZSB3aWxsIHVzZSB0aGUgYnJhY2tldHMgaW4gdGhlIHN0YWIKKyAgIGRpcmVjdGl2ZXMgdG8gZ2l2ZSB1cyBndWlkYW5jZSBhcyB0byB0aGUgUEMgcmFuZ2UgdGhhdCB0aGlzIHZhcmlhYmxlCisgICBpcyBpbiBzY29wZS4gIEkgYW0gc3RpbGwgbm90IGNvbXBsZXRlbHkgY29tZm9ydGFibGUgd2l0aCB0aGlzIGJ1dAorICAgYXMgSSBsZWFybiBtb3JlLCBJIHNlZW0gdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB3aGF0IGlzIGdvaW5nIG9uLgorICAgQ2F2ZWF0IEVtcHRvci4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfUlNZTV9QYXJzZSAoc3AsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKKyAgICAgc3ltYm9sUyAqc3AsICpDdXJyZW50X1JvdXRpbmU7CisgICAgIGludCBUZXh0X1BzZWN0OworeworICBzeW1ib2xTICpzeW1ib2xQOworICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7CisgIGNoYXIgKnBudDsKKyAgY2hhciAqcG50MTsKKyAgY2hhciAqc3RyOworICBpbnQgZGJ4X3R5cGU7CisgIGludCBsZW47CisgIGludCBpID0gMDsKKyAgaW50IGJjbnQgPSAwOworICBpbnQgTWluX09mZnNldCA9IC0xOwkJLyogbWluIFBDIG9mIHZhbGlkaXR5ICovCisgIGludCBNYXhfT2Zmc2V0ID0gMDsJCS8qIG1heCBQQyBvZiB2YWxpZGl0eSAqLworCisgIGZvciAoc3ltYm9sUCA9IHNwOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKKyAgICAgICAqLworICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ltYm9sUCkpCisJeworCWNhc2UgTl9MQlJBQzoKKwkgIGlmIChiY250KysgPT0gMCkKKwkgICAgTWluX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKKwkgIGJyZWFrOworCWNhc2UgTl9SQlJBQzoKKwkgIGlmICgtLWJjbnQgPT0gMCkKKwkgICAgTWF4X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAtIDE7CisJICBicmVhazsKKwl9CisgICAgICBpZiAoKE1pbl9PZmZzZXQgIT0gLTEpICYmIChiY250ID09IDApKQorCWJyZWFrOworICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSA9PSBOX0ZVTikKKwl7CisJICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAnOicpICsgMTsKKwkgIGlmICgqcG50ID09ICdGJyB8fCAqcG50ID09ICdmJykgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgYWRkcmVzc2VzIHdlcmUgZGVmaW5lZC4gIElmIG5vdCwgdGhlbiB0aGVyZQorICAgICB3ZXJlIG5vIGJyYWNrZXRzIGluIHRoZSBmdW5jdGlvbiwgYW5kIHdlIG11c3QgdHJ5IHRvIHNlYXJjaCBmb3IKKyAgICAgdGhlIG5leHQgZnVuY3Rpb24uICBTaW5jZSBmdW5jdGlvbnMgY2FuIGJlIGluIGFueSBvcmRlciwgd2Ugc2hvdWxkCisgICAgIHNlYXJjaCBhbGwgb2YgdGhlIHN5bWJvbCBsaXN0IHRvIGZpbmQgdGhlIGNvcnJlY3QgZW5kaW5nIGFkZHJlc3MuICAqLworICBpZiAoTWluX09mZnNldCA9PSAtMSkKKyAgICB7CisgICAgICBpbnQgTWF4X1NvdXJjZV9PZmZzZXQ7CisgICAgICBpbnQgVGhpc19PZmZzZXQ7CisKKyAgICAgIE1pbl9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApOworICAgICAgTWF4X1NvdXJjZV9PZmZzZXQgPSBNaW5fT2Zmc2V0OwkvKiBqdXN0IGluIGNhc2Ugbm8gTl9TTElORXMgZm91bmQgKi8KKyAgICAgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKKwlzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKKwkgIHsKKwkgIGNhc2UgTl9URVhUIHwgTl9FWFQ6CisJICAgIFRoaXNfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOworCSAgICBpZiAoVGhpc19PZmZzZXQgPiBNaW5fT2Zmc2V0ICYmIFRoaXNfT2Zmc2V0IDwgTWF4X09mZnNldCkKKwkgICAgICBNYXhfT2Zmc2V0ID0gVGhpc19PZmZzZXQ7CisJICAgIGJyZWFrOworCSAgY2FzZSBOX1NMSU5FOgorCSAgICBUaGlzX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKKwkgICAgaWYgKFRoaXNfT2Zmc2V0ID4gTWF4X1NvdXJjZV9PZmZzZXQpCisJICAgICAgTWF4X1NvdXJjZV9PZmZzZXQgPSBUaGlzX09mZnNldDsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IHJvdXRpbmUsIHRoZW4gd2UgdXNlIHRoZSBQQyBvZiB0aGUgbGFzdCBzb3VyY2UKKyAgICAgICAgIGxpbmUgYXMgYSBtYXJrZXIgb2YgdGhlIG1heCBQQyBmb3Igd2hpY2ggdGhpcyByZWcgaXMgdmFsaWQuICAqLworICAgICAgaWYgKE1heF9PZmZzZXQgPT0gMHg3ZmZmZmZmZikKKwlNYXhfT2Zmc2V0ID0gTWF4X1NvdXJjZV9PZmZzZXQ7CisgICAgfQorCisgIGRieF90eXBlID0gMDsKKyAgc3RyID0gU19HRVRfTkFNRSAoc3ApOworICBpZiAoKHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpKSA9PSAwKQorICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCisgIHBudDEgPSBwbnQ7CQkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCisgIHBudCsrOworICBpZiAoKnBudCAhPSAncicpCisgICAgcmV0dXJuOworICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmRieF90eXBlKTsKKyAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7CisgIGlmICghc3BudCkKKyAgICByZXR1cm47CQkJLypEdW5ubyB3aGF0IHRoaXMgaXMgeWV0Ki8KKyAgKnBudDEgPSAnXDAnOworICBwbnQgPSBmaXhfbmFtZSAoU19HRVRfTkFNRSAoc3ApKTsJLyogaWYgdGhlcmUgYXJlIGJhZCBjaGFyYWN0ZXJzIGluIG5hbWUsIGNvbnZlcnQgdGhlbSAqLworICBsZW4gPSBzdHJsZW4gKHBudCk7CisgIExvY2FsW2krK10gPSAyNSArIGxlbjsKKyAgTG9jYWxbaSsrXSA9IHNwbnQtPlZNU190eXBlOworICBMb2NhbFtpKytdID0gRFNUX0tfVkZMQUdTX1RWUzsJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCisgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCAxICsgbGVuKTsJLyogcmVsYXRpdmUgb2Zmc2V0LCBiZXlvbmQgbmFtZSAqLworICBpICs9IDQ7CisgIExvY2FsW2krK10gPSBsZW47CQkJLyogbmFtZSBsZW5ndGggKGFzY2ljIHByZWZpeCkgKi8KKyAgd2hpbGUgKCpwbnQgIT0gJ1wwJykKKyAgICBMb2NhbFtpKytdID0gKnBudCsrOworICBMb2NhbFtpKytdID0gRFNUX0tfVlNfRk9MTE9XUzsJLyogdmFsdWUgc3BlY2lmaWNhdGlvbiBmb2xsb3dzICovCisgIENPUFlfU0hPUlQgKCZMb2NhbFtpXSwgMTUpOwkJLyogbGVuZ3RoIG9mIHJlc3Qgb2YgcmVjb3JkICovCisgIGkgKz0gMjsKKyAgTG9jYWxbaSsrXSA9IERTVF9LX1ZTX0FMTE9DX1NQTElUOwkvKiBzcGxpdCBsaWZldGltZSAqLworICBMb2NhbFtpKytdID0gMTsJCQkvKiBvbmUgYmluZGluZyBmb2xsb3dzICovCisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKKyAgaSA9IDA7CisgIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgTWluX09mZnNldCwgT0JKX1NfQ19EQkcsIDEpOworICBWTVNfU2V0X0RhdGEgKFRleHRfUHNlY3QsIE1heF9PZmZzZXQsIE9CSl9TX0NfREJHLCAxKTsKKyAgTG9jYWxbaSsrXSA9IERTVF9LX1ZBTEtJTkRfUkVHOwkJLyogbmVzdGVkIHZhbHVlIHNwZWMgKi8KKyAgQ09QWV9MT05HICgmTG9jYWxbaV0sIFNfR0VUX1ZBTFVFIChzcCkpOworICBpICs9IDQ7CisgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKKyAgKnBudDEgPSAnOic7CisgIGlmIChzcG50LT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCisgICAgZ2VuZXJhdGVfc3VmZml4IChzcG50LCAwKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGV4YW1pbmVzIGEgc3RydWN0dXJlIGRlZmluaXRpb24sIGNoZWNraW5nIGFsbCBvZiB0aGUgZWxlbWVudHMKKyAgIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGVtIGFyZSBmdWxseSBkZWZpbmVkLiAgVGhlIG9ubHkgdGhpbmcgdGhhdCB3ZQorICAga2ljayBvdXQgYXJlIGFycmF5cyBvZiB1bmRlZmluZWQgc3RydWN0cywgc2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZworICAgdGhleSBhcmUuICBBbGwgb3RoZXJzIHdlIGNhbiBoYW5kbGUgd2l0aCBhIG5vcm1hbCBmb3J3YXJkIHJlZmVyZW5jZS4gICovCisKK3N0YXRpYyBpbnQKK2ZvcndhcmRfcmVmZXJlbmNlIChwbnQpCisgICAgIGNoYXIgKnBudDsKK3sKKyAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50LCAqc3BudDE7CisgIGludCBpOworCisgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7CisgIGlmICgqcG50ID09ICc7JykKKyAgICByZXR1cm4gMDsJCQkvKiBubyBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KKyAgZG8KKyAgICB7CisgICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHBudCwgJzonKTsKKyAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7CisgICAgICBzcG50ID0gZmluZF9zeW1ib2wgKGkpOworICAgICAgd2hpbGUgKHNwbnQgJiYgKHNwbnQtPmFkdmFuY2VkID09IFBPSU5URVIgfHwgc3BudC0+YWR2YW5jZWQgPT0gQVJSQVkpKQorCXsKKwkgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKKwkgIGlmIChzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSAmJiAhc3BudDEpCisJICAgIHJldHVybiAxOworCSAgc3BudCA9IHNwbnQxOworCX0KKyAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7CisgICAgICBwbnQgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmkpOworICAgIH0gd2hpbGUgKCorK3BudCAhPSAnOycpOworICByZXR1cm4gMDsJCQkvKiBubyBmb3J3YXJkIHJlZmVuY2VzIGZvdW5kICovCit9CisKKworLyogVXNlZCB0byBjaGVjayBhIHNpbmdsZSBlbGVtZW50IG9mIGEgc3RydWN0dXJlIG9uIHRoZSBmaW5hbCBwYXNzLiAgKi8KKworc3RhdGljIGludAorZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UgKHNwbnQpCisgICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKK3sKKyAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKKworICB3aGlsZSAoc3BudCAmJiAoc3BudC0+YWR2YW5jZWQgPT0gUE9JTlRFUiB8fCBzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSkpCisgICAgeworICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOworICAgICAgaWYgKHNwbnQtPmFkdmFuY2VkID09IEFSUkFZICYmICFzcG50MSkKKwlyZXR1cm4gMTsKKyAgICAgIHNwbnQgPSBzcG50MTsKKyAgICB9CisgIHJldHVybiAwOwkvKiBubyBmb3J3YXJkIHJlZmVuY2VzIGZvdW5kICovCit9CisKKworLyogVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgc3RhYnMgZGlyZWN0aXZlcyB0byBmaW5kIGFueSBkZWZpbml0aW9ucyBvZiBkYngKKyAgIHR5cGUgbnVtYmVycy4gIEl0IG1ha2VzIGEgbm90ZSBvZiBhbGwgb2YgdGhlbSwgY3JlYXRpbmcgYSBzdHJ1Y3R1cmUKKyAgIGVsZW1lbnQgb2YgVk1TX0RCR19TeW1ib2wgdGhhdCBkZXNjcmliZXMgaXQuICBUaGlzIGFsc28gZ2VuZXJhdGVzIHRoZQorICAgaW5mbyBmb3IgdGhlIGRlYnVnZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3QvdW5pb24vZW51bSwgc28gdGhhdAorICAgZnVydGhlciByZWZlcmVuY2VzIHRvIHRoZXNlIGRhdGEgdHlwZXMgd2lsbCBiZSBieSBudW1iZXIKKworICAgV2UgaGF2ZSB0byBwcm9jZXNzIHBvaW50ZXJzIHJpZ2h0IGF3YXksIHNpbmNlIHRoZXJlIGNhbiBiZSByZWZlcmVuY2VzCisgICB0byB0aGVtIGxhdGVyIGluIHRoZSBzYW1lIHN0YWJzIGRpcmVjdGl2ZS4gIFdlIGNhbm5vdCBoYXZlIGZvcndhcmQKKyAgIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMsIChidXQgd2UgY2FuIGhhdmUgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhCisgICBwb2ludGVyIHRvIGEgc3RydWN0dXJlL2VudW0vdW5pb24pIGFuZCB0aGlzIGlzIHdoeSB3ZSBwcm9jZXNzIHRoZW0KKyAgIGltbWVkaWF0ZWx5LiAgQWZ0ZXIgd2UgcHJvY2VzcyB0aGUgcG9pbnRlciwgdGhlbiB3ZSBzZWFyY2ggZm9yIGRlZnMKKyAgIHRoYXQgYXJlIG5lc3RlZCBldmVuIGRlZXBlci4KKworICAgOC8xNS85MjogV2UgaGF2ZSB0byBwcm9jZXNzIGFycmF5cyByaWdodCBhd2F5IHRvbywgYmVjYXVzZSB0aGVyZSBjYW4KKyAgIGJlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gaWRlbnRpY2FsIGFycmF5IHR5cGVzIGluIG9uZSBzdHJ1Y3R1cmUKKyAgIGRlZmluaXRpb24sIGFuZCBvbmx5IHRoZSBmaXJzdCBvbmUgaGFzIHRoZSBkZWZpbml0aW9uLiAgKi8KKworc3RhdGljIGludAorVk1TX3R5cGVkZWZfcGFyc2UgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICpwbnQ7CisgIGNoYXIgKnBudDE7CisgIGNvbnN0IGNoYXIgKnBudDI7CisgIGludCBpOworICBpbnQgZHR5cGU7CisgIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKKyAgaW50IGkxLCBpMiwgaTMsIGxlbjsKKyAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OworICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQxOworCisgIC8qIGNoZWNrIGZvciBhbnkgbmVzdGVkIGRlZidzICovCisgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKKyAgaWYgKHBudCAmJiBzdHJbMV0gIT0gJyonICYmIChzdHJbMV0gIT0gJ2EnIHx8IHN0clsyXSAhPSAncicpCisgICAgICAmJiBWTVNfdHlwZWRlZl9wYXJzZSAocG50KSA9PSAxKQorICAgIHJldHVybiAxOworICAvKiBub3cgZmluZCBkYnhfdHlwZSBvZiBlbnRyeSAqLworICBwbnQgPSBzdHIgLSAxOworICBpZiAoKnBudCA9PSAnYycpCisgICAgewkJCQkvKiBjaGVjayBmb3Igc3RhdGljIGNvbnN0YW50cyAqLworICAgICAgKnN0ciA9ICdcMCc7CQkvKiBmb3Igbm93IHdlIGlnbm9yZSB0aGVtICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHdoaWxlICgoKnBudCA8PSAnOScpICYmICgqcG50ID49ICcwJykpCisgICAgcG50LS07CisgIHBudCsrOwkJCS8qIGFuZCBnZXQgYmFjayB0byB0aGUgbnVtYmVyICovCisgIGN2dF9pbnRlZ2VyIChwbnQsICZpMSk7CisgIHNwbnQgPSBmaW5kX3N5bWJvbCAoaTEpOworICAvKiBmaXJzdCBzZWUgaWYgdGhpcyBoYXMgYmVlbiBkZWZpbmVkIGFscmVhZHksIGR1ZSB0byBmb3J3YXJkIHJlZmVyZW5jZSAqLworICBpZiAoIXNwbnQpCisgICAgeworICAgICAgaTIgPSBTWU1UWVBfSEFTSCAoaTEpOworICAgICAgc3BudCA9IChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wpKTsKKyAgICAgIHNwbnQtPm5leHQgPSBWTVNfU3ltYm9sX3R5cGVfbGlzdFtpMl07CisgICAgICBWTVNfU3ltYm9sX3R5cGVfbGlzdFtpMl0gPSBzcG50OworICAgICAgc3BudC0+ZGJ4X3R5cGUgPSBpMTsJLyogYW5kIHNhdmUgdGhlIHR5cGUgKi8KKyAgICAgIHNwbnQtPnR5cGUyID0gc3BudC0+Vk1TX3R5cGUgPSBzcG50LT5kYXRhX3NpemUgPSAwOworICAgICAgc3BudC0+aW5kZXhfbWluID0gc3BudC0+aW5kZXhfbWF4ID0gc3BudC0+c3RydWNfbnVtYiA9IDA7CisgICAgfQorICAvKgorICAgKiBGb3Igc3RydWN0cyBhbmQgdW5pb25zLCBkbyBhIHBhcnRpYWwgcGFyc2UsIG90aGVyd2lzZSB3ZSBzb21ldGltZXMgZ2V0CisgICAqIGNpcmN1bGFyIGRlZmluaXRpb25zIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVzb2x2ZS4gIFdlIHJlYWQgZW5vdWdoCisgICAqIGluZm8gc28gdGhhdCBhbnkgcmVmZXJlbmNlIHRvIHRoaXMgdHlwZSBoYXMgZW5vdWdoIGluZm8gdG8gYmUgcmVzb2x2ZWQuCisgICAqLworICBwbnQgPSBzdHIgKyAxOwkJLyogcG9pbnQgdG8gY2hhcmFjdGVyIHBhc3QgZXF1YWwgc2lnbiAqLworICBpZiAoKnBudCA+PSAnMCcgJiYgKnBudCA8PSAnOScpCisgICAgeworICAgICAgaWYgKHR5cGVfY2hlY2sgKCJ2b2lkIikpCisJewkJCS8qIHRoaXMgaXMgdGhlIHZvaWQgc3ltYm9sICovCisJICAqc3RyID0gJ1wwJzsKKwkgIHNwbnQtPmFkdmFuY2VkID0gVk9JRDsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGlmICh0eXBlX2NoZWNrICgidW5rbm93biB0eXBlIikpCisJeworCSAgKnN0ciA9ICdcMCc7CisJICBzcG50LT5hZHZhbmNlZCA9IFVOS05PV047CisJICByZXR1cm4gMDsKKwl9CisgICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCwgJmkxKTsKKyAgICAgIGlmIChpMSAhPSBzcG50LT5kYnhfdHlwZSkKKwl7CisJICBzcG50LT5hZHZhbmNlZCA9IEFMSUFTOworCSAgc3BudC0+dHlwZTIgPSBpMTsKKwkgIHN0cmNweSAoc3RyLCBwbnQxKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iKSwKKwkJIHNwbnQtPmRieF90eXBlKTsKKyAgICAgIHJldHVybiAxOwkJCS8qIGRvIG5vdCBrbm93IHdoYXQgdGhpcyBpcyAqLworICAgIH0KKworICBwbnQgPSBzdHIgKyAxOwkJLyogcG9pbnQgdG8gY2hhcmFjdGVyIHBhc3QgZXF1YWwgc2lnbiAqLworICBzd2l0Y2ggKCpwbnQpCisgICAgeworICAgIGNhc2UgJ3InOgorICAgICAgc3BudC0+YWR2YW5jZWQgPSBCQVNJQzsKKyAgICAgIGlmICh0eXBlX2NoZWNrICgiaW50IikpCisJeworCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NMSU5UOworCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKKwl9CisgICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgibG9uZyBpbnQiKSkKKwl7CisJICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0xJTlQ7CisJICBzcG50LT5kYXRhX3NpemUgPSA0OworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJ1bnNpZ25lZCBpbnQiKSkKKwl7CisJICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVUxJTlQ7CisJICBzcG50LT5kYXRhX3NpemUgPSA0OworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIHVuc2lnbmVkIGludCIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VTElOVDsKKwkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7CisJfQorICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNob3J0IGludCIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TU0lOVDsKKwkgIHNwbnQtPmRhdGFfc2l6ZSA9IDI7CisJfQorICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNob3J0IHVuc2lnbmVkIGludCIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VU0lOVDsKKwkgIHNwbnQtPmRhdGFfc2l6ZSA9IDI7CisJfQorICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImNoYXIiKSkKKwl7CisJICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0NIQVI7CisJICBzcG50LT5kYXRhX3NpemUgPSAxOworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJzaWduZWQgY2hhciIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TQ0hBUjsKKwkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7CisJfQorICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInVuc2lnbmVkIGNoYXIiKSkKKwl7CisJICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVUNIQVI7CisJICBzcG50LT5kYXRhX3NpemUgPSAxOworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJmbG9hdCIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19SRUFMNDsKKwkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7CisJfQorICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImRvdWJsZSIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfUkVBTDhfRyA6IERCR19TX0NfUkVBTDg7CisJICBzcG50LT5kYXRhX3NpemUgPSA4OworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGRvdWJsZSIpKQorCXsKKwkgIC8qIHNhbWUgYXMgZG91YmxlLCBhdCBsZWFzdCBmb3Igbm93ICovCisJICBzcG50LT5WTVNfdHlwZSA9IHZheF9nX2RvdWJsZXMgPyBEQkdfU19DX1JFQUw4X0cgOiBEQkdfU19DX1JFQUw4OworCSAgc3BudC0+ZGF0YV9zaXplID0gODsKKwl9CisgICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgibG9uZyBsb25nIGludCIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TUVVBRDsJLyogc2lnbmVkIHF1YWR3b3JkICovCisJICBzcG50LT5kYXRhX3NpemUgPSA4OworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGxvbmcgdW5zaWduZWQgaW50IikpCisJeworCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VRVUFEOwkvKiB1bnNpZ25lZCBxdWFkd29yZCAqLworCSAgc3BudC0+ZGF0YV9zaXplID0gODsKKwl9CisgICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBmbG9hdCIpKQorCXsKKwkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19DT01QTFg0OworCSAgc3BudC0+ZGF0YV9zaXplID0gMiAqIDQ7CisJfQorICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImNvbXBsZXggZG91YmxlIikpCisJeworCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19DT01QTFg4X0cgOiBEQkdfU19DX0NPTVBMWDg7CisJICBzcG50LT5kYXRhX3NpemUgPSAyICogODsKKwl9CisgICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBsb25nIGRvdWJsZSIpKQorCXsKKwkgIC8qIHNhbWUgYXMgY29tcGxleCBkb3VibGUsIGF0IGxlYXN0IGZvciBub3cgKi8KKwkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfQ09NUExYOF9HIDogREJHX1NfQ19DT01QTFg4OworCSAgc3BudC0+ZGF0YV9zaXplID0gMiAqIDg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qCVtwcl0KKwkgICAqIFNob3VsZG4ndCBnZXQgaGVyZSwgYnV0IGlmIHdlIGRvLCBzb21ldGhpbmcKKwkgICAqIG1vcmUgc3Vic3RhbnRpYWwgb3VnaHQgdG8gYmUgZG9uZS4uLgorCSAgICovCisJICBzcG50LT5WTVNfdHlwZSA9IDA7CisJICBzcG50LT5kYXRhX3NpemUgPSAwOworCX0KKyAgICAgIGlmIChzcG50LT5WTVNfdHlwZSAhPSAwKQorCXNldHVwX2Jhc2ljX3R5cGUgKHNwbnQpOworICAgICAgcG50MSA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOycpICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgIGNhc2UgJ3UnOgorICAgICAgc3BudC0+YWR2YW5jZWQgPSAoKnBudCA9PSAncycpID8gU1RSVUNUIDogVU5JT047CisgICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsKKyAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPmRhdGFfc2l6ZSk7CisgICAgICBpZiAoIWZpbmFsX3Bhc3MgJiYgZm9yd2FyZF9yZWZlcmVuY2UgKHBudCkpCisJeworCSAgc3BudC0+c3RydWNfbnVtYiA9IC0xOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OworICAgICAgcG50MS0tOworICAgICAgcG50ID0gZ2V0X3N0cnVjdF9uYW1lIChzdHIpOworICAgICAgVk1TX0RlZl9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOworICAgICAgaSA9IDA7CisgICAgICBmb3IgKGZwbnQgPSBmX3JlZl9yb290OyBmcG50OyBmcG50ID0gZnBudC0+bmV4dCkKKwlpZiAoZnBudC0+ZGJ4X3R5cGUgPT0gc3BudC0+ZGJ4X3R5cGUpCisJICB7CisJICAgIGZwbnQtPnJlc29sdmVkID0gJ1knOworCSAgICBWTVNfU2V0X1N0cnVjdCAoZnBudC0+c3RydWNfbnVtYik7CisJICAgIFZNU19TdG9yZV9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOworCSAgICBpKys7CisJICB9CisgICAgICBpZiAoaSA+IDApCisJVk1TX1NldF9TdHJ1Y3QgKHNwbnQtPnN0cnVjX251bWIpOworICAgICAgaSA9IDA7CisgICAgICBMb2NhbFtpKytdID0gMTEgKyBzdHJsZW4gKHBudCk7CisgICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfU1RBUlQ7CisgICAgICBMb2NhbFtpKytdID0gRFNUX0tfVkZMQUdTX05PVkFMOwkvKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBvbmx5ICovCisgICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgMEwpOwkvKiBoZW5jZSB2YWx1ZSBpcyB1bnVzZWQgKi8KKyAgICAgIGkgKz0gNDsKKyAgICAgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudCk7CisgICAgICBwbnQyID0gcG50OworICAgICAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCisJTG9jYWxbaSsrXSA9ICpwbnQyKys7CisgICAgICBpMiA9IHNwbnQtPmRhdGFfc2l6ZSAqIDg7CS8qIG51bWJlciBvZiBiaXRzICovCisgICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTIpOworICAgICAgaSArPSA0OworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOworICAgICAgaSA9IDA7CisgICAgICBpZiAocG50ICE9IHN5bWJvbF9uYW1lKQorCXsKKwkgIHBudCArPSBzdHJsZW4gKHBudCk7CisJICAqcG50ID0gJzonOworCX0JCQkvKiByZXBsYWNlIGNvbG9uIGZvciBsYXRlciAqLworICAgICAgd2hpbGUgKCorK3BudDEgIT0gJzsnKQorCXsKKwkgIHBudCA9IChjaGFyICopIHN0cmNociAocG50MSwgJzonKTsKKwkgICpwbnQgPSAnXDAnOworCSAgcG50MiA9IHBudDE7CisJICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZkdHlwZSk7CisJICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmaTIpOworCSAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQxICsgMSwgJmkzKTsKKwkgIHNwbnQxID0gZmluZF9zeW1ib2wgKGR0eXBlKTsKKwkgIGxlbiA9IHN0cmxlbiAocG50Mik7CisJICBpZiAoc3BudDEgJiYgKHNwbnQxLT5hZHZhbmNlZCA9PSBCQVNJQyB8fCBzcG50MS0+YWR2YW5jZWQgPT0gRU5VTSkKKwkgICAgICAmJiAoKGkzICE9IHNwbnQxLT5kYXRhX3NpemUgKiA4KSB8fCAoaTIgJSA4ICE9IDApKSkKKwkgICAgewkJCS8qIGJpdGZpZWxkICovCisJICAgICAgaWYgKFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUiAoc3BudDEpKQorCQl7CisJCSAgLyogVGhpcyB1c2VzIGEgdHlwZSBkZXNjcmlwdG9yLCB3aGljaCBkb2Vzbid0IHdvcmsgaWYKKwkJICAgICB0aGUgZW5jbG9zaW5nIHN0cnVjdHVyZSBoYXMgYmVlbiBwbGFjZWQgaW4gYSByZWdpc3Rlci4KKwkJICAgICBBbHNvLCBlbnVtIGJpdGZpZWxkcyBkZWdlbmVyYXRlIHRvIHNpbXBsZSBpbnRlZ2Vycy4gICovCisJCSAgaW50IHVuc2lnbmVkX3R5cGUgPSAoc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVUxJTlQKKwkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVVNJTlQKKwkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVUNIQVIKKwkJCQkgICAgfHwgc3BudDEtPlZNU190eXBlID09IERCR19TX0NfVVFVQUQKKwkJCQkgICAgfHwgc3BudDEtPmFkdmFuY2VkID09IEVOVU0pOyAvKiAoYXBwcm94aW1hdGUpICovCisJCSAgQXBvaW50ID0gMDsKKwkJICBmcHVzaCAoMTkgKyBsZW4sIDEpOworCQkgIGZwdXNoICh1bnNpZ25lZF90eXBlID8gREJHX1NfQ19VQklUVSA6IERCR19TX0NfU0JJVFUsIDEpOworCQkgIGZwdXNoIChEU1RfS19WRkxBR1NfRFNDLCAxKTsJLyogc3BlY2lmaWVkIGJ5IGRlc2NyaXB0b3IgKi8KKwkJICBmcHVzaCAoMSArIGxlbiwgNCk7CS8qIHJlbGF0aXZlIG9mZnNldCB0byBkZXNjcmlwdG9yICovCisJCSAgZnB1c2ggKGxlbiwgMSk7CQkvKiBsZW5ndGggYnl0ZSAoYXNjaWMgcHJlZml4KSAqLworCQkgIHdoaWxlICgqcG50MiAhPSAnXDAnKQkvKiBuYW1lIGJ5dGVzICovCisJCSAgICBmcHVzaCAoKnBudDIrKywgMSk7CisJCSAgZnB1c2ggKGkzLCAyKTsJLyogZHNjIGxlbmd0aCA9PSBzaXplIG9mIGJpdGZpZWxkICovCisJCQkJCS8qIGRzYyB0eXBlID09IHVuP3NpZ25lZCBiaXRmaWVsZCAqLworCQkgIGZwdXNoICh1bnNpZ25lZF90eXBlID8gREJHX1NfQ19VQklUVSA6IERCR19TX0NfU0JJVFUsIDEpOworCQkgIGZwdXNoIChEU0NfS19DTEFTU19VQlMsIDEpOwkvKiBkc2MgY2xhc3MgPT0gdW5hbGlnbmVkIGJpdHN0cmluZyAqLworCQkgIGZwdXNoICgweDAwLCA0KTsJCS8qIGRzYyBwb2ludGVyID09IHplcm9lcyAqLworCQkgIGZwdXNoIChpMiwgNCk7CS8qIHN0YXJ0IHBvc2l0aW9uICovCisJCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChBc3VmZml4LCBBcG9pbnQsIE9CSl9TX0NfREJHKTsKKwkJICBBcG9pbnQgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogVXNlIGEgIm5vdmVsIGxlbmd0aCIgdHlwZSBzcGVjaWZpY2F0aW9uLCB3aGljaCB3b3JrcworCQkgICAgIHJpZ2h0IGZvciByZWdpc3RlciBzdHJ1Y3R1cmVzIGFuZCBmb3IgZW51bSBiaXRmaWVsZHMKKwkJICAgICBidXQgcmVzdWx0cyBpbiBsYXJnZXIgb2JqZWN0IG1vZHVsZXMuICAqLworCQkgIExvY2FsW2krK10gPSA3ICsgbGVuOworCQkgIExvY2FsW2krK10gPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7CS8qIHR5cGUgc3BlYyBmb2xsb3dzICovCisJCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfU1RSVUNUX0lURU07CS8qIHZhbHVlIGlzIGEgYml0IG9mZnNldCAqLworCQkgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7CQkvKiBiaXQgb2Zmc2V0ICovCisJCSAgaSArPSA0OworCQkgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudDIpOworCQkgIHdoaWxlICgqcG50MiAhPSAnXDAnKQorCQkgICAgTG9jYWxbaSsrXSA9ICpwbnQyKys7CisJCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOworCQkgIGkgPSAwOworCQkgIGJpdGZpZWxkX3N1ZmZpeCAoc3BudDEsIGkzKTsKKwkgICAgIH0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CQkJLyogbm90IGEgYml0ZmllbGQgKi8KKwkgICAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGEgZm9yd2FyZCByZWZlcmVuY2UgKi8KKwkgICAgICBpZiAoZmluYWxfcGFzcyAmJiBmaW5hbF9mb3J3YXJkX3JlZmVyZW5jZSAoc3BudDEpKQorCQl7CisJCSAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dlciBvdXRwdXQ6IHN0cnVjdHVyZSBlbGVtZW50IGAlcycgaGFzIHVuZGVmaW5lZCB0eXBlIiksCisJCQkgICBwbnQyKTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIExvY2FsW2krK10gPSA3ICsgbGVuOworCSAgICAgIExvY2FsW2krK10gPSBzcG50MSA/IHNwbnQxLT5WTVNfdHlwZSA6IERCR19TX0NfQURWQU5DRURfVFlQRTsKKwkgICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfSVRFTTsKKwkgICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTIpOwkJLyogYml0IG9mZnNldCAqLworCSAgICAgIGkgKz0gNDsKKwkgICAgICBMb2NhbFtpKytdID0gc3RybGVuIChwbnQyKTsKKwkgICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKKwkJTG9jYWxbaSsrXSA9ICpwbnQyKys7CisJICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOworCSAgICAgIGkgPSAwOworCSAgICAgIGlmICghc3BudDEpCisJCWdlbmVyYXRlX3N1ZmZpeCAoc3BudDEsIGR0eXBlKTsKKwkgICAgICBlbHNlIGlmIChzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQorCQlnZW5lcmF0ZV9zdWZmaXggKHNwbnQxLCAwKTsKKwkgICAgfQorCX0KKyAgICAgIHBudDErKzsKKyAgICAgIExvY2FsW2krK10gPSAweDAxOwkvKiBsZW5ndGggYnl0ZSAqLworICAgICAgTG9jYWxbaSsrXSA9IERCR19TX0NfU1RSVUNUX0VORDsKKyAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKKyAgICAgIGkgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZSc6CisgICAgICBzcG50LT5hZHZhbmNlZCA9IEVOVU07CisgICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsKKyAgICAgIHNwbnQtPnN0cnVjX251bWIgPSArK3N0cnVjdHVyZV9jb3VudDsKKyAgICAgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7CisgICAgICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CisgICAgICBpID0gMDsKKyAgICAgIGZvciAoZnBudCA9IGZfcmVmX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQorCWlmIChmcG50LT5kYnhfdHlwZSA9PSBzcG50LT5kYnhfdHlwZSkKKwkgIHsKKwkgICAgZnBudC0+cmVzb2x2ZWQgPSAnWSc7CisJICAgIFZNU19TZXRfU3RydWN0IChmcG50LT5zdHJ1Y19udW1iKTsKKwkgICAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CisJICAgIGkrKzsKKwkgIH0KKyAgICAgIGlmIChpID4gMCkKKwlWTVNfU2V0X1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CisgICAgICBpID0gMDsKKyAgICAgIGxlbiA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOworICAgICAgTG9jYWxbaSsrXSA9IDMgKyBsZW47CisgICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19FTlVNX1NUQVJUOworICAgICAgTG9jYWxbaSsrXSA9IDQgKiA4OwkJLyogZW51bSB2YWx1ZXMgYXJlIDMyIGJpdHMgKi8KKyAgICAgIExvY2FsW2krK10gPSBsZW47CisgICAgICBwbnQyID0gc3ltYm9sX25hbWU7CisgICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKKwlMb2NhbFtpKytdID0gKnBudDIrKzsKKyAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIGksIE9CSl9TX0NfREJHKTsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKCorK3BudCAhPSAnOycpCisJeworCSAgcG50MSA9IChjaGFyICopIHN0cmNociAocG50LCAnOicpOworCSAgKnBudDErKyA9ICdcMCc7CisJICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEsICZpMSk7CisJICBsZW4gPSBzdHJsZW4gKHBudCk7CisJICBMb2NhbFtpKytdID0gNyArIGxlbjsKKwkgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fSVRFTTsKKwkgIExvY2FsW2krK10gPSBEU1RfS19WQUxLSU5EX0xJVEVSQUw7CisJICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgaTEpOworCSAgaSArPSA0OworCSAgTG9jYWxbaSsrXSA9IGxlbjsKKwkgIHBudDIgPSBwbnQ7CisJICB3aGlsZSAoKnBudCAhPSAnXDAnKQorCSAgICBMb2NhbFtpKytdID0gKnBudCsrOworCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOworCSAgaSA9IDA7CisJICBwbnQgPSBwbnQxOwkJLyogU2tpcCBmaW5hbCBzZW1pY29sb24gKi8KKwl9CisgICAgICBMb2NhbFtpKytdID0gMHgwMTsJLyogbGVuIGJ5dGUgKi8KKyAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fRU5EOworICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOworICAgICAgaSA9IDA7CisgICAgICBwbnQxID0gcG50ICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOgorICAgICAgc3BudC0+YWR2YW5jZWQgPSBBUlJBWTsKKyAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOworICAgICAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChwbnQsICc7Jyk7CisgICAgICBpZiAoIXBudCkKKwlyZXR1cm4gMTsKKyAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPmluZGV4X21pbik7CisgICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmc3BudC0+aW5kZXhfbWF4KTsKKyAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZzcG50LT50eXBlMik7CisgICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciArIDEsICc9Jyk7CisgICAgICBpZiAocG50ICYmIFZNU190eXBlZGVmX3BhcnNlIChwbnQpID09IDEpCisJcmV0dXJuIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgIHNwbnQtPmFkdmFuY2VkID0gRlVOQ1RJT047CisgICAgICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfRlVOQ1RJT05fQUREUjsKKyAgICAgIC8qIHRoaXMgbWFzcXVlcmFkZXMgYXMgYSBiYXNpYyB0eXBlKi8KKyAgICAgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7CisgICAgICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZzcG50LT50eXBlMik7CisgICAgICBicmVhazsKKyAgICBjYXNlICcqJzoKKyAgICAgIHNwbnQtPmFkdmFuY2VkID0gUE9JTlRFUjsKKyAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOworICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKKyAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPnR5cGUyKTsKKyAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKKyAgICAgIGlmIChwbnQgJiYgVk1TX3R5cGVkZWZfcGFyc2UgKHBudCkgPT0gMSkKKwlyZXR1cm4gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcG50LT5hZHZhbmNlZCA9IFVOS05PV047CisgICAgICBzcG50LT5WTVNfdHlwZSA9IDA7CisgICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIpLAorCQkgc3BudC0+ZGJ4X3R5cGUpOworICAgICAgcmV0dXJuIDE7CQkJLyogdW5hYmxlIHRvIGRlY2lwaGVyICovCisgICAgfQorICAvKiBUaGlzIHJlbW92ZXMgdGhlIGV2aWRlbmNlIG9mIHRoZSBkZWZpbml0aW9uIHNvIHRoYXQgdGhlIG91dGVyIGxldmVscworICAgICBvZiBwYXJzaW5nIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0LiAgKi8KKyAgcG50ID0gc3RyOworICB3aGlsZSAoKnBudDEgIT0gJ1wwJykKKyAgICAqcG50KysgPSAqcG50MSsrOworICAqcG50ID0gJ1wwJzsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogVGhpcyBpcyB0aGUgcm9vdCByb3V0aW5lIHRoYXQgcGFyc2VzIHRoZSBzdGFicyBlbnRyaWVzIGZvciBkZWZpbml0aW9ucy4KKyAgIGl0IGNhbGxzIFZNU190eXBlZGVmX3BhcnNlLCB3aGljaCBjYW4gaW4gdHVybiBjYWxsIGl0c2VsZi4gIFdlIG5lZWQgdG8KKyAgIGJlIGNhcmVmdWwsIHNpbmNlIHNvbWV0aW1lcyB0aGVyZSBhcmUgZm9yd2FyZCByZWZlcmVuY2VzIHRvIG90aGVyIHN5bWJvbAorICAgdHlwZXMsIGFuZCB0aGVzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdW50aWwgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIHBhcnNlLgorCisgICBBbHNvIGNoZWNrIGFuZCBzZWUgaWYgd2UgYXJlIHVzaW5nIGNvbnRpbnVhdGlvbiBzdGFicywgaWYgd2UgYXJlLCB0aGVuCisgICBwYXN0ZSB0b2dldGhlciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBzdGFiIGJlZm9yZSB3ZSBwYXNzIGl0IHRvCisgICBWTVNfdHlwZWRlZl9wYXJzZS4gICovCisKK3N0YXRpYyB2b2lkCitWTVNfTFNZTV9QYXJzZSAoKQoreworICBjaGFyICpwbnQ7CisgIGNoYXIgKnBudDE7CisgIGNoYXIgKnBudDI7CisgIGNoYXIgKnN0cjsKKyAgY2hhciAqcGFyc2VfYnVmZmVyID0gMDsKKyAgY2hhciBmaXhpdFsxMF07CisgIGludCBpbmNvbXBsZXRlLCBwYXNzLCBpbmNvbTE7CisgIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKKyAgc3ltYm9sUyAqc3A7CisKKyAgcGFzcyA9IDA7CisgIGZpbmFsX3Bhc3MgPSAwOworICBpbmNvbXBsZXRlID0gMDsKKyAgZG8KKyAgICB7CisgICAgICBpbmNvbTEgPSBpbmNvbXBsZXRlOworICAgICAgaW5jb21wbGV0ZSA9IDA7CisgICAgICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQorCXsKKwkgIC8qCisJICAgKglEZWFsIHdpdGggU1RBQiBzeW1ib2xzCisJICAgKi8KKwkgIGlmIChTX0lTX0RFQlVHIChzcCkpCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQorCSAgICAgICAqLworCSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHNwKSkKKwkJeworCQljYXNlIE5fR1NZTToKKwkJY2FzZSBOX0xDU1lNOgorCQljYXNlIE5fU1RTWU06CisJCWNhc2UgTl9QU1lNOgorCQljYXNlIE5fUlNZTToKKwkJY2FzZSBOX0xTWU06CisJCWNhc2UgTl9GVU46CS8qc29tZXRpbWVzIHRoZXNlIGNvbnRhaW4gdHlwZWRlZnMqLworCQkgIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKKwkJICBzeW1ib2xfbmFtZSA9IHN0cjsKKwkJICBwbnQgPSBzdHIgKyBzdHJsZW4gKHN0cikgLSAxOworCQkgIGlmICgqcG50ID09ICc/JykgIC8qIENvbnRpbnVhdGlvbiBzdGFiLiAgKi8KKwkJICAgIHsKKwkJICAgICAgc3ltYm9sUyAqc3BuZXh0OworCQkgICAgICBpbnQgdGxlbiA9IDA7CisKKwkJICAgICAgc3BuZXh0ID0gc3A7CisJCSAgICAgIGRvIHsKKwkJCXRsZW4gKz0gc3RybGVuIChzdHIpIC0gMTsKKwkJCXNwbmV4dCA9IHN5bWJvbF9uZXh0IChzcG5leHQpOworCQkJc3RyID0gU19HRVRfTkFNRSAoc3BuZXh0KTsKKwkJCXBudCA9IHN0ciArIHN0cmxlbiAoc3RyKSAtIDE7CisJCSAgICAgIH0gd2hpbGUgKCpwbnQgPT0gJz8nKTsKKwkJICAgICAgdGxlbiArPSBzdHJsZW4gKHN0cik7CisJCSAgICAgIHBhcnNlX2J1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKHRsZW4gKyAxKTsKKwkJICAgICAgc3RyY3B5IChwYXJzZV9idWZmZXIsIFNfR0VUX05BTUUgKHNwKSk7CisJCSAgICAgIHBudDIgPSBwYXJzZV9idWZmZXIgKyBzdHJsZW4gKHBhcnNlX2J1ZmZlcikgLSAxOworCQkgICAgICAqcG50MiA9ICdcMCc7CisJCSAgICAgIHNwbmV4dCA9IHNwOworCQkgICAgICBkbyB7CisJCQlzcG5leHQgPSBzeW1ib2xfbmV4dCAoc3BuZXh0KTsKKwkJCXN0ciA9IFNfR0VUX05BTUUgKHNwbmV4dCk7CisJCQlzdHJjYXQgKHBudDIsIHN0cik7CisJCQlwbnQyICs9ICBzdHJsZW4gKHN0cikgLSAxOworCQkJKnN0ciA9ICdcMCc7ICAvKiBFcmFzZSB0aGlzIHN0cmluZyAgKi8KKwkJICAgICAvKiBTX1NFVF9OQU1FIChzcG5leHQsIHN0cik7ICovCisJCQlpZiAoKnBudDIgIT0gJz8nKSBicmVhazsKKwkJCSpwbnQyID0gJ1wwJzsKKwkJICAgICAgfSB3aGlsZSAoMSk7CisJCSAgICAgIHN0ciA9IHBhcnNlX2J1ZmZlcjsKKwkJICAgICAgc3ltYm9sX25hbWUgPSBzdHI7CisJCSAgICB9CisJCSAgaWYgKChwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciwgJzonKSkgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgKnBudCA9ICdcMCc7CisJCSAgICAgIHBudDEgPSBwbnQgKyAxOworCQkgICAgICBpZiAoKHBudDIgPSAoY2hhciAqKSBzdHJjaHIgKHBudDEsICc9JykpICE9IDApCisJCQlpbmNvbXBsZXRlICs9IFZNU190eXBlZGVmX3BhcnNlIChwbnQyKTsKKwkJICAgICAgaWYgKHBhcnNlX2J1ZmZlcikKKwkJCXsKKwkJCSAgLyogIEF0IHRoaXMgcG9pbnQgdGhlIHBhcnNlIGJ1ZmZlciBzaG91bGQganVzdAorCQkJICAgICAgY29udGFpbiBuYW1lOm5uLiAgSWYgaXQgZG9lcyBub3QsIHRoZW4gd2UKKwkJCSAgICAgIGFyZSBpbiByZWFsIHRyb3VibGUuICBBbnl3YXksIHRoaXMgaXMgYWx3YXlzCisJCQkgICAgICBzaG9ydGVyIHRoYW4gdGhlIG9yaWdpbmFsIGxpbmUuICAqLworCQkJICBwbnQyID0gU19HRVRfTkFNRSAoc3ApOworCQkJICBzdHJjcHkgKHBudDIsIHBhcnNlX2J1ZmZlcik7CisJCSAgICAgICAvKiBTX1NFVF9OQU1FIChzcCwgcG50Mik7ICovCisJCQkgIGZyZWUgKHBhcnNlX2J1ZmZlciksICBwYXJzZV9idWZmZXIgPSAwOworCQkJfQorCQkgICAgICAqcG50ID0gJzonOwkvKiBwdXQgYmFjayBjb2xvbiB0byByZXN0b3JlIGRieF90eXBlICovCisJCSAgICB9CisJCSAgYnJlYWs7CisJCX0JCS8qc3dpdGNoKi8KKwkgICAgfQkJCS8qIGlmICovCisJfQkJCS8qZm9yKi8KKyAgICAgIHBhc3MrKzsKKyAgICAgIC8qCisgICAgICAgKiBNYWtlIG9uZSBsYXN0IHBhc3MsIGlmIG5lZWRlZCwgYW5kIGRlZmluZSB3aGF0ZXZlciB3ZSBjYW4KKyAgICAgICAqIHRoYXQgaXMgbGVmdC4KKyAgICAgICAqLworICAgICAgaWYgKGZpbmFsX3Bhc3MgPT0gMCAmJiBpbmNvbXBsZXRlID09IGluY29tMSkKKwl7CisJICBmaW5hbF9wYXNzID0gMTsKKwkgIGluY29tMSsrOwkvKiBGb3JjZSBvbmUgbGFzdCBwYXNzIHRocm91Z2ggKi8KKwl9CisgIH0gd2hpbGUgKGluY29tcGxldGUgIT0gMCAmJiBpbmNvbXBsZXRlICE9IGluY29tMSk7CisgIC8qIHJlcGVhdCB1bnRpbCBhbGwgcmVmcyByZXNvbHZlZCBpZiBwb3NzaWJsZSAqLworLyoJaWYgKHBhc3MgPiAxKSBwcmludGYgKCIgUmVxdWlyZWQgJWQgcGFzc2VzXG4iLCBwYXNzKTsgKi8KKyAgaWYgKGluY29tcGxldGUgIT0gMCkKKyAgICB7CisgICAgICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogVW5hYmxlIHRvIHJlc29sdmUgJWQgY2lyY3VsYXIgcmVmZXJlbmNlcy4iKSwKKwkJIGluY29tcGxldGUpOworICAgIH0KKyAgZnBudCA9IGZfcmVmX3Jvb3Q7CisgIHN5bWJvbF9uYW1lID0gIlwwIjsKKyAgd2hpbGUgKGZwbnQpCisgICAgeworICAgICAgaWYgKGZwbnQtPnJlc29sdmVkICE9ICdZJykKKwl7CisJICBpZiAoZmluZF9zeW1ib2wgKGZwbnQtPmRieF90eXBlKSkKKwkgICAgeworCSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIiksCisJCQkgZnBudC0+ZGJ4X3R5cGUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBmaXhpdFswXSA9IDA7CisJICBzcHJpbnRmICgmZml4aXRbMV0sICIlZD1zNDsiLCBmcG50LT5kYnhfdHlwZSk7CisJICBwbnQyID0gKGNoYXIgKikgc3RyY2hyICgmZml4aXRbMV0sICc9Jyk7CisJICBWTVNfdHlwZWRlZl9wYXJzZSAocG50Mik7CisJfQorICAgICAgZnBudCA9IGZwbnQtPm5leHQ7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCBzMlAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKKyAgICAgc3ltYm9sUyAqczBQLCAqczJQOworICAgICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmU7CisgICAgIGludCBUZXh0X1BzZWN0OworeworICBzeW1ib2xTICpzMVA7CQkvKiBlYWNoIHN5bWJvbCBmcm9tIHMwUCAuLiBzMlAgKGV4Y2x1c2l2ZSkgKi8KKworICBmb3IgKHMxUCA9IHN5bWJvbF9uZXh0IChzMFApOyBzMVAgIT0gczJQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKKyAgICB7CisgICAgICBpZiAoIXMxUCkKKwlicmVhazsJCS8qIGFuZCByZXR1cm4gKi8KKyAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoczFQKSA9PSBOX0ZVTikKKwl7CisJICBjaGFyICpwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHMxUCksICc6JykgKyAxOworCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKKwl9CisgICAgICBpZiAoIVNfSVNfREVCVUcgKHMxUCkpCisJY29udGludWU7CisgICAgICAvKgorICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHMxUCkpCisJeworCWRlZmF1bHQ6CisJICBjb250aW51ZTsJCS8qIG5vdCBsZWZ0IG9yIHJpZ2h0IGJyYWNlICovCisKKwljYXNlIE5fTFNZTToKKwljYXNlIE5fUFNZTToKKwkgIFZNU19sb2NhbF9zdGFiX1BhcnNlIChzMVApOworCSAgYnJlYWs7CisKKwljYXNlIE5fUlNZTToKKwkgIFZNU19SU1lNX1BhcnNlIChzMVAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7CisJICBicmVhazsKKwl9CQkJLypzd2l0Y2gqLworICAgIH0JCQkJLyogZm9yICovCit9CisKKworLyogVGhpcyBmdW5jdGlvbiBjcmF3bHMgdGhlIHN5bWJvbCBjaGFpbiBzZWFyY2hpbmcgZm9yIGxvY2FsIHN5bWJvbHMgdGhhdAorICAgbmVlZCB0byBiZSBkZXNjcmliZWQgdG8gdGhlIGRlYnVnZ2VyLiAgV2hlbiB3ZSBlbnRlciBhIG5ldyBzY29wZSB3aXRoCisgICBhICJ7IiwgaXQgY3JlYXRlcyBhIG5ldyAiYmxvY2siLCB3aGljaCBoZWxwcyB0aGUgZGVidWdnZXIga2VlcCB0cmFjaworICAgb2Ygd2hpY2ggc2NvcGUgd2UgYXJlIGN1cnJlbnRseSBpbi4gICovCisKK3N0YXRpYyBzeW1ib2xTICoKK0RlZmluZV9Sb3V0aW5lIChzMFAsIExldmVsLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpCisgICAgIHN5bWJvbFMgKnMwUDsKKyAgICAgaW50IExldmVsOworICAgICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmU7CisgICAgIGludCBUZXh0X1BzZWN0OworeworICBzeW1ib2xTICpzMVA7CisgIHZhbHVlVCBPZmZzZXQ7CisgIGludCByY291bnQgPSAwOworCisgIGZvciAoczFQID0gc3ltYm9sX25leHQgKHMwUCk7IHMxUCAhPSAwOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKKyAgICB7CisgICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHMxUCkgPT0gTl9GVU4pCisJeworCSAgY2hhciAqcG50ID0gKGNoYXIgKikgc3RyY2hyIChTX0dFVF9OQU1FIChzMVApLCAnOicpICsgMTsKKwkgIGlmICgqcG50ID09ICdGJyB8fCAqcG50ID09ICdmJykgYnJlYWs7CisJfQorICAgICAgaWYgKCFTX0lTX0RFQlVHIChzMVApKQorCWNvbnRpbnVlOworICAgICAgLyoKKyAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQorICAgICAgICovCisgICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzMVApKQorCXsKKwlkZWZhdWx0OgorCSAgY29udGludWU7CQkvKiBub3QgbGVmdCBvciByaWdodCBicmFjZSAqLworCisJY2FzZSBOX0xCUkFDOgorCSAgaWYgKExldmVsICE9IDApCisJICAgIHsKKwkgICAgICBjaGFyIHN0clsxMF07CisJICAgICAgc3ByaW50ZiAoc3RyLCAiJCVkIiwgcmNvdW50KyspOworCSAgICAgIFZNU19UQlRfQmxvY2tfQmVnaW4gKHMxUCwgVGV4dF9Qc2VjdCwgc3RyKTsKKwkgICAgfQorCSAgT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHMxUCk7CS8qIHNpZGUtZWZmZWN0OiBmdWxseSByZXNvbHZlIHN5bWJvbCAqLworCSAgRGVmaW5lX0xvY2FsX1N5bWJvbHMgKHMwUCwgczFQLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOworCSAgczFQID0gRGVmaW5lX1JvdXRpbmUgKHMxUCwgTGV2ZWwgKyAxLCBDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOworCSAgaWYgKExldmVsICE9IDApCisJICAgIFZNU19UQlRfQmxvY2tfRW5kIChTX0dFVF9WQUxVRSAoczFQKSAtIE9mZnNldCk7CisJICBzMFAgPSBzMVA7CisJICBicmVhazsKKworCWNhc2UgTl9SQlJBQzoKKwkgIHJldHVybiBzMVA7CisJfQkJCS8qc3dpdGNoKi8KKyAgICB9CQkJCS8qIGZvciAqLworCisgIC8qIFdlIGVuZCB1cCBoZXJlIGlmIHRoZXJlIHdlcmUgbm8gYnJhY2tldHMgaW4gdGhpcyBmdW5jdGlvbi4KKyAgICAgRGVmaW5lIGV2ZXJ5dGhpbmcuICAqLworICBEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCAoc3ltYm9sUyAqKTAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7CisgIHJldHVybiBzMVA7Cit9CisMCisKKyNpZm5kZWYgVk1TCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorc3RhdGljIHZvaWQgZ2V0X1ZNU190aW1lX29uX3VuaXggUEFSQU1TICgoY2hhciAqKSk7CisKKy8qIE1hbnVmYWN0dXJlIGEgVk1TLWxpa2UgdGltZSBzdHJpbmcgb24gYSBVbml4IGJhc2VkIHN5c3RlbS4gICovCitzdGF0aWMgdm9pZAorZ2V0X1ZNU190aW1lX29uX3VuaXggKE5vdykKKyAgICAgY2hhciAqTm93OworeworICBjaGFyICpwbnQ7CisgIHRpbWVfdCB0aW1lYjsKKworICB0aW1lICgmdGltZWIpOworICBwbnQgPSBjdGltZSAoJnRpbWViKTsKKyAgcG50WzNdID0gMDsKKyAgcG50WzddID0gMDsKKyAgcG50WzEwXSA9IDA7CisgIHBudFsxNl0gPSAwOworICBwbnRbMjRdID0gMDsKKyAgc3ByaW50ZiAoTm93LCAiJTJzLSUzcy0lcyAlcyIsIHBudCArIDgsIHBudCArIDQsIHBudCArIDIwLCBwbnQgKyAxMSk7Cit9CisjZW5kaWYgLyogbm90IFZNUyAqLworCisKKy8qIFdyaXRlIHRoZSBNSEQgKE1vZHVsZSBIZWFkZXIpIHJlY29yZHMuICAqLworCitzdGF0aWMgdm9pZAorV3JpdGVfVk1TX01IRF9SZWNvcmRzICgpCit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOworICByZWdpc3RlciBjaGFyICpjcDE7CisgIHJlZ2lzdGVyIGludCBpOworI2lmZGVmIFZNUworICBzdHJ1Y3QgeyB1bnNpZ25lZCBzaG9ydCBsZW4sIG1iejsgY2hhciAqcHRyOyB9IERlc2NyaXB0b3I7CisjZW5kaWYKKyAgY2hhciBOb3dbMTcrMV07CisKKyAgLyogV2UgYXJlIHdyaXRpbmcgYSBtb2R1bGUgaGVhZGVyIHJlY29yZC4gICovCisgIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0hEUik7CisgIC8qCisgICAqCSoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgkqTUFJTiBNT0RVTEUgSEVBREVSIFJFQ09SRCoKKyAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqLworICAvKiBTdG9yZSByZWNvcmQgdHlwZSBhbmQgaGVhZGVyIHR5cGUuICAqLworICBQVVRfQ0hBUiAoT0JKX1NfQ19IRFIpOworICBQVVRfQ0hBUiAoTUhEX1NfQ19NSEQpOworICAvKiBTdHJ1Y3R1cmUgbGV2ZWwgaXMgMC4gICovCisgIFBVVF9DSEFSIChPQkpfU19DX1NUUkxWTCk7CisgIC8qIE1heGltdW0gcmVjb3JkIHNpemUgaXMgc2l6ZSBvZiB0aGUgb2JqZWN0IHJlY29yZCBidWZmZXIuICAqLworICBQVVRfU0hPUlQgKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpKTsKKworCS8qCisJICoJRklYTUU6ICBtb2R1bGUgbmFtZSBhbmQgdmVyc2lvbiBzaG91bGQgYmUgdXNlcgorCSAqCQlzcGVjaWZpYWJsZSB2aWEgYC5pZGVudCcgYW5kL29yIGAjcHJhZ21hIGlkZW50Jy4KKwkgKi8KKworICAvKiBHZXQgbW9kdWxlIG5hbWUgKHRoZSBGSUxFTkFNRSBwYXJ0IG9mIHRoZSBvYmplY3QgZmlsZSkuICAqLworICBjcCA9IG91dF9maWxlX25hbWU7CisgIGNwMSA9IE1vZHVsZV9OYW1lOworICB3aGlsZSAoKmNwKQorICAgIHsKKyAgICAgIGlmICgqY3AgPT0gJ10nIHx8ICpjcCA9PSAnPicgfHwgKmNwID09ICc6JyB8fCAqY3AgPT0gJy8nKQorCXsKKwkgIGNwMSA9IE1vZHVsZV9OYW1lOworCSAgY3ArKzsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgICpjcDErKyA9IGlzbG93ZXIgKCpjcCkgPyB0b3VwcGVyICgqY3ArKykgOiAqY3ArKzsKKyAgICB9CisgICpjcDEgPSAnXDAnOworCisgIC8qIExpbWl0IGl0IHRvIDMxIGNoYXJhY3RlcnMgYW5kIHN0b3JlIGluIHRoZSBvYmplY3QgcmVjb3JkLiAgKi8KKyAgd2hpbGUgKC0tY3AxID49IE1vZHVsZV9OYW1lKQorICAgIGlmICgqY3AxID09ICcuJykKKyAgICAgICpjcDEgPSAnXDAnOworICBpZiAoc3RybGVuIChNb2R1bGVfTmFtZSkgPiAzMSkKKyAgICB7CisgICAgICBpZiAoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCisJYXNfdHNrdHNrIChfKCJNb2R1bGUgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iKSwgTW9kdWxlX05hbWUpOworICAgICAgTW9kdWxlX05hbWVbMzFdID0gJ1wwJzsKKyAgICB9CisgIFBVVF9DT1VOVEVEX1NUUklORyAoTW9kdWxlX05hbWUpOworICAvKiBNb2R1bGUgVmVyc2lvbiBpcyAiVjEuMCIuICAqLworICBQVVRfQ09VTlRFRF9TVFJJTkcgKCJWMS4wIik7CisgIC8qIENyZWF0aW9uIHRpbWUgaXMgIm5vdyIgKDE3IGNoYXJzIG9mIHRpbWUgc3RyaW5nKTogImRkLU1NTS15eXl5IGhoOm1tIi4gICovCisjaWZuZGVmIFZNUworICBnZXRfVk1TX3RpbWVfb25fdW5peCAoTm93KTsKKyNlbHNlIC8qIFZNUyAqLworICBEZXNjcmlwdG9yLmxlbiA9IHNpemVvZiBOb3cgLSAxOworICBEZXNjcmlwdG9yLm1ieiA9IDA7CQkvKiB0eXBlICYgY2xhc3MgdW5zcGVjaWZpZWQgKi8KKyAgRGVzY3JpcHRvci5wdHIgPSBOb3c7CisgICh2b2lkKSBzeXMkYXNjdGltICgodW5zaWduZWQgc2hvcnQgKikwLCAmRGVzY3JpcHRvciwgKGxvbmcgKikwLCAwKTsKKyNlbmRpZiAvKiBWTVMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCisgICAgUFVUX0NIQVIgKE5vd1tpXSk7CisgIC8qIFBhdGNoIHRpbWUgaXMgIm5ldmVyIiAoMTcgemVyb3MpLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCisgICAgUFVUX0NIQVIgKDApOworICAvKiBGb3JjZSB0aGlzIHRvIGJlIGEgc2VwYXJhdGUgb3V0cHV0IHJlY29yZC4gICovCisgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKKworICAvKgorICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCSpMQU5HVUFHRSBQUk9DRVNTT1IgTkFNRSoKKyAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKi8KKyAgLyogU3RvcmUgcmVjb3JkIHR5cGUgYW5kIGhlYWRlciB0eXBlLiAgKi8KKyAgUFVUX0NIQVIgKE9CSl9TX0NfSERSKTsKKyAgUFVUX0NIQVIgKE1IRF9TX0NfTE5NKTsKKyAgLyoKKyAgICogU3RvcmUgbGFuZ3VhZ2UgcHJvY2Vzc29yIG5hbWUgYW5kIHZlcnNpb24gKG5vdCBhIGNvdW50ZWQgc3RyaW5nISkuCisgICAqCisgICAqIFRoaXMgaXMgbm9ybWFsbHkgc3VwcGxpZWQgYnkgdGhlIGdjYyBkcml2ZXIgZm9yIHRoZSBjb21tYW5kIGxpbmUKKyAgICogd2hpY2ggaW52b2tlcyBnYXMuICBJZiBhYnNlbnQsIHdlIGZhbGwgYmFjayB0byBnYXMncyB2ZXJzaW9uLgorICAgKi8KKyAgY3AgPSBjb21waWxlcl92ZXJzaW9uX3N0cmluZzsKKyAgaWYgKGNwID09IDApCisgICAgeworICAgICAgY3AgPSAiR05VIEFTICBWIjsKKyAgICAgIHdoaWxlICgqY3ApCisJUFVUX0NIQVIgKCpjcCsrKTsKKyAgICAgIGNwID0gVkVSU0lPTjsKKyAgICB9CisgIHdoaWxlICgqY3AgPj0gJyAnKQorICAgIFBVVF9DSEFSICgqY3ArKyk7CisgIC8qIEZvcmNlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBvdXRwdXQgcmVjb3JkLiAgKi8KKyAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOworfQorCisKKy8qIFdyaXRlIHRoZSBFT00gKEVuZCBPZiBNb2R1bGUpIHJlY29yZC4gICovCisKK3N0YXRpYyB2b2lkCitXcml0ZV9WTVNfRU9NX1JlY29yZCAoUHNlY3QsIE9mZnNldCkKKyAgICAgaW50IFBzZWN0OworICAgICB2YWx1ZVQgT2Zmc2V0OworeworICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhbiBlbmQtb2YtbW9kdWxlIHJlY29yZAorICAgKgkodGhpcyBhc3N1bWVzIHRoYXQgdGhlIGVudHJ5IHBvaW50IHdpbGwgYWx3YXlzIGJlIGluIGEgcHNlY3QKKyAgICoJIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGJ5dGUsIHdoaWNoIGlzIHRoZSBjYXNlIGZvciBjb2RlIGluCisgICAqCSBUZXh0X1BzZWN0PT0wKQorICAgKi8KKyAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfRU9NKTsKKyAgUFVUX0NIQVIgKE9CSl9TX0NfRU9NKTsJLyogUmVjb3JkIHR5cGUuICAqLworICBQVVRfQ0hBUiAoMCk7CQkJLyogRXJyb3Igc2V2ZXJpdHkgbGV2ZWwgKHdlIGlnbm9yZSBpdCkuICovCisgIC8qCisgICAqCVN0b3JlIHRoZSBlbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzCisgICAqLworICBpZiAoUHNlY3QgPj0gMCkKKyAgICB7CisgICAgICBQVVRfQ0hBUiAoUHNlY3QpOworICAgICAgUFVUX0xPTkcgKE9mZnNldCk7CisgICAgfQorICAvKiBGbHVzaCB0aGUgcmVjb3JkOyB0aGlzIHdpbGwgYmUgb3VyIGZpbmFsIG91dHB1dC4gICovCisgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKK30KKwwKKworLyogdGhpcyBoYXNoIHJvdXRpbmUgYm9ycm93ZWQgZnJvbSBHTlUtRU1BQ1MsIGFuZCBzdHJlbmd0aGVuZWQgc2xpZ2h0bHkgIEVSWSovCisKK3N0YXRpYyBpbnQKK2hhc2hfc3RyaW5nIChwdHIpCisgICAgIGNvbnN0IGNoYXIgKnB0cjsKK3sKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKKyAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHN0cmxlbiAocHRyKTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOworICByZWdpc3RlciBpbnQgaGFzaCA9IDA7CisKKyAgd2hpbGUgKHAgIT0gZW5kKQorICAgIHsKKyAgICAgIGMgPSAqcCsrOworICAgICAgaGFzaCA9ICgoaGFzaCA8PCAzKSArIChoYXNoIDw8IDE1KSArIChoYXNoID4+IDI4KSArIGMpOworICAgIH0KKyAgcmV0dXJuIGhhc2g7Cit9CisKKy8qCisgKglHZW5lcmF0ZSBhIENhc2UtSGFja2VkIFZNUyBzeW1ib2wgbmFtZSAobGltaXRlZCB0byAzMSBjaGFycykKKyAqLworc3RhdGljIHZvaWQKK1ZNU19DYXNlX0hhY2tfU3ltYm9sIChJbiwgT3V0KQorICAgICByZWdpc3RlciBjb25zdCBjaGFyICpJbjsKKyAgICAgcmVnaXN0ZXIgY2hhciAqT3V0OworeworICBsb25nIGludCBpbml0OworICBsb25nIGludCByZXN1bHQ7CisgIGNoYXIgKnBudCA9IDA7CisgIGNoYXIgKm5ld19uYW1lOworICBjb25zdCBjaGFyICpvbGRfbmFtZTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGludCBkZXN0cnVjdG9yID0gMDsJCS8qaGFjayB0byBhbGxvdyBmb3IgY2FzZSBzZW5zIGluIGEgZGVzdHJ1Y3RvciovCisgIGludCB0cnVuY2F0ZSA9IDA7CisgIGludCBDYXNlX0hhY2tfQml0cyA9IDA7CisgIGludCBTYXdfRG9sbGFyID0gMDsKKyAgc3RhdGljIGNoYXIgSGV4X1RhYmxlWzE2XSA9CisgIHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRid9OworCisgIC8qCisgICAqCUtpbGwgYW55IGxlYWRpbmcgIl8iCisgICAqLworICBpZiAoKEluWzBdID09ICdfJykgJiYgKChJblsxXSA+ICc5JykgfHwgKEluWzFdIDwgJzAnKSkpCisgICAgSW4rKzsKKworICBuZXdfbmFtZSA9IE91dDsJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIqLworCisjaWYgYmFyZm9vCQkJLyogRGVhZCBjb2RlICovCisgIGlmICgoSW5bMF0gPT0gJ18nKSAmJiAoSW5bMV0gPT0gJyQnKSAmJiAoSW5bMl0gPT0gJ18nKSkKKyAgICBkZXN0cnVjdG9yID0gMTsKKyNlbmRpZgorCisgIC8qIFdlIG1heSBuZWVkIHRvIHRydW5jYXRlIHRoZSBzeW1ib2wsIHNhdmUgdGhlIGhhc2ggZm9yIGxhdGVyKi8KKyAgcmVzdWx0ID0gKHN0cmxlbiAoSW4pID4gMjMpID8gaGFzaF9zdHJpbmcgKEluKSA6IDA7CisgIC8qCisgICAqCUlzIHRoZXJlIGEgUHNlY3QgQXR0cmlidXRlIHRvIHNraXA/PworICAgKi8KKyAgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChJbikpCisgICAgeworICAgICAgLyoKKyAgICAgICAqCVllczogU2tpcCBpdAorICAgICAgICovCisgICAgICBJbiArPSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEg7CisgICAgICB3aGlsZSAoKkluKQorCXsKKwkgIGlmICgoSW5bMF0gPT0gJyQnKSAmJiAoSW5bMV0gPT0gJyQnKSkKKwkgICAgeworCSAgICAgIEluICs9IDI7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIEluKys7CisJfQorICAgIH0KKworICBvbGRfbmFtZSA9IEluOworLyoJaWYgKHN0cmxlbiAoSW4pID4gMzEgJiYgZmxhZ19oYXNoX2xvbmdfbmFtZXMpCisJICBhc190c2t0c2sgKCJTeW1ib2wgbmFtZSB0cnVuY2F0ZWQ6ICVzXG4iLCBJbik7ICovCisgIC8qCisgICAqCURvIHRoZSBjYXNlIGNvbnZlcnNpb24KKyAgICovCisgIGkgPSAyMzsJCQkvKiBNYXhpbXVtIG9mIDIzIGNoYXJzICovCisgIHdoaWxlICgqSW4gJiYgKC0taSA+PSAwKSkKKyAgICB7CisgICAgICBDYXNlX0hhY2tfQml0cyA8PD0gMTsKKyAgICAgIGlmICgqSW4gPT0gJyQnKQorCVNhd19Eb2xsYXIgPSAxOworICAgICAgaWYgKChkZXN0cnVjdG9yID09IDEpICYmIChpID09IDIxKSkKKwlTYXdfRG9sbGFyID0gMDsKKyAgICAgIHN3aXRjaCAodm1zX25hbWVfbWFwcGluZykKKwl7CisJY2FzZSAwOgorCSAgaWYgKGlzdXBwZXIgKCpJbikpIHsKKwkgICAgKk91dCsrID0gKkluKys7CisJICAgIENhc2VfSGFja19CaXRzIHw9IDE7CisJICB9IGVsc2UgeworCSAgICAqT3V0KysgPSBpc2xvd2VyICgqSW4pID8gdG91cHBlciAoKkluKyspIDogKkluKys7CisJICB9CisJICBicmVhazsKKwljYXNlIDM6ICpPdXQrKyA9ICpJbisrOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgaWYgKGlzbG93ZXIgKCpJbikpIHsKKwkgICAgKk91dCsrID0gKkluKys7CisJICB9IGVsc2UgeworCSAgICAqT3V0KysgPSBpc3VwcGVyICgqSW4pID8gdG9sb3dlciAoKkluKyspIDogKkluKys7CisJICB9CisJICBicmVhazsKKwl9CisgICAgfQorICAvKgorICAgKglJZiB3ZSBzYXcgYSBkb2xsYXIgc2lnbiwgd2UgZG9uJ3QgZG8gY2FzZSBoYWNraW5nCisgICAqLworICBpZiAoZmxhZ19ub19oYXNoX21peGVkX2Nhc2UgfHwgU2F3X0RvbGxhcikKKyAgICBDYXNlX0hhY2tfQml0cyA9IDA7CisKKyAgLyoKKyAgICoJSWYgd2UgaGF2ZSBtb3JlIHRoYW4gMjMgY2hhcmFjdGVycyBhbmQgZXZlcnl0aGluZyBpcyBsb3dlcmNhc2UKKyAgICoJd2UgY2FuIGluc2VydCB0aGUgZnVsbCAzMSBjaGFyYWN0ZXJzCisgICAqLworICBpZiAoKkluKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKglXZSAgaGF2ZSBtb3JlIHRoYW4gMjMgY2hhcmFjdGVycworICAgICAgICogSWYgd2UgbXVzdCBhZGQgdGhlIGNhc2UgaGFjaywgdGhlbiB3ZSBoYXZlIHRydW5jYXRlZCB0aGUgc3RyCisgICAgICAgKi8KKyAgICAgIHBudCA9IE91dDsKKyAgICAgIHRydW5jYXRlID0gMTsKKyAgICAgIGlmIChDYXNlX0hhY2tfQml0cyA9PSAwKQorCXsKKwkgIC8qCisJICAgKglBbmQgc28gZmFyIHRoZXkgYXJlIGFsbCBsb3dlciBjYXNlOgorCSAgICoJCUNoZWNrIHVwIHRvIDggbW9yZSBjaGFyYWN0ZXJzCisJICAgKgkJYW5kIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGxvd2VyY2FzZQorCSAgICovCisJICBmb3IgKGkgPSAwOyAoSW5baV0gIT0gMCkgJiYgKGkgPCA4KTsgaSsrKQorCSAgICBpZiAoaXN1cHBlciAoSW5baV0pICYmICFTYXdfRG9sbGFyICYmICFmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSkKKwkgICAgICBicmVhazsKKworCSAgaWYgKEluW2ldID09IDApCisJICAgIHRydW5jYXRlID0gMDsKKworCSAgaWYgKChpID09IDgpIHx8IChJbltpXSA9PSAwKSkKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICoJVGhleSBhcmU6ICBDb3B5IHVwIHRvIDMxIGNoYXJhY3RlcnMKKwkgICAgICAgKgkJCXRvIHRoZSBvdXRwdXQgc3RyaW5nCisJICAgICAgICovCisJICAgICAgaSA9IDg7CisJICAgICAgd2hpbGUgKCgtLWkgPj0gMCkgJiYgKCpJbikpCisJCXN3aXRjaCAodm1zX25hbWVfbWFwcGluZyl7CisJCWNhc2UgMDogKk91dCsrID0gaXNsb3dlciAoKkluKSA/IHRvdXBwZXIgKCpJbisrKSA6ICpJbisrOworCQkgIGJyZWFrOworCQljYXNlIDM6ICpPdXQrKyA9ICpJbisrOworCQkgIGJyZWFrOworCQljYXNlIDI6ICpPdXQrKyA9IGlzdXBwZXIgKCpJbikgPyB0b2xvd2VyICgqSW4rKykgOiAqSW4rKzsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgLyoKKyAgICoJSWYgdGhlcmUgd2VyZSBhbnkgdXBwZXJjYXNlIGNoYXJhY3RlcnMgaW4gdGhlIG5hbWUgd2UKKyAgICoJdGFrZSBvbiB0aGUgY2FzZSBoYWNraW5nIHN0cmluZworICAgKi8KKworICAvKiBPbGQgYmVoYXZpb3IgZm9yIHJlZ3VsYXIgR05VLUMgY29tcGlsZXIgKi8KKyAgaWYgKCFmbGFnX2hhc2hfbG9uZ19uYW1lcykKKyAgICB0cnVuY2F0ZSA9IDA7CisgIGlmICgoQ2FzZV9IYWNrX0JpdHMgIT0gMCkgfHwgKHRydW5jYXRlID09IDEpKQorICAgIHsKKyAgICAgIGlmICh0cnVuY2F0ZSA9PSAwKQorCXsKKwkgICpPdXQrKyA9ICdfJzsKKwkgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJICAgIHsKKwkgICAgICAqT3V0KysgPSBIZXhfVGFibGVbQ2FzZV9IYWNrX0JpdHMgJiAweGZdOworCSAgICAgIENhc2VfSGFja19CaXRzID4+PSA0OworCSAgICB9CisJICAqT3V0KysgPSAnWCc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIE91dCA9IHBudDsJCS8qQ3V0IGJhY2sgdG8gMjMgY2hhcmFjdGVycyBtYXhpbXVtICovCisJICAqT3V0KysgPSAnXyc7CisJICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCSAgICB7CisJICAgICAgaW5pdCA9IHJlc3VsdCAmIDB4MDFmOworCSAgICAgICpPdXQrKyA9IChpbml0IDwgMTApID8gKCcwJyArIGluaXQpIDogKCdBJyArIGluaXQgLSAxMCk7CisJICAgICAgcmVzdWx0ID0gcmVzdWx0ID4+IDU7CisJICAgIH0KKwl9CisgICAgfQkJCQkvKkNhc2UgSGFjayAqLworICAvKgorICAgKglEb25lCisgICAqLworICAqT3V0ID0gMDsKKyAgaWYgKHRydW5jYXRlID09IDEgJiYgZmxhZ19oYXNoX2xvbmdfbmFtZXMgJiYgZmxhZ19zaG93X2FmdGVyX3RydW5jKQorICAgIGFzX3Rza3RzayAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKK30KKwwKKworLyoKKyAqCVNjYW4gYSBzeW1ib2wgbmFtZSBmb3IgYSBwc2VjdCBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbgorICovCisjZGVmaW5lIEdMT0JBTFNZTUJPTF9CSVQJMHgxMDAwMAorI2RlZmluZSBHTE9CQUxWQUxVRV9CSVQJCTB4MjAwMDAKKworCitzdGF0aWMgdm9pZAorVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIChOYW1lLCBBdHRyaWJ1dGVfUG9pbnRlcikKKyAgICAgY29uc3QgY2hhciAqTmFtZTsKKyAgICAgaW50ICpBdHRyaWJ1dGVfUG9pbnRlcjsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOworICBpbnQgTmVnYXRlOworICBzdGF0aWMgY29uc3Qgc3RydWN0CisgIHsKKyAgICBjb25zdCBjaGFyICpOYW1lOworICAgIGludCBWYWx1ZTsKKyAgfSBBdHRyaWJ1dGVzW10gPQorICB7CisgICAgeyJQSUMiLCBHUFNfU19NX1BJQ30sCisgICAgeyJMSUIiLCBHUFNfU19NX0xJQn0sCisgICAgeyJPVlIiLCBHUFNfU19NX09WUn0sCisgICAgeyJSRUwiLCBHUFNfU19NX1JFTH0sCisgICAgeyJHQkwiLCBHUFNfU19NX0dCTH0sCisgICAgeyJTSFIiLCBHUFNfU19NX1NIUn0sCisgICAgeyJFWEUiLCBHUFNfU19NX0VYRX0sCisgICAgeyJSRCIsIEdQU19TX01fUkR9LAorICAgIHsiV1JUIiwgR1BTX1NfTV9XUlR9LAorICAgIHsiVkVDIiwgR1BTX1NfTV9WRUN9LAorICAgIHsiR0xPQkFMU1lNQk9MIiwgR0xPQkFMU1lNQk9MX0JJVH0sCisgICAgeyJHTE9CQUxWQUxVRSIsIEdMT0JBTFZBTFVFX0JJVH0sCisgICAgezAsIDB9CisgIH07CisKKyAgLyoKKyAgICoJS2lsbCBsZWFkaW5nICJfIgorICAgKi8KKyAgaWYgKCpOYW1lID09ICdfJykKKyAgICBOYW1lKys7CisgIC8qCisgICAqCUNoZWNrIGZvciBhIFBTRUNUIGF0dHJpYnV0ZSBsaXN0CisgICAqLworICBpZiAoIUhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKKyAgICByZXR1cm47CQkJLyogSWYgbm90LCByZXR1cm4gKi8KKyAgLyoKKyAgICoJU2tpcCB0aGUgYXR0cmlidXRlIGxpc3QgaW5kaWNhdG9yCisgICAqLworICBOYW1lICs9IFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSDsKKyAgLyoKKyAgICoJUHJvY2VzcyB0aGUgYXR0cmlidXRlcyAoIl8iIHNlcGFyYXRlZCwgIiQiIHRlcm1pbmF0ZWQpCisgICAqLworICB3aGlsZSAoKk5hbWUgIT0gJyQnKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKglBc3N1bWUgbm90IG5lZ2F0aW5nCisgICAgICAgKi8KKyAgICAgIE5lZ2F0ZSA9IDA7CisgICAgICAvKgorICAgICAgICoJQ2hlY2sgZm9yICJOTyIKKyAgICAgICAqLworICAgICAgaWYgKChOYW1lWzBdID09ICdOJykgJiYgKE5hbWVbMV0gPT0gJ08nKSkKKwl7CisJICAvKgorCSAgICoJV2UgYXJlIG5lZ2F0aW5nIChhbmQgc2tpcCB0aGUgTk8pCisJICAgKi8KKwkgIE5lZ2F0ZSA9IDE7CisJICBOYW1lICs9IDI7CisJfQorICAgICAgLyoKKyAgICAgICAqCUZpbmQgdGhlIHRva2VuIGRlbGltaXRlcgorICAgICAgICovCisgICAgICBjcCA9IE5hbWU7CisgICAgICB3aGlsZSAoKmNwICYmICgqY3AgIT0gJ18nKSAmJiAoKmNwICE9ICckJykpCisJY3ArKzsKKyAgICAgIC8qCisgICAgICAgKglMb29rIGZvciB0aGUgdG9rZW4gaW4gdGhlIGF0dHJpYnV0ZSBsaXN0CisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDA7IEF0dHJpYnV0ZXNbaV0uTmFtZTsgaSsrKQorCXsKKwkgIC8qCisJICAgKglJZiB0aGUgc3RyaW5ncyBtYXRjaCwgc2V0L2NsZWFyIHRoZSBhdHRyLgorCSAgICovCisJICBpZiAoc3RybmNtcCAoTmFtZSwgQXR0cmlidXRlc1tpXS5OYW1lLCBjcCAtIE5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqCVNldCBvciBjbGVhcgorCSAgICAgICAqLworCSAgICAgIGlmIChOZWdhdGUpCisJCSpBdHRyaWJ1dGVfUG9pbnRlciAmPQorCQkgIH5BdHRyaWJ1dGVzW2ldLlZhbHVlOworCSAgICAgIGVsc2UKKwkJKkF0dHJpYnV0ZV9Qb2ludGVyIHw9CisJCSAgQXR0cmlidXRlc1tpXS5WYWx1ZTsKKwkgICAgICAvKgorCSAgICAgICAqCURvbmUKKwkgICAgICAgKi8KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIC8qCisgICAgICAgKglOb3cgc2tpcCB0aGUgYXR0cmlidXRlCisgICAgICAgKi8KKyAgICAgIE5hbWUgPSBjcDsKKyAgICAgIGlmICgqTmFtZSA9PSAnXycpCisJTmFtZSsrOworICAgIH0KK30KKwwKKworI2RlZmluZSBHQkxTWU1fUkVGIDAKKyNkZWZpbmUgR0JMU1lNX0RFRiAxCisjZGVmaW5lIEdCTFNZTV9WQUwgMgorI2RlZmluZSBHQkxTWU1fTENMIDQJLyogbm90IEdCTCBhZnRlciBhbGwuLi4gKi8KKyNkZWZpbmUgR0JMU1lNX1dFQUsgOAorCisvKgorICoJRGVmaW5lIGEgZ2xvYmFsIHN5bWJvbCAob3IgcG9zc2libHkgYSBsb2NhbCBvbmUpLgorICovCitzdGF0aWMgdm9pZAorVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgUHNlY3RfTnVtYmVyLCBQc2VjdF9PZmZzZXQsIEZsYWdzKQorICAgICBjb25zdCBjaGFyICpOYW1lOworICAgICBpbnQgUHNlY3RfTnVtYmVyOworICAgICBpbnQgUHNlY3RfT2Zmc2V0OworICAgICBpbnQgRmxhZ3M7Cit7CisgIGNoYXIgTG9jYWxbMzJdOworCisgIC8qCisgICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAorICAgKi8KKyAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKKyAgLyoKKyAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCisgICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKKyAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOworICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhIEdsb2JhbCAob3IgbG9jYWwpIHN5bWJvbCBkZWZpbml0aW9uIHN1YnJlY29yZC4KKyAgICovCisgIFBVVF9DSEFSICgoRmxhZ3MgJiBHQkxTWU1fTENMKSAhPSAwID8gR1NEX1NfQ19MU1kgOgorCSAgICAoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KSA/IEdTRF9TX0NfU1lNIDogR1NEX1NfQ19TWU1XKTsKKyAgLyoKKyAgICoJRGF0YSB0eXBlIGlzIHVuZGVmaW5lZAorICAgKi8KKyAgUFVUX0NIQVIgKDApOworICAvKgorICAgKglTd2l0Y2ggb24gRGVmaW5pdGlvbi9SZWZlcmVuY2UKKyAgICovCisgIGlmICgoRmxhZ3MgJiBHQkxTWU1fREVGKSA9PSAwKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKglSZWZlcmVuY2UKKyAgICAgICAqLworICAgICAgUFVUX1NIT1JUICgoKEZsYWdzICYgR0JMU1lNX1ZBTCkgPT0gMCkgPyBHU1lfU19NX1JFTCA6IDApOworICAgICAgaWYgKChGbGFncyAmIEdCTFNZTV9MQ0wpICE9IDApCS8qIGxvY2FsIHN5bWJvbHMgaGF2ZSBleHRyYSBmaWVsZCAqLworCVBVVF9TSE9SVCAoQ3VycmVudF9FbnZpcm9ubWVudCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IHN5bV9mbGFnczsKKworICAgICAgLyoKKyAgICAgICAqCURlZmluaXRpb24KKyAgICAgICAqWyBhc3NlcnQgKExTWV9TX01fREVGID09IEdTWV9TX01fREVGICYmIExTWV9TX01fUkVMID09IEdTWV9TX01fUkVMKTsgXQorICAgICAgICovCisgICAgICBzeW1fZmxhZ3MgPSBHU1lfU19NX0RFRjsKKyAgICAgIGlmIChGbGFncyAmIEdCTFNZTV9XRUFLKQorCXN5bV9mbGFncyB8PSBHU1lfU19NX1dFQUs7CisgICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX1ZBTCkgPT0gMCkKKwlzeW1fZmxhZ3MgfD0gR1NZX1NfTV9SRUw7CisgICAgICBQVVRfU0hPUlQgKHN5bV9mbGFncyk7CisgICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgIT0gMCkJLyogbG9jYWwgc3ltYm9scyBoYXZlIGV4dHJhIGZpZWxkICovCisJUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKKyAgICAgIC8qCisgICAgICAgKglQc2VjdCBOdW1iZXIKKyAgICAgICAqLworICAgICAgaWYgKChGbGFncyAmIEdCTFNZTV9MQ0wpID09IDAgJiYgKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KQorCVBVVF9DSEFSIChQc2VjdF9OdW1iZXIpOworICAgICAgZWxzZQorCVBVVF9TSE9SVCAoUHNlY3RfTnVtYmVyKTsKKyAgICAgIC8qCisgICAgICAgKglPZmZzZXQKKyAgICAgICAqLworICAgICAgUFVUX0xPTkcgKFBzZWN0X09mZnNldCk7CisgICAgfQorICAvKgorICAgKglGaW5hbGx5LCB0aGUgZ2xvYmFsIHN5bWJvbCBuYW1lCisgICAqLworICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOworICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKKyAgLyoKKyAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKKyAgICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKKyAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Cit9CisKKy8qCisgKglEZWZpbmUgYW4gZW52aXJvbm1lbnQgdG8gc3VwcG9ydCBsb2NhbCBzeW1ib2wgcmVmZXJlbmNlcy4KKyAqCVRoaXMgaXMganVzdCB0byBtb2xsaWZ5IHRoZSBsaW5rZXI7IHdlIGRvbid0IGFjdHVhbGx5IGRvCisgKglhbnl0aGluZyB1c2VmdWwgd2l0aCBpdC4KKyAqLworc3RhdGljIHZvaWQKK1ZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCAoRW52X05hbWUpCisgICAgY29uc3QgY2hhciAqRW52X05hbWU7Cit7CisgIC8qIFdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZC4gICovCisgIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7CisgIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZS4gICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQorICAgIFBVVF9DSEFSIChPQkpfU19DX0dTRCk7CisgIC8qIFdlIGFyZSB3cml0aW5nIGFuIEVOViBzdWJyZWNvcmQuICAqLworICBQVVRfQ0hBUiAoR1NEX1NfQ19FTlYpOworCisgICsrQ3VycmVudF9FbnZpcm9ubWVudDsJLyogaW5kZXggb2YgZW52aXJvbm1lbnQgYmVpbmcgZGVmaW5lZCAqLworCisgIC8qIEVOViRXX0ZMQUdTOiAgd2UgYXJlIGRlZmluaW5nIHRoZSBuZXh0IGVudmlyb25tZW50LiAgSXQncyBub3QgbmVzdGVkLiAgKi8KKyAgUFVUX1NIT1JUIChFTlZfU19NX0RFRik7CisgIC8qIEVOViRXX0VOVklORFg6ICBpbmRleCBpcyBhbHdheXMgMCBmb3Igbm9uLW5lc3RlZCBkZWZpbml0aW9ucy4gICovCisgIFBVVF9TSE9SVCAoMCk7CisKKyAgLyogRU5WJEJfTkFNTE5HICsgRU5WJFRfTkFNRTogIGVudmlyb25tZW50IG5hbWUgaW4gQVNDSUMgZm9ybWF0LiAgKi8KKyAgaWYgKCFFbnZfTmFtZSkgRW52X05hbWUgPSAiIjsKKyAgUFVUX0NPVU5URURfU1RSSU5HICgoY2hhciAqKUVudl9OYW1lKTsKKworICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKKyAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Cit9CisMCisKKy8qCisgKglEZWZpbmUgYSBwc2VjdAorICovCitzdGF0aWMgaW50CitWTVNfUHNlY3RfU3BlYyAoTmFtZSwgU2l6ZSwgVHlwZSwgdnNwKQorICAgICBjb25zdCBjaGFyICpOYW1lOworICAgICBpbnQgU2l6ZTsKKyAgICAgZW51bSBwc190eXBlIFR5cGU7CisgICAgIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Cit7CisgIGNoYXIgTG9jYWxbMzJdOworICBpbnQgUHNlY3RfQXR0cmlidXRlczsKKworICAvKgorICAgKglHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgUFNFQ1QgZmxhZ3MgZ2l2ZW4gdGhlIFBTRUNUIHR5cGUKKyAgICovCisgIHN3aXRjaCAoVHlwZSkKKyAgICB7CisgICAgY2FzZSBwc19URVhUOgorICAgICAgLyogVGV4dCBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsbm9HQkwsU0hSLEVYRSxSRCxub1dSVC4gKi8KKyAgICAgIFBzZWN0X0F0dHJpYnV0ZXMgPSAoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEUKKwkJCSAgfEdQU19TX01fUkQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBwc19EQVRBOgorICAgICAgLyogRGF0YSBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsbm9HQkwsbm9TSFIsbm9FWEUsUkQsV1JULiAqLworICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEfEdQU19TX01fV1JUKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcHNfQ09NTU9OOgorICAgICAgLyogQ29tbW9uIGJsb2NrIHBzZWN0cyBhcmU6ICBQSUMsT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsV1JULiAqLworICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTAorCQkJICB8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBzX0NPTlNUOgorICAgICAgLyogQ29uc3QgZGF0YSBwc2VjdHMgYXJlOiAgUElDLE9WUixSRUwsR0JMLG5vU0hSLG5vRVhFLFJELG5vV1JULiAqLworICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX09WUnxHUFNfU19NX1JFTHxHUFNfU19NX0dCTAorCQkJICB8R1BTX1NfTV9SRCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBzX0NUT1JTOgorICAgICAgLyogQ3RvciBwc2VjdHMgYXJlIFBJQyxub09WUixSRUwsR0JMLG5vU0hSLG5vRVhFLFJELG5vV1JULiAqLworICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX0dCTHxHUFNfU19NX1JEKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcHNfRFRPUlM6CisgICAgICAvKiBEdG9yIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCisgICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGltcG9zc2libGUgKi8KKyAgICAgIGVycm9yIChfKCJVbmtub3duIFZNUyBwc2VjdCB0eXBlICglbGQpIiksIChsb25nKSBUeXBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgLyoKKyAgICoJTW9kaWZ5IHRoZSBwc2VjdCBhdHRyaWJ1dGVzIGFjY29yZGluZyB0byBhbnkgYXR0cmlidXRlIHN0cmluZworICAgKi8KKyAgaWYgKHZzcCAmJiBTX0dFVF9UWVBFICh2c3AtPlN5bWJvbCkgPT0gTl9BQlMpCisgICAgUHNlY3RfQXR0cmlidXRlcyB8PSBHTE9CQUxWQUxVRV9CSVQ7CisgIGVsc2UgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKKyAgICBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKE5hbWUsICZQc2VjdF9BdHRyaWJ1dGVzKTsKKyAgLyoKKyAgICoJQ2hlY2sgZm9yIGdsb2JhbHJlZi9kZWYvdmFsLgorICAgKi8KKyAgaWYgKChQc2VjdF9BdHRyaWJ1dGVzICYgR0xPQkFMVkFMVUVfQklUKSAhPSAwKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBnbG9iYWx2YWx1ZSBzeW1ib2xzIHdlcmUgZ2VuZXJhdGVkIGJlZm9yZS4gVGhpcyBjb2RlCisgICAgICAgKiBwcmV2ZW50cyB1bnNpZ2h0bHkgcHNlY3QgYnVpbGR1cCwgYW5kIG1ha2VzIHN1cmUgdGhhdAorICAgICAgICogZml4dXAgcmVmZXJlbmNlcyBhcmUgZW1pdHRlZCBjb3JyZWN0bHkuCisgICAgICAgKi8KKyAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSAtMTsJLyogdG8gY2F0Y2ggZXJyb3JzICovCisgICAgICBTX1NFVF9UWVBFICh2c3AtPlN5bWJvbCwgTl9VTkRGKTsJCS8qIG1ha2UgcmVmcyB3b3JrICovCisgICAgICByZXR1cm4gMTsJCQkvKiBkZWNyZW1lbnQgcHNlY3QgY291bnRlciAqLworICAgIH0KKworICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxTWU1CT0xfQklUKSAhPSAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSkKKwl7CisJY2FzZSBOX1VOREYgfCBOX0VYVDoKKwkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIHZzcC0+UHNlY3RfSW5kZXgsCisJCQkJICB2c3AtPlBzZWN0X09mZnNldCwgR0JMU1lNX1JFRik7CisJICB2c3AtPlBzZWN0X0luZGV4ID0gLTE7CisJICBTX1NFVF9UWVBFICh2c3AtPlN5bWJvbCwgTl9VTkRGKTsKKwkgIHJldHVybiAxOwkJLyogcmV0dXJuIGFuZCBpbmRpY2F0ZSBubyBwc2VjdCAqLworCWNhc2UgTl9EQVRBIHwgTl9FWFQ6CisJICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCB2c3AtPlBzZWN0X0luZGV4LAorCQkJCSAgdnNwLT5Qc2VjdF9PZmZzZXQsIEdCTFNZTV9ERUYpOworCSAgLyogSW4gdGhpcyBjYXNlIHdlIHN0aWxsIGdlbmVyYXRlIHRoZSBwc2VjdCAqLworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFzX2ZhdGFsIChfKCJHbG9iYWxzeW1ib2wgYXR0cmlidXRlIGZvciBzeW1ib2wgJXMgd2FzIHVuZXhwZWN0ZWQuIiksCisJCSAgICBOYW1lKTsKKwkgIGJyZWFrOworCX0JCQkvKiBzd2l0Y2ggKi8KKyAgICB9CisKKyAgUHNlY3RfQXR0cmlidXRlcyAmPSAweGZmZmY7CS8qIGNsZWFyIG91dCB0aGUgZ2xvYmFscmVmL2RlZiBzdHVmZiAqLworICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhIEdTRCByZWNvcmQKKyAgICovCisgIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7CisgIC8qCisgICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZQorICAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisgICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKKyAgLyoKKyAgICoJV2UgYXJlIHdyaXRpbmcgYSBQU0VDVCBkZWZpbml0aW9uIHN1YnJlY29yZAorICAgKi8KKyAgUFVUX0NIQVIgKEdTRF9TX0NfUFNDKTsKKyAgLyoKKyAgICoJUHNlY3RzIGFyZSBhbHdheXMgTE9OR1dPUkQgYWxpZ25lZAorICAgKi8KKyAgUFVUX0NIQVIgKDIpOworICAvKgorICAgKglTcGVjaWZ5IHRoZSBwc2VjdCBhdHRyaWJ1dGVzCisgICAqLworICBQVVRfU0hPUlQgKFBzZWN0X0F0dHJpYnV0ZXMpOworICAvKgorICAgKglTcGVjaWZ5IHRoZSBhbGxvY2F0aW9uCisgICAqLworICBQVVRfTE9ORyAoU2l6ZSk7CisgIC8qCisgICAqCUZpbmFsbHksIHRoZSBwc2VjdCBuYW1lCisgICAqLworICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOworICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKKyAgLyoKKyAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKKyAgICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKKyAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7CisgIHJldHVybiAwOworfQorDAorCisvKiBHaXZlbiB0aGUgcG9pbnRlciB0byBhIHN5bWJvbCB3ZSBjYWxjdWxhdGUgaG93IGJpZyB0aGUgZGF0YSBhdCB0aGUKKyAgIHN5bWJvbCBpcy4gIFdlIGRvIHRoaXMgYnkgbG9va2luZyBmb3IgdGhlIG5leHQgc3ltYm9sIChsb2NhbCBvciBnbG9iYWwpCisgICB3aGljaCB3aWxsIGluZGljYXRlIHRoZSBzdGFydCBvZiBhbm90aGVyIGRhdHVtLiAgKi8KKworc3RhdGljIG9mZnNldFQKK1ZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHMwUCwgRW5kX09mX0RhdGEpCisgICAgIHJlZ2lzdGVyIHN5bWJvbFMgKnMwUDsKKyAgICAgdW5zaWduZWQgRW5kX09mX0RhdGE7Cit7CisgIHN5bWJvbFMgKnMxUDsKKyAgdmFsdWVUIHMwUF92YWwgPSBTX0dFVF9WQUxVRSAoczBQKSwgczFQX3ZhbCwKKwkgbmVhcmVzdF92YWwgPSAodmFsdWVUKSBFbmRfT2ZfRGF0YTsKKworICAvKiBGaW5kIHRoZSBuZWFyZXN0IHN5bWJvbCB3aGF0IGZvbGxvd3MgdGhpcyBvbmUuICAqLworICBmb3IgKHMxUCA9IHN5bWJvbF9yb290UDsgczFQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKKyAgICB7CisgICAgICAvKiBUaGUgZGF0YSB0eXBlIG11c3QgbWF0Y2guICAqLworICAgICAgaWYgKFNfR0VUX1RZUEUgKHMxUCkgIT0gTl9EQVRBKQorCWNvbnRpbnVlOworICAgICAgczFQX3ZhbCA9IFNfR0VUX1ZBTFVFIChzMVApOworICAgICAgaWYgKHMxUF92YWwgPiBzMFBfdmFsICYmIHMxUF92YWwgPCBuZWFyZXN0X3ZhbCkKKwluZWFyZXN0X3ZhbCA9IHMxUF92YWw7CisgICAgfQorICAvKiBDYWxjdWxhdGUgaXRzIHNpemUuICAqLworICByZXR1cm4gKG9mZnNldFQpIChuZWFyZXN0X3ZhbCAtIHMwUF92YWwpOworfQorCisKKy8qIENoZWNrIHN5bWJvbCBuYW1lcyBmb3IgdGhlIFBzZWN0IGhhY2sgd2l0aCBhIGdsb2JhbHZhbHVlLCBhbmQgdGhlbgorICAgZ2VuZXJhdGUgZ2xvYmFsdmFsdWVzIGZvciB0aG9zZSB0aGF0IGhhdmUgaXQuICAqLworCitzdGF0aWMgdm9pZAorVk1TX0VtaXRfR2xvYmFsdmFsdWVzICh0ZXh0X3NpeiwgZGF0YV9zaXosIERhdGFfU2VnbWVudCkKKyAgICAgdW5zaWduZWQgdGV4dF9zaXo7CisgICAgIHVuc2lnbmVkIGRhdGFfc2l6OworICAgICBjaGFyICpEYXRhX1NlZ21lbnQ7Cit7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOworICBjaGFyICpzdHJpcHBlZF9uYW1lLCAqTmFtZTsKKyAgaW50IFNpemU7CisgIGludCBQc2VjdF9BdHRyaWJ1dGVzOworICBpbnQgZ2xvYmFsdmFsdWU7CisgIGludCB0eXAsIGFic3R5cDsKKworICAvKgorICAgKiBTY2FuIHRoZSBzeW1ib2wgdGFibGUgZm9yIGdsb2JhbHZhbHVlcywgYW5kIGVtaXQgZGVmL3JlZiB3aGVuCisgICAqIHJlcXVpcmVkLiAgVGhlc2Ugd2lsbCBiZSBjYXVnaHQgYWdhaW4gbGF0ZXIgYW5kIGNvbnZlcnRlZCB0bworICAgKiBOX1VOREYKKyAgICovCisgIGZvciAoc3AgPSBzeW1ib2xfcm9vdFA7IHNwOyBzcCA9IHNwLT5zeV9uZXh0KQorICAgIHsKKyAgICAgIHR5cCA9IFNfR0VUX1JBV19UWVBFIChzcCk7CisgICAgICBhYnN0eXAgPSAoKHR5cCAmIH5OX0VYVCkgPT0gTl9BQlMpOworICAgICAgLyoKKyAgICAgICAqCVNlZSBpZiB0aGlzIGlzIHNvbWV0aGluZyB3ZSB3YW50IHRvIGxvb2sgYXQuCisgICAgICAgKi8KKyAgICAgIGlmICghYWJzdHlwICYmCisJICB0eXAgIT0gKE5fREFUQSB8IE5fRVhUKSAmJgorCSAgdHlwICE9IChOX1VOREYgfCBOX0VYVCkpCisJY29udGludWU7CisgICAgICAvKgorICAgICAgICoJU2VlIGlmIHRoaXMgaGFzIGdsb2JhbHZhbHVlIHNwZWNpZmljYXRpb24uCisgICAgICAgKi8KKyAgICAgIE5hbWUgPSBTX0dFVF9OQU1FIChzcCk7CisKKyAgICAgIGlmIChhYnN0eXApCisJeworCSAgc3RyaXBwZWRfbmFtZSA9IDA7CisJICBQc2VjdF9BdHRyaWJ1dGVzID0gR0xPQkFMVkFMVUVfQklUOworCX0KKyAgICAgIGVsc2UgaWYgKEhBU19QU0VDVF9BVFRSSUJVVEVTIChOYW1lKSkKKwl7CisJICBzdHJpcHBlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChOYW1lKSArIDEpOworCSAgc3RyY3B5IChzdHJpcHBlZF9uYW1lLCBOYW1lKTsKKwkgIFBzZWN0X0F0dHJpYnV0ZXMgPSAwOworCSAgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIChzdHJpcHBlZF9uYW1lLCAmUHNlY3RfQXR0cmlidXRlcyk7CisJfQorICAgICAgZWxzZQorCWNvbnRpbnVlOworCisgICAgICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxWQUxVRV9CSVQpICE9IDApCisJeworCSAgc3dpdGNoICh0eXApCisJICAgIHsKKwkgICAgY2FzZSBOX0FCUzoKKwkgICAgICAvKiBMb2NhbCBzeW1ib2wgcmVmZXJlbmNlcyB3aWxsIHdhbnQKKwkJIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgZGVmaW5lZC4gICovCisJICAgICAgaWYgKEN1cnJlbnRfRW52aXJvbm1lbnQgPCAwKQorCQlWTVNfTG9jYWxfRW52aXJvbm1lbnRfU2V0dXAgKCIuTl9BQlMiKTsKKwkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCAwLAorCQkJCSAgICAgIFNfR0VUX1ZBTFVFIChzcCksCisJCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMfEdCTFNZTV9MQ0wpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CisJICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgMCwKKwkJCQkgICAgICBTX0dFVF9WQUxVRSAoc3ApLAorCQkJCSAgICAgIEdCTFNZTV9ERUZ8R0JMU1lNX1ZBTCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6CisJICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgMCwgR0JMU1lNX1ZBTCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CisJICAgICAgU2l6ZSA9IFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHNwLCB0ZXh0X3NpeiArIGRhdGFfc2l6KTsKKwkgICAgICBpZiAoU2l6ZSA+IDQpCisJCWVycm9yIChfKCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiKSk7CisJICAgICAgZ2xvYmFsdmFsdWUgPSBtZF9jaGFyc190b19udW1iZXIgKERhdGFfU2VnbWVudCArIAorCQkgICAgIFNfR0VUX1ZBTFVFIChzcCkgLSB0ZXh0X3NpeiAsIFNpemUpOworCSAgICAgIC8qIFRocmVlIHRpbWVzIGZvciBnb29kIGx1Y2suICBUaGUgbGlua2VyIHNlZW1zIHRvIGdldCBjb25mdXNlZAorCSAgICAgICAgIGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuIHRocmVlICovCisJICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgMCwgR0JMU1lNX1ZBTCk7CisJICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoc3RyaXBwZWRfbmFtZSwgMCwgZ2xvYmFsdmFsdWUsCisJCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMKTsKKwkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCBnbG9iYWx2YWx1ZSwKKwkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUwpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiKSwgc3RyaXBwZWRfbmFtZSk7CisJICAgICAgYnJlYWs7CisJICAgIH0JCQkvKiBzd2l0Y2ggKi8KKwl9CQkJLyogaWYgKi8KKyAgICAgIGlmIChzdHJpcHBlZF9uYW1lKSBmcmVlIChzdHJpcHBlZF9uYW1lKTsJLyogY2xlYW4gdXAgKi8KKyAgICB9CQkJCS8qIGZvciAqLworCit9CisMCisKKy8qCisgKglEZWZpbmUgYSBwcm9jZWR1cmUgZW50cnkgcHQvbWFzaworICovCitzdGF0aWMgdm9pZAorVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCAoTmFtZSwgUHNlY3RfTnVtYmVyLCBQc2VjdF9PZmZzZXQsIEVudHJ5X01hc2spCisgICAgIGNoYXIgKk5hbWU7CisgICAgIGludCBQc2VjdF9OdW1iZXI7CisgICAgIGludCBQc2VjdF9PZmZzZXQ7CisgICAgIGludCBFbnRyeV9NYXNrOworeworICBjaGFyIExvY2FsWzMyXTsKKworICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhIEdTRCByZWNvcmQKKyAgICovCisgIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0dTRCk7CisgIC8qCisgICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIEdTRCByZWNvcmQgdHlwZQorICAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisgICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKKyAgLyoKKyAgICoJV2UgYXJlIHdyaXRpbmcgYSBQcm9jZWR1cmUgRW50cnkgUHQvTWFzayBzdWJyZWNvcmQKKyAgICovCisgIFBVVF9DSEFSICgoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KSA/IEdTRF9TX0NfRVBNIDogR1NEX1NfQ19FUE1XKTsKKyAgLyoKKyAgICoJRGF0YSB0eXBlIGlzIHVuZGVmaW5lZAorICAgKi8KKyAgUFVUX0NIQVIgKDApOworICAvKgorICAgKglGbGFncyA9ICJSRUxPQ0FUQUJMRSIgYW5kICJERUZJTkVEIgorICAgKi8KKyAgUFVUX1NIT1JUIChHU1lfU19NX0RFRiB8IEdTWV9TX01fUkVMKTsKKyAgLyoKKyAgICoJUHNlY3QgTnVtYmVyCisgICAqLworICBpZiAoKHVuc2lnbmVkKSBQc2VjdF9OdW1iZXIgPD0gMjU1KQorICAgIFBVVF9DSEFSIChQc2VjdF9OdW1iZXIpOworICBlbHNlCisgICAgUFVUX1NIT1JUIChQc2VjdF9OdW1iZXIpOworICAvKgorICAgKglPZmZzZXQKKyAgICovCisgIFBVVF9MT05HIChQc2VjdF9PZmZzZXQpOworICAvKgorICAgKglFbnRyeSBtYXNrCisgICAqLworICBQVVRfU0hPUlQgKEVudHJ5X01hc2spOworICAvKgorICAgKglGaW5hbGx5LCB0aGUgZ2xvYmFsIHN5bWJvbCBuYW1lCisgICAqLworICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoTmFtZSwgTG9jYWwpOworICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKKyAgLyoKKyAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKKyAgICovCisgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKKyAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Cit9CisMCisKKy8qCisgKglTZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gY291bnRlciB0byBhIHBhcnRpY3VsYXIgUHNlY3QgYW5kIE9mZnNldAorICovCitzdGF0aWMgdm9pZAorVk1TX1NldF9Qc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgUmVjb3JkX1R5cGUpCisgICAgIGludCBQc2VjdF9JbmRleDsKKyAgICAgaW50IE9mZnNldDsKKyAgICAgaW50IFJlY29yZF9UeXBlOworeworICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCisgICAqLworICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOworICAvKgorICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSByZWNvcmQgdHlwZQorICAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCisgICAgUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKKyAgLyoKKyAgICoJU3RhY2sgdGhlIFBzZWN0IGJhc2UgKyBPZmZzZXQKKyAgICovCisgIHZtc190aXJfc3RhY2tfcHNlY3QgKFBzZWN0X0luZGV4LCBPZmZzZXQsIDApOworICAvKgorICAgKglTZXQgcmVsb2NhdGlvbiBiYXNlCisgICAqLworICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfU0VUUkIpOworICAvKgorICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAorICAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQorICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKK30KKwwKKworLyoKKyAqCVN0b3JlIHJlcGVhdGVkIGltbWVkaWF0ZSBkYXRhIGluIGN1cnJlbnQgUHNlY3QKKyAqLworc3RhdGljIHZvaWQKK1ZNU19TdG9yZV9SZXBlYXRlZF9EYXRhIChSZXBlYXRfQ291bnQsIFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKQorICAgICBpbnQgUmVwZWF0X0NvdW50OworICAgICByZWdpc3RlciBjaGFyICpQb2ludGVyOworICAgICBpbnQgU2l6ZTsKKyAgICAgaW50IFJlY29yZF9UeXBlOworeworCisgIC8qCisgICAqCUlnbm9yZSB6ZXJvIGJ5dGVzL3dvcmRzL2xvbmd3b3JkcworICAgKi8KKyAgc3dpdGNoIChTaXplKQorICAgIHsKKyAgICBjYXNlIDQ6CisgICAgICBpZiAoUG9pbnRlclszXSAhPSAwIHx8IFBvaW50ZXJbMl0gIT0gMCkgYnJlYWs7CisgICAgICAvKiBlbHNlIEZBTExUSFJVICovCisgICAgY2FzZSAyOgorICAgICAgaWYgKFBvaW50ZXJbMV0gIT0gMCkgYnJlYWs7CisgICAgICAvKiBlbHNlIEZBTExUSFJVICovCisgICAgY2FzZSAxOgorICAgICAgaWYgKFBvaW50ZXJbMF0gIT0gMCkgYnJlYWs7CisgICAgICAvKiB6ZXJvIHZhbHVlICovCisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgLyoKKyAgICoJSWYgdGhlIGRhdGEgaXMgdG9vIGJpZyBmb3IgYSBUSVJfU19DX1NUT19SSVZCIHN1Yi1yZWNvcmQKKyAgICoJdGhlbiB3ZSBkbyBpdCBtYW51YWxseQorICAgKi8KKyAgaWYgKFNpemUgPiAyNTUpCisgICAgeworICAgICAgd2hpbGUgKC0tUmVwZWF0X0NvdW50ID49IDApCisJVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChQb2ludGVyLCBTaXplLCBSZWNvcmRfVHlwZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCisgICAqLworICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOworICAvKgorICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHJlY29yZCB0eXBlCisgICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKKyAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOworICAvKgorICAgKglTdGFjayB0aGUgcmVwZWF0IGNvdW50CisgICAqLworICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfTFcpOworICBQVVRfTE9ORyAoUmVwZWF0X0NvdW50KTsKKyAgLyoKKyAgICoJQW5kIG5vdyB0aGUgY29tbWFuZCBhbmQgaXRzIGRhdGEKKyAgICovCisgIFBVVF9DSEFSIChUSVJfU19DX1NUT19SSVZCKTsKKyAgUFVUX0NIQVIgKFNpemUpOworICB3aGlsZSAoLS1TaXplID49IDApCisgICAgUFVUX0NIQVIgKCpQb2ludGVyKyspOworICAvKgorICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAorICAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQorICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKK30KKwwKKworLyoKKyAqCVN0b3JlIGEgUG9zaXRpb24gSW5kZXBlbmRlbnQgUmVmZXJlbmNlCisgKi8KK3N0YXRpYyB2b2lkCitWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKFN5bWJvbCwgT2Zmc2V0LCBQQ19SZWxhdGl2ZSwKKwkJCQlQc2VjdCwgUHNlY3RfT2Zmc2V0LCBSZWNvcmRfVHlwZSkKKyAgICAgc3ltYm9sUyAqU3ltYm9sOworICAgICBpbnQgT2Zmc2V0OworICAgICBpbnQgUENfUmVsYXRpdmU7CisgICAgIGludCBQc2VjdDsKKyAgICAgaW50IFBzZWN0X09mZnNldDsKKyAgICAgaW50IFJlY29yZF9UeXBlOworeworICByZWdpc3RlciBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwID0gU3ltYm9sLT5zeV9vYmo7CisgIGNoYXIgTG9jYWxbMzJdOworICBpbnQgbG9jYWxfc3ltID0gMDsKKworICAvKgorICAgKglXZSBhcmUgd3JpdGluZyBhICJSZWNvcmRfVHlwZSIgcmVjb3JkCisgICAqLworICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOworICAvKgorICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHJlY29yZCB0eXBlCisgICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKKyAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOworICAvKgorICAgKglTZXQgdG8gdGhlIGFwcHJvcHJpYXRlIG9mZnNldCBpbiB0aGUgUHNlY3QuCisgICAqCUZvciBhIENvZGUgcmVmZXJlbmNlIHdlIG5lZWQgdG8gZml4IHRoZSBvcGVyYW5kCisgICAqCXNwZWNpZmllciBhcyB3ZWxsLCBzbyBiYWNrIHVwIDEgYnl0ZTsKKyAgICoJZm9yIGEgRGF0YSByZWZlcmVuY2Ugd2UganVzdCBzdG9yZSBIRVJFLgorICAgKi8KKyAgVk1TX1NldF9Qc2VjdCAoUHNlY3QsCisJCSBQQ19SZWxhdGl2ZSA/IFBzZWN0X09mZnNldCAtIDEgOiBQc2VjdF9PZmZzZXQsCisJCSBSZWNvcmRfVHlwZSk7CisgIC8qCisgICAqCU1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgZ2VuZXJhdGluZyBhICJSZWNvcmQgVHlwZSIgcmVjb3JkCisgICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKKyAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOworICAvKgorICAgKglEaXNwYXRjaCBvbiBzeW1ib2wgdHlwZSAoc28gd2UgY2FuIHN0YWNrIGl0cyB2YWx1ZSkKKyAgICovCisgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKFN5bWJvbCkpCisgICAgeworICAgICAgLyoKKyAgICAgICAqCUdsb2JhbCBzeW1ib2wKKyAgICAgICAqLworICAgIGNhc2UgTl9BQlM6CisgICAgICBsb2NhbF9zeW0gPSAxOworICAgICAgLypGQUxMVEhSVSovCisgICAgY2FzZSBOX0FCUyB8IE5fRVhUOgorI2lmZGVmCU5PVF9WQVhfMTFfQ19DT01QQVRJQkxFCisgICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKKyAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgorI2VuZGlmCS8qIE5PVF9WQVhfMTFfQ19DT01QQVRJQkxFICovCisgICAgY2FzZSBOX1VOREY6CisgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKKyAgICAgIC8qCisgICAgICAgKglHZXQgdGhlIHN5bWJvbCBuYW1lIChjYXNlIGhhY2tlZCkKKyAgICAgICAqLworICAgICAgVk1TX0Nhc2VfSGFja19TeW1ib2wgKFNfR0VUX05BTUUgKFN5bWJvbCksIExvY2FsKTsKKyAgICAgIC8qCisgICAgICAgKglTdGFjayB0aGUgZ2xvYmFsIHN5bWJvbCB2YWx1ZQorICAgICAgICovCisgICAgICBpZiAoIWxvY2FsX3N5bSkKKwl7CisJICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfR0JMKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTG9jYWwgc3ltYm9scyBoYXZlIGFuIGV4dHJhIGZpZWxkLiAgKi8KKwkgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9MU1kpOworCSAgUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKKwl9CisgICAgICBQVVRfQ09VTlRFRF9TVFJJTkcgKExvY2FsKTsKKyAgICAgIGlmIChPZmZzZXQpCisJeworCSAgLyoKKwkgICAqCVN0YWNrIHRoZSBsb25nd29yZCBvZmZzZXQKKwkgICAqLworCSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX0xXKTsKKwkgIFBVVF9MT05HIChPZmZzZXQpOworCSAgLyoKKwkgICAqCUFkZCB0aGUgdHdvLCBsZWF2aW5nIHRoZSByZXN1bHQgb24gdGhlIHN0YWNrCisJICAgKi8KKwkgIFBVVF9DSEFSIChUSVJfU19DX09QUl9BREQpOworCX0KKyAgICAgIGJyZWFrOworICAgICAgLyoKKyAgICAgICAqCVVuaW5pdGlhbGl6ZWQgbG9jYWwgZGF0YQorICAgICAgICovCisgICAgY2FzZSBOX0JTUzoKKyAgICAgIC8qCisgICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCisgICAgICAgKi8KKyAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCisJCQkgICB2c3AtPlBzZWN0X09mZnNldCArIE9mZnNldCwKKwkJCSAgIDApOworICAgICAgYnJlYWs7CisgICAgICAvKgorICAgICAgICoJTG9jYWwgdGV4dAorICAgICAgICovCisgICAgY2FzZSBOX1RFWFQ6CisgICAgICAvKgorICAgICAgICoJU3RhY2sgdGhlIFBzZWN0ICgrb2Zmc2V0KQorICAgICAgICovCisgICAgICB2bXNfdGlyX3N0YWNrX3BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LAorCQkJICAgU19HRVRfVkFMVUUgKFN5bWJvbCkgKyBPZmZzZXQsCisJCQkgICAwKTsKKyAgICAgIGJyZWFrOworICAgICAgLyoKKyAgICAgICAqCUluaXRpYWxpemVkIGxvY2FsIG9yIGdsb2JhbCBkYXRhCisgICAgICAgKi8KKyAgICBjYXNlIE5fREFUQToKKyNpZm5kZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKKyAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgorICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CisjZW5kaWYJLyogTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUgKi8KKyAgICAgIC8qCisgICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCisgICAgICAgKi8KKyAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCisJCQkgICB2c3AtPlBzZWN0X09mZnNldCArIE9mZnNldCwKKwkJCSAgIDApOworICAgICAgYnJlYWs7CisgICAgfQorICAvKgorICAgKglTdG9yZSBlaXRoZXIgYSBjb2RlIG9yIGRhdGEgcmVmZXJlbmNlCisgICAqLworICBQVVRfQ0hBUiAoUENfUmVsYXRpdmUgPyBUSVJfU19DX1NUT19QSUNSIDogVElSX1NfQ19TVE9fUElEUik7CisgIC8qCisgICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCisgICAqLworICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCisgICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOworfQorDAorCisvKgorICoJQ2hlY2sgaW4gdGhlIHRleHQgYXJlYSBmb3IgYW4gaW5kaXJlY3QgcGMtcmVsYXRpdmUgcmVmZXJlbmNlCisgKglhbmQgZml4IGl0IHVwIHdpdGggYWRkcmVzc2luZyBtb2RlIDB4ZmYgW1BDIGluZGlyZWN0XQorICoKKyAqCVRISVMgU0hPVUxEIEJFIFJFUExBQ0VEIEJZIFRIRSBVU0UgT0YgVElSX1NfQ19TVE9fUElSUiBJTiBUSEUKKyAqCVBJQyBDT0RFIEdFTkVSQVRJTkcgRklYVVAgUk9VVElORS4KKyAqLworc3RhdGljIHZvaWQKK1ZNU19GaXhfSW5kaXJlY3RfUmVmZXJlbmNlIChUZXh0X1BzZWN0LCBPZmZzZXQsIGZyYWdQLCB0ZXh0X2ZyYWdfcm9vdCkKKyAgICAgaW50IFRleHRfUHNlY3Q7CisgICAgIGludCBPZmZzZXQ7CisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgICAgZnJhZ1MgKnRleHRfZnJhZ19yb290OworeworICAvKgorICAgKglUaGUgYWRkcmVzc2luZyBtb2RlIGJ5dGUgaXMgMSBieXRlIGJlZm9yZSB0aGUgYWRkcmVzcworICAgKi8KKyAgT2Zmc2V0LS07CisgIC8qCisgICAqCUlzIGl0IGluIFRISVMgZnJhZz8/CisgICAqLworICBpZiAoKE9mZnNldCA8IGZyYWdQLT5mcl9hZGRyZXNzKSB8fAorICAgICAgKE9mZnNldCA+PSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4KSkpCisgICAgeworICAgICAgLyoKKyAgICAgICAqCVdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgZnJhZ21lbnQgY29udGFpbmluZyB0aGlzCisgICAgICAgKglPZmZzZXQKKyAgICAgICAqLworICAgICAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKKwl7CisJICBpZiAoKE9mZnNldCA+PSBmcmFnUC0+ZnJfYWRkcmVzcykgJiYKKwkgICAgICAoT2Zmc2V0IDwgKGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCkpKQorCSAgICBicmVhazsKKwl9CisgICAgICAvKgorICAgICAgICoJSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgZnJhZywgdGhpbmdzIGFyZSBCQUQhIQorICAgICAgICovCisgICAgICBpZiAoZnJhZ1AgPT0gMCkKKwllcnJvciAoXygiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiKSk7CisgICAgfQorICAvKgorICAgKglDaGVjayBmb3IgaW5kaXJlY3QgUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlCisgICAqLworICBpZiAoZnJhZ1AtPmZyX2xpdGVyYWxbT2Zmc2V0IC0gZnJhZ1AtPmZyX2FkZHJlc3NdID09IChjaGFyKSAweGZmKQorICAgIHsKKyAgICAgIHN0YXRpYyBjaGFyIEFkZHJlc3NfTW9kZSA9IChjaGFyKSAweGZmOworCisgICAgICAvKgorICAgICAgICoJWWVzOiBTdG9yZSB0aGUgaW5kaXJlY3QgbW9kZSBiYWNrIGludG8gdGhlIGltYWdlCisgICAgICAgKgkgICAgIHRvIGZpeCB1cCB0aGUgZGFtYWdlIGRvbmUgYnkgU1RPX1BJQ1IKKyAgICAgICAqLworICAgICAgVk1TX1NldF9Qc2VjdCAoVGV4dF9Qc2VjdCwgT2Zmc2V0LCBPQkpfU19DX1RJUik7CisgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKCZBZGRyZXNzX01vZGUsIDEsIE9CSl9TX0NfVElSKTsKKyAgICB9Cit9CisMCisKKy8qCisgKglJZiB0aGUgcHJvY2VkdXJlICJtYWluKCkiIGV4aXN0cyB3ZSBoYXZlIHRvIGFkZCB0aGUgaW5zdHJ1Y3Rpb24KKyAqCSJqc2IgYyRtYWluX2FyZ3MiIGF0IHRoZSBiZWdpbm5pbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFZBWC0xMSAiQyIuCisgKgorICoJRklYTUU6ICB0aGUgbWFjcm8gbmFtZSBgSEFDS19ERUNfQ19TVEFSVFVQJyBzaG91bGQgYmUgcmVuYW1lZAorICoJCXRvIGBIQUNLX1ZBWENSVExfU1RBUlRVUCcgYmVjYXVzZSBEaWdpdGFsJ3MgY29tcGlsZXIKKyAqCQluYW1lZCAiREVDIEMiIHVzZXMgcnVuLXRpbWUgbGlicmFyeSAiREVDQyRTSFIiLCBidXQgdGhpcworICoJCXN0YXJ0dXAgY29kZSBpcyBmb3IgIlZBWENSVEwiLCB0aGUgbGlicmFyeSBmb3IgRGlnaXRhbCdzCisgKgkJb2xkZXIgIlZBWCBDIi4gIEFsc28sIHRoaXMgZXh0cmEgY29kZSBpc24ndCBuZWVkZWQgZm9yCisgKgkJc3VwcG9ydGluZyBnY2MgYmVjYXVzZSBpdCBhbHJlYWR5IGdlbmVyYXRlcyB0aGUgVkFYQ1JUTAorICoJCXN0YXJ0dXAgY2FsbCB3aGVuIGNvbXBpbGluZyBtYWluKCkuICBUaGUgcmVmZXJlbmNlIHRvCisgKgkJYGZsYWdfaGFzaF9sb25nX25hbWVzJyBsb29rcyB2ZXJ5IHN1c3BpY2lvdXMgdG9vOworICoJCXByb2JhYmx5IGFuIG9sZC1zdHlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIHdhcyBpbmFkdmVydGVudGx5CisgKgkJb3ZlcmxvYWRlZCBoZXJlLCB0aGVuIGJsaW5kbHkgY29udmVydGVkIGludG8gdGhlIG5ldyBvbmUuCisgKi8KK3ZvaWQKK3Ztc19jaGVja19mb3JfbWFpbiAoKQoreworICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOworI2lmZGVmCUhBQ0tfREVDX0NfU1RBUlRVUAkvKiBKRiAqLworICByZWdpc3RlciBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpblA7CisgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgcmVnaXN0ZXIgZnJhZ1MgKipwcmV2X2ZyYWdQUDsKKyAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKKyAgcmVnaXN0ZXIgZnJhZ1MgKk5ld19GcmFnOworICBpbnQgaTsKKyNlbmRpZgkvKiBIQUNLX0RFQ19DX1NUQVJUVVAgKi8KKworICBzeW1ib2xQID0gKHN5bWJvbFMgKikgc3ltYm9sX2ZpbmQgKCJfbWFpbiIpOworICBpZiAoc3ltYm9sUCAmJiAhU19JU19ERUJVRyAoc3ltYm9sUCkgJiYKKyAgICAgIFNfSVNfRVhURVJOQUwgKHN5bWJvbFApICYmIChTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpKQorICAgIHsKKyNpZmRlZglIQUNLX0RFQ19DX1NUQVJUVVAKKyAgICAgIGlmICghZmxhZ19oYXNoX2xvbmdfbmFtZXMpCisJeworI2VuZGlmCisJICAvKgorCSAgICoJUmVtZW1iZXIgdGhlIGVudHJ5IHBvaW50IHN5bWJvbAorCSAgICovCisJICBFbnRyeV9Qb2ludF9TeW1ib2wgPSBzeW1ib2xQOworI2lmZGVmIEhBQ0tfREVDX0NfU1RBUlRVUAorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKgorCSAgICoJU2NhbiBhbGwgdGhlIGZyYWdtZW50IGNoYWlucyBmb3IgdGhlIG9uZSB3aXRoICJfbWFpbiIKKwkgICAqCShBY3R1YWxseSB3ZSBrbm93IHRoZSBmcmFnbWVudCBmcm9tIHRoZSBzeW1ib2wsIGJ1dCB3ZSBuZWVkCisJICAgKgkgdGhlIHByZXZpb3VzIGZyYWdtZW50IHNvIHdlIGNhbiBjaGFuZ2UgaXRzIHBvaW50ZXIpCisJICAgKi8KKwkgIGZyY2hhaW5QID0gZnJjaGFpbl9yb290OworCSAgd2hpbGUgKGZyY2hhaW5QKQorCSAgICB7CisJICAgICAgLyoKKwkgICAgICAgKglTY2FuIGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoaXMgY2hhaW4sIHJlbWVtYmVyaW5nCisJICAgICAgICoJdGhlICJwcmV2aW91cyBmcmFnbWVudCIKKwkgICAgICAgKi8KKwkgICAgICBwcmV2X2ZyYWdQUCA9ICZmcmNoYWluUC0+ZnJjaF9yb290OworCSAgICAgIGZyYWdQID0gZnJjaGFpblAtPmZyY2hfcm9vdDsKKwkgICAgICB3aGlsZSAoZnJhZ1AgJiYgKGZyYWdQICE9IGZyY2hhaW5QLT5mcmNoX2xhc3QpKQorCQl7CisJCSAgLyoKKwkJICAgKglJcyB0aGlzIHRoZSBmcmFnbWVudD8KKwkJICAgKi8KKwkJICBpZiAoZnJhZ1AgPT0gc3ltYm9sUC0+c3lfZnJhZykKKwkJICAgIHsKKwkJICAgICAgLyoKKwkJICAgICAgICoJWWVzOiBNb2RpZnkgdGhlIGZyYWdtZW50IGJ5IHJlcGxhY2luZworCQkgICAgICAgKgkgICAgIGl0IHdpdGggYSBuZXcgZnJhZ21lbnQuCisJCSAgICAgICAqLworCQkgICAgICBOZXdfRnJhZyA9IChmcmFnUyAqKQorCQkJeG1hbGxvYyAoc2l6ZW9mICgqTmV3X0ZyYWcpICsKKwkJCQkgZnJhZ1AtPmZyX2ZpeCArCisJCQkJIGZyYWdQLT5mcl92YXIgKworCQkJCSA1KTsKKwkJICAgICAgLyoKKwkJICAgICAgICoJVGhlIGZyYWdtZW50cyBhcmUgdGhlIHNhbWUgZXhjZXB0CisJCSAgICAgICAqCXRoYXQgdGhlICJmaXhlZCIgYXJlYSBpcyBsYXJnZXIKKwkJICAgICAgICovCisJCSAgICAgICpOZXdfRnJhZyA9ICpmcmFnUDsKKwkJICAgICAgTmV3X0ZyYWctPmZyX2ZpeCArPSA2OworCQkgICAgICAvKgorCQkgICAgICAgKglDb3B5IHRoZSBsaXRlcmFsIGRhdGEgb3BlbmluZyBhIGhvbGUKKwkJICAgICAgICoJMiBieXRlcyBhZnRlciAiX21haW4iIChpLmUuIGp1c3QgYWZ0ZXIKKwkJICAgICAgICoJdGhlIGVudHJ5IG1hc2spLiAgSW50byB3aGljaCB3ZSBwbGFjZQorCQkgICAgICAgKgl0aGUgSlNCIGluc3RydWN0aW9uLgorCQkgICAgICAgKi8KKwkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMF0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFswXTsKKwkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMV0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFsxXTsKKwkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbMl0gPSAweDE2OwkvKiBKc2IgKi8KKwkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbM10gPSAweGVmOworCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs0XSA9IDA7CisJCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzVdID0gMDsKKwkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbNl0gPSAwOworCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs3XSA9IDA7CisJCSAgICAgIGZvciAoaSA9IDI7IGkgPCBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX3ZhcjsgaSsrKQorCQkJTmV3X0ZyYWctPmZyX2xpdGVyYWxbaSArIDZdID0KKwkJCSAgZnJhZ1AtPmZyX2xpdGVyYWxbaV07CisJCSAgICAgIC8qCisJCSAgICAgICAqCU5vdyByZXBsYWNlIHRoZSBvbGQgZnJhZ21lbnQgd2l0aCB0aGUKKwkJICAgICAgICoJbmV3bHkgZ2VuZXJhdGVkIG9uZS4KKwkJICAgICAgICovCisJCSAgICAgICpwcmV2X2ZyYWdQUCA9IE5ld19GcmFnOworCQkgICAgICAvKgorCQkgICAgICAgKglSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3ltYm9sCisJCSAgICAgICAqLworCQkgICAgICBFbnRyeV9Qb2ludF9TeW1ib2wgPSBzeW1ib2xQOworCQkgICAgICAvKgorCQkgICAgICAgKglTY2FuIHRoZSB0ZXh0IGFyZWEgZml4dXAgc3RydWN0dXJlcworCQkgICAgICAgKglhcyBvZmZzZXRzIGluIHRoZSBmcmFnbWVudCBtYXkgaGF2ZQorCQkgICAgICAgKgljaGFuZ2VkCisJCSAgICAgICAqLworCQkgICAgICBmb3IgKGZpeFAgPSB0ZXh0X2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKKwkJCXsKKwkJCSAgLyoKKwkJCSAgICoJTG9vayBmb3IgcmVmZXJlbmNlcyB0byB0aGlzCisJCQkgICAqCWZyYWdtZW50LgorCQkJICAgKi8KKwkJCSAgaWYgKGZpeFAtPmZ4X2ZyYWcgPT0gZnJhZ1ApCisJCQkgICAgeworCQkJICAgICAgLyoKKwkJCSAgICAgICAqCUNoYW5nZSB0aGUgZnJhZ21lbnQKKwkJCSAgICAgICAqCXBvaW50ZXIKKwkJCSAgICAgICAqLworCQkJICAgICAgZml4UC0+ZnhfZnJhZyA9IE5ld19GcmFnOworCQkJICAgICAgLyoKKwkJCSAgICAgICAqCUlmIHRoZSBvZmZzZXQgaXMgYWZ0ZXIKKwkJCSAgICAgICAqCXRoZSBlbnRyeSBtYXNrIHdlIG5lZWQKKwkJCSAgICAgICAqCXRvIGFjY291bnQgZm9yIHRoZSBKU0IKKwkJCSAgICAgICAqCWluc3RydWN0aW9uIHdlIGp1c3QKKwkJCSAgICAgICAqCWluc2VydGVkLgorCQkJICAgICAgICovCisJCQkgICAgICBpZiAoZml4UC0+Znhfd2hlcmUgPj0gMikKKwkJCQlmaXhQLT5meF93aGVyZSArPSA2OworCQkJICAgIH0KKwkJCX0KKwkJICAgICAgLyoKKwkJICAgICAgICoJU2NhbiB0aGUgc3ltYm9scyBhcyBvZmZzZXRzIGluIHRoZQorCQkgICAgICAgKglmcmFnbWVudCBtYXkgaGF2ZSBjaGFuZ2VkCisJCSAgICAgICAqLworCQkgICAgICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7CisJCQkgICBzeW1ib2xQOworCQkJICAgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKKwkJCXsKKwkJCSAgLyoKKwkJCSAgICoJTG9vayBmb3IgcmVmZXJlbmNlcyB0byB0aGlzCisJCQkgICAqCWZyYWdtZW50LgorCQkJICAgKi8KKwkJCSAgaWYgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gZnJhZ1ApCisJCQkgICAgeworCQkJICAgICAgLyoKKwkJCSAgICAgICAqCUNoYW5nZSB0aGUgZnJhZ21lbnQKKwkJCSAgICAgICAqCXBvaW50ZXIKKwkJCSAgICAgICAqLworCQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IE5ld19GcmFnOworCQkJICAgICAgLyoKKwkJCSAgICAgICAqCUlmIHRoZSBvZmZzZXQgaXMgYWZ0ZXIKKwkJCSAgICAgICAqCXRoZSBlbnRyeSBtYXNrIHdlIG5lZWQKKwkJCSAgICAgICAqCXRvIGFjY291bnQgZm9yIHRoZSBKU0IKKwkJCSAgICAgICAqCWluc3RydWN0aW9uIHdlIGp1c3QKKwkJCSAgICAgICAqCWluc2VydGVkLgorCQkJICAgICAgICovCisJCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApID49IDIpCisJCQkJU19TRVRfVkFMVUUgKHN5bWJvbFAsCisJCQkJCSAgICAgU19HRVRfVkFMVUUgKHN5bWJvbFApICsgNik7CisJCQkgICAgfQorCQkJfQorCQkgICAgICAvKgorCQkgICAgICAgKglNYWtlIGEgc3ltYm9sIHJlZmVyZW5jZSB0bworCQkgICAgICAgKgkiX2MkbWFpbl9hcmdzIiBzbyB3ZSBjYW4gZ2V0CisJCSAgICAgICAqCWl0cyBhZGRyZXNzIGluc2VydGVkIGludG8gdGhlCisJCSAgICAgICAqCUpTQiBpbnN0cnVjdGlvbi4KKwkJICAgICAgICovCisJCSAgICAgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSB4bWFsbG9jIChzaXplb2YgKCpzeW1ib2xQKSk7CisJCSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbFAsICJfQyRNQUlOX0FSR1MiKTsKKwkJICAgICAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9VTkRGKTsKKwkJICAgICAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIDApOworCQkgICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCAwKTsKKwkJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIDApOworCQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7CisJCSAgICAgIHN5bWJvbFAtPnN5X251bWJlciA9IDA7CisJCSAgICAgIHN5bWJvbFAtPnN5X29iaiA9IDA7CisJCSAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSBOZXdfRnJhZzsKKwkJICAgICAgc3ltYm9sUC0+c3lfcmVzb2x2ZWQgPSAwOworCQkgICAgICBzeW1ib2xQLT5zeV9yZXNvbHZpbmcgPSAwOworCQkgICAgICAvKiB0aGlzIGFjdHVhbGx5IGluc2VydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLworCQkgICAgICBzeW1ib2xfYXBwZW5kIChzeW1ib2xfcm9vdFAsIHN5bWJvbFAsCisJCQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKworCQkgICAgICBzeW1ib2xfcm9vdFAgPSBzeW1ib2xQOworCQkgICAgICAvKgorCQkgICAgICAgKglHZW5lcmF0ZSBhIHRleHQgZml4dXAgc3RydWN0dXJlCisJCSAgICAgICAqCXRvIGdldCAiX2MkbWFpbl9hcmdzIiBzdG9yZWQgaW50byB0aGUKKwkJICAgICAgICoJSlNCIGluc3RydWN0aW9uLgorCQkgICAgICAgKi8KKwkJICAgICAgZml4UCA9IChzdHJ1Y3QgZml4ICopIHhtYWxsb2MgKHNpemVvZiAoKmZpeFApKTsKKwkJICAgICAgZml4UC0+ZnhfZnJhZyA9IE5ld19GcmFnOworCQkgICAgICBmaXhQLT5meF93aGVyZSA9IDQ7CisJCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc3ltYm9sUDsKKwkJICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOworCQkgICAgICBmaXhQLT5meF9vZmZzZXQgPSAwOworCQkgICAgICBmaXhQLT5meF9zaXplID0gNDsKKwkJICAgICAgZml4UC0+ZnhfcGNyZWwgPSAxOworCQkgICAgICBmaXhQLT5meF9uZXh0ID0gdGV4dF9maXhfcm9vdDsKKwkJICAgICAgdGV4dF9maXhfcm9vdCA9IGZpeFA7CisJCSAgICAgIC8qCisJCSAgICAgICAqCU5vdyBtYWtlIHN1cmUgd2UgZXhpdCBmcm9tIHRoZSBsb29wCisJCSAgICAgICAqLworCQkgICAgICBmcmNoYWluUCA9IDA7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIC8qCisJCSAgICoJVHJ5IHRoZSBuZXh0IGZyYWdtZW50CisJCSAgICovCisJCSAgcHJldl9mcmFnUFAgPSAmZnJhZ1AtPmZyX25leHQ7CisJCSAgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dDsKKwkJfQorCSAgICAgIC8qCisJICAgICAgICoJVHJ5IHRoZSBuZXh0IGZyYWdtZW50IGNoYWluCisJICAgICAgICovCisJICAgICAgaWYgKGZyY2hhaW5QKQorCQlmcmNoYWluUCA9IGZyY2hhaW5QLT5mcmNoX25leHQ7CisJICAgIH0KKwl9CisjZW5kaWYgLyogSEFDS19ERUNfQ19TVEFSVFVQICovCisgICAgfQorfQorDAorCisvKgorICoJQmVnaW5uaW5nIG9mIHZtc193cml0ZV9vYmplY3RfZmlsZSgpLgorICovCisKK3N0YXRpYworc3RydWN0IHZtc19vYmpfc3RhdGUgeworCisgIC8qIE5leHQgcHJvZ3JhbSBzZWN0aW9uIGluZGV4IHRvIHVzZS4gICovCisgIGludAlwc2VjdF9udW1iZXI7CisKKyAgLyogUHNlY3QgaW5kZXggZm9yIGNvZGUuICBBbHdheXMgZW5kcyB1cCAjMC4gICovCisgIGludAl0ZXh0X3BzZWN0OworCisgIC8qIFBzZWN0IGluZGV4IGZvciBpbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGVzLiAgKi8KKyAgaW50CWRhdGFfcHNlY3Q7CisKKyAgLyogUHNlY3QgaW5kZXggZm9yIHVuaW5pdGlhbGl6ZWQgc3RhdGljIHZhcmlhYmxlcy4gICovCisgIGludAlic3NfcHNlY3Q7CisKKyAgLyogUHNlY3QgaW5kZXggZm9yIHN0YXRpYyBjb25zdHJ1Y3RvcnMuICAqLworICBpbnQJY3RvcnNfcHNlY3Q7CisKKyAgLyogUHNlY3QgaW5kZXggZm9yIHN0YXRpYyBkZXN0cnVjdG9ycy4gICovCisgIGludAlkdG9yc19wc2VjdDsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgbG9jYWwgc3ltYm9sIGRhdGEuICAqLworICBpbnQJbG9jYWxfaW5pdGRfZGF0YV9zaXplOworCisgIC8qIER5bmFtaWMgYnVmZmVyIGZvciBpbml0aWFsaXplZCBkYXRhLiAgKi8KKyAgY2hhciAqZGF0YV9zZWdtZW50OworCit9IHZtc19vYmpfc3RhdGU7CisKKyNkZWZpbmUgUHNlY3RfTnVtYmVyCQl2bXNfb2JqX3N0YXRlLnBzZWN0X251bWJlcgorI2RlZmluZSBUZXh0X1BzZWN0CQl2bXNfb2JqX3N0YXRlLnRleHRfcHNlY3QKKyNkZWZpbmUgRGF0YV9Qc2VjdAkJdm1zX29ial9zdGF0ZS5kYXRhX3BzZWN0CisjZGVmaW5lIEJzc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5ic3NfcHNlY3QKKyNkZWZpbmUgQ3RvcnNfUHNlY3QJCXZtc19vYmpfc3RhdGUuY3RvcnNfcHNlY3QKKyNkZWZpbmUgRHRvcnNfUHNlY3QJCXZtc19vYmpfc3RhdGUuZHRvcnNfcHNlY3QKKyNkZWZpbmUgTG9jYWxfSW5pdGRfRGF0YV9TaXplCXZtc19vYmpfc3RhdGUubG9jYWxfaW5pdGRfZGF0YV9zaXplCisjZGVmaW5lIERhdGFfU2VnbWVudAkJdm1zX29ial9zdGF0ZS5kYXRhX3NlZ21lbnQKKworCisjZGVmaW5lIElTX0dYWF9WVEFCTEUoc3ltUCkgKHN0cm5jbXAgKFNfR0VUX05BTUUgKHN5bVApLCAiX192dC4iLCA1KSA9PSAwKQorI2RlZmluZSBJU19HWFhfWFRPUihzeW1QKSAoc3RybmNtcCAoU19HRVRfTkFNRSAoc3ltUCksICJfX0dMT0JBTF8uIiwgMTApID09IDApCisjZGVmaW5lIFhUT1JfU0laRSA0CisMCisKKy8qIFBlcmZvcm0gdGV4dCBzZWdtZW50IGZpeHVwcy4gICovCisKK3N0YXRpYyB2b2lkCit2bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KQorICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKKyAgICAgc3RydWN0IGZyYWcgKnRleHRfZnJhZ19yb290OworICAgICBzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Cit7CisgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKKyAgb2Zmc2V0VCBkaWY7CisKKyAgLyogU2NhbiB0aGUgdGV4dCBmcmFnbWVudHMuICAqLworICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQorICAgIHsKKyAgICAgIC8qIFN0b3AgaWYgd2UgZ2V0IHRvIHRoZSBkYXRhIGZyYWdtZW50cy4gICovCisgICAgICBpZiAoZnJhZ1AgPT0gZGF0YV9mcmFnX3Jvb3QpCisJYnJlYWs7CisgICAgICAvKiBJZ25vcmUgZnJhZ21lbnRzIHdpdGggbm8gZGF0YS4gICovCisgICAgICBpZiAoKGZyYWdQLT5mcl9maXggPT0gMCkgJiYgKGZyYWdQLT5mcl92YXIgPT0gMCkpCisJY29udGludWU7CisgICAgICAvKiBHbyB0aGUgdGhlIGFwcHJvcHJpYXRlIG9mZnNldCBpbiB0aGUgVGV4dCBQc2VjdC4gICovCisgICAgICBWTVNfU2V0X1BzZWN0IChUZXh0X1BzZWN0LCBmcmFnUC0+ZnJfYWRkcmVzcywgT0JKX1NfQ19USVIpOworICAgICAgLyogU3RvcmUgdGhlICJmaXhlZCIgcGFydC4gICovCisgICAgICBpZiAoZnJhZ1AtPmZyX2ZpeCkKKwlWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKGZyYWdQLT5mcl9saXRlcmFsLAorCQkJCSAgZnJhZ1AtPmZyX2ZpeCwKKwkJCQkgIE9CSl9TX0NfVElSKTsKKyAgICAgIC8qIFN0b3JlIHRoZSAidmFyaWFibGUiIHBhcnQuICAqLworICAgICAgaWYgKGZyYWdQLT5mcl92YXIgJiYgZnJhZ1AtPmZyX29mZnNldCkKKwlWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSAoZnJhZ1AtPmZyX29mZnNldCwKKwkJCQkgZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAorCQkJCSBmcmFnUC0+ZnJfdmFyLAorCQkJCSBPQkpfU19DX1RJUik7CisgICAgfQkJCS8qIHRleHQgZnJhZyBsb29wICovCisKKyAgLyoKKyAgICoJTm93IHdlIGdvIHRocm91Z2ggdGhlIHRleHQgc2VnbWVudCBmaXh1cHMgYW5kIGdlbmVyYXRlCisgICAqCVRJUiByZWNvcmRzIHRvIGZpeCB1cCBhZGRyZXNzZXMgd2l0aGluIHRoZSBUZXh0IFBzZWN0LgorICAgKi8KKyAgZm9yIChmaXhQID0gdGV4dF9maXhfcm9vdDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCisgICAgeworICAgICAgLyogV2UgRE8gaGFuZGxlIHRoZSBjYXNlIG9mICJTeW1ib2wgLSBTeW1ib2wiIGFzCisJIGxvbmcgYXMgaXQgaXMgaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCisgICAgICBpZiAoZml4UC0+Znhfc3Vic3kgJiYgZml4UC0+ZnhfYWRkc3kpCisJeworCSAgLyogVGhleSBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLworCSAgaWYgKFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9zdWJzeSkgIT0KKwkgICAgICBTX0dFVF9SQVdfVFlQRSAoZml4UC0+ZnhfYWRkc3kpKQorCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB0eXBlIikpOworCSAgLyogQW5kIHRoZXkgbmVlZCB0byBiZSBpbiBvbmUgdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIHBzZWN0IG9uLiAgKi8KKwkgIGlmICgoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fREFUQSkgJiYKKwkJICAgIChTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkgIT0gTl9URVhUKSkKKwkgICAgZXJyb3IgKF8oIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgdHlwZSIpKTsKKwkgIC8qIFRoaXMgaGFkIGJldHRlciBub3QgYmUgUEMgcmVsYXRpdmUhICAqLworCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQorCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiKSk7CisJICAvKiBTdWJ0cmFjdCB0aGVpciB2YWx1ZXMgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlLiAgKi8KKwkgIGRpZiA9IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSkgLSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChMb2NhbCwgKHZhbHVlVClkaWYsIGZpeFAtPmZ4X3NpemUpOworCSAgLyogTm93IGdlbmVyYXRlIHRoZSBmaXh1cCBvYmplY3QgcmVjb3JkczsKKwkgICAgIHNldCB0aGUgcHNlY3QgYW5kIHN0b3JlIHRoZSBkYXRhLiAgKi8KKwkgIFZNU19TZXRfUHNlY3QgKFRleHRfUHNlY3QsCisJCQkgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzLAorCQkJIE9CSl9TX0NfVElSKTsKKwkgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsCisJCQkJICAgIGZpeFAtPmZ4X3NpemUsCisJCQkJICAgIE9CSl9TX0NfVElSKTsKKwkgIGNvbnRpbnVlOwkvKiBkb25lIHdpdGggdGhpcyBmaXh1cCAqLworCSAgICB9CQkvKiBpZiBmeF9zdWJzeSAmJiBmeF9hZGRzeSAqLworICAgICAgLyogU2l6ZSB3aWxsIEhBVkUgdG8gYmUgImxvbmciLiAgKi8KKyAgICAgIGlmIChmaXhQLT5meF9zaXplICE9IDQpCisJZXJyb3IgKF8oIkZpeHVwIGRhdHVtIGlzIG5vdCBhIGxvbmd3b3JkIikpOworICAgICAgLyogU3ltYm9sIG11c3QgYmUgImFkZGVkIiAoaWYgaXQgaXMgZXZlcgorCSBzdWJ0cmFjdGVkIHdlIGNhbiBmaXggdGhpcyBhc3N1bXB0aW9uKS4gICovCisgICAgICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCkKKwllcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIpKTsKKyAgICAgIC8qIFN0b3JlIHRoZSBzeW1ib2wgdmFsdWUgaW4gYSBQSUMgZmFzaGlvbi4gICovCisgICAgICBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKGZpeFAtPmZ4X2FkZHN5LAorCQkJCSAgICAgIGZpeFAtPmZ4X29mZnNldCwKKwkJCQkgICAgICBmaXhQLT5meF9wY3JlbCwKKwkJCQkgICAgICBUZXh0X1BzZWN0LAorCQkJCSAgICBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCisJCQkJICAgICAgT0JKX1NfQ19USVIpOworCSAgLyoKKwkgICAqICBDaGVjayBmb3IgaW5kaXJlY3QgYWRkcmVzcyByZWZlcmVuY2UsIHdoaWNoIGhhcyB0byBiZSBmaXhlZCB1cAorCSAgICogIChhcyB0aGUgbGlua2VyIHdpbGwgc2NyZXcgaXQgdXAgd2l0aCBUSVJfU19DX1NUT19QSUNSKS4uLgorCSAgICovCisgICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCisJVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgKFRleHRfUHNlY3QsCisJCQkJICAgIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKKwkJCQkgICAgZml4UC0+ZnhfZnJhZywKKwkJCQkgICAgdGV4dF9mcmFnX3Jvb3QpOworICAgIH0JCQkvKiB0ZXh0IGZpeCBsb29wICovCit9CisMCisKKy8qIENyZWF0ZSBhIGJ1ZmZlciBob2xkaW5nIHRoZSBkYXRhIHNlZ21lbnQuICAqLworCitzdGF0aWMgdm9pZAorc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQgKGRhdGFfc2l6LCB0ZXh0X3NpeiwgZGF0YV9mcmFnX3Jvb3QpCisgICAgIHVuc2lnbmVkIGRhdGFfc2l6LCB0ZXh0X3NpejsKKyAgICAgc3RydWN0IGZyYWcgKmRhdGFfZnJhZ19yb290OworeworICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7CisgIGNoYXIgKmZpbGxfbGl0ZXJhbDsKKyAgbG9uZyBmaWxsX3NpemUsIGNvdW50LCBpOworCisgIC8qIEFsbG9jYXRlIHRoZSBkYXRhIHNlZ21lbnQuICAqLworICBEYXRhX1NlZ21lbnQgPSAoY2hhciAqKSB4bWFsbG9jIChkYXRhX3Npeik7CisgIC8qIFJ1biB0aHJvdWdoIHRoZSBkYXRhIGZyYWdtZW50cywgZmlsbGluZyBpbiB0aGUgc2VnbWVudC4gICovCisgIGZvciAoZnJhZ1AgPSBkYXRhX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCisgICAgeworICAgICAgaSA9IGZyYWdQLT5mcl9hZGRyZXNzIC0gdGV4dF9zaXo7CisgICAgICBpZiAoZnJhZ1AtPmZyX2ZpeCkKKwltZW1jcHkgKERhdGFfU2VnbWVudCArIGksIGZyYWdQLT5mcl9saXRlcmFsLCBmcmFnUC0+ZnJfZml4KTsKKyAgICAgIGkgKz0gZnJhZ1AtPmZyX2ZpeDsKKworICAgICAgaWYgKChmaWxsX3NpemUgPSBmcmFnUC0+ZnJfdmFyKSAhPSAwKQorCXsKKwkgIGZpbGxfbGl0ZXJhbCA9IGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeDsKKwkgIGZvciAoY291bnQgPSBmcmFnUC0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKKwkgICAgeworCSAgICAgIG1lbWNweSAoRGF0YV9TZWdtZW50ICsgaSwgZmlsbF9saXRlcmFsLCBmaWxsX3NpemUpOworCSAgICAgIGkgKz0gZmlsbF9zaXplOworCSAgICB9CisJfQorICAgIH0JCQkvKiBkYXRhIGZyYWcgbG9vcCAqLworCisgIHJldHVybjsKK30KKworCisvKiBQZXJmb3JtIGRhdGEgc2VnbWVudCBmaXh1cHMuICAqLworCitzdGF0aWMgdm9pZAordm1zX2ZpeHVwX2RhdGFfc2VjdGlvbiAoZGF0YV9zaXosIHRleHRfc2l6KQorICAgICB1bnNpZ25lZCBkYXRhX3NpeiwgdGV4dF9zaXo7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7CisgIHJlZ2lzdGVyIHN0cnVjdCBmaXggKmZpeFA7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOworICBhZGRyZXNzVCBmcl9hZGRyZXNzOworICBvZmZzZXRUIGRpZjsKKyAgdmFsdWVUIHZhbDsKKworICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIGRhdGEgc3ltYm9scyBhbmQgc3RvcmUgdGhlIGRhdGEuICAqLworICBmb3IgKHZzcCA9IFZNU19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKKyAgICB7CisgICAgICAvKiBJZ25vcmUgYW55dGhpbmcgb3RoZXIgdGhhbiBkYXRhIHN5bWJvbHMuICAqLworICAgICAgaWYgKFNfR0VUX1RZUEUgKHZzcC0+U3ltYm9sKSAhPSBOX0RBVEEpCisJY29udGludWU7CisgICAgICAvKiBTZXQgdGhlIFBzZWN0ICsgT2Zmc2V0LiAgKi8KKyAgICAgIFZNU19TZXRfUHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCisJCSAgICAgICB2c3AtPlBzZWN0X09mZnNldCwKKwkJICAgICAgIE9CSl9TX0NfVElSKTsKKyAgICAgIC8qIFN0b3JlIHRoZSBkYXRhLiAgKi8KKyAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFICh2c3AtPlN5bWJvbCk7CisgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKERhdGFfU2VnbWVudCArIHZhbCAtIHRleHRfc2l6LAorCQkJCXZzcC0+U2l6ZSwKKwkJCQlPQkpfU19DX1RJUik7CisgICAgfQkJCS8qIE5fREFUQSBzeW1ib2wgbG9vcCAqLworCisgIC8qCisgICAqCU5vdyB3ZSBnbyB0aHJvdWdoIHRoZSBkYXRhIHNlZ21lbnQgZml4dXBzIGFuZCBnZW5lcmF0ZQorICAgKglUSVIgcmVjb3JkcyB0byBmaXggdXAgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRGF0YSBQc2VjdHMuCisgICAqLworICBmb3IgKGZpeFAgPSBkYXRhX2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICAvKiBGaW5kIHRoZSBzeW1ib2wgZm9yIHRoZSBjb250YWluaW5nIGRhdHVtLiAgKi8KKyAgICAgIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQorCXsKKwkgIC8qIE9ubHkgYm90aGVyIHdpdGggRGF0YSBzeW1ib2xzLiAgKi8KKwkgIHNwID0gdnNwLT5TeW1ib2w7CisJICBpZiAoU19HRVRfVFlQRSAoc3ApICE9IE5fREFUQSkKKwkgICAgY29udGludWU7CisJICAvKiBJZ25vcmUgc3ltYm9sIGlmIEFmdGVyIGZpeHVwLiAgKi8KKwkgIHZhbCA9IFNfR0VUX1ZBTFVFIChzcCk7CisJICBmcl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKKwkgIGlmICh2YWwgPiBmaXhQLT5meF93aGVyZSArIGZyX2FkZHJlc3MpCisJICAgIGNvbnRpbnVlOworCSAgLyogU2VlIGlmIHRoZSBkYXR1bSBpcyBoZXJlLiAgKi8KKwkgIGlmICh2YWwgKyB2c3AtPlNpemUgPD0gZml4UC0+Znhfd2hlcmUgKyBmcl9hZGRyZXNzKQorCSAgICBjb250aW51ZTsKKwkgIC8qIFdlIERPIGhhbmRsZSB0aGUgY2FzZSBvZiAiU3ltYm9sIC0gU3ltYm9sIiBhcworCSAgICAgbG9uZyBhcyBpdCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KKwkgIGlmIChmaXhQLT5meF9zdWJzeSAmJiBmaXhQLT5meF9hZGRzeSkKKwkgICAgeworCSAgICAgIC8qIFRoZXkgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KKwkgICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X3N1YnN5KSAhPQorCQkgIFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9hZGRzeSkpCisJCWVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiKSk7CisJICAgICAgLyogQW5kIHRoZXkgbmVlZCB0byBiZSBpbiBvbmUgdGhhdCB3ZSBjYW4gY2hlY2sgdGhlIHBzZWN0IG9uLiAgKi8KKwkgICAgICBpZiAoKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX0RBVEEpICYmCisJCSAgKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX1RFWFQpKQorCQllcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIikpOworCSAgICAgIC8qIFRoaXMgaGFkIGJldHRlciBub3QgYmUgUEMgcmVsYXRpdmUhICAqLworCSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKKwkJZXJyb3IgKF8oIkZpeHVwIGRhdGEgaXMgZXJyb25lb3VzbHkgXCJwY3JlbFwiIikpOworCSAgICAgIC8qIFN1YnRyYWN0IHRoZWlyIHZhbHVlcyB0byBnZXQgdGhlIGRpZmZlcmVuY2UuICAqLworCSAgICAgIGRpZiA9IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSkgLSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoTG9jYWwsICh2YWx1ZVQpZGlmLCBmaXhQLT5meF9zaXplKTsKKwkgICAgICAvKgorCSAgICAgICAqIE5vdyBnZW5lcmF0ZSB0aGUgZml4dXAgb2JqZWN0IHJlY29yZHM7CisJICAgICAgICogc2V0IHRoZSBwc2VjdCBhbmQgc3RvcmUgdGhlIGRhdGEuCisJICAgICAgICovCisJICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKKwkJCSAgICAgZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlCisJCQkJIC0gdmFsICsgdnNwLT5Qc2VjdF9PZmZzZXQsCisJCQkgICAgIE9CSl9TX0NfVElSKTsKKwkgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLAorCQkJCQlmaXhQLT5meF9zaXplLAorCQkJCQlPQkpfU19DX1RJUik7CisJCSAgYnJlYWs7CS8qIGRvbmUgd2l0aCB0aGlzIGZpeHVwICovCisJCX0KKwkgIC8qIFNpemUgd2lsbCBIQVZFIHRvIGJlICJsb25nIi4gICovCisJICBpZiAoZml4UC0+Znhfc2l6ZSAhPSA0KQorCSAgICBlcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiKSk7CisJICAvKiBTeW1ib2wgbXVzdCBiZSAiYWRkZWQiIChpZiBpdCBpcyBldmVyCisJICAgICBzdWJ0cmFjdGVkIHdlIGNhbiBmaXggdGhpcyBhc3N1bXB0aW9uKS4gICovCisJICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCkKKwkgICAgZXJyb3IgKF8oIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiKSk7CisJICAvKiBTdG9yZSB0aGUgc3ltYm9sIHZhbHVlIGluIGEgUElDIGZhc2hpb24uICAqLworCSAgVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlIChmaXhQLT5meF9hZGRzeSwKKwkJCQkJICBmaXhQLT5meF9vZmZzZXQsCisJCQkJCSAgZml4UC0+ZnhfcGNyZWwsCisJCQkJCSAgdnNwLT5Qc2VjdF9JbmRleCwKKwkJCQkJICBmcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUKKwkJCQkJICAgICAgLSB2YWwgKyB2c3AtPlBzZWN0X09mZnNldCwKKwkJCQkJICBPQkpfU19DX1RJUik7CisJICAvKiBEb25lIHdpdGggdGhpcyBmaXh1cC4gICovCisJICBicmVhazsKKwl9CQkvKiB2bXNfc3ltYm9sIGxvb3AgKi8KKworICAgIH0JCQkvKiBkYXRhIGZpeCBsb29wICovCit9CisKKy8qIFBlcmZvcm0gY3RvcnMvZHRvcnMgc2VnbWVudCBmaXh1cHMuICAqLworCitzdGF0aWMgdm9pZAordm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gKHN5bWJvbHMsIHNlY3Rfbm8pCisJc3RydWN0IFZNU19TeW1ib2wgKnN5bWJvbHM7CisJaW50IHNlY3Rfbm87Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7CisKKyAgLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZCBzdG9yZSB0aGUgZGF0YS4gICovCisgIGZvciAodnNwID0gc3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCisgICAgeworICAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7CisKKyAgICAgIC8qIFNldCByZWxvY2F0aW9uIGJhc2UuICAqLworICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwgdnNwLT5Qc2VjdF9PZmZzZXQsIE9CSl9TX0NfVElSKTsKKworICAgICAgc3AgPSB2c3AtPlN5bWJvbDsKKyAgICAgIC8qIFN0YWNrIHRoZSBQc2VjdCBiYXNlIHdpdGggaXRzIG9mZnNldC4gICovCisgICAgICBWTVNfU2V0X0RhdGEgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChzcCksIE9CSl9TX0NfVElSLCAwKTsKKyAgICB9CisgIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KKyAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQorICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKKworICByZXR1cm47Cit9CisMCisKKy8qIERlZmluZSBzeW1ib2xzIGZvciB0aGUgbGlua2VyLiAgKi8KKworc3RhdGljIHZvaWQKK2dsb2JhbF9zeW1ib2xfZGlyZWN0b3J5ICh0ZXh0X3NpeiwgZGF0YV9zaXopCisgICAgIHVuc2lnbmVkIHRleHRfc2l6LCBkYXRhX3NpejsKK3sKKyAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworICByZWdpc3RlciBzeW1ib2xTICpzcDsKKyAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKKyAgaW50IEdsb2JhbHJlZiwgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2w7CisKKyNpZiAwCisgIC8qIFRoZSBnKysgY29tcGlsZXIgZG9lcyBub3Qgd3JpdGUgb3V0IGV4dGVybmFsIHJlZmVyZW5jZXMgdG8KKyAgICAgdnRhYmxlcyBjb3JyZWN0bHkuICBDaGVjayBmb3IgdGhpcyBhbmQgaG9sbGVyIGlmIHdlIHNlZSBpdAorICAgICBoYXBwZW5pbmcuICBJZiB0aGF0IGNvbXBpbGVyIGJ1ZyBpcyBldmVyIGZpeGVkIHdlIGNhbiByZW1vdmUKKyAgICAgdGhpcy4KKworICAgICAoSnVuJzk1OiBnY2MgMi43LjAncyBjYzFwbHVzIHN0aWxsIGV4aGliaXRzIHRoaXMgYmVoYXZpb3IuKQorCisgICAgIFRoaXMgd2FzIHJlcG9ydGVkbHkgZml4ZWQgYXMgb2YgSnVuZSAyLCAxOTk4LiAgICovCisKKyAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3ltYm9sX25leHQgKHNwKSkKKyAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHNwKSA9PSBOX1VOREYgJiYgSVNfR1hYX1ZUQUJMRSAoc3ApKQorICAgICAgeworCVNfU0VUX1RZUEUgKHNwLCBOX1VOREYgfCBOX0VYVCk7CisJU19TRVRfT1RIRVIgKHNwLCAxKTsKKwlhc193YXJuIChfKCJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbkkgd2lsbCBmaXggaXQsIGJ1dCBJIGhvcGUgdGhhdCBpdCB3YXMgbm90ZSByZWFsbHkgYSByb3V0aW5lLiIpLAorCQkgU19HRVRfTkFNRSAoc3ApKTsKKyAgICAgIH0KKyNlbmRpZgorCisgIC8qCisgICAqIE5vdyBzY2FuIHRoZSBzeW1ib2xzIGFuZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBHU0QgcmVjb3JkcworICAgKi8KKyAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3ltYm9sX25leHQgKHNwKSkKKyAgICB7CisgICAgICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IDA7CisgICAgICB2c3AgPSAwOworICAgICAgLyogRGlzcGF0Y2ggb24gc3ltYm9sIHR5cGUuICAqLworICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ApKQorCXsKKworCS8qIEdsb2JhbCB1bmluaXRpYWxpemVkIGRhdGEuICAqLworCWNhc2UgTl9VTkRGIHwgTl9FWFQ6CisJICAvKiBNYWtlIGEgVk1TIGRhdGEgc3ltYm9sIGVudHJ5LiAgKi8KKwkgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7CisJICB2c3AtPlN5bWJvbCA9IHNwOworCSAgdnNwLT5TaXplID0gU19HRVRfVkFMVUUgKHNwKTsKKwkgIHZzcC0+UHNlY3RfSW5kZXggPSBQc2VjdF9OdW1iZXIrKzsKKwkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gMDsKKwkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOworCSAgVk1TX1N5bWJvbHMgPSB2c3A7CisJICBzcC0+c3lfb2JqID0gdnNwOworCSAgLyogTWFrZSB0aGUgcHNlY3QgZm9yIHRoaXMgZGF0YS4gICovCisJICBHbG9iYWxyZWYgPSBWTVNfUHNlY3RfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAorCQkJCSAgICAgIHZzcC0+U2l6ZSwKKwkJCQkgICAgICBTX0dFVF9PVEhFUiAoc3ApID8gcHNfQ09OU1QgOiBwc19DT01NT04sCisJCQkJICAgICAgdnNwKTsKKwkgIGlmIChHbG9iYWxyZWYpCisJICAgIFBzZWN0X051bWJlci0tOworI2lmZGVmCU5PVF9WQVhfMTFfQ19DT01QQVRJQkxFCisJICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IDE7CisjZWxzZQorCSAgLyogU2VlIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdnRhYmxlLiAgV2Ugd2FudCB0byBoZWxwIHRoZQorCSAgICAgbGlua2VyIGZpbmQgdGhlc2UgdGhpbmdzIGluIGxpYnJhcmllcywgc28gd2UgbWFrZSBhIHN5bWJvbAorCSAgICAgcmVmZXJlbmNlLiAgVGhpcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFZBWC1DIHVzYWdlIGZvcgorCSAgICAgdmFyaWFibGVzLCBidXQgc2luY2UgdnRhYmxlcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkgYnkKKwkgICAgIGcrKywgd2UgY2FuIGdldCBhd2F5IHdpdGggdGhpcyBoYWNrLiAgKi8KKwkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gSVNfR1hYX1ZUQUJMRSAoc3ApOworI2VuZGlmCisJICBicmVhazsKKworCS8qIExvY2FsIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCisJY2FzZSBOX0JTUzoKKwkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLworCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKKwkgIHZzcC0+U3ltYm9sID0gc3A7CisJICB2c3AtPlNpemUgPSAwOworCSAgdnNwLT5Qc2VjdF9JbmRleCA9IEJzc19Qc2VjdDsKKwkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHNwKSAtIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzczsKKwkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOworCSAgVk1TX1N5bWJvbHMgPSB2c3A7CisJICBzcC0+c3lfb2JqID0gdnNwOworCSAgYnJlYWs7CisKKwkvKiBHbG9iYWwgaW5pdGlhbGl6ZWQgZGF0YS4gICovCisJY2FzZSBOX0RBVEEgfCBOX0VYVDoKKwkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLworCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKKwkgIHZzcC0+U3ltYm9sID0gc3A7CisJICB2c3AtPlNpemUgPSBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIChzcCwgdGV4dF9zaXogKyBkYXRhX3Npeik7CisJICB2c3AtPlBzZWN0X0luZGV4ID0gUHNlY3RfTnVtYmVyKys7CisJICB2c3AtPlBzZWN0X09mZnNldCA9IDA7CisJICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKKwkgIFZNU19TeW1ib2xzID0gdnNwOworCSAgc3AtPnN5X29iaiA9IHZzcDsKKwkgIC8qIE1ha2UgaXRzIHBzZWN0LiAgKi8KKwkgIEdsb2JhbHJlZiA9IFZNU19Qc2VjdF9TcGVjIChTX0dFVF9OQU1FIChzcCksCisJCQkJICAgICAgdnNwLT5TaXplLAorCQkJCSAgICAgIFNfR0VUX09USEVSIChzcCkgPyBwc19DT05TVCA6IHBzX0NPTU1PTiwKKwkJCQkgICAgICB2c3ApOworCSAgaWYgKEdsb2JhbHJlZikKKwkgICAgUHNlY3RfTnVtYmVyLS07CisjaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKKwkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMTsKKyNlbHNlCisJICAvKiBTZWUgTl9VTkRGfE5fRVhUIGFib3ZlIGZvciBleHBsYW5hdGlvbi4gICovCisJICBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbCA9IElTX0dYWF9WVEFCTEUgKHNwKTsKKyNlbmRpZgorCSAgYnJlYWs7CisKKwkvKiBMb2NhbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KKwljYXNlIE5fREFUQToKKwkgIHsKKwkgICAgY2hhciAqc3ltX25hbWUgPSBTX0dFVF9OQU1FIChzcCk7CisKKwkgICAgLyogQWx3YXlzIHN1cHByZXNzIGxvY2FsIG51bWVyaWMgbGFiZWxzLiAgKi8KKwkgICAgaWYgKHN5bV9uYW1lICYmIHN0cmNtcCAoc3ltX25hbWUsIEZBS0VfTEFCRUxfTkFNRSkgPT0gMCkKKwkgICAgICBicmVhazsKKworCSAgICAvKiBNYWtlIGEgVk1TIGRhdGEgc3ltYm9sIGVudHJ5LiAgKi8KKwkgICAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKKwkgICAgdnNwLT5TeW1ib2wgPSBzcDsKKwkgICAgdnNwLT5TaXplID0gVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoc3AsIHRleHRfc2l6ICsgZGF0YV9zaXopOworCSAgICB2c3AtPlBzZWN0X0luZGV4ID0gRGF0YV9Qc2VjdDsKKwkgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBMb2NhbF9Jbml0ZF9EYXRhX1NpemU7CisJICAgIExvY2FsX0luaXRkX0RhdGFfU2l6ZSArPSB2c3AtPlNpemU7CisJICAgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOworCSAgICBWTVNfU3ltYm9scyA9IHZzcDsKKwkgICAgc3AtPnN5X29iaiA9IHZzcDsKKwkgIH0KKwkgIGJyZWFrOworCisJLyogR2xvYmFsIFRleHQgZGVmaW5pdGlvbi4gICovCisJY2FzZSBOX1RFWFQgfCBOX0VYVDoKKwkgIHsKKworCSAgICBpZiAoSVNfR1hYX1hUT1IgKHNwKSkKKwkgICAgICB7CisJCXZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7CisJCXZzcC0+U3ltYm9sID0gc3A7CisJCXZzcC0+U2l6ZSA9IFhUT1JfU0laRTsKKwkJc3AtPnN5X29iaiA9IHZzcDsKKwkJc3dpdGNoICgoU19HRVRfTkFNRSAoc3ApKVsxMF0pCisJCSAgeworCQkgICAgY2FzZSAnSSc6CisJCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKKwkJICAgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAoQ3RvcnNfU3ltYm9scz09MCk/MDooQ3RvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0K1hUT1JfU0laRSk7CisJCSAgICAgIHZzcC0+TmV4dCA9IEN0b3JzX1N5bWJvbHM7CisJCSAgICAgIEN0b3JzX1N5bWJvbHMgPSB2c3A7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnRCc6CisJCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBEdG9yc19Qc2VjdDsKKwkJICAgICAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAoRHRvcnNfU3ltYm9scz09MCk/MDooRHRvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0K1hUT1JfU0laRSk7CisJCSAgICAgIHZzcC0+TmV4dCA9IER0b3JzX1N5bWJvbHM7CisJCSAgICAgIER0b3JzX1N5bWJvbHMgPSB2c3A7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnRyc6CisJCSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IGhhbmRsZSBnbG9iYWwgeHRvcnMgc3ltYm9scyB5ZXQuIikpOworCQkgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGFzX3dhcm4gKF8oIlVua25vd24gJXMiKSwgU19HRVRfTkFNRSAoc3ApKTsKKwkJICAgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJdW5zaWduZWQgc2hvcnQgRW50cnlfTWFzazsKKworCQkvKiBHZXQgdGhlIGVudHJ5IG1hc2suICAqLworCQlmcmFnUCA9IHNwLT5zeV9mcmFnOworCQkvKiBGaXJzdCBmcmFnIG1pZ2h0IGJlIGVtcHR5IGlmIHdlJ3JlIGdlbmVyYXRpbmcgbGlzdGluZ3MuCisJCSAgIFNvIHNraXAgZW1wdHkgcnNfZmlsbCBmcmFncy4gICovCisJCXdoaWxlIChmcmFnUCAmJiBmcmFnUC0+ZnJfdHlwZSA9PSByc19maWxsICYmIGZyYWdQLT5mcl9maXggPT0gMCkKKwkJICBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0OworCisJCS8qIElmIGZpcnN0IGZyYWcgZG9lc24ndCBjb250YWluIHRoZSBkYXRhLCB3aGF0IGRvIHdlIGRvPworCQkgICBJZiBpdCdzIHBvc3NpYmx5IHNtYWxsZXIgdGhhbiB0d28gYnl0ZXMsIHRoYXQgd291bGQKKwkJICAgaW1wbHkgdGhhdCB0aGUgZW50cnkgbWFzayBpcyBub3Qgc3RvcmVkIHdoZXJlIHdlJ3JlCisJCSAgIGV4cGVjdGluZyBpdC4KKworCQkgICBJZiB5b3UgY2FuIGZpbmQgYSB0ZXN0IGNhc2UgdGhhdCB0cmlnZ2VycyB0aGlzLCByZXBvcnQKKwkJICAgaXQgKGFuZCB0ZWxsIG1lIHdoYXQgdGhlIGVudHJ5IG1hc2sgZmllbGQgb3VnaHQgdG8gYmUpLAorCQkgICBhbmQgSSdsbCB0cnkgdG8gZml4IGl0LiAgS1IgKi8KKwkJaWYgKGZyYWdQLT5mcl9maXggPCAyKQorCQkgIGFib3J0ICgpOworCisJCUVudHJ5X01hc2sgPSAoZnJhZ1AtPmZyX2xpdGVyYWxbMF0gJiAweDAwZmYpIHwKKwkJCSAgICAgKChmcmFnUC0+ZnJfbGl0ZXJhbFsxXSAmIDB4MDBmZikgPDwgOCk7CisJCS8qIERlZmluZSB0aGUgcHJvY2VkdXJlIGVudHJ5IHBvaW50LiAgKi8KKwkJVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCAoU19HRVRfTkFNRSAoc3ApLAorCQkJCSAgICBUZXh0X1BzZWN0LAorCQkJCSAgICBTX0dFVF9WQUxVRSAoc3ApLAorCQkJCSAgICBFbnRyeV9NYXNrKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCisJLyogTG9jYWwgVGV4dCBkZWZpbml0aW9uLiAgKi8KKwljYXNlIE5fVEVYVDoKKwkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLworCSAgaWYgKFRleHRfUHNlY3QgIT0gLTEpCisJICAgIHsKKwkgICAgICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOworCSAgICAgIHZzcC0+U3ltYm9sID0gc3A7CisJICAgICAgdnNwLT5TaXplID0gMDsKKwkgICAgICB2c3AtPlBzZWN0X0luZGV4ID0gVGV4dF9Qc2VjdDsKKwkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7CisJICAgICAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7CisJICAgICAgVk1TX1N5bWJvbHMgPSB2c3A7CisJICAgICAgc3AtPnN5X29iaiA9IHZzcDsKKwkgICAgfQorCSAgYnJlYWs7CisKKwkvKiBHbG9iYWwgUmVmZXJlbmNlLiAgKi8KKwljYXNlIE5fVU5ERjoKKwkgIC8qIE1ha2UgYSBHU0QgZ2xvYmFsIHN5bWJvbCByZWZlcmVuY2UgcmVjb3JkLiAgKi8KKwkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKKwkJCQkgIDAsCisJCQkJICAwLAorCQkJCSAgR0JMU1lNX1JFRik7CisJICBicmVhazsKKworCS8qIEFic29sdXRlIHN5bWJvbC4gICovCisJY2FzZSBOX0FCUzoKKwljYXNlIE5fQUJTIHwgTl9FWFQ6CisJICAvKiBnY2MgZG9lc24ndCBnZW5lcmF0ZSB0aGVzZTsKKwkgICAgIFZNU19FbWl0X0dsb2JhbHZhbHVlIGhhbmRsZXMgdGhlbSB0aG91Z2guCSovCisJICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOworCSAgdnNwLT5TeW1ib2wgPSBzcDsKKwkgIHZzcC0+U2l6ZSA9IDQ7CQkvKiBhbHdheXMgYXNzdW1lIDMyIGJpdHMgKi8KKwkgIHZzcC0+UHNlY3RfSW5kZXggPSAwOworCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApOworCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7CisJICBWTVNfU3ltYm9scyA9IHZzcDsKKwkgIHNwLT5zeV9vYmogPSB2c3A7CisJICBicmVhazsKKworCS8qIEFueXRoaW5nIGVsc2UuICAqLworCWRlZmF1bHQ6CisJICAvKiBJZ25vcmUgU1RBQiBzeW1ib2xzLCBpbmNsdWRpbmcgLnN0YWJzIGVtaXR0ZWQgYnkgZysrLiAgKi8KKwkgIGlmIChTX0lTX0RFQlVHIChzcCkgfHwgKFNfR0VUX1RZUEUgKHNwKSA9PSAyMikpCisJICAgIGJyZWFrOworCSAgLyoKKwkgICAqCUVycm9yIG90aGVyd2lzZS4KKwkgICAqLworCSAgYXNfdHNrdHNrIChfKCJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIiksIFNfR0VUX1RZUEUgKHNwKSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEdsb2JhbCBzeW1ib2xzIGhhdmUgZGlmZmVyZW50IGxpbmthZ2UgdGhhbiBleHRlcm5hbCB2YXJpYWJsZXMuICAqLworICAgICAgaWYgKGRlZmluZV9hc19nbG9iYWxfc3ltYm9sKQorCVZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKKwkJCQl2c3AtPlBzZWN0X0luZGV4LAorCQkJCTAsCisJCQkJR0JMU1lNX0RFRik7CisgICAgfQorCisgIHJldHVybjsKK30KKwwKKworLyogT3V0cHV0IGRlYnVnZ2VyIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiBmb3Igc3ltYm9scyB3aGljaAorICAgYXJlIGxvY2FsIHRvIGEgc3BlY2lmaWMgcm91dGluZS4gICovCisKK3N0YXRpYyB2b2lkCitsb2NhbF9zeW1ib2xzX0RTVCAoczBQLCBDdXJyZW50X1JvdXRpbmUpCisgICAgIHN5bWJvbFMgKnMwUCwgKkN1cnJlbnRfUm91dGluZTsKK3sKKyAgc3ltYm9sUyAqczFQOworICBjaGFyICpzMFBfbmFtZSwgKnBudDAsICpwbnQxOworCisgIHMwUF9uYW1lID0gU19HRVRfTkFNRSAoczBQKTsKKyAgaWYgKCpzMFBfbmFtZSsrICE9ICdfJykKKyAgICByZXR1cm47CisKKyAgZm9yIChzMVAgPSBDdXJyZW50X1JvdXRpbmU7IHMxUDsgczFQID0gc3ltYm9sX25leHQgKHMxUCkpCisgICAgeworI2lmIDAJCS8qIHJlZHVuZGFudDsgUkFXX1RZUEUgIT0gTl9GVU4gc3VmZmljZXMgKi8KKyAgICAgIGlmICghU19JU19ERUJVRyAoczFQKSkKKwljb250aW51ZTsKKyNlbmRpZgorICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzMVApICE9IE5fRlVOKQorCWNvbnRpbnVlOworICAgICAgcG50MCA9IHMwUF9uYW1lOworICAgICAgcG50MSA9IFNfR0VUX05BTUUgKHMxUCk7CisgICAgICAvKiBXZSBhc3N1bWUgdGhlIHR3byBzdHJpbmdzIGFyZSBuZXZlciBleGFjdGx5IGVxdWFsLi4uICAqLworICAgICAgd2hpbGUgKCpwbnQwKysgPT0gKnBudDErKykKKwl7CisJfQorICAgICAgLyogRm91bmQgaXQgaWYgczBQIG5hbWUgaXMgZXhoYXVzdGVkIGFuZCBzMVAgbmFtZSBoYXMgIjpGIiBvciAiOmYiIG5leHQuCisJIE5vdGU6ICBib3RoIHBvaW50ZXJzIGhhdmUgYWR2YW5jZWQgb25lIHBhc3QgdGhlIG5vbi1tYXRjaGluZyBjaGFyLiAgKi8KKyAgICAgIGlmICgoKnBudDEgPT0gJ0YnIHx8ICpwbnQxID09ICdmJykgJiYgKi0tcG50MSA9PSAnOicgJiYgKi0tcG50MCA9PSAnXDAnKQorCXsKKwkgIERlZmluZV9Sb3V0aW5lIChzMVAsIDAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7CisJICByZXR1cm47CisJfQorICAgIH0KK30KKworCisvKiBDb25zdHJ1Y3QgYW5kIG91dHB1dCB0aGUgZGVidWcgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK3Ztc19idWlsZF9EU1QgKHRleHRfc2l6KQorICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKK3sKKyAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKKyAgc3ltYm9sUyAqQ3VycmVudF9Sb3V0aW5lID0gMDsKKyAgc3RydWN0IGlucHV0X2ZpbGUgKkN1cl9GaWxlID0gMDsKKyAgb2Zmc2V0VCBDdXJfT2Zmc2V0ID0gLTE7CisgIGludCBDdXJfTGluZV9OdW1iZXIgPSAwOworICBpbnQgRmlsZV9OdW1iZXIgPSAwOworICBpbnQgRGVidWdnZXJfT2Zmc2V0ID0gMDsKKyAgaW50IGZpbGVfYXZhaWxhYmxlOworICBpbnQgZHNjOworICBvZmZzZXRUIHZhbDsKKworICAvKiBXcml0ZSB0aGUgVHJhY2ViYWNrIEJlZ2luIE1vZHVsZSByZWNvcmQuICAqLworICBWTVNfVEJUX01vZHVsZV9CZWdpbiAoKTsKKworICAvKgorICAgKglPdXRwdXQgZGVidWdnaW5nIGluZm8gZm9yIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHN0YXRpYyB2YXJpYWJsZXMKKyAgICoJdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIG9uZSByb3V0aW5lLiAgV2UgYWxzbyBuZWVkIHRvIGV4YW1pbmUKKyAgICoJYWxsIHN0YWJzIGRpcmVjdGl2ZXMsIHRvIGZpbmQgdGhlIGRlZmluaXRpb25zIHRvIGFsbCBvZiB0aGUKKyAgICoJYWR2YW5jZWQgZGF0YSB0eXBlcywgYW5kIHRoaXMgaXMgZG9uZSBieSBWTVNfTFNZTV9QYXJzZS4gIFRoaXMKKyAgICoJbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgYW55IGRlZmluaXRpb25zIGFyZSBvdXRwdXQgdG8gdGhlIG9iamVjdAorICAgKglmaWxlLCBzaW5jZSB0aGVyZSBjYW4gYmUgZm9yd2FyZCByZWZlcmVuY2VzIGluIHRoZSBzdGFicworICAgKglkaXJlY3RpdmVzLiAgV2hlbiB0aHJvdWdoIHdpdGggcGFyc2luZywgdGhlIHRleHQgb2YgdGhlIHN0YWJzCisgICAqCWRpcmVjdGl2ZSBpcyBhbHRlcmVkLCB3aXRoIHRoZSBkZWZpbml0aW9ucyByZW1vdmVkLCBzbyB0aGF0IGxhdGVyCisgICAqCXBhc3NlcyB3aWxsIHNlZSBkaXJlY3RpdmVzIGFzIHRoZXkgd291bGQgYmUgd3JpdHRlbiBpZiB0aGUgdHlwZQorICAgKgl3ZXJlIGFscmVhZHkgZGVmaW5lZC4KKyAgICoKKyAgICoJV2UgYWxzbyBsb29rIGZvciBmaWxlcyBhbmQgaW5jbHVkZSBmaWxlcywgYW5kIG1ha2UgYSBsaXN0IG9mCisgICAqCXRoZW0uICBXZSBleGFtaW5lIHRoZSBzb3VyY2UgZmlsZSBudW1iZXJzIHRvIGVzdGFibGlzaCB0aGUgYWN0dWFsCisgICAqCWxpbmVzIHRoYXQgY29kZSB3YXMgZ2VuZXJhdGVkIGZyb20sIGFuZCB0aGVuIGdlbmVyYXRlIG9mZnNldHMuCisgICAqLworICBWTVNfTFNZTV9QYXJzZSAoKTsKKyAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIC8qIE9ubHkgZGVhbCB3aXRoIFNUQUIgc3ltYm9scyBoZXJlLiAgKi8KKyAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkpCisJY29udGludWU7CisgICAgICAvKgorICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlLgorICAgICAgICovCisgICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKKwl7CisJY2FzZSBOX1NMSU5FOgorCSAgZHNjID0gU19HRVRfREVTQyAoc3ltYm9sUCk7CisJICBpZiAoZHNjID4gQ3VyX0ZpbGUtPm1heF9saW5lKQorCSAgICBDdXJfRmlsZS0+bWF4X2xpbmUgPSBkc2M7CisJICBpZiAoZHNjIDwgQ3VyX0ZpbGUtPm1pbl9saW5lKQorCSAgICBDdXJfRmlsZS0+bWluX2xpbmUgPSBkc2M7CisJICBicmVhazsKKwljYXNlIE5fU086CisJICBDdXJfRmlsZSA9IGZpbmRfZmlsZSAoc3ltYm9sUCk7CisJICBDdXJfRmlsZS0+ZmxhZyA9IDE7CisJICBDdXJfRmlsZS0+bWluX2xpbmUgPSAxOworCSAgYnJlYWs7CisJY2FzZSBOX1NPTDoKKwkgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKKwkgIGJyZWFrOworCWNhc2UgTl9HU1lNOgorCSAgVk1TX0dTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOworCSAgYnJlYWs7CisJY2FzZSBOX0xDU1lNOgorCSAgVk1TX0xDU1lNX1BhcnNlIChzeW1ib2xQLCBUZXh0X1BzZWN0KTsKKwkgIGJyZWFrOworCWNhc2UgTl9GVU46CQkvKiBGb3Igc3RhdGljIGNvbnN0YW50IHN5bWJvbHMgKi8KKwljYXNlIE5fU1RTWU06CisJICBWTVNfU1RTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0JCS8qIHN3aXRjaCAqLworICAgIH0JCQkvKiBmb3IgKi8KKworICAvKgorICAgKglOb3cgd2UgdGFrZSBhIHF1aWNrIHN3ZWVwIHRocm91Z2ggdGhlIGZpbGVzIGFuZCBhc3NpZ24gb2Zmc2V0cworICAgKgl0byBlYWNoIG9uZS4gIFRoaXMgd2lsbCBlc3NlbnRpYWxseSBiZSB0aGUgc3RhcnRpbmcgbGluZSBudW1iZXIgdG8KKyAgICoJdGhlIGRlYnVnZ2VyIGZvciBlYWNoIGZpbGUuICBPdXRwdXQgdGhlIGluZm8gZm9yIHRoZSBkZWJ1Z2dlciB0bworICAgKglzcGVjaWZ5IHRoZSBmaWxlcywgYW5kIHRoZW4gdGVsbCBpdCBob3cgbWFueSBsaW5lcyB0byB1c2UuCisgICAqLworICBmb3IgKEN1cl9GaWxlID0gZmlsZV9yb290OyBDdXJfRmlsZTsgQ3VyX0ZpbGUgPSBDdXJfRmlsZS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoQ3VyX0ZpbGUtPm1heF9saW5lID09IDApCisJY29udGludWU7CisgICAgICBpZiAoKHN0cm5jbXAgKEN1cl9GaWxlLT5uYW1lLCAiR05VX0dYWF9JTkNMVURFOiIsIDE2KSA9PSAwKSAmJgorCSAgIWZsYWdfZGVidWcpCisJY29udGludWU7CisgICAgICBpZiAoKHN0cm5jbXAgKEN1cl9GaWxlLT5uYW1lLCAiR05VX0NDX0lOQ0xVREU6IiwgMTUpID09IDApICYmCisJICAhZmxhZ19kZWJ1ZykKKwljb250aW51ZTsKKyAgICAgIC8qIHNob3cgYSBmZXcgZXh0cmEgbGluZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gc2VsZWN0ZWQgKi8KKyAgICAgIGlmIChDdXJfRmlsZS0+bWluX2xpbmUgPiAyKQorCUN1cl9GaWxlLT5taW5fbGluZSAtPSAyOworICAgICAgQ3VyX0ZpbGUtPm9mZnNldCA9IERlYnVnZ2VyX09mZnNldCAtIEN1cl9GaWxlLT5taW5fbGluZSArIDE7CisgICAgICBEZWJ1Z2dlcl9PZmZzZXQgKz0gQ3VyX0ZpbGUtPm1heF9saW5lIC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMTsKKyAgICAgIGlmIChDdXJfRmlsZS0+c2FtZV9maWxlX2ZwbnQpCisJeworCSAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gQ3VyX0ZpbGUtPnNhbWVfZmlsZV9mcG50LT5maWxlX251bWJlcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gKytGaWxlX051bWJlcjsKKwkgIGZpbGVfYXZhaWxhYmxlID0gVk1TX1RCVF9Tb3VyY2VfRmlsZSAoQ3VyX0ZpbGUtPm5hbWUsCisJCQkJCQlDdXJfRmlsZS0+ZmlsZV9udW1iZXIpOworCSAgaWYgKCFmaWxlX2F2YWlsYWJsZSkKKwkgICAgeworCSAgICAgIEN1cl9GaWxlLT5maWxlX251bWJlciA9IDA7CisJICAgICAgRmlsZV9OdW1iZXItLTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKyAgICAgIFZNU19UQlRfU291cmNlX0xpbmVzIChDdXJfRmlsZS0+ZmlsZV9udW1iZXIsCisJCQkgICAgQ3VyX0ZpbGUtPm1pbl9saW5lLAorCQkJICAgIEN1cl9GaWxlLT5tYXhfbGluZSAtIEN1cl9GaWxlLT5taW5fbGluZSArIDEpOworICB9CQkJLyogZm9yICovCisgIEN1cl9GaWxlID0gKHN0cnVjdCBpbnB1dF9maWxlICopIE5VTEw7CisKKyAgLyoKKyAgICoJU2NhbiB0aGUgc3ltYm9scyBhbmQgd3JpdGUgb3V0IHRoZSByb3V0aW5lcworICAgKgkodGhpcyBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHN5bWJvbHMgYXJlIGluCisgICAqCSBvcmRlciBvZiBhc2NlbmRpbmcgdGV4dCBzZWdtZW50IG9mZnNldCkKKyAgICovCisgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKKyAgICB7CisgICAgICAvKgorICAgICAgICoJRGVhbCB3aXRoIHRleHQgc3ltYm9scy4KKyAgICAgICAqLworICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiBTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpCisJeworCSAgLyoKKwkgICAqIElnbm9yZSBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggIkwiLCBhcyB0aGV5IGFyZSBsb2NhbCBzeW1ib2xzLgorCSAgICovCisJICBpZiAoKlNfR0VUX05BTUUgKHN5bWJvbFApID09ICdMJykKKwkgICAgY29udGludWU7CisJICAvKgorCSAgICogSWYgdGhlcmUgaXMgYSByb3V0aW5lIHN0YXJ0IGRlZmluZWQsIHRlcm1pbmF0ZSBpdC4KKwkgICAqLworCSAgaWYgKEN1cnJlbnRfUm91dGluZSkKKwkgICAgVk1TX1RCVF9Sb3V0aW5lX0VuZCAodGV4dF9zaXosIEN1cnJlbnRfUm91dGluZSk7CisKKwkgIC8qCisJICAgKiBDaGVjayBmb3IgJiBza2lwIGR1bW15IGxhYmVscyBsaWtlICJnY2NfY29tcGlsZWQuIi4KKwkgICAqIFRoZXkncmUgaWRlbnRpZmllZCBieSB0aGUgSU5fREVGQVVMVF9TRUNUSU9OIGZsYWcuCisJICAgKi8KKwkgIGlmICgoU19HRVRfT1RIRVIgKHN5bWJvbFApICYgSU5fREVGQVVMVF9TRUNUSU9OKSAhPSAwICYmCisJICAgICAgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCisJICAgIGNvbnRpbnVlOworCSAgLyoKKwkgICAqIFN0b3JlIHRoZSByb3V0aW5lIGJlZ2luIHRyYWNlYmFjayBpbmZvLgorCSAgICovCisJICBWTVNfVEJUX1JvdXRpbmVfQmVnaW4gKHN5bWJvbFAsIFRleHRfUHNlY3QpOworCSAgQ3VycmVudF9Sb3V0aW5lID0gc3ltYm9sUDsKKwkgIC8qCisJICAgKiBEZWZpbmUgc3ltYm9scyBsb2NhbCB0byB0aGlzIHJvdXRpbmUuCisJICAgKi8KKwkgIGxvY2FsX3N5bWJvbHNfRFNUIChzeW1ib2xQLCBDdXJyZW50X1JvdXRpbmUpOworCSAgLyoKKwkgICAqCURvbmUKKwkgICAqLworCSAgY29udGludWU7CisKKwl9CisgICAgICAvKgorICAgICAgICoJRGVhbCB3aXRoIFNUQUIgc3ltYm9scy4KKyAgICAgICAqLworICAgICAgZWxzZSBpZiAoU19JU19ERUJVRyAoc3ltYm9sUCkpCisJeworCSAgLyoKKwkgICAqICBEaXNwYXRjaCBvbiBTVEFCIHR5cGUuCisJICAgKi8KKwkgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQorCSAgICB7CisJCS8qCisJCSAqCUxpbmUgbnVtYmVyCisJCSAqLworCSAgICBjYXNlIE5fU0xJTkU6CisJICAgICAgLyogT2Zmc2V0IHRoZSBsaW5lIGludG8gdGhlIGNvcnJlY3QgcG9ydGlvbiBvZiB0aGUgZmlsZS4gICovCisJICAgICAgaWYgKEN1cl9GaWxlLT5maWxlX251bWJlciA9PSAwKQorCQlicmVhazsKKwkgICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7CisJICAgICAgLyogU29tZXRpbWVzIHRoZSBzYW1lIG9mZnNldCBnZXRzIHNldmVyYWwgc291cmNlIGxpbmVzCisJCSBhc3NpZ25lZCB0byBpdC4gIFdlIHNob3VsZCBiZSBzZWxlY3RpdmUgYWJvdXQgd2hpY2gKKwkJIGxpbmVzIHdlIGFsbG93LCB3ZSBzaG91bGQgcHJlZmVyIGxpbmVzIHRoYXQgYXJlIGluCisJCSB0aGUgbWFpbiBzb3VyY2UgZmlsZSB3aGVuIGRlYnVnZ2luZyBpbmxpbmUgZnVuY3Rpb25zLiAgKi8KKwkgICAgICBpZiAodmFsID09IEN1cl9PZmZzZXQgJiYgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyICE9IDEpCisJCWJyZWFrOworCisJICAgICAgLyogY2FsY3VsYXRlIGFjdHVhbCBkZWJ1Z2dlciBzb3VyY2UgbGluZSAqLworCSAgICAgIGRzYyA9IFNfR0VUX0RFU0MgKHN5bWJvbFApICsgQ3VyX0ZpbGUtPm9mZnNldDsKKwkgICAgICBTX1NFVF9ERVNDIChzeW1ib2xQLCBkc2MpOworCSAgICAgIC8qCisJICAgICAgICogRGVmaW5lIFBDL0xpbmUgY29ycmVsYXRpb24uCisJICAgICAgICovCisJICAgICAgaWYgKEN1cl9PZmZzZXQgPT0gLTEpCisJCXsKKwkJICAvKgorCQkgICAqIEZpcnN0IE5fU0xJTkU7IHNldCB1cCBpbml0aWFsIGNvcnJlbGF0aW9uLgorCQkgICAqLworCQkgIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoZHNjLAorCQkJCQkgICAgICAgdmFsLAorCQkJCQkgICAgICAgVGV4dF9Qc2VjdCwKKwkJCQkJICAgICAgIDApOworCQl9CisJICAgICAgZWxzZSBpZiAoKGRzYyAtIEN1cl9MaW5lX051bWJlcikgPD0gMCkKKwkJeworCQkgIC8qCisJCSAgICogTGluZSBkZWx0YSBpcyBub3QgK3ZlLCB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBsaW5lIGFuZAorCQkgICAqIHN0YXJ0IGEgbmV3IFBDL0xpbmUgY29ycmVsYXRpb24uCisJCSAgICovCisJCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uICgwLAorCQkJCQkgICAgICAgdmFsIC0gQ3VyX09mZnNldCwKKwkJCQkJICAgICAgIDAsCisJCQkJCSAgICAgICAtMSk7CisJCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChkc2MsCisJCQkJCSAgICAgICB2YWwsCisJCQkJCSAgICAgICBUZXh0X1BzZWN0LAorCQkJCQkgICAgICAgMCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKgorCQkgICAqIExpbmUgZGVsdGEgaXMgK3ZlLCBhbGwgaXMgd2VsbC4KKwkJICAgKi8KKwkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKGRzYyAtIEN1cl9MaW5lX051bWJlciwKKwkJCQkJICAgICAgIHZhbCAtIEN1cl9PZmZzZXQsCisJCQkJCSAgICAgICAwLAorCQkJCQkgICAgICAgMSk7CisJCX0KKwkgICAgICAvKiBVcGRhdGUgdGhlIGN1cnJlbnQgbGluZS9QQyBpbmZvLiAgKi8KKwkgICAgICBDdXJfTGluZV9OdW1iZXIgPSBkc2M7CisJICAgICAgQ3VyX09mZnNldCA9IHZhbDsKKwkgICAgICBicmVhazsKKworCQkvKgorCQkgKglTb3VyY2UgZmlsZQorCQkgKi8KKwkgICAgY2FzZSBOX1NPOgorCSAgICAgIC8qIFJlbWVtYmVyIHRoYXQgd2UgaGFkIGEgc291cmNlIGZpbGUgYW5kIGVtaXQKKwkJIHRoZSBzb3VyY2UgZmlsZSBkZWJ1Z2dlciByZWNvcmQuICAqLworCSAgICAgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE5fU09MOgorCSAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIHJlYWxseSBpbiB0aGUgYWN0dWFsCisJCSBzb3VyY2UgZmlsZSB3aGVuIHdlIGNvbXB1dGUgdGhlIG1heGltdW0gbGluZSBudW1iZXIuCisJCSBPdGhlcndpc2UgdGhlIGRlYnVnZ2VyIGdldHMgcmVhbGx5IGNvbmZ1c2VkLiAgKi8KKwkgICAgICBDdXJfRmlsZSA9IGZpbmRfZmlsZSAoc3ltYm9sUCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQkJLyogc3dpdGNoICovCisJfQkJLyogaWYgKElTX0RFQlVHKSAqLworICAgIH0JCQkvKiBmb3IgKi8KKworICAgIC8qCisgICAgICogSWYgdGhlcmUgaXMgYSByb3V0aW5lIHN0YXJ0IGRlZmluZWQsIHRlcm1pbmF0ZSBpdAorICAgICAqIChhbmQgdGhlIGxpbmUgbnVtYmVycykuCisgICAgICovCisgICAgaWYgKEN1cnJlbnRfUm91dGluZSkKKyAgICAgIHsKKwkvKiBUZXJtaW5hdGUgdGhlIGxpbmUgbnVtYmVycy4gICovCisJVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uICgwLAorCQkJCSAgICAgdGV4dF9zaXogLSBTX0dFVF9WQUxVRSAoQ3VycmVudF9Sb3V0aW5lKSwKKwkJCQkgICAgIDAsCisJCQkJICAgICAtMSk7CisJLyogVGVybWluYXRlIHRoZSByb3V0aW5lLiAgKi8KKwlWTVNfVEJUX1JvdXRpbmVfRW5kICh0ZXh0X3NpeiwgQ3VycmVudF9Sb3V0aW5lKTsKKyAgICAgIH0KKworICAvKiBXcml0ZSB0aGUgVHJhY2ViYWNrIEVuZCBNb2R1bGUgVEJUIHJlY29yZC4gICovCisgIFZNU19UQlRfTW9kdWxlX0VuZCAoKTsKK30KKwwKKworLyogV3JpdGUgYSBWQVgvVk1TIG9iamVjdCBmaWxlIChldmVyeXRoaW5nIGVsc2UgaGFzIGJlZW4gZG9uZSEpLiAgKi8KKwordm9pZAordm1zX3dyaXRlX29iamVjdF9maWxlICh0ZXh0X3NpeiwgZGF0YV9zaXosIGJzc19zaXosIHRleHRfZnJhZ19yb290LAorCQkgICAgICAgZGF0YV9mcmFnX3Jvb3QpCisgICAgIHVuc2lnbmVkIHRleHRfc2l6OworICAgICB1bnNpZ25lZCBkYXRhX3NpejsKKyAgICAgdW5zaWduZWQgYnNzX3NpejsKKyAgICAgZnJhZ1MgKnRleHRfZnJhZ19yb290OworICAgICBmcmFnUyAqZGF0YV9mcmFnX3Jvb3Q7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7CisKKyAgLyoKKyAgICogSW5pdGlhbGl6ZSBwcm9ncmFtIHNlY3Rpb24gaW5kaWNlczsgdmFsdWVzIGdldCB1cGRhdGVkIGxhdGVyLgorICAgKi8KKyAgUHNlY3RfTnVtYmVyID0gMDsJCS8qIG5leHQgUHNlY3QgSW5kZXggdG8gdXNlICovCisgIFRleHRfUHNlY3QgPSAtMTsJCS8qIFRleHQgUHNlY3QgSW5kZXggICAqLworICBEYXRhX1BzZWN0ID0gLTI7CQkvKiBEYXRhIFBzZWN0IEluZGV4ICAgSkY6IFdhcyAtMSAqLworICBCc3NfUHNlY3QgPSAtMzsJCS8qIEJzcyBQc2VjdCBJbmRleCAgICBKRjogV2FzIC0xICovCisgIEN0b3JzX1BzZWN0ID0gLTQ7CQkvKiBDdG9ycyBQc2VjdCBJbmRleCAgKi8KKyAgRHRvcnNfUHNlY3QgPSAtNTsJCS8qIER0b3JzIFBzZWN0IEluZGV4ICAqLworICAvKiBJbml0aWFsaXplIG90aGVyIHN0YXRlIHZhcmlhYmxlcy4gICovCisgIERhdGFfU2VnbWVudCA9IDA7CisgIExvY2FsX0luaXRkX0RhdGFfU2l6ZSA9IDA7CisKKyAgLyoKKyAgICoJQ3JlYXRlIHRoZSBhY3R1YWwgb3V0cHV0IGZpbGUgYW5kIHBvcHVsYXRlIGl0IHdpdGggcmVxdWlyZWQKKyAgICoJIm1vZHVsZSBoZWFkZXIiIGluZm9ybWF0aW9uLgorICAgKi8KKyAgQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSAoKTsKKyAgV3JpdGVfVk1TX01IRF9SZWNvcmRzICgpOworCisgIC8qCisgICAqCUNyZWF0ZSB0aGUgRGF0YSBzZWdtZW50OgorICAgKgorICAgKglTaW5jZSB0aGlzIGlzIFJFQUxMWSBoYXJkIHRvIGRvIGFueSBvdGhlciB3YXksCisgICAqCXdlIGFjdHVhbGx5IG1hbnVmYWN0dXJlIHRoZSBkYXRhIHNlZ21lbnQgYW5kCisgICAqCXRoZW4gc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBvdXQgb2YgaXQuCisgICAqCVdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhpcyBlYXJseSwgc28gdGhhdCBnbG9iYWx2YWx1ZXMKKyAgICoJY2FuIGJlIHByb3Blcmx5IGVtaXR0ZWQuCisgICAqLworICBpZiAoZGF0YV9zaXogPiAwKQorICAgIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50IChkYXRhX3NpeiwgdGV4dF9zaXosIGRhdGFfZnJhZ19yb290KTsKKworCisgIC8qKioqKioqICBHbG9iYWwgU3ltYm9sIERpcmVjdG9yeSAgKioqKioqKi8KKworICAvKgorICAgKglFbWl0IGdsb2JhbHZhbHVlcyBub3cuICBXZSBtdXN0IGRvIHRoaXMgYmVmb3JlIHRoZSB0ZXh0IHBzZWN0IGlzCisgICAqCWRlZmluZWQsIG9yIHdlIHdpbGwgZ2V0IGxpbmtlciB3YXJuaW5ncyBhYm91dCBtdWx0aXBseSBkZWZpbmVkCisgICAqCXN5bWJvbHMuICBBbGwgb2YgdGhlIGdsb2JhbHZhbHVlcyAicmVmZXJlbmNlIiBwc2VjdCAwLCBhbHRob3VnaAorICAgKglpdCByZWFsbHkgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIGl0LgorICAgKi8KKyAgVk1TX0VtaXRfR2xvYmFsdmFsdWVzICh0ZXh0X3NpeiwgZGF0YV9zaXosIERhdGFfU2VnbWVudCk7CisgIC8qCisgICAqCURlZmluZSB0aGUgVGV4dCBQc2VjdAorICAgKi8KKyAgVGV4dF9Qc2VjdCA9IFBzZWN0X051bWJlcisrOworICBWTVNfUHNlY3RfU3BlYyAoIiRjb2RlIiwgdGV4dF9zaXosIHBzX1RFWFQsIDApOworICAvKgorICAgKglEZWZpbmUgdGhlIEJTUyBQc2VjdAorICAgKi8KKyAgaWYgKGJzc19zaXogPiAwKQorICAgIHsKKyAgICAgIEJzc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOworICAgICAgVk1TX1BzZWN0X1NwZWMgKCIkdW5pbml0aWFsaXplZF9kYXRhIiwgYnNzX3NpeiwgcHNfREFUQSwgMCk7CisgICAgfQorICAvKgorICAgKiBEZWZpbmUgc3ltYm9scyB0byB0aGUgbGlua2VyLgorICAgKi8KKyAgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkgKHRleHRfc2l6LCBkYXRhX3Npeik7CisgIC8qCisgICAqCURlZmluZSB0aGUgRGF0YSBQc2VjdAorICAgKi8KKyAgaWYgKGRhdGFfc2l6ID4gMCAmJiBMb2NhbF9Jbml0ZF9EYXRhX1NpemUgPiAwKQorICAgIHsKKyAgICAgIERhdGFfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKKyAgICAgIFZNU19Qc2VjdF9TcGVjICgiJGRhdGEiLCBMb2NhbF9Jbml0ZF9EYXRhX1NpemUsIHBzX0RBVEEsIDApOworICAgICAgLyoKKyAgICAgICAqIExvY2FsIGluaXRpYWxpemVkIGRhdGEgKE5fREFUQSkgc3ltYm9scyBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gdGhlCisgICAgICAgKiBwcm9wZXIgdmFsdWUgb2YgRGF0YV9Qc2VjdCBub3cgdGhhdCBpdCdzIGFjdHVhbGx5IGJlZW4gZGVmaW5lZC4KKyAgICAgICAqIChBIGR1bW15IHZhbHVlIHdhcyB1c2VkIGluIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5KCkgYWJvdmUuKQorICAgICAgICovCisgICAgICBmb3IgKHZzcCA9IFZNU19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKKwlpZiAodnNwLT5Qc2VjdF9JbmRleCA8IDAgJiYgU19HRVRfUkFXX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSBOX0RBVEEpCisJICB2c3AtPlBzZWN0X0luZGV4ID0gRGF0YV9Qc2VjdDsKKyAgICB9CisKKworICBpZiAoQ3RvcnNfU3ltYm9scyAhPSAwKQorICAgIHsKKyAgICAgIGNoYXIgKnBzX25hbWUgPSAiJGN0b3JzIjsKKyAgICAgIEN0b3JzX1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7CisgICAgICBWTVNfUHNlY3RfU3BlYyAocHNfbmFtZSwgQ3RvcnNfU3ltYm9scy0+UHNlY3RfT2Zmc2V0ICsgWFRPUl9TSVpFLAorCQkgICAgICBwc19DVE9SUywgMCk7CisgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChwc19uYW1lLCBDdG9yc19Qc2VjdCwKKwkJCQkgIDAsIEdCTFNZTV9ERUZ8R0JMU1lNX1dFQUspOworICAgICAgZm9yICh2c3AgPSBDdG9yc19TeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKKwl2c3AtPlBzZWN0X0luZGV4ID0gQ3RvcnNfUHNlY3Q7CisgICAgfQorCisgIGlmIChEdG9yc19TeW1ib2xzICE9IDApCisgICAgeworICAgICAgY2hhciAqcHNfbmFtZSA9ICIkZHRvcnMiOworICAgICAgRHRvcnNfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKKyAgICAgIFZNU19Qc2VjdF9TcGVjIChwc19uYW1lLCBEdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQgKyBYVE9SX1NJWkUsCisJCSAgICAgIHBzX0RUT1JTLCAwKTsKKyAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHBzX25hbWUsIER0b3JzX1BzZWN0LAorCQkJCSAgMCwgR0JMU1lNX0RFRnxHQkxTWU1fV0VBSyk7CisgICAgICBmb3IgKHZzcCA9IER0b3JzX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQorCXZzcC0+UHNlY3RfSW5kZXggPSBEdG9yc19Qc2VjdDsKKyAgICB9CisKKyAgLyoqKioqKiogIFRleHQgSW5mb3JtYXRpb24gYW5kIFJlbG9jYXRpb24gUmVjb3JkcyAgKioqKioqKi8KKworICAvKgorICAgKglXcml0ZSB0aGUgdGV4dCBzZWdtZW50IGRhdGEKKyAgICovCisgIGlmICh0ZXh0X3NpeiA+IDApCisgICAgdm1zX2ZpeHVwX3RleHRfc2VjdGlvbiAodGV4dF9zaXosIHRleHRfZnJhZ19yb290LCBkYXRhX2ZyYWdfcm9vdCk7CisgIC8qCisgICAqCVdyaXRlIHRoZSBkYXRhIHNlZ21lbnQgZGF0YSwgdGhlbiBkaXNjYXJkIGl0LgorICAgKi8KKyAgaWYgKGRhdGFfc2l6ID4gMCkKKyAgICB7CisgICAgICB2bXNfZml4dXBfZGF0YV9zZWN0aW9uIChkYXRhX3NpeiwgdGV4dF9zaXopOworICAgICAgZnJlZSAoRGF0YV9TZWdtZW50KSwgIERhdGFfU2VnbWVudCA9IDA7CisgICAgfQorCisgIGlmIChDdG9yc19TeW1ib2xzICE9IDApCisgICAgeworICAgICAgdm1zX2ZpeHVwX3h0b3JzX3NlY3Rpb24gKEN0b3JzX1N5bWJvbHMsIEN0b3JzX1BzZWN0KTsKKyAgICB9CisKKyAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKKyAgICB7CisgICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoRHRvcnNfU3ltYm9scywgRHRvcnNfUHNlY3QpOworICAgIH0KKworCisgIC8qKioqKioqICBEZWJ1Z2dlciBTeW1ib2wgVGFibGUgUmVjb3JkcyAgKioqKioqKi8KKworICB2bXNfYnVpbGRfRFNUICh0ZXh0X3Npeik7CisKKworICAvKioqKioqKiAgV3JhcCB0aGluZ3MgdXAgICoqKioqKiovCisKKyAgLyoKKyAgICoJV3JpdGUgdGhlIEVuZCBPZiBNb2R1bGUgcmVjb3JkCisgICAqLworICBpZiAoRW50cnlfUG9pbnRfU3ltYm9sKQorICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkIChUZXh0X1BzZWN0LCBTX0dFVF9WQUxVRSAoRW50cnlfUG9pbnRfU3ltYm9sKSk7CisgIGVsc2UKKyAgICBXcml0ZV9WTVNfRU9NX1JlY29yZCAoLTEsICh2YWx1ZVQpIDApOworCisgIC8qCisgICAqCUFsbCBkb25lLCBjbG9zZSB0aGUgb2JqZWN0IGZpbGUKKyAgICovCisgIENsb3NlX1ZNU19PYmplY3RfRmlsZSAoKTsKK30KKworLyogZW5kIG9mIG9iai12bXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotdm1zLmggYi9nYXMvY29uZmlnL29iai12bXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBjMWZiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy9vYmotdm1zLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qIFZNUyBvYmplY3QgZmlsZSBmb3JtYXQKKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCitHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICovCisKKy8qIFRhZyB0byB2YWxpZGF0ZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgcHJvY2Vzc2luZyAqLworI2RlZmluZSBPQkpfVk1TIDEKKworI2luY2x1ZGUgInRhcmctY3B1LmgiCisKKyNkZWZpbmUgTE9OR1dPUkRfQUxJR05NRU5UCTIKKworLyogVGhpcyBtYWNybyBjb250cm9scyBzdWJzZWN0aW9uIGFsaWdubWVudCB3aXRoaW4gYSBzZWN0aW9uLgorICoKKyAqIFVuZGVyIFZBWC9WTVMsIHRoZSBsaW5rZXIgKGFuZCBQU0VDVCBzcGVjaWZpY2F0aW9ucykKKyAqIHRha2UgY2FyZSBvZiBjb3JyZWN0bHkgYWxpZ25pbmcgdGhlIHNlZ21lbnRzLgorICogRG9pbmcgdGhlIGFsaWdubWVudCBoZXJlIChvbiBpbml0aWFsaXplZCBkYXRhKSBjYW4KKyAqIG1lc3MgdXAgdGhlIGNhbGN1bGF0aW9uIG9mIGdsb2JhbCBkYXRhIFBTRUNUIHNpemVzLgorICovCisjZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJXAorCQkoKChTRUcpID09IGRhdGFfc2VjdGlvbikgPyAwIDogTE9OR1dPUkRfQUxJR05NRU5UKQorCisvKiBUaGlzIGZsYWcgaXMgdXNlZCB0byByZW1lbWJlciB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgY29uc3Qgb3IgdGhlCisgICBkYXRhIHNlY3Rpb24uICBCeSBhbmQgbGFyZ2UgdGhleSBhcmUgaWRlbnRpY2FsLCBidXQgd2Ugc2V0IGEgbm8td3JpdGUKKyAgIGJpdCBmb3IgcHNlY3RzIGluIHRoZSBjb25zdCBzZWN0aW9uLiAgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29uc3RfZmxhZzsKKworLyogVGhpcyBpcyBvdmVybG9hZGVkIG9udG8gY29uc3RfZmxhZywgZm9yIGNvbnZlbmllbmNlLiAgSXQncyB1c2VkIHRvIGZsYWcKKyAgIGR1bW15IGxhYmVscyBsaWtlICJnY2MyX2NvbXBpbGVkLiIgIHdoaWNoIG9jY3VyIGJlZm9yZSB0aGUgZmlyc3QgLnRleHQKKyAgIG9yIC5kYXRhIHNlY3Rpb24gZGlyZWN0aXZlLiAgKi8KKworI2RlZmluZSBJTl9ERUZBVUxUX1NFQ1RJT04gMHg4MAorCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBvYmotdm1zLmMuICovCitleHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOworZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOworCisjdW5kZWYgTk9fUkVMT0MKK2VudW0gcmVsb2NfdHlwZQorICB7CisgICAgTk9fUkVMT0MsIFJFTE9DXzMyCisgIH07CisKKyNkZWZpbmUgTl9CQURNQUcoeCkJKDApCisjZGVmaW5lIE5fVFhUT0ZGKHgpCSggc2l6ZW9mKHN0cnVjdCBleGVjKSApCisjZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKKyNkZWZpbmUgTl9UUk9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCisjZGVmaW5lIE5fRFJPRkYoeCkJKCBOX1RST0ZGKHgpICsgKHgpLmFfdHJzaXplICkKKyNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RST0ZGKHgpICsgKHgpLmFfZHJzaXplICkKKyNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQorCisvKiBXZSB1c2UgdGhpcyBjb3B5IG9mIHRoZSBleGVjIGhlYWRlciBmb3IgVk1TLiAgV2UgZG8gbm90IGFjdHVhbGx5IHVzZSBpdCwgYnV0CisgICB3aGF0IHdlIGFjdHVhbGx5IGRvIGlzIGxldCBnYXMgZmlsbCBpbiB0aGUgcmVsZXZhbnQgc2xvdHMsIGFuZCB3aGVuIHdlIGdldAorICAgYXJvdW5kIHRvIHdyaXRpbmcgYW4gb2JqIGZpbGUsIHdlIGp1c3QgcGljayBvdXQgd2hhdCB3ZSBuZWVkLiAgKi8KKworc3RydWN0IGV4ZWMKK3sKKyAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBzdGFydCBhZGRyZXNzICovCisgIHVuc2lnbmVkIGxvbmcgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCit9OworCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCisgICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KKyAgfQorb2JqZWN0X2hlYWRlcnM7CisKKy8qIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUKKyAqICh0aGlzIHN0YXJ0ZWQgYXMgYSBjbG9uZSBvZiBib3V0LmgncyBubGlzdCwgYnV0IG11Y2ggd2FzIHVubmVlZGVkKS4KKyAqLworc3RydWN0IG5saXN0CisgIHsKKyAgICBjaGFyICpuX25hbWU7CisgICAgdW5zaWduZWQgY2hhciBuX3R5cGU7CS8qIFNlZSBiZWxvdwkJCQkqLworICAgIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJLyogdXNlZCBmb3IgY29uc3RfZmxhZyBhbmQgImRlZmF1bHQgc2VjdGlvbiIgKi8KKyAgICB1bnNpZ25lZAk6IDE2OwkJLyogcGFkZGluZyBmb3IgYWxpZ25tZW50ICovCisgICAgaW50IG5fZGVzYzsJCQkvKiBzb3VyY2UgbGluZSBudW1iZXIgZm9yIE5fU0xJTkUgc3RhYnMgKi8KKyAgfTsKKworLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZSAoc2VlIGFvdXQvc3RhYi5kZWYgZm9yIHRoZSBtYWpvcml0eSBvZiB0aGUgY29kZXMpLgorICovCisjZGVmaW5lIE5fVU5ERgkwCQkvKiBVbmRlZmluZWQgc3ltYm9sCSovCisjZGVmaW5lIE5fQUJTCTIJCS8qIEFic29sdXRlIHN5bWJvbAkqLworI2RlZmluZSBOX1RFWFQJNAkJLyogVGV4dCBzeW1ib2wJCSovCisjZGVmaW5lIE5fREFUQQk2CQkvKiBEYXRhIHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9CU1MJOAkJLyogQlNTIHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9GTgkzMQkJLyogRmlsZW5hbWUgc3ltYm9sCSovCisKKyNkZWZpbmUgTl9FWFQJMQkJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLworI2RlZmluZSBOX1RZUEUJMDM2CQkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCisKKyNkZWZpbmUgTl9TVEFCCTAzNDAJCS8qIE1hc2sgZm9yIGFsbCBiaXRzIHVzZWQgZm9yIFNEQiBlbnRyaWVzIAkqLworCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorCisvKiBTWU1CT0wgVEFCTEUgKi8KKy8qIFN5bWJvbCB0YWJsZSBlbnRyeSBkYXRhIHR5cGUgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgbmxpc3Qgb2JqX3N5bWJvbF90eXBlOwkvKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KKworLyogU3ltYm9sIHRhYmxlIG1hY3JvcyBhbmQgY29uc3RhbnRzICovCisKKyNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IFZNU19TeW1ib2wgKgorCisvKgorICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCisgKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgorICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCisgKi8KKworLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCisjZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQorCisvKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KKyNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoU19HRVRfVFlQRShzKSAhPSBOX1VOREYpCisKKyNkZWZpbmUgU19JU19DT01NT04ocykJKFNfR0VUX1RZUEUocykgPT0gTl9VTkRGICYmIFNfR0VUX1ZBTFVFKHMpICE9IDApCisKKyNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCisKKy8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLworI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQorLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLworLyogQSBzeW1ib2wgbmFtZSB3aG9zZSBuYW1lIGJlZ2luIHdpdGggXkEgaXMgYSBnYXMgaW50ZXJuYWwgcHNldWRvIHN5bWJvbAorICAgbmFtZWxlc3Mgc3ltYm9scyBjb21lIGZyb20gLnN0YWIgZGlyZWN0aXZlcy4gKi8KKyNkZWZpbmUgU19JU19MT0NBTChzKQkJKFNfR0VUX05BTUUocykgJiYgXAorCQkJCSAhU19JU19ERUJVRyhzKSAmJiBcCisJCQkJIChzdHJjaHIoU19HRVRfTkFNRShzKSwgJ1wwMDEnKSAhPSAwIHx8IFwKKwkJCQkgIHN0cmNocihTX0dFVF9OQU1FKHMpLCAnXDAwMicpICE9IDAgfHwgXAorCQkJCSAgKFNfTE9DQUxfTkFNRShzKSAmJiAhZmxhZ19rZWVwX2xvY2FscykpKQorLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KKyNkZWZpbmUgU19JU19FWFRFUk4ocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKKy8qIFRydWUgaWYgdGhlIHN5bWJvbCBoYXMgYmVlbiBnZW5lcmF0ZWQgYmVjYXVzZSBvZiBhIC5zdGFiZCBkaXJlY3RpdmUgKi8KKyNkZWZpbmUgU19JU19TVEFCRChzKQkJKFNfR0VUX05BTUUocykgPT0gKGNoYXIgKikwKQorCisvKiBBY2Nlc3NvcnMgKi8KKy8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KKyNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fbmFtZSkKKy8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpCQkoKHMpLT5zeV9uYW1lX29mZnNldCkKKy8qIFRoZSByYXcgdHlwZSBvZiB0aGUgc3ltYm9sICovCisjZGVmaW5lIFNfR0VUX1JBV19UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlKQorLyogVGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAqLworI2RlZmluZSBTX0dFVF9UWVBFKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9UWVBFKQorLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KKyNkZWZpbmUgU19HRVRfU0VHTUVOVChzKQkoTl9UWVBFX3NlZ1tTX0dFVF9UWVBFKHMpXSkKKy8qIFRoZSBuX290aGVyIGV4cHJlc3Npb24gdmFsdWUgKi8KKyNkZWZpbmUgU19HRVRfT1RIRVIocykJCSgocyktPnN5X3N5bWJvbC5uX290aGVyKQorLyogVGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCisjZGVmaW5lIFNfR0VUX0RFU0MocykJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MpCisKKy8qIE1vZGlmaWVycyAqLworLyogQXNzdW1lIHRoYXQgYSBzeW1ib2wgY2Fubm90IGJlIHNpbXVsdGFuZW91c2x5IGluIG1vcmUgdGhhbiBvbiBzZWdtZW50ICovCisvKiBzZXQgc2VnbWVudCAqLworI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsc2VnKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX1RZUEUsKHMpLT5zeV9zeW1ib2wubl90eXBlfD1TRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykpCisvKiBUaGUgc3ltYm9sIGlzIGV4dGVybmFsICovCisjZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgfD0gTl9FWFQpCisvKiBUaGUgc3ltYm9sIGlzIG5vdCBleHRlcm5hbCAqLworI2RlZmluZSBTX0NMRUFSX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJj0gfk5fRVhUKQorLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KKyNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl9uYW1lID0gKHYpKQorLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLworI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9uYW1lX29mZnNldCA9ICh2KSkKKy8qIFNldCB0aGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCisjZGVmaW5lIFNfU0VUX09USEVSKHMsdikJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIgPSAodikpCisvKiBTZXQgdGhlIG5fZGVzYyBleHByZXNzaW9uIHZhbHVlICovCisjZGVmaW5lIFNfU0VUX0RFU0Mocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYyA9ICh2KSkKKy8qIFNldCB0aGUgbl90eXBlIGV4cHJlc3Npb24gdmFsdWUgKi8KKyNkZWZpbmUgU19TRVRfVFlQRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID0gKHYpKQorCisKKy8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KKworI2RlZmluZSBIX0dFVF9URVhUX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX3RleHQpCisjZGVmaW5lIEhfR0VUX0RBVEFfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfZGF0YSkKKyNkZWZpbmUgSF9HRVRfQlNTX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2JzcykKKworI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfdGV4dCA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX1RFWFQsICh2KSkpCisjZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfREFUQSwgKHYpKSkKKyNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfQlNTLCAodikpKQorCisjZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQorI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRShoLHYpCSgoaCktPmhlYWRlci5hX3N5bXMgPSAodikgKiBcCisJCQkJCSBzaXplb2Yoc3RydWN0IG5saXN0KSkKKworLyogbGluZSBudW1iZXJpbmcgc3R1ZmYuICovCisjZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KKworI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpCXs7fQorCisvKiBGb3JjZSBzdHJ1Y3R1cmUgdGFncyBpbnRvIHNjb3BlIHNvIHRoYXQgdGhlaXIgdXNlIGluIHByb3RvdHlwZXMKKyAgIHdpbGwgbmV2ZXIgYmUgdGhlaXIgZmlyc3Qgb2NjdXJhbmNlLiAgKi8KK3N0cnVjdCBmaXg7CitzdHJ1Y3Qgc3ltYm9sOworc3RydWN0IGZyYWc7CisKKy8qIG9iai12bXMgcm91dGluZXMgdmlzaWJsZSB0byB0aGUgcmVzdCBvZiBnYXMuICAqLworCitleHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICosc3RydWN0IGZpeCAqLHJlbGF4X2FkZHJlc3NUKSk7CisKK2V4dGVybiBpbnQgdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oWCkJdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKFgpCisKKy8qIENvbXBpbGVyLWdlbmVyYXRlZCBsYWJlbCAiX192YXhfZ19kb3VibGVzIiBpcyB1c2VkIHRvIGF1Z21lbnQgLnN0YWJzLiAqLworZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworI2RlZmluZSBvYmpfZnJvYl9sYWJlbChYKSB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwoWCkKKworZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9tYWluIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgdm1zX3dyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHVuc2lnbmVkLAorCQkJCQkgICBzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKKworLyogVk1TIGV4ZWN1dGFibGVzIGFyZSBub3RoaW5nIGxpa2UgYS5vdXQsIGJ1dCB0aGUgVk1TIHBvcnQgb2YgZ2NjIHVzZXMKKyAgIGEub3V0IGZvcm1hdCBzdGFicyB3aGljaCBvYmotdm1zLmMgdGhlbiB0cmFuc2xhdGVzLiAgKi8KKworI2RlZmluZSBBT1VUX1NUQUJTCisKKwwKKyNpZmRlZiBXQU5UX1ZNU19PQkpfREVGUworCisvKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIGNvbnN0YW50cyB1c2VkIHdpdGhpbgorICAgdGhlIGFjdHVhbCBWTVMgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QgdXNlIGEgJCBpbiB0aGUgc3ltYm9scyAoYXMgcGVyCisgICB1c3VhbCBWTVMgY29udmVudGlvbikgc2luY2UgU3lzdGVtIFYgZ2FncyBvbiBpdC4gICovCisKKyNkZWZpbmUJT0JKX1NfQ19IRFIJMAorI2RlZmluZQlPQkpfU19DX0hEUl9NSEQJMAorI2RlZmluZQlPQkpfU19DX0hEUl9MTk0JMQorI2RlZmluZQlPQkpfU19DX0hEUl9TUkMJMgorI2RlZmluZQlPQkpfU19DX0hEUl9UVEwJMworI2RlZmluZQlPQkpfU19DX0hEUl9DUFIJNAorI2RlZmluZQlPQkpfU19DX0hEUl9NVEMJNQorI2RlZmluZQlPQkpfU19DX0hEUl9HVFgJNgorI2RlZmluZQlPQkpfU19DX0dTRAkxCisjZGVmaW5lCU9CSl9TX0NfR1NEX1BTQwkwCisjZGVmaW5lCU9CSl9TX0NfR1NEX1NZTQkxCisjZGVmaW5lCU9CSl9TX0NfR1NEX0VQTQkyCisjZGVmaW5lCU9CSl9TX0NfR1NEX1BSTwkzCisjZGVmaW5lCU9CSl9TX0NfR1NEX1NZTVcJNAorI2RlZmluZQlPQkpfU19DX0dTRF9FUE1XCTUKKyNkZWZpbmUJT0JKX1NfQ19HU0RfUFJPVwk2CisjZGVmaW5lCU9CSl9TX0NfR1NEX0lEQwk3CisjZGVmaW5lCU9CSl9TX0NfR1NEX0VOVgk4CisjZGVmaW5lCU9CSl9TX0NfR1NEX0xTWQk5CisjZGVmaW5lCU9CSl9TX0NfR1NEX0xFUE0JMTAKKyNkZWZpbmUJT0JKX1NfQ19HU0RfTFBSTwkxMQorI2RlZmluZQlPQkpfU19DX0dTRF9TUFNDCTEyCisjZGVmaW5lCU9CSl9TX0NfVElSCTIKKyNkZWZpbmUJT0JKX1NfQ19FT00JMworI2RlZmluZQlPQkpfU19DX0RCRwk0CisjZGVmaW5lCU9CSl9TX0NfVEJUCTUKKyNkZWZpbmUJT0JKX1NfQ19MTksJNgorI2RlZmluZQlPQkpfU19DX0VPTVcJNworI2RlZmluZQlPQkpfU19DX01BWFJFQ1RZUAk3CisjZGVmaW5lCU9CSl9TX0tfU1VCVFlQCTEKKyNkZWZpbmUJT0JKX1NfQ19TVUJUWVAJMQorI2RlZmluZQlPQkpfU19DX01BWFJFQ1NJWgkyMDQ4CisjZGVmaW5lCU9CSl9TX0NfU1RSTFZMCTAKKyNkZWZpbmUJT0JKX1NfQ19TWU1TSVoJMzEKKyNkZWZpbmUJT0JKX1NfQ19TVE9SRVBMSU0JLTEKKyNkZWZpbmUJT0JKX1NfQ19QU0NBTElMSU0JOQorDAorI2RlZmluZQlNSERfU19DX01IRAkwCisjZGVmaW5lCU1IRF9TX0NfTE5NCTEKKyNkZWZpbmUJTUhEX1NfQ19TUkMJMgorI2RlZmluZQlNSERfU19DX1RUTAkzCisjZGVmaW5lCU1IRF9TX0NfQ1BSCTQKKyNkZWZpbmUJTUhEX1NfQ19NVEMJNQorI2RlZmluZQlNSERfU19DX0dUWAk2CisjZGVmaW5lCU1IRF9TX0NfTUFYSERSVFlQCTYKKwwKKyNkZWZpbmUJR1NEX1NfS19FTlRSSUVTCTEKKyNkZWZpbmUJR1NEX1NfQ19FTlRSSUVTCTEKKyNkZWZpbmUJR1NEX1NfQ19QU0MJMAorI2RlZmluZQlHU0RfU19DX1NZTQkxCisjZGVmaW5lCUdTRF9TX0NfRVBNCTIKKyNkZWZpbmUJR1NEX1NfQ19QUk8JMworI2RlZmluZQlHU0RfU19DX1NZTVcJNAorI2RlZmluZQlHU0RfU19DX0VQTVcJNQorI2RlZmluZQlHU0RfU19DX1BST1cJNgorI2RlZmluZQlHU0RfU19DX0lEQwk3CisjZGVmaW5lCUdTRF9TX0NfRU5WCTgKKyNkZWZpbmUJR1NEX1NfQ19MU1kJOQorI2RlZmluZQlHU0RfU19DX0xFUE0JMTAKKyNkZWZpbmUJR1NEX1NfQ19MUFJPCTExCisjZGVmaW5lCUdTRF9TX0NfU1BTQwkxMgorI2RlZmluZQlHU0RfU19DX1NZTVYJMTMKKyNkZWZpbmUJR1NEX1NfQ19FUE1WCTE0CisjZGVmaW5lCUdTRF9TX0NfUFJPVgkxNQorI2RlZmluZQlHU0RfU19DX01BWFJFQ1RZUAkxNQorDAorI2RlZmluZQlHU1lfU19NX1dFQUsJMQorI2RlZmluZQlHU1lfU19NX0RFRgkyCisjZGVmaW5lCUdTWV9TX01fVU5JCTQKKyNkZWZpbmUJR1NZX1NfTV9SRUwJOAorCisjZGVmaW5lCUxTWV9TX01fREVGCTIKKyNkZWZpbmUJTFNZX1NfTV9SRUwJOAorCisjZGVmaW5lCUVOVl9TX01fREVGCTEKKyNkZWZpbmUJRU5WX1NfTV9ORVNURUQJMgorDAorI2RlZmluZQlHUFNfU19NX1BJQwkxCisjZGVmaW5lCUdQU19TX01fTElCCTIKKyNkZWZpbmUJR1BTX1NfTV9PVlIJNAorI2RlZmluZQlHUFNfU19NX1JFTAk4CisjZGVmaW5lCUdQU19TX01fR0JMCTE2CisjZGVmaW5lCUdQU19TX01fU0hSCTMyCisjZGVmaW5lCUdQU19TX01fRVhFCTY0CisjZGVmaW5lCUdQU19TX01fUkQJMTI4CisjZGVmaW5lCUdQU19TX01fV1JUCTI1NgorI2RlZmluZQlHUFNfU19NX1ZFQwk1MTIKKyNkZWZpbmUJR1BTX1NfS19OQU1FCTkKKyNkZWZpbmUJR1BTX1NfQ19OQU1FCTkKKwwKKyNkZWZpbmUJVElSX1NfQ19TVEFfR0JMCTAKKyNkZWZpbmUJVElSX1NfQ19TVEFfU0IJMQorI2RlZmluZQlUSVJfU19DX1NUQV9TVwkyCisjZGVmaW5lCVRJUl9TX0NfU1RBX0xXCTMKKyNkZWZpbmUJVElSX1NfQ19TVEFfUEIJNAorI2RlZmluZQlUSVJfU19DX1NUQV9QVwk1CisjZGVmaW5lCVRJUl9TX0NfU1RBX1BMCTYKKyNkZWZpbmUJVElSX1NfQ19TVEFfVUIJNworI2RlZmluZQlUSVJfU19DX1NUQV9VVwk4CisjZGVmaW5lCVRJUl9TX0NfU1RBX0JGSQk5CisjZGVmaW5lCVRJUl9TX0NfU1RBX1dGSQkxMAorI2RlZmluZQlUSVJfU19DX1NUQV9MRkkJMTEKKyNkZWZpbmUJVElSX1NfQ19TVEFfRVBNCTEyCisjZGVmaW5lCVRJUl9TX0NfU1RBX0NLQVJHCTEzCisjZGVmaW5lCVRJUl9TX0NfU1RBX1dQQgkxNAorI2RlZmluZQlUSVJfU19DX1NUQV9XUFcJMTUKKyNkZWZpbmUJVElSX1NfQ19TVEFfV1BMCTE2CisjZGVmaW5lCVRJUl9TX0NfU1RBX0xTWQkxNworI2RlZmluZQlUSVJfU19DX1NUQV9MSVQJMTgKKyNkZWZpbmUJVElSX1NfQ19TVEFfTEVQTQkxOQorI2RlZmluZQlUSVJfU19DX01BWFNUQUNPRAkxOQorI2RlZmluZQlUSVJfU19DX01JTlNUT0NPRAkyMAorI2RlZmluZQlUSVJfU19DX1NUT19TQgkyMAorI2RlZmluZQlUSVJfU19DX1NUT19TVwkyMQorI2RlZmluZQlUSVJfU19DX1NUT19MCTIyCisjZGVmaW5lCVRJUl9TX0NfU1RPX0JECTIzCisjZGVmaW5lCVRJUl9TX0NfU1RPX1dECTI0CisjZGVmaW5lCVRJUl9TX0NfU1RPX0xECTI1CisjZGVmaW5lCVRJUl9TX0NfU1RPX0xJCTI2CisjZGVmaW5lCVRJUl9TX0NfU1RPX1BJRFIJMjcKKyNkZWZpbmUJVElSX1NfQ19TVE9fUElDUgkyOAorI2RlZmluZQlUSVJfU19DX1NUT19SU0IJMjkKKyNkZWZpbmUJVElSX1NfQ19TVE9fUlNXCTMwCisjZGVmaW5lCVRJUl9TX0NfU1RPX1JMCTMxCisjZGVmaW5lCVRJUl9TX0NfU1RPX1ZQUwkzMgorI2RlZmluZQlUSVJfU19DX1NUT19VU0IJMzMKKyNkZWZpbmUJVElSX1NfQ19TVE9fVVNXCTM0CisjZGVmaW5lCVRJUl9TX0NfU1RPX1JVQgkzNQorI2RlZmluZQlUSVJfU19DX1NUT19SVVcJMzYKKyNkZWZpbmUJVElSX1NfQ19TVE9fQgkzNworI2RlZmluZQlUSVJfU19DX1NUT19XCTM4CisjZGVmaW5lCVRJUl9TX0NfU1RPX1JCCTM5CisjZGVmaW5lCVRJUl9TX0NfU1RPX1JXCTQwCisjZGVmaW5lCVRJUl9TX0NfU1RPX1JJVkIJNDEKKyNkZWZpbmUJVElSX1NfQ19TVE9fUElSUgk0MgorI2RlZmluZQlUSVJfU19DX01BWFNUT0NPRAk0MgorI2RlZmluZQlUSVJfU19DX01JTk9QUkNPRAk1MAorI2RlZmluZQlUSVJfU19DX09QUl9OT1AJNTAKKyNkZWZpbmUJVElSX1NfQ19PUFJfQURECTUxCisjZGVmaW5lCVRJUl9TX0NfT1BSX1NVQgk1MgorI2RlZmluZQlUSVJfU19DX09QUl9NVUwJNTMKKyNkZWZpbmUJVElSX1NfQ19PUFJfRElWCTU0CisjZGVmaW5lCVRJUl9TX0NfT1BSX0FORAk1NQorI2RlZmluZQlUSVJfU19DX09QUl9JT1IJNTYKKyNkZWZpbmUJVElSX1NfQ19PUFJfRU9SCTU3CisjZGVmaW5lCVRJUl9TX0NfT1BSX05FRwk1OAorI2RlZmluZQlUSVJfU19DX09QUl9DT00JNTkKKyNkZWZpbmUJVElSX1NfQ19PUFJfSU5TVgk2MAorI2RlZmluZQlUSVJfU19DX09QUl9BU0gJNjEKKyNkZWZpbmUJVElSX1NfQ19PUFJfVVNICTYyCisjZGVmaW5lCVRJUl9TX0NfT1BSX1JPVAk2MworI2RlZmluZQlUSVJfU19DX09QUl9TRUwJNjQKKyNkZWZpbmUJVElSX1NfQ19PUFJfUkVERUYJNjUKKyNkZWZpbmUJVElSX1NfQ19PUFJfREZMSVQJNjYKKyNkZWZpbmUJVElSX1NfQ19NQVhPUFJDT0QJNjYKKyNkZWZpbmUJVElSX1NfQ19NSU5DVExDT0QJODAKKyNkZWZpbmUJVElSX1NfQ19DVExfU0VUUkIJODAKKyNkZWZpbmUJVElSX1NfQ19DVExfQVVHUkIJODEKKyNkZWZpbmUJVElSX1NfQ19DVExfREZMT0MJODIKKyNkZWZpbmUJVElSX1NfQ19DVExfU1RMT0MJODMKKyNkZWZpbmUJVElSX1NfQ19DVExfU1RLREwJODQKKyNkZWZpbmUJVElSX1NfQ19NQVhDVExDT0QJODQKKwwKKy8qCisgKglEZWJ1Z2dlciBzeW1ib2wgZGVmaW5pdGlvbnM6ICBUaGVzZSBhcmUgZG9uZSBieSBoYW5kLCBhcyBubworICoJCQkJCW1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBzZWVtcworICoJCQkJCXRvIGJlIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBEU1RfU19DX0MJICA3CS8qIExhbmd1YWdlID09ICJDIgkqLworI2RlZmluZSBEU1RfU19DX0NYWAkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KKyNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCTE1MworI2RlZmluZQlEU1RfU19DX1NPVVJDRQkxNTUJLyogU291cmNlIGZpbGUJCSovCisjZGVmaW5lIERTVF9TX0NfUFJPTE9HCTE2MgorI2RlZmluZQlEU1RfU19DX0JMS0JFRwkxNzYJLyogQmVnaW5uaW5nIG9mIGJsb2NrCSovCisjZGVmaW5lCURTVF9TX0NfQkxLRU5ECTE3NwkvKiBFbmQgb2YgYmxvY2sJKi8KKyNkZWZpbmUgRFNUX1NfQ19FTlRSWQkxODEKKyNkZWZpbmUgRFNUX1NfQ19QU0VDVAkxODQKKyNkZWZpbmUJRFNUX1NfQ19MSU5FX05VTQkxODUJLyogTGluZSBOdW1iZXIJCSovCisjZGVmaW5lIERTVF9TX0NfTEJMT1JMSVQJMTg2CisjZGVmaW5lIERTVF9TX0NfTEFCRUwJMTg3CisjZGVmaW5lCURTVF9TX0NfTU9EQkVHCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCisjZGVmaW5lCURTVF9TX0NfTU9ERU5ECTE4OQkvKiBFbmQgb2YgbW9kdWxlCSovCisjZGVmaW5lCURTVF9TX0NfUlROQkVHCTE5MAkvKiBCZWdpbm5pbmcgb2Ygcm91dGluZQkqLworI2RlZmluZQlEU1RfU19DX1JUTkVORAkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KKyNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLworI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLworI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCisjZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAorI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cJNQorI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IJNgorI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNworI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAorI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KKyNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCisjZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJCTExCisjZGVmaW5lIERTVF9TX0NfU0VUX1BDX0wJCTEyCisjZGVmaW5lIERTVF9TX0NfU0VUX1NUTVROVU0JMTMKKyNkZWZpbmUgRFNUX1NfQ19URVJNCQkxNAkvKiBFbmQgb2YgbGluZXMJKi8KKyNkZWZpbmUgRFNUX1NfQ19URVJNX1cJCTE1CS8qIEVuZCBvZiBsaW5lcwkqLworI2RlZmluZQlEU1RfU19DX1NFVF9BQlNfUEMJMTYJLyogU2V0IFBDCSovCisjZGVmaW5lCURTVF9TX0NfREVMVEFfUENfTAkxNwkvKiBJbmNyIFBDCSovCisjZGVmaW5lIERTVF9TX0NfSU5DUl9MSU5VTV9MCTE4CS8qIEluY3IgTGluZSAjCSovCisjZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0IJMTkJLyogU2V0IExpbmUgIwkqLworI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9MCTIwCS8qIFNldCBMaW5lICMJKi8KKyNkZWZpbmUJRFNUX1NfQ19URVJNX0wJCTIxCS8qIEVuZCBvZiBsaW5lcwkqLworLyogdGhlc2UgYXJlIHVzZWQgd2l0aCBEU1RfU19DX1NPVVJDRSAqLworI2RlZmluZSBEU1RfU19DX1NSQ19ERUNMRklMRQkgMQkvKiBEZWNsYXJlIHNvdXJjZSBmaWxlICovCisjZGVmaW5lIERTVF9TX0NfU1JDX1NFVEZJTEUJIDIJLyogU2V0IHNvdXJjZSBmaWxlICovCisjZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19MCSAzCS8qIFNldCByZWNvcmQsIGxvbmd3b3JkIHZhbHVlICovCisjZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19XCSA0CS8qIFNldCByZWNvcmQsIHdvcmQgdmFsdWUgKi8KKyNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfVwkxMAkvKiAjIG9mIGxpbmUsIHdvcmQgY291bnRlciAqLworI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19CCTExCS8qICMgb2YgbGluZSwgYnl0ZSBjb3VudGVyICovCisjZGVmaW5lIERTVF9TX0NfU1JDX0ZPUk1GRUVECTE2CS8qIF5MIGNvdW50cyBhcyBhIHJlY29yZCAqLworLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGNvZGVzIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzLiAgQW55dGhpbmcgbm90IG9uCisgKiB0aGUgbGlzdCBpcyBpbmNsdWRlZCB1bmRlciAnYWR2YW5jZWRfdHlwZScKKyAqLworI2RlZmluZSBEQkdfU19DX1VDSEFSCQkweDAyCisjZGVmaW5lIERCR19TX0NfVVNJTlQJCTB4MDMKKyNkZWZpbmUgREJHX1NfQ19VTElOVAkJMHgwNAorI2RlZmluZSBEQkdfU19DX1VRVUFECQkweDA1CisjZGVmaW5lIERCR19TX0NfU0NIQVIJCTB4MDYKKyNkZWZpbmUgREJHX1NfQ19TU0lOVAkJMHgwNworI2RlZmluZSBEQkdfU19DX1NMSU5UCQkweDA4CisjZGVmaW5lIERCR19TX0NfU1FVQUQJCTB4MDkKKyNkZWZpbmUgREJHX1NfQ19SRUFMNAkJMHgwYQorI2RlZmluZSBEQkdfU19DX1JFQUw4CQkweDBiCQkvKiBEX2Zsb2F0IGRvdWJsZSAqLworI2RlZmluZSBEQkdfU19DX0NPTVBMWDQJCTB4MGMJCS8qIDJ4Rl9mbG9hdCBjb21wbGV4IGZsb2F0ICovCisjZGVmaW5lIERCR19TX0NfQ09NUExYOAkJMHgwZAkJLyogMnhEX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCisjZGVmaW5lIERCR19TX0NfUkVBTDhfRwkJMHgxYgkJLyogR19mbG9hdCBkb3VibGUgKi8KKyNkZWZpbmUgREJHX1NfQ19DT01QTFg4X0cJMHgxZAkJLyogMnhHX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCisjZGVmaW5lIERCR19TX0NfRlVOQ1RJT05fQUREUgkweDE3CisjZGVmaW5lIERCR19TX0NfQURWQU5DRURfVFlQRQkweGEzCisvKiAgU29tZSBvZiB0aGVzZSBhcmUganVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFtwcl0KKyAqLworI2RlZmluZSBEQkdfU19DX1VCSVRBCQkweDAxCS8qIHVuc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLworI2RlZmluZSBEQkdfU19DX1VCSVRVCQkweDIyCS8qIHVuc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCisjZGVmaW5lIERCR19TX0NfU0JJVEEJCTB4MjkJLyogc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLworI2RlZmluZSBEQkdfU19DX1NCSVRVCQkweDJhCS8qIHNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLworI2RlZmluZSBEQkdfU19DX0NTVFJJTkcJCTB4MmUJLyogYXNjaXogKCdcMCcgdGVybWluYXRlZCkgc3RyaW5nICovCisjZGVmaW5lIERCR19TX0NfV0NIQVIJCTB4MzgJLyogd2NoYXJfdCAqLworLyogIFRoZXNlIGFyZSBkZXNjcmlwdG9yIGNsYXNzIGNvZGVzLgorICovCisjZGVmaW5lIERTQ19LX0NMQVNTX1MJCTB4MDEJLyogc3RhdGljIChmaXhlZCBsZW5ndGgpICovCisjZGVmaW5lIERTQ19LX0NMQVNTX0QJCTB4MDIJLyogZHluYW1pYyBzdHJpbmcgKG5vdCB2aWEgbWFsbG9jISkgKi8KKyNkZWZpbmUgRFNDX0tfQ0xBU1NfQQkJMHgwNAkvKiBhcnJheSAqLworI2RlZmluZSBEU0NfS19DTEFTU19VQlMJCTB4MGQJLyogdW5hbGlnbmVkIGJpdCBzdHJpbmcgKi8KKy8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRlZmluaXRpb25zIG9mIHN0cnVjdAorICogIHVuaW9uIGFuZCBlbnVtIHJlY29yZHMKKyAqLworI2RlZmluZSBEQkdfU19DX0VOVU1fSVRFTQkJMHhhNAorI2RlZmluZSBEQkdfU19DX0VOVU1fU1RBUlQJCTB4YTUKKyNkZWZpbmUgREJHX1NfQ19FTlVNX0VORAkJMHhhNgorI2RlZmluZSBEQkdfU19DX1NUUlVDVF9JVEVNCQlEU1RfS19WRkxBR1NfQklUT0ZGUwkvKiAweGZmICovCisjZGVmaW5lIERCR19TX0NfU1RSVUNUX1NUQVJUCQkweGFiCisjZGVmaW5lIERCR19TX0NfU1RSVUNUX0VORAkJMHhhYworI2RlZmluZSBEU1RfS19UWVBTUEVDCQkJMHhhZgkJLyogdHlwZSBzcGVjaWZpY2F0aW9uICovCisvKiBUaGVzZSBjb2RlcyBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkcworICovCisjZGVmaW5lIERTVF9LX1ZGTEFHU19OT1ZBTAkJMHg4MAkvKiBzdHJ1Y3QgZGVmaW5pdGlvbiBvbmx5ICovCisjZGVmaW5lIERTVF9LX1ZGTEFHU19EU0MJCTB4ZmEJLyogZGVzY3JpcHRvciB1c2VkICovCisjZGVmaW5lIERTVF9LX1ZGTEFHU19UVlMJCTB4ZmIJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCisjZGVmaW5lIERTVF9LX1ZTX0ZPTExPV1MJCTB4ZmQJLyogdmFsdWUgc3BlYyBmb2xsb3dzICovCisjZGVmaW5lIERTVF9LX1ZGTEFHU19CSVRPRkZTCQkweGZmCS8qIHZhbHVlIGNvbnRhaW5zIGJpdCBvZmZzZXQgKi8KKyNkZWZpbmUgRFNUX0tfVkFMS0lORF9MSVRFUkFMCTAKKyNkZWZpbmUgRFNUX0tfVkFMS0lORF9BRERSCTEKKyNkZWZpbmUgRFNUX0tfVkFMS0lORF9ERVNDCTIKKyNkZWZpbmUgRFNUX0tfVkFMS0lORF9SRUcJMworI2RlZmluZSBEU1RfS19SRUdfVkFYX0FQCTB4MGMJLyogUjEyICovCisjZGVmaW5lIERTVF9LX1JFR19WQVhfRlAJMHgwZAkvKiBSMTMgKi8KKyNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9TUAkweDBlCS8qIFIxNCAqLworI2RlZmluZSBEU1RfVl9WQUxLSU5ECQkwCS8qIG9mZnNldCBvZiB2YWxraW5kIGZpZWxkICovCisjZGVmaW5lIERTVF9WX0lORElSRUNUCQkyCS8qIG9mZnNldCB0byBpbmRpcmVjdCBiaXQgKi8KKyNkZWZpbmUgRFNUX1ZfRElTUAkJMwkvKiBvZmZzZXQgdG8gZGlzcGxhY2VtZW50IGJpdCAqLworI2RlZmluZSBEU1RfVl9SRUdOVU0JCTQJLyogb2Zmc2V0IHRvIHJlZ2lzdGVyIG51bWJlciAqLworI2RlZmluZSBEU1RfTV9JTkRJUkVDVAkJKDE8PERTVF9WX0lORElSRUNUKQorI2RlZmluZSBEU1RfTV9ESVNQCQkoMTw8RFNUX1ZfRElTUCkKKyNkZWZpbmUgREJHX0NfRlVOQ1RJT05fUEFSQU0JLyogMHhjOSAqLwlcCisJKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0FQPDxEU1RfVl9SRUdOVU0pKQorI2RlZmluZSBEQkdfQ19MT0NBTF9TWU0JCS8qIDB4ZDkgKi8JXAorCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9GUDw8RFNUX1ZfUkVHTlVNKSkKKy8qIEtpbmRzIG9mIHZhbHVlIHNwZWNpZmljYXRpb25zCisgKi8KKyNkZWZpbmUgRFNUX0tfVlNfQUxMT0NfU1BMSVQJMwkvKiBzcGxpdCBsaWZldGltZSAqLworLyogS2luZHMgb2YgdHlwZSBzcGVjaWZpY2F0aW9ucworICovCisjZGVmaW5lIERTVF9LX1RTX0FUT00JCTB4MDEJLyogYXRvbWljIHR5cGUgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBEU1RfS19UU19EU0MJCTB4MDIJLyogZGVzY3JpcHRvciB0eXBlIHNwZWMgKi8KKyNkZWZpbmUgRFNUX0tfVFNfSU5ECQkweDAzCS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBEU1RfS19UU19UUFRSCQkweDA0CS8qIHR5cGVkIHBvaW50ZXIgdHlwZSBzcGVjICovCisjZGVmaW5lIERTVF9LX1RTX1BUUgkJMHgwNQkvKiBwb2ludGVyIHR5cGUgc3BlYyAqLworI2RlZmluZSBEU1RfS19UU19BUlJBWQkJMHgwNwkvKiBhcnJheSB0eXBlIHNwZWMgKi8KKyNkZWZpbmUgRFNUX0tfVFNfTk9WX0xFTkcJMHgwZQkvKiBub3ZlbCBsZW5ndGggdHlwZSBzcGVjICovCisvKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdWZmaXggcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlCisgKiAgYWN0dWFsIGRhdGEgdHlwZQorICovCisjZGVmaW5lIERCR19TX0NfQkFTSUMJCQlEU1RfS19UU19BVE9NCisjZGVmaW5lIERCR19TX0NfQkFTSUNfQVJSQVkJCURTVF9LX1RTX0RTQworI2RlZmluZSBEQkdfU19DX1NUUlVDVAkJCURTVF9LX1RTX0lORAorI2RlZmluZSBEQkdfU19DX1BPSU5URVIJCQlEU1RfS19UU19UUFRSCisjZGVmaW5lIERCR19TX0NfVk9JRAkJCURTVF9LX1RTX1BUUgorI2RlZmluZSBEQkdfU19DX0NPTVBMRVhfQVJSQVkJCURTVF9LX1RTX0FSUkFZCisKKyNlbmRpZgkvKiBXQU5UX1ZNU19PQkpfREVGUyAqLworCisvKiBlbmQgb2Ygb2JqLXZtcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuYyBiL2dhcy9jb25maWcvdGMtYTI5ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGZlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWEyOWsuYwpAQCAtMCwwICsxLDEyOTYgQEAKKy8qIHRjLWEyOWsuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIEFNRCAyOTAwMC4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEpvaG4gR2lsbW9yZSBoYXMgcmVvcmdhbml6ZWQgdGhpcyBtb2R1bGUgc29tZXdoYXQsIHRvIG1ha2UgaXQgZWFzaWVyCisgICB0byBjb252ZXJ0IGl0IHRvIG5ldyBtYWNoaW5lcycgYXNzZW1ibGVycyBhcyBkZXNpcmVkLiAgVGhlcmUgd2FzIHRvbworICAgbXVjaCBibG9vZHkgcmV3cml0aW5nIHJlcXVpcmVkIGJlZm9yZS4gIFRoZXJlIHN0aWxsIHByb2JhYmx5IGlzLiAgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiYXMuaCIKKworI2luY2x1ZGUgIm9wY29kZS9hMjlrLmgiCisKKy8qIE1ha2UgaXQgZWFzaWVyIHRvIGNsb25lIHRoaXMgbWFjaGluZSBkZXNjIGludG8gYW5vdGhlciBvbmUuICAqLworI2RlZmluZQltYWNoaW5lX29wY29kZQlhMjlrX29wY29kZQorI2RlZmluZQltYWNoaW5lX29wY29kZXMJYTI5a19vcGNvZGVzCisjZGVmaW5lCW1hY2hpbmVfaXAJYTI5a19pcAorI2RlZmluZQltYWNoaW5lX2l0CWEyOWtfaXQKKworI2RlZmluZQlJTU1FRElBVEVfQklUCTB4MDEwMDAwMDAJLyogVHVybnMgUkIgaW50byBJbW1lZGlhdGUgKi8KKyNkZWZpbmUJQUJTT0xVVEVfQklUCTB4MDEwMDAwMDAJLyogVHVybnMgUEMtcmVsYXRpdmUgdG8gQWJzb2x1dGUgKi8KKyNkZWZpbmUJQ0VfQklUCQkweDAwODAwMDAwCS8qIENvcHJvY2Vzc29yIGVuYWJsZSBpbiBMT0FEICovCisjZGVmaW5lCVVJX0JJVAkJMHgwMDAwMDA4MAkvKiBVbnNpZ25lZCBpbnRlZ2VyIGluIENPTlZFUlQgKi8KKworLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOworCitzdHJ1Y3QgbWFjaGluZV9pdAorICB7CisgICAgY2hhciAqZXJyb3I7CisgICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisgICAgc3RydWN0IG5saXN0ICpubGlzdHA7CisgICAgZXhwcmVzc2lvblMgZXhwOworICAgIGludCBwY3JlbDsKKyAgICBpbnQgcmVsb2Nfb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIHJlbG9jIHdpdGhpbiBpbnNuICovCisKKyAgICBpbnQgcmVsb2M7CisgIH0KK3RoZV9pbnNuOworCitzdGF0aWMgdm9pZCBtYWNoaW5lX2lwIFBBUkFNUyAoKGNoYXIgKnN0cikpOworLyogc3RhdGljIHZvaWQgcHJpbnRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgbWFjaGluZV9pdCAqaW5zbikpOyAqLworI2lmbmRlZiBPQkpfQ09GRgorc3RhdGljIHZvaWQgc19kYXRhMSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBzX3VzZSBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCitjb25zdCBwc2V1ZG9fdHlwZVMKK21kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDR9LAorICB7ImJsb2NrIiwgc19zcGFjZSwgMH0sCisgIHsiY3B1dHlwZSIsIHNfaWdub3JlLCAwfSwJLyogQ1BVIGFzIDI5MDAwIG9yIDI5MDUwICovCisgIHsicmVnIiwgc19sc3ltLCAwfSwJCS8qIFJlZ2lzdGVyIGVxdWF0ZSwgc2FtZSBhcyBlcXUgKi8KKyAgeyJzcGFjZSIsIHNfaWdub3JlLCAwfSwJLyogTGlzdGluZyBjb250cm9sICovCisgIHsic2VjdCIsIHNfaWdub3JlLCAwfSwJLyogQ3JlYXRpb24gb2YgY29mZiBzZWN0aW9ucyAqLworI2lmbmRlZiBPQkpfQ09GRgorICAvKiBXZSBjYW4gZG8gdGhpcyByaWdodCB3aXRoIGNvZmYuICAqLworICB7InVzZSIsIHNfdXNlLCAwfSwKKyNlbmRpZgorICB7IndvcmQiLCBjb25zLCA0fSwKKyAge05VTEwsIDAsIDB9LAorfTsKKworI2lmIGRlZmluZWQoQkZEX0hFQURFUlMpCisjaWZkZWYgUkVMU1oKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gUkVMU1o7CS8qIENvZmYgaGVhZGVycyAqLworI2Vsc2UKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gMTI7CQkvKiBzb21ldGhpbmcgZWxzZSBoZWFkZXJzICovCisjZW5kaWYKKyNlbHNlCitjb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkJLyogTm90IGJmZGl6ZWQqLworI2VuZGlmCisKKy8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQorICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKKworLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKKyAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLworLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCisgICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KKy8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yayAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogV2UgbmVlZGVkIGFuIHVudXNlZCBjaGFyIGZvciBsaW5lIHNlcGFyYXRpb24gdG8gd29yayBhcm91bmQgdGhlCisgICBsYWNrIG9mIG1hY3JvcywgdXNpbmcgc2VkIGFuZCBzdWNoLiAgKi8KK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICJAIjsKKworLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLworLyogQXMgaW4gMGYxMi40NTYgKi8KKy8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7CisKKy8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKKyAgIGNoYW5nZWQgaW4gcmVhZC5jLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0CisgICBhbGwsIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KKworLyoKKyAqICBhbnVsbCBiaXQgLSBjYXVzZXMgdGhlIGJyYW5jaCBkZWxheSBzbG90IGluc3RydWN0aW9ucyB0byBub3QgYmUgZXhlY3V0ZWQKKyAqLworI2RlZmluZSBBTk5VTCAgICAgICAoMSA8PCAyOSkKKworI2lmbmRlZiBPQkpfQ09GRgorCitzdGF0aWMgdm9pZAorc191c2UgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi50ZXh0IiwgNSkgPT0gMCkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKKyAgICAgIHNfdGV4dCAoMCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGEiLCA1KSA9PSAwKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OworICAgICAgc19kYXRhICgwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuZGF0YTEiLCA2KSA9PSAwKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OworICAgICAgc19kYXRhMSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIC8qIExpdGVyYWxzIGNhbid0IGdvIGluIHRoZSB0ZXh0IHNlZ21lbnQgYmVjYXVzZSB5b3UgY2FuJ3QgcmVhZCBmcm9tCisgICAgIGluc3RydWN0aW9uIG1lbW9yeSBvbiBzb21lIDI5aydzLiAgU28sIGludG8gaW5pdGlhbGl6ZWQgZGF0YS4gKi8KKyAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5saXQiLCA0KSA9PSAwKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OworICAgICAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDIwMCk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhc19iYWQgKF8oIlVua25vd24gc2VnbWVudCB0eXBlIikpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorc19kYXRhMSAoKQoreworICBzdWJzZWdfc2V0IChTRUdfREFUQSwgMSk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKyNlbmRpZiAvKiBPQkpfQ09GRiAqLworCisvKiBJbnN0YWxsIHN5bWJvbCBkZWZpbml0aW9uIHRoYXQgbWFwcyBSRUdOQU1FIHRvIFJFR05PLgorICAgRklYTUUtU09PTjogIFRoZXNlIGFyZSBub3QgcmVjb2duaXplZCBpbiBtaXhlZCBjYXNlLiAgKi8KKworc3RhdGljIHZvaWQKK2luc2VydF9zcmVnIChyZWduYW1lLCByZWdudW0pCisgICAgIGNoYXIgKnJlZ25hbWU7CisgICAgIGludCByZWdudW07Cit7CisgIC8qIEZJWE1FLVNPT04sIHB1dCBzb21ldGhpbmcgaW4gdGhlc2Ugc3ltcyBzbyB0aGV5IHdvbid0IGJlIG91dHB1dAorICAgICB0byB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGUuICAqLworCisgIC8qIE11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIG5hbWVzIG9mIHRoZSBzcGVjaWFsIHJlZ2lzdGVycy4gICovCisgIGNoYXIgYnVmWzgwXTsKKyAgaW50IGk7CisKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAocmVnbmFtZSwgU0VHX1JFR0lTVEVSLCAodmFsdWVUKSByZWdudW0sCisJCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7CisgIGZvciAoaSA9IDA7IHJlZ25hbWVbaV07IGkrKykKKyAgICBidWZbaV0gPSBpc2xvd2VyIChyZWduYW1lW2ldKSA/IHRvdXBwZXIgKHJlZ25hbWVbaV0pIDogcmVnbmFtZVtpXTsKKyAgYnVmW2ldID0gJ1wwJzsKKworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3IChidWYsIFNFR19SRUdJU1RFUiwgKHZhbHVlVCkgcmVnbnVtLAorCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworfQorCisvKiBJbnN0YWxsIHN5bWJvbCBkZWZpbml0aW9ucyBmb3IgYXNzb3J0ZWQgc3BlY2lhbCByZWdpc3RlcnMuCisgICBTZWUgQVNNMjlLIFJlZiBwYWdlIDItOS4gICovCisKK3ZvaWQKK2RlZmluZV9zb21lX3JlZ3MgKCkKK3sKKyNkZWZpbmUgU1JFRwkyNTYKKworICAvKiBQcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzICovCisgIGluc2VydF9zcmVnICgidmFiIiwgU1JFRyArIDApOworICBpbnNlcnRfc3JlZyAoIm9wcyIsIFNSRUcgKyAxKTsKKyAgaW5zZXJ0X3NyZWcgKCJjcHMiLCBTUkVHICsgMik7CisgIGluc2VydF9zcmVnICgiY2ZnIiwgU1JFRyArIDMpOworICBpbnNlcnRfc3JlZyAoImNoYSIsIFNSRUcgKyA0KTsKKyAgaW5zZXJ0X3NyZWcgKCJjaGQiLCBTUkVHICsgNSk7CisgIGluc2VydF9zcmVnICgiY2hjIiwgU1JFRyArIDYpOworICBpbnNlcnRfc3JlZyAoInJicCIsIFNSRUcgKyA3KTsKKyAgaW5zZXJ0X3NyZWcgKCJ0bWMiLCBTUkVHICsgOCk7CisgIGluc2VydF9zcmVnICgidG1yIiwgU1JFRyArIDkpOworICBpbnNlcnRfc3JlZyAoInBjMCIsIFNSRUcgKyAxMCk7CisgIGluc2VydF9zcmVnICgicGMxIiwgU1JFRyArIDExKTsKKyAgaW5zZXJ0X3NyZWcgKCJwYzIiLCBTUkVHICsgMTIpOworICBpbnNlcnRfc3JlZyAoIm1tdSIsIFNSRUcgKyAxMyk7CisgIGluc2VydF9zcmVnICgibHJ1IiwgU1JFRyArIDE0KTsKKworICAvKiBBZGRpdGlvbmFsIHByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXJzIGZvciB0aGUgMjkwNTAgKi8KKyAgaW5zZXJ0X3NyZWcgKCJyc24iLCAgU1JFRyArIDE1KTsKKyAgaW5zZXJ0X3NyZWcgKCJybWEwIiwgU1JFRyArIDE2KTsKKyAgaW5zZXJ0X3NyZWcgKCJybWMwIiwgU1JFRyArIDE3KTsKKyAgaW5zZXJ0X3NyZWcgKCJybWExIiwgU1JFRyArIDE4KTsKKyAgaW5zZXJ0X3NyZWcgKCJybWMxIiwgU1JFRyArIDE5KTsKKyAgaW5zZXJ0X3NyZWcgKCJzcGMwIiwgU1JFRyArIDIwKTsKKyAgaW5zZXJ0X3NyZWcgKCJzcGMxIiwgU1JFRyArIDIxKTsKKyAgaW5zZXJ0X3NyZWcgKCJzcGMyIiwgU1JFRyArIDIyKTsKKyAgaW5zZXJ0X3NyZWcgKCJpYmEwIiwgU1JFRyArIDIzKTsKKyAgaW5zZXJ0X3NyZWcgKCJpYmMwIiwgU1JFRyArIDI0KTsKKyAgaW5zZXJ0X3NyZWcgKCJpYmExIiwgU1JFRyArIDI1KTsKKyAgaW5zZXJ0X3NyZWcgKCJpYmMxIiwgU1JFRyArIDI2KTsKKworICAvKiBBZGRpdGlvbmFsIHJlZ2lzdGVycyBmb3IgdGhlIDI5MDQwLiAgKi8KKyAgaW5zZXJ0X3NyZWcgKCJkYmEiLCBTUkVHICsgMjcpOworICBpbnNlcnRfc3JlZyAoImRiYyIsIFNSRUcgKyAyOCk7CisgIGluc2VydF9zcmVnICgiY2lyIiwgU1JFRyArIDI5KTsKKyAgaW5zZXJ0X3NyZWcgKCJjZHIiLCBTUkVHICsgMzApOworCisgIC8qIFVucHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyAqLworICBpbnNlcnRfc3JlZyAoImlwYyIsIFNSRUcgKyAxMjgpOworICBpbnNlcnRfc3JlZyAoImlwYSIsIFNSRUcgKyAxMjkpOworICBpbnNlcnRfc3JlZyAoImlwYiIsIFNSRUcgKyAxMzApOworICBpbnNlcnRfc3JlZyAoInEiLCBTUkVHICsgMTMxKTsKKyAgaW5zZXJ0X3NyZWcgKCJhbHUiLCBTUkVHICsgMTMyKTsKKyAgaW5zZXJ0X3NyZWcgKCJicCIsIFNSRUcgKyAxMzMpOworICBpbnNlcnRfc3JlZyAoImZjIiwgU1JFRyArIDEzNCk7CisgIGluc2VydF9zcmVnICgiY3IiLCBTUkVHICsgMTM1KTsKKyAgaW5zZXJ0X3NyZWcgKCJmcGUiLCBTUkVHICsgMTYwKTsKKyAgaW5zZXJ0X3NyZWcgKCJpbnRlIiwgU1JFRyArIDE2MSk7CisgIGluc2VydF9zcmVnICgiZnBzIiwgU1JFRyArIDE2Mik7CisgIC8qICAiIiwgICAgU1JFRysxNjMpOwkgIFJlc2VydmVkICovCisgIGluc2VydF9zcmVnICgiZXhvcCIsIFNSRUcgKyAxNjQpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCisgICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4sIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsCisgICBuZWVkLiAgKi8KK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7CisgIGludCBsb3NlID0gMDsKKyAgcmVnaXN0ZXIgaW50IHNraXBuZXh0ID0gMDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKnN0cmVuZCwgKnN0cmVuZDI7CisKKyAgLyogSGFzaCB1cCBhbGwgdGhlIG9wY29kZXMgZm9yIGZhc3QgdXNlIGxhdGVyLiAgKi8KKworICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9vcGNvZGVzOyBpKyspCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1hY2hpbmVfb3Bjb2Rlc1tpXS5uYW1lOworCisgICAgICBpZiAoc2tpcG5leHQpCisJeworCSAgc2tpcG5leHQgPSAwOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBIYWNrIHRvIGF2b2lkIG11bHRpcGxlIG9wY29kZSBlbnRyaWVzLiAgV2UgcHJlLWxvY2F0ZSBhbGwgdGhlCisJIHZhcmlhdGlvbnMgKGIvaSBmaWVsZCBhbmQgUC9BIGZpZWxkKSBhbmQgaGFuZGxlIHRoZW0uICovCisKKyAgICAgIGlmICghc3RyY21wIChuYW1lLCBtYWNoaW5lX29wY29kZXNbaSArIDFdLm5hbWUpKQorCXsKKwkgIGlmICgobWFjaGluZV9vcGNvZGVzW2ldLm9wY29kZSAmIDB4MDEwMDAwMDApICE9IDAKKwkgICAgICB8fCAobWFjaGluZV9vcGNvZGVzW2kgKyAxXS5vcGNvZGUgJiAweDAxMDAwMDAwKSA9PSAwCisJICAgICAgfHwgKChtYWNoaW5lX29wY29kZXNbaV0ub3Bjb2RlIHwgMHgwMTAwMDAwMCkKKwkJICAhPSBtYWNoaW5lX29wY29kZXNbaSArIDFdLm9wY29kZSkpCisJICAgIGdvdG8gYmFkX3RhYmxlOworCSAgc3RyZW5kID0gbWFjaGluZV9vcGNvZGVzW2ldLmFyZ3MgKyBzdHJsZW4gKG1hY2hpbmVfb3Bjb2Rlc1tpXS5hcmdzKSAtIDE7CisJICBzdHJlbmQyID0gbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5hcmdzICsgc3RybGVuIChtYWNoaW5lX29wY29kZXNbaSArIDFdLmFyZ3MpIC0gMTsKKwkgIHN3aXRjaCAoKnN0cmVuZCkKKwkgICAgeworCSAgICBjYXNlICdiJzoKKwkgICAgICBpZiAoKnN0cmVuZDIgIT0gJ2knKQorCQlnb3RvIGJhZF90YWJsZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnUCc6CisJICAgICAgaWYgKCpzdHJlbmQyICE9ICdBJykKKwkJZ290byBiYWRfdGFibGU7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgIGJhZF90YWJsZToKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFuZGxlIG9wY29kZSAlc1xuIiwKKwkJICAgICAgIG5hbWUpOworCSAgICAgIGxvc2UgPSAxOworCSAgICB9CisKKwkgIC8qIE9LLCB0aGlzIGlzIGFuIGkvYiBvciBBL1AgcGFpci4gIFdlIHNraXAgdGhlCisJICAgICBoaWdoZXItdmFsdWVkIG9uZSwgYW5kIGxldCB0aGUgY29kZSBmb3Igb3BlcmFuZCBjaGVja2luZworCSAgICAgaGFuZGxlIE9SLWluZyBpbiB0aGUgYml0LiAgKi8KKwkgIHNraXBuZXh0ID0gMTsKKwl9CisKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoUFRSKSAmbWFjaGluZV9vcGNvZGVzW2ldKTsKKyAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiwKKwkJICAgbWFjaGluZV9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7CisJICBsb3NlID0gMTsKKwl9CisgICAgfQorCisgIGlmIChsb3NlKQorICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKKworICBkZWZpbmVfc29tZV9yZWdzICgpOworfQorCisvKiBBc3NlbWJsZSBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIEl0cyBsYWJlbCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQKKyAgIGJ5IHRoZSBnZW5lcmljIGZyb250IGVuZC4gIFdlIGp1c3QgcGFyc2Ugb3Bjb2RlIGFuZCBvcGVyYW5kcywgYW5kCisgICBwcm9kdWNlIHRoZSBieXRlcyBvZiBkYXRhIGFuZCByZWxvY2F0aW9uLiAgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICp0b1A7CisKKyAga25vdyAoc3RyKTsKKyAgbWFjaGluZV9pcCAoc3RyKTsKKyAgdG9QID0gZnJhZ19tb3JlICg0KTsKKyAgLyogcHV0IG91dCB0aGUgb3Bjb2RlICovCisgIG1kX251bWJlcl90b19jaGFycyAodG9QLCB0aGVfaW5zbi5vcGNvZGUsIDQpOworCisgIC8qIHB1dCBvdXQgdGhlIHN5bWJvbC1kZXBlbmRlbnQgc3R1ZmYgKi8KKyAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IE5PX1JFTE9DKQorICAgIHsKKyAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgdGhlX2luc24ucmVsb2Nfb2Zmc2V0KSwKKwkJICAgNCwJCS8qIHNpemUgKi8KKwkJICAgJnRoZV9pbnNuLmV4cCwKKwkJICAgdGhlX2luc24ucGNyZWwsCisJCSAgIHRoZV9pbnNuLnJlbG9jKTsKKyAgICB9Cit9CisKK2NoYXIgKgorcGFyc2Vfb3BlcmFuZCAocywgb3BlcmFuZHAsIG9wdCkKKyAgICAgY2hhciAqczsKKyAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmRwOworICAgICBpbnQgb3B0OworeworICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjaGFyICpuZXc7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKKyAgZXhwcmVzc2lvbiAob3BlcmFuZHApOworICBpZiAob3BlcmFuZHAtPlhfb3AgPT0gT19hYnNlbnQgJiYgISBvcHQpCisgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisgIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKKyAgcmV0dXJuIG5ldzsKK30KKworLyogSW5zdHJ1Y3Rpb24gcGFyc2luZy4gIFRha2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9wY29kZS4KKyAgIE9wZXJhbmRzIGFyZSBhdCBpbnB1dF9saW5lX3BvaW50ZXIuICBPdXRwdXQgaXMgaW4gdGhlX2luc24uCisgICBXYXJuaW5ncyBvciBlcnJvcnMgYXJlIGdlbmVyYXRlZC4gICovCisKK3N0YXRpYyB2b2lkCittYWNoaW5lX2lwIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgY2hhciAqczsKKyAgY29uc3QgY2hhciAqYXJnczsKKyAgc3RydWN0IG1hY2hpbmVfb3Bjb2RlICppbnNuOworICBjaGFyICphcmdzU3RhcnQ7CisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworICBleHByZXNzaW9uUyB0aGVfb3BlcmFuZDsKKyAgZXhwcmVzc2lvblMgKm9wZXJhbmQgPSAmdGhlX29wZXJhbmQ7CisgIHVuc2lnbmVkIGludCByZWc7CisKKyAgLyogTXVzdCBoYW5kbGUgYGRpdjAnIG9wY29kZS4gICovCisgIHMgPSBzdHI7CisgIGlmIChpc2FscGhhICgqcykpCisgICAgZm9yICg7IGlzYWxudW0gKCpzKTsgKytzKQorICAgICAgaWYgKGlzdXBwZXIgKCpzKSkKKwkqcyA9IHRvbG93ZXIgKCpzKTsKKworICBzd2l0Y2ggKCpzKQorICAgIHsKKyAgICBjYXNlICdcMCc6CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyAnOgkJCS8qIEZJWE1FLVNPTUVEQVkgbW9yZSB3aGl0ZXNwYWNlICovCisgICAgICAqcysrID0gJ1wwJzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWFjaGluZV9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGUgYCVzJy4iKSwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGFyZ3NTdGFydCA9IHM7CisgIG9wY29kZSA9IGluc24tPm9wY29kZTsKKyAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKKyAgdGhlX2luc24ucmVsb2MgPSBOT19SRUxPQzsKKworICAvKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgb3BlcmFuZHMgbWF0Y2guCisgICAKKyAgICAgSWYgYW4gb3BlcmFuZCBtYXRjaGVzLCB3ZSBtb2RpZnkgdGhlX2luc24gb3Igb3Bjb2RlIGFwcHJvcHJpYXRlbHksCisgICAgIGFuZCBkbyBhICJjb250aW51ZSIuICBJZiBhbiBvcGVyYW5kIGZhaWxzIHRvIG1hdGNoLCB3ZSAiYnJlYWsiLiAgKi8KKworICBpZiAoaW5zbi0+YXJnc1swXSAhPSAnXDAnKQorICAgIHsKKyAgICAgIC8qIFByaW1lIHRoZSBwdW1wLiAgKi8KKyAgICAgIHMgPSBwYXJzZV9vcGVyYW5kIChzLCBvcGVyYW5kLCBpbnNuLT5hcmdzWzBdID09ICdJJyk7CisgICAgfQorCisgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCisgICAgeworICAgICAgc3dpdGNoICgqYXJncykKKwl7CisKKwljYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLworCSAgaWYgKCpzID09ICdcMCcpCisJICAgIHsKKwkgICAgICAvKiBXZSBhcmUgdHJ1bHkgZG9uZS4gKi8KKwkgICAgICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBhc19iYWQgKF8oIlRvbyBtYW55IG9wZXJhbmRzOiAlcyIpLCBzKTsKKwkgIGJyZWFrOworCisJY2FzZSAnLCc6CQkvKiBNdXN0IG1hdGNoIGEgY29tbWEgKi8KKwkgIGlmICgqcysrID09ICcsJykKKwkgICAgeworCSAgICAgIC8qIFBhcnNlIG5leHQgb3BlcmFuZC4gICovCisJICAgICAgcyA9IHBhcnNlX29wZXJhbmQgKHMsIG9wZXJhbmQsIGFyZ3NbMV0gPT0gJ0knKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICd2JzoJCS8qIFRyYXAgbnVtYmVycyAoaW1tZWRpYXRlIGZpZWxkKSAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKKwkgICAgeworCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAyNTYpCisJCXsKKwkJICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNik7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhc19iYWQgKF8oIkltbWVkaWF0ZSB2YWx1ZSBvZiAlbGQgaXMgdG9vIGxhcmdlIiksCisJCQkgIChsb25nKSBvcGVyYW5kLT5YX2FkZF9udW1iZXIpOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgIHRoZV9pbnNuLnJlbG9jID0gUkVMT0NfODsKKwkgIHRoZV9pbnNuLnJlbG9jX29mZnNldCA9IDE7CS8qIEJJRy1FTkRJQU4gQnl0ZSAxIG9mIGluc24gKi8KKwkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOworCSAgY29udGludWU7CisKKwljYXNlICdiJzoJCS8qIEEgZ2VuZXJhbCByZWdpc3RlciBvciA4LWJpdCBpbW1lZGlhdGUgKi8KKwljYXNlICdpJzoKKwkgIC8qIFdlIHRyZWF0IHRoZSB0d28gY2FzZXMgaWRlbnRpY2FsbHkgc2luY2Ugd2UgbWFzaGVkCisJICAgICB0aGVtIHRvZ2V0aGVyIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19yZWdpc3RlcikKKwkgICAgZ290byBnZW5lcmFsX3JlZzsKKworCSAgLyogTWFrZSBzdXJlIHRoZSAnaScgY2FzZSByZWFsbHkgZXhpc3RzLiAgKi8KKwkgIGlmICgoaW5zbi0+b3Bjb2RlIHwgSU1NRURJQVRFX0JJVCkgIT0gKGluc24gKyAxKS0+b3Bjb2RlKQorCSAgICBicmVhazsKKworCSAgb3Bjb2RlIHw9IElNTUVESUFURV9CSVQ7CisJICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDI1NikKKwkJeworCQkgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXI7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhc19iYWQgKF8oIkltbWVkaWF0ZSB2YWx1ZSBvZiAlbGQgaXMgdG9vIGxhcmdlIiksCisJCQkgIChsb25nKSBvcGVyYW5kLT5YX2FkZF9udW1iZXIpOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgIHRoZV9pbnNuLnJlbG9jID0gUkVMT0NfODsKKwkgIHRoZV9pbnNuLnJlbG9jX29mZnNldCA9IDM7CS8qIEJJRy1FTkRJQU4gQnl0ZSAzIG9mIGluc24gKi8KKwkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOworCSAgY29udGludWU7CisKKwljYXNlICdhJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KKwljYXNlICdjJzoKKwlnZW5lcmFsX3JlZzoKKwkgIC8qIGxyTk5OIG9yIGdyTk5OIG9yICUlZXhwciBvciBhIHVzZXItZGVmIHJlZ2lzdGVyIG5hbWUgKi8KKwkgIGlmIChvcGVyYW5kLT5YX29wICE9IE9fcmVnaXN0ZXIpCisJICAgIGJyZWFrOwkJLyogT25seSByZWdpc3RlcnMgKi8KKwkgIGtub3cgKG9wZXJhbmQtPlhfYWRkX3N5bWJvbCA9PSAwKTsKKwkgIGtub3cgKG9wZXJhbmQtPlhfb3Bfc3ltYm9sID09IDApOworCSAgcmVnID0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOworCSAgaWYgKHJlZyA+PSBTUkVHKQorCSAgICBicmVhazsJCS8qIE5vIHNwZWNpYWwgcmVnaXN0ZXJzICovCisKKwkgIC8qIEdvdCB0aGUgcmVnaXN0ZXIsIG5vdyBmaWd1cmUgb3V0IHdoZXJlIGl0IGdvZXMgaW4gdGhlCisJICAgICBvcGNvZGUuICAqLworCSAgc3dpdGNoICgqYXJncykKKwkgICAgeworCSAgICBjYXNlICdhJzoKKwkgICAgICBvcGNvZGUgfD0gcmVnIDw8IDg7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnYic6CisJICAgIGNhc2UgJ2knOgorCSAgICAgIG9wY29kZSB8PSByZWc7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnYyc6CisJICAgICAgb3Bjb2RlIHw9IHJlZyA8PCAxNjsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOworCSAgYnJlYWs7CisKKwljYXNlICd4JzoJCS8qIDE2IGJpdCBjb25zdGFudCwgemVyby1leHRlbmRlZCAqLworCWNhc2UgJ1gnOgkJLyogMTYgYml0IGNvbnN0YW50LCBvbmUtZXh0ZW5kZWQgKi8KKwkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCisJICAgIHsKKwkgICAgICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4RkYpIDw8IDAgfAorCQkoKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4RkYwMCkgPDwgOCk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIHRoZV9pbnNuLnJlbG9jID0gUkVMT0NfQ09OU1Q7CisJICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKKwkgIGNvbnRpbnVlOworCisJY2FzZSAnaCc6CisJICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNiB8CisJCSgoKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPlhfYWRkX251bWJlcgorCQkgIC8qIGF2b2lkIHNpZ24gZXh0ICovICAmIDB4RkYwMDAwMDApID4+IDgpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0NPTlNUSDsKKwkgIHRoZV9pbnNuLmV4cCA9ICpvcGVyYW5kOworCSAgY29udGludWU7CisKKwljYXNlICdQJzoJCS8qIFBDLXJlbGF0aXZlIGp1bXAgYWRkcmVzcyAqLworCWNhc2UgJ0EnOgkJLyogQWJzb2x1dGUganVtcCBhZGRyZXNzICovCisJICAvKiBUaGVzZSB0d28gYXJlIHRyZWF0ZWQgdG9nZXRoZXIgc2luY2Ugd2UgZm9sZGVkIHRoZQorCSAgICAgb3Bjb2RlIHRhYmxlIGVudHJpZXMgdG9nZXRoZXIuICAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKKwkgICAgeworCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgJ0EnIGNhc2UgcmVhbGx5IGV4aXN0cy4gICovCisJICAgICAgaWYgKChpbnNuLT5vcGNvZGUgfCBBQlNPTFVURV9CSVQpICE9IChpbnNuICsgMSktPm9wY29kZSkKKwkJYnJlYWs7CisJICAgICAgeworCQliZmRfdm1hIHYsIG1hc2s7CisJCW1hc2sgPSAweDFmZmZmOworCQl2ID0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgfiBtYXNrOworCQlpZiAodikKKwkJICBhc19iYWQgKCJjYWxsL2ptcCB0YXJnZXQgb3V0IG9mIHJhbmdlIik7CisJICAgICAgfQorCSAgICAgIG9wY29kZSB8PSBBQlNPTFVURV9CSVQgfAorCQkob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHgwMDAzRkMwMCkgPDwgNiB8CisJCSgob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHgwMDAwMDNGQykgPj4gMik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIHRoZV9pbnNuLnJlbG9jID0gUkVMT0NfSlVNUFRBUkc7CisJICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKKwkgIHRoZV9pbnNuLnBjcmVsID0gMTsJLyogQXNzdW1lIFBDLXJlbGF0aXZlIGp1bXAgKi8KKwkgIC8qIEZJWE1FLVNPT04sIERvIHdlIGZpZ3VyZSBvdXQgd2hldGhlciBhYnMgbGF0ZXIsIGFmdGVyCisgICAgICAgICAgICAga25vdyBzeW0gdmFsPyAqLworCSAgY29udGludWU7CisKKwljYXNlICdlJzoJCS8qIENvcHJvY2Vzc29yIGVuYWJsZSBiaXQgZm9yIExPQUQvU1RPUkUgaW5zbiAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKKwkgICAgeworCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMCkKKwkJY29udGludWU7CisJICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAxKQorCQl7CisJCSAgb3Bjb2RlIHw9IENFX0JJVDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJICBicmVhazsKKworCWNhc2UgJ24nOgkJLyogQ29udHJvbCBiaXRzIGZvciBMT0FEL1NUT1JFIGluc3RydWN0aW9ucyAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgorCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDEyOCkKKwkgICAgeworCSAgICAgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2KTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdzJzoJCS8qIFNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyICovCisJICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX3JlZ2lzdGVyKQorCSAgICBicmVhazsJCS8qIE9ubHkgcmVnaXN0ZXJzICovCisJICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgU1JFRykKKwkgICAgYnJlYWs7CQkvKiBOb3QgYSBzcGVjaWFsIHJlZ2lzdGVyICovCisJICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4RkYpIDw8IDg7CisJICBjb250aW51ZTsKKworCWNhc2UgJ3UnOgkJLyogVUkgYml0IG9mIENPTlZFUlQgKi8KKwkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCisJICAgIHsKKwkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDApCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMSkKKwkJeworCQkgIG9wY29kZSB8PSBVSV9CSVQ7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdyJzoJCS8qIFJORCBiaXRzIG9mIENPTlZFUlQgKi8KKwkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKKwkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA4KQorCSAgICB7CisJICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCA0OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgJ0knOgkJLyogSUQgYml0cyBvZiBJTlYgYW5kIElSRVRJTlYuICAqLworCSAgLyogVGhpcyBvcGVyYW5kIGlzIG9wdGlvbmFsLiAgKi8KKwkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fYWJzZW50KQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudAorCQkgICAmJiBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQorCSAgICB7CisJICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNjsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdkJzoJCS8qIEZEIGJpdHMgb2YgQ09OVkVSVCAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgorCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCisJICAgIHsKKwkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDI7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGJyZWFrOworCisKKwljYXNlICdmJzoJCS8qIEZTIGJpdHMgb2YgQ09OVkVSVCAqLworCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgorCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCisJICAgIHsKKwkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDA7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnQyc6CisJICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCisJICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKKwkgICAgeworCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTY7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnRic6CisJICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCisJICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMTYpCisJICAgIHsKKwkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE4OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBCQURfQ0FTRSAoKmFyZ3MpOworCX0KKyAgICAgIC8qIFR5cGVzIG9yIHZhbHVlcyBvZiBhcmdzIGRvbid0IG1hdGNoLiAgKi8KKyAgICAgIGFzX2JhZCAoIkludmFsaWQgb3BlcmFuZHMiKTsKKyAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKKyAgIGJ1dCBJJ20gbm90IHN1cmUuCisKKyAgIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAorICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlcgorICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcworICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLworCisvKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCisjZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKKworY2hhciAqCittZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKKyAgICAgY2hhciB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7CisgIGNoYXIgKnQ7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgIGNhc2UgJ3MnOgorICAgIGNhc2UgJ1MnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuICJCYWQgY2FsbCB0byBNRF9BVE9GKCkiOworICAgIH0KKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisgICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKyAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKgorICogV3JpdGUgb3V0IGJpZy1lbmRpYW4uCisgKi8KK3ZvaWQKK21kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG47Cit7CisgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKK30KKwordm9pZAorbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCisgICAgIGZpeFMgKmZpeFA7CisgICAgIGxvbmcgdmFsOworeworICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7CisKKyAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLworCisKKyAga25vdyAoZml4UC0+Znhfc2l6ZSA9PSA0KTsKKyAga25vdyAoZml4UC0+Znhfcl90eXBlIDwgTk9fUkVMT0MpOworCisgIC8qIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4gICovCisgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUkVMT0NfV0RJU1AzMCAmJiBmaXhQLT5meF9hZGRzeSkKKyAgICB7CisgICAgICB2YWwgKz0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworICAgIH0KKworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisKKyAgICBjYXNlIFJFTE9DXzMyOgorICAgICAgYnVmWzBdID0gdmFsID4+IDI0OworICAgICAgYnVmWzFdID0gdmFsID4+IDE2OworICAgICAgYnVmWzJdID0gdmFsID4+IDg7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfODoKKyAgICAgIGJ1ZlswXSA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19XRElTUDMwOgorICAgICAgdmFsID0gKHZhbCA+Pj0gMikgKyAxOworICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjQpICYgMHgzZjsKKyAgICAgIGJ1ZlsxXSA9ICh2YWwgPj4gMTYpOworICAgICAgYnVmWzJdID0gdmFsID4+IDg7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfSEkyMjoKKyAgICAgIGJ1ZlsxXSB8PSAodmFsID4+IDI2KSAmIDB4M2Y7CisgICAgICBidWZbMl0gPSB2YWwgPj4gMTg7CisgICAgICBidWZbM10gPSB2YWwgPj4gMTA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfTE8xMDoKKyAgICAgIGJ1ZlsyXSB8PSAodmFsID4+IDgpICYgMHgwMzsKKyAgICAgIGJ1ZlszXSA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19CQVNFMTM6CisgICAgICBidWZbMl0gfD0gKHZhbCA+PiA4KSAmIDB4MWY7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfV0RJU1AyMjoKKyAgICAgIHZhbCA9ICh2YWwgPj49IDIpICsgMTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBSRUxPQ19CQVNFMjI6CisgICAgICBidWZbMV0gfD0gKHZhbCA+PiAxNikgJiAweDNmOworICAgICAgYnVmWzJdID0gdmFsID4+IDg7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfSlVNUFRBUkc6CS8qIDAwWFgwMFhYIHBhdHRlcm4gaW4gYSB3b3JkICovCisgICAgICBpZiAoIWZpeFAtPmZ4X2RvbmUpCisJeworCSAgLyogVGhlIGxpbmtlciB0cmllcyB0byBzdXBwb3J0IGJvdGggQU1EIGFuZCBvbGQgR05VIHN0eWxlCisgICAgICAgICAgICAgUl9JUkVMIHJlbG9jcy4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgYWRkZW5kIGlzIGV4YWN0bHkKKyAgICAgICAgICAgICB0aGUgbmVnYXRpdmUgb2YgdGhlIGFkZHJlc3Mgd2l0aGluIHRoZSBzZWN0aW9uLCB0aGUKKyAgICAgICAgICAgICBsaW5rZXIgd2lsbCBub3QgaGFuZGxlIGl0IGNvcnJlY3RseS4gICovCisJICBpZiAoZml4UC0+ZnhfcGNyZWwKKwkgICAgICAmJiB2YWwgIT0gMAorCSAgICAgICYmIHZhbCA9PSAtIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpKQorCSAgICBhc19iYWRfd2hlcmUKKwkgICAgICAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkgICAgICAgInRoZSBsaW5rZXIgd2lsbCBub3QgaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiBjb3JyZWN0bHkiKTsKKwl9CisgICAgICBlbHNlIGlmIChmaXhQLT5meF9wY3JlbCkKKwl7CisJICBsb25nIHYgPSB2YWwgPj4gMTc7CisJICBpZiAodiAhPSAwICYmIHYgIT0gLTEpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgImNhbGwvam1wIHRhcmdldCBvdXQgb2YgcmFuZ2UiKTsKKwl9CisgICAgICBlbHNlCisJLyogdGhpcyBjYXNlIHdhcyBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGluIG1hY2hpbmVfaXAgKi8KKwlhYm9ydCAoKTsKKyAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxMDsJLyogSG9sZHMgYml0cyAwMDAzRkZGQyBvZiBhZGRyZXNzICovCisgICAgICBidWZbM10gPSB2YWwgPj4gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19DT05TVDoJCS8qIDAwWFgwMFhYIHBhdHRlcm4gaW4gYSB3b3JkICovCisgICAgICBidWZbMV0gPSB2YWwgPj4gODsJLyogSG9sZHMgYml0cyAwMDAwWFhYWCAqLworICAgICAgYnVmWzNdID0gdmFsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFTE9DX0NPTlNUSDoJCS8qIDAwWFgwMFhYIHBhdHRlcm4gaW4gYSB3b3JkICovCisgICAgICBidWZbMV0gPSB2YWwgPj4gMjQ7CS8qIEhvbGRzIGJpdHMgWFhYWDAwMDAgKi8KKyAgICAgIGJ1ZlszXSA9IHZhbCA+PiAxNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOT19SRUxPQzoKKyAgICBkZWZhdWx0OgorICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwgZml4UC0+Znhfcl90eXBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworI2lmZGVmIE9CSl9DT0ZGCitzaG9ydAordGNfY29mZl9maXgycnR5cGUgKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisKKyAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCisgICAgeworICAgIGNhc2UgUkVMT0NfMzI6CisgICAgICByZXR1cm4gKFJfV09SRCk7CisgICAgY2FzZSBSRUxPQ184OgorICAgICAgcmV0dXJuIChSX0JZVEUpOworICAgIGNhc2UgUkVMT0NfQ09OU1Q6CisgICAgICByZXR1cm4gKFJfSUxPSEFMRik7CisgICAgY2FzZSBSRUxPQ19DT05TVEg6CisgICAgICByZXR1cm4gKFJfSUhJSEFMRik7CisgICAgY2FzZSBSRUxPQ19KVU1QVEFSRzoKKyAgICAgIHJldHVybiAoUl9JUkVMKTsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmIChfKCJuZWVkICVvM1xuIiksIGZpeFAtPmZ4X3JfdHlwZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CQkJCS8qIHN3aXRjaCBvbiB0eXBlICovCisKKyAgcmV0dXJuICgwKTsKK30KKworI2VuZGlmIC8qIE9CSl9DT0ZGICovCisKKy8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIDI5ayAqLwordm9pZAorbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKKyAgICAgc2VnVCBzZWc7CisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKK3sKKyAgYXNfZmF0YWwgKF8oImEyOWtfY29udmVydF9mcmFnXG4iKSk7Cit9CisKKy8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGEyOWsgKi8KK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWd0eXBlKQorICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7CisgICAgIHNlZ1Qgc2VndHlwZTsKK3sKKyAgYXNfZmF0YWwgKF8oImEyOWtfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIpKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiAwCisvKiBmb3IgZGVidWdnaW5nIG9ubHkgKi8KK3N0YXRpYyB2b2lkCitwcmludF9pbnNuIChpbnNuKQorICAgICBzdHJ1Y3QgbWFjaGluZV9pdCAqaW5zbjsKK3sKKyAgY2hhciAqUmVsb2NbXSA9CisgIHsKKyAgICAiUkVMT0NfOCIsCisgICAgIlJFTE9DXzE2IiwKKyAgICAiUkVMT0NfMzIiLAorICAgICJSRUxPQ19ESVNQOCIsCisgICAgIlJFTE9DX0RJU1AxNiIsCisgICAgIlJFTE9DX0RJU1AzMiIsCisgICAgIlJFTE9DX1dESVNQMzAiLAorICAgICJSRUxPQ19XRElTUDIyIiwKKyAgICAiUkVMT0NfSEkyMiIsCisgICAgIlJFTE9DXzIyIiwKKyAgICAiUkVMT0NfMTMiLAorICAgICJSRUxPQ19MTzEwIiwKKyAgICAiUkVMT0NfU0ZBX0JBU0UiLAorICAgICJSRUxPQ19TRkFfT0ZGMTMiLAorICAgICJSRUxPQ19CQVNFMTAiLAorICAgICJSRUxPQ19CQVNFMTMiLAorICAgICJSRUxPQ19CQVNFMjIiLAorICAgICJSRUxPQ19QQzEwIiwKKyAgICAiUkVMT0NfUEMyMiIsCisgICAgIlJFTE9DX0pNUF9UQkwiLAorICAgICJSRUxPQ19TRUdPRkYxNiIsCisgICAgIlJFTE9DX0dMT0JfREFUIiwKKyAgICAiUkVMT0NfSk1QX1NMT1QiLAorICAgICJSRUxPQ19SRUxBVElWRSIsCisgICAgIk5PX1JFTE9DIgorICB9OworCisgIGlmIChpbnNuLT5lcnJvcikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogJXNcbiIpOworICAgIH0KKyAgZnByaW50ZiAoc3RkZXJyLCAib3Bjb2RlPTB4JTA4eFxuIiwgaW5zbi0+b3Bjb2RlKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2MgPSAlc1xuIiwgUmVsb2NbaW5zbi0+cmVsb2NdKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZXhwID0gIHtcbiIpOworICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfc3ltYm9sID0gJXNcbiIsCisJICAgaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCA/CisJICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpID8KKwkgICAgU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOworICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9vcF9zeW1ib2wgPSAlc1xuIiwKKwkgICBpbnNuLT5leHAuWF9vcF9zeW1ib2wgPworCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpID8KKwkgICAgU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7CisgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9udW1iZXIgPSAlZFxuIiwKKwkgICBpbnNuLT5leHAuWF9hZGRfbnVtYmVyKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAifVxuIik7Cit9CisKKyNlbmRpZgorCisvKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIHRhcmdldCBmb3JtYXQuCisKKyAgIE9uIHNwYXJjLzI5azogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgbmV4dCB0aHJlZQorICAgYnl0ZXMgYXJlIGluZGV4LCBtb3N0IHNpZy4gYnl0ZSBmaXJzdC4gIEJ5dGUgNyBpcyBicm9rZW4gdXAgd2l0aAorICAgYml0IDcgYXMgZXh0ZXJuYWwsIGJpdHMgNiAmIDUgdW51c2VkLCBhbmQgdGhlIGxvd2VyCisgICBmaXZlIGJpdHMgYXMgcmVsb2NhdGlvbiB0eXBlLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KKy8qIFRoYW54IGFuZCBhIHRpcCBvZiB0aGUgaGF0IHRvIE1pY2hhZWwgQmxvb20sIG1iQHR0aWRjYS50dGkuY29tICovCisKKyNpZmRlZiBPQkpfQU9VVAorCit2b2lkCit0Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQorICAgICBjaGFyICp3aGVyZTsKKyAgICAgZml4UyAqZml4UDsKKyAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Cit7CisgIGxvbmcgcl9zeW1ib2xudW07CisKKyAga25vdyAoZml4UC0+Znhfcl90eXBlIDwgTk9fUkVMT0MpOworICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKKworICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAorICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAorCQkgICAgICA0KTsKKworICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQorCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKKwkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7CisKKyAgd2hlcmVbNF0gPSAocl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7CisgIHdoZXJlWzVdID0gKHJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7CisgIHdoZXJlWzZdID0gcl9zeW1ib2xudW0gJiAweDBmZjsKKyAgd2hlcmVbN10gPSAoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDcpICYgMHg4MCkgfCAoMCAmIDB4NjApIHwgKGZpeFAtPmZ4X3JfdHlwZSAmIDB4MUYpOworICAvKiBBbHNvIGVhc3kgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgmd2hlcmVbOF0sIGZpeFAtPmZ4X2FkZG51bWJlciwgNCk7Cit9CisKKyNlbmRpZiAvKiBPQkpfQU9VVCAqLworDAorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7CitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7CisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHJldHVybiAwOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKK30KKwwKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBsaW5lIGlzIHVucmVjb2duaXplZC4gIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUKKyAgIGRlZmluaXRpb25zIG9mIGEyOWsgc3R5bGUgbG9jYWwgbGFiZWxzLiAgKi8KKworaW50CithMjlrX3VucmVjb2duaXplZF9saW5lIChjKQorICAgICBpbnQgYzsKK3sKKyAgaW50IGxhYjsKKyAgY2hhciAqczsKKworICBpZiAoYyAhPSAnJCcKKyAgICAgIHx8ICEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclswXSkpCisgICAgcmV0dXJuIDA7CisKKyAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICBsYWIgPSAwOworICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKKyAgICB7CisgICAgICBsYWIgPSBsYWIgKiAxMCArICpzIC0gJzAnOworICAgICAgKytzOworICAgIH0KKworICBpZiAoKnMgIT0gJzonKQorICAgIHsKKyAgICAgIC8qIE5vdCBhIGxhYmVsIGRlZmluaXRpb24uICAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAobGFiKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oImxhYmVsIFwiJCVkXCIgcmVkZWZpbmVkIiksIGxhYik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZGVmaW5lX2RvbGxhcl9sYWJlbCAobGFiKTsKKyAgY29sb24gKGRvbGxhcl9sYWJlbF9uYW1lIChsYWIsIDApKTsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIERlZmF1bHQgdGhlIHZhbHVlcyBvZiBzeW1ib2xzIGtub3duIHRoYXQgc2hvdWxkIGJlICJwcmVkZWZpbmVkIi4gIFdlCisgICBkb24ndCBib3RoZXIgdG8gcHJlZGVmaW5lIHRoZW0gdW5sZXNzIHlvdSBhY3R1YWxseSB1c2Ugb25lLCBzaW5jZSB0aGVyZQorICAgYXJlIGEgbG90IG9mIHRoZW0uICAqLworCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGxvbmcgcmVnbnVtOworICBjaGFyIHRlc3RidWZbNSArIC8qU0xPUCovIDVdOworCisgIGlmIChuYW1lWzBdID09ICdnJyB8fCBuYW1lWzBdID09ICdHJworICAgICAgfHwgbmFtZVswXSA9PSAnbCcgfHwgbmFtZVswXSA9PSAnTCcKKyAgICAgIHx8IG5hbWVbMF0gPT0gJ3MnIHx8IG5hbWVbMF0gPT0gJ1MnKQorICAgIHsKKyAgICAgIC8qIFBlcmhhcHMgYSBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgbmFtZSAqLworICAgICAgaWYgKG5hbWVbMV0gPT0gJ3InIHx8IG5hbWVbMV0gPT0gJ1InKQorCXsKKwkgIGxvbmcgbWF4cmVnOworCisJICAvKiBQYXJzZSB0aGUgbnVtYmVyLCBtYWtlIHN1cmUgaXQgaGFzIG5vIGV4dHJhIHplcm9lcyBvcgorCSAgICAgdHJhaWxpbmcgY2hhcnMuICovCisJICByZWdudW0gPSBhdG9sICgmbmFtZVsyXSk7CisKKwkgIGlmIChuYW1lWzBdID09ICdzJyB8fCBuYW1lWzBdID09ICdTJykKKwkgICAgbWF4cmVnID0gMjU1OworCSAgZWxzZQorCSAgICBtYXhyZWcgPSAxMjc7CisJICBpZiAocmVnbnVtID4gbWF4cmVnKQorCSAgICByZXR1cm4gTlVMTDsKKworCSAgc3ByaW50ZiAodGVzdGJ1ZiwgIiVsZCIsIHJlZ251bSk7CisJICBpZiAoc3RyY21wICh0ZXN0YnVmLCAmbmFtZVsyXSkgIT0gMCkKKwkgICAgcmV0dXJuIE5VTEw7CS8qIGdyMDA3IG9yIGxyN2ZvbyBvciB3aGF0ZXZlciAqLworCisJICAvKiBXZSBoYXZlIGEgd2llbmVyISAgRGVmaW5lIGFuZCByZXR1cm4gYSBuZXcgc3ltYm9sIGZvciBpdC4gICovCisJICBpZiAobmFtZVswXSA9PSAnbCcgfHwgbmFtZVswXSA9PSAnTCcpCisJICAgIHJlZ251bSArPSAxMjg7CisJICBlbHNlIGlmIChuYW1lWzBdID09ICdzJyB8fCBuYW1lWzBdID09ICdTJykKKwkgICAgcmVnbnVtICs9IFNSRUc7CisJICByZXR1cm4gKHN5bWJvbF9uZXcgKG5hbWUsIFNFR19SRUdJU1RFUiwgKHZhbHVlVCkgcmVnbnVtLAorCQkJICAgICAgJnplcm9fYWRkcmVzc19mcmFnKSk7CisJfQorICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogUGFyc2UgYW4gb3BlcmFuZCB0aGF0IGlzIG1hY2hpbmUtc3BlY2lmaWMuICAqLworCit2b2lkCittZF9vcGVyYW5kIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworCisgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJyUnICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnJScpCisgICAgeworICAgICAgLyogV2UgaGF2ZSBhIG51bWVyaWMgcmVnaXN0ZXIgZXhwcmVzc2lvbi4gIE5vIGJpZ2d5LiAgKi8KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwkvKiBTa2lwICUlICovCisgICAgICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOworICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wICE9IE9fY29uc3RhbnQKKwkgIHx8IGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPiAyNTUpCisJYXNfYmFkIChfKCJJbnZhbGlkIGV4cHJlc3Npb24gYWZ0ZXIgJSUlJVxuIikpOworICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOworICAgIH0KKyAgZWxzZSBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcmJykKKyAgICB7CisgICAgICAvKiBXZSBhcmUgdGFraW5nIHRoZSAnYWRkcmVzcycgb2YgYSByZWdpc3Rlci4uLnRoaXMgb25lIGlzIG5vdAorCSBpbiB0aGUgbWFudWFsLCBidXQgaXQgKmlzKiBpbiB0cmFwcy9mcHN5bWJvbC5oISAgV2hhdCB0aGV5CisJIHNlZW0gdG8gd2FudCBpcyB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhcyBhbiBhYnNvbHV0ZSBudW1iZXIuICAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIFNraXAgJiAqLworICAgICAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKKyAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcCAhPSBPX3JlZ2lzdGVyKQorCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBpbiAmIGV4cHJlc3Npb24iKSk7CisgICAgICBlbHNlCisJZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OworICAgIH0KKyAgZWxzZSBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICckJworCSAgICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV0pKQorICAgIHsKKyAgICAgIGxvbmcgbGFiOworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIHN5bWJvbFMgKnN5bTsKKworICAgICAgLyogVGhpcyBpcyBhIGxvY2FsIGxhYmVsLiAgKi8KKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgbGFiID0gKGxvbmcpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgICAgaWYgKGRvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWIpKQorCXsKKwkgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAwKTsKKwkgIHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lIChsYWIsIDEpOworCSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisJfQorCisgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bTsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICckJykKKyAgICB7CisgICAgICBjaGFyICpzOworICAgICAgY2hhciB0eXBlOworICAgICAgaW50IGZpZWxkbnVtLCBmaWVsZGxpbWl0OworICAgICAgTElUVExFTlVNX1RZUEUgZmxvYXRidWZbOF07CisKKyAgICAgIC8qICRmbG9hdCgpLCAkZG91YmxlTigpLCBvciAkZXh0ZW5kTigpIGNvbnZlcnQgZmxvYXRpbmcgdmFsdWVzCisJIHRvIGludGVnZXJzLiAgKi8KKworICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICAgICAgKytzOworCisgICAgICBmaWVsZG51bSA9IDA7CisgICAgICBpZiAoc3RybmNtcCAocywgImRvdWJsZSIsIHNpemVvZiAiZG91YmxlIiAtIDEpID09IDApCisJeworCSAgcyArPSBzaXplb2YgImRvdWJsZSIgLSAxOworCSAgdHlwZSA9ICdkJzsKKwkgIGZpZWxkbGltaXQgPSAyOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJmbG9hdCIsIHNpemVvZiAiZmxvYXQiIC0gMSkgPT0gMCkKKwl7CisJICBzICs9IHNpemVvZiAiZmxvYXQiIC0gMTsKKwkgIHR5cGUgPSAnZic7CisJICBmaWVsZGxpbWl0ID0gMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiZXh0ZW5kIiwgc2l6ZW9mICJleHRlbmQiIC0gMSkgPT0gMCkKKwl7CisJICBzICs9IHNpemVvZiAiZXh0ZW5kIiAtIDE7CisJICB0eXBlID0gJ3gnOworCSAgZmllbGRsaW1pdCA9IDQ7CisJfQorICAgICAgZWxzZSAKKwl7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoaXNkaWdpdCAoKnMpKQorCXsKKwkgIGZpZWxkbnVtID0gKnMgLSAnMCc7CisJICArK3M7CisJfQorICAgICAgaWYgKGZpZWxkbnVtID49IGZpZWxkbGltaXQpCisJcmV0dXJuOworCisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBpZiAoKnMgIT0gJygnKQorCXJldHVybjsKKyAgICAgICsrczsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICAgICAgcyA9IGF0b2ZfaWVlZSAocywgdHlwZSwgZmxvYXRidWYpOworICAgICAgaWYgKHMgPT0gTlVMTCkKKwlyZXR1cm47CisgICAgICBzID0gczsKKworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgaWYgKCpzICE9ICcpJykKKwlyZXR1cm47CisgICAgICArK3M7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7IAorICAgICAgZXhwcmVzc2lvblAtPlhfdW5zaWduZWQgPSAxOworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9ICgoZmxvYXRidWZbZmllbGRudW0gKiAyXQorCQkJCSAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCisJCQkJICAgKyBmbG9hdGJ1ZltmaWVsZG51bSAqIDIgKyAxXSk7CisgICAgfQorfQorCisvKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQorICAgICBzZWdUIHNlZ21lbnQ7CisgICAgIHZhbHVlVCBzaXplOworeworICByZXR1cm4gc2l6ZTsJCQkvKiBCeXRlIGFsaWdubWVudCBpcyBmaW5lICovCit9CisKKy8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KKyAgIE9uIHRoZSAyOTAwMCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24sCisgICB3aGljaCB3ZSBoYXZlIHNldCB1cCBhcyB0aGUgYWRkcmVzcyBvZiB0aGUgZml4dXAgdG9vLiAgKi8KK2xvbmcKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Cit9CisKKy8qIGVuZCBvZiB0Yy1hMjlrLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYTI5ay5oIGIvZ2FzL2NvbmZpZy90Yy1hMjlrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwZjYwNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtYTI5ay5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIHRjLWEyOWsuaCAtLSBBc3NlbWJsZSBmb3IgdGhlIEFNRCAyOTAwMC4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCitHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRDX0EyOUsKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkxCisKKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisjZGVmaW5lIExFWF9ET0xMQVIgMQorCisjZGVmaW5lIHRjX3VucmVjb2duaXplZF9saW5lKGMpIGEyOWtfdW5yZWNvZ25pemVkX2xpbmUgKGMpCitleHRlcm4gaW50IGEyOWtfdW5yZWNvZ25pemVkX2xpbmUgUEFSQU1TICgoaW50KSk7CisKKyNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQk7CS8qIG5vdCB1c2VkICovCisjZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJOwkvKiBub3QgdXNlZCAqLworI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJOwkvKiBub3QgdXNlZCAqLworI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkJOwkvKiBub3QgdXNlZCAqLworCisjZGVmaW5lIEFPVVRfTUFDSFRZUEUgMTAxCisjZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeF9wdHIpIHRjX2NvZmZfZml4MnJ0eXBlKGZpeF9wdHIpCisjZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2EyOWsKKyNkZWZpbmUgQ09GRl9NQUdJQyBTSVBGQk9NQUdJQworLyogU2hvdWxkIHRoZSByZWxvYyBiZSBvdXRwdXQgPworCW9uIHRoZSAyOWssIHRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoZXJlIGlzIGEgc3ltYm9sIGF0dGF0Y2hlZC4KKwlvbiB0aGUgaDgsIHRoaXMgaXMgYWxsd2F5cyB0cnVlLCBzaW5jZSBubyBmaXh1cCBpcyBkb25lCisqLworI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoeC0+ZnhfYWRkc3kpCisjZGVmaW5lIFRDX0NPTlNfUkVMT0MgUkVMT0NfMzIKKworI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKKyNkZWZpbmUgcmVsb2NfdHlwZSBpbnQKKyNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKKworI2RlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTCisKKy8qIGVuZCBvZiB0Yy1hMjlrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYWxwaGEuYyBiL2dhcy9jb25maWcvdGMtYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg2MTdmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jCkBAIC0wLDAgKzEsNDc2MiBAQAorLyogdGMtYWxwaGEuYyAtIFByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlIGZvciB0aGUgREVDIEFscGhhIEFYUCBDUFUuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHksIDE5OTMuCisgICBXcml0dGVuIGJ5IEFsZXNzYW5kcm8gRm9yaW4sIGJhc2VkIG9uIGVhcmxpZXIgZ2FzLTEuMzggdGFyZ2V0IENQVSBmaWxlcy4KKyAgIE1vZGlmaWVkIGJ5IEtlbiBSYWVidXJuIGZvciBnYXMtMi54IGFuZCBFQ09GRiBzdXBwb3J0LgorICAgTW9kaWZpZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gZm9yIEVMRiBzdXBwb3J0LgorICAgTW9kaWZpZWQgYnkgS2xhdXMgSyJhbXBmIGZvciBFVkFYIChvcGVuVk1TL0FscGhhKSBzdXBwb3J0LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKgorICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUworICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKgorICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCisgKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKKyAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAorICoKKyAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgdGhlCisgKiByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCisgKi8KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorI2luY2x1ZGUgImVjb2ZmLmgiCisKKyNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKKworI2lmZGVmIE9CSl9FTEYKKyNpbmNsdWRlICJlbGYvYWxwaGEuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworDAorLyogTG9jYWwgdHlwZXMgKi8KKworI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgMgorI2RlZmluZSBNQVhfSU5TTl9BUkdTIDUKKworc3RydWN0IGFscGhhX2ZpeHVwCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworfTsKKworc3RydWN0IGFscGhhX2luc24KK3sKKyAgdW5zaWduZWQgaW5zbjsKKyAgaW50IG5maXh1cHM7CisgIHN0cnVjdCBhbHBoYV9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKK307CisKK2VudW0gYWxwaGFfbWFjcm9fYXJnCit7CisgIE1BQ1JPX0VPQSA9IDEsIE1BQ1JPX0lSLCBNQUNST19QSVIsIE1BQ1JPX0NQSVIsIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQCit9OworCitzdHJ1Y3QgYWxwaGFfbWFjcm8KK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAoKmVtaXQpIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CisgIGNvbnN0IFBUUiBhcmc7CisgIGVudW0gYWxwaGFfbWFjcm9fYXJnIGFyZ3NldHNbMTZdOworfTsKKworLyogVHdvIGV4dHJhIHN5bWJvbHMgd2Ugd2FudCB0byBzZWUgaW4gb3VyIGlucHV0LiAgVGhpcyBpcyBhIGJsYXRlbnQKKyAgIG1pc3VzZSBvZiB0aGUgZXhwcmVzc2lvblMuWF9vcCBmaWVsZC4gICovCisKKyNkZWZpbmUgT19wcmVnaXN0ZXIJKE9fbWF4KzEpCS8qIE9fcmVnaXN0ZXIsIGJ1dCBpbiBwYXJlbnRoZXNlcyAqLworI2RlZmluZSBPX2NwcmVnaXN0ZXIJKE9fcHJlZ2lzdGVyKzEpCS8qICsgYSBsZWFkaW5nIGNvbW1hICovCisKKy8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIGVuY29kZWQgcmVnaXN0ZXIgdG9rZW5zICovCisKKyNkZWZpbmUgaXNfaXJfbnVtKHgpCQkoKCh4KSAmIDMyKSA9PSAwKQorI2RlZmluZSBpc19mcHJfbnVtKHgpCQkoKCh4KSAmIDMyKSAhPSAwKQorI2RlZmluZSByZWdubyh4KQkJKCh4KSAmIDMxKQorCisvKiBTb21ldGhpbmcgb2RkIGluaGVyaXRlZCBmcm9tIHRoZSBvbGQgYXNzZW1ibGVyICovCisKKyNkZWZpbmUgbm90ZV9ncHJlZyhSKQkJKGFscGhhX2dwcm1hc2sgfD0gKDEgPDwgKFIpKSkKKyNkZWZpbmUgbm90ZV9mcHJlZyhSKQkJKGFscGhhX2Zwcm1hc2sgfD0gKDEgPDwgKFIpKSkKKworLyogUHJlZGljYXRlcyBmb3IgMTYtIGFuZCAzMi1iaXQgcmFuZ2VzICovCisvKiBYWFg6IFRoZSBub24tc2hpZnQgdmVyc2lvbiBhcHBlYXJzIHRvIHRyaWdnZXIgYSBjb21waWxlciBidWcgd2hlbgorICAgY3Jvc3MtYXNzZW1ibGluZyBmcm9tIHg4NiB3LyBnY2MgMi43LjIuICAqLworCisjaWYgMQorI2RlZmluZSByYW5nZV9zaWduZWRfMTYoeCkgXAorCSgoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMTUpID09IC0xKQorI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkgXAorCSgoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMzEpID09IC0xKQorI2Vsc2UKKyNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMCAmJglcCisJCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGKQorI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkJKChvZmZzZXRUKSh4KSA+PSAtKG9mZnNldFQpMHg4MDAwMDAwMCAmJiBcCisJCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGRkZGRikKKyNlbmRpZgorCisvKiBNYWNyb3MgZm9yIHNpZ24gZXh0ZW5kaW5nIGZyb20gMTYtIGFuZCAzMi1iaXRzLiAgKi8KKy8qIFhYWDogVGhlIGNhc3QgbWFjcm9zIHdpbGwgd29yayBvbiBhbGwgdGhlIHN5c3RlbXMgdGhhdCBJIGNhcmUgYWJvdXQsCisgICBidXQgcmVhbGx5IGEgcHJlZGljYXRlIHNob3VsZCBiZSBmb3VuZCB0byB1c2UgdGhlIG5vbi1jYXN0IGZvcm1zLiAgKi8KKworI2lmIDEKKyNkZWZpbmUgc2lnbl9leHRlbmRfMTYoeCkJKChzaG9ydCkoeCkpCisjZGVmaW5lIHNpZ25fZXh0ZW5kXzMyKHgpCSgoaW50KSh4KSkKKyNlbHNlCisjZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgob2Zmc2V0VCkoKCh4KSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwKQorI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkZGRkZGKSBcCisJCQkJCSAgIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQorI2VuZGlmCisKKy8qIE1hY3JvcyB0byBidWlsZCB0b2tlbnMgKi8KKworI2RlZmluZSBzZXRfdG9rX3JlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCisJCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCisJCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCisjZGVmaW5lIHNldF90b2tfcHJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCisJCQkJICh0KS5YX29wID0gT19wcmVnaXN0ZXIsCQlcCisJCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCisjZGVmaW5lIHNldF90b2tfY3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAorCQkJCSAodCkuWF9vcCA9IE9fY3ByZWdpc3RlciwJCVwKKwkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSkKKyNkZWZpbmUgc2V0X3Rva19mcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKKwkJCQkgKHQpLlhfb3AgPSBPX3JlZ2lzdGVyLAkJCVwKKwkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSszMikKKyNkZWZpbmUgc2V0X3Rva19zeW0odCwgcywgYSkJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAorCQkJCSAodCkuWF9vcCA9IE9fc3ltYm9sLAkJCVwKKwkJCQkgKHQpLlhfYWRkX3N5bWJvbCA9IChzKSwJCVwKKwkJCQkgKHQpLlhfYWRkX251bWJlciA9IChhKSkKKyNkZWZpbmUgc2V0X3Rva19jb25zdCh0LCBuKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCisJCQkJICh0KS5YX29wID0gT19jb25zdGFudCwJCQlcCisJCQkJICh0KS5YX2FkZF9udW1iZXIgPSAobikpCisKKwwKKy8qIFByb3RvdHlwZXMgZm9yIGFsbCBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCB0b2tlbml6ZV9hcmd1bWVudHMgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqLCBpbnQpKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaW5kX29wY29kZV9tYXRjaAorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBpbnQgKikpOworc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmluZF9tYWNyb19tYXRjaAorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnNlcnRfb3BlcmFuZAorICBQQVJBTVMgKCh1bnNpZ25lZCwgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKiwgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCkpOworc3RhdGljIHZvaWQgYXNzZW1ibGVfaW5zbgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwKKwkgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7CitzdGF0aWMgdm9pZCBlbWl0X2luc24gUEFSQU1TICgoc3RydWN0IGFscGhhX2luc24gKikpOworc3RhdGljIHZvaWQgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24KKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIHN0cnVjdCBhbHBoYV9pbnNuICopKTsKK3N0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2VucworICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgaW50KSk7CisKK3N0YXRpYyBpbnQgbG9hZF9leHByZXNzaW9uCisgIFBBUkFNUyAoKGludCwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICosIGV4cHJlc3Npb25TICopKTsKKworc3RhdGljIHZvaWQgZW1pdF9sZGdwIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X2RpdmlzaW9uIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X2xkYSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOworc3RhdGljIHZvaWQgZW1pdF9sZGFoIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X2lyX2xvYWQgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVtaXRfbG9hZHN0b3JlIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X2pzcmptcCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOworc3RhdGljIHZvaWQgZW1pdF9sZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVtaXRfbGRYdSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOworc3RhdGljIHZvaWQgZW1pdF91bGRYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X3VsZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X2xkaWwgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVtaXRfc3RYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CitzdGF0aWMgdm9pZCBlbWl0X3VzdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVtaXRfc2V4dFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKK3N0YXRpYyB2b2lkIGVtaXRfcmV0amNyIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7CisKK3N0YXRpYyB2b2lkIHNfYWxwaGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfYWxwaGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKKyNpZm5kZWYgT0JKX0VMRgorc3RhdGljIHZvaWQgc19hbHBoYV9jb21tIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9yZGF0YSBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorI2lmZGVmIE9CSl9FQ09GRgorc3RhdGljIHZvaWQgc19hbHBoYV9zZGF0YSBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKK3N0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfYWxwaGFfZW50IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9lbmQgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2FscGhhX21hc2sgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2FscGhhX2ZyYW1lIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfYWxwaGFfY29mZl93cmFwcGVyIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisjaWZkZWYgT0JKX0VWQVgKK3N0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc19hbHBoYV9ncHJlbDMyIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9wcm9jIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9zZXQgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2FscGhhX2Jhc2UgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2FscGhhX2FsaWduIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19hbHBoYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfYWxwaGFfc3BhY2UgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdUICosIHN5bWJvbFMgKiopKTsKKyNpZm5kZWYgT0JKX0VMRgorc3RhdGljIHZvaWQgc2VsZWN0X2dwX3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKiwgaW50KSk7CisKKwwKKy8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbAorICAgdGFyZ2V0cy4gICovCisKKy8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhCisgICBzaW5nbGUgbGluZS4gICovCitjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7CisKKy8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZworICAgcG9pbnQgbnVtYmVyLiAgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAorICAgYXMgaW4gMGQxLjAuICAqLworI2lmIDAKK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOworI2Vsc2UKKy8qIFhYWDogRG8gYWxsIG9mIHRoZXNlIHJlYWxseSBnZXQgdXNlZCBvbiB0aGUgYWxwaGE/PyAgKi8KK2NoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKKyNlbmRpZgorCisjaWZkZWYgT0JKX0VWQVgKK2NvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJGbTpnKzFoOkhHOiI7CisjZWxzZQorY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkZtOmdHOiI7CisjZW5kaWYKKworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworI2RlZmluZSBPUFRJT05fMzJBRERSIChPUFRJT05fTURfQkFTRSkKKyAgeyAiMzJhZGRyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMkFERFIgfSwKKyNkZWZpbmUgT1BUSU9OX1JFTEFYIChPUFRJT05fMzJBRERSKzEpCisgIHsgInJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWCB9LAorI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgT1BUSU9OX01ERUJVRyAoT1BUSU9OX1JFTEFYKzEpCisjZGVmaW5lIE9QVElPTl9OT19NREVCVUcgKE9QVElPTl9NREVCVUcrMSkKKyAgeyAibWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NREVCVUcgfSwKKyAgeyAibm8tbWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NREVCVUcgfSwKKyNlbmRpZgorICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0KK307CisKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKKworDAorI2lmZGVmIE9CSl9FVkFYCisjZGVmaW5lIEFYUF9SRUdfUjAgICAgIDAKKyNkZWZpbmUgQVhQX1JFR19SMTYgICAgMTYKKyNkZWZpbmUgQVhQX1JFR19SMTcgICAgMTcKKyN1bmRlZiBBWFBfUkVHX1Q5CisjZGVmaW5lIEFYUF9SRUdfVDkgICAgIDIyCisjdW5kZWYgQVhQX1JFR19UMTAKKyNkZWZpbmUgQVhQX1JFR19UMTAgICAgMjMKKyN1bmRlZiBBWFBfUkVHX1QxMQorI2RlZmluZSBBWFBfUkVHX1QxMSAgICAyNAorI3VuZGVmIEFYUF9SRUdfVDEyCisjZGVmaW5lIEFYUF9SRUdfVDEyICAgIDI1CisjZGVmaW5lIEFYUF9SRUdfQUkgICAgIDI1CisjdW5kZWYgQVhQX1JFR19GUAorI2RlZmluZSBBWFBfUkVHX0ZQICAgICAyOQorCisjdW5kZWYgQVhQX1JFR19HUAorI2RlZmluZSBBWFBfUkVHX0dQIEFYUF9SRUdfUFYKKyNlbmRpZiAvKiBPQkpfRVZBWCAgKi8KKworLyogVGhlIGNwdSBmb3Igd2hpY2ggd2UgYXJlIGdlbmVyYXRpbmcgY29kZSAqLworc3RhdGljIHVuc2lnbmVkIGFscGhhX3RhcmdldCA9IEFYUF9PUENPREVfQkFTRTsKK3N0YXRpYyBjb25zdCBjaGFyICphbHBoYV90YXJnZXRfbmFtZSA9ICI8YWxsPiI7CisKKy8qIFRoZSBoYXNoIHRhYmxlIG9mIGluc3RydWN0aW9uIG9wY29kZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphbHBoYV9vcGNvZGVfaGFzaDsKKworLyogVGhlIGhhc2ggdGFibGUgb2YgbWFjcm8gb3Bjb2RlcyAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFscGhhX21hY3JvX2hhc2g7CisKKyNpZmRlZiBPQkpfRUNPRkYKKy8qIFRoZSAkZ3AgcmVsb2NhdGlvbiBzeW1ib2wgKi8KK3N0YXRpYyBzeW1ib2xTICphbHBoYV9ncF9zeW1ib2w7CisKKy8qIFhYWDogd2hhdCBpcyB0aGlzLCBhbmQgd2h5IGlzIGl0IGV4cG9ydGVkPyAqLwordmFsdWVUIGFscGhhX2dwX3ZhbHVlOworI2VuZGlmCisKKy8qIFRoZSBjdXJyZW50ICRncCByZWdpc3RlciAqLworc3RhdGljIGludCBhbHBoYV9ncF9yZWdpc3RlciA9IEFYUF9SRUdfR1A7CisKKy8qIEEgdGFibGUgb2YgdGhlIHJlZ2lzdGVyIHN5bWJvbHMgKi8KK3N0YXRpYyBzeW1ib2xTICphbHBoYV9yZWdpc3Rlcl90YWJsZVs2NF07CisKKy8qIENvbnN0YW50IHNlY3Rpb25zLCBvciBzZWN0aW9ucyBvZiBjb25zdGFudHMgKi8KKyNpZmRlZiBPQkpfRUNPRkYKK3N0YXRpYyBzZWdUIGFscGhhX2xpdGFfc2VjdGlvbjsKK3N0YXRpYyBzZWdUIGFscGhhX2xpdDRfc2VjdGlvbjsKKyNlbmRpZgorI2lmZGVmIE9CSl9FVkFYCitzdGF0aWMgc2VnVCBhbHBoYV9saW5rX3NlY3Rpb247CitzdGF0aWMgc2VnVCBhbHBoYV9jdG9yc19zZWN0aW9uOworc3RhdGljIHNlZ1QgYWxwaGFfZHRvcnNfc2VjdGlvbjsKKyNlbmRpZgorc3RhdGljIHNlZ1QgYWxwaGFfbGl0OF9zZWN0aW9uOworCisvKiBTeW1ib2xzIHJlZmVycmluZyB0byBzYWlkIHNlY3Rpb25zLiAqLworI2lmZGVmIE9CSl9FQ09GRgorc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdGFfc3ltYm9sOworc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdDRfc3ltYm9sOworI2VuZGlmCisjaWZkZWYgT0JKX0VWQVgKK3N0YXRpYyBzeW1ib2xTICphbHBoYV9saW5rX3N5bWJvbDsKK3N0YXRpYyBzeW1ib2xTICphbHBoYV9jdG9yc19zeW1ib2w7CitzdGF0aWMgc3ltYm9sUyAqYWxwaGFfZHRvcnNfc3ltYm9sOworI2VuZGlmCitzdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0OF9zeW1ib2w7CisKKy8qIExpdGVyYWwgZm9yIC5saXRYKzB4ODAwMCB3aXRoaW4gLmxpdGEgKi8KKyNpZmRlZiBPQkpfRUNPRkYKK3N0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDRfbGl0ZXJhbDsKK3N0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDhfbGl0ZXJhbDsKKyNlbmRpZgorCisvKiBUaGUgYWN0aXZlIC5lbnQgc3ltYm9sLiAgKi8KKyNpZmRlZiBPQkpfRUxGCitzdGF0aWMgc3ltYm9sUyAqYWxwaGFfY3VyX2VudF9zeW07CisjZW5kaWYKKworLyogSXMgdGhlIGFzc2VtYmxlciBub3QgYWxsb3dlZCB0byB1c2UgJGF0PyAqLworc3RhdGljIGludCBhbHBoYV9ub2F0X29uID0gMDsKKworLyogQXJlIG1hY3JvcyBlbmFibGVkPyAqLworc3RhdGljIGludCBhbHBoYV9tYWNyb3Nfb24gPSAxOworCisvKiBBcmUgZmxvYXRzIGRpc2FibGVkPyAqLworc3RhdGljIGludCBhbHBoYV9ub2Zsb2F0c19vbiA9IDA7CisKKy8qIEFyZSBhZGRyZXNzZXMgMzIgYml0PyAqLworc3RhdGljIGludCBhbHBoYV9hZGRyMzJfb24gPSAwOworCisvKiBTeW1ib2wgbGFiZWxsaW5nIHRoZSBjdXJyZW50IGluc24uICBXaGVuIHRoZSBBbHBoYSBnYXMgc2VlcworICAgICBmb286CisgICAgICAgLnF1YWQgMAorICAgYW5kIHRoZSBzZWN0aW9uIGhhcHBlbnMgdG8gbm90IGJlIG9uIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnksIGl0CisgICB3aWxsIGFsaWduIGJvdGggdGhlIHN5bWJvbCBhbmQgdGhlIC5xdWFkIHRvIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnkuICAqLworc3RhdGljIHN5bWJvbFMgKmFscGhhX2luc25fbGFiZWw7CisKKy8qIFdoZXRoZXIgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgYWxpZ24gZGF0YSBnZW5lcmF0aW9uIHBzZXVkby1vcHMuCisgICAuYWxpZ24gMCB3aWxsIHR1cm4gdGhpcyBvZmYuICAqLworc3RhdGljIGludCBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKKworLyogVGhlIGtub3duIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLworc3RhdGljIGludCBhbHBoYV9jdXJyZW50X2FsaWduOworCisvKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gRUNPRkYgY29kZS4gICovCit1bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7CisKKy8qIFdoZXRoZXIgdGhlIGRlYnVnZ2luZyBvcHRpb24gd2FzIHNlZW4uICAqLworc3RhdGljIGludCBhbHBoYV9kZWJ1ZzsKKworI2lmZGVmIE9CSl9FTEYKKy8qIFdoZXRoZXIgd2UgYXJlIGVtaXR0aW5nIGFuIG1kZWJ1ZyBzZWN0aW9uLiAgKi8KK2ludCBhbHBoYV9mbGFnX21kZWJ1ZyA9IDE7CisjZW5kaWYKKworLyogRG9uJ3QgZnVsbHkgcmVzb2x2ZSByZWxvY2F0aW9ucywgYWxsb3dpbmcgY29kZSBtb3ZlbWVudCBpbiB0aGUgbGlua2VyLiAgKi8KK3N0YXRpYyBpbnQgYWxwaGFfZmxhZ19yZWxheDsKKworLyogV2hhdCB2YWx1ZSB0byBnaXZlIHRvIGJmZF9zZXRfZ3Bfc2l6ZS4gICovCitzdGF0aWMgaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKKworI2lmZGVmIE9CSl9FVkFYCisvKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcHJvY2VkdXJlIGhlcmUuICAqLworc3RhdGljIHN0cnVjdCB7CisgIHN5bWJvbFMgKnN5bWJvbDsJLyogcHJvYyBwZGVzYyBzeW1ib2wgKi8KKyAgaW50IHBkc2NraW5kOworICBpbnQgZnJhbWVyZWc7CQkvKiByZWdpc3RlciBmb3IgZnJhbWUgcG9pbnRlciAqLworICBpbnQgZnJhbWVzaXplOwkvKiBzaXplIG9mIGZyYW1lICovCisgIGludCByc2Ffb2Zmc2V0OworICBpbnQgcmFfc2F2ZTsKKyAgaW50IGZwX3NhdmU7CisgIGxvbmcgaW1hc2s7CisgIGxvbmcgZm1hc2s7CisgIGludCB0eXBlOworICBpbnQgcHJvbG9ndWU7Cit9IGFscGhhX2V2YXhfcHJvYzsKKworc3RhdGljIGludCBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDA7CQkvKiAtKyAqLworc3RhdGljIGludCBhbHBoYV9mbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMgPSAwOwkJLyogLUggKi8KKworLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiBhIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcworICogbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycywgZWxzZSBsb25nZXIgc3ltYm9sIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCisgKi8KKworI2VuZGlmCisMCisvKiBBIHRhYmxlIG9mIENQVSBuYW1lcyBhbmQgb3Bjb2RlIHNldHMuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGZsYWdzOworfSBjcHVfdHlwZXNbXSA9Cit7CisgIC8qIEFkIGhvYyBjb252ZW50aW9uOiBjcHUgbnVtYmVyIGdldHMgcGFsY29kZSwgcHJvY2VzcyBjb2RlIGRvZXNuJ3QuCisgICAgIFRoaXMgc3VwcG9ydHMgdXNhZ2UgdW5kZXIgRFUgNC4wYiB0aGF0IGRvZXMgIi5hcmNoIGV2NCIsIGFuZCAKKyAgICAgdXNhZ2UgaW4gTUlMTyB0aGF0IGRvZXMgLW0yMTA2NC4gIFByb2JhYmx5IHNvbWV0aGluZyBtb3JlCisgICAgIHNwZWNpZmljIGxpa2UgLW0yMTA2NC1wYWwgc2hvdWxkIGJlIHVzZWQsIGJ1dCBvaCB3ZWxsLiAgKi8KKworICB7ICIyMTA2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAorICB7ICIyMTA2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKKyAgeyAiMjEwNjYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKKyAgeyAiMjEwNjgiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKKyAgeyAiMjExNjQiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjUgfSwKKyAgeyAiMjExNjRhIiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYIH0sCisgIHsgIjIxMTY0cGMiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYCisJCXxBWFBfT1BDT0RFX01BWCkgfSwKKyAgeyAiMjEyNjQiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY2fEFYUF9PUENPREVfQldYCisJICAgICAgfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYKSB9LAorCisgIHsgImV2NCIsIEFYUF9PUENPREVfQkFTRSB9LAorICB7ICJldjQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCisgIHsgImxjYTQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCisgIHsgImV2NSIsIEFYUF9PUENPREVfQkFTRSB9LAorICB7ICJldjU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYIH0sCisgIHsgInBjYTU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYIH0sCisgIHsgImV2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0JXWHxBWFBfT1BDT0RFX01BWHxBWFBfT1BDT0RFX0NJWCB9LAorCisgIHsgImFsbCIsIEFYUF9PUENPREVfQkFTRSB9LAorICB7IDAgfQorfTsKKworLyogVGhlIG1hY3JvIHRhYmxlICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gYWxwaGFfbWFjcm9zW10gPSB7CisvKiBMb2FkL1N0b3JlIG1hY3JvcyAqLworICB7ICJsZGEiLAllbWl0X2xkYSwgTlVMTCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRhaCIsCWVtaXRfbGRhaCwgTlVMTCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisKKyAgeyAibGRsIiwJZW1pdF9pcl9sb2FkLCAibGRsIiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRsX2wiLAllbWl0X2lyX2xvYWQsICJsZGxfbCIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgImxkcSIsCWVtaXRfaXJfbG9hZCwgImxkcSIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgImxkcV9sIiwJZW1pdF9pcl9sb2FkLCAibGRxX2wiLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJsZHFfdSIsCWVtaXRfaXJfbG9hZCwgImxkcV91IiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRmIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGYiLAorICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgImxkZyIsCWVtaXRfbG9hZHN0b3JlLCAibGRnIiwKKyAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJsZHMiLAllbWl0X2xvYWRzdG9yZSwgImxkcyIsCisgICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGR0IiwJZW1pdF9sb2Fkc3RvcmUsICJsZHQiLAorICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisKKyAgeyAibGRiIiwJZW1pdF9sZFgsIChQVFIpMCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRidSIsCWVtaXRfbGRYdSwgKFBUUikwLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJsZHciLAllbWl0X2xkWCwgKFBUUikxLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJsZHd1IiwJZW1pdF9sZFh1LCAoUFRSKTEsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisKKyAgeyAidWxkdyIsCWVtaXRfdWxkWCwgKFBUUikxLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJ1bGR3dSIsCWVtaXRfdWxkWHUsIChQVFIpMSwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAidWxkbCIsCWVtaXRfdWxkWCwgKFBUUikyLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJ1bGRsdSIsCWVtaXRfdWxkWHUsIChQVFIpMiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAidWxkcSIsCWVtaXRfdWxkWHUsIChQVFIpMywKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKworICB7ICJsZGdwIiwJZW1pdF9sZGdwLCBOVUxMLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EgfSB9LAorCisgIHsgImxkaSIsCWVtaXRfbGRhLCBOVUxMLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRpbCIsCWVtaXRfbGRpbCwgTlVMTCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgImxkaXEiLAllbWl0X2xkYSwgTlVMTCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisjaWYgMAorICB7ICJsZGlmIgllbWl0X2xkaXEsIE5VTEwsCisgICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRpZCIJZW1pdF9sZGlxLCBOVUxMLAorICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgImxkaWciCWVtaXRfbGRpcSwgTlVMTCwKKyAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJsZGlzIgllbWl0X2xkaXEsIE5VTEwsCisgICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAibGRpdCIJZW1pdF9sZGlxLCBOVUxMLAorICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisjZW5kaWYKKworICB7ICJzdGwiLAllbWl0X2xvYWRzdG9yZSwgInN0bCIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgInN0bF9jIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGxfYyIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgInN0cSIsCWVtaXRfbG9hZHN0b3JlLCAic3RxIiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAic3RxX2MiLAllbWl0X2xvYWRzdG9yZSwgInN0cV9jIiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAic3RxX3UiLAllbWl0X2xvYWRzdG9yZSwgInN0cV91IiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAic3RmIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGYiLAorICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgInN0ZyIsCWVtaXRfbG9hZHN0b3JlLCAic3RnIiwKKyAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJzdHMiLAllbWl0X2xvYWRzdG9yZSwgInN0cyIsCisgICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAic3R0IiwJZW1pdF9sb2Fkc3RvcmUsICJzdHQiLAorICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisKKyAgeyAic3RiIiwJZW1pdF9zdFgsIChQVFIpMCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAic3R3IiwJZW1pdF9zdFgsIChQVFIpMSwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKyAgeyAidXN0dyIsCWVtaXRfdXN0WCwgKFBUUikxLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJ1c3RsIiwJZW1pdF91c3RYLCAoUFRSKTIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgInVzdHEiLAllbWl0X3VzdFgsIChQVFIpMywKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKKworLyogQXJpdGhtZXRpYyBtYWNyb3MgKi8KKyNpZiAwCisgIHsgImFic2wiCWVtaXRfYWJzbCwgMSwgeyBJUiB9IH0sCisgIHsgImFic2wiCWVtaXRfYWJzbCwgMiwgeyBJUiwgSVIgfSB9LAorICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgRVhQLCBJUiB9IH0sCisgIHsgImFic3EiCWVtaXRfYWJzcSwgMSwgeyBJUiB9IH0sCisgIHsgImFic3EiCWVtaXRfYWJzcSwgMiwgeyBJUiwgSVIgfSB9LAorICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgRVhQLCBJUiB9IH0sCisjZW5kaWYKKworICB7ICJzZXh0YiIsCWVtaXRfc2V4dFgsIChQVFIpMCwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCisgIHsgInNleHR3IiwJZW1pdF9zZXh0WCwgKFBUUikxLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgLyogTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BICovIH0gfSwKKworICB7ICJkaXZsIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2bCIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAorICB7ICJkaXZsdSIsCWVtaXRfZGl2aXNpb24sICJfX2Rpdmx1IiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCisgIHsgImRpdnEiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZxIiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCisgIHsgImRpdnF1IiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cXUiLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKKyAgeyAicmVtbCIsCWVtaXRfZGl2aXNpb24sICJfX3JlbWwiLAorICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKKyAgeyAicmVtbHUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sdSIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAorICB7ICJyZW1xIiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtcSIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAorICB7ICJyZW1xdSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXF1IiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCisKKyAgeyAianNyIiwJZW1pdF9qc3JqbXAsICJqc3IiLAorICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAorICB7ICJqbXAiLAllbWl0X2pzcmptcCwgImptcCIsCisgICAgeyBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCisgICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCisgIHsgInJldCIsCWVtaXRfcmV0amNyLCAicmV0IiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0VPQSB9IH0sCisgIHsgImpjciIsCWVtaXRfcmV0amNyLCAiamNyIiwKKyAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCisgICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCisgICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX0VPQSB9IH0sCisgIHsgImpzcl9jb3JvdXRpbmUiLAllbWl0X3JldGpjciwgImpjciIsCisgICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCisgICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKKyAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAorICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCisgICAgICBNQUNST19FT0EgfSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBhbHBoYV9udW1fbWFjcm9zCisgID0gc2l6ZW9mKGFscGhhX21hY3JvcykgLyBzaXplb2YoKmFscGhhX21hY3Jvcyk7CisMCisvKiBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2V0cworICAgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKKyAgIG5lZWQsIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmVmb3JlIGFyZ3VtZW50cyBhcmUgcGFyc2VkLiAgKi8KKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgLyogQ3JlYXRlIHRoZSBvcGNvZGUgaGFzaCB0YWJsZSAqLworCisgIGFscGhhX29wY29kZV9oYXNoID0gaGFzaF9uZXcgKCk7CisgIGZvciAoaSA9IDA7IGkgPCBhbHBoYV9udW1fb3Bjb2RlczsgKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUsICpyZXR2YWwsICpzbGFzaDsKKworICAgICAgbmFtZSA9IGFscGhhX29wY29kZXNbaV0ubmFtZTsKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChhbHBoYV9vcGNvZGVfaGFzaCwgbmFtZSwgKFBUUikmYWxwaGFfb3Bjb2Rlc1tpXSk7CisgICAgICBpZiAocmV0dmFsKQorCWFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBvcGNvZGUgYCVzJzogJXMiKSwgbmFtZSwgcmV0dmFsKTsKKworICAgICAgLyogU29tZSBvcGNvZGVzIGluY2x1ZGUgbW9kaWZpZXJzIG9mIHZhcmlvdXMgc29ydHMgd2l0aCBhICIvbW9kIgorCSBzeW50YXgsIGxpa2UgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgc3VnZ2VzdHMuICBIb3dldmVyLCBmb3IKKwkgdXNlIHdpdGggZ2NjIGF0IGxlYXN0LCB3ZSBhbHNvIG5lZWQgYWNjZXNzIHRvIHRob3NlIHNhbWUgb3Bjb2RlcworCSB3aXRob3V0IHRoZSAiLyIuICAqLworCisgICAgICBpZiAoKHNsYXNoID0gc3RyY2hyIChuYW1lLCAnLycpKSAhPSBOVUxMKQorCXsKKwkgIGNoYXIgKnAgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpKTsKKwkgIG1lbWNweSAocCwgbmFtZSwgc2xhc2ggLSBuYW1lKTsKKwkgIHN0cmNweSAocCArIChzbGFzaCAtIG5hbWUpLCBzbGFzaCArIDEpOworCisJICAodm9pZCloYXNoX2luc2VydChhbHBoYV9vcGNvZGVfaGFzaCwgcCwgKFBUUikmYWxwaGFfb3Bjb2Rlc1tpXSk7CisJICAvKiBJZ25vcmUgZmFpbHVyZXMgLS0gdGhlIG9wY29kZSB0YWJsZSBkb2VzIGR1cGxpY2F0ZSBzb21lCisJICAgICB2YXJpYW50cyBpbiBkaWZmZXJlbnQgZm9ybXMsIGxpa2UgImh3X3N0cSIgYW5kICJod19zdC9xIi4gICovCisJfQorCisgICAgICB3aGlsZSAoKytpIDwgYWxwaGFfbnVtX29wY29kZXMKKwkgICAgICYmIChhbHBoYV9vcGNvZGVzW2ldLm5hbWUgPT0gbmFtZQorCQkgfHwgIXN0cmNtcCAoYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSkpCisJY29udGludWU7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgbWFjcm8gaGFzaCB0YWJsZSAqLworCisgIGFscGhhX21hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKKyAgZm9yIChpID0gMDsgaSA8IGFscGhhX251bV9tYWNyb3M7ICkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lLCAqcmV0dmFsOworCisgICAgICBuYW1lID0gYWxwaGFfbWFjcm9zW2ldLm5hbWU7CisgICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYWxwaGFfbWFjcm9faGFzaCwgbmFtZSwgKFBUUikmYWxwaGFfbWFjcm9zW2ldKTsKKyAgICAgIGlmIChyZXR2YWwpCisJYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG1hY3JvIGAlcyc6ICVzIiksIG5hbWUsIHJldHZhbCk7CisKKyAgICAgIHdoaWxlICgrK2kgPCBhbHBoYV9udW1fbWFjcm9zCisJICAgICAmJiAoYWxwaGFfbWFjcm9zW2ldLm5hbWUgPT0gbmFtZQorCQkgfHwgIXN0cmNtcCAoYWxwaGFfbWFjcm9zW2ldLm5hbWUsIG5hbWUpKSkKKwljb250aW51ZTsKKyAgICB9CisKKyAgLyogQ29uc3RydWN0IHN5bWJvbHMgZm9yIGVhY2ggb2YgdGhlIHJlZ2lzdGVycyAqLworCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQorICAgIHsKKyAgICAgIGNoYXIgbmFtZVs0XTsKKyAgICAgIHNwcmludGYobmFtZSwgIiQlZCIsIGkpOworICAgICAgYWxwaGFfcmVnaXN0ZXJfdGFibGVbaV0gPSBzeW1ib2xfY3JlYXRlKG5hbWUsIHJlZ19zZWN0aW9uLCBpLAorCQkJCQkgICAgICAmemVyb19hZGRyZXNzX2ZyYWcpOworICAgIH0KKyAgZm9yICg7IGkgPCA2NDsgKytpKQorICAgIHsKKyAgICAgIGNoYXIgbmFtZVs1XTsKKyAgICAgIHNwcmludGYobmFtZSwgIiRmJWQiLCBpLTMyKTsKKyAgICAgIGFscGhhX3JlZ2lzdGVyX3RhYmxlW2ldID0gc3ltYm9sX2NyZWF0ZShuYW1lLCByZWdfc2VjdGlvbiwgaSwKKwkJCQkJICAgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBzcGVjaWFsIHN5bWJvbHMgYW5kIHNlY3Rpb25zIHdlJ2xsIGJlIHVzaW5nICovCisKKyAgLyogU28gLnNic3Mgd2lsbCBnZXQgdXNlZCBmb3IgdGlueSBvYmplY3RzLiAgKi8KKyAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIGdfc3dpdGNoX3ZhbHVlKTsKKworI2lmZGVmIE9CSl9FQ09GRgorICBjcmVhdGVfbGl0ZXJhbF9zZWN0aW9uICgiLmxpdGEiLCAmYWxwaGFfbGl0YV9zZWN0aW9uLCAmYWxwaGFfbGl0YV9zeW1ib2wpOworCisgIC8qIEZvciBoYW5kbGluZyB0aGUgR1AsIGNyZWF0ZSBhIHN5bWJvbCB0aGF0IHdvbid0IGJlIG91dHB1dCBpbiB0aGUKKyAgICAgc3ltYm9sIHRhYmxlLiAgV2UnbGwgZWRpdCBpdCBvdXQgb2YgcmVsb2NzIGxhdGVyLiAgKi8KKyAgYWxwaGFfZ3Bfc3ltYm9sID0gc3ltYm9sX2NyZWF0ZSAoIjxHUCB2YWx1ZT4iLCBhbHBoYV9saXRhX3NlY3Rpb24sIDB4ODAwMCwKKwkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpOworI2VuZGlmCisKKyNpZmRlZiBPQkpfRVZBWAorICBjcmVhdGVfbGl0ZXJhbF9zZWN0aW9uICgiLmxpbmsiLCAmYWxwaGFfbGlua19zZWN0aW9uLCAmYWxwaGFfbGlua19zeW1ib2wpOworI2VuZGlmCisKKyNpZmRlZiBPQkpfRUxGCisgIGlmIChFQ09GRl9ERUJVR0dJTkcpCisgICAgeworICAgICAgc2VnVCBzZWMgPSBzdWJzZWdfbmV3KCIubWRlYnVnIiwgKHN1YnNlZ1QpMCk7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3Moc3Rkb3V0cHV0LCBzZWMsIFNFQ19IQVNfQ09OVEVOVFN8U0VDX1JFQURPTkxZKTsKKyAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWMsIDMpOworICAgIH0KKyNlbmRpZiAvKiBPQkpfRUxGICovCisKKyAgc3Vic2VnX3NldCh0ZXh0X3NlY3Rpb24sIDApOworfQorCisvKiBUaGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgaW5zdHJ1Y3Rpb24gYXNzZW1ibGVyLiAgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyIG9wbmFtZVszMl07CQkJLyogY3VycmVudCBtYXhpbXVtIGlzIDEzICovCisgIGV4cHJlc3Npb25TIHRva1tNQVhfSU5TTl9BUkdTXTsKKyAgaW50IG50b2ssIG9wbmFtZWxlbiwgdHJ1bmNsZW47CisKKyAgLyogc3BsaXQgb2ZmIHRoZSBvcGNvZGUgKi8KKyAgb3BuYW1lbGVuID0gc3Ryc3BuIChzdHIsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5el8vNDY4Iik7CisgIHRydW5jbGVuID0gKG9wbmFtZWxlbiA8IHNpemVvZiAob3BuYW1lKSAtIDEKKwkgICAgICA/IG9wbmFtZWxlbgorCSAgICAgIDogc2l6ZW9mIChvcG5hbWUpIC0gMSk7CisgIG1lbWNweSAob3BuYW1lLCBzdHIsIHRydW5jbGVuKTsKKyAgb3BuYW1lW3RydW5jbGVuXSA9ICdcMCc7CisKKyAgLyogdG9rZW5pemUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgKi8KKyAgaWYgKChudG9rID0gdG9rZW5pemVfYXJndW1lbnRzIChzdHIgKyBvcG5hbWVsZW4sIHRvaywgTUFYX0lOU05fQVJHUykpIDwgMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogZmluaXNoIGl0IG9mZiAqLworICBhc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBhbHBoYV9tYWNyb3Nfb24pOworfQorCisvKiBSb3VuZCB1cCBhIHNlY3Rpb24ncyBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCisKK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBzaXplKQorICAgICBzZWdUIHNlZzsKKyAgICAgdmFsdWVUIHNpemU7Cit7CisgIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWcpOworICB2YWx1ZVQgbWFzayA9ICgodmFsdWVUKTEgPDwgYWxpZ24pIC0gMTsKKworICByZXR1cm4gKHNpemUgKyBtYXNrKSAmIH5tYXNrOworfQorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKKyAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKKyAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcworICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLworCisvKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCisjZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKKworZXh0ZXJuIGNoYXIgKnZheF9tZF9hdG9mIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOworCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBjaGFyIHR5cGU7CisgICAgIGNoYXIgKmxpdFA7CisgICAgIGludCAqc2l6ZVA7Cit7CisgIGludCBwcmVjOworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107CisgIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKKyAgY2hhciAqdDsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgLyogVkFYIGZsb2F0cyAqLworICAgIGNhc2UgJ0cnOgorICAgICAgLyogVkFYIG1kX2F0b2YgZG9lc24ndCBsaWtlICJHIiBmb3Igc29tZSByZWFzb24uICAqLworICAgICAgdHlwZSA9ICdnJzsKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdEJzoKKyAgICAgIHJldHVybiB2YXhfbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApOworCisgICAgICAvKiBJRUVFIGZsb2F0cyAqLworICAgIGNhc2UgJ2YnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOworICAgIH0KKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisgICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKworICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQLS0pLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVGFrZSBjYXJlIG9mIHRoZSB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZC1saW5lIG9wdGlvbnMuICAqLworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ0YnOgorICAgICAgYWxwaGFfbm9mbG9hdHNfb24gPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl8zMkFERFI6CisgICAgICBhbHBoYV9hZGRyMzJfb24gPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdnJzoKKyAgICAgIGFscGhhX2RlYnVnID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRyc6CisgICAgICBnX3N3aXRjaF92YWx1ZSA9IGF0b2koYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbSc6CisgICAgICB7CisJY29uc3Qgc3RydWN0IGNwdV90eXBlICpwOworCWZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQorCSAgaWYgKHN0cmNtcChhcmcsIHAtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICBhbHBoYV90YXJnZXRfbmFtZSA9IHAtPm5hbWUsIGFscGhhX3RhcmdldCA9IHAtPmZsYWdzOworCSAgICAgIGdvdG8gZm91bmQ7CisJICAgIH0KKwlhc193YXJuKF8oIlVua25vd24gQ1BVIGlkZW50aWZpZXIgYCVzJyIpLCBhcmcpOworICAgICAgZm91bmQ6OworICAgICAgfQorICAgICAgYnJlYWs7CisKKyNpZmRlZiBPQkpfRVZBWAorICAgIGNhc2UgJysnOgkJCS8qIEZvciBnKysuICBIYXNoIGFueSBuYW1lID4gNjMgY2hhcnMgbG9uZy4gKi8KKyAgICAgIGFscGhhX2ZsYWdfaGFzaF9sb25nX25hbWVzID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnSCc6CQkJLyogU2hvdyBuZXcgc3ltYm9sIGFmdGVyIGhhc2ggdHJ1bmNhdGlvbiAqLworICAgICAgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnaCc6CQkJLyogZm9yIGdudS1jL3ZheCBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIE9QVElPTl9SRUxBWDoKKyAgICAgIGFscGhhX2ZsYWdfcmVsYXggPSAxOworICAgICAgYnJlYWs7CisKKyNpZmRlZiBPQkpfRUxGCisgICAgY2FzZSBPUFRJT05fTURFQlVHOgorICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fTk9fTURFQlVHOgorICAgICAgYWxwaGFfZmxhZ19tZGVidWcgPSAwOworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFByaW50IGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgd2UgYWNjZXB0LiAgKi8KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGZwdXRzKF8oIlwKK0FscGhhIG9wdGlvbnM6XG5cCistMzJhZGRyCQkJdHJlYXQgYWRkcmVzc2VzIGFzIDMyLWJpdCB2YWx1ZXNcblwKKy1GCQkJbGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuXAorLW1ldjQgfCAtbWV2NDUgfCAtbWV2NSB8IC1tZXY1NiB8IC1tcGNhNTYgfCAtbWV2NiB8IC1tYWxsXG5cCisJCQlzcGVjaWZ5IHZhcmlhbnQgb2YgQWxwaGEgYXJjaGl0ZWN0dXJlXG5cCistbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcblwKKwkJCXRoZXNlIHZhcmlhbnRzIGluY2x1ZGUgUEFMY29kZSBvcGNvZGVzXG4iKSwKKwlzdHJlYW0pOworI2lmZGVmIE9CSl9FVkFYCisgIGZwdXRzIChfKCJcCitWTVMgb3B0aW9uczpcblwKKy0rCQkJaGFzaCBlbmNvZGUgKGRvbid0IHRydW5jYXRlKSBuYW1lcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzXG5cCistSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIpLAorCXN0cmVhbSk7CisjZW5kaWYKK30KKworLyogRGVjaWRlIGZyb20gd2hhdCBwb2ludCBhIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8sCisgICByZWxhdGl2ZSB0byB0aGUgcGMtcmVsYXRpdmUgZml4dXAuICBFciwgcmVsYXRpdmVseSBzcGVha2luZy4gICovCisKK2xvbmcKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHZhbHVlVCBhZGRyID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgorICAgICAgcmV0dXJuIGFkZHI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmaXhQLT5meF9zaXplICsgYWRkcjsKKyAgICB9Cit9CisKKy8qIEF0dGVtcHQgdG8gc2ltcGxpZnkgb3IgZXZlbiBlbGltaW5hdGUgYSBmaXh1cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMKKyAgIGlnbm9yZWQ7IHBlcmhhcHMgaXQgd2FzIG9uY2UgbWVhbmluZ2Z1bCwgYnV0IG5vdyBpdCBpcyBoaXN0b3JpY2FsLgorICAgVG8gaW5kaWNhdGUgdGhhdCBhIGZpeHVwIGhhcyBiZWVuIGVsaW1pbmF0ZWQsIHNldCBmaXhQLT5meF9kb25lLgorCisgICBGb3IgRUxGLCBoZXJlIGl0IGlzIHRoYXQgd2UgdHJhbnNmb3JtIHRoZSBHUERJU1BfSEkxNiByZWxvYyB3ZSB1c2VkCisgICBpbnRlcm5hbGx5IGludG8gdGhlIEdQRElTUCByZWxvYyB1c2VkIGV4dGVybmFsbHkuICBXZSBoYWQgdG8gZG8KKyAgIHRoaXMgc28gdGhhdCB3ZSdkIGhhdmUgdGhlIEdQRElTUF9MTzE2IHJlbG9jIGFzIGEgdGFnIHRvIGNvbXB1dGUKKyAgIHRoZSBkaXN0YW5jZSB0byB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZm9yIHNldHRpbmcgdGhlIGFkZGVuZCB0bworICAgR1BESVNQLiAgKi8KKworaW50CittZF9hcHBseV9maXggKGZpeFAsIHZhbHVlUCkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgdmFsdWVUICp2YWx1ZVA7Cit7CisgIGNoYXIgKiBjb25zdCBmaXhwb3MgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7CisgIHZhbHVlVCB2YWx1ZSA9ICp2YWx1ZVA7CisgIHVuc2lnbmVkIGltYWdlLCBzaXplOworCisgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQorICAgIHsKKyAgICAgIC8qIFRoZSBHUERJU1AgcmVsb2NhdGlvbnMgYXJlIHByb2Nlc3NlZCBpbnRlcm5hbGx5IHdpdGggYSBzeW1ib2wKKwkgcmVmZXJyaW5nIHRvIHRoZSBjdXJyZW50IGZ1bmN0aW9uOyB3ZSBuZWVkIHRvIGRyb3AgaW4gYSB2YWx1ZQorCSB3aGljaCwgd2hlbiBhZGRlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLAorCSBnaXZlcyB0aGUgZGVzaXJlZCBHUC4gICovCisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6CisgICAgICB7CisJZml4UyAqbmV4dCA9IGZpeFAtPmZ4X25leHQ7CisJYXNzZXJ0IChuZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2KTsKKworCWZpeFAtPmZ4X29mZnNldCA9IChuZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzICsgbmV4dC0+Znhfd2hlcmUKKwkJCSAgIC0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIGZpeFAtPmZ4X3doZXJlKTsKKworCXZhbHVlID0gKHZhbHVlIC0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKSkgPj4gMTY7CisgICAgICB9CisjaWZkZWYgT0JKX0VMRgorICAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUDsKKyNlbmRpZgorICAgICAgZ290byBkb19yZWxvY19ncDsKKworICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgorICAgICAgdmFsdWUgPSBzaWduX2V4dGVuZF8xNiAodmFsdWUpOworICAgICAgZml4UC0+Znhfb2Zmc2V0ID0gMDsKKyNpZmRlZiBPQkpfRUxGCisgICAgICBmaXhQLT5meF9kb25lID0gMTsKKyNlbmRpZgorCisgICAgZG9fcmVsb2NfZ3A6CisgICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DXzE2OgorICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQorCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKKyAgICAgIHNpemUgPSAyOworICAgICAgZ290byBkb19yZWxvY194eDsKKyAgICBjYXNlIEJGRF9SRUxPQ18zMjoKKyAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKKwlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7CisgICAgICBzaXplID0gNDsKKyAgICAgIGdvdG8gZG9fcmVsb2NfeHg7CisgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CisgICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCisJZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzY0X1BDUkVMOworICAgICAgc2l6ZSA9IDg7CisgICAgZG9fcmVsb2NfeHg6CisgICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgc2l6ZSk7CisJICBnb3RvIGRvbmU7CisJfQorICAgICAgcmV0dXJuIDE7CisKKyNpZmRlZiBPQkpfRUNPRkYKKyAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgorICAgICAgYXNzZXJ0IChmaXhQLT5meF9zdWJzeSA9PSBhbHBoYV9ncF9zeW1ib2wpOworICAgICAgZml4UC0+Znhfc3Vic3kgPSAwOworICAgICAgLyogRklYTUU6IGluaGVyaXRlZCB0aGlzIG9ibGl2aW91c25lc3Mgb2YgYHZhbHVlJyAtLSB3aHk/ICovCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgLWFscGhhX2dwX3ZhbHVlLCA0KTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgT0JKX0VMRgorICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6CisgICAgICByZXR1cm4gMTsKKyNlbmRpZgorCisgICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6CisgICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQorCXsKKwkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOworCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgxRkZGRkYpIHwgKCh2YWx1ZSA+PiAyKSAmIDB4MUZGRkZGKTsKKwkgIGdvdG8gd3JpdGVfZG9uZTsKKwl9CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6CisgICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMCAmJiBmaXhQLT5meF9hZGRzeSA9PSAwKQorCXsKKwkgIGltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOworCSAgaW1hZ2UgPSAoaW1hZ2UgJiB+MHgzRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDNGRkYpOworCSAgZ290byB3cml0ZV9kb25lOworCX0KKyAgICAgIHJldHVybiAxOworCisjaWZkZWYgT0JKX0VDT0ZGCisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoZml4cG9zLCB2YWx1ZSwgMik7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKKyAgICAgIHJldHVybiAxOworI2VuZGlmCisjaWZkZWYgT0JKX0VMRgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKKyAgICAgIHJldHVybiAxOworI2VuZGlmCisjaWZkZWYgT0JKX0VWQVgKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgorICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICB7CisJY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7CisKKwlpZiAoKGludClmaXhQLT5meF9yX3R5cGUgPj0gMCkKKwkgIGFzX2ZhdGFsIChfKCJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCisJCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7CisKKwlhc3NlcnQgKC0oaW50KWZpeFAtPmZ4X3JfdHlwZSA8IGFscGhhX251bV9vcGVyYW5kcyk7CisJb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1stKGludClmaXhQLT5meF9yX3R5cGVdOworCisJLyogVGhlIHJlc3Qgb2YgdGhlc2UgZml4dXBzIG9ubHkgZXhpc3QgaW50ZXJuYWxseSBkdXJpbmcgc3ltYm9sCisJICAgcmVzb2x1dGlvbiBhbmQgaGF2ZSBubyByZXByZXNlbnRhdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuCisJICAgVGhlcmVmb3JlIHRoZXkgbXVzdCBiZSBjb21wbGV0ZWx5IHJlc29sdmVkIGFzIGNvbnN0YW50cy4gICovCisKKwlpZiAoZml4UC0+ZnhfYWRkc3kgIT0gMAorCSAgICAmJiBmaXhQLT5meF9hZGRzeS0+YnN5bS0+c2VjdGlvbiAhPSBhYnNvbHV0ZV9zZWN0aW9uKQorCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJXygibm9uLWFic29sdXRlIGV4cHJlc3Npb24gaW4gY29uc3RhbnQgZmllbGQiKSk7CisKKwlpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKKwlpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCAob2Zmc2V0VCl2YWx1ZSwKKwkJCSAgICAgICBmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lKTsKKyAgICAgIH0KKyAgICAgIGdvdG8gd3JpdGVfZG9uZTsKKyAgICB9CisKKyAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IDAgfHwgZml4UC0+ZnhfcGNyZWwgIT0gMCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGFzX3dhcm5fd2hlcmUoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJICAgIF8oInR5cGUgJWQgcmVsb2MgZG9uZT9cbiIpLCAoaW50KWZpeFAtPmZ4X3JfdHlwZSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCit3cml0ZV9kb25lOgorICBtZF9udW1iZXJfdG9fY2hhcnMoZml4cG9zLCBpbWFnZSwgNCk7CisKK2RvbmU6CisgIGZpeFAtPmZ4X2RvbmUgPSAxOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIExvb2sgZm9yIGEgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgZ2l2ZW4gc3ltYm9sLgorICovCisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBpZiAoKm5hbWUgPT0gJyQnKQorICAgIHsKKyAgICAgIGludCBpc19mbG9hdCA9IDAsIG51bTsKKworICAgICAgc3dpdGNoICgqKytuYW1lKQorCXsKKwljYXNlICdmJzoKKwkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCisJICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX0ZQXTsKKwkgIGlzX2Zsb2F0ID0gMzI7CisJICAvKiBGQUxMVEhSVSAqLworCisJY2FzZSAncic6CisJICBpZiAoIWlzZGlnaXQoKisrbmFtZSkpCisJICAgIGJyZWFrOworCSAgLyogRkFMTFRIUlUgKi8KKworCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJICBpZiAobmFtZVsxXSA9PSAnXDAnKQorCSAgICBudW0gPSBuYW1lWzBdIC0gJzAnOworCSAgZWxzZSBpZiAobmFtZVswXSAhPSAnMCcgJiYgaXNkaWdpdChuYW1lWzFdKSAmJiBuYW1lWzJdID09ICdcMCcpCisJICAgIHsKKwkgICAgICBudW0gPSAobmFtZVswXSAtICcwJykgKiAxMCArIG5hbWVbMV0gLSAnMCc7CisJICAgICAgaWYgKG51bSA+PSAzMikKKwkJYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisKKwkgIGlmICghYWxwaGFfbm9hdF9vbiAmJiBudW0gPT0gQVhQX1JFR19BVCkKKwkgICAgYXNfd2FybihfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7CisJICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbbnVtICsgaXNfZmxvYXRdOworCisJY2FzZSAnYSc6CisJICBpZiAobmFtZVsxXSA9PSAndCcgJiYgbmFtZVsyXSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKCFhbHBoYV9ub2F0X29uKQorCQlhc193YXJuKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKKwkgICAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbQVhQX1JFR19BVF07CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnZyc6CisJICBpZiAobmFtZVsxXSA9PSAncCcgJiYgbmFtZVsyXSA9PSAnXDAnKQorCSAgICByZXR1cm4gYWxwaGFfcmVnaXN0ZXJfdGFibGVbYWxwaGFfZ3BfcmVnaXN0ZXJdOworCSAgYnJlYWs7CisKKwljYXNlICdzJzoKKwkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCisJICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX1NQXTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisjaWZkZWYgT0JKX0VDT0ZGCisvKiBAQEAgTWFnaWMgRUNPRkYgYml0cy4gICovCisKK3ZvaWQKK2FscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKQoreworICBzZWxlY3RfZ3BfdmFsdWUgKCk7CisgIC8qICR6ZXJvIGFuZCAkZjMxIGFyZSByZWFkLW9ubHkgKi8KKyAgYWxwaGFfZ3BybWFzayAmPSB+MTsKKyAgYWxwaGFfZnBybWFzayAmPSB+MTsKK30KKyNlbmRpZgorCisvKiBIb29rIHRvIHJlbWVtYmVyIGEgcmVjZW50bHkgZGVmaW5lZCBsYWJlbCBzbyB0aGF0IHRoZSBhdXRvLWFsaWduCisgICBjb2RlIGNhbiBhZGp1c3QgdGhlIHN5bWJvbCBhZnRlciB3ZSBrbm93IHdoYXQgYWxpZ25tZW50IHdpbGwgYmUKKyAgIHJlcXVpcmVkLiAgKi8KKwordm9pZAorYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgYWxwaGFfaW5zbl9sYWJlbCA9IHN5bTsKK30KKworLyogUmV0dXJuIHRydWUgaWYgd2UgbXVzdCBhbHdheXMgZW1pdCBhIHJlbG9jIGZvciBhIHR5cGUgYW5kIGZhbHNlIGlmCisgICB0aGVyZSBpcyBzb21lIGhvcGUgb2YgcmVzb2x2aW5nIGl0IGEgYXNzZW1ibHkgdGltZS4gICovCisKK2ludAorYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoZikKKyAgICAgZml4UyAqZjsKK3sKKyAgaWYgKGFscGhhX2ZsYWdfcmVsYXgpCisgICAgcmV0dXJuIDE7CisKKyAgc3dpdGNoIChmLT5meF9yX3R5cGUpCisgICAgeworICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKKyNpZmRlZiBPQkpfRUNPRkYKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgorI2VuZGlmCisjaWZkZWYgT0JKX0VMRgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgorI2VuZGlmCisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOgorICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6CisjaWZkZWYgT0JKX0VWQVgKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgorI2VuZGlmCisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgorICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgIGNhc2UgQkZEX1JFTE9DXzY0OgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6CisgICAgICByZXR1cm4gMDsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoKGludClmLT5meF9yX3R5cGUgPCAwICYmIC0oaW50KWYtPmZ4X3JfdHlwZSA8IGFscGhhX251bV9vcGVyYW5kcyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJ0aWFsbHkgcmVzb2x2ZSBhIHJlbG9jYXRpb24gbm93LiAgKi8KKworaW50CithbHBoYV9maXhfYWRqdXN0YWJsZSAoZikKKyAgICAgZml4UyAqZjsKK3sKKyNpZmRlZiBPQkpfRUxGCisgIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzICovCisgIGlmIChTX0lTX0VYVEVSTiAoZi0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZi0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworI2VuZGlmCisKKyAgLyogQXJlIHRoZXJlIGFueSByZWxvY2F0aW9uIHR5cGVzIGZvciB3aGljaCB3ZSBtdXN0IGdlbmVyYXRlIGEgcmVsb2MKKyAgICAgYnV0IHdlIGNhbiBhZGp1c3QgdGhlIHZhbHVlcyBjb250YWluZWQgd2l0aGluIGl0PyAgKi8KKyAgc3dpdGNoIChmLT5meF9yX3R5cGUpCisgICAgeworICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgorICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKKyAgICAgIHJldHVybiAwOworCisjaWZkZWYgT0JKX0VDT0ZGCisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKKyNlbmRpZgorI2lmZGVmIE9CSl9FVkFYCisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoKKyNlbmRpZgorICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfNjQ6CisgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKKyAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCAoKGludClmLT5meF9yX3R5cGUgPCAwCisJICAgICAgJiYgLSAoaW50KWYtPmZ4X3JfdHlwZSA8IGFscGhhX251bV9vcGVyYW5kcyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIC8qTk9UUkVBQ0hFRCovCit9CisKKy8qIEdlbmVyYXRlIHRoZSBCRkQgcmVsb2MgdG8gYmUgc3R1Y2sgaW4gdGhlIG9iamVjdCBmaWxlIGZyb20gdGhlCisgICBmaXh1cCB1c2VkIGludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlci4gICovCisKK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApCisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGFyZWxlbnQgKnJlbG9jOworCisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKyAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisKKyAgLyogTWFrZSBzdXJlIG5vbmUgb2Ygb3VyIGludGVybmFsIHJlbG9jYXRpb25zIG1ha2UgaXQgdGhpcyBmYXIuCisgICAgIFRoZXknZCBiZXR0ZXIgaGF2ZSBiZWVuIGZ1bGx5IHJlc29sdmVkIGJ5IHRoaXMgcG9pbnQuICAqLworICBhc3NlcnQgKChpbnQpZml4cC0+Znhfcl90eXBlID4gMCk7CisKKyAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7CisgIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCSAgICBfKCJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIpLAorCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICghZml4cC0+ZnhfcGNyZWwgIT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpCisgICAgeworICAgICAgYXNfZmF0YWwgKF8oImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIiksCisJCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpKTsKKyAgICB9CisgIGFzc2VydCAoIWZpeHAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKKworI2lmZGVmIE9CSl9FQ09GRgorICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMKQorICAgIHsKKyAgICAgIC8qIGZha2Ugb3V0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uIHNpZ2ggKi8KKyAgICAgIHJlbG9jLT5hZGRlbmQgPSAtYWxwaGFfZ3BfdmFsdWU7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworI2lmZGVmIE9CSl9FTEYKKyAgICAgIC8qCisgICAgICAgKiBPaGhoLCB0aGlzIGlzIHVnbHkuICBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoaXMgaXMgYSBsb2NhbCBnbG9iYWwKKyAgICAgICAqIHN5bWJvbCwgdGhlIHJlbG9jYXRpb24gd2lsbCBlbnRpcmVseSBiZSBwZXJmb3JtZWQgYXQgbGluayB0aW1lLCBub3QKKyAgICAgICAqIGF0IGFzc2VtYmx5IHRpbWUuICBiZmRfcGVyZm9ybV9yZWxvYyBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBzb3J0CisgICAgICAgKiBvZiB0aGluZywgYW5kIGFzIGEgcmVzdWx0IHdlIG5lZWQgdG8gZmFrZSBpdCBvdXQgaGVyZS4KKyAgICAgICAqLworICAgICAgaWYgKChTX0lTX0VYVEVSTiAoZml4cC0+ZnhfYWRkc3kpIHx8IFNfSVNfV0VBSyAoZml4cC0+ZnhfYWRkc3kpKQorCSAgJiYgIVNfSVNfQ09NTU9OKGZpeHAtPmZ4X2FkZHN5KSkKKwlyZWxvYy0+YWRkZW5kIC09IGZpeHAtPmZ4X2FkZHN5LT5ic3ltLT52YWx1ZTsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gcmVsb2M7Cit9CisKKy8qIFBhcnNlIGEgcmVnaXN0ZXIgbmFtZSBvZmYgb2YgdGhlIGlucHV0X2xpbmUgYW5kIHJldHVybiBhIHJlZ2lzdGVyCisgICBudW1iZXIuICBHZXRzIG1kX3VuZGVmaW5lZF9zeW1ib2wgYWJvdmUgdG8gZG8gdGhlIHJlZ2lzdGVyIG5hbWUKKyAgIG1hdGNoaW5nIGZvciB1cy4KKworICAgT25seSBjYWxsZWQgYXMgYSBwYXJ0IG9mIHByb2Nlc3NpbmcgdGhlIEVDT0ZGIC5mcmFtZSBkaXJlY3RpdmUuICAqLworCitpbnQKK3RjX2dldF9yZWdpc3RlciAoZnJhbWUpCisgICAgIGludCBmcmFtZTsKK3sKKyAgaW50IGZyYW1lcmVnID0gQVhQX1JFR19TUDsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICckJykKKyAgICB7CisgICAgICBjaGFyICpzID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICBzeW1ib2xTICpzeW0gPSBtZF91bmRlZmluZWRfc3ltYm9sIChzKTsKKworICAgICAgKnN0cmNocihzLCAnXDAnKSA9IGM7CisgICAgICBpZiAoc3ltICYmIChmcmFtZXJlZyA9IFNfR0VUX1ZBTFVFIChzeW0pKSA8PSAzMSkKKwlnb3RvIGZvdW5kOworICAgIH0KKyAgYXNfd2FybiAoXygiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIiksIGZyYW1lcmVnKTsKKworZm91bmQ6CisgIG5vdGVfZ3ByZWcgKGZyYW1lcmVnKTsKKyAgcmV0dXJuIGZyYW1lcmVnOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBwcm9jZXNzZWQuICBJbiBvcmRlciB0bworICAgd29yayB3aXRoIGdjYyB3aGVuIHVzaW5nIG1pcHMtdGZpbGUsIHdlIG11c3Qga2VlcCBhbGwgbG9jYWwgbGFiZWxzLgorICAgSG93ZXZlciwgaW4gb3RoZXIgY2FzZXMsIHdlIHdhbnQgdG8gZGlzY2FyZCB0aGVtLiAgSWYgd2Ugd2VyZQorICAgY2FsbGVkIHdpdGggLWcsIGJ1dCB3ZSBkaWRuJ3Qgc2VlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGl0IG1heQorICAgbWVhbiB0aGF0IGdjYyBpcyBzbXVnZ2xpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRocm91Z2ggdG8KKyAgIG1pcHMtdGZpbGUsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBnZW5lcmF0ZSBhbGwgbG9jYWwgbGFiZWxzLiAgKi8KKworI2lmZGVmIE9CSl9FQ09GRgorCit2b2lkCithbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQoreworICBpZiAoYWxwaGFfZGVidWcgIT0gMAorICAgICAgJiYgISBlY29mZl9kZWJ1Z2dpbmdfc2VlbikKKyAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKK30KKworI2VuZGlmIC8qIE9CSl9FQ09GRiAqLworDAorLyogUGFyc2UgdGhlIGFyZ3VtZW50cyB0byBhbiBvcGNvZGUuICAqLworCitzdGF0aWMgaW50Cit0b2tlbml6ZV9hcmd1bWVudHMgKHN0ciwgdG9rLCBudG9rKQorICAgICBjaGFyICpzdHI7CisgICAgIGV4cHJlc3Npb25TIHRva1tdOworICAgICBpbnQgbnRvazsKK3sKKyAgZXhwcmVzc2lvblMgKmVuZF90b2sgPSB0b2sgKyBudG9rOworICBjaGFyICpvbGRfaW5wdXRfbGluZV9wb2ludGVyOworICBpbnQgc2F3X2NvbW1hID0gMCwgc2F3X2FyZyA9IDA7CisKKyAgbWVtc2V0ICh0b2ssIDAsIHNpemVvZiAoKnRvaykgKiBudG9rKTsKKworICAvKiBTYXZlIGFuZCByZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciBhcm91bmQgdGhpcyBmdW5jdGlvbiAqLworICBvbGRfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7CisKKyAgd2hpbGUgKHRvayA8IGVuZF90b2sgJiYgKmlucHV0X2xpbmVfcG9pbnRlcikKKyAgICB7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCisJeworCWNhc2UgJ1wwJzoKKwkgIGdvdG8gZmluaTsKKworCWNhc2UgJywnOgorCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICBpZiAoc2F3X2NvbW1hIHx8ICFzYXdfYXJnKQorCSAgICBnb3RvIGVycjsKKwkgIHNhd19jb21tYSA9IDE7CisJICBicmVhazsKKworCWNhc2UgJygnOgorCSAgeworCSAgICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyKys7CisKKwkgICAgLyogRmlyc3QgdHJ5IGZvciBwYXJlbnRoZXNpemVkIHJlZ2lzdGVyIC4uLiAqLworCSAgICBleHByZXNzaW9uICh0b2spOworCSAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKScgJiYgdG9rLT5YX29wID09IE9fcmVnaXN0ZXIpCisJICAgICAgeworCQl0b2stPlhfb3AgPSAoc2F3X2NvbW1hID8gT19jcHJlZ2lzdGVyIDogT19wcmVnaXN0ZXIpOworCQlzYXdfY29tbWEgPSAwOworCQlzYXdfYXJnID0gMTsKKwkJKytpbnB1dF9saW5lX3BvaW50ZXI7CisJCSsrdG9rOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgLyogLi4uIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHBsYWluIGV4cHJlc3Npb24gKi8KKwkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkgIH0KKworCWRlZmF1bHQ6CisJICBpZiAoc2F3X2FyZyAmJiAhc2F3X2NvbW1hKQorCSAgICBnb3RvIGVycjsKKwkgIGV4cHJlc3Npb24gKHRvayk7CisJICBpZiAodG9rLT5YX29wID09IE9faWxsZWdhbCB8fCB0b2stPlhfb3AgPT0gT19hYnNlbnQpCisJICAgIGdvdG8gZXJyOworCisJICBzYXdfY29tbWEgPSAwOworCSAgc2F3X2FyZyA9IDE7CisJICArK3RvazsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKK2Zpbmk6CisgIGlmIChzYXdfY29tbWEpCisgICAgZ290byBlcnI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7CisgIHJldHVybiBudG9rIC0gKGVuZF90b2sgLSB0b2spOworCitlcnI6CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZF9pbnB1dF9saW5lX3BvaW50ZXI7CisgIHJldHVybiAtMTsKK30KKworLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBhbGwgdmFyaWFudHMgb2YgYW4gb3Bjb2RlIGxvb2tpbmcgZm9yIGEKKyAgIHN5bnRheCBtYXRjaC4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICoKK2ZpbmRfb3Bjb2RlX21hdGNoKGZpcnN0X29wY29kZSwgdG9rLCBwbnRvaywgcGNwdW1hdGNoKQorICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaXJzdF9vcGNvZGU7CisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCAqcG50b2s7CisgICAgIGludCAqcGNwdW1hdGNoOworeworICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGUgPSBmaXJzdF9vcGNvZGU7CisgIGludCBudG9rID0gKnBudG9rOworICBpbnQgZ290X2NwdV9tYXRjaCA9IDA7CisKKyAgZG8KKyAgICB7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGlkeDsKKyAgICAgIGludCB0b2tpZHggPSAwOworCisgICAgICAvKiBEb24ndCBtYXRjaCBvcGNvZGVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBhcmNoaXRlY3R1cmUgKi8KKyAgICAgIGlmICghKG9wY29kZS0+ZmxhZ3MgJiBhbHBoYV90YXJnZXQpKQorCWdvdG8gbWF0Y2hfZmFpbGVkOworCisgICAgICBnb3RfY3B1X21hdGNoID0gMTsKKworICAgICAgZm9yIChvcGlkeCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGlkeDsgKytvcGlkeCkKKwl7CisJICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqb3BpZHhdOworCisJICAvKiBvbmx5IHRha2UgaW5wdXQgZnJvbSByZWFsIG9wZXJhbmRzICovCisJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKQorCSAgICBjb250aW51ZTsKKworCSAgLyogd2hlbiB3ZSBleHBlY3QgaW5wdXQsIG1ha2Ugc3VyZSB3ZSBoYXZlIGl0ICovCisJICBpZiAodG9raWR4ID49IG50b2spCisJICAgIHsKKwkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSykgPT0gMCkKKwkJZ290byBtYXRjaF9mYWlsZWQ7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogbWF0Y2ggb3BlcmFuZCB0eXBlIHdpdGggZXhwcmVzc2lvbiB0eXBlICovCisJICBzd2l0Y2ggKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfVFlQRUNIRUNLX01BU0spCisJICAgIHsKKwkgICAgY2FzZSBBWFBfT1BFUkFORF9JUjoKKwkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCisJCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQorCQlnb3RvIG1hdGNoX2ZhaWxlZDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBWFBfT1BFUkFORF9GUFI6CisJICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgorCQkgIHx8ICFpc19mcHJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCisJCWdvdG8gbWF0Y2hfZmFpbGVkOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOUzoKKwkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX3ByZWdpc3RlcgorCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKKwkJZ290byBtYXRjaF9mYWlsZWQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BOgorCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fY3ByZWdpc3RlcgorCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKKwkJZ290byBtYXRjaF9mYWlsZWQ7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBWFBfT1BFUkFORF9SRUxBVElWRToKKwkgICAgY2FzZSBBWFBfT1BFUkFORF9TSUdORUQ6CisJICAgIGNhc2UgQVhQX09QRVJBTkRfVU5TSUdORUQ6CisJICAgICAgc3dpdGNoICh0b2tbdG9raWR4XS5YX29wKQorCQl7CisJCWNhc2UgT19pbGxlZ2FsOgorCQljYXNlIE9fYWJzZW50OgorCQljYXNlIE9fcmVnaXN0ZXI6CisJCWNhc2UgT19wcmVnaXN0ZXI6CisJCWNhc2UgT19jcHJlZ2lzdGVyOgorCQkgIGdvdG8gbWF0Y2hfZmFpbGVkOworCisJCWRlZmF1bHQ6CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgaGF2ZSBiZWVuIGZha2UgKi8KKwkgICAgICBhYm9ydCgpOworCSAgICB9CisJICArK3Rva2lkeDsKKwl9CisKKyAgICAgIC8qIHBvc3NpYmxlIG1hdGNoIC0tIGRpZCB3ZSB1c2UgYWxsIG9mIG91ciBpbnB1dD8gKi8KKyAgICAgIGlmICh0b2tpZHggPT0gbnRvaykKKwl7CisJICAqcG50b2sgPSBudG9rOworCSAgcmV0dXJuIG9wY29kZTsKKwl9CisKKyAgICBtYXRjaF9mYWlsZWQ6OworICAgIH0KKyAgd2hpbGUgKCsrb3Bjb2RlLWFscGhhX29wY29kZXMgPCBhbHBoYV9udW1fb3Bjb2RlcworCSAmJiAhc3RyY21wKG9wY29kZS0+bmFtZSwgZmlyc3Rfb3Bjb2RlLT5uYW1lKSk7CisKKyAgaWYgKCpwY3B1bWF0Y2gpCisgICAgICAqcGNwdW1hdGNoID0gZ290X2NwdV9tYXRjaDsKKworICByZXR1cm4gTlVMTDsKK30KKworLyogU2VhcmNoIGZvcndhcmQgdGhyb3VnaCBhbGwgdmFyaWFudHMgb2YgYSBtYWNybyBsb29raW5nIGZvciBhIHN5bnRheAorICAgbWF0Y2guICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICoKK2ZpbmRfbWFjcm9fbWF0Y2goZmlyc3RfbWFjcm8sIHRvaywgcG50b2spCisgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmlyc3RfbWFjcm87CisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCAqcG50b2s7Cit7CisgIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm8gPSBmaXJzdF9tYWNybzsKKyAgaW50IG50b2sgPSAqcG50b2s7CisKKyAgZG8KKyAgICB7CisgICAgICBjb25zdCBlbnVtIGFscGhhX21hY3JvX2FyZyAqYXJnID0gbWFjcm8tPmFyZ3NldHM7CisgICAgICBpbnQgdG9raWR4ID0gMDsKKworICAgICAgd2hpbGUgKCphcmcpCisJeworCSAgc3dpdGNoICgqYXJnKQorCSAgICB7CisJICAgIGNhc2UgTUFDUk9fRU9BOgorCSAgICAgIGlmICh0b2tpZHggPT0gbnRvaykKKwkJcmV0dXJuIG1hY3JvOworCSAgICAgIGVsc2UKKwkJdG9raWR4ID0gMDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE1BQ1JPX0lSOgorCSAgICAgIGlmICh0b2tpZHggPj0gbnRvayB8fCB0b2tbdG9raWR4XS5YX29wICE9IE9fcmVnaXN0ZXIKKwkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCisJCWdvdG8gbWF0Y2hfZmFpbGVkOworCSAgICAgICsrdG9raWR4OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE1BQ1JPX1BJUjoKKwkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3ByZWdpc3RlcgorCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKKwkJZ290byBtYXRjaF9mYWlsZWQ7CisJICAgICAgKyt0b2tpZHg7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTUFDUk9fQ1BJUjoKKwkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX2NwcmVnaXN0ZXIKKwkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCisJCWdvdG8gbWF0Y2hfZmFpbGVkOworCSAgICAgICsrdG9raWR4OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE1BQ1JPX0ZQUjoKKwkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCisJCSAgfHwgIWlzX2Zwcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKKwkJZ290byBtYXRjaF9mYWlsZWQ7CisJICAgICAgKyt0b2tpZHg7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBNQUNST19FWFA6CisJICAgICAgaWYgKHRva2lkeCA+PSBudG9rKQorCQlnb3RvIG1hdGNoX2ZhaWxlZDsKKwkgICAgICBzd2l0Y2ggKHRva1t0b2tpZHhdLlhfb3ApCisJCXsKKwkJY2FzZSBPX2lsbGVnYWw6CisJCWNhc2UgT19hYnNlbnQ6CisJCWNhc2UgT19yZWdpc3RlcjoKKwkJY2FzZSBPX3ByZWdpc3RlcjoKKwkJY2FzZSBPX2NwcmVnaXN0ZXI6CisJCSAgZ290byBtYXRjaF9mYWlsZWQ7CisKKwkJZGVmYXVsdDoKKwkJICBicmVhazsKKwkJfQorCSAgICAgICsrdG9raWR4OworCSAgICAgIGJyZWFrOworCisJICAgIG1hdGNoX2ZhaWxlZDoKKwkgICAgICB3aGlsZSAoKmFyZyAhPSBNQUNST19FT0EpCisJCSsrYXJnOworCSAgICAgIHRva2lkeCA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrYXJnOworCX0KKyAgICB9CisgIHdoaWxlICgrK21hY3JvLWFscGhhX21hY3JvcyA8IGFscGhhX251bV9tYWNyb3MKKwkgJiYgIXN0cmNtcChtYWNyby0+bmFtZSwgZmlyc3RfbWFjcm8tPm5hbWUpKTsKKworICByZXR1cm4gTlVMTDsKK30KKworLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZAoraW5zZXJ0X29wZXJhbmQoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lKQorICAgICB1bnNpZ25lZCBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgb2Zmc2V0VCB2YWw7CisgICAgIGNoYXIgKmZpbGU7CisgICAgIHVuc2lnbmVkIGxpbmU7Cit7CisgIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyICYmICEob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9OT09WRVJGTE9XKSkKKyAgICB7CisgICAgICBvZmZzZXRUIG1pbiwgbWF4OworCisgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpCisJeworCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOworCSAgbWluID0gLSgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7CisJICBtaW4gPSAwOworCX0KKworICAgICAgaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpCisJeworCSAgY29uc3QgY2hhciAqZXJyID0KKwkgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVkIGFuZCAlZCkiKTsKKwkgIGNoYXIgYnVmW3NpemVvZiAodmFsKSAqIDMgKyAyXTsKKworCSAgc3ByaW50X3ZhbHVlKGJ1ZiwgdmFsKTsKKwkgIGlmIChmaWxlKQorCSAgICBhc193YXJuX3doZXJlKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7CisJICBlbHNlCisJICAgIGFzX3dhcm4oZXJyLCBidWYsIG1pbiwgbWF4KTsKKwl9CisgICAgfQorCisgIGlmIChvcGVyYW5kLT5pbnNlcnQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKKworICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgdmFsLCAmZXJybXNnKTsKKyAgICAgIGlmIChlcnJtc2cpCisJYXNfd2FybiAoZXJybXNnKTsKKyAgICB9CisgIGVsc2UKKyAgICBpbnNuIHw9ICgodmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0KTsKKworICByZXR1cm4gaW5zbjsKK30KKworLyoKKyAqIFR1cm4gYW4gb3Bjb2RlIGRlc2NyaXB0aW9uIGFuZCBhIHNldCBvZiBhcmd1bWVudHMgaW50bworICogYW4gaW5zdHJ1Y3Rpb24gYW5kIGEgZml4dXAuCisgKi8KKworc3RhdGljIHZvaWQKK2Fzc2VtYmxlX2luc24ob3Bjb2RlLCB0b2ssIG50b2ssIGluc24pCisgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZTsKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOworeworICBjb25zdCB1bnNpZ25lZCBjaGFyICphcmdpZHg7CisgIHVuc2lnbmVkIGltYWdlOworICBpbnQgdG9raWR4ID0gMDsKKworICBtZW1zZXQgKGluc24sIDAsIHNpemVvZiAoKmluc24pKTsKKyAgaW1hZ2UgPSBvcGNvZGUtPm9wY29kZTsKKworICBmb3IgKGFyZ2lkeCA9IG9wY29kZS0+b3BlcmFuZHM7ICphcmdpZHg7ICsrYXJnaWR4KQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWyphcmdpZHhdOworICAgICAgY29uc3QgZXhwcmVzc2lvblMgKnQ7CisKKyAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0ZBS0UpCisJeworCSAgLyogZmFrZSBvcGVyYW5kcyB0YWtlIG5vIHZhbHVlIGFuZCBnZW5lcmF0ZSBubyBmaXh1cCAqLworCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgMCwgTlVMTCwgMCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICh0b2tpZHggPj0gbnRvaykKKwl7CisJICBzd2l0Y2ggKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfT1BUSU9OQUxfTUFTSykKKwkgICAgeworCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1Q6CisJICAgICAgdCA9ICZ0b2tbMF07CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQ6CisJICAgICAgdCA9ICZ0b2tbMV07CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVhQX09QRVJBTkRfREVGQVVMVF9aRVJPOgorCSAgICAgIHsKKwkJc3RhdGljIGNvbnN0IGV4cHJlc3Npb25TIHplcm9fZXhwID0geyAwLCAwLCAwLCBPX2NvbnN0YW50LCAxIH07CisJCXQgPSAmemVyb19leHA7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJdCA9ICZ0b2tbdG9raWR4KytdOworCisgICAgICBzd2l0Y2ggKHQtPlhfb3ApCisJeworCWNhc2UgT19yZWdpc3RlcjoKKwljYXNlIE9fcHJlZ2lzdGVyOgorCWNhc2UgT19jcHJlZ2lzdGVyOgorCSAgaW1hZ2UgPSBpbnNlcnRfb3BlcmFuZChpbWFnZSwgb3BlcmFuZCwgcmVnbm8odC0+WF9hZGRfbnVtYmVyKSwKKwkJCQkgTlVMTCwgMCk7CisJICBicmVhazsKKworCWNhc2UgT19jb25zdGFudDoKKwkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIHQtPlhfYWRkX251bWJlciwgTlVMTCwgMCk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB7CisJICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXA7CisKKwkgICAgaWYgKGluc24tPm5maXh1cHMgPj0gTUFYX0lOU05fRklYVVBTKQorCSAgICAgIGFzX2ZhdGFsKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKKworCSAgICBmaXh1cCA9ICZpbnNuLT5maXh1cHNbaW5zbi0+bmZpeHVwcysrXTsKKworCSAgICBmaXh1cC0+ZXhwID0gKnQ7CisJICAgIGZpeHVwLT5yZWxvYyA9IG9wZXJhbmQtPmRlZmF1bHRfcmVsb2M7CisJICB9CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGluc24tPmluc24gPSBpbWFnZTsKK30KKworLyoKKyAqIEFjdHVhbGx5IG91dHB1dCBhbiBpbnN0cnVjdGlvbiB3aXRoIGl0cyBmaXh1cC4KKyAqLworCitzdGF0aWMgdm9pZAorZW1pdF9pbnNuIChpbnNuKQorICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOworeworICBjaGFyICpmOworICBpbnQgaTsKKworICAvKiBUYWtlIGNhcmUgb2YgYWxpZ25tZW50IGR1dGllcyAqLworICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKKyAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7CisgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKKyAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKKyAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gICovCisgIGYgPSBmcmFnX21vcmUgKDQpOworICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24tPmluc24sIDQpOworCisgIC8qIEFwcGx5IHRoZSBmaXh1cHMgaW4gb3JkZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IGluc24tPm5maXh1cHM7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgIHN0cnVjdCBhbHBoYV9maXh1cCAqZml4dXAgPSAmaW5zbi0+Zml4dXBzW2ldOworICAgICAgaW50IHNpemUsIHBjcmVsOworICAgICAgZml4UyAqZml4UDsKKworICAgICAgLyogU29tZSBmaXh1cHMgYXJlIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGFuZCBzbyBoYXZlIG5vIGhvd3RvICovCisgICAgICBpZiAoKGludClmaXh1cC0+cmVsb2MgPCAwKQorCXsKKwkgIG9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbLShpbnQpZml4dXAtPnJlbG9jXTsKKwkgIHNpemUgPSA0OworCSAgcGNyZWwgPSAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfUkVMQVRJVkUpICE9IDApOworCX0KKyNpZmRlZiBPQkpfRUxGCisgICAgICAvKiBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseS4gKi8KKyAgICAgIGVsc2UgaWYgKGZpeHVwLT5yZWxvYyA9PSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKKwkgICAgICAgfHwgZml4dXAtPnJlbG9jID09IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNikKKwl7CisJICBzaXplID0gMiwgcGNyZWwgPSAwOworCX0KKyNlbmRpZgorICAgICAgZWxzZQorCXsKKwkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvCisJICAgID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwLT5yZWxvYyk7CisJICBhc3NlcnQgKHJlbG9jX2hvd3RvKTsKKworCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOworCSAgcGNyZWwgPSByZWxvY19ob3d0by0+cGNfcmVsYXRpdmU7CisJfQorICAgICAgYXNzZXJ0IChzaXplID49IDEgJiYgc2l6ZSA8PSA0KTsKKworICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAorCQkJICAmZml4dXAtPmV4cCwgcGNyZWwsIGZpeHVwLT5yZWxvYyk7CisKKyAgICAgIC8qIFR1cm4gb2ZmIGNvbXBsYWludHMgdGhhdCB0aGUgYWRkZW5kIGlzIHRvbyBsYXJnZSBmb3Igc29tZSBmaXh1cHMgKi8KKyAgICAgIHN3aXRjaCAoZml4dXAtPnJlbG9jKQorCXsKKwljYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKKyNpZmRlZiBPQkpfRUNPRkYKKwljYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgorI2VuZGlmCisjaWZkZWYgT0JKX0VMRgorCWNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgorI2VuZGlmCisJY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKKwkgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGlmICgoaW50KWZpeHVwLT5yZWxvYyA8IDApCisJICAgIHsKKwkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9OT09WRVJGTE9XKQorCQlmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIEdpdmVuIGFuIG9wY29kZSBuYW1lIGFuZCBhIHByZS10b2tlbml6ZWQgc2V0IG9mIGFyZ3VtZW50cywgYXNzZW1ibGUKKyAgIHRoZSBpbnNuLCBidXQgZG8gbm90IGVtaXQgaXQuCisKKyAgIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgbm8gbWFjcm9zIGFsbG93ZWQsIHNpbmNlIHdlIGNhbid0IHN0b3JlIG1vcmUKKyAgIHRoYW4gb25lIGluc24gaW4gYW4gaW5zbiBzdHJ1Y3R1cmUuICAqLworCitzdGF0aWMgdm9pZAorYXNzZW1ibGVfdG9rZW5zX3RvX2luc24ob3BuYW1lLCB0b2ssIG50b2ssIGluc24pCisgICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIHN0cnVjdCBhbHBoYV9pbnNuICppbnNuOworeworICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7CisKKyAgLyogc2VhcmNoIG9wY29kZXMgKi8KKyAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKikgaGFzaF9maW5kIChhbHBoYV9vcGNvZGVfaGFzaCwgb3BuYW1lKTsKKyAgaWYgKG9wY29kZSkKKyAgICB7CisgICAgICBpbnQgY3B1bWF0Y2g7CisgICAgICBvcGNvZGUgPSBmaW5kX29wY29kZV9tYXRjaCAob3Bjb2RlLCB0b2ssICZudG9rLCAmY3B1bWF0Y2gpOworICAgICAgaWYgKG9wY29kZSkKKwl7CisJICBhc3NlbWJsZV9pbnNuIChvcGNvZGUsIHRvaywgbnRvaywgaW5zbik7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoY3B1bWF0Y2gpCisJYXNfYmFkIChfKCJpbmFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3Igb3Bjb2RlIGAlcyciKSwgb3BuYW1lKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oIm9wY29kZSBgJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHRhcmdldCAlcyIpLCBvcG5hbWUsCisJICAgICAgICBhbHBoYV90YXJnZXRfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Cit9CisKKy8qIEdpdmVuIGFuIG9wY29kZSBuYW1lIGFuZCBhIHByZS10b2tlbml6ZWQgc2V0IG9mIGFyZ3VtZW50cywgdGFrZSB0aGUKKyAgIG9wY29kZSBhbGwgdGhlIHdheSB0aHJvdWdoIGVtaXNzaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2Fzc2VtYmxlX3Rva2VucyAob3BuYW1lLCB0b2ssIG50b2ssIGxvY2FsX21hY3Jvc19vbikKKyAgICAgY29uc3QgY2hhciAqb3BuYW1lOworICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOworICAgICBpbnQgbnRvazsKKyAgICAgaW50IGxvY2FsX21hY3Jvc19vbjsKK3sKKyAgaW50IGZvdW5kX3NvbWV0aGluZyA9IDA7CisgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZTsKKyAgY29uc3Qgc3RydWN0IGFscGhhX21hY3JvICptYWNybzsKKyAgaW50IGNwdW1hdGNoID0gMTsKKworICAvKiBzZWFyY2ggbWFjcm9zICovCisgIGlmIChsb2NhbF9tYWNyb3Nfb24pCisgICAgeworICAgICAgbWFjcm8gPSAoKGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqKQorCSAgICAgICBoYXNoX2ZpbmQgKGFscGhhX21hY3JvX2hhc2gsIG9wbmFtZSkpOworICAgICAgaWYgKG1hY3JvKQorCXsKKwkgIGZvdW5kX3NvbWV0aGluZyA9IDE7CisJICBtYWNybyA9IGZpbmRfbWFjcm9fbWF0Y2ggKG1hY3JvLCB0b2ssICZudG9rKTsKKwkgIGlmIChtYWNybykKKwkgICAgeworCSAgICAgICgqbWFjcm8tPmVtaXQpICh0b2ssIG50b2ssIG1hY3JvLT5hcmcpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogc2VhcmNoIG9wY29kZXMgKi8KKyAgb3Bjb2RlID0gKGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKikgaGFzaF9maW5kIChhbHBoYV9vcGNvZGVfaGFzaCwgb3BuYW1lKTsKKyAgaWYgKG9wY29kZSkKKyAgICB7CisgICAgICBmb3VuZF9zb21ldGhpbmcgPSAxOworICAgICAgb3Bjb2RlID0gZmluZF9vcGNvZGVfbWF0Y2ggKG9wY29kZSwgdG9rLCAmbnRvaywgJmNwdW1hdGNoKTsKKyAgICAgIGlmIChvcGNvZGUpCisJeworCSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKKwkgIGFzc2VtYmxlX2luc24gKG9wY29kZSwgdG9rLCBudG9rLCAmaW5zbik7CisJICBlbWl0X2luc24gKCZpbnNuKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGlmIChmb3VuZF9zb21ldGhpbmcpCisgICAgaWYgKGNwdW1hdGNoKQorICAgICAgYXNfYmFkIChfKCJpbmFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3Igb3Bjb2RlIGAlcyciKSwgb3BuYW1lKTsKKyAgICBlbHNlCisgICAgICBhc19iYWQgKF8oIm9wY29kZSBgJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHRhcmdldCAlcyIpLCBvcG5hbWUsCisJICAgICAgYWxwaGFfdGFyZ2V0X25hbWUpOworICBlbHNlCisgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Cit9CisKKwwKKy8qIFNvbWUgaW5zdHJ1Y3Rpb24gc2V0cyBpbmRleGVkIGJ5IGxnKHNpemUpICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNleHRYX29wW10gPSB7ICJzZXh0YiIsICJzZXh0dyIsICJzZXh0bCIsIE5VTEwgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5zWGxfb3BbXSA9IHsgImluc2JsIiwgImluc3dsIiwgImluc2xsIiwgImluc3FsIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnNYaF9vcFtdID0geyBOVUxMLCAgICAiaW5zd2giLCAiaW5zbGgiLCAiaW5zcWgiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dFhsX29wW10gPSB7ICJleHRibCIsICJleHR3bCIsICJleHRsbCIsICJleHRxbCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXh0WGhfb3BbXSA9IHsgTlVMTCwgICAgImV4dHdoIiwgImV4dGxoIiwgImV4dHFoIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2tYbF9vcFtdID0geyAibXNrYmwiLCAibXNrd2wiLCAibXNrbGwiLCAibXNrcWwiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1za1hoX29wW10gPSB7IE5VTEwsICAgICJtc2t3aCIsICJtc2tsaCIsICJtc2txaCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RYX29wW10gPSB7ICJzdGIiLCAic3R3IiwgInN0bCIsICJzdHEiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkWF9vcFtdID0geyAibGRiIiwgImxkdyIsICJsZGxsIiwgImxkcSIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGRYdV9vcFtdID0geyAibGRidSIsICJsZHd1IiwgTlVMTCwgTlVMTCB9OworCisvKiBJbXBsZW1lbnQgdGhlIGxkZ3AgbWFjcm8uICAqLworCitzdGF0aWMgdm9pZAorZW1pdF9sZGdwICh0b2ssIG50b2ssIHVudXNlZCkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiB1bnVzZWQ7Cit7CisjaWZkZWYgT0JKX0FPVVQKK0ZJWE1FCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQorICAvKiBmcm9tICJsZGdwIHIxLG4ocjIpIiwgZ2VuZXJhdGUgImxkYWggcjEsWChSMik7IGxkYSByMSxZKHIxKSIKKyAgICAgd2l0aCBhcHByb3ByaWF0ZSBjb25zdGFudHMgYW5kIHJlbG9jYXRpb25zLiAgKi8KKyAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKKyAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOworICBleHByZXNzaW9uUyBhZGRlbmQ7CisKKyAgLyogV2UncmUgZ29pbmcgdG8gbmVlZCB0aGlzIHN5bWJvbCBpbiBtZF9hcHBseV9maXgoKS4gICovCisgICh2b2lkKSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7CisKKyNpZmRlZiBPQkpfRUNPRkYKKyAgaWYgKHJlZ25vICh0b2tbMl0uWF9hZGRfbnVtYmVyKSA9PSBBWFBfUkVHX1BWKQorICAgIGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSAoMCk7CisjZW5kaWYKKworICBuZXd0b2tbMF0gPSB0b2tbMF07CisgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7CisgIG5ld3Rva1syXSA9IHRva1syXTsKKworICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYWgiLCBuZXd0b2ssIDMsICZpbnNuKTsKKworICBhZGRlbmQgPSB0b2tbMV07CisKKyNpZmRlZiBPQkpfRUNPRkYKKyAgaWYgKGFkZGVuZC5YX29wICE9IE9fY29uc3RhbnQpCisgICAgYXNfYmFkIChfKCJjYW4gbm90IHJlc29sdmUgZXhwcmVzc2lvbiIpKTsKKyAgYWRkZW5kLlhfb3AgPSBPX3N5bWJvbDsKKyAgYWRkZW5kLlhfYWRkX3N5bWJvbCA9IGFscGhhX2dwX3N5bWJvbDsKKyNlbmRpZgorCisgIGluc24ubmZpeHVwcyA9IDE7CisgIGluc24uZml4dXBzWzBdLmV4cCA9IGFkZGVuZDsKKyAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY7CisKKyAgZW1pdF9pbnNuICgmaW5zbik7CisKKyAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIHRva1swXS5YX2FkZF9udW1iZXIpOworCisgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRhIiwgbmV3dG9rLCAzLCAmaW5zbik7CisKKyNpZmRlZiBPQkpfRUNPRkYKKyAgYWRkZW5kLlhfYWRkX251bWJlciArPSA0OworI2VuZGlmCisKKyAgaW5zbi5uZml4dXBzID0gMTsKKyAgaW5zbi5maXh1cHNbMF0uZXhwID0gYWRkZW5kOworICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjsKKworICBlbWl0X2luc24gKCZpbnNuKTsKKyNlbmRpZiAvKiBPQkpfRUNPRkYgfHwgT0JKX0VMRiAqLworfQorCisjaWZkZWYgT0JKX0VWQVgKKworLyogQWRkIHN5bWJvbCthZGRlbmQgdG8gbGluayBwb29sLgorICAgUmV0dXJuIG9mZnNldCBmcm9tIGJhc2VzeW0gdG8gZW50cnkgaW4gbGluayBwb29sLgorCisgICBBZGQgbmV3IGZpeHVwIG9ubHkgaWYgb2Zmc2V0IGlzbid0IDE2Yml0LiAgKi8KKwordmFsdWVUCithZGRfdG9fbGlua19wb29sIChiYXNlc3ltLCBzeW0sIGFkZGVuZCkKKyAgICAgc3ltYm9sUyAqYmFzZXN5bTsKKyAgICAgc3ltYm9sUyAqc3ltOworICAgICBvZmZzZXRUIGFkZGVuZDsKK3sKKyAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOworICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOworICB2YWx1ZVQgb2Zmc2V0OworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKKyAgY2hhciAqcDsKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKKyAgZml4UyAqZml4cDsKKworICBvZmZzZXQgPSAtYmFzZXN5bS0+c3lfb2JqOworCisgIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQorICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLworICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLworCisgIGlmIChzZWdpbmZvLT5mcmNoYWluUCkKKyAgICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5mcmNoYWluUC0+Zml4X3Jvb3Q7CisJIGZpeHAgIT0gKGZpeFMgKikgTlVMTDsKKwkgZml4cCA9IGZpeHAtPmZ4X25leHQsIG9mZnNldCArPSA4KQorICAgICAgeworCWlmIChmaXhwLT5meF9hZGRzeSA9PSBzeW0gJiYgZml4cC0+Znhfb2Zmc2V0ID09IGFkZGVuZCkKKwkgIHsKKwkgICAgaWYgKHJhbmdlX3NpZ25lZF8xNiAob2Zmc2V0KSkKKwkgICAgICB7CisJICAgICAgICByZXR1cm4gb2Zmc2V0OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAvKiBOb3QgZm91bmQgaW4gMTZiaXQgc2lnbmVkIHJhbmdlLiAgKi8KKworICBzdWJzZWdfc2V0IChhbHBoYV9saW5rX3NlY3Rpb24sIDApOworICBwID0gZnJhZ19tb3JlICg4KTsKKyAgbWVtc2V0IChwLCAwLCA4KTsKKworICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCBzeW0sIGFkZGVuZCwgMCwKKwkgICBCRkRfUkVMT0NfNjQpOworCisgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOworICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OworICByZXR1cm4gb2Zmc2V0OworfQorCisjZW5kaWYgLyogT0JKX0VWQVggKi8KKworLyogTG9hZCBhIChwYXJ0aWFsKSBleHByZXNzaW9uIGludG8gYSB0YXJnZXQgcmVnaXN0ZXIuCisKKyAgIElmIHBvZmZzZXQgaXMgbm90IG51bGwsIGFmdGVyIHRoZSBjYWxsIGl0IHdpbGwgZWl0aGVyIGNvbnRhaW4KKyAgIE9fY29uc3RhbnQgMCwgb3IgYSAxNi1iaXQgb2Zmc2V0IGFwcHJvcHJpYXRlIGZvciBhbnkgTUVNIGZvcm1hdAorICAgaW5zdHJ1Y3Rpb24uICBJbiBhZGRpdGlvbiwgcGJhc2VyZWcgd2lsbCBiZSBtb2RpZmllZCB0byBwb2ludCB0bworICAgdGhlIGJhc2UgcmVnaXN0ZXIgdG8gdXNlIGluIHRoYXQgTUVNIGZvcm1hdCBpbnN0cnVjdGlvbi4KKworICAgSW4gYW55IGNhc2UsICpwYmFzZXJlZyBzaG91bGQgY29udGFpbiBhIGJhc2UgcmVnaXN0ZXIgdG8gYWRkIHRvIHRoZQorICAgZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBlaXRoZXIgQVhQX1JFR19aRVJPIG9yCisgICBhbHBoYV9ncF9yZWdpc3Rlci4gIFN5bWJvbCBhZGRyZXNzZXMgd2lsbCBhbHdheXMgYmUgbG9hZGVkIHZpYSAkZ3AsCisgICBzbyAiZm9vKCQwKSIgaXMgaW50ZXJwcmV0ZWQgYXMgYWRkaW5nIHRoZSBhZGRyZXNzIG9mIGZvbyB0byAkMDsKKyAgIGkuZS4gImxkcSAkdGFyZywgTElUKCRncCk7IGFkZHEgJHRhcmcsICQwLCAkdGFyZyIuICBPZGQsIHBlcmhhcHMsCisgICBidXQgdGhpcyBpcyB3aGF0IE9TRi8xIGRvZXMuCisKKyAgIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgY2FsbGluZyBtYWNybyBtYXkgZW1pdCBhCisgICBMSVRVU0UgcmVsb2MgaWYgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlLiAgKi8KKworc3RhdGljIGludAorbG9hZF9leHByZXNzaW9uICh0YXJncmVnLCBleHAsIHBiYXNlcmVnLCBwb2Zmc2V0KQorICAgICBpbnQgdGFyZ3JlZzsKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKKyAgICAgaW50ICpwYmFzZXJlZzsKKyAgICAgZXhwcmVzc2lvblMgKnBvZmZzZXQ7Cit7CisgIGludCBlbWl0X2xpdHVzZSA9IDA7CisgIG9mZnNldFQgYWRkZW5kID0gZXhwLT5YX2FkZF9udW1iZXI7CisgIGludCBiYXNlcmVnID0gKnBiYXNlcmVnOworICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOworICBleHByZXNzaW9uUyBuZXd0b2tbM107CisKKyAgc3dpdGNoIChleHAtPlhfb3ApCisgICAgeworICAgIGNhc2UgT19zeW1ib2w6CisgICAgICB7CisjaWZkZWYgT0JKX0VDT0ZGCisJb2Zmc2V0VCBsaXQ7CisKKwkvKiBhdHRlbXB0IHRvIHJlZHVjZSAubGl0IGxvYWQgYnkgc3BsaXR0aW5nIHRoZSBvZmZzZXQgZnJvbQorCSAgIGl0cyBzeW1ib2wgd2hlbiBwb3NzaWJsZSwgYnV0IGRvbid0IGNyZWF0ZSBhIHNpdHVhdGlvbiBpbgorCSAgIHdoaWNoIHdlJ2QgZmFpbC4gICovCisJaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkgJiYKKwkgICAgKGFscGhhX25vYXRfb24gfHwgdGFyZ3JlZyA9PSBBWFBfUkVHX0FUKSkKKwkgIHsKKwkgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCwKKwkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKKwkgICAgYWRkZW5kID0gMDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCAwLAorCQkJCSAgICAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOworCSAgfQorCisJaWYgKGxpdCA+PSAweDgwMDApCisJICBhc19mYXRhbCAoXygib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIikpOworCisJLyogZW1pdCAibGRxIHIsIGxpdChncCkiICovCisKKwlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiB0YXJncmVnID09IGJhc2VyZWcpCisJICB7CisJICAgIGlmIChhbHBoYV9ub2F0X29uKQorCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOworCSAgICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQorCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7CisKKwkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7CisJICB9CisJZWxzZQorCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7CisJc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0YV9zeW1ib2wsIGxpdCk7CisJc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKKworCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7CisKKwlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKKwlpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOworI2VuZGlmIC8qIE9CSl9FQ09GRiAqLworI2lmZGVmIE9CSl9FTEYKKwkvKiBlbWl0ICJsZHEgciwgZ290b2ZmKGdwKSIgKi8KKworCWlmIChiYXNlcmVnICE9IGFscGhhX2dwX3JlZ2lzdGVyICYmIHRhcmdyZWcgPT0gYmFzZXJlZykKKwkgIHsKKwkgICAgaWYgKGFscGhhX25vYXRfb24pCisJICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7CisJICAgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCisJICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIpKTsKKworCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKKwkgIH0KKwllbHNlCisJICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKKworCS8qIFhYWDogRGlzYWJsZSB0aGlzIC5nb3QgbWluaW1pemluZyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBjYW4gZ2V0CisJICAgYmV0dGVyIGluc3RydWN0aW9uIG9mZnNldCBrbm93bGVkZ2UgaW4gdGhlIGNvbXBpbGVyLiAgVGhpcyBoYXBwZW5zCisJICAgdmVyeSBpbmZyZXF1ZW50bHkgYW55d2F5LiAgKi8KKwlpZiAoMSB8fCAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKQorCSAgICAmJiAoYWxwaGFfbm9hdF9vbiB8fCB0YXJncmVnID09IEFYUF9SRUdfQVQpKSkKKwkgIHsKKwkgICAgbmV3dG9rWzFdID0gKmV4cDsKKwkgICAgYWRkZW5kID0gMDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKKwkgIH0KKworCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7CisKKwlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOworCisJYXNzZXJ0IChpbnNuLm5maXh1cHMgPT0gMSk7CisJaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7CisjZW5kaWYgLyogT0JKX0VMRiAqLworI2lmZGVmIE9CSl9FVkFYCisJb2Zmc2V0VCBsaW5rOworCisJLyogRmluZCBzeW1ib2wgb3Igc3ltYm9sIHBvaW50ZXIgaW4gbGluayBzZWN0aW9uLiAgKi8KKworCWlmIChleHAtPlhfYWRkX3N5bWJvbCA9PSBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKQorCSAgeworCSAgICBpZiAocmFuZ2Vfc2lnbmVkXzE2IChhZGRlbmQpKQorCSAgICAgIHsKKwkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7CisJCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgYWRkZW5kKTsKKwkJc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOworCQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOworCQlhZGRlbmQgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7CisJCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7CisJCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKKwkJYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKSkKKwkgICAgICB7CisJCWxpbmsgPSBhZGRfdG9fbGlua19wb29sIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sLAorCQkJCQkgZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCk7CisJCWFkZGVuZCA9IDA7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlsaW5rID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKKwkJCQkJIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKKwkgICAgICB9CisJICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOworCSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxpbmspOworCSAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7CisJICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7CisJICB9CisjZW5kaWYgLyogT0JKX0VWQVggKi8KKworCWVtaXRfaW5zbigmaW5zbik7CisKKyNpZm5kZWYgT0JKX0VWQVgKKwllbWl0X2xpdHVzZSA9IDE7CisKKwlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiBiYXNlcmVnICE9IEFYUF9SRUdfWkVSTykKKwkgIHsKKwkgICAgLyogZW1pdCAiYWRkcSByLCBiYXNlLCByIiAqLworCisJICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIGJhc2VyZWcpOworCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKKwkgICAgYXNzZW1ibGVfdG9rZW5zICgiYWRkcSIsIG5ld3RvaywgMywgMCk7CisJICB9CisjZW5kaWYKKworCWJhc2VyZWcgPSB0YXJncmVnOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9fY29uc3RhbnQ6CisgICAgICBicmVhazsKKworICAgIGNhc2UgT19zdWJ0cmFjdDoKKyAgICAgIC8qIEFzc3VtZSB0aGF0IHRoaXMgZGlmZmVyZW5jZSBleHByZXNzaW9uIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYW4KKwkgYWJzb2x1dGUgdmFsdWUgYW5kIHRoYXQgdGhhdCB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAqLworCisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKKyAgICAgIG5ld3Rva1sxXSA9ICpleHA7CisgICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7CisgICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOworCisgICAgICBpZiAocG9mZnNldCkKKwlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgT19iaWc6CisgICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPiAwKQorCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7CisgICAgICBhZGRlbmQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIpKTsKKyAgICAgIGFkZGVuZCA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCisgICAgeworICAgICAgb2Zmc2V0VCBsaXQ7CisKKyAgICAgIC8qIGZvciA2NC1iaXQgYWRkZW5kcywganVzdCBwdXQgaXQgaW4gdGhlIGxpdGVyYWwgcG9vbCAqLworCisjaWZkZWYgT0JKX0VWQVgKKyAgICAgIC8qIGVtaXQgImxkcSB0YXJncmVnLCBsaXQoYmFzZXJlZykiICAqLworICAgICAgbGl0ID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKKwkJCSAgICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSwgYWRkZW5kKTsKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOworICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOworICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcSIsIG5ld3RvaywgMywgMCk7CisjZWxzZQorCisgICAgICBpZiAoYWxwaGFfbGl0OF9zZWN0aW9uID09IE5VTEwpCisJeworCSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXQ4IiwKKwkJCQkgICZhbHBoYV9saXQ4X3NlY3Rpb24sCisJCQkJICAmYWxwaGFfbGl0OF9zeW1ib2wpOworCisjaWZkZWYgT0JKX0VDT0ZGCisJICBhbHBoYV9saXQ4X2xpdGVyYWwgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChhbHBoYV9saXQ4X3N5bWJvbCwgMHg4MDAwLAorCQkJCQkJICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7CisJICBpZiAoYWxwaGFfbGl0OF9saXRlcmFsID49IDB4ODAwMCkKKwkgICAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKKyNlbmRpZgorCX0KKworICAgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoTlVMTCwgYWRkZW5kLCBhbHBoYV9saXQ4X3NlY3Rpb24sIDgpIC0gMHg4MDAwOworICAgICAgaWYgKGxpdCA+PSAweDgwMDApCisJYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIpKTsKKworICAgICAgLyogZW1pdCAibGRhIGxpdHJlZywgLmxpdDgrMHg4MDAwIiAqLworCisgICAgICBpZiAodGFyZ3JlZyA9PSBiYXNlcmVnKQorCXsKKwkgIGlmIChhbHBoYV9ub2F0X29uKQorCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKKwkgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCisJICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7CisKKwkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOworCX0KKyAgICAgIGVsc2UKKwlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKKyNpZmRlZiBPQkpfRUNPRkYKKyAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBhbHBoYV9saXQ4X2xpdGVyYWwpOworI2VuZGlmCisjaWZkZWYgT0JKX0VMRgorICAgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCk7CisjZW5kaWYKKyAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7CisKKyAgICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7CisKKyAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOworI2lmZGVmIE9CSl9FQ09GRgorICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOworI2VuZGlmCisKKyAgICAgIGVtaXRfaW5zbiAoJmluc24pOworCisgICAgICAvKiBlbWl0ICJsZHEgbGl0cmVnLCBsaXQobGl0cmVnKSIgKi8KKworICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOworICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIG5ld3Rva1swXS5YX2FkZF9udW1iZXIpOworCisgICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOworCisgICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7CisgICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKKwl7CisJICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKKwkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOworCX0KKyAgICAgIGluc24ubmZpeHVwcysrOworICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOworICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX2NvbnN0YW50OworICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IDE7CisgICAgICBlbWl0X2xpdHVzZSA9IDA7CisKKyAgICAgIGVtaXRfaW5zbiAoJmluc24pOworCisgICAgICAvKiBlbWl0ICJhZGRxIGxpdHJlZywgYmFzZSwgdGFyZ2V0IiAqLworCisgICAgICBpZiAoYmFzZXJlZyAhPSBBWFBfUkVHX1pFUk8pCisJeworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgYmFzZXJlZyk7CisJICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKKwkgIGFzc2VtYmxlX3Rva2VucyAoImFkZHEiLCBuZXd0b2ssIDMsIDApOworCX0KKyNlbmRpZiAvKiAhT0JKX0VWQVggKi8KKworICAgICAgaWYgKHBvZmZzZXQpCisJc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIDApOworICAgICAgKnBiYXNlcmVnID0gdGFyZ3JlZzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBvZmZzZXRUIGxvdywgaGlnaCwgZXh0cmEsIHRtcDsKKworICAgICAgLyogZm9yIDMyLWJpdCBvcGVyYW5kcywgYnJlYWsgdXAgdGhlIGFkZGVuZCAqLworCisgICAgICBsb3cgPSBzaWduX2V4dGVuZF8xNiAoYWRkZW5kKTsKKyAgICAgIHRtcCA9IGFkZGVuZCAtIGxvdzsKKyAgICAgIGhpZ2ggPSBzaWduX2V4dGVuZF8xNiAodG1wID4+IDE2KTsKKworICAgICAgaWYgKHRtcCAtIChoaWdoIDw8IDE2KSkKKwl7CisJICBleHRyYSA9IDB4NDAwMDsKKwkgIHRtcCAtPSAweDQwMDAwMDAwOworCSAgaGlnaCA9IHNpZ25fZXh0ZW5kXzE2ICh0bXAgPj4gMTYpOworCX0KKyAgICAgIGVsc2UKKwlleHRyYSA9IDA7CisKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOworICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOworCisgICAgICBpZiAoZXh0cmEpCisJeworCSAgLyogZW1pdCAibGRhaCByLCBleHRyYShyKSAqLworCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBleHRyYSk7CisJICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKKwkgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnID0gdGFyZ3JlZyk7CisJfQorCisgICAgICBpZiAoaGlnaCkKKwl7CisJICAvKiBlbWl0ICJsZGFoIHIsIGhpZ2gocikgKi8KKwkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgaGlnaCk7CisJICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKKwkgIGJhc2VyZWcgPSB0YXJncmVnOworCSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOworCX0KKworICAgICAgaWYgKChsb3cgJiYgIXBvZmZzZXQpIHx8ICghcG9mZnNldCAmJiBiYXNlcmVnICE9IHRhcmdyZWcpKQorCXsKKwkgIC8qIGVtaXQgImxkYSByLCBsb3coYmFzZSkiICovCisJICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxvdyk7CisJICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOworCSAgYmFzZXJlZyA9IHRhcmdyZWc7CisJICBsb3cgPSAwOworCX0KKworICAgICAgaWYgKHBvZmZzZXQpCisJc2V0X3Rva19jb25zdCAoKnBvZmZzZXQsIGxvdyk7CisgICAgICAqcGJhc2VyZWcgPSBiYXNlcmVnOworICAgIH0KKworICByZXR1cm4gZW1pdF9saXR1c2U7Cit9CisKKy8qIFRoZSBsZGEgbWFjcm8gZGlmZmVycyBmcm9tIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYW5kbGVzCisgICBtb3N0IHNpbXBsZSBleHByZXNzaW9ucywgcGFydGljdWFscmx5IHN5bWJvbCBhZGRyZXNzIGxvYWRzIGFuZAorICAgbGFyZ2UgY29uc3RhbnRzLiAgKi8KKworc3RhdGljIHZvaWQKK2VtaXRfbGRhICh0b2ssIG50b2ssIHVudXNlZCkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiB1bnVzZWQ7Cit7CisgIGludCBiYXNlcmVnOworCisgIGlmIChudG9rID09IDIpCisgICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOworICBlbHNlCisgICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7CisKKyAgKHZvaWQpIGxvYWRfZXhwcmVzc2lvbiAodG9rWzBdLlhfYWRkX251bWJlciwgJnRva1sxXSwgJmJhc2VyZWcsIE5VTEwpOworfQorCisvKiBUaGUgbGRhaCBtYWNybyBkaWZmZXJzIGZyb20gdGhlIGxkYWggaW5zdHJ1Y3Rpb24gaW4gdGhhdCBpdCBoYXMgJDMxCisgICBhcyBhbiBpbXBsaWVkIGJhc2UgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgdm9pZAorZW1pdF9sZGFoICh0b2ssIG50b2ssIHVudXNlZCkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiB1bnVzZWQ7Cit7CisgIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKKworICBuZXd0b2tbMF0gPSB0b2tbMF07CisgIG5ld3Rva1sxXSA9IHRva1sxXTsKKyAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfWkVSTyk7CisKKyAgYXNzZW1ibGVfdG9rZW5zICgibGRhaCIsIG5ld3RvaywgMywgMCk7Cit9CisKKy8qIEhhbmRsZSBhbGwgInNpbXBsZSIgaW50ZWdlciByZWdpc3RlciBsb2FkcyAtLSBsZHEsIGxkcV9sLCBsZHFfdSwKKyAgIGV0Yy4gIFRoZXkgZGlmZmVyIGZyb20gdGhlIHJlYWwgaW5zdHJ1Y3Rpb25zIGluIHRoYXQgdGhleSBkbyBzaW1wbGUKKyAgIGV4cHJlc3Npb25zIGxpa2UgdGhlIGxkYSBtYWNyby4gICovCisKK3N0YXRpYyB2b2lkCitlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgb3BuYW1lKQorICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOworICAgICBpbnQgbnRvazsKKyAgICAgY29uc3QgUFRSIG9wbmFtZTsKK3sKKyAgaW50IGJhc2VyZWcsIGxpdHVzZTsKKyAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOworICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOworCisgIGlmIChudG9rID09IDIpCisgICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOworICBlbHNlCisgICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7CisKKyAgbGl0dXNlID0gbG9hZF9leHByZXNzaW9uICh0b2tbMF0uWF9hZGRfbnVtYmVyLCAmdG9rWzFdLCAmYmFzZXJlZywKKwkJCSAgICAmbmV3dG9rWzFdKTsKKworICBuZXd0b2tbMF0gPSB0b2tbMF07CisgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKKworICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoKGNvbnN0IGNoYXIgKilvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOworCisgIGlmIChsaXR1c2UpCisgICAgeworICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOworICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCisJeworCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCisJCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKKwl9CisgICAgICBpbnNuLm5maXh1cHMrKzsKKyAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKKyAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19jb25zdGFudDsKKyAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAxOworICAgIH0KKworICBlbWl0X2luc24gKCZpbnNuKTsKK30KKworLyogSGFuZGxlIGZwIHJlZ2lzdGVyIGxvYWRzLCBhbmQgYm90aCBpbnRlZ2VyIGFuZCBmcCByZWdpc3RlciBzdG9yZXMuCisgICBBZ2Fpbiwgd2UgaGFuZGxlIHNpbXBsZSBleHByZXNzaW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBvcG5hbWUpCisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCBudG9rOworICAgICBjb25zdCBQVFIgb3BuYW1lOworeworICBpbnQgYmFzZXJlZywgbGl0dXNlOworICBleHByZXNzaW9uUyBuZXd0b2tbM107CisgIHN0cnVjdCBhbHBoYV9pbnNuIGluc247CisKKyAgaWYgKG50b2sgPT0gMikKKyAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7CisgIGVsc2UKKyAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKKworICBpZiAodG9rWzFdLlhfb3AgIT0gT19jb25zdGFudCB8fCAhcmFuZ2Vfc2lnbmVkXzE2KHRva1sxXS5YX2FkZF9udW1iZXIpKQorICAgIHsKKyAgICAgIGlmIChhbHBoYV9ub2F0X29uKQorCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOworCisgICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKEFYUF9SRUdfQVQsICZ0b2tbMV0sICZiYXNlcmVnLCAmbmV3dG9rWzFdKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuZXd0b2tbMV0gPSB0b2tbMV07CisgICAgICBsaXR1c2UgPSAwOworICAgIH0KKworICBuZXd0b2tbMF0gPSB0b2tbMF07CisgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKKworICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoKGNvbnN0IGNoYXIgKilvcG5hbWUsIG5ld3RvaywgMywgJmluc24pOworCisgIGlmIChsaXR1c2UpCisgICAgeworICAgICAgYXNzZXJ0IChpbnNuLm5maXh1cHMgPCBNQVhfSU5TTl9GSVhVUFMpOworICAgICAgaWYgKGluc24ubmZpeHVwcyA+IDApCisJeworCSAgbWVtbW92ZSAoJmluc24uZml4dXBzWzFdLCAmaW5zbi5maXh1cHNbMF0sCisJCSAgIHNpemVvZihzdHJ1Y3QgYWxwaGFfZml4dXApICogaW5zbi5uZml4dXBzKTsKKwl9CisgICAgICBpbnNuLm5maXh1cHMrKzsKKyAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0xJVFVTRTsKKyAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX29wID0gT19jb25zdGFudDsKKyAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAxOworICAgIH0KKworICBlbWl0X2luc24gKCZpbnNuKTsKK30KKworLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiAgKi8KKworc3RhdGljIHZvaWQKK2VtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQorICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOworICAgICBpbnQgbnRvazsKKyAgICAgY29uc3QgUFRSIHZsZ3NpemU7Cit7CisgIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKKyAgICBlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgbGRYdV9vcFsobG9uZyl2bGdzaXplXSk7CisgIGVsc2UKKyAgICB7CisgICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107CisKKyAgICAgIGlmIChhbHBoYV9ub2F0X29uKQorCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOworCisgICAgICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCisKKyAgICAgIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZiAoZXhwcmVzc2lvblMpICogbnRvayk7CisgICAgICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7CisKKyAgICAgIC8qIGVtaXQgImxkcV91IHRhcmcsIDAoJGF0KSIgKi8KKworICAgICAgbmV3dG9rWzBdID0gdG9rWzBdOworICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKKyAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKKworICAgICAgLyogZW1pdCAiZXh0WGwgdGFyZywgJGF0LCB0YXJnIiAqLworCisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKKyAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoZXh0WGxfb3BbKGxvbmcpdmxnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisgICAgfQorfQorCisvKiBMb2FkIGEgaGFsZi13b3JkIG9yIGJ5dGUgYXMgYSBzaWduZWQgdmFsdWUuICAqLworCitzdGF0aWMgdm9pZAorZW1pdF9sZFggKHRvaywgbnRvaywgdmxnc2l6ZSkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiB2bGdzaXplOworeworICBlbWl0X2xkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSk7CisgIGFzc2VtYmxlX3Rva2VucyAoc2V4dFhfb3BbKGxvbmcpdmxnc2l6ZV0sIHRvaywgMSwgMSk7Cit9CisKKy8qIExvYWQgYW4gaW50ZWdyYWwgdmFsdWUgZnJvbSBhbiB1bmFsaWduZWQgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZAorICAgdmFsdWUuICAqLworCitzdGF0aWMgdm9pZAorZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQorICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOworICAgICBpbnQgbnRvazsKKyAgICAgY29uc3QgUFRSIHZsZ3NpemU7Cit7CisgIGxvbmcgbGdzaXplID0gKGxvbmcpdmxnc2l6ZTsKKyAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOworCisgIGlmIChhbHBoYV9ub2F0X29uKQorICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOworCisgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KKworICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOworICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKKyAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKKworICAvKiBlbWl0ICJsZHFfdSAkdDksIDAoJGF0KSIgKi8KKworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKKyAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKKyAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfQVQpOworICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAibGRxX3UgJHQxMCwgc2l6ZS0xKCRhdCkiICovCisKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOworICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sICgxPDxsZ3NpemUpLTEpOworICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAiZXh0WGwgJHQ5LCAkYXQsICR0OSIgKi8KKworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7CisgIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDkpOworICBhc3NlbWJsZV90b2tlbnMgKGV4dFhsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAiZXh0WGggJHQxMCwgJGF0LCAkdDEwIiAqLworCisgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOworICBhc3NlbWJsZV90b2tlbnMgKGV4dFhoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCB0YXJnIiAqLworCisgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOworICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7CisgIG5ld3Rva1syXSA9IHRva1swXTsKKyAgYXNzZW1ibGVfdG9rZW5zICgib3IiLCBuZXd0b2ssIDMsIDEpOworfQorCisvKiBMb2FkIGFuIGludGVncmFsIHZhbHVlIGZyb20gYW4gdW5hbGlnbmVkIGFkZHJlc3MgYXMgYSBzaWduZWQgdmFsdWUuCisgICBOb3RlIHRoYXQgcXVhZHMgc2hvdWxkIGdldCBmdW5uZWxlZCB0byB0aGUgdW5zaWduZWQgbG9hZCBzaW5jZSB3ZQorICAgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgc2lnbiBleHRlbnNpb24uICAqLworCitzdGF0aWMgdm9pZAorZW1pdF91bGRYICh0b2ssIG50b2ssIHZsZ3NpemUpCisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCBudG9rOworICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKK3sKKyAgZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKTsKKyAgYXNzZW1ibGVfdG9rZW5zIChzZXh0WF9vcFsobG9uZyl2bGdzaXplXSwgdG9rLCAxLCAxKTsKK30KKworLyogSW1wbGVtZW50IHRoZSBsZGlsIG1hY3JvLiAgKi8KKworc3RhdGljIHZvaWQKK2VtaXRfbGRpbCAodG9rLCBudG9rLCB1bnVzZWQpCisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCBudG9rOworICAgICBjb25zdCBQVFIgdW51c2VkOworeworICBleHByZXNzaW9uUyBuZXd0b2tbMl07CisKKyAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mKG5ld3RvaykpOworICBuZXd0b2tbMV0uWF9hZGRfbnVtYmVyID0gc2lnbl9leHRlbmRfMzIgKHRva1sxXS5YX2FkZF9udW1iZXIpOworCisgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Cit9CisKKy8qIFN0b3JlIGEgaGFsZi13b3JkIG9yIGJ5dGUuICAqLworCitzdGF0aWMgdm9pZAorZW1pdF9zdFggKHRvaywgbnRvaywgdmxnc2l6ZSkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiB2bGdzaXplOworeworICBpbnQgbGdzaXplID0gKGludCkobG9uZyl2bGdzaXplOworCisgIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKKyAgICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBzdFhfb3BbbGdzaXplXSk7CisgIGVsc2UKKyAgICB7CisgICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107CisKKyAgICAgIGlmIChhbHBoYV9ub2F0X29uKQorCWFzX2JhZChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7CisKKyAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KKworICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKKyAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOworICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKKworICAgICAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCisKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOworICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKKyAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKKworICAgICAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTAiICovCisKKyAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOworICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOworICAgICAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOworCisgICAgICAvKiBlbWl0ICJtc2tYbCAkdDksICRhdCwgJHQ5IiAqLworCisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKKyAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAobXNrWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKKworICAgICAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCAkdDkiICovCisKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKKworICAgICAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkgKi8KKworICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKKyAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKKyAgICB9Cit9CisKKy8qIFN0b3JlIGFuIGludGVnZXIgdG8gYW4gdW5hbGlnbmVkIGFkZHJlc3MuICAqLworCitzdGF0aWMgdm9pZAorZW1pdF91c3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCBudG9rOworICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKK3sKKyAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKKyAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOworCisgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KKworICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOworICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKKyAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKKworICAvKiBlbWl0ICJsZHFfdSAkOSwgMCgkYXQpIiAqLworCisgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOworICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOworICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7CisgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKKworICAvKiBlbWl0ICJsZHFfdSAkMTAsIHNpemUtMSgkYXQpIiAqLworCisgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKKyAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOworICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTEiICovCisKKyAgbmV3dG9rWzBdID0gdG9rWzBdOworICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTEpOworICBhc3NlbWJsZV90b2tlbnMgKGluc1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAiaW5zWGggc3JjLCAkYXQsICR0MTIiICovCisKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTIpOworICBhc3NlbWJsZV90b2tlbnMgKGluc1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KKworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKKyAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOworICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAibXNrWGggJHQxMCwgJGF0LCAkdDEwIiAqLworCisgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKKyAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOworICBhc3NlbWJsZV90b2tlbnMgKG1za1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAib3IgJHQ5LCAkdDExLCAkdDkiICovCisKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7CisgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKKyAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOworICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAib3IgJHQxMCwgJHQxMiwgJHQxMCIgKi8KKworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7CisgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEyKTsKKyAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOworICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7CisKKyAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkiICovCisKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7CisgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7CisgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKKyAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOworCisgIC8qIGVtaXQgInN0cV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLworCisgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKKyAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOworICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Cit9CisKKy8qIFNpZ24gZXh0ZW5kIGEgaGFsZi13b3JkIG9yIGJ5dGUuICBUaGUgMzItYml0IHNpZ24gZXh0ZW5kIGlzCisgICBpbXBsZW1lbnRlZCBhcyAiYWRkbCAkMzEsICRyLCAkdCIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitlbWl0X3NleHRYICh0b2ssIG50b2ssIHZsZ3NpemUpCisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCBudG9rOworICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKK3sKKyAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOworCisgIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKKyAgICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wW2xnc2l6ZV0sIHRvaywgbnRvaywgMCk7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgYml0c2hpZnQgPSA2NCAtIDggKiAoMSA8PCBsZ3NpemUpOworICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOworCisgICAgICAvKiBlbWl0ICJzbGwgc3JjLGJpdHMsZHN0IiAqLworCisgICAgICBuZXd0b2tbMF0gPSB0b2tbMF07CisgICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGJpdHNoaWZ0KTsKKyAgICAgIG5ld3Rva1syXSA9IHRva1tudG9rIC0gMV07CisgICAgICBhc3NlbWJsZV90b2tlbnMgKCJzbGwiLCBuZXd0b2ssIDMsIDEpOworCisgICAgICAvKiBlbWl0ICJzcmEgZHN0LGJpdHMsZHN0IiAqLworCisgICAgICBuZXd0b2tbMF0gPSBuZXd0b2tbMl07CisgICAgICBhc3NlbWJsZV90b2tlbnMgKCJzcmEiLCBuZXd0b2ssIDMsIDEpOworICAgIH0KK30KKworLyogSW1wbGVtZW50IHRoZSBkaXZpc2lvbiBhbmQgbW9kdWx1cyBtYWNyb3MuICAqLworCisjaWZkZWYgT0JKX0VWQVgKKworLyogTWFrZSByZWdpc3RlciB1c2FnZSBsaWtlIGluIG5vcm1hbCBwcm9jZWR1cmUgY2FsbC4KKyAgIERvbid0IGNsb2JiZXIgUFYgYW5kIFJBLiAgKi8KKworc3RhdGljIHZvaWQKK2VtaXRfZGl2aXNpb24gKHRvaywgbnRvaywgc3ltbmFtZSkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiBzeW1uYW1lOworeworICAvKiBESVZJU0lPTiBhbmQgTU9EVUxVUy4gWWVjaC4KKyAgICoKKyAgICogQ29udmVydAorICAgKiAgICBPUCB4LHkscmVzdWx0CisgICAqIHRvCisgICAqICAgIG1vdiB4LFIxNgkjIGlmIHggIT0gUjE2CisgICAqICAgIG1vdiB5LFIxNwkjIGlmIHkgIT0gUjE3CisgICAqICAgIGxkYSBBVCxfX09QCisgICAqICAgIGpzciBBVCwoQVQpLDAKKyAgICogICAgbW92IFIwLHJlc3VsdAorICAgKgorICAgKiB3aXRoIGFwcHJvcHJpYXRlIG9wdGltaXphdGlvbnMgaWYgUjAsUjE2LFIxNyBhcmUgdGhlIHJlZ2lzdGVycworICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgKi8KKworICBpbnQgeHIsIHlyLCBycjsKKyAgc3ltYm9sUyAqc3ltOworICBleHByZXNzaW9uUyBuZXd0b2tbM107CisKKyAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7CisgIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOworCisgIGlmIChudG9rIDwgMykKKyAgICByciA9IHhyOworICBlbHNlCisgICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7CisKKyAgLyogTW92ZSB0aGUgb3BlcmFuZHMgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KKyAgaWYgKHlyID09IEFYUF9SRUdfUjE2ICYmIHhyID09IEFYUF9SRUdfUjE3KQorICAgIHsKKyAgICAgIC8qIFRoZXkgYXJlIGluIGV4YWN0bHkgdGhlIHdyb25nIG9yZGVyIC0tIHN3YXAgdGhyb3VnaCBBVCAqLworCisgICAgICBpZiAoYWxwaGFfbm9hdF9vbikKKwlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKKworICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOworICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7CisgICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOworCisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNyk7CisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7CisgICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOworCisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHlyID09IEFYUF9SRUdfUjE2KQorCXsKKwkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE2KTsKKwkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKKwkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7CisJfQorCisgICAgICBpZiAoeHIgIT0gQVhQX1JFR19SMTYpCisJeworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeHIpOworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTYpOworICAgICAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7CisJfQorCisgICAgICBpZiAoeXIgIT0gQVhQX1JFR19SMTYgJiYgeXIgIT0gQVhQX1JFR19SMTcpCisJeworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeXIpOworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOworCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKKwl9CisgICAgfQorCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjb25zdCBjaGFyICopc3ltbmFtZSk7CisKKyAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7CisgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIHN5bSwgMCk7CisgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMiwgMSk7CisKKyAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKKyAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKKyAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCAwKTsKKyAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAzLCAxKTsKKworICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCisgIGlmIChyciAhPSBBWFBfUkVHX1IwKQorICAgIHsKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjApOworICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgcnIpOworICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKKyAgICB9Cit9CisKKyNlbHNlIC8qICFPQkpfRVZBWCAqLworCitzdGF0aWMgdm9pZAorZW1pdF9kaXZpc2lvbiAodG9rLCBudG9rLCBzeW1uYW1lKQorICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOworICAgICBpbnQgbnRvazsKKyAgICAgY29uc3QgUFRSIHN5bW5hbWU7Cit7CisgIC8qIERJVklTSU9OIGFuZCBNT0RVTFVTLiBZZWNoLgorICAgKiBDb252ZXJ0CisgICAqICAgIE9QIHgseSxyZXN1bHQKKyAgICogdG8KKyAgICogICAgbGRhIHB2LF9fT1AKKyAgICogICAgbW92IHgsdDEwCisgICAqICAgIG1vdiB5LHQxMQorICAgKiAgICBqc3IgdDksKHB2KSxfX09QCisgICAqICAgIG1vdiB0MTIscmVzdWx0CisgICAqCisgICAqIHdpdGggYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9ucyBpZiB0MTAsdDExLHQxMiBhcmUgdGhlIHJlZ2lzdGVycworICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgKi8KKworICBpbnQgeHIsIHlyLCBycjsKKyAgc3ltYm9sUyAqc3ltOworICBleHByZXNzaW9uUyBuZXd0b2tbM107CisKKyAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7CisgIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOworCisgIGlmIChudG9rIDwgMykKKyAgICByciA9IHhyOworICBlbHNlCisgICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7CisKKyAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKKworICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLworICBpZiAoeXIgPT0gQVhQX1JFR19UMTAgJiYgeHIgPT0gQVhQX1JFR19UMTEpCisgICAgeworICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCisKKyAgICAgIGlmIChhbHBoYV9ub2F0X29uKQorCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOworCisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7CisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7CisKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDExKTsKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKKyAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7CisKKyAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOworICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOworICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoeXIgPT0gQVhQX1JFR19UMTApCisJeworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOworCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOworCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKKwl9CisKKyAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1QxMCkKKwl7CisJICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7CisJICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7CisgICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKKwl9CisKKyAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1QxMCAmJiB5ciAhPSBBWFBfUkVHX1QxMSkKKwl7CisJICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7CisJICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7CisJICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOworCX0KKyAgICB9CisKKyAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKKyAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKKyAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAyLCAxKTsKKworICAvKiBSZWxvYWQgdGhlIEdQIHJlZ2lzdGVyICovCisjaWZkZWYgT0JKX0FPVVQKK0ZJWE1FCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQorICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBhbHBoYV9ncF9yZWdpc3Rlcik7CisgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7CisgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKKyAgYXNzZW1ibGVfdG9rZW5zICgibGRncCIsIG5ld3RvaywgMywgMSk7CisjZW5kaWYKKworICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCisgIGlmIChyciAhPSBBWFBfUkVHX1QxMikKKyAgICB7CisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMik7CisgICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7CisgICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOworICAgIH0KK30KKworI2VuZGlmIC8qICFPQkpfRVZBWCAqLworCisvKiBUaGUganNyIGFuZCBqbXAgbWFjcm9zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uIGNvdW50ZXJwYXJ0cworICAgaW4gdGhhdCB0aGV5IGNhbiBsb2FkIHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgZGVmYXVsdCBtb3N0CisgICBldmVyeXRoaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK2VtaXRfanNyam1wICh0b2ssIG50b2ssIHZvcG5hbWUpCisgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7CisgICAgIGludCBudG9rOworICAgICBjb25zdCBQVFIgdm9wbmFtZTsKK3sKKyAgY29uc3QgY2hhciAqb3BuYW1lID0gKGNvbnN0IGNoYXIgKikgdm9wbmFtZTsKKyAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKKyAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOworICBpbnQgciwgdG9raWR4ID0gMCwgbGl0dXNlID0gMDsKKworICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCisgICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7CisgIGVsc2UKKyAgICByID0gc3RyY21wIChvcG5hbWUsICJqbXAiKSA9PSAwID8gQVhQX1JFR19aRVJPIDogQVhQX1JFR19SQTsKKworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKKworICBpZiAodG9raWR4IDwgbnRvayAmJgorICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQorICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOworI2lmZGVmIE9CSl9FVkFYCisgIC8qIGtlZXAgcmVnaXN0ZXIgaWYganNyICRuLjxzeW0+ICAqLworI2Vsc2UKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBiYXNlcmVnID0gYWxwaGFfZ3BfcmVnaXN0ZXI7CisgICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHIgPSBBWFBfUkVHX1BWLCAmdG9rW3Rva2lkeF0sICZiYXNlcmVnLCBOVUxMKTsKKyAgICB9CisjZW5kaWYKKworICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIHIpOworCisjaWZkZWYgT0JKX0VWQVgKKyAgLyogRklYTUU6IEFkZCBoaW50IHJlbG9jcyB0byBCRkQgZm9yIGV2YXguICAqLworI2Vsc2UKKyAgaWYgKHRva2lkeCA8IG50b2spCisgICAgbmV3dG9rWzJdID0gdG9rW3Rva2lkeF07CisgIGVsc2UKKyNlbmRpZgorICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgMCk7CisKKyAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKG9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7CisKKyAgLyogYWRkIHRoZSBMSVRVU0UgZml4dXAgKi8KKyAgaWYgKGxpdHVzZSkKKyAgICB7CisgICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7CisgICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKKwl7CisJICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKKwkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOworCX0KKyAgICAgIGluc24ubmZpeHVwcysrOworICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOworICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX2NvbnN0YW50OworICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciA9IDM7CisgICAgfQorCisgIGVtaXRfaW5zbiAoJmluc24pOworfQorCisvKiBUaGUgcmV0IGFuZCBqY3IgaW5zdHJ1Y3Rpb25zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uCisgICBjb3VudGVycGFydHMgaW4gdGhhdCBldmVyeXRoaW5nIGNhbiBiZSBkZWZhdWx0ZWQuICAqLworCitzdGF0aWMgdm9pZAorZW1pdF9yZXRqY3IgKHRvaywgbnRvaywgdm9wbmFtZSkKKyAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKKyAgICAgaW50IG50b2s7CisgICAgIGNvbnN0IFBUUiB2b3BuYW1lOworeworICBjb25zdCBjaGFyICpvcG5hbWUgPSAoY29uc3QgY2hhciAqKXZvcG5hbWU7CisgIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKKyAgaW50IHIsIHRva2lkeCA9IDA7CisKKyAgaWYgKHRva2lkeCA8IG50b2sgJiYgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX3JlZ2lzdGVyKQorICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOworICBlbHNlCisgICAgciA9IEFYUF9SRUdfWkVSTzsKKworICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKKworICBpZiAodG9raWR4IDwgbnRvayAmJgorICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQorICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOworICBlbHNlCisgICAgciA9IEFYUF9SRUdfUkE7CisKKyAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCByKTsKKworICBpZiAodG9raWR4IDwgbnRvaykKKyAgICBuZXd0b2tbMl0gPSB0b2tbdG9raWR4XTsKKyAgZWxzZQorICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgc3RyY21wKG9wbmFtZSwgInJldCIpID09IDApOworCisgIGFzc2VtYmxlX3Rva2VucyAob3BuYW1lLCBuZXd0b2ssIDMsIDApOworfQorDAorLyogQXNzZW1ibGVyIGRpcmVjdGl2ZXMgKi8KKworLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0CisgICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV90ZXh0IChpKQorICAgICBpbnQgaTsKKworeworICBzX3RleHQgKGkpOworICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKKyAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7CisgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOworfQorCisvKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKKyAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX2RhdGEgKGkpCisgICAgIGludCBpOworeworICBzX2RhdGEgKGkpOworICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKKyAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7CisgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOworfQorCisjaWYgZGVmaW5lZCAoT0JKX0VDT0ZGKSB8fCBkZWZpbmVkIChPQkpfRVZBWCkKKworLyogSGFuZGxlIHRoZSBPU0YvMSBhbmQgb3BlblZNUyAuY29tbSBwc2V1ZG8gcXVpcmtzLgorICAgb3BlblZNUyBjb25zdHJ1Y3RzIGEgc2VjdGlvbiBmb3IgZXZlcnkgY29tbW9uIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX2NvbW0gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKKyAgcmVnaXN0ZXIgY2hhciBjOworICByZWdpc3RlciBjaGFyICpwOworICBvZmZzZXRUIHRlbXA7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CisKKyNpZmRlZiBPQkpfRVZBWAorICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7CisgIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7CisgIHNlZ1QgbmV3X3NlZzsKKyNlbmRpZgorCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKnAgPSBjOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICAvKiBBbHBoYSBPU0YvMSBjb21waWxlciBkb2Vzbid0IHByb3ZpZGUgdGhlIGNvbW1hLCBnY2MgZG9lcy4gICovCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICB9CisgIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCisgICAgeworICAgICAgYXNfd2FybiAoXygiLkNPTU1vbiBsZW5ndGggKCVsZC4pIDwwISBJZ25vcmVkLiIpLCAobG9uZykgdGVtcCk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAqcCA9IDA7CisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKworI2lmZGVmIE9CSl9FVkFYCisgIC8qIE1ha2UgYSBzZWN0aW9uIGZvciB0aGUgY29tbW9uIHN5bWJvbC4gICovCisgIG5ld19zZWcgPSBzdWJzZWdfbmV3ICh4c3RyZHVwIChuYW1lKSwgMCk7CisjZW5kaWYKKworICAqcCA9IGM7CisKKyNpZmRlZiBPQkpfRVZBWAorICAvKiBhbGlnbm1lbnQgbWlnaHQgZm9sbG93ICAqLworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgb2Zmc2V0VCBhbGlnbjsKKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7ICAgICAgCisgICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VnLCBhbGlnbik7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCisgICAgeworICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIE9CSl9FVkFYCisgIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpID4gMCkKKyAgICB7IAorICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZykgIT0gdGVtcCkKKwlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKKwkJU19HRVRfTkFNRSAoc3ltYm9sUCksCisJCShsb25nKSBiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsIG5ld19zZWcpLAorCQkobG9uZykgdGVtcCk7CisgICAgfQorI2Vsc2UKKyAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKKyAgICB7CisgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHRlbXApCisJYXNfYmFkIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCisJCVNfR0VUX05BTUUgKHN5bWJvbFApLAorCQkobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLAorCQkobG9uZykgdGVtcCk7CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICB7CisjaWZkZWYgT0JKX0VWQVggCisgICAgICBzdWJzZWdfc2V0IChuZXdfc2VnLCAwKTsKKyAgICAgIHAgPSBmcmFnX21vcmUgKHRlbXApOworICAgICAgbmV3X3NlZy0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKKyAgICAgIGlmICghIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCisJc3ltYm9sUC0+YnN5bS0+c2VjdGlvbiA9IG5ld19zZWc7CisjZWxzZQorICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHRlbXApOworI2VuZGlmCisgICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisgICAgfQorCisjaWZkZWYgT0JKX0VWQVgKKyAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7CisjZW5kaWYKKworICBrbm93IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworI2VuZGlmIC8qICEgT0JKX0VMRiAqLworCisjaWZkZWYgT0JKX0VDT0ZGCisKKy8qIEhhbmRsZSB0aGUgLnJkYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKKyAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX3JkYXRhIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGludCB0ZW1wOworCisgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKKyAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7CisgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOworfQorCisjZW5kaWYKKworI2lmZGVmIE9CSl9FQ09GRgorCisvKiBIYW5kbGUgdGhlIC5zZGF0YSBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0CisgICBjbGVhcnMgYWxwaGFfaW5zbl9sYWJlbCBhbmQgcmVzdG9yZXMgYXV0byBhbGlnbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV9zZGF0YSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpbnQgdGVtcDsKKworICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHN1YnNlZ19uZXcgKCIuc2RhdGEiLCAwKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7CisgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOworICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgT0JKX0VMRgorCisvKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKKyAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX3NlY3Rpb24gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOworCisgIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOworICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKKyAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitzX2FscGhhX2VudCAoZHVtbXkpCisgICAgIGludCBkdW1teTsKK3sKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICBlY29mZl9kaXJlY3RpdmVfZW50ICgwKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWUsIG5hbWVfZW5kOworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgICAgIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCpuYW1lKSkKKwl7CisJICBhc193YXJuIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKKwkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3ltYm9sUyAqc3ltOworCisJICBpZiAoYWxwaGFfY3VyX2VudF9zeW0pCisJICAgIGFzX3dhcm4gKF8oIm5lc3RlZCAuZW50IGRpcmVjdGl2ZXMiKSk7CisKKwkgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCSAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisJICBhbHBoYV9jdXJfZW50X3N5bSA9IHN5bTsKKworCSAgLyogVGhlIC5lbnQgZGlyZWN0aXZlIGlzIHNvbWV0aW1lcyBmb2xsb3dlZCBieSBhIG51bWJlci4gIE5vdCBzdXJlCisJICAgICB3aGF0IGl0IHJlYWxseSBtZWFucywgYnV0IGlnbm9yZSBpdC4gICovCisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisJICAgIHsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICAgIH0KKwkgIGlmIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKKwkgICAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCX0KKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc19hbHBoYV9lbmQgKGR1bW15KQorICAgICBpbnQgZHVtbXk7Cit7CisgIGlmIChFQ09GRl9ERUJVR0dJTkcpCisgICAgZWNvZmZfZGlyZWN0aXZlX2VuZCAoMCk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpuYW1lLCBuYW1lX2VuZDsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgICAgICBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgqbmFtZSkpCisJeworCSAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7CisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN5bWJvbFMgKnN5bTsKKworCSAgc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworCSAgaWYgKHN5bSAhPSBhbHBoYV9jdXJfZW50X3N5bSkKKwkgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgZGlmZmVyZW50IHN5bWJvbCB0aGFuIC5lbnQiKSk7CisKKwkgIC8qIENyZWF0ZSBhbiBleHByZXNzaW9uIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24uICAqLworCSAgaWYgKHN5bSkKKwkgICAgeworCSAgICAgIHN5bS0+c3lfb2JqLnNpemUgPSAoZXhwcmVzc2lvblMgKikgeG1hbGxvYyAoc2l6ZW9mIChleHByZXNzaW9uUykpOworCSAgICAgIHN5bS0+c3lfb2JqLnNpemUtPlhfb3AgPSBPX3N1YnRyYWN0OworCSAgICAgIHN5bS0+c3lfb2JqLnNpemUtPlhfYWRkX3N5bWJvbAorCSAgICAgICAgPSBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7CisJICAgICAgc3ltLT5zeV9vYmouc2l6ZS0+WF9vcF9zeW1ib2wgPSBzeW07CisJICAgICAgc3ltLT5zeV9vYmouc2l6ZS0+WF9hZGRfbnVtYmVyID0gMDsKKwkgICAgfQorCisJICBhbHBoYV9jdXJfZW50X3N5bSA9IE5VTEw7CisKKwkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKwl9CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfbWFzayAoZnApCisgICAgIGludCBmcDsKK3sKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICB7CisgICAgICBpZiAoZnApCisgICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoMCk7CisgICAgICBlbHNlCisgICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrICgwKTsKKyAgICB9CisgIGVsc2UKKyAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfZnJhbWUgKGR1bW15KQorICAgICBpbnQgZHVtbXk7Cit7CisgIGlmIChFQ09GRl9ERUJVR0dJTkcpCisgICAgZWNvZmZfZGlyZWN0aXZlX2ZyYW1lICgwKTsKKyAgZWxzZQorICAgIGRpc2NhcmRfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorc19hbHBoYV9wcm9sb2d1ZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzeW1ib2xTICpzeW07CisgIGludCBhcmc7CisKKyAgYXJnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICBzeW0gPSBlY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpOworICBlbHNlCisgICAgc3ltID0gYWxwaGFfY3VyX2VudF9zeW07CisgIGtub3cgKHN5bSAhPSBOVUxMKTsKKworICBzd2l0Y2ggKGFyZykKKyAgICB7CisgICAgICBjYXNlIDA6IC8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KKwlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfTk9QVik7CisJYnJlYWs7CisgICAgICBjYXNlIDE6IC8qIFN0ZCBHUCBsb2FkLiAgKi8KKwlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk7CisJYnJlYWs7CisgICAgICBjYXNlIDI6IC8qIE5vbi1zdGQgdXNlIG9mIFBWLiAgKi8KKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwlhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIpLCBhcmcpOworCWJyZWFrOworICAgIH0gIAorfQorCitzdGF0aWMgdm9pZAorc19hbHBoYV9jb2ZmX3dyYXBwZXIgKHdoaWNoKQorICAgICBpbnQgd2hpY2g7Cit7CisgIHN0YXRpYyB2b2lkICgqIGNvbnN0IGZuc1tdKSBQQVJBTVMgKChpbnQpKSA9IHsKKyAgICBlY29mZl9kaXJlY3RpdmVfYmVnaW4sCisgICAgZWNvZmZfZGlyZWN0aXZlX2JlbmQsCisgICAgZWNvZmZfZGlyZWN0aXZlX2RlZiwKKyAgICBlY29mZl9kaXJlY3RpdmVfZGltLAorICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwKKyAgICBlY29mZl9kaXJlY3RpdmVfZmlsZSwKKyAgICBlY29mZl9kaXJlY3RpdmVfc2NsLAorICAgIGVjb2ZmX2RpcmVjdGl2ZV90YWcsCisgICAgZWNvZmZfZGlyZWN0aXZlX3ZhbCwKKyAgICBlY29mZl9kaXJlY3RpdmVfbG9jLAorICB9OworCisgIGFzc2VydCAod2hpY2ggPj0gMCAmJiB3aGljaCA8IHNpemVvZihmbnMpL3NpemVvZigqZm5zKSk7CisKKyAgaWYgKEVDT0ZGX0RFQlVHR0lORykKKyAgICAoKmZuc1t3aGljaF0pKDApOworICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9Cit9CisjZW5kaWYgLyogT0JKX0VMRiAqLworCisjaWZkZWYgT0JKX0VWQVgKKyAgCisvKiBIYW5kbGUgdGhlIHNlY3Rpb24gc3BlY2lmaWMgcHNldWRvLW9wLiAgKi8KKyAgCitzdGF0aWMgdm9pZAorc19hbHBoYV9zZWN0aW9uIChzZWNpZCkKKyAgICAgaW50IHNlY2lkOworeworICBpbnQgdGVtcDsKKyNkZWZpbmUgRVZBWF9TRUNUSU9OX0NPVU5UIDUKKyAgc3RhdGljIGNoYXIgKnNlY3Rpb25fbmFtZVtFVkFYX1NFQ1RJT05fQ09VTlQrMV0gPQorICAgIHsgIk5VTEwiLCAiLnJkYXRhIiwgIi5jb21tIiwgIi5saW5rIiwgIi5jdG9ycyIsICIuZHRvcnMiIH07CisKKyAgaWYgKChzZWNpZCA8PSAwKSB8fCAoc2VjaWQgPiBFVkFYX1NFQ1RJT05fQ09VTlQpKQorICAgIHsKKyAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgc3Vic2VnX25ldyAoc2VjdGlvbl9uYW1lW3NlY2lkXSwgMCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOworICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKKyAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Cit9CisKKworLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfZW50IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHN5bWJvbFMgKnN5bWJvbDsKKyAgZXhwcmVzc2lvblMgc3ltZXhwcjsKKworICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSAwOworICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPSAtMTsKKyAgYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSA9IDA7CisgIGFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0ID0gMDsKKyAgYWxwaGFfZXZheF9wcm9jLnJhX3NhdmUgPSBBWFBfUkVHX1JBOworICBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZSA9IC0xOworICBhbHBoYV9ldmF4X3Byb2MuaW1hc2sgPSAwOworICBhbHBoYV9ldmF4X3Byb2MuZm1hc2sgPSAwOworICBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUgPSAwOworICBhbHBoYV9ldmF4X3Byb2MudHlwZSA9IDA7CisKKyAgZXhwcmVzc2lvbiAoJnN5bWV4cHIpOworCisgIGlmIChzeW1leHByLlhfb3AgIT0gT19zeW1ib2wpCisgICAgeworICAgICAgYXNfZmF0YWwgKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmc3ltZXhwcik7CisgIHN5bWJvbC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworICBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID0gc3ltYm9sOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIHJldHVybjsKK30KKworCisvKiBQYXJzZSAuZnJhbWUgPGZyYW1yZWc+LDxmcmFtZXNpemU+LFJBLDxyc2Ffb2Zmc2V0PiBkaXJlY3RpdmVzLiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfZnJhbWUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgbG9uZyB2YWw7CisKKyAgYWxwaGFfZXZheF9wcm9jLmZyYW1lcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCisgICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDEuLzIuIHBhcmFtIikpOworICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplID0gdmFsOworCisgICh2b2lkKSB0Y19nZXRfcmVnaXN0ZXIgKDEpOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIDMuLzQuIHBhcmFtIikpOworICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitzX2FscGhhX3BkZXNjIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgbmFtZV9lbmQ7CisgIGxvbmcgdmFsOworICByZWdpc3RlciBjaGFyICpwOworICBleHByZXNzaW9uUyBleHA7CisgIHN5bWJvbFMgKmVudHJ5X3N5bTsKKyAgZml4UyAqZml4cDsKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoYWxwaGFfbGlua19zZWN0aW9uKTsKKworICBpZiAobm93X3NlZyAhPSBhbHBoYV9saW5rX3NlY3Rpb24pCisgICAgeworICAgICAgYXNfYmFkIChfKCIucGRlc2MgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICgoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCA9PSAwKQorICAgICAgfHwgKCFTX0lTX0RFRklORUQgKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpKSkKKyAgICB7CisgICAgICBhc19mYXRhbCAoXygiLnBkZXNjIGhhcyBubyBtYXRjaGluZyAuZW50IikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYWxwaGFfZXZheF9wcm9jLnN5bWJvbC0+c3lfb2JqID0gKHZhbHVlVClzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZTsKKworICBleHByZXNzaW9uICgmZXhwKTsKKyAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGVudHJ5X3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZleHApOworICAvKiBTYXZlIGJmZCBzeW1ib2wgb2YgcHJvYyBkZXNjIGluIGZ1bmN0aW9uIHN5bWJvbC4gICovCisgIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wtPmJzeW0tPnVkYXRhLnAgPSAoUFRSKWVudHJ5X3N5bS0+YnN5bTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIk5vIGNvbW1hIGFmdGVyIC5wZGVzYyA8ZW50cnluYW1lPiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICBpZiAoc3RybmNtcChuYW1lLCAic3RhY2siLCA1KSA9PSAwKQorICAgIHsKKyAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfRlBfU1RBQ0s7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJyZWciLCAzKSA9PSAwKQorICAgIHsKKyAgICAgIGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9IFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVI7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJudWxsIiwgNCkgPT0gMCkKKyAgICB7CisgICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX05VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfZmF0YWwgKF8oInVua25vd24gcHJvY2VkdXJlIGtpbmQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAorICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKKyNlbmRpZgorCisgIGZyYWdfYWxpZ24gKDMsIDAsIDApOworICBwID0gZnJhZ19tb3JlICgxNik7CisgIGZpeHAgPSBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAwLCAwLCAwLCAwKTsKKyAgZml4cC0+ZnhfZG9uZSA9IDE7CisgIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDE2OworCisgICpwID0gYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kCisgICAgICAgfCAoKGFscGhhX2V2YXhfcHJvYy5mcmFtZXJlZyA9PSAyOSkgPyBQRFNDX1NfTV9CQVNFX1JFR19JU19GUCA6IDApOworICAqKHArMSkgPSBQRFNDX1NfTV9OQVRJVkUKKwkgICB8IFBEU0NfU19NX05PX0pBQ0tFVDsKKworICBzd2l0Y2ggKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCkKKyAgICB7CisgICAgICBjYXNlIFBEU0NfU19LX0tJTkRfTlVMTDoKKwkqKHArMikgPSAwOworCSoocCszKSA9IDA7CisJYnJlYWs7CisgICAgICBjYXNlIFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVI6CisJKihwKzIpID0gYWxwaGFfZXZheF9wcm9jLmZwX3NhdmU7CisJKihwKzMpID0gYWxwaGFfZXZheF9wcm9jLnJhX3NhdmU7CisJYnJlYWs7CisgICAgICBjYXNlIFBEU0NfU19LX0tJTkRfRlBfU1RBQ0s6CisJbWRfbnVtYmVyX3RvX2NoYXJzIChwKzIsICh2YWx1ZVQpYWxwaGFfZXZheF9wcm9jLnJzYV9vZmZzZXQsIDIpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoJCS8qIGltcG9zc2libGUgKi8KKwlicmVhazsKKyAgICB9CisKKyAgKihwKzQpID0gMDsKKyAgKihwKzUpID0gYWxwaGFfZXZheF9wcm9jLnR5cGUgJiAweDBmOworCisgIC8qIFNpZ25hdHVyZSBvZmZzZXQuICAqLworICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNiwgKHZhbHVlVCkwLCAyKTsKKworICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAtZnJhZ19ub3ctPmZyX2xpdGVyYWwrOCwgOCwgJmV4cCwgMCwgQkZEX1JFTE9DXzY0KTsKKworICBpZiAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID09IFBEU0NfU19LX0tJTkRfTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogQWRkIGR1bW15IGZpeCB0byBtYWtlIGFkZF90b19saW5rX3Bvb2wgd29yay4gICovCisgIHAgPSBmcmFnX21vcmUgKDgpOworICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7CisgIGZpeHAtPmZ4X2RvbmUgPSAxOworICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OworCisgIC8qIHBkZXNjKzE2OiBTaXplLiAgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKWFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUsIDQpOworCisgIG1kX251bWJlcl90b19jaGFycyAocCs0LCAodmFsdWVUKTAsIDIpOworCisgIC8qIEVudHJ5IGxlbmd0aC4gICovCisgIG1kX251bWJlcl90b19jaGFycyAocCs2LCBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUsIDIpOworCisgIGlmIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPT0gUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUikKKyAgICByZXR1cm47CisKKyAgLyogQWRkIGR1bW15IGZpeCB0byBtYWtlIGFkZF90b19saW5rX3Bvb2wgd29yay4gICovCisgIHAgPSBmcmFnX21vcmUgKDgpOworICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7CisgIGZpeHAtPmZ4X2RvbmUgPSAxOworICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OworCisgIC8qIHBkZXNjKzI0OiByZWdpc3RlciBtYXNrcy4gICovCisKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBhbHBoYV9ldmF4X3Byb2MuaW1hc2ssIDQpOworICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNCwgYWxwaGFfZXZheF9wcm9jLmZtYXNrLCA0KTsKKworICByZXR1cm47Cit9CisKKworLyogU3VwcG9ydCBmb3IgY3Jhc2ggZGVidWcgb24gdm1zLiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfbmFtZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICByZWdpc3RlciBjaGFyICpwOworICBleHByZXNzaW9uUyBleHA7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKGFscGhhX2xpbmtfc2VjdGlvbik7CisKKyAgaWYgKG5vd19zZWcgIT0gYWxwaGFfbGlua19zZWN0aW9uKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiLm5hbWUgZGlyZWN0aXZlIG5vdCBpbiBsaW5rICgubGluaykgc2VjdGlvbiIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGV4cHJlc3Npb24gKCZleHApOworICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLm5hbWUgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBmcmFnX2FsaWduICgzLCAwLCAwKTsKKyAgcCA9IGZyYWdfbW9yZSAoOCk7CisgIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IDg7CisKKyAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAmZXhwLCAwLCBCRkRfUkVMT0NfNjQpOworCisgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZAorc19hbHBoYV9saW5rYWdlIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgY2hhciAqcDsKKworI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOworI2VuZGlmCisKKyAgZXhwcmVzc2lvbiAoJmV4cCk7CisgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKKyAgICB7CisgICAgICBhc19mYXRhbCAoXygiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHAgPSBmcmFnX21vcmUgKExLUF9TX0tfU0laRSk7CisgICAgICBtZW1zZXQgKHAsIDAsIExLUF9TX0tfU0laRSk7CisgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgTEtQX1NfS19TSVpFLCAmZXhwLCAwLFwKKwkJICAgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOworICAgIH0KKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK3NfYWxwaGFfY29kZV9hZGRyZXNzIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgY2hhciAqcDsKKworI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisgIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOworI2VuZGlmCisKKyAgZXhwcmVzc2lvbiAoJmV4cCk7CisgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKKyAgICB7CisgICAgICBhc19mYXRhbCAoXygiTm8gc3ltYm9sIGFmdGVyIC5jb2RlX2FkZHJlc3MiKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7CisgICAgICBtZW1zZXQgKHAsIDAsIDgpOworICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsICZleHAsIDAsXAorCQkgICBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOworICAgIH0KKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK3NfYWxwaGFfZnBfc2F2ZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworCisgIGFscGhhX2V2YXhfcHJvYy5mcF9zYXZlID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK3NfYWxwaGFfbWFzayAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBsb25nIHZhbDsKKworICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKKyAgICB7CisgICAgICBhc193YXJuIChfKCJCYWQgLm1hc2sgZGlyZWN0aXZlIikpOworICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYWxwaGFfZXZheF9wcm9jLmltYXNrID0gdmFsOworICAgICAgKHZvaWQpZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZAorc19hbHBoYV9mbWFzayAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBsb25nIHZhbDsKKworICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKKyAgICB7CisgICAgICBhc193YXJuIChfKCJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIpKTsKKyAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFscGhhX2V2YXhfcHJvYy5mbWFzayA9IHZhbDsKKyAgICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICB9CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorc19hbHBoYV9lbmQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciBjOworCisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wgPSAwOworCisgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZAorc19hbHBoYV9maWxlIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHN5bWJvbFMgKnM7CisgIGludCBsZW5ndGg7CisgIHN0YXRpYyBjaGFyIGNhc2VfaGFja1szMl07CisKKyAgZXh0ZXJuIGNoYXIgKmRlbWFuZF9jb3B5X3N0cmluZyBQQVJBTVMgKChpbnQgKmxlblApKTsKKworICBzcHJpbnRmIChjYXNlX2hhY2ssICI8Q0FTRTolMDFkJTAxZD4iLAorCSAgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcywgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jKTsKKworICBzID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoY2FzZV9oYWNrKTsKKyAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7CisKKyAgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHMgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChkZW1hbmRfY29weV9zdHJpbmcgKCZsZW5ndGgpKTsKKyAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZJTEU7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyAgcmV0dXJuOworfQorI2VuZGlmIC8qIE9CSl9FVkFYICAqLworCisvKiBIYW5kbGUgdGhlIC5ncHJlbDMyIHBzZXVkbyBvcC4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX2dwcmVsMzIgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgZXhwcmVzc2lvblMgZTsKKyAgY2hhciAqcDsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGV4cHJlc3Npb24gKCZlKTsKKworI2lmZGVmIE9CSl9FTEYKKyAgc3dpdGNoIChlLlhfb3ApCisgICAgeworICAgIGNhc2UgT19jb25zdGFudDoKKyAgICAgIGUuWF9hZGRfc3ltYm9sID0gc2VjdGlvbl9zeW1ib2woYWJzb2x1dGVfc2VjdGlvbik7CisgICAgICBlLlhfb3AgPSBPX3N5bWJvbDsKKyAgICAgIC8qIEZBTExUSFJVICovCisgICAgY2FzZSBPX3N5bWJvbDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KKyNlbHNlCisjaWZkZWYgT0JKX0VDT0ZGCisgIHN3aXRjaCAoZS5YX29wKQorICAgIHsKKyAgICBjYXNlIE9fY29uc3RhbnQ6CisgICAgICBlLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgT19zeW1ib2w6CisgICAgICBlLlhfb3AgPSBPX3N1YnRyYWN0OworICAgICAgZS5YX29wX3N5bWJvbCA9IGFscGhhX2dwX3N5bWJvbDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCAyKQorICAgIGFscGhhX2FsaWduICgyLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKKyAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiAyKQorICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAyOworICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKKworICBwID0gZnJhZ19tb3JlICg0KTsKKyAgbWVtc2V0IChwLCAwLCA0KTsKKyAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAorCSAgICAgICAmZSwgMCwgQkZEX1JFTE9DX0dQUkVMMzIpOworfQorCisvKiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLiAgVGhpcyBpcyBsaWtlIHRoZQorICAgZ2VuZXJpYyB2cmVzaW9uLCBidXQgaXQgbWFrZXMgc3VyZSB0aGUgY3VycmVudCBsYWJlbCwgaWYgYW55LCBpcworICAgY29ycmVjdGx5IGFsaWduZWQuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV9mbG9hdF9jb25zICh0eXBlKQorICAgICBpbnQgdHlwZTsKK3sKKyAgaW50IGxvZ19zaXplOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICAgIGxvZ19zaXplID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAnRyc6CisgICAgICBsb2dfc2l6ZSA9IDM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorICAgICAgbG9nX3NpemUgPSA0OworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChhbHBoYV9hdXRvX2FsaWduX29uICYmIGFscGhhX2N1cnJlbnRfYWxpZ24gPCBsb2dfc2l6ZSkKKyAgICBhbHBoYV9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOworICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IGxvZ19zaXplKQorICAgIGFscGhhX2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKKyAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7CisKKyAgZmxvYXRfY29ucyAodHlwZSk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLnByb2MgcHNldWRvIG9wLiAgV2UgZG9uJ3QgcmVhbGx5IGRvIG11Y2ggd2l0aCBpdCBleGNlcHQKKyAgIHBhcnNlIGl0LiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfcHJvYyAoaXNfc3RhdGljKQorICAgICBpbnQgaXNfc3RhdGljOworeworICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGNoYXIgKnA7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisgIGludCB0ZW1wOworCisgIC8qIFRha2VzICIucHJvYyBuYW1lLG5hcmdzIiAgKi8KKyAgU0tJUF9XSElURVNQQUNFICgpOworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKnAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICAqcCA9IDA7CisgICAgICBhc193YXJuIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKKyAgICAgICpwID0gYzsKKyAgICAgIHRlbXAgPSAwOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICB9CisgIC8qICBzeW1ib2xQLT5zeV9vdGhlciA9IChzaWduZWQgY2hhcikgdGVtcDsgKi8KKyAgYXNfd2FybiAoXygidW5oYW5kbGVkOiAucHJvYyAlcywlZCIpLCBuYW1lLCB0ZW1wKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkbyBvcC4gIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIGFuZCBvZmYgbW9zdCBvZgorICAgdGhlIGFzc2VtYmxlciBmZWF0dXJlcy4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX3NldCAoeCkKKyAgICAgaW50IHg7Cit7CisgIGNoYXIgKm5hbWUsIGNoLCAqczsKKyAgaW50IHllc25vID0gMTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGNoID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgcyA9IG5hbWU7CisgIGlmIChzWzBdID09ICduJyAmJiBzWzFdID09ICdvJykKKyAgICB7CisgICAgICB5ZXNubyA9IDA7CisgICAgICBzICs9IDI7CisgICAgfQorICBpZiAoIXN0cmNtcCAoInJlb3JkZXIiLCBzKSkKKyAgICAvKiBpZ25vcmUgKi8gOworICBlbHNlIGlmICghc3RyY21wICgiYXQiLCBzKSkKKyAgICBhbHBoYV9ub2F0X29uID0gIXllc25vOworICBlbHNlIGlmICghc3RyY21wICgibWFjcm8iLCBzKSkKKyAgICBhbHBoYV9tYWNyb3Nfb24gPSB5ZXNubzsKKyAgZWxzZSBpZiAoIXN0cmNtcCAoIm1vdmUiLCBzKSkKKyAgICAvKiBpZ25vcmUgKi8gOworICBlbHNlIGlmICghc3RyY21wICgidm9sYXRpbGUiLCBzKSkKKyAgICAvKiBpZ25vcmUgKi8gOworICBlbHNlCisgICAgYXNfd2FybiAoXygiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIiksIG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAuYmFzZSBwc2V1ZG8gb3AuICBUaGlzIGNoYW5nZXMgdGhlIGFzc2VtYmxlcidzIG5vdGlvbiBvZgorICAgdGhlICRncCByZWdpc3Rlci4gICovCisKK3N0YXRpYyB2b2lkCitzX2FscGhhX2Jhc2UgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyNpZiAwCisgIGlmIChmaXJzdF8zMmJpdF9xdWFkcmFudCkKKyAgICB7CisgICAgICAvKiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kICovCisgICAgICBhc193YXJuIChfKCJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iKSk7CisgICAgICBmaXJzdF8zMmJpdF9xdWFkcmFudCA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCisgICAgewkJCQkvKiAkck5OIGZvcm0gKi8KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3InKQorCWlucHV0X2xpbmVfcG9pbnRlcisrOworICAgIH0KKworICBhbHBoYV9ncF9yZWdpc3RlciA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBpZiAoYWxwaGFfZ3BfcmVnaXN0ZXIgPCAwIHx8IGFscGhhX2dwX3JlZ2lzdGVyID4gMzEpCisgICAgeworICAgICAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOworICAgICAgYXNfd2FybiAoXygiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iKSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIEl0CisgICBhbHNvIGFkanVzdHMgYW55IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbGFiZWwuICBXZSB0cmVhdCB0aGlzIHRoZSBzYW1lCisgICB3YXkgdGhlIE1JUFMgcG9ydCBkb2VzOiAuYWxpZ24gMCB0dXJucyBvZmYgYXV0byBhbGlnbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV9hbGlnbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpbnQgYWxpZ247CisgIGNoYXIgZmlsbCwgKnBmaWxsOworICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKKworICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQorICAgIHsKKyAgICAgIGFsaWduID0gbWF4X2FsaWdubWVudDsKKyAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQiKSwgYWxpZ24pOworICAgIH0KKyAgZWxzZSBpZiAoYWxpZ24gPCAwKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIikpOworICAgICAgYWxpZ24gPSAwOworICAgIH0KKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBwZmlsbCA9ICZmaWxsOworICAgIH0KKyAgZWxzZQorICAgIHBmaWxsID0gTlVMTDsKKworICBpZiAoYWxpZ24gIT0gMCkKKyAgICB7CisgICAgICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKKyAgICAgIGFscGhhX2FsaWduIChhbGlnbiwgcGZpbGwsIGFscGhhX2luc25fbGFiZWwsIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIb29rIHRoZSBub3JtYWwgc3RyaW5nIHByb2Nlc3NvciB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV9zdHJpbmdlciAodGVybWluYXRlKQorICAgICBpbnQgdGVybWluYXRlOworeworICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKKyAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7CisgIHN0cmluZ2VyICh0ZXJtaW5hdGUpOworfQorCisvKiBIb29rIHRoZSBub3JtYWwgc3BhY2UgcHJvY2Vzc2luZyB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV9zcGFjZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKKyAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7CisgIHNfc3BhY2UgKGlnbm9yZSk7Cit9CisKKy8qIEhvb2sgaW50byBjb25zIGZvciBhdXRvLWFsaWdubWVudC4gICovCisKK3ZvaWQKK2FscGhhX2NvbnNfYWxpZ24gKHNpemUpCisgICAgIGludCBzaXplOworeworICBpbnQgbG9nX3NpemU7CisKKyAgbG9nX3NpemUgPSAwOworICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCisgICAgKytsb2dfc2l6ZTsKKworICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCisgICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKKyAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKKyAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7CisgIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOworfQorCisvKiBIZXJlIGNvbWUgdGhlIC51d29yZCwgLnVsb25nLCBhbmQgLnVxdWFkIGV4cGxpY2l0bHkgdW5hbGlnbmVkCisgICBwc2V1ZG9zLiAgV2UganVzdCB0dXJuIG9mZiBhdXRvLWFsaWdubWVudCBhbmQgY2FsbCBkb3duIHRvIGNvbnMuICAqLworCitzdGF0aWMgdm9pZAorc19hbHBoYV91Y29ucyAoYnl0ZXMpCisgICAgIGludCBieXRlczsKK3sKKyAgaW50IGhvbGQgPSBhbHBoYV9hdXRvX2FsaWduX29uOworICBhbHBoYV9hdXRvX2FsaWduX29uID0gMDsKKyAgY29ucyAoYnl0ZXMpOworICBhbHBoYV9hdXRvX2FsaWduX29uID0gaG9sZDsKK30KKworLyogU3dpdGNoIHRoZSB3b3JraW5nIGNwdSB0eXBlLiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWxwaGFfYXJjaCAoaWdub3JlZCkKKyAgICAgaW50IGlnbm9yZWQ7Cit7CisgIGNoYXIgKm5hbWUsIGNoOworICBjb25zdCBzdHJ1Y3QgY3B1X3R5cGUgKnA7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjaCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQorICAgIGlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKKwlnb3RvIGZvdW5kOworICAgICAgfQorICBhc193YXJuKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciLCBuYW1lKTsKKworZm91bmQ6CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworDAorCisjaWZkZWYgREVCVUcxCisvKiBwcmludCB0b2tlbiBleHByZXNzaW9uIHdpdGggYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2FscGhhX3ByaW50X3Rva2VuKGYsIGV4cCkKKyAgICBGSUxFICpmOworICAgIGNvbnN0IGV4cHJlc3Npb25TICpleHA7Cit7CisgIHN3aXRjaCAoZXhwLT5YX29wKQorICAgIHsKKyAgICAgIGNhc2UgT19jcHJlZ2lzdGVyOgorCXB1dGMgKCcsJywgZik7CisJLyogRkFMTFRIUlUgKi8KKyAgICAgIGNhc2UgT19wcmVnaXN0ZXI6CisJcHV0YyAoJygnLCBmKTsKKwl7CisJICBleHByZXNzaW9uUyBuZXhwID0gKmV4cDsKKwkgIG5leHAuWF9vcCA9IE9fcmVnaXN0ZXI7CisJICBwcmludF9leHByIChmLCAmbmV4cCk7CisJfQorCXB1dGMgKCcpJywgZik7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXByaW50X2V4cHIgKGYsIGV4cCk7CisJYnJlYWs7CisgICAgfQorICByZXR1cm47Cit9CisjZW5kaWYKKwwKKy8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KKworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyNpZmRlZiBPQkpfRUNPRkYKKyAgeyJjb21tIiwgc19hbHBoYV9jb21tLCAwfSwJLyogb3NmMSBjb21waWxlciBkb2VzIHRoaXMgKi8KKyAgeyJyZGF0YSIsIHNfYWxwaGFfcmRhdGEsIDB9LAorI2VuZGlmCisgIHsidGV4dCIsIHNfYWxwaGFfdGV4dCwgMH0sCisgIHsiZGF0YSIsIHNfYWxwaGFfZGF0YSwgMH0sCisjaWZkZWYgT0JKX0VDT0ZGCisgIHsic2RhdGEiLCBzX2FscGhhX3NkYXRhLCAwfSwKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgeyJzZWN0aW9uIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKKyAgeyJzZWN0aW9uLnMiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAorICB7InNlY3QiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAorICB7InNlY3QucyIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCisjZW5kaWYKKyNpZmRlZiBPQkpfRVZBWAorICB7ICJwZGVzYyIsIHNfYWxwaGFfcGRlc2MsIDB9LAorICB7ICJuYW1lIiwgc19hbHBoYV9uYW1lLCAwfSwKKyAgeyAibGlua2FnZSIsIHNfYWxwaGFfbGlua2FnZSwgMH0sCisgIHsgImNvZGVfYWRkcmVzcyIsIHNfYWxwaGFfY29kZV9hZGRyZXNzLCAwfSwKKyAgeyAiZW50Iiwgc19hbHBoYV9lbnQsIDB9LAorICB7ICJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAorICB7ICJmcF9zYXZlIiwgc19hbHBoYV9mcF9zYXZlLCAwfSwKKyAgeyAibWFzayIsIHNfYWxwaGFfbWFzaywgMH0sCisgIHsgImZtYXNrIiwgc19hbHBoYV9mbWFzaywgMH0sCisgIHsgImVuZCIsIHNfYWxwaGFfZW5kLCAwfSwKKyAgeyAiZmlsZSIsIHNfYWxwaGFfZmlsZSwgMH0sCisgIHsgInJkYXRhIiwgc19hbHBoYV9zZWN0aW9uLCAxfSwKKyAgeyAiY29tbSIsIHNfYWxwaGFfY29tbSwgMH0sCisgIHsgImxpbmsiLCBzX2FscGhhX3NlY3Rpb24sIDN9LAorICB7ICJjdG9ycyIsIHNfYWxwaGFfc2VjdGlvbiwgNH0sCisgIHsgImR0b3JzIiwgc19hbHBoYV9zZWN0aW9uLCA1fSwKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgLyogRnJhbWUgcmVsYXRlZCBwc2V1ZG9zLiAgKi8KKyAgeyJlbnQiLCBzX2FscGhhX2VudCwgMH0sCisgIHsiZW5kIiwgc19hbHBoYV9lbmQsIDB9LAorICB7Im1hc2siLCBzX2FscGhhX21hc2ssIDB9LAorICB7ImZtYXNrIiwgc19hbHBoYV9tYXNrLCAxfSwKKyAgeyJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAorICB7InByb2xvZ3VlIiwgc19hbHBoYV9wcm9sb2d1ZSwgMH0sCisgIC8qIENPRkYgZGVidWdnaW5nIHJlbGF0ZWQgcHNldWRvcy4gICovCisgIHsiYmVnaW4iLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMH0sCisgIHsiYmVuZCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAxfSwKKyAgeyJkZWYiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMn0sCisgIHsiZGltIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDN9LAorICB7ImVuZGVmIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDR9LAorICB7ImZpbGUiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgNX0sCisgIHsic2NsIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDZ9LAorICB7InRhZyIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA3fSwKKyAgeyJ2YWwiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgOH0sCisgIHsibG9jIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDl9LAorI2Vsc2UKKyAgeyJwcm9sb2d1ZSIsIHNfaWdub3JlLCAwfSwKKyNlbmRpZgorICB7ImdwcmVsMzIiLCBzX2FscGhhX2dwcmVsMzIsIDB9LAorICB7InRfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCisgIHsic19mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKKyAgeyJmX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRid9LAorICB7ImdfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdHJ30sCisgIHsiZF9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0QnfSwKKworICB7InByb2MiLCBzX2FscGhhX3Byb2MsIDB9LAorICB7ImFwcm9jIiwgc19hbHBoYV9wcm9jLCAxfSwKKyAgeyJzZXQiLCBzX2FscGhhX3NldCwgMH0sCisgIHsicmVndXNlIiwgc19pZ25vcmUsIDB9LAorICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCisgIHsiYmFzZSIsIHNfYWxwaGFfYmFzZSwgMH0sCQkvKj8/Ki8KKyAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCisgIHsiYWVudCIsIHNfaWdub3JlLCAwfSwKKyAgeyJ1Z2VuIiwgc19pZ25vcmUsIDB9LAorICB7ImVmbGFnIiwgc19pZ25vcmUsIDB9LAorCisgIHsiYWxpZ24iLCBzX2FscGhhX2FsaWduLCAwfSwKKyAgeyJkb3VibGUiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCisgIHsiZmxvYXQiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCisgIHsic2luZ2xlIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAorICB7ImFzY2lpIiwgc19hbHBoYV9zdHJpbmdlciwgMH0sCisgIHsiYXNjaXoiLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKKyAgeyJzdHJpbmciLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKKyAgeyJzcGFjZSIsIHNfYWxwaGFfc3BhY2UsIDB9LAorICB7InNraXAiLCBzX2FscGhhX3NwYWNlLCAwfSwKKyAgeyJ6ZXJvIiwgc19hbHBoYV9zcGFjZSwgMH0sCisKKy8qIFVuYWxpZ25lZCBkYXRhIHBzZXVkb3MuICAqLworICB7InV3b3JkIiwgc19hbHBoYV91Y29ucywgMn0sCisgIHsidWxvbmciLCBzX2FscGhhX3Vjb25zLCA0fSwKKyAgeyJ1cXVhZCIsIHNfYWxwaGFfdWNvbnMsIDh9LAorCisjaWZkZWYgT0JKX0VMRgorLyogRHdhcmYgd2FudHMgdGhlc2UgdmVyc2lvbnMgb2YgdW5hbGlnbmVkLiAgKi8KKyAgeyIyYnl0ZSIsIHNfYWxwaGFfdWNvbnMsIDJ9LAorICB7IjRieXRlIiwgc19hbHBoYV91Y29ucywgNH0sCisgIHsiOGJ5dGUiLCBzX2FscGhhX3Vjb25zLCA4fSwKKyNlbmRpZgorCisvKiBXZSBkb24ndCBkbyBhbnkgb3B0aW1pemluZywgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlc2UuICAqLworICB7Im5vYWxpYXMiLCBzX2lnbm9yZSwgMH0sCisgIHsiYWxpYXMiLCBzX2lnbm9yZSwgMH0sCisKKyAgeyJhcmNoIiwgc19hbHBoYV9hcmNoLCAwfSwKKworICB7TlVMTCwgMCwgMH0sCit9OworCisMCisvKiBCdWlsZCBhIEJGRCBzZWN0aW9uIHdpdGggaXRzIGZsYWdzIHNldCBhcHByb3ByaWF0ZWx5IGZvciB0aGUgLmxpdGEsCisgICAubGl0OCwgb3IgLmxpdDQgc2VjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAobmFtZSwgc2VjcCwgc3ltcCkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgc2VnVCAqc2VjcDsKKyAgICAgc3ltYm9sUyAqKnN5bXA7Cit7CisgIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKKyAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKKyAgc2VnVCBuZXdfc2VjOworCisgICpzZWNwID0gbmV3X3NlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOworICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKKyAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VjLCA0KTsKKyAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWMsCisJCQkgU0VDX1JFTE9DIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKKwkJCSB8IFNFQ19EQVRBKTsKKworICBTX0NMRUFSX0VYVEVSTkFMICgqc3ltcCA9IHNlY3Rpb25fc3ltYm9sIChuZXdfc2VjKSk7Cit9CisKKyNpZmRlZiBPQkpfRUNPRkYKKworLyogQEBAIEdQIHNlbGVjdGlvbiB2b29kb28uICBBbGwgb2YgdGhpcyBzZWVtcyBvdmVybHkgY29tcGxpY2F0ZWQgYW5kCisgICB1bm5lY2Vzc2FyeTsgd2hpY2ggaXMgdGhlIHByaW1hcnkgcmVhc29uIGl0J3MgZm9yIEVDT0ZGIG9ubHkuICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK21heWJlX3NldF9ncCAoc2VjKQorICAgICBhc2VjdGlvbiAqc2VjOworeworICBiZmRfdm1hIHZtYTsKKyAgaWYgKCFzZWMpCisgICAgcmV0dXJuOworICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChmb28sIHNlYyk7CisgIGlmICh2bWEgJiYgdm1hIDwgYWxwaGFfZ3BfdmFsdWUpCisgICAgYWxwaGFfZ3BfdmFsdWUgPSB2bWE7Cit9CisKK3N0YXRpYyB2b2lkCitzZWxlY3RfZ3BfdmFsdWUgKCkKK3sKKyAgYXNzZXJ0IChhbHBoYV9ncF92YWx1ZSA9PSAwKTsKKworICAvKiBHZXQgbWludXMtb25lIGluIHdoYXRldmVyIHdpZHRoLi4uICAqLworICBhbHBoYV9ncF92YWx1ZSA9IDA7IGFscGhhX2dwX3ZhbHVlLS07CisKKyAgLyogU2VsZWN0IHRoZSBzbWFsbGVzdCBWTUEgb2YgdGhlc2UgZXhpc3Rpbmcgc2VjdGlvbnMuICAqLworICBtYXliZV9zZXRfZ3AgKGFscGhhX2xpdGFfc2VjdGlvbik7CisjaWYgMAorICAvKiBUaGVzZSB3ZXJlIGRpc2FibGVkIGJlZm9yZSAtLSBzaG91bGQgd2UgdXNlIHRoZW0/ICAqLworICBtYXliZV9zZXRfZ3AgKHNkYXRhKTsKKyAgbWF5YmVfc2V0X2dwIChsaXQ4X3NlYyk7CisgIG1heWJlX3NldF9ncCAobGl0NF9zZWMpOworI2VuZGlmCisKKy8qIEBAIFdpbGwgYSBzaW1wbGUgMHg4MDAwIHdvcmsgaGVyZT8gIElmIG5vdCwgd2h5IG5vdD8gICovCisjZGVmaW5lIEdQX0FESlVTVE1FTlQJKDB4ODAwMCAtIDB4MTApCisKKyAgYWxwaGFfZ3BfdmFsdWUgKz0gR1BfQURKVVNUTUVOVDsKKworICBTX1NFVF9WQUxVRSAoYWxwaGFfZ3Bfc3ltYm9sLCBhbHBoYV9ncF92YWx1ZSk7CisKKyNpZmRlZiBERUJVRzEKKyAgcHJpbnRmIChfKCJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIpLCBhbHBoYV9ncF92YWx1ZSk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KKworLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKKyAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKKyAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ24KKyAgIGZlYXR1cmUgd3J0IGxhYmVscy4gICovCisKK3N0YXRpYyB2b2lkCithbHBoYV9hbGlnbiAobiwgcGZpbGwsIGxhYmVsLCBmb3JjZSkKKyAgICAgaW50IG47CisgICAgIGNoYXIgKnBmaWxsOworICAgICBzeW1ib2xTICpsYWJlbDsKKyAgICAgaW50IGZvcmNlOworeworICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+PSBuKQorICAgIHJldHVybjsKKworICBpZiAocGZpbGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobiA+IDIKKwkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKKwl7CisJICBzdGF0aWMgY2hhciBjb25zdCB1bm9wWzRdID0geyAweDAwLCAweDAwLCAweGUwLCAweDJmIH07CisJICBzdGF0aWMgY2hhciBjb25zdCBub3B1bm9wWzhdID0geworCQkweDFmLCAweDA0LCAweGZmLCAweDQ3LAorCQkweDAwLCAweDAwLCAweGUwLCAweDJmCisJICB9OworCisJICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCisJICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIGludG8gdGhlIHRleHQKKwkgICAgIHNlY3Rpb24uICBUaGUgREVDIGFzc2VtYmxlciBzaWxlbnRseSBmaWxscyB3aXRoIHVuYWxpZ25lZAorCSAgICAgbm8tb3AgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3aWxsIHplcm8tZmlsbCwgdGhlbiBub3AtZmlsbAorCSAgICAgd2l0aCBwcm9wZXIgYWxpZ25tZW50LiAgKi8KKwkgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKKwkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CisJICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDMpCisJICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMywgdW5vcCwgc2l6ZW9mIHVub3AsIDApOworCSAgaWYgKG4gPiAzKQorCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcHVub3AsIHNpemVvZiBub3B1bm9wLCAwKTsKKwl9CisgICAgICBlbHNlCisJZnJhZ19hbGlnbiAobiwgMCwgMCk7CisgICAgfQorICBlbHNlCisgICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKKworICBhbHBoYV9jdXJyZW50X2FsaWduID0gbjsKKworICBpZiAobGFiZWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKKyAgICAgIGxhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgICAgICBTX1NFVF9WQUxVRSAobGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisgICAgfQorCisgIHJlY29yZF9hbGlnbm1lbnQobm93X3NlZywgbik7CisKKyAgLyogPz8/IGlmIGFscGhhX2ZsYWdfcmVsYXggJiYgZm9yY2UgJiYgZWxmLCByZWNvcmQgdGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKKyAgICAgaW4gYSByZWxvYyBmb3IgdGhlIGxpbmtlciB0byBzZWUuICAqLworfQorCisvKiBUaGUgQWxwaGEgaGFzIHN1cHBvcnQgZm9yIHNvbWUgVkFYIGZsb2F0aW5nIHBvaW50IHR5cGVzLCBhcyB3ZWxsIGFzIGZvcgorICAgSUVFRSBmbG9hdGluZyBwb2ludC4gIFdlIGNvbnNpZGVyIElFRUUgdG8gYmUgdGhlIHByaW1hcnkgZmxvYXRpbmcgcG9pbnQKKyAgIGZvcm1hdCwgYW5kIHNuZWFrIGluIHRoZSBWQVggZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBoZXJlLiAgKi8KKyNkZWZpbmUgbWRfYXRvZiB2YXhfbWRfYXRvZgorI2luY2x1ZGUgImNvbmZpZy9hdG9mLXZheC5jIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjkwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWFscGhhLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIFRoaXMgZmlsZSBpcyB0Yy1hbHBoYS5oCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQ19BTFBIQQorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKyNkZWZpbmUgVEFSR0VUX0FSQ0gJCQliZmRfYXJjaF9hbHBoYQorCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCVwKKwkJICAgICAgID8gImVjb2ZmLWxpdHRsZWFscGhhIgkJCQlcCisJCSAgICAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cglcCisJCSAgICAgICA/ICJlbGY2NC1hbHBoYSIJCQkJCVwKKwkJICAgICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cglcCisJCSAgICAgICA/ICJ2bXMtYWxwaGEiCQkJCQlcCisJCSAgICAgICA6ICJ1bmtub3duLWZvcm1hdCIpCisKKyNkZWZpbmUgTkVFRF9MSVRFUkFMX1BPT0wKKyNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCisjZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCisKK2V4dGVybiBpbnQgYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKK2V4dGVybiBpbnQgYWxwaGFfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7CitleHRlcm4gdmFsdWVUIGFscGhhX2dwX3ZhbHVlOworCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkJYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoRklYUCkKKyNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCWFscGhhX2ZpeF9hZGp1c3RhYmxlIChGSVhQKQorI2RlZmluZSBSRUxPQ19SRVFVSVJFU19TWU1CT0wKKworLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbAorICAgb2JqZWN0IGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuCisgICBUcnVlIGlmIHdlIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nCisgICB0aGUgLm8gZmlsZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucy4gICovCisKKyNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQkJXAorICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKKyAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCisgICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJXAorICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKKyAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKKworI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQlhc19mYXRhbCAoImFscGhhIGNvbnZlcnRfZnJhZ1xuIikKKyNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCisJCQkoYXNfZmF0YWwoImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpLDEpCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKworI2lmZGVmIE9CSl9FVkFYCisKKy8qIFRoaXMgZmllbGQga2VlcHMgdGhlIHN5bWJvbHMgcG9zaXRpb24gaW4gdGhlIGxpbmsgc2VjdGlvbi4gICovCisjZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHZhbHVlVAorCisjZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLE9GRixMRU4sRVhQKSBcCisgICAgICBmaXhfbmV3X2V4cCAoRlJBRywgT0ZGLCAoaW50KUxFTiwgRVhQLCAwLCBcCisJTEVOID09IDIgPyBCRkRfUkVMT0NfMTYgXAorCTogTEVOID09IDQgPyBCRkRfUkVMT0NfMzIgXAorCTogTEVOID09IDggPyBCRkRfUkVMT0NfNjQgXAorCTogQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOworI2VuZGlmCisKKyNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCisKK2V4dGVybiBpbnQgdGNfZ2V0X3JlZ2lzdGVyIFBBUkFNUyAoKGludCBmcmFtZSkpOworZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9lY29mZl9kYXRhIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCitleHRlcm4gdm9pZCBhbHBoYV9kZWZpbmVfbGFiZWwgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CisKKyNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIGFscGhhX2NvbnNfYWxpZ24gKG5ieXRlcykKK2V4dGVybiB2b2lkIGFscGhhX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7CisKKyNpZmRlZiBPQkpfRUNPRkYKKyNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QoKSBhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQorZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOworI2VuZGlmCisKKyNkZWZpbmUgRElGRl9FWFBSX09LICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KKworI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAorICB7ICIuc2RhdGEiLCAgIFNIVF9QUk9HQklUUywgICBTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfQUxQSEFfR1BSRUwgIH0sIFwKKyAgeyAiLnNic3MiLCAgICBTSFRfTk9CSVRTLCAgICAgU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0FMUEhBX0dQUkVMICB9LAorI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1hcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdjMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1hcmMuYwpAQCAtMCwwICsxLDE0ODEgQEAKKy8qIHRjLWFyYy5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEFSQworICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCisjaW5jbHVkZSAiZWxmL2FyYy5oIgorCitleHRlcm4gaW50IGFyY19nZXRfbWFjaCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIGFyY19pbnNuIGFyY19pbnNlcnRfb3BlcmFuZCBQQVJBTVMgKChhcmNfaW5zbiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqLCBpbnQsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKiwKKwkJCQkJICAgIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgdm9pZCBhcmNfY29tbW9uIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgYXJjX2NwdSBQQVJBTVMgKChpbnQpKTsKKy8qc3RhdGljIHZvaWQgYXJjX3JlbmFtZSBQQVJBTVMgKChpbnQpKTsqLworc3RhdGljIGludCBnZXRfYXJjX2V4cF9yZWxvY190eXBlIFBBUkFNUyAoKGludCwgaW50LCBleHByZXNzaW9uUyAqLAorCQkJCQkgICBleHByZXNzaW9uUyAqKSk7CisKK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsgImFsaWduIiwgc19hbGlnbl9ieXRlcywgMCB9LAkvKiBEZWZhdWx0aW5nIGlzIGludmFsaWQgKDApICovCisgIHsgImNvbW1vbiIsIGFyY19jb21tb24sIDAgfSwKKy8qeyAiaHdvcmQiLCBjb25zLCAyIH0sIC0gYWxyZWFkeSBleGlzdHMgKi8KKyAgeyAid29yZCIsIGNvbnMsIDQgfSwKKy8qeyAieHdvcmQiLCBjb25zLCA4IH0sKi8KKyAgeyAiY3B1IiwgYXJjX2NwdSwgMCB9LAorLyp7ICJyZW5hbWUiLCBhcmNfcmVuYW1lLCAwIH0sKi8KKyAgeyBOVUxMLCAwLCAwIH0sCit9OworCisvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKKyAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIzsiOworCisvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJworICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCisvKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKKyAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLworLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzCisgICB3b3JrIGlmICcvJyBpc24ndCBvdGhlcndpc2UgZGVmaW5lZC4gKi8KK2NvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7CisKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBBcyBpbiAwZjEyLjQ1NiAqLworLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZEQiOworCisvKiBCeXRlIG9yZGVyLiAgKi8KK2V4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Citjb25zdCBjaGFyICphcmNfdGFyZ2V0X2Zvcm1hdCA9IERFRkFVTFRfVEFSR0VUX0ZPUk1BVDsKK3N0YXRpYyBpbnQgYnl0ZV9vcmRlciA9IERFRkFVTFRfQllURV9PUkRFUjsKKworLyogT25lIG9mIGJmZF9tYWNoX2FyY194eHguICAqLworc3RhdGljIGludCBhcmNfbWFjaF90eXBlID0gYmZkX21hY2hfYXJjX2Jhc2U7CisKKy8qIE5vbi16ZXJvIGlmIHRoZSBjcHUgdHlwZSBoYXMgYmVlbiBleHBsaWNpdGx5IHNwZWNpZmllZC4gICovCitzdGF0aWMgaW50IG1hY2hfdHlwZV9zcGVjaWZpZWRfcCA9IDA7CisKKy8qIE5vbi16ZXJvIGlmIG9wY29kZSB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgorICAgQSAuY3B1IGNvbW1hbmQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBpbnN0cnVjdGlvbnMuICAqLworc3RhdGljIGludCBjcHVfdGFibGVzX2luaXRfcCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphcmNfc3VmZml4X2hhc2ggPSBOVUxMOworDAorY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7CitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQoreworI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMCkKKyAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUJ9LAorI2RlZmluZSBPUFRJT05fRUwgKE9QVElPTl9NRF9CQVNFICsgMSkKKyAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAorICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOworCisvKgorICogbWRfcGFyc2Vfb3B0aW9uCisgKgorICogSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KKyAqIFNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4KKyAqLworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgT1BUSU9OX0VCOgorICAgICAgYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47CisgICAgICBhcmNfdGFyZ2V0X2Zvcm1hdCA9ICJlbGYzMi1iaWdhcmMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fRUw6CisgICAgICBieXRlX29yZGVyID0gTElUVExFX0VORElBTjsKKyAgICAgIGFyY190YXJnZXRfZm9ybWF0ID0gImVsZjMyLWxpdHRsZWFyYyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorQVJDIG9wdGlvbnM6XG5cCistRUIJCQlnZW5lcmF0ZSBiaWcgZW5kaWFuIG91dHB1dFxuXAorLUVMCQkJZ2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIpKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAorICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuCisgICBPcGNvZGUgc2VsZWN0aW9uIGlzIGRlZmVyZWQgdW50aWwgbGF0ZXIgYmVjYXVzZSB3ZSBtaWdodCBzZWUgYSAuY3B1CisgICBjb21tYW5kLiAgKi8KKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgLyogVGhlIGVuZGlhbm5lc3MgY2FuIGJlIGNob3NlbiAiYXQgdGhlIGZhY3RvcnkiLiAgKi8KKyAgdGFyZ2V0X2JpZ19lbmRpYW4gPSBieXRlX29yZGVyID09IEJJR19FTkRJQU47CisKKyAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9hcmMsIGFyY19tYWNoX3R5cGUpKQorICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOworCisgIC8qIEFzc3VtZSB0aGUgYmFzZSBjcHUuICBUaGlzIGNhbGwgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgbmVlZCB0bworICAgICBpbml0aWFsaXplIGBhcmNfb3BlcmFuZF9tYXAnIHdoaWNoIG1heSBiZSBuZWVkZWQgYmVmb3JlIHdlIHNlZSB0aGUKKyAgICAgZmlyc3QgaW5zbi4gICovCisgIGFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGFyY19nZXRfb3Bjb2RlX21hY2ggKGJmZF9tYWNoX2FyY19iYXNlLAorCQkJCQkgICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4pKTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyBvcGNvZGUgYW5kIG9wZXJhbmQgdGFibGVzLgorICAgTUFDSCBpcyBvbmUgb2YgYmZkX21hY2hfYXJjX3h4eC4gICovCisKK3N0YXRpYyB2b2lkCitpbml0X29wY29kZV90YWJsZXMgKG1hY2gpCisgICAgIGludCBtYWNoOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgY2hhciAqbGFzdDsKKworICBpZiAoKGFyY19zdWZmaXhfaGFzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMKQorICAgIGFzX2ZhdGFsIChfKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKSk7CisKKyAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9hcmMsIG1hY2gpKQorICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOworCisgIC8qIFRoaXMgaW5pdGlhbGl6ZXMgYSBmZXcgdGhpbmdzIGluIGFyYy1vcGMuYyB0aGF0IHdlIG5lZWQuCisgICAgIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSB2YXJpb3VzIGFyY194eHhfc3VwcG9ydGVkIGZucy4gICovCisgIGFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGFyY19nZXRfb3Bjb2RlX21hY2ggKG1hY2gsIHRhcmdldF9iaWdfZW5kaWFuKSk7CisKKyAgLyogT25seSBwdXQgdGhlIGZpcnN0IGVudHJ5IG9mIGVhY2ggZXF1aXZhbGVudGx5IG5hbWVkIHN1ZmZpeCBpbiB0aGUKKyAgICAgdGFibGUuICAqLworICBsYXN0ID0gIiI7CisgIGZvciAoaSA9IDA7IGkgPCBhcmNfc3VmZml4ZXNfY291bnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoISBhcmNfb3B2YWxfc3VwcG9ydGVkICgmYXJjX3N1ZmZpeGVzW2ldKSkKKwljb250aW51ZTsKKyAgICAgIGlmIChzdHJjbXAgKGFyY19zdWZmaXhlc1tpXS5uYW1lLCBsYXN0KSAhPSAwKQorCWhhc2hfaW5zZXJ0IChhcmNfc3VmZml4X2hhc2gsIGFyY19zdWZmaXhlc1tpXS5uYW1lLCAoUFRSKSAoYXJjX3N1ZmZpeGVzICsgaSkpOworICAgICAgbGFzdCA9IGFyY19zdWZmaXhlc1tpXS5uYW1lOworICAgIH0KKworICAvKiBTaW5jZSByZWdpc3RlcnMgZG9uJ3QgaGF2ZSBhIHByZWZpeCwgd2UgcHV0IHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZSBzbworICAgICB0aGV5IGNhbid0IGJlIHVzZWQgYXMgc3ltYm9scy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIGFyZ3VtZW50IHBhcnNpbmcgYXMKKyAgICAgd2UgY2FuIGxldCBnYXMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4gIFRoZSByZWNvcmRlZCByZWdpc3RlciBudW1iZXIgaXMKKyAgICAgdGhlIGluZGV4IGluIGBhcmNfcmVnX25hbWVzJy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBhcmNfcmVnX25hbWVzX2NvdW50OyBpKyspCisgICAgeworICAgICAgaWYgKCEgYXJjX29wdmFsX3N1cHBvcnRlZCAoJmFyY19yZWdfbmFtZXNbaV0pKQorCWNvbnRpbnVlOworICAgICAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCisJIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLworICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAoYXJjX3JlZ19uYW1lc1tpXS5uYW1lLCByZWdfc2VjdGlvbiwKKwkJCQkJICBpLCAmemVyb19hZGRyZXNzX2ZyYWcpKTsKKyAgICB9CisKKyAgLyogVGVsbCBgc19jcHUnIGl0J3MgdG9vIGxhdGUuICAqLworICBjcHVfdGFibGVzX2luaXRfcCA9IDE7Cit9CisMCisvKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLgorICAgSWYgUkVHIGlzIG5vbi1OVUxMLCBpdCBpcyBhIHJlZ2lzdGVyIG51bWJlciBhbmQgaWdub3JlIFZBTC4gICovCisKK3N0YXRpYyBhcmNfaW5zbgorYXJjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbCwgZmlsZSwgbGluZSkKKyAgICAgYXJjX2luc24gaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworICAgICBpbnQgbW9kczsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7CisgICAgIG9mZnNldFQgdmFsOworICAgICBjaGFyICpmaWxlOworICAgICB1bnNpZ25lZCBpbnQgbGluZTsKK3sKKyAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCisgICAgeworICAgICAgbG9uZyBtaW4sIG1heDsKKyAgICAgIG9mZnNldFQgdGVzdDsKKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkgIT0gMCkKKwl7CisJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTk9QVCkgIT0gMCkKKwkgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOworCSAgZWxzZQorCSAgICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7CisJICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7CisJICBtaW4gPSAwOworCX0KKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX05FR0FUSVZFKSAhPSAwKQorCXRlc3QgPSAtIHZhbDsKKyAgICAgIGVsc2UKKwl0ZXN0ID0gdmFsOworCisgICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCisJeworCSAgY29uc3QgY2hhciAqZXJyID0KKwkgICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpOworCSAgY2hhciBidWZbMTAwXTsKKworCSAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOworCSAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKKwkgICAgYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKKwkgIGVsc2UKKwkgICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKKwl9CisgICAgfQorCisgIGlmIChvcGVyYW5kLT5pbnNlcnQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZXJybXNnOworCisgICAgICBlcnJtc2cgPSBOVUxMOworICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCAobG9uZykgdmFsLCAmZXJybXNnKTsKKyAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKKwlhc193YXJuIChlcnJtc2cpOworICAgIH0KKyAgZWxzZQorICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCisJICAgICA8PCBvcGVyYW5kLT5zaGlmdCk7CisKKyAgcmV0dXJuIGluc247Cit9CisKKy8qIFdlIG5lZWQgdG8ga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgV2UgY2FuJ3Qgc2ltcGx5IGdlbmVyYXRlIHRoZW0gYXMKKyAgIHdlIGdvLCBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSB1cyB0byBmaXJzdCBjcmVhdGUgdGhlIGZyYWcsIGFuZAorICAgdGhhdCB3b3VsZCBzY3JldyB1cCByZWZlcmVuY2VzIHRvIGBgLicnLiAgKi8KKworc3RydWN0IGFyY19maXh1cAoreworICAvKiBpbmRleCBpbnRvIGBhcmNfb3BlcmFuZHMnICovCisgIGludCBvcGluZGV4OworICBleHByZXNzaW9uUyBleHA7Cit9OworCisjZGVmaW5lIE1BWF9GSVhVUFMgNQorCisjZGVmaW5lIE1BWF9TVUZGSVhFUyA1CisKKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLiAgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOworICBjaGFyICpzdGFydDsKKyAgYXJjX2luc24gaW5zbjsKKyAgc3RhdGljIGludCBpbml0X3RhYmxlc19wID0gMDsKKworICAvKiBPcGNvZGUgdGFibGUgaW5pdGlhbGl6YXRpb24gaXMgZGVmZXJyZWQgdW50aWwgaGVyZSBiZWNhdXNlIHdlIGhhdmUgdG8KKyAgICAgd2FpdCBmb3IgYSBwb3NzaWJsZSAuY3B1IGNvbW1hbmQuICAqLworICBpZiAoIWluaXRfdGFibGVzX3ApCisgICAgeworICAgICAgaW5pdF9vcGNvZGVfdGFibGVzIChhcmNfbWFjaF90eXBlKTsKKyAgICAgIGluaXRfdGFibGVzX3AgPSAxOworICAgIH0KKworICAvKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLworICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCisgICAgc3RyKys7CisKKyAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGxpc3RzIGhhc2hlZCBieSB0aGUgZmlyc3QgbGV0dGVyICh0aG91Z2gKKyAgICAgd2UgbmVlZG4ndCBjYXJlIGhvdyB0aGV5J3JlIGhhc2hlZCkuICBHZXQgdGhlIGZpcnN0IGluIHRoZSBsaXN0LiAgKi8KKworICBvcGNvZGUgPSBhcmNfb3Bjb2RlX2xvb2t1cF9hc20gKHN0cik7CisKKyAgLyogS2VlcCBsb29raW5nIHVudGlsIHdlIGZpbmQgYSBtYXRjaC4gICovCisKKyAgc3RhcnQgPSBzdHI7CisgIGZvciAoIDsgb3Bjb2RlICE9IE5VTEw7IG9wY29kZSA9IEFSQ19PUENPREVfTkVYVF9BU00gKG9wY29kZSkpCisgICAgeworICAgICAgaW50IHBhc3Rfb3Bjb2RlX3AsIGZjLCBudW1fc3VmZml4ZXM7CisgICAgICBjaGFyICpzeW47CisgICAgICBzdHJ1Y3QgYXJjX2ZpeHVwIGZpeHVwc1tNQVhfRklYVVBTXTsKKyAgICAgIC8qIFVzZWQgYXMgYSBzYW5pdHkgY2hlY2suICBJZiB3ZSBuZWVkIGEgbGltbSByZWxvYywgbWFrZSBzdXJlIHdlIGFzaworCSBmb3IgYW4gZXh0cmEgNCBieXRlcyBmcm9tIGZyYWdfbW9yZS4gICovCisgICAgICBpbnQgbGltbV9yZWxvY19wOworICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICppbnNuX3N1ZmZpeGVzW01BWF9TVUZGSVhFU107CisKKyAgICAgIC8qIElzIHRoaXMgb3Bjb2RlIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgY3B1PyAgKi8KKyAgICAgIGlmICghIGFyY19vcGNvZGVfc3VwcG9ydGVkIChvcGNvZGUpKQorCWNvbnRpbnVlOworCisgICAgICAvKiBTY2FuIHRoZSBzeW50YXggc3RyaW5nLiAgSWYgaXQgZG9lc24ndCBtYXRjaCwgdHJ5IHRoZSBuZXh0IG9uZS4gICovCisKKyAgICAgIGFyY19vcGNvZGVfaW5pdF9pbnNlcnQgKCk7CisgICAgICBpbnNuID0gb3Bjb2RlLT52YWx1ZTsKKyAgICAgIGZjID0gMDsKKyAgICAgIHBhc3Rfb3Bjb2RlX3AgPSAwOworICAgICAgbnVtX3N1ZmZpeGVzID0gMDsKKyAgICAgIGxpbW1fcmVsb2NfcCA9IDA7CisKKyAgICAgIC8qIFdlIGRvbid0IGNoZWNrIGZvciAoKnN0ciAhPSAnXDAnKSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQorCSBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLworICAgICAgZm9yIChzdHIgPSBzdGFydCwgc3luID0gb3Bjb2RlLT5zeW50YXg7ICpzeW4gIT0gJ1wwJzsgKQorCXsKKwkgIGludCBtb2RzOworCSAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworCisJICAvKiBOb24gb3BlcmFuZCBjaGFycyBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLworCSAgaWYgKCpzeW4gIT0gJyUnIHx8ICorK3N5biA9PSAnJScpCisJICAgIHsKKwkgICAgICAvKiBIYW5kbGUgJysnIHNwZWNpYWxseSBhcyB3ZSB3YW50IHRvIGFsbG93ICJsZCByMCxbc3AtNF0iLiAgKi8KKwkgICAgICAvKiA/Pz8gVGhlIHN5bnRheCBoYXMgY2hhbmdlZCB0byBbc3AsLTRdLiAgKi8KKwkgICAgICBpZiAoMCAmJiAqc3luID09ICcrJyAmJiAqc3RyID09ICctJykKKwkJeworCQkgIC8qIFNraXAgb3ZlciBzeW4ncyArLCBidXQgbGVhdmUgc3RyJ3MgLSBhbG9uZS4KKwkJICAgICBUaGF0IG1ha2VzIHRoZSBjYXNlIGlkZW50aWNhbCB0byAibGQgcjAsW3NwKy00XSIuICAqLworCQkgICsrc3luOworCQl9CisJICAgICAgZWxzZSBpZiAoKnN0ciA9PSAqc3luKQorCQl7CisJCSAgaWYgKCpzeW4gPT0gJyAnKQorCQkgICAgcGFzdF9vcGNvZGVfcCA9IDE7CisJCSAgKytzeW47CisJCSAgKytzdHI7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gIFBpY2sgb3V0IGFueSBtb2RpZmllcnMuICAqLworCSAgbW9kcyA9IDA7CisJICB3aGlsZSAoQVJDX01PRF9QIChhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwWypzeW5dXS5mbGFncykpCisJICAgIHsKKwkgICAgICBtb2RzIHw9IGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbKnN5bl1dLmZsYWdzICYgQVJDX01PRF9CSVRTOworCSAgICAgICsrc3luOworCSAgICB9CisJICBvcGVyYW5kID0gYXJjX29wZXJhbmRzICsgYXJjX29wZXJhbmRfbWFwWypzeW5dOworCSAgaWYgKG9wZXJhbmQtPmZtdCA9PSAwKQorCSAgICBhc19mYXRhbCAoXygidW5rbm93biBzeW50YXggZm9ybWF0IGNoYXJhY3RlciBgJWMnIiksICpzeW4pOworCisJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9GQUtFKQorCSAgICB7CisJICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKKwkgICAgICBpZiAob3BlcmFuZC0+aW5zZXJ0KQorCQl7CisJCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywgTlVMTCwgMCwgJmVycm1zZyk7CisJCSAgLyogSWYgd2UgZ2V0IGFuIGVycm9yLCBnbyBvbiB0byB0cnkgdGhlIG5leHQgaW5zbi4gICovCisJCSAgaWYgKGVycm1zZykKKwkJICAgIGJyZWFrOworCQl9CisJICAgICAgKytzeW47CisJICAgIH0KKwkgIC8qIEFyZSB3ZSBmaW5pc2hlZCB3aXRoIHN1ZmZpeGVzPyAgKi8KKwkgIGVsc2UgaWYgKCFwYXN0X29wY29kZV9wKQorCSAgICB7CisJICAgICAgaW50IGZvdW5kOworCSAgICAgIGNoYXIgYzsKKwkgICAgICBjaGFyICpzLCp0OworCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqc3VmLCpzdWZmaXgsKnN1ZmZpeF9lbmQ7CisKKwkgICAgICBpZiAoIShvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkpCisJCWFib3J0ICgpOworCisJICAgICAgLyogSWYgd2UncmUgYXQgYSBzcGFjZSBpbiB0aGUgaW5wdXQgc3RyaW5nLCB3ZSB3YW50IHRvIHNraXAgdGhlCisJCSByZW1haW5pbmcgc3VmZml4ZXMuICBUaGVyZSBtYXkgYmUgc29tZSBmYWtlIG9uZXMgdGhvdWdoLCBzbworCQkganVzdCBnbyBvbiB0byB0cnkgdGhlIG5leHQgb25lLiAgKi8KKwkgICAgICBpZiAoKnN0ciA9PSAnICcpCisJCXsKKwkJICArK3N5bjsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgICAgcyA9IHN0cjsKKwkgICAgICBpZiAobW9kcyAmIEFSQ19NT0RfRE9UKQorCQl7CisJCSAgaWYgKCpzICE9ICcuJykKKwkJICAgIGJyZWFrOworCQkgICsrczsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiAiYi5uZCBmb28iIGFuZCB3ZSdyZSBjdXJyZW50bHkgbG9va2luZworCQkgICAgIGZvciAiJXEiIChpZTogYSBjb25kaXRpb24gY29kZSBzdWZmaXgpLiAgKi8KKwkJICBpZiAoKnMgPT0gJy4nKQorCQkgICAgeworCQkgICAgICArK3N5bjsKKwkJICAgICAgY29udGludWU7CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIFBpY2sgdGhlIHN1ZmZpeCBvdXQgYW5kIGxvb2sgaXQgdXAgdmlhIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkgICAgICBmb3IgKHQgPSBzOyAqdCAmJiBpc2FscGhhICgqdCk7ICsrdCkKKwkJY29udGludWU7CisJICAgICAgYyA9ICp0OworCSAgICAgICp0ID0gJ1wwJzsKKwkgICAgICBzdWYgPSBoYXNoX2ZpbmQgKGFyY19zdWZmaXhfaGFzaCwgcyk7CisJICAgICAgKnQgPSBjOworCSAgICAgIGlmICghc3VmKQorCQl7CisJCSAgLyogVGhpcyBjYW4gaGFwcGVuIGluICJibGxlIGZvbyIgYW5kIHdlJ3JlIGN1cnJlbnRseSB1c2luZworCQkgICAgIHRoZSB0ZW1wbGF0ZSAiYiVxJS5uICVqIi4gIFRoZSAiYmwiIGluc24gb2NjdXJzIGxhdGVyIGluCisJCSAgICAgdGhlIHRhYmxlIHNvICJsbGUiIGlzbid0IGFuIGlsbGVnYWwgc3VmZml4LiAgKi8KKwkJICBicmVhazsKKwkJfQorCisJICAgICAgLyogSXMgaXQgdGhlIHJpZ2h0IHR5cGU/ICBOb3RlIHRoYXQgdGhlIHNhbWUgY2hhcmFjdGVyIGlzIHVzZWQKKwkgICAgICAgICBzZXZlcmFsIHRpbWVzLCBzbyB3ZSBoYXZlIHRvIGV4YW1pbmUgYWxsIG9mIHRoZW0uICBUaGlzIGlzCisJCSByZWxhdGl2ZWx5IGVmZmljaWVudCBhcyBlcXVpdmFsZW50IGVudHJpZXMgYXJlIGtlcHQKKwkJIHRvZ2V0aGVyLiAgSWYgaXQncyBub3QgdGhlIHJpZ2h0IHR5cGUsIGRvbid0IGluY3JlbWVudCBgc3RyJworCQkgc28gd2UgdHJ5IHRoZSBuZXh0IG9uZSBpbiB0aGUgc2VyaWVzLiAgKi8KKwkgICAgICBmb3VuZCA9IDA7CisJICAgICAgc3VmZml4X2VuZCA9IGFyY19zdWZmaXhlcyArIGFyY19zdWZmaXhlc19jb3VudDsKKwkgICAgICBmb3IgKHN1ZmZpeCA9IHN1ZjsKKwkJICAgc3VmZml4IDwgc3VmZml4X2VuZCAmJiBzdHJjbXAgKHN1ZmZpeC0+bmFtZSwgc3VmLT5uYW1lKSA9PSAwOworCQkgICArK3N1ZmZpeCkKKwkJeworCQkgIGlmIChhcmNfb3BlcmFuZHNbc3VmZml4LT50eXBlXS5mbXQgPT0gKnN5bikKKwkJICAgIHsKKwkJICAgICAgLyogSW5zZXJ0IHRoZSBzdWZmaXgncyB2YWx1ZSBpbnRvIHRoZSBpbnNuLiAgKi8KKwkJICAgICAgaWYgKG9wZXJhbmQtPmluc2VydCkKKwkJCWluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIG9wZXJhbmQsCisJCQkJCQkgICBtb2RzLCBOVUxMLCBzdWZmaXgtPnZhbHVlLAorCQkJCQkJICAgTlVMTCk7CisJCSAgICAgIGVsc2UKKwkJCWluc24gfD0gc3VmZml4LT52YWx1ZSA8PCBvcGVyYW5kLT5zaGlmdDsKKworCQkgICAgICBzdHIgPSB0OworCQkgICAgICBmb3VuZCA9IDE7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgKytzeW47CisJICAgICAgaWYgKCFmb3VuZCkKKwkJOyAvKiBXcm9uZyB0eXBlLiAgSnVzdCBnbyBvbiB0byB0cnkgbmV4dCBpbnNuIGVudHJ5LiAgKi8KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAobnVtX3N1ZmZpeGVzID09IE1BWF9TVUZGSVhFUykKKwkJICAgIGFzX2JhZCAoXygidG9vIG1hbnkgc3VmZml4ZXMiKSk7CisJCSAgZWxzZQorCQkgICAgaW5zbl9zdWZmaXhlc1tudW1fc3VmZml4ZXMrK10gPSBzdWZmaXg7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICAvKiBUaGlzIGlzIGVpdGhlciBhIHJlZ2lzdGVyIG9yIGFuIGV4cHJlc3Npb24gb2Ygc29tZSBraW5kLiAgKi8KKwkgICAgeworCSAgICAgIGNoYXIgYzsKKwkgICAgICBjaGFyICpob2xkOworCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnID0gTlVMTDsKKwkgICAgICBsb25nIHZhbHVlID0gMDsKKwkgICAgICBleHByZXNzaW9uUyBleHA7CisKKwkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpCisJCWFib3J0ICgpOworCisJICAgICAgLyogSXMgdGhlcmUgYW55dGhpbmcgbGVmdCB0byBwYXJzZT8KKwkJIFdlIGRvbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSB0b3AgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCisJCSBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLworCSAgICAgIGlmICgqc3RyID09ICdcMCcpCisJCWJyZWFrOworI2lmIDAKKwkgICAgICAvKiBJcyB0aGlzIGEgc3ludGF4IGNoYXJhY3Rlcj8gIEVnOiBpcyB0aGVyZSBhICdbJyBwcmVzZW50IHdoZW4KKwkJIHRoZXJlIHNob3VsZG4ndCBiZT8gICovCisJICAgICAgaWYgKCFpc2FsbnVtICgqc3RyKQorCQkgIC8qICcuJyBhcyBpbiAiLkxMQzAiICovCisJCSAgJiYgKnN0ciAhPSAnLicKKwkJICAvKiAnXycgYXMgaW4gIl9wcmludCIgKi8KKwkJICAmJiAqc3RyICE9ICdfJworCQkgIC8qICctJyBhcyBpbiAiW2ZwLC00XSIgKi8KKwkJICAmJiAqc3RyICE9ICctJworCQkgIC8qICclJyBhcyBpbiAiJWlhKF9mdW5jKSIgKi8KKwkJICAmJiAqc3RyICE9ICclJykKKwkJYnJlYWs7CisjZW5kaWYKKworCSAgICAgIC8qIFBhcnNlIHRoZSBvcGVyYW5kLiAgKi8KKwkgICAgICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKwkgICAgICBleHByZXNzaW9uICgmZXhwKTsKKwkgICAgICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKworCSAgICAgIGlmIChleHAuWF9vcCA9PSBPX2lsbGVnYWwpCisJCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOworCSAgICAgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fYWJzZW50KQorCQlhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKKwkgICAgICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCQl7CisJCSAgdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOworCQl9CisJICAgICAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19yZWdpc3RlcikKKwkJeworCQkgIHJlZyA9IGFyY19yZWdfbmFtZXMgKyBleHAuWF9hZGRfbnVtYmVyOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLworCQkgIGlmIChmYyA+PSBNQVhfRklYVVBTKQorCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKKwkJICBmaXh1cHNbZmNdLmV4cCA9IGV4cDsKKworCQkgIC8qIElmIHRoaXMgaXMgYSByZWdpc3RlciBjb25zdGFudCAoSUU6IG9uZSB3aG9zZQorCQkgICAgIHJlZ2lzdGVyIHZhbHVlIGdldHMgc3RvcmVkIGFzIDYxLTYzKSB0aGVuIHRoaXMKKwkJICAgICBtdXN0IGJlIGEgbGltbS4gIFdlIGRvbid0IHN1cHBvcnQgc2hpbW0gcmVsb2NzLiAgKi8KKwkJICAvKiA/Pz8gVGhpcyBiaXQgY291bGQgdXNlIHNvbWUgY2xlYW5pbmcgdXAuCisJCSAgICAgUmVmZXJlbmNpbmcgdGhlIGZvcm1hdCBjaGFycyBsaWtlIHRoaXMgZ29lcworCQkgICAgIGFnYWluc3Qgc3R5bGUuICAqLworI2RlZmluZSBJU19SRUdfT1BFUkFORChvKSAoKG8pID09ICdhJyB8fCAobykgPT0gJ2InIHx8IChvKSA9PSAnYycpCisJCSAgaWYgKElTX1JFR19PUEVSQU5EICgqc3luKSkKKwkJICAgIHsKKwkJICAgICAgY29uc3QgY2hhciAqanVuazsKKworCQkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSBhcmNfb3BlcmFuZF9tYXBbJ0wnXTsKKwkJICAgICAgbGltbV9yZWxvY19wID0gMTsKKwkJICAgICAgLyogVGVsbCBpbnNlcnRfcmVnIHdlIG5lZWQgYSBsaW1tLiAgVGhpcyBpcworCQkJIG5lZWRlZCBiZWNhdXNlIHRoZSB2YWx1ZSBhdCB0aGlzIHBvaW50IGlzCisJCQkgemVybywgYSBzaGltbS4gICovCisJCSAgICAgIC8qID8/PyBXZSBuZWVkIGEgY2xlYW5lciBpbnRlcmZhY2UgdGhhbiB0aGlzLiAgKi8KKwkJICAgICAgKCphcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwWydRJ11dLmluc2VydCkKKwkJCShpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIDBMLCAmanVuayk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gYXJjX29wZXJhbmRfbWFwWypzeW5dOworCQkgICsrZmM7CisJCSAgdmFsdWUgPSAwOworCQl9CisKKwkgICAgICAvKiBJbnNlcnQgdGhlIHJlZ2lzdGVyIG9yIGV4cHJlc3Npb24gaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGlmIChvcGVyYW5kLT5pbnNlcnQpCisJCXsKKwkJICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOworCQkgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIG9wZXJhbmQsIG1vZHMsCisJCQkJCSAgICAgcmVnLCAobG9uZykgdmFsdWUsICZlcnJtc2cpOworI2lmIDAKKwkJICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCisJCSAgICBhc193YXJuIChlcnJtc2cpOworI2VuZGlmCisJCSAgLyogRklYTUU6IFdlIHdhbnQgdG8gdHJ5IHNoaW1tIGluc25zIGZvciBsaW1tIG9uZXMuICBCdXQgaWYKKwkJICAgICB0aGUgY29uc3RhbnQgd29uJ3QgZml0LCB3ZSBtdXN0IGdvIG9uIHRvIHRyeSB0aGUgbmV4dAorCQkgICAgIHBvc3NpYmlsaXR5LiAgV2hlcmUgZG8gd2UgaXNzdWUgd2FybmluZ3MgZm9yIGNvbnN0YW50cworCQkgICAgIHRoYXQgYXJlIHRvbyBiaWcgdGhlbj8gIEF0IHByZXNlbnQsIHdlJ2xsIGZsYWcgdGhlIGluc24KKwkJICAgICBhcyB1bnJlY29nbml6YWJsZSEgIE1heWJlIGhhdmUgdGhlICJiYWQgaW5zdHJ1Y3Rpb24iCisJCSAgICAgZXJyb3IgbWVzc2FnZSBpbmNsdWRlIG91ciBgZXJybXNnJz8gICovCisJCSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQorCQkgICAgYnJlYWs7CisJCX0KKwkgICAgICBlbHNlCisJCWluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OworCisJICAgICAgKytzeW47CisJICAgIH0KKwl9CisKKyAgICAgIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRheCBzdHJpbmcsIHdlJ3JlIGRvbmUuICAqLworICAgICAgLyogRklYTUU6IHRyeSB0byBtb3ZlIHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbi4gICovCisgICAgICBpZiAoKnN5biA9PSAnXDAnKQorCXsKKwkgIGludCBpOworCSAgY2hhciAqZjsKKwkgIGxvbmcgbGltbSwgbGltbV9wOworCisJICAvKiBGb3IgdGhlIG1vbWVudCB3ZSBhc3N1bWUgYSB2YWxpZCBgc3RyJyBjYW4gb25seSBjb250YWluIGJsYW5rcworCSAgICAgbm93LiAgSUU6IFdlIG5lZWRuJ3QgdHJ5IGFnYWluIHdpdGggYSBsb25nZXIgdmVyc2lvbiBvZiB0aGUKKwkgICAgIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCisJICAgICBiZWZvcmUgc2hvcnRlciBvbmVzIChlZzogbHNyIHIyLHIzLDEgdnMgbHNyIHIyLHIzKS4gICovCisKKwkgIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKKwkgICAgKytzdHI7CisKKwkgIGlmICgqc3RyICE9ICdcMCcpCisJICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOworCisJICAvKiBJcyB0aGVyZSBhIGxpbW0gdmFsdWU/ICAqLworCSAgbGltbV9wID0gYXJjX29wY29kZV9saW1tX3AgKCZsaW1tKTsKKworCSAgLyogUGVyZm9ybSB2YXJpb3VzIGVycm9yIGFuZCB3YXJuaW5nIHRlc3RzLiAgKi8KKworCSAgeworCSAgICBzdGF0aWMgaW50IGluX2RlbGF5X3Nsb3RfcCA9IDA7CisJICAgIHN0YXRpYyBpbnQgcHJldl9pbnNuX25lZWRzX2NjX25vcF9wID0gMDsKKwkgICAgLyogZGVsYXkgc2xvdCB0eXBlIHNlZW4gKi8KKwkgICAgaW50IGRlbGF5X3Nsb3RfdHlwZSA9IEFSQ19ERUxBWV9OT05FOworCSAgICAvKiBjb25kaXRpb25hbCBleGVjdXRpb24gZmxhZyBzZWVuICovCisJICAgIGludCBjb25kaXRpb25hbCA9IDA7CisJICAgIC8qIDEgaWYgY29uZGl0aW9uIGNvZGVzIGFyZSBiZWluZyBzZXQgKi8KKwkgICAgaW50IGNjX3NldF9wID0gMDsKKwkgICAgLyogMSBpZiBjb25kaXRpb25hbCBicmFuY2gsIGluY2x1ZGluZyBgYicgImJyYW5jaCBhbHdheXMiICovCisJICAgIGludCBjb25kX2JyYW5jaF9wID0gb3Bjb2RlLT5mbGFncyAmIEFSQ19PUENPREVfQ09ORF9CUkFOQ0g7CisJICAgIGludCBuZWVkX2NjX25vcF9wID0gMDsKKworCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N1ZmZpeGVzOyArK2kpCisJICAgICAgeworCQlzd2l0Y2ggKGFyY19vcGVyYW5kc1tpbnNuX3N1ZmZpeGVzW2ldLT50eXBlXS5mbXQpCisJCSAgeworCQkgIGNhc2UgJ24nIDoKKwkJICAgIGRlbGF5X3Nsb3RfdHlwZSA9IGluc25fc3VmZml4ZXNbaV0tPnZhbHVlOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAncScgOgorCQkgICAgY29uZGl0aW9uYWwgPSBpbnNuX3N1ZmZpeGVzW2ldLT52YWx1ZTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgJ2YnIDoKKwkJICAgIGNjX3NldF9wID0gMTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisKKwkgICAgLyogUHV0dGluZyBhbiBpbnNuIHdpdGggYSBsaW1tIHZhbHVlIGluIGEgZGVsYXkgc2xvdCBpcyBzdXBwb3NlZCB0bworCSAgICAgICBiZSBsZWdhbCwgYnV0IGxldCdzIHdhcm4gdGhlIHVzZXIgYW55d2F5LiAgRGl0dG8gZm9yIDggYnl0ZQorCSAgICAgICBqdW1wcyB3aXRoIGRlbGF5IHNsb3RzLiAgKi8KKwkgICAgaWYgKGluX2RlbGF5X3Nsb3RfcCAmJiBsaW1tX3ApCisJICAgICAgYXNfd2FybiAoXygiOCBieXRlIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7CisJICAgIGlmIChkZWxheV9zbG90X3R5cGUgIT0gQVJDX0RFTEFZX05PTkUgJiYgbGltbV9wKQorCSAgICAgIGFzX3dhcm4gKF8oIjggYnl0ZSBqdW1wIGluc3RydWN0aW9uIHdpdGggZGVsYXkgc2xvdCIpKTsKKwkgICAgaW5fZGVsYXlfc2xvdF9wID0gKGRlbGF5X3Nsb3RfdHlwZSAhPSBBUkNfREVMQVlfTk9ORSkgJiYgIWxpbW1fcDsKKworCSAgICAvKiBXYXJuIHdoZW4gYSBjb25kaXRpb25hbCBicmFuY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIHNldCBvZgorCSAgICAgICB0aGUgY29uZGl0aW9uIGNvZGVzLiAgTm90ZSB0aGF0IHRoaXMgbmVlZG4ndCBiZSBkb25lIGlmIHRoZQorCSAgICAgICBpbnNuIHRoYXQgc2V0cyB0aGUgY29uZGl0aW9uIGNvZGVzIHVzZXMgYSBsaW1tLiAgKi8KKwkgICAgaWYgKGNvbmRfYnJhbmNoX3AgJiYgY29uZGl0aW9uYWwgIT0gMCAvKiAwID0gImFsd2F5cyIgKi8KKwkJJiYgcHJldl9pbnNuX25lZWRzX2NjX25vcF9wKQorCSAgICAgIGFzX3dhcm4gKF8oImNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dzIHNldCBvZiBmbGFncyIpKTsKKwkgICAgcHJldl9pbnNuX25lZWRzX2NjX25vcF9wID0gY2Nfc2V0X3AgJiYgIWxpbW1fcDsKKwkgIH0KKworCSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4KKwkgICAgIEl0IGlzIGltcG9ydGFudCB0byBmZXRjaCBlbm91Z2ggc3BhY2UgaW4gb25lIGNhbGwgdG8gYGZyYWdfbW9yZScuCisJICAgICBXZSB1c2UgKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgdG8gY29tcHV0ZSB3aGVyZSB3ZSBhcmUgYW5kIHdlCisJICAgICBkb24ndCB3YW50IGZyYWdfbm93IHRvIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLiAgKi8KKwkgIGlmIChsaW1tX3ApCisJICAgIHsKKwkgICAgICBmID0gZnJhZ19tb3JlICg4KTsKKwkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDQpOworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiArIDQsIGxpbW0sIDQpOworCSAgICB9CisJICBlbHNlIGlmIChsaW1tX3JlbG9jX3ApCisJICAgIHsKKwkgICAgICAvKiBXZSBuZWVkIGEgbGltbSByZWxvYywgYnV0IHRoZSB0YWJsZXMgdGhpbmsgd2UgZG9uJ3QuICAqLworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmID0gZnJhZ19tb3JlICg0KTsKKwkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDQpOworCSAgICB9CisKKwkgIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCBmYzsgKytpKQorCSAgICB7CisJICAgICAgaW50IG9wX3R5cGUsIHJlbG9jX3R5cGU7CisJICAgICAgZXhwcmVzc2lvblMgZXhwdG1wOworCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKworCSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGlzIG9wZXJhbmQuCisJCSBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCB1c2UgYSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZm9yCisJCSBvcGVyYW5kcyByZXNpZGluZyBpbiB0aGUgaW5zbiwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCisJCSBvcGVyYW5kIGluZGV4LiAgVGhpcyBsZXRzIHVzIGVhc2lseSBoYW5kbGUgZml4dXBzIGZvciBhbnkKKwkJIG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5IG5vdCBhIHZlcnkgZXhjaXRpbmcKKwkJIGZlYXR1cmUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4gbWRfYXBwbHlfZml4LgorCisJCSBMaW1tIHZhbHVlcyAoNCBieXRlIGltbWVkaWF0ZSAiY29uc3RhbnRzIikgbXVzdCBiZSB0cmVhdGVkCisJCSBub3JtYWxseSBiZWNhdXNlIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIGFjdHVhbCBpbnNuIHdvcmQKKwkJIGFuZCB0aHVzIHRoZSBpbnNlcnRpb24gcm91dGluZXMgZG9uJ3QgaGFuZGxlIHRoZW0uICAqLworCisJICAgICAgaWYgKGFyY19vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF0uZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NKQorCQl7CisJCSAgb3BfdHlwZSA9IGZpeHVwc1tpXS5vcGluZGV4OworCQkgIC8qIEZJWE1FOiBjYW4gd2UgYWRkIHRoaXMgZGF0YSB0byB0aGUgb3BlcmFuZCB0YWJsZT8gICovCisJCSAgaWYgKG9wX3R5cGUgPT0gYXJjX29wZXJhbmRfbWFwWydMJ10pCisJCSAgICByZWxvY190eXBlID0gQkZEX1JFTE9DXzMyOworCQkgIGVsc2UgaWYgKG9wX3R5cGUgPT0gYXJjX29wZXJhbmRfbWFwWydKJ10pCisJCSAgICByZWxvY190eXBlID0gQkZEX1JFTE9DX0FSQ19CMjY7CisJCSAgZWxzZQorCQkgICAgYWJvcnQgKCk7CisJCSAgcmVsb2NfdHlwZSA9IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgKDEsIHJlbG9jX3R5cGUsCisJCQkJCQkgICAgICAgJmZpeHVwc1tpXS5leHAsCisJCQkJCQkgICAgICAgJmV4cHRtcCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBvcF90eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMCwgZml4dXBzW2ldLm9waW5kZXgsCisJCQkJCQkgICAgJmZpeHVwc1tpXS5leHAsICZleHB0bXApOworCQkgIHJlbG9jX3R5cGUgPSBvcF90eXBlICsgKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKKwkJfQorCSAgICAgIG9wZXJhbmQgPSAmYXJjX29wZXJhbmRzW29wX3R5cGVdOworCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJCSAgICgoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKQorCQkJICAgICsgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfTElNTSA/IDQgOiAwKSksIDQsCisJCQkgICAmZXhwdG1wLAorCQkJICAgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIKSAhPSAwLAorCQkJICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2NfdHlwZSk7CisJICAgIH0KKworCSAgLyogQWxsIGRvbmUuICAqLworCSAgcmV0dXJuOworCX0KKworICAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5LiAgKi8KKyAgICB9CisKKyAgYXNfYmFkIChfKCJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIpLCBzdGFydCk7Cit9CisMCisvKiA/Pz8gVGhpcyB3YXMgY29waWVkIGZyb20gdGMtc3BhcmMuYywgSSB0aGluay4gIElzIGl0IG5lY2Vzc2FyeT8gICovCisKK3N0YXRpYyB2b2lkCithcmNfY29tbW9uIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgYzsKKyAgY2hhciAqcDsKKyAgaW50IHRlbXAsIHNpemU7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAvKiBqdXN0IGFmdGVyIG5hbWUgaXMgbm93ICdcMCcgKi8KKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKnAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KKyAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIi5DT01Nb24gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBzaXplID0gdGVtcDsKKyAgKnAgPSAwOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICpwID0gYzsKKyAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgISBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpCisgICAgeworICAgICAgYXNfYmFkIChfKCJpZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gc2l6ZSkKKwl7CisJICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKKwkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOworCX0KKyAgICB9CisgIGFzc2VydCAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKKyAgICB7CisgICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBpZiAodGVtcCA8IDApCisJeworCSAgdGVtcCA9IDA7CisJICBhc193YXJuIChfKCJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiKSk7CisJfQorICAgICAgaWYgKHN5bWJvbFAtPmxvY2FsKQorCXsKKwkgIHNlZ1Qgb2xkX3NlYzsKKwkgIGludCBvbGRfc3Vic2VjOworCSAgY2hhciAqcDsKKwkgIGludCBhbGlnbjsKKworCWFsbG9jYXRlX2JzczoKKwkgIG9sZF9zZWMgPSBub3dfc2VnOworCSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7CisJICBhbGlnbiA9IHRlbXA7CisJICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOworCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOworCSAgaWYgKGFsaWduKQorCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7CisJICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCisJICAgIHN5bWJvbFAtPnN5X2ZyYWctPmZyX3N5bWJvbCA9IDA7CisJICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7CisJICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKKwkJCShvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKKwkgICpwID0gMDsKKwkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKKwkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOworCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7CisJfQorICAgICAgZWxzZQorCXsKKwlhbGxvY2F0ZV9jb21tb246CisJICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7CisJICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7CisJICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisJICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICAvKiA/Pz8gU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KKyAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIuYnNzXCIiLCA1KQorCSAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGFcIiIsIDYpKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlci0tOworCSAgZ290byBiYWRfY29tbW9uX3NlZ21lbnQ7CisJfQorICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnIicpCisJOworICAgICAgZ290byBhbGxvY2F0ZV9jb21tb247CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICByZXR1cm47CisKKyAgeworICBiYWRfY29tbW9uX3NlZ21lbnQ6CisgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykKKyAgICAgIHArKzsKKyAgICBjID0gKnA7CisgICAgKnAgPSAnXDAnOworICAgIGFzX2JhZCAoXygiYmFkIC5jb21tb24gc2VnbWVudCAlcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKKyAgICAqcCA9IGM7CisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKKyAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgIHJldHVybjsKKyAgfQorfQorCisvKiBTZWxlY3QgdGhlIGNwdSB3ZSdyZSBhc3NlbWJsaW5nIGZvci4gICovCisKK3N0YXRpYyB2b2lkCithcmNfY3B1IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGludCBtYWNoOworICBjaGFyIGM7CisgIGNoYXIgKmNwdTsKKworICAvKiBJZiBhbiBpbnN0cnVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sIGl0J3MgdG9vIGxhdGUuICAqLworICBpZiAoY3B1X3RhYmxlc19pbml0X3ApCisgICAgeworICAgICAgYXNfYmFkIChfKCIuY3B1IGNvbW1hbmQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBpbnN0cnVjdGlvbnMiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjcHUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgbWFjaCA9IGFyY19nZXRfbWFjaCAoY3B1KTsKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgIGlmIChtYWNoID09IC0xKQorICAgIGdvdG8gYmFkX2NwdTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisgIC8qIFRoZSBjcHUgbWF5IGhhdmUgYmVlbiBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICBUaGUgY2hvaWNlcyBtdXN0IG1hdGNoLiAgKi8KKyAgLyogPz8/IFRoaXMgd2FzIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBlYXJseSBvbi4gIEl0J3MgZ29uZSBub3csIGJ1dAorICAgICBsZWF2ZSB0aGlzIGluLiAgKi8KKyAgaWYgKG1hY2hfdHlwZV9zcGVjaWZpZWRfcCAmJiBtYWNoICE9IGFyY19tYWNoX3R5cGUpCisgICAgYXNfYmFkIChfKCIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIikpOworICBlbHNlCisgICAgeworICAgICAgYXJjX21hY2hfdHlwZSA9IG1hY2g7CisgICAgICBtYWNoX3R5cGVfc3BlY2lmaWVkX3AgPSAxOworICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9hcmMsIG1hY2gpKQorCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOworICAgIH0KKyAgcmV0dXJuOworCisgYmFkX2NwdToKKyAgYXNfYmFkIChfKCJiYWQgLmNwdSBvcCIpKTsKKyAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworI2lmIDAKKy8qIFRoZSAucmVuYW1lIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCBieSBnY2MgdG8gaW1wbGVtZW50CisgICAtbW1hbmdsZS1jcHUtbGliZ2NjLiAgKi8KKworc3RhdGljIHZvaWQKK2FyY19yZW5hbWUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZSwqbmV3OworICBjaGFyIGM7CisgIHN5bWJvbFMgKnN5bTsKKyAgaW50IGxlbjsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIHJlbmFtZSBzdHJpbmciKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIGlmICgqbmFtZSA9PSAnXDAnKQorICAgIHsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgbmV3ID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOworICBzdHJjcHkgKG5ldywgbmFtZSk7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICBzeW0tPnN5X3RjLnJlYWxfbmFtZSA9IG5ldzsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorI2VuZGlmCisMCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLgorICAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCisKKy8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBjaGFyIHR5cGU7CisgICAgIGNoYXIgKmxpdFA7CisgICAgIGludCAqc2l6ZVA7Cit7CisgIGludCBwcmVjOworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107CisgIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKKyAgY2hhciAqdDsKKyAgY2hhciAqYXRvZl9pZWVlICgpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOworICAgIH0KKworICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUKKyAgIGVuZGlhbm5lc3MuICAqLworCit2b2lkCittZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQorICAgICBjaGFyICpidWY7CisgICAgIHZhbHVlVCB2YWw7CisgICAgIGludCBuOworeworICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOworICBlbHNlCisgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOworfQorCisvKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCisKK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKKyAgICAgc2VnVCBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKKworICByZXR1cm4gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKK30KKworLyogV2UgZG9uJ3QgaGF2ZSBhbnkgZm9ybSBvZiByZWxheGluZy4gICovCisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCisgICAgIGZyYWdTICpmcmFncDsKKyAgICAgYXNlY3Rpb24gKnNlZzsKK3sKKyAgYWJvcnQgKCk7Cit9CisKKy8qIENvbnZlcnQgYSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnLiAgV2UgbmV2ZXIgZ2VuZXJhdGUgdGhlc2UuICAqLworCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgZnJhZ1MgKmZyYWdwOworeworICBhYm9ydCAoKTsKK30KKworLyogUGFyc2UgYW4gb3BlcmFuZCB0aGF0IGlzIG1hY2hpbmUtc3BlY2lmaWMuCisKKyAgIFRoZSBBUkMgaGFzIGEgc3BlY2lhbCAlLW9wIHRvIGFkanVzdCBhZGRyZXNzZXMgc28gdGhleSdyZSB1c2FibGUgaW4KKyAgIGJyYW5jaGVzLiAgVGhlICJzdCIgaXMgc2hvcnQgZm9yIHRoZSBTVGF0dXMgcmVnaXN0ZXIuCisgICA/Pz8gTGF0ZXIgZXhwYW5kIHRoaXMgdG8gdGFrZSBhIGZsYWdzIHZhbHVlIHRvby4KKworICAgPz8/IFdlIGNhbid0IGNyZWF0ZSBuZXcgZXhwcmVzc2lvbiB0eXBlcyBzbyB3ZSBtYXAgdGhlICUtb3AncyBvbnRvIHRoZQorICAgZXhpc3Rpbmcgc3ludGF4LiAgVGhpcyBtZWFucyB0aGF0IHRoZSB1c2VyIGNvdWxkIHVzZSB0aGUgY2hvc2VuIHN5bnRheAorICAgdG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QuICBQZXJoYXBzIHB1dCBhIHNwZWNpYWwgY29va2llIGluIFhfYWRkX251bWJlcgorICAgdG8gbWFyayB0aGUgZXhwcmVzc2lvbiBhcyBzcGVjaWFsLiAgKi8KKwordm9pZCAKK21kX29wZXJhbmQgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Cit7CisgIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgaWYgKCpwID09ICclJyAmJiBzdHJuY21wIChwLCAiJXN0KCIsIDQpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7CisgICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScpCisJeworCSAgYXNfYmFkIChfKCJtaXNzaW5nICcpJyBpbiAlLW9wIikpOworCSAgcmV0dXJuOworCX0KKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fc3ltYm9sCisJICAmJiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID09IDAKKwkgIC8qIEkgdGhpbmsgdGhpcyB0ZXN0IGlzIHVubmVjZXNzYXJ5IGJ1dCBqdXN0IGFzIGEgc2FuaXR5IGNoZWNrLi4uICovCisJICAmJiBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPT0gTlVMTCkKKwl7CisJICBleHByZXNzaW9uUyB0d287CisKKwkgIGV4cHJlc3Npb25QLT5YX29wID0gT19yaWdodF9zaGlmdDsKKwkgIHR3by5YX29wID0gT19jb25zdGFudDsKKwkgIHR3by5YX2FkZF9zeW1ib2wgPSB0d28uWF9vcF9zeW1ib2wgPSBOVUxMOworCSAgdHdvLlhfYWRkX251bWJlciA9IDI7CisJICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmdHdvKTsKKwl9CisgICAgICAvKiBhbGxvdyAlc3Qoc3ltMS1zeW0yKSAqLworICAgICAgZWxzZSBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zdWJ0cmFjdAorCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKKwkgICAgICAgJiYgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICE9IE5VTEwKKwkgICAgICAgJiYgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9PSAwKQorCXsKKwkgIGV4cHJlc3Npb25TIHR3bzsKKworCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cHJlc3Npb25QKTsKKwkgIGV4cHJlc3Npb25QLT5YX29wID0gT19yaWdodF9zaGlmdDsKKwkgIHR3by5YX29wID0gT19jb25zdGFudDsKKwkgIHR3by5YX2FkZF9zeW1ib2wgPSB0d28uWF9vcF9zeW1ib2wgPSBOVUxMOworCSAgdHdvLlhfYWRkX251bWJlciA9IDI7CisJICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmdHdvKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IGZvciAlJXN0IikpOworCSAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKKy8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLgorICAgV2UgY291bGQgY2F0Y2ggcmVnaXN0ZXIgbmFtZXMgaGVyZSwgYnV0IHRoYXQgaXMgaGFuZGxlZCBieSBpbnNlcnRpbmcKKyAgIHRoZW0gYWxsIGluIHRoZSBzeW1ib2wgdGFibGUgdG8gYmVnaW4gd2l0aC4gICovCisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisMCisvKiBGdW5jdGlvbnMgY29uY2VybmluZyBleHByZXNzaW9ucy4gICovCisKKy8qIFBhcnNlIGEgLmJ5dGUsIC53b3JkLCBldGMuIGV4cHJlc3Npb24uCisKKyAgIFZhbHVlcyBmb3IgdGhlIHN0YXR1cyByZWdpc3RlciBhcmUgc3BlY2lmaWVkIHdpdGggJXN0KGxhYmVsKS4KKyAgIGBsYWJlbCcgd2lsbCBiZSByaWdodCBzaGlmdGVkIGJ5IDIuICAqLworCit2b2lkCithcmNfcGFyc2VfY29uc19leHByZXNzaW9uIChleHAsIG5ieXRlcykKKyAgICAgZXhwcmVzc2lvblMgKmV4cDsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgZXhwciAoMCwgZXhwKTsKK30KKworLyogUmVjb3JkIGEgZml4dXAgZm9yIGEgY29ucyBleHByZXNzaW9uLiAgKi8KKwordm9pZAorYXJjX2NvbnNfZml4X25ldyAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQorICAgICBmcmFnUyAqZnJhZzsKKyAgICAgaW50IHdoZXJlOworICAgICBpbnQgbmJ5dGVzOworICAgICBleHByZXNzaW9uUyAqZXhwOworeworICBpZiAobmJ5dGVzID09IDQpCisgICAgeworICAgICAgaW50IHJlbG9jX3R5cGU7CisgICAgICBleHByZXNzaW9uUyBleHB0bXA7CisKKyAgICAgIC8qIFRoaXMgbWF5IGJlIGEgc3BlY2lhbCBBUkMgcmVsb2MgKGVnOiAlc3QoKSkuICAqLworICAgICAgcmVsb2NfdHlwZSA9IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgKDEsIEJGRF9SRUxPQ18zMiwgZXhwLCAmZXhwdG1wKTsKKyAgICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCAmZXhwdG1wLCAwLCByZWxvY190eXBlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwLCAwLAorCQkgICBuYnl0ZXMgPT0gMiA/IEJGRF9SRUxPQ18xNgorCQkgICA6IG5ieXRlcyA9PSA4ID8gQkZEX1JFTE9DXzY0CisJCSAgIDogQkZEX1JFTE9DXzMyKTsKKyAgICB9Cit9CisMCisvKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLworCisvKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCisgICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KKworbG9uZyAKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIGlmIChmaXhQLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCisgICAgICAmJiAhIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWxheSBzbG90LiAgKi8KKyAgcmV0dXJuIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X3NpemU7Cit9CisKKy8qIENvbXB1dGUgdGhlIHJlbG9jIHR5cGUgb2YgYW4gZXhwcmVzc2lvbi4KKyAgIFRoZSBwb3NzaWJseSBtb2RpZmllZCBleHByZXNzaW9uIGlzIHN0b3JlZCBpbiBFWFBORVcuCisKKyAgIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBleHByZXNzaW9ucyBnZW5lcmF0ZWQgYnkgdGhlICUtb3AncyBpbnRvCisgICB0aGUgYXBwcm9wcmlhdGUgb3BlcmFuZCB0eXBlLiAgSXQgaXMgY2FsbGVkIGZvciBib3RoIGRhdGEgaW4gaW5zdHJ1Y3Rpb25zCisgICAob3BlcmFuZHMpIGFuZCBkYXRhIG91dHNpZGUgaW5zdHJ1Y3Rpb25zICh2YXJpYWJsZXMsIGRlYnVnZ2luZyBpbmZvLCBldGMuKS4KKworICAgQ3VycmVudGx5IHN1cHBvcnRlZCAlLW9wczoKKworICAgJXN0KHN5bWJvbCk6IHJlcHJlc2VudGVkIGFzICJzeW1ib2wgPj4gMiIKKyAgICAgICAgICAgICAgICAic3QiIGlzIHNob3J0IGZvciBTVGF0dXMgYXMgaW4gdGhlIHN0YXR1cyByZWdpc3RlciAocGMpCisKKyAgIERFRkFVTFRfVFlQRSBpcyB0aGUgdHlwZSB0byB1c2UgaWYgbm8gc3BlY2lhbCBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLgorCisgICBEQVRBX1AgaXMgbm9uLXplcm8gZm9yIGRhdGEgb3IgbGltbSB2YWx1ZXMsIHplcm8gZm9yIGluc24gb3BlcmFuZHMuCisgICBSZW1lbWJlciB0aGF0IHRoZSBvcGNvZGUgImluc2VydGlvbiBmbnMiIGNhbm5vdCBiZSB1c2VkIG9uIGRhdGEsIHRoZXkncmUKKyAgIG9ubHkgZm9yIGluc2VydGluZyBvcGVyYW5kcyBpbnRvIGluc25zLiAgVGhleSBhbHNvIGNhbid0IGJlIHVzZWQgZm9yIGxpbW0KKyAgIHZhbHVlcyBhcyB0aGUgaW5zZXJ0aW9uIHJvdXRpbmVzIGRvbid0IGhhbmRsZSBsaW1tIHZhbHVlcy4gIFdoZW4gY2FsbGVkIGZvcgorICAgaW5zbnMgd2UgcmV0dXJuIGZ1ZGdlZCByZWxvYyB0eXBlcyAocmVhbF92YWx1ZSAtIEJGRF9SRUxPQ19VTlVTRUQpLiAgV2hlbgorICAgY2FsbGVkIGZvciBkYXRhIG9yIGxpbW0gdmFsdWVzIHdlIHVzZSByZWFsIHJlbG9jIHR5cGVzLiAgKi8KKworc3RhdGljIGludAorZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoZGF0YV9wLCBkZWZhdWx0X3R5cGUsIGV4cCwgZXhwbmV3KQorICAgICBpbnQgZGF0YV9wOworICAgICBpbnQgZGVmYXVsdF90eXBlOworICAgICBleHByZXNzaW9uUyAqZXhwOworICAgICBleHByZXNzaW9uUyAqZXhwbmV3OworeworICAvKiBJZiB0aGUgZXhwcmVzc2lvbiBpcyAic3ltYm9sID4+IDIiIHdlIG11c3QgY2hhbmdlIGl0IHRvIGp1c3QgInN5bWJvbCIsCisgICAgIGFzIGZpeF9uZXdfZXhwIGNhbid0IGhhbmRsZSBpdC4gIFNpbWlsYXJpbHkgZm9yIChzeW1ib2wgLSBzeW1ib2wpID4+IDIuCisgICAgIFRoYXQncyBvayB0aG91Z2guICBXaGF0J3MgcmVhbGx5IGdvaW5nIG9uIGhlcmUgaXMgdGhhdCB3ZSdyZSB1c2luZworICAgICAiPj4gMiIgYXMgYSBzcGVjaWFsIHN5bnRheCBmb3Igc3BlY2lmeWluZyBCRkRfUkVMT0NfQVJDX0IyNi4gICovCisKKyAgaWYgKGV4cC0+WF9vcCA9PSBPX3JpZ2h0X3NoaWZ0CisgICAgICAmJiBleHAtPlhfb3Bfc3ltYm9sICE9IE5VTEwKKyAgICAgICYmIGV4cC0+WF9vcF9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudAorICAgICAgJiYgZXhwLT5YX29wX3N5bWJvbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID09IDIKKyAgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDApCisgICAgeworICAgICAgaWYgKGV4cC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKKwkgICYmIChleHAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50CisJICAgICAgfHwgZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wpKQorCXsKKwkgICpleHBuZXcgPSAqZXhwOworCSAgZXhwbmV3LT5YX29wID0gT19zeW1ib2w7CisJICBleHBuZXctPlhfb3Bfc3ltYm9sID0gTlVMTDsKKwkgIHJldHVybiBkYXRhX3AgPyBCRkRfUkVMT0NfQVJDX0IyNiA6IGFyY19vcGVyYW5kX21hcFsnSiddOworCX0KKyAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKKwkgICAgICAgJiYgZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AgPT0gT19zdWJ0cmFjdCkKKwl7CisJICAqZXhwbmV3ID0gZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlOworCSAgcmV0dXJuIGRhdGFfcCA/IEJGRF9SRUxPQ19BUkNfQjI2IDogYXJjX29wZXJhbmRfbWFwWydKJ107CisJfQorICAgIH0KKworICAqZXhwbmV3ID0gKmV4cDsKKyAgcmV0dXJuIGRlZmF1bHRfdHlwZTsKK30KKworLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGNvZGUuICBUaGlzIGlzIGNhbGxlZCBmb3IgYWxsIHRoZQorICAgZml4dXBzIHdlIGdlbmVyYXRlZCBieSB0aGUgY2FsbCB0byBmaXhfbmV3X2V4cCwgYWJvdmUuICBJbiB0aGUgY2FsbAorICAgYWJvdmUgd2UgdXNlZCBhIHJlbG9jIGNvZGUgd2hpY2ggd2FzIHRoZSBsYXJnZXN0IGxlZ2FsIHJlbG9jIGNvZGUKKyAgIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBIZXJlIHdlIHVuZG8gdGhhdCB0byByZWNvdmVyIHRoZSBvcGVyYW5kCisgICBpbmRleC4gIEF0IHRoaXMgcG9pbnQgYWxsIHN5bWJvbCB2YWx1ZXMgc2hvdWxkIGJlIGZ1bGx5IHJlc29sdmVkLAorICAgYW5kIHdlIGF0dGVtcHQgdG8gY29tcGxldGVseSByZXNvbHZlIHRoZSByZWxvYy4gIElmIHdlIGNhbiBub3QgZG8KKyAgIHRoYXQsIHdlIGRldGVybWluZSB0aGUgY29ycmVjdCByZWxvYyBjb2RlIGFuZCBwdXQgaXQgYmFjayBpbiB0aGUgZml4dXAuICAqLworCitpbnQKK21kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHVlUCwgc2VnKQorICAgICBmaXhTICpmaXhQOworICAgICB2YWx1ZVQgKnZhbHVlUDsKKyAgICAgc2VnVCBzZWc7Cit7CisgIC8qY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOyovCisgIHZhbHVlVCB2YWx1ZTsKKworICAvKiBGSVhNRSBGSVhNRSBGSVhNRTogVGhlIHZhbHVlIHdlIGFyZSBwYXNzZWQgaW4gKnZhbHVlUCBpbmNsdWRlcworICAgICB0aGUgc3ltYm9sIHZhbHVlcy4gIFNpbmNlIHdlIGFyZSB1c2luZyBCRkRfQVNTRU1CTEVSLCBpZiB3ZSBhcmUKKyAgICAgZG9pbmcgdGhpcyByZWxvY2F0aW9uIHRoZSBjb2RlIGluIHdyaXRlLmMgaXMgZ29pbmcgdG8gY2FsbAorICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCB3aGljaCBpcyBhbHNvIGdvaW5nIHRvIHVzZSB0aGUgc3ltYm9sCisgICAgIHZhbHVlLiAgVGhhdCBtZWFucyB0aGF0IGlmIHRoZSByZWxvYyBpcyBmdWxseSByZXNvbHZlZCB3ZSB3YW50IHRvCisgICAgIHVzZSAqdmFsdWVQIHNpbmNlIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgbm90IGJlaW5nIHVzZWQuCisgICAgIEhvd2V2ZXIsIGlmIHRoZSByZWxvYyBpcyBub3QgZnVsbHkgcmVzb2x2ZWQgd2UgZG8gbm90IHdhbnQgdG8gdXNlCisgICAgICp2YWx1ZVAsIGFuZCBtdXN0IHVzZSBmeF9vZmZzZXQgaW5zdGVhZC4gIEhvd2V2ZXIsIGlmIHRoZSByZWxvYworICAgICBpcyBQQyByZWxhdGl2ZSwgd2UgZG8gd2FudCB0byB1c2UgKnZhbHVlUCBzaW5jZSBpdCBpbmNsdWRlcyB0aGUKKyAgICAgcmVzdWx0IG9mIG1kX3BjcmVsX2Zyb20uICBUaGlzIGlzIGNvbmZ1c2luZy4gICovCisKKyAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCisgICAgeworICAgICAgdmFsdWUgPSAqdmFsdWVQOworICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChmaXhQLT5meF9wY3JlbCkKKyAgICB7CisgICAgICB2YWx1ZSA9ICp2YWx1ZVA7CisgICAgICAvKiBFTEYgcmVsb2NhdGlvbnMgYXJlIGFnYWluc3Qgc3ltYm9scy4KKwkgSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiB0aGVuIHdlIG5lZWQgdG8gbGVhdmUgaXQgZm9yCisJIHRoZSBsaW5rZXIgdG8gZGVhbCB3aXRoLiAgVW5mb3J0dW5hdGVseSwgbWRfcGNyZWxfZnJvbSBjYW4ndCB0ZWxsLAorCSBzbyB3ZSBoYXZlIHRvIHVuZG8gaXQncyBlZmZlY3RzIGhlcmUuICAqLworICAgICAgaWYgKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCisJICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQorCXZhbHVlICs9IG1kX3BjcmVsX2Zyb20gKGZpeFApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OworICAgICAgaWYgKGZpeFAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCisJeworCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4UC0+Znhfc3Vic3kpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogV2UgY2FuJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCisJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmICgoaW50KSBmaXhQLT5meF9yX3R5cGUgPj0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKKyAgICB7CisgICAgICBpbnQgb3BpbmRleDsKKyAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgIGNoYXIgKndoZXJlOworICAgICAgYXJjX2luc24gaW5zbjsKKworICAgICAgb3BpbmRleCA9IChpbnQpIGZpeFAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7CisKKyAgICAgIG9wZXJhbmQgPSAmYXJjX29wZXJhbmRzW29waW5kZXhdOworCisgICAgICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAorCSB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KKyAgICAgIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCWluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgICBlbHNlCisJaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGluc24gPSBhcmNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIC0xLCBOVUxMLCAob2Zmc2V0VCkgdmFsdWUsCisJCQkJIGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUpOworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCWJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgICBlbHNlCisJYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKworICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUpCisJeworCSAgLyogTm90aGluZyBlbHNlIHRvIGRvIGhlcmUuICAqLworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uCisJIFdlIGFyZSBvbmx5IHByZXBhcmVkIHRvIHR1cm4gYSBmZXcgb2YgdGhlIG9wZXJhbmRzIGludG8gcmVsb2NzLgorCSAhISEgTm90ZSB0aGF0IHdlIGNhbid0IGhhbmRsZSBsaW1tIHZhbHVlcyBoZXJlLiAgU2luY2Ugd2UncmUgdXNpbmcKKwkgaW1wbGljaXQgYWRkZW5kcyB0aGUgYWRkZW5kIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24sCisJIGhvd2V2ZXIsIHRoZSBvcGNvZGUgaW5zZXJ0aW9uIHJvdXRpbmVzIGN1cnJlbnRseSBkbyBub3RoaW5nIHdpdGgKKwkgbGltbSB2YWx1ZXMuICAqLworICAgICAgaWYgKG9wZXJhbmQtPmZtdCA9PSAnQicpCisJeworCSAgYXNzZXJ0ICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpICE9IDAKKwkJICAmJiBvcGVyYW5kLT5iaXRzID09IDIwCisJCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gNyk7CisJICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTDsKKwl9CisgICAgICBlbHNlIGlmICgwICYmIG9wZXJhbmQtPmZtdCA9PSAnSicpCisJeworCSAgYXNzZXJ0ICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0gpICE9IDAKKwkJICAmJiBvcGVyYW5kLT5iaXRzID09IDI0CisJCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMzIpOworCSAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0FSQ19CMjY7CisJfQorICAgICAgZWxzZSBpZiAoMCAmJiBvcGVyYW5kLT5mbXQgPT0gJ0wnKQorCXsKKwkgIGFzc2VydCAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfTElNTSkgIT0gMAorCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMzIKKwkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAzMik7CisJICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCV8oInVucmVzb2x2ZWQgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcmVzb2x2ZWQiKSk7CisJICBmaXhQLT5meF9kb25lID0gMTsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKwl7CisJY2FzZSBCRkRfUkVMT0NfODoKKwkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAorCQkJICAgICAgdmFsdWUsIDEpOworCSAgYnJlYWs7CisJY2FzZSBCRkRfUkVMT0NfMTY6CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKKwkJCSAgICAgIHZhbHVlLCAyKTsKKwkgIGJyZWFrOworCWNhc2UgQkZEX1JFTE9DXzMyOgorCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCisJCQkgICAgICB2YWx1ZSwgNCk7CisJICBicmVhazsKKyNpZiAwCisJY2FzZSBCRkRfUkVMT0NfNjQ6CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKKwkJCSAgICAgIHZhbHVlLCA4KTsKKwkgIGJyZWFrOworI2VuZGlmCisJY2FzZSBCRkRfUkVMT0NfQVJDX0IyNjoKKwkgIC8qIElmICFmaXhQLT5meF9kb25lIHRoZW4gYHZhbHVlJyBpcyBhbiBpbXBsaWNpdCBhZGRlbmQuCisJICAgICBXZSBtdXN0IHNoaWZ0IGl0IHJpZ2h0IGJ5IDIgaW4gdGhpcyBjYXNlIGFzIHdlbGwgYmVjYXVzZSB0aGUKKwkgICAgIGxpbmtlciBwZXJmb3JtcyB0aGUgcmVsb2NhdGlvbiBhbmQgdGhlbiBhZGRzIHRoaXMgaW4gKGFzIG9wcG9zZWQKKwkgICAgIHRvIGFkZGluZyB0aGlzIGluIGFuZCB0aGVuIHNoaWZ0aW5nIHJpZ2h0IGJ5IDIpLiAgKi8KKwkgIHZhbHVlID4+PSAyOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCisJCQkgICAgICB2YWx1ZSwgNCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKKworICByZXR1cm4gMTsKK30KKworLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0CisgICBmb3JtYXQuICAqLworCithcmVsZW50ICoKK3RjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4UCkKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGZpeFMgKmZpeFA7Cit7CisgIGFyZWxlbnQgKnJlbG9jOworCisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisKKyAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeFAtPmZ4X2FkZHN5LT5ic3ltOworICByZWxvYy0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKKyAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7CisgIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCisJCSAgICBmaXhQLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7CisKKyAgcmVsb2MtPmFkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKKworICByZXR1cm4gcmVsb2M7Cit9CisMCisvKiBGcm9iYmVycy4gICovCisKKyNpZiAwCisvKiBTZXQgdGhlIHJlYWwgbmFtZSBpZiB0aGUgLnJlbmFtZSBwc2V1ZG8tb3Agd2FzIHVzZWQuCisgICBSZXR1cm4gMSBpZiB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisKK2ludAorYXJjX2Zyb2Jfc3ltYm9sIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgaWYgKHN5bS0+c3lfdGMucmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCisgICAgU19TRVRfTkFNRSAoc3ltLCBzeW0tPnN5X3RjLnJlYWxfbmFtZSk7CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJjLmggYi9nYXMvY29uZmlnL3RjLWFyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTVmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWFyYy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIHRjLWFyYy5oIC0gTWFjcm9zIGFuZCB0eXBlIGRlZmluZXMgZm9yIHRoZSBBUkMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2RlZmluZSBUQ19BUkMgMQorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKKworI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisjZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2FyYworCisjZGVmaW5lIExJVFRMRV9FTkRJQU4gICAxMjM0CisjZGVmaW5lIEJJR19FTkRJQU4gICAgICA0MzIxCisKKy8qIFRoZSBlbmRpYW5uZXNzIG9mIHRoZSB0YXJnZXQgZm9ybWF0IG1heSBjaGFuZ2UgYmFzZWQgb24gY29tbWFuZAorICAgbGluZSBhcmd1bWVudHMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmFyY190YXJnZXRfZm9ybWF0OworI2RlZmluZSBERUZBVUxUX1RBUkdFVF9GT1JNQVQgImVsZjMyLWxpdHRsZWFyYyIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBhcmNfdGFyZ2V0X2Zvcm1hdAorI2RlZmluZSBERUZBVUxUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisjZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKKworI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiQVJDIEdBUyAiCisKKyNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCisKKyNkZWZpbmUgTURfQVBQTFlfRklYMworCisvKiBUaGUgQVJDIG5lZWRzIHRvIHBhcnNlIHJlbG9jIHNwZWNpZmllcnMgaW4gLndvcmQuICAqLworCitleHRlcm4gdm9pZCBhcmNfcGFyc2VfY29uc19leHByZXNzaW9uICgpOworI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIFwKK2FyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKEVYUCwgTkJZVEVTKQorCitleHRlcm4gdm9pZCBhcmNfY29uc19maXhfbmV3ICgpOworI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcoRlJBRywgV0hFUkUsIE5CWVRFUywgRVhQKSBcCithcmNfY29uc19maXhfbmV3IChGUkFHLCBXSEVSRSwgTkJZVEVTLCBFWFApCisKKyNpZiAwCisvKiBFeHRyYSBzdHVmZiB0aGF0IHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBmb3IgZWFjaCBzeW1ib2wuICAqLworc3RydWN0IGFyY190Y19zeQoreworICAvKiBUaGUgcmVhbCBuYW1lLCBpZiB0aGUgc3ltYm9sIHdhcyByZW5hbWVkLiAgKi8KKyAgY2hhciAqcmVhbF9uYW1lOworfTsKKworI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN0cnVjdCBhcmNfdGNfc3kKKworLyogRmluaXNoIHVwIHRoZSBzeW1ib2wuICAqLworZXh0ZXJuIGludCBhcmNfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CisjZGVmaW5lIHRjX2Zyb2Jfc3ltYm9sKHN5bSwgcHVudCkgcHVudCA9IGFyY19mcm9iX3N5bWJvbCAoc3ltKQorI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFybS5jIGIvZ2FzL2NvbmZpZy90Yy1hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk4YmYwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1hcm0uYwpAQCAtMCwwICsxLDY4NTcgQEAKKy8qIHRjLWFybS5jIC0tIEFzc2VtYmxlIGZvciB0aGUgQVJNCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKwlNb2RpZmllZCBieSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNkZWZpbmUgIE5PX1JFTE9DIDAKKyNpbmNsdWRlICJhcy5oIgorCisvKiBuZWVkIFRBUkdFVF9DUFUgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgInN5bWJvbHMuaCIKKyNpbmNsdWRlICJsaXN0aW5nLmgiCisKKyNpZmRlZiBPQkpfRUxGCisjaW5jbHVkZSAiZWxmL2FybS5oIgorI2VuZGlmCisKKy8qIFR5cGVzIG9mIHByb2Nlc3NvciB0byBhc3NlbWJsZSBmb3IuICAqLworI2RlZmluZSBBUk1fMQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUk1fMgkJMHgwMDAwMDAwMgorI2RlZmluZSBBUk1fMwkJMHgwMDAwMDAwNAorI2RlZmluZSBBUk1fMjUwCQlBUk1fMworI2RlZmluZSBBUk1fNgkJMHgwMDAwMDAwOAorI2RlZmluZSBBUk1fNwkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KKyNkZWZpbmUgQVJNXzgJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCisjZGVmaW5lIEFSTV85CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLworI2RlZmluZSBBUk1fQ1BVX01BU0sJMHgwMDAwMDAwZgorCisvKiBUaGUgZm9sbG93aW5nIGJpdG1hc2tzIGNvbnRyb2wgQ1BVIGV4dGVuc2lvbnMgKEFSTTcgb253YXJkcyk6ICovCisjZGVmaW5lIEFSTV9MT05HTVVMCTB4MDAwMDAwMTAJLyogYWxsb3cgbG9uZyBtdWx0aXBsaWVzICovCisjZGVmaW5lIEFSTV9IQUxGV09SRCAgICAweDAwMDAwMDIwCS8qIGFsbG93IGhhbGYgd29yZCBsb2FkcyAqLworI2RlZmluZSBBUk1fVEhVTUIgICAgICAgMHgwMDAwMDA0MAkvKiBhbGxvdyBCWCBpbnN0cnVjdGlvbiAgKi8KKworI2RlZmluZSBBUk1fQVJDSHY0CShBUk1fNyB8IEFSTV9MT05HTVVMIHwgQVJNX0hBTEZXT1JEKQorCisvKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnM6ICAqLworI2RlZmluZSBBUk1fQU5ZCQkweDAwZmZmZmZmCisjZGVmaW5lIEFSTV8yVVAJCTB4MDBmZmZmZmUKKyNkZWZpbmUgQVJNX0FMTAkJQVJNXzJVUAkJLyogTm90IGFybTEgb25seSAqLworI2RlZmluZSBBUk1fM1VQCQkweDAwZmZmZmZjCisjZGVmaW5lIEFSTV82VVAJCTB4MDBmZmZmZjggICAgICAvKiBJbmNsdWRlcyBBUk03ICovCisKKyNkZWZpbmUgRlBVX0NPUkUJMHg4MDAwMDAwMAorI2RlZmluZSBGUFVfRlBBMTAJMHg0MDAwMDAwMAorI2RlZmluZSBGUFVfRlBBMTEJMHg0MDAwMDAwMAorI2RlZmluZSBGUFVfTk9ORQkwCisKKy8qIFNvbWUgdXNlZnVsIGNvbWJpbmF0aW9ucyAgKi8KKyNkZWZpbmUgRlBVX0FMTAkJMHhmZjAwMDAwMAkvKiBOb3RlIHRoaXMgaXMgfkFSTV9BTlkgKi8KKyNkZWZpbmUgRlBVX01FTU1VTFRJCTB4N2YwMDAwMDAJLyogTm90IGZwdV9jb3JlICovCisKKyAgICAgCisjaWZuZGVmIENQVV9ERUZBVUxUCisjaWYgZGVmaW5lZCBfX3RodW1iX18KKyNkZWZpbmUgQ1BVX0RFRkFVTFQgKEFSTV9BUkNIdjQgfCBBUk1fVEhVTUIpCisjZWxzZQorI2RlZmluZSBDUFVfREVGQVVMVCBBUk1fQUxMCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZQVV9ERUZBVUxUCisjZGVmaW5lIEZQVV9ERUZBVUxUIEZQVV9BTEwKKyNlbmRpZgorCisjZGVmaW5lIHN0cmVxKGEsYikgIChzdHJjbXAgKGEsIGIpID09IDApCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWNwdV92YXJpYW50ID0gQ1BVX0RFRkFVTFQgfCBGUFVfREVGQVVMVDsKK3N0YXRpYyBpbnQgdGFyZ2V0X29hYmkgPSAwOworCisjaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKKy8qIEZsYWdzIHN0b3JlZCBpbiBwcml2YXRlIGFyZWEgb2YgQkZEIHN0cnVjdHVyZSAqLworc3RhdGljIGJvb2xlYW4JCXVzZXNfYXBjc18yNiA9IGZhbHNlOworc3RhdGljIGJvb2xlYW4JCXN1cHBvcnRfaW50ZXJ3b3JrID0gZmFsc2U7CitzdGF0aWMgYm9vbGVhbgkJdXNlc19hcGNzX2Zsb2F0ID0gZmFsc2U7CitzdGF0aWMgYm9vbGVhbgkJcGljX2NvZGUgPSBmYWxzZTsKKyNlbmRpZgorCisvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKKyAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLworQ09OU1QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiQCI7CisKKy8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCisgICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KKy8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cworICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCisvKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCitDT05TVCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOworCisjaWZkZWYgVEVfTElOVVgKK0NPTlNUIGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKKyNlbHNlCitDT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKKyNlbmRpZgorCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworQ09OU1QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBBcyBpbiAwZjEyLjQ1NiAqLworLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KKworQ09OU1QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYZUVwUCI7CisKKy8qIFByZWZpeCBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFuIGltbWVkaWF0ZQorICAgdmFsdWUuICAqLworI2RlZmluZSBpc19pbW1lZGlhdGVfcHJlZml4KEMpICgoQykgPT0gJyMnIHx8IChDKSA9PSAnJCcpCisKKyNpZmRlZiBPQkpfRUxGCitzeW1ib2xTICogR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iICovCisjZW5kaWYKKworQ09OU1QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLworCitzdGF0aWMgaW50IHRodW1iX21vZGUgPSAwOyAgICAgIC8qIG5vbi16ZXJvIGlmIGFzc2VtYmxpbmcgdGh1bWIgaW5zdHJ1Y3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IGFybV9maXgKK3sKKyAgaW50IHRodW1iX21vZGU7Cit9IGFybV9maXhfZGF0YTsKKworc3RydWN0IGFybV9pdAoreworICBDT05TVCBjaGFyICogIGVycm9yOworICB1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uOworICBpbnQgICAgICAgICAgIHN1ZmZpeDsKKyAgaW50ICAgICAgICAgICBzaXplOworICBzdHJ1Y3QKKyAgICB7CisgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdHlwZTsKKyAgICAgIGV4cHJlc3Npb25TICAgICAgICAgICAgICBleHA7CisgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcGNfcmVsOworICAgIH0gcmVsb2M7Cit9OworCitzdHJ1Y3QgYXJtX2l0IGluc3Q7CisKK3N0cnVjdCBhc21fc2hpZnQKK3sKKyAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX3NoaWZ0IHNoaWZ0W10gPQoreworICB7ImFzbCIsIDB9LAorICB7ImxzbCIsIDB9LAorICB7ImxzciIsIDB4MDAwMDAwMjB9LAorICB7ImFzciIsIDB4MDAwMDAwNDB9LAorICB7InJvciIsIDB4MDAwMDAwNjB9LAorICB7InJyeCIsIDB4MDAwMDAwNjB9LAorICB7IkFTTCIsIDB9LAorICB7IkxTTCIsIDB9LAorICB7IkxTUiIsIDB4MDAwMDAwMjB9LAorICB7IkFTUiIsIDB4MDAwMDAwNDB9LAorICB7IlJPUiIsIDB4MDAwMDAwNjB9LAorICB7IlJSWCIsIDB4MDAwMDAwNjB9Cit9OworCisjZGVmaW5lIE5PX1NISUZUX1JFU1RSSUNUIDEKKyNkZWZpbmUgU0hJRlRfUkVTVFJJQ1QJICAwCisKKyNkZWZpbmUgTlVNX0ZMT0FUX1ZBTFMgOAorCitDT05TVCBjaGFyICogZnBfY29uc3RbXSA9IAoreworICAiMC4wIiwgIjEuMCIsICIyLjAiLCAiMy4wIiwgIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAiLCAwCit9OworCisvKiBOdW1iZXIgb2YgbGl0dGxlbnVtcyByZXF1aXJlZCB0byBob2xkIGFuIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCitMSVRUTEVOVU1fVFlQRSBmcF92YWx1ZXNbTlVNX0ZMT0FUX1ZBTFNdW01BWF9MSVRUTEVOVU1TXTsKKworI2RlZmluZSBGQUlMCSgtMSkKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKworI2RlZmluZSBTVUZGX1MgMQorI2RlZmluZSBTVUZGX0QgMgorI2RlZmluZSBTVUZGX0UgMworI2RlZmluZSBTVUZGX1AgNAorCisjZGVmaW5lIENQX1RfWCAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQ1BfVF9ZICAgMHgwMDQwMDAwMAorI2RlZmluZSBDUF9UX1ByZSAweDAxMDAwMDAwCisjZGVmaW5lIENQX1RfVUQgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQ1BfVF9XQiAgMHgwMDIwMDAwMAorCisjZGVmaW5lIENPTkRTX0JJVCAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTE9BRF9CSVQgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBUUkFOU19CSVQJKDB4MDAyMDAwMDApCisKK3N0cnVjdCBhc21fY29uZAoreworICBDT05TVCBjaGFyICogIHRlbXBsYXRlOworICB1bnNpZ25lZCBsb25nIHZhbHVlOworfTsKKworLyogVGhpcyBpcyB0byBzYXZlIGEgaGFzaCBsb29rLXVwIGluIHRoZSBjb21tb24gY2FzZSAqLworI2RlZmluZSBDT05EX0FMV0FZUyAweGUwMDAwMDAwCisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgY29uZHNbXSA9IAoreworICB7ImVxIiwgMHgwMDAwMDAwMH0sCisgIHsibmUiLCAweDEwMDAwMDAwfSwKKyAgeyJjcyIsIDB4MjAwMDAwMDB9LCB7ImhzIiwgMHgyMDAwMDAwMH0sCisgIHsiY2MiLCAweDMwMDAwMDAwfSwgeyJ1bCIsIDB4MzAwMDAwMDB9LCB7ImxvIiwgMHgzMDAwMDAwMH0sCisgIHsibWkiLCAweDQwMDAwMDAwfSwKKyAgeyJwbCIsIDB4NTAwMDAwMDB9LAorICB7InZzIiwgMHg2MDAwMDAwMH0sCisgIHsidmMiLCAweDcwMDAwMDAwfSwKKyAgeyJoaSIsIDB4ODAwMDAwMDB9LAorICB7ImxzIiwgMHg5MDAwMDAwMH0sCisgIHsiZ2UiLCAweGEwMDAwMDAwfSwKKyAgeyJsdCIsIDB4YjAwMDAwMDB9LAorICB7Imd0IiwgMHhjMDAwMDAwMH0sCisgIHsibGUiLCAweGQwMDAwMDAwfSwKKyAgeyJhbCIsIDB4ZTAwMDAwMDB9LAorICB7Im52IiwgMHhmMDAwMDAwMH0KK307CisKKy8qIFdhcm5pbmc6IElmIHRoZSB0b3AgYml0IG9mIHRoZSBzZXRfYml0cyBpcyBzZXQsIHRoZW4gdGhlIHN0YW5kYXJkCisgICBpbnN0cnVjdGlvbiBiaXRtYXNrIGlzIGlnbm9yZWQsIGFuZCB0aGUgbmV3IGJpdG1hc2sgaXMgdGFrZW4gZnJvbQorICAgdGhlIHNldF9iaXRzOiAqLworc3RydWN0IGFzbV9mbGcKK3sKKyAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsJLyogQmFzaWMgZmxhZyBzdHJpbmcgKi8KKyAgdW5zaWduZWQgbG9uZyBzZXRfYml0czsJLyogQml0cyB0byBzZXQgKi8KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzX2ZsYWdbXSA9Cit7CisgIHsicyIsIENPTkRTX0JJVH0sCisgIHtOVUxMLCAwfQorfTsKKworc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGxkcl9mbGFnc1tdID0KK3sKKyAgeyJiIiwgIDB4MDA0MDAwMDB9LAorICB7InQiLCAgVFJBTlNfQklUfSwKKyAgeyJidCIsIDB4MDA0MDAwMDAgfCBUUkFOU19CSVR9LAorICB7ImgiLCAgMHg4MDEwMDBiMH0sCisgIHsic2giLCAweDgwMTAwMGYwfSwKKyAgeyJzYiIsIDB4ODAxMDAwZDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzdHJfZmxhZ3NbXSA9Cit7CisgIHsiYiIsICAweDAwNDAwMDAwfSwKKyAgeyJ0IiwgIFRSQU5TX0JJVH0sCisgIHsiYnQiLCAweDAwNDAwMDAwIHwgVFJBTlNfQklUfSwKKyAgeyJoIiwgIDB4ODAwMDAwYjB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBieXRlX2ZsYWdbXSA9Cit7CisgIHsiYiIsIDB4MDA0MDAwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBjbXBfZmxhZ3NbXSA9Cit7CisgIHsicyIsIENPTkRTX0JJVH0sCisgIHsicCIsIDB4MDAxMGYwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZG1fZmxhZ3NbXSA9Cit7CisgIHsiZWQiLCAweDAxODAwMDAwfSwKKyAgeyJmZCIsIDB4MDA4MDAwMDB9LAorICB7ImVhIiwgMHgwMTAwMDAwMH0sCisgIHsiZmEiLCAweDA4MDAwMDAwfSwKKyAgeyJpYiIsIDB4MDE4MDAwMDB9LAorICB7ImlhIiwgMHgwMDgwMDAwMH0sCisgIHsiZGIiLCAweDAxMDAwMDAwfSwKKyAgeyJkYSIsIDB4MDgwMDAwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzdG1fZmxhZ3NbXSA9Cit7CisgIHsiZWQiLCAweDA4MDAwMDAwfSwKKyAgeyJmZCIsIDB4MDEwMDAwMDB9LAorICB7ImVhIiwgMHgwMDgwMDAwMH0sCisgIHsiZmEiLCAweDAxODAwMDAwfSwKKyAgeyJpYiIsIDB4MDE4MDAwMDB9LAorICB7ImlhIiwgMHgwMDgwMDAwMH0sCisgIHsiZGIiLCAweDAxMDAwMDAwfSwKKyAgeyJkYSIsIDB4MDgwMDAwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZm1fZmxhZ3NbXSA9Cit7CisgIHsiZmQiLCAweDAwODAwMDAwfSwKKyAgeyJlYSIsIDB4MDEwMDAwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzZm1fZmxhZ3NbXSA9Cit7CisgIHsiZmQiLCAweDAxMDAwMDAwfSwKKyAgeyJlYSIsIDB4MDA4MDAwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyByb3VuZF9mbGFnc1tdID0KK3sKKyAgeyJwIiwgMHgwMDAwMDAyMH0sCisgIHsibSIsIDB4MDAwMDAwNDB9LAorICB7InoiLCAweDAwMDAwMDYwfSwKKyAge05VTEwsIDB9Cit9OworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEZJWCBpbnN0cnVjdGlvbiBpcyBicm9rZW4gb24gc29tZSBhc3NlbWJsZXJzLAorICAgaW4gdGhhdCBpdCBhY2NlcHRzIGEgcHJlY2lzaW9uIHNwZWNpZmllciBhcyB3ZWxsIGFzIGEgcm91bmRpbmcgc3BlY2lmaWVyLAorICAgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoaXMgaXMgbWVhbmluZ2xlc3MuICBUbyBiZSBtb3JlIGNvbXBhdGlibGUsIHdlCisgICBhY2NlcHQgaXQgYXMgd2VsbCwgdGhvdWdoIG9mIGNvdXJzZSBpdCBkb2VzIG5vdCBzZXQgYW55IGJpdHMuICAqLworc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGZpeF9mbGFnc1tdID0KK3sKKyAgeyJwIiwgMHgwMDAwMDAyMH0sCisgIHsibSIsIDB4MDAwMDAwNDB9LAorICB7InoiLCAweDAwMDAwMDYwfSwKKyAgeyJzcCIsIDB4MDAwMDAwMjB9LAorICB7InNtIiwgMHgwMDAwMDA0MH0sCisgIHsic3oiLCAweDAwMDAwMDYwfSwKKyAgeyJkcCIsIDB4MDAwMDAwMjB9LAorICB7ImRtIiwgMHgwMDAwMDA0MH0sCisgIHsiZHoiLCAweDAwMDAwMDYwfSwKKyAgeyJlcCIsIDB4MDAwMDAwMjB9LAorICB7ImVtIiwgMHgwMDAwMDA0MH0sCisgIHsiZXoiLCAweDAwMDAwMDYwfSwKKyAge05VTEwsIDB9Cit9OworCitzdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgZXhjZXB0X2ZsYWdbXSA9Cit7CisgIHsiZSIsIDB4MDA0MDAwMDB9LAorICB7TlVMTCwgMH0KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBjcGxvbmdfZmxhZ1tdID0KK3sKKyAgeyJsIiwgMHgwMDQwMDAwMH0sCisgIHtOVUxMLCAwfQorfTsKKworc3RydWN0IGFzbV9wc3IKK3sKKyAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBudW1iZXI7Cit9OworCisjZGVmaW5lIFBTUl9GSUVMRF9NQVNLICAweDAwMGYwMDAwCisKKyNkZWZpbmUgUFNSX0ZMQUdTCTB4MDAwODAwMDAKKyNkZWZpbmUgUFNSX0NPTlRST0wJMHgwMDAxMDAwMCAvKiBVbmRvY3VtZW50ZWQgaW5zdHJ1Y3Rpb24sIGl0cyB1c2UgaXMgZGlzY291cmFnZWQgYnkgQVJNICovCisjZGVmaW5lIFBTUl9BTEwJCTB4MDAwOTAwMDAKKworI2RlZmluZSBDUFNSX0FMTAkwCisjZGVmaW5lIFNQU1JfQUxMCTEKKyNkZWZpbmUgQ1BTUl9GTEcJMgorI2RlZmluZSBTUFNSX0ZMRwkzCisjZGVmaW5lIENQU1JfQ1RMCTQKKyNkZWZpbmUgU1BTUl9DVEwJNQorCitzdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9wc3IgcHNyc1tdID0KK3sKKyAgLyogVmFsaWQgPHBzcj4ncyAqLworICB7ImNwc3IiLAlDUFNSX0FMTH0sCisgIHsiY3Bzcl9hbGwiLAlDUFNSX0FMTH0sCisgIHsic3BzciIsCVNQU1JfQUxMfSwKKyAgeyJzcHNyX2FsbCIsCVNQU1JfQUxMfSwKKworICAvKiBWYWxpZCA8cHNyZj4ncyAqLworICB7ImNwc3JfZmxnIiwJQ1BTUl9GTEd9LAorICB7InNwc3JfZmxnIiwJU1BTUl9GTEd9LAorICAKKyAgLyogVmFsaWQgPHBzcmM+J3MgKi8KKyAgeyJjcHNyX2MiLAlDUFNSX0NUTH0sCisgIHsiY3Bzcl9jdGwiLAlDUFNSX0NUTH0sCisgIHsic3Bzcl9jIiwJU1BTUl9DVEx9LAorICB7InNwc3JfY3RsIiwJU1BTUl9DVEx9Cit9OworCisvKiBGdW5jdGlvbnMgY2FsbGVkIGJ5IHBhcnNlciAqLworLyogQVJNIGluc3RydWN0aW9ucyAqLworc3RhdGljIHZvaWQgZG9fYXJpdAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX2NtcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX21vdgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX2xkc3QJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19sZG1zdG0JCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19icmFuY2gJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19zd2kJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CisvKiBQc2V1ZG8gT3AgY29kZXMgKi8KK3N0YXRpYyB2b2lkIGRvX2FkcgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX25vcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKKy8qIEFSTSAyICovCitzdGF0aWMgdm9pZCBkb19tdWwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19tbGEJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CisvKiBBUk0gMyAqLworc3RhdGljIHZvaWQgZG9fc3dhcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKKy8qIEFSTSA2ICovCitzdGF0aWMgdm9pZCBkb19tc3IJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19tcnMJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CisvKiBBUk0gN00gKi8KK3N0YXRpYyB2b2lkIGRvX211bGwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CisvKiBBUk0gVEhVTUIgKi8KK3N0YXRpYyB2b2lkIGRvX2J4ICAgICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKKworLyogQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCitzdGF0aWMgdm9pZCBkb19jZHAJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19sc3RjCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOworc3RhdGljIHZvaWQgZG9fY29fcmVnCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOworc3RhdGljIHZvaWQgZG9fZnBfY3RybAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX2ZwX2xkc3QJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7CitzdGF0aWMgdm9pZCBkb19mcF9sZG1zdG0JUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX2ZwX2R5YWRpYwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOworc3RhdGljIHZvaWQgZG9fZnBfbW9uYWRpYwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOworc3RhdGljIHZvaWQgZG9fZnBfY21wCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOworc3RhdGljIHZvaWQgZG9fZnBfZnJvbV9yZWcJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0YXRpYyB2b2lkIGRvX2ZwX3RvX3JlZwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOworCitzdGF0aWMgdm9pZCBmaXhfbmV3X2FybQkJUEFSQU1TICgoZnJhZ1MgKmZyYWcsIGludCB3aGVyZSwgCisJCQkJCSBzaG9ydCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwKKwkJCQkJIGludCBwY19yZWwsIGludCByZWxvYykpOworc3RhdGljIGludCBhcm1fcmVnX3BhcnNlCVBBUkFNUyAoKGNoYXIgKipjY3ApKTsKK3N0YXRpYyBpbnQgYXJtX3Bzcl9wYXJzZQlQQVJBTVMgKChjaGFyICoqY2NwKSk7CitzdGF0aWMgdm9pZCBzeW1ib2xfbG9jYXRlCVBBUkFNUyAoKHN5bWJvbFMgKiwgQ09OU1QgY2hhciAqLCBzZWdULAorCQkJCQkgdmFsdWVULCBmcmFnUyAqKSk7CitzdGF0aWMgaW50IGFkZF90b19saXRfcG9vbAlQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdW5zaWduZWQgdmFsaWRhdGVfaW1tZWRpYXRlCVBBUkFNUyAoKHVuc2lnbmVkKSk7CitzdGF0aWMgaW50IHZhbGlkYXRlX29mZnNldF9pbW0JUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIG9wY29kZV9zZWxlY3QJUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBlbmRfb2ZfbGluZQkJUEFSQU1TICgoY2hhciAqKSk7CitzdGF0aWMgaW50IHJlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOworc3RhdGljIGludCBwc3JfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQsIGludCkpOworc3RhdGljIGludCBjb19wcm9jX251bWJlcglQQVJBTVMgKChjaGFyICoqKSk7CitzdGF0aWMgaW50IGNwX29wY19leHByCQlQQVJBTVMgKChjaGFyICoqLCBpbnQsIGludCkpOworc3RhdGljIGludCBjcF9yZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKK3N0YXRpYyBpbnQgZnBfcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7CitzdGF0aWMgaW50IGNwX2FkZHJlc3Nfb2Zmc2V0CVBBUkFNUyAoKGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgbXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24JUEFSQU1TICgoY2hhciAqKikpOworc3RhdGljIGludCBza2lwX3Bhc3RfY29tbWEJUEFSQU1TICgoY2hhciAqKikpOworc3RhdGljIGludCB3YWxrX25vX2JpZ251bXMJUEFSQU1TICgoc3ltYm9sUyAqKSk7CitzdGF0aWMgaW50IG5lZ2F0ZV9kYXRhX29wCVBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBpbnQgZGF0YV9vcDIJCVBBUkFNUyAoKGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgZnBfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7CitzdGF0aWMgbG9uZyByZWdfbGlzdAkJUEFSQU1TICgoY2hhciAqKikpOworc3RhdGljIHZvaWQgdGh1bWJfbG9hZF9zdG9yZQlQQVJBTVMgKChjaGFyICosIGludCwgaW50KSk7CitzdGF0aWMgaW50IGRlY29kZV9zaGlmdAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7CitzdGF0aWMgaW50IGxkc3RfZXh0ZW5kCQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRodW1iX2FkZF9zdWIJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGluc2VydF9yZWcJCVBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgdGh1bWJfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB0aHVtYl9tb3ZfY29tcGFyZQlQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgc2V0X2NvbnN0YW50X2Zsb251bXMJUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZhbHVlVCBtZF9jaGFyc190b19udW1iZXIJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGluc2VydF9yZWdfYWxpYXMJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIG91dHB1dF9pbnN0CQlQQVJBTVMgKChjaGFyICopKTsKKyNpZmRlZiBPQkpfRUxGCitzdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCWFybV9wYXJzZV9yZWxvYyh2b2lkKTsKKyNlbmRpZgorCisvKiBBUk0gaW5zdHJ1Y3Rpb25zIHRha2UgNGJ5dGVzIGluIHRoZSBvYmplY3QgZmlsZSwgVGh1bWIgaW5zdHJ1Y3Rpb25zCisgICB0YWtlIDI6ICovCisjZGVmaW5lIElOU05fU0laRSAgICAgICA0CisKKy8qIExPTkdFU1RfSU5TVCBpcyB0aGUgbG9uZ2VzdCBiYXNpYyBpbnN0cnVjdGlvbiBuYW1lIHdpdGhvdXQgY29uZGl0aW9ucyBvciAKKyAqIGZsYWdzLgorICogQVJNN00gaGFzIDQgb2YgbGVuZ3RoIDUKKyAqLworCisjZGVmaW5lIExPTkdFU1RfSU5TVCA1CisKK3N0cnVjdCBhc21fb3Bjb2RlIAoreworICBDT05TVCBjaGFyICogICAgICAgICAgIHRlbXBsYXRlOwkvKiBCYXNpYyBzdHJpbmcgdG8gbWF0Y2ggKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2YWx1ZTsJCS8qIEJhc2ljIGluc3RydWN0aW9uIGNvZGUgKi8KKyAgQ09OU1QgY2hhciAqICAgICAgICAgICBjb21wX3N1ZmZpeDsJLyogQ29tcHVsc29yeSBzdWZmaXggdGhhdCBtdXN0IGZvbGxvdyBjb25kcyAqLworICBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyAqIGZsYWdzOwkgICAgICAgIC8qIEJpdHMgdG8gdG9nZ2xlIGlmIGZsYWcgJ24nIHNldCAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZhcmlhbnRzOwkvKiBXaGljaCBDUFUgdmFyaWFudHMgdGhpcyBleGlzdHMgZm9yICovCisgIC8qIEZ1bmN0aW9uIHRvIGNhbGwgdG8gcGFyc2UgYXJncyAqLworICB2b2lkICgqICAgICAgICAgICAgICAgIHBhcm1zKSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSBpbnNuc1tdID0gCit7CisvKiBBUk0gSW5zdHJ1Y3Rpb25zICovCisgIHsiYW5kIiwgICAweDAwMDAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAorICB7ImVvciIsICAgMHgwMDIwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKKyAgeyJzdWIiLCAgIDB4MDA0MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCisgIHsicnNiIiwgICAweDAwNjAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAorICB7ImFkZCIsICAgMHgwMDgwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKKyAgeyJhZGMiLCAgIDB4MDBhMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCisgIHsic2JjIiwgICAweDAwYzAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAorICB7InJzYyIsICAgMHgwMGUwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKKyAgeyJvcnIiLCAgIDB4MDE4MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCisgIHsiYmljIiwgICAweDAxYzAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAorICB7InRzdCIsICAgMHgwMTAwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAorICB7InRlcSIsICAgMHgwMTIwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAorICB7ImNtcCIsICAgMHgwMTQwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAorICB7ImNtbiIsICAgMHgwMTYwMDAwMCwgTlVMTCwgICBjbXBfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19jbXB9LAorICB7Im1vdiIsICAgMHgwMWEwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19tb3Z9LAorICB7Im12biIsICAgMHgwMWUwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19tb3Z9LAorICB7InN0ciIsICAgMHgwNDAwMDAwMCwgTlVMTCwgICBzdHJfZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZHN0fSwKKyAgeyJsZHIiLCAgIDB4MDQxMDAwMDAsIE5VTEwsICAgbGRyX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRzdH0sCisgIHsic3RtIiwgICAweDA4MDAwMDAwLCBOVUxMLCAgIHN0bV9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkbXN0bX0sCisgIHsibGRtIiwgICAweDA4MTAwMDAwLCBOVUxMLCAgIGxkbV9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkbXN0bX0sCisgIHsic3dpIiwgICAweDBmMDAwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX3N3aX0sCisgIHsiYmwiLCAgICAweDBiZmZmZmZlLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2JyYW5jaH0sCisgIHsiYiIsICAgICAweDBhZmZmZmZlLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2JyYW5jaH0sCisKKy8qIFBzZXVkbyBvcHMgKi8KKyAgeyJhZHIiLCAgIDB4MDI4ZjAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fYWRyfSwKKyAgeyJub3AiLCAgIDB4MDFhMDAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9BTlksICAgICAgZG9fbm9wfSwKKworLyogQVJNIDIgbXVsdGlwbGllcyAqLworICB7Im11bCIsICAgMHgwMDAwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNXzJVUCwgICAgICBkb19tdWx9LAorICB7Im1sYSIsICAgMHgwMDIwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNXzJVUCwgICAgICBkb19tbGF9LAorCisvKiBBUk0gMyAtIHN3cCBpbnN0cnVjdGlvbnMgKi8KKyAgeyJzd3AiLCAgIDB4MDEwMDAwOTAsIE5VTEwsICAgYnl0ZV9mbGFnLCAgIEFSTV8zVVAsICAgICAgZG9fc3dhcH0sCisKKy8qIEFSTSA2IENvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLworICB7Im1ycyIsICAgMHgwMTBmMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNXzZVUCwgICAgICBkb19tcnN9LAorICB7Im1zciIsICAgMHgwMTIwZjAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNXzZVUCwgICAgICBkb19tc3J9LAorLyogU2NvdHRCOiBvdXIgY29kZSB1c2VzIDB4MDEyOGYwMDAgZm9yIG1zci4KKyAgIE5pY2tDOiAgYnV0IHRoaXMgaXMgd3JvbmcgYmVjYXVzZSB0aGUgYml0cyAxNiBhbmQgMTkgYXJlIGhhbmRsZWQKKyAgICAgICAgICAgYnkgdGhlIFBTUl94eHggZGVmaW5lcyBhYm92ZS4gICovCisKKy8qIEFSTSA3TSBsb25nIG11bHRpcGxpZXMgLSBuZWVkIHNpZ25lZC91bnNpZ25lZCBmbGFncyEgKi8KKyAgeyJzbXVsbCIsIDB4MDBjMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCisgIHsidW11bGwiLCAweDAwODAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAorICB7InNtbGFsIiwgMHgwMGUwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKKyAgeyJ1bWxhbCIsIDB4MDBhMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCisKKy8qIEFSTSBUSFVNQiBpbnRlcndvcmtpbmcgKi8KKyAgeyJieCIsICAgIDB4MDEyZmZmMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV9USFVNQiwgICAgZG9fYnh9LAorCisvKiBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KKyAgeyJ3ZnMiLCAgIDB4MGUyMDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCisgIHsicmZzIiwgICAweDBlMzAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAorICB7IndmYyIsICAgMHgwZTQwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKKyAgeyJyZmMiLCAgIDB4MGU1MDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCisgIHsibGRmIiwgICAweDBjMTAwMTAwLCAic2RlcCIsIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2xkc3R9LAorICB7InN0ZiIsICAgMHgwYzAwMDEwMCwgInNkZXAiLCBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9sZHN0fSwKKyAgeyJsZm0iLCAgIDB4MGMxMDAyMDAsIE5VTEwsICAgbGZtX2ZsYWdzLCAgIEZQVV9NRU1NVUxUSSwgZG9fZnBfbGRtc3RtfSwKKyAgeyJzZm0iLCAgIDB4MGMwMDAyMDAsIE5VTEwsICAgc2ZtX2ZsYWdzLCAgIEZQVV9NRU1NVUxUSSwgZG9fZnBfbGRtc3RtfSwKKyAgeyJtdmYiLCAgIDB4MGUwMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCisgIHsibW5mIiwgICAweDBlMTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAorICB7ImFicyIsICAgMHgwZTIwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKKyAgeyJybmQiLCAgIDB4MGUzMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCisgIHsic3F0IiwgICAweDBlNDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAorICB7ImxvZyIsICAgMHgwZTUwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKKyAgeyJsZ24iLCAgIDB4MGU2MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCisgIHsiZXhwIiwgICAweDBlNzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAorICB7InNpbiIsICAgMHgwZTgwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKKyAgeyJjb3MiLCAgIDB4MGU5MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCisgIHsidGFuIiwgICAweDBlYTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAorICB7ImFzbiIsICAgMHgwZWIwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKKyAgeyJhY3MiLCAgIDB4MGVjMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCisgIHsiYXRuIiwgICAweDBlZDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAorICB7InVyZCIsICAgMHgwZWUwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKKyAgeyJucm0iLCAgIDB4MGVmMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCisgIHsiYWRmIiwgICAweDBlMDAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsic3VmIiwgICAweDBlMjAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsicnNmIiwgICAweDBlMzAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsibXVmIiwgICAweDBlMTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsiZHZmIiwgICAweDBlNDAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsicmRmIiwgICAweDBlNTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsicG93IiwgICAweDBlNjAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsicnB3IiwgICAweDBlNzAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsicm1mIiwgICAweDBlODAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsiZm1sIiwgICAweDBlOTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsiZmR2IiwgICAweDBlYTAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsiZnJkIiwgICAweDBlYjAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsicG9sIiwgICAweDBlYzAwMTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2R5YWRpY30sCisgIHsiY21mIiwgICAweDBlOTBmMTEwLCBOVUxMLCAgIGV4Y2VwdF9mbGFnLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCisgIHsiY25mIiwgICAweDBlYjBmMTEwLCBOVUxMLCAgIGV4Y2VwdF9mbGFnLCBGUFVfQUxMLCAgICAgIGRvX2ZwX2NtcH0sCisvKiBUaGUgRlBBMTAgZGF0YSBzaGVldCBzdWdnZXN0cyB0aGF0IHRoZSAnRScgb2YgY21mZS9jbmZlIHNob3VsZCBub3QKKyAgIGJlIGFuIG9wdGlvbmFsIHN1ZmZpeCwgYnV0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAgVG8gYmUgY29tcGF0aWJsZSwKKyAgIHdlIGFjY2VwdCBlaXRoZXIuICAqLworICB7ImNtZmUiLCAgMHgwZWQwZjExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAorICB7ImNuZmUiLCAgMHgwZWYwZjExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAorICB7ImZsdCIsICAgMHgwZTAwMDExMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9mcm9tX3JlZ30sCisgIHsiZml4IiwgICAweDBlMTAwMTEwLCBOVUxMLCAgIGZpeF9mbGFncywgICBGUFVfQUxMLCAgICAgIGRvX2ZwX3RvX3JlZ30sCisKKy8qIEdlbmVyaWMgY29wcmVzc29yIGluc3RydWN0aW9ucyAqLworICB7ImNkcCIsICAgMHgwZTAwMDAwMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jZHB9LAorICB7ImxkYyIsICAgMHgwYzEwMDAwMCwgTlVMTCwgIGNwbG9uZ19mbGFnLCAgQVJNXzJVUCwgICAgICBkb19sc3RjfSwKKyAgeyJzdGMiLCAgIDB4MGMwMDAwMDAsIE5VTEwsICBjcGxvbmdfZmxhZywgIEFSTV8yVVAsICAgICAgZG9fbHN0Y30sCisgIHsibWNyIiwgICAweDBlMDAwMDEwLCBOVUxMLCAgTlVMTCwgICAgICAgICBBUk1fMlVQLCAgICAgIGRvX2NvX3JlZ30sCisgIHsibXJjIiwgICAweDBlMTAwMDEwLCBOVUxMLCAgTlVMTCwgICAgICAgICBBUk1fMlVQLCAgICAgIGRvX2NvX3JlZ30sCit9OworCisvKiBkZWZpbmVzIGZvciB2YXJpb3VzIGJpdHMgdGhhdCB3ZSB3aWxsIHdhbnQgdG8gdG9nZ2xlICovCisKKyNkZWZpbmUgSU5TVF9JTU1FRElBVEUJMHgwMjAwMDAwMAorI2RlZmluZSBPRkZTRVRfUkVHCTB4MDIwMDAwMDAKKyNkZWZpbmUgSFdPRkZTRVRfSU1NICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgU0hJRlRfQllfUkVHCTB4MDAwMDAwMTAKKyNkZWZpbmUgUFJFX0lOREVYCTB4MDEwMDAwMDAKKyNkZWZpbmUgSU5ERVhfVVAJMHgwMDgwMDAwMAorI2RlZmluZSBXUklURV9CQUNLCTB4MDAyMDAwMDAKKyNkZWZpbmUgTVVMVElfU0VUX1BTUgkweDAwNDAwMDAwCisKKyNkZWZpbmUgTElURVJBTF9NQVNLCTB4ZjAwMGYwMDAKKyNkZWZpbmUgQ09ORF9NQVNLCTB4ZjAwMDAwMDAKKyNkZWZpbmUgT1BDT0RFX01BU0sJMHhmZTFmZmZmZgorI2RlZmluZSBEQVRBX09QX1NISUZUCTIxCisKKy8qIENvZGVzIHRvIGRpc3Rpbmd1aXNoIHRoZSBhcml0aG1ldGljIGluc3RydWN0aW9ucyAqLworCisjZGVmaW5lIE9QQ09ERV9BTkQJMAorI2RlZmluZSBPUENPREVfRU9SCTEKKyNkZWZpbmUgT1BDT0RFX1NVQgkyCisjZGVmaW5lIE9QQ09ERV9SU0IJMworI2RlZmluZSBPUENPREVfQURECTQKKyNkZWZpbmUgT1BDT0RFX0FEQwk1CisjZGVmaW5lIE9QQ09ERV9TQkMJNgorI2RlZmluZSBPUENPREVfUlNDCTcKKyNkZWZpbmUgT1BDT0RFX1RTVAk4CisjZGVmaW5lIE9QQ09ERV9URVEJOQorI2RlZmluZSBPUENPREVfQ01QCTEwCisjZGVmaW5lIE9QQ09ERV9DTU4JMTEKKyNkZWZpbmUgT1BDT0RFX09SUgkxMgorI2RlZmluZSBPUENPREVfTU9WCTEzCisjZGVmaW5lIE9QQ09ERV9CSUMJMTQKKyNkZWZpbmUgT1BDT0RFX01WTgkxNQorCitzdGF0aWMgdm9pZCBkb190X25vcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfYXJpdAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfYWRkCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworc3RhdGljIHZvaWQgZG9fdF9hc3IJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X2JyYW5jaDkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfYnJhbmNoMTIJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfYnJhbmNoMjMJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfYngJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X2NvbXBhcmUJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfbGRtc3RtCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworc3RhdGljIHZvaWQgZG9fdF9sZHIJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X2xkcmIJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X2xkcmgJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X2xkcwkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfbHNsCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworc3RhdGljIHZvaWQgZG9fdF9sc3IJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X21vdgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfcHVzaF9wb3AJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3Rfc3RyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworc3RhdGljIHZvaWQgZG9fdF9zdHJiCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworc3RhdGljIHZvaWQgZG9fdF9zdHJoCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworc3RhdGljIHZvaWQgZG9fdF9zdWIJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7CitzdGF0aWMgdm9pZCBkb190X3N3aQkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKK3N0YXRpYyB2b2lkIGRvX3RfYWRyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOworCisjZGVmaW5lIFRfT1BDT0RFX01VTCAweDQzNDAKKyNkZWZpbmUgVF9PUENPREVfVFNUIDB4NDIwMAorI2RlZmluZSBUX09QQ09ERV9DTU4gMHg0MmMwCisjZGVmaW5lIFRfT1BDT0RFX05FRyAweDQyNDAKKyNkZWZpbmUgVF9PUENPREVfTVZOIDB4NDNjMAorCisjZGVmaW5lIFRfT1BDT0RFX0FERF9SMwkweDE4MDAKKyNkZWZpbmUgVF9PUENPREVfU1VCX1IzIDB4MWEwMAorI2RlZmluZSBUX09QQ09ERV9BRERfSEkgMHg0NDAwCisjZGVmaW5lIFRfT1BDT0RFX0FERF9TVCAweGIwMDAKKyNkZWZpbmUgVF9PUENPREVfU1VCX1NUIDB4YjA4MAorI2RlZmluZSBUX09QQ09ERV9BRERfU1AgMHhhODAwCisjZGVmaW5lIFRfT1BDT0RFX0FERF9QQyAweGEwMDAKKyNkZWZpbmUgVF9PUENPREVfQUREX0k4IDB4MzAwMAorI2RlZmluZSBUX09QQ09ERV9TVUJfSTggMHgzODAwCisjZGVmaW5lIFRfT1BDT0RFX0FERF9JMyAweDFjMDAKKyNkZWZpbmUgVF9PUENPREVfU1VCX0kzIDB4MWUwMAorCisjZGVmaW5lIFRfT1BDT0RFX0FTUl9SCTB4NDEwMAorI2RlZmluZSBUX09QQ09ERV9MU0xfUgkweDQwODAKKyNkZWZpbmUgVF9PUENPREVfTFNSX1IgIDB4NDBjMAorI2RlZmluZSBUX09QQ09ERV9BU1JfSQkweDEwMDAKKyNkZWZpbmUgVF9PUENPREVfTFNMX0kJMHgwMDAwCisjZGVmaW5lIFRfT1BDT0RFX0xTUl9JCTB4MDgwMAorCisjZGVmaW5lIFRfT1BDT0RFX01PVl9JOAkweDIwMDAKKyNkZWZpbmUgVF9PUENPREVfQ01QX0k4IDB4MjgwMAorI2RlZmluZSBUX09QQ09ERV9DTVBfTFIgMHg0MjgwCisjZGVmaW5lIFRfT1BDT0RFX01PVl9IUiAweDQ2MDAKKyNkZWZpbmUgVF9PUENPREVfQ01QX0hSIDB4NDUwMAorCisjZGVmaW5lIFRfT1BDT0RFX0xEUl9QQyAweDQ4MDAKKyNkZWZpbmUgVF9PUENPREVfTERSX1NQIDB4OTgwMAorI2RlZmluZSBUX09QQ09ERV9TVFJfU1AgMHg5MDAwCisjZGVmaW5lIFRfT1BDT0RFX0xEUl9JVyAweDY4MDAKKyNkZWZpbmUgVF9PUENPREVfU1RSX0lXIDB4NjAwMAorI2RlZmluZSBUX09QQ09ERV9MRFJfSUggMHg4ODAwCisjZGVmaW5lIFRfT1BDT0RFX1NUUl9JSCAweDgwMDAKKyNkZWZpbmUgVF9PUENPREVfTERSX0lCIDB4NzgwMAorI2RlZmluZSBUX09QQ09ERV9TVFJfSUIgMHg3MDAwCisjZGVmaW5lIFRfT1BDT0RFX0xEUl9SVyAweDU4MDAKKyNkZWZpbmUgVF9PUENPREVfU1RSX1JXIDB4NTAwMAorI2RlZmluZSBUX09QQ09ERV9MRFJfUkggMHg1YTAwCisjZGVmaW5lIFRfT1BDT0RFX1NUUl9SSCAweDUyMDAKKyNkZWZpbmUgVF9PUENPREVfTERSX1JCIDB4NWMwMAorI2RlZmluZSBUX09QQ09ERV9TVFJfUkIgMHg1NDAwCisKKyNkZWZpbmUgVF9PUENPREVfUFVTSAkweGI0MDAKKyNkZWZpbmUgVF9PUENPREVfUE9QCTB4YmMwMAorCisjZGVmaW5lIFRfT1BDT0RFX0JSQU5DSCAweGU3ZmUKKworc3RhdGljIGludCB0aHVtYl9yZWcJCVBBUkFNUyAoKGNoYXIgKiogc3RyLCBpbnQgaGlfbG8pKTsKKworI2RlZmluZSBUSFVNQl9TSVpFCTIJLyogU2l6ZSBvZiB0aHVtYiBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBUSFVNQl9SRUdfTE8JMHgxCisjZGVmaW5lIFRIVU1CX1JFR19ISQkweDIKKyNkZWZpbmUgVEhVTUJfUkVHX0FOWQkweDMKKworI2RlZmluZSBUSFVNQl9IMQkweDAwODAKKyNkZWZpbmUgVEhVTUJfSDIJMHgwMDQwCisKKyNkZWZpbmUgVEhVTUJfQVNSIDAKKyNkZWZpbmUgVEhVTUJfTFNMIDEKKyNkZWZpbmUgVEhVTUJfTFNSIDIKKworI2RlZmluZSBUSFVNQl9NT1ZFIDAKKyNkZWZpbmUgVEhVTUJfQ09NUEFSRSAxCisKKyNkZWZpbmUgVEhVTUJfTE9BRCAwCisjZGVmaW5lIFRIVU1CX1NUT1JFIDEKKworI2RlZmluZSBUSFVNQl9QUF9QQ19MUiAweDAxMDAKKworLyogVGhlc2UgdGhyZWUgYXJlIHVzZWQgZm9yIGltbWVkaWF0ZSBzaGlmdHMsIGRvIG5vdCBhbHRlciAqLworI2RlZmluZSBUSFVNQl9XT1JEIDIKKyNkZWZpbmUgVEhVTUJfSEFMRldPUkQgMQorI2RlZmluZSBUSFVNQl9CWVRFIDAKKworc3RydWN0IHRodW1iX29wY29kZSAKK3sKKyAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsJLyogQmFzaWMgc3RyaW5nIHRvIG1hdGNoICovCisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CQkvKiBCYXNpYyBpbnN0cnVjdGlvbiBjb2RlICovCisgIGludCAgICAgICAgICAgc2l6ZTsKKyAgdm9pZCAoKiAgICAgICBwYXJtcykgUEFSQU1TICgoY2hhciAqKSk7ICAvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHBhcnNlIGFyZ3MgKi8KK307CisKK3N0YXRpYyBDT05TVCBzdHJ1Y3QgdGh1bWJfb3Bjb2RlIHRpbnNuc1tdID0KK3sKKyAgeyJhZGMiLAkweDQxNDAsCQkyLAlkb190X2FyaXR9LAorICB7ImFkZCIsCTB4MDAwMCwJCTIsCWRvX3RfYWRkfSwKKyAgeyJhbmQiLAkweDQwMDAsCQkyLAlkb190X2FyaXR9LAorICB7ImFzciIsCTB4MDAwMCwJCTIsCWRvX3RfYXNyfSwKKyAgeyJiIiwJCVRfT1BDT0RFX0JSQU5DSCwgMiwJZG9fdF9icmFuY2gxMn0sCisgIHsiYmVxIiwJMHhkMGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKKyAgeyJibmUiLAkweGQxZmUsCQkyLAlkb190X2JyYW5jaDl9LAorICB7ImJjcyIsCTB4ZDJmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCisgIHsiYmhzIiwJMHhkMmZlLAkJMiwJZG9fdF9icmFuY2g5fSwKKyAgeyJiY2MiLAkweGQzZmUsCQkyLAlkb190X2JyYW5jaDl9LAorICB7ImJ1bCIsCTB4ZDNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCisgIHsiYmxvIiwJMHhkM2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKKyAgeyJibWkiLAkweGQ0ZmUsCQkyLAlkb190X2JyYW5jaDl9LAorICB7ImJwbCIsCTB4ZDVmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCisgIHsiYnZzIiwJMHhkNmZlLAkJMiwJZG9fdF9icmFuY2g5fSwKKyAgeyJidmMiLAkweGQ3ZmUsCQkyLAlkb190X2JyYW5jaDl9LAorICB7ImJoaSIsCTB4ZDhmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCisgIHsiYmxzIiwJMHhkOWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKKyAgeyJiZ2UiLAkweGRhZmUsCQkyLAlkb190X2JyYW5jaDl9LAorICB7ImJsdCIsCTB4ZGJmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCisgIHsiYmd0IiwJMHhkY2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKKyAgeyJibGUiLAkweGRkZmUsCQkyLAlkb190X2JyYW5jaDl9LAorICB7ImJpYyIsCTB4NDM4MCwJCTIsCWRvX3RfYXJpdH0sCisgIHsiYmwiLAkweGY3ZmZmZmZlLAk0LAlkb190X2JyYW5jaDIzfSwKKyAgeyJieCIsCTB4NDcwMCwJCTIsCWRvX3RfYnh9LAorICB7ImNtbiIsCVRfT1BDT0RFX0NNTiwJMiwJZG9fdF9hcml0fSwKKyAgeyJjbXAiLAkweDAwMDAsCQkyLAlkb190X2NvbXBhcmV9LAorICB7ImVvciIsCTB4NDA0MCwJCTIsCWRvX3RfYXJpdH0sCisgIHsibGRtaWEiLAkweGM4MDAsCQkyLAlkb190X2xkbXN0bX0sCisgIHsibGRyIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJ9LAorICB7ImxkcmIiLAkweDAwMDAsCQkyLAlkb190X2xkcmJ9LAorICB7ImxkcmgiLAkweDAwMDAsCQkyLAlkb190X2xkcmh9LAorICB7ImxkcnNiIiwJMHg1NjAwLAkJMiwJZG9fdF9sZHN9LAorICB7ImxkcnNoIiwJMHg1ZTAwLAkJMiwJZG9fdF9sZHN9LAorICB7Imxkc2IiLAkweDU2MDAsCQkyLAlkb190X2xkc30sCisgIHsibGRzaCIsCTB4NWUwMCwJCTIsCWRvX3RfbGRzfSwKKyAgeyJsc2wiLAkweDAwMDAsCQkyLAlkb190X2xzbH0sCisgIHsibHNyIiwJMHgwMDAwLAkJMiwJZG9fdF9sc3J9LAorICB7Im1vdiIsCTB4MDAwMCwJCTIsCWRvX3RfbW92fSwKKyAgeyJtdWwiLAlUX09QQ09ERV9NVUwsCTIsCWRvX3RfYXJpdH0sCisgIHsibXZuIiwJVF9PUENPREVfTVZOLAkyLAlkb190X2FyaXR9LAorICB7Im5lZyIsCVRfT1BDT0RFX05FRywJMiwJZG9fdF9hcml0fSwKKyAgeyJvcnIiLAkweDQzMDAsCQkyLAlkb190X2FyaXR9LAorICB7InBvcCIsCTB4YmMwMCwJCTIsCWRvX3RfcHVzaF9wb3B9LAorICB7InB1c2giLAkweGI0MDAsCQkyLAlkb190X3B1c2hfcG9wfSwKKyAgeyJyb3IiLAkweDQxYzAsCQkyLAlkb190X2FyaXR9LAorICB7InNiYyIsCTB4NDE4MCwJCTIsCWRvX3RfYXJpdH0sCisgIHsic3RtaWEiLAkweGMwMDAsCQkyLAlkb190X2xkbXN0bX0sCisgIHsic3RyIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJ9LAorICB7InN0cmIiLAkweDAwMDAsCQkyLAlkb190X3N0cmJ9LAorICB7InN0cmgiLAkweDAwMDAsCQkyLAlkb190X3N0cmh9LAorICB7InN3aSIsCTB4ZGYwMCwJCTIsCWRvX3Rfc3dpfSwKKyAgeyJzdWIiLAkweDAwMDAsCQkyLAlkb190X3N1Yn0sCisgIHsidHN0IiwJVF9PUENPREVfVFNULAkyLAlkb190X2FyaXR9LAorICAvKiBQc2V1ZG8gb3BzOiAqLworICB7ImFkciIsICAgICAgIDB4MDAwMCwgICAgICAgICAyLCAgICAgIGRvX3RfYWRyfSwKKyAgeyJub3AiLCAgICAgICAweDQ2QzAsICAgICAgICAgMiwgICAgICBkb190X25vcH0sICAgICAgLyogbW92IHI4LHI4ICovCit9OworCitzdHJ1Y3QgcmVnX2VudHJ5Cit7CisgIENPTlNUIGNoYXIgKiBuYW1lOworICBpbnQgICAgICAgICAgbnVtYmVyOworfTsKKworI2RlZmluZSBpbnRfcmVnaXN0ZXIocmVnKSAoKHJlZykgPj0gMCAmJiAocmVnKSA8PSAxNSkKKyNkZWZpbmUgY3BfcmVnaXN0ZXIocmVnKSAoKHJlZykgPj0gMzIgJiYgKHJlZykgPD0gNDcpCisjZGVmaW5lIGZwX3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDE2ICYmIChyZWcpIDw9IDIzKQorCisjZGVmaW5lIFJFR19QQwkxNQorI2RlZmluZSBSRUdfTFIgIDE0CisjZGVmaW5lIFJFR19TUCAgMTMKKworLyogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBuYW1lczsgIFVzZXJzIGNhbiBhZGQgYWxpYXNlcyB3aXRoIC5yZXEgKi8KK3N0YXRpYyBDT05TVCBzdHJ1Y3QgcmVnX2VudHJ5IHJlZ190YWJsZVtdID0KK3sKKyAgLyogUHJvY2Vzc29yIFJlZ2lzdGVyIE51bWJlcnMgKi8KKyAgeyJyMCIsIDB9LCAgICB7InIxIiwgMX0sICAgICAgeyJyMiIsIDJ9LCAgICAgIHsicjMiLCAzfSwKKyAgeyJyNCIsIDR9LCAgICB7InI1IiwgNX0sICAgICAgeyJyNiIsIDZ9LCAgICAgIHsicjciLCA3fSwKKyAgeyJyOCIsIDh9LCAgICB7InI5IiwgOX0sICAgICAgeyJyMTAiLCAxMH0sICAgIHsicjExIiwgMTF9LAorICB7InIxMiIsIDEyfSwgIHsicjEzIiwgUkVHX1NQfSx7InIxNCIsIFJFR19MUn0seyJyMTUiLCBSRUdfUEN9LAorICAvKiBBUENTIGNvbnZlbnRpb25zICovCisgIHsiYTEiLCAwfSwJeyJhMiIsIDF9LCAgICB7ImEzIiwgMn0sICAgICB7ImE0IiwgM30sCisgIHsidjEiLCA0fSwJeyJ2MiIsIDV9LCAgICB7InYzIiwgNn0sICAgICB7InY0IiwgN30sICAgICB7InY1IiwgOH0sCisgIHsidjYiLCA5fSwJeyJzYiIsIDl9LCAgICB7InY3IiwgMTB9LCAgICB7InNsIiwgMTB9LAorICB7ImZwIiwgMTF9LAl7ImlwIiwgMTJ9LCAgIHsic3AiLCBSRUdfU1B9LHsibHIiLCBSRUdfTFJ9LHsicGMiLCBSRUdfUEN9LAorICAvKiBGUCBSZWdpc3RlcnMgKi8KKyAgeyJmMCIsIDE2fSwgICB7ImYxIiwgMTd9LCAgIHsiZjIiLCAxOH0sICAgeyJmMyIsIDE5fSwKKyAgeyJmNCIsIDIwfSwgICB7ImY1IiwgMjF9LCAgIHsiZjYiLCAyMn0sICAgeyJmNyIsIDIzfSwKKyAgeyJjMCIsIDMyfSwgICB7ImMxIiwgMzN9LCAgIHsiYzIiLCAzNH0sICAgeyJjMyIsIDM1fSwKKyAgeyJjNCIsIDM2fSwgICB7ImM1IiwgMzd9LCAgIHsiYzYiLCAzOH0sICAgeyJjNyIsIDM5fSwKKyAgeyJjOCIsIDQwfSwgICB7ImM5IiwgNDF9LCAgIHsiYzEwIiwgNDJ9LCAgeyJjMTEiLCA0M30sCisgIHsiYzEyIiwgNDR9LCAgeyJjMTMiLCA0NX0sICB7ImMxNCIsIDQ2fSwgIHsiYzE1IiwgNDd9LAorICB7ImNyMCIsIDMyfSwgIHsiY3IxIiwgMzN9LCAgeyJjcjIiLCAzNH0sICB7ImNyMyIsIDM1fSwKKyAgeyJjcjQiLCAzNn0sICB7ImNyNSIsIDM3fSwgIHsiY3I2IiwgMzh9LCAgeyJjcjciLCAzOX0sCisgIHsiY3I4IiwgNDB9LCAgeyJjcjkiLCA0MX0sICB7ImNyMTAiLCA0Mn0sIHsiY3IxMSIsIDQzfSwKKyAgeyJjcjEyIiwgNDR9LCB7ImNyMTMiLCA0NX0sIHsiY3IxNCIsIDQ2fSwgeyJjcjE1IiwgNDd9LAorICB7TlVMTCwgMH0KK307CisKKyNkZWZpbmUgYmFkX2FyZ3MgXygiQmFkIGFyZ3VtZW50cyB0byBpbnN0cnVjdGlvbiIpOworI2RlZmluZSBiYWRfcGMgXygicjE1IG5vdCBhbGxvd2VkIGhlcmUiKTsKKworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fb3BzX2hzaCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV90b3BzX2hzaCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9jb25kX2hzaCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9zaGlmdF9oc2ggPSBOVUxMOworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fcmVnX2hzaCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqIGFybV9wc3JfaHNoID0gTlVMTDsKKworLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgorICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKKyAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90CisgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKKyAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgICAqLworCitzdGF0aWMgdm9pZCBzX3JlcSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2JzcyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbHRvcmcgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2FybSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfdGh1bWIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2NvZGUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2ZvcmNlX3RodW1iIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc190aHVtYl9mdW5jIFBBUkFNUyAoKGludCkpOworI2lmZGVmIE9CSl9FTEYKK3N0YXRpYyB2b2lkIHNfYXJtX2VsZl9jb25zIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbXlfZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgY2hhciAqKikpOworCitDT05TVCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworICB7InJlcSIsICAgICAgICAgc19yZXEsIDB9LAkvKiBOZXZlciBjYWxsZWQgYmVjYXN1ZSAnLnJlcScgZG9lcyBub3Qgc3RhcnQgbGluZSAqLworICB7ImJzcyIsICAgICAgICAgc19ic3MsIDB9LAorICB7ImFsaWduIiwgICAgICAgc19hbGlnbiwgMH0sCisgIHsiYXJtIiwgICAgICAgICBzX2FybSwgMH0sCisgIHsidGh1bWIiLCAgICAgICBzX3RodW1iLCAwfSwKKyAgeyJjb2RlIiwgICAgICAgIHNfY29kZSwgMH0sCisgIHsiZm9yY2VfdGh1bWIiLCBzX2ZvcmNlX3RodW1iLCAwfSwKKyAgeyJ0aHVtYl9mdW5jIiwgIHNfdGh1bWJfZnVuYywgMH0sCisgIHsiZXZlbiIsICAgICAgICBzX2V2ZW4sIDB9LAorICB7Imx0b3JnIiwgICAgICAgc19sdG9yZywgMH0sCisgIHsicG9vbCIsICAgICAgICBzX2x0b3JnLCAwfSwKKyNpZmRlZiBPQkpfRUxGICAKKyAgeyJ3b3JkIiwgICAgICAgIHNfYXJtX2VsZl9jb25zLCA0fSwKKyAgeyJsb25nIiwgICAgICAgIHNfYXJtX2VsZl9jb25zLCA0fSwKKyNlbHNlCisgIHsid29yZCIsICAgICAgICBjb25zLCA0fSwKKyNlbmRpZgorICB7ImV4dGVuZCIsICAgICAgZmxvYXRfY29ucywgJ3gnfSwKKyAgeyJsZG91YmxlIiwgICAgIGZsb2F0X2NvbnMsICd4J30sCisgIHsicGFja2VkIiwgICAgICBmbG9hdF9jb25zLCAncCd9LAorICB7MCwgMCwgMH0KK307CisKKy8qIFN0dWZmIG5lZWRlZCB0byByZXNvbHZlIHRoZSBsYWJlbCBhbWJpZ3VpdHkKKyAgIEFzOgorICAgICAuLi4KKyAgICAgbGFiZWw6ICAgPGluc24+CisgICBtYXkgZGlmZmVyIGZyb206CisgICAgIC4uLgorICAgICBsYWJlbDoKKyAgICAgICAgICAgICAgPGluc24+CisqLworCitzeW1ib2xTICogIGxhc3RfbGFiZWxfc2VlbjsKK3N0YXRpYyBpbnQgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IGZhbHNlOworCisvKiBMaXRlcmFsIHN0dWZmICovCisKKyNkZWZpbmUgTUFYX0xJVEVSQUxfUE9PTF9TSVpFIDEwMjQKKwordHlwZWRlZiBzdHJ1Y3QgbGl0ZXJhbFMKK3sKKyAgc3RydWN0IGV4cHJlc3Npb25TICBleHA7CisgIHN0cnVjdCBhcm1faXQgKiAgICAgaW5zdDsKK30gbGl0ZXJhbFQ7CisKK2xpdGVyYWxUICBsaXRlcmFsc1tNQVhfTElURVJBTF9QT09MX1NJWkVdOworaW50ICAgICAgIG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlID0gMDsgLyogTmV4dCBmcmVlIGVudHJ5IGluIHRoZSBwb29sICovCitpbnQgICAgICAgbGl0X3Bvb2xfbnVtID0gMTsgLyogTmV4dCBsaXRlcmFsIHBvb2wgbnVtYmVyICovCitzeW1ib2xTICogY3VycmVudF9wb29sUCA9IE5VTEw7CitzeW1ib2xTICogc3ltYm9sX21ha2VfZW1wdHkgUEFSQU1TICgodm9pZCkpOyAKKworc3RhdGljIGludAorYWRkX3RvX2xpdF9wb29sICgpCit7CisgIGludCBsaXRfY291bnQgPSAwOworCisgIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCisgICAgY3VycmVudF9wb29sUCA9IHN5bWJvbF9tYWtlX2VtcHR5ICgpOworCisgIC8qIENoZWNrIGlmIHRoaXMgbGl0ZXJhbCB2YWx1ZSBpcyBhbHJlYWR5IGluIHRoZSBwb29sOiAqLworICB3aGlsZSAobGl0X2NvdW50IDwgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpCisgICAgeworICAgICAgaWYgKGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfb3AgPT0gaW5zdC5yZWxvYy5leHAuWF9vcAorICAgICAgICAgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAorICAgICAgICAgICYmIGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfYWRkX251bWJlciA9PSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIKKyAgICAgICAgICAmJiBsaXRlcmFsc1tsaXRfY291bnRdLmV4cC5YX3Vuc2lnbmVkID09IGluc3QucmVsb2MuZXhwLlhfdW5zaWduZWQpCisgICAgICAgIGJyZWFrOworICAgICAgbGl0X2NvdW50Kys7CisgICAgfQorCisgIGlmIChsaXRfY291bnQgPT0gbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UpIC8qIG5ldyBlbnRyeSAqLworICAgIHsKKyAgICAgIGlmIChuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA+IE1BWF9MSVRFUkFMX1BPT0xfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGluc3QuZXJyb3IgPSBfKCJMaXRlcmFsIFBvb2wgT3ZlcmZsb3ciKTsKKyAgICAgICAgICByZXR1cm4gRkFJTDsKKyAgICAgICAgfQorCisgICAgICBsaXRlcmFsc1tuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZV0uZXhwID0gaW5zdC5yZWxvYy5leHA7CisgICAgICBsaXRfY291bnQgPSBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSsrOworICAgIH0KKworICBpbnN0LnJlbG9jLmV4cC5YX29wID0gT19zeW1ib2w7CisgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciA9IChsaXRfY291bnQpICogNCAtIDg7CisgIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGN1cnJlbnRfcG9vbFA7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisgCisvKiBDYW4ndCB1c2Ugc3ltYm9sX25ldyBoZXJlLCBzbyBoYXZlIHRvIGNyZWF0ZSBhIHN5bWJvbCBhbmQgdGhlbiBhdAorICAgYSBsYXRlciBkYXRlIGFzc2lnbiBpdCBhIHZhbHVlLiBUaGF0cyB3aGF0IHRoZXNlIGZ1bmN0aW9ucyBkby4gICovCitzdGF0aWMgdm9pZAorc3ltYm9sX2xvY2F0ZSAoc3ltYm9sUCwgbmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKKyAgICAgc3ltYm9sUyAqICAgIHN5bWJvbFA7IAorICAgICBDT05TVCBjaGFyICogbmFtZTsJCS8qIEl0IGlzIGNvcGllZCwgdGhlIGNhbGxlciBjYW4gbW9kaWZ5ICovCisgICAgIHNlZ1QgICAgICAgICBzZWdtZW50OwkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KKyAgICAgdmFsdWVUICAgICAgIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KKyAgICAgZnJhZ1MgKiAgICAgIGZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCit7CisgIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKKyAgY2hhciAqIHByZXNlcnZlZF9jb3B5X29mX25hbWU7CisKKyAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpICsgMTsgICAgICAvKiArMSBmb3IgXDAgKi8KKyAgb2JzdGFja19ncm93ICgmbm90ZXMsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKKyAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOworI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKKyAgaWYgKHByZXNlcnZlZF9jb3B5X29mX25hbWVbMF0gPT0gJ18nKQorICAgIHByZXNlcnZlZF9jb3B5X29mX25hbWUrKzsKKyNlbmRpZgorCisjaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCisgIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPQorICAgIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAocHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7CisjZW5kaWYKKworICBTX1NFVF9OQU1FIChzeW1ib2xQLCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKKworICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzZWdtZW50KTsKKyAgU19TRVRfVkFMVUUgKHN5bWJvbFAsIHZhbHUpOworICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyhzeW1ib2xQKTsKKworICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZzsKKworICAvKiBMaW5rIHRvIGVuZCBvZiBzeW1ib2wgY2hhaW4uICAqLworICB7CisgICAgZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOworICAgIGlmIChzeW1ib2xfdGFibGVfZnJvemVuKQorICAgICAgYWJvcnQgKCk7CisgIH0KKworICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfbGFzdFAsICYgc3ltYm9sX3Jvb3RQLCAmIHN5bWJvbF9sYXN0UCk7CisKKyAgb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7CisKKyNpZmRlZiB0Y19zeW1ib2xfbmV3X2hvb2sKKyAgdGNfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKKyNlbmRpZgorIAorI2lmZGVmIERFQlVHX1NZTVMKKyAgdmVyaWZ5X3N5bWJvbF9jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOworI2VuZGlmIC8qIERFQlVHX1NZTVMgKi8KK30KKworc3ltYm9sUyAqCitzeW1ib2xfbWFrZV9lbXB0eSAoKSAKK3sKKyAgc3ltYm9sUyAqIHN5bWJvbFA7IAorCisgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3ltYm9sUykpOworCisgIC8qIHN5bWJvbCBtdXN0IGJlIGJvcm4gaW4gc29tZSBmaXhlZCBzdGF0ZS4gIFRoaXMgc2VlbXMgYXMgZ29vZCBhcyBhbnkuICovCisgIG1lbXNldCAoc3ltYm9sUCwgMCwgc2l6ZW9mIChzeW1ib2xTKSk7CisKKyAgc3ltYm9sUC0+YnN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoc3Rkb3V0cHV0KTsKKyAgYXNzZXJ0IChzeW1ib2xQLT5ic3ltICE9IDApOworICBzeW1ib2xQLT5ic3ltLT51ZGF0YS5wID0gKFBUUikgc3ltYm9sUDsKKworICByZXR1cm4gc3ltYm9sUDsKK30KKworLyogQ2hlY2sgdGhhdCBhbiBpbW1lZGlhdGUgaXMgdmFsaWQsIGFuZCBpZiBzbywgY29udmVydCBpdCB0byB0aGUgcmlnaHQgZm9ybWF0LiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAordmFsaWRhdGVfaW1tZWRpYXRlICh2YWwpCisgICAgIHVuc2lnbmVkIGludCB2YWw7Cit7CisgIHVuc2lnbmVkIGludCBhOworICB1bnNpZ25lZCBpbnQgaTsKKyAgCisjZGVmaW5lIHJvdGF0ZV9sZWZ0KHYsIG4pICh2IDw8IG4gfCB2ID4+ICgzMiAtIG4pKQorICAKKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDIpCisgICAgaWYgKChhID0gcm90YXRlX2xlZnQgKHZhbCwgaSkpIDw9IDB4ZmYpCisgICAgICByZXR1cm4gYSB8IChpIDw8IDcpOyAvKiAxMi1iaXQgcGFjazogW3NoaWZ0LWNudCxjb25zdF0gKi8KKyAgCisgIHJldHVybiBGQUlMOworfQorCitzdGF0aWMgaW50Cit2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWwsIGh3c2UpCisgICAgIGludCB2YWw7CisgICAgIGludCBod3NlOworeworICBpZiAoKGh3c2UgJiYgKHZhbCA8IC0yNTUgfHwgdmFsID4gMjU1KSkKKyAgICAgIHx8ICh2YWwgPCAtNDA5NSB8fCB2YWwgPiA0MDk1KSkKKyAgICAgcmV0dXJuIEZBSUw7CisgIHJldHVybiB2YWw7Cit9CisKKyAgICAKK3N0YXRpYyB2b2lkCitzX3JlcSAoYSkKKyAgICAgaW50IGE7Cit7CisgIGFzX2JhZCAoXygiSW52YWxpZCBzeW50YXggZm9yIC5yZXEgZGlyZWN0aXZlLiIpKTsKK30KKworc3RhdGljIHZvaWQKK3NfYnNzIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIC8qIFdlIGRvbid0IHN1cHBvcnQgcHV0dGluZyBmcmFncyBpbiB0aGUgQlNTIHNlZ21lbnQsIHdlIGZha2UgaXQgYnkKKyAgICAgbWFya2luZyBpbl9ic3MsIHRoZW4gbG9va2luZyBhdCBzX3NraXAgZm9yIGNsdWVzPy4uICovCisgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfZXZlbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoIW5lZWRfcGFzc18yKQkJLyogTmV2ZXIgbWFrZSBmcmFnIGlmIGV4cGVjdCBleHRyYSBwYXNzLiAqLworICAgIGZyYWdfYWxpZ24gKDEsIDAsIDApOworICAKKyAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7CisgIAorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorc19sdG9yZyAoaW50ZXJuYWwpCisgICAgIGludCBpbnRlcm5hbDsKK3sKKyAgaW50IGxpdF9jb3VudCA9IDA7CisgIGNoYXIgc3ltX25hbWVbMjBdOworCisgIGlmIChjdXJyZW50X3Bvb2xQID09IE5VTEwpCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgaWYgKCFpbnRlcm5hbCkKKwlhc190c2t0c2sgKF8oIk5vdGhpbmcgdG8gcHV0IGluIHRoZSBwb29sXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEFsaWduIHBvb2wgYXMgeW91IGhhdmUgd29yZCBhY2Nlc3NlcyAqLworICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIGhhdmUgdG8gLi4uICovCisgIGlmICghbmVlZF9wYXNzXzIpCisgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CisKKyAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7CisKKyAgaWYgKGludGVybmFsKQorICAgIGFzX3Rza3RzayAoXygiSW5zZXJ0aW5nIGltcGxpY2l0IHBvb2wgYXQgY2hhbmdlIG9mIHNlY3Rpb24iKSk7CisKKyAgc3ByaW50ZiAoc3ltX25hbWUsICIkJGxpdF9cMDAyJXgiLCBsaXRfcG9vbF9udW0rKyk7CisKKyAgc3ltYm9sX2xvY2F0ZSAoY3VycmVudF9wb29sUCwgc3ltX25hbWUsIG5vd19zZWcsCisJCSAodmFsdWVUKSBmcmFnX25vd19maXggKCksIGZyYWdfbm93KTsKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoY3VycmVudF9wb29sUCk7CisKKyAgQVJNX1NFVF9USFVNQiAoY3VycmVudF9wb29sUCwgdGh1bWJfbW9kZSk7CisgIAorI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCisgIEFSTV9TRVRfSU5URVJXT1JLIChjdXJyZW50X3Bvb2xQLCBzdXBwb3J0X2ludGVyd29yayk7CisjZW5kaWYKKyAgCisgIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKKyAgICAvKiBGaXJzdCBvdXRwdXQgdGhlIGV4cHJlc3Npb24gaW4gdGhlIGluc3RydWN0aW9uIHRvIHRoZSBwb29sICovCisgICAgZW1pdF9leHByICgmKGxpdGVyYWxzW2xpdF9jb3VudCsrXS5leHApLCA0KTsgLyogLndvcmQgKi8KKworICBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSA9IDA7CisgIGN1cnJlbnRfcG9vbFAgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorc19hbGlnbiAodW51c2VkKQkvKiBTYW1lIGFzIHNfYWxpZ25fcHR3byBidXQgYWxpZ24gMCA9PiBhbGlnbiAyICovCisgICAgIGludCB1bnVzZWQ7Cit7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKKyAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7CisKKyAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBpZiAodGVtcCA+IG1heF9hbGlnbm1lbnQpCisgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgdGVtcCA9IG1heF9hbGlnbm1lbnQpOworICBlbHNlIGlmICh0ZW1wIDwgMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIkFsaWdubWVudCBuZWdhdGl2ZS4gMCBhc3N1bWVkLiIpKTsKKyAgICAgIHRlbXAgPSAwOworICAgIH0KKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB0ZW1wX2ZpbGwgPSAwOworCisgIGlmICghdGVtcCkKKyAgICB0ZW1wID0gMjsKKworICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLworICBpZiAodGVtcCAmJiAhbmVlZF9wYXNzXzIpCisgICAgZnJhZ19hbGlnbiAodGVtcCwgKGludCkgdGVtcF9maWxsLCAwKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0ZW1wKTsKK30KKworc3RhdGljIHZvaWQKK3NfZm9yY2VfdGh1bWIgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgLyogSWYgd2UgYXJlIG5vdCBhbHJlYWR5IGluIHRodW1iIG1vZGUgZ28gaW50byBpdCwgRVZFTiBpZgorICAgICB0aGUgdGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRodW1iIGluc3RydWN0aW9ucy4KKyAgICAgVGhpcyBpcyB1c2VkIGJ5IGdjYy9jb25maWcvYXJtL2xpYjFmdW5jcy5hc20gZm9yIGV4YW1wbGUKKyAgICAgdG8gY29tcGlsZSBpbnRlcndvcmtpbmcgc3VwcG9ydCBmdW5jdGlvbnMgZXZlbiBpZiB0aGUKKyAgICAgdGFyZ2V0IHByb2Nlc3NvciBzaG91bGQgbm90IHN1cHBvcnQgaW50ZXJ3b3JraW5nLiAgKi8KKyAgICAgCisgIGlmICghIHRodW1iX21vZGUpCisgICAgeworICAgICAgdGh1bWJfbW9kZSA9IDE7CisgICAgICAKKyAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOworICAgIH0KKyAgCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitzX3RodW1iX2Z1bmMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgLyogVGhlIGZvbGxvd2luZyBsYWJlbCBpcyB0aGUgbmFtZS9hZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgorICAgICBXZSBuZWVkIHRvIGtub3cgdGhpcyBmb3IgdGhlIGludGVyd29ya2luZyBzdXBwb3J0LiAgKi8KKworICBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gdHJ1ZTsKKyAgCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitvcGNvZGVfc2VsZWN0ICh3aWR0aCkKKyAgICAgaW50IHdpZHRoOworeworICBzd2l0Y2ggKHdpZHRoKQorICAgIHsKKyAgICBjYXNlIDE2OgorICAgICAgaWYgKCEgdGh1bWJfbW9kZSkKKwl7CisJICBpZiAoISAoY3B1X3ZhcmlhbnQgJiBBUk1fVEhVTUIpKQorCSAgICBhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IFRIVU1CIG9wY29kZXMiKSk7CisJICB0aHVtYl9tb2RlID0gMTsKKyAgICAgICAgICAvKiBObyBuZWVkIHRvIGZvcmNlIHRoZSBhbGlnbm1lbnQsIHNpbmNlIHdlIHdpbGwgaGF2ZSBiZWVuCisgICAgICAgICAgICAgY29taW5nIGZyb20gQVJNIG1vZGUsIHdoaWNoIGlzIHdvcmQtYWxpZ25lZC4gKi8KKyAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMzI6CisgICAgICBpZiAodGh1bWJfbW9kZSkKKwl7CisgICAgICAgICAgaWYgKChjcHVfdmFyaWFudCAmIEFSTV9BTlkpID09IEFSTV9USFVNQikKKwkgICAgYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBBUk0gb3Bjb2RlcyIpKTsKKwkgIHRodW1iX21vZGUgPSAwOworICAgICAgICAgIGlmICghbmVlZF9wYXNzXzIpCisgICAgICAgICAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKKyAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19iYWQgKF8oImludmFsaWQgaW5zdHJ1Y3Rpb24gc2l6ZSBzZWxlY3RlZCAoJWQpIiksIHdpZHRoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzX2FybSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBvcGNvZGVfc2VsZWN0ICgzMik7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitzX3RodW1iIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIG9wY29kZV9zZWxlY3QgKDE2KTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfY29kZSAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICByZWdpc3RlciBpbnQgdGVtcDsKKworICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHN3aXRjaCAodGVtcCkKKyAgICB7CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDMyOgorICAgICAgb3Bjb2RlX3NlbGVjdCAodGVtcCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUgKCVkKSAoZXhwZWN0aW5nIDE2IG9yIDMyKSIpLCB0ZW1wKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitlbmRfb2ZfbGluZSAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKCpzdHIgIT0gJ1wwJykKKyAgICBpbnN0LmVycm9yID0gXygiR2FyYmFnZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24iKTsKK30KKworc3RhdGljIGludAorc2tpcF9wYXN0X2NvbW1hIChzdHIpCisgICAgIGNoYXIgKiogc3RyOworeworICBjaGFyICpwID0gKnN0ciwgYzsKKyAgaW50IGNvbW1hID0gMDsKKyAgICAKKyAgd2hpbGUgKChjID0gKnApID09ICcgJyB8fCBjID09ICcsJykKKyAgICB7CisgICAgICBwKys7CisgICAgICBpZiAoYyA9PSAnLCcgJiYgY29tbWErKykKKwlyZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgaWYgKGMgPT0gJ1wwJykKKyAgICByZXR1cm4gRkFJTDsKKworICAqc3RyID0gcDsKKyAgcmV0dXJuIGNvbW1hID8gU1VDQ0VTUyA6IEZBSUw7Cit9CisKKy8qIEEgc3RhbmRhcmQgcmVnaXN0ZXIgbXVzdCBiZSBnaXZlbiBhdCB0aGlzIHBvaW50LiAgU2hpZnQgaXMgdGhlIHBsYWNlIHRvCisgICBwdXQgaXQgaW4gdGhlIGluc3RydWN0aW9uLiAqLworCitzdGF0aWMgaW50CityZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCBzaGlmdCkKKyAgICAgY2hhciAqKiBzdHI7CisgICAgIGludCAgICAgc2hpZnQ7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZmYgWzEyOF07IC8qIFhYWCAqLworICBpbnQgICAgcmVnOworICBjaGFyICogc3RhcnQgPSAqc3RyOworCisgIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBpbnRfcmVnaXN0ZXIgKHJlZykpCisgICAgeworICAgICAgaWYgKHNoaWZ0ID49IDApCisJaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgc2hpZnQ7CisgICAgICByZXR1cm4gcmVnOworICAgIH0KKworICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludCwgd2UgbWF5IGhhdmUgZ290IGEgcmVnIG9mIHRoZSB3cm9uZyBjbGFzcy4gICovCisgICpzdHIgPSBzdGFydDsKKyAgCisgIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKKyAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbiAqLworICBzcHJpbnRmIChidWZmLCBfKCJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIiksIHN0YXJ0KTsKKyAgaW5zdC5lcnJvciA9IGJ1ZmY7CisKKyAgcmV0dXJuIEZBSUw7Cit9CisKK3N0YXRpYyBpbnQKK3Bzcl9yZXF1aXJlZF9oZXJlIChzdHIsIGNwc3IsIHNwc3IpCisgICAgIGNoYXIgKiogc3RyOworICAgICBpbnQgICAgIGNwc3I7CisgICAgIGludCAgICAgc3BzcjsKK3sKKyAgaW50ICAgIHBzcjsKKyAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKKyAgcHNyID0gYXJtX3Bzcl9wYXJzZSAoc3RyKTsKKyAgCisgIGlmICAocHNyID09IGNwc3IgfHwgcHNyID09IHNwc3IpCisgICAgeworICAgICAgaWYgKHBzciA9PSBzcHNyKQorCWluc3QuaW5zdHJ1Y3Rpb24gfD0gMSA8PCAyMjsKKyAgICAgIAorICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgfQorCisgIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKKyAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbiAqLworICBpbnN0LmVycm9yID0gXygiPHBzcihmKT4gZXhwZWN0ZWQiKTsKKworICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludC4gICovCisgICpzdHIgPSBzdGFydDsKKyAgcmV0dXJuIEZBSUw7Cit9CisKK3N0YXRpYyBpbnQKK2NvX3Byb2NfbnVtYmVyIChzdHIpCisgICAgIGNoYXIgKipzdHI7Cit7CisgIGludCBwcm9jZXNzb3IsIHBjaGFyOworCisgIHdoaWxlICgqKnN0ciA9PSAnICcpCisgICAgKCpzdHIpKys7CisKKyAgLyogVGhlIGRhdGEgc2hlZXQgc2VlbXMgdG8gaW1wbHkgdGhhdCBqdXN0IGEgbnVtYmVyIG9uIGl0cyBvd24gaXMgdmFsaWQKKyAgICAgaGVyZSwgYnV0IHRoZSBSSVNDIGlYIGFzc2VtYmxlciBzZWVtcyB0byBhY2NlcHQgYSBwcmVmaXggJ3AnLiAgV2Ugd2lsbAorICAgICBhY2NlcHQgZWl0aGVyLiAgKi8KKyAgaWYgKCoqc3RyID09ICdwJyB8fCAqKnN0ciA9PSAnUCcpCisgICAgKCpzdHIpKys7CisKKyAgcGNoYXIgPSAqKCpzdHIpKys7CisgIGlmIChwY2hhciA+PSAnMCcgJiYgcGNoYXIgPD0gJzknKQorICAgIHsKKyAgICAgIHByb2Nlc3NvciA9IHBjaGFyIC0gJzAnOworICAgICAgaWYgKCoqc3RyID49ICcwJyAmJiAqKnN0ciA8PSAnOScpCisJeworCSAgcHJvY2Vzc29yID0gcHJvY2Vzc29yICogMTAgKyAqKCpzdHIpKysgLSAnMCc7CisJICBpZiAocHJvY2Vzc29yID4gMTUpCisJICAgIHsKKwkgICAgICBpbnN0LmVycm9yID0gXygiSWxsZWdhbCBjby1wcm9jZXNzb3IgbnVtYmVyIik7CisJICAgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oIkJhZCBvciBtaXNzaW5nIGNvLXByb2Nlc3NvciBudW1iZXIiKTsKKyAgICAgIHJldHVybiBGQUlMOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IHByb2Nlc3NvciA8PCA4OworICByZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorY3Bfb3BjX2V4cHIgKHN0ciwgd2hlcmUsIGxlbmd0aCkKKyAgICAgY2hhciAqKiBzdHI7CisgICAgIGludCB3aGVyZTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgZXhwcmVzc2lvblMgZXhwcjsKKworICB3aGlsZSAoKipzdHIgPT0gJyAnKQorICAgICgqc3RyKSsrOworCisgIG1lbXNldCAoJmV4cHIsICdcMCcsIHNpemVvZiAoZXhwcikpOworCisgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsIHN0cikpCisgICAgcmV0dXJuIEZBSUw7CisgIGlmIChleHByLlhfb3AgIT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gXygiYmFkIG9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpOworICAgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgIGlmICgoZXhwci5YX2FkZF9udW1iZXIgJiAoKDEgPDwgbGVuZ3RoKSAtIDEpKSAhPSBleHByLlhfYWRkX251bWJlcikKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIGNvLXByb2Nlc3NvciBleHByZXNzaW9uIHRvbyBsYXJnZSIpOworICAgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZXhwci5YX2FkZF9udW1iZXIgPDwgd2hlcmU7CisgIHJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50CitjcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKKyAgICAgY2hhciAqKiBzdHI7CisgICAgIGludCAgICAgd2hlcmU7Cit7CisgIGludCAgICByZWc7CisgIGNoYXIgKiBzdGFydCA9ICpzdHI7CisKKyAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGNwX3JlZ2lzdGVyIChyZWcpKQorICAgIHsKKyAgICAgIHJlZyAmPSAxNTsKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHdoZXJlOworICAgICAgcmV0dXJuIHJlZzsKKyAgICB9CisKKyAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQorICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuICovCisgIGluc3QuZXJyb3IgPSBfKCJDby1wcm9jZXNzb3IgcmVnaXN0ZXIgZXhwZWN0ZWQiKTsKKworICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludCAqLworICAqc3RyID0gc3RhcnQ7CisgIHJldHVybiBGQUlMOworfQorCitzdGF0aWMgaW50CitmcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKKyAgICAgY2hhciAqKiBzdHI7CisgICAgIGludCAgICAgd2hlcmU7Cit7CisgIGludCByZWc7CisgIGNoYXIgKiBzdGFydCA9ICpzdHI7CisKKyAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGZwX3JlZ2lzdGVyIChyZWcpKQorICAgIHsKKyAgICAgIHJlZyAmPSA3OworICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgd2hlcmU7CisgICAgICByZXR1cm4gcmVnOworICAgIH0KKworICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCisgICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4gKi8KKyAgaW5zdC5lcnJvciA9IF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGV4cGVjdGVkIik7CisKKyAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQgKi8KKyAgKnN0ciA9IHN0YXJ0OworICByZXR1cm4gRkFJTDsKK30KKworc3RhdGljIGludAorY3BfYWRkcmVzc19vZmZzZXQgKHN0cikKKyAgICAgY2hhciAqKiBzdHI7Cit7CisgIGludCBvZmZzZXQ7CisKKyAgd2hpbGUgKCoqc3RyID09ICcgJykKKyAgICAoKnN0cikrKzsKKworICBpZiAoISBpc19pbW1lZGlhdGVfcHJlZml4ICgqKnN0cikpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgKCpzdHIpKys7CisgIAorICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsIHN0cikpCisgICAgcmV0dXJuIEZBSUw7CisgIAorICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKKyAgICAgIAorICAgICAgaWYgKG9mZnNldCAmIDMpCisJeworCSAgaW5zdC5lcnJvciA9IF8oImNvLXByb2Nlc3NvciBhZGRyZXNzIG11c3QgYmUgd29yZCBhbGlnbmVkIik7CisJICByZXR1cm4gRkFJTDsKKwl9CisKKyAgICAgIGlmIChvZmZzZXQgPiAxMDIzIHx8IG9mZnNldCA8IC0xMDIzKQorCXsKKwkgIGluc3QuZXJyb3IgPSBfKCJvZmZzZXQgdG9vIGxhcmdlIik7CisJICByZXR1cm4gRkFJTDsKKwl9CisKKyAgICAgIGlmIChvZmZzZXQgPj0gMCkKKwlpbnN0Lmluc3RydWN0aW9uIHw9IElOREVYX1VQOworICAgICAgZWxzZQorCW9mZnNldCA9IC1vZmZzZXQ7CisKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gb2Zmc2V0ID4+IDI7CisgICAgfQorICBlbHNlCisgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOworCisgIHJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50CitjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKHN0cikKKyAgICAgY2hhciAqKiBzdHI7Cit7CisgIGNoYXIgKiBwID0gKiBzdHI7CisgIGludCAgICBwcmVfaW5jID0gMDsKKyAgaW50ICAgIHdyaXRlX2JhY2sgPSAwOworCisgIGlmICgqcCA9PSAnWycpCisgICAgeworICAgICAgaW50IHJlZzsKKworICAgICAgcCsrOworICAgICAgd2hpbGUgKCpwID09ICcgJykKKwlwKys7CisKKyAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgcCwgMTYpKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgICB3aGlsZSAoKnAgPT0gJyAnKQorCXArKzsKKworICAgICAgaWYgKCpwID09ICddJykKKwl7CisJICBwKys7CisJICAKKwkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgcCkgPT0gU1VDQ0VTUykKKwkgICAgeworCSAgICAgIC8qIFtSbl0sICNleHByICovCisJICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7CisJICAgICAgCisJICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCisJCXsKKwkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50Iik7CisJCSAgcmV0dXJuIEZBSUw7CisJCX0KKworCSAgICAgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQorCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBwcmVfaW5jID0gUFJFX0lOREVYIHwgSU5ERVhfVVA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qICdbJ1JuLCAjZXhwciddJ1shXSAqLworCisJICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IEZBSUwpCisJICAgIHsKKwkgICAgICBpbnN0LmVycm9yID0gXygicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOworCSAgICAgIHJldHVybiBGQUlMOworCSAgICB9CisKKwkgIHByZV9pbmMgPSBQUkVfSU5ERVg7CisJICAKKwkgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQorCSAgICByZXR1cm4gRkFJTDsKKworCSAgd2hpbGUgKCpwID09ICcgJykKKwkgICAgcCsrOworCisJICBpZiAoKnArKyAhPSAnXScpCisJICAgIHsKKwkgICAgICBpbnN0LmVycm9yID0gXygibWlzc2luZyBdIik7CisJICAgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKworCSAgd2hpbGUgKCpwID09ICcgJykKKwkgICAgcCsrOworCisJICBpZiAoKnAgPT0gJyEnKQorCSAgICB7CisJICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCisJCXsKKwkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIHdpdGggd3JpdGUtYmFjayIpOworCQkgIHJldHVybiBGQUlMOworCQl9CisKKwkgICAgICBwKys7CisJICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZwKSkKKwlyZXR1cm4gRkFJTDsKKworICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOworICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7ICAvKiBQQyByZWwgYWRqdXN0ICovCisgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7CisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOworICAgICAgcHJlX2luYyA9IFBSRV9JTkRFWDsKKyAgICB9CisKKyAgaW5zdC5pbnN0cnVjdGlvbiB8PSB3cml0ZV9iYWNrIHwgcHJlX2luYzsKKyAgKnN0ciA9IHA7CisgIHJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgdm9pZAorZG9fbm9wIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICAvKiBEbyBub3RoaW5nIHJlYWxseSAqLworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOyAvKiBUaGlzIGlzIHBvaW50bGVzcyAqLworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fbXJzIChzdHIsIGZsYWdzKQorICAgICBjaGFyICpzdHI7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit7CisgIC8qIE9ubHkgb25lIHN5bnRheCAqLworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IHBzcl9yZXF1aXJlZF9oZXJlICgmIHN0ciwgQ1BTUl9BTEwsIFNQU1JfQUxMKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBfKCI8cHNyPiBleHBlY3RlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCisvKiBUaHJlZSBwb3NzaWJsZSBmb3JtczogIjxwc3I+LCBSbSIsICI8cHNyZj4sIFJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iICovCitzdGF0aWMgdm9pZAorZG9fbXNyIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICBpbnQgcmVnOworCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIgKys7CisKKyAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmc3RyLCBDUFNSX0FMTCwgU1BTUl9BTEwpID09IFNVQ0NFU1MpCisgICAgeworICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQUxMOworCisgICAgICAvKiBTeXRheCBzaG91bGQgYmUgIjxwc3I+LCBSbSIgKi8KKyAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKwkgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCisJeworCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0ZMRywgU1BTUl9GTEcpID09IFNVQ0NFU1MpCisJaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfRkxBR1M7CisgICAgICBlbHNlIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIENQU1JfQ1RMLCBTUFNSX0NUTCkgPT0gU1VDQ0VTUykKKwlpbnN0Lmluc3RydWN0aW9uIHw9IFBTUl9DT05UUk9MOworICAgICAgZWxzZQorCXsKKwkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKwkgIHJldHVybjsKKwl9CisgICAgICAKKyAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCisJeworCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworCSAgcmV0dXJuOworCX0KKyAgICAgIAorICAgICAgLyogU3ludGF4IGNvdWxkIGJlICI8cHNyZj4sIHJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iICovCisgICAgICAKKyAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAwKSkgIT0gRkFJTCkKKwk7CisgICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLworICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKiBzdHIpKQorCXsKKwkgIHN0ciArKzsKKwkgIGluc3QuZXJyb3IgPSBOVUxMOworCSAgCisJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIGlmIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpCisJICAgIHsKKwkgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURTsKKwkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOworCSAgICAgIGlmICh2YWx1ZSA9PSBGQUlMKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKKwkJICByZXR1cm47CisJCX0KKworCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7CisJICAgIH0KKworCSAgZmxhZ3MgfD0gSU5TVF9JTU1FRElBVEU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGluc3QuZXJyb3IgPSBfKCJFcnJvcjogdW5yZWNvZ25pc2VkIHN5bnRheCBmb3Igc2Vjb25kIGFyZ3VtZW50IHRvIG1zciBpbnN0cnVjdGlvbiIpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgaW5zdC5lcnJvciA9IE5VTEw7IAorICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCisvKiBMb25nIE11bHRpcGx5IFBhcnNlcgorICAgVU1VTEwgUmRMbywgUmRIaSwgUm0sIFJzCisgICBTTVVMTCBSZExvLCBSZEhpLCBSbSwgUnMKKyAgIFVNTEFMIFJkTG8sIFJkSGksIFJtLCBScworICAgU01MQUwgUmRMbywgUmRIaSwgUm0sIFJzCisqLyAgIAorc3RhdGljIHZvaWQKK2RvX211bGwgKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiBzdHI7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit7CisgIGludCByZGxvLCByZGhpLCBybSwgcnM7CisKKyAgLyogb25seSBvbmUgZm9ybWF0ICJyZGxvLCByZGhpLCBybSwgcnMiICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAoKHJkbG8gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKHJkaGkgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogcmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50ICovCisgIGlmIChyZGxvID09IHJkaGkgfHwgcmRsbyA9PSBybSB8fCByZGhpID09IHJtKQorICAgIGFzX3Rza3RzayAoXygicmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50IikpOworCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IChycyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTCkKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChyZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQykKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX3BjOworICAgICAgcmV0dXJuOworICAgIH0KKyAgIAorICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fbXVsIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgaW50IHJkLCBybTsKKyAgCisgIC8qIG9ubHkgb25lIGZvcm1hdCAicmQsIHJtLCBycyIgKi8KKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmICgocmQgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHJkID09IFJFR19QQykKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX3BjOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocm0gPT0gUkVHX1BDKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfcGM7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChybSA9PSByZCkKKyAgICBhc190c2t0c2sgKF8oInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG11bCIpKTsKKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocm0gPT0gUkVHX1BDKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfcGM7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7CisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkb19tbGEgKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICBpbnQgcmQsIHJtOworCisgIC8qIG9ubHkgb25lIGZvcm1hdCAicmQsIHJtLCBycywgcm4iICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAoKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChyZCA9PSBSRUdfUEMpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHJtID09IFJFR19QQykKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX3BjOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocm0gPT0gcmQpCisgICAgYXNfdHNrdHNrIChfKCJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtbGEiKSk7CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMCisgICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocmQgPT0gUkVHX1BDIHx8IHJtID09IFJFR19QQykKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX3BjOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCisvKiBSZXR1cm5zIHRoZSBpbmRleCBpbnRvIGZwX3ZhbHVlcyBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgb3IgLTEgaWYKKyAgIG5vdCBpbiB0aGUgdGFibGUuICAqLworc3RhdGljIGludAorbXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24gKHN0cikKKyAgICAgY2hhciAqKiBzdHI7Cit7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKKyAgY2hhciAqICAgICAgICAgc2F2ZV9pbjsKKyAgZXhwcmVzc2lvblMgICAgZXhwOworICBpbnQgICAgICAgICAgICBpOworICBpbnQgICAgICAgICAgICBqOworCisgIG1lbXNldCAod29yZHMsIDAsIE1BWF9MSVRUTEVOVU1TICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworICAvKiBMb29rIGZvciBhIHJhdyBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KKyAgaWYgKChzYXZlX2luID0gYXRvZl9pZWVlICgqc3RyLCAneCcsIHdvcmRzKSkgIT0gTlVMTAorICAgICAgJiYgKGlzX2VuZF9vZl9saW5lIFsoaW50KSgqc2F2ZV9pbildIHx8ICpzYXZlX2luID09ICdcMCcpKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkxPQVRfVkFMUzsgaSsrKQorCXsKKwkgIGZvciAoaiA9IDA7IGogPCBNQVhfTElUVExFTlVNUzsgaisrKQorCSAgICB7CisJICAgICAgaWYgKHdvcmRzW2pdICE9IGZwX3ZhbHVlc1tpXVtqXSkKKwkJYnJlYWs7CisJICAgIH0KKworCSAgaWYgKGogPT0gTUFYX0xJVFRMRU5VTVMpCisJICAgIHsKKwkgICAgICAqc3RyID0gc2F2ZV9pbjsKKwkgICAgICByZXR1cm4gaTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogVHJ5IGFuZCBwYXJzZSBhIG1vcmUgY29tcGxleCBleHByZXNzaW9uLCB0aGlzIHdpbGwgcHJvYmFibHkgZmFpbAorICAgICB1bmxlc3MgdGhlIGNvZGUgdXNlcyBhIGZsb2F0aW5nIHBvaW50IHByZWZpeCAoZWcgIjBmIikgKi8KKyAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cjsKKyAgaWYgKGV4cHJlc3Npb24gKCZleHApID09IGFic29sdXRlX3NlY3Rpb24KKyAgICAgICYmIGV4cC5YX29wID09IE9fYmlnCisgICAgICAmJiBleHAuWF9hZGRfbnVtYmVyIDwgMCkKKyAgICB7CisgICAgICAvKiBGSVhNRTogNSA9IFhfUFJFQ0lTSU9OLCBzaG91bGQgYmUgI2RlZmluZSdkIHdoZXJlIHdlIGNhbiB1c2UgaXQuCisJIERpdHRvIGZvciAxNS4gICovCisgICAgICBpZiAoZ2VuX3RvX3dvcmRzICh3b3JkcywgNSwgKGxvbmcpMTUpID09IDApCisJeworCSAgZm9yIChpID0gMDsgaSA8IE5VTV9GTE9BVF9WQUxTOyBpKyspCisJICAgIHsKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX0xJVFRMRU5VTVM7IGorKykKKwkJeworCQkgIGlmICh3b3Jkc1tqXSAhPSBmcF92YWx1ZXNbaV1bal0pCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgaWYgKGogPT0gTUFYX0xJVFRMRU5VTVMpCisJCXsKKwkJICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47CisJCSAgcmV0dXJuIGk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyBpbiB0aGUgZXhwcmVzc2lvbiBpcyBhIGJpZ251bSAqLworc3RhdGljIGludAord2Fsa19ub19iaWdudW1zIChzcCkKKyAgICAgc3ltYm9sUyAqIHNwOworeworICBpZiAoc3AtPnN5X3ZhbHVlLlhfb3AgPT0gT19iaWcpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKHNwLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpCisgICAgeworICAgICAgcmV0dXJuICh3YWxrX25vX2JpZ251bXMgKHNwLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wpCisJICAgICAgfHwgKHNwLT5zeV92YWx1ZS5YX29wX3N5bWJvbAorCQkgICYmIHdhbGtfbm9fYmlnbnVtcyAoc3AtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sKSkpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXlfZ2V0X2V4cHJlc3Npb24gKGVwLCBzdHIpCisgICAgIGV4cHJlc3Npb25TICogZXA7CisgICAgIGNoYXIgKiogc3RyOworeworICBjaGFyICogc2F2ZV9pbjsKKyAgc2VnVCAgIHNlZzsKKyAgCisgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9ICpzdHI7CisgIHNlZyA9IGV4cHJlc3Npb24gKGVwKTsKKworI2lmZGVmIE9CSl9BT1VUCisgIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IHRleHRfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IGRhdGFfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IGJzc19zZWN0aW9uCisgICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oImJhZF9zZWdtZW50Iik7CisgICAgICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIEdldCByaWQgb2YgYW55IGJpZ251bXMgbm93LCBzbyB0aGF0IHdlIGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIGZvciB3aGljaAorICAgICB3ZSBjYW4ndCBlc3RhYmxpc2ggYSBsaW5lIG51bWJlciBsYXRlciBvbi4gIEJpZyBudW1iZXJzIGFyZSBuZXZlciB2YWxpZAorICAgICBpbiBpbnN0cnVjdGlvbnMsIHdoaWNoIGlzIHdoZXJlIHRoaXMgcm91dGluZSBpcyBhbHdheXMgY2FsbGVkLiAgKi8KKyAgaWYgKGVwLT5YX29wID09IE9fYmlnCisgICAgICB8fCAoZXAtPlhfYWRkX3N5bWJvbAorCSAgJiYgKHdhbGtfbm9fYmlnbnVtcyAoZXAtPlhfYWRkX3N5bWJvbCkKKwkgICAgICB8fCAoZXAtPlhfb3Bfc3ltYm9sCisJCSAgJiYgd2Fsa19ub19iaWdudW1zIChlcC0+WF9vcF9zeW1ib2wpKSkpKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7CisgICAgICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOworICByZXR1cm4gMDsKK30KKworLyogdW5yZXN0cmljdCBzaG91bGQgYmUgb25lIGlmIDxzaGlmdD4gPHJlZ2lzdGVyPiBpcyBwZXJtaXR0ZWQgZm9yIHRoaXMKKyAgIGluc3RydWN0aW9uICovCisKK3N0YXRpYyBpbnQKK2RlY29kZV9zaGlmdCAoc3RyLCB1bnJlc3RyaWN0KQorICAgICBjaGFyICoqIHN0cjsKKyAgICAgaW50ICAgICB1bnJlc3RyaWN0OworeworICBzdHJ1Y3QgYXNtX3NoaWZ0ICogc2hmdDsKKyAgY2hhciAqIHA7CisgIGNoYXIgICBjOworICAgIAorICB3aGlsZSAoKipzdHIgPT0gJyAnKQorICAgICgqc3RyKSsrOworICAgIAorICBmb3IgKHAgPSAqc3RyOyBpc2FscGhhICgqcCk7IHArKykKKyAgICA7CisKKyAgaWYgKHAgPT0gKnN0cikKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gXygiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOworICAgICAgcmV0dXJuIEZBSUw7CisgICAgfQorCisgIGMgPSAqcDsKKyAgKnAgPSAnXDAnOworICBzaGZ0ID0gKHN0cnVjdCBhc21fc2hpZnQgKikgaGFzaF9maW5kIChhcm1fc2hpZnRfaHNoLCAqc3RyKTsKKyAgKnAgPSBjOworICBpZiAoc2hmdCkKKyAgICB7CisgICAgICBpZiAoIXN0cm5jbXAgKCpzdHIsICJycngiLCAzKQorICAgICAgICAgIHx8ICFzdHJuY21wICgqc3RyLCAiUlJYIiwgMykpCisJeworCSAgKnN0ciA9IHA7CisJICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlOworCSAgcmV0dXJuIFNVQ0NFU1M7CisJfQorCisgICAgICB3aGlsZSAoKnAgPT0gJyAnKQorCXArKzsKKworICAgICAgaWYgKHVucmVzdHJpY3QgJiYgcmVnX3JlcXVpcmVkX2hlcmUgKCZwLCA4KSAhPSBGQUlMKQorCXsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWUgfCBTSElGVF9CWV9SRUc7CisJICAqc3RyID0gcDsKKwkgIHJldHVybiBTVUNDRVNTOworCX0KKyAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCogcCkpCisJeworCSAgaW5zdC5lcnJvciA9IE5VTEw7CisJICBwKys7CisJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnApKQorCSAgICByZXR1cm4gRkFJTDsKKworCSAgLyogVmFsaWRhdGUgc29tZSBzaW1wbGUgI2V4cHJlc3Npb25zICovCisJICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbnVtID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOworCisJICAgICAgLyogUmVqZWN0IG9wZXJhdGlvbnMgZ3JlYXRlciB0aGFuIDMyLCBvciBsc2wgIzMyICovCisJICAgICAgaWYgKG51bSA+IDMyIHx8IChudW0gPT0gMzIgJiYgc2hmdC0+dmFsdWUgPT0gMCkpCisJCXsKKwkJICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBpbW1lZGlhdGUgc2hpZnQiKTsKKwkJICByZXR1cm4gRkFJTDsKKwkJfQorCisJICAgICAgLyogU2hpZnRzIG9mIHplcm8gc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBsc2wgKHdoaWNoIGlzIHplcm8pKi8KKwkgICAgICBpZiAobnVtID09IDApCisJCXsKKwkJICAqc3RyID0gcDsKKwkJICByZXR1cm4gU1VDQ0VTUzsKKwkJfQorCisJICAgICAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIDAsIGZvciB0aG9zZSBzaGlmdHMgdGhhdAorCQkgc3VwcG9ydCBpdC4gICovCisJICAgICAgaWYgKG51bSA9PSAzMikKKwkJbnVtID0gMDsKKworCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKG51bSA8PCA3KSB8IHNoZnQtPnZhbHVlOworCSAgICAgICpzdHIgPSBwOworCSAgICAgIHJldHVybiBTVUNDRVNTOworCSAgICB9CisKKwkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NOworCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOworCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZTsKKwkgICpzdHIgPSBwOworCSAgcmV0dXJuIFNVQ0NFU1M7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGluc3QuZXJyb3IgPSB1bnJlc3RyaWN0ID8gXygic2hpZnQgcmVxdWlyZXMgcmVnaXN0ZXIgb3IgI2V4cHJlc3Npb24iKQorCSAgICA6IF8oInNoaWZ0IHJlcXVpcmVzICNleHByZXNzaW9uIik7CisJICAqc3RyID0gcDsKKwkgIHJldHVybiBGQUlMOworCX0KKyAgICB9CisKKyAgaW5zdC5lcnJvciA9IF8oIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKyAgcmV0dXJuIEZBSUw7Cit9CisKKy8qIERvIHRob3NlIGRhdGFfb3BzIHdoaWNoIGNhbiB0YWtlIGEgbmVnYXRpdmUgaW1tZWRpYXRlIGNvbnN0YW50ICovCisvKiBieSBhbHRlcmluZyB0aGUgaW5zdHVjdGlvbi4gQSBiaXQgb2YgYSBoYWNrIHJlYWxseSAqLworLyogICAgICBNT1YgPC0+IE1WTgorICAgICAgICBBTkQgPC0+IEJJQworICAgICAgICBBREMgPC0+IFNCQworICAgICAgICBieSBpbnZlcnRpbmcgdGhlIHNlY29uZCBvcGVyYW5kLCBhbmQKKyAgICAgICAgQUREIDwtPiBTVUIKKyAgICAgICAgQ01QIDwtPiBDTU4KKyAgICAgICAgYnkgbmVnYXRpbmcgdGhlIHNlY29uZCBvcGVyYW5kLgorKi8KK3N0YXRpYyBpbnQKK25lZ2F0ZV9kYXRhX29wIChpbnN0cnVjdGlvbiwgdmFsdWUpCisgICAgIHVuc2lnbmVkIGxvbmcgKiBpbnN0cnVjdGlvbjsKKyAgICAgdW5zaWduZWQgbG9uZyAgIHZhbHVlOworeworICBpbnQgb3AsIG5ld19pbnN0OworICB1bnNpZ25lZCBsb25nIG5lZ2F0ZWQsIGludmVydGVkOworCisgIG5lZ2F0ZWQgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKC12YWx1ZSk7CisgIGludmVydGVkID0gdmFsaWRhdGVfaW1tZWRpYXRlICh+dmFsdWUpOworCisgIG9wID0gKCppbnN0cnVjdGlvbiA+PiBEQVRBX09QX1NISUZUKSAmIDB4ZjsKKyAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgICAvKiBGaXJzdCBuZWdhdGVzICovCisgICAgY2FzZSBPUENPREVfU1VCOiAgICAgICAgICAgICAvKiBBREQgPC0+IFNVQiAqLworICAgICAgbmV3X2luc3QgPSBPUENPREVfQUREOworICAgICAgdmFsdWUgPSBuZWdhdGVkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QQ09ERV9BREQ6IAorICAgICAgbmV3X2luc3QgPSBPUENPREVfU1VCOyAgICAgICAgICAgICAgIAorICAgICAgdmFsdWUgPSBuZWdhdGVkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QQ09ERV9DTVA6ICAgICAgICAgICAgIC8qIENNUCA8LT4gQ01OICovCisgICAgICBuZXdfaW5zdCA9IE9QQ09ERV9DTU47CisgICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDT0RFX0NNTjogCisgICAgICBuZXdfaW5zdCA9IE9QQ09ERV9DTVA7ICAgICAgICAgICAgICAgCisgICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7CisgICAgICBicmVhazsKKworICAgICAgLyogTm93IEludmVydGVkIG9wcyAqLworICAgIGNhc2UgT1BDT0RFX01PVjogICAgICAgICAgICAgLyogTU9WIDwtPiBNVk4gKi8KKyAgICAgIG5ld19pbnN0ID0gT1BDT0RFX01WTjsgICAgICAgICAgICAgICAKKyAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDT0RFX01WTjogCisgICAgICBuZXdfaW5zdCA9IE9QQ09ERV9NT1Y7CisgICAgICB2YWx1ZSA9IGludmVydGVkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QQ09ERV9BTkQ6ICAgICAgICAgICAgIC8qIEFORCA8LT4gQklDICovIAorICAgICAgbmV3X2luc3QgPSBPUENPREVfQklDOyAgICAgICAgICAgICAgIAorICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUENPREVfQklDOiAKKyAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FORDsKKyAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDT0RFX0FEQzogICAgICAgICAgICAgIC8qIEFEQyA8LT4gU0JDICovCisgICAgICBuZXdfaW5zdCA9IE9QQ09ERV9TQkM7ICAgICAgICAgICAgICAgCisgICAgICB2YWx1ZSA9IGludmVydGVkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QQ09ERV9TQkM6IAorICAgICAgbmV3X2luc3QgPSBPUENPREVfQURDOworICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBXZSBjYW5ub3QgZG8gYW55dGhpbmcgKi8KKyAgICBkZWZhdWx0OiAgCisgICAgICByZXR1cm4gRkFJTDsKKyAgICB9CisKKyAgaWYgKHZhbHVlID09IEZBSUwpCisgICAgcmV0dXJuIEZBSUw7CisKKyAgKmluc3RydWN0aW9uICY9IE9QQ09ERV9NQVNLOworICAqaW5zdHJ1Y3Rpb24gfD0gbmV3X2luc3QgPDwgREFUQV9PUF9TSElGVDsKKyAgcmV0dXJuIHZhbHVlOyAKK30KKworc3RhdGljIGludAorZGF0YV9vcDIgKHN0cikKKyAgICAgY2hhciAqKiBzdHI7Cit7CisgIGludCB2YWx1ZTsKKyAgZXhwcmVzc2lvblMgZXhwcjsKKworICB3aGlsZSAoKipzdHIgPT0gJyAnKQorICAgICgqc3RyKSsrOworICAgIAorICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgIT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCisJeworCSAgLyogU2hpZnQgb3BlcmF0aW9uIG9uIHJlZ2lzdGVyICovCisJICByZXR1cm4gZGVjb2RlX3NoaWZ0IChzdHIsIE5PX1NISUZUX1JFU1RSSUNUKTsKKwl9CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLworICAgICAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCoqc3RyKSkKKwl7CisJICAoKnN0cikrKzsKKwkgIGluc3QuZXJyb3IgPSBOVUxMOworCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsIHN0cikpCisJICAgIHJldHVybiBGQUlMOworCisJICBpZiAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQorCSAgICB7CisJICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7CisJICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCisJCXsKKwkJICAvKiAjeCwgeSAtLSBpZSBleHBsaWNpdCByb3RhdGlvbiBieSBZICAqLworCQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsIHN0cikpCisJCSAgICByZXR1cm4gRkFJTDsKKworCQkgIGlmIChleHByLlhfb3AgIT0gT19jb25zdGFudCkKKwkJICAgIHsKKwkJICAgICAgaW5zdC5lcnJvciA9IF8oIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKwkJICAgICAgcmV0dXJuIEZBSUw7CisJCSAgICB9CisgCisJCSAgLyogUm90YXRlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyICovCisJCSAgaWYgKCgodW5zaWduZWQpIGV4cHIuWF9hZGRfbnVtYmVyKSA+IDMwCisJCSAgICAgIHx8IChleHByLlhfYWRkX251bWJlciAmIDEpICE9IDAKKwkJICAgICAgfHwgKCh1bnNpZ25lZCkgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSA+IDI1NSkKKwkJICAgIHsKKwkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKKwkJICAgICAgcmV0dXJuIEZBSUw7CisJCSAgICB9CisJCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKKwkJICBpbnN0Lmluc3RydWN0aW9uIHw9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKKwkJICBpbnN0Lmluc3RydWN0aW9uIHw9IGV4cHIuWF9hZGRfbnVtYmVyIDw8IDc7CisJCSAgcmV0dXJuIFNVQ0NFU1M7CisJCX0KKworCSAgICAgIC8qIEltcGxpY2l0IHJvdGF0aW9uLCBzZWxlY3QgYSBzdWl0YWJsZSBvbmUgICovCisJICAgICAgdmFsdWUgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcik7CisKKwkgICAgICBpZiAodmFsdWUgPT0gRkFJTCkKKwkJeworCQkgIC8qIENhbid0IGJlIGRvbmUsIHBlcmhhcHMgdGhlIGNvZGUgcmVhZHMgc29tZXRoaW5nIGxpa2UKKwkJICAgICAiYWRkIFJkLCBSbiwgIy1uIiwgd2hlcmUgInN1YiBSZCwgUm4sICNuIiB3b3VsZCBiZSBvayAqLworCQkgIGlmICgodmFsdWUgPSBuZWdhdGVfZGF0YV9vcCAoJmluc3QuaW5zdHJ1Y3Rpb24sCisJCQkJCSAgICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpKQorCQkgICAgICA9PSBGQUlMKQorCQkgICAgeworCQkgICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOworCQkgICAgICByZXR1cm4gRkFJTDsKKwkJICAgIH0KKwkJfQorCisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSB2YWx1ZTsKKwkgICAgfQorCisJICBpbnN0Lmluc3RydWN0aW9uIHw9IElOU1RfSU1NRURJQVRFOworCSAgcmV0dXJuIFNVQ0NFU1M7CisJfQorCisgICAgICAoKnN0cikrKzsKKyAgICAgIGluc3QuZXJyb3IgPSBfKCJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gRkFJTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2ZwX29wMiAoc3RyKQorICAgICBjaGFyICoqIHN0cjsKK3sKKyAgd2hpbGUgKCoqc3RyID09ICcgJykKKyAgICAoKnN0cikrKzsKKworICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgIT0gRkFJTCkKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uICovCisgICAgICBpZiAoKigoKnN0cikrKykgPT0gJyMnKQorCXsKKwkgIGludCBpOworCisJICBpbnN0LmVycm9yID0gTlVMTDsKKwkgIHdoaWxlICgqKnN0ciA9PSAnICcpCisJICAgICgqc3RyKSsrOworCisJICAvKiBGaXJzdCB0cnkgYW5kIG1hdGNoIGV4YWN0IHN0cmluZ3MsIHRoaXMgaXMgdG8gZ3VhcmFudGVlIHRoYXQKKwkgICAgIHNvbWUgZm9ybWF0cyB3aWxsIHdvcmsgZXZlbiBmb3IgY3Jvc3MgYXNzZW1ibHkgKi8KKworCSAgZm9yIChpID0gMDsgZnBfY29uc3RbaV07IGkrKykKKwkgICAgeworCSAgICAgIGlmIChzdHJuY21wICgqc3RyLCBmcF9jb25zdFtpXSwgc3RybGVuIChmcF9jb25zdFtpXSkpID09IDApCisJCXsKKwkJICBjaGFyICpzdGFydCA9ICpzdHI7CisKKwkJICAqc3RyICs9IHN0cmxlbiAoZnBfY29uc3RbaV0pOworCQkgIGlmIChpc19lbmRfb2ZfbGluZVsoaW50KSoqc3RyXSB8fCAqKnN0ciA9PSAnXDAnKQorCQkgICAgeworCQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGkgKyA4OworCQkgICAgICByZXR1cm4gU1VDQ0VTUzsKKwkJICAgIH0KKwkJICAqc3RyID0gc3RhcnQ7CisJCX0KKwkgICAgfQorCisJICAvKiBKdXN0IGJlY2F1c2Ugd2UgZGlkbid0IGdldCBhIG1hdGNoIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZQorCSAgICAgY29uc3RhbnQgaXNuJ3QgdmFsaWQsIGp1c3QgdGhhdCBpdCBpcyBpbiBhIGZvcm1hdCB0aGF0IHdlCisJICAgICBkb24ndCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZS4gIFRyeSBwYXJzaW5nIGl0IHdpdGgKKwkgICAgIHRoZSBzdGFuZGFyZCBleHByZXNzaW9uIHJvdXRpbmVzLiAgKi8KKwkgIGlmICgoaSA9IG15X2dldF9mbG9hdF9leHByZXNzaW9uIChzdHIpKSA+PSAwKQorCSAgICB7CisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKKwkgICAgICByZXR1cm4gU1VDQ0VTUzsKKwkgICAgfQorCisJICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgZXhwcmVzc2lvbiIpOworCSAgcmV0dXJuIEZBSUw7CisJfQorICAgICAgaW5zdC5lcnJvciA9IF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9yIGltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gRkFJTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkb19hcml0IChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwKKyAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMCisgICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7CisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkb19hZHIgKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKKyAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTgiICovCisKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwKKyAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIC8qIEZyYWcgaGFja2luZyB3aWxsIHR1cm4gdGhpcyBpbnRvIGEgc3ViIGluc3RydWN0aW9uIGlmIHRoZSBvZmZzZXQgdHVybnMKKyAgICAgb3V0IHRvIGJlIG5lZ2F0aXZlLiAgKi8KKyAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7CisgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAvKiBQQyByZWxhdGl2ZSBhZGp1c3QgKi8KKyAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fY21wIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgZGF0YV9vcDIgKCZzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKKyAgaWYgKChmbGFncyAmIDB4MDAwMGYwMDApID09IDApCisgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EU19CSVQ7CisKKyAgZW5kX29mX2xpbmUgKHN0cik7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RvX21vdiAoc3RyLCBmbGFncykKKyAgICAgY2hhciAqICAgICAgICBzdHI7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit7CisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7CisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2xkc3RfZXh0ZW5kIChzdHIsIGh3c2UpCisgICAgIGNoYXIgKiogc3RyOworICAgICBpbnQgICAgIGh3c2U7Cit7CisgIGludCBhZGQgPSBJTkRFWF9VUDsKKworICBzd2l0Y2ggKCoqc3RyKQorICAgIHsKKyAgICBjYXNlICcjJzoKKyAgICBjYXNlICckJzoKKyAgICAgICgqc3RyKSsrOworICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCBzdHIpKQorCXJldHVybiBGQUlMOworCisgICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCXsKKwkgIGludCB2YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKKworICAgICAgICAgIGlmICgoaHdzZSAmJiAodmFsdWUgPCAtMjU1IHx8IHZhbHVlID4gMjU1KSkKKyAgICAgICAgICAgICAgIHx8ICh2YWx1ZSA8IC00MDk1IHx8IHZhbHVlID4gNDA5NSkpCisJICAgIHsKKwkgICAgICBpbnN0LmVycm9yID0gXygiYWRkcmVzcyBvZmZzZXQgdG9vIGxhcmdlIik7CisJICAgICAgcmV0dXJuIEZBSUw7CisJICAgIH0KKworCSAgaWYgKHZhbHVlIDwgMCkKKwkgICAgeworCSAgICAgIHZhbHVlID0gLXZhbHVlOworCSAgICAgIGFkZCA9IDA7CisJICAgIH0KKworICAgICAgICAgIC8qIEhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucyBoYXZlIHRoZQorICAgICAgICAgICAgIGltbWVkaWF0ZSB2YWx1ZSBzcGxpdCBhY3Jvc3MgYml0cyAxMS4uOCBhbmQgYml0cyAzLi4wICovCisgICAgICAgICAgaWYgKGh3c2UpCisgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IEhXT0ZGU0VUX0lNTSB8ICh2YWx1ZSA+PiA0KSA8PCA4IHwgdmFsdWUgJiAweEY7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCB2YWx1ZTsKKwl9CisgICAgICBlbHNlCisJeworICAgICAgICAgIGlmIChod3NlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKKyAgICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU07CisJICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7CisJfQorICAgICAgcmV0dXJuIFNVQ0NFU1M7CisKKyAgICBjYXNlICctJzoKKyAgICAgIGFkZCA9IDA7CS8qIGFuZCBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlICcrJzoKKyAgICAgICgqc3RyKSsrOwkvKiBhbmQgZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCAwKSA9PSBGQUlMKQorCXJldHVybiBGQUlMOworCisgICAgICBpZiAoaHdzZSkKKyAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQ7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IE9GRlNFVF9SRUc7CisgICAgICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoc3RyKSA9PSBTVUNDRVNTKQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9zaGlmdCAoc3RyLCBTSElGVF9SRVNUUklDVCk7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZG9fbGRzdCAoc3RyLCBmbGFncykKKyAgICAgY2hhciAqICAgICAgICBzdHI7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit7CisgIGludCBoYWxmd29yZCA9IDA7CisgIGludCBwcmVfaW5jID0gMDsKKyAgaW50IGNvbmZsaWN0X3JlZzsKKyAgaW50IHZhbHVlOworCisgIC8qIFRoaXMgaXMgbm90IGlkZWFsLCBidXQgaXQgaXMgdGhlIHNpbXBsZXN0IHdheSBvZiBkZWFsaW5nIHdpdGggdGhlCisgICAgIEFSTTdUIGhhbGZ3b3JkIGluc3RydWN0aW9ucyAoc2luY2UgdGhleSB1c2UgYSBkaWZmZXJlbnQKKyAgICAgZW5jb2RpbmcsIGJ1dCB0aGUgc2FtZSBtbmVtb25pYyk6ICovCisgIGlmIChoYWxmd29yZCA9ICgoZmxhZ3MgJiAweDgwMDAwMDAwKSAhPSAwKSkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgbG9hZC9zdG9yZSBvZiBhIGhhbGZ3b3JkLCBvciBhCisgICAgICAgICBzaWduZWQtZXh0ZW5zaW9uIGxvYWQgKi8KKyAgICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fSEFMRldPUkQpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpbnN0LmVycm9yCisJICAgID0gXygiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgaGFsZndvcmRzIG9yIHNpZ25lZCBieXRlcyIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBpbnN0Lmluc3RydWN0aW9uID0gKGluc3QuaW5zdHJ1Y3Rpb24gJiBDT05EX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgfCAoZmxhZ3MgJiB+Q09ORF9NQVNLKTsKKworICAgICAgZmxhZ3MgPSAwOworICAgIH0KKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisgICAgCisgIGlmICgoY29uZmxpY3RfcmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAxMikpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oIkFkZHJlc3MgZXhwZWN0ZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCpzdHIgPT0gJ1snKQorICAgIHsKKyAgICAgIGludCByZWc7CisKKyAgICAgIHN0cisrOworICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQorCXN0cisrOworCisgICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgICBjb25mbGljdF9yZWcgPSAoKChjb25mbGljdF9yZWcgPT0gcmVnKQorCQkgICAgICAgJiYgKGluc3QuaW5zdHJ1Y3Rpb24gJiBMT0FEX0JJVCkpCisJCSAgICAgID8gMSA6IDApOworCisgICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCisJc3RyKys7CisKKyAgICAgIGlmICgqc3RyID09ICddJykKKwl7CisJICBzdHIrKzsKKwkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCisJICAgIHsKKwkgICAgICAvKiBbUm5dLC4uLiAocG9zdCBpbmMpICovCisJICAgICAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKKwkJcmV0dXJuOworCSAgICAgIGlmIChjb25mbGljdF9yZWcpCisJCWFzX3dhcm4gKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFtSbl0gKi8KKyAgICAgICAgICAgICAgaWYgKGhhbGZ3b3JkKQorICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOworCisgICAgICAgICAgICAgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICAgICAgICAgICAgIHN0cisrOworCisgICAgICAgICAgICAgIGlmICgqc3RyID09ICchJykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0X3JlZykKKyAgICAgICAgICAgICAgICAgIGFzX3dhcm4gKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iKSk7CisgICAgICAgICAgICAgICAgIHN0cisrOworICAgICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFdSSVRFX0JBQ0s7CisgICAgICAgICAgICAgICB9CisKKwkgICAgICBmbGFncyB8PSBJTkRFWF9VUDsKKwkgICAgICBpZiAoISAoZmxhZ3MgJiBUUkFOU19CSVQpKQorCQlwcmVfaW5jID0gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBbUm4sLi4uXSAqLworCSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJwcmUtaW5kZXhlZCBleHByZXNzaW9uIGV4cGVjdGVkIik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIHByZV9pbmMgPSAxOworCSAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKKwkgICAgcmV0dXJuOworCisJICB3aGlsZSAoKnN0ciA9PSAnICcpCisJICAgIHN0cisrOworCisJICBpZiAoKnN0cisrICE9ICddJykKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgd2hpbGUgKCpzdHIgPT0gJyAnKQorCSAgICBzdHIrKzsKKworCSAgaWYgKCpzdHIgPT0gJyEnKQorCSAgICB7CisJICAgICAgaWYgKGNvbmZsaWN0X3JlZykKKwkJYXNfdHNrdHNrIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZVxuIikpOworCSAgICAgIHN0cisrOworCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UgaWYgKCpzdHIgPT0gJz0nKQorICAgIHsKKyAgICAgIC8qIFBhcnNlIGFuICJsZHIgUmQsID1leHByIiBpbnN0cnVjdGlvbjsgdGhpcyBpcyBhbm90aGVyIHBzZXVkbyBvcCAqLworICAgICAgc3RyKys7CisKKyAgICAgIHdoaWxlICgqc3RyID09ICcgJykKKwlzdHIrKzsKKworICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorCXJldHVybjsKKworICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudAorCSAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX3N5bWJvbCkKKwl7CisJICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOworCSAgcmV0dXJuOworCX0KKworICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgKHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikpICE9IEZBSUwpCisJeworCSAgLyogVGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgbW92IGluc3RydWN0aW9uICovCisJICBpbnN0Lmluc3RydWN0aW9uICY9IExJVEVSQUxfTUFTSzsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEUgfCAoT1BDT0RFX01PViA8PCBEQVRBX09QX1NISUZUKTsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKGZsYWdzICYgQ09ORF9NQVNLKSB8ICh2YWx1ZSAmIDB4ZmZmKTsKKwkgIGVuZF9vZl9saW5lKHN0cik7CisJICByZXR1cm47IAorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBJbnNlcnQgaW50byBsaXRlcmFsIHBvb2wgKi8gICAgIAorCSAgaWYgKGFkZF90b19saXRfcG9vbCAoKSA9PSBGQUlMKQorCSAgICB7CisJICAgICAgaWYgKCFpbnN0LmVycm9yKQorCQlpbnN0LmVycm9yID0gXygibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiKTsgCisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24gZXhwIHRvIHBvaW50IHRvIHRoZSBwb29sICovCisgICAgICAgICAgaWYgKGhhbGZ3b3JkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKKyAgICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorCSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw7CisJICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7CisJICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOworCSAgcHJlX2luYyA9IDE7IAorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCisJcmV0dXJuOworCisgICAgICBpZiAoaGFsZndvcmQpCisgICAgICAgIHsKKyAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKKyAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKKyAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLworICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOworICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKKyAgICAgIHByZV9pbmMgPSAxOworICAgIH0KKyAgICAKKyAgaWYgKHByZV9pbmMgJiYgKGZsYWdzICYgVFJBTlNfQklUKSkKKyAgICBpbnN0LmVycm9yID0gXygiUHJlLWluY3JlbWVudCBpbnN0cnVjdGlvbiB3aXRoIHRyYW5zbGF0ZSIpOworCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCAocHJlX2luYyA/IFBSRV9JTkRFWCA6IDApOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgbG9uZworcmVnX2xpc3QgKHN0cnApCisgICAgIGNoYXIgKiogc3RycDsKK3sKKyAgY2hhciAqIHN0ciA9ICpzdHJwOworICBsb25nICAgcmFuZ2UgPSAwOworICBpbnQgICAgYW5vdGhlcl9yYW5nZTsKKworICAvKiBXZSBjb21lIGJhY2sgaGVyZSBpZiB3ZSBnZXQgcmFuZ2VzIGNvbmNhdGVuYXRlZCBieSAnKycgb3IgJ3wnICovCisgIGRvCisgICAgeworICAgICAgYW5vdGhlcl9yYW5nZSA9IDA7CisKKyAgICAgIGlmICgqc3RyID09ICd7JykKKwl7CisJICBpbnQgaW5fcmFuZ2UgPSAwOworCSAgaW50IGN1cl9yZWcgPSAtMTsKKyAgICAgIAorCSAgc3RyKys7CisJICBkbworCSAgICB7CisJICAgICAgaW50IHJlZzsKKwkgICAgCisJICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQorCQlzdHIrKzsKKworCSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAtMSkpID09IEZBSUwpCisJCXJldHVybiBGQUlMOworCSAgICAgIAorCSAgICAgIGlmIChpbl9yYW5nZSkKKwkJeworCQkgIGludCBpOworCSAgICAgIAorCQkgIGlmIChyZWcgPD0gY3VyX3JlZykKKwkJICAgIHsKKwkJICAgICAgaW5zdC5lcnJvciA9IF8oIkJhZCByYW5nZSBpbiByZWdpc3RlciBsaXN0Iik7CisJCSAgICAgIHJldHVybiBGQUlMOworCQkgICAgfQorCisJCSAgZm9yIChpID0gY3VyX3JlZyArIDE7IGkgPCByZWc7IGkrKykKKwkJICAgIHsKKwkJICAgICAgaWYgKHJhbmdlICYgKDEgPDwgaSkpCisJCQlhc190c2t0c2sgCisJCQkgIChfKCJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiKSwKKwkJCSAgIGkpOworCQkgICAgICBlbHNlCisJCQlyYW5nZSB8PSAxIDw8IGk7CisJCSAgICB9CisJCSAgaW5fcmFuZ2UgPSAwOworCQl9CisKKwkgICAgICBpZiAocmFuZ2UgJiAoMSA8PCByZWcpKQorCQlhc190c2t0c2sgKF8oIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIpLAorCQkJICAgcmVnKTsKKwkgICAgICBlbHNlIGlmIChyZWcgPD0gY3VyX3JlZykKKwkJYXNfdHNrdHNrIChfKCJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIikpOworCisJICAgICAgcmFuZ2UgfD0gMSA8PCByZWc7CisJICAgICAgY3VyX3JlZyA9IHJlZzsKKwkgICAgfSB3aGlsZSAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMCisJCSAgICAgfHwgKGluX3JhbmdlID0gMSwgKnN0cisrID09ICctJykpOworCSAgc3RyLS07CisJICB3aGlsZSAoKnN0ciA9PSAnICcpCisJICAgIHN0cisrOworCisJICBpZiAoKnN0cisrICE9ICd9JykKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJNaXNzaW5nIGB9JyIpOworCSAgICAgIHJldHVybiBGQUlMOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGV4cHJlc3Npb25TIGV4cHI7CisKKwkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsICZzdHIpKQorCSAgICByZXR1cm4gRkFJTDsKKworCSAgaWYgKGV4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgaWYgKGV4cHIuWF9hZGRfbnVtYmVyIAorCQkgICE9IChleHByLlhfYWRkX251bWJlciAmIDB4MDAwMGZmZmYpKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbWFzayIpOworCQkgIHJldHVybiBGQUlMOworCQl9CisKKwkgICAgICBpZiAoKHJhbmdlICYgZXhwci5YX2FkZF9udW1iZXIpICE9IDApCisJCXsKKwkJICBpbnQgcmVnbm8gPSByYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyOworCisJCSAgcmVnbm8gJj0gLXJlZ25vOworCQkgIHJlZ25vID0gKDEgPDwgcmVnbm8pIC0gMTsKKwkJICBhc190c2t0c2sgCisJCSAgICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCisJCSAgICAgcmVnbm8pOworCQl9CisKKwkgICAgICByYW5nZSB8PSBleHByLlhfYWRkX251bWJlcjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGluc3QucmVsb2MudHlwZSAhPSAwKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKKwkJICByZXR1cm4gRkFJTDsKKwkJfQorCisJICAgICAgbWVtY3B5ICgmaW5zdC5yZWxvYy5leHAsICZleHByLCBzaXplb2YgKGV4cHJlc3Npb25TKSk7CisJICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9NVUxUSTsKKwkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIHdoaWxlICgqc3RyID09ICcgJykKKwlzdHIrKzsKKworICAgICAgaWYgKCpzdHIgPT0gJ3wnIHx8ICpzdHIgPT0gJysnKQorCXsKKwkgIHN0cisrOworCSAgYW5vdGhlcl9yYW5nZSA9IDE7CisJfQorICAgIH0gd2hpbGUgKGFub3RoZXJfcmFuZ2UpOworCisgICpzdHJwID0gc3RyOworICByZXR1cm4gcmFuZ2U7Cit9CisKK3N0YXRpYyB2b2lkCitkb19sZG1zdG0gKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICBpbnQgYmFzZV9yZWc7CisgIGxvbmcgcmFuZ2U7CisKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmICgoYmFzZV9yZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQorICAgIHJldHVybjsKKworICBpZiAoYmFzZV9yZWcgPT0gUkVHX1BDKQorICAgIHsKKyAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisgIGlmICgqc3RyID09ICchJykKKyAgICB7CisgICAgICBmbGFncyB8PSBXUklURV9CQUNLOworICAgICAgc3RyKys7CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCpzdHIgPT0gJ14nKQorICAgIHsKKyAgICAgIHN0cisrOworICAgICAgZmxhZ3MgfD0gTVVMVElfU0VUX1BTUjsKKyAgICB9CisKKyAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFncyB8IHJhbmdlOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fc3dpIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworICAKKyAgLyogQWxsb3cgb3B0aW9uYWwgbGVhZGluZyAnIycuICAqLworICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCisgICAgc3RyKys7CisKKyAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCisgICAgcmV0dXJuOworCisgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU1dJOworICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7CisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7CisgIAorICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgCisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RvX3N3YXAgKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICBpbnQgcmVnOworICAKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHJlZyA9PSBSRUdfUEMpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHJlZyA9PSBSRUdfUEMpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8ICpzdHIrKyAhPSAnWycpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQorICAgIHJldHVybjsKKworICBpZiAocmVnID09IFJFR19QQykKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gYmFkX3BjOworICAgICAgcmV0dXJuOworICAgIH0KKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKCpzdHIrKyAhPSAnXScpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fYnJhbmNoIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorICAgIHJldHVybjsKKyAgCisjaWZkZWYgT0JKX0VMRgorICB7CisgICAgY2hhciAqIHNhdmVfaW47CisgIAorICAgIC8qIFNjb3R0QjogRmVicnVhcnkgNSwgMTk5OCAqLworICAgIC8qIENoZWNrIHRvIHNlZSBvZiBQTFQzMiByZWxvYyByZXF1aXJlZCBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgICAKKyAgICAvKiBhcm1fcGFyc2VfcmVsb2MoKSB3b3JrcyBvbiBpbnB1dF9saW5lX3BvaW50ZXIuCisgICAgICAgV2UgYWN0dWFsbHkgd2FudCB0byBwYXJzZSB0aGUgb3BlcmFuZHMgdG8gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbgorICAgICAgIHBhc3NlZCBpbiAnc3RyJy4gIFNhdmUgdGhlIGlucHV0IHBvaW50ZXIgYW5kIHJlc3RvcmUgaXQgbGF0ZXIuICAqLworICAgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fc3ltYm9sCisJJiYgKnN0ciA9PSAnKCcKKwkmJiBhcm1fcGFyc2VfcmVsb2MgKCkgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKKyAgICAgIHsKKwlpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUExUMzI7CisJaW5zdC5yZWxvYy5wY19yZWwgPSAwOworCS8qIE1vZGlmeSBzdHIgdG8gcG9pbnQgdG8gYWZ0ZXIgcGFyc2VkIG9wZXJhbmRzLCBvdGhlcndpc2UKKwkgICBlbmRfb2ZfbGluZSgpIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlIChQTFQpIGxlZnQgaW4gc3RyLiAgKi8KKwlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7CisJaW5zdC5yZWxvYy5wY19yZWwgPSAxOworICAgICAgfQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47CisgIH0KKyNlbHNlCisgIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7CisgIGluc3QucmVsb2MucGNfcmVsID0gMTsKKyNlbmRpZiAvKiBPQkpfRUxGICovCisgIAorICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fYnggKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICBpbnQgcmVnOworCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHJlZyA9PSBSRUdfUEMpCisgICAgYXNfdHNrdHNrIChfKCJVc2Ugb2YgcjE1IGluIGJ4IGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIikpOworCisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkb19jZHAgKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICAvKiBDby1wcm9jZXNzb3IgZGF0YSBvcGVyYXRpb24uCisgICAgIEZvcm1hdDogQ0RQe2NvbmR9IENQIyw8ZXhwcj4sQ1JkLENSbixDUm17LDxleHByPn0gICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgY3Bfb3BjX2V4cHIgKCZzdHIsIDIwLDQpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQorICAgIHsKKyAgICAgIGlmIChjcF9vcGNfZXhwciAoJnN0ciwgNSwgMykgPT0gRkFJTCkKKwl7CisJICBpZiAoIWluc3QuZXJyb3IpCisJICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkb19sc3RjIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgLyogQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGxvYWQvc3RvcmUuCisgICAgIEZvcm1hdDogPExEQ3xTVEN7Y29uZH1bTF0gQ1AjLENSZCw8YWRkcmVzcz4gICovCisKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fY29fcmVnIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgLyogQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIHRyYW5zZmVyLgorICAgICBGb3JtYXQ6IDxNQ1J8TVJDPntjb25kfSBDUCMsPGV4cHIxPixSZCxDUm4sQ1Jteyw8ZXhwcjI+fSAgKi8KKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGNwX29wY19leHByICgmc3RyLCAyMSwgMykgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCisgICAgeworICAgICAgaWYgKGNwX29wY19leHByICgmc3RyLCA1LCAzKSA9PSBGQUlMKQorCXsKKwkgIGlmICghaW5zdC5lcnJvcikKKwkgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgZW5kX29mX2xpbmUgKHN0cik7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RvX2ZwX2N0cmwgKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICAvKiBGUCBjb250cm9sIHJlZ2lzdGVycy4KKyAgICAgRm9ybWF0OiA8V0ZTfFJGU3xXRkN8UkZDPntjb25kfSBSbiAgKi8KKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fZnBfbGRzdCAoc3RyLCBmbGFncykKKyAgICAgY2hhciAqICAgICAgICBzdHI7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit7CisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBzd2l0Y2ggKGluc3Quc3VmZml4KQorICAgIHsKKyAgICBjYXNlIFNVRkZfUzoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1VGRl9EOgorICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNVRkZfRToKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTVUZGX1A6CisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWCB8IENQX1RfWTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCFpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZW5kX29mX2xpbmUgKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitkb19mcF9sZG1zdG0gKHN0ciwgZmxhZ3MpCisgICAgIGNoYXIgKiAgICAgICAgc3RyOworICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworeworICBpbnQgbnVtX3JlZ3M7CisKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCEgaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEdldCBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHRyYW5zZmVyICovCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbnVtX3JlZ3MgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7CisKKyAgaWYgKG51bV9yZWdzIDwgMSB8fCBudW1fcmVncyA+IDQpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oIm51bWJlciBvZiByZWdpc3RlcnMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzE6NF0iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3dpdGNoIChudW1fcmVncykKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZIHwgQ1BfVF9YOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAoZmxhZ3MpCisgICAgeworICAgICAgaW50IHJlZzsKKyAgICAgIGludCB3cml0ZV9iYWNrOworICAgICAgaW50IG9mZnNldDsKKworICAgICAgLyogVGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCAiZWEiIG9yICJmZCIsIHNvIHdlIGNhbiBvbmx5IGFjY2VwdAorCSBbUm5deyF9LiAgVGhlIGluc3RydWN0aW9uIGRvZXMgbm90IHJlYWxseSBzdXBwb3J0IHN0YWNraW5nIG9yCisJIHVuc3RhY2tpbmcsIHNvIHdlIGhhdmUgdG8gZW11bGF0ZSB0aGVzZSBieSBzZXR0aW5nIGFwcHJvcHJpYXRlCisJIGJpdHMgYW5kIG9mZnNldHMuICAqLworICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorCSAgfHwgKnN0ciAhPSAnWycpCisJeworCSAgaWYgKCEgaW5zdC5lcnJvcikKKwkgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworCSAgcmV0dXJuOworCX0KKworICAgICAgc3RyKys7CisgICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCisJc3RyKys7CisKKyAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICAgIHdoaWxlICgqc3RyID09ICcgJykKKwlzdHIrKzsKKworICAgICAgaWYgKCpzdHIgIT0gJ10nKQorCXsKKwkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHN0cisrOworICAgICAgaWYgKCpzdHIgPT0gJyEnKQorCXsKKwkgIHdyaXRlX2JhY2sgPSAxOworCSAgc3RyKys7CisJICBpZiAocmVnID09IFJFR19QQykKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciB3aXRoIHdyaXRlLWJhY2siKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJd3JpdGVfYmFjayA9IDA7CisKKyAgICAgIGlmIChmbGFncyAmIENQX1RfUHJlKQorCXsKKwkgIC8qIFByZS1kZWNyZW1lbnQgKi8KKwkgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKKwkgIGlmICh3cml0ZV9iYWNrKQorCSAgICBmbGFncyB8PSBDUF9UX1dCOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBQb3N0LWluY3JlbWVudCAqLworCSAgaWYgKHdyaXRlX2JhY2spCisJICAgIHsKKwkgICAgICBmbGFncyB8PSBDUF9UX1dCOworCSAgICAgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm8gd3JpdGUtYmFjaywgc28gY29udmVydCB0aGlzIGludG8gYSBzdGFuZGFyZCBwcmUtaW5jcmVtZW50CisJCSBpbnN0cnVjdGlvbiAtLSBhZXN0aGV0aWNhbGx5IG1vcmUgcGxlYXNpbmcuICAqLworCSAgICAgIGZsYWdzID0gQ1BfVF9QcmUgfCBDUF9UX1VEOworCSAgICAgIG9mZnNldCA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCBvZmZzZXQ7CisgICAgfQorICBlbHNlIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKwkgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCEgaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGVuZF9vZl9saW5lIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZG9fZnBfZHlhZGljIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIHN3aXRjaCAoaW5zdC5zdWZmaXgpCisgICAgeworICAgIGNhc2UgU1VGRl9TOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTVUZGX0Q6CisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNVRkZfRToKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCEgaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7CisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkb19mcF9tb25hZGljIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIHN3aXRjaCAoaW5zdC5zdWZmaXgpCisgICAgeworICAgIGNhc2UgU1VGRl9TOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTVUZGX0Q6CisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNVRkZfRToKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fZnBfY21wIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCEgaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKKyAgZW5kX29mX2xpbmUgKHN0cik7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RvX2ZwX2Zyb21fcmVnIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIHN3aXRjaCAoaW5zdC5zdWZmaXgpCisgICAgeworICAgIGNhc2UgU1VGRl9TOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTVUZGX0Q6CisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNVRkZfRToKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZG9fZnBfdG9fcmVnIChzdHIsIGZsYWdzKQorICAgICBjaGFyICogICAgICAgIHN0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCisgICAgcmV0dXJuOworCisgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOworICBlbmRfb2ZfbGluZSAoc3RyKTsKKyAgcmV0dXJuOworfQorCisvKiBUaHVtYiBzcGVjaWZpYyByb3V0aW5lcyAqLworCisvKiBQYXJzZSBhbmQgdmFsaWRhdGUgdGhhdCBhIHJlZ2lzdGVyIGlzIG9mIHRoZSByaWdodCBmb3JtLCB0aGlzIHNhdmVzCisgICByZXBlYXRlZCBjaGVja2luZyBvZiB0aGlzIGluZm9ybWF0aW9uIGluIG1hbnkgc2ltaWxhciBjYXNlcy4gCisgICBVbmxpa2UgdGhlIDMyLWJpdCBjYXNlIHdlIGRvIG5vdCBpbnNlcnQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIG9wY29kZSAKKyAgIGhlcmUsIHNpbmNlIHRoZSBwb3NpdGlvbiBpcyBvZnRlbiB1bmtub3duIHVudGlsIHRoZSBmdWxsIGluc3RydWN0aW9uIAorICAgaGFzIGJlZW4gcGFyc2VkLiAgKi8KK3N0YXRpYyBpbnQKK3RodW1iX3JlZyAoc3RycCwgaGlfbG8pCisgICAgIGNoYXIgKiogc3RycDsKKyAgICAgaW50ICAgICBoaV9sbzsKK3sKKyAgaW50IHJlZzsKKworICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlIChzdHJwLCAtMSkpID09IEZBSUwpCisgICAgcmV0dXJuIEZBSUw7CisKKyAgc3dpdGNoIChoaV9sbykKKyAgICB7CisgICAgY2FzZSBUSFVNQl9SRUdfTE86CisgICAgICBpZiAocmVnID4gNykKKwl7CisJICBpbnN0LmVycm9yID0gXygibG8gcmVnaXN0ZXIgcmVxdWlyZWQiKTsKKwkgIHJldHVybiBGQUlMOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUSFVNQl9SRUdfSEk6CisgICAgICBpZiAocmVnIDwgOCkKKwl7CisJICBpbnN0LmVycm9yID0gXygiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiKTsKKwkgIHJldHVybiBGQUlMOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gcmVnOworfQorCisvKiBQYXJzZSBhbiBhZGQgb3Igc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIFNVQlRSQUNUIGlzIG5vbi16ZXJvIGlmIHRoZSBvcGNvZGUKKyAgIHdhcyBTVUIuICAqLworc3RhdGljIHZvaWQKK3RodW1iX2FkZF9zdWIgKHN0ciwgc3VidHJhY3QpCisgICAgIGNoYXIgKiBzdHI7CisgICAgIGludCAgICBzdWJ0cmFjdDsKK3sKKyAgaW50IFJkLCBScywgUm4gPSBGQUlMOworCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTAorICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCisgICAgeworICAgICAgUnMgPSBSZDsKKyAgICAgIHN0cisrOworICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorCXJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCisJeworCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUgCisJICAgICBhcmUgMyAqLworCSAgUm4gPSBSczsKKwkgIFJzID0gUmQ7CisJfQorICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCisJeworCSAgc3RyKys7CisJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCisJICAgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQorCXJldHVybjsKKyAgICB9CisKKyAgLyogV2Ugbm93IGhhdmUgUmQgYW5kIFJzIHNldCB0byByZWdpc3RlcnMsIGFuZCBSbiBzZXQgdG8gYSByZWdpc3RlciBvciBGQUlMOworICAgICBmb3IgdGhlIGxhdHRlciBjYXNlLCBFWFBSIGNvbnRhaW5zIHRoZSBpbW1lZGlhdGUgdGhhdCB3YXMgZm91bmQuICovCisgIGlmIChSbiAhPSBGQUlMKQorICAgIHsKKyAgICAgIC8qIEFsbCByZWdpc3RlciBmb3JtYXQuICAqLworICAgICAgaWYgKFJkID4gNyB8fCBScyA+IDcgfHwgUm4gPiA3KQorCXsKKwkgIGlmIChScyAhPSBSZCkKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgLyogQ2FuJ3QgZG8gdGhpcyBmb3IgU1VCICovCisJICBpZiAoc3VidHJhY3QpCisJICAgIHsKKwkgICAgICBpbnN0LmVycm9yID0gXygic3VidHJhY3QgdmFsaWQgb25seSBvbiBsbyByZWdzIik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoVF9PUENPREVfQUREX0hJCisJCQkgICAgICB8IChSZCA+IDcgPyBUSFVNQl9IMSA6IDApCisJCQkgICAgICB8IChSbiA+IDcgPyBUSFVNQl9IMiA6IDApKTsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkICYgNykgfCAoKFJuICYgNykgPDwgMyk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9SMyA6IFRfT1BDT0RFX0FERF9SMzsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMykgfCAoUm4gPDwgNik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uLCBub3cgdGhpbmdzIHN0YXJ0IHRvIGdldCBuYXN0eS4gICovCisKKyAgICAgIC8qIEZpcnN0IGRlYWwgd2l0aCBISSByZWdzLCBvbmx5IHZlcnkgcmVzdHJpY3RlZCBjYXNlcyBhbGxvd2VkOgorCSBBZGp1c3RpbmcgU1AsIGFuZCB1c2luZyBQQyBvciBTUCB0byBnZXQgYW4gYWRkcmVzcy4gICovCisgICAgICBpZiAoKFJkID4gNyAmJiAoUmQgIT0gUkVHX1NQIHx8IFJzICE9IFJFR19TUCkpCisJICB8fCAoUnMgPiA3ICYmIFJzICE9IFJFR19TUCAmJiBScyAhPSBSRUdfUEMpKQorCXsKKwkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIik7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQorCXsKKwkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgYWxsIHdlIGNhbiBkbyBpcyBzdG9yZSBhbGwgdGhlIGZyYWdtZW50cworCSAgICAgd2Uga25vdyBhYm91dCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGxldCB0aGUgcmVsb2MgaGFja2luZyAKKwkgICAgIHdvcmsgaXQgYWxsIG91dC4gICovCisJICBpbnN0Lmluc3RydWN0aW9uID0gKHN1YnRyYWN0ID8gMHg4MDAwIDogMCkgfCAoUmQgPDwgNCkgfCBSczsKKwkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOworCisJICBpZiAoc3VidHJhY3QpCisJICAgIG9mZnNldCA9IC1vZmZzZXQ7CisKKwkgIGlmIChvZmZzZXQgPCAwKQorCSAgICB7CisJICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKwkgICAgICBzdWJ0cmFjdCA9IDE7CisKKwkgICAgICAvKiBRdWljayBjaGVjaywgaW4gY2FzZSBvZmZzZXQgaXMgTUlOX0lOVCAqLworCSAgICAgIGlmIChvZmZzZXQgPCAwKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICBzdWJ0cmFjdCA9IDA7CisKKwkgIGlmIChSZCA9PSBSRUdfU1ApCisJICAgIHsKKwkgICAgICBpZiAob2Zmc2V0ICYgfjB4MWZjKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfU1QgOiBUX09QQ09ERV9BRERfU1Q7CisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAoUnMgPT0gUkVHX1BDIHx8IFJzID09IFJFR19TUCkKKwkgICAgeworCSAgICAgIGlmIChzdWJ0cmFjdAorCQkgIHx8IChvZmZzZXQgJiB+MHgzZmMpKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIik7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChScyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMKKwkJCQkgIDogVF9PUENPREVfQUREX1NQKTsKKwkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCA8PCA4KSB8IChvZmZzZXQgPj4gMik7CisJICAgIH0KKwkgIGVsc2UgaWYgKFJzID09IFJkKQorCSAgICB7CisJICAgICAgaWYgKG9mZnNldCAmIH4weGZmKQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7CisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgPDwgOCkgfCBvZmZzZXQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChvZmZzZXQgJiB+MHg3KQorCQl7CisJCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7CisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKSB8IChvZmZzZXQgPDwgNik7CisJICAgIH0KKwl9CisgICAgfQorICBlbmRfb2ZfbGluZSAoc3RyKTsKK30KKworc3RhdGljIHZvaWQKK3RodW1iX3NoaWZ0IChzdHIsIHNoaWZ0KQorICAgICBjaGFyICogc3RyOworICAgICBpbnQgICAgc2hpZnQ7Cit7CisgIGludCBSZCwgUnMsIFJuID0gRkFJTDsKKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAorICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCisgICAgeworICAgICAgLyogVHdvIG9wZXJhbmQgaW1tZWRpYXRlIGZvcm1hdCwgc2V0IFJzIHRvIFJkLiAgKi8KKyAgICAgIFJzID0gUmQ7CisgICAgICBzdHIrKzsKKyAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKKwlyZXR1cm47CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKChScyA9ICB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCisJcmV0dXJuOworCisgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQorCXsKKwkgIC8qIFR3byBvcGVyYW5kIGZvcm1hdCwgc2h1ZmZsZSB0aGUgcmVnaXN0ZXJzIGFuZCBwcmV0ZW5kIHRoZXJlCisJICAgICBhcmUgMyAqLworCSAgUm4gPSBSczsKKwkgIFJzID0gUmQ7CisJfQorICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCisJeworCSAgc3RyKys7CisJICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCisJICAgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCisJcmV0dXJuOworICAgIH0KKworICAvKiBXZSBub3cgaGF2ZSBSZCBhbmQgUnMgc2V0IHRvIHJlZ2lzdGVycywgYW5kIFJuIHNldCB0byBhIHJlZ2lzdGVyIG9yIEZBSUw7CisgICAgIGZvciB0aGUgbGF0dGVyIGNhc2UsIEVYUFIgY29udGFpbnMgdGhlIGltbWVkaWF0ZSB0aGF0IHdhcyBmb3VuZC4gKi8KKworICBpZiAoUm4gIT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoUnMgIT0gUmQpCisJeworCSAgaW5zdC5lcnJvciA9IF8oInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIik7CisJICByZXR1cm47CisJfQorCisgICAgICBzd2l0Y2ggKHNoaWZ0KQorCXsKKwljYXNlIFRIVU1CX0FTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FTUl9SOyBicmVhazsKKwljYXNlIFRIVU1CX0xTTDogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9SOyBicmVhazsKKwljYXNlIFRIVU1CX0xTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTUl9SOyBicmVhazsKKwl9CisKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUm4gPDwgMyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChzaGlmdCkKKwl7CisJY2FzZSBUSFVNQl9BU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9BU1JfSTsgYnJlYWs7CisJY2FzZSBUSFVNQl9MU0w6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsgYnJlYWs7CisJY2FzZSBUSFVNQl9MU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU1JfSTsgYnJlYWs7CisJfQorCisgICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQorCXsKKwkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgY3JlYXRlIGEgZHVtbXkgcmVsb2MgYW5kIGxldCByZWxvYworCSAgICAgaGFja2luZyBmaXggaXQgdXAgKi8KKworCSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDsKKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgc2hpZnRfdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7CisKKwkgIGlmIChzaGlmdF92YWx1ZSA+IDMyIHx8IChzaGlmdF92YWx1ZSA9PSAzMiAmJiBzaGlmdCA9PSBUSFVNQl9MU0wpKQorCSAgICB7CisJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBzaGlmdCIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICAvKiBTaGlmdHMgb2YgemVybyBhcmUgaGFuZGxlZCBieSBjb252ZXJ0aW5nIHRvIExTTCAqLworCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDApCisJICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsKKworCSAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIGEgc2hpZnQgb2YgemVybyAqLworCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDMyKQorCSAgICBzaGlmdF92YWx1ZSA9IDA7CisKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hpZnRfdmFsdWUgPDwgNjsKKwl9CisKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7CisgICAgfQorICBlbmRfb2ZfbGluZSAoc3RyKTsKK30KKworc3RhdGljIHZvaWQKK3RodW1iX21vdl9jb21wYXJlIChzdHIsIG1vdmUpCisgICAgIGNoYXIgKiBzdHI7CisgICAgIGludCAgICBtb3ZlOworeworICBpbnQgUmQsIFJzID0gRkFJTDsKKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwKKyAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQorICAgIHsKKyAgICAgIHN0cisrOworICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorCXJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCisgICAgcmV0dXJuOworCisgIGlmIChScyAhPSBGQUlMKQorICAgIHsKKyAgICAgIGlmIChScyA8IDggJiYgUmQgPCA4KQorCXsKKwkgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCisJICAgIC8qIEEgbW92ZSBvZiB0d28gbG93cmVncyBpcyBlbmNvZGVkIGFzIEFERCBSZCwgUnMsICMwCisJICAgICAgIHNpbmNlIGEgTU9WIGluc3RydWN0aW9uIHByb2R1Y2VzIHVucHJlZGljdGFibGUgcmVzdWx0cyAqLworCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQUREX0kzOworCSAgZWxzZQorCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0xSOworCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKKwkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9IUjsKKwkgIGVsc2UKKwkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9IUjsKKworCSAgaWYgKFJkID4gNykKKwkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMTsKKworCSAgaWYgKFJzID4gNykKKwkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMjsKKworCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgJiA3KSB8ICgoUnMgJiA3KSA8PCAzKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKFJkID4gNykKKwl7CisJICBpbnN0LmVycm9yID0gXygib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCisJaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9JODsKKyAgICAgIGVsc2UKKwlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0k4OworCisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7CisKKyAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCisJaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9JTU07CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7CisKKwkgIGlmICh2YWx1ZSA+IDI1NSkKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOworCX0KKyAgICB9CisKKyAgZW5kX29mX2xpbmUgKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHVtYl9sb2FkX3N0b3JlIChzdHIsIGxvYWRfc3RvcmUsIHNpemUpCisgICAgIGNoYXIgKiBzdHI7CisgICAgIGludCAgICBsb2FkX3N0b3JlOworICAgICBpbnQgICAgc2l6ZTsKK3sKKyAgaW50IFJkLCBSYiwgUm8gPSBGQUlMOworCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCisgICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCisgICAgeworICAgICAgaWYgKCEgaW5zdC5lcnJvcikKKwlpbnN0LmVycm9yID0gYmFkX2FyZ3M7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICgqc3RyID09ICdbJykKKyAgICB7CisgICAgICBzdHIrKzsKKyAgICAgIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQorCXJldHVybjsKKworICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTCkKKwl7CisJICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCisJICAgIHsKKwkgICAgICBzdHIrKzsKKwkgICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCisJCXJldHVybjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKFJvID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQorCSAgICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX2NvbnN0YW50OworCSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gMDsKKwl9CisKKyAgICAgIGlmICgqc3RyICE9ICddJykKKwl7CisJICBpbnN0LmVycm9yID0gXygiZXhwZWN0ZWQgJ10nIik7CisJICByZXR1cm47CisJfQorICAgICAgc3RyKys7CisgICAgfQorICBlbHNlIGlmICgqc3RyID09ICc9JykKKyAgICB7CisgICAgICAvKiBQYXJzZSBhbiAibGRyIFJkLCA9ZXhwciIgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW5vdGhlciBwc2V1ZG8gb3AgKi8KKyAgICAgIHN0cisrOworCisgICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCisJc3RyKys7CisKKyAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQorCXJldHVybjsKKworICAgICAgZW5kX29mX2xpbmUgKHN0cik7CisgICAgICAKKyAgICAgIGlmICggICBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQKKwkgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19zeW1ib2wpCisJeworCSAgaW5zdC5lcnJvciA9ICJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIjsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKKwkgICYmICgoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyICYgfjB4RkYpID09IDApKQorCXsKKwkgIC8qIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIG1vdiBpbnN0cnVjdGlvbiAqLworCisJICBpbnN0Lmluc3RydWN0aW9uICA9IFRfT1BDT0RFX01PVl9JOCB8IChSZCA8PCA4KTsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOworCSAgcmV0dXJuOyAKKwl9CisKKyAgICAgIC8qIEluc2VydCBpbnRvIGxpdGVyYWwgcG9vbCAqLyAgICAgCisgICAgICBpZiAoYWRkX3RvX2xpdF9wb29sICgpID09IEZBSUwpCisJeworCSAgaWYgKCFpbnN0LmVycm9yKQorCSAgICBpbnN0LmVycm9yID0gImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIjsgCisJICByZXR1cm47CisJfQorCisgICAgICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOworICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOworICAgICAgaW5zdC5pbnN0cnVjdGlvbiAgPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7CisgICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgKz0gNDsgLyogQWRqdXN0IEFSTSBwaXBlbGluZSBvZmZzZXQgdG8gVGh1bWIgKi8KKworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKKwlyZXR1cm47CisKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7CisgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7CisgICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gNDsgLyogUGlwZWxpbmUgb2Zmc2V0ICovCisgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKKyAgICAgIGVuZF9vZl9saW5lIChzdHIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoUmIgPT0gUkVHX1BDIHx8IFJiID09IFJFR19TUCkKKyAgICB7CisgICAgICBpZiAoc2l6ZSAhPSBUSFVNQl9XT1JEKQorCXsKKwkgIGluc3QuZXJyb3IgPSBfKCJieXRlIG9yIGhhbGZ3b3JkIG5vdCB2YWxpZCBmb3IgYmFzZSByZWdpc3RlciIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKFJiID09IFJFR19QQyAmJiBsb2FkX3N0b3JlICE9IFRIVU1CX0xPQUQpCisJeworCSAgaW5zdC5lcnJvciA9IF8oIlIxNSBiYXNlZCBzdG9yZSBub3QgYWxsb3dlZCIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKFJvICE9IEZBSUwpCisJeworCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgYmFzZSByZWdpc3RlciBmb3IgcmVnaXN0ZXIgb2Zmc2V0Iik7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoUmIgPT0gUkVHX1BDKQorCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEM7CisgICAgICBlbHNlIGlmIChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQpCisJaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9TUDsKKyAgICAgIGVsc2UKKwlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfU1RSX1NQOworCisgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7CisgICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCXsKKwkgIHVuc2lnbmVkIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKKworCSAgaWYgKG9mZnNldCAmIH4weDNmYykKKwkgICAgeworCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIG9mZnNldCIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOworCX0KKyAgICAgIGVsc2UKKwlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKKyAgICB9CisgIGVsc2UgaWYgKFJiID4gNykKKyAgICB7CisgICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKFJvID09IEZBSUwpCisgICAgeworICAgICAgLyogSW1tZWRpYXRlIG9mZnNldCAqLworICAgICAgaWYgKHNpemUgPT0gVEhVTUJfV09SRCkKKwlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAorCQkJICAgID8gVF9PUENPREVfTERSX0lXIDogVF9PUENPREVfU1RSX0lXKTsKKyAgICAgIGVsc2UgaWYgKHNpemUgPT0gVEhVTUJfSEFMRldPUkQpCisJaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKKwkJCSAgICA/IFRfT1BDT0RFX0xEUl9JSCA6IFRfT1BDT0RFX1NUUl9JSCk7CisgICAgICBlbHNlCisJaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKKwkJCSAgICA/IFRfT1BDT0RFX0xEUl9JQiA6IFRfT1BDT0RFX1NUUl9JQik7CisKKyAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMyk7CisKKyAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCisJeworCSAgdW5zaWduZWQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOworCSAgCisJICBpZiAob2Zmc2V0ICYgfigweDFmIDw8IHNpemUpKQorCSAgICB7CisJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgb2Zmc2V0Iik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBpbnN0Lmluc3RydWN0aW9uIHw9IChvZmZzZXQgPj4gc2l6ZSkgPDwgNjsKKwl9CisgICAgICBlbHNlCisJaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0ICovCisgICAgICBpZiAoc2l6ZSA9PSBUSFVNQl9XT1JEKQorCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECisJCQkgICAgPyBUX09QQ09ERV9MRFJfUlcgOiBUX09QQ09ERV9TVFJfUlcpOworICAgICAgZWxzZSBpZiAoc2l6ZSA9PSBUSFVNQl9IQUxGV09SRCkKKwlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAorCQkJICAgID8gVF9PUENPREVfTERSX1JIIDogVF9PUENPREVfU1RSX1JIKTsKKyAgICAgIGVsc2UKKwlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAorCQkJICAgID8gVF9PUENPREVfTERSX1JCIDogVF9PUENPREVfU1RSX1JCKTsKKworICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSYiA8PCAzKSB8IChSbyA8PCA2KTsKKyAgICB9CisKKyAgZW5kX29mX2xpbmUgKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitkb190X25vcCAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICAvKiBEbyBub3RoaW5nICovCisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKKy8qIEhhbmRsZSB0aGUgRm9ybWF0IDQgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90IGhhdmUgZXF1aXZhbGVudHMgaW4gb3RoZXIgCisgICBmb3JtYXRzLiAgVGhhdCBpcywgQURDLCBBTkQsIEVPUiwgU0JDLCBST1IsIFRTVCwgTkVHLCBDTU4sIE9SUiwgTVVMLAorICAgQklDIGFuZCBNVk4uICAqLworc3RhdGljIHZvaWQKK2RvX3RfYXJpdCAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICBpbnQgUmQsIFJzLCBSbjsKKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKKyAgICByZXR1cm47CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMKQorICAgIHsKKyAgICAgIC8qIFRocmVlIG9wZXJhbmQgZm9ybWF0IG5vdCBhbGxvd2VkIGZvciBUU1QsIENNTiwgTkVHIGFuZCBNVk4uCisJIChJdCBpc24ndCBhbGxvd2VkIGZvciBDTVAgZWl0aGVyLCBidXQgdGhhdCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMKKwkgZnVuY3Rpb24uKSAgKi8KKyAgICAgIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1RTVAorCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9DTU4KKwkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTkVHCisgCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9NVk4pCisJeworCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOworCSAgcmV0dXJuOworCX0KKworICAgICAgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKKwlyZXR1cm47CisKKyAgICAgIGlmIChScyAhPSBSZCkKKwl7CisJICBpbnN0LmVycm9yID0gXygiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIFJzID0gUm47CisgICAgfQorCisgIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX01VTAorICAgICAgJiYgUnMgPT0gUmQpCisgICAgYXNfdHNrdHNrIChfKCJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIikpOworCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7CisgIGVuZF9vZl9saW5lIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZG9fdF9hZGQgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgdGh1bWJfYWRkX3N1YiAoc3RyLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfYXNyIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0FTUik7Cit9CisKK3N0YXRpYyB2b2lkCitkb190X2JyYW5jaDkgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorICAgIHJldHVybjsKKyAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk7CisgIGluc3QucmVsb2MucGNfcmVsID0gMTsKKyAgZW5kX29mX2xpbmUgKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitkb190X2JyYW5jaDEyIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKKyAgICByZXR1cm47CisgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjsKKyAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOworICBlbmRfb2ZfbGluZSAoc3RyKTsKK30KKworLyogRmluZCB0aGUgcmVhbCwgVGh1bWIgZW5jb2RlZCBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KKworc3RhdGljIHN5bWJvbFMgKgorZmluZF9yZWFsX3N0YXJ0IChzeW1ib2xQKQorICAgICBzeW1ib2xTICogc3ltYm9sUDsKK3sKKyAgY2hhciAqICAgICAgIHJlYWxfc3RhcnQ7CisgIGNvbnN0IGNoYXIgKiBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7CisgIHN5bWJvbFMgKiAgICBuZXdfdGFyZ2V0OworCisgIC8qIFRoaXMgZGVmaW5pdG9ubXVzdCBhZ3JlZSB3aXRoIHRoZSBvbmUgaW4gZ2NjL2NvbmZpZy9hcm0vdGh1bWIuYyAqLworI2RlZmluZSBTVFVCX05BTUUgIi5yZWFsX3N0YXJ0X29mIgorCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgYWJvcnQoKTsKKworICAvKiBOYW1lcyB0aGF0IHN0YXJ0IHdpdGggJy4nIGFyZSBsb2NhbCBsYWJlbHMsIG5vdCBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCisgICAgIFRoZSBjb21waWxlciBtYXkgZ2VuZXJhdGUgQkwgaW5zdHJ1Y3Rpb25zIHRvIHRoZXNlIGxhYmVscyBiZWNhdXNlIGl0CisgICAgIG5lZWRzIHRvIHBlcmZvcm0gYSBicmFuY2ggdG8gYSBmYXIgYXdheSBsb2NhdGlvbi4gICovCisgIGlmIChuYW1lWzBdID09ICcuJykKKyAgICByZXR1cm4gc3ltYm9sUDsKKyAgCisgIHJlYWxfc3RhcnQgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFNUVUJfTkFNRSkgKyAxKTsKKyAgc3ByaW50ZiAocmVhbF9zdGFydCwgIiVzJXMiLCBTVFVCX05BTUUsIG5hbWUpOworCisgIG5ld190YXJnZXQgPSBzeW1ib2xfZmluZCAocmVhbF9zdGFydCk7CisgIAorICBpZiAobmV3X3RhcmdldCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKCJGYWlsZWQgdG8gZmluZCByZWFsIHN0YXJ0IG9mIGZ1bmN0aW9uOiAlc1xuIiwgbmFtZSk7CisgICAgICBuZXdfdGFyZ2V0ID0gc3ltYm9sUDsKKyAgICB9CisKKyAgZnJlZSAocmVhbF9zdGFydCk7CisKKyAgcmV0dXJuIG5ld190YXJnZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX3RfYnJhbmNoMjMgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQorICAgIHJldHVybjsKKyAgaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM7CisgIGluc3QucmVsb2MucGNfcmVsID0gMTsKKyAgZW5kX29mX2xpbmUgKHN0cik7CisKKyAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgYSBkZWZpbmVkIHN5bWJvbCB3aGljaCBkb2VzIG5vdCBoYXZlCisgICAgIHRoZSBUSFVNQl9GVU5DIGF0dHJpYnV0ZSwgdGhlbiB3ZSBtdXN0IGJlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBoYXMKKyAgICAgdGhlIChpbnRlcmZhY2Vhcm0pIGF0dHJpYnV0ZS4gIFdlIGxvb2sgZm9yIHRoZSBUaHVtYiBlbnRyeSBwb2ludCB0byB0aGF0CisgICAgIGZ1bmN0aW9uIGFuZCBjaGFuZ2UgdGhlIGJyYW5jaCB0byByZWZlciB0byB0aGF0IGZ1bmN0aW9uIGluc3RlYWQuICAqLworICBpZiAoICAgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX3N5bWJvbAorICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sICE9IE5VTEwKKyAgICAgICYmIFNfSVNfREVGSU5FRCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQorICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpKQorICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGZpbmRfcmVhbF9zdGFydCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfYnggKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgaW50IHJlZzsKKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChyZWcgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQorICAgIHJldHVybjsKKworICAvKiBUaGlzIHNldHMgVEhVTUJfSDIgZnJvbSB0aGUgdG9wIGJpdCBvZiByZWcuICAqLworICBpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCAzOworCisgIC8qID8/PyBGSVhNRTogU2hvdWxkIGFkZCBhIGhhY2t5IHJlbG9jIGhlcmUgaWYgcmVnIGlzIFJFR19QQy4gIFRoZSByZWxvYworICAgICBzaG91bGQgY2F1c2UgdGhlIGFsaWdubWVudCB0byBiZSBjaGVja2VkIG9uY2UgaXQgaXMga25vd24uICBUaGlzIGlzCisgICAgIGJlY2F1c2UgQlggUEMgb25seSB3b3JrcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgd29yZCBhbGlnbmVkLiAgKi8KKworICBlbmRfb2ZfbGluZSAoc3RyKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfY29tcGFyZSAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9DT01QQVJFKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfbGRtc3RtIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIGludCBSYjsKKyAgbG9uZyByYW5nZTsKKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKKyAgICByZXR1cm47CisKKyAgaWYgKCpzdHIgIT0gJyEnKQorICAgIGFzX3dhcm4gKF8oIkluc2VydGVkIG1pc3NpbmcgJyEnOiBsb2FkL3N0b3JlIG11bHRpcGxlIGFsd2F5cyB3cml0ZXMgYmFjayBiYXNlIHJlZ2lzdGVyIikpOworICBlbHNlCisgICAgc3RyKys7CisKKyAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKHJhbmdlID0gcmVnX2xpc3QgKCZzdHIpKSA9PSBGQUlMKQorICAgIHsKKyAgICAgIGlmICghIGluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoaW5zdC5yZWxvYy50eXBlICE9IEJGRF9SRUxPQ19OT05FKQorICAgIHsKKyAgICAgIC8qIFRoaXMgcmVhbGx5IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4gKi8KKyAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19OT05FOworICAgICAgaW5zdC5lcnJvciA9IF8oIkV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHJhbmdlICYgfjB4ZmYpCisgICAgeworICAgICAgaW5zdC5lcnJvciA9IF8oIm9ubHkgbG8tcmVncyB2YWxpZCBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJiIDw8IDgpIHwgcmFuZ2U7CisgIGVuZF9vZl9saW5lIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZG9fdF9sZHIgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9XT1JEKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfbGRyYiAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0JZVEUpOworfQorCitzdGF0aWMgdm9pZAorZG9fdF9sZHJoIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfSEFMRldPUkQpOworfQorCitzdGF0aWMgdm9pZAorZG9fdF9sZHMgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgaW50IFJkLCBSYiwgUm87CisKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKKyAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAorICAgICAgfHwgKnN0cisrICE9ICdbJworICAgICAgfHwgKFJiID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCisgICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKKyAgICAgIHx8IChSbyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAorICAgICAgfHwgKnN0cisrICE9ICddJykKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBfKCJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMykgfCAoUm8gPDwgNik7CisgIGVuZF9vZl9saW5lIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZG9fdF9sc2wgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgdGh1bWJfc2hpZnQgKHN0ciwgVEhVTUJfTFNMKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfbHNyIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTUik7Cit9CisKK3N0YXRpYyB2b2lkCitkb190X21vdiAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9NT1ZFKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RfcHVzaF9wb3AgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgbG9uZyByYW5nZTsKKworICB3aGlsZSAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisKKyAgaWYgKChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKKyAgICB7CisgICAgICBpZiAoISBpbnN0LmVycm9yKQorCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKKyAgICB7CisgICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCisgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKKyAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChyYW5nZSAmIH4weGZmKQorICAgIHsKKyAgICAgIGlmICgoaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9QVVNICisJICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX0xSKQorCSAgfHwgKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUE9QCisJICAgICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX1BDKSkKKwl7CisJICBpbnN0Lmluc3RydWN0aW9uIHw9IFRIVU1CX1BQX1BDX0xSOworCSAgcmFuZ2UgJj0gMHhmZjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCB0byBwdXNoL3BvcCBpbnN0cnVjdGlvbiIpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgaW5zdC5pbnN0cnVjdGlvbiB8PSByYW5nZTsKKyAgZW5kX29mX2xpbmUgKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitkb190X3N0ciAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9XT1JEKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3Rfc3RyYiAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9CWVRFKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3Rfc3RyaCAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9IQUxGV09SRCk7Cit9CisKK3N0YXRpYyB2b2lkCitkb190X3N1YiAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICB0aHVtYl9hZGRfc3ViIChzdHIsIDEpOworfQorCitzdGF0aWMgdm9pZAorZG9fdF9zd2kgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKKyAgICByZXR1cm47CisKKyAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9TV0k7CisgIGVuZF9vZl9saW5lIChzdHIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkb190X2FkciAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKKyAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTQiICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDQpID09IEZBSUwgIC8qIFN0b3JlIFJkIGluIHRlbXBvcmFyeSBsb2NhdGlvbiBpbnNpZGUgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCisgICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKKyAgICB7CisgICAgICBpZiAoIWluc3QuZXJyb3IpCisJaW5zdC5lcnJvciA9IGJhZF9hcmdzOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDsKKyAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDQ7IC8qIFBDIHJlbGF0aXZlIGFkanVzdCAqLworICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7CisgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUkVHX1BDOyAvKiBSZCBpcyBhbHJlYWR5IHBsYWNlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiAqLworICBlbmRfb2ZfbGluZSAoc3RyKTsKK30KKworc3RhdGljIHZvaWQKK2luc2VydF9yZWcgKGVudHJ5KQorICAgICBpbnQgZW50cnk7Cit7CisgIGludCAgICBsZW4gPSBzdHJsZW4gKHJlZ190YWJsZVtlbnRyeV0ubmFtZSkgKyAyOworICBjaGFyICogYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKKyAgY2hhciAqIGJ1ZjIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOworICBpbnQgICAgaSA9IDA7CisKKyNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKKyAgYnVmW2krK10gPSBSRUdJU1RFUl9QUkVGSVg7CisjZW5kaWYKKworICBzdHJjcHkgKGJ1ZiArIGksIHJlZ190YWJsZVtlbnRyeV0ubmFtZSk7CisKKyAgZm9yIChpID0gMDsgYnVmW2ldOyBpKyspCisgICAgYnVmMltpXSA9IGlzbG93ZXIgKGJ1ZltpXSkgPyB0b3VwcGVyIChidWZbaV0pIDogYnVmW2ldOworCisgIGJ1ZjJbaV0gPSAnXDAnOworCisgIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmLCAoUFRSKSAmcmVnX3RhYmxlW2VudHJ5XSk7CisgIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmMiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOworfQorCitzdGF0aWMgdm9pZAoraW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pCisgICAgIGNoYXIgKnN0cjsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgc3RydWN0IHJlZ19lbnRyeSAqbmV3ID0KKyAgICAoc3RydWN0IHJlZ19lbnRyeSAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlZ19lbnRyeSkpOworICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuIChzdHIpICsgMSk7CisgIHN0cmNweSAobmFtZSwgc3RyKTsKKworICBuZXctPm5hbWUgPSBuYW1lOworICBuZXctPm51bWJlciA9IHJlZ251bTsKKworICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIG5hbWUsIChQVFIpIG5ldyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfY29uc3RhbnRfZmxvbnVtcyAoKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKKyAgICBpZiAoYXRvZl9pZWVlICgoY2hhciAqKWZwX2NvbnN0W2ldLCAneCcsIGZwX3ZhbHVlc1tpXSkgPT0gTlVMTCkKKyAgICAgIGFib3J0ICgpOworfQorCit2b2lkCittZF9iZWdpbiAoKQoreworICBpbnQgaTsKKyAgCisgIGlmICggICAoYXJtX29wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAorICAgICAgfHwgKGFybV90b3BzX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCisgICAgICB8fCAoYXJtX2NvbmRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKKyAgICAgIHx8IChhcm1fc2hpZnRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKKyAgICAgIHx8IChhcm1fcmVnX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCisgICAgICB8fCAoYXJtX3Bzcl9oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKKyAgICBhc19mYXRhbCAoXygiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOworICAgIAorICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpbnNucykgLyBzaXplb2YgKHN0cnVjdCBhc21fb3Bjb2RlKTsgaSsrKQorICAgIGhhc2hfaW5zZXJ0IChhcm1fb3BzX2hzaCwgaW5zbnNbaV0udGVtcGxhdGUsIChQVFIpIChpbnNucyArIGkpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGluc25zKSAvIHNpemVvZiAoc3RydWN0IHRodW1iX29wY29kZSk7IGkrKykKKyAgICBoYXNoX2luc2VydCAoYXJtX3RvcHNfaHNoLCB0aW5zbnNbaV0udGVtcGxhdGUsIChQVFIpICh0aW5zbnMgKyBpKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvbmRzKSAvIHNpemVvZiAoc3RydWN0IGFzbV9jb25kKTsgaSsrKQorICAgIGhhc2hfaW5zZXJ0IChhcm1fY29uZF9oc2gsIGNvbmRzW2ldLnRlbXBsYXRlLCAoUFRSKSAoY29uZHMgKyBpKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNoaWZ0KSAvIHNpemVvZiAoc3RydWN0IGFzbV9zaGlmdCk7IGkrKykKKyAgICBoYXNoX2luc2VydCAoYXJtX3NoaWZ0X2hzaCwgc2hpZnRbaV0udGVtcGxhdGUsIChQVFIpIChzaGlmdCArIGkpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHNycykgLyBzaXplb2YgKHN0cnVjdCBhc21fcHNyKTsgaSsrKQorICAgIGhhc2hfaW5zZXJ0IChhcm1fcHNyX2hzaCwgcHNyc1tpXS50ZW1wbGF0ZSwgKFBUUikgKHBzcnMgKyBpKSk7CisKKyAgZm9yIChpID0gMDsgcmVnX3RhYmxlW2ldLm5hbWU7IGkrKykKKyAgICBpbnNlcnRfcmVnIChpKTsKKworICBzZXRfY29uc3RhbnRfZmxvbnVtcyAoKTsKKworI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworICAgIAorICAgIC8qIFNldCB0aGUgZmxhZ3MgaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisgICAgaWYgKHVzZXNfYXBjc18yNikgICAgICBmbGFncyB8PSBGX0FQQ1MyNjsKKyAgICBpZiAoc3VwcG9ydF9pbnRlcndvcmspIGZsYWdzIHw9IEZfSU5URVJXT1JLOworICAgIGlmICh1c2VzX2FwY3NfZmxvYXQpICAgZmxhZ3MgfD0gRl9BUENTX0ZMT0FUOworICAgIGlmIChwaWNfY29kZSkgICAgICAgICAgZmxhZ3MgfD0gRl9QSUM7CisKKyAgICBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKHN0ZG91dHB1dCwgZmxhZ3MpOworICB9CisjZW5kaWYKKyAgCisgIHsKKyAgICB1bnNpZ25lZCBtYWNoOworICAgIAorICAgIC8qIFJlY29yZCB0aGUgQ1BVIHR5cGUgYXMgd2VsbCAqLworICAgIHN3aXRjaCAoY3B1X3ZhcmlhbnQgJiBBUk1fQ1BVX01BU0spCisgICAgICB7CisgICAgICBjYXNlIEFSTV8yOgorCW1hY2ggPSBiZmRfbWFjaF9hcm1fMjsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgQVJNXzM6IC8qIGFsc28gQVJNXzI1MCAqLworCW1hY2ggPSBiZmRfbWFjaF9hcm1fMmE7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIEFSTV82IHwgQVJNXzMgfCBBUk1fMjoJLyogQWN0dWFsbHkgbm8gQ1BVIHR5cGUgZGVmaW5lZCAqLworCW1hY2ggPSBiZmRfbWFjaF9hcm1fNDsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgQVJNXzc6IAkJCS8qIGFsc28gQVJNXzYgKi8KKwltYWNoID0gYmZkX21hY2hfYXJtXzM7CisJYnJlYWs7CisgICAgICB9CisKKyAgICAvKiBDYXRjaCBzcGVjaWFsIGNhc2VzICovCisgICAgaWYgKGNwdV92YXJpYW50ICE9IChGUFVfREVGQVVMVCB8IENQVV9ERUZBVUxUKSkKKyAgICAgIHsKKwlpZiAoY3B1X3ZhcmlhbnQgJiBBUk1fVEhVTUIpCisJICBtYWNoID0gYmZkX21hY2hfYXJtXzRUOworCWVsc2UgaWYgKChjcHVfdmFyaWFudCAmIEFSTV9BUkNIdjQpID09IEFSTV9BUkNIdjQpCisJICBtYWNoID0gYmZkX21hY2hfYXJtXzQ7CisJZWxzZSBpZiAoY3B1X3ZhcmlhbnQgJiBBUk1fTE9OR01VTCkKKwkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fM007CisgICAgICB9CisJCisgICAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2gpOworICB9Cit9CisKKy8qIFR1cm4gYW4gaW50ZWdlciBvZiBuIGJ5dGVzIChpbiB2YWwpIGludG8gYSBzdHJlYW0gb2YgYnl0ZXMgYXBwcm9wcmlhdGUKKyAgIGZvciB1c2UgaW4gdGhlIGEub3V0IGZpbGUsIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSBidWYuCisgICBUaGlzIGtub3dzIGFib3V0IHRoZSBlbmRpYW4tbmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUgYW5kIGRvZXMKKyAgIFRIRSBSSUdIVCBUSElORywgd2hhdGV2ZXIgaXQgaXMuICBQb3NzaWJsZSB2YWx1ZXMgZm9yIG4gYXJlIDEgKGJ5dGUpCisgICAyIChzaG9ydCkgYW5kIDQgKGxvbmcpICBGbG9hdGluZyBudW1iZXJzIGFyZSBwdXQgb3V0IGFzIGEgc2VyaWVzIG9mCisgICBMSVRUTEVOVU1TIChzaG9ydHMsIGhlcmUgYXQgbGVhc3QpCisgICAqLwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKKyAgICAgY2hhciAqIGJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50ICAgIG47Cit7CisgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKyAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7CisgIGVsc2UKKyAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Cit9CisKK3N0YXRpYyB2YWx1ZVQgCittZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgbikKKyAgICAgY2hhciAqIGJ1ZjsKKyAgICAgaW50IG47Cit7CisgIHZhbHVlVCByZXN1bHQgPSAwOworICB1bnNpZ25lZCBjaGFyICogd2hlcmUgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CisKKyAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorICAgIHsKKyAgICAgIHdoaWxlIChuLS0pCisJeworCSAgcmVzdWx0IDw8PSA4OworCSAgcmVzdWx0IHw9ICgqd2hlcmUrKyAmIDI1NSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlIChuLS0pCisJeworCSAgcmVzdWx0IDw8PSA4OworCSAgcmVzdWx0IHw9ICh3aGVyZVtuXSAmIDI1NSk7CisJfQorICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKKyAgIG9mIHR5cGUgVFlQRSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKKyAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKKyAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgorCisgICBOb3RlIHRoYXQgZnAgY29uc3RhbnRzIGFyZW4ndCByZXByZXNlbnQgaW4gdGhlIG5vcm1hbCB3YXkgb24gdGhlIEFSTS4KKyAgIEluIGJpZyBlbmRpYW4gbW9kZSwgdGhpbmdzIGFyZSBhcyBleHBlY3RlZC4gIEhvd2V2ZXIsIGluIGxpdHRsZSBlbmRpYW4KKyAgIG1vZGUgZnAgY29uc3RhbnRzIGFyZSBiaWctZW5kaWFuIHdvcmQtd2lzZSwgYW5kIGxpdHRsZS1lbmRpYW4gYnl0ZS13aXNlCisgICB3aXRoaW4gdGhlIHdvcmRzLiAgRm9yIGV4YW1wbGUsIChkb3VibGUpIDEuMSBpbiBiaWcgZW5kaWFuIG1vZGUgaXMKKyAgIHRoZSBieXRlIHNlcXVlbmNlIDNmIGYxIDk5IDk5IDk5IDk5IDk5IDlhLCBhbmQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlIGlzCisgICB0aGUgYnl0ZSBzZXF1ZW5jZSA5OSA5OSBmMSAzZiA5YSA5OSA5OSA5OS4KKworICAgPz8/IFRoZSBmb3JtYXQgb2YgMTIgYnl0ZSBmbG9hdHMgaXMgdW5jZXJ0YWluIGFjY29yZGluZyB0byBnY2MncyBhcm0uaC4gICovCisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgICB0eXBlOworICAgICBjaGFyICogbGl0UDsKKyAgICAgaW50ICogIHNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBjaGFyICp0OworICBpbnQgaTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgIGNhc2UgJ3MnOgorICAgIGNhc2UgJ1MnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOworICAgIH0KKworICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKyAgKnNpemVQID0gcHJlYyAqIDI7CisKKyAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCisJeworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7CisJICBsaXRQICs9IDI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZvciBhIDQgYnl0ZSBmbG9hdCB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaW4gYHdvcmRzJyBpcyAxIDAuICBGb3IgYW4KKwkgOCBieXRlIGZsb2F0IHRoZSBvcmRlciBpcyAxIDAgMyAyLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpICs9IDIpCisJeworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpICsgMV0sIDIpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQICsgMiwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworCSAgbGl0UCArPSA0OworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBrbm93bGVkZ2Ugb2YgdGhlIFBDJ3MgcGlwZWxpbmUgb2Zmc2V0IGlzIGJ1aWx0IGludG8gdGhlIHJlbG9jcworICAgZm9yIHRoZSBFTEYgcG9ydCBhbmQgaW50byB0aGUgaW5zbnMgdGhlbXNlbHZlcyBmb3IgdGhlIENPRkYgcG9ydC4gICovCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICogZml4UDsKK3sKKyAgaWYgKCAgIGZpeFAtPmZ4X2FkZHN5CisgICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KKyAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIAorICBpZiAoZml4UC0+ZnhfcGNyZWwgJiYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCkpCisgICAgeworICAgICAgLyogUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBvbiB0aGUgVGh1bWIgaXMgc2xpZ2h0bHkgb2RkCisJIGFzIHRoZSBib3R0b20gdHdvIGJpdHMgb2YgdGhlIFBDIGFyZSBmb3JjZWQgdG8gemVybworCSBmb3IgdGhlIGNhbGN1bGF0aW9uICovCisgICAgICByZXR1cm4gKGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcykgJiB+MzsKKyAgICB9CisgIAorICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworfQorCisvKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1QgICBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyNpZmRlZiBPQkpfRUxGCisgIC8qIERvbid0IGFsaWduIHRoZSBkd2FyZjIgZGVidWcgc2VjdGlvbnMgKi8KKyAgaWYgKCFzdHJuY21wIChzZWdtZW50LT5uYW1lLCAiLmRlYnVnIiwgNSkpCisgICAgcmV0dXJuIHNpemU7CisjZW5kaWYKKyAgLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDQgKi8KKyAgcmV0dXJuIChzaXplICsgMykgJiB+MzsKK30KKworLyogVW5kZXIgRUxGIHdlIG5lZWQgdG8gZGVmYXVsdCBfR0xPQkFMX09GRlNFVF9UQUJMRS4gIE90aGVyd2lzZSAKKyAgIHdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgICAgY2hhciAqIG5hbWU7Cit7CisjaWZkZWYgT0JKX0VMRgorICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnRycKKyAgICAgICYmIHN0cmVxIChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpKQorICAgIHsKKyAgICAgIGlmICghR09UX3N5bWJvbCkKKwl7CisJICBpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpKQorCSAgICBhc19iYWQgKCJHT1QgYWxyZWFkeSBpbiB0aGUgc3ltYm9sIHRhYmxlIik7CisJICAKKwkgIEdPVF9zeW1ib2wgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKKwkJCQkgICAodmFsdWVUKTAsICYgemVyb19hZGRyZXNzX2ZyYWcpOworCX0KKyAgICAgIAorICAgICAgcmV0dXJuIEdPVF9zeW1ib2w7CisgICAgfQorI2VuZGlmCisgIAorICByZXR1cm4gMDsKK30KKworLyogYXJtX3JlZ19wYXJzZSAoKSA6PSBpZiBpdCBsb29rcyBsaWtlIGEgcmVnaXN0ZXIsIHJldHVybiBpdHMgdG9rZW4gYW5kIAorICAgYWR2YW5jZSB0aGUgcG9pbnRlci4gKi8KKworc3RhdGljIGludAorYXJtX3JlZ19wYXJzZSAoY2NwKQorICAgICByZWdpc3RlciBjaGFyICoqIGNjcDsKK3sKKyAgY2hhciAqIHN0YXJ0ID0gKiBjY3A7CisgIGNoYXIgICBjOworICBjaGFyICogcDsKKyAgc3RydWN0IHJlZ19lbnRyeSAqIHJlZzsKKworI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAorICBpZiAoKnN0YXJ0ICE9IFJFR0lTVEVSX1BSRUZJWCkKKyAgICByZXR1cm4gRkFJTDsKKyAgcCA9IHN0YXJ0ICsgMTsKKyNlbHNlCisgIHAgPSBzdGFydDsKKyNpZmRlZiBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgKKyAgaWYgKCpwID09IE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCkKKyAgICBwKyssIHN0YXJ0Kys7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoIWlzYWxwaGEgKCpwKSB8fCAhaXNfbmFtZV9iZWdpbm5lciAoKnApKQorICAgIHJldHVybiBGQUlMOworCisgIGMgPSAqcCsrOworICB3aGlsZSAoaXNhbHBoYSAoYykgfHwgaXNkaWdpdCAoYykgfHwgYyA9PSAnXycpCisgICAgYyA9ICpwKys7CisKKyAgKi0tcCA9IDA7CisgIHJlZyA9IChzdHJ1Y3QgcmVnX2VudHJ5ICopIGhhc2hfZmluZCAoYXJtX3JlZ19oc2gsIHN0YXJ0KTsKKyAgKnAgPSBjOworICAKKyAgaWYgKHJlZykKKyAgICB7CisgICAgICAqY2NwID0gcDsKKyAgICAgIHJldHVybiByZWctPm51bWJlcjsKKyAgICB9CisKKyAgcmV0dXJuIEZBSUw7Cit9CisKK3N0YXRpYyBpbnQKK2FybV9wc3JfcGFyc2UgKGNjcCkKKyAgICAgcmVnaXN0ZXIgY2hhciAqKiBjY3A7Cit7CisgIGNoYXIgKiBzdGFydCA9ICogY2NwOworICBjaGFyICAgYzsKKyAgY2hhciAqIHA7CisgIENPTlNUIHN0cnVjdCBhc21fcHNyICogcHNyOworCisgIHAgPSBzdGFydDsKKyAgYyA9ICpwKys7CisgIHdoaWxlIChpc2FscGhhIChjKSB8fCBjID09ICdfJykKKyAgICBjID0gKnArKzsKKworICAqLS1wID0gMDsgIAorICBwc3IgPSAoQ09OU1Qgc3RydWN0IGFzbV9wc3IgKikgaGFzaF9maW5kIChhcm1fcHNyX2hzaCwgc3RhcnQpOworICAqcCA9IGM7CisKKyAgaWYgKHBzcikKKyAgICB7CisgICAgICAqY2NwID0gcDsKKyAgICAgIHJldHVybiBwc3ItPm51bWJlcjsKKyAgICB9CisKKyAgcmV0dXJuIEZBSUw7Cit9CisKK2ludAorbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsLCBzZWcpCisgICAgIGZpeFMgKiAgICAgIGZpeFA7CisgICAgIHZhbHVlVCAqICAgIHZhbDsKKyAgICAgc2VnVCAgICAgICAgc2VnOworeworICBvZmZzZXRUICAgICAgICB2YWx1ZSA9ICogdmFsOworICBvZmZzZXRUICAgICAgICBuZXd2YWw7CisgIHVuc2lnbmVkIGludCAgIG5ld2ltbTsKKyAgdW5zaWduZWQgbG9uZyAgdGVtcDsKKyAgaW50ICAgICAgICAgICAgc2lnbjsKKyAgY2hhciAqICAgICAgICAgYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOworICBhcm1fZml4X2RhdGEgKiBhcm1fZGF0YSA9IChhcm1fZml4X2RhdGEgKikgZml4UC0+dGNfZml4X2RhdGE7CisKKyAgYXNzZXJ0IChmaXhQLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKTsKKworICAvKiBOb3RlIHdoZXRoZXIgdGhpcyB3aWxsIGRlbGV0ZSB0aGUgcmVsb2NhdGlvbi4gICovCisjaWYgMCAvKiBwYXRjaCBmcm9tIFJFYXJuc2hhdyB0byBKRGF2aXMgKGRpc2FibGVkIGZvciB0aGUgbW9tZW50LCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgZnVsbHkpICovCisgIGlmICgoZml4UC0+ZnhfYWRkc3kgPT0gMCB8fCBmaXhQLT5meF9hZGRzeS0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50KQorICAgICAgJiYgIWZpeFAtPmZ4X3BjcmVsKQorI2Vsc2UKKyAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgIWZpeFAtPmZ4X3BjcmVsKQorI2VuZGlmCisgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisKKyAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiB0aGVuIHdlIG5lZWQgdG8gbGVhdmUgaXQgZm9yCisgICAgIHRoZSBsaW5rZXIgdG8gZGVhbCB3aXRoLiAgVW5mb3J0dW5hdGVseSwgbWRfcGNyZWxfZnJvbSBjYW4ndCB0ZWxsLAorICAgICBzbyB3ZSBoYXZlIHRvIHVuZG8gaXQncyBlZmZlY3RzIGhlcmUuICAqLworICBpZiAoZml4UC0+ZnhfcGNyZWwpCisgICAgeworICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKKwkgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCisJICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQorCXsKKwkgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gpCisJICAgIHZhbHVlID0gMDsKKwkgIGVsc2UKKwkgICAgdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7CisJfQorICAgIH0KKworICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KKworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURToKKyAgICAgIG5ld2ltbSA9IHZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsdWUpOworICAgICAgdGVtcCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOworCisgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBmYWlsLCBzZWUgaWYgd2UgY2FuIGZpeCB0aGluZ3MgdXAgYnkKKwkgY2hhbmdpbmcgdGhlIG9wY29kZS4gICovCisgICAgICBpZiAobmV3aW1tID09ICh1bnNpZ25lZCBpbnQpIEZBSUwKKwkgICYmIChuZXdpbW0gPSBuZWdhdGVfZGF0YV9vcCAoJnRlbXAsIHZhbHVlKSkgPT0gKHVuc2lnbmVkIGludCkgRkFJTCkKKwl7CisJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQlfKCJpbnZhbGlkIGNvbnN0YW50ICgleCkgYWZ0ZXIgZml4dXBcbiIpLCB2YWx1ZSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIG5ld2ltbSB8PSAodGVtcCAmIDB4ZmZmZmYwMDApOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsICh2YWx1ZVQpIG5ld2ltbSwgSU5TTl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOgorICAgICAgc2lnbiA9IHZhbHVlID49IDA7CisgICAgICBpZiAoKHZhbHVlID0gdmFsaWRhdGVfb2Zmc2V0X2ltbSAodmFsdWUsIDApKSA9PSBGQUlMKQorICAgICAgICB7CisgICAgICAgICAgYXNfYmFkIChfKCJiYWQgaW1tZWRpYXRlIHZhbHVlIGZvciBvZmZzZXQgKCVkKSIpLCB2YWwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAodmFsdWUgPCAwKQorCXZhbHVlID0gLXZhbHVlOworCisgICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKKyAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMDAwOworICAgICAgbmV3dmFsIHw9IHZhbHVlIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODoKKyAgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0hXTElURVJBTDoKKyAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOworICAgICAgaWYgKCh2YWx1ZSA9IHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAxKSkgPT0gRkFJTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCisJCQlfKCJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyXG4iKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNfYmFkIChfKCJiYWQgaW1tZWRpYXRlIHZhbHVlIGZvciBvZmZzZXQgKCVkKSIpLCB2YWx1ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKHZhbHVlIDwgMCkKKwl2YWx1ZSA9IC12YWx1ZTsKKworICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7CisgICAgICBuZXd2YWwgJj0gMHhmZjdmZjBmMDsKKyAgICAgIG5ld3ZhbCB8PSAoKHZhbHVlID4+IDQpIDw8IDgpIHwgdmFsdWUgJiAweGYgfCAoc2lnbiA/IElOREVYX1VQIDogMCk7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19BUk1fTElURVJBTDoKKyAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOworICAgICAgaWYgKHZhbHVlIDwgMCkKKwl2YWx1ZSA9IC12YWx1ZTsKKworICAgICAgaWYgKCh2YWx1ZSA9IHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAwKSkgPT0gRkFJTCkKKwl7CisJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIAorCQkJXygiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlclxuIikpOworCSAgYnJlYWs7CisJfQorCisgICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKKyAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMDAwOworICAgICAgbmV3dmFsIHw9IHZhbHVlIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTToKKyAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOworICAgICAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMzIKKwkgIHx8ICh2YWx1ZSA9PSAzMiAKKwkgICAgICAmJiAoKChuZXd2YWwgJiAweDYwKSA9PSAwKSB8fCAobmV3dmFsICYgMHg2MCkgPT0gMHg2MCkpKQorCXsKKwkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCV8oInNoaWZ0IGV4cHJlc3Npb24gaXMgdG9vIGxhcmdlIikpOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAodmFsdWUgPT0gMCkKKwluZXd2YWwgJj0gfjB4NjA7CS8qIFNoaWZ0cyBvZiB6ZXJvIG11c3QgYmUgZG9uZSBhcyBsc2wgKi8KKyAgICAgIGVsc2UgaWYgKHZhbHVlID09IDMyKQorCXZhbHVlID0gMDsKKyAgICAgIG5ld3ZhbCAmPSAweGZmZmZmMDdmOworICAgICAgbmV3dmFsIHw9ICh2YWx1ZSAmIDB4MWYpIDw8IDc7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1NXSToKKyAgICAgIGlmIChhcm1fZGF0YS0+dGh1bWJfbW9kZSkKKwl7CisJICBpZiAoKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSkgPiAweGZmKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkgIF8oIkludmFsaWQgc3dpIGV4cHJlc3Npb24iKSk7CisJICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSkgJiAweGZmMDA7CisJICBuZXd2YWwgfD0gdmFsdWU7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHgwMGZmZmZmZikKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCAKKwkJCSAgXygiSW52YWxpZCBzd2kgZXhwcmVzc2lvbiIpKTsKKwkgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpICYgMHhmZjAwMDAwMDsKKwkgIG5ld3ZhbCB8PSB2YWx1ZTsKKwkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBJTlNOX1NJWkUpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX01VTFRJOgorICAgICAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHhmZmZmKQorCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJICAgICAgXygiSW52YWxpZCBleHByZXNzaW9uIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiKSk7CisgICAgICBuZXd2YWwgPSB2YWx1ZSB8IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSDoKKyAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBJTlNOX1NJWkUpOworI2lmZGVmIE9CSl9FTEYKKyAgICAgIG5ld3ZhbCAmPSAweGZmMDAwMDAwOworICAgICAgaWYgKCEgdGFyZ2V0X29hYmkpCisgICAgICAgIHZhbHVlID0gZml4UC0+Znhfb2Zmc2V0OworICAgICAgZWxzZQorI2Vsc2UKKwl2YWx1ZSA9ICh2YWx1ZSA+PiAyKSAmIDB4MDBmZmZmZmY7CisjZW5kaWYKKyAgICAgIHZhbHVlICA9ICh2YWx1ZSArIChuZXd2YWwgJiAweDAwZmZmZmZmKSkgJiAweDAwZmZmZmZmOworICAgICAgbmV3dmFsID0gdmFsdWUgfCAobmV3dmFsICYgMHhmZjAwMDAwMCk7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OiAvKiBjb25kaXRpb25hbCBicmFuY2ggKi8KKyAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKKyAgICAgIHsKKyAgICAgICAgYWRkcmVzc1QgZGlmZiA9IChuZXd2YWwgJiAweGZmKSA8PCAxOworICAgICAgICBpZiAoZGlmZiAmIDB4MTAwKQorICAgICAgICAgZGlmZiB8PSB+MHhmZjsKKworICAgICAgICB2YWx1ZSArPSBkaWZmOworICAgICAgICBpZiAoKHZhbHVlICYgfjB4ZmYpICYmICgodmFsdWUgJiB+MHhmZikgIT0gfjB4ZmYpKQorICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOworICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmZjAwKSB8ICgodmFsdWUgJiAweDFmZikgPj4gMSk7CisgICAgICB9CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI6IC8qIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCisgICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7CisgICAgICB7CisgICAgICAgIGFkZHJlc3NUIGRpZmYgPSAobmV3dmFsICYgMHg3ZmYpIDw8IDE7CisgICAgICAgIGlmIChkaWZmICYgMHg4MDApCisgICAgICAgICBkaWZmIHw9IH4weDdmZjsKKworICAgICAgICB2YWx1ZSArPSBkaWZmOworICAgICAgICBpZiAoKHZhbHVlICYgfjB4N2ZmKSAmJiAoKHZhbHVlICYgfjB4N2ZmKSAhPSB+MHg3ZmYpKQorICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOworICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmODAwKSB8ICgodmFsdWUgJiAweGZmZikgPj4gMSk7CisgICAgICB9CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM6CisgICAgICB7CisgICAgICAgIG9mZnNldFQgbmV3dmFsMjsKKyAgICAgICAgYWRkcmVzc1QgZGlmZjsKKworCW5ld3ZhbCAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7CisgICAgICAgIG5ld3ZhbDIgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiArIFRIVU1CX1NJWkUsIFRIVU1CX1NJWkUpOworICAgICAgICBkaWZmID0gKChuZXd2YWwgJiAweDdmZikgPDwgMTIpIHwgKChuZXd2YWwyICYgMHg3ZmYpIDw8IDEpOworICAgICAgICBpZiAoZGlmZiAmIDB4NDAwMDAwKQorCSAgZGlmZiB8PSB+MHgzZmZmZmY7CisgICAgICAgIHZhbHVlICs9IGRpZmY7CisgICAgICAgIGlmICgodmFsdWUgJiB+MHgzZmZmZmYpICYmICgodmFsdWUgJiB+MHgzZmZmZmYpICE9IH4weDNmZmZmZikpCisJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQlfKCJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIpKTsKKworICAgICAgICBuZXd2YWwgID0gKG5ld3ZhbCAgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4N2ZmZmZmKSA+PiAxMik7CisgICAgICAgIG5ld3ZhbDIgPSAobmV3dmFsMiAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHhmZmYpID4+IDEpOworICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKKyAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYgKyBUSFVNQl9TSVpFLCBuZXd2YWwyLCBUSFVNQl9TSVpFKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfODoKKyAgICAgIGlmIChmaXhQLT5meF9kb25lIHx8IGZpeFAtPmZ4X3BjcmVsKQorCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMSk7CisjaWZkZWYgT0JKX0VMRgorICAgICAgZWxzZSBpZiAoIXRhcmdldF9vYWJpKQorICAgICAgICB7CisgICAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7CisgICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAxKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DXzE2OgorICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCisJbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKKyNpZmRlZiBPQkpfRUxGCisgICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCisgICAgICAgIHsKKyAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKKyAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGJyZWFrOworCisjaWZkZWYgT0JKX0VMRgorICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKKyAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgorCW1kX251bWJlcl90b19jaGFycyAoYnVmLCAwLCA0KTsKKwlicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBCRkRfUkVMT0NfUlZBOgorICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCisJbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKKyNpZmRlZiBPQkpfRUxGCisgICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCisgICAgICAgIHsKKyAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKKyAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIGJyZWFrOworCisjaWZkZWYgT0JKX0VMRgorICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKKyAgICAgIC8qIEl0IGFwcGVhcnMgdGhlIGluc3RydWN0aW9uIGlzIGZ1bGx5IHByZXBhcmVkIGF0IHRoaXMgcG9pbnQuICovCisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVFBDOgorICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU06CisgICAgICBzaWduID0gdmFsdWUgPj0gMDsKKyAgICAgIGlmICh2YWx1ZSA8IC0xMDIzIHx8IHZhbHVlID4gMTAyMyB8fCAodmFsdWUgJiAzKSkKKwlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCSAgICAgIF8oIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiKSk7CisgICAgICBpZiAodmFsdWUgPCAwKQorCXZhbHVlID0gLXZhbHVlOworICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSkgJiAweGZmN2ZmZjAwOworICAgICAgbmV3dmFsIHw9ICh2YWx1ZSA+PiAyKSB8IChzaWduID8gIElOREVYX1VQIDogMCk7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDoKKyAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKKyAgICAgIC8qIEV4YWN0bHkgd2hhdCByYW5nZXMsIGFuZCB3aGVyZSB0aGUgb2Zmc2V0IGlzIGluc2VydGVkIGRlcGVuZHMgb24KKwkgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24sIHdlIGNhbiBlc3RhYmxpc2ggdGhpcyBmcm9tIHRoZSB0b3AgNCBiaXRzICovCisgICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMikKKwl7CisJY2FzZSA0OiAvKiBQQyBsb2FkICovCisJICAvKiBUaHVtYiBQQyBsb2FkcyBhcmUgc29tZXdoYXQgb2RkLCBiaXQgMSBvZiB0aGUgUEMgaXMKKwkgICAgIGZvcmNlZCB0byB6ZXJvIGZvciB0aGVzZSBsb2Fkcywgc28gd2Ugd2lsbCBuZWVkIHRvIHJvdW5kCisJICAgICB1cCB0aGUgb2Zmc2V0IGlmIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzIGlzIG5vdCB3b3JkCisJICAgICBhbGlnbmVkIChzaW5jZSB0aGUgZmluYWwgYWRkcmVzcyBwcm9kdWNlZCBtdXN0IGJlLCBhbmQKKwkgICAgIHdlIGNhbiBvbmx5IGRlc2NyaWJlIHdvcmQtYWxpZ25lZCBpbW1lZGlhdGUgb2Zmc2V0cykuICAqLworCisJICBpZiAoKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSAmIDMpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSk7CisKKwkgIGlmICgodmFsdWUgKyAyKSAmIH4weDNmZSkKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKKworICAgICAgICAgIC8qIFJvdW5kIHVwLCBzaW5jZSBwYyB3aWxsIGJlIHJvdW5kZWQgZG93bi4gICovCisJICBuZXd2YWwgfD0gKHZhbHVlICsgMikgPj4gMjsKKwkgIGJyZWFrOworCisJY2FzZSA5OiAvKiBTUCBsb2FkL3N0b3JlICovCisJICBpZiAodmFsdWUgJiB+MHgzZmMpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgXygiSW52YWxpZCBvZmZzZXQiKSk7CisJICBuZXd2YWwgfD0gdmFsdWUgPj4gMjsKKwkgIGJyZWFrOworCisJY2FzZSA2OiAvKiBXb3JkIGxvYWQvc3RvcmUgKi8KKwkgIGlmICh2YWx1ZSAmIH4weDdjKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOworCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDQ7IC8qIDYgLSAyICovCisJICBicmVhazsKKworCWNhc2UgNzogLyogQnl0ZSBsb2FkL3N0b3JlICovCisJICBpZiAodmFsdWUgJiB+MHgxZikKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKKwkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OworCSAgYnJlYWs7CisKKwljYXNlIDg6IC8qIEhhbGZ3b3JkIGxvYWQvc3RvcmUgKi8KKwkgIGlmICh2YWx1ZSAmIH4weDNlKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOworCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDU7IC8qIDYgLSAxICovCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkiVW5hYmxlIHRvIHByb2Nlc3MgcmVsb2NhdGlvbiBmb3IgdGh1bWIgb3Bjb2RlOiAleCIsIG5ld3ZhbCk7CisJICBicmVhazsKKwl9CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDoKKyAgICAgIC8qIFRoaXMgaXMgYSBjb21wbGljYXRlZCByZWxvY2F0aW9uLCBzaW5jZSB3ZSB1c2UgaXQgZm9yIGFsbCBvZgorICAgICAgICAgdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcmVsb2NhdGlvbnM6CisgICAgICAgICAgICAzYml0IEFERC9TVUIKKyAgICAgICAgICAgIDhiaXQgQUREL1NVQgorICAgICAgICAgICAgOWJpdCBBREQvU1VCIFNQIHdvcmQtYWxpZ25lZAorICAgICAgICAgICAxMGJpdCBBREQgUEMvU1Agd29yZC1hbGlnbmVkCisKKyAgICAgICAgIFRoZSB0eXBlIG9mIGluc3RydWN0aW9uIGJlaW5nIHByb2Nlc3NlZCBpcyBlbmNvZGVkIGluIHRoZQorICAgICAgICAgaW5zdHJ1Y3Rpb24gZmllbGQ6CisgICAgICAgICAgIDB4ODAwMCAgU1VCCisgICAgICAgICAgIDB4MDBGMCAgUmQKKyAgICAgICAgICAgMHgwMDBGICBScworICAgICAgKi8KKyAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKKyAgICAgIHsKKyAgICAgICAgaW50IHJkID0gKG5ld3ZhbCA+PiA0KSAmIDB4ZjsKKyAgICAgICAgaW50IHJzID0gbmV3dmFsICYgMHhmOworICAgICAgICBpbnQgc3VidHJhY3QgPSBuZXd2YWwgJiAweDgwMDA7CisKKyAgICAgICAgaWYgKHJkID09IFJFR19TUCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUgJiB+MHgxZmMpCisgICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc3RhY2sgYWRkcmVzcyBjYWxjdWxhdGlvbiIpKTsKKyAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX1NUIDogVF9PUENPREVfQUREX1NUOworICAgICAgICAgICAgbmV3dmFsIHw9IHZhbHVlID4+IDI7CisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChycyA9PSBSRUdfUEMgfHwgcnMgPT0gUkVHX1NQKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdWJ0cmFjdCB8fAorICAgICAgICAgICAgICAgIHZhbHVlICYgfjB4M2ZjKQorICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKHZhbHVlID0gMHglMDhYKSIpLCB2YWx1ZSk7CisgICAgICAgICAgICBuZXd2YWwgPSAocnMgPT0gUkVHX1BDID8gVF9PUENPREVfQUREX1BDIDogVF9PUENPREVfQUREX1NQKTsKKyAgICAgICAgICAgIG5ld3ZhbCB8PSByZCA8PCA4OworICAgICAgICAgICAgbmV3dmFsIHw9IHZhbHVlID4+IDI7CisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChycyA9PSByZCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUgJiB+MHhmZikKKyAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgOGJpdCBpbW1lZGlhdGUiKSk7CisgICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JOCA6IFRfT1BDT0RFX0FERF9JODsKKyAgICAgICAgICAgIG5ld3ZhbCB8PSAocmQgPDwgOCkgfCB2YWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUgJiB+MHg3KQorICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCAzYml0IGltbWVkaWF0ZSIpKTsKKyAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX0kzIDogVF9PUENPREVfQUREX0kzOworICAgICAgICAgICAgbmV3dmFsIHw9IHJkIHwgKHJzIDw8IDMpIHwgKHZhbHVlIDw8IDYpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTToKKyAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKKyAgICAgIHN3aXRjaCAobmV3dmFsID4+IDExKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwNDogLyogOGJpdCBpbW1lZGlhdGUgTU9WICovCisgICAgICAgIGNhc2UgMHgwNTogLyogOGJpdCBpbW1lZGlhdGUgQ01QICovCisgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDI1NSkKKyAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGU6ICVkIGlzIHRvbyBsYXJnZSIpLCB2YWx1ZSk7CisgICAgICAgICAgbmV3dmFsIHw9IHZhbHVlOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOgorICAgICAgLyogNWJpdCBzaGlmdCB2YWx1ZSAoMC4uMzEpICovCisgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMzEpCisJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkgICAgICBfKCJJbGxlZ2FsIFRodW1iIHNoaWZ0IHZhbHVlOiAlZCIpLCB2YWx1ZSk7CisgICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSkgJiAweGYwM2Y7CisgICAgICBuZXd2YWwgfD0gdmFsdWUgPDwgNjsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6CisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJICAgIF8oIkJhZCByZWxvY2F0aW9uIGZpeHVwIHR5cGUgKCVkKVxuIiksIGZpeFAtPmZ4X3JfdHlwZSk7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisvKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKKyAgIGZvcm1hdC4gICovCithcmVsZW50ICoKK3RjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKKyAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOworICAgICBmaXhTICogZml4cDsKK3sKKyAgYXJlbGVudCAqIHJlbG9jOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKKworICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCisgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKyAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisKKyAgLyogQEAgV2h5IGZ4X2FkZG51bWJlciBzb21ldGltZXMgYW5kIGZ4X29mZnNldCBvdGhlciB0aW1lcz8gICovCisjaWZuZGVmIE9CSl9FTEYKKyAgaWYgKGZpeHAtPmZ4X3BjcmVsID09IDApCisgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKKyAgZWxzZQorICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQgPSByZWxvYy0+YWRkcmVzczsKKyNlbHNlICAvKiBPQkpfRUxGICovCisgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7CisjZW5kaWYKKworICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfODoKKyAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKKwl7CisJICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7CisJICBicmVhazsKKwl9CisKKyAgICBjYXNlIEJGRF9SRUxPQ18xNjoKKyAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKKwl7CisJICBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOworCSAgYnJlYWs7CisJfQorCisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgICBpZiAoZml4cC0+ZnhfcGNyZWwpCisJeworCSAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKKwkgIGJyZWFrOworCX0KKworICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6CisgICAgY2FzZSBCRkRfUkVMT0NfUlZBOiAgICAgIAorICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk6CisgICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI6CisgICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM6CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgorICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6CisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0hXTElURVJBTDoKKyAgICAgIC8qIElmIHRoaXMgaXMgY2FsbGVkIHRoZW4gdGhlIGEgbGl0ZXJhbCBoYXMgYmVlbiByZWZlcmVuY2VkIGFjcm9zcworCSBhIHNlY3Rpb24gYm91bmRyeSAtIHBvc3NpYmx5IGR1ZSB0byBhbiBpbXBsaWNpdCBkdW1wICovCisgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCSAgICBfKCJMaXRlcmFsIHJlZmVyZW5jZWQgYWNyb3NzIHNlY3Rpb24gYm91bmRyeSAoSW1wbGljaXQgZHVtcD8pIikpOworICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UUEM6CisgICAgICBhc3NlcnQgKGZpeHAtPmZ4X3BjcmVsICE9IDApOworICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKKyAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7CisgICAgICBicmVhazsKKworI2lmZGVmIE9CSl9FTEYKKyAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVE9GRjoKKyAgICBjYXNlIEJGRF9SRUxPQ19BUk1fUExUMzI6CisgICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKKyAgICBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURToKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJICAgIF8oIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoSU1NRURJQVRFKSIpLAorCQkgICAgZml4cC0+Znhfcl90eXBlKTsKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06CisgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCSAgICBfKCJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKE9GRlNFVF9JTU0pIiksCisJCSAgICBmaXhwLT5meF9yX3R5cGUpOworICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBkZWZhdWx0OgorICAgICAgeworCWNoYXIgKiB0eXBlOworCXN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQorCSAgeworCSAgY2FzZSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURTogICAgdHlwZSA9ICJJTU1FRElBVEUiOyAgICBicmVhazsKKwkgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOiAgIHR5cGUgPSAiT0ZGU0VUX0lNTSI7ICAgYnJlYWs7CisJICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg6ICB0eXBlID0gIk9GRlNFVF9JTU04IjsgIGJyZWFrOworCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1NISUZUX0lNTTogICAgdHlwZSA9ICJTSElGVF9JTU0iOyAgICBicmVhazsKKwkgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6ICAgICAgICAgIHR5cGUgPSAiU1dJIjsgICAgICAgICAgYnJlYWs7CisJICBjYXNlIEJGRF9SRUxPQ19BUk1fTVVMVEk6ICAgICAgICB0eXBlID0gIk1VTFRJIjsgICAgICAgIGJyZWFrOworCSAgY2FzZSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU06ICAgdHlwZSA9ICJDUF9PRkZfSU1NIjsgICBicmVhazsKKwkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9BREQ6ICAgIHR5cGUgPSAiVEhVTUJfQUREIjsgICAgYnJlYWs7CisJICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQ6ICB0eXBlID0gIlRIVU1CX1NISUZUIjsgIGJyZWFrOworCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTTogICAgdHlwZSA9ICJUSFVNQl9JTU0iOyAgICBicmVhazsKKwkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ6IHR5cGUgPSAiVEhVTUJfT0ZGU0VUIjsgYnJlYWs7CisJICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIjx1bmtub3duPiI7ICAgIGJyZWFrOworCSAgfQorCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJICAgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCAoJWQpIiksCisJCSAgICAgIHR5cGUsIGZpeHAtPmZ4X3BjcmVsKTsKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBPQkpfRUxGCisgaWYgKGNvZGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMCisgICAgICYmIEdPVF9zeW1ib2wKKyAgICAgJiYgZml4cC0+ZnhfYWRkc3kgPT0gR09UX3N5bWJvbCkKKyAgIGNvZGUgPSBCRkRfUkVMT0NfQVJNX0dPVFBDOworI2VuZGlmCisgICAKKyAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOworCisgIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCSAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCisJCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHJldHVybiByZWxvYzsKK30KKworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCisgICAgIGZyYWdTICogZnJhZ1A7CisgICAgIHNlZ1QgICAgc2VndHlwZTsKK3sKKyAgYXNfZmF0YWwgKF8oIm1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorb3V0cHV0X2luc3QgKHN0cikKKyAgICAgY2hhciAqIHN0cjsKK3sKKyAgY2hhciAqIHRvID0gTlVMTDsKKyAgICAKKyAgaWYgKGluc3QuZXJyb3IpCisgICAgeworICAgICAgYXNfYmFkIChpbnN0LmVycm9yKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdG8gPSBmcmFnX21vcmUgKGluc3Quc2l6ZSk7CisgIGlmICh0aHVtYl9tb2RlICYmIChpbnN0LnNpemUgPiBUSFVNQl9TSVpFKSkKKyAgICB7CisgICAgICBhc3NlcnQgKGluc3Quc2l6ZSA9PSAoMiAqIFRIVU1CX1NJWkUpKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24gPj4gMTYsIFRIVU1CX1NJWkUpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIDIsIGluc3QuaW5zdHJ1Y3Rpb24sIFRIVU1CX1NJWkUpOworICAgIH0KKyAgZWxzZQorICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24sIGluc3Quc2l6ZSk7CisKKyAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKKyAgICBmaXhfbmV3X2FybSAoZnJhZ19ub3csIHRvIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCSBpbnN0LnNpemUsICYgaW5zdC5yZWxvYy5leHAsIGluc3QucmVsb2MucGNfcmVsLAorCQkgaW5zdC5yZWxvYy50eXBlKTsKKworICByZXR1cm47Cit9CisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIGNoYXIgICBjOworICBjaGFyICogcDsKKyAgY2hhciAqIHE7CisgIGNoYXIgKiBzdGFydDsKKworICAvKiBBbGlnbiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgIFRoaXMgbWF5IG5vdCBiZSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gYnV0IC4uLiAqLworICAvKiBhcm1fYWxpZ24gKDIsIDApOyAqLworICBsaXN0aW5nX3ByZXZfbGluZSAoKTsgLyogRGVmaW5lZCBpbiBsaXN0aW5nLmggKi8KKworICAvKiBBbGlnbiB0aGUgcHJldmlvdXMgbGFiZWwgaWYgbmVlZGVkLiAgKi8KKyAgaWYgKGxhc3RfbGFiZWxfc2VlbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxhc3RfbGFiZWxfc2Vlbi0+c3lfZnJhZyA9IGZyYWdfbm93OworICAgICAgU19TRVRfVkFMVUUgKGxhc3RfbGFiZWxfc2VlbiwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKKyAgICAgIFNfU0VUX1NFR01FTlQgKGxhc3RfbGFiZWxfc2Vlbiwgbm93X3NlZyk7CisgICAgfQorCisgIG1lbXNldCAoJmluc3QsICdcMCcsIHNpemVvZiAoaW5zdCkpOworICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKKworICBpZiAoKnN0ciA9PSAnICcpCisgICAgc3RyKys7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisgICAgCisgIC8qIFNjYW4gdXAgdG8gdGhlIGVuZCBvZiB0aGUgb3AtY29kZSwgd2hpY2ggbXVzdCBlbmQgaW4gd2hpdGUgc3BhY2Ugb3IKKyAgICAgZW5kIG9mIHN0cmluZy4gICovCisgIGZvciAoc3RhcnQgPSBwID0gc3RyOyAqcCAhPSAnXDAnOyBwKyspCisgICAgaWYgKCpwID09ICcgJykKKyAgICAgIGJyZWFrOworICAgIAorICBpZiAocCA9PSBzdHIpCisgICAgeworICAgICAgYXNfYmFkIChfKCJObyBvcGVyYXRvciAtLSBzdGF0ZW1lbnQgYCVzJ1xuIiksIHN0cik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh0aHVtYl9tb2RlKQorICAgIHsKKyAgICAgIENPTlNUIHN0cnVjdCB0aHVtYl9vcGNvZGUgKm9wY29kZTsKKworICAgICAgYyA9ICpwOworICAgICAgKnAgPSAnXDAnOworICAgICAgb3Bjb2RlID0gKENPTlNUIHN0cnVjdCB0aHVtYl9vcGNvZGUgKikgaGFzaF9maW5kIChhcm1fdG9wc19oc2gsIHN0cik7CisgICAgICAqcCA9IGM7CisgICAgICBpZiAob3Bjb2RlKQorCXsKKwkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBvcGNvZGUtPnZhbHVlOworCSAgaW5zdC5zaXplID0gb3Bjb2RlLT5zaXplOworCSAgKCpvcGNvZGUtPnBhcm1zKShwKTsKKwkgIG91dHB1dF9pbnN0IChzdGFydCk7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIENPTlNUIHN0cnVjdCBhc21fb3Bjb2RlICpvcGNvZGU7CisKKyAgICAgIGluc3Quc2l6ZSA9IElOU05fU0laRTsKKyAgICAgIC8qIHAgbm93IHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBvcGNvZGUsIHByb2JhYmx5IHdoaXRlIHNwYWNlLCBidXQgd2UKKwkgaGF2ZSB0byBicmVhayB0aGUgb3Bjb2RlIHVwIGluIGNhc2UgaXQgY29udGFpbnMgY29uZGlvbmFscyBhbmQgZmxhZ3M7CisJIGtlZXAgdHJ5aW5nIHdpdGggcHJvZ3Jlc3NpdmVseSBzbWFsbGVyIGJhc2ljIGluc3RydWN0aW9ucyB1bnRpbCBvbmUKKwkgbWF0Y2hlcywgb3Igd2UgcnVuIG91dCBvZiBvcGNvZGUuICovCisgICAgICBxID0gKHAgLSBzdHIgPiBMT05HRVNUX0lOU1QpID8gc3RyICsgTE9OR0VTVF9JTlNUIDogcDsKKyAgICAgIGZvciAoOyBxICE9IHN0cjsgcS0tKQorCXsKKwkgIGMgPSAqcTsKKwkgICpxID0gJ1wwJzsKKwkgIG9wY29kZSA9IChDT05TVCBzdHJ1Y3QgYXNtX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV9vcHNfaHNoLCBzdHIpOworCSAgKnEgPSBjOworCSAgaWYgKG9wY29kZSAmJiBvcGNvZGUtPnRlbXBsYXRlKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyBmbGFnX2JpdHMgPSAwOworCSAgICAgIGNoYXIgKnI7CisKKwkgICAgICAvKiBDaGVjayB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIGZvciB0aGlzIENQVSAqLworCSAgICAgIGlmICgob3Bjb2RlLT52YXJpYW50cyAmIGNwdV92YXJpYW50KSA9PSAwKQorCQlnb3RvIHRyeV9zaG9ydGVyOworCisJICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IG9wY29kZS0+dmFsdWU7CisJICAgICAgaWYgKHEgPT0gcCkJCS8qIEp1c3QgYSBzaW1wbGUgb3Bjb2RlICovCisJCXsKKwkJICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCAhPSAwKQorCQkgICAgYXNfYmFkIChfKCJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIiksIHN0ciwKKwkJCSAgICBvcGNvZGUtPmNvbXBfc3VmZml4KTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORF9BTFdBWVM7CisJCSAgICAgICgqb3Bjb2RlLT5wYXJtcykocSwgMCk7CisJCSAgICB9CisJCSAgb3V0cHV0X2luc3QgKHN0YXJ0KTsKKwkJICByZXR1cm47CisJCX0KKworCSAgICAgIC8qIE5vdyBjaGVjayBmb3IgYSBjb25kaXRpb25hbCAqLworCSAgICAgIHIgPSBxOworCSAgICAgIGlmIChwIC0gciA+PSAyKQorCQl7CisJCSAgQ09OU1Qgc3RydWN0IGFzbV9jb25kICpjb25kOworCQkgIGNoYXIgZCA9ICoociArIDIpOworCisJCSAgKihyICsgMikgPSAnXDAnOworCQkgIGNvbmQgPSAoQ09OU1Qgc3RydWN0IGFzbV9jb25kICopIGhhc2hfZmluZCAoYXJtX2NvbmRfaHNoLCByKTsKKwkJICAqKHIgKyAyKSA9IGQ7CisJCSAgaWYgKGNvbmQpCisJCSAgICB7CisJCSAgICAgIGlmIChjb25kLT52YWx1ZSA9PSAweGYwMDAwMDAwKQorCQkJYXNfdHNrdHNrICgKK18oIldhcm5pbmc6IFVzZSBvZiB0aGUgJ252JyBjb25kaXRpb25hbCBpcyBkZXByZWNhdGVkXG4iKSk7CisKKwkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBjb25kLT52YWx1ZTsKKwkJICAgICAgciArPSAyOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORF9BTFdBWVM7CisJCX0KKwkgICAgICBlbHNlCisJCWluc3QuaW5zdHJ1Y3Rpb24gfD0gQ09ORF9BTFdBWVM7CisKKwkgICAgICAvKiBpZiB0aGVyZSBpcyBhIGNvbXB1bHNvcnkgc3VmZml4LCBpdCBzaG91bGQgY29tZSBoZXJlLCBiZWZvcmUKKwkJIGFueSBvcHRpb25hbCBmbGFncy4gKi8KKwkgICAgICBpZiAob3Bjb2RlLT5jb21wX3N1ZmZpeCkKKwkJeworCQkgIENPTlNUIGNoYXIgKnMgPSBvcGNvZGUtPmNvbXBfc3VmZml4OworCisJCSAgd2hpbGUgKCpzKQorCQkgICAgeworCQkgICAgICBpbnN0LnN1ZmZpeCsrOworCQkgICAgICBpZiAoKnIgPT0gKnMpCisJCQlicmVhazsKKwkJICAgICAgcysrOworCQkgICAgfQorCisJCSAgaWYgKCpzID09ICdcMCcpCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoXygiT3Bjb2RlIGAlcycgbXVzdCBoYXZlIHN1ZmZpeCBmcm9tIDwlcz5cbiIpLCBzdHIsCisJCQkgICAgICBvcGNvZGUtPmNvbXBfc3VmZml4KTsKKwkJICAgICAgcmV0dXJuOworCQkgICAgfQorCisJCSAgcisrOworCQl9CisKKwkgICAgICAvKiBUaGUgcmVtYWluZGVyLCBpZiBhbnkgc2hvdWxkIG5vdyBiZSBmbGFncyBmb3IgdGhlIGluc3RydWN0aW9uOworCQkgU2NhbiB0aGVzZSBjaGVja2luZyBlYWNoIG9uZSBmb3VuZCB3aXRoIHRoZSBvcGNvZGUuICAqLworCSAgICAgIGlmIChyICE9IHApCisJCXsKKwkJICBjaGFyIGQ7CisJCSAgQ09OU1Qgc3RydWN0IGFzbV9mbGcgKmZsYWcgPSBvcGNvZGUtPmZsYWdzOworCisJCSAgaWYgKGZsYWcpCisJCSAgICB7CisJCSAgICAgIGludCBmbGFnbm87CisKKwkJICAgICAgZCA9ICpwOworCQkgICAgICAqcCA9ICdcMCc7CisKKwkJICAgICAgZm9yIChmbGFnbm8gPSAwOyBmbGFnW2ZsYWdub10udGVtcGxhdGU7IGZsYWdubysrKQorCQkJeworCQkJICBpZiAoc3RyZXEgKHIsIGZsYWdbZmxhZ25vXS50ZW1wbGF0ZSkpCisJCQkgICAgeworCQkJICAgICAgZmxhZ19iaXRzIHw9IGZsYWdbZmxhZ25vXS5zZXRfYml0czsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIH0KKwkJCX0KKworCQkgICAgICAqcCA9IGQ7CisJCSAgICAgIGlmICghIGZsYWdbZmxhZ25vXS50ZW1wbGF0ZSkKKwkJCWdvdG8gdHJ5X3Nob3J0ZXI7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgZ290byB0cnlfc2hvcnRlcjsKKwkJfQorCisJICAgICAgKCpvcGNvZGUtPnBhcm1zKSAocCwgZmxhZ19iaXRzKTsKKwkgICAgICBvdXRwdXRfaW5zdCAoc3RhcnQpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJdHJ5X3Nob3J0ZXI6CisJICA7CisJfQorICAgIH0KKworICAvKiBJdCB3YXNuJ3QgYW4gaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIGFsaWFzIG9mIHRoZSBmb3JtCisgICAgIGFsaWFzIC5yZXEgcmVnCisgICAgICovCisgIHEgPSBwOworICB3aGlsZSAoKnEgPT0gJyAnKQorICAgIHErKzsKKworICBjID0gKnA7CisgICpwID0gJ1wwJzsKKyAgICAKKyAgaWYgKCpxICYmICFzdHJuY21wIChxLCAiLnJlcSAiLCA0KSkKKyAgICB7CisgICAgICBpbnQgICAgcmVnOworICAgICAgY2hhciAqIGNvcHlfb2Zfc3RyID0gc3RyOworICAgICAgY2hhciAqIHI7CisgICAgICAKKyAgICAgIHEgKz0gNDsKKyAgICAgIHdoaWxlICgqcSA9PSAnICcpCisJcSsrOworCisgICAgICBmb3IgKHIgPSBxOyAqciAhPSAnXDAnOyByKyspCisJaWYgKCpyID09ICcgJykKKwkgIGJyZWFrOworICAgICAgCisgICAgICBpZiAociAhPSBxKQorCXsKKwkgIGludCByZWdudW07CisJICBjaGFyIGQgPSAqcjsKKworCSAgKnIgPSAnXDAnOworCSAgcmVnbnVtID0gYXJtX3JlZ19wYXJzZSAoJiBxKTsKKwkgICpyID0gZDsKKworCSAgcmVnID0gYXJtX3JlZ19wYXJzZSAoJiBzdHIpOworCSAgCisJICBpZiAocmVnID09IEZBSUwpCisJICAgIHsKKwkgICAgICBpZiAocmVnbnVtICE9IEZBSUwpCisJCXsKKwkJICBpbnNlcnRfcmVnX2FsaWFzIChzdHIsIHJlZ251bSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhc193YXJuIChfKCJyZWdpc3RlciAnJXMnIGRvZXMgbm90IGV4aXN0XG4iKSwgcSk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAocmVnbnVtICE9IEZBSUwpCisJICAgIHsKKwkgICAgICBpZiAocmVnICE9IHJlZ251bSkKKwkJYXNfd2FybiAoXygiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcyciKSwgY29weV9vZl9zdHIgKTsKKwkgICAgICAKKwkgICAgICAvKiBEbyBub3Qgd2FybiBhYnBvdXQgcmVkZWZpbml0aW9ucyB0byB0aGUgc2FtZSBhbGlhcy4gICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgYXNfd2FybiAoXygiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcycgdG8gbm9uLWV4aXN0YW50IHJlZ2lzdGVyICclcyciKSwKKwkJICAgICBjb3B5X29mX3N0ciwgcSk7CisJfQorICAgICAgZWxzZQorCWFzX3dhcm4gKF8oImlnbm9yaW5nIGluY29tcGxldGUgLnJlcSBwc2V1c28gb3AiKSk7CisgICAgICAKKyAgICAgICpwID0gYzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKnAgPSBjOworICBhc19iYWQgKF8oImJhZCBpbnN0cnVjdGlvbiBgJXMnIiksIHN0YXJ0KTsKK30KKworLyoKKyAqIG1kX3BhcnNlX29wdGlvbgorICogICAgSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KKyAqICAgIFNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIFRoZXNlIGFyZToKKyAqICAgIENwdSB2YXJpYW50cywgdGhlIGFybSBwYXJ0IGlzIG9wdGlvbmFsOgorICogICAgICAgICAgICAtbVthcm1dMSAgICAgICAgICAgICAgICBDdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KKyAqICAgICAgICAgICAgLW1bYXJtXTIsIC1tW2FybV0yNTAgICAgQXJtIDIgYW5kIEFybSAyNTAgcHJvY2Vzc29yCisgKiAgICAgICAgICAgIC1tW2FybV0zICAgICAgICAgICAgICAgIEFybSAzIHByb2Nlc3NvcgorICogICAgICAgICAgICAtbVthcm1dNlt4eF0sICAgICAgICAgICBBcm0gNiBwcm9jZXNzb3JzCisgKiAgICAgICAgICAgIC1tW2FybV03W3h4XVt0XVtbZF1tXSAgIEFybSA3IHByb2Nlc3NvcnMKKyAqICAgICAgICAgICAgLW1zdHJvbmdhcm1bMTEwXQkgICAgICBBcm0gOCBwcm9jZXNzb3JzCisgKiAgICAgICAgICAgIC1tYWxsICAgICAgICAgICAgICAgICAgIEFsbCAoZXhjZXB0IHRoZSBBUk0xKQorICogICAgRlAgdmFyaWFudHM6CisgKiAgICAgICAgICAgIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgIEZQQTEwIGFuZCAxMSBjby1wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCisgKiAgICAgICAgICAgIC1tZnBlLW9sZCAgICAgICAgICAgICAgIChObyBmbG9hdCBsb2FkL3N0b3JlIG11bHRpcGxlcykKKyAqICAgICAgICAgICAgLW1uby1mcHUgICAgICAgICAgICAgICAgRGlzYWJsZSBhbGwgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zCisgKiAgICBSdW4tdGltZSBlbmRpYW4gc2VsZWN0aW9uOgorICogICAgICAgICAgICAtRUIgICAgICAgICAgICAgICAgICAgICBiaWcgZW5kaWFuIGNwdQorICogICAgICAgICAgICAtRUwgICAgICAgICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuIGNwdQorICogICAgQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkOgorICoJICAgICAgLW1hcGNzLTMyCQkgICAgICAzMiBiaXQgQVBDUworICoJICAgICAgLW1hcGNzLTI2CQkgICAgICAyNiBiaXQgQVBDUworICoJICAgICAgLW1hcGNzLWZsb2F0CSAgICAgIFBhc3MgZmxvYXRzIGluIGZsb2F0IHJlZ3MKKyAqCSAgICAgIC1tYXBjcy1yZWVudHJhbnQgICAgICAgIFBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUKKyAqICAgICAgICAgICAgLW10aHVtYi1pbnRlcndvcmsgICAgICAgQ29kZSBzdXBwb3J0cyBBcm0vVGh1bWIgaW50ZXJ3b3JraW5nCisgKiAgICAgICAgICAgIC1tb2FiaSAgICAgICAgICAgICAgICAgIE9sZCBFTEYgQUJJCisgKi8KKworQ09OU1QgY2hhciAqIG1kX3Nob3J0b3B0cyA9ICJtOmsiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KK3sKKyNpZmRlZiBBUk1fQklfRU5ESUFOCisjZGVmaW5lIE9QVElPTl9FQiAoT1BUSU9OX01EX0JBU0UgKyAwKQorICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCisjZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxKQorICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCisjaWZkZWYgT0JKX0VMRgorI2RlZmluZSBPUFRJT05fT0FCSSAoT1BUSU9OX01EX0JBU0UgKzIpCisgIHsib2FiaSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT0FCSX0sCisjZW5kaWYKKyNlbmRpZgorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKKworaW50CittZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKKyAgICAgaW50ICAgIGM7CisgICAgIGNoYXIgKiBhcmc7Cit7CisgIGNoYXIgKiBzdHIgPSBhcmc7CisKKyAgc3dpdGNoIChjKQorICAgIHsKKyNpZmRlZiBBUk1fQklfRU5ESUFOCisgICAgY2FzZSBPUFRJT05fRUI6CisgICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9FTDoKKyAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlICdtJzoKKyAgICAgIHN3aXRjaCAoKnN0cikKKwl7CisJY2FzZSAnZic6CisJICBpZiAoc3RyZXEgKHN0ciwgImZwYTEwIikpCisJICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX0ZQQTEwOworCSAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZwYTExIikpCisJICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX0ZQQTExOworCSAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZwZS1vbGQiKSkKKwkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfQ09SRTsKKwkgIGVsc2UKKwkgICAgZ290byBiYWQ7CisJICBicmVhazsKKworCWNhc2UgJ24nOgorCSAgaWYgKHN0cmVxIChzdHIsICJuby1mcHUiKSkKKwkgICAgY3B1X3ZhcmlhbnQgJj0gfkZQVV9BTEw7CisJICBicmVhazsKKworI2lmZGVmIE9CSl9FTEYKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgaWYgKHN0cmVxIChzdHIsICJvYWJpIikpCisgICAgICAgICAgICB0YXJnZXRfb2FiaSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKwkgIAorICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAvKiBMaW1pdCBhc3NlbWJsZXIgdG8gZ2VuZXJhdGluZyBvbmx5IFRodW1iIGluc3RydWN0aW9uczogKi8KKyAgICAgICAgICBpZiAoc3RyZXEgKHN0ciwgInRodW1iIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNX1RIVU1COworICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9OT05FOworICAgICAgICAgICAgICB0aHVtYl9tb2RlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAidGh1bWItaW50ZXJ3b3JrIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNX1RIVU1CIHwgQVJNX0FSQ0h2NDsKKyNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgorICAgICAgICAgICAgICBzdXBwb3J0X2ludGVyd29yayA9IHRydWU7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisJICAgIGdvdG8gYmFkOworICAgICAgICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGlmIChzdHJlcSAoc3RyLCAiYWxsIikpCisJICAgIHsKKwkgICAgICBjcHVfdmFyaWFudCA9IEFSTV9BTEwgfCBGUFVfQUxMOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisjaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKKwkgIGlmICghIHN0cm5jbXAgKHN0ciwgImFwY3MtIiwgNSkpCisJICAgIHsKKwkgICAgICAvKiBHQ0MgcGFzc2VzIG9uIGFsbCBjb21tYW5kIGxpbmUgb3B0aW9ucyBzdGFydGluZyAiLW1hcGNzLS4uLiIKKwkJIHRvIHVzLCBzbyB3ZSBtdXN0IHBhcnNlIHRoZW0gaGVyZS4gICovCisKKwkgICAgICBzdHIgKz0gNTsKKwkgICAgICAKKwkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjMyIikpCisJCXsKKwkJICB1c2VzX2FwY3NfMjYgPSBmYWxzZTsKKwkJICByZXR1cm4gMTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICIyNiIpKQorCQl7CisJCSAgdXNlc19hcGNzXzI2ID0gdHJ1ZTsKKwkJICByZXR1cm4gMTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJmcmFtZSIpKQorCQl7CisJCSAgLyogU3RhY2sgZnJhbWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgLSBkb2VzIG5vdCBhZmZlY3QKKwkJICAgICBsaW5rYWdlIG9mIGNvZGUuICAqLworCQkgIHJldHVybiAxOworCQl9CisJICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInN0YWNrLWNoZWNrIikpCisJCXsKKwkJICAvKiBTdGFjayBjaGVja2luZyBpcyBiZWluZyBwZXJmb3JtZWQgLSBkb2VzIG5vdCBhZmZlY3QKKwkJICAgICBsaW5rYWdlLCBidXQgZG9lcyByZXF1aXJlIHRoYXQgdGhlIGZ1bmN0aW9ucworCQkgICAgIF9fcnRfc3Rrb3ZmX3NwbGl0X3NtYWxsIGFuZCBfX3J0X3N0a292Zl9zcGxpdF9iaWcgYmUKKwkJICAgICBwcmVzZW50IGluIHRoZSBmaW5hbCBsaW5rLiAgKi8KKworCQkgIHJldHVybiAxOworCQl9CisJICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZsb2F0IikpCisJCXsKKwkJICAvKiBGbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZCBpbiB0aGUgZmxvYXRpbmcKKwkJICAgICBwb2ludCByZWdpc3RlcnMuICBUaGlzIGRvZXMgYWZmZWN0IGxpbmtpbmcsIHNpbmNlIHRoaXMKKwkJICAgICB2ZXJzaW9uIG9mIHRoZSBBUENTIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQKKwkJICAgICBwYXNzZXMgZmxvYXRpbmcgcG9pbnRzIGluIHRoZSBpbnRlZ2VyIHJlZ2lzdGVycy4gICovCisKKwkJICB1c2VzX2FwY3NfZmxvYXQgPSB0cnVlOworCQkgIHJldHVybiAxOworCQl9CisJICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgInJlZW50cmFudCIpKQorCQl7CisJCSAgLyogUmVlbnRyYW50IGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkLiAgVGhpcyBkb2VzIGFmZmVjdAorCQkgICAgIGxpbmtpbmcsIHNpbmNlIHRoZXJlIGlzIG5vIHBvaW50IGluIGxpbmtpbmcgcmVlbnRyYW50LworCQkgICAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLiAqLworCQkgIHBpY19jb2RlID0gdHJ1ZTsKKwkJICByZXR1cm4gMTsKKwkJfQorCSAgICAgIAorCSAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pc2VkIEFQQ1Mgc3dpdGNoIC1tJXMiKSwgYXJnKTsKKwkgICAgICByZXR1cm4gMDsKKyAgCSAgICB9CisjZW5kaWYKKwkgIC8qIFN0cmlwIG9mZiBvcHRpb25hbCAiYXJtIiAqLworCSAgaWYgKCEgc3RybmNtcCAoc3RyLCAiYXJtIiwgMykpCisJICAgIHN0ciArPSAzOworCisJICBzd2l0Y2ggKCpzdHIpCisJICAgIHsKKwkgICAgY2FzZSAnMSc6CisJICAgICAgaWYgKHN0cmVxIChzdHIsICIxIikpCisJCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzE7CisJICAgICAgZWxzZQorCQlnb3RvIGJhZDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICcyJzoKKwkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjIiKSkKKwkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjsKKwkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiMjUwIikpCisJCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI1MDsKKwkgICAgICBlbHNlCisJCWdvdG8gYmFkOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzMnOgorCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMyIpKQorCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8zOworCSAgICAgIGVsc2UKKwkJZ290byBiYWQ7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnNic6CisJICAgICAgc3dpdGNoIChzdHJ0b2wgKHN0ciwgTlVMTCwgMTApKQorCQl7CisJCWNhc2UgNjoKKwkJY2FzZSA2MDoKKwkJY2FzZSA2MDA6CisJCWNhc2UgNjEwOgorCQljYXNlIDYyMDoKKwkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV82OworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIGdvdG8gYmFkOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnNyc6CisJICAgICAgc3dpdGNoIChzdHJ0b2wgKHN0ciwgJiBzdHIsIDEwKSkJLyogRWF0IHRoZSBwcm9jZXNzb3IgbmFtZSAqLworCQl7CisJCWNhc2UgNzoKKwkJY2FzZSA3MDoKKwkJY2FzZSA3MDA6CisJCWNhc2UgNzEwOgorCQljYXNlIDcxMDA6CisJCWNhc2UgNzUwMDoKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBnb3RvIGJhZDsKKwkJfQorICAgICAgICAgICAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV83OworICAgICAgICAgICAgICBmb3IgKDsgKnN0cjsgc3RyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoKiBzdHIpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgfD0gKEFSTV9USFVNQiB8IEFSTV9BUkNIdjQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgICAgICAgIGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQkgIGNhc2UgJ2YnOiAvKiBmZSA9PiBmcCBlbmFibGVkIGNwdS4gICovCisJCSAgICBpZiAoc3RyWzFdID09ICdlJykKKwkJICAgICAgKysgc3RyOworCQkgICAgZWxzZQorCQkgICAgICBnb3RvIGJhZDsKKwkJICAgIAorCQkgIGNhc2UgJ2MnOiAvKiBMZWZ0IG92ZXIgZnJvbSA3MTBjIHByb2Nlc3NvciBuYW1lLiAgKi8KKyAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiAvKiBEZWJ1ZyAqLworICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6IC8qIEVtYmVkZGVkIElDRSAqLworICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGluIEFSTSBwcm9jZXNzb3IgbmFtaW5nLiAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzgnOgorCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiOCIpIHx8IHN0cmVxIChzdHIsICI4MTAiKSkKKwkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOCB8IEFSTV9BUkNIdjQgfCBBUk1fTE9OR01VTDsKKwkgICAgICBlbHNlCisJCWdvdG8gYmFkOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlICc5JzoKKwkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjkiKSkKKwkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIdjQgfCBBUk1fTE9OR01VTDsKKwkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiOXRkbWkiKSkKKwkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIdjQgfCBBUk1fTE9OR01VTCB8IEFSTV9USFVNQjsKKwkgICAgICBlbHNlCisJCWdvdG8gYmFkOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlICdzJzoKKwkgICAgICBpZiAoc3RyZXEgKHN0ciwgInN0cm9uZ2FybSIpCisJCSAgfHwgc3RyZXEgKHN0ciwgInN0cm9uZ2FybTExMCIpCisJCSAgfHwgc3RyZXEgKHN0ciwgInN0cm9uZ2FybTExMDAiKSkKKwkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOCB8IEFSTV9BUkNIdjQgfCBBUk1fTE9OR01VTDsKKwkgICAgICBlbHNlCisJCWdvdG8gYmFkOworCSAgICAgIGJyZWFrOworCQkKKwkgICAgY2FzZSAndic6CisJICAgICAgLyogU2VsZWN0IHZhcmlhbnQgYmFzZWQgb24gYXJjaGl0ZWN0dXJlIHJhdGhlciB0aGFuIHByb2Nlc3NvciAqLworCSAgICAgIHN3aXRjaCAoKisrc3RyKQorCQl7CisJCWNhc2UgJzInOgorCQkgIHN3aXRjaCAoKisrc3RyKQorCQkgICAgeworCQkgICAgY2FzZSAnYSc6IGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7IGJyZWFrOworCQkgICAgY2FzZSAwOiAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzI7IGJyZWFrOworCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOworCQkgICAgfQorCQkgIGJyZWFrOworCQkgIAorCQljYXNlICczJzoKKwkJICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7CisgICAgICAgICAgICAgICAgICAgIAorCQkgIHN3aXRjaCAoKisrc3RyKQorCQkgICAgeworCQkgICAgY2FzZSAnbSc6IGNwdV92YXJpYW50IHw9IEFSTV9MT05HTVVMOyBicmVhazsKKwkJICAgIGNhc2UgMDogICBicmVhazsKKwkJICAgIGRlZmF1bHQ6ICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOyBicmVhazsKKwkJICAgIH0KKwkJICBicmVhazsKKwkJICAKKwkJY2FzZSAnNCc6CisJCSAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fQVJDSHY0OworCQkgIAorCQkgIHN3aXRjaCAoKisrc3RyKQorCQkgICAgeworCQkgICAgY2FzZSAndCc6IGNwdV92YXJpYW50IHw9IEFSTV9USFVNQjsgYnJlYWs7CisJCSAgICBjYXNlIDA6ICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7CisJCSAgICB9CisJCSAgYnJlYWs7CisJCSAgCisJCWRlZmF1bHQ6CisJCSAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBkZWZhdWx0OgorCSAgICBiYWQ6CisJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIHByb2Nlc3NvciB2YXJpYW50IC1tJXMiKSwgYXJnKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnayc6CisgICAgICBwaWNfY29kZSA9IDE7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIHJldHVybiAxOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChmcCkKKyAgICAgRklMRSAqIGZwOworeworICBmcHJpbnRmIChmcCwKK18oIlwKKyBBUk0gU3BlY2lmaWMgQXNzZW1ibGVyIE9wdGlvbnM6XG5cCisgIC1tW2FybV1bPHByb2Nlc3NvciBuYW1lPl0gc2VsZWN0IHByb2Nlc3NvciB2YXJpYW50XG5cCisgIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0XSAgc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG5cCisgIC1tdGh1bWIgICAgICAgICAgICAgICAgICAgb25seSBhbGxvdyBUaHVtYiBpbnN0cnVjdGlvbnNcblwKKyAgLW10aHVtYi1pbnRlcndvcmsgICAgICAgICBtYXJrIHRoZSBhc3NlbWJsZWQgY29kZSBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZ1xuXAorICAtbWFsbCAgICAgICAgICAgICAgICAgICAgIGFsbG93IGFueSBpbnN0cnVjdGlvblxuXAorICAtbWZwYTEwLCAtbWZwYTExICAgICAgICAgIHNlbGVjdCBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmVcblwKKyAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSBpbnN0cnVjdGlvbnNcblwKKyAgLW1uby1mcHUgICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBhbnkgZmxvYXRpbmctcG9pbnQgaW5zdHJ1Y3Rpb25zLlxuIikpOworICBmcHJpbnRmIChmcCwKK18oIlwKKyAgLWsgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBQSUMgY29kZS5cbiIpKTsKKyNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgorICBmcHJpbnRmIChmcCwKK18oIlwKKyAgLW1hcGNzLTMyLCAtbWFwY3MtMjYgICAgICBzcGVjaWZ5IHdoaWNoIEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZCB0byB1c2VcbiIpKTsKKyAgZnByaW50ZiAoZnAsCitfKCJcCisgIC1tYXBjcy1mbG9hdCAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgYXJncyBhcmUgcGFzc2VkIGluIEZQIHJlZ3NcbiIpKTsKKyAgZnByaW50ZiAoZnAsCitfKCJcCisgIC1tYXBjcy1yZWVudHJhbnQgICAgICAgICAgdGhlIGNvZGUgaXMgcG9zaXRpb24gaW5kZXBlbmRlbnQvcmVlbnRyYW50XG4iKSk7CisgICNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgZnByaW50ZiAoZnAsCitfKCJcCisgIC1tb2FiaSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgb2xkIEVMRiBBQklcbiIpKTsKKyNlbmRpZgorI2lmZGVmIEFSTV9CSV9FTkRJQU4KKyAgZnByaW50ZiAoZnAsCitfKCJcCisgIC1FQiAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIGNwdVxuXAorICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIpKTsKKyNlbmRpZgorfQorCisvKiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZml4IHVwIGFyYml0cmFyeSBleHByZXNzaW9ucyBpbiBzb21lIHN0YXRlbWVudHMuCisgICBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBzeW1ib2xzIHRoYXQgYXJlIGFuIGFyYml0cmFyeSBkaXN0YW5jZSBmcm9tCisgICB0aGUgcGMuICBUaGUgbW9zdCBjb21tb24gY2FzZXMgYXJlIG9mIHRoZSBmb3JtICgoKy8tc3ltIC0vKyAuIC0gOCkgJiBtYXNrKSwKKyAgIHdoaWNoIHJldHVybnMgcGFydCBvZiBhbiBhZGRyZXNzIGluIGEgZm9ybSB3aGljaCB3aWxsIGJlIHZhbGlkIGZvcgorICAgYSBkYXRhIGluc3RydWN0aW9uLiAgV2UgZG8gdGhpcyBieSBwdXNoaW5nIHRoZSBleHByZXNzaW9uIGludG8gYSBzeW1ib2wKKyAgIGluIHRoZSBleHByX3NlY3Rpb24sIGFuZCBjcmVhdGluZyBhIGZpeCBmb3IgdGhhdC4gICovCisKK3N0YXRpYyB2b2lkCitmaXhfbmV3X2FybSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNfcmVsLCByZWxvYykKKyAgICAgZnJhZ1MgKiAgICAgICBmcmFnOworICAgICBpbnQgICAgICAgICAgIHdoZXJlOworICAgICBzaG9ydCBpbnQgICAgIHNpemU7CisgICAgIGV4cHJlc3Npb25TICogZXhwOworICAgICBpbnQgICAgICAgICAgIHBjX3JlbDsKKyAgICAgaW50ICAgICAgICAgICByZWxvYzsKK3sKKyAgZml4UyAqICAgICAgICAgbmV3X2ZpeDsKKyAgYXJtX2ZpeF9kYXRhICogYXJtX2RhdGE7CisKKyAgc3dpdGNoIChleHAtPlhfb3ApCisgICAgeworICAgIGNhc2UgT19jb25zdGFudDoKKyAgICBjYXNlIE9fc3ltYm9sOgorICAgIGNhc2UgT19hZGQ6CisgICAgY2FzZSBPX3N1YnRyYWN0OgorICAgICAgbmV3X2ZpeCA9IGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY19yZWwsIHJlbG9jKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIG5ld19maXggPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgbWFrZV9leHByX3N5bWJvbCAoZXhwKSwgMCwKKwkJCSBwY19yZWwsIHJlbG9jKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBNYXJrIHdoZXRoZXIgdGhlIGZpeCBpcyB0byBhIFRIVU1CIGluc3RydWN0aW9uLCBvciBhbiBBUk0gaW5zdHJ1Y3Rpb24gKi8KKyAgYXJtX2RhdGEgPSAoYXJtX2ZpeF9kYXRhICopIG9ic3RhY2tfYWxsb2MgKCYgbm90ZXMsIHNpemVvZiAoYXJtX2ZpeF9kYXRhKSk7CisgIG5ld19maXgtPnRjX2ZpeF9kYXRhID0gKFBUUikgYXJtX2RhdGE7CisgIGFybV9kYXRhLT50aHVtYl9tb2RlID0gdGh1bWJfbW9kZTsKKworICByZXR1cm47Cit9CisKKworLyoKKyAqIFRoaXMgZml4X25ldyBpcyBjYWxsZWQgYnkgY29ucyB2aWEgVENfQ09OU19GSVhfTkVXCisgKgorICogV2UgY2hlY2sgdGhlIGV4cHJlc3Npb24gdG8gc2VlIGlmIGl0IGlzIG9mIHRoZSBmb3JtCisgKiAgX19HTE9CQUxfT0ZGU0VUX1RBQkxFICsgPz8/CisgKiBJZiBpdCBpcyB0aGVuIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWZlcmVuY2UgdG8gdGhlIEdPVC4KKyAqIGkuZS4KKyAqIAlsZHIJc2wsIEwxCisgKiAJYWRkCXNsLCBwYywgc2wKKyAqIEwyOgorICogCS4uLgorICogTDE6CisgKgkud29yZAlfX0dMT0JBTF9PRkZTRVRfVEFCTEUgKyAoLiAtIChMMiArIDQpKQorICoKKyAqIEluIHRoaXMgY2FzZSB1c2UgYSByZWxvYyB0eXBlIEJGRF9SRUxPQ19BUk1fR09UUEMgaW5zdGVhZCBvZiB0aGUKKyAqIG5vcm1hbCBCRkRfUkVMT0NfezE2LDMyLDY0fQorICovCisKK3ZvaWQKK2NvbnNfZml4X25ld19hcm0gKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCisgICAgIGZyYWdTICogICAgICAgZnJhZzsKKyAgICAgaW50ICAgICAgICAgICB3aGVyZTsKKyAgICAgaW50ICAgICAgICAgICBzaXplOworICAgICBleHByZXNzaW9uUyAqIGV4cDsKK3sKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHR5cGU7CisgIGludCBwY3JlbCA9IDA7CisgIAorICAvKiBQaWNrIGEgcmVsb2MgLi4uCisgICAqCisgICAqIEBAIFNob3VsZCBsb29rIGF0IENQVSB3b3JkIHNpemUuCisgICAqLworICBzd2l0Y2ggKHNpemUpIAorICAgIHsKKyAgICBjYXNlIDI6CisgICAgICB0eXBlID0gQkZEX1JFTE9DXzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGRlZmF1bHQ6CisgICAgICB0eXBlID0gQkZEX1JFTE9DXzMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgdHlwZSA9IEJGRF9SRUxPQ182NDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIC8qIExvb2sgZm9yIHBvc3NpYmxlIEdPVFBDIHJlbG9jICovCisgIAorICAvKgorICAgKiBMb29rIGZvciBwaWMgYXNzZW1ibGVyIGFuZCAndW5kZWYgc3ltYm9sICsgZXhwciBzeW1ib2wnIGV4cHJlc3Npb24KKyAgICogYW5kIGEgMzIgYml0IHNpemUuCisgICAqLworICAKKyAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCAoaW50KSBzaXplLCBleHAsIHBjcmVsLCB0eXBlKTsKK30KKworLyogQSBnb29kIHBsYWNlIHRvIGRvIHRoaXMsIGFsdGhvdWdoIHRoaXMgd2FzIHByb2JhYmx5IG5vdCBpbnRlbmRlZAorICogZm9yIHRoaXMga2luZCBvZiB1c2UuICBXZSBuZWVkIHRvIGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUKKyAqIHJlZmVyZW5jZXMgYXJlIG1hZGUgdG8gYSBudWxsIHN5bWJvbCBwb2ludGVyLiAgKi8KK3ZvaWQKK2FybV9jbGVhbnVwICgpCit7CisgIGlmIChjdXJyZW50X3Bvb2xQICE9IE5VTEwpCisgICAgeworICAgICAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsgLyogUHV0IGl0IGF0IHRoZSBlbmQgb2YgdGV4dCBzZWN0aW9uICovCisgICAgICBzX2x0b3JnICgwKTsKKyAgICAgIGxpc3RpbmdfcHJldl9saW5lICgpOworICAgIH0KK30KKwordm9pZAorYXJtX3N0YXJ0X2xpbmVfaG9vayAoKQoreworICBsYXN0X2xhYmVsX3NlZW4gPSBOVUxMOworfQorCit2b2lkCithcm1fZnJvYl9sYWJlbCAoc3ltKQorICAgICBzeW1ib2xTICogc3ltOworeworICBsYXN0X2xhYmVsX3NlZW4gPSBzeW07CisgIAorICBBUk1fU0VUX1RIVU1CIChzeW0sIHRodW1iX21vZGUpOworICAKKyNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgorICBBUk1fU0VUX0lOVEVSV09SSyAoc3ltLCBzdXBwb3J0X2ludGVyd29yayk7CisjZW5kaWYKKyAgCisgIGlmIChsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lKQorICAgIHsKKyAgICAgIC8qIFdoZW4gdGhlIGFkZHJlc3Mgb2YgYSBUaHVtYiBmdW5jdGlvbiBpcyB0YWtlbiB0aGUgYm90dG9tCisJIGJpdCBvZiB0aGF0IGFkZHJlc3Mgc2hvdWxkIGJlIHNldC4gIFRoaXMgd2lsbCBhbGxvdworCSBpbnRlcndvcmtpbmcgYmV0d2VlbiBBcm0gYW5kIFRodW1iIGZ1bmN0aW9ucyB0byB3b3JrCisJIGNvcnJlY3RseS4gICovCisKKyAgICAgIFRIVU1CX1NFVF9GVU5DIChzeW0sIDEpOworICAgICAgCisgICAgICBsYWJlbF9pc190aHVtYl9mdW5jdGlvbl9uYW1lID0gZmFsc2U7CisgICAgfQorfQorCisvKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgbWFya3MgVGh1bWIgc3ltYm9scyBhcyBkaXN0aW5jdCBmcm9tCisgICBBUk0gb25lcy4gICovCisKK3ZvaWQKK2FybV9hZGp1c3Rfc3ltdGFiICgpCit7CisjaWZkZWYgT0JKX0NPRkYKKyAgc3ltYm9sUyAqIHN5bTsKKworICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQorICAgIHsKKyAgICAgIGlmIChBUk1fSVNfVEhVTUIgKHN5bSkpCisgICAgICAgIHsKKwkgIGlmIChUSFVNQl9JU19GVU5DIChzeW0pKQorCSAgICB7CisJICAgICAgLyogTWFyayB0aGUgc3ltYm9sIGFzIGEgVGh1bWIgZnVuY3Rpb24uICAqLworCSAgICAgIGlmICggICBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfU1RBVAorCQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19MQUJFTCkgLyogVGhpcyBjYW4gaGFwcGVuISAqLworCQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJTVEFURlVOQyk7CisKKwkgICAgICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUKQorCQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJFWFRGVU5DKTsKKwkgICAgICBlbHNlCisJCWFzX2JhZCAoXygiJXM6IHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZTogJWQiKSwKKwkJCVNfR0VUX05BTUUgKHN5bSksIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkpOworCSAgICB9CisgICAgICAgICAgZWxzZSBzd2l0Y2ggKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgQ19FWFQ6CisgICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CRVhUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDX1NUQVQ6CisgICAgICAgICAgICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX1RIVU1CU1RBVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ19MQUJFTDoKKyAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJMQUJFTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGRvIG5vdGhpbmcgKi8gCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgaWYgKEFSTV9JU19JTlRFUldPUksgKHN5bSkpCisJY29mZnN5bWJvbChzeW0tPmJzeW0pLT5uYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSAweEZGOworICAgIH0KKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgc3ltYm9sUyAqICAgICAgICAgc3ltOworICBlbGZfc3ltYm9sX3R5cGUgKiBlbGZfc3ltOworICBjaGFyICAgICAgICAgICAgICBiaW5kOworCisgIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCisgICAgeworICAgICAgaWYgKEFSTV9JU19USFVNQiAoc3ltKSkKKyAgICAgICAgeworCSAgaWYgKFRIVU1CX0lTX0ZVTkMgKHN5bSkpCisJICAgIHsKKwkgICAgICBlbGZfc3ltID0gZWxmX3N5bWJvbCAoc3ltLT5ic3ltKTsKKwkgICAgICBiaW5kID0gRUxGX1NUX0JJTkQgKGVsZl9zeW0pOworCSAgICAgIGVsZl9zeW0tPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChiaW5kLCBTVFRfQVJNX1RGVU5DKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfQorI2VuZGlmCit9CisKK2ludAorYXJtX2RhdGFfaW5fY29kZSAoKQoreworICBpZiAodGh1bWJfbW9kZSAmJiAhIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciArIDEsICJkYXRhOiIsIDUpKQorICAgIHsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnLyc7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKgorYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSkKKyAgICAgY2hhciAqIG5hbWU7Cit7CisgIGludCBsZW47CisKKyAgaWYgKHRodW1iX21vZGUgJiYgKGxlbiA9IHN0cmxlbiAobmFtZSkpID4gNQorICAgICAgJiYgc3RyZXEgKG5hbWUgKyBsZW4gLSA1LCAiL2RhdGEiKSkKKyAgICB7CisgICAgICAqKG5hbWUgKyBsZW4gLSA1KSA9IDA7CisgICAgfQorCisgIHJldHVybiBuYW1lOworfQorCitib29sZWFuCithcm1fdmFsaWRhdGVfZml4IChmaXhQKQorICAgICBmaXhTICogZml4UDsKK3sKKyAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgYSBkZWZpbmVkIHN5bWJvbCB3aGljaCBkb2VzIG5vdCBoYXZlCisgICAgIHRoZSBUSFVNQl9GVU5DIGF0dHJpYnV0ZSwgdGhlbiB3ZSBtdXN0IGJlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBoYXMKKyAgICAgdGhlIChpbnRlcmZhY2Vhcm0pIGF0dHJpYnV0ZS4gIFdlIGxvb2sgZm9yIHRoZSBUaHVtYiBlbnRyeSBwb2ludCB0byB0aGF0CisgICAgIGZ1bmN0aW9uIGFuZCBjaGFuZ2UgdGhlIGJyYW5jaCB0byByZWZlciB0byB0aGF0IGZ1bmN0aW9uIGluc3RlYWQuICAqLworICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMworICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAorICAgICAgJiYgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKKyAgICAgICYmICEgVEhVTUJfSVNfRlVOQyAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gZmluZF9yZWFsX3N0YXJ0IChmaXhQLT5meF9hZGRzeSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisjaWZkZWYgT0JKX0VMRgorLyogUmVsb2NhdGlvbnMgYWdhaW5zdCBUaHVtYiBmdW5jdGlvbiBuYW1lcyBtdXN0IGJlIGxlZnQgdW5hZGp1c3RlZCwKKyAgIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gY29ycmVjdGx5IHNldCB0aGUKKyAgIGJvdHRvbSBiaXQgb2YgdGhlaXIgYWRkcmVzc2VzLiAgVGhlIE1JUFMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uCisgICBhbHNvIHByZXZlbnRzIHJlbG9jYXRpb25zIHRoYXQgYXJlIG1pcHMtMTYgc3BlY2lmaWMsIGJ1dCBJIGRvIG5vdAorICAga25vdyB3aHkgaXQgZG9lcyB0aGlzLgorCisgICBGSVhNRToKKyAgIFRoZXJlIGlzIG9uZSBvdGhlciBwcm9ibGVtIHRoYXQgb3VnaHQgdG8gYmUgYWRkcmVzc2VkIGhlcmUsIGJ1dAorICAgd2hpY2ggY3VycmVudGx5IGlzIG5vdDogIFRha2luZyB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsIChyYXRoZXIKKyAgIHRoYW4gYSBmdW5jdGlvbikgYW5kIHRoZW4gbGF0ZXIganVtcGluZyB0byB0aGF0IGFkZHJlc3MuICBTdWNoCisgICBhZGRyZXNzZXMgYWxzbyBvdWdodCB0byBoYXZlIHRoZWlyIGJvdHRvbSBiaXQgc2V0IChhc3N1bWluZyB0aGF0CisgICB0aGV5IHJlc2lkZSBpbiBUaHVtYiBjb2RlKSwgYnV0IGF0IHRoZSBtb21lbnQgdGhleSB3aWxsIG5vdC4gICovCisgICAKK2Jvb2xlYW4KK2FybV9maXhfYWRqdXN0YWJsZSAoZml4UCkKKyAgIGZpeFMgKiBmaXhQOworeworCisgIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQorICAgIHJldHVybiAxOworICAKKyAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCisgIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworICAKKyAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworCisgIGlmIChUSFVNQl9JU19GVU5DIChmaXhQLT5meF9hZGRzeSkKKyAgICAgICYmIGZpeFAtPmZ4X3N1YnN5ID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIAorICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCisgIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCisgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KKworY29uc3QgY2hhciAqCitlbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCAoKQoreworICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisgICAgaWYgKHRhcmdldF9vYWJpKQorICAgICAgcmV0dXJuICJlbGYzMi1iaWdhcm0tb2FiaSI7CisgICAgZWxzZQorICAgICAgcmV0dXJuICJlbGYzMi1iaWdhcm0iOworICBlbHNlCisgICAgaWYgKHRhcmdldF9vYWJpKQorICAgICAgcmV0dXJuICJlbGYzMi1saXR0bGVhcm0tb2FiaSI7CisgICAgZWxzZQorICAgICAgcmV0dXJuICJlbGYzMi1saXR0bGVhcm0iOworfQorCit2b2lkCithcm1lbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQorICAgICBzeW1ib2xTICogc3ltcDsKKyAgICAgaW50ICogcHVudHA7Cit7CisgIGVsZl9mcm9iX3N5bWJvbCAoc3ltcCwgcHVudHApOworfSAKKworaW50Cithcm1fZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKKyAgICAgc3RydWN0IGZpeCAqIGZpeHA7Cit7CisgIGlmICggICBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCisgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQorICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNIKSAgICAKKyAgICByZXR1cm4gMTsKKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCithcm1fcGFyc2VfcmVsb2MgKCkKK3sKKyAgY2hhciAgIGlkWzE2XTsKKyAgY2hhciAqIGlwOworICBpbnQgICAgaTsKKyAgc3RhdGljIHN0cnVjdAorICB7CisgICAgY2hhciAqIHN0cjsKKyAgICBpbnQgICAgbGVuOworICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKKyAgfQorICByZWxvY19tYXBbXSA9CisgIHsKKyNkZWZpbmUgTUFQKHN0cixyZWxvYykgeyBzdHIsIHNpemVvZiAoc3RyKS0xLCByZWxvYyB9CisgICAgTUFQICgiKGdvdCkiLCAgICBCRkRfUkVMT0NfQVJNX0dPVDMyKSwKKyAgICBNQVAgKCIoZ290b2ZmKSIsIEJGRF9SRUxPQ19BUk1fR09UT0ZGKSwKKyAgICAvKiBTY290dEI6IEphbiAzMCwgMTk5OCAqLworICAgIC8qIEFkZGVkIHN1cHBvcnQgZm9yIHBhcnNpbmcgInZhcihQTFQpIiBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCisgICAgLyogZ2VuZXJhdGVkIGJ5IEdDQyBmb3IgUExUIHJlbG9jcyAqLworICAgIE1BUCAoIihwbHQpIiwgICAgQkZEX1JFTE9DX0FSTV9QTFQzMiksCisgICAgTlVMTCwgMCwgICAgICAgICBCRkRfUkVMT0NfVU5VU0VECisjdW5kZWYgTUFQICAgIAorICB9OworCisgIGZvciAoaSA9IDAsIGlwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgIGkgPCBzaXplb2YgKGlkKSAmJiAoaXNhbG51bSAoKmlwKSB8fCBpc3B1bmN0ICgqaXApKTsKKyAgICAgICBpKyssIGlwKyspCisgICAgaWRbaV0gPSB0b2xvd2VyICgqaXApOworICAKKyAgZm9yIChpID0gMDsgcmVsb2NfbWFwW2ldLnN0cjsgaSsrKQorICAgIGlmIChzdHJuY21wIChpZCwgcmVsb2NfbWFwW2ldLnN0ciwgcmVsb2NfbWFwW2ldLmxlbikgPT0gMCkKKyAgICAgIGJyZWFrOworICAKKyAgaW5wdXRfbGluZV9wb2ludGVyICs9IHJlbG9jX21hcFtpXS5sZW47CisgIAorICByZXR1cm4gcmVsb2NfbWFwW2ldLnJlbG9jOworfQorCitzdGF0aWMgdm9pZAorc19hcm1fZWxmX2NvbnMgKG5ieXRlcykKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgZXhwcmVzc2lvblMgZXhwOworCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKKyAgICB7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIG1kX2NvbnNfYWxpZ24KKyAgbWRfY29uc19hbGlnbiAobmJ5dGVzKTsKKyNlbmRpZgorCisgIGRvCisgICAgeworICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworICAgICAgCisgICAgICBleHByZXNzaW9uICgmIGV4cCk7CisKKyAgICAgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbAorICAgICAgICAgICYmICogaW5wdXRfbGluZV9wb2ludGVyID09ICcoJworICAgICAgICAgICYmIChyZWxvYyA9IGFybV9wYXJzZV9yZWxvYygpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQorICAgICAgICB7CisgICAgICAgICAgcmVsb2NfaG93dG9fdHlwZSAqIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIHJlbG9jKTsKKyAgICAgICAgICBpbnQgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOworCisgICAgICAgICAgaWYgKHNpemUgPiBuYnl0ZXMpCisgICAgICAgICAgICBhc19iYWQgKCIlcyByZWxvY2F0aW9ucyBkbyBub3QgZml0IGluICVkIGJ5dGVzIiwgaG93dG8tPm5hbWUsIG5ieXRlcyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZWdpc3RlciBjaGFyICogcCA9IGZyYWdfbW9yZSAoKGludCkgbmJ5dGVzKTsKKyAgICAgICAgICAgICAgaW50IG9mZnNldCA9IG5ieXRlcyAtIHNpemU7CisKKyAgICAgICAgICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsCisJCQkgICAmIGV4cCwgMCwgcmVsb2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGVtaXRfZXhwciAoJiBleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7CisgICAgfQorICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisjZW5kaWYgLyogT0JKX0VMRiAqLworCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFybS5oIGIvZ2FzL2NvbmZpZy90Yy1hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk5ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1hcm0uaApAQCAtMCwwICsxLDIwNCBAQAorLyogVGhpcyBmaWxlIGlzIHRjLWFybS5oCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQorCU1vZGlmaWVkIGJ5IERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVENfQVJNIDEKKworI2lmbmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgorI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisjZW5kaWYKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKyNkZWZpbmUgQ09GRl9NQUdJQyAJQVJNTUFHSUMKKyNkZWZpbmUgVEFSR0VUX0FSQ0ggCWJmZF9hcmNoX2FybQorCisjZGVmaW5lIEFPVVRfTUFDSFRZUEUgCTAKKworI2RlZmluZSBESUZGX0VYUFJfT0sKKworI2lmZGVmICBMSVRUTEVfRU5ESUFOCisjdW5kZWYgIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorCisjaWZkZWYgIEJJR19FTkRJQU4KKyN1bmRlZiAgQklHX0VORElBTgorI2VuZGlmCisKKyNkZWZpbmUgTElUVExFX0VORElBTiAJMTIzNAorI2RlZmluZSBCSUdfRU5ESUFOIAk0MzIxCisKKyNpZiBkZWZpbmVkIE9CSl9BT1VUCisjaWYgZGVmaW5lZCBURV9SSVNDSVgKKyMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXJpc2NpeCIKKyNlbGlmIGRlZmluZWQgVEVfTElOVVgKKyMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KKyMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LWFybS1saW51eCIKKyNlbGlmIGRlZmluZWQgVEVfTmV0QlNECisjIGRlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1hcm0tbmV0YnNkIgorI2Vsc2UKKyMgZGVmaW5lIEFSTV9CSV9FTkRJQU4KKyMgZGVmaW5lIFRBUkdFVF9GT1JNQVQgXAorICAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiYS5vdXQtYXJtLWJpZyIgOiAiYS5vdXQtYXJtLWxpdHRsZSIpCisjZW5kaWYKKyNlbmRpZiAvKiBPQkpfQU9VVCAqLworCisjaWZkZWYgT0JKX0FJRgorI2RlZmluZSBUQVJHRVRfRk9STUFUICJhaWYiCisjZW5kaWYKKworI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCisjIGRlZmluZSBBUk1fQklfRU5ESUFOCisgICAgIAorIyBkZWZpbmUgVENfVkFMSURBVEVfRklYKGZpeFAsIHNlZ1R5cGUsIExhYmVsKSBcCisgICAgIGlmIChhcm1fdmFsaWRhdGVfZml4IChmaXhQKSkgYWRkX3N5bWJvbFAgPSBmaXhQLT5meF9hZGRzeQorICBleHRlcm4gYm9vbGVhbiBhcm1fdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworI2VuZGlmCisgICAgIAorI2lmZGVmIE9CSl9DT0ZGCisjIGlmIGRlZmluZWQgVEVfUEUKKyMgIGRlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKHgpICgoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUlZBKQorIyAgIGlmZGVmIFRFX0VQT0MKKyMgICAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVwb2MtcGUtYXJtLWJpZyIgOiAiZXBvYy1wZS1hcm0tbGl0dGxlIikKKyMgICBlbHNlCisjICAgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJwZS1hcm0tYmlnIiA6ICJwZS1hcm0tbGl0dGxlIikKKyMgICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiY29mZi1hcm0tYmlnIiA6ICJjb2ZmLWFybS1saXR0bGUiKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBPQkpfRUxGCisjIGRlZmluZSBUQVJHRVRfRk9STUFUIGVsZjMyX2FybV90YXJnZXRfZm9ybWF0KCkKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBlbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7CisgIAorIyBkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSBhcm1fZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKKyAgZXh0ZXJuIGludCBhcm1fZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKyNlbmRpZgorCisjZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLCBzLCBmKSB7YXNfZmF0YWwgKF8oImFybSBjb252ZXJ0X2ZyYWdcbiIpKTt9CisKKyNkZWZpbmUgbWRfY2xlYW51cCgpIGFybV9jbGVhbnVwICgpCisgZXh0ZXJuIHZvaWQgYXJtX2NsZWFudXAgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIG1kX3N0YXJ0X2xpbmVfaG9vaygpIGFybV9zdGFydF9saW5lX2hvb2sgKCkKKyBleHRlcm4gdm9pZCBhcm1fc3RhcnRfbGluZV9ob29rIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZSB0Y19mcm9iX2xhYmVsKFMpIGFybV9mcm9iX2xhYmVsIChTKQorIGV4dGVybiB2b2lkIGFybV9mcm9iX2xhYmVsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworCisvKiBXZSBhbHNvIG5lZWQgdG8gbWFyayBhc3NlbWJsZXIgY3JlYXRlZCBzeW1ib2xzOiAgKi8KKyNkZWZpbmUgdGNfZnJvYl9mYWtlX2xhYmVsKFMpIGFybV9mcm9iX2xhYmVsIChTKQorCisvKiBOT1RFOiBUaGUgZmFrZSBsYWJlbCBjcmVhdGlvbiBpbiBzdGFicy5jOnNfc3RhYl9nZW5lcmljKCkgaGFzCisgICBkZWxpYmVyYXRlbHkgbm90IGJlZW4gdXBkYXRlZCB0byBtYXJrIGFzc2VtYmxlciBjcmVhdGVkIHN0YWJzCisgICBzeW1ib2xzIGFzIFRodW1iLiAgKi8KKworI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIGFybV9maXhfYWRqdXN0YWJsZSAoZml4UCkKKyNlbHNlCisjZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSAwCisjZW5kaWYKKworLyogV2UgbmVlZCB0byBrZWVwIHNvbWUgbG9jYWwgaW5mb3JtYXRpb24gb24gc3ltYm9scy4gICovCisKKyNkZWZpbmUgVENfU1lNRklFTERfVFlQRSB1bnNpZ25lZCBpbnQKKyNkZWZpbmUgQVJNX0dFVF9GTEFHKHMpICAgCSgocyktPnN5X3RjKQorI2RlZmluZSBBUk1fU0VUX0ZMQUcocyx2KSAJKChzKS0+c3lfdGMgfD0gKHYpKQorI2RlZmluZSBBUk1fUkVTRVRfRkxBRyhzLHYpIAkoKHMpLT5zeV90YyAmPSB+KHYpKQorCisjZGVmaW5lIEFSTV9GTEFHX1RIVU1CIAkJKDEgPDwgMCkJLyogVGhlIHN5bWJvbCBpcyBhIFRodW1iIHN5bWJvbCByYXRoZXIgdGhhbiBhbiBBcm0gc3ltYm9sLiAgKi8KKyNkZWZpbmUgQVJNX0ZMQUdfSU5URVJXT1JLIAkoMSA8PCAxKQkvKiBUaGUgc3ltYm9sIGlzIGF0dGFjaGVkIHRvIGNvZGUgdGhhdCBzdXBwcG9ydHMgaW50ZXJ3b3JraW5nLiAgKi8KKyNkZWZpbmUgVEhVTUJfRkxBR19GVU5DCQkoMSA8PCAyKQkvKiBUaGUgc3ltYm9sIGlzIGF0dGFjaGVkIHRvIHRoZSBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KKworI2RlZmluZSBBUk1fSVNfVEhVTUIocykJCShBUk1fR0VUX0ZMQUcgKHMpICYgQVJNX0ZMQUdfVEhVTUIpCisjZGVmaW5lIEFSTV9JU19JTlRFUldPUksocykJKEFSTV9HRVRfRkxBRyAocykgJiBBUk1fRkxBR19JTlRFUldPUkspCisjZGVmaW5lIFRIVU1CX0lTX0ZVTkMocykJKEFSTV9HRVRfRkxBRyAocykgJiBUSFVNQl9GTEFHX0ZVTkMpCisKKyNkZWZpbmUgQVJNX1NFVF9USFVNQihzLHQpICAgICAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgQVJNX0ZMQUdfVEhVTUIpICAgICA6IEFSTV9SRVNFVF9GTEFHIChzLCBBUk1fRkxBR19USFVNQikpCisjZGVmaW5lIEFSTV9TRVRfSU5URVJXT1JLKHMsdCkgICgodCkgPyBBUk1fU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX0lOVEVSV09SSykgOiBBUk1fUkVTRVRfRkxBRyAocywgQVJNX0ZMQUdfSU5URVJXT1JLKSkKKyNkZWZpbmUgVEhVTUJfU0VUX0ZVTkMocyx0KSAgICAgKCh0KSA/IEFSTV9TRVRfRkxBRyAocywgVEhVTUJfRkxBR19GVU5DKSAgICA6IEFSTV9SRVNFVF9GTEFHIChzLCBUSFVNQl9GTEFHX0ZVTkMpKQorCisKKyNkZWZpbmUgVENfRklYX1RZUEUgUFRSCisjZGVmaW5lIFRDX0lOSVRfRklYX0RBVEEoRklYUCkgKChGSVhQKS0+dGNfZml4X2RhdGEgPSBOVUxMKQorCisjZGVmaW5lIFRDX1NUQVJUX0xBQkVMKEMsU1RSKSBcCisgIChjID09ICc6JyB8fCAoYyA9PSAnLycgJiYgYXJtX2RhdGFfaW5fY29kZSAoKSkpCitpbnQgYXJtX2RhdGFfaW5fY29kZSBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKHN0cikgXAorIGFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN0cik7CitjaGFyICogYXJtX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBQQVJBTVMgKChjaGFyICopKTsKKworI2RlZmluZSBvYmpfYWRqdXN0X3N5bXRhYigpIGFybV9hZGp1c3Rfc3ltdGFiICgpCisgZXh0ZXJuIHZvaWQgYXJtX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOworCisjaWZkZWYgT0JKX0VMRgorI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltLCBwdW50KSAgYXJtZWxmX2Zyb2Jfc3ltYm9sIChzeW0sIHB1bnQpCisjZW5kaWYKKworI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLworCisjZGVmaW5lIExJU1RJTkdfSEVBREVSICJBUk0gR0FTICIKKworI2RlZmluZSBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVggJyUnCisKKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCisjZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQorCisjZGVmaW5lIE1EX0FQUExZX0ZJWDMKKworI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gJ0wnKSkKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCICAgMQorCisvKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsIG9iamVjdAorICAgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4gIFRydWUgaWYgd2UKKyAgIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nIHRoZSAubyBmaWxlLgorICAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHBjcmVsIHJlbG9jYXRpb25zLCBzbyBHT1RPRkYgZG9lcyBub3QgbmVlZCB0byBiZQorICAgY2hlY2tlZCBoZXJlLiAgSSBhbSBub3Qgc3VyZSBpZiBzb21lIG9mIHRoZSBvdGhlcnMgYXJlIGV2ZXIgdXNlZCB3aXRoCisgICBwY3JlbCwgYnV0IGl0IGlzIGVhc2llciB0byBiZSBzYWZlIHRoYW4gc29ycnkuICAqLworCisjZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpICBcCisgICAoICAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19BUk1fR09UMTIgXAorICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQVJNX0dPVDMyIFwKKyAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyKQorCisjZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfYXJtCisgZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X2FybSBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGludCwgZXhwcmVzc2lvblMgKikpOworCisvKiBEb24ndCBhbGxvdyBzeW1ib2xzIHRvIGJlIGRpc2NhcmRlZCBvbiBHT1QgcmVsYXRlZCByZWxvY3MsCisgICBub3Igb24gZ2xvYmFscy4gICovIAorI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZSh4KSAoXAorICAgICAoKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMiBcCisgICB8fCAoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX0dPVDMyIFwKKyAgIHx8ICh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fR09UT0ZGIFwKKyAgIHx8IFNfSVNfRVhURVJOICgoeCktPmZ4X2FkZHN5KSBcCisgICB8fCBTX0lTX1dFQUsgKCh4KS0+ZnhfYWRkc3kpKSA/IDAgOiAxKQorICAgICAKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorI2Vsc2UKKyNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorI2VuZGlmCisgICAgIAorLyogZW5kIG9mIHRjLWFybS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQxMHYuYyBiL2dhcy9jb25maWcvdGMtZDEwdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzhmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWQxMHYuYwpAQCAtMCwwICsxLDE2MzYgQEAKKy8qIHRjLWQxMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDEwVgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCisjaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKKyNpbmNsdWRlICJlbGYvcHBjLmgiCisKK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk8iOworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Citjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKKworaW50IE9wdGltaXppbmcgPSAwOworCisjZGVmaW5lIEFUX1dPUkRfUChYKSAoKFgpLT5YX29wID09IE9fcmlnaHRfc2hpZnQgXAorCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sICE9IE5VTEwgXAorCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQgXAorCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPT0gQVRfV09SRF9SSUdIVF9TSElGVCkKKyNkZWZpbmUgQVRfV09SRF9SSUdIVF9TSElGVCAyCisKKworLyogZml4dXBzICovCisjZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKK3N0cnVjdCBkMTB2X2ZpeHVwCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgaW50IG9wZXJhbmQ7CisgIGludCBwY3JlbDsKKyAgaW50IHNpemU7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKK307CisKK3R5cGVkZWYgc3RydWN0IF9maXh1cHMKK3sKKyAgaW50IGZjOworICBzdHJ1Y3QgZDEwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKKyAgc3RydWN0IF9maXh1cHMgKm5leHQ7Cit9IEZpeHVwczsKKworc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07CitzdGF0aWMgRml4dXBzICpmaXh1cHM7CisKKy8qIFRydWUgaWYgaW5zdHJ1Y3Rpb24gc3dhcHBpbmcgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwOyAvKiAtLW5vd2FybnN3YXAgKi8KKworLyogbG9jYWwgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICpuYW1lKSk7CitzdGF0aWMgaW50IHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7CitzdGF0aWMgaW50IGNoZWNrX3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgYml0cywgaW50IGZsYWdzKSk7CitzdGF0aWMgaW50IHBvc3RmaXggUEFSQU1TICgoY2hhciAqcCkpOworc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2MgUEFSQU1TICgoc3RydWN0IGQxMHZfb3BlcmFuZCAqb3ApKTsKK3N0YXRpYyBpbnQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKGV4cHJlc3Npb25TIGV4cFtdKSk7CitzdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpmaW5kX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgb3BzW10pKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIGV4cHJlc3Npb25TICpvcGVycywgdW5zaWduZWQgbG9uZyBpbnNuKSk7CitzdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCB1bnNpZ25lZCBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKK3N0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOworc3RhdGljIGludCB3cml0ZV8yX3Nob3J0IFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCisJCQkJICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTIsIHVuc2lnbmVkIGxvbmcgaW5zbjIsIGludCBleGVjX3R5cGUsIEZpeHVwcyAqZngpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkMTB2X2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKCB1bnNpZ25lZCBsb25nIGluc24sIGludCBvcF90eXBlLAorCQkJCQkJICAgb2Zmc2V0VCB2YWx1ZSwgaW50IGxlZnQsIGZpeFMgKmZpeCkpOworc3RhdGljIGludCBwYXJhbGxlbF9vayBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTEsIHVuc2lnbmVkIGxvbmcgaW5zbjEsIAorCQkJCXN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKKwkJCQlpbnQgZXhlY190eXBlKSk7CitzdGF0aWMgc3ltYm9sUyAqIGZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKKworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KK3sKKyNkZWZpbmUgT1BUSU9OX05PV0FSTlNXQVAgKE9QVElPTl9NRF9CQVNFKQorICB7Im5vd2FybnN3YXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PV0FSTlNXQVB9LAorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAgICAgICAKKworc3RhdGljIHZvaWQgZDEwdl9kb3Rfd29yZCBQQVJBTVMgKChpbnQpKTsKKworLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyAid29yZCIsCWQxMHZfZG90X3dvcmQsCTIgfSwKKyAgeyBOVUxMLCAgICAgICBOVUxMLCAgICAgICAgICAgMCB9Cit9OworCisvKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqZDEwdl9oYXNoOworCisvKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMKKyAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgorICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCisKK3N0YXRpYyBpbnQKK3JlZ19uYW1lX3NlYXJjaCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaW50IG1pZGRsZSwgbG93LCBoaWdoOworICBpbnQgY21wOworCisgIGxvdyA9IDA7CisgIGhpZ2ggPSBkMTB2X3JlZ19uYW1lX2NudCgpIC0gMTsKKworICBkbworICAgIHsKKyAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7CisgICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7CisgICAgICBpZiAoY21wIDwgMCkKKwloaWdoID0gbWlkZGxlIC0gMTsKKyAgICAgIGVsc2UgaWYgKGNtcCA+IDApCisJbG93ID0gbWlkZGxlICsgMTsKKyAgICAgIGVsc2UgCisJICByZXR1cm4gZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOworICAgIH0KKyAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKKyAgcmV0dXJuIC0xOworfQorCisvKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCisgICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lICovCisKK3N0YXRpYyBpbnQKK3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Cit7CisgIGludCByZWdfbnVtYmVyOworICBjaGFyIGMsICpwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAKKyAgd2hpbGUgKCpwICYmICpwIT0nXG4nICYmICpwIT0nXHInICYmICpwICE9JywnICYmICpwIT0nICcgJiYgKnAhPScpJykKKyAgICBwKys7CisKKyAgYyA9ICpwOworICBpZiAoYykKKyAgICAqcCsrID0gMDsKKworICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLworICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChpbnB1dF9saW5lX3BvaW50ZXIpOworICBpZiAocmVnX251bWJlciA+PSAwKSAKKyAgICB7CisgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7CisgICAgICAvKiB0ZW1wb3JhcmlseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBoZXJlICovCisgICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSAoc3RydWN0IHN5bWJvbCAqKWlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgaWYgKGMpCisgICAgKihwLTEpID0gYzsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorY2hlY2tfcmFuZ2UgKG51bSwgYml0cywgZmxhZ3MpCisgICAgIHVuc2lnbmVkIGxvbmcgbnVtOworICAgICBpbnQgYml0czsKKyAgICAgaW50IGZsYWdzOworeworICBsb25nIG1pbiwgbWF4LCBiaXQxOworICBpbnQgcmV0dmFsPTA7CisKKyAgLyogZG9uJ3QgYm90aGVyIGNoZWNraW5nIDE2LWJpdCB2YWx1ZXMgKi8KKyAgaWYgKGJpdHMgPT0gMTYpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKKyAgICB7CisgICAgICAvKiBhbGwgc3BlY2lhbCBzaGlmdCBvcGVyYW5kcyBhcmUgdW5zaWduZWQgKi8KKyAgICAgIC8qIGFuZCA8PSAxNi4gIFdlIGFsbG93IDAgZm9yIG5vdy4gKi8KKyAgICAgIGlmIChudW0+MTYpCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChmbGFncyAmIE9QRVJBTkRfU0lHTkVEKQorICAgIHsKKyAgICAgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpLTE7IAorICAgICAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsgIAorICAgICAgaWYgKCgobG9uZyludW0gPiBtYXgpIHx8ICgobG9uZyludW0gPCBtaW4pKQorCXJldHZhbCA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOworICAgICAgbWluID0gMDsKKyAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKKwlyZXR2YWwgPSAxOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgIEZJTEUgKnN0cmVhbTsKK3sKKyAgZnByaW50ZihzdHJlYW0sIF8oIkQxMFYgb3B0aW9uczpcblwKKy1PICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLiAgV2lsbCBkbyBzb21lIG9wZXJhdGlvbnMgaW4gcGFyYWxsZWwuXG4iKSk7Cit9IAorCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ08nOgorICAgICAgLyogT3B0aW1pemUuIFdpbGwgYXR0ZW1wdCB0byBwYXJhbGxlbGl6ZSBvcGVyYXRpb25zICovCisgICAgICBPcHRpbWl6aW5nID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX05PV0FSTlNXQVA6CisgICAgICBmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgIGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiAwOworfQorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCisgKi8KK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGludCB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07CisgIGNoYXIgKnQ7CisgIGludCBpOworICAKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKKyAgICB9CisKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisgIAorICAqc2l6ZVAgPSBwcmVjICogMjsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7CisJICBsaXRQICs9IDI7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICBiZmQgKmFiZmQ7CisgIGFzZWN0aW9uICpzZWM7CisgIGZyYWdTICpmcmFnUDsKK3sKKyAgYWJvcnQgKCk7Cit9CisKK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQorICAgICBhc2VjdGlvbiAqc2VnOworICAgICB2YWx1ZVQgYWRkcjsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOworICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKK30KKworCit2b2lkCittZF9iZWdpbiAoKQoreworICBjaGFyICpwcmV2X25hbWUgPSAiIjsKKyAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7CisgIGQxMHZfaGFzaCA9IGhhc2hfbmV3KCk7CisKKyAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgRDEwdiBpbnN0cnVjdGlvbiBzZXQKKyAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKKyAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bworICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCisKKyAgZm9yIChvcGNvZGUgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3Bjb2RlLT5uYW1lKSkKKwl7CisJICBwcmV2X25hbWUgPSAoY2hhciAqKW9wY29kZS0+bmFtZTsKKwkgIGhhc2hfaW5zZXJ0IChkMTB2X2hhc2gsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKKwl9CisgICAgfQorCisgIGZpeHVwcyA9ICZGaXhVcHNbMF07CisgIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKKyAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOworfQorCisKKy8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50CisgICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KKworc3RhdGljIGludCBwb3N0Zml4IChwKSAKKyAgICAgY2hhciAqcDsKK3sKKyAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAorICAgIHsKKyAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJykgCisJYnJlYWs7CisgICAgICBwKys7CisgICAgfQorCisgIGlmICgqcCA9PSAnLScpIAorICAgIHsKKyAgICAgICpwID0gJyAnOworICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICBpZiAoKnAgPT0gJysnKSAKKyAgICB7CisgICAgICAqcCA9ICcgJzsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorCisgIHJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAKK2dldF9yZWxvYyAob3ApIAorICAgICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcDsKK3sKKyAgaW50IGJpdHMgPSBvcC0+Yml0czsKKworICBpZiAoYml0cyA8PSA0KSAKKyAgICByZXR1cm4gKDApOworICAgICAgCisgIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpIAorICAgIHsKKyAgICAgIGlmIChiaXRzID09IDgpCisJcmV0dXJuIChCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMKTsKKyAgICB9CisKKyAgcmV0dXJuIChCRkRfUkVMT0NfMTYpOworfQorCisKKy8qIGdldF9vcGVyYW5kcyBwYXJzZXMgYSBzdHJpbmcgb2Ygb3BlcmFuZHMgYW5kIHJldHVybnMKKyAgIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zICovCisKK3N0YXRpYyBpbnQKK2dldF9vcGVyYW5kcyAoZXhwKSAKKyAgICAgZXhwcmVzc2lvblMgZXhwW107Cit7CisgIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGludCBudW1vcHMgPSAwOworICBpbnQgcG9zdCA9IDA7CisKKyAgd2hpbGUgKCpwKSAgCisgICAgeworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCisJcCsrOworICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKKwlicmVhazsKKyAgICAgIAorICAgICAgaWYgKCpwID09ICdAJykgCisJeworCSAgcCsrOworCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OworCSAgaWYgKCpwID09ICcoJykgCisJICAgIHsKKwkgICAgICBwKys7CisJICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFBBUjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnAgPT0gJy0nKSAKKwkgICAgeworCSAgICAgIHArKzsKKwkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUTUlOVVM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRTSUdOOworCSAgICAgIHBvc3QgPSBwb3N0Zml4IChwKTsKKwkgICAgfQorCSAgbnVtb3BzKys7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmICgqcCA9PSAnKScpIAorCXsKKwkgIC8qIGp1c3Qgc2tpcCB0aGUgdHJhaWxpbmcgcGFyZW4gKi8KKwkgIHArKzsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKKworICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgbmFtZSAqLworICAgICAgaWYgKCFyZWdpc3Rlcl9uYW1lICgmZXhwW251bW9wc10pKQorCXsKKwkgIC8qIHBhcnNlIGFzIGFuIGV4cHJlc3Npb24gKi8KKwkgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7CisJfQorCisgICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkgPT0gMCkKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKKwkgIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9fcmVnaXN0ZXIpCisJICAgIHsKKwkgICAgICAvKiBpZiBpdCBsb29rZWQgbGlrZSBhIHJlZ2lzdGVyIG5hbWUgYnV0IHdhcyBmb2xsb3dlZCBieQorICAgICAgICAgICAgICAgICAiQHdvcmQiIHRoZW4gaXQgd2FzIHJlYWxseSBhIHN5bWJvbCwgc28gY2hhbmdlIGl0IHRvCisgICAgICAgICAgICAgICAgIG9uZSAqLworCSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3N5bWJvbDsKKwkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKWV4cFtudW1vcHNdLlhfb3Bfc3ltYm9sKTsKKwkgICAgfQorCisJICAvKiBjaGVjayBmb3IgaWRlbnRpZmllckB3b3JkK2NvbnN0YW50ICovCisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCisJICB7CisJICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKKwkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOworCSAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKKwkgIH0KKworCSAgLyogY29udmVydCBleHByIGludG8gYSByaWdodCBzaGlmdCBieSBBVF9XT1JEX1JJR0hUX1NISUZUICovCisJICB7CisJICAgIGV4cHJlc3Npb25TIG5ld19leHA7CisJICAgIG1lbXNldCAoJm5ld19leHAsIDAsIHNpemVvZiBuZXdfZXhwKTsKKwkgICAgbmV3X2V4cC5YX2FkZF9udW1iZXIgPSBBVF9XT1JEX1JJR0hUX1NISUZUOworCSAgICBuZXdfZXhwLlhfb3AgPSBPX2NvbnN0YW50OworCSAgICBuZXdfZXhwLlhfdW5zaWduZWQgPSAxOworCSAgICBleHBbbnVtb3BzXS5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZuZXdfZXhwKTsKKwkgICAgZXhwW251bW9wc10uWF9vcCA9IE9fcmlnaHRfc2hpZnQ7CisJICB9CisKKwkgIGtub3cgKEFUX1dPUkRfUCAoJmV4cFtudW1vcHNdKSk7CisJfQorICAgICAgCisgICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAorCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOworICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCisJYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisKKyAgICAgIG51bW9wcysrOworICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgc3dpdGNoIChwb3N0KSAKKyAgICB7CisgICAgY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCisgICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7CisgICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLworICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OworICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgZXhwW251bW9wc10uWF9vcCA9IDA7CisgIHJldHVybiAobnVtb3BzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2QxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIHZhbHVlLCBsZWZ0LCBmaXgpIAorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCBvcF90eXBlOworICAgICBvZmZzZXRUIHZhbHVlOworICAgICBpbnQgbGVmdDsKKyAgICAgZml4UyAqZml4OworeworICBpbnQgc2hpZnQsIGJpdHM7CisKKyAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wX3R5cGVdLnNoaWZ0OworICBpZiAobGVmdCkKKyAgICBzaGlmdCArPSAxNTsKKworICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5iaXRzOworCisgIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KKyAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5mbGFncykpCisgICAgYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksIHZhbHVlKTsKKworICB2YWx1ZSAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOworICBpbnNuIHw9ICh2YWx1ZSA8PCBzaGlmdCk7CisKKyAgcmV0dXJuIGluc247Cit9CisKKworLyogYnVpbGRfaW5zbiB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlCisgICBhbmQgdGhlIGFycmF5IG9mIG9wZXJhbmQgZXhwcmVzc2lvbnMgYW5kIHJldHVybnMgdGhlIGluc3RydWN0aW9uICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitidWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKSAKKyAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7CisgICAgIGV4cHJlc3Npb25TICpvcGVyczsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworeworICBpbnQgaSwgYml0cywgc2hpZnQsIGZsYWdzLCBmb3JtYXQ7CisgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOworICAKKyAgLyogdGhlIGluc24gYXJndW1lbnQgaXMgb25seSB1c2VkIGZvciB0aGUgRElWUyBrbHVkZ2UgKi8KKyAgaWYgKGluc24pCisgICAgZm9ybWF0ID0gTE9OR19SOworICBlbHNlCisgICAgeworICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOworICAgICAgZm9ybWF0ID0gb3Bjb2RlLT5mb3JtYXQ7CisgICAgfQorICAKKyAgZm9yIChpPTA7b3Bjb2RlLT5vcGVyYW5kc1tpXTtpKyspIAorICAgIHsKKyAgICAgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKKyAgICAgIGJpdHMgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmJpdHM7CisgICAgICBzaGlmdCA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uc2hpZnQ7CisgICAgICBudW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7CisKKyAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKSAKKwl7CisJICBudW1iZXIgJj0gUkVHSVNURVJfTUFTSzsKKwkgIGlmIChmb3JtYXQgPT0gTE9OR19MKQorCSAgICBzaGlmdCArPSAxNTsKKwl9CisKKyAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50KSAKKwl7CisJICAvKiBub3cgY3JlYXRlIGEgZml4dXAgKi8KKworCSAgaWYgKGZpeHVwcy0+ZmMgPj0gTUFYX0lOU05fRklYVVBTKQorCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOworCisJICBpZiAoQVRfV09SRF9QICgmb3BlcnNbaV0pKQorCSAgICB7CisJICAgICAgLyogUmVjb25pemUgWFhYPj4xK04gYWthIFhYWEB3b3JkK04gYXMgc3BlY2lhbCAoQVRfV09SRCkgKi8KKwkgICAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IEJGRF9SRUxPQ19EMTBWXzE4OworCSAgICAgIG9wZXJzW2ldLlhfb3AgPSBPX3N5bWJvbDsKKwkgICAgICBvcGVyc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7IC8qIFNob3VsZCBmcmVlIGl0ICovCisJICAgICAgLyogbnVtYmVyIGlzIGxlZnQgc2hpZnRlZCBieSBBVF9XT1JEX1JJR0hUX1NISUZUIHNvCisgICAgICAgICAgICAgICAgIHRoYXQsIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBMYXRlciwKKyAgICAgICAgICAgICAgICAgQkZEX1JFTE9DX0QxMFZfMTggd2lsbCByaWdodCBzaGlmdCAoc3ltYm9sX3ZhbHVlICsKKyAgICAgICAgICAgICAgICAgWF9hZGRfbnVtYmVyKS4gKi8KKwkgICAgICBudW1iZXIgPDw9IEFUX1dPUkRfUklHSFRfU0hJRlQ7CisJICAgICAgb3BlcnNbaV0uWF9hZGRfbnVtYmVyID0gbnVtYmVyOworCSAgICB9CisJICBlbHNlCisJICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCisJICAgICAgZ2V0X3JlbG9jKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0pOworCisJICBpZiAoZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPT0gQkZEX1JFTE9DXzE2IHx8IAorCSAgICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQorCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5zaXplID0gMjsgCSAgICAKKwkgIGVsc2UKKwkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7CisgCSAgICAKKwkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLmV4cCA9IG9wZXJzW2ldOworCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ub3BlcmFuZCA9IG9wY29kZS0+b3BlcmFuZHNbaV07CisJICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IChmbGFncyAmIE9QRVJBTkRfQUREUikgPyB0cnVlIDogZmFsc2U7CisJICAoZml4dXBzLT5mYykrKzsKKwl9CisKKyAgICAgIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgIGlmICgob3BlcnNbaV0uWF9vcCA9PSBPX2NvbnN0YW50KSAmJiBjaGVja19yYW5nZSAobnVtYmVyLCBiaXRzLCBmbGFncykpCisJYXNfYmFkIChfKCJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiKSxudW1iZXIpOworICAgICAgbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7CisgICAgICBpbnNuID0gaW5zbiB8IChudW1iZXIgPDwgc2hpZnQpOworICAgIH0KKworICAvKiBrbHVkZ2U6IGZvciBESVZTLCB3ZSBuZWVkIHRvIHB1dCB0aGUgb3BlcmFuZHMgaW4gdHdpY2UgKi8KKyAgLyogb24gdGhlIHNlY29uZCBwYXNzLCBmb3JtYXQgaXMgY2hhbmdlZCB0byBMT05HX1IgdG8gZm9yY2UgKi8KKyAgLyogdGhlIHNlY29uZCBzZXQgb2Ygb3BlcmFuZHMgdG8gbm90IGJlIHNoaWZ0ZWQgb3ZlciAxNSAqLworICBpZiAoKG9wY29kZS0+b3Bjb2RlID09IE9QQ09ERV9ESVZTKSAmJiAoZm9ybWF0PT1MT05HX0wpKQorICAgIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKTsKKyAgICAgIAorICByZXR1cm4gaW5zbjsKK30KKworLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCitzdGF0aWMgdm9pZAord3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCisgICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOworICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIEZpeHVwcyAqZng7Cit7CisgIGludCBpLCB3aGVyZTsKKyAgY2hhciAqZiA9IGZyYWdfbW9yZSg0KTsKKworICBpbnNuIHw9IEZNMTE7CisgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDQpOworCisgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAorICAgIHsKKyAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQorCXsgCisJICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCisJICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCisJICAgIHdoZXJlICs9IDI7CisKKwkgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQorCSAgICBmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKKworCSAgZml4X25ld19leHAgKGZyYWdfbm93LAorCQkgICAgICAgd2hlcmUsCisJCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCisJCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKKwkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCisJCSAgICAgICBmeC0+Zml4W2ldLm9wZXJhbmR8MjA0OCk7CisJfQorICAgIH0KKyAgZngtPmZjID0gMDsKK30KKworCisvKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZiAqLworc3RhdGljIHZvaWQKK3dyaXRlXzFfc2hvcnQgKG9wY29kZSwgaW5zbiwgZngpIAorICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBGaXh1cHMgKmZ4OworeworICBjaGFyICpmID0gZnJhZ19tb3JlKDQpOworICBpbnQgaSwgd2hlcmU7CisKKyAgaWYgKG9wY29kZS0+ZXhlY190eXBlICYgUEFST05MWSkKKyAgICBhc19mYXRhbCAoXygiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIikpOworCisgIC8qIHRoZSBvdGhlciBjb250YWluZXIgbmVlZHMgdG8gYmUgTk9QICovCisgIC8qIGFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZCBvbmx5CisgICAgIGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLworICBpZiAob3Bjb2RlLT51bml0ID09IElVKQorICAgIGluc24gfD0gRk0wMCB8IChOT1AgPDwgMTUpOwkJLyogcmlnaHQgY29udGFpbmVyICovCisgIGVsc2UKKyAgICBpbnNuID0gRk0wMCB8IChpbnNuIDw8IDE1KSB8IE5PUDsJLyogbGVmdCBjb250YWluZXIgKi8KKworICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKKyAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCisgICAgeworICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCisJeyAKKwkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKKwkgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKKwkgICAgd2hlcmUgKz0gMjsKKworCSAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCisJICAgIGZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAorCisJICAvKiBpZiBpdCdzIGFuIFIgcmVsb2MsIHdlIG1heSBoYXZlIHRvIHN3aXRjaCBpdCB0byBMICovCisJICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChvcGNvZGUtPnVuaXQgIT0gSVUpICkKKwkgICAgZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7CisKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIHdoZXJlLCAKKwkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKKwkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAorCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKKwkJICAgICAgIGZ4LT5maXhbaV0ub3BlcmFuZHwyMDQ4KTsKKwl9CisgICAgfQorICBmeC0+ZmMgPSAwOworfQorCisvKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlICovCisvKiByZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQgKi8KK3N0YXRpYyBpbnQKK3dyaXRlXzJfc2hvcnQgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlLCBmeCkgCisgICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgKm9wY29kZTI7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOworICAgICBpbnQgZXhlY190eXBlOworICAgICBGaXh1cHMgKmZ4OworeworICB1bnNpZ25lZCBsb25nIGluc247CisgIGNoYXIgKmY7CisgIGludCBpLGosIHdoZXJlOworCisgIGlmICggKGV4ZWNfdHlwZSAhPSAxKSAmJiAoKG9wY29kZTEtPmV4ZWNfdHlwZSAmIFBBUk9OTFkpCisJICAgICAgICAgICAgICAgIHx8IChvcGNvZGUyLT5leGVjX3R5cGUgJiBQQVJPTkxZKSkpCisgICAgYXNfZmF0YWwgKF8oIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7CisgIAorICBpZiAoIChvcGNvZGUxLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgfHwgKG9wY29kZTItPmZvcm1hdCAmIExPTkdfT1BDT0RFKSkKKyAgICBhc19mYXRhbCAoXygiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iKSk7CisKKyAgaWYob3Bjb2RlMS0+ZXhlY190eXBlICYgQlJBTkNIX0xJTksgJiYgZXhlY190eXBlID09IDApCisgICAgeworICAgICAgLyogSW5zdHJ1Y3Rpb25zIHBhaXJlZCB3aXRoIGEgc3Vicm91dGluZSBjYWxsIGFyZSBleGVjdXRlZCBiZWZvcmUgdGhlCisJIHN1YnJvdXRpbmUsIHNvIGRvbid0IGRvIHRoZXNlIHBhaXJpbmdzIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCisgICAgICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisKKyAgc3dpdGNoIChleGVjX3R5cGUpIAorICAgIHsKKyAgICBjYXNlIDA6CS8qIG9yZGVyIG5vdCBzcGVjaWZpZWQgKi8KKyAgICAgIGlmICggT3B0aW1pemluZyAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQorCXsKKwkgIC8qIHBhcmFsbGVsICovCisJICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKKwkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7CisJICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VKQorCSAgICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCisJICAgICAgZnggPSBmeC0+bmV4dDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpIAorCXsKKwkgIC8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLworCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHNlcXVlbnRpYWwgKi8KKwkgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOworCSAgZnggPSBmeC0+bmV4dDsgIAorCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToJLyogcGFyYWxsZWwgKi8KKyAgICAgIGlmIChvcGNvZGUxLT5leGVjX3R5cGUgJiBTRVEgfHwgb3Bjb2RlMi0+ZXhlY190eXBlICYgU0VRKQorCWFzX2ZhdGFsIChfKCJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIikpOworCisgICAgICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKKwl7CisJICBpZiAob3Bjb2RlMi0+dW5pdCA9PSBJVSkKKwkgICAgYXNfZmF0YWwgKF8oIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKKyAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCisJICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOworIAkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOworCX0KKyAgICAgIGVsc2UgaWYgKG9wY29kZTItPnVuaXQgPT0gTVUpCisJeworCSAgaWYgKG9wY29kZTEtPnVuaXQgPT0gTVUpCisJICAgIGFzX2ZhdGFsIChfKCJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7CisgICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQorCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKKwkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAorCSAgZnggPSBmeC0+bmV4dDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CS8qIHNlcXVlbnRpYWwgKi8KKyAgICAgIGlmIChvcGNvZGUxLT51bml0ICE9IElVKQorCWluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCisgICAgICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VIHx8IG9wY29kZTItPnVuaXQgPT0gRUlUSEVSKQorCXsKKyAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCisJICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOworCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7ICAKKwl9CisgICAgICBlbHNlCisJYXNfZmF0YWwgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOworICAgICAgZnggPSBmeC0+bmV4dDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCisgICAgICBpZiAob3Bjb2RlMi0+dW5pdCAhPSBNVSkKKwlpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsKKyAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUgfHwgb3Bjb2RlMS0+dW5pdCA9PSBFSVRIRVIpCisJeworICAgICAgICAgIGlmICghZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCkKKwkgICAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7CisJICBpbnNuID0gRk0wMSB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsgIAorCX0KKyAgICAgIGVsc2UKKwlhc19mYXRhbCAoXygiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIikpOworICAgICAgZnggPSBmeC0+bmV4dDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc19mYXRhbCAoXygidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIikpOworICAgIH0KKworICBmID0gZnJhZ19tb3JlKDQpOworICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKKworICBmb3IgKGo9MDsgajwyOyBqKyspIAorICAgIHsKKyAgICAgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAorCXsKKwkgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQorCSAgICB7CisJICAgICAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAorCSAgICAgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKKwkJd2hlcmUgKz0gMjsKKwkgICAgICAKKwkgICAgICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChqID09IDApICkKKwkJZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7CisJICAgICAgCisJICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCisJCWZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAorCisJICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAorCQkJICAgd2hlcmUsIAorCQkJICAgZngtPmZpeFtpXS5zaXplLAorCQkJICAgJihmeC0+Zml4W2ldLmV4cCksCisJCQkgICBmeC0+Zml4W2ldLnBjcmVsLAorCQkJICAgZngtPmZpeFtpXS5vcGVyYW5kfDIwNDgpOworCSAgICB9CisJfQorICAgICAgZngtPmZjID0gMDsKKyAgICAgIGZ4ID0gZngtPm5leHQ7CisgICAgfQorICByZXR1cm4gKDApOworfQorCisKKy8qIENoZWNrIDIgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBjYW4gYmUgc2FmZWx5ICovCisvKiBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIFJldHVybnMgMSBpZiB0aGV5IGNhbiBiZS4gICAgICAgICAqLworc3RhdGljIGludAorcGFyYWxsZWxfb2sgKG9wMSwgaW5zbjEsIG9wMiwgaW5zbjIsIGV4ZWNfdHlwZSkKKyAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDEsICpvcDI7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOworICAgICBpbnQgZXhlY190eXBlOworeworICBpbnQgaSwgaiwgZmxhZ3MsIG1hc2ssIHNoaWZ0LCByZWdubzsKKyAgdW5zaWduZWQgbG9uZyBpbnMsIG1vZFsyXSwgdXNlZFsyXTsKKyAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKKworICBpZiAoKG9wMS0+ZXhlY190eXBlICYgU0VRKSAhPSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFNFUSkgIT0gMAorICAgICAgfHwgKG9wMS0+ZXhlY190eXBlICYgUEFSKSA9PSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFBBUikgPT0gMAorICAgICAgfHwgKG9wMS0+dW5pdCA9PSBCT1RIKSB8fCAob3AyLT51bml0ID09IEJPVEgpCisgICAgICB8fCAob3AxLT51bml0ID09IElVICYmIG9wMi0+dW5pdCA9PSBJVSkKKyAgICAgIHx8IChvcDEtPnVuaXQgPT0gTVUgJiYgb3AyLT51bml0ID09IE1VKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBJZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYW5kIHRoaXMgaXMgYXV0byBwYXJhbGxhemF0aW9uLAorICAgICBkb24ndCBjb21iaW5lIHdpdGggYW55IHNlY29uZCBpbnN0cnVjdGlvbi4gICovCisgIGlmIChleGVjX3R5cGUgPT0gMCAmJiAob3AxLT5leGVjX3R5cGUgJiBCUkFOQ0gpICE9IDApCisgICAgcmV0dXJuIDA7CisKKyAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgdHdvIHNldHMgb2YgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkKKyAgICAgd2hpY2ggaW5kaWNhdGUgd2hpY2ggcmVnaXN0ZXJzIGFyZSBtb2RpZmllZCBvciB1c2VkIGJ5IGVhY2gKKyAgICAgaW5zdHJ1Y3Rpb24uICBUaGUgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIGRvbmUgaW4gcGFyYWxsZWwgaWYKKyAgICAgaW5zdHJ1Y3Rpb24gMSBhbmQgaW5zdHJ1Y3Rpb24gMiBtb2RpZnkgZGlmZmVyZW50IHJlZ2lzdGVycywgYW5kCisgICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtb2RpZnkgcmVnaXN0ZXJzIHRoYXQgdGhlIHNlY29uZAorICAgICBpcyB1c2luZyAoVGhlIHNlY29uZCBpbnN0cnVjdGlvbiBjYW4gbW9kaWZ5IHJlZ2lzdGVycyB0aGF0IHRoZQorICAgICBmaXJzdCBpcyB1c2luZyBhcyB0aGV5IGFyZSBvbmx5IHdyaXR0ZW4gYmFjayBhZnRlciB0aGUgZmlyc3QKKyAgICAgaW5zdHJ1Y3Rpb24gaGFzIGNvbXBsZXRlZCkuICBBY2Nlc3NlcyB0byBjb250cm9sIHJlZ2lzdGVycywgUFNXLAorICAgICBhbmQgbWVtb3J5IGFyZSB0cmVhdGVkIGFzIGFjY2Vzc2VzIHRvIGEgc2luZ2xlIHJlZ2lzdGVyLiAgU28gaWYKKyAgICAgYm90aCBpbnN0cnVjdGlvbnMgd3JpdGUgbWVtb3J5IG9yIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3cml0ZXMKKyAgICAgbWVtb3J5IGFuZCB0aGUgc2Vjb25kIHJlYWRzLCB0aGVuIHRoZXkgY2Fubm90IGJlIGRvbmUgaW4KKyAgICAgcGFyYWxsZWwuICBMaWtld2lzZSwgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIG11Y2tzIHdpdGggdGhlIHBzdworICAgICBhbmQgdGhlIHNlY29uZCByZWFkcyB0aGUgUFNXICh3aGljaCBpbmNsdWRlcyBDLCBGMCwgYW5kIEYxKSwgdGhlbgorICAgICB0aGV5IGNhbm5vdCBvcGVyYXRlIHNhZmVseSBpbiBwYXJhbGxlbC4gKi8KKworICAvKiB0aGUgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkgbG9vayBsaWtlIHRoaXMgKGJpdCAzMSA9IE1TQikgKi8KKyAgLyogcjAtcjE1CSAgMC0xNSAgKi8KKyAgLyogYTAtYTEJICAxNi0xNyAqLworICAvKiBjciAobm90IHBzdykgMTggICAgKi8KKyAgLyogcHN3CSAgMTkgICAgKi8KKyAgLyogbWVtCSAgMjAgICAgKi8KKworICBmb3IgKGo9MDtqPDI7aisrKQorICAgIHsKKyAgICAgIGlmIChqID09IDApCisJeworCSAgb3AgPSBvcDE7CisJICBpbnMgPSBpbnNuMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgb3AgPSBvcDI7CisJICBpbnMgPSBpbnNuMjsKKwl9CisgICAgICBtb2Rbal0gPSB1c2VkW2pdID0gMDsKKyAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgQlJBTkNIX0xJTkspCisJbW9kW2pdIHw9IDEgPDwgMTM7CisKKyAgICAgIGZvciAoaSA9IDA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQorCXsKKwkgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLmZsYWdzOworCSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uc2hpZnQ7CisJICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uYml0cyk7CisJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKKwkgICAgeworCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiBtYXNrOworCSAgICAgIGlmIChmbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKKwkJcmVnbm8gKz0gMTY7CisJICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCS8qIG12dGMgb3IgbXZmYyAqLworCQl7IAorCQkgIGlmIChyZWdubyA9PSAwKQorCQkgICAgcmVnbm8gPSAxOTsKKwkJICBlbHNlCisJCSAgICByZWdubyA9IDE4OyAKKwkJfQorCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgKE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBRykpCisJCXJlZ25vID0gMTk7CisJICAgICAgCisJICAgICAgaWYgKCBmbGFncyAmIE9QRVJBTkRfREVTVCApCisJCXsKKwkJICBtb2Rbal0gfD0gMSA8PCByZWdubzsKKwkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0VWRU4pCisJCSAgICBtb2Rbal0gfD0gMSA8PCAocmVnbm8gKyAxKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHVzZWRbal0gfD0gMSA8PCByZWdubyA7CisJCSAgaWYgKGZsYWdzICYgT1BFUkFORF9FVkVOKQorCQkgICAgdXNlZFtqXSB8PSAxIDw8IChyZWdubyArIDEpOworCisJCSAgLyogQXV0byBpbmMvZGVjIGFsc28gbW9kaWZpZXMgdGhlIHJlZ2lzdGVyLiAgKi8KKwkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gIT0gMAorCQkgICAgICAmJiAoZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MKKwkJCSAgJiAoT1BFUkFORF9QTFVTIHwgT1BFUkFORF9NSU5VUykpICE9IDApCisJCSAgICBtb2Rbal0gfD0gMSA8PCByZWdubzsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKKwkgICAgeworCSAgICAgIC8qIFNQIGltcGxpY2l0bHkgdXNlZC9tb2RpZmllZCAqLworCSAgICAgIG1vZFtqXSB8PSAxIDw8IDE1OworCSAgICAgIHVzZWRbal0gfD0gMSA8PCAxNTsKKwkgICAgfQorCX0KKyAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgUk1FTSkKKwl1c2VkW2pdIHw9IDEgPDwgMjA7CisgICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgV01FTSkKKwltb2Rbal0gfD0gMSA8PCAyMDsKKyAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBSRjApCisJdXNlZFtqXSB8PSAxIDw8IDE5OworICAgICAgZWxzZSBpZiAob3AtPmV4ZWNfdHlwZSAmIFdGMCkKKwltb2Rbal0gfD0gMSA8PCAxOTsKKyAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBXQ0FSKQorCW1vZFtqXSB8PSAxIDw8IDE5OworICAgIH0KKyAgaWYgKChtb2RbMF0gJiBtb2RbMV0pID09IDAgJiYgKG1vZFswXSAmIHVzZWRbMV0pID09IDApCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKKyAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKKyAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDEwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCisgICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2luc247CitzdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpwcmV2X29wY29kZSA9IDA7CitzdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKK3N0YXRpYyBzZWdUIHByZXZfc2VnID0gMDs7CitzdGF0aWMgaW50IGV0eXBlID0gMDsJCS8qIHNhdmVkIGV4dHlwZS4gIHVzZWQgZm9yIG11bHRpbGluZSBpbnN0cnVjdGlvbnMgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKiBvcGNvZGU7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgaW50IGV4dHlwZSA9IDA7CQkvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwsIGV0YyAqLworICBjaGFyICogc3RyMjsKKworICBpZiAoZXR5cGUgPT0gMCkKKyAgICB7CisgICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCisgICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOworICAgICAgaWYgKHN0cjIpIAorCWV4dHlwZSA9IDE7CisgICAgICBlbHNlCisJeworCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKKwkgIGlmIChzdHIyKSAKKwkgICAgZXh0eXBlID0gMjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIjwtIik7CisJICAgICAgaWYgKHN0cjIpIAorCQlleHR5cGUgPSAzOworCSAgICB9CisJfQorICAgICAgLyogc3RyMiBwb2ludHMgdG8gdGhlIHNlcGFyYXRvciwgaWYgb25lICovCisgICAgICBpZiAoc3RyMikgCisJeworCSAgKnN0cjIgPSAwOworCSAgCisJICAvKiBpZiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBwcmVzZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgb25lIHNhdmVkCisJICAgICB0aGVuIGZpcnN0IHdyaXRlIGl0IG91dCAqLworCSAgZDEwdl9jbGVhbnVwICgpOworCSAgCisJICAvKiBhc3NlbWJsZSBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgc2F2ZSBpdCAqLworCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlKTsKKwkgIGlmIChwcmV2X2luc24gPT0gLTEpCisJICAgIGFzX2ZhdGFsIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7CisJICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7CisJICBzdHIgPSBzdHIyICsgMjsKKwl9CisgICAgfQorCisgIGluc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmb3Bjb2RlKTsKKyAgaWYgKGluc24gPT0gLTEpCisgICAgeworICAgICAgaWYgKGV4dHlwZSkKKwl7CisJICBldHlwZSA9IGV4dHlwZTsKKwkgIHJldHVybjsKKwl9CisgICAgICBhc19mYXRhbCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOworICAgIH0KKworICBpZiAoZXR5cGUpCisgICAgeworICAgICAgZXh0eXBlID0gZXR5cGU7CisgICAgICBldHlwZSA9IDA7CisgICAgfQorCisgIC8qIGlmIHRoaXMgaXMgYSBsb25nIGluc3RydWN0aW9uLCB3cml0ZSBpdCBhbmQgYW55IHByZXZpb3VzIHNob3J0IGluc3RydWN0aW9uICovCisgIGlmIChvcGNvZGUtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAKKyAgICB7CisgICAgICBpZiAoZXh0eXBlKSAKKwlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOworICAgICAgZDEwdl9jbGVhbnVwICgpOworICAgICAgd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmaXh1cHMpOworICAgICAgcHJldl9vcGNvZGUgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGlmIChwcmV2X29wY29kZSAmJiBwcmV2X3NlZyAmJiAoKHByZXZfc2VnICE9IG5vd19zZWcpIHx8IChwcmV2X3N1YnNlZyAhPSBub3dfc3Vic2VnKSkpCisgICAgZDEwdl9jbGVhbnVwKCk7CisgIAorICBpZiAocHJldl9vcGNvZGUgJiYgKHdyaXRlXzJfc2hvcnQgKHByZXZfb3Bjb2RlLCBwcmV2X2luc24sIG9wY29kZSwgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKKyAgICB7CisgICAgICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KKyAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXh0eXBlKSAKKwlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOworICAgICAgLyogc2F2ZSBvZmYgbGFzdCBpbnN0cnVjdGlvbiBzbyBpdCBtYXkgYmUgcGFja2VkIG9uIG5leHQgcGFzcyAqLworICAgICAgcHJldl9vcGNvZGUgPSBvcGNvZGU7CisgICAgICBwcmV2X2luc24gPSBpbnNuOworICAgICAgcHJldl9zZWcgPSBub3dfc2VnOworICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOworICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OworICAgIH0KK30KKworCisvKiBkb19hc3NlbWJsZSBhc3NlbWJsZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybnMgYW4gb3Bjb2RlICovCisvKiBpdCByZXR1cm5zIC0xIChhbiBpbnZhbGlkIG9wY29kZSkgb24gZXJyb3IgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2RvX2Fzc2VtYmxlIChzdHIsIG9wY29kZSkgCisgICAgIGNoYXIgKnN0cjsKKyAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlOworeworICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydCwgKnNhdmU7CisgIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKKyAgY2hhciBuYW1lWzIwXTsKKyAgaW50IG5sZW4gPSAwOworICBleHByZXNzaW9uUyBteW9wc1s2XTsKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworCisgIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIC8qIEZpbmQgdGhlIG9wY29kZSBlbmQuICAqLworICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gKHVuc2lnbmVkIGNoYXIgKikgKHN0cik7CisgICAgICAgKm9wX2VuZAorICAgICAgICYmIG5sZW4gPCAyMAorICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKKyAgICAgICBvcF9lbmQrKykKKyAgICB7CisgICAgICBuYW1lW25sZW5dID0gdG9sb3dlciAob3Bfc3RhcnRbbmxlbl0pOworICAgICAgbmxlbisrOworICAgIH0KKyAgbmFtZVtubGVuXSA9IDA7CisKKyAgaWYgKG5sZW4gPT0gMCkKKyAgICByZXR1cm4gLTE7CisgIAorICAvKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUuICAqLworICAqb3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWhhc2hfZmluZCAoZDEwdl9oYXNoLCBuYW1lKTsKKyAgaWYgKCpvcGNvZGUgPT0gTlVMTCkKKyAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKKworICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7CisgICpvcGNvZGUgPSBmaW5kX29wY29kZSAoKm9wY29kZSwgbXlvcHMpOworICBpZiAoKm9wY29kZSA9PSAwKQorICAgIHJldHVybiAtMTsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKKworICBpbnNuID0gYnVpbGRfaW5zbiAoKCpvcGNvZGUpLCBteW9wcywgMCk7IAorICByZXR1cm4gKGluc24pOworfQorCisvKiBGaW5kIHRoZSBzeW1ib2wgd2hpY2ggaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiBleHByZXNzaW9uLiAgKi8KK3N0YXRpYyBzeW1ib2xTICoKK2ZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIChleHApCisgICAgIGV4cHJlc3Npb25TICogZXhwOworeworICBpbnQgaTsKKyAgCisgIGlmIChleHAtPlhfb3AgIT0gT19yZWdpc3RlcikKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIC8qIEZpbmQgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KKyAgZm9yIChpID0gZDEwdl9yZWdfbmFtZV9jbnQgKCk7IGktLTspCisgICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLnZhbHVlID09IGV4cC0+WF9hZGRfbnVtYmVyKQorICAgICAgYnJlYWs7CisKKyAgaWYgKGkgPCAwKQorICAgIGFib3J0ICgpOworCisgIC8qIE5vdyBzZWUgaWYgYSBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLworICByZXR1cm4gc3ltYm9sX2ZpbmQgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLm5hbWUpOworfQorCisKKy8qIGZpbmRfb3Bjb2RlKCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZS4gICAgICAgKi8KKy8qIEl0IG11c3QgbG9vayBhdCBhbGwgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHVzZSB0aGUgb3BlcmFuZHMgKi8KKy8qIHRvIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKgorZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpCisgICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOworICAgICBleHByZXNzaW9uUyBteW9wc1tdOworeworICBpbnQgaSwgbWF0Y2gsIGRvbmU7CisgIHN0cnVjdCBkMTB2X29wY29kZSAqbmV4dF9vcGNvZGU7CisKKyAgLyogZ2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucyAqLworICBnZXRfb3BlcmFuZHMgKG15b3BzKTsKKworICAvKiBub3cgc2VlIGlmIHRoZSBvcGVyYW5kIGlzIGEgZmFrZS4gIElmIHNvLCBmaW5kIHRoZSBjb3JyZWN0IHNpemUgKi8KKyAgLyogaW5zdHJ1Y3Rpb24sIGlmIHBvc3NpYmxlICovCisgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBPUENPREVfRkFLRSkKKyAgICB7CisgICAgICBpbnQgb3BudW0gPSBvcGNvZGUtPm9wZXJhbmRzWzBdOworICAgICAgaW50IGZsYWdzOworCQkJIAorICAgICAgaWYgKG15b3BzW29wbnVtXS5YX29wID09IE9fcmVnaXN0ZXIpCisJeworCSAgbXlvcHNbb3BudW1dLlhfb3AgPSBPX3N5bWJvbDsKKwkgIG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW29wbnVtXS5YX29wX3N5bWJvbCk7CisJICBteW9wc1tvcG51bV0uWF9hZGRfbnVtYmVyID0gMDsKKwkgIG15b3BzW29wbnVtXS5YX29wX3N5bWJvbCA9IE5VTEw7CisJfQorCisgICAgICBuZXh0X29wY29kZT1vcGNvZGUrMTsKKworICAgICAgLyogSWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3RlciwgbWFrZSBzdXJlCisJIHdlIGdvdCBhIHZhbGlkIG9uZS4gICovCisgICAgICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbbmV4dF9vcGNvZGUtPm9wZXJhbmRzWzBdXS5mbGFnczsKKyAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQorCXsKKwkgIGludCBYX29wID0gbXlvcHNbMF0uWF9vcDsKKwkgIGludCBudW0gPSBteW9wc1swXS5YX2FkZF9udW1iZXI7CisKKwkgIGlmIChYX29wICE9IE9fcmVnaXN0ZXIKKwkgICAgICB8fCAobnVtICYgfmZsYWdzCisJCSAgJiAoT1BFUkFORF9HUFIgfCBPUEVSQU5EX0FDQzAgfCBPUEVSQU5EX0FDQzEKKwkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHIHwgT1BFUkFORF9DT05UUk9MKSkpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChteW9wc1tvcG51bV0uWF9vcCA9PSBPX2NvbnN0YW50IHx8IChteW9wc1tvcG51bV0uWF9vcCA9PSBPX3N5bWJvbCAmJgorCSAgU19JU19ERUZJTkVEKG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wpICYmCisJICAoU19HRVRfU0VHTUVOVChteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnKSkpCisJeworCSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaSsxXTsgaSsrKQorCSAgICB7CisJICAgICAgaW50IGJpdHMgPSBkMTB2X29wZXJhbmRzW25leHRfb3Bjb2RlLT5vcGVyYW5kc1tvcG51bV1dLmJpdHM7CisJICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tuZXh0X29wY29kZS0+b3BlcmFuZHNbb3BudW1dXS5mbGFnczsKKwkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpCisJCWJpdHMgKz0gMjsKKwkgICAgICBpZiAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19jb25zdGFudCkKKwkJeworCQkgIGlmICghY2hlY2tfcmFuZ2UgKG15b3BzW29wbnVtXS5YX2FkZF9udW1iZXIsIGJpdHMsIGZsYWdzKSkKKwkJICAgIHJldHVybiBuZXh0X29wY29kZTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGZyYWdTICpmOworCQkgIGxvbmcgdmFsdWU7CisJCSAgLyogY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZSBwcmV2aW91cyBmcmFncyAqLworCQkgIC8qIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0ICovCisJCSAgZm9yICh2YWx1ZSA9IDAsIGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKKwkJICAgIHZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKKworCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUREUikKKwkJICAgIHZhbHVlID0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZSAtCisJCSAgICAgIChvYnN0YWNrX25leHRfZnJlZSgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7CisJCSAgZWxzZQorCQkgICAgdmFsdWUgPSBTX0dFVF9WQUxVRShteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKTsKKworCQkgIGlmIChBVF9XT1JEX1AgKCZteW9wc1tvcG51bV0pKQorCQkgICAgeworCQkgICAgICBpZiAoYml0cyA+IDQpCisJCQl7CisJCQkgIGJpdHMgKz0gMjsKKwkJCSAgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKKwkJCSAgICByZXR1cm4gbmV4dF9vcGNvZGU7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZSBpZiAoIWNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKQorCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOworCQl9CisJICAgICAgbmV4dF9vcGNvZGUrKzsKKwkgICAgfQorCSAgYXNfZmF0YWwgKF8oInZhbHVlIG91dCBvZiByYW5nZSIpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogbm90IGEgY29uc3RhbnQsIHNvIHVzZSBhIGxvbmcgaW5zdHJ1Y3Rpb24gKi8gICAgCisJICByZXR1cm4gb3Bjb2RlKzI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1hdGNoID0gMDsKKyAgICAgIC8qIG5vdyBzZWFyY2ggdGhlIG9wY29kZSB0YWJsZSB0YWJsZSBmb3Igb25lIHdpdGggb3BlcmFuZHMgKi8KKyAgICAgIC8qIHRoYXQgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdCAqLworICAgICAgd2hpbGUgKCFtYXRjaCkKKwl7CisJICBtYXRjaCA9IDE7CisJICBmb3IgKGkgPSAwOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAorCSAgICB7CisJICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKKwkgICAgICBpbnQgWF9vcCA9IG15b3BzW2ldLlhfb3A7CisJICAgICAgaW50IG51bSA9IG15b3BzW2ldLlhfYWRkX251bWJlcjsKKworCSAgICAgIGlmIChYX29wID09IDApCisJCXsKKwkJICBtYXRjaCA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICAKKwkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKKwkJeworCQkgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKQorCQkgICAgICB8fCAobnVtICYgfmZsYWdzCisJCQkgICYgKE9QRVJBTkRfR1BSIHwgT1BFUkFORF9BQ0MwIHwgT1BFUkFORF9BQ0MxCisJCQkgICAgIHwgT1BFUkFORF9GRkxBRyB8IE9QRVJBTkRfQ0ZMQUcKKwkJCSAgICAgfCBPUEVSQU5EX0NPTlRST0wpKSkKKwkJICAgIHsKKwkJICAgICAgbWF0Y2ggPSAwOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICAgIAorCSAgICAgIGlmICgoKGZsYWdzICYgT1BFUkFORF9NSU5VUykgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9NSU5VUykpKSB8fAorCQkgICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpICAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX1BMVVMpKSkgfHwKKwkJICAoKGZsYWdzICYgT1BFUkFORF9BVE1JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVE1JTlVTKSkpIHx8CisJCSAgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRQQVIpKSkgfHwKKwkJICAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVFNJR04pKSkpCisJCXsKKwkJICBtYXRjaCA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICAKKwkgICAgICAvKiBVbmZvcnR1bmF0bHksIGZvciB0aGUgaW5kaXJlY3Qgb3BlcmFuZCBpbiBpbnN0cnVjdGlvbnMgc3VjaCBhcworCQkgYGBsZGIgcjEsIEAoYyxyMTQpJycgdGhpcyBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIFhfb3AgPT0gT19yZWdpc3RlcgorCQkgKGJlY2F1c2UgJ2MnIGlzIGEgdmFsaWQgcmVnaXN0ZXIgbmFtZSkuICBIb3dldmVyIHdlIGNhbm5vdCBqdXN0CisJCSBpZ25vcmUgdGhlIGNhc2Ugd2hlbiBYX29wID09IE9fcmVnaXN0ZXIgYnV0IGZsYWdzICYgT1BFUkFORF9SRUcgaXMKKwkJIG51bGwsIHNvIHdlIGNoZWNrIHRvIHNlZSBpZiBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZWdpc3RlcgorCQkgZXhpc3RzLiAgSWYgdGhlIHN5bWJvbCBkb2VzIGV4aXN0LCB0aGVuIHRoZSBwYXJzZXIgd2FzIHVuYWJsZSB0bworCQkgZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyBhbmQgd2UgZml4IHRoaW5ncyBoZXJlLiAgKFJlZjogUFIxNDgyNikgKi8KKwkgICAgICAKKwkgICAgICBpZiAoIShmbGFncyAmIE9QRVJBTkRfUkVHKSAmJiAoWF9vcCA9PSBPX3JlZ2lzdGVyKSkKKwkJeworCQkgIHN5bWJvbFMgKiBzeW07CisJCSAgCisJCSAgc3ltID0gZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIgKCYgbXlvcHNbaV0pOworCQkgIAorCQkgIGlmIChzeW0gIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgbXlvcHMgW2ldLlhfb3AgPT0gWF9vcCA9PSBPX3N5bWJvbDsKKwkJICAgICAgbXlvcHMgW2ldLlhfYWRkX3N5bWJvbCA9IHN5bTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBhc19iYWQKKwkJICAgICAgKF8oImlsbGVnYWwgb3BlcmFuZCAtIHJlZ2lzdGVyIG5hbWUgZm91bmQgd2hlcmUgbm9uZSBleHBlY3RlZCIpKTsKKwkJfQorCSAgICB9CisJICAKKwkgIC8qIFdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCisJICAgICBhcmUgbm8gbW9yZSB0byBjaGVjay4gICovCisJICBpZiAobWF0Y2ggJiYgbXlvcHNbaV0uWF9vcCA9PSAwKSAKKwkgICAgYnJlYWs7CisJICBlbHNlCisJICAgIG1hdGNoID0gMDsKKworCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOworCSAgCisJICBpZiAobmV4dF9vcGNvZGUtPm9wY29kZSA9PSAwKSAKKwkgICAgYnJlYWs7CisJICAKKwkgIGlmIChzdHJjbXAgKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQorCSAgICBicmVhazsKKwkgIAorCSAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7CisJfQorICAgIH0KKworICBpZiAoIW1hdGNoKSAgCisgICAgeworICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhhdCBhbGwgcmVnaXN0ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIGV2ZW4gYXJlLiAqLworICAvKiBBbHNvLCBpZiBhbnkgb3BlcmFuZHMgd2VyZSBtYXJrZWQgYXMgcmVnaXN0ZXJzLCBidXQgd2VyZSByZWFsbHkgc3ltYm9scyAqLworICAvKiBmaXggdGhhdCBoZXJlLiAqLworICBmb3IgKGk9MDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKKyAgICB7CisgICAgICBpZiAoKGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBPUEVSQU5EX0VWRU4pICYmCisJICAobXlvcHNbaV0uWF9hZGRfbnVtYmVyICYgMSkpIAorCWFzX2ZhdGFsIChfKCJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIikpOworICAgICAgaWYgKG15b3BzW2ldLlhfb3AgPT0gT19yZWdpc3RlcikKKwl7CisJICBpZiAoIShkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgT1BFUkFORF9SRUcpKSAKKwkgICAgeworCSAgICAgIG15b3BzW2ldLlhfb3AgPSBPX3N5bWJvbDsKKwkgICAgICBteW9wc1tpXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW2ldLlhfb3Bfc3ltYm9sKTsKKwkgICAgICBteW9wc1tpXS5YX2FkZF9udW1iZXIgPSAwOworCSAgICAgIG15b3BzW2ldLlhfb3Bfc3ltYm9sID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiBvcGNvZGU7Cit9CisKKy8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLworLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgCithcmVsZW50ICoKK3RjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQorICAgICBhc2VjdGlvbiAqc2VnOworICAgICBmaXhTICpmaXhwOworeworICBhcmVsZW50ICpyZWxvYzsKKyAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKyAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKyAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7CisgIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisgICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9vZmZzZXQ7CisKKyAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKKworICByZXR1cm4gcmVsb2M7Cit9CisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCisgICAgIGZyYWdTICpmcmFncDsKKyAgICAgYXNlY3Rpb24gKnNlZzsKK3sKKyAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfSAKKworbG9uZworbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCisgICAgIGZpeFMgKmZpeHA7CisgICAgIHNlZ1Qgc2VjOworeworICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKilOVUxMICYmICghU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkgfHwKKyAgICAgIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Cit9CisKK2ludAorbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCisgICAgIGZpeFMgKmZpeHA7CisgICAgIHZhbHVlVCAqdmFsdWVwOworICAgICBzZWdUIHNlZzsKK3sKKyAgY2hhciAqd2hlcmU7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgbG9uZyB2YWx1ZTsKKyAgaW50IG9wX3R5cGU7CisgIGludCBsZWZ0PTA7CisKKyAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCisgICAgeworICAgICAgdmFsdWUgPSAqdmFsdWVwOworICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKKyAgICB2YWx1ZSA9ICp2YWx1ZXA7CisgIGVsc2UKKyAgICB7CisgICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKKyAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorCXsKKwkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLworIAkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgb3BfdHlwZSA9IGZpeHAtPmZ4X3JfdHlwZTsKKyAgaWYgKG9wX3R5cGUgJiAyMDQ4KQorICAgIHsKKyAgICAgIG9wX3R5cGUgLT0gMjA0ODsKKyAgICAgIGlmIChvcF90eXBlICYgMTAyNCkKKwl7CisJICBvcF90eXBlIC09IDEwMjQ7CisJICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MOworCSAgbGVmdCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAob3BfdHlwZSAmIDQwOTYpCisJeworCSAgb3BfdHlwZSAtPSA0MDk2OworCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QxMFZfMTg7CisJfQorICAgICAgZWxzZQorCWZpeHAtPmZ4X3JfdHlwZSA9IGdldF9yZWxvYygoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wX3R5cGVdKTsgCisgICAgfQorCisgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCisgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLworICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKKyAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKworICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MOgorICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUjoKKyAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMOgorICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTg6CisgICAgICAvKiBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgYXJlIGFsd2F5cyByaWdodC1zaGlmdGVkIGJ5IDIgKi8KKyAgICAgIHZhbHVlID4+PSBBVF9XT1JEX1JJR0hUX1NISUZUOworICAgICAgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKKwliZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGVsc2UKKwl7CisJICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKnJlcCwgKnJlcGk7CisKKwkgIHJlcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKikgaGFzaF9maW5kIChkMTB2X2hhc2gsICJyZXAiKTsKKwkgIHJlcGkgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopIGhhc2hfZmluZCAoZDEwdl9oYXNoLCAicmVwaSIpOworCSAgaWYgKChpbnNuICYgRk0xMSkgPT0gRk0xMQorCSAgICAgICYmIChyZXBpICE9IE5VTEwgJiYgKGluc24gJiByZXBpLT5tYXNrKSA9PSByZXBpLT5vcGNvZGUKKwkJICB8fCByZXAgIT0gTlVMTCAmJiAoaW5zbiAmIHJlcC0+bWFzaykgPT0gcmVwLT5vcGNvZGUpCisJICAgICAgJiYgdmFsdWUgPCA0KQorCSAgICBhc19mYXRhbAorCSAgICAgIChfKCJsaW5lICVkOiByZXAgb3IgcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMiKSwKKwkgICAgICAgZml4cC0+ZnhfbGluZSk7CisJICBpbnNuID0gZDEwdl9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BfdHlwZSwgKG9mZnNldFQpdmFsdWUsIGxlZnQsIGZpeHApOworCSAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsgIAorCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18xNjoKKyAgICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CisgICAgICBmaXhwLT5meF9kb25lID0gMDsKKyAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2ZhdGFsIChfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLGZpeHAtPmZ4X2xpbmUsZml4cC0+Znhfcl90eXBlKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBkMTB2X2NsZWFudXAoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgaW5wdXQgCisgICBmaWxlIG9yIGFmdGVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEJlY2F1c2UgdGhlIEQxMFYgYXNzZW1ibGVyIHNvbWV0aW1lcyBzYXZlcyBzaG9ydCAKKyAgIGluc3RydWN0aW9ucyB0byBzZWUgaWYgaXQgY2FuIHBhY2thZ2UgdGhlbSB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uLCB0aGVyZSBtYXkKKyAgIGJlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBuZWVkcyB3cml0dGVuLiAgKi8KK2ludAorZDEwdl9jbGVhbnVwICgpCit7CisgIHNlZ1Qgc2VnOworICBzdWJzZWdUIHN1YnNlZzsKKworICBpZiAocHJldl9vcGNvZGUgJiYgZXR5cGUgPT0gMCkKKyAgICB7CisgICAgICBzZWcgPSBub3dfc2VnOworICAgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKKyAgICAgIGlmIChwcmV2X3NlZykKKwlzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOworICAgICAgd3JpdGVfMV9zaG9ydCAocHJldl9vcGNvZGUsIHByZXZfaW5zbiwgZml4dXBzLT5uZXh0KTsKKyAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKKyAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBMaWtlIG5vcm1hbCAud29yZCwgZXhjZXB0IHN1cHBvcnQgQHdvcmQgKi8KKy8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzIGVuZC1vZi1saW5lLiAqLworc3RhdGljIHZvaWQKK2QxMHZfZG90X3dvcmQgKG5ieXRlcykKKyAgICAgcmVnaXN0ZXIgaW50IG5ieXRlczsJLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLworeworICBleHByZXNzaW9uUyBleHA7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKKyAgY2hhciAqcDsKKyAgaW50IG9mZnNldDsKKworICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKKyAgICB7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBkbworICAgIHsKKyAgICAgIGV4cHJlc3Npb24gKCZleHApOworICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQHdvcmQiLCA1KSkKKwl7CisJICBleHAuWF9hZGRfbnVtYmVyID0gMDsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OworCQorCSAgcCA9IGZyYWdfbW9yZSAoMik7CisJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgCisJCSAgICAgICAmZXhwLCAwLCBCRkRfUkVMT0NfRDEwVl8xOCk7CisJfQorICAgICAgZWxzZQorCWVtaXRfZXhwciAoJmV4cCwgMik7CisgICAgfQorICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisKKy8qIE1pdHN1YmlzaGkgYXNrZWQgdGhhdCB3ZSBzdXBwb3J0IHNvbWUgb2xkIHN5bnRheCB0aGF0IGFwcGFyZW50bHkgKi8KKy8qIGhhZCBpbW1lZGlhdGUgb3BlcmFuZHMgc3RhcnRpbmcgd2l0aCAnIycuICBUaGlzIGlzIGluIHNvbWUgb2YgdGhlaXIgKi8KKy8qIHNhbXBsZSBjb2RlIGJ1dCBpcyBub3QgZG9jdW1lbnRlZCAoYWx0aG91Z2ggaXQgYXBwZWFycyBpbiBzb21lICAqLworLyogZXhhbXBsZXMgaW4gdGhlaXIgYXNzZW1ibGVyIG1hbnVhbCkuIEZvciBub3csIHdlJ2xsIHNvbHZlIHRoaXMgKi8KKy8qIGNvbXBhdGliaWxpdHkgcHJvYmxlbSBieSBzaW1wbHkgaWdub3JpbmcgYW55ICcjJyBhdCB0aGUgYmVnaW5uaW5nICovCisvKiBvZiBhbiBvcGVyYW5kLiAqLworCisvKiBvcGVyYW5kcyB0aGF0IGJlZ2luIHdpdGggJyMnIHNob3VsZCBmYWxsIHRocm91Z2ggdG8gaGVyZSAqLworLyogZnJvbSBleHByLmMgKi8KKwordm9pZCAKK21kX29wZXJhbmQgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Cit7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKKyAgICB9Cit9CisKK2Jvb2xlYW4KK2QxMHZfZml4X2FkanVzdGFibGUgKGZpeFApCisgICBmaXhTICpmaXhQOworeworCisgIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQorICAgIHJldHVybiAxOworICAKKyAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCisgIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLworICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorZDEwdl9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQorICAgICAgc3RydWN0IGZpeCAqZml4cDsKK3sKKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmggYi9nYXMvY29uZmlnL3RjLWQxMHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZmZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1kMTB2LmgKQEAgLTAsMCArMSw2MiBAQAorLyogdGMtZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1kMTB2LmMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjZGVmaW5lIFRDX0QxMFYKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICNlcnJvciBEMTBWIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgorI2VuZGlmCisKKy8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCisjZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2QxMHYKKworI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1kMTB2IgorCisjZGVmaW5lIE1EX0FQUExZX0ZJWDMKKworLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCisjZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCisKKy8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLworI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisjZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KKworLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisjZGVmaW5lIG1kX251bWJlcl90b19jaGFycyAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgorCitpbnQgZDEwdl9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKKyNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJICAgICBkMTB2X2NsZWFudXAoKQorI2RlZmluZSBtZF9jbGVhbnVwKCkJCSAgICAgZDEwdl9jbGVhbnVwKCkKKyNkZWZpbmUgbWRfZG9fYWxpZ24oYSxiLGMsZCxlKQkgICAgIGQxMHZfY2xlYW51cCgpCisjZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBkbyB7XAorICBkMTB2X2NsZWFudXAoKTsgXAorICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBkMTB2X2ZpeF9hZGp1c3RhYmxlKGZpeFApCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZDEwdl9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCitleHRlcm4gaW50IGQxMHZfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmMgYi9nYXMvY29uZmlnL3RjLWQzMHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAzM2JhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1kMzB2LmMKQEAgLTAsMCArMSwyMjE4IEBACisvKiB0Yy1kMzB2LmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNaXRzdWJpc2hpIEQzMFYKKworICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAorI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiCisKK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk9uTmNDIjsKK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7CisKKyNkZWZpbmUgTk9QX01VTFRJUExZIDEKKyNkZWZpbmUgTk9QX0FMTCAyCitzdGF0aWMgaW50IHdhcm5fbm9wcyA9IDA7CitzdGF0aWMgaW50IE9wdGltaXppbmcgPSAwOworc3RhdGljIGludCB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMTsKKworI2RlZmluZSBGT1JDRV9TSE9SVAkxCisjZGVmaW5lIEZPUkNFX0xPTkcJMgorCisvKiBFWEVDIHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bSBfZXhlY190eXBlCit7CisgIEVYRUNfVU5LTk9XTiwJCQkvKiBubyBvcmRlciBzcGVjaWZpZWQgKi8KKyAgRVhFQ19QQVJBTExFTCwJCS8qIGRvbmUgaW4gcGFyYWxsZWwgKEZNPTAwKSAqLworICBFWEVDX1NFUSwJCQkvKiBzZXF1ZW50aWFsIChGTT0wMSkgKi8KKyAgRVhFQ19SRVZTRVEJCQkvKiByZXZlcnNlIHNlcXVlbnRpYWwgKEZNPTEwKSAqLworfSBleGVjX3R5cGVfZW51bTsKKworLyogZml4dXBzICovCisjZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKK3N0cnVjdCBkMzB2X2ZpeHVwCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgaW50IG9wZXJhbmQ7CisgIGludCBwY3JlbDsKKyAgaW50IHNpemU7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKK307CisKK3R5cGVkZWYgc3RydWN0IF9maXh1cHMKK3sKKyAgaW50IGZjOworICBzdHJ1Y3QgZDMwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKKyAgc3RydWN0IF9maXh1cHMgKm5leHQ7Cit9IEZpeHVwczsKKworc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07CitzdGF0aWMgRml4dXBzICpmaXh1cHM7CisKKy8qIFdoZXRoZXIgY3VycmVudCBhbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gYXJlIHdvcmQgbXVsdGlwbHkgaW5zbnMuICAqLworc3RhdGljIGludCBjdXJfbXVsMzJfcCA9IDA7CitzdGF0aWMgaW50IHByZXZfbXVsMzJfcCA9IDA7CisKKy8qICBUaGUgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsIGlzIHRydWUgaWZmIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQKKyAgICBoYXMgYmVlbiBleHBsaWNpdGx5IHdyaXR0ZW4gYXMgYSBwYXJhbGxlbCBzaG9ydC1pbnN0cnVjdGlvbiBwYWlyIGJ5IHRoZQorICAgIGh1bWFuIHByb2dyYW1tZXIuICBJdCBpcyB1c2VkIGluIHBhcmFsbGVsX29rKCkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgIHRob3NlIGRhbmdlcm91cyBwYXJhbGxlbGl6YXRpb25zIGF0dGVtcHRlZCBieSB0aGUgaHVtYW4sIHdoaWNoIGFyZSB0byBiZQorICAgIGFsbG93ZWQsIGFuZCB0aG9zZSBhdHRlbXB0ZWQgYnkgdGhlIGFzc2VtYmxlciwgd2hpY2ggYXJlIG5vdC4gIEl0IGlzIHNldAorICAgIGZyb20gbWRfYXNzZW1ibGUoKS4gICovCitzdGF0aWMgaW50IGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7IAorc3RhdGljIGludCBmbGFnX3hwX3N0YXRlID0gMDsKKworLyogV2hldGhlciBjdXJyZW50IGFuZCBwcmV2aW91cyBsZWZ0IHN1Yi1pbnN0cnVjdGlvbiBkaXNhYmxlcworICAgZXhlY3V0aW9uIG9mIHJpZ2h0IHN1Yi1pbnN0cnVjdGlvbi4gICovCitzdGF0aWMgaW50IGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOworc3RhdGljIGludCBwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7CisKKy8qIFRoZSBrbm93biBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KK3N0YXRpYyBpbnQgZDMwdl9jdXJyZW50X2FsaWduOworc3RhdGljIHNlZ1QgZDMwdl9jdXJyZW50X2FsaWduX3NlZzsKKworLyogVGhlIGxhc3Qgc2VlbiBsYWJlbCBpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIHRvIGF1dG8tYWxpZ24KKyAgIGxhYmVscyBwcmVjZWVkaW5nIGluc3RydWN0aW9ucy4gICovCitzdGF0aWMgc3ltYm9sUyAqZDMwdl9sYXN0X2xhYmVsOworCisvKiBUd28gbm9wcyAqLworI2RlZmluZSBOT1BfTEVGVCAgICgobG9uZyBsb25nKSBOT1AgPDwgMzIpCisjZGVmaW5lIE5PUF9SSUdIVCAgKChsb25nIGxvbmcpIE5PUCkKKyNkZWZpbmUgTk9QMiAoRk0wMCB8IE5PUF9MRUZUIHwgTk9QX1JJR0hUKQorCisvKiBsb2NhbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKK3N0YXRpYyBpbnQgY2hlY2tfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKK3N0YXRpYyBpbnQgcG9zdGZpeCBQQVJBTVMgKChjaGFyICpwKSk7CitzdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcCwgaW50IHJlbF9mbGFnKSk7CitzdGF0aWMgaW50IGdldF9vcGVyYW5kcyBQQVJBTVMgKChleHByZXNzaW9uUyBleHBbXSwgaW50IGNtcF9oYWNrKSk7CitzdGF0aWMgc3RydWN0IGQzMHZfZm9ybWF0ICpmaW5kX2Zvcm1hdCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wY29kZSwgCisJCQlleHByZXNzaW9uUyBvcHNbXSxpbnQgZnNpemUsIGludCBjbXBfaGFjaykpOworc3RhdGljIGxvbmcgbG9uZyBidWlsZF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgZXhwcmVzc2lvblMgKm9wZXJzKSk7CitzdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgbG9uZyBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKK3N0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBsb25nIGxvbmcgaW5zbiwKKwkJCQkgICBGaXh1cHMgKmZ4LCBpbnQgdXNlX3NlcXVlbnRpYWwpKTsKK3N0YXRpYyBpbnQgd3JpdGVfMl9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUxLCBsb25nIGxvbmcgaW5zbjEsIAorCQkgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUyLCBsb25nIGxvbmcgaW5zbjIsIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZSwgRml4dXBzICpmeCkpOworc3RhdGljIGxvbmcgbG9uZyBkb19hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwKKwkJCQkgICAgICBpbnQgc2hvcnRwLCBpbnQgaXNfcGFyYWxsZWwpKTsKK3N0YXRpYyBpbnQgcGFyYWxsZWxfb2sgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCisJCQkJc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKKwkJCQlleGVjX3R5cGVfZW51bSBleGVjX3R5cGUpKTsKK3N0YXRpYyB2b2lkIGQzMHZfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyBsb25nIHZhbHVlLCBpbnQgbmJ5dGVzKSk7CitzdGF0aWMgdm9pZCBjaGVja19zaXplIFBBUkFNUyAoKGxvbmcgdmFsdWUsIGludCBiaXRzLCBjaGFyICpmaWxlLCBpbnQgbGluZSkpOworc3RhdGljIHZvaWQgZDMwdl9hbGlnbiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgc3ltYm9sUyAqKSk7CitzdGF0aWMgdm9pZCBzX2QzMHZfYWxpZ24gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2QzMHZfdGV4dCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfZDMwdl9kYXRhIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19kMzB2X3NlY3Rpb24gUEFSQU1TICgoaW50KSk7CisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgICAgICAgCisKKworLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyAid29yZCIsIGNvbnMsIDQgfSwKKyAgeyAiaHdvcmQiLCBjb25zLCAyIH0sCisgIHsgImFsaWduIiwgc19kMzB2X2FsaWduLCAwIH0sCisgIHsgInRleHQiLCBzX2QzMHZfdGV4dCwgMCB9LAorICB7ICJkYXRhIiwgc19kMzB2X2RhdGEsIDAgfSwKKyAgeyAic2VjdGlvbiIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCisgIHsgInNlY3Rpb24ucyIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCisgIHsgInNlY3QiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAorICB7ICJzZWN0LnMiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAorICB7IE5VTEwsIE5VTEwsIDAgfQorfTsKKworLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmQzMHZfaGFzaDsKKworLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMKKyAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgorICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCisKK3N0YXRpYyBpbnQKK3JlZ19uYW1lX3NlYXJjaCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaW50IG1pZGRsZSwgbG93LCBoaWdoOworICBpbnQgY21wOworCisgIGxvdyA9IDA7CisgIGhpZ2ggPSByZWdfbmFtZV9jbnQgKCkgLSAxOworCisgIGRvCisgICAgeworICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLm5hbWUpOworICAgICAgaWYgKGNtcCA8IDApCisJaGlnaCA9IG1pZGRsZSAtIDE7CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCWxvdyA9IG1pZGRsZSArIDE7CisgICAgICBlbHNlCisJeworCSAgaWYgKHN5bWJvbF9maW5kIChuYW1lKSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMpCisJCWFzX3dhcm4gKF8oIlJlZ2lzdGVyIG5hbWUgJXMgY29uZmxpY3RzIHdpdGggc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUiKSwKKwkJCSBuYW1lKTsKKwkgICAgfQorICAKKwkgIHJldHVybiBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS52YWx1ZTsKKwl9CisgICAgfQorICB3aGlsZSAobG93IDw9IGhpZ2gpOworICAKKyAgcmV0dXJuIC0xOworfQorCisvKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCisgICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lLiAgKi8KKworc3RhdGljIGludAorcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCisgICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKK3sKKyAgaW50IHJlZ19udW1iZXI7CisgIGNoYXIgYywgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIAorICB3aGlsZSAoKnAgJiYgKnAhPSdcbicgJiYgKnAhPSdccicgJiYgKnAgIT0nLCcgJiYgKnAhPScgJyAmJiAqcCE9JyknKQorICAgIHArKzsKKworICBjID0gKnA7CisgIGlmIChjKQorICAgICpwKysgPSAwOworCisgIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCisgIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGlucHV0X2xpbmVfcG9pbnRlcik7CisgIGlmIChyZWdfbnVtYmVyID49IDApIAorICAgIHsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKKyAgICAgIC8qIHRlbXBvcmFyaWx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGhlcmUgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IChzdHJ1Y3Qgc3ltYm9sICopaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoYykKKyAgICAqKHAtMSkgPSBjOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitjaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykKKyAgICAgdW5zaWduZWQgbG9uZyBudW07CisgICAgIGludCBiaXRzOworICAgICBpbnQgZmxhZ3M7Cit7CisgIGxvbmcgbWluLCBtYXg7CisgIGludCByZXR2YWw9MDsKKworICAvKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgMzItYml0IHZhbHVlcyAqLworICBpZiAoYml0cyA9PSAzMikKKyAgICByZXR1cm4gMDsKKworICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQorICAgIHsKKyAgICAgIC8qIFdlIGtub3cgdGhhdCBhbGwgc2hpZnRzIGFyZSByaWdodCBieSB0aHJlZSBiaXRzLi4uLiAqLworICAgICAgCisgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKKwludW0gPSAodW5zaWduZWQgbG9uZykgKCgoLypzaWduZWQqLyBsb25nKSBudW0pID4+IDMpOworICAgICAgZWxzZQorCW51bSA+Pj0gMzsKKyAgICB9CisKKyAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCisgICAgeworICAgICAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSktMTsgCisgICAgICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOworICAgICAgaWYgKCgobG9uZyludW0gPiBtYXgpIHx8ICgobG9uZyludW0gPCBtaW4pKQorCXJldHZhbCA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOworICAgICAgbWluID0gMDsKKyAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKKwlyZXR2YWwgPSAxOworICAgIH0KKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICBGSUxFICpzdHJlYW07Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXG5EMzBWIG9wdGlvbnM6XG5cCistTyAgICAgICAgICAgICAgICAgICAgICBNYWtlIGFkamFjZW50IHNob3J0IGluc3RydWN0aW9ucyBwYXJhbGxlbCBpZiBwb3NzaWJsZS5cblwKKy1uICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgYWxsIE5PUHMgaW5zZXJ0ZWQgYnkgdGhlIGFzc2VtYmxlci5cblwKKy1OCQkJV2FybiBhYm91dCBOT1BzIGluc2VydGVkIGFmdGVyIHdvcmQgbXVsdGlwbGllcy5cblwKKy1jICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgc3ltYm9scyB3aG9lcyBuYW1lcyBtYXRjaCByZWdpc3RlciBuYW1lcy5cblwKKy1DICAgICAgICAgICAgICAgICAgICAgIE9wcG9zaXRlIG9mIC1DLiAgLWMgaXMgdGhlIGRlZmF1bHQuXG4iKSk7Cit9CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgICAvKiBPcHRpbWl6ZS4gV2lsbCBhdHRlbXB0IHRvIHBhcmFsbGVsaXplIG9wZXJhdGlvbnMgKi8KKyAgICBjYXNlICdPJzoKKyAgICAgIE9wdGltaXppbmcgPSAxOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFdhcm4gYWJvdXQgYWxsIE5PUFMgdGhhdCB0aGUgYXNzZW1ibGVyIGluc2VydHMuICAqLworICAgIGNhc2UgJ24nOgorICAgICAgd2Fybl9ub3BzID0gTk9QX0FMTDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBXYXJuIGFib3V0IHRoZSBOT1BTIHRoYXQgdGhlIGFzc2VtYmxlciBpbnNlcnRzIGJlY2F1c2Ugb2YgdGhlCisJIG11bHRpcGx5IGhhemFyZC4gICovCisgICAgY2FzZSAnTic6CisgICAgICB3YXJuX25vcHMgPSBOT1BfTVVMVElQTFk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2MnOgorICAgICAgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0MnOgorICAgICAgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDA7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgIGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiAwOworfQorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCisgKi8KK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGludCB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07CisgIGNoYXIgKnQ7CisgIGludCBpOworICAKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKKyAgICB9CisKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisgIAorICAqc2l6ZVAgPSBwcmVjICogMjsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7CisJICBsaXRQICs9IDI7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICBiZmQgKmFiZmQ7CisgIGFzZWN0aW9uICpzZWM7CisgIGZyYWdTICpmcmFnUDsKK3sKKyAgYWJvcnQgKCk7Cit9CisKK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQorICAgICBhc2VjdGlvbiAqc2VnOworICAgICB2YWx1ZVQgYWRkcjsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOworICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKK30KKworCit2b2lkCittZF9iZWdpbiAoKQoreworICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKiBvcGNvZGU7CisgIGQzMHZfaGFzaCA9IGhhc2hfbmV3ICgpOworCisgIC8qIEluc2VydCBvcGNvZGUgbmFtZXMgaW50byBhIGhhc2ggdGFibGUuICovCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWQzMHZfb3Bjb2RlX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgICAgaGFzaF9pbnNlcnQgKGQzMHZfaGFzaCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOworCisgIGZpeHVwcyA9ICZGaXhVcHNbMF07CisgIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKKyAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOworCisgIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOworfQorCisKKy8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50CisgICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KKworc3RhdGljIGludCBwb3N0Zml4IChwKSAKKyAgICAgY2hhciAqcDsKK3sKKyAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAorICAgIHsKKyAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJyB8fCAqcD09JyAnIHx8ICpwPT0nLCcpIAorCWJyZWFrOworICAgICAgcCsrOworICAgIH0KKworICBpZiAoKnAgPT0gJy0nKSAKKyAgICB7CisgICAgICAqcCA9ICcgJzsKKyAgICAgIHJldHVybiAoLTEpOworICAgIH0KKyAgaWYgKCpwID09ICcrJykgCisgICAgeworICAgICAgKnAgPSAnICc7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KKworICByZXR1cm4gKDApOworfQorCisKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgCitnZXRfcmVsb2MgKG9wLCByZWxfZmxhZykgCisgICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wOworICAgICBpbnQgcmVsX2ZsYWc7Cit7CisgIHN3aXRjaCAob3AtPmJpdHMpCisgICAgeworICAgIGNhc2UgNjoKKyAgICAgIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQorCXJldHVybiBCRkRfUkVMT0NfRDMwVl85X1BDUkVMOworICAgICAgZWxzZQorCXJldHVybiBCRkRfUkVMT0NfRDMwVl82OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgIGlmICghKG9wLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpKQorCWFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgMTItYml0IHJlbG9jIHR5cGUiKSk7CisgICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCisJcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMOworICAgICAgZWxzZQorCXJldHVybiBCRkRfUkVMT0NfRDMwVl8xNTsKKyAgICBjYXNlIDE4OgorICAgICAgaWYgKCEob3AtPmZsYWdzICYgT1BFUkFORF9TSElGVCkpCisJYXNfd2FybiAoXygidW5leHBlY3RlZCAxOC1iaXQgcmVsb2MgdHlwZSIpKTsKKyAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKKwlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMjFfUENSRUw7CisgICAgICBlbHNlCisJcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzIxOworICAgIGNhc2UgMzI6CisgICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCisJcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMOworICAgICAgZWxzZQorCXJldHVybiBCRkRfUkVMT0NfRDMwVl8zMjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBnZXRfb3BlcmFuZHMgcGFyc2VzIGEgc3RyaW5nIG9mIG9wZXJhbmRzIGFuZCByZXR1cm5zCisgICBhbiBhcnJheSBvZiBleHByZXNzaW9ucyAqLworCitzdGF0aWMgaW50CitnZXRfb3BlcmFuZHMgKGV4cCwgY21wX2hhY2spIAorICAgICBleHByZXNzaW9uUyBleHBbXTsKKyAgICAgaW50IGNtcF9oYWNrOworeworICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnQgbnVtb3BzID0gMDsKKyAgaW50IHBvc3QgPSAwOworCisgIGlmIChjbXBfaGFjaykKKyAgICB7CisgICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7CisgICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IGNtcF9oYWNrIC0gMTsKKyAgICB9CisKKyAgd2hpbGUgKCpwKSAgCisgICAgeworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCisJcCsrOworICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKKwlicmVhazsKKyAgICAgIAorICAgICAgaWYgKCpwID09ICdAJykgCisJeworCSAgcCsrOworCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OworCSAgaWYgKCpwID09ICcoJykgCisJICAgIHsKKwkgICAgICBwKys7CisJICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFBBUjsKKwkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpwID09ICctJykgCisJICAgIHsKKwkgICAgICBwKys7CisJICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVE1JTlVTOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUU0lHTjsKKwkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7CisJICAgIH0KKwkgIG51bW9wcysrOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoKnAgPT0gJyknKSAKKwl7CisJICAvKiBqdXN0IHNraXAgdGhlIHRyYWlsaW5nIHBhcmVuICovCisJICBwKys7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7CisKKyAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIG5hbWUgKi8KKyAgICAgIGlmICghcmVnaXN0ZXJfbmFtZSAoJmV4cFtudW1vcHNdKSkKKwl7CisJICAvKiBwYXJzZSBhcyBhbiBleHByZXNzaW9uICovCisJICBleHByZXNzaW9uICgmZXhwW251bW9wc10pOworCX0KKworICAgICAgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19pbGxlZ2FsKSAKKwlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKKyAgICAgIGVsc2UgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19hYnNlbnQpIAorCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOworCisgICAgICBudW1vcHMrKzsKKyAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgICAgIHN3aXRjaCAocG9zdCkgCisJeworCWNhc2UgLTE6CS8qIHBvc3RkZWNyZW1lbnQgbW9kZSAqLworCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OworCSAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX01JTlVTOworCSAgYnJlYWs7CisJY2FzZSAxOgkvKiBwb3N0aW5jcmVtZW50IG1vZGUgKi8KKwkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKKwkgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9QTFVTOworCSAgYnJlYWs7CisJfQorICAgICAgcG9zdCA9IDA7CisgICAgfQorCisgIGV4cFtudW1vcHNdLlhfb3AgPSAwOworICByZXR1cm4gKG51bW9wcyk7Cit9CisKKy8qIGJ1aWxkX2luc24gZ2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbi4gIEl0IGRvZXMgZXZlcnl0aGluZyAqLworLyogYnV0IHdyaXRlIHRoZSBGTSBiaXRzLiAqLworCitzdGF0aWMgbG9uZyBsb25nCitidWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzKSAKKyAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOworICAgICBleHByZXNzaW9uUyAqb3BlcnM7Cit7CisgIGludCBpLCBsZW5ndGgsIGJpdHMsIHNoaWZ0LCBmbGFnczsKKyAgdW5zaWduZWQgaW50IG51bWJlciwgaWQ9MDsKKyAgbG9uZyBsb25nIGluc247CisgIHN0cnVjdCBkMzB2X29wY29kZSAqb3AgPSBvcGNvZGUtPm9wOworICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZvcm0gPSBvcGNvZGUtPmZvcm07CisKKyAgaW5zbiA9IG9wY29kZS0+ZWNjIDw8IDI4IHwgb3AtPm9wMSA8PCAyNSB8IG9wLT5vcDIgPDwgMjAgfCBmb3JtLT5tb2RpZmllciA8PCAxODsKKworICBmb3IgKGk9MDsgZm9ybS0+b3BlcmFuZHNbaV07IGkrKykgCisgICAgeyAKKyAgICAgIGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5mbGFnczsKKworICAgICAgLyogbXVzdCBiZSBhIHJlZ2lzdGVyIG9yIG51bWJlciAqLworICAgICAgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX1JFRykgJiYgIShmbGFncyAmIE9QRVJBTkRfTlVNKSAmJiAKKwkgICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpICYmICEoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpKQorCWNvbnRpbnVlOworCisgICAgICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5iaXRzOworICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKKwliaXRzICs9IDM7CisKKyAgICAgIGxlbmd0aCA9IGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ubGVuZ3RoOworICAgICAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247CisgICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3N5bWJvbCkKKwludW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7CisgICAgICBlbHNlCisJbnVtYmVyID0gMDsKKyAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQorCXsKKwkgIC8qIGNoZWNrIGZvciBtdmZzeXMgb3IgbXZ0c3lzIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wgJiYgKG51bWJlciAmIDB4N2YpID4gTUFYX0NPTlRST0xfUkVHKQorCSAgICB7CisJICAgICAgLyogUFNXTCBvciBQU1dIICovCisJICAgICAgaWQgPSAobnVtYmVyICYgMHg3ZikgLSBNQVhfQ09OVFJPTF9SRUc7CisJICAgICAgbnVtYmVyID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAobnVtYmVyICYgT1BFUkFORF9GTEFHKQorCSAgICB7CisJICAgICAgaWQgPSAzOyAgLyogbnVtYmVyIGlzIGEgZmxhZyByZWdpc3RlciAqLworCSAgICB9CisJICBudW1iZXIgJj0gMHg3RjsKKwl9CisgICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkKKwl7CisJICBudW1iZXIgPSBpZDsKKwl9CisKKyAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50ICYmICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpKQorCXsKKwkgIC8qIG5vdyBjcmVhdGUgYSBmaXh1cCAqLworCisJICBpZiAoZml4dXBzLT5mYyA+PSBNQVhfSU5TTl9GSVhVUFMpCisJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisKKwkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCisJICAgIGdldF9yZWxvYyAoKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXSwgb3AtPnJlbG9jX2ZsYWcpOworCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7CisJICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5leHAgPSBvcGVyc1tpXTsKKwkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLm9wZXJhbmQgPSBmb3JtLT5vcGVyYW5kc1tpXTsKKwkgIGlmIChmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMKQorCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IFJFTE9DX1BDUkVMOworCSAgZWxzZQorCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IG9wLT5yZWxvY19mbGFnOworCSAgKGZpeHVwcy0+ZmMpKys7CisJfQorCisgICAgICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCisgICAgICBpZiAoKG9wZXJzW2ldLlhfb3AgPT0gT19jb25zdGFudCkgJiYgY2hlY2tfcmFuZ2UgKG51bWJlciwgYml0cywgZmxhZ3MpKQorCWFzX2JhZCAoXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksbnVtYmVyKTsKKyAgICAgIGlmIChiaXRzIDwgMzEpCisJbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7CisgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQorCW51bWJlciA+Pj0gMzsKKyAgICAgIGlmIChiaXRzID09IDMyKQorCXsKKwkgIC8qIGl0J3MgYSBMT05HIGluc3RydWN0aW9uICovCisJICBpbnNuIHw9IChudW1iZXIgPj4gMjYpOwkvKiB0b3AgNiBiaXRzICovCisJICBpbnNuIDw8PSAzMjsJCQkvKiBzaGlmdCB0aGUgZmlyc3Qgd29yZCBvdmVyICovCisJICBpbnNuIHw9ICgobnVtYmVyICYgMHgwM0ZDMDAwMCkgPDwgMik7ICAvKiBuZXh0IDggYml0cyAqLyAKKwkgIGluc24gfD0gbnVtYmVyICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCisJfQorICAgICAgZWxzZQorCWluc24gfD0gbnVtYmVyIDw8IHNoaWZ0OworICAgIH0KKyAgcmV0dXJuIGluc247Cit9CisKKworLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCitzdGF0aWMgdm9pZAord3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCisgICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKKyAgICAgbG9uZyBsb25nIGluc247CisgICAgIEZpeHVwcyAqZng7Cit7CisgIGludCBpLCB3aGVyZTsKKyAgY2hhciAqZiA9IGZyYWdfbW9yZSAoOCk7CisKKyAgaW5zbiB8PSBGTTExOworICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7CisKKyAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCisgICAgeworICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCisJeyAKKwkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIHdoZXJlLAorCQkgICAgICAgZngtPmZpeFtpXS5zaXplLAorCQkgICAgICAgJihmeC0+Zml4W2ldLmV4cCksCisJCSAgICAgICBmeC0+Zml4W2ldLnBjcmVsLAorCQkgICAgICAgZngtPmZpeFtpXS5yZWxvYyk7CisJfQorICAgIH0KKyAgZngtPmZjID0gMDsKK30KKworCisvKiBXcml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZi4gICovCitzdGF0aWMgdm9pZAord3JpdGVfMV9zaG9ydCAob3Bjb2RlLCBpbnNuLCBmeCwgdXNlX3NlcXVlbnRpYWwpIAorICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7CisgICAgIGxvbmcgbG9uZyBpbnNuOworICAgICBGaXh1cHMgKmZ4OworICAgICBpbnQgdXNlX3NlcXVlbnRpYWw7Cit7CisgIGNoYXIgKmYgPSBmcmFnX21vcmUgKDgpOworICBpbnQgaSwgd2hlcmU7CisKKyAgaWYgKHdhcm5fbm9wcyA9PSBOT1BfQUxMKQorICAgIGFzX3dhcm4gKF8oIiVzIE5PUCBpbnNlcnRlZCIpLCB1c2Vfc2VxdWVudGlhbCA/CisJICAgICBfKCJzZXF1ZW50aWFsIikgOiBfKCJwYXJhbGxlbCIpKTsKKworICAvKiBUaGUgb3RoZXIgY29udGFpbmVyIG5lZWRzIHRvIGJlIE5PUC4gKi8KKyAgaWYgKHVzZV9zZXF1ZW50aWFsKQorICAgIHsKKyAgICAgIC8qIFVzZSBhIHNlcXVlbnRpYWwgTk9QIHJhdGhlciB0aGFuIGEgcGFyYWxsZWwgb25lLAorCSBhcyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBhIEZMQUdfTVVMMzIgdHlwZSBvbmUKKwkgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgbG9hZC4gICovCisgICAgICAKKyAgICAgIC8qIEFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAxLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZAorCSBvbmx5IGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLworICAgICAgCisgICAgICBpZiAob3Bjb2RlLT5vcC0+dW5pdCA9PSBJVSkKKwlpbnNuIHw9IEZNMTAgfCBOT1BfTEVGVDsJLyogcmlnaHQgdGhlbiBsZWZ0ICovCisgICAgICBlbHNlCisJaW5zbiA9IEZNMDEgfCAoaW5zbiA8PCAzMikgfCBOT1BfUklHSFQ7CS8qIGxlZnQgdGhlbiByaWdodCAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZAorCSBvbmx5IGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLworICAgICAgCisgICAgICBpZiAob3Bjb2RlLT5vcC0+dW5pdCA9PSBJVSkKKwlpbnNuIHw9IEZNMDAgfCBOT1BfTEVGVDsJCS8qIHJpZ2h0IGNvbnRhaW5lciAqLworICAgICAgZWxzZQorCWluc24gPSBGTTAwIHwgKGluc24gPDwgMzIpIHwgTk9QX1JJR0hUOwkvKiBsZWZ0IGNvbnRhaW5lciAqLworICAgIH0KKworICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7CisKKyAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCisgICAgeworICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCisJeyAKKwkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIHdoZXJlLCAKKwkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKKwkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAorCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKKwkJICAgICAgIGZ4LT5maXhbaV0ucmVsb2MpOworCX0KKyAgICB9CisgIGZ4LT5mYyA9IDA7Cit9CisKKy8qIFdyaXRlIG91dCBhIHNob3J0IGZvcm0gaW5zdHJ1Y3Rpb24gaWYgcG9zc2libGUuCisgICBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQuICAqLworc3RhdGljIGludAord3JpdGVfMl9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUsIGZ4KSAKKyAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgKm9wY29kZTI7CisgICAgIGxvbmcgbG9uZyBpbnNuMSwgaW5zbjI7CisgICAgIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZTsKKyAgICAgRml4dXBzICpmeDsKK3sKKyAgbG9uZyBsb25nIGluc24gPSBOT1AyOworICBjaGFyICpmOworICBpbnQgaSxqLCB3aGVyZTsKKworICBpZiAoZXhlY190eXBlID09IEVYRUNfU0VRCisgICAgICAmJiAob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikpCisgICAgICAmJiAoKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgRkxBR19ERUxBWSkgPT0gMCkKKyAgICAgICYmICgob3Bjb2RlMS0+ZWNjID09IEVDQ19BTCkgfHwgISBPcHRpbWl6aW5nKSkKKyAgICB7CisgICAgICAvKiBVbmNvbmRpdGlvbmFsLCBub24tZGVsYXllZCBicmFuY2hlcyBraWxsIGluc3RydWN0aW9ucyBpbgorCSB0aGUgcmlnaHQgYmluLiAgQ29uZGl0aW9uYWwgYnJhbmNoZXMgZG9uJ3QgYWx3YXlzIGJ1dCBpZgorCSB3ZSBhcmUgbm90IG9wdGltaXppbmcsIHRoZW4gd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHByb2R1Y2UKKwkgYW4gZXJyb3IgYWJvdXQgc3VjaCBjb25zdHJ1Y3RzLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzCisJIHRlc3QsIHN1YnJvdXRpbmUgY2FsbHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYnJhbmNoZXMuICAqLworICAgICAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIAorICAvKiBOb3RlOiB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzdWJyb3V0aW5lIGNhbGxzIG9jY3VyaW5nCisgICAgIGluIHRoZSByaWdodCBoYW5kIGNvbnRhaW5lci4gIFRoZSByZXR1cm4gYWRkcmVzcyBpcyBhbHdheXMKKyAgICAgYWxpZ25lZCB0byB0aGUgbmV4dCA2NCBiaXQgYm91bmRhcnksIGJlIHRoYXQgNjQgb3IgMzIgYml0IGF3YXkuICAqLworICAKKyAgc3dpdGNoIChleGVjX3R5cGUpIAorICAgIHsKKyAgICBjYXNlIEVYRUNfVU5LTk9XTjoJLyogT3JkZXIgbm90IHNwZWNpZmllZC4gKi8KKyAgICAgIGlmIChPcHRpbWl6aW5nCisJICAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpCisJICAmJiAhICggICAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUKKwkJIHx8IG9wY29kZTEtPm9wLT51bml0ID09IE1VKQorCQkmJgorCQkoICAgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUKKwkJIHx8IG9wY29kZTItPm9wLT51bml0ID09IE1VKSkpCisJeworCSAgLyogcGFyYWxsZWwgKi8KKwkgIGV4ZWNfdHlwZSA9IEVYRUNfUEFSQUxMRUw7CisJICAKKwkgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVQorCSAgICAgIHx8IG9wY29kZTItPm9wLT51bml0ID09IE1VCisJICAgICAgfHwgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCisJICAgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKKwkgICAgICBmeCA9IGZ4LT5uZXh0OworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikKKwkgICAgICAgJiYgKChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfREVMQVkpID09IDApCisJICAgICAgICYmICgob3Bjb2RlMS0+ZWNjID09IEVDQ19BTCkgfHwgISBPcHRpbWl6aW5nKSkKKwl7CisJICAvKiBXZSBtdXN0IGVtaXQgKG5vbi1kZWxheWVkKSBicmFuY2ggdHlwZSBpbnN0cnVjdGlvbnMKKwkgICAgIG9uIHRoZWlyIG93biB3aXRoIG5vdGhpbmcgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4gICovCisJICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQsIGZhbHNlKTsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UgaWYgKHByZXZfbGVmdF9raWxsc19yaWdodF9wKQorCXsKKwkgIC8qIFRoZSBsZWZ0IGluc3RydWN0aW9uIGtpbHMgdGhlIHJpZ2h0IHNsb3QsIHNvIHdlCisJICAgICBtdXN0IGxlYXZlIGl0IGVtcHR5LiAgKi8KKwkgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUKKwkgICAgICAgfHwgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUgorCQkgICAmJiBvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkpCisJeworCSAgLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCisJICBpbnNuID0gRk0xMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKKwkgIGV4ZWNfdHlwZSA9IEVYRUNfUkVWU0VROworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBzZXF1ZW50aWFsICovCisJICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsKKwkgIGZ4ID0gZngtPm5leHQ7CisJICBleGVjX3R5cGUgPSBFWEVDX1NFUTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVhFQ19QQVJBTExFTDoJLyogcGFyYWxsZWwgKi8KKyAgICAgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IGZsYWdfeHBfc3RhdGU7CisgICAgICBpZiAoISBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQorCWFzX2JhZCAoXygiSW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7CisgICAgICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVSkKKwl7CisJICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gSVUpCisJICAgIGFzX2JhZCAoXygiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOworCSAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7CisgCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpCisJeworCSAgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IE1VKQorCSAgICBhc19iYWQgKF8oIlR3byBNVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKKwkgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQorCSAgICBhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTEtPm9wLT5uYW1lKTsKKwkgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOworCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKKwkgICAgYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7CisJICAKKwkgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCisJICBmeCA9IGZ4LT5uZXh0OworCX0KKyAgICAgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVhFQ19TRVE6CS8qIHNlcXVlbnRpYWwgKi8KKyAgICAgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVSkKKwlhc19iYWQgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOworICAgICAgaWYgKHByZXZfbGVmdF9raWxsc19yaWdodF9wKQorCWFzX2JhZCAoXygic3BlY2lhbCBsZWZ0IGluc3RydWN0aW9uIGAlcycga2lsbHMgaW5zdHJ1Y3Rpb24gIgorCQkgICAiYCVzJyBpbiByaWdodCBjb250YWluZXIiKSwKKwkJIG9wY29kZTEtPm9wLT5uYW1lLCBvcGNvZGUyLT5vcC0+bmFtZSk7CisgICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCisJYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7CisgICAgICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAorICAgICAgZnggPSBmeC0+bmV4dDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFWEVDX1JFVlNFUToJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCisgICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpCisJYXNfYmFkIChfKCJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiKSk7CisgICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCisJYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7CisgICAgICBpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAorICAgICAgZnggPSBmeC0+bmV4dDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiKSk7CisgICAgfQorCisgIC8qICBwcmludGYgKCJ3cml0aW5nIG91dCAlbGx4XG4iLGluc24pOyAqLworICBmID0gZnJhZ19tb3JlICg4KTsKKyAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOworCisgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYSAzMi1iaXQgbXVsdGlwbHkgYnV0IGl0IGlzIHB1dCBpbnRvIGEKKyAgICAgcGFyYWxsZWwgY29udGFpbmVyLCBtYXJrIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFzIGJlaW5nIGEgMzItYml0CisgICAgIG11bHRpcGx5LiAgKi8KKyAgaWYgKHByZXZfbXVsMzJfcCAmJiBleGVjX3R5cGUgPT0gRVhFQ19QQVJBTExFTCkKKyAgICBjdXJfbXVsMzJfcCA9IDE7CisKKyAgZm9yIChqPTA7IGo8MjsgaisrKSAKKyAgICB7CisgICAgICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKKwl7CisJICBpZiAoZngtPmZpeFtpXS5yZWxvYykKKwkgICAgeworCSAgICAgIHdoZXJlID0gKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgKyA0Kmo7CisKKwkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCisJCQkgICB3aGVyZSwgCisJCQkgICBmeC0+Zml4W2ldLnNpemUsCisJCQkgICAmKGZ4LT5maXhbaV0uZXhwKSwKKwkJCSAgIGZ4LT5maXhbaV0ucGNyZWwsCisJCQkgICBmeC0+Zml4W2ldLnJlbG9jKTsKKwkgICAgfQorCX0KKyAgICAgIAorICAgICAgZngtPmZjID0gMDsKKyAgICAgIGZ4ID0gZngtPm5leHQ7CisgICAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKworLyogQ2hlY2sgMiBpbnN0cnVjdGlvbnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGNhbiBiZSBzYWZlbHkgKi8KKy8qIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgUmV0dXJucyAxIGlmIHRoZXkgY2FuIGJlLiAgICAgICAgICovCitzdGF0aWMgaW50CitwYXJhbGxlbF9vayAob3AxLCBpbnNuMSwgb3AyLCBpbnNuMiwgZXhlY190eXBlKQorICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcDEsICpvcDI7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOworICAgICBleGVjX3R5cGVfZW51bSBleGVjX3R5cGU7Cit7CisgIGludCBpLCBqLCBzaGlmdCwgcmVnbm8sIGJpdHMsIGVjYzsKKyAgdW5zaWduZWQgbG9uZyBmbGFncywgbWFzaywgZmxhZ3Nfc2V0MSwgZmxhZ3Nfc2V0MiwgZmxhZ3NfdXNlZDEsIGZsYWdzX3VzZWQyOworICB1bnNpZ25lZCBsb25nIGlucywgbW9kX3JlZ1syXVszXSwgdXNlZF9yZWdbMl1bM10sIGZsYWdfcmVnWzJdOworICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmY7CisgIHN0cnVjdCBkMzB2X29wY29kZSAqb3A7CisKKyAgLyogc2VjdGlvbiA0LjM6IGJvdGggaW5zdHJ1Y3Rpb25zIG11c3Qgbm90IGJlIElVIG9yIE1VIG9ubHkgKi8KKyAgaWYgKChvcDEtPm9wLT51bml0ID09IElVICYmIG9wMi0+b3AtPnVuaXQgPT0gSVUpCisgICAgICB8fCAob3AxLT5vcC0+dW5pdCA9PSBNVSAmJiBvcDItPm9wLT51bml0ID09IE1VKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBmaXJzdCBpbnN0cnVjdGlvbiBtdXN0IG5vdCBiZSBhIGp1bXAgdG8gc2FmZWx5IG9wdGltaXplLCB1bmxlc3MgdGhpcworICAgICBpcyBhbiBleHBsaWNpdCBwYXJhbGxlbCBvcGVyYXRpb24uICAqLworICBpZiAoZXhlY190eXBlICE9IEVYRUNfUEFSQUxMRUwKKyAgICAgICYmIChvcDEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBJZiBvbmUgaW5zdHJ1Y3Rpb24gaXMgL1RYIG9yIC9YVCBhbmQgdGhlIG90aGVyIGlzIC9GWCBvciAvWEYgcmVzcGVjdGl2ZWx5LAorICAgICB0aGVuIGl0IGlzIHNhZmUgdG8gYWxsb3cgdGhlIHR3byB0byBiZSBkb25lIGFzIHBhcmFsbGVsIG9wcywgc2luY2Ugb25seQorICAgICBvbmUgd2lsbCBldmVyIGJlIGV4ZWN1dGVkIGF0IGEgdGltZS4gICovCisgIGlmICgob3AxLT5lY2MgPT0gRUNDX1RYICYmIG9wMi0+ZWNjID09IEVDQ19GWCkKKyAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfRlggJiYgb3AyLT5lY2MgPT0gRUNDX1RYKQorICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19YVCAmJiBvcDItPmVjYyA9PSBFQ0NfWEYpCisgICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX1hGICYmIG9wMi0+ZWNjID09IEVDQ19YVCkpCisgICAgIHJldHVybiAxOworCisgIC8qIFswXSByMC1yMzEKKyAgICAgWzFdIHIzMi1yNjMKKyAgICAgWzJdIGEwLCBhMSwgZmxhZyByZWdpc3RlcnMgKi8KKworICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgIHsKKyAgICAgIGlmIChqID09IDApCisJeworCSAgZiA9IG9wMS0+Zm9ybTsKKwkgIG9wID0gb3AxLT5vcDsKKwkgIGVjYyA9IG9wMS0+ZWNjOworCSAgaW5zID0gaW5zbjE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGYgPSBvcDItPmZvcm07CisJICBvcCA9IG9wMi0+b3A7CisJICBlY2MgPSBvcDItPmVjYzsKKwkgIGlucyA9IGluc24yOworCX0KKyAgICAgIGZsYWdfcmVnW2pdID0gMDsKKyAgICAgIG1vZF9yZWdbal1bMF0gPSBtb2RfcmVnW2pdWzFdID0gMDsKKyAgICAgIHVzZWRfcmVnW2pdWzBdID0gdXNlZF9yZWdbal1bMV0gPSAwOworCisgICAgICBpZiAoZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsKQorCXsKKwkgIC8qIEZvciBodW1hbiBzcGVjaWZpZWQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHdlIGhhdmUgYmVlbiBhc2tlZAorCSAgICAgdG8gaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGJvdGggaW5zdHJ1Y3Rpb25zIGNvdWxkIG1vZGlmeQorCSAgICAgYml0cyBpbiB0aGUgUFNXLCBzbyB3ZSBpbml0aWFsaXNlIHRoZSBtb2QgJiB1c2VkIGFycmF5cyB0byAwLgorCSAgICAgV2UgaGF2ZSBiZWVuIGFza2VkLCBob3dldmVyLCB0byByZWZ1c2UgdG8gYWxsb3cgcGFyYWxsZWwKKwkgICAgIGluc3RydWN0aW9ucyB3aGljaCBleHBsaWNpdGx5IHNldCB0aGUgc2FtZSBmbGFnIHJlZ2lzdGVyLAorCSAgICAgZWcgImNtcG5lIGYwLHIxLDB4MTAgfHwgY21wZXEgZjAsIHI1LCAweDIiLCBzbyBmdXJ0aGVyIG9uIHdlIHRlc3QKKwkgICAgIGZvciB0aGUgdXNlIG9mIGEgZmxhZyByZWdpc3RlciBhbmQgc2V0IGEgYml0IGluIHRoZSBtb2Qgb3IgdXNlZAorCSAgICAgYXJyYXkgYXBwcm9wcmlhdGVseS4gICovCisJICAgICAKKwkgIG1vZF9yZWdbal1bMl0gID0gMDsKKwkgIHVzZWRfcmVnW2pdWzJdID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbW9kX3JlZ1tqXVsyXSA9IChvcC0+ZmxhZ3Nfc2V0ICYgRkxBR19BTEwpOworCSAgdXNlZF9yZWdbal1bMl0gPSAob3AtPmZsYWdzX3VzZWQgJiBGTEFHX0FMTCk7CisJfQorICAgICAgCisgICAgICAvKiBCU1IvSlNSIGFsd2F5cyBzZXRzIFI2MiAqLworICAgICAgaWYgKG9wLT5mbGFnc191c2VkICYgRkxBR19KU1IpCisJbW9kX3JlZ1tqXVsxXSA9ICgxTCA8PCAoNjItMzIpKTsKKworICAgICAgLyogY29uZGl0aW9uYWwgZXhlY3V0aW9uIGFmZmVjdHMgdGhlIGZsYWdzX3VzZWQgKi8KKyAgICAgIHN3aXRjaCAoZWNjKQorCXsKKwljYXNlIEVDQ19UWDoKKwljYXNlIEVDQ19GWDoKKwkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gRkxBR18wOworCSAgYnJlYWs7CisKKwljYXNlIEVDQ19YVDoKKwljYXNlIEVDQ19YRjoKKwkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gRkxBR18xOworCSAgYnJlYWs7CisKKwljYXNlIEVDQ19UVDoKKwljYXNlIEVDQ19URjoKKwkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gKEZMQUdfMCB8IEZMQUdfMSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGYtPm9wZXJhbmRzW2ldOyBpKyspCisJeworCSAgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLmZsYWdzOworCSAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247CisJICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5iaXRzOworCSAgaWYgKGJpdHMgPT0gMzIpCisJICAgIG1hc2sgPSAweGZmZmZmZmZmOworCSAgZWxzZQorCSAgICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBiaXRzKTsKKworCSAgaWYgKChmbGFncyAmIE9QRVJBTkRfUExVUykgfHwgKGZsYWdzICYgT1BFUkFORF9NSU5VUykpCisJICAgIHsKKwkgICAgICAvKiB0aGlzIGlzIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQgKi8KKwkgICAgICAvKiB0aGUgcHJldmlvdXMgcmVnaXN0ZXIgbmVlZHMgdG8gYmUgbWFya2VkIGFzIG1vZGlmaWVkICovCisKKwkgICAgICBzaGlmdCA9IDEyIC0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ktMV1dLnBvc2l0aW9uOworCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiAweDNmOworCSAgICAgIGlmIChyZWdubyA+PSAzMikKKwkJbW9kX3JlZ1tqXVsxXSB8PSAxTCA8PCAocmVnbm8gLSAzMik7CisJICAgICAgZWxzZQorCQltb2RfcmVnW2pdWzBdIHw9IDFMIDw8IHJlZ25vOworCSAgICB9CisJICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQorCSAgICB7CisJICAgICAgcmVnbm8gPSAoaW5zID4+IHNoaWZ0KSAmIG1hc2s7CisJICAgICAgLyogdGhlIG1lbW9yeSB3cml0ZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCisJICAgICAgaWYgKChmbGFncyAmIE9QRVJBTkRfREVTVCkgJiYgIShvcC0+ZmxhZ3Nfc2V0ICYgRkxBR19NRU0pKQorCQl7CisJCSAgLyogTU9ESUZJRUQgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLworCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUNDKQorCQkgICAgeworCQkgICAgICBpZiAocmVnbm8gPT0gMCkKKwkJCW1vZF9yZWdbal1bMl0gfD0gRkxBR19BMDsKKwkJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gMSkKKwkJCW1vZF9yZWdbal1bMl0gfD0gRkxBR19BMTsKKwkJICAgICAgZWxzZQorCQkJYWJvcnQgKCk7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCisJCSAgICBtb2RfcmVnW2pdWzJdIHw9IDFMIDw8IHJlZ25vOworCQkgIGVsc2UgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpKQorCQkgICAgeworCQkgICAgICBpbnQgciwgejsKKworCQkgICAgICAvKiBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSB0d28gZGVzdGluYXRpb24gKi8KKwkJICAgICAgLyogcmVnaXN0ZXJzLCBmb3IgZXhhbXBsZSBsZDJ3ICovCisJCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfMlJFRykKKwkJCXogPSAxOworCQkgICAgICBlbHNlCisJCQl6ID0gMDsKKworCQkgICAgICBmb3IgKHIgPSByZWdubzsgciA8PSByZWdubyArIHo7IHIrKykKKwkJCXsgCisJCQkgIGlmIChyID49IDMyKQorCQkJICAgIG1vZF9yZWdbal1bMV0gfD0gMUwgPDwgKHIgLSAzMik7CisJCQkgIGVsc2UKKwkJCSAgICBtb2RfcmVnW2pdWzBdIHw9IDFMIDw8IHI7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBVU0VELCBidXQgbm90IG1vZGlmaWVkIHJlZ2lzdGVycyBhbmQgZmxhZ3MgKi8KKwkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FDQykKKwkJICAgIHsKKwkJICAgICAgaWYgKHJlZ25vID09IDApCisJCQl1c2VkX3JlZ1tqXVsyXSB8PSBGTEFHX0EwOworCQkgICAgICBlbHNlIGlmIChyZWdubyA9PSAxKQorCQkJdXNlZF9yZWdbal1bMl0gfD0gRkxBR19BMTsKKwkJICAgICAgZWxzZQorCQkJYWJvcnQgKCk7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCisJCSAgICB1c2VkX3JlZ1tqXVsyXSB8PSAxTCA8PCByZWdubzsKKwkJICBlbHNlIGlmICghKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKSkKKwkJICAgIHsKKwkJICAgICAgaW50IHIsIHo7CisKKwkJICAgICAgLyogbmVlZCB0byBjaGVjayBpZiB0aGVyZSBhcmUgdHdvIHNvdXJjZSAqLworCQkgICAgICAvKiByZWdpc3RlcnMsIGZvciBleGFtcGxlIHN0MncgKi8KKwkJICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF8yUkVHKQorCQkJeiA9IDE7CisJCSAgICAgIGVsc2UKKwkJCXogPSAwOworCisJCSAgICAgIGZvciAociA9IHJlZ25vOyByIDw9IHJlZ25vICsgejsgcisrKQorCQkJeyAKKwkJCSAgaWYgKHIgPj0gMzIpCisJCQkgICAgdXNlZF9yZWdbal1bMV0gfD0gMUwgPDwgKHIgLSAzMik7CisJCQkgIGVsc2UKKwkJCSAgICB1c2VkX3JlZ1tqXVswXSB8PSAxTCA8PCByOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgZmxhZ3Nfc2V0MSA9IG9wMS0+b3AtPmZsYWdzX3NldDsKKyAgZmxhZ3Nfc2V0MiA9IG9wMi0+b3AtPmZsYWdzX3NldDsKKyAgZmxhZ3NfdXNlZDEgPSBvcDEtPm9wLT5mbGFnc191c2VkOworICBmbGFnc191c2VkMiA9IG9wMi0+b3AtPmZsYWdzX3VzZWQ7CisKKyAgLyogU1QyVy9TVDRIQiBjb21iaW5lZCB3aXRoIEFERHBwcC9TVUJwcHAgaXMgaWxsZWdhbC4gICovCisgIGlmICgoKGZsYWdzX3NldDEgJiAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKSkgPT0gKEZMQUdfTUVNIHwgRkxBR18yV09SRCkKKyAgICAgICAmJiAoZmxhZ3NfdXNlZDIgJiBGTEFHX0FERFNVQnBwcCkgIT0gMCkKKyAgICAgIHx8ICgoZmxhZ3Nfc2V0MiAmIChGTEFHX01FTSB8IEZMQUdfMldPUkQpKSA9PSAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKQorCSAgJiYgKGZsYWdzX3VzZWQxICYgRkxBR19BRERTVUJwcHApICE9IDApKQorICAgIHJldHVybiAwOworCisgIC8qIExvYWQgaW5zdHJ1Y3Rpb24gY29tYmluZWQgd2l0aCBoYWxmLXdvcmQgbXVsdGlwbHkgaXMgaWxsZWdhbC4gICovCisgIGlmICgoKGZsYWdzX3VzZWQxICYgRkxBR19NRU0pICE9IDAgJiYgKGZsYWdzX3VzZWQyICYgRkxBR19NVUwxNikpCisgICAgICB8fCAoKGZsYWdzX3VzZWQyICYgRkxBR19NRU0pICE9IDAgJiYgKGZsYWdzX3VzZWQxICYgRkxBR19NVUwxNikpKQorICAgIHJldHVybiAwOworCisgIC8qIFNwZWNpZmljYWxseSBhbGxvdyBhZGQgfHwgYWRkIGJ5IHJlbW92aW5nIGNhcnJ5LCBvdmVyZmxvdyBiaXRzIGRlcGVuZGVuY3kuCisgICAgIFRoaXMgaXMgc2FmZSwgZXZlbiBpZiBhbiBhZGRjIGZvbGxvd3Mgc2luY2UgdGhlIElVIHRha2VzIHRoZSBhcmd1bWVudCBpbgorICAgICB0aGUgcmlnaHQgY29udGFpbmVyLCBhbmQgaXQgd3JpdGVzIGl0cyByZXN1bHRzIGxhc3QuCisgICAgIEhvd2V2ZXIsIGRvbid0IHBhcmFsZWxsaXplIGFkZCBmb2xsb3dlZCBieSBhZGRjIG9yIHN1YiBmb2xsb3dlZCBieQorICAgICBzdWJiLiAgKi8KKworICBpZiAobW9kX3JlZ1swXVsyXSA9PSBGTEFHX0NWVkEgJiYgbW9kX3JlZ1sxXVsyXSA9PSBGTEFHX0NWVkEKKyAgICAgICYmICh1c2VkX3JlZ1swXVsyXSAmIH5mbGFnX3JlZ1swXSkgPT0gMAorICAgICAgJiYgKHVzZWRfcmVnWzFdWzJdICYgfmZsYWdfcmVnWzFdKSA9PSAwCisgICAgICAmJiBvcDEtPm9wLT51bml0ID09IEVJVEhFUiAmJiBvcDItPm9wLT51bml0ID09IEVJVEhFUikKKyAgICB7CisgICAgICBtb2RfcmVnWzBdWzJdID0gbW9kX3JlZ1sxXVsyXSA9IDA7CisgICAgfQorCisgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCisgICAgeworICAgICAgLyogSWYgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBkZXBlbmRzIG9uIHRoZSBmaXJzdCwgd2Ugb2J2aW91c2x5CisJIGNhbm5vdCBwYXJhbGxlbGl6ZS4gIE5vdGUsIHRoZSBtb2QgZmxhZyBpbXBsaWVzIHVzZSwgc28KKwkgY2hlY2sgdGhhdCBhcyB3ZWxsLiAgKi8KKyAgICAgIC8qIElmIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCBpcyBzZXQsIHRoZW4gdGhlIGNhc2Ugb2YgdGhlIAorCSBzZWNvbmQgaW5zdHJ1Y3Rpb24gdXNpbmcgYSByZWdpc3RlciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KKwkgbW9kaWZpZXMgaXMgYXNzdW1lZCB0byBiZSBva2F5OyB3ZSB0cnVzdCB0aGUgaHVtYW4uICBXZQorCSBkb24ndCB0cnVzdCB0aGUgaHVtYW4gaWYgYm90aCBpbnN0cnVjdGlvbnMgbW9kaWZ5IHRoZSBzYW1lCisJIHJlZ2lzdGVyIGJ1dCB3ZSBkbyB0cnVzdCB0aGUgaHVtYW4gaWYgdGhleSBtb2RpZnkgdGhlIHNhbWUKKwkgZmxhZ3MuICovCisgICAgICAvKiBXZSBoYXZlIG5vdyBiZWVuIHJlcXVlc3RlZCBub3QgdG8gdHJ1c3QgdGhlIGh1bWFuIGlmIHRoZQorCSBpbnN0cnVjdGlvbnMgbW9kaWZ5IHRoZSBzYW1lIGZsYWcgcmVnaXN0ZXJzIGVpdGhlci4gICovCisgICAgICBpZiAoZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsKQorCXsKKwkgIGlmICgobW9kX3JlZ1swXVtqXSAmIG1vZF9yZWdbMV1bal0pICE9IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICAgIGVsc2UKKyAgICAgICAgaWYgKChtb2RfcmVnWzBdW2pdICYgKG1vZF9yZWdbMV1bal0gfCB1c2VkX3JlZ1sxXVtqXSkpICE9IDApCisJICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIHN0ciBwb2ludHMgdG8gYQorICAgbWFjaGluZS1kZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQgdGhlIGZyYWdzL2J5dGVzIAorICAgaXQgYXNzZW1ibGVzIHRvLiAgRm9yIHRoZSBEMzBWLCBpdCBtb3N0bHkgaGFuZGxlcyB0aGUgc3BlY2lhbCBWTElXIHBhcnNpbmcgYW5kIHBhY2tpbmcKKyAgIGFuZCBsZWF2ZXMgdGhlIGRpZmZpY3VsdCBzdHVmZiB0byBkb19hc3NlbWJsZSgpLiAgKi8KKworc3RhdGljIGxvbmcgbG9uZyBwcmV2X2luc24gPSAtMTsKK3N0YXRpYyBzdHJ1Y3QgZDMwdl9pbnNuIHByZXZfb3Bjb2RlOworc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7CitzdGF0aWMgc2VnVCBwcmV2X3NlZyA9IDA7CisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgc3RydWN0IGQzMHZfaW5zbiBvcGNvZGU7CisgIGxvbmcgbG9uZyBpbnNuOworICBleGVjX3R5cGVfZW51bSBleHR5cGUgPSBFWEVDX1VOS05PV047CQkvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwsIGV0YyAqLworICBzdGF0aWMgZXhlY190eXBlX2VudW0gZXR5cGUgPSBFWEVDX1VOS05PV047CS8qIHNhdmVkIGV4dHlwZS4gIHVzZWQgZm9yIG11bHRpbGluZSBpbnN0cnVjdGlvbnMgKi8KKyAgY2hhciAqc3RyMjsKKworICBpZiAoKHByZXZfaW5zbiAhPSAtMSkgJiYgcHJldl9zZWcKKyAgICAgICAmJiAoKHByZXZfc2VnICE9IG5vd19zZWcpIHx8IChwcmV2X3N1YnNlZyAhPSBub3dfc3Vic2VnKSkpCisgICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7CisKKyAgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA8IDMpCisgICAgZDMwdl9hbGlnbiAoMywgTlVMTCwgZDMwdl9sYXN0X2xhYmVsKTsKKyAgZWxzZSBpZiAoZDMwdl9jdXJyZW50X2FsaWduID4gMykKKyAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSAzOworICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOworCisgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7CisgIGZsYWdfeHBfc3RhdGUgPSAwOworICBpZiAoZXR5cGUgPT0gRVhFQ19VTktOT1dOKQorICAgIHsKKyAgICAgIC8qIGxvb2sgZm9yIHRoZSBzcGVjaWFsIG11bHRpcGxlIGluc3RydWN0aW9uIHNlcGFyYXRvcnMgKi8KKyAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgInx8Iik7CisgICAgICBpZiAoc3RyMikgCisJeworCSAgZXh0eXBlID0gRVhFQ19QQVJBTExFTDsKKwkgIGZsYWdfeHBfc3RhdGUgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdHIyID0gc3Ryc3RyIChzdHIsICItPiIpOworCSAgaWYgKHN0cjIpIAorCSAgICBleHR5cGUgPSBFWEVDX1NFUTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIjwtIik7CisJICAgICAgaWYgKHN0cjIpIAorCQlleHR5cGUgPSBFWEVDX1JFVlNFUTsKKwkgICAgfQorCX0KKyAgICAgIC8qIHN0cjIgcG9pbnRzIHRvIHRoZSBzZXBhcmF0b3IsIGlmIG9uZSAqLworICAgICAgaWYgKHN0cjIpIAorCXsKKwkgICpzdHIyID0gMDsKKwkgIAorCSAgLyogaWYgdHdvIGluc3RydWN0aW9ucyBhcmUgcHJlc2VudCBhbmQgd2UgYWxyZWFkeSBoYXZlIG9uZSBzYXZlZAorCSAgICAgdGhlbiBmaXJzdCB3cml0ZSBpdCBvdXQgKi8KKwkgIGQzMHZfY2xlYW51cCAoZmFsc2UpOworCSAgCisJICAvKiBBc3NlbWJsZSBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgc2F2ZSBpdC4gICovCisJICBwcmV2X2luc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmcHJldl9vcGNvZGUsIDEsIDApOworCSAgaWYgKHByZXZfaW5zbiA9PSAtMSkKKwkgICAgYXNfYmFkIChfKCJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iKSk7CisJICBpZiAocHJldl9vcGNvZGUuZm9ybSAhPSBOVUxMICYmIHByZXZfb3Bjb2RlLmZvcm0tPmZvcm0gPj0gTE9ORykKKwkgICAgYXNfYmFkIChfKCJGaXJzdCBvcGNvZGUgaXMgbG9uZy4gIFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZC4iKSk7IAorCSAgZml4dXBzID0gZml4dXBzLT5uZXh0OworCSAgc3RyID0gc3RyMiArIDI7CisJICBwcmV2X3NlZyA9IG5vd19zZWc7CisJICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7CisJfQorICAgIH0KKworICBpbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJm9wY29kZSwKKwkJICAgICAgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04gfHwgZXR5cGUgIT0gRVhFQ19VTktOT1dOKSwKKwkJICAgICAgZXh0eXBlID09IEVYRUNfUEFSQUxMRUwpOworICBpZiAoaW5zbiA9PSAtMSkKKyAgICB7CisgICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikKKwlldHlwZSA9IGV4dHlwZTsKKyAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoZXR5cGUgIT0gRVhFQ19VTktOT1dOKQorICAgIHsKKyAgICAgIGV4dHlwZSA9IGV0eXBlOworICAgICAgZXR5cGUgPSBFWEVDX1VOS05PV047CisgICAgfQorCisgIC8qIFdvcmQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIG11c3Qgbm90IGJlIGZvbGxvd2VkIGJ5IGVpdGhlciBhIGxvYWQgb3IgYQorICAgICAxNi1iaXQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24gaW4gdGhlIG5leHQgY3ljbGUuICAqLworICBpZiAoICAgKGV4dHlwZSAhPSBFWEVDX1JFVlNFUSkKKyAgICAgICYmIHByZXZfbXVsMzJfcAorICAgICAgJiYgKG9wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX01FTSB8IEZMQUdfTVVMMTYpKSkKKyAgICB7CisgICAgICAvKiBIb3dldmVyLCBsb2FkIGFuZCBtdWx0aXBseSBzaG91bGQgYWJsZSB0byBiZSBjb21iaW5lZCBpbiBhIHBhcmFsbGVsCisJIG9wZXJhdGlvbiwgc28gY2hlY2sgZm9yIHRoYXQgZmlyc3QuICAqLworICAgICAgaWYgKHByZXZfaW5zbiAhPSAtMQorCSAgJiYgKG9wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfTUVNKQorCSAgJiYgb3Bjb2RlLmZvcm0tPmZvcm0gPCBMT05HCisJICAmJiAoZXh0eXBlID09IEVYRUNfUEFSQUxMRUwgfHwgKE9wdGltaXppbmcgJiYgZXh0eXBlID09IEVYRUNfVU5LTk9XTikpCisJICAmJiBwYXJhbGxlbF9vayAoJnByZXZfb3Bjb2RlLCAobG9uZylwcmV2X2luc24sCisJCQkgICZvcGNvZGUsIChsb25nKWluc24sIGV4dHlwZSkKKwkgICYmIHdyaXRlXzJfc2hvcnQgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLAorCQkJICAgICZvcGNvZGUsIChsb25nKWluc24sIGV4dHlwZSwgZml4dXBzKSA9PSAwKQorCXsKKwkgIC8qIG5vIGluc3RydWN0aW9ucyBzYXZlZCAqLworCSAgcHJldl9pbnNuID0gLTE7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIENhbid0IHBhcmFsbGVsaXplLCBmbHVzaCBwcmV2aW91cyBpbnN0cnVjdGlvbiBhbmQgZW1pdCBhIHdvcmQgb2YgTk9QUywKKwkgICAgIHVubGVzcyB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBOT1AsIGluIHdoaWNoIGNhc2UganVzdCBmbHVzaCBpdCwKKwkgICAgIGFzIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIHdvcmQgb2YgTk9QcyBmb3IgdXMuICAqLworCisJICBpZiAocHJldl9pbnNuICE9IC0xICYmIChzdHJjbXAgKHByZXZfb3Bjb2RlLm9wLT5uYW1lLCAibm9wIikgPT0gMCkpCisJICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciAqIGY7CisJICAgICAgCisJICAgICAgaWYgKHByZXZfaW5zbiAhPSAtMSkKKwkJZDMwdl9jbGVhbnVwICh0cnVlKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBmID0gZnJhZ19tb3JlICg4KTsKKwkJICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgTk9QMiwgOCk7CisJCSAgCisJCSAgaWYgKHdhcm5fbm9wcyA9PSBOT1BfQUxMIHx8IHdhcm5fbm9wcyA9PSBOT1BfTVVMVElQTFkpCisJCSAgICB7CisJCSAgICAgIGlmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiBGTEFHX01FTSkKKwkJCWFzX3dhcm4gKF8oIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIGxvYWQiKSk7CisJCSAgICAgIGVsc2UKKwkJCWFzX3dhcm4gKF8oIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIDE2LWJpdCBtdWx0aXBseSIpKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAKKwkgIGV4dHlwZSA9IEVYRUNfVU5LTk9XTjsKKwl9CisgICAgfQorICBlbHNlIGlmICggICAoZXh0eXBlID09IEVYRUNfUkVWU0VRKQorCSAgICYmIGN1cl9tdWwzMl9wCisJICAgJiYgKHByZXZfb3Bjb2RlLm9wLT5mbGFnc191c2VkICYgKEZMQUdfTUVNIHwgRkxBR19NVUwxNikpKQorICAgIHsKKyAgICAgIC8qIENhbid0IHBhcmFsbGVsaXplLCBmbHVzaCBjdXJyZW50IGluc3RydWN0aW9uIGFuZCBhZGQgYSBzZXF1ZW50aWFsIE5PUC4gKi8KKyAgICAgIHdyaXRlXzFfc2hvcnQgKCYgb3Bjb2RlLCAobG9uZykgaW5zbiwgZml4dXBzLT5uZXh0LT5uZXh0LCB0cnVlKTsKKyAgICAgIAorICAgICAgLyogTWFrZSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdGhlIGN1cnJlbnQgb25lLiAgKi8KKyAgICAgIGV4dHlwZSA9IEVYRUNfVU5LTk9XTjsKKyAgICAgIGluc24gPSBwcmV2X2luc247CisgICAgICBub3dfc2VnID0gcHJldl9zZWc7CisgICAgICBub3dfc3Vic2VnID0gcHJldl9zdWJzZWc7CisgICAgICBwcmV2X2luc24gPSAtMTsKKyAgICAgIGN1cl9tdWwzMl9wID0gcHJldl9tdWwzMl9wOworICAgICAgcHJldl9tdWwzMl9wID0gMDsKKyAgICAgIG1lbWNweSAoJm9wY29kZSwgJnByZXZfb3Bjb2RlLCBzaXplb2YgKHByZXZfb3Bjb2RlKSk7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSBsb25nIGluc3RydWN0aW9uLCB3cml0ZSBpdCBhbmQgYW55IHByZXZpb3VzIHNob3J0IGluc3RydWN0aW9uLiAgKi8KKyAgaWYgKG9wY29kZS5mb3JtLT5mb3JtID49IExPTkcpIAorICAgIHsKKyAgICAgIGlmIChleHR5cGUgIT0gRVhFQ19VTktOT1dOKSAKKwlhc19iYWQgKF8oIkluc3RydWN0aW9uIHVzZXMgbG9uZyB2ZXJzaW9uLCBzbyBpdCBjYW5ub3QgYmUgbWl4ZWQgYXMgc3BlY2lmaWVkIikpOworICAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7CisgICAgICB3cml0ZV9sb25nICgmIG9wY29kZSwgaW5zbiwgZml4dXBzKTsKKyAgICAgIHByZXZfaW5zbiA9IC0xOworICAgIH0KKyAgZWxzZSBpZiAoKHByZXZfaW5zbiAhPSAtMSkKKwkgICAmJiAod3JpdGVfMl9zaG9ydAorCSAgICAgICAoJiBwcmV2X29wY29kZSwgKGxvbmcpIHByZXZfaW5zbiwgJiBvcGNvZGUsCisJCShsb25nKSBpbnNuLCBleHR5cGUsIGZpeHVwcykgPT0gMCkpIAorICAgIHsKKyAgICAgIC8qIE5vIGluc3RydWN0aW9ucyBzYXZlZC4gICovCisgICAgICBwcmV2X2luc24gPSAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikgCisJYXNfYmFkIChfKCJVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQiKSk7CisgICAgICAKKyAgICAgIC8qIFNhdmUgb2ZmIGxhc3QgaW5zdHJ1Y3Rpb24gc28gaXQgbWF5IGJlIHBhY2tlZCBvbiBuZXh0IHBhc3MuICAqLworICAgICAgbWVtY3B5ICgmcHJldl9vcGNvZGUsICZvcGNvZGUsIHNpemVvZiAocHJldl9vcGNvZGUpKTsKKyAgICAgIHByZXZfaW5zbiA9IGluc247CisgICAgICBwcmV2X3NlZyA9IG5vd19zZWc7CisgICAgICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7CisgICAgICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7CisgICAgICBwcmV2X211bDMyX3AgPSBjdXJfbXVsMzJfcDsKKyAgICB9Cit9CisKKworLyogZG9fYXNzZW1ibGUgYXNzZW1ibGVzIGEgc2luZ2xlIGluc3RydWN0aW9uIGFuZCByZXR1cm5zIGFuIG9wY29kZSAqLworLyogaXQgcmV0dXJucyAtMSAoYW4gaW52YWxpZCBvcGNvZGUpIG9uIGVycm9yICovCisKKyNkZWZpbmUgTkFNRV9CVUZfTEVOCTIwCisKK3N0YXRpYyBsb25nIGxvbmcKK2RvX2Fzc2VtYmxlIChzdHIsIG9wY29kZSwgc2hvcnRwLCBpc19wYXJhbGxlbCkgCisgICAgIGNoYXIgKnN0cjsKKyAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOworICAgICBpbnQgc2hvcnRwOworICAgICBpbnQgaXNfcGFyYWxsZWw7Cit7CisgIHVuc2lnbmVkIGNoYXIgKiBvcF9zdGFydDsKKyAgdW5zaWduZWQgY2hhciAqIHNhdmU7CisgIHVuc2lnbmVkIGNoYXIgKiBvcF9lbmQ7CisgIGNoYXIgICAgICAgICAgICBuYW1lIFtOQU1FX0JVRl9MRU5dOworICBpbnQgICAgICAgICAgICAgY21wX2hhY2s7CisgIGludCAgICAgICAgICAgICBubGVuID0gMDsKKyAgaW50ICAgICAgICAgICAgIGZzaXplID0gKHNob3J0cCA/IEZPUkNFX1NIT1JUIDogMCk7CisgIGV4cHJlc3Npb25TICAgICBteW9wcyBbNl07CisgIGxvbmcgbG9uZyAgICAgICBpbnNuOworCisgIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgIHdoaWxlICgqIHN0ciA9PSAnICcpCisgICAgc3RyICsrOworCisgIC8qIGZpbmQgdGhlIG9wY29kZSBlbmQgKi8KKyAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOworICAgICAgICogb3BfZW5kCisgICAgICAgJiYgbmxlbiA8IChOQU1FX0JVRl9MRU4gLSAxKQorICAgICAgICYmICogb3BfZW5kICE9ICcvJworICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKKyAgICAgICBvcF9lbmQrKykKKyAgICB7CisgICAgICBuYW1lW25sZW5dID0gdG9sb3dlciAob3Bfc3RhcnRbbmxlbl0pOworICAgICAgbmxlbisrOworICAgIH0KKworICBpZiAobmxlbiA9PSAwKQorICAgIHJldHVybiAtMTsKKworICBuYW1lW25sZW5dID0gMDsKKworICAvKiBpZiB0aGVyZSBpcyBhbiBleGVjdXRpb24gY29uZGl0aW9uIGNvZGUsIGhhbmRsZSBpdCAqLworICBpZiAoKm9wX2VuZCA9PSAnLycpCisgICAgeworICAgICAgaW50IGkgPSAwOworICAgICAgd2hpbGUgKCAoaSA8IEVDQ19NQVgpICYmIHN0cm5jYXNlY21wIChkMzB2X2VjY19uYW1lc1tpXSwgb3BfZW5kICsgMSwgMikpCisJaSsrOworICAgICAgCisgICAgICBpZiAoaSA9PSBFQ0NfTUFYKQorCXsKKwkgIGNoYXIgdG1wWzRdOworCSAgc3RybmNweSAodG1wLCBvcF9lbmQgKyAxLCAyKTsKKwkgIHRtcFsyXSA9IDA7CisJICBhc19iYWQgKF8oInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIiksdG1wKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICAvKiAgICAgIHByaW50ZiAoImNvbmRpdGlvbiBjb2RlPSVkXG4iLGkpOyAqLworICAgICAgb3Bjb2RlLT5lY2MgPSBpOworICAgICAgb3BfZW5kICs9IDM7CisgICAgfQorICBlbHNlCisgICAgb3Bjb2RlLT5lY2MgPSBFQ0NfQUw7CisgIAorCisgIC8qIENNUCBhbmQgQ01QVSBjaGFuZ2UgdGhlaXIgbmFtZSBiYXNlZCBvbiBjb25kaXRpb24gY29kZXMgKi8KKyAgaWYgKCFzdHJuY21wIChuYW1lLCAiY21wIiwgMykpCisgICAgeworICAgICAgaW50IHAsaTsKKyAgICAgIGNoYXIgKipzdHIgPSAoY2hhciAqKilkMzB2X2NjX25hbWVzOworICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCXAgPSA0OworICAgICAgZWxzZQorCXAgPSAzOworCisgICAgICBmb3IgKGk9MTsgKnN0ciAmJiBzdHJuY21wICgqc3RyLCAmIG5hbWVbcF0sIDIpOyBpKyssIHN0cisrKQorCTsKKworICAgICAgLyogY21wdSBvbmx5IHN1cHBvcnRzIHNvbWUgY29uZGl0aW9uIGNvZGVzICovCisgICAgICBpZiAocCA9PSA0KQorCXsKKwkgIGlmIChpIDwgMyB8fCBpID4gNikKKwkgICAgeworCSAgICAgIG5hbWVbcCsyXT0wOworCSAgICAgIGFzX2JhZCAoXygiY21wdSBkb2Vzbid0IHN1cHBvcnQgY29uZGl0aW9uIGNvZGUgJXMiKSwmbmFtZVtwXSk7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICghKnN0cikKKwl7CisJICBuYW1lW3ArMl09MDsKKwkgIGFzX2JhZCAoXygidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiKSwmbmFtZVtwXSk7ICAgICAgCisJfQorICAgICAgCisgICAgICBjbXBfaGFjayA9IGk7CisgICAgICBuYW1lW3BdID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICBjbXBfaGFjayA9IDA7CisgIAorICAvKiAgcHJpbnRmKCJjbXBfaGFjaz0lZFxuIixjbXBfaGFjayk7ICovCisKKyAgLyogbmVlZCB0byBsb29rIGZvciAucyBvciAubCAqLworICBpZiAobmFtZVtubGVuLTJdID09ICcuJykKKyAgICB7CisgICAgICBzd2l0Y2ggKG5hbWVbbmxlbi0xXSkKKwl7CisJY2FzZSAncyc6CisJICBmc2l6ZSA9IEZPUkNFX1NIT1JUOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJICBmc2l6ZSA9IEZPUkNFX0xPTkc7CisJICBicmVhazsKKwl9CisgICAgICBuYW1lW25sZW4tMl0gPSAwOworICAgIH0KKworICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8gIAorICBvcGNvZGUtPm9wID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWhhc2hfZmluZCAoZDMwdl9oYXNoLCBuYW1lKTsKKyAgaWYgKG9wY29kZS0+b3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlOiAlcyIpLG5hbWUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7CisgIHdoaWxlICghKG9wY29kZS0+Zm9ybSA9IGZpbmRfZm9ybWF0IChvcGNvZGUtPm9wLCBteW9wcywgZnNpemUsIGNtcF9oYWNrKSkpCisgICAgeworICAgICAgb3Bjb2RlLT5vcCsrOworICAgICAgaWYgKG9wY29kZS0+b3AtPm5hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKG9wY29kZS0+b3AtPm5hbWUsIG5hbWUpKQorCXsKKwkgIGFzX2JhZCAoXygib3BlcmFuZHMgZm9yIG9wY29kZSBgJXMnIGRvIG5vdCBtYXRjaCBhbnkgdmFsaWQgZm9ybWF0IiksIG5hbWUpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7CisKKyAgaW5zbiA9IGJ1aWxkX2luc24gKG9wY29kZSwgbXlvcHMpOyAKKworICAvKiBQcm9waWdhdGUgbXVsdGlwbHkgc3RhdHVzICovCisgIGlmIChpbnNuICE9IC0xKQorICAgIHsKKyAgICAgIGlmIChpc19wYXJhbGxlbCAmJiBwcmV2X211bDMyX3ApCisJY3VyX211bDMyX3AgPSAxOworICAgICAgZWxzZQorCXsKKwkgIHByZXZfbXVsMzJfcCA9IGN1cl9tdWwzMl9wOworCSAgY3VyX211bDMyX3AgID0gKG9wY29kZS0+b3AtPmZsYWdzX3VzZWQgJiBGTEFHX01VTDMyKSAhPSAwOworCX0KKyAgICB9CisKKyAgLyogUHJvcGFnYXRlIGxlZnRfa2lsbHNfcmlnaHQgc3RhdHVzICovCisgIGlmIChpbnNuICE9IC0xKQorICAgIHsKKyAgICAgIHByZXZfbGVmdF9raWxsc19yaWdodF9wID0gY3VyX2xlZnRfa2lsbHNfcmlnaHRfcDsKKworICAgICAgaWYgKG9wY29kZS0+b3AtPmZsYWdzX3NldCAmIEZMQUdfTEtSKQorCXsKKwkgIGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAxOworCSAgCisJICBpZiAoc3RyY21wIChvcGNvZGUtPm9wLT5uYW1lLCAibXZ0c3lzIikgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIExlZnQga2lsbHMgcmlnaHQgZm9yIG9ubHkgbXZ0c3lzIG9ubHkgZm9yIFBTVy9QU1dIL1BTV0wvZmxhZ3MgdGFyZ2V0LiAqLworCSAgICAgIGlmICgobXlvcHNbMF0uWF9vcCA9PSBPX3JlZ2lzdGVyKSAmJgorCQkgICgobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCkgfHwgLyogcHN3ICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysyKSB8fCAvKiBwc3doICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysxKSB8fCAvKiBwc3dsICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzApIHx8IC8qIGYwICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzEpIHx8IC8qIGYxICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzIpIHx8IC8qIGYyICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzMpIHx8IC8qIGYzICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzQpIHx8IC8qIGY0ICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzUpIHx8IC8qIGY1ICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzYpIHx8IC8qIGY2ICovCisJCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzcpKSkgLyogZjcgKi8KKwkJeworCQkgIGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAxOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogT3RoZXIgbXZ0c3lzIHRhcmdldCByZWdpc3RlcnMgZG9uJ3Qga2lsbCByaWdodCBpbnN0cnVjdGlvbi4gKi8KKwkJICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMDsKKwkJfQorCSAgICB9IC8qIG12dHN5cyAqLworCX0KKyAgICAgIGVsc2UKKwljdXJfbGVmdF9raWxsc19yaWdodF9wID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIGluc247Cit9CisKKworLyogZmluZF9mb3JtYXQoKSBnZXRzIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZm9ybWF0IHRhYmxlLgorICAgSXQgbXVzdCBsb29rIGF0IGFsbCBmb3JtYXRzIGZvciBhbiBvcGNvZGUgYW5kIHVzZSB0aGUgb3BlcmFuZHMKKyAgIHRvIGNob29zZSB0aGUgY29ycmVjdCBvbmUuICBSZXR1cm5zIE5VTEwgb24gZXJyb3IuICovCisKK3N0YXRpYyBzdHJ1Y3QgZDMwdl9mb3JtYXQgKgorZmluZF9mb3JtYXQgKG9wY29kZSwgbXlvcHMsIGZzaXplLCBjbXBfaGFjaykKKyAgICAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcGNvZGU7CisgICAgIGV4cHJlc3Npb25TIG15b3BzW107CisgICAgIGludCBmc2l6ZTsKKyAgICAgaW50IGNtcF9oYWNrOworeworICBpbnQgbnVtb3BzLCBtYXRjaCwgaW5kZXgsIGk9MCwgaiwgazsKKyAgc3RydWN0IGQzMHZfZm9ybWF0ICpmbTsKKworICBpZiAob3Bjb2RlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICAvKiBHZXQgYWxsIHRoZSBvcGVyYW5kcyBhbmQgc2F2ZSB0aGVtIGFzIGV4cHJlc3Npb25zLiAgKi8KKyAgbnVtb3BzID0gZ2V0X29wZXJhbmRzIChteW9wcywgY21wX2hhY2spOworCisgIHdoaWxlICgoaW5kZXggPSBvcGNvZGUtPmZvcm1hdFtpKytdKSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChmc2l6ZSA9PSBGT1JDRV9TSE9SVCAmJiBpbmRleCA+PSBMT05HKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoZnNpemUgPT0gRk9SQ0VfTE9ORyAmJiBpbmRleCA8IExPTkcpCisJY29udGludWU7CisKKyAgICAgIGZtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVtpbmRleF07CisgICAgICBrID0gaW5kZXg7CisgICAgICB3aGlsZSAoZm0tPmZvcm0gPT0gaW5kZXgpCisJeworCSAgbWF0Y2ggPSAxOworCSAgLyogTm93IGNoZWNrIHRoZSBvcGVyYW5kcyBmb3IgY29tcGF0aWJpbGl0eS4gICovCisJICBmb3IgKGogPSAwOyBtYXRjaCAmJiBmbS0+b3BlcmFuZHNbal07IGorKykKKwkgICAgeworCSAgICAgIGludCBmbGFncyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmZsYWdzOworCSAgICAgIGludCBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uYml0czsKKwkgICAgICBpbnQgWF9vcCA9IG15b3BzW2pdLlhfb3A7CisJICAgICAgaW50IG51bSA9IG15b3BzW2pdLlhfYWRkX251bWJlcjsKKwkgICAgICAKKwkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpCisJCWJyZWFrOworCSAgICAgIGVsc2UgaWYgKFhfb3AgPT0gT19pbGxlZ2FsKQorCQltYXRjaCA9IDA7CisJICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKKwkJeworCQkgIGlmIChYX29wICE9IE9fcmVnaXN0ZXIKKwkJICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQUNDKSAmJiAhKG51bSAmIE9QRVJBTkRfQUNDKSkKKwkJICAgICAgfHwgKCEoZmxhZ3MgJiBPUEVSQU5EX0FDQykgJiYgKG51bSAmIE9QRVJBTkRfQUNDKSkKKwkJICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfRkxBRykgJiYgIShudW0gJiBPUEVSQU5EX0ZMQUcpKQorCQkgICAgICB8fCAoIShmbGFncyAmIChPUEVSQU5EX0ZMQUcgfCBPUEVSQU5EX0NPTlRST0wpKSAmJiAobnVtICYgT1BFUkFORF9GTEFHKSkKKwkJICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKKwkJCSAgJiYgIShudW0gJiAoT1BFUkFORF9DT05UUk9MIHwgT1BFUkFORF9GTEFHKSkpKQorCQkgICAgeworCQkgICAgICBtYXRjaCA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmICgoKGZsYWdzICYgT1BFUkFORF9NSU5VUykKKwkJICAgICAgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9NSU5VUykpCisJCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9QTFVTKQorCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfUExVUykpCisJCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVE1JTlVTKQorCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfQVRNSU5VUykpCisJCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVFBBUikKKwkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUUEFSKSkKKwkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FUU0lHTikKKwkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUU0lHTikpKQorCQl7CisJCSAgbWF0Y2g9MDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9OVU0pCisJCXsKKwkJICAvKiBBIG51bWJlciBjYW4gYmUgYSBjb25zdGFudCBvciBzeW1ib2wgZXhwcmVzc2lvbi4gICovCisKKwkJICAvKiBJZiB3ZSBoYXZlIGZvdW5kIGEgcmVnaXN0ZXIgbmFtZSwgYnV0IHRoYXQgbmFtZSBhbHNvCisJCSAgICAgbWF0Y2hlcyBhIHN5bWJvbCwgdGhlbiByZS1wYXJzZSB0aGUgbmFtZSBhcyBhbiBleHByZXNzaW9uLiAgKi8KKwkJICBpZiAoWF9vcCA9PSBPX3JlZ2lzdGVyCisJCSAgICAgICYmIHN5bWJvbF9maW5kICgoY2hhciAqKSBteW9wc1tqXS5YX29wX3N5bWJvbCkpCisJCSAgICB7CisJCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IChjaGFyICopIG15b3BzW2pdLlhfb3Bfc3ltYm9sOworCQkgICAgICBleHByZXNzaW9uICgmIG15b3BzW2pdKTsKKwkJICAgIH0KKwkJICAgICAgCisJCSAgLyogVHVybiBhbiBleHByZXNzaW9uIGludG8gYSBzeW1ib2wgZm9yIGxhdGVyIHJlc29sdXRpb24uICAqLworCQkgIGlmIChYX29wICE9IE9fYWJzZW50ICYmIFhfb3AgIT0gT19jb25zdGFudAorCQkgICAgICAmJiBYX29wICE9IE9fc3ltYm9sICYmIFhfb3AgIT0gT19yZWdpc3RlcgorCQkgICAgICAmJiBYX29wICE9IE9fYmlnKQorCQkgICAgeworCQkgICAgICBzeW1ib2xTICpzeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmbXlvcHNbal0pOworCQkgICAgICBteW9wc1tqXS5YX29wID0gWF9vcCA9IE9fc3ltYm9sOworCQkgICAgICBteW9wc1tqXS5YX2FkZF9zeW1ib2wgPSBzeW07CisJCSAgICAgIG15b3BzW2pdLlhfYWRkX251bWJlciA9IG51bSA9IDA7CisJCSAgICB9CisKKwkJICBpZiAoZm0tPmZvcm0gPj0gTE9ORykKKwkJICAgIHsKKwkJICAgICAgLyogSWYgd2UncmUgdGVzdGluZyBmb3IgYSBMT05HIGZvcm1hdCwgZWl0aGVyIGZpdHMuICovCisJCSAgICAgIGlmIChYX29wICE9IE9fY29uc3RhbnQgJiYgWF9vcCAhPSBPX3N5bWJvbCkKKwkJCW1hdGNoID0gMDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChmbS0+Zm9ybSA8IExPTkcKKwkJCSAgICYmICgoZnNpemUgPT0gRk9SQ0VfU0hPUlQgJiYgWF9vcCA9PSBPX3N5bWJvbCkKKwkJCSAgICAgICB8fCAoZm0tPmZvcm0gPT0gU0hPUlRfRDIgJiYgaiA9PSAwKSkpCisJCSAgICBtYXRjaCA9IDE7CisJCSAgLyogVGhpcyBpcyB0aGUgdHJpY2t5IHBhcnQuICBXaWxsIHRoZSBjb25zdGFudCBvciBzeW1ib2wKKwkJICAgICBmaXQgaW50byB0aGUgc3BhY2UgaW4gdGhlIGN1cnJlbnQgZm9ybWF0PyAqLworCQkgIGVsc2UgaWYgKFhfb3AgPT0gT19jb25zdGFudCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGNoZWNrX3JhbmdlIChudW0sIGJpdHMsIGZsYWdzKSkKKwkJCW1hdGNoID0gMDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChYX29wID09IE9fc3ltYm9sCisJCQkgICAmJiBTX0lTX0RFRklORUQgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkKKwkJCSAgICYmIFNfR0VUX1NFR01FTlQgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkgPT0gbm93X3NlZworCQkJICAgJiYgb3Bjb2RlLT5yZWxvY19mbGFnID09IFJFTE9DX1BDUkVMKQorCQkgICAgeworCQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQKKwkJCSBpbnRvIHRoZSBmb3JtIHdlJ3JlIGNvbnNpZGVyaW5nLiAqLworCQkgICAgICBmcmFnUyAqZjsKKwkJICAgICAgbG9uZyB2YWx1ZTsKKworCQkgICAgICAvKiBDYWxjdWxhdGUgdGhlIGN1cnJlbnQgYWRkcmVzcyBieSBydW5uaW5nIHRocm91Z2ggdGhlCisJCQkgcHJldmlvdXMgZnJhZ3MgYW5kIGFkZGluZyBvdXIgY3VycmVudCBvZmZzZXQuICAqLworCQkgICAgICB2YWx1ZSA9IDA7CisJCSAgICAgIGZvciAoZiA9IGZyY2hhaW5fbm93LT5mcmNoX3Jvb3Q7IGY7IGYgPSBmLT5mcl9uZXh0KQorCQkJdmFsdWUgKz0gZi0+ZnJfZml4ICsgZi0+ZnJfb2Zmc2V0OworCQkgICAgICB2YWx1ZSA9IChTX0dFVF9WQUxVRSAobXlvcHNbal0uWF9hZGRfc3ltYm9sKSAtIHZhbHVlCisJCQkgICAgICAgLSAob2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKQorCQkJCSAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkpOworCQkgICAgICBpZiAoY2hlY2tfcmFuZ2UgKHZhbHVlLCBiaXRzLCBmbGFncykpIAorCQkJbWF0Y2ggPSAwOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIG1hdGNoID0gMDsKKwkJfQorCSAgICB9CisJICAvKiBwcmludGYoInRocm91Z2ggdGhlIGxvb3A6IG1hdGNoPSVkXG4iLG1hdGNoKTsgICovCisJICAvKiBXZSdyZSBvbmx5IGRvbmUgaWYgdGhlIG9wZXJhbmRzIG1hdGNoZWQgc28gZmFyIEFORCB0aGVyZQorCSAgICAgYXJlIG5vIG1vcmUgdG8gY2hlY2suICAqLworCSAgaWYgKG1hdGNoICYmIG15b3BzW2pdLlhfb3AgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEZpbmFsIGNoZWNrIC0gaXNzdWUgYSB3YXJuaW5nIGlmIGFuIG9kZCBudW1iZXJlZCByZWdpc3RlcgorCQkgaXMgdXNlZCBhcyB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWFkcworCQkgb3Igd3JpdGVzIDIgcmVnaXN0ZXJzLiAgKi8KKworCSAgICAgIGZvciAoaiA9IDA7IGZtLT5vcGVyYW5kc1tqXTsgaisrKQorCQlpZiAobXlvcHNbal0uWF9vcCA9PSBPX3JlZ2lzdGVyCisJCSAgICAmJiAobXlvcHNbal0uWF9hZGRfbnVtYmVyICYgMSkKKwkJICAgICYmIChkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5mbGFncyAmIE9QRVJBTkRfMlJFRykpCisJCSAgYXNfd2FybiAoXAorXygiT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uIikpOworCSAgICAgIAorCSAgICAgIHJldHVybiBmbTsKKwkgICAgfQorCSAgZm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopJmQzMHZfZm9ybWF0X3RhYmxlWysra107CisJfQorICAgICAgLyogcHJpbnRmKCJ0cnlpbmcgYW5vdGhlciBmb3JtYXQ6IGk9JWRcbiIsaSk7ICovCisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCisvKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLworICAgICAgICAgICAgICAgICAKK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCisgICAgIGFzZWN0aW9uICpzZWc7CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGFyZWxlbnQgKnJlbG9jOworICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07CisgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKKyAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOworICByZXR1cm4gcmVsb2M7Cit9CisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCisgICAgIGZyYWdTICpmcmFncDsKKyAgICAgYXNlY3Rpb24gKnNlZzsKK3sKKyAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfSAKKworbG9uZworbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCisgICAgIGZpeFMgKmZpeHA7CisgICAgIHNlZ1Qgc2VjOworeworICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKilOVUxMICYmICghU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkgfHwKKyAgICAgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKK30KKworaW50CittZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKKyAgICAgZml4UyAqIGZpeHA7CisgICAgIHZhbHVlVCAqIHZhbHVlcDsKKyAgICAgc2VnVCBzZWc7Cit7CisgIGNoYXIgKiB3aGVyZTsKKyAgdW5zaWduZWQgbG9uZyBpbnNuLCBpbnNuMjsKKyAgbG9uZyB2YWx1ZTsKKyAgCisgIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIHsKKyAgICAgIHZhbHVlID0gKiB2YWx1ZXA7CisgICAgICBmaXhwLT5meF9kb25lID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQorICAgIHZhbHVlID0gKiB2YWx1ZXA7CisgIGVsc2UKKyAgICB7CisgICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKKyAgICAgIAorICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCisJeworCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSAKKwkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLworCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOworCSAgICB9CisJfQorICAgIH0KKyAgCisgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCisgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLworICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKKyAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgCisgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ184OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5ieXRlIGRpcmVjdGl2ZS4gICovCisgICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKKwlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBieXRlIiksCisJCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7CisgICAgICBlbHNlIGlmICgoKHVuc2lnbmVkKXZhbHVlKSA+IDB4ZmYpCisJICBhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgYnl0ZSIpLAorCQkgICAgZml4cC0+ZnhfbGluZSwgdmFsdWUpOworICAgICAgZWxzZQorCSogKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBCRkRfUkVMT0NfMTY6ICAvKiBDaGVjayBmb3IgYSBiYWQgLnNob3J0IGRpcmVjdGl2ZS4gICovCisgICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKKwlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBzaG9ydCIpLAorCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOworICAgICAgZWxzZSBpZiAoKCh1bnNpZ25lZCl2YWx1ZSkgPiAweGZmZmYpCisJICBhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgc2hvcnQiKSwKKwkJICAgIGZpeHAtPmZ4X2xpbmUsIHZhbHVlKTsKKyAgICAgIGVsc2UKKwliZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBCRkRfUkVMT0NfNjQ6ICAvKiBDaGVjayBmb3IgYSBiYWQgLnF1YWQgZGlyZWN0aXZlLiAgKi8KKyAgICAgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQorCWFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHF1YWQiKSwKKwkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKKyAgICAgIGVsc2UKKwl7CisJICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKwkgIGJmZF9wdXRiMzIgKDAsICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSkgKyA0KTsKKwl9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfNjoKKyAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCA2LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKKyAgICAgIGluc24gfD0gdmFsdWUgJiAweDNGOworICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMOgorICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICYgMHg3KQorCXsKKwkgIGlmIChmaXhwLT5meF9kb25lKQorCSAgICB2YWx1ZSArPSA0OworCSAgZWxzZQorCSAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1I7CisJfQorICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDksIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOworICAgICAgaW5zbiB8PSAoKHZhbHVlID4+IDMpICYgMHgzRikgPDwgMTI7CisgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzE1OgorICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDE1LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKKyAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHhGRkY7CisgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMOgorICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICYgMHg3KQorCXsKKwkgIGlmIChmaXhwLT5meF9kb25lKQorCSAgICB2YWx1ZSArPSA0OworCSAgZWxzZQorCSAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SOworCX0KKyAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAxNSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7CisgICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4RkZGOworICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8yMToKKyAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAyMSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7CisgICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4M0ZGRkY7CisgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMOgorICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICYgMHg3KQorCXsKKwkgIGlmIChmaXhwLT5meF9kb25lKQorCSAgICB2YWx1ZSArPSA0OworCSAgZWxzZQorCSAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SOworCX0KKyAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAyMSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7CisgICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4M0ZGRkY7CisgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzMyOgorICAgICAgaW5zbjIgPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOworICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMjYpICYgMHgzRjsJCS8qIHRvcCA2IGJpdHMgKi8KKyAgICAgIGluc24yIHw9ICgodmFsdWUgJiAweDAzRkMwMDAwKSA8PCAyKTsJLyogbmV4dCA4IGJpdHMgKi8gCisgICAgICBpbnNuMiB8PSB2YWx1ZSAmIDB4MDAwM0ZGRkY7CQkvKiBib3R0b20gMTggYml0cyAqLworICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuMiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTDoKKyAgICAgIGluc24yID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKKyAgICAgIGluc24gfD0gKHZhbHVlID4+IDI2KSAmIDB4M0Y7CQkvKiB0b3AgNiBiaXRzICovCisgICAgICBpbnNuMiB8PSAoKHZhbHVlICYgMHgwM0ZDMDAwMCkgPDwgMik7CS8qIG5leHQgOCBiaXRzICovIAorICAgICAgaW5zbjIgfD0gdmFsdWUgJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KKyAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbjIsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19iYWQgKF8oImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IiksCisJICAgICAgZml4cC0+ZnhfbGluZSxmaXhwLT5meF9yX3R5cGUpOworICAgIH0KKyAgCisgIHJldHVybiAwOworfQorCisKKy8qIGQzMHZfY2xlYW51cCgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBpbnB1dCAKKyAgIGZpbGUgb3IgYWZ0ZXIgYSBsYWJlbCBpcyBkZWZpbmVkLiAgQmVjYXVzZSB0aGUgRDMwViBhc3NlbWJsZXIgc29tZXRpbWVzIHNhdmVzIHNob3J0IAorICAgaW5zdHJ1Y3Rpb25zIHRvIHNlZSBpZiBpdCBjYW4gcGFja2FnZSB0aGVtIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHRoZXJlIG1heQorICAgYmUgYSBzaG9ydCBpbnN0cnVjdGlvbiB0aGF0IHN0aWxsIG5lZWRzIHdyaXR0ZW4uICAqLworaW50CitkMzB2X2NsZWFudXAgKHVzZV9zZXF1ZW50aWFsKQorICAgICBpbnQgdXNlX3NlcXVlbnRpYWw7Cit7CisgIHNlZ1Qgc2VnOworICBzdWJzZWdUIHN1YnNlZzsKKworICBpZiAocHJldl9pbnNuICE9IC0xKQorICAgIHsKKyAgICAgIHNlZyA9IG5vd19zZWc7CisgICAgICBzdWJzZWcgPSBub3dfc3Vic2VnOworICAgICAgc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKKyAgICAgIHdyaXRlXzFfc2hvcnQgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLCBmaXh1cHMtPm5leHQsIHVzZV9zZXF1ZW50aWFsKTsKKyAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKKyAgICAgIHByZXZfaW5zbiA9IC0xOworICAgICAgaWYgKHVzZV9zZXF1ZW50aWFsKQorCXByZXZfbXVsMzJfcCA9IGZhbHNlOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgIAorZDMwdl9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG4pCisgICAgIGNoYXIgKmJ1ZjsJCQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KKyAgICAgbG9uZyBsb25nIHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLworICAgICBpbnQgbjsJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KK3sKKyAgd2hpbGUgKG4tLSkKKyAgICB7CisgICAgICBidWZbbl0gPSB2YWx1ZSAmIDB4ZmY7CisgICAgICB2YWx1ZSA+Pj0gODsKKyAgICB9Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGxpbmUuICovCisvKiBpdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSAnLicgKi8KKy8qIHdoaWNoIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBwc2V1ZG8tb3AuICBJZiBpdCBpcywgKi8KKy8qIHRoZW4gd3JpdGUgb3V0IGFueSB1bndyaXR0ZW4gaW5zdHJ1Y3Rpb25zICovCisKK3ZvaWQgCitkMzB2X3N0YXJ0X2xpbmUgKCkKK3sKKyAgY2hhciAqYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICB3aGlsZSAoaXNzcGFjZSAoKmMpKQorICAgIGMrKzsKKworICBpZiAoKmMgPT0gJy4nKQorICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCAKK2NoZWNrX3NpemUgKHZhbHVlLCBiaXRzLCBmaWxlLCBsaW5lKQorICAgICBsb25nIHZhbHVlOworICAgICBpbnQgYml0czsKKyAgICAgY2hhciAqZmlsZTsKKyAgICAgaW50IGxpbmU7Cit7CisgIGludCB0bXAsIG1heDsKKworICBpZiAodmFsdWUgPCAwKQorICAgIHRtcCA9IH52YWx1ZTsKKyAgZWxzZQorICAgIHRtcCA9IHZhbHVlOworICAgIAorICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7CisKKyAgaWYgKHRtcCA+IG1heCkKKyAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oInZhbHVlIHRvbyBsYXJnZSB0byBmaXQgaW4gJWQgYml0cyIpLCBiaXRzKTsKKworICByZXR1cm47Cit9CisKKy8qIGQzMHZfZnJvYl9sYWJlbCgpIGlzIGNhbGxlZCB3aGVuIGFmdGVyIGEgbGFiZWwgaXMgcmVjb2duaXplZC4gICovCisKK3ZvaWQKK2QzMHZfZnJvYl9sYWJlbCAobGFiKQorICAgICBzeW1ib2xTICpsYWI7Cit7CisgIC8qIEVtaXQgYW55IHBlbmRpbmcgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgZDMwdl9jbGVhbnVwIChmYWxzZSk7CisKKyAgLyogVXBkYXRlIHRoZSBsYWJlbCdzIGFkZHJlc3Mgd2l0aCB0aGUgY3VycmVudCBvdXRwdXQgcG9pbnRlci4gICovCisgIGxhYi0+c3lfZnJhZyA9IGZyYWdfbm93OworICBTX1NFVF9WQUxVRSAobGFiLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOworCisgIC8qIFJlY29yZCB0aGlzIGxhYmVsIGZvciBmdXR1cmUgYWRqdXN0bWVudCBhZnRlciB3ZSBmaW5kIG91dCB3aGF0CisgICAgIGtpbmQgb2YgZGF0YSBpdCByZWZlcmVuY2VzLCBhbmQgdGhlIHJlcXVpcmVkIGFsaWdubWVudCB0aGVyZXdpdGguICAqLworICBkMzB2X2xhc3RfbGFiZWwgPSBsYWI7Cit9CisKKy8qIEhvb2sgaW50byBjb25zIGZvciBjYXB0dXJpbmcgYWxpZ25tZW50IGNoYW5nZXMuICAqLworCit2b2lkCitkMzB2X2NvbnNfYWxpZ24gKHNpemUpCisgICAgIGludCBzaXplOworeworICBpbnQgbG9nX3NpemU7CisKKyAgbG9nX3NpemUgPSAwOworICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCisgICAgKytsb2dfc2l6ZTsKKworICBpZiAoZDMwdl9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCisgICAgZDMwdl9hbGlnbiAobG9nX3NpemUsIChjaGFyICopIE5VTEwsIE5VTEwpOworICBlbHNlIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKKyAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSBsb2dfc2l6ZTsKKyAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKK30KKworLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKKyAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKKyAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ25pbmcKKyAgIGxhYmVscyB3cnQgY29kZS4gICovCisKK3N0YXRpYyB2b2lkCitkMzB2X2FsaWduIChuLCBwZmlsbCwgbGFiZWwpCisgICAgIGludCBuOworICAgICBjaGFyICpwZmlsbDsKKyAgICAgc3ltYm9sUyAqbGFiZWw7Cit7CisgIC8qIFRoZSBmcm9udCBlbmQgaXMgcHJvbmUgdG8gY2hhbmdpbmcgc2VnbWVudHMgb3V0IGZyb20gdW5kZXIgdXMKKyAgICAgdGVtcG9yYXJpbHkgd2hlbiAtZyBpcyBpbiBlZmZlY3QuICAqLworICBpbnQgc3dpdGNoZWRfc2VnX3AgPSAoZDMwdl9jdXJyZW50X2FsaWduX3NlZyAhPSBub3dfc2VnKTsKKworICAvKiBEbyBub3QgYXNzdW1lIHRoYXQgaWYgJ2QzMHZfY3VycmVudF9hbGlnbiA+PSBuJyBhbmQKKyAgICAgJyEgc3dpdGNoZWRfc2VnX3AnIHRoYXQgaXQgaXMgc2FmZSB0byBhdm9pZCBwZXJmb3JtaW5nCisgICAgIHRoaXMgYWxpZ25lbWVudCByZXF1ZXN0LiAgVGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBmcmFnCisgICAgIGNhbiBiZSBjaGFuZ2VkIHVuZGVyIG91ciBmZWV0LCBmb3IgZXhhbXBsZSBieSBhIC5hc2NpaQorICAgICBkaXJlY3RpdmUgaW4gdGhlIHNvdXJjZSBjb2RlLiAgY2YgdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMgICovCisgIAorICBkMzB2X2NsZWFudXAgKGZhbHNlKTsKKworICBpZiAocGZpbGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobiA+IDIKKwkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKKwl7CisJICBzdGF0aWMgY2hhciBjb25zdCBub3BbNF0gPSB7IDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAgfTsKKworCSAgLyogRmlyc3QsIG1ha2Ugc3VyZSB3ZSdyZSBvbiBhIGZvdXItYnl0ZSBib3VuZGFyeSwgaW4gY2FzZQorCSAgICAgc29tZW9uZSBoYXMgYmVlbiBwdXR0aW5nIC5ieXRlIHZhbHVlcyB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KKwkgIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCAyIHx8IHN3aXRjaGVkX3NlZ19wKQorCSAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKKwkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbm9wLCBzaXplb2Ygbm9wLCAwKTsKKwl9CisgICAgICBlbHNlCisJZnJhZ19hbGlnbiAobiwgMCwgMCk7CisgICAgfQorICBlbHNlCisgICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKKworICBpZiAoIXN3aXRjaGVkX3NlZ19wKQorICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IG47CisKKyAgaWYgKGxhYmVsICE9IE5VTEwpCisgICAgeworICAgICAgc3ltYm9sUyAqICAgICBzeW07CisgICAgICBpbnQgICAgICAgICAgIGxhYmVsX3NlZW4gPSBmYWxzZTsKKyAgICAgIHN0cnVjdCBmcmFnICogb2xkX2ZyYWc7CisgICAgICB2YWx1ZVQgICAgICAgIG9sZF92YWx1ZTsKKyAgICAgIHZhbHVlVCAgICAgICAgbmV3X3ZhbHVlOworICAgICAgCisgICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKKworICAgICAgb2xkX2ZyYWcgID0gbGFiZWwtPnN5X2ZyYWc7CisgICAgICBvbGRfdmFsdWUgPSBTX0dFVF9WQUxVRSAobGFiZWwpOworICAgICAgbmV3X3ZhbHVlID0gKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpOworICAgICAgCisgICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbGFiZWwgYXQgYSBwYXJ0aWN1bGFyCisJIGFkZHJlc3MsIGVzcGVjaWFsbHkgaWYgZGVidWdnaW5nIGlzIGVuYWJsZWQsIHNvIHdlIG11c3QKKwkgdGFrZSBjYXJlIHRvIGFkanVzdCBhbGwgdGhlIGxhYmVscyBhdCB0aGlzIGFkZHJlc3MgaW4gdGhpcworCSBmcmFnbWVudC4gIFRvIHNhdmUgdGltZSB3ZSBzZWFyY2ggZnJvbSB0aGUgZW5kIG9mIHRoZSBzeW1ib2wKKwkgbGlzdCwgYmFja3dhcmRzLCBzaW5jZSB0aGUgc3ltYm9scyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBhcmUKKwkgYWxtb3N0IGNlcnRhaW5seSB0aGUgb25lcyB0aGF0IHdlcmUgbW9zdCByZWNlbnRseSBhZGRlZC4KKwkgQWxzbyB0byBzYXZlIHRpbWUgd2Ugc3RvcCBzZWFyY2hpbmcgb25jZSB3ZSBoYXZlIHNlZW4gYXQgbGVhc3QKKwkgb25lIG1hdGNoaW5nIGxhYmVsLCBhbmQgd2UgZW5jb3VudGVyIGEgbGFiZWwgdGhhdCBpcyBubyBsb25nZXIKKwkgaW4gdGhlIHRhcmdldCBmcmFnbWVudC4gIE5vdGUsIHRoaXMgc2VhcmNoIGlzIGd1YXJhbnRlZWQgdG8KKwkgZmluZCBhdCBsZWFzdCBvbmUgbWF0Y2ggd2hlbiBzeW0gPT0gbGFiZWwsIHNvIG5vIHNwZWNpYWwgY2FzZQorCSBjb2RlIGlzIG5lY2Vzc2FyeS4gICovCisgICAgICBmb3IgKHN5bSA9IHN5bWJvbF9sYXN0UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bS0+c3lfcHJldmlvdXMpCisJeworCSAgaWYgKHN5bS0+c3lfZnJhZyA9PSBvbGRfZnJhZyAmJiBTX0dFVF9WQUxVRSAoc3ltKSA9PSBvbGRfdmFsdWUpCisJICAgIHsKKwkgICAgICBsYWJlbF9zZWVuID0gdHJ1ZTsKKwkgICAgICBzeW0tPnN5X2ZyYWcgPSBmcmFnX25vdzsKKwkgICAgICBTX1NFVF9WQUxVRSAoc3ltLCBuZXdfdmFsdWUpOworCSAgICB9CisJICBlbHNlIGlmIChsYWJlbF9zZWVuICYmIHN5bS0+c3lfZnJhZyAhPSBvbGRfZnJhZykKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKK30KKworLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgVGhpcyBhbGlnbnMgdG8gYSBwb3dlciBvZiB0d28uICBXZQorICAgaG9vayBoZXJlIHRvIGxhdGNoIHRoZSBjdXJyZW50IGFsaWdubWVudC4gICovCisKK3N0YXRpYyB2b2lkCitzX2QzMHZfYWxpZ24gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IGFsaWduOworICBjaGFyIGZpbGwsICpwZmlsbCA9IE5VTEw7CisgIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OworCisgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCisgICAgeworICAgICAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OworICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQgYXNzdW1lZCIpLCBhbGlnbik7CisgICAgfQorICBlbHNlIGlmIChhbGlnbiA8IDApCisgICAgeworICAgICAgYXNfd2FybiAoXygiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiKSk7CisgICAgICBhbGlnbiA9IDA7CisgICAgfQorCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIGZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgIHBmaWxsID0gJmZpbGw7CisgICAgfQorCisgIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7CisgIGQzMHZfYWxpZ24gKGFsaWduLCBwZmlsbCwgTlVMTCk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAudGV4dCBwc2V1ZG8tb3AuICBUaGlzIGlzIGxpa2UgdGhlIHVzdWFsIG9uZSwgYnV0IGl0CisgICBjbGVhcnMgdGhlIHNhdmVkIGxhc3QgbGFiZWwgYW5kIHJlc2V0cyBrbm93biBhbGlnbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorc19kMzB2X3RleHQgKGkpCisgICAgIGludCBpOworCit7CisgIHNfdGV4dCAoaSk7CisgIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7CisgIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7CisgIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOworfQorCisvKiBIYW5kbGUgdGhlIC5kYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKKyAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCisKK3N0YXRpYyB2b2lkCitzX2QzMHZfZGF0YSAoaSkKKyAgICAgaW50IGk7Cit7CisgIHNfZGF0YSAoaSk7CisgIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7CisgIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7CisgIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOworfQorCisvKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKKyAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCisKK3N0YXRpYyB2b2lkCitzX2QzMHZfc2VjdGlvbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7CisgIGQzMHZfbGFzdF9sYWJlbCA9IE5VTEw7CisgIGQzMHZfY3VycmVudF9hbGlnbiA9IDA7CisgIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmggYi9nYXMvY29uZmlnL3RjLWQzMHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2NlMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1kMzB2LmgKQEAgLTAsMCArMSw1OSBAQAorLyogdGMtMzEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1kMzB2LmMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUgVENfRDMwVgorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyAjZXJyb3IgRDMwViBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKKyNlbmRpZgorCisvKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9kMzB2CisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLWQzMHYiCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKKyNkZWZpbmUgTURfQVBQTFlfRklYMworCisvKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KKyNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykgICAKKworLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCisKKyNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiAuLWZvbyBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLworCisvKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKyNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuCisKK2ludCBkMzB2X2NsZWFudXAgUEFSQU1TICgoaW50KSk7CisjZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCSAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSkKKyNkZWZpbmUgbWRfY2xlYW51cCgpCQkgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpCisjZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpICAgICAgKGNoID09ICc6JyAmJiBkMzB2X2NsZWFudXAgKGZhbHNlKSkKKyNkZWZpbmUgbWRfc3RhcnRfbGluZV9ob29rKCkJICAgICBkMzB2X3N0YXJ0X2xpbmUgKGZhbHNlKQorCit2b2lkIGQzMHZfZnJvYl9sYWJlbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKKyNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pCSAgICAgZDMwdl9mcm9iX2xhYmVsKHN5bSkKKwordm9pZCBkMzB2X2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7CisjZGVmaW5lIG1kX2NvbnNfYWxpZ24obmJ5dGVzKQkgICAgIGQzMHZfY29uc19hbGlnbihuYnl0ZXMpCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuYyBiL2dhcy9jb25maWcvdGMtZnIzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDc1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWZyMzAuYwpAQCAtMCwwICsxLDY2NCBAQAorLyogdGMtZnIzMC5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIEZ1aml0c3UgRlIzMC4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJvcGNvZGVzL2ZyMzAtZGVzYy5oIgorI2luY2x1ZGUgIm9wY29kZXMvZnIzMC1vcGMuaCIKKyNpbmNsdWRlICJjZ2VuLmgiCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgZGVzY3JpYmluZworICAgYW4gaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBDR0VOX0lOU04gKglpbnNuOworICBjb25zdCBDR0VOX0lOU04gKglvcmlnX2luc247CisgIENHRU5fRklFTERTCQlmaWVsZHM7CisjaWYgQ0dFTl9JTlRfSU5TTl9QCisgIENHRU5fSU5TTl9JTlQgICAgICAgICBidWZmZXIgWzFdOworI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKCooYnVmKSkKKyNlbHNlCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICBidWZmZXIgW0NHRU5fTUFYX0lOU05fU0laRV07CisjZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoYnVmKQorI2VuZGlmCisgIGNoYXIgKgkJYWRkcjsKKyAgZnJhZ1MgKgkJZnJhZzsKKyAgaW50ICAgICAgICAgICAgICAgICAgIG51bV9maXh1cHM7CisgIGZpeFMgKiAgICAgICAgICAgICAgICBmaXh1cHMgW0dBU19DR0VOX01BWF9GSVhVUFNdOworICBpbnQgICAgICAgICAgICAgICAgICAgaW5kaWNlcyBbTUFYX09QRVJBTkRfSU5TVEFOQ0VTXTsKK30KK2ZyMzBfaW5zbjsKKworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gICAgICAgID0gIjsiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSAgID0gIiMiOworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gInwiOworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7CisMCisjZGVmaW5lIEZSMzBfU0hPUlRPUFRTICIiCitjb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gRlIzMF9TSE9SVE9QVFM7CisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Cit7CisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgICAgYzsKKyAgICAgY2hhciAqIGFyZzsKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICBGSUxFICogc3RyZWFtOworeworICBmcHJpbnRmIChzdHJlYW0sIF8oIiBGUjMwIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIikpOworfSAKKworLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyAid29yZCIsCWNvbnMsCQk0IH0sCisgIHsgTlVMTCwgCU5VTEwsIAkJMCB9Cit9OworCisMCit2b2lkCittZF9iZWdpbiAoKQoreworICBmbGFnd29yZCBhcHBsaWNhYmxlOworICBzZWdUICAgICBzZWc7CisgIHN1YnNlZ1QgIHN1YnNlZzsKKworICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KKyAgCisgIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCisgIGdhc19jZ2VuX2NwdV9kZXNjID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAorCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAorCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKKwkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7CisgIGZyMzBfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOworCisgIC8qIFRoaXMgaXMgYSBjYWxsYmFjayBmcm9tIGNnZW4gdG8gZ2FzIHRvIHBhcnNlIG9wZXJhbmRzLiAgKi8KKyAgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGdhc19jZ2VuX3BhcnNlX29wZXJhbmQpOworfQorCit2b2lkCittZF9hc3NlbWJsZSAoc3RyKQorICAgICBjaGFyICogc3RyOworeworICBzdGF0aWMgaW50IGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdCA9IDA7CisgIGZyMzBfaW5zbiBpbnNuOworICBjaGFyICogICAgZXJybXNnOworICBjaGFyICogICAgc3RyMiA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLworICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOworCisgIGluc24uaW5zbiA9IGZyMzBfY2dlbl9hc3NlbWJsZV9pbnNuCisgICAgKGdhc19jZ2VuX2NwdV9kZXNjLCBzdHIsICYgaW5zbi5maWVsZHMsIGluc24uYnVmZmVyLCAmIGVycm1zZyk7CisgIAorICBpZiAoIWluc24uaW5zbikKKyAgICB7CisgICAgICBhc19iYWQgKGVycm1zZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIERvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IHdlIHBhc3MgZm9yIFJFTEFYX1AgaGVyZS4gICovCisgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAorCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoJiBpbnNuLmZpZWxkcyksIDEsIE5VTEwpOworCisgIC8qIFdhcm4gYWJvdXQgaW52YWxpZCBpbnNucyBpbiBkZWxheSBzbG90cy4gICovCisgIGlmIChsYXN0X2luc25faGFkX2RlbGF5X3Nsb3QKKyAgICAgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLmluc24sIENHRU5fSU5TTl9OT1RfSU5fREVMQVlfU0xPVCkpCisgICAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXMgbm90IGFsbG93ZWQgaW4gYSBkZWxheSBzbG90LiIpLAorCSAgICAgQ0dFTl9JTlNOX05BTUUgKGluc24uaW5zbikpOworCisgIGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdAorICAgID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QpOworfQorCisvKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCisgICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCisKK3ZvaWQgCittZF9vcGVyYW5kIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKK3sKKyAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CisgICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7CisgICAgfQorfQorCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1QgICBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKKyAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Cit9CisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgY2hhciAqIG5hbWU7Cit7CisgIHJldHVybiAwOworfQorDAorLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLworCisvKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCisKK2NvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQoreworLyogVGhlIGZpZWxkcyBhcmU6CisgICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCisgICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCisgICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZworICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KKworICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcworICAgICBlYWNoIGxpc3QuICAqLworICB7MSwgMSwgMCwgMH0sCisKKyAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAorICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCisgIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KKyAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgorICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KKyAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQorICAgICBjYXNlKS4gICovCisgIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCisgIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLworICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCisgIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLworICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KK307CisKK2xvbmcKK2ZyMzBfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCisgICAgIGZyYWdTICogZnJhZ1A7CisgICAgIGxvbmcgICAgc3RyZXRjaDsKK3sKKyAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCisgIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7CisgIGxvbmcgZ3Jvd3RoID0gMDsKKworICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KKyAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCisgICAgeworICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7CisJICBncm93dGggPSAyOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCisgICAgeworICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7CisJICBncm93dGggPSAtMjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOworCisgICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KKyAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7CisJICBncm93dGggKz0gMjsKKwl9CisgICAgfQorCisgIHJldHVybiBncm93dGg7Cit9CisKKy8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KKyAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgorICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCisKKyAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgorICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCisgICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCisgICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgorICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQorICAgMCB2YWx1ZS4gICovCisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQorICAgICBmcmFnUyAqIGZyYWdQOworICAgICBzZWdUICAgIHNlZ21lbnQ7Cit7CisgIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKKworICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCisgICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCisgICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCisgICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgorICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KKworICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKKyAgICB7CisgICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCisJIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQorCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLworICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOworCisjaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCisgICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLworICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOworCisgICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOworCisgICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCisgICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKKwkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKKwkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCisJCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLworCSAgICAgICBCRkRfUkVMT0NfRlIzMF8yNl9QQ1JFTCk7CisKKyAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCisgICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKKyNlbHNlCisgICAgICB7CisJY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgorCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KKwkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKKwkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLworCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCisJICB7CisJICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAorCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCisJCSA9PSAwKQorCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKKwkgICAgICBicmVhazsKKwkgIH0KKwlpZiAoaSA9PSA0KQorCSAgYWJvcnQgKCk7CisKKwlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKKwlyZXR1cm4gMjsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Cit9IAorCisvKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCisgICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgorCisgICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KKyAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgorICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICBiZmQgKiAgIGFiZmQ7CisgIHNlZ1QgICAgc2VjOworICBmcmFnUyAqIGZyYWdQOworeworI2lmIDAKKyAgY2hhciAqIG9wY29kZTsKKyAgY2hhciAqIGRpc3BsYWNlbWVudDsKKyAgaW50ICAgIHRhcmdldF9hZGRyZXNzOworICBpbnQgICAgb3Bjb2RlX2FkZHJlc3M7CisgIGludCAgICBleHRlbnNpb247CisgIGludCAgICBhZGRlbmQ7CisKKyAgb3Bjb2RlID0gZnJhZ1AtPmZyX29wY29kZTsKKworICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICAqLworICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7CisKKyAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKKyAgICB7CisgICAgY2FzZSAxIDoKKyAgICAgIGV4dGVuc2lvbiA9IDA7CisgICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMiA6CisgICAgICBvcGNvZGVbMF0gfD0gMHg4MDsKKyAgICAgIGV4dGVuc2lvbiA9IDI7CisgICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMyA6CisgICAgICBvcGNvZGVbMl0gPSBvcGNvZGVbMF0gfCAweDgwOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGUsIFBBUl9OT1BfSU5TTiwgMik7CisgICAgICBvcGNvZGVfYWRkcmVzcyArPSAyOworICAgICAgZXh0ZW5zaW9uID0gNDsKKyAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzNdOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKKyAgICB7CisgICAgICAvKiBzeW1ib2wgbXVzdCBiZSByZXNvbHZlZCBieSBsaW5rZXIgKi8KKyAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0ICYgMykKKwlhc193YXJuIChfKCJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIikpOworICAgICAgYWRkZW5kID0gZnJhZ1AtPmZyX29mZnNldCA+PiAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAgKi8KKyAgICAgIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKKyAgICAgIHRhcmdldF9hZGRyZXNzICs9IGZyYWdQLT5mcl9zeW1ib2wtPnN5X2ZyYWctPmZyX2FkZHJlc3M7CisgICAgICBhZGRlbmQgPSAodGFyZ2V0X2FkZHJlc3MgLSAob3Bjb2RlX2FkZHJlc3MgJiAtNCkpID4+IDI7CisgICAgfQorCisgIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCisgICAgIE90aGVyd2lzZSBvdXRwdXQgdGhlIGNvbXBsZXRlZCBpbnNuLiAgKi8KKworICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQorICAgIHsKKyAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMSk7CisgICAgICBhc3NlcnQgKGZyYWdQLT5mcl9jZ2VuLmluc24gIT0gMCk7CisgICAgICBnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWdQLAorCQkJICAgICAvKiBPZmZzZXQgb2YgYnJhbmNoIGluc24gaW4gZnJhZy4gICovCisJCQkgICAgIGZyYWdQLT5mcl9maXggKyBleHRlbnNpb24gLSA0LAorCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5pbnNuLAorCQkJICAgICA0IC8qbGVuZ3RoKi8sCisJCQkgICAgIC8qIEZJWE1FOiBxdWljayBoYWNrICovCisjaWYgMAorCQkJICAgICBDR0VOX09QRVJBTkRfRU5UUlkgKGZyYWdQLT5mcl9jZ2VuLm9waW5kZXgpLAorI2Vsc2UKKwkJCSAgICAgQ0dFTl9PUEVSQU5EX0VOVFJZIChGUjMwX09QRVJBTkRfRElTUDI0KSwKKyNlbmRpZgorCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5vcGluZm8sCisJCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQpOworICAgIH0KKworI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUobikgKChuKSA9PSAxID8gMSA6IDMpCisKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChkaXNwbGFjZW1lbnQsICh2YWx1ZVQpIGFkZGVuZCwKKwkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOworCisgIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOworI2VuZGlmCit9CisMCisvKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLworCisvKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCisgICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KKworbG9uZworbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCisgICAgIGZpeFMgKiBmaXhQOworICAgICBzZWdUICAgc2VjOworeworICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAorICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKKwkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KKwkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgfjE7Cit9CisKKy8qIFJldHVybiB0aGUgYmZkIHJlbG9jIHR5cGUgZm9yIE9QRVJBTkQgb2YgSU5TTiBhdCBmaXh1cCBGSVhQLgorICAgUmV0dXJucyBCRkRfUkVMT0NfTk9ORSBpZiBubyByZWxvYyB0eXBlIGNhbiBiZSBmb3VuZC4KKyAgICpGSVhQIG1heSBiZSBtb2RpZmllZCBpZiBkZXNpcmVkLiAgKi8KKworYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCittZF9jZ2VuX2xvb2t1cF9yZWxvYyAoaW5zbiwgb3BlcmFuZCwgZml4UCkKKyAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKKyAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKKyAgICAgZml4UyAqICAgICAgICAgICAgICAgZml4UDsKK3sKKyAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDk6ICBmaXhQLT5meF9wY3JlbCA9IDE7IHJldHVybiBCRkRfUkVMT0NfRlIzMF85X1BDUkVMOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTI6IGZpeFAtPmZ4X3BjcmVsID0gMTsgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMDogIHJldHVybiBCRkRfUkVMT0NfRlIzMF8xMF9JTl84OworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5OiAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF85X0lOXzg7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDg6ICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzhfSU5fODsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDY6ICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNl9JTl80OworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4OiAgICAgIHJldHVybiBCRkRfUkVMT0NfODsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzI6ICAgICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfNDg7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwOiAgICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzIwOworICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOworfQorCisvKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCisgICByZWxheGluZy4gICovCisKK2ludAorZnIzMF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCisgICAgIGZpeFMgKiBmaXg7Cit7CisgIGlmICggICBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisMCisvKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBlbmRpYW5uZXNzLiAgKi8KKwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKKyAgICAgY2hhciAqIGJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50ICAgIG47Cit7CisgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKK30KKworLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKKyAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKKyAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgorKi8KKworLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgICB0eXBlOworICAgICBjaGFyICogbGl0UDsKKyAgICAgaW50ICogIHNpemVQOworeworICBpbnQgICAgICAgICAgICAgIGk7CisgIGludCAgICAgICAgICAgICAgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgICB3b3JkcyBbTUFYX0xJVFRMRU5VTVNdOworICBjaGFyICogICAgICAgICAgIHQ7CisgIGNoYXIgKiAgICAgICAgICAgYXRvZl9pZWVlICgpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAvKiBGSVhNRTogU29tZSB0YXJnZXRzIGFsbG93IG90aGVyIGZvcm1hdCBjaGFycyBmb3IgYmlnZ2VyIHNpemVzIGhlcmUuICAqLworCisgICAgZGVmYXVsdDoKKyAgICAgICogc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOworICAgIH0KKworICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKyAgKiBzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCisJCQkgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICAgICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdvcmtlciBmdW5jdGlvbiBmb3IgZnIzMF9pc19jb2xvbl9pbnNuKCkuICAqLworc3RhdGljIGNoYXIKK3Jlc3RvcmVfY29sb24gKGFkdmFuY2VfaV9sX3BfYnkpCisgICAgIGludCBhZHZhbmNlX2lfbF9wX2J5OworeworICBjaGFyIGM7CisgIAorICAvKiBSZXN0b3JlIHRoZSBjb2xvbiwgYW5kIGFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHRvCisgICAgIHRoZSBlbmQgb2YgdGhlIG5ldyBzeW1ib2wuICAqLworICAqIGlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKKyAgaW5wdXRfbGluZV9wb2ludGVyICs9IGFkdmFuY2VfaV9sX3BfYnk7CisgIGMgPSAqIGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSAwOworICAKKyAgcmV0dXJuIGM7Cit9CisKKy8qIERldGVybWluZXMgaWYgdGhlIHN5bWJvbCBzdGFydGluZyBhdCBTVEFSVCBhbmQgZW5kaW5nIGluCisgICBhIGNvbG9uIHRoYXQgd2FzIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IElOUFVUX0xJTkVfUE9JTlRFUgorICAgKGJ1dCB3aGljaCBoYXMgbm93IGJlZW4gcmVwbGFjZWQgYnUgYSBOVUwpIGlzIGluIGZhY3QgYW4KKyAgIExESTo4LCBMREk6MjAsIExESTozMiwgQ0FMTDpELiBKTVA6RCwgUkVUOkQgb3IgQmNjOkQgaW5zdHJ1Y3Rpb24uCisgICBJZiBpdCBpcywgdGhlbiBpdCByZXN0b3JlcyB0aGUgY29sb24sIGFkdmFuY2VzIElOUFVUX0xJTkVfUE9JTlRFUgorICAgdG8gdGhlIHJlYWwgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi9zeW1ib2wsIGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIKKyAgIHRoYXQgcmVhbGx5IHRlcm1pbmF0ZWQgdGhlIHN5bWJvbC4gIE90aGVyd2lzZSBpdCByZXR1cm5zIDAuICAqLworY2hhcgorZnIzMF9pc19jb2xvbl9pbnNuIChzdGFydCkKKyAgICAgY2hhciAqICBzdGFydDsKK3sKKyAgY2hhciAqIGlfbF9wID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc3ltYm9sIHBhcnNlZCBzbyBmYXIgaXMgJ2xkaScgICovCisgIGlmICggICAoc3RhcnRbMF0gIT0gJ2wnICYmIHN0YXJ0WzBdICE9ICdMJykKKyAgICAgIHx8IChzdGFydFsxXSAhPSAnZCcgJiYgc3RhcnRbMV0gIT0gJ0QnKQorICAgICAgfHwgKHN0YXJ0WzJdICE9ICdpJyAmJiBzdGFydFsyXSAhPSAnSScpCisgICAgICB8fCBzdGFydFszXSAhPSAwKQorICAgIHsKKyAgICAgIC8qIE5vcGUgLSBjaGVjayB0byBzZWUgYSAnZCcgZm9sbG93cyB0aGUgY29sb24uICAqLworICAgICAgaWYgKCAgIChpX2xfcFsxXSA9PSAnZCcgfHwgaV9sX3BbMV0gPT0gJ0QnKQorCSAgJiYgKGlfbF9wWzJdID09ICcgJyB8fCBpX2xfcFsyXSA9PSAnXHQnIHx8IGlfbF9wWzJdID09ICdcbicpKQorCXsKKwkgIC8qIFl1cCAtIGl0IG1pZ2h0IGJlIGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb24uICAqLworCSAgaW50ICAgICAgICAgICBpOworCSAgc3RhdGljIGNoYXIgKiBkZWxheV9pbnNucyBbXSA9CisJICB7CisJICAgICJjYWxsIiwgImptcCIsICJyZXQiLCAiYnJhIiwgImJubyIsCisJICAgICJiZXEiLCAgImJuZSIsICJiYyIsICAiYm5jIiwgImJuIiwKKwkgICAgImJwIiwgICAiYnYiLCAgImJudiIsICJibHQiLCAiYmdlIiwKKwkgICAgImJsZSIsICAiYmd0IiwgImJscyIsICJiaGkiCisJICB9OworCisJICBmb3IgKGkgPSBzaXplb2YgKGRlbGF5X2luc25zKSAvIHNpemVvZiAoZGVsYXlfaW5zbnNbMF0pOyBpLS07KQorCSAgICB7CisJICAgICAgY2hhciAqIGluc24gPSBkZWxheV9pbnNuc1tpXTsKKwkgICAgICBpbnQgICAgbGVuICA9IHN0cmxlbiAoaW5zbik7CisKKwkgICAgICBpZiAoc3RhcnQgW2xlbl0gIT0gMCkKKwkJY29udGludWU7CisJICAgICAgCisJICAgICAgd2hpbGUgKGxlbiAtLSkKKwkJaWYgKHRvbG93ZXIgKHN0YXJ0IFtsZW5dKSAhPSBpbnNuIFtsZW5dKQorCQkgIGJyZWFrOworCSAgICAgIAorCSAgICAgIGlmIChsZW4gPT0gLTEpCisJCXJldHVybiByZXN0b3JlX2NvbG9uICgxKTsKKwkgICAgfQorCX0KKworICAgICAgLyogTm9wZSAtIGl0IGlzIGEgbm9ybWFsIGxhYmVsLiAgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnOCcgKi8KKyAgaWYgKGlfbF9wWzFdID09ICc4JyAmJiAoaV9sX3BbMl0gPT0gJyAnIHx8IGlfbF9wWzJdID09ICdcdCcpKQorICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgyKTsKKworICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMjAnICovCisgIGVsc2UgaWYgKGlfbF9wWzFdID09ICcyJyAmJiBpX2xfcFsyXSA9PScwJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQorICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKKworICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIHRleHQgZm9sbG93aW5nIHRoZSBjb2xvbiBpcyAnMzInICovCisgIGVsc2UgaWYgKGlfbF9wWzFdID09ICczJyAmJiBpX2xfcFsyXSA9PScyJyAmJiAoaV9sX3BbM10gPT0gJyAnIHx8IGlfbF9wWzNdID09ICdcdCcpKQorICAgIHJldHVybiByZXN0b3JlX2NvbG9uICgzKTsKKworICByZXR1cm4gMDsKK30KKworYm9vbGVhbgorZnIzMF9maXhfYWRqdXN0YWJsZSAoZml4UCkKKyAgIGZpeFMgKiBmaXhQOworeworICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgCisjaWYgMCAgCisgIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLworICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICByZXR1cm4gMDsKKyAgCisgIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorICAKKyAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLworICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWZyMzAuaCBiL2dhcy9jb25maWcvdGMtZnIzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzJkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWZyMzAuaApAQCAtMCwwICsxLDgxIEBACisvKiB0Yy1mcjMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWZyMzAuYy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjZGVmaW5lIFRDX0ZSMzAKKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisvKiBsZWFkaW5nIHNwYWNlIHNvIHdpbGwgY29tcGlsZSB3aXRoIGNjICovCisgI2Vycm9yIEZSMzAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCisjZW5kaWYKKworI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiRlIzMCBHQVMgIgorCisvKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9mcjMwCisKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZnIzMCIKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCisKKy8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLworbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7CisjZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQorCisvKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCisKKy8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCisjZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKKworI2RlZmluZSBNRF9BUFBMWV9GSVgzCisjZGVmaW5lIG1kX2FwcGx5X2ZpeDMgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MworCisjZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBmcjMwX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQorZXh0ZXJuIGJvb2xlYW4gZnIzMF9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKworLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBmcjMwX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKK2V4dGVybiBpbnQgZnIzMF9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworCisjZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQorCisjZGVmaW5lIHRjX2dlbl9yZWxvYyBnYXNfY2dlbl90Y19nZW5fcmVsb2MKKworLyogQ2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oKSwgbm90IG1kX3BjcmVsX2Zyb20oKS4gICovCisjZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQorZXh0ZXJuIGxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOworCisvKiBGb3IgOCB2cyAxNiB2cyAzMiBiaXQgYnJhbmNoIHNlbGVjdGlvbi4gICovCisjZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworCisvKiBXZSBuZWVkIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBUQ19TVEFSVF9MQUJFTCBtYWNybyBzbyB0aGF0IHdlCisgICBhbGxvdyB0aGUgTERJOjgsIExESToyMCwgTERJOjMyIGFuZCBkZWxheSBzbG90IGluc3RydWN0aW9ucyB0byBiZQorICAgcGFyc2VkIGFzIHN1Y2guICBOb3RlIC0gaW4gYSBIT1JSSUJMRSBIQUNLLCB3ZSBtYWtlIHVzZSBvZiB0aGUKKyAgIGtub3dsZWRnZSB0aGF0IHRoaXMgbWFyY28gaXMgb25seSBldmVyIGV2YWx1YXRlZCBpbiBvbmUgcGxhY2UKKyAgIChyZWFkX2Ffc291cmNlX2ZpbGUgaW4gcmVhZC5jKSB3aGVyZSB3ZSBjYW4gYWNjZXNzIHRoZSBsb2NhbAorICAgdmFyaWFibGUgJ3MnIC0gdGhlIHN0YXJ0IG9mIHRoZSBzeW1ib2wgdGhhdCB3YXMgdGVybWluYXRlZCBieQorICAgJ2NoYXJhY3RlcicuICBBbHNvIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mCisgICB0aGUgbG9jYWwgdmFyaWFibGUgJ2MnIHdoaWNoIGlzIHBhc3NlZCB0byB0aGlzIG1hY3JvIGFzICdjaGFyYWN0ZXInLiAgKi8KKyNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2hhcmFjdGVyLCBpX2xfcCkJCQlcCisgICgoY2hhcmFjdGVyKSAhPSAnOicgPyAwIDogKGNoYXJhY3RlciA9IGZyMzBfaXNfY29sb25faW5zbiAocykpID8gMCA6ICgoY2hhcmFjdGVyID0gJzonKSwgMSkpCitleHRlcm4gY2hhciBmcjMwX2lzX2NvbG9uX2luc24gUEFSQU1TICgoY2hhciAqKSk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYyBiL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmggYi9nYXMvY29uZmlnL3RjLWdlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRmMDIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmgKQEAgLTAsMCArMSwzOSBAQAorLyogVGhpcyBmaWxlIGlzIHRjLWdlbmVyaWMuaAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyB0Yy1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yIHRhcmdldCBjcHUKKyAqIHNwZWNpZmljIGhlYWRlciBmaWxlcy4gIEl0IGlzIG15IGludGVudCB0aGF0IHRoaXMgZmlsZSBjb21waWxlLiAgSXQgaXMgYWxzbworICogbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIGdyb3cgaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBib3RoIGEKKyAqIHRlbXBsYXRlIGZvciBwb3J0aW5nLCBhbmQgYSBzdHViIGZvciB0ZXN0aW5nLiAgeG94b3JpY2guCisgKi8KKworI2RlZmluZSBUQ19HRU5FUklDIDEKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjb21tZW50LWNvbHVtbjogMAorICogZmlsbC1jb2x1bW46IDEzMQorICogRW5kOgorICovCisKKy8qIGVuZCBvZiB0Yy1nZW5lcmljLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDgzMDAuYyBiL2dhcy9jb25maWcvdGMtaDgzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVhZGExCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1oODMwMC5jCkBAIC0wLDAgKzEsMTU5NSBAQAorLyogdGMtaDgzMDAuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworLyoKKyAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgorICBzYWNAY3lnbnVzLmNvbQorICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNkZWZpbmUgREVGSU5FX1RBQkxFCisjZGVmaW5lIGg4X29wY29kZXMgb3BzCisjaW5jbHVkZSAib3Bjb2RlL2g4MzAwLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPQoreyc7JywgMH07Citjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPQorezB9OworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgorICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKKyAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90CisgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKKyAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgICAqLworCit2b2lkIGNvbnMgKCk7CisKK2ludCBIbW9kZTsKK2ludCBTbW9kZTsKKyNkZWZpbmUgUFNJWkUgKEhtb2RlID8gTF8zMiA6IExfMTYpCisjZGVmaW5lIERNT0RFIChMXzE2KQorI2RlZmluZSBEU1lNTU9ERSAoSG1vZGUgPyBMXzI0IDogTF8xNikKK2ludCBic2l6ZSA9IExfODsJCS8qIGRlZmF1bHQgYnJhbmNoIGRpc3BsYWNlbWVudCAqLworCisKK3ZvaWQKK2g4MzAwaG1vZGUgKCkKK3sKKyAgSG1vZGUgPSAxOworICBTbW9kZSA9IDA7Cit9CisKK3ZvaWQKK2g4MzAwc21vZGUgKCkKK3sKKyAgU21vZGUgPSAxOworICBIbW9kZSA9IDE7Cit9Cit2b2lkCitzYnJhbmNoIChzaXplKQorICAgICBpbnQgc2l6ZTsKK3sKKyAgYnNpemUgPSBzaXplOworfQorCitzdGF0aWMgdm9pZCBwaW50ICgpCit7CisgIGNvbnMgKEhtb2RlID8gNCA6IDIpOworfQorCitjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworCisgIHsiaDgzMDBoIiwgaDgzMDBobW9kZSwgMH0sCisgIHsiaDgzMDBzIiwgaDgzMDBzbW9kZSwgMH0sCisgIHsic2JyYW5jaCIsIHNicmFuY2gsIExfOH0sCisgIHsibGJyYW5jaCIsIHNicmFuY2gsIExfMTZ9LAorCisgIHsiaW50IiwgcGludCwgMH0sCisgIHsiZGF0YS5iIiwgY29ucywgMX0sCisgIHsiZGF0YS53IiwgY29ucywgMn0sCisgIHsiZGF0YS5sIiwgY29ucywgNH0sCisgIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAorICB7ImhlYWRpbmciLCBsaXN0aW5nX3RpdGxlLCAwfSwKKyAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCisgIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAorICB7InByb2dyYW0iLCBzX2lnbm9yZSwgMH0sCisgIHswLCAwLCAwfQorfTsKKworY29uc3QgaW50IG1kX3JlbG9jX3NpemU7CisKK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLworLyogQXMgaW4gMGYxMi40NTYgKi8KKy8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCisKKy8qCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAorICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKKyAgKi8KKworCit2b2lkCittZF9iZWdpbiAoKQoreworICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7CisgIGNoYXIgcHJldl9idWZmZXJbMTAwXTsKKyAgaW50IGlkeCA9IDA7CisKKyAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOworICBwcmV2X2J1ZmZlclswXSA9IDA7CisKKyAgZm9yIChvcGNvZGUgPSBoOF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgIHsKKyAgICAgIC8qIFN0cmlwIG9mZiBhbnkgLiBwYXJ0IHdoZW4gaW5zZXJ0aW5nIHRoZSBvcGNvZGUgYW5kIG9ubHkgZW50ZXIKKyAgICAgICAgIHVuaXF1ZSBjb2RlcyBpbnRvIHRoZSBoYXNoIHRhYmxlCisgICAgICAgICAqLworICAgICAgY2hhciAqc3JjID0gb3Bjb2RlLT5uYW1lOworICAgICAgdW5zaWduZWQgaW50IGxlbiA9IHN0cmxlbiAoc3JjKTsKKyAgICAgIGNoYXIgKmRzdCA9IG1hbGxvYyAobGVuICsgMSk7CisgICAgICBjaGFyICpidWZmZXIgPSBkc3Q7CisKKyAgICAgIG9wY29kZS0+c2l6ZSA9IDA7CisgICAgICB3aGlsZSAoKnNyYykKKwl7CisJICBpZiAoKnNyYyA9PSAnLicpCisJICAgIHsKKwkgICAgICBzcmMrKzsKKwkgICAgICBvcGNvZGUtPnNpemUgPSAqc3JjOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAqZHN0KysgPSAqc3JjKys7CisJfQorICAgICAgKmRzdCsrID0gMDsKKyAgICAgIGlmIChzdHJjbXAgKGJ1ZmZlciwgcHJldl9idWZmZXIpKQorCXsKKwkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBidWZmZXIsIChjaGFyICopIG9wY29kZSk7CisJICBzdHJjcHkgKHByZXZfYnVmZmVyLCBidWZmZXIpOworCSAgaWR4Kys7CisJfQorICAgICAgb3Bjb2RlLT5pZHggPSBpZHg7CisKKworICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzICovCisgICAgICBvcGNvZGUtPm5vcGVyYW5kcyA9IDA7CisgICAgICB3aGlsZSAob3Bjb2RlLT5hcmdzLm5pYltvcGNvZGUtPm5vcGVyYW5kc10gIT0gRSkKKwlvcGNvZGUtPm5vcGVyYW5kcysrOworICAgICAgLyogRmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBvcGNvZGUgaW4gYnl0ZXMgKi8KKyAgICAgIG9wY29kZS0+bGVuZ3RoID0gMDsKKyAgICAgIHdoaWxlIChvcGNvZGUtPmRhdGEubmliW29wY29kZS0+bGVuZ3RoICogMl0gIT0gRSkKKwlvcGNvZGUtPmxlbmd0aCsrOworICAgIH0KKworICBsaW5rcmVsYXggPSAxOworfQorCisKK3N0cnVjdCBoOF9leHAKK3sKKyAgY2hhciAqZV9iZWc7CisgIGNoYXIgKmVfZW5kOworICBleHByZXNzaW9uUyBlX2V4cDsKK307CitpbnQgZGlzcHJlZzsKK2ludCBvcHNpemU7CQkJLyogU2V0IHdoZW4gYSByZWdpc3RlciBzaXplIGlzIHNlZW4gKi8KKworCitzdHJ1Y3QgaDhfb3AKK3sKKyAgb3BfdHlwZSBtb2RlOworICB1bnNpZ25lZCByZWc7CisgIGV4cHJlc3Npb25TIGV4cDsKK307CisKKy8qCisgIHBhcnNlIG9wZXJhbmRzCisgIFdSRUcgcjAscjEscjIscjMscjQscjUscjYscjcsZnAsc3AKKyAgcjBsLHIwaCwuLnI3bCxyN2gKKyAgQFdSRUcKKyAgQFdSRUcrCisgIEAtV1JFRworICAjY29uc3QKKyAgY2NyCisqLworCisvKiB0cnkgYW5kIHBhcnNlIGEgcmVnIG5hbWUsIHJldHVybnMgbnVtYmVyIG9mIGNoYXJzIGNvbnN1bWVkICovCitpbnQKK3BhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcsIGRpcmVjdGlvbikKKyAgICAgY2hhciAqc3JjOworICAgICBvcF90eXBlICptb2RlOworICAgICB1bnNpZ25lZCBpbnQgKnJlZzsKKyAgICAgaW50IGRpcmVjdGlvbjsKKworeworICBjaGFyICplbmQ7CisgIGludCBsZW47CisKKyAgLyogQ3JpYmJlZCBmcm9tIGdldF9zeW1ib2xfZW5kKCkuICAqLworICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpzcmMpIHx8ICpzcmMgPT0gJ1wwMDEnKQorICAgIHJldHVybiAwOworICBlbmQgPSBzcmMrMTsKKyAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmVuZCkgfHwgKmVuZCA9PSAnXDAwMScpCisgICAgZW5kKys7CisgIGxlbiA9IGVuZCAtIHNyYzsKKworICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQorICAgIHsKKyAgICAgICptb2RlID0gUFNJWkUgfCBSRUcgfCBkaXJlY3Rpb247CisgICAgICAqcmVnID0gNzsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdjJyAmJiBzcmNbMV0gPT0gJ2MnICYmIHNyY1syXSA9PSAncicpCisgICAgeworICAgICAgKm1vZGUgPSBDQ1I7CisgICAgICAqcmVnID0gMDsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3gnICYmIHNyY1syXSA9PSAncicpCisgICAgeworICAgICAgKm1vZGUgPSBFWFI7CisgICAgICAqcmVnID0gMDsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3AnKQorICAgIHsKKyAgICAgICptb2RlID0gUFNJWkUgfCBSRUcgfCBkaXJlY3Rpb247CisgICAgICAqcmVnID0gNjsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3InCisgICAgICAmJiBzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnNycpCisgICAgeworICAgICAgKm1vZGUgPSBMXzMyIHwgUkVHIHwgZGlyZWN0aW9uOworICAgICAgKnJlZyA9IHNyY1syXSAtICcwJzsKKyAgICAgIGlmICghSG1vZGUpCisJYXNfd2FybiAoXygiUmVnIG5vdCB2YWxpZCBmb3IgSDgvMzAwIikpOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JykKKyAgICB7CisgICAgICAqbW9kZSA9IExfMTYgfCBSRUcgfCBkaXJlY3Rpb247CisgICAgICAqcmVnID0gc3JjWzFdIC0gJzAnICsgODsKKyAgICAgIGlmICghSG1vZGUpCisJYXNfd2FybiAoXygiUmVnIG5vdCB2YWxpZCBmb3IgSDgvMzAwIikpOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgaWYgKHNyY1swXSA9PSAncicpCisgICAgeworICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JykKKwl7CisJICBpZiAobGVuID09IDMgJiYgc3JjWzJdID09ICdsJykKKwkgICAgeworCSAgICAgICptb2RlID0gTF84IHwgUkVHIHwgZGlyZWN0aW9uOworCSAgICAgICpyZWcgPSAoc3JjWzFdIC0gJzAnKSArIDg7CisJICAgICAgcmV0dXJuIGxlbjsKKwkgICAgfQorCSAgaWYgKGxlbiA9PSAzICYmIHNyY1syXSA9PSAnaCcpCisJICAgIHsKKwkgICAgICAqbW9kZSA9IExfOCB8IFJFRyB8IGRpcmVjdGlvbjsKKwkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJyk7CisJICAgICAgcmV0dXJuIGxlbjsKKwkgICAgfQorCSAgaWYgKGxlbiA9PSAyKQorCSAgICB7CisJICAgICAgKm1vZGUgPSBMXzE2IHwgUkVHIHwgZGlyZWN0aW9uOworCSAgICAgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKKwkgICAgICByZXR1cm4gbGVuOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworY2hhciAqCitwYXJzZV9leHAgKHMsIG9wKQorICAgICBjaGFyICpzOworICAgICBleHByZXNzaW9uUyAqIG9wOworeworICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjaGFyICpuZXc7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKKyAgZXhwcmVzc2lvbiAob3ApOworICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCisgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisgIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKKyAgcmV0dXJuIG5ldzsKK30KKworc3RhdGljIGNoYXIgKgorc2tpcF9jb2xvbnRoaW5nIChwdHIsIGV4cCwgbW9kZSkKKyAgICAgY2hhciAqcHRyOworICAgICBleHByZXNzaW9uUyAqZXhwOworICAgICBpbnQgKm1vZGU7Cit7CisgIGlmICgqcHRyID09ICc6JykKKyAgICB7CisgICAgICBwdHIrKzsKKyAgICAgICptb2RlICY9IH5TSVpFOworICAgICAgaWYgKCpwdHIgPT0gJzgnKQorCXsKKwkgIHB0cisrOworCSAgLyogZmYgZmlsbCBhbnkgOCBiaXQgcXVhbnRpdHkgKi8KKwkgLyogZXhwLT5YX2FkZF9udW1iZXIgLT0gMHgxMDA7Ki8KKwkgICptb2RlIHw9IExfODsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCpwdHIgPT0gJzInKQorCSAgICB7CisJICAgICAgKm1vZGUgfD0gTF8yNDsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnB0ciA9PSAnMycpCisJICAgIHsKKwkgICAgICAqbW9kZSB8PSBMXzMyOworCSAgICB9CisJICBlbHNlIGlmICgqcHRyID09ICcxJykKKwkgICAgeworCSAgICAgICptb2RlIHw9IExfMTY7CisJICAgIH0KKwkgIHdoaWxlIChpc2RpZ2l0ICgqcHRyKSkKKwkgICAgcHRyKys7CisJfQorICAgIH0KKyAgcmV0dXJuIHB0cjsKK30KKworLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKKworICAgUm4JCQlSZWdpc3RlciBkaXJlY3QKKyAgIEBSbgkJCVJlZ2lzdGVyIGluZGlyZWN0CisgICBAKGV4cFs6MTZdLCBSbikJUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKKyAgIEBSbisKKyAgIEAtUm4KKyAgIEBhYTo4CQkJYWJzb2x1dGUgOCBiaXQKKyAgIEBhYToxNgkJCWFic29sdXRlIDE2IGJpdAorICAgQGFhCQkJYWJzb2x1dGUgMTYgYml0CisKKyAgICN4eFs6c2l6ZV0JCWltbWVkaWF0ZSBkYXRhCisgICBAKGV4cDpbOF0sIHBjKQkJcGMgcmVsCisgICBAQGFhWzo4XQkJbWVtb3J5IGluZGlyZWN0CisKKyAgICovCisKK2NoYXIgKgorY29sb25tb2QyNCAob3AsIHNyYykKKyAgICAgc3RydWN0IGg4X29wICpvcDsKKyAgICAgY2hhciAqc3JjOworCit7CisgIGludCBtb2RlID0gMDsKKyAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmbW9kZSk7CisKKyAgaWYgKCFtb2RlKQorICAgIHsKKyAgICAgIC8qIENob29zZSBhIGRlZmF1bHQgbW9kZSAqLworICAgICAgaWYgKG9wLT5leHAuWF9hZGRfbnVtYmVyIDwgLTMyNzY4CisJICB8fCBvcC0+ZXhwLlhfYWRkX251bWJlciA+IDMyNzY3KQorCXsKKwkgIGlmIChIbW9kZSkKKwkgICAgbW9kZSA9IExfMjQ7CisJICBlbHNlCisJICAgIG1vZGUgPSBMXzE2OworCX0KKyAgICAgIGVsc2UgaWYgKG9wLT5leHAuWF9hZGRfc3ltYm9sCisJICAgICAgIHx8IG9wLT5leHAuWF9vcF9zeW1ib2wpCisJbW9kZSA9IERTWU1NT0RFOworICAgICAgZWxzZQorCW1vZGUgPSBETU9ERTsKKyAgICB9CisgIG9wLT5tb2RlIHw9IG1vZGU7CisgIHJldHVybiBzcmM7CisKK30KKworCitzdGF0aWMgdm9pZAorZ2V0X29wZXJhbmQgKHB0ciwgb3AsIGRzdCwgZGlyZWN0aW9uKQorICAgICBjaGFyICoqcHRyOworICAgICBzdHJ1Y3QgaDhfb3AgKm9wOworICAgICB1bnNpZ25lZCBpbnQgZHN0OworICAgICBpbnQgZGlyZWN0aW9uOworeworICBjaGFyICpzcmMgPSAqcHRyOworICBvcF90eXBlIG1vZGU7CisgIHVuc2lnbmVkIGludCBudW07CisgIHVuc2lnbmVkIGludCBsZW47CisKKyAgb3AtPm1vZGUgPSBFOworCisgIC8qIEdyb3NzLiAgR3Jvc3MuICBsZG0gYW5kIHN0bSBoYXZlIGEgZm9ybWF0IG5vdCBlYXNpbHkgaGFuZGxlZAorICAgICBieSBnZXRfb3BlcmFuZC4gIFdlIGRlYWwgd2l0aCBpdCBleHBsaWNpdGx5IGhlcmUuICAqLworICBpZiAoc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3InICYmIGlzZGlnaXQoc3JjWzJdKQorICAgICAgJiYgc3JjWzNdID09ICctJyAmJiBzcmNbNF0gPT0gJ2UnICYmIHNyY1s1XSA9PSAncicgJiYgaXNkaWdpdChzcmNbNl0pKQorICAgIHsKKyAgICAgIGludCBsb3csIGhpZ2g7CisKKyAgICAgIGxvdyA9IHNyY1syXSAtICcwJzsKKyAgICAgIGhpZ2ggPSBzcmNbNl0gLSAnMCc7CisKKyAgICAgIGlmIChoaWdoIDwgbG93KQorCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7CisKKyAgICAgIGlmIChsb3cgJSAyKQorCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7CisKKyAgICAgIGlmIChoaWdoIC0gbG93ID4gMykKKwlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOworCisgICAgICBpZiAoaGlnaCAtIGxvdyAhPSAxCisJICAmJiBsb3cgJSA0KQorCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7CisKKyAgICAgIC8qIEV2ZW4gc2lja2VyLiAgV2UgZW5jb2RlIHR3byByZWdpc3RlcnMgaW50byBvcC0+cmVnLiAgT25lCisJIGZvciB0aGUgbG93IHJlZ2lzdGVyIHRvIHNhdmUsIHRoZSBvdGhlciBmb3IgdGhlIGhpZ2gKKwkgcmVnaXN0ZXIgdG8gc2F2ZTsgIHdlIGFsc28gc2V0IHRoZSBoaWdoIGJpdCBpbiBvcC0+cmVnCisJIHNvIHdlIGtub3cgdGhpcyBpcyAidmVyeSBzcGVjaWFsIi4gICovCisgICAgICBvcC0+cmVnID0gMHg4MDAwMDAwMCB8IChoaWdoIDw8IDgpIHwgbG93OworICAgICAgb3AtPm1vZGUgPSBSRUc7CisgICAgICAqcHRyID0gc3JjICsgNzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZvcC0+bW9kZSwgJm9wLT5yZWcsIGRpcmVjdGlvbik7CisgIGlmIChsZW4pCisgICAgeworICAgICAgKnB0ciA9IHNyYyArIGxlbjsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCpzcmMgPT0gJ0AnKQorICAgIHsKKyAgICAgIHNyYysrOworICAgICAgaWYgKCpzcmMgPT0gJ0AnKQorCXsKKwkgIHNyYysrOworCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKKworCSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmb3AtPm1vZGUpOworCisJICAqcHRyID0gc3JjOworCisJICBvcC0+bW9kZSA9IE1FTUlORDsKKwkgIHJldHVybjsKKworCX0KKworCisgICAgICBpZiAoKnNyYyA9PSAnLScpCisJeworCSAgc3JjKys7CisJICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0sIGRpcmVjdGlvbik7CisJICBpZiAobGVuID09IDApCisJICAgIHsKKwkgICAgICAvKiBPb3BzLCBub3QgYSByZWcgYWZ0ZXIgYWxsLCBtdXN0IGJlIG9yZGluYXJ5IGV4cCAqLworCSAgICAgIHNyYy0tOworCSAgICAgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KKwkgICAgICBvcC0+bW9kZSA9IEFCUyB8IFBTSVpFIHwgZGlyZWN0aW9uOworCSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCksCisJCQkJICAgICAgJm9wLT5leHAsICZvcC0+bW9kZSk7CisKKwkgICAgICByZXR1cm47CisKKworCSAgICB9CisKKworCSAgaWYgKChtb2RlICYgU0laRSkgIT0gUFNJWkUpCisJICAgIGFzX2JhZCAoXygiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIikpOworCSAgb3AtPm1vZGUgPSBSRERFQzsKKwkgIG9wLT5yZWcgPSBudW07CisJICAqcHRyID0gc3JjICsgbGVuOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmICgqc3JjID09ICcoJykKKwl7CisJICAvKiBEaXNwICovCisJICBzcmMrKzsKKworCSAgLyogU3RhcnQgb2ZmIGFzc3VtaW5nIGEgMTYgYml0IG9mZnNldCAqLworCisKKwkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7CisKKwkgIHNyYyA9IGNvbG9ubW9kMjQgKG9wLCBzcmMpOworCisJICBpZiAoKnNyYyA9PSAnKScpCisJICAgIHsKKwkgICAgICBzcmMrKzsKKwkgICAgICBvcC0+bW9kZSB8PSBBQlMgfCBkaXJlY3Rpb247CisJICAgICAgKnB0ciA9IHNyYzsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgaWYgKCpzcmMgIT0gJywnKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIikpOworCSAgICAgIHJldHVybjsKKworCSAgICB9CisJICBzcmMrKzsKKworCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZywgZGlyZWN0aW9uKTsKKwkgIGlmIChsZW4gPT0gMCB8fCAhKG1vZGUgJiBSRUcpKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIikpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgb3AtPm1vZGUgfD0gRElTUCB8IGRpcmVjdGlvbjsKKwkgIGRpc3ByZWcgPSBvcC0+cmVnOworCSAgc3JjICs9IGxlbjsKKwkgIHNyYyA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKKworCSAgaWYgKCpzcmMgIT0gJyknICYmICcoJykKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIpKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgICpwdHIgPSBzcmMgKyAxOworCisJICByZXR1cm47CisJfQorICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtLCBkaXJlY3Rpb24pOworCisgICAgICBpZiAobGVuKQorCXsKKwkgIHNyYyArPSBsZW47CisJICBpZiAoKnNyYyA9PSAnKycpCisJICAgIHsKKwkgICAgICBzcmMrKzsKKwkgICAgICBpZiAoKG1vZGUgJiBTSVpFKSAhPSBQU0laRSkKKwkJYXNfYmFkIChfKCJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iKSk7CisJICAgICAgb3AtPm1vZGUgPSBSU0lOQzsKKwkgICAgICBvcC0+cmVnID0gbnVtOworCSAgICAgICpwdHIgPSBzcmM7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBpZiAoKG1vZGUgJiBTSVpFKSAhPSBQU0laRSkKKwkgICAgYXNfYmFkIChfKCJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iKSk7CisKKwkgIG9wLT5tb2RlID0gZGlyZWN0aW9uIHwgSU5EIHwgUFNJWkU7CisJICBvcC0+cmVnID0gbnVtOworCSAgKnB0ciA9IHNyYzsKKworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCisKKwkgIG9wLT5tb2RlID0gQUJTIHwgZGlyZWN0aW9uOworCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKKworCSAgKnB0ciA9IGNvbG9ubW9kMjQgKG9wLCBzcmMpOworCisJICByZXR1cm47CisJfQorICAgIH0KKworCisgIGlmICgqc3JjID09ICcjJykKKyAgICB7CisgICAgICBzcmMrKzsKKyAgICAgIG9wLT5tb2RlID0gSU1NOworICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKKyAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZvcC0+bW9kZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKHNyYywgIm1hY2giLCA0KSA9PSAwCisJICAgfHwgc3RybmNtcCAoc3JjLCAibWFjbCIsIDQpID09IDApCisgICAgeworICAgICAgb3AtPnJlZyA9IHNyY1szXSA9PSAnbCc7CisgICAgICBvcC0+bW9kZSA9IE1BQ1JFRzsKKyAgICAgICpwdHIgPSBzcmMgKyA0OworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7CisgICAgICAvKiBUcmFpbGluZyAnOicgc2l6ZSA/ICovCisgICAgICBpZiAoKnNyYyA9PSAnOicpCisJeworCSAgaWYgKHNyY1sxXSA9PSAnMScgJiYgc3JjWzJdID09ICc2JykKKwkgICAgeworCSAgICAgIG9wLT5tb2RlID0gUENSRUwgfCBMXzE2OworCSAgICAgIHNyYyArPSAzOworCSAgICB9CisJICBlbHNlIGlmIChzcmNbMV0gPT0gJzgnKQorCSAgICB7CisJICAgICAgb3AtPm1vZGUgPSBQQ1JFTCB8IExfODsKKwkgICAgICBzcmMgKz0gMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJleHBlY3QgOjggb3IgOjE2IGhlcmUiKSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgb3AtPm1vZGUgPSBQQ1JFTCB8IGJzaXplOworCX0KKyAgICAgICpwdHIgPSBzcmM7CisgICAgfQorfQorCisKK3N0YXRpYworY2hhciAqCitnZXRfb3BlcmFuZHMgKG5vcGVyYW5kcywgb3BfZW5kLCBvcGVyYW5kKQorICAgICB1bnNpZ25lZCBpbnQgbm9wZXJhbmRzOworICAgICBjaGFyICpvcF9lbmQ7CisgICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKK3sKKyAgY2hhciAqcHRyID0gb3BfZW5kOworCisgIHN3aXRjaCAobm9wZXJhbmRzKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBvcGVyYW5kWzBdLm1vZGUgPSAwOworICAgICAgb3BlcmFuZFsxXS5tb2RlID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxOgorICAgICAgcHRyKys7CisgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDAsIFNSQyk7CisgICAgICBpZiAoKnB0ciA9PSAnLCcpCisJeworCSAgcHRyKys7CisJICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEsIERTVCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG9wZXJhbmRbMV0ubW9kZSA9IDA7CisJfQorCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBwdHIrKzsKKyAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCwgU1JDKTsKKyAgICAgIGlmICgqcHRyID09ICcsJykKKwlwdHIrKzsKKyAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSwgRFNUKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworCisgIHJldHVybiBwdHI7Cit9CisKKy8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAorICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcworICAgcHJvdmlkZWQKKyAgICovCitzdGF0aWMKK3N0cnVjdCBoOF9vcGNvZGUgKgorZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmRzLCBzaXplKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7CisgICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZHM7CisgICAgIGludCBzaXplOworeworICBzdHJ1Y3QgaDhfb3Bjb2RlICp0aGlzX3RyeSA9IG9wY29kZTsKKyAgaW50IGZvdW5kID0gMDsKKworICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IG9wY29kZS0+aWR4OworCisgIC8qIFRoZXJlJ3Mgb25seSBvbmUgbGRtL3N0bSBhbmQgaXQncyBlYXNpZXIgdG8ganVzdAorICAgICBnZXQgb3V0IHF1aWNrIGZvciB0aGVtLiAgKi8KKyAgaWYgKHN0cmNtcCAob3Bjb2RlLT5uYW1lLCAic3RtLmwiKSA9PSAwCisgICAgICB8fCBzdHJjbXAgKG9wY29kZS0+bmFtZSwgImxkbS5sIikgPT0gMCkKKyAgICByZXR1cm4gdGhpc190cnk7CisKKyAgd2hpbGUgKHRoaXNfaW5kZXggPT0gb3Bjb2RlLT5pZHggJiYgIWZvdW5kKQorICAgIHsKKyAgICAgIGZvdW5kID0gMTsKKworICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKKyAgICAgIGlmICh0aGlzX3RyeS0+bm9wZXJhbmRzID09IDApCisJeworCSAgaW50IHRoaXNfc2l6ZTsKKworCSAgdGhpc19zaXplID0gdGhpc190cnktPmhvdyAmIFNOOworCSAgaWYgKHRoaXNfc2l6ZSAhPSBzaXplICYmICh0aGlzX3NpemUgIT0gU0IgfHwgc2l6ZSAhPSBTTikpCisJICAgIGZvdW5kID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgaW50IGk7CisKKwkgIGZvciAoaSA9IDA7IGkgPCB0aGlzX3RyeS0+bm9wZXJhbmRzICYmIGZvdW5kOyBpKyspCisJICAgIHsKKwkgICAgICBvcF90eXBlIG9wID0gdGhpc190cnktPmFyZ3MubmliW2ldOworCSAgICAgIGludCB4ID0gb3BlcmFuZHNbaV0ubW9kZTsKKworCSAgICAgIGlmICgob3AgJiAoRElTUCB8IFJFRykpID09IChESVNQIHwgUkVHKQorCQkgICYmICgoeCAmIChESVNQIHwgUkVHKSkgPT0gKERJU1AgfCBSRUcpKSkKKwkJeworCQkgIGRpc3ByZWcgPSBvcGVyYW5kc1tpXS5yZWc7CisJCX0KKwkgICAgICBlbHNlIGlmIChvcCAmIFJFRykKKwkJeworCQkgIGlmICghKHggJiBSRUcpKQorCQkgICAgZm91bmQgPSAwOworCisJCSAgaWYgKHggJiBMX1ApCisJCSAgICB4ID0gKHggJiB+TF9QKSB8IChIbW9kZSA/IExfMzIgOiBMXzE2KTsKKwkJICBpZiAob3AgJiBMX1ApCisJCSAgICBvcCA9IChvcCAmIH5MX1ApIHwgKEhtb2RlID8gTF8zMiA6IExfMTYpOworCisJCSAgb3BzaXplID0gb3AgJiBTSVpFOworCisJCSAgLyogVGhlIHNpemUgb2YgdGhlIHJlZyBpcyB2IGltcG9ydGFudCAqLworCQkgIGlmICgob3AgJiBTSVpFKSAhPSAoeCAmIFNJWkUpKQorCQkgICAgZm91bmQgPSAwOworCQl9CisJICAgICAgZWxzZSBpZiAoKG9wICYgQUJTSk1QKSAmJiAoeCAmIEFCUykpCisJCXsKKwkJICBvcGVyYW5kc1tpXS5tb2RlICY9IH5BQlM7CisJCSAgb3BlcmFuZHNbaV0ubW9kZSB8PSBBQlNKTVA7CisJCSAgLyogQnV0IGl0IG1heSBub3QgYmUgMjQgYml0cyBsb25nICovCisJCSAgaWYgKCFIbW9kZSkKKwkJICAgIHsKKwkJICAgICAgb3BlcmFuZHNbaV0ubW9kZSAmPSB+U0laRTsKKwkJICAgICAgb3BlcmFuZHNbaV0ubW9kZSB8PSBMXzE2OworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoKG9wICYgKEtCSVQgfCBEQklUKSkgJiYgKHggJiBJTU0pKQorCQl7CisJCSAgLyogVGhpcyBpcyBvayBpZiB0aGUgaW1tZWRpYXRlIHZhbHVlIGlzIHNlbnNpYmxlICovCisJCX0KKwkgICAgICBlbHNlIGlmIChvcCAmIFBDUkVMKQorCQl7CisJCSAgLyogVGhlIHNpemUgb2YgdGhlIGRpc3BsYWNlbWVudCBpcyBpbXBvcnRhbnQgKi8KKwkJICBpZiAoKG9wICYgU0laRSkgIT0gKHggJiBTSVpFKSkKKwkJICAgIGZvdW5kID0gMDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChvcCAmIChESVNQIHwgSU1NIHwgQUJTKSkKKwkJICAgICAgICYmIChvcCAmIChESVNQIHwgSU1NIHwgQUJTKSkgPT0gKHggJiAoRElTUCB8IElNTSB8IEFCUykpKQorCQl7CisJCSAgLyogUHJvbW90ZSBhIExfMjQgdG8gTF8zMiBpZiBpdCBtYWtlcyB1cyBtYXRjaC4gICovCisJCSAgaWYgKCh4ICYgTF8yNCkgJiYgKG9wICYgTF8zMikpCisJCSAgICB7CisJCSAgICAgIHggJj0gfkxfMjQ7CisJCSAgICAgIHggfD0gTF8zMjsKKwkJICAgIH0KKwkJICAvKiBQcm9tb3RlIGFuIEw4IHRvIExfMTYgaWYgaXQgbWFrZXMgdXMgbWF0Y2guICAqLworCQkgIGlmIChvcCAmIEFCUyAmJiBvcCAmIExfOCAmJiBvcCAmIERJU1ApIAorCQkgICAgeworCQkgICAgICBpZiAoeCAmIExfMTYpCisJCQlmb3VuZD0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgoeCAmIFNJWkUpICE9IDAKKwkJCSAgICYmICgob3AgJiBTSVpFKSAhPSAoeCAmIFNJWkUpKSkKKwkJICAgIGZvdW5kID0gMDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChvcCAmIE1BQ1JFRykgIT0gKHggJiBNQUNSRUcpKQorCQl7CisJCSAgZm91bmQgPSAwOworCQl9CisJICAgICAgZWxzZSBpZiAoKG9wICYgTU9ERSkgIT0gKHggJiBNT0RFKSkKKwkJeworCQkgIGZvdW5kID0gMDsKKwkJfQkKKwkgICAgfQorCX0KKyAgICB9CisgIGlmIChmb3VuZCkKKyAgICByZXR1cm4gdGhpc190cnk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX29wZXJhbmQgKG9wZXJhbmQsIHdpZHRoLCBzdHJpbmcpCisgICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKKyAgICAgdW5zaWduZWQgaW50IHdpZHRoOworICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfc3ltYm9sID09IDAKKyAgICAgICYmIG9wZXJhbmQtPmV4cC5YX29wX3N5bWJvbCA9PSAwKQorICAgIHsKKworICAgICAgLyogTm8gc3ltYm9sIGludm9sdmVkLCBsZXQncyBsb29rIGF0IG9mZnNldCwgaXQncyBkYW5nZXJvdXMgaWYgYW55IG9mCisJIHRoZSBoaWdoIGJpdHMgYXJlIG5vdCAwIG9yIGZmJ3MsIGZpbmQgb3V0IGJ5IG9yaW5nIG9yIGFuZGluZyB3aXRoCisJIHRoZSB3aWR0aCBhbmQgc2VlaW5nIGlmIHRoZSBhbnN3ZXIgaXMgMCBvciBhbGwgZnMqLworICAgICAgCisgICAgICBpZiAoKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiB+d2lkdGgpICE9IDAgJiYKKwkgIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyIHwgd2lkdGgpICE9ICh+MCkpCisJeworCSAgaWYgKHdpZHRoID09IDI1NSAKKwkgICAgICAmJiAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIDB4ZmYwMCkgPT0gMHhmZjAwKQorCSAgICB7CisJICAgICAgLyogSnVzdCBpZ25vcmUgdGhpcyBvbmUgLSB3aGljaCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvCisJCSBmaXQgYSAxNiBiaXQgYWRkcmVzcyB0cnVuY2F0ZWQgaW50byBhbiA4IGJpdCBhZGRyZXNzCisJCSBvZiBzb21ldGhpbmcgbGlrZSBic2V0LiAgKi8KKwkgICAgfQorCSAgZWxzZSAKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oIm9wZXJhbmQgJXMweCVseCBvdXQgb2YgcmFuZ2UuIiksIHN0cmluZywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKKwkgICAgfQorCX0KKyAgICB9CisKK30KKworLyogUkVMQVhNT0RFIGhhcyBvbmUgb2YgMyB2YWx1ZXM6CisKKyAgIDAgT3V0cHV0IGEgIm5vcm1hbCIgcmVsb2MsIG5vIHJlbGF4aW5nIHBvc3NpYmxlIGZvciB0aGlzIGluc24vcmVsb2MKKworICAgMSBPdXRwdXQgYSByZWxheGFibGUgMjRiaXQgYWJzb2x1dGUgbW92LncgYWRkcmVzcyByZWxvY2F0aW9uCisgICAgIChtYXkgcmVsYXggaW50byBhIDE2Yml0IGFic29sdXRlIGFkZHJlc3MpLgorCisgICAyIE91dHB1dCBhIHJlbGF4YWJsZSAxNi8yNCBhYnNvbHV0ZSBtb3YuYiBhZGRyZXNzIHJlbG9jYXRpb24KKyAgICAgKG1heSByZWxheCBpbnRvIGFuIDhiaXQgYWJzb2x1dGUgYWRkcmVzcykuICAqLworCitzdGF0aWMgdm9pZAorZG9fYV9maXhfaW1tIChvZmZzZXQsIG9wZXJhbmQsIHJlbGF4bW9kZSkKKyAgICAgaW50IG9mZnNldDsKKyAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOworICAgICBpbnQgcmVsYXhtb2RlOworeworICBpbnQgaWR4OworICBpbnQgc2l6ZTsKKyAgaW50IHdoZXJlOworCisKKyAgY2hhciAqdCA9IG9wZXJhbmQtPm1vZGUgJiBJTU0gPyAiIyIgOiAiQCI7CisKKyAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMCkKKyAgICB7CisgICAgICBjaGFyICpieXRlcyA9IGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0OworICAgICAgc3dpdGNoIChvcGVyYW5kLT5tb2RlICYgU0laRSkKKwl7CisJY2FzZSBMXzI6CisJICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweDMsIHQpOworCSAgYnl0ZXNbMF0gfD0gKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpIDw8IDQ7CisJICBicmVhazsKKwljYXNlIExfMzoKKwkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4NywgdCk7CisJICBieXRlc1swXSB8PSAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcikgPDwgNDsKKwkgIGJyZWFrOworCWNhc2UgTF84OgorCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHhmZiwgdCk7CisJICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXI7CisJICBicmVhazsKKwljYXNlIExfMTY6CisJICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweGZmZmYsIHQpOworCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDg7CisJICBieXRlc1sxXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMDsKKwkgIGJyZWFrOworCWNhc2UgTF8yNDoKKwkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4ZmZmZmZmLCB0KTsKKwkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAxNjsKKwkgIGJ5dGVzWzFdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiA4OworCSAgYnl0ZXNbMl0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDA7CisJICBicmVhazsKKworCWNhc2UgTF8zMjoKKwkgIC8qIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2l0aCBiZmQgKi8KKwkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAyNDsKKwkgIGJ5dGVzWzFdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAxNjsKKwkgIGJ5dGVzWzJdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiA4OworCSAgYnl0ZXNbM10gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDA7CisJICBicmVhazsKKwl9CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKG9wZXJhbmQtPm1vZGUgJiBTSVpFKQorCXsKKworCWNhc2UgTF8yNDoKKwljYXNlIExfMzI6CisJICBzaXplID0gNDsKKwkgIHdoZXJlID0gKG9wZXJhbmQtPm1vZGUgJiBTSVpFKSA9PSBMXzI0ID8gLTEgOiAwOworCSAgaWYgKHJlbGF4bW9kZSA9PSAyKQorCSAgICBpZHggPSBSX01PVjI0QjE7CisJICBlbHNlIGlmIChyZWxheG1vZGUgPT0gMSkKKwkgICAgaWR4ID0gUl9NT1ZMMTsKKwkgIGVsc2UKKwkgICAgaWR4ID0gUl9SRUxMT05HOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFzX2JhZChfKCJDYW4ndCB3b3JrIG91dCBzaXplIG9mIG9wZXJhbmQuXG4iKSk7CisJY2FzZSBMXzE2OgorCSAgc2l6ZSA9IDI7CisJICB3aGVyZSA9IDA7CisJICBpZiAocmVsYXhtb2RlID09IDIpCisJICAgIGlkeCA9IFJfTU9WMTZCMTsKKwkgIGVsc2UKKwkgICAgaWR4ID0gUl9SRUxXT1JEOworCSAgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA9IChzaG9ydClvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyOworCSAgYnJlYWs7CisJY2FzZSBMXzg6CisJICBzaXplID0gMTsKKwkgIHdoZXJlID0gMDsKKwkgIGlkeCA9IFJfUkVMQllURTsKKwkgIC8qIFRoaXMgdXNlZCB0byB1c2UgYSBjYXN0IHRvIGNoYXIsIGJ1dCB0aGF0IGZhaWxzIGlmIGNoYXIgaXMgYW4KKwkgICAgIHVuc2lnbmVkIHR5cGUuICBXZSBjYW4ndCB1c2UgYHNpZ25lZCBjaGFyJywgYXMgdGhhdCBpc24ndCB2YWxpZAorCSAgICAgSyZSIEMuICAqLworCSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiAweDgwKQorCSAgICBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyIHw9ICgob2Zmc2V0VCkgLTEgPDwgOCk7CisJICBlbHNlCisJICAgIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJj0gMHhmZjsKKwl9CisKKyAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgb2Zmc2V0ICsgd2hlcmUsCisJCSAgIHNpemUsCisJCSAgICZvcGVyYW5kLT5leHAsCisJCSAgIDAsCisJCSAgIGlkeCk7CisgICAgfQorCit9CisKKy8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCisgKi8KK3N0YXRpYyB2b2lkCitidWlsZF9ieXRlcyAodGhpc190cnksIG9wZXJhbmQpCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnRoaXNfdHJ5OworICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Cit7CisgIHVuc2lnbmVkIGludCBpOworCisgIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAodGhpc190cnktPmxlbmd0aCk7CisgIG9wX3R5cGUgKm5pYmJsZV9wdHIgPSB0aGlzX3RyeS0+ZGF0YS5uaWI7CisgIG9wX3R5cGUgYzsKKyAgdW5zaWduZWQgaW50IG5pYmJsZV9jb3VudCA9IDA7CisgIGludCBhYnNhdDsKKyAgaW50IGltbWF0OworICBpbnQgbmliOworICBpbnQgbW92YiA9IDA7CisgIGNoYXIgYXNuaWJibGVzWzMwXTsKKyAgY2hhciAqcCA9IGFzbmliYmxlczsKKworICBpZiAoISh0aGlzX3RyeS0+aW5iYXNlIHx8IEhtb2RlKSkKKyAgICBhc193YXJuIChfKCJPcGNvZGUgYCVzJyB3aXRoIHRoZXNlIG9wZXJhbmQgdHlwZXMgbm90IGF2YWlsYWJsZSBpbiBIOC8zMDAgbW9kZSIpLAorCSAgICAgdGhpc190cnktPm5hbWUpOworCisgIHdoaWxlICgqbmliYmxlX3B0ciAhPSBFKQorICAgIHsKKyAgICAgIGludCBkOworICAgICAgYyA9ICpuaWJibGVfcHRyKys7CisKKyAgICAgIGQgPSAoYyAmIChEU1QgfCBTUkNfSU5fRFNUKSkgIT0gMDsKKworICAgICAgaWYgKGMgPCAxNikKKwl7CisJICBuaWIgPSBjOworCX0KKyAgICAgIGVsc2UKKwl7CisKKwkgIGlmIChjICYgKFJFRyB8IElORCB8IElOQyB8IERFQykpCisJICAgIHsKKwkgICAgICBuaWIgPSBvcGVyYW5kW2RdLnJlZzsKKwkgICAgfQorCSAgZWxzZSBpZiAoKGMgJiBESVNQUkVHKSA9PSAoRElTUFJFRykpCisJICAgIHsKKwkgICAgICBuaWIgPSBkaXNwcmVnOworCSAgICB9CisJICBlbHNlIGlmIChjICYgIEFCUyApCisJICAgIHsKKwkgICAgICBvcGVyYW5kW2RdLm1vZGUgPSBjOworCSAgICAgIGFic2F0ID0gbmliYmxlX2NvdW50IC8gMjsKKwkgICAgICBuaWIgPSAwOworCSAgICB9CisJICBlbHNlIGlmIChjICYgKElNTSB8IFBDUkVMIHwgQUJTIHwgQUJTSk1QIHwgRElTUCkpCisJICAgIHsKKwkgICAgICBvcGVyYW5kW2RdLm1vZGUgPSBjOworCSAgICAgIGltbWF0ID0gbmliYmxlX2NvdW50IC8gMjsKKwkgICAgICBuaWIgPSAwOworCSAgICB9CisJICBlbHNlIGlmIChjICYgSUdOT1JFKQorCSAgICB7CisJICAgICAgbmliID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoYyAmIERCSVQpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKG9wZXJhbmRbMF0uZXhwLlhfYWRkX251bWJlcikKKwkJeworCQljYXNlIDE6CisJCSAgbmliID0gYzsKKwkJICBicmVhazsKKwkJY2FzZSAyOgorCQkgIG5pYiA9IDB4OCB8IGM7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYXNfYmFkIChfKCJOZWVkICMxIG9yICMyIGhlcmUiKSk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoYyAmIEtCSVQpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKG9wZXJhbmRbMF0uZXhwLlhfYWRkX251bWJlcikKKwkJeworCQljYXNlIDE6CisJCSAgbmliID0gMDsKKwkJICBicmVhazsKKwkJY2FzZSAyOgorCQkgIG5pYiA9IDg7CisJCSAgYnJlYWs7CisJCWNhc2UgNDoKKwkJICBpZiAoIUhtb2RlKQorCQkgICAgYXNfd2FybiAoXygiIzQgbm90IHZhbGlkIG9uIEg4LzMwMC4iKSk7CisJCSAgbmliID0gOTsKKwkJICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgIGFzX2JhZCAoXygiTmVlZCAjMSBvciAjMiBoZXJlIikpOworCQkgIGJyZWFrOworCQl9CisJICAgICAgLyogc3RvcCBpdCBtYWtpbmcgYSBmaXggKi8KKwkgICAgICBvcGVyYW5kWzBdLm1vZGUgPSAwOworCSAgICB9CisKKwkgIGlmIChjICYgTUVNUkVMQVgpCisJICAgIHsKKwkgICAgICBvcGVyYW5kW2RdLm1vZGUgfD0gTUVNUkVMQVg7CisJICAgIH0KKworCSAgaWYgKGMgJiBCMzEpCisJICAgIHsKKwkgICAgICBuaWIgfD0gMHg4OworCSAgICB9CisKKwkgIGlmIChjICYgTUFDUkVHKQorCSAgICB7CisJICAgICAgbmliID0gMiArIG9wZXJhbmRbZF0ucmVnOworCSAgICB9CisJfQorICAgICAgbmliYmxlX2NvdW50Kys7CisKKyAgICAgICpwKysgPSBuaWI7CisgICAgfQorCisgIC8qIERpc2d1c3RpbmcuICBXaHksIG9oIHdoeSBkaWRuJ3Qgc29tZW9uZSBhc2sgdXMgZm9yIGFkdmljZQorICAgICBvbiB0aGUgYXNzZW1ibGVyIGZvcm1hdC4gICovCisgIGlmIChzdHJjbXAgKHRoaXNfdHJ5LT5uYW1lLCAic3RtLmwiKSA9PSAwCisgICAgICB8fCBzdHJjbXAgKHRoaXNfdHJ5LT5uYW1lLCAibGRtLmwiKSA9PSAwKQorICAgIHsKKyAgICAgIGludCBoaWdoLCBsb3c7CisgICAgICBoaWdoID0gKG9wZXJhbmRbdGhpc190cnktPm5hbWVbMF0gPT0gJ2wnID8gMSA6IDBdLnJlZyA+PiA4KSAmIDB4ZjsKKyAgICAgIGxvdyA9IG9wZXJhbmRbdGhpc190cnktPm5hbWVbMF0gPT0gJ2wnID8gMSA6IDBdLnJlZyAmIDB4ZjsKKworICAgICAgYXNuaWJibGVzWzJdID0gaGlnaCAtIGxvdzsKKyAgICAgIGFzbmliYmxlc1s3XSA9ICh0aGlzX3RyeS0+bmFtZVswXSA9PSAnbCcpID8gaGlnaCA6IGxvdzsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHRoaXNfdHJ5LT5sZW5ndGg7IGkrKykKKyAgICB7CisgICAgICBvdXRwdXRbaV0gPSAoYXNuaWJibGVzW2kgKiAyXSA8PCA0KSB8IGFzbmliYmxlc1tpICogMiArIDFdOworICAgIH0KKworICAvKiBOb3RlIGlmIHRoaXMgaXMgYSBtb3ZiIGluc3RydWN0aW9uIC0tIHRoZXJlJ3MgYSBzcGVjaWFsIHJlbGF4YXRpb24KKyAgICAgd2hpY2ggb25seSBhcHBsaWVzIHRvIHRoZW0uICAqLworICBpZiAoc3RyY21wICh0aGlzX3RyeS0+bmFtZSwgIm1vdi5iIikgPT0gMCkKKyAgICBtb3ZiID0gMTsKKworICAvKiBvdXRwdXQgYW55IGZpeGVzICovCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgaW50IHggPSBvcGVyYW5kW2ldLm1vZGU7CisKKyAgICAgIGlmICh4ICYgKElNTSB8IERJU1ApKQorCXsKKwkgIGRvX2FfZml4X2ltbSAob3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBpbW1hdCwKKwkJCW9wZXJhbmQgKyBpLCB4ICYgTUVNUkVMQVggIT0gMCk7CisJfQorICAgICAgZWxzZSBpZiAoeCAmIEFCUykKKwl7CisJICBkb19hX2ZpeF9pbW0gKG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgYWJzYXQsCisJCQlvcGVyYW5kICsgaSwgeCAmIE1FTVJFTEFYID8gbW92YiArIDEgOiAwKTsKKwl9CisgICAgICBlbHNlIGlmICh4ICYgUENSRUwpCisJeworCSAgaW50IHNpemUxNiA9IHggJiBMXzE2OworCSAgaW50IHdoZXJlID0gc2l6ZTE2ID8gMiA6IDE7CisJICBpbnQgc2l6ZSA9IHNpemUxNiA/IDIgOiAxOworCSAgaW50IHR5cGUgPSBzaXplMTYgPyBSX1BDUldPUkQgOiBSX1BDUkJZVEU7CisKKwkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQgKyBpLCBzaXplMTYgPyAweDdmZmYgOiAweDdmLCAiQCIpOworCisJICBpZiAob3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICYgMSkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oImJyYW5jaCBvcGVyYW5kIGhhcyBvZGQgb2Zmc2V0ICglbHgpXG4iKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKKwkgICAgfQorCisJICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgLT0gMTsKKwkgIC8qIFRoaXMgdXNlZCB0byB1c2UgYSBjYXN0IHRvIGNoYXIsIGJ1dCB0aGF0IGZhaWxzIGlmIGNoYXIgaXMgYW4KKwkgICAgIHVuc2lnbmVkIHR5cGUuICBXZSBjYW4ndCB1c2UgYHNpZ25lZCBjaGFyJywgYXMgdGhhdCBpc24ndCB2YWxpZAorCSAgICAgSyZSIEMuICAqLworCSAgaWYgKG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmIDB4ODApCisJICAgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciB8PSAoKG9mZnNldFQpIC0xIDw8IDgpOworCSAgZWxzZQorCSAgICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJj0gMHhmZjsKKworCSAgZml4X25ld19leHAgKGZyYWdfbm93LAorCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyB3aGVyZSwKKwkJICAgICAgIHNpemUsCisJCSAgICAgICAmb3BlcmFuZFtpXS5leHAsCisJCSAgICAgICAxLAorCQkgICAgICAgdHlwZSk7CisJfQorICAgICAgZWxzZSBpZiAoeCAmIE1FTUlORCkKKwl7CisKKwkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQgKyBpLCAweGZmLCAiQEAiKTsKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMSwKKwkJICAgICAgIDEsCisJCSAgICAgICAmb3BlcmFuZFtpXS5leHAsCisJCSAgICAgICAwLAorCQkgICAgICAgUl9NRU1fSU5ESVJFQ1QpOworCX0KKyAgICAgIGVsc2UgaWYgKHggJiBBQlNKTVApCisJeworCSAgLyogVGhpcyBqbXAgbWF5IGJlIGEganVtcCBvciBhIGJyYW5jaCAqLworCisJICBjaGVja19vcGVyYW5kIChvcGVyYW5kICsgaSwgSG1vZGUgPyAweGZmZmZmZiA6IDB4ZmZmZiwgIkAiKTsKKwkgIGlmIChvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJiAxKQorCSAgICB7CisJICAgICAgYXNfd2FybiAoXygiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOworCSAgICB9CisJICBpZiAoIUhtb2RlKQorCSAgICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgPSAoc2hvcnQpIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlcjsKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkgICAgICAgNCwKKwkJICAgICAgICZvcGVyYW5kW2ldLmV4cCwKKwkJICAgICAgIDAsCisJCSAgICAgICBSX0pNUEwxKTsKKwl9CisgICAgfQorCit9CisKKy8qCisgIHRyeSBhbmQgZ2l2ZSBhbiBpbnRlbGxpZ2VudCBlcnJvciBtZXNzYWdlIGZvciBjb21tb24gYW5kIHNpbXBsZSB0bworICBkZXRlY3QgZXJyb3JzCisgICovCisKK3N0YXRpYyB2b2lkCitjbGV2ZXJfbWVzc2FnZSAob3Bjb2RlLCBvcGVyYW5kKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7CisgICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKK3sKKyAgLyogRmluZCBvdXQgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgb3BjY29kZSAqLworCisgIGlmICgob3Bjb2RlICsgMSktPmlkeCAhPSBvcGNvZGUtPmlkeCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgYXJnbjsKKworICAgICAgLyogT25seSBvbmUgb3Bjb2RlIG9mIHRoaXMgZmxhdm91ciwgdHJ5IGFuZCBndWVzcyB3aGljaCBvcGVyYW5kCisgICAgICAgICBkaWRuJ3QgbWF0Y2ggKi8KKyAgICAgIGZvciAoYXJnbiA9IDA7IGFyZ24gPCBvcGNvZGUtPm5vcGVyYW5kczsgYXJnbisrKQorCXsKKwkgIHN3aXRjaCAob3Bjb2RlLT5hcmdzLm5pYlthcmduXSkKKwkgICAgeworCSAgICBjYXNlIFJEMTY6CisJICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBSRDE2KQorCQl7CisJCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTYgYml0IHJlZ2lzdGVyIikpOworCQkgIHJldHVybjsKKworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSUzg6CisKKwkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJTOCkKKwkJeworCQkgIGFzX2JhZCAoXygic291cmNlIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIpKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEFCUzE2RFNUOgorCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gQUJTMTZEU1QpCisJCXsKKwkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIikpOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJEODoKKwkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJEOCkKKwkJeworCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIikpOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIGJyZWFrOworCisKKwkgICAgY2FzZSBBQlMxNlNSQzoKKwkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IEFCUzE2U1JDKQorCQl7CisJCSAgYXNfYmFkIChfKCJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiKSk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgfQorCX0KKyAgICB9CisgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyIpKTsKK30KKworLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCisgICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAorICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KKyAgICovCisKKworCit2b2lkCittZF9hc3NlbWJsZSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNoYXIgKm9wX3N0YXJ0OworICBjaGFyICpvcF9lbmQ7CisgIHN0cnVjdCBoOF9vcCBvcGVyYW5kWzJdOworICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7CisgIHN0cnVjdCBoOF9vcGNvZGUgKnByZXZfb3Bjb2RlOworCisgIGNoYXIgKmRvdCA9IDA7CisgIGNoYXIgYzsKKyAgaW50IHNpemU7CisKKyAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCisgIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7CisgICAgICAgKm9wX2VuZCAhPSAwICYmICpvcF9lbmQgIT0gJyAnOworICAgICAgIG9wX2VuZCsrKQorICAgIHsKKyAgICAgIGlmICgqb3BfZW5kID09ICcuJykKKwl7CisJICBkb3QgPSBvcF9lbmQgKyAxOworCSAgKm9wX2VuZCA9IDA7CisJICBvcF9lbmQgKz0gMjsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgOworCisgIGlmIChvcF9lbmQgPT0gb3Bfc3RhcnQpCisgICAgeworICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7CisgICAgfQorICBjID0gKm9wX2VuZDsKKworICAqb3BfZW5kID0gMDsKKworICBvcGNvZGUgPSAoc3RydWN0IGg4X29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsCisJCQkJCSAgIG9wX3N0YXJ0KTsKKworICBpZiAob3Bjb2RlID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogV2UgdXNlIHRvIHNldCBpbnB1dF9saW5lX3BvaW50ZXIgdG8gdGhlIHJlc3VsdCBvZiBnZXRfb3BlcmFuZHMsCisgICAgIGJ1dCB0aGF0IGlzIHdyb25nLiAgT3VyIGNhbGxlciBhc3N1bWVzIHdlIGRvbid0IGNoYW5nZSBpdC4gICovCisKKyAgKHZvaWQpIGdldF9vcGVyYW5kcyAob3Bjb2RlLT5ub3BlcmFuZHMsIG9wX2VuZCwgb3BlcmFuZCk7CisgICpvcF9lbmQgPSBjOworICBwcmV2X29wY29kZSA9IG9wY29kZTsKKworICBzaXplID0gU047CisgIGlmIChkb3QpCisgICAgeworICAgICAgc3dpdGNoICgqZG90KQorCXsKKwljYXNlICdiJzoKKwkgIHNpemUgPSBTQjsKKwkgIGJyZWFrOworCisJY2FzZSAndyc6CisJICBzaXplID0gU1c7CisJICBicmVhazsKKworCWNhc2UgJ2wnOgorCSAgc2l6ZSA9IFNMOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQsIHNpemUpOworCisgIGlmIChvcGNvZGUgPT0gMCkKKyAgICB7CisgICAgICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLworICAgICAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOworCisgICAgICB3aGVyZVswXSA9IDB4MDsKKyAgICAgIHdoZXJlWzFdID0gMHgwOworICAgICAgY2xldmVyX21lc3NhZ2UgKHByZXZfb3Bjb2RlLCBvcGVyYW5kKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKG9wY29kZS0+c2l6ZSAmJiBkb3QpCisgICAgeworICAgICAgaWYgKG9wY29kZS0+c2l6ZSAhPSAqZG90KQorCXsKKwkgIGFzX3dhcm4gKF8oIm1pc21hdGNoIGJldHdlZW4gb3Bjb2RlIHNpemUgYW5kIG9wZXJhbmQgc2l6ZSIpKTsKKwl9CisgICAgfQorCisgIGJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpOworCit9CisKK3ZvaWQKK3RjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKKyAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzOworeworICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOworfQorCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiAwOworfQorCit2b2lkCit0Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpCisgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVyczsKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKK30KKworLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KKy8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCisgICAqLworY2hhciAqCittZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKKyAgICAgY2hhciB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7CisgIGNoYXIgKnQ7CisgIGNoYXIgKmF0b2ZfaWVlZSAoKTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgIGNhc2UgJ3MnOgorICAgIGNhc2UgJ1MnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOworICAgIH0KKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKyAgICB9CisgIHJldHVybiAwOworfQorDAorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7CitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7CisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHJldHVybiAwOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKK30KKwwKK3ZvaWQKK3RjX2FvdXRfZml4X3RvX2NoYXJzICgpCit7CisgIHByaW50ZiAoXygiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIpKTsKKyAgYWJvcnQgKCk7Cit9CisKK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7CisgICAgIHNlZ1Qgc2VnOworICAgICBmcmFnUyAqZnJhZ1A7Cit7CisgIHByaW50ZiAoXygiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iKSk7CisgIGFib3J0ICgpOworfQorCit2YWx1ZVQgCittZF9zZWN0aW9uX2FsaWduIChzZWcsIHNpemUpCisgICAgIHNlZ1Qgc2VnOworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOworCit9CisKK3ZvaWQKK21kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQorICAgICBmaXhTICpmaXhQOworICAgICBsb25nIHZhbDsKK3sKKyAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOworCisgIHN3aXRjaCAoZml4UC0+Znhfc2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOworICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7CisgICAgICAqYnVmKysgPSAodmFsID4+IDgpOworICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iKSk7CisgIGFib3J0ICgpOworfQorCisvKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQorICAgICBjaGFyICpwdHI7CisgICAgIHZhbHVlVCB1c2U7CisgICAgIGludCBuYnl0ZXM7Cit7CisgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOworfQorbG9uZworbWRfcGNyZWxfZnJvbSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgYWJvcnQgKCk7Cit9CisKKwordm9pZAordGNfcmVsb2NfbWFuZ2xlIChmaXhfcHRyLCBpbnRyLCBiYXNlKQorICAgICBmaXhTICpmaXhfcHRyOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7CisgICAgIGJmZF92bWEgYmFzZTsKKworeworICBzeW1ib2xTICpzeW1ib2xfcHRyOworCisgIHN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKKworICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgYXR0YWNoZWQgdG8gYSBzeW1ib2wgdGhlbiBpdCdzIG9rCisgICAgIHRvIG91dHB1dCBpdCAqLworICBpZiAoZml4X3B0ci0+Znhfcl90eXBlID09IFRDX0NPTlNfUkVMT0MpCisgICAgeworICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKKwl7CisJY2FzZSA0OgorCSAgaW50ci0+cl90eXBlID0gUl9SRUxMT05HOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgaW50ci0+cl90eXBlID0gUl9SRUxXT1JEOworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgaW50ci0+cl90eXBlID0gUl9SRUxCWVRFOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCisJfQorCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50ci0+cl90eXBlID0gZml4X3B0ci0+Znhfcl90eXBlOworICAgIH0KKworICBpbnRyLT5yX3ZhZGRyID0gZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlICsgYmFzZTsKKyAgaW50ci0+cl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7CisKKyAgaWYgKHN5bWJvbF9wdHIpCisgICAgeworICAgICAgaWYgKHN5bWJvbF9wdHItPnN5X251bWJlciAhPSAtMSkKKwlpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKKyAgICAgIGVsc2UKKwl7CisJICBzeW1ib2xTICpzZWdzeW07CisKKwkgIC8qIFRoaXMgY2FzZSBhcmlzZXMgd2hlbiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGAuJy4gICovCisJICBzZWdzeW0gPSBzZWdfaW5mbyAoU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cikpLT5kb3Q7CisJICBpZiAoc2Vnc3ltID09IE5VTEwpCisJICAgIGludHItPnJfc3ltbmR4ID0gLTE7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnRyLT5yX3N5bW5keCA9IHNlZ3N5bS0+c3lfbnVtYmVyOworCSAgICAgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICBpbnRyLT5yX3N5bW5keCA9IC0xOworCisKK30KKworLyogZW5kIG9mIHRjLWg4MzAwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDgzMDAuaCBiL2dhcy9jb25maWcvdGMtaDgzMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTJhNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1oODMwMC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIFRoaXMgZmlsZSBpcyB0Yy1oODMwMC5oCisgICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjZGVmaW5lIFRDX0g4MzAwCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQorCisjaWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7CisjZW5kaWYKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKy8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCisjZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIGFib3J0KCk7CisKKyNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfaDgzMDAKKyNkZWZpbmUgQ09GRl9NQUdJQyAoIFNtb2RlID8gMHg4MzAyIDogSG1vZGUgPyAweDgzMDEgOiAweDgzMDApCisjZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQorI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUworCisjZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKSA7IC8qIG5vdCB1c2VkICovCisjZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCitleHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKKyAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOworCisjZGVmaW5lIFRDX0NPTlNfUkVMT0MgICAgICAgICAgKEhtb2RlID8gUl9SRUxMT05HOiBSX1JFTFdPUkQpCisKKyNkZWZpbmUgRE9fTk9UX1NUUklQIDAKKyNkZWZpbmUgTElTVElOR19IRUFERVIgIkhpdGFjaGkgSDgvMzAwIEdBUyAiCisjZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKKyNkZWZpbmUgUkVMT0NfMzIgMTIzNAorCitleHRlcm4gaW50IEhtb2RlOworZXh0ZXJuIGludCBTbW9kZTsKKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKKy8qIGVuZCBvZiB0Yy1oODMwMC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4NTAwLmMgYi9nYXMvY29uZmlnL3RjLWg4NTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlYzNlMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtaDg1MDAuYwpAQCAtMCwwICsxLDE2MzMgQEAKKy8qIHRjLWg4NTAwLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgSDgvNTAwCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCisgIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgc2FjQGN5Z251cy5jb20KKyAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjZGVmaW5lIERFRklORV9UQUJMRQorI2RlZmluZSBBU1NFTUJMRVJfVEFCTEUKKyNpbmNsdWRlICJvcGNvZGVzL2g4NTAwLW9wYy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIhIyI7CisKKy8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKKyAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6CisgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAorICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCisgICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgorICAgKi8KKwordm9pZCBjb25zICgpOworCitjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworICB7ImludCIsIGNvbnMsIDJ9LAorICB7ImRhdGEuYiIsIGNvbnMsIDF9LAorICB7ImRhdGEudyIsIGNvbnMsIDJ9LAorICB7ImRhdGEubCIsIGNvbnMsIDR9LAorICB7ImZvcm0iLCBsaXN0aW5nX3BzaXplLCAwfSwKKyAgeyJoZWFkaW5nIiwgbGlzdGluZ190aXRsZSwgMH0sCisgIHsiaW1wb3J0Iiwgc19pZ25vcmUsIDB9LAorICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKKyAgeyJwcm9ncmFtIiwgc19pZ25vcmUsIDB9LAorICB7MCwgMCwgMH0KK307CisKK2NvbnN0IGludCBtZF9yZWxvY19zaXplOworCitjb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKKworLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KKy8qIEFzIGluIDBmMTIuNDU2ICovCisvKiBvciAgICAwZDEuMjM0NWUxMiAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOworCisjZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQorI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCisKKyNkZWZpbmUgR0VUX1dIQVQoeCkgKCh4Pj4yKSkKKworI2RlZmluZSBCWVRFX0RJU1AgMQorI2RlZmluZSBXT1JEX0RJU1AgMgorI2RlZmluZSBVTkRFRl9CWVRFX0RJU1AgMAorI2RlZmluZSBVTkRFRl9XT1JEX0RJU1AgMworCisjZGVmaW5lIEJSQU5DSCAgMQorI2RlZmluZSBTQ0JfRiAgIDIKKyNkZWZpbmUgU0NCX1RTVCAzCisjZGVmaW5lIEVORCA0CisKKyNkZWZpbmUgQllURV9GIDEyNworI2RlZmluZSBCWVRFX0IgLTEyNgorI2RlZmluZSBXT1JEX0YgMzI3NjcKKyNkZWZpbmUgV09SRF9CIDMyNzY4CisKK3JlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldOworCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLworCisvKgorICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgVGhpcyBzaG91bGQKKyAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCisgICovCisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7CisgIGNoYXIgcHJldl9idWZmZXJbMTAwXTsKKyAgaW50IGlkeCA9IDA7CisgIHJlZ2lzdGVyIHJlbGF4X3R5cGVTICp0YWJsZTsKKworICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7CisgIHByZXZfYnVmZmVyWzBdID0gMDsKKworICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLworICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgIHsKKyAgICAgIGlmIChpZHggIT0gb3Bjb2RlLT5pZHgpCisJeworCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKKwkgIGlkeCsrOworCX0KKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUuICBXZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSB0byBhdm9pZAorICAgICB3YXJuaW5ncyBhYm91dCBtb2RpZnlpbmcgYSBzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLiAgKi8KKyAgdGFibGUgPSAocmVsYXhfdHlwZVMgKikgbWRfcmVsYXhfdGFibGU7CisgIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7CisgIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COworICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAyOworICB0YWJsZVtDIChCUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoQlJBTkNILCBXT1JEX0RJU1ApOworCisgIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7CisgIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COworICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSAzOworICB0YWJsZVtDIChCUkFOQ0gsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKKworICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7CisgIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7CisgIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKKyAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoU0NCX0YsIFdPUkRfRElTUCk7CisKKyAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOworICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COworICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDg7CisgIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7CisKKyAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7CisgIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKKyAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDM7CisgIHRhYmxlW0MgKFNDQl9UU1QsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoU0NCX1RTVCwgV09SRF9ESVNQKTsKKworICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKKyAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COworICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMTA7CisgIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKKworfQorCitzdGF0aWMgaW50IHJuOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJOICovCitzdGF0aWMgaW50IHJzOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJTICovCitzdGF0aWMgaW50IHJkOwkJCS8qIHJlZ2lzdGVyIG51bWJlciB1c2VkIGJ5IFJEICovCitzdGF0aWMgaW50IGNyYjsJCQkvKiBieXRlIHNpemUgY3IgKi8KK3N0YXRpYyBpbnQgY3J3OwkJCS8qIHdvcmQgc2l6ZWQgY3IgKi8KK3N0YXRpYyBpbnQgY3I7CQkJLyogdW5rbm93biBzaXplIGNyICovCisKK3N0YXRpYyBleHByZXNzaW9uUyBkaXNwbGFjZW1lbnQ7LyogZGlzcGxhY2VtZW50IGV4cHJlc3Npb24gKi8KK3N0YXRpYyBpbnQgZGlzcGxhY2VtZW50X3NpemU7CS8qIGFuZCBzaXplIGlmIGdpdmVuICovCisKK3N0YXRpYyBpbnQgaW1tZWRpYXRlX2lucGFnZTsKK3N0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGltbWVkaWF0ZSBleHByZXNzaW9uICovCitzdGF0aWMgaW50IGltbWVkaWF0ZV9zaXplOwkvKiBhbmQgc2l6ZSBpZiBnaXZlbiAqLworCitzdGF0aWMgZXhwcmVzc2lvblMgYWJzb2x1dGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KK3N0YXRpYyBpbnQgYWJzb2x1dGVfc2l6ZTsJLyogYW5kIHNpemUgaWYgZ2l2ZW4gKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHR5cGU7CisgIGludCByZWc7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgaW50IHBhZ2U7Cit9CisKK2g4NTAwX29wZXJhbmRfaW5mbzsKKworLyogdHJ5IGFuZCBwYXJzZSBhIHJlZyBuYW1lLCByZXR1cm5zIG51bWJlciBvZiBjaGFycyBjb25zdW1lZCAqLworc3RhdGljIGludAorcGFyc2VfcmVnIChzcmMsIG1vZGUsIHJlZykKKyAgICAgY2hhciAqc3JjOworICAgICBpbnQgKm1vZGU7CisgICAgIGludCAqcmVnOworeworICBjaGFyICplbmQ7CisgIGludCBsZW47CisKKyAgLyogQ3JpYmJlZCBmcm9tIGdldF9zeW1ib2xfZW5kKCkuICAqLworICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpzcmMpIHx8ICpzcmMgPT0gJ1wwMDEnKQorICAgIHJldHVybiAwOworICBlbmQgPSBzcmMrMTsKKyAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmVuZCkgfHwgKmVuZCA9PSAnXDAwMScpCisgICAgZW5kKys7CisgIGxlbiA9IGVuZCAtIHNyYzsKKworICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdyJykKKyAgICB7CisgICAgICBpZiAoc3JjWzFdID49ICcwJyAmJiBzcmNbMV0gPD0gJzcnKQorCXsKKwkgICptb2RlID0gUk47CisJICAqcmVnID0gKHNyY1sxXSAtICcwJyk7CisJICByZXR1cm4gbGVuOworCX0KKyAgICB9CisgIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcpCisgICAgeworICAgICAgKm1vZGUgPSBSTjsKKyAgICAgICpyZWcgPSA3OworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgIGlmIChsZW4gPT0gMyAmJiBzcmNbMF0gPT0gJ2MnICYmIHNyY1sxXSA9PSAnYycgJiYgc3JjWzJdID09ICdyJykKKyAgICB7CisgICAgICAqbW9kZSA9IENSQjsKKyAgICAgICpyZWcgPSAxOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncicpCisgICAgeworICAgICAgKm1vZGUgPSBDUlc7CisgICAgICAqcmVnID0gMDsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdiJyAmJiBzcmNbMV0gPT0gJ3InKQorICAgIHsKKyAgICAgICptb2RlID0gQ1JCOworICAgICAgKnJlZyA9IDM7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZScgJiYgc3JjWzFdID09ICdwJykKKyAgICB7CisgICAgICAqbW9kZSA9IENSQjsKKyAgICAgICpyZWcgPSA0OworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2QnICYmIHNyY1sxXSA9PSAncCcpCisgICAgeworICAgICAgKm1vZGUgPSBDUkI7CisgICAgICAqcmVnID0gNTsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICd0JyAmJiBzcmNbMV0gPT0gJ3AnKQorICAgIHsKKyAgICAgICptb2RlID0gQ1JCOworICAgICAgKnJlZyA9IDc7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZicgJiYgc3JjWzFdID09ICdwJykKKyAgICB7CisgICAgICAqbW9kZSA9IFJOOworICAgICAgKnJlZyA9IDY7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYworY2hhciAqCitwYXJzZV9leHAgKHMsIG9wLCBwYWdlKQorICAgICBjaGFyICpzOworICAgICBleHByZXNzaW9uUyAqb3A7CisgICAgIGludCAqcGFnZTsKK3sKKyAgY2hhciAqc2F2ZTsKKyAgY2hhciAqbmV3OworCisgIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgKnBhZ2UgPSAwOworICBpZiAoc1swXSA9PSAnJScpCisgICAgeworICAgICAgaWYgKHNbMV0gPT0gJ3AnICYmIHNbMl0gPT0gJ2EnICYmIHNbM10gPT0gJ2cnICYmIHNbNF0gPT0gJ2UnKQorCXsKKwkgIHMgKz0gNTsKKwkgICpwYWdlID0gJ3AnOworCX0KKyAgICAgIGlmIChzWzFdID09ICdoJyAmJiBzWzJdID09ICdpJyAmJiBzWzNdID09ICcxJyAmJiBzWzRdID09ICc2JykKKwl7CisJICBzICs9IDU7CisJICAqcGFnZSA9ICdoJzsKKwl9CisgICAgICBlbHNlIGlmIChzWzFdID09ICdvJyAmJiBzWzJdID09ICdmJyAmJiBzWzNdID09ICdmJykKKwl7CisJICBzICs9IDQ7CisJICAqcGFnZSA9ICdvJzsKKwl9CisgICAgfQorCisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisKKyAgZXhwcmVzc2lvbiAob3ApOworICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCisgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisgIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKKyAgcmV0dXJuIG5ldzsKK30KKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBleHBfc2lnbmVkLCBleHBfdW5zaWduZWQsIGV4cF9zYW5kdQorICB9IHNpZ25fdHlwZTsKKworCitzdGF0aWMgY2hhciAqCitza2lwX2NvbG9udGhpbmcgKHNpZ24sIHB0ciwgZXhwLCBkZWYsIHNpemU4LCBzaXplMTYsIHNpemUyNCkKKyAgICAgc2lnbl90eXBlIHNpZ247CisgICAgIGNoYXIgKnB0cjsKKyAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpleHA7CisgICAgIGludCBkZWY7CisgICAgIGludCBzaXplODsKKyAgICAgaW50IHNpemUxNjsKKyAgICAgaW50IHNpemUyNDsKK3sKKyAgcHRyID0gcGFyc2VfZXhwIChwdHIsICZleHAtPmV4cCwgJmV4cC0+cGFnZSk7CisgIGlmICgqcHRyID09ICc6JykKKyAgICB7CisgICAgICBwdHIrKzsKKyAgICAgIGlmICgqcHRyID09ICc4JykKKwl7CisJICBwdHIrKzsKKwkgIGV4cC0+dHlwZSA9IHNpemU4OworCX0KKyAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnMScgJiBwdHJbMV0gPT0gJzYnKQorCXsKKwkgIHB0ciArPSAyOworCSAgZXhwLT50eXBlID0gc2l6ZTE2OworCX0KKyAgICAgIGVsc2UgaWYgKHB0clswXSA9PSAnMicgJiBwdHJbMV0gPT0gJzQnKQorCXsKKwkgIGlmICghc2l6ZTI0KQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCI6MjQgbm90IHZhbGlkIGZvciB0aGlzIG9wY29kZSIpKTsKKwkgICAgfQorCSAgcHRyICs9IDI7CisJICBleHAtPnR5cGUgPSBzaXplMjQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFzX2JhZCAoXygiZXhwZWN0IDo4LDoxNiBvciA6MjQiKSk7CisJICBleHAtPnR5cGUgPSBzaXplMTY7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChleHAtPnBhZ2UgPT0gJ3AnKQorCXsKKwkgIGV4cC0+dHlwZSA9IElNTTg7CisJfQorICAgICAgZWxzZSBpZiAoZXhwLT5wYWdlID09ICdoJykKKwl7CisJICBleHAtPnR5cGUgPSBJTU0xNjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTGV0J3Mgd29yayBvdXQgdGhlIHNpemUgZnJvbSB0aGUgY29udGV4dCAqLworCSAgaW50IG4gPSBleHAtPmV4cC5YX2FkZF9udW1iZXI7CisJICBpZiAoc2l6ZTgKKwkgICAgICAmJiBleHAtPmV4cC5YX29wID09IE9fY29uc3RhbnQKKwkgICAgICAmJiAoKHNpZ24gPT0gZXhwX3NpZ25lZCAmJiAobiA+PSAtMTI4ICYmIG4gPD0gMTI3KSkKKwkJICB8fCAoc2lnbiA9PSBleHBfdW5zaWduZWQgJiYgKG4gPj0gMCAmJiAobiA8PSAyNTUpKSkKKwkJICB8fCAoc2lnbiA9PSBleHBfc2FuZHUgJiYgKG4gPj0gLTEyOCAmJiAobiA8PSAyNTUpKSkpKQorCSAgICB7CisJICAgICAgZXhwLT50eXBlID0gc2l6ZTg7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGV4cC0+dHlwZSA9IGRlZjsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX3JlZ2xpc3QgKHNyYywgb3ApCisgICAgIGNoYXIgKnNyYzsKKyAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcDsKK3sKKyAgaW50IG1vZGU7CisgIGludCBybjsKKyAgaW50IG1hc2sgPSAwOworICBpbnQgcm07CisgIGludCBpZHggPSAxOwkJCS8qIHNraXAgKCAqLworCisgIHdoaWxlIChzcmNbaWR4XSAmJiBzcmNbaWR4XSAhPSAnKScpCisgICAgeworICAgICAgaW50IGRvbmUgPSBwYXJzZV9yZWcgKHNyYyArIGlkeCwgJm1vZGUsICZybik7CisKKyAgICAgIGlmIChkb25lKQorCXsKKwkgIGlkeCArPSBkb25lOworCSAgbWFzayB8PSAxIDw8IHJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiByZWcgbGlzdCIpKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGlmIChzcmNbaWR4XSA9PSAnLScpCisJeworCSAgaWR4Kys7CisJICBkb25lID0gcGFyc2VfcmVnIChzcmMgKyBpZHgsICZtb2RlLCAmcm0pOworCSAgaWYgKGRvbmUpCisJICAgIHsKKwkgICAgICBpZHggKz0gZG9uZTsKKwkgICAgICB3aGlsZSAocm4gPD0gcm0pCisJCXsKKwkJICBtYXNrIHw9IDEgPDwgcm47CisJCSAgcm4rKzsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgZmluYWwgcmVnaXN0ZXIgaW4gcmFuZ2UiKSk7CisJICAgIH0KKwl9CisgICAgICBpZiAoc3JjW2lkeF0gPT0gJywnKQorCWlkeCsrOworICAgIH0KKyAgaWR4Kys7CisgIG9wLT5leHAuWF9hZGRfc3ltYm9sID0gMDsKKyAgb3AtPmV4cC5YX29wX3N5bWJvbCA9IDA7CisgIG9wLT5leHAuWF9hZGRfbnVtYmVyID0gbWFzazsKKyAgb3AtPmV4cC5YX29wID0gT19jb25zdGFudDsKKyAgb3AtPmV4cC5YX3Vuc2lnbmVkID0gMTsKKyAgb3AtPnR5cGUgPSBJTU04OworICByZXR1cm4gaWR4OworCit9CisKKy8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6CisKKyAgIFJuCQkJUmVnaXN0ZXIgZGlyZWN0CisgICBAUm4JCQlSZWdpc3RlciBpbmRpcmVjdAorICAgQChkaXNwWzpzaXplXSwgUm4pCVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50CisgICBAUm4rCisgICBALVJuCisgICBAYWFbOnNpemVdCQlhYnNvbHV0ZQorICAgI3h4WzpzaXplXQkJaW1tZWRpYXRlIGRhdGEKKworICAgKi8KKworc3RhdGljIHZvaWQKK2dldF9vcGVyYW5kIChwdHIsIG9wLCBpc3BhZ2UpCisgICAgIGNoYXIgKipwdHI7CisgICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3A7CisgICAgIGNoYXIgaXNwYWdlOworeworICBjaGFyICpzcmMgPSAqcHRyOworICBpbnQgbW9kZTsKKyAgdW5zaWduZWQgaW50IG51bTsKKyAgdW5zaWduZWQgaW50IGxlbjsKKyAgb3AtPnBhZ2UgPSAwOworICBpZiAoc3JjWzBdID09ICcoJyAmJiBzcmNbMV0gPT0gJ3InKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYSByZWdpc3RlciBsaXN0ICovCisgICAgICAqcHRyID0gc3JjICsgcGFyc2VfcmVnbGlzdCAoc3JjLCBvcCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmb3AtPnR5cGUsICZvcC0+cmVnKTsKKworICBpZiAobGVuKQorICAgIHsKKyAgICAgICpwdHIgPSBzcmMgKyBsZW47CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICgqc3JjID09ICdAJykKKyAgICB7CisgICAgICBzcmMrKzsKKyAgICAgIGlmICgqc3JjID09ICctJykKKwl7CisJICBzcmMrKzsKKwkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSk7CisJICBpZiAobGVuID09IDApCisJICAgIHsKKwkgICAgICAvKiBPb3BzLCBub3QgYSByZWcgYWZ0ZXIgYWxsLCBtdXN0IGJlIG9yZGluYXJ5IGV4cCAqLworCSAgICAgIHNyYy0tOworCSAgICAgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KKwkgICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfdW5zaWduZWQsIHNyYywKKwkJCQkgICAgICBvcCwgQUJTMTYsIEFCUzgsIEFCUzE2LCBBQlMyNCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIG9wLT50eXBlID0gUk5ERUM7CisJICBvcC0+cmVnID0gbnVtOworCSAgKnB0ciA9IHNyYyArIGxlbjsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoKnNyYyA9PSAnKCcpCisJeworCSAgLyogRGlzcCAqLworCSAgc3JjKys7CisKKwkgIHNyYyA9IHNraXBfY29sb250aGluZyAoZXhwX3NpZ25lZCwgc3JjLCAKKwkJCQkgb3AsIFJOSU5EX0QxNiwgUk5JTkRfRDgsIFJOSU5EX0QxNiwgMCk7CisKKwkgIGlmICgqc3JjICE9ICcsJykKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIHNyYysrOworCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZyk7CisJICBpZiAobGVuID09IDAgfHwgbW9kZSAhPSBSTikKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIHNyYyArPSBsZW47CisJICBpZiAoKnNyYyAhPSAnKScpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIEAoZXhwLCBSbikiKSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICAqcHRyID0gc3JjICsgMTsKKwkgIHJldHVybjsKKwl9CisgICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0pOworCisgICAgICBpZiAobGVuKQorCXsKKwkgIHNyYyArPSBsZW47CisJICBpZiAoKnNyYyA9PSAnKycpCisJICAgIHsKKwkgICAgICBzcmMrKzsKKwkgICAgICBpZiAobW9kZSAhPSBSTikKKwkJeworCQkgIGFzX2JhZCAoXygiQFJuKyBuZWVkcyB3b3JkIHJlZ2lzdGVyIikpOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIG9wLT50eXBlID0gUk5JTkM7CisJICAgICAgb3AtPnJlZyA9IG51bTsKKwkgICAgICAqcHRyID0gc3JjOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgaWYgKG1vZGUgIT0gUk4pCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oIkBSbiBuZWVkcyB3b3JkIHJlZ2lzdGVyIikpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgb3AtPnR5cGUgPSBSTklORDsKKwkgIG9wLT5yZWcgPSBudW07CisJICAqcHRyID0gc3JjOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCisJICAqcHRyID0KKwkgICAgc2tpcF9jb2xvbnRoaW5nIChleHBfdW5zaWduZWQsIHNyYywgb3AsCisJCQkgICAgIGlzcGFnZSA/IEFCUzI0IDogQUJTMTYsIEFCUzgsIEFCUzE2LCBBQlMyNCk7CisJICByZXR1cm47CisJfQorICAgIH0KKworICBpZiAoKnNyYyA9PSAnIycpCisgICAgeworICAgICAgc3JjKys7CisgICAgICAqcHRyID0gc2tpcF9jb2xvbnRoaW5nIChleHBfc2FuZHUsIHNyYywgb3AsIElNTTE2LCBJTU04LCBJTU0xNiwgQUJTMjQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKGV4cF9zaWduZWQsIHNyYywgb3AsCisJCQkgICAgICBpc3BhZ2UgPyBBQlMyNCA6IFBDUkVMOCwgUENSRUw4LCBQQ1JFTDE2LCBBQlMyNCk7CisgICAgfQorfQorCitzdGF0aWMKK2NoYXIgKgorZ2V0X29wZXJhbmRzIChpbmZvLCBhcmdzLCBvcGVyYW5kKQorICAgICBoODUwMF9vcGNvZGVfaW5mbyAqaW5mbzsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOworCit7CisgIGNoYXIgKnB0ciA9IGFyZ3M7CisKKyAgc3dpdGNoIChpbmZvLT5uYXJncykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgb3BlcmFuZFswXS50eXBlID0gMDsKKyAgICAgIG9wZXJhbmRbMV0udHlwZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgIHB0cisrOworICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCBpbmZvLT5uYW1lWzBdID09ICdwJyk7CisgICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBwdHIrKzsKKyAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7CisgICAgICBpZiAoKnB0ciA9PSAnLCcpCisJcHRyKys7CisgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHJldHVybiBwdHI7Cit9CisKKy8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAorICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcworICAgcHJvdmlkZWQKKyAgICovCisKK2ludCBwY3JlbDg7CQkJLyogU2V0IHdoZW4gd2UndmUgc2VlbiBhIHBjcmVsIG9wZXJhbmQgKi8KKworc3RhdGljCitoODUwMF9vcGNvZGVfaW5mbyAqCitnZXRfc3BlY2lmaWMgKG9wY29kZSwgb3BlcmFuZHMpCisgICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7CisgICAgIGg4NTAwX29wZXJhbmRfaW5mbyAqb3BlcmFuZHM7Cit7CisgIGg4NTAwX29wY29kZV9pbmZvICp0aGlzX3RyeSA9IG9wY29kZTsKKyAgaW50IGZvdW5kID0gMDsKKyAgdW5zaWduZWQgaW50IG5vcGVyYW5kcyA9IG9wY29kZS0+bmFyZ3M7CisKKyAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSBvcGNvZGUtPmlkeDsKKworICB3aGlsZSAodGhpc19pbmRleCA9PSBvcGNvZGUtPmlkeCAmJiAhZm91bmQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgIHRoaXNfdHJ5ID0gb3Bjb2RlKys7CisKKyAgICAgIC8qIGxvb2sgYXQgYm90aCBvcGVyYW5kcyBuZWVkZWQgYnkgdGhlIG9wY29kZXMgYW5kIHByb3ZpZGVkIGJ5CisgICAgICAgdGhlIHVzZXIqLworICAgICAgZm9yIChpID0gMDsgaSA8IG5vcGVyYW5kczsgaSsrKQorCXsKKwkgIGg4NTAwX29wZXJhbmRfaW5mbyAqdXNlciA9IG9wZXJhbmRzICsgaTsKKworCSAgc3dpdGNoICh0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCisJICAgIHsKKwkgICAgY2FzZSBGUElORF9EODoKKwkgICAgICAvKiBPcGNvZGUgbmVlZHMgKGRpc3A6OCxmcCkgKi8KKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EOCAmJiB1c2VyLT5yZWcgPT0gNikKKwkJeworCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJESU5EX0QxNjoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EMTYpCisJCXsKKwkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7CisJCSAgcmQgPSB1c2VyLT5yZWc7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSRElORF9EODoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORF9EOCkKKwkJeworCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKKwkJICByZCA9IHVzZXItPnJlZzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOSU5EX0QxNjoKKwkgICAgY2FzZSBSTklORF9EODoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSB0aGlzX3RyeS0+YXJnX3R5cGVbaV0pCisJCXsKKwkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7CisJCSAgcm4gPSB1c2VyLT5yZWc7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFNQREVDOgorCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOREVDICYmIHVzZXItPnJlZyA9PSA3KQorCQl7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTUElOQzoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklOQyAmJiB1c2VyLT5yZWcgPT0gNykKKwkJeworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQUJTMTY6CisJICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTMTYpCisJCXsKKwkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFCUzg6CisJICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTOCkKKwkJeworCQkgIGFic29sdXRlID0gdXNlci0+ZXhwOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQUJTMjQ6CisJICAgICAgaWYgKHVzZXItPnR5cGUgPT0gQUJTMjQpCisJCXsKKwkJICBhYnNvbHV0ZSA9IHVzZXItPmV4cDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQ1JCOgorCSAgICAgIGlmICgodXNlci0+dHlwZSA9PSBDUkIgfHwgdXNlci0+dHlwZSA9PSBDUikgJiYgdXNlci0+cmVnICE9IDApCisJCXsKKwkJICBjcmIgPSB1c2VyLT5yZWc7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDUlc6CisJICAgICAgaWYgKCh1c2VyLT50eXBlID09IENSVyB8fCB1c2VyLT50eXBlID09IENSKSAmJiB1c2VyLT5yZWcgPT0gMCkKKwkJeworCQkgIGNydyA9IHVzZXItPnJlZzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERJU1AxNjoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBESVNQMTYpCisJCXsKKwkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBESVNQODoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBESVNQOCkKKwkJeworCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEZQOgorCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOICYmIHVzZXItPnJlZyA9PSA2KQorCQl7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQQ1JFTDE2OgorCSAgICAgIGlmICh1c2VyLT50eXBlID09IFBDUkVMMTYpCisJCXsKKwkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQQ1JFTDg6CisJICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUENSRUw4KQorCQl7CisJCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOworCQkgIHBjcmVsOCA9IDE7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIElNTTE2OgorCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTE2CisJCSAgfHwgdXNlci0+dHlwZSA9PSBJTU04KQorCQl7CisJCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7CisJCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkxJU1Q6CisJICAgIGNhc2UgSU1NODoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04KQorCQl7CisJCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7CisJCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSU1NNDoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBJTU04KQorCQl7CisJCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7CisJCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUUlNOgorCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTgKKwkJICAmJiB1c2VyLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50CisJCSAgJiYKKwkJICAodXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAtMgorCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IC0xCisJCSAgIHx8IHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gMQorCQkgICB8fCB1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IDIpKQorCQl7CisJCSAgaW1tZWRpYXRlX2lucGFnZSA9IHVzZXItPnBhZ2U7CisJCSAgaW1tZWRpYXRlID0gdXNlci0+ZXhwOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkQ6CisJICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4pCisJCXsKKwkJICByZCA9IHVzZXItPnJlZzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJTOgorCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOKQorCQl7CisJCSAgcnMgPSB1c2VyLT5yZWc7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSRElORDoKKwkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTklORCkKKwkJeworCQkgIHJkID0gdXNlci0+cmVnOworCQkgIGNvbnRpbnVlOworCisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSTklOQzoKKwkgICAgY2FzZSBSTklORDoKKwkgICAgY2FzZSBSTkRFQzoKKwkgICAgY2FzZSBSTjoKKworCSAgICAgIGlmICh1c2VyLT50eXBlID09IHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSkKKwkJeworCQkgIHJuID0gdXNlci0+cmVnOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1A6CisJICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4gJiYgdXNlci0+cmVnID09IDcpCisJCXsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHByaW50ZiAoXygidW5oYW5kbGVkICVkXG4iKSwgdGhpc190cnktPmFyZ190eXBlW2ldKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGlzIGRpZG4ndCB3b3JrIG91dCAqLworCSAgZ290byBmYWlsOworCX0KKyAgICAgIGZvdW5kID0gMTsKKyAgICBmYWlsOjsKKworICAgIH0KKworICBpZiAoZm91bmQpCisgICAgcmV0dXJuIHRoaXNfdHJ5OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKKyAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7CisgICAgIGludCBsb3c7CisgICAgIGludCBoaWdoOworeworICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50CisgICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKKyAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCisgICAgeworICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7CisgICAgfQorICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOworfQorCitzdGF0aWMKK3ZvaWQKK2luc2VydCAob3V0cHV0LCBpbmRleCwgZXhwLCByZWxvYywgcGNyZWwpCisgICAgIGNoYXIgKm91dHB1dDsKKyAgICAgaW50IGluZGV4OworICAgICBleHByZXNzaW9uUyAqZXhwOworICAgICBpbnQgcmVsb2M7CisgICAgIGludCBwY3JlbDsKK3sKKyAgZml4X25ld19leHAgKGZyYWdfbm93LAorCSAgICAgICBvdXRwdXQgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIGluZGV4LAorCSAgICAgICA0LAkgICAgICAgCS8qIGFsd2F5cyBzYXkgc2l6ZSBpcyA0LCBidXQgd2Uga25vdyBiZXR0ZXIgKi8KKwkgICAgICAgZXhwLAorCSAgICAgICBwY3JlbCwKKwkgICAgICAgcmVsb2MpOworfQorCit2b2lkCitidWlsZF9yZWxheGFibGVfaW5zdHJ1Y3Rpb24gKG9wY29kZSwgb3BlcmFuZCkKKyAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKKyAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOworeworICAvKiBBbGwgcmVsYXhhYmxlIGluc3RydWN0aW9ucyBzdGFydCBsaWZlIGFzIHR3byBieXRlcyBidXQgY2FuIGJlY29tZQorICAgICB0aHJlZSBieXRlcyBsb25nIGlmIGEgbG9uZWx5IGJyYW5jaCBhbmQgdXAgdG8gOSBieXRlcyBpZiBsb25nIHNjYgorICAgICAqLworICBjaGFyICpwOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKworICBpZiAob3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyA9PSAweDAxKQorICAgIHsKKyAgICAgIHR5cGUgPSBTQ0JfRjsKKyAgICB9CisgIGVsc2UgaWYgKG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwNgorCSAgIHx8IG9wY29kZS0+Ynl0ZXNbMF0uY29udGVudHMgPT0gMHgwNykKKyAgICB7CisgICAgICB0eXBlID0gU0NCX1RTVDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0eXBlID0gQlJBTkNIOworICAgIH0KKworICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAorCQltZF9yZWxheF90YWJsZVtDICh0eXBlLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoLAorCQlsZW4gPSBtZF9yZWxheF90YWJsZVtDICh0eXBlLCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoLAorCQlDICh0eXBlLCBVTkRFRl9CWVRFX0RJU1ApLAorCQlkaXNwbGFjZW1lbnQuWF9hZGRfc3ltYm9sLAorCQlkaXNwbGFjZW1lbnQuWF9hZGRfbnVtYmVyLAorCQkwKTsKKworICBwWzBdID0gb3Bjb2RlLT5ieXRlc1swXS5jb250ZW50czsKKyAgaWYgKHR5cGUgIT0gQlJBTkNIKQorICAgIHsKKyAgICAgIHBbMV0gPSBvcGNvZGUtPmJ5dGVzWzFdLmNvbnRlbnRzIHwgcnM7CisgICAgfQorfQorCisvKiBOb3cgd2Uga25vdyB3aGF0IHNvcnQgb2Ygb3Bjb2RlcyBpdCBpcywgbGV0cyBidWlsZCB0aGUgYnl0ZXMgLQorICovCitzdGF0aWMgdm9pZAorYnVpbGRfYnl0ZXMgKG9wY29kZSwgb3BlcmFuZCkKKyAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKKyAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kOworCit7CisgIGludCBpbmRleDsKKworICBpZiAocGNyZWw4KQorICAgIHsKKyAgICAgIHBjcmVsOCA9IDA7CisgICAgICBidWlsZF9yZWxheGFibGVfaW5zdHJ1Y3Rpb24gKG9wY29kZSwgb3BlcmFuZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqb3V0cHV0ID0gZnJhZ19tb3JlIChvcGNvZGUtPmxlbmd0aCk7CisKKyAgICAgIG1lbXNldCAob3V0cHV0LCAwLCBvcGNvZGUtPmxlbmd0aCk7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvcGNvZGUtPmxlbmd0aDsgaW5kZXgrKykKKwl7CisJICBvdXRwdXRbaW5kZXhdID0gb3Bjb2RlLT5ieXRlc1tpbmRleF0uY29udGVudHM7CisKKwkgIHN3aXRjaCAob3Bjb2RlLT5ieXRlc1tpbmRleF0uaW5zZXJ0KQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgcHJpbnRmIChfKCJmYWlsZWQgZm9yICVkXG4iKSwgb3Bjb2RlLT5ieXRlc1tpbmRleF0uaW5zZXJ0KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAwOgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOOgorCSAgICAgIG91dHB1dFtpbmRleF0gfD0gcm47CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkQ6CisJICAgIGNhc2UgUkRJTkQ6CisJICAgICAgCisJICAgICAgb3V0cHV0W2luZGV4XSB8PSByZDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSUzoKKwkgICAgICBvdXRwdXRbaW5kZXhdIHw9IHJzOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERJU1AxNjoKKwkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfSU1NMTYsIDApOworCSAgICAgIGluZGV4Kys7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRElTUDg6CisJICAgIGNhc2UgRlBJTkRfRDg6CisJICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX0lNTTgsIDApOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgSU1NMTY6CisJICAgICAgeworCQlpbnQgcDsKKwkJc3dpdGNoIChpbW1lZGlhdGVfaW5wYWdlKSB7CisJCWNhc2UgJ3AnOgorCQkgIHAgPSBSX0g4NTAwX0hJR0gxNjsKKwkJICBicmVhazsKKwkJY2FzZSAnaCc6CQkKKwkJICBwID0gUl9IODUwMF9ISUdIMTY7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgcCA9IFJfSDg1MDBfSU1NMTY7CisJCSAgYnJlYWs7CisJCX0KKwkJCisJCWluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSxwLCAwKTsKKwkgICAgICB9CisJCQorCSAgICAgIGluZGV4Kys7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkxJU1Q6CisJICAgIGNhc2UgSU1NODoKKwkgICAgICBpZiAoaW1tZWRpYXRlX2lucGFnZSkKKwkJeworCQkgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSwgUl9IODUwMF9ISUdIOCwgMCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZpbW1lZGlhdGUsIFJfSDg1MDBfSU1NOCwgMCk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQQ1JFTDE2OgorCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9QQ1JFTDE2LCAxKTsKKwkgICAgICBpbmRleCsrOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBDUkVMODoKKwkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfUENSRUw4LCAxKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJTU00OgorCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY2hlY2sgKCZpbW1lZGlhdGUsIDAsIDE1KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDUjoKKworCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3I7CisJICAgICAgaWYgKGNyID09IDApCisJCXsKKwkJICBvdXRwdXRbMF0gfD0gMHg4OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgb3V0cHV0WzBdICY9IH4weDg7CisJCX0KKworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQ1JCOgorCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3JiOworCSAgICAgIG91dHB1dFswXSAmPSB+MHg4OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENSVzoKKwkgICAgICBvdXRwdXRbaW5kZXhdIHw9IGNydzsKKwkgICAgICBvdXRwdXRbMF0gfD0gMHg4OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFCUzI0OgorCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTI0LCAwKTsKKwkgICAgICBpbmRleCArPSAyOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFCUzE2OgorCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmFic29sdXRlLCBSX0g4NTAwX0lNTTE2LCAwKTsKKwkgICAgICBpbmRleCsrOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFCUzg6CisJICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmYWJzb2x1dGUsIFJfSDg1MDBfSU1NOCwgMCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUUlNOgorCSAgICAgIHN3aXRjaCAoaW1tZWRpYXRlLlhfYWRkX251bWJlcikKKwkJeworCQljYXNlIC0yOgorCQkgIG91dHB1dFtpbmRleF0gfD0gMHg1OworCQkgIGJyZWFrOworCQljYXNlIC0xOgorCQkgIG91dHB1dFtpbmRleF0gfD0gMHg0OworCQkgIGJyZWFrOworCQljYXNlIDE6CisJCSAgb3V0cHV0W2luZGV4XSB8PSAwOworCQkgIGJyZWFrOworCQljYXNlIDI6CisJCSAgb3V0cHV0W2luZGV4XSB8PSAxOworCQkgIGJyZWFrOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKKyAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jaXRvbiBpcyBzdXBwb3NlZCB0byBlbWl0CisgICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgorICAgKi8KKwordm9pZAorREVGVU4gKG1kX2Fzc2VtYmxlLCAoc3RyKSwKKyAgICAgICBjaGFyICpzdHIpCit7CisgIGNoYXIgKm9wX3N0YXJ0OworICBjaGFyICpvcF9lbmQ7CisgIGg4NTAwX29wZXJhbmRfaW5mbyBvcGVyYW5kWzJdOworICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOworICBoODUwMF9vcGNvZGVfaW5mbyAqcHJldl9vcGNvZGU7CisgIGNoYXIgbmFtZVsxMV07CisKKyAgaW50IG5sZW4gPSAwOworCisgIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLworICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOworICAgICAgICpvcF9lbmQgJiYKKyAgICAgICAhaXNfZW5kX29mX2xpbmVbKm9wX2VuZF0gJiYgKm9wX2VuZCAhPSAnICc7CisgICAgICAgb3BfZW5kKyspCisgICAgeworICAgICAgaWYgKAkJCS8qKm9wX2VuZCAhPSAnLicKKwkgICYmICpvcF9lbmQgIT0gJzonCisJICAgCSAgIAkgICAJICAmJiAqLyBubGVuIDwgMTApCisJeworCSAgbmFtZVtubGVuKytdID0gKm9wX2VuZDsKKwl9CisgICAgfQorICBuYW1lW25sZW5dID0gMDsKKworICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOworICAgIH0KKworICBvcGNvZGUgPSAoaDg1MDBfb3Bjb2RlX2luZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKKworICBpZiAob3Bjb2RlID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7CisgIHByZXZfb3Bjb2RlID0gb3Bjb2RlOworCisgIG9wY29kZSA9IGdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kKTsKKworICBpZiAob3Bjb2RlID09IDApCisgICAgeworICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KKyAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKKworICAgICAgd2hlcmVbMF0gPSAweDA7CisgICAgICB3aGVyZVsxXSA9IDB4MDsKKyAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBidWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKTsKKworfQorCit2b2lkCitERUZVTiAodGNfY3Jhd2xfc3ltYm9sX2NoYWluLCAoaGVhZGVycyksCisgICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQoreworICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOworfQorCitzeW1ib2xTICoKK0RFRlVOIChtZF91bmRlZmluZWRfc3ltYm9sLCAobmFtZSksCisgICAgICAgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK0RFRlVOICh0Y19oZWFkZXJzX2hvb2ssIChoZWFkZXJzKSwKKyAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCit7CisgIHByaW50ZiAoXygiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iKSk7Cit9CisKKy8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCisvKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCisjZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKKworLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKKyAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKKyAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgorICAgKi8KK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKKyAgTElUVExFTlVNX1RZUEUgKndvcmRQOworICBjaGFyICp0OworICBjaGFyICphdG9mX2llZWUgKCk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdTJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICBjYXNlICdyJzoKKyAgICBjYXNlICdSJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd4JzoKKyAgICBjYXNlICdYJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdwJzoKKyAgICBjYXNlICdQJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKnNpemVQID0gMDsKKyAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKKyAgICB9CisgIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOworICBpZiAodCkKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OworCisgICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKyAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKwwKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICByZXR1cm4gMDsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7Cit9CisMCit2b2lkCit0Y19hb3V0X2ZpeF90b19jaGFycyAoKQoreworICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7CisgIGFib3J0ICgpOworfQorCitzdGF0aWMKK3ZvaWQKK3dvcmRpZnlfc2NiIChidWZmZXIsIGRpc3Bfc2l6ZSwgaW5zdF9zaXplKQorICAgICBjaGFyICpidWZmZXI7CisgICAgIGludCAqZGlzcF9zaXplOworICAgICBpbnQgKmluc3Rfc2l6ZTsKK3sKKyAgaW50IHJuID0gYnVmZmVyWzFdICYgMHg3OworCisgIHN3aXRjaCAoYnVmZmVyWzBdKQorICAgIHsKKyAgICBjYXNlIDB4MGU6CQkJLyogQlNSICovCisgICAgY2FzZSAweDIwOgorICAgIGNhc2UgMHgyMToKKyAgICBjYXNlIDB4MjI6CisgICAgY2FzZSAweDIzOgorICAgIGNhc2UgMHgyNDoKKyAgICBjYXNlIDB4MjU6CisgICAgY2FzZSAweDI2OgorICAgIGNhc2UgMHgyNzoKKyAgICBjYXNlIDB4Mjg6CisgICAgY2FzZSAweDI5OgorICAgIGNhc2UgMHgyYToKKyAgICBjYXNlIDB4MmI6CisgICAgY2FzZSAweDJjOgorICAgIGNhc2UgMHgyZDoKKyAgICBjYXNlIDB4MmU6CisgICAgY2FzZSAweDJmOgorICAgICAgYnVmZmVyWzBdIHw9IDB4MTA7CisgICAgICBidWZmZXJbMV0gPSAwOworICAgICAgYnVmZmVyWzJdID0gMDsKKyAgICAgICpkaXNwX3NpemUgPSAyOworICAgICAgKmluc3Rfc2l6ZSA9IDE7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgY2FzZSAweDAxOgorICAgICAgKmluc3Rfc2l6ZSA9IDY7CisgICAgICAqZGlzcF9zaXplID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwNjoKKyAgICAgICppbnN0X3NpemUgPSA4OworICAgICAgKmRpc3Bfc2l6ZSA9IDI7CisKKyAgICAgICpidWZmZXIrKyA9IDB4MjY7CQkvKiBibmUgKyA4ICovCisgICAgICAqYnVmZmVyKysgPSAweDA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA3OgorICAgICAgKmluc3Rfc2l6ZSA9IDg7CisgICAgICAqZGlzcF9zaXplID0gMjsKKyAgICAgICpidWZmZXIrKyA9IDB4Mjc7CQkvKiBibmUgKyA4ICovCisgICAgICAqYnVmZmVyKysgPSAweDA4OworICAgICAgYnJlYWs7CisKKyAgICB9CisgICpidWZmZXIrKyA9IDB4YTggfCBybjsJLyogYWRkcSAtMSxybiAqLworICAqYnVmZmVyKysgPSAweDBjOworICAqYnVmZmVyKysgPSAweDA0OwkJLyogY21wICMweGZmOjgsIHJuICovCisgICpidWZmZXIrKyA9IDB4ZmY7CisgICpidWZmZXIrKyA9IDB4NzAgfCBybjsKKyAgKmJ1ZmZlcisrID0gMHgzNjsJCS8qIGJuZSAuLi4gKi8KKyAgKmJ1ZmZlcisrID0gMDsKKyAgKmJ1ZmZlcisrID0gMDsKK30KKworLyoKK2NhbGxlZCBhZnRlciByZWxheGluZywgY2hhbmdlIHRoZSBmcmFncyBzbyB0aGV5IGtub3cgaG93IGJpZyB0aGV5IGFyZQorKi8KK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7CisgICAgIHNlZ1Qgc2VnOworICAgICBmcmFnUyAqZnJhZ1A7Cit7CisgIGludCBkaXNwX3NpemUgPSAwOworICBpbnQgaW5zdF9zaXplID0gMDsKKyAgY2hhciAqYnVmZmVyID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOworCisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworICAgIGNhc2UgQyAoQlJBTkNILCBCWVRFX0RJU1ApOgorICAgICAgZGlzcF9zaXplID0gMTsKKyAgICAgIGluc3Rfc2l6ZSA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQyAoU0NCX0YsIEJZVEVfRElTUCk6CisgICAgY2FzZSBDIChTQ0JfVFNULCBCWVRFX0RJU1ApOgorICAgICAgZGlzcF9zaXplID0gMTsKKyAgICAgIGluc3Rfc2l6ZSA9IDI7CisgICAgICBicmVhazsKKworICAgICAgLyogQnJhbmNoZXMgdG8gYSBrbm93biAxNiBiaXQgZGlzcGxhY2VtZW50ICovCisKKyAgICAgIC8qIFR1cm4gb24gdGhlIDE2Yml0IGJpdCAqLworICAgIGNhc2UgQyAoQlJBTkNILCBXT1JEX0RJU1ApOgorICAgIGNhc2UgQyAoU0NCX0YsIFdPUkRfRElTUCk6CisgICAgY2FzZSBDIChTQ0JfVFNULCBXT1JEX0RJU1ApOgorICAgICAgd29yZGlmeV9zY2IgKGJ1ZmZlciwgJmRpc3Bfc2l6ZSwgJmluc3Rfc2l6ZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQyAoQlJBTkNILCBVTkRFRl9XT1JEX0RJU1ApOgorICAgIGNhc2UgQyAoU0NCX0YsIFVOREVGX1dPUkRfRElTUCk6CisgICAgY2FzZSBDIChTQ0JfVFNULCBVTkRFRl9XT1JEX0RJU1ApOgorICAgICAgLyogVGhpcyB0cmllZCB0byBiZSByZWxheGVkLCBidXQgZGlkbid0IG1hbmFnZSBpdCwgaXQgbm93IG5lZWRzIGEKKwkgZml4ICovCisgICAgICB3b3JkaWZ5X3NjYiAoYnVmZmVyLCAmZGlzcF9zaXplLCAmaW5zdF9zaXplKTsKKworICAgICAgLyogTWFrZSBhIHJlbG9jICovCisgICAgICBmaXhfbmV3IChmcmFnUCwKKwkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIGluc3Rfc2l6ZSwKKwkgICAgICAgNCwKKwkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKKwkgICAgICAgMCwKKwkgICAgICAgUl9IODUwMF9QQ1JFTDE2KTsKKworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBkaXNwX3NpemUgKyBpbnN0X3NpemU7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIGlmIChpbnN0X3NpemUpCisgICAgeworICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uICovCisgICAgICBpbnQgbmV4dF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzICsgZGlzcF9zaXplICsgaW5zdF9zaXplOworICAgICAgaW50IHRhcmdfYWRkciA9IChTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKworCQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCk7CisgICAgICBpbnQgZGlzcCA9IHRhcmdfYWRkciAtIG5leHRfaW5zdDsKKworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIgKyBpbnN0X3NpemUsIGRpc3AsIGRpc3Bfc2l6ZSk7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgIH0KK30KKwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWcsIHNpemUpCisgICAgIHNlZ1Qgc2VnIDsKKyAgICAgdmFsdWVUIHNpemU7Cit7CisgIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpIAorCSAgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOworCit9CisKK3ZvaWQKK21kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQorICAgICBmaXhTICpmaXhQOworICAgICBsb25nIHZhbDsKK3sKKyAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOworCisgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gMCkKKyAgICB7CisgICAgICBmaXhQLT5meF9yX3R5cGUgPSBmaXhQLT5meF9zaXplID09IDQgPyBSX0g4NTAwX0lNTTMyIDogUl9IODUwMF9JTU0xNjsKKyAgICB9CisKKyAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCisgICAgeworCisgICAgY2FzZSBSX0g4NTAwX0lNTTg6CisgICAgY2FzZSBSX0g4NTAwX1BDUkVMODoKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKKyAgICBjYXNlIFJfSDg1MDBfTE9XMTY6CisgICAgY2FzZSBSX0g4NTAwX1BDUkVMMTY6CisgICAgICAqYnVmKysgPSAodmFsID4+IDgpOworICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0g4NTAwX0hJR0g4OgorICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX0g4NTAwX0hJR0gxNjoKKyAgICAgICpidWYrKyA9IHZhbCA+PiAyNDsKKyAgICAgICpidWYrKyA9IHZhbCA+PiAxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOworICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9IODUwMF9JTU0zMjoKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOworICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7CisgICAgICAqYnVmKysgPSAodmFsID4+IDgpOworICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgfQorfQorCisvKgorY2FsbGVkIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbiwgcmV0dXJuIHRoZSBsZW5ndGgKK2J5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvIHJlYWNoIGl0J3MgZGVzdGluYXRpb24KKyovCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQorICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7CisgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOworeworICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7CisKKyAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIGNhc2UgQyAoQlJBTkNILCBVTkRFRl9CWVRFX0RJU1ApOgorICAgIGNhc2UgQyAoU0NCX0YsIFVOREVGX0JZVEVfRElTUCk6CisgICAgY2FzZSBDIChTQ0JfVFNULCBVTkRFRl9CWVRFX0RJU1ApOgorICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KKyAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCisJeworCSAgLyogR290IGEgc3ltYm9sIGFuZCBpdCdzIGRlZmluZWQgaW4gdGhpcyBzZWdtZW50LCBiZWNvbWUgYnl0ZQorCSBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIEJZVEVfRElTUCk7CisJICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSXRzIGdvdCBhIHNlZ21lbnQsIGJ1dCBpdHMgbm90IG91cnMsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIGxvbmcgKi8KKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgVU5ERUZfV09SRF9ESVNQKTsKKwkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoOworCSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7CisJfQorICAgIH0KKyAgcmV0dXJuIGZyYWdQLT5mcl92YXI7Cit9CisKKy8qIFB1dCBudW1iZXIgaW50byB0YXJnZXQgYnl0ZSBvcmRlciAqLworCit2b2lkCittZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgdmFsdWVUIHVzZTsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Cit9CisKK2xvbmcKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworfQorCisvKkFSR1NVU0VEKi8KK3ZvaWQKK3RjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQorICAgICBzeW1ib2xTICppZ25vcmU7Cit7Cit9CisKK3Nob3J0Cit0Y19jb2ZmX2ZpeDJydHlwZSAoZml4X3B0cikKKyAgICAgZml4UyAqZml4X3B0cjsKK3sKKyAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKKyAgICB7CisgICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KKyAgICAgKi8KKyAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKKwl7CisJY2FzZSAyOgorCSAgcmV0dXJuIFJfSDg1MDBfSU1NMTY7CisJICBicmVhazsKKwljYXNlIDE6CisJICByZXR1cm4gUl9IODUwMF9JTU04OworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisgIHJldHVybiBmaXhfcHRyLT5meF9yX3R5cGU7Cit9CisKK3ZvaWQKK3RjX3JlbG9jX21hbmdsZSAoZml4X3B0ciwgaW50ciwgYmFzZSkKKyAgICAgZml4UyAqZml4X3B0cjsKKyAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRyOworICAgICBiZmRfdm1hIGJhc2U7CisKK3sKKyAgc3ltYm9sUyAqc3ltYm9sX3B0cjsKKworICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7CisKKyAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvaworICAgICB0byBvdXRwdXQgaXQgKi8KKyAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ18zMikKKyAgICB7CisgICAgICAvKiBjb25zIGxpa2VzIHRvIGNyZWF0ZSByZWxvYzMyJ3Mgd2hhdGV2ZXIgdGhlIHNpemUgb2YgdGhlIHJlbG9jLi4KKyAgICAgICAqLworICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQorCXsKKwljYXNlIDI6CisJICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgaW50ci0+cl90eXBlID0gUl9JTU04OworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7CisgICAgfQorCisgIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOworICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKKworICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLworICBpZiAoc3ltYm9sX3B0cikKKyAgICB7CisgICAgICBzeW1ib2xTICpkb3Q7CisKKyAgICAgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OworICAgICAgaWYgKGRvdCkKKwl7CisJICAvKgkgIGludHItPnJfb2Zmc2V0IC09CisJICAgIHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UKHN5bWJvbF9wdHIpXS5zY25oZHIuc19wYWRkcjsqLworCSAgaW50ci0+cl9vZmZzZXQgKz0gU19HRVRfVkFMVUUgKHN5bWJvbF9wdHIpOworCSAgaW50ci0+cl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50ci0+cl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7CisJfQorCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKKyAgICB9CisKK30KKworCisKK2ludAorc3RhcnRfbGFiZWwgKHB0cikKKyAgICAgY2hhciAqcHRyOworeworICAvKiBDaGVjayBmb3IgOnMudyAqLworICBpZiAoaXNhbHBoYSAocHRyWzFdKSAmJiBwdHJbMl0gPT0gJy4nKQorICAgIHJldHVybiAwOworICAvKiBDaGVjayBmb3IgOnMgKi8KKyAgaWYgKGlzYWxwaGEgKHB0clsxXSkgJiYgIWlzYWxwaGEgKHB0clsyXSkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisKK2ludAordGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOworfQorCisvKiBlbmQgb2YgdGMtaDg1MDAuYyAqLworCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWg4NTAwLmggYi9nYXMvY29uZmlnL3RjLWg4NTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1M2VjMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtaDg1MDAuaApAQCAtMCwwICsxLDU3IEBACisvKiBUaGlzIGZpbGUgaXMgdGMtaDg1MDAuaAorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2RlZmluZSBUQ19IODUwMAorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKKworI2lmIEFOU0lfUFJPVE9UWVBFUworc3RydWN0IGludGVybmFsX3JlbG9jOworI2VuZGlmCisKKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisvKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLworI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQorCisjZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2g4NTAwCisjZGVmaW5lIENPRkZfTUFHSUMgMHg4NTAwCisjZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgoeCktPmZ4X2FkZHN5fHwoeCktPmZ4X3N1YnN5KQorI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUworCisjZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCitleHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKKyAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOworCisjZGVmaW5lIERPX05PVF9TVFJJUCAwCisjZGVmaW5lIExJU1RJTkdfSEVBREVSICJIaXRhY2hpIEg4LzUwMCBHQVMgIgorI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCisjZGVmaW5lIFJFTE9DXzMyIDEyMzQKKworI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaCwgcHRyKSAgKGNoID09ICc6JyAmJiBzdGFydF9sYWJlbChwdHIpKQorI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKK2V4dGVybiBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCisKKy8qIGVuZCBvZiB0Yy1oODUwMC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWhwcGEuYyBiL2dhcy9jb25maWcvdGMtaHBwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODVkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWhwcGEuYwpAQCAtMCwwICsxLDY3MTYgQEAKKy8qIHRjLWhwcGEuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFBBCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKKyAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisKKyNpbmNsdWRlICJiZmQvbGliaHBwYS5oIgorI2luY2x1ZGUgImJmZC9saWJiZmQuaCIKKworLyogQmUgY2FyZWZ1bCwgdGhpcyBmaWxlIGluY2x1ZGVzIGRhdGEgKmRlY2xhcmF0aW9ucyouICAqLworI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCisKKy8qIEEgImNvbnZpZW50IiBwbGFjZSB0byBwdXQgb2JqZWN0IGZpbGUgZGVwZW5kZW5jaWVzIHdoaWNoIGRvCisgICBub3QgbmVlZCB0byBiZSBzZWVuIG91dHNpZGUgb2YgdGMtaHBwYS5jLiAgKi8KKyNpZmRlZiBPQkpfRUxGCisvKiBOYW1lcyBvZiB2YXJpb3VzIGRlYnVnZ2luZyBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KKyNkZWZpbmUgR0RCX0RFQlVHX1NQQUNFX05BTUUgIi5zdGFiIgorI2RlZmluZSBHREJfU1RSSU5HU19TVUJTUEFDRV9OQU1FICIuc3RhYnN0ciIKKyNkZWZpbmUgR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSAiLnN0YWIiCisjZGVmaW5lIFVOV0lORF9TRUNUSU9OX05BTUUgIi5QQVJJU0MudW53aW5kIgorLyogTm9uemVybyBpZiBDT0RFIGlzIGEgZml4dXAgY29kZSBuZWVkaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4gICovCisKKy8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KK3R5cGVkZWYgZWxmMzJfaHBwYV9yZWxvY190eXBlIHJlbG9jX3R5cGU7CisKKy8qIE9iamVjdCBmaWxlIGZvcm1hdHMgc3BlY2lmeSBCRkQgc3ltYm9sIHR5cGVzLiAgKi8KK3R5cGVkZWYgZWxmX3N5bWJvbF90eXBlIG9ial9zeW1ib2xfdHlwZTsKKworLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUKKworLyogRUxGIG9iamVjdHMgY2FuIGhhdmUgdmVyc2lvbnMsIGJ1dCBhcHBhcmVudGx5IGRvIG5vdCBoYXZlIGFueXdoZXJlCisgICB0byBzdG9yZSBhIGNvcHlyaWdodCBzdHJpbmcuICAqLworI2RlZmluZSBvYmpfdmVyc2lvbiBvYmpfZWxmX3ZlcnNpb24KKyNkZWZpbmUgb2JqX2NvcHlyaWdodCBvYmpfZWxmX3ZlcnNpb24KKworLyogVXNlIHNwYWNlIGFsaWFzZXMuICAqLworI2RlZmluZSBVU0VfQUxJQVNFUyAxCisjZW5kaWYKKworI2lmZGVmIE9CSl9TT00KKy8qIE5hbWVzIG9mIHZhcmlvdXMgZGVidWdnaW5nIHNwYWNlcy9zdWJzcGFjZXMuICAqLworI2RlZmluZSBHREJfREVCVUdfU1BBQ0VfTkFNRSAiJEdEQl9ERUJVRyQiCisjZGVmaW5lIEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUgIiRHREJfU1RSSU5HUyQiCisjZGVmaW5lIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUgIiRHREJfU1lNQk9MUyQiCisjZGVmaW5lIFVOV0lORF9TRUNUSU9OX05BTUUgIiRVTldJTkQkIgorCisvKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgcmVsb2NhdGlvbiB0eXBlcy4gICovCit0eXBlZGVmIGludCByZWxvY190eXBlOworCisvKiBTT00gb2JqZWN0cyBjYW4gaGF2ZSBib3RoIGEgdmVyc2lvbiBzdHJpbmcgYW5kIGEgY29weXJpZ2h0IHN0cmluZy4gICovCisjZGVmaW5lIG9ial92ZXJzaW9uIG9ial9zb21fdmVyc2lvbgorI2RlZmluZSBvYmpfY29weXJpZ2h0IG9ial9zb21fY29weXJpZ2h0CisKKy8qIERvIG5vdCB1c2Ugc3BhY2UgYWxpYXNlcy4gICovCisjZGVmaW5lIFVTRV9BTElBU0VTIDAKKworLyogSG93IHRvIGdlbmVyYXRlIGEgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIGhwcGFfZ2VuX3JlbG9jX3R5cGUgaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUKKworLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IEJGRCBzeW1ib2wgdHlwZXMuICAqLwordHlwZWRlZiBzb21fc3ltYm9sX3R5cGUgb2JqX3N5bWJvbF90eXBlOworCisvKiBUaGlzIGFwcGFyZW50bHkgaXNuJ3QgaW4gb2xkZXIgdmVyc2lvbnMgb2YgaHB1eCByZWxvYy5oLiAgKi8KKyNpZm5kZWYgUl9ETFRfUkVMCisjZGVmaW5lIFJfRExUX1JFTCAweDc4CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFJfTjBTRUwKKyNkZWZpbmUgUl9OMFNFTCAweGQ4CisjZW5kaWYKKworI2lmbmRlZiBSX04xU0VMCisjZGVmaW5lIFJfTjFTRUwgMHhkOQorI2VuZGlmCisKKy8qIFZhcmlvdXMgc3RydWN0dXJlcyBhbmQgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGluIHRjLWhwcGEuYy4gICovCisKKy8qIFVud2luZCB0YWJsZSBhbmQgZGVzY3JpcHRvci4gIEZJWE1FOiBTeW5jIHRoaXMgd2l0aCBHREIgdmVyc2lvbi4gICovCisKK3N0cnVjdCB1bndpbmRfZGVzYworICB7CisgICAgdW5zaWduZWQgaW50IGNhbm5vdF91bndpbmQ6MTsKKyAgICB1bnNpZ25lZCBpbnQgbWlsbGljb2RlOjE7CisgICAgdW5zaWduZWQgaW50IG1pbGxpY29kZV9zYXZlX3Jlc3Q6MTsKKyAgICB1bnNpZ25lZCBpbnQgcmVnaW9uX2Rlc2M6MjsKKyAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcjoyOworICAgIHVuc2lnbmVkIGludCBlbnRyeV9mcjo0OworICAgIHVuc2lnbmVkIGludCBlbnRyeV9ncjo1OworICAgIHVuc2lnbmVkIGludCBhcmdzX3N0b3JlZDoxOworICAgIHVuc2lnbmVkIGludCBjYWxsX2ZyOjU7CisgICAgdW5zaWduZWQgaW50IGNhbGxfZ3I6NTsKKyAgICB1bnNpZ25lZCBpbnQgc2F2ZV9zcDoxOworICAgIHVuc2lnbmVkIGludCBzYXZlX3JwOjE7CisgICAgdW5zaWduZWQgaW50IHNhdmVfcnBfaW5fZnJhbWU6MTsKKyAgICB1bnNpZ25lZCBpbnQgZXh0bl9wdHJfZGVmaW5lZDoxOworICAgIHVuc2lnbmVkIGludCBjbGVhbnVwX2RlZmluZWQ6MTsKKworICAgIHVuc2lnbmVkIGludCBocGVfaW50ZXJydXB0X21hcmtlcjoxOworICAgIHVuc2lnbmVkIGludCBocHV4X2ludGVycnVwdF9tYXJrZXI6MTsKKyAgICB1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MzsKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZToyNzsKKyAgfTsKKworc3RydWN0IHVud2luZF90YWJsZQorICB7CisgICAgLyogU3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXRzIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5CisgICAgICAgZGVzY3JpcHRvci4gICovCisgICAgdW5zaWduZWQgaW50IHN0YXJ0X29mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgZW5kX29mZnNldDsKKyAgICBzdHJ1Y3QgdW53aW5kX2Rlc2MgZGVzY3JpcHRvcjsKKyAgfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgLmNhbGxpbmZvLCAuZW50ZXIsIC5sZWF2ZSBwc2V1ZG8tb3BzIHRvCisgICBjb250cm9sIHRoZSBlbnRyeSBhbmQgZXhpdCBjb2RlIHRoZXkgZ2VuZXJhdGUuIEl0IGlzIGFsc28gdXNlZCBpbgorICAgY3JlYXRpb24gb2YgdGhlIGNvcnJlY3Qgc3RhY2sgdW53aW5kIGRlc2NyaXB0b3JzLgorCisgICBOT1RFOiAgR0FTIGRvZXMgbm90IHN1cHBvcnQgLmVudGVyIGFuZCAubGVhdmUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mCisgICBwcm9sb2d1ZXMgYW5kIGVwaWxvZ3Vlcy4gIEZJWE1FLgorCisgICBUaGUgZmllbGRzIGluIHN0cnVjdHVyZSByb3VnaGx5IGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cyBhdmFpbGFibGUgb24gdGhlCisgICAuY2FsbGluZm8gcHNldWRvLW9wLiAgKi8KKworc3RydWN0IGNhbGxfaW5mbworICB7CisgICAgLyogVGhlIHVud2luZCBkZXNjcmlwdG9yIGJlaW5nIGJ1aWx0LiAgKi8KKyAgICBzdHJ1Y3QgdW53aW5kX3RhYmxlIGNpX3Vud2luZDsKKworICAgIC8qIE5hbWUgb2YgdGhpcyBmdW5jdGlvbi4gICovCisgICAgc3ltYm9sUyAqc3RhcnRfc3ltYm9sOworCisgICAgLyogKHRlbXBvcmFyeSkgc3ltYm9sIHVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uICAqLworICAgIHN5bWJvbFMgKmVuZF9zeW1ib2w7CisKKyAgICAvKiBOZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4gICovCisgICAgc3RydWN0IGNhbGxfaW5mbyAqY2lfbmV4dDsKKyAgfTsKKworLyogT3BlcmFuZCBmb3JtYXRzIGZvciBGUCBpbnN0cnVjdGlvbnMuICAgTm90ZSBub3QgYWxsIEZQIGluc3RydWN0aW9ucworICAgYWxsb3cgYWxsIGZvdXIgZm9ybWF0cyB0byBiZSB1c2VkIChmb3IgZXhhbXBsZSBmbXB5c3ViIG9ubHkgYWxsb3dzCisgICBTR0wgYW5kIERCTCkuICAqLwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBTR0wsIERCTCwgSUxMRUdBTF9GTVQsIFFVQUQsIFcsIFVXLCBEVywgVURXLCBRVywgVVFXCisgIH0KK2ZwX29wZXJhbmRfZm9ybWF0OworCisvKiBUaGlzIGZ1bGx5IGRlc2NyaWJlcyB0aGUgc3ltYm9sIHR5cGVzIHdoaWNoIG1heSBiZSBhdHRhY2hlZCB0bworICAgYW4gRVhQT1JUIG9yIElNUE9SVCBkaXJlY3RpdmUuICBPbmx5IFNPTSB1c2VzIHRoaXMgZm9ybWF0aW9uCisgICAoRUxGIGhhcyBubyBuZWVkIGZvciBpdCkuICAqLwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBTWU1CT0xfVFlQRV9VTktOT1dOLAorICAgIFNZTUJPTF9UWVBFX0FCU09MVVRFLAorICAgIFNZTUJPTF9UWVBFX0NPREUsCisgICAgU1lNQk9MX1RZUEVfREFUQSwKKyAgICBTWU1CT0xfVFlQRV9FTlRSWSwKKyAgICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCisgICAgU1lNQk9MX1RZUEVfUExBQkVMLAorICAgIFNZTUJPTF9UWVBFX1BSSV9QUk9HLAorICAgIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAorICB9CitwYV9zeW1ib2xfdHlwZTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFzc2VtYmxlCisgICBpbmRpdmlkdWFsIGluc3RydWN0aW9ucy4gICovCitzdHJ1Y3QgcGFfaXQKKyAgeworICAgIC8qIEhvbGRzIHRoZSBvcGNvZGUgYWZ0ZXIgcGFyc2luZyBieSBwYV9pcC4gICovCisgICAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisKKyAgICAvKiBIb2xkcyBhbiBleHByZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCisgICAgZXhwcmVzc2lvblMgZXhwOworCisgICAgLyogRG9lcyB0aGlzIGluc3RydWN0aW9uIHVzZSBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nLiAgKi8KKyAgICBpbnQgcGNyZWw7CisKKyAgICAvKiBGbG9hdGluZyBwb2ludCBmb3JtYXRzIGZvciBvcGVyYW5kMSBhbmQgb3BlcmFuZDIuICAqLworICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YxOworICAgIGZwX29wZXJhbmRfZm9ybWF0IGZwb2YyOworCisKKyAgICAvKiBIb2xkcyB0aGUgZmllbGQgc2VsZWN0b3IgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAoZm9yIGV4YW1wbGUgTCUsIExSJSwgZXRjKS4gICovCisgICAgbG9uZyBmaWVsZF9zZWxlY3RvcjsKKworICAgIC8qIEhvbGRzIGFueSBhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgICBpbnN0cnVjdGlvbi4gIChpbnN0cnVjdGlvbiBzaG91bGQgYmUgc29tZSBzb3J0IG9mIGNhbGwpLiAgKi8KKyAgICBsb25nIGFyZ19yZWxvYzsKKworICAgIC8qIFRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCisgICAgaW50IGZvcm1hdDsKKworICAgIC8qIFRoZSByZWxvY2F0aW9uIChpZiBhbnkpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RydWN0aW9uLiAgKi8KKyAgICByZWxvY190eXBlIHJlbG9jOworICB9OworCisvKiBQQS04OSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIGFycmFuZ2VkIGxpa2UgdGhpczoKKworCisgICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICB8ICAgMCBvciAxNkwgICB8ICAxNiBvciAxNlIgICB8CisgICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICB8ICAgMSBvciAxN0wgICB8ICAxNyBvciAxN1IgICB8CisgICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisKKyAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KKyAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KKyAgIC4gICAgICAgICAgICAgIC4gICAgICAgICAgICAgIC4KKworICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgfCAgMTQgb3IgMzBMICAgfCAgMzAgb3IgMzBSICAgfAorICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgfCAgMTUgb3IgMzFMICAgfCAgMzEgb3IgMzFSICAgfAorICAgKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworCisKKyAgIFRoZSBmb2xsb3dpbmcgaXMgYSB2ZXJzaW9uIG9mIHBhX3BhcnNlX251bWJlciB0aGF0CisgICBoYW5kbGVzIHRoZSBML1Igbm90YXRpb24gYW5kIHJldHVybnMgdGhlIGNvcnJlY3QKKyAgIHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBpbnN0cnVjdGlvbiByZWdpc3RlciBmaWVsZC4KKyAgIFRoZSBjb3JyZWN0IHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBpcworICAgZW5jb2RlZCBpbiB0aGUgc3RydWN0dXJlICdwYV8xMV9mcF9yZWdfc3RydWN0Jy4gICovCisKK3N0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0CisgIHsKKyAgICAvKiBUaGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KKyAgICBjaGFyIG51bWJlcl9wYXJ0OworCisgICAgLyogTC9SIHNlbGVjdG9yLiAgKi8KKyAgICBjaGFyIGxfcl9zZWxlY3Q7CisgIH07CisKKy8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMuICAqLworc3RydWN0IGNhbGxfZGVzYworICB7CisgICAgLyogVGhlIGFyZ3VtZW50IHJlbG9jYXRpb24gc3BlY2lmaWNhdGlvbi4gICovCisgICAgdW5zaWduZWQgaW50IGFyZ19yZWxvYzsKKworICAgIC8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLworICAgIHVuc2lnbmVkIGludCBhcmdfY291bnQ7CisgIH07CisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkKKyAgIGNoYWluLiAgKi8KKworc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4KKyAgeworICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUuICAqLworICAgIHVuc2lnbmVkIGludCBzc2RfZGVmaW5lZDsKKworICAgIC8qIE5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCisgICAgY2hhciAqc3NkX25hbWU7CisKKyAgICAvKiBHQVMgc2VnbWVudCBhbmQgc3Vic2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCisgICAgYXNlY3Rpb24gKnNzZF9zZWc7CisgICAgaW50IHNzZF9zdWJzZWc7CisKKyAgICAvKiBOZXh0IHNwYWNlIGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluLiAgKi8KKyAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbiAqc3NkX25leHQ7CisgIH07CisKK3R5cGVkZWYgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc3NkX2NoYWluX3N0cnVjdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBlbnRyeSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeQorICAgY2hhaW4uICAqLworCitzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbgorICB7CisgICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZSBvcgorICAgICAgIGFzIGEgZGVmYXVsdCBzcGFjZS4gICovCisgICAgdW5zaWduZWQgaW50IHNkX2RlZmluZWQ7CisKKyAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2VzIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZS4gICovCisgICAgdW5zaWduZWQgaW50IHNkX3VzZXJfZGVmaW5lZDsKKworICAgIC8qIFRoZSBzcGFjZSBudW1iZXIgKG9yIGluZGV4KS4gICovCisgICAgdW5zaWduZWQgaW50IHNkX3NwbnVtOworCisgICAgLyogVGhlIG5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCisgICAgY2hhciAqc2RfbmFtZTsKKworICAgIC8qIEdBUyBzZWdtZW50IHRvIHdoaWNoIHRoaXMgc3Vic3BhY2UgY29ycmVzcG9uZHMuICAqLworICAgIGFzZWN0aW9uICpzZF9zZWc7CisKKyAgICAvKiBDdXJyZW50IHN1YnNlZ21lbnQgbnVtYmVyIGJlaW5nIHVzZWQuICAqLworICAgIGludCBzZF9sYXN0X3N1YnNlZzsKKworICAgIC8qIFRoZSBjaGFpbiBvZiBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwYWNlLiAgKi8KKyAgICBzc2RfY2hhaW5fc3RydWN0ICpzZF9zdWJzcGFjZXM7CisKKyAgICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BhY2UgZGljdGlvbmFyeSBjaGFpbi4gICovCisgICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gKnNkX25leHQ7CisgIH07CisKK3R5cGVkZWYgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc2RfY2hhaW5fc3RydWN0OworCisvKiBTdHJ1Y3R1cmUgZm9yIHByZXZpb3VzIGxhYmVsIHRyYWNraW5nLiAgTmVlZGVkIHNvIHRoYXQgYWxpZ25tZW50cywKKyAgIGNhbGxpbmZvIGRlY2xhcmF0aW9ucywgZXRjIGNhbiBiZSBlYXNpbHkgYXR0YWNoZWQgdG8gYSBwYXJ0aWN1bGFyCisgICBsYWJlbC4gICovCit0eXBlZGVmIHN0cnVjdCBsYWJlbF9zeW1ib2xfc3RydWN0CisgIHsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpsc3NfbGFiZWw7CisgICAgc2RfY2hhaW5fc3RydWN0ICpsc3Nfc3BhY2U7CisgICAgc3RydWN0IGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxzc19uZXh0OworICB9CitsYWJlbF9zeW1ib2xfc3RydWN0OworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGF0dHJpYnV0ZXMgb2YgdGhlIGRlZmF1bHQgc3Vic3BhY2UKKyAgIGRpY3Rpb25hcnkgZW50cmllcy4gICovCisKK3N0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QKKyAgeworICAgIC8qIE5hbWUgb2YgdGhlIHN1YnNwYWNlLiAgKi8KKyAgICBjaGFyICpuYW1lOworCisgICAgLyogRklYTUUuICBJcyB0aGlzIHN0aWxsIG5lZWRlZD8gICovCisgICAgY2hhciBkZWZpbmVkOworCisgICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KKyAgICBjaGFyIGxvYWRhYmxlOworCisgICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGNvbnRhaW5zIG9ubHkgY29kZS4gICovCisgICAgY2hhciBjb2RlX29ubHk7CisKKyAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3Vic3BhY2UuICAqLworICAgIGNoYXIgY29tbW9uOworCisgICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN1YnNwYWNlIHdoaWNoIGFsbG93cyBzeW1ib2xzCisgICAgICAgdG8gYmUgbXVsdGlwbHkgZGVmaW5lZC4gICovCisgICAgY2hhciBkdXBfY29tbW9uOworCisgICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIHNob3VsZCBiZSB6ZXJvIGZpbGxlZC4gICovCisgICAgY2hhciB6ZXJvOworCisgICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3Vic3BhY2UuICAqLworICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKKworICAgIC8qIEFjY2VzcyBjb250cm9sIGJpdHMgZm9yIHRoaXMgc3Vic3BhY2UuICBDYW4gcmVwcmVzZW50IFJXWCBhY2Nlc3MKKyAgICAgICBhcyB3ZWxsIGFzIHByaXZpbGVnZSBsZXZlbCBjaGFuZ2VzIGZvciBnYXRld2F5cy4gICovCisgICAgaW50IGFjY2VzczsKKworICAgIC8qIEluZGV4IG9mIGNvbnRhaW5pbmcgc3BhY2UuICAqLworICAgIGludCBzcGFjZV9pbmRleDsKKworICAgIC8qIEFsaWdubWVudCAoaW4gYnl0ZXMpIG9mIHRoaXMgc3Vic3BhY2UuICAqLworICAgIGludCBhbGlnbm1lbnQ7CisKKyAgICAvKiBRdWFkcmFudCB3aXRoaW4gc3BhY2Ugd2hlcmUgdGhpcyBzdWJzcGFjZSBzaG91bGQgYmUgbG9hZGVkLiAgKi8KKyAgICBpbnQgcXVhZHJhbnQ7CisKKyAgICAvKiBBbiBpbmRleCBpbnRvIHRoZSBkZWZhdWx0IHNwYWNlcyBhcnJheS4gICovCisgICAgaW50IGRlZl9zcGFjZV9pbmRleDsKKworICAgIC8qIEFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24gKG9yIE5VTEwgaWYgbm8gYWxpYXMgZXhpc3RzKS4gICovCisgICAgY2hhciAqYWxpYXM7CisKKyAgICAvKiBTdWJzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNwYWNlLiAgKi8KKyAgICBzdWJzZWdUIHN1YnNlZ21lbnQ7CisgIH07CisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYXR0cmlidXRlcyBvZiB0aGUgZGVmYXVsdCBzcGFjZQorICAgZGljdGlvbmFyeSBlbnRyaWVzLiAgKi8KKworc3RydWN0IGRlZmF1bHRfc3BhY2VfZGljdAorICB7CisgICAgLyogTmFtZSBvZiB0aGUgc3BhY2UuICAqLworICAgIGNoYXIgKm5hbWU7CisKKyAgICAvKiBTcGFjZSBudW1iZXIuICBJdCBpcyBwb3NzaWJsZSB0byBpZGVudGlmeSBzcGFjZXMgd2l0aGluCisgICAgICAgYXNzZW1ibHkgY29kZSBudW1lcmljYWxseSEgICovCisgICAgaW50IHNwbnVtOworCisgICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KKyAgICBjaGFyIGxvYWRhYmxlOworCisgICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGlzICJkZWZpbmVkIi4gIEZJWE1FIGlzIHN0aWxsIG5lZWRlZCAqLworICAgIGNoYXIgZGVmaW5lZDsKKworICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBjYW4gbm90IGJlIHNoYXJlZC4gICovCisgICAgY2hhciBwcml2YXRlOworCisgICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3BhY2UuICAqLworICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKKworICAgIC8qIFNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BhY2UuICAqLworICAgIGFzZWN0aW9uICpzZWdtZW50OworCisgICAgLyogQW4gYWxpYXMgZm9yIHRoaXMgc2VjdGlvbiAob3IgTlVMTCBpZiBubyBhbGlhcyBleGlzdHMpLiAgKi8KKyAgICBjaGFyICphbGlhczsKKyAgfTsKKworLyogRXh0cmEgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHBlcmZvcm0gZml4dXBzIChyZWxvY2F0aW9ucykgb24gdGhlIFBBLiAgKi8KK3N0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QKKyAgeworICAgIC8qIFRoZSBmaWVsZCBzZWxlY3Rvci4gICovCisgICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IGZ4X3JfZmllbGQ7CisKKyAgICAvKiBUeXBlIG9mIGZpeHVwLiAgKi8KKyAgICBpbnQgZnhfcl90eXBlOworCisgICAgLyogRm9ybWF0IG9mIGZpeHVwLiAgKi8KKyAgICBpbnQgZnhfcl9mb3JtYXQ7CisKKyAgICAvKiBBcmd1bWVudCByZWxvY2F0aW9uIGJpdHMuICAqLworICAgIGxvbmcgZnhfYXJnX3JlbG9jOworCisgICAgLyogVGhlIHNlZ21lbnQgdGhpcyBmaXh1cCBhcHBlYXJzIGluLiAgKi8KKyAgICBzZWdUIHNlZ21lbnQ7CisgIH07CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KKworc3RydWN0IHBkX3JlZworICB7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgdmFsdWU7CisgIH07CisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG1hcHBpbmcgZnJvbSBhIEZQIGNvbmRpdGlvbiBzdHJpbmcKKyAgIHRvIGEgY29uZGl0aW9uIG51bWJlciB3aGljaCBjYW4gYmUgcmVjb3JkZWQgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLworc3RydWN0IGZwX2NvbmRfbWFwCisgIHsKKyAgICBjaGFyICpzdHJpbmc7CisgICAgaW50IGNvbmQ7CisgIH07CisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBtYXBwaW5nIGZyb20gYSBmaWVsZCBzZWxlY3RvcgorICAgc3RyaW5nIHRvIGEgZmllbGQgc2VsZWN0b3IgdHlwZS4gICovCitzdHJ1Y3Qgc2VsZWN0b3JfZW50cnkKKyAgeworICAgIGNoYXIgKnByZWZpeDsKKyAgICBpbnQgZmllbGRfc2VsZWN0b3I7CisgIH07CisKKy8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBsb2NhbCB0byB0Yy1ocHBhLmMuICAqLworCitzdGF0aWMgdm9pZCBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQgcGFfcGFyc2VfZnBfZm9ybWF0IFBBUkFNUyAoKGNoYXIgKipzKSk7CitzdGF0aWMgdm9pZCBwYV9jb25zIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9maWxsIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfbGNvbW0gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9sc3ltIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfc3RyaW5nZXIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV90ZXh0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBpbnQgcGFfcGFyc2VfZnBfY21wX2NvbmQgUEFSQU1TICgoY2hhciAqKikpOworc3RhdGljIGludCBnZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChjaGFyICopKTsKK3N0YXRpYyBpbnQgcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gUEFSQU1TICgoc3RydWN0IHBhX2l0ICosIGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgZXZhbHVhdGVfYWJzb2x1dGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFfYnVpbGRfYXJnX3JlbG9jIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHVuc2lnbmVkIGludCBwYV9hbGlnbl9hcmdfcmVsb2MgUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBpbnQgcGFfcGFyc2VfbnVsbGlmIFBBUkFNUyAoKGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7CitzdGF0aWMgaW50IHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOworc3RhdGljIGludCBwYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKK3N0YXRpYyBpbnQgcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7CitzdGF0aWMgdm9pZCBwYV9hbGlnbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX2Jsb2NrIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfYnJ0YWIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV90cnkgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9jYWxsIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfY2FsbF9hcmdzIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2Rlc2MgKikpOworc3RhdGljIHZvaWQgcGFfY2FsbGluZm8gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9jb2RlIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfY29tbSBQQVJBTVMgKChpbnQpKTsKKyNpZmRlZiBPQkpfU09NCitzdGF0aWMgdm9pZCBwYV9jb21waWxlciBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcGFfY29weXJpZ2h0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfZW5kIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfZW50ZXIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX2VxdSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX2V4aXQgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9leHBvcnQgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV90eXBlX2FyZ3MgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX2ltcG9ydCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX2xhYmVsIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfbGVhdmUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9sZXZlbCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX29yaWdpbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX3Byb2MgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9wcm9jZW5kIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfc3BhY2UgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV9zcG51bSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBhX3N1YnNwYWNlIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfcGFyYW0gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwYV91bmRlZmluZV9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IG5lZWRfcGExMV9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICosCisJCQkJICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7CitzdGF0aWMgaW50IHBhX3BhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICoqLCBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7CitzdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqcGFfZ2V0X2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmNyZWF0ZV9uZXdfc3BhY2UgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwKKwkJCQkJCSAgaW50LCBpbnQsIGludCwKKwkJCQkJCSAgYXNlY3Rpb24gKiwgaW50KSk7CitzdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zdWJzcGFjZSBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwKKwkJCQkJCSAgICAgIGNoYXIgKiwgaW50LCBpbnQsCisJCQkJCQkgICAgICBpbnQsIGludCwgaW50LAorCQkJCQkJICAgICAgaW50LCBpbnQsIGludCwgaW50LAorCQkJCQkJICAgICAgaW50LCBhc2VjdGlvbiAqKSk7CitzdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqdXBkYXRlX3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAorCQkJCQkJICBjaGFyICosIGludCwgaW50LCBpbnQsCisJCQkJCQkgIGludCwgaW50LCBpbnQsIGludCwKKwkJCQkJCSAgaW50LCBpbnQsIGludCwKKwkJCQkJCSAgYXNlY3Rpb24gKikpOworc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqaXNfZGVmaW5lZF9zcGFjZSBQQVJBTVMgKChjaGFyICopKTsKK3N0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3N1YnNwYWNlIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqcGFfc2VnbWVudF90b19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7CitzdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqLAorCQkJCQkJCSAgICBzdWJzZWdUKSk7CitzdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9maW5kX3NwYWNlX2J5X251bWJlciBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3Vic3BhY2Vfc3RhcnQgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosIGludCkpOworc3RhdGljIHZvaWQgcGFfaXAgUEFSQU1TICgoY2hhciAqKSk7CitzdGF0aWMgdm9pZCBmaXhfbmV3X2hwcGEgUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIHN5bWJvbFMgKiwKKwkJCQkgIGxvbmcsIGV4cHJlc3Npb25TICosIGludCwKKwkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKKwkJCQkgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKKwkJCQkgIGludCwgbG9uZywgaW50ICopKTsKK3N0YXRpYyBpbnQgaXNfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjaGFyICopKTsKK3N0YXRpYyBpbnQgcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIFBBUkFNUyAoKGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgaXNfc2FtZV9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGZyYWdTICopKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZXhpdCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9wYXJzZV9zcGFjZV9zdG10IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgaW50IHBhX25leHRfc3Vic2VnIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBhX3N0cmluZ2VyX2F1eCBQQVJBTVMgKChjaGFyICopKTsKK3N0YXRpYyB2b2lkIHBhX3NwYWNlc19iZWdpbiBQQVJBTVMgKCh2b2lkKSk7CisKKyNpZmRlZiBPQkpfRUxGCitzdGF0aWMgdm9pZCBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UgUEFSQU1TICgoc3RydWN0IGNhbGxfaW5mbyAqKSk7CisjZW5kaWYKKworLyogRmlsZSBhbmQgZ2xvYWxseSBzY29wZWQgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAgKi8KKworLyogUm9vdCBhbmQgZmluYWwgZW50cnkgaW4gdGhlIHNwYWNlIGNoYWluLiAgKi8KK3N0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2RpY3Rfcm9vdDsKK3N0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2RpY3RfbGFzdDsKKworLyogVGhlIGN1cnJlbnQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KK3N0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKmN1cnJlbnRfc3BhY2U7CitzdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqY3VycmVudF9zdWJzcGFjZTsKKworLyogUm9vdCBvZiB0aGUgY2FsbF9pbmZvIGNoYWluLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm9fcm9vdDsKKworLyogVGhlIGxhc3QgY2FsbF9pbmZvIChmb3IgZnVuY3Rpb25zKSBzdHJ1Y3R1cmUKKyAgIHNlZW4gc28gaXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBmaXh1cHMgYW5kCisgICBmdW5jdGlvbiBsYWJlbHMuICAqLworc3RhdGljIHN0cnVjdCBjYWxsX2luZm8gKmxhc3RfY2FsbF9pbmZvOworCisvKiBUaGUgbGFzdCBjYWxsIGRlc2NyaXB0aW9uIChmb3IgYWN0dWFsIGNhbGxzKS4gICovCitzdGF0aWMgc3RydWN0IGNhbGxfZGVzYyBsYXN0X2NhbGxfZGVzYzsKKworLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOworCisvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKKyAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKKworLyogVGFibGUgb2YgcHNldWRvIG9wcyBmb3IgdGhlIFBBLiAgRklYTUUgLS0gaG93IG1hbnkgb2YgdGhlc2UKKyAgIGFyZSBub3cgcmVkdW5kYW50IHdpdGggdGhlIG92ZXJhbGwgR0FTIGFuZCB0aGUgb2JqZWN0IGZpbGUKKyAgIGRlcGVuZGVudCB0YWJsZXM/ICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgLyogYWxpZ24gcHNldWRvLW9wcyBvbiB0aGUgUEEgc3BlY2lmeSB0aGUgYWN0dWFsIGFsaWdubWVudCByZXF1ZXN0ZWQsCisgICAgIG5vdCB0aGUgbG9nMiBvZiB0aGUgcmVxdWVzdGVkIGFsaWdubWVudC4gICovCisgIHsiYWxpZ24iLCBwYV9hbGlnbiwgOH0sCisgIHsiYmVnaW5fYnJ0YWIiLCBwYV9icnRhYiwgMX0sCisgIHsiYmVnaW5fdHJ5IiwgcGFfdHJ5LCAxfSwKKyAgeyJibG9jayIsIHBhX2Jsb2NrLCAxfSwKKyAgeyJibG9ja3oiLCBwYV9ibG9jaywgMH0sCisgIHsiYnl0ZSIsIHBhX2NvbnMsIDF9LAorICB7ImNhbGwiLCBwYV9jYWxsLCAwfSwKKyAgeyJjYWxsaW5mbyIsIHBhX2NhbGxpbmZvLCAwfSwKKyAgeyJjb2RlIiwgcGFfY29kZSwgMH0sCisgIHsiY29tbSIsIHBhX2NvbW0sIDB9LAorI2lmZGVmIE9CSl9TT00KKyAgeyJjb21waWxlciIsIHBhX2NvbXBpbGVyLCAwfSwKKyNlbmRpZgorICB7ImNvcHlyaWdodCIsIHBhX2NvcHlyaWdodCwgMH0sCisgIHsiZGF0YSIsIHBhX2RhdGEsIDB9LAorICB7ImRvdWJsZSIsIHBhX2Zsb2F0X2NvbnMsICdkJ30sCisgIHsiZW5kIiwgcGFfZW5kLCAwfSwKKyAgeyJlbmRfYnJ0YWIiLCBwYV9icnRhYiwgMH0sCisgIHsiZW5kX3RyeSIsIHBhX3RyeSwgMH0sCisgIHsiZW50ZXIiLCBwYV9lbnRlciwgMH0sCisgIHsiZW50cnkiLCBwYV9lbnRyeSwgMH0sCisgIHsiZXF1IiwgcGFfZXF1LCAwfSwKKyAgeyJleGl0IiwgcGFfZXhpdCwgMH0sCisgIHsiZXhwb3J0IiwgcGFfZXhwb3J0LCAwfSwKKyAgeyJmaWxsIiwgcGFfZmlsbCwgMH0sCisgIHsiZmxvYXQiLCBwYV9mbG9hdF9jb25zLCAnZid9LAorICB7ImhhbGYiLCBwYV9jb25zLCAyfSwKKyAgeyJpbXBvcnQiLCBwYV9pbXBvcnQsIDB9LAorICB7ImludCIsIHBhX2NvbnMsIDR9LAorICB7ImxhYmVsIiwgcGFfbGFiZWwsIDB9LAorICB7Imxjb21tIiwgcGFfbGNvbW0sIDB9LAorICB7ImxlYXZlIiwgcGFfbGVhdmUsIDB9LAorICB7ImxldmVsIiwgcGFfbGV2ZWwsIDB9LAorICB7ImxvbmciLCBwYV9jb25zLCA0fSwKKyAgeyJsc3ltIiwgcGFfbHN5bSwgMH0sCisgIHsibnN1YnNwYSIsIHBhX3N1YnNwYWNlLCAxfSwKKyAgeyJvY3RhIiwgcGFfY29ucywgMTZ9LAorICB7Im9yZyIsIHBhX29yaWdpbiwgMH0sCisgIHsib3JpZ2luIiwgcGFfb3JpZ2luLCAwfSwKKyAgeyJwYXJhbSIsIHBhX3BhcmFtLCAwfSwKKyAgeyJwcm9jIiwgcGFfcHJvYywgMH0sCisgIHsicHJvY2VuZCIsIHBhX3Byb2NlbmQsIDB9LAorICB7InF1YWQiLCBwYV9jb25zLCA4fSwKKyAgeyJyZWciLCBwYV9lcXUsIDF9LAorICB7InNob3J0IiwgcGFfY29ucywgMn0sCisgIHsic2luZ2xlIiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKKyAgeyJzcGFjZSIsIHBhX3NwYWNlLCAwfSwKKyAgeyJzcG51bSIsIHBhX3NwbnVtLCAwfSwKKyAgeyJzdHJpbmciLCBwYV9zdHJpbmdlciwgMH0sCisgIHsic3RyaW5neiIsIHBhX3N0cmluZ2VyLCAxfSwKKyAgeyJzdWJzcGEiLCBwYV9zdWJzcGFjZSwgMH0sCisgIHsidGV4dCIsIHBhX3RleHQsIDB9LAorICB7InZlcnNpb24iLCBwYV92ZXJzaW9uLCAwfSwKKyAgeyJ3b3JkIiwgcGFfY29ucywgNH0sCisgIHtOVUxMLCAwLCAwfQorfTsKKworLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKKyAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4KKworICAgTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCisgICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4KKworICAgQWxzbyBub3RlIHRoYXQgQyBzdHlsZSBjb21tZW50cyB3aWxsIGFsd2F5cyB3b3JrLiAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcmFjdGVycyB3aGljaCBhY3QgYXMgbGluZSBzZXBhcmF0b3JzLiAgKi8KK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIhIjsKKworLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMuICAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LgorICAgQXMgaW4gMGYxMi40NTYgb3IgMGQxLjIzNDVlMTIuCisKKyAgIEJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCisgICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhZSB0byBrbm93IGFib3UgaXQgYXQKKyAgIGFsbCwgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOworCitzdGF0aWMgc3RydWN0IHBhX2l0IHRoZV9pbnNuOworCisvKiBQb2ludHMgdG8gdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIGp1c3QgcGFyc2VkIGJ5IGdldF9leHByZXNzb2luCisgICBhbmQgZnJpZW5kcy4gIEZJWE1FLiAgVGhpcyBzaG91bGRuJ3QgYmUgaGFuZGxlZCB3aXRoIGEgZmlsZS1nbG9iYWwKKyAgIHZhcmlhYmxlLiAgKi8KK3N0YXRpYyBjaGFyICpleHByX2VuZDsKKworLyogTm9uemVybyBpZiBhIC5jYWxsaW5mbyBhcHBlYXJlZCB3aXRoaW4gdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KK3N0YXRpYyBpbnQgY2FsbGluZm9fZm91bmQ7CisKKy8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgLmVudHJ5Ly5leGl0IHBhaXIuICAqLworc3RhdGljIGludCB3aXRoaW5fZW50cnlfZXhpdDsKKworLyogTm9uemVybyBpZiB0aGUgYXNzZW1ibGVyIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gICovCitzdGF0aWMgaW50IHdpdGhpbl9wcm9jZWR1cmU7CisKKy8qIEhhbmRsZSBvbiBzdHJ1Y3V0cmUgd2hpY2gga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzeW1ib2wKKyAgIHNlZW4gaW4gZWFjaCBzdWJzcGFjZS4gICovCitzdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sc19yb290cCA9IE5VTEw7CisKKy8qIEhvbGRzIHRoZSBsYXN0IGZpZWxkIHNlbGVjdG9yLiAgKi8KK3N0YXRpYyBpbnQgaHBwYV9maWVsZF9zZWxlY3RvcjsKKworCisvKiBBIGR1bW15IGJmZCBzeW1ib2wgc28gdGhhdCBhbGwgcmVsb2NhdGlvbnMgaGF2ZSBzeW1ib2xzIG9mIHNvbWUga2luZC4gICovCitzdGF0aWMgc3ltYm9sUyAqZHVtbXlfc3ltYm9sOworCisvKiBOb256ZXJvIGlmIGVycm9ycyBhcmUgdG8gYmUgcHJpbnRlZC4gICovCitzdGF0aWMgaW50IHByaW50X2Vycm9ycyA9IDE7CisKKy8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHByZS1kZWZpbmVkOgorCisgICBFYWNoIGdlbmVyYWwgcmVnaXN0ZXIgaGFzIG9uZSBwcmVkZWZpbmVkIG5hbWUgb2YgdGhlIGZvcm0KKyAgICVyPFJFR05VTT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8UkVHTlVNPi4KKworICAgU3BhY2UgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBoYW5kbGVkIGluIGEgc2ltaWxhciBtYW5uZXIsCisgICBidXQgdXNlICVzcjxSRUdOVU0+IGFuZCAlY3I8UkVHTlVNPiBhcyB0aGVpciBwcmVkZWZpbmVkIG5hbWVzLgorCisgICBMaWtld2lzZSBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgYnV0IG9mIHRoZSBmb3JtCisgICAlZnI8UkVHTlVNPi4gIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBoYXZlIGFkZGl0aW9uYWwgcHJlZGVmaW5lZAorICAgbmFtZXMgd2l0aCAnTCcgYW5kICdSJyBzdWZmaXhlcyAoZS5nLiAlZnIxOUwsICVmcjE5Uikgd2hpY2gKKyAgIGFnYWluIGhhdmUgdGhlIHZhbHVlIDxSRUdOVU0+LgorCisgICBNYW55IHJlZ2lzdGVycyBhbHNvIGhhdmUgc3lub255bXM6CisKKyAgICVyMjYgLSAlcjIzIGhhdmUgJWFyZzAgLSAlYXJnMyBhcyBzeW5vbnltcworICAgJXIyOCAtICVyMjkgaGF2ZSAlcmV0MCAtICVyZXQxIGFzIHN5bm9ueW1zCisgICAlcjMwIGhhcyAlc3AgYXMgYSBzeW5vbnltCisgICAlcjI3IGhhcyAlZHAgYXMgYSBzeW5vbnltCisgICAlcjIgIGhhcyAlcnAgYXMgYSBzeW5vbnltCisKKyAgIEFsbW9zdCBldmVyeSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIHN5bm9ueW07IHRoZXkgYXJlIG5vdCBsaXN0ZWQKKyAgIGhlcmUgZm9yIGJyZXZpdHkuCisKKyAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Cit7CisgIHsiJWFyZzAiLCAyNn0sCisgIHsiJWFyZzEiLCAyNX0sCisgIHsiJWFyZzIiLCAyNH0sCisgIHsiJWFyZzMiLCAyM30sCisgIHsiJWNyMCIsIDB9LAorICB7IiVjcjEwIiwgMTB9LAorICB7IiVjcjExIiwgMTF9LAorICB7IiVjcjEyIiwgMTJ9LAorICB7IiVjcjEzIiwgMTN9LAorICB7IiVjcjE0IiwgMTR9LAorICB7IiVjcjE1IiwgMTV9LAorICB7IiVjcjE2IiwgMTZ9LAorICB7IiVjcjE3IiwgMTd9LAorICB7IiVjcjE4IiwgMTh9LAorICB7IiVjcjE5IiwgMTl9LAorICB7IiVjcjIwIiwgMjB9LAorICB7IiVjcjIxIiwgMjF9LAorICB7IiVjcjIyIiwgMjJ9LAorICB7IiVjcjIzIiwgMjN9LAorICB7IiVjcjI0IiwgMjR9LAorICB7IiVjcjI1IiwgMjV9LAorICB7IiVjcjI2IiwgMjZ9LAorICB7IiVjcjI3IiwgMjd9LAorICB7IiVjcjI4IiwgMjh9LAorICB7IiVjcjI5IiwgMjl9LAorICB7IiVjcjMwIiwgMzB9LAorICB7IiVjcjMxIiwgMzF9LAorICB7IiVjcjgiLCA4fSwKKyAgeyIlY3I5IiwgOX0sCisgIHsiJWRwIiwgMjd9LAorICB7IiVlaWVtIiwgMTV9LAorICB7IiVlaXJyIiwgMjN9LAorICB7IiVmcjAiLCAwfSwKKyAgeyIlZnIwbCIsIDB9LAorICB7IiVmcjByIiwgMH0sCisgIHsiJWZyMSIsIDF9LAorICB7IiVmcjEwIiwgMTB9LAorICB7IiVmcjEwbCIsIDEwfSwKKyAgeyIlZnIxMHIiLCAxMH0sCisgIHsiJWZyMTEiLCAxMX0sCisgIHsiJWZyMTFsIiwgMTF9LAorICB7IiVmcjExciIsIDExfSwKKyAgeyIlZnIxMiIsIDEyfSwKKyAgeyIlZnIxMmwiLCAxMn0sCisgIHsiJWZyMTJyIiwgMTJ9LAorICB7IiVmcjEzIiwgMTN9LAorICB7IiVmcjEzbCIsIDEzfSwKKyAgeyIlZnIxM3IiLCAxM30sCisgIHsiJWZyMTQiLCAxNH0sCisgIHsiJWZyMTRsIiwgMTR9LAorICB7IiVmcjE0ciIsIDE0fSwKKyAgeyIlZnIxNSIsIDE1fSwKKyAgeyIlZnIxNWwiLCAxNX0sCisgIHsiJWZyMTVyIiwgMTV9LAorICB7IiVmcjE2IiwgMTZ9LAorICB7IiVmcjE2bCIsIDE2fSwKKyAgeyIlZnIxNnIiLCAxNn0sCisgIHsiJWZyMTciLCAxN30sCisgIHsiJWZyMTdsIiwgMTd9LAorICB7IiVmcjE3ciIsIDE3fSwKKyAgeyIlZnIxOCIsIDE4fSwKKyAgeyIlZnIxOGwiLCAxOH0sCisgIHsiJWZyMThyIiwgMTh9LAorICB7IiVmcjE5IiwgMTl9LAorICB7IiVmcjE5bCIsIDE5fSwKKyAgeyIlZnIxOXIiLCAxOX0sCisgIHsiJWZyMWwiLCAxfSwKKyAgeyIlZnIxciIsIDF9LAorICB7IiVmcjIiLCAyfSwKKyAgeyIlZnIyMCIsIDIwfSwKKyAgeyIlZnIyMGwiLCAyMH0sCisgIHsiJWZyMjByIiwgMjB9LAorICB7IiVmcjIxIiwgMjF9LAorICB7IiVmcjIxbCIsIDIxfSwKKyAgeyIlZnIyMXIiLCAyMX0sCisgIHsiJWZyMjIiLCAyMn0sCisgIHsiJWZyMjJsIiwgMjJ9LAorICB7IiVmcjIyciIsIDIyfSwKKyAgeyIlZnIyMyIsIDIzfSwKKyAgeyIlZnIyM2wiLCAyM30sCisgIHsiJWZyMjNyIiwgMjN9LAorICB7IiVmcjI0IiwgMjR9LAorICB7IiVmcjI0bCIsIDI0fSwKKyAgeyIlZnIyNHIiLCAyNH0sCisgIHsiJWZyMjUiLCAyNX0sCisgIHsiJWZyMjVsIiwgMjV9LAorICB7IiVmcjI1ciIsIDI1fSwKKyAgeyIlZnIyNiIsIDI2fSwKKyAgeyIlZnIyNmwiLCAyNn0sCisgIHsiJWZyMjZyIiwgMjZ9LAorICB7IiVmcjI3IiwgMjd9LAorICB7IiVmcjI3bCIsIDI3fSwKKyAgeyIlZnIyN3IiLCAyN30sCisgIHsiJWZyMjgiLCAyOH0sCisgIHsiJWZyMjhsIiwgMjh9LAorICB7IiVmcjI4ciIsIDI4fSwKKyAgeyIlZnIyOSIsIDI5fSwKKyAgeyIlZnIyOWwiLCAyOX0sCisgIHsiJWZyMjlyIiwgMjl9LAorICB7IiVmcjJsIiwgMn0sCisgIHsiJWZyMnIiLCAyfSwKKyAgeyIlZnIzIiwgM30sCisgIHsiJWZyMzAiLCAzMH0sCisgIHsiJWZyMzBsIiwgMzB9LAorICB7IiVmcjMwciIsIDMwfSwKKyAgeyIlZnIzMSIsIDMxfSwKKyAgeyIlZnIzMWwiLCAzMX0sCisgIHsiJWZyMzFyIiwgMzF9LAorICB7IiVmcjNsIiwgM30sCisgIHsiJWZyM3IiLCAzfSwKKyAgeyIlZnI0IiwgNH0sCisgIHsiJWZyNGwiLCA0fSwKKyAgeyIlZnI0ciIsIDR9LAorICB7IiVmcjUiLCA1fSwKKyAgeyIlZnI1bCIsIDV9LAorICB7IiVmcjVyIiwgNX0sCisgIHsiJWZyNiIsIDZ9LAorICB7IiVmcjZsIiwgNn0sCisgIHsiJWZyNnIiLCA2fSwKKyAgeyIlZnI3IiwgN30sCisgIHsiJWZyN2wiLCA3fSwKKyAgeyIlZnI3ciIsIDd9LAorICB7IiVmcjgiLCA4fSwKKyAgeyIlZnI4bCIsIDh9LAorICB7IiVmcjhyIiwgOH0sCisgIHsiJWZyOSIsIDl9LAorICB7IiVmcjlsIiwgOX0sCisgIHsiJWZyOXIiLCA5fSwKKyAgeyIlaHRhIiwgMjV9LAorICB7IiVpaXIiLCAxOX0sCisgIHsiJWlvciIsIDIxfSwKKyAgeyIlaXBzdyIsIDIyfSwKKyAgeyIlaXNyIiwgMjB9LAorICB7IiVpdG1yIiwgMTZ9LAorICB7IiVpdmEiLCAxNH0sCisgIHsiJXBjb3EiLCAxOH0sCisgIHsiJXBjc3EiLCAxN30sCisgIHsiJXBpZHIxIiwgOH0sCisgIHsiJXBpZHIyIiwgOX0sCisgIHsiJXBpZHIzIiwgMTJ9LAorICB7IiVwaWRyNCIsIDEzfSwKKyAgeyIlcHBkYSIsIDI0fSwKKyAgeyIlcjAiLCAwfSwKKyAgeyIlcjEiLCAxfSwKKyAgeyIlcjEwIiwgMTB9LAorICB7IiVyMTEiLCAxMX0sCisgIHsiJXIxMiIsIDEyfSwKKyAgeyIlcjEzIiwgMTN9LAorICB7IiVyMTQiLCAxNH0sCisgIHsiJXIxNSIsIDE1fSwKKyAgeyIlcjE2IiwgMTZ9LAorICB7IiVyMTciLCAxN30sCisgIHsiJXIxOCIsIDE4fSwKKyAgeyIlcjE5IiwgMTl9LAorICB7IiVyMiIsIDJ9LAorICB7IiVyMjAiLCAyMH0sCisgIHsiJXIyMSIsIDIxfSwKKyAgeyIlcjIyIiwgMjJ9LAorICB7IiVyMjMiLCAyM30sCisgIHsiJXIyNCIsIDI0fSwKKyAgeyIlcjI1IiwgMjV9LAorICB7IiVyMjYiLCAyNn0sCisgIHsiJXIyNyIsIDI3fSwKKyAgeyIlcjI4IiwgMjh9LAorICB7IiVyMjkiLCAyOX0sCisgIHsiJXIzIiwgM30sCisgIHsiJXIzMCIsIDMwfSwKKyAgeyIlcjMxIiwgMzF9LAorICB7IiVyNCIsIDR9LAorICB7IiVyNSIsIDV9LAorICB7IiVyNiIsIDZ9LAorICB7IiVyNyIsIDd9LAorICB7IiVyOCIsIDh9LAorICB7IiVyOSIsIDl9LAorICB7IiVyY3RyIiwgMH0sCisgIHsiJXJldDAiLCAyOH0sCisgIHsiJXJldDEiLCAyOX0sCisgIHsiJXJwIiwgMn0sCisgIHsiJXNhciIsIDExfSwKKyAgeyIlc3AiLCAzMH0sCisgIHsiJXNyMCIsIDB9LAorICB7IiVzcjEiLCAxfSwKKyAgeyIlc3IyIiwgMn0sCisgIHsiJXNyMyIsIDN9LAorICB7IiVzcjQiLCA0fSwKKyAgeyIlc3I1IiwgNX0sCisgIHsiJXNyNiIsIDZ9LAorICB7IiVzcjciLCA3fSwKKyAgeyIldHIwIiwgMjR9LAorICB7IiV0cjEiLCAyNX0sCisgIHsiJXRyMiIsIDI2fSwKKyAgeyIldHIzIiwgMjd9LAorICB7IiV0cjQiLCAyOH0sCisgIHsiJXRyNSIsIDI5fSwKKyAgeyIldHI2IiwgMzB9LAorICB7IiV0cjciLCAzMX0KK307CisKKy8qIFRoaXMgdGFibGUgaXMgc29ydGVkIGJ5IG9yZGVyIG9mIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4gVGhpcyBpcworICAgc28gd2UgY2hlY2sgZm9yIDw+IGJlZm9yZSB3ZSBjaGVjayBmb3IgPC4gSWYgd2UgaGFkIGEgPD4gYW5kIGNoZWNrZWQKKyAgIGZvciA8IGZpcnN0LCB3ZSB3b3VsZCBnZXQgYSBmYWxzZSBtYXRjaC4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZwX2NvbmRfbWFwIGZwX2NvbmRfbWFwW10gPQoreworICB7ImZhbHNlPyIsIDB9LAorICB7ImZhbHNlIiwgMX0sCisgIHsidHJ1ZT8iLCAzMH0sCisgIHsidHJ1ZSIsIDMxfSwKKyAgeyIhPD0+IiwgM30sCisgIHsiIT8+PSIsIDh9LAorICB7IiE/PD0iLCAxNn0sCisgIHsiITw+IiwgN30sCisgIHsiIT49IiwgMTF9LAorICB7IiE/PiIsIDEyfSwKKyAgeyI/PD0iLCAxNH0sCisgIHsiITw9IiwgMTl9LAorICB7IiE/PCIsIDIwfSwKKyAgeyI/Pj0iLCAyMn0sCisgIHsiIT89IiwgMjR9LAorICB7IiE9dCIsIDI3fSwKKyAgeyI8PT4iLCAyOX0sCisgIHsiPXQiLCA1fSwKKyAgeyI/PSIsIDZ9LAorICB7Ij88IiwgMTB9LAorICB7Ijw9IiwgMTN9LAorICB7IiE+IiwgMTV9LAorICB7Ij8+IiwgMTh9LAorICB7Ij49IiwgMjF9LAorICB7IiE8IiwgMjN9LAorICB7Ijw+IiwgMjV9LAorICB7IiE9IiwgMjZ9LAorICB7IiE/IiwgMjh9LAorICB7Ij8iLCAyfSwKKyAgeyI9IiwgNH0sCisgIHsiPCIsIDl9LAorICB7Ij4iLCAxN30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VsZWN0b3JfZW50cnkgc2VsZWN0b3JfdGFibGVbXSA9Cit7CisgIHsiZiIsIGVfZnNlbH0sCisgIHsibCIsIGVfbHNlbH0sCisgIHsibGQiLCBlX2xkc2VsfSwKKyAgeyJscCIsIGVfbHBzZWx9LAorICB7ImxyIiwgZV9scnNlbH0sCisgIHsibHMiLCBlX2xzc2VsfSwKKyAgeyJsdCIsIGVfbHRzZWx9LAorICB7Im4iLCBlX25zZWx9LAorICB7Im5sIiwgZV9ubHNlbH0sCisgIHsibmxyIiwgZV9ubHJzZWx9LAorICB7InAiLCBlX3BzZWx9LAorICB7InIiLCBlX3JzZWx9LAorICB7InJkIiwgZV9yZHNlbH0sCisgIHsicnAiLCBlX3Jwc2VsfSwKKyAgeyJyciIsIGVfcnJzZWx9LAorICB7InJzIiwgZV9yc3NlbH0sCisgIHsicnQiLCBlX3J0c2VsfSwKKyAgeyJ0IiwgZV90c2VsfSwKK307CisKKy8qIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcyAqLworCisjZGVmaW5lIEdEQl9TWU1CT0xTICAgICAgICAgIEdEQl9TWU1CT0xTX1NVQlNQQUNFX05BTUUKKyNkZWZpbmUgR0RCX1NUUklOR1MgICAgICAgICAgR0RCX1NUUklOR1NfU1VCU1BBQ0VfTkFNRQorCisvKiBwcmUtZGVmaW5lZCBzdWJzZWdtZW50cyAoc3Vic3BhY2VzKSBmb3IgdGhlIEhQUEEuICAqLworI2RlZmluZSBTVUJTRUdfQ09ERSAgIDAKKyNkZWZpbmUgU1VCU0VHX0xJVCAgICAxCisjZGVmaW5lIFNVQlNFR19NSUxMSSAgMgorI2RlZmluZSBTVUJTRUdfREFUQSAgIDAKKyNkZWZpbmUgU1VCU0VHX0JTUyAgICAyCisjZGVmaW5lIFNVQlNFR19VTldJTkQgMworI2RlZmluZSBTVUJTRUdfR0RCX1NUUklOR1MgMAorI2RlZmluZSBTVUJTRUdfR0RCX1NZTUJPTFMgMQorCitzdGF0aWMgc3RydWN0IGRlZmF1bHRfc3Vic3BhY2VfZGljdCBwYV9kZWZfc3Vic3BhY2VzW10gPQoreworICB7IiRDT0RFJCIsIDEsIDEsIDEsIDAsIDAsIDAsIDI0LCAweDJjLCAwLCA4LCAwLCAwLCAiLnRleHQiLCBTVUJTRUdfQ09ERX0sCisgIHsiJERBVEEkIiwgMSwgMSwgMCwgMCwgMCwgMCwgMjQsIDB4MWYsIDEsIDgsIDEsIDEsICIuZGF0YSIsIFNVQlNFR19EQVRBfSwKKyAgeyIkTElUJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDE2LCAweDJjLCAwLCA4LCAwLCAwLCAiLnRleHQiLCBTVUJTRUdfTElUfSwKKyAgeyIkTUlMTElDT0RFJCIsIDEsIDEsIDAsIDAsIDAsIDAsIDgsIDB4MmMsIDAsIDgsIDAsIDAsICIudGV4dCIsIFNVQlNFR19NSUxMSX0sCisgIHsiJEJTUyQiLCAxLCAxLCAwLCAwLCAwLCAxLCA4MCwgMHgxZiwgMSwgOCwgMSwgMSwgIi5ic3MiLCBTVUJTRUdfQlNTfSwKKyNpZmRlZiBPQkpfRUxGCisgIHsiJFVOV0lORCQiLCAxLCAxLCAwLCAwLCAwLCAwLCA2NCwgMHgyYywgMCwgNCwgMCwgMCwgIi5QQVJJU0MudW53aW5kIiwgU1VCU0VHX1VOV0lORH0sCisjZW5kaWYKKyAge05VTEwsIDAsIDEsIDAsIDAsIDAsIDAsIDI1NSwgMHgxZiwgMCwgNCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVmYXVsdF9zcGFjZV9kaWN0IHBhX2RlZl9zcGFjZXNbXSA9Cit7CisgIHsiJFRFWFQkIiwgMCwgMSwgMSwgMCwgOCwgQVNFQ19OVUxMLCAiLnRleHQifSwKKyAgeyIkUFJJVkFURSQiLCAxLCAxLCAxLCAxLCAxNiwgQVNFQ19OVUxMLCAiLmRhdGEifSwKKyAge05VTEwsIDAsIDAsIDAsIDAsIDAsIEFTRUNfTlVMTCwgTlVMTH0KK307CisKKy8qIE1pc2MgbG9jYWwgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KKworLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFMgcG90ZW50aWFsbHkgcmVwcmVzZW50cworICAgYSByaWdodCBvciBsZWZ0IGhhbGYgb2YgYSBGUCByZWdpc3RlciAgKi8KKyNkZWZpbmUgSVNfUl9TRUxFQ1QoUykgICAoKihTKSA9PSAnUicgfHwgKihTKSA9PSAncicpCisjZGVmaW5lIElTX0xfU0VMRUNUKFMpICAgKCooUykgPT0gJ0wnIHx8ICooUykgPT0gJ2wnKQorCisvKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gbWFpbnRhaW4gc3BhY2VzL3N1YnNwYWNlcy4gICovCisjZGVmaW5lIFNQQUNFX0RFRklORUQoc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX2RlZmluZWQKKyNkZWZpbmUgU1BBQ0VfVVNFUl9ERUZJTkVEKHNwYWNlX2NoYWluKSAoc3BhY2VfY2hhaW4pLT5zZF91c2VyX2RlZmluZWQKKyNkZWZpbmUgU1BBQ0VfU1BOVU0oc3BhY2VfY2hhaW4pCShzcGFjZV9jaGFpbiktPnNkX3NwbnVtCisjZGVmaW5lIFNQQUNFX05BTUUoc3BhY2VfY2hhaW4pCQkoc3BhY2VfY2hhaW4pLT5zZF9uYW1lCisKKyNkZWZpbmUgU1VCU1BBQ0VfREVGSU5FRChzc19jaGFpbikJKHNzX2NoYWluKS0+c3NkX2RlZmluZWQKKyNkZWZpbmUgU1VCU1BBQ0VfTkFNRShzc19jaGFpbikJCShzc19jaGFpbiktPnNzZF9uYW1lCisKKy8qIEluc2VydCBGSUVMRCBpbnRvIE9QQ09ERSBzdGFydGluZyBhdCBiaXQgU1RBUlQuICBDb250aW51ZSBwYV9pcAorICAgbWFpbiBsb29wIGFmdGVyIGluc2VydGlvbi4gICovCisKKyNkZWZpbmUgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRShPUENPREUsIEZJRUxELCBTVEFSVCkgXAorICB7IFwKKyAgICAoKE9QQ09ERSkgfD0gKEZJRUxEKSA8PCAoU1RBUlQpKTsgXAorICAgIGNvbnRpbnVlOyBcCisgIH0KKworLyogU2ltcGxlIHJhbmdlIGNoZWNraW5nIGZvciBGSUVMRCBhZ2FpbnQgSElHSCBhbmQgTE9XIGJvdW5kcy4KKyAgIElHTk9SRSBpcyB1c2VkIHRvIHN1cHByZXNzIHRoZSBlcnJvciBtZXNzYWdlLiAgKi8KKworI2RlZmluZSBDSEVDS19GSUVMRChGSUVMRCwgSElHSCwgTE9XLCBJR05PUkUpIFwKKyAgeyBcCisgICAgaWYgKChGSUVMRCkgPiAoSElHSCkgfHwgKEZJRUxEKSA8IChMT1cpKSBcCisgICAgICB7IFwKKwlpZiAoISBJR05PUkUpIFwKKyAgICAgICAgICBhc19iYWQgKF8oIkZpZWxkIG91dCBvZiByYW5nZSBbJWQuLiVkXSAoJWQpLiIpLCAoTE9XKSwgKEhJR0gpLCBcCisJCSAgKGludCkgKEZJRUxEKSk7XAorICAgICAgICBicmVhazsgXAorICAgICAgfSBcCisgIH0KKworI2RlZmluZSBpc19EUF9yZWxhdGl2ZShleHApCQkJXAorICAoKGV4cCkuWF9vcCA9PSBPX3N1YnRyYWN0CQkJXAorICAgJiYgc3RyY21wKChleHApLlhfb3Bfc3ltYm9sLT5ic3ltLT5uYW1lLCAiJGdsb2JhbCQiKSA9PSAwKQorCisjZGVmaW5lIGlzX1BDX3JlbGF0aXZlKGV4cCkJCQlcCisgICgoZXhwKS5YX29wID09IE9fc3VidHJhY3QJCQlcCisgICAmJiBzdHJjbXAoKGV4cCkuWF9vcF9zeW1ib2wtPmJzeW0tPm5hbWUsICIkUElDX3BjcmVsJDAiKSA9PSAwKQorCisvKiBXZSBuZWVkIHNvbWUgY29tcGxleCBoYW5kbGluZyBmb3Igc3RhYnMgKHN5bTEgLSBzeW0yKS4gIEx1Y2tpbHksIHdlJ2xsCisgICBhbHdheXMgYmUgYWJsZSB0byByZWR1Y2UgdGhlIGV4cHJlc3Npb24gdG8gYSBjb25zdGFudCwgc28gd2UgZG9uJ3QKKyAgIG5lZWQgcmVhbCBjb21wbGV4IGhhbmRsaW5nIHlldC4gICovCisjZGVmaW5lIGlzX2NvbXBsZXgoZXhwKQkJCQlcCisgICgoZXhwKS5YX29wICE9IE9fY29uc3RhbnQgJiYgKGV4cCkuWF9vcCAhPSBPX3N5bWJvbCkKKworLyogQWN0dWFsIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgdGhlIFBBIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBhc3NlbWJsZXIuICAqLworCisvKiBDYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgTWFrZSBzdXJlIGVudHJ5L2V4aXQgYW5kCisgICBwcm9jL3Byb2NlbmQgcGFpcnMgbWF0Y2guICAqLworCit2b2lkCitwYV9jaGVja19lb2YgKCkKK3sKKyAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQorICAgIGFzX2ZhdGFsIChfKCJNaXNzaW5nIC5leGl0XG4iKSk7CisKKyAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCisgICAgYXNfZmF0YWwgKF8oIk1pc3NpbmcgLnByb2NlbmRcbiIpKTsKK30KKworLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworCitzdGF0aWMgdm9pZAorcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCkKK3sKKyAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKKyAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3BhY2UuXG4iKSk7CisKKyAgaWYgKGN1cnJlbnRfc3Vic3BhY2UgPT0gTlVMTCkKKyAgICBhc19mYXRhbCAoXygiTm90IGluIGEgc3Vic3BhY2UuXG4iKSk7Cit9CisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYWJlbF9zeW1ib2xfc3RydWN0IGZvciB0aGUgY3VycmVudCBzcGFjZS4KKyAgIG9yIE5VTEwgaWYgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBleGlzdHMgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KKworc3RhdGljIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKgorcGFfZ2V0X2xhYmVsICgpCit7CisgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluOworICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluID0gY3VycmVudF9zcGFjZTsKKworICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKKyAgICAgICBsYWJlbF9jaGFpbjsKKyAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKKyAgICBpZiAoc3BhY2VfY2hhaW4gPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQorICAgICAgcmV0dXJuIGxhYmVsX2NoYWluOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBEZWZpbmVzIGEgbGFiZWwgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAgSWYgb25lIGlzIGFscmVhZHkgZGVmaW5lZCwKKyAgIHRoaXMgZnVuY3Rpb24gd2lsbCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBsYWJlbC4gICovCisKK3ZvaWQKK3BhX2RlZmluZV9sYWJlbCAoc3ltYm9sKQorICAgICBzeW1ib2xTICpzeW1ib2w7Cit7CisgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluID0gcGFfZ2V0X2xhYmVsICgpOworICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluID0gY3VycmVudF9zcGFjZTsKKworICBpZiAobGFiZWxfY2hhaW4pCisgICAgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCA9IHN5bWJvbDsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSBhIG5ldyBsYWJlbCBlbnRyeSBhbmQgYWRkIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBjaGFpbi4gICovCisgICAgICBsYWJlbF9jaGFpbgorCT0gKGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChsYWJlbF9zeW1ib2xfc3RydWN0KSk7CisgICAgICBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsID0gc3ltYm9sOworICAgICAgbGFiZWxfY2hhaW4tPmxzc19zcGFjZSA9IHNwYWNlX2NoYWluOworICAgICAgbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gTlVMTDsKKworICAgICAgaWYgKGxhYmVsX3N5bWJvbHNfcm9vdHApCisJbGFiZWxfY2hhaW4tPmxzc19uZXh0ID0gbGFiZWxfc3ltYm9sc19yb290cDsKKworICAgICAgbGFiZWxfc3ltYm9sc19yb290cCA9IGxhYmVsX2NoYWluOworICAgIH0KK30KKworLyogUmVtb3ZlcyBhIGxhYmVsIGRlZmluaXRpb24gZm9yIHRoZSBjdXJyZW50IHNwYWNlLgorICAgSWYgdGhlcmUgaXMgbm8gbGFiZWxfc3ltYm9sX3N0cnVjdCBlbnRyeSwgdGhlbiBubyBhY3Rpb24gaXMgdGFrZW4uICAqLworCitzdGF0aWMgdm9pZAorcGFfdW5kZWZpbmVfbGFiZWwgKCkKK3sKKyAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfY2hhaW47CisgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKnByZXZfbGFiZWxfY2hhaW4gPSBOVUxMOworICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluID0gY3VycmVudF9zcGFjZTsKKworICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKKyAgICAgICBsYWJlbF9jaGFpbjsKKyAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKKyAgICB7CisgICAgICBpZiAoc3BhY2VfY2hhaW4gPT0gbGFiZWxfY2hhaW4tPmxzc19zcGFjZSAmJiBsYWJlbF9jaGFpbi0+bHNzX2xhYmVsKQorCXsKKwkgIC8qIFJlbW92ZSB0aGUgbGFiZWwgZnJvbSB0aGUgY2hhaW4gYW5kIGZyZWUgaXRzIG1lbW9yeS4gICovCisJICBpZiAocHJldl9sYWJlbF9jaGFpbikKKwkgICAgcHJldl9sYWJlbF9jaGFpbi0+bHNzX25leHQgPSBsYWJlbF9jaGFpbi0+bHNzX25leHQ7CisJICBlbHNlCisJICAgIGxhYmVsX3N5bWJvbHNfcm9vdHAgPSBsYWJlbF9jaGFpbi0+bHNzX25leHQ7CisKKwkgIGZyZWUgKGxhYmVsX2NoYWluKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHByZXZfbGFiZWxfY2hhaW4gPSBsYWJlbF9jaGFpbjsKKyAgICB9Cit9CisKKworLyogQW4gSFBQQS1zcGVjaWZpYyB2ZXJzaW9uIG9mIGZpeF9uZXcuICBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIEhQUEEKKyAgIGNvZGUgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBzb21lIGV4dHJhIHN0dWZmLiAgRWFjaCBjYWxsIHRvIGZpeF9uZXdfaHBwYQorICAgcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYW4gaW5zdGFuY2Ugb2YgYW4gaHBwYV9maXhfc3RydWN0LiAgQW4KKyAgIGhwcGFfZml4X3N0cnVjdCBzdG9yZXMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGFsb25nIHdpdGggYSBwb2ludGVyIHRvIHRoZQorICAgb3JpZ2luYWwgZml4Uy4gIFRoaXMgaXMgYXR0YWNoZWQgdG8gdGhlIG9yaWdpbmFsIGZpeHVwIHZpYSB0aGUKKyAgIHRjX2ZpeF9kYXRhIGZpZWxkLiAgKi8KKworc3RhdGljIHZvaWQKK2ZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgZXhwLCBwY3JlbCwKKwkgICAgICByX3R5cGUsIHJfZmllbGQsIHJfZm9ybWF0LCBhcmdfcmVsb2MsIHVud2luZF9iaXRzKQorICAgICBmcmFnUyAqZnJhZzsKKyAgICAgaW50IHdoZXJlOworICAgICBpbnQgc2l6ZTsKKyAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsKKyAgICAgbG9uZyBvZmZzZXQ7CisgICAgIGV4cHJlc3Npb25TICpleHA7CisgICAgIGludCBwY3JlbDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsKKyAgICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IHJfZmllbGQ7CisgICAgIGludCByX2Zvcm1hdDsKKyAgICAgbG9uZyBhcmdfcmVsb2M7CisgICAgIGludCogdW53aW5kX2JpdHM7Cit7CisgIGZpeFMgKm5ld19maXg7CisKKyAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXggPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKQorICBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCkpOworCisgIGlmIChleHAgIT0gTlVMTCkKKyAgICBuZXdfZml4ID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpOworICBlbHNlCisgICAgbmV3X2ZpeCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpOworICBuZXdfZml4LT50Y19maXhfZGF0YSA9ICh2b2lkICopIGhwcGFfZml4OworICBocHBhX2ZpeC0+Znhfcl90eXBlID0gcl90eXBlOworICBocHBhX2ZpeC0+Znhfcl9maWVsZCA9IHJfZmllbGQ7CisgIGhwcGFfZml4LT5meF9yX2Zvcm1hdCA9IHJfZm9ybWF0OworICBocHBhX2ZpeC0+ZnhfYXJnX3JlbG9jID0gYXJnX3JlbG9jOworICBocHBhX2ZpeC0+c2VnbWVudCA9IG5vd19zZWc7CisjaWZkZWYgT0JKX1NPTQorICBpZiAocl90eXBlID09IFJfRU5UUlkgfHwgcl90eXBlID09IFJfRVhJVCkKKyAgICBuZXdfZml4LT5meF9vZmZzZXQgPSAqdW53aW5kX2JpdHM7CisjZW5kaWYKKworICAvKiBmb28tJGdsb2JhbCQgaXMgdXNlZCB0byBhY2Nlc3Mgbm9uLWF1dG9tYXRpYyBzdG9yYWdlLiAgJGdsb2JhbCQKKyAgICAgaXMgcmVhbGx5IGp1c3QgYSBtYXJrZXIgYW5kIGhhcyBzZXJ2ZWQgaXRzIHB1cnBvc2UsIHNvIGVsaW1pbmF0ZQorICAgICBpdCBub3cgc28gYXMgbm90IHRvIGNvbmZ1c2Ugd3JpdGUuYy4gICovCisgIGlmIChuZXdfZml4LT5meF9zdWJzeQorICAgICAgJiYgIXN0cmNtcCAoU19HRVRfTkFNRSAobmV3X2ZpeC0+Znhfc3Vic3kpLCAiJGdsb2JhbCQiKSkKKyAgICBuZXdfZml4LT5meF9zdWJzeSA9IE5VTEw7Cit9CisKKy8qIFBhcnNlIGEgLmJ5dGUsIC53b3JkLCAubG9uZyBleHByZXNzaW9uIGZvciB0aGUgSFBQQS4gIENhbGxlZCBieQorICAgY29ucyB2aWEgdGhlIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiBtYWNyby4gICovCisKK3ZvaWQKK3BhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhIChleHApCisgICAgIGV4cHJlc3Npb25TICpleHA7Cit7CisgIGhwcGFfZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZpbnB1dF9saW5lX3BvaW50ZXIpOworICBleHByZXNzaW9uIChleHApOworfQorCisvKiBUaGlzIGZpeF9uZXcgaXMgY2FsbGVkIGJ5IGNvbnMgdmlhIFRDX0NPTlNfRklYX05FVy4KKyAgIGhwcGFfZmllbGRfc2VsZWN0b3IgaXMgc2V0IGJ5IHRoZSBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYS4gICovCisKK3ZvaWQKK2NvbnNfZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQorICAgICBmcmFnUyAqZnJhZzsKKyAgICAgaW50IHdoZXJlOworICAgICBpbnQgc2l6ZTsKKyAgICAgZXhwcmVzc2lvblMgKmV4cDsKK3sKKyAgdW5zaWduZWQgaW50IHJlbF90eXBlOworCisgIC8qIEdldCBhIGJhc2UgcmVsb2NhdGlvbiB0eXBlLiAgKi8KKyAgaWYgKGlzX0RQX3JlbGF0aXZlICgqZXhwKSkKKyAgICByZWxfdHlwZSA9IFJfSFBQQV9HT1RPRkY7CisgIGVsc2UgaWYgKGlzX2NvbXBsZXggKCpleHApKQorICAgIHJlbF90eXBlID0gUl9IUFBBX0NPTVBMRVg7CisgIGVsc2UKKyAgICByZWxfdHlwZSA9IFJfSFBQQTsKKworICBpZiAoaHBwYV9maWVsZF9zZWxlY3RvciAhPSBlX3BzZWwgJiYgaHBwYV9maWVsZF9zZWxlY3RvciAhPSBlX2ZzZWwpCisgICAgYXNfd2FybiAoXygiSW52YWxpZCBmaWVsZCBzZWxlY3Rvci4gIEFzc3VtaW5nIEYlJS4iKSk7CisKKyAgZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwKKwkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIDAsIGV4cCwgMCwgcmVsX3R5cGUsCisJCWhwcGFfZmllbGRfc2VsZWN0b3IsIDMyLCAwLCBOVUxMKTsKKworICAvKiBSZXNldCBmaWVsZCBzZWxlY3RvciB0byBpdHMgZGVmYXVsdCBzdGF0ZS4gICovCisgIGhwcGFfZmllbGRfc2VsZWN0b3IgPSAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCisgICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7CisgIGludCBsb3NlID0gMDsKKyAgdW5zaWduZWQgaW50IGkgPSAwOworCisgIGxhc3RfY2FsbF9pbmZvID0gTlVMTDsKKyAgY2FsbF9pbmZvX3Jvb3QgPSBOVUxMOworCisgIC8qIFNldCB0aGUgZGVmYXVsdCBtYWNoaW5lIHR5cGUuICAqLworICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKKyAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKKworICAvKiBGb2xkaW5nIG9mIHRleHQgYW5kIGRhdGEgc2VnbWVudHMgZmFpbHMgbWlzZXJhYmx5IG9uIHRoZSBQQS4KKyAgICAgV2FybiB1c2VyIGFuZCBkaXNhYmxlICItUiIgb3B0aW9uLiAgKi8KKyAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi1SIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0LiIpKTsKKyAgICAgIGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ID0gMDsKKyAgICB9CisKKyAgcGFfc3BhY2VzX2JlZ2luICgpOworCisgIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKKworICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMpCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHBhX29wY29kZXNbaV0ubmFtZTsKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoc3RydWN0IHBhX29wY29kZSAqKSAmcGFfb3Bjb2Rlc1tpXSk7CisgICAgICBpZiAocmV0dmFsICE9IE5VTEwgJiYgKnJldHZhbCAhPSAnXDAnKQorCXsKKwkgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksIG5hbWUsIHJldHZhbCk7CisJICBsb3NlID0gMTsKKwl9CisgICAgICBkbworCXsKKwkgIGlmICgocGFfb3Bjb2Rlc1tpXS5tYXRjaCAmIHBhX29wY29kZXNbaV0ubWFzaykKKwkgICAgICAhPSBwYV9vcGNvZGVzW2ldLm1hdGNoKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAorCQkgICAgICAgcGFfb3Bjb2Rlc1tpXS5uYW1lLCBwYV9vcGNvZGVzW2ldLmFyZ3MpOworCSAgICAgIGxvc2UgPSAxOworCSAgICB9CisJICArK2k7CisJfQorICAgICAgd2hpbGUgKGkgPCBOVU1PUENPREVTICYmICFzdHJjbXAgKHBhX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOworICAgIH0KKworICBpZiAobG9zZSkKKyAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7CisKKyAgLyogU09NIHdpbGwgY2hhbmdlIHRleHRfc2VjdGlvbi4gIFRvIG1ha2Ugc3VyZSB3ZSBuZXZlciBwdXQKKyAgICAgYW55dGhpbmcgaW50byB0aGUgb2xkIG9uZSBzd2l0Y2ggdG8gdGhlIG5ldyBvbmUgbm93LiAgKi8KKyAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKKworICBkdW1teV9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiTCRkdW1teSIpOworICBTX1NFVF9TRUdNRU5UIChkdW1teV9zeW1ib2wsIHRleHRfc2VjdGlvbik7Cit9CisKKy8qIEFzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uIHN0b3JpbmcgaXQgaW50byBhIGZyYWcuICAqLwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICp0bzsKKworICAvKiBUaGUgaGFkIGJldHRlciBiZSBzb21ldGhpbmcgdG8gYXNzZW1ibGUuICAqLworICBhc3NlcnQgKHN0cik7CisKKyAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKKyAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKKyAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KKworICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKKyAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCisgICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCisgIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKKyAgICB7CisgICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7CisKKyAgICAgIGlmIChsYWJlbF9zeW1ib2wpCisJeworCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQorCSAgICB7CisJICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOworCSAgICAgIGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisjaWZkZWYgT0JKX1NPTQorCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKKwkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCisJICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQorCQl7CisJCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOworCisJCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKKwkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKKwkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKKwkJCQkoaW50ICopJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvcik7CisJCX0KKyNlbmRpZgorCSAgICB9CisJICBlbHNlCisJICAgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIikpOworICAgIH0KKworICAvKiBBc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24uICBSZXN1bHRzIGFyZSBzYXZlZCBpbnRvICJ0aGVfaW5zbiIuICAqLworICBwYV9pcCAoc3RyKTsKKworICAvKiBHZXQgc29tZXdoZXJlIHRvIHB1dCB0aGUgYXNzZW1ibGVkIGluc3RydXRpb24uICAqLworICB0byA9IGZyYWdfbW9yZSAoNCk7CisKKyAgLyogT3V0cHV0IHRoZSBvcGNvZGUuICovCisgIG1kX251bWJlcl90b19jaGFycyAodG8sIHRoZV9pbnNuLm9wY29kZSwgNCk7CisKKyAgLyogSWYgbmVjZXNzYXJ5IG91dHB1dCBtb3JlIHN0dWZmLiAgKi8KKyAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IFJfSFBQQV9OT05FKQorICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csICh0byAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwgNCwgTlVMTCwKKwkJICAob2Zmc2V0VCkgMCwgJnRoZV9pbnNuLmV4cCwgdGhlX2luc24ucGNyZWwsCisJCSAgdGhlX2luc24ucmVsb2MsIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yLAorCQkgIHRoZV9pbnNuLmZvcm1hdCwgdGhlX2luc24uYXJnX3JlbG9jLCBOVUxMKTsKK30KKworLyogRG8gdGhlIHJlYWwgd29yayBmb3IgYXNzZW1ibGluZyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFN0b3JlIHJlc3VsdHMKKyAgIGludG8gdGhlIGdsb2JhbCAidGhlX2luc24iIHZhcmlhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2lwIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgY2hhciAqZXJyb3JfbWVzc2FnZSA9ICIiOworICBjaGFyICpzLCBjLCAqYXJnc3RhcnQsICpuYW1lLCAqc2F2ZV9zOworICBjb25zdCBjaGFyICphcmdzOworICBpbnQgbWF0Y2ggPSBGQUxTRTsKKyAgaW50IGNvbW1hID0gMDsKKyAgaW50IGNtcGx0ciwgbnVsbGlmLCBmbGFnLCBjb25kLCBudW07CisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworICBzdHJ1Y3QgcGFfb3Bjb2RlICppbnNuOworCisgIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCisgIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOworCisgIC8qIFNraXAgdG8gc29tZXRoaW5nIGludGVyZXN0aW5nLiAgKi8KKyAgZm9yIChzID0gc3RyOyBpc3VwcGVyICgqcykgfHwgaXNsb3dlciAoKnMpIHx8ICgqcyA+PSAnMCcgJiYgKnMgPD0gJzMnKTsgKytzKQorICAgIDsKKworICBzd2l0Y2ggKCpzKQorICAgIHsKKworICAgIGNhc2UgJ1wwJzoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLCc6CisgICAgICBjb21tYSA9IDE7CisKKyAgICAgIC8qRkFMTFRIUk9VR0ggKi8KKworICAgIGNhc2UgJyAnOgorICAgICAgKnMrKyA9ICdcMCc7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKKyAgICB9CisKKyAgc2F2ZV9zID0gc3RyOworCisgIC8qIENvbnZlcnQgZXZlcnl0aGluZyBpbnRvIGxvd2VyIGNhc2UuICAqLworICB3aGlsZSAoKnNhdmVfcykKKyAgICB7CisgICAgICBpZiAoaXN1cHBlciAoKnNhdmVfcykpCisJKnNhdmVfcyA9IHRvbG93ZXIgKCpzYXZlX3MpOworICAgICAgc2F2ZV9zKys7CisgICAgfQorCisgIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzIHRhYmxlLiAgKi8KKyAgaWYgKChpbnNuID0gKHN0cnVjdCBwYV9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoIlVua25vd24gb3Bjb2RlOiBgJXMnIiwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGNvbW1hKQorICAgIHsKKyAgICAgICotLXMgPSAnLCc7CisgICAgfQorCisgIC8qIE1hcmsgdGhlIGxvY2F0aW9uIHdoZXJlIGFyZ3VtZW50cyBmb3IgdGhlIGluc3RydWN0aW9uIHN0YXJ0LCB0aGVuCisgICAgIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gICovCisgIGFyZ3N0YXJ0ID0gczsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KKyAgICAgIG9wY29kZSA9IGluc24tPm1hdGNoOworICAgICAgbWVtc2V0ICgmdGhlX2luc24sIDAsIHNpemVvZiAodGhlX2luc24pKTsKKworICAgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfTk9ORTsKKworICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLAorCSB0aGVuIHNldCBhIG5ldyBhcmNoaXRlY3R1cmUuICAqLworICAgICAgLyogQnV0IGRvIG5vdCBhdXRvbWF0aWNhbGx5IHByb21vdGUgdG8gcGEyLjAuICBUaGUgYXV0b21hdGljIHByb21vdGlvbgorCSBjcnVkIGlzIGZvciBjb21wYXRhYmlsaXR5IHdpdGggSFAncyBvbGQgYXNzZW1ibGVycyBvbmx5LiAgKi8KKyAgICAgIGlmIChpbnNuLT5hcmNoIDwgMjAKKwkgICYmIGJmZF9nZXRfbWFjaCAoc3Rkb3V0cHV0KSA8IGluc24tPmFyY2gpCisJeworCSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCBpbnNuLT5hcmNoKSkKKwkgICAgYXNfd2FybiAoXygiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7CisJfQorICAgICAgZWxzZSBpZiAoYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgaW5zbi0+YXJjaCkKKwl7CisJICBtYXRjaCA9IEZBTFNFOworCSAgZ290byBmYWlsZWQ7CisJfQorCisgICAgICAvKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCisgICAgICAgICBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoLiAgKi8KKyAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7OyArK2FyZ3MpCisJeworCSAgc3dpdGNoICgqYXJncykKKwkgICAgeworCisJICAgIC8qIEVuZCBvZiBhcmd1bWVudHMuICAqLworCSAgICBjYXNlICdcMCc6CisJICAgICAgaWYgKCpzID09ICdcMCcpCisJCW1hdGNoID0gVFJVRTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICcrJzoKKwkgICAgICBpZiAoKnMgPT0gJysnKQorCQl7CisJCSAgKytzOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgaWYgKCpzID09ICctJykKKwkJY29udGludWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgLyogVGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KKwkgICAgY2FzZSAnKCc6CisJICAgIGNhc2UgJyknOgorCSAgICBjYXNlICcsJzoKKwkgICAgY2FzZSAnICc6CisJICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCisJCWNvbnRpbnVlOworCSAgICAgIGJyZWFrOworCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIG9yIGNvbnRyb2wgcmVnaXN0ZXIgZmllbGQgYXQgMTAuICAqLworCSAgICBjYXNlICdiJzoKKwkgICAgY2FzZSAnXic6CisJICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7CisKKwkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMTUuICAqLworCSAgICBjYXNlICd4JzoKKwkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKKworCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAzMS4gICovCisJICAgIGNhc2UgJ3knOgorCSAgICBjYXNlICd0JzoKKwkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOworCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IGZpZWxkIGxlbmd0aCBhdCAzMS4gICovCisJICAgIGNhc2UgJ1QnOgorCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzIsIDEsIDApOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgMzIgLSBudW0sIDApOworCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCisJICAgIGNhc2UgJzUnOgorCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTUsIC0xNiwgMCk7CisJICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKKworCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLworCSAgICBjYXNlICdWJzoKKwkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDE1LCAtMTYsIDApCisJICAgICAgbG93X3NpZ25fdW5leHQgKG51bSwgNSwgJm51bSk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOworCisJICAgIC8qIEhhbmRsZSBhbiB1bnNpZ25lZCA1IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLworCSAgICBjYXNlICdyJzoKKwkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7CisKKwkgICAgLyogSGFuZGxlIGFuIHVuc2lnbmVkIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4gICovCisJICAgIGNhc2UgJ1InOgorCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNik7CisKKwkgICAgLyogSGFuZGxlIGEgMiBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxNy4gICovCisJICAgIGNhc2UgJ3MnOgorCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOworCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMsIDAsIDEpOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxNCk7CisKKwkgICAgLyogSGFuZGxlIGEgMyBiaXQgc3BhY2UgaWRlbnRpZmllciBhdCAxOC4gICovCisJICAgIGNhc2UgJ1MnOgorCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOworCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIDEpOworCSAgICAgIGRpc19hc3NlbWJsZV8zIChudW0sICZudW0pOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAxMyk7CisKKwkgICAgLyogSGFuZGxlIGEgY29tcGxldGVyIGZvciBhbiBpbmRleGluZyBsb2FkIG9yIHN0b3JlLiAgKi8KKwkgICAgY2FzZSAnYyc6CisJICAgICAgeworCQlpbnQgdXUgPSAwOworCQlpbnQgbSA9IDA7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKKwkJICB7CisJCSAgICBzKys7CisJCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICJzbSIsIDIpID09IDApCisJCSAgICAgIHsKKwkJCXV1ID0gMTsKKwkJCW0gPSAxOworCQkJcysrOworCQkJaSsrOworCQkgICAgICB9CisJCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm0iLCAxKSA9PSAwKQorCQkgICAgICBtID0gMTsKKwkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAicyIsIDEpID09IDApCisJCSAgICAgIHV1ID0gMTsKKwkJICAgIGVsc2UKKwkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIuIikpOworCQkgICAgcysrOworCQkgICAgaSsrOworCQkgIH0KKwkJaWYgKGkgPiAyKQorCQkgIGFzX2JhZCAoXygiSW52YWxpZCBJbmRleGVkIExvYWQgQ29tcGxldGVyIFN5bnRheC4iKSk7CisJCW9wY29kZSB8PSBtIDw8IDU7CisJCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgdXUsIDEzKTsKKwkgICAgICB9CisKKwkgICAgLyogSGFuZGxlIGEgc2hvcnQgbG9hZC9zdG9yZSBjb21wbGV0ZXIuICAqLworCSAgICBjYXNlICdDJzoKKwkgICAgICB7CisJCWludCBhID0gMDsKKwkJaW50IG0gPSAwOworCQlpZiAoKnMgPT0gJywnKQorCQkgIHsKKwkJICAgIHMrKzsKKwkJICAgIGlmIChzdHJuY2FzZWNtcCAocywgIm1hIiwgMikgPT0gMCkKKwkJICAgICAgeworCQkJYSA9IDA7CisJCQltID0gMTsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJtYiIsIDIpID09IDApCisJCSAgICAgIHsKKwkJCWEgPSAxOworCQkJbSA9IDE7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIFNob3J0IExvYWQvU3RvcmUgQ29tcGxldGVyLiIpKTsKKwkJICAgIHMgKz0gMjsKKwkJICB9CisKKwkJaWYgKCphcmdzID09ICdDJykKKwkJICB7CisJCSAgICBvcGNvZGUgfD0gbSA8PCA1OworCQkgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBhLCAxMyk7CisJCSAgfQorCSAgICAgIH0KKworCSAgICAvKiBIYW5kbGUgYSBzdGJ5cyBjb21wbGV0ZXIuICAqLworCSAgICBjYXNlICdZJzoKKwkgICAgICB7CisJCWludCBhID0gMDsKKwkJaW50IG0gPSAwOworCQlpbnQgaSA9IDA7CisJCXdoaWxlICgqcyA9PSAnLCcgJiYgaSA8IDIpCisJCSAgeworCQkgICAgcysrOworCQkgICAgaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCisJCSAgICAgIG0gPSAxOworCQkgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJiIiwgMSkgPT0gMCkKKwkJICAgICAgYSA9IDA7CisJCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgImUiLCAxKSA9PSAwKQorCQkgICAgICBhID0gMTsKKwkJICAgIGVsc2UKKwkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIpKTsKKwkJICAgIHMrKzsKKwkJICAgIGkrKzsKKwkJICB9CisJCWlmIChpID4gMikKKwkJICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOworCQlvcGNvZGUgfD0gbSA8PCA1OworCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGEsIDEzKTsKKwkgICAgICB9CisKKwkgICAgLyogSGFuZGxlIGEgbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdHVidHJhY3QgY29uZGl0aW9uLiAgKi8KKwkgICAgY2FzZSAnPCc6CisJICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgKCZzLCAxKTsKKwkgICAgICBpZiAoY21wbHRyIDwgMCkKKwkJeworCQkgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiKSwgKnMpOworCQkgIGNtcGx0ciA9IDA7CisJCX0KKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOworCisJICAgIC8qIEhhbmRsZSBhIG5lZ2F0ZWQgb3Igbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb24uICAqLworCSAgICBjYXNlICc/JzoKKwkgICAgICBzYXZlX3MgPSBzOworCSAgICAgIGNtcGx0ciA9IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7CisJICAgICAgaWYgKGNtcGx0ciA8IDApCisJCXsKKwkJICBzID0gc2F2ZV9zOworCQkgIGNtcGx0ciA9IHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyICgmcywgMSk7CisJCSAgaWYgKGNtcGx0ciA8IDApCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbi4iKSk7CisJCSAgICAgIGNtcGx0ciA9IDA7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAgKi8KKwkJICAgICAgb3Bjb2RlIHw9IDEgPDwgMjc7CisJCSAgICB9CisJCX0KKwkKKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOworCisJICAgIC8qIEhhbmRsZSBub24tbmVnYXRlZCBhZGQgY29uZGl0aW9uLiAgKi8KKwkgICAgY2FzZSAnISc6CisJICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKKwkgICAgICBpZiAoY21wbHRyIDwgMCkKKwkJeworCQkgIGFzX2JhZCAoXygiSW52YWxpZCBDb21wYXJlL1N1YnRyYWN0IENvbmRpdGlvbjogJWMiKSwgKnMpOworCQkgIGNtcGx0ciA9IDA7CisJCX0KKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOworCisJICAgIC8qIEhhbmRsZSBhIG5lZ2F0ZWQgb3Igbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbi4gICovCisJICAgIGNhc2UgJ0AnOgorCSAgICAgIHNhdmVfcyA9IHM7CisJICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKKwkgICAgICBpZiAoY21wbHRyIDwgMCkKKwkJeworCQkgIHMgPSBzYXZlX3M7CisJCSAgY21wbHRyID0gcGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIgKCZzLCAxKTsKKwkJICBpZiAoY21wbHRyIDwgMCkKKwkJICAgIHsKKwkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIikpOworCQkgICAgICBjbXBsdHIgPSAwOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogTmVnYXRlZCBjb25kaXRpb24gcmVxdWlyZXMgYW4gb3Bjb2RlIGNoYW5nZS4gICovCisJCSAgICAgIG9wY29kZSB8PSAxIDw8IDI3OworCQkgICAgfQorCQl9CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDEzKTsKKworCSAgICAvKiBIYW5kbGUgYSBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbi4gICovCisJICAgIGNhc2UgJ2EnOgorCSAgICAgIGNtcGx0ciA9IDA7CisJICAgICAgZmxhZyA9IDA7CisJICAgICAgaWYgKCpzID09ICcsJykKKwkJeworCQkgIHMrKzsKKwkJICBuYW1lID0gczsKKwkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQorCQkgICAgcyArPSAxOworCQkgIGMgPSAqczsKKwkJICAqcyA9IDB4MDA7CisJCSAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQorCQkgICAgY21wbHRyID0gMTsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDI7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQorCQkgICAgY21wbHRyID0gMzsKKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPDwiKSA9PSAwKQorCQkgICAgY21wbHRyID0gNDsKKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPDw9IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDU7CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInN2IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDY7CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDc7CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gMDsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAxOworCQkgICAgICBmbGFnID0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDI7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAzOworCQkgICAgICBmbGFnID0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj49IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gNDsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIj4+IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gNTsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDY7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDc7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIpLCBuYW1lKTsKKwkJICAqcyA9IGM7CisJCX0KKwkgICAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOworCisJICAgIC8qIEhhbmRsZSBhIG5vbi1uZWdhdGVkIGFkZCBjb25kaXRpb24uICAqLworCSAgICBjYXNlICdkJzoKKwkgICAgICBjbXBsdHIgPSAwOworCSAgICAgIGZsYWcgPSAwOworCSAgICAgIGlmICgqcyA9PSAnLCcpCisJCXsKKwkJICBzKys7CisJCSAgbmFtZSA9IHM7CisJCSAgd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKKwkJICAgIHMgKz0gMTsKKwkJICBjID0gKnM7CisJCSAgKnMgPSAweDAwOworCQkgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDE7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCisJCSAgICBjbXBsdHIgPSAyOworCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDM7CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCisJCSAgICBjbXBsdHIgPSA0OworCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ6bnYiKSA9PSAwKQorCQkgICAgY21wbHRyID0gNTsKKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQorCQkgICAgY21wbHRyID0gNjsKKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQorCQkgICAgY21wbHRyID0gNzsKKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAwOworCQkgICAgICBmbGFnID0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDE7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gMjsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDM7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDQ7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSA1OworCQkgICAgICBmbGFnID0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gNjsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gNzsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIEFkZCBDb25kaXRpb246ICVzIiksIG5hbWUpOworCQkgICpzID0gYzsKKwkJfQorCSAgICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7CisKKwkgICAgLyogSEFORExFIGEgbG9naWNhbCBpbnN0cnVjdGlvbiBjb25kaXRpb24uICAqLworCSAgICBjYXNlICcmJzoKKwkgICAgICBjbXBsdHIgPSAwOworCSAgICAgIGZsYWcgPSAwOworCSAgICAgIGlmICgqcyA9PSAnLCcpCisJCXsKKwkJICBzKys7CisJCSAgbmFtZSA9IHM7CisJCSAgd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKKwkJICAgIHMgKz0gMTsKKwkJICBjID0gKnM7CisJCSAgKnMgPSAweDAwOworCisKKwkJICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCisJCSAgICBjbXBsdHIgPSAxOworCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQorCQkgICAgY21wbHRyID0gMjsKKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCisJCSAgICBjbXBsdHIgPSAzOworCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCisJCSAgICBjbXBsdHIgPSA3OworCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDA7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gMTsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAyOworCQkgICAgICBmbGFnID0gMTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gMzsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gNzsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIExvZ2ljYWwgSW5zdHJ1Y3Rpb24gQ29uZGl0aW9uLiIpKTsKKwkJICAqcyA9IGM7CisJCX0KKwkgICAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOworCisJICAgIC8qIEhhbmRsZSBhIHVuaXQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9uLiAgKi8KKwkgICAgY2FzZSAnVSc6CisJICAgICAgY21wbHRyID0gMDsKKwkgICAgICBmbGFnID0gMDsKKwkgICAgICBpZiAoKnMgPT0gJywnKQorCQl7CisJCSAgcysrOworCisKKwkJICBpZiAoc3RybmNhc2VjbXAgKHMsICJzYnoiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAyOworCQkgICAgICBzICs9IDM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaHoiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAzOworCQkgICAgICBzICs9IDM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzZGMiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSA0OworCQkgICAgICBzICs9IDM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzYmMiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSA2OworCQkgICAgICBzICs9IDM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzaGMiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSA3OworCQkgICAgICBzICs9IDM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJ0ciIsIDIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDA7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgICBzICs9IDI7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuYnoiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSAyOworCQkgICAgICBmbGFnID0gMTsKKwkJICAgICAgcyArPSAzOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmh6IiwgMykgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gMzsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICAgIHMgKz0gMzsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5kYyIsIDMpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDQ7CisJCSAgICAgIGZsYWcgPSAxOworCQkgICAgICBzICs9IDM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuYmMiLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBjbXBsdHIgPSA2OworCQkgICAgICBmbGFnID0gMTsKKwkJICAgICAgcyArPSAzOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmhjIiwgMykgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gNzsKKwkJICAgICAgZmxhZyA9IDE7CisJCSAgICAgIHMgKz0gMzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBhc19iYWQgKF8oIkludmFsaWQgTG9naWNhbCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOworCQl9CisJICAgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEyKTsKKworCSAgICAvKiBIYW5kbGUgYSBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9uLiAgKi8KKwkgICAgY2FzZSAnfCc6CisJICAgIGNhc2UgJz4nOgorCSAgICAgIGNtcGx0ciA9IDA7CisJICAgICAgaWYgKCpzID09ICcsJykKKwkJeworCQkgIHNhdmVfcyA9IHMrKzsKKworCisJCSAgbmFtZSA9IHM7CisJCSAgd2hpbGUgKCpzICE9ICcsJyAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKKwkJICAgIHMgKz0gMTsKKwkJICBjID0gKnM7CisJCSAgKnMgPSAweDAwOworCQkgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDE7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCisJCSAgICBjbXBsdHIgPSAyOworCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCisJCSAgICBjbXBsdHIgPSAzOworCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCisJCSAgICBjbXBsdHIgPSA0OworCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKKwkJICAgIGNtcGx0ciA9IDU7CisJCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQorCQkgICAgY21wbHRyID0gNjsKKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQorCQkgICAgY21wbHRyID0gNzsKKwkJICAvKiBIYW5kbGUgbW92YixuLiAgUHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlLgorCQkgICAgIFRoaXMgaW5jbHVkZXMgbW92aW5nIHMgYmFjayB0byB3aGVyZSBpdCBzdGFydGVkLiAgKi8KKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgKmFyZ3MgPT0gJ3wnKQorCQkgICAgeworCQkgICAgICAqcyA9IGM7CisJCSAgICAgIHMgPSBzYXZlX3M7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIpKTsKKwkJICAqcyA9IGM7CisJCX0KKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOworCisJICAgIC8qIEhhbmRsZSBidmIgYW5kIGJiIGNvbmRpdGlvbnMuICAqLworCSAgICBjYXNlICd+JzoKKwkgICAgICBjbXBsdHIgPSAwOworCSAgICAgIGlmICgqcyA9PSAnLCcpCisJCXsKKwkJICBzKys7CisJCSAgaWYgKHN0cm5jbXAgKHMsICI8IiwgMSkgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY21wbHRyID0gMDsKKwkJICAgICAgcysrOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICI+PSIsIDIpID09IDApCisJCSAgICB7CisJCSAgICAgIGNtcGx0ciA9IDE7CisJCSAgICAgIHMgKz0gMjsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBhc19iYWQgKF8oIkludmFsaWQgQml0IEJyYW5jaCBDb25kaXRpb246ICVjIiksICpzKTsKKwkJfQorCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxNSk7CisKKwkgICAgLyogSGFuZGxlIGEgc3lzdGVtIGNvbnRyb2wgY29tcGxldGVyLiAgKi8KKwkgICAgY2FzZSAnWic6CisJICAgICAgaWYgKCpzID09ICcsJyAmJiAoKihzICsgMSkgPT0gJ20nIHx8ICoocyArIDEpID09ICdNJykpCisJCXsKKwkJICBmbGFnID0gMTsKKwkJICBzICs9IDI7CisJCX0KKwkgICAgICBlbHNlCisJCWZsYWcgPSAwOworCisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCA1KTsKKworCSAgICAvKiBIYW5kbGUgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4gICovCisJICAgIGNhc2UgJ24nOgorCSAgICAgIG51bGxpZiA9IHBhX3BhcnNlX251bGxpZiAoJnMpOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVsbGlmLCAxKTsKKworCSAgICAvKiBIYW5kbGUgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgY29wciBhbmQgc3BvcCBpbnNucy4gICovCisJICAgIGNhc2UgJ04nOgorCSAgICAgIG51bGxpZiA9IHBhX3BhcnNlX251bGxpZiAoJnMpOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVsbGlmLCA1KTsKKworCisJICAgIC8qIEhhbmRsZSBhIDExIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLworCSAgICBjYXNlICdpJzoKKwkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOworCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCisJCXsKKwkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKKwkJICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAtMTAyNCwgMCk7CisJCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTEsICZudW0pOworCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKKwkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKKwkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKKwkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7CisJCSAgZWxzZQorCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7CisJCSAgdGhlX2luc24uZm9ybWF0ID0gMTE7CisJCSAgY29udGludWU7CisJCX0KKworCisJICAgIC8qIEhhbmRsZSBhIDE0IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLworCSAgICBjYXNlICdqJzoKKwkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOworCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCisJCXsKKwkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKKwkJICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAtODE5MiwgMCk7CisJCSAgbG93X3NpZ25fdW5leHQgKG51bSwgMTQsICZudW0pOworCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKKwkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKKwkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKKwkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7CisJCSAgZWxzZQorCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7CisJCSAgdGhlX2luc24uZm9ybWF0ID0gMTQ7CisJCSAgY29udGludWU7CisJCX0KKworCSAgICAvKiBIYW5kbGUgYSAyMSBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KKwkgICAgY2FzZSAnayc6CisJICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKKwkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCQl7CisJCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7CisJCSAgQ0hFQ0tfRklFTEQgKG51bSA+PiAxMSwgMTA0ODU3NSwgLTEwNDg1NzYsIDApOworCQkgIGRpc19hc3NlbWJsZV8yMSAobnVtLCAmbnVtKTsKKwkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoaXNfRFBfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCisJCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9HT1RPRkY7CisJCSAgZWxzZSBpZiAoaXNfUENfcmVsYXRpdmUgKHRoZV9pbnNuLmV4cCkpCisJCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOworCQkgIGVsc2UKKwkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBOworCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDIxOworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgLyogSGFuZGxlIGEgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLworCSAgICBjYXNlICd3JzoKKwkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOworCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgdGhlX2luc24ucGNyZWwgPSAxOworCSAgICAgIGlmICghc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwgIkwkMFwwMDEiKSkKKwkJeworCQkgIHVuc2lnbmVkIGludCB3MSwgdywgcmVzdWx0OworCisJCSAgbnVtID0gZXZhbHVhdGVfYWJzb2x1dGUgKCZ0aGVfaW5zbik7CisJCSAgaWYgKG51bSAlIDQpCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoXygiQnJhbmNoIHRvIHVuYWxpZ25lZCBhZGRyZXNzIikpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBDSEVDS19GSUVMRCAobnVtLCA4MTk5LCAtODE4NCwgMCk7CisJCSAgc2lnbl91bmV4dCAoKG51bSAtIDgpID4+IDIsIDEyLCAmcmVzdWx0KTsKKwkJICBkaXNfYXNzZW1ibGVfMTIgKHJlc3VsdCwgJncxLCAmdyk7CisJCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAoKHcxIDw8IDIpIHwgdyksIDApOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKKwkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMjsKKwkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7CisJCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOworCQkgIHMgPSBleHByX2VuZDsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgIC8qIEhhbmRsZSBhIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50LiAgKi8KKwkgICAgY2FzZSAnVyc6CisJICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKKwkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKKwkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKKwkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKKwkJCSAgICAgICJMJDBcMDAxIikpCisJCXsKKwkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7CisKKwkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKKwkJICBpZiAobnVtICUgNCkKKwkJICAgIHsKKwkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7CisKKwkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKKwkJICAgIG51bSAtPSA4OworCisJCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKKwkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKKwkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCisJCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKKwkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKKwkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7CisJCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgLyogSGFuZGxlIGFuIGFic29sdXRlIDE3IGJpdCBicmFuY2ggdGFyZ2V0LiAgKi8KKwkgICAgY2FzZSAneic6CisJICAgICAgdGhlX2luc24uZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZzKTsKKwkgICAgICBnZXRfZXhwcmVzc2lvbiAocyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMDsKKwkgICAgICBpZiAoIXRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wKKwkJICB8fCAhc3RyY21wIChTX0dFVF9OQU1FICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKSwKKwkJCSAgICAgICJMJDBcMDAxIikpCisJCXsKKwkJICB1bnNpZ25lZCBpbnQgdzIsIHcxLCB3LCByZXN1bHQ7CisKKwkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKKwkJICBpZiAobnVtICUgNCkKKwkJICAgIHsKKwkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIENIRUNLX0ZJRUxEIChudW0sIDI2MjE0MywgLTI2MjE0NCwgMCk7CisKKwkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCkKKwkJICAgIG51bSAtPSA4OworCisJCSAgc2lnbl91bmV4dCAobnVtID4+IDIsIDE3LCAmcmVzdWx0KTsKKwkJICBkaXNfYXNzZW1ibGVfMTcgKHJlc3VsdCwgJncxLCAmdzIsICZ3KTsKKwkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsCisJCQkJCSAgICgodzIgPDwgMikgfCAodzEgPDwgMTYpIHwgdyksIDApOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfQUJTX0NBTEw7CisJCSAgdGhlX2luc24uZm9ybWF0ID0gMTc7CisJCSAgdGhlX2luc24uYXJnX3JlbG9jID0gbGFzdF9jYWxsX2Rlc2MuYXJnX3JlbG9jOworCQkgIG1lbXNldCAoJmxhc3RfY2FsbF9kZXNjLCAwLCBzaXplb2YgKHN0cnVjdCBjYWxsX2Rlc2MpKTsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2LiAgKi8KKwkgICAgY2FzZSAncCc6CisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMSAtIG51bSwgNSk7CisKKwkgICAgLyogSGFuZGxlIGEgNSBiaXQgYml0IHBvc2l0aW9uIGF0IDI2LiAgKi8KKwkgICAgY2FzZSAnUCc6CisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDUpOworCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAxMC4gICovCisJICAgIGNhc2UgJ1EnOgorCisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQorCQlicmVhazsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAyMSk7CisKKwkgICAgLyogSGFuZGxlIGEgMTMgYml0IGltbWVkaWF0ZSBhdCAxOC4gICovCisJICAgIGNhc2UgJ0EnOgorCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgODE5MSwgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKKworCSAgICAvKiBIYW5kbGUgYSAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxLiAgKi8KKwkgICAgY2FzZSAnRCc6CisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCA2NzExMDg4NjQsIDAsIDApOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKKworCSAgICAvKiBIYW5kbGUgYSAzIGJpdCBTRlUgaWRlbnRpZmllciBhdCAyNS4gICovCisJICAgIGNhc2UgJ2YnOgorCSAgICAgIGlmICgqcysrICE9ICcsJykKKwkJYXNfYmFkIChfKCJJbnZhbGlkIFNGVSBpZGVudGlmaWVyIikpOworCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOworCisJICAgIC8qIEhhbmRsZSBhIDIwIGJpdCBTT1AgZmllbGQgZm9yIHNwb3AwLiAgKi8KKwkgICAgY2FzZSAnTyc6CisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDQ4NTc1LCAwLCAwKTsKKwkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwZmZmZTApIDw8IDYpOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKKworCSAgICAvKiBIYW5kbGUgYSAxNWJpdCBTT1AgZmllbGQgZm9yIHNwb3AxLiAgKi8KKwkgICAgY2FzZSAnbyc6CisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgMCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDExKTsKKworCSAgICAvKiBIYW5kbGUgYSAxMGJpdCBTT1AgZmllbGQgZm9yIHNwb3AzLiAgKi8KKwkgICAgY2FzZSAnMCc6CisJICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxMDIzLCAwLCAwKTsKKwkgICAgICBudW0gPSAobnVtICYgMHgxZikgfCAoKG51bSAmIDB4MDAwMDAzZTApIDw8IDYpOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKKworCSAgICAvKiBIYW5kbGUgYSAxNSBiaXQgU09QIGZpZWxkIGZvciBzcG9wMi4gICovCisJICAgIGNhc2UgJzEnOgorCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzI3NjcsIDAsIDApOworCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDAwN2ZlMCkgPDwgNik7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOworCisJICAgIC8qIEhhbmRsZSBhIDMtYml0IGNvLXByb2Nlc3NvciBJRCBmaWVsZC4gICovCisJICAgIGNhc2UgJ3UnOgorCSAgICAgIGlmICgqcysrICE9ICcsJykKKwkJYXNfYmFkIChfKCJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIpKTsKKwkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDcsIDAsIDApOworCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCA2KTsKKworCSAgICAvKiBIYW5kbGUgYSAyMmJpdCBTT1AgZmllbGQgZm9yIGNvcHIuICAqLworCSAgICBjYXNlICcyJzoKKwkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDQxOTQzMDMsIDAsIDApOworCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDNmZmZlMCkgPDwgNCk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOworCisKKwkgICAgLyogSGFuZGxlIGEgc291cmNlIEZQIG9wZXJhbmQgZm9ybWF0IGNvbXBsZXRlci4gICovCisJICAgIGNhc2UgJ0YnOgorCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKKwkgICAgICB0aGVfaW5zbi5mcG9mMSA9IGZsYWc7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMSk7CisKKwkgICAgLyogSGFuZGxlIGEgZGVzdGluYXRpb24gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyLiAgKi8KKwkgICAgY2FzZSAnRyc6CisJICAgICAgLyogcGFfcGFyc2VfZm9ybWF0IG5lZWRzIHRoZSAnLCcgcHJlZml4LiAgKi8KKwkgICAgICBzLS07CisJICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOworCSAgICAgIHRoZV9pbnNuLmZwb2YyID0gZmxhZzsKKwkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEzKTsKKworCSAgICAvKiBIYW5kbGUgRlAgY29tcGFyZSBjb25kaXRpb25zLiAgKi8KKwkgICAgY2FzZSAnTSc6CisJICAgICAgY29uZCA9IHBhX3BhcnNlX2ZwX2NtcF9jb25kICgmcyk7CisJICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjb25kLCAwKTsKKworCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICd0Jy4gICovCisJICAgIGNhc2UgJ3YnOgorCSAgICAgIHsKKwkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OworCisJCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOworCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7CisJCW9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQ7CisKKwkJLyogMHgzMCBvcGNvZGVzIGFyZSBGUCBhcml0aG1ldGljIG9wZXJhdGlvbiBvcGNvZGVzCisJCSAgIGFuZCBuZWVkIHRvIGJlIHR1cm5lZCBpbnRvIDB4Mzggb3Bjb2Rlcy4gIFRoaXMKKwkJICAgaXMgbm90IG5lY2Vzc2FyeSBmb3IgbG9hZHMvc3RvcmVzLiAgKi8KKwkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkKKwkJICAgICYmICgob3Bjb2RlICYgMHhmYzAwMDAwMCkgPT0gMHgzMDAwMDAwMCkpCisJCSAgb3Bjb2RlIHw9IDEgPDwgMjc7CisKKwkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubF9yX3NlbGVjdCAmIDEsIDYpOworCSAgICAgIH0KKworCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICdiJy4gICovCisJICAgIGNhc2UgJ0UnOgorCSAgICAgIHsKKwkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OworCisJCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOworCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7CisJCW9wY29kZSB8PSByZXN1bHQubnVtYmVyX3BhcnQgPDwgMjE7CisJCWlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpKQorCQkgIHsKKwkJICAgIG9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA3OworCQkgICAgb3Bjb2RlIHw9IDEgPDwgMjc7CisJCSAgfQorCQljb250aW51ZTsKKwkgICAgICB9CisKKwkgICAgLyogSGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMgbGlrZSAnYicuICAqLworCSAgICBjYXNlICczJzoKKwkgICAgICB7CisJCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKKwkJaW50IHJlZ251bTsKKworCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKKwkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOworCQlvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWMpIDw8IDExOworCQlvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MykgPDwgOTsKKwkJb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDg7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICd4Jy4gICovCisJICAgIGNhc2UgJ2UnOgorCSAgICAgIHsKKwkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OworCisJCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOworCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7CisJCW9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxZikgPDwgMTY7CisJCWlmIChuZWVkX3BhMTFfb3Bjb2RlICgmdGhlX2luc24sICZyZXN1bHQpKQorCQkgIHsKKwkJICAgIG9wY29kZSB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCAxOworCQkgIH0KKwkJY29udGludWU7CisJICAgICAgfQorCisJICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ3gnLiAgKi8KKwkgICAgY2FzZSAnWCc6CisJICAgICAgeworCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7CisKKwkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7CisJCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKKwkJb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKKwkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCisJCSAgeworCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDEyOworCQkgICAgb3Bjb2RlIHw9IDEgPDwgMjc7CisJCSAgfQorCQljb250aW51ZTsKKwkgICAgICB9CisKKwkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMTAuICAqLworCSAgICBjYXNlICc0JzoKKwkgICAgICB7CisJCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKKworCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKKwkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOworCQlpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQorCQkgIHsKKwkJICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKKwkJICAgICAgeworCQkJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7CisJCQlicmVhazsKKwkJICAgICAgfQorCisJCSAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOworCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7CisJCSAgfQorCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMjEpOworCSAgICAgIH0KKworCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxNS4gICovCisJICAgIGNhc2UgJzYnOgorCSAgICAgIHsKKwkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OworCisJCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOworCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7CisJCWlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCisJCSAgeworCQkgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQorCQkgICAgICB7CisJCQlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOworCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7CisJCSAgfQorCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMTYpOworCSAgICAgIH0KKworCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAzMS4gICovCisJICAgIGNhc2UgJzcnOgorCSAgICAgIHsKKwkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OworCisJCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOworCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7CisJCWlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCisJCSAgeworCQkgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQorCQkgICAgICB7CisJCQlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgICByZXN1bHQubnVtYmVyX3BhcnQgJj0gMHhGOworCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0IHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDQ7CisJCSAgfQorCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5udW1iZXJfcGFydCwgMCk7CisJICAgICAgfQorCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDIwLiAgKi8KKwkgICAgY2FzZSAnOCc6CisJICAgICAgeworCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7CisKKwkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7CisJCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKKwkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKKwkJICB7CisJCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCisJCSAgICAgIHsKKwkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7CisJCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKKwkJICB9CisJCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAxMSk7CisJICAgICAgfQorCisJICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDI1LiAgKi8KKwkgICAgY2FzZSAnOSc6CisJICAgICAgeworCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7CisKKwkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7CisJCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKKwkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKKwkJICB7CisJCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCisJCSAgICAgIHsKKwkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7CisJCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKKwkJICB9CisJCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCA2KTsKKwkgICAgICB9CisKKwkgICAgLyogSGFuZGxlIGEgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCBmb3JtYXQgYXQgMjYuCisJICAgICAgIE9ubHkgYWxsb3dzIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbi4gICovCisJICAgIGNhc2UgJ0gnOgorCSAgICAgIGZsYWcgPSBwYV9wYXJzZV9mcF9mb3JtYXQgKCZzKTsKKwkgICAgICBzd2l0Y2ggKGZsYWcpCisJCXsKKwkJY2FzZSBTR0w6CisJCSAgb3Bjb2RlIHw9IDB4MjA7CisJCWNhc2UgREJMOgorCQkgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKKwkJICBjb250aW51ZTsKKworCQljYXNlIFFVQUQ6CisJCWNhc2UgSUxMRUdBTF9GTVQ6CisJCWRlZmF1bHQ6CisJCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0LiIpKTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKworIGZhaWxlZDoKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBhcmdzIG1hdGNoZWQuICAqLworICAgICAgaWYgKG1hdGNoID09IEZBTFNFKQorCXsKKwkgIGlmICgmaW5zblsxXSAtIHBhX29wY29kZXMgPCAoaW50KSBOVU1PUENPREVTCisJICAgICAgJiYgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKKwkgICAgeworCSAgICAgICsraW5zbjsKKwkgICAgICBzID0gYXJnc3RhcnQ7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBvcGVyYW5kcyAlcyIpLCBlcnJvcl9tZXNzYWdlKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOworfQorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpcyByZXR1cm5lZC4gICovCisKKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBjaGFyIHR5cGU7CisgICAgIGNoYXIgKmxpdFA7CisgICAgIGludCAqc2l6ZVA7Cit7CisgIGludCBwcmVjOworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107CisgIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKKyAgY2hhciAqdDsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworCisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7CisgICAgfQorICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFdyaXRlIG91dCBiaWctZW5kaWFuLiAgKi8KKwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKKyAgICAgY2hhciAqYnVmOworICAgICB2YWx1ZVQgdmFsOworICAgICBpbnQgbjsKK3sKKyAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOworfQorCisvKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKKyAgIGZvcm1hdC4gICovCisKK2FyZWxlbnQgKioKK3RjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGFyZWxlbnQgKnJlbG9jOworICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeHA7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworICBzdGF0aWMgYXJlbGVudCAqbm9fcmVsb2NzID0gTlVMTDsKKyAgYXJlbGVudCAqKnJlbG9jczsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICoqY29kZXM7CisgIGludCBuX3JlbG9jczsKKyAgaW50IGk7CisKKyAgaHBwYV9maXhwID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7CisgIGlmIChmaXhwLT5meF9hZGRzeSA9PSAwKQorICAgIHJldHVybiAmbm9fcmVsb2NzOworICBhc3NlcnQgKGhwcGFfZml4cCAhPSAwKTsKKyAgYXNzZXJ0IChzZWN0aW9uICE9IDApOworCisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisKKyAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworICBjb2RlcyA9IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgKiopIGhwcGFfZ2VuX3JlbG9jX3R5cGUgKHN0ZG91dHB1dCwKKwkJCSAgICAgICBmaXhwLT5meF9yX3R5cGUsCisJCQkgICAgICAgaHBwYV9maXhwLT5meF9yX2Zvcm1hdCwKKwkJCSAgICAgICBocHBhX2ZpeHAtPmZ4X3JfZmllbGQsCisJCQkgICAgICAgZml4cC0+Znhfc3Vic3kgIT0gTlVMTCwKKwkJCSAgICAgICBmaXhwLT5meF9hZGRzeS0+YnN5bSk7CisKKyAgaWYgKGNvZGVzID09IE5VTEwpCisgICAgYWJvcnQgKCk7CisKKyAgZm9yIChuX3JlbG9jcyA9IDA7IGNvZGVzW25fcmVsb2NzXTsgbl9yZWxvY3MrKykKKyAgICA7CisKKyAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIG5fcmVsb2NzICsgMSk7CisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSAqIG5fcmVsb2NzKTsKKyAgZm9yIChpID0gMDsgaSA8IG5fcmVsb2NzOyBpKyspCisgICAgcmVsb2NzW2ldID0gJnJlbG9jW2ldOworCisgIHJlbG9jc1tuX3JlbG9jc10gPSBOVUxMOworCisjaWZkZWYgT0JKX0VMRgorICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCAobl9yZWxvY3MgPT0gMSk7CisKKyAgICAgIGNvZGUgPSAqY29kZXNbMF07CisKKyAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKyAgICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKKyAgICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7CS8qIGRlZmF1bHQgKi8KKworICAgICAgYXNzZXJ0IChyZWxvYy0+aG93dG8gJiYgY29kZSA9PSByZWxvYy0+aG93dG8tPnR5cGUpOworCisgICAgICAvKiBOb3csIGRvIGFueSBwcm9jZXNzaW5nIHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZSByZWxvY2F0aW9uIHR5cGUuICAqLworICAgICAgc3dpdGNoIChjb2RlKQorCXsKKwljYXNlIFJfUEFSSVNDX0RMVFJFTDIxTDoKKwljYXNlIFJfUEFSSVNDX0RMVFJFTDE0UjoKKwljYXNlIFJfUEFSSVNDX0RMVFJFTDE0RjoKKwljYXNlIFJfUEFSSVNDX1BMQUJFTDMyOgorCWNhc2UgUl9QQVJJU0NfUExBQkVMMjFMOgorCWNhc2UgUl9QQVJJU0NfUExBQkVMMTRSOgorCSAgLyogRm9yIHBsYWJlbCByZWxvY2F0aW9ucywgdGhlIGFkZGVuZCBvZiB0aGUKKwkgICAgIHJlbG9jYXRpb24gc2hvdWxkIGJlIGVpdGhlciAwIChubyBzdGF0aWMgbGluaykgb3IgMgorCSAgICAgKHN0YXRpYyBsaW5rIHJlcXVpcmVkKS4KKworCSAgICAgRklYTUU6IFdlIGFsd2F5cyBhc3N1bWUgbm8gc3RhdGljIGxpbmshCisKKwkgICAgIFdlIGFsc28gc2xhbSBhIHplcm8gYWRkZW5kIGludG8gdGhlIERMVCByZWxhdGl2ZSByZWxvY3M7CisJICAgICBpdCBkb2Vzbid0IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgdG8gdXNlIGFueSBhZGRlbmQgc2luY2UKKwkgICAgIGl0IGdldHMgeW91IGEgZGlmZmVyZW50IChlZyB1bmtub3duKSBETFQgZW50cnkuICAqLworCSAgcmVsb2MtPmFkZGVuZCA9IDA7CisJICBicmVhazsKKworCWNhc2UgUl9QQVJJU0NfUENSRUwyMUw6CisJY2FzZSBSX1BBUklTQ19QQ1JFTDE3UjoKKwljYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgorCWNhc2UgUl9QQVJJU0NfUENSRUwxN0M6CisJY2FzZSBSX1BBUklTQ19QQ1JFTDE0UjoKKwljYXNlIFJfUEFSSVNDX1BDUkVMMTRGOgorCSAgLyogVGhlIGNvbnN0YW50IGlzIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCSAgcmVsb2MtPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKGhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jLCAwKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorI2Vsc2UgLyogT0JKX1NPTSAqLworCisgIC8qIFdhbGsgb3ZlciByZWFjaCByZWxvY2F0aW9uIHJldHVybmVkIGJ5IHRoZSBCRkQgYmFja2VuZC4gICovCisgIGZvciAoaSA9IDA7IGkgPCBuX3JlbG9jczsgaSsrKQorICAgIHsKKyAgICAgIGNvZGUgPSAqY29kZXNbaV07CisKKyAgICAgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07CisgICAgICByZWxvY3NbaV0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOworICAgICAgcmVsb2NzW2ldLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworCisgICAgICBzd2l0Y2ggKGNvZGUpCisJeworCWNhc2UgUl9DT01QMjoKKwkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZXZlciB1c2UgYSBSX0NPTVAyIGZpeHVwIGlzIGZvciB0aGUgZGlmZmVyZW5jZQorCSAgICAgb2YgdHdvIHN5bWJvbHMuICBXaXRoIHRoYXQgaW4gbWluZCB3ZSBmaWxsIGluIGFsbCBmb3VyCisJICAgICByZWxvY3Mgbm93IGFuZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuICAqLworCSAgYXNzZXJ0IChpID09IDEpOworCSAgcmVsb2NzWzBdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmYmZkX2Fic19zeW1ib2w7CisJICByZWxvY3NbMF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1swXSk7CisJICByZWxvY3NbMF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisJICByZWxvY3NbMF0tPmFkZGVuZCA9IDA7CisJICByZWxvY3NbMV0tPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworCSAgcmVsb2NzWzFdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbMV0pOworCSAgcmVsb2NzWzFdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworCSAgcmVsb2NzWzFdLT5hZGRlbmQgPSAwOworCSAgcmVsb2NzWzJdLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9zdWJzeS0+YnN5bTsKKwkgIHJlbG9jc1syXS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzJdKTsKKwkgIHJlbG9jc1syXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKwkgIHJlbG9jc1syXS0+YWRkZW5kID0gMDsKKwkgIHJlbG9jc1szXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgJmJmZF9hYnNfc3ltYm9sOworCSAgcmVsb2NzWzNdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbM10pOworCSAgcmVsb2NzWzNdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworCSAgcmVsb2NzWzNdLT5hZGRlbmQgPSAwOworCSAgcmVsb2NzWzRdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmYmZkX2Fic19zeW1ib2w7CisJICByZWxvY3NbNF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1s0XSk7CisJICByZWxvY3NbNF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisJICByZWxvY3NbNF0tPmFkZGVuZCA9IDA7CisJICBnb3RvIGRvbmU7CisJY2FzZSBSX1BDUkVMX0NBTEw6CisJY2FzZSBSX0FCU19DQUxMOgorCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSBIUFBBX1JfQURERU5EIChocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYywgMCk7CisJICBicmVhazsKKworCWNhc2UgUl9ETFRfUkVMOgorCWNhc2UgUl9EQVRBX1BMQUJFTDoKKwljYXNlIFJfQ09ERV9QTEFCRUw6CisJICAvKiBGb3IgcGxhYmVsIHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kIG9mIHRoZQorCSAgICAgcmVsb2NhdGlvbiBzaG91bGQgYmUgZWl0aGVyIDAgKG5vIHN0YXRpYyBsaW5rKSBvciAyCisJICAgICAoc3RhdGljIGxpbmsgcmVxdWlyZWQpLgorCisJICAgICBGSVhNRTogV2UgYWx3YXlzIGFzc3VtZSBubyBzdGF0aWMgbGluayEKKworCSAgICAgV2UgYWxzbyBzbGFtIGEgemVybyBhZGRlbmQgaW50byB0aGUgRExUIHJlbGF0aXZlIHJlbG9jczsKKwkgICAgIGl0IGRvZXNuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSB0byB1c2UgYW55IGFkZGVuZCBzaW5jZQorCSAgICAgaXQgZ2V0cyB5b3UgYSBkaWZmZXJlbnQgKGVnIHVua25vd24pIERMVCBlbnRyeS4gICovCisJICByZWxvY3NbaV0tPmFkZGVuZCA9IDA7CisJICBicmVhazsKKworCWNhc2UgUl9OX01PREU6CisJY2FzZSBSX1NfTU9ERToKKwljYXNlIFJfRF9NT0RFOgorCWNhc2UgUl9SX01PREU6CisJY2FzZSBSX0ZTRUw6CisJY2FzZSBSX0xTRUw6CisJY2FzZSBSX1JTRUw6CisJY2FzZSBSX0JFR0lOX0JSVEFCOgorCWNhc2UgUl9FTkRfQlJUQUI6CisJY2FzZSBSX0JFR0lOX1RSWToKKwljYXNlIFJfTjBTRUw6CisJY2FzZSBSX04xU0VMOgorCSAgLyogVGhlcmUgaXMgbm8gc3ltYm9sIG9yIGFkZGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlc2UgZml4dXBzLiAgKi8KKwkgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAmZHVtbXlfc3ltYm9sLT5ic3ltOworCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSAwOworCSAgYnJlYWs7CisKKwljYXNlIFJfRU5EX1RSWToKKwljYXNlIFJfRU5UUlk6CisJY2FzZSBSX0VYSVQ6CisJICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGZpeHVwcy4gICovCisJICByZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gJmR1bW15X3N5bWJvbC0+YnN5bTsKKwkgIHJlbG9jc1tpXS0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7CisJfQorICAgIH0KKworIGRvbmU6CisjZW5kaWYKKworICByZXR1cm4gcmVsb2NzOworfQorCisvKiBQcm9jZXNzIGFueSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnIHR5cGVzLiAgKi8KKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICAgICByZWdpc3RlciBiZmQgKmFiZmQ7CisgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzZWM7CisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKK3sKKyAgdW5zaWduZWQgaW50IGFkZHJlc3M7CisKKyAgaWYgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KQorICAgIHsKKyAgICAgIHN3aXRjaCAoKGludCkgZnJhZ1AtPmZyX3N1YnR5cGUpCisJeworCWNhc2UgMDoKKwkgIGZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKKwkgIGtub3cgKGZyYWdQLT5mcl92YXIgPT0gMSk7CisJICBrbm93IChmcmFnUC0+ZnJfbmV4dCk7CisJICBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4OworCSAgaWYgKGFkZHJlc3MgJSBmcmFnUC0+ZnJfb2Zmc2V0KQorCSAgICB7CisJICAgICAgZnJhZ1AtPmZyX29mZnNldCA9CisJCWZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCisJCS0gZnJhZ1AtPmZyX2FkZHJlc3MKKwkJLSBmcmFnUC0+ZnJfZml4OworCSAgICB9CisJICBlbHNlCisJICAgIGZyYWdQLT5mcl9vZmZzZXQgPSAwOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLworCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIGFzZWN0aW9uICpzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKKyAgaW50IGFsaWduMiA9ICgxIDw8IGFsaWduKSAtIDE7CisKKyAgcmV0dXJuIChzaXplICsgYWxpZ24yKSAmIH5hbGlnbjI7Cit9CisKKy8qIFJldHVybiB0aGUgYXBwcm94aW1hdGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4YXRpb24gaGFzIG9jY3VycmVkLiAgKi8KK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQorICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7CisgICAgIGFzZWN0aW9uICpzZWdtZW50OworeworICBpbnQgc2l6ZTsKKworICBzaXplID0gMDsKKworICB3aGlsZSAoKGZyYWdQLT5mcl9maXggKyBzaXplKSAlIGZyYWdQLT5mcl9vZmZzZXQpCisgICAgc2l6ZSsrOworCisgIHJldHVybiBzaXplOworfQorDAorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7CitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7CisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHJldHVybiAwOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKK30KKwwKKy8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KKworc3ltYm9sUyAqCittZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICByZXR1cm4gMDsKK30KKworLyogQXBwbHkgYSBmaXh1cCB0byBhbiBpbnN0cnVjdGlvbi4gICovCisKK2ludAorbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQorICAgICBmaXhTICpmaXhQOworICAgICB2YWx1ZVQgKnZhbHA7Cit7CisgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKKyAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXhQOworICBsb25nIG5ld192YWwsIHJlc3VsdCA9IDA7CisgIHVuc2lnbmVkIGludCB3MSwgdzIsIHcsIHJlc3VsdGk7CisKKyAgaHBwYV9maXhQID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4UC0+dGNfZml4X2RhdGE7CisgIC8qIFNPTSB1c2VzIFJfSFBQQV9FTlRSWSBhbmQgUl9IUFBBX0VYSVQgcmVsb2NhdGlvbnMgd2hpY2ggY2FuCisgICAgIG5ldmVyIGJlICJhcHBsaWVkIiAodGhleSBhcmUganVzdCBtYXJrZXJzKS4gIExpa2V3aXNlIGZvcgorICAgICBSX0hQUEFfQkVHSU5fQlJUQUIgYW5kIFJfSFBQQV9FTkRfQlJUQUIuICAqLworI2lmZGVmIE9CSl9TT00KKyAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5UUlkKKyAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRVhJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9CUlRBQgorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfQlJUQUIKKyAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fVFJZKQorICAgIHJldHVybiAxOworCisgIC8qIERpc2d1c3RpbmcuICBXZSBtdXN0IHNldCBmeF9vZmZzZXQgb3Vyc2VsdmVzIC0tIFJfSFBQQV9FTkRfVFJZCisgICAgIGZpeHVwcyBhcmUgY29uc2lkZXJlZCBub3QgYWRqdXN0YWJsZSwgd2hpY2ggaW4gdHVybiBjYXVzZXMKKyAgICAgYWRqdXN0X3JlbG9jX3N5bXMgdG8gbm90IHNldCBmeF9vZmZzZXQuICBVZ2guICAqLworICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfVFJZKQorICAgIHsKKyAgICAgIGZpeFAtPmZ4X29mZnNldCA9ICp2YWxwOworICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisKKyAgLyogVGhlcmUgc2hvdWxkIGhhdmUgYmVlbiBhbiBIUFBBIHNwZWNpZmljIGZpeHVwIGFzc29jaWF0ZWQKKyAgICAgd2l0aCB0aGUgR0FTIGZpeHVwLiAgKi8KKyAgaWYgKGhwcGFfZml4UCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGJ1Zl93ZCA9IGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZm10ID0gYmZkX2hwcGFfaW5zbjJmbXQgKGJ1Zl93ZCk7CisKKyAgICAgIC8qIElmIHRoZXJlIGlzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpeHVwLCB0aGVuIGl0J3Mgc29tZXRoaW5nCisJIHdoaWNoIHdpbGwgbmVlZCBhIFNPTSByZWxvY2F0aW9uIChleGNlcHQgZm9yIHNvbWUgUEMtcmVsYXRpdmUgcmVsb2NzKS4KKwkgSW4gc3VjaCBjYXNlcyB3ZSBzaG91bGQgdHJlYXQgdGhlICJ2YWwiIG9yICJhZGRlbmQiIGFzIHplcm8gc2luY2UgaXQKKwkgd2lsbCBiZSBhZGRlZCBpbiBhcyBuZWVkZWQgZnJvbSBmeF9vZmZzZXQgaW4gdGNfZ2VuX3JlbG9jLiAgKi8KKyAgICAgIGlmICgoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAorCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfTk9ORSkKKyNpZmRlZiBPQkpfU09NCisJICAmJiBmbXQgIT0gMzIKKyNlbmRpZgorCSAgKQorCW5ld192YWwgPSAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcpID8gOCA6IDApOworI2lmZGVmIE9CSl9TT00KKyAgICAgIC8qIFRoZXNlIGZpZWxkIHNlbGVjdG9ycyBpbXBseSB0aGF0IHdlIGRvIG5vdCB3YW50IGFuIGFkZGVuZC4gICovCisgICAgICBlbHNlIGlmIChocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCisJICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCisJICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsCisJICAgICAgIHx8IGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3RzZWwKKwkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcnRzZWwKKwkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfbHRzZWwpCisJbmV3X3ZhbCA9ICgoZm10ID09IDEyIHx8IGZtdCA9PSAxNykgPyA4IDogMCk7CisgICAgICAvKiBUaGlzIGlzIHRydWVseSBkaXNndXN0aW5nLiAgVGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBibGluZGx5CisJIGFkZHMgaW4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYmVpbmcgcmVsb2NhdGVkIGFnYWluc3QuICBEYW1uISAgKi8KKyAgICAgIGVsc2UgaWYgKGZtdCA9PSAzMgorCSAgICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCisJICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBiZmRfY29tX3NlY3Rpb25fcHRyKQorCW5ld192YWwgPSBocHBhX2ZpZWxkX2FkanVzdCAoKnZhbHAgLSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpLAorCQkJCSAgICAgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKKyNlbmRpZgorICAgICAgZWxzZQorCW5ld192YWwgPSBocHBhX2ZpZWxkX2FkanVzdCAoKnZhbHAsIDAsIGhwcGFfZml4UC0+Znhfcl9maWVsZCk7CisKKyAgICAgIC8qIEhhbmRsZSBwYy1yZWxhdGl2ZSBleGNlcHRpb25zIGZyb20gYWJvdmUuICAqLworI2RlZmluZSBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQoQ0FMTEVSLCBDQUxMRUUpIFwKKyAgKChDQUxMRUUpICYmIChDQUxMRVIpICYmICgoQ0FMTEVFKSAhPSAoQ0FMTEVSKSkpCisgICAgICBpZiAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcpCisJICAmJiBmaXhQLT5meF9hZGRzeQorCSAgJiYgZml4UC0+ZnhfcGNyZWwKKwkgICYmICFhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQgKChsb25nKSAoKG9ial9zeW1ib2xfdHlwZSAqKQorCQkJZml4UC0+ZnhfYWRkc3ktPmJzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jLAorCQkJCSAgICBocHBhX2ZpeFAtPmZ4X2FyZ19yZWxvYykKKwkgICYmICgoaW50KSgqdmFscCkgPiAtMjYyMTQ0ICYmIChpbnQpKCp2YWxwKSA8IDI2MjE0MykKKwkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSBocHBhX2ZpeFAtPnNlZ21lbnQKKwkgICYmICEoZml4UC0+Znhfc3Vic3kKKwkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpICE9IGhwcGFfZml4UC0+c2VnbWVudCkpCisJICAgICAgCisJbmV3X3ZhbCA9IGhwcGFfZmllbGRfYWRqdXN0ICgqdmFscCwgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKKyN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKKwkKKyAgICAgIHN3aXRjaCAoZm10KQorCXsKKwkvKiBIYW5kbGUgYWxsIG9wY29kZXMgd2l0aCB0aGUgJ2onIG9wZXJhbmQgdHlwZS4gICovCisJY2FzZSAxNDoKKwkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCA4MTkxLCAtODE5MiwgMCk7CisKKwkgIC8qIE1hc2sgb2ZmIDE0IGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCisJICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCisJCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZmMwMDAsCisJCSAgICAgIGJ1Zik7CisJICBsb3dfc2lnbl91bmV4dCAobmV3X3ZhbCwgMTQsICZyZXN1bHRpKTsKKwkgIHJlc3VsdCA9IHJlc3VsdGk7CisJICBicmVhazsKKworCS8qIEhhbmRsZSBhbGwgb3Bjb2RlcyB3aXRoIHRoZSAnaycgb3BlcmFuZCB0eXBlLiAgKi8KKwljYXNlIDIxOgorCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDIwOTcxNTIsIDAsIDApOworCisJICAvKiBNYXNrIG9mZiAyMSBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLworCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAorCQkgICAgICBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZTAwMDAwLAorCQkgICAgICBidWYpOworCSAgZGlzX2Fzc2VtYmxlXzIxIChuZXdfdmFsLCAmcmVzdWx0aSk7CisJICByZXN1bHQgPSByZXN1bHRpOworCSAgYnJlYWs7CisKKwkvKiBIYW5kbGUgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlICdpJyBvcGVyYW5kIHR5cGUuICAqLworCWNhc2UgMTE6CisJICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMTAyMywgLTEwMjMsIDApOworCisJICAvKiBNYXNrIG9mZiAxMSBiaXRzIHRvIGJlIGNoYW5nZWQuICAqLworCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAorCQkgICAgICBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1ZikgJiAweGZmZmY4MDAsCisJCSAgICAgIGJ1Zik7CisJICBsb3dfc2lnbl91bmV4dCAobmV3X3ZhbCwgMTEsICZyZXN1bHRpKTsKKwkgIHJlc3VsdCA9IHJlc3VsdGk7CisJICBicmVhazsKKworCS8qIEhhbmRsZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ3cnIG9wZXJhbmQgdHlwZS4gICovCisJY2FzZSAxMjoKKwkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCA4MTk5LCAtODE4NCwgMCk7CisKKwkgIC8qIE1hc2sgb2ZmIDExIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCisJICBzaWduX3VuZXh0ICgobmV3X3ZhbCAtIDgpID4+IDIsIDEyLCAmcmVzdWx0aSk7CisJICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCisJCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZmUwMDIsCisJCSAgICAgIGJ1Zik7CisKKwkgIGRpc19hc3NlbWJsZV8xMiAocmVzdWx0aSwgJncxLCAmdyk7CisJICByZXN1bHQgPSAoKHcxIDw8IDIpIHwgdyk7CisJICBicmVhazsKKworCS8qIEhhbmRsZSBzb21lIG9mIHRoZSBvcGNvZGVzIHdpdGggdGhlICdXJyBvcGVyYW5kIHR5cGUuICAqLworCWNhc2UgMTc6CisJICB7CisJICAgIGludCBkaXN0YW5jZSA9ICp2YWxwOworCisJICAgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAyNjIxNDMsIC0yNjIxNDQsIDApOworCisJICAgIC8qIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIChpZSBubyBsaW5rKSB3aXRoIGFuIG91dCBvZgorCSAgICAgICByYW5nZSB0YXJnZXQsIHRoZW4gd2Ugd2FudCB0byBjb21wbGFpbi4gICovCisJICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX1BDUkVMX0NBTEwKKwkJJiYgKGRpc3RhbmNlID4gMjYyMTQzIHx8IGRpc3RhbmNlIDwgLTI2MjE0NCkKKwkJJiYgKGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMDAwMDApID09IDB4ZTgwMDAwMDApCisJICAgICAgQ0hFQ0tfRklFTEQgKGRpc3RhbmNlLCAyNjIxNDMsIC0yNjIxNDQsIDApOworCisJICAgIC8qIE1hc2sgb2ZmIDE3IGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCisJICAgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKKwkJCWJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMGUwMDIsCisJCQlidWYpOworCSAgICBzaWduX3VuZXh0ICgobmV3X3ZhbCAtIDgpID4+IDIsIDE3LCAmcmVzdWx0aSk7CisJICAgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0aSwgJncxLCAmdzIsICZ3KTsKKwkgICAgcmVzdWx0ID0gKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIDMyOgorCSAgcmVzdWx0ID0gMDsKKwkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwgbmV3X3ZhbCwgYnVmKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFzX2JhZCAoXygiVW5rbm93biByZWxvY2F0aW9uIGVuY291bnRlcmVkIGluIG1kX2FwcGx5X2ZpeC4iKSk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIEluc2VydCB0aGUgcmVsb2NhdGlvbi4gICovCisgICAgICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSB8IHJlc3VsdCwgYnVmKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoXygibm8gaHBwYV9maXh1cCBlbnRyeSBmb3IgdGhpcyBmaXh1cCAoZml4UCA9IDB4JXgsIHR5cGUgPSAweCV4KVxuIiksCisJICAgICAgKHVuc2lnbmVkIGludCkgZml4UCwgZml4UC0+Znhfcl90eXBlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPworICAgT24gdGhlIFBBLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQuICAqLworCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworfQorCisvKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgaW5wdXQgbGluZSBwb2ludGVyIGlzIGF0IHRoZSBlbmQgb2YKKyAgIGEgc3RhdGVtZW50LiAgKi8KKworc3RhdGljIGludAoraXNfZW5kX29mX3N0YXRlbWVudCAoKQoreworICByZXR1cm4gKCgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCisJICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnOycpCisJICB8fCAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIScpKTsKK30KKworLyogUmVhZCBhIG51bWJlciBmcm9tIFMuICBUaGUgbnVtYmVyIG1pZ2h0IGNvbWUgaW4gb25lIG9mIG1hbnkgZm9ybXMsCisgICB0aGUgbW9zdCBjb21tb24gd2lsbCBiZSBhIGhleCBvciBkZWNpbWFsIGNvbnN0YW50LCBidXQgaXQgY291bGQgYmUKKyAgIGEgcHJlLWRlZmluZWQgcmVnaXN0ZXIgKFl1ayEpLCBvciBhbiBhYnNvbHV0ZSBzeW1ib2wuCisKKyAgIFJldHVybiBhIG51bWJlciBvciAtMSBmb3IgZmFpbHVyZS4KKworICAgV2hlbiBwYXJzaW5nIFBBLTg5IEZQIHJlZ2lzdGVyIG51bWJlcnMgUkVTVUxUIHdpbGwgYmUKKyAgIHRoZSBhZGRyZXNzIG9mIGEgc3RydWN0dXJlIHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dAorICAgTC9SIGhhbGYgb2YgRlAgcmVnaXN0ZXJzLCBzdG9yZSByZXN1bHRzIHRoZXJlIGFzIGFwcHJvcHJpYXRlLgorCisgICBwYV9wYXJzZV9udW1iZXIgY2FuIG5vdCBoYW5kbGUgbmVnYXRpdmUgY29uc3RhbnRzIGFuZCB3aWxsIGZhaWwKKyAgIGhvcnJpYmx5IGlmIGl0IGlzIHBhc3NlZCBzdWNoIGEgY29uc3RhbnQuICAqLworCitzdGF0aWMgaW50CitwYV9wYXJzZV9udW1iZXIgKHMsIHJlc3VsdCkKKyAgICAgY2hhciAqKnM7CisgICAgIHN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0ICpyZXN1bHQ7Cit7CisgIGludCBudW07CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgYzsKKyAgc3ltYm9sUyAqc3ltOworICBpbnQgc3RhdHVzOworICBjaGFyICpwID0gKnM7CisKKyAgLyogU2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgbnVtYmVyLiAgKi8KKyAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorICAgIHAgPSBwICsgMTsKKworICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KKyAgaWYgKHJlc3VsdCkKKyAgICB7CisgICAgICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gLTE7CisgICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAtMTsKKyAgICB9CisgIG51bSA9IC0xOworCisgIGlmIChpc2RpZ2l0ICgqcCkpCisgICAgeworICAgICAgLyogTG9va3MgbGlrZSBhIG51bWJlci4gICovCisgICAgICBudW0gPSAwOworCisgICAgICBpZiAoKnAgPT0gJzAnICYmICgqKHAgKyAxKSA9PSAneCcgfHwgKihwICsgMSkgPT0gJ1gnKSkKKwl7CisJICAvKiBUaGUgbnVtYmVyIGlzIHNwZWNpZmllZCBpbiBoZXguICAqLworCSAgcCArPSAyOworCSAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCisJCSB8fCAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpKQorCSAgICB7CisJICAgICAgaWYgKGlzZGlnaXQgKCpwKSkKKwkJbnVtID0gbnVtICogMTYgKyAqcCAtICcwJzsKKwkgICAgICBlbHNlIGlmICgqcCA+PSAnYScgJiYgKnAgPD0gJ2YnKQorCQludW0gPSBudW0gKiAxNiArICpwIC0gJ2EnICsgMTA7CisJICAgICAgZWxzZQorCQludW0gPSBudW0gKiAxNiArICpwIC0gJ0EnICsgMTA7CisJICAgICAgKytwOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBudW1iZXIgaXMgc3BlY2lmaWVkIGluIGRlY2ltYWwuICAqLworCSAgd2hpbGUgKGlzZGlnaXQgKCpwKSkKKwkgICAgeworCSAgICAgIG51bSA9IG51bSAqIDEwICsgKnAgLSAnMCc7CisJICAgICAgKytwOworCSAgICB9CisJfQorCisgICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgdGhlIGNhbGxlci4gICovCisgICAgICBpZiAocmVzdWx0KQorCXsKKwkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07CisKKwkgIGlmIChJU19SX1NFTEVDVCAocCkpCisJICAgIHsKKwkgICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOworCSAgICAgICsrcDsKKwkgICAgfQorCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHApKQorCSAgICB7CisJICAgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKKwkgICAgICArK3A7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKKwl9CisgICAgfQorICBlbHNlIGlmICgqcCA9PSAnJScpCisgICAgeworICAgICAgLyogVGhlIG51bWJlciBtaWdodCBiZSBhIHByZWRlZmluZWQgcmVnaXN0ZXIuICAqLworICAgICAgbnVtID0gMDsKKyAgICAgIG5hbWUgPSBwOworICAgICAgcCsrOworICAgICAgYyA9ICpwOworICAgICAgLyogVGVnZSBoYWNrOiBTcGVjaWFsIGNhc2UgZm9yIGdlbmVyYWwgcmVnaXN0ZXJzIGFzIHRoZSBnZW5lcmFsCisgICAgICAgICBjb2RlIG1ha2VzIGEgYmluYXJ5IHNlYXJjaCB3aXRoIGNhc2UgdHJhbnNsYXRpb24sIGFuZCBpcyBWRVJZCisgICAgICAgICBzbG93LiAqLworICAgICAgaWYgKGMgPT0gJ3InKQorCXsKKwkgIHArKzsKKwkgIGlmICgqcCA9PSAnZScgJiYgKihwICsgMSkgPT0gJ3QnCisJICAgICAgJiYgKCoocCArIDIpID09ICcwJyB8fCAqKHAgKyAyKSA9PSAnMScpKQorCSAgICB7CisJICAgICAgcCArPSAyOworCSAgICAgIG51bSA9ICpwIC0gJzAnICsgMjg7CisJICAgICAgcCsrOworCSAgICB9CisJICBlbHNlIGlmICgqcCA9PSAncCcpCisJICAgIHsKKwkgICAgICBudW0gPSAyOworCSAgICAgIHArKzsKKwkgICAgfQorCSAgZWxzZSBpZiAoIWlzZGlnaXQgKCpwKSkKKwkgICAgeworCSAgICAgIGlmIChwcmludF9lcnJvcnMpCisJCWFzX2JhZCAoXygiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIpLCBuYW1lKTsKKwkgICAgICBudW0gPSAtMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZG8KKwkJbnVtID0gbnVtICogMTAgKyAqcCsrIC0gJzAnOworCSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcCkpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIERvIGEgbm9ybWFsIHJlZ2lzdGVyIHNlYXJjaC4gICovCisJICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjKSkKKwkgICAgeworCSAgICAgIHAgPSBwICsgMTsKKwkgICAgICBjID0gKnA7CisJICAgIH0KKwkgICpwID0gMDsKKwkgIHN0YXR1cyA9IHJlZ19uYW1lX3NlYXJjaCAobmFtZSk7CisJICBpZiAoc3RhdHVzID49IDApCisJICAgIG51bSA9IHN0YXR1czsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChwcmludF9lcnJvcnMpCisJCWFzX2JhZCAoXygiVW5kZWZpbmVkIHJlZ2lzdGVyOiAnJXMnLiIpLCBuYW1lKTsKKwkgICAgICBudW0gPSAtMTsKKwkgICAgfQorCSAgKnAgPSBjOworCX0KKworICAgICAgLyogU3RvcmUgaW5mbyBpbiBSRVNVTFQgaWYgcmVxdWVzdGVkIGJ5IGNhbGxlci4gICovCisgICAgICBpZiAocmVzdWx0KQorCXsKKwkgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSBudW07CisJICBpZiAoSVNfUl9TRUxFQ1QgKHAgLSAxKSkKKwkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMTsKKwkgIGVsc2UgaWYgKElTX0xfU0VMRUNUIChwIC0gMSkpCisJICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7CisJICBlbHNlCisJICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFuZCBmaW5hbGx5LCBpdCBjb3VsZCBiZSBhIHN5bWJvbCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiB3aGljaAorICAgICAgICAgaXMgZWZmZWN0aXZlbHkgYSBjb25zdGFudC4gICovCisgICAgICBudW0gPSAwOworICAgICAgbmFtZSA9IHA7CisgICAgICBjID0gKnA7CisgICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjKSkKKwl7CisJICBwID0gcCArIDE7CisJICBjID0gKnA7CisJfQorICAgICAgKnAgPSAwOworICAgICAgaWYgKChzeW0gPSBzeW1ib2xfZmluZCAobmFtZSkpICE9IE5VTEwpCisJeworCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbikKKwkgICAgbnVtID0gU19HRVRfVkFMVUUgKHN5bSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAocHJpbnRfZXJyb3JzKQorCQlhc19iYWQgKF8oIk5vbi1hYnNvbHV0ZSBzeW1ib2w6ICclcycuIiksIG5hbWUpOworCSAgICAgIG51bSA9IC0xOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZXJlIGlzIHdoZXJlIHdlJ2QgY29tZSBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbAorCSAgICAgb3IgZm9yIGFuIGVtcHR5IHN0cmluZy4gIEZvciBhbiBlbXB0eSBzdHJpbmcgd2UKKwkgICAgIHdpbGwgcmV0dXJuIHplcm8uICBUaGF0J3MgYSBjb25jZXNzaW9uIG1hZGUgZm9yCisJICAgICBjb21wYXRhYmlsaXR5IHdpdGggdGhlIGJyYWluZGFtYWdlZCBIUCBhc3NlbWJsZXJzLiAgKi8KKwkgIGlmICgqbmFtZSA9PSAwKQorCSAgICBudW0gPSAwOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHByaW50X2Vycm9ycykKKwkJYXNfYmFkIChfKCJVbmRlZmluZWQgYWJzb2x1dGUgY29uc3RhbnQ6ICclcycuIiksIG5hbWUpOworCSAgICAgIG51bSA9IC0xOworCSAgICB9CisJfQorICAgICAgKnAgPSBjOworCisgICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KKyAgICAgIGlmIChyZXN1bHQpCisJeworCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKKwkgIGlmIChJU19SX1NFTEVDVCAocCAtIDEpKQorCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOworCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHAgLSAxKSkKKwkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKKwkgIGVsc2UKKwkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKKwl9CisgICAgfQorCisgICpzID0gcDsKKyAgcmV0dXJuIG51bTsKK30KKworI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKQorCisvKiBHaXZlbiBOQU1FLCBmaW5kIHRoZSByZWdpc3RlciBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZSwgcmV0dXJuCisgICB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgLTEgb24gZmFpbHVyZS4gICovCisKK3N0YXRpYyBpbnQKK3JlZ19uYW1lX3NlYXJjaCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaW50IG1pZGRsZSwgbG93LCBoaWdoOworICBpbnQgY21wOworCisgIGxvdyA9IDA7CisgIGhpZ2ggPSBSRUdfTkFNRV9DTlQgLSAxOworCisgIGRvCisgICAgeworICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLm5hbWUpOworICAgICAgaWYgKGNtcCA8IDApCisJaGlnaCA9IG1pZGRsZSAtIDE7CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCWxvdyA9IG1pZGRsZSArIDE7CisgICAgICBlbHNlCisJcmV0dXJuIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLnZhbHVlOworICAgIH0KKyAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKKworICByZXR1cm4gLTE7Cit9CisKKworLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGdpdmVuIElOU04gYW5kIEwvUiBpbmZvcm1hdGlvbiB3aWxsIHJlcXVpcmUKKyAgIGEgbmV3IFBBLTEuMSBvcGNvZGUuICAqLworCitzdGF0aWMgaW50CituZWVkX3BhMTFfb3Bjb2RlIChpbnNuLCByZXN1bHQpCisgICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKKyAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKnJlc3VsdDsKK3sKKyAgaWYgKHJlc3VsdC0+bF9yX3NlbGVjdCA9PSAxICYmICEoaW5zbi0+ZnBvZjEgPT0gREJMICYmIGluc24tPmZwb2YyID09IERCTCkpCisgICAgeworICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLAorCSB0aGVuIHNldCBhIG5ldyBhcmNoaXRlY3R1cmUuICAqLworICAgICAgaWYgKGJmZF9nZXRfbWFjaCAoc3Rkb3V0cHV0KSA8IHBhMTEpCisJeworCSAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCBwYTExKSkKKwkgICAgYXNfd2FybiAoXygiY291bGQgbm90IHVwZGF0ZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7CisJfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKiBQYXJzZSBhIGNvbmRpdGlvbiBmb3IgYSBmY21wIGluc3RydWN0aW9uLiAgUmV0dXJuIHRoZSBudW1lcmljYWwKKyAgIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25kaXRpb24uICAqLworCitzdGF0aWMgaW50CitwYV9wYXJzZV9mcF9jbXBfY29uZCAocykKKyAgICAgY2hhciAqKnM7Cit7CisgIGludCBjb25kLCBpOworCisgIGNvbmQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsIGZwX2NvbmRfbWFwW2ldLnN0cmluZywKKwkJICAgICAgIHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKSkgPT0gMCkKKwl7CisJICBjb25kID0gZnBfY29uZF9tYXBbaV0uY29uZDsKKwkgICpzICs9IHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKTsKKwkgIC8qIElmIG5vdCBhIGNvbXBsZXRlIG1hdGNoLCBiYWNrIHVwIHRoZSBpbnB1dCBzdHJpbmcgYW5kCisJICAgICByZXBvcnQgYW4gZXJyb3IuICAqLworCSAgaWYgKCoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCisJICAgIHsKKwkgICAgICAqcyAtPSBzdHJsZW4gKGZwX2NvbmRfbWFwW2ldLnN0cmluZyk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHdoaWxlICgqKnMgPT0gJyAnIHx8ICoqcyA9PSAnXHQnKQorCSAgICAqcyA9ICpzICsgMTsKKwkgIHJldHVybiBjb25kOworCX0KKyAgICB9CisKKyAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIENvbXBhcmUgQ29uZGl0aW9uOiAlcyIpLCAqcyk7CisKKyAgLyogQWR2YW5jZSBvdmVyIHRoZSBib2d1cyBjb21wbGV0ZXIuICAqLworICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQorICAgICpzICs9IDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUGFyc2UgYW4gRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyIHJldHVybmluZyB0aGUgY29tcGxldGVyCisgICB0eXBlLiAgKi8KKworc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0CitwYV9wYXJzZV9mcF9mb3JtYXQgKHMpCisgICAgIGNoYXIgKipzOworeworICBpbnQgZm9ybWF0OworCisgIGZvcm1hdCA9IFNHTDsKKyAgaWYgKCoqcyA9PSAnLCcpCisgICAgeworICAgICAgKnMgKz0gMTsKKyAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJzZ2wiLCAzKSA9PSAwKQorCXsKKwkgIGZvcm1hdCA9IFNHTDsKKwkgICpzICs9IDQ7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAiZGJsIiwgMykgPT0gMCkKKwl7CisJICBmb3JtYXQgPSBEQkw7CisJICAqcyArPSA0OworCX0KKyAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wICgqcywgInF1YWQiLCA0KSA9PSAwKQorCXsKKwkgIGZvcm1hdCA9IFFVQUQ7CisJICAqcyArPSA1OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmb3JtYXQgPSBJTExFR0FMX0ZNVDsKKwkgIGFzX2JhZCAoXygiSW52YWxpZCBGUCBPcGVyYW5kIEZvcm1hdDogJTNzIiksICpzKTsKKwl9CisgICAgfQorCisgIHJldHVybiBmb3JtYXQ7Cit9CisKKy8qIENvbnZlcnQgZnJvbSBhIHNlbGVjdG9yIHN0cmluZyBpbnRvIGEgc2VsZWN0b3IgdHlwZS4gICovCisKK3N0YXRpYyBpbnQKK3BhX2Noa19maWVsZF9zZWxlY3RvciAoc3RyKQorICAgICBjaGFyICoqc3RyOworeworICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7CisgIGludCBjbXA7CisgIGNoYXIgbmFtZVs0XTsKKworICAvKiBSZWFkIHBhc3QgYW55IHdoaXRlc3BhY2UuICAqLworICAvKiBGSVhNRTogc2hvdWxkIHdlIHJlYWQgcGFzdCBuZXdsaW5lcyBhbmQgZm9ybWZlZWRzPz8/ICovCisgIHdoaWxlICgqKnN0ciA9PSAnICcgfHwgKipzdHIgPT0gJ1x0JyB8fCAqKnN0ciA9PSAnXG4nIHx8ICoqc3RyID09ICdcZicpCisgICAgKnN0ciA9ICpzdHIgKyAxOworCisgIGlmICgoKnN0cilbMV0gPT0gJ1wnJyB8fCAoKnN0cilbMV0gPT0gJyUnKQorICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAorICAgIG5hbWVbMV0gPSAwOworICBlbHNlIGlmICgoKnN0cilbMl0gPT0gJ1wnJyB8fCAoKnN0cilbMl0gPT0gJyUnKQorICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAorICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAorICAgIG5hbWVbMl0gPSAwOworI2lmZGVmIE9CSl9TT00KKyAgZWxzZSBpZiAoKCpzdHIpWzNdID09ICdcJycgfHwgKCpzdHIpWzNdID09ICclJykKKyAgICBuYW1lWzBdID0gdG9sb3dlciAoKCpzdHIpWzBdKSwKKyAgICBuYW1lWzFdID0gdG9sb3dlciAoKCpzdHIpWzFdKSwKKyAgICBuYW1lWzJdID0gdG9sb3dlciAoKCpzdHIpWzJdKSwKKyAgICBuYW1lWzNdID0gMDsKKyNlbmRpZgorICBlbHNlCisgICAgcmV0dXJuIGVfZnNlbDsKKworICBsb3cgPSAwOworICBoaWdoID0gc2l6ZW9mIChzZWxlY3Rvcl90YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBzZWxlY3Rvcl9lbnRyeSkgLSAxOworCisgIGRvCisgICAgeworICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIGNtcCA9IHN0cmNtcCAobmFtZSwgc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5wcmVmaXgpOworICAgICAgaWYgKGNtcCA8IDApCisJaGlnaCA9IG1pZGRsZSAtIDE7CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCWxvdyA9IG1pZGRsZSArIDE7CisgICAgICBlbHNlCisJeworCSAgKnN0ciArPSBzdHJsZW4gKG5hbWUpICsgMTsKKyNpZm5kZWYgT0JKX1NPTQorCSAgaWYgKHNlbGVjdG9yX3RhYmxlW21pZGRsZV0uZmllbGRfc2VsZWN0b3IgPT0gZV9uc2VsKQorCSAgICByZXR1cm4gZV9mc2VsOworI2VuZGlmCisJICByZXR1cm4gc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvcjsKKwl9CisgICAgfQorICB3aGlsZSAobG93IDw9IGhpZ2gpOworCisgIHJldHVybiBlX2ZzZWw7Cit9CisKKy8qIE1hcmsgKHZpYSBleHByX2VuZCkgdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIChJIHRoaW5rKS4gIEZJWE1FLiAgKi8KKworc3RhdGljIGludAorZ2V0X2V4cHJlc3Npb24gKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICpzYXZlX2luOworICBhc2VjdGlvbiAqc2VnOworCisgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKyAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7CisgIGlmICghKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCisJfHwgc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCisJfHwgU0VHX05PUk1BTCAoc2VnKSkpCisgICAgeworICAgICAgYXNfd2FybiAoXygiQmFkIHNlZ21lbnQgaW4gZXhwcmVzc2lvbi4iKSk7CisgICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOworICByZXR1cm4gMDsKK30KKworLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBGSVhNRS4gKi8KK3N0YXRpYyBpbnQKK3BhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIChpbnNuLCBzdHJwKQorICAgICBzdHJ1Y3QgcGFfaXQgKmluc247CisgICAgIGNoYXIgKipzdHJwOworeworICBjaGFyICpzYXZlX2luOworCisgIGluc24tPmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHJwKTsKKyAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7CisgIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOworICAvKiBUaGlzIGlzIG5vdCBwZXJmZWN0LCBidXQgaXMgYSBodWdlIGltcHJvdmVtZW50IG92ZXIgZG9pbmcgbm90aGluZy4KKworICAgICBUaGUgUEEgYXNzZW1ibHkgc3ludGF4IGlzIGFtYmlnaW91cyBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gIENvbnNpZGVyCisgICAgIHRoaXMgc3RyaW5nICI0ICVyNSIgIElzIHRoYXQgdGhlIG51bWJlciA0IGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlcgorICAgICByNSwgb3IgaXMgdGhhdCA0IE1PRCA1PworCisgICAgIElmIHdlIGdldCBhIG1vZHVsbyBleHByZXNpb24gV2hlbiBsb29raW5nIGZvciBhbiBhYnNvbHV0ZSwgd2UgdHJ5CisgICAgIGFnYWluIGN1dHRpbmcgb2ZmIHRoZSBpbnB1dCBzdHJpbmcgYXQgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAgKi8KKyAgaWYgKGluc24tPmV4cC5YX29wID09IE9fbW9kdWx1cykKKyAgICB7CisgICAgICBjaGFyICpzLCBjOworICAgICAgaW50IHJldHZhbDsKKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cnA7CisgICAgICBzID0gKnN0cnA7CisgICAgICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQorICAgICAgICBzKys7CisKKyAgICAgIGMgPSAqczsKKyAgICAgICpzID0gMDsKKworICAgICAgcmV0dmFsID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApOworCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOworICAgICAgKnMgPSBjOworICAgICAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKKyAgICB9CisgIGlmIChpbnNuLT5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiQmFkIHNlZ21lbnQgKHNob3VsZCBiZSBhYnNvbHV0ZSkuIikpOworICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKyAgcmV0dXJuIGV2YWx1YXRlX2Fic29sdXRlIChpbnNuKTsKK30KKworLyogRXZhbHVhdGUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBFWFAgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJ5CisgICB0aGUgc2VsZWN0b3IgRklFTERfU0VMRUNUT1IuICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgKi8KK3N0YXRpYyBpbnQKK2V2YWx1YXRlX2Fic29sdXRlIChpbnNuKQorICAgICBzdHJ1Y3QgcGFfaXQgKmluc247Cit7CisgIGludCB2YWx1ZTsKKyAgZXhwcmVzc2lvblMgZXhwOworICBpbnQgZmllbGRfc2VsZWN0b3IgPSBpbnNuLT5maWVsZF9zZWxlY3RvcjsKKworICBleHAgPSBpbnNuLT5leHA7CisgIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKKworICBzd2l0Y2ggKGZpZWxkX3NlbGVjdG9yKQorICAgIHsKKyAgICAvKiBObyBjaGFuZ2UuICAqLworICAgIGNhc2UgZV9mc2VsOgorICAgICAgYnJlYWs7CisKKyAgICAvKiBJZiBiaXQgMjEgaXMgb24gdGhlbiBhZGQgMHg4MDAgYW5kIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCisgICAgY2FzZSBlX2xzc2VsOgorICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKKwl2YWx1ZSArPSAweDgwMDsKKyAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7CisgICAgICBicmVhazsKKworICAgIC8qIFNpZ24gZXh0ZW5kIGZyb20gYml0IDIxLiAgKi8KKyAgICBjYXNlIGVfcnNzZWw6CisgICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQorCXZhbHVlIHw9IDB4ZmZmZmY4MDA7CisgICAgICBlbHNlCisJdmFsdWUgJj0gMHg3ZmY7CisgICAgICBicmVhazsKKworICAgIC8qIEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCisgICAgY2FzZSBlX2xzZWw6CisgICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOworICAgICAgYnJlYWs7CisKKyAgICAvKiBTZXQgYml0cyAwLTIwIHRvIHplcm8uICAqLworICAgIGNhc2UgZV9yc2VsOgorICAgICAgdmFsdWUgPSB2YWx1ZSAmIDB4N2ZmOworICAgICAgYnJlYWs7CisKKyAgICAvKiBBZGQgMHg4MDAgYW5kIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQgMTEgYml0cy4gICovCisgICAgY2FzZSBlX2xkc2VsOgorICAgICAgdmFsdWUgKz0gMHg4MDA7CisgICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOworICAgICAgYnJlYWs7CisKKyAgICAvKiBTZXQgYml0Z3MgMC0yMSB0byBvbmUuICAqLworICAgIGNhc2UgZV9yZHNlbDoKKyAgICAgIHZhbHVlIHw9IDB4ZmZmZmY4MDA7CisgICAgICBicmVhazsKKworI2RlZmluZSBSU0VMX1JPVU5EKGMpICAoKChjKSArIDB4MTAwMCkgJiB+MHgxZmZmKQorICAgIGNhc2UgZV9ycnNlbDoKKyAgICAgIHZhbHVlID0gKFJTRUxfUk9VTkQgKHZhbHVlKSAmIDB4N2ZmKSArICh2YWx1ZSAtIFJTRUxfUk9VTkQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZV9scnNlbDoKKyAgICAgIHZhbHVlID0gKFJTRUxfUk9VTkQgKHZhbHVlKSA+PiAxMSkgJiAweDFmZmZmZjsKKyAgICAgIGJyZWFrOworI3VuZGVmIFJTRUxfUk9VTkQKKworICAgIGRlZmF1bHQ6CisgICAgICBCQURfQ0FTRSAoZmllbGRfc2VsZWN0b3IpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gdmFsdWU7Cit9CisKKy8qIEdpdmVuIGFuIGFyZ3VtZW50IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gcmV0dXJuIHRoZSBhc3NvY2lhdGVkCisgICBhcmd1bWVudCBsb2NhdGlvbiBudW1iZXIuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitwYV9idWlsZF9hcmdfcmVsb2MgKHR5cGVfbmFtZSkKKyAgICAgY2hhciAqdHlwZV9uYW1lOworeworCisgIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAibm8iLCAyKSA9PSAwKQorICAgIHJldHVybiAwOworICBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImdyIiwgMikgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImZyIiwgMikgPT0gMCkKKyAgICByZXR1cm4gMjsKKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHR5cGVfbmFtZSwgImZ1IiwgMikgPT0gMCkKKyAgICByZXR1cm4gMzsKKyAgZWxzZQorICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmd1bWVudCBsb2NhdGlvbjogJXNcbiIpLCB0eXBlX25hbWUpOworCisgIHJldHVybiAwOworfQorCisvKiBFbmNvZGUgYW5kIHJldHVybiBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHNwZWNpZmljYXRpb24gZm9yCisgICB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBhcmdfcmVsb2MuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitwYV9hbGlnbl9hcmdfcmVsb2MgKHJlZywgYXJnX3JlbG9jKQorICAgICB1bnNpZ25lZCBpbnQgcmVnOworICAgICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOworeworICB1bnNpZ25lZCBpbnQgbmV3X3JlbG9jOworCisgIG5ld19yZWxvYyA9IGFyZ19yZWxvYzsKKyAgc3dpdGNoIChyZWcpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIG5ld19yZWxvYyA8PD0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG5ld19yZWxvYyA8PD0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIG5ld19yZWxvYyA8PD0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG5ld19yZWxvYyA8PD0gMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIiksIHJlZyk7CisgICAgfQorCisgIHJldHVybiBuZXdfcmVsb2M7Cit9CisKKy8qIFBhcnNlIGEgUEEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgKCxuKS4gIFJldHVybiBub256ZXJvIGlmIHRoZQorICAgY29tcGxldGVyIHdhcyBmb3VuZDsgcmV0dXJuIHplcm8gaWYgbm8gY29tcGxldGVyIHdhcyBmb3VuZC4gICovCisKK3N0YXRpYyBpbnQKK3BhX3BhcnNlX251bGxpZiAocykKKyAgICAgY2hhciAqKnM7Cit7CisgIGludCBudWxsaWY7CisKKyAgbnVsbGlmID0gMDsKKyAgaWYgKCoqcyA9PSAnLCcpCisgICAgeworICAgICAgKnMgPSAqcyArIDE7CisgICAgICBpZiAoc3RybmNhc2VjbXAgKCpzLCAibiIsIDEpID09IDApCisJbnVsbGlmID0gMTsKKyAgICAgIGVsc2UKKwl7CisJICBhc19iYWQgKF8oIkludmFsaWQgTnVsbGlmaWNhdGlvbjogKCVjKSIpLCAqKnMpOworCSAgbnVsbGlmID0gMDsKKwl9CisgICAgICAqcyA9ICpzICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIG51bGxpZjsKK30KKworLyogUGFyc2UgYSBub24tbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbXBsZXRlciByZXR1cm5pbmcgdGhlCisgICBudW1iZXIgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KKworICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgorICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQorICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK3BhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyIChzLCBpc2JyYW5jaCkKKyAgICAgY2hhciAqKnM7CisgICAgIGludCBpc2JyYW5jaDsKK3sKKyAgaW50IGNtcGx0cjsKKyAgY2hhciAqbmFtZSA9ICpzICsgMTsKKyAgY2hhciBjOworICBjaGFyICpzYXZlX3MgPSAqczsKKyAgaW50IG51bGxpZnkgPSAwOworCisgIGNtcGx0ciA9IDA7CisgIGlmICgqKnMgPT0gJywnKQorICAgIHsKKyAgICAgICpzICs9IDE7CisgICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQorCSpzICs9IDE7CisgICAgICBjID0gKipzOworICAgICAgKipzID0gMHgwMDsKKworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCisJeworCSAgY21wbHRyID0gMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSAyOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSAzOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw8IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSA0OworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw8PSIpID09IDApCisJeworCSAgY21wbHRyID0gNTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQorCXsKKwkgIGNtcGx0ciA9IDY7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSA3OworCX0KKyAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCisgICAgICAgICBjb21wbGV0ZXIuICAqLworICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQorCXsKKwkgIGNtcGx0ciA9IDA7CisJICBudWxsaWZ5ID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY21wbHRyID0gLTE7CisJfQorICAgICAgKipzID0gYzsKKyAgICB9CisKKyAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KKyAgaWYgKG51bGxpZnkpCisgICAgKnMgPSBzYXZlX3M7CisKKworICByZXR1cm4gY21wbHRyOworfQorCisvKiBQYXJzZSBhIG5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZQorICAgbnVtYmVyIChmb3IgZW5jb2RpbmcgaW4gaW5zdHJ1dGlvbnMpIG9mIHRoZSBnaXZlbiBjb21wbGV0ZXIuCisKKyAgIElTQlJBTkNIIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHBhcnNpbmcgYSBjb25kaXRpb24KKyAgIGNvbXBsZXRlciBmb3IgYSBicmFuY2ggKHZzIGEgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXIgZm9yIGEKKyAgIGNvbXB1dGF0aW9uYWwgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgaW50CitwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciAocywgaXNicmFuY2gpCisgICAgIGNoYXIgKipzOworICAgICBpbnQgaXNicmFuY2g7Cit7CisgIGludCBjbXBsdHI7CisgIGNoYXIgKm5hbWUgPSAqcyArIDE7CisgIGNoYXIgYzsKKyAgY2hhciAqc2F2ZV9zID0gKnM7CisgIGludCBudWxsaWZ5ID0gMDsKKworICBjbXBsdHIgPSAwOworICBpZiAoKipzID09ICcsJykKKyAgICB7CisgICAgICAqcyArPSAxOworICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKKwkqcyArPSAxOworICAgICAgYyA9ICoqczsKKyAgICAgICoqcyA9IDB4MDA7CisKKworICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCisJeworCSAgY21wbHRyID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCisJeworCSAgY21wbHRyID0gMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCisJeworCSAgY21wbHRyID0gMjsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSAzOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4+PSIpID09IDApCisJeworCSAgY21wbHRyID0gNDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PiIpID09IDApCisJeworCSAgY21wbHRyID0gNTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSA2OworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCisJeworCSAgY21wbHRyID0gNzsKKwl9CisgICAgICAvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyBsaWtlIGFkZGIsbiB0aGVuIHRoZXJlIGlzIG5vIGNvbmRpdGlvbgorICAgICAgICAgY29tcGxldGVyLiAgKi8KKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiBpc2JyYW5jaCkKKwl7CisJICBjbXBsdHIgPSAwOworCSAgbnVsbGlmeSA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNtcGx0ciA9IC0xOworCX0KKyAgICAgICoqcyA9IGM7CisgICAgfQorCisgIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCisgIGlmIChudWxsaWZ5KQorICAgICpzID0gc2F2ZV9zOworCisKKyAgcmV0dXJuIGNtcGx0cjsKK30KKworCisvKiBQYXJzZSBhIG5vbi1uZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgorICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KKworICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgorICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQorICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK3BhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKKyAgICAgY2hhciAqKnM7CisgICAgIGludCBpc2JyYW5jaDsKK3sKKyAgaW50IGNtcGx0cjsKKyAgY2hhciAqbmFtZSA9ICpzICsgMTsKKyAgY2hhciBjOworICBjaGFyICpzYXZlX3MgPSAqczsKKworICBjbXBsdHIgPSAwOworICBpZiAoKipzID09ICcsJykKKyAgICB7CisgICAgICAqcyArPSAxOworICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKKwkqcyArPSAxOworICAgICAgYyA9ICoqczsKKyAgICAgICoqcyA9IDB4MDA7CisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCisJeworCSAgY21wbHRyID0gMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSAyOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSAzOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJudXYiKSA9PSAwKQorCXsKKwkgIGNtcGx0ciA9IDQ7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInpudiIpID09IDApCisJeworCSAgY21wbHRyID0gNTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQorCXsKKwkgIGNtcGx0ciA9IDY7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSA3OworCX0KKyAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCisgICAgICAgICBjb21wbGV0ZXIuICAqLworICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQorCXsKKwkgIGNtcGx0ciA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNtcGx0ciA9IC0xOworCX0KKyAgICAgICoqcyA9IGM7CisgICAgfQorCisgIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCisgIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCisgICAgKnMgPSBzYXZlX3M7CisKKyAgcmV0dXJuIGNtcGx0cjsKK30KKworLyogUGFyc2UgYSBuZWdhdGVkIGFkZGl0aW9uIGNvbXBsZXRlciByZXR1cm5pbmcgdGhlIG51bWJlcgorICAgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KKworICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgorICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQorICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbikuICAqLworCitzdGF0aWMgaW50CitwYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciAocywgaXNicmFuY2gpCisgICAgIGNoYXIgKipzOworICAgICBpbnQgaXNicmFuY2g7Cit7CisgIGludCBjbXBsdHI7CisgIGNoYXIgKm5hbWUgPSAqcyArIDE7CisgIGNoYXIgYzsKKyAgY2hhciAqc2F2ZV9zID0gKnM7CisKKyAgY21wbHRyID0gMDsKKyAgaWYgKCoqcyA9PSAnLCcpCisgICAgeworICAgICAgKnMgKz0gMTsKKyAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCisJKnMgKz0gMTsKKyAgICAgIGMgPSAqKnM7CisgICAgICAqKnMgPSAweDAwOworICAgICAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCisJeworCSAgY21wbHRyID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCisJeworCSAgY21wbHRyID0gMTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCisJeworCSAgY21wbHRyID0gMjsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSAzOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ1diIpID09IDApCisJeworCSAgY21wbHRyID0gNDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidm56IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSA1OworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQorCXsKKwkgIGNtcGx0ciA9IDY7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKKwl7CisJICBjbXBsdHIgPSA3OworCX0KKyAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCisgICAgICAgICBjb21wbGV0ZXIuICAqLworICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQorCXsKKwkgIGNtcGx0ciA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNtcGx0ciA9IC0xOworCX0KKyAgICAgICoqcyA9IGM7CisgICAgfQorCisgIC8qIFJlc2V0IHBvaW50ZXJzIGlmIHRoaXMgd2FzIHJlYWxseSBhICxuIGZvciBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gICovCisgIGlmIChjbXBsdHIgPT0gMCAmJiAqbmFtZSA9PSAnbicgJiYgaXNicmFuY2gpCisgICAgKnMgPSBzYXZlX3M7CisKKyAgcmV0dXJuIGNtcGx0cjsKK30KKworLyogSGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBTcGVjaWFsIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUKKyAgIGFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LiAgKi8KK3N0YXRpYyB2b2lkCitwYV9hbGlnbiAoYnl0ZXMpCit7CisgIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCisgIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOworCisgIC8qIExldCB0aGUgZ2VuZXJpYyBnYXMgY29kZSBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgKi8KKyAgc19hbGlnbl9ieXRlcyAoYnl0ZXMpOworCisgIC8qIElmIGJ5dGVzIGlzIGEgcG93ZXIgb2YgMiwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgc3Vic3BhY2UncworICAgICBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKGxvZzIgKGJ5dGVzKSAhPSAtMSkKKyAgICByZWNvcmRfYWxpZ25tZW50IChjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnLCBsb2cyIChieXRlcykpOworfQorCisvKiBIYW5kbGUgYSAuQkxPQ0sgdHlwZSBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfYmxvY2sgKHopCisgICAgIGludCB6OworeworICBjaGFyICpwOworICBsb25nIGludCB0ZW1wX2ZpbGw7CisgIHVuc2lnbmVkIGludCB0ZW1wX3NpemU7CisgIHVuc2lnbmVkIGludCBpOworCisgIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCisgIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOworCisgIHRlbXBfc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisgIC8qIEFsd2F5cyBmaWxsIHdpdGggemVyb3MsIHRoYXQncyB3aGF0IHRoZSBIUCBhc3NlbWJsZXIgZG9lcy4gICovCisgIHRlbXBfZmlsbCA9IDA7CisKKyAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAoaW50KSB0ZW1wX3NpemUsIChpbnQpIHRlbXBfc2l6ZSwKKwkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIDEsIE5VTEwpOworICBtZW1zZXQgKHAsIDAsIHRlbXBfc2l6ZSk7CisKKyAgLyogQ29udmVydCAyIGJ5dGVzIGF0IGEgdGltZS4gICovCisKKyAgZm9yIChpID0gMDsgaSA8IHRlbXBfc2l6ZTsgaSArPSAyKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIGksCisJCQkgICh2YWx1ZVQpIHRlbXBfZmlsbCwKKwkJCSAgKGludCkgKCh0ZW1wX3NpemUgLSBpKSA+IDIgPyAyIDogKHRlbXBfc2l6ZSAtIGkpKSk7CisgICAgfQorCisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuYmVnaW5fYnJ0YWIgYW5kIC5lbmRfYnJ0YWIgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2JydGFiIChiZWdpbikKKyAgICAgaW50IGJlZ2luOworeworCisjaWZkZWYgT0JKX1NPTQorICAvKiBUaGUgQlJUQUIgcmVsb2NhdGlvbnMgYXJlIG9ubHkgYXZhaWxibGUgaW4gU09NICh0byBkZW5vdGUKKyAgICAgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJyYW5jaCB0YWJsZXMpLiAgKi8KKyAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOworCisgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCisJCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAorCQkwLCBiZWdpbiA/IFJfSFBQQV9CRUdJTl9CUlRBQiA6IFJfSFBQQV9FTkRfQlJUQUIsCisJCWVfZnNlbCwgMCwgMCwgTlVMTCk7CisjZW5kaWYKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuYmVnaW5fdHJ5IGFuZCAuZW5kX3RyeSBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfdHJ5IChiZWdpbikKKyAgICAgaW50IGJlZ2luOworeworI2lmZGVmIE9CSl9TT00KKyAgZXhwcmVzc2lvblMgZXhwOworICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7CisKKyAgaWYgKCEgYmVnaW4pCisgICAgZXhwcmVzc2lvbiAoJmV4cCk7CisKKyAgLyogVGhlIFRSWSByZWxvY2F0aW9ucyBhcmUgb25seSBhdmFpbGJsZSBpbiBTT00gKHRvIGRlbm90ZQorICAgICB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZXhjZXB0aW9uIGhhbmRsaW5nIHJlZ2lvbnMpLiAgKi8KKworICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAorCQlOVUxMLCAob2Zmc2V0VCkgMCwgYmVnaW4gPyBOVUxMIDogJmV4cCwKKwkJMCwgYmVnaW4gPyBSX0hQUEFfQkVHSU5fVFJZIDogUl9IUFBBX0VORF9UUlksCisJCWVfZnNlbCwgMCwgMCwgTlVMTCk7CisjZW5kaWYKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuQ0FMTCBwc2V1ZG8tb3AuICBUaGlzIGludm9sdmVzIHN0b3JpbmcgYXdheSBpbmZvcm1hdGlvbgorICAgYWJvdXQgd2hlcmUgYXJndW1lbnRzIGFyZSB0byBiZSBmb3VuZCBzbyB0aGUgbGlua2VyIGNhbiBkZXRlY3QKKyAgIChhbmQgY29ycmVjdCkgYXJndW1lbnQgbG9jYXRpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGNhbGxlciBhbmQgY2FsbGVlLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2NhbGwgKHVudXNlZCkKKyAgICAgaW50IHVudXNlZDsKK3sKKyAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KKyAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7CisKKyAgcGFfY2FsbF9hcmdzICgmbGFzdF9jYWxsX2Rlc2MpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBEbyB0aGUgZGlydHkgd29yayBvZiBidWlsZGluZyBhIGNhbGwgZGVzY3JpcHRvciB3aGljaCBkZXNjcmliZXMKKyAgIHdoZXJlIHRoZSBjYWxsZXIgcGxhY2VkIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGNhbGwuICAqLworCitzdGF0aWMgdm9pZAorcGFfY2FsbF9hcmdzIChjYWxsX2Rlc2MpCisgICAgIHN0cnVjdCBjYWxsX2Rlc2MgKmNhbGxfZGVzYzsKK3sKKyAgY2hhciAqbmFtZSwgYywgKnA7CisgIHVuc2lnbmVkIGludCB0ZW1wLCBhcmdfcmVsb2M7CisKKyAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorICAgIHsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICAvKiBQcm9jZXNzIGEgc291cmNlIGFyZ3VtZW50LiAgKi8KKyAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhcmd3IiwgNCkgPT0gMCkpCisJeworCSAgdGVtcCA9IGF0b2kgKG5hbWUgKyA0KTsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisJICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOworCSAgY2FsbF9kZXNjLT5hcmdfcmVsb2MgfD0gcGFfYWxpZ25fYXJnX3JlbG9jICh0ZW1wLCBhcmdfcmVsb2MpOworCX0KKyAgICAgIC8qIFByb2Nlc3MgYSByZXR1cm4gdmFsdWUuICAqLworICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicnRudmFsIiwgNikgPT0gMCkpCisJeworCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICpwID0gYzsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKwkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7CisJICBjYWxsX2Rlc2MtPmFyZ19yZWxvYyB8PSAoYXJnX3JlbG9jICYgMHgzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMIGFyZ3VtZW50OiAlcyIpLCBuYW1lKTsKKwl9CisgICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgKnAgPSBjOworICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCWlucHV0X2xpbmVfcG9pbnRlcisrOworICAgIH0KK30KKworLyogUmV0dXJuIFRSVUUgaWYgRlJBRzEgYW5kIEZSQUcyIGFyZSB0aGUgc2FtZS4gICovCisKK3N0YXRpYyBpbnQKK2lzX3NhbWVfZnJhZyAoZnJhZzEsIGZyYWcyKQorICAgICBmcmFnUyAqZnJhZzE7CisgICAgIGZyYWdTICpmcmFnMjsKK3sKKworICBpZiAoZnJhZzEgPT0gTlVMTCkKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgZWxzZSBpZiAoZnJhZzIgPT0gTlVMTCkKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgZWxzZSBpZiAoZnJhZzEgPT0gZnJhZzIpCisgICAgcmV0dXJuIChUUlVFKTsKKyAgZWxzZSBpZiAoZnJhZzItPmZyX3R5cGUgPT0gcnNfZmlsbCAmJiBmcmFnMi0+ZnJfZml4ID09IDApCisgICAgcmV0dXJuIChpc19zYW1lX2ZyYWcgKGZyYWcxLCBmcmFnMi0+ZnJfbmV4dCkpOworICBlbHNlCisgICAgcmV0dXJuIChGQUxTRSk7Cit9CisKKyNpZmRlZiBPQkpfRUxGCisvKiBCdWlsZCBhbiBlbnRyeSBpbiB0aGUgVU5XSU5EIHN1YnNwYWNlIGZyb20gdGhlIGdpdmVuIGZ1bmN0aW9uCisgICBhdHRyaWJ1dGVzIGluIENBTExfSU5GTy4gIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgU09NIGFzIHVzaW5nCisgICBSX0VOVFJZIGFuZCBSX0VYSVQgcmVsb2NhdGlvbnMgYWxsb3cgdGhlIGxpbmtlciB0byBoYW5kbGUgYnVpbGRpbmcKKyAgIG9mIHRoZSB1bndpbmQgc3BhY2VzLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSAoY2FsbF9pbmZvKQorICAgICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm87Cit7CisgIGNoYXIgKnVud2luZDsKKyAgYXNlY3Rpb24gKnNlZywgKnNhdmVfc2VnOworICBzdWJzZWdUIHN1YnNlZywgc2F2ZV9zdWJzZWc7CisgIGludCBpOworICBjaGFyIGMsICpwOworCisgIC8qIEdldCBpbnRvIHRoZSByaWdodCBzZWcvc3Vic2VnLiAgVGhpcyBtYXkgaW52b2x2ZSBjcmVhdGluZworICAgICB0aGUgc2VnIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICBNYWtlIHN1cmUgdG8gaGF2ZSB0aGUKKyAgICAgb2xkIHNlZy9zdWJzZWcgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdGhpbmdzIHdoZW4gd2UgYXJlIGRvbmUuICAqLworICBzdWJzZWcgPSBTVUJTRUdfVU5XSU5EOworICBzZWcgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCBVTldJTkRfU0VDVElPTl9OQU1FKTsKKyAgaWYgKHNlZyA9PSBBU0VDX05VTEwpCisgICAgeworICAgICAgc2VnID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIFVOV0lORF9TRUNUSU9OX05BTUUpOworICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKKwkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUworCQkJICAgICB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKTsKKyAgICB9CisKKyAgc2F2ZV9zZWcgPSBub3dfc2VnOworICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7CisgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKKworCisgIC8qIEdldCBzb21lIHNwYWNlIHRvIGhvbGQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVud2luZAorICAgICBkZXNjcmlwdG9yLiAgKi8KKyAgcCA9IGZyYWdfbW9yZSAoNCk7CisgIG1kX251bWJlcl90b19jaGFycyAocCwgMCwgNCk7CisKKyAgLyogUmVsb2NhdGlvbiBpbmZvLiBmb3Igc3RhcnQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4gICovCisgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKKwkJY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOworCisgIHAgPSBmcmFnX21vcmUgKDQpOworICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOworCisgIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIGVuZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLgorCisgICAgIEJlY2F1c2Ugd2UgYWxsb3cgcmVkdWN0aW9ucyBvZiAzMmJpdCByZWxvY2F0aW9ucyBmb3IgRUxGLCB0aGlzIHdpbGwgYmUKKyAgICAgcmVkdWNlZCB0byBzZWN0aW9uX3N5bSArIG9mZnNldCB3aGljaCBhdm9pZHMgcHV0dGluZyB0aGUgdGVtcG9yYXJ5CisgICAgIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBJdCAoc2hvdWxkKSBlbmQgdXAgZ2l2aW5nIHRoZSBzYW1lCisgICAgIHZhbHVlIGFzIGNhbGxfaW5mby0+c3RhcnRfc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBvbmNlIHRoZSBsaW5rZXIgaXMKKyAgICAgZmluaXNoZWQgd2l0aCBpdHMgd29yay4gICovCisKKyAgZml4X25ld19ocHBhIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAorCQljYWxsX2luZm8tPmVuZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOworCisgIC8qIER1bXAgaXQuICovCisgIHVud2luZCA9IChjaGFyICopICZjYWxsX2luZm8tPmNpX3Vud2luZDsKKyAgZm9yIChpID0gODsgaSA8IHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZSk7IGkrKykKKyAgICB7CisgICAgICBjID0gKih1bndpbmQgKyBpKTsKKyAgICAgIHsKKwlGUkFHX0FQUEVORF8xX0NIQVIgKGMpOworICAgICAgfQorICAgIH0KKworICAvKiBSZXR1cm4gYmFjayB0byB0aGUgb3JpZ2luYWwgc2VnbWVudC9zdWJzZWdtZW50LiAgKi8KKyAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKK30KKyNlbmRpZgorCisvKiBQcm9jZXNzIGEgLkNBTExJTkZPIHBzZXVkby1vcC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBsYXRlcgorICAgdG8gYnVpbGQgdW53aW5kIGRlc2NyaXB0b3JzIGFuZCBtYXliZSBvbmUgZGF5IHRvIHN1cHBvcnQKKyAgIC5FTlRFUiBhbmQgLkxFQVZFLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2NhbGxpbmZvICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGNoYXIgKm5hbWUsIGMsICpwOworICBpbnQgdGVtcDsKKworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICAvKiAuQ0FMTElORk8gbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uICAqLworICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCisgICAgYXNfYmFkIChfKCIuY2FsbGluZm8gaXMgbm90IHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uIikpOworCisgIC8qIE1hcmsgdGhlIGZhY3QgdGhhdCB3ZSBmb3VuZCB0aGUgLkNBTExJTkZPIGZvciB0aGUKKyAgICAgY3VycmVudCBwcm9jZWR1cmUuICAqLworICBjYWxsaW5mb19mb3VuZCA9IFRSVUU7CisKKyAgLyogSXRlcmF0ZSBvdmVyIHRoZSAuQ0FMTElORk8gYXJndW1lbnRzLiAgKi8KKyAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorICAgIHsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICAvKiBGcmFtZSBzaXplIHNwZWNpZmljYXRpb24uICAqLworICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZyYW1lIiwgNSkgPT0gMCkpCisJeworCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICpwID0gYzsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCSAgaWYgKCh0ZW1wICYgMHgzKSAhPSAwKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJGUkFNRSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDg6ICVkXG4iKSwgdGVtcCk7CisJICAgICAgdGVtcCA9IDA7CisJICAgIH0KKworCSAgLyogY2FsbGluZm8gaXMgaW4gYnl0ZXMgYW5kIHVud2luZF9kZXNjIGlzIGluIDggYnl0ZSB1bml0cy4gICovCisJICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZnJhbWVfc2l6ZSA9IHRlbXAgLyA4OworCisJfQorICAgICAgLyogRW50cnkgcmVnaXN0ZXIgKEdSLCBHUiBhbmQgU1IpIHNwZWNpZmljYXRpb25zLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2dyIiwgOCkgPT0gMCkpCisJeworCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICpwID0gYzsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCSAgLyogVGhlIEhQIGFzc2VtYmxlciBhY2NlcHRzIDE5IGFzIHRoZSBoaWdoIGJvdW5kIGZvciBFTlRSWV9HUgorCSAgICAgZXZlbiB0aG91Z2ggJXIxOSBpcyBjYWxsZXIgc2F2ZWQuICBJIHRoaW5rIHRoaXMgaXMgYSBidWcgaW4KKwkgICAgIHRoZSBIUCBhc3NlbWJsZXIsIGFuZCB3ZSBhcmUgbm90IGdvaW5nIHRvIGVtdWxhdGUgaXQuICAqLworCSAgaWYgKHRlbXAgPCAzIHx8IHRlbXAgPiAxOCkKKwkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIpKTsKKwkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5lbnRyeV9nciA9IHRlbXAgLSAyOworCX0KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImVudHJ5X2ZyIiwgOCkgPT0gMCkpCisJeworCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICpwID0gYzsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCSAgLyogU2ltaWxhcmx5IHRoZSBIUCBhc3NlbWJsZXIgdGFrZXMgMzEgYXMgdGhlIGhpZ2ggYm91bmQgZXZlbgorCSAgICAgdGhvdWdoICVmcjIxIGlzIHRoZSBsYXN0IGNhbGxlZSBzYXZlZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCisJICBpZiAodGVtcCA8IDEyIHx8IHRlbXAgPiAyMSkKKwkgICAgYXNfYmFkIChfKCJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iKSk7CisJICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuZW50cnlfZnIgPSB0ZW1wIC0gMTE7CisJfQorICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfc3IiLCA4KSA9PSAwKSkKKwl7CisJICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgKnAgPSBjOworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisJICBpZiAodGVtcCAhPSAzKQorCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9TUiBtdXN0IGJlIDNcbiIpKTsKKwl9CisgICAgICAvKiBOb3RlIHdoZXRoZXIgb3Igbm90IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYW55IGNhbGxzLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNhbGxzIiwgNSkgPT0gMCkgfHwKKwkgICAgICAgKHN0cm5jYXNlY21wIChuYW1lLCAiY2FsbGVyIiwgNikgPT0gMCkpCisJeworCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICpwID0gYzsKKwl9CisgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub19jYWxscyIsIDgpID09IDApKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJfQorICAgICAgLyogU2hvdWxkIFJQIGJlIHNhdmVkIGludG8gdGhlIHN0YWNrLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNhdmVfcnAiLCA3KSA9PSAwKSkKKwl7CisJICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgKnAgPSBjOworCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnNhdmVfcnAgPSAxOworCX0KKyAgICAgIC8qIExpa2V3aXNlIGZvciBTUC4gICovCisgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzYXZlX3NwIiwgNykgPT0gMCkpCisJeworCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICpwID0gYzsKKwkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5zYXZlX3NwID0gMTsKKwl9CisgICAgICAvKiBJcyB0aGlzIGFuIHVud2luZGFibGUgcHJvY2VkdXJlLiAgSWYgc28gbWFyayBpdCBzbworICAgICAgICAgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vX3Vud2luZCIsIDkpID09IDApKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDE7CisJfQorICAgICAgLyogSXMgdGhpcyBhbiBpbnRlcnJ1cHQgcm91dGluZS4gIElmIHNvIG1hcmsgaXQgaW4gdGhlCisgICAgICAgICB1bndpbmQgZGVzY3JpcHRvci4gICovCisgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJocHV4X2ludCIsIDcpID09IDApKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuaHB1eF9pbnRlcnJ1cHRfbWFya2VyID0gMTsKKwl9CisgICAgICAvKiBJcyB0aGlzIGEgbWlsbGljb2RlIHJvdXRpbmUuICAibWlsbGljb2RlIiBpc24ndCBpbiBteQorCSBhc3NlbWJsZXIgbWFudWFsLCBidXQgbXkgY29weSBpcyBvbGQuICBUaGUgSFAgYXNzZW1ibGVyCisJIGFjY2VwdHMgaXQsIGFuZCB0aGVyZSdzIGEgcGxhY2UgaW4gdGhlIHVud2luZCBkZXNjcmlwdG9yCisJIHRvIGRyb3AgdGhlIGluZm9ybWF0aW9uLCBzbyB3ZSdsbCBhY2NlcHQgaXQgdG9vLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm1pbGxpY29kZSIsIDkpID09IDApKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IubWlsbGljb2RlID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiKSwgbmFtZSk7CisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwl9CisgICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisJaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFN3aXRjaCBpbnRvIHRoZSBjb2RlIHN1YnNwYWNlLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2NvZGUgKHVudXNlZCkKKyAgICAgaW50IHVudXNlZDsKK3sKKyAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKKyAgY3VycmVudF9zdWJzcGFjZQorICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKKyAgc190ZXh0ICgwKTsKKyAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Cit9CisKKy8qIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHN0YW5kYXJkIEdBUyBzX2NvbW0oKS4gT24gSFA5MDAwLzgwMCBtYWNoaW5lcywKKyAgIHRoZSAuY29tbSBwc2V1ZG8tb3AgaGFzIHRoZSBmb2xsb3dpbmcgc3ltdGF4OgorCisgICA8bGFiZWw+IC5jb21tIDxsZW5ndGg+CisKKyAgIHdoZXJlIDxsYWJlbD4gaXMgb3B0aW9uYWwgYW5kIGlzIGEgc3ltYm9sIHdob3NlIGFkZHJlc3Mgd2lsbCBiZSB0aGUgc3RhcnQgb2YKKyAgIGEgYmxvY2sgb2YgbWVtb3J5IDxsZW5ndGg+IGJ5dGVzIGxvbmcuIDxsZW5ndGg+IG11c3QgYmUgYW4gYWJzb2x1dGUKKyAgIGV4cHJlc3Npb24uICA8bGVuZ3RoPiBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUgY3VycmVudCBzcGFjZQorICAgYW5kIHN1YnNwYWNlLgorCisgICBBbHNvIG5vdGUgdGhlIGxhYmVsIG1heSBub3QgZXZlbiBiZSBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSAuY29tbS4KKworICAgVGhpcyBkaWZmZXJlbmNlIGluIHN5bnRheCBtZWFucyB0aGUgY29sb24gZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgIG9uIHRoZSBzeW1ib2wgYmVmb3JlIHdlIGFycml2ZSBpbiBwYV9jb21tLiAgY29sb24gd2lsbCBzZXQgYSBudW1iZXIKKyAgIG9mIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bWJvbCB0aGF0IG5lZWQgdG8gYmUgZml4ZWQgaGVyZS4gIEluIHBhcnRpY3VsYXIKKyAgIHRoZSB2YWx1ZSwgc2VjdGlvbiBwb2ludGVyLCBmcmFnbWVudCBwb2ludGVyLCBmbGFncywgZXRjLiAgV2hhdAorICAgYSBwYWluLgorCisgICBUaGlzIGFsc28gbWFrZXMgZXJyb3IgZGV0ZWN0aW9uIGFsbCBidXQgaW1wb3NzaWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitwYV9jb21tICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIHVuc2lnbmVkIGludCBzaXplOworICBzeW1ib2xTICpzeW1ib2w7CisgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKKworICBpZiAobGFiZWxfc3ltYm9sKQorICAgIHN5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOworICBlbHNlCisgICAgc3ltYm9sID0gTlVMTDsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBpZiAoc3ltYm9sKQorICAgIHsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsIHNpemUpOworICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfdW5kX3NlY3Rpb25fcHRyKTsKKyAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOworCisgICAgICAvKiBjb2xvbigpIGhhcyBhbHJlYWR5IHNldCB0aGUgZnJhZyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUKKyAgICAgICAgIGN1cnJlbnQgc3Vic3BhY2U7IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGZyYWdtZW50IHRvIHRoZSB6ZXJvIGFkZHJlc3MKKyAgICAgICAgIGZyYWdtZW50LiAgV2UgYWxzbyBuZWVkIHRvIHJlc2V0IHRoZSBzZWdtZW50IHBvaW50ZXIuICAqLworICAgICAgc3ltYm9sLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworICAgIH0KKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogUHJvY2VzcyBhIC5FTkQgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2VuZCAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBQcm9jZXNzIGEgLkVOVEVSIHBzZXVkby1vcC4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gICovCitzdGF0aWMgdm9pZAorcGFfZW50ZXIgKHVudXNlZCkKKyAgICAgaW50IHVudXNlZDsKK3sKKyAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KKyAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7CisKKyAgYXNfYmFkIChfKCJUaGUgLkVOVEVSIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIikpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBQcm9jZXNzIGEgLkVOVFJZIHBzZXVkby1vcC4gIC5FTlRSWSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgcHJvY2VzdXJlLiAgKi8KK3N0YXRpYyB2b2lkCitwYV9lbnRyeSAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCisgICAgYXNfYmFkIChfKCJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghY2FsbGluZm9fZm91bmQpCisJYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mby4iKSk7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICB3aXRoaW5fZW50cnlfZXhpdCA9IFRSVUU7CisKKyNpZmRlZiBPQkpfU09NCisgIC8qIFNPTSBkZWZlcnMgYnVpbGRpbmcgb2YgdW53aW5kIGRlc2NyaXB0b3JzIHVudGlsIHRoZSBsaW5rIHBoYXNlLgorICAgICBUaGUgYXNzZW1ibGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBSX0VOVFJZIHJlbG9jYXRpb24KKyAgICAgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgcmVnaW9uIGFuZCBob2xkIHRoZSB1bndpbmQgYml0cywgYW5kCisgICAgIGZvciBjcmVhdGluZyBhbiBSX0VYSVQgcmVsb2NhdGlvbiB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KKworICAgICBGSVhNRS4gIEVMRiBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUgY29udmVudGlvbnMhICBUaGUgcHJvYmxlbQorICAgICBpcyBhbiB1bndpbmQgcmVxdWlyZXMgdG9vIG11Y2ggcmVsb2NhdGlvbiBzcGFjZS4gIEhtbW0uICBNYXliZQorICAgICBpZiB3ZSBzcGxpdCB0aGUgdW53aW5kIGJpdHMgdXAgYmV0d2VlbiB0aGUgcmVsb2NhdGlvbnMgd2hpY2gKKyAgICAgZGVub3RlIHRoZSBlbnRyeSBhbmQgZXhpdCBwb2ludHMuICAqLworICBpZiAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKKworICAgICAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKKwkJICAgIE5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAorCQkgICAgMCwgUl9IUFBBX0VOVFJZLCBlX2ZzZWwsIDAsIDAsCisJCSAgICAoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IpOworICAgIH0KKyNlbmRpZgorfQorCisvKiBIYW5kbGUgYSAuRVFVIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitwYV9lcXUgKHJlZykKKyAgICAgaW50IHJlZzsKK3sKKyAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOworICBzeW1ib2xTICpzeW1ib2w7CisKKyAgaWYgKGxhYmVsX3N5bWJvbCkKKyAgICB7CisgICAgICBzeW1ib2wgPSBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbDsKKyAgICAgIGlmIChyZWcpCisJU19TRVRfVkFMVUUgKHN5bWJvbCwgcGFfcGFyc2VfbnVtYmVyICgmaW5wdXRfbGluZV9wb2ludGVyLCAwKSk7CisgICAgICBlbHNlCisJU19TRVRfVkFMVUUgKHN5bWJvbCwgKHVuc2lnbmVkIGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sLCBiZmRfYWJzX3NlY3Rpb25fcHRyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocmVnKQorCWFzX2JhZCAoXygiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIikpOworICAgICAgZWxzZQorCWFzX2JhZCAoXygiLkVRVSBtdXN0IHVzZSBhIGxhYmVsIikpOworICAgIH0KKworICBwYV91bmRlZmluZV9sYWJlbCAoKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uLiAgRG9lcyBwcm9jZXNzaW5nIGZvciB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uICBUaGlzCisgICB1c3VhbGx5IGludm9sdmVzIGNyZWF0aW5nIHNvbWUgcmVsb2NhdGlvbnMgb3IgYnVpbGRpbmcgc3BlY2lhbAorICAgc3ltYm9scyB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZXhpdCAoKQoreworICBjaGFyICp3aGVyZTsKKworICB3aGVyZSA9IGZyYWdfbW9yZSAoMCk7CisKKyNpZmRlZiBPQkpfRUxGCisgIC8qIE1hcmsgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHN0dWZmIGF3YXkgdGhlIGxvY2F0aW9uIG9mIHRoZSBmcmFnCisgICAgIGZvciB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGZpbmFsbHkgY2FsbCBwYV9idWlsZF91bndpbmRfc3Vic3BhY2UKKyAgICAgdG8gYWRkIGFuIGVudHJ5IGluIHRoZSB1bndpbmQgdGFibGUuICAqLworICBocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKTsKKyAgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIChsYXN0X2NhbGxfaW5mbyk7CisjZWxzZQorICAvKiBTT00gZGVmZXJzIGJ1aWxkaW5nIG9mIHVud2luZCBkZXNjcmlwdG9ycyB1bnRpbCB0aGUgbGluayBwaGFzZS4KKyAgICAgVGhlIGFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gUl9FTlRSWSByZWxvY2F0aW9uCisgICAgIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHJlZ2lvbiBhbmQgaG9sZCB0aGUgdW53aW5kIGJpdHMsIGFuZAorICAgICBmb3IgY3JlYXRpbmcgYW4gUl9FWElUIHJlbG9jYXRpb24gdG8gbWFyayB0aGUgZW5kIG9mIHRoZSByZWdpb24uCisKKyAgICAgRklYTUUuICBFTEYgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIGNvbnZlbnRpb25zISAgVGhlIHByb2JsZW0KKyAgICAgaXMgYW4gdW53aW5kIHJlcXVpcmVzIHRvbyBtdWNoIHJlbG9jYXRpb24gc3BhY2UuICBIbW1tLiAgTWF5YmUKKyAgICAgaWYgd2Ugc3BsaXQgdGhlIHVud2luZCBiaXRzIHVwIGJldHdlZW4gdGhlIHJlbG9jYXRpb25zIHdoaWNoCisgICAgIGRlbm90ZSB0aGUgZW50cnkgYW5kIGV4aXQgcG9pbnRzLiAgKi8KKyAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKKwkJTlVMTCwgKG9mZnNldFQpIDAsCisJCU5VTEwsIDAsIFJfSFBQQV9FWElULCBlX2ZzZWwsIDAsIDAsCisJCShpbnQgKikgJmxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvciArIDEpOworI2VuZGlmCit9CisKKy8qIFByb2Nlc3MgYSAuRVhJVCBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfZXhpdCAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICBpZiAoIXdpdGhpbl9wcm9jZWR1cmUpCisgICAgYXNfYmFkIChfKCIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiKSk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQorCWFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8iKSk7CisgICAgICBlbHNlCisJeworCSAgaWYgKCF3aXRoaW5fZW50cnlfZXhpdCkKKwkgICAgYXNfYmFkIChfKCJObyAuRU5UUlkgZm9yIHRoaXMgLkVYSVQiKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB3aXRoaW5fZW50cnlfZXhpdCA9IEZBTFNFOworCSAgICAgIHByb2Nlc3NfZXhpdCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFByb2Nlc3MgYSAuRVhQT1JUIGRpcmVjdGl2ZS4gIFRoaXMgbWFrZXMgZnVuY3Rpb25zIGV4dGVybmFsCisgICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBhcmd1bWVudCByZWxvY2F0aW9uIGVudHJpZXMKKyAgIHRvIGNhbGxlcnMuICAqLworCitzdGF0aWMgdm9pZAorcGFfZXhwb3J0ICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGNoYXIgKm5hbWUsIGMsICpwOworICBzeW1ib2xTICpzeW1ib2w7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAvKiBNYWtlIHN1cmUgdGhlIGdpdmVuIHN5bWJvbCBleGlzdHMuICAqLworICBpZiAoKHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGRlZmluZSBleHBvcnQgc3ltYm9sOiAlc1xuIiksIG5hbWUpOworICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICpwID0gYzsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE9LLiAgU2V0IHRoZSBleHRlcm5hbCBiaXRzIGFuZCBwcm9jZXNzIGFyZ3VtZW50IHJlbG9jYXRpb25zLiAgKi8KKyAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2wpOworICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICpwID0gYzsKKyAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIHBhX3R5cGVfYXJncyAoc3ltYm9sLCAxKTsKKwl9CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIGFyZ3VtZW50cyB0byBhIC5FWFBPUlQgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX3R5cGVfYXJncyAoc3ltYm9sUCwgaXNfZXhwb3J0KQorICAgICBzeW1ib2xTICpzeW1ib2xQOworICAgICBpbnQgaXNfZXhwb3J0OworeworICBjaGFyICpuYW1lLCBjLCAqcDsKKyAgdW5zaWduZWQgaW50IHRlbXAsIGFyZ19yZWxvYzsKKyAgcGFfc3ltYm9sX3R5cGUgdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047CisgIG9ial9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKG9ial9zeW1ib2xfdHlwZSAqKSBzeW1ib2xQLT5ic3ltOworCisgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYWJzb2x1dGUiLCA4KSA9PSAwKQorCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7CisgICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOworICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2Fic19zZWN0aW9uX3B0cik7CisgICAgICB0eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7CisgICAgfQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiY29kZSIsIDQpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7CisgICAgICAvKiBJTVBPUlRpbmcvRVhQT1JUaW5nIENPREUgdHlwZXMgZm9yIGZ1bmN0aW9ucyBpcyBtZWFuaW5nbGVzcyBmb3IgU09NLAorICAgICAgICAgaW5zdGVhZCBvbmUgc2hvdWxkIGJlIElNUE9SVGluZy9FWFBPUlRpbmcgRU5UUlkgdHlwZXMuCisKKyAgICAgICAgIENvbXBsYWluIGlmIG9uZSB0cmllcyB0byBFWFBPUlQgYSBDT0RFIHR5cGUgc2luY2UgdGhhdCdzIG5ldmVyCisgICAgICAgICBkb25lLiAgQm90aCBHQ0MgYW5kIEhQIEMgc3RpbGwgdHJ5IHRvIElNUE9SVCBDT0RFIHR5cGVzLCBzbworICAgICAgICAgc2lsZW50bHkgZml4IHRoZW0gdG8gYmUgRU5UUlkgdHlwZXMuICAqLworICAgICAgaWYgKHN5bWJvbFAtPmJzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQorCXsKKwkgIGlmIChpc19leHBvcnQpCisJICAgIGFzX3Rza3RzayAoXygiVXNpbmcgRU5UUlkgcmF0aGVyIHRoYW4gQ09ERSBpbiBleHBvcnQgZGlyZWN0aXZlIGZvciAlcyIpLCBzeW1ib2xQLT5ic3ltLT5uYW1lKTsKKworCSAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzeW1ib2xQLT5ic3ltLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOworCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0NPREU7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGEiLCA0KSA9PSAwKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA0OworICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKKyAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOworICAgIH0KKyAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJlbnRyeSIsIDUpID09IDApKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OworICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm1pbGxpY29kZSIsIDkpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7CisgICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisgICAgICB0eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInBsYWJlbCIsIDYpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7CisgICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyAmPSB+QlNGX0ZVTkNUSU9OOworICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1BMQUJFTDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJwcmlfcHJvZyIsIDgpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7CisgICAgICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisgICAgICB0eXBlID0gU1lNQk9MX1RZUEVfUFJJX1BST0c7CisgICAgfQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic2VjX3Byb2ciLCA4KSA9PSAwKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OworICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX1NFQ19QUk9HOworICAgIH0KKworICAvKiBTT00gcmVxdWlyZXMgbXVjaCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCB0eXBlcworICAgICB0aGFuIEJGRCB1bmRlcnN0YW5kcy4gIFRoaXMgaXMgaG93IHdlIGdldCB0aGlzIGluZm9ybWF0aW9uCisgICAgIHRvIHRoZSBTT00gQkZEIGJhY2tlbmQuICAqLworI2lmZGVmIG9ial9zZXRfc3ltYm9sX3R5cGUKKyAgb2JqX3NldF9zeW1ib2xfdHlwZSAoc3ltYm9sUC0+YnN5bSwgKGludCkgdHlwZSk7CisjZW5kaWYKKworICAvKiBOb3cgdGhhdCB0aGUgdHlwZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9sIGhhcyBiZWVuIGhhbmRsZWQsCisgICAgIGhhbmRsZSBhbnkgYXJndW1lbnQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4gICovCisgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKKyAgICB7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisJaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAgICAgLyogQXJndW1lbnQgc291cmNlcy4gICovCisgICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYXJndyIsIDQpID09IDApKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIHRlbXAgPSBhdG9pIChuYW1lICsgNCk7CisJICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCSAgYXJnX3JlbG9jID0gcGFfYWxpZ25fYXJnX3JlbG9jICh0ZW1wLCBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpKTsKKwkgIHN5bWJvbC0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYyB8PSBhcmdfcmVsb2M7CisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwl9CisgICAgICAvKiBUaGUgcmV0dXJuIHZhbHVlLiAgKi8KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInJ0bnZhbCIsIDYpKSA9PSAwKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisJICBhcmdfcmVsb2MgPSBwYV9idWlsZF9hcmdfcmVsb2MgKG5hbWUpOworCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jIHw9IGFyZ19yZWxvYzsKKwkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCX0KKyAgICAgIC8qIFByaXZlbGVnZSBsZXZlbC4gICovCisgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJwcml2X2xldiIsIDgpKSA9PSAwKQorCXsKKwkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAqcCA9IGM7CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIHRlbXAgPSBhdG9pIChpbnB1dF9saW5lX3BvaW50ZXIpOworCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbCA9IHRlbXA7CisJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJVbmRlZmluZWQgLkVYUE9SVC8uSU1QT1JUIGFyZ3VtZW50IChpZ25vcmVkKTogJXMiKSwgbmFtZSk7CisJICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgKnAgPSBjOworCX0KKyAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKKwlpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICB9Cit9CisKKy8qIEhhbmRsZSBhbiAuSU1QT1JUIHBzZXVkby1vcC4gIEFueSBzeW1ib2wgcmVmZXJlbmNlZCBpbiBhIGdpdmVuCisgICBhc3NlbWJseSBmaWxlIG11c3QgZWl0aGVyIGJlIGRlZmluZWQgaW4gdGhlIGFzc2VtYmx5IGZpbGUsIG9yCisgICBleHBsaWNpdGx5IElNUE9SVEVEIGZyb20gYW5vdGhlci4gICovCisKK3N0YXRpYyB2b2lkCitwYV9pbXBvcnQgKHVudXNlZCkKKyAgICAgaW50IHVudXNlZDsKK3sKKyAgY2hhciAqbmFtZSwgYywgKnA7CisgIHN5bWJvbFMgKnN5bWJvbDsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgc3ltYm9sID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworICAvKiBVZ2guICBXZSBtaWdodCBiZSBpbXBvcnRpbmcgYSBzeW1ib2wgZGVmaW5lZCBlYXJsaWVyIGluIHRoZSBmaWxlLAorICAgICBpbiB3aGljaCBjYXNlIGFsbCB0aGUgY29kZSBiZWxvdyB3aWxsIHJlYWxseSBzY3JldyB0aGluZ3MgdXAKKyAgICAgKHNldCB0aGUgd3Jvbmcgc2VnbWVudCwgc3ltYm9sIGZsYWdzICYgdHlwZSwgZXRjKS4gICovCisgIGlmIChzeW1ib2wgPT0gTlVMTCB8fCAhU19JU19ERUZJTkVEIChzeW1ib2wpKQorICAgIHsKKyAgICAgIHN5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICpwID0gYzsKKworICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgcGFfdHlwZV9hcmdzIChzeW1ib2wsIDApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBTaWdoLiAgVG8gYmUgY29tcGF0YWJsZSB3aXRoIHRoZSBIUCBhc3NlbWJsZXIgYW5kIHRvIGhlbHAKKwkgICAgIHBvb3JseSB3cml0dGVuIGFzc2VtYmx5IGNvZGUsIHdlIGFzc2lnbiBhIHR5cGUgYmFzZWQgb24KKwkgICAgIHRoZSB0aGUgY3VycmVudCBzZWdtZW50LiAgTm90ZSBvbmx5IEJTRl9GVU5DVElPTiByZWFsbHkKKwkgICAgIG1hdHRlcnMsIHdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnVsbCBTWU1CT0xfVFlQRV8qIGluZm8uICAqLworCSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQorCSAgICBzeW1ib2wtPmJzeW0tPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKKworCSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkCisJICAgICBTaW5jZSB0aGlzIGlzIGFuIGltcG9ydCwgbGVhdmUgdGhlIHNlY3Rpb24gdW5kZWZpbmVkLiAgKi8KKwkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX3VuZF9zZWN0aW9uX3B0cik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEp1c3QgZWF0IGV2ZXJ5dGhpbmcgdXAgdG8KKwkgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuICAqLworICAgICAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCWlucHV0X2xpbmVfcG9pbnRlcisrOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuTEFCRUwgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2xhYmVsICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGNoYXIgKm5hbWUsIGMsICpwOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICBpZiAoc3RybGVuIChuYW1lKSA+IDApCisgICAgeworICAgICAgY29sb24gKG5hbWUpOworICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICpwID0gYzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc193YXJuIChfKCJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIikpOworICAgIH0KKworICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisgICAgeworICAgICAgYXNfd2FybiAoXygiZXh0cmEgLkxBQkVMIGFyZ3VtZW50cyBpZ25vcmVkLiIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuTEVBVkUgcHNldWRvLW9wLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCisKK3N0YXRpYyB2b2lkCitwYV9sZWF2ZSAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICBhc19iYWQgKF8oIlRoZSAuTEVBVkUgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiKSk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSBhIC5MRVZFTCBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfbGV2ZWwgKHVudXNlZCkKKyAgICAgaW50IHVudXNlZDsKK3sKKyAgY2hhciAqbGV2ZWw7CisKKyAgbGV2ZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlmIChzdHJuY21wIChsZXZlbCwgIjEuMCIsIDMpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7CisgICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKKwlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMS4xIiwgMykgPT0gMCkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKKyAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTEpKQorCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAobGV2ZWwsICIyLjAiLCAzKSA9PSAwKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOworICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAyMCkpCisJYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgIH0KKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIGEgLk9SSUdJTiBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfb3JpZ2luICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCisgIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOworCisgIHNfb3JnICgwKTsKKyAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Cit9CisKKy8qIEhhbmRsZSBhIC5QQVJBTSBwc2V1ZG8tb3AuICBUaGlzIGlzIG11Y2ggbGlrZSBhIC5FWFBPUlQsIGV4Y2VwdCBpdAorICAgaXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBGSVhNRS4gIFNob3VsZCBzaGFyZSBtb3JlIGNvZGUgd2l0aCAuRVhQT1JULiAgKi8KKworc3RhdGljIHZvaWQKK3BhX3BhcmFtICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGNoYXIgKm5hbWUsIGMsICpwOworICBzeW1ib2xTICpzeW1ib2w7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGlmICgoc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkpID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJDYW5ub3QgZGVmaW5lIHN0YXRpYyBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7CisgICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgKnAgPSBjOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sKTsKKyAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICAqcCA9IGM7CisgICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMCk7CisJfQorICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuUFJPQyBwc2V1ZG8tb3AuICBJdCBpcyB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZworICAgb2YgYSBwcm9jZWR1cmUgZnJvbSBhIHN5bnRhdGljYWwgcG9pbnQgb2Ygdmlldy4gICovCisKK3N0YXRpYyB2b2lkCitwYV9wcm9jICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mbzsKKworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICBpZiAod2l0aGluX3Byb2NlZHVyZSkKKyAgICBhc19mYXRhbCAoXygiTmVzdGVkIHByb2NlZHVyZXMiKSk7CisKKyAgLyogUmVzZXQgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgbmV3IHByb2NlZHVyZS4gICovCisgIGNhbGxpbmZvX2ZvdW5kID0gRkFMU0U7CisgIHdpdGhpbl9wcm9jZWR1cmUgPSBUUlVFOworCisgIC8qIENyZWF0ZSBhbm90aGVyIGNhbGxfaW5mbyBzdHJ1Y3R1cmUuICAqLworICBjYWxsX2luZm8gPSAoc3RydWN0IGNhbGxfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjYWxsX2luZm8pKTsKKworICBpZiAoIWNhbGxfaW5mbykKKyAgICBhc19mYXRhbCAoXygiQ2Fubm90IGFsbG9jYXRlIHVud2luZCBkZXNjcmlwdG9yXG4iKSk7CisKKyAgbWVtc2V0IChjYWxsX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfaW5mbykpOworCisgIGNhbGxfaW5mby0+Y2lfbmV4dCA9IE5VTEw7CisKKyAgaWYgKGNhbGxfaW5mb19yb290ID09IE5VTEwpCisgICAgeworICAgICAgY2FsbF9pbmZvX3Jvb3QgPSBjYWxsX2luZm87CisgICAgICBsYXN0X2NhbGxfaW5mbyA9IGNhbGxfaW5mbzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsYXN0X2NhbGxfaW5mby0+Y2lfbmV4dCA9IGNhbGxfaW5mbzsKKyAgICAgIGxhc3RfY2FsbF9pbmZvID0gY2FsbF9pbmZvOworICAgIH0KKworICAvKiBzZXQgdXAgZGVmYXVsdHMgb24gY2FsbF9pbmZvIHN0cnVjdHVyZSAqLworCisgIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDA7CisgIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IucmVnaW9uX2Rlc2MgPSAxOworICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmhwdXhfaW50ZXJydXB0X21hcmtlciA9IDA7CisKKyAgLyogSWYgd2UgZ290IGEgLlBST0MgcHNldWRvLW9wLCB3ZSBrbm93IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyAgICAgbG9jYWxseS4gIE1ha2Ugc3VyZSBpdCBnZXRzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCisgIHsKKyAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7CisKKyAgICBpZiAobGFiZWxfc3ltYm9sKQorICAgICAgeworCWlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKKwkgIHsKKwkgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOworCSAgICBsYWJlbF9zeW1ib2wtPmxzc19sYWJlbC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCSAgfQorCWVsc2UKKwkgIGFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyAoY29ycnVwdGVkIGxhYmVsIGNoYWluKSIpKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gTlVMTDsKKyAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFByb2Nlc3MgdGhlIHN5bnRhdGljYWwgZW5kIG9mIGEgcHJvY2VkdXJlLiAgTWFrZSBzdXJlIGFsbCB0aGUKKyAgIGFwcHJvcHJpYXRlIHBzZXVkby1vcHMgd2VyZSBmb3VuZCB3aXRoaW4gdGhlIHByb2NlZHVyZS4gICovCisKK3N0YXRpYyB2b2lkCitwYV9wcm9jZW5kICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisKKyAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KKyAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7CisKKyAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKKyAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKKyAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KKworICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKKyAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCisgICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCisgIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKKyAgICB7CisgICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7CisKKyAgICAgIGlmIChsYWJlbF9zeW1ib2wpCisJeworCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQorCSAgICB7CisJICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOworCSAgICAgIGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsLT5ic3ltLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047CisjaWZkZWYgT0JKX1NPTQorCSAgICAgIC8qIEFsc28gaGFuZGxlIGFsbG9jYXRpb24gb2YgYSBmaXh1cCB0byBob2xkIHRoZSB1bndpbmQKKwkJIGluZm9ybWF0aW9uIHdoZW4gdGhlIGxhYmVsIGFwcGVhcnMgYWZ0ZXIgdGhlIHByb2MvcHJvY2VuZC4gICovCisJICAgICAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQorCQl7CisJCSAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDApOworCisJCSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKKwkJCQlOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKKwkJCQkwLCBSX0hQUEFfRU5UUlksIGVfZnNlbCwgMCwgMCwKKwkJCQkoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IpOworCQl9CisjZW5kaWYKKwkgICAgfQorCSAgZWxzZQorCSAgICBhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MgKGNvcnJ1cHRlZCBsYWJlbCBjaGFpbikiKSk7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygiTWlzc2luZyBmdW5jdGlvbiBuYW1lIGZvciAuUFJPQyIpKTsKKyAgICB9CisKKyAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQorICAgIGFzX2JhZCAoXygibWlzcGxhY2VkIC5wcm9jZW5kIikpOworCisgIGlmICghY2FsbGluZm9fZm91bmQpCisgICAgYXNfYmFkIChfKCJNaXNzaW5nIC5jYWxsaW5mbyBmb3IgdGhpcyBwcm9jZWR1cmUiKSk7CisKKyAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQorICAgIGFzX2JhZCAoXygiTWlzc2luZyAuRVhJVCBmb3IgYSAuRU5UUlkiKSk7CisKKyNpZmRlZiBPQkpfRUxGCisgIC8qIEVMRiBuZWVkcyB0byBtYXJrIHRoZSBlbmQgb2YgZWFjaCBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBjb21wdXRlCisgICAgIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiAoYXBwYXJlbnRseSBpdHMgbmVlZGVkIGluIHRoZSBzeW1ib2wgdGFibGUpLiAgKi8KKyAgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCk7CisjZW5kaWYKKworICB3aXRoaW5fcHJvY2VkdXJlID0gRkFMU0U7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworfQorCisvKiBQYXJzZSB0aGUgcGFyYW1ldGVycyB0byBhIC5TUEFDRSBkaXJlY3RpdmU7IGlmIENSRUFURV9GTEFHIGlzIG5vbnplcm8sCisgICB0aGVuIGNyZWF0ZSBhIG5ldyBzcGFjZSBlbnRyeSB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKKyAgIGJ5IHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSAuU1BBQ0UgZGlyZWN0aXZlLiAgKi8KKworc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCitwYV9wYXJzZV9zcGFjZV9zdG10IChzcGFjZV9uYW1lLCBjcmVhdGVfZmxhZykKKyAgICAgY2hhciAqc3BhY2VfbmFtZTsKKyAgICAgaW50IGNyZWF0ZV9mbGFnOworeworICBjaGFyICpuYW1lLCAqcHRlbXAsIGM7CisgIGNoYXIgbG9hZGFibGUsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQ7CisgIGludCBzcG51bSwgdGVtcDsKKyAgYXNlY3Rpb24gKnNlZyA9IE5VTEw7CisgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7CisKKyAgLyogbG9hZCBkZWZhdWx0IHZhbHVlcyAqLworICBzcG51bSA9IDA7CisgIHNvcnQgPSAwOworICBsb2FkYWJsZSA9IFRSVUU7CisgIGRlZmluZWQgPSBUUlVFOworICBwcml2YXRlID0gRkFMU0U7CisgIGlmIChzdHJjbXAgKHNwYWNlX25hbWUsICIkVEVYVCQiKSA9PSAwKQorICAgIHsKKyAgICAgIHNlZyA9IHBhX2RlZl9zcGFjZXNbMF0uc2VnbWVudDsKKyAgICAgIGRlZmluZWQgPSBwYV9kZWZfc3BhY2VzWzBdLmRlZmluZWQ7CisgICAgICBwcml2YXRlID0gcGFfZGVmX3NwYWNlc1swXS5wcml2YXRlOworICAgICAgc29ydCA9IHBhX2RlZl9zcGFjZXNbMF0uc29ydDsKKyAgICAgIHNwbnVtID0gcGFfZGVmX3NwYWNlc1swXS5zcG51bTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoc3BhY2VfbmFtZSwgIiRQUklWQVRFJCIpID09IDApCisgICAgeworICAgICAgc2VnID0gcGFfZGVmX3NwYWNlc1sxXS5zZWdtZW50OworICAgICAgZGVmaW5lZCA9IHBhX2RlZl9zcGFjZXNbMV0uZGVmaW5lZDsKKyAgICAgIHByaXZhdGUgPSBwYV9kZWZfc3BhY2VzWzFdLnByaXZhdGU7CisgICAgICBzb3J0ID0gcGFfZGVmX3NwYWNlc1sxXS5zb3J0OworICAgICAgc3BudW0gPSBwYV9kZWZfc3BhY2VzWzFdLnNwbnVtOworICAgIH0KKworICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisgICAgeworICAgICAgcHJpbnRfZXJyb3JzID0gRkFMU0U7CisgICAgICBwdGVtcCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7CisgICAgICAvKiBGaXJzdCBzZWUgaWYgdGhlIHNwYWNlIHdhcyBzcGVjaWZpZWQgYXMgYSBudW1iZXIgcmF0aGVyIHRoYW4KKyAgICAgICAgIGFzIGEgbmFtZS4gIEFjY29yZGluZyB0byB0aGUgUEEgYXNzZW1ibHkgbWFudWFsIHRoZSByZXN0IG9mCisgICAgICAgICB0aGUgbGluZSBzaG91bGQgYmUgaWdub3JlZC4gICovCisgICAgICB0ZW1wID0gcGFfcGFyc2VfbnVtYmVyICgmcHRlbXAsIDApOworICAgICAgaWYgKHRlbXAgPj0gMCkKKwl7CisJICBzcG51bSA9IHRlbXA7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwdGVtcDsKKwl9CisgICAgICBlbHNlCisJeworCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCSAgICB7CisJICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisJICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNwbnVtIiwgNSkgPT0gMCkpCisJCXsKKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkJICBzcG51bSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCQl9CisJICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic29ydCIsIDQpID09IDApKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJCSAgc29ydCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCQl9CisJICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAidW5sb2FkYWJsZSIsIDEwKSA9PSAwKSkKKwkJeworCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIGxvYWRhYmxlID0gRkFMU0U7CisJCX0KKwkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJub3RkZWZpbmVkIiwgMTApID09IDApKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgZGVmaW5lZCA9IEZBTFNFOworCQl9CisJICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicHJpdmF0ZSIsIDcpID09IDApKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgcHJpdmF0ZSA9IFRSVUU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhc19iYWQgKF8oIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IikpOworCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKKwkJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCQl9CisJICAgIH0KKwl9CisgICAgICBwcmludF9lcnJvcnMgPSBUUlVFOworICAgIH0KKworICBpZiAoY3JlYXRlX2ZsYWcgJiYgc2VnID09IE5VTEwpCisgICAgc2VnID0gc3Vic2VnX25ldyAoc3BhY2VfbmFtZSwgMCk7CisKKyAgLyogSWYgY3JlYXRlX2ZsYWcgaXMgbm9uemVybywgdGhlbiBjcmVhdGUgdGhlIG5ldyBzcGFjZSB3aXRoCisgICAgIHRoZSBhdHRyaWJ1dGVzIGNvbXB1dGVkIGFib3ZlLiAgRWxzZSBzZXQgdGhlIHZhbHVlcyBpbgorICAgICBhbiBhbHJlYWR5IGV4aXN0aW5nIHNwYWNlIC0tIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvcgorICAgICB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgYnVpbHQtaW4gc3BhY2UuICAqLworICBpZiAoY3JlYXRlX2ZsYWcpCisgICAgc3BhY2UgPSBjcmVhdGVfbmV3X3NwYWNlIChzcGFjZV9uYW1lLCBzcG51bSwgbG9hZGFibGUsIGRlZmluZWQsCisJCQkgICAgICBwcml2YXRlLCBzb3J0LCBzZWcsIDEpOworICBlbHNlCisgICAgeworICAgICAgc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlIChzcGFjZV9uYW1lKTsKKyAgICAgIFNQQUNFX1NQTlVNIChzcGFjZSkgPSBzcG51bTsKKyAgICAgIFNQQUNFX0RFRklORUQgKHNwYWNlKSA9IGRlZmluZWQgJiAxOworICAgICAgU1BBQ0VfVVNFUl9ERUZJTkVEIChzcGFjZSkgPSAxOworICAgIH0KKworI2lmZGVmIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCisgIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQsIHNwbnVtKTsKKyNlbmRpZgorCisgIHJldHVybiBzcGFjZTsKK30KKworLyogSGFuZGxlIGEgLlNQQUNFIHBzZXVkby1vcDsgdGhpcyBzd2l0Y2hlcyB0aGUgY3VycmVudCBzcGFjZSB0byB0aGUKKyAgIGdpdmVuIHNwYWNlLCBjcmVhdGluZyB0aGUgbmV3IHNwYWNlIGlmIG5lY2Vzc2FyeS4gICovCisKK3N0YXRpYyB2b2lkCitwYV9zcGFjZSAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICBjaGFyICpuYW1lLCBjLCAqc3BhY2VfbmFtZSwgKnNhdmVfczsKKyAgaW50IHRlbXA7CisgIHNkX2NoYWluX3N0cnVjdCAqc2RfY2hhaW47CisKKyAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCisgICAgeworICAgICAgYXNfYmFkIChfKCJDYW5cJ3QgY2hhbmdlIHNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIHNvbWUgb2YgdGhlIHByZWRlZmluZWQgc3BhY2VzLiAgIEZJWE1FOiBtb3N0IG9mIHRoZSBjb2RlCisgICAgICAgICBiZWxvdyBpcyByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLCBjYW4gd2UgZXh0cmFjdCB0aGUgY29tbW9uIHBhcnRzCisgICAgICAgICBhbmQgcGxhY2UgdGhlbSBpbnRvIGEgc3Vicm91dGluZSBvciBzb21ldGhpbmcgc2ltaWxhcj8gICovCisgICAgICAvKiBGSVhNRSBJcyB0aGlzIChhbmQgdGhlIG5leHQgSUYgc3RtdCkgcmVhbGx5IHJpZ2h0PworCSBXaGF0IGlmIElOUFVUX0xJTkVfUE9JTlRFUiBwb2ludHMgdG8gIiRURVhUJEZPTyI/ICAqLworICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiRURVhUJCIsIDYpID09IDApCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7CisJICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKKwkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQorCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkVEVYVCQiLCAxKTsKKwkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCisJICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRURVhUJCIsIDApOworCisJICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47CisJICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7CisJICBjdXJyZW50X3N1YnNwYWNlCisJICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAodGV4dF9zZWN0aW9uLAorCQkJCQkgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKKwkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIiRQUklWQVRFJCIsIDkpID09IDApCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7CisJICBzZF9jaGFpbiA9IGlzX2RlZmluZWRfc3BhY2UgKCIkUFJJVkFURSQiKTsKKwkgIGlmIChzZF9jaGFpbiA9PSBOVUxMKQorCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkUFJJVkFURSQiLCAxKTsKKwkgIGVsc2UgaWYgKFNQQUNFX1VTRVJfREVGSU5FRCAoc2RfY2hhaW4pID09IDApCisJICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoIiRQUklWQVRFJCIsIDApOworCisJICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47CisJICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7CisJICBjdXJyZW50X3N1YnNwYWNlCisJICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoZGF0YV9zZWN0aW9uLAorCQkJCQkgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKKwkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLAorCQkJR0RCX0RFQlVHX1NQQUNFX05BTUUsCisJCQlzdHJsZW4gKEdEQl9ERUJVR19TUEFDRV9OQU1FKSkpCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IHN0cmxlbiAoR0RCX0RFQlVHX1NQQUNFX05BTUUpOworCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlIChHREJfREVCVUdfU1BBQ0VfTkFNRSk7CisJICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKKwkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChHREJfREVCVUdfU1BBQ0VfTkFNRSwgMSk7CisJICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQorCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKEdEQl9ERUJVR19TUEFDRV9OQU1FLCAwKTsKKworCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOworCisJICB7CisJICAgIGFzZWN0aW9uICpnZGJfc2VjdGlvbgorCSAgICA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3Rkb3V0cHV0LCBHREJfREVCVUdfU1BBQ0VfTkFNRSk7CisKKwkgICAgc3Vic2VnX3NldCAoZ2RiX3NlY3Rpb24sIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7CisJICAgIGN1cnJlbnRfc3Vic3BhY2UKKwkgICAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGdkYl9zZWN0aW9uLAorCQkJCQkgICBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOworCSAgfQorCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIEl0IGNvdWxkIGJlIGEgc3BhY2Ugc3BlY2lmaWVkIGJ5IG51bWJlci4gICovCisgICAgICBwcmludF9lcnJvcnMgPSAwOworICAgICAgc2F2ZV9zID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaWYgKCh0ZW1wID0gcGFfcGFyc2VfbnVtYmVyICgmaW5wdXRfbGluZV9wb2ludGVyLCAwKSkgPj0gMCkKKwl7CisJICBpZiAoKHNkX2NoYWluID0gcGFfZmluZF9zcGFjZV9ieV9udW1iZXIgKHRlbXApKSkKKwkgICAgeworCSAgICAgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKKworCSAgICAgIHN1YnNlZ19zZXQgKHNkX2NoYWluLT5zZF9zZWcsIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7CisJICAgICAgY3VycmVudF9zdWJzcGFjZQorCQk9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNkX2NoYWluLT5zZF9zZWcsCisJCQkJCSAgICAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKKwkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKworICAgICAgLyogTm90IGEgbnVtYmVyLCBhdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBzcGFjZS4gICovCisgICAgICBwcmludF9lcnJvcnMgPSAxOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9zOworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIHNwYWNlX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7CisgICAgICBzdHJjcHkgKHNwYWNlX25hbWUsIG5hbWUpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoc3BhY2VfbmFtZSwgMSk7CisgICAgICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47CisKKyAgICAgIHN1YnNlZ19zZXQgKHNkX2NoYWluLT5zZF9zZWcsIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7CisgICAgICBjdXJyZW50X3N1YnNwYWNlID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2RfY2hhaW4tPnNkX3NlZywKKwkJCQkJCSAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgfQorfQorCisvKiBTd2l0Y2ggdG8gYSBuZXcgc3BhY2UuICAoSSB0aGluaykuICBGSVhNRS4gICovCisKK3N0YXRpYyB2b2lkCitwYV9zcG51bSAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGNoYXIgKnA7CisgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBzcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKG5hbWUpOworICBpZiAoc3BhY2UpCisgICAgeworICAgICAgcCA9IGZyYWdfbW9yZSAoNCk7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIFNQQUNFX1NQTlVNIChzcGFjZSksIDQpOworICAgIH0KKyAgZWxzZQorICAgIGFzX3dhcm4gKF8oIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIpLCBuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSWYgVkFMVUUgaXMgYW4gZXhhY3QgcG93ZXIgb2YgdHdvIGJldHdlZW4gemVybyBhbmQgMl4zMSwgdGhlbgorICAgcmV0dXJuIGxvZzIgKFZBTFVFKS4gIEVsc2UgcmV0dXJuIC0xLiAgKi8KKworc3RhdGljIGludAorbG9nMiAodmFsdWUpCisgICAgIGludCB2YWx1ZTsKK3sKKyAgaW50IHNoaWZ0ID0gMDsKKworICB3aGlsZSAoKDEgPDwgc2hpZnQpICE9IHZhbHVlICYmIHNoaWZ0IDwgMzIpCisgICAgc2hpZnQrKzsKKworICBpZiAoc2hpZnQgPj0gMzIpCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgcmV0dXJuIHNoaWZ0OworfQorCisvKiBIYW5kbGUgYSAuU1VCU1BBQ0UgcHNldWRvLW9wOyB0aGlzIHN3aXRjaGVzIHRoZSBjdXJyZW50IHN1YnNwYWNlIHRvIHRoZQorICAgZ2l2ZW4gc3Vic3BhY2UsIGNyZWF0aW5nIHRoZSBuZXcgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LgorCisgICBGSVhNRS4gIFNob3VsZCBtaXJyb3IgcGFfc3BhY2UgbW9yZSBjbG9zZWx5LCBpbiBwYXJ0aWN1bGFyIGhvdworICAgdGhleSdyZSBicm9rZW4gdXAgaW50byBzdWJyb3V0aW5lcy4gICovCisKK3N0YXRpYyB2b2lkCitwYV9zdWJzcGFjZSAoY3JlYXRlX25ldykKKyAgICAgaW50IGNyZWF0ZV9uZXc7Cit7CisgIGNoYXIgKm5hbWUsICpzc19uYW1lLCAqYWxpYXMsIGM7CisgIGNoYXIgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCB6ZXJvLCBzb3J0OworICBpbnQgaSwgYWNjZXNzLCBzcGFjZV9pbmRleCwgYWxpZ25tZW50LCBxdWFkcmFudCwgYXBwbGljYWJsZSwgZmxhZ3M7CisgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7CisgIHNzZF9jaGFpbl9zdHJ1Y3QgKnNzZDsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisKKyAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKKyAgICBhc19mYXRhbCAoXygiTXVzdCBiZSBpbiBhIHNwYWNlIGJlZm9yZSBjaGFuZ2luZyBvciBkZWNsYXJpbmcgc3Vic3BhY2VzLlxuIikpOworCisgIGlmICh3aXRoaW5fcHJvY2VkdXJlKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiQ2FuXCd0IGNoYW5nZSBzdWJzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICBzc19uYW1lID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOworICAgICAgc3RyY3B5IChzc19uYW1lLCBuYW1lKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgICAgICAvKiBMb2FkIGRlZmF1bHQgdmFsdWVzLiAgKi8KKyAgICAgIHNvcnQgPSAwOworICAgICAgYWNjZXNzID0gMHg3ZjsKKyAgICAgIGxvYWRhYmxlID0gMTsKKyAgICAgIGNvbW1vbiA9IDA7CisgICAgICBkdXBfY29tbW9uID0gMDsKKyAgICAgIGNvZGVfb25seSA9IDA7CisgICAgICB6ZXJvID0gMDsKKyAgICAgIHNwYWNlX2luZGV4ID0gfjA7CisgICAgICBhbGlnbm1lbnQgPSAxOworICAgICAgcXVhZHJhbnQgPSAwOworICAgICAgYWxpYXMgPSBOVUxMOworCisgICAgICBzcGFjZSA9IGN1cnJlbnRfc3BhY2U7CisgICAgICBpZiAoY3JlYXRlX25ldykKKwlzc2QgPSBOVUxMOworICAgICAgZWxzZQorCXNzZCA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKHNzX25hbWUpOworICAgICAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgYnVpbHRpbiBhdHRyaWJ1dGVzIG9mIHN1YnNwYWNlcy4gIEJ1dAorICAgICAgICAgb25seSBhbGxvdyB0aGUgYXR0cmlidXRlcyB0byBiZSBjaGFuZ2VkIG9uY2UhICAqLworICAgICAgaWYgKHNzZCAmJiBTVUJTUEFDRV9ERUZJTkVEIChzc2QpKQorCXsKKwkgIHN1YnNlZ19zZXQgKHNzZC0+c3NkX3NlZywgc3NkLT5zc2Rfc3Vic2VnKTsKKwkgIGN1cnJlbnRfc3Vic3BhY2UgPSBzc2Q7CisJICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisJICAgIGFzX3dhcm4gKF8oIlBhcmFtZXRlcnMgb2YgYW4gZXhpc3Rpbmcgc3Vic3BhY2UgY2FuXCd0IGJlIG1vZGlmaWVkIikpOworCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQSBuZXcgc3Vic3BhY2UuICBMb2FkIGRlZmF1bHQgdmFsdWVzIGlmIGl0IG1hdGNoZXMgb25lIG9mCisJICAgICB0aGUgYnVpbHRpbiBzdWJzcGFjZXMuICAqLworCSAgaSA9IDA7CisJICB3aGlsZSAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKQorCSAgICB7CisJICAgICAgaWYgKHN0cmNhc2VjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgc3NfbmFtZSkgPT0gMCkKKwkJeworCQkgIGxvYWRhYmxlID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5sb2FkYWJsZTsKKwkJICBjb21tb24gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvbW1vbjsKKwkJICBkdXBfY29tbW9uID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uOworCQkgIGNvZGVfb25seSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uY29kZV9vbmx5OworCQkgIHplcm8gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnplcm87CisJCSAgc3BhY2VfaW5kZXggPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4OworCQkgIGFsaWdubWVudCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uYWxpZ25tZW50OworCQkgIHF1YWRyYW50ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5xdWFkcmFudDsKKwkJICBhY2Nlc3MgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFjY2VzczsKKwkJICBzb3J0ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0OworCQkgIGlmIChVU0VfQUxJQVNFUyAmJiBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWFzKQorCQkgICAgYWxpYXMgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFsaWFzOworCQkgIGJyZWFrOworCQl9CisJICAgICAgaSsrOworCSAgICB9CisJfQorCisgICAgICAvKiBXZSBzaG91bGQgYmUgd29ya2luZyB3aXRoIGEgbmV3IHN1YnNwYWNlIG5vdy4gIEZpbGwgaW4KKyAgICAgICAgIGFueSBpbmZvcm1hdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICAqLworICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCSAgICB7CisJICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisJICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInF1YWQiLCA0KSA9PSAwKSkKKwkJeworCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCQkgIHF1YWRyYW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisJCX0KKwkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhbGlnbiIsIDUpID09IDApKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJCSAgYWxpZ25tZW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisJCSAgaWYgKGxvZzIgKGFsaWdubWVudCkgPT0gLTEpCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIikpOworCQkgICAgICBhbGlnbm1lbnQgPSAxOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYWNjZXNzIiwgNikgPT0gMCkpCisJCXsKKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkJICBhY2Nlc3MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNvcnQiLCA0KSA9PSAwKSkKKwkJeworCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCQkgIHNvcnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNvZGVfb25seSIsIDkpID09IDApKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgY29kZV9vbmx5ID0gMTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInVubG9hZGFibGUiLCAxMCkgPT0gMCkpCisJCXsKKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICBsb2FkYWJsZSA9IDA7CisJCX0KKwkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjb21tb24iLCA2KSA9PSAwKSkKKwkJeworCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIGNvbW1vbiA9IDE7CisJCX0KKwkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJkdXBfY29tbSIsIDgpID09IDApKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgZHVwX2NvbW1vbiA9IDE7CisJCX0KKwkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ6ZXJvIiwgNCkgPT0gMCkpCisJCXsKKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICB6ZXJvID0gMTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZpcnN0IiwgNSkgPT0gMCkpCisJCWFzX2JhZCAoXygiRklSU1Qgbm90IHN1cHBvcnRlZCBhcyBhIC5TVUJTUEFDRSBhcmd1bWVudCIpKTsKKwkgICAgICBlbHNlCisJCWFzX2JhZCAoXygiSW52YWxpZCAuU1VCU1BBQ0UgYXJndW1lbnQiKSk7CisJICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQorCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgICAgfQorCX0KKworICAgICAgLyogQ29tcHV0ZSBhIHJlYXNvbmFibGUgc2V0IG9mIEJGRCBmbGFncyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KKyAgICAgICAgIGluIHRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgKi8KKyAgICAgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOworICAgICAgZmxhZ3MgPSAwOworICAgICAgaWYgKGxvYWRhYmxlKQorCWZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCk7CisgICAgICBpZiAoY29kZV9vbmx5KQorCWZsYWdzIHw9IFNFQ19DT0RFOworICAgICAgaWYgKGNvbW1vbiB8fCBkdXBfY29tbW9uKQorCWZsYWdzIHw9IFNFQ19JU19DT01NT047CisKKyAgICAgIGZsYWdzIHw9IFNFQ19SRUxPQyB8IFNFQ19IQVNfQ09OVEVOVFM7CisKKyAgICAgIC8qIFRoaXMgaXMgYSB6ZXJvLWZpbGxlZCBzdWJzcGFjZSAoZWcgQlNTKS4gICovCisgICAgICBpZiAoemVybykKKwlmbGFncyAmPSB+KFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyk7CisKKyAgICAgIGFwcGxpY2FibGUgJj0gZmxhZ3M7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYW4gZXhpc3Rpbmcgc3Vic3BhY2UsIHRoZW4gd2Ugd2FudCB0byB1c2UgdGhlCisgICAgICAgICBzZWdtZW50IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzcGFjZS4KKworICAgICAgICAgRklYTUUgTk9XISAgRUxGIEJGRCBkb2Vzbid0IGFwcGVhciB0byBiZSByZWFkeSB0byBkZWFsIHdpdGgKKyAgICAgICAgIGxvdHMgb2Ygc2VjdGlvbnMuICBJdCBtaWdodCBiZSBhIHByb2JsZW0gaW4gdGhlIFBBIEVMRgorICAgICAgICAgY29kZSwgSSBkbyBub3Qga25vdyB5ZXQuICBGb3Igbm93IGF2b2lkIGNyZWF0aW5nIGFueXRoaW5nCisgICAgICAgICBidXQgdGhlICJzdGFuZGFyZCIgc2VjdGlvbnMgZm9yIEVMRi4gICovCisgICAgICBpZiAoY3JlYXRlX25ldykKKwlzZWN0aW9uID0gc3Vic2VnX2ZvcmNlX25ldyAoc3NfbmFtZSwgMCk7CisgICAgICBlbHNlIGlmIChzc2QpCisJc2VjdGlvbiA9IHNzZC0+c3NkX3NlZzsKKyAgICAgIGVsc2UgaWYgKGFsaWFzKQorCXNlY3Rpb24gPSBzdWJzZWdfbmV3IChhbGlhcywgMCk7CisgICAgICBlbHNlIGlmICghYWxpYXMgJiYgVVNFX0FMSUFTRVMpCisJeworCSAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3Vic3BhY2UgZGVjbCBkdWUgdG8gRUxGIEJGRCBidWdzLiIpKTsKKwkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXNlY3Rpb24gPSBzdWJzZWdfbmV3IChzc19uYW1lLCAwKTsKKworICAgICAgaWYgKHplcm8pCisJc2VnX2luZm8gKHNlY3Rpb24pLT5ic3MgPSAxOworCisgICAgICAvKiBOb3cgc2V0IHRoZSBmbGFncy4gICovCisgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjdGlvbiwgYXBwbGljYWJsZSk7CisKKyAgICAgIC8qIFJlY29yZCBhbnkgYWxpZ25tZW50IHJlcXVlc3QgZm9yIHRoaXMgc2VjdGlvbi4gICovCisgICAgICByZWNvcmRfYWxpZ25tZW50IChzZWN0aW9uLCBsb2cyIChhbGlnbm1lbnQpKTsKKworICAgICAgLyogU2V0IHRoZSBzdGFydGluZyBvZmZzZXQgZm9yIHRoaXMgc2VjdGlvbi4gICovCisgICAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlY3Rpb24sCisJCQkgICBwYV9zdWJzcGFjZV9zdGFydCAoc3BhY2UsIHF1YWRyYW50KSk7CisKKyAgICAgIC8qIE5vdyB0aGF0IGFsbCB0aGUgZmxhZ3MgYXJlIHNldCwgdXBkYXRlIGFuIGV4aXN0aW5nIHN1YnNwYWNlLAorICAgICAgICAgb3IgY3JlYXRlIGEgbmV3IG9uZS4gICovCisgICAgICBpZiAoc3NkKQorCisJY3VycmVudF9zdWJzcGFjZSA9IHVwZGF0ZV9zdWJzcGFjZSAoc3BhY2UsIHNzX25hbWUsIGxvYWRhYmxlLAorCQkJCQkgICAgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sCisJCQkJCSAgICBzb3J0LCB6ZXJvLCBhY2Nlc3MsIHNwYWNlX2luZGV4LAorCQkJCQkgICAgYWxpZ25tZW50LCBxdWFkcmFudCwKKwkJCQkJICAgIHNlY3Rpb24pOworICAgICAgZWxzZQorCWN1cnJlbnRfc3Vic3BhY2UgPSBjcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgc3NfbmFtZSwgbG9hZGFibGUsCisJCQkJCQljb2RlX29ubHksIGNvbW1vbiwKKwkJCQkJCWR1cF9jb21tb24sIHplcm8sIHNvcnQsCisJCQkJCQlhY2Nlc3MsIHNwYWNlX2luZGV4LAorCQkJCQkgICAgICBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWN0aW9uKTsKKworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcgPSBzZWN0aW9uOworICAgICAgc3Vic2VnX3NldCAoY3VycmVudF9zdWJzcGFjZS0+c3NkX3NlZywgY3VycmVudF9zdWJzcGFjZS0+c3NkX3N1YnNlZyk7CisgICAgfQorICBTVUJTUEFDRV9ERUZJTkVEIChjdXJyZW50X3N1YnNwYWNlKSA9IDE7Cit9CisKKworLyogQ3JlYXRlIGRlZmF1bHQgc3BhY2UgYW5kIHN1YnNwYWNlIGRpY3Rpb25hcmllcy4gICovCisKK3N0YXRpYyB2b2lkCitwYV9zcGFjZXNfYmVnaW4gKCkKK3sKKyAgaW50IGk7CisKKyAgc3BhY2VfZGljdF9yb290ID0gTlVMTDsKKyAgc3BhY2VfZGljdF9sYXN0ID0gTlVMTDsKKworICBpID0gMDsKKyAgd2hpbGUgKHBhX2RlZl9zcGFjZXNbaV0ubmFtZSkKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworCisgICAgICAvKiBQaWNrIHRoZSByaWdodCBuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyBzZWN0aW9uLiAgKi8KKyAgICAgIGlmIChwYV9kZWZfc3BhY2VzW2ldLmFsaWFzICYmIFVTRV9BTElBU0VTKQorCW5hbWUgPSBwYV9kZWZfc3BhY2VzW2ldLmFsaWFzOworICAgICAgZWxzZQorCW5hbWUgPSBwYV9kZWZfc3BhY2VzW2ldLm5hbWU7CisKKyAgICAgIHBhX2RlZl9zcGFjZXNbaV0uc2VnbWVudCA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOworICAgICAgY3JlYXRlX25ld19zcGFjZSAocGFfZGVmX3NwYWNlc1tpXS5uYW1lLCBwYV9kZWZfc3BhY2VzW2ldLnNwbnVtLAorCQkJcGFfZGVmX3NwYWNlc1tpXS5sb2FkYWJsZSwgcGFfZGVmX3NwYWNlc1tpXS5kZWZpbmVkLAorCQkJcGFfZGVmX3NwYWNlc1tpXS5wcml2YXRlLCBwYV9kZWZfc3BhY2VzW2ldLnNvcnQsCisJCQlwYV9kZWZfc3BhY2VzW2ldLnNlZ21lbnQsIDApOworICAgICAgaSsrOworICAgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSkKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworICAgICAgaW50IGFwcGxpY2FibGUsIHN1YnNlZ21lbnQ7CisgICAgICBhc2VjdGlvbiAqc2VnbWVudCA9IE5VTEw7CisgICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOworCisgICAgICAvKiBQaWNrIHRoZSByaWdodCBuYW1lIGZvciB0aGUgbmV3IHNlY3Rpb24gYW5kIHBpY2sgdGhlIHJpZ2h0CisgICAgICAgICBzdWJzZWdtZW50IG51bWJlci4gICovCisgICAgICBpZiAocGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlhcyAmJiBVU0VfQUxJQVNFUykKKwl7CisJICBuYW1lID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlhczsKKwkgIHN1YnNlZ21lbnQgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnN1YnNlZ21lbnQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5hbWUgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWU7CisJICBzdWJzZWdtZW50ID0gMDsKKwl9CisKKyAgICAgIC8qIENyZWF0ZSB0aGUgbmV3IHNlY3Rpb24uICAqLworICAgICAgc2VnbWVudCA9IHN1YnNlZ19uZXcgKG5hbWUsIHN1YnNlZ21lbnQpOworCisKKyAgICAgIC8qIEZvciBTT00gd2Ugd2FudCB0byByZXBsYWNlIHRoZSBzdGFuZGFyZCAudGV4dCwgLmRhdGEsIGFuZCAuYnNzCisgICAgICAgICBzZWN0aW9ucyB3aXRoIG91ciBvd24uICAgV2UgYWxzbyB3YW50IHRvIHNldCBCRkQgZmxhZ3MgZm9yCisJIGFsbCB0aGUgYnVpbHQtaW4gc3Vic3BhY2VzLiAgKi8KKyAgICAgIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkQ09ERSQiKSAmJiAhVVNFX0FMSUFTRVMpCisJeworCSAgdGV4dF9zZWN0aW9uID0gc2VnbWVudDsKKwkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOworCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCisJCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKKwkJCQkJICAgICAgIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUKKwkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCisJCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKKwl9CisgICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkREFUQSQiKSAmJiAhVVNFX0FMSUFTRVMpCisJeworCSAgZGF0YV9zZWN0aW9uID0gc2VnbWVudDsKKwkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOworCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCisJCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKKwkJCQkJICAgICAgIHwgU0VDX1JFTE9DCisJCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKKworCisJfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJEJTUyQiKSAmJiAhVVNFX0FMSUFTRVMpCisJeworCSAgYnNzX3NlY3Rpb24gPSBzZWdtZW50OworCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7CisJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKKwkJCQkgYXBwbGljYWJsZSAmIFNFQ19BTExPQyk7CisJfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJExJVCQiKSAmJiAhVVNFX0FMSUFTRVMpCisJeworCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7CisJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKKwkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAorCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKKwkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCisJCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKKwl9CisgICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkTUlMTElDT0RFJCIpCisJICAgICAgICYmICFVU0VfQUxJQVNFUykKKwl7CisJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKKwkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAorCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECisJCQkJCSAgICAgICB8IFNFQ19SRUxPQworCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKKwkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOworCX0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRVTldJTkQkIikgJiYgIVVTRV9BTElBU0VTKQorCXsKKwkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOworCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCisJCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKKwkJCQkJICAgICAgIHwgU0VDX1JFTE9DCisJCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQorCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7CisJfQorCisgICAgICAvKiBGaW5kIHRoZSBzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCisgICAgICBzcGFjZSA9IHBhX3NlZ21lbnRfdG9fc3BhY2UgKHBhX2RlZl9zcGFjZXNbcGFfZGVmX3N1YnNwYWNlc1tpXS4KKwkJCQkJCSBkZWZfc3BhY2VfaW5kZXhdLnNlZ21lbnQpOworICAgICAgaWYgKHNwYWNlID09IE5VTEwpCisJeworCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iKSwKKwkJICAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSk7CisJfQorCisgICAgICBjcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgbmFtZSwKKwkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0ubG9hZGFibGUsCisJCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvZGVfb25seSwKKwkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uY29tbW9uLAorCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uLAorCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS56ZXJvLAorCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0LAorCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5hY2Nlc3MsCisJCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4LAorCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5hbGlnbm1lbnQsCisJCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLnF1YWRyYW50LAorCQkJICAgc2VnbWVudCk7CisgICAgICBpKys7CisgICAgfQorfQorCisKKworLyogQ3JlYXRlIGEgbmV3IHNwYWNlIE5BTUUsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFzIGRlZmluZWQKKyAgIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiAgKi8KKworc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCitjcmVhdGVfbmV3X3NwYWNlIChuYW1lLCBzcG51bSwgbG9hZGFibGUsIGRlZmluZWQsIHByaXZhdGUsCisJCSAgc29ydCwgc2VnLCB1c2VyX2RlZmluZWQpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBzcG51bTsKKyAgICAgaW50IGxvYWRhYmxlOworICAgICBpbnQgZGVmaW5lZDsKKyAgICAgaW50IHByaXZhdGU7CisgICAgIGludCBzb3J0OworICAgICBhc2VjdGlvbiAqc2VnOworICAgICBpbnQgdXNlcl9kZWZpbmVkOworeworICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OworCisgIGNoYWluX2VudHJ5ID0gKHNkX2NoYWluX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKHNkX2NoYWluX3N0cnVjdCkpOworICBpZiAoIWNoYWluX2VudHJ5KQorICAgIGFzX2ZhdGFsIChfKCJPdXQgb2YgbWVtb3J5OiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IHNwYWNlIGNoYWluIGVudHJ5OiAlc1xuIiksCisJICAgICAgbmFtZSk7CisKKyAgU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOworICBzdHJjcHkgKFNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSwgbmFtZSk7CisgIFNQQUNFX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IGRlZmluZWQ7CisgIFNQQUNFX1VTRVJfREVGSU5FRCAoY2hhaW5fZW50cnkpID0gdXNlcl9kZWZpbmVkOworICBTUEFDRV9TUE5VTSAoY2hhaW5fZW50cnkpID0gc3BudW07CisKKyAgY2hhaW5fZW50cnktPnNkX3NlZyA9IHNlZzsKKyAgY2hhaW5fZW50cnktPnNkX2xhc3Rfc3Vic2VnID0gLTE7CisgIGNoYWluX2VudHJ5LT5zZF9zdWJzcGFjZXMgPSBOVUxMOworICBjaGFpbl9lbnRyeS0+c2RfbmV4dCA9IE5VTEw7CisKKyAgLyogRmluZCBzcG90IGZvciB0aGUgbmV3IHNwYWNlIGJhc2VkIG9uIGl0cyBzb3J0IGtleS4gICovCisgIGlmICghc3BhY2VfZGljdF9sYXN0KQorICAgIHNwYWNlX2RpY3RfbGFzdCA9IGNoYWluX2VudHJ5OworCisgIGlmIChzcGFjZV9kaWN0X3Jvb3QgPT0gTlVMTCkKKyAgICBzcGFjZV9kaWN0X3Jvb3QgPSBjaGFpbl9lbnRyeTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKKyAgICAgIHNkX2NoYWluX3N0cnVjdCAqcHJldl9jaGFpbl9wb2ludGVyOworCisgICAgICBjaGFpbl9wb2ludGVyID0gc3BhY2VfZGljdF9yb290OworICAgICAgcHJldl9jaGFpbl9wb2ludGVyID0gTlVMTDsKKworICAgICAgd2hpbGUgKGNoYWluX3BvaW50ZXIpCisJeworCSAgcHJldl9jaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlcjsKKwkgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zZF9uZXh0OworCX0KKworICAgICAgLyogQXQgdGhpcyBwb2ludCB3ZSd2ZSBmb3VuZCB0aGUgY29ycmVjdCBwbGFjZSB0byBhZGQgdGhlIG5ldworICAgICAgICAgZW50cnkuICBTbyBhZGQgaXQgYW5kIHVwZGF0ZSB0aGUgbGlua2VkIGxpc3RzIGFzIGFwcHJvcHJpYXRlLiAgKi8KKyAgICAgIGlmIChwcmV2X2NoYWluX3BvaW50ZXIpCisJeworCSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBjaGFpbl9wb2ludGVyOworCSAgcHJldl9jaGFpbl9wb2ludGVyLT5zZF9uZXh0ID0gY2hhaW5fZW50cnk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNwYWNlX2RpY3Rfcm9vdCA9IGNoYWluX2VudHJ5OworCSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBjaGFpbl9wb2ludGVyOworCX0KKworICAgICAgaWYgKGNoYWluX2VudHJ5LT5zZF9uZXh0ID09IE5VTEwpCisJc3BhY2VfZGljdF9sYXN0ID0gY2hhaW5fZW50cnk7CisgICAgfQorCisgIC8qIFRoaXMgaXMgaGVyZSB0byBjYXRjaCBwcmVkZWZpbmVkIHNwYWNlcyB3aGljaCBkbyBub3QgZ2V0CisgICAgIG1vZGlmaWVkIGJ5IHRoZSB1c2VyJ3MgaW5wdXQuICBBbm90aGVyIGNhbGwgaXMgZm91bmQgYXQKKyAgICAgdGhlIGJvdHRvbSBvZiBwYV9wYXJzZV9zcGFjZV9zdG10IHRvIGhhbmRsZSBjYXNlcyB3aGVyZQorICAgICB0aGUgdXNlciBtb2RpZmllcyBhIHByZWRlZmluZWQgc3BhY2UuICAqLworI2lmZGVmIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCisgIG9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIGRlZmluZWQsIHByaXZhdGUsIHNvcnQsIHNwbnVtKTsKKyNlbmRpZgorCisgIHJldHVybiBjaGFpbl9lbnRyeTsKK30KKworLyogQ3JlYXRlIGEgbmV3IHN1YnNwYWNlIE5BTUUsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFzIGRlZmluZWQKKyAgIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorCisgICBBZGQgdGhlIG5ldyBzdWJzcGFjZSB0byB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeSBjaGFpbiBpbiBudW1lcmljYWwKKyAgIG9yZGVyIGFzIGRlZmluZWQgYnkgdGhlIFNPUlQgZW50cmllcy4gICovCisKK3N0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKK2NyZWF0ZV9uZXdfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sCisJCSAgICAgZHVwX2NvbW1vbiwgaXNfemVybywgc29ydCwgYWNjZXNzLCBzcGFjZV9pbmRleCwKKwkJICAgICBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWcpCisgICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sIGlzX3plcm87CisgICAgIGludCBzb3J0OworICAgICBpbnQgYWNjZXNzOworICAgICBpbnQgc3BhY2VfaW5kZXg7CisgICAgIGludCBhbGlnbm1lbnQ7CisgICAgIGludCBxdWFkcmFudDsKKyAgICAgYXNlY3Rpb24gKnNlZzsKK3sKKyAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7CisKKyAgY2hhaW5fZW50cnkgPSAoc3NkX2NoYWluX3N0cnVjdCAqKSB4bWFsbG9jIChzaXplb2YgKHNzZF9jaGFpbl9zdHJ1Y3QpKTsKKyAgaWYgKCFjaGFpbl9lbnRyeSkKKyAgICBhc19mYXRhbCAoXygiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzdWJzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIpLCBuYW1lKTsKKworICBTVUJTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSkgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7CisgIHN0cmNweSAoU1VCU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpLCBuYW1lKTsKKworICAvKiBJbml0aWFsaXplIHN1YnNwYWNlX2RlZmluZWQuICBXaGVuIHdlIGhpdCBhIC5zdWJzcGFjZSBkaXJlY3RpdmUKKyAgICAgd2UnbGwgc2V0IGl0IHRvIDEgd2hpY2ggImxvY2tzLWluIiB0aGUgc3Vic3BhY2UgYXR0cmlidXRlcy4gICovCisgIFNVQlNQQUNFX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IDA7CisKKyAgY2hhaW5fZW50cnktPnNzZF9zdWJzZWcgPSBVU0VfQUxJQVNFUyA/IHBhX25leHRfc3Vic2VnIChzcGFjZSkgOiAwOworICBjaGFpbl9lbnRyeS0+c3NkX3NlZyA9IHNlZzsKKyAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gTlVMTDsKKworICAvKiBGaW5kIHNwb3QgZm9yIHRoZSBuZXcgc3Vic3BhY2UgYmFzZWQgb24gaXRzIHNvcnQga2V5LiAgKi8KKyAgaWYgKHNwYWNlLT5zZF9zdWJzcGFjZXMgPT0gTlVMTCkKKyAgICBzcGFjZS0+c2Rfc3Vic3BhY2VzID0gY2hhaW5fZW50cnk7CisgIGVsc2UKKyAgICB7CisgICAgICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOworICAgICAgc3NkX2NoYWluX3N0cnVjdCAqcHJldl9jaGFpbl9wb2ludGVyOworCisgICAgICBjaGFpbl9wb2ludGVyID0gc3BhY2UtPnNkX3N1YnNwYWNlczsKKyAgICAgIHByZXZfY2hhaW5fcG9pbnRlciA9IE5VTEw7CisKKyAgICAgIHdoaWxlIChjaGFpbl9wb2ludGVyKQorCXsKKwkgIHByZXZfY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXI7CisJICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c3NkX25leHQ7CisJfQorCisgICAgICAvKiBOb3cgd2UgaGF2ZSBzb21ld2hlcmUgdG8gcHV0IHRoZSBuZXcgZW50cnkuICBJbnNlcnQgaXQgYW5kIHVwZGF0ZQorICAgICAgICAgdGhlIGxpbmtzLiAgKi8KKyAgICAgIGlmIChwcmV2X2NoYWluX3BvaW50ZXIpCisJeworCSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKKwkgIHByZXZfY2hhaW5fcG9pbnRlci0+c3NkX25leHQgPSBjaGFpbl9lbnRyeTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3BhY2UtPnNkX3N1YnNwYWNlcyA9IGNoYWluX2VudHJ5OworCSAgY2hhaW5fZW50cnktPnNzZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKKwl9CisgICAgfQorCisjaWZkZWYgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKKyAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlZywgc3BhY2UtPnNkX3NlZywgYWNjZXNzLAorCQkJCSBzb3J0LCBxdWFkcmFudCk7CisjZW5kaWYKKworICByZXR1cm4gY2hhaW5fZW50cnk7Cit9CisKKy8qIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBzdWJzcGFjZSBiYXNlZCB1cG9uIHRoZQorICAgdmFyaW91cyBhcmd1bWVudHMuICAgUmV0dXJuIHRoZSBtb2RpZmllZCBzdWJzcGFjZSBjaGFpbiBlbnRyeS4gICovCisKK3N0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKK3VwZGF0ZV9zdWJzcGFjZSAoc3BhY2UsIG5hbWUsIGxvYWRhYmxlLCBjb2RlX29ubHksIGNvbW1vbiwgZHVwX2NvbW1vbiwgc29ydCwKKwkJIHplcm8sIGFjY2Vzcywgc3BhY2VfaW5kZXgsIGFsaWdubWVudCwgcXVhZHJhbnQsIHNlY3Rpb24pCisgICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBsb2FkYWJsZTsKKyAgICAgaW50IGNvZGVfb25seTsKKyAgICAgaW50IGNvbW1vbjsKKyAgICAgaW50IGR1cF9jb21tb247CisgICAgIGludCB6ZXJvOworICAgICBpbnQgc29ydDsKKyAgICAgaW50IGFjY2VzczsKKyAgICAgaW50IHNwYWNlX2luZGV4OworICAgICBpbnQgYWxpZ25tZW50OworICAgICBpbnQgcXVhZHJhbnQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICBzc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKKworICBjaGFpbl9lbnRyeSA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKG5hbWUpOworCisjaWZkZWYgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMKKyAgb2JqX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIHNwYWNlLT5zZF9zZWcsIGFjY2VzcywKKwkJCQkgc29ydCwgcXVhZHJhbnQpOworI2VuZGlmCisKKyAgcmV0dXJuIGNoYWluX2VudHJ5OworfQorCisvKiBSZXR1cm4gdGhlIHNwYWNlIGNoYWluIGVudHJ5IGZvciB0aGUgc3BhY2Ugd2l0aCB0aGUgbmFtZSBOQU1FIG9yCisgICBOVUxMIGlmIG5vIHN1Y2ggc3BhY2UgZXhpc3RzLiAgKi8KKworc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCitpc19kZWZpbmVkX3NwYWNlIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7CisKKyAgZm9yIChjaGFpbl9wb2ludGVyID0gc3BhY2VfZGljdF9yb290OworICAgICAgIGNoYWluX3BvaW50ZXI7CisgICAgICAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNkX25leHQpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoU1BBQ0VfTkFNRSAoY2hhaW5fcG9pbnRlciksIG5hbWUpID09IDApCisJcmV0dXJuIGNoYWluX3BvaW50ZXI7CisgICAgfQorCisgIC8qIE5vIG1hcHBpbmcgZnJvbSBzZWdtZW50IHRvIHNwYWNlIHdhcyBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZpbmQgYW5kIHJldHVybiB0aGUgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWcuICBJZiBubyBtYXBwaW5nCisgICBmcm9tIHRoZSBnaXZlbiBzZWcgdG8gYSBzcGFjZSBpcyBmb3VuZCwgdGhlbiByZXR1cm4gTlVMTC4KKworICAgVW5saWtlIHN1YnNwYWNlcywgdGhlIG51bWJlciBvZiBzcGFjZXMgaXMgbm90IGV4cGVjdGVkIHRvIGdyb3cgbXVjaCwKKyAgIHNvIGEgbGluZWFyIGV4aGF1c3RpdmUgc2VhcmNoIGlzIE9LIGhlcmUuICAqLworCitzdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKK3BhX3NlZ21lbnRfdG9fc3BhY2UgKHNlZykKKyAgICAgYXNlY3Rpb24gKnNlZzsKK3sKKyAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZV9jaGFpbjsKKworICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZSBsb29raW5nIGZvciB0aGUgY29ycmVjdCBtYXBwaW5nLiAgKi8KKyAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKKyAgICAgICBzcGFjZV9jaGFpbjsKKyAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQorICAgIHsKKyAgICAgIGlmIChzcGFjZV9jaGFpbi0+c2Rfc2VnID09IHNlZykKKwlyZXR1cm4gc3BhY2VfY2hhaW47CisgICAgfQorCisgIC8qIE1hcHBpbmcgd2FzIG5vdCBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiB0aGUgc3BhY2UgY2hhaW4gZW50cnkgZm9yIHRoZSBzdWJzcGFjZSB3aXRoIHRoZSBuYW1lIE5BTUUgb3IKKyAgIE5VTEwgaWYgbm8gc3VjaCBzdWJzcGFjZSBleGlzdHMuCisKKyAgIFVzZXMgYSBsaW5lYXIgc2VhcmNoIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcywgdGhpcyBtYXkKKyAgIG5vdCBiZSBhcHByb3ByaWF0ZSBpZiB3ZSBldmVyIGJlaW5nIHBsYWNpbmcgZWFjaCBmdW5jdGlvbiBpbiBpdHMKKyAgIG93biBzdWJzcGFjZS4gICovCisKK3N0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICoKK2lzX2RlZmluZWRfc3Vic3BhY2UgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47CisgIHNzZF9jaGFpbl9zdHJ1Y3QgKnN1YnNwYWNlX2NoYWluOworCisgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlLiAgKi8KKyAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKKyAgICAgICBzcGFjZV9jaGFpbjsKKyAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQorICAgIHsKKyAgICAgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHN1YnNwYWNlIGxvb2tpbmcgZm9yIGEgbmFtZSB3aGljaCBtYXRjaGVzLiAgKi8KKyAgICAgIGZvciAoc3Vic3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2Rfc3Vic3BhY2VzOworCSAgIHN1YnNwYWNlX2NoYWluOworCSAgIHN1YnNwYWNlX2NoYWluID0gc3Vic3BhY2VfY2hhaW4tPnNzZF9uZXh0KQorCWlmIChzdHJjbXAgKFNVQlNQQUNFX05BTUUgKHN1YnNwYWNlX2NoYWluKSwgbmFtZSkgPT0gMCkKKwkgIHJldHVybiBzdWJzcGFjZV9jaGFpbjsKKyAgICB9CisKKyAgLyogU3Vic3BhY2Ugd2Fzbid0IGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogRmluZCBhbmQgcmV0dXJuIHRoZSBzdWJzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlZy4gIElmIG5vCisgICBtYXBwaW5nIGZyb20gdGhlIGdpdmVuIHNlZyB0byBhIHN1YnNwYWNlIGlzIGZvdW5kLCB0aGVuIHJldHVybiBOVUxMLgorCisgICBJZiB3ZSBldmVyIHB1dCBlYWNoIHByb2NlZHVyZS9mdW5jdGlvbiB3aXRoaW4gaXRzIG93biBzdWJzcGFjZQorICAgKHRvIG1ha2UgbGlmZSBlYXNpZXIgb24gdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIpLCB0aGVuIHRoaXMgd2lsbCBoYXZlCisgICB0byBiZWNvbWUgbW9yZSBlZmZpY2llbnQuICAqLworCitzdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCitwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZWcsIHN1YnNlZykKKyAgICAgYXNlY3Rpb24gKnNlZzsKKyAgICAgc3Vic2VnVCBzdWJzZWc7Cit7CisgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47CisgIHNzZF9jaGFpbl9zdHJ1Y3QgKnN1YnNwYWNlX2NoYWluOworCisgIC8qIFdhbGsgdGhyb3VnaCBlYWNoIHNwYWNlLiAgKi8KKyAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKKyAgICAgICBzcGFjZV9jaGFpbjsKKyAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQorICAgIHsKKyAgICAgIGlmIChzcGFjZV9jaGFpbi0+c2Rfc2VnID09IHNlZykKKwl7CisJICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzdWJzcGFjZSB3aXRoaW4gZWFjaCBzcGFjZSBsb29raW5nIGZvcgorCSAgICAgdGhlIGNvcnJlY3QgbWFwcGluZy4gICovCisJICBmb3IgKHN1YnNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX3N1YnNwYWNlczsKKwkgICAgICAgc3Vic3BhY2VfY2hhaW47CisJICAgICAgIHN1YnNwYWNlX2NoYWluID0gc3Vic3BhY2VfY2hhaW4tPnNzZF9uZXh0KQorCSAgICBpZiAoc3Vic3BhY2VfY2hhaW4tPnNzZF9zdWJzZWcgPT0gKGludCkgc3Vic2VnKQorCSAgICAgIHJldHVybiBzdWJzcGFjZV9jaGFpbjsKKwl9CisgICAgfQorCisgIC8qIE5vIG1hcHBpbmcgZnJvbSBzdWJzZWdtZW50IHRvIHN1YnNwYWNlIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYSBudW1iZXIsIHRyeSBhbmQgZmluZCBhIHNwYWNlIHdpdGggdGhlIG5hbWUgbnVtYmVyLgorCisgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3BhY2UgZGljdGlvbmFyeSBjaGFpbiBlbnRyeSBmb3IgdGhlIHNwYWNlCisgICB0aGF0IHdhcyBmb3VuZCBvciBOVUxMIG9uIGZhaWx1cmUuICAqLworCitzdGF0aWMgc2RfY2hhaW5fc3RydWN0ICoKK3BhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyIChudW1iZXIpCisgICAgIGludCBudW1iZXI7Cit7CisgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47CisKKyAgZm9yIChzcGFjZV9jaGFpbiA9IHNwYWNlX2RpY3Rfcm9vdDsKKyAgICAgICBzcGFjZV9jaGFpbjsKKyAgICAgICBzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9uZXh0KQorICAgIHsKKyAgICAgIGlmIChTUEFDRV9TUE5VTSAoc3BhY2VfY2hhaW4pID09ICh1bnNpZ25lZCBpbnQpIG51bWJlcikKKwlyZXR1cm4gc3BhY2VfY2hhaW47CisgICAgfQorCisgIC8qIE5vIGFwcHJvcHJpYXRlIHNwYWNlIGZvdW5kLiAgUmV0dXJuIE5VTEwuICAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gc3Vic3BhY2UuICBJZiB0aGUgc3RhcnRpbmcKKyAgIGFkZHJlc3MgaXMgdW5rbm93biB0aGVuIHJldHVybiB6ZXJvLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorcGFfc3Vic3BhY2Vfc3RhcnQgKHNwYWNlLCBxdWFkcmFudCkKKyAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKKyAgICAgaW50IHF1YWRyYW50OworeworI2lmZGVmIE9CSl9TT00KKyAgLyogRklYTUUuICBBc3N1bWVzIGV2ZXJ5b25lIHB1dHMgcmVhZC93cml0ZSBkYXRhIGF0IDB4NDAwMDAwMCwgdGhpcworICAgICBpcyBub3QgY29ycmVjdCBmb3IgdGhlIFBBIE9TRjEgcG9ydC4gICovCisgIGlmICgoc3RyY21wIChTUEFDRV9OQU1FIChzcGFjZSksICIkUFJJVkFURSQiKSA9PSAwKSAmJiBxdWFkcmFudCA9PSAxKQorICAgIHJldHVybiAweDQwMDAwMDAwOworICBlbHNlIGlmIChzcGFjZS0+c2Rfc2VnID09IGRhdGFfc2VjdGlvbiAmJiBxdWFkcmFudCA9PSAxKQorICAgIHJldHVybiAweDQwMDAwMDAwOworICBlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FLiAgTmVlZHMgZG9jdW1lbnRhdGlvbi4gICovCitzdGF0aWMgaW50CitwYV9uZXh0X3N1YnNlZyAoc3BhY2UpCisgICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Cit7CisKKyAgc3BhY2UtPnNkX2xhc3Rfc3Vic2VnKys7CisgIHJldHVybiBzcGFjZS0+c2RfbGFzdF9zdWJzZWc7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgcGFfc3RyaW5nZXIuICBVc2VkIHRvIGZpbmQgdGhlIGVuZCBvZgorICAgYSBzdHJpbmcuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitwYV9zdHJpbmdlcl9hdXggKHMpCisgICAgIGNoYXIgKnM7Cit7CisgIHVuc2lnbmVkIGludCBjID0gKnMgJiBDSEFSX01BU0s7CisKKyAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KKyAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7CisKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlICdcIic6CisgICAgICBjID0gTk9UX0FfQ0hBUjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBjOworfQorCisvKiBIYW5kbGUgYSAuU1RSSU5HIHR5cGUgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX3N0cmluZ2VyIChhcHBlbmRfemVybykKKyAgICAgaW50IGFwcGVuZF96ZXJvOworeworICBjaGFyICpzLCBudW1fYnVmWzRdOworICB1bnNpZ25lZCBpbnQgYzsKKyAgaW50IGk7CisKKyAgLyogUHJlcHJvY2VzcyB0aGUgc3RyaW5nIHRvIGhhbmRsZSBQQS1zcGVjaWZpYyBlc2NhcGUgc2VxdWVuY2VzLgorICAgICBGb3IgZXhhbXBsZSwgXHhERCB3aGVyZSBERCBpcyBhIGhleGlkZWNpbWFsIG51bWJlciBzaG91bGQgYmUKKyAgICAgY2hhbmdlZCB0byBcT09PIHdoZXJlIE9PTyBpcyBhbiBvY3RhbCBudW1iZXIuICAqLworCisgIC8qIFNraXAgdGhlIG9wZW5pbmcgcXVvdGUuICAqLworICBzID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKKworICB3aGlsZSAoaXNfYV9jaGFyIChjID0gcGFfc3RyaW5nZXJfYXV4IChzKyspKSkKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXFwnKQorCXsKKwkgIGMgPSAqczsKKwkgIHN3aXRjaCAoYykKKwkgICAgeworCSAgICAgIC8qIEhhbmRsZSBceDxudW0+LiAgKi8KKwkgICAgY2FzZSAneCc6CisJICAgICAgeworCQl1bnNpZ25lZCBpbnQgbnVtYmVyOworCQlpbnQgbnVtX2RpZ2l0OworCQljaGFyIGRnOworCQljaGFyICpzX3N0YXJ0ID0gczsKKworCQkvKiBHZXQgcGFzIHRoZSAneCcuICAqLworCQlzKys7CisJCWZvciAobnVtX2RpZ2l0ID0gMCwgbnVtYmVyID0gMCwgZGcgPSAqczsKKwkJICAgICBudW1fZGlnaXQgPCAyCisJCSAgICAgJiYgKGlzZGlnaXQgKGRnKSB8fCAoZGcgPj0gJ2EnICYmIGRnIDw9ICdmJykKKwkJCSB8fCAoZGcgPj0gJ0EnICYmIGRnIDw9ICdGJykpOworCQkgICAgIG51bV9kaWdpdCsrKQorCQkgIHsKKwkJICAgIGlmIChpc2RpZ2l0IChkZykpCisJCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnMCc7CisJCSAgICBlbHNlIGlmIChkZyA+PSAnYScgJiYgZGcgPD0gJ2YnKQorCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJ2EnICsgMTA7CisJCSAgICBlbHNlCisJCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnQScgKyAxMDsKKworCQkgICAgcysrOworCQkgICAgZGcgPSAqczsKKwkJICB9CisJCWlmIChudW1fZGlnaXQgPiAwKQorCQkgIHsKKwkJICAgIHN3aXRjaCAobnVtX2RpZ2l0KQorCQkgICAgICB7CisJCSAgICAgIGNhc2UgMToKKwkJCXNwcmludGYgKG51bV9idWYsICIlMDJvIiwgbnVtYmVyKTsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIDI6CisJCQlzcHJpbnRmIChudW1fYnVmLCAiJTAzbyIsIG51bWJlcik7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgICAgZm9yIChpID0gMDsgaSA8PSBudW1fZGlnaXQ7IGkrKykKKwkJICAgICAgc19zdGFydFtpXSA9IG51bV9idWZbaV07CisJCSAgfQorCQlicmVhazsKKwkgICAgICB9CisJICAgIC8qIFRoaXMgbWlnaHQgYmUgYSAiXCIiLCBza2lwIG92ZXIgdGhlIGVzY2FwZWQgY2hhci4gICovCisJICAgIGRlZmF1bHQ6CisJICAgICAgcysrOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgc3RyaW5nZXIgKGFwcGVuZF96ZXJvKTsKKyAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Cit9CisKKy8qIEhhbmRsZSBhIC5WRVJTSU9OIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitwYV92ZXJzaW9uICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIG9ial92ZXJzaW9uICgwKTsKKyAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Cit9CisKKyNpZmRlZiBPQkpfU09NCisKKy8qIEhhbmRsZSBhIC5DT01QSUxFUiBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfY29tcGlsZXIgKHVudXNlZCkKKyAgICAgaW50IHVudXNlZDsKK3sKKyAgb2JqX3NvbV9jb21waWxlciAoMCk7CisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworfQorCisjZW5kaWYKKworLyogSGFuZGxlIGEgLkNPUFlSSUdIVCBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorcGFfY29weXJpZ2h0ICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIG9ial9jb3B5cmlnaHQgKDApOworICBwYV91bmRlZmluZV9sYWJlbCAoKTsKK30KKworLyogSnVzdCBsaWtlIGEgbm9ybWFsIGNvbnMsIGJ1dCB3aGVuIGZpbmlzaGVkIHdlIGhhdmUgdG8gdW5kZWZpbmUKKyAgIHRoZSBsYXRlc3Qgc3BhY2UgbGFiZWwuICAqLworCitzdGF0aWMgdm9pZAorcGFfY29ucyAobmJ5dGVzKQorICAgICBpbnQgbmJ5dGVzOworeworICBjb25zIChuYnl0ZXMpOworICBwYV91bmRlZmluZV9sYWJlbCAoKTsKK30KKworLyogU3dpdGNoIHRvIHRoZSBkYXRhIHNwYWNlLiAgQXMgdXN1YWwgZGVsZXRlIG91ciBsYWJlbC4gICovCisKK3N0YXRpYyB2b2lkCitwYV9kYXRhICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFBSSVZBVEUkIik7CisgIGN1cnJlbnRfc3Vic3BhY2UKKyAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7CisgIHNfZGF0YSAoMCk7CisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworfQorCisvKiBMaWtlIGZsb2F0X2NvbnMsIGJ1dCB3ZSBuZWVkIHRvIHVuZGVmaW5lIG91ciBsYWJlbC4gICovCisKK3N0YXRpYyB2b2lkCitwYV9mbG9hdF9jb25zIChmbG9hdF90eXBlKQorICAgICBpbnQgZmxvYXRfdHlwZTsKK3sKKyAgZmxvYXRfY29ucyAoZmxvYXRfdHlwZSk7CisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworfQorCisvKiBMaWtlIHNfZmlsbCwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCisKK3N0YXRpYyB2b2lkCitwYV9maWxsICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCisgIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOworCisgIHNfZmlsbCAoMCk7CisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworfQorCisvKiBMaWtlIGxjb21tLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KKworc3RhdGljIHZvaWQKK3BhX2xjb21tIChuZWVkc19hbGlnbikKKyAgICAgaW50IG5lZWRzX2FsaWduOworeworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICBzX2xjb21tIChuZWVkc19hbGlnbik7CisgIHBhX3VuZGVmaW5lX2xhYmVsICgpOworfQorCisvKiBMaWtlIGxzeW0sIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLworCitzdGF0aWMgdm9pZAorcGFfbHN5bSAodW51c2VkKQorICAgICBpbnQgdW51c2VkOworeworICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLworICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKKworICBzX2xzeW0gKDApOworICBwYV91bmRlZmluZV9sYWJlbCAoKTsKK30KKworLyogU3dpdGNoIHRvIHRoZSB0ZXh0IHNwYWNlLiAgTGlrZSBzX3RleHQsIGJ1dCBkZWxldGUgb3VyCisgICBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KK3N0YXRpYyB2b2lkCitwYV90ZXh0ICh1bnVzZWQpCisgICAgIGludCB1bnVzZWQ7Cit7CisgIGN1cnJlbnRfc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7CisgIGN1cnJlbnRfc3Vic3BhY2UKKyAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGN1cnJlbnRfc3BhY2UtPnNkX3NlZywgMCk7CisKKyAgc190ZXh0ICgwKTsKKyAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Cit9CisKKy8qIE9uIHRoZSBQQSByZWxvY2F0aW9ucyB3aGljaCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMgbXVzdCBub3QgYmUKKyAgIGFkanVzdGVkLiAgVGhpcyBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGtub3cgd2hlbi9ob3cgdG8gY3JlYXRlIGFyZ3VtZW50CisgICByZWxvY2F0aW9uIHN0dWJzIGZvciBpbmRpcmVjdCBjYWxscyBhbmQgY2FsbHMgdG8gc3RhdGljIGZ1bmN0aW9ucy4KKworICAgIlQiIGZpZWxkIHNlbGVjdG9ycyBjcmVhdGUgRExUIHJlbGF0aXZlIGZpeHVwcyBmb3IgYWNjZXNzaW5nCisgICBnbG9iYWxzIGFuZCBzdGF0aWNzIGluIFBJQyBjb2RlOyBlYWNoIERMVCByZWxhdGl2ZSBmaXh1cCBjcmVhdGVzCisgICBhbiBlbnRyeSBpbiB0aGUgRExUIHRhYmxlLiAgVGhlIGVudHJpZXMgY29udGFpbiB0aGUgYWRkcmVzcyBvZgorICAgdGhlIGZpbmFsIHRhcmdldCAoZWcgYWNjZXNzaW5nICJmb28iIHdvdWxkIGNyZWF0ZSBhIERMVCBlbnRyeQorICAgd2l0aCB0aGUgYWRkcmVzcyBvZiAiZm9vIikuCisKKyAgIFVuZm9ydHVuYXRlbHksIHRoZSBIUCBsaW5rZXIgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBhbnkgYWRkZW5kCisgICB3aGVuIGdlbmVyYXRpbmcgdGhlIERMVDsgc28gYWNjZXNzaW5nICRMSVQkKzggcHV0cyB0aGUgYWRkcmVzcyBvZgorICAgJExJVCQgaW50byB0aGUgRExUIHJhdGhlciB0aGFuIHRoZSBhZGRyZXNzIG9mICRMSVQkKzguCisKKyAgIFRoZSBlbmQgcmVzdWx0IGlzIHdlIGNhbid0IHBlcmZvcm0gcmVsb2NhdGlvbiBzeW1ib2wgcmVkdWN0aW9ucyBmb3IKKyAgIGFueSBmaXh1cCB3aGljaCBjcmVhdGVzIGVudHJpZXMgaW4gdGhlIERMVCAoZWcgdGhleSB1c2UgIlQiIGZpZWxkCisgICBzZWxlY3RvcnMpLgorCisgICBSZWplY3QgcmVkdWN0aW9ucyBpbnZvbHZpbmcgc3ltYm9scyB3aXRoIGV4dGVybmFsIHNjb3BlOyBzdWNoCisgICByZWR1Y3Rpb25zIG1ha2UgbGlmZSBhIGxpdmluZyBoZWxsIGZvciBvYmplY3QgZmlsZSBlZGl0b3JzLiAKKworICAgRklYTUUuICBBbHNvIHJlamVjdCBSX0hQUEEgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIDMyYml0cyB3aWRlIGluCisgICB0aGUgY29kZSBzcGFjZS4gIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBrbm93IGhvdyB0byBwdWxsIHRoZQorICAgcmlnaHQgYml0cyBvdXQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLworCitpbnQKK2hwcGFfZml4X2FkanVzdGFibGUgKGZpeHApCisgICAgIGZpeFMgKmZpeHA7Cit7CisgIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4OworCisgIGhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7CisKKyNpZmRlZiBPQkpfU09NCisgIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gMzJiaXQgcmVsb2NzLiAgKi8KKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEEgJiYgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID09IDMyKQorICAgIHJldHVybiAwOworCisgIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gc3ltMS1zeW0yIGV4cHJlc3Npb25zIHdoZW4KKyAgICAgdGhlIGZpeHVwIHdpbGwgb2NjdXIgaW4gYSBDT0RFIHN1YnNwYWNlLiAKKworICAgICBYWFggRklYTUU6IExvbmcgdGVybSB3ZSBwcm9iYWJseSB3YW50IHRvIHJlamVjdCBhbGwgb2YgdGhlc2U7CisgICAgIGZvciBleGFtcGxlIHJlZHVjaW5nIGluIHRoZSBkZWJ1ZyBzZWN0aW9uIHdvdWxkIGxvc2UgaWYgd2UgZXZlcgorICAgICBzdXBwb3J0ZWQgdXNpbmcgdGhlIG9wdGltaXppbmcgaHAgbGlua2VyLiAgKi8KKyAgaWYgKGZpeHAtPmZ4X2FkZHN5CisgICAgICAmJiBmaXhwLT5meF9zdWJzeQorICAgICAgJiYgKGhwcGFfZml4LT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSkKKyAgICB7CisgICAgICAvKiBBcHBhcmVudGx5IHN5X3VzZWRfaW5fcmVsb2MgbmV2ZXIgZ2V0cyBzZXQgZm9yIHN1YiBzeW1ib2xzLiAgKi8KKyAgICAgIGZpeHAtPmZ4X3N1YnN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBXZSBjYW4ndCBhZGp1c3QgYW55IHJlbG9jcyB0aGF0IHVzZSBMUiUgYW5kIFJSJSBmaWVsZCBzZWxlY3RvcnMuCisgICAgIFRoYXQgY29uZnVzZXMgdGhlIEhQIGxpbmtlci4gICovCisgIGlmIChocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xyc2VsCisgICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jyc2VsCisgICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX25scnNlbCkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcywKKyAgICAgcmVsb2NhdGlvbnMgd2l0aCBwbGFiZWxzLiAgKi8KKyAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfdHNlbAorICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbAorICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAorICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCisgICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCisgICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsKQorICAgIHJldHVybiAwOworCisgIGlmIChmaXhwLT5meF9hZGRzeSAmJiBmaXhwLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQorICAgIHJldHVybiAwOworCisgIC8qIFJlamVjdCBhYnNvbHV0ZSBjYWxscyAoanVtcHMpLiAgKi8KKyAgaWYgKGhwcGFfZml4LT5meF9yX3R5cGUgPT0gUl9IUFBBX0FCU19DQUxMKQorICAgIHJldHVybiAwOworCisgIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIGZ1bmN0aW9uIHN5bWJvbHMuICAqLworICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gMAorICAgICAgfHwgKGZpeHAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikgPT0gMCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGZpeHVwIGluIEZJWFAgd2lsbCByZXF1aXJlIGEgcmVsb2NhdGlvbiwKKyAgIGV2ZW4gaXQgaWYgYXBwZWFycyB0aGF0IHRoZSBmaXh1cCBjb3VsZCBiZSBjb21wbGV0ZWx5IGhhbmRsZWQKKyAgIHdpdGhpbiBHQVMuICAqLworCitpbnQKK2hwcGFfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXhwOworICBpbnQgZGlzdGFuY2U7CisKKyAgaHBwYV9maXhwID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7CisjaWZkZWYgT0JKX1NPTQorICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTlRSWSB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VYSVQKKyAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fQlJUQUIKKyAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX0JSVEFCCisgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX1RSWQorICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfVFJZCisgICAgICB8fCAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCAmJiBmaXhwLT5meF9zdWJzeSAhPSBOVUxMCisJICAmJiAoaHBwYV9maXhwLT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKSkKKyAgICByZXR1cm4gMTsKKyNlbmRpZgorCisjZGVmaW5lIGFyZ19yZWxvY19zdHViX25lZWRlZChDQUxMRVIsIENBTExFRSkgXAorICAoKENBTExFRSkgJiYgKENBTExFUikgJiYgKChDQUxMRUUpICE9IChDQUxMRVIpKSkKKworICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgUEMtcmVsYXRpdmUgY2FsbHMvanVtcHMgdG8gaGF2ZSBhIHJlbG9jYXRpb24KKyAgICAgZW50cnkgaWYgdGhleSdyZSBnb2luZyB0byBuZWVkIGVpdGhlciBhIGFyZ3VtZW50IHJlbG9jYXRpb24gb3IgbG9uZworICAgICBjYWxsIHN0dWIuICBGSVhNRS4gIENhbid0IHdlIG5lZWQgdGhlIHNhbWUgZm9yIGFic29sdXRlIGNhbGxzPyAgKi8KKyAgaWYgKGZpeHAtPmZ4X3BjcmVsICYmIGZpeHAtPmZ4X2FkZHN5CisgICAgICAmJiAoYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKKwkJCQkgIGZpeHAtPmZ4X2FkZHN5LT5ic3ltKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYywKKworCQkJCSBocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYykpKQorICAgIHJldHVybiAxOworICBkaXN0YW5jZSA9IChmaXhwLT5meF9vZmZzZXQgKyBTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpCisJICAgICAgLSBtZF9wY3JlbF9mcm9tIChmaXhwKSk7CisgIC8qIE5vdyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIGdvaW5nIHRvIG5lZWQgYSBsb25nLWJyYW5jaCBzdHViLiAgKi8KKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAorICAgICAgJiYgKGRpc3RhbmNlID4gMjYyMTQzIHx8IGRpc3RhbmNlIDwgLTI2MjE0NCkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQUJTX0NBTEwpCisgICAgcmV0dXJuIDE7CisjdW5kZWYgYXJnX3JlbG9jX3N0dWJfbmVlZGVkCisKKyAgLyogTm8gbmVlZCAoeWV0KSB0byBmb3JjZSBhbm90aGVyIHJlbG9jYXRpb25zIHRvIGJlIGVtaXR0ZWQuICAqLworICByZXR1cm4gMDsKK30KKworLyogTm93IGZvciBzb21lIEVMRiBzcGVjaWZpYyBjb2RlLiAgRklYTUUuICAqLworI2lmZGVmIE9CSl9FTEYKKy8qIE1hcmsgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIHNvIHRoYXQgaXQncyBwb3NzaWJsZSB0byBjb21wdXRlCisgICB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gaW4gaHBwYV9lbGZfZmluYWxfcHJvY2Vzc2luZy4gICovCisKK3N0YXRpYyB2b2lkCitocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbiAoKQoreworICAvKiBFTEYgZG9lcyBub3QgaGF2ZSBFWElUIHJlbG9jYXRpb25zLiAgQWxsIHdlIGRvIGlzIGNyZWF0ZSBhCisgICAgIHRlbXBvcmFyeSBzeW1ib2wgbWFya2luZyB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gICovCisgIGNoYXIgKm5hbWUgPSAoY2hhciAqKQorICAgIHhtYWxsb2MgKHN0cmxlbiAoIkwkXDAwMWVuZF8iKSArCisJICAgICBzdHJsZW4gKFNfR0VUX05BTUUgKGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wpKSArIDEpOworCisgIGlmIChuYW1lKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgICAgIHN0cmNweSAobmFtZSwgIkwkXDAwMWVuZF8iKTsKKyAgICAgIHN0cmNhdCAobmFtZSwgU19HRVRfTkFNRSAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCkpOworCisgICAgICAvKiBJZiB3ZSBoYXZlIGEgLmV4aXQgZm9sbG93ZWQgYnkgYSAucHJvY2VuZCwgdGhlbiB0aGUKKwkgc3ltYm9sIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gICovCisgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworICAgICAgaWYgKHN5bWJvbFApCisJeworCSAgLyogVGhlIHN5bWJvbCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQhICBUaGlzIGNhbgorCSAgICAgaGFwcGVuIGlmIHdlIGhhdmUgYSAuZXhpdCBmb2xsb3dlZCBieSBhIC5wcm9jZW5kLgorCisJICAgICBUaGlzIGlzICpub3QqIGFuIGVycm9yLiAgQWxsIHdlIHdhbnQgdG8gZG8gaXMgZnJlZQorCSAgICAgdGhlIG1lbW9yeSB3ZSBqdXN0IGFsbG9jYXRlZCBmb3IgdGhlIG5hbWUgYW5kIGNvbnRpbnVlLiAgKi8KKwkgIHhmcmVlIChuYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogc3ltYm9sIHZhbHVlIHNob3VsZCBiZSB0aGUgb2Zmc2V0IG9mIHRoZQorCSAgICAgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgZnVuY3Rpb24gKi8KKwkgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCBub3dfc2VnLCAodmFsdWVUKSAoZnJhZ19ub3dfZml4ICgpIC0gNCksCisJCQkJZnJhZ19ub3cpOworCisJICBhc3NlcnQgKHN5bWJvbFApOworCSAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7CisJICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKKwl9CisKKyAgICAgIGlmIChzeW1ib2xQKQorCWxhc3RfY2FsbF9pbmZvLT5lbmRfc3ltYm9sID0gc3ltYm9sUDsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oIlN5bWJvbCAnJXMnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpLCBuYW1lKTsKKworICAgIH0KKyAgZWxzZQorICAgIGFzX2JhZCAoXygiTm8gbWVtb3J5IGZvciBzeW1ib2wgbmFtZS4iKSk7CisKK30KKworLyogRm9yIEVMRiwgdGhpcyBmdW5jdGlvbiBzZXJ2ZXMgb25lIHB1cnBvc2U6ICB0byBzZXR1cCB0aGUgc3Rfc2l6ZQorICAgZmllbGQgb2YgU1RUX0ZVTkMgc3ltYm9scy4gIFRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gc2NhbiB0aGUKKyAgIGNhbGxfaW5mbyBzdHJ1Y3R1cmUgbGlzdCwgZGV0ZXJtaW5pbmcgc3Rfc2l6ZSBpbiBieSB0YWtpbmcgdGhlCisgICBkaWZmZXJlbmNlIGluIHRoZSBhZGRyZXNzIG9mIHRoZSBiZWdpbm5pbmcvZW5kIG1hcmtlciBzeW1ib2xzLiAgKi8KKwordm9pZAorZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyAoKQoreworICBzdHJ1Y3QgY2FsbF9pbmZvICpjYWxsX2luZm9fcG9pbnRlcjsKKworICBmb3IgKGNhbGxfaW5mb19wb2ludGVyID0gY2FsbF9pbmZvX3Jvb3Q7CisgICAgICAgY2FsbF9pbmZvX3BvaW50ZXI7CisgICAgICAgY2FsbF9pbmZvX3BvaW50ZXIgPSBjYWxsX2luZm9fcG9pbnRlci0+Y2lfbmV4dCkKKyAgICB7CisgICAgICBlbGZfc3ltYm9sX3R5cGUgKmVzeW0KKyAgICAgID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBjYWxsX2luZm9fcG9pbnRlci0+c3RhcnRfc3ltYm9sLT5ic3ltOworICAgICAgZXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0KKwlTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPmVuZF9zeW1ib2wpCisJLSBTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkgKyA0OworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmggYi9nYXMvY29uZmlnL3RjLWhwcGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU0MWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1ocHBhLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIHRjLWhwcGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGhlIFBBCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKKyAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLworCisvKiBQbGVhc2UgcmVmcmFpbiBmcm9tIGV4cG9zaW5nIHRoZSB3b3JsZCB0byB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYworICAgd2hlbiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIG1lYW5zIG9ubHkgZGVjbGFyaW5nIGV4cG9ydGVkIGZ1bmN0aW9ucywKKyAgIChwbGVhc2UgUEFSQU1pemUgdGhlbSEpIG5vdCBleHBvcnRpbmcgc3RydWN0dXJlcyBhbmQgZGF0YSBpdGVtcyB3aGljaAorICAgYXJlIHVzZWQgc29sZWx5IHdpdGhpbiB0Yy1ocHBhLmMsIGV0Yy4KKworICAgQWxzbyByZWZyYWluIGZyb20gYWRkaW5nIGFueSBtb3JlIG9iamVjdCBmaWxlIGRlcGVuZGVudCBjb2RlLCB0aGVyZSBpcyAKKyAgIGFscmVhZHkgZmFyIHRvbyBtdWNoIG9iamVjdCBmaWxlIGZvcm1hdCBkZXBlbmRlbnQgY29kZSBpbiB0aGlzIGZpbGUuCisgICBJbiB0aGVvcnkgdGhpcyBmaWxlIHNob3VsZCBjb250YWluIG9ubHkgZXhwb3J0ZWQgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzCisgICBhbmQgZGF0YSBkZWNsYXJhdGlvbnMgY29tbW9uIHRvIGFsbCBQQSBhc3NlbWJsZXJzLiAgKi8KKworI2lmbmRlZiBfVENfSFBQQV9ICisjZGVmaW5lIF9UQ19IUFBBX0gKKworI2lmbmRlZiBUQ19IUFBBCisjZGVmaW5lIFRDX0hQUEEJMQorI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQorCisjZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2hwcGEKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKy8qIEZJWE1FLiAgVGhlIGxhY2sgb2YgYSBwbGFjZSB0byBwdXQgdGhpbmdzIHdoaWNoIGFyZSBib3RoIHRhcmdldCBjcHUKKyAgIGFuZCB0YXJnZXQgZm9ybWF0IGRlcGVuZGVudCBtYWtlcyBoYWNrcyBsaWtlIHRoaXMgbmVjZXNzYXJ5LiAgKi8KKyNpZmRlZiBPQkpfRUxGCisjaW5jbHVkZSAiYmZkL2VsZjMyLWhwcGEuaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItaHBwYSIKKyNlbmRpZgorCisjaWZkZWYgT0JKX1NPTQorI2luY2x1ZGUgImJmZC9zb20uaCIKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAic29tIgorI2VuZGlmCisKKy8qIEZJWE1FLiAgV2h5IG9oIHdoeSBhcmVuJ3QgdGhlc2UgZGVmaW5lZCBzb21ld2hlcmUgZ2xvYmFsbHk/ICAqLworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAgICgwKQorI2RlZmluZSBUUlVFICAgICghRkFMU0UpCisjZW5kaWYKKworI2RlZmluZSBBU0VDX05VTEwgKGFzZWN0aW9uICopMAorCisvKiBMYWJlbHMgYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIGEgY29sb24gZm9yIGEgc3VmZml4LiAgKi8KKyNkZWZpbmUgTEFCRUxTX1dJVEhPVVRfQ09MT05TCisKKy8qIEZJWE1FLiAgVGhpcyBzaG91bGQgYmUgc3RhdGljIGFuZCBkZWNsYXJlZCBpbiB0Yy1ocHBhLmMsIGJ1dCAKKyAgIHBhX2RlZmluZV9sYWJlbCBnZXRzIHVzZWQgb3V0c2lkZSBvZiB0Yy1ocHBhLmMgdmlhIHRjX2Zyb2JfbGFiZWwuCisgICBTaG91bGQgYWxzbyBiZSBQQVJBTWl6ZWQsIGJ1dCBzeW1ib2xTIGlzbid0IGF2YWlsYWJsZSBoZXJlLiAgKi8KK2V4dGVybiB2b2lkIHBhX2RlZmluZV9sYWJlbCAoKTsKKworLyogRklYTUUuICBUeXBlcyBub3QgYXZhaWxhYmxlIGhlcmUsIHNvIHRoZXkgY2FuJ3QgYmUgUEFSQU1pemVkLiAgKi8KK2V4dGVybiB2b2lkIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhICgpOworZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X2hwcGEgKCk7CitleHRlcm4gaW50IGhwcGFfZm9yY2VfcmVsb2NhdGlvbiAoKTsKKworLyogVGhpcyBnZXRzIGNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUgdG8gbWFrZSBzdXJlCisgICB0aGluZ3MgbGlrZSBlbnRyeS9leGl0IGFuZCBwcm9jL3Byb2NlbmQgcGFpcnMgbWF0Y2guICAqLworZXh0ZXJuIHZvaWQgcGFfY2hlY2tfZW9mIFBBUkFNUyAoKHZvaWQpKTsKKyNkZWZpbmUgdGNfZnJvYl9maWxlIHBhX2NoZWNrX2VvZgorCisjZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBwYV9kZWZpbmVfbGFiZWwgKHN5bSkKKworLyogVGhlIFBBIGRvZXMgbm90IG5lZWQgc3VwcG9ydCBmb3IgZWl0aGVyIG9mIHRoZXNlLiAgKi8KKyNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGhlYWRlcnMpIHs7fQorI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soaGVhZGVycykgezt9CisKKyNkZWZpbmUgUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCisjZGVmaW5lIE1BWF9SRUxPQ19FWFBBTlNJT04gNgorCisvKiBGSVhNRS4gIE1vcmUgdGhpbmdzIHdoaWNoIGFyZSBib3RoIEhQUEEgYW5kIEVMRiBzcGVjaWZpYy4gIFRoZXJlIGlzIAorICAgbm93aGVyZSB0byBwdXQgc3VjaCB0aGluZ3MuICAqLworI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcJZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZwordm9pZCBlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorCisvKiBUaGUgUEEgbmVlZHMgdG8gcGFyc2UgZmllbGQgc2VsZWN0b3JzIGluIC5ieXRlLCBldGMuICAqLworCisjZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgXAorICBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoRVhQKQorI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X2hwcGEKKworLyogT24gdGhlIFBBLCBhbiBlcXVhbCBzaWduIG9mdGVuIGFwcGVhcnMgYXMgYSBjb25kaXRpb24gb3IgbnVsbGlmaWNhdGlvbgorICAgY29tcGxldGVyIGluIGFuIGluc3RydWN0aW9uLiAgVGhpcyBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgdGhlCisgICBwcmV2aW91cyBjaGFyYWN0ZXIsIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBjb21tYSwgdGhlbiB0aGUgZXF1YWwgaXMKKyAgIGJlaW5nIHVzZWQgYXMgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFRDX0VRVUFMX0lOX0lOU04oQywgUFRSKQkoKEMpID09ICcsJykKKworLyogU2ltaWxhcmx5IGZvciBhbiBleGNsYW1hdGlvbiBwb2ludC4gIEl0IGlzIHVzZWQgaW4gRlAgY29tcGFyaXNvbgorICAgaW5zdHJ1Y3Rpb25zIGFuZCBhcyBhbiBlbmQgb2YgbGluZSBtYXJrZXIuICBXaGVuIHVzZWQgaW4gYW4gaW5zdHJ1Y3Rpb24KKyAgIGl0IHdpbGwgYWx3YXlzIGZvbGxvdyBhIGNvbW1hLiAgKi8KKyNkZWZpbmUgVENfRU9MX0lOX0lOU04oUFRSKQkoKihQVFIpID09ICchJyAmJiAoUFRSKVstMV0gPT0gJywnKQorCisjZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlIGhwcGFfZml4X2FkanVzdGFibGUKKworLyogQmVjYXVzZSBvZiB0aGUgc3RyYW5nZSBQQSBjYWxsaW5nIGNvbnZlbnRpb25zLCBpdCBpcyBzb21ldGltZXMKKyAgIG5lY2Vzc2FyeSB0byBlbWl0IGEgcmVsb2NhdGlvbiBmb3IgYSBjYWxsIGV2ZW4gdGhvdWdoIGl0IHdvdWxkCisgICBub3JtYWxseSBhcHBlYXIgc2FmZSB0byBoYW5kbGUgaXQgY29tcGxldGVseSB3aXRoaW4gR0FTLiAgKi8KKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKSBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKEZJWFApCisKKyNpZmRlZiBPQkpfU09NCisvKiBJZiBhIHN5bWJvbCBpcyBpbXBvcnRlZCwgYnV0IG5ldmVyIHVzZWQsIHRoZW4gdGhlIHN5bWJvbCBzaG91bGQKKyAgICpub3QqIGVuZCB1cCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgTGlrZXdpc2UgZm9yIGFic29sdXRlIHN5bWJvbHMKKyAgIHdpdGggbG9jYWwgc2NvcGUuICAqLworI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkgXAorICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX3VuZF9zZWN0aW9uICYmIHN5bS0+c3lfdXNlZCA9PSAwKSBcCisJfHwgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbiBcCisJICAgICYmIChzeW0tPmJzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCkgPT0gMCkpIFwKKyAgICAgIHB1bnQgPSAxCisKKy8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYWtlIHJlbG9jYXRpb25zIGludm9sdmluZyB0aGUgZGlmZmVyZW5jZSBvZgorICAgdHdvIHN5bWJvbHMuICBUaGlzIGluY2x1ZGVzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIHdoZW4KKyAgIG9uZSBvZiB0aGVtIGlzIHVuZGVmaW5lZCAodGhpcyBjb21lcyB1cCBpbiBQSUMgY29kZSBnZW5lcmF0aW9uKS4gCisKKyAgIFdlIGRvbid0IGRlZmluZSBESUZGX0VYUFJfT0sgYmVjYXVzZSBpdCBkb2VzIHRoZSB3cm9uZyB0aGluZyBpZgorICAgdGhlIGFkZCBzeW1ib2wgaXMgdW5kZWZpbmVkIGFuZCB0aGUgc3ViIHN5bWJvbCBpcyBhIHN5bWJvbCBpbgorICAgdGhlIHNhbWUgc2VjdGlvbiBhcyB0aGUgcmVsb2NhdGlvbi4gIFdlIGFsc28gbmVlZCBzb21lIHdheSB0bworICAgc3BlY2lhbGl6ZSBzb21lIGNvZGUgaW4gYWRqdXN0X3JlbG9jX3N5bXMuICAqLworI2RlZmluZSBVTkRFRklORURfRElGRkVSRU5DRV9PSworI2VuZGlmCisKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIHRjX2Zyb2Jfc3ltYm9sKHN5bSxwdW50KSBcCisgIHsgXAorICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX3VuZF9zZWN0aW9uICYmIHN5bS0+c3lfdXNlZCA9PSAwKSBcCisJfHwgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbiBcCisJICAgICYmIChzeW0tPmJzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCkgPT0gMCkpIFwKKyAgICAgIHB1bnQgPSAxOyBcCisgIH0KKyNlbmRpZgorCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKworI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKKyNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCisKKyNlbmRpZiAvKiBfVENfSFBQQV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuYyBiL2dhcy9jb25maWcvdGMtaTM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNDlkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWkzODYuYwpAQCAtMCwwICsxLDQ0NzUgQEAKKy8qIGkzODYuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSW50ZWwgODAzODYKKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCisgIEludGVsIDgwMzg2IG1hY2hpbmUgc3BlY2lmaWMgZ2FzLgorICBXcml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzIChlbGlvdEBtZ20ubWl0LmVkdSkuCisgIEJ1Z3MgJiBzdWdnZXN0aW9ucyBhcmUgY29tcGxldGVseSB3ZWxjb21lLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLgorICBQbGVhc2UgaGVscCB1cyBtYWtlIGl0IGJldHRlci4KKyAgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJvcGNvZGUvaTM4Ni5oIgorCisjaWZuZGVmIFRDX1JFTE9DCisjZGVmaW5lIFRDX1JFTE9DKFgsWSkgKFkpCisjZW5kaWYKKworI2lmbmRlZiBSRUdJU1RFUl9XQVJOSU5HUworI2RlZmluZSBSRUdJU1RFUl9XQVJOSU5HUyAxCisjZW5kaWYKKworI2lmbmRlZiBTQ0FMRTFfV0hFTl9OT19JTkRFWAorLyogU3BlY2lmeWluZyBhIHNjYWxlIGZhY3RvciBiZXNpZGVzIDEgd2hlbiB0aGVyZSBpcyBubyBpbmRleCBpcworICAgZnV0aWxlLiAgZWcuIGBtb3YgKCVlYngsMiksJWFsJyBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMKKyAgIGBtb3YgKCVlYngpLCVhbCcuICBUbyBzbGF2aXNobHkgZm9sbG93IHdoYXQgdGhlIHByb2dyYW1tZXIKKyAgIHNwZWNpZmllZCwgc2V0IFNDQUxFMV9XSEVOX05PX0lOREVYIHRvIDAuICAqLworI2RlZmluZSBTQ0FMRTFfV0hFTl9OT19JTkRFWCAxCisjZW5kaWYKKworI2RlZmluZSB0cnVlIDEKKyNkZWZpbmUgZmFsc2UgMAorCitzdGF0aWMgdW5zaWduZWQgaW50IG1vZGVfZnJvbV9kaXNwX3NpemUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CitzdGF0aWMgaW50IGZpdHNfaW5fc2lnbmVkX2J5dGUgUEFSQU1TICgobG9uZykpOworc3RhdGljIGludCBmaXRzX2luX3Vuc2lnbmVkX2J5dGUgUEFSQU1TICgobG9uZykpOworc3RhdGljIGludCBmaXRzX2luX3Vuc2lnbmVkX3dvcmQgUEFSQU1TICgobG9uZykpOworc3RhdGljIGludCBmaXRzX2luX3NpZ25lZF93b3JkIFBBUkFNUyAoKGxvbmcpKTsKK3N0YXRpYyBpbnQgc21hbGxlc3RfaW1tX3R5cGUgUEFSQU1TICgobG9uZykpOworc3RhdGljIGludCBhZGRfcHJlZml4IFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworc3RhdGljIHZvaWQgc2V0XzE2Yml0X2NvZGVfZmxhZyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNldF9pbnRlbF9zeW50YXggUEFSQU1TICgoaW50KSk7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitzdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jCisgIFBBUkFNUyAoKGludCwgaW50LCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKKyNlbmRpZgorCisvKiAnbWRfYXNzZW1ibGUgKCknIGdhdGhlcnMgdG9nZXRoZXIgaW5mb3JtYXRpb24gYW5kIHB1dHMgaXQgaW50byBhCisgICBpMzg2X2luc24uICovCisKK3N0cnVjdCBfaTM4Nl9pbnNuCisgIHsKKyAgICAvKiBUTSBob2xkcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBpbnNuIHdlcmUgY3VycmVudGx5IGFzc2VtYmxpbmcuICovCisgICAgdGVtcGxhdGUgdG07CisKKyAgICAvKiBTVUZGSVggaG9sZHMgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBpZiBnaXZlbi4KKyAgICAgICAoZS5nLiAnbCcgZm9yICdtb3ZsJykgICovCisgICAgY2hhciBzdWZmaXg7CisKKyAgICAvKiBPcGVyYW5kcyBhcmUgY29kZWQgd2l0aCBPUEVSQU5EUywgVFlQRVMsIERJU1BTLCBJTU1TLCBhbmQgUkVHUy4gKi8KKworICAgIC8qIE9QRVJBTkRTIGdpdmVzIHRoZSBudW1iZXIgb2YgZ2l2ZW4gb3BlcmFuZHMuICovCisgICAgdW5zaWduZWQgaW50IG9wZXJhbmRzOworCisgICAgLyogUkVHX09QRVJBTkRTLCBESVNQX09QRVJBTkRTLCBNRU1fT1BFUkFORFMsIElNTV9PUEVSQU5EUyBnaXZlIHRoZSBudW1iZXIKKyAgICAgICBvZiBnaXZlbiByZWdpc3RlciwgZGlzcGxhY2VtZW50LCBtZW1vcnkgb3BlcmFuZHMgYW5kIGltbWVkaWF0ZQorICAgICAgIG9wZXJhbmRzLiAqLworICAgIHVuc2lnbmVkIGludCByZWdfb3BlcmFuZHMsIGRpc3Bfb3BlcmFuZHMsIG1lbV9vcGVyYW5kcywgaW1tX29wZXJhbmRzOworCisgICAgLyogVFlQRVMgW2ldIGlzIHRoZSB0eXBlIChzZWUgYWJvdmUgI2RlZmluZXMpIHdoaWNoIHRlbGxzIHVzIGhvdyB0bworICAgICAgIHNlYXJjaCB0aHJvdWdoIERJU1BTIFtpXSAmIElNTVMgW2ldICYgUkVHUyBbaV0gZm9yIHRoZSByZXF1aXJlZAorICAgICAgIG9wZXJhbmQuICAqLworICAgIHVuc2lnbmVkIGludCB0eXBlc1tNQVhfT1BFUkFORFNdOworCisgICAgLyogRGlzcGxhY2VtZW50cyAoaWYgZ2l2ZW4pIGZvciBlYWNoIG9wZXJhbmQuICovCisgICAgZXhwcmVzc2lvblMgKmRpc3BzW01BWF9PUEVSQU5EU107CisKKyAgICAvKiBSZWxvY2F0aW9uIHR5cGUgZm9yIG9wZXJhbmQgKi8KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIGRpc3BfcmVsb2NbTUFYX09QRVJBTkRTXTsKKyNlbHNlCisgICAgaW50IGRpc3BfcmVsb2NbTUFYX09QRVJBTkRTXTsKKyNlbmRpZgorCisgICAgLyogSW1tZWRpYXRlIG9wZXJhbmRzIChpZiBnaXZlbikgZm9yIGVhY2ggb3BlcmFuZC4gKi8KKyAgICBleHByZXNzaW9uUyAqaW1tc1tNQVhfT1BFUkFORFNdOworCisgICAgLyogUmVnaXN0ZXIgb3BlcmFuZHMgKGlmIGdpdmVuKSBmb3IgZWFjaCBvcGVyYW5kLiAqLworICAgIGNvbnN0IHJlZ19lbnRyeSAqcmVnc1tNQVhfT1BFUkFORFNdOworCisgICAgLyogQkFTRV9SRUcsIElOREVYX1JFRywgYW5kIExPRzJfU0NBTEVfRkFDVE9SIGFyZSB1c2VkIHRvIGVuY29kZQorICAgICAgIHRoZSBiYXNlIGluZGV4IGJ5dGUgYmVsb3cuICAqLworICAgIGNvbnN0IHJlZ19lbnRyeSAqYmFzZV9yZWc7CisgICAgY29uc3QgcmVnX2VudHJ5ICppbmRleF9yZWc7CisgICAgdW5zaWduZWQgaW50IGxvZzJfc2NhbGVfZmFjdG9yOworCisgICAgLyogU0VHIGdpdmVzIHRoZSBzZWdfZW50cmllcyBvZiB0aGlzIGluc24uICBUaGV5IGFyZSB6ZXJvIHVubGVzcworICAgICAgIGV4cGxpY2l0IHNlZ21lbnQgb3ZlcnJpZGVzIGFyZSBnaXZlbi4gKi8KKyAgICBjb25zdCBzZWdfZW50cnkgKnNlZ1syXTsJLyogc2VnbWVudHMgZm9yIG1lbW9yeSBvcGVyYW5kcyAoaWYgZ2l2ZW4pICovCisKKyAgICAvKiBQUkVGSVggaG9sZHMgYWxsIHRoZSBnaXZlbiBwcmVmaXggb3Bjb2RlcyAodXN1YWxseSBudWxsKS4KKyAgICAgICBQUkVGSVhFUyBpcyB0aGUgbnVtYmVyIG9mIHByZWZpeCBvcGNvZGVzLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgcHJlZml4ZXM7CisgICAgdW5zaWduZWQgY2hhciBwcmVmaXhbTUFYX1BSRUZJWEVTXTsKKworICAgIC8qIFJNIGFuZCBTSUIgYXJlIHRoZSBtb2RybSBieXRlIGFuZCB0aGUgc2liIGJ5dGUgd2hlcmUgdGhlCisgICAgICAgYWRkcmVzc2luZyBtb2RlcyBvZiB0aGlzIGluc24gYXJlIGVuY29kZWQuICAqLworCisgICAgbW9kcm1fYnl0ZSBybTsKKyAgICBzaWJfYnl0ZSBzaWI7CisgIH07CisKK3R5cGVkZWYgc3RydWN0IF9pMzg2X2luc24gaTM4Nl9pbnNuOworCisvKiBMaXN0IG9mIGNoYXJzIGJlc2lkZXMgdGhvc2UgaW4gYXBwLmM6c3ltYm9sX2NoYXJzIHRoYXQgY2FuIHN0YXJ0IGFuCisgICBvcGVyYW5kLiAgVXNlZCB0byBwcmV2ZW50IHRoZSBzY3J1YmJlciBlYXRpbmcgdml0YWwgd2hpdGUtc3BhY2UuICAqLworI2lmZGVmIExFWF9BVAorY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXSA9ICIqJS0oQCI7CisjZWxzZQorY29uc3QgY2hhciBleHRyYV9zeW1ib2xfY2hhcnNbXSA9ICIqJS0oIjsKKyNlbmRpZgorCisvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKKyAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLworI2lmIGRlZmluZWQgKFRFX0kzODZBSVgpIHx8ICgoZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikpICYmICEgZGVmaW5lZCAoVEVfTElOVVgpKQorLyogUHV0dGluZyAnLycgaGVyZSBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgZGl2aWRlIG9wZXJhdG9yLgorICAgSG93ZXZlciwgd2UgbmVlZCBpdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNWUjQgc3lzdGVtcy4gICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjLyI7CisjZGVmaW5lIFBSRUZJWF9TRVBBUkFUT1IgJ1xcJworI2Vsc2UKK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOworI2RlZmluZSBQUkVGSVhfU0VQQVJBVE9SICcvJworI2VuZGlmCisKKy8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCisgICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KKy8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cworICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCisvKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yayBpZgorICAgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAgKi8KKyNpZiBkZWZpbmVkIChURV9JMzg2QUlYKSB8fCAoKGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpKSAmJiAhIGRlZmluZWQgKFRFX0xJTlVYKSkKK2NvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIjsKKyNlbHNlCitjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIi8iOworI2VuZGlmCisKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBBcyBpbiAwZjEyLjQ1NiAqLworLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHhYIjsKKworLyogdGFibGVzIGZvciBsZXhpY2FsIGFuYWx5c2lzICovCitzdGF0aWMgY2hhciBtbmVtb25pY19jaGFyc1syNTZdOworc3RhdGljIGNoYXIgcmVnaXN0ZXJfY2hhcnNbMjU2XTsKK3N0YXRpYyBjaGFyIG9wZXJhbmRfY2hhcnNbMjU2XTsKK3N0YXRpYyBjaGFyIGlkZW50aWZpZXJfY2hhcnNbMjU2XTsKK3N0YXRpYyBjaGFyIGRpZ2l0X2NoYXJzWzI1Nl07CisKKy8qIGxleGljYWwgbWFjcm9zICovCisjZGVmaW5lIGlzX21uZW1vbmljX2NoYXIoeCkgKG1uZW1vbmljX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKKyNkZWZpbmUgaXNfb3BlcmFuZF9jaGFyKHgpIChvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKKyNkZWZpbmUgaXNfcmVnaXN0ZXJfY2hhcih4KSAocmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQorI2RlZmluZSBpc19zcGFjZV9jaGFyKHgpICgoeCkgPT0gJyAnKQorI2RlZmluZSBpc19pZGVudGlmaWVyX2NoYXIoeCkgKGlkZW50aWZpZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQorI2RlZmluZSBpc19kaWdpdF9jaGFyKHgpIChkaWdpdF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCisKKy8qIHB1dCBoZXJlIGFsbCBub24tZGlnaXQgbm9uLWxldHRlciBjaGFyY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYW4gb3BlcmFuZCAqLworc3RhdGljIGNoYXIgb3BlcmFuZF9zcGVjaWFsX2NoYXJzW10gPSAiJSQtKygsKSouX34vPD58Jl4hOltAXSI7CisKKy8qIG1kX2Fzc2VtYmxlKCkgYWx3YXlzIGxlYXZlcyB0aGUgc3RyaW5ncyBpdCdzIHBhc3NlZCB1bmFsdGVyZWQuICBUbworICAgZWZmZWN0IHRoaXMgd2UgbWFpbnRhaW4gYSBzdGFjayBvZiBzYXZlZCBjaGFyYWN0ZXJzIHRoYXQgd2UndmUgc21hc2hlZAorICAgd2l0aCAnXDAncyAoaW5kaWNhdGluZyBlbmQgb2Ygc3RyaW5ncyBmb3IgdmFyaW91cyBzdWItZmllbGRzIG9mIHRoZQorICAgYXNzZW1ibGVyIGluc3RydWN0aW9uKS4gKi8KK3N0YXRpYyBjaGFyIHNhdmVfc3RhY2tbMzJdOworc3RhdGljIGNoYXIgKnNhdmVfc3RhY2tfcDsJLyogc3RhY2sgcG9pbnRlciAqLworI2RlZmluZSBFTkRfU1RSSU5HX0FORF9TQVZFKHMpIFwKKwlkbyB7ICpzYXZlX3N0YWNrX3ArKyA9ICoocyk7ICoocykgPSAnXDAnOyB9IHdoaWxlICgwKQorI2RlZmluZSBSRVNUT1JFX0VORF9TVFJJTkcocykgXAorCWRvIHsgKihzKSA9ICotLXNhdmVfc3RhY2tfcDsgfSB3aGlsZSAoMCkKKworLyogVGhlIGluc3RydWN0aW9uIHdlJ3JlIGFzc2VtYmxpbmcuICovCitzdGF0aWMgaTM4Nl9pbnNuIGk7CisKKy8qIFBvc3NpYmxlIHRlbXBsYXRlcyBmb3IgY3VycmVudCBpbnNuLiAgKi8KK3N0YXRpYyBjb25zdCB0ZW1wbGF0ZXMgKmN1cnJlbnRfdGVtcGxhdGVzOworCisvKiBQZXIgaW5zdHJ1Y3Rpb24gZXhwcmVzc2lvblMgYnVmZmVyczogMiBkaXNwbGFjZW1lbnRzICYgMiBpbW1lZGlhdGUgbWF4LiAqLworc3RhdGljIGV4cHJlc3Npb25TIGRpc3BfZXhwcmVzc2lvbnNbMl0sIGltX2V4cHJlc3Npb25zWzJdOworCitzdGF0aWMgaW50IHRoaXNfb3BlcmFuZDsJLyogY3VycmVudCBvcGVyYW5kIHdlIGFyZSB3b3JraW5nIG9uICovCisKK3N0YXRpYyBpbnQgZmxhZ19kb19sb25nX2p1bXA7CS8qIEZJWE1FIHdoYXQgZG9lcyB0aGlzIGRvPyAqLworCitzdGF0aWMgaW50IGZsYWdfMTZiaXRfY29kZTsJLyogMSBpZiB3ZSdyZSB3cml0aW5nIDE2LWJpdCBjb2RlLCAwIGlmIDMyLWJpdCAqLworCitzdGF0aWMgaW50IGludGVsX3N5bnRheCA9IDA7CS8qIDEgZm9yIGludGVsIHN5bnRheCwgMCBpZiBhdHQgc3ludGF4ICovCisKK3N0YXRpYyBpbnQgYWxsb3dfbmFrZWRfcmVnID0gMDsgIC8qIDEgaWYgcmVnaXN0ZXIgcHJlZml4ICUgbm90IHJlcXVpcmVkICovCisKKy8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LgorICAgVGhlcmUgYXJlIDIgcmVsYXggc3RhdGVzIGZvciAzODYganVtcCBpbnNuczogb25lIGZvciBjb25kaXRpb25hbCAmCisgICBvbmUgZm9yIHVuY29uZGl0aW9uYWwganVtcHMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHRoZXNlIHR3byB0eXBlcworICAgb2YganVtcHMgYWRkIGRpZmZlcmVudCBzaXplcyB0byBmcmFncyB3aGVuIHdlJ3JlIGZpZ3VyaW5nIG91dCB3aGF0CisgICBzb3J0IG9mIGp1bXAgdG8gY2hvb3NlIHRvIHJlYWNoIGEgZ2l2ZW4gbGFiZWwuICAqLworCisvKiB0eXBlcyAqLworI2RlZmluZSBDT05EX0pVTVAgMQkJLyogY29uZGl0aW9uYWwganVtcCAqLworI2RlZmluZSBVTkNPTkRfSlVNUCAyCQkvKiB1bmNvbmRpdGlvbmFsIGp1bXAgKi8KKy8qIHNpemVzICovCisjZGVmaW5lIENPREUxNgkxCisjZGVmaW5lIFNNQUxMCTAKKyNkZWZpbmUgU01BTEwxNiAoU01BTEx8Q09ERTE2KQorI2RlZmluZSBCSUcJMgorI2RlZmluZSBCSUcxNgkoQklHfENPREUxNikKKworI2lmbmRlZiBJTkxJTkUKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2Vsc2UKKyNkZWZpbmUgSU5MSU5FCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEVOQ09ERV9SRUxBWF9TVEFURSh0eXBlLHNpemUpIFwKKyAgKChyZWxheF9zdWJzdGF0ZVQpKCh0eXBlPDwyKSB8IChzaXplKSkpCisjZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShzKSBcCisgICAgKCAoKChzKSAmIDB4MykgPT0gQklHID8gNCA6ICgoKHMpICYgMHgzKSA9PSBCSUcxNiA/IDIgOiAxKSkgKQorCisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgYnkgcmVsYXhfZnJhZyB0byBwcm9tb3RlIHNob3J0IGp1bXBzIHRvIGxvbmcKKyAgIG9uZXMgd2hlcmUgbmVjZXNzYXJ5LiAgU01BTEwgKHNob3J0KSBqdW1wcyBtYXkgYmUgcHJvbW90ZWQgdG8gQklHCisgICAoMzIgYml0IGxvbmcpIG9uZXMsIGFuZCBTTUFMTDE2IGp1bXBzIHRvIEJJRzE2ICgxNiBiaXQgbG9uZykuICBXZQorICAgZG9uJ3QgYWxsb3cgYSBzaG9ydCBqdW1wIGluIGEgMzIgYml0IGNvZGUgc2VnbWVudCB0byBiZSBwcm9tb3RlZCB0bworICAgYSAxNiBiaXQgb2Zmc2V0IGp1bXAgYmVjYXVzZSBpdCdzIHNsb3dlciAocmVxdWlyZXMgZGF0YSBzaXplCisgICBwcmVmaXgpLCBhbmQgZG9lc24ndCB3b3JrLCB1bmxlc3MgdGhlIGRlc3RpbmF0aW9uIGlzIGluIHRoZSBib3R0b20KKyAgIDY0ayBvZiB0aGUgY29kZSBzZWdtZW50IChUaGUgdG9wIDE2IGJpdHMgb2YgZWlwIGFyZSB6ZXJvZWQpLiAgKi8KKworY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Cit7CisvKiBUaGUgZmllbGRzIGFyZToKKyAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKKyAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKKyAgIDMpIGhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBmcmFnCisgICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuCisgICAqLworICB7MSwgMSwgMCwgMH0sCisgIHsxLCAxLCAwLCAwfSwKKyAgezEsIDEsIDAsIDB9LAorICB7MSwgMSwgMCwgMH0sCisKKyAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHKX0sCisgIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRzE2KX0sCisgIC8qIGR3b3JkIGNvbmRpdGlvbmFscyBhZGRzIDQgYnl0ZXMgdG8gZnJhZzoKKyAgICAgMSBleHRyYSBvcGNvZGUgYnl0ZSwgMyBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZXMuICAqLworICB7MCwgMCwgNCwgMH0sCisgIC8qIHdvcmQgY29uZGl0aW9uYWxzIGFkZCAyIGJ5dGVzIHRvIGZyYWc6CisgICAgIDEgZXh0cmEgb3Bjb2RlIGJ5dGUsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLworICB7MCwgMCwgMiwgMH0sCisKKyAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcpfSwKKyAgezEyNyArIDEsIC0xMjggKyAxLCAwLCBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcxNil9LAorICAvKiBkd29yZCBqbXAgYWRkcyAzIGJ5dGVzIHRvIGZyYWc6CisgICAgIDAgZXh0cmEgb3Bjb2RlIGJ5dGVzLCAzIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlcy4gICovCisgIHswLCAwLCAzLCAwfSwKKyAgLyogd29yZCBqbXAgYWRkcyAxIGJ5dGUgdG8gZnJhZzoKKyAgICAgMCBleHRyYSBvcGNvZGUgYnl0ZXMsIDEgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGUuICAqLworICB7MCwgMCwgMSwgMH0KKworfTsKKworCit2b2lkCitpMzg2X2FsaWduX2NvZGUgKGZyYWdQLCBjb3VudCkKKyAgICAgZnJhZ1MgKmZyYWdQOworICAgICBpbnQgY291bnQ7Cit7CisgIC8qIFZhcmlvdXMgZWZmaWNpZW50IG5vLW9wIHBhdHRlcm5zIGZvciBhbGlnbmluZyBjb2RlIGxhYmVscy4gICovCisgIC8qIE5vdGU6IERvbid0IHRyeSB0byBhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBjb21tZW50cy4gKi8KKyAgLyogICAgICAgMEwgYW5kIDB3IGFyZSBub3QgbGVnYWwgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzFbXSA9CisgICAgezB4OTB9OwkJCQkJLyogbm9wCQkJKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzJbXSA9CisgICAgezB4ODksMHhmNn07CQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8zW10gPQorICAgIHsweDhkLDB4NzYsMHgwMH07CQkJCS8qIGxlYWwgMCglZXNpKSwlZXNpCSovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl80W10gPQorICAgIHsweDhkLDB4NzQsMHgyNiwweDAwfTsJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl81W10gPQorICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KKyAgICAgMHg4ZCwweDc0LDB4MjYsMHgwMH07CQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLworICBzdGF0aWMgY29uc3QgY2hhciBmMzJfNltdID0KKyAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZXNpKSwlZXNpCSovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl83W10gPQorICAgIHsweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzhbXSA9CisgICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLworICAgICAweDhkLDB4YjQsMHgyNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzlbXSA9CisgICAgezB4ODksMHhmNiwJCQkJCS8qIG1vdmwgJWVzaSwlZXNpCSovCisgICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLworICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTBbXSA9CisgICAgezB4OGQsMHg3NiwweDAwLAkJCQkvKiBsZWFsIDAoJWVzaSksJWVzaQkqLworICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KKyAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzExW10gPQorICAgIHsweDhkLDB4NzQsMHgyNiwweDAwLAkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KKyAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMltdID0KKyAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KKyAgICAgMHg4ZCwweGJmLDB4MDAsMHgwMCwweDAwLDB4MDB9OwkJLyogbGVhbCAwTCglZWRpKSwlZWRpCSovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xM1tdID0KKyAgICB7MHg4ZCwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCQkvKiBsZWFsIDBMKCVlc2kpLCVlc2kJKi8KKyAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNFtdID0KKyAgICB7MHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogbGVhbCAwTCglZXNpLDEpLCVlc2kgKi8KKyAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCisgIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xNVtdID0KKyAgICB7MHhlYiwweDBkLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwJLyogam1wIC4rMTU7IGxvdHNhIG5vcHMJKi8KKyAgICAgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzRbXSA9CisgICAgezB4OGQsMHhiNCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLworICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNVtdID0KKyAgICB7MHg5MCwJCQkJCS8qIG5vcAkJCSovCisgICAgIDB4OGQsMHhiNCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglc2kpLCVzaQkqLworICBzdGF0aWMgY29uc3QgY2hhciBmMTZfNltdID0KKyAgICB7MHg4OSwweGY2LAkJCQkJLyogbW92ICVzaSwlc2kJCSovCisgICAgIDB4OGQsMHhiZCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglZGkpLCVkaQkqLworICBzdGF0aWMgY29uc3QgY2hhciBmMTZfN1tdID0KKyAgICB7MHg4ZCwweDc0LDB4MDAsCQkJCS8qIGxlYSAwKCVzaSksJXNpCSovCisgICAgIDB4OGQsMHhiZCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglZGkpLCVkaQkqLworICBzdGF0aWMgY29uc3QgY2hhciBmMTZfOFtdID0KKyAgICB7MHg4ZCwweGI0LDB4MDAsMHgwMCwJCQkvKiBsZWEgMHcoJXNpKSwlc2kJKi8KKyAgICAgMHg4ZCwweGJkLDB4MDAsMHgwMH07CQkJLyogbGVhIDB3KCVkaSksJWRpCSovCisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmMzJfcGF0dFtdID0geworICAgIGYzMl8xLCBmMzJfMiwgZjMyXzMsIGYzMl80LCBmMzJfNSwgZjMyXzYsIGYzMl83LCBmMzJfOCwKKyAgICBmMzJfOSwgZjMyXzEwLCBmMzJfMTEsIGYzMl8xMiwgZjMyXzEzLCBmMzJfMTQsIGYzMl8xNQorICB9OworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZjE2X3BhdHRbXSA9IHsKKyAgICBmMzJfMSwgZjMyXzIsIGYzMl8zLCBmMTZfNCwgZjE2XzUsIGYxNl82LCBmMTZfNywgZjE2XzgsCisgICAgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1CisgIH07CisKKyAgaWYgKGNvdW50ID4gMCAmJiBjb3VudCA8PSAxNSkKKyAgICB7CisgICAgICBpZiAoZmxhZ18xNmJpdF9jb2RlKQorCXsKKwkgIG1lbWNweShmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCisJCSBmMTZfcGF0dFtjb3VudCAtIDFdLCBjb3VudCk7CisJICBpZiAoY291bnQgPiA4KSAvKiBhZGp1c3QganVtcCBvZmZzZXQgKi8KKwkgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeCArIDFdID0gY291bnQgLSAyOworCX0KKyAgICAgIGVsc2UKKwltZW1jcHkoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAorCSAgICAgICBmMzJfcGF0dFtjb3VudCAtIDFdLCBjb3VudCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gY291bnQ7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqb3V0cHV0X2ludmFsaWQgUEFSQU1TICgoaW50IGMpKTsKK3N0YXRpYyBpbnQgaTM4Nl9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKm9wZXJhbmRfc3RyaW5nKSk7CitzdGF0aWMgaW50IGkzODZfaW50ZWxfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpvcGVyYW5kX3N0cmluZywgaW50IGdvdF9hX2Zsb2F0KSk7CitzdGF0aWMgY29uc3QgcmVnX2VudHJ5ICpwYXJzZV9yZWdpc3RlciBQQVJBTVMgKChjaGFyICpyZWdfc3RyaW5nLAorCQkJCQkJY2hhciAqKmVuZF9vcCkpOworCisjaWZuZGVmIEkzODZDT0ZGCitzdGF0aWMgdm9pZCBzX2JzcyBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCitzeW1ib2xTICpHT1Rfc3ltYm9sOwkJLyogUHJlLWRlZmluZWQgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIgKi8KKworc3RhdGljIElOTElORSB1bnNpZ25lZCBpbnQKK21vZGVfZnJvbV9kaXNwX3NpemUgKHQpCisgICAgIHVuc2lnbmVkIGludCB0OworeworICByZXR1cm4gKHQgJiBEaXNwOCkgPyAxIDogKHQgJiAoRGlzcDE2fERpc3AzMikpID8gMiA6IDA7Cit9CisKK3N0YXRpYyBJTkxJTkUgaW50CitmaXRzX2luX3NpZ25lZF9ieXRlIChudW0pCisgICAgIGxvbmcgbnVtOworeworICByZXR1cm4gKG51bSA+PSAtMTI4KSAmJiAobnVtIDw9IDEyNyk7Cit9CQkJCS8qIGZpdHNfaW5fc2lnbmVkX2J5dGUoKSAqLworCitzdGF0aWMgSU5MSU5FIGludAorZml0c19pbl91bnNpZ25lZF9ieXRlIChudW0pCisgICAgIGxvbmcgbnVtOworeworICByZXR1cm4gKG51bSAmIDB4ZmYpID09IG51bTsKK30JCQkJLyogZml0c19pbl91bnNpZ25lZF9ieXRlKCkgKi8KKworc3RhdGljIElOTElORSBpbnQKK2ZpdHNfaW5fdW5zaWduZWRfd29yZCAobnVtKQorICAgICBsb25nIG51bTsKK3sKKyAgcmV0dXJuIChudW0gJiAweGZmZmYpID09IG51bTsKK30JCQkJLyogZml0c19pbl91bnNpZ25lZF93b3JkKCkgKi8KKworc3RhdGljIElOTElORSBpbnQKK2ZpdHNfaW5fc2lnbmVkX3dvcmQgKG51bSkKKyAgICAgbG9uZyBudW07Cit7CisgIHJldHVybiAoLTMyNzY4IDw9IG51bSkgJiYgKG51bSA8PSAzMjc2Nyk7Cit9CQkJCS8qIGZpdHNfaW5fc2lnbmVkX3dvcmQoKSAqLworCitzdGF0aWMgaW50CitzbWFsbGVzdF9pbW1fdHlwZSAobnVtKQorICAgICBsb25nIG51bTsKK3sKKyNpZiAwCisgIC8qIFRoaXMgY29kZSBpcyBkaXNhYmxlZCBiZWNhdXNlIGFsbCB0aGUgSW1tMSBmb3JtcyBpbiB0aGUgb3Bjb2RlIHRhYmxlCisgICAgIGFyZSBzbG93ZXIgb24gdGhlIGk0ODYsIGFuZCB0aGV5J3JlIHRoZSB2ZXJzaW9ucyB3aXRoIHRoZSBpbXBsaWNpdGx5CisgICAgIHNwZWNpZmllZCBzaW5nbGUtcG9zaXRpb24gZGlzcGxhY2VtZW50LCB3aGljaCBoYXMgYW5vdGhlciBzeW50YXggaWYKKyAgICAgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGF0IGZvcm0uICBJZiB5b3UgcmVhbGx5IHByZWZlciB0byBoYXZlIHRoZQorICAgICBvbmUtYnl0ZS1zaG9ydGVyIEltbTEgZm9ybSBkZXNwaXRlIHRoZXNlIHByb2JsZW1zLCByZS1lbmFibGUgdGhpcworICAgICBjb2RlLiAgKi8KKyAgaWYgKG51bSA9PSAxKQorICAgIHJldHVybiBJbW0xIHwgSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMjsKKyNlbmRpZgorICByZXR1cm4gKGZpdHNfaW5fc2lnbmVkX2J5dGUgKG51bSkKKwkgID8gKEltbThTIHwgSW1tOCB8IEltbTE2IHwgSW1tMzIpCisJICA6IGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAobnVtKQorCSAgPyAoSW1tOCB8IEltbTE2IHwgSW1tMzIpCisJICA6IChmaXRzX2luX3NpZ25lZF93b3JkIChudW0pIHx8IGZpdHNfaW5fdW5zaWduZWRfd29yZCAobnVtKSkKKwkgID8gKEltbTE2IHwgSW1tMzIpCisJICA6IChJbW0zMikpOworfQkJCQkvKiBzbWFsbGVzdF9pbW1fdHlwZSgpICovCisKKy8qIFJldHVybnMgMCBpZiBhdHRlbXB0aW5nIHRvIGFkZCBhIHByZWZpeCB3aGVyZSBvbmUgZnJvbSB0aGUgc2FtZQorICAgY2xhc3MgYWxyZWFkeSBleGlzdHMsIDEgaWYgbm9uIHJlcC9yZXBuZSBhZGRlZCwgMiBpZiByZXAvcmVwbmUKKyAgIGFkZGVkLiAgKi8KK3N0YXRpYyBpbnQKK2FkZF9wcmVmaXggKHByZWZpeCkKKyAgICAgdW5zaWduZWQgaW50IHByZWZpeDsKK3sKKyAgaW50IHJldCA9IDE7CisgIGludCBxOworCisgIHN3aXRjaCAocHJlZml4KQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisKKyAgICBjYXNlIENTX1BSRUZJWF9PUENPREU6CisgICAgY2FzZSBEU19QUkVGSVhfT1BDT0RFOgorICAgIGNhc2UgRVNfUFJFRklYX09QQ09ERToKKyAgICBjYXNlIEZTX1BSRUZJWF9PUENPREU6CisgICAgY2FzZSBHU19QUkVGSVhfT1BDT0RFOgorICAgIGNhc2UgU1NfUFJFRklYX09QQ09ERToKKyAgICAgIHEgPSBTRUdfUFJFRklYOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFUE5FX1BSRUZJWF9PUENPREU6CisgICAgY2FzZSBSRVBFX1BSRUZJWF9PUENPREU6CisgICAgICByZXQgPSAyOworICAgICAgLyogZmFsbCB0aHJ1ICovCisgICAgY2FzZSBMT0NLX1BSRUZJWF9PUENPREU6CisgICAgICBxID0gTE9DS1JFUF9QUkVGSVg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRldBSVRfT1BDT0RFOgorICAgICAgcSA9IFdBSVRfUFJFRklYOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFERFJfUFJFRklYX09QQ09ERToKKyAgICAgIHEgPSBBRERSX1BSRUZJWDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQVRBX1BSRUZJWF9PUENPREU6CisgICAgICBxID0gREFUQV9QUkVGSVg7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGkucHJlZml4W3FdKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygic2FtZSB0eXBlIG9mIHByZWZpeCB1c2VkIHR3aWNlIikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGkucHJlZml4ZXMgKz0gMTsKKyAgaS5wcmVmaXhbcV0gPSBwcmVmaXg7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfMTZiaXRfY29kZV9mbGFnIChuZXdfMTZiaXRfY29kZV9mbGFnKQorCWludCBuZXdfMTZiaXRfY29kZV9mbGFnOworeworICBmbGFnXzE2Yml0X2NvZGUgPSBuZXdfMTZiaXRfY29kZV9mbGFnOworfQorCitzdGF0aWMgdm9pZAorc2V0X2ludGVsX3N5bnRheCAoc3ludGF4X2ZsYWcpCisJaW50IHN5bnRheF9mbGFnOworeworICAvKiBGaW5kIG91dCBpZiByZWdpc3RlciBwcmVmaXhpbmcgaXMgc3BlY2lmaWVkLiAgKi8KKyAgaW50IGFza19uYWtlZF9yZWcgPSAwOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorICAgIHsKKyAgICAgIGNoYXIgKnN0cmluZyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGludCBlID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgICAgIGlmIChzdHJjbXAoc3RyaW5nLCAicHJlZml4IikgPT0gMCkKKwlhc2tfbmFrZWRfcmVnID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChzdHJpbmcsICJub3ByZWZpeCIpID09IDApCisJYXNrX25ha2VkX3JlZyA9IC0xOworICAgICAgZWxzZQorCWFzX2JhZCAoXygiQmFkIGFyZ3VtZW50IHRvIHN5bnRheCBkaXJlY3RpdmUuIikpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGU7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAKKyAgaW50ZWxfc3ludGF4ID0gc3ludGF4X2ZsYWc7CisKKyAgaWYgKGFza19uYWtlZF9yZWcgPT0gMCkKKyAgICB7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgYWxsb3dfbmFrZWRfcmVnID0gKGludGVsX3N5bnRheAorICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKHN0ZG91dHB1dCkgIT0gJ1wwJykpOyAKKyNlbHNlCisgICAgICBhbGxvd19uYWtlZF9yZWcgPSAwOyAvKiBjb25zZXJ2YXRpdmUgZGVmYXVsdCAqLworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgYWxsb3dfbmFrZWRfcmVnID0gKGFza19uYWtlZF9yZWcgPCAwKTsKK30KKworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyNpZm5kZWYgSTM4NkNPRkYKKyAgeyJic3MiLCBzX2JzcywgMH0sCisjZW5kaWYKKyNpZiAhZGVmaW5lZChPQkpfQU9VVCkgJiYgIWRlZmluZWQoVVNFX0FMSUdOX1BUV08pCisgIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKKyNlbHNlCisgIHsiYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAorI2VuZGlmCisgIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKKyAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAorICB7InRmbG9hdCIsIGZsb2F0X2NvbnMsICd4J30sCisgIHsidmFsdWUiLCBjb25zLCAyfSwKKyAgeyJub29wdCIsIHNfaWdub3JlLCAwfSwKKyAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwKKyAgeyJjb2RlMTYiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAxfSwKKyAgeyJjb2RlMzIiLCBzZXRfMTZiaXRfY29kZV9mbGFnLCAwfSwKKyAgeyJpbnRlbF9zeW50YXgiLCBzZXRfaW50ZWxfc3ludGF4LCAxfSwKKyAgeyJhdHRfc3ludGF4Iiwgc2V0X2ludGVsX3N5bnRheCwgMH0sCisgIHswLCAwLCAwfQorfTsKKworLyogZm9yIGludGVyZmFjZSB3aXRoIGV4cHJlc3Npb24gKCkgKi8KK2V4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7CisKKy8qIGhhc2ggdGFibGUgZm9yIGluc3RydWN0aW9uIG1uZW1vbmljIGxvb2t1cCAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7CisvKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKKwwKKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgY29uc3QgY2hhciAqaGFzaF9lcnI7CisKKyAgLyogaW5pdGlhbGl6ZSBvcF9oYXNoIGhhc2ggdGFibGUgKi8KKyAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOworCisgIHsKKyAgICByZWdpc3RlciBjb25zdCB0ZW1wbGF0ZSAqb3B0YWI7CisgICAgcmVnaXN0ZXIgdGVtcGxhdGVzICpjb3JlX29wdGFiOworCisgICAgb3B0YWIgPSBpMzg2X29wdGFiOwkJLyogc2V0dXAgZm9yIGxvb3AgKi8KKyAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOworICAgIGNvcmVfb3B0YWItPnN0YXJ0ID0gb3B0YWI7CisKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKwkrK29wdGFiOworCWlmIChvcHRhYi0+bmFtZSA9PSBOVUxMCisJICAgIHx8IHN0cmNtcCAob3B0YWItPm5hbWUsIChvcHRhYiAtIDEpLT5uYW1lKSAhPSAwKQorCSAgeworCSAgICAvKiBkaWZmZXJlbnQgbmFtZSAtLT4gc2hpcCBvdXQgY3VycmVudCB0ZW1wbGF0ZSBsaXN0OworCSAgICAgICBhZGQgdG8gaGFzaCB0YWJsZTsgJiBiZWdpbiBhbmV3ICovCisJICAgIGNvcmVfb3B0YWItPmVuZCA9IG9wdGFiOworCSAgICBoYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLAorCQkJCSAgICAob3B0YWIgLSAxKS0+bmFtZSwKKwkJCQkgICAgKFBUUikgY29yZV9vcHRhYik7CisJICAgIGlmIChoYXNoX2VycikKKwkgICAgICB7CisJICAgICAgaGFzaF9lcnJvcjoKKwkJYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiAgQ2FuJ3QgaGFzaCAlczogJXMiKSwKKwkJCSAgKG9wdGFiIC0gMSktPm5hbWUsCisJCQkgIGhhc2hfZXJyKTsKKwkgICAgICB9CisJICAgIGlmIChvcHRhYi0+bmFtZSA9PSBOVUxMKQorCSAgICAgIGJyZWFrOworCSAgICBjb3JlX29wdGFiID0gKHRlbXBsYXRlcyAqKSB4bWFsbG9jIChzaXplb2YgKHRlbXBsYXRlcykpOworCSAgICBjb3JlX29wdGFiLT5zdGFydCA9IG9wdGFiOworCSAgfQorICAgICAgfQorICB9CisKKyAgLyogaW5pdGlhbGl6ZSByZWdfaGFzaCBoYXNoIHRhYmxlICovCisgIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7CisgIHsKKyAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKnJlZ3RhYjsKKworICAgIGZvciAocmVndGFiID0gaTM4Nl9yZWd0YWI7CisJIHJlZ3RhYiA8IGkzODZfcmVndGFiICsgc2l6ZW9mIChpMzg2X3JlZ3RhYikgLyBzaXplb2YgKGkzODZfcmVndGFiWzBdKTsKKwkgcmVndGFiKyspCisgICAgICB7CisJaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ3RhYi0+cmVnX25hbWUsIChQVFIpIHJlZ3RhYik7CisJaWYgKGhhc2hfZXJyKQorCSAgZ290byBoYXNoX2Vycm9yOworICAgICAgfQorICB9CisKKyAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG1uZW1vbmljX2NoYXJzLCBvcGVyYW5kX2NoYXJzLiAgKi8KKyAgeworICAgIHJlZ2lzdGVyIGludCBjOworICAgIHJlZ2lzdGVyIGNoYXIgKnA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCisgICAgICB7CisJaWYgKGlzZGlnaXQgKGMpKQorCSAgeworCSAgICBkaWdpdF9jaGFyc1tjXSA9IGM7CisJICAgIG1uZW1vbmljX2NoYXJzW2NdID0gYzsKKwkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOworCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKKwkgIH0KKwllbHNlIGlmIChpc2xvd2VyIChjKSkKKwkgIHsKKwkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSBjOworCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7CisJICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOworCSAgfQorCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQorCSAgeworCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOworCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG1uZW1vbmljX2NoYXJzW2NdOworCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKKwkgIH0KKworCWlmIChpc2FscGhhIChjKSB8fCBpc2RpZ2l0IChjKSkKKwkgIGlkZW50aWZpZXJfY2hhcnNbY10gPSBjOworCWVsc2UgaWYgKGMgPj0gMTI4KQorCSAgeworCSAgICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKKwkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7CisJICB9CisgICAgICB9CisKKyNpZmRlZiBMRVhfQVQKKyAgICBpZGVudGlmaWVyX2NoYXJzWydAJ10gPSAnQCc7CisjZW5kaWYKKyAgICByZWdpc3Rlcl9jaGFyc1snKSddID0gJyknOworICAgIHJlZ2lzdGVyX2NoYXJzWycoJ10gPSAnKCc7CisgICAgZGlnaXRfY2hhcnNbJy0nXSA9ICctJzsKKyAgICBpZGVudGlmaWVyX2NoYXJzWydfJ10gPSAnXyc7CisgICAgaWRlbnRpZmllcl9jaGFyc1snLiddID0gJy4nOworCisgICAgZm9yIChwID0gb3BlcmFuZF9zcGVjaWFsX2NoYXJzOyAqcCAhPSAnXDAnOyBwKyspCisgICAgICBvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcF0gPSAqcDsKKyAgfQorCisjaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKKyAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICB7CisgICAgICByZWNvcmRfYWxpZ25tZW50ICh0ZXh0X3NlY3Rpb24sIDIpOworICAgICAgcmVjb3JkX2FsaWdubWVudCAoZGF0YV9zZWN0aW9uLCAyKTsKKyAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCAyKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZAoraTM4Nl9wcmludF9zdGF0aXN0aWNzIChmaWxlKQorICAgICBGSUxFICpmaWxlOworeworICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJpMzg2IG9wY29kZSIsIG9wX2hhc2gpOworICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJpMzg2IHJlZ2lzdGVyIiwgcmVnX2hhc2gpOworfQorDAorCisjaWZkZWYgREVCVUczODYKKworLyogZGVidWdnaW5nIHJvdXRpbmVzIGZvciBtZF9hc3NlbWJsZSAqLworc3RhdGljIHZvaWQgcGkgUEFSQU1TICgoY2hhciAqLCBpMzg2X2luc24gKikpOworc3RhdGljIHZvaWQgcHRlIFBBUkFNUyAoKHRlbXBsYXRlICopKTsKK3N0YXRpYyB2b2lkIHB0IFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworc3RhdGljIHZvaWQgcGUgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOworc3RhdGljIHZvaWQgcHMgUEFSQU1TICgoc3ltYm9sUyAqKSk7CisKK3N0YXRpYyB2b2lkCitwaSAobGluZSwgeCkKKyAgICAgY2hhciAqbGluZTsKKyAgICAgaTM4Nl9pbnNuICp4OworeworICByZWdpc3RlciB0ZW1wbGF0ZSAqcDsKKyAgaW50IGk7CisKKyAgZnByaW50ZiAoc3Rkb3V0LCAiJXM6IHRlbXBsYXRlICIsIGxpbmUpOworICBwdGUgKCZ4LT50bSk7CisgIGZwcmludGYgKHN0ZG91dCwgIiAgbW9kcm06ICBtb2RlICV4ICByZWcgJXggIHJlZy9tZW0gJXgiLAorCSAgIHgtPnJtLm1vZGUsIHgtPnJtLnJlZywgeC0+cm0ucmVnbWVtKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiIGJhc2UgJXggIGluZGV4ICV4ICBzY2FsZSAleFxuIiwKKwkgICB4LT5iaS5iYXNlLCB4LT5iaS5pbmRleCwgeC0+Ymkuc2NhbGUpOworICBmb3IgKGkgPSAwOyBpIDwgeC0+b3BlcmFuZHM7IGkrKykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgIyVkOiAgIiwgaSArIDEpOworICAgICAgcHQgKHgtPnR5cGVzW2ldKTsKKyAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7CisgICAgICBpZiAoeC0+dHlwZXNbaV0KKwkgICYgKFJlZyB8IFNSZWcyIHwgU1JlZzMgfCBDb250cm9sIHwgRGVidWcgfCBUZXN0IHwgUmVnTU1YKSkKKwlmcHJpbnRmIChzdGRvdXQsICIlc1xuIiwgeC0+cmVnc1tpXS0+cmVnX25hbWUpOworICAgICAgaWYgKHgtPnR5cGVzW2ldICYgSW1tKQorCXBlICh4LT5pbW1zW2ldKTsKKyAgICAgIGlmICh4LT50eXBlc1tpXSAmIERpc3ApCisJcGUgKHgtPmRpc3BzW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwdGUgKHQpCisgICAgIHRlbXBsYXRlICp0OworeworICBpbnQgaTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICVkIG9wZXJhbmRzICIsIHQtPm9wZXJhbmRzKTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAib3Bjb2RlICV4ICIsCisJICAgdC0+YmFzZV9vcGNvZGUpOworICBpZiAodC0+ZXh0ZW5zaW9uX29wY29kZSAhPSBOb25lKQorICAgIGZwcmludGYgKHN0ZG91dCwgImV4dCAleCAiLCB0LT5leHRlbnNpb25fb3Bjb2RlKTsKKyAgaWYgKHQtPm9wY29kZV9tb2RpZmllciAmIEQpCisgICAgZnByaW50ZiAoc3Rkb3V0LCAiRCIpOworICBpZiAodC0+b3Bjb2RlX21vZGlmaWVyICYgVykKKyAgICBmcHJpbnRmIChzdGRvdXQsICJXIik7CisgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7CisgIGZvciAoaSA9IDA7IGkgPCB0LT5vcGVyYW5kczsgaSsrKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICAjJWQgdHlwZSAiLCBpICsgMSk7CisgICAgICBwdCAodC0+b3BlcmFuZF90eXBlc1tpXSk7CisgICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BlIChlKQorICAgICBleHByZXNzaW9uUyAqZTsKK3sKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICAgIG9wZXJhdGlvbiAgICAgICAlZFxuIiwgZS0+WF9vcCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfbnVtYmVyICAgICVkICgleClcbiIsCisJICAgZS0+WF9hZGRfbnVtYmVyLCBlLT5YX2FkZF9udW1iZXIpOworICBpZiAoZS0+WF9hZGRfc3ltYm9sKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICBhZGRfc3ltYm9sICAgICIpOworICAgICAgcHMgKGUtPlhfYWRkX3N5bWJvbCk7CisgICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOworICAgIH0KKyAgaWYgKGUtPlhfb3Bfc3ltYm9sKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZG91dCwgIiAgICBvcF9zeW1ib2wgICAgIik7CisgICAgICBwcyAoZS0+WF9vcF9zeW1ib2wpOworICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcyAocykKKyAgICAgc3ltYm9sUyAqczsKK3sKKyAgZnByaW50ZiAoc3Rkb3V0LCAiJXMgdHlwZSAlcyVzIiwKKwkgICBTX0dFVF9OQU1FIChzKSwKKwkgICBTX0lTX0VYVEVSTkFMIChzKSA/ICJFWFRFUk5BTCAiIDogIiIsCisJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzKSkpOworfQorCitzdHJ1Y3QgdHlwZV9uYW1lCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgbWFzazsKKyAgICBjaGFyICp0bmFtZTsKKyAgfQorCit0eXBlX25hbWVzW10gPQoreworICB7IFJlZzgsICJyOCIgfSwKKyAgeyBSZWcxNiwgInIxNiIgfSwKKyAgeyBSZWczMiwgInIzMiIgfSwKKyAgeyBJbW04LCAiaTgiIH0sCisgIHsgSW1tOFMsICJpOHMiIH0sCisgIHsgSW1tMTYsICJpMTYiIH0sCisgIHsgSW1tMzIsICJpMzIiIH0sCisgIHsgSW1tMSwgImkxIiB9LAorICB7IEJhc2VJbmRleCwgIkJhc2VJbmRleCIgfSwKKyAgeyBEaXNwOCwgImQ4IiB9LAorICB7IERpc3AxNiwgImQxNiIgfSwKKyAgeyBEaXNwMzIsICJkMzIiIH0sCisgIHsgSW5PdXRQb3J0UmVnLCAiSW5PdXRQb3J0UmVnIiB9LAorICB7IFNoaWZ0Q291bnQsICJTaGlmdENvdW50IiB9LAorICB7IENvbnRyb2wsICJjb250cm9sIHJlZyIgfSwKKyAgeyBUZXN0LCAidGVzdCByZWciIH0sCisgIHsgRGVidWcsICJkZWJ1ZyByZWciIH0sCisgIHsgRmxvYXRSZWcsICJGUmVnIiB9LAorICB7IEZsb2F0QWNjLCAiRkFjYyIgfSwKKyAgeyBTUmVnMiwgIlNSZWcyIiB9LAorICB7IFNSZWczLCAiU1JlZzMiIH0sCisgIHsgQWNjLCAiQWNjIiB9LAorICB7IEp1bXBBYnNvbHV0ZSwgIkp1bXAgQWJzb2x1dGUiIH0sCisgIHsgUmVnTU1YLCAick1NWCIgfSwKKyAgeyBFc1NlZywgImVzIiB9LAorICB7IDAsICIiIH0KK307CisKK3N0YXRpYyB2b2lkCitwdCAodCkKKyAgICAgdW5zaWduZWQgaW50IHQ7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlX25hbWUgKnR5OworCisgIGlmICh0ID09IFVua25vd24pCisgICAgeworICAgICAgZnByaW50ZiAoc3Rkb3V0LCBfKCJVbmtub3duIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAodHkgPSB0eXBlX25hbWVzOyB0eS0+bWFzazsgdHkrKykKKwlpZiAodCAmIHR5LT5tYXNrKQorCSAgZnByaW50ZiAoc3Rkb3V0LCAiJXMsICIsIHR5LT50bmFtZSk7CisgICAgfQorICBmZmx1c2ggKHN0ZG91dCk7Cit9CisKKyNlbmRpZiAvKiBERUJVRzM4NiAqLworDAoraW50Cit0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCisgICAgIHN0cnVjdCBmaXggKmZpeHA7Cit7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworI2Vsc2UKKyAgLyogRm9yIENPRkYgKi8KKyAgcmV0dXJuIGZpeHAtPmZ4X3JfdHlwZT09NzsKKyNlbmRpZgorfQorCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYworICBQQVJBTVMgKChpbnQsIGludCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7CisKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKK3JlbG9jIChzaXplLCBwY3JlbCwgb3RoZXIpCisgICAgIGludCBzaXplOworICAgICBpbnQgcGNyZWw7CisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvdGhlcjsKK3sKKyAgaWYgKG90aGVyICE9IE5PX1JFTE9DKSByZXR1cm4gb3RoZXI7CisKKyAgaWYgKHBjcmVsKQorICAgIHsKKyAgICAgIHN3aXRjaCAoc2l6ZSkKKwl7CisJY2FzZSAxOiByZXR1cm4gQkZEX1JFTE9DXzhfUENSRUw7CisJY2FzZSAyOiByZXR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMOworCWNhc2UgNDogcmV0dXJuIEJGRF9SRUxPQ18zMl9QQ1JFTDsKKwl9CisgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIiksIHNpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN3aXRjaCAoc2l6ZSkKKwl7CisJY2FzZSAxOiByZXR1cm4gQkZEX1JFTE9DXzg7CisJY2FzZSAyOiByZXR1cm4gQkZEX1JFTE9DXzE2OworCWNhc2UgNDogcmV0dXJuIEJGRF9SRUxPQ18zMjsKKwl9CisgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIHNpemUpOworICAgIH0KKworICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Cit9CisKKy8qCisgKiBIZXJlIHdlIGRlY2lkZSB3aGljaCBmaXh1cHMgY2FuIGJlIGFkanVzdGVkIHRvIG1ha2UgdGhlbSByZWxhdGl2ZSB0bworICogdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiBpbnN0ZWFkIG9mIHRoZSBzeW1ib2wuICBCYXNpY2FsbHkgd2UgbmVlZAorICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGRvbmUgY29ycmVjdGx5LCBzbyBpbgorICogc29tZSBjYXNlcyB3ZSBmb3JjZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHRvIGJlIHVzZWQuCisgKi8KK2ludAordGNfaTM4Nl9maXhfYWRqdXN0YWJsZShmaXhQKQorICAgICBmaXhTICogZml4UDsKK3sKKyNpZmRlZiBPQkpfRUxGCisgIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLworICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworI2VuZGlmCisgIC8qIGFkanVzdF9yZWxvY19zeW1zIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgR09UICovCisgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKKyAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzg2X1BMVDMyCisgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorI2Vsc2UKKyNkZWZpbmUgcmVsb2MoU0laRSxQQ1JFTCxPVEhFUikJMAorI2RlZmluZSBCRkRfUkVMT0NfMTYJCTAKKyNkZWZpbmUgQkZEX1JFTE9DXzMyCQkwCisjZGVmaW5lIEJGRF9SRUxPQ18xNl9QQ1JFTAkwCisjZGVmaW5lIEJGRF9SRUxPQ18zMl9QQ1JFTAkwCisjZGVmaW5lIEJGRF9SRUxPQ18zODZfUExUMzIJMAorI2RlZmluZSBCRkRfUkVMT0NfMzg2X0dPVDMyCTAKKyNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9HT1RPRkYJMAorI2VuZGlmCisKK2ludAoraW50ZWxfZmxvYXRfb3BlcmFuZCAobW5lbW9uaWMpCisgICAgIGNoYXIgKm1uZW1vbmljOworeworICBpZiAobW5lbW9uaWNbMF0gPT0gJ2YnICYmIG1uZW1vbmljWzFdID09J2knKQorICAgIHJldHVybiAwOworCisgIGlmIChtbmVtb25pY1swXSA9PSAnZicpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIExJTkUgcG9pbnRzIHRvIGEKKyAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0CisgICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLiAgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKGxpbmUpCisgICAgIGNoYXIgKmxpbmU7Cit7CisgIC8qIFBvaW50cyB0byB0ZW1wbGF0ZSBvbmNlIHdlJ3ZlIGZvdW5kIGl0LiAqLworICBjb25zdCB0ZW1wbGF0ZSAqdDsKKworICAvKiBDb3VudCB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkLiAgKi8KKyAgaW50IGluc25fc2l6ZSA9IDA7CisKKyAgaW50IGo7CisKKyAgY2hhciBtbmVtb25pY1tNQVhfTU5FTV9TSVpFXTsKKworICAvKiBJbml0aWFsaXplIGdsb2JhbHMuICovCisgIG1lbXNldCAoJmksICdcMCcsIHNpemVvZiAoaSkpOworICBmb3IgKGogPSAwOyBqIDwgTUFYX09QRVJBTkRTOyBqKyspCisgICAgaS5kaXNwX3JlbG9jW2pdID0gTk9fUkVMT0M7CisgIG1lbXNldCAoZGlzcF9leHByZXNzaW9ucywgJ1wwJywgc2l6ZW9mIChkaXNwX2V4cHJlc3Npb25zKSk7CisgIG1lbXNldCAoaW1fZXhwcmVzc2lvbnMsICdcMCcsIHNpemVvZiAoaW1fZXhwcmVzc2lvbnMpKTsKKyAgc2F2ZV9zdGFja19wID0gc2F2ZV9zdGFjazsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCisgIC8qIEZpcnN0IHBhcnNlIGFuIGluc3RydWN0aW9uIG1uZW1vbmljICYgY2FsbCBpMzg2X29wZXJhbmQgZm9yIHRoZSBvcGVyYW5kcy4KKyAgICAgV2UgYXNzdW1lIHRoYXQgdGhlIHNjcnViYmVyIGhhcyBhcnJhbmdlZCBpdCBzbyB0aGF0IGxpbmVbMF0gaXMgdGhlIHZhbGlkCisgICAgIHN0YXJ0IG9mIGEgKHBvc3NpYmx5IHByZWZpeGVkKSBtbmVtb25pYy4gKi8KKyAgeworICAgIGNoYXIgKmwgPSBsaW5lOworICAgIGNoYXIgKnRva2VuX3N0YXJ0ID0gbDsKKyAgICBjaGFyICptbmVtX3A7CisKKyAgICAvKiBOb24temVybyBpZiB3ZSBmb3VuZCBhIHByZWZpeCBvbmx5IGFjY2VwdGFibGUgd2l0aCBzdHJpbmcgaW5zbnMuICovCisgICAgY29uc3QgY2hhciAqZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbiA9IE5VTEw7CisKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKwltbmVtX3AgPSBtbmVtb25pYzsKKwl3aGlsZSAoKCptbmVtX3AgPSBtbmVtb25pY19jaGFyc1sodW5zaWduZWQgY2hhcikgKmxdKSAhPSAwKQorCSAgeworCSAgICBtbmVtX3ArKzsKKwkgICAgaWYgKG1uZW1fcCA+PSBtbmVtb25pYyArIHNpemVvZiAobW5lbW9uaWMpKQorCSAgICAgIHsKKwkJYXNfYmFkIChfKCJubyBzdWNoIDM4NiBpbnN0cnVjdGlvbjogYCVzJyIpLCB0b2tlbl9zdGFydCk7CisJCXJldHVybjsKKwkgICAgICB9CisJICAgIGwrKzsKKwkgIH0KKwlpZiAoIWlzX3NwYWNlX2NoYXIgKCpsKQorCSAgICAmJiAqbCAhPSBFTkRfT0ZfSU5TTgorCSAgICAmJiAqbCAhPSBQUkVGSVhfU0VQQVJBVE9SKQorCSAgeworCSAgICBhc19iYWQgKF8oImludmFsaWQgY2hhcmFjdGVyICVzIGluIG1uZW1vbmljIiksCisJCSAgICBvdXRwdXRfaW52YWxpZCAoKmwpKTsKKwkgICAgcmV0dXJuOworCSAgfQorCWlmICh0b2tlbl9zdGFydCA9PSBsKQorCSAgeworCSAgICBpZiAoKmwgPT0gUFJFRklYX1NFUEFSQVRPUikKKwkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBwcmVmaXg7IGdvdCBub3RoaW5nIikpOworCSAgICBlbHNlCisJICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgbW5lbW9uaWM7IGdvdCBub3RoaW5nIikpOworCSAgICByZXR1cm47CisJICB9CisKKwkvKiBMb29rIHVwIGluc3RydWN0aW9uIChvciBwcmVmaXgpIHZpYSBoYXNoIHRhYmxlLiAgKi8KKwljdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOworCisJaWYgKCpsICE9IEVORF9PRl9JTlNOCisJICAgICYmICghIGlzX3NwYWNlX2NoYXIgKCpsKSB8fCBsWzFdICE9IEVORF9PRl9JTlNOKQorCSAgICAmJiBjdXJyZW50X3RlbXBsYXRlcworCSAgICAmJiAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1ByZWZpeCkpCisJICB7CisJICAgIC8qIElmIHdlIGFyZSBpbiAxNi1iaXQgbW9kZSwgZG8gbm90IGFsbG93IGFkZHIxNiBvciBkYXRhMTYuCisJICAgICAgIFNpbWlsYXJseSwgaW4gMzItYml0IG1vZGUsIGRvIG5vdCBhbGxvdyBhZGRyMzIgb3IgZGF0YTMyLiAgKi8KKwkgICAgaWYgKChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIChTaXplMTYgfCBTaXplMzIpKQorCQkmJiAoKChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIFNpemUzMikgIT0gMCkKKwkJICAgIF4gZmxhZ18xNmJpdF9jb2RlKSkKKwkgICAgICB7CisJCWFzX2JhZCAoXygicmVkdW5kYW50ICVzIHByZWZpeCIpLAorCQkJY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgICAgLyogQWRkIHByZWZpeCwgY2hlY2tpbmcgZm9yIHJlcGVhdGVkIHByZWZpeGVzLiAgKi8KKwkgICAgc3dpdGNoIChhZGRfcHJlZml4IChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPmJhc2Vfb3Bjb2RlKSkKKwkgICAgICB7CisJICAgICAgY2FzZSAwOgorCQlyZXR1cm47CisJICAgICAgY2FzZSAyOgorCQlleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uID0KKwkJICBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWU7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgLyogU2tpcCBwYXN0IFBSRUZJWF9TRVBBUkFUT1IgYW5kIHJlc2V0IHRva2VuX3N0YXJ0LiAgKi8KKwkgICAgdG9rZW5fc3RhcnQgPSArK2w7CisJICB9CisJZWxzZQorCSAgYnJlYWs7CisgICAgICB9CisKKyAgICBpZiAoIWN1cnJlbnRfdGVtcGxhdGVzKQorICAgICAgeworCS8qIFNlZSBpZiB3ZSBjYW4gZ2V0IGEgbWF0Y2ggYnkgdHJpbW1pbmcgb2ZmIGEgc3VmZml4LgkqLworCXN3aXRjaCAobW5lbV9wWy0xXSkKKwkgIHsKKwkgIGNhc2UgRFdPUkRfTU5FTV9TVUZGSVg6CisJICBjYXNlIFdPUkRfTU5FTV9TVUZGSVg6CisJICBjYXNlIEJZVEVfTU5FTV9TVUZGSVg6CisJICBjYXNlIFNIT1JUX01ORU1fU1VGRklYOgorI2lmIExPTkdfTU5FTV9TVUZGSVggIT0gRFdPUkRfTU5FTV9TVUZGSVgKKwkgIGNhc2UgTE9OR19NTkVNX1NVRkZJWDoKKyNlbmRpZgorCSAgICBpLnN1ZmZpeCA9IG1uZW1fcFstMV07CisJICAgIG1uZW1fcFstMV0gPSAnXDAnOworCSAgICBjdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAvKiBJbnRlbCBTeW50YXggKi8KKyAgICAgICAgICBjYXNlIElOVEVMX0RXT1JEX01ORU1fU1VGRklYOgorICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkuc3VmZml4ID0gbW5lbV9wWy0xXTsKKyAgICAgICAgICAgICAgICBtbmVtX3BbLTFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisJICB9CisJaWYgKCFjdXJyZW50X3RlbXBsYXRlcykKKwkgIHsKKwkgICAgYXNfYmFkIChfKCJubyBzdWNoIDM4NiBpbnN0cnVjdGlvbjogYCVzJyIpLCB0b2tlbl9zdGFydCk7CisJICAgIHJldHVybjsKKwkgIH0KKyAgICAgIH0KKworICAgIC8qIGNoZWNrIGZvciByZXAvcmVwbmUgd2l0aG91dCBhIHN0cmluZyBpbnN0cnVjdGlvbiAqLworICAgIGlmIChleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uCisJJiYgIShjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSkKKyAgICAgIHsKKwlhc19iYWQgKF8oImV4cGVjdGluZyBzdHJpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYCVzJyIpLAorCQlleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uKTsKKwlyZXR1cm47CisgICAgICB9CisKKyAgICAvKiBUaGVyZSBtYXkgYmUgb3BlcmFuZHMgdG8gcGFyc2UuICovCisgICAgaWYgKCpsICE9IEVORF9PRl9JTlNOKQorICAgICAgeworCS8qIHBhcnNlIG9wZXJhbmRzICovCisKKwkvKiAxIGlmIG9wZXJhbmQgaXMgcGVuZGluZyBhZnRlciAnLCcuICovCisJdW5zaWduZWQgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKKworCS8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgcGFyZW5zIG5vdCBiYWxhbmNlZC4gKi8KKwl1bnNpZ25lZCBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOworCisJZG8KKwkgIHsKKwkgICAgLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLworCSAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmwpKQorCSAgICAgICsrbDsKKwkgICAgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpsKSAmJiAqbCAhPSBFTkRfT0ZfSU5TTikKKwkgICAgICB7CisJCWFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlIG9wZXJhbmQgJWQiKSwKKwkJCW91dHB1dF9pbnZhbGlkICgqbCksCisJCQlpLm9wZXJhbmRzICsgMSk7CisJCXJldHVybjsKKwkgICAgICB9CisJICAgIHRva2VuX3N0YXJ0ID0gbDsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KKwkgICAgcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKKwkgICAgd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqbCAhPSAnLCcpCisJICAgICAgeworCQlpZiAoKmwgPT0gRU5EX09GX0lOU04pCisJCSAgeworCQkgICAgaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKKwkJICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCisJCQkgIGFzX2JhZCAoXygidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiBvcGVyYW5kICVkLiIpLAorCQkJCSAgaS5vcGVyYW5kcyArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJICBhc19iYWQgKF8oInVuYmFsYW5jZWQgYnJhY2tldHMgaW4gb3BlcmFuZCAlZC4iKSwKKwkJCQkgIGkub3BlcmFuZHMgKyAxKTsKKwkJCXJldHVybjsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KKwkJICB9CisJCWVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpsKSAmJiAhaXNfc3BhY2VfY2hhciAoKmwpKQorCQkgIHsKKwkJICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gb3BlcmFuZCAlZCIpLAorCQkJICAgIG91dHB1dF9pbnZhbGlkICgqbCksCisJCQkgICAgaS5vcGVyYW5kcyArIDEpOworCQkgICAgcmV0dXJuOworCQkgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWludGVsX3N5bnRheCkKKyAgICAgICAgICAgICAgICAgIHsKKwkJICAgIGlmICgqbCA9PSAnKCcpCisJCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOworCQkgICAgaWYgKCpsID09ICcpJykKKwkJICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworCQkgICAgaWYgKCpsID09ICdbJykKKwkJICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7CisJCSAgICBpZiAoKmwgPT0gJ10nKQorCQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAgIH0KKwkJbCsrOworCSAgICAgIH0KKwkgICAgaWYgKGwgIT0gdG9rZW5fc3RhcnQpCisJICAgICAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KKwkJdW5zaWduZWQgaW50IG9wZXJhbmRfb2s7CisJCXRoaXNfb3BlcmFuZCA9IGkub3BlcmFuZHMrKzsKKwkJaWYgKGkub3BlcmFuZHMgPiBNQVhfT1BFUkFORFMpCisJCSAgeworCQkgICAgYXNfYmFkIChfKCJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiKSwKKwkJCSAgICBNQVhfT1BFUkFORFMpOworCQkgICAgcmV0dXJuOworCQkgIH0KKwkJLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2knIGFzIHdlIGdvIGFsb25nICovCisJCUVORF9TVFJJTkdfQU5EX1NBVkUgKGwpOworCisgICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgICAgICAgIG9wZXJhbmRfb2sgPSBpMzg2X2ludGVsX29wZXJhbmQgKHRva2VuX3N0YXJ0LCBpbnRlbF9mbG9hdF9vcGVyYW5kIChtbmVtb25pYykpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG9wZXJhbmRfb2sgPSBpMzg2X29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKKworCQlSRVNUT1JFX0VORF9TVFJJTkcgKGwpOwkvKiByZXN0b3JlIG9sZCBjb250ZW50cyAqLworCQlpZiAoIW9wZXJhbmRfb2spCisJCSAgcmV0dXJuOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaWYgKGV4cGVjdGluZ19vcGVyYW5kKQorCQkgIHsKKwkJICBleHBlY3Rpbmdfb3BlcmFuZF9hZnRlcl9jb21tYToKKwkJICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpKTsKKwkJICAgIHJldHVybjsKKwkJICB9CisJCWlmICgqbCA9PSAnLCcpCisJCSAgeworCQkgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpKTsKKwkJICAgIHJldHVybjsKKwkJICB9CisJICAgICAgfQorCisJICAgIC8qIG5vdyAqbCBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KKwkgICAgaWYgKCpsID09ICcsJykKKwkgICAgICB7CisJCWlmICgqKytsID09IEVORF9PRl9JTlNOKQorCQkgIHsJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLworCQkgICAgZ290byBleHBlY3Rpbmdfb3BlcmFuZF9hZnRlcl9jb21tYTsKKwkJICB9CisJCWV4cGVjdGluZ19vcGVyYW5kID0gMTsKKwkgICAgICB9CisJICB9CisJd2hpbGUgKCpsICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCisgICAgICB9CisgIH0KKworICAvKiBOb3cgd2UndmUgcGFyc2VkIHRoZSBtbmVtb25pYyBpbnRvIGEgc2V0IG9mIHRlbXBsYXRlcywgYW5kIGhhdmUgdGhlCisgICAgIG9wZXJhbmRzIGF0IGhhbmQuCisKKyAgICAgTmV4dCwgd2UgZmluZCBhIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaW5zbiwKKyAgICAgbWFraW5nIHN1cmUgdGhlIG92ZXJsYXAgb2YgdGhlIGdpdmVuIG9wZXJhbmRzIHR5cGVzIGlzIGNvbnNpc3RlbnQKKyAgICAgd2l0aCB0aGUgdGVtcGxhdGUgb3BlcmFuZCB0eXBlcy4gKi8KKworI2RlZmluZSBNQVRDSChvdmVybGFwLCBnaXZlbiwgdGVtcGxhdGUpIFwKKyAgKChvdmVybGFwKSBcCisgICAmJiAoKGdpdmVuKSAmIEJhc2VJbmRleCkgPT0gKChvdmVybGFwKSAmIEJhc2VJbmRleCkgXAorICAgJiYgKChnaXZlbikgJiBKdW1wQWJzb2x1dGUpID09ICgodGVtcGxhdGUpICYgSnVtcEFic29sdXRlKSkKKworICAvKiBJZiBnaXZlbiB0eXBlcyByMCBhbmQgcjEgYXJlIHJlZ2lzdGVycyB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZQorICAgICB1bmxlc3MgdGhlIGV4cGVjdGVkIG9wZXJhbmQgdHlwZSByZWdpc3RlciBvdmVybGFwIGlzIG51bGwuCisgICAgIE5vdGUgdGhhdCBBY2MgaW4gYSB0ZW1wbGF0ZSBtYXRjaGVzIGV2ZXJ5IHNpemUgb2YgcmVnLiAgKi8KKyNkZWZpbmUgQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSChtMCwgZzAsIHQwLCBtMSwgZzEsIHQxKSBcCisgICggKChnMCkgJiBSZWcpID09IDAgfHwgKChnMSkgJiBSZWcpID09IDAgfHwgXAorICAgICgoZzApICYgUmVnKSA9PSAoKGcxKSAmIFJlZykgfHwgXAorICAgICgoKChtMCkgJiBBY2MpID8gUmVnIDogKHQwKSkgJiAoKChtMSkgJiBBY2MpID8gUmVnIDogKHQxKSkgJiBSZWcpID09IDAgKQorCisgIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgb3ZlcmxhcDAsIG92ZXJsYXAxOworICAgIGV4cHJlc3Npb25TICpleHA7CisgICAgdW5zaWduZWQgaW50IG92ZXJsYXAyOworICAgIHVuc2lnbmVkIGludCBmb3VuZF9yZXZlcnNlX21hdGNoOworICAgIGludCBzdWZmaXhfY2hlY2s7CisKKyAgICAvKiBBbGwgaW50ZWwgb3Bjb2RlcyBoYXZlIHJldmVyc2VkIG9wZXJhbmRzIGV4Y2VwdCBmb3IgQk9VTkQgYW5kIEVOVEVSICovCisgICAgaWYgKGludGVsX3N5bnRheAorICAgICAgICAmJiAoc3RyY21wIChtbmVtb25pYywgImVudGVyIikgIT0gMCkKKyAgICAgICAgJiYgKHN0cmNtcCAobW5lbW9uaWMsICJib3VuZCIpICE9IDApCisgICAgICAgICYmIChzdHJuY21wIChtbmVtb25pYywgImZzdWIiLCA0KSAhPTApCisgICAgICAgICYmIChzdHJuY21wIChtbmVtb25pYywgImZkaXYiLCA0KSAhPTApKQorICAgICAgeworICAgICAgICBjb25zdCByZWdfZW50cnkgKnRlbXBfcmVnOworICAgICAgICBleHByZXNzaW9uUyAqdGVtcF9kaXNwOworICAgICAgICBleHByZXNzaW9uUyAqdGVtcF9pbW07CisgICAgICAgIHVuc2lnbmVkIGludCB0ZW1wX3R5cGU7CisgICAgICAgIGludCB4Y2hnMSwgeGNoZzI7CisKKyAgICAgICAgaWYgKGkub3BlcmFuZHMgPT0gMikKKyAgICAgICAgICB7CisgICAgICAgICAgICB4Y2hnMSA9IDA7CisgICAgICAgICAgICB4Y2hnMiA9IDE7CisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpLm9wZXJhbmRzID09IDMpCisgICAgICAgICAgeworICAgICAgICAgICAgeGNoZzEgPSAwOworICAgICAgICAgICAgeGNoZzIgPSAyOworICAgICAgICAgIH0KKworICAgICAgICBpZiAoaS5vcGVyYW5kcyA+IDEpCisgICAgICAgICAgeworICAgICAgICAgICAgdGVtcF90eXBlID0gaS50eXBlc1t4Y2hnMl07CisgICAgICAgICAgICBpZiAodGVtcF90eXBlICYgKFJlZyB8IEZsb2F0UmVnKSkKKyAgICAgICAgICAgICAgdGVtcF9yZWcgPSBpLnJlZ3NbeGNoZzJdOworICAgICAgICAgICAgZWxzZSBpZiAodGVtcF90eXBlICYgSW1tKQorICAgICAgICAgICAgICB0ZW1wX2ltbSA9IGkuaW1tc1t4Y2hnMl07CisgICAgICAgICAgICBlbHNlIGlmICh0ZW1wX3R5cGUgJiBEaXNwKQorICAgICAgICAgICAgICB0ZW1wX2Rpc3AgPSBpLmRpc3BzW3hjaGcyXTsKKyAgICAgICAgICAgCisgICAgICAgICAgICBpLnR5cGVzW3hjaGcyXSA9IGkudHlwZXNbeGNoZzFdOworCisgICAgICAgICAgICBpZiAoaS50eXBlc1t4Y2hnMV0gJiAoUmVnIHwgRmxvYXRSZWcpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcyXSA9IGkucmVnc1t4Y2hnMV07CisgICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcxXSA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGkudHlwZXNbeGNoZzJdICYgSW1tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcyXSA9IGkuaW1tc1t4Y2hnMV07CisgICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcxXSA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGkudHlwZXNbeGNoZzJdICYgRGlzcCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkuZGlzcHNbeGNoZzJdID0gaS5kaXNwc1t4Y2hnMV07CisgICAgICAgICAgICAgICAgaS5kaXNwc1t4Y2hnMV0gPSBOVUxMOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0ZW1wX3R5cGUgJiAoUmVnIHwgRmxvYXRSZWcpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcxXSA9IHRlbXBfcmVnOworICAgICAgICAgICAgICAgIGlmICghIChpLnR5cGVzW3hjaGcxXSAmIChSZWcgfCBGbG9hdFJlZykpKQorICAgICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcyXSA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIEltbSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkuaW1tc1t4Y2hnMV0gPSB0ZW1wX2ltbTsKKyAgICAgICAgICAgICAgICBpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiBJbW0pKQorICAgICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcyXSA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIERpc3ApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpLmRpc3BzW3hjaGcxXSA9IHRlbXBfZGlzcDsKKyAgICAgICAgICAgICAgICBpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiBEaXNwKSkKKyAgICAgICAgICAgICAgICAgIGkuZGlzcHNbeGNoZzJdID0gTlVMTDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIGkudHlwZXNbeGNoZzFdID0gdGVtcF90eXBlOworICAgICAgICAgICB9CisgICAgICAgaWYgKCFzdHJjbXAobW5lbW9uaWMsImptcCIpCisgICAgICAgICAgIHx8ICFzdHJjbXAgKG1uZW1vbmljLCAiY2FsbCIpKQorICAgICAgICAgaWYgKChpLnR5cGVzWzBdICYgUmVnKSB8fCBpLnR5cGVzWzBdICYgQmFzZUluZGV4KQorICAgICAgICAgICBpLnR5cGVzWzBdIHw9IEp1bXBBYnNvbHV0ZTsKKyAgICAgICAgIAorICAgICAgIH0KKyAgICBvdmVybGFwMCA9IDA7CisgICAgb3ZlcmxhcDEgPSAwOworICAgIG92ZXJsYXAyID0gMDsKKyAgICBmb3VuZF9yZXZlcnNlX21hdGNoID0gMDsKKyAgICBzdWZmaXhfY2hlY2sgPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWAorCQkgICAgPyBOb19iU3VmCisJCSAgICA6IChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYCisJCSAgICAgICA/IE5vX3dTdWYKKwkJICAgICAgIDogKGkuc3VmZml4ID09IFNIT1JUX01ORU1fU1VGRklYCisJCQkgID8gTm9fc1N1ZgorCQkJICA6IChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTm9fbFN1ZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTm9fZFN1ZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaS5zdWZmaXggPT0gTE9OR19ET1VCTEVfTU5FTV9TVUZGSVggPyBOb194U3VmIDogMCkpKSkpKTsKKworICAgIGZvciAodCA9IGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydDsKKwkgdCA8IGN1cnJlbnRfdGVtcGxhdGVzLT5lbmQ7CisJIHQrKykKKyAgICAgIHsKKwkvKiBNdXN0IGhhdmUgcmlnaHQgbnVtYmVyIG9mIG9wZXJhbmRzLiAqLworCWlmIChpLm9wZXJhbmRzICE9IHQtPm9wZXJhbmRzKQorCSAgY29udGludWU7CisKKyAgICAgICAgLyogRm9yIHNvbWUgb3Bjb2RlcywgZG9uJ3QgY2hlY2sgdGhlIHN1ZmZpeCAqLworICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsICJmbnN0Y3ciKQorICAgICAgICAgICAgICAgICYmIHN0cmNtcCAodC0+bmFtZSwgImZsZGN3IikKKyAgICAgICAgICAgICAgICAmJiAodC0+b3Bjb2RlX21vZGlmaWVyICYgc3VmZml4X2NoZWNrKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAvKiBNdXN0IG5vdCBoYXZlIGRpc2FsbG93ZWQgc3VmZml4LiAqLyAKKyAgICAgICAgZWxzZSBpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIHN1ZmZpeF9jaGVjaykpCisgICAgICAgICAgICBjb250aW51ZTsKKworCWVsc2UgaWYgKCF0LT5vcGVyYW5kcykKKwkgIGJyZWFrOwkJLyogMCBvcGVyYW5kcyBhbHdheXMgbWF0Y2hlcyAqLworCisJb3ZlcmxhcDAgPSBpLnR5cGVzWzBdICYgdC0+b3BlcmFuZF90eXBlc1swXTsKKwlzd2l0Y2ggKHQtPm9wZXJhbmRzKQorCSAgeworCSAgY2FzZSAxOgorCSAgICBpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1swXSkpCisJICAgICAgY29udGludWU7CisJICAgIGJyZWFrOworCSAgY2FzZSAyOgorCSAgY2FzZSAzOgorCSAgICBvdmVybGFwMSA9IGkudHlwZXNbMV0gJiB0LT5vcGVyYW5kX3R5cGVzWzFdOworCSAgICBpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1swXSkKKwkJfHwgIU1BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwgdC0+b3BlcmFuZF90eXBlc1sxXSkKKwkJfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLAorCQkJCQkgICAgICAgdC0+b3BlcmFuZF90eXBlc1swXSwKKwkJCQkJICAgICAgIG92ZXJsYXAxLCBpLnR5cGVzWzFdLAorCQkJCQkgICAgICAgdC0+b3BlcmFuZF90eXBlc1sxXSkpCisJICAgICAgeworCisJCS8qIGNoZWNrIGlmIG90aGVyIGRpcmVjdGlvbiBpcyB2YWxpZCAuLi4gKi8KKwkJaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoRHxGbG9hdEQpKSA9PSAwKQorCQkgIGNvbnRpbnVlOworCisJCS8qIHRyeSByZXZlcnNpbmcgZGlyZWN0aW9uIG9mIG9wZXJhbmRzICovCisJCW92ZXJsYXAwID0gaS50eXBlc1swXSAmIHQtPm9wZXJhbmRfdHlwZXNbMV07CisJCW92ZXJsYXAxID0gaS50eXBlc1sxXSAmIHQtPm9wZXJhbmRfdHlwZXNbMF07CisJCWlmICghTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLCB0LT5vcGVyYW5kX3R5cGVzWzFdKQorCQkgICAgfHwgIU1BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwgdC0+b3BlcmFuZF90eXBlc1swXSkKKwkJICAgIHx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwKKwkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMV0sCisJCQkJCQkgICBvdmVybGFwMSwgaS50eXBlc1sxXSwKKwkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMF0pKQorCQkgIHsKKwkJICAgIC8qIGRvZXMgbm90IG1hdGNoIGVpdGhlciBkaXJlY3Rpb24gKi8KKwkJICAgIGNvbnRpbnVlOworCQkgIH0KKwkJLyogZm91bmRfcmV2ZXJzZV9tYXRjaCBob2xkcyB3aGljaCBvZiBEIG9yIEZsb2F0RFIKKwkJICAgd2UndmUgZm91bmQuICAqLworCQlmb3VuZF9yZXZlcnNlX21hdGNoID0gdC0+b3Bjb2RlX21vZGlmaWVyICYgKER8RmxvYXREUik7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgLyogZm91bmQgYSBmb3J3YXJkIDIgb3BlcmFuZCBtYXRjaCBoZXJlICovCisJICAgIGlmICh0LT5vcGVyYW5kcyA9PSAzKQorCSAgICAgIHsKKwkJLyogSGVyZSB3ZSBtYWtlIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubworCQkgICByZXZlcnNlIG1hdGNoIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMsIGFuZCBhbGwgMworCQkgICBvcGVyYW5kIGluc3RydWN0aW9ucyBvbmx5IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IKKwkJICAgcmVnaXN0ZXIgY29uc2lzdGVuY3kgYmV0d2VlbiBvcGVyYW5kcyAyIGFuZCAzLiAgKi8KKwkJb3ZlcmxhcDIgPSBpLnR5cGVzWzJdICYgdC0+b3BlcmFuZF90eXBlc1syXTsKKwkJaWYgKCFNQVRDSCAob3ZlcmxhcDIsIGkudHlwZXNbMl0sIHQtPm9wZXJhbmRfdHlwZXNbMl0pCisJCSAgICB8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sCisJCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzFdLAorCQkJCQkJICAgb3ZlcmxhcDIsIGkudHlwZXNbMl0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMl0pKQorCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgICB9CisJICAgIC8qIGZvdW5kIGVpdGhlciBmb3J3YXJkL3JldmVyc2UgMiBvciAzIG9wZXJhbmQgbWF0Y2ggaGVyZToKKwkgICAgICAgc2xpcCB0aHJvdWdoIHRvIGJyZWFrICovCisJICB9CisJYnJlYWs7CQkJLyogd2UndmUgZm91bmQgYSBtYXRjaDsgYnJlYWsgb3V0IG9mIGxvb3AgKi8KKyAgICAgIH0JCQkJLyogZm9yICh0ID0gLi4uICovCisgICAgaWYgKHQgPT0gY3VycmVudF90ZW1wbGF0ZXMtPmVuZCkKKyAgICAgIHsJCQkJLyogd2UgZm91bmQgbm8gbWF0Y2ggKi8KKwlhc19iYWQgKF8oInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIiksCisJCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7CisJcmV0dXJuOworICAgICAgfQorCisgICAgaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoSXNQcmVmaXh8SWdub3JlU2l6ZSkpID09IChJc1ByZWZpeHxJZ25vcmVTaXplKSkKKyAgICAgIHsKKwkvKiBXYXJuIHRoZW0gdGhhdCBhIGRhdGEgb3IgYWRkcmVzcyBzaXplIHByZWZpeCBkb2Vzbid0IGFmZmVjdAorCSAgIGFzc2VtYmx5IG9mIHRoZSBuZXh0IGxpbmUgb2YgY29kZS4gICovCisJYXNfd2FybiAoXygic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiKSwgdC0+bmFtZSk7CisgICAgICB9CisKKyAgICAvKiBDb3B5IHRoZSB0ZW1wbGF0ZSB3ZSBmb3VuZC4gICovCisgICAgaS50bSA9ICp0OworICAgIGlmIChmb3VuZF9yZXZlcnNlX21hdGNoKQorICAgICAgeworCWkudG0ub3BlcmFuZF90eXBlc1swXSA9IHQtPm9wZXJhbmRfdHlwZXNbMV07CisJaS50bS5vcGVyYW5kX3R5cGVzWzFdID0gdC0+b3BlcmFuZF90eXBlc1swXTsKKyAgICAgIH0KKworCisgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRldhaXQpCisgICAgICBpZiAoISBhZGRfcHJlZml4IChGV0FJVF9PUENPREUpKQorCXJldHVybjsKKworICAgIC8qIENoZWNrIHN0cmluZyBpbnN0cnVjdGlvbiBzZWdtZW50IG92ZXJyaWRlcyAqLworICAgIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgIT0gMCAmJiBpLm1lbV9vcGVyYW5kcyAhPSAwKQorICAgICAgeworCWludCBtZW1fb3AgPSAoaS50eXBlc1swXSAmIEFueU1lbSkgPyAwIDogMTsKKwlpZiAoKGkudG0ub3BlcmFuZF90eXBlc1ttZW1fb3BdICYgRXNTZWcpICE9IDApCisJICB7CisJICAgIGlmIChpLnNlZ1swXSAhPSBOVUxMICYmIGkuc2VnWzBdICE9ICZlcykKKwkgICAgICB7CisJCWFzX2JhZCAoXygiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IiksCisJCQlpLnRtLm5hbWUsCisJCQltZW1fb3AgKyAxKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgICAgLyogVGhlcmUncyBvbmx5IGV2ZXIgb25lIHNlZ21lbnQgb3ZlcnJpZGUgYWxsb3dlZCBwZXIgaW5zdHJ1Y3Rpb24uCisJICAgICAgIFRoaXMgaW5zdHJ1Y3Rpb24gcG9zc2libHkgaGFzIGEgbGVnYWwgc2VnbWVudCBvdmVycmlkZSBvbiB0aGUKKwkgICAgICAgc2Vjb25kIG9wZXJhbmQsIHNvIGNvcHkgdGhlIHNlZ21lbnQgdG8gd2hlcmUgbm9uLXN0cmluZworCSAgICAgICBpbnN0cnVjdGlvbnMgc3RvcmUgaXQsIGFsbG93aW5nIGNvbW1vbiBjb2RlLiAgKi8KKwkgICAgaS5zZWdbMF0gPSBpLnNlZ1sxXTsKKwkgIH0KKwllbHNlIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW21lbV9vcCArIDFdICYgRXNTZWcpICE9IDApCisJICB7CisJICAgIGlmIChpLnNlZ1sxXSAhPSBOVUxMICYmIGkuc2VnWzFdICE9ICZlcykKKwkgICAgICB7CisJCWFzX2JhZCAoXygiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IiksCisJCQlpLnRtLm5hbWUsCisJCQltZW1fb3AgKyAyKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIC8qIElmIG1hdGNoZWQgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIG1uZW1vbmljCisgICAgICAgc3VmZml4LCB1c2UgaXQuICAqLworICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChTaXplMTYgfCBTaXplMzIpKQorICAgICAgeworCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNpemUxNikKKwkgIGkuc3VmZml4ID0gV09SRF9NTkVNX1NVRkZJWDsKKwllbHNlCisJICBpLnN1ZmZpeCA9IERXT1JEX01ORU1fU1VGRklYOworICAgICAgfQorICAgIGVsc2UgaWYgKGkucmVnX29wZXJhbmRzKQorICAgICAgeworCS8qIElmIHRoZXJlJ3Mgbm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IHdlIHRyeSB0byBpbnZlbnQgb25lCisJICAgYmFzZWQgb24gcmVnaXN0ZXIgb3BlcmFuZHMuICovCisJaWYgKCFpLnN1ZmZpeCkKKwkgIHsKKwkgICAgLyogV2UgdGFrZSBpLnN1ZmZpeCBmcm9tIHRoZSBsYXN0IHJlZ2lzdGVyIG9wZXJhbmQgc3BlY2lmaWVkLAorCSAgICAgICBEZXN0aW5hdGlvbiByZWdpc3RlciB0eXBlIGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiBzb3VyY2UKKwkgICAgICAgcmVnaXN0ZXIgdHlwZS4gICovCisJICAgIGludCBvcDsKKwkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQorCSAgICAgIGlmIChpLnR5cGVzW29wXSAmIFJlZykKKwkJeworCQkgIGkuc3VmZml4ID0gKChpLnR5cGVzW29wXSAmIFJlZzgpID8gQllURV9NTkVNX1NVRkZJWCA6CisJCQkgICAgICAoaS50eXBlc1tvcF0gJiBSZWcxNikgPyBXT1JEX01ORU1fU1VGRklYIDoKKwkJCSAgICAgIERXT1JEX01ORU1fU1VGRklYKTsKKwkJICBicmVhazsKKwkJfQorCSAgfQorCWVsc2UgaWYgKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgpCisJICB7CisJICAgIGludCBvcDsKKwkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQorCSAgICAgIHsKKwkJLyogSWYgdGhpcyBpcyBhbiBlaWdodCBiaXQgcmVnaXN0ZXIsIGl0J3MgT0suICBJZiBpdCdzCisJCSAgIHRoZSAxNiBvciAzMiBiaXQgdmVyc2lvbiBvZiBhbiBlaWdodCBiaXQgcmVnaXN0ZXIsCisJCSAgIHdlIHdpbGwganVzdCB1c2UgdGhlIGxvdyBwb3J0aW9uLCBhbmQgdGhhdCdzIE9LIHRvby4gKi8KKwkJaWYgKGkudHlwZXNbb3BdICYgUmVnOCkKKwkJICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qIG1vdnp4IGFuZCBtb3ZzeCBzaG91bGQgbm90IGdlbmVyYXRlIHRoaXMgd2FybmluZy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4CisgICAgICAgICAgICAgICAgICAgICYmIChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI3CisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI2CisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJlCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJmKSkKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisJCWlmICgoaS50eXBlc1tvcF0gJiBXb3JkUmVnKSAmJiBpLnJlZ3Nbb3BdLT5yZWdfbnVtIDwgNAorI2lmIDAKKwkJICAgIC8qIENoZWNrIHRoYXQgdGhlIHRlbXBsYXRlIGFsbG93cyBlaWdodCBiaXQgcmVncworCQkgICAgICAgVGhpcyBraWxscyBpbnNucyBzdWNoIGFzIGBvcmIgJDEsJWVkeCcsIHdoaWNoCisJCSAgICAgICBtYXliZSBzaG91bGQgYmUgYWxsb3dlZC4gICovCisJCSAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWc4fEluT3V0UG9ydFJlZykpCisjZW5kaWYKKwkJICAgICkKKwkJICB7CisjaWYgUkVHSVNURVJfV0FSTklOR1MKKwkJICAgIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIEluT3V0UG9ydFJlZykgPT0gMCkKKwkJICAgICAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAorCQkJICAgICAgIChpLnJlZ3Nbb3BdIC0gKGkudHlwZXNbb3BdICYgUmVnMTYgPyA4IDogMTYpKS0+cmVnX25hbWUsCisJCQkgICAgICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCisJCQkgICAgICAgaS5zdWZmaXgpOworI2VuZGlmCisJCSAgICBjb250aW51ZTsKKwkJICB9CisJCS8qIEFueSBvdGhlciByZWdpc3RlciBpcyBiYWQgKi8KKwkJaWYgKGkudHlwZXNbb3BdICYgKFJlZyB8IFJlZ01NWCB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QKKwkJCQkgICB8IEZsb2F0UmVnIHwgRmxvYXRBY2MgfCBTUmVnMiB8IFNSZWczKSkKKwkJICB7CisJCSAgICBhc19iYWQgKF8oImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIpLAorCQkJICAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAorCQkJICAgIGkudG0ubmFtZSwKKwkJCSAgICBpLnN1ZmZpeCk7CisJCSAgICByZXR1cm47CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwllbHNlIGlmIChpLnN1ZmZpeCA9PSBEV09SRF9NTkVNX1NVRkZJWCkKKwkgIHsKKwkgICAgaW50IG9wOworCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCisJICAgICAgLyogUmVqZWN0IGVpZ2h0IGJpdCByZWdpc3RlcnMsIGV4Y2VwdCB3aGVyZSB0aGUgdGVtcGxhdGUKKwkJIHJlcXVpcmVzIHRoZW0uIChlZy4gbW92emIpICAqLworCSAgICAgIGlmICgoaS50eXBlc1tvcF0gJiBSZWc4KSAhPSAwCisJCSAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8UmVnMzJ8QWNjKSkgIT0gMCkKKwkJeworCQkgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCisJCQkgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAorCQkJICBpLnRtLm5hbWUsCisJCQkgIGkuc3VmZml4KTsKKwkJICByZXR1cm47CisJCX0KKyNpZiBSRUdJU1RFUl9XQVJOSU5HUworCSAgICAgIC8qIFdhcm4gaWYgdGhlIGUgcHJlZml4IG9uIGEgZ2VuZXJhbCByZWcgaXMgbWlzc2luZy4gICovCisJICAgICAgZWxzZSBpZiAoKGkudHlwZXNbb3BdICYgUmVnMTYpICE9IDAKKwkJICAgICAgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzMyfEFjYykpICE9IDApCisJCXsKKwkJICBhc193YXJuIChfKCJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IiksCisJCQkgICAoaS5yZWdzW29wXSArIDgpLT5yZWdfbmFtZSwKKwkJCSAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAorCQkJICAgaS5zdWZmaXgpOworCQl9CisjZW5kaWYKKwkgIH0KKwllbHNlIGlmIChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYKQorCSAgeworCSAgICBpbnQgb3A7CisJICAgIGZvciAob3AgPSBpLm9wZXJhbmRzOyAtLW9wID49IDA7ICkKKwkgICAgICAvKiBSZWplY3QgZWlnaHQgYml0IHJlZ2lzdGVycywgZXhjZXB0IHdoZXJlIHRoZSB0ZW1wbGF0ZQorCQkgcmVxdWlyZXMgdGhlbS4gKGVnLiBtb3Z6YikgICovCisJICAgICAgaWYgKChpLnR5cGVzW29wXSAmIFJlZzgpICE9IDAKKwkJICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWcxNnxSZWczMnxBY2MpKSAhPSAwKQorCQl7CisJCSAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKKwkJCSAgaS5yZWdzW29wXS0+cmVnX25hbWUsCisJCQkgIGkudG0ubmFtZSwKKwkJCSAgaS5zdWZmaXgpOworCQkgIHJldHVybjsKKwkJfQorI2lmIFJFR0lTVEVSX1dBUk5JTkdTCisJICAgICAgLyogV2FybiBpZiB0aGUgZSBwcmVmaXggb24gYSBnZW5lcmFsIHJlZyBpcyBwcmVzZW50LiAgKi8KKwkgICAgICBlbHNlIGlmICgoaS50eXBlc1tvcF0gJiBSZWczMikgIT0gMAorCQkgICAgICAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8QWNjKSkgIT0gMCkKKwkJeworCQkgIGFzX3dhcm4gKF8oInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiKSwKKwkJCSAgIChpLnJlZ3Nbb3BdIC0gOCktPnJlZ19uYW1lLAorCQkJICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCisJCQkgICBpLnN1ZmZpeCk7CisJCX0KKyNlbmRpZgorCSAgfQorCWVsc2UKKwkgIGFib3J0KCk7CisgICAgICB9CisKKyAgICAvKiBNYWtlIHN0aWxsIHVucmVzb2x2ZWQgaW1tZWRpYXRlIG1hdGNoZXMgY29uZm9ybSB0byBzaXplIG9mIGltbWVkaWF0ZQorICAgICAgIGdpdmVuIGluIGkuc3VmZml4LiAgTm90ZTogb3ZlcmxhcDIgY2Fubm90IGJlIGFuIGltbWVkaWF0ZSEgICovCisgICAgaWYgKChvdmVybGFwMCAmIChJbW04IHwgSW1tOFMgfCBJbW0xNiB8IEltbTMyKSkKKwkmJiBvdmVybGFwMCAhPSBJbW04ICYmIG92ZXJsYXAwICE9IEltbThTCisJJiYgb3ZlcmxhcDAgIT0gSW1tMTYgJiYgb3ZlcmxhcDAgIT0gSW1tMzIpCisgICAgICB7CisJaWYgKGkuc3VmZml4KQorCSAgeworCSAgIG92ZXJsYXAwICY9IChpLnN1ZmZpeCA9PSBCWVRFX01ORU1fU1VGRklYID8gKEltbTggfCBJbW04UykgOgorCQkJKGkuc3VmZml4ID09IFdPUkRfTU5FTV9TVUZGSVggPyBJbW0xNiA6IEltbTMyKSk7CisJICB9CisJZWxzZSBpZiAob3ZlcmxhcDAgPT0gKEltbTE2IHwgSW1tMzIpKQorCSAgeworCSAgIG92ZXJsYXAwID0KKwkgICAgICAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKSkgPyBJbW0xNiA6IEltbTMyOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW47IGNhbid0IGRldGVybWluZSBpbW1lZGlhdGUgc2l6ZSIpKTsKKwkgICAgcmV0dXJuOworCSAgfQorICAgICAgfQorICAgIGlmICgob3ZlcmxhcDEgJiAoSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMikpCisJJiYgb3ZlcmxhcDEgIT0gSW1tOCAmJiBvdmVybGFwMSAhPSBJbW04UworCSYmIG92ZXJsYXAxICE9IEltbTE2ICYmIG92ZXJsYXAxICE9IEltbTMyKQorICAgICAgeworCWlmIChpLnN1ZmZpeCkKKwkgIHsKKwkgICBvdmVybGFwMSAmPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCA/IChJbW04IHwgSW1tOFMpIDoKKwkJCShpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYID8gSW1tMTYgOiBJbW0zMikpOworCSAgfQorCWVsc2UgaWYgKG92ZXJsYXAxID09IChJbW0xNiB8IEltbTMyKSkKKwkgIHsKKwkgICBvdmVybGFwMSA9CisJICAgICAgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCkpID8gSW1tMTYgOiBJbW0zMjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuOyBjYW4ndCBkZXRlcm1pbmUgaW1tZWRpYXRlIHNpemUiKSk7CisJICAgIHJldHVybjsKKwkgIH0KKyAgICAgIH0KKyAgICBhc3NlcnQgKChvdmVybGFwMiAmIEltbSkgPT0gMCk7CisKKyAgICBpLnR5cGVzWzBdID0gb3ZlcmxhcDA7CisgICAgaWYgKG92ZXJsYXAwICYgSW1wbGljaXRSZWdpc3RlcikKKyAgICAgIGkucmVnX29wZXJhbmRzLS07CisgICAgaWYgKG92ZXJsYXAwICYgSW1tMSkKKyAgICAgIGkuaW1tX29wZXJhbmRzID0gMDsJLyoga2x1ZGdlIGZvciBzaGlmdCBpbnNucyAqLworCisgICAgaS50eXBlc1sxXSA9IG92ZXJsYXAxOworICAgIGlmIChvdmVybGFwMSAmIEltcGxpY2l0UmVnaXN0ZXIpCisgICAgICBpLnJlZ19vcGVyYW5kcy0tOworCisgICAgaS50eXBlc1syXSA9IG92ZXJsYXAyOworICAgIGlmIChvdmVybGFwMiAmIEltcGxpY2l0UmVnaXN0ZXIpCisgICAgICBpLnJlZ19vcGVyYW5kcy0tOworCisgICAgLyogRmluYWxpemUgb3Bjb2RlLiAgRmlyc3QsIHdlIGNoYW5nZSB0aGUgb3Bjb2RlIGJhc2VkIG9uIHRoZSBvcGVyYW5kCisgICAgICAgc2l6ZSBnaXZlbiBieSBpLnN1ZmZpeDogIFdlIG5lZWQgbm90IGNoYW5nZSB0aGluZ3MgZm9yIGJ5dGUgaW5zbnMuICAqLworCisgICAgaWYgKCFpLnN1ZmZpeCAmJiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBXKSkKKyAgICAgIHsKKwlhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbiBhbmQgbm8gcmVnaXN0ZXIgb3BlcmFuZHM7IGNhbid0IHNpemUgaW5zdHJ1Y3Rpb24iKSk7CisJcmV0dXJuOworICAgICAgfQorCisgICAgLyogRm9yIG1vdnp4IGFuZCBtb3ZzeCwgbmVlZCB0byBjaGVjayB0aGUgcmVnaXN0ZXIgdHlwZSAqLworICAgIGlmIChpbnRlbF9zeW50YXgKKyAgICAgICAgJiYgKGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYjYgfHwgaS50bS5iYXNlX29wY29kZSA9PSAweGZiZSkpCisgICAgICBpZiAoaS5zdWZmaXggJiYgaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCkKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGludCBwcmVmaXggPSBEQVRBX1BSRUZJWF9PUENPREU7CisKKyAgICAgICAgICBpZiAoKGkucmVnc1sxXS0+cmVnX3R5cGUgJiBSZWcxNikgIT0gMCkKKyAgICAgICAgICAgIGlmICghYWRkX3ByZWZpeCAocHJlZml4KSkKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICBpZiAoaS5zdWZmaXggJiYgaS5zdWZmaXggIT0gQllURV9NTkVNX1NVRkZJWCkKKyAgICAgIHsKKwkvKiBJdCdzIG5vdCBhIGJ5dGUsIHNlbGVjdCB3b3JkL2R3b3JkIG9wZXJhdGlvbi4gICovCisJaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVykKKwkgIHsKKwkgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2hvcnRGb3JtKQorCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gODsKKwkgICAgZWxzZQorCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gMTsKKwkgIH0KKwkvKiBOb3cgc2VsZWN0IGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMgdmlhIHRoZSBvcGVyYW5kCisJICAgc2l6ZSBwcmVmaXgsIGV4Y2VwdCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBpZ25vcmUgdGhpcworCSAgIHByZWZpeCBhbnl3YXkuICAqLworCWlmICgoKGludGVsX3N5bnRheCAmJiAoaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpKQorICAgICAgICAgICAgIHx8IGkuc3VmZml4ID09IERXT1JEX01ORU1fU1VGRklYCisJICAgICB8fCBpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYKSA9PSBmbGFnXzE2Yml0X2NvZGUKKwkgICAgJiYgIShpLnRtLm9wY29kZV9tb2RpZmllciAmIElnbm9yZVNpemUpKQorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgcHJlZml4ID0gREFUQV9QUkVGSVhfT1BDT0RFOworCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wQnl0ZSkgLyogamN4eiwgbG9vcCAqLworCSAgICAgIHByZWZpeCA9IEFERFJfUFJFRklYX09QQ09ERTsKKworCSAgICBpZiAoISBhZGRfcHJlZml4IChwcmVmaXgpKQorCSAgICAgIHJldHVybjsKKwkgIH0KKwkvKiBTaXplIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLiAgKi8KKwlpZiAoaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWAorICAgICAgICAgICAgfHwgKGludGVsX3N5bnRheCAmJiBpLnN1ZmZpeCA9PSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCkpCisJICB7CisJICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEZsb2F0TUYpCisJICAgICAgaS50bS5iYXNlX29wY29kZSBePSA0OworCSAgfQorCisgICAgICAgIGlmIChpbnRlbF9zeW50YXggJiYgaS5zdWZmaXggPT0gTE9OR19ET1VCTEVfTU5FTV9TVUZGSVgpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRmxvYXRNRikKKyAgICAgICAgICAgICAgaS50bS5iYXNlX29wY29kZSBePSAyOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IEFNRF8zRE5PV19PUENPREUpCisgICAgICB7CisJLyogVGhlc2UgQU1EIHNwZWNpZmljIGluc3RydWN0aW9ucyBoYXZlIGFuIG9wY29kZSBzdWZmaXggd2hpY2gKKwkgICBpcyBjb2RlZCBpbiB0aGUgc2FtZSBwbGFjZSBhcyBhbiA4LWJpdCBpbW1lZGlhdGUgZmllbGQKKwkgICB3b3VsZCBiZS4gIEhlcmUgd2UgZmFrZSBhbiA4LWJpdCBpbW1lZGlhdGUgb3BlcmFuZCBmcm9tIHRoZQorCSAgIG9wY29kZSBzdWZmaXggc3RvcmVkIGluIHRtLmV4dGVuc2lvbl9vcGNvZGUuICAqLworCisJZXhwcmVzc2lvblMgKmV4cDsKKworCWFzc2VydChpLmltbV9vcGVyYW5kcyA9PSAwICYmIGkub3BlcmFuZHMgPD0gMik7CisKKwlleHAgPSAmaW1fZXhwcmVzc2lvbnNbaS5pbW1fb3BlcmFuZHMrK107CisJaS5pbW1zW2kub3BlcmFuZHNdID0gZXhwOworCWkudHlwZXNbaS5vcGVyYW5kcysrXSA9IEltbTg7CisJZXhwLT5YX29wID0gT19jb25zdGFudDsKKwlleHAtPlhfYWRkX251bWJlciA9IGkudG0uZXh0ZW5zaW9uX29wY29kZTsKKwlpLnRtLmV4dGVuc2lvbl9vcGNvZGUgPSBOb25lOworICAgICAgfQorCisgICAgLyogRm9yIGluc25zIHdpdGggb3BlcmFuZHMgdGhlcmUgYXJlIG1vcmUgZGlkZGxlcyB0byBkbyB0byB0aGUgb3Bjb2RlLiAqLworICAgIGlmIChpLm9wZXJhbmRzKQorICAgICAgeworICAgICAgICAvKiBEZWZhdWx0IHNlZ21lbnQgcmVnaXN0ZXIgdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHVzZQorCSAgIGZvciBtZW1vcnkgYWNjZXNzZXMuICAwIG1lYW5zIHVua25vd24uCisJICAgVGhpcyBpcyBvbmx5IGZvciBvcHRpbWl6aW5nIG91dCB1bm5lY2Vzc2FyeSBzZWdtZW50IG92ZXJyaWRlcy4gICovCisJY29uc3Qgc2VnX2VudHJ5ICpkZWZhdWx0X3NlZyA9IDA7CisKKwkvKiBJZiB3ZSBmb3VuZCBhIHJldmVyc2UgbWF0Y2ggd2UgbXVzdCBhbHRlciB0aGUgb3Bjb2RlCisJICAgZGlyZWN0aW9uIGJpdC4gIGZvdW5kX3JldmVyc2VfbWF0Y2ggaG9sZHMgYml0cyB0byBjaGFuZ2UKKwkgICAoZGlmZmVyZW50IGZvciBpbnQgJiBmbG9hdCBpbnNucykuICAqLworCisJaS50bS5iYXNlX29wY29kZSBePSBmb3VuZF9yZXZlcnNlX21hdGNoOworCisJLyogVGhlIGltdWwgJGltbSwgJXJlZyBpbnN0cnVjdGlvbiBpcyBjb252ZXJ0ZWQgaW50bworCSAgIGltdWwgJGltbSwgJXJlZywgJXJlZywgYW5kIHRoZSBjbHIgJXJlZyBpbnN0cnVjdGlvbgorCSAgIGlzIGNvbnZlcnRlZCBpbnRvIHhvciAlcmVnLCAlcmVnLiAgKi8KKwlpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiByZWdLbHVkZ2UpCisJICB7CisJICAgIHVuc2lnbmVkIGludCBmaXJzdF9yZWdfb3AgPSAoaS50eXBlc1swXSAmIFJlZykgPyAwIDogMTsKKwkgICAgLyogUHJldGVuZCB3ZSBzYXcgdGhlIGV4dHJhIHJlZ2lzdGVyIG9wZXJhbmQuICovCisJICAgIGkucmVnc1tmaXJzdF9yZWdfb3ArMV0gPSBpLnJlZ3NbZmlyc3RfcmVnX29wXTsKKwkgICAgaS5yZWdfb3BlcmFuZHMgPSAyOworCSAgfQorCisJaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgU2hvcnRGb3JtKQorCSAgeworCSAgICAvKiBUaGUgcmVnaXN0ZXIgb3IgZmxvYXQgcmVnaXN0ZXIgb3BlcmFuZCBpcyBpbiBvcGVyYW5kIDAgb3IgMS4gKi8KKwkgICAgdW5zaWduZWQgaW50IG9wID0gKGkudHlwZXNbMF0gJiAoUmVnIHwgRmxvYXRSZWcpKSA/IDAgOiAxOworCSAgICAvKiBSZWdpc3RlciBnb2VzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlLiAqLworCSAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IGkucmVnc1tvcF0tPnJlZ19udW07CisJICAgIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBVZ2gpICE9IDApCisJICAgICAgeworCQkvKiBXYXJuIGFib3V0IHNvbWUgY29tbW9uIGVycm9ycywgYnV0IHByZXNzIG9uIHJlZ2FyZGxlc3MuCisJCSAgIFRoZSBmaXJzdCBjYXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgZ2NjICg8PSAyLjguMSkuICAqLworCQlpZiAoaS5vcGVyYW5kcyA9PSAyKQorCQkgIHsKKwkJICAgIC8qIHJldmVyc2VkIGFyZ3VtZW50cyBvbiBmYWRkcCwgZnN1YnAsIGV0Yy4gKi8KKwkJICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzLCUlJXMnIiksIGkudG0ubmFtZSwKKwkJCSAgICAgaS5yZWdzWzFdLT5yZWdfbmFtZSwKKwkJCSAgICAgaS5yZWdzWzBdLT5yZWdfbmFtZSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgLyogZXh0cmFuZW91cyBgbCcgc3VmZml4IG9uIGZwIGluc24gKi8KKwkJICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzJyIpLCBpLnRtLm5hbWUsCisJCQkgICAgIGkucmVnc1swXS0+cmVnX25hbWUpOworCQkgIH0KKwkgICAgICB9CisJICB9CisJZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBNb2RybSkKKwkgIHsKKwkgICAgLyogVGhlIG9wY29kZSBpcyBjb21wbGV0ZWQgKG1vZHVsbyBpLnRtLmV4dGVuc2lvbl9vcGNvZGUgd2hpY2gKKwkgICAgICAgbXVzdCBiZSBwdXQgaW50byB0aGUgbW9kcm0gYnl0ZSkuCisJICAgICAgIE5vdywgd2UgbWFrZSB0aGUgbW9kcm0gJiBpbmRleCBiYXNlIGJ5dGVzIGJhc2VkIG9uIGFsbCB0aGUKKwkgICAgICAgaW5mbyB3ZSd2ZSBjb2xsZWN0ZWQuICovCisKKwkgICAgLyogaS5yZWdfb3BlcmFuZHMgTVVTVCBiZSB0aGUgbnVtYmVyIG9mIHJlYWwgcmVnaXN0ZXIgb3BlcmFuZHM7CisJICAgICAgIGltcGxpY2l0IHJlZ2lzdGVycyBkbyBub3QgY291bnQuICovCisJICAgIGlmIChpLnJlZ19vcGVyYW5kcyA9PSAyKQorCSAgICAgIHsKKwkJdW5zaWduZWQgaW50IHNvdXJjZSwgZGVzdDsKKwkJc291cmNlID0gKChpLnR5cGVzWzBdCisJCQkgICAmIChSZWcKKwkJCSAgICAgIHwgU1JlZzIKKwkJCSAgICAgIHwgU1JlZzMKKwkJCSAgICAgIHwgQ29udHJvbAorCQkJICAgICAgfCBEZWJ1ZworCQkJICAgICAgfCBUZXN0CisJCQkgICAgICB8IFJlZ01NWCkpCisJCQkgID8gMCA6IDEpOworCQlkZXN0ID0gc291cmNlICsgMTsKKworCQkvKiBDZXJ0YWluIGluc3RydWN0aW9ucyBleHBlY3QgdGhlIGRlc3RpbmF0aW9uIHRvIGJlCisJCSAgIGluIHRoZSBpLnJtLnJlZyBmaWVsZC4gIFRoaXMgaXMgYnkgZmFyIHRoZQorCQkgICBleGNlcHRpb25hbCBjYXNlLiAgRm9yIHRoZXNlIGluc3RydWN0aW9ucywgaWYgdGhlCisJCSAgIHNvdXJjZSBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIsIHdlIG11c3QgcmV2ZXJzZSB0aGUKKwkJICAgaS5ybS5yZWcgYW5kIGkucm0ucmVnbWVtIGZpZWxkcy4gIFdlIGFjY29tcGxpc2gKKwkJICAgdGhpcyBieSBwcmV0ZW5kaW5nIHRoYXQgdGhlIHR3byByZWdpc3RlciBvcGVyYW5kcworCQkgICB3ZXJlIGdpdmVuIGluIHRoZSByZXZlcnNlIG9yZGVyLiAgKi8KKwkJaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgUmV2ZXJzZVJlZ1JlZ21lbSkKKwkJICB7CisJCSAgICBjb25zdCByZWdfZW50cnkgKnRtcCA9IGkucmVnc1tzb3VyY2VdOworCQkgICAgaS5yZWdzW3NvdXJjZV0gPSBpLnJlZ3NbZGVzdF07CisJCSAgICBpLnJlZ3NbZGVzdF0gPSB0bXA7CisJCSAgfQorCisJCWkucm0ubW9kZSA9IDM7CisJCS8qIFdlIG11c3QgYmUgY2FyZWZ1bCB0byBtYWtlIHN1cmUgdGhhdCBhbGwKKwkJICAgc2VnbWVudC9jb250cm9sL3Rlc3QvZGVidWcvTU1YIHJlZ2lzdGVycyBnbyBpbnRvCisJCSAgIHRoZSBpLnJtLnJlZyBmaWVsZCAoZGVzcGl0ZSB3aGV0aGVyIHRoZXkgYXJlCisJCSAgIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvcGVyYW5kcykuICovCisJCWlmIChpLnJlZ3NbZGVzdF0tPnJlZ190eXBlCisJCSAgICAmIChTUmVnMiB8IFNSZWczIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCB8IFJlZ01NWCkpCisJCSAgeworCQkgICAgaS5ybS5yZWcgPSBpLnJlZ3NbZGVzdF0tPnJlZ19udW07CisJCSAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tzb3VyY2VdLT5yZWdfbnVtOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGkucm0ucmVnID0gaS5yZWdzW3NvdXJjZV0tPnJlZ19udW07CisJCSAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tkZXN0XS0+cmVnX251bTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgewkJCS8qIGlmIGl0J3Mgbm90IDIgcmVnIG9wZXJhbmRzLi4uICovCisJCWlmIChpLm1lbV9vcGVyYW5kcykKKwkJICB7CisJCSAgICB1bnNpZ25lZCBpbnQgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDA7CisJCSAgICB1bnNpZ25lZCBpbnQgb3AgPSAoKGkudHlwZXNbMF0gJiBBbnlNZW0pCisJCQkJICAgICAgID8gMAorCQkJCSAgICAgICA6IChpLnR5cGVzWzFdICYgQW55TWVtKSA/IDEgOiAyKTsKKworCQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7CisKKwkJICAgIGlmICghIGkuYmFzZV9yZWcpCisJCSAgICAgIHsKKwkJCWkucm0ubW9kZSA9IDA7CisJCQlpZiAoISBpLmRpc3Bfb3BlcmFuZHMpCisJCQkgIGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOworCQkJaWYgKCEgaS5pbmRleF9yZWcpCisJCQkgIHsKKwkJCSAgICAvKiBPcGVyYW5kIGlzIGp1c3QgPGRpc3A+ICovCisJCQkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCisJCQkgICAgICB7CisJCQkJaS5ybS5yZWdtZW0gPSBOT19CQVNFX1JFR0lTVEVSXzE2OworCQkJCWkudHlwZXNbb3BdICY9IH5EaXNwOworCQkJCWkudHlwZXNbb3BdIHw9IERpc3AxNjsKKwkJCSAgICAgIH0KKwkJCSAgICBlbHNlCisJCQkgICAgICB7CisJCQkJaS5ybS5yZWdtZW0gPSBOT19CQVNFX1JFR0lTVEVSOworCQkJCWkudHlwZXNbb3BdICY9IH5EaXNwOworCQkJCWkudHlwZXNbb3BdIHw9IERpc3AzMjsKKwkJCSAgICAgIH0KKwkJCSAgfQorCQkJZWxzZSAvKiAhIGkuYmFzZV9yZWcgJiYgaS5pbmRleF9yZWcgKi8KKwkJCSAgeworCQkJICAgIGkuc2liLmluZGV4ID0gaS5pbmRleF9yZWctPnJlZ19udW07CisJCQkgICAgaS5zaWIuYmFzZSA9IE5PX0JBU0VfUkVHSVNURVI7CisJCQkgICAgaS5zaWIuc2NhbGUgPSBpLmxvZzJfc2NhbGVfZmFjdG9yOworCQkJICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7CisJCQkgICAgaS50eXBlc1tvcF0gJj0gfkRpc3A7CisJCQkgICAgaS50eXBlc1tvcF0gfD0gRGlzcDMyOwkvKiBNdXN0IGJlIDMyIGJpdCAqLworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMTYpCisJCSAgICAgIHsKKwkJCXN3aXRjaCAoaS5iYXNlX3JlZy0+cmVnX251bSkKKwkJCSAgeworCQkJICBjYXNlIDM6IC8qICglYngpICovCisJCQkgICAgaWYgKCEgaS5pbmRleF9yZWcpCisJCQkgICAgICBpLnJtLnJlZ21lbSA9IDc7CisJCQkgICAgZWxzZSAvKiAoJWJ4LCVzaSkgLT4gMCwgb3IgKCVieCwlZGkpIC0+IDEgKi8KKwkJCSAgICAgIGkucm0ucmVnbWVtID0gaS5pbmRleF9yZWctPnJlZ19udW0gLSA2OworCQkJICAgIGJyZWFrOworCQkJICBjYXNlIDU6IC8qICglYnApICovCisJCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7CisJCQkgICAgaWYgKCEgaS5pbmRleF9yZWcpCisJCQkgICAgICB7CisJCQkJaS5ybS5yZWdtZW0gPSA2OworCQkJCWlmICgoaS50eXBlc1tvcF0gJiBEaXNwKSA9PSAwKQorCQkJCSAgeworCQkJCSAgICAvKiBmYWtlICglYnApIGludG8gMCglYnApICovCisJCQkJICAgIGkudHlwZXNbb3BdIHw9IERpc3A4OworCQkJCSAgICBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKKwkJCQkgIH0KKwkJCSAgICAgIH0KKwkJCSAgICBlbHNlIC8qICglYnAsJXNpKSAtPiAyLCBvciAoJWJwLCVkaSkgLT4gMyAqLworCQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLmluZGV4X3JlZy0+cmVnX251bSAtIDYgKyAyOworCQkJICAgIGJyZWFrOworCQkJICBkZWZhdWx0OiAvKiAoJXNpKSAtPiA0IG9yICglZGkpIC0+IDUgKi8KKwkJCSAgICBpLnJtLnJlZ21lbSA9IGkuYmFzZV9yZWctPnJlZ19udW0gLSA2ICsgNDsKKwkJCSAgfQorCQkJaS5ybS5tb2RlID0gbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAoaS50eXBlc1tvcF0pOworCQkgICAgICB9CisJCSAgICBlbHNlIC8qIGkuYmFzZV9yZWcgYW5kIDMyIGJpdCBtb2RlICovCisJCSAgICAgIHsKKwkJCWkucm0ucmVnbWVtID0gaS5iYXNlX3JlZy0+cmVnX251bTsKKwkJCWkuc2liLmJhc2UgPSBpLmJhc2VfcmVnLT5yZWdfbnVtOworCQkJaWYgKGkuYmFzZV9yZWctPnJlZ19udW0gPT0gRUJQX1JFR19OVU0pCisJCQkgIHsKKwkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKKwkJCSAgICBpZiAoaS5kaXNwX29wZXJhbmRzID09IDApCisJCQkgICAgICB7CisJCQkJZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7CisJCQkJaS50eXBlc1tvcF0gfD0gRGlzcDg7CisJCQkgICAgICB9CisJCQkgIH0KKwkJCWVsc2UgaWYgKGkuYmFzZV9yZWctPnJlZ19udW0gPT0gRVNQX1JFR19OVU0pCisJCQkgIHsKKwkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKKwkJCSAgfQorCQkJaS5zaWIuc2NhbGUgPSBpLmxvZzJfc2NhbGVfZmFjdG9yOworCQkJaWYgKCEgaS5pbmRleF9yZWcpCisJCQkgIHsKKwkJCSAgICAvKiA8ZGlzcD4oJWVzcCkgYmVjb21lcyB0d28gYnl0ZSBtb2RybQorCQkJICAgICAgIHdpdGggbm8gaW5kZXggcmVnaXN0ZXIuICBXZSd2ZSBhbHJlYWR5CisJCQkgICAgICAgc3RvcmVkIHRoZSBjb2RlIGZvciBlc3AgaW4gaS5ybS5yZWdtZW0KKwkJCSAgICAgICBpZS4gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcuICBBbnkKKwkJCSAgICAgICBiYXNlIHJlZ2lzdGVyIGJlc2lkZXMgJWVzcCB3aWxsIG5vdCB1c2UKKwkJCSAgICAgICB0aGUgZXh0cmEgbW9kcm0gYnl0ZS4gICovCisJCQkgICAgaS5zaWIuaW5kZXggPSBOT19JTkRFWF9SRUdJU1RFUjsKKyNpZiAhIFNDQUxFMV9XSEVOX05PX0lOREVYCisJCQkgICAgLyogQW5vdGhlciBjYXNlIHdoZXJlIHdlIGZvcmNlIHRoZSBzZWNvbmQKKwkJCSAgICAgICBtb2RybSBieXRlLiAgKi8KKwkJCSAgICBpZiAoaS5sb2cyX3NjYWxlX2ZhY3RvcikKKwkJCSAgICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7CisjZW5kaWYKKwkJCSAgfQorCQkJZWxzZQorCQkJICB7CisJCQkgICAgaS5zaWIuaW5kZXggPSBpLmluZGV4X3JlZy0+cmVnX251bTsKKwkJCSAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOworCQkJICB9CisJCQlpLnJtLm1vZGUgPSBtb2RlX2Zyb21fZGlzcF9zaXplIChpLnR5cGVzW29wXSk7CisJCSAgICAgIH0KKworCQkgICAgaWYgKGZha2VfemVyb19kaXNwbGFjZW1lbnQpCisJCSAgICAgIHsKKwkJCS8qIEZha2VzIGEgemVybyBkaXNwbGFjZW1lbnQgYXNzdW1pbmcgdGhhdCBpLnR5cGVzW29wXQorCQkJICAgaG9sZHMgdGhlIGNvcnJlY3QgZGlzcGxhY2VtZW50IHNpemUuICovCisJCQlleHAgPSAmZGlzcF9leHByZXNzaW9uc1tpLmRpc3Bfb3BlcmFuZHMrK107CisJCQlpLmRpc3BzW29wXSA9IGV4cDsKKwkJCWV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJCQlleHAtPlhfYWRkX251bWJlciA9IDA7CisJCQlleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7CisJCQlleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKKwkJICAgICAgfQorCQkgIH0KKworCQkvKiBGaWxsIGluIGkucm0ucmVnIG9yIGkucm0ucmVnbWVtIGZpZWxkIHdpdGggcmVnaXN0ZXIKKwkJICAgb3BlcmFuZCAoaWYgYW55KSBiYXNlZCBvbiBpLnRtLmV4dGVuc2lvbl9vcGNvZGUuCisJCSAgIEFnYWluLCB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gbWFrZSBzdXJlIHRoYXQKKwkJICAgc2VnbWVudC9jb250cm9sL2RlYnVnL3Rlc3QvTU1YIHJlZ2lzdGVycyBhcmUgY29kZWQKKwkJICAgaW50byB0aGUgaS5ybS5yZWcgZmllbGQuICovCisJCWlmIChpLnJlZ19vcGVyYW5kcykKKwkJICB7CisJCSAgICB1bnNpZ25lZCBpbnQgb3AgPQorCQkgICAgICAoKGkudHlwZXNbMF0KKwkJCSYgKFJlZyB8IFNSZWcyIHwgU1JlZzMgfCBDb250cm9sIHwgRGVidWcKKwkJCSAgIHwgVGVzdCB8IFJlZ01NWCkpCisJCSAgICAgICA/IDAKKwkJICAgICAgIDogKChpLnR5cGVzWzFdCisJCQkgICAmIChSZWcgfCBTUmVnMiB8IFNSZWczIHwgQ29udHJvbCB8IERlYnVnCisJCQkgICAgICB8IFRlc3QgfCBSZWdNTVgpKQorCQkJICA/IDEKKwkJCSAgOiAyKSk7CisJCSAgICAvKiBJZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gb3Bjb2RlIHRvIHB1dCBoZXJlLCB0aGUKKwkJICAgICAgIHJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIHB1dCBpbnRvIHRoZSByZWdtZW0gZmllbGQuICovCisJCSAgICBpZiAoaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCisJCSAgICAgIGkucm0ucmVnbWVtID0gaS5yZWdzW29wXS0+cmVnX251bTsKKwkJICAgIGVsc2UKKwkJICAgICAgaS5ybS5yZWcgPSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOworCisJCSAgICAvKiBOb3csIGlmIG5vIG1lbW9yeSBvcGVyYW5kIGhhcyBzZXQgaS5ybS5tb2RlID0gMCwgMSwgMgorCQkgICAgICAgd2UgbXVzdCBzZXQgaXQgdG8gMyB0byBpbmRpY2F0ZSB0aGlzIGlzIGEgcmVnaXN0ZXIKKwkJICAgICAgIG9wZXJhbmQgaW4gdGhlIHJlZ21lbSBmaWVsZC4gICovCisJCSAgICBpZiAoIWkubWVtX29wZXJhbmRzKQorCQkgICAgICBpLnJtLm1vZGUgPSAzOworCQkgIH0KKworCQkvKiBGaWxsIGluIGkucm0ucmVnIGZpZWxkIHdpdGggZXh0ZW5zaW9uIG9wY29kZSAoaWYgYW55KS4gKi8KKwkJaWYgKGkudG0uZXh0ZW5zaW9uX29wY29kZSAhPSBOb25lKQorCQkgIGkucm0ucmVnID0gaS50bS5leHRlbnNpb25fb3Bjb2RlOworCSAgICAgIH0KKwkgIH0KKwllbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChTZWcyU2hvcnRGb3JtIHwgU2VnM1Nob3J0Rm9ybSkpCisJICB7CisJICAgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IFBPUF9TRUdfU0hPUlQgJiYgaS5yZWdzWzBdLT5yZWdfbnVtID09IDEpCisJICAgICAgeworCQlhc19iYWQgKF8oInlvdSBjYW4ndCBgcG9wICUlY3MnIikpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IChpLnJlZ3NbMF0tPnJlZ19udW0gPDwgMyk7CisJICB9CisJZWxzZSBpZiAoKGkudG0uYmFzZV9vcGNvZGUgJiB+KER8VykpID09IE1PVl9BWF9ESVNQMzIpCisJICB7CisJICAgIGRlZmF1bHRfc2VnID0gJmRzOworCSAgfQorCWVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSAhPSAwKQorCSAgeworCSAgICAvKiBGb3IgdGhlIHN0cmluZyBpbnN0cnVjdGlvbnMgdGhhdCBhbGxvdyBhIHNlZ21lbnQgb3ZlcnJpZGUKKwkgICAgICAgb24gb25lIG9mIHRoZWlyIG9wZXJhbmRzLCB0aGUgZGVmYXVsdCBzZWdtZW50IGlzIGRzLiAgKi8KKwkgICAgZGVmYXVsdF9zZWcgPSAmZHM7CisJICB9CisKKwkvKiBJZiBhIHNlZ21lbnQgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLAorCSAgIGFuZCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgaXMgbm90IHRoZSBkZWZhdWx0LAorCSAgIHVzZSBhbiBvcGNvZGUgcHJlZml4IHRvIHNlbGVjdCBpdC4KKwkgICBJZiB3ZSBuZXZlciBmaWd1cmVkIG91dCB3aGF0IHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMsCisJICAgdGhlbiBkZWZhdWx0X3NlZyB3aWxsIGJlIHplcm8gYXQgdGhpcyBwb2ludCwKKwkgICBhbmQgdGhlIHNwZWNpZmllZCBzZWdtZW50IHByZWZpeCB3aWxsIGFsd2F5cyBiZSB1c2VkLiAgKi8KKwlpZiAoKGkuc2VnWzBdKSAmJiAoaS5zZWdbMF0gIT0gZGVmYXVsdF9zZWcpKQorCSAgeworCSAgICBpZiAoISBhZGRfcHJlZml4IChpLnNlZ1swXS0+c2VnX3ByZWZpeCkpCisJICAgICAgcmV0dXJuOworCSAgfQorICAgICAgfQorICAgIGVsc2UgaWYgKChpLnRtLm9wY29kZV9tb2RpZmllciAmIFVnaCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAvKiBVbml4V2FyZSBmc3ViIG5vIGFyZ3MgaXMgYWxpYXMgZm9yIGZzdWJwLCBmYWRkIC0+IGZhZGRwLCBldGMgKi8KKyAgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyB0byBgJXNwJyIpLCBpLnRtLm5hbWUpOworICAgICAgfQorICB9CisKKyAgLyogSGFuZGxlIGNvbnZlcnNpb24gb2YgJ2ludCAkMycgLS0+IHNwZWNpYWwgaW50MyBpbnNuLiAqLworICBpZiAoaS50bS5iYXNlX29wY29kZSA9PSBJTlRfT1BDT0RFICYmIGkuaW1tc1swXS0+WF9hZGRfbnVtYmVyID09IDMpCisgICAgeworICAgICAgaS50bS5iYXNlX29wY29kZSA9IElOVDNfT1BDT0RFOworICAgICAgaS5pbW1fb3BlcmFuZHMgPSAwOworICAgIH0KKworICAvKiBXZSBhcmUgcmVhZHkgdG8gb3V0cHV0IHRoZSBpbnNuLiAqLworICB7CisgICAgcmVnaXN0ZXIgY2hhciAqcDsKKworICAgIC8qIE91dHB1dCBqdW1wcy4gKi8KKyAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wKQorICAgICAgeworCWxvbmcgbiA9IChsb25nKSBpLmRpc3BzWzBdLT5YX2FkZF9udW1iZXI7CisJaW50IHByZWZpeCA9IChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCk7CisJaW50IGNvZGUxNiA9IDA7CisKKwlpZiAocHJlZml4KQorCSAgeworCSAgICBpLnByZWZpeGVzIC09IDE7CisJICAgIGNvZGUxNiA9IENPREUxNjsKKwkgIH0KKwlpZiAoZmxhZ18xNmJpdF9jb2RlKQorCSAgY29kZTE2IF49IENPREUxNjsKKworCWlmICghaW50ZWxfc3ludGF4ICYmIChpLnByZWZpeGVzICE9IDApKQorCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKKworCWlmIChpLmRpc3BzWzBdLT5YX29wID09IE9fY29uc3RhbnQpCisJICB7CisJICAgIGlmIChmaXRzX2luX3NpZ25lZF9ieXRlIChuKSkKKwkgICAgICB7CisJCWluc25fc2l6ZSArPSAyOworCQlwID0gZnJhZ19tb3JlICgyKTsKKwkJcFswXSA9IGkudG0uYmFzZV9vcGNvZGU7CisJCXBbMV0gPSBuOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkgICAgICAgIC8qIFVzZSAxNi1iaXQganVtcHMgb25seSBmb3IgMTYtYml0IGNvZGUsCisJCSAgIGJlY2F1c2UgdGV4dCBzZWdtZW50cyBhcmUgbGltaXRlZCB0byA2NEsgYW55d2F5OworCSAgICAgICAgICAgVXNlIDMyLWJpdCBqdW1wcyBmb3IgMzItYml0IGNvZGUsIGJlY2F1c2UgdGhleSdyZSBmYXN0ZXIsCisJCSAgIGFuZCBhIDE2LWJpdCBqdW1wIHdpbGwgY2xlYXIgdGhlIHRvcCAxNiBiaXRzIG9mICVlaXAuICAqLworCQlpbnQgam1wX3NpemUgPSBjb2RlMTYgPyAyIDogNDsKKwkgICAgICAJaWYgKGNvZGUxNiAmJiAhZml0c19pbl9zaWduZWRfd29yZCAobikpCisJCSAgeworCQkgICAgYXNfYmFkIChfKCIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiKSk7CisJCSAgICByZXR1cm47CisJCSAgfQorCisJCWlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IEpVTVBfUENfUkVMQVRJVkUpCisJCSAgewkJLyogcGFjZSAqLworCQkgICAgLyogdW5jb25kaXRpb25hbCBqdW1wICovCisJCSAgICBpbnNuX3NpemUgKz0gcHJlZml4ICsgMSArIGptcF9zaXplOworCQkgICAgcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMSArIGptcF9zaXplKTsKKwkJICAgIGlmIChwcmVmaXgpCisJCSAgICAgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7CisJCSAgICAqcCsrID0gKGNoYXIpIDB4ZTk7CisJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIGptcF9zaXplKTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICAvKiBjb25kaXRpb25hbCBqdW1wICovCisJCSAgICBpbnNuX3NpemUgKz0gcHJlZml4ICsgMiArIGptcF9zaXplOworCQkgICAgcCA9IGZyYWdfbW9yZSAocHJlZml4ICsgMiArIGptcF9zaXplKTsKKwkJICAgIGlmIChwcmVmaXgpCisJCSAgICAgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7CisJCSAgICAqcCsrID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKKwkJICAgICpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlICsgMHgxMDsKKwkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgam1wX3NpemUpOworCQkgIH0KKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICBpbnQgc2l6ZSA9IGNvZGUxNiA/IDIgOiA0OworCisJICAgIC8qIEl0J3MgYSBzeW1ib2w7IGVuZCBmcmFnICYgc2V0dXAgZm9yIHJlbGF4LgorCSAgICAgICBNYWtlIHN1cmUgdGhlcmUgYXJlIG1vcmUgdGhhbiA2IGNoYXJzIGxlZnQgaW4gdGhlIGN1cnJlbnQgZnJhZzsKKwkgICAgICAgaWYgbm90IHdlJ2xsIGhhdmUgdG8gc3RhcnQgYSBuZXcgb25lLiAqLworCSAgICBmcmFnX2dyb3cgKHByZWZpeCArIDEgKyAyICsgc2l6ZSk7CisJICAgIGluc25fc2l6ZSArPSAxICsgcHJlZml4OworCSAgICBwID0gZnJhZ19tb3JlICgxICsgcHJlZml4KTsKKwkgICAgaWYgKHByZWZpeCkKKwkgICAgICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOworCSAgICAqcCA9IGkudG0uYmFzZV9vcGNvZGU7CisJICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKKwkJICAgICAgcHJlZml4ICsgMiArIHNpemUsIC8qIDIgb3Bjb2RlL3ByZWZpeCArIGRpc3BsYWNlbWVudCAqLworCQkgICAgICAxLAorCQkgICAgICAoKHVuc2lnbmVkIGNoYXIpICpwID09IEpVTVBfUENfUkVMQVRJVkUKKwkJICAgICAgID8gRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgU01BTEwpIHwgY29kZTE2CisJCSAgICAgICA6IEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBTTUFMTCkgfCBjb2RlMTYpLAorCQkgICAgICBpLmRpc3BzWzBdLT5YX2FkZF9zeW1ib2wsCisJCSAgICAgIChvZmZzZXRUKSBuLCBwKTsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChKdW1wQnl0ZSB8IEp1bXBEd29yZCkpCisgICAgICB7CisJaW50IHNpemUgPSAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wQnl0ZSkgPyAxIDogNDsKKwlsb25nIG4gPSAobG9uZykgaS5kaXNwc1swXS0+WF9hZGRfbnVtYmVyOworCisJaWYgKHNpemUgPT0gMSkgLyogdGhlbiB0aGlzIGlzIGEgbG9vcCBvciBqZWN4eiB0eXBlIGluc3RydWN0aW9uICovCisJICB7CisJICAgIGlmIChpLnByZWZpeFtBRERSX1BSRUZJWF0pCisJICAgICAgeworCQlpbnNuX3NpemUgKz0gMTsKKwkJRlJBR19BUFBFTkRfMV9DSEFSIChBRERSX1BSRUZJWF9PUENPREUpOworCQlpLnByZWZpeGVzIC09IDE7CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaW50IGNvZGUxNiA9IDA7CisKKwkgICAgaWYgKGkucHJlZml4W0RBVEFfUFJFRklYXSkKKwkgICAgICB7CisJCWluc25fc2l6ZSArPSAxOworCQlGUkFHX0FQUEVORF8xX0NIQVIgKERBVEFfUFJFRklYX09QQ09ERSk7CisJCWkucHJlZml4ZXMgLT0gMTsKKwkJY29kZTE2ID0gQ09ERTE2OworCSAgICAgIH0KKwkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSkKKwkgICAgICBjb2RlMTYgXj0gQ09ERTE2OworCisJICAgIGlmIChjb2RlMTYpCisJICAgICAgc2l6ZSA9IDI7CisJICB9CisKKwlpZiAoIWludGVsX3N5bnRheCAmJiAoaS5wcmVmaXhlcyAhPSAwKSkKKwkgIGFzX3dhcm4gKF8oInNraXBwaW5nIHByZWZpeGVzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24iKSk7CisKKwlpZiAoZml0c19pbl91bnNpZ25lZF9ieXRlIChpLnRtLmJhc2Vfb3Bjb2RlKSkKKwkgIHsKKwkgICAgaW5zbl9zaXplICs9IDEgKyBzaXplOworCSAgICBwID0gZnJhZ19tb3JlICgxICsgc2l6ZSk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpbnNuX3NpemUgKz0gMiArIHNpemU7CS8qIG9wY29kZSBjYW4gYmUgYXQgbW9zdCB0d28gYnl0ZXMgKi8KKwkgICAgcCA9IGZyYWdfbW9yZSAoMiArIHNpemUpOworCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOworCSAgfQorCSpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjsKKworCWlmIChpLmRpc3BzWzBdLT5YX29wID09IE9fY29uc3RhbnQpCisJICB7CisJICAgIGlmIChzaXplID09IDEgJiYgIWZpdHNfaW5fc2lnbmVkX2J5dGUgKG4pKQorCSAgICAgIHsKKwkJYXNfYmFkIChfKCJgJXMnIG9ubHkgdGFrZXMgYnl0ZSBkaXNwbGFjZW1lbnQ7ICVsZCBzaG9ydGVuZWQgdG8gJWQiKSwKKwkJCWkudG0ubmFtZSwgbiwgKnApOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc2l6ZSA9PSAyICYmICFmaXRzX2luX3NpZ25lZF93b3JkIChuKSkKKwkgICAgICB7CisJCWFzX2JhZCAoXygiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIikpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIHNpemUpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCisJCQkgaS5kaXNwc1swXSwgMSwgcmVsb2MgKHNpemUsIDEsIGkuZGlzcF9yZWxvY1swXSkpOworCisJICB9CisgICAgICB9CisgICAgZWxzZSBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBKdW1wSW50ZXJTZWdtZW50KQorICAgICAgeworCWludCBzaXplOworCWludCByZWxvY190eXBlOworCWludCBwcmVmaXggPSBpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMDsKKwlpbnQgY29kZTE2ID0gMDsKKworCWlmIChwcmVmaXgpCisJICB7CisJICAgIGNvZGUxNiA9IENPREUxNjsKKwkgICAgaS5wcmVmaXhlcyAtPSAxOworCSAgfQorCWlmIChmbGFnXzE2Yml0X2NvZGUpCisJICBjb2RlMTYgXj0gQ09ERTE2OworCisJc2l6ZSA9IDQ7CisJcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKKwlpZiAoY29kZTE2KQorCSAgeworCSAgICBzaXplID0gMjsKKwkgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18xNjsKKwkgIH0KKworCWlmICghaW50ZWxfc3ludGF4ICYmIChpLnByZWZpeGVzICE9IDApKQorCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKKworCWluc25fc2l6ZSArPSBwcmVmaXggKyAxICsgMiArIHNpemU7ICAvKiAxIG9wY29kZTsgMiBzZWdtZW50OyBvZmZzZXQgKi8KKwlwID0gZnJhZ19tb3JlIChwcmVmaXggKyAxICsgMiArIHNpemUpOworCWlmIChwcmVmaXgpCisJICAqcCsrID0gREFUQV9QUkVGSVhfT1BDT0RFOworCSpwKysgPSBpLnRtLmJhc2Vfb3Bjb2RlOworCWlmIChpLmltbXNbMV0tPlhfb3AgPT0gT19jb25zdGFudCkKKwkgIHsKKwkgICAgbG9uZyBuID0gKGxvbmcpIGkuaW1tc1sxXS0+WF9hZGRfbnVtYmVyOworCisJICAgIGlmIChzaXplID09IDIgJiYgIWZpdHNfaW5fdW5zaWduZWRfd29yZCAobikpCisJICAgICAgeworCQlhc19iYWQgKF8oIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIpKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBuLCBzaXplKTsKKwkgIH0KKwllbHNlCisJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKKwkJICAgICAgIGkuaW1tc1sxXSwgMCwgcmVsb2NfdHlwZSk7CisJaWYgKGkuaW1tc1swXS0+WF9vcCAhPSBPX2NvbnN0YW50KQorCSAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIpLAorCQkgIGkudG0ubmFtZSk7CisJbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgc2l6ZSwgKHZhbHVlVCkgaS5pbW1zWzBdLT5YX2FkZF9udW1iZXIsIDIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwkvKiBPdXRwdXQgbm9ybWFsIGluc3RydWN0aW9ucyBoZXJlLiAqLworCXVuc2lnbmVkIGNoYXIgKnE7CisKKwkvKiBUaGUgcHJlZml4IGJ5dGVzLiAqLworCWZvciAocSA9IGkucHJlZml4OworCSAgICAgcSA8IGkucHJlZml4ICsgc2l6ZW9mIChpLnByZWZpeCkgLyBzaXplb2YgKGkucHJlZml4WzBdKTsKKwkgICAgIHErKykKKwkgIHsKKwkgICAgaWYgKCpxKQorCSAgICAgIHsKKwkJaW5zbl9zaXplICs9IDE7CisJCXAgPSBmcmFnX21vcmUgKDEpOworCQltZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpxLCAxKTsKKwkgICAgICB9CisJICB9CisKKwkvKiBOb3cgdGhlIG9wY29kZTsgYmUgY2FyZWZ1bCBhYm91dCB3b3JkIG9yZGVyIGhlcmUhICovCisJaWYgKGZpdHNfaW5fdW5zaWduZWRfYnl0ZSAoaS50bS5iYXNlX29wY29kZSkpCisJICB7CisJICAgIGluc25fc2l6ZSArPSAxOworCSAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGkudG0uYmFzZV9vcGNvZGUpOworCSAgfQorCWVsc2UgaWYgKGZpdHNfaW5fdW5zaWduZWRfd29yZCAoaS50bS5iYXNlX29wY29kZSkpCisJICB7CisJICAgIGluc25fc2l6ZSArPSAyOworCSAgICBwID0gZnJhZ19tb3JlICgyKTsKKwkgICAgLyogcHV0IG91dCBoaWdoIGJ5dGUgZmlyc3Q6IGNhbid0IHVzZSBtZF9udW1iZXJfdG9fY2hhcnMhICovCisJICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiA4KSAmIDB4ZmY7CisJICAgICpwID0gaS50bS5iYXNlX29wY29kZSAmIDB4ZmY7CisJICB9CisJZWxzZQorCSAgewkJCS8qIG9wY29kZSBpcyBlaXRoZXIgMyBvciA0IGJ5dGVzICovCisJICAgIGlmIChpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjAwMDAwMCkKKwkgICAgICB7CisJCWluc25fc2l6ZSArPSA0OworCQlwID0gZnJhZ19tb3JlICg0KTsKKwkJKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDI0KSAmIDB4ZmY7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlpbnNuX3NpemUgKz0gMzsKKwkJcCA9IGZyYWdfbW9yZSAoMyk7CisJICAgICAgfQorCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gMTYpICYgMHhmZjsKKwkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKKwkgICAgKnAgPSAoaS50bS5iYXNlX29wY29kZSkgJiAweGZmOworCSAgfQorCisJLyogTm93IHRoZSBtb2RybSBieXRlIGFuZCBzaWIgYnl0ZSAoaWYgcHJlc2VudCkuICAqLworCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIE1vZHJtKQorCSAgeworCSAgICBpbnNuX3NpemUgKz0gMTsKKwkgICAgcCA9IGZyYWdfbW9yZSAoMSk7CisJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKKwkJCQkodmFsdWVUKSAoaS5ybS5yZWdtZW0gPDwgMAorCQkJCQkgIHwgaS5ybS5yZWcgPDwgMworCQkJCQkgIHwgaS5ybS5tb2RlIDw8IDYpLAorCQkJCTEpOworCSAgICAvKiBJZiBpLnJtLnJlZ21lbSA9PSBFU1AgKDQpCisJICAgICAgICYmIGkucm0ubW9kZSAhPSAoUmVnaXN0ZXIgbW9kZSkKKwkgICAgICAgJiYgbm90IDE2IGJpdAorCSAgICAgICA9PT4gbmVlZCBzZWNvbmQgbW9kcm0gYnl0ZS4gICovCisJICAgIGlmIChpLnJtLnJlZ21lbSA9PSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORworCQkmJiBpLnJtLm1vZGUgIT0gMworCQkmJiAhKGkuYmFzZV9yZWcgJiYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMTYpICE9IDApKQorCSAgICAgIHsKKwkJaW5zbl9zaXplICs9IDE7CisJCXAgPSBmcmFnX21vcmUgKDEpOworCQltZF9udW1iZXJfdG9fY2hhcnMgKHAsCisJCQkJICAgICh2YWx1ZVQpIChpLnNpYi5iYXNlIDw8IDAKKwkJCQkJICAgICAgfCBpLnNpYi5pbmRleCA8PCAzCisJCQkJCSAgICAgIHwgaS5zaWIuc2NhbGUgPDwgNiksCisJCQkJICAgIDEpOworCSAgICAgIH0KKwkgIH0KKworCWlmIChpLmRpc3Bfb3BlcmFuZHMpCisJICB7CisJICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBuOworCisJICAgIGZvciAobiA9IDA7IG4gPCBpLm9wZXJhbmRzOyBuKyspCisJICAgICAgeworCQlpZiAoaS5kaXNwc1tuXSkKKwkJICB7CisJCSAgICBpZiAoaS5kaXNwc1tuXS0+WF9vcCA9PSBPX2NvbnN0YW50KQorCQkgICAgICB7CisJCQlpZiAoaS50eXBlc1tuXSAmIERpc3A4KQorCQkJICB7CisJCQkgICAgaW5zbl9zaXplICs9IDE7CisJCQkgICAgcCA9IGZyYWdfbW9yZSAoMSk7CisJCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAorCQkJCQkJKHZhbHVlVCkgaS5kaXNwc1tuXS0+WF9hZGRfbnVtYmVyLAorCQkJCQkJMSk7CisJCQkgIH0KKwkJCWVsc2UgaWYgKGkudHlwZXNbbl0gJiBEaXNwMTYpCisJCQkgIHsKKwkJCSAgICBpbnNuX3NpemUgKz0gMjsKKwkJCSAgICBwID0gZnJhZ19tb3JlICgyKTsKKwkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCisJCQkJCQkodmFsdWVUKSBpLmRpc3BzW25dLT5YX2FkZF9udW1iZXIsCisJCQkJCQkyKTsKKwkJCSAgfQorCQkJZWxzZQorCQkJICB7CS8qIERpc3AzMiAqLworCQkJICAgIGluc25fc2l6ZSArPSA0OworCQkJICAgIHAgPSBmcmFnX21vcmUgKDQpOworCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKKwkJCQkJCSh2YWx1ZVQpIGkuZGlzcHNbbl0tPlhfYWRkX251bWJlciwKKwkJCQkJCTQpOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKGkudHlwZXNbbl0gJiBEaXNwMzIpCisJCSAgICAgIHsKKwkJCWluc25fc2l6ZSArPSA0OworCQkJcCA9IGZyYWdfbW9yZSAoNCk7CisJCQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKKwkJCQkgICAgIGkuZGlzcHNbbl0sIDAsCisJCQkJICAgICBUQ19SRUxPQyAoaS5kaXNwX3JlbG9jW25dLCBCRkRfUkVMT0NfMzIpKTsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICB7IC8qIG11c3QgYmUgRGlzcDE2ICovCisJCQlpbnNuX3NpemUgKz0gMjsKKwkJCXAgPSBmcmFnX21vcmUgKDIpOworCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsCisJCQkJICAgICBpLmRpc3BzW25dLCAwLAorCQkJCSAgICAgVENfUkVMT0MgKGkuZGlzcF9yZWxvY1tuXSwgQkZEX1JFTE9DXzE2KSk7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgfQkJCS8qIGVuZCBkaXNwbGFjZW1lbnQgb3V0cHV0ICovCisKKwkvKiBvdXRwdXQgaW1tZWRpYXRlICovCisJaWYgKGkuaW1tX29wZXJhbmRzKQorCSAgeworCSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbjsKKworCSAgICBmb3IgKG4gPSAwOyBuIDwgaS5vcGVyYW5kczsgbisrKQorCSAgICAgIHsKKwkJaWYgKGkuaW1tc1tuXSkKKwkJICB7CisJCSAgICBpZiAoaS5pbW1zW25dLT5YX29wID09IE9fY29uc3RhbnQpCisJCSAgICAgIHsKKwkJCWlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UykpCisJCQkgIHsKKwkJCSAgICBpbnNuX3NpemUgKz0gMTsKKwkJCSAgICBwID0gZnJhZ19tb3JlICgxKTsKKwkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCisJCQkJCQkodmFsdWVUKSBpLmltbXNbbl0tPlhfYWRkX251bWJlciwKKwkJCQkJCTEpOworCQkJICB9CisJCQllbHNlIGlmIChpLnR5cGVzW25dICYgSW1tMTYpCisJCQkgIHsKKwkJCSAgICBpbnNuX3NpemUgKz0gMjsKKwkJCSAgICBwID0gZnJhZ19tb3JlICgyKTsKKwkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCisJCQkJCQkodmFsdWVUKSBpLmltbXNbbl0tPlhfYWRkX251bWJlciwKKwkJCQkJCTIpOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBpbnNuX3NpemUgKz0gNDsKKwkJCSAgICBwID0gZnJhZ19tb3JlICg0KTsKKwkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCisJCQkJCQkodmFsdWVUKSBpLmltbXNbbl0tPlhfYWRkX251bWJlciwKKwkJCQkJCTQpOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgewkJLyogbm90IGFic29sdXRlX3NlY3Rpb24gKi8KKwkJCS8qIE5lZWQgYSAzMi1iaXQgZml4dXAgKGRvbid0IHN1cHBvcnQgOGJpdAorCQkJICAgbm9uLWFic29sdXRlIGltcykuICBUcnkgdG8gc3VwcG9ydCBvdGhlcgorCQkJICAgc2l6ZXMgLi4uICovCisJCQlpbnQgcl90eXBlOworCQkJaW50IHNpemU7CisJCQlpbnQgcGNyZWwgPSAwOworCisJCQlpZiAoaS50eXBlc1tuXSAmIChJbW04IHwgSW1tOFMpKQorCQkJICBzaXplID0gMTsKKwkJCWVsc2UgaWYgKGkudHlwZXNbbl0gJiBJbW0xNikKKwkJCSAgc2l6ZSA9IDI7CisJCQllbHNlCisJCQkgIHNpemUgPSA0OworCQkJaW5zbl9zaXplICs9IHNpemU7CisJCQlwID0gZnJhZ19tb3JlIChzaXplKTsKKwkJCXJfdHlwZSA9IHJlbG9jIChzaXplLCAwLCBpLmRpc3BfcmVsb2NbMF0pOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKwkJCWlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzMyCisJCQkgICAgJiYgR09UX3N5bWJvbAorCQkJICAgICYmIEdPVF9zeW1ib2wgPT0gaS5pbW1zW25dLT5YX2FkZF9zeW1ib2wKKwkJCSAgICAmJiAoaS5pbW1zW25dLT5YX29wID09IE9fc3ltYm9sCisJCQkJfHwgKGkuaW1tc1tuXS0+WF9vcCA9PSBPX2FkZAorCQkJCSAgICAmJiAoaS5pbW1zW25dLT5YX29wX3N5bWJvbC0+c3lfdmFsdWUuWF9vcAorCQkJCQk9PSBPX3N1YnRyYWN0KSkpKQorCQkJICB7CisJCQkgICAgcl90eXBlID0gQkZEX1JFTE9DXzM4Nl9HT1RQQzsKKwkJCSAgICBpLmltbXNbbl0tPlhfYWRkX251bWJlciArPSAzOworCQkJICB9CisjZW5kaWYKKwkJCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAorCQkJCSAgICAgaS5pbW1zW25dLCBwY3JlbCwgcl90eXBlKTsKKwkJICAgICAgfQorCQkgIH0KKwkgICAgICB9CisJICB9CQkJLyogZW5kIGltbWVkaWF0ZSBvdXRwdXQgKi8KKyAgICAgIH0KKworI2lmZGVmIERFQlVHMzg2CisgICAgaWYgKGZsYWdfZGVidWcpCisgICAgICB7CisJcGkgKGxpbmUsICZpKTsKKyAgICAgIH0KKyNlbmRpZiAvKiBERUJVRzM4NiAqLworICB9Cit9CisMCitzdGF0aWMgaW50IGkzODZfaXNfcmVnIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgaW50CitpMzg2X2lzX3JlZyAocmVnX3N0cmluZykKKyAgICAgY2hhciAqcmVnX3N0cmluZzsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHJlZ19zdHJpbmc7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGNoYXIgcmVnX25hbWVfZ2l2ZW5bTUFYX1JFR19OQU1FX1NJWkUgKyAxXTsKKworICBpZiAoaXNfc3BhY2VfY2hhciAoKnMpKQorICAgICsrczsKKworICBwID0gcmVnX25hbWVfZ2l2ZW47CisgIHdoaWxlICgoKnArKyA9IHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcysrXSkgIT0gJ1wwJykKKyAgICBpZiAocCA+PSByZWdfbmFtZV9naXZlbiArIE1BWF9SRUdfTkFNRV9TSVpFKQorICAgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWdfbmFtZV9naXZlbikpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KKyAKK3N0YXRpYyBpbnQgaTM4Nl9pbW1lZGlhdGUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK2kzODZfaW1tZWRpYXRlIChpbW1fc3RhcnQpCisgICAgIGNoYXIgKmltbV9zdGFydDsKK3sKKyAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7CisgIHNlZ1QgZXhwX3NlZyA9IDA7CisgIGV4cHJlc3Npb25TICogZXhwOworCisgIGlmIChpLmltbV9vcGVyYW5kcyA9PSBNQVhfSU1NRURJQVRFX09QRVJBTkRTKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiT25seSAxIG9yIDIgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBhbGxvd2VkIikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGV4cCA9ICZpbV9leHByZXNzaW9uc1tpLmltbV9vcGVyYW5kcysrXTsKKyAgaS5pbW1zW3RoaXNfb3BlcmFuZF0gPSBleHA7CisKKyAgaWYgKGlzX3NwYWNlX2NoYXIgKCppbW1fc3RhcnQpKQorICAgICsraW1tX3N0YXJ0OworCisgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbW1fc3RhcnQ7CisKKyNpZm5kZWYgTEVYX0FUCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFdlIGNhbiBoYXZlIG9wZXJhbmRzIG9mIHRoZSBmb3JtCisgICAgICAgKiAgIDxzeW1ib2w+QEdPVE9GRis8bm5uPgorICAgICAgICogVGFrZSB0aGUgZWFzeSB3YXkgb3V0IGhlcmUgYW5kIGNvcHkgZXZlcnl0aGluZworICAgICAgICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4KKyAgICAgICAqLworICAgICAgcmVnaXN0ZXIgY2hhciAqY3A7CisKKyAgICAgIGNwID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdAJyk7CisgICAgICBpZiAoY3AgIT0gTlVMTCkKKyAgICAgICAgeworCSAgY2hhciAqdG1wYnVmOworCSAgaW50IGxlbiwgZmlyc3Q7CisKKwkgIC8qIEdPVCByZWxvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSAqLworCSAgaWYgKGZsYWdfMTZiaXRfY29kZSkKKwkgICAgYXNfYmFkIChfKCJHT1QgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSIpKTsKKworCSAgaWYgKEdPVF9zeW1ib2wgPT0gTlVMTCkKKwkgICAgR09UX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk7CisKKwkgIGlmIChzdHJuY21wIChjcCArIDEsICJQTFQiLCAzKSA9PSAwKQorCSAgICB7CisJICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X1BMVDMyOworCSAgICAgIGxlbiA9IDM7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVE9GRiIsIDYpID09IDApCisJICAgIHsKKwkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOworCSAgICAgIGxlbiA9IDY7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVCIsIDMpID09IDApCisJICAgIHsKKwkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UMzI7CisJICAgICAgbGVuID0gMzsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhc19iYWQgKF8oIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIpKTsKKworCSAgLyogUmVwbGFjZSB0aGUgcmVsb2NhdGlvbiB0b2tlbiB3aXRoICcgJywgc28gdGhhdCBlcnJvcnMgbGlrZQorCSAgICAgZm9vQEdPVE9GRjEgd2lsbCBiZSBkZXRlY3RlZC4gICovCisJICBmaXJzdCA9IGNwIC0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgdG1wYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4oaW5wdXRfbGluZV9wb2ludGVyKSk7CisJICBtZW1jcHkgKHRtcGJ1ZiwgaW5wdXRfbGluZV9wb2ludGVyLCBmaXJzdCk7CisJICB0bXBidWZbZmlyc3RdID0gJyAnOworCSAgc3RyY3B5ICh0bXBidWYgKyBmaXJzdCArIDEsIGNwICsgMSArIGxlbik7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBidWY7CisJfQorICAgIH0KKyNlbmRpZgorCisgIGV4cF9zZWcgPSBleHByZXNzaW9uIChleHApOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKQorICAgIGFzX2JhZCAoXygiSWdub3JpbmcganVuayBgJXMnIGFmdGVyIGV4cHJlc3Npb24iKSwgaW5wdXRfbGluZV9wb2ludGVyKTsKKworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBpZiAoZXhwLT5YX29wID09IE9fYWJzZW50KQorICAgIHsKKyAgICAgIC8qIG1pc3Npbmcgb3IgYmFkIGV4cHIgYmVjb21lcyBhYnNvbHV0ZSAwICovCisgICAgICBhc19iYWQgKF8oIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiKSwKKyAgICAgICAgICAgICAgaW1tX3N0YXJ0KTsKKyAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7CisgICAgICBleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7CisgICAgICBleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKKyAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBJbW07CisgICAgfQorICBlbHNlIGlmIChleHAtPlhfb3AgPT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0KKwlzbWFsbGVzdF9pbW1fdHlwZSAoKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKKyAgCisgICAgICAvKiBJZiBhIHN1ZmZpeCBpcyBnaXZlbiwgdGhpcyBvcGVyYW5kIG1heSBiZSBzaG9ydGVuZGVkLiAqLworICAgICAgc3dpdGNoIChpLnN1ZmZpeCkKKyAgICAgICAgeworICAgICAgICBjYXNlIFdPUkRfTU5FTV9TVUZGSVg6CisgICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEltbTE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJZVEVfTU5FTV9TVUZGSVg6CisgICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEltbTE2IHwgSW1tOCB8IEltbThTOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2lmZGVmIE9CSl9BT1VUCisgIGVsc2UgaWYgKGV4cF9zZWcgIT0gdGV4dF9zZWN0aW9uCisgICAgICAgICAgICYmIGV4cF9zZWcgIT0gZGF0YV9zZWN0aW9uCisgICAgICAgICAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KKyAgICAgICAgICAgJiYgZXhwX3NlZyAhPSB1bmRlZmluZWRfc2VjdGlvbgorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgICAgICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoZXhwX3NlZykKKyNlbmRpZgorICAgICAgICAgICkKKyAgICB7CisgICAgc2VnX3VuaW1wbGVtZW50ZWQ6CisgICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgc2VnbWVudCB0eXBlICVkIGluIG9wZXJhbmQiKSwgZXhwX3NlZyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgYW4gYWRkcmVzcy4gIFRoZSBzaXplIG9mIHRoZSBhZGRyZXNzIHdpbGwgYmUKKyAgICAgICAgIGRldGVybWluZWQgbGF0ZXIsIGRlcGVuZGluZyBvbiBkZXN0aW5hdGlvbiByZWdpc3RlciwKKyAgICAgICAgIHN1ZmZpeCwgb3IgdGhlIGRlZmF1bHQgZm9yIHRoZSBzZWN0aW9uLiAgV2UgZXhjbHVkZQorICAgICAgICAgSW1tOFMgaGVyZSBzbyB0aGF0IGBwdXNoICRmb28nIGFuZCBvdGhlciBpbnN0cnVjdGlvbnMKKyAgICAgICAgIHdpdGggYW4gSW1tOFMgZm9ybSB3aWxsIHVzZSBJbW0xNiBvciBJbW0zMi4gICovCisgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gKEltbTggfCBJbW0xNiB8IEltbTMyKTsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaTM4Nl9zY2FsZSBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIGludAoraTM4Nl9zY2FsZSAoc2NhbGUpCisgICAgIGNoYXIgKnNjYWxlOworeworICBpZiAoIWlzZGlnaXQgKCpzY2FsZSkpCisgICAgZ290byBiYWRfc2NhbGU7CisKKyAgc3dpdGNoICgqc2NhbGUpCisgICAgeworICAgIGNhc2UgJzAnOgorICAgIGNhc2UgJzEnOgorICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlICcyJzoKKyAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnNCc6CisgICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzgnOgorICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGJhZF9zY2FsZToKKyAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIHNjYWxlIGZhY3RvciBvZiAxLCAyLCA0LCBvciA4OiBnb3QgYCVzJyIpLAorICAgICAgICAgICAgICBzY2FsZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChpLmxvZzJfc2NhbGVfZmFjdG9yICE9IDAgJiYgISBpLmluZGV4X3JlZykKKyAgICB7CisgICAgICBhc193YXJuIChfKCJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIpLAorICAgICAgICAgICAgICAgMSA8PCBpLmxvZzJfc2NhbGVfZmFjdG9yKTsKKyNpZiBTQ0FMRTFfV0hFTl9OT19JTkRFWAorICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDA7CisjZW5kaWYKKyAgICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGkzODZfZGlzcGxhY2VtZW50IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK2kzODZfZGlzcGxhY2VtZW50IChkaXNwX3N0YXJ0LCBkaXNwX2VuZCkKKyAgICAgY2hhciAqZGlzcF9zdGFydDsKKyAgICAgY2hhciAqZGlzcF9lbmQ7Cit7CisgIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHA7CisgIHNlZ1QgZXhwX3NlZyA9IDA7CisgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOworICBpbnQgYmlnZGlzcCA9IERpc3AzMjsKKworICAvKiAgQWxsIG9mIHRoZSBwaWVjZXMgb2YgdGhlIGRpc3BsYWNlbWVudCBleHByZXNzaW9uIGFyZSBoYW5kbGVkIHRvZ2V0aGVyLiAqLworICBpZiAoaW50ZWxfc3ludGF4ICYmIGkuZGlzcF9vcGVyYW5kcyAhPSAwKQorICAgIHJldHVybiAxOworCisgIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQorICAgIGJpZ2Rpc3AgPSBEaXNwMTY7CisgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBiaWdkaXNwOworCisgIGV4cCA9ICZkaXNwX2V4cHJlc3Npb25zW2kuZGlzcF9vcGVyYW5kc107CisgIGkuZGlzcHNbdGhpc19vcGVyYW5kXSA9IGV4cDsKKyAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBOT19SRUxPQzsKKyAgaS5kaXNwX29wZXJhbmRzKys7CisgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBkaXNwX3N0YXJ0OworICBFTkRfU1RSSU5HX0FORF9TQVZFIChkaXNwX2VuZCk7CisKKyNpZm5kZWYgR0NDX0FTTV9PX0hBQ0sKKyNkZWZpbmUgR0NDX0FTTV9PX0hBQ0sgMAorI2VuZGlmCisjaWYgR0NDX0FTTV9PX0hBQ0sKKyAgRU5EX1NUUklOR19BTkRfU0FWRSAoZGlzcF9lbmQgKyAxKTsKKyAgaWYgKChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBCYXNlSW5kZXgpICE9IDAKKyAgICAgICAmJiBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZFstMV0gPT0gJysnKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaGFjayBpcyB0byBhdm9pZCBhIHdhcm5pbmcgd2hlbiB1c2luZyB0aGUgIm8iCisgICAgICAgICBjb25zdHJhaW50IHdpdGhpbiBnY2MgYXNtIHN0YXRlbWVudHMuCisgICAgICAgICBGb3IgaW5zdGFuY2U6CisKKyAgICAgICAgI2RlZmluZSBfc2V0X3Rzc2xkdF9kZXNjKG4sYWRkcixsaW1pdCx0eXBlKSBcCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICggXAorICAgICAgICAibW92dyAldzIsJTBcblx0IiBcCisgICAgICAgICJtb3Z3ICV3MSwyKyUwXG5cdCIgXAorICAgICAgICAicm9ybCAkMTYsJTFcblx0IiBcCisgICAgICAgICJtb3ZiICViMSw0KyUwXG5cdCIgXAorICAgICAgICAibW92YiAlNCw1KyUwXG5cdCIgXAorICAgICAgICAibW92YiAkMCw2KyUwXG5cdCIgXAorICAgICAgICAibW92YiAlaDEsNyslMFxuXHQiIFwKKyAgICAgICAgInJvcmwgJDE2LCUxIiBcCisgICAgICAgIDogIj1vIigqKG4pKSA6ICJxIiAoYWRkciksICJyaSIobGltaXQpLCAiaSIodHlwZSkpCisKKyAgICAgICAgVGhpcyB3b3JrcyBncmVhdCBleGNlcHQgdGhhdCB0aGUgb3V0cHV0IGFzc2VtYmxlciBlbmRzCisgICAgICAgIHVwIGxvb2tpbmcgYSBiaXQgd2VpcmQgaWYgaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgaXMKKyAgICAgICAgbm8gb2Zmc2V0LiAgWW91IGVuZCB1cCBwcm9kdWNpbmcgY29kZSB0aGF0IGxvb2tzIGxpa2U6CisKKyAgICAgICAgI0FQUAorICAgICAgICAgICAgICAgbW92dyAkMjM1LCglZWF4KQorICAgICAgICAgICAgICAgbW92dyAlZHgsMisoJWVheCkKKyAgICAgICAgICAgICAgIHJvcmwgJDE2LCVlZHgKKyAgICAgICAgICAgICAgIG1vdmIgJWRsLDQrKCVlYXgpCisgICAgICAgICAgICAgICBtb3ZiICQxMzcsNSsoJWVheCkKKyAgICAgICAgICAgICAgIG1vdmIgJDAsNisoJWVheCkKKyAgICAgICAgICAgICAgIG1vdmIgJWRoLDcrKCVlYXgpCisgICAgICAgICAgICAgICByb3JsICQxNiwlZWR4CisgICAgICAgICNOT19BUFAKKworICAgICAgICBTbyBoZXJlIHdlIHByb3ZpZGUgdGhlIG1pc3NpbmcgemVyby4KKyAgICAqLworCisgICAgKmRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gJzAnOworICAgIH0KKyNlbmRpZgorI2lmbmRlZiBMRVhfQVQKKyAgICB7CisgICAgICAvKgorICAgICAgICogV2UgY2FuIGhhdmUgb3BlcmFuZHMgb2YgdGhlIGZvcm0KKyAgICAgICAqICAgPHN5bWJvbD5AR09UT0ZGKzxubm4+CisgICAgICAgKiBUYWtlIHRoZSBlYXN5IHdheSBvdXQgaGVyZSBhbmQgY29weSBldmVyeXRoaW5nCisgICAgICAgKiBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4uLgorICAgICAgICovCisgICAgICByZWdpc3RlciBjaGFyICpjcDsKKworICAgICAgY3AgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJ0AnKTsKKyAgICAgIGlmIChjcCAhPSBOVUxMKQorICAgICAgICB7CisJICBjaGFyICp0bXBidWY7CisJICBpbnQgbGVuLCBmaXJzdDsKKworCSAvKiBHT1QgcmVsb2NhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUgKi8KKwkgaWYgKGZsYWdfMTZiaXRfY29kZSkKKwkgICBhc19iYWQgKF8oIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIikpOworCisJICBpZiAoR09UX3N5bWJvbCA9PSBOVUxMKQorCSAgICBHT1Rfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTsKKworCSAgaWYgKHN0cm5jbXAgKGNwICsgMSwgIlBMVCIsIDMpID09IDApCisJICAgIHsKKwkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfUExUMzI7CisJICAgICAgbGVuID0gMzsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UT0ZGIiwgNikgPT0gMCkKKwkgICAgeworCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1RPRkY7CisJICAgICAgbGVuID0gNjsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UIiwgMykgPT0gMCkKKwkgICAgeworCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1QzMjsKKwkgICAgICBsZW4gPSAzOworCSAgICB9CisJICBlbHNlCisJICAgIGFzX2JhZCAoXygiQmFkIHJlbG9jIHNwZWNpZmllciBpbiBleHByZXNzaW9uIikpOworCisJICAvKiBSZXBsYWNlIHRoZSByZWxvY2F0aW9uIHRva2VuIHdpdGggJyAnLCBzbyB0aGF0IGVycm9ycyBsaWtlCisJICAgICBmb29AR09UT0ZGMSB3aWxsIGJlIGRldGVjdGVkLiAgKi8KKwkgIGZpcnN0ID0gY3AgLSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICB0bXBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbihpbnB1dF9saW5lX3BvaW50ZXIpKTsKKwkgIG1lbWNweSAodG1wYnVmLCBpbnB1dF9saW5lX3BvaW50ZXIsIGZpcnN0KTsKKwkgIHRtcGJ1ZltmaXJzdF0gPSAnICc7CisJICBzdHJjcHkgKHRtcGJ1ZiArIGZpcnN0ICsgMSwgY3AgKyAxICsgbGVuKTsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcGJ1ZjsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICBleHBfc2VnID0gZXhwcmVzc2lvbiAoZXhwKTsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgICAvKiBXZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIHN5bWJvbCBpcyBpbgorICAgICAgIHRoZSBzeW1ib2wgdGFibGUuICBXZSB3aWxsIHVsdGltYXRlbHkgY2hhbmdlIHRoZSByZWxvY2F0aW9uCisgICAgICAgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiAqLworICAgIGlmIChpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9PSBCRkRfUkVMT0NfMzg2X0dPVE9GRikKKyAgICAgIHsKKyAgICAgICAgaWYgKFNfSVNfTE9DQUwoZXhwLT5YX2FkZF9zeW1ib2wpCisgICAgICAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChleHAtPlhfYWRkX3N5bWJvbCkgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCisgICAgICAgICAgc2VjdGlvbl9zeW1ib2woZXhwLT5YX2FkZF9zeW1ib2wtPmJzeW0tPnNlY3Rpb24pOworICAgICAgICBhc3NlcnQgKGV4cC0+WF9vcCA9PSBPX3N5bWJvbCk7CisgICAgICAgIGV4cC0+WF9vcCA9IE9fc3VidHJhY3Q7CisgICAgICAgIGV4cC0+WF9vcF9zeW1ib2wgPSBHT1Rfc3ltYm9sOworICAgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zMjsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKQorICAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcganVuayBgJXMnIGFmdGVyIGV4cHJlc3Npb24iKSwKKyAgICAgICAgICAgICAgIGlucHV0X2xpbmVfcG9pbnRlcik7CisjaWYgR0NDX0FTTV9PX0hBQ0sKKyAgICAgUkVTVE9SRV9FTkRfU1RSSU5HIChkaXNwX2VuZCArIDEpOworI2VuZGlmCisgICAgIFJFU1RPUkVfRU5EX1NUUklORyAoZGlzcF9lbmQpOworICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKKworICAgICBpZiAoZXhwLT5YX29wID09IE9fY29uc3RhbnQpCisgICAgICAgeworICAgICAgICAgaWYgKGZpdHNfaW5fc2lnbmVkX2J5dGUgKGV4cC0+WF9hZGRfbnVtYmVyKSkKKyAgICAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IERpc3A4OworICAgICAgIH0KKyNpZmRlZiBPQkpfQU9VVAorICAgICBlbHNlIGlmIChleHBfc2VnICE9IHRleHRfc2VjdGlvbgorICAgICAgICAgICAgICAmJiBleHBfc2VnICE9IGRhdGFfc2VjdGlvbgorICAgICAgICAgICAgICAmJiBleHBfc2VnICE9IGJzc19zZWN0aW9uCisgICAgICAgICAgICAgICYmIGV4cF9zZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFzX2JhZCAoXyAoIlVuaW1wbGVtZW50ZWQgc2VnbWVudCB0eXBlICVkIGluIG9wZXJhbmQiKSwgZXhwX3NlZyk7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorI2VuZGlmCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGkzODZfb3BlcmFuZF9tb2RpZmllciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKKworc3RhdGljIGludAoraTM4Nl9vcGVyYW5kX21vZGlmaWVyIChvcF9zdHJpbmcsIGdvdF9hX2Zsb2F0KQorICAgICBjaGFyICoqb3Bfc3RyaW5nOworICAgICBpbnQgZ290X2FfZmxvYXQ7Cit7CisgICAgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIkJZVEUgUFRSIiwgOCkpCisgICAgICB7CisgICAgICAgIGkuc3VmZml4ID0gQllURV9NTkVNX1NVRkZJWDsKKyAgICAgICAgKm9wX3N0cmluZyArPSA4OworICAgICAgICByZXR1cm4gQllURV9QVFI7CisKKyAgICAgIH0KKyAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJXT1JEIFBUUiIsIDgpKQorICAgICAgeworICAgICAgICBpLnN1ZmZpeCA9IFdPUkRfTU5FTV9TVUZGSVg7CisgICAgICAgICpvcF9zdHJpbmcgKz0gODsKKyAgICAgICAgcmV0dXJuIFdPUkRfUFRSOworICAgICAgfQorCisgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiRFdPUkQgUFRSIiwgOSkpCisgICAgICB7CisgICAgICAgIGlmIChnb3RfYV9mbG9hdCkKKyAgICAgICAgICBpLnN1ZmZpeCA9IFNIT1JUX01ORU1fU1VGRklYOworICAgICAgICBlbHNlCisgICAgICAgICAgaS5zdWZmaXggPSBEV09SRF9NTkVNX1NVRkZJWDsKKyAgICAgICAgKm9wX3N0cmluZyArPSA5OworICAgICAgICByZXR1cm4gRFdPUkRfUFRSOworICAgICAgfQorCisgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiUVdPUkQgUFRSIiwgOSkpCisgICAgICB7CisgICAgICAgIGkuc3VmZml4ID0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVg7CisgICAgICAgICpvcF9zdHJpbmcgKz0gOTsKKyAgICAgICAgcmV0dXJuIFFXT1JEX1BUUjsKKyAgICAgIH0KKworICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlhXT1JEIFBUUiIsIDkpKQorICAgICAgeworICAgICAgICBpLnN1ZmZpeCA9IExPTkdfRE9VQkxFX01ORU1fU1VGRklYOworICAgICAgICAqb3Bfc3RyaW5nICs9IDk7CisgICAgICAgIHJldHVybiBYV09SRF9QVFI7CisgICAgICB9CisKKyAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJTSE9SVCIsIDUpKQorICAgICAgeworICAgICAgICAqb3Bfc3RyaW5nICs9IDU7CisgICAgICAgIHJldHVybiBTSE9SVDsKKyAgICAgIH0KKworICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIk9GRlNFVCBGTEFUOiIsIDEyKSkKKyAgICAgIHsKKyAgICAgICAgKm9wX3N0cmluZyArPSAxMjsKKyAgICAgICAgcmV0dXJuIE9GRlNFVF9GTEFUOworICAgICAgfQorCisgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiRkxBVCIsIDQpKQorICAgICAgeworICAgICAgICAqb3Bfc3RyaW5nICs9IDQ7CisgICAgICAgIHJldHVybiBGTEFUOworICAgICAgfQorCisgICAgZWxzZSByZXR1cm4gTk9ORV9GT1VORDsKK30gCisKK3N0YXRpYyBjaGFyICogYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyBQQVJBTVMgKChpbnQsIGNoYXIgKikpOworCitzdGF0aWMgY2hhciAqCitidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nIChpbml0aWFsX2Rpc3AsIG9wX3N0cmluZykKKyAgICAgaW50IGluaXRpYWxfZGlzcDsKKyAgICAgY2hhciAqb3Bfc3RyaW5nOworeworICBjaGFyICp0ZW1wX3N0cmluZyA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChvcF9zdHJpbmcpICsgMSk7CisgIGNoYXIgKmVuZF9vZl9vcGVyYW5kX3N0cmluZzsKKyAgY2hhciAqdGM7CisgIGNoYXIgKnRlbXBfZGlzcDsKKworICB0ZW1wX3N0cmluZ1swXSA9ICdcMCc7CisgIHRjID0gZW5kX29mX29wZXJhbmRfc3RyaW5nID0gc3RyY2hyIChvcF9zdHJpbmcsICdbJyk7CisgIGlmICggaW5pdGlhbF9kaXNwICYmICFlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpCisgICAgeworICAgICAgc3RyY3B5ICh0ZW1wX3N0cmluZywgb3Bfc3RyaW5nKTsKKyAgICAgIHJldHVybiAodGVtcF9zdHJpbmcpOworICAgIH0KKworICAvKiBCdWlsZCB0aGUgd2hvbGUgZGlzcGxhY2VtZW50IHN0cmluZyAqLworICBpZiAoaW5pdGlhbF9kaXNwKQorICAgIHsKKyAgICAgIHN0cm5jcHkgKHRlbXBfc3RyaW5nLCBvcF9zdHJpbmcsIGVuZF9vZl9vcGVyYW5kX3N0cmluZyAtIG9wX3N0cmluZyk7CisgICAgICB0ZW1wX3N0cmluZ1tlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgLSBvcF9zdHJpbmddID0gJ1wwJzsKKyAgICAgIHRlbXBfZGlzcCA9IHRjOworICAgIH0KKyAgZWxzZSAKKyAgICB0ZW1wX2Rpc3AgPSBvcF9zdHJpbmc7CisKKyAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ1wwJykKKyAgICB7CisgICAgICBpbnQgYWRkX21pbnVzID0gKCp0ZW1wX2Rpc3AgPT0gJy0nKTsKKworICAgICAgaWYgKCp0ZW1wX2Rpc3AgPT0gJysnIHx8ICp0ZW1wX2Rpc3AgPT0gJy0nIHx8ICp0ZW1wX2Rpc3AgPT0gJ1snKQorICAgICAgICB0ZW1wX2Rpc3ArKzsKKworICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCp0ZW1wX2Rpc3ApKQorICAgICAgICB0ZW1wX2Rpc3ArKzsKKworICAgICAgLyogRG9uJ3QgY29uc2lkZXIgcmVnaXN0ZXJzICovCisgICAgICBpZiAoKnRlbXBfZGlzcCAhPSBSRUdJU1RFUl9QUkVGSVgKKyAgICAgICAgICAmJiAhKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAodGVtcF9kaXNwKSkpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpzdHJpbmdfc3RhcnQgPSB0ZW1wX2Rpc3A7CisKKyAgICAgICAgICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXScKKyAgICAgICAgICAgICAgICAgJiYgKnRlbXBfZGlzcCAhPSAnKycKKyAgICAgICAgICAgICAgICAgJiYgKnRlbXBfZGlzcCAhPSAnLScKKyAgICAgICAgICAgICAgICAgJiYgKnRlbXBfZGlzcCAhPSAnKicpCisgICAgICAgICAgICArK3RlbXBfZGlzcDsKKworICAgICAgICAgIGlmIChhZGRfbWludXMpCisgICAgICAgICAgICBzdHJjYXQgKHRlbXBfc3RyaW5nLCAiLSIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmNhdCAodGVtcF9zdHJpbmcsICIrIik7CisKKyAgICAgICAgICBzdHJuY2F0ICh0ZW1wX3N0cmluZywgc3RyaW5nX3N0YXJ0LCB0ZW1wX2Rpc3AgLSBzdHJpbmdfc3RhcnQpOworICAgICAgICAgIGlmICgqdGVtcF9kaXNwID09ICcrJyB8fCAqdGVtcF9kaXNwID09ICctJykKKyAgICAgICAgICAgIC0tdGVtcF9kaXNwOworICAgICAgICB9CisKKyAgICAgIHdoaWxlICgqdGVtcF9kaXNwICE9ICdcMCcKKyAgICAgICAgICAgICAmJiAqdGVtcF9kaXNwICE9ICcrJworICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJy0nKQorICAgICAgICArK3RlbXBfZGlzcDsKKyAgICB9CisKKyAgcmV0dXJuIHRlbXBfc3RyaW5nOworfQorCitzdGF0aWMgaW50IGkzODZfcGFyc2Vfc2VnIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgaW50CitpMzg2X3BhcnNlX3NlZyAob3Bfc3RyaW5nKQorICAgICBjaGFyICpvcF9zdHJpbmc7Cit7CisgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKKyAgICArK29wX3N0cmluZzsKKworICAvKiBTaG91bGQgYmUgb25lIG9mIGVzLCBjcywgc3MsIGRzIGZzIG9yIGdzICovCisgIHN3aXRjaCAoKm9wX3N0cmluZysrKQorICAgIHsKKyAgICBjYXNlICdlJzoKKyAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZlczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZkczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZyc6CisgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoKm9wX3N0cmluZysrICE9ICdzJykKKyAgICB7CisgICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQorICAgICsrb3Bfc3RyaW5nOworCisgIGlmICgqb3Bfc3RyaW5nICE9ICc6JykKKyAgICB7CisgICAgICAgYXNfYmFkIChfKCJiYWQgc2VnbWVudCBuYW1lIGAlcyciKSwgb3Bfc3RyaW5nKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7IAorICAKK30KKworc3RhdGljIGludCBpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgaW50CitpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kIChvcF9zdHJpbmcpCisgICAgIGNoYXIgKm9wX3N0cmluZzsKK3sKKworICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7CisKKyAgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCisgICAgICAmJiBzdHJjaHIgKG9wX3N0cmluZywgJ1snKSA9PSAwKQorICAgIHsKKyAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogTG9vayBmb3IgZGlzcGxhY2VtZW50IHByZWNlZGluZyBvcGVuIGJyYWNrZXQgKi8KKyAgaWYgKCpvcF9zdHJpbmcgIT0gJ1snKQorICAgIHsKKyAgICAgIGNoYXIgKmVuZF9zZWc7CisgICAgICBjaGFyICp0ZW1wX3N0cmluZzsKKworICAgICAgZW5kX3NlZyA9IHN0cmNociAob3Bfc3RyaW5nLCAnOicpOworICAgICAgaWYgKGVuZF9zZWcpCisgICAgICAgIHsKKyAgICAgICAgICAgaWYgKCFpMzg2X3BhcnNlX3NlZyAob3Bfc3RyaW5nKSkKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgb3Bfc3RyaW5nID0gZW5kX3NlZyArIDE7CisgICAgICAgIH0KKworICAgICAgdGVtcF9zdHJpbmcgPSBidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nICh0cnVlLCBvcF9zdHJpbmcpOworICAgICAgaWYgKCFpMzg2X2Rpc3BsYWNlbWVudCAodGVtcF9zdHJpbmcsIHRlbXBfc3RyaW5nICsgc3RybGVuICh0ZW1wX3N0cmluZykpKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gc3RyY2hyIChvcF9zdHJpbmcsICdbJyk7CisgICAgICBpZiAoIWVuZF9vZl9vcGVyYW5kX3N0cmluZykKKyAgICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nICsgc3RybGVuIChvcF9zdHJpbmcpOworCisgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZykpCisgICAgICAgIC0tZW5kX29mX29wZXJhbmRfc3RyaW5nOworCisgICAgICBvcF9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7CisgICAgIH0KKworICBpZiAoKm9wX3N0cmluZyA9PSAnWycpCisgICAgeworICAgICAgKytvcF9zdHJpbmc7CisKKyAgICAgIC8qIFBpY2sgb2ZmIGVhY2ggY29tcG9uZW50IGFuZCBmaWd1cmUgb3V0IHdoZXJlIGl0IGJlbG9uZ3MgKi8KKworICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nOworCisgICAgICB3aGlsZSAoKm9wX3N0cmluZyAhPSAnXScpCisgICAgICAgIHsKKworICAgICAgICAgIHdoaWxlICgqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcrJworICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICctJworICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcqJworICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICddJykKKyAgICAgICAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZysrOworCisgICAgICAgICAgaWYgKCpvcF9zdHJpbmcgPT0gJysnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICp0ZW1wX3N0cmluZyA9IG9wX3N0cmluZyArIDE7CisgICAgICAgICAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqdGVtcF9zdHJpbmcpKQorICAgICAgICAgICAgICAgICsrdGVtcF9zdHJpbmc7CisgICAgICAgICAgICAgIGlmICgqdGVtcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCisgICAgICAgICAgICAgICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnICh0ZW1wX3N0cmluZykpKQorICAgICAgICAgICAgICAgICsrb3Bfc3RyaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCisgICAgICAgICAgICAgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKG9wX3N0cmluZykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCByZWdfZW50cnkgKnRlbXBfcmVnOworICAgICAgICAgICAgICBjaGFyICplbmRfb3A7CisKKyAgICAgICAgICAgICAgRU5EX1NUUklOR19BTkRfU0FWRSAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKKyAgICAgICAgICAgICAgdGVtcF9yZWcgPSBwYXJzZV9yZWdpc3RlciAob3Bfc3RyaW5nLCAmZW5kX29wKTsKKyAgICAgICAgICAgICAgUkVTVE9SRV9FTkRfU1RSSU5HIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOworCisgICAgICAgICAgICAgIGlmICh0ZW1wX3JlZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgIGlmIChpLmJhc2VfcmVnID09IE5VTEwpCisgICAgICAgICAgICAgICAgaS5iYXNlX3JlZyA9IHRlbXBfcmVnOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaS5pbmRleF9yZWcgPSB0ZW1wX3JlZzsKKworICAgICAgICAgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gQmFzZUluZGV4OworCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykgfHwgKm9wX3N0cmluZyA9PSAnKycgfHwgKm9wX3N0cmluZyA9PSAnLScpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgY2hhciAqdGVtcF9zdHJpbmcgPSBidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nIChmYWxzZSwgb3Bfc3RyaW5nKTsKKworICAgICAgICAgICAgICBpZiAoKnRlbXBfc3RyaW5nID09ICcrJykKKyAgICAgICAgICAgICAgICArK3RlbXBfc3RyaW5nOworCisgICAgICAgICAgICAgIGlmICghaTM4Nl9kaXNwbGFjZW1lbnQgKHRlbXBfc3RyaW5nLCB0ZW1wX3N0cmluZyArIHN0cmxlbiAodGVtcF9zdHJpbmcpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgKytvcF9zdHJpbmc7CisgICAgICAgICAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZzsKKyAgICAgICAgICAgICAgd2hpbGUgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJ10nCisgICAgICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICcrJworICAgICAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnLScKKyAgICAgICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJyonKQorICAgICAgICAgICAgICAgKytlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSAnKicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICsrb3Bfc3RyaW5nOworCisgICAgICAgICAgICAgIGlmIChpLmJhc2VfcmVnICYmICFpLmluZGV4X3JlZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpLmluZGV4X3JlZyA9IGkuYmFzZV9yZWc7CisgICAgICAgICAgICAgICAgICBpLmJhc2VfcmVnID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFpMzg2X3NjYWxlIChvcF9zdHJpbmcpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgIG9wX3N0cmluZyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZzsKKyAgICAgICAgICArK2VuZF9vZl9vcGVyYW5kX3N0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpMzg2X2ludGVsX29wZXJhbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIGludAoraTM4Nl9pbnRlbF9vcGVyYW5kIChvcGVyYW5kX3N0cmluZywgZ290X2FfZmxvYXQpCisgICAgIGNoYXIgKm9wZXJhbmRfc3RyaW5nOworICAgICBpbnQgZ290X2FfZmxvYXQ7Cit7CisgIGNoYXIgKm9wX3N0cmluZyA9IG9wZXJhbmRfc3RyaW5nOworCisgIGludCBvcGVyYW5kX21vZGlmaWVyID0gaTM4Nl9vcGVyYW5kX21vZGlmaWVyICgmb3Bfc3RyaW5nLCBnb3RfYV9mbG9hdCk7CisgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKKyAgICArK29wX3N0cmluZzsKKworICBzd2l0Y2ggKG9wZXJhbmRfbW9kaWZpZXIpCisgICAgeworICAgIGNhc2UgQllURV9QVFI6CisgICAgY2FzZSBXT1JEX1BUUjoKKyAgICBjYXNlIERXT1JEX1BUUjoKKyAgICBjYXNlIFFXT1JEX1BUUjoKKyAgICBjYXNlIFhXT1JEX1BUUjoKKyAgICAgIGlmICgoaS5tZW1fb3BlcmFuZHMgPT0gMQorICAgICAgICAgICAmJiAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgPT0gMCkKKyAgICAgICAgICB8fCBpLm1lbV9vcGVyYW5kcyA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgYXNfYmFkIChfKCJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIpLAorICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICBpZiAoIWkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgKG9wX3N0cmluZykpCisgICAgICAgIHJldHVybiAwOworCisgICAgICBpLm1lbV9vcGVyYW5kcysrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZMQVQ6CisKKyAgICBjYXNlIE9GRlNFVF9GTEFUOgorICAgICAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU0hPUlQ6CisKKyAgICBjYXNlIE5PTkVfRk9VTkQ6CisgICAgLyogU2hvdWxkIGJlIHJlZ2lzdGVyIG9yIGltbWVkaWF0ZSAqLworICAgIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQorICAgICAgICAmJiBzdHJjaHIgKG9wX3N0cmluZywgJ1snKSA9PSAwKQorICAgICAgeworICAgICAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgZWxzZSBpZiAoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKKyAgICAgICAgICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnCisJICAgICAgICAgJiYgaTM4Nl9pc19yZWcgKG9wX3N0cmluZykpKQorICAgICAgeworCisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHJlZ19lbnRyeSAqIHI7CisgICAgICAgIGNoYXIgKmVuZF9vcDsKKworICAgICAgICByID0gcGFyc2VfcmVnaXN0ZXIgKG9wX3N0cmluZywgJmVuZF9vcCk7CisgICAgICAgIGlmIChyID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIGEgc2VnbWVudCBvdmVycmlkZSBieSBzZWFyY2hpbmcgZm9yICc6JyBhZnRlciBhCisgICAgICAgICAgIHNlZ21lbnQgcmVnaXN0ZXIuICAqLworICAgICAgICBvcF9zdHJpbmcgPSBlbmRfb3A7CisgICAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKKyAgICAgICAgICArK29wX3N0cmluZzsKKyAgICAgICAgaWYgKCpvcF9zdHJpbmcgPT0gJzonICYmIChyLT5yZWdfdHlwZSAmIChTUmVnMiB8IFNSZWczKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChyLT5yZWdfbnVtKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmY3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZHM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZnM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZ3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgIH0KKyAgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IHItPnJlZ190eXBlICYgfkJhc2VJbmRleDsKKyAgICAgICAgaS5yZWdzW3RoaXNfb3BlcmFuZF0gPSByOworICAgICAgICBpLnJlZ19vcGVyYW5kcysrOworICAgICAgfQorCisgICAgZWxzZSAKKyAgICAgIHsKKworICAgICAgICBpZiAoIWkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgKG9wX3N0cmluZykpCisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaS5tZW1fb3BlcmFuZHMrKzsKKyAgICAgIH0KKyAgICBicmVhazsKKworICB9ICAvKiBlbmQgc3dpdGNoICovCisgIC8qIFNwZWNpYWwgY2FzZSBmb3IgKCVkeCkgd2hpbGUgZG9pbmcgaW5wdXQvb3V0cHV0IG9wLiAgKi8KKyAgaWYgKGkuYmFzZV9yZWcKKyAgICAgICYmIGkuYmFzZV9yZWctPnJlZ190eXBlID09IChSZWcxNiB8IEluT3V0UG9ydFJlZykKKyAgICAgICYmIGkuaW5kZXhfcmVnID09IDAKKyAgICAgICYmIGkubG9nMl9zY2FsZV9mYWN0b3IgPT0gMAorICAgICAgJiYgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID09IDAKKyAgICAgICYmIChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBEaXNwKSA9PSAwKQorICAgICB7CisgICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdID0gSW5PdXRQb3J0UmVnOworICAgICAgIHJldHVybiAxOworICAgICB9CisgIC8qIE1ha2Ugc3VyZSB0aGUgbWVtb3J5IG9wZXJhbmQgd2UndmUgYmVlbiBkZWFsdCBpcyB2YWxpZC4gICovCisgIGlmIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbQUREUl9QUkVGSVhdICE9IDApKQorICAgIHsKKyAgICAgIGlmICgoaS5iYXNlX3JlZworCSAgICYmICgoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKKwkJIT0gKFJlZzE2fEJhc2VJbmRleCkpKQorCSAgICAgIHx8IChpLmluZGV4X3JlZworCQkgICYmICgoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWcxNnxCYXNlSW5kZXgpKQorCQkgICAgICAgIT0gKFJlZzE2fEJhc2VJbmRleCkpCisJCSAgICAgIHx8ICEgKGkuYmFzZV9yZWcKKwkJCSAgICAmJiBpLmJhc2VfcmVnLT5yZWdfbnVtIDwgNgorCQkJICAgICYmIGkuaW5kZXhfcmVnLT5yZWdfbnVtID49IDYKKwkJCSAgICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDApKSkpCisJIHsKKwkgICBhc19iYWQgKF8oImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIpLAorICAgICAgICAgICAgICAgICAgIG9wZXJhbmRfc3RyaW5nLCAiMTYiKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisJIH0KKyAgICB9CisgICAgICBlbHNlCisJeworCSAgaWYgKChpLmJhc2VfcmVnCisJICAgICAgICYmIChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIFJlZzMyKSA9PSAwKQorCSAgICAgIHx8IChpLmluZGV4X3JlZworCQkgICYmICgoaS5pbmRleF9yZWctPnJlZ190eXBlICYgKFJlZzMyfEJhc2VJbmRleCkpCisJCSAgICAgICE9IChSZWczMnxCYXNlSW5kZXgpKSkpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIpLAorCQkgICAgICBvcGVyYW5kX3N0cmluZywgIjMyIik7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisgIHJldHVybiAxOworfQorCisvKiBQYXJzZSBPUEVSQU5EX1NUUklORyBpbnRvIHRoZSBpMzg2X2luc24gc3RydWN0dXJlIEkuICBSZXR1cm5zIG5vbi16ZXJvCisgICBvbiBlcnJvci4gKi8KKworc3RhdGljIGludCBpMzg2X29wZXJhbmQgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK2kzODZfb3BlcmFuZCAob3BlcmFuZF9zdHJpbmcpCisgICAgIGNoYXIgKm9wZXJhbmRfc3RyaW5nOworeworICBjaGFyICpvcF9zdHJpbmcgPSBvcGVyYW5kX3N0cmluZzsKKworICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCisgICAgKytvcF9zdHJpbmc7CisKKyAgLyogV2UgY2hlY2sgZm9yIGFuIGFic29sdXRlIHByZWZpeCAoZGlmZmVyZW50aWF0aW5nLAorICAgICBmb3IgZXhhbXBsZSwgJ2ptcCBwY19yZWxhdGl2ZV9sYWJlbCcgZnJvbSAnam1wICphYnNvbHV0ZV9sYWJlbCcuICovCisgIGlmICgqb3Bfc3RyaW5nID09IEFCU09MVVRFX1BSRUZJWCkKKyAgICB7CisgICAgICArK29wX3N0cmluZzsKKyAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKKyAgICAgICAgKytvcF9zdHJpbmc7CisgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSnVtcEFic29sdXRlOworICAgIH0KKworICAvKiBDaGVjayBpZiBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIuICovCisgIGlmICgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAorICAgICAgfHwgKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAob3Bfc3RyaW5nKSkpCisgICAgeworICAgICAgcmVnaXN0ZXIgY29uc3QgcmVnX2VudHJ5ICpyOworICAgICAgY2hhciAqZW5kX29wOworCisgICAgICByID0gcGFyc2VfcmVnaXN0ZXIgKG9wX3N0cmluZywgJmVuZF9vcCk7CisgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgLyogQ2hlY2sgZm9yIGEgc2VnbWVudCBvdmVycmlkZSBieSBzZWFyY2hpbmcgZm9yICc6JyBhZnRlciBhCisJIHNlZ21lbnQgcmVnaXN0ZXIuICAqLworICAgICAgb3Bfc3RyaW5nID0gZW5kX29wOworICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQorICAgICAgICArK29wX3N0cmluZzsKKyAgICAgIGlmICgqb3Bfc3RyaW5nID09ICc6JyAmJiAoci0+cmVnX3R5cGUgJiAoU1JlZzIgfCBTUmVnMykpKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChyLT5yZWdfbnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZlczsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAyOgorCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZzczsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAzOgorCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZkczsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSA0OgorCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSA1OgorCSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZnczsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBTa2lwIHRoZSAnOicgYW5kIHdoaXRlc3BhY2UuICAqLworCSAgKytvcF9zdHJpbmc7CisJICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCisJICAgICsrb3Bfc3RyaW5nOworCisJICAvKiBQcmV0ZW5kIGdpdmVuIHN0cmluZyBzdGFydHMgaGVyZS4gKi8KKwkgIG9wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nOworCSAgaWYgKCFpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKQorCSAgICAgICYmICFpc19pZGVudGlmaWVyX2NoYXIgKCpvcF9zdHJpbmcpCisJICAgICAgJiYgKm9wX3N0cmluZyAhPSAnKCcKKwkgICAgICAmJiAqb3Bfc3RyaW5nICE9IEFCU09MVVRFX1BSRUZJWCkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiYmFkIG1lbW9yeSBvcGVyYW5kIGAlcyciKSwgb3Bfc3RyaW5nKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgLyogSGFuZGxlIGNhc2Ugb2YgJWVzOipmb28uICovCisJICBpZiAoKm9wX3N0cmluZyA9PSBBQlNPTFVURV9QUkVGSVgpCisJICAgIHsKKwkgICAgICArK29wX3N0cmluZzsKKwkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCisJCSsrb3Bfc3RyaW5nOworCSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBKdW1wQWJzb2x1dGU7CisJICAgIH0KKwkgIGdvdG8gZG9fbWVtb3J5X3JlZmVyZW5jZTsKKwl9CisgICAgICBpZiAoKm9wX3N0cmluZykKKwl7CisJICBhc19iYWQgKF8oIkp1bmsgYCVzJyBhZnRlciByZWdpc3RlciIpLCBvcF9zdHJpbmcpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IHItPnJlZ190eXBlICYgfkJhc2VJbmRleDsKKyAgICAgIGkucmVnc1t0aGlzX29wZXJhbmRdID0gcjsKKyAgICAgIGkucmVnX29wZXJhbmRzKys7CisgICAgfQorICBlbHNlIGlmICgqb3Bfc3RyaW5nID09IElNTUVESUFURV9QUkVGSVgpCisgICAgewkJCQkvKiAuLi4gb3IgYW4gaW1tZWRpYXRlICovCisgICAgICArK29wX3N0cmluZzsKKyAgICAgIGlmICghaTM4Nl9pbW1lZGlhdGUgKG9wX3N0cmluZykpCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykgCisgICAgICAgICAgIHx8IGlzX2lkZW50aWZpZXJfY2hhciAoKm9wX3N0cmluZykKKwkgICB8fCAqb3Bfc3RyaW5nID09ICcoJyApCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIG1lbW9yeSByZWZlcmVuY2Ugb2Ygc29tZSBzb3J0LiAqLworICAgICAgY2hhciAqZW5kX29mX29wZXJhbmRfc3RyaW5nOworICAgICAgcmVnaXN0ZXIgY2hhciAqYmFzZV9zdHJpbmc7CisgICAgICBpbnQgZm91bmRfYmFzZV9pbmRleF9mb3JtOworCisgICAgICAvKiBTdGFydCBhbmQgZW5kIG9mIGRpc3BsYWNlbWVudCBzdHJpbmcgZXhwcmVzc2lvbiAoaWYgZm91bmQpLiAqLworICAgICAgY2hhciAqZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydDsKKyAgICAgIGNoYXIgKmRpc3BsYWNlbWVudF9zdHJpbmdfZW5kOworCisgICAgZG9fbWVtb3J5X3JlZmVyZW5jZToKKworICAgICAgaWYgKChpLm1lbV9vcGVyYW5kcyA9PSAxCisJICAgJiYgKGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+b3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpID09IDApCisJICB8fCBpLm1lbV9vcGVyYW5kcyA9PSAyKQorCXsKKwkgIGFzX2JhZCAoXygidG9vIG1hbnkgbWVtb3J5IHJlZmVyZW5jZXMgZm9yIGAlcyciKSwKKwkJICBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiBDaGVjayBmb3IgYmFzZSBpbmRleCBmb3JtLiAgV2UgZGV0ZWN0IHRoZSBiYXNlIGluZGV4IGZvcm0gYnkKKwkgbG9va2luZyBmb3IgYW4gJyknIGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQsIHNlYXJjaGluZworCSBmb3IgdGhlICcoJyBtYXRjaGluZyBpdCwgYW5kIGZpbmRpbmcgYSBSRUdJU1RFUl9QUkVGSVggb3IgJywnCisJIGFmdGVyIHRoZSAnKCcuICAqLworICAgICAgZm91bmRfYmFzZV9pbmRleF9mb3JtID0gMDsKKyAgICAgIGVuZF9vZl9vcGVyYW5kX3N0cmluZyA9IG9wX3N0cmluZyArIHN0cmxlbiAob3Bfc3RyaW5nKTsKKworICAgICAgLS1lbmRfb2Zfb3BlcmFuZF9zdHJpbmc7CisgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZykpCisJLS1lbmRfb2Zfb3BlcmFuZF9zdHJpbmc7CisKKyAgICAgIGJhc2Vfc3RyaW5nID0gZW5kX29mX29wZXJhbmRfc3RyaW5nOworCisgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcpJykKKwl7CisJICB1bnNpZ25lZCBpbnQgcGFyZW5zX2JhbGFuY2VkID0gMTsKKwkgIC8qIFdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBudW1iZXIgb2YgbGVmdCAmIHJpZ2h0ICgpJ3MgYXJlCisJICAgICBlcXVhbCwgc28gdGhpcyBsb29wIHdpbGwgbm90IGJlIGluZmluaXRlLiAqLworCSAgZG8KKwkgICAgeworCSAgICAgIGJhc2Vfc3RyaW5nLS07CisJICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKScpCisJCXBhcmVuc19iYWxhbmNlZCsrOworCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJygnKQorCQlwYXJlbnNfYmFsYW5jZWQtLTsKKwkgICAgfQorCSAgd2hpbGUgKHBhcmVuc19iYWxhbmNlZCk7CisKKwkgIC8qIElmIHRoZXJlIGlzIGEgZGlzcGxhY2VtZW50IHNldC11cCBmb3IgaXQgdG8gYmUgcGFyc2VkIGxhdGVyLiAqLworCSAgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCA9IG9wX3N0cmluZzsKKwkgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kID0gYmFzZV9zdHJpbmc7CisKKwkgIC8qIFNraXAgcGFzdCAnKCcgYW5kIHdoaXRlc3BhY2UuICAqLworCSAgKytiYXNlX3N0cmluZzsKKwkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQorCSAgICArK2Jhc2Vfc3RyaW5nOworCisJICBpZiAoKmJhc2Vfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAorCSAgICAgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKGJhc2Vfc3RyaW5nKSkKKwkgICAgICB8fCAqYmFzZV9zdHJpbmcgPT0gJywnKQorCSAgICBmb3VuZF9iYXNlX2luZGV4X2Zvcm0gPSAxOworCX0KKworICAgICAgLyogSWYgd2UgY2FuJ3QgcGFyc2UgYSBiYXNlIGluZGV4IHJlZ2lzdGVyIGV4cHJlc3Npb24sIHdlJ3ZlIGZvdW5kCisJIGEgcHVyZSBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbi4gIFdlIHNldCB1cCBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0CisJIGFuZCBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCBmb3IgdGhlIGNvZGUgYmVsb3cuICovCisgICAgICBpZiAoIWZvdW5kX2Jhc2VfaW5kZXhfZm9ybSkKKwl7CisJICBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0ID0gb3Bfc3RyaW5nOworCSAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgKyAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gQmFzZUluZGV4OworCisJICAvKiBGaW5kIGJhc2UgcmVnaXN0ZXIgKGlmIGFueSkuICovCisJICBpZiAoKmJhc2Vfc3RyaW5nICE9ICcsJykKKwkgICAgeworCSAgICAgIGNoYXIgKmVuZF9vcDsKKworCSAgICAgIC8qIFRyaW0gb2ZmIHRoZSBjbG9zaW5nICcpJyBzbyB0aGF0IHBhcnNlX3JlZ2lzdGVyIHdvbid0CisJCSBzZWUgaXQuICAqLworCSAgICAgIEVORF9TVFJJTkdfQU5EX1NBVkUgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7CisJICAgICAgaS5iYXNlX3JlZyA9IHBhcnNlX3JlZ2lzdGVyIChiYXNlX3N0cmluZywgJmVuZF9vcCk7CisJICAgICAgUkVTVE9SRV9FTkRfU1RSSU5HIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOworCisJICAgICAgaWYgKGkuYmFzZV9yZWcgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkgICAgICBiYXNlX3N0cmluZyA9IGVuZF9vcDsKKwkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKKwkJKytiYXNlX3N0cmluZzsKKwkgICAgfQorCisJICAvKiBUaGVyZSBtYXkgYmUgYW4gaW5kZXggcmVnIG9yIHNjYWxlIGZhY3RvciBoZXJlLiAgKi8KKwkgIGlmICgqYmFzZV9zdHJpbmcgPT0gJywnKQorCSAgICB7CisJICAgICAgKytiYXNlX3N0cmluZzsKKwkgICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKKwkJKytiYXNlX3N0cmluZzsKKworCSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCisJCSAgfHwgKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAoYmFzZV9zdHJpbmcpKSkKKwkJeworCQkgIGNoYXIgKmVuZF9vcDsKKworCQkgIEVORF9TVFJJTkdfQU5EX1NBVkUgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7CisJCSAgaS5pbmRleF9yZWcgPSBwYXJzZV9yZWdpc3RlciAoYmFzZV9zdHJpbmcsICZlbmRfb3ApOworCQkgIFJFU1RPUkVfRU5EX1NUUklORyAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKKworCQkgIGlmIChpLmluZGV4X3JlZyA9PSBOVUxMKQorCQkgICAgcmV0dXJuIDA7CisKKwkJICBiYXNlX3N0cmluZyA9IGVuZF9vcDsKKwkJICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKKwkJICAgICsrYmFzZV9zdHJpbmc7CisJCSAgaWYgKCpiYXNlX3N0cmluZyA9PSAnLCcpCisJCSAgICB7CisJCSAgICAgICsrYmFzZV9zdHJpbmc7CisJCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQorCQkJKytiYXNlX3N0cmluZzsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknICkKKwkJICAgIHsKKwkJICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBpbmRleCByZWdpc3RlciBpbiBgJXMnIiksCisJCQkgICAgICBvcGVyYW5kX3N0cmluZyk7CisJCSAgICAgIHJldHVybiAwOworCQkgICAgfQorCQl9CisKKwkgICAgICAvKiBDaGVjayBmb3Igc2NhbGUgZmFjdG9yLiAqLworCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmJhc2Vfc3RyaW5nKSkKKwkJeworICAgICAgICAgICAgICAgICAgaWYgKCFpMzg2X3NjYWxlIChiYXNlX3N0cmluZykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJCSAgKytiYXNlX3N0cmluZzsKKwkJICBpZiAoaXNfc3BhY2VfY2hhciAoKmJhc2Vfc3RyaW5nKSkKKwkJICAgICsrYmFzZV9zdHJpbmc7CisJCSAgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScpCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGApJyBhZnRlciBzY2FsZSBmYWN0b3IgaW4gYCVzJyIpLAorCQkJICAgICAgb3BlcmFuZF9zdHJpbmcpOworCQkgICAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKCFpLmluZGV4X3JlZykKKwkJeworCQkgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGluZGV4IHJlZ2lzdGVyIG9yIHNjYWxlIGZhY3RvciBhZnRlciBgLCc7IGdvdCAnJWMnIiksCisJCQkgICpiYXNlX3N0cmluZyk7CisJCSAgcmV0dXJuIDA7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJykKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgYmFzZSByZWdpc3RlciBpbiBgJXMnIiksCisJCSAgICAgIG9wZXJhbmRfc3RyaW5nKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKworICAgICAgLyogSWYgdGhlcmUncyBhbiBleHByZXNzaW9uIGJlZ2lubmluZyB0aGUgb3BlcmFuZCwgcGFyc2UgaXQsCisJIGFzc3VtaW5nIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgYW5kCisJIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kIGFyZSBtZWFuaW5nZnVsLiAgKi8KKyAgICAgIGlmIChkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0ICE9IGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kKQorCXsKKyAgICAgICAgICBpZiAoIWkzODZfZGlzcGxhY2VtZW50IChkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgKCVkeCkgd2hpbGUgZG9pbmcgaW5wdXQvb3V0cHV0IG9wLiAgKi8KKyAgICAgIGlmIChpLmJhc2VfcmVnCisJICAmJiBpLmJhc2VfcmVnLT5yZWdfdHlwZSA9PSAoUmVnMTYgfCBJbk91dFBvcnRSZWcpCisJICAmJiBpLmluZGV4X3JlZyA9PSAwCisJICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDAKKwkgICYmIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9PSAwCisJICAmJiAoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgRGlzcCkgPT0gMCkKKwl7CisJICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gPSBJbk91dFBvcnRSZWc7CisJICByZXR1cm4gMTsKKwl9CisgICAgICAvKiBNYWtlIHN1cmUgdGhlIG1lbW9yeSBvcGVyYW5kIHdlJ3ZlIGJlZW4gZGVhbHQgaXMgdmFsaWQuICAqLworICAgICAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCisJeworCSAgaWYgKChpLmJhc2VfcmVnCisJICAgICAgICYmICgoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiAoUmVnMTZ8QmFzZUluZGV4KSkKKwkJICAgIT0gKFJlZzE2fEJhc2VJbmRleCkpKQorCSAgICAgIHx8IChpLmluZGV4X3JlZworCQkgICYmICgoKGkuaW5kZXhfcmVnLT5yZWdfdHlwZSAmIChSZWcxNnxCYXNlSW5kZXgpKQorCQkgICAgICAgIT0gKFJlZzE2fEJhc2VJbmRleCkpCisJCSAgICAgIHx8ICEgKGkuYmFzZV9yZWcKKwkJCSAgICAmJiBpLmJhc2VfcmVnLT5yZWdfbnVtIDwgNgorCQkJICAgICYmIGkuaW5kZXhfcmVnLT5yZWdfbnVtID49IDYKKwkJCSAgICAmJiBpLmxvZzJfc2NhbGVfZmFjdG9yID09IDApKSkpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIpLAorCQkgICAgICBvcGVyYW5kX3N0cmluZywgIjE2Iik7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKChpLmJhc2VfcmVnCisJICAgICAgICYmIChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIFJlZzMyKSA9PSAwKQorCSAgICAgIHx8IChpLmluZGV4X3JlZworCQkgICYmICgoaS5pbmRleF9yZWctPnJlZ190eXBlICYgKFJlZzMyfEJhc2VJbmRleCkpCisJCSAgICAgICE9IChSZWczMnxCYXNlSW5kZXgpKSkpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIpLAorCQkgICAgICBvcGVyYW5kX3N0cmluZywgIjMyIik7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgICBpLm1lbV9vcGVyYW5kcysrOworICAgIH0KKyAgZWxzZQorICAgIHsJCQkJLyogaXQncyBub3QgYSBtZW1vcnkgb3BlcmFuZDsgYXJnaCEgKi8KKyAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyICVzIGJlZ2lubmluZyBvcGVyYW5kICVkIGAlcyciKSwKKwkgICAgICBvdXRwdXRfaW52YWxpZCAoKm9wX3N0cmluZyksCisJICAgICAgdGhpc19vcGVyYW5kICsgMSwKKwkgICAgICBvcF9zdHJpbmcpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsJCQkvKiBub3JtYWwgcmV0dXJuICovCit9CisMCisvKgorICoJCQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpCisgKgorICogQ2FsbGVkIGp1c3QgYmVmb3JlIHJlbGF4KCkuCisgKiBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZC4KKyAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLgorICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuCisgKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCisgKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgorICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQorICogMCB2YWx1ZS4KKyAqLworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OworeworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGU7CisgIHJlZ2lzdGVyIGludCBvbGRfZnJfZml4OworCisgIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OworICBvcGNvZGUgPSAodW5zaWduZWQgY2hhciAqKSBmcmFnUC0+ZnJfb3Bjb2RlOworICAvKiBXZSd2ZSBhbHJlYWR5IGdvdCBmcmFnUC0+ZnJfc3VidHlwZSByaWdodDsgIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisgICAgIGNoZWNrIGZvciB1bi1yZWxheGFibGUgc3ltYm9scy4gICovCisgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50KQorICAgIHsKKyAgICAgIC8qIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50ICovCisgICAgICBpbnQgY29kZTE2ID0gZnJhZ1AtPmZyX3N1YnR5cGUgJiBDT0RFMTY7CisgICAgICBpbnQgc2l6ZSA9IGNvZGUxNiA/IDIgOiA0OworICAgICAgaW50IHBjcmVsX3JlbG9jID0gY29kZTE2ID8gQkZEX1JFTE9DXzE2X1BDUkVMIDogQkZEX1JFTE9DXzMyX1BDUkVMOworCisgICAgICBzd2l0Y2ggKG9wY29kZVswXSkKKwl7CisJY2FzZSBKVU1QX1BDX1JFTEFUSVZFOgkvKiBtYWtlIGptcCAoMHhlYikgYSBkd29yZCBkaXNwbGFjZW1lbnQganVtcCAqLworCSAgb3Bjb2RlWzBdID0gMHhlOTsJLyogZHdvcmQgZGlzcCBqbXAgKi8KKwkgIGZyYWdQLT5mcl9maXggKz0gc2l6ZTsKKwkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4LCBzaXplLAorCQkgICBmcmFnUC0+ZnJfc3ltYm9sLAorCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLAorCQkgICAoR09UX3N5bWJvbCAmJiAvKiBOb3QgcXVpdGUgcmlnaHQgLSB3ZSBzaG91bGQgc3dpdGNoIG9uCisJCQkJICAgICBwcmVzZW5jZSBvZiBAUExULCBidXQgSSBjYW5ub3Qgc2VlIGhvdworCQkJCSAgICAgdG8gZ2V0IHRvIHRoYXQgZnJvbSBoZXJlLiAgV2Ugc2hvdWxkIGhhdmUKKwkJCQkgICAgIGRvbmUgdGhpcyBpbiBtZF9hc3NlbWJsZSB0byByZWFsbHkKKwkJCQkgICAgIGdldCBpdCByaWdodCBhbGwgb2YgdGhlIHRpbWUsIGJ1dCBJCisJCQkJICAgICB0aGluayBpdCBkb2VzIG5vdCBtYXR0ZXIgdGhhdCBtdWNoLCBhcworCQkJCSAgICAgdGhpcyB3aWxsIGJlIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUuIEVSWSovCisJCSAgICBTX0dFVF9TRUdNRU5UKGZyYWdQLT5mcl9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQorCQkgICA/IEJGRF9SRUxPQ18zODZfUExUMzIgOiBwY3JlbF9yZWxvYyk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKiBUaGlzIGNoYW5nZXMgdGhlIGJ5dGUtZGlzcGxhY2VtZW50IGp1bXAgMHg3TiAtLT4KKwkJCSAgIHRoZSBkd29yZC1kaXNwbGFjZW1lbnQganVtcCAweDBmOE4gKi8KKwkgIG9wY29kZVsxXSA9IG9wY29kZVswXSArIDB4MTA7CisJICBvcGNvZGVbMF0gPSBUV09fQllURV9PUENPREVfRVNDQVBFOwkvKiB0d28tYnl0ZSBlc2NhcGUgKi8KKwkgIGZyYWdQLT5mcl9maXggKz0gMSArIHNpemU7CS8qIHdlJ3ZlIGFkZGVkIGFuIG9wY29kZSBieXRlICovCisJICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIHNpemUsCisJCSAgIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsCisJCSAgIChHT1Rfc3ltYm9sICYmICAvKiBOb3QgcXVpdGUgcmlnaHQgLSB3ZSBzaG91bGQgc3dpdGNoIG9uCisJCQkJICAgICBwcmVzZW5jZSBvZiBAUExULCBidXQgSSBjYW5ub3Qgc2VlIGhvdworCQkJCSAgICAgdG8gZ2V0IHRvIHRoYXQgZnJvbSBoZXJlLiAgRVJZICovCisJCSAgICBTX0dFVF9TRUdNRU5UKGZyYWdQLT5mcl9zeW1ib2wpID09IHVuZGVmaW5lZF9zZWN0aW9uKQorCQkgICA/IEJGRF9SRUxPQ18zODZfUExUMzIgOiBwY3JlbF9yZWxvYyk7CisJICBicmVhazsKKwl9CisgICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKKyAgICB9CisgIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKK30JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLworDAorLyoKKyAqCQkJbWRfY29udmVydF9mcmFnKCk7CisgKgorICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCisgKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgorICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KKyAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgorICoKKyAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KKyAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KKyAqLworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlYywgZnJhZ1ApCisgICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOworICAgICBzZWdUIHNlYzsKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworI2Vsc2UKK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWdUIHNlYzsKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworI2VuZGlmCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm9wY29kZTsKKyAgdW5zaWduZWQgY2hhciAqd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB0YXJnZXRfYWRkcmVzczsKKyAgdW5zaWduZWQgaW50IG9wY29kZV9hZGRyZXNzOworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uID0gMDsKKyAgaW50IGRpc3BsYWNlbWVudF9mcm9tX29wY29kZV9zdGFydDsKKworICBvcGNvZGUgPSAodW5zaWduZWQgY2hhciAqKSBmcmFnUC0+ZnJfb3Bjb2RlOworCisgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAqLworICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQ7CisjaWZkZWYgQkZEX0FTU0VNQkxFUiAvKiBub3QgbmVlZGVkIG90aGVyd2lzZT8gKi8KKyAgdGFyZ2V0X2FkZHJlc3MgKz0gZnJhZ1AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKKyNlbmRpZgorCisgIC8qIEFkZHJlc3Mgb3Bjb2RlIHJlc2lkZXMgYXQgaW4gZmlsZSBzcGFjZS4gKi8KKyAgb3Bjb2RlX2FkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXg7CisKKyAgLyogRGlzcGxhY2VtZW50IGZyb20gb3Bjb2RlIHN0YXJ0IHRvIGZpbGwgaW50byBpbnN0cnVjdGlvbi4gKi8KKyAgZGlzcGxhY2VtZW50X2Zyb21fb3Bjb2RlX3N0YXJ0ID0gdGFyZ2V0X2FkZHJlc3MgLSBvcGNvZGVfYWRkcmVzczsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBTTUFMTCk6CisgICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgU01BTEwxNik6CisgICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBTTUFMTCk6CisgICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBTTUFMTDE2KToKKyAgICAgIC8qIGRvbid0IGhhdmUgdG8gY2hhbmdlIG9wY29kZSAqLworICAgICAgZXh0ZW5zaW9uID0gMTsJCS8qIDEgb3Bjb2RlICsgMSBkaXNwbGFjZW1lbnQgKi8KKyAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzFdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcpOgorICAgICAgZXh0ZW5zaW9uID0gNTsJCS8qIDIgb3Bjb2RlICsgNCBkaXNwbGFjZW1lbnQgKi8KKyAgICAgIG9wY29kZVsxXSA9IG9wY29kZVswXSArIDB4MTA7CisgICAgICBvcGNvZGVbMF0gPSBUV09fQllURV9PUENPREVfRVNDQVBFOworICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMl07CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgQklHKToKKyAgICAgIGV4dGVuc2lvbiA9IDQ7CQkvKiAxIG9wY29kZSArIDQgZGlzcGxhY2VtZW50ICovCisgICAgICBvcGNvZGVbMF0gPSAweGU5OworICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMV07CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRzE2KToKKyAgICAgIGV4dGVuc2lvbiA9IDM7CQkvKiAyIG9wY29kZSArIDIgZGlzcGxhY2VtZW50ICovCisgICAgICBvcGNvZGVbMV0gPSBvcGNvZGVbMF0gKyAweDEwOworICAgICAgb3Bjb2RlWzBdID0gVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRTsKKyAgICAgIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQgPSAmb3Bjb2RlWzJdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIEJJRzE2KToKKyAgICAgIGV4dGVuc2lvbiA9IDI7CQkvKiAxIG9wY29kZSArIDIgZGlzcGxhY2VtZW50ICovCisgICAgICBvcGNvZGVbMF0gPSAweGU5OworICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMV07CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAvKiBub3cgcHV0IGRpc3BsYWNlbWVudCBhZnRlciBvcGNvZGUgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50LAorCQkgICAgICAodmFsdWVUKSAoZGlzcGxhY2VtZW50X2Zyb21fb3Bjb2RlX3N0YXJ0IC0gZXh0ZW5zaW9uKSwKKwkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOworICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKK30KKwwKKworaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDI7CS8qIHNpemUgb2YgYnl0ZSBkaXNwbGFjZW1lbnQgam1wICovCitpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA1OwkvKiBzaXplIG9mIGR3b3JkIGRpc3BsYWNlbWVudCBqbXAgKi8KK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLworCit2b2lkCittZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKKyAgICAgY2hhciAqcHRyOworICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7CisgICAgIGZyYWdTICpmcmFnOworICAgICBzeW1ib2xTICp0b19zeW1ib2w7Cit7CisgIGxvbmcgb2Zmc2V0OworCisgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7CisgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweGViLCAxKTsJLyogb3Bjb2RlIGZvciBieXRlLWRpc3AganVtcCAqLworICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgMSk7Cit9CisKK3ZvaWQKK21kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOworICAgICBmcmFnUyAqZnJhZzsKKyAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOworeworICBsb25nIG9mZnNldDsKKworICBpZiAoZmxhZ19kb19sb25nX2p1bXApCisgICAgeworICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIFNfR0VUX1ZBTFVFICh0b19zeW1ib2wpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZTksIDEpOy8qIG9wY29kZSBmb3IgbG9uZyBqbXAgKi8KKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKKyAgICAgIGZpeF9uZXcgKGZyYWcsIChwdHIgKyAxKSAtIGZyYWctPmZyX2xpdGVyYWwsIDQsCisJICAgICAgIHRvX3N5bWJvbCwgKG9mZnNldFQpIDAsIDAsIEJGRF9SRUxPQ18zMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyA1KTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweGU5LCAxKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKKyAgICB9Cit9CisMCisvKiBBcHBseSBhIGZpeHVwIChmaXhTKSB0byBzZWdtZW50IGRhdGEsIG9uY2UgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZAorICAgYnkgb3VyIGNhbGxlciB0aGF0IHdlIGhhdmUgYWxsIHRoZSBpbmZvIHdlIG5lZWQgdG8gZml4IGl0IHVwLgorCisgICBPbiB0aGUgMzg2LCBpbW1lZGlhdGVzLCBkaXNwbGFjZW1lbnRzLCBhbmQgZGF0YSBwb2ludGVycyBhcmUgYWxsIGluCisgICB0aGUgc2FtZSAobGl0dGxlLWVuZGlhbikgZm9ybWF0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgd2hpY2gKKyAgIHdlIGFyZSBoYW5kbGluZy4gICovCisKK2ludAorbWRfYXBwbHlfZml4MyAoZml4UCwgdmFscCwgc2VnKQorICAgICBmaXhTICpmaXhQOwkJLyogVGhlIGZpeCB3ZSdyZSB0byBwdXQgaW4uICAqLworICAgICB2YWx1ZVQgKnZhbHA7CQkvKiBQb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gICovCisgICAgIHNlZ1Qgc2VnOwkJCS8qIFNlZ21lbnQgZml4IGlzIGZyb20uICAqLworeworICByZWdpc3RlciBjaGFyICpwID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOworICB2YWx1ZVQgdmFsdWUgPSAqdmFscDsKKworICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMiAmJiBmaXhQLT5meF9wY3JlbCkKKyAgICAgZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOworCisjaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpCisgIC8qCisgICAqIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0bworICAgKiBoYW5kbGUgdGhpcy4KKyAgICovCisgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMICYmIGZpeFAtPmZ4X2FkZHN5KQorICAgIHsKKyNpZm5kZWYgT0JKX0FPVVQKKyAgICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKyNpZmRlZiBURV9QRQorCSAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgorI2VuZGlmCisJICApCisJdmFsdWUgKz0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworI2VuZGlmCisjaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKKyAgICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKwkgICYmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gc2VnCisJICAgICAgfHwgKGZpeFAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKwkgICYmICEgU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCisJICAmJiAhIFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpCisJICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQorCSAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpKQorCXsKKwkgIC8qIFllcywgd2UgYWRkIHRoZSB2YWx1ZXMgaW4gdHdpY2UuICBUaGlzIGlzIGJlY2F1c2UKKwkgICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gc3VidHJhY3RzIHRoZW0gb3V0IGFnYWluLiAgSSB0aGluaworCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBicm9rZW4sIGJ1dCBJIGRvbid0IGRhcmUgY2hhbmdlCisJICAgICBpdC4gIEZJWE1FLiAgKi8KKwkgIHZhbHVlICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkIChPQkpfQ09GRikgJiYgZGVmaW5lZCAoVEVfUEUpCisgICAgICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBQRSBmb3JtYXQgZG9lcyBub3Qgc3RvcmUgYSBzZWN0aW9uCisgICAgICAgICBhZGRyZXNzIG9mZnNldCBmb3IgYSBQQyByZWxhdGl2ZSBzeW1ib2wuICAqLworICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWcpCisJdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7CisjZW5kaWYKKyAgICB9CisKKyAgLyogRml4IGEgZmV3IHRoaW5ncyAtIHRoZSBkeW5hbWljIGxpbmtlciBleHBlY3RzIGNlcnRhaW4gdmFsdWVzIGhlcmUsCisgICAgIGFuZCB3ZSBtdXN0IG5vdCBkaXNzYXBwb2ludCBpdC4gKi8KKyNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQorICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisgICAgICAmJiBmaXhQLT5meF9hZGRzeSkKKyAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkgeworICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKKyAgICAgIC8qIE1ha2UgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24gcG9pbnQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9wZXJhbmQuICBBdAorCSBydW50aW1lIHdlIG1lcmVseSBhZGQgdGhlIG9mZnNldCB0byB0aGUgYWN0dWFsIFBMVCBlbnRyeS4gKi8KKyAgICAgIHZhbHVlID0gMHhmZmZmZmZmYzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RQQzoKKy8qCisgKiAgVGhpcyBpcyB0b3VnaCB0byBleHBsYWluLiAgV2UgZW5kIHVwIHdpdGggdGhpcyBvbmUgaWYgd2UgaGF2ZQorICogb3BlcmFuZHMgdGhhdCBsb29rIGxpa2UgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDI4NF0iLiAgVGhlIGdvYWwKKyAqIGhlcmUgaXMgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mIHRoZSBHT1QsIGFuZCBpdCBpcyBzdHJvbmdseQorICogcHJlZmVyYWJsZSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgb2YgdmlldyB0byBhdm9pZCB1c2luZyBhIHJ1bnRpbWUKKyAqIHJlbG9jYXRpb24gZm9yIHRoaXMuICBUaGUgYWN0dWFsIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyBvZnRlbiBsb29rIAorICogc29tZXRoaW5nIGxpa2U6CisgKiAKKyAqIAljYWxsCS5MNjYKKyAqIC5MNjY6CisgKiAJcG9wbAklZWJ4CisgKiAJYWRkbAkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MNjZdLCVlYngKKyAqIAorICogCVRoZSBjYWxsIGFuZCBwb3AgZXNzZW50aWFsbHkgcmV0dXJuIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIG9mCisgKiB0aGUgbGFiZWwgLkw2NiBhbmQgc3RvcmUgaXQgaW4gJWVieC4gIFRoZSBsaW5rZXIgaXRzZWxmIHdpbGwKKyAqIHVsdGltYXRlbHkgY2hhbmdlIHRoZSBmaXJzdCBvcGVyYW5kIG9mIHRoZSBhZGRsIHNvIHRoYXQgJWVieCBwb2ludHMgdG8KKyAqIHRoZSBHT1QsIGJ1dCB0byBrZWVwIHRoaW5ncyBzaW1wbGUsIHRoZSAubyBmaWxlIG11c3QgaGF2ZSB0aGlzIG9wZXJhbmQKKyAqIHNldCBzbyB0aGF0IGl0IGdlbmVyYXRlcyBub3QgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgLkw2NiwgYnV0IHRoZQorICogYWJzb2x1dGUgYWRkcmVzcyBvZiBpdHNlbGYuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIGl0c2VsZiBzaW1wbHkKKyAqIHRyZWF0IGEgR09UUEMgcmVsb2NhdGlvbiBhcyBhc2tpbmcgZm9yIGEgcGNyZWwgb2Zmc2V0IHRvIHRoZSBHT1QgdG8gYmUKKyAqIGFkZGVkIGluLCBhbmQgdGhlIGFkZGVuZCBvZiB0aGUgcmVsb2NhdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG9wZXJhbmQKKyAqIGZpZWxkIGZvciB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLgorICogCisgKiAJT3VyIGpvYiBoZXJlIGlzIHRvIGZpeCB0aGUgb3BlcmFuZCBzbyB0aGF0IGl0IHdvdWxkIGFkZCB0aGUgY29ycmVjdAorICogb2Zmc2V0IHNvIHRoYXQgJWVieCB3b3VsZCBwb2ludCB0byBpdHNlbGYuICBUaGUgdGhpbmcgdGhhdCBpcyB0cmlja3kgaXMKKyAqIHRoYXQgLi0uTDY2IHdpbGwgcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIHdlIG5lZWQKKyAqIHRvIGZ1cnRoZXIgbW9kaWZ5IHRoZSBvcGVyYW5kIHNvIHRoYXQgaXQgd2lsbCBwb2ludCB0byBpdHNlbGYuCisgKiBUaGVyZSBhcmUgb3RoZXIgY2FzZXMgd2hlcmUgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CisgKiAKKyAqIAkubG9uZwkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MNjZdCisgKiAKKyAqIGFuZCBoZXJlIG5vIGNvcnJlY3Rpb24gd291bGQgYmUgcmVxdWlyZWQuICBJbnRlcm5hbGx5IGluIHRoZSBhc3NlbWJsZXIKKyAqIHdlIHRyZWF0IG9wZXJhbmRzIG9mIHRoaXMgZm9ybSBhcyBub3QgYmVpbmcgcGNyZWwgc2luY2UgdGhlICcuJyBpcyAKKyAqIGV4cGxpY2l0bHkgbWVudGlvbmVkLCBhbmQgSSB3b25kZXIgd2hldGhlciBpdCB3b3VsZCBzaW1wbGlmeSBtYXR0ZXJzCisgKiB0byBkbyBpdCB0aGlzIHdheS4gIFdobyBrbm93cy4gIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIFBJQyBwYXRjaGVzLAorICogdGhlIHBjcmVsX2FkanVzdCBmaWVsZCB3YXMgdXNlZCB0byBzdG9yZSB0aGUgY29ycmVjdGlvbiwgYnV0IHNpbmNlIHRoZQorICogZXhwcmVzc2lvbiBpcyBub3QgcGNyZWwsIEkgZmVsdCBpdCB3b3VsZCBiZSBjb25mdXNpbmcgdG8gZG8gaXQgdGhpcyB3YXkuCisgKi8KKyAgICAgIHZhbHVlIC09IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6CisgICAgICB2YWx1ZSA9IDA7IC8qIEZ1bGx5IHJlc29sdmVkIGF0IHJ1bnRpbWUuICBObyBhZGRlbmQuICovCisgICAgICBicmVhazsKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UT0ZGOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CisgICAgICBmaXhQLT5meF9kb25lID0gMDsKKyAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKyNpZiAwCisvKiBUaGlzIGlzIG5ldmVyIHVzZWQuICAqLworbG9uZwkJCQkvKiBLbm93cyBhYm91dCB0aGUgYnl0ZSBvcmRlciBpbiBhIHdvcmQuICovCittZF9jaGFyc190b19udW1iZXIgKGNvbiwgbmJ5dGVzKQorICAgICB1bnNpZ25lZCBjaGFyIGNvbltdOwkvKiBMb3cgb3JkZXIgYnl0ZSAxc3QuICovCisgICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGlucHV0LiAqLworeworICBsb25nIHJldHZhbDsKKyAgZm9yIChyZXR2YWwgPSAwLCBjb24gKz0gbmJ5dGVzIC0gMTsgbmJ5dGVzLS07IGNvbi0tKQorICAgIHsKKyAgICAgIHJldHZhbCA8PD0gQklUU19QRVJfQ0hBUjsKKyAgICAgIHJldHZhbCB8PSAqY29uOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZiAvKiAwICovCisMCisKKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCisvKiBUdXJuIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBsaXRQIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCisgICB0eXBlLCBhbmQgZW1pdCB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMgZW1pdHRlZAorICAgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKKyAgTElUVExFTlVNX1RZUEUgKndvcmRQOworICBjaGFyICp0OworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICBwcmVjID0gNTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIpOworICAgIH0KKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAvKiBUaGlzIGxvb3BzIG91dHB1dHMgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlcjsgaW4gYWNjb3JkIHdpdGgKKyAgICAgdGhlIGJpZ2VuZGlhbiAzODYuICAqLworICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFAtLSksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKwwKK2NoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOworCitzdGF0aWMgY2hhciAqIG91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgY2hhciAqCitvdXRwdXRfaW52YWxpZCAoYykKKyAgICAgaW50IGM7Cit7CisgIGlmIChpc3ByaW50IChjKSkKKyAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOworICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOworfQorCisvKiBSRUdfU1RSSU5HIHN0YXJ0cyAqYmVmb3JlKiBSRUdJU1RFUl9QUkVGSVguICAqLworCitzdGF0aWMgY29uc3QgcmVnX2VudHJ5ICogcGFyc2VfcmVnaXN0ZXIgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7CisKK3N0YXRpYyBjb25zdCByZWdfZW50cnkgKgorcGFyc2VfcmVnaXN0ZXIgKHJlZ19zdHJpbmcsIGVuZF9vcCkKKyAgICAgY2hhciAqcmVnX3N0cmluZzsKKyAgICAgY2hhciAqKmVuZF9vcDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHJlZ19zdHJpbmc7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGNoYXIgcmVnX25hbWVfZ2l2ZW5bTUFYX1JFR19OQU1FX1NJWkUgKyAxXTsKKyAgY29uc3QgcmVnX2VudHJ5ICpyOworCisgIC8qIFNraXAgcG9zc2libGUgUkVHSVNURVJfUFJFRklYIGFuZCBwb3NzaWJsZSB3aGl0ZXNwYWNlLiAgKi8KKyAgaWYgKCpzID09IFJFR0lTVEVSX1BSRUZJWCkKKyAgICArK3M7CisKKyAgaWYgKGlzX3NwYWNlX2NoYXIgKCpzKSkKKyAgICArK3M7CisKKyAgcCA9IHJlZ19uYW1lX2dpdmVuOworICB3aGlsZSAoKCpwKysgPSByZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgKnMrK10pICE9ICdcMCcpCisgICAgeworICAgICAgaWYgKHAgPj0gcmVnX25hbWVfZ2l2ZW4gKyBNQVhfUkVHX05BTUVfU0laRSkKKwl7CisgICAgICAgICAgaWYgKCFhbGxvd19uYWtlZF9yZWcpCisgICAgICAgICAgICB7CisJICAgICAgKnAgPSAnXDAnOworCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIpLCByZWdfbmFtZV9naXZlbik7CisgICAgICAgICAgICB9CisJICByZXR1cm4gKGNvbnN0IHJlZ19lbnRyeSAqKSBOVUxMOworCX0KKyAgICB9CisKKyAgKmVuZF9vcCA9IHMgLSAxOworCisgIHIgPSAoY29uc3QgcmVnX2VudHJ5ICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHJlZ19uYW1lX2dpdmVuKTsKKworICBpZiAociA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghYWxsb3dfbmFrZWRfcmVnKQorICAgICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgcmVnX25hbWVfZ2l2ZW4pOworICAgICAgcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuIHI7Cit9CisMCisjaWZkZWYgT0JKX0VMRgorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImttVlE6IjsKKyNlbHNlCitDT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibSI7CisjZW5kaWYKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAnbSc6CisgICAgICBmbGFnX2RvX2xvbmdfanVtcCA9IDE7CisgICAgICBicmVhazsKKworI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCisgICAgICAvKiAtazogSWdub3JlIGZvciBGcmVlQlNEIGNvbXBhdGliaWxpdHkuICAqLworICAgIGNhc2UgJ2snOgorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLworICAgIGNhc2UgJ1YnOgorICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KKwkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgY2FzZSAnUSc6CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK21kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKKyAgICAgRklMRSAqc3RyZWFtOworeworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKy1tCQkJZG8gbG9uZyBqdW1wXG4iKSk7Cit9CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjaWZkZWYgT0JKX01BWUJFX0VMRgorI2lmZGVmIE9CSl9NQVlCRV9DT0ZGCisKKy8qIFBpY2sgdGhlIHRhcmdldCBmb3JtYXQgdG8gdXNlLiAgKi8KKworY29uc3QgY2hhciAgKgoraTM4Nl90YXJnZXRfZm9ybWF0ICgpCit7CisgIHN3aXRjaCAoT1VUUFVUX0ZMQVZPUikKKyAgICB7CisgICAgY2FzZSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cjoKKyAgICAgIHJldHVybiAiY29mZi1pMzg2IjsKKyAgICBjYXNlIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXI6CisgICAgICByZXR1cm4gImVsZjMyLWkzODYiOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworI2VuZGlmIC8qIE9CSl9NQVlCRV9DT0ZGICovCisjZW5kaWYgLyogT0JKX01BWUJFX0VMRiAqLworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KKwwKKy8qIEFSR1NVU0VEICovCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisJaWYgKCpuYW1lID09ICdfJyAmJiAqKG5hbWUrMSkgPT0gJ0cnCisJICAgICYmIHN0cmNtcChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpID09IDApCisJICB7CisJICAgIGlmICghR09UX3N5bWJvbCkKKwkgICAgICB7CisJCWlmIChzeW1ib2xfZmluZCAobmFtZSkpCisJCSAgYXNfYmFkIChfKCJHT1QgYWxyZWFkeSBpbiBzeW1ib2wgdGFibGUiKSk7CisJCUdPVF9zeW1ib2wgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKKwkJCQkJICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7CisJICAgICAgfTsKKwkgICAgcmV0dXJuIEdPVF9zeW1ib2w7CisJICB9CisgIHJldHVybiAwOworfQorCisvKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQorICAgICBzZWdUIHNlZ21lbnQ7CisgICAgIHZhbHVlVCBzaXplOworeworI2lmZGVmIE9CSl9BT1VUCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAvKiBGb3IgYS5vdXQsIGZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4gIElmIHdlIGRvbid0IGRvCisgICAgIHRoaXMsIEJGRCB3aWxsIGFsaWduIGl0IGZvciB1cywgYnV0IGl0IHdpbGwgbm90IHdyaXRlIG91dCB0aGUKKyAgICAgZmluYWwgYnl0ZXMgb2YgdGhlIHNlY3Rpb24uICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiBCRkQsIGJ1dCBpdCBpcworICAgICBlYXNpZXIgdG8gZml4IGl0IGhlcmUgc2luY2UgdGhhdCBpcyBob3cgdGhlIG90aGVyIGEub3V0IHRhcmdldHMKKyAgICAgd29yay4gICovCisgIGludCBhbGlnbjsKKworICBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7CisgIHNpemUgPSAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgodmFsdWVUKSAtMSA8PCBhbGlnbikpOworI2VuZGlmCisjZW5kaWYKKworICByZXR1cm4gc2l6ZTsKK30KKworLyogT24gdGhlIGkzODYsIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAgIG5leHQgaW5zdHJ1Y3Rpb24uICBUaGF0IGlzLCB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzIGl0cworICAgc2l6ZSwgc2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgaW5zbi4gICovCisKK2xvbmcKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworfQorCisjaWZuZGVmIEkzODZDT0ZGCisKK3N0YXRpYyB2b2lkCitzX2JzcyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICByZWdpc3RlciBpbnQgdGVtcDsKKworICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKyNlbmRpZgorCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKK3ZvaWQKK2kzODZfdmFsaWRhdGVfZml4IChmaXhwKQorICAgICBmaXhTICpmaXhwOworeworICBpZiAoZml4cC0+Znhfc3Vic3kgJiYgZml4cC0+Znhfc3Vic3kgPT0gR09UX3N5bWJvbCkKKyAgICB7CisgICAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzg2X0dPVE9GRjsKKyAgICAgIGZpeHAtPmZ4X3N1YnN5ID0gMDsKKyAgICB9Cit9CisKKyNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCisjZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYoU1osUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhaworCithcmVsZW50ICoKK3RjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGFyZWxlbnQgKnJlbDsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7CisKKyAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCisgICAgeworICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKKyAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6CisgICAgY2FzZSBCRkRfUkVMT0NfUlZBOgorICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCisJeworCSAgTUFQICgxLCAwLCBCRkRfUkVMT0NfOCk7CisJICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7CisJICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7CisJICBNQVAgKDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKKwkgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKKwkgIE1BUCAoNCwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKKwlkZWZhdWx0OgorCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQorCSAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIiksCisJCSAgICBmaXhwLT5meF9zaXplKTsKKwkgIGVsc2UKKwkgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIpLCBmaXhwLT5meF9zaXplKTsKKwkgIGNvZGUgPSBCRkRfUkVMT0NfMzI7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisjdW5kZWYgTUFQCisjdW5kZWYgRgorCisgIGlmIChjb2RlID09IEJGRF9SRUxPQ18zMgorICAgICAgJiYgR09UX3N5bWJvbAorICAgICAgJiYgZml4cC0+ZnhfYWRkc3kgPT0gR09UX3N5bWJvbCkKKyAgICBjb2RlID0gQkZEX1JFTE9DXzM4Nl9HT1RQQzsKKworICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKyAgcmVsLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKworICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisgIC8qIEhBQ0s6IFNpbmNlIGkzODYgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZQorICAgICB2dGFibGUgZW50cnkgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKKworICBpZiAoZml4cC0+ZnhfcGNyZWwpCisgICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7CisgIGVsc2UKKyAgICByZWwtPmFkZGVuZCA9IDA7CisKKyAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKKyAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCSAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAorCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKKyAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCisgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7CisgICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7CisgICAgfQorCisgIHJldHVybiByZWw7Cit9CisKKyNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLworCisjaWYgKGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkpCit2b2lkCit0Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQorICAgICBjaGFyICp3aGVyZTsKKyAgICAgZml4UyAqZml4UDsKKyAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Cit7CisgIC8qCisgICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KKyAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KKyAgICovCisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKKyAgbG9uZyByX3N5bWJvbG51bTsKKworICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKKworICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAorCQkgICAgICAodmFsdWVUKSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcworCQkJCSsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSksCisJCSAgICAgIDQpOworCisgIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCisJCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQorCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKKworICB3aGVyZVs2XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKKyAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKKyAgd2hlcmVbNF0gPSByX3N5bWJvbG51bSAmIDB4MGZmOworICB3aGVyZVs3XSA9ICgoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDMpICYgMHgwOCkKKwkgICAgICB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDEpICYgMHgwNikKKwkgICAgICB8ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDApICYgMHgwMSkgJiAweDBmKSk7Cit9CisKKyNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLworCisjaWYgZGVmaW5lZCAoSTM4NkNPRkYpCisKK3Nob3J0Cit0Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0lNQUdFQkFTRSkKKyAgICByZXR1cm4gUl9JTUFHRUJBU0U7CisKKyAgcmV0dXJuIChmaXhQLT5meF9wY3JlbCA/CisJICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9QQ1JCWVRFIDoKKwkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1BDUldPUkQgOgorCSAgIFJfUENSTE9ORykgOgorCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURSA6CisJICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9SRUxXT1JEIDoKKwkgICBSX0RJUjMyKSk7Cit9CisKK2ludAordGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIGlmIChmcmFnLT5mcl9uZXh0KQorICAgIHJldHVybiAoZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3MpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBJMzg2Q09GRiAqLworCisjZW5kaWYgLyogQkZEX0FTU0VNQkxFUj8gKi8KKwwKKy8qIGVuZCBvZiB0Yy1pMzg2LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTM4Ni5oIGIvZ2FzL2NvbmZpZy90Yy1pMzg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NmQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtaTM4Ni5oCkBAIC0wLDAgKzEsNDcxIEBACisvKiB0Yy1pMzg2LmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWkzODYuYworICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUQ19JMzg2CisjZGVmaW5lIFRDX0kzODYgMQorCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3QgZml4OworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JMAorCisjaWZkZWYgVEVfTFlOWAorI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1pMzg2LWx5bngiCisjZW5kaWYKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKy8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgcmVsb2NhdGlvbiB0eXBlcyBpbiB0Yy1pMzg2LmMuICBUaGUgZmlyc3QKKyAgIHBhcmFtZXRlciBpcyB0aGUgY3VycmVudCByZWxvY2F0aW9uIHR5cGUsIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBkZXNpcmVkCisgICB0eXBlLiAgVGhlIGlkZWEgaXMgdGhhdCBpZiB0aGUgb3JpZ2luYWwgdHlwZSBpcyBhbHJlYWR5IHNvbWUga2luZCBvZiBQSUMKKyAgIHJlbG9jYXRpb24sIHdlIGxlYXZlIGl0IGFsb25lLCBvdGhlcndpc2Ugd2UgZ2l2ZSBpdCB0aGUgZGVzaXJlZCB0eXBlICovCisKKyNkZWZpbmUgVENfUkVMT0MoWCxZKSAoKChYKSAhPSBCRkRfUkVMT0NfMzg2X1BMVDMyICYmIFwKKwkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYgJiYgXAorCSAgIChYKSAhPSBCRkRfUkVMT0NfMzg2X0dPVDMyICYmIFwKKwkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1RQQykgPyBZIDogWCkKKworI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShYKSAgdGNfaTM4Nl9maXhfYWRqdXN0YWJsZShYKQorZXh0ZXJuIGludCB0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworCisvKiBUaGlzIGlzIHRoZSByZWxvY2F0aW9uIHR5cGUgZm9yIGRpcmVjdCByZWZlcmVuY2VzIHRvIEdMT0JBTF9PRkZTRVRfVEFCTEUuCisgKiBJdCBjb21lcyB1cCBpbiBjb21wbGljYXRlZCBleHByZXNzaW9ucyBzdWNoIGFzIAorICogX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MMjg0XSwgd2hpY2ggY2Fubm90IGJlIGV4cHJlc3NlZCBub3JtYWxseSB3aXRoCisgKiB0aGUgcmVndWxhciBleHByZXNzaW9ucy4gIFRoZSBmaXh1cCBzcGVjaWZpZWQgaGVyZSB3aGVuIHVzZWQgYXQgcnVudGltZSAKKyAqIGltcGxpZXMgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBhZGRyZXNzIG9mIHRoZSBHT1QgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiwKKyAqIGFuZCBhcyBhIHJlc3VsdCB3ZSBoYXZlIHNpbXBsaWZpZWQgdGhlIGV4cHJlc3Npb24gaW50byBzb21ldGhpbmcgd2UgY2FuIHVzZS4KKyAqLworI2RlZmluZSBUQ19SRUxPQ19HTE9CQUxfT0ZGU0VUX1RBQkxFIEJGRF9SRUxPQ18zODZfR09UUEMKKworLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKKyAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCisgICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4KKyAgIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucywgc28gR09UT0ZGIGRvZXMgbm90IG5lZWQgdG8gYmUKKyAgIGNoZWNrZWQgaGVyZS4gIEkgYW0gbm90IHN1cmUgaWYgc29tZSBvZiB0aGUgb3RoZXJzIGFyZSBldmVyIHVzZWQgd2l0aAorICAgcGNyZWwsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gYmUgc2FmZSB0aGFuIHNvcnJ5LiAqLworCisjZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJCVwKKyAgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9QTFQzMgkJCVwKKyAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgkJCVwKKyAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzM4Nl9HT1RQQwkJCVwKKyAgICYmICgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCQkJXAorICAgICAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCisJICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQlcCisJICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQkJXAorCSAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKSkKKworI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfaTM4NgorCisjaWZkZWYgT0JKX0FPVVQKKyNpZmRlZiBURV9OZXRCU0QKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtbmV0YnNkIgorI2VuZGlmCisjaWZkZWYgVEVfMzg2QlNECisjZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LWJzZCIKKyNlbmRpZgorI2lmZGVmIFRFX0xJTlVYCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LWxpbnV4IgorI2VuZGlmCisjaWZkZWYgVEVfTWFjaAorI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtbWFjaDMiCisjZW5kaWYKKyNpZmRlZiBURV9EWU5JWAorI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1keW5peCIKKyNlbmRpZgorI2lmbmRlZiBUQVJHRVRfRk9STUFUCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2IgorI2VuZGlmCisjZW5kaWYgLyogT0JKX0FPVVQgKi8KKworI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImVsZjMyLWkzODYiCisjZW5kaWYKKworI2lmZGVmIE9CSl9NQVlCRV9FTEYKKyNpZmRlZiBPQkpfTUFZQkVfQ09GRgorZXh0ZXJuIGNvbnN0IGNoYXIgKmkzODZfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgaTM4Nl90YXJnZXRfZm9ybWF0ICgpCisjZW5kaWYKKyNlbmRpZgorCisjZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KKworLyogQ09GRiBTVFVGRiAqLworCisjZGVmaW5lIENPRkZfTUFHSUMgSTM4Nk1BR0lDCisjZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2kzODYKKyNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXUgorI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeSB8fCAoeCktPmZ4X3JfdHlwZT09NykKKyNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKK2V4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKyNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCitleHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoZnJhZ1MgKmZyYWcpKTsKKyNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAyCisjZGVmaW5lIFRDX1JWQV9SRUxPQyA3CisvKiBOZWVkIHRoaXMgZm9yIFBJQyByZWxvY2F0aW9ucyAqLworI2RlZmluZSBORUVEX0ZYX1JfVFlQRQorCisKKyNpZmRlZiBURV8zODZCU0QKKy8qIFRoZSBCU0RJIGxpbmtlciBhcHBhcmVudGx5IHJlamVjdHMgb2JqZWN0cyB3aXRoIGEgbWFjaGluZSB0eXBlIG9mCisgICBNXzM4NiAoMTAwKS4gICovCisjZGVmaW5lIEFPVVRfTUFDSFRZUEUgMAorI2Vsc2UKKyNkZWZpbmUgQU9VVF9NQUNIVFlQRSAxMDAKKyNlbmRpZgorCisjdW5kZWYgUkVWRVJTRV9TT1JUX1JFTE9DUworCisjZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCisKKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSB0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKK2V4dGVybiBpbnQgdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorI2RlZmluZSBOT19SRUxPQyBCRkRfUkVMT0NfTk9ORQorI2Vsc2UKKyNkZWZpbmUgTk9fUkVMT0MgMAorI2VuZGlmCisjZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKQk7CS8qIG5vdCB1c2VkICovCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorI2lmbmRlZiBPQkpfQU9VVAorI2lmbmRlZiBURV9QRQorI2lmbmRlZiBURV9HTzMyCisvKiBMb2NhbCBsYWJlbHMgc3RhcnRzIHdpdGggLkwgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWVbMF0gPT0gJy4nIFwKKwkJICYmIChuYW1lWzFdID09ICdMJyB8fCBuYW1lWzFdID09ICdYJyB8fCBuYW1lWzFdID09ICcuJykpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisjZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCisjZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW107CisjZGVmaW5lIHRjX3N5bWJvbF9jaGFycyBleHRyYV9zeW1ib2xfY2hhcnMKKworI2RlZmluZSBNQVhfT1BFUkFORFMgMwkJLyogbWF4IG9wZXJhbmRzIHBlciBpbnNuICovCisjZGVmaW5lIE1BWF9JTU1FRElBVEVfT1BFUkFORFMgMi8qIG1heCBpbW1lZGlhdGVzIHBlciBpbnNuIChsY2FsbCwgbGptcCkgKi8KKyNkZWZpbmUgTUFYX01FTU9SWV9PUEVSQU5EUyAyCS8qIG1heCBtZW1vcnkgcmVmcyBwZXIgaW5zbiAoc3RyaW5nIG9wcykgKi8KKworLyogUHJlZml4ZXMgd2lsbCBiZSBlbWl0dGVkIGluIHRoZSBvcmRlciBkZWZpbmVkIGJlbG93LgorICAgV0FJVF9QUkVGSVggbXVzdCBiZSB0aGUgZmlyc3QgcHJlZml4IHNpbmNlIEZXQUlUIGlzIHJlYWxseSBpcyBhbgorICAgaW5zdHJ1Y3Rpb24sIGFuZCBzbyBtdXN0IGNvbWUgYmVmb3JlIGFueSBwcmVmaXhlcy4gKi8KKyNkZWZpbmUgV0FJVF9QUkVGSVgJMAorI2RlZmluZSBMT0NLUkVQX1BSRUZJWAkxCisjZGVmaW5lIEFERFJfUFJFRklYCTIKKyNkZWZpbmUgREFUQV9QUkVGSVgJMworI2RlZmluZSBTRUdfUFJFRklYCTQKKyNkZWZpbmUgTUFYX1BSRUZJWEVTCTUJLyogbWF4IHByZWZpeGVzIHBlciBvcGNvZGUgKi8KKworLyogd2UgZGVmaW5lIHRoZSBzeW50YXggaGVyZSAobW9kdWxvIGJhc2UsaW5kZXgsc2NhbGUgc3ludGF4KSAqLworI2RlZmluZSBSRUdJU1RFUl9QUkVGSVggJyUnCisjZGVmaW5lIElNTUVESUFURV9QUkVGSVggJyQnCisjZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnKicKKworI2RlZmluZSBUV09fQllURV9PUENPREVfRVNDQVBFIDB4MGYKKyNkZWZpbmUgTk9QX09QQ09ERSAoY2hhcikgMHg5MAorCisvKiByZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lIEVCUF9SRUdfTlVNIDUKKyNkZWZpbmUgRVNQX1JFR19OVU0gNAorCisvKiBtb2RybV9ieXRlLnJlZ21lbSBmb3IgdHdvYnl0ZSBlc2NhcGUgKi8KKyNkZWZpbmUgRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcgRVNQX1JFR19OVU0KKy8qIGluZGV4X2Jhc2VfYnl0ZS5pbmRleCBmb3Igbm8gaW5kZXggcmVnaXN0ZXIgYWRkcmVzc2luZyAqLworI2RlZmluZSBOT19JTkRFWF9SRUdJU1RFUiBFU1BfUkVHX05VTQorLyogaW5kZXhfYmFzZV9ieXRlLmJhc2UgZm9yIG5vIGJhc2UgcmVnaXN0ZXIgYWRkcmVzc2luZyAqLworI2RlZmluZSBOT19CQVNFX1JFR0lTVEVSIEVCUF9SRUdfTlVNCisjZGVmaW5lIE5PX0JBU0VfUkVHSVNURVJfMTYgNgorCisvKiB0aGVzZSBhcmUgdGhlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzLiAgKi8KKyNkZWZpbmUgRFdPUkRfTU5FTV9TVUZGSVggJ2wnCisjZGVmaW5lIFdPUkRfTU5FTV9TVUZGSVggICd3JworI2RlZmluZSBCWVRFX01ORU1fU1VGRklYICAnYicKKyNkZWZpbmUgU0hPUlRfTU5FTV9TVUZGSVggJ3MnCisjZGVmaW5lIExPTkdfTU5FTV9TVUZGSVggICdsJworLyogSW50ZWwgU3ludGF4ICovCisjZGVmaW5lIExPTkdfRE9VQkxFX01ORU1fU1VGRklYICd4JworLyogSW50ZWwgU3ludGF4ICovCisjZGVmaW5lIElOVEVMX0RXT1JEX01ORU1fU1VGRklYICdkJworCisvKiBtb2RybS5tb2RlID0gUkVHTUVNX0ZJRUxEX0hBU19SRUcgd2hlbiBhIHJlZ2lzdGVyIGlzIGluIHRoZXJlICovCisjZGVmaW5lIFJFR01FTV9GSUVMRF9IQVNfUkVHIDB4My8qIGFsd2F5cyA9IDB4MyAqLworI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX01FTSAoflJFR01FTV9GSUVMRF9IQVNfUkVHKQorCisjZGVmaW5lIEVORF9PRl9JTlNOICdcMCcKKworLyogSW50ZWwgU3ludGF4ICovCisvKiBWYWx1ZXMgMC00IG1hcCBvbnRvIHNjYWxlIGZhY3RvciAqLworI2RlZmluZSBCWVRFX1BUUiAgICAgMAorI2RlZmluZSBXT1JEX1BUUiAgICAgMQorI2RlZmluZSBEV09SRF9QVFIgICAgMgorI2RlZmluZSBRV09SRF9QVFIgICAgMworI2RlZmluZSBYV09SRF9QVFIgICAgNAorI2RlZmluZSBTSE9SVCAgICAgICAgNQorI2RlZmluZSBPRkZTRVRfRkxBVCAgNgorI2RlZmluZSBGTEFUICAgICAgICAgNworI2RlZmluZSBOT05FX0ZPVU5EICAgOAorLyoKKyAgV2hlbiBhbiBvcGVyYW5kIGlzIHJlYWQgaW4gaXQgaXMgY2xhc3NpZmllZCBieSBpdHMgdHlwZS4gIFRoaXMgdHlwZSBpbmNsdWRlcworICBhbGwgdGhlIHBvc3NpYmxlIHdheXMgYW4gb3BlcmFuZCBjYW4gYmUgdXNlZC4gIFRodXMsICclZWF4JyBpcyBib3RoICdyZWdpc3RlcgorICAjIDAnIGFuZCAnVGhlIEFjY3VtdWxhdG9yJy4gIEluIG91ciBsYW5ndWFnZSB0aGlzIGlzIGV4cHJlc3NlZCBieSBPUidpbmcKKyAgJ1JlZzMyJyAoYW55IDMyIGJpdCByZWdpc3RlcikgYW5kICdBY2MnICh0aGUgYWNjdW11bGF0b3IpLgorICBPcGVyYW5kcyBhcmUgY2xhc3NpZmllZCBzbyB0aGF0IHdlIGNhbiBtYXRjaCBnaXZlbiBvcGVyYW5kIHR5cGVzIHdpdGgKKyAgdGhlIG9wY29kZSB0YWJsZSBpbiBvcGNvZGUvaTM4Ni5oLgorICAqLworLyogcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUmVnOAkJICAgMHgxCS8qIDggYml0IHJlZyAqLworI2RlZmluZSBSZWcxNgkJICAgMHgyCS8qIDE2IGJpdCByZWcgKi8KKyNkZWZpbmUgUmVnMzIJCSAgIDB4NAkvKiAzMiBiaXQgcmVnICovCisvKiBpbW1lZGlhdGUgKi8KKyNkZWZpbmUgSW1tOAkJICAgMHg4CS8qIDggYml0IGltbWVkaWF0ZSAqLworI2RlZmluZSBJbW04UwkJICAweDEwCS8qIDggYml0IGltbWVkaWF0ZSBzaWduIGV4dGVuZGVkICovCisjZGVmaW5lIEltbTE2CQkgIDB4MjAJLyogMTYgYml0IGltbWVkaWF0ZSAqLworI2RlZmluZSBJbW0zMgkJICAweDQwCS8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KKyNkZWZpbmUgSW1tMQkJICAweDgwCS8qIDEgYml0IGltbWVkaWF0ZSAqLworLyogbWVtb3J5ICovCisjZGVmaW5lIEJhc2VJbmRleAkgMHgxMDAKKy8qIERpc3A4LDE2LDMyIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24gdGhlCisgICBpbnN0cnVjdGlvbi4gIEZvciBqdW1wcywgdGhleSBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBQQyByZWxhdGl2ZQorICAgZGlzcGxhY2VtZW50LCBmb3IgYmFzZWluZGV4IHR5cGUgaW5zdHJ1Y3Rpb25zLCB0aGV5IHNwZWNpZnkgdGhlCisgICBzaXplIG9mIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcmVnaXN0ZXIsIGFuZCBmb3IgbWVtb3J5CisgICBvZmZzZXQgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgYG1vdiAxMjM0LCVhbCcgdGhleSBzcGVjaWZ5IHRoZSBzaXplIG9mCisgICB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzZWdtZW50IGJhc2UuICAqLworI2RlZmluZSBEaXNwOAkJIDB4MjAwCS8qIDggYml0IGRpc3BsYWNlbWVudCAqLworI2RlZmluZSBEaXNwMTYJCSAweDQwMAkvKiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCisjZGVmaW5lIERpc3AzMgkJIDB4ODAwCS8qIDMyIGJpdCBkaXNwbGFjZW1lbnQgKi8KKy8qIHNwZWNpYWxzICovCisjZGVmaW5lIEluT3V0UG9ydFJlZwkweDEwMDAJLyogcmVnaXN0ZXIgdG8gaG9sZCBpbi9vdXQgcG9ydCBhZGRyID0gZHggKi8KKyNkZWZpbmUgU2hpZnRDb3VudAkweDIwMDAJLyogcmVnaXN0ZXIgdG8gaG9sZCBzaGlmdCBjb3VuZCA9IGNsICovCisjZGVmaW5lIENvbnRyb2wJICAgICAgICAweDQwMDAJLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBEZWJ1ZwkgICAgICAgIDB4ODAwMAkvKiBEZWJ1ZyByZWdpc3RlciAqLworI2RlZmluZSBUZXN0CSAgICAgICAweDEwMDAwCS8qIFRlc3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRmxvYXRSZWcgICAgICAgMHgyMDAwMAkvKiBGbG9hdCByZWdpc3RlciAqLworI2RlZmluZSBGbG9hdEFjYyAgICAgICAweDQwMDAwCS8qIEZsb2F0IHN0YWNrIHRvcCAlc3QoMCkgKi8KKyNkZWZpbmUgU1JlZzIJICAgICAgIDB4ODAwMDAJLyogMiBiaXQgc2VnbWVudCByZWdpc3RlciAqLworI2RlZmluZSBTUmVnMwkgICAgICAweDEwMDAwMAkvKiAzIGJpdCBzZWdtZW50IHJlZ2lzdGVyICovCisjZGVmaW5lIEFjYwkgICAgICAweDIwMDAwMAkvKiBBY2N1bXVsYXRvciAlYWwgb3IgJWF4IG9yICVlYXggKi8KKyNkZWZpbmUgSnVtcEFic29sdXRlICAweDQwMDAwMAorI2RlZmluZSBSZWdNTVgJICAgICAgMHg4MDAwMDAJLyogTU1YIHJlZ2lzdGVyICovCisjZGVmaW5lIEVzU2VnCSAgICAgMHgxMDAwMDAwCS8qIFN0cmluZyBpbnNuIG9wZXJhbmQgd2l0aCBmaXhlZCBlcyBzZWdtZW50ICovCisKKyNkZWZpbmUgUmVnCShSZWc4fFJlZzE2fFJlZzMyKQkvKiBnZW4nbCByZWdpc3RlciAqLworI2RlZmluZSBXb3JkUmVnIChSZWcxNnxSZWczMikKKyNkZWZpbmUgSW1wbGljaXRSZWdpc3RlciAoSW5PdXRQb3J0UmVnfFNoaWZ0Q291bnR8QWNjfEZsb2F0QWNjKQorI2RlZmluZSBJbW0JKEltbTh8SW1tOFN8SW1tMTZ8SW1tMzIpIC8qIGdlbidsIGltbWVkaWF0ZSAqLworI2RlZmluZSBEaXNwCShEaXNwOHxEaXNwMTZ8RGlzcDMyKQkvKiBHZW5lcmFsIGRpc3BsYWNlbWVudCAqLworI2RlZmluZSBBbnlNZW0JKERpc3B8QmFzZUluZGV4KQkvKiBHZW5lcmFsIG1lbW9yeSAqLworLyogVGhlIGZvbGxvd2luZyBhbGlhc2VzIGFyZSBkZWZpbmVkIGJlY2F1c2UgdGhlIG9wY29kZSB0YWJsZQorICAgY2FyZWZ1bGx5IHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtZW1vcnkgdHlwZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCisgICBBdCB0aGUgbW9tZW50IHdlIGNhbiBvbmx5IHRlbGwgYSBtZW1vcnkgcmVmZXJlbmNlIHNpemUgYnkgdGhlCisgICBpbnN0cnVjdGlvbiBzdWZmaXgsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gZGVmaW5pbmcgTWVtOCwKKyAgIE1lbTE2LCBNZW0zMiBhbmQgTWVtNjQgb3Bjb2RlIG1vZGlmaWVycyAtIFdlIG1pZ2h0IGFzIHdlbGwganVzdCB1c2UKKyAgIHRoZSBzdWZmaXggZGlyZWN0bHkgdG8gY2hlY2sgbWVtb3J5IG9wZXJhbmRzLiAgKi8KKyNkZWZpbmUgTExvbmdNZW0gQW55TWVtCQkvKiA2NCBiaXRzIChvciBtb3JlKSAqLworI2RlZmluZSBMb25nTWVtIEFueU1lbQkJLyogMzIgYml0IG1lbW9yeSByZWYgKi8KKyNkZWZpbmUgU2hvcnRNZW0gQW55TWVtCQkvKiAxNiBiaXQgbWVtb3J5IHJlZiAqLworI2RlZmluZSBXb3JkTWVtIEFueU1lbQkJLyogMTYgb3IgMzIgYml0IG1lbW9yeSByZWYgKi8KKyNkZWZpbmUgQnl0ZU1lbSBBbnlNZW0JCS8qIDggYml0IG1lbW9yeSByZWYgKi8KKworI2RlZmluZSBTTUFMTEVTVF9ESVNQX1RZUEUobnVtKSBcCisgICAgKGZpdHNfaW5fc2lnbmVkX2J5dGUobnVtKSA/IChEaXNwOHxEaXNwMzIpIDogRGlzcDMyKQorCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBpbnN0cnVjdGlvbiBuYW1lIHNhbnMgd2lkdGggc3VmZml4ICgibW92IiBmb3IgbW92bCBpbnNucykgKi8KKyAgY2hhciAqbmFtZTsKKworICAvKiBob3cgbWFueSBvcGVyYW5kcyAqLworICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7CisKKyAgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlIHdpdGhvdXQgb3B0aW9uYWwKKyAgICAgcHJlZml4KGVzKS4gICovCisgIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKKworICAvKiBleHRlbnNpb25fb3Bjb2RlIGlzIHRoZSAzIGJpdCBleHRlbnNpb24gZm9yIGdyb3VwIDxuPiBpbnNucy4KKyAgICAgVGhpcyBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIDgtYml0IG9wY29kZSBzdWZmaXggZm9yIHRoZQorICAgICBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KKyAgICAgSWYgdGhpcyB0ZW1wbGF0ZSBoYXMgbm8gZXh0ZW5zaW9uIG9wY29kZSAodGhlIHVzdWFsIGNhc2UpIHVzZSBOb25lICovCisgIHVuc2lnbmVkIGludCBleHRlbnNpb25fb3Bjb2RlOworI2RlZmluZSBOb25lIDB4ZmZmZgkJLyogSWYgbm8gZXh0ZW5zaW9uX29wY29kZSBpcyBwb3NzaWJsZS4gKi8KKworICAvKiB0aGUgYml0cyBpbiBvcGNvZGVfbW9kaWZpZXIgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZpbmFsIG9wY29kZSBmcm9tCisgICAgIHRoZSBiYXNlX29wY29kZS4gIFRoZXNlIGJpdHMgYWxzbyBhcmUgdXNlZCB0byBkZXRlY3QgYWx0ZXJuYXRlIGZvcm1zIG9mCisgICAgIHRoZSBzYW1lIGluc3RydWN0aW9uICovCisgIHVuc2lnbmVkIGludCBvcGNvZGVfbW9kaWZpZXI7CisKKyAgLyogb3Bjb2RlX21vZGlmaWVyIGJpdHM6ICovCisjZGVmaW5lIFcJCSAgIDB4MQkvKiBzZXQgaWYgb3BlcmFuZHMgY2FuIGJlIHdvcmRzIG9yIGR3b3JkcworCQkJCSAgIGVuY29kZWQgdGhlIGNhbm9uaWNhbCB3YXkgKi8KKyNkZWZpbmUgRAkJICAgMHgyCS8qIEQgPSAwIGlmIFJlZyAtLT4gUmVnbWVtOworCQkJCSAgIEQgPSAxIGlmIFJlZ21lbSAtLT4gUmVnOiAgICBNVVNUIEJFIDB4MiAqLworI2RlZmluZSBNb2RybQkJICAgMHg0CisjZGVmaW5lIFJldmVyc2VSZWdSZWdtZW0gICAweDggIC8qIHN3YXAgcmVnLHJlZ21lbSBmaWVsZHMgZm9yIDIgcmVnIGNhc2UgKi8KKyNkZWZpbmUgRmxvYXRSCQkgICAweDgJLyogc3JjL2Rlc3Qgc3dhcCBmb3IgZmxvYXRzOiAgIE1VU1QgQkUgMHg4ICovCisjZGVmaW5lIFNob3J0Rm9ybQkgIDB4MTAJLyogcmVnaXN0ZXIgaXMgaW4gbG93IDMgYml0cyBvZiBvcGNvZGUgKi8KKyNkZWZpbmUgRmxvYXRNRgkJICAweDIwCS8qIEZQIGluc24gbWVtb3J5IGZvcm1hdCBiaXQsIHNpemVkIGJ5IDB4NCAqLworI2RlZmluZSBKdW1wCQkgIDB4NDAJLyogc3BlY2lhbCBjYXNlIGZvciBqdW1wIGluc25zLiAqLworI2RlZmluZSBKdW1wRHdvcmQJICAweDgwICAvKiBjYWxsIGFuZCBqdW1wICovCisjZGVmaW5lIEp1bXBCeXRlCSAweDEwMCAgLyogbG9vcCBhbmQgamVjeHogKi8KKyNkZWZpbmUgSnVtcEludGVyU2VnbWVudCAweDIwMAkvKiBzcGVjaWFsIGNhc2UgZm9yIGludGVyc2VnbWVudCBsZWFwcy9jYWxscyAqLworI2RlZmluZSBGbG9hdEQJCSAweDQwMAkvKiBkaXJlY3Rpb24gZm9yIGZsb2F0IGluc25zOiAgTVVTVCBCRSAweDQwMCAqLworI2RlZmluZSBTZWcyU2hvcnRGb3JtCSAweDgwMAkvKiBlbmNvZGluZyBvZiBsb2FkIHNlZ21lbnQgcmVnIGluc25zICovCisjZGVmaW5lIFNlZzNTaG9ydEZvcm0JMHgxMDAwCS8qIGZzL2dzIHNlZ21lbnQgcmVnaXN0ZXIgaW5zbnMuICovCisjZGVmaW5lIFNpemUxNgkJMHgyMDAwCS8qIG5lZWRzIHNpemUgcHJlZml4IGlmIGluIDMyLWJpdCBtb2RlICovCisjZGVmaW5lIFNpemUzMgkJMHg0MDAwCS8qIG5lZWRzIHNpemUgcHJlZml4IGlmIGluIDE2LWJpdCBtb2RlICovCisjZGVmaW5lIElnbm9yZVNpemUJMHg4MDAwICAvKiBpbnN0cnVjdGlvbiBpZ25vcmVzIG9wZXJhbmQgc2l6ZSBwcmVmaXggKi8KKyNkZWZpbmUgTm9fYlN1ZgkgICAgICAgMHgxMDAwMAkvKiBiIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCisjZGVmaW5lIE5vX3dTdWYJICAgICAgIDB4MjAwMDAJLyogdyBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLworI2RlZmluZSBOb19sU3VmCSAgICAgICAweDQwMDAwCS8qIGwgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KKyNkZWZpbmUgTm9fc1N1ZgkgICAgICAgMHg4MDAwMAkvKiBzIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCisjZGVmaW5lIEZXYWl0CSAgICAgIDB4MTAwMDAwCS8qIGluc3RydWN0aW9uIG5lZWRzIEZXQUlUICovCisjZGVmaW5lIElzU3RyaW5nICAgICAgMHgyMDAwMDAJLyogcXVpY2sgdGVzdCBmb3Igc3RyaW5nIGluc3RydWN0aW9ucyAqLworI2RlZmluZSByZWdLbHVkZ2UgICAgIDB4NDAwMDAwCS8qIGZha2UgYW4gZXh0cmEgcmVnIG9wZXJhbmQgZm9yIGNsciwgaW11bCAqLworI2RlZmluZSBJc1ByZWZpeCAgICAgIDB4ODAwMDAwCS8qIG9wY29kZSBpcyBhIHByZWZpeCAqLworI2RlZmluZSBOb19kU3VmICAgICAgMHgxMDAwMDAwICAvKiBkIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCisjZGVmaW5lIE5vX3hTdWYgICAgICAweDIwMDAwMDAgIC8qIHggc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KKyNkZWZpbmUgVWdoCSAgICAweDgwMDAwMDAwCS8qIGRlcHJlY2F0ZWQgZnAgaW5zbiwgZ2V0cyBhIHdhcm5pbmcgKi8KKworICAvKiBvcGVyYW5kX3R5cGVzW2ldIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBvcGVyYW5kIGkuICBUaGlzIGlzIG1hZGUKKyAgICAgYnkgT1InaW5nIHRvZ2V0aGVyIGFsbCBvZiB0aGUgcG9zc2libGUgdHlwZSBtYXNrcy4gIChlLmcuCisgICAgICdvcGVyYW5kX3R5cGVzW2ldID0gUmVnfEltbScgc3BlY2lmaWVzIHRoYXQgb3BlcmFuZCBpIGNhbiBiZQorICAgICBlaXRoZXIgYSByZWdpc3RlciBvciBhbiBpbW1lZGlhdGUgb3BlcmFuZCAqLworICB1bnNpZ25lZCBpbnQgb3BlcmFuZF90eXBlc1szXTsKK30KK3RlbXBsYXRlOworCisvKgorICAndGVtcGxhdGVzJyBpcyBmb3IgZ3JvdXBpbmcgdG9nZXRoZXIgJ3RlbXBsYXRlJyBzdHJ1Y3R1cmVzIGZvciBvcGNvZGVzCisgIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc3RvcmluZyB0aGUgaW5zbnMgaW4gdGhlIGdyYW5kCisgIG9sZSBoYXNoIHRhYmxlIG9mIGluc25zLgorICBUaGUgdGVtcGxhdGVzIHRoZW1zZWx2ZXMgc3RhcnQgYXQgU1RBUlQgYW5kIHJhbmdlIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykKKyAgRU5ELgorICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IHRlbXBsYXRlICpzdGFydDsKKyAgICBjb25zdCB0ZW1wbGF0ZSAqZW5kOworICB9IHRlbXBsYXRlczsKKworLyogdGhlc2UgYXJlIGZvciByZWdpc3RlciBuYW1lIC0tPiBudW1iZXIgJiB0eXBlIGhhc2ggbG9va3VwICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgY2hhciAqcmVnX25hbWU7CisgICAgdW5zaWduZWQgaW50IHJlZ190eXBlOworICAgIHVuc2lnbmVkIGludCByZWdfbnVtOworICB9CityZWdfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBjaGFyICpzZWdfbmFtZTsKKyAgICB1bnNpZ25lZCBpbnQgc2VnX3ByZWZpeDsKKyAgfQorc2VnX2VudHJ5OworCisvKiAzODYgb3BlcmFuZCBlbmNvZGluZyBieXRlczogIHNlZSAzODYgYm9vayBmb3IgZGV0YWlscyBvZiB0aGlzLiAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGludCByZWdtZW07CS8qIGNvZGVzIHJlZ2lzdGVyIG9yIG1lbW9yeSBvcGVyYW5kICovCisgICAgdW5zaWduZWQgaW50IHJlZzsJCS8qIGNvZGVzIHJlZ2lzdGVyIG9wZXJhbmQgKG9yIGV4dGVuZGVkIG9wY29kZSkgKi8KKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsJCS8qIGhvdyB0byBpbnRlcnByZXQgcmVnbWVtICYgcmVnICovCisgIH0KK21vZHJtX2J5dGU7CisKKy8qIDM4NiBvcGNvZGUgYnl0ZSB0byBjb2RlIGluZGlyZWN0IGFkZHJlc3NpbmcuICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgYmFzZTsKKyAgICB1bnNpZ25lZCBpbmRleDsKKyAgICB1bnNpZ25lZCBzY2FsZTsKKyAgfQorc2liX2J5dGU7CisKKy8qIFRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuIEFsbG93CisgICB0aGlzIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVlZCBiZS4gKi8KKyNpZm5kZWYgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FCisjZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorI2VuZGlmCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCit2b2lkIGkzODZfdmFsaWRhdGVfZml4IFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworI2RlZmluZSBUQ19WQUxJREFURV9GSVgoRklYUCxTRUdUWVBFLFNLSVApIGkzODZfdmFsaWRhdGVfZml4KEZJWFApCisjZW5kaWYKKworI2VuZGlmIC8qIFRDX0kzODYgKi8KKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCisKKworZXh0ZXJuIGludCBmbGFnXzE2Yml0X2NvZGU7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjZGVmaW5lIG1kX21heWJlX3RleHQoKSBcCisgICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCisjZWxzZQorI2RlZmluZSBtZF9tYXliZV90ZXh0KCkgXAorICAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24gJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKKyNlbmRpZgorCisjZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBhcm91bmQpCQkJCVwKK2lmICgobikgJiYgIW5lZWRfcGFzc18yCQkJCQkJCVwKKyAgICAmJiAoIShmaWxsKSB8fCAoKGNoYXIpKihmaWxsKSA9PSAoY2hhcikweDkwICYmIChsZW4pID09IDEpKQkJXAorICAgICYmIG1kX21heWJlX3RleHQgKCkpCQkJCQkJXAorICB7CQkJCQkJCQkJXAorICAgIGNoYXIgKnA7CQkJCQkJCQlcCisgICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxNSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAkJXAorCQkgIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAobiksIChjaGFyICopIDApOwkJXAorICAgICpwID0gMHg5MDsJCQkJCQkJCVwKKyAgICBnb3RvIGFyb3VuZDsJCQkJCQkJXAorICB9CisKK2V4dGVybiB2b2lkIGkzODZfYWxpZ25fY29kZSBQQVJBTVMgKChmcmFnUyAqLCBpbnQpKTsKKworI2RlZmluZSBIQU5ETEVfQUxJR04oZnJhZ1ApCQkJCQkJXAoraWYgKGZyYWdQLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUpIAkJCQkJXAorICBpMzg2X2FsaWduX2NvZGUgKGZyYWdQLCAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MJCQlcCisJCQkgICAtIGZyYWdQLT5mcl9hZGRyZXNzCQkJCVwKKwkJCSAgIC0gZnJhZ1AtPmZyX2ZpeCkpOworCisvKiBjYWxsIG1kX2FwcGx5X2ZpeDMgd2l0aCBzZWdtZW50IGluc3RlYWQgb2YgbWRfYXBwbHlfZml4ICovCisjZGVmaW5lIE1EX0FQUExZX0ZJWDMKKwordm9pZCBpMzg2X3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7CisjZGVmaW5lIHRjX3ByaW50X3N0YXRpc3RpY3MgaTM4Nl9wcmludF9zdGF0aXN0aWNzCisKKyNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KKworI2lmZGVmIFNDT19FTEYKKyNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzKCkgc2NvX2lkICgpCitleHRlcm4gdm9pZCBzY29faWQgUEFSQU1TICgodm9pZCkpOworI2VuZGlmCisKKyNkZWZpbmUgRElGRl9FWFBSX09LICAgIC8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCisKKy8qIGVuZCBvZiB0Yy1pMzg2LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTg2MC5jIGIvZ2FzL2NvbmZpZy90Yy1pODYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlMmIxOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtaTg2MC5jCkBAIC0wLDAgKzEsMTI2MyBAQAorLyogdGMtaTg2MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgSTg2MAorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MiwgOTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYXMuaCIKKworI2luY2x1ZGUgIm9wY29kZS9pODYwLmgiCisKK3ZvaWQgbWRfYmVnaW4gKCk7Cit2b2lkIG1kX251bWJlcl90b19jaGFycyAoKTsKK3ZvaWQgbWRfYXNzZW1ibGUgKCk7CitjaGFyICptZF9hdG9mICgpOwordm9pZCBtZF9jb252ZXJ0X2ZyYWcgKCk7CitpbnQgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKCk7Cit2b2lkIG1kX251bWJlcl90b19pbW0gKCk7Cit2b2lkIG1kX251bWJlcl90b19kaXNwICgpOwordm9pZCBtZF9udW1iZXJfdG9fZmllbGQgKCk7Cit2b2lkIG1kX3JpX3RvX2NoYXJzICgpOworc3RhdGljIHZvaWQgaTg2MF9pcCAoKTsKKy8qIHZvaWQgZW1pdF9tYWNoaW5lX3JlbG9jKCk7ICovCisKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKKworLyogdm9pZCAoKm1kX2VtaXRfcmVsb2NhdGlvbnMpKCkgPSBlbWl0X21hY2hpbmVfcmVsb2M7ICovCisKKy8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKKworc3RhdGljIHZvaWQgc19kdWFsICgpLCBzX2VuZGR1YWwgKCk7CitzdGF0aWMgdm9pZCBzX2F0bXAgKCk7CisKK2NvbnN0IHBzZXVkb190eXBlUworICBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsiZHVhbCIsIHNfZHVhbCwgNH0sCisgIHsiZW5kZHVhbCIsIHNfZW5kZHVhbCwgNH0sCisgIHsiYXRtcCIsIHNfYXRtcCwgNH0sCisgIHtOVUxMLCAwLCAwfSwKK307CisKKy8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQorICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhLyI7CS8qIEpGIHJlbW92ZWQgJ3wnIGZyb20gY29tbWVudF9jaGFycyAqLworCisvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJworICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCisvKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKKyAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLworLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjLyI7CisKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBBcyBpbiAwZjEyLjQ1NiAqLworLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKKworLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQorICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKKyAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgorICAgKi8KK2ludCBzaXplX3JlbG9jX2luZm8gPSBzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBvY3RhbFsyNTZdOworI2RlZmluZSBpc29jdGFsKGMpICBvY3RhbFtjXQorc3RhdGljIHVuc2lnbmVkIGNoYXIgdG9IZXhbMjU2XTsKKworc3RydWN0IGk4NjBfaXQKKyAgeworICAgIGNoYXIgKmVycm9yOworICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOworICAgIGV4cHJlc3Npb25TIGV4cDsKKyAgICBpbnQgcGNyZWw7CisgICAgZW51bSBleHBhbmRfdHlwZSBleHBhbmQ7CisgICAgZW51bSBoaWdobG93X3R5cGUgaGlnaGxvdzsKKyAgICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7CisgIH0gdGhlX2luc247CisKKyNpZiBfX1NURENfXyA9PSAxCisKK3N0YXRpYyB2b2lkIHByaW50X2luc24gKHN0cnVjdCBpODYwX2l0ICppbnNuKTsKK3N0YXRpYyBpbnQgZ2V0RXhwcmVzc2lvbiAoY2hhciAqc3RyKTsKKworI2Vsc2UgLyogbm90IF9fU1REQ19fICovCisKK3N0YXRpYyB2b2lkIHByaW50X2luc24gKCk7CitzdGF0aWMgaW50IGdldEV4cHJlc3Npb24gKCk7CisKKyNlbmRpZiAvKiBub3QgX19TVERDX18gKi8KKworc3RhdGljIGNoYXIgKmV4cHJfZW5kOworc3RhdGljIGNoYXIgbGFzdF9leHBhbmQ7CS8qIGVycm9yIGlmIGV4cGFuc2lvbiBhZnRlciBicmFuY2ggKi8KKworZW51bSBkdWFsCit7CisgIERVQUxfT0ZGID0gMCwgRFVBTF9PTiwgRFVBTF9ERE9ULCBEVUFMX09ORERPVCwKK307CitzdGF0aWMgZW51bSBkdWFsIGR1YWxfbW9kZSA9IERVQUxfT0ZGOwkvKiBkdWFsLWluc3RydWN0aW9uIG1vZGUgKi8KKworc3RhdGljIHZvaWQKK3NfZHVhbCAoKQkJCS8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBoYXZlIGR1YWwgc2V0ICovCit7CisgIGR1YWxfbW9kZSA9IERVQUxfT047Cit9CisKK3N0YXRpYyB2b2lkCitzX2VuZGR1YWwgKCkJCQkvKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgaGF2ZSBkdWFsIHNldCAqLworeworICBkdWFsX21vZGUgPSBEVUFMX09GRjsKK30KKworc3RhdGljIGludCBhdG1wID0gMzE7CQkvKiB0ZW1wb3JhcnkgcmVnaXN0ZXIgZm9yIHBzZXVkbydzICovCisKK3N0YXRpYyB2b2lkCitzX2F0bXAgKCkKK3sKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzcCIsIDIpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisgICAgICBhdG1wID0gMjsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImZwIiwgMikgPT0gMCkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKyAgICAgIGF0bXAgPSAzOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiciIsIDEpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDE7CisgICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBpZiAodGVtcCA+PSAwICYmIHRlbXAgPD0gMzEpCisJYXRtcCA9IHRlbXA7CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiKSk7CisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCisgICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCit2b2lkCittZF9iZWdpbiAoKQoreworICByZWdpc3RlciBjaGFyICpyZXR2YWwgPSBOVUxMOworICBpbnQgbG9zZSA9IDA7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKKworICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgd2hpbGUgKGkgPCBOVU1PUENPREVTKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBpODYwX29wY29kZXNbaV0ubmFtZTsKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmaTg2MF9vcGNvZGVzW2ldKTsKKyAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKKwkJICAgaTg2MF9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7CisJICBsb3NlID0gMTsKKwl9CisgICAgICBkbworCXsKKwkgIGlmIChpODYwX29wY29kZXNbaV0ubWF0Y2ggJiBpODYwX29wY29kZXNbaV0ubG9zZSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKKwkJICAgICAgIGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCBpODYwX29wY29kZXNbaV0uYXJncyk7CisJICAgICAgbG9zZSA9IDE7CisJICAgIH0KKwkgICsraTsKKwl9CisgICAgICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMKKwkgICAgICYmICFzdHJjbXAgKGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7CisgICAgfQorCisgIGlmIChsb3NlKQorICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKKworICBmb3IgKGkgPSAnMCc7IGkgPCAnOCc7ICsraSkKKyAgICBvY3RhbFtpXSA9IDE7CisgIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7ICsraSkKKyAgICB0b0hleFtpXSA9IGkgLSAnMCc7CisgIGZvciAoaSA9ICdhJzsgaSA8PSAnZic7ICsraSkKKyAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdhJzsKKyAgZm9yIChpID0gJ0EnOyBpIDw9ICdGJzsgKytpKQorICAgIHRvSGV4W2ldID0gaSArIDEwIC0gJ0EnOworfQorCit2b2lkCittZF9hc3NlbWJsZSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNoYXIgKnRvUDsKKyAgaW50IHJzZDsKKyAgaW50IG5vX29wY29kZXMgPSAxOworICBpbnQgaTsKKyAgc3RydWN0IGk4NjBfaXQgcHNldWRvWzNdOworCisgIGFzc2VydCAoc3RyKTsKKyAgaTg2MF9pcCAoc3RyKTsKKworICAvKiBjaGVjayBmb3IgZXhwYW5kYWJsZSBmbGFnIHRvIHByb2R1Y2UgcHNldWRvLWluc3RydWN0aW9ucyAqLworICBpZiAodGhlX2luc24uZXhwYW5kICE9IDAgJiYgdGhlX2luc24uaGlnaGxvdyA9PSBOT19TUEVDKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJcHNldWRvW2ldID0gdGhlX2luc247CisKKyAgICAgIHN3aXRjaCAodGhlX2luc24uZXhwYW5kKQorCXsKKworCWNhc2UgRV9ERUxBWToKKwkgIG5vX29wY29kZXMgPSAxOworCSAgYnJlYWs7CisKKwljYXNlIEVfTU9WOgorCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgorCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCisJICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNSkgJiYKKwkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAtKDEgPDwgMTUpKSkKKwkgICAgYnJlYWs7CisJICAvKiBvciBsJWNvbnN0LHIwLGlyZWdfZGVzdCAqLworCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZTQwMDAwMDA7CisJICBwc2V1ZG9bMF0uaGlnaGxvdyA9IFBBSVI7CisJICAvKiBvcmggaCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0ICovCisJICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNmZmZmZmYpIHwgMHhlYzAwMDAwMCB8CisJICAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7CisJICBwc2V1ZG9bMV0uaGlnaGxvdyA9IEhJR0g7CisJICBub19vcGNvZGVzID0gMjsKKwkgIGJyZWFrOworCisJY2FzZSBFX0FERFI6CisJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCisJICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwpCisJICAgIGJyZWFrOworCSAgLyogb3JoIGhhJWFkZHJfZXhwcixyMCxyMzEgKi8KKwkgIHBzZXVkb1swXS5vcGNvZGUgPSAweGVjMDAwMDAwIHwgKGF0bXAgPDwgMTYpOworCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIQURKOworCSAgcHNldWRvWzBdLnJlbG9jID0gTE9XMDsJLyogbXVzdCBvdmVyd3JpdGUgKi8KKwkgIC8qIGwlYWRkcl9leHByKHIzMSksaXJlZ19kZXN0ICovCisJICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIH4weDAwM2UwMDAwKSB8IChhdG1wIDw8IDIxKTsKKwkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKKwkgIG5vX29wY29kZXMgPSAyOworCSAgYnJlYWs7CisKKwljYXNlIEVfVTMyOgkJLyogMm5kIHZlcnNpb24gZW11bGF0ZXMgSW50ZWwgYXMsIG5vdCBkb2MuICovCisJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCisJICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKKwkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE2KSAmJgorCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IDApKQorCSAgICBicmVhazsKKwkgIC8qICQob3Bjb2RlKWggaCVjb25zdCxpcmVnX3NyYzIsaXJlZ19kZXN0CisJCQkgICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjNmZmZmZmYpIHwgMHgwYzAwMDAwMDsgKi8KKwkgIC8qICQob3Bjb2RlKWggaCVjb25zdCxpcmVnX3NyYzIscjMxICovCisJICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjNlMGZmZmYpIHwgMHgwYzAwMDAwMCB8CisJICAgIChhdG1wIDw8IDE2KTsKKwkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSDsKKwkgIC8qICQob3Bjb2RlKSBsJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QKKwkJCSAgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHhmMDFmMDAwMCkgfCAweDA0MDAwMDAwIHwKKwkJCSAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7ICovCisJICAvKiAkKG9wY29kZSkgbCVjb25zdCxyMzEsaXJlZ19kZXN0ICovCisJICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjAxZjAwMDApIHwgMHgwNDAwMDAwMCB8CisJICAgIChhdG1wIDw8IDIxKTsKKwkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKKwkgIG5vX29wY29kZXMgPSAyOworCSAgYnJlYWs7CisKKwljYXNlIEVfQU5EOgkJLyogMm5kIHZlcnNpb24gZW11bGF0ZXMgSW50ZWwgYXMsIG5vdCBkb2MuICovCisJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCisJICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKKwkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE2KSAmJgorCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IDApKQorCSAgICBicmVhazsKKwkgIC8qIGFuZG5vdCBoJWNvbnN0LGlyZWdfc3JjMixpcmVnX2Rlc3QKKwkJCSAgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2ZmZmZmZikgfCAweGQ0MDAwMDAwOyAqLworCSAgLyogYW5kbm90IGglY29uc3QsaXJlZ19zcmMyLHIzMSAqLworCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZTBmZmZmKSB8IDB4ZDQwMDAwMDAgfAorCSAgICAoYXRtcCA8PCAxNik7CisJICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7CisJICBwc2V1ZG9bMF0uZXhwLlhfYWRkX251bWJlciA9IC0xIC0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKKwkgIC8qIGFuZG5vdCBsJWNvbnN0LGlyZWdfZGVzdCxpcmVnX2Rlc3QKKwkJCSAgIHBzZXVkb1sxXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGQ0MDAwMDAwIHwKKwkJCSAgICgodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgPDwgNSk7ICovCisJICAvKiBhbmRub3QgbCVjb25zdCxyMzEsaXJlZ19kZXN0ICovCisJICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhkNDAwMDAwMCB8CisJICAgIChhdG1wIDw8IDIxKTsKKwkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKKwkgIHBzZXVkb1sxXS5leHAuWF9hZGRfbnVtYmVyID0gLTEgLSB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyOworCSAgbm9fb3Bjb2RlcyA9IDI7CisJICBicmVhazsKKworCWNhc2UgRV9TMzI6CisJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbCA9PSBOVUxMICYmCisJICAgICAgdGhlX2luc24uZXhwLlhfb3Bfc3ltYm9sID09IE5VTEwgJiYKKwkgICAgICAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8ICgxIDw8IDE1KSAmJgorCSAgICAgICB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49IC0oMSA8PCAxNSkpKQorCSAgICBicmVhazsKKwkgIC8qIG9yaCBoJWNvbnN0LHIwLHIzMSAqLworCSAgcHNldWRvWzBdLm9wY29kZSA9IDB4ZWMwMDAwMDAgfCAoYXRtcCA8PCAxNik7CisJICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7CisJICAvKiBvciBsJWNvbnN0LHIzMSxyMzEgKi8KKwkgIHBzZXVkb1sxXS5vcGNvZGUgPSAweGU0MDAwMDAwIHwgKGF0bXAgPDwgMjEpIHwgKGF0bXAgPDwgMTYpOworCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBQQUlSOworCSAgLyogcjMxLGlyZWdfc3JjMixpcmVnX2Rlc3QgKi8KKwkgIHBzZXVkb1syXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgfjB4MDQwMGZmZmYpIHwgKGF0bXAgPDwgMTEpOworCSAgcHNldWRvWzJdLnJlbG9jID0gTk9fUkVMT0M7CisJICBub19vcGNvZGVzID0gMzsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKKwl9CisKKyAgICAgIHRoZV9pbnNuID0gcHNldWRvWzBdOworICAgICAgLyogY2hlY2sgZm9yIGV4cGFuZGVkIG9wY29kZSBhZnRlciBicmFuY2ggb3IgaW4gZHVhbCAqLworICAgICAgaWYgKG5vX29wY29kZXMgPiAxICYmIGxhc3RfZXhwYW5kID09IDEpCisJYXNfd2FybiAoXygiRXhwYW5kZWQgb3Bjb2RlIGFmdGVyIGRlbGF5ZWQgYnJhbmNoOiBgJXMnIiksIHN0cik7CisgICAgICBpZiAobm9fb3Bjb2RlcyA+IDEgJiYgZHVhbF9tb2RlICE9IERVQUxfT0ZGKQorCWFzX3dhcm4gKF8oIkV4cGFuZGVkIG9wY29kZSBpbiBkdWFsIG1vZGU6IGAlcyciKSwgc3RyKTsKKyAgICB9CisKKyAgaSA9IDA7CisgIGRvCisgICAgewkJCQkvKiBhbHdheXMgcHJvZHVjZSBhdCBsZWFzdCBvbmUgb3Bjb2RlICovCisgICAgICB0b1AgPSBmcmFnX21vcmUgKDQpOworICAgICAgLyogcHV0IG91dCB0aGUgb3Bjb2RlICovCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKKworICAgICAgLyogY2hlY2sgZm9yIGV4cGFuZGVkIG9wY29kZSBhZnRlciBicmFuY2ggb3IgaW4gZHVhbCAqLworICAgICAgbGFzdF9leHBhbmQgPSB0aGVfaW5zbi5wY3JlbDsKKworICAgICAgLyogcHV0IG91dCB0aGUgc3ltYm9sLWRlcGVuZGVudCBzdHVmZiAqLworICAgICAgaWYgKHRoZV9pbnNuLnJlbG9jICE9IE5PX1JFTE9DKQorCXsKKwkgIGZpeF9uZXcgKGZyYWdfbm93LAkvKiB3aGljaCBmcmFnICovCisJCSAgICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCS8qIHdoZXJlICovCisJCSAgIDQsCQkvKiBzaXplICovCisJCSAgICZ0aGVfaW5zbi5leHAsCisJCSAgIHRoZV9pbnNuLnBjcmVsLAorCSAgLyogbWVyZ2UgYml0IGZpZWxkcyBpbnRvIG9uZSBhcmd1bWVudCAqLworCSAgKGludCkgKCgodGhlX2luc24uaGlnaGxvdyAmIDB4MykgPDwgNCkgfCAodGhlX2luc24ucmVsb2MgJiAweGYpKSk7CisJfQorICAgICAgdGhlX2luc24gPSBwc2V1ZG9bKytpXTsKKyAgICB9CisgIHdoaWxlICgtLW5vX29wY29kZXMgPiAwKTsKKworfQorCitzdGF0aWMgdm9pZAoraTg2MF9pcCAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmFyZ3M7CisgIGNoYXIgYzsKKyAgdW5zaWduZWQgbG9uZyBpOworICBzdHJ1Y3QgaTg2MF9vcGNvZGUgKmluc247CisgIGNoYXIgKmFyZ3NTdGFydDsKKyAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisgIHVuc2lnbmVkIGludCBtYXNrOworICBpbnQgbWF0Y2ggPSAwOworICBpbnQgY29tbWEgPSAwOworCisKKyAgZm9yIChzID0gc3RyOyBpc2xvd2VyICgqcykgfHwgKnMgPT0gJy4nIHx8ICpzID09ICczJzsgKytzKQorICAgIDsKKyAgc3dpdGNoICgqcykKKyAgICB7CisKKyAgICBjYXNlICdcMCc6CisgICAgICBicmVhazsKKworICAgIGNhc2UgJywnOgorICAgICAgY29tbWEgPSAxOworCisgICAgICAvKkZBTExUSFJPVUdIKi8KKworICAgIGNhc2UgJyAnOgorICAgICAgKnMrKyA9ICdcMCc7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19mYXRhbCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKKyAgICB9CisKKyAgaWYgKHN0cm5jbXAgKHN0ciwgImQuIiwgMikgPT0gMCkKKyAgICB7CQkJCS8qIGNoZWNrIGZvciBkLiBvcGNvZGUgcHJlZml4ICovCisgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfT04pCisJZHVhbF9tb2RlID0gRFVBTF9PTkRET1Q7CisgICAgICBlbHNlCisJZHVhbF9tb2RlID0gRFVBTF9ERE9UOworICAgICAgc3RyICs9IDI7CisgICAgfQorCisgIGlmICgoaW5zbiA9IChzdHJ1Y3QgaTg2MF9vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChkdWFsX21vZGUgPT0gRFVBTF9ERE9UIHx8IGR1YWxfbW9kZSA9PSBEVUFMX09ORERPVCkKKwlzdHIgLT0gMjsKKyAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmIChjb21tYSkKKyAgICB7CisgICAgICAqLS1zID0gJywnOworICAgIH0KKyAgYXJnc1N0YXJ0ID0gczsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKKyAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7CisgICAgICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOworCisgICAgICAvKgorCQkgKiBCdWlsZCB0aGUgb3Bjb2RlLCBjaGVja2luZyBhcyB3ZSBnbyB0byBtYWtlCisJCSAqIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2gKKwkJICovCisgICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQorCXsKKwkgIHN3aXRjaCAoKmFyZ3MpCisJICAgIHsKKworCSAgICBjYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLworCSAgICAgIGlmICgqcyA9PSAnXDAnKQorCQl7CisJCSAgbWF0Y2ggPSAxOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnKyc6CisJICAgIGNhc2UgJygnOgkJLyogdGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5ICovCisJICAgIGNhc2UgJyknOgorCSAgICBjYXNlICcsJzoKKwkgICAgY2FzZSAnICc6CisJICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCisJCWNvbnRpbnVlOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJyMnOgkJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KKwkgICAgICBpZiAoaXNkaWdpdCAoKnMrKykpCisJCXsKKwkJICB3aGlsZSAoaXNkaWdpdCAoKnMpKQorCQkgICAgeworCQkgICAgICArK3M7CisJCSAgICB9CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICcxJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgcmVnaXN0ZXIgKi8KKwkgICAgY2FzZSAnMic6CisJICAgIGNhc2UgJ2QnOgorCSAgICAgIHN3aXRjaCAoKnMpCisJCXsKKworCQljYXNlICdmJzoJLyogZnJhbWUgcG9pbnRlciAqLworCQkgIHMrKzsKKwkJICBpZiAoKnMrKyA9PSAncCcpCisJCSAgICB7CisJCSAgICAgIG1hc2sgPSAweDM7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGdvdG8gZXJyb3I7CisKKwkJY2FzZSAncyc6CS8qIHN0YWNrIHBvaW50ZXIgKi8KKwkJICBzKys7CisJCSAgaWYgKCpzKysgPT0gJ3AnKQorCQkgICAgeworCQkgICAgICBtYXNrID0gMHgyOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBnb3RvIGVycm9yOworCisJCWNhc2UgJ3InOgkvKiBhbnkgcmVnaXN0ZXIgKi8KKwkJICBzKys7CisJCSAgaWYgKCFpc2RpZ2l0IChjID0gKnMrKykpCisJCSAgICB7CisJCSAgICAgIGdvdG8gZXJyb3I7CisJCSAgICB9CisJCSAgaWYgKGlzZGlnaXQgKCpzKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKChjID0gMTAgKiAoYyAtICcwJykgKyAoKnMrKyAtICcwJykpID49IDMyKQorCQkJeworCQkJICBnb3RvIGVycm9yOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYyAtPSAnMCc7CisJCSAgICB9CisJCSAgbWFzayA9IGM7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoJLyogbm90IHRoaXMgb3Bjb2RlICovCisJCSAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgIC8qCisJCQkJICogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKKwkJCQkgKiBpdCBnb2VzIGluIHRoZSBvcGNvZGUuCisJCQkJICovCisJICAgICAgc3dpdGNoICgqYXJncykKKwkJeworCisJCWNhc2UgJzEnOgorCQkgIG9wY29kZSB8PSBtYXNrIDw8IDExOworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgJzInOgorCQkgIG9wY29kZSB8PSBtYXNrIDw8IDIxOworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgJ2QnOgorCQkgIG9wY29kZSB8PSBtYXNrIDw8IDE2OworCQkgIGNvbnRpbnVlOworCisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdlJzoJCS8qIG5leHQgb3BlcmFuZCBpcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCisJICAgIGNhc2UgJ2YnOgorCSAgICBjYXNlICdnJzoKKwkgICAgICBpZiAoKnMrKyA9PSAnZicgJiYgaXNkaWdpdCAoKnMpKQorCQl7CisJCSAgbWFzayA9ICpzKys7CisJCSAgaWYgKGlzZGlnaXQgKCpzKSkKKwkJICAgIHsKKwkJICAgICAgbWFzayA9IDEwICogKG1hc2sgLSAnMCcpICsgKCpzKysgLSAnMCcpOworCQkgICAgICBpZiAobWFzayA+PSAzMikKKwkJCXsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBtYXNrIC09ICcwJzsKKwkJICAgIH0KKwkJICBzd2l0Y2ggKCphcmdzKQorCQkgICAgeworCisJCSAgICBjYXNlICdlJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTE7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICdmJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjE7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICdnJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTY7CisJCSAgICAgIGlmIChkdWFsX21vZGUgIT0gRFVBTF9PRkYpCisJCQlvcGNvZGUgfD0gKDEgPDwgOSk7CS8qIGR1YWwgbW9kZSBpbnN0cnVjdGlvbiAqLworCQkgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfRERPVCkKKwkJCWR1YWxfbW9kZSA9IERVQUxfT0ZGOworCQkgICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfT05ERE9UKQorCQkJZHVhbF9tb2RlID0gRFVBTF9PTjsKKwkJICAgICAgaWYgKChvcGNvZGUgJiAoMSA8PCAxMCkpICYmIChtYXNrID09ICgob3Bjb2RlID4+IDExKSAmIDB4MWYpKSkKKwkJCWFzX3dhcm4gKF8oIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIpKTsKKwkJICAgICAgY29udGludWU7CisJCSAgICB9CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdjJzoJCS8qIG5leHQgb3BlcmFuZCBtdXN0IGJlIGEgY29udHJvbCByZWdpc3RlciAqLworCSAgICAgIGlmIChzdHJuY21wIChzLCAiZmlyIiwgMykgPT0gMCkKKwkJeworCQkgIG9wY29kZSB8PSAweDAgPDwgMjE7CisJCSAgcyArPSAzOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICJwc3IiLCAzKSA9PSAwKQorCQl7CisJCSAgb3Bjb2RlIHw9IDB4MSA8PCAyMTsKKwkJICBzICs9IDM7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBpZiAoc3RybmNtcCAocywgImRpcmJhc2UiLCA3KSA9PSAwKQorCQl7CisJCSAgb3Bjb2RlIHw9IDB4MiA8PCAyMTsKKwkJICBzICs9IDc7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBpZiAoc3RybmNtcCAocywgImRiIiwgMikgPT0gMCkKKwkJeworCQkgIG9wY29kZSB8PSAweDMgPDwgMjE7CisJCSAgcyArPSAyOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICJmc3IiLCAzKSA9PSAwKQorCQl7CisJCSAgb3Bjb2RlIHw9IDB4NCA8PCAyMTsKKwkJICBzICs9IDM7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBpZiAoc3RybmNtcCAocywgImVwc3IiLCA0KSA9PSAwKQorCQl7CisJCSAgb3Bjb2RlIHw9IDB4NSA8PCAyMTsKKwkJICBzICs9IDQ7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICc1JzoJCS8qIDUgYml0IGltbWVkaWF0ZSBpbiBzcmMxICovCisJICAgICAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKKwkgICAgICBpZiAoIWdldEV4cHJlc3Npb24gKHMpKQorCQl7CisJCSAgcyA9IGV4cHJfZW5kOworCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgfjB4MWYpCisJCSAgICBhc19iYWQgKF8oIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiKSk7CisJCSAgb3Bjb2RlIHw9ICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgMHgxZikgPDwgMTE7CisJCSAgbWVtc2V0ICgmdGhlX2luc24sICdcMCcsIHNpemVvZiAodGhlX2luc24pKTsKKwkJICB0aGVfaW5zbi5yZWxvYyA9IE5PX1JFTE9DOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnbCc6CQkvKiAyNiBiaXQgaW1tZWRpYXRlLCByZWxhdGl2ZSBicmFuY2ggKi8KKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJSQUREUjsKKwkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAncyc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBzcGxpdCByZWxhdGl2ZSBicmFuY2ggKi8KKwkgICAgICAvKiB1cHBlciA1IGJpdHMgb2Ygb2Zmc2V0IGluIGRlc3QgZmllbGQgKi8KKwkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7CisJICAgICAgdGhlX2luc24ucmVsb2MgPSBTUExJVDA7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAnUyc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBzcGxpdCAoc3QpLCBhbGlnbmVkICovCisJICAgICAgaWYgKG9wY29kZSAmICgxIDw8IDI4KSkKKwkJaWYgKG9wY29kZSAmIDB4MSkKKwkJICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMjsKKwkJZWxzZQorCQkgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQxOworCSAgICAgIGVsc2UKKwkJdGhlX2luc24ucmVsb2MgPSBTUExJVDA7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAnSSc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkICovCisJICAgICAgaWYgKG9wY29kZSAmICgxIDw8IDI4KSkKKwkJaWYgKG9wY29kZSAmIDB4MSkKKwkJICB0aGVfaW5zbi5yZWxvYyA9IExPVzI7CisJCWVsc2UKKwkJICB0aGVfaW5zbi5yZWxvYyA9IExPVzE7CisJICAgICAgZWxzZQorCQl0aGVfaW5zbi5yZWxvYyA9IExPVzA7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAnaSc6CQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCisJICAgICAgdGhlX2luc24ucmVsb2MgPSBMT1cwOworCisJICAgICAgLypGQUxMVEhST1VHSCovCisKKwkgICAgaW1tZWRpYXRlOgorCSAgICAgIGlmICgqcyA9PSAnICcpCisJCXMrKzsKKwkgICAgICBpZiAoc3RybmNtcCAocywgImhhJSIsIDMpID09IDApCisJCXsKKwkJICB0aGVfaW5zbi5oaWdobG93ID0gSElHSEFESjsKKwkJICBzICs9IDM7CisJCX0KKwkgICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiaCUiLCAyKSA9PSAwKQorCQl7CisJCSAgdGhlX2luc24uaGlnaGxvdyA9IEhJR0g7CisJCSAgcyArPSAyOworCQl9CisJICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImwlIiwgMikgPT0gMCkKKwkJeworCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBQQUlSOworCQkgIHMgKz0gMjsKKwkJfQorCSAgICAgIHRoZV9pbnNuLmV4cGFuZCA9IGluc24tPmV4cGFuZDsKKworCSAgICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZ2V0RXhwcmVzc2lvbigpIGZhaWxzLCB3ZSB3aWxsIHN0aWxsIGhhdmUKKwkJCQkgICBjcmVhdGVkIFUgZW50cmllcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgJ3N5bWJvbHMnCisJCQkJICAgaW4gdGhlIGlucHV0IHN0cmluZy4gIFRyeSBub3QgdG8gY3JlYXRlIFUgc3ltYm9scyBmb3IKKwkJCQkgICByZWdpc3RlcnMsIGV0Yy4gKi8KKworCSAgICAgIGlmICghZ2V0RXhwcmVzc2lvbiAocykpCisJCXsKKwkJICBzID0gZXhwcl9lbmQ7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIGVycm9yOgorICAgICAgaWYgKG1hdGNoID09IDApCisJeworCSAgLyogQXJncyBkb24ndCBtYXRjaC4gICovCisJICBpZiAoJmluc25bMV0gLSBpODYwX29wY29kZXMgPCBOVU1PUENPREVTCisJICAgICAgJiYgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKKwkgICAgeworCSAgICAgICsraW5zbjsKKwkgICAgICBzID0gYXJnc1N0YXJ0OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHMiKSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKK30KKworc3RhdGljIGludAorZ2V0RXhwcmVzc2lvbiAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNoYXIgKnNhdmVfaW47CisgIHNlZ1Qgc2VnOworCisgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKyAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7CisgIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IHVuZGVmaW5lZF9zZWN0aW9uCisgICAgICAmJiAhIFNFR19OT1JNQUwgKHNlZykpCisgICAgeworICAgICAgdGhlX2luc24uZXJyb3IgPSBfKCJiYWQgc2VnbWVudCIpOworICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKyAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG1kX2F0b2YgaW4gbTY4ay5jLiAgSSB0aGluayB0aGlzIGlzIHJpZ2h0LAorICBidXQgSSdtIG5vdCBzdXJlLgorCisgIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCisgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKKyAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCisgICovCisKKy8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBjaGFyIHR5cGU7CisgICAgIGNoYXIgKmxpdFA7CisgICAgIGludCAqc2l6ZVA7Cit7CisgIGludCBwcmVjOworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107CisgIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKKyAgY2hhciAqdDsKKyAgY2hhciAqYXRvZl9pZWVlICgpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdTJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICBjYXNlICdyJzoKKyAgICBjYXNlICdSJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd4JzoKKyAgICBjYXNlICdYJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdwJzoKKyAgICBjYXNlICdQJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKnNpemVQID0gMDsKKyAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKKyAgICB9CisgIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOworICBpZiAodCkKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OworICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYmlnLWVuZGlhbi4KKyAqLwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKKyAgICAgY2hhciAqYnVmOworICAgICB2YWx1ZVQgdmFsOworICAgICBpbnQgbjsKK3sKKyAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOworfQorCit2b2lkCittZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbiwgZml4UCkKKyAgICAgY2hhciAqYnVmOworICAgICBsb25nIHZhbDsKKyAgICAgaW50IG47CisgICAgIGZpeFMgKmZpeFA7Cit7CisgIGVudW0gcmVsb2NfdHlwZSByZWxvYyA9IGZpeFAtPmZ4X3JfdHlwZSAmIDB4ZjsKKyAgZW51bSBoaWdobG93X3R5cGUgaGlnaGxvdyA9IChmaXhQLT5meF9yX3R5cGUgPj4gNCkgJiAweDM7CisKKyAgYXNzZXJ0IChidWYpOworICBhc3NlcnQgKG4gPT0gNCk7CQkvKiBhbHdheXMgb24gaTg2MCAqLworCisgIHN3aXRjaCAoaGlnaGxvdykKKyAgICB7CisKKyAgICBjYXNlIEhJR0hBREo6CQkvKiBhZGp1c3RzIHRoZSBoaWdoLW9yZGVyIDE2LWJpdHMgKi8KKyAgICAgIGlmICh2YWwgJiAoMSA8PCAxNSkpCisJdmFsICs9ICgxIDw8IDE2KTsKKworICAgICAgLypGQUxMVEhST1VHSCovCisKKyAgICBjYXNlIEhJR0g6CQkJLyogc2VsZWN0cyB0aGUgaGlnaC1vcmRlciAxNi1iaXRzICovCisgICAgICB2YWwgPj49IDE2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBSVI6CQkJLyogc2VsZWN0cyB0aGUgbG93LW9yZGVyIDE2LWJpdHMgKi8KKyAgICAgIHZhbCA9IHZhbCAmIDB4ZmZmZjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzd2l0Y2ggKHJlbG9jKQorICAgIHsKKworICAgIGNhc2UgQlJBRERSOgkJLyogYnIsY2FsbCxiYyxiYy50LGJuYyxibmMudCB3LzI2LWJpdCBpbW1lZGlhdGUgKi8KKyAgICAgIGlmIChmaXhQLT5meF9wY3JlbCAhPSAxKQorCWFzX2JhZCAoXygiMjYtYml0IGJyYW5jaCB3L28gcGMgcmVsYXRpdmUgc2V0OiAweCUwOHgiKSwgdmFsKTsKKyAgICAgIHZhbCA+Pj0gMjsJCS8qIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbCAqLworCisgICAgICBpZiAodmFsID49ICgxIDw8IDI1KSB8fCB2YWwgPCAtKDEgPDwgMjUpKQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwlhc19iYWQgKF8oIjI2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiKSwgdmFsKTsKKyAgICAgIGJ1ZlswXSA9IChidWZbMF0gJiAweGZjKSB8ICgodmFsID4+IDI0KSAmIDB4Myk7CisgICAgICBidWZbMV0gPSB2YWwgPj4gMTY7CisgICAgICBidWZbMl0gPSB2YWwgPj4gODsKKyAgICAgIGJ1ZlszXSA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTUExJVDI6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCA0LWJ5dGUgYWxpZ25lZCAqLworICAgICAgaWYgKHZhbCAmIDB4MykKKwlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7CisgICAgICB2YWwgJj0gfjB4MzsJCS8qIDQtYnl0ZSBhbGlnbiB2YWx1ZSAqLworICAgICAgLypGQUxMVEhST1VHSCovCisgICAgY2FzZSBTUExJVDE6CQkvKiAxNiBiaXQgaW1tZWRpYXRlLCAyLWJ5dGUgYWxpZ25lZCAqLworICAgICAgaWYgKHZhbCAmIDB4MSkKKwlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7CisgICAgICB2YWwgJj0gfjB4MTsJCS8qIDItYnl0ZSBhbGlnbiB2YWx1ZSAqLworICAgICAgLypGQUxMVEhST1VHSCovCisgICAgY2FzZSBTUExJVDA6CQkvKiBzdCxibGEsYnRlLGJ0bmUgdy8xNi1iaXQgaW1tZWRpYXRlICovCisgICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgPT0gMSkKKwl2YWwgPj49IDI7CQkvKiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwgKi8KKyAgICAgIC8qIGNoZWNrIGZvciBib3VuZHMgKi8KKyAgICAgIGlmIChoaWdobG93ICE9IFBBSVIgJiYgKHZhbCA+PSAoMSA8PCAxNikgfHwgdmFsIDwgLSgxIDw8IDE1KSkpCisJYXNfYmFkIChfKCIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7CisgICAgICBidWZbMV0gPSAoYnVmWzFdICYgfjB4MWYpIHwgKCh2YWwgPj4gMTEpICYgMHgxZik7CisgICAgICBidWZbMl0gPSAoYnVmWzJdICYgfjB4NykgfCAoKHZhbCA+PiA4KSAmIDB4Nyk7CisgICAgICBidWZbM10gfD0gdmFsOwkJLyogcGVyc2VydmUgYm90dG9tIG9wY29kZSBiaXRzICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9XNDoJCQkvKiBmbGQscGZsZCxwc3QsZmx1c2ggMTYtYnl0ZSBhbGlnbmVkICovCisgICAgICBpZiAodmFsICYgMHhmKQorCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAxNi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7CisgICAgICB2YWwgJj0gfjB4ZjsJCS8qIDE2LWJ5dGUgYWxpZ24gdmFsdWUgKi8KKyAgICAgIC8qRkFMTFRIUk9VR0gqLworICAgIGNhc2UgTE9XMzoJCQkvKiBmbGQscGZsZCxwc3QsZmx1c2ggOC1ieXRlIGFsaWduZWQgKi8KKyAgICAgIGlmICh2YWwgJiAweDcpCisJYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOworICAgICAgdmFsICY9IH4weDc7CQkvKiA4LWJ5dGUgYWxpZ24gdmFsdWUgKi8KKyAgICAgIC8qRkFMTFRIUk9VR0gqLworICAgIGNhc2UgTE9XMjoJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCA0LWJ5dGUgYWxpZ25lZCAqLworICAgICAgaWYgKHZhbCAmIDB4MykKKwlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7CisgICAgICB2YWwgJj0gfjB4MzsJCS8qIDQtYnl0ZSBhbGlnbiB2YWx1ZSAqLworICAgICAgLypGQUxMVEhST1VHSCovCisgICAgY2FzZSBMT1cxOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIDItYnl0ZSBhbGlnbmVkICovCisgICAgICBpZiAodmFsICYgMHgxKQorCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSAyLWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKKyAgICAgIHZhbCAmPSB+MHgxOwkJLyogMi1ieXRlIGFsaWduIHZhbHVlICovCisgICAgICAvKkZBTExUSFJPVUdIKi8KKyAgICBjYXNlIExPVzA6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgYnl0ZSBhbGlnbmVkICovCisgICAgICAvKiBjaGVjayBmb3IgYm91bmRzICovCisgICAgICBpZiAoaGlnaGxvdyAhPSBQQUlSICYmICh2YWwgPj0gKDEgPDwgMTYpIHx8IHZhbCA8IC0oMSA8PCAxNSkpKQorCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7CisgICAgICBidWZbMl0gPSB2YWwgPj4gODsKKyAgICAgIGJ1ZlszXSB8PSB2YWw7CQkvKiBwZXJzZXJ2ZSBib3R0b20gb3Bjb2RlIGJpdHMgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOT19SRUxPQzoKKyAgICBkZWZhdWx0OgorICAgICAgYXNfYmFkIChfKCJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwgcmVsb2MpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCit2b2lkCittZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgbG9uZyB2YWw7Cit7CisgIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZGlzcFxuIikpOworfQorCisvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCit2b2lkCittZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBmaXgpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgbG9uZyB2YWw7CisgICAgIHZvaWQgKmZpeDsKK3sKKyAgYXNfZmF0YWwgKF8oImk4NjBfbnVtYmVyX3RvX2ZpZWxkXG4iKSk7Cit9CisKKy8qIHRoZSBiaXQtZmllbGQgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbl9pbmZvIHN0cnVjdCBwbGF5cyBoZWxsCisgICB3aXRoIHRoZSBieXRlLW9yZGVyIHByb2JsZW1zIG9mIGNyb3NzLWFzc2VtYmx5LiAgU28gYXMgYSBoYWNrLAorICAgSSBhZGRlZCB0aGlzIG1hY2guIGRlcGVuZGVudCByaSB0d2lkZGxlci4gIFVnbHksIGJ1dCBpdCBnZXRzCisgICB5b3UgdGhlcmUuIC1LV0sgKi8KKy8qIG9uIGk4NjA6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKKyAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKKyAgIGJpdCA3IGFzIHBjcmVsLCBiaXQgNiBhcyBleHRlcm4sIGFuZCB0aGUgbG93ZXIgc2l4IGJpdHMgYXMKKyAgIHJlbG9jYXRpb24gdHlwZSAoaGlnaGxvdyA1LTQpLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KKy8qIFRoYW54IGFuZCBhIHRpcCBvZiB0aGUgaGF0IHRvIE1pY2hhZWwgQmxvb20sIG1iQHR0aWRjYS50dGkuY29tICovCit2b2lkCittZF9yaV90b19jaGFycyAocmlfcCwgcmkpCisgICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpX3AsIHJpOworeworI2lmIDAKKyAgdW5zaWduZWQgY2hhciB0aGVfYnl0ZXNbc2l6ZW9mICgqcmlfcCldOworCisgIC8qIHRoaXMgaXMgZWFzeSAqLworICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICB0aGVfYnl0ZXNbNF0gPSAocmkucl9pbmRleCA+PiAxNikgJiAweDBmZjsKKyAgdGhlX2J5dGVzWzVdID0gKHJpLnJfaW5kZXggPj4gOCkgJiAweDBmZjsKKyAgdGhlX2J5dGVzWzZdID0gcmkucl9pbmRleCAmIDB4MGZmOworICB0aGVfYnl0ZXNbN10gPSAoKHJpLnJfZXh0ZXJuIDw8IDcpICYgMHg4MCkgfCAoMCAmIDB4NjApIHwgKHJpLnJfdHlwZSAmIDB4MUYpOworICAvKiBBbHNvIGVhc3kgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICgmdGhlX2J5dGVzWzhdLCByaS5yX2FkZGVuZCwgc2l6ZW9mIChyaS5yX2FkZGVuZCkpOworICAvKiBub3cgcHV0IGl0IGJhY2sgd2hlcmUgeW91IGZvdW5kIGl0LCBKdW5pb3IuLi4gKi8KKyAgbWVtY3B5ICgoY2hhciAqKSByaV9wLCB0aGVfYnl0ZXMsIHNpemVvZiAoKnJpX3ApKTsKKyNlbmRpZgorfQorCisvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBpODYwICovCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCisgICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOworICAgICBzZWdUIHNlZzsKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworeworICBhc19mYXRhbCAoXygiaTg2MF9jb252ZXJ0X2ZyYWdcbiIpKTsKK30KKworLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgICAgc2VnVCBzZWd0eXBlOworeworICBhc19mYXRhbCAoXygiaTg2MF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIikpOworfQorCisvKiBmb3IgZGVidWdnaW5nIG9ubHksIG11c3QgbWF0Y2ggZW51bSByZWxvY190eXBlICovCitzdGF0aWMgY2hhciAqUmVsb2NbXSA9Cit7CisgICJOT19SRUxPQyIsCisgICJCUkFERFIiLAorICAiTE9XMCIsCisgICJMT1cxIiwKKyAgIkxPVzIiLAorICAiTE9XMyIsCisgICJMT1c0IiwKKyAgIlNQTElUMCIsCisgICJTUExJVDEiLAorICAiU1BMSVQyIiwKKyAgIlJFTE9DXzMyIiwKK307CitzdGF0aWMgY2hhciAqSGlnaGxvd1tdID0KK3sKKyAgIk5PX1NQRUMiLAorICAiUEFJUiIsCisgICJISUdIIiwKKyAgIkhJR0hBREoiLAorfTsKK3N0YXRpYyB2b2lkCitwcmludF9pbnNuIChpbnNuKQorICAgICBzdHJ1Y3QgaTg2MF9pdCAqaW5zbjsKK3sKKyAgaWYgKGluc24tPmVycm9yKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiAlc1xuIik7CisgICAgfQorICBmcHJpbnRmIChzdGRlcnIsICJvcGNvZGU9MHglMDh4XHQiLCBpbnNuLT5vcGNvZGUpOworICBmcHJpbnRmIChzdGRlcnIsICJleHBhbmQ9MHglMDh4XHQiLCBpbnNuLT5leHBhbmQpOworICBmcHJpbnRmIChzdGRlcnIsICJyZWxvYyA9ICVzXHQiLCBSZWxvY1tpbnNuLT5yZWxvY10pOworICBmcHJpbnRmIChzdGRlcnIsICJoaWdobG93ID0gJXNcbiIsIEhpZ2hsb3dbaW5zbi0+aGlnaGxvd10pOworICBmcHJpbnRmIChzdGRlcnIsICJleHAgPSAge1xuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9zeW1ib2wgPSAlc1xuIiwKKwkgICBpbnNuLT5leHAuWF9hZGRfc3ltYm9sID8KKwkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgPworCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7CisgIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX29wX3N5bWJvbCA9ICVzXG4iLAorCSAgIGluc24tPmV4cC5YX29wX3N5bWJvbCA/CisJICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgPworCSAgICBTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX251bWJlciA9ICVkXG4iLAorCSAgIGluc24tPmV4cC5YX2FkZF9udW1iZXIpOworICBmcHJpbnRmIChzdGRlcnIsICJ9XG4iKTsKK30KKwwKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICByZXR1cm4gMDsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7Cit9CisMCisjaWZkZWYgY29tbWVudAorLyoKKyAqIEk4NjAgcmVsb2NhdGlvbnMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBzbyBpdCBuZWVkcworICogdGhpcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lIHRvIGVtaXQgdGhlbS4KKyAqLwordm9pZAorZW1pdF9tYWNoaW5lX3JlbG9jIChmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKKyAgICAgcmVnaXN0ZXIgZml4UyAqZml4UDsKKyAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Cit7CisgIHN0cnVjdCByZWxvY19pbmZvX2k4NjAgcmk7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CisgIGV4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOworICBsb25nIGFkZF9udW1iZXI7CisKKyAgbWVtc2V0ICgoY2hhciAqKSAmcmksICdcMCcsIHNpemVvZiAocmkpKTsKKyAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQorICAgIHsKKworICAgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSAmIH4weDNmKQorCXsKKwkgIGFzX2ZhdGFsICgiZml4UC0+Znhfcl90eXBlID0gJWRcbiIsIGZpeFAtPmZ4X3JfdHlwZSk7CisJfQorICAgICAgcmkucl9wY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOworICAgICAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOworCisgICAgICBpZiAoKHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSkgIT0gTlVMTCkKKwl7CisJICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKKwkgICAgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKKwkgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSkKKwkgICAgeworCSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKKwkgICAgICByaS5yX3N5bWJvbG51bSA9IHN5bWJvbFAtPnN5X251bWJlcjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmkucl9leHRlcm4gPSAwOworCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gU19HRVRfVFlQRSAoc3ltYm9sUCk7CisJICAgIH0KKwkgIGlmIChzeW1ib2xQICYmIHN5bWJvbFAtPnN5X2ZyYWcpCisJICAgIHsKKwkgICAgICByaS5yX2FkZGVuZCA9IHN5bWJvbFAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7CisJICAgIH0KKwkgIHJpLnJfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKKwkgIGlmIChmaXhQLT5meF9wY3JlbCkKKwkgICAgeworCSAgICAgIC8qIHByZXNlcnZlIGFjdHVhbCBvZmZzZXQgdnMuIHBjICsgNCAqLworCSAgICAgIHJpLnJfYWRkZW5kIC09IChyaS5yX2FkZHJlc3MgKyA0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmkucl9hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7CisJICAgIH0KKworCSAgbWRfcmlfdG9fY2hhcnMgKChjaGFyICopICZyaSwgcmkpOworCSAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7CisJfQorICAgIH0KK30KKworI2VuZGlmIC8qIGNvbW1lbnQgKi8KKworI2lmZGVmIE9CSl9BT1VUCisKKy8qIG9uIGk4NjA6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKKyAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKKyAgIGJpdCA3IGFzIHBjcmVsLCBiaXQgNiBhcyBleHRlcm4sIGFuZCB0aGUgbG93ZXIgc2l4IGJpdHMgYXMKKyAgIHJlbG9jYXRpb24gdHlwZSAoaGlnaGxvdyA1LTQpLiAgTmV4dCA0IGJ5dGVzIGFyZSBsb25nIGFkZGVuZC4gKi8KKwordm9pZAordGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKKyAgICAgY2hhciAqd2hlcmU7CisgICAgIGZpeFMgKmZpeFA7CisgICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOworeworICBsb25nIHJfaW5kZXg7CisgIGxvbmcgcl9leHRlcm47CisgIGxvbmcgcl9hZGRlbmQgPSAwOworICBsb25nIHJfYWRkcmVzczsKKworICBrbm93IChmaXhQLT5meF9hZGRzeSk7CisgIGtub3cgKCEoZml4UC0+Znhfcl90eXBlICYgfjB4M2YpKTsKKworICBpZiAoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIHJfZXh0ZXJuID0gMTsKKyAgICAgIHJfaW5kZXggPSBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJfZXh0ZXJuID0gMDsKKyAgICAgIHJfaW5kZXggPSBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSk7CisgICAgfQorCisgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCisJCSAgICAgIHJfYWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAorCQkgICAgICA0KTsKKworICB3aGVyZVs0XSA9IChyX2luZGV4ID4+IDE2KSAmIDB4MGZmOworICB3aGVyZVs1XSA9IChyX2luZGV4ID4+IDgpICYgMHgwZmY7CisgIHdoZXJlWzZdID0gcl9pbmRleCAmIDB4MGZmOworICB3aGVyZVs3XSA9ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDcpICYgMHg4MCkKKwkgICAgICB8ICgocl9leHRlcm4gPDwgNikgJiAweDQwKQorCSAgICAgIHwgKGZpeFAtPmZ4X3JfdHlwZSAmIDB4M0YpKTsKKworICBpZiAoZml4UC0+ZnhfYWRkc3ktPnN5X2ZyYWcpCisgICAgeworICAgICAgcl9hZGRlbmQgPSBmaXhQLT5meF9hZGRzeS0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKKyAgICB9CisKKyAgaWYgKGZpeFAtPmZ4X3BjcmVsKQorICAgIHsKKyAgICAgIC8qIHByZXNlcnZlIGFjdHVhbCBvZmZzZXQgdnMuIHBjICsgNCAqLworICAgICAgcl9hZGRlbmQgLT0gKHJfYWRkcmVzcyArIDQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOworICAgIH0KKworICBtZF9udW1iZXJfdG9fY2hhcnMgKCZ3aGVyZVs4XSwgcl9hZGRlbmQsIDQpOworfQorCisjZW5kaWYgLyogT0JKX0FPVVQgKi8KKworLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLworCisvKiBBUkdTVVNFRCAqLworc3ltYm9sUyAqCittZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICByZXR1cm4gMDsKK30KKworLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKKyAgICAgc2VnVCBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLworfQorCisvKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/CisgICBPbiB0aGUgaTg2MCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCisgICBpdHMgc2l6ZS4gKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTiEpICovCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKK30KKwordm9pZAorbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCisgICAgIGZpeFMgKmZpeFA7CisgICAgIGxvbmcgdmFsOworeworICBjaGFyICpwbGFjZSA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKKworICAvKiBsb29rcyB0byBtZSBsaWtlIGk4NjAgbmV2ZXIgaGFzIGJpdCBmaXhlcy4gTGV0J3Mgc2VlLiB4b3hvcmljaC4gKi8KKyAga25vdyAoZml4UC0+ZnhfYml0X2ZpeFAgPT0gTlVMTCk7CisgIGlmICghZml4UC0+ZnhfYml0X2ZpeFApCisgICAgeworICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOworICAgICAgbWRfbnVtYmVyX3RvX2ltbSAocGxhY2UsIHZhbCwgZml4UC0+Znhfc2l6ZSwgZml4UCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChwbGFjZSwgdmFsLCBmaXhQLT5meF9iaXRfZml4UCk7CisgICAgfQorfQorCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogZmlsbC1jb2x1bW46IDEzMQorICogY29tbWVudC1jb2x1bW46IDAKKyAqIEVuZDoKKyAqLworCisvKiBlbmQgb2YgdGMtaTg2MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk4NjAuaCBiL2dhcy9jb25maWcvdGMtaTg2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjIxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLWk4NjAuaApAQCAtMCwwICsxLDM5IEBACisvKiB0Yy1pODYwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBJODYwCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRDX0k4NjAgMQorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKyNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLworI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLworCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGNvbW1lbnQtY29sdW1uOiAwCisgKiBmaWxsLWNvbHVtbjogMTMxCisgKiBFbmQ6CisgKi8KKworLyogZW5kIG9mIHRjLWk4NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pOTYwLmMgYi9nYXMvY29uZmlnL3RjLWk5NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZiNjYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1pOTYwLmMKQEAgLTAsMCArMSwzMjMxIEBACisvKiB0Yy1pOTYwLmMgLSBBbGwgdGhlIGk4MDk2MC1zcGVjaWZpYyBzdHVmZgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFNlZSBjb21tZW50IG9uIG1kX3BhcnNlX29wdGlvbiBmb3IgODA5NjAtc3BlY2lmaWMgaW52b2NhdGlvbiBvcHRpb25zLiAqLworCisvKiBUaGVyZSBhcmUgNCBkaWZmZXJlbnQgbGVuZ3RocyBvZiAocG90ZW50aWFsbHkpIHN5bWJvbC1iYXNlZCBkaXNwbGFjZW1lbnRzCisgICBpbiB0aGUgODA5NjAgaW5zdHJ1Y3Rpb24gc2V0LCBlYWNoIG9mIHdoaWNoIGNvdWxkIHJlcXVpcmUgYWRkcmVzcyBmaXgtdXBzCisgICBhbmQgKGluIHRoZSBjYXNlIG9mIGV4dGVybmFsIHN5bWJvbHMpIGVtaXNzaW9uIG9mIHJlbG9jYXRpb24gZGlyZWN0aXZlczoKKworICAgMzItYml0IChNRU1CKQorICAgICAgICBUaGlzIGlzIGEgc3RhbmRhcmQgbGVuZ3RoIGZvciB0aGUgYmFzZSBhc3NlbWJsZXIgYW5kIHJlcXVpcmVzIG5vCisgICAgICAgIHNwZWNpYWwgYWN0aW9uLgorCisgICAxMy1iaXQgKENPQlIpCisgICAgICAgIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgbGVuZ3RoLCBidXQgdGhlIGJhc2UgYXNzZW1ibGVyIGhhcyBhCisgICAgICAgIGhvb2sgZm9yIGJpdCBmaWVsZCBhZGRyZXNzIGZpeHVwczogdGhlIGZpeFMgc3RydWN0dXJlIGNhbgorICAgICAgICBwb2ludCB0byBhIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkLCBpbiB3aGljaCBjYXNlIG91cgorICAgICAgICBtZF9udW1iZXJfdG9fZmllbGQoKSByb3V0aW5lIGdldHMgY2FsbGVkIHRvIHByb2Nlc3MgaXQuCisKKyAgICAgICAgSSBtYWRlIHRoZSBob29rIGEgbGl0dGxlIGNsZWFuZXIgYnkgaGF2aW5nIGZpeF9uZXcoKSAoaW4gdGhlIGJhc2UKKyAgICAgICAgYXNzZW1ibGVyKSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXhTIGluIHF1ZXN0aW9uLiAgQW5kIEkgbWFkZSBpdCBhCisgICAgICAgIGxpdHRsZSBzaW1wbGVyIGJ5IHN0b3JpbmcgdGhlIGZpZWxkIHNpemUgKGluIHRoaXMgY2FzZSAxMykgaW5zdGVhZCBvZgorICAgICAgICBvZiBhIHBvaW50ZXIgdG8gYW5vdGhlciBzdHJ1Y3R1cmU6ICA4MDk2MCBkaXNwbGFjZW1lbnRzIGFyZSBBTFdBWVMKKyAgICAgICAgc3RvcmVkIGluIHRoZSBsb3ctb3JkZXIgYml0cyBvZiBhIDQtYnl0ZSB3b3JkLgorCisgICAgICAgIFNpbmNlIHRoZSB0YXJnZXQgb2YgYSBDT0JSIGNhbm5vdCBiZSBleHRlcm5hbCwgbm8gcmVsb2NhdGlvbgorICAgICAgICBkaXJlY3RpdmVzIGZvciB0aGlzIHNpemUgZGlzcGxhY2VtZW50IGhhdmUgdG8gYmUgZ2VuZXJhdGVkLgorICAgICAgICBCdXQgdGhlIGJhc2UgYXNzZW1ibGVyIGhhZCB0byBiZSBtb2RpZmllZCB0byBpc3N1ZSBlcnJvcgorICAgICAgICBtZXNzYWdlcyBpZiB0aGUgc3ltYm9sIGRpZCB0dXJuIG91dCB0byBiZSBleHRlcm5hbC4KKworICAgMjQtYml0IChDVFJMKQorICAgICAgICBGaXh1cHMgYXJlIGhhbmRsZWQgYXMgZm9yIHRoZSAxMy1iaXQgY2FzZSAoZXhjZXB0IHRoYXQgMjQgaXMgc3RvcmVkCisgICAgICAgIGluIHRoZSBmaXhTKS4KKworICAgICAgICBUaGUgcmVsb2NhdGlvbiBkaXJlY3RpdmUgZ2VuZXJhdGVkIGlzIHRoZSBzYW1lIGFzIHRoYXQgZm9yIHRoZSAzMi1iaXQKKyAgICAgICAgZGlzcGxhY2VtZW50LCBleGNlcHQgdGhhdCBpdCdzIFBDLXJlbGF0aXZlICh0aGUgMzItYml0IGRpc3BsYWNlbWVudAorICAgICAgICBuZXZlciBpcykuICAgVGhlIGk4MDk2MCB2ZXJzaW9uIG9mIHRoZSBsaW5rZXIgbmVlZHMgYSBtb2QgdG8KKyAgICAgICAgZGlzdGluZ3Vpc2ggYW5kIGhhbmRsZSB0aGUgMjQtYml0IGNhc2UuCisKKyAgIDEyLWJpdCAoTUVNQSkKKyAgICAgICAgTUVNQSBmb3JtYXRzIGFyZSBhbHdheXMgcHJvbW90ZWQgdG8gTUVNQiAoMzItYml0KSBpZiB0aGUgZGlzcGxhY2VtZW50CisgICAgICAgIGlzIGJhc2VkIG9uIGEgc3ltYm9sLCBiZWNhdXNlIGl0IGNvdWxkIGJlIHJlbG9jYXRlZCBhdCBsaW5rIHRpbWUuCisgICAgICAgIFRoZSBvbmx5IHRpbWUgd2UgdXNlIHRoZSAxMi1iaXQgZm9ybWF0IGlzIGlmIGFuIGFic29sdXRlIHZhbHVlIG9mCisgICAgICAgIGxlc3MgdGhhbiA0MDk2IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIG5laXRoZXIgYSBmaXh1cCBub3IKKyAgICAgICAgYSByZWxvY2F0aW9uIGRpcmVjdGl2ZS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJhcy5oIgorCisjaW5jbHVkZSAib2JzdGFjay5oIgorCisjaW5jbHVkZSAib3Bjb2RlL2k5NjAuaCIKKworI2lmIGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkKKworI2RlZmluZSBUQ19TX0lTX1NZU1BST0MocykJKCgxPD1TX0dFVF9PVEhFUihzKSkgJiYgKFNfR0VUX09USEVSKHMpPD0zMikpCisjZGVmaW5lIFRDX1NfSVNfQkFMTkFNRShzKQkoU19HRVRfT1RIRVIocykgPT0gTl9CQUxOQU1FKQorI2RlZmluZSBUQ19TX0lTX0NBTExOQU1FKHMpCShTX0dFVF9PVEhFUihzKSA9PSBOX0NBTExOQU1FKQorI2RlZmluZSBUQ19TX0lTX0JBRFBST0MocykJKChTX0dFVF9PVEhFUihzKSAhPSAwKSAmJiAhVENfU19JU19DQUxMTkFNRShzKSAmJiAhVENfU19JU19CQUxOQU1FKHMpICYmICFUQ19TX0lTX1NZU1BST0MocykpCisKKyNkZWZpbmUgVENfU19TRVRfU1lTUFJPQyhzLCBwKQkoU19TRVRfT1RIRVIoKHMpLCAocCkrMSkpCisjZGVmaW5lIFRDX1NfR0VUX1NZU1BST0MocykJKFNfR0VUX09USEVSKHMpLTEpCisKKyNkZWZpbmUgVENfU19GT1JDRV9UT19CQUxOQU1FKHMpCShTX1NFVF9PVEhFUigocyksIE5fQkFMTkFNRSkpCisjZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUocykJKFNfU0VUX09USEVSKChzKSwgTl9DQUxMTkFNRSkpCisjZGVmaW5lIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyhzKQl7O30KKworI2Vsc2UgLyogISBPQkpfQS9CT1VUICovCisjaWZkZWYgT0JKX0NPRkYKKworI2RlZmluZSBUQ19TX0lTX1NZU1BST0MocykJKFNfR0VUX1NUT1JBR0VfQ0xBU1MocykgPT0gQ19TQ0FMTCkKKyNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCShTRl9HRVRfQkFMTkFNRShzKSkKKyNkZWZpbmUgVENfU19JU19DQUxMTkFNRShzKQkoU0ZfR0VUX0NBTExOQU1FKHMpKQorI2RlZmluZSBUQ19TX0lTX0JBRFBST0MocykJKFRDX1NfSVNfU1lTUFJPQyhzKSAmJiBUQ19TX0dFVF9TWVNQUk9DKHMpIDwgMCAmJiAzMSA8IFRDX1NfR0VUX1NZU1BST0MocykpCisKKyNkZWZpbmUgVENfU19TRVRfU1lTUFJPQyhzLCBwKQkoKHMpLT5zeV9zeW1ib2wub3N0X2F1eGVudFsxXS54X3NjLnhfc3RpbmR4ID0gKHApKQorI2RlZmluZSBUQ19TX0dFVF9TWVNQUk9DKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzFdLnhfc2MueF9zdGluZHgpCisKKyNkZWZpbmUgVENfU19GT1JDRV9UT19CQUxOQU1FKHMpCShTRl9TRVRfQkFMTkFNRShzKSkKKyNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQkoU0ZfU0VUX0NBTExOQU1FKHMpKQorI2RlZmluZSBUQ19TX0ZPUkNFX1RPX1NZU1BST0MocykJKFNfU0VUX1NUT1JBR0VfQ0xBU1MoKHMpLCBDX1NDQUxMKSkKKworI2Vsc2UgLyogISBPQkpfQ09GRiAqLworeW91IGxvc2U7CisjZW5kaWYgLyogISBPQkpfQ09GRiAqLworI2VuZGlmIC8qICEgT0JKX0EvQk9VVCAqLworCitleHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOworCisjaWYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICFkZWZpbmVkIChCRkQpCisjaWZkZWYgT0JKX0NPRkYKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2MpOworI2Vsc2UgLyogT0JKX0NPRkYgKi8KK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKKyNlbmRpZiAvKiBPQkpfQ09GRiAqLworI2VuZGlmCisKKy8qIExvY2FsIGk4MDk2MCByb3V0aW5lcy4gICovCisKK3N0YXRpYyB2b2lkIGJyY250X2VtaXQgKCk7CS8qIEVtaXQgYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uIGNvZGUgKi8KK3N0YXRpYyBjaGFyICpicmxhYl9uZXh0ICgpOwkvKiBSZXR1cm4gbmV4dCBicmFuY2ggbG9jYWwgbGFiZWwgKi8KK3ZvaWQgYnJ0YWJfZW1pdCAoKTsJCS8qIEVtaXQgYnItcHJlZGljdCBpbnN0cnVtZW50YXRpb24gdGFibGUgKi8KK3N0YXRpYyB2b2lkIGNvYnJfZm10ICgpOwkvKiBHZW5lcmF0ZSBDT0JSIGluc3RydWN0aW9uICovCitzdGF0aWMgdm9pZCBjdHJsX2ZtdCAoKTsJLyogR2VuZXJhdGUgQ1RSTCBpbnN0cnVjdGlvbiAqLworc3RhdGljIGNoYXIgKmVtaXQgKCk7CQkvKiBFbWl0IChpbnRlcm5hbGx5KSBiaW5hcnkgKi8KK3N0YXRpYyBpbnQgZ2V0X2FyZ3MgKCk7CQkvKiBCcmVhayBhcmd1bWVudHMgb3V0IG9mIGNvbW1hLXNlcGFyYXRlZCBsaXN0ICovCitzdGF0aWMgdm9pZCBnZXRfY2Rpc3AgKCk7CS8qIEhhbmRsZSBDT0JSIG9yIENUUkwgZGlzcGxhY2VtZW50ICovCitzdGF0aWMgY2hhciAqZ2V0X2lzcGVjICgpOwkvKiBGaW5kIGluZGV4IHNwZWNpZmljYXRpb24gc3RyaW5nICovCitzdGF0aWMgaW50IGdldF9yZWdudW0gKCk7CS8qIFRyYW5zbGF0ZSB0ZXh0IHRvIHJlZ2lzdGVyIG51bWJlciAqLworc3RhdGljIGludCBpX3NjYW4gKCk7CQkvKiBMZXhpY2FsIHNjYW4gb2YgaW5zdHJ1Y3Rpb24gc291cmNlICovCitzdGF0aWMgdm9pZCBtZW1fZm10ICgpOwkJLyogR2VuZXJhdGUgTUVNQSBvciBNRU1CIGluc3RydWN0aW9uICovCitzdGF0aWMgdm9pZCBtZW1hX3RvX21lbWIgKCk7CS8qIENvbnZlcnQgTUVNQSBpbnN0cnVjdGlvbiB0byBNRU1CIGZvcm1hdCAqLworc3RhdGljIHZvaWQgcGFyc2VfZXhwciAoKTsJLyogUGFyc2UgYW4gZXhwcmVzc2lvbiAqLworc3RhdGljIGludCBwYXJzZV9sZGNvbnN0ICgpOwkvKiBQYXJzZSBhbmQgcmVwbGFjZSBhICdsZGNvbnN0JyBwc2V1ZG8tb3AgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX21lbW9wICgpOwkvKiBQYXJzZSBhIG1lbW9yeSBvcGVyYW5kICovCitzdGF0aWMgdm9pZCBwYXJzZV9wbyAoKTsJLyogUGFyc2UgbWFjaGluZS1kZXBlbmRlbnQgcHNldWRvLW9wICovCitzdGF0aWMgdm9pZCBwYXJzZV9yZWdvcCAoKTsJLyogUGFyc2UgYSByZWdpc3RlciBvcGVyYW5kICovCitzdGF0aWMgdm9pZCByZWdfZm10ICgpOwkJLyogR2VuZXJhdGUgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uICovCit2b2lkIHJlbG9jX2NhbGxqICgpOwkJLyogUmVsb2NhdGUgYSAnY2FsbGonIGluc3RydWN0aW9uICovCitzdGF0aWMgdm9pZCByZWxheF9jb2JyICgpOwkvKiAiRGUtb3B0aW1pemUiIGNvYnIgaW50byBjb21wYXJlL2JyYW5jaCAqLworc3RhdGljIHZvaWQgc19sZWFmcHJvYyAoKTsJLyogUHJvY2VzcyAnLmxlYWZwcm9jJyBwc2V1ZG8tb3AgKi8KK3N0YXRpYyB2b2lkIHNfc3lzcHJvYyAoKTsJLyogUHJvY2VzcyAnLnN5c3Byb2MnIHBzZXVkby1vcCAqLworc3RhdGljIGludCBzaGlmdF9vayAoKTsJCS8qIFdpbGwgYSAnc2hsbycgc3Vic3RpdHVyZSBmb3IgYSAnbGRjb25zdCc/ICovCitzdGF0aWMgdm9pZCBzeW50YXggKCk7CQkvKiBHaXZlIHN5bnRheCBlcnJvciAqLworc3RhdGljIGludCB0YXJnX2hhc19zZnIgKCk7CS8qIFRhcmdldCBjaGlwIHN1cHBvcnRzIHNwZWMtZnVuYyByZWdpc3Rlcj8gKi8KK3N0YXRpYyBpbnQgdGFyZ19oYXNfaWNsYXNzICgpOwkvKiBUYXJnZXQgY2hpcCBzdXBwb3J0cyBpbnN0cnVjdGlvbiBzZXQ/ICovCisKKy8qIFNlZSBtZF9wYXJzZV9vcHRpb24oKSBmb3IgbWVhbmluZ3Mgb2YgdGhlc2Ugb3B0aW9ucyAqLworc3RhdGljIGNoYXIgbm9yZWxheDsJCS8qIFRydWUgaWYgLW5vcmVsYXggc3dpdGNoIHNlZW4gKi8KK3N0YXRpYyBjaGFyIGluc3RydW1lbnRfYnJhbmNoZXM7CS8qIFRydWUgaWYgLWIgc3dpdGNoIHNlZW4gKi8KKworLyogQ2hhcmFjdGVycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuCisgICBJZiB0aGUgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLgorICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogQ2hhcmFjdGVycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJworICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0LgorCisgICBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKKyAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LgorICovCisKKy8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLworCitjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1sxXTsKKworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1sxXTsKKworLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKKyAgIGFzIGluIDBmMTIuNDU2IG9yIDBkMS4yMzQ1ZTEyCisgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHRUIjsKKworCisvKiBUYWJsZSB1c2VkIGJ5IGJhc2UgYXNzZW1ibGVyIHRvIHJlbGF4IGFkZHJlc3NlcyBiYXNlZCBvbiB2YXJ5aW5nIGxlbmd0aAorICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpZWxkcyBhcmU6CisgICAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKKyAgICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAorICAgICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZworICAgICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuCisKKyAgIEZvciBpODA5NjAsIHRoZSBvbmx5IGFwcGxpY2F0aW9uIGlzIHRoZSAoZGUtKW9wdGltaXphdGlvbiBvZiBjb2JyCisgICBpbnN0cnVjdGlvbnMgaW50byBzZXBhcmF0ZSBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdoZW4gYSAxMy1iaXQKKyAgIGRpc3BsYWNlbWVudCB3b24ndCBoYWNrIGl0LgorICovCitjb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KK3sKKyAgezAsIDAsIDAsIDB9LAkJCS8qIFN0YXRlIDAgPT4gbm8gbW9yZSByZWxheGF0aW9uIHBvc3NpYmxlICovCisgIHs0MDg4LCAtNDA5NiwgMCwgMn0sCQkvKiBTdGF0ZSAxOiBjb25kaXRpb25hbCBicmFuY2ggKGNvYnIpICovCisgIHsweDgwMDAwMCAtIDgsIC0weDgwMDAwMCwgNCwgMH0sCS8qIFN0YXRlIDI6IGNvbXBhcmUgKHJlZykgJiBicmFuY2ggKGN0cmwpICovCit9OworCitzdGF0aWMgdm9pZCBzX2VuZGlhbiBQQVJBTVMgKChpbnQpKTsKKworLyogVGhlc2UgYXJlIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLgorCisgICBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCisgICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgorICAgICAgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAorICAgICAgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKKyAgICAgICAgaW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAqLworI2RlZmluZSBTX0xFQUZQUk9DCTEKKyNkZWZpbmUgU19TWVNQUk9DCTIKKworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJic3MiLCBzX2xjb21tLCAxfSwKKyAgeyJlbmRpYW4iLCBzX2VuZGlhbiwgMH0sCisgIHsiZXh0ZW5kZWQiLCBmbG9hdF9jb25zLCAndCd9LAorICB7ImxlYWZwcm9jIiwgcGFyc2VfcG8sIFNfTEVBRlBST0N9LAorICB7InN5c3Byb2MiLCBwYXJzZV9wbywgU19TWVNQUk9DfSwKKworICB7IndvcmQiLCBjb25zLCA0fSwKKyAgeyJxdWFkIiwgY29ucywgMTZ9LAorCisgIHswLCAwLCAwfQorfTsKKwwKKy8qIE1hY3JvcyB0byBleHRyYWN0IGluZm8gZnJvbSBhbiAnZXhwcmVzc2lvblMnIHN0cnVjdHVyZSAnZScgKi8KKyNkZWZpbmUgYWRkcyhlKQllLlhfYWRkX3N5bWJvbAorI2RlZmluZSBvZmZzKGUpCWUuWF9hZGRfbnVtYmVyCisKKworLyogQnJhbmNoLXByZWRpY3Rpb24gYml0cyBmb3IgQ1RSTC9DT0JSIGZvcm1hdCBvcGNvZGVzICovCisjZGVmaW5lIEJQX01BU0sJCTB4MDAwMDAwMDIJLyogTWFzayBmb3IgYnJhbmNoLXByZWRpY3Rpb24gYml0ICovCisjZGVmaW5lIEJQX1RBS0VOCTB4MDAwMDAwMDAJLyogVmFsdWUgdG8gT1IgaW4gdG8gcHJlZGljdCBicmFuY2ggKi8KKyNkZWZpbmUgQlBfTk9UX1RBS0VOCTB4MDAwMDAwMDIJLyogVmFsdWUgdG8gT1IgaW4gdG8gcHJlZGljdCBubyBicmFuY2ggKi8KKworCisvKiBTb21lIGluc3RydWN0aW9uIG9wY29kZXMgdGhhdCB3ZSBuZWVkIGV4cGxpY2l0bHkgKi8KKyNkZWZpbmUgQkUJMHgxMjAwMDAwMAorI2RlZmluZSBCRwkweDExMDAwMDAwCisjZGVmaW5lIEJHRQkweDEzMDAwMDAwCisjZGVmaW5lIEJMCTB4MTQwMDAwMDAKKyNkZWZpbmUgQkxFCTB4MTYwMDAwMDAKKyNkZWZpbmUgQk5FCTB4MTUwMDAwMDAKKyNkZWZpbmUgQk5PCTB4MTAwMDAwMDAKKyNkZWZpbmUgQk8JMHgxNzAwMDAwMAorI2RlZmluZSBDSEtCSVQJMHg1YTAwMjcwMAorI2RlZmluZSBDTVBJCTB4NWEwMDIwODAKKyNkZWZpbmUgQ01QTwkweDVhMDAyMDAwCisKKyNkZWZpbmUgQgkweDA4MDAwMDAwCisjZGVmaW5lIEJBTAkweDBiMDAwMDAwCisjZGVmaW5lIENBTEwJMHgwOTAwMDAwMAorI2RlZmluZSBDQUxMUwkweDY2MDAzODAwCisjZGVmaW5lIFJFVAkweDBhMDAwMDAwCisKKworLyogVGhlc2UgbWFza3MgYXJlIHVzZWQgdG8gYnVpbGQgdXAgYSBzZXQgb2YgTUVNQiBtb2RlIGJpdHMuICovCisjZGVmaW5lCUFfQklUCQkweDA0MDAKKyNkZWZpbmUJSV9CSVQJCTB4MDgwMAorI2RlZmluZSBNRU1CX0JJVAkweDEwMDAKKyNkZWZpbmUJRF9CSVQJCTB4MjAwMAorCisKKy8qIE1hc2sgZm9yIHRoZSBvbmx5IG1vZGUgYml0IGluIGEgTUVNQSBpbnN0cnVjdGlvbiAoaWYgc2V0LCBhYmFzZSByZWcgaXMKKyAgIHVzZWQpLiAgKi8KKyNkZWZpbmUgTUVNQV9BQkFTRQkweDIwMDAKKworLyogSW5mbyBmcm9tIHdoaWNoIGEgTUVNQSBvciBNRU1CIGZvcm1hdCBpbnN0cnVjdGlvbiBjYW4gYmUgZ2VuZXJhdGVkICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgLyogKEZpcnN0KSAzMiBiaXRzIG9mIGluc3RydWN0aW9uICovCisgICAgbG9uZyBvcGNvZGU7CisgICAgLyogMC0obm9uZSksIDEyLSBvciwgMzItYml0IGRpc3BsYWNlbWVudCBuZWVkZWQgKi8KKyAgICBpbnQgZGlzcDsKKyAgICAvKiBUaGUgZXhwcmVzc2lvbiBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGZyb20gd2hpY2ggdGhlCisgICAgICAgZGlzcGxhY2VtZW50IHNob3VsZCBiZSBkZXRlcm1pbmVkLiAgKi8KKyAgICBjaGFyICplOworICB9CisKK21lbVM7CisKKworLyogVGhlIHR3byBwaWVjZXMgb2YgaW5mbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVnaXN0ZXIgb3BlcmFuZCAqLworc3RydWN0IHJlZ29wCisgIHsKKyAgICBpbnQgbW9kZTsJCQkvKiAwID0+bG9jYWwvZ2xvYmFsL3NwZWMgcmVnOyAxPT4gbGl0ZXJhbCBvciBmcCByZWcgKi8KKyAgICBpbnQgc3BlY2lhbDsJCS8qIDAgPT5ub3QgYSBzZnI7ICAxPT4gaXMgYSBzZnIgKG5vdCB2YWxpZCB3L21vZGU9MCkgKi8KKyAgICBpbnQgbjsJCQkvKiBSZWdpc3RlciBudW1iZXIgb3IgbGl0ZXJhbCB2YWx1ZSAqLworICB9OworCisKKy8qIE51bWJlciBhbmQgYXNzZW1ibGVyIG1uZW1vbmljIGZvciBhbGwgcmVnaXN0ZXJzIHRoYXQgY2FuIGFwcGVhciBpbgorICAgb3BlcmFuZHMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgY2hhciAqcmVnX25hbWU7CisgICAgaW50IHJlZ19udW07CisgIH0KK3JlZ25hbWVzW10gPQoreworICB7ICJwZnAiLCAwIH0sCisgIHsgInNwIiwgMSB9LAorICB7ICJyaXAiLCAyIH0sCisgIHsgInIzIiwgMyB9LAorICB7ICJyNCIsIDQgfSwKKyAgeyAicjUiLCA1IH0sCisgIHsgInI2IiwgNiB9LAorICB7ICJyNyIsIDcgfSwKKyAgeyAicjgiLCA4IH0sCisgIHsgInI5IiwgOSB9LAorICB7ICJyMTAiLCAxMCB9LAorICB7ICJyMTEiLCAxMSB9LAorICB7ICJyMTIiLCAxMiB9LAorICB7ICJyMTMiLCAxMyB9LAorICB7ICJyMTQiLCAxNCB9LAorICB7ICJyMTUiLCAxNSB9LAorICB7ICJnMCIsIDE2IH0sCisgIHsgImcxIiwgMTcgfSwKKyAgeyAiZzIiLCAxOCB9LAorICB7ICJnMyIsIDE5IH0sCisgIHsgImc0IiwgMjAgfSwKKyAgeyAiZzUiLCAyMSB9LAorICB7ICJnNiIsIDIyIH0sCisgIHsgImc3IiwgMjMgfSwKKyAgeyAiZzgiLCAyNCB9LAorICB7ICJnOSIsIDI1IH0sCisgIHsgImcxMCIsIDI2IH0sCisgIHsgImcxMSIsIDI3IH0sCisgIHsgImcxMiIsIDI4IH0sCisgIHsgImcxMyIsIDI5IH0sCisgIHsgImcxNCIsIDMwIH0sCisgIHsgImZwIiwgMzEgfSwKKworICAvKiBOdW1iZXJzIGZvciBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVycyBhcmUgZm9yIGFzc2VtYmxlciBpbnRlcm5hbAorICAgICB1c2Ugb25seTogdGhleSBhcmUgc2NhbGVkIGJhY2sgdG8gcmFuZ2UgWzAtMzFdIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KKyNkZWZpbmUgU0YwCTMyCisKKyAgeyAic2YwIiwgMzIgfSwKKyAgeyAic2YxIiwgMzMgfSwKKyAgeyAic2YyIiwgMzQgfSwKKyAgeyAic2YzIiwgMzUgfSwKKyAgeyAic2Y0IiwgMzYgfSwKKyAgeyAic2Y1IiwgMzcgfSwKKyAgeyAic2Y2IiwgMzggfSwKKyAgeyAic2Y3IiwgMzkgfSwKKyAgeyAic2Y4IiwgNDAgfSwKKyAgeyAic2Y5IiwgNDEgfSwKKyAgeyAic2YxMCIsIDQyIH0sCisgIHsgInNmMTEiLCA0MyB9LAorICB7ICJzZjEyIiwgNDQgfSwKKyAgeyAic2YxMyIsIDQ1IH0sCisgIHsgInNmMTQiLCA0NiB9LAorICB7ICJzZjE1IiwgNDcgfSwKKyAgeyAic2YxNiIsIDQ4IH0sCisgIHsgInNmMTciLCA0OSB9LAorICB7ICJzZjE4IiwgNTAgfSwKKyAgeyAic2YxOSIsIDUxIH0sCisgIHsgInNmMjAiLCA1MiB9LAorICB7ICJzZjIxIiwgNTMgfSwKKyAgeyAic2YyMiIsIDU0IH0sCisgIHsgInNmMjMiLCA1NSB9LAorICB7ICJzZjI0IiwgNTYgfSwKKyAgeyAic2YyNSIsIDU3IH0sCisgIHsgInNmMjYiLCA1OCB9LAorICB7ICJzZjI3IiwgNTkgfSwKKyAgeyAic2YyOCIsIDYwIH0sCisgIHsgInNmMjkiLCA2MSB9LAorICB7ICJzZjMwIiwgNjIgfSwKKyAgeyAic2YzMSIsIDYzIH0sCisKKyAgLyogTnVtYmVycyBmb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBmb3IgYXNzZW1ibGVyIGludGVybmFsCisgICAgIHVzZSBvbmx5OiB0aGV5IGFyZSBzY2FsZWQgYmFjayB0byBbMC0zXSBmb3IgYmluYXJ5IG91dHB1dC4gICovCisjZGVmaW5lIEZQMAk2NAorCisgIHsgImZwMCIsIDY0IH0sCisgIHsgImZwMSIsIDY1IH0sCisgIHsgImZwMiIsIDY2IH0sCisgIHsgImZwMyIsIDY3IH0sCisKKyAgeyBOVUxMLCAwIH0sCQkJCS8qIEVORCBPRiBMSVNUICovCit9OworCisjZGVmaW5lCUlTX1JHX1JFRyhuKQkoKDAgPD0gKG4pKSAmJiAoKG4pIDwgU0YwKSkKKyNkZWZpbmUJSVNfU0ZfUkVHKG4pCSgoU0YwIDw9IChuKSkgJiYgKChuKSA8IEZQMCkpCisjZGVmaW5lCUlTX0ZQX1JFRyhuKQkoKG4pID49IEZQMCkKKworLyogTnVtYmVyIGFuZCBhc3NlbWJsZXIgbW5lbW9uaWMgZm9yIGFsbCByZWdpc3RlcnMgdGhhdCBjYW4gYXBwZWFyIGFzCisgICAnYWJhc2UnIChpbmRpcmVjdCBhZGRyZXNzaW5nKSByZWdpc3RlcnMuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgY2hhciAqYXJlZ19uYW1lOworICAgIGludCBhcmVnX251bTsKKyAgfQorYXJlZ3NbXSA9Cit7CisgIHsgIihwZnApIiwgMCB9LAorICB7ICIoc3ApIiwgMSB9LAorICB7ICIocmlwKSIsIDIgfSwKKyAgeyAiKHIzKSIsIDMgfSwKKyAgeyAiKHI0KSIsIDQgfSwKKyAgeyAiKHI1KSIsIDUgfSwKKyAgeyAiKHI2KSIsIDYgfSwKKyAgeyAiKHI3KSIsIDcgfSwKKyAgeyAiKHI4KSIsIDggfSwKKyAgeyAiKHI5KSIsIDkgfSwKKyAgeyAiKHIxMCkiLCAxMCB9LAorICB7ICIocjExKSIsIDExIH0sCisgIHsgIihyMTIpIiwgMTIgfSwKKyAgeyAiKHIxMykiLCAxMyB9LAorICB7ICIocjE0KSIsIDE0IH0sCisgIHsgIihyMTUpIiwgMTUgfSwKKyAgeyAiKGcwKSIsIDE2IH0sCisgIHsgIihnMSkiLCAxNyB9LAorICB7ICIoZzIpIiwgMTggfSwKKyAgeyAiKGczKSIsIDE5IH0sCisgIHsgIihnNCkiLCAyMCB9LAorICB7ICIoZzUpIiwgMjEgfSwKKyAgeyAiKGc2KSIsIDIyIH0sCisgIHsgIihnNykiLCAyMyB9LAorICB7ICIoZzgpIiwgMjQgfSwKKyAgeyAiKGc5KSIsIDI1IH0sCisgIHsgIihnMTApIiwgMjYgfSwKKyAgeyAiKGcxMSkiLCAyNyB9LAorICB7ICIoZzEyKSIsIDI4IH0sCisgIHsgIihnMTMpIiwgMjkgfSwKKyAgeyAiKGcxNCkiLCAzMCB9LAorICB7ICIoZnApIiwgMzEgfSwKKworI2RlZmluZSBJUFJFTAkzMgorICAvKiBGb3IgYXNzZW1ibGVyIGludGVybmFsIHVzZSBvbmx5OiB0aGlzIG51bWJlciBuZXZlciBhcHBlYXJzIGluIGJpbmFyeQorICAgICBvdXRwdXQuICAqLworICB7ICIoaXApIiwgSVBSRUwgfSwKKworICB7IE5VTEwsIDAgfSwJCQkJLyogRU5EIE9GIExJU1QgKi8KK307CisKKworLyogSGFzaCB0YWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcmVnX2hhc2g7CS8qIFJlZ2lzdGVyIG5hbWUgaGFzaCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyZWdfaGFzaDsJLyogQWJhc2UgcmVnaXN0ZXIgaGFzaCB0YWJsZSAqLworCisKKy8qIEFyY2hpdGVjdHVyZSBmb3Igd2hpY2ggd2UgYXJlIGFzc2VtYmxpbmcgKi8KKyNkZWZpbmUgQVJDSF9BTlkJMAkvKiBEZWZhdWx0OiBubyBhcmNoaXRlY3R1cmUgY2hlY2tpbmcgZG9uZSAqLworI2RlZmluZSBBUkNIX0tBCQkxCisjZGVmaW5lIEFSQ0hfS0IJCTIKKyNkZWZpbmUgQVJDSF9NQwkJMworI2RlZmluZSBBUkNIX0NBCQk0CisjZGVmaW5lIEFSQ0hfSlgJCTUKKyNkZWZpbmUgQVJDSF9IWAkJNgoraW50IGFyY2hpdGVjdHVyZSA9IEFSQ0hfQU5ZOwkvKiBBcmNoaXRlY3R1cmUgcmVxdWVzdGVkIG9uIGludm9jYXRpb24gbGluZSAqLworaW50IGljbGFzc2VzX3NlZW47CQkvKiBPUiBvZiBpbnN0cnVjdGlvbiBjbGFzc2VzIChJXyogY29uc3RhbnRzKQorCQkJCSAqICAgIGZvciB3aGljaCB3ZSd2ZSBhY3R1YWxseSBhc3NlbWJsZWQKKwkJCQkgKiAgICAgIGluc3RydWN0aW9ucy4KKwkJCQkgKi8KKworCisvKiBCUkFOQ0gtUFJFRElDVElPTiBJTlNUUlVNRU5UQVRJT04KKworICAgICAgICBUaGUgZm9sbG93aW5nIHN1cHBvcnRzIGdlbmVyYXRpb24gb2YgYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uCisgICAgICAgICh0dXJuZWQgb24gYnkgLWIgc3dpdGNoKS4gIFRoZSBpbnN0cnVtZW50YXRpb24gY29sbGVjdHMgY291bnRzCisgICAgICAgIG9mIGJyYW5jaGVzIHRha2VuL25vdC10YWtlbiBmb3IgbGF0ZXIgaW5wdXQgdG8gYSB1dGlsaXR5IHRoYXQgd2lsbAorICAgICAgICBzZXQgdGhlIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgb2YgdGhlIGluc3RydWN0aW9ucyBpbiBhY2NvcmRhbmNlIHdpdGgKKyAgICAgICAgdGhlIGJlaGF2aW9yIG9ic2VydmVkLiAgKE5vdGUgdGhhdCB0aGUgS1ggc2VyaWVzIGRvZXMgbm90IGhhdmUKKyAgICAgICAgYnJhY2gtcHJlZGljdGlvbi4pCisKKyAgICAgICAgVGhlIGluc3RydW1lbnRhdGlvbiBjb25zaXN0cyBvZjoKKworICAgICAgICAoMSkgYmVmb3JlIGFuZCBhZnRlciBlYWNoIGNvbmRpdGlvbmFsIGJyYW5jaCwgYSBjYWxsIHRvIGFuIGV4dGVybmFsCisgICAgICAgICAgICByb3V0aW5lIHRoYXQgaW5jcmVtZW50cyBhbmQgc3RlcHMgb3ZlciBhbiBpbmxpbmUgY291bnRlci4gIFRoZQorICAgICAgICAgICAgY291bnRlciBpdHNlbGYsIGluaXRpYWxpemVkIHRvIDAsIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGNhbGwKKyAgICAgICAgICAgIGluc3RydWN0aW9uLiAgRm9yIGVhY2ggYnJhbmNoLCB0aGUgY291bnRlciBmb2xsb3dpbmcgdGhlIGJyYW5jaAorICAgICAgICAgICAgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIHdhcyBub3QgdGFrZW4sIGFuZCB0aGUgZGlmZmVyZW5jZQorICAgICAgICAgICAgYmV0d2VlbiB0aGUgY291bnRlcnMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgdGFrZW4uICBBbgorICAgICAgICAgICAgZXhhbXBsZSBvZiBhbiBpbnN0cnVtZW50ZWQgY29uZGl0aW9uYWwgYnJhbmNoOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgICAgQlJfQ05UX0ZVTkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndvcmQgICAwCisgICAgICAgICAgICAgICAgTEJSQU5DSDIzOiAgICAgIGJlICAgICAgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCAgICBCUl9DTlRfRlVOQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud29yZCAgIDAKKworICAgICAgICAoMikgYSB0YWJsZSBvZiBwb2ludGVycyB0byB0aGUgaW5zdHJ1bWVudGVkIGJyYW5jaGVzLCBzbyB0aGF0IGFuCisgICAgICAgICAgICBleHRlcm5hbCBwb3N0cHJvY2Vzc2luZyByb3V0aW5lIGNhbiBsb2NhdGUgYWxsIG9mIHRoZSBjb3VudGVycy4KKyAgICAgICAgICAgIHRoZSB0YWJsZSBiZWdpbnMgd2l0aCBhIDItd29yZCBoZWFkZXI6IGEgcG9pbnRlciB0byB0aGUgbmV4dCBpbgorICAgICAgICAgICAgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHRhYmxlcyAoaW5pdGlhbGl6ZWQgdG8gMCk7ICBhbmQgYSBjb3VudAorICAgICAgICAgICAgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZSAoZXhjbHVzaXZlIG9mIHRoZSBoZWFkZXIuCisKKyAgICAgICAgICAgIE5vdGUgdGhhdCBpbnB1dCBzb3VyY2UgY29kZSBpcyBleHBlY3RlZCB0byBhbHJlYWR5IGNvbnRhaW4gY2FsbHMKKyAgICAgICAgICAgIGFuIGV4dGVybmFsIHJvdXRpbmUgdGhhdCB3aWxsIGxpbmsgdGhlIGJyYW5jaCBsb2NhbCB0YWJsZSBpbnRvIGEKKyAgICAgICAgICAgIGxpc3Qgb2Ygc3VjaCB0YWJsZXMuCisgKi8KKworLyogTnVtYmVyIG9mIGJyYW5jaGVzIGluc3RydW1lbnRlZCBzbyBmYXIuICBBbHNvIHVzZWQgdG8gZ2VuZXJhdGUKKyAgIHVuaXF1ZSBsb2NhbCBsYWJlbHMgZm9yIGVhY2ggaW5zdHJ1bWVudGVkIGJyYW5jaC4gICovCitzdGF0aWMgaW50IGJyX2NudDsKKworI2RlZmluZSBCUl9MQUJFTF9CQVNFCSJMQlJBTkNIIgorLyogQmFzZW5hbWUgb2YgbG9jYWwgbGFiZWxzIG9uIGluc3RydW1lbnRlZCBicmFuY2hlcywgdG8gYXZvaWQKKyAgIGNvbmZsaWN0IHdpdGggY29tcGlsZXItIGdlbmVyYXRlZCBsb2NhbCBsYWJlbHMuICAqLworCisjZGVmaW5lIEJSX0NOVF9GVU5DCSJfX2luY19icmFuY2giCisvKiBOYW1lIG9mIHRoZSBleHRlcm5hbCByb3V0aW5lIHRoYXQgd2lsbCBpbmNyZW1lbnQgKGFuZCBzdGVwIG92ZXIpIGFuCisgICBpbmxpbmUgY291bnRlci4gICovCisKKyNkZWZpbmUgQlJfVEFCX05BTUUJIl9fQlJBTkNIX1RBQkxFX18iCisvKiBOYW1lIG9mIHRoZSB0YWJsZSBvZiBwb2ludGVycyB0byBicmFuY2hlcy4gIEEgbG9jYWwgKGkuZS4sCisgICBub24tZXh0ZXJuYWwpIHN5bWJvbC4gICovCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1kX2JlZ2luOiAgT25lLXRpbWUgaW5pdGlhbGl6YXRpb24uCisKKyAgCVNldCB1cCBoYXNoIHRhYmxlcy4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGludCBpOwkJCS8qIExvb3AgY291bnRlciAqLworICBjb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwkvKiBQb2ludGVyIGludG8gb3Bjb2RlIHRhYmxlICovCisgIGNvbnN0IGNoYXIgKnJldHZhbDsJCS8qIFZhbHVlIHJldHVybmVkIGJ5IGhhc2ggZnVuY3Rpb25zICovCisKKyAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOworICByZWdfaGFzaCA9IGhhc2hfbmV3ICgpOworICBhcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKKworICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBiYXNlIGFzc2VtYmxlciB1c2VzIGFuIGVtcHR5IHN0cmluZyBmb3IgIm5vCisgICAgIGVycm9yIG1lc3NhZ2UiLCBpbnN0ZWFkIG9mIGEgTlVMTCBwb2ludGVyLiAgKi8KKyAgcmV0dmFsID0gMDsKKworICBmb3IgKG9QID0gaTk2MF9vcGNvZGVzOyBvUC0+bmFtZSAmJiAhcmV0dmFsOyBvUCsrKQorICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBvUC0+bmFtZSwgKFBUUikgb1ApOworCisgIGZvciAoaSA9IDA7IHJlZ25hbWVzW2ldLnJlZ19uYW1lICYmICFyZXR2YWw7IGkrKykKKyAgICByZXR2YWwgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ25hbWVzW2ldLnJlZ19uYW1lLAorCQkJICAoY2hhciAqKSAmcmVnbmFtZXNbaV0ucmVnX251bSk7CisKKyAgZm9yIChpID0gMDsgYXJlZ3NbaV0uYXJlZ19uYW1lICYmICFyZXR2YWw7IGkrKykKKyAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYXJlZ19oYXNoLCBhcmVnc1tpXS5hcmVnX25hbWUsCisJCQkgIChjaGFyICopICZhcmVnc1tpXS5hcmVnX251bSk7CisKKyAgaWYgKHJldHZhbCkKKyAgICBhc19mYXRhbCAoXygiSGFzaGluZyByZXR1cm5lZCBcIiVzXCIuIiksIHJldHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgbWRfYXNzZW1ibGU6ICBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbgorCisgICBBc3N1bXB0aW9ucyBhYm91dCB0aGUgcGFzc2VkLWluIHRleHQ6CisgIAktIGFsbCBjb21tZW50cywgbGFiZWxzIHJlbW92ZWQKKyAgCS0gdGV4dCBpcyBhbiBpbnN0cnVjdGlvbgorICAJLSBhbGwgd2hpdGUgc3BhY2UgY29tcHJlc3NlZCB0byBzaW5nbGUgYmxhbmtzCisgIAktIGFsbCBjaGFyYWN0ZXIgY29uc3RhbnRzIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGRlY2ltYWwKKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQKK21kX2Fzc2VtYmxlICh0ZXh0UCkKKyAgICAgY2hhciAqdGV4dFA7CQkvKiBTb3VyY2UgdGV4dCBvZiBpbnN0cnVjdGlvbiAqLworeworICAvKiBQYXJzZWQgaW5zdHJ1Y3Rpb24gdGV4dCwgY29udGFpbmluZyBOTyB3aGl0ZXNwYWNlOiBhcmdbMF0tPm9wY29kZQorICAgICBtbmVtb25pYyBhcmdbMS0zXS0+b3BlcmFuZHMsIHdpdGggY2hhciBjb25zdGFudHMgcmVwbGFjZWQgYnkKKyAgICAgZGVjaW1hbCBudW1iZXJzLiAgKi8KKyAgY2hhciAqYXJnc1s0XTsKKworICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIGluc3RydWN0aW9uIG9wZXJhbmRzICovCisgIC8qIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb24gKi8KKyAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsKKyAgLyogVFJVRSBpZmYgb3Bjb2RlIG1uZW1vbmljIGluY2x1ZGVkIGJyYW5jaC1wcmVkaWN0aW9uIHN1ZmZpeCAoIi5mIgorICAgICBvciAiLnQiKS4gICovCisgIGludCBicmFuY2hfcHJlZGljdDsKKyAgLyogU2V0dGluZyBvZiBicmFuY2gtcHJlZGljdGlvbiBiaXQocykgdG8gYmUgT1InZCBpbnRvIGluc3RydWN0aW9uCisgICAgIG9wY29kZSBvZiBDVFJML0NPQlIgZm9ybWF0IGluc3RydWN0aW9ucy4gICovCisgIGxvbmcgYnBfYml0czsKKworICBpbnQgbjsJCQkvKiBPZmZzZXQgb2YgbGFzdCBjaGFyYWN0ZXIgaW4gb3Bjb2RlIG1uZW1vbmljICovCisKKyAgY29uc3QgY2hhciAqYnBfZXJyb3JfbXNnID0gXygiYnJhbmNoIHByZWRpY3Rpb24gaW52YWxpZCBvbiB0aGlzIG9wY29kZSIpOworCisKKyAgLyogUGFyc2UgaW5zdHJ1Y3Rpb24gaW50byBvcGNvZGUgYW5kIG9wZXJhbmRzICovCisgIG1lbXNldCAoYXJncywgJ1wwJywgc2l6ZW9mIChhcmdzKSk7CisgIG5fb3BzID0gaV9zY2FuICh0ZXh0UCwgYXJncyk7CisgIGlmIChuX29wcyA9PSAtMSkKKyAgICB7CisgICAgICByZXR1cm47CQkJLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IGlzc3VlZCAqLworICAgIH0KKworICAvKiBEbyAibWFjcm8gc3Vic3RpdHV0aW9uIiAoc29ydCBvZikgb24gJ2xkY29uc3QnIHBzZXVkby1pbnN0cnVjdGlvbiAqLworICBpZiAoIXN0cmNtcCAoYXJnc1swXSwgImxkY29uc3QiKSkKKyAgICB7CisgICAgICBuX29wcyA9IHBhcnNlX2xkY29uc3QgKGFyZ3MpOworICAgICAgaWYgKG5fb3BzID09IC0xKQorCXsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisKKworICAvKiBDaGVjayBmb3IgYnJhbmNoLXByZWRpY3Rpb24gc3VmZml4IG9uIG9wY29kZSBtbmVtb25pYywgc3RyaXAgaXQgb2ZmICovCisgIG4gPSBzdHJsZW4gKGFyZ3NbMF0pIC0gMTsKKyAgYnJhbmNoX3ByZWRpY3QgPSAwOworICBicF9iaXRzID0gMDsKKyAgaWYgKGFyZ3NbMF1bbiAtIDFdID09ICcuJyAmJiAoYXJnc1swXVtuXSA9PSAndCcgfHwgYXJnc1swXVtuXSA9PSAnZicpKQorICAgIHsKKyAgICAgIC8qIFdlIGNvdWxkIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisJIHN1cHBvcnRzIGJyYW5jaCBwcmVkaWN0aW9uLCBidXQgd2h5IGJvdGhlcj8gIFRoZSBiaXQgd2lsbAorCSBqdXN0IGJlIGlnbm9yZWQgYnkgcHJvY2Vzc29ycyB0aGF0IGRvbid0IHVzZSBpdC4gICovCisgICAgICBicmFuY2hfcHJlZGljdCA9IDE7CisgICAgICBicF9iaXRzID0gKGFyZ3NbMF1bbl0gPT0gJ3QnKSA/IEJQX1RBS0VOIDogQlBfTk9UX1RBS0VOOworICAgICAgYXJnc1swXVtuIC0gMV0gPSAnXDAnOwkvKiBTdHJpcCBzdWZmaXggZnJvbSBvcGNvZGUgbW5lbW9uaWMgKi8KKyAgICB9CisKKyAgLyogTG9vayB1cCBvcGNvZGUgbW5lbW9uaWMgaW4gdGFibGUgYW5kIGNoZWNrIG51bWJlciBvZiBvcGVyYW5kcy4KKyAgICAgQ2hlY2sgdGhhdCBvcGNvZGUgaXMgbGVnYWwgZm9yIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgSWYgYWxsCisgICAgIGxvb2tzIGdvb2QsIGFzc2VtYmxlIGluc3RydWN0aW9uLiAgKi8KKyAgb1AgPSAoc3RydWN0IGk5NjBfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgYXJnc1swXSk7CisgIGlmICghb1AgfHwgIXRhcmdfaGFzX2ljbGFzcyAob1AtPmljbGFzcykpCisgICAgeworICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIG9wY29kZSwgXCIlc1wiLiIpLCBhcmdzWzBdKTsKKworICAgIH0KKyAgZWxzZSBpZiAobl9vcHMgIT0gb1AtPm51bV9vcHMpCisgICAgeworICAgICAgYXNfYmFkIChfKCJpbXByb3BlciBudW1iZXIgb2Ygb3BlcmFuZHMuICBleHBlY3RpbmcgJWQsIGdvdCAlZCIpLAorCSAgICAgIG9QLT5udW1fb3BzLCBuX29wcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChvUC0+Zm9ybWF0KQorCXsKKwljYXNlIEZCUkE6CisJY2FzZSBDVFJMOgorCSAgY3RybF9mbXQgKGFyZ3NbMV0sIG9QLT5vcGNvZGUgfCBicF9iaXRzLCBvUC0+bnVtX29wcyk7CisJICBpZiAob1AtPmZvcm1hdCA9PSBGQlJBKQorCSAgICB7CisJICAgICAgLyogTm93IGdlbmVyYXRlIGEgJ2JubycgdG8gc2FtZSBhcmcgKi8KKwkgICAgICBjdHJsX2ZtdCAoYXJnc1sxXSwgQk5PIHwgYnBfYml0cywgMSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgQ09CUjoKKwljYXNlIENPSjoKKwkgIGNvYnJfZm10IChhcmdzLCBvUC0+b3Bjb2RlIHwgYnBfYml0cywgb1ApOworCSAgYnJlYWs7CisJY2FzZSBSRUc6CisJICBpZiAoYnJhbmNoX3ByZWRpY3QpCisJICAgIHsKKwkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOworCSAgICB9CisJICByZWdfZm10IChhcmdzLCBvUCk7CisJICBicmVhazsKKwljYXNlIE1FTTE6CisJICBpZiAoYXJnc1swXVswXSA9PSAnYycgJiYgYXJnc1swXVsxXSA9PSAnYScpCisJICAgIHsKKwkgICAgICBpZiAoYnJhbmNoX3ByZWRpY3QpCisJCXsKKwkJICBhc193YXJuIChicF9lcnJvcl9tc2cpOworCQl9CisJICAgICAgbWVtX2ZtdCAoYXJncywgb1AsIDEpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJY2FzZSBNRU0yOgorCWNhc2UgTUVNNDoKKwljYXNlIE1FTTg6CisJY2FzZSBNRU0xMjoKKwljYXNlIE1FTTE2OgorCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQorCSAgICB7CisJICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKKwkgICAgfQorCSAgbWVtX2ZtdCAoYXJncywgb1AsIDApOworCSAgYnJlYWs7CisJY2FzZSBDQUxMSjoKKwkgIGlmIChicmFuY2hfcHJlZGljdCkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7CisJICAgIH0KKwkgIC8qIE91dHB1dCBvcGNvZGUgJiBzZXQgdXAgImZpeHVwIiAocmVsb2NhdGlvbik7IGZsYWcKKwkgICAgIHJlbG9jYXRpb24gYXMgJ2NhbGxqJyB0eXBlLiAgKi8KKwkgIGtub3cgKG9QLT5udW1fb3BzID09IDEpOworCSAgZ2V0X2NkaXNwIChhcmdzWzFdLCAiQ1RSTCIsIG9QLT5vcGNvZGUsIDI0LCAwLCAxKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBCQURfQ0FTRSAob1AtPmZvcm1hdCk7CisJICBicmVhazsKKwl9CisgICAgfQorfQkJCQkvKiBtZF9hc3NlbWJsZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgbWRfbnVtYmVyX3RvX2NoYXJzOiAgY29udmVydCBhIG51bWJlciB0byB0YXJnZXQgYnl0ZSBvcmRlcgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuKQorICAgICBjaGFyICpidWY7CisgICAgIHZhbHVlVCB2YWx1ZTsKKyAgICAgaW50IG47Cit7CisgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsdWUsIG4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1kX2NoYXJzX3RvX251bWJlcjogIGNvbnZlcnQgZnJvbSB0YXJnZXQgYnl0ZSBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitpbnQKK21kX2NoYXJzX3RvX251bWJlciAodmFsLCBuKQorICAgICB1bnNpZ25lZCBjaGFyICp2YWw7CS8qIFZhbHVlIGluIHRhcmdldCBieXRlIG9yZGVyICovCisgICAgIGludCBuOwkJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgaW5wdXQgKi8KK3sKKyAgaW50IHJldHZhbDsKKworICBmb3IgKHJldHZhbCA9IDA7IG4tLTspCisgICAgeworICAgICAgcmV0dmFsIDw8PSA4OworICAgICAgcmV0dmFsIHw9IHZhbFtuXTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKworI2RlZmluZSBNQVhfTElUVExFTlVNUwk2CisjZGVmaW5lIExOVU1fU0laRQlzaXplb2YoTElUVExFTlVNX1RZUEUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgbWRfYXRvZjoJY29udmVydCBhc2NpaSB0byBmbG9hdGluZyBwb2ludAorCisgICBUdXJuIGEgc3RyaW5nIGF0IGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgJ3R5cGUnLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGF0ICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCisgICBlbWl0dGVkIGlzIHJldHVybmVkIGF0ICdzaXplUCcuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBhIHBvaW50ZXIKKyAgIHRvIGFuIGVtcHR5IG1lc3NhZ2UgaWYgT0suCisKKyAgIE5vdGUgd2UgY2FsbCB0aGUgaTM4NiBmbG9hdGluZyBwb2ludCByb3V0aW5lLCByYXRoZXIgdGhhbiBjb21wbGljYXRpbmcKKyAgIHRoaW5ncyB3aXRoIG1vcmUgZmlsZXMgb3Igc3ltYm9saWMgbGlua3MuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBpbnQgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7CisgIGludCBwcmVjOworICBjaGFyICp0OworICBjaGFyICphdG9mX2llZWUgKCk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd0JzoKKyAgICBjYXNlICdUJzoKKyAgICAgIHByZWMgPSA1OworICAgICAgdHlwZSA9ICd4JzsJCS8qIFRoYXQncyB3aGF0IGF0b2ZfaWVlZSgpIHVuZGVyc3RhbmRzICovCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOworICAgIH0KKworICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKyAgICB9CisKKyAgKnNpemVQID0gcHJlYyAqIExOVU1fU0laRTsKKworICAvKiBPdXRwdXQgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlciBpbiBhY2NvcmQgd2l0aCBpODA5NjAKKyAgICAgd29yZC1vcmRlci4gIChEdW5ubyB3aHkgYXRvZl9pZWVlIGRvZXNuJ3QgZG8gaXQgaW4gdGhlIHJpZ2h0CisgICAgIG9yZGVyIGluIHRoZSBmaXJzdCBwbGFjZSAtLSBwcm9iYWJseSBiZWNhdXNlIGl0J3MgYSBoYWNrIG9mCisgICAgIGF0b2ZfbTY4ay4pICAqLworCisgIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFAtLSksIExOVU1fU0laRSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1kX251bWJlcl90b19pbW0KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQKK21kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuKQorICAgICBjaGFyICpidWY7CisgICAgIGxvbmcgdmFsOworICAgICBpbnQgbjsKK3sKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtZF9udW1iZXJfdG9fZGlzcAorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZAorbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQorICAgICBjaGFyICpidWY7CisgICAgIGxvbmcgdmFsOworICAgICBpbnQgbjsKK3sKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgbWRfbnVtYmVyX3RvX2ZpZWxkOgorCisgIAlTdGljayBhIHZhbHVlIChhbiBhZGRyZXNzIGZpeHVwKSBpbnRvIGEgYml0IGZpZWxkIG9mCisgIAlwcmV2aW91c2x5LWdlbmVyYXRlZCBpbnN0cnVjdGlvbi4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQKK21kX251bWJlcl90b19maWVsZCAoaW5zdHJQLCB2YWwsIGJmaXhQKQorICAgICBjaGFyICppbnN0clA7CQkvKiBQb2ludGVyIHRvIGluc3RydWN0aW9uIHRvIGJlIGZpeGVkICovCisgICAgIGxvbmcgdmFsOwkJCS8qIEFkZHJlc3MgZml4dXAgdmFsdWUgKi8KKyAgICAgYml0X2ZpeFMgKmJmaXhQOwkJLyogRGVzY3JpcHRpb24gb2YgYml0IGZpZWxkIHRvIGJlIGZpeGVkIHVwICovCit7CisgIGludCBudW1iaXRzOwkJCS8qIExlbmd0aCBvZiBiaXQgZmllbGQgdG8gYmUgZml4ZWQgKi8KKyAgbG9uZyBpbnN0cjsJCQkvKiAzMi1iaXQgaW5zdHJ1Y3Rpb24gdG8gYmUgZml4ZWQtdXAgKi8KKyAgbG9uZyBzaWduOwkJCS8qIDAgb3IgLTEsIGFjY29yZGluZyB0byBzaWduIGJpdCBvZiAndmFsJyAqLworCisgIC8qIENvbnZlcnQgaW5zdHJ1Y3Rpb24gYmFjayB0byBob3N0IGJ5dGUgb3JkZXIuICAqLworICBpbnN0ciA9IG1kX2NoYXJzX3RvX251bWJlciAoaW5zdHJQLCA0KTsKKworICAvKiBTdXJwcmlzZSEgLS0gd2Ugc3RvcmVkIHRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBtb2RpZmllZCByYXRoZXIKKyAgICAgdGhhbiBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUuICAqLworICBudW1iaXRzID0gKGludCkgYmZpeFA7CisgIGlmIChudW1iaXRzID09IDEpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIG5vLW9wLCBzdHVjayBoZXJlIGJ5IHJlbG9jX2NhbGxqKCkgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAga25vdyAoKG51bWJpdHMgPT0gMTMpIHx8IChudW1iaXRzID09IDI0KSk7CisKKyAgLyogUHJvcGFnYXRlIHNpZ24gYml0IG9mICd2YWwnIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuICBSZXN1bHQKKyAgICAgc2hvdWxkIGJlIGFsbCAwIG9yIGFsbCAxLiAgKi8KKyAgc2lnbiA9IHZhbCA+PiAoKGludCkgbnVtYml0cyAtIDEpOworICBpZiAoKCh2YWwgPCAwKSAmJiAoc2lnbiAhPSAtMSkpCisgICAgICB8fCAoKHZhbCA+IDApICYmIChzaWduICE9IDApKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIkZpeHVwIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIHdpZHRoIG9mICVkIiksCisJICAgICAgdmFsLCBudW1iaXRzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQdXQgYml0IGZpZWxkIGludG8gaW5zdHJ1Y3Rpb24gYW5kIHdyaXRlIGJhY2sgaW4gdGFyZ2V0CisgICAgICAgICAqIGJ5dGUgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHZhbCAmPSB+KC0xIDw8IChpbnQpIG51bWJpdHMpOwkvKiBDbGVhciB1bnVzZWQgc2lnbiBiaXRzICovCisgICAgICBpbnN0ciB8PSB2YWw7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGluc3RyUCwgaW5zdHIsIDQpOworICAgIH0KK30JCQkJLyogbWRfbnVtYmVyX3RvX2ZpZWxkKCkgKi8KKwwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtZF9wYXJzZV9vcHRpb24KKyAgCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCisgIAlTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBGb3IgdGhlIDk2MCwgdGhlc2UgYXJlOgorCisgIAktbm9yZWxheDoKKyAgCQlDb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSBkaXNwbGFjZW1lbnRzCisgIAkJZ3JlYXRlciB0aGFuIDEzIGJpdHMgKG9yIHRoYXQgaGF2ZSBleHRlcm5hbCB0YXJnZXRzKSBzaG91bGQKKyAgCQlnZW5lcmF0ZSBlcnJvcnMuICBUaGUgZGVmYXVsdCBpcyB0byByZXBsYWNlIGVhY2ggc3VjaAorICAJCWluc3RydWN0aW9uIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSAob3IgY2hrYml0KSBhbmQKKyAgCQlicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgTm90ZSB0aGF0IHRoZSBJbnRlbCAiaiIgY29iciBkaXJlY3RpdmVzCisgIAkJYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpbiB0aGlzIHdheSB3aGVuIG5lY2Vzc2FyeSwKKyAgCQlyZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoaXMgb3B0aW9uLgorCisgIAktYjoKKyAgCQlBZGQgY29kZSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGJyYW5jaGVzIHRha2VuLCBmb3IKKyAgCQlsYXRlciBvcHRpbWl6YXRpb24gb2YgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBieSBhIHNlcGFyYXRlCisgIAkJdG9vbC4gIENPQlIgYW5kIENOVEwgZm9ybWF0IGluc3RydWN0aW9ucyBoYXZlIGJyYW5jaAorICAJCXByZWRpY3Rpb24gYml0cyAoaW4gdGhlIENYIGFyY2hpdGVjdHVyZSk7ICBpZiAiQlIiIHJlcHJlc2VudHMKKyAgCQlhbiBpbnN0cnVjdGlvbiBpbiBvbmUgb2YgdGhlc2UgY2xhc3NlcywgdGhlIGZvbGxvd2luZyByZXAtCisgIAkJcmVzZW50cyB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlcjoKKworICAJCQljYWxsCTxpbmNyZW1lbnQgcm91dGluZT4KKyAgCQkJLndvcmQJMAkjIHByZS1jb3VudGVyCisgIAkJTGFiZWw6ICBCUgorICAJCQljYWxsCTxpbmNyZW1lbnQgcm91dGluZT4KKyAgCQkJLndvcmQJMAkjIHBvc3QtY291bnRlcgorCisgIAkJQSB0YWJsZSBvZiBhbGwgc3VjaCAiTGFiZWxzIiBpcyBhbHNvIGdlbmVyYXRlZC4KKworCisgIAktQUtBLCAtQUtCLCAtQUtDLCAtQVNBLCAtQVNCLCAtQU1DLCAtQUNBOgorICAJCVNlbGVjdCB0aGUgODA5NjAgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAorICAJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KKyAgCQlUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhbnkgaW5zdHJ1Y3Rpb24gb3IgZmVhdHVyZQorICAJCXRoYXQgaXMgc3VwcG9ydGVkIGJ5IFNPTUUgdmVyc2lvbiBvZiB0aGUgOTYwIChldmVuIGlmIHRoaXMKKyAgCQltZWFucyBtaXhpbmcgYXJjaGl0ZWN0dXJlcyEpLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOmIiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KK3sKKyNkZWZpbmUgT1BUSU9OX0xJTktSRUxBWCAoT1BUSU9OX01EX0JBU0UpCisgIHsibGlua3JlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSU5LUkVMQVh9LAorICB7ImxpbmstcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJTktSRUxBWH0sCisjZGVmaW5lIE9QVElPTl9OT1JFTEFYIChPUFRJT05fTURfQkFTRSArIDEpCisgIHsibm9yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9SRUxBWH0sCisgIHsibm8tcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PUkVMQVh9LAorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKKworc3RydWN0IHRhYmVudHJ5CisgIHsKKyAgICBjaGFyICpmbGFnOworICAgIGludCBhcmNoOworICB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0YWJlbnRyeSBhcmNoX3RhYltdID0KK3sKKyAgeyJLQSIsIEFSQ0hfS0F9LAorICB7IktCIiwgQVJDSF9LQn0sCisgIHsiU0EiLCBBUkNIX0tBfSwJCS8qIFN5bm9ueW0gZm9yIEtBICovCisgIHsiU0IiLCBBUkNIX0tCfSwJCS8qIFN5bm9ueW0gZm9yIEtCICovCisgIHsiS0MiLCBBUkNIX01DfSwJCS8qIFN5bm9ueW0gZm9yIE1DICovCisgIHsiTUMiLCBBUkNIX01DfSwKKyAgeyJDQSIsIEFSQ0hfQ0F9LAorICB7IkpYIiwgQVJDSF9KWH0sCisgIHsiSFgiLCBBUkNIX0hYfSwKKyAge05VTEwsIDB9Cit9OworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgT1BUSU9OX0xJTktSRUxBWDoKKyAgICAgIGxpbmtyZWxheCA9IDE7CisgICAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTk9SRUxBWDoKKyAgICAgIG5vcmVsYXggPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdiJzoKKyAgICAgIGluc3RydW1lbnRfYnJhbmNoZXMgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdBJzoKKyAgICAgIHsKKwljb25zdCBzdHJ1Y3QgdGFiZW50cnkgKnRwOworCWNoYXIgKnAgPSBhcmc7CisKKwlmb3IgKHRwID0gYXJjaF90YWI7IHRwLT5mbGFnICE9IE5VTEw7IHRwKyspCisJICBpZiAoIXN0cmNtcCAocCwgdHAtPmZsYWcpKQorCSAgICBicmVhazsKKworCWlmICh0cC0+ZmxhZyA9PSBOVUxMKQorCSAgeworCSAgICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlICVzIiksIHApOworCSAgICByZXR1cm4gMDsKKwkgIH0KKwllbHNlCisJICBhcmNoaXRlY3R1cmUgPSB0cC0+YXJjaDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGludCBpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIkk5NjAgb3B0aW9uczpcbiIpKTsKKyAgZm9yIChpID0gMDsgYXJjaF90YWJbaV0uZmxhZzsgaSsrKQorICAgIGZwcmludGYgKHN0cmVhbSwgIiVzLUElcyIsIGkgPyAiIHwgIiA6ICIiLCBhcmNoX3RhYltpXS5mbGFnKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcblwKKwkJCXNwZWNpZnkgdmFyaWFudCBvZiA5NjAgYXJjaGl0ZWN0dXJlXG5cCistYgkJCWFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlblxuXAorLWxpbmstcmVsYXgJCXByZXNlcnZlIGluZGl2aWR1YWwgYWxpZ25tZW50IGRpcmVjdGl2ZXMgc28gbGlua2VyXG5cCisJCQljYW4gZG8gcmVsYXhpbmcgKGIub3V0IGZvcm1hdCBvbmx5KVxuXAorLW5vLXJlbGF4CQlkb24ndCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvclxuXAorCQkJbG9uZyBkaXNwbGFjZW1lbnRzXG4iKSk7Cit9CisMCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtZF9jb252ZXJ0X2ZyYWc6CisgIAlDYWxsZWQgYnkgYmFzZSBhc3NlbWJsZXIgYWZ0ZXIgYWRkcmVzcyByZWxheGF0aW9uIGlzIGZpbmlzaGVkOiAgbW9kaWZ5CisgIAl2YXJpYWJsZSBmcmFnbWVudHMgYWNjb3JkaW5nIHRvIGhvdyBtdWNoIHJlbGF4YXRpb24gd2FzIGRvbmUuCisKKyAgCUlmIHRoZSBmcmFnbWVudCBzdWJzdGF0ZSBpcyBzdGlsbCAxLCBhIDEzLWJpdCBkaXNwbGFjZW1lbnQgd2FzIGVub3VnaAorICAJdG8gcmVhY2ggdGhlIHN5bWJvbCBpbiBxdWVzdGlvbi4gIFNldCB1cCBhbiBhZGRyZXNzIGZpeHVwLCBidXQgb3RoZXJ3aXNlCisgIAlsZWF2ZSB0aGUgY29iciBpbnN0cnVjdGlvbiBhbG9uZS4KKworICAJSWYgdGhlIGZyYWdtZW50IHN1YnN0YXRlIGlzIDIsIGEgMTMtYml0IGRpc3BsYWNlbWVudCB3YXMgbm90IGVub3VnaC4KKyAgCVJlcGxhY2UgdGhlIGNvYnIgd2l0aCBhIHR3byBpbnN0cnVjdGlvbnMgKGEgY29tcGFyZSBhbmQgYSBicmFuY2gpLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZAorbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKKyAgICAgc2VnVCBzZWc7CisgICAgIGZyYWdTICpmcmFnUDsKK3sKKyAgZml4UyAqZml4UDsJCQkvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBuZWVkZWQgYWRkcmVzcyBmaXggKi8KKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICAvKiBMRUFWRSBTSU5HTEUgQ09CUiBJTlNUUlVDVElPTiAqLworICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLAorCQkgICAgICBmcmFnUC0+ZnJfb3Bjb2RlIC0gZnJhZ1AtPmZyX2xpdGVyYWwsCisJCSAgICAgIDQsCisJCSAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCisJCSAgICAgIDEsCisJCSAgICAgIE5PX1JFTE9DKTsKKworICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgMTM7CS8qIHNpemUgb2YgYml0IGZpZWxkICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAvKiBSRVBMQUNFIENPQlIgV0lUSCBDT01QQVJFL0JSQU5DSCBJTlNUUlVDVElPTlMgKi8KKyAgICAgIHJlbGF4X2NvYnIgKGZyYWdQKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4OiAgSG93IG11Y2ggZG9lcyBpdCBsb29rIGxpa2UgKmZyYWdQIHdpbGwgZ3Jvdz8KKworICAJQ2FsbGVkIGJ5IGJhc2UgYXNzZW1ibGVyIGp1c3QgYmVmb3JlIGFkZHJlc3MgcmVsYXhhdGlvbi4KKyAgCVJldHVybiB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBmcmFnbWVudCB3aWxsIGdyb3cuCisKKyAgCUFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkOyBjb2JyJ3MKKyAgCWJhc2VkIG9uIHVuZGVmaW5lZCBzeW1ib2xzIHdpbGwgaGF2ZSB0byBiZSByZXBsYWNlZCB3aXRoIGEgY29tcGFyZQorICAJaW5zdHJ1Y3Rpb24gYW5kIGEgYnJhbmNoIGluc3RydWN0aW9uLCBhbmQgdGhlIGNvZGUgZnJhZ21lbnQgd2lsbCBncm93CisgIAlieSA0IGJ5dGVzLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKK3sKKyAgLyogSWYgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGdvIHRvICJyZWxheGVkIiBzdGF0ZQorICAgICAoY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIGNvYnIpIHJpZ2h0IG5vdy4gICovCisgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50X3R5cGUpCisgICAgeworICAgICAgcmVsYXhfY29iciAoZnJhZ1ApOworICAgICAgcmV0dXJuIDQ7CisgICAgfQorICByZXR1cm4gMDsKK30JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgbWRfcmlfdG9fY2hhcnM6CisgIAlUaGlzIHJvdXRpbmUgZXhpc3RzIGluIG9yZGVyIHRvIG92ZXJjb21lIG1hY2hpbmUgYnl0ZS1vcmRlciBwcm9ibGVtcworICAJd2hlbiBkZWFsaW5nIHdpdGggYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QuCisKKyAgCUJ1dCByZWxvY2F0aW9uIGluZm8gd2lsbCBiZSB1c2VkIG9uIHRoZSBob3N0IG1hY2hpbmUgb25seSAob25seQorICAJZXhlY3V0YWJsZSBjb2RlIGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIGk4MDk2MCkuICBUaGVyZWZvcmUsCisgIAl3ZSBsZWF2ZSBpdCBpbiBob3N0IGJ5dGUgb3JkZXIuCisKKyAgCVRoZSBhYm92ZSBjb21tZW50IGlzIG5vIGxvbmdlciB0cnVlLiAgVGhpcyByb3V0aW5lIG5vdyByZWFsbHkKKyAgCWRvZXMgZG8gdGhlIHJlb3JkZXJpbmcgKElhbiBUYXlsb3IgMjggQXVnIDkyKS4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQKK21kX3JpX3RvX2NoYXJzICh3aGVyZSwgcmkpCisgICAgIGNoYXIgKndoZXJlOworICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaTsKK3sKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgcmktPnJfYWRkcmVzcywKKwkJICAgICAgc2l6ZW9mIChyaS0+cl9hZGRyZXNzKSk7CisgIHdoZXJlWzRdID0gcmktPnJfaW5kZXggJiAweDBmZjsKKyAgd2hlcmVbNV0gPSAocmktPnJfaW5kZXggPj4gOCkgJiAweDBmZjsKKyAgd2hlcmVbNl0gPSAocmktPnJfaW5kZXggPj4gMTYpICYgMHgwZmY7CisgIHdoZXJlWzddID0gKChyaS0+cl9wY3JlbCA8PCAwKQorCSAgICAgIHwgKHJpLT5yX2xlbmd0aCA8PCAxKQorCSAgICAgIHwgKHJpLT5yX2V4dGVybiA8PCAzKQorCSAgICAgIHwgKHJpLT5yX2JzciA8PCA0KQorCSAgICAgIHwgKHJpLT5yX2Rpc3AgPDwgNSkKKwkgICAgICB8IChyaS0+cl9jYWxsaiA8PCA2KSk7Cit9CisKKyNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCisMCisvKiBGT0xMT1dJTkcgQVJFIFRIRSBMT0NBTCBST1VUSU5FUywgSU4gQUxQSEFCRVRJQ0FMIE9SREVSICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGJyY250X2VtaXQ6CUVtaXQgY29kZSB0byBpbmNyZW1lbnQgaW5saW5lIGJyYW5jaCBjb3VudGVyLgorCisgIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgorICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkCiticmNudF9lbWl0ICgpCit7CisgIGN0cmxfZm10IChCUl9DTlRfRlVOQywgQ0FMTCwgMSk7CS8qIEVtaXQgY2FsbCB0byAiaW5jcmVtZW50IiByb3V0aW5lICovCisgIGVtaXQgKDApOwkJCS8qIEVtaXQgaW5saW5lIGNvdW50ZXIgdG8gYmUgaW5jcmVtZW50ZWQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBicmxhYl9uZXh0OglnZW5lcmF0ZSB0aGUgbmV4dCBicmFuY2ggbG9jYWwgbGFiZWwKKworICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KKyAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgY2hhciAqCiticmxhYl9uZXh0ICgpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZlsyMF07CisKKyAgc3ByaW50ZiAoYnVmLCAiJXMlZCIsIEJSX0xBQkVMX0JBU0UsIGJyX2NudCsrKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBicnRhYl9lbWl0OglnZW5lcmF0ZSB0aGUgZmV0Y2gtcHJlZGljdGlvbiBicmFuY2ggdGFibGUuCisKKyAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCisgIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCisKKyAgCVRoZSBjb2RlIGVtaXR0ZWQgaGVyZSB3b3VsZCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nCisgIAlleGFtcGxlIGFzc2VtYmxlciBzb3VyY2UuCisKKyAgCQkJLmRhdGEKKyAgCQkJLmFsaWduCTIKKyAgCSAgIEJSX1RBQl9OQU1FOgorICAJCQkud29yZAkwCQkjIGxpbmsgdG8gbmV4dCB0YWJsZQorICAJCQkud29yZAkzCQkjIGxlbmd0aCBvZiB0YWJsZQorICAJCQkud29yZAlMQlJBTkNIMAkjIDFzdCBlbnRyeSBpbiB0YWJsZSBwcm9wZXIKKyAgCQkJLndvcmQJTEJSQU5DSDEKKyAgCQkJLndvcmQJTEJSQU5DSDIKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZAorYnJ0YWJfZW1pdCAoKQoreworICBpbnQgaTsKKyAgY2hhciBidWZbMjBdOworICBjaGFyICpwOwkJCS8qIFdoZXJlIHRoZSBiaW5hcnkgd2FzIG91dHB1dCB0byAqLworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGRlZmVycmVkIGFkZHJlc3MgZml4dXAuICAqLworICBmaXhTICpmaXhQOworCisgIGlmICghaW5zdHJ1bWVudF9icmFuY2hlcykKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMCk7CS8qICAgICAgLmRhdGEgKi8KKyAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CQkvKiAgICAgIC5hbGlnbiAyICovCisgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOworICBjb2xvbiAoQlJfVEFCX05BTUUpOwkJLyogQlJfVEFCX05BTUU6ICovCisgIGVtaXQgKDApOwkJCS8qICAgICAgLndvcmQgMCAjbGluayB0byBuZXh0IHRhYmxlICovCisgIGVtaXQgKGJyX2NudCk7CQkvKiAgICAgIC53b3JkIG4gI2xlbmd0aCBvZiB0YWJsZSAqLworCisgIGZvciAoaSA9IDA7IGkgPCBicl9jbnQ7IGkrKykKKyAgICB7CisgICAgICBzcHJpbnRmIChidWYsICIlcyVkIiwgQlJfTEFCRUxfQkFTRSwgaSk7CisgICAgICBwID0gZW1pdCAoMCk7CisgICAgICBmaXhQID0gZml4X25ldyAoZnJhZ19ub3csCisJCSAgICAgIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJICAgICAgNCwKKwkJICAgICAgc3ltYm9sX2ZpbmQgKGJ1ZiksCisJCSAgICAgIDAsCisJCSAgICAgIDAsCisJCSAgICAgIE5PX1JFTE9DKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgY29icl9mbXQ6CWdlbmVyYXRlIGEgQ09CUi1mb3JtYXQgaW5zdHJ1Y3Rpb24KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYwordm9pZAorY29icl9mbXQgKGFyZywgb3Bjb2RlLCBvUCkKKyAgICAgLyogYXJnWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ1sxLTNdLT5vcGVyYW5kcyAoYXNjaWkpICovCisgICAgIGNoYXIgKmFyZ1tdOworICAgICAvKiBPcGNvZGUsIHdpdGggYnJhbmNoLXByZWRpY3Rpb24gYml0cyBhbHJlYWR5IHNldCBpZiBuZWNlc3NhcnkuICAqLworICAgICBsb25nIG9wY29kZTsKKyAgICAgLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbi4gICovCisgICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7Cit7CisgIGxvbmcgaW5zdHI7CQkJLyogMzItYml0IGluc3RydWN0aW9uICovCisgIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KKyAgaW50IG47CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCisgIGludCB2YXJfZnJhZzsJCQkvKiAxIGlmIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQgc2hvdWxkCisJCQkJICogICAgYmUgZW1pdHRlZDsgIDAgaWYgYW4gYWRkcmVzcyBmaXgKKwkJCQkgKiAgICAgIHNob3VsZCBiZSBlbWl0dGVkLgorCQkJCSAqLworCisgIGluc3RyID0gb3Bjb2RlOworICBuID0gb1AtPm51bV9vcHM7CisKKyAgaWYgKG4gPj0gMSkKKyAgICB7CisgICAgICAvKiBGaXJzdCBvcGVyYW5kIChpZiBhbnkpIG9mIGEgQ09CUiBpcyBhbHdheXMgYSByZWdpc3RlcgorCSBvcGVyYW5kLiAgUGFyc2UgaXQuICAqLworICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnWzFdLCBvUC0+b3BlcmFuZFswXSk7CisgICAgICBpbnN0ciB8PSAocmVnb3AubiA8PCAxOSkgfCAocmVnb3AubW9kZSA8PCAxMyk7CisgICAgfQorICBpZiAobiA+PSAyKQorICAgIHsKKyAgICAgIC8qIFNlY29uZCBvcGVyYW5kIChpZiBhbnkpIG9mIGEgQ09CUiBpcyBhbHdheXMgYSByZWdpc3RlcgorCSBvcGVyYW5kLiAgUGFyc2UgaXQuICAqLworICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ1syXSwgb1AtPm9wZXJhbmRbMV0pOworICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDwgMTQpIHwgcmVnb3Auc3BlY2lhbDsKKyAgICB9CisKKworICBpZiAobiA8IDMpCisgICAgeworICAgICAgZW1pdCAoaW5zdHIpOworCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGluc3RydW1lbnRfYnJhbmNoZXMpCisJeworCSAgYnJjbnRfZW1pdCAoKTsKKwkgIGNvbG9uIChicmxhYl9uZXh0ICgpKTsKKwl9CisKKyAgICAgIC8qIEEgdGhpcmQgb3BlcmFuZCB0byBhIENPQlIgaXMgYWx3YXlzIGEgZGlzcGxhY2VtZW50LiAgUGFyc2UKKyAgICAgICAgIGl0OyBpZiBpdCdzIHJlbGF4YWJsZSAoYSBjb2JyICJqIiBkaXJlY3RpdmUsIG9yIGFueSBjb2JyCisgICAgICAgICBvdGhlciB0aGFuIGJicy9iYmMgd2hlbiB0aGUgIi1ub3JlbGF4IiBvcHRpb24gaXMgbm90IGluIHVzZSkKKyAgICAgICAgIHNldCB1cCBhIHZhcmlhYmxlIGNvZGUgZnJhZ21lbnQ7IG90aGVyd2lzZSBzZXQgdXAgYW4gYWRkcmVzcworICAgICAgICAgZml4LiAgKi8KKyAgICAgIHZhcl9mcmFnID0gIW5vcmVsYXggfHwgKG9QLT5mb3JtYXQgPT0gQ09KKTsJLyogVFJVRSBvciBGQUxTRSAqLworICAgICAgZ2V0X2NkaXNwIChhcmdbM10sICJDT0JSIiwgaW5zdHIsIDEzLCB2YXJfZnJhZywgMCk7CisKKyAgICAgIGlmIChpbnN0cnVtZW50X2JyYW5jaGVzKQorCXsKKwkgIGJyY250X2VtaXQgKCk7CisJfQorICAgIH0KK30JCQkJLyogY29icl9mbXQoKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgY3RybF9mbXQ6CWdlbmVyYXRlIGEgQ1RSTC1mb3JtYXQgaW5zdHJ1Y3Rpb24KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYwordm9pZAorY3RybF9mbXQgKHRhcmdQLCBvcGNvZGUsIG51bV9vcHMpCisgICAgIGNoYXIgKnRhcmdQOwkJLyogUG9pbnRlciB0byB0ZXh0IG9mIGxvbmUgb3BlcmFuZCAoaWYgYW55KSAqLworICAgICBsb25nIG9wY29kZTsJCS8qIFRlbXBsYXRlIG9mIGluc3RydWN0aW9uICovCisgICAgIGludCBudW1fb3BzOwkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCit7CisgIGludCBpbnN0cnVtZW50OwkJLyogVFJVRSBpZmYgd2Ugc2hvdWxkIGFkZCBpbnN0cnVtZW50YXRpb24gdG8gdHJhY2sKKwkJCQkgICAqIGhvdyBvZnRlbiB0aGUgYnJhbmNoIGlzIHRha2VuCisJCQkJICovCisKKworICBpZiAobnVtX29wcyA9PSAwKQorICAgIHsKKyAgICAgIGVtaXQgKG9wY29kZSk7CQkvKiBPdXRwdXQgb3Bjb2RlICovCisgICAgfQorICBlbHNlCisgICAgeworCisgICAgICBpbnN0cnVtZW50ID0gaW5zdHJ1bWVudF9icmFuY2hlcyAmJiAob3Bjb2RlICE9IENBTEwpCisJJiYgKG9wY29kZSAhPSBCKSAmJiAob3Bjb2RlICE9IFJFVCkgJiYgKG9wY29kZSAhPSBCQUwpOworCisgICAgICBpZiAoaW5zdHJ1bWVudCkKKwl7CisJICBicmNudF9lbWl0ICgpOworCSAgY29sb24gKGJybGFiX25leHQgKCkpOworCX0KKworICAgICAgLyogVGhlIG9wZXJhbmQgTVVTVCBiZSBhbiBpcC1yZWxhdGl2ZSBkaXNwbGFjbWVudC4gUGFyc2UgaXQKKyAgICAgICAgICogYW5kIHNldCB1cCBhZGRyZXNzIGZpeCBmb3IgdGhlIGluc3RydWN0aW9uIHdlIGp1c3Qgb3V0cHV0LgorICAgICAgICovCisgICAgICBnZXRfY2Rpc3AgKHRhcmdQLCAiQ1RSTCIsIG9wY29kZSwgMjQsIDAsIDApOworCisgICAgICBpZiAoaW5zdHJ1bWVudCkKKwl7CisJICBicmNudF9lbWl0ICgpOworCX0KKyAgICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGVtaXQ6CW91dHB1dCBpbnN0cnVjdGlvbiBiaW5hcnkKKworICAJT3V0cHV0IGluc3RydWN0aW9uIGJpbmFyeSwgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIsIDQgYnl0ZXMgYXQgYSB0aW1lLgorICAJUmV0dXJuIHBvaW50ZXIgdG8gd2hlcmUgaXQgd2FzIHBsYWNlZC4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYworY2hhciAqCitlbWl0IChpbnN0cikKKyAgICAgbG9uZyBpbnN0cjsJCS8qIFdvcmQgdG8gYmUgb3V0cHV0LCBob3N0IGJ5dGUgb3JkZXIgKi8KK3sKKyAgY2hhciAqdG9QOwkJCS8qIFdoZXJlIHRvIG91dHB1dCBpdCAqLworCisgIHRvUCA9IGZyYWdfbW9yZSAoNCk7CQkvKiBBbGxvY2F0ZSBzdG9yYWdlICovCisgIG1kX251bWJlcl90b19jaGFycyAodG9QLCBpbnN0ciwgNCk7CS8qIENvbnZlcnQgdG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKyAgcmV0dXJuIHRvUDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGdldF9hcmdzOglicmVhayBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvdXQgb2YgY29tbWEtc2VwYXJhdGVkIGxpc3QKKworICAgSW5wdXQgYXNzdW1wdGlvbnM6CisgIAktIGFsbCBjb21tZW50cyBhbmQgbGFiZWxzIGhhdmUgYmVlbiByZW1vdmVkCisgIAktIGFsbCBzdHJpbmdzIG9mIHdoaXRlc3BhY2UgaGF2ZSBiZWVuIGNvbGxhcHNlZCB0byBhIHNpbmdsZSBibGFuay4KKyAgCS0gYWxsIGNoYXJhY3RlciBjb25zdGFudHMgKCd4JykgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZGVjaW1hbAorCisgICBPdXRwdXQ6CisgIAlhcmdzWzBdIGlzIHVudG91Y2hlZC4gYXJnc1sxXSBwb2ludHMgdG8gZmlyc3Qgb3BlcmFuZCwgZXRjLiBBbGwgYXJnczoKKyAgCS0gYXJlIE5VTEwtdGVybWluYXRlZAorICAJLSBjb250YWluIG5vIHdoaXRlc3BhY2UKKworICAgUmV0dXJuIHZhbHVlOgorICAJTnVtYmVyIG9mIG9wZXJhbmRzICgwLDEsMiwgb3IgMykgb3IgLTEgb24gZXJyb3IuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgaW50CitnZXRfYXJncyAocCwgYXJncykKKyAgICAgLyogUG9pbnRlciB0byBjb21tYS1zZXBhcmF0ZWQgb3BlcmFuZHM7IE1VQ0tFRCBCWSBVUyAqLworICAgICByZWdpc3RlciBjaGFyICpwOworICAgICAvKiBPdXRwdXQgYXJnOiBwb2ludGVycyB0byBvcGVyYW5kcyBwbGFjZWQgaW4gYXJnc1sxLTNdLiAgTVVTVAorICAgICAgICBBQ0NPTU1PREFURSA0IEVOVFJJRVMgKGFyZ3NbMC0zXSkuICAqLworICAgICBjaGFyICphcmdzW107Cit7CisgIHJlZ2lzdGVyIGludCBuOwkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCisgIHJlZ2lzdGVyIGNoYXIgKnRvOworCisgIC8qIFNraXAgbGVhZCB3aGl0ZSBzcGFjZSAqLworICB3aGlsZSAoKnAgPT0gJyAnKQorICAgIHsKKyAgICAgIHArKzsKKyAgICB9CisKKyAgaWYgKCpwID09ICdcMCcpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG4gPSAxOworICBhcmdzWzFdID0gcDsKKworICAvKiBTcXVlemUgYmxhbmtzIG91dCBieSBtb3Zpbmcgbm9uLWJsYW5rcyB0b3dhcmQgc3RhcnQgb2Ygc3RyaW5nLgorICAgICAqIElzb2xhdGUgb3BlcmFuZHMsIHdoZW5ldmVyIGNvbW1hIGlzIGZvdW5kLgorICAgKi8KKyAgdG8gPSBwOworICB3aGlsZSAoKnAgIT0gJ1wwJykKKyAgICB7CisKKyAgICAgIGlmICgqcCA9PSAnICcKKwkgICYmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBwWzFdKQorCSAgICAgIHx8ICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHBbLTFdKSkpCisJeworCSAgcCsrOworCisJfQorICAgICAgZWxzZSBpZiAoKnAgPT0gJywnKQorCXsKKworCSAgLyogU3RhcnQgb2Ygb3BlcmFuZCAqLworCSAgaWYgKG4gPT0gMykKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgb3BlcmFuZHMiKSk7CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisJICAqdG8rKyA9ICdcMCc7CQkvKiBUZXJtaW5hdGUgYXJndW1lbnQgKi8KKwkgIGFyZ3NbKytuXSA9IHRvOwkvKiBTdGFydCBuZXh0IGFyZ3VtZW50ICovCisJICBwKys7CisKKwl9CisgICAgICBlbHNlCisJeworCSAgKnRvKysgPSAqcCsrOworCX0KKyAgICB9CisgICp0byA9ICdcMCc7CisgIHJldHVybiBuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgZ2V0X2NkaXNwOgloYW5kbGUgZGlzcGxhY2VtZW50IGZvciBhIENPQlIgb3IgQ1RSTCBpbnN0cnVjdGlvbi4KKworICAJUGFyc2UgZGlzcGxhY2VtZW50IGZvciBhIENPQlIgb3IgQ1RSTCBpbnN0cnVjdGlvbi4KKworICAJSWYgc3VjY2Vzc2Z1bCwgb3V0cHV0IHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUgYW5kIHNldCB1cCBmb3IgaXQsCisgIAlkZXBlbmRpbmcgb24gdGhlIGFyZyAndmFyX2ZyYWcnLCBlaXRoZXI6CisgIAkgICAgbyBhbiBhZGRyZXNzIGZpeHVwIHRvIGJlIGRvbmUgd2hlbiBhbGwgc3ltYm9sIHZhbHVlcyBhcmUga25vd24sIG9yCisgIAkgICAgbyBhIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQsIHdpdGggYWRkcmVzcyBmaXh1cCBpbmZvLiAgVGhpcworICAJCXdpbGwgYmUgZG9uZSBmb3IgY29iciBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgaGF2ZSB0byBiZSByZWxheGVkCisgIAkJaW4gdG8gY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zICg4IGJ5dGVzKSBpZiB0aGUgZmluYWwKKyAgCQlhZGRyZXNzIGRpc3BsYWNlbWVudCBpcyBncmVhdGVyIHRoYW4gMTMgYml0cy4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCit2b2lkCitnZXRfY2Rpc3AgKGRpc3BQLCBpZm10UCwgaW5zdHIsIG51bWJpdHMsIHZhcl9mcmFnLCBjYWxsaikKKyAgICAgLyogZGlzcGxhY2VtZW50IGFzIHNwZWNpZmllZCBpbiBzb3VyY2UgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgY2hhciAqZGlzcFA7CisgICAgIC8qICJDT0JSIiBvciAiQ1RSTCIgKGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZSkgKi8KKyAgICAgY2hhciAqaWZtdFA7CisgICAgIC8qIEluc3RydWN0aW9uIG5lZWRpbmcgdGhlIGRpc3BsYWNlbWVudCAqLworICAgICBsb25nIGluc3RyOworICAgICAvKiAjIGJpdHMgb2YgZGlzcGxhY2VtZW50ICgxMyBmb3IgQ09CUiwgMjQgZm9yIENUUkwpICovCisgICAgIGludCBudW1iaXRzOworICAgICAvKiAxIGlmIHZhcnlpbmcgbGVuZ3RoIGNvZGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQ7CisgICAgICAqICAgICAgIDAgaWYgYW4gYWRkcmVzcyBmaXggc2hvdWxkIGJlIGVtaXR0ZWQuCisgICAgICAqLworICAgICBpbnQgdmFyX2ZyYWc7CisgICAgIC8qIDEgaWYgY2FsbGogcmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZTsgZWxzZSAwICovCisgICAgIGludCBjYWxsajsKK3sKKyAgZXhwcmVzc2lvblMgZTsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCisgIGZpeFMgKmZpeFA7CQkJLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgbmVlZGVkIGFkZHJlc3MgZml4ICovCisgIGNoYXIgKm91dFA7CQkJLyogV2hlcmUgaW5zdHJ1Y3Rpb24gYmluYXJ5IGlzIG91dHB1dCB0byAqLworCisgIGZpeFAgPSBOVUxMOworCisgIHBhcnNlX2V4cHIgKGRpc3BQLCAmZSk7CisgIHN3aXRjaCAoZS5YX29wKQorICAgIHsKKyAgICBjYXNlIE9faWxsZWdhbDoKKyAgICAgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiKSk7CisKKyAgICBjYXNlIE9fc3ltYm9sOgorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGUuWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCisJICB8fCBTX0dFVF9TRUdNRU5UIChlLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCisJeworCSAgaWYgKHZhcl9mcmFnKQorCSAgICB7CisJICAgICAgb3V0UCA9IGZyYWdfbW9yZSAoOCk7CS8qIEFsbG9jYXRlIHdvcnN0LWNhc2Ugc3RvcmFnZSAqLworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3V0UCwgaW5zdHIsIDQpOworCSAgICAgIGZyYWdfdmFyaWFudCAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDQsIDEsCisJCQkgICAgYWRkcyAoZSksIG9mZnMgKGUpLCBvdXRQKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogU2V0IHVwIGEgbmV3IGZpeCBzdHJ1Y3R1cmUsIHNvIGFkZHJlc3MgY2FuIGJlIHVwZGF0ZWQKKwkgICAgICAgKiB3aGVuIGFsbCBzeW1ib2wgdmFsdWVzIGFyZSBrbm93bi4KKwkgICAgICAgKi8KKwkgICAgICBvdXRQID0gZW1pdCAoaW5zdHIpOworCSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnX25vdywKKwkJCSAgICAgIG91dFAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJCSAgICAgIDQsCisJCQkgICAgICBhZGRzIChlKSwKKwkJCSAgICAgIG9mZnMgKGUpLAorCQkJICAgICAgMSwKKwkJCSAgICAgIE5PX1JFTE9DKTsKKworCSAgICAgIGZpeFAtPmZ4X3RjYml0ID0gY2FsbGo7CisKKwkgICAgICAvKiBXZSB3YW50IHRvIG1vZGlmeSBhIGJpdCBmaWVsZCB3aGVuIHRoZSBhZGRyZXNzIGlzCisJICAgICAgICoga25vd24uICBCdXQgd2UgZG9uJ3QgbmVlZCBhbGwgdGhlIGdhcmJhZ2UgaW4gdGhlCisJICAgICAgICogYml0X2ZpeCBzdHJ1Y3R1cmUuICBTbyB3ZSdyZSBnb2luZyB0byBsaWUgYW5kIHN0b3JlCisJICAgICAgICogdGhlIG51bWJlciBvZiBiaXRzIGFmZmVjdGVkIGluc3RlYWQgb2YgYSBwb2ludGVyLgorCSAgICAgICAqLworCSAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIG51bWJpdHM7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJhdHRlbXB0IHRvIGJyYW5jaCBpbnRvIGRpZmZlcmVudCBzZWdtZW50IikpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYXNfYmFkIChfKCJ0YXJnZXQgb2YgJXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBhIGxhYmVsIiksIGlmbXRQKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGdldF9pc3BlYzoJcGFyc2UgYSBtZW1vcnkgb3BlcmFuZCBmb3IgYW4gaW5kZXggc3BlY2lmaWNhdGlvbgorCisgIAlIZXJlLCBhbiAiaW5kZXggc3BlY2lmaWNhdGlvbiIgaXMgdGFrZW4gdG8gYmUgYW55dGhpbmcgc3Vycm91bmRlZAorICAJYnkgc3F1YXJlIGJyYWNrZXRzIGFuZCBOT1QgZm9sbG93ZWQgYnkgYW55dGhpbmcgZWxzZS4KKworICAJSWYgaXQncyBmb3VuZCwgZGV0YWNoIGl0IGZyb20gdGhlIGlucHV0IHN0cmluZywgcmVtb3ZlIHRoZSBzdXJyb3VuZGluZworICAJc3F1YXJlIGJyYWNrZXRzLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gIE90aGVyd2lzZSwgcmV0dXJuIE5VTEwuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMKK2NoYXIgKgorZ2V0X2lzcGVjICh0ZXh0UCkKKyAgICAgLyogUG9pbnRlciB0byBtZW1vcnkgb3BlcmFuZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbiwgbm8gd2hpdGUgc3BhY2UuICAqLworICAgICBjaGFyICp0ZXh0UDsKK3sKKyAgLyogUG9pbnRzIHRvIHN0YXJ0IG9mIGluZGV4IHNwZWNpZmljYXRpb24uICAqLworICBjaGFyICpzdGFydDsKKyAgLyogUG9pbnRzIHRvIGVuZCBvZiBpbmRleCBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgY2hhciAqZW5kOworCisgIC8qIEZpbmQgb3BlbmluZyBzcXVhcmUgYnJhY2tldCwgaWYgYW55LiAgKi8KKyAgc3RhcnQgPSBzdHJjaHIgKHRleHRQLCAnWycpOworCisgIGlmIChzdGFydCAhPSBOVUxMKQorICAgIHsKKworICAgICAgLyogRWxpbWluYXRlICdbJywgZGV0YWNoIGZyb20gcmVzdCBvZiBvcGVyYW5kICovCisgICAgICAqc3RhcnQrKyA9ICdcMCc7CisKKyAgICAgIGVuZCA9IHN0cmNociAoc3RhcnQsICddJyk7CisKKyAgICAgIGlmIChlbmQgPT0gTlVMTCkKKwl7CisJICBhc19iYWQgKF8oInVubWF0Y2hlZCAnWyciKSk7CisKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRWxpbWluYXRlICddJyBhbmQgbWFrZSBzdXJlIGl0IHdhcyB0aGUgbGFzdCB0aGluZworCSAgICAgKiBpbiB0aGUgc3RyaW5nLgorCSAgICovCisJICAqZW5kID0gJ1wwJzsKKwkgIGlmICgqKGVuZCArIDEpICE9ICdcMCcpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImdhcmJhZ2UgYWZ0ZXIgaW5kZXggc3BlYyBpZ25vcmVkIikpOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIHN0YXJ0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIGdldF9yZWdudW06CisKKyAgCUxvb2sgdXAgYSAoc3VzcGVjdGVkKSByZWdpc3RlciBuYW1lIGluIHRoZSByZWdpc3RlciB0YWJsZSBhbmQgcmV0dXJuIHRoZQorICAJYXNzb2NpYXRlZCByZWdpc3RlciBudW1iZXIgKG9yIC0xIGlmIG5vdCBmb3VuZCkuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMKK2ludAorZ2V0X3JlZ251bSAocmVnbmFtZSkKKyAgICAgY2hhciAqcmVnbmFtZTsJCS8qIFN1c3BlY3RlZCByZWdpc3RlciBuYW1lICovCit7CisgIGludCAqclA7CisKKyAgclAgPSAoaW50ICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHJlZ25hbWUpOworICByZXR1cm4gKHJQID09IE5VTEwpID8gLTEgOiAqclA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBpX3NjYW46CXBlcmZvcm0gbGV4aWNhbCBzY2FuIG9mIGFzY2lpIGFzc2VtYmxlciBpbnN0cnVjdGlvbi4KKworICAgSW5wdXQgYXNzdW1wdGlvbnM6CisgIAktIGlucHV0IHN0cmluZyBpcyBhbiBpODA5NjAgaW5zdHJ1Y3Rpb24gKG5vdCBhIHBzZXVkby1vcCkKKyAgCS0gYWxsIGNvbW1lbnRzIGFuZCBsYWJlbHMgaGF2ZSBiZWVuIHJlbW92ZWQKKyAgCS0gYWxsIHN0cmluZ3Mgb2Ygd2hpdGVzcGFjZSBoYXZlIGJlZW4gY29sbGFwc2VkIHRvIGEgc2luZ2xlIGJsYW5rLgorCisgICBPdXRwdXQ6CisgIAlhcmdzWzBdIHBvaW50cyB0byBvcGNvZGUsIG90aGVyIGVudHJpZXMgcG9pbnQgdG8gb3BlcmFuZHMuIEFsbCBzdHJpbmdzOgorICAJLSBhcmUgTlVMTC10ZXJtaW5hdGVkCisgIAktIGNvbnRhaW4gbm8gd2hpdGVzcGFjZQorICAJLSBoYXZlIGNoYXJhY3RlciBjb25zdGFudHMgKCd4JykgcmVwbGFjZWQgd2l0aCBhIGRlY2ltYWwgbnVtYmVyCisKKyAgIFJldHVybiB2YWx1ZToKKyAgCU51bWJlciBvZiBvcGVyYW5kcyAoMCwxLDIsIG9yIDMpIG9yIC0xIG9uIGVycm9yLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGludAoraV9zY2FuIChpUCwgYXJncykKKyAgICAgLyogUG9pbnRlciB0byBhc2NpaSBpbnN0cnVjdGlvbjsgIE1VQ0tFRCBCWSBVUy4gKi8KKyAgICAgcmVnaXN0ZXIgY2hhciAqaVA7CisgICAgIC8qIE91dHB1dCBhcmc6IHBvaW50ZXJzIHRvIG9wY29kZSBhbmQgb3BlcmFuZHMgcGxhY2VkIGhlcmUuICBNVVNUCisJQUNDT01NT0RBVEUgNCBFTlRSSUVTLiAgKi8KKyAgICAgY2hhciAqYXJnc1tdOworeworCisgIC8qIElzb2xhdGUgb3Bjb2RlICovCisgIGlmICgqKGlQKSA9PSAnICcpCisgICAgeworICAgICAgaVArKzsKKyAgICB9CQkJCS8qIFNraXAgbGVhZCBzcGFjZSwgaWYgYW55ICovCisgIGFyZ3NbMF0gPSBpUDsKKyAgZm9yICg7ICppUCAhPSAnICc7IGlQKyspCisgICAgeworICAgICAgaWYgKCppUCA9PSAnXDAnKQorCXsKKwkgIC8qIFRoZXJlIGFyZSBubyBvcGVyYW5kcyAqLworCSAgaWYgKGFyZ3NbMF0gPT0gaVApCisJICAgIHsKKwkgICAgICAvKiBXZSBuZXZlciBtb3ZlZDogdGhlcmUgd2FzIG5vIG9wY29kZSBlaXRoZXIhICovCisJICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wY29kZSIpKTsKKwkgICAgICByZXR1cm4gLTE7CisJICAgIH0KKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgICppUCsrID0gJ1wwJzsJCQkvKiBUZXJtaW5hdGUgb3Bjb2RlICovCisgIHJldHVybiAoZ2V0X2FyZ3MgKGlQLCBhcmdzKSk7Cit9CQkJCS8qIGlfc2NhbigpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtZW1fZm10OglnZW5lcmF0ZSBhIE1FTUEtIG9yIE1FTUItZm9ybWF0IGluc3RydWN0aW9uCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgdm9pZAorbWVtX2ZtdCAoYXJncywgb1AsIGNhbGx4KQorICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ3NbMS0zXS0+b3BlcmFuZHMgKi8KKyAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbiAqLworICAgICBpbnQgY2FsbHg7CQkJLyogSXMgdGhpcyBhIGNhbGx4IG9wY29kZSAqLworeworICBpbnQgaTsJCQkvKiBMb29wIGNvdW50ZXIgKi8KKyAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLworICBjaGFyIG9wZGVzYzsJCQkvKiBPcGVyYW5kIGRlc2NyaXB0b3IgYnl0ZSAqLworICBtZW1TIGluc3RyOwkJCS8qIERlc2NyaXB0aW9uIG9mIGJpbmFyeSB0byBiZSBvdXRwdXQgKi8KKyAgY2hhciAqb3V0UDsJCQkvKiBXaGVyZSB0aGUgYmluYXJ5IHdhcyBvdXRwdXQgdG8gKi8KKyAgZXhwcmVzc2lvblMgZXhwcjsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCisgIC8qIC0+ZGVzY3JpcHRpb24gb2YgZGVmZXJyZWQgYWRkcmVzcyBmaXh1cCAqLworICBmaXhTICpmaXhQOworCisjaWZkZWYgT0JKX0NPRkYKKyAgLyogQ09GRiBzdXBwb3J0IGlzbid0IGluIHBsYWNlIHlldCBmb3IgY2FsbHggcmVsYXhpbmcuICAqLworICBjYWxseCA9IDA7CisjZW5kaWYKKworICBtZW1zZXQgKCZpbnN0ciwgJ1wwJywgc2l6ZW9mIChtZW1TKSk7CisgIGluc3RyLm9wY29kZSA9IG9QLT5vcGNvZGU7CisKKyAgLyogUHJvY2VzcyBvcGVyYW5kcy4gKi8KKyAgZm9yIChpID0gMTsgaSA8PSBvUC0+bnVtX29wczsgaSsrKQorICAgIHsKKyAgICAgIG9wZGVzYyA9IG9QLT5vcGVyYW5kW2kgLSAxXTsKKworICAgICAgaWYgKE1FTU9QIChvcGRlc2MpKQorCXsKKwkgIHBhcnNlX21lbW9wICgmaW5zdHIsIGFyZ3NbaV0sIG9QLT5mb3JtYXQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzW2ldLCBvcGRlc2MpOworCSAgaW5zdHIub3Bjb2RlIHw9IHJlZ29wLm4gPDwgMTk7CisJfQorICAgIH0KKworICAvKiBQYXJzZSB0aGUgZGlzcGxhY2VtZW50OyB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZW1pdHRpbmcgdGhlCisgICAgIG9wY29kZSwgaW4gY2FzZSBpdCBpcyBhbiBleHByZXNzaW9uIHVzaW5nIGAuJy4gICovCisgIHBhcnNlX2V4cHIgKGluc3RyLmUsICZleHByKTsKKworICAvKiBPdXRwdXQgb3Bjb2RlICovCisgIG91dFAgPSBlbWl0IChpbnN0ci5vcGNvZGUpOworCisgIGlmIChpbnN0ci5kaXNwID09IDApCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBQcm9jZXNzIHRoZSBkaXNwbGFjZW1lbnQgKi8KKyAgc3dpdGNoIChleHByLlhfb3ApCisgICAgeworICAgIGNhc2UgT19pbGxlZ2FsOgorICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHN5bnRheCBlcnJvciIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPX2NvbnN0YW50OgorICAgICAgaWYgKGluc3RyLmRpc3AgPT0gMzIpCisJeworCSAgKHZvaWQpIGVtaXQgKG9mZnMgKGV4cHIpKTsJLyogT3V0cHV0IGRpc3BsYWNlbWVudCAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiAxMi1iaXQgZGlzcGxhY2VtZW50ICovCisJICBpZiAob2ZmcyAoZXhwcikgJiB+MHhmZmYpCisJICAgIHsKKwkgICAgICAvKiBXb24ndCBmaXQgaW4gMTIgYml0czogY29udmVydCBhbHJlYWR5LW91dHB1dAorCSAgICAgICAqIGluc3RydWN0aW9uIHRvIE1FTUIgZm9ybWF0LCBvdXRwdXQKKwkgICAgICAgKiBkaXNwbGFjZW1lbnQuCisJICAgICAgICovCisJICAgICAgbWVtYV90b19tZW1iIChvdXRQKTsKKwkgICAgICAodm9pZCkgZW1pdCAob2ZmcyAoZXhwcikpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXSUxMIGZpdCBpbiAxMiBiaXRzOiAgT1IgaW50byBvcGNvZGUgYW5kCisJICAgICAgICogb3ZlcndyaXRlIHRoZSBiaW5hcnkgd2UgYWxyZWFkeSBwdXQgb3V0CisJICAgICAgICovCisJICAgICAgaW5zdHIub3Bjb2RlIHw9IG9mZnMgKGV4cHIpOworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAob3V0UCwgaW5zdHIub3Bjb2RlLCA0KTsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChpbnN0ci5kaXNwID09IDEyKQorCXsKKwkgIC8qIERpc3BsYWNlbWVudCBpcyBkZXBlbmRlbnQgb24gYSBzeW1ib2wsIHdob3NlIHZhbHVlCisJICAgKiBtYXkgY2hhbmdlIGF0IGxpbmsgdGltZS4gIFdlIEhBVkUgdG8gcmVzZXJ2ZSAzMiBiaXRzLgorCSAgICogQ29udmVydCBhbHJlYWR5LW91dHB1dCBvcGNvZGUgdG8gTUVNQiBmb3JtYXQuCisJICAgKi8KKwkgIG1lbWFfdG9fbWVtYiAob3V0UCk7CisJfQorCisgICAgICAvKiBPdXRwdXQgMCBkaXNwbGFjZW1lbnQgYW5kIHNldCB1cCBhZGRyZXNzIGZpeHVwIGZvciB3aGVuCisgICAgICAgKiB0aGlzIHN5bWJvbCdzIHZhbHVlIGJlY29tZXMga25vd24uCisgICAgICAgKi8KKyAgICAgIG91dFAgPSBlbWl0ICgobG9uZykgMCk7CisgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAorCQkJICBvdXRQIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkgIDQsCisJCQkgICZleHByLAorCQkJICAwLAorCQkJICBOT19SRUxPQyk7CisgICAgICAvKiBTdGV2ZSdzIGxpbmtlciByZWxheGluZyBoYWNrLiAgTWFyayB0aGlzIDMyLWJpdCByZWxvY2F0aW9uIGFzCisgICAgICAgICBiZWluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLCBzcGVjaWZpY2FsbHkgYXMgcGFydCBvZiBhIGNhbGx4CisgICAgICAgICBpbnN0cnVjdGlvbi4gICovCisgICAgICBmaXhQLT5meF9ic3IgPSBjYWxseDsKKyAgICAgIGJyZWFrOworICAgIH0KK30JCQkJLyogbWVtZm10KCkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1lbWFfdG9fbWVtYjoJY29udmVydCBhIE1FTUEtZm9ybWF0IG9wY29kZSB0byBhIE1FTUItZm9ybWF0IG9wY29kZS4KKworICAgVGhlcmUgYXJlIDIgcG9zc2libGUgTUVNQSBmb3JtYXRzOgorICAJLSBkaXNwbGFjZW1lbnQgb25seQorICAJLSBkaXNwbGFjZW1lbnQgKyBhYmFzZQorCisgICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBzZXR0aW5nIG9mIHRoZSBNRU1BX0FCQVNFIGJpdC4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkCittZW1hX3RvX21lbWIgKG9wY29kZVApCisgICAgIGNoYXIgKm9wY29kZVA7CQkvKiBXaGVyZSB0byBmaW5kIHRoZSBvcGNvZGUsIGluIHRhcmdldCBieXRlIG9yZGVyICovCit7CisgIGxvbmcgb3Bjb2RlOwkJCS8qIE9wY29kZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgbG9uZyBtb2RlOwkJCS8qIE1vZGUgYml0cyBmb3IgTUVNQiBpbnN0cnVjdGlvbiAqLworCisgIG9wY29kZSA9IG1kX2NoYXJzX3RvX251bWJlciAob3Bjb2RlUCwgNCk7CisgIGtub3cgKCEob3Bjb2RlICYgTUVNQl9CSVQpKTsKKworICBtb2RlID0gTUVNQl9CSVQgfCBEX0JJVDsKKyAgaWYgKG9wY29kZSAmIE1FTUFfQUJBU0UpCisgICAgeworICAgICAgbW9kZSB8PSBBX0JJVDsKKyAgICB9CisKKyAgb3Bjb2RlICY9IDB4ZmZmZmMwMDA7CQkvKiBDbGVhciBNRU1BIG9mZnNldCBhbmQgbW9kZSBiaXRzICovCisgIG9wY29kZSB8PSBtb2RlOwkJLyogU2V0IE1FTUIgbW9kZSBiaXRzICovCisKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGVQLCBvcGNvZGUsIDQpOworfQkJCQkvKiBtZW1hX3RvX21lbWIoKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgcGFyc2VfZXhwcjoJCXBhcnNlIGFuIGV4cHJlc3Npb24KKworICAJVXNlIGJhc2UgYXNzZW1ibGVyJ3MgZXhwcmVzc2lvbiBwYXJzZXIgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4KKyAgCUl0LCB1bmZvcnR1bmF0ZWx5LCBydW5zIG9mZiBhIGdsb2JhbCB3aGljaCB3ZSBoYXZlIHRvIHNhdmUvcmVzdG9yZQorICAJaW4gb3JkZXIgdG8gbWFrZSBpdCB3b3JrIGZvciB1cy4KKworICAJQW4gZW1wdHkgZXhwcmVzc2lvbiBzdHJpbmcgaXMgdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSAwLgorCisgIAlTZXRzIE9faWxsZWdhbCByZWdhcmRsZXNzIG9mIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBpZiBlbnRpcmUgaW5wdXQKKyAgCXN0cmluZyBpcyBub3QgY29uc3VtZWQgaW4gdGhlIGV2YWx1YXRpb24gLS0gdG9sZXJhdGUgbm8gZGFuZ2xpbmcganVuayEKKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9leHByICh0ZXh0UCwgZXhwUCkKKyAgICAgY2hhciAqdGV4dFA7CQkvKiBUZXh0IG9mIGV4cHJlc3Npb24gdG8gYmUgcGFyc2VkICovCisgICAgIGV4cHJlc3Npb25TICpleHBQOwkJLyogV2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgKi8KK3sKKyAgY2hhciAqc2F2ZV9pbjsJCS8qIFNhdmUgZ2xvYmFsIGhlcmUgKi8KKyAgc3ltYm9sUyAqc3ltUDsKKworICBrbm93ICh0ZXh0UCk7CisKKyAgaWYgKCp0ZXh0UCA9PSAnXDAnKQorICAgIHsKKyAgICAgIC8qIFRyZWF0IGVtcHR5IHN0cmluZyBhcyBhYnNvbHV0ZSAwICovCisgICAgICBleHBQLT5YX2FkZF9zeW1ib2wgPSBleHBQLT5YX29wX3N5bWJvbCA9IE5VTEw7CisgICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOworICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsJLyogU2F2ZSBnbG9iYWwgKi8KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRleHRQOwkvKiBNYWtlIHBhcnNlciB3b3JrIGZvciB1cyAqLworCisgICAgICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwUCk7CisgICAgICBpZiAoKHNpemVfdCkgKGlucHV0X2xpbmVfcG9pbnRlciAtIHRleHRQKSAhPSBzdHJsZW4gKHRleHRQKSkKKwl7CisJICAvKiBEaWQgbm90IGNvbnN1bWUgYWxsIG9mIHRoZSBpbnB1dCAqLworCSAgZXhwUC0+WF9vcCA9IE9faWxsZWdhbDsKKwl9CisgICAgICBzeW1QID0gZXhwUC0+WF9hZGRfc3ltYm9sOworICAgICAgaWYgKHN5bVAgJiYgKGhhc2hfZmluZCAocmVnX2hhc2gsIFNfR0VUX05BTUUgKHN5bVApKSkpCisJeworCSAgLyogUmVnaXN0ZXIgbmFtZSBpbiBhbiBleHByZXNzaW9uICovCisJICAvKiBGSVhNRTogdGhpcyBpc24ndCBtdWNoIG9mIGEgY2hlY2sgYW55IG1vcmUuICAqLworCSAgZXhwUC0+WF9vcCA9IE9faWxsZWdhbDsKKwl9CisKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47CS8qIFJlc3RvcmUgZ2xvYmFsICovCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgcGFyc2VfbGRjb250OgorICAJUGFyc2UgYW5kIHJlcGxhY2UgYSAnbGRjb25zdCcgcHNldWRvLWluc3RydWN0aW9uIHdpdGggYW4gYXBwcm9wcmlhdGUKKyAgCWk4MDk2MCBpbnN0cnVjdGlvbi4KKworICAJQXNzdW1lcyB0aGUgaW5wdXQgY29uc2lzdHMgb2Y6CisgIAkJYXJnWzBdCW9wY29kZSBtbmVtb25pYyAoJ2xkY29uc3QnKQorICAJCWFyZ1sxXSAgZmlyc3Qgb3BlcmFuZCAoY29uc3RhbnQpCisgIAkJYXJnWzJdCW5hbWUgb2YgcmVnaXN0ZXIgdG8gYmUgbG9hZGVkCisKKyAgCVJlcGxhY2VzIG9wY29kZSBhbmQvb3Igb3BlcmFuZHMgYXMgYXBwcm9wcmlhdGUuCisKKyAgCVJldHVybnMgdGhlIG5ldyBudW1iZXIgb2YgYXJndW1lbnRzLCBvciAtMSBvbiBmYWlsdXJlLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljCitpbnQKK3BhcnNlX2xkY29uc3QgKGFyZykKKyAgICAgY2hhciAqYXJnW107CQkvKiBTZWUgYWJvdmUgKi8KK3sKKyAgaW50IG47CQkJLyogQ29uc3RhbnQgdG8gYmUgbG9hZGVkICovCisgIGludCBzaGlmdDsJCQkvKiBTaGlmdCBjb3VudCBmb3IgInNobG8iIGluc3RydWN0aW9uICovCisgIHN0YXRpYyBjaGFyIGJ1Zls1XTsJCS8qIExpdGVyYWwgZm9yIGZpcnN0IG9wZXJhbmQgKi8KKyAgc3RhdGljIGNoYXIgYnVmMls1XTsJCS8qIExpdGVyYWwgZm9yIHNlY29uZCBvcGVyYW5kICovCisgIGV4cHJlc3Npb25TIGU7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLworCisKKyAgYXJnWzNdID0gTlVMTDsJCS8qIFNvIHdlIGNhbiB0ZWxsIGF0IHRoZSBlbmQgaWYgaXQgZ290IHVzZWQgb3Igbm90ICovCisKKyAgcGFyc2VfZXhwciAoYXJnWzFdLCAmZSk7CisgIHN3aXRjaCAoZS5YX29wKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UncmUgZGVwZW5kZW50IG9uIG9uZSBvciBtb3JlIHN5bWJvbHMgLS0gdXNlICJsZGEiICovCisgICAgICBhcmdbMF0gPSAibGRhIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPX2NvbnN0YW50OgorICAgICAgLyogVHJ5IHRoZSBmb2xsb3dpbmcgbWFwcGluZ3M6CisgICAgICAgKiAgICAgIGxkY29uc3QgMCw8cmVnPiAgLT5tb3YgIDAsPHJlZz4KKyAgICAgICAqICAgICAgICBsZGNvbnN0IDMxLDxyZWc+IC0+bW92ICAzMSw8cmVnPgorICAgICAgICogICAgICAgIGxkY29uc3QgMzIsPHJlZz4gLT5hZGRvIDEsMzEsPHJlZz4KKyAgICAgICAqICAgICAgICBsZGNvbnN0IDYyLDxyZWc+IC0+YWRkbyAzMSwzMSw8cmVnPgorICAgICAgICogICAgICAgIGxkY29uc3QgNjQsPHJlZz4gLT5zaGxvIDgsMyw8cmVnPgorICAgICAgICogICAgICAgIGxkY29uc3QgLTEsPHJlZz4gLT5zdWJvIDEsMCw8cmVnPgorICAgICAgICogICAgICAgIGxkY29uc3QgLTMxLDxyZWc+LT5zdWJvIDMxLDAsPHJlZz4KKyAgICAgICAqCisgICAgICAgKiBhbnRoaW5nIGVsc2UgYmVjb21lczoKKyAgICAgICAqICAgICAgICBsZGEgeHh4LDxyZWc+CisgICAgICAgKi8KKyAgICAgIG4gPSBvZmZzIChlKTsKKyAgICAgIGlmICgoMCA8PSBuKSAmJiAobiA8PSAzMSkpCisJeworCSAgYXJnWzBdID0gIm1vdiI7CisKKwl9CisgICAgICBlbHNlIGlmICgoLTMxIDw9IG4pICYmIChuIDw9IC0xKSkKKwl7CisJICBhcmdbMF0gPSAic3VibyI7CisJICBhcmdbM10gPSBhcmdbMl07CisJICBzcHJpbnRmIChidWYsICIlZCIsIC1uKTsKKwkgIGFyZ1sxXSA9IGJ1ZjsKKwkgIGFyZ1syXSA9ICIwIjsKKworCX0KKyAgICAgIGVsc2UgaWYgKCgzMiA8PSBuKSAmJiAobiA8PSA2MikpCisJeworCSAgYXJnWzBdID0gImFkZG8iOworCSAgYXJnWzNdID0gYXJnWzJdOworCSAgYXJnWzFdID0gIjMxIjsKKwkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgbiAtIDMxKTsKKwkgIGFyZ1syXSA9IGJ1ZjsKKworCX0KKyAgICAgIGVsc2UgaWYgKChzaGlmdCA9IHNoaWZ0X29rIChuKSkgIT0gMCkKKwl7CisJICBhcmdbMF0gPSAic2hsbyI7CisJICBhcmdbM10gPSBhcmdbMl07CisJICBzcHJpbnRmIChidWYsICIlZCIsIHNoaWZ0KTsKKwkgIGFyZ1sxXSA9IGJ1ZjsKKwkgIHNwcmludGYgKGJ1ZjIsICIlZCIsIG4gPj4gc2hpZnQpOworCSAgYXJnWzJdID0gYnVmMjsKKworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhcmdbMF0gPSAibGRhIjsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT19pbGxlZ2FsOgorICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNvbnN0YW50IikpOworICAgICAgcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gKGFyZ1szXSA9PSAwKSA/IDIgOiAzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIHBhcnNlX21lbW9wOglwYXJzZSBhIG1lbW9yeSBvcGVyYW5kCisKKyAgCVRoaXMgcm91dGluZSBpcyBiYXNlZCBvbiB0aGUgb2JzZXJ2YXRpb24gdGhhdCB0aGUgNCBtb2RlIGJpdHMgb2YgdGhlCisgIAlNRU1CIGZvcm1hdCwgdGFrZW4gaW5kaXZpZHVhbGx5LCBoYXZlIGZhaXJseSBjb25zaXN0ZW50IG1lYW5pbmc6CisKKyAgCQkgTTMgKGJpdCAxMyk6IDEgaWYgZGlzcGxhY2VtZW50IGlzIHByZXNlbnQgKERfQklUKQorICAJCSBNMiAoYml0IDEyKTogMSBmb3IgTUVNQiBpbnN0cnVjdGlvbnMgKE1FTUJfQklUKQorICAJCSBNMSAoYml0IDExKTogMSBpZiBpbmRleCBpcyBwcmVzZW50IChJX0JJVCkKKyAgCQkgTTAgKGJpdCAxMCk6IDEgaWYgYWJhc2UgaXMgcHJlc2VudCAoQV9CSVQpCisKKyAgCVNvIHdlIHBhcnNlIHRoZSBtZW1vcnkgb3BlcmFuZCBhbmQgc2V0IGJpdHMgaW4gdGhlIG1vZGUgYXMgd2UgZmluZAorICAJdGhpbmdzLiAgVGhlbiBhdCB0aGUgZW5kLCBpZiB3ZSBnbyB0byBNRU1CIGZvcm1hdCwgd2UgbmVlZCBvbmx5IHNldAorICAJdGhlIE1FTUIgYml0IChNMikgYW5kIG91ciBtb2RlIGlzIGJ1aWx0IGZvciB1cy4KKworICAJVW5mb3J0dW5hdGVseSwgSSBzYWlkICJmYWlybHkgY29uc2lzdGVudCIuICBUaGUgZXhjZXB0aW9uczoKKworICAJCSBEQklBCisgIAkJIDAxMDAJV291bGQgc2VlbSBpbGxlZ2FsLCBidXQgbWVhbnMgImFiYXNlLW9ubHkiLgorCisgIAkJIDAxMDEJV291bGQgc2VlbSB0byBtZWFuICJhYmFzZS1vbmx5IiAtLSBpdCBtZWFucyBJUC1yZWxhdGl2ZS4KKyAgCQkJTXVzdCBiZSBjb252ZXJ0ZWQgdG8gMDEwMC4KKworICAJCSAwMTEwCVdvdWxkIHNlZW0gdG8gbWVhbiAiaW5kZXgtb25seSIsIGJ1dCBpcyByZXNlcnZlZC4KKyAgCQkJV2UgdHVybiBvbiB0aGUgRCBiaXQgYW5kIHByb3ZpZGUgYSAwIGRpc3BsYWNlbWVudC4KKworICAJVGhlIG90aGVyIHRoaW5nIHRvIG9ic2VydmUgaXMgdGhhdCB3ZSBwYXJzZSBmcm9tIHRoZSByaWdodCwgcGVlbGluZworICAJdGhpbmdzICogb2ZmIGFzIHdlIGdvOiAgZmlyc3QgYW55IGluZGV4IHNwZWMsIHRoZW4gYW55IGFiYXNlLCB0aGVuCisgIAl0aGUgZGlzcGxhY2VtZW50LgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljCit2b2lkCitwYXJzZV9tZW1vcCAobWVtUCwgYXJnUCwgb3B0eXBlKQorICAgICBtZW1TICptZW1QOwkJLyogV2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzICovCisgICAgIGNoYXIgKmFyZ1A7CQkvKiBUZXh0IG9mIHRoZSBvcGVyYW5kIHRvIGJlIHBhcnNlZCAqLworICAgICBpbnQgb3B0eXBlOwkJLyogTUVNMSwgTUVNMiwgTUVNNCwgTUVNOCwgTUVNMTIsIG9yIE1FTTE2ICovCit7CisgIGNoYXIgKmluZGV4UDsJCQkvKiBQb2ludGVyIHRvIGluZGV4IHNwZWNpZmljYXRpb24gd2l0aCAiW10iIHJlbW92ZWQgKi8KKyAgY2hhciAqcDsJCQkvKiBUZW1wIGNoYXIgcG9pbnRlciAqLworICBjaGFyIGlwcmVsX2ZsYWc7CQkvKiBUcnVlIGlmIHRoaXMgaXMgYW4gSVAtcmVsYXRpdmUgb3BlcmFuZCAqLworICBpbnQgcmVnbnVtOwkJCS8qIFJlZ2lzdGVyIG51bWJlciAqLworICAvKiBTY2FsZSBmYWN0b3I6IDEsMiw0LDgsIG9yIDE2LiAgTGF0ZXIgY29udmVydGVkIHRvIGludGVybmFsIGZvcm1hdAorICAgICAoMCwxLDIsMyw0IHJlc3BlY3RpdmVseSkuICAqLworICBpbnQgc2NhbGU7CisgIGludCBtb2RlOwkJCS8qIE1FTUIgbW9kZSBiaXRzICovCisgIGludCAqaW50UDsJCQkvKiBQb2ludGVyIHRvIHJlZ2lzdGVyIG51bWJlciAqLworCisgIC8qIFRoZSBmb2xsb3dpbmcgdGFibGUgY29udGFpbnMgdGhlIGRlZmF1bHQgc2NhbGUgZmFjdG9ycyBmb3IgZWFjaAorICAgICB0eXBlIG9mIG1lbW9yeSBpbnN0cnVjdGlvbi4gIEl0IGlzIGFjY2Vzc2VkIHVzaW5nIChvcHR5cGUtTUVNMSkKKyAgICAgYXMgYW4gaW5kZXggLS0gdGh1cyBpdCBhc3N1bWVzIHRoZSAnb3B0eXBlJyBjb25zdGFudHMgYXJlCisgICAgIGFzc2lnbmVkIGNvbnNlY3V0aXZlIHZhbHVlcywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoaXMKKyAgICAgdGFibGUuICAqLworICBzdGF0aWMgY29uc3QgaW50IGRlZl9zY2FsZVtdID0KKyAgeworICAgIDEsCQkJCS8qIE1FTTEgKi8KKyAgICAyLAkJCQkvKiBNRU0yICovCisgICAgNCwJCQkJLyogTUVNNCAqLworICAgIDgsCQkJCS8qIE1FTTggKi8KKyAgICAtMSwJCQkJLyogTUVNMTIgLS0gbm8gdmFsaWQgZGVmYXVsdCAqLworICAgIDE2CQkJCS8qIE1FTTE2ICovCisgIH07CisKKworICBpcHJlbF9mbGFnID0gbW9kZSA9IDA7CisKKyAgLyogQW55IGluZGV4IHByZXNlbnQ/ICovCisgIGluZGV4UCA9IGdldF9pc3BlYyAoYXJnUCk7CisgIGlmIChpbmRleFApCisgICAgeworICAgICAgcCA9IHN0cmNociAoaW5kZXhQLCAnKicpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwl7CisJICAvKiBObyBleHBsaWNpdCBzY2FsZSAtLSB1c2UgZGVmYXVsdCBmb3IgdGhpcyBpbnN0cnVjdGlvbgorCSAgICAgdHlwZSBhbmQgYXNzZW1ibGVyIG1vZGUuICAqLworCSAgaWYgKGZsYWdfbXJpKQorCSAgICBzY2FsZSA9IDE7CisJICBlbHNlCisJICAgIC8qIEdOVTk2MCBjb21wYXRpYmlsaXR5ICovCisJICAgIHNjYWxlID0gZGVmX3NjYWxlW29wdHlwZSAtIE1FTTFdOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqcCsrID0gJ1wwJzsJCS8qIEVsaW1pbmF0ZSAnKicgKi8KKworCSAgLyogTm93IGluZGV4UC0+YSAnXDAnLXRlcm1pbmF0ZWQgcmVnaXN0ZXIgbmFtZSwKKwkgICAgICogYW5kIHAtPmEgc2NhbGUgZmFjdG9yLgorCSAgICovCisKKwkgIGlmICghc3RyY21wIChwLCAiMTYiKSkKKwkgICAgeworCSAgICAgIHNjYWxlID0gMTY7CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNociAoIjEyNDgiLCAqcCkgJiYgKHBbMV0gPT0gJ1wwJykpCisJICAgIHsKKwkgICAgICBzY2FsZSA9ICpwIC0gJzAnOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzY2FsZSA9IC0xOworCSAgICB9CisJfQorCisgICAgICByZWdudW0gPSBnZXRfcmVnbnVtIChpbmRleFApOwkvKiBHZXQgaW5kZXggcmVnLiAjICovCisgICAgICBpZiAoIUlTX1JHX1JFRyAocmVnbnVtKSkKKwl7CisJICBhc19iYWQgKF8oImludmFsaWQgaW5kZXggcmVnaXN0ZXIiKSk7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBDb252ZXJ0IHNjYWxlIHRvIGl0cyBiaW5hcnkgZW5jb2RpbmcgKi8KKyAgICAgIHN3aXRjaCAoc2NhbGUpCisJeworCWNhc2UgMToKKwkgIHNjYWxlID0gMCA8PCA3OworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgc2NhbGUgPSAxIDw8IDc7CisJICBicmVhazsKKwljYXNlIDQ6CisJICBzY2FsZSA9IDIgPDwgNzsKKwkgIGJyZWFrOworCWNhc2UgODoKKwkgIHNjYWxlID0gMyA8PCA3OworCSAgYnJlYWs7CisJY2FzZSAxNjoKKwkgIHNjYWxlID0gNCA8PCA3OworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFzX2JhZCAoXygiaW52YWxpZCBzY2FsZSBmYWN0b3IiKSk7CisJICByZXR1cm47CisJfTsKKworICAgICAgbWVtUC0+b3Bjb2RlIHw9IHNjYWxlIHwgcmVnbnVtOwkvKiBTZXQgaW5kZXggYml0cyBpbiBvcGNvZGUgKi8KKyAgICAgIG1vZGUgfD0gSV9CSVQ7CQkvKiBGb3VuZCBhIHZhbGlkIGluZGV4IHNwZWMgKi8KKyAgICB9CisKKyAgLyogQW55IGFiYXNlIChSZWdpc3RlciBJbmRpcmVjdCkgc3BlY2lmaWNhdGlvbiBwcmVzZW50PyAqLworICBpZiAoKHAgPSBzdHJyY2hyIChhcmdQLCAnKCcpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qICIoIiBpcyB0aGVyZSAtLSBkb2VzIGl0IHN0YXJ0IGEgbGVnYWwgYWJhc2Ugc3BlYz8gIElmIG5vdCwgaXQKKyAgICAgICAgIGNvdWxkIGJlIHBhcnQgb2YgYSBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbi4gICovCisgICAgICBpbnRQID0gKGludCAqKSBoYXNoX2ZpbmQgKGFyZWdfaGFzaCwgcCk7CisgICAgICBpZiAoaW50UCAhPSBOVUxMKQorCXsKKwkgIC8qIEdvdCBhbiBhYmFzZSBoZXJlICovCisJICByZWdudW0gPSAqaW50UDsKKwkgICpwID0gJ1wwJzsJCS8qIGRpc2NhcmQgcmVnaXN0ZXIgc3BlYyAqLworCSAgaWYgKHJlZ251bSA9PSBJUFJFTCkKKwkgICAgeworCSAgICAgIC8qIFdlIGhhdmUgdG8gc3BlY2lhbGNhc2UgaXAtcmVsIG1vZGUgKi8KKwkgICAgICBpcHJlbF9mbGFnID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbWVtUC0+b3Bjb2RlIHw9IHJlZ251bSA8PCAxNDsKKwkgICAgICBtb2RlIHw9IEFfQklUOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBBbnkgZXhwcmVzc2lvbiBwcmVzZW50PyAqLworICBtZW1QLT5lID0gYXJnUDsKKyAgaWYgKCphcmdQICE9ICdcMCcpCisgICAgeworICAgICAgbW9kZSB8PSBEX0JJVDsKKyAgICB9CisKKyAgLyogU3BlY2lhbC1jYXNlIGlwLXJlbGF0aXZlIGFkZHJlc3NpbmcgKi8KKyAgaWYgKGlwcmVsX2ZsYWcpCisgICAgeworICAgICAgaWYgKG1vZGUgJiBJX0JJVCkKKwl7CisJICBzeW50YXggKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1lbVAtPm9wY29kZSB8PSA1IDw8IDEwOwkvKiBJUC1yZWxhdGl2ZSBtb2RlICovCisJICBtZW1QLT5kaXNwID0gMzI7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBIYW5kbGUgYWxsIG90aGVyIG1vZGVzICovCisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBEX0JJVCB8IEFfQklUOgorICAgICAgLyogR28gd2l0aCBNRU1BIGluc3RydWN0aW9uIGZvcm1hdCBmb3Igbm93IChncm93IHRvIE1FTUIgbGF0ZXIKKyAgICAgICAgIGlmIDEyIGJpdHMgaXMgbm90IGVub3VnaCBmb3IgdGhlIGRpc3BsYWNlbWVudCkuICBNRU1BIGZvcm1hdAorICAgICAgICAgaGFzIGEgc2luZ2xlIG1vZGUgYml0OiBzZXQgaXQgdG8gaW5kaWNhdGUgdGhhdCBhYmFzZSBpcworICAgICAgICAgcHJlc2VudC4gICovCisgICAgICBtZW1QLT5vcGNvZGUgfD0gTUVNQV9BQkFTRTsKKyAgICAgIG1lbVAtPmRpc3AgPSAxMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEX0JJVDoKKyAgICAgIC8qIEdvIHdpdGggTUVNQSBpbnN0cnVjdGlvbiBmb3JtYXQgZm9yIG5vdyAoZ3JvdyB0byBNRU1CIGxhdGVyCisgICAgICAgICBpZiAxMiBiaXRzIGlzIG5vdCBlbm91Z2ggZm9yIHRoZSBkaXNwbGFjZW1lbnQpLiAgKi8KKyAgICAgIG1lbVAtPmRpc3AgPSAxMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBX0JJVDoKKyAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIGJpdCBzdHJpbmcgZm9yIHRoaXMgbW9kZSBpcyBub3QKKyAgICAgICAgIGNvbnNpc3RlbnQ6IGl0IHNob3VsZCBiZSAwIChleGNsdXNpdmUgb2YgdGhlIE1FTUIgYml0KSwgc28gd2UKKyAgICAgICAgIHNldCBpdCAiYnkgaGFuZCIgaGVyZS4gICovCisgICAgICBtZW1QLT5vcGNvZGUgfD0gTUVNQl9CSVQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQV9CSVQgfCBJX0JJVDoKKyAgICAgIC8qIHNldCBNRU1CIGJpdCBpbiBtb2RlLCBhbmQgT1IgaW4gbW9kZSBiaXRzICovCisgICAgICBtZW1QLT5vcGNvZGUgfD0gbW9kZSB8IE1FTUJfQklUOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElfQklUOgorICAgICAgLyogVHJlYXQgbWlzc2luZyBkaXNwbGFjZW1lbnQgYXMgZGlzcGxhY2VtZW50IG9mIDAuICAqLworICAgICAgbW9kZSB8PSBEX0JJVDsKKyAgICAgIC8qIEZhbGwgaW50byBuZXh0IGNhc2UuICAqLworICAgIGNhc2UgRF9CSVQgfCBBX0JJVCB8IElfQklUOgorICAgIGNhc2UgRF9CSVQgfCBJX0JJVDoKKyAgICAgIC8qIHNldCBNRU1CIGJpdCBpbiBtb2RlLCBhbmQgT1IgaW4gbW9kZSBiaXRzICovCisgICAgICBtZW1QLT5vcGNvZGUgfD0gbW9kZSB8IE1FTUJfQklUOworICAgICAgbWVtUC0+ZGlzcCA9IDMyOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgc3ludGF4ICgpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIHBhcnNlX3BvOglwYXJzZSBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3AKKworICAJVGhpcyBpcyBhIHRvcC1sZXZlbCByb3V0aW5lIGZvciBtYWNoaW5lLWRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgSXQgc2x1cnBzCisgIAl1cCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgbGluZSwgYnJlYWtzIG91dCB0aGUgaW5kaXZpZHVhbCBhcmd1bWVudHMsCisgIAlhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBjb3JyZWN0IGhhbmRsZXIuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljCit2b2lkCitwYXJzZV9wbyAocG9fbnVtKQorICAgICBpbnQgcG9fbnVtOwkJLyogUHNldWRvLW9wIG51bWJlcjogIGN1cnJlbnRseSBTX0xFQUZQUk9DIG9yIFNfU1lTUFJPQyAqLworeworICAvKiBQb2ludGVycyBvcGVyYW5kcywgd2l0aCBubyBlbWJlZGRlZCB3aGl0ZXNwYWNlLgorICAgICBhcmdbMF0gdW51c2VkLCBhcmdbMS0zXS0+b3BlcmFuZHMgKi8KKyAgY2hhciAqYXJnc1s0XTsKKyAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLworICBjaGFyICpwOwkJCS8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHVucGFyc2VkIGFyZ3VtZW50IHN0cmluZyAqLworICBjaGFyIGVvbDsJCQkvKiBDaGFyYWN0ZXIgdGhhdCBpbmRpY2F0ZWQgZW5kIG9mIGxpbmUgKi8KKworICBleHRlcm4gY2hhciBpc19lbmRfb2ZfbGluZVtdOworCisgIC8qIEFkdmFuY2UgaW5wdXQgcG9pbnRlciB0byBlbmQgb2YgbGluZS4gKi8KKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgfQorICBlb2wgPSAqaW5wdXRfbGluZV9wb2ludGVyOwkvKiBTYXZlIGVuZC1vZi1saW5lIGNoYXIgKi8KKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7CS8qIFRlcm1pbmF0ZSBhcmd1bWVudCBsaXN0ICovCisKKyAgLyogUGFyc2Ugb3V0IG9wZXJhbmRzICovCisgIG5fb3BzID0gZ2V0X2FyZ3MgKHAsIGFyZ3MpOworICBpZiAobl9vcHMgPT0gLTEpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBEaXNwYXRjaCB0byBjb3JyZWN0IGhhbmRsZXIgKi8KKyAgc3dpdGNoIChwb19udW0pCisgICAgeworICAgIGNhc2UgU19TWVNQUk9DOgorICAgICAgc19zeXNwcm9jIChuX29wcywgYXJncyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNfTEVBRlBST0M6CisgICAgICBzX2xlYWZwcm9jIChuX29wcywgYXJncyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQkFEX0NBU0UgKHBvX251bSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogUmVzdG9yZSBlb2wsIHNvIGxpbmUgbnVtYmVycyBnZXQgdXBkYXRlZCBjb3JyZWN0bHkuICBCYXNlCisgICAgIGFzc2VtYmxlciBhc3N1bWVzIHdlIGxlYXZlIGlucHV0IHBvaW50ZXIgcG9pbnRpbmcgYXQgY2hhcgorICAgICBmb2xsb3dpbmcgdGhlIGVvbC4gICovCisgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGVvbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBwYXJzZV9yZWdvcDogcGFyc2UgYSByZWdpc3RlciBvcGVyYW5kLgorCisgIAlJbiBjYXNlIG9mIGlsbGVnYWwgb3BlcmFuZCwgaXNzdWUgYSBtZXNzYWdlIGFuZCByZXR1cm4gc29tZSB2YWxpZAorICAJaW5mb3JtYXRpb24gc28gaW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZyBjYW4gY29udGludWUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljCit2b2lkCitwYXJzZV9yZWdvcCAocmVnb3BQLCBvcHRleHQsIG9wZGVzYykKKyAgICAgc3RydWN0IHJlZ29wICpyZWdvcFA7CS8qIFdoZXJlIHRvIHB1dCBkZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCisgICAgIGNoYXIgKm9wdGV4dDsJCS8qIFRleHQgb2Ygb3BlcmFuZCAqLworICAgICBjaGFyIG9wZGVzYzsJCS8qIERlc2NyaXB0b3IgYnl0ZTogIHdoYXQncyBsZWdhbCBmb3IgdGhpcyBvcGVyYW5kICovCit7CisgIGludCBuOwkJCS8qIFJlZ2lzdGVyIG51bWJlciAqLworICBleHByZXNzaW9uUyBlOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KKworICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyICovCisgIG4gPSBnZXRfcmVnbnVtIChvcHRleHQpOworICBpZiAobiA+PSAwKQorICAgIHsKKyAgICAgIGlmIChJU19SR19SRUcgKG4pKQorCXsKKwkgIC8qIGdsb2JhbCBvciBsb2NhbCByZWdpc3RlciAqLworCSAgaWYgKCFSRUdfQUxJR04gKG9wZGVzYywgbikpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oInVuYWxpZ25lZCByZWdpc3RlciIpKTsKKwkgICAgfQorCSAgcmVnb3BQLT5uID0gbjsKKwkgIHJlZ29wUC0+bW9kZSA9IDA7CisJICByZWdvcFAtPnNwZWNpYWwgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKElTX0ZQX1JFRyAobikgJiYgRlBfT0sgKG9wZGVzYykpCisJeworCSAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIsIGFuZCBpdCdzIGFsbG93ZWQgKi8KKwkgIHJlZ29wUC0+biA9IG4gLSBGUDA7CisJICByZWdvcFAtPm1vZGUgPSAxOworCSAgcmVnb3BQLT5zcGVjaWFsID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChJU19TRl9SRUcgKG4pICYmIFNGUl9PSyAob3BkZXNjKSkKKwl7CisJICAvKiBTcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyLCBhbmQgaXQncyBhbGxvd2VkICovCisJICByZWdvcFAtPm4gPSBuIC0gU0YwOworCSAgcmVnb3BQLT5tb2RlID0gMDsKKwkgIHJlZ29wUC0+c3BlY2lhbCA9IDE7CisJICBpZiAoIXRhcmdfaGFzX3NmciAocmVnb3BQLT5uKSkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygibm8gc3VjaCBzZnIgaW4gdGhpcyBhcmNoaXRlY3R1cmUiKSk7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisgICAgfQorICBlbHNlIGlmIChMSVRfT0sgKG9wZGVzYykpCisgICAgeworICAgICAgLyogSG93IGFib3V0IGEgbGl0ZXJhbD8gICovCisgICAgICByZWdvcFAtPm1vZGUgPSAxOworICAgICAgcmVnb3BQLT5zcGVjaWFsID0gMDsKKyAgICAgIGlmIChGUF9PSyAob3BkZXNjKSkKKwl7CQkJLyogZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbCBhY2NlcHRhYmxlICovCisJICAvKiBTa2lwIG92ZXIgMGYsIDBkLCBvciAwZSBwcmVmaXggKi8KKwkgIGlmICgob3B0ZXh0WzBdID09ICcwJykKKwkgICAgICAmJiAob3B0ZXh0WzFdID49ICdkJykKKwkgICAgICAmJiAob3B0ZXh0WzFdIDw9ICdmJykpCisJICAgIHsKKwkgICAgICBvcHRleHQgKz0gMjsKKwkgICAgfQorCisJICBpZiAoIXN0cmNtcCAob3B0ZXh0LCAiMC4wIikgfHwgIXN0cmNtcCAob3B0ZXh0LCAiMCIpKQorCSAgICB7CisJICAgICAgcmVnb3BQLT5uID0gMHgxMDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGlmICghc3RyY21wIChvcHRleHQsICIxLjAiKSB8fCAhc3RyY21wIChvcHRleHQsICIxIikpCisJICAgIHsKKwkgICAgICByZWdvcFAtPm4gPSAweDE2OworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJfQorICAgICAgZWxzZQorCXsJCQkvKiBmaXhlZCBwb2ludCBsaXRlcmFsIGFjY2VwdGFibGUgKi8KKwkgIHBhcnNlX2V4cHIgKG9wdGV4dCwgJmUpOworCSAgaWYgKGUuWF9vcCAhPSBPX2NvbnN0YW50CisJICAgICAgfHwgKG9mZnMgKGUpIDwgMCkgfHwgKG9mZnMgKGUpID4gMzEpKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJpbGxlZ2FsIGxpdGVyYWwiKSk7CisJICAgICAgb2ZmcyAoZSkgPSAwOworCSAgICB9CisJICByZWdvcFAtPm4gPSBvZmZzIChlKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIC8qIE5vdGhpbmcgd29ya2VkICovCisgIHN5bnRheCAoKTsKKyAgcmVnb3BQLT5tb2RlID0gMDsJCS8qIFJlZ2lzdGVyIHIwIGlzIGFsd2F5cyBhIGdvb2Qgb25lICovCisgIHJlZ29wUC0+biA9IDA7CisgIHJlZ29wUC0+c3BlY2lhbCA9IDA7Cit9CQkJCS8qIHBhcnNlX3JlZ29wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICByZWdfZm10OglnZW5lcmF0ZSBhIFJFRy1mb3JtYXQgaW5zdHJ1Y3Rpb24KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkCityZWdfZm10IChhcmdzLCBvUCkKKyAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1swXS0+b3Bjb2RlIG1uZW1vbmljLCBhcmdzWzEtM10tPm9wZXJhbmRzICovCisgICAgIHN0cnVjdCBpOTYwX29wY29kZSAqb1A7CS8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KK3sKKyAgbG9uZyBpbnN0cjsJCQkvKiBCaW5hcnkgdG8gYmUgb3V0cHV0ICovCisgIHN0cnVjdCByZWdvcCByZWdvcDsJCS8qIERlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KKyAgaW50IG5fb3BzOwkJCS8qIE51bWJlciBvZiBvcGVyYW5kcyAqLworCisKKyAgaW5zdHIgPSBvUC0+b3Bjb2RlOworICBuX29wcyA9IG9QLT5udW1fb3BzOworCisgIGlmIChuX29wcyA+PSAxKQorICAgIHsKKyAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbMV0sIG9QLT5vcGVyYW5kWzBdKTsKKworICAgICAgaWYgKChuX29wcyA9PSAxKSAmJiAhKGluc3RyICYgTTMpKQorCXsKKwkgIC8qIDEtb3BlcmFuZCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZHN0IGZpZWxkIHNob3VsZAorCSAgICAgKiBiZSB1c2VkIChpbnN0ZWFkIG9mIHNyYzEpLgorCSAgICovCisJICByZWdvcC5uIDw8PSAxOTsKKwkgIGlmIChyZWdvcC5zcGVjaWFsKQorCSAgICB7CisJICAgICAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7CisJICAgIH0KKwkgIHJlZ29wLm1vZGUgPDw9IDEzOworCSAgcmVnb3Auc3BlY2lhbCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHJlZ29wLm4gZ29lcyBpbiBiaXQgMCwgbmVlZHMgbm8gc2hpZnRpbmcgKi8KKwkgIHJlZ29wLm1vZGUgPDw9IDExOworCSAgcmVnb3Auc3BlY2lhbCA8PD0gNTsKKwl9CisgICAgICBpbnN0ciB8PSByZWdvcC5uIHwgcmVnb3AubW9kZSB8IHJlZ29wLnNwZWNpYWw7CisgICAgfQorCisgIGlmIChuX29wcyA+PSAyKQorICAgIHsKKyAgICAgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbMl0sIG9QLT5vcGVyYW5kWzFdKTsKKworICAgICAgaWYgKChuX29wcyA9PSAyKSAmJiAhKGluc3RyICYgTTMpKQorCXsKKwkgIC8qIDItb3BlcmFuZCBpbnN0cnVjdGlvbiBpbiB3aGljaCB0aGUgZHN0IGZpZWxkIHNob3VsZAorCSAgICAgKiBiZSB1c2VkIGluc3RlYWQgb2Ygc3JjMikuCisJICAgKi8KKwkgIHJlZ29wLm4gPDw9IDE5OworCSAgaWYgKHJlZ29wLnNwZWNpYWwpCisJICAgIHsKKwkgICAgICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKKwkgICAgfQorCSAgcmVnb3AubW9kZSA8PD0gMTM7CisJICByZWdvcC5zcGVjaWFsID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmVnb3AubiA8PD0gMTQ7CisJICByZWdvcC5tb2RlIDw8PSAxMjsKKwkgIHJlZ29wLnNwZWNpYWwgPDw9IDY7CisJfQorICAgICAgaW5zdHIgfD0gcmVnb3AubiB8IHJlZ29wLm1vZGUgfCByZWdvcC5zcGVjaWFsOworICAgIH0KKyAgaWYgKG5fb3BzID09IDMpCisgICAgeworICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1szXSwgb1AtPm9wZXJhbmRbMl0pOworICAgICAgaWYgKHJlZ29wLnNwZWNpYWwpCisJeworCSAgcmVnb3AubW9kZSA9IHJlZ29wLnNwZWNpYWw7CisJfQorICAgICAgaW5zdHIgfD0gKHJlZ29wLm4gPDw9IDE5KSB8IChyZWdvcC5tb2RlIDw8PSAxMyk7CisgICAgfQorICBlbWl0IChpbnN0cik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICByZWxheF9jb2JyOgorICAJUmVwbGFjZSBjb2JyIGluc3RydWN0aW9uIGluIGEgY29kZSBmcmFnbWVudCB3aXRoIGVxdWl2YWxlbnQgYnJhbmNoIGFuZAorICAJY29tcGFyZSBpbnN0cnVjdGlvbnMsIHNvIGl0IGNhbiByZWFjaCBiZXlvbmQgYSAxMy1iaXQgZGlzcGxhY2VtZW50LgorICAJU2V0IHVwIGFuIGFkZHJlc3MgZml4L3JlbG9jYXRpb24gZm9yIHRoZSBuZXcgYnJhbmNoIGluc3RydWN0aW9uLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBUaGlzICJjb25kaXRpb25hbCBqdW1wIiB0YWJsZSBtYXBzIGNvYnIgaW5zdHJ1Y3Rpb25zIGludG8KKyAgIGVxdWl2YWxlbnQgY29tcGFyZSBhbmQgYnJhbmNoIG9wY29kZXMuICAqLworc3RhdGljIGNvbnN0CitzdHJ1Y3QKK3sKKyAgbG9uZyBjb21wYXJlOworICBsb25nIGJyYW5jaDsKK30KKworY29qW10gPQorewkJCQkvKiBDT0JSIE9QQ09ERTogKi8KKyAgeyBDSEtCSVQsIEJOTyB9LAkJLyogICAgICAweDMwIC0gYmJjICovCisgIHsgQ01QTywgQkcgfSwJCQkvKiAgICAgIDB4MzEgLSBjbXBvYmcgKi8KKyAgeyBDTVBPLCBCRSB9LAkJCS8qICAgICAgMHgzMiAtIGNtcG9iZSAqLworICB7IENNUE8sIEJHRSB9LAkJLyogICAgICAweDMzIC0gY21wb2JnZSAqLworICB7IENNUE8sIEJMIH0sCQkJLyogICAgICAweDM0IC0gY21wb2JsICovCisgIHsgQ01QTywgQk5FIH0sCQkvKiAgICAgIDB4MzUgLSBjbXBvYm5lICovCisgIHsgQ01QTywgQkxFIH0sCQkvKiAgICAgIDB4MzYgLSBjbXBvYmxlICovCisgIHsgQ0hLQklULCBCTyB9LAkJLyogICAgICAweDM3IC0gYmJzICovCisgIHsgQ01QSSwgQk5PIH0sCQkvKiAgICAgIDB4MzggLSBjbXBpYm5vICovCisgIHsgQ01QSSwgQkcgfSwJCQkvKiAgICAgIDB4MzkgLSBjbXBpYmcgKi8KKyAgeyBDTVBJLCBCRSB9LAkJCS8qICAgICAgMHgzYSAtIGNtcGliZSAqLworICB7IENNUEksIEJHRSB9LAkJLyogICAgICAweDNiIC0gY21waWJnZSAqLworICB7IENNUEksIEJMIH0sCQkJLyogICAgICAweDNjIC0gY21waWJsICovCisgIHsgQ01QSSwgQk5FIH0sCQkvKiAgICAgIDB4M2QgLSBjbXBpYm5lICovCisgIHsgQ01QSSwgQkxFIH0sCQkvKiAgICAgIDB4M2UgLSBjbXBpYmxlICovCisgIHsgQ01QSSwgQk8gfSwJCQkvKiAgICAgIDB4M2YgLSBjbXBpYm8gKi8KK307CisKK3N0YXRpYwordm9pZAorcmVsYXhfY29iciAoZnJhZ1ApCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsJLyogZnJhZ1AtPmZyX29wY29kZSBpcyBhc3N1bWVkIHRvIHBvaW50IHRvCisJCQkJICogdGhlIGNvYnIgaW5zdHJ1Y3Rpb24sIHdoaWNoIGNvbWVzIGF0IHRoZQorCQkJCSAqIGVuZCBvZiB0aGUgY29kZSBmcmFnbWVudC4KKwkJCQkgKi8KK3sKKyAgaW50IG9wY29kZSwgc3JjMSwgc3JjMiwgbTEsIHMyOworICAvKiBCaXQgZmllbGRzIGZyb20gY29iciBpbnN0cnVjdGlvbiAqLworICBsb25nIGJwX2JpdHM7CQkJLyogQnJhbmNoIHByZWRpY3Rpb24gYml0cyBmcm9tIGNvYnIgaW5zdHJ1Y3Rpb24gKi8KKyAgbG9uZyBpbnN0cjsJCQkvKiBBIHNpbmdsZSBpOTYwIGluc3RydWN0aW9uICovCisgIC8qIC0+aW5zdHJ1Y3Rpb24gdG8gYmUgcmVwbGFjZWQgKi8KKyAgY2hhciAqaVA7CisgIGZpeFMgKmZpeFA7CQkJLyogUmVsb2NhdGlvbiB0aGF0IGNhbiBiZSBkb25lIGF0IGFzc2VtYmx5IHRpbWUgKi8KKworICAvKiBQSUNLIFVQICYgUEFSU0UgQ09CUiBJTlNUUlVDVElPTiAqLworICBpUCA9IGZyYWdQLT5mcl9vcGNvZGU7CisgIGluc3RyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChpUCwgNCk7CisgIG9wY29kZSA9ICgoaW5zdHIgPj4gMjQpICYgMHhmZikgLSAweDMwOwkvKiAiLTB4MzAiIGZvciB0YWJsZSBpbmRleCAqLworICBzcmMxID0gKGluc3RyID4+IDE5KSAmIDB4MWY7CisgIG0xID0gKGluc3RyID4+IDEzKSAmIDE7CisgIHMyID0gaW5zdHIgJiAxOworICBzcmMyID0gKGluc3RyID4+IDE0KSAmIDB4MWY7CisgIGJwX2JpdHMgPSBpbnN0ciAmIEJQX01BU0s7CisKKyAgLyogR0VORVJBVEUgQU5EIE9VVFBVVCBDT01QQVJFIElOU1RSVUNUSU9OICovCisgIGluc3RyID0gY29qW29wY29kZV0uY29tcGFyZQorICAgIHwgc3JjMSB8IChtMSA8PCAxMSkgfCAoczIgPDwgNikgfCAoc3JjMiA8PCAxNCk7CisgIG1kX251bWJlcl90b19jaGFycyAoaVAsIGluc3RyLCA0KTsKKworICAvKiBPVVRQVVQgQlJBTkNIIElOU1RSVUNUSU9OICovCisgIG1kX251bWJlcl90b19jaGFycyAoaVAgKyA0LCBjb2pbb3Bjb2RlXS5icmFuY2ggfCBicF9iaXRzLCA0KTsKKworICAvKiBTRVQgVVAgQUREUkVTUyBGSVhVUC9SRUxPQ0FUSU9OICovCisgIGZpeFAgPSBmaXhfbmV3IChmcmFnUCwKKwkJICBpUCArIDQgLSBmcmFnUC0+ZnJfbGl0ZXJhbCwKKwkJICA0LAorCQkgIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgZnJhZ1AtPmZyX29mZnNldCwKKwkJICAxLAorCQkgIE5PX1JFTE9DKTsKKworICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAyNDsJLyogU3RvcmUgc2l6ZSBvZiBiaXQgZmllbGQgKi8KKworICBmcmFnUC0+ZnJfZml4ICs9IDQ7CisgIGZyYWdfd2FuZSAoZnJhZ1ApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgcmVsb2NfY2FsbGo6CVJlbG9jYXRlIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbgorCisgIAlUaGlzIGlzIGEgIm5vbi0oR05VKS1zdGFuZGFyZCIgbWFjaGluZS1kZXBlbmRlbnQgaG9vay4gIFRoZSBiYXNlCisgIAlhc3NlbWJsZXIgY2FsbHMgaXQgd2hlbiBpdCBkZWNpZGVzIGl0IGNhbiByZWxvY2F0ZSBhbiBhZGRyZXNzIGF0CisgIAlhc3NlbWJseSB0aW1lIGluc3RlYWQgb2YgZW1pdHRpbmcgYSByZWxvY2F0aW9uIGRpcmVjdGl2ZS4KKworICAJQ2hlY2sgdG8gc2VlIGlmIHRoZSByZWxvY2F0aW9uIGludm9sdmVzIGEgJ2NhbGxqJyBpbnN0cnVjdGlvbiB0byBhOgorICAJICAgIHN5c3Byb2M6CVJlcGxhY2UgdGhlIGRlZmF1bHQgJ2NhbGwnIGluc3RydWN0aW9uIHdpdGggYSAnY2FsbHMnCisgIAkgICAgbGVhZnByb2M6CVJlcGxhY2UgdGhlIGRlZmF1bHQgJ2NhbGwnIGluc3RydWN0aW9uIHdpdGggYSAnYmFsJy4KKyAgCSAgICBvdGhlciBwcm9jOglEbyBub3RoaW5nLgorCisgIAlTZWUgYi5vdXQuaCBmb3IgZGV0YWlscyBvbiB0aGUgJ25fb3RoZXInIGZpZWxkIGluIGEgc3ltYm9sIHN0cnVjdHVyZS4KKworICAgSU1QT1JUQU5UIToKKyAgCUFzc3VtZXMgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBmaWd1cmVkIG91dCwgaW4gdGhlIGNhc2Ugb2YgYSBsZWFmcHJvYywKKyAgCXRvIHVzZSB0aGUgJ2JhbCcgZW50cnkgcG9pbnQsIGFuZCBoYXMgc3Vic3RpdHV0ZWQgdGhhdCBzeW1ib2wgaW50byB0aGUKKyAgCXBhc3NlZCBmaXh1cCBzdHJ1Y3R1cmUuCisKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCit2b2lkCityZWxvY19jYWxsaiAoZml4UCkKKyAgICAgLyogUmVsb2NhdGlvbiB0aGF0IGNhbiBiZSBkb25lIGF0IGFzc2VtYmx5IHRpbWUgKi8KKyAgICAgZml4UyAqZml4UDsKK3sKKyAgLyogUG9pbnRzIHRvIHRoZSBiaW5hcnkgZm9yIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuICAqLworICBjaGFyICp3aGVyZTsKKworICBpZiAoIWZpeFAtPmZ4X3RjYml0KQorICAgIHsKKyAgICAgIC8qIFRoaXMgd2Fzbid0IGEgY2FsbGogaW5zdHJ1Y3Rpb24gaW4gdGhlIGZpcnN0IHBsYWNlICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOworCisgIGlmIChUQ19TX0lTX1NZU1BST0MgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICB7CisgICAgICAvKiBTeW1ib2wgaXMgYSAuc3lzcHJvYzogcmVwbGFjZSAnY2FsbCcgd2l0aCAnY2FsbHMnLiAgU3lzdGVtCisgICAgICAgICBwcm9jZWR1cmUgbnVtYmVyIGlzIChvdGhlci0xKS4gICovCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCBDQUxMUyB8IFRDX1NfR0VUX1NZU1BST0MgKGZpeFAtPmZ4X2FkZHN5KSwgNCk7CisKKyAgICAgIC8qIE5vdGhpbmcgZWxzZSBuZWVkcyB0byBiZSBkb25lIGZvciB0aGlzIGluc3RydWN0aW9uLiAgTWFrZQorICAgICAgICAgc3VyZSAnbWRfbnVtYmVyX3RvX2ZpZWxkKCknIHdpbGwgcGVyZm9ybSBhIG5vLW9wLiAgKi8KKyAgICAgIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIDE7CisKKyAgICB9CisgIGVsc2UgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICB7CisgICAgICAvKiBTaG91bGQgbm90IGhhcHBlbjogc2VlIGJsb2NrIGNvbW1lbnQgYWJvdmUgKi8KKyAgICAgIGFzX2ZhdGFsIChfKCJUcnlpbmcgdG8gJ2JhbCcgdG8gJXMiKSwgU19HRVRfTkFNRSAoZml4UC0+ZnhfYWRkc3kpKTsKKyAgICB9CisgIGVsc2UgaWYgKFRDX1NfSVNfQkFMTkFNRSAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIC8qIFJlcGxhY2UgJ2NhbGwnIHdpdGggJ2JhbCc7IGJvdGggaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgIGZvcm1hdCwgc28gY2FsbGluZyBjb2RlIHNob3VsZCBjb21wbGV0ZSByZWxvY2F0aW9uIGFzIGlmCisgICAgICAgICBub3RoaW5nIGhhcHBlbmVkIGhlcmUuICAqLworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgQkFMLCA0KTsKKyAgICB9CisgIGVsc2UgaWYgKFRDX1NfSVNfQkFEUFJPQyAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiTG9va3MgbGlrZSBhIHByb2MsIGJ1dCBjYW4ndCB0ZWxsIHdoYXQga2luZC5cbiIpKTsKKyAgICB9CQkJCS8qIHN3aXRjaCBvbiBwcm9jIHR5cGUgKi8KKworICAvKiBlbHNlIFN5bWJvbCBpcyBuZWl0aGVyIGEgc3lzcHJvYyBub3IgYSBsZWFmcHJvYyAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgc19sZWFmcHJvYzoJcHJvY2VzcyAubGVhZnByb2MgcHNldWRvLW9wCisKKyAgCS5sZWFmcHJvYyB0YWtlcyB0d28gYXJndW1lbnRzLCB0aGUgc2Vjb25kIG9uZSBpcyBvcHRpb25hbDoKKyAgCQlhcmdbMV06IG5hbWUgb2YgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGxlYWYgcHJvY2VkdXJlCisgIAkJYXJnWzJdOiBuYW1lIG9mICdiYWwnIGVudHJ5IHBvaW50IHRvIGxlYWYgcHJvY2VkdXJlCisKKyAgCUlmIHRoZSB0d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIG9yIGlmIHRoZSBzZWNvbmQgb25lIGlzIG1pc3NpbmcsCisgIAl0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGFrZW4gdG8gYmUgdGhlICdiYWwnIGVudHJ5IHBvaW50LgorCisgIAlJZiB0aGVyZSBhcmUgMiBkaXN0aW5jdCBhcmd1bWVudHMsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlICdiYWwnCisgIAllbnRyeSBwb2ludCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgaW4gdGhlIGxpbmtlZAorICAJbGlzdCBvZiBzeW1ib2xzLgorCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQKK3NfbGVhZnByb2MgKG5fb3BzLCBhcmdzKQorICAgICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCisgICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMV0tPjFzdCBvcGVyYW5kLCBhcmdzWzJdLT4ybmQgb3BlcmFuZCAqLworeworICBzeW1ib2xTICpjYWxsUDsJCS8qIFBvaW50ZXIgdG8gbGVhZnByb2MgJ2NhbGwnIGVudHJ5IHBvaW50IHN5bWJvbCAqLworICBzeW1ib2xTICpiYWxQOwkJLyogUG9pbnRlciB0byBsZWFmcHJvYyAnYmFsJyBlbnRyeSBwb2ludCBzeW1ib2wgKi8KKworICBpZiAoKG5fb3BzICE9IDEpICYmIChuX29wcyAhPSAyKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInNob3VsZCBoYXZlIDEgb3IgMiBvcGVyYW5kcyIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CQkJCS8qIENoZWNrIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKworICAvKiBGaW5kIG9yIGNyZWF0ZSBzeW1ib2wgZm9yICdjYWxsJyBlbnRyeSBwb2ludC4gKi8KKyAgY2FsbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzFdKTsKKworICBpZiAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiKSwgU19HRVRfTkFNRSAoY2FsbFApKTsKKyAgICB9CQkJCS8qIGlzIGxlYWZwcm9jICovCisKKyAgLyogSWYgdGhhdCB3YXMgdGhlIG9ubHkgYXJndW1lbnQsIHVzZSBpdCBhcyB0aGUgJ2JhbCcgZW50cnkgcG9pbnQuCisgICAgICogT3RoZXJ3aXNlLCBtYXJrIGl0IGFzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgYW5kIGZpbmQgb3IgY3JlYXRlCisgICAgICogYW5vdGhlciBzeW1ib2wgZm9yIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KKyAgICovCisgIGlmICgobl9vcHMgPT0gMSkgfHwgIXN0cmNtcCAoYXJnc1sxXSwgYXJnc1syXSkpCisgICAgeworICAgICAgVENfU19GT1JDRV9UT19CQUxOQU1FIChjYWxsUCk7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FIChjYWxsUCk7CisKKyAgICAgIGJhbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChhcmdzWzJdKTsKKyAgICAgIGlmIChUQ19TX0lTX0NBTExOQU1FIChiYWxQKSkKKwl7CisJICBhc193YXJuIChfKCJSZWRlZmluaW5nIGxlYWZwcm9jICVzIiksIFNfR0VUX05BTUUgKGJhbFApKTsKKwl9CisgICAgICBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUgKGJhbFApOworCisgICAgICB0Y19zZXRfYmFsX29mX2NhbGwgKGNhbGxQLCBiYWxQKTsKKyAgICB9CQkJCS8qIGlmIG9ubHkgb25lIGFyZywgb3IgdGhlIGFyZ3MgYXJlIHRoZSBzYW1lICovCit9CisKKworLyoKKyAgIHNfc3lzcHJvYzogcHJvY2VzcyAuc3lzcHJvYyBwc2V1ZG8tb3AKKworICAgICAgICAuc3lzcHJvYyB0YWtlcyB0d28gYXJndW1lbnRzOgorICAgICAgICAgICAgICAgIGFyZ1sxXTogbmFtZSBvZiBlbnRyeSBwb2ludCB0byBzeXN0ZW0gcHJvY2VkdXJlCisgICAgICAgICAgICAgICAgYXJnWzJdOiAnZW50cnlfbnVtJyAoaW5kZXgpIG9mIHN5c3RlbSBwcm9jZWR1cmUgaW4gdGhlIHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICBbMCwzMV0gaW5jbHVzaXZlLgorCisgICAgICAgIEZvciBbYWJdLm91dCwgd2Ugc3RvcmUgdGhlICdlbnRyeW51bScgaW4gdGhlICduX290aGVyJyBmaWVsZCBvZgorICAgICAgICB0aGUgc3ltYm9sLiAgU2luY2UgdGhhdCBlbnRyeSBpcyBub3JtYWxseSAwLCB3ZSBiaWFzICdlbnRyeW51bScKKyAgICAgICAgYnkgYWRkaW5nIDEgdG8gaXQuICBJdCBtdXN0IGJlIHVuYmlhc2VkIGJlZm9yZSBpdCBpcyB1c2VkLiAgKi8KK3N0YXRpYyB2b2lkCitzX3N5c3Byb2MgKG5fb3BzLCBhcmdzKQorICAgICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCisgICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMV0tPjFzdCBvcGVyYW5kLCBhcmdzWzJdLT4ybmQgb3BlcmFuZCAqLworeworICBleHByZXNzaW9uUyBleHA7CisgIHN5bWJvbFMgKnN5bVA7CisKKyAgaWYgKG5fb3BzICE9IDIpCisgICAgeworICAgICAgYXNfYmFkIChfKCJzaG91bGQgaGF2ZSB0d28gb3BlcmFuZHMiKSk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBiYWQgYXJnIGNvdW50ICovCisKKyAgLyogUGFyc2UgImVudHJ5X251bSIgYXJndW1lbnQgYW5kIGNoZWNrIGl0IGZvciB2YWxpZGl0eS4gKi8KKyAgcGFyc2VfZXhwciAoYXJnc1syXSwgJmV4cCk7CisgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50CisgICAgICB8fCAob2ZmcyAoZXhwKSA8IDApCisgICAgICB8fCAob2ZmcyAoZXhwKSA+IDMxKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIidlbnRyeV9udW0nIG11c3QgYmUgYWJzb2x1dGUgbnVtYmVyIGluIFswLDMxXSIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogRmluZC9tYWtlIHN5bWJvbCBhbmQgc3RpY2sgZW50cnkgbnVtYmVyIChiaWFzZWQgYnkgKzEpIGludG8gaXQgKi8KKyAgc3ltUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMV0pOworCisgIGlmIChUQ19TX0lTX1NZU1BST0MgKHN5bVApKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgZW50cnludW0gZm9yIHN5c3Byb2MgJXMiKSwgU19HRVRfTkFNRSAoc3ltUCkpOworICAgIH0JCQkJLyogcmVkZWZpbmluZyAqLworCisgIFRDX1NfU0VUX1NZU1BST0MgKHN5bVAsIG9mZnMgKGV4cCkpOwkvKiBlbmNvZGUgZW50cnkgbnVtYmVyICovCisgIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyAoc3ltUCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBzaGlmdF9vazoKKyAgCURldGVybWluZSBpZiBhICJzaGxvIiBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSAibGRjb25zdCIuCisgIAlUaGlzIG1lYW5zIHRoYXQgc29tZSBudW1iZXIgWCA8IDMyIGNhbiBiZSBzaGlmdGVkIGxlZnQgdG8gcHJvZHVjZSB0aGUKKyAgCWNvbnN0YW50IG9mIGludGVyZXN0LgorCisgIAlSZXR1cm4gdGhlIHNoaWZ0IGNvdW50LCBvciAwIGlmIHdlIGNhbid0IGRvIGl0LgorICAJQ2FsbGVyIGNhbGN1bGF0ZXMgWCBieSBzaGlmdGluZyBvcmlnaW5hbCBjb25zdGFudCByaWdodCAnc2hpZnQnIHBsYWNlcy4KKworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYworaW50CitzaGlmdF9vayAobikKKyAgICAgaW50IG47CQkJLyogVGhlIGNvbnN0YW50IG9mIGludGVyZXN0ICovCit7CisgIGludCBzaGlmdDsJCQkvKiBUaGUgc2hpZnQgY291bnQgKi8KKworICBpZiAobiA8PSAwKQorICAgIHsKKyAgICAgIC8qIENhbid0IGRvIGl0IGZvciBuZWdhdGl2ZSBudW1iZXJzICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogU2hpZnQgJ24nIHJpZ2h0IHVudGlsIGEgMSBpcyBhYm91dCB0byBiZSBsb3N0ICovCisgIGZvciAoc2hpZnQgPSAwOyAobiAmIDEpID09IDA7IHNoaWZ0KyspCisgICAgeworICAgICAgbiA+Pj0gMTsKKyAgICB9CisKKyAgaWYgKG4gPj0gMzIpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gc2hpZnQ7Cit9CisKKworLyogc3ludGF4OiBpc3N1ZSBzeW50YXggZXJyb3IgKi8KKworc3RhdGljIHZvaWQKK3N5bnRheCAoKQoreworICBhc19iYWQgKF8oInN5bnRheCBlcnJvciIpKTsKK30JCQkJLyogc3ludGF4KCkgKi8KKworCisvKiB0YXJnX2hhc19zZnI6CisKKyAgIFJldHVybiBUUlVFIGlmZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCisgICBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyIChzZnIpLiAgKi8KKworc3RhdGljCitpbnQKK3RhcmdfaGFzX3NmciAobikKKyAgICAgaW50IG47CQkJLyogTnVtYmVyICgwLTMxKSBvZiBzZnIgKi8KK3sKKyAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCisgICAgeworICAgIGNhc2UgQVJDSF9LQToKKyAgICBjYXNlIEFSQ0hfS0I6CisgICAgY2FzZSBBUkNIX01DOgorICAgIGNhc2UgQVJDSF9KWDoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVJDSF9IWDoKKyAgICAgIHJldHVybiAoKDAgPD0gbikgJiYgKG4gPD0gNCkpOworICAgIGNhc2UgQVJDSF9DQToKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICgoMCA8PSBuKSAmJiAobiA8PSAyKSk7CisgICAgfQorfQorCisKKy8qIHRhcmdfaGFzX2ljbGFzczoKKworICAgUmV0dXJuIFRSVUUgaWZmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIHRoZSBpbmRpY2F0ZWQKKyAgIGNsYXNzIG9mIGluc3RydWN0aW9ucy4gICovCitzdGF0aWMKK2ludAordGFyZ19oYXNfaWNsYXNzIChpYykKKyAgICAgLyogSW5zdHJ1Y3Rpb24gY2xhc3M7ICBvbmUgb2Y6CisgICAgICAgIElfQkFTRSwgSV9DWCwgSV9ERUMsIElfS1gsIElfRlAsIElfTUlMLCBJX0NBU0lNLCBJX0NYMiwgSV9IWCwgSV9IWDIKKyAgICAgICovCisgICAgIGludCBpYzsKK3sKKyAgaWNsYXNzZXNfc2VlbiB8PSBpYzsKKyAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCisgICAgeworICAgIGNhc2UgQVJDSF9LQToKKyAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYKTsKKyAgICBjYXNlIEFSQ0hfS0I6CisgICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCB8IElfRlAgfCBJX0RFQyk7CisgICAgY2FzZSBBUkNIX01DOgorICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1ggfCBJX0ZQIHwgSV9ERUMgfCBJX01JTCk7CisgICAgY2FzZSBBUkNIX0NBOgorICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1ggfCBJX0NYMiB8IElfQ0FTSU0pOworICAgIGNhc2UgQVJDSF9KWDoKKyAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYMiB8IElfSlgpOworICAgIGNhc2UgQVJDSF9IWDoKKyAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYMiB8IElfSlggfCBJX0hYKTsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKChpY2xhc3Nlc19zZWVuICYgKElfS1ggfCBJX0ZQIHwgSV9ERUMgfCBJX01JTCkpCisJICAmJiAoaWNsYXNzZXNfc2VlbiAmIChJX0NYIHwgSV9DWDIpKSkKKwl7CisJICBhc193YXJuIChfKCJhcmNoaXRlY3R1cmUgb2Ygb3Bjb2RlIGNvbmZsaWN0cyB3aXRoIHRoYXQgb2YgZWFybGllciBpbnN0cnVjdGlvbihzKSIpKTsKKwkgIGljbGFzc2VzX3NlZW4gJj0gfmljOworCX0KKyAgICAgIHJldHVybiAxOworICAgIH0KK30KKworLyogSGFuZGxlIHRoZSBNUkkgLmVuZGlhbiBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorc19lbmRpYW4gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBjOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJsaXR0bGUiKSA9PSAwKQorICAgIDsKKyAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImJpZyIpID09IDApCisgICAgYXNfYmFkIChfKCJiaWcgZW5kaWFuIG1vZGUgaXMgbm90IHN1cHBvcnRlZCIpKTsKKyAgZWxzZQorICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIHVucmVjb2duaXplZCAuZW5kaWFuIHR5cGUgYCVzJyIpLCBuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KKworLyogQVJHU1VTRUQgKi8KK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KKyAgIE9uIHRoZSBpOTYwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiwKKyAgIHdoaWNoIHdlIGhhdmUgc2V0IHVwIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXh1cCB0b28uICovCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOworfQorCit2b2lkCittZF9hcHBseV9maXggKGZpeFAsIHZhbCkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgbG9uZyB2YWw7Cit7CisgIGNoYXIgKnBsYWNlID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOworCisgIGlmICghZml4UC0+ZnhfYml0X2ZpeFApCisgICAgeworICAgICAgLyogRm9yIGNhbGx4LCB3ZSBhbHdheXMgd2FudCB0byB3cml0ZSBvdXQgemVybywgYW5kIGVtaXQgYQorCSBzeW1ib2xpYyByZWxvY2F0aW9uLiAgKi8KKyAgICAgIGlmIChmaXhQLT5meF9ic3IpCisJdmFsID0gMDsKKworICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOworICAgICAgbWRfbnVtYmVyX3RvX2ltbSAocGxhY2UsIHZhbCwgZml4UC0+Znhfc2l6ZSwgZml4UCk7CisgICAgfQorICBlbHNlCisgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChwbGFjZSwgdmFsLCBmaXhQLT5meF9iaXRfZml4UCk7Cit9CisKKyNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCit2b2lkCit0Y19ib3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQorICAgICBjaGFyICp3aGVyZTsKKyAgICAgZml4UyAqZml4UDsKKyAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Cit7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07CisgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gcmk7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgbWVtc2V0ICgoY2hhciAqKSAmcmksICdcMCcsIHNpemVvZiAocmkpKTsKKyAgc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5OworICBrbm93IChzeW1ib2xQICE9IDAgfHwgZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKTsKKyAgcmkucl9ic3IgPSBmaXhQLT5meF9ic3I7CS8qU0FDIExEIFJFTEFYIEhBQ0sgKi8KKyAgLyogVGhlc2UgdHdvICdjdXogb2YgTlMzMksgKi8KKyAgcmkucl9jYWxsaiA9IGZpeFAtPmZ4X3RjYml0OworICBpZiAoZml4UC0+ZnhfYml0X2ZpeFApCisgICAgcmkucl9sZW5ndGggPSAyOworICBlbHNlCisgICAgcmkucl9sZW5ndGggPSBuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV07CisgIHJpLnJfcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKKyAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7CisKKyAgaWYgKGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQykKKyAgICB7CisgICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKwl7CisJY2FzZSByc19hbGlnbjoKKwkgIHJpLnJfaW5kZXggPSAtMjsKKwkgIHJpLnJfcGNyZWwgPSAxOworCSAgcmkucl9sZW5ndGggPSBmaXhQLT5meF9zaXplIC0gMTsKKwkgIGJyZWFrOworCWNhc2UgcnNfb3JnOgorCSAgcmkucl9pbmRleCA9IC0yOworCSAgcmkucl9wY3JlbCA9IDA7CisJICBicmVhazsKKwljYXNlIHJzX2ZpbGw6CisJICByaS5yX2luZGV4ID0gLTE7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgcmkucl9leHRlcm4gPSAwOworICAgIH0KKyAgZWxzZSBpZiAobGlua3JlbGF4IHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IGZpeFAtPmZ4X2JzcikKKyAgICB7CisgICAgICByaS5yX2V4dGVybiA9IDE7CisgICAgICByaS5yX2luZGV4ID0gc3ltYm9sUC0+c3lfbnVtYmVyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJpLnJfZXh0ZXJuID0gMDsKKyAgICAgIHJpLnJfaW5kZXggPSBTX0dFVF9UWVBFIChzeW1ib2xQKTsKKyAgICB9CisKKyAgLyogT3V0cHV0IHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGluIG1hY2hpbmUtZGVwZW5kZW50IGZvcm0uICovCisgIG1kX3JpX3RvX2NoYXJzICh3aGVyZSwgJnJpKTsKK30KKworI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCisKKyNpZiBkZWZpbmVkIChPQkpfQ09GRikgJiYgZGVmaW5lZCAoQkZEKQorc2hvcnQKK3RjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICBpZiAoZml4UC0+ZnhfYnNyKQorICAgIGFib3J0ICgpOworCisgIGlmIChmaXhQLT5meF9wY3JlbCA9PSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKKyAgICByZXR1cm4gUl9SRUxMT05HOworCisgIGlmIChmaXhQLT5meF9wY3JlbCAhPSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKKyAgICByZXR1cm4gUl9JUFJNRUQ7CisKKyAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfQorCitpbnQKK3RjX2NvZmZfc2l6ZW1hY2hkZXAgKGZyYWcpCisgICAgIGZyYWdTICpmcmFnOworeworICBpZiAoZnJhZy0+ZnJfbmV4dCkKKyAgICByZXR1cm4gZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3M7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBBbGlnbiBhbiBhZGRyZXNzIGJ5IHJvdW5kaW5nIGl0IHVwIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRhcnkuICAqLwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCisgICAgIHNlZ1Qgc2VnOworICAgICB2YWx1ZVQgYWRkcjsJCS8qIEFkZHJlc3MgdG8gYmUgcm91bmRlZCB1cCAqLworeworICByZXR1cm4gKChhZGRyICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKSAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Cit9CQkJCS8qIG1kX3NlY3Rpb25fYWxpZ24oKSAqLworCitleHRlcm4gaW50IGNvZmZfZmxhZ3M7CisKKyNpZmRlZiBPQkpfQ09GRgordm9pZAordGNfaGVhZGVyc19ob29rIChoZWFkZXJzKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKK3sKKyAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCisgICAgeworICAgIGNhc2UgQVJDSF9LQToKKyAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwS0E7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJDSF9LQjoKKyAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwS0I7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJDSF9NQzoKKyAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwTUM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJDSF9DQToKKyAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwQ0E7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJDSF9KWDoKKyAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwSlg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVJDSF9IWDoKKyAgICAgIGNvZmZfZmxhZ3MgfD0gRl9JOTYwSFg7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoaWNsYXNzZXNfc2VlbiA9PSBJX0JBU0UpCisJY29mZl9mbGFncyB8PSBGX0k5NjBDT1JFOworICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfQ1gpCisJY29mZl9mbGFncyB8PSBGX0k5NjBDQTsKKyAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0hYKQorCWNvZmZfZmxhZ3MgfD0gRl9JOTYwSFg7CisgICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9KWCkKKwljb2ZmX2ZsYWdzIHw9IEZfSTk2MEpYOworICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfQ1gyKQorCWNvZmZfZmxhZ3MgfD0gRl9JOTYwQ0E7CisgICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9NSUwpCisJY29mZl9mbGFncyB8PSBGX0k5NjBNQzsKKyAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiAoSV9ERUMgfCBJX0ZQKSkKKwljb2ZmX2ZsYWdzIHw9IEZfSTk2MEtCOworICAgICAgZWxzZQorCWNvZmZfZmxhZ3MgfD0gRl9JOTYwS0E7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQorICAgIHsKKyAgICAgIGhlYWRlcnMtPmZpbGVoZHIuZl9tYWdpYyA9IEk5NjBSV01BR0lDOworICAgICAgaGVhZGVycy0+YW91dGhkci5tYWdpYyA9IE9NQUdJQzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBoZWFkZXJzLT5maWxlaGRyLmZfbWFnaWMgPSBJOTYwUk9NQUdJQzsKKyAgICAgIGhlYWRlcnMtPmFvdXRoZHIubWFnaWMgPSBOTUFHSUM7CisgICAgfQkJCQkvKiBzZXQgbWFnaWMgbnVtYmVycyAqLworfQorCisjZW5kaWYgLyogT0JKX0NPRkYgKi8KKworLyogVGhpbmdzIGdvaW5nIG9uIGhlcmU6CisKKyAgIEZvciBib3V0LCBXZSBuZWVkIHRvIGFzc3VyZSBhIGNvdXBsZSBvZiBzaW1wbGlmeWluZworICAgYXNzdW1wdGlvbnMgYWJvdXQgbGVhZnByb2NzIGZvciB0aGUgbGlua2VyOiB0aGUgbGVhZnByb2MKKyAgIGVudHJ5IHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGFzc2VtYmx5IGluCisgICB3aGljaCB0aGV5J3JlIGRlY2xhcmVkIHdpdGggdGhlICcubGVhZnByb2MnIGRpcmVjdGl2ZTsKKyAgIGFuZCBpZiBhIGxlYWZwcm9jIGhhcyBib3RoICdjYWxsJyBhbmQgJ2JhbCcgZW50cnkgcG9pbnRzCisgICB0aGV5IGFyZSBib3RoIGdsb2JhbCBvciBib3RoIGxvY2FsLgorCisgICBGb3IgY29mZiwgdGhlIGNhbGwgc3ltYm9sIGhhcyBhIHNlY29uZCBhdXggZW50cnkgdGhhdAorICAgY29udGFpbnMgdGhlIGJhbCBlbnRyeSBwb2ludC4gIFRoZSBiYWwgc3ltYm9sIGJlY29tZXMgYQorICAgbGFiZWwuCisKKyAgIEZvciBjb2ZmIHJlcHJlc2VudGF0aW9uLCB0aGUgY2FsbCBzeW1ib2wgaGFzIGEgc2Vjb25kIGF1eCBlbnRyeSB0aGF0CisgICBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50LiAgVGhlIGJhbCBzeW1ib2wgYmVjb21lcyBhIGxhYmVsLiAgKi8KKwordm9pZAordGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCisgICAgeworI2lmZGVmIE9CSl9DT0ZGCisgICAgICBpZiAoVENfU19JU19TWVNQUk9DIChzeW1ib2xQKSkKKwl7CisJICAvKiBzZWNvbmQgYXV4IGVudHJ5IGFscmVhZHkgY29udGFpbnMgdGhlIHN5c3Byb2MgbnVtYmVyICovCisJICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAyKTsKKwkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU0NBTEwpOworCSAgU19TRVRfREFUQV9UWVBFIChzeW1ib2xQLCBTX0dFVF9EQVRBX1RZUEUgKHN5bWJvbFApIHwgKERUX0ZDTiA8PCBOX0JUU0hGVCkpOworCSAgY29udGludWU7CisJfQkJCS8qIHJld3JpdGUgc3lzcHJvYyAqLworI2VuZGlmIC8qIE9CSl9DT0ZGICovCisKKyAgICAgIGlmICghVENfU19JU19CQUxOQU1FIChzeW1ib2xQKSAmJiAhVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCisJeworCSAgY29udGludWU7CisJfQkJCS8qIE5vdCBhIGxlYWZwcm9jIHN5bWJvbCAqLworCisgICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCisJeworCSAgYXNfYmFkIChfKCJsZWFmcHJvYyBzeW1ib2wgJyVzJyB1bmRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOworCX0JCQkvKiB1bmRlZmluZWQgbGVhZiAqLworCisgICAgICBpZiAoVENfU19JU19DQUxMTkFNRSAoc3ltYm9sUCkpCisJeworCSAgc3ltYm9sUyAqYmFsUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoc3ltYm9sUCk7CisJICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgIT0gU19JU19FWFRFUk5BTCAoYmFsUCkpCisJICAgIHsKKwkgICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisJICAgICAgU19TRVRfRVhURVJOQUwgKGJhbFApOworCSAgICAgIGFzX3dhcm4gKF8oIldhcm5pbmc6IG1ha2luZyBsZWFmcHJvYyBlbnRyaWVzICVzIGFuZCAlcyBib3RoIGdsb2JhbFxuIiksCisJCSAgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgU19HRVRfTkFNRSAoYmFsUCkpOworCSAgICB9CQkJLyogZXh0ZXJuYWxpdHkgbWlzbWF0Y2ggKi8KKwl9CQkJLyogaWYgY2FsbG5hbWUgKi8KKyAgICB9CQkJCS8qIHdhbGsgdGhlIHN5bWJvbCBjaGFpbiAqLworfQorCisvKiBGb3IgYW91dCBvciBib3V0LCB0aGUgYmFsIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGNhbGwuCisKKyAgIEZvciBjb2ZmLCB3ZSBjaGVhdCBhbmQgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBiYWwgc3ltYm9sIGluIHRoZQorICAgc2Vjb25kIGF1eCBlbnRyeSBvZiB0aGUgY2FsbC4gICovCisKKyN1bmRlZiBPQkpfQUJPVVQKKyNpZmRlZiBPQkpfQU9VVAorI2RlZmluZSBPQkpfQUJPVVQKKyNlbmRpZgorI2lmZGVmIE9CSl9CT1VUCisjZGVmaW5lIE9CSl9BQk9VVAorI2VuZGlmCisKK3ZvaWQKK3RjX3NldF9iYWxfb2ZfY2FsbCAoY2FsbFAsIGJhbFApCisgICAgIHN5bWJvbFMgKmNhbGxQOworICAgICBzeW1ib2xTICpiYWxQOworeworICBrbm93IChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpOworICBrbm93IChUQ19TX0lTX0JBTE5BTUUgKGJhbFApKTsKKworI2lmZGVmIE9CSl9DT0ZGCisKKyAgY2FsbFAtPnN5X3RjID0gYmFsUDsKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoY2FsbFAsIDIpOworCisjZWxzZSAvKiAhIE9CSl9DT0ZGICovCisjaWZkZWYgT0JKX0FCT1VUCisKKyAgLyogSWYgdGhlICdiYWwnIGVudHJ5IGRvZXNuJ3QgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSAnY2FsbCcKKyAgICAgKiBzeW1ib2wsIHVubGluayBpdCBmcm9tIHRoZSBzeW1ib2wgbGlzdCBhbmQgcmUtaW5zZXJ0IGl0LgorICAgKi8KKyAgaWYgKHN5bWJvbF9uZXh0IChjYWxsUCkgIT0gYmFsUCkKKyAgICB7CisgICAgICBzeW1ib2xfcmVtb3ZlIChiYWxQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICAgIHN5bWJvbF9hcHBlbmQgKGJhbFAsIGNhbGxQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICB9CQkJCS8qIGlmIG5vdCBpbiBvcmRlciAqLworCisjZWxzZSAvKiAhIE9CSl9BQk9VVCAqLworICAoYXMgeWV0IHVud3JpdHRlbi4pOworI2VuZGlmIC8qICEgT0JKX0FCT1VUICovCisjZW5kaWYgLyogISBPQkpfQ09GRiAqLworfQorCitzeW1ib2xTICoKK3RjX2dldF9iYWxfb2ZfY2FsbCAoY2FsbFApCisgICAgIHN5bWJvbFMgKmNhbGxQOworeworICBzeW1ib2xTICpyZXR2YWw7CisKKyAga25vdyAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKTsKKworI2lmZGVmIE9CSl9DT0ZGCisgIHJldHZhbCA9IGNhbGxQLT5zeV90YzsKKyNlbHNlCisjaWZkZWYgT0JKX0FCT1VUCisgIHJldHZhbCA9IHN5bWJvbF9uZXh0IChjYWxsUCk7CisjZWxzZQorICAoYXMgeWV0IHVud3JpdHRlbi4pOworI2VuZGlmIC8qICEgT0JKX0FCT1VUICovCisjZW5kaWYgLyogISBPQkpfQ09GRiAqLworCisgIGtub3cgKFRDX1NfSVNfQkFMTkFNRSAocmV0dmFsKSk7CisgIHJldHVybiByZXR2YWw7Cit9CQkJCS8qIF90Y19nZXRfYmFsX29mX2NhbGwoKSAqLworCit2b2lkCit0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHN5bWJvbFApCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7Cit7CisgIGlmIChUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKKyAgICB7CisjaWZkZWYgT0JKX0NPRkYKKyAgICAgIHN5bWJvbFMgKmJhbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKHN5bWJvbFApOworCisjaWYgMAorICAgICAgLyogc2Vjb25kIGF1eCBlbnRyeSBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50ICovCisgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAyKTsKKyNlbmRpZgorICAgICAgc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9iYWwueF9iYWxudHJ5ID0gU19HRVRfVkFMVUUgKGJhbFApOworICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUKQorCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEVBRkVYVCk7CisgICAgICBlbHNlCisJU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19MRUFGU1RBVCk7CisgICAgICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCkgfCAoRFRfRkNOIDw8IE5fQlRTSEZUKSk7CisgICAgICAvKiBmaXggdXAgdGhlIGJhbCBzeW1ib2wgKi8KKyAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKGJhbFAsIENfTEFCRUwpOworI2VuZGlmIC8qIE9CSl9DT0ZGICovCisgICAgfQkJCQkvKiBvbmx5IG9uIGNhbGxzICovCit9CisKK3ZvaWQKK2k5NjBfaGFuZGxlX2FsaWduIChmcmFncCkKKyAgICAgZnJhZ1MgKmZyYWdwOworeworICBpZiAoIWxpbmtyZWxheCkKKyAgICByZXR1cm47CisKKyNpZm5kZWYgT0JKX0JPVVQKKworICBhc19iYWQgKF8oIm9wdGlvbiAtLWxpbmstcmVsYXggaXMgb25seSBzdXBwb3J0ZWQgaW4gYi5vdXQgZm9ybWF0IikpOworICBsaW5rcmVsYXggPSAwOworICByZXR1cm47CisKKyNlbHNlCisKKyAgLyogVGhlIHRleHQgc2VjdGlvbiAiZW5kcyIgd2l0aCBhbm90aGVyIGFsaWdubWVudCByZWxvYywgdG8gd2hpY2ggd2UKKyAgICAgYXJlbid0IGFkZGluZyBwYWRkaW5nLiAgKi8KKyAgaWYgKGZyYWdwLT5mcl9uZXh0ID09IHRleHRfbGFzdF9mcmFnCisgICAgICB8fCBmcmFncC0+ZnJfbmV4dCA9PSBkYXRhX2xhc3RfZnJhZykKKyAgICByZXR1cm47CisKKyAgLyogYWxpZ25tZW50IGRpcmVjdGl2ZSAqLworICBmaXhfbmV3IChmcmFncCwgZnJhZ3AtPmZyX2ZpeCwgZnJhZ3AtPmZyX29mZnNldCwgMCwgMCwgMCwKKwkgICAoaW50KSBmcmFncC0+ZnJfdHlwZSk7CisjZW5kaWYgLyogT0JKX0JPVVQgKi8KK30KKworaW50CitpOTYwX3ZhbGlkYXRlX2ZpeCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUsIGFkZF9zeW1ib2xQUCkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsKKyAgICAgc3ltYm9sUyAqKmFkZF9zeW1ib2xQUDsKK3sKKyNkZWZpbmUgYWRkX3N5bWJvbFAgKCphZGRfc3ltYm9sUFApCisgIGlmIChmaXhQLT5meF90Y2JpdCAmJiBUQ19TX0lTX0NBTExOQU1FIChhZGRfc3ltYm9sUCkpCisgICAgeworICAgICAgLyogUmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIGFzc29jaWF0ZWQgJ2JhbCcKKyAgICAgICAgIGVudHJ5IHBvaW50IHN5bWJvbC4gKi8KKworICAgICAgaWYgKCFUQ19TX0lTX0JBTE5BTUUgKHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApKSkKKwl7CisJICBhc19iYWQgKF8oIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIpLAorCQkgIFNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSk7CisJICByZXR1cm4gMTsKKwl9CisgICAgICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCk7CisgICAgfQorI2lmIDAKKyAgLyogU3RpbGwgaGF2ZSB0byB3b3JrIG91dCBvdGhlciBjb25kaXRpb25zIGZvciB0aGVzZSB0ZXN0cy4gICovCisgIHsKKyAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCisgICAgICB7CisJYXNfYmFkIChfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIikpOworCXJldHVybiAxOworICAgICAgfQorICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKKyAgICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCisgICAgICB7CisJLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhIDEzLWJpdAorCSAgIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6CisJICAgZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUgcmVsb2NhdGlvbi4gICovCisJYXNfYmFkIChfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKKwlmaXhQLT5meF9hZGRzeSA9IE5VTEw7CS8qIE5vIHJlbG9jYXRpb25zIHBsZWFzZS4gKi8KKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisjdW5kZWYgYWRkX3N5bWJvbFAKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGVuZCBvZiB0Yy1pOTYwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaTk2MC5oIGIvZ2FzL2NvbmZpZy90Yy1pOTYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwNjk2NwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtaTk2MC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiB0Yy1pOTYwLmggLSBCYXNpYyA4MDk2MCBpbnN0cnVjdGlvbiBmb3JtYXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpZm5kZWYgVENfSTk2MAorI2RlZmluZSBUQ19JOTYwIDEKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisvKgorICogVGhlICdDT0onIGluc3RydWN0aW9ucyBhcmUgYWN0dWFsbHkgQ09CUiBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgJ2InIGluCisgKiB0aGUgbW5lbW9uaWMgcmVwbGFjZWQgYnkgYSAnaic7ICB0aGV5IGFyZSBBTFdBWVMgImRlLW9wdGltaXplZCIgaWYgbmVjZXNzYXJ5OgorICogaWYgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTMgYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIHJlcGxhY2UgdGhlbQorICogd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEFsbCBvZiB0aGUgJ01FTW4nIGluc3RydWN0aW9ucyBhcmUgdGhlIHNhbWUgZm9ybWF0OyB0aGUgJ24nIGluIHRoZSBuYW1lCisgKiBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgaW5kZXggc2NhbGUgZmFjdG9yICh0aGUgc2l6ZSBvZiB0aGUgZGF0dW0gb3BlcmF0ZWQgb24pLgorICoKKyAqIFRoZSBGQlJBIGZvcm1hdHMgYXJlIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBUaGV5IGFyZSB0aGUKKyAqICJjb252ZW5pZW5jZSBkaXJlY3RpdmVzIiBmb3IgYnJhbmNoaW5nIG9uIGZsb2F0aW5nLXBvaW50IGNvbXBhcmlzb25zLAorICogZWFjaCBvZiB3aGljaCBnZW5lcmF0ZXMgMiBpbnN0cnVjdGlvbnMgKGEgJ2JubycgYW5kIG9uZSBvdGhlciBicmFuY2gpLgorICoKKyAqIFRoZSBDQUxMSiBmb3JtYXQgaXMgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIEl0IGluZGljYXRlcyB0aGF0CisgKiB0aGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkIChhIENUUkwtZm9ybWF0ICdjYWxsJykgc2hvdWxkIGhhdmUgaXRzIHJlbG9jYXRpb24KKyAqIHNwZWNpYWxseSBmbGFnZ2VkIGZvciBsaW5rLXRpbWUgcmVwbGFjZW1lbnQgd2l0aCBhICdiYWwnIG9yICdjYWxscycgaWYKKyAqIGFwcHJvcHJpYXRlLgorICovCisKKy8qIHRhaWxvciBnYXMgKi8KKyNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUworI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorI2RlZmluZSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT05TCisKKy8qIHRhaWxvciB0aGUgY29mZiBmb3JtYXQgKi8KKyNkZWZpbmUgQkZEX0FSQ0gJCQkJYmZkX2FyY2hfaTk2MAorI2RlZmluZSBDT0ZGX0ZMQUdTCQkJCUZfQVIzMldSCisjZGVmaW5lIENPRkZfTUFHSUMJCQkJSTk2MFJPTUFHSUMKKyNkZWZpbmUgT0JKX0NPRkZfU0VDVElPTl9IRUFERVJfSEFTX0FMSUdOTUVOVAorI2RlZmluZSBPQkpfQ09GRl9NQVhfQVVYRU5UUklFUwkJCSgyKQorI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhGSVhQKQkJCSghKEZJWFApLT5meF9kb25lKQorI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShGSVhQKQkJCXRjX2NvZmZfZml4MnJ0eXBlKEZJWFApCisjZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoRlJBR1ApCQl0Y19jb2ZmX3NpemVtYWNoZGVwKEZSQUdQKQorI2RlZmluZSBUQ19DT0ZGX1NFVF9NQUNISU5FKEhEUlMpCQl0Y19oZWFkZXJzX2hvb2sgKEhEUlMpCitleHRlcm4gdm9pZCB0Y19oZWFkZXJzX2hvb2sgKCk7CitleHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgKCk7CitleHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgKCk7CisKKy8qIE1FQU5JTkcgT0YgJ25fb3RoZXInIGluIHRoZSBzeW1ib2wgcmVjb3JkLgorICoKKyAqIElmIG5vbi16ZXJvLCB0aGUgJ25fb3RoZXInIGZpZWxkcyBpbmRpY2F0ZXMgZWl0aGVyIGEgbGVhZiBwcm9jZWR1cmUgb3IKKyAqIGEgc3lzdGVtIHByb2NlZHVyZSwgYXMgZm9sbG93czoKKyAqCisgKgkxIDw9IG5fb3RoZXIgPD0gMzIgOgorICoJCVRoZSBzeW1ib2wgaXMgdGhlIGVudHJ5IHBvaW50IHRvIGEgc3lzdGVtIHByb2NlZHVyZS4KKyAqCQknbl92YWx1ZScgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5LCBhcyBmb3IgYW55IG90aGVyCisgKgkJcHJvY2VkdXJlLiAgVGhlIHN5c3RlbSBwcm9jZWR1cmUgbnVtYmVyICh3aGljaCBjYW4gYmUgdXNlZCBpbgorICoJCWEgJ2NhbGxzJyBpbnN0cnVjdGlvbikgaXMgKG5fb3RoZXItMSkuICBUaGVzZSBlbnRyaWVzIGNvbWUgZnJvbQorICoJCScuc3lzcHJvYycgZGlyZWN0aXZlcy4KKyAqCisgKgluX290aGVyID09IE5fQ0FMTE5BTUUKKyAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KKyAqCQlUaGUgKm5leHQqIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAqCQknYmFsJyBlbnRyeSBwb2ludCB0byB0aGUgcHJvY2VkdXJlIChzZWUgZm9sbG93aW5nKS4gIFRoZXNlCisgKgkJZW50cmllcyBjb21lIGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCB0d28gZGlmZmVyZW50CisgKgkJc3ltYm9scyBhcmUgc3BlY2lmaWVkICh0aGUgZmlyc3Qgb25lIGlzIHJlcHJlc2VudGVkIGhlcmUpLgorICoKKyAqCisgKgluX290aGVyID09IE5fQkFMTkFNRQorICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCisgKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKKyAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCisgKgkJc3BlY2lmaWVkIHR3aWNlLgorICoKKyAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCisgKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KKyAqLworI2RlZmluZQlOX0NBTExOQU1FCSgoY2hhciktMSkKKyNkZWZpbmUJTl9CQUxOQU1FCSgoY2hhciktMikKKworLyogaTk2MCB1c2VzIGEgY3VzdG9tIHJlbG9jYXRpb24gcmVjb3JkLiAqLworCisvKiBsZXQgb2JqLWFvdXQuaCBrbm93ICovCisjZGVmaW5lIENVU1RPTV9SRUxPQ19GT1JNQVQgMQorLyogbGV0IGFvdXRfZ251Lmgga25vdyAqLworI2RlZmluZSBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCAxCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCisgIHsKKyAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCisgICAgdW5zaWduZWQKKyAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCisgICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCisJCQkJICoJT24gaTk2MCwgcGMtcmVsYXRpdmUgaW1wbGllcyAyNC1iaXQKKwkJCQkgKglhZGRyZXNzLCBhYnNvbHV0ZSBpbXBsaWVzIDMyLWJpdC4KKwkJCQkgKi8KKyAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6CisJCQkJICoJMCA9PiAxIGJ5dGUKKwkJCQkgKgkxID0+IDIgYnl0ZXMKKwkJCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCisJCQkJICovCisgICAgICByX2V4dGVybjoxLCByX2JzcjoxLAkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCisgICAgICByX2Rpc3A6MSwJCQkvKiBTb21ldGhpbmcgZm9yIHRoZSBHTlUgTlMzMksgYXNzZW1ibGVyICovCisgICAgICByX2NhbGxqOjEsCQkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLworICAgICAgbnV0aGluOjE7CQkJLyogVW51c2VkCQkJCSovCisgIH07CisKKyNpZmRlZiBPQkpfQ09GRgorCisvKiBXZSBzdG9yZSB0aGUgYmFsIGluZm9ybWF0aW9uIGluIHRoZSBzeV90YyBmaWVsZC4gICovCisjZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IHN5bWJvbCAqCisKKyNkZWZpbmUgVENfQURKVVNUX1JFTE9DX0NPVU5UKEZJWFAsQ09VTlQpIFwKKyAgeyBmaXhTICp0Y2ZpeHAgPSAoRklYUCk7IFwKKyAgICBmb3IgKDt0Y2ZpeHA7dGNmaXhwPXRjZml4cC0+ZnhfbmV4dCkgXAorICAgICAgaWYgKHRjZml4cC0+ZnhfdGNiaXQgJiYgdGNmaXhwLT5meF9hZGRzeSAhPSAwKSBcCisgICAgICAgICsrKENPVU5UKTsgXAorICB9CisjZW5kaWYKKworZXh0ZXJuIGludCBpOTYwX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QsIHN0cnVjdCBzeW1ib2wgKiopKTsKKyNkZWZpbmUgVENfVkFMSURBVEVfRklYKEZJWFAsU0VHVFlQRSxMQUJFTCkgXAorCWlmIChpOTYwX3ZhbGlkYXRlX2ZpeCAoRklYUCwgU0VHVFlQRSwgJmFkZF9zeW1ib2xQKSAhPSAwKSBnb3RvIExBQkVMCisKKyNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCSgoRklYUCktPmZ4X2JzciA9PSAwKQorCitleHRlcm4gdm9pZCBicnRhYl9lbWl0IFBBUkFNUyAoKHZvaWQpKTsKKyNkZWZpbmUgbWRfZW5kKCkJYnJ0YWJfZW1pdCAoKQorCitleHRlcm4gdm9pZCByZWxvY19jYWxsaiAoKTsKKworZXh0ZXJuIHZvaWQgdGNfc2V0X2JhbF9vZl9jYWxsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgc3RydWN0IHN5bWJvbCAqKSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICp0Y19nZXRfYmFsX29mX2NhbGwgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CisKK2V4dGVybiB2b2lkIGk5NjBfaGFuZGxlX2FsaWduICgpOworI2RlZmluZSBIQU5ETEVfQUxJR04oRlJBRykJaTk2MF9oYW5kbGVfYWxpZ24gKEZSQUcpCisjZGVmaW5lIE5FRURfRlhfUl9UWVBFCisjZGVmaW5lIE5PX1JFTE9DIC0xCisKKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCitleHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKKyNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQorCisjZGVmaW5lIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKKworI2RlZmluZSBUQ19GSVhfVFlQRSBzdHJ1Y3QgeyB1bnNpZ25lZCBic3IgOiAxOyB9CisjZGVmaW5lIGZ4X2JzciB0Y19maXhfZGF0YS5ic3IKKyNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGKQkoKEYpLT50Y19maXhfZGF0YS5ic3IgPSAwKQorCisjZW5kaWYKKworLyogZW5kIG9mIHRjLWk5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmMgYi9nYXMvY29uZmlnL3RjLW0zMnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdlNjIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1tMzJyLmMKQEAgLTAsMCArMSwxMzAwIEBACisvKiB0Yy1tMzJyLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgTWl0c3ViaXNoaSBNMzJSLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgIm9wY29kZXMvbTMyci1kZXNjLmgiCisjaW5jbHVkZSAib3Bjb2Rlcy9tMzJyLW9wYy5oIgorI2luY2x1ZGUgImNnZW4uaCIKKworLyogTGlua2VkIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IGFyZSBkZWJ1Z2dpbmcgc3ltYm9scyB0byBiZSBkZWZpbmVkIGFzIHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IHN5bV9saW5rCit7CisgIHN0cnVjdCBzeW1fbGluayAqbmV4dDsKKyAgc3ltYm9sUwkgICpzeW1ib2w7Cit9IHN5bV9saW5rUzsKKworc3RhdGljIHN5bV9saW5rUyAqZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKKyAgCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2YgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIGRlc2NyaWJpbmcKKyAgIGFuIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgQ0dFTl9JTlNOICoJaW5zbjsKKyAgY29uc3QgQ0dFTl9JTlNOICoJb3JpZ19pbnNuOworICBDR0VOX0ZJRUxEUwkJZmllbGRzOworI2lmIENHRU5fSU5UX0lOU05fUAorICBDR0VOX0lOU05fSU5UICAgICAgICAgYnVmZmVyIFsxXTsKKyNkZWZpbmUgSU5TTl9WQUxVRShidWYpICgqKGJ1ZikpCisjZWxzZQorICB1bnNpZ25lZCBjaGFyICAgICAgICAgYnVmZmVyIFtDR0VOX01BWF9JTlNOX1NJWkVdOworI2RlZmluZSBJTlNOX1ZBTFVFKGJ1ZikgKGJ1ZikKKyNlbmRpZgorICBjaGFyICoJCWFkZHI7CisgIGZyYWdTICoJCWZyYWc7CisgIGludCAgICAgICAgICAgICAgICAgICBudW1fZml4dXBzOworICBmaXhTICogICAgICAgICAgICAgICAgZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKKyAgaW50ICAgICAgICAgICAgICAgICAgIGluZGljZXMgW01BWF9PUEVSQU5EX0lOU1RBTkNFU107CisgIHN5bV9saW5rUwkJKmRlYnVnX3N5bV9saW5rOworfQorbTMycl9pbnNuOworCisvKiBwcmV2X2luc24uaW5zbiBpcyBub24tbnVsbCBpZiBsYXN0IGluc24gd2FzIGEgMTYgYml0IGluc24gb24gYSAzMiBiaXQKKyAgIGJvdW5kYXJ5IChpLmUuIHdhcyB0aGUgZmlyc3Qgb2YgdHdvIDE2IGJpdCBpbnNucykuICAqLworc3RhdGljIG0zMnJfaW5zbglwcmV2X2luc247CisKKy8qIE5vbi16ZXJvIGlmIHdlJ3ZlIHNlZW4gYSByZWxheGFibGUgaW5zbiBzaW5jZSB0aGUgbGFzdCAzMiBiaXQKKyAgIGFsaWdubWVudCByZXF1ZXN0LiAgKi8KK3N0YXRpYyBpbnQgc2Vlbl9yZWxheGFibGVfcCA9IDA7CisKKy8qIE5vbi16ZXJvIGlmIC1yZWxheCBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugc3VmZmljaWVudCByZWxvY3MgYXJlIG91dHB1dAorICAgZm9yIHRoZSBsaW5rZXIgdG8gZG8gcmVsYXhpbmcuCisgICBXZSBkbyBzaW1wbGUgZm9ybXMgb2YgcmVsYXhpbmcgaW50ZXJuYWxseSwgYnV0IHRoZXkgYXJlIGFsd2F5cyBkb25lLgorICAgVGhpcyBmbGFnIGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uICAqLworc3RhdGljIGludCBtMzJyX3JlbGF4OworCisjaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworLyogSWYgbm9uLU5VTEwsIHBvaW50ZXIgdG8gY3B1IGRlc2NyaXB0aW9uIGZpbGUgdG8gcmVhZC4KKyAgIFRoaXMgYWxsb3dzIHJ1bnRpbWUgYWRkaXRpb25zIHRvIHRoZSBhc3NlbWJsZXIuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBtMzJyX2NwdV9kZXNjOworI2VuZGlmCisKKy8qIE5vbi16ZXJvIGlmIHdhcm4gd2hlbiBhIGhpZ2gvc2hpZ2ggcmVsb2MgaGFzIG5vIG1hdGNoaW5nIGxvdyByZWxvYy4KKyAgIEVhY2ggaGlnaC9zaGlnaCByZWxvYyBtdXN0IGJlIHBhaXJlZCB3aXRoIGl0J3MgbG93IGNvdXNpbiBpbiBvcmRlciB0bworICAgcHJvcGVybHkgY2FsY3VsYXRlIHRoZSBhZGRlbmQgaW4gYSByZWxvY2F0YWJsZSBsaW5rIChzaW5jZSB0aGVyZSBpcyBhCisgICBwb3RlbnRpYWwgY2FycnkgZnJvbSB0aGUgbG93IHRvIHRoZSBoaWdoL3NoaWdoKS4KKyAgIFRoaXMgb3B0aW9uIGlzIG9mZiBieSBkZWZhdWx0IHRob3VnaCBmb3IgdXNlci13cml0dGVuIGFzc2VtYmxlciBjb2RlIGl0CisgICBtaWdodCBtYWtlIHNlbnNlIHRvIG1ha2UgdGhlIGRlZmF1bHQgYmUgb24gKGkuZS4gaGF2ZSBnY2MgcGFzcyBhIGZsYWcKKyAgIHRvIHR1cm4gaXQgb2ZmKS4gIFRoaXMgd2FybmluZyBtdXN0IG5vdCBiZSBvbiBmb3IgR0NDIGNyZWF0ZWQgY29kZSBhcworICAgb3B0aW1pemF0aW9uIG1heSBkZWxldGUgdGhlIGxvdyBidXQgbm90IHRoZSBoaWdoL3NoaWdoIChhdCBsZWFzdCB3ZQorICAgc2hvdWxkbid0IGFzc3VtZSBvciByZXF1aXJlIGl0IHRvKS4gICovCitzdGF0aWMgaW50IHdhcm5fdW5tYXRjaGVkX2hpZ2ggPSAwOworCisKKy8qIHN0dWZmIGZvciAuc2NvbW0gc3ltYm9scy4gICovCitzdGF0aWMgc2VnVCAgICAgc2Jzc19zZWN0aW9uOworc3RhdGljIGFzZWN0aW9uIHNjb21fc2VjdGlvbjsKK3N0YXRpYyBhc3ltYm9sICBzY29tX3N5bWJvbDsKKworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gICAgICAgID0gIjsiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSAgID0gIiMiOworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Citjb25zdCBjaGFyIEVYUF9DSEFSU1tdICAgICAgICAgICAgPSAiZUUiOworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSAgICAgICAgICAgID0gImREIjsKKworLyogUmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBkb25lIGluIHR3bworICAgcGFydHMsIHdpdGggYSBISSByZWxvY2F0aW9uIGFuZCBhIExPIHJlbG9jYXRpb24uICBFYWNoIHJlbG9jYXRpb24KKyAgIGhhcyBvbmx5IDE2IGJpdHMgb2Ygc3BhY2UgdG8gc3RvcmUgYW4gYWRkZW5kLiAgVGhpcyBtZWFucyB0aGF0IGluCisgICBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBoYW5kbGUgY2FycmllcyBjb3JyZWN0bHksIGl0IG11c3QgYmUgYWJsZQorICAgdG8gbG9jYXRlIGJvdGggdGhlIEhJIGFuZCB0aGUgTE8gcmVsb2NhdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAgIHJlbG9jYXRpb25zIG11c3QgYXBwZWFyIGluIG9yZGVyIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLgorCisgICBJbiBvcmRlciB0byBpbXBsZW1lbnQgdGhpcywgd2Uga2VlcCB0cmFjayBvZiBlYWNoIHVubWF0Y2hlZCBISQorICAgcmVsb2NhdGlvbi4gIFdlIHRoZW4gc29ydCB0aGVtIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZQorICAgY29ycmVzcG9uZGluZyBMTyByZWxvY2F0aW9uLiAqLworCitzdHJ1Y3QgbTMycl9oaV9maXh1cAoreworICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIG5leHQ7ICAvKiBOZXh0IEhJIGZpeHVwLiAgKi8KKyAgZml4UyAqICAgICAgICAgICAgICAgICBmaXhwOyAgLyogVGhpcyBmaXh1cC4gICovCisgIHNlZ1QgICAgICAgICAgICAgICAgICAgc2VnOyAgIC8qIFRoZSBzZWN0aW9uIHRoaXMgZml4dXAgaXMgaW4uICAqLworCit9OworCisvKiBUaGUgbGlzdCBvZiB1bm1hdGNoZWQgSEkgcmVsb2NzLiAgKi8KKworc3RhdGljIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogbTMycl9oaV9maXh1cF9saXN0OworCisMCisMCisjZGVmaW5lIE0zMlJfU0hPUlRPUFRTICIiCitjb25zdCBjaGFyICogbWRfc2hvcnRvcHRzID0gTTMyUl9TSE9SVE9QVFM7CisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Cit7CisKKyAgLyogU2lnaC4gIEkgZ3Vlc3MgYWxsIHdhcm5pbmdzIG11c3Qgbm93IGhhdmUgYm90aCB2YXJpYW50cy4gICovCisjZGVmaW5lIE9QVElPTl9XQVJOX1VOTUFUQ0hFRCAoT1BUSU9OX01EX0JBU0UgKyA0KQorICB7Indhcm4tdW5tYXRjaGVkLWhpZ2giLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAorICB7Ild1aCIsIE9QVElPTl9XQVJOX1VOTUFUQ0hFRH0sCisjZGVmaW5lIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRCAoT1BUSU9OX01EX0JBU0UgKyA1KQorICB7Im5vLXdhcm4tdW5tYXRjaGVkLWhpZ2giLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAorICB7IldudWgiLCBPUFRJT05fV0FSTl9VTk1BVENIRUR9LAorCisjaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBPUFRJT05fUkVMQVggIChPUFRJT05fTURfQkFTRSArIDYpCisgIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKKyNkZWZpbmUgT1BUSU9OX0NQVV9ERVNDIChPUFRJT05fTURfQkFTRSArIDcpCisgIHsiY3B1LWRlc2MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NQVV9ERVNDfSwKKyNlbmRpZgorCisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgICAgYzsKKyAgICAgY2hhciAqIGFyZzsKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKworICAgIGNhc2UgT1BUSU9OX1dBUk5fVU5NQVRDSEVEOgorICAgICAgd2Fybl91bm1hdGNoZWRfaGlnaCA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX05PX1dBUk5fVU5NQVRDSEVEOgorICAgICAgd2Fybl91bm1hdGNoZWRfaGlnaCA9IDA7CisgICAgICBicmVhazsKKyAgICAgIAorI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyAgICBjYXNlIE9QVElPTl9SRUxBWDoKKyAgICAgIG0zMnJfcmVsYXggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fQ1BVX0RFU0M6CisgICAgICBtMzJyX2NwdV9kZXNjID0gYXJnOworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgIEZJTEUgKiBzdHJlYW07Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iKSk7CisKKworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgLXdhcm4tdW5tYXRjaGVkLWhpZ2ggICAgd2FybiB3aGVuIGFuIChzKWhpZ2ggcmVsb2MgaGFzIG5vIG1hdGNoaW5nIGxvdyByZWxvY1xuIikpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2ggZG8gbm90IHdhcm4gYWJvdXQgbWlzc2luZyBsb3cgcmVsb2NzXG4iKSk7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorICAtV3VoICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtd2Fybi11bm1hdGNoZWQtaGlnaFxuIikpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIpKTsKKworI2lmIDAKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCisgIC1yZWxheCAgICAgICAgICAgICAgICAgY3JlYXRlIGxpbmtlciByZWxheGFibGUgY29kZVxuIikpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKyAgLWNwdS1kZXNjICAgICAgICAgICAgICBwcm92aWRlIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGVcbiIpKTsKKyNlbmRpZgorfSAKKworc3RhdGljIHZvaWQgZmlsbF9pbnNuIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgbTMycl9zY29tbSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIGRlYnVnX3N5bSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIGV4cGFuZF9kZWJ1Z19zeW1zIFBBUkFNUyAoKHN5bV9saW5rUyAqLCBpbnQpKTsKKworLyogU2V0IGJ5IG1kX2Fzc2VtYmxlIGZvciB1c2UgYnkgbTMycl9maWxsX2luc24uICAqLworc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7CitzdGF0aWMgc2VnVCBwcmV2X3NlZzsKKworLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyAid29yZCIsCWNvbnMsCQk0IH0sCisgIHsgImZpbGxpbnNuIiwgZmlsbF9pbnNuLAkwIH0sCisgIHsgInNjb21tIiwJbTMycl9zY29tbSwJMCB9LAorICB7ICJkZWJ1Z3N5bSIsCWRlYnVnX3N5bSwJMCB9LAorICB7IE5VTEwsIE5VTEwsIDAgfQorfTsKKworLyogRklYTUU6IFNob3VsZCBiZSBtYWNoaW5lIGdlbmVyYXRlZC4gICovCisjZGVmaW5lIE5PUF9JTlNOIDB4NzAwMAorI2RlZmluZSBQQVJfTk9QX0lOU04gMHhmMDAwIC8qIGNhbiBvbmx5IGJlIHVzZWQgaW4gMm5kIHNsb3QgKi8KKworLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLgorICAgTiBpcyB0aGUgcG93ZXIgb2YgMiBhbGlnbm1lbnQuICBMRU4gaXMgdGhlIGxlbmd0aCBvZiBwYXR0ZXJuIEZJTEwuCisgICBNQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCisgICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLworCitpbnQKK20zMnJfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4KQorICAgICBpbnQgICAgICAgICAgbjsKKyAgICAgY29uc3QgY2hhciAqIGZpbGw7CisgICAgIGludCAgICAgICAgICBsZW47CisgICAgIGludCAgICAgICAgICBtYXg7Cit7CisgIC8qIE9ubHkgZG8gdGhpcyBpZiB0aGUgZmlsbCBwYXR0ZXJuIHdhc24ndCBzcGVjaWZpZWQuICAqLworICBpZiAoZmlsbCA9PSBOVUxMCisgICAgICAmJiAobm93X3NlZy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMAorICAgICAgLyogT25seSBkbyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaWYgYWxpZ25pbmcgdG8gYXQgbGVhc3QgYQorCSA0IGJ5dGUgYm91bmRhcnkuICAqLworICAgICAgJiYgbiA+IDEKKyAgICAgLyogT25seSBkbyB0aGlzIHNwZWNpYWwgaGFuZGxpbmcgaWYgd2UncmUgYWxsb3dlZCB0byBlbWl0IGF0CisJIGxlYXN0IHR3byBieXRlcy4gICovCisgICAgICAmJiAobWF4ID09IDAgfHwgbWF4ID4gMSkpCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbm9wX3BhdHRlcm5bXSA9IHsgMHhmMCwgMHgwMCB9OworCisjaWYgMAorICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkIC5ieXRlLiAgKi8KKyAgICAgIC8qIEZJWE1FOiBIb3cgbXVjaCBtZW1vcnkgd2lsbCBjYXVzZSBnYXMgdG8gdXNlIHdoZW4gYXNzZW1ibGluZyBhIGJpZworCSBwcm9ncmFtPyAgUGVyaGFwcyB3ZSBjYW4gYXZvaWQgdGhlIGZyYWdfYWxpZ24gY2FsbD8gICovCisgICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKKyNlbmRpZgorICAgICAgLyogTmV4dCBhbGlnbiB0byBhIDQgYnl0ZSBib3VuZGFyeSAod2Uga25vdyBuID49IDIpIHVzaW5nIGEgcGFyYWxsZWwKKwkgbm9wLiAgKi8KKyAgICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMiwgbm9wX3BhdHRlcm4sIHNpemVvZiBub3BfcGF0dGVybiwgMCk7CisgICAgICAvKiBJZiBkb2luZyBsYXJnZXIgYWxpZ25tZW50cyB1c2UgYSByZXBlYXRpbmcgc2VxdWVuY2Ugb2YgYXBwcm9wcmlhdGUKKwkgbm9wcy4gICovCisgICAgICBpZiAobiA+IDIpCisJeworCSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXVsdGlfbm9wX3BhdHRlcm5bXSA9CisJICB7IDB4NzAsIDB4MDAsIDB4ZjAsIDB4MDAgfTsKKwkgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbXVsdGlfbm9wX3BhdHRlcm4sIHNpemVvZiBtdWx0aV9ub3BfcGF0dGVybiwKKwkJCSAgICAgIG1heCA/IG1heCAtIDIgOiAwKTsKKwl9CisgICAgICAKKyAgICAgIHByZXZfaW5zbi5pbnNuID0gTlVMTDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gd2FzIHRoZSBmaXJzdCBvZiAyIDE2IGJpdCBpbnNucywKKyAgIG91dHB1dCBhIG5vcCB0byBtb3ZlIHRoZSBQQyB0byBhIDMyIGJpdCBib3VuZGFyeS4KKworICAgVGhpcyBpcyBkb25lIHZpYSBhbiBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbiBzaW5jZSBicmFuY2ggcmVsYXhpbmcKKyAgIG1heSBtYWtlIGl0IHVubmVjZXNzYXJ5LgorCisgICBJbnRlcm5hbGx5LCB3ZSBuZWVkIHRvIG91dHB1dCBvbmUgb2YgdGhlc2UgZWFjaCB0aW1lIGEgMzIgYml0IGluc24gaXMKKyAgIHNlZW4gYWZ0ZXIgYW4gaW5zbiB0aGF0IGlzIHJlbGF4YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitmaWxsX2luc24gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgKHZvaWQpIG0zMnJfZG9fYWxpZ24gKDIsIE5VTEwsIDAsIDApOworICBwcmV2X2luc24uaW5zbiA9IE5VTEw7CisgIHNlZW5fcmVsYXhhYmxlX3AgPSAwOworfQorCisvKiBSZWNvcmQgdGhlIHN5bWJvbCBzbyB0aGF0IHdoZW4gd2Ugb3V0cHV0IHRoZSBpbnNuLCB3ZSBjYW4gY3JlYXRlCisgICBhIHN5bWJvbCB0aGF0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQKKyAgIHRvIGVtaXQgdGhlIGxhYmVsIGZvciB0aGUgc3RhcnQgb2YgYSBicmVha3BvaW50IHdpdGhvdXQgY2F1c2luZworICAgdGhlIGFzc2VtYmxlciB0byBlbWl0IGEgTk9QIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYQorICAgMTYgYml0IGluc3RydWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2RlYnVnX3N5bSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICByZWdpc3RlciBjaGFyICpuYW1lOworICByZWdpc3RlciBjaGFyIGRlbGltOworICByZWdpc3RlciBjaGFyICplbmRfbmFtZTsKKyAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKKyAgcmVnaXN0ZXIgc3ltX2xpbmtTICpsaW5rOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGRlbGltID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworIAorICBpZiAoKHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSkpID09IE5VTEwKKyAgICAgICYmIChzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkpID09IE5VTEwpCisgICAgeworICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOworICAgIH0KKworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKKyAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGxpbmsgPSAoc3ltX2xpbmtTICopIHhtYWxsb2MgKHNpemVvZiAoc3ltX2xpbmtTKSk7CisgICAgICBsaW5rLT5zeW1ib2wgPSBzeW1ib2xQOworICAgICAgbGluay0+bmV4dCA9IGRlYnVnX3N5bV9saW5rOworICAgICAgZGVidWdfc3ltX2xpbmsgPSBsaW5rOworICAgICAgc3ltYm9sUC0+bG9jYWwgPSAxOworICAgIH0KKworICAqZW5kX25hbWUgPSBkZWxpbTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogU2Vjb25kIHBhc3MgdG8gZXhwYW5kaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzLCBnbyB0aHJvdWdoIGxpbmtlZAorICAgbGlzdCBvZiBzeW1ib2xzIGFuZCByZWFzc2lnbiB0aGUgYWRkcmVzcy4gICovCisKK3N0YXRpYyB2b2lkCitleHBhbmRfZGVidWdfc3ltcyAoc3ltcywgYWxpZ24pCisgICAgIHN5bV9saW5rUyAqc3ltczsKKyAgICAgaW50IGFsaWduOworeworICBjaGFyICpzYXZlX2lucHV0X2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIHN5bV9saW5rUyAqbmV4dF9zeW1zOworCisgIGlmICghc3ltcykKKyAgICByZXR1cm47CisKKyAgKHZvaWQpIG0zMnJfZG9fYWxpZ24gKGFsaWduLCBOVUxMLCAwLCAwKTsKKyAgZm9yICg7IHN5bXMgIT0gKHN5bV9saW5rUyAqKTA7IHN5bXMgPSBuZXh0X3N5bXMpCisgICAgeworICAgICAgc3ltYm9sUyAqc3ltYm9sUCA9IHN5bXMtPnN5bWJvbDsKKyAgICAgIG5leHRfc3ltcyA9IHN5bXMtPm5leHQ7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAiLlxuIjsKKyAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOworICAgICAgZnJlZSAoKGNoYXIgKilzeW1zKTsKKyAgICB9CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lOworfQorCisvKiBDb3ZlciBmdW5jdGlvbiB0byBmaWxsX2luc24gY2FsbGVkIGFmdGVyIGEgbGFiZWwgYW5kIGF0IGVuZCBvZiBhc3NlbWJseS4KKyAgIFRoZSByZXN1bHQgaXMgYWx3YXlzIDE6IHdlJ3JlIGNhbGxlZCBpbiBhIGNvbmRpdGlvbmFsIHRvIHNlZSBpZiB0aGUKKyAgIGN1cnJlbnQgbGluZSBpcyBhIGxhYmVsLiAgKi8KKworaW50CittMzJyX2ZpbGxfaW5zbiAoZG9uZSkKKyAgICAgaW50IGRvbmU7Cit7CisgIGlmIChwcmV2X3NlZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNlZ1QgICAgc2VnICAgID0gbm93X3NlZzsKKyAgICAgIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKKworICAgICAgc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKKyAgICAgIAorICAgICAgZmlsbF9pbnNuICgwKTsKKworICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOworICAgIH0KKworICBpZiAoZG9uZSAmJiBkZWJ1Z19zeW1fbGluaykKKyAgICB7CisgICAgICBleHBhbmRfZGVidWdfc3ltcyAoZGVidWdfc3ltX2xpbmssIDEpOworICAgICAgZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisMCit2b2lkCittZF9iZWdpbiAoKQoreworICBmbGFnd29yZCBhcHBsaWNhYmxlOworICBzZWdUICAgICBzZWc7CisgIHN1YnNlZ1QgIHN1YnNlZzsKKworICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KKyAgCisgIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCisgIGdhc19jZ2VuX2NwdV9kZXNjID0gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAorCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAorCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKKwkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7CisgIG0zMnJfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOworCisgIC8qIFRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGlzIHVzZWQgZHVyaW5nIG9wdGltaXphdGlvbiB0byBkZXRlcm1pbmUKKyAgICAgd2hpY2ggaW5zbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSXQgaXMgYWxzbyB1c2VkIHRvIGdpdmUKKyAgICAgd2FybmluZ3MgcmVnYXJkaW5nIG9wZXJhbmQgaW50ZXJmZXJlbmNlIGluIHBhcmFsbGVsIGluc25zLiAgKi8KKyAgbTMycl9jZ2VuX2luaXRfb3BpbnN0X3RhYmxlIChnYXNfY2dlbl9jcHVfZGVzYyk7CisKKyAgLyogVGhpcyBpcyBhIGNhbGxiYWNrIGZyb20gY2dlbiB0byBnYXMgdG8gcGFyc2Ugb3BlcmFuZHMuICAqLworICBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuIChnYXNfY2dlbl9jcHVfZGVzYywgZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk7CisKKyNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisgIC8qIElmIGEgcnVudGltZSBjcHUgZGVzY3JpcHRpb24gZmlsZSB3YXMgcHJvdmlkZWQsIHBhcnNlIGl0LiAgKi8KKyAgaWYgKG0zMnJfY3B1X2Rlc2MgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICogZXJybXNnOworCisgICAgICBlcnJtc2cgPSBjZ2VuX3JlYWRfY3B1X2ZpbGUgKGdhc19jZ2VuX2NwdV9kZXNjLCBtMzJyX2NwdV9kZXNjKTsKKyAgICAgIGlmIChlcnJtc2cgIT0gTlVMTCkKKwlhc19iYWQgKCIlczogJXMiLCBtMzJyX2NwdV9kZXNjLCBlcnJtc2cpOworICAgIH0KKyNlbmRpZgorCisgIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3Vic2VnIHNvIHdlIGNhbiByZXN0b3JlIGl0IFtpdCdzIHRoZSBkZWZhdWx0IG9uZSBhbmQKKyAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgaW5pdGlhbCBzZWN0aW9uIHRvIGJlIC5zYnNzXS4gICovCisgIHNlZyAgICA9IG5vd19zZWc7CisgIHN1YnNlZyA9IG5vd19zdWJzZWc7CisKKyAgLyogVGhlIHNic3Mgc2VjdGlvbiBpcyBmb3IgbG9jYWwgLnNjb21tIHN5bWJvbHMuICAqLworICBzYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnNic3MiLCAwKTsKKyAgCisgIC8qIFRoaXMgaXMgY29waWVkIGZyb20gcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzLiAgKi8KKyAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7CisgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOworICAKKyNpZiAwIC8qIFdoYXQgZG9lcyB0aGlzIGRvPyBbc2VlIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzc10gICovCisgIHNlZ19pbmZvIChic3Nfc2VjdGlvbiktPmJzcyA9IDE7CisjZW5kaWYKKworICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7CisKKyAgLyogV2UgbXVzdCBjb25zdHJ1Y3QgYSBmYWtlIHNlY3Rpb24gc2ltaWxhciB0byBiZmRfY29tX3NlY3Rpb24KKyAgICAgYnV0IHdpdGggdGhlIG5hbWUgLnNjb21tb24uICAqLworICBzY29tX3NlY3Rpb24gICAgICAgICAgICAgICAgPSBiZmRfY29tX3NlY3Rpb247CisgIHNjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7CisgIHNjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgc2NvbV9zZWN0aW9uOworICBzY29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHNjb21fc3ltYm9sOworICBzY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHNjb21fc2VjdGlvbi5zeW1ib2w7CisgIHNjb21fc3ltYm9sICAgICAgICAgICAgICAgICA9ICogYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKKyAgc2NvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi5zY29tbW9uIjsKKyAgc2NvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiBzY29tX3NlY3Rpb247CisKK30KKworCisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIG0zMnJfaW5zbiBpbnNuOworICBjaGFyICogICAgZXJybXNnOworICBjaGFyICogICAgc3RyMiA9IE5VTEw7CisKKyAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLworICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOworCisgIAorICBpbnNuLmRlYnVnX3N5bV9saW5rID0gZGVidWdfc3ltX2xpbms7CisgIGRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7CisKKyAgaW5zbi5pbnNuID0gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24KKyAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIHN0ciwgJiBpbnNuLmZpZWxkcywgaW5zbi5idWZmZXIsICYgZXJybXNnKTsKKyAgCisgIGlmICghaW5zbi5pbnNuKQorICAgIHsKKyAgICAgIGFzX2JhZCAoZXJybXNnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgCisgIGlmIChDR0VOX0lOU05fQklUU0laRSAoaW5zbi5pbnNuKSA9PSAzMikKKyAgICB7CisgICAgICAvKiAzMiBiaXQgaW5zbnMgbXVzdCBsaXZlIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KKyAgICAgIGlmIChwcmV2X2luc24uaW5zbiB8fCBzZWVuX3JlbGF4YWJsZV9wKQorCXsKKwkgIC8qID8/PyBJZiBjYWxsaW5nIGZpbGxfaW5zbiB0b28gbWFueSB0aW1lcyB0dXJucyB1cyBpbnRvIGEgbWVtb3J5CisJICAgICBwaWcsIGNhbiB3ZSBjYWxsIGEgZm4gdG8gYXNzZW1ibGUgYSBub3AgaW5zdGVhZCBvZgorCSAgICAgIXNlZW5fcmVsYXhhYmxlX3A/ICAqLworCSAgZmlsbF9pbnNuICgwKTsKKwl9CisKKyAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChpbnNuLmRlYnVnX3N5bV9saW5rLCAyKTsKKworICAgICAgLyogRG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgd2UgcGFzcyBmb3IgUkVMQVhfUCBoZXJlLiAgKi8KKyAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAorCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLCAxLCBOVUxMKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgb25fMzJiaXRfYm91bmRhcnlfcDsKKworICAgICAgaWYgKENHRU5fSU5TTl9CSVRTSVpFIChpbnNuLmluc24pICE9IDE2KQorCWFib3J0KCk7CisKKyAgICAgIGluc24ub3JpZ19pbnNuID0gaW5zbi5pbnNuOworCisgICAgICAvKiBDb21wdXRlIHdoZXRoZXIgd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkgb3Igbm90LgorCSBwcmV2X2luc24uaW5zbiBpcyBOVUxMIHdoZW4gd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkuICAqLworICAgICAgb25fMzJiaXRfYm91bmRhcnlfcCA9IHByZXZfaW5zbi5pbnNuID09IE5VTEw7CisKKworICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGluc24uZGVidWdfc3ltX2xpbmssIDEpOworCisgICAgICB7CisJaW50IGk7CisJZmluaXNoZWRfaW5zblMgZmk7CisKKwkvKiBFbnN1cmUgZWFjaCBwYWlyIG9mIDE2IGJpdCBpbnNucyBpcyBpbiB0aGUgc2FtZSBmcmFnLiAgKi8KKwlmcmFnX2dyb3cgKDQpOworCisJZ2FzX2NnZW5fZmluaXNoX2luc24gKGluc24ub3JpZ19pbnNuLCBpbnNuLmJ1ZmZlciwKKwkJCSAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLAorCQkJICAgICAgMSAvKnJlbGF4X3AqLywgJmZpKTsKKwlpbnNuLmFkZHIgPSBmaS5hZGRyOworCWluc24uZnJhZyA9IGZpLmZyYWc7CisJaW5zbi5udW1fZml4dXBzID0gZmkubnVtX2ZpeHVwczsKKwlmb3IgKGkgPSAwOyBpIDwgZmkubnVtX2ZpeHVwczsgKytpKQorCSAgaW5zbi5maXh1cHNbaV0gPSBmaS5maXh1cHNbaV07CisgICAgICB9CisKKworICAgICAgLyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3ZlIHNlZW4gYSBwYWlyIG9mIDE2IGJpdCBpbnNucy4KKwkgcHJldl9pbnNuLmluc24gaXMgTlVMTCB3aGVuIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5LiAgKi8KKyAgICAgIGlmIChvbl8zMmJpdF9ib3VuZGFyeV9wKQorCXByZXZfaW5zbiA9IGluc247CisgICAgICBlbHNlCisJcHJldl9pbnNuLmluc24gPSBOVUxMOworICAgICAgCisgICAgICAvKiBJZiB0aGUgaW5zbiBuZWVkcyB0aGUgZm9sbG93aW5nIG9uZSB0byBiZSBvbiBhIDMyIGJpdCBib3VuZGFyeQorCSAoZS5nLiBzdWJyb3V0aW5lIGNhbGxzKSwgZmlsbCB0aGlzIGluc24ncyBzbG90LiAgKi8KKyAgICAgIGlmIChvbl8zMmJpdF9ib3VuZGFyeV9wCisJICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5vcmlnX2luc24sIENHRU5fSU5TTl9GSUxMX1NMT1QpICE9IDApCisJZmlsbF9pbnNuICgwKTsKKworICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbGF4YWJsZSBpbnNuIChjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIGxhcmdlciB2ZXJzaW9uKQorCSBtYXJrIHRoZSBmYWN0IHNvIHRoYXQgd2UgY2FuIGVtaXQgYW4gYWxpZ25tZW50IGRpcmVjdGl2ZSBmb3IgYQorCSBmb2xsb3dpbmcgMzIgYml0IGluc24gaWYgd2Ugc2VlIG9uZS4gICAqLworICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLm9yaWdfaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkgIT0gMCkKKwlzZWVuX3JlbGF4YWJsZV9wID0gMTsKKyAgICB9CisKKyAgLyogU2V0IHRoZXNlIHNvIG0zMnJfZmlsbF9pbnNuIGNhbiB1c2UgdGhlbS4gICovCisgIHByZXZfc2VnICAgID0gbm93X3NlZzsKKyAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOworfQorCisvKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCisgICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCisKK3ZvaWQgCittZF9vcGVyYW5kIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKK3sKKyAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CisgICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7CisgICAgfQorfQorCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1QgICBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKKyAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Cit9CisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgY2hhciAqIG5hbWU7Cit7CisgIHJldHVybiAwOworfQorDAorLyogLnNjb21tIHBzZXVkby1vcCBoYW5kbGVyLgorCisgICBUaGlzIGlzIGEgbmV3IHBzZXVkby1vcCB0byBoYW5kbGUgcHV0dGluZyBvYmplY3RzIGluIC5zY29tbW9uLgorICAgQnkgZG9pbmcgdGhpcyB0aGUgbGlua2VyIHdvbid0IG5lZWQgdG8gZG8gYW55IHdvcmsgYW5kIG1vcmUgaW1wb3J0YW50bHkKKyAgIGl0IHJlbW92ZXMgdGhlIGltcGxpY2l0IC1HIGFyZyBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IGxpbmsgdGhlIG9iamVjdCBmaWxlLgorKi8KKworc3RhdGljIHZvaWQKK20zMnJfc2NvbW0gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqICAgIG5hbWU7CisgIHJlZ2lzdGVyIGNoYXIgICAgICBjOworICByZWdpc3RlciBjaGFyICogICAgcDsKKyAgb2Zmc2V0VCAgICAgICAgICAgIHNpemU7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKiBzeW1ib2xQOworICBvZmZzZXRUICAgICAgICAgICAgYWxpZ247CisgIGludCAgICAgICAgICAgICAgICBhbGlnbjI7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLworICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqIHAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaW5wdXRfbGluZV9wb2ludGVyICsrOwkJLyogc2tpcCAnLCcgKi8KKyAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgYXNfd2FybiAoXygiLlNDT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHNpemUpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5zY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KKyAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICBhbGlnbiA9IDg7CisgIGVsc2UKKyAgICB7CisgICAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgICAgaWYgKGFsaWduIDw9IDApCisJeworCSAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKKwkgIGFsaWduID0gODsKKwl9CisgICAgfQorICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQuICAqLworICBpZiAoYWxpZ24pCisgICAgeworICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKysgYWxpZ24yKQorCWNvbnRpbnVlOworICAgICAgaWYgKGFsaWduICE9IDEpCisJeworCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBhbGlnbjIgPSAwOworCisgICogcCA9IDA7CisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKiBwID0gYzsKKworICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKKwkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSBzaXplKQorICAgIHsKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBhc19iYWQgKF8oIkxlbmd0aCBvZiAuc2NvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCisJICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCksCisJICAgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKKwkgICAgICAobG9uZykgc2l6ZSk7CisKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChzeW1ib2xQLT5sb2NhbCkKKyAgICB7CisgICAgICBzZWdUICAgb2xkX3NlYyAgICA9IG5vd19zZWc7CisgICAgICBpbnQgICAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7CisgICAgICBjaGFyICogcGZyYWc7CisKKyAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNic3Nfc2VjdGlvbiwgYWxpZ24yKTsKKyAgICAgIHN1YnNlZ19zZXQgKHNic3Nfc2VjdGlvbiwgMCk7CisgICAgICAKKyAgICAgIGlmIChhbGlnbjIpCisJZnJhZ19hbGlnbiAoYWxpZ24yLCAwLCAwKTsKKyAgICAgIAorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHNic3Nfc2VjdGlvbikKKwlzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOworICAgICAgCisgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgICAgICAKKyAgICAgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwgc2l6ZSwKKwkJCShjaGFyICopIDApOworICAgICAgKiBwZnJhZyA9IDA7CisgICAgICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKKyAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNic3Nfc2VjdGlvbik7CisgICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKKyAgICAgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKKyAgICAgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCBhbGlnbjIpOworICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOworICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgJiBzY29tX3NlY3Rpb24pOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorDAorLyogSW50ZXJmYWNlIHRvIHJlbGF4X3NlZ21lbnQuICAqLworCisvKiBGSVhNRTogQnVpbGQgdGFibGUgYnkgaGFuZCwgZ2V0IGl0IHdvcmtpbmcsIHRoZW4gbWFjaGluZSBnZW5lcmF0ZS4gICovCisKK2NvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQoreworLyogVGhlIGZpZWxkcyBhcmU6CisgICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCisgICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCisgICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZworICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLiAgKi8KKworICAvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB1bnVzZWQgYmVjYXVzZSBhbiBgcmx4X21vcmUnIHZhbHVlIG9mIHplcm8gZW5kcworICAgICBlYWNoIGxpc3QuICAqLworICB7MSwgMSwgMCwgMH0sCisKKyAgLyogVGhlIGRpc3BsYWNlbWVudCB1c2VkIGJ5IEdBUyBpcyBmcm9tIHRoZSBlbmQgb2YgdGhlIDIgYnl0ZSBpbnNuLAorICAgICBzbyB3ZSBzdWJ0cmFjdCAyIGZyb20gdGhlIGZvbGxvd2luZy4gICovCisgIC8qIDE2IGJpdCBpbnNuLCA4IGJpdCBkaXNwIC0+IDEwIGJpdCByYW5nZS4KKyAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSBhIGJyYW5jaCBpbiB0aGUgcmlnaHQgc2xvdCBhdCB0aGUgYm9yZGVyOgorICAgICB0aGUgIiYgLTQiIGlzbid0IHRha2VuIGludG8gYWNjb3VudC4gIEl0J3Mgbm90IGltcG9ydGFudCBlbm91Z2ggdG8KKyAgICAgY29tcGxpY2F0ZSB0aGluZ3Mgb3ZlciBpdCwgc28gd2Ugc3VidHJhY3QgYW4gZXh0cmEgMiAob3IgKyAyIGluIC12ZQorICAgICBjYXNlKS4gICovCisgIHs1MTEgLSAyIC0gMiwgLTUxMiAtIDIgKyAyLCAwLCAyIH0sCisgIC8qIDMyIGJpdCBpbnNuLCAyNCBiaXQgZGlzcCAtPiAyNiBiaXQgcmFuZ2UuICAqLworICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCAyLCAwIH0sCisgIC8qIFNhbWUgdGhpbmcsIGJ1dCB3aXRoIGxlYWRpbmcgbm9wIGZvciBhbGlnbm1lbnQuICAqLworICB7MHgyMDAwMDAwIC0gMSAtIDIsIC0weDIwMDAwMDAgLSAyLCA0LCAwIH0KK307CisKK2xvbmcKK20zMnJfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCisgICAgIGZyYWdTICogZnJhZ1A7CisgICAgIGxvbmcgICAgc3RyZXRjaDsKK3sKKyAgLyogQWRkcmVzcyBvZiBicmFuY2ggaW5zbi4gICovCisgIGxvbmcgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7CisgIGxvbmcgZ3Jvd3RoID0gMDsKKworICAvKiBLZWVwIDMyIGJpdCBpbnNucyBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KKyAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCisgICAgeworICAgICAgaWYgKChhZGRyZXNzICYgMykgIT0gMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7CisJICBncm93dGggPSAyOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCisgICAgeworICAgICAgaWYgKChhZGRyZXNzICYgMykgPT0gMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7CisJICBncm93dGggPSAtMjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ3Jvd3RoID0gcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpOworCisgICAgICAvKiBMb25nIGp1bXAgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5PyAgKi8KKyAgICAgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyICYmIChhZGRyZXNzICYgMykgIT0gMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IDM7CisJICBncm93dGggKz0gMjsKKwl9CisgICAgfQorCisgIHJldHVybiBncm93dGg7Cit9CisKKy8qIFJldHVybiBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBsZW5ndGggYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8KKyAgIGhvbGQgYSBicmFuY2ggdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uLgorICAgQWxzbyB1cGRhdGVzIGZyX3R5cGUvZnJfc3VidHlwZSBhcyBuZWNlc3NhcnkuCisKKyAgIENhbGxlZCBqdXN0IGJlZm9yZSBkb2luZyByZWxheGF0aW9uLgorICAgQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQuCisgICBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCisgICBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgorICAgQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQorICAgMCB2YWx1ZS4gICovCisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQorICAgICBmcmFnUyAqIGZyYWdQOworICAgICBzZWdUICAgIHNlZ21lbnQ7Cit7CisgIGludCAgICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKKworICAvKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIHRvIGhhbmRsZSBoZXJlIGFyZSBzeW1ib2xzIG91dHNpZGUgb2YgdGhlCisgICAgIGN1cnJlbnQgc2VnbWVudC4gIFRoZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGluCisgICAgIHdoaWNoIGNhc2UgbGlua2VyIHNjcmlwdHMgbWF5IHBsYWNlIHRoZW0gYW55d2hlcmUuCisgICAgIEhvd2V2ZXIsIHdlIGNhbid0IGZpbmlzaCB0aGUgZnJhZ21lbnQgaGVyZSBhbmQgZW1pdCB0aGUgcmVsb2MgYXMgaW5zbgorICAgICBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG1heSBtb3ZlIHRoZSBpbnNuIGFib3V0LiAgKi8KKworICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VnbWVudCkKKyAgICB7CisgICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQuCisJIENoYW5nZSB0aGUgcmVsYXhhdGlvbiBzdWJ0eXBlIHRvIHRoZSBtYXggYWxsb3dhYmxlIGFuZCBsZWF2ZQorCSBhbGwgZnVydGhlciBoYW5kbGluZyB0byBtZF9jb252ZXJ0X2ZyYWcuICAqLworICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOworCisjaWYgMCAvKiBDYW4ndCB1c2UgdGhpcywgYnV0IGxlYXZlIGluIGZvciBpbGx1c3RyYXRpb24uICAqLyAgICAgCisgICAgICAvKiBDaGFuZ2UgMTYgYml0IGluc24gdG8gMzIgYml0IGluc24uICAqLworICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSB8PSAweDgwOworCisgICAgICAvKiBJbmNyZWFzZSBrbm93biAoZml4ZWQpIHNpemUgb2YgZnJhZ21lbnQuICAqLworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOworCisgICAgICAvKiBDcmVhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gICovCisgICAgICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCwgNCwKKwkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSAvKiBwY3JlbCAqLywKKwkgICAgICAgLyogRklYTUU6IENhbid0IHVzZSBhIHJlYWwgQkZEIHJlbG9jIGhlcmUuCisJCSAgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MyBjYW4ndCBoYW5kbGUgaXQuICAqLworCSAgICAgICBCRkRfUkVMT0NfTTMyUl8yNl9QQ1JFTCk7CisKKyAgICAgIC8qIE1hcmsgdGhpcyBmcmFnbWVudCBhcyBmaW5pc2hlZC4gICovCisgICAgICBmcmFnX3dhbmUgKGZyYWdQKTsKKyNlbHNlCisgICAgICB7CisJY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJLyogVXBkYXRlIHRoZSByZWNvcmRlZCBpbnNuLgorCSAgIEZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgdG8gbG9vayB2ZXJ5IGZhci4KKwkgICBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gcmVjb3JkIGluIHRoZSBpbnN0cnVjdGlvbiB0aGUgbmV4dCBoaWdoZXIKKwkgICByZWxheGFibGUgaW5zbiB0byB1c2UuICAqLworCWZvciAoaSA9IDAsIGluc24gPSBmcmFnUC0+ZnJfY2dlbi5pbnNuOyBpIDwgNDsgaSsrLCBpbnNuKyspCisJICB7CisJICAgIGlmICgoc3RyY21wIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pLAorCQkJIENHRU5fSU5TTl9NTkVNT05JQyAoZnJhZ1AtPmZyX2NnZW4uaW5zbikpCisJCSA9PSAwKQorCQkmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSkKKwkgICAgICBicmVhazsKKwkgIH0KKwlpZiAoaSA9PSA0KQorCSAgYWJvcnQgKCk7CisKKwlmcmFnUC0+ZnJfY2dlbi5pbnNuID0gaW5zbjsKKwlyZXR1cm4gMjsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Cit9IAorCisvKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCisgICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplLgorCisgICBDYWxsZWQgYWZ0ZXIgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZC4KKyAgIGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgorICAgZnJhZ1AtPmZyX3N1YnR5cGUgaXMgdGhlIHN1YnR5cGUgb2Ygd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLiAgKi8KKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICBiZmQgKiAgIGFiZmQ7CisgIHNlZ1QgICAgc2VjOworICBmcmFnUyAqIGZyYWdQOworeworICBjaGFyICogb3Bjb2RlOworICBjaGFyICogZGlzcGxhY2VtZW50OworICBpbnQgICAgdGFyZ2V0X2FkZHJlc3M7CisgIGludCAgICBvcGNvZGVfYWRkcmVzczsKKyAgaW50ICAgIGV4dGVuc2lvbjsKKyAgaW50ICAgIGFkZGVuZDsKKworICBvcGNvZGUgPSBmcmFnUC0+ZnJfb3Bjb2RlOworCisgIC8qIEFkZHJlc3Mgb3Bjb2RlIHJlc2lkZXMgYXQgaW4gZmlsZSBzcGFjZS4gICovCisgIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gMjsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIDEgOgorICAgICAgZXh0ZW5zaW9uID0gMDsKKyAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyIDoKKyAgICAgIG9wY29kZVswXSB8PSAweDgwOworICAgICAgZXh0ZW5zaW9uID0gMjsKKyAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzIDoKKyAgICAgIG9wY29kZVsyXSA9IG9wY29kZVswXSB8IDB4ODA7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG9wY29kZSwgUEFSX05PUF9JTlNOLCAyKTsKKyAgICAgIG9wY29kZV9hZGRyZXNzICs9IDI7CisgICAgICBleHRlbnNpb24gPSA0OworICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbM107CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQorICAgIHsKKyAgICAgIC8qIHN5bWJvbCBtdXN0IGJlIHJlc29sdmVkIGJ5IGxpbmtlciAqLworICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgJiAzKQorCWFzX3dhcm4gKF8oIkFkZGVuZCB0byB1bnJlc29sdmVkIHN5bWJvbCBub3Qgb24gd29yZCBib3VuZGFyeS4iKSk7CisgICAgICBhZGRlbmQgPSBmcmFnUC0+ZnJfb2Zmc2V0ID4+IDI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQWRkcmVzcyB3ZSB3YW50IHRvIHJlYWNoIGluIGZpbGUgc3BhY2UuICAqLworICAgICAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OworICAgICAgdGFyZ2V0X2FkZHJlc3MgKz0gZnJhZ1AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKKyAgICAgIGFkZGVuZCA9ICh0YXJnZXRfYWRkcmVzcyAtIChvcGNvZGVfYWRkcmVzcyAmIC00KSkgPj4gMjsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3Igc3ltYm9scyB0aGF0IG11c3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KKyAgICAgT3RoZXJ3aXNlIG91dHB1dCB0aGUgY29tcGxldGVkIGluc24uICAqLworCisgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCisgICAgeworICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfc3VidHlwZSAhPSAxKTsKKyAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2NnZW4uaW5zbiAhPSAwKTsKKyAgICAgIGdhc19jZ2VuX3JlY29yZF9maXh1cCAoZnJhZ1AsCisJCQkgICAgIC8qIE9mZnNldCBvZiBicmFuY2ggaW5zbiBpbiBmcmFnLiAgKi8KKwkJCSAgICAgZnJhZ1AtPmZyX2ZpeCArIGV4dGVuc2lvbiAtIDQsCisJCQkgICAgIGZyYWdQLT5mcl9jZ2VuLmluc24sCisJCQkgICAgIDQgLypsZW5ndGgqLywKKwkJCSAgICAgLyogRklYTUU6IHF1aWNrIGhhY2sgKi8KKyNpZiAwCisJCQkgICAgIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywKKwkJCQkJCQkgZnJhZ1AtPmZyX2NnZW4ub3BpbmRleCksCisjZWxzZQorCQkJICAgICBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsCisJCQkJCQkJIE0zMlJfT1BFUkFORF9ESVNQMjQpLAorI2VuZGlmCisJCQkgICAgIGZyYWdQLT5mcl9jZ2VuLm9waW5mbywKKwkJCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCk7CisgICAgfQorCisjZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShuKSAoKG4pID09IDEgPyAxIDogMykKKworICBtZF9udW1iZXJfdG9fY2hhcnMgKGRpc3BsYWNlbWVudCwgKHZhbHVlVCkgYWRkZW5kLAorCQkgICAgICBTSVpFX0ZST01fUkVMQVhfU1RBVEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSk7CisKKyAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Cit9CisMCisvKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLworCisvKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCisgICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KKworbG9uZworbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWMpCisgICAgIGZpeFMgKiBmaXhQOworICAgICBzZWdUICAgc2VjOworeworICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAorICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKKwkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWMpKQorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIChvciBpcyBkZWZpbmVkIGJ1dCBub3QgaW4gdGhpcyBzZWN0aW9uKS4KKwkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUpICYgLTRMOworfQorCisvKiBSZXR1cm4gdGhlIGJmZCByZWxvYyB0eXBlIGZvciBPUEVSQU5EIG9mIElOU04gYXQgZml4dXAgRklYUC4KKyAgIFJldHVybnMgQkZEX1JFTE9DX05PTkUgaWYgbm8gcmVsb2MgdHlwZSBjYW4gYmUgZm91bmQuCisgICAqRklYUCBtYXkgYmUgbW9kaWZpZWQgaWYgZGVzaXJlZC4gICovCisKK2JmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQorbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApCisgICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247CisgICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7CisgICAgIGZpeFMgKiAgICAgICAgICAgICAgIGZpeFA7Cit7CisgIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOiByZXR1cm4gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6IHJldHVybiBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTDsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOiByZXR1cm4gQkZEX1JFTE9DX00zMlJfMjZfUENSRUw7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDogcmV0dXJuIEJGRF9SRUxPQ19NMzJSXzI0OworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgorICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6CisgICAgICAvKiBJZiBsb3cvaGlnaC9zaGlnaC9zZGEgd2FzIHVzZWQsIGl0IGlzIHJlY29yZGVkIGluIGBvcGluZm8nLiAgKi8KKyAgICAgIGlmIChmaXhQLT5meF9jZ2VuLm9waW5mbyAhPSAwKQorCXJldHVybiBmaXhQLT5meF9jZ2VuLm9waW5mbzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOiAvKiBhdm9pZCAtV2FsbCB3YXJuaW5nICovCisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKK30KKworLyogUmVjb3JkIGEgSEkxNiByZWxvYyBmb3IgbGF0ZXIgbWF0Y2hpbmcgd2l0aCBpdHMgTE8xNiBjb3VzaW4uICAqLworCitzdGF0aWMgdm9pZAorbTMycl9yZWNvcmRfaGkxNiAocmVsb2NfdHlwZSwgZml4UCwgc2VnKQorICAgICBpbnQgICAgcmVsb2NfdHlwZTsKKyAgICAgZml4UyAqIGZpeFA7CisgICAgIHNlZ1QgICBzZWc7Cit7CisgIHN0cnVjdCBtMzJyX2hpX2ZpeHVwICogaGlfZml4dXA7CisKKyAgYXNzZXJ0IChyZWxvY190eXBlID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCisJICB8fCByZWxvY190eXBlID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKTsKKworICBoaV9maXh1cCA9ICgoc3RydWN0IG0zMnJfaGlfZml4dXAgKikKKwkgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtMzJyX2hpX2ZpeHVwKSkpOworICBoaV9maXh1cC0+Zml4cCA9IGZpeFA7CisgIGhpX2ZpeHVwLT5zZWcgID0gbm93X3NlZzsKKyAgaGlfZml4dXAtPm5leHQgPSBtMzJyX2hpX2ZpeHVwX2xpc3Q7CisgIAorICBtMzJyX2hpX2ZpeHVwX2xpc3QgPSBoaV9maXh1cDsKK30KKworLyogQ2FsbGVkIHdoaWxlIHBhcnNpbmcgYW4gaW5zdHJ1Y3Rpb24gdG8gY3JlYXRlIGEgZml4dXAuCisgICBXZSBuZWVkIHRvIGNoZWNrIGZvciBISTE2IHJlbG9jcyBhbmQgcXVldWUgdGhlbSB1cCBmb3IgbGF0ZXIgc29ydGluZy4gICovCisKK2ZpeFMgKgorbTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgZXhwKQorICAgICBmcmFnUyAqICAgICAgICAgICAgICBmcmFnOworICAgICBpbnQgICAgICAgICAgICAgICAgICB3aGVyZTsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICogICAgaW5zbjsKKyAgICAgaW50ICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgICBjb25zdCBDR0VOX09QRVJBTkQgKiBvcGVyYW5kOworICAgICBpbnQgICAgICAgICAgICAgICAgICBvcGluZm87CisgICAgIGV4cHJlc3Npb25TICogICAgICAgIGV4cDsKK3sKKyAgZml4UyAqIGZpeFAgPSBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnLCB3aGVyZSwgaW5zbiwgbGVuZ3RoLAorCQkJCQkgICBvcGVyYW5kLCBvcGluZm8sIGV4cCk7CisKKyAgc3dpdGNoIChvcGVyYW5kLT50eXBlKQorICAgIHsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKKyAgICAgIC8qIElmIGxvdy9oaWdoL3NoaWdoL3NkYSB3YXMgdXNlZCwgaXQgaXMgcmVjb3JkZWQgaW4gYG9waW5mbycuICAqLworICAgICAgaWYgKGZpeFAtPmZ4X2NnZW4ub3BpbmZvID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCisJICB8fCBmaXhQLT5meF9jZ2VuLm9waW5mbyA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTykKKwltMzJyX3JlY29yZF9oaTE2IChmaXhQLT5meF9jZ2VuLm9waW5mbywgZml4UCwgbm93X3NlZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBmaXhQOworfQorCisvKiBSZXR1cm4gQkZEIHJlbG9jIHR5cGUgZnJvbSBvcGluZm8gZmllbGQgaW4gYSBmaXhTLgorICAgSXQncyB0cmlja3kgdXNpbmcgZnhfcl90eXBlIGluIG0zMnJfZnJvYl9maWxlIGJlY2F1c2UgdGhlIHZhbHVlcworICAgYXJlIEJGRF9SRUxPQ19VTlVTRUQgKyBvcGVyYW5kIG51bWJlci4gICovCisjZGVmaW5lIEZYX09QSU5GT19SX1RZUEUoZikgKChmKS0+ZnhfY2dlbi5vcGluZm8pCisKKy8qIFNvcnQgYW55IHVubWF0Y2hlZCBISTE2IHJlbG9jcyBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZQorICAgdGhlIGNvcnJlc3BvbmRpbmcgTE8xNiByZWxvYy4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBtZF9hcHBseV9maXggYW5kCisgICB0Y19nZW5fcmVsb2MuICAqLworCit2b2lkCittMzJyX2Zyb2JfZmlsZSAoKQoreworICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIGw7CisKKyAgZm9yIChsID0gbTMycl9oaV9maXh1cF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorICAgIHsKKyAgICAgIHNlZ21lbnRfaW5mb190eXBlICogc2VnaW5mbzsKKyAgICAgIGludCAgICAgICAgICAgICAgICAgcGFzczsKKworICAgICAgYXNzZXJ0IChGWF9PUElORk9fUl9UWVBFIChsLT5maXhwKSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTworCSAgICAgIHx8IEZYX09QSU5GT19SX1RZUEUgKGwtPmZpeHApID09IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKTsKKworICAgICAgLyogQ2hlY2sgcXVpY2tseSB3aGV0aGVyIHRoZSBuZXh0IGZpeHVwIGhhcHBlbnMgdG8gYmUgYSBtYXRjaGluZyBsb3cuICAqLworICAgICAgaWYgKGwtPmZpeHAtPmZ4X25leHQgIT0gTlVMTAorCSAgJiYgRlhfT1BJTkZPX1JfVFlQRSAobC0+Zml4cC0+ZnhfbmV4dCkgPT0gQkZEX1JFTE9DX00zMlJfTE8xNgorCSAgJiYgbC0+Zml4cC0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+ZnhfYWRkc3kKKwkgICYmIGwtPmZpeHAtPmZ4X29mZnNldCA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9vZmZzZXQpCisJY29udGludWU7CisKKyAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGZvciB0aGlzIHNlZ21lbnQgZm9yIGEgbWF0Y2hpbmcgYGxvdycuCisgICAgICAgICBXaGVuIHdlIGZpbmQgb25lLCBtb3ZlIHRoZSBoaWdoL3NoaWdoIGp1c3QgaW4gZnJvbnQgb2YgaXQuICBXZSBkbworICAgICAgICAgdGhpcyBpbiB0d28gcGFzc2VzLiAgSW4gdGhlIGZpcnN0IHBhc3MsIHdlIHRyeSB0byBmaW5kIGEKKyAgICAgICAgIHVuaXF1ZSBgbG93Jy4gIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgcGVybWl0IG11bHRpcGxlIGhpZ2gncworICAgICAgICAgcmVsb2NzIGZvciBhIHNpbmdsZSBgbG93Jy4gICovCisgICAgICBzZWdpbmZvID0gc2VnX2luZm8gKGwtPnNlZyk7CisgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQorCXsKKwkgIGZpeFMgKiBmOworCSAgZml4UyAqIHByZXY7CisKKwkgIHByZXYgPSBOVUxMOworCSAgZm9yIChmID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGYgIT0gTlVMTDsgZiA9IGYtPmZ4X25leHQpCisJICAgIHsKKwkgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBgbG93JyBmaXh1cCB3aGljaCBtYXRjaGVzIGwtPmZpeHAuICAqLworCSAgICAgIGlmIChGWF9PUElORk9fUl9UWVBFIChmKSA9PSBCRkRfUkVMT0NfTTMyUl9MTzE2CisJCSAgJiYgZi0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfYWRkc3kKKwkJICAmJiBmLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+Znhfb2Zmc2V0CisJCSAgJiYgKHBhc3MgPT0gMQorCQkgICAgICB8fCBwcmV2ID09IE5VTEwKKwkJICAgICAgfHwgKEZYX09QSU5GT19SX1RZUEUgKHByZXYpICE9IEJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPCisJCQkgICYmIEZYX09QSU5GT19SX1RZUEUgKHByZXYpICE9IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPKQorCQkgICAgICB8fCBwcmV2LT5meF9hZGRzeSAhPSBmLT5meF9hZGRzeQorCQkgICAgICB8fCBwcmV2LT5meF9vZmZzZXQgIT0gIGYtPmZ4X29mZnNldCkpCisJCXsKKwkJICBmaXhTICoqIHBmOworCisJCSAgLyogTW92ZSBsLT5maXhwIGJlZm9yZSBmLiAgKi8KKwkJICBmb3IgKHBmID0gJnNlZ2luZm8tPmZpeF9yb290OworCQkgICAgICAgKiBwZiAhPSBsLT5maXhwOworCQkgICAgICAgcGYgPSAmICgqIHBmKS0+ZnhfbmV4dCkKKwkJICAgIGFzc2VydCAoKiBwZiAhPSBOVUxMKTsKKworCQkgICogcGYgPSBsLT5maXhwLT5meF9uZXh0OworCisJCSAgbC0+Zml4cC0+ZnhfbmV4dCA9IGY7CisJCSAgaWYgKHByZXYgPT0gTlVMTCkKKwkJICAgIHNlZ2luZm8tPmZpeF9yb290ID0gbC0+Zml4cDsKKwkJICBlbHNlCisJCSAgICBwcmV2LT5meF9uZXh0ID0gbC0+Zml4cDsKKworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBwcmV2ID0gZjsKKwkgICAgfQorCisJICBpZiAoZiAhPSBOVUxMKQorCSAgICBicmVhazsKKworCSAgaWYgKHBhc3MgPT0gMQorCSAgICAgICYmIHdhcm5fdW5tYXRjaGVkX2hpZ2gpCisJICAgIGFzX3dhcm5fd2hlcmUgKGwtPmZpeHAtPmZ4X2ZpbGUsIGwtPmZpeHAtPmZ4X2xpbmUsCisJCQkgICBfKCJVbm1hdGNoZWQgaGlnaC9zaGlnaCByZWxvYyIpKTsKKwl9CisgICAgfQorfQorCisvKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCisgICByZWxheGluZy4gICovCisKK2ludAorbTMycl9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCisgICAgIGZpeFMgKiBmaXg7Cit7CisgIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCEgbTMycl9yZWxheCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gKGZpeC0+ZnhfcGNyZWwKKwkgIHx8IDAgLyogPz8/ICovKTsKK30KKwwKKy8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGVuZGlhbm5lc3MuICAqLworCit2b2lkCittZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQorICAgICBjaGFyICogYnVmOworICAgICB2YWx1ZVQgdmFsOworICAgICBpbnQgICAgbjsKK3sKKyAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKKyAgZWxzZQorICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKK30KKworLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKKyAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKKyAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgorKi8KKworLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50ICAgICAgICAgICAgICBpOworICBpbnQgICAgICAgICAgICAgIHByZWM7CisgIExJVFRMRU5VTV9UWVBFICAgd29yZHMgW01BWF9MSVRUTEVOVU1TXTsKKyAgY2hhciAqICAgICAgICAgICB0OworICBjaGFyICogICAgICAgICAgIGF0b2ZfaWVlZSAoKTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgIGNhc2UgJ3MnOgorICAgIGNhc2UgJ1MnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgLyogRklYTUU6IFNvbWUgdGFyZ2V0cyBhbGxvdyBvdGhlciBmb3JtYXQgY2hhcnMgZm9yIGJpZ2dlciBzaXplcyBoZXJlLiAgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICAqIHNpemVQID0gMDsKKyAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBtZF9hdG9mKCkiKTsKKyAgICB9CisKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisgICogc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisKKyAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCisJeworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKKwkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKwkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLAorCQkJICAgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKwl9CisgICAgfQorICAgICAKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK20zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCkKK3sKKyAgLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYSBzZWN0aW9uIGFuZCB3ZSBoYXZlIGp1c3QgZW1pdHRlZCBhCisgICAgIDE2IGJpdCBpbnNuLCB0aGVuIGVtaXQgYSBub3AgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlY3Rpb24gZW5kcyBvbgorICAgICBhIDMyIGJpdCBib3VuZGFyeS4gICovCisgIAorICBpZiAocHJldl9pbnNuLmluc24gfHwgc2Vlbl9yZWxheGFibGVfcCkKKyAgICAodm9pZCkgbTMycl9maWxsX2luc24gKDApOworfQorCitib29sZWFuCittMzJyX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQorICAgZml4UyAqZml4UDsKK3sKKworICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgCisgIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLworICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworICAKKyAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLworICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW0zMnIuaCBiL2dhcy9jb25maWcvdGMtbTMyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2ZjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLW0zMnIuaApAQCAtMCwwICsxLDEwMiBAQAorLyogdGMtbTMyci5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tMzJyLmMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2RlZmluZSBUQ19NMzJSCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorLyogbGVhZGluZyBzcGFjZSBzbyB3aWxsIGNvbXBpbGUgd2l0aCBjYyAqLworICNlcnJvciBNMzJSIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgorI2VuZGlmCisKKyNkZWZpbmUgTElTVElOR19IRUFERVIgIk0zMlIgR0FTICIKKworLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbTMycgorCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW0zMnIiCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQorCisvKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KK2xvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOworI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAorCisvKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCisKKy8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCisjZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKKworLyogRm9yIDggdnMgMTYgdnMgMzIgYml0IGJyYW5jaCBzZWxlY3Rpb24uICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107CisjZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKKyNpZiAwCitleHRlcm4gdm9pZCBtMzJyX3ByZXBhcmVfcmVsYXhfc2NhbiAoKTsKKyNkZWZpbmUgbWRfcHJlcGFyZV9yZWxheF9zY2FuKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSkgXAorbTMycl9wcmVwYXJlX3JlbGF4X3NjYW4gKGZyYWdQLCBhZGRyZXNzLCBhaW0sIHRoaXNfc3RhdGUsIHRoaXNfdHlwZSkKKyNlbHNlCitleHRlcm4gbG9uZyBtMzJyX3JlbGF4X2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgbG9uZykpOworI2RlZmluZSBtZF9yZWxheF9mcmFnKGZyYWdQLCBzdHJldGNoKSBcCittMzJyX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQorI2VuZGlmCisvKiBBY2NvdW50IGZvciBub3AgaWYgMzIgYml0IGluc24gZmFsbHMgb24gb2RkIGhhbGZ3b3JkIGJvdW5kYXJ5LiAgKi8KKyNkZWZpbmUgVENfQ0dFTl9NQVhfUkVMQVgoaW5zbiwgbGVuKSAoNikKKworLyogQWxpZ25tZW50cyBhcmUgdXNlZCB0byBlbnN1cmUgMzIgYml0IGluc25zIGxpdmUgb24gMzIgYml0IGJvdW5kYXJpZXMsIHNvCisgICB3ZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wIHBhdHRlcm4uICAqLworZXh0ZXJuIGludCBtMzJyX2RvX2FsaWduIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCkpOworI2RlZmluZSBtZF9kb19hbGlnbihuLCBmaWxsLCBsZW4sIG1heCwgbCkgXAoraWYgKG0zMnJfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4KSkgZ290byBsCisKKyNkZWZpbmUgTURfQVBQTFlfRklYMworI2RlZmluZSBtZF9hcHBseV9maXgzIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMKKworI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgbTMycl9maXhfYWRqdXN0YWJsZShmaXhQKQorCisvKiBBZnRlciBjcmVhdGluZyBhIGZpeHVwIGZvciBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kLCB3ZSBuZWVkIHRvIGNoZWNrIGZvcgorICAgSEkxNiByZWxvY3MgYW5kIHF1ZXVlIHRoZW0gdXAgZm9yIGxhdGVyIHNvcnRpbmcuICAqLworI2RlZmluZSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgbTMycl9jZ2VuX3JlY29yZF9maXh1cF9leHAKKworI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKKworI2RlZmluZSB0Y19nZW5fcmVsb2MgZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jCisKKyNkZWZpbmUgdGNfZnJvYl9maWxlKCkgbTMycl9mcm9iX2ZpbGUgKCkKK2V4dGVybiB2b2lkIG0zMnJfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKKworLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBtMzJyX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKK2V4dGVybiBpbnQgbTMycl9mb3JjZV9yZWxvY2F0aW9uICgpOworCisvKiBFbnN1cmUgaW5zbnMgYXQgbGFiZWxzIGFyZSBhbGlnbmVkIHRvIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KK2ludCBtMzJyX2ZpbGxfaW5zbiBQQVJBTVMgKChpbnQpKTsKKyNkZWZpbmUgbWRfYWZ0ZXJfcGFzc19ob29rKCkJbTMycl9maWxsX2luc24gKDEpCisjZGVmaW5lIFRDX1NUQVJUX0xBQkVMKGNoLCBwdHIpCShjaCA9PSAnOicgJiYgbTMycl9maWxsX2luc24gKDApKQorCisvKiBBZGQgZXh0cmEgTTMyUiBzZWN0aW9ucy4gICovCisjZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKKyAgeyAiLnNkYXRhIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKKyAgeyAiLnNic3MiLAkJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sCisKKyNkZWZpbmUgbWRfY2xlYW51cCAgICAgICAgICAgICAgICAgbTMycl9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaworI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCitleHRlcm4gdm9pZCBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOyAgICAKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ODUxLmggYi9nYXMvY29uZmlnL3RjLW02ODg1MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNmQ3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLW02ODg1MS5oCkBAIC0wLDAgKzEsMzA0IEBACisvKiBUaGlzIGZpbGUgaXMgdGMtbTY4ODUxLmgKKworICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisgICAKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIHBtbXUuaAorICovCisKKy8qIEkgc3VwcG9zZSB3ZSBoYXZlIHRvIGNvcHlyaWdodCB0aGlzIGZpbGUuICBTb21lb25lIG9uIHRoZSBuZXQgc2VudCBpdAorICAgdG8gdXMgYXMgcGFydCBvZiB0aGUgY2hhbmdlcyBmb3IgdGhlIG02ODg1MSBNZW1vcnkgTWFuYWdlbWVudCBVbml0ICovCisKKy8qIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIAorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KKyAgIAorICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgorICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKKyAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKKyAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCisgICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgorICAgCisgICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKKyAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCisgICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCisgICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKKyAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQorICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKKyAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCisKKyNpZmRlZiBtNjg4NTEKKworLyoKKyAgSSBkaWRuJ3QgdXNlIG11Y2ggaW1hZ2luYXRpb24gaW4gY2hvb3NpbmcgdGhlIAorICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQorICBtbmVtb25pYy4gLXJhYgorICAKKyAgUCAgcG1tdSByZWdpc3RlcgorICBQb3NzaWJsZSB2YWx1ZXM6CisgIDAwMAlUQwlUcmFuc2xhdGlvbiBDb250cm9sIHJlZworICAxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsCisgIDEwMQlWQUwJVmFsaWRhdGUgQWNjZXNzIExldmVsCisgIDExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wKKyAgMTExCUFDCUFjY2VzcyBDb250cm9sCisgIAorICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCisgIFBvc3NpYmxlIHZhbHVlczoKKyAgMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyCisgIDAxMAlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIKKyAgMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyCisgIAorICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIKKyAgMAlTRkMKKyAgMQlERkMKKyAgCisgIFYJVkFMIHJlZ2lzdGVyIG9ubHkKKyAgCisgIFgJQkFEeCwgQkFDeAorICAxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YQorICAxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbAorICAKKyAgWQlQU1IKKyAgWglQQ1NSCisgIAorICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKKyAgCisgICovCisKKy8qCisgKiB0aGVzZSBkZWZpbmVzIHNob3VsZCBiZSBpbiBtNjhrLmMgYnV0CisgKiBpIHB1dCB0aGVtIGhlcmUgdG8ga2VlcCBhbGwgdGhlIG02ODg1MSBzdHVmZgorICogdG9nZXRoZXIgLXJhYgorICogSkYtLU1ha2Ugc3VyZSB0aGVzZSAjcyBkb24ndCBjbGFzaCB3aXRoIHRoZSBvbmVzIGluIG02OGsuYworICogVGhhdCB3b3VsZCBiZSBCQUQuCisgKi8KKyNkZWZpbmUgVEMJKEZQUysxKQkJLyogNDggKi8KKyNkZWZpbmUgRFJQCShUQysxKQkJLyogNDkgKi8KKyNkZWZpbmUgU1JQCShEUlArMSkJCS8qIDUwICovCisjZGVmaW5lIENSUAkoU1JQKzEpCQkvKiA1MSAqLworI2RlZmluZSBDQUwJKENSUCsxKQkJLyogNTIgKi8KKyNkZWZpbmUgVkFMCShDQUwrMSkJCS8qIDUzICovCisjZGVmaW5lIFNDQwkoVkFMKzEpCQkvKiA1NCAqLworI2RlZmluZSBBQwkoU0NDKzEpCQkvKiA1NSAqLworI2RlZmluZSBCQUQJKEFDKzEpCQkvKiA1Niw1Nyw1OCw1OSwgNjAsNjEsNjIsNjMgKi8KKyNkZWZpbmUgQkFDCShCQUQrOCkJCS8qIDY0LDY1LDY2LDY3LCA2OCw2OSw3MCw3MSAqLworI2RlZmluZSBQU1IJKEJBQys4KQkJLyogNzIgKi8KKyNkZWZpbmUgUENTUgkoUFNSKzEpCQkvKiA3MyAqLworCisvKiBuYW1lICovCS8qIG9wY29kZSAqLwkJLyogbWF0Y2ggKi8JCS8qIGFyZ3MgKi8KKworeyJwYmFjIiwJb25lKDB4ZjBjNyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJhcyIsCW9uZSgweGYwYzYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBiYmMiLAlvbmUoMHhmMGMxKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBiYmN3IiwJb25lKDB4ZjA4MSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmJzIiwJb25lKDB4ZjBjMCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJjYyIsCW9uZSgweGYwY2YpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBiY3MiLAlvbmUoMHhmMGNlKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBiY3N3IiwJb25lKDB4ZjA4ZSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmdjIiwJb25lKDB4ZjBjZCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJncyIsCW9uZSgweGYwY2MpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBiaWMiLAlvbmUoMHhmMGNiKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBiaWN3IiwJb25lKDB4ZjA4YiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmlzIiwJb25lKDB4ZjBjYSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJsYyIsCW9uZSgweGYwYzMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBibHMiLAlvbmUoMHhmMGMyKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBibHN3IiwJb25lKDB4ZjA4MiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYnNjIiwJb25lKDB4ZjBjNSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJzcyIsCW9uZSgweGYwYzQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKK3sicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBid2MiLAlvbmUoMHhmMGM5KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCit7InBid2N3IiwJb25lKDB4ZjA4OSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYndzIiwJb25lKDB4ZjBjOCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoreyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKKyAgICAKKyAgICAKK3sicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoreyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCit7InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKK3sicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoreyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCit7InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKK3sicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoreyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCit7InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKK3sicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoreyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCit7InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKK3sicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoreyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCit7InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKK3sicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAorICAgIAoreyJwZmx1c2hhIiwJdHdvKDB4ZjAwMCwgMHgyNDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiIgfSwKKyAgICAKK3sicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDEwKSwJdHdvKDB4ZmZjMCwgMHhmZTEwKSwJIlQzVDkiIH0sCit7InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgxMCksCXR3bygweGZmYzAsIDB4ZmUxMCksCSJUM1Q5JnMiIH0sCit7InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAwOCksCXR3bygweGZmYzAsIDB4ZmUxOCksCSJEM1Q5IiB9LAoreyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MDgpLAl0d28oMHhmZmMwLCAweGZlMTgpLAkiRDNUOSZzIiB9LAoreyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMDApLAl0d28oMHhmZmMwLCAweGZlMWUpLAkiZjNUOSIgfSwKK3sicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODAwKSwJdHdvKDB4ZmZjMCwgMHhmZTFlKSwJImYzVDkmcyIgfSwKKyAgICAKK3sicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQxMCksCXR3bygweGZmZjgsIDB4ZmUxMCksCSJUM1Q5IiB9LAoreyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTAwKSwJIlQzVDkmcyIgfSwKK3sicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksCXR3bygweGZmZjgsIDB4ZmUxOCksCSJEM1Q5IiB9LAoreyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzA4KSwJdHdvKDB4ZmZmOCwgMHhmZTE4KSwJIkQzVDkmcyIgfSwKK3sicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwMCksCXR3bygweGZmZjgsIDB4ZmUxZSksCSJmM1Q5IiB9LAoreyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTFlKSwJImYzVDkmcyJ9LAorICAgIAoreyJwZmx1c2hyIiwJdHdvKDB4ZjAwMCwgMHhhMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJInxzIiB9LAorICAgIAoreyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKK3sicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCit7InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAoreyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKK3sicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCit7InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAorICAgIAorICAgIC8qIFRDLCBDUlAsIERSUCwgU1JQLCBDQUwsIFZBTCwgU0NDLCBBQyAqLworeyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSIqc1A4IiB9LAoreyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJQOCVzIiB9LAoreyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJ8c1c4IiB9LAoreyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJXOH5zIiB9LAorICAgIAorICAgIC8qIEJBRHgsIEJBQ3ggKi8KK3sicG1vdmUiLAl0d28oMHhmMDAwLCAweDYyMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiKnNYMyIgfSwKK3sicG1vdmUiLAl0d28oMHhmMDAwLCAweDYwMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiWDMlcyIgfSwKKyAgICAKKyAgICAvKiBQU1IsIFBDU1IgKi8KKyAgICAvKiB7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MTAwKSwJdHdvKG94ZmZjMCwgb3hmZmZmKSwJIipzWjgiIH0sICovCit7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIipzWTgiIH0sCit7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlk4JXMiIH0sCit7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2NjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlo4JXMiIH0sCisgICAgCit7InByZXN0b3JlIiwJb25lKDB4ZjE0MCksCQlvbmUoMHhmZmMwKSwJCSImcyJ9LAoreyJwcmVzdG9yZSIsCW9uZSgweGYxNTgpLAkJb25lKDB4ZmZmOCksCQkiK3MifSwKK3sicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLAkJIiZzIn0sCit7InBzYXZlIiwJb25lKDB4ZjEwMCksCQlvbmUoMHhmZmMwKSwJCSIrcyJ9LAorICAgIAoreyJwc2FjIiwJdHdvKDB4ZjA0MCwgMHgwMDA3KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCit7InBzYXMiLAl0d28oMHhmMDQwLCAweDAwMDYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKK3sicHNiYyIsCXR3bygweGYwNDAsIDB4MDAwMSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoreyJwc2JzIiwJdHdvKDB4ZjA0MCwgMHgwMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCit7InBzY2MiLAl0d28oMHhmMDQwLCAweDAwMGYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKK3sicHNjcyIsCXR3bygweGYwNDAsIDB4MDAwZSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoreyJwc2djIiwJdHdvKDB4ZjA0MCwgMHgwMDBkKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCit7InBzZ3MiLAl0d28oMHhmMDQwLCAweDAwMGMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKK3sicHNpYyIsCXR3bygweGYwNDAsIDB4MDAwYiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoreyJwc2lzIiwJdHdvKDB4ZjA0MCwgMHgwMDBhKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCit7InBzbGMiLAl0d28oMHhmMDQwLCAweDAwMDMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKK3sicHNscyIsCXR3bygweGYwNDAsIDB4MDAwMiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoreyJwc3NjIiwJdHdvKDB4ZjA0MCwgMHgwMDA1KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCit7InBzc3MiLAl0d28oMHhmMDQwLCAweDAwMDQpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKK3sicHN3YyIsCXR3bygweGYwNDAsIDB4MDAwOSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoreyJwc3dzIiwJdHdvKDB4ZjA0MCwgMHgwMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCisgICAgCit7InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCit7InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMxMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKK3sicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKK3sicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoreyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoreyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCisgICAgCit7InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCit7InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODExMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKK3sicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKK3sicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoreyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoreyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCisgICAgCit7InB0cmFwYWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwYWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwYWMiLAl0d28oMHhmMDdjLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwYmN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwYmNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwYmMiLAl0d28oMHhmMDdjLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwYnN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwYnNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwYnMiLAl0d28oMHhmMDdjLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwY3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwY3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwY3MiLAl0d28oMHhmMDdjLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwZ2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwZ2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwZ2MiLAl0d28oMHhmMDdjLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwaWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwaWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwaWMiLAl0d28oMHhmMDdjLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwaXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwaXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwaXMiLAl0d28oMHhmMDdjLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwbHN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwbHNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwbHMiLAl0d28oMHhmMDdjLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwc2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwc2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwc2MiLAl0d28oMHhmMDdjLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwd2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwd2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwd2MiLAl0d28oMHhmMDdjLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB0cmFwd3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCit7InB0cmFwd3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCit7InB0cmFwd3MiLAl0d28oMHhmMDdjLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCisgICAgCit7InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJWcyZzIn0sCit7InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksCSJBMyZzIiB9LAorICAgIAorI2VuZGlmIC8qIG02ODg1MSAqLworCisvKiBlbmQgb2YgdGMtbTY4ODUxLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2ZGQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtbTY4ay5jCkBAIC0wLDAgKzEsNzAwOSBAQAorLyogdGMtbTY4ay5jIC0tIEFzc2VtYmxlIGZvciB0aGUgbTY4ayBmYW1pbHkKKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisKKyNpbmNsdWRlICJvcGNvZGUvbTY4ay5oIgorI2luY2x1ZGUgIm02OGstcGFyc2UuaCIKKworLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQorICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCisgICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQorICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB0aGUgLS1iaXR3aXNlLW9yIG9wdGlvbiB3aWxsIHdvcmsuICAqLworI2lmIGRlZmluZWQgKFRFX1NWUjQpIHx8IGRlZmluZWQgKFRFX0RFTFRBKQorY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzID0gInwjIjsKKyNlbHNlCitjb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnMgPSAifCI7CisjZW5kaWYKKworLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKKyAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLworLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCisgICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KKy8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KK2NvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyoiOworCitjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKKworLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KK0NPTlNUIGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgYXMKKyAgIGluICIwZjEyLjQ1NiIgb3IgIjBkMS4yMzQ1ZTEyIi4gICovCisKK0NPTlNUIGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WGVFcFAiOworCisvKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCisgICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAorICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLworCitjb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KKworLyogQXJlIHdlIHRyeWluZyB0byBnZW5lcmF0ZSBQSUMgY29kZT8gIElmIHNvLCBhYnNvbHV0ZSByZWZlcmVuY2VzCisgICBvdWdodCB0byBiZSBtYWRlIGludG8gbGlua2FnZSB0YWJsZSByZWZlcmVuY2VzIG9yIHBjLXJlbGF0aXZlCisgICByZWZlcmVuY2VzLiAgTm90IGltcGxlbWVudGVkLiAgRm9yIEVMRiB0aGVyZSBhcmUgb3RoZXIgbWVhbnMgCisgICB0byBkZW5vdGUgcGljIHJlbG9jYXRpb25zLiAgKi8KK2ludCBmbGFnX3dhbnRfcGljOworCitzdGF0aWMgaW50IGZsYWdfc2hvcnRfcmVmczsJLyogLWwgb3B0aW9uICovCitzdGF0aWMgaW50IGZsYWdfbG9uZ19qdW1wczsJLyogLVMgb3B0aW9uICovCisKKyNpZmRlZiBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwKK2ludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7CisjZWxzZQoraW50IGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbDsKKyNlbmRpZgorCisvKiBXaGV0aGVyIC0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIHdhcyB1c2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLworc3RhdGljIGludCByZWdfcHJlZml4X29wdGlvbmFsX3NlZW47CisKKy8qIFRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciB0byB1c2UgYnkgZGVmYXVsdC4gICovCitzdGF0aWMgZW51bSBtNjhrX3JlZ2lzdGVyIG02OGtfZmxvYXRfY29wbnVtID0gQ09QMTsKKworLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiByZWZlcmVuY2VzIHRvIG51bWJlciglcGMpIHdpbGwgYmUgdGFrZW4KKyAgIHRvIHJlZmVyIHRvIG51bWJlciwgcmF0aGVyIHRoYW4gdG8gJXBjICsgbnVtYmVyLiAgKi8KK3N0YXRpYyBpbnQgbTY4a19hYnNwY2FkZDsKKworLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiB0aGUgcXVpY2sgZm9ybXMgb2YgdGhlIG1vdmUsIGFkZCwgYW5kIHN1YgorICAgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHdoZW4gcG9zc2libGUuICAqLworc3RhdGljIGludCBtNjhrX3F1aWNrID0gMTsKKworLyogSWYgdGhpcyBpcyBub24temVybywgdGhlbiBpZiB0aGUgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkIGZvciBhIGJhc2UKKyAgIG9yIG91dGVyIGRpc3BsYWNlbWVudCwgdGhlIGFzc2VtYmxlciBhc3N1bWVzIHRoYXQgdGhlIHNpemUgc2hvdWxkCisgICBiZSAzMiBiaXRzLiAgKi8KK3N0YXRpYyBpbnQgbTY4a19yZWwzMiA9IDE7CisKKy8qIFRoaXMgaXMgbm9uLXplcm8gaWYgbTY4a19yZWwzMiB3YXMgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCitzdGF0aWMgaW50IG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lOworCisvKiBUaGUgZGVmYXVsdCB3aWR0aCB0byB1c2UgZm9yIGFuIGluZGV4IHJlZ2lzdGVyIHdoZW4gdXNpbmcgYSBiYXNlCisgICBkaXNwbGFjZW1lbnQuICAqLworc3RhdGljIGVudW0gbTY4a19zaXplIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9IFNJWkVfTE9ORzsKKworLyogV2Ugd2FudCB0byB3YXJuIGlmIGFueSB0ZXh0IGxhYmVscyBhcmUgbWlzYWxpZ25lZC4gIEluIG9yZGVyIHRvIGdldAorICAgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyLCB3ZSBuZWVkIHRvIHJlY29yZCB0aGUgbGluZSBudW1iZXIgZm9yIGVhY2gKKyAgIGxhYmVsLiAgKi8KKworc3RydWN0IGxhYmVsX2xpbmUKK3sKKyAgc3RydWN0IGxhYmVsX2xpbmUgKm5leHQ7CisgIHN5bWJvbFMgKmxhYmVsOworICBjaGFyICpmaWxlOworICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgaW50IHRleHQ7Cit9OworCisvKiBUaGUgbGlzdCBvZiBsYWJlbHMuICAqLworCitzdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmxhYmVsczsKKworLyogVGhlIGN1cnJlbnQgbGFiZWwuICAqLworCitzdGF0aWMgc3RydWN0IGxhYmVsX2xpbmUgKmN1cnJlbnRfbGFiZWw7CisKKy8qIEl0cyBhbiBhcmJpdHJhcnkgbmFtZTogIFRoaXMgbWVhbnMgSSBkb24ndCBhcHByb3ZlIG9mIGl0ICovCisvKiBTZWUgZmxhbWVzIGJlbG93ICovCitzdGF0aWMgc3RydWN0IG9ic3RhY2sgcm9ieW47CisKKyNkZWZpbmUgVEFCKHgseSkJKCgoeCk8PDIpKyh5KSkKKyNkZWZpbmUgVEFCVFlQRSh4eSkgICAgICgoeHkpID4+IDIpCisjZGVmaW5lIEJZVEUJCTAKKyNkZWZpbmUgU0hPUlQJCTEKKyNkZWZpbmUgTE9ORwkJMgorI2RlZmluZSBTWl9VTkRFRgkzCisjdW5kZWYgQlJBTkNICisvKiBDYXNlIGBnJyBleGNlcHQgd2hlbiBCQ0M2ODAwMCBpcyBhcHBsaWNhYmxlLiAgKi8KKyNkZWZpbmUgQUJSQU5DSAkJMQorLyogQ29wcm9jZXNzb3IgYnJhbmNoZXMuICAqLworI2RlZmluZSBGQlJBTkNICQkyCisvKiBNb2RlIDcuMiAtLSBwcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCAoMTYtYml0KSBkaXNwbGFjZW1lbnQsCisgICBzdXBwb3J0ZWQgb24gYWxsIGNwdXMuICBXaWRlbnMgdG8gMzItYml0IGFic29sdXRlLiAgKi8KKyNkZWZpbmUgUENSRUwJCTMKKy8qIEZvciBpbnNlcnRpbmcgYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIHdpdGggbG9uZyBvZmZzZXQgb24gNjgwMDAsCisgICBmb3IgZXhwYW5kaW5nIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKE5vdCBic3Igb3IgYnJhLikgIFNpbmNlIHRoZQorICAgNjgwMDAgZG9lc24ndCBzdXBwb3J0IDMyLWJpdCBkaXNwbGFjZW1lbnRzIGZvciBjb25kaXRpb25hbAorICAgYnJhbmNoZXMsIHdlIGZha2UgaXQgYnkgcmV2ZXJzaW5nIHRoZSBjb25kaXRpb24gYW5kIGJyYW5jaGluZworICAgYXJvdW5kIGEgam1wIHdpdGggYW4gYWJzb2x1dGUgbG9uZyBvcGVyYW5kLiAgKi8KKyNkZWZpbmUgQkNDNjgwMDAgICAgICAgIDQKKy8qIEZvciB0aGUgREJjYyAiaW5zdHJ1Y3Rpb25zIi4gIElmIHRoZSBkaXNwbGFjZW1lbnQgcmVxdWlyZXMgMzIgYml0cywKKyAgIHRoZSBicmFuY2gtYXJvdW5kLWEtanVtcCBnYW1lIGlzIHBsYXllZCBoZXJlIHRvby4gICovCisjZGVmaW5lIERCQ0MgICAgICAgICAgICA1CisvKiBOb3QgY3VycmVudGx5IHVzZWQ/ICAqLworI2RlZmluZSBQQ0xFQQkJNgorLyogTW9kZSBBSU5EWCAoYXBjLXJlbGF0aXZlKSB1c2luZyBQQywgd2l0aCB2YXJpYWJsZSB0YXJnZXQsIG1pZ2h0IGZpdAorICAgaW4gMTYgb3IgOCBiaXRzLiAgKi8KKyNkZWZpbmUgUENJTkRFWAkJNworCitzdHJ1Y3QgbTY4a19pbmNhbnQKKyAgeworICAgIGNvbnN0IGNoYXIgKm1fb3BlcmFuZHM7CisgICAgdW5zaWduZWQgbG9uZyBtX29wY29kZTsKKyAgICBzaG9ydCBtX29wbnVtOworICAgIHNob3J0IG1fY29kZW51bTsKKyAgICBpbnQgbV9hcmNoOworICAgIHN0cnVjdCBtNjhrX2luY2FudCAqbV9uZXh0OworICB9OworCisjZGVmaW5lIGdldG9uZSh4KQkoKCgoeCktPm1fb3Bjb2RlKT4+MTYpJjB4ZmZmZikKKyNkZWZpbmUgZ2V0dHdvKHgpCSgoKHgpLT5tX29wY29kZSkmMHhmZmZmKQorCitzdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODAwMF9jb250cm9sX3JlZ3NbXSA9IHsgMCB9Oworc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwMTBfY29udHJvbF9yZWdzW10gPSB7CisgIFNGQywgREZDLCBVU1AsIFZCUiwKKyAgMAorfTsKK3N0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDIwX2NvbnRyb2xfcmVnc1tdID0geworICBTRkMsIERGQywgVVNQLCBWQlIsIENBQ1IsIENBQVIsIE1TUCwgSVNQLAorICAwCit9Oworc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwNDBfY29udHJvbF9yZWdzW10gPSB7CisgIFNGQywgREZDLCBDQUNSLCBUQywgSVRUMCwgSVRUMSwgRFRUMCwgRFRUMSwKKyAgVVNQLCBWQlIsIE1TUCwgSVNQLCBNTVVTUiwgVVJQLCBTUlAsCisgIDAKK307CitzdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODA2MF9jb250cm9sX3JlZ3NbXSA9IHsKKyAgU0ZDLCBERkMsIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBCVVNDUiwKKyAgVVNQLCBWQlIsIFVSUCwgU1JQLCBQQ1IsCisgIDAKK307CitzdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG1jZjUyMDBfY29udHJvbF9yZWdzW10gPSB7CisgIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBWQlIsIFJPTUJBUiwgCisgIFJBTUJBUjAsIFJBTUJBUjEsIE1CQVIsCisgIDAKK307CisjZGVmaW5lIGNwdTMyX2NvbnRyb2xfcmVncyBtNjgwMTBfY29udHJvbF9yZWdzCisKK3N0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgKmNvbnRyb2xfcmVnczsKKworLyogaW50ZXJuYWwgZm9ybSBvZiBhIDY4MDIwIGluc3RydWN0aW9uICovCitzdHJ1Y3QgbTY4a19pdAoreworICBjb25zdCBjaGFyICplcnJvcjsKKyAgY29uc3QgY2hhciAqYXJnczsJCS8qIGxpc3Qgb2Ygb3Bjb2RlIGluZm8gKi8KKyAgaW50IG51bWFyZ3M7CisKKyAgaW50IG51bW87CQkJLyogTnVtYmVyIG9mIHNob3J0cyBpbiBvcGNvZGUgKi8KKyAgc2hvcnQgb3Bjb2RlWzExXTsKKworICBzdHJ1Y3QgbTY4a19vcCBvcGVyYW5kc1s2XTsKKworICBpbnQgbmV4cDsJCQkvKiBudW1iZXIgb2YgZXhwcnMgaW4gdXNlICovCisgIHN0cnVjdCBtNjhrX2V4cCBleHByc1s0XTsKKworICBpbnQgbmZyYWc7CQkJLyogTnVtYmVyIG9mIGZyYWdzIHdlIGhhdmUgdG8gcHJvZHVjZSAqLworICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQgZnJhZ29mZjsJCS8qIFdoZXJlIGluIHRoZSBjdXJyZW50IG9wY29kZSB0aGUgZnJhZyBlbmRzICovCisgICAgICBzeW1ib2xTICpmYWRkOworICAgICAgb2Zmc2V0VCBmb2ZmOworICAgICAgaW50IGZyYWd0eTsKKyAgICB9CisgIGZyYWdiWzRdOworCisgIGludCBucmVsOwkJCS8qIE51bSBvZiByZWxvYyBzdHJ1Y3MgaW4gdXNlICovCisgIHN0cnVjdAorICAgIHsKKyAgICAgIGludCBuOworICAgICAgZXhwcmVzc2lvblMgZXhwOworICAgICAgY2hhciB3aWQ7CisgICAgICBjaGFyIHBjcmVsOworICAgICAgLyogSW4gYSBwYyByZWxhdGl2ZSBhZGRyZXNzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3MKKwkgb2YgdGhlIG9mZnNldCBhbmQgdGhlIGFkZHJlc3MgdGhhdCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlCisJIHRvLiAgVGhpcyBkZXBlbmRzIG9uIHRoZSBhZGRyZXNzaW5nIG1vZGUuICBCYXNpY2FsbHkgdGhpcworCSBpcyB0aGUgdmFsdWUgdG8gcHV0IGluIHRoZSBvZmZzZXQgZmllbGQgdG8gYWRkcmVzcyB0aGUKKwkgZmlyc3QgYnl0ZSBvZiB0aGUgb2Zmc2V0LCB3aXRob3V0IHJlZ2FyZGluZyB0aGUgc3BlY2lhbAorCSBzaWduaWZpY2FuY2Ugb2Ygc29tZSB2YWx1ZXMgKGluIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGZvcgorCSBleGFtcGxlKS4gICovCisgICAgICBpbnQgcGNyZWxfZml4OworI2lmZGVmIE9CSl9FTEYKKyAgICAgIC8qIFdoZXRoZXIgdGhpcyBleHByZXNzaW9uIG5lZWRzIHNwZWNpYWwgcGljIHJlbG9jYXRpb24sIGFuZCBpZgorCSBzbywgd2hpY2guICAqLworICAgICAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWNfcmVsb2M7CisjZW5kaWYKKyAgICB9CisgIHJlbG9jWzVdOwkJCS8qIEZpdmUgaXMgZW5vdWdoPz8/ICovCit9OworCisjZGVmaW5lIGNwdV9vZl9hcmNoKHgpCQkoKHgpICYgKG02ODAwMHVwfG1jZjUyMDApKQorI2RlZmluZSBmbG9hdF9vZl9hcmNoKHgpCSgoeCkgJiBtZmxvYXQpCisjZGVmaW5lIG1tdV9vZl9hcmNoKHgpCQkoKHgpICYgbW1tdSkKKworLyogTWFjcm9zIGZvciBkZXRlcm1pbmluZyBpZiBjcHUgc3VwcG9ydHMgYSBzcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgKi8KKyNkZWZpbmUgSEFWRV9MT05HX0JSQU5DSCh4KQkoKHgpICYgKG02ODAyMHxtNjgwMzB8bTY4MDQwfG02ODA2MHxjcHUzMikpCisKK3N0YXRpYyBzdHJ1Y3QgbTY4a19pdCB0aGVfaW5zOwkvKiB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkICovCisKKyNkZWZpbmUgb3AoZXgpCQkoKGV4KS0+ZXhwLlhfb3ApCisjZGVmaW5lIGFkZHMoZXgpCSgoZXgpLT5leHAuWF9hZGRfc3ltYm9sKQorI2RlZmluZSBzdWJzKGV4KQkoKGV4KS0+ZXhwLlhfb3Bfc3ltYm9sKQorI2RlZmluZSBvZmZzKGV4KQkoKGV4KS0+ZXhwLlhfYWRkX251bWJlcikKKworLyogTWFjcm9zIGZvciBhZGRpbmcgdGhpbmdzIHRvIHRoZSBtNjhrX2l0IHN0cnVjdCAqLworCisjZGVmaW5lIGFkZHdvcmQodykJdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vKytdPSh3KQorCisvKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIHZvaWQgaW5zb3AgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKikpOworc3RhdGljIHZvaWQgYWRkX2ZpeCBQQVJBTVMgKChpbnQsIHN0cnVjdCBtNjhrX2V4cCAqLCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgYWRkX2ZyYWcgUEFSQU1TICgoc3ltYm9sUyAqLCBvZmZzZXRULCBpbnQpKTsKKworLyogTGlrZSBhZGR3b3JkLCBidXQgZ29lcyBCRUZPUkUgZ2VuZXJhbCBvcGVyYW5kcyAqLworc3RhdGljIHZvaWQKK2luc29wICh3LCBvcGNvZGUpCisgICAgIGludCB3OworICAgICBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKm9wY29kZTsKK3sKKyAgaW50IHo7CisgIGZvcih6PXRoZV9pbnMubnVtbzt6Pm9wY29kZS0+bV9jb2RlbnVtOy0teikKKyAgICB0aGVfaW5zLm9wY29kZVt6XT10aGVfaW5zLm9wY29kZVt6LTFdOworICBmb3Ioej0wO3o8dGhlX2lucy5ucmVsO3orKykKKyAgICB0aGVfaW5zLnJlbG9jW3pdLm4rPTI7CisgIGZvciAoeiA9IDA7IHogPCB0aGVfaW5zLm5mcmFnOyB6KyspCisgICAgdGhlX2lucy5mcmFnYlt6XS5mcmFnb2ZmKys7CisgIHRoZV9pbnMub3Bjb2RlW29wY29kZS0+bV9jb2RlbnVtXT13OworICB0aGVfaW5zLm51bW8rKzsKK30KKworLyogVGhlIG51bW8rMSBrbHVkZ2UgaXMgc28gd2UgY2FuIGhpdCB0aGUgbG93IG9yZGVyIGJ5dGUgb2YgdGhlIHByZXYgd29yZC4KKyAgIEJsZWNjaC4gICovCitzdGF0aWMgdm9pZAorYWRkX2ZpeCAod2lkdGgsIGV4cCwgcGNfcmVsLCBwY19maXgpCisgICAgIGludCB3aWR0aDsKKyAgICAgc3RydWN0IG02OGtfZXhwICpleHA7CisgICAgIGludCBwY19yZWw7CisgICAgIGludCBwY19maXg7Cit7CisgIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5uID0gKCh3aWR0aCA9PSAnQicgfHwgd2lkdGggPT0gJzMnKQorCQkJCSAgID8gKHRoZV9pbnMubnVtbyoyLTEpCisJCQkJICAgOiAoKCh3aWR0aCk9PSdiJykKKwkJCQkgICAgICA/ICh0aGVfaW5zLm51bW8qMisxKQorCQkJCSAgICAgIDogKHRoZV9pbnMubnVtbyoyKSkpOworICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0uZXhwID0gZXhwLT5leHA7CisgIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS53aWQgPSB3aWR0aDsKKyAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLnBjcmVsX2ZpeCA9IHBjX2ZpeDsKKyNpZmRlZiBPQkpfRUxGCisgIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5waWNfcmVsb2MgPSBleHAtPnBpY19yZWxvYzsKKyNlbmRpZgorICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCsrXS5wY3JlbCA9IHBjX3JlbDsKK30KKworLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCisgICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQorICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCisgICByc19tYWNoaW5lX2RlcGVuZGVudC4KKworICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKKyAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAorICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KKworICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KK3N0YXRpYyB2b2lkCithZGRfZnJhZyAoYWRkLCBvZmYsIHR5cGUpCisgICAgIHN5bWJvbFMgKmFkZDsKKyAgICAgb2Zmc2V0VCBvZmY7CisgICAgIGludCB0eXBlOworeworICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZyYWdvZmY9dGhlX2lucy5udW1vOworICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZhZGQ9YWRkOworICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWddLmZvZmY9b2ZmOworICB0aGVfaW5zLmZyYWdiW3RoZV9pbnMubmZyYWcrK10uZnJhZ3R5PXR5cGU7Cit9CisKKyNkZWZpbmUgaXN2YXIoZXgpIFwKKyAgKG9wIChleCkgIT0gT19jb25zdGFudCAmJiBvcCAoZXgpICE9IE9fYmlnKQorCitzdGF0aWMgY2hhciAqY3JhY2tfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtNjhrX29wICpvcFApKTsKK3N0YXRpYyBpbnQgZ2V0X251bSBQQVJBTVMgKChzdHJ1Y3QgbTY4a19leHAgKmV4cCwgaW50IG9rKSk7CitzdGF0aWMgdm9pZCBtNjhrX2lwIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHZvaWQgaW5zZXJ0X3JlZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgc2VsZWN0X2NvbnRyb2xfcmVncyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBpbml0X3JlZ3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgcmV2ZXJzZV8xNl9iaXRzIFBBUkFNUyAoKGludCBpbikpOworc3RhdGljIGludCByZXZlcnNlXzhfYml0cyBQQVJBTVMgKChpbnQgaW4pKTsKK3N0YXRpYyB2b2lkIGluc3RhbGxfZ2VuX29wZXJhbmQgUEFSQU1TICgoaW50IG1vZGUsIGludCB2YWwpKTsKK3N0YXRpYyB2b2lkIGluc3RhbGxfb3BlcmFuZCBQQVJBTVMgKChpbnQgbW9kZSwgaW50IHZhbCkpOworc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19kYXRhMiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfZXZlbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfcHJvYyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIG1yaV9jaGlwIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNfY2hpcCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfZm9wdCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfb3B0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19yZWcgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX3Jlc3RvcmUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX3NhdmUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX21yaV9pZiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbXJpX2Vsc2UgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX21yaV9lbmRpIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19tcmlfYnJlYWsgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX21yaV9uZXh0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19tcmlfZm9yIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19tcmlfZW5kZiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbXJpX3JlcGVhdCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbXJpX3VudGlsIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19tcmlfd2hpbGUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX21yaV9lbmR3IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgbWRfYXBwbHlfZml4XzIgUEFSQU1TICgoZml4UyAqLCBvZmZzZXRUKSk7CitzdGF0aWMgdm9pZCBtZF9jb252ZXJ0X2ZyYWdfMSBQQVJBTVMgKChmcmFnUyAqKSk7CisKK3N0YXRpYyBpbnQgY3VycmVudF9hcmNoaXRlY3R1cmU7CisKK3N0cnVjdCBtNjhrX2NwdSB7CisgIHVuc2lnbmVkIGxvbmcgYXJjaDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IGFsaWFzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX2NwdSBhcmNoc1tdID0geworICB7IG02ODAwMCwgIjY4MDAwIiwgMCB9LAorICB7IG02ODAxMCwgIjY4MDEwIiwgMCB9LAorICB7IG02ODAyMCwgIjY4MDIwIiwgMCB9LAorICB7IG02ODAzMCwgIjY4MDMwIiwgMCB9LAorICB7IG02ODA0MCwgIjY4MDQwIiwgMCB9LAorICB7IG02ODA2MCwgIjY4MDYwIiwgMCB9LAorICB7IGNwdTMyLCAgImNwdTMyIiwgMCB9LAorICB7IG02ODg4MSwgIjY4ODgxIiwgMCB9LAorICB7IG02ODg1MSwgIjY4ODUxIiwgMCB9LAorICB7IG1jZjUyMDAsICI1MjAwIiwgMCB9LAorICAvKiBBbGlhc2VzIChlZmZlY3RpdmVseSwgc28gZmFyIGFzIGdhcyBpcyBjb25jZXJuZWQpIGZvciB0aGUgYWJvdmUKKyAgICAgY3B1cy4gICovCisgIHsgbTY4MDIwLCAiNjhrIiwgMSB9LAorICB7IG02ODAwMCwgIjY4MDA4IiwgMSB9LAorICB7IG02ODAwMCwgIjY4MzAyIiwgMSB9LAorICB7IG02ODAwMCwgIjY4MzA2IiwgMSB9LAorICB7IG02ODAwMCwgIjY4MzA3IiwgMSB9LAorICB7IG02ODAwMCwgIjY4MzIyIiwgMSB9LAorICB7IG02ODAwMCwgIjY4MzU2IiwgMSB9LAorICB7IG02ODAwMCwgIjY4ZWMwMDAiLCAxIH0sCisgIHsgbTY4MDAwLCAiNjhoYzAwMCIsIDEgfSwKKyAgeyBtNjgwMDAsICI2OGhjMDAxIiwgMSB9LAorICB7IG02ODAyMCwgIjY4ZWMwMjAiLCAxIH0sCisgIHsgbTY4MDMwLCAiNjhlYzAzMCIsIDEgfSwKKyAgeyBtNjgwNDAsICI2OGVjMDQwIiwgMSB9LAorICB7IG02ODA2MCwgIjY4ZWMwNjAiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzMzAiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzMzEiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzMzIiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzMzMiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzMzQiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzMzYiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzNDAiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzNDEiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzNDkiLCAxIH0sCisgIHsgY3B1MzIsICAiNjgzNjAiLCAxIH0sCisgIHsgbTY4ODgxLCAiNjg4ODIiLCAxIH0sCit9OworCitzdGF0aWMgY29uc3QgaW50IG5fYXJjaHMgPSBzaXplb2YgKGFyY2hzKSAvIHNpemVvZiAoYXJjaHNbMF0pOworCisvKiBCQ0M2ODAwMCBpcyBmb3IgcGF0Y2hpbmcgaW4gYW4gZXh0cmEgam1wIGluc3RydWN0aW9uIGZvciBsb25nIG9mZnNldHMKKyAgIG9uIHRoZSA2ODAwMC4gIFRoZSA2ODAwMCBkb2Vzbid0IHN1cHBvcnQgbG9uZyBicmFuY2hlcyB3aXRoIGJyYW5jaHMgKi8KKworLyogVGhpcyB0YWJsZSBkZXNyaWJlcyBob3cgeW91IGNoYW5nZSBzaXplcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgdmFyaWFibGUKKyAgIHNpemUgZXhwcmVzc2lvbnMuICBUaGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyB0d28ga2luZHMuICovCisKKy8qIE5vdGUgdGhhdCBjYWxscyB0byBmcmFnX3ZhciBuZWVkIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gZXhwYW5zaW9uCisgICBuZWVkZWQ7IHRoaXMgaXMgY3VycmVudGx5IDEwIGJ5dGVzIGZvciBEQkNDLiAgKi8KKworLyogVGhlIGZpZWxkcyBhcmU6CisgICBIb3cgZmFyIEZvcndhcmQgdGhpcyBtb2RlIHdpbGwgcmVhY2g6CisgICBIb3cgZmFyIEJhY2t3YXJkIHRoaXMgbW9kZSB3aWxsIHJlYWNoOgorICAgSG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBmcmFnCisgICBXaGljaCBtb2RlIHRvIGdvIHRvIGlmIHRoZSBvZmZzZXQgd29uJ3QgZml0IGluIHRoaXMgb25lCisgICAqLworcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Cit7CisgIHsxLCAxLCAwLCAwfSwJCQkvKiBGaXJzdCBlbnRyaWVzIGFyZW4ndCB1c2VkICovCisgIHsxLCAxLCAwLCAwfSwJCQkvKiBGb3Igbm8gZ29vZCByZWFzb24gZXhjZXB0ICovCisgIHsxLCAxLCAwLCAwfSwJCQkvKiB0aGF0IHRoZSBWQVggZG9lc24ndCBlaXRoZXIgKi8KKyAgezEsIDEsIDAsIDB9LAorCisgIHsoMTI3KSwgKC0xMjgpLCAwLCBUQUIgKEFCUkFOQ0gsIFNIT1JUKX0sCisgIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChBQlJBTkNILCBMT05HKX0sCisgIHswLCAwLCA0LCAwfSwKKyAgezEsIDEsIDAsIDB9LAorCisgIHsxLCAxLCAwLCAwfSwJCQkvKiBGQlJBTkNIIGRvZXNuJ3QgY29tZSBCWVRFICovCisgIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChGQlJBTkNILCBMT05HKX0sCisgIHswLCAwLCA0LCAwfSwKKyAgezEsIDEsIDAsIDB9LAorCisgIHsxLCAxLCAwLCAwfSwJCQkvKiBQQ1JFTCBkb2Vzbid0IGNvbWUgQllURSAqLworICB7KDMyNzY3KSwgKC0zMjc2OCksIDIsIFRBQiAoUENSRUwsIExPTkcpfSwKKyAgezAsIDAsIDQsIDB9LAorICB7MSwgMSwgMCwgMH0sCisKKyAgeygxMjcpLCAoLTEyOCksIDAsIFRBQiAoQkNDNjgwMDAsIFNIT1JUKX0sCisgIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChCQ0M2ODAwMCwgTE9ORyl9LAorICB7MCwgMCwgNiwgMH0sCQkJLyogam1wIGxvbmcgc3BhY2UgKi8KKyAgezEsIDEsIDAsIDB9LAorCisgIHsxLCAxLCAwLCAwfSwJCQkvKiBEQkNDIGRvZXNuJ3QgY29tZSBCWVRFICovCisgIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChEQkNDLCBMT05HKX0sCisgIHswLCAwLCAxMCwgMH0sCQkvKiBicmEvam1wIGxvbmcgc3BhY2UgKi8KKyAgezEsIDEsIDAsIDB9LAorCisgIHsxLCAxLCAwLCAwfSwJCQkvKiBQQ0xFQSBkb2Vzbid0IGNvbWUgQllURSAqLworICB7MzI3NjcsIC0zMjc2OCwgMiwgVEFCIChQQ0xFQSwgTE9ORyl9LAorICB7MCwgMCwgNiwgMH0sCisgIHsxLCAxLCAwLCAwfSwKKworICAvKiBGb3IsIGUuZy4sIGptcCBwY3JlbCBpbmRleGVkLiAgKi8KKyAgezEyNSwgLTEzMCwgMCwgVEFCIChQQ0lOREVYLCBTSE9SVCl9LAorICB7MzI3NjUsIC0zMjc3MCwgMiwgVEFCIChQQ0lOREVYLCBMT05HKX0sCisgIHswLCAwLCA0LCAwfSwKKyAgezEsIDEsIDAsIDB9LAorfTsKKworLyogVGhlc2UgYXJlIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgVGhlc2UgYXJlIGluY2x1ZGVkIHNvCisgICB0aGUgYXNzZW1ibGVyIGNhbiB3b3JrIG9uIHRoZSBvdXRwdXQgZnJvbSB0aGUgU1VOIEMgY29tcGlsZXIsIHdoaWNoCisgICBnZW5lcmF0ZXMgdGhlc2UuCisgICAqLworCisvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCisgICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgorICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKKyAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAorICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAgICovCitjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworICB7ImRhdGExIiwgc19kYXRhMSwgMH0sCisgIHsiZGF0YTIiLCBzX2RhdGEyLCAwfSwKKyAgeyJic3MiLCBzX2JzcywgMH0sCisgIHsiZXZlbiIsIHNfZXZlbiwgMH0sCisgIHsic2tpcCIsIHNfc3BhY2UsIDB9LAorICB7InByb2MiLCBzX3Byb2MsIDB9LAorI2lmIGRlZmluZWQgKFRFX1NVTjMpIHx8IGRlZmluZWQgKE9CSl9FTEYpCisgIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKyAgeyJzd2JlZyIsIHNfaWdub3JlLCAwfSwKKyNlbmRpZgorICB7ImV4dGVuZCIsIGZsb2F0X2NvbnMsICd4J30sCisgIHsibGRvdWJsZSIsIGZsb2F0X2NvbnMsICd4J30sCisKKyAgLyogVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGFyZSBzdXBwb3J0ZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KKyAgeyJjaGlwIiwgc19jaGlwLCAwfSwKKyAgeyJjb21saW5lIiwgc19zcGFjZSwgMX0sCisgIHsiZm9wdCIsIHNfZm9wdCwgMH0sCisgIHsibWFzazIiLCBzX2lnbm9yZSwgMH0sCisgIHsib3B0Iiwgc19vcHQsIDB9LAorICB7InJlZyIsIHNfcmVnLCAwfSwKKyAgeyJyZXN0b3JlIiwgc19yZXN0b3JlLCAwfSwKKyAgeyJzYXZlIiwgc19zYXZlLCAwfSwKKworICB7ImlmIiwgc19tcmlfaWYsIDB9LAorICB7ImlmLmIiLCBzX21yaV9pZiwgJ2InfSwKKyAgeyJpZi53Iiwgc19tcmlfaWYsICd3J30sCisgIHsiaWYubCIsIHNfbXJpX2lmLCAnbCd9LAorICB7ImVsc2UiLCBzX21yaV9lbHNlLCAwfSwKKyAgeyJlbHNlLnMiLCBzX21yaV9lbHNlLCAncyd9LAorICB7ImVsc2UubCIsIHNfbXJpX2Vsc2UsICdsJ30sCisgIHsiZW5kaSIsIHNfbXJpX2VuZGksIDB9LAorICB7ImJyZWFrIiwgc19tcmlfYnJlYWssIDB9LAorICB7ImJyZWFrLnMiLCBzX21yaV9icmVhaywgJ3MnfSwKKyAgeyJicmVhay5sIiwgc19tcmlfYnJlYWssICdsJ30sCisgIHsibmV4dCIsIHNfbXJpX25leHQsIDB9LAorICB7Im5leHQucyIsIHNfbXJpX25leHQsICdzJ30sCisgIHsibmV4dC5sIiwgc19tcmlfbmV4dCwgJ2wnfSwKKyAgeyJmb3IiLCBzX21yaV9mb3IsIDB9LAorICB7ImZvci5iIiwgc19tcmlfZm9yLCAnYid9LAorICB7ImZvci53Iiwgc19tcmlfZm9yLCAndyd9LAorICB7ImZvci5sIiwgc19tcmlfZm9yLCAnbCd9LAorICB7ImVuZGYiLCBzX21yaV9lbmRmLCAwfSwKKyAgeyJyZXBlYXQiLCBzX21yaV9yZXBlYXQsIDB9LAorICB7InVudGlsIiwgc19tcmlfdW50aWwsIDB9LAorICB7InVudGlsLmIiLCBzX21yaV91bnRpbCwgJ2InfSwKKyAgeyJ1bnRpbC53Iiwgc19tcmlfdW50aWwsICd3J30sCisgIHsidW50aWwubCIsIHNfbXJpX3VudGlsLCAnbCd9LAorICB7IndoaWxlIiwgc19tcmlfd2hpbGUsIDB9LAorICB7IndoaWxlLmIiLCBzX21yaV93aGlsZSwgJ2InfSwKKyAgeyJ3aGlsZS53Iiwgc19tcmlfd2hpbGUsICd3J30sCisgIHsid2hpbGUubCIsIHNfbXJpX3doaWxlLCAnbCd9LAorICB7ImVuZHciLCBzX21yaV9lbmR3LCAwfSwKKworICB7MCwgMCwgMH0KK307CisKKworLyogVGhlIG1vdGUgcHNldWRvIG9wcyBhcmUgcHV0IGludG8gdGhlIG9wY29kZSB0YWJsZSwgc2luY2UgdGhleQorICAgZG9uJ3Qgc3RhcnQgd2l0aCBhIC4gdGhleSBsb29rIGxpa2Ugb3Bjb2RlcyB0byBnYXMuCisgICAqLworCisjaWZkZWYgTTY4S0NPRkYKK2V4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7CisjZW5kaWYKKworQ09OU1QgcHNldWRvX3R5cGVTIG1vdGVfcHNldWRvX3RhYmxlW10gPQoreworCisgIHsiZGNsIiwgY29ucywgNH0sCisgIHsiZGMiLCBjb25zLCAyfSwKKyAgeyJkY3ciLCBjb25zLCAyfSwKKyAgeyJkY2IiLCBjb25zLCAxfSwKKworICB7ImRzbCIsIHNfc3BhY2UsIDR9LAorICB7ImRzIiwgc19zcGFjZSwgMn0sCisgIHsiZHN3Iiwgc19zcGFjZSwgMn0sCisgIHsiZHNiIiwgc19zcGFjZSwgMX0sCisKKyAgeyJ4ZGVmIiwgc19nbG9ibCwgMH0sCisjaWZkZWYgT0JKX0VMRgorICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCisjZWxzZQorICB7ImFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKKyNlbmRpZgorI2lmZGVmIE02OEtDT0ZGCisgIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAorICB7InNlY3Rpb24iLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKKyNlbmRpZgorICB7MCwgMCwgMH0KK307CisKKyNkZWZpbmUgaXNzYnl0ZSh4KQkoKHgpPj0tMTI4ICYmICh4KTw9MTI3KQorI2RlZmluZSBpc3VieXRlKHgpCSgoeCk+PTAgJiYgKHgpPD0yNTUpCisjZGVmaW5lIGlzc3dvcmQoeCkJKCh4KT49LTMyNzY4ICYmICh4KTw9MzI3NjcpCisjZGVmaW5lIGlzdXdvcmQoeCkJKCh4KT49MCAmJiAoeCk8PTY1NTM1KQorCisjZGVmaW5lIGlzYnl0ZSh4KQkoKHgpPj0gLTI1NSAmJiAoeCk8PTI1NSkKKyNkZWZpbmUgaXN3b3JkKHgpCSgoeCk+PS02NTUzNiAmJiAoeCk8PTY1NTM1KQorI2RlZmluZSBpc2xvbmcoeCkJKDEpCisKK2V4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7CisKK3N0YXRpYyBjaGFyIG1rbG93ZXJfdGFibGVbMjU2XTsKKyNkZWZpbmUgbWtsb3dlcihjKSAobWtsb3dlcl90YWJsZVsodW5zaWduZWQgY2hhcikoYyldKQorc3RhdGljIGNoYXIgbm90ZW5kX3RhYmxlWzI1Nl07CitzdGF0aWMgY2hhciBhbHRfbm90ZW5kX3RhYmxlWzI1Nl07CisjZGVmaW5lIG5vdGVuZChzKQkJCQkJCVwKKyAgKCEgKG5vdGVuZF90YWJsZVsodW5zaWduZWQgY2hhcikgKnNdCQkJCVwKKyAgICAgIHx8ICgqcyA9PSAnOicJCQkJCQlcCisJICAmJiBhbHRfbm90ZW5kX3RhYmxlWyh1bnNpZ25lZCBjaGFyKSBzWzFdXSkpKQorCisjaWYgZGVmaW5lZCAoTTY4S0NPRkYpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQorCisjaWZkZWYgTk9fUENSRUxfUkVMT0NTCisKK2ludAorbWFrZV9wY3JlbF9hYnNvbHV0ZShmaXhQLCBhZGRfbnVtYmVyKQorICAgIGZpeFMgKmZpeFA7CisgICAgbG9uZyAqYWRkX251bWJlcjsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlID0gZml4UC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlOworCisgIC8qIHJld3JpdGUgdGhlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB0byBhYnNvbHV0ZSBhZGRyZXNzIG9uZXMuCisgICAqIHRoZXNlIGFyZSBydW1vdXJlZCB0byBiZSBmYXN0ZXIsIGFuZCB0aGUgYXBvbGxvIGxpbmtlciByZWZ1c2VzCisgICAqIHRvIGRlYWwgd2l0aCB0aGUgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCisgICAqLworICBpZiAob3Bjb2RlWzBdID09IDB4NjAgJiYgb3Bjb2RlWzFdID09IDB4ZmYpIC8qIEJSQSAtPiBKTVAgKi8KKyAgICB7CisgICAgICBvcGNvZGVbMF0gPSAweDRlOworICAgICAgb3Bjb2RlWzFdID0gMHhmOTsKKyAgICB9CisgIGVsc2UgaWYgKG9wY29kZVswXSA9PSAweDYxICYmIG9wY29kZVsxXSA9PSAweGZmKSAvKiBCU1IgLT4gSlNSICovCisgICAgeworICAgICAgb3Bjb2RlWzBdID0gMHg0ZTsKKyAgICAgIG9wY29kZVsxXSA9IDB4Yjk7CisgICAgfQorICBlbHNlCisgICAgYXNfZmF0YWwgKF8oIlVua25vd24gUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24iKSk7CisgICphZGRfbnVtYmVyIC09IDQ7CisgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogTk9fUENSRUxfUkVMT0NTICovCisKK3Nob3J0Cit0Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgaWYgKGZpeFAtPmZ4X3RjYml0ICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKKyAgICByZXR1cm4gUl9SRUxMT05HX05FRzsKKyNpZmRlZiBOT19QQ1JFTF9SRUxPQ1MKKyAga25vdyAoZml4UC0+ZnhfcGNyZWwgPT0gMCk7CisgIHJldHVybiAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFCisJICA6IGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfRElSMTYKKwkgIDogUl9ESVIzMik7CisjZWxzZQorICByZXR1cm4gKGZpeFAtPmZ4X3BjcmVsID8KKwkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1BDUkJZVEUgOgorCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUENSV09SRCA6CisJICAgUl9QQ1JMT05HKSA6CisJICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9SRUxCWVRFIDoKKwkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1JFTFdPUkQgOgorCSAgIFJfUkVMTE9ORykpOworI2VuZGlmCit9CisKKyNlbmRpZgorCisjaWZkZWYgT0JKX0VMRgorCisvKiBDb21wdXRlIHRoZSByZWxvY2F0aW9uIGNvZGUgZm9yIGEgZml4dXAgb2YgU0laRSBieXRlcywgdXNpbmcgcGMKKyAgIHJlbGF0aXZlIHJlbG9jYXRpb24gaWYgUENSRUwgaXMgbm9uLXplcm8uICBQSUMgc2F5cyB3aGV0aGVyIGEgc3BlY2lhbAorICAgcGljIHJlbG9jYXRpb24gd2FzIHJlcXVlc3RlZC4gICovCisKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgZ2V0X3JlbG9jX2NvZGUKKyAgUEFSQU1TICgoaW50LCBpbnQsIGVudW0gcGljX3JlbG9jYXRpb24pKTsKKworc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQorZ2V0X3JlbG9jX2NvZGUgKHNpemUsIHBjcmVsLCBwaWMpCisgICAgIGludCBzaXplOworICAgICBpbnQgcGNyZWw7CisgICAgIGVudW0gcGljX3JlbG9jYXRpb24gcGljOworeworICBzd2l0Y2ggKHBpYykKKyAgICB7CisgICAgY2FzZSBwaWNfZ290X3BjcmVsOgorICAgICAgc3dpdGNoIChzaXplKQorCXsKKwljYXNlIDE6CisJICByZXR1cm4gQkZEX1JFTE9DXzhfR09UX1BDUkVMOworCWNhc2UgMjoKKwkgIHJldHVybiBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOworCWNhc2UgNDoKKwkgIHJldHVybiBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBwaWNfZ290X29mZjoKKyAgICAgIHN3aXRjaCAoc2l6ZSkKKwl7CisJY2FzZSAxOgorCSAgcmV0dXJuIEJGRF9SRUxPQ184X0dPVE9GRjsKKwljYXNlIDI6CisJICByZXR1cm4gQkZEX1JFTE9DXzE2X0dPVE9GRjsKKwljYXNlIDQ6CisJICByZXR1cm4gQkZEX1JFTE9DXzMyX0dPVE9GRjsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgcGljX3BsdF9wY3JlbDoKKyAgICAgIHN3aXRjaCAoc2l6ZSkKKwl7CisJY2FzZSAxOgorCSAgcmV0dXJuIEJGRF9SRUxPQ184X1BMVF9QQ1JFTDsKKwljYXNlIDI6CisJICByZXR1cm4gQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDsKKwljYXNlIDQ6CisJICByZXR1cm4gQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgcGljX3BsdF9vZmY6CisgICAgICBzd2l0Y2ggKHNpemUpCisJeworCWNhc2UgMToKKwkgIHJldHVybiBCRkRfUkVMT0NfOF9QTFRPRkY7CisJY2FzZSAyOgorCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QTFRPRkY7CisJY2FzZSA0OgorCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9QTFRPRkY7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHBpY19ub25lOgorICAgICAgaWYgKHBjcmVsKQorCXsKKwkgIHN3aXRjaCAoc2l6ZSkKKwkgICAgeworCSAgICBjYXNlIDE6CisJICAgICAgcmV0dXJuIEJGRF9SRUxPQ184X1BDUkVMOworCSAgICBjYXNlIDI6CisJICAgICAgcmV0dXJuIEJGRF9SRUxPQ18xNl9QQ1JFTDsKKwkgICAgY2FzZSA0OgorCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMzJfUENSRUw7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChzaXplKQorCSAgICB7CisJICAgIGNhc2UgMToKKwkgICAgICByZXR1cm4gQkZEX1JFTE9DXzg7CisJICAgIGNhc2UgMjoKKwkgICAgICByZXR1cm4gQkZEX1JFTE9DXzE2OworCSAgICBjYXNlIDQ6CisJICAgICAgcmV0dXJuIEJGRF9SRUxPQ18zMjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKHBjcmVsKQorICAgIHsKKyAgICAgIGlmIChwaWMgPT0gcGljX25vbmUpCisJYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbiIpLCBzaXplKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSBwaWMgcmVsb2NhdGlvbiIpLCBzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocGljID09IHBpY19ub25lKQorCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24iKSwgc2l6ZSk7CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcGljIHJlbG9jYXRpb24iKSwgc2l6ZSk7CisgICAgfQorCisgIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKK30KKworLyogSGVyZSB3ZSBkZWNpZGUgd2hpY2ggZml4dXBzIGNhbiBiZSBhZGp1c3RlZCB0byBtYWtlIHRoZW0gcmVsYXRpdmUKKyAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gaW5zdGVhZCBvZiB0aGUgc3ltYm9sLiAgQmFzaWNhbGx5CisgICB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBkb25lCisgICBjb3JyZWN0bHksIHNvIGluIHNvbWUgY2FzZXMgd2UgZm9yY2UgdGhlIG9yaWdpbmFsIHN5bWJvbCB0byBiZQorICAgdXNlZC4gICovCitpbnQKK3RjX202OGtfZml4X2FkanVzdGFibGUgKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLworICBpZiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCisgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICByZXR1cm4gMDsKKworICAvKiBhZGp1c3RfcmVsb2Nfc3ltcyBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIEdPVCAqLworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RfUENSRUw6CisgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgorICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTDoKKyAgICBjYXNlIEJGRF9SRUxPQ184X0dPVE9GRjoKKyAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6CisgICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UT0ZGOgorICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUX1BDUkVMOgorICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDoKKyAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRfUENSRUw6CisgICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRPRkY6CisgICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUT0ZGOgorICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorICAgICAgcmV0dXJuIDA7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisjZWxzZSAvKiAhT0JKX0VMRiAqLworCisjZGVmaW5lIGdldF9yZWxvY19jb2RlKFNJWkUsUENSRUwsT1RIRVIpIE5PX1JFTE9DCisKKyNlbmRpZiAvKiBPQkpfRUxGICovCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisKK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQorICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgYXJlbGVudCAqcmVsb2M7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworCisgIGlmIChmaXhwLT5meF90Y2JpdCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19OT05FKQorICAgIHsKKyAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7CisKKyAgICAgIC8qIFNpbmNlIERJRkZfRVhQUl9PSyBpcyBkZWZpbmVkIGluIHRjLW02OGsuaCwgaXQgaXMgcG9zc2libGUKKyAgICAgICAgIHRoYXQgZml4dXBfc2VnbWVudCBjb252ZXJ0ZWQgYSBub24tUEMgcmVsYXRpdmUgcmVsb2MgaW50byBhCisgICAgICAgICBQQyByZWxhdGl2ZSByZWxvYy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlCisgICAgICAgICByZWxvYyBjb2RlLiAgKi8KKyAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKKwl7CisJICBzd2l0Y2ggKGNvZGUpCisJICAgIHsKKwkgICAgY2FzZSBCRkRfUkVMT0NfODoKKwkgICAgICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQkZEX1JFTE9DXzE2OgorCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6CisJICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgorCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKKwkgICAgY2FzZSBCRkRfUkVMT0NfOF9HT1RfUENSRUw6CisJICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKKwkgICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOgorCSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVE9GRjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgorCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RPRkY6CisJICAgIGNhc2UgQkZEX1JFTE9DXzhfUExUX1BDUkVMOgorCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRfUENSRUw6CisJICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDoKKwkgICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRPRkY6CisJICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVE9GRjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUT0ZGOgorCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCSAgICBfKCJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIiksCisJCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisjZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQorICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCisJeworI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGKFNaLFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKKwkgIE1BUCAoMSwgMCwgQkZEX1JFTE9DXzgpOworCSAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOworCSAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOworCSAgTUFQICgxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7CisJICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7CisJICBNQVAgKDQsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisjdW5kZWYgRgorI3VuZGVmIE1BUAorCisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKyAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisjaWZuZGVmIE9CSl9FTEYKKyAgaWYgKGZpeHAtPmZ4X3BjcmVsKQorICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7CisgIGVsc2UKKyAgICByZWxvYy0+YWRkZW5kID0gMDsKKyNlbHNlCisgIGlmICghZml4cC0+ZnhfcGNyZWwpCisgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKKyAgZWxzZQorICAgIHJlbG9jLT5hZGRlbmQgPSAoc2VjdGlvbi0+dm1hCisJCSAgICAgKyAoZml4cC0+ZnhfcGNyZWxfYWRqdXN0ID09IDY0CisJCQk/IC0xIDogZml4cC0+ZnhfcGNyZWxfYWRqdXN0KQorCQkgICAgICsgZml4cC0+ZnhfYWRkbnVtYmVyCisJCSAgICAgKyBtZF9wY3JlbF9mcm9tIChmaXhwKSk7CisjZW5kaWYKKworICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7CisgIGFzc2VydCAocmVsb2MtPmhvd3RvICE9IDApOworCisgIHJldHVybiByZWxvYzsKK30KKworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KKworLyogUmV0dXJuIHplcm8gaWYgdGhlIHJlZmVyZW5jZSB0byBTWU1CT0wgZnJvbSB3aXRoaW4gdGhlIHNhbWUgc2VnbWVudCBtYXkKKyAgIGJlIHJlbGF4ZWQuICAqLworI2lmZGVmIE9CSl9FTEYKKworLyogT24gYW4gRUxGIHN5c3RlbSwgd2UgY2FuJ3QgcmVsYXggYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbCwKKyAgIGJlY2F1c2UgaXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgYSBzaGFyZWQgbGlicmFyeS4gIEhvd2V2ZXIsIGlmCisgICBUQVJHRVRfT1MgaXMgImVsZiIsIHRoZW4gd2UgcHJlc3VtZSB0aGF0IHdlIGFyZSBhc3NlbWJsaW5nIGZvciBhbgorICAgZW1iZWRkZWQgc3lzdGVtLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2hhcmVkCisgICBsaWJyYXJpZXMsIGFuZCB3ZSBjYW4gcmVsYXggYW55dGhpbmcuICAqLworCisjZGVmaW5lIHJlbGF4YWJsZV9zeW1ib2woc3ltYm9sKQkJXAorICAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSA9PSAwCQlcCisgICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW1ib2wpCQkJXAorICAgICAgICYmICEgU19JU19XRUFLIChzeW1ib2wpKSkKKworI2Vsc2UKKworI2RlZmluZSByZWxheGFibGVfc3ltYm9sKHN5bWJvbCkgMQorCisjZW5kaWYKKyAKKy8qIEhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUuICBOVUxMIG1lYW5zIGFueSB1c2UgYmVmb3JlCisgICBtNjhrX2lwX2JlZ2luKCkgd2lsbCBjcmFzaC4gICovCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKKwwKKy8qIEFzc2VtYmxlIGFuIG02OGsgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorbTY4a19pcCAoaW5zdHJpbmcpCisgICAgIGNoYXIgKmluc3RyaW5nOworeworICByZWdpc3RlciBjaGFyICpwOworICByZWdpc3RlciBzdHJ1Y3QgbTY4a19vcCAqb3BQOworICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKm9wY29kZTsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IHRtcHJlZyA9IDAsIGJhc2VvID0gMCwgb3V0cm8gPSAwLCBuZXh0d29yZDsKKyAgY2hhciAqcGRvdCwgKnBkb3Rtb3ZlOworICBlbnVtIG02OGtfc2l6ZSBzaXoxLCBzaXoyOworICBjaGFyIGM7CisgIGludCBsb3Npbmc7CisgIGludCBvcHNmb3VuZDsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbNl07CisgIExJVFRMRU5VTV9UWVBFICp3b3JkcDsKKyAgdW5zaWduZWQgbG9uZyBva19hcmNoID0gMDsKKworICBpZiAoKmluc3RyaW5nID09ICcgJykKKyAgICBpbnN0cmluZysrOwkJCS8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisKKyAgLyogU2NhbiB1cCB0byBlbmQgb2Ygb3BlcmF0aW9uLWNvZGUsIHdoaWNoIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcKKyAgICAgb3IgZXhhY3RseSAxIHNwYWNlLiAqLworICBwZG90ID0gMDsKKyAgZm9yIChwID0gaW5zdHJpbmc7ICpwICE9ICdcMCc7IHArKykKKyAgICB7CisgICAgICBpZiAoKnAgPT0gJyAnKQorCWJyZWFrOworICAgICAgaWYgKCpwID09ICcuJykKKwlwZG90ID0gcDsKKyAgICB9CisKKyAgaWYgKHAgPT0gaW5zdHJpbmcpCisgICAgeworICAgICAgdGhlX2lucy5lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHAgbm93IHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBvcGNvZGUgbmFtZSwgcHJvYmFibHkgd2hpdGVzcGFjZS4KKyAgICAgTWFrZSBzdXJlIHRoZSBuYW1lIGlzIG51bGwgdGVybWluYXRlZCBieSBjbG9iYmVyaW5nIHRoZQorICAgICB3aGl0ZXNwYWNlLCBsb29rIGl0IHVwIGluIHRoZSBoYXNoIHRhYmxlLCB0aGVuIGZpeCBpdCBiYWNrLgorICAgICBSZW1vdmUgYSBkb3QsIGZpcnN0LCBzaW5jZSB0aGUgb3Bjb2RlIHRhYmxlcyBoYXZlIG5vbmUuICAqLworICBpZiAocGRvdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAocGRvdG1vdmUgPSBwZG90OyBwZG90bW92ZSA8IHA7IHBkb3Rtb3ZlKyspCisJKnBkb3Rtb3ZlID0gcGRvdG1vdmVbMV07CisgICAgICBwLS07CisgICAgfQorCisgIGMgPSAqcDsKKyAgKnAgPSAnXDAnOworICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IG02OGtfaW5jYW50ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOworICAqcCA9IGM7CisKKyAgaWYgKHBkb3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBmb3IgKHBkb3Rtb3ZlID0gcDsgcGRvdG1vdmUgPiBwZG90OyBwZG90bW92ZS0tKQorCSpwZG90bW92ZSA9IHBkb3Rtb3ZlWy0xXTsKKyAgICAgICpwZG90ID0gJy4nOworICAgICAgKytwOworICAgIH0KKworICBpZiAob3Bjb2RlID09IE5VTEwpCisgICAgeworICAgICAgdGhlX2lucy5lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogZm91bmQgYSBsZWdpdGltYXRlIG9wY29kZSwgc3RhcnQgbWF0Y2hpbmcgb3BlcmFuZHMgKi8KKyAgd2hpbGUgKCpwID09ICcgJykKKyAgICArK3A7CisKKyAgaWYgKG9wY29kZS0+bV9vcGVyYW5kcyA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgKm9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICpvbGQgPSAnXG4nOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKKyAgICAgIC8qIEFoaCAtIGl0J3MgYSBtb3Rvcm9sYSBzdHlsZSBwc3VlZG8gb3AgKi8KKyAgICAgIG1vdGVfcHNldWRvX3RhYmxlW29wY29kZS0+bV9vcG51bV0ucG9jX2hhbmRsZXIKKwkobW90ZV9wc2V1ZG9fdGFibGVbb3Bjb2RlLT5tX29wbnVtXS5wb2NfdmFsKTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZDsKKyAgICAgICpvbGQgPSAwOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChmbGFnX21yaSAmJiBvcGNvZGUtPm1fb3BudW0gPT0gMCkKKyAgICB7CisgICAgICAvKiBJbiBNUkkgbW9kZSwgcmFuZG9tIGdhcmJhZ2UgaXMgYWxsb3dlZCBhZnRlciBhbiBpbnN0cnVjdGlvbgorICAgICAgICAgd2hpY2ggYWNjZXB0cyBubyBvcGVyYW5kcy4gICovCisgICAgICB0aGVfaW5zLmFyZ3MgPSBvcGNvZGUtPm1fb3BlcmFuZHM7CisgICAgICB0aGVfaW5zLm51bWFyZ3MgPSBvcGNvZGUtPm1fb3BudW07CisgICAgICB0aGVfaW5zLm51bW8gPSBvcGNvZGUtPm1fY29kZW51bTsKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzBdID0gZ2V0b25lIChvcGNvZGUpOworICAgICAgdGhlX2lucy5vcGNvZGVbMV0gPSBnZXR0d28gKG9wY29kZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZvciAob3BQID0gJnRoZV9pbnMub3BlcmFuZHNbMF07ICpwOyBvcFArKykKKyAgICB7CisgICAgICBwID0gY3JhY2tfb3BlcmFuZCAocCwgb3BQKTsKKworICAgICAgaWYgKG9wUC0+ZXJyb3IpCisJeworCSAgdGhlX2lucy5lcnJvciA9IG9wUC0+ZXJyb3I7CisJICByZXR1cm47CisJfQorICAgIH0KKworICBvcHNmb3VuZCA9IG9wUCAtICZ0aGVfaW5zLm9wZXJhbmRzWzBdOworCisgIC8qIFRoaXMgdWdseSBoYWNrIGlzIHRvIHN1cHBvcnQgdGhlIGZsb2F0aW5nIHB0IG9wY29kZXMgaW4gdGhlaXIKKyAgICAgc3RhbmRhcmQgZm9ybS4gIEVzc2VudGlhbGx5LCB3ZSBmYWtlIGEgZmlyc3QgZW50eSBvZiB0eXBlIENPUCMxICovCisgIGlmIChvcGNvZGUtPm1fb3BlcmFuZHNbMF0gPT0gJ0knKQorICAgIHsKKyAgICAgIGludCBuOworCisgICAgICBmb3IgKG4gPSBvcHNmb3VuZDsgbiA+IDA7IC0tbikKKwl0aGVfaW5zLm9wZXJhbmRzW25dID0gdGhlX2lucy5vcGVyYW5kc1tuIC0gMV07CisKKyAgICAgIG1lbXNldCAoKGNoYXIgKikgKCZ0aGVfaW5zLm9wZXJhbmRzWzBdKSwgJ1wwJywKKwkgICAgICBzaXplb2YgKHRoZV9pbnMub3BlcmFuZHNbMF0pKTsKKyAgICAgIHRoZV9pbnMub3BlcmFuZHNbMF0ubW9kZSA9IENPTlRST0w7CisgICAgICB0aGVfaW5zLm9wZXJhbmRzWzBdLnJlZyA9IG02OGtfZmxvYXRfY29wbnVtOworICAgICAgb3BzZm91bmQrKzsKKyAgICB9CisKKyAgLyogV2UndmUgZ290IHRoZSBvcGVyYW5kcy4gIEZpbmQgYW4gb3Bjb2RlIHRoYXQnbGwgYWNjZXB0IHRoZW0gKi8KKyAgZm9yIChsb3NpbmcgPSAwOzspCisgICAgeworICAgICAgLyogSWYgd2UgZGlkbid0IGdldCB0aGUgcmlnaHQgbnVtYmVyIG9mIG9wcywgb3Igd2UgaGF2ZSBubworCSBjb21tb24gbW9kZWwgd2l0aCB0aGlzIHBhdHRlcm4gdGhlbiByZWplY3QgdGhpcyBwYXR0ZXJuLiAqLworCisgICAgICBva19hcmNoIHw9IG9wY29kZS0+bV9hcmNoOworICAgICAgaWYgKG9wc2ZvdW5kICE9IG9wY29kZS0+bV9vcG51bQorCSAgfHwgKChvcGNvZGUtPm1fYXJjaCAmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSAwKSkKKwkrK2xvc2luZzsKKyAgICAgIGVsc2UKKwl7CisJICBmb3IgKHMgPSBvcGNvZGUtPm1fb3BlcmFuZHMsIG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOworCSAgICAgICAqcyAmJiAhbG9zaW5nOworCSAgICAgICBzICs9IDIsIG9wUCsrKQorCSAgICB7CisJICAgICAgLyogV2FybmluZzogdGhpcyBzd2l0Y2ggaXMgaHVnZSEgKi8KKwkgICAgICAvKiBJJ3ZlIHRyaWVkIHRvIG9yZ2FuaXplIHRoZSBjYXNlcyBpbnRvIHRoaXMgb3JkZXI6CisJCSBub24tYWxwaGEgZmlyc3QsIHRoZW4gYWxwaGEgYnkgbGV0dGVyLiAgTG93ZXItY2FzZQorCQkgZ29lcyBkaXJlY3RseSBiZWZvcmUgdXBwZXJjYXNlIGNvdW50ZXJwYXJ0LiAgKi8KKwkgICAgICAvKiBDb2RlIHdpdGggbXVsdGlwbGUgY2FzZSAuLi46IGdldHMgc29ydGVkIGJ5IHRoZSBsb3dlc3QKKwkJIGNhc2UgLi4uIGl0IGJlbG9uZ3MgdG8uICBJIGhvcGUgdGhpcyBtYWtlcyBzZW5zZS4gICovCisJICAgICAgc3dpdGNoICgqcykKKwkJeworCQljYXNlICchJzoKKwkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgSU1NRUQ6CisJCSAgICBjYXNlIERSRUc6CisJCSAgICBjYXNlIEFSRUc6CisJCSAgICBjYXNlIEZQUkVHOgorCQkgICAgY2FzZSBDT05UUk9MOgorCQkgICAgY2FzZSBBSU5DOgorCQkgICAgY2FzZSBBREVDOgorCQkgICAgY2FzZSBSRUdMU1Q6CisJCSAgICAgIGxvc2luZysrOworCQkgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGJyZWFrOworCisJCWNhc2UgJzwnOgorCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkgICAgeworCQkgICAgY2FzZSBEUkVHOgorCQkgICAgY2FzZSBBUkVHOgorCQkgICAgY2FzZSBGUFJFRzoKKwkJICAgIGNhc2UgQ09OVFJPTDoKKwkJICAgIGNhc2UgSU1NRUQ6CisJCSAgICBjYXNlIEFERUM6CisJCSAgICBjYXNlIFJFR0xTVDoKKwkJICAgICAgbG9zaW5nKys7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnPic6CisJCSAgc3dpdGNoIChvcFAtPm1vZGUpCisJCSAgICB7CisJCSAgICBjYXNlIERSRUc6CisJCSAgICBjYXNlIEFSRUc6CisJCSAgICBjYXNlIEZQUkVHOgorCQkgICAgY2FzZSBDT05UUk9MOgorCQkgICAgY2FzZSBJTU1FRDoKKwkJICAgIGNhc2UgQUlOQzoKKwkJICAgIGNhc2UgUkVHTFNUOgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIEFCU0w6CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDCisJCQkgIHx8IG9wUC0+cmVnID09IFpQQykKKwkJCWxvc2luZysrOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBicmVhazsKKworCQljYXNlICdtJzoKKwkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgRFJFRzoKKwkJICAgIGNhc2UgQVJFRzoKKwkJICAgIGNhc2UgQUlORFI6CisJCSAgICBjYXNlIEFJTkM6CisJCSAgICBjYXNlIEFERUM6CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgbG9zaW5nKys7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlICduJzoKKwkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgRElTUDoKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgJ28nOgorCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkgICAgeworCQkgICAgY2FzZSBCQVNFOgorCQkgICAgY2FzZSBBQlNMOgorCQkgICAgY2FzZSBJTU1FRDoKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgJ3AnOgorCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkgICAgeworCQkgICAgY2FzZSBEUkVHOgorCQkgICAgY2FzZSBBUkVHOgorCQkgICAgY2FzZSBBSU5EUjoKKwkJICAgIGNhc2UgQUlOQzoKKwkJICAgIGNhc2UgQURFQzoKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIERJU1A6CisJCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCisgICAgICAgICAgICAgICAgICAgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgJ3EnOgorCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkgICAgeworCQkgICAgY2FzZSBEUkVHOgorCQkgICAgY2FzZSBBSU5EUjoKKwkJICAgIGNhc2UgQUlOQzoKKwkJICAgIGNhc2UgQURFQzoKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIERJU1A6CisJCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCisgICAgICAgICAgICAgICAgICAgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlICd2JzoKKwkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgRFJFRzoKKwkJICAgIGNhc2UgQUlORFI6CisJCSAgICBjYXNlIEFJTkM6CisJCSAgICBjYXNlIEFERUM6CisJCSAgICBjYXNlIEFCU0w6CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBESVNQOgorCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9zaW5nKys7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgbG9zaW5nKys7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGJyZWFrOworCisJCWNhc2UgJyMnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCisJCSAgICBsb3NpbmcrKzsKKwkJICBlbHNlIGlmIChzWzFdID09ICdiJworCQkJICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKKwkJCSAgICYmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAorCQkJICAgICAgIHx8ICEgaXNieXRlIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQorCQkgICAgbG9zaW5nKys7CisJCSAgZWxzZSBpZiAoc1sxXSA9PSAnQicKKwkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCisJCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKKwkJCSAgICAgICB8fCAhIGlzc2J5dGUgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkpCisJCSAgICBsb3NpbmcrKzsKKwkJICBlbHNlIGlmIChzWzFdID09ICd3JworCQkJICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKKwkJCSAgICYmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAorCQkJICAgICAgIHx8ICEgaXN3b3JkIChvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlcikpKQorCQkgICAgbG9zaW5nKys7CisJCSAgZWxzZSBpZiAoc1sxXSA9PSAnVycKKwkJCSAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCisJCQkgICAmJiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKKwkJCSAgICAgICB8fCAhIGlzc3dvcmQgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICdeJzoKKwkJY2FzZSAnVCc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJyQnOgorCQkgIGlmIChvcFAtPm1vZGUgPT0gQVJFRworCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gQ09OVFJPTAorCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcKKwkJICAgICAgfHwgb3BQLT5tb2RlID09IElNTUVECisJCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QKKwkJICAgICAgfHwgKG9wUC0+bW9kZSAhPSBBQlNMCisJCQkgICYmIChvcFAtPnJlZyA9PSBQQworCQkJICAgICAgfHwgb3BQLT5yZWcgPT0gWlBDKSkpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICclJzoKKwkJICBpZiAob3BQLT5tb2RlID09IENPTlRST0wKKwkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCisJCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QKKwkJICAgICAgfHwgb3BQLT5tb2RlID09IElNTUVECisJCSAgICAgIHx8IChvcFAtPm1vZGUgIT0gQUJTTAorCQkJICAmJiAob3BQLT5yZWcgPT0gUEMKKwkJCSAgICAgIHx8IG9wUC0+cmVnID09IFpQQykpKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnJic6CisJCSAgc3dpdGNoIChvcFAtPm1vZGUpCisJCSAgICB7CisJCSAgICBjYXNlIERSRUc6CisJCSAgICBjYXNlIEFSRUc6CisJCSAgICBjYXNlIEZQUkVHOgorCQkgICAgY2FzZSBDT05UUk9MOgorCQkgICAgY2FzZSBJTU1FRDoKKwkJICAgIGNhc2UgQUlOQzoKKwkJICAgIGNhc2UgQURFQzoKKwkJICAgIGNhc2UgUkVHTFNUOgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIEFCU0w6CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDCisJCQkgIHx8IG9wUC0+cmVnID09IFpQQykKKwkJCWxvc2luZysrOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBicmVhazsKKworCQljYXNlICcqJzoKKwkJICBpZiAob3BQLT5tb2RlID09IENPTlRST0wKKwkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCisJCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICcrJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IEFJTkMpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICctJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IEFERUMpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICcvJzoKKwkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgQVJFRzoKKwkJICAgIGNhc2UgQ09OVFJPTDoKKwkJICAgIGNhc2UgRlBSRUc6CisJCSAgICBjYXNlIEFJTkM6CisJCSAgICBjYXNlIEFERUM6CisJCSAgICBjYXNlIElNTUVEOgorCQkgICAgY2FzZSBSRUdMU1Q6CisJCSAgICAgIGxvc2luZysrOworCQkgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGJyZWFrOworCisJCWNhc2UgJzsnOgorCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkgICAgeworCQkgICAgY2FzZSBBUkVHOgorCQkgICAgY2FzZSBDT05UUk9MOgorCQkgICAgY2FzZSBGUFJFRzoKKwkJICAgIGNhc2UgUkVHTFNUOgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBicmVhazsKKworCQljYXNlICc/JzoKKwkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgQVJFRzoKKwkJICAgIGNhc2UgQ09OVFJPTDoKKwkJICAgIGNhc2UgRlBSRUc6CisJCSAgICBjYXNlIEFJTkM6CisJCSAgICBjYXNlIEFERUM6CisJCSAgICBjYXNlIElNTUVEOgorCQkgICAgY2FzZSBSRUdMU1Q6CisJCSAgICAgIGxvc2luZysrOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgQUJTTDoKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQorCQkJbG9zaW5nKys7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGJyZWFrOworCisJCWNhc2UgJ0AnOgorCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkgICAgeworCQkgICAgY2FzZSBBUkVHOgorCQkgICAgY2FzZSBDT05UUk9MOgorCQkgICAgY2FzZSBGUFJFRzoKKwkJICAgIGNhc2UgSU1NRUQ6CisJCSAgICBjYXNlIFJFR0xTVDoKKwkJICAgICAgbG9zaW5nKys7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnfic6CS8qIEZvciBub3chIChKRiBGT08gaXMgdGhpcyByaWdodD8pICovCisJCSAgc3dpdGNoIChvcFAtPm1vZGUpCisJCSAgICB7CisJCSAgICBjYXNlIERSRUc6CisJCSAgICBjYXNlIEFSRUc6CisJCSAgICBjYXNlIENPTlRST0w6CisJCSAgICBjYXNlIEZQUkVHOgorCQkgICAgY2FzZSBJTU1FRDoKKwkJICAgIGNhc2UgUkVHTFNUOgorCQkgICAgICBsb3NpbmcrKzsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIEFCU0w6CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDCisJCQkgIHx8IG9wUC0+cmVnID09IFpQQykKKwkJCWxvc2luZysrOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBicmVhazsKKworCQljYXNlICczJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKKwkJICAgICAgfHwgKG9wUC0+cmVnICE9IFRUMCAmJiBvcFAtPnJlZyAhPSBUVDEpKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnQSc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBBUkVHKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnYSc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBBSU5EUikKKwkJICAgICsrbG9zaW5nOworCQkgIGJyZWFrOworCisJCWNhc2UgJ0InOgkvKiBGT08gKi8KKwkJICBpZiAob3BQLT5tb2RlICE9IEFCU0wKKwkJICAgICAgfHwgKGZsYWdfbG9uZ19qdW1wcworCQkJICAmJiBzdHJuY21wIChpbnN0cmluZywgImpic3IiLCA0KSA9PSAwKSkKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ0MnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBDQ1IpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICdkJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IERJU1AKKwkJICAgICAgfHwgb3BQLT5yZWcgPCBBRERSMAorCQkgICAgICB8fCBvcFAtPnJlZyA+IEFERFI3KQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnRCc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBEUkVHKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnRic6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBGUFJFRykKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ0knOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAorCQkgICAgICB8fCBvcFAtPnJlZyA8IENPUDAKKwkJICAgICAgfHwgb3BQLT5yZWcgPiBDT1A3KQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnSic6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCisJCSAgICAgIHx8IG9wUC0+cmVnIDwgVVNQCisJCSAgICAgIHx8IG9wUC0+cmVnID4gbGFzdF9tb3ZlY19yZWcpCisJCSAgICBsb3NpbmcrKzsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciAqcnA7CisJCSAgICAgIGZvciAocnAgPSBjb250cm9sX3JlZ3M7ICpycDsgcnArKykKKwkJCWlmICgqcnAgPT0gb3BQLT5yZWcpCisJCQkgIGJyZWFrOworCQkgICAgICBpZiAoKnJwID09IDApCisJCQlsb3NpbmcrKzsKKwkJICAgIH0KKwkJICBicmVhazsKKworCQljYXNlICdrJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnbCc6CisJCWNhc2UgJ0wnOgorCQkgIGlmIChvcFAtPm1vZGUgPT0gRFJFRworCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gQVJFRworCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcpCisJCSAgICB7CisJCSAgICAgIGlmIChzWzFdID09ICc4JykKKwkJCWxvc2luZysrOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIHN3aXRjaCAob3BQLT5tb2RlKQorCQkJICAgIHsKKwkJCSAgICBjYXNlIERSRUc6CisJCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IChvcFAtPnJlZyAtIERBVEEwKTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgQVJFRzoKKwkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgKG9wUC0+cmVnIC0gQUREUjAgKyA4KTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgRlBSRUc6CisJCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IChvcFAtPnJlZyAtIEZQMCArIDE2KTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGRlZmF1bHQ6CisJCQkgICAgICBhYm9ydCAoKTsKKwkJCSAgICB9CisJCQkgIG9wUC0+bW9kZSA9IFJFR0xTVDsKKwkJCX0KKwkJICAgIH0KKwkJICBlbHNlIGlmIChvcFAtPm1vZGUgPT0gQ09OVFJPTCkKKwkJICAgIHsKKwkJICAgICAgaWYgKHNbMV0gIT0gJzgnKQorCQkJbG9zaW5nKys7CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgc3dpdGNoIChvcFAtPnJlZykKKwkJCSAgICB7CisJCQkgICAgY2FzZSBGUEk6CisJCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IDI0OworCQkJICAgICAgYnJlYWs7CisJCQkgICAgY2FzZSBGUFM6CisJCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IDI1OworCQkJICAgICAgYnJlYWs7CisJCQkgICAgY2FzZSBGUEM6CisJCQkgICAgICBvcFAtPm1hc2sgPSAxIDw8IDI2OworCQkJICAgICAgYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCSAgICAgIGxvc2luZysrOworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCQkJICBvcFAtPm1vZGUgPSBSRUdMU1Q7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZSBpZiAob3BQLT5tb2RlICE9IFJFR0xTVCkKKwkJICAgIGxvc2luZysrOworCQkgIGVsc2UgaWYgKHNbMV0gPT0gJzgnICYmIChvcFAtPm1hc2sgJiAweDBmZmZmZmYpICE9IDApCisJCSAgICBsb3NpbmcrKzsKKwkJICBlbHNlIGlmIChzWzFdID09ICczJyAmJiAob3BQLT5tYXNrICYgMHg3MDAwMDAwKSAhPSAwKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnTSc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKKwkJICAgIGxvc2luZysrOworCQkgIGVsc2UgaWYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50CisJCQkgICB8fCAhIGlzc2J5dGUgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkKKwkJICAgIGxvc2luZysrOworCQkgIGVsc2UgaWYgKCEgbTY4a19xdWljaworCQkJICAgJiYgaW5zdHJpbmdbM10gIT0gJ3EnCisJCQkgICAmJiBpbnN0cmluZ1s0XSAhPSAncScpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICdPJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IERSRUcKKwkJICAgICAgJiYgb3BQLT5tb2RlICE9IElNTUVECisJCSAgICAgICYmIG9wUC0+bW9kZSAhPSBBQlNMKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnUSc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKKwkJICAgIGxvc2luZysrOworCQkgIGVsc2UgaWYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50CisJCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA8IDEKKwkJCSAgIHx8IG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyID4gOCkKKwkJICAgIGxvc2luZysrOworCQkgIGVsc2UgaWYgKCEgbTY4a19xdWljaworCQkJICAgJiYgKHN0cm5jbXAgKGluc3RyaW5nLCAiYWRkIiwgMykgPT0gMAorCQkJICAgICAgIHx8IHN0cm5jbXAgKGluc3RyaW5nLCAic3ViIiwgMykgPT0gMCkKKwkJCSAgICYmIGluc3RyaW5nWzNdICE9ICdxJykKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ1InOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gRFJFRyAmJiBvcFAtPm1vZGUgIT0gQVJFRykKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ3InOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQUlORFIKKwkJICAgICAgJiYgKG9wUC0+bW9kZSAhPSBCQVNFCisJCQkgIHx8IChvcFAtPnJlZyAhPSAwCisJCQkgICAgICAmJiBvcFAtPnJlZyAhPSBaQUREUjApCisJCQkgIHx8IG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2Fic2VudAorCQkJICB8fCAoKG9wUC0+aW5kZXgucmVnIDwgREFUQTAKKwkJCSAgICAgICB8fCBvcFAtPmluZGV4LnJlZyA+IERBVEE3KQorCQkJICAgICAgJiYgKG9wUC0+aW5kZXgucmVnIDwgQUREUjAKKwkJCQkgIHx8IG9wUC0+aW5kZXgucmVnID4gQUREUjcpKQorCQkJICB8fCBvcFAtPmluZGV4LnNpemUgIT0gU0laRV9VTlNQRUMKKwkJCSAgfHwgb3BQLT5pbmRleC5zY2FsZSAhPSAxKSkKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAorCQkgICAgICB8fCAhIChvcFAtPnJlZyA9PSBGUEkKKwkJCSAgICB8fCBvcFAtPnJlZyA9PSBGUFMKKwkJCSAgICB8fCBvcFAtPnJlZyA9PSBGUEMpKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnUyc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFNSKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAndCc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKKwkJICAgIGxvc2luZysrOworCQkgIGVsc2UgaWYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50CisJCQkgICB8fCBvcFAtPmRpc3AuZXhwLlhfYWRkX251bWJlciA8IDAKKwkJCSAgIHx8IG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyID4gNykKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ1UnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBVU1ApCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQkgIC8qIEpGIHRoZXNlIGFyZSBvdXQgb2Ygb3JkZXIuICBXZSBjb3VsZCBwdXQgdGhlbQorCQkgICAgIGluIG9yZGVyIGlmIHdlIHdlcmUgd2lsbGluZyB0byBwdXQgdXAgd2l0aAorCQkgICAgIGJ1bmNoZXMgb2YgI2lmZGVmIG02ODg1MXMgaW4gdGhlIGNvZGUuCisKKwkJICAgICBEb24ndCBmb3JnZXQgdGhhdCB5b3UgbmVlZCB0aGVzZSBvcGVyYW5kcworCQkgICAgIHRvIHVzZSA2ODAzMCBNTVUgaW5zdHJ1Y3Rpb25zLiAgKi8KKyNpZm5kZWYgTk9fNjg4NTEKKwkJICAvKiBNZW1vcnkgYWRkcmVzc2luZyBtb2RlIHVzZWQgYnkgcGZsdXNociAqLworCQljYXNlICd8JzoKKwkJICBpZiAob3BQLT5tb2RlID09IENPTlRST0wKKwkJICAgICAgfHwgb3BQLT5tb2RlID09IEZQUkVHCisJCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBEUkVHCisJCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBBUkVHCisJCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBSRUdMU1QpCisJCSAgICBsb3NpbmcrKzsKKwkJICAvKiBXZSBzaG91bGQgYWNjZXB0IGltbWVkaWF0ZSBvcGVyYW5kcywgYnV0IHRoZXkKKyAgICAgICAgICAgICAgICAgICAgIHN1cHBvc2VkbHkgaGF2ZSB0byBiZSBxdWFkIHdvcmQsIGFuZCB3ZSBkb24ndAorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIHRoYXQuICBJIHdvdWxkIGxpa2UgdG8gc2VlIHdoYXQgYSBNb3Rvcm9sYQorICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGVyIGRvZXMgYmVmb3JlIGRvaW5nIHNvbWV0aGluZyBoZXJlLiAgKi8KKwkJICBpZiAob3BQLT5tb2RlID09IElNTUVEKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnZic6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCisJCSAgICAgIHx8IChvcFAtPnJlZyAhPSBTRkMgJiYgb3BQLT5yZWcgIT0gREZDKSkKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJzAnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBUQykKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJzEnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBBQykKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJzInOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAorCQkgICAgICB8fCAob3BQLT5yZWcgIT0gQ0FMCisJCQkgICYmIG9wUC0+cmVnICE9IFZBTAorCQkJICAmJiBvcFAtPnJlZyAhPSBTQ0MpKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnVic6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCisJCSAgICAgIHx8IG9wUC0+cmVnICE9IFZBTCkKKwkJICAgIGxvc2luZysrOworCQkgIGJyZWFrOworCisJCWNhc2UgJ1cnOgorCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAorCQkgICAgICB8fCAob3BQLT5yZWcgIT0gRFJQCisJCQkgICYmIG9wUC0+cmVnICE9IFNSUAorCQkJICAmJiBvcFAtPnJlZyAhPSBDUlApKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCisJCSAgICAgIHx8ICghKG9wUC0+cmVnID49IEJBRCAmJiBvcFAtPnJlZyA8PSBCQUQgKyA3KQorCQkJICAmJiAhKG9wUC0+cmVnID49IEJBQyAmJiBvcFAtPnJlZyA8PSBCQUMgKyA3KSkpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKworCQljYXNlICdZJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gUFNSKQorCQkgICAgbG9zaW5nKys7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnWic6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFBDU1IpCisJCSAgICBsb3NpbmcrKzsKKwkJICBicmVhazsKKyNlbmRpZgorCQljYXNlICdjJzoKKwkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKKwkJICAgICAgfHwgKG9wUC0+cmVnICE9IE5DCisJCQkgICYmIG9wUC0+cmVnICE9IElDCisJCQkgICYmIG9wUC0+cmVnICE9IERDCisJCQkgICYmIG9wUC0+cmVnICE9IEJDKSkKKwkJICAgIHsKKwkJICAgICAgbG9zaW5nKys7CisJCSAgICB9CQkvKiBub3QgYSBjYWNoZSBzcGVjaWZpZXIuICovCisJCSAgYnJlYWs7CisKKwkJY2FzZSAnXyc6CisJCSAgaWYgKG9wUC0+bW9kZSAhPSBBQlNMKQorCQkgICAgKytsb3Npbmc7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICBhYm9ydCAoKTsKKwkJfQkJLyogc3dpdGNoIG9uIHR5cGUgb2Ygb3BlcmFuZCAqLworCisJICAgICAgaWYgKGxvc2luZykKKwkJYnJlYWs7CisJICAgIH0JCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCisJfQkJCS8qIGlmIGltbWVkaWF0ZWx5IHdyb25nICovCisKKyAgICAgIGlmICghbG9zaW5nKQorCXsKKwkgIGJyZWFrOworCX0JCQkvKiBnb3QgaXQuICovCisKKyAgICAgIG9wY29kZSA9IG9wY29kZS0+bV9uZXh0OworCisgICAgICBpZiAoIW9wY29kZSkKKwl7CisJICBpZiAob2tfYXJjaAorCSAgICAgICYmICEob2tfYXJjaCAmIGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzIwMF0sICpjcDsKKworCSAgICAgIHN0cmNweSAoYnVmLAorCQkgICAgICBfKCJpbnZhbGlkIGluc3RydWN0aW9uIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgIikpOworCSAgICAgIGNwID0gYnVmICsgc3RybGVuIChidWYpOworCSAgICAgIHN3aXRjaCAob2tfYXJjaCkKKwkJeworCQljYXNlIG1mbG9hdDoKKwkJICBzdHJjcHkgKGNwLCBfKCJmcHUgKDY4MDQwLCA2ODA2MCBvciA2ODg4MS82ODg4MikiKSk7CisJCSAgYnJlYWs7CisJCWNhc2UgbW1tdToKKwkJICBzdHJjcHkgKGNwLCBfKCJtbXUgKDY4MDMwIG9yIDY4ODUxKSIpKTsKKwkJICBicmVhazsKKwkJY2FzZSBtNjgwMjB1cDoKKwkJICBzdHJjcHkgKGNwLCBfKCI2ODAyMCBvciBoaWdoZXIiKSk7CisJCSAgYnJlYWs7CisJCWNhc2UgbTY4MDAwdXA6CisJCSAgc3RyY3B5IChjcCwgXygiNjgwMDAgb3IgaGlnaGVyIikpOworCQkgIGJyZWFrOworCQljYXNlIG02ODAxMHVwOgorCQkgIHN0cmNweSAoY3AsIF8oIjY4MDEwIG9yIGhpZ2hlciIpKTsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICB7CisJCSAgICBpbnQgZ290X29uZSA9IDAsIGlkeDsKKwkJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2l6ZW9mIChhcmNocykgLyBzaXplb2YgKGFyY2hzWzBdKTsKKwkJCSBpZHgrKykKKwkJICAgICAgeworCQkJaWYgKChhcmNoc1tpZHhdLmFyY2ggJiBva19hcmNoKQorCQkJICAgICYmICEgYXJjaHNbaWR4XS5hbGlhcykKKwkJCSAgeworCQkJICAgIGlmIChnb3Rfb25lKQorCQkJICAgICAgeworCQkJCXN0cmNweSAoY3AsICIgb3IgIik7CisJCQkJY3AgKz0gc3RybGVuIChjcCk7CisJCQkgICAgICB9CisJCQkgICAgZ290X29uZSA9IDE7CisJCQkgICAgc3RyY3B5IChjcCwgYXJjaHNbaWR4XS5uYW1lKTsKKwkJCSAgICBjcCArPSBzdHJsZW4gKGNwKTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCQl9CisJICAgICAgY3AgPSB4bWFsbG9jIChzdHJsZW4gKGJ1ZikgKyAxKTsKKwkgICAgICBzdHJjcHkgKGNwLCBidWYpOworCSAgICAgIHRoZV9pbnMuZXJyb3IgPSBjcDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB0aGVfaW5zLmVycm9yID0gXygib3BlcmFuZHMgbWlzbWF0Y2giKTsKKwkgIHJldHVybjsKKwl9CQkJLyogRmVsbCBvZmYgdGhlIGVuZCAqLworCisgICAgICBsb3NpbmcgPSAwOworICAgIH0KKworICAvKiBub3cgYXNzZW1ibGUgaXQgKi8KKworICB0aGVfaW5zLmFyZ3MgPSBvcGNvZGUtPm1fb3BlcmFuZHM7CisgIHRoZV9pbnMubnVtYXJncyA9IG9wY29kZS0+bV9vcG51bTsKKyAgdGhlX2lucy5udW1vID0gb3Bjb2RlLT5tX2NvZGVudW07CisgIHRoZV9pbnMub3Bjb2RlWzBdID0gZ2V0b25lIChvcGNvZGUpOworICB0aGVfaW5zLm9wY29kZVsxXSA9IGdldHR3byAob3Bjb2RlKTsKKworICBmb3IgKHMgPSB0aGVfaW5zLmFyZ3MsIG9wUCA9ICZ0aGVfaW5zLm9wZXJhbmRzWzBdOyAqczsgcyArPSAyLCBvcFArKykKKyAgICB7CisgICAgICAvKiBUaGlzIHN3aXRjaCBpcyBhIGRvb3p5LgorICAgICAgIFdhdGNoIHRoZSBmaXJzdCBzdGVwOyBpdHMgYSBiaWcgb25lISAqLworICAgICAgc3dpdGNoIChzWzBdKQorCXsKKworCWNhc2UgJyonOgorCWNhc2UgJ34nOgorCWNhc2UgJyUnOgorCWNhc2UgJzsnOgorCWNhc2UgJ0AnOgorCWNhc2UgJyEnOgorCWNhc2UgJyYnOgorCWNhc2UgJyQnOgorCWNhc2UgJz8nOgorCWNhc2UgJy8nOgorCWNhc2UgJzwnOgorCWNhc2UgJz4nOgorCWNhc2UgJ20nOgorCWNhc2UgJ24nOgorCWNhc2UgJ28nOgorCWNhc2UgJ3AnOgorCWNhc2UgJ3EnOgorCWNhc2UgJ3YnOgorI2lmbmRlZiBOT182ODg1MQorCWNhc2UgJ3wnOgorI2VuZGlmCisJICBzd2l0Y2ggKG9wUC0+bW9kZSkKKwkgICAgeworCSAgICBjYXNlIElNTUVEOgorCSAgICAgIHRtcHJlZyA9IDB4M2M7CS8qIDcuNCAqLworCSAgICAgIGlmIChzdHJjaHIgKCJid2wiLCBzWzFdKSkKKwkJbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7CisJICAgICAgZWxzZQorCQluZXh0d29yZCA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDApOworCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCisJCWFkZF9maXggKHNbMV0sICZvcFAtPmRpc3AsIDAsIDApOworCSAgICAgIHN3aXRjaCAoc1sxXSkKKwkJeworCQljYXNlICdiJzoKKwkJICBpZiAoIWlzYnl0ZSAobmV4dHdvcmQpKQorCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7CisJCSAgYWRkd29yZCAobmV4dHdvcmQpOworCQkgIGJhc2VvID0gMDsKKwkJICBicmVhazsKKwkJY2FzZSAndyc6CisJCSAgaWYgKCFpc3dvcmQgKG5leHR3b3JkKSkKKwkJICAgIG9wUC0+ZXJyb3IgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSIpOworCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKKwkJICBiYXNlbyA9IDA7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1cnOgorCQkgIGlmICghaXNzd29yZCAobmV4dHdvcmQpKQorCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7CisJCSAgYWRkd29yZCAobmV4dHdvcmQpOworCQkgIGJhc2VvID0gMDsKKwkJICBicmVhazsKKwkJY2FzZSAnbCc6CisJCSAgYWRkd29yZCAobmV4dHdvcmQgPj4gMTYpOworCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKKwkJICBiYXNlbyA9IDA7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnZic6CisJCSAgYmFzZW8gPSAyOworCQkgIG91dHJvID0gODsKKwkJICBicmVhazsKKwkJY2FzZSAnRic6CisJCSAgYmFzZW8gPSA0OworCQkgIG91dHJvID0gMTE7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkgIGJhc2VvID0gNjsKKwkJICBvdXRybyA9IDE1OworCQkgIGJyZWFrOworCQljYXNlICdwJzoKKwkJICBiYXNlbyA9IDY7CisJCSAgb3V0cm8gPSAtMTsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmICghYmFzZW8pCisJCWJyZWFrOworCisJICAgICAgLyogV2UgZ290dGEgcHV0IG91dCBzb21lIGZsb2F0ICovCisJICAgICAgaWYgKG9wICgmb3BQLT5kaXNwKSAhPSBPX2JpZykKKwkJeworCQkgIHZhbHVlVCB2YWw7CisJCSAgaW50IGdlbmNudDsKKworCQkgIC8qIENhbiBvdGhlciBjYXNlcyBoYXBwZW4gaGVyZT8gICovCisJCSAgaWYgKG9wICgmb3BQLT5kaXNwKSAhPSBPX2NvbnN0YW50KQorCQkgICAgYWJvcnQgKCk7CisKKwkJICB2YWwgPSAodmFsdWVUKSBvZmZzICgmb3BQLT5kaXNwKTsKKwkJICBnZW5jbnQgPSAwOworCQkgIGRvCisJCSAgICB7CisJCSAgICAgIGdlbmVyaWNfYmlnbnVtW2dlbmNudF0gPSAoTElUVExFTlVNX1RZUEUpIHZhbDsKKwkJICAgICAgdmFsID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJCSAgICAgICsrZ2VuY250OworCQkgICAgfQorCQkgIHdoaWxlICh2YWwgIT0gMCk7CisJCSAgb2ZmcyAoJm9wUC0+ZGlzcCkgPSBnZW5jbnQ7CisJCX0KKwkgICAgICBpZiAob2ZmcyAoJm9wUC0+ZGlzcCkgPiAwKQorCQl7CisJCSAgaWYgKG9mZnMgKCZvcFAtPmRpc3ApID4gYmFzZW8pCisJCSAgICB7CisJCSAgICAgIGFzX3dhcm4gKF8oIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIpLAorCQkJICAgICAgIHNbMV0pOworCQkgICAgICBvZmZzICgmb3BQLT5kaXNwKSA9IGJhc2VvOworCQkgICAgfQorCQkgIGJhc2VvIC09IG9mZnMgKCZvcFAtPmRpc3ApOworCQkgIHdoaWxlIChiYXNlby0tKQorCQkgICAgYWRkd29yZCAoMCk7CisJCSAgZm9yICh3b3JkcCA9IGdlbmVyaWNfYmlnbnVtICsgb2ZmcyAoJm9wUC0+ZGlzcCkgLSAxOworCQkgICAgICAgb2ZmcyAoJm9wUC0+ZGlzcCktLTsKKwkJICAgICAgIC0td29yZHApCisJCSAgICBhZGR3b3JkICgqd29yZHApOworCQkgIGJyZWFrOworCQl9CisJICAgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgYmFzZW8sIChsb25nKSBvdXRybyk7CisJICAgICAgZm9yICh3b3JkcCA9IHdvcmRzOyBiYXNlby0tOyB3b3JkcCsrKQorCQlhZGR3b3JkICgqd29yZHApOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERSRUc6CisJICAgICAgdG1wcmVnID0gb3BQLT5yZWcgLSBEQVRBOwkvKiAwLmRyZWcgKi8KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBUkVHOgorCSAgICAgIHRtcHJlZyA9IDB4MDggKyBvcFAtPnJlZyAtIEFERFI7CS8qIDEuYXJlZyAqLworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFJTkRSOgorCSAgICAgIHRtcHJlZyA9IDB4MTAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDIuYXJlZyAqLworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFERUM6CisJICAgICAgdG1wcmVnID0gMHgyMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNC5hcmVnICovCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQUlOQzoKKwkgICAgICB0bXByZWcgPSAweDE4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiAzLmFyZWcgKi8KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBESVNQOgorCisJICAgICAgbmV4dHdvcmQgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7CisKKwkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMKKwkJICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQorCQkgICYmIG02OGtfYWJzcGNhZGQpCisJCXsKKwkJICBvcFAtPmRpc3AuZXhwLlhfb3AgPSBPX3N5bWJvbDsKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorCQkgIG9wUC0+ZGlzcC5leHAuWF9hZGRfc3ltYm9sID0gJmFic19zeW1ib2w7CisjZWxzZQorCQkgIG9wUC0+ZGlzcC5leHAuWF9hZGRfc3ltYm9sID0KKwkJICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKKyNlbmRpZgorCQl9CisKKwkgICAgICAvKiBGb3JjZSBpbnRvIGluZGV4IG1vZGUuICBIb3BlIHRoaXMgd29ya3MgKi8KKworCSAgICAgIC8qIFdlIGRvIHRoZSBmaXJzdCBiaXQgZm9yIDMyLWJpdCBkaXNwbGFjZW1lbnRzLCBhbmQgdGhlCisJCSBzZWNvbmQgYml0IGZvciAxNiBiaXQgb25lcy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UKKwkJIHNob3VsZCBtYWtlIHRoZSBkZWZhdWx0IGJlIFdPUkQgaW5zdGVhZCBvZiBMT05HLCBidXQKKwkJIEkgdGhpbmsgdGhhdCdkIGJyZWFrIEdDQywgc28gd2UgcHV0IHVwIHdpdGggYSBsaXR0bGUKKwkJIGluZWZmaWNpZW5jeSBmb3IgdGhlIHNha2Ugb2Ygd29ya2luZyBvdXRwdXQuICAqLworCisJICAgICAgaWYgKCFpc3N3b3JkIChuZXh0d29yZCkKKwkJICB8fCAoaXN2YXIgKCZvcFAtPmRpc3ApCisJCSAgICAgICYmICgob3BQLT5kaXNwLnNpemUgPT0gU0laRV9VTlNQRUMKKwkJCSAgICYmIGZsYWdfc2hvcnRfcmVmcyA9PSAwCisJCQkgICAmJiBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID49IG02ODAyMAorCQkJICAgJiYgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAhPSBtY2Y1MjAwKQorCQkJICB8fCBvcFAtPmRpc3Auc2l6ZSA9PSBTSVpFX0xPTkcpKSkKKwkJeworCQkgIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCisJCSAgICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKKwkJICAgIG9wUC0+ZXJyb3IgPQorCQkgICAgICBfKCJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIik7CisJCSAgaWYgKG9wUC0+cmVnID09IFBDKQorCQkgICAgdG1wcmVnID0gMHgzQjsJLyogNy4zICovCisJCSAgZWxzZQorCQkgICAgdG1wcmVnID0gMHgzMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNi5hcmVnICovCisJCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQorCQkJeworCQkJICBpZiAob3BQLT5kaXNwLnNpemUgPT0gU0laRV9MT05HCisjaWZkZWYgT0JKX0VMRgorCQkJICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMKKwkJCQkgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUgcmVsYXhlZC4gICovCisJCQkgICAgICB8fCBvcFAtPmRpc3AucGljX3JlbG9jICE9IHBpY19ub25lCisjZW5kaWYKKwkJCSAgICAgICkKKwkJCSAgICB7CisJCQkgICAgICBhZGR3b3JkICgweDAxNzApOworCQkJICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAyKTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksCisJCQkJCW9mZnMgKCZvcFAtPmRpc3ApLAorCQkJCQlUQUIgKFBDTEVBLCBTWl9VTkRFRikpOworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGFkZHdvcmQgKDB4MDE3MCk7CisJCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMCwgMCk7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYWRkd29yZCAoMHgwMTcwKTsKKwkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAob3BQLT5yZWcgPT0gUEMpCisJCSAgICB0bXByZWcgPSAweDNBOwkvKiA3LjIgKi8KKwkJICBlbHNlCisJCSAgICB0bXByZWcgPSAweDI4ICsgb3BQLT5yZWcgLSBBRERSOwkvKiA1LmFyZWcgKi8KKworCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCisJCSAgICB7CisJCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQykKKwkJCXsKKwkJCSAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAwLCAwKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGFkZHdvcmQgKG5leHR3b3JkKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFBPU1Q6CisJICAgIGNhc2UgUFJFOgorCSAgICBjYXNlIEJBU0U6CisJICAgICAgbmV4dHdvcmQgPSAwOworCSAgICAgIGJhc2VvID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOworCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQorCQlvdXRybyA9IGdldF9udW0gKCZvcFAtPm9kaXNwLCA4MCk7CisJICAgICAgLyogRmlndXJlIG91dCB0aGUgYGFkZHJlc3NpbmcgbW9kZScuCisJCSBBbHNvIHR1cm4gb24gdGhlIEJBU0VfRElTQUJMRSBiaXQsIGlmIG5lZWRlZC4gICovCisJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKKwkJeworCQkgIHRtcHJlZyA9IDB4M2I7CS8qIDcuMyAqLworCQkgIGlmIChvcFAtPnJlZyA9PSBaUEMpCisJCSAgICBuZXh0d29yZCB8PSAweDgwOworCQl9CisJICAgICAgZWxzZSBpZiAob3BQLT5yZWcgPT0gMCkKKwkJeworCQkgIG5leHR3b3JkIHw9IDB4ODA7CisJCSAgdG1wcmVnID0gMHgzMDsJLyogNi5nYXJiYWdlICovCisJCX0KKwkgICAgICBlbHNlIGlmIChvcFAtPnJlZyA+PSBaQUREUjAgJiYgb3BQLT5yZWcgPD0gWkFERFI3KQorCQl7CisJCSAgbmV4dHdvcmQgfD0gMHg4MDsKKwkJICB0bXByZWcgPSAweDMwICsgb3BQLT5yZWcgLSBaQUREUjA7CisJCX0KKwkgICAgICBlbHNlCisJCXRtcHJlZyA9IDB4MzAgKyBvcFAtPnJlZyAtIEFERFI7CS8qIDYuYXJlZyAqLworCisJICAgICAgc2l6MSA9IG9wUC0+ZGlzcC5zaXplOworCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQorCQlzaXoyID0gb3BQLT5vZGlzcC5zaXplOworCSAgICAgIGVsc2UKKwkJc2l6MiA9IFNJWkVfVU5TUEVDOworCisJICAgICAgLyogSW5kZXggcmVnaXN0ZXIgc3R1ZmYgKi8KKwkgICAgICBpZiAob3BQLT5pbmRleC5yZWcgIT0gMAorCQkgICYmIG9wUC0+aW5kZXgucmVnID49IERBVEEKKwkJICAmJiBvcFAtPmluZGV4LnJlZyA8PSBBRERSNykKKwkJeworCQkgIG5leHR3b3JkIHw9IChvcFAtPmluZGV4LnJlZyAtIERBVEEpIDw8IDEyOworCisJCSAgaWYgKG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX0xPTkcKKwkJICAgICAgfHwgKG9wUC0+aW5kZXguc2l6ZSA9PSBTSVpFX1VOU1BFQworCQkJICAmJiBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPT0gU0laRV9MT05HKSkKKwkJICAgIG5leHR3b3JkIHw9IDB4ODAwOworCisJCSAgaWYgKChvcFAtPmluZGV4LnNjYWxlICE9IDEgCisJCSAgICAgICAmJiBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwKQorCQkgICAgICB8fCAob3BQLT5pbmRleC5zY2FsZSA9PSA4IAorCQkJICAmJiBjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBtY2Y1MjAwKSkKKwkJICAgIHsKKwkJICAgICAgb3BQLT5lcnJvciA9CisJCQlfKCJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIik7CisJCSAgICB9CisKKwkJICBzd2l0Y2ggKG9wUC0+aW5kZXguc2NhbGUpCisJCSAgICB7CisJCSAgICBjYXNlIDE6CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAyOgorCQkgICAgICBuZXh0d29yZCB8PSAweDIwMDsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDQ6CisJCSAgICAgIG5leHR3b3JkIHw9IDB4NDAwOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgODoKKwkJICAgICAgbmV4dHdvcmQgfD0gMHg2MDA7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgYWJvcnQgKCk7CisJCSAgICB9CisJCSAgLyogSUYgaXRzIHNpbXBsZSwKKwkJICAgICBHRVQgVVMgT1VUIE9GIEhFUkUhICovCisKKwkJICAvKiBNdXN0IGJlIElOREVYLCB3aXRoIGFuIGluZGV4IHJlZ2lzdGVyLiAgQWRkcmVzcworCQkgICAgIHJlZ2lzdGVyIGNhbm5vdCBiZSBaRVJPLVBDLCBhbmQgZWl0aGVyIDpiIHdhcworCQkgICAgIGZvcmNlZCwgb3Igd2Uga25vdyBpdCB3aWxsIGZpdC4gIEZvciBhIDY4MDAwIG9yCisJCSAgICAgNjgwMTAsIGZvcmNlIHRoaXMgbW9kZSBhbnl3YXlzLCBiZWNhdXNlIHRoZQorCQkgICAgIGxhcmdlciBtb2RlcyBhcmVuJ3Qgc3VwcG9ydGVkLiAgKi8KKwkJICBpZiAob3BQLT5tb2RlID09IEJBU0UKKwkJICAgICAgJiYgKChvcFAtPnJlZyA+PSBBRERSMAorCQkJICAgJiYgb3BQLT5yZWcgPD0gQUREUjcpCisJCQkgIHx8IG9wUC0+cmVnID09IFBDKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKHNpejEgPT0gU0laRV9CWVRFCisJCQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKKwkJCSAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSBtY2Y1MjAwCisJCQkgIHx8IChzaXoxID09IFNJWkVfVU5TUEVDCisJCQkgICAgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQorCQkJICAgICAgJiYgaXNzYnl0ZSAoYmFzZW8pKSkKKwkJCXsKKyAJCQkgIG5leHR3b3JkICs9IGJhc2VvICYgMHhmZjsKKyAJCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKKyAJCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCisJCQkgICAgeworCQkJICAgICAgLyogRG8gYSBieXRlIHJlbG9jYXRpb24uICBJZiBpdCBkb2Vzbid0CisJCQkJIGZpdCAocG9zc2libGUgb24gbTY4MDAwKSBsZXQgdGhlCisJCQkJIGZpeHVwIHByb2Nlc3NpbmcgY29tcGxhaW4gbGF0ZXIuICAqLworCQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQorCQkJCWFkZF9maXggKCdCJywgJm9wUC0+ZGlzcCwgMSwgMSk7CisJCQkgICAgICBlbHNlCisJCQkJYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAwLCAwKTsKKwkJCSAgICB9CisJCQkgIGVsc2UgaWYgKHNpejEgIT0gU0laRV9CWVRFKQorCQkJICAgIHsKKwkJCSAgICAgIGlmIChzaXoxICE9IFNJWkVfVU5TUEVDKQorCQkJCWFzX3dhcm4gKF8oIkZvcmNpbmcgYnl0ZSBkaXNwbGFjZW1lbnQiKSk7CisJCQkgICAgICBpZiAoISBpc3NieXRlIChiYXNlbykpCisJCQkJb3BQLT5lcnJvciA9IF8oImJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpOworCQkJICAgIH0KKworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc2l6MSA9PSBTSVpFX1VOU1BFQworCQkJICAgICAgICYmIG9wUC0+cmVnID09IFBDCisJCQkgICAgICAgJiYgaXN2YXIgKCZvcFAtPmRpc3ApCisJCQkgICAgICAgJiYgc3VicyAoJm9wUC0+ZGlzcCkgPT0gTlVMTAorI2lmZGVmIE9CSl9FTEYKKwkJCSAgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYworCQkJCSAgcmVsb2NhdGlvbiBpdCBjYW5ub3QgYmUgcmVsYXhlZC4gICovCisJCQkgICAgICAgJiYgb3BQLT5kaXNwLnBpY19yZWxvYyA9PSBwaWNfbm9uZQorI2VuZGlmCisJCQkgICAgICAgKQorCQkJeworCQkJICAvKiBUaGUgY29kZSBpbiBtZF9jb252ZXJ0X2ZyYWdfMSBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmxlIHRvIGFkanVzdCBuZXh0d29yZC4gIENhbGwgZnJhZ19ncm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIHNwYWNlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFnIG9ic3RhY2sgdG8gbWFrZSBhbGwgdGhlIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpZ3VvdXMuICAqLworCQkJICBmcmFnX2dyb3cgKDE0KTsKKyAJCQkgIG5leHR3b3JkICs9IGJhc2VvICYgMHhmZjsKKyAJCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKKyAJCQkgIGFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCisgCQkJCSAgICBUQUIgKFBDSU5ERVgsIFNaX1VOREVGKSk7CisKKwkJCSAgYnJlYWs7CisgCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgbmV4dHdvcmQgfD0gMHg0MDsJLyogTm8gaW5kZXggcmVnICovCisJCSAgaWYgKG9wUC0+aW5kZXgucmVnID49IFpEQVRBMAorCQkgICAgICAmJiBvcFAtPmluZGV4LnJlZyA8PSBaREFUQTcpCisJCSAgICBuZXh0d29yZCB8PSAob3BQLT5pbmRleC5yZWcgLSBaREFUQTApIDw8IDEyOworCQkgIGVsc2UgaWYgKG9wUC0+aW5kZXgucmVnID49IFpBRERSMAorCQkJICAgfHwgb3BQLT5pbmRleC5yZWcgPD0gWkFERFI3KQorCQkgICAgbmV4dHdvcmQgfD0gKG9wUC0+aW5kZXgucmVnIC0gWkFERFIwICsgOCkgPDwgMTI7CisJCX0KKworCSAgICAgIC8qIEl0IGlzbid0IHNpbXBsZS4gICovCisKKwkgICAgICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAorCQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKKwkJb3BQLT5lcnJvciA9CisJCSAgXygiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiKTsKKworCSAgICAgIG5leHR3b3JkIHw9IDB4MTAwOworCSAgICAgIC8qIElmIHRoZSBndXkgc3BlY2lmaWVkIGEgd2lkdGgsIHdlIGFzc3VtZSB0aGF0IGl0IGlzCisJCSB3aWRlIGVub3VnaC4gIE1heWJlIGl0IGlzbid0LiAgSWYgc28sIHdlIGxvc2UuICAqLworCSAgICAgIHN3aXRjaCAoc2l6MSkKKwkJeworCQljYXNlIFNJWkVfVU5TUEVDOgorCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkKKwkJICAgICAgPyBtNjhrX3JlbDMyCisJCSAgICAgIDogISBpc3N3b3JkIChiYXNlbykpCisJCSAgICB7CisJCSAgICAgIHNpejEgPSBTSVpFX0xPTkc7CisJCSAgICAgIG5leHR3b3JkIHw9IDB4MzA7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoISBpc3ZhciAoJm9wUC0+ZGlzcCkgJiYgYmFzZW8gPT0gMCkKKwkJICAgIG5leHR3b3JkIHw9IDB4MTA7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBuZXh0d29yZCB8PSAweDIwOworCQkgICAgICBzaXoxID0gU0laRV9XT1JEOworCQkgICAgfQorCQkgIGJyZWFrOworCQljYXNlIFNJWkVfQllURToKKwkJICBhc193YXJuIChfKCI6YiBub3QgcGVybWl0dGVkOyBkZWZhdWx0aW5nIHRvIDp3IikpOworCQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJCWNhc2UgU0laRV9XT1JEOgorCQkgIG5leHR3b3JkIHw9IDB4MjA7CisJCSAgYnJlYWs7CisJCWNhc2UgU0laRV9MT05HOgorCQkgIG5leHR3b3JkIHw9IDB4MzA7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIEZpZ3VyZSBvdXQgaW5ubmVyIGRpc3BsYWNlbWVudCBzdHVmZiAqLworCSAgICAgIGlmIChvcFAtPm1vZGUgPT0gUE9TVCB8fCBvcFAtPm1vZGUgPT0gUFJFKQorCQl7CisJCSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBjcHUzMikKKwkJICAgIG9wUC0+ZXJyb3IgPSBfKCJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIpOworCQkgIHN3aXRjaCAoc2l6MikKKwkJICAgIHsKKwkJICAgIGNhc2UgU0laRV9VTlNQRUM6CisJCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+b2Rpc3ApCisJCQkgID8gbTY4a19yZWwzMgorCQkJICA6ICEgaXNzd29yZCAob3V0cm8pKQorCQkJeworCQkJICBzaXoyID0gU0laRV9MT05HOworCQkJICBuZXh0d29yZCB8PSAweDM7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKCEgaXN2YXIgKCZvcFAtPm9kaXNwKSAmJiBvdXRybyA9PSAwKQorCQkJbmV4dHdvcmQgfD0gMHgxOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIG5leHR3b3JkIHw9IDB4MjsKKwkJCSAgc2l6MiA9IFNJWkVfV09SRDsKKwkJCX0KKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDE6CisJCSAgICAgIGFzX3dhcm4gKF8oIjpiIG5vdCBwZXJtaXR0ZWQ7IGRlZmF1bHRpbmcgdG8gOnciKSk7CisJCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJCSAgICBjYXNlIDI6CisJCSAgICAgIG5leHR3b3JkIHw9IDB4MjsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDM6CisJCSAgICAgIG5leHR3b3JkIHw9IDB4MzsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgaWYgKG9wUC0+bW9kZSA9PSBQT1NUCisJCSAgICAgICYmIChuZXh0d29yZCAmIDB4NDApID09IDApCisJCSAgICBuZXh0d29yZCB8PSAweDA0OworCQl9CisJICAgICAgYWRkd29yZCAobmV4dHdvcmQpOworCisJICAgICAgaWYgKHNpejEgIT0gU0laRV9VTlNQRUMgJiYgaXN2YXIgKCZvcFAtPmRpc3ApKQorCQl7CisJCSAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKKwkJICAgIGFkZF9maXggKHNpejEgPT0gU0laRV9MT05HID8gJ2wnIDogJ3cnLCAmb3BQLT5kaXNwLCAxLCAyKTsKKwkJICBlbHNlCisJCSAgICBhZGRfZml4IChzaXoxID09IFNJWkVfTE9ORyA/ICdsJyA6ICd3JywgJm9wUC0+ZGlzcCwgMCwgMCk7CisJCX0KKwkgICAgICBpZiAoc2l6MSA9PSBTSVpFX0xPTkcpCisJCWFkZHdvcmQgKGJhc2VvID4+IDE2KTsKKwkgICAgICBpZiAoc2l6MSAhPSBTSVpFX1VOU1BFQykKKwkJYWRkd29yZCAoYmFzZW8pOworCisJICAgICAgaWYgKHNpejIgIT0gU0laRV9VTlNQRUMgJiYgaXN2YXIgKCZvcFAtPm9kaXNwKSkKKwkJYWRkX2ZpeCAoc2l6MiA9PSBTSVpFX0xPTkcgPyAnbCcgOiAndycsICZvcFAtPm9kaXNwLCAwLCAwKTsKKwkgICAgICBpZiAoc2l6MiA9PSBTSVpFX0xPTkcpCisJCWFkZHdvcmQgKG91dHJvID4+IDE2KTsKKwkgICAgICBpZiAoc2l6MiAhPSBTSVpFX1VOU1BFQykKKwkJYWRkd29yZCAob3V0cm8pOworCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBQlNMOgorCSAgICAgIG5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOworCSAgICAgIHN3aXRjaCAob3BQLT5kaXNwLnNpemUpCisJCXsKKwkJZGVmYXVsdDoKKwkJICBhYm9ydCAoKTsKKwkJY2FzZSBTSVpFX1VOU1BFQzoKKwkJICBpZiAoIWlzdmFyICgmb3BQLT5kaXNwKSAmJiBpc3N3b3JkIChvZmZzICgmb3BQLT5kaXNwKSkpCisJCSAgICB7CisJCSAgICAgIHRtcHJlZyA9IDB4Mzg7CS8qIDcuMCAqLworCQkgICAgICBhZGR3b3JkIChuZXh0d29yZCk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIC8qIERvbid0IGdlbmVyYXRlIHBjIHJlbGF0aXZlIGNvZGUgb24gNjgwMTAgYW5kCisJCSAgICAgNjgwMDAuICAqLworCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkKKwkJICAgICAgJiYgIXN1YnMgKCZvcFAtPmRpc3ApCisJCSAgICAgICYmIGFkZHMgKCZvcFAtPmRpc3ApCisjaWZkZWYgT0JKX0VMRgorCQkgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYyByZWxvY2F0aW9uIGl0CisJCQkgY2Fubm90IGJlIHJlbGF4ZWQuICAqLworCQkgICAgICAmJiBvcFAtPmRpc3AucGljX3JlbG9jID09IHBpY19ub25lCisjZW5kaWYKKwkJICAgICAgJiYgU19HRVRfU0VHTUVOVCAoYWRkcyAoJm9wUC0+ZGlzcCkpID09IG5vd19zZWcKKwkJICAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoYWRkcyAoJm9wUC0+ZGlzcCkpCisJCSAgICAgICYmIEhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpCisJCSAgICAgICYmICFmbGFnX2xvbmdfanVtcHMKKwkJICAgICAgJiYgIXN0cmNociAoIn4lJiQ/Iiwgc1swXSkpCisJCSAgICB7CisJCSAgICAgIHRtcHJlZyA9IDB4M0E7CS8qIDcuMiAqLworCQkgICAgICBhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksCisJCQkJb2ZmcyAoJm9wUC0+ZGlzcCksCisJCQkJVEFCIChQQ1JFTCwgU1pfVU5ERUYpKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgLyogRmFsbCB0aHJvdWdoIGludG8gbG9uZyAqLworCQljYXNlIFNJWkVfTE9ORzoKKwkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQorCQkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKKworCQkgIHRtcHJlZyA9IDB4Mzk7LyogNy4xIG1vZGUgKi8KKwkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7CisJCSAgYWRkd29yZCAobmV4dHdvcmQpOworCQkgIGJyZWFrOworCisJCWNhc2UgU0laRV9CWVRFOgorCQkgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgYnl0ZSB2YWx1ZTsgdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCIpKTsKKwkJICAvKiBGYWxsIHRocm91Z2guICAqLworCQljYXNlIFNJWkVfV09SRDoJLyogV29yZCAqLworCQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCisJCSAgICBhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDAsIDApOworCisJCSAgdG1wcmVnID0gMHgzODsvKiA3LjAgbW9kZSAqLworCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENPTlRST0w6CisJICAgIGNhc2UgRlBSRUc6CisJICAgIGRlZmF1bHQ6CisJICAgICAgYXNfYmFkIChfKCJ1bmtub3duL2luY29ycmVjdCBvcGVyYW5kIikpOworCSAgICAgIC8qIGFib3J0KCk7ICovCisJICAgIH0KKwkgIGluc3RhbGxfZ2VuX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7CisJICBicmVhazsKKworCWNhc2UgJyMnOgorCWNhc2UgJ14nOgorCSAgc3dpdGNoIChzWzFdKQorCSAgICB7CQkJLyogSkY6IEkgaGF0ZSBmbG9hdGluZyBwb2ludCEgKi8KKwkgICAgY2FzZSAnaic6CisJICAgICAgdG1wcmVnID0gNzA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJzgnOgorCSAgICAgIHRtcHJlZyA9IDIwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdDJzoKKwkgICAgICB0bXByZWcgPSA1MDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnMyc6CisJICAgIGRlZmF1bHQ6CisJICAgICAgdG1wcmVnID0gODA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIHRtcHJlZyk7CisJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQorCSAgICBhZGRfZml4IChzWzFdLCAmb3BQLT5kaXNwLCAwLCAwKTsKKwkgIHN3aXRjaCAoc1sxXSkKKwkgICAgeworCSAgICBjYXNlICdiJzoJCS8qIERhbmdlcjogIFRoZXNlIGRvIG5vIGNoZWNrIGZvcgorCQkJCSAgIGNlcnRhaW4gdHlwZXMgb2Ygb3ZlcmZsb3cuCisJCQkJICAgdXNlciBiZXdhcmUhICovCisJICAgICAgaWYgKCFpc2J5dGUgKHRtcHJlZykpCisJCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKKwkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOworCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCisJCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9CisJCSAgKG9wY29kZS0+bV9jb2RlbnVtKSAqIDIgKyAxOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdCJzoKKwkgICAgICBpZiAoIWlzc2J5dGUgKHRtcHJlZykpCisJCW9wUC0+ZXJyb3IgPSBfKCJvdXQgb2YgcmFuZ2UiKTsKKwkgICAgICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSB0bXByZWcgJiAweGZmOworCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCisJCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9IG9wY29kZS0+bV9jb2RlbnVtICogMiAtIDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3cnOgorCSAgICAgIGlmICghaXN3b3JkICh0bXByZWcpKQorCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7CisJICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKKwkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQorCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnVyc6CisJICAgICAgaWYgKCFpc3N3b3JkICh0bXByZWcpKQorCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7CisJICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKKwkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQorCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSAob3Bjb2RlLT5tX2NvZGVudW0pICogMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnbCc6CisJICAgICAgLyogQmVjYXVzZSBvZiB0aGUgd2F5IGluc29wIHdvcmtzLCB3ZSBwdXQgdGhlc2UgdHdvIG91dAorCQkgYmFja3dhcmRzLiAgKi8KKwkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOworCSAgICAgIGluc29wICh0bXByZWcgPj4gMTYsIG9wY29kZSk7CisJICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKKwkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0gKG9wY29kZS0+bV9jb2RlbnVtKSAqIDI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJzMnOgorCSAgICAgIHRtcHJlZyAmPSAweEZGOworCSAgICBjYXNlICc4JzoKKwkgICAgY2FzZSAnQyc6CisJICAgIGNhc2UgJ2onOgorCSAgICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICcrJzoKKwljYXNlICctJzoKKwljYXNlICdBJzoKKwljYXNlICdhJzoKKwkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBBRERSKTsKKwkgIGJyZWFrOworCisJY2FzZSAnQic6CisJICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7CisJICBzd2l0Y2ggKHNbMV0pCisJICAgIHsKKwkgICAgY2FzZSAnQic6CisJICAgICAgLyogVGhlIHBjX2ZpeCBhcmd1bWVudCB3aW5kcyB1cCBpbiBmeF9wY3JlbF9hZGp1c3QsCisgICAgICAgICAgICAgICAgIHdoaWNoIGlzIGEgY2hhciwgYW5kIG1heSB0aGVyZWZvcmUgYmUgdW5zaWduZWQuICBXZQorICAgICAgICAgICAgICAgICB3YW50IHRvIHBhc3MgLTEsIGJ1dCB3ZSBwYXNzIDY0IGluc3RlYWQsIGFuZCBjb252ZXJ0CisgICAgICAgICAgICAgICAgIGJhY2sgaW4gbWRfcGNyZWxfZnJvbS4gICovCisJICAgICAgYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAxLCA2NCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ1cnOgorCSAgICAgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMSwgMCk7CisJICAgICAgYWRkd29yZCAoMCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ0wnOgorCSAgICBsb25nX2JyYW5jaDoKKwkgICAgICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQorCQlhc193YXJuIChfKCJDYW4ndCB1c2UgbG9uZyBicmFuY2hlcyBvbiA2ODAwMC82ODAxMC81MjAwIikpOworCSAgICAgIHRoZV9pbnMub3Bjb2RlW3RoZV9pbnMubnVtbyAtIDFdIHw9IDB4ZmY7CisJICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAwKTsKKwkgICAgICBhZGR3b3JkICgwKTsKKwkgICAgICBhZGR3b3JkICgwKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnZyc6CisJICAgICAgaWYgKHN1YnMgKCZvcFAtPmRpc3ApKQkvKiBXZSBjYW4ndCByZWxheCBpdCAqLworCQlnb3RvIGxvbmdfYnJhbmNoOworCisjaWZkZWYgT0JKX0VMRgorCSAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljIHJlbG9jYXRpb24gaXQgY2Fubm90IGJlCisJCSByZWxheGVkLiAgKi8KKwkgICAgICBpZiAob3BQLT5kaXNwLnBpY19yZWxvYyAhPSBwaWNfbm9uZSkKKwkJZ290byBsb25nX2JyYW5jaDsKKyNlbmRpZgorCisJICAgICAgLyogVGhpcyBjb3VsZCBlaXRoZXIgYmUgYSBzeW1ib2wsIG9yIGFuIGFic29sdXRlCisJCSBhZGRyZXNzLiAgTm8gbWF0dGVyLCB0aGUgZnJhZyBoYWNraW5nIHdpbGwgZmluZ2VyIGl0CisJCSBvdXQuICBOb3QgcXVpdGU6IGl0IGNhbid0IHN3aXRjaCBmcm9tIEJSQU5DSCB0bworCQkgQkNDNjgwMDAgZm9yIHRoZSBjYXNlIHdoZXJlIG9wbmQgaXMgYWJzb2x1dGUgKGl0CisJCSBuZWVkcyB0byB1c2UgdGhlIDY4MDAwIGhhY2sgc2luY2Ugbm8gY29uZGl0aW9uYWwgYWJzCisJCSBqdW1wcykuICAqLworCSAgICAgIGlmICgoICFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQorCQkgICB8fCAoMCA9PSBhZGRzICgmb3BQLT5kaXNwKSkpCisJCSAgJiYgKHRoZV9pbnMub3Bjb2RlWzBdID49IDB4NjIwMCkKKwkJICAmJiAodGhlX2lucy5vcGNvZGVbMF0gPD0gMHg2ZjAwKSkKKwkJYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKKwkJCSAgVEFCIChCQ0M2ODAwMCwgU1pfVU5ERUYpKTsKKwkgICAgICBlbHNlCisJCWFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCisJCQkgIFRBQiAoQUJSQU5DSCwgU1pfVU5ERUYpKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAndyc6CisJICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKKwkJeworI2lmIDEKKwkJICAvKiBjaGVjayBmb3IgREJjYyBpbnN0cnVjdGlvbiAqLworCQkgIGlmICgodGhlX2lucy5vcGNvZGVbMF0gJiAweGYwZjgpID09IDB4NTBjOCkKKwkJICAgIHsKKwkJICAgICAgLyogc2l6ZSB2YXJpZXMgaWYgcGF0Y2ggKi8KKwkJICAgICAgLyogbmVlZGVkIGZvciBsb25nIGZvcm0gKi8KKwkJICAgICAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKKwkJCQlUQUIgKERCQ0MsIFNaX1VOREVGKSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorI2VuZGlmCisJCSAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAxLCAwKTsKKwkJfQorCSAgICAgIGFkZHdvcmQgKDApOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdDJzoJCS8qIEZpeGVkIHNpemUgTE9ORyBjb3Byb2MgYnJhbmNoZXMgKi8KKwkgICAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDApOworCSAgICAgIGFkZHdvcmQgKDApOworCSAgICAgIGFkZHdvcmQgKDApOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdjJzoJCS8qIFZhciBzaXplIENvcHJvY2Vzc3NvciBicmFuY2hlcyAqLworCSAgICAgIGlmIChzdWJzICgmb3BQLT5kaXNwKSkKKwkJeworCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7CisJCSAgYWRkX2ZyYWcgKChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAwLCBUQUIgKEZCUkFOQ0gsIExPTkcpKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGFkZHMgKCZvcFAtPmRpc3ApKQorCQlhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAorCQkJICBUQUIgKEZCUkFOQ0gsIFNaX1VOREVGKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogYWRkX2ZyYWcgKChzeW1ib2xTICopIDAsIG9mZnMgKCZvcFAtPmRpc3ApLAorCQkgICAgIAkgICAgICAgVEFCKEZCUkFOQ0gsU0hPUlQpKTsgKi8KKwkJICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSAweDQwOworCQkgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7CisJCSAgYWRkd29yZCAoMCk7CisJCSAgYWRkd29yZCAoMCk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdDJzoJCS8qIElnbm9yZSBpdCAqLworCSAgYnJlYWs7CisKKwljYXNlICdkJzoJCS8qIEpGIHRoaXMgaXMgYSBrbHVkZ2UgKi8KKwkgIGluc3RhbGxfb3BlcmFuZCAoJ3MnLCBvcFAtPnJlZyAtIEFERFIpOworCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOworCSAgaWYgKCFpc3N3b3JkICh0bXByZWcpKQorCSAgICB7CisJICAgICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2UsIHVzaW5nIDAiKSk7CisJICAgICAgdG1wcmVnID0gMDsKKwkgICAgfQorCSAgYWRkd29yZCAodG1wcmVnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnRCc6CisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7CisJICBicmVhazsKKworCWNhc2UgJ0YnOgorCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIEZQMCk7CisJICBicmVhazsKKworCWNhc2UgJ0knOgorCSAgdG1wcmVnID0gb3BQLT5yZWcgLSBDT1AwOworCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOworCSAgYnJlYWs7CisKKwljYXNlICdKJzoJCS8qIEpGIGZvbyAqLworCSAgc3dpdGNoIChvcFAtPnJlZykKKwkgICAgeworCSAgICBjYXNlIFNGQzoKKwkgICAgICB0bXByZWcgPSAweDAwMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBERkM6CisJICAgICAgdG1wcmVnID0gMHgwMDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ0FDUjoKKwkgICAgICB0bXByZWcgPSAweDAwMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBUQzoKKwkgICAgICB0bXByZWcgPSAweDAwMzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJVFQwOgorCSAgICAgIHRtcHJlZyA9IDB4MDA0OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIElUVDE6CisJICAgICAgdG1wcmVnID0gMHgwMDU7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFRUMDoKKwkgICAgICB0bXByZWcgPSAweDAwNjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEVFQxOgorCSAgICAgIHRtcHJlZyA9IDB4MDA3OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEJVU0NSOgorCSAgICAgIHRtcHJlZyA9IDB4MDA4OworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgVVNQOgorCSAgICAgIHRtcHJlZyA9IDB4ODAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFZCUjoKKwkgICAgICB0bXByZWcgPSAweDgwMTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDQUFSOgorCSAgICAgIHRtcHJlZyA9IDB4ODAyOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE1TUDoKKwkgICAgICB0bXByZWcgPSAweDgwMzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJU1A6CisJICAgICAgdG1wcmVnID0gMHg4MDQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTU1VU1I6CisJICAgICAgdG1wcmVnID0gMHg4MDU7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVVJQOgorCSAgICAgIHRtcHJlZyA9IDB4ODA2OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNSUDoKKwkgICAgICB0bXByZWcgPSAweDgwNzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQQ1I6CisJICAgICAgdG1wcmVnID0gMHg4MDg7CisJICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJPTUJBUjoKKwkgICAgICB0bXByZWcgPSAweEMwMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSQU1CQVIwOgorCSAgICAgIHRtcHJlZyA9IDB4QzA0OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJBTUJBUjE6CisJICAgICAgdG1wcmVnID0gMHhDMDU7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTUJBUjoKKwkgICAgICB0bXByZWcgPSAweEMwRjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOworCSAgYnJlYWs7CisKKwljYXNlICdrJzoKKwkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDU1KTsKKwkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnICYgMHg3Zik7CisJICBicmVhazsKKworCWNhc2UgJ2wnOgorCSAgdG1wcmVnID0gb3BQLT5tYXNrOworCSAgaWYgKHNbMV0gPT0gJ3cnKQorCSAgICB7CisJICAgICAgaWYgKHRtcHJlZyAmIDB4N0ZGMDAwMCkKKwkJYXNfYmFkIChfKCJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IikpOworCSAgICAgIGluc29wIChyZXZlcnNlXzE2X2JpdHMgKHRtcHJlZyksIG9wY29kZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICh0bXByZWcgJiAweDcwMEZGRkYpCisJCWFzX2JhZCAoXygiV3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIpKTsKKwkgICAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHJldmVyc2VfOF9iaXRzICh0bXByZWcgPj4gMTYpKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdMJzoKKwkgIHRtcHJlZyA9IG9wUC0+bWFzazsKKwkgIGlmIChzWzFdID09ICd3JykKKwkgICAgeworCSAgICAgIGlmICh0bXByZWcgJiAweDdGRjAwMDApCisJCWFzX2JhZCAoXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIpKTsKKwkgICAgICBpbnNvcCAodG1wcmVnLCBvcGNvZGUpOworCSAgICB9CisJICBlbHNlIGlmIChzWzFdID09ICc4JykKKwkgICAgeworCSAgICAgIGlmICh0bXByZWcgJiAweDBGRkZGRkYpCisJCWFzX2JhZCAoXygiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiKSk7CisJICAgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcgPj4gMjQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAodG1wcmVnICYgMHg3MDBGRkZGKQorCQlhc19iYWQgKF8oIndyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiKSk7CisJICAgICAgZWxzZQorCQlpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyA+PiAxNik7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnTSc6CisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIGdldF9udW0gKCZvcFAtPmRpc3AsIDYwKSk7CisJICBicmVhazsKKworCWNhc2UgJ08nOgorCSAgdG1wcmVnID0gKChvcFAtPm1vZGUgPT0gRFJFRykKKwkJICAgID8gMHgyMCArIG9wUC0+cmVnIC0gREFUQQorCQkgICAgOiAoZ2V0X251bSAoJm9wUC0+ZGlzcCwgNDApICYgMHgxRikpOworCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOworCSAgYnJlYWs7CisKKwljYXNlICdRJzoKKwkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDEwKTsKKwkgIGlmICh0bXByZWcgPT0gOCkKKwkgICAgdG1wcmVnID0gMDsKKwkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnUic6CisJICAvKiBUaGlzIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBBRERSIHJlZ2lzdGVycyBhcmUgZWlnaHQKKwkgICAgIG1vcmUgdGhhbiB0aGVpciBjb3JyZXNwb25kaW5nIERBVEEgcmVncywgc28gdGhlIHJlc3VsdAorCSAgICAgd2lsbCBoYXZlIHRoZSBBRERSX1JFRyBiaXQgc2V0ICovCisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gREFUQSk7CisJICBicmVhazsKKworCWNhc2UgJ3InOgorCSAgaWYgKG9wUC0+bW9kZSA9PSBBSU5EUikKKwkgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEpOworCSAgZWxzZQorCSAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+aW5kZXgucmVnIC0gREFUQSk7CisJICBicmVhazsKKworCWNhc2UgJ3MnOgorCSAgaWYgKG9wUC0+cmVnID09IEZQSSkKKwkgICAgdG1wcmVnID0gMHgxOworCSAgZWxzZSBpZiAob3BQLT5yZWcgPT0gRlBTKQorCSAgICB0bXByZWcgPSAweDI7CisJICBlbHNlIGlmIChvcFAtPnJlZyA9PSBGUEMpCisJICAgIHRtcHJlZyA9IDB4NDsKKwkgIGVsc2UKKwkgICAgYWJvcnQgKCk7CisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7CisJICBicmVhazsKKworCWNhc2UgJ1MnOgkJLyogSWdub3JlIGl0ICovCisJICBicmVhazsKKworCWNhc2UgJ1QnOgorCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBnZXRfbnVtICgmb3BQLT5kaXNwLCAzMCkpOworCSAgYnJlYWs7CisKKwljYXNlICdVJzoJCS8qIElnbm9yZSBpdCAqLworCSAgYnJlYWs7CisKKwljYXNlICdjJzoKKwkgIHN3aXRjaCAob3BQLT5yZWcpCisJICAgIHsKKwkgICAgY2FzZSBOQzoKKwkgICAgICB0bXByZWcgPSAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERDOgorCSAgICAgIHRtcHJlZyA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSUM6CisJICAgICAgdG1wcmVnID0gMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBCQzoKKwkgICAgICB0bXByZWcgPSAzOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrIikpOworCSAgICB9CQkJLyogc3dpdGNoIG9uIGNhY2hlIHRva2VuICovCisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7CisJICBicmVhazsKKyNpZm5kZWYgTk9fNjg4NTEKKwkgIC8qIEpGOiBUaGVzZSBhcmUgb3V0IG9mIG9yZGVyLCBJIGZlYXIuICovCisJY2FzZSAnZic6CisJICBzd2l0Y2ggKG9wUC0+cmVnKQorCSAgICB7CisJICAgIGNhc2UgU0ZDOgorCSAgICAgIHRtcHJlZyA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgREZDOgorCSAgICAgIHRtcHJlZyA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJICBzd2l0Y2ggKG9wUC0+cmVnKQorCSAgICB7CisJICAgIGNhc2UgVEM6CisJICAgICAgdG1wcmVnID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDQUw6CisJICAgICAgdG1wcmVnID0gNDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBWQUw6CisJICAgICAgdG1wcmVnID0gNTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTQ0M6CisJICAgICAgdG1wcmVnID0gNjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBQzoKKwkgICAgICB0bXByZWcgPSA3OworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7CisJICBicmVhazsKKworCWNhc2UgJ1YnOgorCSAgaWYgKG9wUC0+cmVnID09IFZBTCkKKwkgICAgYnJlYWs7CisJICBhYm9ydCAoKTsKKworCWNhc2UgJ1cnOgorCSAgc3dpdGNoIChvcFAtPnJlZykKKwkgICAgeworCSAgICBjYXNlIERSUDoKKwkgICAgICB0bXByZWcgPSAxOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNSUDoKKwkgICAgICB0bXByZWcgPSAyOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENSUDoKKwkgICAgICB0bXByZWcgPSAzOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7CisJICBicmVhazsKKworCWNhc2UgJ1gnOgorCSAgc3dpdGNoIChvcFAtPnJlZykKKwkgICAgeworCSAgICBjYXNlIEJBRDoKKwkgICAgY2FzZSBCQUQgKyAxOgorCSAgICBjYXNlIEJBRCArIDI6CisJICAgIGNhc2UgQkFEICsgMzoKKwkgICAgY2FzZSBCQUQgKyA0OgorCSAgICBjYXNlIEJBRCArIDU6CisJICAgIGNhc2UgQkFEICsgNjoKKwkgICAgY2FzZSBCQUQgKyA3OgorCSAgICAgIHRtcHJlZyA9ICg0IDw8IDEwKSB8ICgob3BQLT5yZWcgLSBCQUQpIDw8IDIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQkFDOgorCSAgICBjYXNlIEJBQyArIDE6CisJICAgIGNhc2UgQkFDICsgMjoKKwkgICAgY2FzZSBCQUMgKyAzOgorCSAgICBjYXNlIEJBQyArIDQ6CisJICAgIGNhc2UgQkFDICsgNToKKwkgICAgY2FzZSBCQUMgKyA2OgorCSAgICBjYXNlIEJBQyArIDc6CisJICAgICAgdG1wcmVnID0gKDUgPDwgMTApIHwgKChvcFAtPnJlZyAtIEJBQykgPDwgMik7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOworCSAgYnJlYWs7CisJY2FzZSAnWSc6CisJICBrbm93IChvcFAtPnJlZyA9PSBQU1IpOworCSAgYnJlYWs7CisJY2FzZSAnWic6CisJICBrbm93IChvcFAtPnJlZyA9PSBQQ1NSKTsKKwkgIGJyZWFrOworI2VuZGlmIC8qIG02ODg1MSAqLworCWNhc2UgJzMnOgorCSAgc3dpdGNoIChvcFAtPnJlZykKKwkgICAgeworCSAgICBjYXNlIFRUMDoKKwkgICAgICB0bXByZWcgPSAyOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFRUMToKKwkgICAgICB0bXByZWcgPSAzOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7CisJICBicmVhazsKKwljYXNlICd0JzoKKwkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDIwKTsKKwkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKKwkgIGJyZWFrOworCWNhc2UgJ18nOgkvKiB1c2VkIG9ubHkgZm9yIG1vdmUxNiBhYnNvbHV0ZSAzMi1iaXQgYWRkcmVzcyAqLworCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKKwkgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKKwkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKKwkgIGFkZHdvcmQgKHRtcHJlZyA+PiAxNik7CisJICBhZGR3b3JkICh0bXByZWcgJiAweEZGRkYpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgLyogQnkgdGhlIHRpbWUgd2hlIGdldCBoZXJlIChGSU5BTExZKSB0aGVfaW5zIGNvbnRhaW5zIHRoZSBjb21wbGV0ZQorICAgICBpbnN0cnVjdGlvbiwgcmVhZHkgdG8gYmUgZW1pdHRlZC4gLiAuICovCit9CisKK3N0YXRpYyBpbnQKK3JldmVyc2VfMTZfYml0cyAoaW4pCisgICAgIGludCBpbjsKK3sKKyAgaW50IG91dCA9IDA7CisgIGludCBuOworCisgIHN0YXRpYyBpbnQgbWFza1sxNl0gPQorICB7CisgICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisgICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAKKyAgfTsKKyAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCisgICAgeworICAgICAgaWYgKGluICYgbWFza1tuXSkKKwlvdXQgfD0gbWFza1sxNSAtIG5dOworICAgIH0KKyAgcmV0dXJuIG91dDsKK30JCQkJLyogcmV2ZXJzZV8xNl9iaXRzKCkgKi8KKworc3RhdGljIGludAorcmV2ZXJzZV84X2JpdHMgKGluKQorICAgICBpbnQgaW47Cit7CisgIGludCBvdXQgPSAwOworICBpbnQgbjsKKworICBzdGF0aWMgaW50IG1hc2tbOF0gPQorICB7CisgICAgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisgIH07CisKKyAgZm9yIChuID0gMDsgbiA8IDg7IG4rKykKKyAgICB7CisgICAgICBpZiAoaW4gJiBtYXNrW25dKQorCW91dCB8PSBtYXNrWzcgLSBuXTsKKyAgICB9CisgIHJldHVybiBvdXQ7Cit9CQkJCS8qIHJldmVyc2VfOF9iaXRzKCkgKi8KKworLyogQ2F1c2UgYW4gZXh0cmEgZnJhZyB0byBiZSBnZW5lcmF0ZWQgaGVyZSwgaW5zZXJ0aW5nIHVwIHRvIDEwIGJ5dGVzCisgICAodGhhdCB2YWx1ZSBpcyBjaG9zZW4gaW4gdGhlIGZyYWdfdmFyIGNhbGwgaW4gbWRfYXNzZW1ibGUpLiAgVFlQRQorICAgaXMgdGhlIHN1YnR5cGUgb2YgdGhlIGZyYWcgdG8gYmUgZ2VuZXJhdGVkOyBpdHMgcHJpbWFyeSB0eXBlIGlzCisgICByc19tYWNoaW5lX2RlcGVuZGVudC4KKworICAgVGhlIFRZUEUgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMSBhbmQKKyAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LiAgVGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZml4dXAgd2lsbAorICAgYmUgZW1pdHRlZCBieSBtZF9jb252ZXJ0X2ZyYWdfMS4KKworICAgQUREIGJlY29tZXMgdGhlIEZSX1NZTUJPTCBmaWVsZCBvZiB0aGUgZnJhZywgYW5kIE9GRiB0aGUgRlJfT0ZGU0VULiAgKi8KK3N0YXRpYyB2b2lkCitpbnN0YWxsX29wZXJhbmQgKG1vZGUsIHZhbCkKKyAgICAgaW50IG1vZGU7CisgICAgIGludCB2YWw7Cit7CisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSAncyc6CisgICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgJiAweEZGOwkvKiBKRiBGRiBpcyBmb3IgTSBrbHVkZ2UgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsIDw8IDk7CisgICAgICBicmVhazsKKyAgICBjYXNlICcxJzoKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzInOgorICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDY7CisgICAgICBicmVhazsKKyAgICBjYXNlICczJzoKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzQnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsIDw8IDEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnNSc6CisgICAgICB0aGVfaW5zLm9wY29kZVsyXSB8PSB2YWwgPDwgNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzYnOgorICAgICAgLyogREFOR0VSISAgVGhpcyBpcyBhIGhhY2sgdG8gZm9yY2UgY2FzMmwgYW5kIGNhczJ3IGNtZHMgdG8gYmUKKwkgdGhyZWUgd29yZHMgbG9uZyEgKi8KKyAgICAgIHRoZV9pbnMubnVtbysrOworICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnNyc6CisgICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzgnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDEwOworICAgICAgYnJlYWs7CisjaWZuZGVmIE5PXzY4ODUxCisgICAgY2FzZSAnOSc6CisgICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgNTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlICd0JzoKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICh2YWwgPDwgMTApIHwgKHZhbCA8PCA3KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0QnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKHZhbCA8PCAxMikgfCB2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA9IDB4ZmY7CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA8PCA5OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnQyc6CisgICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlICdqJzoKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbDsKKyAgICAgIHRoZV9pbnMubnVtbysrOwkJLyogV2hhdCBhIGhhY2sgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2snOgorICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICBjYXNlICd3JzoKKyAgICBjYXNlICdXJzoKKyAgICBjYXNlICdsJzoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKHZhbCA8PCA2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0wnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMV0gPSAodmFsID4+IDE2KTsKKyAgICAgIHRoZV9pbnMub3Bjb2RlWzJdID0gdmFsICYgMHhmZmZmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKKyAgICB9Cit9CQkJCS8qIGluc3RhbGxfb3BlcmFuZCgpICovCisKK3N0YXRpYyB2b2lkCitpbnN0YWxsX2dlbl9vcGVyYW5kIChtb2RlLCB2YWwpCisgICAgIGludCBtb2RlOworICAgICBpbnQgdmFsOworeworICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgIGNhc2UgJ3MnOgorICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICAvKiBUaGlzIGlzIGEga2x1ZGdlISEhICovCisgICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAodmFsICYgMHgwNykgPDwgOSB8ICh2YWwgJiAweDM4KSA8PCAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6CisgICAgY2FzZSAndyc6CisgICAgY2FzZSAnbCc6CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAneCc6CisgICAgY2FzZSAncCc6CisgICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWw7CisgICAgICBicmVhazsKKyAgICAgIC8qIG1vcmUgc3R1ZmYgZ29lcyBoZXJlICovCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKKyAgICB9Cit9CQkJCS8qIGluc3RhbGxfZ2VuX29wZXJhbmQoKSAqLworCisvKgorICogdmVyaWZ5IHRoYXQgd2UgaGF2ZSBzb21lIG51bWJlciBvZiBwYXJlbiBwYWlycywgZG8gbTY4a19pcF9vcCgpLCBhbmQKKyAqIHRoZW4gZGVhbCB3aXRoIHRoZSBiaXRmaWVsZCBoYWNrLgorICovCisKK3N0YXRpYyBjaGFyICoKK2NyYWNrX29wZXJhbmQgKHN0ciwgb3BQKQorICAgICByZWdpc3RlciBjaGFyICpzdHI7CisgICAgIHJlZ2lzdGVyIHN0cnVjdCBtNjhrX29wICpvcFA7Cit7CisgIHJlZ2lzdGVyIGludCBwYXJlbnM7CisgIHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBjaGFyICpiZWdfc3RyOworICBpbnQgaW5xdW90ZSA9IDA7CisKKyAgaWYgKCFzdHIpCisgICAgeworICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgIGJlZ19zdHIgPSBzdHI7CisgIGZvciAocGFyZW5zID0gMDsgKnN0ciAmJiAocGFyZW5zID4gMCB8fCBpbnF1b3RlIHx8IG5vdGVuZCAoc3RyKSk7IHN0cisrKQorICAgIHsKKyAgICAgIGlmICghIGlucXVvdGUpCisJeworCSAgaWYgKCpzdHIgPT0gJygnKQorCSAgICBwYXJlbnMrKzsKKwkgIGVsc2UgaWYgKCpzdHIgPT0gJyknKQorCSAgICB7CisJICAgICAgaWYgKCFwYXJlbnMpCisJCXsJCQkvKiBFUlJPUiAqLworCQkgIG9wUC0+ZXJyb3IgPSBfKCJFeHRyYSApIik7CisJCSAgcmV0dXJuIHN0cjsKKwkJfQorCSAgICAgIC0tcGFyZW5zOworCSAgICB9CisJfQorICAgICAgaWYgKGZsYWdfbXJpICYmICpzdHIgPT0gJ1wnJykKKwlpbnF1b3RlID0gISBpbnF1b3RlOworICAgIH0KKyAgaWYgKCEqc3RyICYmIHBhcmVucykKKyAgICB7CQkJCS8qIEVSUk9SICovCisgICAgICBvcFAtPmVycm9yID0gXygiTWlzc2luZyApIik7CisgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgYyA9ICpzdHI7CisgICpzdHIgPSAnXDAnOworICBpZiAobTY4a19pcF9vcCAoYmVnX3N0ciwgb3BQKSAhPSAwKQorICAgIHsKKyAgICAgICpzdHIgPSBjOworICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisgICpzdHIgPSBjOworICBpZiAoYyA9PSAnfScpCisgICAgYyA9ICorK3N0cjsJCQkvKiBKRiBiaXRmaWVsZCBoYWNrICovCisgIGlmIChjKQorICAgIHsKKyAgICAgIGMgPSAqKytzdHI7CisgICAgICBpZiAoIWMpCisJYXNfYmFkIChfKCJNaXNzaW5nIG9wZXJhbmQiKSk7CisgICAgfQorCisgIC8qIERldGVjdCBNUkkgUkVHIHN5bWJvbHMgYW5kIGNvbnZlcnQgdGhlbSB0byBSRUdMU1RzLiAgKi8KKyAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MICYmIChpbnQpb3BQLT5yZWcgPCAwKQorICAgIHsKKyAgICAgIG9wUC0+bW9kZSA9IFJFR0xTVDsKKyAgICAgIG9wUC0+bWFzayA9IH4oaW50KW9wUC0+cmVnOworICAgICAgb3BQLT5yZWcgPSAwOworICAgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKKyAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0CisgICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgorICAgKi8KKworc3RhdGljIHZvaWQKK2luc2VydF9yZWcgKHJlZ25hbWUsIHJlZ251bSkKKyAgICAgY29uc3QgY2hhciAqcmVnbmFtZTsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgY2hhciBidWZbMTAwXTsKKyAgaW50IGk7CisKKyNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKKyAgaWYgKCFmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCisgICAgeworICAgICAgYnVmWzBdID0gUkVHSVNURVJfUFJFRklYOworICAgICAgc3RyY3B5IChidWYgKyAxLCByZWduYW1lKTsKKyAgICAgIHJlZ25hbWUgPSBidWY7CisgICAgfQorI2VuZGlmCisKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAocmVnbmFtZSwgcmVnX3NlY3Rpb24sIHJlZ251bSwKKwkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKKworICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCisgICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07CisgIGJ1ZltpXSA9ICdcMCc7CisKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCByZWdfc2VjdGlvbiwgcmVnbnVtLAorCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworfQorCitzdHJ1Y3QgaW5pdF9lbnRyeQorICB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgbnVtYmVyOworICB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGluaXRfZW50cnkgaW5pdF90YWJsZVtdID0KK3sKKyAgeyAiZDAiLCBEQVRBMCB9LAorICB7ICJkMSIsIERBVEExIH0sCisgIHsgImQyIiwgREFUQTIgfSwKKyAgeyAiZDMiLCBEQVRBMyB9LAorICB7ICJkNCIsIERBVEE0IH0sCisgIHsgImQ1IiwgREFUQTUgfSwKKyAgeyAiZDYiLCBEQVRBNiB9LAorICB7ICJkNyIsIERBVEE3IH0sCisgIHsgImEwIiwgQUREUjAgfSwKKyAgeyAiYTEiLCBBRERSMSB9LAorICB7ICJhMiIsIEFERFIyIH0sCisgIHsgImEzIiwgQUREUjMgfSwKKyAgeyAiYTQiLCBBRERSNCB9LAorICB7ICJhNSIsIEFERFI1IH0sCisgIHsgImE2IiwgQUREUjYgfSwKKyAgeyAiZnAiLCBBRERSNiB9LAorICB7ICJhNyIsIEFERFI3IH0sCisgIHsgInNwIiwgQUREUjcgfSwKKyAgeyAic3NwIiwgQUREUjcgfSwKKyAgeyAiZnAwIiwgRlAwIH0sCisgIHsgImZwMSIsIEZQMSB9LAorICB7ICJmcDIiLCBGUDIgfSwKKyAgeyAiZnAzIiwgRlAzIH0sCisgIHsgImZwNCIsIEZQNCB9LAorICB7ICJmcDUiLCBGUDUgfSwKKyAgeyAiZnA2IiwgRlA2IH0sCisgIHsgImZwNyIsIEZQNyB9LAorICB7ICJmcGkiLCBGUEkgfSwKKyAgeyAiZnBpYXIiLCBGUEkgfSwKKyAgeyAiZnBjIiwgRlBJIH0sCisgIHsgImZwcyIsIEZQUyB9LAorICB7ICJmcHNyIiwgRlBTIH0sCisgIHsgImZwYyIsIEZQQyB9LAorICB7ICJmcGNyIiwgRlBDIH0sCisgIHsgImNvbnRyb2wiLCBGUEMgfSwKKyAgeyAic3RhdHVzIiwgRlBTIH0sCisgIHsgImlhZGRyIiwgRlBJIH0sCisKKyAgeyAiY29wMCIsIENPUDAgfSwKKyAgeyAiY29wMSIsIENPUDEgfSwKKyAgeyAiY29wMiIsIENPUDIgfSwKKyAgeyAiY29wMyIsIENPUDMgfSwKKyAgeyAiY29wNCIsIENPUDQgfSwKKyAgeyAiY29wNSIsIENPUDUgfSwKKyAgeyAiY29wNiIsIENPUDYgfSwKKyAgeyAiY29wNyIsIENPUDcgfSwKKyAgeyAicGMiLCBQQyB9LAorICB7ICJ6cGMiLCBaUEMgfSwKKyAgeyAic3IiLCBTUiB9LAorCisgIHsgImNjciIsIENDUiB9LAorICB7ICJjYyIsIENDUiB9LAorCisgIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCisgIHsgInNmYyIsIFNGQyB9LAkJLyogU291cmNlIEZ1bmN0aW9uIENvZGUgKi8KKyAgeyAic2ZjciIsIFNGQyB9LAorICB7ICJkZmMiLCBERkMgfSwJCS8qIERlc3RpbmF0aW9uIEZ1bmN0aW9uIENvZGUgKi8KKyAgeyAiZGZjciIsIERGQyB9LAorICB7ICJjYWNyIiwgQ0FDUiB9LAkJLyogQ2FjaGUgQ29udHJvbCBSZWdpc3RlciAqLworICB7ICJjYWFyIiwgQ0FBUiB9LAkJLyogQ2FjaGUgQWRkcmVzcyBSZWdpc3RlciAqLworCisgIHsgInVzcCIsIFVTUCB9LAkJLyogVXNlciBTdGFjayBQb2ludGVyICovCisgIHsgInZiciIsIFZCUiB9LAkJLyogVmVjdG9yIEJhc2UgUmVnaXN0ZXIgKi8KKyAgeyAibXNwIiwgTVNQIH0sCQkvKiBNYXN0ZXIgU3RhY2sgUG9pbnRlciAqLworICB7ICJpc3AiLCBJU1AgfSwJCS8qIEludGVycnVwdCBTdGFjayBQb2ludGVyICovCisKKyAgeyAiaXR0MCIsIElUVDAgfSwJCS8qIEluc3RydWN0aW9uIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZyAwICovCisgIHsgIml0dDEiLCBJVFQxIH0sCQkvKiBJbnN0cnVjdGlvbiBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWcgMSAqLworICB7ICJkdHQwIiwgRFRUMCB9LAkJLyogRGF0YSBUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiBSZWdpc3RlciAwICovCisgIHsgImR0dDEiLCBEVFQxIH0sCQkvKiBEYXRhIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZ2lzdGVyIDEgKi8KKworICAvKiA2OGVjMDQwIHZlcnNpb25zIG9mIHNhbWUgKi8KKyAgeyAiaWFjcjAiLCBJVFQwIH0sCQkvKiBJbnN0cnVjdGlvbiBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciAwICovCisgIHsgImlhY3IxIiwgSVRUMSB9LAkJLyogSW5zdHJ1Y3Rpb24gQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLworICB7ICJkYWNyMCIsIERUVDAgfSwJCS8qIERhdGEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLworICB7ICJkYWNyMSIsIERUVDEgfSwJCS8qIERhdGEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgMCAqLworCisgIC8qIG1jZjUyMDAgdmVyc2lvbnMgb2Ygc2FtZS4gIFRoZSBDb2xkRmlyZSBwcm9ncmFtbWVyJ3MgcmVmZXJlbmNlCisgICAgIG1hbnVhbCBpbmRpY2F0ZWQgdGhhdCB0aGUgb3JkZXIgaXMgMiwzLDAsMSwgYnV0IEtlbiBSb3NlCisgICAgIDxyb3NlQG5ldGNvbS5jb20+IHNheXMgdGhhdCAwLDEsMiwzIGlzIHRoZSBjb3JyZWN0IG9yZGVyLiAgKi8KKyAgeyAiYWNyMCIsIElUVDAgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMCAqLworICB7ICJhY3IxIiwgSVRUMSB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAxICovCisgIHsgImFjcjIiLCBEVFQwIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDIgKi8KKyAgeyAiYWNyMyIsIERUVDEgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMyAqLworCisgIHsgInRjIiwgVEMgfSwJCQkvKiBNTVUgVHJhbnNsYXRpb24gQ29udHJvbCBSZWdpc3RlciAqLworICB7ICJ0Y3IiLCBUQyB9LAorCisgIHsgIm1tdXNyIiwgTU1VU1IgfSwJCS8qIE1NVSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyAgeyAic3JwIiwgU1JQIH0sCQkvKiBVc2VyIFJvb3QgUG9pbnRlciAqLworICB7ICJ1cnAiLCBVUlAgfSwJCS8qIFN1cGVydmlzb3IgUm9vdCBQb2ludGVyICovCisKKyAgeyAiYnVzY3IiLCBCVVNDUiB9LAorICB7ICJwY3IiLCBQQ1IgfSwKKworICB7ICJyb21iYXIiLCBST01CQVIgfSwJCS8qIFJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyAgeyAicmFtYmFyMCIsIFJBTUJBUjAgfSwJLyogUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLworICB7ICJyYW1iYXIxIiwgUkFNQkFSMSB9LAkvKiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisgIHsgIm1iYXIiLCBNQkFSIH0sCQkvKiBNb2R1bGUgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisgIC8qIGVuZCBvZiBjb250cm9sIHJlZ2lzdGVycyAqLworCisgIHsgImFjIiwgQUMgfSwKKyAgeyAiYmMiLCBCQyB9LAorICB7ICJjYWwiLCBDQUwgfSwKKyAgeyAiY3JwIiwgQ1JQIH0sCisgIHsgImRycCIsIERSUCB9LAorICB7ICJwY3NyIiwgUENTUiB9LAorICB7ICJwc3IiLCBQU1IgfSwKKyAgeyAic2NjIiwgU0NDIH0sCisgIHsgInZhbCIsIFZBTCB9LAorICB7ICJiYWQwIiwgQkFEMCB9LAorICB7ICJiYWQxIiwgQkFEMSB9LAorICB7ICJiYWQyIiwgQkFEMiB9LAorICB7ICJiYWQzIiwgQkFEMyB9LAorICB7ICJiYWQ0IiwgQkFENCB9LAorICB7ICJiYWQ1IiwgQkFENSB9LAorICB7ICJiYWQ2IiwgQkFENiB9LAorICB7ICJiYWQ3IiwgQkFENyB9LAorICB7ICJiYWMwIiwgQkFDMCB9LAorICB7ICJiYWMxIiwgQkFDMSB9LAorICB7ICJiYWMyIiwgQkFDMiB9LAorICB7ICJiYWMzIiwgQkFDMyB9LAorICB7ICJiYWM0IiwgQkFDNCB9LAorICB7ICJiYWM1IiwgQkFDNSB9LAorICB7ICJiYWM2IiwgQkFDNiB9LAorICB7ICJiYWM3IiwgQkFDNyB9LAorCisgIHsgImljIiwgSUMgfSwKKyAgeyAiZGMiLCBEQyB9LAorICB7ICJuYyIsIE5DIH0sCisKKyAgeyAidHQwIiwgVFQwIH0sCisgIHsgInR0MSIsIFRUMSB9LAorICAvKiA2OGVjMDMwIHZlcnNpb25zIG9mIHNhbWUgKi8KKyAgeyAiYWMwIiwgVFQwIH0sCisgIHsgImFjMSIsIFRUMSB9LAorICAvKiA2OGVjMDMwIGFjY2VzcyBjb250cm9sIHVuaXQsIGlkZW50aWNhbCB0byAwMzAgTU1VIHN0YXR1cyByZWcgKi8KKyAgeyAiYWN1c3IiLCBQU1IgfSwKKworICAvKiBTdXBwcmVzc2VkIGRhdGEgYW5kIGFkZHJlc3MgcmVnaXN0ZXJzLiAgKi8KKyAgeyAiemQwIiwgWkRBVEEwIH0sCisgIHsgInpkMSIsIFpEQVRBMSB9LAorICB7ICJ6ZDIiLCBaREFUQTIgfSwKKyAgeyAiemQzIiwgWkRBVEEzIH0sCisgIHsgInpkNCIsIFpEQVRBNCB9LAorICB7ICJ6ZDUiLCBaREFUQTUgfSwKKyAgeyAiemQ2IiwgWkRBVEE2IH0sCisgIHsgInpkNyIsIFpEQVRBNyB9LAorICB7ICJ6YTAiLCBaQUREUjAgfSwKKyAgeyAiemExIiwgWkFERFIxIH0sCisgIHsgInphMiIsIFpBRERSMiB9LAorICB7ICJ6YTMiLCBaQUREUjMgfSwKKyAgeyAiemE0IiwgWkFERFI0IH0sCisgIHsgInphNSIsIFpBRERSNSB9LAorICB7ICJ6YTYiLCBaQUREUjYgfSwKKyAgeyAiemE3IiwgWkFERFI3IH0sCisKKyAgeyAwLCAwIH0KK307CisKK3N0YXRpYyB2b2lkCitpbml0X3JlZ3RhYmxlICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpbml0X3RhYmxlW2ldLm5hbWU7IGkrKykKKyAgICBpbnNlcnRfcmVnIChpbml0X3RhYmxlW2ldLm5hbWUsIGluaXRfdGFibGVbaV0ubnVtYmVyKTsKK30KKworc3RhdGljIGludCBub182ODg1MSwgbm9fNjg4ODE7CisKKyNpZmRlZiBPQkpfQU9VVAorLyogYS5vdXQgbWFjaGluZSB0eXBlLiAgRGVmYXVsdCB0byA2ODAyMC4gICovCitpbnQgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKKyNlbmRpZgorCit2b2lkCittZF9hc3NlbWJsZSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNvbnN0IGNoYXIgKmVyOworICBzaG9ydCAqZnJvbVA7CisgIGNoYXIgKnRvUCA9IE5VTEw7CisgIGludCBtLCBuID0gMDsKKyAgY2hhciAqdG9fYmVnX1A7CisgIGludCBzaG9ydHNfdGhpc19mcmFnOworICBmaXhTICpmaXhQOworCisgIC8qIEluIE1SSSBtb2RlLCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIG9wZXJhbmRzIGFyZSBzZXBhcmF0ZWQgYnkgYQorICAgICBzcGFjZS4gIEFueXRoaW5nIGZvbGxvd2luZyB0aGUgb3BlcmFuZHMgaXMgYSBjb21tZW50LiAgVGhlIGxhYmVsCisgICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4gICovCisgIGlmIChmbGFnX21yaSkKKyAgICB7CisgICAgICBjaGFyICpzOworICAgICAgaW50IGZpZWxkcyA9IDA7CisgICAgICBpbnQgaW5maWVsZCA9IDA7CisgICAgICBpbnQgaW5xdW90ZSA9IDA7CisKKyAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJzsgcysrKQorCXsKKwkgIGlmICgoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpICYmICEgaW5xdW90ZSkKKwkgICAgeworCSAgICAgIGlmIChpbmZpZWxkKQorCQl7CisJCSAgKytmaWVsZHM7CisJCSAgaWYgKGZpZWxkcyA+PSAyKQorCQkgICAgeworCQkgICAgICAqcyA9ICdcMCc7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGluZmllbGQgPSAwOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghIGluZmllbGQpCisJCWluZmllbGQgPSAxOworCSAgICAgIGlmICgqcyA9PSAnXCcnKQorCQlpbnF1b3RlID0gISBpbnF1b3RlOworCSAgICB9CisJfQorICAgIH0KKworICBtZW1zZXQgKChjaGFyICopICgmdGhlX2lucyksICdcMCcsIHNpemVvZiAodGhlX2lucykpOworICBtNjhrX2lwIChzdHIpOworICBlciA9IHRoZV9pbnMuZXJyb3I7CisgIGlmICghZXIpCisgICAgeworICAgICAgZm9yIChuID0gMDsgbiA8IHRoZV9pbnMubnVtYXJnczsgbisrKQorCWlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQorCSAgeworCSAgICBlciA9IHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3I7CisJICAgIGJyZWFrOworCSAgfQorICAgIH0KKyAgaWYgKGVyKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiJXMgLS0gc3RhdGVtZW50IGAlcycgaWdub3JlZCIpLCBlciwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSWYgdGhlcmUgaXMgYSBjdXJyZW50IGxhYmVsLCByZWNvcmQgdGhhdCBpdCBtYXJrcyBhbiBpbnN0cnVjdGlvbi4gICovCisgIGlmIChjdXJyZW50X2xhYmVsICE9IE5VTEwpCisgICAgeworICAgICAgY3VycmVudF9sYWJlbC0+dGV4dCA9IDE7CisgICAgICBjdXJyZW50X2xhYmVsID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHRoZV9pbnMubmZyYWcgPT0gMCkKKyAgICB7CisgICAgICAvKiBObyBmcmFnIGhhY2tpbmcgaW52b2x2ZWQ7IGp1c3QgcHV0IGl0IG91dCAqLworICAgICAgdG9QID0gZnJhZ19tb3JlICgyICogdGhlX2lucy5udW1vKTsKKyAgICAgIGZyb21QID0gJnRoZV9pbnMub3Bjb2RlWzBdOworICAgICAgZm9yIChtID0gdGhlX2lucy5udW1vOyBtOyAtLW0pCisJeworCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7CisJICB0b1AgKz0gMjsKKwkgIGZyb21QKys7CisJfQorICAgICAgLyogcHV0IG91dCBzeW1ib2wtZGVwZW5kZW50IGluZm8gKi8KKyAgICAgIGZvciAobSA9IDA7IG0gPCB0aGVfaW5zLm5yZWw7IG0rKykKKwl7CisJICBzd2l0Y2ggKHRoZV9pbnMucmVsb2NbbV0ud2lkKQorCSAgICB7CisJICAgIGNhc2UgJ0InOgorCSAgICAgIG4gPSAxOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdiJzoKKwkgICAgICBuID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnMyc6CisJICAgICAgbiA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3cnOgorCSAgICBjYXNlICdXJzoKKwkgICAgICBuID0gMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnbCc6CisJICAgICAgbiA9IDQ7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYXNfZmF0YWwgKF8oIkRvbid0IGtub3cgaG93IHRvIGZpZ3VyZSB3aWR0aCBvZiAlYyBpbiBtZF9hc3NlbWJsZSgpIiksCisJCQl0aGVfaW5zLnJlbG9jW21dLndpZCk7CisJICAgIH0KKworCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJCSAgICAgICgodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCisJCQkgICAgICAgLSB0aGVfaW5zLm51bW8gKiAyICsgdGhlX2lucy5yZWxvY1ttXS5uKSwKKwkJCSAgICAgIG4sCisJCQkgICAgICAmdGhlX2lucy5yZWxvY1ttXS5leHAsCisJCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAorCQkJICAgICAgZ2V0X3JlbG9jX2NvZGUgKG4sIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCisJCQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7CisJICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKKwkgIGlmICh0aGVfaW5zLnJlbG9jW21dLndpZCA9PSAnQicpCisJICAgIGZpeFAtPmZ4X3NpZ25lZCA9IDE7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBUaGVyZSdzIHNvbWUgZnJhZyBoYWNraW5nICovCisgIGZvciAobiA9IDAsIGZyb21QID0gJnRoZV9pbnMub3Bjb2RlWzBdOyBuIDwgdGhlX2lucy5uZnJhZzsgbisrKQorICAgIHsKKyAgICAgIGludCB3aWQ7CisKKyAgICAgIGlmIChuID09IDApCisJd2lkID0gMiAqIHRoZV9pbnMuZnJhZ2Jbbl0uZnJhZ29mZjsKKyAgICAgIGVsc2UKKwl3aWQgPSAyICogKHRoZV9pbnMubnVtbyAtIHRoZV9pbnMuZnJhZ2JbbiAtIDFdLmZyYWdvZmYpOworICAgICAgdG9QID0gZnJhZ19tb3JlICh3aWQpOworICAgICAgdG9fYmVnX1AgPSB0b1A7CisgICAgICBzaG9ydHNfdGhpc19mcmFnID0gMDsKKyAgICAgIGZvciAobSA9IHdpZCAvIDI7IG07IC0tbSkKKwl7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgKGxvbmcpICgqZnJvbVApLCAyKTsKKwkgIHRvUCArPSAyOworCSAgZnJvbVArKzsKKwkgIHNob3J0c190aGlzX2ZyYWcrKzsKKwl9CisgICAgICBmb3IgKG0gPSAwOyBtIDwgdGhlX2lucy5ucmVsOyBtKyspCisJeworCSAgaWYgKCh0aGVfaW5zLnJlbG9jW21dLm4pID49IDIgKiBzaG9ydHNfdGhpc19mcmFnKQorCSAgICB7CisJICAgICAgdGhlX2lucy5yZWxvY1ttXS5uIC09IDIgKiBzaG9ydHNfdGhpc19mcmFnOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICB3aWQgPSB0aGVfaW5zLnJlbG9jW21dLndpZDsKKwkgIGlmICh3aWQgPT0gMCkKKwkgICAgY29udGludWU7CisJICB0aGVfaW5zLnJlbG9jW21dLndpZCA9IDA7CisJICB3aWQgPSAod2lkID09ICdiJykgPyAxIDogKHdpZCA9PSAndycpID8gMiA6ICh3aWQgPT0gJ2wnKSA/IDQgOiA0MDAwOworCisJICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAorCQkJICAgICAgKCh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKKwkJCSAgICAgICAtIHRoZV9pbnMubnVtbyAqIDIgKyB0aGVfaW5zLnJlbG9jW21dLm4pLAorCQkJICAgICAgd2lkLAorCQkJICAgICAgJnRoZV9pbnMucmVsb2NbbV0uZXhwLAorCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKKwkJCSAgICAgIGdldF9yZWxvY19jb2RlICh3aWQsIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCisJCQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7CisJICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKKwl9CisgICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMCwKKwkJICAgICAgIChyZWxheF9zdWJzdGF0ZVQpICh0aGVfaW5zLmZyYWdiW25dLmZyYWd0eSksCisJCSAgICAgICB0aGVfaW5zLmZyYWdiW25dLmZhZGQsIHRoZV9pbnMuZnJhZ2Jbbl0uZm9mZiwgdG9fYmVnX1ApOworICAgIH0KKyAgbiA9ICh0aGVfaW5zLm51bW8gLSB0aGVfaW5zLmZyYWdiW24gLSAxXS5mcmFnb2ZmKTsKKyAgc2hvcnRzX3RoaXNfZnJhZyA9IDA7CisgIGlmIChuKQorICAgIHsKKyAgICAgIHRvUCA9IGZyYWdfbW9yZSAobiAqIHNpemVvZiAoc2hvcnQpKTsKKyAgICAgIHdoaWxlIChuLS0pCisJeworCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIChsb25nKSAoKmZyb21QKSwgMik7CisJICB0b1AgKz0gMjsKKwkgIGZyb21QKys7CisJICBzaG9ydHNfdGhpc19mcmFnKys7CisJfQorICAgIH0KKyAgZm9yIChtID0gMDsgbSA8IHRoZV9pbnMubnJlbDsgbSsrKQorICAgIHsKKyAgICAgIGludCB3aWQ7CisKKyAgICAgIHdpZCA9IHRoZV9pbnMucmVsb2NbbV0ud2lkOworICAgICAgaWYgKHdpZCA9PSAwKQorCWNvbnRpbnVlOworICAgICAgdGhlX2lucy5yZWxvY1ttXS53aWQgPSAwOworICAgICAgd2lkID0gKHdpZCA9PSAnYicpID8gMSA6ICh3aWQgPT0gJ3cnKSA/IDIgOiAod2lkID09ICdsJykgPyA0IDogNDAwMDsKKworICAgICAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJCSAgKCh0aGVfaW5zLnJlbG9jW21dLm4gKyB0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKKwkJCSAgIC0gc2hvcnRzX3RoaXNfZnJhZyAqIDIpLAorCQkJICB3aWQsCisJCQkgICZ0aGVfaW5zLnJlbG9jW21dLmV4cCwKKwkJCSAgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKKwkJCSAgZ2V0X3JlbG9jX2NvZGUgKHdpZCwgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKKwkJCQkJICB0aGVfaW5zLnJlbG9jW21dLnBpY19yZWxvYykpOworICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gdGhlX2lucy5yZWxvY1ttXS5wY3JlbF9maXg7CisgICAgfQorfQorCit2b2lkCittZF9iZWdpbiAoKQoreworICAvKgorICAgKiBtZF9iZWdpbiAtLSBzZXQgdXAgaGFzaCB0YWJsZXMgd2l0aCA2ODAwMCBpbnN0cnVjdGlvbnMuCisgICAqIHNpbWlsYXIgdG8gd2hhdCB0aGUgdmF4IGFzc2VtYmxlciBkb2VzLiAgLS0tcGhyCisgICAqLworICAvKiBSTVMgY2xhaW1zIHRoZSB0aGluZyB0byBkbyBpcyB0YWtlIHRoZSBtNjhrLW9wY29kZS5oIHRhYmxlLCBhbmQgbWFrZQorICAgICBhIGNvcHkgb2YgaXQgYXQgcnVudGltZSwgYWRkaW5nIGluIHRoZSBpbmZvcm1hdGlvbiB3ZSB3YW50IGJ1dCBpc24ndAorICAgICB0aGVyZS4gIEkgdGhpbmsgaXQnZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhbiBhd2sgc2NyaXB0IGhhY2sgdGhlIHRhYmxlCisgICAgIGF0IGNvbXBpbGUgdGltZS4gIE9yIGV2ZW4ganVzdCB4c3RyIHRoZSB0YWJsZSBhbmQgdXNlIGl0IGFzLWlzLiAgQnV0CisgICAgIG15IGxvcmQgZ2hvZCBoYXRoIHNwb2tlbiwgc28gd2UgZG8gaXQgdGhpcyB3YXkuICBFeGN1c2UgdGhlIHVnbHkgdmFyCisgICAgIG5hbWVzLiAgKi8KKworICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKmluczsKKyAgcmVnaXN0ZXIgc3RydWN0IG02OGtfaW5jYW50ICpoYWNrLCAqc2xhazsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gMDsJLyogZW1wdHkgc3RyaW5nLCBvciBlcnJvciBtc2cgdGV4dCAqLworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgcmVnaXN0ZXIgY2hhciBjOworCisgIGlmIChmbGFnX21yaSkKKyAgICB7CisgICAgICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSAxOworICAgICAgbTY4a19hYnNwY2FkZCA9IDE7CisgICAgICBpZiAoISBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSkKKwltNjhrX3JlbDMyID0gMDsKKyAgICB9CisKKyAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOworCisgIG9ic3RhY2tfYmVnaW4gKCZyb2J5biwgNDAwMCk7CisgIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bW9wY29kZXM7IGkrKykKKyAgICB7CisgICAgICBoYWNrID0gc2xhayA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOworICAgICAgZG8KKwl7CisJICBpbnMgPSAmbTY4a19vcGNvZGVzW2ldOworCSAgLyogV2UgKmNvdWxkKiBpZ25vcmUgaW5zbnMgdGhhdCBkb24ndCBtYXRjaCBvdXIgYXJjaCBoZXJlCisJICAgICBidXQganVzdCBsZWF2aW5nIHRoZW0gb3V0IG9mIHRoZSBoYXNoLiAqLworCSAgc2xhay0+bV9vcGVyYW5kcyA9IGlucy0+YXJnczsKKwkgIHNsYWstPm1fb3BudW0gPSBzdHJsZW4gKHNsYWstPm1fb3BlcmFuZHMpIC8gMjsKKwkgIHNsYWstPm1fYXJjaCA9IGlucy0+YXJjaDsKKwkgIHNsYWstPm1fb3Bjb2RlID0gaW5zLT5vcGNvZGU7CisJICAvKiBUaGlzIGlzIGtsdWRnZXkgKi8KKwkgIHNsYWstPm1fY29kZW51bSA9ICgoaW5zLT5tYXRjaCkgJiAweGZmZmZMKSA/IDIgOiAxOworCSAgaWYgKGkgKyAxICE9IG02OGtfbnVtb3Bjb2RlcworCSAgICAgICYmICFzdHJjbXAgKGlucy0+bmFtZSwgbTY4a19vcGNvZGVzW2kgKyAxXS5uYW1lKSkKKwkgICAgeworCSAgICAgIHNsYWstPm1fbmV4dCA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikgb2JzdGFja19hbGxvYyAoJnJvYnluLCBzaXplb2YgKHN0cnVjdCBtNjhrX2luY2FudCkpOworCSAgICAgIGkrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzbGFrLT5tX25leHQgPSAwOworCSAgc2xhayA9IHNsYWstPm1fbmV4dDsKKwl9CisgICAgICB3aGlsZSAoc2xhayk7CisKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBpbnMtPm5hbWUsIChjaGFyICopIGhhY2spOworICAgICAgaWYgKHJldHZhbCkKKwlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIpLCBpbnMtPm5hbWUsIHJldHZhbCk7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBtNjhrX251bWFsaWFzZXM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gbTY4a19vcGNvZGVfYWxpYXNlc1tpXS5wcmltYXJ5OworICAgICAgY29uc3QgY2hhciAqYWxpYXMgPSBtNjhrX29wY29kZV9hbGlhc2VzW2ldLmFsaWFzOworICAgICAgUFRSIHZhbCA9IGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7CisgICAgICBpZiAoIXZhbCkKKwlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIpLCBuYW1lKTsKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBhbGlhcywgdmFsKTsKKyAgICAgIGlmIChyZXR2YWwpCisJYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBoYXNoICVzOiAlcyIpLCBhbGlhcywgcmV0dmFsKTsKKyAgICB9CisKKyAgLyogSW4gTVJJIG1vZGUsIGFsbCB1bnNpemVkIGJyYW5jaGVzIGFyZSB2YXJpYWJsZSBzaXplZC4gIE5vcm1hbGx5LAorICAgICB0aGV5IGFyZSB3b3JkIHNpemVkLiAgKi8KKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHN0YXRpYyBzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMgbXJpX2FsaWFzZXNbXSA9CisJeworCSAgeyAiYmhpIiwJImpoaSIsIH0sCisJICB7ICJibHMiLAkiamxzIiwgfSwKKwkgIHsgImJjYyIsCSJqY2MiLCB9LAorCSAgeyAiYmNzIiwJImpjcyIsIH0sCisJICB7ICJibmUiLAkiam5lIiwgfSwKKwkgIHsgImJlcSIsCSJqZXEiLCB9LAorCSAgeyAiYnZjIiwJImp2YyIsIH0sCisJICB7ICJidnMiLAkianZzIiwgfSwKKwkgIHsgImJwbCIsCSJqcGwiLCB9LAorCSAgeyAiYm1pIiwJImptaSIsIH0sCisJICB7ICJiZ2UiLAkiamdlIiwgfSwKKwkgIHsgImJsdCIsCSJqbHQiLCB9LAorCSAgeyAiYmd0IiwJImpndCIsIH0sCisJICB7ICJibGUiLAkiamxlIiwgfSwKKwkgIHsgImJyYSIsCSJqcmEiLCB9LAorCSAgeyAiYnNyIiwJImpic3IiLCB9LAorCX07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgbXJpX2FsaWFzZXMgLyBzaXplb2YgbXJpX2FsaWFzZXNbMF07IGkrKykKKwl7CisJICBjb25zdCBjaGFyICpuYW1lID0gbXJpX2FsaWFzZXNbaV0ucHJpbWFyeTsKKwkgIGNvbnN0IGNoYXIgKmFsaWFzID0gbXJpX2FsaWFzZXNbaV0uYWxpYXM7CisJICBQVFIgdmFsID0gaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKKwkgIGlmICghdmFsKQorCSAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGZpbmQgJXMgaW4gaGFzaCB0YWJsZSIpLCBuYW1lKTsKKwkgIHJldHZhbCA9IGhhc2hfamFtIChvcF9oYXNoLCBhbGlhcywgdmFsKTsKKwkgIGlmIChyZXR2YWwpCisJICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiKSwgYWxpYXMsIHJldHZhbCk7CisJfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChta2xvd2VyX3RhYmxlKTsgaSsrKQorICAgIG1rbG93ZXJfdGFibGVbaV0gPSAoaXN1cHBlciAoYyA9IChjaGFyKSBpKSkgPyB0b2xvd2VyIChjKSA6IGM7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobm90ZW5kX3RhYmxlKTsgaSsrKQorICAgIHsKKyAgICAgIG5vdGVuZF90YWJsZVtpXSA9IDA7CisgICAgICBhbHRfbm90ZW5kX3RhYmxlW2ldID0gMDsKKyAgICB9CisgIG5vdGVuZF90YWJsZVsnLCddID0gMTsKKyAgbm90ZW5kX3RhYmxlWyd7J10gPSAxOworICBub3RlbmRfdGFibGVbJ30nXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJ2EnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJ0EnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJ2QnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJ0QnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJyMnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJyYnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJ2YnXSA9IDE7CisgIGFsdF9ub3RlbmRfdGFibGVbJ0YnXSA9IDE7CisjaWZkZWYgUkVHSVNURVJfUFJFRklYCisgIGFsdF9ub3RlbmRfdGFibGVbUkVHSVNURVJfUFJFRklYXSA9IDE7CisjZW5kaWYKKworICAvKiBXZSBuZWVkIHRvIHB1dCAnKCcgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKKyAgICAgICBjYXMyICVkMDolZDIsJWQzOiVkNCwoJWEwKTooJWExKQorICAgICAqLworICBhbHRfbm90ZW5kX3RhYmxlWycoJ10gPSAxOworCisgIC8qIFdlIG5lZWQgdG8gcHV0ICdAJyBpbiBhbHRfbm90ZW5kX3RhYmxlIHRvIGhhbmRsZQorICAgICAgIGNhczIgJWQwOiVkMiwlZDM6JWQ0LEAoJWQwKTpAKCVkMSkKKyAgICAgKi8KKyAgYWx0X25vdGVuZF90YWJsZVsnQCddID0gMTsKKworICAvKiBXZSBuZWVkIHRvIHB1dCBkaWdpdHMgaW4gYWx0X25vdGVuZF90YWJsZSB0byBoYW5kbGUKKyAgICAgICBiZmV4dHUgJWQwezI0OjF9LCVkMAorICAgICAqLworICBhbHRfbm90ZW5kX3RhYmxlWycwJ10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWycxJ10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWycyJ10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyczJ10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyc0J10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyc1J10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyc2J10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyc3J10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyc4J10gPSAxOworICBhbHRfbm90ZW5kX3RhYmxlWyc5J10gPSAxOworCisjaWZuZGVmIE1JVF9TWU5UQVhfT05MWQorICAvKiBJbnNlcnQgcHNldWRvIG9wcywgdGhlc2UgaGF2ZSB0byBnbyBpbnRvIHRoZSBvcGNvZGUgdGFibGUgc2luY2UKKyAgICAgZ2FzIGV4cGVjdHMgcHNldWRvIG9wcyB0byBzdGFydCB3aXRoIGEgZG90ICovCisgIHsKKyAgICBpbnQgbiA9IDA7CisgICAgd2hpbGUgKG1vdGVfcHNldWRvX3RhYmxlW25dLnBvY19uYW1lKQorICAgICAgeworCWhhY2sgPSAoc3RydWN0IG02OGtfaW5jYW50ICopCisJICBvYnN0YWNrX2FsbG9jICgmcm9ieW4sIHNpemVvZiAoc3RydWN0IG02OGtfaW5jYW50KSk7CisJaGFzaF9pbnNlcnQgKG9wX2hhc2gsCisJCSAgICAgbW90ZV9wc2V1ZG9fdGFibGVbbl0ucG9jX25hbWUsIChjaGFyICopIGhhY2spOworCWhhY2stPm1fb3BlcmFuZHMgPSAwOworCWhhY2stPm1fb3BudW0gPSBuOworCW4rKzsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgaW5pdF9yZWd0YWJsZSAoKTsKKworI2lmZGVmIE9CSl9FTEYKKyAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKKyAgcmVjb3JkX2FsaWdubWVudCAoZGF0YV9zZWN0aW9uLCAyKTsKKyAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIDIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitzZWxlY3RfY29udHJvbF9yZWdzICgpCit7CisgIC8qIE5vdGUgd2hpY2ggc2V0IG9mICJtb3ZlYyIgY29udHJvbCByZWdpc3RlcnMgaXMgYXZhaWxhYmxlLiAgKi8KKyAgc3dpdGNoIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQorICAgIHsKKyAgICBjYXNlIG02ODAwMDoKKyAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAwMF9jb250cm9sX3JlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIG02ODAxMDoKKyAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAxMF9jb250cm9sX3JlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIG02ODAyMDoKKyAgICBjYXNlIG02ODAzMDoKKyAgICAgIGNvbnRyb2xfcmVncyA9IG02ODAyMF9jb250cm9sX3JlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIG02ODA0MDoKKyAgICAgIGNvbnRyb2xfcmVncyA9IG02ODA0MF9jb250cm9sX3JlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIG02ODA2MDoKKyAgICAgIGNvbnRyb2xfcmVncyA9IG02ODA2MF9jb250cm9sX3JlZ3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNwdTMyOgorICAgICAgY29udHJvbF9yZWdzID0gY3B1MzJfY29udHJvbF9yZWdzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBtY2Y1MjAwOgorICAgICAgY29udHJvbF9yZWdzID0gbWNmNTIwMF9jb250cm9sX3JlZ3M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCittNjhrX2luaXRfYWZ0ZXJfYXJncyAoKQoreworICBpZiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA9PSAwKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOworCisgICAgICBpZiAoKmRlZmF1bHRfY3B1ID09ICdtJykKKwlkZWZhdWx0X2NwdSsrOworICAgICAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKKwlpZiAoc3RyY2FzZWNtcCAoZGVmYXVsdF9jcHUsIGFyY2hzW2ldLm5hbWUpID09IDApCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG5fYXJjaHMpCisJeworCSAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgZGVmYXVsdCBjcHUgYCVzJyA/Pz8iKSwgVEFSR0VUX0NQVSk7CisJICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjgwMjA7CisJfQorICAgICAgZWxzZQorCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7CisgICAgfQorICAvKiBQZXJtaXQgbTY4ODgxIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgY3B1czsgdGhvc2UgdGhhdCBjYW4ndCB3b3JrCisgICAgIHdpdGggYSBjb3Byb2Nlc3NvciBjb3VsZCBiZSBkb2luZyBlbXVsYXRpb24uICAqLworICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDQwKQorCXsKKwkgIGFzX3dhcm4gKF8oIjY4MDQwIGFuZCA2ODg1MSBzcGVjaWZpZWQ7IG1tdSBpbnN0cnVjdGlvbnMgbWF5IGFzc2VtYmxlIGluY29ycmVjdGx5IikpOworCX0KKyAgICB9CisgIC8qIFdoYXQgb3RoZXIgaW5jb21wYXRpYmlsaXRpZXMgY291bGQgd2UgY2hlY2sgZm9yPyAgKi8KKworICAvKiBUb3NzIGluIHNvbWUgZGVmYXVsdCBhc3N1bXB0aW9ucyBhYm91dCBjb3Byb2Nlc3NvcnMuICAqLworICBpZiAoIW5vXzY4ODgxCisgICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQorCSAgLyogQ2FuIENQVTMyIGhhdmUgYSA2ODg4MSBjb3Byb2Nlc3Nvcj8/ICAqLworCSAgJiAobTY4MDIwIHwgbTY4MDMwIHwgY3B1MzIpKSkKKyAgICB7CisgICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4ODE7CisgICAgfQorICBpZiAoIW5vXzY4ODUxCisgICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODAyMHVwKSAhPSAwCisgICAgICAmJiAoY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSAmIG02ODA0MHVwKSA9PSAwKQorICAgIHsKKyAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKKyAgICB9CisgIGlmIChub182ODg4MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4ODEpKQorICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4ODEgYW5kIG5vLTY4ODgxIGJvdGggZ2l2ZW4iKSk7CisgIGlmIChub182ODg1MSAmJiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjg4NTEpKQorICAgIGFzX2JhZCAoXygib3B0aW9ucyBmb3IgNjg4NTEgYW5kIG5vLTY4ODUxIGJvdGggZ2l2ZW4iKSk7CisKKyNpZmRlZiBPQkpfQU9VVAorICAvKiBXb3JrIG91dCB0aGUgbWFnaWMgbnVtYmVyLiAgVGhpcyBpc24ndCB2ZXJ5IGdlbmVyYWwuICAqLworICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMDApCisgICAgbTY4a19hb3V0X21hY2h0eXBlID0gMDsKKyAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMTApCisgICAgbTY4a19hb3V0X21hY2h0eXBlID0gMTsKKyAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgJiBtNjgwMjApCisgICAgbTY4a19hb3V0X21hY2h0eXBlID0gMjsKKyAgZWxzZQorICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDI7CisjZW5kaWYKKworICAvKiBOb3RlIHdoaWNoIHNldCBvZiAibW92ZWMiIGNvbnRyb2wgcmVnaXN0ZXJzIGlzIGF2YWlsYWJsZS4gICovCisgIHNlbGVjdF9jb250cm9sX3JlZ3MgKCk7CisKKyAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKKyAgICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKKyAgICBtZF9yZWxheF90YWJsZVtUQUIgKFBDSU5ERVgsIEJZVEUpXS5ybHhfbW9yZSA9IDA7Cit9CisMCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZC4gICovCisKK3ZvaWQKK202OGtfZnJvYl9sYWJlbCAoc3ltKQorICAgICBzeW1ib2xTICpzeW07Cit7CisgIHN0cnVjdCBsYWJlbF9saW5lICpuOworCisgIG4gPSAoc3RydWN0IGxhYmVsX2xpbmUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbi0+bmV4dCA9IGxhYmVsczsKKyAgbi0+bGFiZWwgPSBzeW07CisgIGFzX3doZXJlICgmbi0+ZmlsZSwgJm4tPmxpbmUpOworICBuLT50ZXh0ID0gMDsKKyAgbGFiZWxzID0gbjsKKyAgY3VycmVudF9sYWJlbCA9IG47Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBpbnN0cnVjdGlvbiBpcyBlbWl0dGVkLiAgKi8KKwordm9pZAorbTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCAoKQoreworICBjdXJyZW50X2xhYmVsID0gTlVMTDsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHksIHdoZW4gdGhlIGZpbmFsIHZhbHVlIG9mCisgICB0aGUgbGFiZWwgaXMga25vd24uICBXZSB3YXJuIGlmIHRoaXMgaXMgYSB0ZXh0IHN5bWJvbCBhbGlnbmVkIGF0IGFuCisgICBvZGQgbG9jYXRpb24uICAqLworCit2b2lkCittNjhrX2Zyb2Jfc3ltYm9sIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gcmVnX3NlY3Rpb24KKyAgICAgICYmIChpbnQpIFNfR0VUX1ZBTFVFIChzeW0pIDwgMCkKKyAgICB7CisgICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGFic29sdXRlX3NlY3Rpb24pOworICAgICAgU19TRVRfVkFMVUUgKHN5bSwgfihpbnQpU19HRVRfVkFMVUUgKHN5bSkpOworICAgIH0KKyAgZWxzZSBpZiAoKFNfR0VUX1ZBTFVFIChzeW0pICYgMSkgIT0gMCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbGFiZWxfbGluZSAqbDsKKworICAgICAgZm9yIChsID0gbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorCXsKKwkgIGlmIChsLT5sYWJlbCA9PSBzeW0pCisJICAgIHsKKwkgICAgICBpZiAobC0+dGV4dCkKKwkJYXNfd2Fybl93aGVyZSAobC0+ZmlsZSwgbC0+bGluZSwKKwkJCSAgICAgICBfKCJ0ZXh0IGxhYmVsIGAlcycgYWxpZ25lZCB0byBvZGQgYm91bmRhcnkiKSwKKwkJCSAgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9Cit9CisMCisvKiBUaGlzIGlzIGNhbGxlZCBpZiB3ZSBnbyBpbiBvciBvdXQgb2YgTVJJIG1vZGUgYmVjYXVzZSBvZiB0aGUgLm1yaQorICAgcHNldWRvLW9wLiAgKi8KKwordm9pZAorbTY4a19tcmlfbW9kZV9jaGFuZ2UgKG9uKQorICAgICBpbnQgb247Cit7CisgIGlmIChvbikKKyAgICB7CisgICAgICBpZiAoISBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCisJeworCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKKyNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKKwkgIGluaXRfcmVndGFibGUgKCk7CisjZW5kaWYKKwl9CisgICAgICBtNjhrX2Fic3BjYWRkID0gMTsKKyAgICAgIGlmICghIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKQorCW02OGtfcmVsMzIgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIHJlZ19wcmVmaXhfb3B0aW9uYWxfc2VlbikKKwl7CisjaWZkZWYgUkVHSVNURVJfUFJFRklYX09QVElPTkFMCisJICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7CisjZWxzZQorCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMDsKKyNlbmRpZgorI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAorCSAgaW5pdF9yZWd0YWJsZSAoKTsKKyNlbmRpZgorCX0KKyAgICAgIG02OGtfYWJzcGNhZGQgPSAwOworICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCisJbTY4a19yZWwzMiA9IDE7CisgICAgfQorfQorCisvKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCisjZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKKworLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisgICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCisgICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCisgICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKKyAgTElUVExFTlVNX1RZUEUgKndvcmRQOworICBjaGFyICp0OworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7CisgICAgfQorICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKworICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK21kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG47Cit7CisgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKK30KKworc3RhdGljIHZvaWQKK21kX2FwcGx5X2ZpeF8yIChmaXhQLCB2YWwpCisgICAgIGZpeFMgKmZpeFA7CisgICAgIG9mZnNldFQgdmFsOworeworICBhZGRyZXNzVCB1cHBlcl9saW1pdDsKKyAgb2Zmc2V0VCBsb3dlcl9saW1pdDsKKworICAvKiBUaGlzIGlzIHVubmVjZXNzYXJ5IGJ1dCBpdCBjb252aW5jZXMgdGhlIG5hdGl2ZSByczYwMDAgY29tcGlsZXIKKyAgICAgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgd2Ugd2FudC4gICovCisgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7CisgIGJ1ZiArPSBmaXhQLT5meF93aGVyZTsKKyAgLyogZW5kIGlibSBjb21waWxlciB3b3JrYXJvdW5kICovCisKKyAgaWYgKHZhbCAmIDB4ODAwMDAwMDApCisgICAgdmFsIHw9IH4oYWRkcmVzc1QpMHg3ZmZmZmZmZjsKKyAgZWxzZQorICAgIHZhbCAmPSAweDdmZmZmZmZmOworCisjaWZkZWYgT0JKX0VMRgorICBpZiAoZml4UC0+ZnhfYWRkc3kpCisgICAgeworICAgICAgbWVtc2V0IChidWYsIDAsIGZpeFAtPmZ4X3NpemUpOworICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLworCisgICAgICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorCSAgJiYgIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCisJICAmJiAhU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCisJU19TRVRfV0VBSyAoZml4UC0+ZnhfYWRkc3kpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuOworI2VuZGlmCisKKyAgc3dpdGNoIChmaXhQLT5meF9zaXplKQorICAgIHsKKyAgICAgIC8qIFRoZSBjYXN0IHRvIG9mZnNldFQgYmVsb3cgYXJlIG5lY2Vzc2FyeSB0byBtYWtlIGNvZGUgY29ycmVjdCBmb3IKKwkgbWFjaGluZXMgd2hlcmUgaW50cyBhcmUgc21hbGxlciB0aGFuIG9mZnNldFQgKi8KKyAgICBjYXNlIDE6CisgICAgICAqYnVmKysgPSB2YWw7CisgICAgICB1cHBlcl9saW1pdCA9IDB4N2Y7CisgICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4ODA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAqYnVmKysgPSAodmFsID4+IDgpOworICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgdXBwZXJfbGltaXQgPSAweDdmZmY7CisgICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOworICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7CisgICAgICAqYnVmKysgPSAodmFsID4+IDgpOworICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgdXBwZXJfbGltaXQgPSAweDdmZmZmZmZmOworICAgICAgbG93ZXJfbGltaXQgPSAtIChvZmZzZXRUKSAweDdmZmZmZmZmIC0gMTsJLyogYXZvaWQgY29uc3RhbnQgb3ZlcmZsb3cgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBCQURfQ0FTRSAoZml4UC0+Znhfc2l6ZSk7CisgICAgfQorCisgIC8qIEZpeCB1cCBhIG5lZ2F0aXZlIHJlbG9jLiAgKi8KKyAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwgJiYgZml4UC0+Znhfc3Vic3kgIT0gTlVMTCkKKyAgICB7CisgICAgICBmaXhQLT5meF9hZGRzeSA9IGZpeFAtPmZ4X3N1YnN5OworICAgICAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOworICAgICAgZml4UC0+ZnhfdGNiaXQgPSAxOworICAgIH0KKworICAvKiBGb3Igbm9uLXBjLXJlbGF0aXZlIHZhbHVlcywgaXQncyBjb25jZWl2YWJsZSB3ZSBtaWdodCBnZXQgc29tZXRoaW5nCisgICAgIGxpa2UgIjB4ZmYiIGZvciBhIGJ5dGUgZmllbGQuICBTbyBleHRlbmQgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHJhbmdlCisgICAgIHRvIGFjY2VwdCBzdWNoIG51bWJlcnMuICBXZSBhcmJpdHJhcmlseSBkaXNhbGxvdyAiLTB4ZmYiIG9yICIweGZmKzB4ZmYiLAorICAgICBzbyB0aGF0IHdlIGNhbiBkbyBhbnkgcmFuZ2UgY2hlY2tpbmcgYXQgYWxsLiAgKi8KKyAgaWYgKCEgZml4UC0+ZnhfcGNyZWwgJiYgISBmaXhQLT5meF9zaWduZWQpCisgICAgdXBwZXJfbGltaXQgPSB1cHBlcl9saW1pdCAqIDIgKyAxOworCisgIGlmICgoYWRkcmVzc1QpIHZhbCA+IHVwcGVyX2xpbWl0CisgICAgICAmJiAodmFsID4gMCB8fCB2YWwgPCBsb3dlcl9saW1pdCkpCisgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7CisKKyAgLyogQSBvbmUgYnl0ZSBQQy1yZWxhdGl2ZSByZWxvYyBtZWFucyBhIHNob3J0IGJyYW5jaC4gIFdlIGNhbid0IHVzZQorICAgICBhIHNob3J0IGJyYW5jaCB3aXRoIGEgdmFsdWUgb2YgMCBvciAtMSwgYmVjYXVzZSB0aG9zZSBpbmRpY2F0ZQorICAgICBkaWZmZXJlbnQgb3Bjb2RlcyAoYnJhbmNoZXMgd2l0aCBsb25nZXIgb2Zmc2V0cykuICBmaXh1cF9zZWdtZW50CisgICAgIGluIHdyaXRlLmMgbWF5IGhhdmUgY2xvYmJlcmVkIGZ4X3BjcmVsLCBzbyB3ZSBuZWVkIHRvIGV4YW1pbmUgdGhlCisgICAgIHJlbG9jIHR5cGUuICAqLworICBpZiAoKGZpeFAtPmZ4X3BjcmVsCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfOF9QQ1JFTAorI2VuZGlmCisgICAgICAgKQorICAgICAgJiYgZml4UC0+Znhfc2l6ZSA9PSAxCisgICAgICAmJiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAorCSAgfHwgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCisgICAgICAmJiAodmFsID09IDAgfHwgdmFsID09IC0xKSkKKyAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oImludmFsaWQgYnl0ZSBicmFuY2ggb2Zmc2V0IikpOworfQorCisjaWZkZWYgQkZEX0FTU0VNQkxFUgoraW50CittZF9hcHBseV9maXggKGZpeFAsIHZhbHApCisgICAgIGZpeFMgKmZpeFA7CisgICAgIHZhbHVlVCAqdmFscDsKK3sKKyAgbWRfYXBwbHlfZml4XzIgKGZpeFAsIChhZGRyZXNzVCkgKnZhbHApOworICByZXR1cm4gMTsKK30KKyNlbHNlCit2b2lkIG1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQorICAgICBmaXhTICpmaXhQOworICAgICBsb25nIHZhbDsKK3sKKyAgbWRfYXBwbHlfZml4XzIgKGZpeFAsIChhZGRyZXNzVCkgdmFsKTsKK30KKyNlbmRpZgorCisvKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCisgICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplICBUaGVyZSBpcyBVR0xZCisgICBNQUdJQyBoZXJlLiAuLgorICAgKi8KK3N0YXRpYyB2b2lkCittZF9jb252ZXJ0X2ZyYWdfMSAoZnJhZ1ApCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKK3sKKyAgbG9uZyBkaXNwOworICBsb25nIGV4dCA9IDA7CisgIGZpeFMgKmZpeFA7CisKKyAgLyogQWRkcmVzcyBpbiBvYmplY3QgY29kZSBvZiB0aGUgZGlzcGxhY2VtZW50LiAgKi8KKyAgcmVnaXN0ZXIgaW50IG9iamVjdF9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOworCisgIC8qIEFkZHJlc3MgaW4gZ2FzIGNvcmUgb2YgdGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBkaXNwbGFjZW1lbnQuICAqLworICAvKiBUaGlzIGNvbnZpbmNlcyB0aGUgbmF0aXZlIHJzNjAwMCBjb21waWxlciB0byBnZW5lcmF0ZSB0aGUgY29kZSB3ZQorICAgICB3YW50LiAqLworICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9saXRlcmFsOworICBidWZmZXJfYWRkcmVzcyArPSBmcmFnUC0+ZnJfZml4OworICAvKiBlbmQgaWJtIGNvbXBpbGVyIHdvcmthcm91bmQgKi8KKworICAvKiBUaGUgZGlzcGxhY2VtZW50IG9mIHRoZSBhZGRyZXNzLCBmcm9tIGN1cnJlbnQgbG9jYXRpb24uICAqLworICBkaXNwID0gZnJhZ1AtPmZyX3N5bWJvbCA/IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSA6IDA7CisgIGRpc3AgPSAoZGlzcCArIGZyYWdQLT5mcl9vZmZzZXQpIC0gb2JqZWN0X2FkZHJlc3M7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIGRpc3AgKz0gZnJhZ1AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKKyNlbmRpZgorCisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgQllURSk6CisgICAgY2FzZSBUQUIgKEFCUkFOQ0gsIEJZVEUpOgorICAgICAga25vdyAoaXNzYnl0ZSAoZGlzcCkpOworICAgICAgaWYgKGRpc3AgPT0gMCkKKwlhc19iYWQgKF8oInNob3J0IGJyYW5jaCB3aXRoIHplcm8gb2Zmc2V0OiB1c2UgOnciKSk7CisgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gZGlzcDsKKyAgICAgIGV4dCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQiAoREJDQywgU0hPUlQpOgorICAgICAga25vdyAoaXNzd29yZCAoZGlzcCkpOworICAgICAgZXh0ID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgU0hPUlQpOgorICAgIGNhc2UgVEFCIChBQlJBTkNILCBTSE9SVCk6CisgICAgICBrbm93IChpc3N3b3JkIChkaXNwKSk7CisgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHgwMDsKKyAgICAgIGV4dCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQiAoQUJSQU5DSCwgTE9ORyk6CisgICAgICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQorCXsKKwkgIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjEpCisJICAgIC8qIEJTUiAqLworCSAgICB7CisJICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7CisJICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEI5OyAvKiBKQlNSIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLworCisJICAgICAgZml4X25ldyAoZnJhZ1AsCisJCSAgICAgICBmcmFnUC0+ZnJfZml4LAorCQkgICAgICAgNCwKKwkJICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAorCQkgICAgICAgMCwKKwkJICAgICAgIE5PX1JFTE9DKTsKKworCSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKwkgICAgICBleHQgPSAwOworCSAgICB9CisJICAvKiBCUkEgKi8KKwkgIGVsc2UgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MCkKKwkgICAgeworCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gPSAweDRFOworCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KKwkgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKKwkgICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7CisJICAgICAgZXh0ID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJMb25nIGJyYW5jaCBvZmZzZXQgbm90IHN1cHBvcnRlZC4iKSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOworCSAgZXh0ID0gNDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIExPTkcpOgorICAgICAgLyogb25seSBCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KKyAgICAgIC8qIGNoYW5nZSBiY2MgaW50byBiIWNjL2ptcCBhYnNsIGxvbmcgKi8KKyAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLworICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4NjsvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLworCisgICAgICAvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMiwzXSwgYnV0IHRoZXkgbWF5IGJlIGluIGEKKwkgICBkaWZmZXJlbnQgZnJhZywgaW4gd2hpY2ggY2FzZSByZWZlcmluZyB0byB0aGVtIGlzIGEgbm8tbm8uCisJICAgT25seSBmcl9vcGNvZGVbMCwxXSBhcmUgZ3VhcmFudGVlZCB0byB3b3JrLiAqLworICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KKyAgICAgICpidWZmZXJfYWRkcmVzcysrID0gKGNoYXIpIDB4Zjk7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKyAgICAgIGV4dCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQiAoREJDQywgTE9ORyk6CisgICAgICAvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KKyAgICAgIC8qIGNoYW5nZSBkYmNjIGludG8gZGJjYy9qbXAgYWJzbCBsb25nICovCisgICAgICAvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMi03XSwgYnV0IHRoYXQncyB3cm9uZyAqLworICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDAwOwkvKiBicmFuY2ggb2Zmc2V0ID0gNCAqLworICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDA0OworICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDYwOwkvKiBwdXQgaW4gYnJhIHBjKzYgKi8KKyAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHgwNjsKKyAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCisgICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IChjaGFyKSAweGY5OworCisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7CS8qIGFjY291bnQgZm9yIGJyYS9qbXAgaW5zdHJ1Y3Rpb25zICovCisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OworICAgICAgZXh0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFCIChGQlJBTkNILCBTSE9SVCk6CisgICAgICBrbm93ICgoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDB4NDApID09IDApOworICAgICAgZXh0ID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFCIChGQlJBTkNILCBMT05HKToKKyAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHg0MDsJLyogVHVybiBvbiBMT05HIGJpdCAqLworICAgICAgZXh0ID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFCIChQQ1JFTCwgU0hPUlQpOgorICAgICAgZXh0ID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFCIChQQ1JFTCwgTE9ORyk6CisgICAgICAvKiBUaGUgdGhpbmcgdG8gZG8gaGVyZSBpcyBmb3JjZSBpdCB0byBBQlNPTFVURSBMT05HLCBzaW5jZQorCVBDUkVMIGlzIHJlYWxseSB0cnlpbmcgdG8gc2hvcnRlbiBhbiBBQlNPTFVURSBhZGRyZXNzIGFueXdheSAqLworICAgICAgLyogSkYgRk9PIFRoaXMgY29kZSBoYXMgbm90IGJlZW4gdGVzdGVkICovCisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKKwkgICAgICAgMCwgTk9fUkVMT0MpOworICAgICAgaWYgKChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMHgzRikgIT0gMHgzQSkKKwlhc19iYWQgKF8oIkludGVybmFsIGVycm9yIChsb25nIFBDLXJlbGF0aXZlIG9wZXJhbmQpIGZvciBpbnNuIDB4JTA0eCBhdCAweCVseCIpLAorCQkodW5zaWduZWQpIGZyYWdQLT5mcl9vcGNvZGVbMF0sCisJCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcyk7CisgICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdICY9IH4weDNGOworICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDM5OwkvKiBNb2RlIDcuMSAqLworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OworICAgICAgZXh0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFCIChQQ0xFQSwgU0hPUlQpOgorICAgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOworICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSAmPSB+MHgzRjsKKyAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHgzQTsgLyogMDcyIC0gbW9kZSA3LjIgKi8KKyAgICAgIGV4dCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQiAoUENMRUEsIExPTkcpOgorICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCkgKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7CisgICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOworICAgICAgLyogQWxyZWFkeSBzZXQgdG8gbW9kZSA3LjM7IHRoaXMgaW5kaWNhdGVzOiBQQyBpbmRpcmVjdCB3aXRoCisJIHN1cHByZXNzZWQgaW5kZXgsIDMyLWJpdCBkaXNwbGFjZW1lbnQuICAqLworICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDAxOworICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDcwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOworICAgICAgZXh0ID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUQUIgKFBDSU5ERVgsIEJZVEUpOgorICAgICAgZGlzcCArPSAyOworICAgICAgaWYgKCFpc3NieXRlIChkaXNwKSkKKwl7CisJICBhc19iYWQgKF8oImRpc3BsYWNlbWVudCBkb2Vzbid0IGZpdCBpbiBvbmUgYnl0ZSIpKTsKKwkgIGRpc3AgPSAwOworCX0KKyAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKKyAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSAmPSB+MTsKKyAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IGRpc3A7CisgICAgICBleHQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUIgKFBDSU5ERVgsIFNIT1JUKToKKyAgICAgIGRpc3AgKz0gMjsKKyAgICAgIGFzc2VydCAoaXNzd29yZCAoZGlzcCkpOworICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOworICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdIHw9IDB4MTsKKyAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IDB4MjA7CisgICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAwNzcpID09IDA3MywKKwkJICAgICAgTk9fUkVMT0MpOworICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKKyAgICAgIGV4dCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBQiAoUENJTkRFWCwgTE9ORyk6CisgICAgICBkaXNwICs9IDI7CisgICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAwNzcpID09IDA3MywKKwkJICAgICAgTk9fUkVMT0MpOworICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKKyAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKKyAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSB8PSAweDE7CisgICAgICBidWZmZXJfYWRkcmVzc1stMV0gPSAweDMwOworICAgICAgZXh0ID0gNDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoZXh0KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBleHQ7CisgICAgfQorfQorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKwordm9pZAorbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKKyAgICAgc2VnVCBzZWM7CisgICAgIGZyYWdTICpmcmFnUDsKK3sKKyAgbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKTsKK30KKworI2Vsc2UKKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlZ1Qgc2VjOworICAgICBmcmFnUyAqZnJhZ1A7Cit7CisgIG1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCk7Cit9CisjZW5kaWYKKworLyogRm9yY2UgdHJ1bHkgdW5kZWZpbmVkIHN5bWJvbHMgdG8gdGhlaXIgbWF4aW11bSBzaXplLCBhbmQgZ2VuZXJhbGx5IHNldCB1cAorICAgdGhlIGZyYWcgbGlzdCB0byBiZSByZWxheGVkCisgICAqLworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgICAgc2VnVCBzZWdtZW50OworeworICBpbnQgb2xkX2ZpeDsKKyAgcmVnaXN0ZXIgY2hhciAqYnVmZmVyX2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWw7CisKKyAgb2xkX2ZpeCA9IGZyYWdQLT5mcl9maXg7CisKKyAgLyogaGFuZGxlIFNaX1VOREVGIGZpcnN0LCBpdCBjYW4gYmUgY2hhbmdlZCB0byBCWVRFIG9yIFNIT1JUICovCisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworCisgICAgY2FzZSBUQUIgKEFCUkFOQ0gsIFNaX1VOREVGKToKKyAgICAgIHsKKwlpZiAoKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTCkJLyogTm90IGFic29sdXRlICovCisJICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKKwkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCisJICB7CisJICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChUQUJUWVBFIChmcmFnUC0+ZnJfc3VidHlwZSksIEJZVEUpOworCSAgICBicmVhazsKKwkgIH0KKwllbHNlIGlmICgoZnJhZ1AtPmZyX3N5bWJvbCA9PSAwKSB8fCAhSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCisJICB7CisJICAgIC8qIE9uIDY4MDAwLCBvciBmb3IgYWJzb2x1dGUgdmFsdWUsIHN3aXRjaCB0byBhYnMgbG9uZyAqLworCSAgICAvKiBGSVhNRSwgd2Ugc2hvdWxkIGNoZWNrIGFicyB2YWwsIHBpY2sgc2hvcnQgb3IgbG9uZyAqLworCSAgICBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYxKQorCSAgICAgIHsKKwkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7CisJCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhCOTsgLyogSkJTUiB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KKwkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCisJCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOworCQlmcmFnUC0+ZnJfZml4ICs9IDQ7CisJCWZyYWdfd2FuZSAoZnJhZ1ApOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYwKQorCSAgICAgIHsKKwkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7CisJCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KKwkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCisJCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOworCQlmcmFnUC0+ZnJfZml4ICs9IDQ7CisJCWZyYWdfd2FuZSAoZnJhZ1ApOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJYXNfd2FybiAoXygiTG9uZyBicmFuY2ggb2Zmc2V0IHRvIGV4dGVybiBzeW1ib2wgbm90IHN1cHBvcnRlZC4iKSk7CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHsJCQkvKiBTeW1ib2wgaXMgc3RpbGwgdW5kZWZpbmVkLiAgTWFrZSBpdCBzaW1wbGUgKi8KKwkgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKwkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOworCSAgICBmcmFnX3dhbmUgKGZyYWdQKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwlicmVhazsKKyAgICAgIH0JCQkJLyogY2FzZSBUQUIoQUJSQU5DSCxTWl9VTkRFRikgKi8KKworICAgIGNhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRik6CisgICAgICB7CisJaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50CisJICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKKwkgICAgfHwgZmxhZ19zaG9ydF9yZWZzKQorCSAgeworCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoRkJSQU5DSCwgU0hPUlQpOworCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7CisJICB9CisJZWxzZQorCSAgeworCSAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKwkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDQwOyAvKiBUdXJuIG9uIExPTkcgYml0ICovCisJICAgIGZyYWdfd2FuZSAoZnJhZ1ApOworCSAgfQorCWJyZWFrOworICAgICAgfQkJCQkvKiBUQUIoRkJSQU5DSCxTWl9VTkRFRikgKi8KKworICAgIGNhc2UgVEFCIChQQ1JFTCwgU1pfVU5ERUYpOgorICAgICAgeworCWlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAorCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCisJICAgIHx8IGZsYWdfc2hvcnRfcmVmcworCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCisJICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKKwkgIHsKKwkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDUkVMLCBTSE9SVCk7CisJICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ1JFTCwgTE9ORyk7CisJICAgIGZyYWdQLT5mcl92YXIgKz0gNDsKKwkgIH0KKwlicmVhazsKKyAgICAgIH0JCQkJLyogVEFCKFBDUkVMLFNaX1VOREVGKSAqLworCisgICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBTWl9VTkRFRik6CisgICAgICB7CisJaWYgKChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwpCisJICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKKwkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCisJICB7CisJICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChCQ0M2ODAwMCwgQllURSk7CisJICAgIGJyZWFrOworCSAgfQorCS8qIG9ubHkgQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCisJLyogY2hhbmdlIGJjYyBpbnRvIGIhY2Mvam1wIGFic2wgbG9uZyAqLworCWZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLworCWlmIChmbGFnX3Nob3J0X3JlZnMpCisJICB7CisJICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA0OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLworCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLworCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLworCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY4OworCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLworCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gMjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA2OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLworCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLworCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLworCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY5OworCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLworCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKwkgIH0KKwlmcmFnX3dhbmUgKGZyYWdQKTsKKwlicmVhazsKKyAgICAgIH0JCQkJLyogY2FzZSBUQUIoQkNDNjgwMDAsU1pfVU5ERUYpICovCisKKyAgICBjYXNlIFRBQiAoREJDQywgU1pfVU5ERUYpOgorICAgICAgeworCWlmIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKKwkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAorCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKKwkgIHsKKwkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKERCQ0MsIFNIT1JUKTsKKwkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOworCSAgICBicmVhazsKKwkgIH0KKwkvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KKwkvKiBjaGFuZ2UgZGJjYyBpbnRvIGRiY2Mvam1wIGFic2wgbG9uZyAqLworCS8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLTRdLCB3aGljaCBpcyB3cm9uZy4gKi8KKwlidWZmZXJfYWRkcmVzc1swXSA9IDB4MDA7CS8qIGJyYW5jaCBvZmZzZXQgPSA0ICovCisJYnVmZmVyX2FkZHJlc3NbMV0gPSAweDA0OworCWJ1ZmZlcl9hZGRyZXNzWzJdID0gMHg2MDsJLyogcHV0IGluIGJyYSBwYyArIC4uLiAqLworCisJaWYgKGZsYWdfc2hvcnRfcmVmcykKKwkgIHsKKwkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzUtN10gKi8KKwkgICAgYnVmZmVyX2FkZHJlc3NbM10gPSAweDA0OwkvKiBwbHVzIDQgKi8KKwkgICAgYnVmZmVyX2FkZHJlc3NbNF0gPSAweDRlOwkvKiBQdXQgaW4gSnVtcCBXb3JkICovCisJICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjg7CisJICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLworCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gMjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVs1LTddICovCisJICAgIGJ1ZmZlcl9hZGRyZXNzWzNdID0gMHgwNjsJLyogUGx1cyA2ICovCisJICAgIGJ1ZmZlcl9hZGRyZXNzWzRdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCisJICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLworCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7CisJICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKwkgIH0KKworCWZyYWdfd2FuZSAoZnJhZ1ApOworCWJyZWFrOworICAgICAgfQkJCQkvKiBjYXNlIFRBQihEQkNDLFNaX1VOREVGKSAqLworCisgICAgY2FzZSBUQUIgKFBDTEVBLCBTWl9VTkRFRik6CisgICAgICB7CisJaWYgKCgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkpID09IHNlZ21lbnQKKwkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQorCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMKKwkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAorCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IG1jZjUyMDApCisJICB7CisJICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0xFQSwgU0hPUlQpOworCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7CisJICB9CisJZWxzZQorCSAgeworCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENMRUEsIExPTkcpOworCSAgICBmcmFnUC0+ZnJfdmFyICs9IDY7CisJICB9CisJYnJlYWs7CisgICAgICB9CQkJCS8qIFRBQihQQ0xFQSxTWl9VTkRFRikgKi8KKworICAgIGNhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRik6CisgICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKKwkgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKKwkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKKwkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENJTkRFWCwgQllURSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0lOREVYLCBMT05HKTsKKwkgIGZyYWdQLT5mcl92YXIgKz0gNDsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogbm93IHRoYXQgU1pfVU5ERUYgYXJlIHRha2VuIGNhcmUgb2YsIGNoZWNrIG90aGVycyAqLworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIEJZVEUpOgorICAgIGNhc2UgVEFCIChBQlJBTkNILCBCWVRFKToKKyAgICAgIC8qIFdlIGNhbid0IGRvIGEgc2hvcnQganVtcCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgc28gaW4gdGhhdAorCSBjYXNlIHdlIGZvcmNlIHdvcmQgbW9kZS4gIEF0IHRoaXMgcG9pbnQgU19HRVRfVkFMVUUgc2hvdWxkCisJIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgd2l0aGluIGl0cyBmcmFnLiAgSWYgdGhlCisJIHN5bWJvbCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBmcmFnLCBhbmQgaXQgaXMgdGhlIG5leHQgZnJhZworCSB3aXRoIGFueSBkYXRhIGluIGl0ICh1c3VhbGx5IHRoaXMgaXMganVzdCB0aGUgbmV4dCBmcmFnLCBidXQKKwkgYXNzZW1ibGVyIGxpc3RpbmdzIG1heSBpbnRyb2R1Y2UgZW1wdHkgZnJhZ3MpLCB3ZSBtdXN0IHVzZQorCSB3b3JkIG1vZGUuICAqLworICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgJiYgU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpID09IDApCisJeworCSAgZnJhZ1MgKmw7CisKKwkgIGZvciAobCA9IGZyYWdQLT5mcl9uZXh0OworCSAgICAgICBsICE9IGZyYWdQLT5mcl9zeW1ib2wtPnN5X2ZyYWc7CisJICAgICAgIGwgPSBsLT5mcl9uZXh0KQorCSAgICBpZiAobC0+ZnJfZml4ICsgbC0+ZnJfdmFyICE9IDApCisJICAgICAgYnJlYWs7CisJICBpZiAobCA9PSBmcmFnUC0+ZnJfc3ltYm9sLT5zeV9mcmFnKQorCSAgICB7CisJICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFRBQlRZUEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSwgU0hPUlQpOworCSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Cit9CisKKyNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCisvKiB0aGUgYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QgcGxheXMgaGVsbAorICAgd2l0aCB0aGUgYnl0ZS1vcmRlciBwcm9ibGVtcyBvZiBjcm9zcy1hc3NlbWJseS4gIFNvIGFzIGEgaGFjaywKKyAgIEkgYWRkZWQgdGhpcyBtYWNoLiBkZXBlbmRlbnQgcmkgdHdpZGRsZXIuICBVZ2x5LCBidXQgaXQgZ2V0cworICAgeW91IHRoZXJlLiAtS1dLICovCisvKiBvbiBtNjhrOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZywgbmV4dCB0aHJlZSBieXRlcworICAgYXJlIHN5bWJvbG51bSwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKKyAgIGJpdCA3IGFzIHBjcmVsLCBiaXRzIDYgJiA1IGFzIGxlbmd0aCwgYml0IDQgYXMgcGNyZWwsIGFuZCB0aGUgbG93ZXIKKyAgIG5pYmJsZSBhcyBudXRoaW4uIChvbiBTdW4gMyBhdCBsZWFzdCkgKi8KKy8qIFRyYW5zbGF0ZSB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbnRvIHRhcmdldC1zcGVjaWZpYworICAgZm9ybWF0LiAqLworI2lmZGVmIGNvbW1lbnQKK3ZvaWQKK21kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQorICAgICBjaGFyICp0aGVfYnl0ZXM7CisgICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgKnJpOworeworICAvKiB0aGlzIGlzIGVhc3kgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLT5yX2FkZHJlc3MsIDQpOworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICB0aGVfYnl0ZXNbNF0gPSAocmktPnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOworICB0aGVfYnl0ZXNbNV0gPSAocmktPnJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7CisgIHRoZV9ieXRlc1s2XSA9IHJpLT5yX3N5bWJvbG51bSAmIDB4MGZmOworICB0aGVfYnl0ZXNbN10gPSAoKChyaS0+cl9wY3JlbCA8PCA3KSAmIDB4ODApIHwgKChyaS0+cl9sZW5ndGggPDwgNSkgJiAweDYwKSB8CisJCSAgKChyaS0+cl9leHRlcm4gPDwgNCkgJiAweDEwKSk7Cit9CisKKyNlbmRpZiAvKiBjb21tZW50ICovCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgordm9pZAordGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKKyAgICAgY2hhciAqd2hlcmU7CisgICAgIGZpeFMgKmZpeFA7CisgICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOworeworICAvKgorICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCisgICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCisgICAqLworCisgIHN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07CisgIGxvbmcgcl9zeW1ib2xudW07CisKKyAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7CisKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKKyAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKKwkJICAgICAgNCk7CisKKyAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKKwkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCisJCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOworCisgIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOworICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOworICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7CisgIHdoZXJlWzddID0gKCgoZml4UC0+ZnhfcGNyZWwgPDwgNykgJiAweDgwKSB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDUpICYgMHg2MCkgfAorCSAgICAgICgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgNCkgJiAweDEwKSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCisKKyNpZm5kZWYgV09SS0lOR19ET1RfV09SRAorQ09OU1QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7CitDT05TVCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA2OworCit2b2lkCittZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKKyAgICAgY2hhciAqcHRyOworICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7CisgICAgIGZyYWdTICpmcmFnOworICAgICBzeW1ib2xTICp0b19zeW1ib2w7Cit7CisgIHZhbHVlVCBvZmZzZXQ7CisKKyAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKKworICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MDAwLCAyKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDIpOworfQorCit2b2lkCittZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQorICAgICBjaGFyICpwdHI7CisgICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKKyAgICAgZnJhZ1MgKmZyYWc7CisgICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKK3sKKyAgdmFsdWVUIG9mZnNldDsKKworICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQorICAgIHsKKyAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweDRFRjksIDIpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAyLCAodmFsdWVUKSBvZmZzZXQsIDQpOworICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDIpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwKKwkgICAgICAgMCwgTk9fUkVMT0MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg2MGZmLCAyKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKiBEaWZmZXJlbnQgdmFsdWVzIG9mIE9LIHRlbGwgd2hhdCBpdHMgT0sgdG8gcmV0dXJuLiAgVGhpbmdzIHRoYXQKKyAgIGFyZW4ndCBPSyBhcmUgYW4gZXJyb3IgKHdoYXQgYSBzaG9jaywgbm8/KQorCisgICAwOiAgRXZlcnl0aGluZyBpcyBPSworICAgMTA6ICBBYnNvbHV0ZSAxOjgJb25seQorICAgMjA6ICBBYnNvbHV0ZSAwOjcJb25seQorICAgMzA6ICBhYnNvbHV0ZSAwOjE1CW9ubHkKKyAgIDQwOiAgQWJzb2x1dGUgMDozMQlvbmx5CisgICA1MDogIGFic29sdXRlIDA6MTI3CW9ubHkKKyAgIDU1OiAgYWJzb2x1dGUgLTY0OjYzICAgIG9ubHkKKyAgIDYwOiAgYWJzb2x1dGUgLTEyODoxMjcJb25seQorICAgNzA6ICBhYnNvbHV0ZSAwOjQwOTUJb25seQorICAgODA6ICBObyBiaWdudW1zCisKKyAgICovCisKK3N0YXRpYyBpbnQKK2dldF9udW0gKGV4cCwgb2spCisgICAgIHN0cnVjdCBtNjhrX2V4cCAqZXhwOworICAgICBpbnQgb2s7Cit7CisgIGlmIChleHAtPmV4cC5YX29wID09IE9fYWJzZW50KQorICAgIHsKKyAgICAgIC8qIERvIHRoZSBzYW1lIHRoaW5nIHRoZSBWQVggYXNtIGRvZXMgKi8KKyAgICAgIG9wIChleHApID0gT19jb25zdGFudDsKKyAgICAgIGFkZHMgKGV4cCkgPSAwOworICAgICAgc3VicyAoZXhwKSA9IDA7CisgICAgICBvZmZzIChleHApID0gMDsKKyAgICAgIGlmIChvayA9PSAxMCkKKwl7CisJICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOworCSAgb2ZmcyAoZXhwKSA9IDE7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIHN3aXRjaCAob2spCisJeworCWNhc2UgMTA6CisJICBpZiAob2ZmcyAoZXhwKSA8IDEgfHwgb2ZmcyAoZXhwKSA+IDgpCisJICAgIHsKKwkgICAgICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIikpOworCSAgICAgIG9mZnMgKGV4cCkgPSAxOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDIwOgorCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA3KQorCSAgICBnb3RvIG91dHJhbmdlOworCSAgYnJlYWs7CisJY2FzZSAzMDoKKwkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMTUpCisJICAgIGdvdG8gb3V0cmFuZ2U7CisJICBicmVhazsKKwljYXNlIDQwOgorCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAzMikKKwkgICAgZ290byBvdXRyYW5nZTsKKwkgIGJyZWFrOworCWNhc2UgNTA6CisJICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDEyNykKKwkgICAgZ290byBvdXRyYW5nZTsKKwkgIGJyZWFrOworCWNhc2UgNTU6CisJICBpZiAob2ZmcyAoZXhwKSA8IC02NCB8fCBvZmZzIChleHApID4gNjMpCisJICAgIGdvdG8gb3V0cmFuZ2U7CisJICBicmVhazsKKwljYXNlIDYwOgorCSAgaWYgKG9mZnMgKGV4cCkgPCAtMTI4IHx8IG9mZnMgKGV4cCkgPiAxMjcpCisJICAgIGdvdG8gb3V0cmFuZ2U7CisJICBicmVhazsKKwljYXNlIDcwOgorCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiA0MDk1KQorCSAgICB7CisJICAgIG91dHJhbmdlOgorCSAgICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiKSk7CisJICAgICAgb2ZmcyAoZXhwKSA9IDA7CisJICAgIH0KKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorICBlbHNlIGlmIChleHAtPmV4cC5YX29wID09IE9fYmlnKQorICAgIHsKKyAgICAgIGlmIChvZmZzIChleHApIDw9IDAJLyogZmxvbnVtICovCisJICAmJiAob2sgPT0gODAJCS8qIG5vIGJpZ251bXMgKi8KKwkgICAgICB8fCAob2sgPiAxMAkvKiBzbWFsbC1pbnQgcmFuZ2VzIGluY2x1ZGluZyAwIG9rICovCisJCSAgLyogSWYgd2UgaGF2ZSBhIGZsb251bSB6ZXJvLCBhIHplcm8gaW50ZWdlciBzaG91bGQKKwkJICAgICBkbyBhcyB3ZWxsIChlLmcuLCBpbiBtb3ZlcSkuICAqLworCQkgICYmIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50ID09IDAKKwkJICAmJiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3dbMF0gPT0gMCkpKQorCXsKKwkgIC8qIEhBQ0shIFR1cm4gaXQgaW50byBhIGxvbmcgKi8KKwkgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzZdOworCisJICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4TCk7CS8qIFRoZXNlIG51bWJlcnMgYXJlIG1hZ2ljISAqLworCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OworCSAgYWRkcyAoZXhwKSA9IDA7CisJICBzdWJzIChleHApID0gMDsKKwkgIG9mZnMgKGV4cCkgPSB3b3Jkc1sxXSB8ICh3b3Jkc1swXSA8PCAxNik7CisJfQorICAgICAgZWxzZSBpZiAob2sgIT0gMCkKKwl7CisJICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7CisJICBhZGRzIChleHApID0gMDsKKwkgIHN1YnMgKGV4cCkgPSAwOworCSAgb2ZmcyAoZXhwKSA9IChvayA9PSAxMCkgPyAxIDogMDsKKwkgIGFzX3dhcm4gKF8oIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIpLAorCQkgICBvZmZzIChleHApKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG9rID49IDEwICYmIG9rIDw9IDcwKQorCXsKKwkgIG9wIChleHApID0gT19jb25zdGFudDsKKwkgIGFkZHMgKGV4cCkgPSAwOworCSAgc3VicyAoZXhwKSA9IDA7CisJICBvZmZzIChleHApID0gKG9rID09IDEwKSA/IDEgOiAwOworCSAgYXNfd2FybiAoXygiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIiksCisJCSAgIG9mZnMgKGV4cCkpOworCX0KKyAgICB9CisKKyAgaWYgKGV4cC0+c2l6ZSAhPSBTSVpFX1VOU1BFQykKKyAgICB7CisgICAgICBzd2l0Y2ggKGV4cC0+c2l6ZSkKKwl7CisJY2FzZSBTSVpFX1VOU1BFQzoKKwljYXNlIFNJWkVfTE9ORzoKKwkgIGJyZWFrOworCWNhc2UgU0laRV9CWVRFOgorCSAgaWYgKCFpc2J5dGUgKG9mZnMgKGV4cCkpKQorCSAgICBhc193YXJuIChfKCJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIEJZVEUiKSk7CisJICBicmVhazsKKwljYXNlIFNJWkVfV09SRDoKKwkgIGlmICghaXN3b3JkIChvZmZzIChleHApKSkKKwkgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBXT1JEIikpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gb2ZmcyAoZXhwKTsKK30KKworLyogVGhlc2UgYXJlIHRoZSBiYWNrLWVuZHMgZm9yIHRoZSB2YXJpb3VzIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuICAqLworCitzdGF0aWMgdm9pZAorc19kYXRhMSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDEpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorc19kYXRhMiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzdWJzZWdfc2V0IChkYXRhX3NlY3Rpb24sIDIpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorc19ic3MgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBwdXR0aW5nIGZyYWdzIGluIHRoZSBCU1Mgc2VnbWVudCwgd2UgZmFrZSBpdAorICAgICBieSBtYXJraW5nIGluX2JzcywgdGhlbiBsb29raW5nIGF0IHNfc2tpcCBmb3IgY2x1ZXMuICAqLworCisgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfZXZlbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICByZWdpc3RlciBpbnQgdGVtcDsKKyAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7CisKKyAgdGVtcCA9IDE7CQkJLyogSkYgc2hvdWxkIGJlIDI/ICovCisgIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBpZiAoIW5lZWRfcGFzc18yKQkJLyogTmV2ZXIgbWFrZSBmcmFnIGlmIGV4cGVjdCBleHRyYSBwYXNzLiAqLworICAgIGZyYWdfYWxpZ24gKHRlbXAsIChpbnQpIHRlbXBfZmlsbCwgMCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRlbXApOworfQorCitzdGF0aWMgdm9pZAorc19wcm9jIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisMCisvKiBQc2V1ZG8tb3BzIGhhbmRsZWQgZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhcmd1bWVudCBpcyBhIGNvbmRpdGlvbmFsCisgICBwc2V1ZG8tb3AuICBUaGlzIGlzIGNhbGxlZCB3aGVuIGNoZWNraW5nIHdoZXRoZXIgYSBwZW5kaW5nCisgICBhbGlnbm1lbnQgaXMgbmVlZGVkLiAgKi8KKworaW50CittNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCisgICAgIHBzZXVkb190eXBlUyAqcG9wOworeworICByZXR1cm4gKHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfaWYKKwkgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19tcmlfZWxzZSk7Cit9CisKKy8qIEhhbmRsZSBhbiBNUkkgc3R5bGUgY2hpcCBzcGVjaWZpY2F0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK21yaV9jaGlwICgpCit7CisgIGNoYXIgKnM7CisgIGNoYXIgYzsKKyAgaW50IGk7CisKKyAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgLyogV2UgY2FuJ3QgdXNlIGdldF9zeW1ib2xfZW5kIHNpbmNlIHRoZSBwcm9jZXNzb3IgbmFtZXMgYXJlIG5vdCBwcm9wZXIKKyAgICAgc3ltYm9scy4gICovCisgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspKQorICAgIDsKKyAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5fYXJjaHM7IGkrKykKKyAgICBpZiAoc3RyY2FzZWNtcCAocywgYXJjaHNbaV0ubmFtZSkgPT0gMCkKKyAgICAgIGJyZWFrOworICBpZiAoaSA+PSBuX2FyY2hzKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIpLCBzKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJykKKyAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IDA7CisgIGVsc2UKKyAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSBtNjg4ODEgfCBtNjg4NTE7CisgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IGFyY2hzW2ldLmFyY2g7CisKKyAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nKQorICAgIHsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIC8qIFdlIGNhbid0IHVzZSBnZXRfc3ltYm9sX2VuZCBzaW5jZSB0aGUgcHJvY2Vzc29yIG5hbWVzIGFyZSBub3QKKwkgcHJvcGVyIHN5bWJvbHMuICAqLworICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykpCisJOworICAgICAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKKyAgICAgIGlmIChzdHJjbXAgKHMsICI2ODg4MSIpID09IDApCisJY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOworICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiNjg4NTEiKSA9PSAwKQorCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg1MTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgIH0KKworICAvKiBVcGRhdGUgaW5mbyBhYm91dCBhdmFpbGFibGUgY29udHJvbCByZWdpc3RlcnMuICAqLworICBzZWxlY3RfY29udHJvbF9yZWdzICgpOworfQorCisvKiBUaGUgTVJJIENISVAgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3NfY2hpcCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpzdG9wID0gTlVMTDsKKyAgY2hhciBzdG9wYzsKKworICBpZiAoZmxhZ19tcmkpCisgICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOworICBtcmlfY2hpcCAoKTsKKyAgaWYgKGZsYWdfbXJpKQorICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgTVJJIEZPUFQgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3NfZm9wdCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJJRD0iLCAzKSA9PSAwKQorICAgIHsKKyAgICAgIGludCB0ZW1wOworCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKKyAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgIGlmICh0ZW1wIDwgMCB8fCB0ZW1wID4gNykKKwlhc19iYWQgKF8oImJhZCBjb3Byb2Nlc3NvciBpZCIpKTsKKyAgICAgIGVsc2UKKwltNjhrX2Zsb2F0X2NvcG51bSA9IENPUDAgKyB0ZW1wOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhlIHN0cnVjdHVyZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLworCitzdHJ1Y3Qgb3B0X2FjdGlvbgoreworICAvKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBJZiB0aGlzIGlzIG5vdCBOVUxMLCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbi4gIFRoZSBmaXJzdCBhcmd1bWVudAorICAgICBpcyB0aGUgQVJHIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlLCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzCisgICAgIHdoZXRoZXIgdGhlIG9wdGlvbiB3YXMgbmVnYXRlZC4gICovCisgIHZvaWQgKCpwZm4pIFBBUkFNUyAoKGludCBhcmcsIGludCBvbikpOworCisgIC8qIElmIHRoaXMgaXMgbm90IE5VTEwsIGFuZCB0aGUgUEZOIGZpZWxkIGlzIE5VTEwsIHNldCB0aGUgdmFyaWFibGUKKyAgICAgdGhpcyBwb2ludHMgdG8uICBTZXQgaXQgdG8gdGhlIEFSRyBmaWVsZCBpZiB0aGUgb3B0aW9uIHdhcyBub3QKKyAgICAgbmVnYXRlZCwgYW5kIHRoZSBOT1RBUkcgZmllbGQgb3RoZXJ3aXNlLiAgKi8KKyAgaW50ICpwdmFyOworCisgIC8qIFRoZSB2YWx1ZSB0byBwYXNzIHRvIFBGTiBvciB0byBhc3NpZ24gdG8gKlBWQVIuICAqLworICBpbnQgYXJnOworCisgIC8qIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gKlBWQVIgaWYgdGhlIG9wdGlvbiBpcyBuZWdhdGVkLiAgSWYgUEZOIGlzCisgICAgIE5VTEwsIGFuZCBQVkFSIGlzIG5vdCBOVUxMLCBhbmQgQVJHIGFuZCBOT1RBUkcgYXJlIHRoZSBzYW1lLCB0aGVuCisgICAgIHRoZSBvcHRpb24gbWF5IG5vdCBiZSBuZWdhdGVkLiAgKi8KKyAgaW50IG5vdGFyZzsKK307CisKKy8qIFRoZSB0YWJsZSB1c2VkIHRvIGhhbmRsZSB0aGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZCBza2lwX3RvX2NvbW1hIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBvcHRfbmVzdCBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgb3B0X2NoaXAgUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIG9wdF9saXN0IFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBvcHRfbGlzdF9zeW1ib2xzIFBBUkFNUyAoKGludCwgaW50KSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0X2FjdGlvbiBvcHRfdGFibGVbXSA9Cit7CisgIHsgImFic3BjYWRkIiwgMCwgJm02OGtfYWJzcGNhZGQsIDEsIDAgfSwKKworICAvKiBXZSBkbyByZWxheGluZywgc28gdGhlcmUgaXMgbGl0dGxlIHVzZSBmb3IgdGhlc2Ugb3B0aW9ucy4gICovCisgIHsgImIiLCAwLCAwLCAwLCAwIH0sCisgIHsgImJycyIsIDAsIDAsIDAsIDAgfSwKKyAgeyAiYnJiIiwgMCwgMCwgMCwgMCB9LAorICB7ICJicmwiLCAwLCAwLCAwLCAwIH0sCisgIHsgImJydyIsIDAsIDAsIDAsIDAgfSwKKworICB7ICJjIiwgMCwgMCwgMCwgMCB9LAorICB7ICJjZXgiLCAwLCAwLCAwLCAwIH0sCisgIHsgImNhc2UiLCAwLCAmc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSwgMSwgMCB9LAorICB7ICJjbCIsIDAsIDAsIDAsIDAgfSwKKyAgeyAiY3JlIiwgMCwgMCwgMCwgMCB9LAorICB7ICJkIiwgMCwgJmZsYWdfa2VlcF9sb2NhbHMsIDEsIDAgfSwKKyAgeyAiZSIsIDAsIDAsIDAsIDAgfSwKKyAgeyAiZiIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDEsIDAgfSwKKyAgeyAiZnJzIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMSwgMCB9LAorICB7ICJmcmwiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAwLCAxIH0sCisgIHsgImciLCAwLCAwLCAwLCAwIH0sCisgIHsgImkiLCAwLCAwLCAwLCAwIH0sCisgIHsgIm0iLCAwLCAwLCAwLCAwIH0sCisgIHsgIm1leCIsIDAsIDAsIDAsIDAgfSwKKyAgeyAibWMiLCAwLCAwLCAwLCAwIH0sCisgIHsgIm1kIiwgMCwgMCwgMCwgMCB9LAorICB7ICJuZXN0Iiwgb3B0X25lc3QsIDAsIDAsIDAgfSwKKyAgeyAibmV4dCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKKyAgeyAibyIsIDAsIDAsIDAsIDAgfSwKKyAgeyAib2xkIiwgMCwgMCwgMCwgMCB9LAorICB7ICJvcCIsIHNraXBfdG9fY29tbWEsIDAsIDAsIDAgfSwKKyAgeyAicGNvIiwgMCwgMCwgMCwgMCB9LAorICB7ICJwIiwgb3B0X2NoaXAsIDAsIDAsIDAgfSwKKyAgeyAicGNyIiwgMCwgMCwgMCwgMCB9LAorICB7ICJwY3MiLCAwLCAwLCAwLCAwIH0sCisgIHsgInIiLCAwLCAwLCAwLCAwIH0sCisgIHsgInF1aWNrIiwgMCwgJm02OGtfcXVpY2ssIDEsIDAgfSwKKyAgeyAicmVsMzIiLCAwLCAmbTY4a19yZWwzMiwgMSwgMCB9LAorICB7ICJzIiwgb3B0X2xpc3QsIDAsIDAsIDAgfSwKKyAgeyAidCIsIG9wdF9saXN0X3N5bWJvbHMsIDAsIDAsIDAgfSwKKyAgeyAidyIsIDAsICZmbGFnX25vX3dhcm5pbmdzLCAwLCAxIH0sCisgIHsgIngiLCAwLCAwLCAwLCAwIH0KK307CisKKyNkZWZpbmUgT1BUQ09VTlQgKHNpemVvZiBvcHRfdGFibGUgLyBzaXplb2Ygb3B0X3RhYmxlWzBdKQorCisvKiBUaGUgTVJJIE9QVCBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorc19vcHQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgZG8KKyAgICB7CisgICAgICBpbnQgdDsKKyAgICAgIGNoYXIgKnM7CisgICAgICBjaGFyIGM7CisgICAgICBpbnQgaTsKKyAgICAgIGNvbnN0IHN0cnVjdCBvcHRfYWN0aW9uICpvOworCisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgICAgIHQgPSAxOworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQorCXsKKwkgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgdCA9IDA7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk5PIiwgMikgPT0gMCkKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKwkgIHQgPSAwOworCX0KKworICAgICAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICAgICAgZm9yIChpID0gMCwgbyA9IG9wdF90YWJsZTsgaSA8IE9QVENPVU5UOyBpKyssIG8rKykKKwl7CisJICBpZiAoc3RyY2FzZWNtcCAocywgby0+bmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChvLT5wZm4pCisJCXsKKwkJICAvKiBSZXN0b3JlIGlucHV0X2xpbmVfcG9pbnRlciBub3cgaW4gY2FzZSB0aGUgb3B0aW9uCisJCSAgICAgdGFrZXMgYXJndW1lbnRzLiAgKi8KKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICAoKm8tPnBmbikgKG8tPmFyZywgdCk7CisJCX0KKwkgICAgICBlbHNlIGlmIChvLT5wdmFyICE9IE5VTEwpCisJCXsKKwkJICBpZiAoISB0ICYmIG8tPmFyZyA9PSBvLT5ub3RhcmcpCisJCSAgICBhc19iYWQgKF8oIm9wdGlvbiBgJXMnIG1heSBub3QgYmUgbmVnYXRlZCIpLCBzKTsKKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICAqby0+cHZhciA9IHQgPyBvLT5hcmcgOiBvLT5ub3Rhcmc7CisJCX0KKwkgICAgICBlbHNlCisJCSppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgaWYgKGkgPj0gT1BUQ09VTlQpCisJeworCSAgYXNfYmFkIChfKCJvcHRpb24gYCVzJyBub3QgcmVjb2duaXplZCIpLCBzKTsKKwkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCX0KKyAgICB9CisgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKKworICAvKiBNb3ZlIGJhY2sgdG8gdGVybWluYXRpbmcgY2hhcmFjdGVyLiAgKi8KKyAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFNraXAgYWhlYWQgdG8gYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgT1BUIG9wdGlvbnMgd2hpY2ggd2UgZG8KKyAgIG5vdCBzdXBwb3IgdGFuZCB3aGljaCB0YWtlIGFyZ3VtZW50cy4gICovCisKK3N0YXRpYyB2b2lkCitza2lwX3RvX2NvbW1hIChhcmcsIG9uKQorICAgICBpbnQgYXJnOworICAgICBpbnQgb247Cit7CisgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJworCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKK30KKworLyogSGFuZGxlIHRoZSBPUFQgTkVTVD1kZXB0aCBvcHRpb24uICAqLworCitzdGF0aWMgdm9pZAorb3B0X25lc3QgKGFyZywgb24pCisgICAgIGludCBhcmc7CisgICAgIGludCBvbjsKK3sKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiYmFkIGZvcm1hdCBvZiBPUFQgTkVTVD1kZXB0aCIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIG1heF9tYWNyb19uZXN0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgT1BUIFA9Y2hpcCBvcHRpb24uICAqLworCitzdGF0aWMgdm9pZAorb3B0X2NoaXAgKGFyZywgb24pCisgICAgIGludCBhcmc7CisgICAgIGludCBvbjsKK3sKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMganVzdCBPUFQgUCwgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQuICAqLworICAgICAgcmV0dXJuOworICAgIH0KKworICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgbXJpX2NoaXAgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgT1BUIFMgb3B0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK29wdF9saXN0IChhcmcsIG9uKQorICAgICBpbnQgYXJnOworICAgICBpbnQgb247Cit7CisgIGxpc3RpbmdfbGlzdCAob24pOworfQorCisvKiBIYW5kbGUgdGhlIE9QVCBUIG9wdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitvcHRfbGlzdF9zeW1ib2xzIChhcmcsIG9uKQorICAgICBpbnQgYXJnOworICAgICBpbnQgb247Cit7CisgIGlmIChvbikKKyAgICBsaXN0aW5nIHw9IExJU1RJTkdfU1lNQk9MUzsKKyAgZWxzZQorICAgIGxpc3RpbmcgJj1+IExJU1RJTkdfU1lNQk9MUzsKK30KKworLyogSGFuZGxlIHRoZSBNUkkgUkVHIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX3JlZyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpzOworICBpbnQgYzsKKyAgc3RydWN0IG02OGtfb3Agcm9wOworICBpbnQgbWFzazsKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisKKyAgaWYgKGxpbmVfbGFiZWwgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgbGFiZWwiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoZmxhZ19tcmkpCisgICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICBzID0gaW5wdXRfbGluZV9wb2ludGVyOworICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCisjaWZkZWYgUkVHSVNURVJfUFJFRklYCisJIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gUkVHSVNURVJfUFJFRklYCisjZW5kaWYKKwkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycKKwkgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCisgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKKworICBpZiAobTY4a19pcF9vcCAocywgJnJvcCkgIT0gMCkKKyAgICB7CisgICAgICBpZiAocm9wLmVycm9yID09IE5VTEwpCisJYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oImJhZCByZWdpc3RlciBsaXN0OiAlcyIpLCByb3AuZXJyb3IpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKworICBpZiAocm9wLm1vZGUgPT0gUkVHTFNUKQorICAgIG1hc2sgPSByb3AubWFzazsKKyAgZWxzZSBpZiAocm9wLm1vZGUgPT0gRFJFRykKKyAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIERBVEEwKTsKKyAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQVJFRykKKyAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIEFERFIwICsgOCk7CisgIGVsc2UgaWYgKHJvcC5tb2RlID09IEZQUkVHKQorICAgIG1hc2sgPSAxIDw8IChyb3AucmVnIC0gRlAwICsgMTYpOworICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCisJICAgJiYgcm9wLnJlZyA9PSBGUEkpCisgICAgbWFzayA9IDEgPDwgMjQ7CisgIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKKwkgICAmJiByb3AucmVnID09IEZQUykKKyAgICBtYXNrID0gMSA8PCAyNTsKKyAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAorCSAgICYmIHJvcC5yZWcgPT0gRlBDKQorICAgIG1hc2sgPSAxIDw8IDI2OworICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdCIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHJlZ19zZWN0aW9uKTsKKyAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIH5tYXNrKTsKKyAgbGluZV9sYWJlbC0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKKworICBpZiAoZmxhZ19tcmkpCisgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIE1SSSBTQVZFIGFuZCBSRVNUT1JFIHBzZXVkby1vcHMuICAqLworCitzdHJ1Y3Qgc2F2ZV9vcHRzCit7CisgIHN0cnVjdCBzYXZlX29wdHMgKm5leHQ7CisgIGludCBhYnNwY2FkZDsKKyAgaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7CisgIGludCBrZWVwX2xvY2FsczsKKyAgaW50IHNob3J0X3JlZnM7CisgIGludCBhcmNoaXRlY3R1cmU7CisgIGludCBxdWljazsKKyAgaW50IHJlbDMyOworICBpbnQgbGlzdGluZzsKKyAgaW50IG5vX3dhcm5pbmdzOworICAvKiBGSVhNRTogV2UgZG9uJ3Qgc2F2ZSBPUFQgUy4gICovCit9OworCisvKiBUaGlzIHZhcmlhYmxlIGhvbGRzIHRoZSBzdGFjayBvZiBzYXZlZCBvcHRpb25zLiAgKi8KKworc3RhdGljIHN0cnVjdCBzYXZlX29wdHMgKnNhdmVfc3RhY2s7CisKKy8qIFRoZSBNUkkgU0FWRSBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorc19zYXZlIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHN0cnVjdCBzYXZlX29wdHMgKnM7CisKKyAgcyA9IChzdHJ1Y3Qgc2F2ZV9vcHRzICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNhdmVfb3B0cykpOworICBzLT5hYnNwY2FkZCA9IG02OGtfYWJzcGNhZGQ7CisgIHMtPnN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOworICBzLT5rZWVwX2xvY2FscyA9IGZsYWdfa2VlcF9sb2NhbHM7CisgIHMtPnNob3J0X3JlZnMgPSBmbGFnX3Nob3J0X3JlZnM7CisgIHMtPmFyY2hpdGVjdHVyZSA9IGN1cnJlbnRfYXJjaGl0ZWN0dXJlOworICBzLT5xdWljayA9IG02OGtfcXVpY2s7CisgIHMtPnJlbDMyID0gbTY4a19yZWwzMjsKKyAgcy0+bGlzdGluZyA9IGxpc3Rpbmc7CisgIHMtPm5vX3dhcm5pbmdzID0gZmxhZ19ub193YXJuaW5nczsKKworICBzLT5uZXh0ID0gc2F2ZV9zdGFjazsKKyAgc2F2ZV9zdGFjayA9IHM7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhlIE1SSSBSRVNUT1JFIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX3Jlc3RvcmUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3RydWN0IHNhdmVfb3B0cyAqczsKKworICBpZiAoc2F2ZV9zdGFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygicmVzdG9yZSB3aXRob3V0IHNhdmUiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzID0gc2F2ZV9zdGFjazsKKyAgc2F2ZV9zdGFjayA9IHMtPm5leHQ7CisKKyAgbTY4a19hYnNwY2FkZCA9IHMtPmFic3BjYWRkOworICBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gcy0+c3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKKyAgZmxhZ19rZWVwX2xvY2FscyA9IHMtPmtlZXBfbG9jYWxzOworICBmbGFnX3Nob3J0X3JlZnMgPSBzLT5zaG9ydF9yZWZzOworICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IHMtPmFyY2hpdGVjdHVyZTsKKyAgbTY4a19xdWljayA9IHMtPnF1aWNrOworICBtNjhrX3JlbDMyID0gcy0+cmVsMzI7CisgIGxpc3RpbmcgPSBzLT5saXN0aW5nOworICBmbGFnX25vX3dhcm5pbmdzID0gcy0+bm9fd2FybmluZ3M7CisKKyAgZnJlZSAocyk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVHlwZXMgb2YgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmVzLiAgKi8KKworZW51bSBtcmlfY29udHJvbF90eXBlCit7CisgIG1yaV9mb3IsCisgIG1yaV9pZiwKKyAgbXJpX3JlcGVhdCwKKyAgbXJpX3doaWxlCit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0YWNrIHRoZSBNUkkgc3RydWN0dXJlZCBjb250cm9sCisgICBkaXJlY3RpdmVzLiAgKi8KKworc3RydWN0IG1yaV9jb250cm9sX2luZm8KK3sKKyAgLyogVGhlIGRpcmVjdGl2ZSB3aXRoaW4gd2hpY2ggdGhpcyBvbmUgaXMgZW5jbG9zZWQuICAqLworICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqb3V0ZXI7CisKKyAgLyogVGhlIHR5cGUgb2YgZGlyZWN0aXZlLiAgKi8KKyAgZW51bSBtcmlfY29udHJvbF90eXBlIHR5cGU7CisKKyAgLyogV2hldGhlciBhbiBFTFNFIGhhcyBiZWVuIGluIGFuIElGLiAgKi8KKyAgaW50IGVsc2Vfc2VlbjsKKworICAvKiBUaGUgYWRkIG9yIHN1YiBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiBhIEZPUi4gICovCisgIGNoYXIgKmluY3I7CisKKyAgLyogVGhlIGxhYmVsIG9mIHRoZSB0b3Agb2YgYSBGT1Igb3IgUkVQRUFUIGxvb3AuICAqLworICBjaGFyICp0b3A7CisKKyAgLyogVGhlIGxhYmVsIHRvIGp1bXAgdG8gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiwgb3IgdGhlIGVsc2UKKyAgICAgZXhwcmVzc2lvbiBvZiBhIGNvbmRpdGlvbmFsLiAgKi8KKyAgY2hhciAqbmV4dDsKKworICAvKiBUaGUgbGFiZWwgdG8ganVtcCB0byB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG9yIHRoZSBsYWJlbCBwYXN0CisgICAgIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbC4gICovCisgIGNoYXIgKmJvdHRvbTsKK307CisKKy8qIFRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLworCitzdGF0aWMgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm1yaV9jb250cm9sX3N0YWNrOworCisvKiBUaGUgY3VycmVudCBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSBpbmRleCBudW1iZXIsIHVzZWQgdG8KKyAgIGdlbmVyYXRlIGxhYmVsIG5hbWVzLiAgKi8KKworc3RhdGljIGludCBtcmlfY29udHJvbF9pbmRleDsKKworLyogU29tZSBmdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KKworc3RhdGljIHZvaWQgbXJpX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIGNoYXIgKm1yaV9jb250cm9sX2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqcHVzaF9tcmlfY29udHJvbAorICBQQVJBTVMgKChlbnVtIG1yaV9jb250cm9sX3R5cGUpKTsKK3N0YXRpYyB2b2lkIHBvcF9tcmlfY29udHJvbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IHBhcnNlX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50ICopKTsKK3N0YXRpYyBpbnQgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZAorICBQQVJBTVMgKChpbnQgKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKikpOworc3RhdGljIGludCBzd2FwX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgaW50IHJldmVyc2VfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQKKyAgUEFSQU1TICgoaW50LCBpbnQsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY29uc3QgY2hhciAqLAorCSAgIGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uCisgIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CisKKy8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uIGZvciBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCisKK3N0YXRpYyB2b2lkCittcmlfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICpzOworCisgIC8qIG1kX2Fzc2VtYmxlIGV4cGVjdHMgdGhlIG9wY29kZSB0byBiZSBpbiBsb3dlciBjYXNlLiAgKi8KKyAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1wwJzsgcysrKQorICAgIHsKKyAgICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMpKQorCSpzID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKKyAgICB9CisKKyAgbWRfYXNzZW1ibGUgKHN0cik7Cit9CisKKy8qIEdlbmVyYXRlIGEgbmV3IE1SSSBsYWJlbCBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIGxhYmVsIG5hbWUuICAqLworCitzdGF0aWMgY2hhciAqCittcmlfY29udHJvbF9sYWJlbCAoKQoreworICBjaGFyICpuOworCisgIG4gPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7CisgIHNwcmludGYgKG4sICIlc21jJWQiLCBGQUtFX0xBQkVMX05BTUUsIG1yaV9jb250cm9sX2luZGV4KTsKKyAgKyttcmlfY29udHJvbF9pbmRleDsKKyAgcmV0dXJuIG47Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqCitwdXNoX21yaV9jb250cm9sICh0eXBlKQorICAgICBlbnVtIG1yaV9jb250cm9sX3R5cGUgdHlwZTsKK3sKKyAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47CisKKyAgbiA9IChzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKSk7CisKKyAgbi0+dHlwZSA9IHR5cGU7CisgIG4tPmVsc2Vfc2VlbiA9IDA7CisgIGlmICh0eXBlID09IG1yaV9pZiB8fCB0eXBlID09IG1yaV93aGlsZSkKKyAgICBuLT50b3AgPSBOVUxMOworICBlbHNlCisgICAgbi0+dG9wID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7CisgIG4tPm5leHQgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKKyAgbi0+Ym90dG9tID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7CisKKyAgbi0+b3V0ZXIgPSBtcmlfY29udHJvbF9zdGFjazsKKyAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuOworCisgIHJldHVybiBuOworfQorCisvKiBQb3Agb2ZmIHRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLworCitzdGF0aWMgdm9pZAorcG9wX21yaV9jb250cm9sICgpCit7CisgIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOworCisgIG4gPSBtcmlfY29udHJvbF9zdGFjazsKKyAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuLT5vdXRlcjsKKyAgaWYgKG4tPnRvcCAhPSBOVUxMKQorICAgIGZyZWUgKG4tPnRvcCk7CisgIGZyZWUgKG4tPm5leHQpOworICBmcmVlIChuLT5ib3R0b20pOworICBmcmVlIChuKTsKK30KKworLyogUmVjb2duaXplIGEgY29uZGl0aW9uIGNvZGUgaW4gYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgKi8KKworc3RhdGljIGludAorcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKQorICAgICBpbnQgKnBjYzsKK3sKKyAgY2hhciBjMSwgYzI7CisKKyAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpOworCisgICsraW5wdXRfbGluZV9wb2ludGVyOworICBjMSA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgYzIgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz4nKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICBpZiAoaXN1cHBlciAoYzEpKQorICAgIGMxID0gdG9sb3dlciAoYzEpOworICBpZiAoaXN1cHBlciAoYzIpKQorICAgIGMyID0gdG9sb3dlciAoYzIpOworCisgICpwY2MgPSAoYzEgPDwgOCkgfCBjMjsKKworICByZXR1cm4gMTsKK30KKworLyogUGFyc2UgYSBzaW5nbGUgb3BlcmFuZCBpbiBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICAqLworCitzdGF0aWMgaW50CitwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kIChwY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsIHJpZ2h0c3RvcCkKKyAgICAgaW50ICpwY2M7CisgICAgIGNoYXIgKipsZWZ0c3RhcnQ7CisgICAgIGNoYXIgKipsZWZ0c3RvcDsKKyAgICAgY2hhciAqKnJpZ2h0c3RhcnQ7CisgICAgIGNoYXIgKipyaWdodHN0b3A7Cit7CisgIGNoYXIgKnM7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgICpwY2MgPSAtMTsKKyAgKmxlZnRzdGFydCA9IE5VTEw7CisgICpsZWZ0c3RvcCA9IE5VTEw7CisgICpyaWdodHN0YXJ0ID0gTlVMTDsKKyAgKnJpZ2h0c3RvcCA9IE5VTEw7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQorICAgIHsKKyAgICAgIC8qIEl0J3MganVzdCBhIGNvbmRpdGlvbiBjb2RlLiAgKi8KKyAgICAgIHJldHVybiBwYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpOworICAgIH0KKworICAvKiBMb29rIGFoZWFkIGZvciB0aGUgY29uZGl0aW9uIGNvZGUuICAqLworICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICpzICE9ICdcMCc7ICsrcykKKyAgICB7CisgICAgICBpZiAoKnMgPT0gJzwnICYmIHNbMV0gIT0gJ1wwJyAmJiBzWzJdICE9ICdcMCcgJiYgc1szXSA9PSAnPicpCisJYnJlYWs7CisgICAgfQorICBpZiAoKnMgPT0gJ1wwJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY29uZGl0aW9uIGNvZGUgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAqbGVmdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqbGVmdHN0b3AgPSBzOworICBpZiAoKmxlZnRzdG9wID4gKmxlZnRzdGFydAorICAgICAgJiYgKCgqbGVmdHN0b3ApWy0xXSA9PSAnICcgfHwgKCpsZWZ0c3RvcClbLTFdID09ICdcdCcpKQorICAgIC0tKmxlZnRzdG9wOworCisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisgIGlmICghIHBhcnNlX21yaV9jb25kaXRpb24gKHBjYykpCisgICAgcmV0dXJuIDA7CisKKyAgLyogTG9vayBhaGVhZCBmb3IgQU5EIG9yIE9SIG9yIGVuZCBvZiBsaW5lLiAgKi8KKyAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAqcyAhPSAnXDAnOyArK3MpCisgICAgeworICAgICAgaWYgKChzdHJuY2FzZWNtcCAocywgIkFORCIsIDMpID09IDAKKwkgICAmJiAoc1szXSA9PSAnLicgfHwgISBpc19wYXJ0X29mX25hbWUgKHNbM10pKSkKKwkgIHx8IChzdHJuY2FzZWNtcCAocywgIk9SIiwgMikgPT0gMAorCSAgICAgICYmIChzWzJdID09ICcuJyB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoc1syXSkpKSkKKwlicmVhazsKKyAgICB9CisKKyAgKnJpZ2h0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICpyaWdodHN0b3AgPSBzOworICBpZiAoKnJpZ2h0c3RvcCA+ICpyaWdodHN0YXJ0CisgICAgICAmJiAoKCpyaWdodHN0b3ApWy0xXSA9PSAnICcgfHwgKCpyaWdodHN0b3ApWy0xXSA9PSAnXHQnKSkKKyAgICAtLSpyaWdodHN0b3A7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKKworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBNQ0MoYjEsIGIyKSAoKChiMSkgPDwgOCkgfCAoYjIpKQorCisvKiBTd2FwIHRoZSBzZW5zZSBvZiBhIGNvbmRpdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgY29uZGl0aW9uIHNvIHRoYXQKKyAgIGl0IGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgd2hlbiB0aGUgb3BlcmFuZHMgYXJlIHN3YXBwZWQuICAqLworCitzdGF0aWMgaW50Citzd2FwX21yaV9jb25kaXRpb24gKGNjKQorICAgICBpbnQgY2M7Cit7CisgIHN3aXRjaCAoY2MpCisgICAgeworICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdjJywgJ3MnKTsKKyAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnYycsICdjJyk7CisgICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2wnLCAncycpOworICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdoJywgJ2knKTsKKyAgICBjYXNlIE1DQyAoJ3AnLCAnbCcpOiByZXR1cm4gTUNDICgnbScsICdpJyk7CisgICAgY2FzZSBNQ0MgKCdtJywgJ2knKTogcmV0dXJuIE1DQyAoJ3AnLCAnbCcpOworICAgIGNhc2UgTUNDICgnZycsICdlJyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKKyAgICBjYXNlIE1DQyAoJ2wnLCAndCcpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7CisgICAgY2FzZSBNQ0MgKCdnJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2wnLCAndCcpOworICAgIGNhc2UgTUNDICgnbCcsICdlJyk6IHJldHVybiBNQ0MgKCdnJywgJ2UnKTsKKyAgICB9CisgIHJldHVybiBjYzsKK30KKworLyogUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgYSBjb25kaXRpb24uICAqLworCitzdGF0aWMgaW50CityZXZlcnNlX21yaV9jb25kaXRpb24gKGNjKQorICAgICBpbnQgY2M7Cit7CisgIHN3aXRjaCAoY2MpCisgICAgeworICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdsJywgJ3MnKTsKKyAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnaCcsICdpJyk7CisgICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2MnLCAncycpOworICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdjJywgJ2MnKTsKKyAgICBjYXNlIE1DQyAoJ24nLCAnZScpOiByZXR1cm4gTUNDICgnZScsICdxJyk7CisgICAgY2FzZSBNQ0MgKCdlJywgJ3EnKTogcmV0dXJuIE1DQyAoJ24nLCAnZScpOworICAgIGNhc2UgTUNDICgndicsICdjJyk6IHJldHVybiBNQ0MgKCd2JywgJ3MnKTsKKyAgICBjYXNlIE1DQyAoJ3YnLCAncycpOiByZXR1cm4gTUNDICgndicsICdjJyk7CisgICAgY2FzZSBNQ0MgKCdwJywgJ2wnKTogcmV0dXJuIE1DQyAoJ20nLCAnaScpOworICAgIGNhc2UgTUNDICgnbScsICdpJyk6IHJldHVybiBNQ0MgKCdwJywgJ2wnKTsKKyAgICBjYXNlIE1DQyAoJ2cnLCAnZScpOiByZXR1cm4gTUNDICgnbCcsICd0Jyk7CisgICAgY2FzZSBNQ0MgKCdsJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2cnLCAnZScpOworICAgIGNhc2UgTUNDICgnZycsICd0Jyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKKyAgICBjYXNlIE1DQyAoJ2wnLCAnZScpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7CisgICAgfQorICByZXR1cm4gY2M7Cit9CisKKy8qIEJ1aWxkIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gIFRoaXMgZ2VuZXJhdGVzIHRlc3QKKyAgIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgSXQgZ29lcyB0byBUUlVFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMKKyAgIHRydWUsIGFuZCB0byBGQUxTRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLiAgRXhhY3RseSBvbmUgb2YKKyAgIFRSVUVMQUIgYW5kIEZBTFNFTEFCIHdpbGwgYmUgTlVMTCwgbWVhbmluZyB0byBmYWxsIHRocm91Z2guICBRVUFMCisgICBpcyB0aGUgc2l6ZSBxdWFsaWZpZXIgZm9yIHRoZSBleHByZXNzaW9uLiAgRVhURU5UIGlzIHRoZSBzaXplIHRvCisgICB1c2UgZm9yIHRoZSBicmFuY2guICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCisJCQkgICByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCisgICAgIGludCBxdWFsOworICAgICBpbnQgY2M7CisgICAgIGNoYXIgKmxlZnRzdGFydDsKKyAgICAgY2hhciAqbGVmdHN0b3A7CisgICAgIGNoYXIgKnJpZ2h0c3RhcnQ7CisgICAgIGNoYXIgKnJpZ2h0c3RvcDsKKyAgICAgY29uc3QgY2hhciAqdHJ1ZWxhYjsKKyAgICAgY29uc3QgY2hhciAqZmFsc2VsYWI7CisgICAgIGludCBleHRlbnQ7Cit7CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciAqczsKKworICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IG02OGtfb3AgbGVmdG9wLCByaWdodG9wOworICAgICAgY2hhciBjOworCisgICAgICAvKiBTd2FwIHRoZSBjb21wYXJlIG9wZXJhbmRzLCBpZiBuZWNlc3NhcnksIHRvIHByb2R1Y2UgYSBsZWdhbAorCSBtNjhrIGNvbXBhcmUgaW5zdHJ1Y3Rpb24uICBDb21wYXJpbmcgYSByZWdpc3RlciBvcGVyYW5kIHdpdGgKKwkgYSBub24tcmVnaXN0ZXIgb3BlcmFuZCByZXF1aXJlcyB0aGUgcmVnaXN0ZXIgdG8gYmUgb24gdGhlCisJIHJpZ2h0IChjbXAsIGNtcGEpLiAgQ29tcGFyaW5nIGFuIGltbWVkaWF0ZSB2YWx1ZSB3aXRoCisJIGFueXRoaW5nIHJlcXVpcmVzIHRoZSBpbW1lZGlhdGUgdmFsdWUgdG8gYmUgb24gdGhlIGxlZnQKKwkgKGNtcGkpLiAgKi8KKworICAgICAgYyA9ICpsZWZ0c3RvcDsKKyAgICAgICpsZWZ0c3RvcCA9ICdcMCc7CisgICAgICAodm9pZCkgbTY4a19pcF9vcCAobGVmdHN0YXJ0LCAmbGVmdG9wKTsKKyAgICAgICpsZWZ0c3RvcCA9IGM7CisKKyAgICAgIGMgPSAqcmlnaHRzdG9wOworICAgICAgKnJpZ2h0c3RvcCA9ICdcMCc7CisgICAgICAodm9pZCkgbTY4a19pcF9vcCAocmlnaHRzdGFydCwgJnJpZ2h0b3ApOworICAgICAgKnJpZ2h0c3RvcCA9IGM7CisKKyAgICAgIGlmIChyaWdodG9wLm1vZGUgPT0gSU1NRUQKKwkgIHx8ICgobGVmdG9wLm1vZGUgPT0gRFJFRyB8fCBsZWZ0b3AubW9kZSA9PSBBUkVHKQorCSAgICAgICYmIChyaWdodG9wLm1vZGUgIT0gRFJFRyAmJiByaWdodG9wLm1vZGUgIT0gQVJFRykpKQorCXsKKwkgIGNoYXIgKnRlbXA7CisKKwkgIGNjID0gc3dhcF9tcmlfY29uZGl0aW9uIChjYyk7CisJICB0ZW1wID0gbGVmdHN0YXJ0OworCSAgbGVmdHN0YXJ0ID0gcmlnaHRzdGFydDsKKwkgIHJpZ2h0c3RhcnQgPSB0ZW1wOworCSAgdGVtcCA9IGxlZnRzdG9wOworCSAgbGVmdHN0b3AgPSByaWdodHN0b3A7CisJICByaWdodHN0b3AgPSB0ZW1wOworCX0KKyAgICB9CisKKyAgaWYgKHRydWVsYWIgPT0gTlVMTCkKKyAgICB7CisgICAgICBjYyA9IHJldmVyc2VfbXJpX2NvbmRpdGlvbiAoY2MpOworICAgICAgdHJ1ZWxhYiA9IGZhbHNlbGFiOworICAgIH0KKyAgICAgIAorICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCisgICAgeworICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAKKwkJCSAgICAgICsgKGxlZnRzdG9wIC0gbGVmdHN0YXJ0KQorCQkJICAgICAgKyAocmlnaHRzdG9wIC0gcmlnaHRzdGFydCkpOworICAgICAgcyA9IGJ1ZjsKKyAgICAgICpzKysgPSAnYyc7CisgICAgICAqcysrID0gJ20nOworICAgICAgKnMrKyA9ICdwJzsKKyAgICAgIGlmIChxdWFsICE9ICdcMCcpCisJKnMrKyA9IHF1YWw7CisgICAgICAqcysrID0gJyAnOworICAgICAgbWVtY3B5IChzLCBsZWZ0c3RhcnQsIGxlZnRzdG9wIC0gbGVmdHN0YXJ0KTsKKyAgICAgIHMgKz0gbGVmdHN0b3AgLSBsZWZ0c3RhcnQ7CisgICAgICAqcysrID0gJywnOworICAgICAgbWVtY3B5IChzLCByaWdodHN0YXJ0LCByaWdodHN0b3AgLSByaWdodHN0YXJ0KTsKKyAgICAgIHMgKz0gcmlnaHRzdG9wIC0gcmlnaHRzdGFydDsKKyAgICAgICpzID0gJ1wwJzsKKyAgICAgIG1yaV9hc3NlbWJsZSAoYnVmKTsKKyAgICAgIGZyZWUgKGJ1Zik7CisgICAgfQorICAgICAgCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuICh0cnVlbGFiKSk7CisgIHMgPSBidWY7CisgICpzKysgPSAnYic7CisgICpzKysgPSBjYyA+PiA4OworICAqcysrID0gY2MgJiAweGZmOworICBpZiAoZXh0ZW50ICE9ICdcMCcpCisgICAgKnMrKyA9IGV4dGVudDsKKyAgKnMrKyA9ICcgJzsKKyAgc3RyY3B5IChzLCB0cnVlbGFiKTsKKyAgbXJpX2Fzc2VtYmxlIChidWYpOworICBmcmVlIChidWYpOworfQorCisvKiBQYXJzZSBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICBUaGlzIGdlbmVyYXRlcyB0ZXN0CisgICBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIFNUT1AgaXMgd2hlcmUgdGhlIGV4cHJlc3Npb24gZW5kcy4gIEl0CisgICBnb2VzIHRvIFRSVUVMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBhbmQgdG8gRkFMU0VMQUIgaWYgdGhlCisgICBjb25kaXRpb24gaXMgZmFsc2UuICBFeGFjdGx5IG9uZSBvZiBUUlVFTEFCIGFuZCBGQUxTRUxBQiB3aWxsIGJlCisgICBOVUxMLCBtZWFuaW5nIHRvIGZhbGwgdGhyb3VnaC4gIFFVQUwgaXMgdGhlIHNpemUgcXVhbGlmaWVyIGZvciB0aGUKKyAgIGV4cHJlc3Npb24uICBFWFRFTlQgaXMgdGhlIHNpemUgdG8gdXNlIGZvciB0aGUgYnJhbmNoLiAgKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHN0b3AsIHF1YWwsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCisgICAgIGNoYXIgKnN0b3A7CisgICAgIGludCBxdWFsOworICAgICBjb25zdCBjaGFyICp0cnVlbGFiOworICAgICBjb25zdCBjaGFyICpmYWxzZWxhYjsKKyAgICAgaW50IGV4dGVudDsKK3sKKyAgaW50IGM7CisgIGludCBjYzsKKyAgY2hhciAqbGVmdHN0YXJ0OworICBjaGFyICpsZWZ0c3RvcDsKKyAgY2hhciAqcmlnaHRzdGFydDsKKyAgY2hhciAqcmlnaHRzdG9wOworCisgIGMgPSAqc3RvcDsKKyAgKnN0b3AgPSAnXDAnOworCisgIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAorCQkJCSAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKKyAgICB7CisgICAgICAqc3RvcCA9IGM7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQU5EIiwgMykgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpmbGFiOworCisgICAgICBpZiAoZmFsc2VsYWIgIT0gTlVMTCkKKwlmbGFiID0gZmFsc2VsYWI7CisgICAgICBlbHNlCisJZmxhYiA9IG1yaV9jb250cm9sX2xhYmVsICgpOworCisgICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKKwkJCQkgcmlnaHRzdG9wLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmbGFiLCBleHRlbnQpOworCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJworCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcpCisJcXVhbCA9ICdcMCc7CisgICAgICBlbHNlCisJeworCSAgcXVhbCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOworCX0KKworICAgICAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCisJCQkJICAgICAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKKwl7CisJICAqc3RvcCA9IGM7CisJICByZXR1cm47CisJfQorCisgICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKKwkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKKworICAgICAgaWYgKGZhbHNlbGFiID09IE5VTEwpCisJY29sb24gKGZsYWIpOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk9SIiwgMikgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICp0bGFiOworCisgICAgICBpZiAodHJ1ZWxhYiAhPSBOVUxMKQorCXRsYWIgPSB0cnVlbGFiOworICAgICAgZWxzZQorCXRsYWIgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKKworICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCisJCQkJIHJpZ2h0c3RvcCwgdGxhYiwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZXh0ZW50KTsKKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicKKwkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnKQorCXF1YWwgPSAnXDAnOworICAgICAgZWxzZQorCXsKKwkgIHF1YWwgPSBpbnB1dF9saW5lX3BvaW50ZXJbMV07CisJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKwl9CisKKyAgICAgIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAorCQkJCSAgICAgICAmcmlnaHRzdGFydCwgJnJpZ2h0c3RvcCkpCisJeworCSAgKnN0b3AgPSBjOworCSAgcmV0dXJuOworCX0KKworICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCisJCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7CisKKyAgICAgIGlmICh0cnVlbGFiID09IE5VTEwpCisJY29sb24gKHRsYWIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAorCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOworICAgIH0KKworICAqc3RvcCA9IGM7CisgIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gc3RvcCkKKyAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOworfQorCisvKiBIYW5kbGUgdGhlIE1SSSBJRiBwc2V1ZG8tb3AuICBUaGlzIG1heSBiZSBhIHN0cnVjdHVyZWQgY29udHJvbAorICAgZGlyZWN0aXZlLCBvciBpdCBtYXkgYmUgYSByZWd1bGFyIGFzc2VtYmxlciBjb25kaXRpb25hbCwgZGVwZW5kaW5nCisgICBvbiBpdHMgb3BlcmFuZHMuICAqLworCitzdGF0aWMgdm9pZAorc19tcmlfaWYgKHF1YWwpCisgICAgIGludCBxdWFsOworeworICBjaGFyICpzOworICBpbnQgYzsKKyAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47CisKKyAgLyogQSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIG11c3QgZW5kIHdpdGggVEhFTiB3aXRoIGFuCisgICAgIG9wdGlvbmFsIHF1YWxpZmllci4gICovCisgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10KKwkgJiYgKCEgZmxhZ19tcmkgfHwgKnMgIT0gJyonKSkKKyAgICArK3M7CisgIC0tczsKKyAgd2hpbGUgKHMgPiBpbnB1dF9saW5lX3BvaW50ZXIgJiYgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSkKKyAgICAtLXM7CisKKyAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPiAxCisgICAgICAmJiBzWy0xXSA9PSAnLicpCisgICAgcyAtPSAyOworCisgIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyIDwgMworICAgICAgfHwgc3RybmNhc2VjbXAgKHMgLSAzLCAiVEhFTiIsIDQpICE9IDApCisgICAgeworICAgICAgaWYgKHF1YWwgIT0gJ1wwJykKKwl7CisJICBhc19iYWQgKF8oIm1pc3NpbmcgdGhlbiIpKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBJdCdzIGEgY29uZGl0aW9uYWwuICAqLworICAgICAgc19pZiAoT19uZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNpbmNlIHRoaXMgbWlnaHQgYmUgYSBjb25kaXRpb25hbCBpZiwgdGhpcyBwc2V1ZG8tb3Agd2lsbCBiZQorICAgICBjYWxsZWQgZXZlbiBpZiB3ZSBhcmUgc3VwcG9ydGVkIHRvIGJlIGlnbm9yaW5nIGlucHV0LiAgRG91YmxlCisgICAgIGNoZWNrIG5vdy4gIENsb2JiZXIgKmlucHV0X2xpbmVfcG9pbnRlciBzbyB0aGF0IGlnbm9yZV9pbnB1dAorICAgICB0aGlua3MgdGhhdCB0aGlzIGlzIG5vdCBhIHNwZWNpYWwgcHNldWRvLW9wLiAgKi8KKyAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOworICBpZiAoaWdub3JlX2lucHV0ICgpKQorICAgIHsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfaWYpOworCisgIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAzLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJCW4tPm5leHQsIHNbMV0gPT0gJy4nID8gc1syXSA6ICdcMCcpOworCisgIGlmIChzWzFdID09ICcuJykKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMzsKKyAgZWxzZQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOworCisgIGlmIChmbGFnX21yaSkKKyAgICB7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgTVJJIGVsc2UgcHNldWRvLW9wLiAgSWYgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBhbiBNUkkKKyAgIHN0cnVjdHVyZWQgSUYsIGFzc29jaWF0ZSB0aGUgRUxTRSB3aXRoIHRoZSBJRi4gIE90aGVyd2lzZSwgYXNzdW1lCisgICBpdCBpcyBhIGNvbmRpdGlvbmFsIGVsc2UuICAqLworCitzdGF0aWMgdm9pZAorc19tcmlfZWxzZSAocXVhbCkKKyAgICAgaW50IHF1YWw7Cit7CisgIGludCBjOworICBjaGFyICpidWY7CisgIGNoYXIgcVsyXTsKKworICBpZiAocXVhbCA9PSAnXDAnCisgICAgICAmJiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAorCSAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmCisJICB8fCBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKSkKKyAgICB7CisgICAgICBzX2Vsc2UgKDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7CisgIGlmIChpZ25vcmVfaW5wdXQgKCkpCisgICAgeworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKKyAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9pZgorICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikKKyAgICB7CisgICAgICBhc19iYWQgKF8oImVsc2Ugd2l0aG91dCBtYXRjaGluZyBpZiIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4gPSAxOworCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKSk7CisgIHFbMF0gPSBxdWFsOworICBxWzFdID0gJ1wwJzsKKyAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBxLCBtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKKyAgbXJpX2Fzc2VtYmxlIChidWYpOworICBmcmVlIChidWYpOworCisgIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSBNUkkgRU5ESSBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorc19tcmlfZW5kaSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAorICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogaWdub3JlX2lucHV0IHdpbGwgbm90IHJldHVybiB0cnVlIGZvciBFTkRJLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgIHdvcnJ5IGFib3V0IGNoZWNraW5nIGl0IGFnYWluIGhlcmUuICAqLworCisgIGlmICghIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pCisgICAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKKyAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOworCisgIHBvcF9tcmlfY29udHJvbCAoKTsKKworICBpZiAoZmxhZ19tcmkpCisgICAgeworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIE1SSSBCUkVBSyBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorc19tcmlfYnJlYWsgKGV4dGVudCkKKyAgICAgaW50IGV4dGVudDsKK3sKKyAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciBleFsyXTsKKworICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7CisgIHdoaWxlIChuICE9IE5VTEwKKwkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCisJICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAorCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKKyAgICBuID0gbi0+b3V0ZXI7CisgIGlmIChuID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJicmVhayBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChuLT5ib3R0b20pKTsKKyAgZXhbMF0gPSBleHRlbnQ7CisgIGV4WzFdID0gJ1wwJzsKKyAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKKyAgbXJpX2Fzc2VtYmxlIChidWYpOworICBmcmVlIChidWYpOworCisgIGlmIChmbGFnX21yaSkKKyAgICB7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgTVJJIE5FWFQgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3NfbXJpX25leHQgKGV4dGVudCkKKyAgICAgaW50IGV4dGVudDsKK3sKKyAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciBleFsyXTsKKworICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7CisgIHdoaWxlIChuICE9IE5VTEwKKwkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCisJICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAorCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKKyAgICBuID0gbi0+b3V0ZXI7CisgIGlmIChuID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkIChfKCJuZXh0IG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG4tPm5leHQpKTsKKyAgZXhbMF0gPSBleHRlbnQ7CisgIGV4WzFdID0gJ1wwJzsKKyAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+bmV4dCk7CisgIG1yaV9hc3NlbWJsZSAoYnVmKTsKKyAgZnJlZSAoYnVmKTsKKworICBpZiAoZmxhZ19tcmkpCisgICAgeworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIE1SSSBGT1IgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3NfbXJpX2ZvciAocXVhbCkKKyAgICAgaW50IHF1YWw7Cit7CisgIGNvbnN0IGNoYXIgKnZhcnN0YXJ0LCAqdmFyc3RvcDsKKyAgY29uc3QgY2hhciAqaW5pdHN0YXJ0LCAqaW5pdHN0b3A7CisgIGNvbnN0IGNoYXIgKmVuZHN0YXJ0LCAqZW5kc3RvcDsKKyAgY29uc3QgY2hhciAqYnlzdGFydCwgKmJ5c3RvcDsKKyAgaW50IHVwOworICBpbnQgYnk7CisgIGludCBleHRlbnQ7CisgIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOworICBjaGFyICpidWY7CisgIGNoYXIgKnM7CisgIGNoYXIgZXhbMl07CisKKyAgLyogVGhlIHN5bnRheCBpcworICAgICAgIEZPUi5xIHZhciA9IGluaXQgeyBUTyB8IERPV05UTyB9IGVuZCBbIEJZIGJ5IF0gRE8uZQorICAgICAqLworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgdmFyc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgLyogTG9vayBmb3IgdGhlICc9Jy4gICovCisgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQorCSAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKKyAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyA9IikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdmFyc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaWYgKHZhcnN0b3AgPiB2YXJzdGFydAorICAgICAgJiYgKHZhcnN0b3BbLTFdID09ICcgJyB8fCB2YXJzdG9wWy0xXSA9PSAnXHQnKSkKKyAgICAtLXZhcnN0b3A7CisKKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgaW5pdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIC8qIExvb2sgZm9yIFRPIG9yIERPV05UTy4gICovCisgIHVwID0gMTsKKyAgaW5pdHN0b3AgPSBOVUxMOworICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisgICAgeworICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJUTyIsIDIpID09IDAKKwkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKQorCXsKKwkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisJICBicmVhazsKKwl9CisgICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPV05UTyIsIDYpID09IDAKKwkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbNl0pKQorCXsKKwkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgdXAgPSAwOworCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7CisJICBicmVhazsKKwl9CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgIGlmIChpbml0c3RvcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyB0byBvciBkb3dudG8iKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKGluaXRzdG9wID4gaW5pdHN0YXJ0CisgICAgICAmJiAoaW5pdHN0b3BbLTFdID09ICcgJyB8fCBpbml0c3RvcFstMV0gPT0gJ1x0JykpCisgICAgLS1pbml0c3RvcDsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGVuZHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIC8qIExvb2sgZm9yIEJZIG9yIERPLiAgKi8KKyAgYnkgPSAwOworICBlbmRzdG9wID0gTlVMTDsKKyAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorICAgIHsKKyAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQlkiLCAyKSA9PSAwCisJICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkKKwl7CisJICBlbmRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgYnkgPSAxOworCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisJICBicmVhazsKKwl9CisgICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPIiwgMikgPT0gMAorCSAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSA9PSAnLicKKwkgICAgICB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkpCisJeworCSAgZW5kc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOworCSAgYnJlYWs7CisJfQorICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorICBpZiAoZW5kc3RvcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoZW5kc3RvcCA+IGVuZHN0YXJ0CisgICAgICAmJiAoZW5kc3RvcFstMV0gPT0gJyAnIHx8IGVuZHN0b3BbLTFdID09ICdcdCcpKQorICAgIC0tZW5kc3RvcDsKKworICBpZiAoISBieSkKKyAgICB7CisgICAgICBieXN0YXJ0ID0gIiMxIjsKKyAgICAgIGJ5c3RvcCA9IGJ5c3RhcnQgKyAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGJ5c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgICAgIC8qIExvb2sgZm9yIERPLiAgKi8KKyAgICAgIGJ5c3RvcCA9IE5VTEw7CisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJeworCSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJETyIsIDIpID09IDAKKwkgICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJworCQkgIHx8ICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKSkKKwkgICAgeworCSAgICAgIGJ5c3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJfQorICAgICAgaWYgKGJ5c3RvcCA9PSBOVUxMKQorCXsKKwkgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKGJ5c3RvcCA+IGJ5c3RhcnQKKwkgICYmIChieXN0b3BbLTFdID09ICcgJyB8fCBieXN0b3BbLTFdID09ICdcdCcpKQorCS0tYnlzdG9wOworICAgIH0KKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicpCisgICAgZXh0ZW50ID0gJ1wwJzsKKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dGVudCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOworICAgIH0KKworICAvKiBXZSBoYXZlIGZ1bGx5IHBhcnNlZCB0aGUgRk9SIG9wZXJhbmRzLiAgTm93IGJ1aWxkIHRoZSBsb29wLiAgKi8KKworICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX2Zvcik7CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoNTAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gdmFyc3RhcnQpKTsKKworICAvKiBtb3ZlIGluaXQsdmFyICovCisgIHMgPSBidWY7CisgICpzKysgPSAnbSc7CisgICpzKysgPSAnbyc7CisgICpzKysgPSAndic7CisgICpzKysgPSAnZSc7CisgIGlmIChxdWFsICE9ICdcMCcpCisgICAgKnMrKyA9IHF1YWw7CisgICpzKysgPSAnICc7CisgIG1lbWNweSAocywgaW5pdHN0YXJ0LCBpbml0c3RvcCAtIGluaXRzdGFydCk7CisgIHMgKz0gaW5pdHN0b3AgLSBpbml0c3RhcnQ7CisgICpzKysgPSAnLCc7CisgIG1lbWNweSAocywgdmFyc3RhcnQsIHZhcnN0b3AgLSB2YXJzdGFydCk7CisgIHMgKz0gdmFyc3RvcCAtIHZhcnN0YXJ0OworICAqcyA9ICdcMCc7CisgIG1yaV9hc3NlbWJsZSAoYnVmKTsKKworICBjb2xvbiAobi0+dG9wKTsKKworICAvKiBjbXAgZW5kLHZhciAqLworICBzID0gYnVmOworICAqcysrID0gJ2MnOworICAqcysrID0gJ20nOworICAqcysrID0gJ3AnOworICBpZiAocXVhbCAhPSAnXDAnKQorICAgICpzKysgPSBxdWFsOworICAqcysrID0gJyAnOworICBtZW1jcHkgKHMsIGVuZHN0YXJ0LCBlbmRzdG9wIC0gZW5kc3RhcnQpOworICBzICs9IGVuZHN0b3AgLSBlbmRzdGFydDsKKyAgKnMrKyA9ICcsJzsKKyAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKKyAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7CisgICpzID0gJ1wwJzsKKyAgbXJpX2Fzc2VtYmxlIChidWYpOworCisgIC8qIGJjYyBib3R0b20gKi8KKyAgZXhbMF0gPSBleHRlbnQ7CisgIGV4WzFdID0gJ1wwJzsKKyAgaWYgKHVwKQorICAgIHNwcmludGYgKGJ1ZiwgImJsdCVzICVzIiwgZXgsIG4tPmJvdHRvbSk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChidWYsICJiZ3QlcyAlcyIsIGV4LCBuLT5ib3R0b20pOworICBtcmlfYXNzZW1ibGUgKGJ1Zik7CisKKyAgLyogUHV0IHRvZ2V0aGVyIHRoZSBhZGQgb3Igc3ViIGluc3RydWN0aW9uIHVzZWQgYnkgRU5ERi4gICovCisgIHMgPSBidWY7CisgIGlmICh1cCkKKyAgICBzdHJjcHkgKHMsICJhZGQiKTsKKyAgZWxzZQorICAgIHN0cmNweSAocywgInN1YiIpOworICBzICs9IDM7CisgIGlmIChxdWFsICE9ICdcMCcpCisgICAgKnMrKyA9IHF1YWw7CisgICpzKysgPSAnICc7CisgIG1lbWNweSAocywgYnlzdGFydCwgYnlzdG9wIC0gYnlzdGFydCk7CisgIHMgKz0gYnlzdG9wIC0gYnlzdGFydDsKKyAgKnMrKyA9ICcsJzsKKyAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKKyAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7CisgICpzID0gJ1wwJzsKKyAgbi0+aW5jciA9IGJ1ZjsKKworICBpZiAoZmxhZ19tcmkpCisgICAgeworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIE1SSSBFTkRGIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX21yaV9lbmRmIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCisgICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfZm9yKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiZW5kZiB3aXRob3V0IGZvciIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7CisKKyAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7CisKKyAgc3ByaW50ZiAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IsICJicmEgJXMiLCBtcmlfY29udHJvbF9zdGFjay0+dG9wKTsKKyAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7CisKKyAgZnJlZSAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IpOworCisgIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKKworICBwb3BfbXJpX2NvbnRyb2wgKCk7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSBNUkkgUkVQRUFUIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX21yaV9yZXBlYXQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47CisKKyAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9yZXBlYXQpOworICBjb2xvbiAobi0+dG9wKTsKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgTVJJIFVOVElMIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX21yaV91bnRpbCAocXVhbCkKKyAgICAgaW50IHF1YWw7Cit7CisgIGNoYXIgKnM7CisKKyAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKKyAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9yZXBlYXQpCisgICAgeworICAgICAgYXNfYmFkIChfKCJ1bnRpbCB3aXRob3V0IHJlcGVhdCIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7CisKKyAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc107IHMrKykKKyAgICA7CisKKyAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocywgcXVhbCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKKwkJCQltcmlfY29udHJvbF9zdGFjay0+dG9wLCAnXDAnKTsKKworICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKKworICBwb3BfbXJpX2NvbnRyb2wgKCk7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSBNUkkgV0hJTEUgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3NfbXJpX3doaWxlIChxdWFsKQorICAgICBpbnQgcXVhbDsKK3sKKyAgY2hhciAqczsKKworICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKKworICBzID0gaW5wdXRfbGluZV9wb2ludGVyOworICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdCisJICYmICghIGZsYWdfbXJpIHx8ICpzICE9ICcqJykpCisgICAgcysrOworICAtLXM7CisgIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKKyAgICAtLXM7CisgIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyID4gMQorICAgICAgJiYgc1stMV0gPT0gJy4nKQorICAgIHMgLT0gMjsKKyAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPCAyCisgICAgICB8fCBzdHJuY2FzZWNtcCAocyAtIDEsICJETyIsIDIpICE9IDApCisgICAgeworICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV93aGlsZSk7CisKKyAgY29sb24gKG4tPm5leHQpOworCisgIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAxLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLCBuLT5ib3R0b20sCisJCQkJc1sxXSA9PSAnLicgPyBzWzJdIDogJ1wwJyk7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKworICBpZiAoZmxhZ19tcmkpCisgICAgeworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIE1SSSBFTkRXIHBzZXVkby1vcC4gICovCisKK3N0YXRpYyB2b2lkCitzX21yaV9lbmR3IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKmJ1ZjsKKworICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAorICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX3doaWxlKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiZW5kdyB3aXRob3V0IHdoaWxlIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KSk7CisgIHNwcmludGYgKGJ1ZiwgImJyYSAlcyIsIG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKKyAgbXJpX2Fzc2VtYmxlIChidWYpOworICBmcmVlIChidWYpOworCisgIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKKworICBwb3BfbXJpX2NvbnRyb2wgKCk7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwwKKy8qCisgKiBtZF9wYXJzZV9vcHRpb24KKyAqCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCisgKglTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6CisgKgorICoJLVtBXW1bY102ODAwMCwgLVtBXW1bY102ODAwOCwgLVtBXW1bY102ODAxMCwgLVtBXW1bY102ODAyMCwgLVtBXW1bY102ODAzMCwgLVtBXW1bY102ODA0MAorICoJLVtBXW1bY102ODg4MSwgLVtBXW1bY102ODg4MiwgLVtBXW1bY102ODg1MQorICoJCVNlbGVjdCB0aGUgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAorICoJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsCisgKgkJZXJyb3JzLiAgTW9yZSB0aGFuIG9uZSBtYXkgYmUgc3BlY2lmaWVkLiAgVGhlIGRlZmF1bHQgaXMKKyAqCQktbTY4MDIwIC1tNjg4NTEgLW02ODg4MS4gIE5vdGUgdGhhdCAtbTY4MDA4IGlzIGEgc3lub255bQorICoJCWZvciAtbTY4MDAwLCBhbmQgLW02ODg4MiBpcyBhIHN5bm9ueW0gZm9yIC1tNjg4ODEuCisgKgktW0FdbVtjXW5vLTY4ODUxLCAtW0FdbVtjXW5vLTY4ODgxCisgKgkJRG9uJ3QgYWNjZXB0IDY4OD8xIGluc3RydWN0aW9ucy4gIChUaGUgImMiIGlzIGtpbmQgb2Ygc2lsbHksCisgKgkJc28gZG9uJ3QgdXNlIG9yIGRvY3VtZW50IGl0LCBidXQgdGhhdCdzIHRoZSB3YXkgdGhlIHBhcnNpbmcKKyAqCQl3b3JrcykuCisgKgorICoJLXBpYwlJbmRpY2F0ZXMgUElDLgorICoJLWsJSW5kaWNhdGVzIFBJQy4gIChTdW4gMyBvbmx5LikKKyAqCisgKgktLWJpdHdpc2Utb3IKKyAqCQlQZXJtaXQgYHwnIHRvIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMuCisgKgorICovCisKKyNpZmRlZiBPQkpfRUxGCitDT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibFNBOm06a1E6ViI7CisjZWxzZQorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImxTQTptOmsiOworI2VuZGlmCisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKyNkZWZpbmUgT1BUSU9OX1BJQyAoT1BUSU9OX01EX0JBU0UpCisgIHsicGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QSUN9LAorI2RlZmluZSBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMIChPUFRJT05fTURfQkFTRSArIDEpCisgIHsicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiwgbm9fYXJndW1lbnQsIE5VTEwsCisgICAgIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUx9LAorI2RlZmluZSBPUFRJT05fQklUV0lTRV9PUiAoT1BUSU9OX01EX0JBU0UgKyAyKQorICB7ImJpdHdpc2Utb3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJVFdJU0VfT1J9LAorI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgMykKKyAgeyJiYXNlLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTZ9LAorI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNCkKKyAgeyJiYXNlLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzJ9LAorI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgNSkKKyAgeyJkaXNwLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTZ9LAorI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNikKKyAgeyJkaXNwLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzJ9LAorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ2wnOgkJCS8qIC1sIG1lYW5zIGtlZXAgZXh0ZXJuYWwgdG8gMiBiaXQgb2Zmc2V0CisJCQkJICAgcmF0aGVyIHRoYW4gMTYgYml0IG9uZSAqLworICAgICAgZmxhZ19zaG9ydF9yZWZzID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUyc6CQkJLyogLVMgbWVhbnMgdGhhdCBqYnNyJ3MgYWx3YXlzIHR1cm4gaW50bworCQkJCSAgIGpzcidzLiAgKi8KKyAgICAgIGZsYWdfbG9uZ19qdW1wcyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0EnOgorICAgICAgaWYgKCphcmcgPT0gJ20nKQorIAlhcmcrKzsKKyAgICAgIC8qIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgJ20nOgorCisgICAgICBpZiAoYXJnWzBdID09ICduJyAmJiBhcmdbMV0gPT0gJ28nICYmIGFyZ1syXSA9PSAnLScpCisJeworCSAgaW50IGk7CisJICB1bnNpZ25lZCBsb25nIGFyY2g7CisJICBjb25zdCBjaGFyICpvYXJnID0gYXJnOworCisJICBhcmcgKz0gMzsKKwkgIGlmICgqYXJnID09ICdtJykKKwkgICAgeworCSAgICAgIGFyZysrOworCSAgICAgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCisJCWFyZysrOworCSAgICB9CisJICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQorCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKKwkgICAgICBicmVhazsKKwkgIGlmIChpID09IG5fYXJjaHMpCisJICAgIHsKKwkgICAgdW5rbm93bjoKKwkgICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBvcHRpb24gYCVzJyIpLCBvYXJnKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgYXJjaCA9IGFyY2hzW2ldLmFyY2g7CisJICBpZiAoYXJjaCA9PSBtNjg4ODEpCisJICAgIG5vXzY4ODgxID0gMTsKKwkgIGVsc2UgaWYgKGFyY2ggPT0gbTY4ODUxKQorCSAgICBub182ODg1MSA9IDE7CisJICBlbHNlCisJICAgIGdvdG8gdW5rbm93bjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IGk7CisKKwkgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCisJICAgIGFyZysrOworCisJICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQorCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKKwkgICAgICB7CisJCXVuc2lnbmVkIGxvbmcgYXJjaCA9IGFyY2hzW2ldLmFyY2g7CisJCWlmIChjcHVfb2ZfYXJjaCAoYXJjaCkpCisJCSAgLyogSXQncyBhIGNwdSBzcGVjLiAgKi8KKwkJICB7CisJCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSB+bTY4MDAwdXA7CisJCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoOworCQkgIH0KKwkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4ODEpCisJCSAgeworCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOworCQkgICAgbm9fNjg4ODEgPSAwOworCQkgIH0KKwkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4NTEpCisJCSAgeworCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODUxOworCQkgICAgbm9fNjg4NTEgPSAwOworCQkgIH0KKwkJZWxzZQorCQkgIC8qID8/PyAqLworCQkgIGFib3J0ICgpOworCQlicmVhazsKKwkgICAgICB9CisJICBpZiAoaSA9PSBuX2FyY2hzKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIpLCBhcmcpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QSUM6CisgICAgY2FzZSAnayc6CisgICAgICBmbGFnX3dhbnRfcGljID0gMTsKKyAgICAgIGJyZWFrOwkJCS8qIC1waWMsIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKi8KKworICAgIGNhc2UgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDoKKyAgICAgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDE7CisgICAgICByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4gPSAxOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLworICAgIGNhc2UgJ1YnOgorICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KKwkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgY2FzZSAnUSc6CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0JJVFdJU0VfT1I6CisgICAgICB7CisJY2hhciAqbiwgKnQ7CisJY29uc3QgY2hhciAqczsKKworCW4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG02OGtfY29tbWVudF9jaGFycykgKyAxKTsKKwl0ID0gbjsKKwlmb3IgKHMgPSBtNjhrX2NvbW1lbnRfY2hhcnM7ICpzICE9ICdcMCc7IHMrKykKKwkgIGlmICgqcyAhPSAnfCcpCisJICAgICp0KysgPSAqczsKKwkqdCA9ICdcMCc7CisJbTY4a19jb21tZW50X2NoYXJzID0gbjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTY6CisgICAgICBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX1dPUkQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzMyOgorICAgICAgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID0gU0laRV9MT05HOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNjoKKyAgICAgIG02OGtfcmVsMzIgPSAwOworICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMjoKKyAgICAgIG02OGtfcmVsMzIgPSAxOworICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKKyAgZnByaW50ZihzdHJlYW0sIF8oIlwKKzY4MFgwIG9wdGlvbnM6XG5cCistbAkJCXVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cblwKKy1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjBcblwKKyB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW02ODM2MFxuXAorIHwgLW1jcHUzMiB8IC1tNTIwMFxuXAorCQkJc3BlY2lmeSB2YXJpYW50IG9mIDY4MFgwIGFyY2hpdGVjdHVyZSBbZGVmYXVsdCA2ODAyMF1cblwKKy1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODJcblwKKwkJCXRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcblwKKwkJCVtkZWZhdWx0IHllcyBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzJdXG4iKSk7CisgIGZwcmludGYoc3RyZWFtLCBfKCJcCistbTY4ODUxIHwgLW1uby02ODg1MVxuXAorCQkJdGFyZ2V0IGhhcy9sYWNrcyBtZW1vcnktbWFuYWdlbWVudCB1bml0IGNvcHJvY2Vzc29yXG5cCisJCQlbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwIGFuZCB1cF1cblwKKy1waWMsIC1rCQlnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCistUwkJCXR1cm4gamJzciBpbnRvIGpzclxuXAorLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWxcblwKKwkJCXJlY29nbml6ZSByZWdpc3RlciBuYW1lcyB3aXRob3V0IHByZWZpeCBjaGFyYWN0ZXJcblwKKy0tYml0d2lzZS1vcgkJZG8gbm90IHRyZWF0IGB8JyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyXG4iKSk7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorLS1iYXNlLXNpemUtZGVmYXVsdC0xNgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMTYgYml0c1xuXAorLS1iYXNlLXNpemUtZGVmYXVsdC0zMgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcblwKKy0tZGlzcC1zaXplLWRlZmF1bHQtMTYJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDE2IGJpdHNcblwKKy0tZGlzcC1zaXplLWRlZmF1bHQtMzIJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iKSk7Cit9CisMCisjaWZkZWYgVEVTVDIKKworLyogVEVTVDI6ICBUZXN0IG1kX2Fzc2VtYmxlKCkgKi8KKy8qIFdhcm5pbmcsIHRoaXMgcm91dGluZSBwcm9iYWJseSBkb2Vzbid0IHdvcmsgYW55bW9yZSAqLworCittYWluICgpCit7CisgIHN0cnVjdCBtNjhrX2l0IHRoZV9pbnM7CisgIGNoYXIgYnVmWzEyMF07CisgIGNoYXIgKmNwOworICBpbnQgbjsKKworICBtNjhrX2lwX2JlZ2luICgpOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmICghZ2V0cyAoYnVmKSB8fCAhKmJ1ZikKKwlicmVhazsKKyAgICAgIGlmIChidWZbMF0gPT0gJ3wnIHx8IGJ1ZlsxXSA9PSAnLicpCisJY29udGludWU7CisgICAgICBmb3IgKGNwID0gYnVmOyAqY3A7IGNwKyspCisJaWYgKCpjcCA9PSAnXHQnKQorCSAgKmNwID0gJyAnOworICAgICAgaWYgKGlzX2xhYmVsIChidWYpKQorCWNvbnRpbnVlOworICAgICAgbWVtc2V0ICgmdGhlX2lucywgJ1wwJywgc2l6ZW9mICh0aGVfaW5zKSk7CisgICAgICBtNjhrX2lwICgmdGhlX2lucywgYnVmKTsKKyAgICAgIGlmICh0aGVfaW5zLmVycm9yKQorCXsKKwkgIHByaW50ZiAoXygiRXJyb3IgJXMgaW4gJXNcbiIpLCB0aGVfaW5zLmVycm9yLCBidWYpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKF8oIk9wY29kZSglZC4lcyk6ICIpLCB0aGVfaW5zLm51bW8sIHRoZV9pbnMuYXJncyk7CisJICBmb3IgKG4gPSAwOyBuIDwgdGhlX2lucy5udW1vOyBuKyspCisJICAgIHByaW50ZiAoIiAweCV4IiwgdGhlX2lucy5vcGNvZGVbbl0gJiAweGZmZmYpOworCSAgcHJpbnRmICgiICAgICIpOworCSAgcHJpbnRfdGhlX2luc24gKCZ0aGVfaW5zLm9wY29kZVswXSwgc3Rkb3V0KTsKKwkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKKwl9CisgICAgICBmb3IgKG4gPSAwOyBuIDwgc3RybGVuICh0aGVfaW5zLmFyZ3MpIC8gMjsgbisrKQorCXsKKwkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQorCSAgICB7CisJICAgICAgcHJpbnRmICgib3AlZCBFcnJvciAlcyBpbiAlc1xuIiwgbiwgdGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvciwgYnVmKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgcHJpbnRmICgibW9kZSAlZCwgcmVnICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLm1vZGUsIHRoZV9pbnMub3BlcmFuZHNbbl0ucmVnKTsKKwkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QpCisJICAgIHByaW50ZiAoIkNvbnN0YW50OiAnJS4qcycsICIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfY29uc3QgLSB0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QsIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCk7CisJICBwcmludGYgKCJpcmVnICVkLCBpc2l6ICVkLCBpbXVsICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLmlyZWcsIHRoZV9pbnMub3BlcmFuZHNbbl0uaXNpeiwgdGhlX2lucy5vcGVyYW5kc1tuXS5pbXVsKTsKKwkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCkKKwkgICAgcHJpbnRmICgiSWFkZDogJyUuKnMnLCIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfaWFkZCAtIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkLCB0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCk7CisJICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7CisJfQorICAgIH0KKyAgbTY4a19pcF9lbmQgKCk7CisgIHJldHVybiAwOworfQorCitpc19sYWJlbCAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKyAgd2hpbGUgKCpzdHIgJiYgKnN0ciAhPSAnICcpCisgICAgc3RyKys7CisgIGlmIChzdHJbLTFdID09ICc6JyB8fCBzdHJbMV0gPT0gJz0nKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgcmVsYXhhdGlvbjoKKworICAgMCAwCWJyYW5jaCBvZmZzZXQJYnl0ZQkoYnJhLCBldGMpCisgICAwIDEJCQl3b3JkCisgICAwIDIJCQlsb25nCisKKyAgIDEgMAlpbmRleGVkIG9mZnNldHMJYnl0ZQlhMEAoMzIsZDQ6dzoxKSBldGMKKyAgIDEgMQkJCXdvcmQKKyAgIDEgMgkJCWxvbmcKKworICAgMiAwCXR3by1vZmZzZXQgaW5kZXggd29yZC13b3JkIGEwQCgzMixkNClAKDQ1KSBldGMKKyAgIDIgMQkJCXdvcmQtbG9uZworICAgMiAyCQkJbG9uZy13b3JkCisgICAyIDMJCQlsb25nLWxvbmcKKworICAgKi8KKworLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLworCisvKiBBUkdTVVNFRCAqLworc3ltYm9sUyAqCittZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICByZXR1cm4gMDsKK30KKworLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKKyAgICAgc2VnVCBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyNpZmRlZiBPQkpfQU9VVAorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbworICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCisgICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKKyAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCisgICAgIHdvcmsuICAqLworICBpbnQgYWxpZ247CisKKyAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOworICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KKyAgIE9uIHRoZSA2OGssIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBleHRlbnNpb24KKyAgIHdvcmQuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG9mZnNldCBhbmQgdGhlCisgICBmaXJzdCBleHRlbnNpb24gd29yZCBpcyBzdG9yZWQgaW4gZnhfcGNyZWxfYWRqdXN0LiAqLworbG9uZworbWRfcGNyZWxfZnJvbSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgaW50IGFkanVzdDsKKworICAvKiBCZWNhdXNlIGZ4X3BjcmVsX2FkanVzdCBpcyBhIGNoYXIsIGFuZCBtYXkgYmUgdW5zaWduZWQsIHdlIHN0b3JlCisgICAgIC0xIGFzIDY0LiAgKi8KKyAgYWRqdXN0ID0gZml4UC0+ZnhfcGNyZWxfYWRqdXN0OworICBpZiAoYWRqdXN0ID09IDY0KQorICAgIGFkanVzdCA9IC0xOworICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzIC0gYWRqdXN0OworfQorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyNpZmRlZiBPQkpfQ09GRgorCisvKkFSR1NVU0VEKi8KK3ZvaWQKK3RjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQorICAgICBzeW1ib2xTICppZ25vcmU7Cit7Cit9CisKK2ludAordGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIHN3aXRjaCAoZnJhZy0+ZnJfc3VidHlwZSAmIDB4MykKKyAgICB7CisgICAgY2FzZSBCWVRFOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBTSE9SVDoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2UgTE9ORzoKKyAgICAgIHJldHVybiA0OworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworI2VuZGlmCisjZW5kaWYKKworLyogZW5kIG9mIHRjLW02OGsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmggYi9nYXMvY29uZmlnL3RjLW02OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzgzMDhhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1tNjhrLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qIFRoaXMgZmlsZSBpcyB0Yy1tNjhrLmgKKyAgIENvcHlyaWdodCAoQykgMTk4NywgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVENfTTY4SyAxCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3N0cnVjdCBzeW1ib2w7CitzdHJ1Y3QgZml4OworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQorCisjaWZkZWYgT0JKX0FPVVQKKyNpZmRlZiBURV9TVU4zCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXN1bm9zLWJpZyIKKyNlbmRpZgorI2lmZGVmIFRFX05ldEJTRAorI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1tNjhrLW5ldGJzZCIKKyNlbmRpZgorI2lmZGVmIFRFX0xJTlVYCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LW02OGstbGludXgiCisjZW5kaWYKKyNpZm5kZWYgVEFSR0VUX0ZPUk1BVAorI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC16ZXJvLWJpZyIKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW02OGsiCisjZW5kaWYKKworI2lmZGVmIFRFX0FQT0xMTworI2RlZmluZSBDT0ZGX01BR0lDCQlBUE9MTE9NNjhLTUFHSUMKKyNkZWZpbmUgQ09GRl9BT1VUSERSX01BR0lDCUFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSCisjdW5kZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKKyNlbmRpZgorCisjaWZkZWYgVEVfTFlOWAorI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1tNjhrLWx5bngiCisjZW5kaWYKKyNpZmRlZiBURV9BVVgKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1hdXgiCisjZW5kaWYKKyNpZmRlZiBURV9ERUxUQQorI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiY29mZi1tNjhrLXN5c3YiCisjZW5kaWYKKworI2lmbmRlZiBDT0ZGX01BR0lDCisjZGVmaW5lIENPRkZfTUFHSUMgTUM2OE1BR0lDCisjZW5kaWYKKyNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfbTY4ayAvKiBmb3Igbm9uLUJGRF9BU1NFTUJMRVIgKi8KKyNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbTY4ayAvKiBCRkRfQVNTRU1CTEVSICovCisjZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVworI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKHgpLT5meF9hZGRzeXx8KHgpLT5meF9zdWJzeSkKKworI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQorI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKK2V4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqKSk7CisjaWZkZWYgVEVfU1VOMworLyogVGhpcyB2YXJpYWJsZSBjb250YWlucyB0aGUgdmFsdWUgdG8gd3JpdGUgb3V0IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgIHRoZSBhLm91dCBmaWxlLiAgVGhlIDI8PDE2IG1lYW5zIHRoYXQgdGhpcyBpcyBhIDY4MDIwIGZpbGUgaW5zdGVhZAorICAgb2YgYW4gb2xkLXN0eWxlIDY4MDAwIGZpbGUgKi8KKworI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUgKDI8PDE2fE9NQUdJQyk7CS8qIE1hZ2ljIGJ5dGUgZm9yIGZpbGUgaGVhZGVyICovCisjZW5kaWYgLyogVEVfU1VOMyAqLworCisjaWZuZGVmIEFPVVRfTUFDSFRZUEUKKyNkZWZpbmUgQU9VVF9NQUNIVFlQRSBtNjhrX2FvdXRfbWFjaHR5cGUKK2V4dGVybiBpbnQgbTY4a19hb3V0X21hY2h0eXBlOworI2VuZGlmCisKKyNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBtNjhrX2NvbW1lbnRfY2hhcnMKK2V4dGVybiBjb25zdCBjaGFyICptNjhrX2NvbW1lbnRfY2hhcnM7CisKKyNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLworI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLworI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLworCisjZGVmaW5lIExJU1RJTkdfV09SRF9TSVpFIDIJLyogQSB3b3JkIGlzIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTElTVElOR19MSFNfV0lEVEggMgkvKiBPbmUgd29yZCBvbiB0aGUgZmlyc3QgbGluZSAqLworI2RlZmluZSBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQgMgkvKiBPbmUgd29yZCBvbiB0aGUgc2Vjb25kIGxpbmUgKi8KKyNkZWZpbmUgTElTVElOR19MSFNfQ09OVF9MSU5FUyA0LyogQW5kIDQgbGluZXMgbWF4ICovCisjZGVmaW5lIExJU1RJTkdfSEVBREVSICI2OEsgR0FTICIKKworI2lmbmRlZiBSRUdJU1RFUl9QUkVGSVgKKyNkZWZpbmUgUkVHSVNURVJfUFJFRklYICclJworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoUkVHSVNURVJfUFJFRklYX09QVElPTkFMKQorI2lmIGRlZmluZWQgKE02OEtDT0ZGKSB8fCBkZWZpbmVkIChPQkpfRUxGKQorI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisjZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyBcCisJCQkgICAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnLicpKQorI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLworI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMAorI2Vsc2UgLyogISAoQ09GRiB8fCBFTEYpICovCisjZGVmaW5lIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCAxCisjZW5kaWYgLyogISAoQ09GRiB8fCBFTEYpICovCisjZW5kaWYgLyogbm90IGRlZiBSRUdJU1RFUl9QUkVGSVggYW5kIG5vdCBkZWYgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYICovCisKKyNpZmRlZiBURV9ERUxUQQorLyogT24gdGhlIERlbHRhLCBgJScgY2FuIG9jY3VyIHdpdGhpbiBhIGxhYmVsIG5hbWUsIGJ1dCBub3QgYXMgdGhlCisgICBpbml0aWFsIGNoYXJhY3Rlci4gICovCisjZGVmaW5lIExFWF9QQ1QgTEVYX05BTUUKKy8qIE9uIHRoZSBEZWx0YSwgYH4nIGNhbiBzdGFydCBhIGxhYmVsIG5hbWUsIGJ1dCBpcyBjb252ZXJ0ZWQgdG8gJy4nLiAqLworI2RlZmluZSBMRVhfVElMREUgTEVYX0JFR0lOX05BTUUKKyNkZWZpbmUgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKHMpICgoKihzKSA9PSAnficgPyAqKHMpID0gJy4nIDogJy4nKSwgcykKKy8qIE9uIHRoZSBEZWx0YSwgZG90cyBhcmUgbm90IHJlcXVpcmVkIGJlZm9yZSBwc2V1ZG8tb3BzLiAgKi8KKyNkZWZpbmUgTk9fUFNFVURPX0RPVAorI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisjdW5kZWYgTE9DQUxfTEFCRUwKKyNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAorICAobmFtZVswXSA9PSAnLicgfHwgKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyUnKSkKKyNlbmRpZgorI2VuZGlmCisKK2V4dGVybiB2b2lkIG02OGtfbXJpX21vZGVfY2hhbmdlIFBBUkFNUyAoKGludCkpOworI2RlZmluZSBNUklfTU9ERV9DSEFOR0UoaSkgbTY4a19tcmlfbW9kZV9jaGFuZ2UgKGkpCisKK2V4dGVybiBpbnQgbTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCBQQVJBTVMgKChwc2V1ZG9fdHlwZVMgKikpOworI2RlZmluZSB0Y19jb25kaXRpb25hbF9wc2V1ZG9vcChwb3ApIG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgKHBvcCkKKworZXh0ZXJuIHZvaWQgbTY4a19mcm9iX2xhYmVsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgbTY4a19mcm9iX2xhYmVsIChzeW0pCisKK2V4dGVybiB2b2lkIG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCgpIG02OGtfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCkKKworZXh0ZXJuIHZvaWQgbTY4a19mcm9iX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKworI2RlZmluZSB0Y19mcm9iX3N5bWJvbChzeW0scHVudCkJCQkJXAorZG8JCQkJCQkJCVwKKyAgewkJCQkJCQkJXAorICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHJlZ19zZWN0aW9uKQkJCVwKKyAgICAgIHB1bnQgPSAxOwkJCQkJCQlcCisgICAgbTY4a19mcm9iX3N5bWJvbCAoc3ltKTsJCQkJCVwKKyAgfQkJCQkJCQkJXAord2hpbGUgKDApCisKKyNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKKworI2lmZGVmIE9CSl9FTEYKKworLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKKyAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCisgICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4gIElmCisgICB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZSBhc3NlbWJsZXIKKyAgIHNob3VsZCBuZXZlciBkbyB0aGUgcmVsb2NhdGlvbi4gICovCisKKyNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQlcCisJKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJXAorCSB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQlcCisJICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KQkJXAorCSAgICAgJiYgU19JU19ERUZJTkVEICgoRklYKS0+ZnhfYWRkc3kpCQlcCisJICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKKworI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShYKSB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKFgpCitleHRlcm4gaW50IHRjX202OGtfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7CisjZW5kaWYKKworI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWCkJCQlcCisJKChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCVwKKwkgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorCisjZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KKworI2RlZmluZSB0Y19mcm9iX2NvZmZfc3ltYm9sKHN5bSkgbTY4a19mcm9iX3N5bWJvbCAoc3ltKQorCisjZGVmaW5lIE5PX1JFTE9DIDAKKworI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLworCisjZGVmaW5lIERJRkZfRVhQUl9PSworCitleHRlcm4gdm9pZCBtNjhrX2luaXRfYWZ0ZXJfYXJncyBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncyBtNjhrX2luaXRfYWZ0ZXJfYXJncworCitleHRlcm4gaW50IG02OGtfcGFyc2VfbG9uZ19vcHRpb24gUEFSQU1TICgoY2hhciAqKSk7CisjZGVmaW5lIG1kX3BhcnNlX2xvbmdfb3B0aW9uIG02OGtfcGFyc2VfbG9uZ19vcHRpb24KKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKKyNkZWZpbmUgVEFSR0VUX1dPUkRfU0laRSAzMgorI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tNjhrCisKK2V4dGVybiBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCisKKy8qIENvcGllZCBmcm9tIHdyaXRlLmMgKi8KKy8qIFRoaXMgd2FzIGZvcm1lcmx5IGNhbGxlZCBNNjhLX0FJTV9LTFVER0UuICAqLworI2RlZmluZSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4oZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKSBcCisgIGlmIChhaW09PTAgJiYgdGhpc19zdGF0ZT09IDQpIHsgLyogaGFyZCBlbmNvZGVkIGZyb20gdGMtbTY4ay5jICovIFwKKyAgICBhaW09dGhpc190eXBlLT5ybHhfZm9yd2FyZCsxOyAvKiBGb3JjZSByZWxheGF0aW9uIGludG8gd29yZCBtb2RlICovIFwKKyAgfQorCisvKiBlbmQgb2YgdGMtbTY4ay5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW04OGsuYyBiL2dhcy9jb25maWcvdGMtbTg4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWE0OTZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmMKQEAgLTAsMCArMSwxNDUyIEBACisvKiBtODhrLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgTW90b3JvbGEgODgwMDAKKyAgIENvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mIEJ1ZmZhbG8gVW5pdmVyc2l0eQorICAgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKK0dBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorI2luY2x1ZGUgIm04OGstb3Bjb2RlLmgiCisKK3N0cnVjdCBmaWVsZF92YWxfYXNzb2MKK3sKKyAgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgdmFsOworfTsKKworc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjcl9yZWdzW10gPQoreworICB7IlBJRCIsIDB9LAorICB7IlBTUiIsIDF9LAorICB7IkVQU1IiLCAyfSwKKyAgeyJTU0JSIiwgM30sCisgIHsiU1hJUCIsIDR9LAorICB7IlNOSVAiLCA1fSwKKyAgeyJTRklQIiwgNn0sCisgIHsiVkJSIiwgN30sCisgIHsiRE1UMCIsIDh9LAorICB7IkRNRDAiLCA5fSwKKyAgeyJETUEwIiwgMTB9LAorICB7IkRNVDEiLCAxMX0sCisgIHsiRE1EMSIsIDEyfSwKKyAgeyJETUExIiwgMTN9LAorICB7IkRNVDIiLCAxNH0sCisgIHsiRE1EMiIsIDE1fSwKKyAgeyJETUEyIiwgMTZ9LAorICB7IlNSMCIsIDE3fSwKKyAgeyJTUjEiLCAxOH0sCisgIHsiU1IyIiwgMTl9LAorICB7IlNSMyIsIDIwfSwKKworICB7TlVMTCwgMH0sCit9OworCitzdHJ1Y3QgZmllbGRfdmFsX2Fzc29jIGZjcl9yZWdzW10gPQoreworICB7IkZQRUNSIiwgMH0sCisgIHsiRlBIUzEiLCAxfSwKKyAgeyJGUExTMSIsIDJ9LAorICB7IkZQSFMyIiwgM30sCisgIHsiRlBMUzIiLCA0fSwKKyAgeyJGUFBUIiwgNX0sCisgIHsiRlBSSCIsIDZ9LAorICB7IkZQUkwiLCA3fSwKKyAgeyJGUElUIiwgOH0sCisKKyAgeyJGUFNSIiwgNjJ9LAorICB7IkZQQ1IiLCA2M30sCisKKyAge05VTEwsIDB9LAorfTsKKworc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbXBzbG90W10gPQoreworLyogSW50ZWdlcglGbG9hdGluZyBwb2ludCAqLworICB7Im5jIiwgMH0sCisgIHsiY3AiLCAxfSwKKyAgeyJlcSIsIDJ9LAorICB7Im5lIiwgM30sCisgIHsiZ3QiLCA0fSwKKyAgeyJsZSIsIDV9LAorICB7Imx0IiwgNn0sCisgIHsiZ2UiLCA3fSwKKyAgeyJoaSIsIDh9LAl7Im91IiwgOH0sCisgIHsibHMiLCA5fSwJeyJpYiIsIDl9LAorICB7ImxvIiwgMTB9LAl7ImluIiwgMTB9LAorICB7ImhzIiwgMTF9LAl7Im9iIiwgMTF9LAorICB7ImJlIiwgMTJ9LAl7InVlIiwgMTJ9LAorICB7Im5iIiwgMTN9LAl7ImxnIiwgMTN9LAorICB7ImhlIiwgMTR9LAl7InVnIiwgMTR9LAorICB7Im5oIiwgMTV9LAl7InVsZSIsIDE1fSwKKwkJeyJ1bCIsIDE2fSwKKwkJeyJ1Z2UiLCAxN30sCisKKyAge05VTEwsIDB9LAorfTsKKworc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBjbmRtc2tbXSA9Cit7CisgIHsiZ3QwIiwgMX0sCisgIHsiZXEwIiwgMn0sCisgIHsiZ2UwIiwgM30sCisgIHsibHQwIiwgMTJ9LAorICB7Im5lMCIsIDEzfSwKKyAgeyJsZTAiLCAxNH0sCisKKyAge05VTEwsIDB9LAorfTsKKworc3RydWN0IG04OGtfaW5zbgoreworICB1bnNpZ25lZCBsb25nIG9wY29kZTsKKyAgZXhwcmVzc2lvblMgZXhwOworICBlbnVtIHJlbG9jX3R5cGUgcmVsb2M7Cit9OworCitzdGF0aWMgY2hhciAqZ2V0X2JmIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOworc3RhdGljIGNoYXIgKmdldF9jbXAgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7CitzdGF0aWMgY2hhciAqZ2V0X2NuZCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKK3N0YXRpYyBjaGFyICpnZXRfY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3ApKTsKK3N0YXRpYyBjaGFyICpnZXRfZmNyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wKSk7CitzdGF0aWMgY2hhciAqZ2V0X2ltbTE2IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7CitzdGF0aWMgY2hhciAqZ2V0X282IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOworc3RhdGljIGNoYXIgKmdldF9yZWcgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICpyZWdub3AsIGludCByZWdfcHJlZml4KSk7CitzdGF0aWMgY2hhciAqZ2V0X3ZlYzkgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7CitzdGF0aWMgY2hhciAqZ2V0dmFsIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCBpbnQgKnZhbHApKTsKKworc3RhdGljIGNoYXIgKmdldF9wY3IgUEFSQU1TICgoY2hhciAqcGFyYW0sIHN0cnVjdCBtODhrX2luc24gKmluc24sCisJCSAgICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYykpOworCitzdGF0aWMgaW50IGNhbGNvcCBQQVJBTVMgKChzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdCwKKwkJCSAgIGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuKSk7CisKKworZXh0ZXJuIGNoYXIgKm15bmFtZTsKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKKworLyogVGhlc2UgYml0cyBzaG91bGQgYmUgdHVybmVkIG9mZiBpbiB0aGUgZmlyc3QgYWRkcmVzcyBvZiBldmVyeSBzZWdtZW50ICovCitpbnQgbWRfc2VnX2FsaWduID0gNzsKKworLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKKyAgIGFub3RoZXIgY29tbWVudCAqLworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7CisKKy8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7CisKKy8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCitjb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKKworLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KKy8qIGFzIGluIDBmMTIzLjQ1NiAqLworLyogb3IgICAgMEgxLjIzNEUtMTIgKHNlZSBleHAgY2hhcnMgYWJvdmUpICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREZkYiOworCitleHRlcm4gdm9pZCBmbG9hdF9jb25zICgpLCBjb25zICgpLCBzX2dsb2JsICgpLCBzX3NwYWNlICgpLAorICBzX3NldCAoKSwgc19sY29tbSAoKTsKKworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDR9LAorICB7ImRlZiIsIHNfc2V0LCAwfSwKKyAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAorICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCisgIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCisgIHsiaGFsZiIsIGNvbnMsIDJ9LAorICB7ImJzcyIsIHNfbGNvbW0sIDF9LAorICB7InN0cmluZyIsIHN0cmluZ2VyLCAwfSwKKyAgeyJ3b3JkIiwgY29ucywgNH0sCisgIC8qIEZvcmNlIHNldCB0byBiZSB0cmVhdGVkIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KKyAgeyJzZXQiLCBOVUxMLCAwfSwKKyAgeyIuc2V0Iiwgc19zZXQsIDB9LAorICB7MH0KK307CisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBpID0gMDsKKworICAvKiBpbml0aWFsaXplIGhhc2ggdGFibGUgKi8KKworICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgLyogbG9vcCB1bnRpbCB5b3Ugc2VlIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKworICB3aGlsZSAoKm04OGtfb3Bjb2Rlc1tpXS5uYW1lKQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWUgPSBtODhrX29wY29kZXNbaV0ubmFtZTsKKworICAgICAgLyogaGFzaCBlYWNoIG1uZW1vbmljIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICovCisKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAmbTg4a19vcGNvZGVzW2ldKTsKKworICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCWFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoIGluc3RydWN0aW9uICclcyc6JXMiKSwKKwkJICBtODhrX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKKworICAgICAgLyogc2tpcCB0byBuZXh0IHVuaXF1ZSBtbmVtb25pYyBvciBlbmQgb2YgbGlzdCAqLworCisgICAgICBmb3IgKGkrKzsgIXN0cmNtcCAobTg4a19vcGNvZGVzW2ldLm5hbWUsIG5hbWUpOyBpKyspCisJOworICAgIH0KK30KKwwKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICByZXR1cm4gMDsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7Cit9CisMCit2b2lkCittZF9hc3NlbWJsZSAob3ApCisgICAgIGNoYXIgKm9wOworeworICBjaGFyICpwYXJhbSwgKnRoaXNmcmFnOworICBjaGFyIGM7CisgIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OworICBzdHJ1Y3QgbTg4a19pbnNuIGluc247CisKKyAgYXNzZXJ0IChvcCk7CisKKyAgLyogc2tpcCBvdmVyIGluc3RydWN0aW9uIHRvIGZpbmQgcGFyYW1ldGVycyAqLworCisgIGZvciAocGFyYW0gPSBvcDsgKnBhcmFtICE9IDAgJiYgIWlzc3BhY2UgKCpwYXJhbSk7IHBhcmFtKyspCisgICAgOworICBjID0gKnBhcmFtOworICAqcGFyYW0rKyA9ICdcMCc7CisKKyAgLyogdHJ5IHRvIGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBoYXNoIHRhYmxlICovCisKKyAgaWYgKChmb3JtYXQgPSAoc3RydWN0IG04OGtfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgb3ApKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBtbmVtb25pYyAnJXMnIiksIG9wKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogdHJ5IHBhcnNpbmcgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIGluc24gKi8KKworICBpbnNuLmV4cC5YX2FkZF9zeW1ib2wgPSAwOworICBpbnNuLmV4cC5YX29wX3N5bWJvbCA9IDA7CisgIGluc24uZXhwLlhfYWRkX251bWJlciA9IDA7CisgIGluc24uZXhwLlhfb3AgPSBPX2lsbGVnYWw7CisgIGluc24ucmVsb2MgPSBOT19SRUxPQzsKKworICB3aGlsZSAoIWNhbGNvcCAoZm9ybWF0LCBwYXJhbSwgJmluc24pKQorICAgIHsKKyAgICAgIC8qIGlmIGl0IGRvZXNuJ3QgcGFyc2UgdHJ5IHRoZSBuZXh0IGluc3RydWN0aW9uICovCisKKyAgICAgIGlmICghc3RyY21wIChmb3JtYXRbMF0ubmFtZSwgZm9ybWF0WzFdLm5hbWUpKQorCWZvcm1hdCsrOworICAgICAgZWxzZQorCXsKKwkgIGFzX2ZhdGFsIChfKCJQYXJhbWV0ZXIgc3ludGF4IGVycm9yIikpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgLyogZ3JvdyB0aGUgY3VycmVudCBmcmFnIGFuZCBwbG9wIGluIHRoZSBvcGNvZGUgKi8KKworICB0aGlzZnJhZyA9IGZyYWdfbW9yZSAoNCk7CisgIG1kX251bWJlcl90b19jaGFycyAodGhpc2ZyYWcsIGluc24ub3Bjb2RlLCA0KTsKKworICAvKiBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzIGxhYmVscyBtYXJrIGl0IGZvciBsYXRlciAqLworCisgIHN3aXRjaCAoaW5zbi5yZWxvYykKKyAgICB7CisgICAgY2FzZSBOT19SRUxPQzoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19MTzE2OgorICAgIGNhc2UgUkVMT0NfSEkxNjoKKyAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDIsCisJCSAgIDIsCisJCSAgICZpbnNuLmV4cCwKKwkJICAgMCwKKwkJICAgaW5zbi5yZWxvYyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfSVcxNjoKKyAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJICAgNCwKKwkJICAgJmluc24uZXhwLAorCQkgICAwLAorCQkgICBpbnNuLnJlbG9jKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19QQzE2OgorICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAorCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMiwKKwkJICAgMiwKKwkJICAgJmluc24uZXhwLAorCQkgICAxLAorCQkgICBpbnNuLnJlbG9jKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19QQzI2OgorICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAorCQkgICB0aGlzZnJhZyAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkgICA0LAorCQkgICAmaW5zbi5leHAsCisJCSAgIDEsCisJCSAgIGluc24ucmVsb2MpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gcmVsb2NhdGlvbiB0eXBlIikpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50CitjYWxjb3AgKGZvcm1hdCwgcGFyYW0sIGluc24pCisgICAgIHN0cnVjdCBtODhrX29wY29kZSAqZm9ybWF0OworICAgICBjaGFyICpwYXJhbTsKKyAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKK3sKKyAgY2hhciAqZm10ID0gZm9ybWF0LT5vcF9zcGVjOworICBpbnQgZjsKKyAgdW5zaWduZWQgdmFsOworICB1bnNpZ25lZCBvcGNvZGU7CisgIGludCByZWdfcHJlZml4ID0gJ3InOworCisgIGluc24tPm9wY29kZSA9IGZvcm1hdC0+b3Bjb2RlOworICBvcGNvZGUgPSAwOworCisgIGZvciAoOzspCisgICAgeworICAgICAgaWYgKHBhcmFtID09IDApCisJcmV0dXJuIDA7CisgICAgICBmID0gKmZtdCsrOworICAgICAgc3dpdGNoIChmKQorCXsKKwljYXNlIDA6CisJICBpbnNuLT5vcGNvZGUgfD0gb3Bjb2RlOworCSAgcmV0dXJuICgqcGFyYW0gPT0gMCB8fCAqcGFyYW0gPT0gJ1xuJyk7CisKKwlkZWZhdWx0OgorCSAgaWYgKGYgIT0gKnBhcmFtKyspCisJICAgIHJldHVybiAwOworCSAgYnJlYWs7CisKKwljYXNlICdkJzoKKwkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOworCSAgcmVnX3ByZWZpeCA9ICdyJzsKKwkgIG9wY29kZSB8PSB2YWwgPDwgMjE7CisJICBicmVhazsKKworCWNhc2UgJ28nOgorCSAgcGFyYW0gPSBnZXRfbzYgKHBhcmFtLCAmdmFsKTsKKwkgIG9wY29kZSB8PSAoKHZhbCA+PiAyKSA8PCA3KTsKKwkgIGJyZWFrOworCisJY2FzZSAneCc6CisJICByZWdfcHJlZml4ID0gJ3gnOworCSAgYnJlYWs7CisKKwljYXNlICcxJzoKKwkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOworCSAgcmVnX3ByZWZpeCA9ICdyJzsKKwkgIG9wY29kZSB8PSB2YWwgPDwgMTY7CisJICBicmVhazsKKworCWNhc2UgJzInOgorCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgcmVnX3ByZWZpeCk7CisJICByZWdfcHJlZml4ID0gJ3InOworCSAgb3Bjb2RlIHw9IHZhbDsKKwkgIGJyZWFrOworCisJY2FzZSAnMyc6CisJICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCAncicpOworCSAgb3Bjb2RlIHw9ICh2YWwgPDwgMTYpIHwgdmFsOworCSAgYnJlYWs7CisKKwljYXNlICdJJzoKKwkgIHBhcmFtID0gZ2V0X2ltbTE2IChwYXJhbSwgaW5zbik7CisJICBicmVhazsKKworCWNhc2UgJ2InOgorCSAgcGFyYW0gPSBnZXRfYmYgKHBhcmFtLCAmdmFsKTsKKwkgIG9wY29kZSB8PSB2YWw7CisJICBicmVhazsKKworCWNhc2UgJ3AnOgorCSAgcGFyYW0gPSBnZXRfcGNyIChwYXJhbSwgaW5zbiwgUkVMT0NfUEMxNik7CisJICBicmVhazsKKworCWNhc2UgJ1AnOgorCSAgcGFyYW0gPSBnZXRfcGNyIChwYXJhbSwgaW5zbiwgUkVMT0NfUEMyNik7CisJICBicmVhazsKKworCWNhc2UgJ0InOgorCSAgcGFyYW0gPSBnZXRfY21wIChwYXJhbSwgJnZhbCk7CisJICBvcGNvZGUgfD0gdmFsOworCSAgYnJlYWs7CisKKwljYXNlICdNJzoKKwkgIHBhcmFtID0gZ2V0X2NuZCAocGFyYW0sICZ2YWwpOworCSAgb3Bjb2RlIHw9IHZhbDsKKwkgIGJyZWFrOworCisJY2FzZSAnYyc6CisJICBwYXJhbSA9IGdldF9jciAocGFyYW0sICZ2YWwpOworCSAgb3Bjb2RlIHw9IHZhbCA8PCA1OworCSAgYnJlYWs7CisKKwljYXNlICdmJzoKKwkgIHBhcmFtID0gZ2V0X2ZjciAocGFyYW0sICZ2YWwpOworCSAgb3Bjb2RlIHw9IHZhbCA8PCA1OworCSAgYnJlYWs7CisKKwljYXNlICdWJzoKKwkgIHBhcmFtID0gZ2V0X3ZlYzkgKHBhcmFtLCAmdmFsKTsKKwkgIG9wY29kZSB8PSB2YWw7CisJICBicmVhazsKKworCWNhc2UgJz8nOgorCSAgLyogSGF2aW5nIHRoaXMgaGVyZSByZXBlYXRzIHRoZSB3YXJuaW5nIHNvbXRpbWVzLgorCSAgIEJ1dCBjYW4ndCB3ZSBzdGFuZCB0aGF0PyAgKi8KKwkgIGFzX3dhcm4gKF8oIlVzZSBvZiBvYnNvbGV0ZSBpbnN0cnVjdGlvbiIpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK21hdGNoX25hbWUgKHBhcmFtLCBhc3NvY190YWIsIHZhbHApCisgICAgIGNoYXIgKnBhcmFtOworICAgICBzdHJ1Y3QgZmllbGRfdmFsX2Fzc29jICphc3NvY190YWI7CisgICAgIHVuc2lnbmVkICp2YWxwOworeworICBpbnQgaTsKKyAgY2hhciAqbmFtZTsKKyAgaW50IG5hbWVfbGVuOworCisgIGZvciAoaSA9IDA7OyBpKyspCisgICAgeworICAgICAgbmFtZSA9IGFzc29jX3RhYltpXS5uYW1lOworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIG5hbWVfbGVuID0gc3RybGVuIChuYW1lKTsKKyAgICAgIGlmICghc3RybmNtcCAocGFyYW0sIG5hbWUsIG5hbWVfbGVuKSkKKwl7CisJICAqdmFscCA9IGFzc29jX3RhYltpXS52YWw7CisJICByZXR1cm4gcGFyYW0gKyBuYW1lX2xlbjsKKwl9CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnZXRfcmVnIChwYXJhbSwgcmVnbm9wLCByZWdfcHJlZml4KQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgdW5zaWduZWQgKnJlZ25vcDsKKyAgICAgaW50IHJlZ19wcmVmaXg7Cit7CisgIHVuc2lnbmVkIGM7CisgIHVuc2lnbmVkIHJlZ25vOworCisgIGMgPSAqcGFyYW0rKzsKKyAgaWYgKGMgPT0gcmVnX3ByZWZpeCkKKyAgICB7CisgICAgICByZWdubyA9ICpwYXJhbSsrIC0gJzAnOworICAgICAgaWYgKHJlZ25vIDwgMTApCisJeworCSAgaWYgKHJlZ25vID09IDApCisJICAgIHsKKwkgICAgICAqcmVnbm9wID0gMDsKKwkgICAgICByZXR1cm4gcGFyYW07CisJICAgIH0KKwkgIGMgPSAqcGFyYW0gLSAnMCc7CisJICBpZiAoYyA8IDEwKQorCSAgICB7CisJICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgYzsKKwkgICAgICBpZiAoYyA8IDMyKQorCQl7CisJCSAgKnJlZ25vcCA9IHJlZ25vOworCQkgIHJldHVybiBwYXJhbSArIDE7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKnJlZ25vcCA9IHJlZ25vOworCSAgICAgIHJldHVybiBwYXJhbTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoYyA9PSAncycgJiYgcGFyYW1bMF0gPT0gJ3AnKQorICAgIHsKKyAgICAgICpyZWdub3AgPSAzMTsKKyAgICAgIHJldHVybiBwYXJhbSArIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfaW1tMTYgKHBhcmFtLCBpbnNuKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKK3sKKyAgZW51bSByZWxvY190eXBlIHJlbG9jID0gTk9fUkVMT0M7CisgIHVuc2lnbmVkIGludCB2YWw7CisgIGNoYXIgKnNhdmVfcHRyOworCisgIGlmICghc3RybmNtcCAocGFyYW0sICJoaTE2IiwgNCkgJiYgIWlzYWxudW0gKHBhcmFtWzRdKSkKKyAgICB7CisgICAgICByZWxvYyA9IFJFTE9DX0hJMTY7CisgICAgICBwYXJhbSArPSA0OworICAgIH0KKyAgZWxzZSBpZiAoIXN0cm5jbXAgKHBhcmFtLCAibG8xNiIsIDQpICYmICFpc2FsbnVtIChwYXJhbVs0XSkpCisgICAgeworICAgICAgcmVsb2MgPSBSRUxPQ19MTzE2OworICAgICAgcGFyYW0gKz0gNDsKKyAgICB9CisgIGVsc2UgaWYgKCFzdHJuY21wIChwYXJhbSwgIml3MTYiLCA0KSAmJiAhaXNhbG51bSAocGFyYW1bNF0pKQorICAgIHsKKyAgICAgIHJlbG9jID0gUkVMT0NfSVcxNjsKKyAgICAgIHBhcmFtICs9IDQ7CisgICAgfQorCisgIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKKyAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7CisgIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKKworICB2YWwgPSBpbnNuLT5leHAuWF9hZGRfbnVtYmVyOworCisgIGlmIChpbnNuLT5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIC8qIEluc2VydCB0aGUgdmFsdWUgbm93LCBhbmQgcmVzZXQgcmVsb2MgdG8gTk9fUkVMT0MuICAqLworICAgICAgaWYgKHJlbG9jID09IE5PX1JFTE9DKQorCXsKKwkgIC8qIFdhcm4gYWJvdXQgdG9vIGJpZyBleHByZXNzaW9ucyBpZiBub3Qgc3Vycm91bmRlZCBieSB4eDE2LiAgKi8KKwkgIGlmICh2YWwgPiAweGZmZmYpCisJICAgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDE2IGJpdHMiKSk7CisJfQorCisgICAgICBpZiAocmVsb2MgPT0gUkVMT0NfSEkxNikKKwl2YWwgPj49IDE2OworCisgICAgICBpbnNuLT5vcGNvZGUgfD0gdmFsICYgMHhmZmZmOworICAgICAgcmVsb2MgPSBOT19SRUxPQzsKKyAgICB9CisgIGVsc2UgaWYgKHJlbG9jID09IE5PX1JFTE9DKQorICAgIC8qIFdlIGFjY2VwdCBhIHN5bWJvbCBldmVuIHdpdGhvdXQgbG8xNiwgaGkxNiwgZXRjLCBhbmQgYXNzdW1lCisgICAgICAgbG8xNiB3YXMgaW50ZW5kZWQuICAqLworICAgIHJlbG9jID0gUkVMT0NfTE8xNjsKKworICBpbnNuLT5yZWxvYyA9IHJlbG9jOworCisgIHJldHVybiBwYXJhbTsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X3BjciAocGFyYW0sIGluc24sIHJlbG9jKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgc3RydWN0IG04OGtfaW5zbiAqaW5zbjsKKyAgICAgZW51bSByZWxvY190eXBlIHJlbG9jOworeworICBjaGFyICpzYXZlcHRyLCAqc2F2ZXBhcmFtOworCisgIHNhdmVwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOworCisgIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOworCisgIHNhdmVwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZXB0cjsKKworICAvKiBCb3RjaDogV2Ugc2hvdWxkIHJlbG9jYXRlIG5vdyBpZiBPX2NvbnN0YW50LiAgKi8KKyAgaW5zbi0+cmVsb2MgPSByZWxvYzsKKworICByZXR1cm4gc2F2ZXBhcmFtOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfY21wIChwYXJhbSwgdmFscCkKKyAgICAgY2hhciAqcGFyYW07CisgICAgIHVuc2lnbmVkICp2YWxwOworeworICB1bnNpZ25lZCBpbnQgdmFsOworICBjaGFyICpzYXZlX3B0cjsKKworICBzYXZlX3B0ciA9IHBhcmFtOworCisgIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNtcHNsb3QsIHZhbHApOworICB2YWwgPSAqdmFscDsKKworICBpZiAocGFyYW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBwYXJhbSA9IHNhdmVfcHRyOworCisgICAgICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOworICAgICAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOworCisgICAgICBpZiAodmFsID49IDMyKQorCXsKKwkgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIpKTsKKwkgIHZhbCAlPSAzMjsKKwl9CisgICAgfQorCisgICp2YWxwID0gdmFsIDw8IDIxOworICByZXR1cm4gcGFyYW07Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF9jbmQgKHBhcmFtLCB2YWxwKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgdW5zaWduZWQgKnZhbHA7Cit7CisgIHVuc2lnbmVkIGludCB2YWw7CisKKyAgaWYgKGlzZGlnaXQgKCpwYXJhbSkpCisgICAgeworICAgICAgcGFyYW0gPSBnZXR2YWwgKHBhcmFtLCAmdmFsKTsKKworICAgICAgaWYgKHZhbCA+PSAzMikKKwl7CisJICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiKSk7CisJICB2YWwgJT0gMzI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChpc3VwcGVyICgqcGFyYW0pKQorCSpwYXJhbSA9IHRvbG93ZXIgKCpwYXJhbSk7CisKKyAgICAgIGlmIChpc3VwcGVyIChwYXJhbVsxXSkpCisJcGFyYW1bMV0gPSB0b2xvd2VyIChwYXJhbVsxXSk7CisKKyAgICAgIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNuZG1zaywgdmFscCk7CisKKyAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgICB2YWwgPSAqdmFscDsKKyAgICB9CisKKyAgKnZhbHAgPSB2YWwgPDwgMjE7CisgIHJldHVybiBwYXJhbTsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X2JmMiAocGFyYW0sIGJjKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgaW50IGJjOworeworICBpbnQgZGVwdGggPSAwOworICBpbnQgYzsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGMgPSAqcGFyYW07CisgICAgICBpZiAoYyA9PSAwKQorCXJldHVybiBwYXJhbTsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJygnKQorCWRlcHRoKys7CisgICAgICBlbHNlIGlmIChjID09ICcpJykKKwlkZXB0aC0tOworICAgICAgZWxzZSBpZiAoYyA9PSBiYyAmJiBkZXB0aCA8PSAwKQorCXJldHVybiBwYXJhbTsKKyAgICAgIHBhcmFtKys7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHBhcmFtLCBvZmZzZXRwKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgdW5zaWduZWQgKm9mZnNldHA7Cit7CisgIHVuc2lnbmVkIG9mZnNldDsKKworICBpZiAoaXNhbHBoYSAocGFyYW1bMF0pKQorICAgIHsKKyAgICAgIGlmIChpc3VwcGVyIChwYXJhbVswXSkpCisJcGFyYW1bMF0gPSB0b2xvd2VyIChwYXJhbVswXSk7CisgICAgICBpZiAoaXN1cHBlciAocGFyYW1bMV0pKQorCXBhcmFtWzFdID0gdG9sb3dlciAocGFyYW1bMV0pOworCisgICAgICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbXBzbG90LCBvZmZzZXRwKTsKKworICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOworICAgICAgb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgKm9mZnNldHAgPSBvZmZzZXQ7CisgIHJldHVybiBwYXJhbTsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X2JmIChwYXJhbSwgdmFscCkKKyAgICAgY2hhciAqcGFyYW07CisgICAgIHVuc2lnbmVkICp2YWxwOworeworICB1bnNpZ25lZCBvZmZzZXQgPSAwOworICB1bnNpZ25lZCB3aWR0aCA9IDA7CisgIGNoYXIgKnhwOworICBjaGFyICpzYXZlX3B0cjsKKworICB4cCA9IGdldF9iZjIgKHBhcmFtLCAnPCcpOworCisgIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKKyAgaWYgKCp4cCA9PSAwKQorICAgIHsKKyAgICAgIC8qIFdlIGRpZCBub3QgZmluZCAnPCcuICBXZSBoYXZlIGFuIG9mZnNldCAod2lkdGggaW1wbGljaXRseSAzMikuICAqLworICAgICAgcGFyYW0gPSBnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHBhcmFtLCAmb2Zmc2V0KTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOworICAgICAgaWYgKHBhcmFtID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKnhwKysgPSAwOwkJLyogT3ZlcndyaXRlIHRoZSAnPCcgKi8KKyAgICAgIHBhcmFtID0gZ2V0X2JmMiAoeHAsICc+Jyk7CisgICAgICBpZiAoKnBhcmFtID09IDApCisJcmV0dXJuIE5VTEw7CisgICAgICAqcGFyYW0rKyA9IDA7CQkvKiBPdmVyd3JpdGUgdGhlICc+JyAqLworCisgICAgICB3aWR0aCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgICAgeHAgPSBnZXRfYmZfb2Zmc2V0X2V4cHJlc3Npb24gKHhwLCAmb2Zmc2V0KTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOworCisgICAgICBpZiAoeHAgKyAxICE9IHBhcmFtKQorCXJldHVybiBOVUxMOworICAgIH0KKworICAqdmFscCA9ICgod2lkdGggJSAzMikgPDwgNSkgfCAob2Zmc2V0ICUgMzIpOworCisgIHJldHVybiBwYXJhbTsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X2NyIChwYXJhbSwgcmVnbm9wKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgdW5zaWduZWQgKnJlZ25vcDsKK3sKKyAgdW5zaWduZWQgcmVnbm87CisgIHVuc2lnbmVkIGM7CisKKyAgaWYgKCFzdHJuY21wIChwYXJhbSwgImNyIiwgMikpCisgICAgeworICAgICAgcGFyYW0gKz0gMjsKKworICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKKyAgICAgIGlmIChyZWdubyA8IDEwKQorCXsKKwkgIGlmIChyZWdubyA9PSAwKQorCSAgICB7CisJICAgICAgKnJlZ25vcCA9IDA7CisJICAgICAgcmV0dXJuIHBhcmFtOworCSAgICB9CisJICBjID0gKnBhcmFtIC0gJzAnOworCSAgaWYgKGMgPCAxMCkKKwkgICAgeworCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7CisJICAgICAgaWYgKGMgPCA2NCkKKwkJeworCQkgICpyZWdub3AgPSByZWdubzsKKwkJICByZXR1cm4gcGFyYW0gKyAxOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpyZWdub3AgPSByZWdubzsKKwkgICAgICByZXR1cm4gcGFyYW07CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY3JfcmVncywgcmVnbm9wKTsKKworICByZXR1cm4gcGFyYW07Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF9mY3IgKHBhcmFtLCByZWdub3ApCisgICAgIGNoYXIgKnBhcmFtOworICAgICB1bnNpZ25lZCAqcmVnbm9wOworeworICB1bnNpZ25lZCByZWdubzsKKyAgdW5zaWduZWQgYzsKKworICBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiZmNyIiwgMykpCisgICAgeworICAgICAgcGFyYW0gKz0gMzsKKworICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKKyAgICAgIGlmIChyZWdubyA8IDEwKQorCXsKKwkgIGlmIChyZWdubyA9PSAwKQorCSAgICB7CisJICAgICAgKnJlZ25vcCA9IDA7CisJICAgICAgcmV0dXJuIHBhcmFtOworCSAgICB9CisJICBjID0gKnBhcmFtIC0gJzAnOworCSAgaWYgKGMgPCAxMCkKKwkgICAgeworCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7CisJICAgICAgaWYgKGMgPCA2NCkKKwkJeworCQkgICpyZWdub3AgPSByZWdubzsKKwkJICByZXR1cm4gcGFyYW0gKyAxOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpyZWdub3AgPSByZWdubzsKKwkgICAgICByZXR1cm4gcGFyYW07CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgZmNyX3JlZ3MsIHJlZ25vcCk7CisKKyAgcmV0dXJuIHBhcmFtOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfdmVjOSAocGFyYW0sIHZhbHApCisgICAgIGNoYXIgKnBhcmFtOworICAgICB1bnNpZ25lZCAqdmFscDsKK3sKKyAgdW5zaWduZWQgdmFsOworICBjaGFyICpzYXZlX3B0cjsKKworICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07CisgIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7CisKKyAgaWYgKHZhbCA+PSAxIDw8IDkpCisgICAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gOSBiaXRzIikpOworCisgICp2YWxwID0gdmFsICUgKDEgPDwgOSk7CisKKyAgcmV0dXJuIHBhcmFtOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfbzYgKHBhcmFtLCB2YWxwKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgdW5zaWduZWQgKnZhbHA7Cit7CisgIHVuc2lnbmVkIHZhbDsKKyAgY2hhciAqc2F2ZV9wdHI7CisKKyAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOworICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOworCisgIGlmICh2YWwgJiAweDMpCisgICAgYXNfd2FybiAoXygiUmVtb3ZlZCBsb3dlciAyIGJpdHMgb2YgZXhwcmVzc2lvbiIpKTsKKworICAqdmFscCA9IHZhbDsKKworICByZXR1cm4ocGFyYW0pOworfQorCisjZGVmaW5lIGhleHZhbCh6KSBcCisgIChpc2RpZ2l0ICh6KSA/ICh6KSAtICcwJyA6CQkJCQkJXAorICAgaXNsb3dlciAoeikgPyAoeikgLSAnYScgKyAxMCA6IAkJCQkJXAorICAgaXN1cHBlciAoeikgPyAoeikgLSAnQScgKyAxMCA6IC0xKQorCitzdGF0aWMgY2hhciAqCitnZXR2YWwgKHBhcmFtLCB2YWxwKQorICAgICBjaGFyICpwYXJhbTsKKyAgICAgdW5zaWduZWQgaW50ICp2YWxwOworeworICB1bnNpZ25lZCBpbnQgdmFsID0gMDsKKyAgdW5zaWduZWQgaW50IGM7CisKKyAgYyA9ICpwYXJhbSsrOworICBpZiAoYyA9PSAnMCcpCisgICAgeworICAgICAgYyA9ICpwYXJhbSsrOworICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKQorCXsKKwkgIGMgPSAqcGFyYW0rKzsKKwkgIGMgPSBoZXh2YWwgKGMpOworCSAgd2hpbGUgKGMgPCAxNikKKwkgICAgeworCSAgICAgIHZhbCA9IHZhbCAqIDE2ICsgYzsKKwkgICAgICBjID0gKnBhcmFtKys7CisJICAgICAgYyA9IGhleHZhbCAoYyk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgYyAtPSAnMCc7CisJICB3aGlsZSAoYyA8IDgpCisJICAgIHsKKwkgICAgICB2YWwgPSB2YWwgKiA4ICsgYzsKKwkgICAgICBjID0gKnBhcmFtKysgLSAnMCc7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYyAtPSAnMCc7CisgICAgICB3aGlsZSAoYyA8IDEwKQorCXsKKwkgIHZhbCA9IHZhbCAqIDEwICsgYzsKKwkgIGMgPSAqcGFyYW0rKyAtICcwJzsKKwl9CisgICAgfQorCisgICp2YWxwID0gdmFsOworICByZXR1cm4gcGFyYW0gLSAxOworfQorCit2b2lkCittZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG5ieXRlcyk7Cit9CisKKyNpZiAwCisKKy8qIFRoaXMgcm91dGluZSBpcyBuZXZlciBjYWxsZWQuICBXaGF0IGlzIGl0IGZvcj8KKyAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCisKK3ZvaWQKK21kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuYnl0ZXMsIGZpeFAsIHNlZ190eXBlKQorICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgIGludCBuYnl0ZXM7CisgICAgIGZpeFMgKmZpeFA7CisgICAgIGludCBzZWdfdHlwZTsKK3sKKyAgaWYgKHNlZ190eXBlICE9IE5fVEVYVCB8fCBmaXhQLT5meF9yX3R5cGUgPT0gTk9fUkVMT0MpCisgICAgeworICAgICAgc3dpdGNoIChuYnl0ZXMpCisJeworCWNhc2UgNDoKKwkgICpidWYrKyA9IHZhbCA+PiAyNDsKKwkgICpidWYrKyA9IHZhbCA+PiAxNjsKKwljYXNlIDI6CisJICAqYnVmKysgPSB2YWwgPj4gODsKKwljYXNlIDE6CisJICAqYnVmID0gdmFsOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBSRUxPQ19JVzE2OgorICAgICAgYnVmWzJdID0gdmFsID4+IDg7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfTE8xNjoKKyAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OworICAgICAgYnVmWzFdID0gdmFsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFTE9DX0hJMTY6CisgICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7CisgICAgICBidWZbMV0gPSB2YWwgPj4gMTY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfUEMxNjoKKyAgICAgIHZhbCArPSA0OworICAgICAgYnVmWzBdID0gdmFsID4+IDEwOworICAgICAgYnVmWzFdID0gdmFsID4+IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfUEMyNjoKKyAgICAgIHZhbCArPSA0OworICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjYpICYgMHgwMzsKKyAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxODsKKyAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxMDsKKyAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFTE9DXzMyOgorICAgICAgYnVmWzBdID0gdmFsID4+IDI0OworICAgICAgYnVmWzFdID0gdmFsID4+IDE2OworICAgICAgYnVmWzJdID0gdmFsID4+IDg7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19mYXRhbCAoXygiQmFkIHJlbG9jYXRpb24gdHlwZSIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworI2VuZGlmIC8qIDAgKi8KKwordm9pZAorbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuYnl0ZXMpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IHZhbDsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19kaXNwIG5vdCBkZWZpbmVkIikpOworICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuYnl0ZXMpOworfQorCit2b2lkCittZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBuYnl0ZXMpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IHZhbDsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgYXNfZmF0YWwgKF8oIm1kX251bWJlcl90b19maWVsZCBub3QgZGVmaW5lZCIpKTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKTsKK30KKworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKKy8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCisgICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCisgICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KKyAqLworY2hhciAqCittZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKKyAgICAgY2hhciB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7CisgIGNoYXIgKnQ7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdTJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICBjYXNlICdyJzoKKyAgICBjYXNlICdSJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd4JzoKKyAgICBjYXNlICdYJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdwJzoKKyAgICBjYXNlICdQJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKnNpemVQID0gMDsKKyAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKKyAgICB9CisgIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOworICBpZiAodCkKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OworCisgICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKyAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKworaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDQ7CisKK3ZvaWQKK21kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQorICAgICBjaGFyICpwdHI7CisgICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKKyAgICAgZnJhZ1MgKmZyYWc7CisgICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKK3sKKyAgcHRyWzBdID0gKGNoYXIpIDB4YzA7CisgIHB0clsxXSA9IDB4MDA7CisgIHB0clsyXSA9IDB4MDA7CisgIHB0clszXSA9IDB4MDA7CisgIGZpeF9uZXcgKGZyYWcsCisJICAgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwKKwkgICA0LAorCSAgIHRvX3N5bWJvbCwKKwkgICAob2Zmc2V0VCkgMCwKKwkgICAwLAorCSAgIFJFTE9DX1BDMjYpOwkJLyogQm90Y2g6IFNob3VsZG4ndCB0aGlzIGJlIFJFTE9DX1BDMTY/ICovCit9CisKK2ludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDQ7CisKK3ZvaWQKK21kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOworICAgICBmcmFnUyAqZnJhZzsKKyAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOworeworICBwdHJbMF0gPSAoY2hhcikgMHhjMDsKKyAgcHRyWzFdID0gMHgwMDsKKyAgcHRyWzJdID0gMHgwMDsKKyAgcHRyWzNdID0gMHgwMDsKKyAgZml4X25ldyAoZnJhZywKKwkgICBwdHIgLSBmcmFnLT5mcl9saXRlcmFsLAorCSAgIDQsCisJICAgdG9fc3ltYm9sLAorCSAgIChvZmZzZXRUKSAwLAorCSAgIDAsCisJICAgUkVMT0NfUEMyNik7Cit9CisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCisgICAgIGZyYWdTICpmcmFnUDsKKyAgICAgc2VnVCBzZWdtZW50X3R5cGU7Cit7CisgIGFzX2ZhdGFsIChfKCJSZWxheGF0aW9uIHNob3VsZCBuZXZlciBvY2N1ciIpKTsKKyAgcmV0dXJuICgtMSk7Cit9CisKKyNpZiAwCisKKy8qIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGlzIHJvdXRpbmUgaXMgbmV2ZXIgY2FsbGVkLiAgV2hhdCBpcyBpdAorICAgZG9pbmcgaGVyZT8KKyAgIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0IDEzIEp1bCAxOTkzICovCisKKworLyoKKyAqIFJpc2MgcmVsb2NhdGlvbnMgYXJlIGNvbXBsZXRlbHkgZGlmZmVyZW50LCBzbyBpdCBuZWVkcworICogdGhpcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lIHRvIGVtaXQgdGhlbS4KKyAqLwordm9pZAorZW1pdF9yZWxvY2F0aW9ucyAoZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCisgICAgIGZpeFMgKmZpeFA7CisgICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOworeworICBzdHJ1Y3QgcmVsb2NfaW5mb19tODhrIHJpOworICBzeW1ib2xTICpzeW1ib2xQOworICBleHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKKworICBiemVybyAoKGNoYXIgKikgJnJpLCBzaXplb2YgKHJpKSk7CisgIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICBpZiAoZml4UC0+Znhfcl90eXBlID49IE5PX1JFTE9DKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgImZpeFAtPmZ4X3JfdHlwZSA9ICVkXG4iLCBmaXhQLT5meF9yX3R5cGUpOworCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBpZiAoKHN5bWJvbFAgPSBmaXhQLT5meF9hZGRzeSkgIT0gTlVMTCkKKwl7CisJICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsKKwkgICAgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKKwkgIGlmICgoc3ltYm9sUC0+c3lfdHlwZSAmIE5fVFlQRSkgPT0gTl9VTkRGKQorCSAgICB7CisJICAgICAgcmkucl9leHRlcm4gPSAxOworCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfbnVtYmVyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICByaS5yX2V4dGVybiA9IDA7CisJICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV90eXBlICYgTl9UWVBFOworCSAgICB9CisJICBpZiAoc3ltYm9sUCAmJiBzeW1ib2xQLT5zeV9mcmFnKQorCSAgICB7CisJICAgICAgcmkucl9hZGRlbmQgPSBzeW1ib2xQLT5zeV9mcmFnLT5mcl9hZGRyZXNzOworCSAgICB9CisJICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7CisJICBpZiAoZml4UC0+ZnhfcGNyZWwpCisJICAgIHsKKwkgICAgICByaS5yX2FkZGVuZCAtPSByaS5yX2FkZHJlc3M7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJpLnJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOworCSAgICB9CisKKwkgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOworCX0KKyAgICB9Cit9CisKKyNlbmRpZiAvKiAwICovCisKKyNpZiAwCisKKy8qIFRoaXMgcm91dGluZSBjYW4gYmUgc3Vic3VtZWQgYnkgc19sY29tbSBpbiByZWFkLmMuCisgICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLworCisKK3N0YXRpYyB2b2lkCitzX2JzcyAoKQoreworICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGNoYXIgKnA7CisgIGludCB0ZW1wLCBic3NfYWxpZ247CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqcCA9IGM7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCisgICAgeworICAgICAgYXNfd2FybiAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgKnAgPSAwOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICpwID0gYzsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgYnNzX2FsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgfQorICBlbHNlCisgICAgYnNzX2FsaWduID0gMDsKKworICBpZiAoIVNfSVNfREVGSU5FRChzeW1ib2xQKQorICAgICAgfHwgU19HRVRfU0VHTUVOVChzeW1ib2xQKSA9PSBTRUdfQlNTKQorICAgIHsKKyAgICAgIGlmICghIG5lZWRfcGFzc18yKQorCXsKKwkgIGNoYXIgKnA7CisJICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKKwkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOworCisJICBzdWJzZWdfc2V0IChTRUdfQlNTLCAxKTsgLyogc3dpdGNoIHRvIGJzcwkqLworCisJICBpZiAoYnNzX2FsaWduKQorCSAgICBmcmFnX2FsaWduIChic3NfYWxpZ24sIDAsIDApOworCisJICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLworCSAgaWYgKHN5bWJvbFAtPnN5X3R5cGUgPT0gTl9CU1MgJiYgc3ltYm9sUC0+c3lfZnJhZyAhPSBOVUxMKQorCSAgICBzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSBOVUxMOworCisJICBzeW1ib2xQLT5zeV9mcmFnICA9IGZyYWdfbm93OworCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKKwkJCShvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKTApOworCSAgKnAgPSAwOworCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX0JTUyk7CisKKwkgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCAlcy4iKSwgbmFtZSk7CisgICAgfQorCisgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKmlucHV0X2xpbmVfcG9pbnRlcl0pCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgfQorfQorCisjZW5kaWYgLyogMCAqLworCisjaWZkZWYgTTg4S0NPRkYKKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBuZWVkZWQgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aCBvYmotY29mZmJmZC5jLgorICAgVGhhdCBmaWxlIG1heSBiZSByZXBsYWNlZCBieSBhIG1vcmUgQkZEIG9yaWVudGVkIHZlcnNpb24gYXQgc29tZQorICAgcG9pbnQuICBJZiB0aGF0IGhhcHBlbnMsIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcmV4YW1pbmVkLgorCisgICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgMTMgSnVseSAxOTkzLiAgKi8KKworLyogR2l2ZW4gYSBmaXhTIHN0cnVjdHVyZSAoY3JlYXRlZCBieSBhIGNhbGwgdG8gZml4X25ldywgYWJvdmUpLAorICAgcmV0dXJuIHRoZSBCRkQgcmVsb2NhdGlvbiB0eXBlIHRvIHVzZSBmb3IgaXQuICAqLworCitzaG9ydAordGNfY29mZl9maXgycnR5cGUgKGZpeHApCisgICAgIGZpeFMgKmZpeHA7Cit7CisgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJFTE9DX0xPMTY6CisgICAgICByZXR1cm4gUl9MVlJUMTY7CisgICAgY2FzZSBSRUxPQ19ISTE2OgorICAgICAgcmV0dXJuIFJfSFZSVDE2OworICAgIGNhc2UgUkVMT0NfUEMxNjoKKyAgICAgIHJldHVybiBSX1BDUjE2TDsKKyAgICBjYXNlIFJFTE9DX1BDMjY6CisgICAgICByZXR1cm4gUl9QQ1IyNkw7CisgICAgY2FzZSBSRUxPQ18zMjoKKyAgICAgIHJldHVybiBSX1ZSVDMyOworICAgIGNhc2UgUkVMT0NfSVcxNjoKKyAgICAgIHJldHVybiBSX1ZSVDE2OworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEFwcGx5IGEgZml4UyB0byB0aGUgb2JqZWN0IGZpbGUuICBTaW5jZSBDT0ZGIGRvZXMgbm90IHVzZSBhZGRlbmRzCisgICBpbiByZWxvY3MsIHRoZSBhZGRlbmQgaXMgYWN0dWFsbHkgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBvYmplY3QKKyAgIGZpbGUgaXRzZWxmLiAgKi8KKwordm9pZAorbWRfYXBwbHlfZml4IChmaXhwLCB2YWwpCisgICAgIGZpeFMgKmZpeHA7CisgICAgIGxvbmcgdmFsOworeworICBjaGFyICpidWY7CisKKyAgYnVmID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOworICBmaXhwLT5meF9vZmZzZXQgPSAwOworCisgIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQorICAgIHsKKyAgICBjYXNlIFJFTE9DX0lXMTY6CisgICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7CisgICAgICBidWZbMl0gPSB2YWwgPj4gODsKKyAgICAgIGJ1ZlszXSA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19MTzE2OgorICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OworICAgICAgYnVmWzBdID0gdmFsID4+IDg7CisgICAgICBidWZbMV0gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVMT0NfSEkxNjoKKyAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKKyAgICAgIGJ1ZlswXSA9IHZhbCA+PiA4OworICAgICAgYnVmWzFdID0gdmFsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFTE9DX1BDMTY6CisgICAgICBidWZbMF0gPSB2YWwgPj4gMTA7CisgICAgICBidWZbMV0gPSB2YWwgPj4gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUxPQ19QQzI2OgorICAgICAgYnVmWzBdIHw9ICh2YWwgPj4gMjYpICYgMHgwMzsKKyAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxODsKKyAgICAgIGJ1ZlsyXSA9IHZhbCA+PiAxMDsKKyAgICAgIGJ1ZlszXSA9IHZhbCA+PiAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFTE9DXzMyOgorICAgICAgYnVmWzBdID0gdmFsID4+IDI0OworICAgICAgYnVmWzFdID0gdmFsID4+IDE2OworICAgICAgYnVmWzJdID0gdmFsID4+IDg7CisgICAgICBidWZbM10gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFdoZXJlIGEgUEMgcmVsYXRpdmUgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgZnJvbS4gIE9uIHRoZSBtODhrIHRoZXkKKyAgIGFyZSBjYWxjdWxhdGVkIGZyb20ganVzdCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhwKQorICAgICBmaXhTICpmaXhwOworeworICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBSRUxPQ19QQzE2OgorICAgICAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZSAtIDI7CisgICAgY2FzZSBSRUxPQ19QQzI2OgorICAgICAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICAvKk5PVFJFQUNIRUQqLworfQorCisvKiBXaGVuIHdlIGFsaWduIHRoZSAuaW5pdCBzZWN0aW9uLCBpbnNlcnQgdGhlIGNvcnJlY3QgTk9QIHBhdHRlcm4uICAqLworCitpbnQKK204OGtfZG9fYWxpZ24gKG4sIGZpbGwsIG1heCwgbGVuKQorICAgICBpbnQgbjsKKyAgICAgY29uc3QgY2hhciAqZmlsbDsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IG1heDsKK3sKKyAgaWYgKGZpbGwgPT0gTlVMTAorICAgICAgJiYgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5pbml0IikgPT0gMCkKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBub3BfcGF0dGVybltdID0geyAweGY0LCAweDAwLCAweDU4LCAweDAwIH07CisgICAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcF9wYXR0ZXJuLCBzaXplb2YgKG5vcF9wYXR0ZXJuKSwgbWF4KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBNODhLQ09GRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tODhrLmggYi9nYXMvY29uZmlnL3RjLW04OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjZiNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIG04OGsuaCAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAorICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5CisgICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQ19NODhLCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQorCisjaWZkZWYgTTg4S0NPRkYKKyNkZWZpbmUgQ09GRl9NQUdJQyBNQzg4T01BR0lDCisjZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX204OGsKKyNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXCisjZW5kaWYKKworI2RlZmluZSBORUVEX0ZYX1JfVFlQRQorI2RlZmluZSBUQ19LRUVQX0ZYX09GRlNFVAorI2RlZmluZSBUQ19DT05TX1JFTE9DIFJFTE9DXzMyCisKKy8qIGRpZmZlcmVudCB0eXBlIG9mIHJlbG9jYXRpb24gYXZhaWxhYmxlIGluIHRoZSBtODhrICovCisKK2VudW0gcmVsb2NfdHlwZQoreworICBSRUxPQ19MTzE2LAkJCS8qIGxvMTYoc3ltKSAqLworICBSRUxPQ19ISTE2LAkJCS8qIGhpMTYoc3ltKSAqLworICBSRUxPQ19QQzE2LAkJCS8qIGJiMCwgYmIxLCBiY25kICovCisgIFJFTE9DX1BDMjYsCQkJLyogYnIsIGJzciAqLworICBSRUxPQ18zMiwJCQkvKiBqdW1wIHRhYmxlcywgZXRjICovCisgIFJFTE9DX0lXMTYsCQkJLyogZ2xvYmFsIGFjY2VzcyB0aHJvdWdoIGxpbmtlciByZWdzIDI4ICovCisgIE5PX1JFTE9DCit9OworCitzdHJ1Y3QgcmVsb2NfaW5mb19tODhrCit7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJfYWRkcmVzczsKKyAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OworICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKKyAgdW5zaWduZWQgaW50IHJfcGFkOjM7CisgIGVudW0gcmVsb2NfdHlwZSByX3R5cGU6NDsKKyAgbG9uZyBpbnQgcl9hZGRlbmQ7Cit9OworCisjZGVmaW5lIHJlbG9jYXRpb25faW5mbyByZWxvY19pbmZvX204OGsKKworLyogVGhlIG04OGsgdXNlcyAnQCcgdG8gc3RhcnQgbG9jYWwgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTEVYX0FUIChMRVhfQkVHSU5fTkFNRSB8IExFWF9OQU1FKQorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAorICAoKG5hbWVbMF0gPT0nQCcgJiYgKG5hbWUgWzFdID09ICdMJyB8fCBuYW1lIFsxXSA9PSAnLicpKSBcCisgICB8fCAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnMCcgJiYgbmFtZVsyXSA9PSAnXDAwMScpKQorI2VuZGlmCisKKy8qIFRoZSBtODhrIHVzZXMgcHNldWRvLW9wcyB3aXRoIG5vIGxlYWRpbmcgcGVyaW9kLiAgKi8KKyNkZWZpbmUgTk9fUFNFVURPX0RPVAorCisvKiBEb24ndCB3YXJuIG9uIHdvcmQgb3ZlcmZsb3c7IGl0IGhhcHBlbnMgb24gJWhpIHJlbG9jcy4gICovCisjdW5kZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAorCisjZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLHMsZikJCXthc19mYXRhbCAoXygibTg4ayBjb252ZXJ0X2ZyYWdcbiIpKTt9CisKKy8qIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLworI2RlZmluZSBtZF91bmRlZmluZWRfc3ltYm9sKHMpIDAKKworLyogV2UgaGF2ZSBubyBzcGVjaWFsIG9wZXJhbmQgaGFuZGxpbmcuICAqLworI2RlZmluZSBtZF9vcGVyYW5kKGUpCisKKyNpZmRlZiBNODhLQ09GRgorCisvKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCisjZGVmaW5lIFRDX0NPVU5UX1JFTE9DKGZpeHApICgoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwpCisKKy8qIEdldCB0aGUgQkZEIHJlbG9jIHR5cGUgdG8gdXNlIGZvciBhIGdhcyBmaXhTIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeHApIHRjX2NvZmZfZml4MnJ0eXBlIChmaXhwKQorCisvKiBObyBzcGVjaWFsIGhvb2sgbmVlZGVkIGZvciBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKHMpCisKKy8qIEFsaWduIHNlY3Rpb25zIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpCSgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCW1heCAoc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgKFNFRyldLCA0KQorCisvKiBXZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wCisgICBwYXR0ZXJuIGluIC5pbml0LiAgKi8KK2V4dGVybiBpbnQgbTg4a19kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKKyNkZWZpbmUgbWRfZG9fYWxpZ24obixmaWxsLGxlbixtYXgsbCkgaWYgKG04OGtfZG9fYWxpZ24obixmaWxsLG1heCxsZW4pKSBnb3RvIGwKKworI2VuZGlmIC8qIE04OEtDT0ZGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1jb3JlLmMgYi9nYXMvY29uZmlnL3RjLW1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ODQzNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtbWNvcmUuYwpAQCAtMCwwICsxLDIxODMgQEAKKy8qIHRjLW1jb3JlLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgTSpDb3JlCisKKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk0LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjZGVmaW5lIERFRklORV9UQUJMRQorI2luY2x1ZGUgIi4uL29wY29kZXMvbWNvcmUtb3BjLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIE9CSl9FTEYKKyNpbmNsdWRlICJlbGYvbWNvcmUuaCIKKyNlbmRpZgorCisjaWZuZGVmIHN0cmVxCisjZGVmaW5lIHN0cmVxKGEsYikgKHN0cmNtcCAoYSwgYikgPT0gMCkKKyNlbmRpZgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLworc3RhdGljIHZvaWQgICBtY29yZV9zX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgICBtY29yZV9jb25zIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgICBtY29yZV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgICBtY29yZV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBpbnQgICAgbG9nMiBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKK3N0YXRpYyBjaGFyICogcGFyc2VfcmVnIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOworc3RhdGljIGNoYXIgKiBwYXJzZV9jcmVnIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOworc3RhdGljIGNoYXIgKiBwYXJzZV9leHAgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqKSk7CitzdGF0aWMgdm9pZCAgIG1ha2VfbmFtZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgaW50KSk7CitzdGF0aWMgaW50ICAgIGVudGVyX2xpdGVyYWwgUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgaW50KSk7CitzdGF0aWMgY2hhciAqIHBhcnNlX3J0IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKiwgaW50LCBleHByZXNzaW9uUyAqKSk7CitzdGF0aWMgY2hhciAqIHBhcnNlX2ltbSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOworc3RhdGljIGNoYXIgKiBwYXJzZV9tZW0gUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCkpOworc3RhdGljIHZvaWQgICBkdW1wX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgICBjaGVja19saXRlcmFscyBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgICBtY29yZV9zX3RleHQgICAgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCAgIG1jb3JlX3NfZGF0YSAgICBQQVJBTVMgKChpbnQpKTsKKyNpZmRlZiBPQkpfRUxGCitzdGF0aWMgdm9pZCAgIG1jb3JlX3Nfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCisvKiBTZXZlcmFsIHBsYWNlcyBpbiB0aGlzIGZpbGUgaW5zZXJ0IHJhdyBpbnN0cnVjdGlvbnMgaW50byB0aGUKKyAgIG9iamVjdC4gVGhleSBzaG91bGQgdXNlIE1DT1JFX0lOU1RfWFhYIG1hY3JvcyB0byBnZXQgdGhlIG9wY29kZXMKKyAgIGFuZCB0aGVuIHVzZSB0aGVzZSB0d28gbWFjcm9zIHRvIGNyYWNrIHRoZSBNQ09SRV9JTlNUIHZhbHVlIGludG8KKyAgIHRoZSBhcHByb3ByaWF0ZSBieXRlIHZhbHVlcy4gICovCisjZGVmaW5lCUlOU1RfQllURTAoeCkJKCgoeCkgPj4gOCkgJiAweEZGKQorI2RlZmluZQlJTlNUX0JZVEUxKHgpCSgoeCkgJiAweEZGKQorCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjLyI7Citjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Citjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMvIjsKKworY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OworCitzdGF0aWMgaW50IHJlbGF4OwkJLyogc2V0IGlmIC1yZWxheCBzZWVuICovCitzdGF0aWMgaW50IGRvX2pzcmkyYnNyID0gMDsJLyogY2hhbmdlIGhlcmUgZnJvbSAxIGJ5IENydWVzcyAxOSBBdWd1c3QgOTcgKi8KK3N0YXRpYyBpbnQgc2lmaWx0ZXJfbW9kZSA9IDA7CisKK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLworLyogQXMgaW4gMGYxMi40NTYgKi8KKy8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7CisKKyNkZWZpbmUgQyh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKKyNkZWZpbmUgR0VUX1dIQVQoeCkgICAgKCh4ID4+IDIpKQorCisvKiBUaGVzZSBhcmUgdGhlIHR3byB0eXBlcyBvZiByZWxheGFibGUgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgQ09ORF9KVU1QICAxCisjZGVmaW5lIFVOQ0RfSlVNUCAgMgorCisjZGVmaW5lIFVOREVGX0RJU1AgICAgICAwCisjZGVmaW5lIENPTkQxMiAgICAgICAgICAxCisjZGVmaW5lIENPTkQzMiAgICAgICAgICAyCisjZGVmaW5lIFVOQ0QxMiAgICAgICAgICAxCisjZGVmaW5lIFVOQ0QzMiAgICAgICAgICAyCisjZGVmaW5lIFVOREVGX1dPUkRfRElTUCA0CisjZGVmaW5lIEVORCAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQzEyX0xFTgkgICAgICAgIDIKKyNkZWZpbmUgQzMyX0xFTgkgICAgICAgMTAJLyogYWxsb3cgZm9yIGFsaWduICovCisjZGVmaW5lIFUxMl9MRU4JICAgICAgICAyCisjZGVmaW5lIFUzMl9MRU4JICAgICAgICA4CS8qIGFsbG93IGZvciBhbGlnbiAqLworCisKKy8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlICovCitjb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KK3sKK3sgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDA6IHVudXNlZCAqLyAgCit7ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAxOiB1bnVzZWQgKi8gIAoreyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMjogdW51c2VkICovICAKK3sgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDM6IHVudXNlZCAqLyAgCit7ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA0OiB1bnVzZWQgKi8gIAoreyAyMDQ4LCAtMjA0NiwgQzEyX0xFTiwgQyhDT05EX0pVTVAsIENPTkQzMikgfSwJLyogNTogQyhDT05EX0pVTVAsIENPTkQxMikgKi8KK3sgICAgMCwgICAgIDAsIEMzMl9MRU4sIDAgfSwJCQkvKiA2OiBDKENPTkRfSlVNUCwgQ09ORDMyKSAqLworeyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogNzogdW51c2VkICovICAKK3sgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDg6IHVudXNlZCAqLyAgCit7IDIwNDgsIC0yMDQ2LCBVMTJfTEVOLCBDKFVOQ0RfSlVNUCwgVU5DRDMyKSB9LAkvKiA5OiBDKFVOQ0RfSlVNUCwgVU5DRDEyKSAqLworeyAgICAwLCAgICAgMCwgVTMyX0xFTiwgMCB9LAkJCS8qMTA6IEMoVU5DRF9KVU1QLCBVTkNEMzIpICovCit7ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKjExOiB1bnVzZWQgKi8gIAoreyAgICAwLCAgICAgMCwJICAgICAwLCAwIH0JCQkvKjEyOiB1bnVzZWQgKi8gIAorfTsKKworLyogTElURVJBTCBQT09MIERBVEEgU1RSVUNUVVJFUyAqLworc3RydWN0IGxpdGVyYWwKK3sKKyAgdW5zaWduZWQgc2hvcnQgIHJlZmNudDsKKyAgdW5zaWduZWQgY2hhcgkgIGlzcGNyZWw7CisgIHVuc2lnbmVkIGNoYXIJICB1bnVzZWQ7CisgIGV4cHJlc3Npb25TCSAgZTsKK307CisKKyNkZWZpbmUgTUFYX1BPT0xfU0laRQkoMTAyNC80KQorc3RhdGljIHN0cnVjdCBsaXRlcmFsIGxpdHBvb2wgW01BWF9QT09MX1NJWkVdOworc3RhdGljIHVuc2lnbmVkIHBvb2xzaXplOworc3RhdGljIHVuc2lnbmVkIHBvb2xudW1iZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwb29sc3BhbjsKKworLyogU1BBTlBBTklDOiB0aGUgcG9pbnQgYXQgd2hpY2ggd2UgZ2V0IHRvbyBzY2FyZWQgYW5kIGZvcmNlIGEgZHVtcAorICAgb2YgdGhlIGxpdGVyYWwgcG9vbCwgYW5kIHBlcmhhcHMgcHV0IGEgYnJhbmNoIGluIHBsYWNlLgorICAgQ2FsY3VsYXRlZCBhczoKKyAgCQkgMTAyNAlzcGFuIG9mIGxydy9qbXBpL2pzcmkgaW5zbiAoYWN0dWFsbHkgc3BhbisxKQorICAJCS0yCXBvc3NpYmxlIGFsaWdubWVudCBhdCB0aGUgaW5zbi4KKyAgCQktMglwb3NzaWJsZSBhbGlnbm1lbnQgdG8gZ2V0IHRoZSB0YWJsZSBhbGlnbmVkLgorICAJCS0yCWFuIGluc2VydGVkIGJyYW5jaCBhcm91bmQgdGhlIHRhYmxlLgorICAJICAgICA9PSAxMDE4CisgICBhdCAxMDE4LCB3ZSBtaWdodCBiZSBpbiB0cm91YmxlLgorICAgLS0gc28gd2UgaGF2ZSB0byBiZSBzbWFsbGVyIHRoYW4gMTAxOCBhbmQgc2luY2Ugd2UgZGVhbCB3aXRoIDItYnl0ZQorICAgaW5zdHJ1Y3Rpb25zLCB0aGUgbmV4dCBnb29kIGNob2ljZSBpcyAxMDE2LgorICAgLS0gTm90ZSB3ZSBoYXZlIGEgdGVzdCBjYXNlIHRoYXQgZmFpbHMgd2hlbiB3ZSd2ZSBnb3QgMTAxOCBoZXJlLiAgKi8KKyNkZWZpbmUgU1BBTlBBTklDCSgxMDE2KQkJLyogMTAyNCAtIDEgZW50cnkgLSAyIGJ5dGUgcm91bmRpbmcgKi8KKyNkZWZpbmUgU1BBTkNMT1NFCSg5MDApCisjZGVmaW5lIFNQQU5FWElUCSg2MDApCitzdGF0aWMgc3ltYm9sUyAqIHBvb2xzeW07CQkvKiBsYWJlbCBmb3IgY3VycmVudCBwb29sICovCitzdGF0aWMgY2hhciBwb29sbmFtZVs4XTsKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLworCisvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCisgICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgorICAgICBQc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAorICAgICBGdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKKyAgICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyAiZXhwb3J0IiwgICBzX2dsb2JsLCAgICAgICAgICAwIH0sCisgIHsgImltcG9ydCIsICAgc19pZ25vcmUsICAgICAgICAgMCB9LAorICB7ICJsaXRlcmFscyIsIG1jb3JlX3NfbGl0ZXJhbHMsIDAgfSwKKyAgeyAicGFnZSIsICAgICBsaXN0aW5nX2VqZWN0LCAgICAwIH0sCisgIHsgImJzcyIsICAgICAgc19sY29tbV9ieXRlcywgICAgMSB9LAorCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHRvIGludGVyY2VwdCB0aGUgcGxhY2VtZW50IG9mIGRhdGEgaW50byB0aGUgdGV4dAorICAgICBzZWN0aW9uIChlZyBhZGRyZXNzZXMgZm9yIGEgc3dpdGNoIHRhYmxlKSwgc28gdGhhdCB0aGUgc3BhY2UgdGhleQorICAgICBvY2N1cHkgY2FuIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgb3Igbm90IHRvCisgICAgIGR1bXAgdGhlIGN1cnJlbnQgbGl0ZXJhbCBwb29sLgorICAgICBYWFggLSBjdXJyZW50bHkgd2UgZG8gbm90IGNvcGUgd2l0aCB0aGUgLnNwYWNlIGFuZCAuZGNiLmQgZGlyZWN0aXZlcy4gICovCisgIHsgImFzY2lpIiwgICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDAgfSwKKyAgeyAiYXNjaXoiLCAgICBtY29yZV9zdHJpbmdlciwgICAgICAgMSB9LAorICB7ICJieXRlIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAxIH0sCisgIHsgImRjIiwgICAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKKyAgeyAiZGMuYiIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMSB9LAorICB7ICJkYy5kIiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdkJyB9LAorICB7ICJkYy5sIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCisgIHsgImRjLnMiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnIH0sCisgIHsgImRjLnciLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKKyAgeyAiZGMueCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAneCcgfSwKKyAgeyAiZG91YmxlIiwgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZCd9LAorICB7ICJmbG9hdCIsICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCisgIHsgImh3b3JkIiwgICAgbWNvcmVfY29ucywgICAgICAgICAgIDIgfSwKKyAgeyAiaW50IiwgICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAorICB7ICJsb25nIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICA0IH0sCisgIHsgIm9jdGEiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgMTYgfSwKKyAgeyAicXVhZCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgOCB9LAorICB7ICJzaG9ydCIsICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCisgIHsgInNpbmdsZSIsICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2YnfSwKKyAgeyAic3RyaW5nIiwgICBtY29yZV9zdHJpbmdlciwgICAgICAgMSB9LAorICB7ICJ3b3JkIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCisKKyAgLyogQWxsb3cgZm9yIHRoZSBlZmZlY3Qgb2Ygc2VjdGlvbiBjaGFuZ2VzLiAgKi8KKyAgeyAidGV4dCIsICAgICAgbWNvcmVfc190ZXh0LCAgICAwIH0sCisgIHsgImRhdGEiLCAgICAgIG1jb3JlX3NfZGF0YSwgICAgMCB9LAorICAKKyNpZmRlZiBPQkpfRUxGCisgIHsgInNlY3Rpb24iLCAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAorICB7ICJzZWN0aW9uLnMiLCBtY29yZV9zX3NlY3Rpb24sIDAgfSwKKyAgeyAic2VjdCIsICAgICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCisgIHsgInNlY3QucyIsICAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAorI2VuZGlmICAKKyAgeyAwLCAgICAgICAgICAwLCAgICAgICAgICAgICAgICAwIH0KK307CisKK3N0YXRpYyB2b2lkCittY29yZV9zX2xpdGVyYWxzIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGR1bXBfbGl0ZXJhbHMgKDApOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisKK3N0YXRpYyB2b2lkCittY29yZV9jb25zIChuYnl0ZXMpCisgICAgIGludCBuYnl0ZXM7Cit7CisgIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKKyAgICB7CisgICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaW50ICAgIGNvbW1hcyA9IDE7CisgICAgICAKKyAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCisJY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKKyAgICAgIAorICAgICAgcG9vbHNwYW4gKz0gbmJ5dGVzICogY29tbWFzOworICAgIH0KKyAgCisgIGNvbnMgKG5ieXRlcyk7CisKKyAgLyogSW4gdGhlb3J5IHdlIG91Z2h0IHRvIGNhbGwgY2hlY2tfbGl0ZXJhbHMgKDIsMCkgaGVyZSBpbiBjYXNlCisgICAgIHdlIG5lZWQgdG8gZHVtcCB0aGUgbGl0ZXJhbCB0YWJsZS4gIFdlIGNhbm5vdCBkbyB0aGlzIGhvd2V2ZXIsCisgICAgIGFzIHRoZSBkaXJlY3RpdmVzIHRoYXQgd2UgYXJlIGludGVyY2VwdGluZyBtYXkgYmUgYmVpbmcgdXNlZAorICAgICB0byBidWlsZCBhIHN3aXRjaCB0YWJsZSwgYW5kIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIGl0cworICAgICBjb250ZW50cy4gIEluc3RlYWQgd2UgY3Jvc3Mgb3VyIGZpbmdlcnMgYW5kIHByYXkuLi4gKi8KK30KKworc3RhdGljIHZvaWQKK21jb3JlX2Zsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCisgICAgIGludCBmbG9hdF90eXBlOworeworICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCisgICAgeworICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGludCAgICBjb21tYXMgPSAxOworCisjaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKKyNlcnJvciBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBub3QgaGFuZGxlZAorI2VuZGlmCisgICAgICAKKyAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCisJY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKKworICAgICAgLyogV2Ugd291bGQgbGlrZSB0byBjb21wdXRlICJoZXhfZmxvYXQgKGZsb2F0X3R5cGUpICogY29tbWFzIgorCSBidXQgaGV4X2Zsb2F0IGlzIG5vdCBleHBvcnRlZCBmcm9tIHJlYWQuYyAgKi8KKyAgICAgIGZsb2F0X3R5cGUgPT0gJ2YnID8gNCA6IChmbG9hdF90eXBlID09ICdkJyA/IDggOiAxMik7CisgICAgICBwb29sc3BhbiArPSBmbG9hdF90eXBlICogY29tbWFzOworICAgIH0KKworICBmbG9hdF9jb25zIChmbG9hdF90eXBlKTsKKyAgCisgIC8qIFNlZSB0aGUgY29tbWVudCBpbiBtY29yZV9jb25zICgpIGFib3V0IGNhbGxpbmcgY2hlY2tfbGl0ZXJhbHMuCisgICAgIEl0IGlzIHVubGlrZWx5IHRoYXQgYSBzd2l0Y2ggdGFibGUgd2lsbCBiZSBjb25zdHJ1Y3RlZCB1c2luZworICAgICBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIGJ1dCBpdCBpcyBzdGlsbCBsaWtlbHkgdGhhdCBhbiBpbmRleGVkCisgICAgIHRhYmxlIG9mIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpcyBiZWluZyBjcmVhdGVkIGJ5IHRoZXNlCisgICAgIGRpcmVjdGl2ZXMsIHNvIGFnYWluIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIHRoZWlyIHBsYWNlbWVudC4gICovCit9CisKK3N0YXRpYyB2b2lkCittY29yZV9zdHJpbmdlciAoYXBwZW5kX3plcm8pCisgICAgIGludCBhcHBlbmRfemVybzsKK3sKKyAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQorICAgIHsKKyAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICAKKyAgICAgIC8qIEluIHRoZW9yeSB3ZSBzaG91bGQgY29tcHV0ZSBob3cgbWFueSBieXRlcyBhcmUgZ29pbmcgdG8KKwkgYmUgb2NjdXBpZWQgYnkgdGhlIHN0cmluZyhzKSBhbmQgYWRkIHRoaXMgdG8gdGhlIHBvb2xzcGFuLgorCSBUbyBrZWVwIHRoaW5ncyBzaW1wbGUgaG93ZXZlciwgd2UganVzdCBhZGQgdGhlIG51bWJlciBvZgorCSBieXRlcyBsZWZ0IG9uIHRoZSBjdXJyZW50IGxpbmUuICBUaGlzIHdpbGwgYmUgYW4gb3Zlci0KKwkgZXN0aW1hdGUsIHdoaWNoIGlzIE9LLCBhbmQgYXV0b21hdGljYWxseSBhbGxvd3MgZm9yIHRoZQorCSBhcHBlbmRpbmcgYSB6ZXJvIGJ5dGUsIHNpbmNlIHRoZSByZWFsIHN0cmluZyhzKSBpcy9hcmUKKwkgcmVxdWlyZWQgdG8gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4gICovCisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZSBbKiBwdHJdKQorCXB0ciArKzsKKworICAgICAgcG9vbHNwYW4gKz0gcHRyIC0gaW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKyAgCisgIHN0cmluZ2VyIChhcHBlbmRfemVybyk7CisKKyAgLyogV2UgY2FsbCBjaGVja19saXRlcmFscyBoZXJlIGluIGNhc2UgYSBsYXJnZSBudW1iZXIgb2Ygc3RyaW5ncyBhcmUKKyAgICAgYmVpbmcgcGxhY2VkIGludG8gdGhlIHRleHQgc2VjdGlvbiB3aXRoIGEgc2VxdWVuY2Ugb2Ygc3RyaW5nZXIKKyAgICAgZGlyZWN0aXZlcy4gIEluIHRoZW9yeSB3ZSBjb3VsZCBiZSB1cHNldHRpbmcgc29tZXRoaW5nIGlmIHRoZXNlCisgICAgIHN0cmluZ3MgYXJlIGFjdHVhbGx5IGluIGFuIGluZGV4ZWQgdGFibGUgaW5zdGVhZCBvZiByZWZlcmVuY2VkIGJ5CisgICAgIGluZGl2aWR1YWwgbGFiZWxzLiAgTGV0IHVzIGhvcGUgdGhhdCB0aGF0IG5ldmVyIGhhcHBlbnMuICAqLworICBjaGVja19saXRlcmFscyAoMiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCittY29yZV9zX3RleHQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgZHVtcF9saXRlcmFscyAoMCk7CisgIAorICBzX3RleHQgKGlnbm9yZSk7Cit9CisKK3N0YXRpYyB2b2lkCittY29yZV9zX2RhdGEgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgZHVtcF9saXRlcmFscyAoMCk7CisgIAorICBzX2RhdGEgKGlnbm9yZSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAorICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMuICAqLwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7CisgIGNoYXIgKiBwcmV2X25hbWUgPSAiIjsKKworICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7CisKKyAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KKyAgZm9yIChvcGNvZGUgPSBtY29yZV90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUgKyspCisgICAgeworICAgICAgaWYgKHN0cmVxIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCisJeworCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCisJICAgICBzdHJpbmcuICAqLworCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7CisJICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVnX207CitzdGF0aWMgaW50IHJlZ19uOworc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLworCisvKiBHZXQgYSBsb2cyKHZhbCkuICAqLworc3RhdGljIGludAorbG9nMiAodmFsKQorICAgIHVuc2lnbmVkIGludCB2YWw7Cit7CisgICAgaW50IGxvZyA9IC0xOworICAgIHdoaWxlICh2YWwgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgbG9nICsrOworICAgICAgICB2YWwgPj49IDE7CisgICAgICB9CisgICAgCisgICAgcmV0dXJuIGxvZzsKK30KKworLyogVHJ5IHRvIHBhcnNlIGEgcmVnIG5hbWUuICAqLworc3RhdGljIGNoYXIgKgorcGFyc2VfcmVnIChzLCByZWcpCisgICAgIGNoYXIgKiBzOworICAgICB1bnNpZ25lZCAqIHJlZzsKK3sKKyAgLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KKyAgd2hpbGUgKGlzc3BhY2UgKCogcykpCisgICAgKysgczsKKyAgCisgIGlmICh0b2xvd2VyIChzWzBdKSA9PSAncicpCisgICAgeworICAgICAgaWYgKHNbMV0gPT0gJzEnICYmIHNbMl0gPj0gJzAnICYmIHNbMl0gPD0gJzUnKQorCXsKKwkgICpyZWcgPSAxMCArIHNbMl0gLSAnMCc7CisJICByZXR1cm4gcyArIDM7CisJfQorICAgICAgCisgICAgICBpZiAoc1sxXSA+PSAnMCcgJiYgc1sxXSA8PSAnOScpCisJeworCSAgKnJlZyA9IHNbMV0gLSAnMCc7CisJICByZXR1cm4gcyArIDI7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoICAgdG9sb3dlciAoc1swXSkgPT0gJ3MnCisJICAgJiYgdG9sb3dlciAoc1sxXSkgPT0gJ3AnCisJICAgJiYgKGlzc3BhY2UgKHNbMl0pIHx8IHNbMl0gPT0gJywnKSkKKyAgICB7CisgICAgICAqIHJlZyA9IDA7CisgICAgICByZXR1cm4gcyArIDI7CisgICAgfQorICAKKyAgYXNfYmFkIChfKCJyZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciKSwgcyk7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgc3RydWN0IENyZWdzCit7CisgIGNoYXIgKiBuYW1lOworICB1bnNpZ25lZCBpbnQgY3JudW07Cit9CitjcmVnc1tdID0KK3sKKyAgeyAicHNyIiwJIDB9LAorICB7ICJ2YnIiLAkgMX0sCisgIHsgImVwc3IiLAkgMn0sCisgIHsgImZwc3IiLAkgM30sCisgIHsgImVwYyIsCSA0fSwKKyAgeyAiZnBjIiwJIDV9LAorICB7ICJzczAiLAkgNn0sCisgIHsgInNzMSIsCSA3fSwKKyAgeyAic3MyIiwJIDh9LAorICB7ICJzczMiLAkgOX0sCisgIHsgInNzNCIsCTEwfSwKKyAgeyAiZ2NyIiwJMTF9LAorICB7ICJnc3IiLAkxMn0sCisgIHsgIiIsCQkgMH0KK307CisKK3N0YXRpYyBjaGFyICoKK3BhcnNlX2NyZWcgKHMsIHJlZykKKyAgICAgY2hhciAqIHM7CisgICAgIHVuc2lnbmVkICogcmVnOworeworICBpbnQgaTsKKworICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLworICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKKyAgICArK3M7CisgIAorICBpZiAoKHRvbG93ZXIgKHNbMF0pID09ICdjJyAmJiB0b2xvd2VyIChzWzFdKSA9PSAncicpKQorICAgIHsKKyAgICAgIGlmIChzWzJdID09ICczJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICcxJykKKwl7CisJICAqcmVnID0gMzAgKyBzWzNdIC0gJzAnOworCSAgcmV0dXJuIHMgKyA0OworCX0KKyAgICAgIAorICAgICAgaWYgKHNbMl0gPT0gJzInICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzknKQorCXsKKwkgICpyZWcgPSAyMCArIHNbM10gLSAnMCc7CisJICByZXR1cm4gcyArIDQ7CisJfQorICAgICAgCisgICAgICBpZiAoc1syXSA9PSAnMScgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnOScpCisJeworCSAgKnJlZyA9IDEwICsgc1szXSAtICcwJzsKKwkgIHJldHVybiBzICsgNDsKKwl9CisgICAgICAKKyAgICAgIGlmIChzWzJdID49ICcwJyAmJiBzWzJdIDw9ICc5JykKKwl7CisJICAqcmVnID0gc1syXSAtICcwJzsKKwkgIHJldHVybiBzICsgMzsKKwl9CisgICAgfQorICAKKyAgLyogTG9vayBhdCBhbHRlcm5hdGUgY3JlZyBuYW1lcyBiZWZvcmUgZ2l2aW5nIGVycm9yLiAgKi8KKyAgZm9yIChpID0gMDsgY3JlZ3NbaV0ubmFtZVswXSAhPSAnXDAnOyBpKyspCisgICAgeworICAgICAgY2hhciBidWYgWzEwXTsKKyAgICAgIGludCAgbGVuZ3RoOworICAgICAgaW50ICBqOworICAgICAgCisgICAgICBsZW5ndGggPSBzdHJsZW4gKGNyZWdzW2ldLm5hbWUpOworICAgICAgCisgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCisJYnVmW2pdID0gdG9sb3dlciAoc1tqXSk7CisgICAgICAKKyAgICAgIGlmIChzdHJuY21wIChjcmVnc1tpXS5uYW1lLCBidWYsIGxlbmd0aCkgPT0gMCkKKwl7CisJICAqcmVnID0gY3JlZ3NbaV0uY3JudW07CisJICByZXR1cm4gcyArIGxlbmd0aDsKKwl9CisgICAgfQorICAKKyAgYXNfYmFkIChfKCJjb250cm9sIHJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIpLCBzKTsKKyAgCisgIHJldHVybiBzOworfQorCitzdGF0aWMgY2hhciAqCitwYXJzZV9leHAgKHMsIGUpCisgICAgIGNoYXIgKiBzOworICAgICBleHByZXNzaW9uUyAqIGU7Cit7CisgIGNoYXIgKiBzYXZlOworICBjaGFyICogbmV3OworCisgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisgIHdoaWxlIChpc3NwYWNlICgqIHMpKQorICAgICsrIHM7CisgIAorICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOworCisgIGV4cHJlc3Npb24gKGUpOworICAKKyAgaWYgKGUtPlhfb3AgPT0gT19hYnNlbnQpCisgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisgIAorICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7CisgIAorICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZAorbWFrZV9uYW1lIChzLCBwLCBuKQorICAgICBjaGFyICogczsKKyAgICAgY2hhciAqIHA7CisgICAgIGludCBuOworeworICBzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworICBzWzBdID0gcFswXTsKKyAgc1sxXSA9IHBbMV07CisgIHNbMl0gPSBwWzJdOworICBzWzNdID0gaGV4WyhuID4+IDEyKSAmIDB4Rl07CisgIHNbNF0gPSBoZXhbKG4gPj4gIDgpICYgMHhGXTsKKyAgc1s1XSA9IGhleFsobiA+PiAgNCkgJiAweEZdOworICBzWzZdID0gaGV4WyhuKSAgICAgICAmIDB4Rl07CisgIHNbN10gPSAwOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9saXRlcmFscyAoaXNmb3JjZSkKKyAgICAgaW50IGlzZm9yY2U7Cit7CisgIGludCBpOworICBzdHJ1Y3QgbGl0ZXJhbCAqIHA7CisgIHN0cnVjdCBzeW1ib2wgKiBicmFyc3ltOworICAKKyAgaWYgKHBvb2xzaXplID09IDApCisgICAgcmV0dXJuOworCisgIC8qIE11c3Qgd2UgYnJhbmNoIGFyb3VuZCB0aGUgbGl0ZXJhbCB0YWJsZT8gKi8KKyAgaWYgKGlzZm9yY2UpCisgICAgeworICAgICAgY2hhciAqIG91dHB1dDsKKyAgICAgIGNoYXIgYnJhcm5hbWVbOF07CisgICAgICAKKyAgICAgIG1ha2VfbmFtZSAoYnJhcm5hbWUsICIuWVAuIiwgcG9vbG51bWJlcik7CisgICAgICAKKyAgICAgIGJyYXJzeW0gPSBzeW1ib2xfbWFrZSAoYnJhcm5hbWUpOworICAgICAgCisgICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChicmFyc3ltKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAorCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aCwKKwkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGgsCisJCQkgQyAoVU5DRF9KVU1QLCAwKSwgYnJhcnN5bSwgMCwgMCk7CisgICAgICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0JSKTsJLyogYnIgLit4eHggKi8KKyAgICAgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKE1DT1JFX0lOU1RfQlIpOworICAgIH0KKyAgICAgIAorICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCBhbmQgdGhhdAorICAgICB0aGUgbGl0ZXJhbCB0YWJsZSBpcyBhbGlnbmVkIHdpdGhpbiBpdC4gICovCisgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOworICBmcmFnX2FsaWduICgyLCAwLCAwKTsKKyAgCisgIGNvbG9uIChTX0dFVF9OQU1FIChwb29sc3ltKSk7CisgIAorICBmb3IgKGkgPSAwLCBwID0gbGl0cG9vbDsgaSA8IHBvb2xzaXplOyBpKyssIHArKykKKyAgICBlbWl0X2V4cHIgKCYgcC0+ZSwgNCk7CisgIAorICBpZiAoaXNmb3JjZSkKKyAgICBjb2xvbiAoU19HRVRfTkFNRSAoYnJhcnN5bSkpOworICAKKyAgIHBvb2xzaXplID0gMDsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2xpdGVyYWxzIChraW5kLCBvZmZzZXQpCisgICAgIGludCBraW5kOworICAgICBpbnQgb2Zmc2V0OworeworICBwb29sc3BhbiArPSBvZmZzZXQ7CisgICAgCisgIC8qIFNQQU5DTE9TRSBhbmQgU1BBTkVYSVQgYXJlIHNtYWxsZXIgbnVtYmVycyB0aGFuIFNQQU5QQU5JQy4KKyAgICAgU1BBTlBBTklDIG1lYW5zIHRoYXQgd2UgbXVzdCBkdW1wIG5vdy4KKyAgICAga2luZCA9PSAwIGlzIGFueSBvbGQgaW5zdHJ1Y3Rpb24uCisgICAgIGtpbmQgID4gMCBtZWFucyB3ZSBqdXN0IGhhZCBhIGNvbnRyb2wgdHJhbnNmZXIgaW5zdHJ1Y3Rpb24uCisgICAgIGtpbmQgPT0gMSBtZWFucyB3aXRoaW4gYSBmdW5jdGlvbgorICAgICBraW5kID09IDIgbWVhbnMgd2UganVzdCBsZWZ0IGEgZnVuY3Rpb24KKyAgICAKKyAgICAgVGhlIGR1bXBfbGl0ZXJhbHMgKDEpIGNhbGwgaW5zZXJ0cyBhIGJyYW5jaCBhcm91bmQgdGhlIHRhYmxlLCBzbworICAgICB3ZSBmaXJzdCBsb29rIHRvIHNlZSBpZiBpdHMgYSBzaXR1YXRpb24gd2hlcmUgd2Ugd29uJ3QgaGF2ZSB0bworICAgICBpbnNlcnQgYSBicmFuY2ggKGUuZy4sIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYW4gdW5jb25kaXRpb25hbAorICAgICBicmFuY2gpLgorICAgIAorICAgICBTUEFOUEFOSUMgaXMgdGhlIHBvaW50IHdoZXJlIHdlIG11c3QgZHVtcCBhIHNpbmdsZS1lbnRyeSBwb29sLgorICAgICBpdCBhY2NvdW50cyBmb3IgYWxpZ25tZW50cyBhbmQgYW4gaW5zZXJ0ZWQgYnJhbmNoLgorICAgICB0aGUgJ3Bvb2xzaXplKjInIGFjY291bnRzIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgd2UgZG86CisgICAgICAgbHJ3IHIxLGxpdDE7IGxydyByMixsaXQyOyBscncgcjMsbGl0MworICAgICBOb3RlIHRoYXQgdGhlICdsaXQyJyByZWZlcmVuY2UgaXMgMiBieXRlcyBmdXJ0aGVyIGFsb25nCisgICAgIGJ1dCB0aGUgbGl0ZXJhbCBpdCByZWZlcmVuY2VzIHdpbGwgYmUgNCBieXRlcyBmdXJ0aGVyIGFsb25nLAorICAgICBzbyB3ZSBtdXN0IGNvbnNpZGVyIHRoZSBwb29sc2l6ZSBpbnRvIHRoaXMgZXF1YXRpb24uCisgICAgIFRoaXMgaXMgc2xpZ2h0bHkgb3Zlci1jYXV0aW91cywgYnV0IGd1YXJhbnRlZXMgdGhhdCB3ZSB3b24ndAorICAgICBwYW5pYyBiZWNhdXNlIGEgcmVsb2NhdGlvbiBpcyB0b28gZGlzdGFudC4gICovCisgIAorICBpZiAocG9vbHNwYW4gPiBTUEFOQ0xPU0UgJiYga2luZCA+IDApCisgICAgZHVtcF9saXRlcmFscyAoMCk7CisgIGVsc2UgaWYgKHBvb2xzcGFuID4gU1BBTkVYSVQgJiYga2luZCA+IDEpCisgICAgZHVtcF9saXRlcmFscyAoMCk7CisgIGVsc2UgaWYgKHBvb2xzcGFuID49IChTUEFOUEFOSUMgLSBwb29sc2l6ZSAqIDIpKQorICAgIGR1bXBfbGl0ZXJhbHMgKDEpOworfQorCitzdGF0aWMgaW50CitlbnRlcl9saXRlcmFsIChlLCBpc3BjcmVsKQorICAgICBleHByZXNzaW9uUyAqIGU7CisgICAgIGludCBpc3BjcmVsOworeworICBpbnQgaTsKKyAgc3RydWN0IGxpdGVyYWwgKiBwOworCisgIGlmIChwb29sc2l6ZSA+PSBNQVhfUE9PTF9TSVpFIC0gMikKKyAgICB7CisgICAgICAvKiBUaGUgbGl0ZXJhbCBwb29sIGlzIGFzIGZ1bGwgYXMgd2UgY2FuIGhhbmRsZS4gV2UgaGF2ZQorICAgICAgICAgdG8gYmUgMiBlbnRyaWVzIHNoeSBvZiB0aGUgMTAyNC80PTI1NiBlbnRyaWVzIGJlY2F1c2Ugd2UKKyAgICAgICAgIGhhdmUgdG8gYWxsb3cgZm9yIHRoZSBicmFuY2ggKDIgYnl0ZXMpIGFuZCB0aGUgYWxpZ25tZW50CisgICAgICAgICAoMiBieXRlcyBiZWZvcmUgdGhlIGZpcnN0IGluc24gcmVmZXJlbmNpbmcgdGhlIHBvb2wgYW5kCisgICAgICAgICAyIGJ5dGVzIGJlZm9yZSB0aGUgcG9vbCBpdHNlbGYpID09IDYgYnl0ZXMsIHJvdW5kcyB1cAorICAgICAgICAgdG8gMiBlbnRyaWVzLiAgKi8gCisgICAgICBkdW1wX2xpdGVyYWxzICgxKTsKKyAgICB9CisKKyAgaWYgKHBvb2xzaXplID09IDApCisgICAgeworICAgICAgLyogQ3JlYXRlIG5ldyBsaXRlcmFsIHBvb2wuICAqLworICAgICAgaWYgKCsrIHBvb2xudW1iZXIgPiAweEZGRkYpCisJYXNfZmF0YWwgKF8oIm1vcmUgdGhhbiA2NUsgbGl0ZXJhbCBwb29scyIpKTsKKyAgICAgIAorICAgICAgbWFrZV9uYW1lIChwb29sbmFtZSwgIi5YUC4iLCBwb29sbnVtYmVyKTsKKyAgICAgIHBvb2xzeW0gPSBzeW1ib2xfbWFrZSAocG9vbG5hbWUpOworICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAocG9vbHN5bSk7CisgICAgICBwb29sc3BhbiA9IDA7CisgICAgfQorICAKKyAgLyogU2VhcmNoIHBvb2wgZm9yIHZhbHVlIHNvIHdlIGRvbid0IGhhdmUgZHVwbGljYXRlcy4gICovCisgIGZvciAocCA9IGxpdHBvb2wsIGkgPSAwOyBpIDwgcG9vbHNpemU7IGkrKywgcCsrKQorICAgIHsKKyAgICAgIGlmIChlLT5YX29wID09IHAtPmUuWF9vcAorCSAgJiYgZS0+WF9hZGRfc3ltYm9sID09IHAtPmUuWF9hZGRfc3ltYm9sCisJICAmJiBlLT5YX2FkZF9udW1iZXIgPT0gcC0+ZS5YX2FkZF9udW1iZXIKKwkgICYmIGlzcGNyZWwgPT0gcC0+aXNwY3JlbCkKKwl7CisJICBwLT5yZWZjbnQgKys7CisJICByZXR1cm4gaTsKKwl9CisgICAgfQorCisgIHAtPnJlZmNudCAgPSAxOworICBwLT5pc3BjcmVsID0gaXNwY3JlbDsKKyAgcC0+ZSAgICAgICA9ICogZTsKKyAgCisgIHBvb2xzaXplICsrOworCisgIHJldHVybiBpOyAgIAorfQorCisvKiBQYXJzZSBhIGxpdGVyYWwgc3BlY2lmaWNhdGlvbi4gLS0gZWl0aGVyIG5ldyBvciBvbGQgc3ludGF4LgorICAgb2xkIHN5bnRheDogdGhlIHVzZXIgc3VwcGxpZXMgdGhlIGxhYmVsIGFuZCBwbGFjZXMgdGhlIGxpdGVyYWwuCisgICBuZXcgc3ludGF4OiB3ZSBwdXQgaXQgaW50byB0aGUgbGl0ZXJhbCBwb29sLiAgKi8KK3N0YXRpYyBjaGFyICoKK3BhcnNlX3J0IChzLCBvdXRwdXRwLCBpc3BjcmVsLCBlcCkKKyAgICAgY2hhciAqIHM7CisgICAgIGNoYXIgKiogb3V0cHV0cDsKKyAgICAgaW50IGlzcGNyZWw7CisgICAgIGV4cHJlc3Npb25TICogZXA7Cit7CisgIGV4cHJlc3Npb25TIGU7CisgIGludCBuOworICAKKyAgaWYgKGVwKQorICAgIC8qIEluZGljYXRlIG5vdGhpbmcgdGhlcmUuICAqLworICAgIGVwLT5YX29wID0gT19hYnNlbnQ7CisgIAorICBpZiAoKnMgPT0gJ1snKQorICAgIHsKKyAgICAgIHMgPSBwYXJzZV9leHAgKHMgKyAxLCAmIGUpOworICAgICAgCisgICAgICBpZiAoKnMgPT0gJ10nKQorCXMrKzsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oIm1pc3NpbmcgJ10nIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHMgPSBwYXJzZV9leHAgKHMsICYgZSk7CisgICAgICAKKyAgICAgIG4gPSBlbnRlcl9saXRlcmFsICgmIGUsIGlzcGNyZWwpOworICAgICAgCisgICAgICBpZiAoZXApCisJKmVwID0gZTsKKworICAgICAgLyogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHBvb2wgZW50cnkuICAqLworICAgICAgZS5YX29wICAgICAgICAgPSBPX3N5bWJvbDsKKyAgICAgIGUuWF9hZGRfc3ltYm9sID0gcG9vbHN5bTsKKyAgICAgIGUuWF9hZGRfbnVtYmVyID0gbiA8PCAyOworICAgIH0KKyAgCisgICogb3V0cHV0cCA9IGZyYWdfbW9yZSAoMik7CisKKyAgZml4X25ld19leHAgKGZyYWdfbm93LCAoKm91dHB1dHApIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsICYgZSwgMSwKKwkgICAgICAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQpOworCisgIHJldHVybiBzOworfQorCitzdGF0aWMgY2hhciAqCitwYXJzZV9pbW0gKHMsIHZhbCwgbWluLCBtYXgpCisgICAgIGNoYXIgKiBzOworICAgICB1bnNpZ25lZCAqIHZhbDsKKyAgICAgdW5zaWduZWQgbWluOworICAgICB1bnNpZ25lZCBtYXg7Cit7CisgIGNoYXIgKiBuZXc7CisgIGV4cHJlc3Npb25TIGU7CisgIAorICBuZXcgPSBwYXJzZV9leHAgKHMsICYgZSk7CisgIAorICBpZiAoZS5YX29wID09IE9fYWJzZW50KQorICAgIDsgLyogQW4gZXJyb3IgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQuICAqLworICBlbHNlIGlmIChlLlhfb3AgIT0gT19jb25zdGFudCkKKyAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IikpOworICBlbHNlIGlmIChlLlhfYWRkX251bWJlciA8IG1pbiB8fCBlLlhfYWRkX251bWJlciA+IG1heCkKKyAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQsIG5vdCAlZCIpLAorCSAgICBtaW4sIG1heCwgZS5YX2FkZF9udW1iZXIpOworCisgICogdmFsID0gZS5YX2FkZF9udW1iZXI7CisgIAorICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgY2hhciAqCitwYXJzZV9tZW0gKHMsIHJlZywgb2ZmLCBzaXopCisgICAgIGNoYXIgKiBzOworICAgICB1bnNpZ25lZCAqIHJlZzsKKyAgICAgdW5zaWduZWQgKiBvZmY7CisgICAgIHVuc2lnbmVkIHNpejsKK3sKKyAgY2hhciAqIG5ldzsKKworICAqIG9mZiA9IDA7CisgIAorICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKKyAgICArKyBzOworICAgICAgCisgIGlmICgqIHMgPT0gJygnKQorICAgIHsKKyAgICAgIHMgPSBwYXJzZV9yZWcgKHMgKyAxLCByZWcpOworCisgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKKwkrKyBzOworICAgICAgCisgICAgICBpZiAoKiBzID09ICcsJykKKwl7CisJICBzID0gcGFyc2VfaW1tIChzICsgMSwgb2ZmLCAwLCA2Myk7CisJICAKKwkgIGlmIChzaXogPiAxKQorCSAgICB7CisJICAgICAgaWYgKHNpeiA+IDIpCisJCXsKKwkJICBpZiAoKiBvZmYgJiAweDMpCisJCSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKSk7CisJCSAgCisJCSAgKiBvZmYgPj49IDI7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoKiBvZmYgJiAweDEpCisJCSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIiKSk7CisJCSAgCisJCSAgKiBvZmYgPj49IDE7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIAorICAgICAgd2hpbGUgKGlzc3BhY2UgKCogcykpCisJKysgczsKKyAgICAgIAorICAgICAgaWYgKCogcyA9PSAnKScpCisJcyArKzsKKyAgICB9CisgIGVsc2UKKyAgICBhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7CisgIAorICByZXR1cm4gczsKK30KKworLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCisgICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAorICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKiBzdHI7Cit7CisgIGNoYXIgKiBvcF9zdGFydDsKKyAgY2hhciAqIG9wX2VuZDsKKyAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7CisgIGNoYXIgKiBvdXRwdXQ7CisgIGludCBubGVuID0gMDsKKyAgdW5zaWduZWQgc2hvcnQgaW5zdDsKKyAgdW5zaWduZWQgcmVnOworICB1bnNpZ25lZCBvZmY7CisgIHVuc2lnbmVkIGlzaXplOworICBleHByZXNzaW9uUyBlOworICBjaGFyIG5hbWVbMjBdOworCisgIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KKyAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKKyAgICBzdHIgKys7CisKKyAgLyogRmluZCB0aGUgb3AgY29kZSBlbmQuICAqLworICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOworICAgICAgICogb3BfZW5kICYmIG5sZW4gPCAyMCAmJiAhaXNfZW5kX29mX2xpbmUgWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOworICAgICAgIG9wX2VuZCsrKQorICAgIHsKKyAgICAgIG5hbWVbbmxlbl0gPSBvcF9zdGFydFtubGVuXTsKKyAgICAgIG5sZW4rKzsKKyAgICB9CisgIAorICBuYW1lIFtubGVuXSA9IDA7CisgIAorICBpZiAobmxlbiA9PSAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBvcGNvZGUgPSAobWNvcmVfb3Bjb2RlX2luZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKKyAgaWYgKG9wY29kZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgXCIlc1wiIiksIG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGluc3QgPSBvcGNvZGUtPmluc3Q7CisgIGlzaXplID0gMjsKKyAgCisgIHN3aXRjaCAob3Bjb2RlLT5vcGNsYXNzKQorICAgIHsKKyAgICBjYXNlIE8wOgorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPVDoKKyAgICAgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMpOworICAgICAgaW5zdCB8PSByZWc7CisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE8xOgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgSk1QOgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgICAgICAvKiBJbiBhIHNpZmlsdGVyIG1vZGUsIHdlIGVtaXQgdGhpcyBpbnNuIDIgdGltZXMsCisgICAgICAgICBmaXhlcyBwcm9ibGVtIG9mIGFuIGludGVycnVwdCBkdXJpbmcgYSBqbXAuLiAqLworICAgICAgaWYgKHNpZmlsdGVyX21vZGUpCisJeworCSAgb3V0cHV0WzBdID0gKGluc3QgPj4gOCk7CisJICBvdXRwdXRbMV0gPSAoaW5zdCk7CisJICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworCX0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBKU1I6CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIAorICAgICAgaWYgKHJlZyA9PSAxNSkKKwlhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXI6IHIxNSBpbGxlZ2FsIikpOworICAgICAgCisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgICAgICAKKyAgICAgIGlmIChzaWZpbHRlcl9tb2RlKQorCXsKKwkgIC8qIFJlcGxhY2Ugd2l0aDogIGJzciAuKzIgOyBhZGRpIHIxNSw2OyBqbXAgcnggOyBqbXAgcnggKi8KKwkgIGluc3QgPSBNQ09SRV9JTlNUX0JTUjsJLyogd2l0aCAwIGRpc3BsYWNlbWVudCAqLworCSAgb3V0cHV0WzBdID0gKGluc3QgPj4gOCk7CisJICBvdXRwdXRbMV0gPSAoaW5zdCk7CisKKwkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisJICBpbnN0ID0gTUNPUkVfSU5TVF9BRERJOworCSAgaW5zdCB8PSAxNTsJCQkvKiBhZGRpIHIxNSw2ICovCisJICBpbnN0IHw9ICg2IC0gMSkgPDwgNDsJCS8qIG92ZXIgdGhlIGptcCdzICovCisJICBvdXRwdXRbMF0gPSAoaW5zdCA+PiA4KTsKKwkgIG91dHB1dFsxXSA9IChpbnN0KTsKKworCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKwkgIGluc3QgPSBNQ09SRV9JTlNUX0pNUCB8IHJlZzsKKwkgIG91dHB1dFswXSA9IChpbnN0ID4+IDgpOworCSAgb3V0cHV0WzFdID0gKGluc3QpOworCisJICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwkJLyogMm5kIGVtaXR0ZWQgaW4gZmFsbHRocnUgKi8KKwl9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT0M6CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIGluc3QgfD0gcmVnOworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCpvcF9lbmQgPT0gJywnKQorCXsKKwkgIG9wX2VuZCA9IHBhcnNlX2NyZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKwkgIGluc3QgfD0gcmVnIDw8IDQ7CisJfQorICAgICAgCisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE8yOgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJeworCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisJICBpbnN0IHw9IHJlZyA8PCA0OworCX0KKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7CisgICAgICAKKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgWDE6CS8qIEhhbmRsZSBib3RoIHN5bnRheC0+IHh0cmItIHIxLHJ4IE9SIHh0cmItIHJ4ICovCisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCS8qIHh0cmItIHIxLHJ4ICovCisJeworCSAgaWYgKHJlZyAhPSAxKQorCSAgICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIG11c3QgYmUgcjEiKSk7CisJICAKKwkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOworCX0KKyAgICAgIAorICAgICAgaW5zdCB8PSByZWc7CisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE8xUjE6ICAvKiBkaXYtIHJ4LHIxICovCisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIGluc3QgfD0gcmVnOworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKwkgIGlmIChyZWcgIT0gMSkKKwkgICAgYXNfYmFkIChfKCJzb3VyY2UgcmVnaXN0ZXIgbXVzdCBiZSByMSIpKTsKKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOworICAgICAgCisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9JOgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJeworCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzIpOworCSAgaW5zdCB8PSAocmVnIC0gMSkgPDwgNDsKKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOworICAgICAgCisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9COgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJeworCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMzEpOworCSAgaW5zdCB8PSByZWcgPDwgNDsKKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOworICAgICAgCisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9CMjoJCS8qIGxpa2UgT0IsIGJ1dCBhcmcgaXMgMl5uIGluc3RlYWQgb2YgbiAqLworICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJeworCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMSA8PCAzMSk7CisJICAvKiBGdXJ0aGVyIHJlc3RyaWN0IHRoZSBpbW1lZGlhdGUgdG8gYSBwb3dlciBvZiB0d28uICovCisJICBpZiAoKHJlZyAmIChyZWcgLSAxKSkgPT0gMCkKKwkgICAgcmVnID0gbG9nMiAocmVnKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJlZyA9IDA7CisJICAgICAgYXNfYmFkIChfKCJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIikpOworCSAgICB9CisJICBpbnN0IHw9IChyZWcpIDw8IDQ7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPQlJhOgkvKiBTcGVjaWZpYyBmb3IgYmdlbmk6IGltbSBvZiAwLT42IHRyYW5zbGF0ZSB0byBtb3ZpLiAqLworICAgIGNhc2UgT0JSYjoKKyAgICBjYXNlIE9CUmM6CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIGluc3QgfD0gcmVnOworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzMSk7CisJICAvKiBpbW1lZGlhdGUgdmFsdWVzIG9mIDAgLT4gNiB0cmFuc2xhdGUgdG8gbW92aSAqLworCSAgaWYgKHJlZyA8PSA2KQorCSAgICB7CisJICAgICAgaW5zdCA9IChpbnN0ICYgMHhGKSB8IE1DT1JFX0lOU1RfQkdFTklfQUxUOworCSAgICAgIHJlZyA9IDB4MSA8PCByZWc7CisJICAgICAgYXNfd2FybiAoXygidHJhbnNsYXRpbmcgYmdlbmkgdG8gbW92aSIpKTsKKwkgICAgfQorCSAgaW5zdCAmPSB+IDB4MDFmMDsKKwkgIGluc3QgfD0gcmVnIDw8IDQ7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPQlIyOgkvKiBsaWtlIE9CUiwgYnV0IGFyZyBpcyAyXm4gaW5zdGVhZCBvZiBuICovCisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIGluc3QgfD0gcmVnOworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAxIDw8IDMxKTsKKwkgIAorCSAgLyogRnVydGhlciByZXN0cmljdCB0aGUgaW1tZWRpYXRlIHRvIGEgcG93ZXIgb2YgdHdvLiAgKi8KKwkgIGlmICgocmVnICYgKHJlZyAtIDEpKSA9PSAwKQorCSAgICByZWcgPSBsb2cyIChyZWcpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVnID0gMDsKKwkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSBpcyBub3QgYSBwb3dlciBvZiB0d28iKSk7CisJICAgIH0KKwkgIAorCSAgLyogSW1tZWRpYXRlIHZhbHVlcyBvZiAwIC0+IDYgdHJhbnNsYXRlIHRvIG1vdmkuICovCisJICBpZiAocmVnIDw9IDYpCisJICAgIHsKKwkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CR0VOSV9BTFQ7CisJICAgICAgcmVnID0gMHgxIDw8IHJlZzsKKwkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBtZ2VuaSB0byBtb3ZpIikpOworCSAgICB9CisJICAKKwkgIGluc3QgfD0gcmVnIDw8IDQ7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPTWE6CS8qIFNwZWNpZmljIGZvciBibWFza2k6IGltbSAxLT43IHRyYW5zbGF0ZSB0byBtb3ZpLiAgKi8KKyAgICBjYXNlIE9NYjoKKyAgICBjYXNlIE9NYzoKKyAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOworICAgICAgaW5zdCB8PSByZWc7CisgICAgICAKKyAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCSsrIG9wX2VuZDsKKyAgCisgICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQorCXsKKwkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMyKTsKKwkgIAorCSAgLyogSW1tZWRpYXRlIHZhbHVlcyBvZiAxIC0+IDcgdHJhbnNsYXRlIHRvIG1vdmkuICovCisJICBpZiAocmVnIDw9IDcpCisJICAgIHsKKwkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CTUFTS0lfQUxUOworCSAgICAgIHJlZyA9ICgweDEgPDwgcmVnKSAtIDE7CisJICAgICAgaW5zdCB8PSByZWcgPDwgNDsKKwkgICAgICAKKwkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBibWFza2kgdG8gbW92aSIpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaW5zdCAmPSB+IDB4MDFGMDsKKwkgICAgICBpbnN0IHw9IChyZWcgJiAweDFGKSA8PCA0OworCSAgICB9CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTSToKKyAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOworICAgICAgaW5zdCB8PSByZWc7CisgICAgICAKKyAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCSsrIG9wX2VuZDsKKyAgCisgICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQorCXsKKwkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKKwkgIGluc3QgfD0gcmVnIDw8IDQ7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJNzoKKyAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOworICAgICAgaW5zdCB8PSByZWc7CisgICAgICAKKyAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCSsrIG9wX2VuZDsKKyAgCisgICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQorCXsKKwkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDB4N0YpOworCSAgaW5zdCB8PSByZWcgPDwgNDsKKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOworICAgICAgCisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIExTOgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZyA8PCA4OworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBpbnQgc2l6ZTsKKwkgIAorCSAgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAwKQorCSAgICBzaXplID0gNDsKKwkgIGVsc2UgaWYgKChpbnN0ICYgMHg2MDAwKSA9PSAweDQwMDApCisJICAgIHNpemUgPSAyOworCSAgZWxzZSBpZiAoKGluc3QgJiAweDYwMDApID09IDB4MjAwMCkKKwkgICAgc2l6ZSA9IDE7CisJICAKKwkgIG9wX2VuZCA9IHBhcnNlX21lbSAob3BfZW5kICsgMSwgJiByZWcsICYgb2ZmLCBzaXplKTsKKwkgIAorCSAgaWYgKG9mZiA+IDE2KQorCSAgICBhc19iYWQgKF8oImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgKCVkKSIpLCBvZmYpOworCSAgZWxzZQorCSAgICBpbnN0IHw9IChyZWcpIHwgKG9mZiA8PCA0KTsKKwl9CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOworICAgICAgCisgICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIExSOgorICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICAKKyAgICAgIGlmIChyZWcgPT0gMCB8fCByZWcgPT0gMTUpCisJYXNfYmFkIChfKCJJbnZhbGlkIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGlsbGVnYWwiKSk7CisgICAgICAKKyAgICAgIGluc3QgfD0gKHJlZyA8PCA4KTsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJLyogcGFyc2VfcnQgY2FsbHMgZnJhZ19tb3JlKCkgZm9yIHVzLiAgKi8KKwlpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDAsIDApOworICAgICAgZWxzZQorCXsKKwkgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKwkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CQkvKiBzYXZlIGl0cyBzcGFjZSAqLworCX0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBMSjoKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMSwgMCk7CisgICAgICAvKiBwYXJzZV9ydCgpIGNhbGxzIGZyYWdfbW9yZSgpIGZvciB1cy4gICovCisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUk06CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIAorICAgICAgaWYgKHJlZyA9PSAwIHx8IHJlZyA9PSAxNSkKKwlhc19iYWQgKF8oImJhZCBzdGFydGluZyByZWdpc3RlcjogcjAgYW5kIHIxNSBpbnZhbGlkIikpOworICAgICAgCisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLScpCisJeworCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisJICAKKwkgIGlmIChyZWcgIT0gMTUpCisJICAgIGFzX2JhZCAoXygiZW5kaW5nIHJlZ2lzdGVyIG11c3QgYmUgcjE1IikpOworCSAgCisJICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkgICAgKysgb3BfZW5kOworCX0KKyAgICAgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBvcF9lbmQgKys7CisJICAKKwkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisJICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCSAgICArKyBvcF9lbmQ7CisgIAorCSAgaWYgKCogb3BfZW5kID09ICcoJykKKwkgICAgeworCSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOworCSAgICAgIAorCSAgICAgIGlmIChyZWcgIT0gMCkKKwkJYXNfYmFkIChfKCJiYWQgYmFzZSByZWdpc3RlcjogbXVzdCBiZSByMCIpKTsKKwkgICAgICAKKwkgICAgICBpZiAoKiBvcF9lbmQgPT0gJyknKQorCQlvcF9lbmQgKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYXNfYmFkIChfKCJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIikpOworCX0KKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7CisgICAgICAKKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUlE6CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIAorICAgICAgaWYgKHJlZyAhPSA0KQorCWFzX2ZhdGFsIChfKCJmaXJzdCByZWdpc3RlciBtdXN0IGJlIHI0IikpOworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICctJykKKwl7CisJICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKwkgIAorCSAgaWYgKHJlZyAhPSA3KQorCSAgICBhc19mYXRhbCAoXygibGFzdCByZWdpc3RlciBtdXN0IGJlIHI3IikpOworCSAgCisJICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworCSAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkgICAgKysgb3BfZW5kOworICAKKwkgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJICAgIHsKKwkgICAgICBvcF9lbmQgKys7CisJICAgICAgCisJICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKwkgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCQkrKyBvcF9lbmQ7CisgIAorCSAgICAgIGlmICgqIG9wX2VuZCA9PSAnKCcpCisJCXsKKwkJICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKwkJICAKKwkJICBpZiAocmVnID49IDQgJiYgcmVnIDw9IDcpCisJCSAgICBhc19mYXRhbCAoImJhc2UgcmVnaXN0ZXIgY2Fubm90IGJlIHI0LCByNSwgcjYsIG9yIHI3Iik7CisJCSAgCisJCSAgaW5zdCB8PSByZWc7CisJCSAgCisJCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKwkJICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCQkgICAgKysgb3BfZW5kOworCQkgIAorCQkgIGlmICgqIG9wX2VuZCA9PSAnKScpCisJCSAgICBvcF9lbmQgKys7CisJCX0KKwkgICAgICBlbHNlCisJCWFzX2JhZCAoXygiYmFzZSByZWdpc3RlciBleHBlY3RlZCIpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygicmVnLXJlZyBleHBlY3RlZCIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBCUjoKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIAorICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAorCQkgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMik7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgQkw6CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIGluc3QgfD0gcmVnIDw8IDQ7CisgICAgICAKKyAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisgICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQorCSsrIG9wX2VuZDsKKyAgCisgICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQorCXsKKwkgIG9wX2VuZCA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKKwkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisJICAKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgb3V0cHV0LWZyYWdfbm93LT5mcl9saXRlcmFsLCAKKwkJICAgICAgIDIsICYgZSwgMSwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7CisJICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOworCX0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBKQzoKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAorCQkJIG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDMyKV0ucmx4X2xlbmd0aCwKKwkJCSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGgsCisJCQkgQyAoQ09ORF9KVU1QLCAwKSwgZS5YX2FkZF9zeW1ib2wsIGUuWF9hZGRfbnVtYmVyLCAwKTsKKyAgICAgIGlzaXplID0gQzMyX0xFTjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBKVToKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX2V4cCAob3BfZW5kICsgMSwgJiBlKTsKKyAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKKwkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGgsCisJCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoLAorCQkJIEMgKFVOQ0RfSlVNUCwgMCksIGUuWF9hZGRfc3ltYm9sLCBlLlhfYWRkX251bWJlciwgMCk7CisgICAgICBpc2l6ZSA9IFUzMl9MRU47CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgSkw6CisgICAgICBpbnN0ID0gTUNPUkVfSU5TVF9KU1JJOwkJLyoganNyaSAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAxLCAmIGUpOworICAgICAgLyogcGFyc2VfcnQoKSBjYWxscyBmcmFnX21vcmUgZm9yIHVzICovCisgICAgICAKKyAgICAgIC8qIE9ubHkgZG8gdGhpcyBpZiB3ZSBrbm93IGhvdyB0byBkbyBpdCAuLi4gKi8KKyAgICAgIGlmIChlLlhfb3AgIT0gT19hYnNlbnQgJiYgZG9fanNyaTJic3IpCisJeworCSAgLyogTG9vayBhdCBhZGRpbmcgdGhlIFJfUENSRUxfSlNSSU1NMTFCWTIuICAqLworCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAorCQkgICAgICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUlNJOgkJCQkvKiBTSSwgYnV0IGltbSBiZWNvbWVzIDMyLWltbSAqLworICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7CisgICAgICBpbnN0IHw9IHJlZzsKKyAgICAgIAorICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCisJKysgb3BfZW5kOworICAKKyAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCisJeworCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOworCSAgCisJICByZWcgPSAzMiAtIHJlZzsKKwkgIGluc3QgfD0gcmVnIDw8IDQ7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBETzIxOgkJCS8qIE8yLCBkdXAgcmQsIGxpdCBtdXN0IGJlIDEgKi8KKyAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOworICAgICAgaW5zdCB8PSByZWc7CisgICAgICBpbnN0IHw9IHJlZyA8PCA0OworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7CisJICAKKwkgIGlmIChyZWcgIT0gMSkKKwkgICAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtdXN0IGJlIDEiKSk7CisJfQorICAgICAgZWxzZQorCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKKyAgICAgIAorICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBTSWE6CisgICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKKyAgICAgIGluc3QgfD0gcmVnOworICAgICAgCisgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKKwkrKyBvcF9lbmQ7CisgIAorICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKKwl7CisJICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7CisKKwkgIGlmIChyZWcgPT0gMCkKKwkgICAgYXNfYmFkIChfKCJ6ZXJvIHVzZWQgYXMgaW1tZWRpYXRlIHZhbHVlIikpOworCSAgCisJICBpbnN0IHw9IHJlZyA8PCA0OworCX0KKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7CisgICAgICAKKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhc19iYWQgKF8oInVuaW1wbGVtZW50ZWQgb3Bjb2RlIFwiJXNcIiIpLCBuYW1lKTsKKyAgICB9CisgIAorICBvdXRwdXRbMF0gPSBpbnN0ID4+IDg7CisgIG91dHB1dFsxXSA9IGluc3Q7CisgIAorICBjaGVja19saXRlcmFscyAob3Bjb2RlLT50cmFuc2ZlciwgaXNpemUpOworfQorCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgICAgY2hhciAqIG5hbWU7Cit7CisgIHJldHVybiAwOworfQorCit2b2lkCittZF9tY29yZV9lbmQgKCkKK3sKKyAgZHVtcF9saXRlcmFscyAoMCk7CisgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Cit9CisKKy8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5LiAgKi8KKy8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KKyNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4qLworY2hhciAqCittZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKKyAgICAgaW50IHR5cGU7CisgICAgIGNoYXIgKiBsaXRQOworICAgICBpbnQgKiBzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKKyAgTElUVExFTlVNX1RZUEUgKiB3b3JkUDsKKyAgY2hhciAqIHQ7CisgIGNoYXIgKiBhdG9mX2llZWUgKCk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdTJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICBjYXNlICdyJzoKKyAgICBjYXNlICdSJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd4JzoKKyAgICBjYXNlICdYJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdwJzoKKyAgICBjYXNlICdQJzoKKyAgICAgIHByZWMgPSA2OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKnNpemVQID0gMDsKKyAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9OVE9GKCkiKTsKKyAgICB9CisgIAorICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgCisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAKKyAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisMCitDT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIiI7CisKKyNkZWZpbmUgT1BUSU9OX1JFTEFYCQkoT1BUSU9OX01EX0JBU0UpCisjZGVmaW5lIE9QVElPTl9KU1JJMkJTUl9PTgkoT1BUSU9OX01EX0JBU0UgKyAxKQorI2RlZmluZSBPUFRJT05fSlNSSTJCU1JfT0ZGCShPUFRJT05fTURfQkFTRSArIDIpCisjZGVmaW5lIE9QVElPTl9TSUZJTFRFUl9PTgkoT1BUSU9OX01EX0JBU0UgKyAzKQorI2RlZmluZSBPUFRJT05fU0lGSUxURVJfT0ZGCShPUFRJT05fTURfQkFTRSArIDQpCisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Cit7CisgIHsgInJlbGF4IiwgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCisgIHsgIm5vLWpzcmkyYnNyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9KU1JJMkJTUl9PRkZ9LAorICB7ICJqc3JpMmJzciIsICAgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSlNSSTJCU1JfT059LAorICB7ICJzaWZpbHRlciIsICAgIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0lGSUxURVJfT059LAorICB7ICJuby1zaWZpbHRlciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0lGSUxURVJfT0ZGfSwKKyAgeyBOVUxMLCAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CisKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICogYXJnOworeworICBpbnQgaTsKKyAgY2hhciAqIHA7CisKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICAgIAorICAgIGNhc2UgT1BUSU9OX1JFTEFYOiAgICAgICAgcmVsYXggPSAxOyAgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09OOiAgZG9fanNyaTJic3IgPSAxOyAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX0pTUkkyQlNSX09GRjogZG9fanNyaTJic3IgPSAwOyAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09OOiAgc2lmaWx0ZXJfbW9kZSA9IDE7IGJyZWFrOworICAgIGNhc2UgT1BUSU9OX1NJRklMVEVSX09GRjogc2lmaWx0ZXJfbW9kZSA9IDA7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKiBzdHJlYW07Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcblwKKyAgLXtuby19anNyaTJic3IJICB7ZGlzfWFibGUganNyaSB0byBic3IgdHJhbnNmb3JtYXRpb24gKGRlZjogb2ZmKVxuXAorICAte25vLX1zaWZpbHRlcgkgIHtkaXN9YWJsZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvciAoZGVmOiBvZmYpXG5cCisgIC1yZWxheAkJICBhbHRlciBqdW1wIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iKSk7Cit9CisMCitpbnQgbWRfc2hvcnRfanVtcF9zaXplOworCit2b2lkCittZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX05kZHIsIHRvX05kZHIsIGZyYWcsIHRvX3N5bWJvbCkKKyAgICAgY2hhciAqIHB0cjsKKyAgICAgYWRkcmVzc1QgZnJvbV9OZGRyOworICAgICBhZGRyZXNzVCB0b19OZGRyOworICAgICBmcmFnUyAqIGZyYWc7CisgICAgIHN5bWJvbFMgKiB0b19zeW1ib2w7Cit7CisgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG9ydF9qdW1wIikpOworfQorCit2b2lkCittZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fTmRkciwgdG9fTmRkciwgZnJhZywgdG9fc3ltYm9sKQorICAgICBjaGFyICogcHRyOworICAgICBhZGRyZXNzVCBmcm9tX05kZHI7CisgICAgIGFkZHJlc3NUIHRvX05kZHI7CisgICAgIGZyYWdTICogZnJhZzsKKyAgICAgc3ltYm9sUyAqIHRvX3N5bWJvbDsKK3sKKyAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2s6IGxvbmdfanVtcCIpKTsKK30KKworLyogQ2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlLiAgKi8KK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKKyAgICAgYmZkICogYWJmZDsKKyAgICAgc2VnVCBzZWM7CisgICAgIHJlZ2lzdGVyIGZyYWdTICogZnJhZ1A7Cit7CisgIHVuc2lnbmVkIGNoYXIgKiBidWZmZXI7CisgIGludCB0YXJnX2FkZHIgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OworICAKKyAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCk7CisgIHRhcmdfYWRkciArPSBmcmFnUC0+ZnJfc3ltYm9sLT5zeV9mcmFnLT5mcl9hZGRyZXNzOworCisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMTIpOgorICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMTIpOgorICAgICAgeworCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbiAqLworCWludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyAyOworCXVuc2lnbmVkIGNoYXIgdDA7CisJaW50IGRpc3AgPSB0YXJnX2FkZHIgLSBuZXh0X2luc3Q7CisJCisJaWYgKGRpc3AgJiAxKQorCSAgICBhc19iYWQgKF8oIm9kZCBkaXNwbGFjZW1lbnQgYXQgJXgiKSwgbmV4dF9pbnN0IC0gMik7CisJCisJZGlzcCA+Pj0gMTsKKwl0MCA9IGJ1ZmZlclswXSAmIDB4Rjg7CisJCisJbWRfbnVtYmVyX3RvX2NoYXJzIChidWZmZXIsIGRpc3AsIDIpOworCQorCWJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweDA3KSB8IHQwOworCWZyYWdQLT5mcl9maXggKz0gMjsKKwlmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQzMik6CisgICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6CisgICAgICB7CisJLyogQSBjb25kaXRpb25hbCBicmFuY2ggd29udCBmaXQgaW50byAxMiBiaXRzIHNvOgorCSAqCWIhY29uZAkxZgorCSAqCWptcGkJMGYKKwkgKgkuYWxpZ24gMgorCSAqIDA6CS5sb25nIGRpc3AKKwkgKiAxOgorCSAqCisJICogaWYgdGhlIGIhY29uZCBpcyA0IGJ5dGUgYWxpZ25lZCwgdGhlIGxpdGVyYWwgd2hpY2ggd291bGQKKwkgKiBnbyBhdCB4KzQgd2lsbCBhbHNvIGJlIGFsaWduZWQuCisJICovCisJaW50IGZpcnN0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7CisJaW50IG5lZWRwYWQgPSAoZmlyc3RfaW5zdCAmIDMpOworCisJYnVmZmVyWzBdIF49IDB4MDg7CS8qIFRvZ2dsZSBUL0YgYml0ICovCisKKwlidWZmZXJbMl0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCisJYnVmZmVyWzNdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKKyAKKwlpZiAobmVlZHBhZCkKKwkgIHsKKwkgICAgYnVmZmVyWzFdID0gNDsJLyogYnJhbmNoIG92ZXIgam1waSwgcGFkLCBhbmQgcHRyICovCisJICAgIGJ1ZmZlclszXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgZ2V0cyB0aGUgcG9pbnRlciAqLworCSAgICBidWZmZXJbNF0gPSAwOwkvKiBhbGlnbm1lbnQvcGFkICovCisJICAgIGJ1ZmZlcls1XSA9IDA7CisJICAgIGJ1ZmZlcls2XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLworCSAgICBidWZmZXJbN10gPSAwOworCSAgICBidWZmZXJbOF0gPSAwOworCSAgICBidWZmZXJbOV0gPSAwOworCSAgICAKKwkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLworCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDYsIDQsCisJCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKKwkgICAgCisJICAgIGZyYWdQLT5mcl9maXggKz0gQzMyX0xFTjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIFNlZSBjb21tZW50IGJlbG93IGFib3V0IHRoaXMgZ2l2ZW4gZ2FzJyBsaW1pdGF0aW9ucyBmb3IKKwkgICAgICAgc2hyaW5raW5nIHRoZSBmcmFnbWVudC4gJzMnIGlzIHRoZSBhbW91bnQgb2YgY29kZSB0aGF0CisJICAgICAgIHdlIGluc2VydGVkIGhlcmUsIGJ1dCAnNCcgaXMgcmlnaHQgZm9yIHRoZSBzcGFjZSB3ZSByZXNlcnZlZAorCSAgICAgICBmb3IgdGhpcyBmcmFnbWVudC4gKi8KKwkgICAgYnVmZmVyWzFdID0gMzsJLyogYnJhbmNoIG92ZXIgam1waSwgYW5kIHB0ciAqLworCSAgICBidWZmZXJbM10gPSAwOwkvKiBqbXBpIG9mZnNldCBvZiAwIGdldHMgdGhlIHBvaW50ZXIgKi8KKwkgICAgYnVmZmVyWzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCisJICAgIGJ1ZmZlcls1XSA9IDA7CisJICAgIGJ1ZmZlcls2XSA9IDA7CisJICAgIGJ1ZmZlcls3XSA9IDA7CisJICAgIAorCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwLiAgKi8KKwkgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LAorCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsIDAsIEJGRF9SRUxPQ18zMik7CisJICAgIGZyYWdQLT5mcl9maXggKz0gQzMyX0xFTjsKKworCSAgICAvKiBmcmFnIGlzIGFjdHVhbGx5IHNob3J0ZXIgKHNlZSB0aGUgb3RoZXIgc2lkZSBvZiB0aGlzIGlmZGVmKQorCSAgICAgICBidXQgZ2FzIGlzbid0IHByZXBhcmVkIGZvciB0aGF0LiBXZSBoYXZlIHRvIHJlLWFkanVzdAorCSAgICAgICB0aGUgYnJhbmNoIGRpc3BsYWNlbWVudCBzbyB0aGF0IGl0IGdvZXMgYmV5b25kIHRoZSAKKwkgICAgICAgZnVsbCBsZW5ndGggb2YgdGhlIGZyYWdtZW50LCBub3QganVzdCB3aGF0IHdlIGFjdHVhbGx5CisJICAgICAgIGZpbGxlZCBpbi4gICovCisJICAgIGJ1ZmZlclsxXSA9IDQ7CS8qIGptcGksIHB0ciwgYW5kIHRoZSAndGFpbCBwYWQnICovCisJICB9CisJCisJZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkNEMzIpOgorICAgIGNhc2UgQyAoVU5DRF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOgorICAgICAgeworCS8qIEFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHdpbGwgbm90IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2gKKwkgICBsb29rcyBsaWtlOgorCSAgCWptcGkJMGYKKwkgIAkuYWxpZ24gMgorCSAgICAgMDoJLmxvbmcgZGlzcAorCSAgIHdlIG5lZWQgYSBwYWQgaWYgImZpcnN0X2luc3QiIGlzIDQgYnl0ZSBhbGlnbmVkLgorCSAgIFtiZWNhdXNlIHRoZSBuYXR1cmFsIGxpdGVyYWwgcGxhY2UgaXMgeCArIDJdICAqLworCWludCBmaXJzdF9pbnN0ID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOworCWludCBuZWVkcGFkID0gIShmaXJzdF9pbnN0ICYgMyk7CisKKwlidWZmZXJbMF0gPSBJTlNUX0JZVEUwIChNQ09SRV9JTlNUX0pNUEkpOwkvKiBCdWlsZCBqbXBpICovCisJYnVmZmVyWzFdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9KTVBJKTsKKworCWlmIChuZWVkcGFkKQorCSAgeworCSAgICBidWZmZXJbMV0gPSAxOwkvKiBqbXBpIG9mZnNldCBvZiAxIHNpbmNlIHBhZGRlZCAqLworCSAgICBidWZmZXJbMl0gPSAwOwkvKiBhbGlnbm1lbnQgKi8KKwkgICAgYnVmZmVyWzNdID0gMDsKKwkgICAgYnVmZmVyWzRdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCisJICAgIGJ1ZmZlcls1XSA9IDA7CisJICAgIGJ1ZmZlcls2XSA9IDA7CisJICAgIGJ1ZmZlcls3XSA9IDA7CisJICAgIAorCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCisJICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwKKwkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOworCSAgICAKKwkgICAgZnJhZ1AtPmZyX2ZpeCArPSBVMzJfTEVOOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgYnVmZmVyWzFdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBpZiBubyBwYWQgKi8KKwkgICAgYnVmZmVyWzJdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCisJICAgIGJ1ZmZlclszXSA9IDA7CisJICAgIGJ1ZmZlcls0XSA9IDA7CisJICAgIGJ1ZmZlcls1XSA9IDA7CisJICAgIAorCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCisJICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwKKwkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOworCSAgICBmcmFnUC0+ZnJfZml4ICs9IFUzMl9MRU47CisJICB9CisKKwlmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogQXBwbGllcyB0aGUgZGVzaXJlZCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgQWxzbyBzZXRzIHVwIGFkZGVuZHMgZm9yICdyZWxhJyB0eXBlIHJlbG9jYXRpb25zLiAgKi8KK2ludAorbWRfYXBwbHlfZml4MyAoZml4UCwgdmFscCwgc2VnbWVudCkKKyAgICAgZml4UyAqICAgZml4UDsKKyAgICAgdmFsdWVUICogdmFscDsKKyAgICAgc2VnVCAgICAgc2VnbWVudDsKK3sKKyAgY2hhciAqICAgICAgIGJ1ZiAgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7CisgIGNoYXIgKiAgICAgICBmaWxlID0gZml4UC0+ZnhfZmlsZSA/IGZpeFAtPmZ4X2ZpbGUgOiBfKCJ1bmtub3duIik7CisgIGNvbnN0IGNoYXIgKiBzeW1uYW1lOworICAvKiBOb3RlOiB1c2Ugb2Zmc2V0VCBiZWNhdXNlIGl0IGlzIHNpZ25lZCwgdmFsdWVUIGlzIHVuc2lnbmVkLiAgKi8KKyAgb2Zmc2V0VCAgICAgIHZhbCAgPSAob2Zmc2V0VCkgKiB2YWxwOyAKKyAgCisgIHN5bW5hbWUgPSBmaXhQLT5meF9hZGRzeSA/IFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSA6IF8oIjx1bmtub3duPiIpOworICAvKiBTYXZlIHRoaXMgZm9yIHRoZSBhZGRlbmQgaW4gdGhlIHJlbG9jYXRpb24gcmVjb3JkLiAgKi8KKyAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOworCisgIC8qIElmIHRoZSBmaXggaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQsIG9yIG5vdAorICAgICBpbiB0aGUgc2FtZSBzZWdtZW50IGFzIHRoZSBmaXgsIHdlIGNhbm5vdCByZXNvbHZlIGl0IGhlcmUuICAqLworICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAorICAgICAgJiYgKCAgICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKKwkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnbWVudCkpKQorICAgIHsKKyAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOworI2lmZGVmIE9CSl9FTEYKKyAgICAgIC8qIEZvciBFTEYgd2UgY2FuIGp1c3QgcmV0dXJuIGFuZCBsZXQgdGhlIHJlbG9jIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQKKwkgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcuICBGb3IgQ09GRiB3ZSBzdGlsbCBoYXZlIHRvIGluc2VydCAndmFsJworCSBpbnRvIHRoZSBpbnNuIHNpbmNlIHRoZSBhZGRlbmQgZmllbGQgd2lsbCBiZSBpZ25vcmVkLiAgKi8KKyAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisgIAorICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6ICAgICAvKiBzZWNvbmQgYnl0ZSBvZiAyIGJ5dGUgb3Bjb2RlICovCisgICAgICBpZiAoKHZhbCAmIDEpICE9IDApCisJYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAorCQkgICAgICBfKCJvZGQgZGlzdGFuY2UgYnJhbmNoICgweCV4IGJ5dGVzKSIpLCB2YWwpOworICAgICAgdmFsIC89IDI7CisgICAgICBpZiAoKCh2YWwgJiB+MHgzZmYpICE9IDApICYmICgodmFsIHwgMHgzZmYpICE9IC0xKSkKKwlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCSAgICAgIF8oInBjcmVsIGZvciBicmFuY2ggdG8gJXMgdG9vIGZhciAoMHgleCkiKSwKKwkJICAgICAgc3ltbmFtZSwgdmFsKTsKKyAgICAgIGJ1ZlswXSB8PSAoKHZhbCA+PiA4KSAmIDB4Nyk7CisgICAgICBidWZbMV0gfD0gKHZhbCAmIDB4ZmYpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6CS8qIGxvd2VyIDggYml0cyBvZiAyIGJ5dGUgb3Bjb2RlICovCisgICAgICB2YWwgKz0gMzsKKyAgICAgIHZhbCAvPSA0OworICAgICAgaWYgKHZhbCAmIH4weGZmKQorCWFzX2JhZF93aGVyZSAoZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJICAgICAgXygicGNyZWwgZm9yIGxydy9qbXBpL2pzcmkgdG8gJXMgdG9vIGZhciAoMHgleCkiKSwKKwkJICAgICAgc3ltbmFtZSwgdmFsKTsKKyAgICAgIGVsc2UKKwlidWZbMV0gfD0gKHZhbCAmIDB4ZmYpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6CS8qIGxvb3B0IGluc3RydWN0aW9uICovCisgICAgICBpZiAoKHZhbCA8IC0zMikgfHwgKHZhbCA+IC0yKSkKKwlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCSAgICAgIF8oInBjcmVsIGZvciBsb29wdCB0b28gZmFyICgweCV4KSIpLCB2YWwpOworICAgICAgdmFsIC89IDI7CisgICAgICBidWZbMV0gfD0gKHZhbCAmIDB4Zik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKKyAgICAgIC8qIENvbmRpdGlvbmFsIGxpbmtlciBtYXAganNyaSB0byBic3IuICAqLworICAgICAgLyogSWYgaXRzIGEgbG9jYWwgdGFyZ2V0IGFuZCBjbG9zZSBlbm91Z2gsIGZpeCBpdC4gCisgICAgICAgICBOQjogPj0gLTJrIGZvciBiYWNrd2FyZHMgYnNyOyA8IDJrIGZvciBmb3J3YXJkcy4uLiAgKi8KKyAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwICYmIHZhbCA+PSAtMjA0OCAgJiYgdmFsIDwgMjA0OCkKKwl7CisJICBsb25nIG52YWwgPSAodmFsIC8gMikgJiAweDdmZjsKKwkgIG52YWwgfD0gTUNPUkVfSU5TVF9CU1I7CisJICAKKwkgIC8qIFJFUExBQ0UgdGhlIGluc3RydWN0aW9uLCBkb24ndCBqdXN0IG1vZGlmeSBpdC4gICovCisJICBidWZbMF0gPSAoKG52YWwgPj4gOCkgJiAweGZmKTsKKwkgIGJ1ZlsxXSA9IChudmFsICYgMHhmZik7CisJfQorICAgICAgZWxzZQorCWZpeFAtPmZ4X2RvbmUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMjoKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CisgICAgICBmaXhQLT5meF9kb25lID0gMDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKQorCXsKKwkgIC8qIElmIHRoZSBmaXggaXMgYW4gYWJzb2x1dGUgcmVsb2MgYmFzZWQgb24gYSBzeW1ib2wncworCSAgICAgYWRkcmVzcywgdGhlbiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQgdW50aWwgdGhlIGZpbmFsIGxpbmsuICAqLworCSAgZml4UC0+ZnhfZG9uZSA9IDA7CisJfQorI2lmZGVmIE9CSl9FTEYgICAgICAKKyAgICAgIGVsc2UKKyNlbmRpZgorCXsKKwkgIGlmIChmaXhQLT5meF9zaXplID09IDQpCisJICAgIHsKKwkgICAgICAqYnVmKysgPSB2YWwgPj4gMjQ7CisJICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OworCSAgICAgICpidWYrKyA9IHZhbCA+PiA4OworCSAgICAgICpidWYgPSB2YWw7CisJICAgIH0KKwkgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMiAmJiB2YWwgPj0gLTMyNzY4ICYmIHZhbCA8PSAzMjc2NykKKwkgICAgeworCSAgICAgICpidWYrKyA9IHZhbCA+PiA4OworCSAgICAgICpidWYgPSB2YWw7CisJICAgIH0KKwkgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSAmJiB2YWwgPj0gLTI1NiAmJiB2YWwgPD0gMjU1KQorCSAgICAqYnVmID0gdmFsOworCSAgZWxzZQorCSAgICBhYm9ydCAoKTsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIDA7IC8qIFJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiAgKi8KK30KKwordm9pZAorbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCisgICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Cit7CisgIC8qIElnbm9yZSBsZWFkaW5nIGhhc2ggc3ltYm9sLCBpZiBwb3Jlc2VudC4gICovCisgIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOworICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOworICAgIH0KK30KKworaW50IG1kX2xvbmdfanVtcF9zaXplOworCisvKiBDYWxsZWQganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLCByZXR1cm4gdGhlIGxlbmd0aAorICAgYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbi4gICovCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQorICAgICByZWdpc3RlciBmcmFnUyAqIGZyYWdQOworICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKK3sKKyAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKKyAgICB7CisgICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOREVGX0RJU1ApOgorICAgICAgLyogVXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24uICAqLworICAgICAgaWYgKCFmcmFnUC0+ZnJfc3ltYm9sKQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkNEMTIpOworCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aDsKKwl9CisgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCisJeworCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOQ0QxMik7CisJICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKKwkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGg7CisJICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgICAgCisgICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX0RJU1ApOgorICAgICAgLyogVXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24uICovCisgICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbAorCSAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQorCXsKKwkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKKwkgICAgIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoQ09ORF9KVU1QLCBDT05EMTIpOworCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDEyKV0ucmx4X2xlbmd0aDsKKwl9CisgICAgICBlbHNlIGlmIChmcmFnUC0+ZnJfc3ltYm9sKQorCXsKKwkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nLiAgKi8KKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOworCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKKwkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFdlIGtub3cgdGhlIGFicyB2YWx1ZS4gICovCisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgQ09ORDEyKTsKKwkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGg7CisJfQorCisgICAgICBicmVhazsKKyAgICB9CisgIAorICByZXR1cm4gZnJhZ1AtPmZyX3ZhcjsKK30KKworLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCisKK3ZvaWQKK21kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKKyAgICAgY2hhciAqIHB0cjsKKyAgICAgdmFsdWVUIHVzZTsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgc3dpdGNoIChuYnl0ZXMpCisgICAgeworICAgIGNhc2UgNDogKnB0cisrID0gKHVzZSA+PiAyNCkgJiAweGZmOyAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIDM6ICpwdHIrKyA9ICh1c2UgPj4gMTYpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSAyOiAqcHRyKysgPSAodXNlID4+ICA4KSAmIDB4ZmY7IC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMTogKnB0cisrID0gKHVzZSA+PiAgMCkgJiAweGZmOyAgICBicmVhazsKKyAgICBkZWZhdWx0OiBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1Qgc2VnbWVudDsKKyAgICAgdmFsdWVUIHNpemU7Cit7CisgIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KK30KKworCisvKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCisgICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KK2xvbmcKK21kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQorICAgICBmaXhTICogZml4cDsKKyAgICAgc2VnVCBzZWM7Cit7CisjaWZkZWYgT0JKX0VMRgorICAvKiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBkZWZpbmVkIGluIGFub3RoZXIgc2VjdGlvbgorICAgICB3ZSBsZWF2ZSB0aGUgYWRkIG51bWJlciBhbG9uZSBmb3IgdGhlIGxpbmtlciB0byBmaXggaXQgbGF0ZXIuCisgICAgIE9ubHkgYWNjb3VudCBmb3IgdGhlIFBDIHByZS1idW1wICh3aGljaCBpcyAyIGJ5dGVzIG9uIHRoZSBNQ29yZSkuICovCisgIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCisgICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQorCSAgfHwgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKKyAgICAgIAorICB7CisgICAgYXNzZXJ0IChmaXhwLT5meF9zaXplID09IDIpOwkvKiBtdXN0IGJlIGFuIGluc24gKi8KKyAgICByZXR1cm4gZml4cC0+Znhfc2l6ZTsKKyAgfQorI2VuZGlmCisKKyAgLyogVGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGdvaW5nIHRvIHJlc29sdmUgdGhpbmdzLi4uICovCisgIHJldHVybiAgZml4cC0+Znhfc2l6ZSArIGZpeHAtPmZ4X3doZXJlICsgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKK30KKworI2RlZmluZSBGKFNaLFBDUkVMKQkJKCgoU1opIDw8IDEpICsgKFBDUkVMKSkKKyNkZWZpbmUgTUFQKFNaLFBDUkVMLFRZUEUpCWNhc2UgRiAoU1osIFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKKworYXJlbGVudCAqCit0Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCisgICAgIGFzZWN0aW9uICogc2VjdGlvbjsKKyAgICAgZml4UyAqIGZpeHA7Cit7CisgIGFyZWxlbnQgKiByZWw7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworICBpbnQgaGFuZGxlZCA9IDA7CisKKyAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCisgICAgeworICAgICAgLyogVGhlc2UgY29uZnVzZSB0aGUgc2l6ZS9wY3JlbCBtYWNybyBhcHByb2FjaC4gKi8KKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CisgICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMjoKKyAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0OgorICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyOgorICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMjoKKyAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7CisgICAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgICAgc3dpdGNoIChGIChmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCkpCisgICAgICAgIHsKKyAgICAgICAgICBNQVAgKDEsIDAsIEJGRF9SRUxPQ184KTsKKyAgICAgICAgICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7CisgICAgICAgICAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOworICAgICAgICAgIE1BUCAoMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOworICAgICAgICAgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKKyAgICAgICAgICBNQVAgKDQsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7CisgICAgICAgIGRlZmF1bHQ6CisJICBjb2RlID0gZml4cC0+Znhfcl90eXBlOworICAgICAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlICVzcmVsb2NhdGlvbiIpLAorCQkgIGZpeHAtPmZ4X3NpemUsCisJICAgICAgICAgIGZpeHAtPmZ4X3BjcmVsID8gXygicGMtcmVsYXRpdmUiKSA6ICIiKTsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKyAgcmVsLT5zeW1fcHRyX3B0ciA9ICYgZml4cC0+ZnhfYWRkc3ktPmJzeW07CisgIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKyAgLyogQWx3YXlzIHBhc3MgdGhlIGFkZGVuZCBhbG9uZyEgICovCisgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOworCisgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7CisgIAorICBpZiAocmVsLT5ob3d0byA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgXygiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKKyAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKKyAgICAgIAorICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KKyAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKKyAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlbDsKK30KKworI2lmZGVmIE9CSl9FTEYKKy8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgorICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KKyAgIHJlbGF4aW5nLiAgKi8KK2ludAorbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQorICAgICBmaXhTICogZml4OworeworICBpZiAoICAgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCisgICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZml4IGNhbiBiZSBoYW5kbGVkIGJ5IEdBUywgZmFsc2UgaWYgaXQgbXVzdAorICAgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGxpbmtlci4gICovCitib29sZWFuCittY29yZV9maXhfYWRqdXN0YWJsZSAoZml4UCkKKyAgIGZpeFMgKiBmaXhQOworeworICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgCisgIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMuICAqLworICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAorICAgZHVtcHMgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcgdGhlIHNlY3Rpb24uICAqLworc3RhdGljIHZvaWQKK21jb3JlX3Nfc2VjdGlvbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBkdW1wX2xpdGVyYWxzICgwKTsKKworICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Cit9CisjZW5kaWYgLyogT0JKX0VMRiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5oIGIvZ2FzL2NvbmZpZy90Yy1tY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDg3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLW1jb3JlLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qIFRoaXMgZmlsZSBpcyB0Yy1tY29yZS5oCisKKyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2lmbmRlZglUQ19NQ09SRQorI2RlZmluZSBUQ19NQ09SRSAxCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICNlcnJvciBNQ09SRSBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKKyNlbmRpZgorCisjZGVmaW5lIFRBUkdFVF9BUkNICWJmZF9hcmNoX21jb3JlCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKKworLyogRG9uJ3Qgd3JpdGUgb3V0IHJlbG9jcyBmb3IgcGNyZWwgc3R1ZmYuICAqLworI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKCh4KS0+ZnhfYWRkc3kgfHwgKHgpLT5meF9zdWJzeSkgJiYgXAorCQkJICAgKHgpLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCkKKworI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUworCisjZGVmaW5lIFRDX1JFTE9DX01BTkdMRShhLGIsYykgdGNfcmVsb2NfbWFuZ2xlIChhLCBiLCBjKQorCisvKiBTb21lIHBzZXVkby1vcCBzZW1hbnRpYyBleHRlbnNpb25zLiAgKi8KKyNkZWZpbmUJUFNFVURPX0xDT01NX09QVElPTkFMX0FMSUdOCisKKyNkZWZpbmUgTElTVElOR19IRUFERVIgICAgICAgIAkiTS5DT1JFIEdBUyBWZXJzaW9uIDIuOS40IgorI2RlZmluZSBMSVNUSU5HX0xIU19DT05UX0xJTkVTCTQKKworI2RlZmluZSBORUVEX0ZYX1JfVFlQRQkxCisjZGVmaW5lIENPRkZfRkxBR1MgCTEKKworLyogV2Ugd2FudCBsb2NhbCBsYWJlbCBzdXBwb3J0LiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKyAgICAgCisjZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKKyAgCitleHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKKyNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQorI2RlZmluZSBtZF9lbmQJbWRfbWNvcmVfZW5kCisKKy8qIFdhbnQgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24gdG9vLi4uICovCisjZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQorCisjZGVmaW5lIE1EX0FQUExZX0ZJWDMgIC8qIFdlIHdhbnQgdGhlIHNlZ21lbnQgYXMgd2VsbC4gICovCisKKworCisjaWZkZWYgIE9CSl9DT0ZGCisKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtbWNvcmUtYmlnIiA6ICJwZS1tY29yZS1saXR0bGUiKQorCisjZGVmaW5lIFRBUkdFVF9TWU1CT0xfRklFTERTICBpbnQgc3lfZmxhZ3MgOworCisjZW5kaWYgLyogT0JKX0NPRkYgKi8KKworCisjaWZkZWYgT0JKX0VMRgorCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVsZjMyLW1jb3JlLWJpZyIgOiAiZWxmMzItbWNvcmUtbGl0dGxlIikKKworI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCisgIHsgIi5jdG9ycyIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKKyAgeyAiLmR0b3JzIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAorLyogT3RoZXIgc3BlY2lhbCBzZWN0aW9ucyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6IC5yZWdpbmZvLAorICAgLmxpYmxpc3QsIC5jb25mbGljdCwgLmdwdGFiLCAuZ290LCAuZHluYW1pYywgLnJlbC5keW4uICAqLworCisvKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKK2V4dGVybiBpbnQgbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKworI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgbWNvcmVfZml4X2FkanVzdGFibGUgKGZpeFApCitleHRlcm4gYm9vbGVhbiBtY29yZV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKworI2VuZGlmIC8qIE9CSl9FTEYgKi8KKworI2lmbmRlZiBUQVJHRVRfRk9STUFUCisjIGVycm9yIE5vIHRhcmdldCBmb3JtYXQgc3BlY2lmaWVkLgorI2VuZGlmCisKKyNpbmNsdWRlICJzdHJ1Yy1zeW1ib2wuaCIgLyogRm9yIGRlZmluaXRpb24gb2Ygc3ltYm9sUyAqLworI2luY2x1ZGUgIndyaXRlLmgiICAgICAgICAvKiBGb3IgZGVmaW5pdGlvbiBvZiBmaXhTICovCisgIAorZXh0ZXJuIHZvaWQgICAgICBtZF9iZWdpbiAgICAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgbWRfYXNzZW1ibGUgICAgICAgICBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiBzeW1ib2xTICogbWRfdW5kZWZpbmVkX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiB2b2lkICAgICAgbWRfbWNvcmVfZW5kICAgICAgICBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gY2hhciAqICAgIG1kX2F0b2YgICAgICAgICAgICAgUEFSQU1TICgoaW50LCBjaGFyICosIGludCAqKSk7CitleHRlcm4gaW50ICAgICAgIG1kX3BhcnNlX29wdGlvbiAgICAgUEFSQU1TICgoaW50LCBjaGFyICopKTsKK2V4dGVybiB2b2lkICAgICAgbWRfc2hvd191c2FnZSAgICAgICBQQVJBTVMgKChGSUxFICopKTsKK2V4dGVybiB2b2lkICAgICAgbWRfY3JlYXRlX3Nob3J0X2p1bXAgCisgIFBBUkFNUyAoKGNoYXIgKiwgYWRkcmVzc1QsIGFkZHJlc3NULCBmcmFnUyAqLCBzeW1ib2xTICopKTsKK2V4dGVybiB2b2lkICAgICAgbWRfY3JlYXRlX2xvbmdfanVtcAorICBQQVJBTVMgKChjaGFyICosIGFkZHJlc3NULCBhZGRyZXNzVCwgZnJhZ1MgKiwgc3ltYm9sUyAqKSk7CitleHRlcm4gdm9pZCAgICAgIG1kX2NvbnZlcnRfZnJhZyAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBmcmFnUyAqKSk7CitleHRlcm4gaW50ICAgICAgIG1kX2FwcGx5X2ZpeDMgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGZpeFMgKiwgdmFsdWVUICosIHNlZ1QpKTsKK2V4dGVybiB2b2lkICAgICAgbWRfb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOworZXh0ZXJuIGludCAgICAgICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqLCBzZWdUKSk7CitleHRlcm4gdm9pZCAgICAgIG1kX251bWJlcl90b19jaGFycyAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKK2V4dGVybiB2YWx1ZVQgICAgbWRfc2VjdGlvbl9hbGlnbiAgICAgICAgICAgICAgUEFSQU1TICgoc2VnVCwgdmFsdWVUKSk7CitleHRlcm4gbG9uZyAgICAgIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAgICAgICAgIFBBUkFNUyAoKGZpeFMgKiwgc2VnVCkpOworZXh0ZXJuIGFyZWxlbnQgKiB0Y19nZW5fcmVsb2MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKKworI2VuZGlmIC8qIFRDX01DT1JFICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1pcHMuYyBiL2dhcy9jb25maWcvdGMtbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODY1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLW1pcHMuYwpAQCAtMCwwICsxLDExNzgzIEBACisvKiB0Yy1taXBzLmMgLS0gYXNzZW1ibGUgY29kZSBmb3IgYSBNSVBTIGNoaXAuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgdGhlIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwuCisgICBXcml0dGVuIGJ5IEtlaXRoIEtub3dsZXMgYW5kIFJhbHBoIENhbXBiZWxsLCB3b3JraW5nIGluZGVwZW5kZW50bHkuCisgICBNb2RpZmllZCBmb3IgRUNPRkYgYW5kIFI0MDAwIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMKKyAgIFN1cHBvcnQuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmZGVmIFVTRV9TVERBUkcKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbmRpZgorI2lmZGVmIFVTRV9WQVJBUkdTCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgorI2luY2x1ZGUgIml0Ymwtb3BzLmgiCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKKyNlbHNlCisjZGVmaW5lIERCRyh4KQorI2VuZGlmCisKKyNpZmRlZiBPQkpfTUFZQkVfRUxGCisvKiBDbGVhbiB1cCBuYW1lc3BhY2Ugc28gd2UgY2FuIGluY2x1ZGUgb2JqLWVsZi5oIHRvby4gICovCitzdGF0aWMgaW50IG1pcHNfb3V0cHV0X2ZsYXZvciBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IG1pcHNfb3V0cHV0X2ZsYXZvciAoKSB7IHJldHVybiBPVVRQVVRfRkxBVk9SOyB9CisjdW5kZWYgT0JKX1BST0NFU1NfU1RBQgorI3VuZGVmIE9VVFBVVF9GTEFWT1IKKyN1bmRlZiBTX0dFVF9BTElHTgorI3VuZGVmIFNfR0VUX1NJWkUKKyN1bmRlZiBTX1NFVF9BTElHTgorI3VuZGVmIFNfU0VUX1NJWkUKKyN1bmRlZiBUQVJHRVRfU1lNQk9MX0ZJRUxEUworI3VuZGVmIG9ial9mcm9iX2ZpbGUKKyN1bmRlZiBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcworI3VuZGVmIG9ial9mcm9iX3N5bWJvbAorI3VuZGVmIG9ial9wb3BfaW5zZXJ0CisjdW5kZWYgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCisjdW5kZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKKworI2luY2x1ZGUgIm9iai1lbGYuaCIKKy8qIEZpeCBhbnkgb2YgdGhlbSB0aGF0IHdlIGFjdHVhbGx5IGNhcmUgYWJvdXQuICAqLworI3VuZGVmIE9VVFBVVF9GTEFWT1IKKyNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBtaXBzX291dHB1dF9mbGF2b3IoKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChPQkpfRUxGKQorI2luY2x1ZGUgImVsZi9taXBzLmgiCisjZW5kaWYKKworI2lmbmRlZiBFQ09GRl9ERUJVR0dJTkcKKyNkZWZpbmUgTk9fRUNPRkZfREVCVUdHSU5HCisjZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCisjZW5kaWYKKworI2luY2x1ZGUgImVjb2ZmLmgiCisKKyNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQorc3RhdGljIGNoYXIgKm1pcHNfcmVnbWFza19mcmFnOworI2VuZGlmCisKKyNkZWZpbmUgQVQgIDEKKyNkZWZpbmUgVFJFRyAyNAorI2RlZmluZSBQSUNfQ0FMTF9SRUcgMjUKKyNkZWZpbmUgS1QwIDI2CisjZGVmaW5lIEtUMSAyNworI2RlZmluZSBHUCAgMjgKKyNkZWZpbmUgU1AgIDI5CisjZGVmaW5lIEZQICAzMAorI2RlZmluZSBSQSAgMzEKKworI2RlZmluZSBJTExFR0FMX1JFRyAoMzIpCisKKy8qIEFsbG93IG92ZXJyaWRlIG9mIHN0YW5kYXJkIGxpdHRsZS1lbmRpYW4gRUNPRkYgZm9ybWF0LiAgKi8KKworI2lmbmRlZiBFQ09GRl9MSVRUTEVfRk9STUFUCisjZGVmaW5lIEVDT0ZGX0xJVFRMRV9GT1JNQVQgImVjb2ZmLWxpdHRsZW1pcHMiCisjZW5kaWYKKworZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKKworLyogMSBpcyB3ZSBzaG91bGQgdXNlIHRoZSA2NCBiaXQgTUlQUyBFTEYgQUJJLCAwIGlmIHdlIHNob3VsZCB1c2UgdGhlCisgICAzMiBiaXQgQUJJLiAgVGhpcyBoYXMgbm8gbWVhbmluZyBmb3IgRUNPRkYuCisgICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgYWx3YXlzIDMyIGJpdCwgZXZlbiBpZiAiY29uZmlndXJlZCIgZm9yCisgICA2NCBiaXQgW2UuZy4gLS10YXJnZXQ9bWlwczY0LWVsZl0uICAqLworc3RhdGljIGludCBtaXBzXzY0OworCisvKiBUaGUgZGVmYXVsdCB0YXJnZXQgZm9ybWF0IHRvIHVzZS4gICovCitjb25zdCBjaGFyICoKK21pcHNfdGFyZ2V0X2Zvcm1hdCAoKQoreworICBzd2l0Y2ggKE9VVFBVVF9GTEFWT1IpCisgICAgeworICAgIGNhc2UgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXI6CisgICAgICByZXR1cm4gdGFyZ2V0X2JpZ19lbmRpYW4gPyAiYS5vdXQtbWlwcy1iaWciIDogImEub3V0LW1pcHMtbGl0dGxlIjsKKyAgICBjYXNlIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cjoKKyAgICAgIHJldHVybiB0YXJnZXRfYmlnX2VuZGlhbiA/ICJlY29mZi1iaWdtaXBzIiA6IEVDT0ZGX0xJVFRMRV9GT1JNQVQ7CisgICAgY2FzZSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyOgorICAgICAgcmV0dXJuICh0YXJnZXRfYmlnX2VuZGlhbgorCSAgICAgID8gKG1pcHNfNjQgPyAiZWxmNjQtYmlnbWlwcyIgOiAiZWxmMzItYmlnbWlwcyIpCisJICAgICAgOiAobWlwc182NCA/ICJlbGY2NC1saXR0bGVtaXBzIiA6ICJlbGYzMi1saXR0bGVtaXBzIikpOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworLyogVGhlIG5hbWUgb2YgdGhlIHJlYWRvbmx5IGRhdGEgc2VjdGlvbi4gICovCisjZGVmaW5lIFJEQVRBX1NFQ1RJT05fTkFNRSAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciBcCisJCQkgICAgPyAiLmRhdGEiIFwKKwkJCSAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyIFwKKwkJCSAgICA/ICIucmRhdGEiIFwKKwkJCSAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91ciBcCisJCQkgICAgPyAiLnJvZGF0YSIgXAorCQkJICAgIDogKGFib3J0ICgpLCAiIikpCisKKy8qIFRoaXMgaXMgdGhlIHNldCBvZiBvcHRpb25zIHdoaWNoIG1heSBiZSBtb2RpZmllZCBieSB0aGUgLnNldAorICAgcHNldWRvLW9wLiAgV2UgdXNlIGEgc3RydWN0IHNvIHRoYXQgLnNldCBwdXNoIGFuZCAuc2V0IHBvcCBhcmUgbW9yZQorICAgcmVsaWFibGUuICAqLworCitzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucworeworICAvKiBNSVBTIElTQSAoSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSkgbGV2ZWwuICBUaGlzIGlzIHNldCB0byAtMQorICAgICBpZiBpdCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuICBDaGFuZ2VkIGJ5IGAuc2V0IG1pcHNOJywgYW5kIHRoZQorICAgICAtbWlwc04gY29tbWFuZCBsaW5lIG9wdGlvbiwgYW5kIHRoZSBkZWZhdWx0IENQVS4gICovCisgIGludCBpc2E7CisgIC8qIFdoZXRoZXIgd2UgYXJlIGFzc2VtYmxpbmcgZm9yIHRoZSBtaXBzMTYgcHJvY2Vzc29yLiAgMCBpZiB3ZSBhcmUKKyAgICAgbm90LCAxIGlmIHdlIGFyZSwgYW5kIC0xIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgIENoYW5nZWQgYnkgYC5zZXQgbWlwczE2JyBhbmQgYC5zZXQgbm9taXBzMTYnLCBhbmQgdGhlIC1taXBzMTYgYW5kCisgICAgIC1ub21pcHMxNiBjb21tYW5kIGxpbmUgb3B0aW9ucywgYW5kIHRoZSBkZWZhdWx0IENQVS4gICovCisgIGludCBtaXBzMTY7CisgIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgcmVvcmRlciBpbnN0cnVjdGlvbnMuICBDaGFuZ2VkIGJ5IGAuc2V0CisgICAgIHJlb3JkZXInIGFuZCBgLnNldCBub3Jlb3JkZXInLiAgKi8KKyAgaW50IG5vcmVvcmRlcjsKKyAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBwZXJtaXQgdGhlICRhdCAoJDEpIHJlZ2lzdGVyIHRvIGJlIHVzZWQKKyAgICAgaW4gaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldCBhdCcgYW5kIGAuc2V0IG5vYXQnLiAgKi8KKyAgaW50IG5vYXQ7CisgIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCB3YXJuIHdoZW4gYSBtYWNybyBpbnN0cnVjdGlvbiBleHBhbmRzIGludG8KKyAgICAgbW9yZSB0aGFuIG9uZSBtYWNoaW5lIGluc3RydWN0aW9uLiAgQ2hhbmdlZCBieSBgLnNldCBub21hY3JvJyBhbmQKKyAgICAgYC5zZXQgbWFjcm8nLiAgKi8KKyAgaW50IHdhcm5fYWJvdXRfbWFjcm9zOworICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IG1vdmUgaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldAorICAgICBtb3ZlJywgYC5zZXQgdm9sYXRpbGUnLCBgLnNldCBub21vdmUnLCBhbmQgYC5zZXQgbm92b2xhdGlsZScuICAqLworICBpbnQgbm9tb3ZlOworICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IG9wdGltaXplIGJyYW5jaGVzIGJ5IG1vdmluZyB0aGUgdGFyZ2V0CisgICAgIG9mIHRoZSBicmFuY2ggaW50byB0aGUgZGVsYXkgc2xvdC4gIEFjdHVhbGx5LCB3ZSBkb24ndCBwZXJmb3JtCisgICAgIHRoaXMgb3B0aW1pemF0aW9uIGFueWhvdy4gIENoYW5nZWQgYnkgYC5zZXQgYm9wdCcgYW5kIGAuc2V0CisgICAgIG5vYm9wdCcuICAqLworICBpbnQgbm9ib3B0OworICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IGF1dG9leHRlbmQgbWlwczE2IGluc3RydWN0aW9ucy4KKyAgICAgQ2hhbmdlZCBieSBgLnNldCBhdXRvZXh0ZW5kJyBhbmQgYC5zZXQgbm9hdXRvZXh0ZW5kJy4gICovCisgIGludCBub2F1dG9leHRlbmQ7Cit9OworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3Qgd2UgdXNlIHRvIGhvbGQgdGhlIGN1cnJlbnQgc2V0IG9mIG9wdGlvbnMuICBOb3RlCisgICB0aGF0IHdlIG11c3Qgc2V0IHRoZSBpc2EgYW5kIG1pcHMxNiBmaWVsZHMgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdAorICAgdGhleSBoYXZlIG5vdCBiZWVuIGluaXRpYWxpemVkLiAgKi8KKworc3RhdGljIHN0cnVjdCBtaXBzX3NldF9vcHRpb25zIG1pcHNfb3B0cyA9IHsgLTEsIC0xIH07CisKKy8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIG1hc2tzIG9mIHJlZ2lzdGVycyB1c2VkLgorICAgVGhlIG9iamVjdCBmb3JtYXQgY29kZSByZWFkcyB0aGVtIGFuZCBwdXRzIHRoZW0gaW4gdGhlIGFwcHJvcHJpYXRlCisgICBwbGFjZS4gICovCit1bnNpZ25lZCBsb25nIG1pcHNfZ3BybWFzazsKK3Vuc2lnbmVkIGxvbmcgbWlwc19jcHJtYXNrWzRdOworCisvKiBNSVBTIElTQSB3ZSBhcmUgdXNpbmcgZm9yIHRoaXMgb3V0cHV0IGZpbGUuICAqLworc3RhdGljIGludCBmaWxlX21pcHNfaXNhOworCisvKiBUaGUgQ1BVIHR5cGUgYXMgYSBudW1iZXI6IDIwMDAsIDMwMDAsIDQwMDAsIDQ0MDAsIGV0Yy4gICovCitzdGF0aWMgaW50IG1pcHNfY3B1ID0gLTE7CisKKy8qIFRoZSBhcmd1bWVudCBvZiB0aGUgLW1hYmk9IGZsYWcuICovCitzdGF0aWMgY2hhciogbWlwc19hYmlfc3RyaW5nID0gMDsKKworLyogV2V0aGVyIHdlIHNob3VsZCBtYXJrIHRoZSBmaWxlIEVBQkk2NCBvciBFQUJJMzIuICovCitzdGF0aWMgaW50IG1pcHNfZWFiaTY0ID0gMDsKKworLyogSWYgdGhleSBhc2tlZCBmb3IgbWlwczEgb3IgbWlwczIgYW5kIGEgY3B1IHRoYXQgaXMKKyAgIG1pcHMzIG9yIGdyZWF0ZXIsIHRoZW4gbWFyayB0aGUgb2JqZWN0IGZpbGUgMzJCSVRNT0RFLiAqLworc3RhdGljIGludCBtaXBzXzMyYml0bW9kZSA9IDA7CisKKy8qIFdoZXRoZXIgdGhlIHByb2Nlc3NvciB1c2VzIGhhcmR3YXJlIGludGVybG9ja3MgdG8gcHJvdGVjdCAKKyAgIHJlYWRzIGZyb20gdGhlIEhJIGFuZCBMTyByZWdpc3RlcnMsIGFuZCB0aHVzIGRvZXMgbm90CisgICByZXF1aXJlIG5vcHMgdG8gYmUgaW5zZXJ0ZWQuCisKKyAgIEZJWE1FOiBHQ0MgbWFrZXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIC1tY3B1PUZPTyBhbmQgLW1GT086CisgICAtbWNwdT1GT08gc2NoZWR1bGVzIGZvciBGT08sIGJ1dCBzdGlsbCBwcm9kdWNlcyBjb2RlIHRoYXQgbWVldHMgdGhlCisgICByZXF1aXJlbWVudHMgb2YgTUlQUyBJU0EgSS4gIEZvciBleGFtcGxlLCBpdCB3b24ndCBnZW5lcmF0ZSBhbnkKKyAgIEZPTy1zcGVjaWZpYyBpbnN0cnVjdGlvbnMsIGFuZCBpdCB3aWxsIHN0aWxsIGFzc3VtZSB0aGF0IGFueQorICAgc2NoZWR1bGluZyBoYXphcmRzIGRlc2NyaWJlZCBpbiBNSVBTIElTQSBJIGFyZSB0aGVyZSwgZXZlbiBpZiBGT08KKyAgIGhhcyBpbnRlcmxvY2tzLiAgLW1GT08gZ2l2ZXMgR0NDIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgY29kZSB0aGF0CisgICB3aWxsIG9ubHkgcnVuIG9uIGEgRk9POyBpdCB3aWxsIGdlbmVyYXRlIEZPTy1zcGVjaWZpYyBpbnN0cnVjdGlvbnMsCisgICBhbmQgYXNzdW1lIGludGVybG9ja3MgcHJvdmlkZWQgYnkgYSBGT08uCisKKyAgIEhvd2V2ZXIsIEdBUyBjdXJyZW50bHkgZG9lc24ndCBtYWtlIHRoaXMgZGlzdGluY3Rpb247IGJlZm9yZSBKYW4gMjgKKyAgIDE5OTksIEdBUydzIC1tY3B1PUZPTyBpbXBsaWVkIC1tRk9PLCB3aGljaCB2aW9sYXRlcyBHQ0MncworICAgYXNzdW1wdGlvbnMuICBUaGUgR0NDIGRyaXZlciBwYXNzZXMgdGhlc2UgZmxhZ3MgdGhyb3VnaCB0byBHQVMsIHNvCisgICBpZiBHQVMgYWN0dWFsbHkgZG9lcyBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbWVldCBNSVBTIElTQSBJIHdpdGgKKyAgIC1tRk9PLCB0aGVuIEdDQydzIC1tY3B1PUZPTyBmbGFnIGlzbid0IGdvaW5nIHRvIHdvcmsuCisKKyAgIEFuZCBmdXJ0aGVybW9yZSwgaXQgZGlkIG5vdCBhc3N1bWUgdGhhdCAtbUZPTyBpbXBsaWVkIC1tY3B1PUZPTywKKyAgIHdoaWNoIHNlZW1zIHNlbnNlbGVzcyAtLS0gd2h5IGdlbmVyYXRlIGNvZGUgd2hpY2ggd2lsbCBvbmx5IHJ1biBvbgorICAgYSBGT08sIGJ1dCBzY2hlZHVsZSBmb3Igc29tZXRoaW5nIGVsc2U/CisKKyAgIFNvIG5vdywgYXQgbGVhc3QsIC1tY3B1PUZPTyBhbmQgLW1GT08gYXJlIGV4YWN0bHkgZXF1aXZhbGVudC4KKworICAgLS0gSmltIEJsYW5keSA8amltYkBjeWdudXMuY29tPiAqLworCisjZGVmaW5lIGhpbG9faW50ZXJsb2NrcyAobWlwc19jcHUgPT0gNDAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICApCisKKy8qIFdoZXRoZXIgdGhlIHByb2Nlc3NvciB1c2VzIGhhcmR3YXJlIGludGVybG9ja3MgdG8gcHJvdGVjdCByZWFkcworICAgZnJvbSB0aGUgR1BScywgYW5kIHRodXMgZG9lcyBub3QgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkLiAgKi8KKyNkZWZpbmUgZ3ByX2ludGVybG9ja3MgXAorICAobWlwc19vcHRzLmlzYSA+PSAyICBcCisgICB8fCBtaXBzX2NwdSA9PSAzOTAwKQorCisvKiBBcyB3aXRoIG90aGVyICJpbnRlcmxvY2tzIiB0aGlzIGlzIHVzZWQgYnkgaGFyZHdhcmUgdGhhdCBoYXMgRlAKKyAgIChjby1wcm9jZXNzb3IpIGludGVybG9ja3MuICAqLworLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworI2RlZmluZSBjb3BfaW50ZXJsb2NrcyAobWlwc19jcHUgPT0gNDMwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkpCisKKy8qIE1JUFMgUElDIGxldmVsLiAgKi8KKworZW51bSBtaXBzX3BpY19sZXZlbAoreworICAvKiBEbyBub3QgZ2VuZXJhdGUgUElDIGNvZGUuICAqLworICBOT19QSUMsCisKKyAgLyogR2VuZXJhdGUgUElDIGNvZGUgYXMgaW4gSXJpeCA0LiAgVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQsIGFuZCBJJ20KKyAgICAgbm90IHN1cmUgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gICovCisgIElSSVg0X1BJQywKKworICAvKiBHZW5lcmF0ZSBQSUMgY29kZSBhcyBpbiB0aGUgU1ZSNCBNSVBTIEFCSS4gICovCisgIFNWUjRfUElDLAorCisgIC8qIEdlbmVyYXRlIFBJQyBjb2RlIHdpdGhvdXQgdXNpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlOiB0aGUgZGF0YQorICAgICBzZWdtZW50IGhhcyBhIG1heGltdW0gc2l6ZSBvZiA2NEssIGFsbCBkYXRhIHJlZmVyZW5jZXMgYXJlIG9mZgorICAgICB0aGUgJGdwIHJlZ2lzdGVyLCBhbmQgYWxsIHRleHQgcmVmZXJlbmNlcyBhcmUgUEMgcmVsYXRpdmUuICBUaGlzCisgICAgIGlzIHVzZWQgb24gc29tZSBlbWJlZGRlZCBzeXN0ZW1zLiAgKi8KKyAgRU1CRURERURfUElDCit9OworCitzdGF0aWMgZW51bSBtaXBzX3BpY19sZXZlbCBtaXBzX3BpYzsKKworLyogMSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgMzIgYml0IG9mZnNldHMgZnJvbSB0aGUgR1AgcmVnaXN0ZXIgaW4KKyAgIFNWUjRfUElDIG1vZGUuICBDdXJyZW50bHkgaGFzIG5vIG1lYW5pbmcgaW4gb3RoZXIgbW9kZXMuICAqLworc3RhdGljIGludCBtaXBzX2JpZ19nb3Q7CisKKy8qIDEgaWYgdHJhcCBpbnN0cnVjdGlvbnMgc2hvdWxkIHVzZWQgZm9yIG92ZXJmbG93IHJhdGhlciB0aGFuIGJyZWFrCisgICBpbnN0cnVjdGlvbnMuICAqLworc3RhdGljIGludCBtaXBzX3RyYXA7CisKKy8qIE5vbi16ZXJvIGlmIGFueSAuc2V0IG5vcmVvcmRlciBkaXJlY3RpdmVzIHdlcmUgdXNlZC4gICovCisKK3N0YXRpYyBpbnQgbWlwc19hbnlfbm9yZW9yZGVyOworCisvKiBUaGUgc2l6ZSBvZiB0aGUgc21hbGwgZGF0YSBzZWN0aW9uLiAgKi8KK3N0YXRpYyBpbnQgZ19zd2l0Y2hfdmFsdWUgPSA4OworLyogV2hldGhlciB0aGUgLUcgb3B0aW9uIHdhcyB1c2VkLiAgKi8KK3N0YXRpYyBpbnQgZ19zd2l0Y2hfc2VlbiA9IDA7CisKKyNkZWZpbmUgTl9STUFTSyAweGM0CisjZGVmaW5lIE5fVkZQICAgMHhkNAorCisvKiBJZiB3ZSBjYW4gZGV0ZXJtaW5lIGluIGFkdmFuY2UgdGhhdCBHUCBvcHRpbWl6YXRpb24gd29uJ3QgYmUKKyAgIHBvc3NpYmxlLCB3ZSBjYW4gc2tpcCB0aGUgcmVsYXhhdGlvbiBzdHVmZiB0aGF0IHRyaWVzIHRvIHByb2R1Y2UKKyAgIEdQLXJlbGF0aXZlIHJlZmVyZW5jZXMuICBUaGlzIG1ha2VzIGRlbGF5IHNsb3Qgb3B0aW1pemF0aW9uIHdvcmsKKyAgIGJldHRlci4KKworICAgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBwcm92aWRlIGEgZ3Vlc3MsIGJ1dCBpdCBzZWVtcyB0byB3b3JrIGZvcgorICAgZ2NjIG91dHB1dC4gIElmIGl0IGd1ZXNzZXMgd3JvbmcsIHRoZSBvbmx5IGxvc3Mgc2hvdWxkIGJlIGluCisgICBlZmZpY2llbmN5OyBpdCBzaG91bGRuJ3QgaW50cm9kdWNlIGFueSBidWdzLgorCisgICBJIGRvbid0IGtub3cgaWYgYSBmaXggaXMgbmVlZGVkIGZvciB0aGUgU1ZSNF9QSUMgbW9kZS4gIEkndmUgb25seQorICAgZml4ZWQgaXQgZm9yIHRoZSBub24tUElDIG1vZGUuICBLUiA5NS8wNC8wNyAgKi8KK3N0YXRpYyBpbnQgbm9waWNfbmVlZF9yZWxheCBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOworCisvKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7CisKKy8qIFRoZSBvcGNvZGUgaGFzaCB0YWJsZSB3ZSB1c2UgZm9yIHRoZSBtaXBzMTYuICAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1pcHMxNl9vcF9oYXNoID0gTlVMTDsKKworLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCisgICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKKyAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLworLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCisgICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KKy8qIEFsc28gbm90ZSB0aGF0IEMgc3R5bGUgY29tbWVudHMgYXJlIGFsd2F5cyBzdXBwb3J0ZWQuICAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogVGhpcyBhcnJheSBob2xkcyBtYWNoaW5lIHNwZWNpZmljIGxpbmUgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICovCitjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKKworLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLworLyogQXMgaW4gMGYxMi40NTYgKi8KKy8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7CisKKy8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKKyAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCisgICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KKyAqLworCitzdGF0aWMgY2hhciAqaW5zbl9lcnJvcjsKKworc3RhdGljIGludCBhdXRvX2FsaWduID0gMTsKKworLyogV2hlbiBvdXRwdXR0aW5nIFNWUjQgUElDIGNvZGUsIHRoZSBhc3NlbWJsZXIgbmVlZHMgdG8ga25vdyB0aGUKKyAgIG9mZnNldCBpbiB0aGUgc3RhY2sgZnJhbWUgZnJvbSB3aGljaCB0byByZXN0b3JlIHRoZSAkZ3AgcmVnaXN0ZXIuCisgICBUaGlzIGlzIHNldCBieSB0aGUgLmNwcmVzdG9yZSBwc2V1ZG8tb3AsIGFuZCBzYXZlZCBpbiB0aGlzCisgICB2YXJpYWJsZS4gICovCitzdGF0aWMgb2Zmc2V0VCBtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPSAtMTsKKworLyogVGhpcyBpcyB0aGUgcmVnaXN0ZXIgd2hpY2ggaG9sZHMgdGhlIHN0YWNrIGZyYW1lLCBhcyBzZXQgYnkgdGhlCisgICAuZnJhbWUgcHNldWRvLW9wLiAgVGhpcyBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IC5jcHJlc3RvcmUuICAqLworc3RhdGljIGludCBtaXBzX2ZyYW1lX3JlZyA9IFNQOworCisvKiBUbyBvdXRwdXQgTk9QIGluc3RydWN0aW9ucyBjb3JyZWN0bHksIHdlIG5lZWQgdG8ga2VlcCBpbmZvcm1hdGlvbgorICAgYWJvdXQgdGhlIHByZXZpb3VzIHR3byBpbnN0cnVjdGlvbnMuICAqLworCisvKiBXaGV0aGVyIHdlIGFyZSBvcHRpbWl6aW5nLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgMiBtZWFucyB0byByZW1vdmUKKyAgIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoIGluc3RydWN0aW9ucyB3aGVuIHBvc3NpYmxlLiAgQSB2YWx1ZQorICAgb2YgMSBtZWFucyB0byBub3Qgc3dhcCBicmFuY2hlcy4gIEEgdmFsdWUgb2YgMCBtZWFucyB0byBhbHdheXMKKyAgIGluc2VydCBOT1BzLiAgKi8KK3N0YXRpYyBpbnQgbWlwc19vcHRpbWl6ZSA9IDI7CisKKy8qIERlYnVnZ2luZyBsZXZlbC4gIC1nIHNldHMgdGhpcyB0byAyLiAgLWdOIHNldHMgdGhpcyB0byBOLiAgLWcwIGlzCisgICBlcXVpdmFsZW50IHRvIHNlZWluZyBubyAtZyBvcHRpb24gYXQgYWxsLiAgKi8KK3N0YXRpYyBpbnQgbWlwc19kZWJ1ZyA9IDA7CisKKy8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCitzdGF0aWMgc3RydWN0IG1pcHNfY2xfaW5zbiBwcmV2X2luc247CisKKy8qIFRoZSBpbnN0cnVjdGlvbiBiZWZvcmUgcHJldl9pbnNuLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlwc19jbF9pbnNuIHByZXZfcHJldl9pbnNuOworCisvKiBJZiB3ZSBkb24ndCB3YW50IGluZm9ybWF0aW9uIGZvciBwcmV2X2luc24gb3IgcHJldl9wcmV2X2luc24sIHdlCisgICBwb2ludCB0aGUgaW5zbl9tbyBmaWVsZCBhdCB0aGlzIGR1bW15IGludGVnZXIuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBkdW1teV9vcGNvZGUgPSB7IDAgfTsKKworLyogTm9uLXplcm8gaWYgcHJldl9pbnNuIGlzIHZhbGlkLiAgKi8KK3N0YXRpYyBpbnQgcHJldl9pbnNuX3ZhbGlkOworCisvKiBUaGUgZnJhZyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZnJhZyAqcHJldl9pbnNuX2ZyYWc7CisKKy8qIFRoZSBvZmZzZXQgaW50byBwcmV2X2luc25fZnJhZyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyBsb25nIHByZXZfaW5zbl93aGVyZTsKKworLyogVGhlIHJlbG9jIHR5cGUgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgaWYgYW55LiAgKi8KK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcHJldl9pbnNuX3JlbG9jX3R5cGU7CisKKy8qIFRoZSByZWxvYyBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBpZiBhbnkuICAqLworc3RhdGljIGZpeFMgKnByZXZfaW5zbl9maXhwOworCisvKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgZGVsYXkgc2xvdC4gICovCitzdGF0aWMgaW50IHByZXZfaW5zbl9pc19kZWxheV9zbG90OworCisvKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgLnNldCBub3Jlb3JkZXIuICAqLworc3RhdGljIGludCBwcmV2X2luc25fdW5yZW9yZGVyZWQ7CisKKy8qIE5vbi16ZXJvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIGFuIGV4dGVuZCBvcGNvZGUgKGlmCisgICBtaXBzMTYpLiAgKi8KK3N0YXRpYyBpbnQgcHJldl9pbnNuX2V4dGVuZGVkOworCisvKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgLnNldAorICAgbm9yZW9yZGVyLiAgKi8KK3N0YXRpYyBpbnQgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQ7CisKKy8qIElmIHRoaXMgaXMgc2V0LCBpdCBwb2ludHMgdG8gYSBmcmFnIGhvbGRpbmcgbm9wIGluc3RydWN0aW9ucyB3aGljaAorICAgd2VyZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHN0YXJ0IG9mIGEgbm9yZW9yZGVyIHNlY3Rpb24uICBJZiB0aG9zZQorICAgbm9wcyB0dXJuIG91dCB0byBiZSB1bm5lY2Vzc2FyeSwgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2FuIGJlCisgICBkZWNyZWFzZWQuICAqLworc3RhdGljIGZyYWdTICpwcmV2X25vcF9mcmFnOworCisvKiBUaGUgbnVtYmVyIG9mIG5vcCBpbnN0cnVjdGlvbnMgd2UgY3JlYXRlZCBpbiBwcmV2X25vcF9mcmFnLiAgKi8KK3N0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19ob2xkczsKKworLyogVGhlIG51bWJlciBvZiBub3AgaW5zdHJ1Y3Rpb25zIHRoYXQgd2Uga25vdyB3ZSBuZWVkIGluCisgICBwcmV2X25vcF9mcmFnLiAqLworc3RhdGljIGludCBwcmV2X25vcF9mcmFnX3JlcXVpcmVkOworCisvKiBUaGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB3ZSd2ZSBzZWVuIHNpbmNlIHByZXZfbm9wX2ZyYWcuICAqLworc3RhdGljIGludCBwcmV2X25vcF9mcmFnX3NpbmNlOworCisvKiBGb3IgRUNPRkYgYW5kIEVMRiwgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGFyZSBkb25lIGluIHR3bworICAgcGFydHMsIHdpdGggYSBISSByZWxvY2F0aW9uIGFuZCBhIExPIHJlbG9jYXRpb24uICBFYWNoIHJlbG9jYXRpb24KKyAgIGhhcyBvbmx5IDE2IGJpdHMgb2Ygc3BhY2UgdG8gc3RvcmUgYW4gYWRkZW5kLiAgVGhpcyBtZWFucyB0aGF0IGluCisgICBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBoYW5kbGUgY2FycmllcyBjb3JyZWN0bHksIGl0IG11c3QgYmUgYWJsZQorICAgdG8gbG9jYXRlIGJvdGggdGhlIEhJIGFuZCB0aGUgTE8gcmVsb2NhdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAgIHJlbG9jYXRpb25zIG11c3QgYXBwZWFyIGluIG9yZGVyIGluIHRoZSByZWxvY2F0aW9uIHRhYmxlLgorCisgICBJbiBvcmRlciB0byBpbXBsZW1lbnQgdGhpcywgd2Uga2VlcCB0cmFjayBvZiBlYWNoIHVubWF0Y2hlZCBISQorICAgcmVsb2NhdGlvbi4gIFdlIHRoZW4gc29ydCB0aGVtIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZQorICAgY29ycmVzcG9uZGluZyBMTyByZWxvY2F0aW9uLiAqLworCitzdHJ1Y3QgbWlwc19oaV9maXh1cAoreworICAvKiBOZXh0IEhJIGZpeHVwLiAgKi8KKyAgc3RydWN0IG1pcHNfaGlfZml4dXAgKm5leHQ7CisgIC8qIFRoaXMgZml4dXAuICAqLworICBmaXhTICpmaXhwOworICAvKiBUaGUgc2VjdGlvbiB0aGlzIGZpeHVwIGlzIGluLiAgKi8KKyAgc2VnVCBzZWc7Cit9OworCisvKiBUaGUgbGlzdCBvZiB1bm1hdGNoZWQgSEkgcmVsb2NzLiAgKi8KKworc3RhdGljIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICptaXBzX2hpX2ZpeHVwX2xpc3Q7CisKKy8qIE1hcCBub3JtYWwgTUlQUyByZWdpc3RlciBudW1iZXJzIHRvIG1pcHMxNiByZWdpc3RlciBudW1iZXJzLiAgKi8KKworI2RlZmluZSBYIElMTEVHQUxfUkVHCitzdGF0aWMgY29uc3QgaW50IG1pcHMzMl90b18xNl9yZWdfbWFwW10gPQoreworICBYLCBYLCAyLCAzLCA0LCA1LCA2LCA3LAorICBYLCBYLCBYLCBYLCBYLCBYLCBYLCBYLAorICAwLCAxLCBYLCBYLCBYLCBYLCBYLCBYLAorICBYLCBYLCBYLCBYLCBYLCBYLCBYLCBYCit9OworI3VuZGVmIFgKKworLyogTWFwIG1pcHMxNiByZWdpc3RlciBudW1iZXJzIHRvIG5vcm1hbCBNSVBTIHJlZ2lzdGVyIG51bWJlcnMuICAqLworCitzdGF0aWMgY29uc3QgaW50IG1pcHMxNl90b18zMl9yZWdfbWFwW10gPQoreworICAxNiwgMTcsIDIsIDMsIDQsIDUsIDYsIDcKK307CisMCisvKiBTaW5jZSB0aGUgTUlQUyBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIGZvcm1zIG9mIFBDIHJlbGF0aXZlCisgICBpbnN0cnVjdGlvbnMsIHdlIGRvIG5vdCBoYXZlIHRvIGRvIHJlbGF4aW5nIGFzIGlzIGRvbmUgb24gb3RoZXIKKyAgIHBsYXRmb3Jtcy4gIEhvd2V2ZXIsIHdlIGRvIGhhdmUgdG8gaGFuZGxlIEdQIHJlbGF0aXZlIGFkZHJlc3NpbmcKKyAgIGNvcnJlY3RseSwgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGEgc2ltaWxhciBwcm9ibGVtLgorCisgICBFdmVyeSBtYWNybyB0aGF0IHJlZmVycyB0byBhIHN5bWJvbCBjYW4gb2NjdXIgaW4gKGF0IGxlYXN0KSB0d28KKyAgIGZvcm1zLCBvbmUgd2l0aCBHUCByZWxhdGl2ZSBhZGRyZXNzaW5nIGFuZCBvbmUgd2l0aG91dC4gIEZvcgorICAgZXhhbXBsZSwgbG9hZGluZyBhIGdsb2JhbCB2YXJpYWJsZSBpbnRvIGEgcmVnaXN0ZXIgZ2VuZXJhbGx5IHVzZXMKKyAgIGEgbWFjcm8gaW5zdHJ1Y3Rpb24gbGlrZSB0aGlzOgorICAgICBsdyAkNCxpCisgICBJZiBpIGNhbiBiZSBhZGRyZXNzZWQgb2ZmIHRoZSBHUCByZWdpc3RlciAodGhpcyBpcyB0cnVlIGlmIGl0IGlzIGluCisgICB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24sIG9yIGlmIGl0IGlzIGtub3duIHRvIGJlIHNtYWxsZXIgdGhhbgorICAgdGhlIC1HIGFyZ3VtZW50KSB0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbjoKKyAgICAgbHcgJDQsaSgkZ3ApCisgICBUaGlzIGluc3RydWN0aW9uIHdpbGwgdXNlIGEgR1BSRUwgcmVsb2MuICBJZiBpIGNhbiBub3QgYmUgYWRkcmVzc2VkCisgICBvZmYgdGhlIEdQIHJlZ2lzdGVyLCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIHNlcXVlbmNlIHdpbGwgYmUgdXNlZDoKKyAgICAgbHVpICRhdCxpCisgICAgIGx3ICQ0LGkoJGF0KQorICAgSW4gdGhpcyBjYXNlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aWxsIGhhdmUgYSBISTE2IHJlbG9jLCBhbmQgdGhlCisgICBzZWNvbmQgcmVsb2Mgd2lsbCBoYXZlIGEgTE8xNiByZWxvYy4gIEJvdGggcmVsb2NzIHdpbGwgYmUgYWdhaW5zdAorICAgdGhlIHN5bWJvbCBpLgorCisgICBUaGUgaXNzdWUgaGVyZSBpcyB0aGF0IHdlIG1heSBub3Qga25vdyB3aGV0aGVyIGkgaXMgR1AgYWRkcmVzc2FibGUKKyAgIHVudGlsIGFmdGVyIHdlIHNlZSB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzIGl0LiAgVGhlcmVmb3JlLCB3ZQorICAgd2FudCB0byBiZSBhYmxlIHRvIGNob29zZSB0aGUgZmluYWwgaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugb25seSBhdAorICAgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHdheSBvdGhlcgorICAgcGxhdGZvcm1zIGNob29zZSB0aGUgc2l6ZSBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIG9ubHkgYXQgdGhlCisgICBlbmQgb2YgYXNzZW1ibHkuCisKKyAgIFdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHdlIGRvIG5vdCB1c2UgR1AKKyAgIGFkZHJlc3NpbmcgaW4gcXVpdGUgdGhlIHNhbWUgd2F5LCBidXQgdGhlIGlzc3VlIHN0aWxsIGFyaXNlcyBhcworICAgZXh0ZXJuYWwgc3ltYm9scyBhbmQgbG9jYWwgc3ltYm9scyBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisKKyAgIFdlIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYnkgYWN0dWFsbHkgZ2VuZXJhdGluZyBib3RoIHBvc3NpYmxlCisgICBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMuICBUaGUgbG9uZ2VyIG9uZSBpcyBwdXQgaW4gYSBmcmFnX3ZhciB3aXRoCisgICB0eXBlIHJzX21hY2hpbmVfZGVwZW5kZW50LiAgV2UgZW5jb2RlIHdoYXQgdG8gZG8gd2l0aCB0aGUgZnJhZyBpbgorICAgdGhlIHN1YnR5cGUgZmllbGQuICBXZSBlbmNvZGUgKDEpIHRoZSBudW1iZXIgb2YgZXhpc3RpbmcgYnl0ZXMgdG8KKyAgIHJlcGxhY2UsICgyKSB0aGUgbnVtYmVyIG9mIG5ldyBieXRlcyB0byB1c2UsICgzKSB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBzdGFydCBvZiB0aGUgZXhpc3RpbmcgYnl0ZXMgdG8gdGhlIGZpcnN0IHJlbG9jIHdlIG11c3QgZ2VuZXJhdGUKKyAgICh0aGF0IGlzLCB0aGUgb2Zmc2V0IGlzIGFwcGxpZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nCisgICBieXRlcyBhZnRlciB0aGV5IGFyZSByZXBsYWNlZCBieSB0aGUgbmV3IGJ5dGVzLCBpZiBhbnkpLCAoNCkgdGhlCisgICBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nIGJ5dGVzIHRvIHRoZSBzZWNvbmQgcmVsb2MsCisgICAoNSkgd2hldGhlciBhIHRoaXJkIHJlbG9jIGlzIG5lZWRlZCAodGhlIHRoaXJkIHJlbG9jIGlzIGFsd2F5cyBmb3VyCisgICBieXRlcyBhZnRlciB0aGUgc2Vjb25kIHJlbG9jKSwgYW5kICg2KSB3aGV0aGVyIHRvIHdhcm4gaWYgdGhpcworICAgdmFyaWFudCBpcyB1c2VkICh0aGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgaWYgLnNldCBub21hY3JvIG9yIC5zZXQKKyAgIG5vYXQgaXMgaW4gZWZmZWN0KS4gIEFsbCB0aGVzZSBudW1iZXJzIGFyZSByZWFzb25hYmx5IHNtYWxsLgorCisgICBHZW5lcmF0aW5nIHR3byBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSB0bworICAgZW5zdXJlIHRoYXQgZGVsYXkgc2xvdHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LiAgRm9ydHVuYXRlbHksIHRoZXJlCisgICBhcmUgYSBsaW1pdGVkIG51bWJlciBvZiBjYXNlcy4gIFdoZW4gdGhlIHNlY29uZCBpbnN0cnVjdGlvbgorICAgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkLCBhcHBlbmRfaW5zbiBpcyBkaXJlY3RlZCB0byBtYWludGFpbiB0aGUKKyAgIGV4aXN0aW5nIGRlbGF5IHNsb3QgaW5mb3JtYXRpb24sIHNvIGl0IGNvbnRpbnVlcyB0byBhcHBseSB0byBhbnkKKyAgIGNvZGUgYWZ0ZXIgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAgIHNlY29uZCBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBtdXN0IG5vdCBpbXBvc2UgYW55IHJlcXVpcmVtZW50cyBub3QKKyAgIHJlcXVpcmVkIGJ5IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KKworICAgVGhlc2UgdmFyaWFudCBmcmFncyBhcmUgdGhlbiBoYW5kbGVkIGluIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlCisgICBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUuICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCByZXR1cm5zCisgICB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgZnJhZy4gIG1kX2NvbnZlcnRfZnJhZyBzZXRzIHVwIHRoZSBmaW5hbCBmb3JtCisgICBvZiB0aGUgZnJhZy4gIHRjX2dlbl9yZWxvYyBhZGp1c3QgdGhlIGZpcnN0IHJlbG9jIGFuZCBhZGRzIGEgc2Vjb25kCisgICBvbmUgaWYgbmVlZGVkLiAgKi8KKyNkZWZpbmUgUkVMQVhfRU5DT0RFKG9sZCwgbmV3LCByZWxvYzEsIHJlbG9jMiwgcmVsb2MzLCB3YXJuKSBcCisgICgocmVsYXhfc3Vic3RhdGVUKSBcCisgICAoKChvbGQpIDw8IDIzKSBcCisgICAgfCAoKG5ldykgPDwgMTYpIFwKKyAgICB8ICgoKHJlbG9jMSkgKyA2NCkgPDwgOSkgXAorICAgIHwgKCgocmVsb2MyKSArIDY0KSA8PCAyKSBcCisgICAgfCAoKHJlbG9jMykgPyAoMSA8PCAxKSA6IDApIFwKKyAgICB8ICgod2FybikgPyAxIDogMCkpKQorI2RlZmluZSBSRUxBWF9PTEQoaSkgKCgoaSkgPj4gMjMpICYgMHg3ZikKKyNkZWZpbmUgUkVMQVhfTkVXKGkpICgoKGkpID4+IDE2KSAmIDB4N2YpCisjZGVmaW5lIFJFTEFYX1JFTE9DMShpKSAoKGJmZF92bWEpKCgoaSkgPj4gOSkgJiAweDdmKSAtIDY0KQorI2RlZmluZSBSRUxBWF9SRUxPQzIoaSkgKChiZmRfdm1hKSgoKGkpID4+IDIpICYgMHg3ZikgLSA2NCkKKyNkZWZpbmUgUkVMQVhfUkVMT0MzKGkpICgoKGkpID4+IDEpICYgMSkKKyNkZWZpbmUgUkVMQVhfV0FSTihpKSAoKGkpICYgMSkKKworLyogRm9yIG1pcHMxNiBjb2RlLCB3ZSB1c2UgYW4gZW50aXJlbHkgZGlmZmVyZW50IGZvcm0gb2YgcmVsYXhhdGlvbi4KKyAgIG1pcHMxNiBzdXBwb3J0cyB0d28gdmVyc2lvbnMgb2YgbW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggdGFrZQorICAgaW1tZWRpYXRlIHZhbHVlczogYSBzbWFsbCBvbmUgd2hpY2ggdGFrZXMgc29tZSBzbWFsbCB2YWx1ZSwgYW5kIGEKKyAgIGxhcmdlciBvbmUgd2hpY2ggdGFrZXMgYSAxNiBiaXQgdmFsdWUuICBTaW5jZSBicmFuY2hlcyBhbHNvIGZvbGxvdworICAgdGhpcyBwYXR0ZXJuLCByZWxheGluZyB0aGVzZSB2YWx1ZXMgaXMgcmVxdWlyZWQuCisKKyAgIFdlIGNhbiBhc3NlbWJsZSBib3RoIG1pcHMxNiBhbmQgbm9ybWFsIE1JUFMgY29kZSBpbiBhIHNpbmdsZQorICAgb2JqZWN0LiAgVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHJlbGF4YXRpb24gYXQKKyAgIHRoZSBzYW1lIHRpbWUgdGhhdCB3ZSBzdXBwb3J0IHRoZSByZWxheGF0aW9uIGRlc2NyaWJlZCBhYm92ZS4gIFdlCisgICB1c2UgdGhlIGhpZ2ggYml0IG9mIHRoZSBzdWJ0eXBlIGZpZWxkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzLgorCisgICBUaGUgaW5mb3JtYXRpb24gd2Ugc3RvcmUgZm9yIHRoaXMgdHlwZSBvZiByZWxheGF0aW9uIGlzIHRoZQorICAgYXJndW1lbnQgY29kZSBmb3VuZCBpbiB0aGUgb3Bjb2RlIGZpbGUgZm9yIHRoaXMgcmVsb2NhdGlvbiwgd2hldGhlcgorICAgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgYSBzbWFsbCBvciBleHRlbmRlZCBmb3JtLCBhbmQgd2hldGhlcgorICAgdGhlIHJlbG9jYXRpb24gaXMgaW4gYSBqdW1wIG9yIGphbCBkZWxheSBzbG90LiAgVGhhdCB0ZWxscyB1cyB0aGUKKyAgIHNpemUgb2YgdGhlIHZhbHVlLCBhbmQgaG93IGl0IHNob3VsZCBiZSBzdG9yZWQuICBXZSBhbHNvIHN0b3JlCisgICB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGV4dGVuZGVkIG9yIG5vdC4gIFdlIGFsc28KKyAgIHN0b3JlIHdoZXRoZXIgdGhpcyBpcyBrbm93biB0byBiZSBhIGJyYW5jaCB0byBhIGRpZmZlcmVudCBzZWN0aW9uLAorICAgd2hldGhlciB3ZSBoYXZlIHRyaWVkIHRvIHJlbGF4IHRoaXMgZnJhZyB5ZXQsIGFuZCB3aGV0aGVyIHdlIGhhdmUKKyAgIGV2ZXIgZXh0ZW5kZWQgYSBQQyByZWxhdGl2ZSBmcmFnbWVudCBiZWNhdXNlIG9mIGEgc2hpZnQgY291bnQuICAqLworI2RlZmluZSBSRUxBWF9NSVBTMTZfRU5DT0RFKHR5cGUsIHNtYWxsLCBleHQsIGRzbG90LCBqYWxfZHNsb3QpCVwKKyAgKDB4ODAwMDAwMDAJCQkJCQkJXAorICAgfCAoKHR5cGUpICYgMHhmZikJCQkJCQlcCisgICB8ICgoc21hbGwpID8gMHgxMDAgOiAwKQkJCQkJXAorICAgfCAoKGV4dCkgPyAweDIwMCA6IDApCQkJCQlcCisgICB8ICgoZHNsb3QpID8gMHg0MDAgOiAwKQkJCQkJXAorICAgfCAoKGphbF9kc2xvdCkgPyAweDgwMCA6IDApKQorI2RlZmluZSBSRUxBWF9NSVBTMTZfUChpKSAoKChpKSAmIDB4ODAwMDAwMDApICE9IDApCisjZGVmaW5lIFJFTEFYX01JUFMxNl9UWVBFKGkpICgoaSkgJiAweGZmKQorI2RlZmluZSBSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTChpKSAoKChpKSAmIDB4MTAwKSAhPSAwKQorI2RlZmluZSBSRUxBWF9NSVBTMTZfVVNFUl9FWFQoaSkgKCgoaSkgJiAweDIwMCkgIT0gMCkKKyNkZWZpbmUgUkVMQVhfTUlQUzE2X0RTTE9UKGkpICgoKGkpICYgMHg0MDApICE9IDApCisjZGVmaW5lIFJFTEFYX01JUFMxNl9KQUxfRFNMT1QoaSkgKCgoaSkgJiAweDgwMCkgIT0gMCkKKyNkZWZpbmUgUkVMQVhfTUlQUzE2X0VYVEVOREVEKGkpICgoKGkpICYgMHgxMDAwKSAhPSAwKQorI2RlZmluZSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRChpKSAoKGkpIHwgMHgxMDAwKQorI2RlZmluZSBSRUxBWF9NSVBTMTZfQ0xFQVJfRVhURU5ERUQoaSkgKChpKSAmfiAweDEwMDApCisjZGVmaW5lIFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSChpKSAoKChpKSAmIDB4MjAwMCkgIT0gMCkKKyNkZWZpbmUgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0goaSkgKChpKSB8IDB4MjAwMCkKKyNkZWZpbmUgUkVMQVhfTUlQUzE2X0NMRUFSX0xPTkdfQlJBTkNIKGkpICgoaSkgJn4gMHgyMDAwKQorDAorLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCisKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBpbnRlcm5hbEVycm9yKCkgXAorICAgIGFzX2ZhdGFsIChfKCJpbnRlcm5hbCBFcnJvciwgbGluZSAlZCwgJXMiKSwgX19MSU5FX18sIF9fRklMRV9fKQorI2Vsc2UKKyNkZWZpbmUgaW50ZXJuYWxFcnJvcigpIGFzX2ZhdGFsIChfKCJNSVBTIGludGVybmFsIEVycm9yIikpOworI2VuZGlmCisKK2VudW0gbWlwc19yZWdjbGFzcyB7IE1JUFNfR1JfUkVHLCBNSVBTX0ZQX1JFRywgTUlQUzE2X1JFRyB9OworCitzdGF0aWMgaW50IGluc25fdXNlc19yZWcgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqaXAsCisJCQkJICB1bnNpZ25lZCBpbnQgcmVnLCBlbnVtIG1pcHNfcmVnY2xhc3MgY2xhc3MpKTsKK3N0YXRpYyBpbnQgcmVnX25lZWRzX2RlbGF5IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgbWlwczE2X21hcmtfbGFiZWxzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGFwcGVuZF9pbnNuIFBBUkFNUyAoKGNoYXIgKnBsYWNlLAorCQkJCSBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXAsCisJCQkJIGV4cHJlc3Npb25TICogcCwKKwkJCQkgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHIsCisJCQkJIGJvb2xlYW4pKTsKK3N0YXRpYyB2b2lkIG1pcHNfbm9fcHJldl9pbnNuIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgbWlwc19lbWl0X2RlbGF5cyBQQVJBTVMgKChib29sZWFuKSk7CisjaWZkZWYgVVNFX1NUREFSRworc3RhdGljIHZvaWQgbWFjcm9fYnVpbGQgUEFSQU1TICgoY2hhciAqcGxhY2UsIGludCAqY291bnRlciwgZXhwcmVzc2lvblMgKiBlcCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZm10LAorCQkJCSAuLi4pKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtYWNyb19idWlsZCAoKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWlwczE2X21hY3JvX2J1aWxkIFBBUkFNUyAoKGNoYXIgKiwgaW50ICosIGV4cHJlc3Npb25TICosCisJCQkJCWNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJCQl2YV9saXN0KSk7CitzdGF0aWMgdm9pZCBtYWNyb19idWlsZF9sdWkgUEFSQU1TICgoY2hhciAqcGxhY2UsIGludCAqY291bnRlciwKKwkJCQkgICAgIGV4cHJlc3Npb25TICogZXAsIGludCByZWdudW0pKTsKK3N0YXRpYyB2b2lkIHNldF9hdCBQQVJBTVMgKChpbnQgKmNvdW50ZXIsIGludCByZWcsIGludCB1bnNpZ25lZHApKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2Fic29sdXRlX2V4cHIgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwLAorCQkJCQkgZXhwcmVzc2lvblMgKikpOworc3RhdGljIHZvaWQgbG9hZF9yZWdpc3RlciBQQVJBTVMgKChpbnQgKiwgaW50LCBleHByZXNzaW9uUyAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGxvYWRfYWRkcmVzcyBQQVJBTVMgKChpbnQgKmNvdW50ZXIsIGludCByZWcsIGV4cHJlc3Npb25TICplcCkpOworc3RhdGljIHZvaWQgbWFjcm8gUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7CitzdGF0aWMgdm9pZCBtaXBzMTZfbWFjcm8gUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7CisjaWZkZWYgTE9TSU5HX0NPTVBJTEVSCitzdGF0aWMgdm9pZCBtYWNybzIgUEFSQU1TICgoc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIG1pcHNfaXAgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKK3N0YXRpYyB2b2lkIG1pcHMxNl9pcCBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOworc3RhdGljIHZvaWQgbWlwczE2X2ltbWVkIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQsIG9mZnNldFQsIGJvb2xlYW4sCisJCQkJICBib29sZWFuLCBib29sZWFuLCB1bnNpZ25lZCBsb25nICosCisJCQkJICBib29sZWFuICosIHVuc2lnbmVkIHNob3J0ICopKTsKK3N0YXRpYyBpbnQgbXlfZ2V0U21hbGxFeHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXAsIGNoYXIgKnN0cikpOworc3RhdGljIHZvaWQgbXlfZ2V0RXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGVwLCBjaGFyICpzdHIpKTsKK3N0YXRpYyBzeW1ib2xTICpnZXRfc3ltYm9sIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIG1pcHNfYWxpZ24gUEFSQU1TICgoaW50IHRvLCBpbnQgZmlsbCwgc3ltYm9sUyAqbGFiZWwpKTsKK3N0YXRpYyB2b2lkIHNfYWxpZ24gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2NoYW5nZV9zZWMgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2NvbnMgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2Zsb2F0X2NvbnMgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX21pcHNfZ2xvYmwgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX29wdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbWlwc3NldCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfYWJpY2FsbHMgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2NwbG9hZCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfY3ByZXN0b3JlIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19ncHdvcmQgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2NwYWRkIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19pbnNuIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgbWRfb2JqX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIG1kX29ial9lbmQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGxvbmcgZ2V0X251bWJlciBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBzX21pcHNfZW50IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19taXBzX2VuZCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbWlwc19mcmFtZSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfbWlwc19tYXNrIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19taXBzX3N0YWIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX21pcHNfd2Vha2V4dCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHNfZmlsZSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBpbnQgbWlwczE2X2V4dGVuZGVkX2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgYXNlY3Rpb24gKiwgbG9uZykpOworCisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfbWlwc19pbnNuIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqKSk7CisMCisvKiBQc2V1ZG8tb3AgdGFibGUuCisKKyAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sKKyAgIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUsIGJ1dCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkOiAuYWxpYXMsCisgICAuZ2FsaXZlLCAuZ2phbGRlZiwgLmdqcmxpdmUsIC5saXZlcmVnLCAubm9hbGlhcy4KKworICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKKyAgIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBiZWluZyBnZW5lcmF0ZWQsIGFuZAorICAgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIG9iamVjdCBmb3JtYXQ6IC5hZW50LCAuYmVnaW4sIC5iZW5kLAorICAgLmJnbmIsIC5lbmQsIC5lbmRiLCAuZW50LCAuZm1hc2ssIC5mcmFtZSwgLmxvYywgLm1hc2ssIC52ZXJzdGFtcCwKKyAgIC52cmVnLgorCisgICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQorICAgbm90IE1JUFMgQ1BVIHNwZWNpZmljLCBidXQgYXJlIGFsc28gbm90IHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZQorICAgZm9ybWF0LiAgVGhpcyBmaWxlIGlzIHByb2JhYmx5IHRoZSBiZXN0IHBsYWNlIHRvIGRlZmluZSB0aGVtLCBidXQKKyAgIHRoZXkgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkOiAuYXNtMCwgLmVuZHIsIC5sYWIsIC5yZXBlYXQsCisgICAuc3RydWN0LiAgKi8KKworc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBtaXBzX3BzZXVkb190YWJsZVtdID0KK3sKKyAvKiBNSVBTIHNwZWNpZmljIHBzZXVkby1vcHMuICAqLworICB7Im9wdGlvbiIsIHNfb3B0aW9uLCAwfSwKKyAgeyJzZXQiLCBzX21pcHNzZXQsIDB9LAorICB7InJkYXRhIiwgc19jaGFuZ2Vfc2VjLCAncid9LAorICB7InNkYXRhIiwgc19jaGFuZ2Vfc2VjLCAncyd9LAorICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCisgIHsiYWJpY2FsbHMiLCBzX2FiaWNhbGxzLCAwfSwKKyAgeyJjcGxvYWQiLCBzX2NwbG9hZCwgMH0sCisgIHsiY3ByZXN0b3JlIiwgc19jcHJlc3RvcmUsIDB9LAorICB7Imdwd29yZCIsIHNfZ3B3b3JkLCAwfSwKKyAgeyJjcGFkZCIsIHNfY3BhZGQsIDB9LAorICB7Imluc24iLCBzX2luc24sIDB9LAorCisgLyogUmVsYXRpdmVseSBnZW5lcmljIHBzZXVkby1vcHMgdGhhdCBoYXBwZW4gdG8gYmUgdXNlZCBvbiBNSVBTCisgICAgIGNoaXBzLiAgKi8KKyAgeyJhc2NpaXoiLCBzdHJpbmdlciwgMX0sCisgIHsiYnNzIiwgc19jaGFuZ2Vfc2VjLCAnYid9LAorICB7ImVyciIsIHNfZXJyLCAwfSwKKyAgeyJoYWxmIiwgc19jb25zLCAxfSwKKyAgeyJkd29yZCIsIHNfY29ucywgM30sCisgIHsid2Vha2V4dCIsIHNfbWlwc193ZWFrZXh0LCAwfSwKKworIC8qIFRoZXNlIHBzZXVkby1vcHMgYXJlIGRlZmluZWQgaW4gcmVhZC5jLCBidXQgbXVzdCBiZSBvdmVycmlkZGVuCisgICAgIGhlcmUgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlci4gICovCisgIHsiYWxpZ24iLCBzX2FsaWduLCAwfSwKKyAgeyJieXRlIiwgc19jb25zLCAwfSwKKyAgeyJkYXRhIiwgc19jaGFuZ2Vfc2VjLCAnZCd9LAorICB7ImRvdWJsZSIsIHNfZmxvYXRfY29ucywgJ2QnfSwKKyAgeyJmbG9hdCIsIHNfZmxvYXRfY29ucywgJ2YnfSwKKyAgeyJnbG9ibCIsIHNfbWlwc19nbG9ibCwgMH0sCisgIHsiZ2xvYmFsIiwgc19taXBzX2dsb2JsLCAwfSwKKyAgeyJod29yZCIsIHNfY29ucywgMX0sCisgIHsiaW50Iiwgc19jb25zLCAyfSwKKyAgeyJsb25nIiwgc19jb25zLCAyfSwKKyAgeyJvY3RhIiwgc19jb25zLCA0fSwKKyAgeyJxdWFkIiwgc19jb25zLCAzfSwKKyAgeyJzaG9ydCIsIHNfY29ucywgMX0sCisgIHsic2luZ2xlIiwgc19mbG9hdF9jb25zLCAnZid9LAorICB7InN0YWJuIiwgc19taXBzX3N0YWIsICduJ30sCisgIHsidGV4dCIsIHNfY2hhbmdlX3NlYywgJ3QnfSwKKyAgeyJ3b3JkIiwgc19jb25zLCAyfSwKKyAgeyAwIH0sCit9OworCitzdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIG1pcHNfbm9uZWNvZmZfcHNldWRvX3RhYmxlW10gPSB7CisgLyogVGhlc2UgcHNldWRvLW9wcyBzaG91bGQgYmUgZGVmaW5lZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgorICAgIEhvd2V2ZXIsIGEub3V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGVtLCBzbyB3ZSBoYXZlIHZlcnNpb25zIGhlcmUuICAqLworICB7ImFlbnQiLCBzX21pcHNfZW50LCAxfSwKKyAgeyJiZ25iIiwgc19pZ25vcmUsIDB9LAorICB7ImVuZCIsIHNfbWlwc19lbmQsIDB9LAorICB7ImVuZGIiLCBzX2lnbm9yZSwgMH0sCisgIHsiZW50Iiwgc19taXBzX2VudCwgMH0sCisgIHsiZmlsZSIsIHNfZmlsZSwgMH0sCisgIHsiZm1hc2siLCBzX21pcHNfbWFzaywgJ0YnfSwKKyAgeyJmcmFtZSIsIHNfbWlwc19mcmFtZSwgMH0sCisgIHsibG9jIiwgc19pZ25vcmUsIDB9LAorICB7Im1hc2siLCBzX21pcHNfbWFzaywgJ1InfSwKKyAgeyJ2ZXJzdGFtcCIsIHNfaWdub3JlLCAwfSwKKyAgeyAwIH0sCit9OworCitleHRlcm4gdm9pZCBwb3BfaW5zZXJ0IFBBUkFNUyAoKGNvbnN0IHBzZXVkb190eXBlUyAqKSk7CisKK3ZvaWQKK21pcHNfcG9wX2luc2VydCAoKQoreworICBwb3BfaW5zZXJ0IChtaXBzX3BzZXVkb190YWJsZSk7CisgIGlmICghIEVDT0ZGX0RFQlVHR0lORykKKyAgICBwb3BfaW5zZXJ0IChtaXBzX25vbmVjb2ZmX3BzZXVkb190YWJsZSk7Cit9CisMCisvKiBTeW1ib2xzIGxhYmVsbGluZyB0aGUgY3VycmVudCBpbnNuLiAgKi8KKworc3RydWN0IGluc25fbGFiZWxfbGlzdAoreworICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpuZXh0OworICBzeW1ib2xTICpsYWJlbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICppbnNuX2xhYmVsczsKK3N0YXRpYyBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpmcmVlX2luc25fbGFiZWxzOworCitzdGF0aWMgdm9pZCBtaXBzX2NsZWFyX2luc25fbGFiZWxzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGlubGluZSB2b2lkCittaXBzX2NsZWFyX2luc25fbGFiZWxzICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKipwbDsKKworICBmb3IgKHBsID0gJmZyZWVfaW5zbl9sYWJlbHM7ICpwbCAhPSBOVUxMOyBwbCA9ICYoKnBsKS0+bmV4dCkKKyAgICA7CisgICpwbCA9IGluc25fbGFiZWxzOworICBpbnNuX2xhYmVscyA9IE5VTEw7Cit9CisMCitzdGF0aWMgY2hhciAqZXhwcl9lbmQ7CisKKy8qIEV4cHJlc3Npb25zIHdoaWNoIGFwcGVhciBpbiBpbnN0cnVjdGlvbnMuICBUaGVzZSBhcmUgc2V0IGJ5CisgICBtaXBzX2lwLiAgKi8KKworc3RhdGljIGV4cHJlc3Npb25TIGltbV9leHByOworc3RhdGljIGV4cHJlc3Npb25TIG9mZnNldF9leHByOworCisvKiBSZWxvY3MgYXNzb2NpYXRlZCB3aXRoIGltbV9leHByIGFuZCBvZmZzZXRfZXhwci4gICovCisKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgaW1tX3JlbG9jOworc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvZmZzZXRfcmVsb2M7CisKKy8qIFRoaXMgaXMgc2V0IGJ5IG1pcHNfaXAgaWYgaW1tX3JlbG9jIGlzIGFuIHVubWF0Y2hlZCBISTE2X1MgcmVsb2MuICAqLworCitzdGF0aWMgYm9vbGVhbiBpbW1fdW5tYXRjaGVkX2hpOworCisvKiBUaGVzZSBhcmUgc2V0IGJ5IG1pcHMxNl9pcCBpZiBhbiBleHBsaWNpdCBleHRlbnNpb24gaXMgdXNlZC4gICovCisKK3N0YXRpYyBib29sZWFuIG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dDsKKworI2lmZGVmIE1JUFNfU1RBQlNfRUxGCisvKiBUaGUgcGRyIHNlZ21lbnQgZm9yIHBlciBwcm9jZWR1cmUgZnJhbWUvcmVnbWFzayBpbmZvICovCisKK3N0YXRpYyBzZWdUIHBkcl9zZWc7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBJdCBzaG91bGQKKyAqIHNldCB1cCBhbGwgdGhlIHRhYmxlcywgZXRjLiB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLgorICovCit2b2lkCittZF9iZWdpbiAoKQoreworICBib29sZWFuIG9rID0gZmFsc2U7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsKKyAgY29uc3QgY2hhciAqY3B1OworICBjaGFyICphID0gTlVMTDsKKyAgaW50IGJyb2tlbiA9IDA7CisgIGludCBtaXBzX2lzYV9mcm9tX2NwdTsKKworICBjcHUgPSBUQVJHRVRfQ1BVOworICBpZiAoc3RyY21wIChjcHUgKyAoc2l6ZW9mIFRBUkdFVF9DUFUpIC0gMywgImVsIikgPT0gMCkKKyAgICB7CisgICAgICBhID0geG1hbGxvYyAoc2l6ZW9mIFRBUkdFVF9DUFUpOworICAgICAgc3RyY3B5IChhLCBUQVJHRVRfQ1BVKTsKKyAgICAgIGFbKHNpemVvZiBUQVJHRVRfQ1BVKSAtIDNdID0gJ1wwJzsKKyAgICAgIGNwdSA9IGE7CisgICAgfQorCisgIGlmIChtaXBzX2NwdSA8IDApCisgICAgeworICAgICAgLyogU2V0IG1pcHNfY3B1IGJhc2VkIG9uIFRBUkdFVF9DUFUsIHVubGVzcyBUQVJHRVRfQ1BVIGlzCisgICAgICAgICBqdXN0IHRoZSBnZW5lcmljICdtaXBzJywgaW4gd2hpY2ggY2FzZSBzZXQgbWlwc19jcHUgYmFzZWQKKyAgICAgICAgIG9uIHRoZSBnaXZlbiBJU0EsIGlmIGFueS4gKi8KKworICAgICAgaWYgKHN0cmNtcCAoY3B1LCAibWlwcyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAobWlwc19vcHRzLmlzYSA8IDApCisgICAgICAgICAgICBtaXBzX2NwdSA9IDMwMDA7ICAgCisKKyAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDIpCisgICAgICAgICAgICBtaXBzX2NwdSA9IDYwMDA7CisKKyAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDMpCisgICAgICAgICAgICBtaXBzX2NwdSA9IDQwMDA7CisKKyAgICAgICAgICBlbHNlIGlmIChtaXBzX29wdHMuaXNhID09IDQpCisgICAgICAgICAgICBtaXBzX2NwdSA9IDgwMDA7CisKKyAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgbWlwc19jcHUgPSAzMDAwOworICAgICAgICB9CisgICAgICAKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjM5MDAiKSA9PSAwCisgICAgICAgICAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHN0eDM5IikgPT0gMAorICAgICAgICAgICAgICAgKQorICAgICAgICBtaXBzX2NwdSA9IDM5MDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjYwMDAiKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczIiKSA9PSAwKQorICAgICAgICBtaXBzX2NwdSA9IDYwMDA7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0IikgPT0gMAorCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgInI0MDAwIikgPT0gMAorCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHMzIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA0MDAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0NDAwIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA0NDAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NG9yaW9uIikgPT0gMAorCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgInI0NjAwIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA0NjAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0NjUwIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA0NjUwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDMwMCIpID09IDApCisgICAgICAgIG1pcHNfY3B1ID0gNDMwMDsKKworICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQxMTEiKSA9PSAwKQorICAgICAgICBtaXBzX2NwdSA9IDQxMTE7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MTAwIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA0MTAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI0MDEwIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA0MDEwOworCisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjUwMDAiKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczY0dnI1MDAwIikgPT0gMCkKKyAgICAgICAgbWlwc19jcHUgPSA1MDAwOworCisKKworICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyODAwMCIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzNCIpID09IDApCisgICAgICAgIG1pcHNfY3B1ID0gODAwMDsKKyAgICAgIAorICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyMTAwMDAiKSA9PSAwKQorICAgICAgICBtaXBzX2NwdSA9IDEwMDAwOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHMxNiIpID09IDApCisgICAgICAgIG1pcHNfY3B1ID0gMDsgLyogRklYTUUgKi8KKworICAgICAgZWxzZQorICAgICAgICBtaXBzX2NwdSA9IDMwMDA7CisgICAgfQorCisgIGlmIChtaXBzX2NwdSA9PSAzMDAwCisgICAgICB8fCBtaXBzX2NwdSA9PSAzOTAwKQorICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gMTsKKworICBlbHNlIGlmIChtaXBzX2NwdSA9PSA2MDAwCisJICAgfHwgbWlwc19jcHUgPT0gNDAxMCkKKyAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDI7CisKKyAgZWxzZSBpZiAobWlwc19jcHUgPT0gNDAwMAorCSAgIHx8IG1pcHNfY3B1ID09IDQxMDAKKwkgICB8fCBtaXBzX2NwdSA9PSA0MTExCisJICAgfHwgbWlwc19jcHUgPT0gNDQwMAorCSAgIHx8IG1pcHNfY3B1ID09IDQzMDAKKwkgICB8fCBtaXBzX2NwdSA9PSA0NjAwCisJICAgfHwgbWlwc19jcHUgPT0gNDY1MCkKKyAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDM7CisKKyAgZWxzZSBpZiAobWlwc19jcHUgPT0gNTAwMAorCSAgIHx8IG1pcHNfY3B1ID09IDgwMDAKKyAgICAgICAgICAgICAgIHx8IG1pcHNfY3B1ID09IDEwMDAwKQorICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gNDsKKworICBlbHNlCisgICAgbWlwc19pc2FfZnJvbV9jcHUgPSAtMTsKKworICBpZiAobWlwc19vcHRzLmlzYSA9PSAtMSkKKyAgICB7CisgICAgICBpZiAobWlwc19pc2FfZnJvbV9jcHUgIT0gLTEpCisJbWlwc19vcHRzLmlzYSA9IG1pcHNfaXNhX2Zyb21fY3B1OworICAgICAgZWxzZQorCW1pcHNfb3B0cy5pc2EgPSAxOworICAgIH0KKworICBpZiAobWlwc19vcHRzLm1pcHMxNiA8IDApCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJtaXBzMTYiLCBzaXplb2YgIm1pcHMxNiIgLSAxKSA9PSAwKQorCW1pcHNfb3B0cy5taXBzMTYgPSAxOworICAgICAgZWxzZQorCW1pcHNfb3B0cy5taXBzMTYgPSAwOworICAgIH0KKworICAvKiBFbmQgb2YgVEFSR0VUX0NQVSBwcm9jZXNzaW5nLCBnZXQgcmlkIG9mIG1hbGxvY2VkIG1lbW9yeQorICAgICBpZiBuZWNlc3NhcnkuICovCisgIGNwdSA9IE5VTEw7CisgIGlmIChhICE9IE5VTEwpCisgICAgeworICAgIGZyZWUgKGEpOworICAgIGEgPSBOVUxMOworICAgIH0KKworICBpZiAobWlwc19vcHRzLmlzYSA8IDIgJiYgbWlwc190cmFwKQorICAgIGFzX2JhZCAoXygidHJhcCBleGNlcHRpb24gbm90IHN1cHBvcnRlZCBhdCBJU0EgMSIpKTsKKworICAvKiBTZXQgdGhlIEVBQkkga2luZCBiYXNlZCBvbiB0aGUgSVNBIGJlZm9yZSB0aGUgdXNlciBnZXRzCisgICAgIHRvIGNoYW5nZSB0aGUgSVNBIHdpdGggZGlyZWN0aXZlcy4gIFRoaXMgaXNuJ3QgcmVhbGx5CisgICAgIHRoZSBiZXN0LCBidXQgdGhlbiBuZWl0aGVyIGlzIGJhc2luZyB0aGUgYWJpIG9uIHRoZSBpc2EuICovICAgICAKKyAgaWYgKG1pcHNfb3B0cy5pc2EgPiAyIAorICAgICAgJiYgbWlwc19hYmlfc3RyaW5nCisgICAgICAmJiAwID09IHN0cmNtcCAobWlwc19hYmlfc3RyaW5nLCJlYWJpIikpCisgICAgbWlwc19lYWJpNjQgPSAxOworCisgIGlmIChtaXBzX2NwdSAhPSAwICYmIG1pcHNfY3B1ICE9IC0xKQorICAgIHsKKyAgICAgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgbWlwc19jcHUpOworCisgICAgICAvKiBJZiB0aGV5IGFza2VkIGZvciBtaXBzMSBvciBtaXBzMiBhbmQgYSBjcHUgdGhhdCBpcworCSBtaXBzMyBvciBncmVhdGVyLCB0aGVuIG1hcmsgdGhlIG9iamVjdCBmaWxlIDMyQklUTU9ERS4gKi8KKyAgICAgIGlmIChtaXBzX2lzYV9mcm9tX2NwdSAhPSAtMQorCSAgJiYgbWlwc19vcHRzLmlzYSA8PSAyICYmIG1pcHNfaXNhX2Zyb21fY3B1ID4gMikKKwltaXBzXzMyYml0bW9kZSA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChtaXBzX29wdHMuaXNhKQorCXsKKwljYXNlIDE6CisJICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDMwMDApOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA2MDAwKTsKKwkgIGJyZWFrOworCWNhc2UgMzoKKwkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgNDAwMCk7CisJICBicmVhazsKKwljYXNlIDQ6CisJICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDgwMDApOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoISBvaykKKyAgICBhc193YXJuIChfKCJDb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKKworICBmaWxlX21pcHNfaXNhID0gbWlwc19vcHRzLmlzYTsKKworICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtaXBzX29wY29kZXNbaV0ubmFtZTsKKworICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZtaXBzX29wY29kZXNbaV0pOworICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIpLAorCQkgICBtaXBzX29wY29kZXNbaV0ubmFtZSwgcmV0dmFsKTsKKwkgIC8qIFByb2JhYmx5IGEgbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbT8gIEdpdmUgdXAgbm93LiAgKi8KKwkgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKKwl9CisgICAgICBkbworCXsKKwkgIGlmIChtaXBzX29wY29kZXNbaV0ucGluZm8gIT0gSU5TTl9NQUNSTykKKwkgICAgeworCSAgICAgIGlmICghdmFsaWRhdGVfbWlwc19pbnNuICgmbWlwc19vcGNvZGVzW2ldKSkKKwkJYnJva2VuID0gMTsKKwkgICAgfQorCSAgKytpOworCX0KKyAgICAgIHdoaWxlICgoaSA8IE5VTU9QQ09ERVMpICYmICFzdHJjbXAgKG1pcHNfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7CisgICAgfQorCisgIG1pcHMxNl9vcF9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgYmZkX21pcHMxNl9udW1fb3Bjb2RlcykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gbWlwczE2X29wY29kZXNbaV0ubmFtZTsKKworICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG1pcHMxNl9vcF9oYXNoLCBuYW1lLCAoUFRSKSAmbWlwczE2X29wY29kZXNbaV0pOworICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCWFzX2ZhdGFsIChfKCJpbnRlcm5hbDogY2FuJ3QgaGFzaCBgJXMnOiAlcyIpLAorCQkgIG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7CisgICAgICBkbworCXsKKwkgIGlmIChtaXBzMTZfb3Bjb2Rlc1tpXS5waW5mbyAhPSBJTlNOX01BQ1JPCisJICAgICAgJiYgKChtaXBzMTZfb3Bjb2Rlc1tpXS5tYXRjaCAmIG1pcHMxNl9vcGNvZGVzW2ldLm1hc2spCisJCSAgIT0gbWlwczE2X29wY29kZXNbaV0ubWF0Y2gpKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogYmFkIG1pcHMxNiBvcGNvZGU6ICVzICVzXG4iKSwKKwkJICAgICAgIG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIG1pcHMxNl9vcGNvZGVzW2ldLmFyZ3MpOworCSAgICAgIGJyb2tlbiA9IDE7CisJICAgIH0KKwkgICsraTsKKwl9CisgICAgICB3aGlsZSAoaSA8IGJmZF9taXBzMTZfbnVtX29wY29kZXMKKwkgICAgICYmIHN0cmNtcCAobWlwczE2X29wY29kZXNbaV0ubmFtZSwgbmFtZSkgPT0gMCk7CisgICAgfQorCisgIGlmIChicm9rZW4pCisgICAgYXNfZmF0YWwgKF8oIkJyb2tlbiBhc3NlbWJsZXIuICBObyBhc3NlbWJseSBhdHRlbXB0ZWQuIikpOworCisgIC8qIFdlIGFkZCBhbGwgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgbmFtZXMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMKKyAgICAgaGVscHMgdXMgZGV0ZWN0IGludmFsaWQgdXNlcyBvZiB0aGVtLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgeworICAgICAgY2hhciBidWZbNV07CisKKyAgICAgIHNwcmludGYgKGJ1ZiwgIiQlZCIsIGkpOworICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCByZWdfc2VjdGlvbiwgaSwKKwkJCQkgICAgICAgJnplcm9fYWRkcmVzc19mcmFnKSk7CisgICAgfQorICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGZwIiwgcmVnX3NlY3Rpb24sIEZQLAorCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJHNwIiwgcmVnX3NlY3Rpb24sIFNQLAorCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGdwIiwgcmVnX3NlY3Rpb24sIEdQLAorCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGF0IiwgcmVnX3NlY3Rpb24sIEFULAorCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGt0MCIsIHJlZ19zZWN0aW9uLCBLVDAsCisJCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7CisgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIka3QxIiwgcmVnX3NlY3Rpb24sIEtUMSwKKwkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRwYyIsIHJlZ19zZWN0aW9uLCAtMSwKKwkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKKworICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOworCisgIG1pcHNfZ3BybWFzayA9IDA7CisgIG1pcHNfY3BybWFza1swXSA9IDA7CisgIG1pcHNfY3BybWFza1sxXSA9IDA7CisgIG1pcHNfY3BybWFza1syXSA9IDA7CisgIG1pcHNfY3BybWFza1szXSA9IDA7CisKKyAgLyogc2V0IHRoZSBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGhlIHRleHQgc2VjdGlvbiAoMioqMikgKi8KKyAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKKworICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKKyAgICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOworCisgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisgICAgeworICAgICAgLyogT24gYSBuYXRpdmUgc3lzdGVtLCBzZWN0aW9ucyBtdXN0IGJlIGFsaWduZWQgdG8gMTYgYnl0ZQorCSBib3VuZGFyaWVzLiAgV2hlbiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYgdGFyZ2V0LCB3ZQorCSBkb24ndCBib3RoZXIuICAqLworICAgICAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKKwl7CisJICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sIDQpOworCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCA0KTsKKwkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIGJzc19zZWN0aW9uLCA0KTsKKwl9CisKKyAgICAgIC8qIENyZWF0ZSBhIC5yZWdpbmZvIHNlY3Rpb24gZm9yIHJlZ2lzdGVyIG1hc2tzIGFuZCBhIC5tZGVidWcKKwkgc2VjdGlvbiBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIHsKKwlzZWdUIHNlZzsKKwlzdWJzZWdUIHN1YnNlZzsKKwlmbGFnd29yZCBmbGFnczsKKwlzZWdUIHNlYzsKKworCXNlZyA9IG5vd19zZWc7CisJc3Vic2VnID0gbm93X3N1YnNlZzsKKworCS8qIFRoZSBBQkkgc2F5cyB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIGxvYWRlZCBzbyB0aGF0IHRoZQorCSAgIHJ1bm5pbmcgcHJvZ3JhbSBjYW4gYWNjZXNzIGl0LiAgSG93ZXZlciwgd2UgZG9uJ3QgbG9hZCBpdAorCSAgIGlmIHdlIGFyZSBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCB0YXJnZXQgKi8KKwlmbGFncyA9IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBOworCWlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCisJICBmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKKworCWlmICghIG1pcHNfNjQpCisJICB7CisJICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIucmVnaW5mbyIsIChzdWJzZWdUKSAwKTsKKworCisJICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7CisJICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMik7CisJCisjaWZkZWYgT0JKX0VMRgorCSAgICBtaXBzX3JlZ21hc2tfZnJhZyA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7CisjZW5kaWYKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIFRoZSA2NC1iaXQgQUJJIHVzZXMgYSAuTUlQUy5vcHRpb25zIHNlY3Rpb24gcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgIC5yZWdpbmZvIHNlY3Rpb24uICAqLworCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLk1JUFMub3B0aW9ucyIsIChzdWJzZWdUKSAwKTsKKwkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKTsKKwkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAzKTsKKworI2lmZGVmIE9CSl9FTEYKKwkgICAgLyogU2V0IHVwIHRoZSBvcHRpb24gaGVhZGVyLiAgKi8KKwkgICAgeworCSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zIG9wdGhkcjsKKwkgICAgICBjaGFyICpmOworCisJICAgICAgb3B0aGRyLmtpbmQgPSBPREtfUkVHSU5GTzsKKwkgICAgICBvcHRoZHIuc2l6ZSA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQorCQkJICAgICArIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpOworCSAgICAgIG9wdGhkci5zZWN0aW9uID0gMDsKKwkgICAgICBvcHRoZHIuaW5mbyA9IDA7CisJICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykpOworCSAgICAgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0IChzdGRvdXRwdXQsICZvcHRoZHIsCisJCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGYpOworCisJICAgICAgbWlwc19yZWdtYXNrX2ZyYWcgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykpOworCSAgICB9CisjZW5kaWYKKwkgIH0KKworCWlmIChFQ09GRl9ERUJVR0dJTkcpCisJICB7CisJICAgIHNlYyA9IHN1YnNlZ19uZXcgKCIubWRlYnVnIiwgKHN1YnNlZ1QpIDApOworCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywKKwkJCQkJICBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFQURPTkxZKTsKKwkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VjLCAyKTsKKwkgIH0KKworI2lmZGVmIE1JUFNfU1RBQlNfRUxGCisJcGRyX3NlZyA9IHN1YnNlZ19uZXcgKCIucGRyIiwgKHN1YnNlZ1QpIDApOworCSh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgcGRyX3NlZywKKwkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX1JFTE9DIHwgU0VDX0RFQlVHR0lORyk7CisJKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcGRyX3NlZywgMik7CisjZW5kaWYKKworCXN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKKyAgICAgIH0KKyAgICB9CisKKyAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQorICAgIG1kX29ial9iZWdpbiAoKTsKK30KKwordm9pZAorbWRfbWlwc19lbmQgKCkKK3sKKyAgaWYgKCEgRUNPRkZfREVCVUdHSU5HKQorICAgIG1kX29ial9lbmQgKCk7Cit9CisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOworCisgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKyAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKKyAgaW1tX3VubWF0Y2hlZF9oaSA9IGZhbHNlOworICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7CisgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7CisKKyAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCisgICAgbWlwczE2X2lwIChzdHIsICZpbnNuKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1pcHNfaXAgKHN0ciwgJmluc24pOworICAgICAgREJHKChfKCJyZXR1cm5lZCBmcm9tIG1pcHNfaXAoJXMpIGluc25fb3Bjb2RlID0gMHgleFxuIiksIAorCQlzdHIsIGluc24uaW5zbl9vcGNvZGUpKTsKKyAgICB9CisKKyAgaWYgKGluc25fZXJyb3IpCisgICAgeworICAgICAgYXNfYmFkICgiJXMgYCVzJyIsIGluc25fZXJyb3IsIHN0cik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChpbnNuLmluc25fbW8tPnBpbmZvID09IElOU05fTUFDUk8pCisgICAgeworICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCisJbWlwczE2X21hY3JvICgmaW5zbik7CisgICAgICBlbHNlCisJbWFjcm8gKCZpbnNuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2Fic2VudCkKKwlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sICZpbW1fZXhwciwgaW1tX3JlbG9jLAorCQkgICAgIGltbV91bm1hdGNoZWRfaGkpOworICAgICAgZWxzZSBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2Fic2VudCkKKwlhcHBlbmRfaW5zbiAoKGNoYXIgKikgTlVMTCwgJmluc24sICZvZmZzZXRfZXhwciwgb2Zmc2V0X3JlbG9jLCBmYWxzZSk7CisgICAgICBlbHNlCisJYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCBOVUxMLCBCRkRfUkVMT0NfVU5VU0VELCBmYWxzZSk7CisgICAgfQorfQorCisvKiBTZWUgd2hldGhlciBpbnN0cnVjdGlvbiBJUCByZWFkcyByZWdpc3RlciBSRUcuICBDTEFTUyBpcyB0aGUgdHlwZQorICAgb2YgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgaW50CitpbnNuX3VzZXNfcmVnIChpcCwgcmVnLCBjbGFzcykKKyAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7CisgICAgIHVuc2lnbmVkIGludCByZWc7CisgICAgIGVudW0gbWlwc19yZWdjbGFzcyBjbGFzczsKK3sKKyAgaWYgKGNsYXNzID09IE1JUFMxNl9SRUcpCisgICAgeworICAgICAgYXNzZXJ0IChtaXBzX29wdHMubWlwczE2KTsKKyAgICAgIHJlZyA9IG1pcHMxNl90b18zMl9yZWdfbWFwW3JlZ107CisgICAgICBjbGFzcyA9IE1JUFNfR1JfUkVHOworICAgIH0KKworICAvKiBEb24ndCByZXBvcnQgb24gZ2VuZXJhbCByZWdpc3RlciAwLCBzaW5jZSBpdCBuZXZlciBjaGFuZ2VzLiAgKi8KKyAgaWYgKGNsYXNzID09IE1JUFNfR1JfUkVHICYmIHJlZyA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChjbGFzcyA9PSBNSVBTX0ZQX1JFRykKKyAgICB7CisgICAgICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7CisgICAgICAvKiBJZiB3ZSBhcmUgY2FsbGVkIHdpdGggZWl0aGVyICRmMCBvciAkZjEsIHdlIG11c3QgY2hlY2sgJGYwLgorCSBUaGlzIGlzIG5vdCBvcHRpbWFsLCBiZWNhdXNlIGl0IHdpbGwgaW50cm9kdWNlIGFuIHVubmVjZXNzYXJ5CisJIE5PUCBiZXR3ZWVuICJsd2MxICRmMCIgYW5kICJzd2MxICRmMSIuICBUbyBmaXggdGhpcyB3ZSB3b3VsZAorCSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHJlYWRpbmcgYm90aCAkZjAgYW5kICRmMSBvciBqdXN0IG9uZSBvZgorCSB0aGVtLiAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIG90aGVyIHdheSwKKwkgYmVjYXVzZSB0aGVyZSBpcyBubyBpbnN0cnVjdGlvbiB0aGF0IHNldHMgYm90aCAkZjAgYW5kICRmMQorCSBhbmQgcmVxdWlyZXMgYSBkZWxheS4gICovCisgICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9GUFJfUykKKwkgICYmICgoKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUykgJn4odW5zaWduZWQpMSkKKwkgICAgICA9PSAocmVnICZ+ICh1bnNpZ25lZCkgMSkpKQorCXJldHVybiAxOworICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfRlBSX1QpCisJICAmJiAoKCgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpICZ+KHVuc2lnbmVkKTEpCisJICAgICAgPT0gKHJlZyAmfiAodW5zaWduZWQpIDEpKSkKKwlyZXR1cm4gMTsKKyAgICB9CisgIGVsc2UgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKKyAgICB7CisgICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9HUFJfUykKKwkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpID09IHJlZykKKwlyZXR1cm4gMTsKKyAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0dQUl9UKQorCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkgPT0gcmVnKQorCXJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9YKQorCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKQorCQkJCSAgICAmIE1JUFMxNk9QX01BU0tfUlgpXQorCSAgICAgID09IHJlZykpCisJcmV0dXJuIDE7CisgICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWSkKKwkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWSkKKwkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0KKwkgICAgICA9PSByZWcpKQorCXJldHVybiAxOworICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1opCisJICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfTU9WRTMyWikKKwkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopXQorCSAgICAgID09IHJlZykpCisJcmV0dXJuIDE7CisgICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfVCkgJiYgcmVnID09IFRSRUcpCisJcmV0dXJuIDE7CisgICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfU1ApICYmIHJlZyA9PSBTUCkKKwlyZXR1cm4gMTsKKyAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF8zMSkgJiYgcmVnID09IFJBKQorCXJldHVybiAxOworICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YKQorCSAgJiYgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQorCSAgICAgICYgTUlQUzE2T1BfTUFTS19SRUdSMzIpID09IHJlZykKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIG1vZGlmeWluZyBhIHJlZ2lzdGVyIHJlcXVpcmVzIGEKKyAgIGRlbGF5LiAgKi8KKworc3RhdGljIGludAorcmVnX25lZWRzX2RlbGF5IChyZWcpCisgICAgIGludCByZWc7Cit7CisgIHVuc2lnbmVkIGxvbmcgcHJldl9waW5mbzsKKworICBwcmV2X3BpbmZvID0gcHJldl9pbnNuLmluc25fbW8tPnBpbmZvOworICBpZiAoISBtaXBzX29wdHMubm9yZW9yZGVyCisgICAgICAmJiBtaXBzX29wdHMuaXNhIDwgNAorICAgICAgJiYgKChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKKwkgIHx8ICghIGdwcl9pbnRlcmxvY2tzCisJICAgICAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkpKQorICAgIHsKKyAgICAgIC8qIEEgbG9hZCBmcm9tIGEgY29wcm9jZXNzb3Igb3IgZnJvbSBtZW1vcnkuICBBbGwgbG9hZAorCSBkZWxheXMgZGVsYXkgdGhlIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIHJ0IGZvciBvbmUKKwkgaW5zdHJ1Y3Rpb24gb24gdGhlIHIzMDAwLiAgVGhlIHI2MDAwIGFuZCByNDAwMCB1c2UKKwkgaW50ZXJsb2Nrcy4gICovCisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBrbm93IChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCk7CisgICAgICBpZiAocmVnID09ICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpKQorCXJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bworICAgaGFuZGxlIHRoZW0gc3BlY2lhbGx5LCBzdWNoIGFzIGdlbmVyYXRpbmcgamFseCBpbnN0cnVjdGlvbnMgd2hlbgorICAgbmVlZGVkLiAgV2UgYWxzbyBtYWtlIHRoZW0gb2RkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFzc2VtYmx5LCBpbgorICAgb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHJpZ2h0IHNvcnQgb2YgY29kZS4gIFdlIHdpbGwgbWFrZSB0aGVtIGV2ZW4KKyAgIGluIHRoZSBhZGp1c3Rfc3ltdGFiIHJvdXRpbmUsIHdoaWxlIGxlYXZpbmcgdGhlbSBtYXJrZWQuICBUaGlzIGlzCisgICBjb252ZW5pZW50IGZvciB0aGUgZGVidWdnZXIgYW5kIHRoZSBkaXNhc3NlbWJsZXIuICBUaGUgbGlua2VyIGtub3dzCisgICB0byBtYWtlIHRoZW0gb2RkIGFnYWluLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHMxNl9tYXJrX2xhYmVscyAoKQoreworICBpZiAobWlwc19vcHRzLm1pcHMxNikKKyAgICB7CisgICAgICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOworCisgICAgICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKwl7CisjaWZkZWYgT0JKX0VMRgorCSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKwkgICAgU19TRVRfT1RIRVIgKGwtPmxhYmVsLCBTVE9fTUlQUzE2KTsKKyNlbmRpZgorCSAgaWYgKChsLT5sYWJlbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyICYgMSkgPT0gMCkKKwkgICAgKytsLT5sYWJlbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOworCX0KKyAgICB9Cit9CisKKy8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbi4gIFBMQUNFIGlzIHdoZXJlIHRvIHB1dCB0aGUgaW5zdHJ1Y3Rpb247IGlmCisgICBpdCBpcyBOVUxMLCB0aGlzIHVzZXMgZnJhZ19tb3JlIHRvIGdldCByb29tLiAgSVAgaXMgdGhlIGluc3RydWN0aW9uCisgICBpbmZvcm1hdGlvbi4gIEFERFJFU1NfRVhQUiBpcyBhbiBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZQorICAgdXNlZCB3aXRoIFJFTE9DX1RZUEUuICAqLworCitzdGF0aWMgdm9pZAorYXBwZW5kX2luc24gKHBsYWNlLCBpcCwgYWRkcmVzc19leHByLCByZWxvY190eXBlLCB1bm1hdGNoZWRfaGkpCisgICAgIGNoYXIgKnBsYWNlOworICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKKyAgICAgZXhwcmVzc2lvblMgKmFkZHJlc3NfZXhwcjsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7CisgICAgIGJvb2xlYW4gdW5tYXRjaGVkX2hpOworeworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHByZXZfcGluZm8sIHBpbmZvOworICBjaGFyICpmOworICBmaXhTICpmaXhwOworICBpbnQgbm9wcyA9IDA7CisKKyAgLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICAqLworICBpZiAobWlwc19vcHRzLm1pcHMxNikKKyAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7CisKKyAgcHJldl9waW5mbyA9IHByZXZfaW5zbi5pbnNuX21vLT5waW5mbzsKKyAgcGluZm8gPSBpcC0+aW5zbl9tby0+cGluZm87CisKKyAgaWYgKHBsYWNlID09IE5VTEwgJiYgKCEgbWlwc19vcHRzLm5vcmVvcmRlciB8fCBwcmV2X25vcF9mcmFnICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGludCBwcmV2X3ByZXZfbm9wOworCisgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zbiByZXF1aXJlZCBhbnkgZGVsYXkgc2xvdHMsIHNlZSBpZiB3ZSBuZWVkCisJIHRvIGluc2VydCBhIE5PUCBvciB0d28uICBUaGVyZSBhcmUgZWlnaHQga2luZHMgb2YgcG9zc2libGUKKwkgaGF6YXJkcywgb2Ygd2hpY2ggYW4gaW5zdHJ1Y3Rpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgdHlwZS4KKwkgKDEpIGEgbG9hZCBmcm9tIG1lbW9yeSBkZWxheQorCSAoMikgYSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBkZWxheQorCSAoMykgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggZGVsYXkKKwkgKDQpIGEgY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5CisJICg1KSBhIG1vdmUgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIgZGVsYXkKKwkgKDYpIGEgbG9hZCBjb3Byb2Nlc3NvciByZWdpc3RlciBmcm9tIG1lbW9yeSBkZWxheQorCSAoNykgYSBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZSBkZWxheQorCSAoOCkgYSBISS9MTyBzcGVjaWFsIHJlZ2lzdGVyIGRlbGF5CisKKwkgVGhlcmUgYXJlIGEgbG90IG9mIG9wdGltaXphdGlvbnMgd2UgY291bGQgZG8gdGhhdCB3ZSBkb24ndC4KKwkgSW4gcGFydGljdWxhciwgd2UgZG8gbm90LCBpbiBnZW5lcmFsLCByZW9yZGVyIGluc3RydWN0aW9ucy4KKwkgSWYgeW91IHVzZSBnY2Mgd2l0aCBvcHRpbWl6YXRpb24sIGl0IHdpbGwgcmVvcmRlcgorCSBpbnN0cnVjdGlvbnMgYW5kIGdlbmVyYWxseSBkbyBtdWNoIG1vcmUgb3B0aW1pemF0aW9uIHRoZW4gd2UKKwkgZG8gaGVyZTsgcmVwZWF0aW5nIGFsbCB0aGF0IHdvcmsgaW4gdGhlIGFzc2VtYmxlciB3b3VsZCBvbmx5CisJIGJlbmVmaXQgaGFuZCB3cml0dGVuIGFzc2VtYmx5IGNvZGUsIGFuZCBkb2VzIG5vdCBzZWVtIHdvcnRoCisJIGl0LiAgKi8KKworICAgICAgLyogVGhpcyBpcyBob3cgYSBOT1AgaXMgZW1pdHRlZC4gICovCisjZGVmaW5lIGVtaXRfbm9wKCkJCQkJCVwKKyAgKG1pcHNfb3B0cy5taXBzMTYJCQkJCVwKKyAgID8gbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnX21vcmUgKDIpLCAweDY1MDAsIDIpCVwKKyAgIDogbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnX21vcmUgKDQpLCAwLCA0KSkKKworICAgICAgLyogVGhlIHByZXZpb3VzIGluc24gbWlnaHQgcmVxdWlyZSBhIGRlbGF5IHNsb3QsIGRlcGVuZGluZyB1cG9uCisJIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBpbnNuLiAgKi8KKyAgICAgIGlmICghIG1pcHNfb3B0cy5taXBzMTYKKwkgICYmIG1pcHNfb3B0cy5pc2EgPCA0CisJICAmJiAoKChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKKyAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCisJICAgICAgfHwgKCEgZ3ByX2ludGVybG9ja3MKKwkJICAmJiAocHJldl9waW5mbyAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkpCisJeworCSAgLyogQSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBvciBmcm9tIG1lbW9yeS4gIEFsbCBsb2FkCisJICAgICBkZWxheXMgZGVsYXkgdGhlIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIHJ0IGZvciBvbmUKKwkgICAgIGluc3RydWN0aW9uIG9uIHRoZSByMzAwMC4gIFRoZSByNjAwMCBhbmQgcjQwMDAgdXNlCisJICAgICBpbnRlcmxvY2tzLiAgKi8KKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICBrbm93IChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCk7CisJICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCisJICAgICAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCisJCQkJKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCisJCQkJICYgT1BfTUFTS19SVCksCisJCQkJTUlQU19HUl9SRUcpKQorCSAgICArK25vcHM7CisJfQorICAgICAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2CisJICAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCA0CisJICAgICAgICYmICgoKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZKQorICAgICAgICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQorCQkgICB8fCAobWlwc19vcHRzLmlzYSA8IDIKKwkJICAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkpKQorCXsKKwkgIC8qIEEgZ2VuZXJpYyBjb3Byb2Nlc3NvciBkZWxheS4gIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbgorCSAgICAgbW9kaWZpZWQgYSBjb3Byb2Nlc3NvciBnZW5lcmFsIG9yIGNvbnRyb2wgcmVnaXN0ZXIuICBJZgorCSAgICAgaXQgbW9kaWZpZWQgYSBjb250cm9sIHJlZ2lzdGVyLCB3ZSBuZWVkIHRvIGF2b2lkIGFueQorCSAgICAgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgcHJvYmFibHkgbm90IGFsd2F5cworCSAgICAgcmVxdWlyZWQsIGJ1dCBpdCBzb21ldGltZXMgaXMpLiAgSWYgaXQgbW9kaWZpZWQgYSBnZW5lcmFsCisJICAgICByZWdpc3Rlciwgd2UgYXZvaWQgdXNpbmcgdGhhdCByZWdpc3Rlci4KKworCSAgICAgT24gdGhlIHI2MDAwIGFuZCByNDAwMCBsb2FkaW5nIGEgY29wcm9jZXNzb3IgcmVnaXN0ZXIKKwkgICAgIGZyb20gbWVtb3J5IGlzIGludGVybG9ja2VkLCBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGRlbGF5LgorCisJICAgICBUaGlzIGNhc2UgaXMgbm90IGhhbmRsZWQgdmVyeSB3ZWxsLiAgVGhlcmUgaXMgbm8gc3BlY2lhbAorCSAgICAga25vd2xlZGdlIG9mIENQMCBoYW5kbGluZywgYW5kIHRoZSBjb3Byb2Nlc3NvcnMgb3RoZXIKKwkgICAgIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IHVuaXQgYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGF0CisJICAgICBhbGwuICAqLworICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gRklYTUUhCisgICAgICAgICAgICAgTmVlZCB0byBtb2RpZnkgdGhpcyB0byBpbmNsdWRlIGtub3dsZWRnZSBhYm91dCAKKyAgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBkZWxheXMhICAqLworCSAgaWYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9UKQorCSAgICB7CisJICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAorCQkgIHx8IGluc25fdXNlc19yZWcgKGlwLAorCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkKKwkJCQkgICAgICYgT1BfTUFTS19GVCksCisJCQkJICAgIE1JUFNfRlBfUkVHKSkKKwkJKytub3BzOworCSAgICB9CisJICBlbHNlIGlmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9GUFJfUykKKwkgICAgeworCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKKwkJICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKKwkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpCisJCQkJICAgICAmIE9QX01BU0tfRlMpLAorCQkJCSAgICBNSVBTX0ZQX1JFRykpCisJCSsrbm9wczsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uCisJCSBkb2VzLiAgSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdXNlcyBhIGNvcHJvY2Vzc29yCisJCSByZWdpc3Rlciwgd2UgbXVzdCBpbnNlcnQgYSBOT1AuICBJZiBwcmV2aW91cworCQkgaW5zdHJ1Y3Rpb24gbWF5IHNldCB0aGUgY29uZGl0aW9uIGNvZGVzLCBhbmQgdGhlCisJCSBjdXJyZW50IGluc3RydWN0aW9uIHVzZXMgdGhlbSwgd2UgbXVzdCBpbnNlcnQgdHdvCisJCSBOT1BTLiAgKi8KKyAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKKwkJICB8fCAoKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKKwkJICAgICAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpKQorCQlub3BzICs9IDI7CisJICAgICAgZWxzZSBpZiAocGluZm8gJiBJTlNOX0NPUCkKKwkJKytub3BzOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2CisJICAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCA0CisJICAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCisgICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQorCXsKKwkgIC8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBzZXRzIHRoZSBjb3Byb2Nlc3NvciBjb25kaXRpb24KKwkgICAgIGNvZGVzLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhIGdlbmVyYWwgY29wcm9jZXNzb3IgZGVsYXkKKwkgICAgICh0aGlzIG1lYW5zIGl0IGlzIGEgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbgorCSAgICAgaW5zdHJ1Y3Rpb24pLiAgSWYgdGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBjb25kaXRpb24KKwkgICAgIGNvZGVzLCB3ZSBuZWVkIHRvIGluc2VydCBhIHNpbmdsZSBOT1AuICAqLworICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkgIGlmIChtaXBzX29wdGltaXplID09IDAKKwkgICAgICB8fCAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKKwkgICAgKytub3BzOworCX0KKyAgICAgIGVsc2UgaWYgKHByZXZfcGluZm8gJiBJTlNOX1JFQURfTE8pCisJeworCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBMTyByZWdpc3RlcjsgaWYgdGhlCisJICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgTE8gcmVnaXN0ZXIsIHdlIG11c3QKKwkgICAgIGluc2VydCB0d28gTk9QUy4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuIAorCSAgICAgQWxzbyB0aGUgdHgzOSdzIG11bHRpcGx5IGluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3R1dGVkIAorICAgICAgICAgICAgIGltbWVkaWF0bHkgYWZ0ZXIgYSByZWFkIGZyb20gSEkvTE8gKHdpdGhvdXQgdGhlIGRlbGF5KSwKKyAgICAgICAgICAgICB0aG91Z2ggdGhlIHR4MzkncyBkaXZpZGUgaW5zbnMgc3RpbGwgZG8gcmVxdWlyZSB0aGUgCisJICAgICBkZWxheS4gKi8KKwkgIGlmICghIChoaWxvX2ludGVybG9ja3MKKwkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQorCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKKwkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0xPKSkpCisJICAgIG5vcHMgKz0gMjsKKwkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KKwkgICAgIElmIGEgcmVhZCBmcm9tIExPIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCisJICAgICB0byBhIHdyaXRlIHRvIExPIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKKwkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgorCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBMTywgYW5kIGluc2VydCBhIG5vcAorCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCisJICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2CisJCSAgICYmIChtaXBzX29wdGltaXplID09IDAKKwkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQorCSAgICBub3BzICs9IDE7CisJfQorICAgICAgZWxzZSBpZiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQorCXsKKwkgIC8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiByZWFkcyB0aGUgSEkgcmVnaXN0ZXI7IGlmIHRoZQorCSAgICAgY3VycmVudCBpbnN0cnVjdGlvbiB3cml0ZXMgdG8gdGhlIEhJIHJlZ2lzdGVyLCB3ZSBtdXN0CisJICAgICBpbnNlcnQgYSBOT1AuICBTb21lIG5ld2VyIHByb2Nlc3NvcnMgaGF2ZSBpbnRlcmxvY2tzLgorCSAgICAgQWxzbyB0aGUgbm90ZSB0eDM5J3MgbXVsdGlwbHkgYWJvdmUuICovCisJICBpZiAoISAoaGlsb19pbnRlcmxvY2tzCisJCSB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKKwkgICAgICAmJiAobWlwc19vcHRpbWl6ZSA9PSAwCisJCSAgfHwgKHBpbmZvICYgSU5TTl9XUklURV9ISSkpKQorCSAgICBub3BzICs9IDI7CisJICAvKiBNb3N0IG1pcHMxNiBicmFuY2ggaW5zbnMgZG9uJ3QgaGF2ZSBhIGRlbGF5IHNsb3QuCisJICAgICBJZiBhIHJlYWQgZnJvbSBISSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGJyYW5jaAorCSAgICAgdG8gYSB3cml0ZSB0byBISSB3ZSBoYXZlIGEgcmVhZCBmb2xsb3dlZCBieSBhIHdyaXRlCisJICAgICBsZXNzIHRoYW4gMiBpbnNucyBhd2F5LiAgV2UgYXNzdW1lIHRoZSB0YXJnZXQgb2YKKwkgICAgIGEgYnJhbmNoIG1pZ2h0IGJlIGEgd3JpdGUgdG8gSEksIGFuZCBpbnNlcnQgYSBub3AKKwkgICAgIGJldHdlZW4gYSByZWFkIGFuZCBhbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYnJhbmNoLiAqLworCSAgZWxzZSBpZiAobWlwc19vcHRzLm1pcHMxNgorCQkgICAmJiAobWlwc19vcHRpbWl6ZSA9PSAwCisJCSAgICAgICB8fCAocGluZm8gJiBNSVBTMTZfSU5TTl9CUkFOQ0gpKSkKKwkgICAgbm9wcyArPSAxOworCX0KKworICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIG5vcmVvcmRlciBzZWN0aW9uLCB0aGVuCisgICAgICAgICB3ZSBkb24ndCB3YW50IHRvIGluc2VydCB0aGUgbm9wIGFmdGVyIGFsbC4gICovCisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBpZiAocHJldl9pbnNuX3VucmVvcmRlcmVkKQorCW5vcHMgPSAwOworCisgICAgICAvKiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdoaWNoIHJlcXVpcmUgdHdvIGludGVydmVuaW5nCisJIGluc3RydWN0aW9uczogMSkgc2V0dGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIHVzaW5nIGEgbW92ZSB0bworCSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aGljaCByZXF1aXJlcyBhIGdlbmVyYWwgY29wcm9jZXNzb3IKKwkgZGVsYXkgYW5kIHRoZW4gcmVhZGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIDIpIHJlYWRpbmcgdGhlIEhJCisJIG9yIExPIHJlZ2lzdGVyIGFuZCB0aGVuIHdyaXRpbmcgdG8gaXQgKGV4Y2VwdCBvbiBwcm9jZXNzb3JzCisJIHdoaWNoIGhhdmUgaW50ZXJsb2NrcykuICBJZiB3ZSBhcmUgbm90IGFscmVhZHkgZW1pdHRpbmcgYSBOT1AKKwkgaW5zdHJ1Y3Rpb24sIHdlIG11c3QgY2hlY2sgZm9yIHRoZXNlIGNhc2VzIGNvbXBhcmVkIHRvIHRoZQorCSBpbnN0cnVjdGlvbiBwcmV2aW91cyB0byB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKKwkgICAmJiBtaXBzX29wdHMuaXNhIDwgNAorCSAgICYmIChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fQ09QUk9DX01PVkVfREVMQVkpCisJICAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCisJICAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkKKwkgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQorCSAgfHwgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykKKwkgICAgICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0xPKQorCSAgICAgICYmICEgKGhpbG9faW50ZXJsb2NrcworCQkgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpKQorCSAgfHwgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKKwkgICAgICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0hJKQorCSAgICAgICYmICEgKGhpbG9faW50ZXJsb2NrcworCQkgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpKSkKKwlwcmV2X3ByZXZfbm9wID0gMTsKKyAgICAgIGVsc2UKKwlwcmV2X3ByZXZfbm9wID0gMDsKKworICAgICAgaWYgKHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKQorCXByZXZfcHJldl9ub3AgPSAwOworCisgICAgICBpZiAocHJldl9wcmV2X25vcCAmJiBub3BzID09IDApCisJKytub3BzOworCisgICAgICAvKiBJZiB3ZSBhcmUgYmVpbmcgZ2l2ZW4gYSBub3AgaW5zdHJ1Y3Rpb24sIGRvbid0IGJvdGhlciB3aXRoCisJIG9uZSBvZiB0aGUgbm9wcyB3ZSB3b3VsZCBvdGhlcndpc2Ugb3V0cHV0LiAgVGhpcyB3aWxsIG9ubHkKKwkgaGFwcGVuIHdoZW4gYSBub3AgaW5zdHJ1Y3Rpb24gaXMgdXNlZCB3aXRoIG1pcHNfb3B0aW1pemUgc2V0CisJIHRvIDAuICAqLworICAgICAgaWYgKG5vcHMgPiAwCisJICAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIKKwkgICYmIGlwLT5pbnNuX29wY29kZSA9PSAobWlwc19vcHRzLm1pcHMxNiA/IDB4NjUwMCA6IDApKQorCS0tbm9wczsKKworICAgICAgLyogTm93IGVtaXQgdGhlIHJpZ2h0IG51bWJlciBvZiBOT1AgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgICAgIGlmIChub3BzID4gMCAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCisJeworCSAgZnJhZ1MgKm9sZF9mcmFnOworCSAgdW5zaWduZWQgbG9uZyBvbGRfZnJhZ19vZmZzZXQ7CisJICBpbnQgaTsKKwkgIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmw7CisKKwkgIG9sZF9mcmFnID0gZnJhZ19ub3c7CisJICBvbGRfZnJhZ19vZmZzZXQgPSBmcmFnX25vd19maXggKCk7CisKKwkgIGZvciAoaSA9IDA7IGkgPCBub3BzOyBpKyspCisJICAgIGVtaXRfbm9wICgpOworCisJICBpZiAobGlzdGluZykKKwkgICAgeworCSAgICAgIGxpc3RpbmdfcHJldl9saW5lICgpOworCSAgICAgIC8qIFdlIG1heSBiZSBhdCB0aGUgc3RhcnQgb2YgYSB2YXJpYW50IGZyYWcuICBJbiBjYXNlIHdlCisgICAgICAgICAgICAgICAgIGFyZSwgbWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGZyYWcKKyAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGZyYWdzIGNyZWF0ZWQgYnkgbGlzdGluZ19wcmV2X2xpbmUuICBUaGUKKyAgICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gZnJhZ19ncm93IGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZQorICAgICAgICAgICAgICAgICBhcyB0aGUgYXJndW1lbnQgdG8gYWxsIG90aGVyIGNhbGxzIHRvIGZyYWdfZ3JvdyBpbgorICAgICAgICAgICAgICAgICB0aGlzIGZpbGUuICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGJlaW5nIGluIHRoZQorICAgICAgICAgICAgICAgICBtaWRkbGUgb2YgYSB2YXJpYW50IGZyYWcsIGJlY2F1c2UgdGhlIHZhcmlhbnRzIGluc2VydAorICAgICAgICAgICAgICAgICBhbGwgbmVlZGVkIG5vcCBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCisJICAgICAgZnJhZ19ncm93ICg0MCk7CisJICAgIH0KKworCSAgZm9yIChsID0gaW5zbl9sYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisJICAgIHsKKwkgICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGwtPmxhYmVsKSA9PSBub3dfc2VnKTsKKwkgICAgICBsLT5sYWJlbC0+c3lfZnJhZyA9IGZyYWdfbm93OworCSAgICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKKwkgICAgICAvKiBtaXBzMTYgdGV4dCBsYWJlbHMgYXJlIHN0b3JlZCBhcyBvZGQuICAqLworCSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQorCQkrK2wtPmxhYmVsLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7CisJICAgIH0KKworI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKKwkgIGlmIChFQ09GRl9ERUJVR0dJTkcpCisJICAgIGVjb2ZmX2ZpeF9sb2MgKG9sZF9mcmFnLCBvbGRfZnJhZ19vZmZzZXQpOworI2VuZGlmCisJfQorICAgICAgZWxzZSBpZiAocHJldl9ub3BfZnJhZyAhPSBOVUxMKQorCXsKKwkgIC8qIFdlIGhhdmUgYSBmcmFnIGhvbGRpbmcgbm9wcyB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUuICBJZgorICAgICAgICAgICAgIHdlIGRvbid0IG5lZWQgYW55IG5vcHMsIHdlIGNhbiBkZWNyZWFzZSB0aGUgc2l6ZSBvZgorICAgICAgICAgICAgIHByZXZfbm9wX2ZyYWcgYnkgdGhlIHNpemUgb2Ygb25lIGluc3RydWN0aW9uLiAgSWYgd2UgZG8KKyAgICAgICAgICAgICBuZWVkIHNvbWUgbm9wcywgd2UgY291bnQgdGhlbSBpbiBwcmV2X25vcHNfcmVxdWlyZWQuICovCisJICBpZiAocHJldl9ub3BfZnJhZ19zaW5jZSA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKG5vcHMgPT0gMCkKKwkJeworCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSBtaXBzX29wdHMubWlwczE2ID8gMiA6IDQ7CisJCSAgLS1wcmV2X25vcF9mcmFnX2hvbGRzOworCQl9CisJICAgICAgZWxzZQorCQlwcmV2X25vcF9mcmFnX3JlcXVpcmVkICs9IG5vcHM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChwcmV2X3ByZXZfbm9wID09IDApCisJCXsKKwkJICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gbWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0OworCQkgIC0tcHJldl9ub3BfZnJhZ19ob2xkczsKKwkJfQorCSAgICAgIGVsc2UKKwkJKytwcmV2X25vcF9mcmFnX3JlcXVpcmVkOworCSAgICB9CisKKwkgIGlmIChwcmV2X25vcF9mcmFnX2hvbGRzIDw9IHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQpCisJICAgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOworCisJICArK3ByZXZfbm9wX2ZyYWdfc2luY2U7CisKKwkgIC8qIFNhbml0eSBjaGVjazogYnkgdGhlIHRpbWUgd2UgcmVhY2ggdGhlIHNlY29uZCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgIGFmdGVyIHByZXZfbm9wX2ZyYWcsIHdlIHNob3VsZCBoYXZlIHVzZWQgdXAgYWxsIHRoZSBub3BzCisgICAgICAgICAgICAgb25lIHdheSBvciBhbm90aGVyLiAgKi8KKwkgIGFzc2VydCAocHJldl9ub3BfZnJhZ19zaW5jZSA8PSAxIHx8IHByZXZfbm9wX2ZyYWcgPT0gTlVMTCk7CisJfQorICAgIH0KKworICBpZiAocmVsb2NfdHlwZSA+IEJGRF9SRUxPQ19VTlVTRUQpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBzZXQgdXAgYSB2YXJpYW50IGZyYWcuICAqLworICAgICAgYXNzZXJ0IChtaXBzX29wdHMubWlwczE2ICYmIGFkZHJlc3NfZXhwciAhPSBOVUxMKTsKKyAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCisJCSAgICBSRUxBWF9NSVBTMTZfRU5DT0RFIChyZWxvY190eXBlIC0gQkZEX1JFTE9DX1VOVVNFRCwKKwkJCQkJIG1pcHMxNl9zbWFsbCwgbWlwczE2X2V4dCwKKwkJCQkJIChwcmV2X3BpbmZvCisJCQkJCSAgJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpLAorCQkJCQkgKHByZXZfaW5zbl9yZWxvY190eXBlCisJCQkJCSAgPT0gQkZEX1JFTE9DX01JUFMxNl9KTVApKSwKKwkJICAgIG1ha2VfZXhwcl9zeW1ib2wgKGFkZHJlc3NfZXhwciksIChvZmZzZXRUKSAwLAorCQkgICAgKGNoYXIgKikgTlVMTCk7CisgICAgfQorICBlbHNlIGlmIChwbGFjZSAhPSBOVUxMKQorICAgIGYgPSBwbGFjZTsKKyAgZWxzZSBpZiAobWlwc19vcHRzLm1pcHMxNgorCSAgICYmICEgaXAtPnVzZV9leHRlbmQKKwkgICAmJiByZWxvY190eXBlICE9IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byBzd2FwIHRoaXMgaW5zdHJ1Y3Rpb24gd2l0aAorICAgICAgICAgYSBmb2xsb3dpbmcganVtcCBpbnN0cnVjdGlvbi4gICovCisgICAgICBmcmFnX2dyb3cgKDYpOworICAgICAgZiA9IGZyYWdfbW9yZSAoMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYKKwkgICYmIG1pcHNfb3B0cy5ub3Jlb3JkZXIKKwkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKSAhPSAwKQorCWFzX3dhcm4gKF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7CisKKyAgICAgIGYgPSBmcmFnX21vcmUgKDQpOworICAgIH0KKworICBmaXhwID0gTlVMTDsKKyAgaWYgKGFkZHJlc3NfZXhwciAhPSBOVUxMICYmIHJlbG9jX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKQorICAgIHsKKyAgICAgIGlmIChhZGRyZXNzX2V4cHItPlhfb3AgPT0gT19jb25zdGFudCkKKwl7CisJICBzd2l0Y2ggKHJlbG9jX3R5cGUpCisJICAgIHsKKwkgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CisJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHhmZmZmOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfSk1QOgorCSAgICAgIGlmICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAzKSAhPSAwKQorCQlhc19iYWQgKF8oImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiKSwKKwkJCSh1bnNpZ25lZCBsb25nKSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcik7CisJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciA+PiAyKSAmIDB4M2ZmZmZmZjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgorCSAgICAgIGlmICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAzKSAhPSAwKQorCQlhc19iYWQgKF8oImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiKSwKKwkJCSh1bnNpZ25lZCBsb25nKSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcik7CisJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9CisJCSgoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHg3YzAwMDApIDw8IDMpCisJCSB8ICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweGY4MDAwMDApID4+IDcpCisJCSB8ICgoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgJiAweDNmZmZjKSA+PiAyKSk7CisJICAgICAgYnJlYWs7CisKKworCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKKwkgICAgICBnb3RvIG5lZWRfcmVsb2M7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBpbnRlcm5hbEVycm9yICgpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwluZWVkX3JlbG9jOgorCSAgLyogRG9uJ3QgZ2VuZXJhdGUgYSByZWxvYyBpZiB3ZSBhcmUgd3JpdGluZyBpbnRvIGEgdmFyaWFudAorCSAgICAgZnJhZy4gICovCisJICBpZiAocGxhY2UgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZpeHAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKKwkJCQkgIGFkZHJlc3NfZXhwciwKKwkJCQkgIHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyLAorCQkJCSAgcmVsb2NfdHlwZSk7CisJICAgICAgaWYgKHVubWF0Y2hlZF9oaSkKKwkJeworCQkgIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpoaV9maXh1cDsKKworCQkgIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfSEkxNl9TKTsKKwkJICBoaV9maXh1cCA9ICgoc3RydWN0IG1pcHNfaGlfZml4dXAgKikKKwkJCSAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG1pcHNfaGlfZml4dXApKSk7CisJCSAgaGlfZml4dXAtPmZpeHAgPSBmaXhwOworCQkgIGhpX2ZpeHVwLT5zZWcgPSBub3dfc2VnOworCQkgIGhpX2ZpeHVwLT5uZXh0ID0gbWlwc19oaV9maXh1cF9saXN0OworCQkgIG1pcHNfaGlfZml4dXBfbGlzdCA9IGhpX2ZpeHVwOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUsIDQpOworICBlbHNlIGlmIChyZWxvY190eXBlID09IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaXAtPmluc25fb3Bjb2RlID4+IDE2LCAyKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIGlwLT5pbnNuX29wY29kZSAmIDB4ZmZmZiwgMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGlwLT51c2VfZXh0ZW5kKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAoZiwgMHhmMDAwIHwgaXAtPmV4dGVuZCwgMik7CisJICBmICs9IDI7CisJfQorICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpcC0+aW5zbl9vcGNvZGUsIDIpOworICAgIH0KKworICAvKiBVcGRhdGUgdGhlIHJlZ2lzdGVyIG1hc2sgaW5mb3JtYXRpb24uICAqLworICBpZiAoISBtaXBzX29wdHMubWlwczE2KQorICAgIHsKKyAgICAgIGlmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCisJbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCk7CisgICAgICBpZiAoKHBpbmZvICYgKElOU05fV1JJVEVfR1BSX1QgfCBJTlNOX1JFQURfR1BSX1QpKSAhPSAwKQorCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOworICAgICAgaWYgKHBpbmZvICYgSU5TTl9SRUFEX0dQUl9TKQorCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpOworICAgICAgaWYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCisJbWlwc19ncHJtYXNrIHw9IDEgPDwgMzE7CisgICAgICBpZiAocGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9EKQorCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZEKSAmIE9QX01BU0tfRkQpOworICAgICAgaWYgKChwaW5mbyAmIChJTlNOX1dSSVRFX0ZQUl9TIHwgSU5TTl9SRUFEX0ZQUl9TKSkgIT0gMCkKKwltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTKTsKKyAgICAgIGlmICgocGluZm8gJiAoSU5TTl9XUklURV9GUFJfVCB8IElOU05fUkVBRF9GUFJfVCkpICE9IDApCisJbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7CisgICAgICBpZiAoKHBpbmZvICYgSU5TTl9SRUFEX0ZQUl9SKSAhPSAwKQorCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZSKSAmIE9QX01BU0tfRlIpOworICAgICAgaWYgKHBpbmZvICYgSU5TTl9DT1ApCisJeworCSAgLyogV2UgZG9uJ3Qga2VlcCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gc29ydCB0aGVzZSBjYXNlcyBvdXQuIAorCSAgICAgVGhlIGl0Ymwgc3VwcG9ydCBkb2VzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBob3dldmVyLCBhbHRob3VnaCAKKwkgICAgIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGl0YmwgZnBybWF0cyBhcyBwYXJ0IG9mIHRoZSBjb3AgCisJICAgICBpbnN0cnVjdGlvbi4gIE1heSB3YW50IHRvIGFkZCB0aGlzIHN1cHBvcnQgaW4gdGhlIGZ1dHVyZS4gKi8KKwl9CisgICAgICAvKiBOZXZlciBzZXQgdGhlIGJpdCBmb3IgJDAsIHdoaWNoIGlzIGFsd2F5cyB6ZXJvLiAgKi8KKyAgICAgIG1pcHNfZ3BybWFzayAmPX4gMSA8PCAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9YIHwgTUlQUzE2X0lOU05fUkVBRF9YKSkKKwltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWCkKKwkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWCk7CisgICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfWSB8IE1JUFMxNl9JTlNOX1JFQURfWSkpCisJbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpCisJCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUlkpOworICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWikKKwltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWikKKwkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19SWik7CisgICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfVCB8IE1JUFMxNl9JTlNOX1JFQURfVCkpCisJbWlwc19ncHJtYXNrIHw9IDEgPDwgVFJFRzsKKyAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV9TUCB8IE1JUFMxNl9JTlNOX1JFQURfU1ApKQorCW1pcHNfZ3BybWFzayB8PSAxIDw8IFNQOworICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFXzMxIHwgTUlQUzE2X0lOU05fUkVBRF8zMSkpCisJbWlwc19ncHJtYXNrIHw9IDEgPDwgUkE7CisgICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKKwltaXBzX2dwcm1hc2sgfD0gMSA8PCBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAoaXAtPmluc25fb3Bjb2RlKTsKKyAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWikKKwltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQorCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopOworICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9HUFJfWCkKKwltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCisJCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUkVHUjMyKTsKKyAgICB9CisKKyAgaWYgKHBsYWNlID09IE5VTEwgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyKQorICAgIHsKKyAgICAgIC8qIEZpbGxpbmcgdGhlIGJyYW5jaCBkZWxheSBzbG90IGlzIG1vcmUgY29tcGxleC4gIFdlIHRyeSB0bworCSBzd2l0Y2ggdGhlIGJyYW5jaCB3aXRoIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgd2hpY2ggd2UgY2FuCisJIGRvIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBkb2VzIG5vdCBzZXQgdXAgYSBjb25kaXRpb24KKwkgdGhhdCB0aGUgYnJhbmNoIHRlc3RzIGFuZCBpZiB0aGUgYnJhbmNoIGlzIG5vdCBpdHNlbGYgdGhlCisJIHRhcmdldCBvZiBhbnkgYnJhbmNoLiAgKi8KKyAgICAgIGlmICgocGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpCisJICB8fCAocGluZm8gJiBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZKSkKKwl7CisJICBpZiAobWlwc19vcHRpbWl6ZSA8IDIKKwkgICAgICAvKiBJZiB3ZSBoYXZlIHNlZW4gLnNldCB2b2xhdGlsZSBvciAuc2V0IG5vbW92ZSwgZG9uJ3QKKwkJIG9wdGltaXplLiAgKi8KKwkgICAgICB8fCBtaXBzX29wdHMubm9tb3ZlICE9IDAKKwkgICAgICAvKiBJZiB3ZSBoYWQgdG8gZW1pdCBhbnkgTk9QIGluc3RydWN0aW9ucywgdGhlbiB3ZQorCQkgYWxyZWFkeSBrbm93IHdlIGNhbiBub3Qgc3dhcC4gICovCisJICAgICAgfHwgbm9wcyAhPSAwCisJICAgICAgLyogSWYgd2UgZG9uJ3QgZXZlbiBrbm93IHRoZSBwcmV2aW91cyBpbnNuLCB3ZSBjYW4gbm90CisJCSBzd2FwLiAqLworCSAgICAgIHx8ICEgcHJldl9pbnNuX3ZhbGlkCisJICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc24gaXMgYWxyZWFkeSBpbiBhIGJyYW5jaCBkZWxheQorCQkgc2xvdCwgdGhlbiB3ZSBjYW4gbm90IHN3YXAuICAqLworCSAgICAgIHx8IHByZXZfaW5zbl9pc19kZWxheV9zbG90CisJICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc24gd2FzIGluIGEgLnNldAorCQkgbm9yZW9yZGVyLCB3ZSBjYW4ndCBzd2FwLiAgQWN0dWFsbHksIHRoZSBNSVBTCisJCSBhc3NlbWJsZXIgd2lsbCBzd2FwIGluIHRoaXMgc2l0dWF0aW9uLiAgSG93ZXZlciwgZ2NjCisJCSBjb25maWd1cmVkIC13aXRoLWdudS1hcyB3aWxsIGdlbmVyYXRlIGNvZGUgbGlrZQorCQkgICAuc2V0IG5vcmVvcmRlcgorCQkgICBsdwkkNCxYWFgKKwkJICAgLnNldAlyZW9yZGVyCisJCSAgIElOU04KKwkJICAgYm5lCSQ0LCQwLGZvbworCQkgaW4gd2hpY2ggd2UgY2FuIG5vdCBzd2FwIHRoZSBibmUgYW5kIElOU04uICBJZiBnY2MgaXMKKwkJIG5vdCBjb25maWd1cmVkIC13aXRoLWdudS1hcywgaXQgZG9lcyBub3Qgb3V0cHV0IHRoZQorCQkgLnNldCBwc2V1ZG8tb3BzLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGVjaworCQkgcHJldl9pbnNuX3VucmVvcmRlcmVkLCBiZWNhdXNlIHByZXZfaW5zbl92YWxpZCB3aWxsCisJCSBiZSAwIGluIHRoYXQgY2FzZS4gIFdlIGRvbid0IHdhbnQgdG8gdXNlCisJCSBwcmV2X3ByZXZfaW5zbl92YWxpZCwgYmVjYXVzZSB3ZSBkbyB3YW50IHRvIGJlIGFibGUKKwkJIHRvIHN3YXAgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uICAqLworCSAgICAgIHx8IHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkCisJICAgICAgLyogSWYgdGhlIGJyYW5jaCBpcyBpdHNlbGYgdGhlIHRhcmdldCBvZiBhIGJyYW5jaCwgd2UKKwkJIGNhbiBub3Qgc3dhcC4gIFdlIGNoZWF0IG9uIHRoaXM7IGFsbCB3ZSBjaGVjayBmb3IgaXMKKwkJIHdoZXRoZXIgdGhlcmUgaXMgYSBsYWJlbCBvbiB0aGlzIGluc3RydWN0aW9uLiAgSWYKKwkJIHRoZXJlIGFyZSBhbnkgYnJhbmNoZXMgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBhCisJCSBsYWJlbCwgdXNlcnMgbXVzdCB1c2UgLnNldCBub3Jlb3JkZXIuICAqLworCSAgICAgIHx8IGluc25fbGFiZWxzICE9IE5VTEwKKwkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgaW4gYSB2YXJpYW50IGZyYWcsIHdlCisJCSBjYW4gbm90IGRvIHRoZSBzd2FwLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUKKwkJIG1pcHMxNiwgd2hpY2ggdXNlcyB2YXJpYW50IGZyYWdzIGZvciBkaWZmZXJlbnQKKwkJIHB1cnBvc2VzLiAgKi8KKwkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2CisJCSAgJiYgcHJldl9pbnNuX2ZyYWctPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpCisJICAgICAgLyogSWYgdGhlIGJyYW5jaCByZWFkcyB0aGUgY29uZGl0aW9uIGNvZGVzLCB3ZSBkb24ndAorCQkgZXZlbiB0cnkgdG8gc3dhcCwgYmVjYXVzZSBpbiB0aGUgc2VxdWVuY2UKKwkJICAgY3RjMSAkWCwkMzEKKwkJICAgSU5TTgorCQkgICBJTlNOCisJCSAgIGJjMXQgTEFCRUwKKwkJIHdlIGNhbiBub3Qgc3dhcCwgYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGhhbmRsaW5nIHRoYXQKKwkJIGNhc2UuICAqLworCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiBtaXBzX29wdHMuaXNhIDwgNAorCQkgICYmIChwaW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQorCSAgICAgIC8qIFdlIGNhbiBub3Qgc3dhcCB3aXRoIGFuIGluc3RydWN0aW9uIHRoYXQgcmVxdWlyZXMgYQorCQkgZGVsYXkgc2xvdCwgYmVjYXNlIHRoZSB0YXJnZXQgb2YgdGhlIGJyYW5jaCBtaWdodAorCQkgaW50ZXJmZXJlIHdpdGggdGhhdCBpbnN0cnVjdGlvbi4gICovCisJICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgorCQkgICYmIG1pcHNfb3B0cy5pc2EgPCA0CisJCSAgJiYgKHByZXZfcGluZm8KKyAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworCQkgICAgICAmIChJTlNOX0xPQURfQ09QUk9DX0RFTEFZCisJCQkgfCBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCisJCQkgfCBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpKQorCSAgICAgIHx8ICghIChoaWxvX2ludGVybG9ja3MKKwkJICAgICB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKKwkJICAmJiAocHJldl9waW5mbworCQkgICAgICAmIChJTlNOX1JFQURfTE8KKwkJCSB8IElOU05fUkVBRF9ISSkpKQorCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiAhIGdwcl9pbnRlcmxvY2tzCisJCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkKKwkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2CisJCSAgJiYgbWlwc19vcHRzLmlzYSA8IDIKKyAgICAgICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkJICAmJiAocHJldl9waW5mbyAmIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSkpCisJICAgICAgLyogV2UgY2FuIG5vdCBzd2FwIHdpdGggYSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIHx8IChwcmV2X3BpbmZvCisJCSAgJiAoSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCisJCSAgICAgfCBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCisJCSAgICAgfCBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSkpCisJICAgICAgLyogV2UgZG8gbm90IHN3YXAgd2l0aCBhIHRyYXAgaW5zdHJ1Y3Rpb24sIHNpbmNlIGl0CisJCSBjb21wbGljYXRlcyB0cmFwIGhhbmRsZXJzIHRvIGhhdmUgdGhlIHRyYXAKKwkJIGluc3RydWN0aW9uIGJlIGluIGEgZGVsYXkgc2xvdC4gICovCisJICAgICAgfHwgKHByZXZfcGluZm8gJiBJTlNOX1RSQVApCisJICAgICAgLyogSWYgdGhlIGJyYW5jaCByZWFkcyBhIHJlZ2lzdGVyIHRoYXQgdGhlIHByZXZpb3VzCisJCSBpbnN0cnVjdGlvbiBzZXRzLCB3ZSBjYW4gbm90IHN3YXAuICAqLworCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpCisJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCisJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQorCQkJCSAgICAgJiBPUF9NQVNLX1JUKSwKKwkJCQkgICAgTUlQU19HUl9SRUcpKQorCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCisJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCisJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQorCQkJCSAgICAgJiBPUF9NQVNLX1JEKSwKKwkJCQkgICAgTUlQU19HUl9SRUcpKQorCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2CisJCSAgJiYgKCgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1gpCisJCSAgICAgICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKKwkJCQkJICgocHJldl9pbnNuLmluc25fb3Bjb2RlCisJCQkJCSAgID4+IE1JUFMxNk9QX1NIX1JYKQorCQkJCQkgICYgTUlQUzE2T1BfTUFTS19SWCksCisJCQkJCSBNSVBTMTZfUkVHKSkKKwkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfWSkKKwkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCisJCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZQorCQkJCQkgICAgICA+PiBNSVBTMTZPUF9TSF9SWSkKKwkJCQkJICAgICAmIE1JUFMxNk9QX01BU0tfUlkpLAorCQkJCQkgICAgTUlQUzE2X1JFRykpCisJCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1opCisJCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAorCQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKKwkJCQkJICAgICAgPj4gTUlQUzE2T1BfU0hfUlopCisJCQkJCSAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKSwKKwkJCQkJICAgIE1JUFMxNl9SRUcpKQorCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9UKQorCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwgVFJFRywgTUlQU19HUl9SRUcpKQorCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKKwkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsIFJBLCBNSVBTX0dSX1JFRykpCisJCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQorCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKKwkJCQkJICAgIE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSIChwcmV2X2luc24uCisJCQkJCQkJCSAgICAgaW5zbl9vcGNvZGUpLAorCQkJCQkgICAgTUlQU19HUl9SRUcpKSkpCisJICAgICAgLyogSWYgdGhlIGJyYW5jaCB3cml0ZXMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cworCQkgaW5zdHJ1Y3Rpb24gc2V0cywgd2UgY2FuIG5vdCBzd2FwICh3ZSBrbm93IHRoYXQKKwkJIGJyYW5jaGVzIHdyaXRlIG9ubHkgdG8gUkQgb3IgdG8gJDMxKS4gICovCisJICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgorCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCkKKwkJICAmJiAoKChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCisJCSAgICAgICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkKKwkJCSAgID09ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpKSkKKwkJICAgICAgfHwgKChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQorCQkJICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCisJCQkgICAgICAgJiBPUF9NQVNLX1JUKQorCQkJICAgICAgPT0gMzEpKSkpCisJICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgorCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKKwkJICAmJiAoKChwaW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCisJCSAgICAgICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCkKKwkJCSAgID09ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpKSkKKwkJICAgICAgfHwgKChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQorCQkJICAmJiAoKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUkQpCisJCQkgICAgICAgJiBPUF9NQVNLX1JEKQorCQkJICAgICAgPT0gMzEpKSkpCisJICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiAocGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKKwkJICAmJiAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV8zMSkKKwkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kpCisJCQkgICYmIChNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAocHJldl9pbnNuLmluc25fb3Bjb2RlKQorCQkJICAgICAgPT0gUkEpKSkpCisJICAgICAgLyogSWYgdGhlIGJyYW5jaCB3cml0ZXMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cworCQkgaW5zdHJ1Y3Rpb24gcmVhZHMsIHdlIGNhbiBub3Qgc3dhcCAod2Uga25vdyB0aGF0CisJCSBicmFuY2hlcyBvbmx5IHdyaXRlIHRvIFJEIG9yIHRvICQzMSkuICAqLworCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQorCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sCisJCQkJICAgICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQorCQkJCSAgICAgJiBPUF9NQVNLX1JEKSwKKwkJCQkgICAgTUlQU19HUl9SRUcpKQorCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkJICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKKwkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLCAzMSwgTUlQU19HUl9SRUcpKQorCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2CisJCSAgJiYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCisJCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgUkEsIE1JUFNfR1JfUkVHKSkKKwkgICAgICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgdGhlIGJyYW5jaAorCQkgbWlnaHQgYmUgZXhwYW5kZWQgaW50byBhIHNlcXVlbmNlIHdoaWNoIHVzZXMgJGF0LCBzbworCQkgd2UgY2FuJ3Qgc3dhcCB3aXRoIGFuIGluc3RydWN0aW9uIHdoaWNoIHJlYWRzIGl0LiAgKi8KKwkgICAgICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDCisJCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgQVQsIE1JUFNfR1JfUkVHKSkKKwkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaGFzIGEgbG9hZAorCQkgZGVsYXksIGFuZCBzZXRzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgYnJhbmNoIHJlYWRzLCB3ZQorCQkgY2FuIG5vdCBzd2FwLiAgKi8KKwkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2CisJCSAgJiYgbWlwc19vcHRzLmlzYSA8IDQKKyAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworCQkgICYmICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX0xPQURfQ09QUk9DX0RFTEFZKQorCQkgICAgICB8fCAoISBncHJfaW50ZXJsb2NrcworCQkJICAmJiAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8KKwkJCSAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKQorCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAorCQkJCSAgICAoKHByZXZfcHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQorCQkJCSAgICAgJiBPUF9NQVNLX1JUKSwKKwkJCQkgICAgTUlQU19HUl9SRUcpKQorCSAgICAgIC8qIElmIG9uZSBpbnN0cnVjdGlvbiBzZXRzIGEgY29uZGl0aW9uIGNvZGUgYW5kIHRoZQorICAgICAgICAgICAgICAgICBvdGhlciBvbmUgdXNlcyBhIGNvbmRpdGlvbiBjb2RlLCB3ZSBjYW4gbm90IHN3YXAuICAqLworCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKQorCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQorCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKKwkJICAmJiAocHJldl9waW5mbyAmIElOU05fUkVBRF9DT05EX0NPREUpKQorCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBQQywgd2UgY2FuIG5vdAorICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KKwkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgorCQkgICYmIChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykpCisJICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBleHRlbmRlZCwgd2UgY2FuIG5vdAorICAgICAgICAgICAgICAgICBzd2FwLiAgKi8KKwkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZXh0ZW5kZWQpCisJICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGhhZCBhIGZpeHVwIGluIG1pcHMxNgorICAgICAgICAgICAgICAgICBtb2RlLCB3ZSBjYW4gbm90IHN3YXAuICBUaGlzIG5vcm1hbGx5IG1lYW5zIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhIDQgYnl0ZSBicmFuY2ggYW55aG93LiAgKi8KKwkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNiAmJiBwcmV2X2luc25fZml4cCkKKwkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBzeW5jLCBzeW5jLmwsIG9yIAorCQkgc3luYy5wLCB3ZSBjYW4gbm90IHN3YXAuICovCisJICAgICAgfHwgKHByZXZfcGluZm8gJiYgSU5TTl9TWU5DKSkKKwkgICAgeworCSAgICAgIC8qIFdlIGNvdWxkIGRvIGV2ZW4gYmV0dGVyIGZvciB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIHRvCisJCSBwb3J0aW9ucyBvZiB0aGlzIG9iamVjdCBmaWxlOyB3ZSBjb3VsZCBwaWNrIHVwIHRoZQorCQkgaW5zdHJ1Y3Rpb24gYXQgdGhlIGRlc3RpbmF0aW9uLCBwdXQgaXQgaW4gdGhlIGRlbGF5CisJCSBzbG90LCBhbmQgYnVtcCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4gICovCisJICAgICAgZW1pdF9ub3AgKCk7CisJICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uLiAgKi8KKwkgICAgICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKKwkgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEl0IGxvb2tzIGxpa2Ugd2UgY2FuIGFjdHVhbGx5IGRvIHRoZSBzd2FwLiAgKi8KKwkgICAgICBpZiAoISBtaXBzX29wdHMubWlwczE2KQorCQl7CisJCSAgY2hhciAqcHJldl9mOworCQkgIGNoYXIgdGVtcFs0XTsKKworCQkgIHByZXZfZiA9IHByZXZfaW5zbl9mcmFnLT5mcl9saXRlcmFsICsgcHJldl9pbnNuX3doZXJlOworCQkgIG1lbWNweSAodGVtcCwgcHJldl9mLCA0KTsKKwkJICBtZW1jcHkgKHByZXZfZiwgZiwgNCk7CisJCSAgbWVtY3B5IChmLCB0ZW1wLCA0KTsKKwkJICBpZiAocHJldl9pbnNuX2ZpeHApCisJCSAgICB7CisJCSAgICAgIHByZXZfaW5zbl9maXhwLT5meF9mcmFnID0gZnJhZ19ub3c7CisJCSAgICAgIHByZXZfaW5zbl9maXhwLT5meF93aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsKKwkJICAgIH0KKwkJICBpZiAoZml4cCkKKwkJICAgIHsKKwkJICAgICAgZml4cC0+ZnhfZnJhZyA9IHByZXZfaW5zbl9mcmFnOworCQkgICAgICBmaXhwLT5meF93aGVyZSA9IHByZXZfaW5zbl93aGVyZTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNoYXIgKnByZXZfZjsKKwkJICBjaGFyIHRlbXBbMl07CisKKwkJICBhc3NlcnQgKHByZXZfaW5zbl9maXhwID09IE5VTEwpOworCQkgIHByZXZfZiA9IHByZXZfaW5zbl9mcmFnLT5mcl9saXRlcmFsICsgcHJldl9pbnNuX3doZXJlOworCQkgIG1lbWNweSAodGVtcCwgcHJldl9mLCAyKTsKKwkJICBtZW1jcHkgKHByZXZfZiwgZiwgMik7CisJCSAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX01JUFMxNl9KTVApCisJCSAgICB7CisJCSAgICAgIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfVU5VU0VEKTsKKwkJICAgICAgbWVtY3B5IChmLCB0ZW1wLCAyKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIG1lbWNweSAoZiwgZiArIDIsIDIpOworCQkgICAgICBtZW1jcHkgKGYgKyAyLCB0ZW1wLCAyKTsKKwkJICAgIH0KKwkJICBpZiAoZml4cCkKKwkJICAgIHsKKwkJICAgICAgZml4cC0+ZnhfZnJhZyA9IHByZXZfaW5zbl9mcmFnOworCQkgICAgICBmaXhwLT5meF93aGVyZSA9IHByZXZfaW5zbl93aGVyZTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogVXBkYXRlIHRoZSBwcmV2aW91cyBpbnNuIGluZm9ybWF0aW9uOyBsZWF2ZSBwcmV2X2luc24KKwkJIHVuY2hhbmdlZC4gICovCisJICAgICAgcHJldl9wcmV2X2luc24gPSAqaXA7CisJICAgIH0KKwkgIHByZXZfaW5zbl9pc19kZWxheV9zbG90ID0gMTsKKworCSAgLyogSWYgdGhhdCB3YXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2gsIGZvcmdldCB0aGUgcHJldmlvdXMKKwkgICAgIGluc24gaW5mb3JtYXRpb24uICAqLworCSAgaWYgKHBpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKQorCSAgICB7CisJICAgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7CisJICAgICAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOworCSAgICB9CisKKwkgIHByZXZfaW5zbl9maXhwID0gTlVMTDsKKwkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKKwkgIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7CisJfQorICAgICAgZWxzZSBpZiAocGluZm8gJiBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSkKKwl7CisJICAvKiBXZSBkb24ndCB5ZXQgb3B0aW1pemUgYSBicmFuY2ggbGlrZWx5LiAgV2hhdCB3ZSBzaG91bGQgZG8KKwkgICAgIGlzIGxvb2sgYXQgdGhlIHRhcmdldCwgY29weSB0aGUgaW5zdHJ1Y3Rpb24gZm91bmQgdGhlcmUKKwkgICAgIGludG8gdGhlIGRlbGF5IHNsb3QsIGFuZCBpbmNyZW1lbnQgdGhlIGJyYW5jaCB0byBqdW1wIHRvCisJICAgICB0aGUgbmV4dCBpbnN0cnVjdGlvbi4gICovCisJICBlbWl0X25vcCAoKTsKKwkgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCisJICBwcmV2X3ByZXZfaW5zbiA9ICppcDsKKwkgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKKwkgIHByZXZfaW5zbl9maXhwID0gTlVMTDsKKwkgIHByZXZfaW5zbl9yZWxvY190eXBlID0gQkZEX1JFTE9DX1VOVVNFRDsKKwkgIHByZXZfaW5zbl9leHRlbmRlZCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCisJICBpZiAobm9wcyA+IDApCisJICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOworCSAgZWxzZQorCSAgICBwcmV2X3ByZXZfaW5zbiA9IHByZXZfaW5zbjsKKwkgIHByZXZfaW5zbiA9ICppcDsKKworCSAgLyogQW55IHRpbWUgd2Ugc2VlIGEgYnJhbmNoLCB3ZSBhbHdheXMgZmlsbCB0aGUgZGVsYXkgc2xvdAorCSAgICAgaW1tZWRpYXRlbHk7IHNpbmNlIHRoaXMgaW5zbiBpcyBub3QgYSBicmFuY2gsIHdlIGtub3cgaXQKKwkgICAgIGlzIG5vdCBpbiBhIGRlbGF5IHNsb3QuICAqLworCSAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAwOworCisJICBwcmV2X2luc25fZml4cCA9IGZpeHA7CisJICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IHJlbG9jX3R5cGU7CisJICBpZiAobWlwc19vcHRzLm1pcHMxNikKKwkgICAgcHJldl9pbnNuX2V4dGVuZGVkID0gKGlwLT51c2VfZXh0ZW5kCisJCQkJICB8fCByZWxvY190eXBlID4gQkZEX1JFTE9DX1VOVVNFRCk7CisJfQorCisgICAgICBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCA9IHByZXZfaW5zbl91bnJlb3JkZXJlZDsKKyAgICAgIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7CisgICAgICBwcmV2X2luc25fZnJhZyA9IGZyYWdfbm93OworICAgICAgcHJldl9pbnNuX3doZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOworICAgICAgcHJldl9pbnNuX3ZhbGlkID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKHBsYWNlID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byByZWNvcmQgYSBiaXQgb2YgaW5mb3JtYXRpb24gZXZlbiB3aGVuIHdlIGFyZSBub3QKKyAgICAgICAgIHJlb3JkZXJpbmcsIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgYmFzZSBhZGRyZXNzIGZvciBtaXBzMTYKKyAgICAgICAgIFBDIHJlbGF0aXZlIHJlbG9jcy4gICovCisgICAgICBwcmV2X3ByZXZfaW5zbiA9IHByZXZfaW5zbjsKKyAgICAgIHByZXZfaW5zbiA9ICppcDsKKyAgICAgIHByZXZfaW5zbl9yZWxvY190eXBlID0gcmVsb2NfdHlwZTsKKyAgICAgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gcHJldl9pbnNuX3VucmVvcmRlcmVkOworICAgICAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMTsKKyAgICB9CisKKyAgLyogV2UganVzdCBvdXRwdXQgYW4gaW5zbiwgc28gdGhlIG5leHQgb25lIGRvZXNuJ3QgaGF2ZSBhIGxhYmVsLiAgKi8KKyAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKKworICAvKiBXZSBtdXN0IGVuc3VyZSB0aGF0IGEgZml4dXAgYXNzb2NpYXRlZCB3aXRoIGFuIHVubWF0Y2hlZCAlaGkKKyAgICAgcmVsb2MgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgT3RoZXJ3aXNlLCB0aGUKKyAgICAgcmVhcnJhbmdlbWVudCBvZiAlaGkgcmVsb2NzIGluIGZyb2JfZmlsZSBtYXkgY29uZnVzZQorICAgICB0Y19nZW5fcmVsb2MuICAqLworICBpZiAodW5tYXRjaGVkX2hpKQorICAgIHsKKyAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOworICAgICAgZnJhZ19uZXcgKDApOworICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiBmb3JnZXRzIHRoYXQgdGhlcmUgd2FzIGFueSBwcmV2aW91cyBpbnN0cnVjdGlvbiBvcgorICAgbGFiZWwuICBJZiBQUkVTRVJWRSBpcyBub24temVybywgaXQgcmVtZW1iZXJzIGVub3VnaCBpbmZvcm1hdGlvbiB0bworICAga25vdyB3aGV0aGVyIG5vcHMgYXJlIG5lZWRlZCBiZWZvcmUgYSBub3Jlb3JkZXIgc2VjdGlvbi4gKi8KKworc3RhdGljIHZvaWQKK21pcHNfbm9fcHJldl9pbnNuIChwcmVzZXJ2ZSkKKyAgICAgaW50IHByZXNlcnZlOworeworICBpZiAoISBwcmVzZXJ2ZSkKKyAgICB7CisgICAgICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7CisgICAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKKyAgICAgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOworICAgICAgcHJldl9ub3BfZnJhZ19ob2xkcyA9IDA7CisgICAgICBwcmV2X25vcF9mcmFnX3JlcXVpcmVkID0gMDsKKyAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOworICAgIH0KKyAgcHJldl9pbnNuX3ZhbGlkID0gMDsKKyAgcHJldl9pbnNuX2lzX2RlbGF5X3Nsb3QgPSAwOworICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOworICBwcmV2X2luc25fZXh0ZW5kZWQgPSAwOworICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19VTlVTRUQ7CisgIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKKyAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuZXZlciB3ZSB0dXJuIG9uIG5vcmVvcmRlciBvciBlbWl0CisgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnN0cnVjdGlvbnMuICBJdCBpbnNlcnRzIGFueSBOT1BTIHdoaWNoIG1pZ2h0CisgICBiZSBuZWVkZWQgYnkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLCBhbmQgY2xlYXJzIHRoZSBpbmZvcm1hdGlvbgorICAga2VwdCBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9ucy4gIFRoZSBJTlNOUyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZgorICAgaW5zdHJ1Y3Rpb25zIGFyZSB0byBmb2xsb3cuICovCisKK3N0YXRpYyB2b2lkCittaXBzX2VtaXRfZGVsYXlzIChpbnNucykKKyAgICAgYm9vbGVhbiBpbnNuczsKK3sKKyAgaWYgKCEgbWlwc19vcHRzLm5vcmVvcmRlcikKKyAgICB7CisgICAgICBpbnQgbm9wczsKKworICAgICAgbm9wcyA9IDA7CisgICAgICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgorCSAgICYmIG1pcHNfb3B0cy5pc2EgPCA0CisJICAgJiYgKCEgY29wX2ludGVybG9ja3MKKyAgICAgICAgICAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KKyAgICAgICAgICAgICAgICAgICAmIChJTlNOX0xPQURfQ09QUk9DX0RFTEFZCisgICAgICAgICAgICAgICAgICAgICAgfCBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCisgICAgICAgICAgICAgICAgICAgICAgfCBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpKSkKKwkgIHx8ICghIGhpbG9faW50ZXJsb2NrcworCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KKwkJICAmIChJTlNOX1JFQURfTE8KKwkJICAgICB8IElOU05fUkVBRF9ISSkpKQorCSAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgorCSAgICAgICYmICEgZ3ByX2ludGVybG9ja3MKKwkgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvIAorICAgICAgICAgICAgICAgICAgJiBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkKKwkgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKKwkgICAgICAmJiBtaXBzX29wdHMuaXNhIDwgMgorCSAgICAgICYmIChwcmV2X2luc24uaW5zbl9tby0+cGluZm8KKwkJICAmIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSkpKQorCXsKKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICArK25vcHM7CisJICBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgorCSAgICAgICAmJiBtaXBzX29wdHMuaXNhIDwgNAorCSAgICAgICAmJiAoISBjb3BfaW50ZXJsb2NrcworICAgICAgICAgICAgICAgICAgICYmIHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKSkKKwkgICAgICB8fCAoISBoaWxvX2ludGVybG9ja3MKKwkJICAmJiAoKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKKwkJICAgICAgfHwgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykpKSkKKwkgICAgKytub3BzOworCisJICBpZiAocHJldl9pbnNuX3VucmVvcmRlcmVkKQorCSAgICBub3BzID0gMDsKKwl9CisgICAgICBlbHNlIGlmICgoISBtaXBzX29wdHMubWlwczE2CisJCSYmIG1pcHNfb3B0cy5pc2EgPCA0CisJCSYmICghIGNvcF9pbnRlcmxvY2tzCisgICAgICAgICAgICAgICAgICAgICYmIHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpKQorCSAgICAgICB8fCAoISBoaWxvX2ludGVybG9ja3MKKwkJICAgJiYgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKKwkJICAgICAgIHx8IChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykpKSkKKwl7CisgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworCSAgaWYgKCEgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQpCisJICAgICsrbm9wczsKKwl9CisKKyAgICAgIGlmIChub3BzID4gMCkKKwl7CisJICBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICpsOworCisJICBpZiAoaW5zbnMpCisJICAgIHsKKwkgICAgICAvKiBSZWNvcmQgdGhlIGZyYWcgd2hpY2ggaG9sZHMgdGhlIG5vcCBpbnN0cnVjdGlvbnMsIHNvCisgICAgICAgICAgICAgICAgIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGVtIGlmIHdlIGRvbid0IG5lZWQgdGhlbS4gICovCisJICAgICAgZnJhZ19ncm93IChtaXBzX29wdHMubWlwczE2ID8gbm9wcyAqIDIgOiBub3BzICogNCk7CisJICAgICAgcHJldl9ub3BfZnJhZyA9IGZyYWdfbm93OworCSAgICAgIHByZXZfbm9wX2ZyYWdfaG9sZHMgPSBub3BzOworCSAgICAgIHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQgPSAwOworCSAgICAgIHByZXZfbm9wX2ZyYWdfc2luY2UgPSAwOworCSAgICB9CisKKwkgIGZvciAoOyBub3BzID4gMDsgLS1ub3BzKQorCSAgICBlbWl0X25vcCAoKTsKKworCSAgaWYgKGluc25zKQorCSAgICB7CisJICAgICAgLyogTW92ZSBvbiB0byBhIG5ldyBmcmFnLCBzbyB0aGF0IGl0IGlzIHNhZmUgdG8gc2ltcGx5CisgICAgICAgICAgICAgICAgIGRlY3JlYXNlIHRoZSBzaXplIG9mIHByZXZfbm9wX2ZyYWcuICovCisJICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7CisJICAgICAgZnJhZ19uZXcgKDApOworCSAgICB9CisKKwkgIGZvciAobCA9IGluc25fbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorCSAgICB7CisJICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsLT5sYWJlbCkgPT0gbm93X3NlZyk7CisJICAgICAgbC0+bGFiZWwtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKwkgICAgICBTX1NFVF9WQUxVRSAobC0+bGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisJICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIGFyZSBzdG9yZWQgYXMgb2RkLiAgKi8KKwkgICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKKwkJKytsLT5sYWJlbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBNYXJrIGluc3RydWN0aW9uIGxhYmVscyBpbiBtaXBzMTYgbW9kZS4gICovCisgIGlmIChtaXBzX29wdHMubWlwczE2ICYmIGluc25zKQorICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKKworICBtaXBzX25vX3ByZXZfaW5zbiAoaW5zbnMpOworfQorCisvKiBCdWlsZCBhbiBpbnN0cnVjdGlvbiBjcmVhdGVkIGJ5IGEgbWFjcm8gZXhwYW5zaW9uLiAgVGhpcyBpcyBwYXNzZWQKKyAgIGEgcG9pbnRlciB0byB0aGUgY291bnQgb2YgaW5zdHJ1Y3Rpb25zIGNyZWF0ZWQgc28gZmFyLCBhbgorICAgZXhwcmVzc2lvbiwgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJ1aWxkLCBhbiBvcGVyYW5kIGZvcm1hdAorICAgc3RyaW5nLCBhbmQgY29ycmVzcG9uZGluZyBhcmd1bWVudHMuICAqLworCisjaWZkZWYgVVNFX1NUREFSRworc3RhdGljIHZvaWQKK21hY3JvX2J1aWxkIChjaGFyICpwbGFjZSwKKwkgICAgIGludCAqY291bnRlciwKKwkgICAgIGV4cHJlc3Npb25TICogZXAsCisJICAgICBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgY29uc3QgY2hhciAqZm10LAorCSAgICAgLi4uKQorI2Vsc2UKK3N0YXRpYyB2b2lkCittYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIHZhX2FsaXN0KQorICAgICBjaGFyICpwbGFjZTsKKyAgICAgaW50ICpjb3VudGVyOworICAgICBleHByZXNzaW9uUyAqZXA7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKmZtdDsKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgaW5zbl9pc2E7CisKKyNpZmRlZiBVU0VfU1REQVJHCisgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZ3MpOworI2VuZGlmCisKKyAgLyoKKyAgICogSWYgdGhlIG1hY3JvIGlzIGFib3V0IHRvIGV4cGFuZCBpbnRvIGEgc2Vjb25kIGluc3RydWN0aW9uLAorICAgKiBwcmludCBhIHdhcm5pbmcgaWYgbmVlZGVkLiBXZSBuZWVkIHRvIHBhc3MgaXAgYXMgYSBwYXJhbWV0ZXIKKyAgICogdG8gZ2VuZXJhdGUgYSBiZXR0ZXIgd2FybmluZyBtZXNzYWdlIGhlcmUuLi4KKyAgICovCisgIGlmIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgJiYgcGxhY2UgPT0gTlVMTCAmJiAqY291bnRlciA9PSAxKQorICAgIGFzX3dhcm4gKF8oIk1hY3JvIGluc3RydWN0aW9uIGV4cGFuZGVkIGludG8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIikpOworCisgIGlmIChwbGFjZSA9PSBOVUxMKQorICAgICpjb3VudGVyICs9IDE7CQkvKiBidW1wIGluc3RydWN0aW9uIGNvdW50ZXIgKi8KKworICBpZiAobWlwc19vcHRzLm1pcHMxNikKKyAgICB7CisgICAgICBtaXBzMTZfbWFjcm9fYnVpbGQgKHBsYWNlLCBjb3VudGVyLCBlcCwgbmFtZSwgZm10LCBhcmdzKTsKKyAgICAgIHZhX2VuZCAoYXJncyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHIgPSBCRkRfUkVMT0NfVU5VU0VEOworICBpbnNuLmluc25fbW8gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7CisgIGFzc2VydCAoaW5zbi5pbnNuX21vKTsKKyAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7CisKKyAgLyogU2VhcmNoIHVudGlsIHdlIGdldCBhIG1hdGNoIGZvciBOQU1FLiAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0ExKQorCWluc25faXNhID0gMTsKKyAgICAgIGVsc2UgaWYgKChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EyKQorCWluc25faXNhID0gMjsKKyAgICAgIGVsc2UgaWYgKChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EzKQorCWluc25faXNhID0gMzsKKyAgICAgIGVsc2UgaWYgKChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0E0KQorCWluc25faXNhID0gNDsKKyAgICAgIGVsc2UKKwlpbnNuX2lzYSA9IDE1OworCisgICAgICBpZiAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgPT0gMAorCSAgJiYgaW5zbi5pbnNuX21vLT5waW5mbyAhPSBJTlNOX01BQ1JPCisJICAmJiAoaW5zbl9pc2EgPD0gbWlwc19vcHRzLmlzYQorCSAgICAgIHx8IChtaXBzX2NwdSA9PSA0NjUwCisJCSAgJiYgKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fNDY1MCkgIT0gMCkKKwkgICAgICB8fCAobWlwc19jcHUgPT0gNDAxMAorCQkgICYmIChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOXzQwMTApICE9IDApCisJICAgICAgfHwgKChtaXBzX2NwdSA9PSA0MTAwCisJCSAgIHx8IG1pcHNfY3B1ID09IDQxMTEKKwkJICAgKQorCQkgICYmIChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOXzQxMDApICE9IDApCisJICAgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAKKwkJICAmJiAoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl8zOTAwKSAhPSAwKSkKKwkgICYmIChtaXBzX2NwdSAhPSA0NjUwIHx8IChpbnNuLmluc25fbW8tPnBpbmZvICYgRlBfRCkgPT0gMCkpCisJYnJlYWs7CisKKyAgICAgICsraW5zbi5pbnNuX21vOworICAgICAgYXNzZXJ0IChpbnNuLmluc25fbW8tPm5hbWUpOworICAgICAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7CisgICAgfQorCisgIGluc24uaW5zbl9vcGNvZGUgPSBpbnNuLmluc25fbW8tPm1hdGNoOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHN3aXRjaCAoKmZtdCsrKQorCXsKKwljYXNlICdcMCc6CisJICBicmVhazsKKworCWNhc2UgJywnOgorCWNhc2UgJygnOgorCWNhc2UgJyknOgorCSAgY29udGludWU7CisKKwljYXNlICd0JzoKKwljYXNlICd3JzoKKwljYXNlICdFJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDE2OworCSAgY29udGludWU7CisKKwljYXNlICdjJzoKKwljYXNlICdUJzoKKwljYXNlICdXJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDE2OworCSAgY29udGludWU7CisKKwljYXNlICdkJzoKKwljYXNlICdHJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDExOworCSAgY29udGludWU7CisKKwljYXNlICdWJzoKKwljYXNlICdTJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDExOworCSAgY29udGludWU7CisKKwljYXNlICd6JzoKKwkgIGNvbnRpbnVlOworCisJY2FzZSAnPCc6CisJICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OworCSAgY29udGludWU7CisKKwljYXNlICdEJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7CisJICBjb250aW51ZTsKKworCWNhc2UgJ0InOgorCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKKwkgIGNvbnRpbnVlOworCisJY2FzZSAncSc6CisJICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OworCSAgY29udGludWU7CisKKwljYXNlICdiJzoKKwljYXNlICdzJzoKKwljYXNlICdyJzoKKwljYXNlICd2JzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDIxOworCSAgY29udGludWU7CisKKwljYXNlICdpJzoKKwljYXNlICdqJzoKKwljYXNlICdvJzoKKwkgIHIgPSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSB2YV9hcmcgKGFyZ3MsIGludCk7CisJICBhc3NlcnQgKHIgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKKwkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwKKwkJICB8fCByID09IEJGRF9SRUxPQ19MTzE2CisJCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19HT1QxNgorCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTDE2CisJCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgorCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2CisJCSAgfHwgKGVwLT5YX29wID09IE9fc3VidHJhY3QKKwkJICAgICAgJiYgbm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24KKwkJICAgICAgJiYgciA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNikpOworCSAgY29udGludWU7CisKKwljYXNlICd1JzoKKwkgIHIgPSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSB2YV9hcmcgKGFyZ3MsIGludCk7CisJICBhc3NlcnQgKGVwICE9IE5VTEwKKwkJICAmJiAoZXAtPlhfb3AgPT0gT19jb25zdGFudAorCQkgICAgICB8fCAoZXAtPlhfb3AgPT0gT19zeW1ib2wKKwkJCSAgJiYgKHIgPT0gQkZEX1JFTE9DX0hJMTZfUworCQkJICAgICAgfHwgciA9PSBCRkRfUkVMT0NfSEkxNgorCQkJICAgICAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgorCQkJICAgICAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYpKQorCQkgICAgICB8fCAoZXAtPlhfb3AgPT0gT19zdWJ0cmFjdAorCQkJICAmJiBub3dfc2VnID09IHRleHRfc2VjdGlvbgorCQkJICAmJiByID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpKSk7CisJICBpZiAoZXAtPlhfb3AgPT0gT19jb25zdGFudCkKKwkgICAgeworCSAgICAgIGluc24uaW5zbl9vcGNvZGUgfD0gKGVwLT5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOworCSAgICAgIGVwID0gTlVMTDsKKwkgICAgICByID0gQkZEX1JFTE9DX1VOVVNFRDsKKwkgICAgfQorCSAgY29udGludWU7CisKKwljYXNlICdwJzoKKwkgIGFzc2VydCAoZXAgIT0gTlVMTCk7CisJICAvKgorCSAgICogVGhpcyBhbGxvd3MgbWFjcm8oKSB0byBwYXNzIGFuIGltbWVkaWF0ZSBleHByZXNzaW9uIGZvcgorCSAgICogY3JlYXRpbmcgc2hvcnQgYnJhbmNoZXMgd2l0aG91dCBjcmVhdGluZyBhIHN5bWJvbC4KKwkgICAqIE5vdGUgdGhhdCB0aGUgZXhwcmVzc2lvbiBzdGlsbCBtaWdodCBjb21lIGZyb20gdGhlIGFzc2VtYmx5CisJICAgKiBpbnB1dCwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgaXMgbm90IGNoZWNrZWQgZm9yIHJhbmdlIG5vcgorCSAgICogaXMgYSByZWxvY2F0aW9uIGVudHJ5IGdlbmVyYXRlZCAoeXVjaykuCisJICAgKi8KKwkgIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgaW5zbi5pbnNuX29wY29kZSB8PSAoZXAtPlhfYWRkX251bWJlciA+PiAyKSAmIDB4ZmZmZjsKKwkgICAgICBlcCA9IE5VTEw7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgciA9IEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjsKKwkgIGNvbnRpbnVlOworCisJY2FzZSAnYSc6CisJICBhc3NlcnQgKGVwICE9IE5VTEwpOworCSAgciA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKKwkgIGNvbnRpbnVlOworCisJY2FzZSAnQyc6CisJICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyk7CisJICBjb250aW51ZTsKKworCWRlZmF1bHQ6CisJICBpbnRlcm5hbEVycm9yICgpOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgdmFfZW5kIChhcmdzKTsKKyAgYXNzZXJ0IChyID09IEJGRF9SRUxPQ19VTlVTRUQgPyBlcCA9PSBOVUxMIDogZXAgIT0gTlVMTCk7CisKKyAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgZXAsIHIsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK21pcHMxNl9tYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIGFyZ3MpCisgICAgIGNoYXIgKnBsYWNlOworICAgICBpbnQgKmNvdW50ZXI7CisgICAgIGV4cHJlc3Npb25TICplcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgY2hhciAqZm10OworICAgICB2YV9saXN0IGFyZ3M7Cit7CisgIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7CisKKyAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7CisgIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChtaXBzMTZfb3BfaGFzaCwgbmFtZSk7CisgIGFzc2VydCAoaW5zbi5pbnNuX21vKTsKKyAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7CisKKyAgd2hpbGUgKHN0cmNtcCAoZm10LCBpbnNuLmluc25fbW8tPmFyZ3MpICE9IDAKKwkgfHwgaW5zbi5pbnNuX21vLT5waW5mbyA9PSBJTlNOX01BQ1JPKQorICAgIHsKKyAgICAgICsraW5zbi5pbnNuX21vOworICAgICAgYXNzZXJ0IChpbnNuLmluc25fbW8tPm5hbWUpOworICAgICAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7CisgICAgfQorCisgIGluc24uaW5zbl9vcGNvZGUgPSBpbnNuLmluc25fbW8tPm1hdGNoOworICBpbnNuLnVzZV9leHRlbmQgPSBmYWxzZTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBjID0gKmZtdCsrOworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlICdcMCc6CisJICBicmVhazsKKworCWNhc2UgJywnOgorCWNhc2UgJygnOgorCWNhc2UgJyknOgorCSAgY29udGludWU7CisKKwljYXNlICd5JzoKKwljYXNlICd3JzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JZOworCSAgY29udGludWU7CisKKwljYXNlICd4JzoKKwljYXNlICd2JzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JYOworCSAgY29udGludWU7CisKKwljYXNlICd6JzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JaOworCSAgY29udGludWU7CisKKwljYXNlICdaJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX01PVkUzMlo7CisJICBjb250aW51ZTsKKworCWNhc2UgJzAnOgorCWNhc2UgJ1MnOgorCWNhc2UgJ1AnOgorCWNhc2UgJ1InOgorCSAgY29udGludWU7CisKKwljYXNlICdYJzoKKwkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IE1JUFMxNk9QX1NIX1JFR1IzMjsKKwkgIGNvbnRpbnVlOworCisJY2FzZSAnWSc6CisJICB7CisJICAgIGludCByZWdubzsKKworCSAgICByZWdubyA9IHZhX2FyZyAoYXJncywgaW50KTsKKwkgICAgcmVnbm8gPSAoKHJlZ25vICYgNykgPDwgMikgfCAoKHJlZ25vICYgMHgxOCkgPj4gMyk7CisJICAgIGluc24uaW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUkVHMzJSOworCSAgfQorCSAgY29udGludWU7CisKKwljYXNlICc8JzoKKwljYXNlICc+JzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICdIJzoKKwljYXNlICdXJzoKKwljYXNlICdEJzoKKwljYXNlICdqJzoKKwljYXNlICc4JzoKKwljYXNlICdWJzoKKwljYXNlICdDJzoKKwljYXNlICdVJzoKKwljYXNlICdrJzoKKwljYXNlICdLJzoKKwljYXNlICdwJzoKKwljYXNlICdxJzoKKwkgIHsKKwkgICAgYXNzZXJ0IChlcCAhPSBOVUxMKTsKKworCSAgICBpZiAoZXAtPlhfb3AgIT0gT19jb25zdGFudCkKKwkgICAgICByID0gQkZEX1JFTE9DX1VOVVNFRCArIGM7CisJICAgIGVsc2UKKwkgICAgICB7CisJCW1pcHMxNl9pbW1lZCAoKGNoYXIgKikgTlVMTCwgMCwgYywgZXAtPlhfYWRkX251bWJlciwgZmFsc2UsCisJCQkgICAgICBmYWxzZSwgZmFsc2UsICZpbnNuLmluc25fb3Bjb2RlLAorCQkJICAgICAgJmluc24udXNlX2V4dGVuZCwgJmluc24uZXh0ZW5kKTsKKwkJZXAgPSBOVUxMOworCQlyID0gQkZEX1JFTE9DX1VOVVNFRDsKKwkgICAgICB9CisJICB9CisJICBjb250aW51ZTsKKworCWNhc2UgJzYnOgorCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfSU1NNjsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgYnJlYWs7CisgICAgfQorCisgIGFzc2VydCAociA9PSBCRkRfUkVMT0NfVU5VU0VEID8gZXAgPT0gTlVMTCA6IGVwICE9IE5VTEwpOworCisgIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sIGVwLCByLCBmYWxzZSk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhICJsdWkiIGluc3RydWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorbWFjcm9fYnVpbGRfbHVpIChwbGFjZSwgY291bnRlciwgZXAsIHJlZ251bSkKKyAgICAgY2hhciAqcGxhY2U7CisgICAgIGludCAqY291bnRlcjsKKyAgICAgZXhwcmVzc2lvblMgKmVwOworICAgICBpbnQgcmVnbnVtOworeworICBleHByZXNzaW9uUyBoaWdoX2V4cHI7CisgIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7CisgIENPTlNUIGNoYXIgKm5hbWUgPSAibHVpIjsKKyAgQ09OU1QgY2hhciAqZm10ID0gInQsdSI7CisKKyAgYXNzZXJ0ICghIG1pcHNfb3B0cy5taXBzMTYpOworCisgIGlmIChwbGFjZSA9PSBOVUxMKQorICAgIGhpZ2hfZXhwciA9ICplcDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGhpZ2hfZXhwci5YX29wID0gT19jb25zdGFudDsKKyAgICAgIGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgPSBlcC0+WF9hZGRfbnVtYmVyOworICAgIH0KKworICBpZiAoaGlnaF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICAvKiB3ZSBjYW4gY29tcHV0ZSB0aGUgaW5zdHJ1Y3Rpb24gbm93IHdpdGhvdXQgYSByZWxvY2F0aW9uIGVudHJ5ICovCisgICAgICBpZiAoaGlnaF9leHByLlhfYWRkX251bWJlciAmIDB4ODAwMCkKKwloaWdoX2V4cHIuWF9hZGRfbnVtYmVyICs9IDB4MTAwMDA7CisgICAgICBoaWdoX2V4cHIuWF9hZGRfbnVtYmVyID0KKwkoKHVuc2lnbmVkIGxvbmcpIGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOworICAgICAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNzZXJ0IChlcC0+WF9vcCA9PSBPX3N5bWJvbCk7CisgICAgICAvKiBfZ3BfZGlzcCBpcyBhIHNwZWNpYWwgY2FzZSwgdXNlZCBmcm9tIHNfY3Bsb2FkLiAgKi8KKyAgICAgIGFzc2VydCAobWlwc19waWMgPT0gTk9fUElDCisJICAgICAgfHwgc3RyY21wIChTX0dFVF9OQU1FIChlcC0+WF9hZGRfc3ltYm9sKSwgIl9ncF9kaXNwIikgPT0gMCk7CisgICAgICByID0gQkZEX1JFTE9DX0hJMTZfUzsKKyAgICB9CisKKyAgLyoKKyAgICogSWYgdGhlIG1hY3JvIGlzIGFib3V0IHRvIGV4cGFuZCBpbnRvIGEgc2Vjb25kIGluc3RydWN0aW9uLAorICAgKiBwcmludCBhIHdhcm5pbmcgaWYgbmVlZGVkLiBXZSBuZWVkIHRvIHBhc3MgaXAgYXMgYSBwYXJhbWV0ZXIKKyAgICogdG8gZ2VuZXJhdGUgYSBiZXR0ZXIgd2FybmluZyBtZXNzYWdlIGhlcmUuLi4KKyAgICovCisgIGlmIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgJiYgcGxhY2UgPT0gTlVMTCAmJiAqY291bnRlciA9PSAxKQorICAgIGFzX3dhcm4gKF8oIk1hY3JvIGluc3RydWN0aW9uIGV4cGFuZGVkIGludG8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIikpOworCisgIGlmIChwbGFjZSA9PSBOVUxMKQorICAgICpjb3VudGVyICs9IDE7CQkvKiBidW1wIGluc3RydWN0aW9uIGNvdW50ZXIgKi8KKworICBpbnNuLmluc25fbW8gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgbmFtZSk7CisgIGFzc2VydCAoaW5zbi5pbnNuX21vKTsKKyAgYXNzZXJ0IChzdHJjbXAgKG5hbWUsIGluc24uaW5zbl9tby0+bmFtZSkgPT0gMCk7CisgIGFzc2VydCAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgPT0gMCk7CisKKyAgaW5zbi5pbnNuX29wY29kZSA9IGluc24uaW5zbl9tby0+bWF0Y2ggfCAocmVnbnVtIDw8IE9QX1NIX1JUKTsKKyAgaWYgKHIgPT0gQkZEX1JFTE9DX1VOVVNFRCkKKyAgICB7CisgICAgICBpbnNuLmluc25fb3Bjb2RlIHw9IGhpZ2hfZXhwci5YX2FkZF9udW1iZXI7CisgICAgICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCBOVUxMLCByLCBmYWxzZSk7CisgICAgfQorICBlbHNlCisgICAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgJmhpZ2hfZXhwciwgciwgZmFsc2UpOworfQorCisvKgkJCXNldF9hdCgpCisgKiBHZW5lcmF0ZXMgY29kZSB0byBzZXQgdGhlICRhdCByZWdpc3RlciB0byB0cnVlIChvbmUpCisgKiBpZiByZWcgaXMgbGVzcyB0aGFuIHRoZSBpbW1lZGlhdGUgZXhwcmVzc2lvbi4KKyAqLworc3RhdGljIHZvaWQKK3NldF9hdCAoY291bnRlciwgcmVnLCB1bnNpZ25lZHApCisgICAgIGludCAqY291bnRlcjsKKyAgICAgaW50IHJlZzsKKyAgICAgaW50IHVuc2lnbmVkcDsKK3sKKyAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKKyAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKKyAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmltbV9leHByLAorCQkgdW5zaWduZWRwID8gInNsdGl1IiA6ICJzbHRpIiwKKwkJICJ0LHIsaiIsIEFULCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIEFULCAmaW1tX2V4cHIsIDApOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCisJCSAgIHVuc2lnbmVkcCA/ICJzbHR1IiA6ICJzbHQiLAorCQkgICAiZCx2LHQiLCBBVCwgcmVnLCBBVCk7CisgICAgfQorfQorCisvKiBXYXJuIGlmIGFuIGV4cHJlc3Npb24gaXMgbm90IGEgY29uc3RhbnQuICAqLworCitzdGF0aWMgdm9pZAorY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsIGV4KQorICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKKyAgICAgZXhwcmVzc2lvblMgKmV4OworeworICBpZiAoZXgtPlhfb3AgPT0gT19iaWcpCisgICAgYXNfYmFkIChfKCJ1bnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKKyAgZWxzZSBpZiAoZXgtPlhfb3AgIT0gT19jb25zdGFudCkKKyAgICBhc19iYWQgKF8oIkluc3RydWN0aW9uICVzIHJlcXVpcmVzIGFic29sdXRlIGV4cHJlc3Npb24iKSwgaXAtPmluc25fbW8tPm5hbWUpOworfQorCisvKiBDb3VudCB0aGUgbGVhZGluZyB6ZXJvZXMgYnkgcGVyZm9ybWluZyBhIGJpbmFyeSBjaG9wLiBUaGlzIGlzIGEKKyAgIGJ1bGt5IGJpdCBvZiBzb3VyY2UsIGJ1dCBwZXJmb3JtYW5jZSBpcyBhIExPVCBiZXR0ZXIgZm9yIHRoZQorICAgbWFqb3JpdHkgb2YgdmFsdWVzIHRoYW4gYSBzaW1wbGUgbG9vcCB0byBjb3VudCB0aGUgYml0czoKKyAgICAgICBmb3IgKGxjbnQgPSAwOyAobGNudCA8IDMyKTsgbGNudCsrKQorICAgICAgICAgaWYgKCh2KSAmICgxIDw8ICgzMSAtIGxjbnQpKSkKKyAgICAgICAgICAgYnJlYWs7CisgIEhvd2V2ZXIgaXQgaXMgbm90IGNvZGUgc2l6ZSBmcmllbmRseSwgYW5kIHRoZSBnYWluIHdpbGwgZHJvcCBhIGJpdAorICBvbiBjZXJ0YWluIGNhY2hlZCBzeXN0ZW1zLgorKi8KKyNkZWZpbmUgQ09VTlRfVE9QX1pFUk9FUyh2KSAgICAgICAgICAgICBcCisgICgoKHYpICYgfjB4ZmZmZikgPT0gMCAgICAgICAgICAgICAgICAgXAorICAgPyAoKHYpICYgfjB4ZmYpID09IDAgICAgICAgICAgICAgICAgIFwKKyAgICAgPyAoKHYpICYgfjB4ZikgPT0gMCAgICAgICAgICAgICAgICBcCisgICAgICAgPyAoKHYpICYgfjB4MykgPT0gMCAgICAgICAgICAgICAgXAorICAgICAgICAgPyAoKHYpICYgfjB4MSkgPT0gMCAgICAgICAgICAgIFwKKyAgICAgICAgICAgPyAhKHYpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgPyAzMiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIDogMzEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgOiAzMCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICA6ICgodikgJiB+MHg3KSA9PSAwICAgICAgICAgICAgXAorICAgICAgICAgICA/IDI5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgOiAyOCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKHYpICYgfjB4M2YpID09IDAgICAgICAgICAgICAgXAorICAgICAgICAgPyAoKHYpICYgfjB4MWYpID09IDAgICAgICAgICAgIFwKKyAgICAgICAgICAgPyAyNyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogMjYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgOiAoKHYpICYgfjB4N2YpID09IDAgICAgICAgICAgIFwKKyAgICAgICAgICAgPyAyNSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogMjQgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6ICgodikgJiB+MHhmZmYpID09IDAgICAgICAgICAgICAgIFwKKyAgICAgICA/ICgodikgJiB+MHgzZmYpID09IDAgICAgICAgICAgICBcCisgICAgICAgICA/ICgodikgJiB+MHgxZmYpID09IDAgICAgICAgICAgXAorICAgICAgICAgICA/IDIzICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgOiAyMiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICA6ICgodikgJiB+MHg3ZmYpID09IDAgICAgICAgICAgXAorICAgICAgICAgICA/IDIxICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgOiAyMCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKHYpICYgfjB4M2ZmZikgPT0gMCAgICAgICAgICAgXAorICAgICAgICAgPyAoKHYpICYgfjB4MWZmZikgPT0gMCAgICAgICAgIFwKKyAgICAgICAgICAgPyAxOSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogMTggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZikgPT0gMCAgICAgICAgIFwKKyAgICAgICAgICAgPyAxNyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogMTYgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoKHYpICYgfjB4ZmZmZmZmKSA9PSAwICAgICAgICAgICAgIFwKKyAgICAgPyAoKHYpICYgfjB4ZmZmZmYpID09IDAgICAgICAgICAgICBcCisgICAgICAgPyAoKHYpICYgfjB4M2ZmZmYpID09IDAgICAgICAgICAgXAorICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmYpID09IDAgICAgICAgIFwKKyAgICAgICAgICAgPyAxNSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogMTQgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmYpID09IDAgICAgICAgIFwKKyAgICAgICAgICAgPyAxMyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogMTIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCh2KSAmIH4weDNmZmZmZikgPT0gMCAgICAgICAgIFwKKyAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmZikgPT0gMCAgICAgICBcCisgICAgICAgICAgID8gMTEgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6IDEwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmZikgPT0gMCAgICAgICBcCisgICAgICAgICAgID8gOSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6IDggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiAoKHYpICYgfjB4ZmZmZmZmZikgPT0gMCAgICAgICAgICBcCisgICAgICAgPyAoKHYpICYgfjB4M2ZmZmZmZikgPT0gMCAgICAgICAgXAorICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmZmZikgPT0gMCAgICAgIFwKKyAgICAgICAgICAgPyA3ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogNiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmZmZikgPT0gMCAgICAgIFwKKyAgICAgICAgICAgPyA1ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIDogNCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIDogKCh2KSAmIH4weDNmZmZmZmZmKSA9PSAwICAgICAgIFwKKyAgICAgICAgID8gKCh2KSAmIH4weDFmZmZmZmZmKSA9PSAwICAgICBcCisgICAgICAgICAgID8gMyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIDogKCh2KSAmIH4weDdmZmZmZmZmKSA9PSAwICAgICBcCisgICAgICAgICAgID8gMSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICA6IDApCisKKy8qCQkJbG9hZF9yZWdpc3RlcigpCisgKiAgVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgbGVhc3QgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBuZWNjZXNzYXJ5IHRvIGxvYWQKKyAqICBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIHZhbHVlIGludG8gYSByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQKK2xvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgZXAsIGRibCkKKyAgICAgaW50ICpjb3VudGVyOworICAgICBpbnQgcmVnOworICAgICBleHByZXNzaW9uUyAqZXA7CisgICAgIGludCBkYmw7Cit7CisgIGludCBmcmVnOworICBleHByZXNzaW9uUyBoaTMyLCBsbzMyOworCisgIGlmIChlcC0+WF9vcCAhPSBPX2JpZykKKyAgICB7CisgICAgICBhc3NlcnQgKGVwLT5YX29wID09IE9fY29uc3RhbnQpOworICAgICAgaWYgKGVwLT5YX2FkZF9udW1iZXIgPCAweDgwMDAKKwkgICYmIChlcC0+WF9hZGRfbnVtYmVyID49IDAKKwkgICAgICB8fCAoZXAtPlhfYWRkX251bWJlciA+PSAtMHg4MDAwCisJCSAgJiYgKCEgZGJsCisJCSAgICAgIHx8ICEgZXAtPlhfdW5zaWduZWQKKwkJICAgICAgfHwgc2l6ZW9mIChlcC0+WF9hZGRfbnVtYmVyKSA+IDQpKSkpCisJeworCSAgLyogV2UgY2FuIGhhbmRsZSAxNiBiaXQgc2lnbmVkIHZhbHVlcyB3aXRoIGFuIGFkZGl1IHRvCisJICAgICAkemVyby4gIE5vIG5lZWQgdG8gZXZlciB1c2UgZGFkZGl1IGhlcmUsIHNpbmNlICR6ZXJvIGFuZAorCSAgICAgdGhlIHJlc3VsdCBhcmUgYWx3YXlzIGNvcnJlY3QgaW4gMzIgYml0IG1vZGUuICAqLworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAiYWRkaXUiLCAidCxyLGoiLCByZWcsIDAsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoZXAtPlhfYWRkX251bWJlciA+PSAwICYmIGVwLT5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQorCXsKKwkgIC8qIFdlIGNhbiBoYW5kbGUgMTYgYml0IHVuc2lnbmVkIHZhbHVlcyB3aXRoIGFuIG9yaSB0bworICAgICAgICAgICAgICR6ZXJvLiAgKi8KKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgMCwKKwkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgoKChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweDdmZmZmZmZmKSA9PSAwCisJCSB8fCAoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4N2ZmZmZmZmYpCisJCSAgICAgPT0gfiAob2Zmc2V0VCkgMHg3ZmZmZmZmZikpCisJCSYmICghIGRibAorCQkgICAgfHwgISBlcC0+WF91bnNpZ25lZAorCQkgICAgfHwgc2l6ZW9mIChlcC0+WF9hZGRfbnVtYmVyKSA+IDQKKwkJICAgIHx8IChlcC0+WF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkgPT0gMCkpCisJICAgICAgIHx8ICgobWlwc19vcHRzLmlzYSA8IDMgfHwgISBkYmwpCisJCSAgICYmIChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweGZmZmZmZmZmKSA9PSAwKQorCSAgICAgICB8fCAobWlwc19vcHRzLmlzYSA8IDMKKwkJICAgJiYgISBkYmwKKwkJICAgJiYgKChlcC0+WF9hZGRfbnVtYmVyICZ+IChvZmZzZXRUKSAweGZmZmZmZmZmKQorCQkgICAgICAgPT0gfiAob2Zmc2V0VCkgMHhmZmZmZmZmZikpKQorCXsKKwkgIC8qIDMyIGJpdCB2YWx1ZXMgcmVxdWlyZSBhbiBsdWkuICAqLworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAibHVpIiwgInQsdSIsIHJlZywKKwkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKKwkgIGlmICgoZXAtPlhfYWRkX251bWJlciAmIDB4ZmZmZikgIT0gMCkKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAib3JpIiwgInQscixpIiwgcmVnLCByZWcsCisJCQkgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgLyogVGhlIHZhbHVlIGlzIGxhcmdlciB0aGFuIDMyIGJpdHMuICAqLworCisgIGlmIChtaXBzX29wdHMuaXNhIDwgMykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIk51bWJlciBsYXJnZXIgdGhhbiAzMiBiaXRzIikpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAiYWRkaXUiLCAidCxyLGoiLCByZWcsIDAsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGVwLT5YX29wICE9IE9fYmlnKQorICAgIHsKKyAgICAgIGhpMzIgPSAqZXA7CisgICAgICBoaTMyLlhfYWRkX251bWJlciA9ICh2YWx1ZVQpIGhpMzIuWF9hZGRfbnVtYmVyID4+IDE2OworICAgICAgaGkzMi5YX2FkZF9udW1iZXIgPSAodmFsdWVUKSBoaTMyLlhfYWRkX251bWJlciA+PiAxNjsKKyAgICAgIGhpMzIuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZmZmZmY7CisgICAgICBsbzMyID0gKmVwOworICAgICAgbG8zMi5YX2FkZF9udW1iZXIgJj0gMHhmZmZmZmZmZjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc3NlcnQgKGVwLT5YX2FkZF9udW1iZXIgPiAyKTsKKyAgICAgIGlmIChlcC0+WF9hZGRfbnVtYmVyID09IDMpCisJZ2VuZXJpY19iaWdudW1bM10gPSAwOworICAgICAgZWxzZSBpZiAoZXAtPlhfYWRkX251bWJlciA+IDQpCisJYXNfYmFkIChfKCJOdW1iZXIgbGFyZ2VyIHRoYW4gNjQgYml0cyIpKTsKKyAgICAgIGxvMzIuWF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBsbzMyLlhfYWRkX251bWJlciA9IGdlbmVyaWNfYmlnbnVtWzBdICsgKGdlbmVyaWNfYmlnbnVtWzFdIDw8IDE2KTsKKyAgICAgIGhpMzIuWF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBoaTMyLlhfYWRkX251bWJlciA9IGdlbmVyaWNfYmlnbnVtWzJdICsgKGdlbmVyaWNfYmlnbnVtWzNdIDw8IDE2KTsKKyAgICB9CisKKyAgaWYgKGhpMzIuWF9hZGRfbnVtYmVyID09IDApCisgICAgZnJlZyA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgc2hpZnQsIGJpdDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaGksIGxvOworCisgICAgICBpZiAoaGkzMi5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikKKyAgICAgICAgeworICAgICAgICAgIGlmICgobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmY4MDAwKSA9PSAweGZmZmY4MDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJhZGRpdSIsICJ0LHIsaiIsCisJCQkgICByZWcsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChsbzMyLlhfYWRkX251bWJlciAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImx1aSIsICJ0LHUiLCByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7CisJICAgICAgaWYgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmKQorCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJvcmkiLCAidCxyLGkiLAorCQkJICAgICByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogQ2hlY2sgZm9yIDE2Yml0IHNoaWZ0ZWQgY29uc3RhbnQuICBXZSBrbm93IHRoYXQgaGkzMiBpcworICAgICAgICAgbm9uLXplcm8sIHNvIHN0YXJ0IHRoZSBtYXNrIG9uIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGhpMzIKKyAgICAgICAgIHZhbHVlLiAgKi8KKyAgICAgIHNoaWZ0ID0gMTc7CisgICAgICBkbworICAgICAgIHsKKwkgdW5zaWduZWQgbG9uZyBoaW1hc2ssIGxvbWFzazsKKworCSBpZiAoc2hpZnQgPCAzMikKKwkgICB7CisJICAgICBoaW1hc2sgPSAweGZmZmYgPj4gKDMyIC0gc2hpZnQpOworCSAgICAgbG9tYXNrID0gKDB4ZmZmZiA8PCBzaGlmdCkgJiAweGZmZmZmZmZmOworCSAgIH0KKwkgZWxzZQorCSAgIHsKKwkgICAgIGhpbWFzayA9IDB4ZmZmZiA8PCAoc2hpZnQgLSAzMik7CisJICAgICBsb21hc2sgPSAwOworCSAgIH0KKwkgaWYgKChoaTMyLlhfYWRkX251bWJlciAmIH4gKG9mZnNldFQpIGhpbWFzaykgPT0gMAorCSAgICAgJiYgKGxvMzIuWF9hZGRfbnVtYmVyICYgfiAob2Zmc2V0VCkgbG9tYXNrKSA9PSAwKQorCSAgIHsKKwkgICAgIGV4cHJlc3Npb25TIHRtcDsKKworCSAgICAgdG1wLlhfb3AgPSBPX2NvbnN0YW50OworCSAgICAgaWYgKHNoaWZ0IDwgMzIpCisJICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSAoKGhpMzIuWF9hZGRfbnVtYmVyIDw8ICgzMiAtIHNoaWZ0KSkKKwkJCQkgICB8IChsbzMyLlhfYWRkX251bWJlciA+PiBzaGlmdCkpOworCSAgICAgZWxzZQorCSAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gaGkzMi5YX2FkZF9udW1iZXIgPj4gKHNoaWZ0IC0gMzIpOworCSAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZ0bXAsICJvcmkiLCAidCxyLGkiLCByZWcsIDAsCisJCQkgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAorCQkJICAoc2hpZnQgPj0gMzIpID8gImRzbGwzMiIgOiAiZHNsbCIsCisJCQkgICJkLHcsPCIsIHJlZywgcmVnLAorCQkJICAoc2hpZnQgPj0gMzIpID8gc2hpZnQgLSAzMiA6IHNoaWZ0KTsKKwkgICAgIHJldHVybjsKKwkgICB9CisgICAgICAgICBzaGlmdCsrOworICAgICAgIH0gd2hpbGUgKHNoaWZ0IDw9ICg2NCAtIDE2KSk7CisKKyAgICAgIC8qIEZpbmQgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGxvd2VzdCBvbmUgYml0LCBhbmQgc3RvcmUgdGhlCisgICAgICAgICBzaGlmdGVkIHZhbHVlIGluIGhpL2xvLiAgKi8KKyAgICAgIGhpID0gKHVuc2lnbmVkIGxvbmcpIChoaTMyLlhfYWRkX251bWJlciAmIDB4ZmZmZmZmZmYpOworICAgICAgbG8gPSAodW5zaWduZWQgbG9uZykgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmZmZmZik7CisgICAgICBpZiAobG8gIT0gMCkKKwl7CisJICBiaXQgPSAwOworCSAgd2hpbGUgKChsbyAmIDEpID09IDApCisJICAgIHsKKwkgICAgICBsbyA+Pj0gMTsKKwkgICAgICArK2JpdDsKKwkgICAgfQorCSAgbG8gfD0gKGhpICYgKCgodW5zaWduZWQgbG9uZykgMSA8PCBiaXQpIC0gMSkpIDw8ICgzMiAtIGJpdCk7CisJICBoaSA+Pj0gYml0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiaXQgPSAzMjsKKwkgIHdoaWxlICgoaGkgJiAxKSA9PSAwKQorCSAgICB7CisJICAgICAgaGkgPj49IDE7CisJICAgICAgKytiaXQ7CisJICAgIH0KKwkgIGxvID0gaGk7CisJICBoaSA9IDA7CisJfQorCisgICAgICAvKiBPcHRpbWl6ZSBpZiB0aGUgc2hpZnRlZCB2YWx1ZSBpcyBhIChwb3dlciBvZiAyKSAtIDEuICAqLworICAgICAgaWYgKChoaSA9PSAwICYmICgobG8gKyAxKSAmIGxvKSA9PSAwKQorCSAgfHwgKGxvID09IDB4ZmZmZmZmZmYgJiYgKChoaSArIDEpICYgaGkpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgc2hpZnQgPSBDT1VOVF9UT1BfWkVST0VTICgodW5zaWduZWQgaW50KSBoaTMyLlhfYWRkX251bWJlcik7CisJICBpZiAoc2hpZnQgIT0gMCkKKyAgICAgICAgICAgIHsKKwkgICAgICBleHByZXNzaW9uUyB0bXA7CisKKwkgICAgICAvKiBUaGlzIGluc3RydWN0aW9uIHdpbGwgc2V0IHRoZSByZWdpc3RlciB0byBiZSBhbGwKKyAgICAgICAgICAgICAgICAgb25lcy4gICovCisgICAgICAgICAgICAgIHRtcC5YX29wID0gT19jb25zdGFudDsKKyAgICAgICAgICAgICAgdG1wLlhfYWRkX251bWJlciA9IChvZmZzZXRUKSAtMTsKKyAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZ0bXAsICJhZGRpdSIsICJ0LHIsaiIsCisJCQkgICByZWcsIDAsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgICAgICAgICAgaWYgKGJpdCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGJpdCArPSBzaGlmdDsKKyAgICAgICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXQgPj0gMzIpID8gImRzbGwzMiIgOiAiZHNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImQsdyw8IiwgcmVnLCByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCA+PSAzMikgPyBiaXQgLSAzMiA6IGJpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKKwkJCSAgIChzaGlmdCA+PSAzMikgPyAiZHNybDMyIiA6ICJkc3JsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJkLHcsPCIsIHJlZywgcmVnLAorCQkJICAgKHNoaWZ0ID49IDMyKSA/IHNoaWZ0IC0gMzIgOiBzaGlmdCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBTaWduIGV4dGVuZCBoaTMyIGJlZm9yZSBjYWxsaW5nIGxvYWRfcmVnaXN0ZXIsIGJlY2F1c2Ugd2UgY2FuCisgICAgICAgICBnZW5lcmFsbHkgZ2V0IGJldHRlciBjb2RlIHdoZW4gd2UgbG9hZCBhIHNpZ24gZXh0ZW5kZWQgdmFsdWUuICAqLworICAgICAgaWYgKChoaTMyLlhfYWRkX251bWJlciAmIDB4ODAwMDAwMDApICE9IDApCisJaGkzMi5YX2FkZF9udW1iZXIgfD0gfiAob2Zmc2V0VCkgMHhmZmZmZmZmZjsKKyAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgJmhpMzIsIDApOworICAgICAgZnJlZyA9IHJlZzsKKyAgICB9CisgIGlmICgobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYwMDAwKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChmcmVnICE9IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsMzIiLCAiZCx3LDwiLCByZWcsCisJCSAgICAgICBmcmVnLCAwKTsKKwkgIGZyZWcgPSByZWc7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4cHJlc3Npb25TIG1pZDE2OworCisgICAgICBpZiAoKGZyZWcgPT0gMCkgJiYgKGxvMzIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpKQorICAgICAgICB7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJsdWkiLCAidCx1IiwgcmVnLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOworICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNybDMyIiwgImQsdyw8IiwgcmVnLAorICAgICAgICAgICAgICAgICAgICAgICByZWcsIDApOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBpZiAoZnJlZyAhPSAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNsbCIsICJkLHcsPCIsIHJlZywKKwkJICAgICAgIGZyZWcsIDE2KTsKKwkgIGZyZWcgPSByZWc7CisJfQorICAgICAgbWlkMTYgPSBsbzMyOworICAgICAgbWlkMTYuWF9hZGRfbnVtYmVyID4+PSAxNjsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbWlkMTYsICJvcmkiLCAidCxyLGkiLCByZWcsCisJCSAgIGZyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLCAiZHNsbCIsICJkLHcsPCIsIHJlZywKKwkJICAgcmVnLCAxNik7CisgICAgICBmcmVnID0gcmVnOworICAgIH0KKyAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZikgIT0gMCkKKyAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJmxvMzIsICJvcmkiLCAidCxyLGkiLCByZWcsIGZyZWcsCisJCSAoaW50KSBCRkRfUkVMT0NfTE8xNik7Cit9CisKKy8qIExvYWQgYW4gYWRkcmVzcyBpbnRvIGEgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgdm9pZAorbG9hZF9hZGRyZXNzIChjb3VudGVyLCByZWcsIGVwKQorICAgICBpbnQgKmNvdW50ZXI7CisgICAgIGludCByZWc7CisgICAgIGV4cHJlc3Npb25TICplcDsKK3sKKyAgY2hhciAqcDsKKworICBpZiAoZXAtPlhfb3AgIT0gT19jb25zdGFudAorICAgICAgJiYgZXAtPlhfb3AgIT0gT19zeW1ib2wpCisgICAgeworICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOworICAgICAgZXAtPlhfb3AgPSBPX2NvbnN0YW50OworICAgIH0KKworICBpZiAoZXAtPlhfb3AgPT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICBsb2FkX3JlZ2lzdGVyIChjb3VudGVyLCByZWcsIGVwLCAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKKyAgICB7CisgICAgICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50CisJICAgYWRkaXUJJHJlZywkZ3AsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgT3RoZXJ3aXNlIHdlIHdhbnQKKwkgICBsdWkJCSRyZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQorCSAgIGFkZGl1CSRyZWcsJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQorCSBJZiB3ZSBoYXZlIGFuIGFkZGVuZCwgd2UgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGZvcm0uICAqLworICAgICAgaWYgKCh2YWx1ZVQpIGVwLT5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAorICAgICAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKGVwLT5YX2FkZF9zeW1ib2wsIDEpKQorCXAgPSBOVUxMOworICAgICAgZWxzZQorCXsKKwkgIGZyYWdfZ3JvdyAoMjApOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOworCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKKwkJCVJFTEFYX0VOQ09ERSAoNCwgOCwgMCwgNCwgMCwKKwkJCQkgICAgICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAorCQkJZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOworCX0KKyAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgY291bnRlciwgZXAsIHJlZyk7CisgICAgICBpZiAocCAhPSBOVUxMKQorCXAgKz0gNDsKKyAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKKwkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisgICAgfQorICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKKyAgICB7CisgICAgICBleHByZXNzaW9uUyBleDsKKworICAgICAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKKwkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJIE90aGVyd2lzZSB3ZSB3YW50CisJICAgbHcJCSRyZWcsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgIG5vcAorCSAgIGFkZGl1CSRyZWcsJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQorCSBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCBpdCBtdXN0IGJlIGFkZGVkIGluIGFmdGVyLiAgKi8KKyAgICAgIGV4LlhfYWRkX251bWJlciA9IGVwLT5YX2FkZF9udW1iZXI7CisgICAgICBlcC0+WF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIGZyYWdfZ3JvdyAoMjApOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAorCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCisJCSAgICA/ICJsdyIgOiAibGQiKSwKKwkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKKyAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsCisJCSAgICBSRUxBWF9FTkNPREUgKDAsIDQsIC04LCAwLCAwLCBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAorCQkgICAgZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOworICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAorCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCisJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisgICAgICBpZiAoZXguWF9hZGRfbnVtYmVyICE9IDApCisJeworCSAgaWYgKGV4LlhfYWRkX251bWJlciA8IC0weDgwMDAgfHwgZXguWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKKwkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7CisJICBleC5YX29wID0gT19jb25zdGFudDsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmZXgsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhICA8IDMpCisJCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICAgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQorICAgIHsKKyAgICAgIGV4cHJlc3Npb25TIGV4OworICAgICAgaW50IG9mZjsKKworICAgICAgLyogVGhpcyBpcyB0aGUgbGFyZ2UgR09UIGNhc2UuICBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuCisJIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAorCSAgIGx1aQkJJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQorCSAgIGFkZHUJCSRyZWcsJHJlZywkZ3AKKwkgICBsdwkJJHJlZyw8c3ltPigkcmVnKQkoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCisJIE90aGVyd2lzZSwgZm9yIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50CisJICAgbHcJCSRyZWcsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgIG5vcAorCSAgIGFkZGl1CSRyZWcsJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19MTzE2KQorCSBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCBpdCBtdXN0IGJlIGFkZGVkIGluIGFmdGVyLiAgKi8KKyAgICAgIGV4LlhfYWRkX251bWJlciA9IGVwLT5YX2FkZF9udW1iZXI7CisgICAgICBlcC0+WF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKKwlvZmYgPSA0OworICAgICAgZWxzZQorCW9mZiA9IDA7CisgICAgICBmcmFnX2dyb3cgKDMyKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwgImx1aSIsICJ0LHUiLCByZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQorCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJICAgImQsdix0IiwgcmVnLCByZWcsIEdQKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKKwkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQorCQkgICAgPyAibHciIDogImxkIiksCisJCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LCByZWcpOworICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBvZmYsIDAsCisJCSAgICBSRUxBWF9FTkNPREUgKDEyLCAxMiArIG9mZiwgb2ZmLCA4ICsgb2ZmLCAwLAorCQkJCSAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKKwkJICAgIGVwLT5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKKyAgICAgIGlmIChvZmYgPiAwKQorCXsKKwkgIC8qIFdlIG5lZWQgYSBub3AgYmVmb3JlIGxvYWRpbmcgZnJvbSAkZ3AuICBUaGlzIHNwZWNpYWwKKyAgICAgICAgICAgICBjaGVjayBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBsdWkgd2hpY2ggc3RhcnRzIHRoZSBtYWluCisgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gc3RyZWFtIGRvZXMgbm90IHJlZmVyIHRvICRncCwgYW5kIHNvIHdpbGwgbm90CisgICAgICAgICAgICAgaW5zZXJ0IHRoZSBub3Agd2hpY2ggbWF5IGJlIHJlcXVpcmVkLiAgKi8KKwkgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKKwkgIHAgKz0gNDsKKwl9CisgICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCisJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKKwkJICAgID8gImx3IiA6ICJsZCIpLAorCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOworICAgICAgcCArPSA0OworICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOworICAgICAgcCArPSA0OworICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAorCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCisJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisgICAgICBpZiAoZXguWF9hZGRfbnVtYmVyICE9IDApCisJeworCSAgaWYgKGV4LlhfYWRkX251bWJlciA8IC0weDgwMDAgfHwgZXguWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKKwkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7CisJICBleC5YX29wID0gT19jb25zdGFudDsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmZXgsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJICAgICAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQorCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwl9CisgICAgfQorICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCisgICAgeworICAgICAgLyogV2UgYWx3YXlzIGRvCisJICAgYWRkaXUJJHJlZywkZ3AsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgKi8KKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBlcCwKKwkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQorCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAidCxyLGoiLCByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7CisgICAgfQorICBlbHNlCisgICAgYWJvcnQgKCk7Cit9CisKKy8qCisgKgkJCUJ1aWxkIG1hY3JvcworICogICBUaGlzIHJvdXRpbmUgaW1wbGVtZW50cyB0aGUgc2VlbWluZ2x5IGVuZGxlc3MgbWFjcm8gb3Igc3ludGhlc2l6ZWQKKyAqIGluc3RydWN0aW9ucyBhbmQgYWRkcmVzc2luZyBtb2RlcyBpbiB0aGUgbWlwcyBhc3NlbWJseSBsYW5ndWFnZS4gTWFueQorICogb2YgdGhlc2UgbWFjcm9zIGFyZSBzaW1wbGUgYW5kIGFyZSBzaW1pbGFyIHRvIGVhY2ggb3RoZXIuIFRoZXNlIGNvdWxkCisgKiBwcm9iYWJseSBiZSBoYW5kbGVkIGJ5IHNvbWUga2luZCBvZiB0YWJsZSBvciBncmFtbWVyIGFwcm9hY2ggaW5zdGVhZCBvZgorICogdGhpcyB2ZXJib3NlIG1ldGhvZC4gT3RoZXJzIGFyZSBub3Qgc2ltcGxlIG1hY3JvcyBidXQgYXJlIG1vcmUgbGlrZQorICogb3B0aW1pemluZyBjb2RlIGdlbmVyYXRpb24uCisgKiAgIE9uZSBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24gaXMgd2hlbiBzZXZlcmFsIHN0b3JlIG1hY3JvcyBhcHBlYXIKKyAqIGNvbnNlY3V0aXZseSB0aGF0IHdvdWxkIGxvYWQgQVQgd2l0aCB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgc2FtZSBhZGRyZXNzLgorICogVGhlIGVuc3VpbmcgbG9hZCB1cHBlciBpbnN0cnVjdGlvbnMgYXJlIG9tbWl0ZWQuIFRoaXMgaW1wbGllcyBzb21lIGtpbmQKKyAqIG9mIGdsb2JhbCBvcHRpbWl6YXRpb24uIFdlIGN1cnJlbnRseSBvbmx5IG9wdGltaXplIHdpdGhpbiBhIHNpbmdsZSBtYWNyby4KKyAqICAgRm9yIG1hbnkgb2YgdGhlIGxvYWQgYW5kIHN0b3JlIG1hY3JvcyBpZiB0aGUgYWRkcmVzcyBpcyBzcGVjaWZpZWQgYXMgYQorICogY29uc3RhbnQgZXhwcmVzc2lvbiBpbiB0aGUgZmlyc3QgNjRrIG9mIG1lbW9yeSAoaWUgbGQgJDIsMHg0MDAwYykgd2UKKyAqIGZpcnN0IGxvYWQgcmVnaXN0ZXIgJ2F0JyB3aXRoIHplcm8gYW5kIHVzZSBpdCBhcyB0aGUgYmFzZSByZWdpc3Rlci4gVGhlCisgKiBtaXBzIGFzc2VtYmxlciBzaW1wbHkgdXNlcyByZWdpc3RlciAkemVyby4gSnVzdCBvbmUgdGlueSBvcHRpbWl6YXRpb24KKyAqIHdlJ3JlIG1pc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkCittYWNybyAoaXApCisgICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOworeworICByZWdpc3RlciBpbnQgdHJlZywgc3JlZywgZHJlZywgYnJlZzsKKyAgaW50IHRlbXByZWc7CisgIGludCBtYXNrOworICBpbnQgaWNudCA9IDA7CisgIGludCB1c2VkX2F0OworICBleHByZXNzaW9uUyBleHByMTsKKyAgY29uc3QgY2hhciAqczsKKyAgY29uc3QgY2hhciAqczI7CisgIGNvbnN0IGNoYXIgKmZtdDsKKyAgaW50IGxpa2VseSA9IDA7CisgIGludCBkYmwgPSAwOworICBpbnQgY29wcm9jID0gMDsKKyAgaW50IGxyID0gMDsKKyAgaW50IGltbSA9IDA7CisgIG9mZnNldFQgbWF4bnVtOworICBpbnQgb2ZmOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKKyAgY2hhciAqcDsKKyAgaW50IGhvbGRfbWlwc19vcHRpbWl6ZTsKKworICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7CisKKyAgdHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTYpICYgMHgxZjsKKyAgZHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTEpICYgMHgxZjsKKyAgc3JlZyA9IGJyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDIxKSAmIDB4MWY7CisgIG1hc2sgPSBpcC0+aW5zbl9tby0+bWFzazsKKworICBleHByMS5YX29wID0gT19jb25zdGFudDsKKyAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOworICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOworICBleHByMS5YX2FkZF9udW1iZXIgPSAxOworCisgIHN3aXRjaCAobWFzaykKKyAgICB7CisgICAgY2FzZSBNX0RBQlM6CisgICAgICBkYmwgPSAxOworICAgIGNhc2UgTV9BQlM6CisgICAgICAvKiBiZ2V6ICRhMCwuKzEyCisJIG1vdmUgdjAsJGEwCisJIHN1YiB2MCwkemVybywkYTAKKwkgKi8KKworICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7CisgICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOworCisgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSA4OworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJiZ2V6IiwgInMscCIsIHNyZWcpOworICAgICAgaWYgKGRyZWcgPT0gc3JlZykKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7CisgICAgICBlbHNlCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCBzcmVnLCAwKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKKwkJICAgZGJsID8gImRzdWIiIDogInN1YiIsCisJCSAgICJkLHYsdCIsIGRyZWcsIDAsIHNyZWcpOworCisgICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fQUREX0k6CisgICAgICBzID0gImFkZGkiOworICAgICAgczIgPSAiYWRkIjsKKyAgICAgIGdvdG8gZG9fYWRkaTsKKyAgICBjYXNlIE1fQUREVV9JOgorICAgICAgcyA9ICJhZGRpdSI7CisgICAgICBzMiA9ICJhZGR1IjsKKyAgICAgIGdvdG8gZG9fYWRkaTsKKyAgICBjYXNlIE1fREFERF9JOgorICAgICAgZGJsID0gMTsKKyAgICAgIHMgPSAiZGFkZGkiOworICAgICAgczIgPSAiZGFkZCI7CisgICAgICBnb3RvIGRvX2FkZGk7CisgICAgY2FzZSBNX0RBRERVX0k6CisgICAgICBkYmwgPSAxOworICAgICAgcyA9ICJkYWRkaXUiOworICAgICAgczIgPSAiZGFkZHUiOworICAgIGRvX2FkZGk6CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCAidCxyLGoiLCB0cmVnLCBzcmVnLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQsdix0IiwgdHJlZywgc3JlZywgQVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQU5EX0k6CisgICAgICBzID0gImFuZGkiOworICAgICAgczIgPSAiYW5kIjsKKyAgICAgIGdvdG8gZG9fYml0OworICAgIGNhc2UgTV9PUl9JOgorICAgICAgcyA9ICJvcmkiOworICAgICAgczIgPSAib3IiOworICAgICAgZ290byBkb19iaXQ7CisgICAgY2FzZSBNX05PUl9JOgorICAgICAgcyA9ICIiOworICAgICAgczIgPSAibm9yIjsKKyAgICAgIGdvdG8gZG9fYml0OworICAgIGNhc2UgTV9YT1JfSToKKyAgICAgIHMgPSAieG9yaSI7CisgICAgICBzMiA9ICJ4b3IiOworICAgIGRvX2JpdDoKKyAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKKwkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAwCisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQorCXsKKwkgIGlmIChtYXNrICE9IE1fTk9SX0kpCisJICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCAidCxyLGkiLCB0cmVnLAorCQkJIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAib3JpIiwgInQscixpIiwKKwkJCSAgIHRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3IiLCAiZCx2LHQiLAorCQkJICAgdHJlZywgdHJlZywgMCk7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkLHYsdCIsIHRyZWcsIHNyZWcsIEFUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0JFUV9JOgorICAgICAgcyA9ICJiZXEiOworICAgICAgZ290byBiZXFfaTsKKyAgICBjYXNlIE1fQkVRTF9JOgorICAgICAgcyA9ICJiZXFsIjsKKyAgICAgIGxpa2VseSA9IDE7CisgICAgICBnb3RvIGJlcV9pOworICAgIGNhc2UgTV9CTkVfSToKKyAgICAgIHMgPSAiYm5lIjsKKyAgICAgIGdvdG8gYmVxX2k7CisgICAgY2FzZSBNX0JORUxfSToKKyAgICAgIHMgPSAiYm5lbCI7CisgICAgICBsaWtlbHkgPSAxOworICAgIGJlcV9pOgorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInMsdCxwIiwgc3JlZywKKwkJICAgICAgIDApOworCSAgcmV0dXJuOworCX0KKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAicyx0LHAiLCBzcmVnLCBBVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9CR0VMOgorICAgICAgbGlrZWx5ID0gMTsKKyAgICBjYXNlIE1fQkdFOgorICAgICAgaWYgKHRyZWcgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCisJCSAgICAgICAicyxwIiwgc3JlZyk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKHNyZWcgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCisJCSAgICAgICAicyxwIiwgdHJlZyk7CisJICByZXR1cm47CisJfQorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHNyZWcsIHRyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAorCQkgICAicyx0LHAiLCBBVCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9CR1RMX0k6CisgICAgICBsaWtlbHkgPSAxOworICAgIGNhc2UgTV9CR1RfSToKKyAgICAgIC8qIGNoZWNrIGZvciA+IG1heCBpbnRlZ2VyICovCisgICAgICBtYXhudW0gPSAweDdmZmZmZmZmOworICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMyAmJiBzaXplb2YgKG1heG51bSkgPiA0KQorCXsKKwkgIG1heG51bSA8PD0gMTY7CisJICBtYXhudW0gfD0gMHhmZmZmOworCSAgbWF4bnVtIDw8PSAxNjsKKwkgIG1heG51bSB8PSAweGZmZmY7CisJfQorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heG51bQorCSAgJiYgKG1pcHNfb3B0cy5pc2EgPCAzIHx8IHNpemVvZiAobWF4bnVtKSA+IDQpKQorCXsKKwlkb19mYWxzZToKKwkgIC8qIHJlc3VsdCBpcyBhbHdheXMgZmFsc2UgKi8KKwkgIGlmICghIGxpa2VseSkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oIkJyYW5jaCAlcyBpcyBhbHdheXMgZmFsc2UgKG5vcCkiKSwgaXAtPmluc25fbW8tPm5hbWUpOworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNfd2FybiAoXygiQnJhbmNoIGxpa2VseSAlcyBpcyBhbHdheXMgZmFsc2UiKSwgaXAtPmluc25fbW8tPm5hbWUpOworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiYm5lbCIsCisJCQkgICAicyx0LHAiLCAwLCAwKTsKKwkgICAgfQorCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKKyAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIE1fQkdFX0k6CisgICAgY2FzZSBNX0JHRUxfSToKKyAgICAgIGlmIChtYXNrID09IE1fQkdFTF9JKQorCWxpa2VseSA9IDE7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKKwkJICAgICAgICJzLHAiLCBzcmVnKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJndHpsIiA6ICJiZ3R6IiwKKwkJICAgICAgICJzLHAiLCBzcmVnKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBtYXhudW0gPSAweDdmZmZmZmZmOworICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMyAmJiBzaXplb2YgKG1heG51bSkgPiA0KQorCXsKKwkgIG1heG51bSA8PD0gMTY7CisJICBtYXhudW0gfD0gMHhmZmZmOworCSAgbWF4bnVtIDw8PSAxNjsKKwkgIG1heG51bSB8PSAweGZmZmY7CisJfQorICAgICAgbWF4bnVtID0gLSBtYXhudW0gLSAxOworICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw9IG1heG51bQorCSAgJiYgKG1pcHNfb3B0cy5pc2EgPCAzIHx8IHNpemVvZiAobWF4bnVtKSA+IDQpKQorCXsKKwlkb190cnVlOgorCSAgLyogcmVzdWx0IGlzIGFsd2F5cyB0cnVlICovCisJICBhc193YXJuIChfKCJCcmFuY2ggJXMgaXMgYWx3YXlzIHRydWUiKSwgaXAtPmluc25fbW8tPm5hbWUpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiIiwgInAiKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAwKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkdFVUw6CisgICAgICBsaWtlbHkgPSAxOworICAgIGNhc2UgTV9CR0VVOgorICAgICAgaWYgKHRyZWcgPT0gMCkKKwlnb3RvIGRvX3RydWU7CisgICAgICBpZiAoc3JlZyA9PSAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCisJCSAgICAgICAicyx0LHAiLCAwLCB0cmVnKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHNyZWcsCisJCSAgIHRyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAorCQkgICAicyx0LHAiLCBBVCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9CR1RVTF9JOgorICAgICAgbGlrZWx5ID0gMTsKKyAgICBjYXNlIE1fQkdUVV9JOgorICAgICAgaWYgKHNyZWcgPT0gMAorCSAgfHwgKG1pcHNfb3B0cy5pc2EgPCAzCisJICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpKQorCWdvdG8gZG9fZmFsc2U7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQorCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7CisgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIrKzsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBNX0JHRVVfSToKKyAgICBjYXNlIE1fQkdFVUxfSToKKyAgICAgIGlmIChtYXNrID09IE1fQkdFVUxfSSkKKwlsaWtlbHkgPSAxOworICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKKwlnb3RvIGRvX3RydWU7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCisJCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAxKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkdUTDoKKyAgICAgIGxpa2VseSA9IDE7CisgICAgY2FzZSBNX0JHVDoKKyAgICAgIGlmICh0cmVnID09IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAorCQkgICAgICAgInMscCIsIHNyZWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChzcmVnID09IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAorCQkgICAgICAgInMscCIsIHRyZWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCB0cmVnLCBzcmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkdUVUw6CisgICAgICBsaWtlbHkgPSAxOworICAgIGNhc2UgTV9CR1RVOgorICAgICAgaWYgKHRyZWcgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAorCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKHNyZWcgPT0gMCkKKwlnb3RvIGRvX2ZhbHNlOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCB0cmVnLAorCQkgICBzcmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkxFTDoKKyAgICAgIGxpa2VseSA9IDE7CisgICAgY2FzZSBNX0JMRToKKyAgICAgIGlmICh0cmVnID09IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAorCQkgICAgICAgInMscCIsIHNyZWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChzcmVnID09IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAorCQkgICAgICAgInMscCIsIHRyZWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCB0cmVnLCBzcmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkxFTF9JOgorICAgICAgbGlrZWx5ID0gMTsKKyAgICBjYXNlIE1fQkxFX0k6CisgICAgICBtYXhudW0gPSAweDdmZmZmZmZmOworICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMyAmJiBzaXplb2YgKG1heG51bSkgPiA0KQorCXsKKwkgIG1heG51bSA8PD0gMTY7CisJICBtYXhudW0gfD0gMHhmZmZmOworCSAgbWF4bnVtIDw8PSAxNjsKKwkgIG1heG51bSB8PSAweGZmZmY7CisJfQorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IG1heG51bQorCSAgJiYgKG1pcHNfb3B0cy5pc2EgPCAzIHx8IHNpemVvZiAobWF4bnVtKSA+IDQpKQorCWdvdG8gZG9fdHJ1ZTsKKyAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKKyAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIE1fQkxUX0k6CisgICAgY2FzZSBNX0JMVExfSToKKyAgICAgIGlmIChtYXNrID09IE1fQkxUTF9JKQorCWxpa2VseSA9IDE7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJsdHpsIiA6ICJibHR6IiwKKwkJICAgICAgICJzLHAiLCBzcmVnKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKKwkJICAgICAgICJzLHAiLCBzcmVnKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAwKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkxFVUw6CisgICAgICBsaWtlbHkgPSAxOworICAgIGNhc2UgTV9CTEVVOgorICAgICAgaWYgKHRyZWcgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAorCQkgICAgICAgInMsdCxwIiwgc3JlZywgMCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKHNyZWcgPT0gMCkKKwlnb3RvIGRvX3RydWU7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHRyZWcsCisJCSAgIHNyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAorCQkgICAicyx0LHAiLCBBVCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9CTEVVTF9JOgorICAgICAgbGlrZWx5ID0gMTsKKyAgICBjYXNlIE1fQkxFVV9JOgorICAgICAgaWYgKHNyZWcgPT0gMAorCSAgfHwgKG1pcHNfb3B0cy5pc2EgPCAzCisJICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDB4ZmZmZmZmZmYpKQorCWdvdG8gZG9fdHJ1ZTsKKyAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKKyAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIE1fQkxUVV9JOgorICAgIGNhc2UgTV9CTFRVTF9JOgorICAgICAgaWYgKG1hc2sgPT0gTV9CTFRVTF9JKQorCWxpa2VseSA9IDE7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQorCWdvdG8gZG9fZmFsc2U7CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCisJCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzZXRfYXQgKCZpY250LCBzcmVnLCAxKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkxUTDoKKyAgICAgIGxpa2VseSA9IDE7CisgICAgY2FzZSBNX0JMVDoKKyAgICAgIGlmICh0cmVnID09IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAorCQkgICAgICAgInMscCIsIHNyZWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChzcmVnID09IDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAorCQkgICAgICAgInMscCIsIHRyZWcpOworCSAgcmV0dXJuOworCX0KKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIEFULCBzcmVnLCB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQkxUVUw6CisgICAgICBsaWtlbHkgPSAxOworICAgIGNhc2UgTV9CTFRVOgorICAgICAgaWYgKHRyZWcgPT0gMCkKKwlnb3RvIGRvX2ZhbHNlOworICAgICAgaWYgKHNyZWcgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAorCQkgICAgICAgInMsdCxwIiwgMCwgdHJlZyk7CisJICByZXR1cm47CisJfQorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIEFULCBzcmVnLAorCQkgICB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKKwkJICAgInMsdCxwIiwgQVQsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fRERJVl8zOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fRElWXzM6CisgICAgICBzID0gIm1mbG8iOworICAgICAgZ290byBkb19kaXYzOworICAgIGNhc2UgTV9EUkVNXzM6CisgICAgICBkYmwgPSAxOworICAgIGNhc2UgTV9SRU1fMzoKKyAgICAgIHMgPSAibWZoaSI7CisgICAgZG9fZGl2MzoKKyAgICAgIGlmICh0cmVnID09IDApCisJeworCSAgYXNfd2FybiAoXygiRGl2aWRlIGJ5IHplcm8uIikpOworCSAgaWYgKG1pcHNfdHJhcCkKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIDAsIDApOworCSAgZWxzZQorCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOworICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOworICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKKyAgICAgIGlmIChtaXBzX3RyYXApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHRyZWcsIDApOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAorCQkgICAgICAgZGJsID8gImRkaXYiIDogImRpdiIsCisJCSAgICAgICAieixzLHQiLCBzcmVnLCB0cmVnKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgMCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCisJCSAgICAgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKKwkJICAgICAgICJ6LHMsdCIsIHNyZWcsIHRyZWcpOworCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNyk7CisJfQorICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gLTE7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKKwkJICAgZGJsID8gImRhZGRpdSIgOiAiYWRkaXUiLAorCQkgICAidCxyLGoiLCBBVCwgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOworICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc190cmFwID8gKGRibCA/IDEyIDogOCkgOiAoZGJsID8gMjAgOiAxNik7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHRyZWcsIEFUKTsKKyAgICAgIGlmIChkYmwpCisJeworCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiZGFkZGl1IiwgInQscixqIiwgQVQsIDAsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJkc2xsMzIiLCAiZCx3LDwiLCBBVCwgQVQsCisJCSAgICAgICAzMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGV4cHIxLlhfYWRkX251bWJlciA9IDB4ODAwMDAwMDA7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImx1aSIsICJ0LHUiLCBBVCwKKwkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKKwl9CisgICAgICBpZiAobWlwc190cmFwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCBzcmVnLCBBVCk7CisJICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KKwkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KKwkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgc3JlZywgQVQpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOworCisJICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KKwkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KKwkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKKworCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7CisJfQorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCIsIGRyZWcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fRElWXzNJOgorICAgICAgcyA9ICJkaXYiOworICAgICAgczIgPSAibWZsbyI7CisgICAgICBnb3RvIGRvX2Rpdmk7CisgICAgY2FzZSBNX0RJVlVfM0k6CisgICAgICBzID0gImRpdnUiOworICAgICAgczIgPSAibWZsbyI7CisgICAgICBnb3RvIGRvX2Rpdmk7CisgICAgY2FzZSBNX1JFTV8zSToKKyAgICAgIHMgPSAiZGl2IjsKKyAgICAgIHMyID0gIm1maGkiOworICAgICAgZ290byBkb19kaXZpOworICAgIGNhc2UgTV9SRU1VXzNJOgorICAgICAgcyA9ICJkaXZ1IjsKKyAgICAgIHMyID0gIm1maGkiOworICAgICAgZ290byBkb19kaXZpOworICAgIGNhc2UgTV9ERElWXzNJOgorICAgICAgZGJsID0gMTsKKyAgICAgIHMgPSAiZGRpdiI7CisgICAgICBzMiA9ICJtZmxvIjsKKyAgICAgIGdvdG8gZG9fZGl2aTsKKyAgICBjYXNlIE1fRERJVlVfM0k6CisgICAgICBkYmwgPSAxOworICAgICAgcyA9ICJkZGl2dSI7CisgICAgICBzMiA9ICJtZmxvIjsKKyAgICAgIGdvdG8gZG9fZGl2aTsKKyAgICBjYXNlIE1fRFJFTV8zSToKKyAgICAgIGRibCA9IDE7CisgICAgICBzID0gImRkaXYiOworICAgICAgczIgPSAibWZoaSI7CisgICAgICBnb3RvIGRvX2Rpdmk7CisgICAgY2FzZSBNX0RSRU1VXzNJOgorICAgICAgZGJsID0gMTsKKyAgICAgIHMgPSAiZGRpdnUiOworICAgICAgczIgPSAibWZoaSI7CisgICAgZG9fZGl2aToKKyAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCisJeworCSAgYXNfd2FybiAoXygiRGl2aWRlIGJ5IHplcm8uIikpOworCSAgaWYgKG1pcHNfdHJhcCkKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIDAsIDApOworCSAgZWxzZQorCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAxKQorCXsKKwkgIGlmIChzdHJjbXAgKHMyLCAibWZsbyIpID09IDApCisJICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywKKwkJCSBzcmVnKTsKKwkgIGVsc2UKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gLTEKKwkgICYmIHNbc3RybGVuIChzKSAtIDFdICE9ICd1JykKKwl7CisJICBpZiAoc3RyY21wIChzMiwgIm1mbG8iKSA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKGRibCkKKwkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiZG5lZyIsICJkLHciLCBkcmVnLAorCQkJICAgICBzcmVnKTsKKwkgICAgICBlbHNlCisJCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5lZyIsICJkLHciLCBkcmVnLAorCQkJICAgICBzcmVnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIDApOworCSAgcmV0dXJuOworCX0KKworICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIEFUKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkIiwgZHJlZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9ESVZVXzM6CisgICAgICBzID0gImRpdnUiOworICAgICAgczIgPSAibWZsbyI7CisgICAgICBnb3RvIGRvX2RpdnUzOworICAgIGNhc2UgTV9SRU1VXzM6CisgICAgICBzID0gImRpdnUiOworICAgICAgczIgPSAibWZoaSI7CisgICAgICBnb3RvIGRvX2RpdnUzOworICAgIGNhc2UgTV9ERElWVV8zOgorICAgICAgcyA9ICJkZGl2dSI7CisgICAgICBzMiA9ICJtZmxvIjsKKyAgICAgIGdvdG8gZG9fZGl2dTM7CisgICAgY2FzZSBNX0RSRU1VXzM6CisgICAgICBzID0gImRkaXZ1IjsKKyAgICAgIHMyID0gIm1maGkiOworICAgIGRvX2RpdnUzOgorICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7CisgICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOworICAgICAgaWYgKG1pcHNfdHJhcCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgdHJlZywgMCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIHRyZWcpOworCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCisJICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCisJICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZSIsICJzLHQscCIsIHRyZWcsIDApOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieixzLHQiLCBzcmVnLCB0cmVnKTsKKworCSAgLyogV2Ugd2FudCB0byBjbG9zZSB0aGUgbm9yZW9yZGVyIGJsb2NrIGFzIHNvb24gYXMgcG9zc2libGUsIHNvCisJICAgICB0aGF0IGxhdGVyIGluc25zIGFyZSBhdmFpbGFibGUgZm9yIGRlbGF5IHNsb3QgZmlsbGluZy4gICovCisJICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7CisJICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKKwl9CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCIsIGRyZWcpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX0RMQV9BQjoKKyAgICAgIGRibCA9IDE7CisgICAgY2FzZSBNX0xBX0FCOgorICAgICAgLyogTG9hZCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCBpbnRvIGEgcmVnaXN0ZXIuICBJZiBicmVnIGlzIG5vdAorCSB6ZXJvLCB3ZSB0aGVuIGFkZCBhIGJhc2UgcmVnaXN0ZXIgdG8gaXQuICAqLworCisgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIHBlcm1pdCBleHByZXNzaW9ucyBvZgorCSB0aGUgZm9ybQorCSAgIGxhCSQ0LGZvby1iYXIKKwkgd2hlcmUgYmFyIGlzIGFuIGFkZHJlc3MgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBUaGVzZSBhcmUgdXNlZAorCSB3aGVuIGdldHRpbmcgdGhlIGFkZHJlc3NlcyBvZiBmdW5jdGlvbnMuICBXZSBkb24ndCBwZXJtaXQKKwkgWF9hZGRfbnVtYmVyIHRvIGJlIG5vbi16ZXJvLCBiZWNhdXNlIGlmIHRoZSBzeW1ib2wgaXMKKwkgZXh0ZXJuYWwgdGhlIHJlbGF4aW5nIGNvZGUgbmVlZHMgdG8ga25vdyB0aGF0IGFueSBhZGRlbmQgaXMKKwkgcHVyZWx5IHRoZSBvZmZzZXQgdG8gWF9vcF9zeW1ib2wuICAqLworICAgICAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQworCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N1YnRyYWN0CisJICAmJiBub3dfc2VnID09IHRleHRfc2VjdGlvbgorCSAgJiYgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQKKwkgICAgICA/IFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKSA9PSB0ZXh0X3NlY3Rpb24KKwkgICAgICA6IChvZmZzZXRfZXhwci5YX29wX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAorCQkgJiYgKFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sCisJCQkJICAgIC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKQorCQkgICAgID09IHRleHRfc2VjdGlvbikpKQorCSAgJiYgYnJlZyA9PSAwCisJICAmJiBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAorCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgICAgICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCisJCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICAgICAidCxyLGoiLCB0cmVnLCB0cmVnLCAoaW50KSBCRkRfUkVMT0NfUENSRUxfTE8xNik7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N5bWJvbAorCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQorCXsKKwkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKKwkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OworCX0KKworICAgICAgaWYgKHRyZWcgPT0gYnJlZykKKwl7CisJICB0ZW1wcmVnID0gQVQ7CisJICB1c2VkX2F0ID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdGVtcHJlZyA9IHRyZWc7CisJICB1c2VkX2F0ID0gMDsKKwl9CisKKyAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCisJbG9hZF9yZWdpc3RlciAoJmljbnQsIHRlbXByZWcsICZvZmZzZXRfZXhwciwgZGJsKTsKKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IE5PX1BJQykKKwl7CisJICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAorCSAgICAgICBhZGRpdQkkdGVtcHJlZywkZ3AsPHN5bT4JKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQorCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKKwkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKKwkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQorCSAgICAgSWYgd2UgaGF2ZSBhIGNvbnN0YW50LCB3ZSBuZWVkIHR3byBpbnN0cnVjdGlvbnMgYW55aG93LAorCSAgICAgc28gd2UgbWF5IGFzIHdlbGwgYWx3YXlzIHVzZSB0aGUgbGF0dGVyIGZvcm0uICAqLworCSAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCisJICAgICAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKKwkgICAgcCA9IE5VTEw7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcmFnX2dyb3cgKDIwKTsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgICAgIAkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKKwkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCQkgICAidCxyLGoiLCB0ZW1wcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOworCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCisJCQkgICAgUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAorCQkJCQkgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCisJCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKKwkJCSAgICAoY2hhciAqKSBOVUxMKTsKKwkgICAgfQorCSAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKKwkgIGlmIChwICE9IE5VTEwpCisJICAgIHAgKz0gNDsKKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQorCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQorCXsKKwkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCBhbmQgdGhlcmUKKwkgICAgIGlzIG5vIGNvbnN0YW50LCB3ZSB3YW50CisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50CisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgICAgICBub3AKKwkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQorCisJICAgICBJZiB3ZSBoYXZlIGEgc21hbGwgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCisJICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJICAgICAgIG5vcAorCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8Y29uc3RhbnQ+CisJICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24KKwkgICAgIHNlcXVlbmNlLCBidXQgd2Ugb3V0cHV0IGEgQkZEX1JFTE9DX0xPMTYgcmVsb2Mgb24gdGhlCisJICAgICBhZGRpdSBpbnN0cnVjdGlvbi4KKworCSAgICAgSWYgd2UgaGF2ZSBhIGxhcmdlIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bworCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50CisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgICAgICBsdWkJJGF0LDxoaWNvbnN0YW50PgorCSAgICAgICBhZGRpdQkkYXQsJGF0LDxsb2NvbnN0YW50PgorCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRhdAorCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50IHRoZSBzYW1lIGluc3RydWN0aW9uCisJICAgICBzZXF1ZW5jZSwgYnV0IHdlIG91dHB1dCBhIEJGRF9SRUxPQ19MTzE2IHJlbG9jIG9uIHRoZQorCSAgICAgYWRkaXUgaW5zdHJ1Y3Rpb24uICAqLworCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOworCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKKwkgIGZyYWdfZ3JvdyAoMzIpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKKwkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOworCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA9PSAwKQorCSAgICB7CisJICAgICAgaW50IG9mZjsKKworCSAgICAgIGlmIChicmVnID09IDApCisJCW9mZiA9IDA7CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2UncmUgZ29pbmcgdG8gcHV0IGluIGFuIGFkZHUgaW5zdHJ1Y3Rpb24gdXNpbmcKKwkJICAgICB0ZW1wcmVnLCBzbyB3ZSBtYXkgYXMgd2VsbCBpbnNlcnQgdGhlIG5vcCByaWdodAorCQkgICAgIG5vdy4gICovCisJCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICAgICAibm9wIiwgIiIpOworCQkgIG9mZiA9IDQ7CisJCX0KKwkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4IC0gb2ZmLCAwLAorCQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgOCAtIG9mZiwgLTQgLSBvZmYsIDQgLSBvZmYsIDAsCisJCQkJCSAgKGJyZWcgPT0gMAorCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcworCQkJCQkgICA6IDApKSwKKwkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkJICAgIChjaGFyICopIE5VTEwpOworCSAgICAgIGlmIChicmVnID09IDApCisJCXsKKwkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOworCQkgIHAgKz0gNDsKKwkJfQorCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKKwkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgICAgICAvKiBGSVhNRTogSWYgYnJlZyA9PSAwLCBhbmQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdXNlcworCQkgJHRlbXByZWcsIHRoZW4gaWYgdGhpcyB2YXJpYW50IGNhc2UgaXMgdXNlZCBhbiBleHRyYQorCQkgbm9wIHdpbGwgYmUgZ2VuZXJhdGVkLiAgKi8KKwkgICAgfQorCSAgZWxzZSBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKKwkJICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICJub3AiLCAiIik7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCisJCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCisJCQkgICAgICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTIsIC00LCAwLCAwKSwKKwkJCSAgICAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkJICAgICAgIChjaGFyICopIE5VTEwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnQgb2ZmMTsKKworCSAgICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byBhZGQgaW4gYSBiYXNlIHJlZ2lzdGVyLCBhbmQgdGhlCisJCSB0YXJnZXQgcmVnaXN0ZXIgYW5kIHRoZSBiYXNlIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSwKKwkJIHRoZW4gd2UgYXJlIHVzaW5nIEFUIGFzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiAgU2luY2UKKwkJIHdlIHdhbnQgdG8gbG9hZCB0aGUgY29uc3RhbnQgaW50byBBVCwgd2UgYWRkIG91cgorCQkgY3VycmVudCBBVCAoZnJvbSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSkgYW5kIHRoZQorCQkgcmVnaXN0ZXIgaW50byB0aGUgcmVnaXN0ZXIgbm93LCBhbmQgcHJldGVuZCB3ZSB3ZXJlCisJCSBub3QgdXNpbmcgYSBiYXNlIHJlZ2lzdGVyLiAgKi8KKwkgICAgICBpZiAoYnJlZyAhPSB0cmVnKQorCQlvZmYxID0gMDsKKwkgICAgICBlbHNlCisJCXsKKwkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgICAgICJub3AiLCAiIik7CisJCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7CisJCSAgYnJlZyA9IDA7CisJCSAgdGVtcHJlZyA9IHRyZWc7CisJCSAgb2ZmMSA9IC04OworCQl9CisKKwkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSBhcm91bmQgdGhlIGx1aSBpbnN0cnVjdGlvbiB0byBhdm9pZAorCQkgaW5zZXJ0aW5nIGFuIHVubmVjZXNzYXJ5IG5vcCBhZnRlciB0aGUgbHcuICAqLworCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7CisJICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7CisJICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBBVCk7CisJICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKKworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKKwkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEFUKTsKKwkgICAgICAodm9pZCkgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAwLCAwLAorCQkJICAgICAgIFJFTEFYX0VOQ09ERSAoMCwgMCwgLTE2ICsgb2ZmMSwgLTgsIDAsIDApLAorCQkJICAgICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCisJCQkgICAgICAgKGNoYXIgKikgTlVMTCk7CisJICAgICAgdXNlZF9hdCA9IDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKKwl7CisJICBpbnQgZ3BkZWw7CisKKwkgIC8qIFRoaXMgaXMgdGhlIGxhcmdlIEdPVCBjYXNlLiAgSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbgorCSAgICAgZXh0ZXJuYWwgc3ltYm9sLCBhbmQgdGhlcmUgaXMgbm8gY29uc3RhbnQsIHdlIHdhbnQKKwkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCisJICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCisJICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJICAgICAgIG5vcAorCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCisKKwkgICAgIElmIHdlIGhhdmUgYSBzbWFsbCBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KKwkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAorCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKKwkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKKwkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKKwkgICAgICAgbm9wCisJICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4KKwkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAorCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKKwkgICAgICAgbm9wCisJICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4gKEJGRF9SRUxPQ19MTzE2KQorCisJICAgICBJZiB3ZSBoYXZlIGEgbGFyZ2UgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCisJICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCisJICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCisJICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+CisJICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+CisJICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGF0CisJICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+CisJICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+CShCRkRfUkVMT0NfTE8xNikKKwkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKKwkgICAgICovCisJICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7CisJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOworCSAgZnJhZ19ncm93ICg1Mik7CisJICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCisJICAgIGdwZGVsID0gNDsKKwkgIGVsc2UKKwkgICAgZ3BkZWwgPSAwOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKKwkJICAgICAgIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCT8gImFkZHUiIDogImRhZGR1IiksCisJCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBHUCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgIGRibCA/ICJsZCIgOiAibHciLAorCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAorCQkgICAgICAgdGVtcHJlZyk7CisJICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID09IDApCisJICAgIHsKKwkgICAgICBpbnQgb2ZmOworCisJICAgICAgaWYgKGJyZWcgPT0gMCkKKwkJb2ZmID0gMDsKKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBXZSdyZSBnb2luZyB0byBwdXQgaW4gYW4gYWRkdSBpbnN0cnVjdGlvbiB1c2luZworCQkgICAgIHRlbXByZWcsIHNvIHdlIG1heSBhcyB3ZWxsIGluc2VydCB0aGUgbm9wIHJpZ2h0CisJCSAgICAgbm93LiAgKi8KKwkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgICAgICJub3AiLCAiIik7CisJCSAgb2ZmID0gNDsKKwkJfQorCisJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKKwkJCSAgICBSRUxBWF9FTkNPREUgKDEyICsgb2ZmLCAxMiArIGdwZGVsLCBncGRlbCwKKwkJCQkJICA4ICsgZ3BkZWwsIDAsCisJCQkJCSAgKGJyZWcgPT0gMAorCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcworCQkJCQkgICA6IDApKSwKKwkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkJICAgIChjaGFyICopIE5VTEwpOworCSAgICB9CisJICBlbHNlIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAorCQkgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCisJICAgIHsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgIm5vcCIsICIiKTsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisKKwkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIGdwZGVsLCAwLAorCQkJICAgIFJFTEFYX0VOQ09ERSAoMjAsIDEyICsgZ3BkZWwsIGdwZGVsLCA4ICsgZ3BkZWwsIDAsCisJCQkJCSAgKGJyZWcgPT0gMAorCQkJCQkgICA/IG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcworCQkJCQkgICA6IDApKSwKKwkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkJICAgIChjaGFyICopIE5VTEwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnQgYWRqLCBkcmVnOworCisJICAgICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIGFkZCBpbiBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGUKKwkJIHRhcmdldCByZWdpc3RlciBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgYXJlIHRoZSBzYW1lLAorCQkgdGhlbiB3ZSBhcmUgdXNpbmcgQVQgYXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuICBTaW5jZQorCQkgd2Ugd2FudCB0byBsb2FkIHRoZSBjb25zdGFudCBpbnRvIEFULCB3ZSBhZGQgb3VyCisJCSBjdXJyZW50IEFUIChmcm9tIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlKSBhbmQgdGhlCisJCSByZWdpc3RlciBpbnRvIHRoZSByZWdpc3RlciBub3csIGFuZCBwcmV0ZW5kIHdlIHdlcmUKKwkJIG5vdCB1c2luZyBhIGJhc2UgcmVnaXN0ZXIuICAqLworCSAgICAgIGlmIChicmVnICE9IHRyZWcpCisJCXsKKwkJICBhZGogPSAwOworCQkgIGRyZWcgPSB0ZW1wcmVnOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgYXNzZXJ0ICh0ZW1wcmVnID09IEFUKTsKKwkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgICAgICJub3AiLCAiIik7CisJCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7CisJCSAgZHJlZyA9IHRyZWc7CisJCSAgYWRqID0gODsKKwkJfQorCisJICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgYXJvdW5kIHRoZSBsdWkgaW5zdHJ1Y3Rpb24gdG8gYXZvaWQKKwkJIGluc2VydGluZyBhbiB1bm5lY2Vzc2FyeSBub3AgYWZ0ZXIgdGhlIGx3LiAgKi8KKwkgICAgICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOworCSAgICAgIG1pcHNfb3B0aW1pemUgPSAyOworCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgQVQpOworCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7CisKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCQkgICAidCxyLGoiLCBBVCwgQVQsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCisJCQkgICAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7CisKKwkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxNiArIGdwZGVsICsgYWRqLCAwLAorCQkJICAgIFJFTEFYX0VOQ09ERSAoMjQgKyBhZGosIDE2ICsgZ3BkZWwgKyBhZGosIGdwZGVsLAorCQkJCQkgIDggKyBncGRlbCwgMCwKKwkJCQkJICAoYnJlZyA9PSAwCisJCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCisJCQkJCSAgIDogMCkpLAorCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCisJCQkgICAgKGNoYXIgKikgTlVMTCk7CisKKwkgICAgICB1c2VkX2F0ID0gMTsKKwkgICAgfQorCisJICBpZiAoZ3BkZWwgPiAwKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGlzIGluc3RydWN0aW9uIHVzZXMgJGdwLCBidXQKKyAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGluc3RydWN0aW9uIG9uIHRoZSBtYWluIHN0cmVhbSBkb2VzIG5vdC4gICovCisJICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKKwkgICAgICBwICs9IDQ7CisJICAgIH0KKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgZGJsID8gImxkIiA6ICJsdyIsCisJCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKKwkgIHAgKz0gNDsKKwkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAorCSAgICAgICYmIGV4cHIxLlhfYWRkX251bWJlciA8IDB4ODAwMCkKKwkgICAgeworCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7CisJICAgICAgcCArPSA0OworCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKKwkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgICAgICAvKiBGSVhNRTogSWYgYWRkX251bWJlciBpcyAwLCBhbmQgdGhlcmUgd2FzIG5vIGJhc2UKKyAgICAgICAgICAgICAgICAgcmVnaXN0ZXIsIHRoZSBleHRlcm5hbCBzeW1ib2wgY2FzZSBlbmRlZCB3aXRoIGEgbG9hZCwKKyAgICAgICAgICAgICAgICAgc28gaWYgdGhlIHN5bWJvbCB0dXJucyBvdXQgdG8gbm90IGJlIGV4dGVybmFsLCBhbmQKKyAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdXNlcyB0ZW1wcmVnLCBhbiB1bm5lY2Vzc2FyeSBub3AKKyAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbnNlcnRlZC4gICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChicmVnID09IHRyZWcpCisJCXsKKwkJICAvKiBXZSBtdXN0IGFkZCBpbiB0aGUgYmFzZSByZWdpc3RlciBub3csIGFzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgc3ltYm9sIGNhc2UuICAqLworCQkgIGFzc2VydCAodGVtcHJlZyA9PSBBVCk7CisJCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKKwkJICBwICs9IDQ7CisJCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJCSAgICAgICAiZCx2LHQiLCB0cmVnLCBBVCwgYnJlZyk7CisJCSAgcCArPSA0OworCQkgIHRlbXByZWcgPSB0cmVnOworCQkgIC8qIFdlIHNldCBicmVnIHRvIDAgYmVjYXVzZSB3ZSBoYXZlIGFycmFuZ2VkIHRvIGFkZAorICAgICAgICAgICAgICAgICAgICAgaXQgaW4gaW4gYm90aCBjYXNlcy4gICovCisJCSAgYnJlZyA9IDA7CisJCX0KKworCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZleHByMSwgQVQpOworCSAgICAgIHAgKz0gNDsKKwkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCQkgICAidCxyLGoiLCBBVCwgQVQsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgICAgICBwICs9IDQ7CisJICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgQVQpOworCSAgICAgIHAgKz0gNDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKKwl7CisJICAvKiBXZSB1c2UKKwkgICAgICAgYWRkaXUJJHRlbXByZWcsJGdwLDxzeW0+CShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgICAgICovCisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisKKyAgICAgIGlmIChicmVnICE9IDApCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkgICAgICJkLHYsdCIsIHRyZWcsIHRlbXByZWcsIGJyZWcpOworCisgICAgICBpZiAoISB1c2VkX2F0KQorCXJldHVybjsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fSl9BOgorICAgICAgLyogVGhlIGogaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSB1c2VkIGluIFBJQyBjb2RlLCBzaW5jZSBpdAorCSByZXF1aXJlcyBhbiBhYnNvbHV0ZSBhZGRyZXNzLiAgV2UgY29udmVydCBpdCB0byBhIGIKKwkgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImoiLCAiYSIpOworICAgICAgZWxzZQorCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiYiIsICJwIik7CisgICAgICByZXR1cm47CisKKyAgICAgIC8qIFRoZSBqYWwgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgaGFuZGxlZCBhcyBtYWNyb3MgYmVjYXVzZSB3aGVuCisJIGdlbmVyYXRpbmcgUElDIGNvZGUgdGhleSBleHBhbmQgdG8gbXVsdGktaW5zdHJ1Y3Rpb24KKwkgc2VxdWVuY2VzLiAgTm9ybWFsbHkgdGhleSBhcmUgc2ltcGxlIGluc3RydWN0aW9ucy4gICovCisgICAgY2FzZSBNX0pBTF8xOgorICAgICAgZHJlZyA9IFJBOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIE1fSkFMXzI6CisgICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDCisJICB8fCBtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgImphbHIiLAorCQkgICAgICJkLHMiLCBkcmVnLCBzcmVnKTsKKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQorCXsKKwkgIGlmIChzcmVnICE9IFBJQ19DQUxMX1JFRykKKwkgICAgYXNfd2FybiAoXygiTUlQUyBQSUMgY2FsbCB0byByZWdpc3RlciBvdGhlciB0aGFuICQyNSIpKTsKKyAgICAgIAorCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgImphbHIiLAorCQkgICAgICAgImQscyIsIGRyZWcsIHNyZWcpOworCSAgaWYgKG1pcHNfY3ByZXN0b3JlX29mZnNldCA8IDApCisJICAgIGFzX3dhcm4gKF8oIk5vIC5jcHJlc3RvcmUgcHNldWRvLW9wIHVzZWQgaW4gUElDIGNvZGUiKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSBtaXBzX2NwcmVzdG9yZV9vZmZzZXQ7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCisJCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgICAgPyAibHciIDogImxkIiksCisJCQkgICAidCxvKGIpIiwgR1AsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBtaXBzX2ZyYW1lX3JlZyk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgTV9KQUxfQToKKyAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJqYWwiLCAiYSIpOworICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCisJeworCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCB3ZSBhcmUKKwkgICAgIHVzaW5nIGEgc21hbGwgR09ULCB3ZSB3YW50CisJICAgICAgIGx3CSQyNSw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfQ0FMTDE2KQorCSAgICAgICBub3AKKwkgICAgICAgamFscgkkMjUKKwkgICAgICAgbm9wCisJICAgICAgIGx3CSRncCxjcHJlc3RvcmUoJHNwKQorCSAgICAgVGhlIGNwcmVzdG9yZSB2YWx1ZSBpcyBzZXQgdXNpbmcgdGhlIC5jcHJlc3RvcmUKKwkgICAgIHBzZXVkby1vcC4gIElmIHdlIGFyZSB1c2luZyBhIGJpZyBHT1QsIHdlIHdhbnQKKwkgICAgICAgbHVpCSQyNSw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNikKKwkgICAgICAgYWRkdQkkMjUsJDI1LCRncAorCSAgICAgICBsdwkkMjUsPHN5bT4oJDI1KQkJKEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikKKwkgICAgICAgbm9wCisJICAgICAgIGphbHIJJDI1CisJICAgICAgIG5vcAorCSAgICAgICBsdwkkZ3AsY3ByZXN0b3JlKCRzcCkKKwkgICAgIElmIHRoZSBzeW1ib2wgaXMgbm90IGV4dGVybmFsLCB3ZSB3YW50CisJICAgICAgIGx3CSQyNSw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJICAgICAgIG5vcAorCSAgICAgICBhZGRpdQkkMjUsJDI1LDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCisJICAgICAgIGphbHIJJDI1CisJICAgICAgIG5vcAorCSAgICAgICBsdyAkZ3AsY3ByZXN0b3JlKCRzcCkgKi8KKwkgIGZyYWdfZ3JvdyAoNDApOworCSAgaWYgKCEgbWlwc19iaWdfZ290KQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgICAgPyAibHciIDogImxkIiksCisJCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAorCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBHUCk7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICJub3AiLCAiIik7CisJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKKwkJCSAgICBSRUxBWF9FTkNPREUgKDAsIDQsIC04LCAwLCAwLCAwKSwKKwkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkJICAgIChjaGFyICopIE5VTEwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnQgZ3BkZWw7CisKKwkgICAgICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCisJCWdwZGVsID0gNDsKKwkgICAgICBlbHNlCisJCWdwZGVsID0gMDsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAorCQkJICAgUElDX0NBTExfUkVHLCAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYpOworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJCSAgICJkLHYsdCIsIFBJQ19DQUxMX1JFRywgUElDX0NBTExfUkVHLCBHUCk7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgICAgPyAibHciIDogImxkIiksCisJCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAorCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LCBQSUNfQ0FMTF9SRUcpOworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCQkgICAibm9wIiwgIiIpOworCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCisJCQkgICAgUkVMQVhfRU5DT0RFICgxNiwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwKKwkJCQkJICAwLCAwKSwKKwkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAorCQkJICAgIChjaGFyICopIE5VTEwpOworCSAgICAgIGlmIChncGRlbCA+IDApCisJCXsKKwkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOworCQkgIHAgKz0gNDsKKwkJfQorCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImx3IiA6ICJsZCIpLAorCQkJICAgInQsbyhiKSIsIFBJQ19DQUxMX1JFRywKKwkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7CisJICAgICAgcCArPSA0OworCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7CisJICAgICAgcCArPSA0OworCSAgICB9CQkJICAgCisJICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgUElDX0NBTExfUkVHLCBQSUNfQ0FMTF9SRUcsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAgICAgImphbHIiLCAicyIsIFBJQ19DQUxMX1JFRyk7CisJICBpZiAobWlwc19jcHJlc3RvcmVfb2Zmc2V0IDwgMCkKKwkgICAgYXNfd2FybiAoXygiTm8gLmNwcmVzdG9yZSBwc2V1ZG8tb3AgdXNlZCBpbiBQSUMgY29kZSIpKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChtaXBzX29wdHMubm9yZW9yZGVyKQorCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgICAibm9wIiwgIiIpOworCSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJsdyIgOiAibGQiKSwKKwkJCSAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsCisJCQkgICBtaXBzX2ZyYW1lX3JlZyk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiYWwiLCAicCIpOworCSAgLyogVGhlIGxpbmtlciBtYXkgZXhwYW5kIHRoZSBjYWxsIHRvIGEgbG9uZ2VyIHNlcXVlbmNlIHdoaWNoCisJICAgICB1c2VzICRhdCwgc28gd2UgbXVzdCBicmVhayByYXRoZXIgdGhhbiByZXR1cm4uICAqLworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZQorCWFib3J0ICgpOworCisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fTEJfQUI6CisgICAgICBzID0gImxiIjsKKyAgICAgIGdvdG8gbGQ7CisgICAgY2FzZSBNX0xCVV9BQjoKKyAgICAgIHMgPSAibGJ1IjsKKyAgICAgIGdvdG8gbGQ7CisgICAgY2FzZSBNX0xIX0FCOgorICAgICAgcyA9ICJsaCI7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MSFVfQUI6CisgICAgICBzID0gImxodSI7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MV19BQjoKKyAgICAgIHMgPSAibHciOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdDMF9BQjoKKyAgICAgIHMgPSAibHdjMCI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdDMV9BQjoKKyAgICAgIHMgPSAibHdjMSI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdDMl9BQjoKKyAgICAgIHMgPSAibHdjMiI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdDM19BQjoKKyAgICAgIHMgPSAibHdjMyI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdMX0FCOgorICAgICAgcyA9ICJsd2wiOworICAgICAgbHIgPSAxOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdSX0FCOgorICAgICAgcyA9ICJsd3IiOworICAgICAgbHIgPSAxOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTERDMV9BQjoKKyAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQorCXsKKwkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7CisJICByZXR1cm47CisJfQorICAgICAgcyA9ICJsZGMxIjsKKyAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKyAgICAgIGNvcHJvYyA9IDE7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MREMyX0FCOgorICAgICAgcyA9ICJsZGMyIjsKKyAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKyAgICAgIGNvcHJvYyA9IDE7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MREMzX0FCOgorICAgICAgcyA9ICJsZGMzIjsKKyAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKyAgICAgIGNvcHJvYyA9IDE7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MRExfQUI6CisgICAgICBzID0gImxkbCI7CisgICAgICBsciA9IDE7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MRFJfQUI6CisgICAgICBzID0gImxkciI7CisgICAgICBsciA9IDE7CisgICAgICBnb3RvIGxkOworICAgIGNhc2UgTV9MTF9BQjoKKyAgICAgIHMgPSAibGwiOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTExEX0FCOgorICAgICAgcyA9ICJsbGQiOworICAgICAgZ290byBsZDsKKyAgICBjYXNlIE1fTFdVX0FCOgorICAgICAgcyA9ICJsd3UiOworICAgIGxkOgorICAgICAgaWYgKGJyZWcgPT0gdHJlZyB8fCBjb3Byb2MgfHwgbHIpCisJeworCSAgdGVtcHJlZyA9IEFUOworCSAgdXNlZF9hdCA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRlbXByZWcgPSB0cmVnOworCSAgdXNlZF9hdCA9IDA7CisJfQorICAgICAgZ290byBsZF9zdDsKKyAgICBjYXNlIE1fU0JfQUI6CisgICAgICBzID0gInNiIjsKKyAgICAgIGdvdG8gc3Q7CisgICAgY2FzZSBNX1NIX0FCOgorICAgICAgcyA9ICJzaCI7CisgICAgICBnb3RvIHN0OworICAgIGNhc2UgTV9TV19BQjoKKyAgICAgIHMgPSAic3ciOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU1dDMF9BQjoKKyAgICAgIHMgPSAic3djMCI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU1dDMV9BQjoKKyAgICAgIHMgPSAic3djMSI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU1dDMl9BQjoKKyAgICAgIHMgPSAic3djMiI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU1dDM19BQjoKKyAgICAgIHMgPSAic3djMyI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU1dMX0FCOgorICAgICAgcyA9ICJzd2wiOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU1dSX0FCOgorICAgICAgcyA9ICJzd3IiOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU0NfQUI6CisgICAgICBzID0gInNjIjsKKyAgICAgIGdvdG8gc3Q7CisgICAgY2FzZSBNX1NDRF9BQjoKKyAgICAgIHMgPSAic2NkIjsKKyAgICAgIGdvdG8gc3Q7CisgICAgY2FzZSBNX1NEQzFfQUI6CisgICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKKwl7CisJICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOworCSAgcmV0dXJuOworCX0KKyAgICAgIHMgPSAic2RjMSI7CisgICAgICBjb3Byb2MgPSAxOworICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU0RDMl9BQjoKKyAgICAgIHMgPSAic2RjMiI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU0RDM19BQjoKKyAgICAgIHMgPSAic2RjMyI7CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU0RMX0FCOgorICAgICAgcyA9ICJzZGwiOworICAgICAgZ290byBzdDsKKyAgICBjYXNlIE1fU0RSX0FCOgorICAgICAgcyA9ICJzZHIiOworICAgIHN0OgorICAgICAgdGVtcHJlZyA9IEFUOworICAgICAgdXNlZF9hdCA9IDE7CisgICAgbGRfc3Q6CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBpZiAobWFzayA9PSBNX0xXQzFfQUIKKwkgIHx8IG1hc2sgPT0gTV9TV0MxX0FCCisJICB8fCBtYXNrID09IE1fTERDMV9BQgorCSAgfHwgbWFzayA9PSBNX1NEQzFfQUIKKwkgIHx8IG1hc2sgPT0gTV9MX0RBQgorCSAgfHwgbWFzayA9PSBNX1NfREFCKQorCWZtdCA9ICJULG8oYikiOworICAgICAgZWxzZSBpZiAoY29wcm9jKQorCWZtdCA9ICJFLG8oYikiOworICAgICAgZWxzZQorCWZtdCA9ICJ0LG8oYikiOworCisgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50CisJICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sKQorCXsKKwkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKKwkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OworCX0KKworICAgICAgLyogQSBjb25zdGFudCBleHByZXNzaW9uIGluIFBJQyBjb2RlIGNhbiBiZSBoYW5kbGVkIGp1c3QgYXMgaXQKKwkgaXMgaW4gbm9uIFBJQyBjb2RlLiAgKi8KKyAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKKwkgIHx8IG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKKwl7CisJICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgR1AgcmVsYXRpdmUgc3ltYm9sLCBhbmQgdGhlcmUKKwkgICAgIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKKwkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgICAgIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAorCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQorCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX0xPMTYpCisJICAgICBJZiB3ZSBoYXZlIGEgY29uc3RhbnQsIHdlIG5lZWQgdHdvIGluc3RydWN0aW9ucyBhbnlob3csCisJICAgICBzbyB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4KKworCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEKKwkgICAgIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAorCSAgICAgICBhZGR1CSR0ZW1wcmVnLCRicmVnLCRncAorCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCisJICAgICBPdGhlcndpc2Ugd2Ugd2FudAorCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQorCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRicmVnCisJICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTE8xNikKKwkgICAgIFdpdGggYSBjb25zdGFudCB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgY2FzZS4gICovCisJICBpZiAoYnJlZyA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCisJCSAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKKwkJcCA9IE5VTEw7CisJICAgICAgZWxzZQorCQl7CisJCSAgZnJhZ19ncm93ICgyMCk7CisJCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKKwkJCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgR1ApOworCQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDAsCisJCQkJUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAorCQkJCQkgICAgICAobWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCisJCQkJCSAgICAgICB8fCAodXNlZF9hdAorCQkJCQkJICAgJiYgbWlwc19vcHRzLm5vYXQpKSksCisJCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKKwkJCQkoY2hhciAqKSBOVUxMKTsKKwkJICB1c2VkX2F0ID0gMDsKKwkJfQorCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7CisJICAgICAgaWYgKHAgIT0gTlVMTCkKKwkJcCArPSA0OworCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsIHRyZWcsCisJCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAorCQkgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCisJCXAgPSBOVUxMOworCSAgICAgIGVsc2UKKwkJeworCQkgIGZyYWdfZ3JvdyAoMjgpOworCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJCT8gImFkZHUiIDogImRhZGR1IiksCisJCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgYnJlZywgR1ApOworCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCisJCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOworCQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyLCAwLAorCQkJCVJFTEFYX0VOQ09ERSAoOCwgMTIsIDAsIDgsIDAsIDApLAorCQkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCisJCQkJKGNoYXIgKikgTlVMTCk7CisJCX0KKwkgICAgICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHRlbXByZWcpOworCSAgICAgIGlmIChwICE9IE5VTEwpCisJCXAgKz0gNDsKKwkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCisJCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKKwkgICAgICBpZiAocCAhPSBOVUxMKQorCQlwICs9IDQ7CisJICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwgdHJlZywKKwkJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQorCXsKKwkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50CisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgICAgICBub3AKKwkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQorCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKKwkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJICAgICAgIG5vcAorCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCisJICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKKwkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2UgYWRkIGl0IHRvICR0ZW1wcmVnIGJlZm9yZQorCSAgICAgdGhlIDxvcD4uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBzdGljayBpdCBpbiB0aGUKKwkgICAgIDxvcD4gaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYW5kbGUgY29uc3RhbnRzIGxhcmdlciB0aGFuCisJICAgICAxNiBiaXRzLCBiZWNhdXNlIHdlIGhhdmUgbm8gd2F5IHRvIGxvYWQgdGhlIHVwcGVyIDE2IGJpdHMKKwkgICAgIChhY3R1YWxseSwgd2UgY291bGQgaGFuZGxlIHRoZW0gZm9yIHRoZSBzdWJzZXQgb2YgY2FzZXMKKwkgICAgIGluIHdoaWNoIHdlIGFyZSBub3QgdXNpbmcgJGF0KS4gICovCisJICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOworCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOworCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKKwkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCisJICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKKwkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7CisJICBmcmFnX2dyb3cgKDIwKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAibHciIDogImxkIiksCisJCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7CisJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLCAKKwkJCVJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIDApLAorCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKKwkJCShjaGFyICopIE5VTEwpOworCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICBpZiAoYnJlZyAhPSAwKQorCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgID8gImFkZHUiIDogImRhZGR1IiksCisJCQkgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgYnJlZyk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LCB0cmVnLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOworCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQorCXsKKwkgIGludCBncGRlbDsKKworCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgbHVpCSR0ZW1wcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCisJICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGdwCisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCR0ZW1wcmVnKSAoQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpCisJICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKKwkgICAgIE90aGVyd2lzZSB3ZSB3YW50CisJICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgICAgICBub3AKKwkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPHN5bT4JKEJGRF9SRUxPQ19MTzE2KQorCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCisJICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIGFkZCBpdCB0byAkdGVtcHJlZyBiZWZvcmUKKwkgICAgIHRoZSA8b3A+LiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgd2Ugc3RpY2sgaXQgaW4gdGhlCisJICAgICA8b3A+IGluc3RydWN0aW9uLiAgV2UgZG9uJ3QgaGFuZGxlIGNvbnN0YW50cyBsYXJnZXIgdGhhbgorCSAgICAgMTYgYml0cywgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBsb2FkIHRoZSB1cHBlciAxNiBiaXRzCisJICAgICAoYWN0dWFsbHksIHdlIGNvdWxkIGhhbmRsZSB0aGVtIGZvciB0aGUgc3Vic2V0IG9mIGNhc2VzCisJICAgICBpbiB3aGljaCB3ZSBhcmUgbm90IHVzaW5nICRhdCkuICAqLworCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sKTsKKwkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKKwkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7CisJICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAorCSAgICAgIHx8IGV4cHIxLlhfYWRkX251bWJlciA+PSAweDgwMDApCisJICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOworCSAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQorCSAgICBncGRlbCA9IDQ7CisJICBlbHNlCisJICAgIGdwZGVsID0gMDsKKwkgIGZyYWdfZ3JvdyAoMzYpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKKwkJICAgICAgIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkgICAgICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgR1ApOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKKwkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwKKwkJICAgICAgIHRlbXByZWcpOworCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKKwkJCVJFTEFYX0VOQ09ERSAoMTIsIDEyICsgZ3BkZWwsIGdwZGVsLCA4ICsgZ3BkZWwsIDAsIDApLAorCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7CisJICBpZiAoZ3BkZWwgPiAwKQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKKwkgICAgICBwICs9IDQ7CisJICAgIH0KKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAibHciIDogImxkIiksCisJCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKKwkgIHAgKz0gNDsKKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7CisJICBwICs9IDQ7CisJICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKKwkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKKwkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIGlmIChicmVnICE9IDApCisJICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJCSAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsIHRyZWcsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7CisJfQorICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQorCXsKKwkgIC8qIElmIHRoZXJlIGlzIG5vIGJhc2UgcmVnaXN0ZXIsIHdlIHdhbnQKKwkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2Ugd2FudAorCSAgICAgICBhZGR1CSR0ZW1wcmVnLCRicmVnLCRncAorCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCR0ZW1wcmVnKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCisJICAgICAqLworCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sKTsKKwkgIGlmIChicmVnID09IDApCisJICAgIHsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAorCQkJICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIEdQKTsKKwkgICAgICB1c2VkX2F0ID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkJICAgImQsdix0IiwgdGVtcHJlZywgYnJlZywgR1ApOworCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCisJCQkgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisKKyAgICAgIGlmICghIHVzZWRfYXQpCisJcmV0dXJuOworCisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9MSToKKyAgICBjYXNlIE1fTElfUzoKKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCB0cmVnLCAmaW1tX2V4cHIsIDApOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX0RMSToKKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCB0cmVnLCAmaW1tX2V4cHIsIDEpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX0xJX1NTOgorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKKwl7CisJICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAgICAgIm10YzEiLCAidCxHIiwgQVQsIHRyZWcpOworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbAorCQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UCisJCQkJCSAgIChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wpKSwKKwkJCSAgICAgIi5saXQ0IikgPT0gMAorCQkgICYmIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9PSAwKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHdjMSIsICJULG8oYikiLAorCQkgICAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfTElURVJBTCwgR1ApOworCSAgcmV0dXJuOworCX0KKworICAgIGNhc2UgTV9MSV9EOgorICAgICAgLyogSWYgd2UgaGF2ZSBhIGNvbnN0YW50IGluIElNTV9FWFBSLCB0aGVuIGluIG1pcHMzIG1vZGUgaXQgaXMKKyAgICAgICAgIHRoZSBlbnRpcmUgdmFsdWUsIGFuZCBpbiBtaXBzMSBtb2RlIGl0IGlzIHRoZSBoaWdoIG9yZGVyIDMyCisgICAgICAgICBiaXRzIG9mIHRoZSB2YWx1ZSBhbmQgdGhlIGxvdyBvcmRlciAzMiBiaXRzIGFyZSBlaXRoZXIgemVybworICAgICAgICAgb3IgaW4gb2Zmc2V0X2V4cHIuICAqLworICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCB8fCBpbW1fZXhwci5YX29wID09IE9fYmlnKQorCXsKKwkgIGlmIChtaXBzX29wdHMuaXNhID49IDMpCisJICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCB0cmVnLCAmaW1tX2V4cHIsIDEpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaW50IGhyZWcsIGxyZWc7CisKKwkgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJCXsKKwkJICBocmVnID0gdHJlZzsKKwkJICBscmVnID0gdHJlZyArIDE7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBocmVnID0gdHJlZyArIDE7CisJCSAgbHJlZyA9IHRyZWc7CisJCX0KKworCSAgICAgIGlmIChocmVnIDw9IDMxKQorCQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgaHJlZywgJmltbV9leHByLCAwKTsKKwkgICAgICBpZiAobHJlZyA8PSAzMSkKKwkJeworCQkgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQorCQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLAorCQkJCSBscmVnLCAwKTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KTsKKwkJICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIGxyZWcsICZvZmZzZXRfZXhwciwgMCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgcmV0dXJuOworCX0KKworICAgICAgLyogV2Uga25vdyB0aGF0IHN5bSBpcyBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBGaXJzdCB3ZSBnZXQgdGhlCisJIHVwcGVyIDE2IGJpdHMgb2YgdGhlIGFkZHJlc3MuICAqLworICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKKwl7CisJICAvKiBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZvciBhIDY0IGJpdCBhZGRyZXNzLiAgKi8KKwkgIG1hY3JvX2J1aWxkX2x1aSAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgQVQpOworCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAibHciIDogImxkIiksCisJCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7CisJfQorICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQorCXsKKwkgIC8qIEZvciBlbWJlZGRlZCBQSUMgd2UgcGljayB1cCB0aGUgZW50aXJlIGFkZHJlc3Mgb2ZmICRncCBpbgorCSAgICAgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICAqLworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCisJCSAgICAgICAidCxyLGoiLCBBVCwgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKKwkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OworCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisJCisgICAgICAvKiBOb3cgd2UgbG9hZCB0aGUgcmVnaXN0ZXIocykuICAqLworICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkIiwgInQsbyhiKSIsCisJCSAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKyAgICAgIGVsc2UKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3IiwgInQsbyhiKSIsCisJCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworCSAgaWYgKHRyZWcgIT0gMzEpCisJICAgIHsKKwkgICAgICAvKiBGSVhNRTogSG93IGluIHRoZSB3b3JsZCBkbyB3ZSBkZWFsIHdpdGggdGhlIHBvc3NpYmxlCisJCSBvdmVyZmxvdyBoZXJlPyAgKi8KKwkgICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx3IiwgInQsbyhiKSIsCisJCQkgICB0cmVnICsgMSwgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKwkgICAgfQorCX0KKworICAgICAgLyogVG8gYXZvaWQgY29uZnVzaW9uIGluIHRjX2dlbl9yZWxvYywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGlzCisJIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCisgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKKyAgICAgIGZyYWdfbmV3ICgwKTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fTElfREQ6CisgICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcworICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKKyAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCisgICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCisJeworCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIG1pcHNfb3B0cy5pc2EgPj0gMyk7CisJICBpZiAobWlwc19vcHRzLmlzYSA+PSAzKQorCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICJkbXRjMSIsICJ0LFMiLCBBVCwgdHJlZyk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgIm10YzEiLCAidCxHIiwgQVQsIHRyZWcgKyAxKTsKKwkgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2Fic2VudCkKKwkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICAgIm10YzEiLCAidCxHIiwgMCwgdHJlZyk7CisJICAgICAgZWxzZQorCQl7CisJCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpOworCQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJm9mZnNldF9leHByLCAwKTsKKwkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgICAgICJtdGMxIiwgInQsRyIsIEFULCB0cmVnKTsKKwkJfQorCSAgICB9CisJICBicmVhazsKKwl9CisKKyAgICAgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbAorCSAgICAgICYmIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9PSAwKTsKKyAgICAgIHMgPSBzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCkpOworICAgICAgaWYgKHN0cmNtcCAocywgIi5saXQ4IikgPT0gMCkKKwl7CisJICBpZiAobWlwc19vcHRzLmlzYSA+PSAyKQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsZGMxIiwKKwkJCSAgICJULG8oYikiLCB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBHUCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBicmVnID0gR1A7CisJICByID0gQkZEX1JFTE9DX01JUFNfTElURVJBTDsKKwkgIGdvdG8gZG9iOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc3NlcnQgKHN0cmNtcCAocywgUkRBVEFfU0VDVElPTl9OQU1FKSA9PSAwKTsKKwkgIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgPyAibHciIDogImxkIiksCisJCQkgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRklYTUU6IFRoaXMgd29uJ3Qgd29yayBmb3IgYSA2NCBiaXQgYWRkcmVzcy4gICovCisJICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7CisJICAgIH0KKwkgICAgICAKKwkgIGlmIChtaXBzX29wdHMuaXNhID49IDIpCisJICAgIHsKKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAorCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisKKwkgICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZQorCQkgdGhhdCB0aGlzIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCisJICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7CisJICAgICAgZnJhZ19uZXcgKDApOworCisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGJyZWcgPSBBVDsKKwkgIHIgPSBCRkRfUkVMT0NfTE8xNjsKKwkgIGdvdG8gZG9iOworCX0KKworICAgIGNhc2UgTV9MX0RPQjoKKyAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQorCXsKKwkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7CisJICByZXR1cm47CisJfQorICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQorCSB0byBhZGp1c3Qgd2hlbiBsb2FkaW5nIGZyb20gbWVtb3J5LiAgKi8KKyAgICAgIHIgPSBCRkRfUkVMT0NfTE8xNjsKKyAgICBkb2I6CisgICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPCAyKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHdjMSIsICJULG8oYikiLAorCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgKyAxIDogdHJlZywKKwkJICAgKGludCkgciwgYnJlZyk7CisgICAgICAvKiBGSVhNRTogQSBwb3NzaWJsZSBvdmVyZmxvdyB3aGljaCBJIGRvbid0IGtub3cgaG93IHRvIGRlYWwKKwkgd2l0aC4gICovCisgICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHdjMSIsICJULG8oYikiLAorCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgOiB0cmVnICsgMSwKKwkJICAgKGludCkgciwgYnJlZyk7CisKKyAgICAgIC8qIFRvIGF2b2lkIGNvbmZ1c2lvbiBpbiB0Y19nZW5fcmVsb2MsIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhpcworCSBkb2VzIG5vdCBiZWNvbWUgYSB2YXJpYW50IGZyYWcuICAqLworICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7CisgICAgICBmcmFnX25ldyAoMCk7CisKKyAgICAgIGlmIChicmVnICE9IEFUKQorCXJldHVybjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0xfREFCOgorICAgICAgLyoKKyAgICAgICAqIFRoZSBNSVBTIGFzc2VtYmxlciBzZWVtcyB0byBjaGVjayBmb3IgWF9hZGRfbnVtYmVyIG5vdAorICAgICAgICogYmVpbmcgZG91YmxlIGFsaWduZWQgYW5kIGdlbmVyYXRpbmc6CisgICAgICAgKglsdWkJYXQsJWhpKGZvbysxKQorICAgICAgICoJYWRkdQlhdCxhdCx2MQorICAgICAgICoJYWRkaXUJYXQsYXQsJWxvKGZvbysxKQorICAgICAgICoJbHdjMQlmMiwwKGF0KQorICAgICAgICoJbHdjMQlmMyw0KGF0KQorICAgICAgICogQnV0LCB0aGUgcmVzdWx0aW5nIGFkZHJlc3MgaXMgdGhlIHNhbWUgYWZ0ZXIgcmVsb2NhdGlvbiBzbyB3aHkKKyAgICAgICAqIGdlbmVyYXRlIHRoZSBleHRyYSBpbnN0cnVjdGlvbj8KKyAgICAgICAqLworICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCisJeworCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKKwkgIHJldHVybjsKKwl9CisgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisgICAgICBjb3Byb2MgPSAxOworICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMikKKwl7CisJICBzID0gImxkYzEiOworCSAgZ290byBsZDsKKwl9CisKKyAgICAgIHMgPSAibHdjMSI7CisgICAgICBmbXQgPSAiVCxvKGIpIjsKKyAgICAgIGdvdG8gbGRkX3N0ZDsKKworICAgIGNhc2UgTV9TX0RBQjoKKyAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQorCXsKKwkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAyKQorCXsKKwkgIHMgPSAic2RjMSI7CisJICBnb3RvIHN0OworCX0KKworICAgICAgcyA9ICJzd2MxIjsKKyAgICAgIGZtdCA9ICJULG8oYikiOworICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworICAgICAgY29wcm9jID0gMTsKKyAgICAgIGdvdG8gbGRkX3N0ZDsKKworICAgIGNhc2UgTV9MRF9BQjoKKyAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDMpCisJeworCSAgcyA9ICJsZCI7CisJICBnb3RvIGxkOworCX0KKworICAgICAgcyA9ICJsdyI7CisgICAgICBmbXQgPSAidCxvKGIpIjsKKyAgICAgIGdvdG8gbGRkX3N0ZDsKKworICAgIGNhc2UgTV9TRF9BQjoKKyAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDMpCisJeworCSAgcyA9ICJzZCI7CisJICBnb3RvIHN0OworCX0KKworICAgICAgcyA9ICJzdyI7CisgICAgICBmbXQgPSAidCxvKGIpIjsKKworICAgIGxkZF9zdGQ6CisgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX3N5bWJvbAorCSAgJiYgb2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQorCXsKKwkgIGFzX2JhZCAoXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKKwkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OworCX0KKworICAgICAgLyogRXZlbiBvbiBhIGJpZyBlbmRpYW4gbWFjaGluZSAkZm4gY29tZXMgYmVmb3JlICRmbisxLiAgV2UgaGF2ZQorCSB0byBhZGp1c3Qgd2hlbiBsb2FkaW5nIGZyb20gbWVtb3J5LiAgV2Ugc2V0IGNvcHJvYyBpZiB3ZSBtdXN0CisJIGxvYWQgJGZuKzEgZmlyc3QuICAqLworICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisJY29wcm9jID0gMDsKKworICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQworCSAgfHwgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQorCXsKKwkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCisJICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3Rlciwgd2UgdXNlIHRoaXMKKwkgICAgICAgYWRkdQkkYXQsJGJyZWcsJGdwCisJICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCisJICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQorCSAgICAgSWYgdGhpcyBpcyBub3QgYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKKwkgICAgICAgbHVpCSRhdCw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCisJICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX0xPMTYpCisJICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQorCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJGF0IGFmdGVyIHRoZQorCSAgICAgbHVpIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCwgd2UgYWx3YXlzIHVzZQorCSAgICAgdGhlIGxhc3QgY2FzZS4gICovCisJICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKKwkgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQorCSAgICB7CisJICAgICAgcCA9IE5VTEw7CisJICAgICAgdXNlZF9hdCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCBvZmY7CisKKwkgICAgICBpZiAoYnJlZyA9PSAwKQorCQl7CisJCSAgZnJhZ19ncm93ICgyOCk7CisJCSAgdGVtcHJlZyA9IEdQOworCQkgIG9mZiA9IDA7CisJCSAgdXNlZF9hdCA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBmcmFnX2dyb3cgKDM2KTsKKwkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkJICAgICAgICJkLHYsdCIsIEFULCBicmVnLCBHUCk7CisJCSAgdGVtcHJlZyA9IEFUOworCQkgIG9mZiA9IDQ7CisJCSAgdXNlZF9hdCA9IDE7CisJCX0KKworICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKKwkJCSAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKKwkJCSAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKKwkgICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKKworCSAgICAgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuCisgICAgICAgICAgICAgICAgIHVuZGVzaXJlZCBub3AuICAqLworCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7CisJICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7CisgICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAorCQkJICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAorCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOworCSAgICAgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7CisKKwkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIG9mZiwgMCwKKwkJCSAgICBSRUxBWF9FTkNPREUgKDggKyBvZmYsIDEyICsgb2ZmLCAwLCA0ICsgb2ZmLCAxLAorCQkJCQkgIHVzZWRfYXQgJiYgbWlwc19vcHRzLm5vYXQpLAorCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCisJCQkgICAgKGNoYXIgKikgTlVMTCk7CisKKwkgICAgICAvKiBXZSBqdXN0IGdlbmVyYXRlZCB0d28gcmVsb2NzLiAgV2hlbiB0Y19nZW5fcmVsb2MKKwkJIGhhbmRsZXMgdGhpcyBjYXNlLCBpdCB3aWxsIHNraXAgdGhlIGZpcnN0IHJlbG9jIGFuZAorCQkgaGFuZGxlIHRoZSBzZWNvbmQuICBUaGUgc2Vjb25kIHJlbG9jIGFscmVhZHkgaGFzIGFuCisJCSBleHRyYSBhZGRlbmQgb2YgNCwgd2hpY2ggd2UgYWRkZWQgYWJvdmUuICBXZSBtdXN0CisJCSBzdWJ0cmFjdCBpdCBvdXQsIGFuZCB0aGVuIHN1YnRyYWN0IGFub3RoZXIgNCB0byBtYWtlCisJCSB0aGUgZmlyc3QgcmVsb2MgY29tZSBvdXQgcmlnaHQuICBUaGUgc2Vjb25kIHJlbG9jCisJCSB3aWxsIGNvbWUgb3V0IHJpZ2h0IGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGFkZCA0IHRvCisJCSBvZmZzZXRfZXhwciB3aGVuIHdlIGJ1aWxkIGl0cyBpbnN0cnVjdGlvbiBiZWxvdy4KKworCQkgSWYgd2UgaGF2ZSBhIHN5bWJvbCwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGluY2x1ZGUKKwkJIHRoZSBvZmZzZXQsIGJlY2F1c2UgaXQgd2lsbCB3aW5kIHVwIGJlaW5nIGluY2x1ZGVkCisJCSB3aGVuIHdlIGdlbmVyYXRlIHRoZSByZWxvYy4gICovCisKKwkgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQorCQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gODsKKwkgICAgICBlbHNlCisJCXsKKwkJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAtNDsKKwkJICBvZmZzZXRfZXhwci5YX29wID0gT19jb25zdGFudDsKKwkJfQorCSAgICB9CisJICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIEFUKTsKKwkgIGlmIChwICE9IE5VTEwpCisJICAgIHAgKz0gNDsKKwkgIGlmIChicmVnICE9IDApCisJICAgIHsKKwkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCisJCQkgICAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOworCSAgICAgIGlmIChwICE9IE5VTEwpCisJCXAgKz0gNDsKKwkgICAgfQorICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCisJCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworCSAgaWYgKHAgIT0gTlVMTCkKKwkgICAgcCArPSA0OworCSAgLyogRklYTUU6IEhvdyBkbyB3ZSBoYW5kbGUgb3ZlcmZsb3cgaGVyZT8gICovCisJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAorCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKwl9CSAgCisgICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQyAmJiAhIG1pcHNfYmlnX2dvdCkKKwl7CisJICBpbnQgb2ZmOworCisJICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAorCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQorCSAgICAgICBub3AKKwkgICAgICAgPG9wPgkkdHJlZywwKCRhdCkKKwkgICAgICAgPG9wPgkkdHJlZysxLDQoJGF0KQorCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKKwkgICAgICAgbHcJJGF0LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKKwkgICAgICAgbm9wCisJICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX0xPMTYpCisJICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQorCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyIHdlIGFkZCBpdCB0byAkYXQgYmVmb3JlIHRoZQorCSAgICAgbHdjMSBpbnN0cnVjdGlvbnMuICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50IHdlIGluY2x1ZGUgaXQKKwkgICAgIGluIHRoZSBsd2MxIGluc3RydWN0aW9ucy4gICovCisJICB1c2VkX2F0ID0gMTsKKwkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKKwkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7CisJICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAorCSAgICAgIHx8IGV4cHIxLlhfYWRkX251bWJlciA+PSAweDgwMDAgLSA0KQorCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKKwkgIGlmIChicmVnID09IDApCisJICAgIG9mZiA9IDA7CisJICBlbHNlCisJICAgIG9mZiA9IDQ7CisJICBmcmFnX2dyb3cgKDI0ICsgb2ZmKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAibHciIDogImxkIiksCisJCSAgICAgICAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOworCSAgaWYgKGJyZWcgIT0gMCkKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkJICJkLHYsdCIsIEFULCBicmVnLCBBVCk7CisgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKKwkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKKwkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisJICBleHByMS5YX2FkZF9udW1iZXIgKz0gNDsKKworCSAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4gdW5kZXNpcmVkCisgICAgICAgICAgICAgbm9wLiAgKi8KKwkgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7CisJICBtaXBzX29wdGltaXplID0gMjsKKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAorCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKwkgIG1pcHNfb3B0aW1pemUgPSBob2xkX21pcHNfb3B0aW1pemU7CisKKwkgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCisJCQkgICBSRUxBWF9FTkNPREUgKDAsIDAsIC0xNiAtIG9mZiwgLTgsIDEsIDApLAorCQkJICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKKwkJCSAgIChjaGFyICopIE5VTEwpOworCX0KKyAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQorCXsKKwkgIGludCBncGRlbCwgb2ZmOworCisJICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAorCSAgICAgICBsdWkJJGF0LDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCisJICAgICAgIGFkZHUJJGF0LCRhdCwkZ3AKKwkgICAgICAgbHcJJGF0LDxzeW0+KCRhdCkJCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKKwkgICAgICAgbm9wCisJICAgICAgIDxvcD4JJHRyZWcsMCgkYXQpCisJICAgICAgIDxvcD4JJHRyZWcrMSw0KCRhdCkKKwkgICAgIE90aGVyd2lzZSB3ZSB3YW50CisJICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCisJICAgICAgIG5vcAorCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQorCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTE8xNikKKwkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3RlciB3ZSBhZGQgaXQgdG8gJGF0IGJlZm9yZSB0aGUKKwkgICAgIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgSWYgdGhlcmUgaXMgYSBjb25zdGFudCB3ZSBpbmNsdWRlIGl0CisJICAgICBpbiB0aGUgbHdjMSBpbnN0cnVjdGlvbnMuICAqLworCSAgdXNlZF9hdCA9IDE7CisJICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7CisJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOworCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKKwkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gNCkKKwkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7CisJICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCisJICAgIGdwZGVsID0gNDsKKwkgIGVsc2UKKwkgICAgZ3BkZWwgPSAwOworCSAgaWYgKGJyZWcgPT0gMCkKKwkgICAgb2ZmID0gMDsKKwkgIGVsc2UKKwkgICAgb2ZmID0gNDsKKwkgIGZyYWdfZ3JvdyAoNTYpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsdWkiLCAidCx1IiwKKwkJICAgICAgIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNik7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJICAgICAgICJkLHYsdCIsIEFULCBBVCwgR1ApOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKKwkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIEFUKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7CisJICBpZiAoYnJlZyAhPSAwKQorCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCQkgID8gImFkZHUiIDogImRhZGR1IiksCisJCQkgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAorCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKwkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OworCisJICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKKyAgICAgICAgICAgICBub3AuICAqLworCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKKwkgIG1pcHNfb3B0aW1pemUgPSAyOworICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCisJCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKKwkgIGV4cHIxLlhfYWRkX251bWJlciAtPSA0OworCisJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxNiArIGdwZGVsICsgb2ZmLCAwLAorCQkJUkVMQVhfRU5DT0RFICgyNCArIG9mZiwgMTYgKyBncGRlbCArIG9mZiwgZ3BkZWwsCisJCQkJICAgICAgOCArIGdwZGVsICsgb2ZmLCAxLCAwKSwKKwkJCW9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCisJCQkoY2hhciAqKSBOVUxMKTsKKwkgIGlmIChncGRlbCA+IDApCisJICAgIHsKKwkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOworCSAgICAgIHAgKz0gNDsKKwkgICAgfQorCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCisJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKKwkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKKwkgIHAgKz0gNDsKKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7CisJICBwICs9IDQ7CisJICBpZiAoYnJlZyAhPSAwKQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKKwkgICAgICBwICs9IDQ7CisJICAgIH0KKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICBtYWNyb19idWlsZCAocCwgJmljbnQsICZleHByMSwgcywgZm10LAorCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKwkgIHAgKz0gNDsKKwkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OworCisJICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKKyAgICAgICAgICAgICBub3AuICAqLworCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKKwkgIG1pcHNfb3B0aW1pemUgPSAyOworICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCisJCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKKwl9CisgICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCisJeworCSAgLyogSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2UgdXNlCisJICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCisJICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQorCSAgICAgSWYgd2UgaGF2ZSBhIGJhc2UgcmVnaXN0ZXIsIHdlIHVzZQorCSAgICAgICBhZGR1CSRhdCwkYnJlZywkZ3AKKwkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKKwkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCisJICAgICAqLworCSAgaWYgKGJyZWcgPT0gMCkKKwkgICAgeworCSAgICAgIHRlbXByZWcgPSBHUDsKKwkgICAgICB1c2VkX2F0ID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKKwkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAorCQkJICAgImQsdix0IiwgQVQsIGJyZWcsIEdQKTsKKwkgICAgICB0ZW1wcmVnID0gQVQ7CisJICAgICAgdXNlZF9hdCA9IDE7CisJICAgIH0KKworICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCisJCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCisJCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7CisJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKKyAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAorCQkgICAgICAgY29wcm9jID8gdHJlZyA6IHRyZWcgKyAxLAorCQkgICAgICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOworCX0KKyAgICAgIGVsc2UKKwlhYm9ydCAoKTsKKworICAgICAgaWYgKCEgdXNlZF9hdCkKKwlyZXR1cm47CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0xEX09COgorICAgICAgcyA9ICJsdyI7CisgICAgICBnb3RvIHNkX29iOworICAgIGNhc2UgTV9TRF9PQjoKKyAgICAgIHMgPSAic3ciOworICAgIHNkX29iOgorICAgICAgYXNzZXJ0IChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyIHx8IG1pcHNfb3B0cy5pc2EgPCAzKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKKwkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOworICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcgKyAxLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICByZXR1cm47CisKKyAgIC8qIE5ldyBjb2RlIGFkZGVkIHRvIHN1cHBvcnQgQ09QWiBpbnN0cnVjdGlvbnMuCisgICAgICBUaGlzIGNvZGUgYnVpbGRzIHRhYmxlIGVudHJpZXMgb3V0IG9mIHRoZSBtYWNyb3MgaW4gbWlwX29wY29kZXMuCisgICAgICBSNDAwMCB1c2VzIGludGVybG9ja3MgdG8gaGFuZGxlIGNvcHJvYyBkZWxheXMuCisgICAgICBPdGhlciBjaGlwcyAobGlrZSB0aGUgUjMwMDApIHJlcXVpcmUgbm9wcyB0byBiZSBpbnNlcnRlZCBmb3IgZGVsYXlzLgorCisgICAgICBGSVhNRTogQ3VycmVudGx5LCB3ZSByZXF1aXJlIHRoYXQgdGhlIHVzZXIgaGFuZGxlIGRlbGF5cy4KKyAgICAgIEluIG9yZGVyIHRvIGZpbGwgZGVsYXkgc2xvdHMgZm9yIG5vbi1pbnRlcmxvY2tlZCBjaGlwcywKKyAgICAgIHdlIG11c3QgaGF2ZSBhIHdheSB0byBzcGVjaWZ5IGRlbGF5cyBiYXNlZCBvbiB0aGUgY29wcm9jZXNzb3IuCisgICAgICBFZy4gNCBjeWNsZXMgaWYgbG9hZCBjb3Byb2MgcmVnIGZyb20gbWVtb3J5LCAxIGlmIGluIGNhY2hlLCBldGMuCisgICAgICBXaGF0IGFyZSB0aGUgc2lkZS1lZmZlY3RzIG9mIHRoZSBjb3AgaW5zdHJ1Y3Rpb24/CisgICAgICBXaGF0IGNhY2hlIHN1cHBvcnQgbWlnaHQgd2UgaGF2ZSBhbmQgd2hhdCBhcmUgaXRzIGVmZmVjdHM/CisgICAgICBCb3RoIGNvcHJvY2Vzc29yICYgbWVtb3J5IHJlcXVpcmUgZGVsYXlzLiBob3cgbG9uZz8/PworICAgICAgV2hhdCByZWdpc3RlcnMgYXJlIHJlYWQvc2V0L21vZGlmaWVkPyAKKworICAgICAgSWYgYW4gaXRibCBpcyBwcm92aWRlZCB0byBpbnRlcnByZXQgY29wIGluc3RydWN0aW9ucywKKyAgICAgIHRoaXMga25vd2xlZGdlIGNhbiBiZSBlbmNvZGVkIGluIHRoZSBpdGJsIHNwZWMuICovCisKKyAgICBjYXNlIE1fQ09QMDoKKyAgICAgIHMgPSAiYzAiOworICAgICAgZ290byBjb3B6OworICAgIGNhc2UgTV9DT1AxOgorICAgICAgcyA9ICJjMSI7CisgICAgICBnb3RvIGNvcHo7CisgICAgY2FzZSBNX0NPUDI6CisgICAgICBzID0gImMyIjsKKyAgICAgIGdvdG8gY29wejsKKyAgICBjYXNlIE1fQ09QMzoKKyAgICAgIHMgPSAiYzMiOworICAgIGNvcHo6CisgICAgICAvKiBGb3Igbm93IHdlIGp1c3QgZG8gQyAoc2FtZSBhcyBDeikuICBUaGUgcGFyYW1ldGVyIHdpbGwgYmUKKyAgICAgICAgIHN0b3JlZCBpbiBpbnNuX29wY29kZSBieSBtaXBzX2lwLiAgKi8KKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsIHMsICJDIiwKKwkJICAgaXAtPmluc25fb3Bjb2RlKTsKKyAgICAgIHJldHVybjsKKworI2lmZGVmIExPU0lOR19DT01QSUxFUgorICAgIGRlZmF1bHQ6CisgICAgICAvKiBUcnkgYW5kIHNlZSBpZiB0aGlzIGlzIGEgbmV3IGl0YmwgaW5zdHJ1Y3Rpb24uCisgICAgICAgICBUaGlzIGNvZGUgYnVpbGRzIHRhYmxlIGVudHJpZXMgb3V0IG9mIHRoZSBtYWNyb3MgaW4gbWlwX29wY29kZXMuCisgICAgICAgICBGSVhNRTogRm9yIG5vdyB3ZSBqdXN0IGFzc2VtYmxlIHRoZSBleHByZXNzaW9uIGFuZCBwYXNzIGl0J3MKKyAgICAgICAgIHZhbHVlIGFsb25nIGFzIGEgMzItYml0IGltbWVkaWF0ZS4KKyAgICAgICAgIFdlIG1heSB3YW50IHRvIGhhdmUgdGhlIGFzc2VtYmxlciBhc3NlbWJsZSB0aGlzIHZhbHVlLCAKKyAgICAgICAgIHNvIHRoYXQgd2UgZ2FpbiB0aGUgYXNzZW1ibGVyJ3Mga25vd2xlZGdlIG9mIGRlbGF5IHNsb3RzLAorICAgICAgICAgc3ltYm9scywgZXRjLgorICAgICAgICAgV291bGQgaXQgYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIG1hc2sgKGlkKSBoZXJlPyAqLworICAgICAgaWYgKGl0YmxfaGF2ZV9lbnRyaWVzIAorCSAgJiYgKGltbWVkX2V4cHIgPSBpdGJsX2Fzc2VtYmxlIChpcC0+aW5zbl9tby0+bmFtZSwgIiIpKSkKKyAgICAgICAgeworCSAgcyA9IGlwLT5pbnNuX21vLT5uYW1lOworCSAgczIgPSAiY29wMyI7CisJICBjb3Byb2MgPSBJVEJMX0RFQ09ERV9QTlVNIChpbW1lZF9leHByKTs7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1lZF9leHByLCBzLCAiQyIpOworCSAgcmV0dXJuOworICAgICAgICB9CisgICAgICBtYWNybzIgKGlwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmIChtaXBzX29wdHMubm9hdCkKKyAgICBhc193YXJuIChfKCJNYWNybyB1c2VkICRhdCBhZnRlciBcIi5zZXQgbm9hdFwiIikpOworfQorICAgICAgICAgIAorc3RhdGljIHZvaWQKK21hY3JvMiAoaXApCisgICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOworeworICByZWdpc3RlciBpbnQgdHJlZywgc3JlZywgZHJlZywgYnJlZzsKKyAgaW50IHRlbXByZWc7CisgIGludCBtYXNrOworICBpbnQgaWNudCA9IDA7CisgIGludCB1c2VkX2F0OworICBleHByZXNzaW9uUyBleHByMTsKKyAgY29uc3QgY2hhciAqczsKKyAgY29uc3QgY2hhciAqczI7CisgIGNvbnN0IGNoYXIgKmZtdDsKKyAgaW50IGxpa2VseSA9IDA7CisgIGludCBkYmwgPSAwOworICBpbnQgY29wcm9jID0gMDsKKyAgaW50IGxyID0gMDsKKyAgaW50IGltbSA9IDA7CisgIGludCBvZmY7CisgIG9mZnNldFQgbWF4bnVtOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKKyAgY2hhciAqcDsKKyAgICAgICAgICAKKyAgdHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTYpICYgMHgxZjsKKyAgZHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMTEpICYgMHgxZjsKKyAgc3JlZyA9IGJyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDIxKSAmIDB4MWY7CisgIG1hc2sgPSBpcC0+aW5zbl9tby0+bWFzazsKKyAgICAgICAgICAKKyAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7CisgIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKKyAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKKyAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKKyAgICAgICAgICAKKyAgc3dpdGNoIChtYXNrKQorICAgIHsKKyNlbmRpZiAvKiBMT1NJTkdfQ09NUElMRVIgKi8KKworICAgIGNhc2UgTV9ETVVMOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fTVVMOgorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAorCQkgICBkYmwgPyAiZG11bHR1IiA6ICJtdWx0dSIsCisJCSAgICJzLHQiLCBzcmVnLCB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX0RNVUxfSToKKyAgICAgIGRibCA9IDE7CisgICAgY2FzZSBNX01VTF9JOgorICAgICAgLyogVGhlIE1JUFMgYXNzZW1ibGVyIHNvbWUgdGltZXMgZ2VuZXJhdGVzIHNoaWZ0cyBhbmQgYWRkcy4gIEknbQorCSBub3QgdHJ5aW5nIHRvIGJlIHRoYXQgZmFuY3kuIEdDQyBzaG91bGQgZG8gdGhpcyBmb3IgdXMKKwkgYW55d2F5LiAgKi8KKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAorCQkgICBkYmwgPyAiZG11bHQiIDogIm11bHQiLAorCQkgICAicyx0Iiwgc3JlZywgQVQpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9ETVVMT19JOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fTVVMT19JOgorICAgICAgaW1tID0gMTsKKyAgICAgIGdvdG8gZG9fbXVsbzsKKworICAgIGNhc2UgTV9ETVVMTzoKKyAgICAgIGRibCA9IDE7CisgICAgY2FzZSBNX01VTE86CisgICAgZG9fbXVsbzoKKyAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOworICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOworICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKKyAgICAgIGlmIChpbW0pCisJbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCisJCSAgIGRibCA/ICJkbXVsdCIgOiAibXVsdCIsCisJCSAgICJzLHQiLCBzcmVnLCBpbW0gPyBBVCA6IHRyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCisJCSAgIGRibCA/ICJkc3JhMzIiIDogInNyYSIsCisJCSAgICJkLHcsPCIsIGRyZWcsIGRyZWcsIDMxKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1maGkiLCAiZCIsIEFUKTsKKyAgICAgIGlmIChtaXBzX3RyYXApCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidG5lIiwgInMsdCIsIGRyZWcsIEFUKTsKKyAgICAgIGVsc2UKKwl7CisJICBleHByMS5YX2FkZF9udW1iZXIgPSA4OworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJiZXEiLCAicyx0LHAiLCBkcmVnLCBBVCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7CisJICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA2KTsKKwl9CisgICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0RNVUxPVV9JOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fTVVMT1VfSToKKyAgICAgIGltbSA9IDE7CisgICAgICBnb3RvIGRvX211bG91OworCisgICAgY2FzZSBNX0RNVUxPVToKKyAgICAgIGRibCA9IDE7CisgICAgY2FzZSBNX01VTE9VOgorICAgIGRvX211bG91OgorICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7CisgICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOworICAgICAgaWYgKGltbSkKKwlsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKKwkJICAgZGJsID8gImRtdWx0dSIgOiAibXVsdHUiLAorCQkgICAicyx0Iiwgc3JlZywgaW1tID8gQVQgOiB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1maGkiLCAiZCIsIEFUKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOworICAgICAgaWYgKG1pcHNfdHJhcCkKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0bmUiLCAicyx0IiwgQVQsIDApOworICAgICAgZWxzZQorCXsKKwkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJlcSIsICJzLHQscCIsIEFULCAwKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKKwkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOworCX0KKyAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1JPTDoKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInN1YnUiLCAiZCx2LHQiLCBBVCwgMCwgdHJlZyk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmx2IiwgImQsdCxzIiwgQVQsIHNyZWcsIEFUKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbHYiLCAiZCx0LHMiLCBkcmVnLCBzcmVnLAorCQkgICB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fUk9MX0k6CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQorCWFzX2JhZCAoXygicm90YXRlIGNvdW50IHRvbyBsYXJnZSIpKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIEFULCBzcmVnLAorCQkgICAoaW50KSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyICYgMHgxZikpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsIiwgImQsdyw8IiwgZHJlZywgc3JlZywKKwkJICAgKGludCkgKCgwIC0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyKSAmIDB4MWYpKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgZHJlZywgZHJlZywgQVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fUk9SOgorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3VidSIsICJkLHYsdCIsIEFULCAwLCB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbHYiLCAiZCx0LHMiLCBBVCwgc3JlZywgQVQpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsdiIsICJkLHQscyIsIGRyZWcsIHNyZWcsCisJCSAgIHRyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9ST1JfSToKKyAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJyb3RhdGUgY291bnQgdG9vIGxhcmdlIikpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3JsIiwgImQsdyw8IiwgQVQsIHNyZWcsCisJCSAgIChpbnQpIChpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmKSk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCBkcmVnLCBzcmVnLAorCQkgICAoaW50KSAoKDAgLSBpbW1fZXhwci5YX2FkZF9udW1iZXIpICYgMHgxZikpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TX0RPQjoKKyAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQorCXsKKwkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7CisJICByZXR1cm47CisJfQorICAgICAgYXNzZXJ0IChtaXBzX29wdHMuaXNhIDwgMik7CisgICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCisJIHRvIGFkanVzdCB3aGVuIHN0b3JpbmcgdG8gbWVtb3J5LiAgKi8KKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic3djMSIsICJULG8oYikiLAorCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgKyAxIDogdHJlZywKKwkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOworICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDQ7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInN3YzEiLCAiVCxvKGIpIiwKKwkJICAgdGFyZ2V0X2JpZ19lbmRpYW4gPyB0cmVnIDogdHJlZyArIDEsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgTV9TRVE6CisgICAgICBpZiAoc3JlZyA9PSAwKQorCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAorCQkgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIGVsc2UgaWYgKHRyZWcgPT0gMCkKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKKwkJICAgICBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisgICAgICBlbHNlCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKKwkJICAgICAgIHNyZWcsIHRyZWcpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCisJCSAgICAgICBkcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJfQorICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX1NFUV9JOgorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKKwkJICAgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoc3JlZyA9PSAwKQorCXsKKwkgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIGZhbHNlIiksCisJCSAgIGlwLT5pbnNuX21vLT5uYW1lKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKKwkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwgZHJlZywKKwkJICAgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIHVzZWRfYXQgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCisJICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCisJeworCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywKKwkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIHVzZWRfYXQgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAorCQkgICAgICAgc3JlZywgQVQpOworCSAgdXNlZF9hdCA9IDE7CisJfQorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsIGRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIGlmICh1c2VkX2F0KQorCWJyZWFrOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX1NHRToJCS8qIHNyZWcgPj0gdHJlZyA8PT0+IG5vdCAoc3JlZyA8IHRyZWcpICovCisgICAgICBzID0gInNsdCI7CisgICAgICBnb3RvIHNnZTsKKyAgICBjYXNlIE1fU0dFVToKKyAgICAgIHMgPSAic2x0dSI7CisgICAgc2dlOgorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCBzcmVnLCB0cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgTV9TR0VfSToJCS8qIHNyZWcgPj0gSSA8PT0+IG5vdCAoc3JlZyA8IEkpICovCisgICAgY2FzZSBNX1NHRVVfSToKKyAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKKwkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCisJCSAgICAgICBtYXNrID09IE1fU0dFX0kgPyAic2x0aSIgOiAic2x0aXUiLAorCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgdXNlZF9hdCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKKwkJICAgICAgIG1hc2sgPT0gTV9TR0VfSSA/ICJzbHQiIDogInNsdHUiLAorCQkgICAgICAgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOworCSAgdXNlZF9hdCA9IDE7CisJfQorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKKwkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOworICAgICAgaWYgKHVzZWRfYXQpCisJYnJlYWs7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fU0dUOgkJLyogc3JlZyA+IHRyZWcgIDw9PT4gIHRyZWcgPCBzcmVnICovCisgICAgICBzID0gInNsdCI7CisgICAgICBnb3RvIHNndDsKKyAgICBjYXNlIE1fU0dUVToKKyAgICAgIHMgPSAic2x0dSI7CisgICAgc2d0OgorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCB0cmVnLCBzcmVnKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgTV9TR1RfSToJCS8qIHNyZWcgPiBJICA8PT0+ICBJIDwgc3JlZyAqLworICAgICAgcyA9ICJzbHQiOworICAgICAgZ290byBzZ3RpOworICAgIGNhc2UgTV9TR1RVX0k6CisgICAgICBzID0gInNsdHUiOworICAgIHNndGk6CisgICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIEFULCBzcmVnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NMRToJCS8qIHNyZWcgPD0gdHJlZyAgPD09PiAgdHJlZyA+PSBzcmVnICA8PT0+ICBub3QgKHRyZWcgPCBzcmVnKSAqLworICAgICAgcyA9ICJzbHQiOworICAgICAgZ290byBzbGU7CisgICAgY2FzZSBNX1NMRVU6CisgICAgICBzID0gInNsdHUiOworICAgIHNsZToKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgdHJlZywgc3JlZyk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fU0xFX0k6CQkvKiBzcmVnIDw9IEkgPD09PiBJID49IHNyZWcgPD09PiBub3QgKEkgPCBzcmVnKSAqLworICAgICAgcyA9ICJzbHQiOworICAgICAgZ290byBzbGVpOworICAgIGNhc2UgTV9TTEVVX0k6CisgICAgICBzID0gInNsdHUiOworICAgIHNsZWk6CisgICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIEFULCBzcmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NMVF9JOgorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKKwkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKKwl7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInNsdGkiLCAidCxyLGoiLAorCQkgICAgICAgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdCIsICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NMVFVfSToKKyAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKKwkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJzbHRpdSIsICJ0LHIsaiIsCisJCSAgICAgICBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICByZXR1cm47CisJfQorICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIHNyZWcsCisJCSAgIEFUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NORToKKyAgICAgIGlmIChzcmVnID09IDApCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCisJCSAgICAgdHJlZyk7CisgICAgICBlbHNlIGlmICh0cmVnID09IDApCisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCisJCSAgICAgc3JlZyk7CisgICAgICBlbHNlCisJeworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAieG9yIiwgImQsdix0IiwgZHJlZywKKwkJICAgICAgIHNyZWcsIHRyZWcpOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCisJCSAgICAgICBkcmVnKTsKKwl9CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fU05FX0k6CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBkcmVnLCAwLAorCQkgICAgICAgc3JlZyk7CisJICByZXR1cm47CisJfQorICAgICAgaWYgKHNyZWcgPT0gMCkKKwl7CisJICBhc193YXJuIChfKCJJbnN0cnVjdGlvbiAlczogcmVzdWx0IGlzIGFsd2F5cyB0cnVlIiksCisJCSAgIGlwLT5pbnNuX21vLT5uYW1lKTsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAorCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAorCQkgICAgICAgInQscixqIiwgZHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKKwkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAwCisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQorCXsKKwkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAieG9yaSIsICJ0LHIsaSIsCisJCSAgICAgICBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICB1c2VkX2F0ID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKKwkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gLTB4ODAwMAorCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwKQorCXsKKwkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKKwkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKKwkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKwkgIHVzZWRfYXQgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAorCQkgICAgICAgc3JlZywgQVQpOworCSAgdXNlZF9hdCA9IDE7CisJfQorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsIGRyZWcpOworICAgICAgaWYgKHVzZWRfYXQpCisJYnJlYWs7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fRFNVQl9JOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fU1VCX0k6CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCisJICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gMHg4MDAwKQorCXsKKwkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7CisJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKKwkJICAgICAgIGRibCA/ICJkYWRkaSIgOiAiYWRkaSIsCisJCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICByZXR1cm47CisJfQorICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCisJCSAgIGRibCA/ICJkc3ViIiA6ICJzdWIiLAorCQkgICAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9EU1VCVV9JOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fU1VCVV9JOgorICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gLTB4ODAwMAorCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw9IDB4ODAwMCkKKwl7CisJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOworCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCisJCSAgICAgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCisJCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisJICByZXR1cm47CisJfQorICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCisJCSAgIGRibCA/ICJkc3VidSIgOiAic3VidSIsCisJCSAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1RFUV9JOgorICAgICAgcyA9ICJ0ZXEiOworICAgICAgZ290byB0cmFwOworICAgIGNhc2UgTV9UR0VfSToKKyAgICAgIHMgPSAidGdlIjsKKyAgICAgIGdvdG8gdHJhcDsKKyAgICBjYXNlIE1fVEdFVV9JOgorICAgICAgcyA9ICJ0Z2V1IjsKKyAgICAgIGdvdG8gdHJhcDsKKyAgICBjYXNlIE1fVExUX0k6CisgICAgICBzID0gInRsdCI7CisgICAgICBnb3RvIHRyYXA7CisgICAgY2FzZSBNX1RMVFVfSToKKyAgICAgIHMgPSAidGx0dSI7CisgICAgICBnb3RvIHRyYXA7CisgICAgY2FzZSBNX1RORV9JOgorICAgICAgcyA9ICJ0bmUiOworICAgIHRyYXA6CisgICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJzLHQiLCBzcmVnLCBBVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9UUlVOQ1dEOgorICAgIGNhc2UgTV9UUlVOQ1dTOgorICAgICAgYXNzZXJ0IChtaXBzX29wdHMuaXNhIDwgMik7CisgICAgICBzcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwkvKiBmbG9hdGluZyByZWcgKi8KKyAgICAgIGRyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDA2KSAmIDB4MWY7CS8qIGZsb2F0aW5nIHJlZyAqLworCisgICAgICAvKgorICAgICAgICogSXMgdGhlIGRvdWJsZSBjZmMxIGluc3RydWN0aW9uIGEgYnVnIGluIHRoZSBtaXBzIGFzc2VtYmxlcjsKKyAgICAgICAqIG9yIGlzIHRoZXJlIGEgcmVhc29uIGZvciBpdD8KKyAgICAgICAqLworICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7CisgICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY2ZjMSIsICJ0LEciLCB0cmVnLCAzMSk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjZmMxIiwgInQsRyIsIHRyZWcsIDMxKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiKTsKKyAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDM7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgIm9yaSIsICJ0LHIsaSIsIEFULCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7CisgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAyOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgQVQsIEFULAorCQkgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImN0YzEiLCAidCxHIiwgQVQsIDMxKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKKwkgICAgICBtYXNrID09IE1fVFJVTkNXRCA/ICJjdnQudy5kIiA6ICJjdnQudy5zIiwgIkQsUyIsIGRyZWcsIHNyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY3RjMSIsICJ0LEciLCB0cmVnLCAzMSk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIik7CisgICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9VTEg6CisgICAgICBzID0gImxiIjsKKyAgICAgIGdvdG8gdWxoOworICAgIGNhc2UgTV9VTEhVOgorICAgICAgcyA9ICJsYnUiOworICAgIHVsaDoKKyAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg3ZmZmKQorCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKKyAgICAgIC8qIGF2b2lkIGxvYWQgZGVsYXkgKi8KKyAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gMTsKKyAgICAgIGVsc2UKKwlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGJ1IiwgInQsbyhiKSIsIEFULAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLCB0cmVnLCA4KTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywgdHJlZywgQVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fVUxEOgorICAgICAgcyA9ICJsZGwiOworICAgICAgczIgPSAibGRyIjsKKyAgICAgIG9mZiA9IDc7CisgICAgICBnb3RvIHVsdzsKKyAgICBjYXNlIE1fVUxXOgorICAgICAgcyA9ICJsd2wiOworICAgICAgczIgPSAibHdyIjsKKyAgICAgIG9mZiA9IDM7CisgICAgdWx3OgorICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAgLSBvZmYpCisJYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOworICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZywKKwkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOworICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IG9mZjsKKyAgICAgIGVsc2UKKwlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAidCxvKGIpIiwgdHJlZywKKwkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX1VMRF9BOgorICAgICAgcyA9ICJsZGwiOworICAgICAgczIgPSAibGRyIjsKKyAgICAgIG9mZiA9IDc7CisgICAgICBnb3RvIHVsd2E7CisgICAgY2FzZSBNX1VMV19BOgorICAgICAgcyA9ICJsd2wiOworICAgICAgczIgPSAibHdyIjsKKyAgICAgIG9mZiA9IDM7CisgICAgdWx3YToKKyAgICAgIGxvYWRfYWRkcmVzcyAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIpOworICAgICAgaWYgKGJyZWcgIT0gMCkKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgICAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCisJCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKKyAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKKyAgICAgIGVsc2UKKwlleHByMS5YX2FkZF9udW1iZXIgPSAwOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsICJ0LG8oYikiLCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisJZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIGVsc2UKKwlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgczIsICJ0LG8oYikiLCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fVUxIX0E6CisgICAgY2FzZSBNX1VMSFVfQToKKyAgICAgIGxvYWRfYWRkcmVzcyAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIpOworICAgICAgaWYgKGJyZWcgIT0gMCkKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgICAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCisJCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKKyAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKwlleHByMS5YX2FkZF9udW1iZXIgPSAwOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCisJCSAgIG1hc2sgPT0gTV9VTEhfQSA/ICJsYiIgOiAibGJ1IiwgInQsbyhiKSIsIHRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKKyAgICAgIGVsc2UKKwlleHByMS5YX2FkZF9udW1iZXIgPSAwOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAorCQkgICB0cmVnLCA4KTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKKwkJICAgdHJlZywgQVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fVVNIOgorICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDdmZmYpCisJYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzYiIsICJ0LG8oYikiLCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgdHJlZywgOCk7CisgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIC09IDE7CisgICAgICBlbHNlCisJb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInNiIiwgInQsbyhiKSIsIEFULAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9VU0Q6CisgICAgICBzID0gInNkbCI7CisgICAgICBzMiA9ICJzZHIiOworICAgICAgb2ZmID0gNzsKKyAgICAgIGdvdG8gdXN3OworICAgIGNhc2UgTV9VU1c6CisgICAgICBzID0gInN3bCI7CisgICAgICBzMiA9ICJzd3IiOworICAgICAgb2ZmID0gMzsKKyAgICB1c3c6CisgICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIG9mZikKKwlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7CisgICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gb2ZmOworICAgICAgZWxzZQorCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJ0LG8oYikiLCB0cmVnLAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE1fVVNEX0E6CisgICAgICBzID0gInNkbCI7CisgICAgICBzMiA9ICJzZHIiOworICAgICAgb2ZmID0gNzsKKyAgICAgIGdvdG8gdXN3YTsKKyAgICBjYXNlIE1fVVNXX0E6CisgICAgICBzID0gInN3bCI7CisgICAgICBzMiA9ICJzd3IiOworICAgICAgb2ZmID0gMzsKKyAgICB1c3dhOgorICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7CisgICAgICBpZiAoYnJlZyAhPSAwKQorCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCisJCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKKwkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKKwkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOworICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisJZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOworICAgICAgZWxzZQorCWV4cHIxLlhfYWRkX251bWJlciA9IDA7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgInQsbyhiKSIsIHRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisgICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwlleHByMS5YX2FkZF9udW1iZXIgPSAwOworICAgICAgZWxzZQorCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzMiwgInQsbyhiKSIsIHRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9VU0hfQToKKyAgICAgIGxvYWRfYWRkcmVzcyAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIpOworICAgICAgaWYgKGJyZWcgIT0gMCkKKwltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgICAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCisJCSAgICAgImQsdix0IiwgQVQsIEFULCBicmVnKTsKKyAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCWV4cHIxLlhfYWRkX251bWJlciA9IDA7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNiIiwgInQsbyhiKSIsIHRyZWcsCisJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCB0cmVnLAorCQkgICB0cmVnLCA4KTsKKyAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCWV4cHIxLlhfYWRkX251bWJlciA9IDE7CisgICAgICBlbHNlCisJZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2IiLCAidCxvKGIpIiwgdHJlZywKKwkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKKyAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCWV4cHIxLlhfYWRkX251bWJlciA9IDA7CisgICAgICBlbHNlCisJZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAibGJ1IiwgInQsbyhiKSIsIEFULAorCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgdHJlZywKKwkJICAgdHJlZywgOCk7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIHRyZWcsCisJCSAgIHRyZWcsIEFUKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEZJWE1FOiBDaGVjayBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgaXRibCBtYWNyb3MsIHNpbmNlIHRoZXkKKwkgYXJlIGFkZGVkIGR5bmFtaWNhbGx5LiAqLworICAgICAgYXNfYmFkIChfKCJNYWNybyAlcyBub3QgaW1wbGVtZW50ZWQgeWV0IiksIGlwLT5pbnNuX21vLT5uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKG1pcHNfb3B0cy5ub2F0KQorICAgIGFzX3dhcm4gKF8oIk1hY3JvIHVzZWQgJGF0IGFmdGVyIFwiLnNldCBub2F0XCIiKSk7Cit9CisKKy8qIEltcGxlbWVudCBtYWNyb3MgaW4gbWlwczE2IG1vZGUuICAqLworCitzdGF0aWMgdm9pZAorbWlwczE2X21hY3JvIChpcCkKKyAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Cit7CisgIGludCBtYXNrOworICBpbnQgeHJlZywgeXJlZywgenJlZywgdG1wOworICBpbnQgaWNudDsKKyAgZXhwcmVzc2lvblMgZXhwcjE7CisgIGludCBkYmw7CisgIGNvbnN0IGNoYXIgKnMsICpzMiwgKnMzOworCisgIG1hc2sgPSBpcC0+aW5zbl9tby0+bWFzazsKKworICB4cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYOworICB5cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWSkgJiBNSVBTMTZPUF9NQVNLX1JZOworICB6cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWikgJiBNSVBTMTZPUF9NQVNLX1JaOworCisgIGljbnQgPSAwOworCisgIGV4cHIxLlhfb3AgPSBPX2NvbnN0YW50OworICBleHByMS5YX29wX3N5bWJvbCA9IE5VTEw7CisgIGV4cHIxLlhfYWRkX3N5bWJvbCA9IE5VTEw7CisgIGV4cHIxLlhfYWRkX251bWJlciA9IDE7CisKKyAgZGJsID0gMDsKKworICBzd2l0Y2ggKG1hc2spCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBpbnRlcm5hbEVycm9yICgpOworCisgICAgY2FzZSBNX0RESVZfMzoKKyAgICAgIGRibCA9IDE7CisgICAgY2FzZSBNX0RJVl8zOgorICAgICAgcyA9ICJtZmxvIjsKKyAgICAgIGdvdG8gZG9fZGl2MzsKKyAgICBjYXNlIE1fRFJFTV8zOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fUkVNXzM6CisgICAgICBzID0gIm1maGkiOworICAgIGRvX2RpdjM6CisgICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKKyAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKKyAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCisJCSAgIGRibCA/ICJkZGl2IiA6ICJkaXYiLAorCQkgICAiMCx4LHkiLCB4cmVnLCB5cmVnKTsKKyAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZXoiLCAieCxwIiwgeXJlZyk7CisJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiNiIsIDcpOworICAgICAgCisgICAgICAvKiBGSVhNRTogVGhlIG5vcm1hbCBjb2RlIGNoZWNrcyBmb3Igb2YgLTEgLyAtMHg4MDAwMDAwMCBoZXJlLAorICAgICAgICAgc2luY2UgdGhhdCBjYXVzZXMgYW4gb3ZlcmZsb3cuICBXZSBzaG91bGQgZG8gdGhhdCBhcyB3ZWxsLAorICAgICAgICAgYnV0IEkgZG9uJ3Qgc2VlIGhvdyB0byBkbyB0aGUgY29tcGFyaXNvbnMgd2l0aG91dCBhIHRlbXBvcmFyeQorICAgICAgICAgcmVnaXN0ZXIuICAqLworICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAieCIsIHpyZWcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fRElWVV8zOgorICAgICAgcyA9ICJkaXZ1IjsKKyAgICAgIHMyID0gIm1mbG8iOworICAgICAgZ290byBkb19kaXZ1MzsKKyAgICBjYXNlIE1fUkVNVV8zOgorICAgICAgcyA9ICJkaXZ1IjsKKyAgICAgIHMyID0gIm1maGkiOworICAgICAgZ290byBkb19kaXZ1MzsKKyAgICBjYXNlIE1fRERJVlVfMzoKKyAgICAgIHMgPSAiZGRpdnUiOworICAgICAgczIgPSAibWZsbyI7CisgICAgICBnb3RvIGRvX2RpdnUzOworICAgIGNhc2UgTV9EUkVNVV8zOgorICAgICAgcyA9ICJkZGl2dSI7CisgICAgICBzMiA9ICJtZmhpIjsKKyAgICBkb19kaXZ1MzoKKyAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOworICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOworICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgIjAseCx5IiwgeHJlZywgeXJlZyk7CisgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAyOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmV6IiwgIngscCIsIHlyZWcpOworCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgIjYiLCA3KTsKKyAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJ4IiwgenJlZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9ETVVMOgorICAgICAgZGJsID0gMTsKKyAgICBjYXNlIE1fTVVMOgorICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAorCQkgICBkYmwgPyAiZG11bHR1IiA6ICJtdWx0dSIsCisJCSAgICJ4LHkiLCB4cmVnLCB5cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAieCIsIHpyZWcpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBNX0RTVUJVX0k6CisgICAgICBkYmwgPSAxOworICAgICAgZ290byBkb19zdWJ1OworICAgIGNhc2UgTV9TVUJVX0k6CisgICAgZG9fc3VidToKKyAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKKyAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKKwkJICAgZGJsID8gImRhZGRpdSIgOiAiYWRkaXUiLAorCQkgICAieSx4LDQiLCB5cmVnLCB4cmVnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NVQlVfSV8yOgorICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKKwlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOworICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAiYWRkaXUiLAorCQkgICAieCxrIiwgeHJlZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9EU1VCVV9JXzI6CisgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQorCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7CisgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJkYWRkaXUiLAorCQkgICAieSxqIiwgeXJlZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9CRVE6CisgICAgICBzID0gImNtcCI7CisgICAgICBzMiA9ICJidGVxeiI7CisgICAgICBnb3RvIGRvX2JyYW5jaDsKKyAgICBjYXNlIE1fQk5FOgorICAgICAgcyA9ICJjbXAiOworICAgICAgczIgPSAiYnRuZXoiOworICAgICAgZ290byBkb19icmFuY2g7CisgICAgY2FzZSBNX0JMVDoKKyAgICAgIHMgPSAic2x0IjsKKyAgICAgIHMyID0gImJ0bmV6IjsKKyAgICAgIGdvdG8gZG9fYnJhbmNoOworICAgIGNhc2UgTV9CTFRVOgorICAgICAgcyA9ICJzbHR1IjsKKyAgICAgIHMyID0gImJ0bmV6IjsKKyAgICAgIGdvdG8gZG9fYnJhbmNoOworICAgIGNhc2UgTV9CTEU6CisgICAgICBzID0gInNsdCI7CisgICAgICBzMiA9ICJidGVxeiI7CisgICAgICBnb3RvIGRvX3JldmVyc2VfYnJhbmNoOworICAgIGNhc2UgTV9CTEVVOgorICAgICAgcyA9ICJzbHR1IjsKKyAgICAgIHMyID0gImJ0ZXF6IjsKKyAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7CisgICAgY2FzZSBNX0JHRToKKyAgICAgIHMgPSAic2x0IjsKKyAgICAgIHMyID0gImJ0ZXF6IjsKKyAgICAgIGdvdG8gZG9fYnJhbmNoOworICAgIGNhc2UgTV9CR0VVOgorICAgICAgcyA9ICJzbHR1IjsKKyAgICAgIHMyID0gImJ0ZXF6IjsKKyAgICAgIGdvdG8gZG9fYnJhbmNoOworICAgIGNhc2UgTV9CR1Q6CisgICAgICBzID0gInNsdCI7CisgICAgICBzMiA9ICJidG5leiI7CisgICAgICBnb3RvIGRvX3JldmVyc2VfYnJhbmNoOworICAgIGNhc2UgTV9CR1RVOgorICAgICAgcyA9ICJzbHR1IjsKKyAgICAgIHMyID0gImJ0bmV6IjsKKworICAgIGRvX3JldmVyc2VfYnJhbmNoOgorICAgICAgdG1wID0geHJlZzsKKyAgICAgIHhyZWcgPSB5cmVnOworICAgICAgeXJlZyA9IHRtcDsKKworICAgIGRvX2JyYW5jaDoKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsIHMsICJ4LHkiLAorCQkgICB4cmVnLCB5cmVnKTsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInAiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0JFUV9JOgorICAgICAgcyA9ICJjbXBpIjsKKyAgICAgIHMyID0gImJ0ZXF6IjsKKyAgICAgIHMzID0gIngsVSI7CisgICAgICBnb3RvIGRvX2JyYW5jaF9pOworICAgIGNhc2UgTV9CTkVfSToKKyAgICAgIHMgPSAiY21waSI7CisgICAgICBzMiA9ICJidG5leiI7CisgICAgICBzMyA9ICJ4LFUiOworICAgICAgZ290byBkb19icmFuY2hfaTsKKyAgICBjYXNlIE1fQkxUX0k6CisgICAgICBzID0gInNsdGkiOworICAgICAgczIgPSAiYnRuZXoiOworICAgICAgczMgPSAieCw4IjsKKyAgICAgIGdvdG8gZG9fYnJhbmNoX2k7CisgICAgY2FzZSBNX0JMVFVfSToKKyAgICAgIHMgPSAic2x0aXUiOworICAgICAgczIgPSAiYnRuZXoiOworICAgICAgczMgPSAieCw4IjsKKyAgICAgIGdvdG8gZG9fYnJhbmNoX2k7CisgICAgY2FzZSBNX0JMRV9JOgorICAgICAgcyA9ICJzbHRpIjsKKyAgICAgIHMyID0gImJ0bmV6IjsKKyAgICAgIHMzID0gIngsOCI7CisgICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKKyAgICBjYXNlIE1fQkxFVV9JOgorICAgICAgcyA9ICJzbHRpdSI7CisgICAgICBzMiA9ICJidG5leiI7CisgICAgICBzMyA9ICJ4LDgiOworICAgICAgZ290byBkb19hZGRvbmVfYnJhbmNoX2k7CisgICAgY2FzZSBNX0JHRV9JOgorICAgICAgcyA9ICJzbHRpIjsKKyAgICAgIHMyID0gImJ0ZXF6IjsKKyAgICAgIHMzID0gIngsOCI7CisgICAgICBnb3RvIGRvX2JyYW5jaF9pOworICAgIGNhc2UgTV9CR0VVX0k6CisgICAgICBzID0gInNsdGl1IjsKKyAgICAgIHMyID0gImJ0ZXF6IjsKKyAgICAgIHMzID0gIngsOCI7CisgICAgICBnb3RvIGRvX2JyYW5jaF9pOworICAgIGNhc2UgTV9CR1RfSToKKyAgICAgIHMgPSAic2x0aSI7CisgICAgICBzMiA9ICJidGVxeiI7CisgICAgICBzMyA9ICJ4LDgiOworICAgICAgZ290byBkb19hZGRvbmVfYnJhbmNoX2k7CisgICAgY2FzZSBNX0JHVFVfSToKKyAgICAgIHMgPSAic2x0aXUiOworICAgICAgczIgPSAiYnRlcXoiOworICAgICAgczMgPSAieCw4IjsKKworICAgIGRvX2FkZG9uZV9icmFuY2hfaToKKyAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKKyAgICAgICsraW1tX2V4cHIuWF9hZGRfbnVtYmVyOworCisgICAgZG9fYnJhbmNoX2k6CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgcywgczMsIHhyZWcpOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAicCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQUJTOgorICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aSIsICJ4LDgiLCAgeXJlZyk7CisgICAgICBpZiAoeHJlZyAhPSB5cmVnKQorCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJCSAgICAgIm1vdmUiLCAieSxYIiwgeHJlZywgeXJlZyk7CisgICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAyOworICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJidGVxeiIsICJwIik7CisgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAorCQkgICAibmVnIiwgIngsdyIsIHhyZWcsIHhyZWcpOworICAgIH0KK30KKworLyogRm9yIGNvbnNpc3RlbmN5IGNoZWNraW5nLCB2ZXJpZnkgdGhhdCBhbGwgYml0cyBhcmUgc3BlY2lmaWVkIGVpdGhlcgorICAgYnkgdGhlIG1hdGNoL21hc2sgcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiwgb3IgYnkgdGhlCisgICBvcGVyYW5kIGxpc3QuICAqLworc3RhdGljIGludAordmFsaWRhdGVfbWlwc19pbnNuIChvcGMpCisgICAgIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3BjOworeworICBjb25zdCBjaGFyICpwID0gb3BjLT5hcmdzOworICBjaGFyIGM7CisgIHVuc2lnbmVkIGxvbmcgdXNlZF9iaXRzID0gb3BjLT5tYXNrOworCisgIGlmICgodXNlZF9iaXRzICYgb3BjLT5tYXRjaCkgIT0gb3BjLT5tYXRjaCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKG1hc2sgZXJyb3IpOiAlcyAlcyIpLAorCSAgICAgIG9wYy0+bmFtZSwgb3BjLT5hcmdzKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyNkZWZpbmUgVVNFX0JJVFMobWFzayxzaGlmdCkJKHVzZWRfYml0cyB8PSAoKG1hc2spIDw8IChzaGlmdCkpKQorICB3aGlsZSAoKnApCisgICAgc3dpdGNoIChjID0gKnArKykKKyAgICAgIHsKKyAgICAgIGNhc2UgJywnOiBicmVhazsKKyAgICAgIGNhc2UgJygnOiBicmVhazsKKyAgICAgIGNhc2UgJyknOiBicmVhazsKKyAgICAgIGNhc2UgJzwnOiBVU0VfQklUUyAoT1BfTUFTS19TSEFNVCwJT1BfU0hfU0hBTVQpOwlicmVhazsKKyAgICAgIGNhc2UgJz4nOglVU0VfQklUUyAoT1BfTUFTS19TSEFNVCwJT1BfU0hfU0hBTVQpOwlicmVhazsKKyAgICAgIGNhc2UgJ0EnOiBicmVhazsKKyAgICAgIGNhc2UgJ0InOglVU0VfQklUUyAoT1BfTUFTS19TWVNDQUxMLAlPUF9TSF9TWVNDQUxMKTsJYnJlYWs7CisgICAgICBjYXNlICdDJzoJVVNFX0JJVFMgKE9QX01BU0tfQ09QWiwJCU9QX1NIX0NPUFopOwlicmVhazsKKyAgICAgIGNhc2UgJ0QnOglVU0VfQklUUyAoT1BfTUFTS19GRCwJCU9QX1NIX0ZEKTsJYnJlYWs7CisgICAgICBjYXNlICdFJzoJVVNFX0JJVFMgKE9QX01BU0tfUlQsCQlPUF9TSF9SVCk7CWJyZWFrOworICAgICAgY2FzZSAnRic6IGJyZWFrOworICAgICAgY2FzZSAnRyc6CVVTRV9CSVRTIChPUF9NQVNLX1JELAkJT1BfU0hfUkQpOwlicmVhazsKKyAgICAgIGNhc2UgJ0knOiBicmVhazsKKyAgICAgIGNhc2UgJ0wnOiBicmVhazsKKyAgICAgIGNhc2UgJ00nOglVU0VfQklUUyAoT1BfTUFTS19DQ0MsCQlPUF9TSF9DQ0MpOwlicmVhazsKKyAgICAgIGNhc2UgJ04nOglVU0VfQklUUyAoT1BfTUFTS19CQ0MsCQlPUF9TSF9CQ0MpOwlicmVhazsKKyAgICAgIGNhc2UgJ1InOglVU0VfQklUUyAoT1BfTUFTS19GUiwJCU9QX1NIX0ZSKTsJYnJlYWs7CisgICAgICBjYXNlICdTJzoJVVNFX0JJVFMgKE9QX01BU0tfRlMsCQlPUF9TSF9GUyk7CWJyZWFrOworICAgICAgY2FzZSAnVCc6CVVTRV9CSVRTIChPUF9NQVNLX0ZULAkJT1BfU0hfRlQpOwlicmVhazsKKyAgICAgIGNhc2UgJ1YnOglVU0VfQklUUyAoT1BfTUFTS19GUywJCU9QX1NIX0ZTKTsJYnJlYWs7CisgICAgICBjYXNlICdXJzoJVVNFX0JJVFMgKE9QX01BU0tfRlQsCQlPUF9TSF9GVCk7CWJyZWFrOworICAgICAgY2FzZSAnYSc6CVVTRV9CSVRTIChPUF9NQVNLX1RBUkdFVCwJT1BfU0hfVEFSR0VUKTsJYnJlYWs7CisgICAgICBjYXNlICdiJzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOworICAgICAgY2FzZSAnYyc6CVVTRV9CSVRTIChPUF9NQVNLX0NPREUsCQlPUF9TSF9DT0RFKTsJYnJlYWs7CisgICAgICBjYXNlICdkJzoJVVNFX0JJVFMgKE9QX01BU0tfUkQsCQlPUF9TSF9SRCk7CWJyZWFrOworICAgICAgY2FzZSAnZic6IGJyZWFrOworICAgICAgY2FzZSAnaCc6CVVTRV9CSVRTIChPUF9NQVNLX1BSRUZYLAlPUF9TSF9QUkVGWCk7CWJyZWFrOworICAgICAgY2FzZSAnaSc6CVVTRV9CSVRTIChPUF9NQVNLX0lNTUVESUFURSwJT1BfU0hfSU1NRURJQVRFKTsgYnJlYWs7CisgICAgICBjYXNlICdqJzoJVVNFX0JJVFMgKE9QX01BU0tfREVMVEEsCU9QX1NIX0RFTFRBKTsJYnJlYWs7CisgICAgICBjYXNlICdrJzoJVVNFX0JJVFMgKE9QX01BU0tfQ0FDSEUsCU9QX1NIX0NBQ0hFKTsJYnJlYWs7CisgICAgICBjYXNlICdsJzogYnJlYWs7CisgICAgICBjYXNlICdvJzogVVNFX0JJVFMgKE9QX01BU0tfREVMVEEsCU9QX1NIX0RFTFRBKTsJYnJlYWs7CisgICAgICBjYXNlICdwJzoJVVNFX0JJVFMgKE9QX01BU0tfREVMVEEsCU9QX1NIX0RFTFRBKTsJYnJlYWs7CisgICAgICBjYXNlICdxJzoJVVNFX0JJVFMgKE9QX01BU0tfQ09ERTIsCU9QX1NIX0NPREUyKTsJYnJlYWs7CisgICAgICBjYXNlICdyJzogVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOworICAgICAgY2FzZSAncyc6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKKyAgICAgIGNhc2UgJ3QnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7CisgICAgICBjYXNlICd1JzoJVVNFX0JJVFMgKE9QX01BU0tfSU1NRURJQVRFLAlPUF9TSF9JTU1FRElBVEUpOyBicmVhazsKKyAgICAgIGNhc2UgJ3YnOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7CisgICAgICBjYXNlICd3JzoJVVNFX0JJVFMgKE9QX01BU0tfUlQsCQlPUF9TSF9SVCk7CWJyZWFrOworICAgICAgY2FzZSAneCc6IGJyZWFrOworICAgICAgY2FzZSAneic6IGJyZWFrOworICAgICAgY2FzZSAnUCc6IFVTRV9CSVRTIChPUF9NQVNLX1BFUkZSRUcsCU9QX1NIX1BFUkZSRUcpOwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJYXNfYmFkIChfKCJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlICh1bmtub3duIG9wZXJhbmQgdHlwZSBgJWMnKTogJXMgJXMiKSwKKwkJYywgb3BjLT5uYW1lLCBvcGMtPmFyZ3MpOworCXJldHVybiAwOworICAgICAgfQorI3VuZGVmIFVTRV9CSVRTCisgIGlmICh1c2VkX2JpdHMgIT0gMHhmZmZmZmZmZikKKyAgICB7CisgICAgICBhc19iYWQgKF8oImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKGJpdHMgMHglbHggdW5kZWZpbmVkKTogJXMgJXMiKSwKKwkgICAgICB+dXNlZF9iaXRzICYgMHhmZmZmZmZmZiwgb3BjLT5uYW1lLCBvcGMtPmFyZ3MpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworLyogVGhpcyByb3V0aW5lIGFzc2VtYmxlcyBhbiBpbnN0cnVjdGlvbiBpbnRvIGl0cyBiaW5hcnkgZm9ybWF0LiAgQXMgYQorICAgc2lkZSBlZmZlY3QsIGl0IHNldHMgb25lIG9mIHRoZSBnbG9iYWwgdmFyaWFibGVzIGltbV9yZWxvYyBvcgorICAgb2Zmc2V0X3JlbG9jIHRvIHRoZSB0eXBlIG9mIHJlbG9jYXRpb24gdG8gZG8gaWYgb25lIG9mIHRoZSBvcGVyYW5kcworICAgaXMgYW4gYWRkcmVzcyBleHByZXNzaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfaXAgKHN0ciwgaXApCisgICAgIGNoYXIgKnN0cjsKKyAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Cit7CisgIGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmFyZ3M7CisgIGNoYXIgYzsKKyAgc3RydWN0IG1pcHNfb3Bjb2RlICppbnNuOworICBjaGFyICphcmdzU3RhcnQ7CisgIHVuc2lnbmVkIGludCByZWdubzsKKyAgdW5zaWduZWQgaW50IGxhc3RyZWdubyA9IDA7CisgIGNoYXIgKnNfcmVzZXQ7CisgIGNoYXIgc2F2ZV9jID0gMDsKKyAgaW50IGZ1bGxfb3Bjb2RlX21hdGNoID0gMTsKKworICBpbnNuX2Vycm9yID0gTlVMTDsKKworICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gY29udGFpbnMgYSAnLicsIHdlIGZpcnN0IHRyeSB0byBtYXRjaCBhbiBpbnN0cnVjdGlvbgorICAgICBpbmNsdWRpbmcgdGhlICcuJy4gIFRoZW4gd2UgdHJ5IGFnYWluIHdpdGhvdXQgdGhlICcuJy4gICovCisgIGluc24gPSBOVUxMOworICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgIWlzc3BhY2UoKnMpOyArK3MpCisgICAgY29udGludWU7CisKKyAgLyogSWYgd2Ugc3RvcHBlZCBvbiB3aGl0ZXNwYWNlLCB0aGVuIHJlcGxhY2UgdGhlIHdoaXRlc3BhY2Ugd2l0aCBudWxsIGZvcgorICAgICB0aGUgY2FsbCB0byBoYXNoX2ZpbmQuICBTYXZlIHRoZSBjaGFyYWN0ZXIgd2UgcmVwbGFjZWQganVzdCBpbiBjYXNlIHdlCisgICAgIGhhdmUgdG8gcmUtcGFyc2UgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgaWYgKGlzc3BhY2UgKCpzKSkKKyAgICB7CisgICAgICBzYXZlX2MgPSAqczsKKyAgICAgICpzKysgPSAnXDAnOworICAgIH0KKwkKKyAgaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpOworCisgIC8qIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgb3Bjb2RlIHRhYmxlLCB0cnkgYWdhaW4sIGJ1dAorICAgICB0aGlzIHRpbWUgd2l0aCBqdXN0IHRoZSBpbnN0cnVjdGlvbiB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcgdGhlCisgICAgIGZpcnN0ICcuJy4gICovCisgIGlmIChpbnNuID09IE5VTEwpCisgICAgeworICAgICAgLyogUmVzdG9yZSB0aGUgY2hhcmFjdGVyIHdlIG92ZXJ3cml0ZSBhYm92ZSAoaWYgYW55KS4gICovIAorICAgICAgaWYgKHNhdmVfYykKKwkqKC0tcykgPSBzYXZlX2M7CisKKyAgICAgIC8qIFNjYW4gdXAgdG8gdGhlIGZpcnN0ICcuJyBvciB3aGl0ZXNwYWNlLiAgKi8KKyAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAqcyAhPSAnLicgJiYgIWlzc3BhY2UgKCpzKTsgKytzKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJZiB3ZSBkaWQgbm90IGZpbmQgYSAnLicsIHRoZW4gd2UgY2FuIHF1aXQgbm93LiAgKi8KKyAgICAgIGlmICgqcyAhPSAnLicpCisJeworCSAgaW5zbl9lcnJvciA9ICJ1bnJlY29nbml6ZWQgb3Bjb2RlIjsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIExvb2t1cCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGhhc2ggdGFibGUuICAqLworICAgICAgKnMrKyA9ICdcMCc7CisgICAgICBpZiAoKGluc24gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKKwl7CisJICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOworCSAgcmV0dXJuOworCX0KKworICAgICAgZnVsbF9vcGNvZGVfbWF0Y2ggPSAwOworICAgIH0KKworICBhcmdzU3RhcnQgPSBzOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCBpbnNuX2lzYTsKKyAgICAgIGJvb2xlYW4gb2s7CisKKyAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOworCisgICAgICBpZiAoKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0ExKQorCWluc25faXNhID0gMTsKKyAgICAgIGVsc2UgaWYgKChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMikKKwlpbnNuX2lzYSA9IDI7CisgICAgICBlbHNlIGlmICgoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTMpCisJaW5zbl9pc2EgPSAzOworICAgICAgZWxzZSBpZiAoKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0E0KQorCWluc25faXNhID0gNDsKKyAgICAgIGVsc2UKKwlpbnNuX2lzYSA9IDE1OworCisgICAgICBpZiAoaW5zbl9pc2EgPD0gbWlwc19vcHRzLmlzYSkKKwlvayA9IHRydWU7CisgICAgICBlbHNlIGlmIChpbnNuLT5waW5mbyA9PSBJTlNOX01BQ1JPKQorCW9rID0gZmFsc2U7CisgICAgICBlbHNlIGlmICgobWlwc19jcHUgPT0gNDY1MCAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fNDY1MCkgIT0gMCkKKwkgICAgICAgfHwgKG1pcHNfY3B1ID09IDQwMTAgJiYgKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOXzQwMTApICE9IDApCisJICAgICAgIHx8ICgobWlwc19jcHUgPT0gNDEwMAorCQkgICAgfHwgbWlwc19jcHUgPT0gNDExMQorCQkgICAgKQorCQkgICAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgIT0gMCkKKwkgICAgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApICE9IDApKQorCW9rID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwlvayA9IGZhbHNlOworCisgICAgICBpZiAoaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKKwl7CisJICBpZiAobWlwc19jcHUgPT0gNDY1MCAmJiAoaW5zbi0+cGluZm8gJiBGUF9EKSAhPSAwKQorCSAgICBvayA9IGZhbHNlOworCX0KKworICAgICAgaWYgKCEgb2spCisJeworCSAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXQorCSAgICAgICYmIHN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgKytpbnNuOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBpZiAoaW5zbl9pc2EgPT0gMTUgCisgICAgICAgICAgICAgIHx8IGluc25faXNhIDw9IG1pcHNfb3B0cy5pc2EpCisJICAgIGluc25fZXJyb3IgPSBfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07CisKKwkgICAgICBzcHJpbnRmIChidWYsIF8oIm9wY29kZSByZXF1aXJlcyAtbWlwcyVkIG9yIGdyZWF0ZXIiKSwgaW5zbl9pc2EpOworCSAgICAgIGluc25fZXJyb3IgPSBidWY7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlwLT5pbnNuX21vID0gaW5zbjsKKyAgICAgIGlwLT5pbnNuX29wY29kZSA9IGluc24tPm1hdGNoOworICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKKwl7CisJICBpZiAoKnMgPT0gJyAnKQorCSAgICArK3M7CisJICBzd2l0Y2ggKCphcmdzKQorCSAgICB7CisJICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCisJICAgICAgaWYgKCpzID09ICdcMCcpCisJCXJldHVybjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICcsJzoKKwkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKKwkJY29udGludWU7CisJICAgICAgcy0tOworCSAgICAgIHN3aXRjaCAoKisrYXJncykKKwkJeworCQljYXNlICdyJzoKKwkJY2FzZSAndic6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAyMTsKKwkJICBjb250aW51ZTsKKworCQljYXNlICd3JzoKKwkJY2FzZSAnVyc6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKKwkJICBjb250aW51ZTsKKworCQljYXNlICdWJzoKKwkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDExOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnKCc6CisJICAgICAgLyogSGFuZGxlIG9wdGlvbmFsIGJhc2UgcmVnaXN0ZXIuCisJCSBFaXRoZXIgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgb21pdHRlZCBvcgorCQkgd2UgbXVzdCBoYXZlIGEgbGVmdCBwYXJlbi4gKi8KKwkgICAgICAvKiBUaGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgbmV4dCBvcGVyYW5kIHNwZWNpZmllcgorCQkgaXMgYSBiYXNlIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24uICAqLworCSAgICAgIGFzc2VydCAoYXJnc1sxXSA9PSAnYicgfHwgYXJnc1sxXSA9PSAnNScKKwkJICAgICAgfHwgYXJnc1sxXSA9PSAnLScgfHwgYXJnc1sxXSA9PSAnNCcpOworCSAgICAgIGlmICgqcyA9PSAnXDAnKQorCQlyZXR1cm47CisKKwkgICAgY2FzZSAnKSc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KKwkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKKwkJY29udGludWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnPCc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLworCSAgICAgIC8qCisJICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwsIGlmIHRoZSBzaGlmdCBhbW91bnQgaXMgZ3JlYXRlcgorCSAgICAgICAqIHRoYW4gMzEgb3IgbGVzcyB0aGFuIDAgdGhlIHRoZSBzaGlmdCBhbW91bnQgc2hvdWxkIGJlCisJICAgICAgICogbW9kIDMyLiBJbiByZWFsaXR5IHRoZSBtaXBzIGFzc2VtYmxlciBpc3N1ZXMgYW4gZXJyb3IuCisJICAgICAgICogV2UgaXNzdWUgYSB3YXJuaW5nIGFuZCBtYXNrIG91dCBhbGwgYnV0IHRoZSBsb3cgNSBiaXRzLgorCSAgICAgICAqLworCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7CisJICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAzMSkKKwkJeworCQkgIGFzX3dhcm4gKF8oIkltcHJvcGVyIHNoaWZ0IGFtb3VudCAoJWxkKSIpLAorCQkJICAgKGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7CisJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyICYgMHgxZjsKKwkJfQorCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKKwkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJz4nOgkJLyogc2hpZnQgYW1vdW50IG1pbnVzIDMyICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKKwkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA8IDMyCisJCSAgfHwgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDYzKQorCQlicmVhazsKKwkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gKGltbV9leHByLlhfYWRkX251bWJlciAtIDMyKSA8PCA2OworCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKworCSAgICBjYXNlICdrJzoJCS8qIGNhY2hlIGNvZGUgKi8KKwkgICAgY2FzZSAnaCc6CQkvKiBwcmVmeCBjb2RlICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKKwkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQorCQl7CisJCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAorCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgxZjsKKwkJfQorCSAgICAgIGlmICgqYXJncyA9PSAnaycpCisJCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfQ0FDSEU7CisJICAgICAgZWxzZQorCQlpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IE9QX1NIX1BSRUZYOworCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnYyc6CQkvKiBicmVhayBjb2RlICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKKwkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAxMDIzKQorCQl7CisJCSAgYXNfd2FybiAoXygiSWxsZWdhbCBicmVhayBjb2RlICglbGQpIiksCisJCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZmY7CisJCX0KKwkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDE2OworCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAncSc6CQkvKiBsb3dlciBicmVhayBjb2RlICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKKwkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAxMDIzKQorCQl7CisJCSAgYXNfd2FybiAoXygiSWxsZWdhbCBsb3dlciBicmVhayBjb2RlICglbGQpIiksCisJCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZmY7CisJCX0KKwkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDY7CisJICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdCJzoJCS8qIHN5c2NhbGwgY29kZSAqLworCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7CisJICAgICAgaWYgKCh1bnNpZ25lZCkgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMHhmZmZmZikKKwkJYXNfd2FybiAoXygiSWxsZWdhbCBzeXNjYWxsIGNvZGUgKCVsZCkiKSwKKwkJCSAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDY7CisJICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY2FzZSAnQyc6ICAgICAgICAgICAvKiBDb3Byb2Nlc3NvciBjb2RlICovCisgICAgICAgICAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7CisgICAgICAgICAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49ICgxPDwyNSkpCisJCXsKKyAgICAgICAgICAgICAgICAgIGFzX3dhcm4gKF8oIkNvcHJvY2Nlc29yIGNvZGUgPiAyNSBiaXRzICglbGQpIiksCisJCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAoKDE8PDI1KSAtIDEpOworCQl9CisgICAgICAgICAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXI7CisgICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKyAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOworICAgICAgICAgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdQJzoJCS8qIFBlcmZvcm1hbmNlIHJlZ2lzdGVyICovCisgICAgICAgICAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7CisgICAgICAgICAgICAgIGlmIChpbW1fZXhwci5YX2FkZF9udW1iZXIgIT0gMCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgIT0gMSkKKwkJeworICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiSW52YWxpZGF0ZSBwZXJmb3JtYW5jZSByZWdzdGVyICglbGQpIiksCisJCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAxOworCQl9CisgICAgICAgICAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDEpOworICAgICAgICAgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7CisgICAgICAgICAgICAgIHMgPSBleHByX2VuZDsKKyAgICAgICAgICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnYic6CQkvKiBiYXNlIHJlZ2lzdGVyICovCisJICAgIGNhc2UgJ2QnOgkJLyogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KKwkgICAgY2FzZSAncyc6CQkvKiBzb3VyY2UgcmVnaXN0ZXIgKi8KKwkgICAgY2FzZSAndCc6CQkvKiB0YXJnZXQgcmVnaXN0ZXIgKi8KKwkgICAgY2FzZSAncic6CQkvKiBib3RoIHRhcmdldCBhbmQgc291cmNlICovCisJICAgIGNhc2UgJ3YnOgkJLyogYm90aCBkZXN0IGFuZCBzb3VyY2UgKi8KKwkgICAgY2FzZSAndyc6CQkvKiBib3RoIGRlc3QgYW5kIHRhcmdldCAqLworCSAgICBjYXNlICdFJzoJCS8qIGNvcHJvY2Vzc29yIHRhcmdldCByZWdpc3RlciAqLworCSAgICBjYXNlICdHJzoJCS8qIGNvcHJvY2Vzc29yIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCisJICAgIGNhc2UgJ3gnOgkJLyogaWdub3JlIHJlZ2lzdGVyIG5hbWUgKi8KKwkgICAgY2FzZSAneic6CQkvKiBtdXN0IGJlIHplcm8gcmVnaXN0ZXIgKi8KKwkgICAgICBzX3Jlc2V0ID0gczsKKwkgICAgICBpZiAoc1swXSA9PSAnJCcpCisJCXsKKworCQkgIGlmIChpc2RpZ2l0IChzWzFdKSkKKwkJICAgIHsKKwkJICAgICAgKytzOworCQkgICAgICByZWdubyA9IDA7CisJCSAgICAgIGRvCisJCQl7CisJCQkgIHJlZ25vICo9IDEwOworCQkJICByZWdubyArPSAqcyAtICcwJzsKKwkJCSAgKytzOworCQkJfQorCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKnMpKTsKKwkJICAgICAgaWYgKHJlZ25vID4gMzEpCisJCQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICglZCkiKSwgcmVnbm8pOworCQkgICAgfQorCQkgIGVsc2UgaWYgKCphcmdzID09ICdFJyB8fCAqYXJncyA9PSAnRycpCisJCSAgICBnb3RvIG5vdHJlZzsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmIChzWzFdID09ICdmJyAmJiBzWzJdID09ICdwJykKKwkJCXsKKwkJCSAgcyArPSAzOworCQkJICByZWdubyA9IEZQOworCQkJfQorCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdzJyAmJiBzWzJdID09ICdwJykKKwkJCXsKKwkJCSAgcyArPSAzOworCQkJICByZWdubyA9IFNQOworCQkJfQorCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdnJyAmJiBzWzJdID09ICdwJykKKwkJCXsKKwkJCSAgcyArPSAzOworCQkJICByZWdubyA9IEdQOworCQkJfQorCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdhJyAmJiBzWzJdID09ICd0JykKKwkJCXsKKwkJCSAgcyArPSAzOworCQkJICByZWdubyA9IEFUOworCQkJfQorCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdrJyAmJiBzWzJdID09ICd0JyAmJiBzWzNdID09ICcwJykKKwkJCXsKKwkJCSAgcyArPSA0OworCQkJICByZWdubyA9IEtUMDsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc1sxXSA9PSAnaycgJiYgc1syXSA9PSAndCcgJiYgc1szXSA9PSAnMScpCisJCQl7CisJCQkgIHMgKz0gNDsKKwkJCSAgcmVnbm8gPSBLVDE7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKGl0YmxfaGF2ZV9lbnRyaWVzKQorCQkJeworCQkJICBjaGFyICpwLCAqbjsKKwkJCSAgaW50IHI7CisKKwkJCSAgcCA9IHMrMTsgCS8qIGFkdmFuY2UgcGFzdCAnJCcgKi8KKwkJCSAgbiA9IGl0YmxfZ2V0X2ZpZWxkICgmcCk7ICAvKiBuIGlzIG5hbWUgKi8KKworCQkJICAvKiBTZWUgaWYgdGhpcyBpcyBhIHJlZ2lzdGVyIGRlZmluZWQgaW4gYW4gCisJCQkgICAgIGl0YmwgZW50cnkgKi8KKwkJCSAgciA9IGl0YmxfZ2V0X3JlZ192YWwgKG4pOworCQkJICBpZiAocikKKwkJCSAgICB7CisJCQkgICAgICAvKiBHZXRfZmllbGQgYWR2YW5jZXMgdG8gdGhlIHN0YXJ0IG9mCisJCQkJIHRoZSBuZXh0IGZpZWxkLCBzbyB3ZSBuZWVkIHRvIGJhY2sKKwkJCQkgcmFjayB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IGZpZWxkLiAqLworCQkJICAgICAgaWYgKHApIAorCQkJCXMgPSBwIC0gMTsKKwkJCSAgICAgIGVsc2UgCisJCQkJcyA9IHN0cmNociAocywnXDAnKTsKKwkJCSAgICAgIHJlZ25vID0gcjsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICBnb3RvIG5vdHJlZzsKKwkJCSAgfQorCQkgICAgICBlbHNlCisJCQlnb3RvIG5vdHJlZzsKKwkJICAgIH0KKwkJICBpZiAocmVnbm8gPT0gQVQKKwkJICAgICAgJiYgISBtaXBzX29wdHMubm9hdAorCQkgICAgICAmJiAqYXJncyAhPSAnRScKKwkJICAgICAgJiYgKmFyZ3MgIT0gJ0cnKQorCQkgICAgYXNfd2FybiAoXygiVXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIikpOworCQkgIGMgPSAqYXJnczsKKwkJICBpZiAoKnMgPT0gJyAnKQorCQkgICAgcysrOworCQkgIGlmIChhcmdzWzFdICE9ICpzKQorCQkgICAgeworCQkgICAgICBpZiAoYyA9PSAncicgfHwgYyA9PSAndicgfHwgYyA9PSAndycpCisJCQl7CisJCQkgIHJlZ25vID0gbGFzdHJlZ25vOworCQkJICBzID0gc19yZXNldDsKKwkJCSAgYXJncysrOworCQkJfQorCQkgICAgfQorCQkgIC8qICd6JyBvbmx5IG1hdGNoZXMgJDAuICAqLworCQkgIGlmIChjID09ICd6JyAmJiByZWdubyAhPSAwKQorCQkgICAgYnJlYWs7CisKKwkvKiBOb3cgdGhhdCB3ZSBoYXZlIGFzc2VtYmxlZCBvbmUgb3BlcmFuZCwgd2UgdXNlIHRoZSBhcmdzIHN0cmluZyAKKwkgKiB0byBmaWd1cmUgb3V0IHdoZXJlIGl0IGdvZXMgaW4gdGhlIGluc3RydWN0aW9uLiAqLworCQkgIHN3aXRjaCAoYykKKwkJICAgIHsKKwkJICAgIGNhc2UgJ3InOgorCQkgICAgY2FzZSAncyc6CisJCSAgICBjYXNlICd2JzoKKwkJICAgIGNhc2UgJ2InOgorCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMjE7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnZCc6CisJCSAgICBjYXNlICdHJzoKKwkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDExOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ3cnOgorCQkgICAgY2FzZSAndCc6CisJCSAgICBjYXNlICdFJzoKKwkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDE2OworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ3gnOgorCQkgICAgICAvKiBUaGlzIGNhc2UgZXhpc3RzIGJlY2F1c2Ugb24gdGhlIHIzMDAwIHRydW5jCisJCQkgZXhwYW5kcyBpbnRvIGEgbWFjcm8gd2hpY2ggcmVxdWlyZXMgYSBncAorCQkJIHJlZ2lzdGVyLiAgT24gdGhlIHI2MDAwIG9yIHI0MDAwIGl0IGlzCisJCQkgYXNzZW1ibGVkIGludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gd2hpY2gKKwkJCSBpZ25vcmVzIHRoZSByZWdpc3Rlci4gIFRodXMgdGhlIGluc24gdmVyc2lvbgorCQkJIGlzIE1JUFNfSVNBMiBhbmQgdXNlcyAneCcsIGFuZCB0aGUgbWFjcm8KKwkJCSB2ZXJzaW9uIGlzIE1JUFNfSVNBMSBhbmQgdXNlcyAndCcuICAqLworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ3onOgorCQkgICAgICAvKiBUaGlzIGNhc2UgaXMgZm9yIHRoZSBkaXYgaW5zdHJ1Y3Rpb24sIHdoaWNoCisJCQkgYWN0cyBkaWZmZXJlbnRseSBpZiB0aGUgZGVzdGluYXRpb24gYXJndW1lbnQKKwkJCSBpcyAkMC4gIFRoaXMgb25seSBtYXRjaGVzICQwLCBhbmQgaXMgY2hlY2tlZAorCQkJIG91dHNpZGUgdGhlIHN3aXRjaC4gICovCisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnRCc6CisJCSAgICAgIC8qIEl0Ymwgb3BlcmFuZDsgbm90IHlldCBpbXBsZW1lbnRlZC4gRklYTUUgPz8gKi8KKwkJICAgICAgYnJlYWs7CisJCSAgICAgIC8qIFdoYXQgYWJvdXQgYWxsIG90aGVyIG9wZXJhbmRzIGxpa2UgJ2knLCB3aGljaAorCQkJIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIG9wY29kZSB0YWJsZT8gKi8KKwkJICAgIH0KKwkJICBsYXN0cmVnbm8gPSByZWdubzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICBub3RyZWc6CisJICAgICAgc3dpdGNoICgqYXJncysrKQorCQl7CisJCWNhc2UgJ3InOgorCQljYXNlICd2JzoKKwkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDIxOworCQkgIGNvbnRpbnVlOworCQljYXNlICd3JzoKKwkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDE2OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnRCc6CQkvKiBmbG9hdGluZyBwb2ludCBkZXN0aW5hdGlvbiByZWdpc3RlciAqLworCSAgICBjYXNlICdTJzoJCS8qIGZsb2F0aW5nIHBvaW50IHNvdXJjZSByZWdpc3RlciAqLworCSAgICBjYXNlICdUJzoJCS8qIGZsb2F0aW5nIHBvaW50IHRhcmdldCByZWdpc3RlciAqLworCSAgICBjYXNlICdSJzoJCS8qIGZsb2F0aW5nIHBvaW50IHNvdXJjZSByZWdpc3RlciAqLworCSAgICBjYXNlICdWJzoKKwkgICAgY2FzZSAnVyc6CisJICAgICAgc19yZXNldCA9IHM7CisJICAgICAgaWYgKHNbMF0gPT0gJyQnICYmIHNbMV0gPT0gJ2YnICYmIGlzZGlnaXQgKHNbMl0pKQorCQl7CisJCSAgcyArPSAyOworCQkgIHJlZ25vID0gMDsKKwkJICBkbworCQkgICAgeworCQkgICAgICByZWdubyAqPSAxMDsKKwkJICAgICAgcmVnbm8gKz0gKnMgLSAnMCc7CisJCSAgICAgICsrczsKKwkJICAgIH0KKwkJICB3aGlsZSAoaXNkaWdpdCAoKnMpKTsKKworCQkgIGlmIChyZWdubyA+IDMxKQorCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIGZsb2F0IHJlZ2lzdGVyIG51bWJlciAoJWQpIiksIHJlZ25vKTsKKworCQkgIGlmICgocmVnbm8gJiAxKSAhPSAwCisJCSAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCAzCisJCSAgICAgICYmICEgKHN0cmNtcCAoc3RyLCAibXRjMSIpID09IDAKKwkJCSAgICB8fCBzdHJjbXAgKHN0ciwgIm1mYzEiKSA9PSAwCisJCQkgICAgfHwgc3RyY21wIChzdHIsICJsd2MxIikgPT0gMAorCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAic3djMSIpID09IDAKKwkJCSAgICB8fCBzdHJjbXAgKHN0ciwgImwucyIpID09IDAKKwkJCSAgICB8fCBzdHJjbXAgKHN0ciwgInMucyIpID09IDApKQorCQkgICAgYXNfd2FybiAoXygiRmxvYXQgcmVnaXN0ZXIgc2hvdWxkIGJlIGV2ZW4sIHdhcyAlZCIpLAorCQkJICAgICByZWdubyk7CisKKwkJICBjID0gKmFyZ3M7CisJCSAgaWYgKCpzID09ICcgJykKKwkJICAgIHMrKzsKKwkJICBpZiAoYXJnc1sxXSAhPSAqcykKKwkJICAgIHsKKwkJICAgICAgaWYgKGMgPT0gJ1YnIHx8IGMgPT0gJ1cnKQorCQkJeworCQkJICByZWdubyA9IGxhc3RyZWdubzsKKwkJCSAgcyA9IHNfcmVzZXQ7CisJCQkgIGFyZ3MrKzsKKwkJCX0KKwkJICAgIH0KKwkJICBzd2l0Y2ggKGMpCisJCSAgICB7CisJCSAgICBjYXNlICdEJzoKKwkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDY7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnVic6CisJCSAgICBjYXNlICdTJzoKKwkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDExOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ1cnOgorCQkgICAgY2FzZSAnVCc6CisJCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxNjsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdSJzoKKwkJICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IDIxOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBsYXN0cmVnbm8gPSByZWdubzsKKwkJICBjb250aW51ZTsKKwkJfQorCisKKwkgICAgICBzd2l0Y2ggKCphcmdzKyspCisJCXsKKwkJY2FzZSAnVic6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxMTsKKwkJICBjb250aW51ZTsKKwkJY2FzZSAnVyc6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0knOgorCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19iaWcKKwkJICAmJiBpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ0EnOgorCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7CisJICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DXzMyOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdGJzoKKwkgICAgY2FzZSAnTCc6CisJICAgIGNhc2UgJ2YnOgorCSAgICBjYXNlICdsJzoKKwkgICAgICB7CisJCWludCBmNjQ7CisJCWNoYXIgKnNhdmVfaW47CisJCWNoYXIgKmVycjsKKwkJdW5zaWduZWQgY2hhciB0ZW1wWzhdOworCQlpbnQgbGVuOworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCQlzZWdUIHNlZzsKKwkJc3Vic2VnVCBzdWJzZWc7CisJCWNoYXIgKnA7CisKKwkJLyogVGhlc2Ugb25seSBhcHBlYXIgYXMgdGhlIGxhc3Qgb3BlcmFuZCBpbiBhbgorCQkgICBpbnN0cnVjdGlvbiwgYW5kIGV2ZXJ5IGluc3RydWN0aW9uIHRoYXQgYWNjZXB0cworCQkgICB0aGVtIGluIGFueSB2YXJpYW50IGFjY2VwdHMgdGhlbSBpbiBhbGwgdmFyaWFudHMuCisJCSAgIFRoaXMgbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBiYWNraW5nIG91dAorCQkgICBhbnkgY2hhbmdlcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2guCisKKwkJICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIHRoZSBzaXplIG9mIHRoZQorCQkgICBmbG9hdGluZyBwb2ludCBjb25zdGFudCBhbmQgd2hlcmUgaXQgZ29lcy4gIEZvciAnRicKKwkJICAgYW5kICdMJyB0aGUgY29uc3RhbnQgaXMgNjQgYml0czsgZm9yICdmJyBhbmQgJ2wnIGl0CisJCSAgIGlzIDMyIGJpdHMuICBXaGVyZSB0aGUgY29uc3RhbnQgaXMgcGxhY2VkIGlzIGJhc2VkCisJCSAgIG9uIGhvdyB0aGUgTUlQUyBhc3NlbWJsZXIgZG9lcyB0aGluZ3M6CisJCSAgICBGIC0tIC5yZGF0YQorCQkgICAgTCAtLSAubGl0OAorCQkgICAgZiAtLSBpbW1lZGlhdGUgdmFsdWUKKwkJICAgIGwgLS0gLmxpdDQKKworCQkgICAgVGhlIC5saXQ0IGFuZCAubGl0OCBzZWN0aW9ucyBhcmUgb25seSB1c2VkIGlmCisJCSAgICBwZXJtaXR0ZWQgYnkgdGhlIC1HIGFyZ3VtZW50LgorCisJCSAgICBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIHVzZSB0aGUKKwkJICAgIC5saXQ4IHNlY3Rpb24gYnV0IG5vdCB0aGUgLmxpdDQgc2VjdGlvbiAod2UgY2FuIGRvCisJCSAgICAubGl0NCBpbmxpbmUgZWFzaWx5OyB3ZSBuZWVkIHRvIHB1dCAubGl0OAorCQkgICAgc29tZXdoZXJlIGluIHRoZSBkYXRhIHNlZ21lbnQsIGFuZCB1c2luZyAubGl0OAorCQkgICAgcGVybWl0cyB0aGUgbGlua2VyIHRvIGV2ZW50dWFsbHkgY29tYmluZSBpZGVudGljYWwKKwkJICAgIC5saXQ4IGVudHJpZXMpLiAgKi8KKworCQlmNjQgPSAqYXJncyA9PSAnRicgfHwgKmFyZ3MgPT0gJ0wnOworCisJCXNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJCWlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisJCWVyciA9IG1kX2F0b2YgKGY2NCA/ICdkJyA6ICdmJywgKGNoYXIgKikgdGVtcCwgJmxlbik7CisJCWxlbmd0aCA9IGxlbjsKKwkJcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkJaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKwkJaWYgKGVyciAhPSBOVUxMICYmICplcnIgIT0gJ1wwJykKKwkJICB7CisJCSAgICBhc19iYWQgKF8oIkJhZCBmbG9hdGluZyBwb2ludCBjb25zdGFudDogJXMiKSwgZXJyKTsKKwkJICAgIG1lbXNldCAodGVtcCwgJ1wwJywgc2l6ZW9mIHRlbXApOworCQkgICAgbGVuZ3RoID0gZjY0ID8gOCA6IDQ7CisJCSAgfQorCisJCWFzc2VydCAobGVuZ3RoID09IChmNjQgPyA4IDogNCkpOworCisJCWlmICgqYXJncyA9PSAnZicKKwkJICAgIHx8ICgqYXJncyA9PSAnbCcKKwkJCSYmICghIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQKKwkJCSAgICB8fCBtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKKwkJCSAgICB8fCBnX3N3aXRjaF92YWx1ZSA8IDQKKwkJCSAgICB8fCAodGVtcFswXSA9PSAwICYmIHRlbXBbMV0gPT0gMCkKKwkJCSAgICB8fCAodGVtcFsyXSA9PSAwICYmIHRlbXBbM10gPT0gMCkpKSkKKwkJICB7CisJCSAgICBpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKKwkJICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCQkgICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDMyICh0ZW1wKTsKKwkJICAgIGVsc2UKKwkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCk7CisJCSAgfQorCQllbHNlIGlmIChsZW5ndGggPiA0CisJCQkgJiYgKCh0ZW1wWzBdID09IDAgJiYgdGVtcFsxXSA9PSAwKQorCQkJICAgICB8fCAodGVtcFsyXSA9PSAwICYmIHRlbXBbM10gPT0gMCkpCisJCQkgJiYgKCh0ZW1wWzRdID09IDAgJiYgdGVtcFs1XSA9PSAwKQorCQkJICAgICB8fCAodGVtcFs2XSA9PSAwICYmIHRlbXBbN10gPT0gMCkpKQorCQkgIHsKKwkJICAgIC8qIFRoZSB2YWx1ZSBpcyBzaW1wbGUgZW5vdWdoIHRvIGxvYWQgd2l0aCBhCisgICAgICAgICAgICAgICAgICAgICAgIGNvdXBsZSBvZiBpbnN0cnVjdGlvbnMuICBJbiBtaXBzMSBtb2RlLCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgaW1tX2V4cHIgdG8gdGhlIGhpZ2ggb3JkZXIgMzIgYml0cyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2V4cHIgdG8gdGhlIGxvdyBvcmRlciAzMiBiaXRzLgorICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHNldCBpbW1fZXhwciB0byB0aGUgZW50aXJlIDY0IGJpdAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudC4gICovCisJCSAgICBpZiAobWlwc19vcHRzLmlzYSA8IDMpCisJCSAgICAgIHsKKwkJCWltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OworCQkJb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7CisJCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwkJCSAgeworCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsMzIgKHRlbXAgKyA0KTsKKwkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDMyICh0ZW1wKTsKKwkJCSAgfQorCQkJZWxzZQorCQkJICB7CisJCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCk7CisJCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGIzMiAodGVtcCArIDQpOworCQkJICB9CisJCQlpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApCisJCQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2Fic2VudDsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAoc2l6ZW9mIChpbW1fZXhwci5YX2FkZF9udW1iZXIpID4gNCkKKwkJICAgICAgeworCQkJaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7CisJCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwkJCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGw2NCAodGVtcCk7CisJCQllbHNlCisJCQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiNjQgKHRlbXApOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCWltbV9leHByLlhfb3AgPSBPX2JpZzsKKwkJCWltbV9leHByLlhfYWRkX251bWJlciA9IDQ7CisJCQlpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKKwkJCSAgeworCQkJICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gYmZkX2dldGwxNiAodGVtcCk7CisJCQkgICAgZ2VuZXJpY19iaWdudW1bMV0gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgMik7CisJCQkgICAgZ2VuZXJpY19iaWdudW1bMl0gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgNCk7CisJCQkgICAgZ2VuZXJpY19iaWdudW1bM10gPSBiZmRfZ2V0bDE2ICh0ZW1wICsgNik7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gYmZkX2dldGIxNiAodGVtcCArIDYpOworCQkJICAgIGdlbmVyaWNfYmlnbnVtWzFdID0gYmZkX2dldGIxNiAodGVtcCArIDQpOworCQkJICAgIGdlbmVyaWNfYmlnbnVtWzJdID0gYmZkX2dldGIxNiAodGVtcCArIDIpOworCQkJICAgIGdlbmVyaWNfYmlnbnVtWzNdID0gYmZkX2dldGIxNiAodGVtcCk7CisJCQkgIH0KKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IGNoYXIgKm5ld25hbWU7CisJCSAgICBzZWdUIG5ld19zZWc7CisKKwkJICAgIC8qIFN3aXRjaCB0byB0aGUgcmlnaHQgc2VjdGlvbi4gICovCisJCSAgICBzZWcgPSBub3dfc2VnOworCQkgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKKwkJICAgIHN3aXRjaCAoKmFyZ3MpCisJCSAgICAgIHsKKwkJICAgICAgZGVmYXVsdDogLyogdW51c2VkIGRlZmF1bHQgY2FzZSBhdm9pZHMgd2FybmluZ3MuICAqLworCQkgICAgICBjYXNlICdMJzoKKwkJCW5ld25hbWUgPSBSREFUQV9TRUNUSU9OX05BTUU7CisJCQlpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF92YWx1ZSA+PSA4KQorCQkJICBuZXduYW1lID0gIi5saXQ4IjsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlICdGJzoKKwkJCW5ld25hbWUgPSBSREFUQV9TRUNUSU9OX05BTUU7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSAnbCc6CisJCQlhc3NlcnQgKCFVU0VfR0xPQkFMX1BPSU5URVJfT1BUCisJCQkJfHwgZ19zd2l0Y2hfdmFsdWUgPj0gNCk7CisJCQluZXduYW1lID0gIi5saXQ0IjsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgICBuZXdfc2VnID0gc3Vic2VnX25ldyAobmV3bmFtZSwgKHN1YnNlZ1QpIDApOworCQkgICAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKwkJICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWcsCisJCQkJCSAgICAgKFNFQ19BTExPQworCQkJCQkgICAgICB8IFNFQ19MT0FECisJCQkJCSAgICAgIHwgU0VDX1JFQURPTkxZCisJCQkJCSAgICAgIHwgU0VDX0RBVEEpKTsKKwkJICAgIGZyYWdfYWxpZ24gKCphcmdzID09ICdsJyA/IDIgOiAzLCAwLCAwKTsKKwkJICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKwkJCSYmIHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKKwkJICAgICAgcmVjb3JkX2FsaWdubWVudCAobmV3X3NlZywgNCk7CisJCSAgICBlbHNlCisJCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5ld19zZWcsICphcmdzID09ICdsJyA/IDIgOiAzKTsKKwkJICAgIGlmIChzZWcgPT0gbm93X3NlZykKKwkJICAgICAgYXNfYmFkIChfKCJDYW4ndCB1c2UgZmxvYXRpbmcgcG9pbnQgaW5zbiBpbiB0aGlzIHNlY3Rpb24iKSk7CisKKwkJICAgIC8qIFNldCB0aGUgYXJndW1lbnQgdG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBpbiB0aGUKKwkJICAgICAgIHNlY3Rpb24uICAqLworCQkgICAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fc3ltYm9sOworCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sID0KKwkJICAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCisJCQkJICAodmFsdWVUKSBmcmFnX25vd19maXggKCksIGZyYWdfbm93KTsKKwkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7CisKKwkJICAgIC8qIFB1dCB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludG8gdGhlIHNlY3Rpb24uICAqLworCQkgICAgcCA9IGZyYWdfbW9yZSAoKGludCkgbGVuZ3RoKTsKKwkJICAgIG1lbWNweSAocCwgdGVtcCwgbGVuZ3RoKTsKKworCQkgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNlY3Rpb24uICAqLworCQkgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOworCQkgIH0KKwkgICAgICB9CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnaSc6CQkvKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCisJICAgIGNhc2UgJ2onOgkJLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KKwkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKKwkgICAgICBjID0gbXlfZ2V0U21hbGxFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOworCSAgICAgIGlmIChjICE9ICdcMCcpCisJCXsKKwkJICBpZiAoYyAhPSAnbCcpCisJCSAgICB7CisJCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCisJCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPQorCQkJICAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKKwkJICAgICAgZWxzZSBpZiAoYyA9PSAnaCcpCisJCQl7CisJCQkgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2X1M7CisJCQkgIGltbV91bm1hdGNoZWRfaGkgPSB0cnVlOworCQkJfQorCQkgICAgICBlbHNlCisJCQlpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNjsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCisJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOworCQl9CisJICAgICAgaWYgKCphcmdzID09ICdpJykKKwkJeworCQkgIGlmICgoYyA9PSAnXDAnICYmIGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKKwkJICAgICAgfHwgKChpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMHgxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KSkKKwkJICAgIHsKKwkJICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgorCQkJICAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQorCQkJYnJlYWs7CisJCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKKwkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKKwkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7CisJCSAgICAgIGVsc2UKKwkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IikpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaW50IG1vcmU7CisJCSAgb2Zmc2V0VCBtYXg7CisKKwkJICAvKiBUaGUgdXBwZXIgYm91bmQgc2hvdWxkIGJlIDB4ODAwMCwgYnV0CisJCSAgICAgdW5mb3J0dW5hdGVseSB0aGUgTUlQUyBhc3NlbWJsZXIgYWNjZXB0cyBudW1iZXJzCisJCSAgICAgZnJvbSAweDgwMDAgdG8gMHhmZmZmIGFuZCBzaWduIGV4dGVuZHMgdGhlbSwgYW5kCisJCSAgICAgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlLiAgV2Ugb25seSBwZXJtaXQgdGhpcworCQkgICAgIGV4dGVuZGVkIHJhbmdlIGZvciBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdAorCQkgICAgIHByb3ZpZGUgYW55IGZ1cnRoZXIgYWx0ZXJuYXRlcywgc2luY2UgdGhvc2UKKwkJICAgICBhbHRlcm5hdGVzIG1heSBoYW5kbGUgb3RoZXIgY2FzZXMuICBQZW9wbGUgc2hvdWxkCisJCSAgICAgdXNlIHRoZSBudW1iZXJzIHRoZXkgbWVhbiwgcmF0aGVyIHRoYW4gcmVseWluZyBvbgorCQkgICAgIGEgbXlzdGVyaW91cyBzaWduIGV4dGVuc2lvbi4gICovCisJCSAgbW9yZSA9IChpbnNuICsgMSA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU10gJiYKKwkJCSAgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApOworCQkgIGlmIChtb3JlKQorCQkgICAgbWF4ID0gMHg4MDAwOworCQkgIGVsc2UKKwkJICAgIG1heCA9IDB4MTAwMDA7CisJCSAgaWYgKChjID09ICdcMCcgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQorCQkgICAgICB8fCAoKGltbV9leHByLlhfYWRkX251bWJlciA8IC0weDgwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSBtYXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKKwkJICAgICAgfHwgKG1vcmUKKwkJCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMAorCQkJICAmJiBtaXBzX29wdHMuaXNhID49IDMKKwkJCSAgJiYgaW1tX2V4cHIuWF91bnNpZ25lZAorCQkJICAmJiBzaXplb2YgKGltbV9leHByLlhfYWRkX251bWJlcikgPD0gNCkpCisJCSAgICB7CisJCSAgICAgIGlmIChtb3JlKQorCQkJYnJlYWs7CisJCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQKKwkJCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2JpZykKKwkJCWluc25fZXJyb3IgPSBfKCJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIik7CisJCSAgICAgIGVsc2UKKwkJCWFzX2JhZCAoXygiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIC0zMjc2OC4uMzI3NjciKSk7CisJCSAgICB9CisJCX0KKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnbyc6CQkvKiAxNiBiaXQgb2Zmc2V0ICovCisJICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKKworCSAgICAgIC8qIElmIHRoaXMgdmFsdWUgd29uJ3QgZml0IGludG8gYSAxNiBiaXQgb2Zmc2V0LCB0aGVuIGdvCisJCSBmaW5kIGEgbWFjcm8gdGhhdCB3aWxsIGdlbmVyYXRlIHRoZSAzMiBiaXQgb2Zmc2V0CisJCSBjb2RlIHBhdHRlcm4uICBBcyBhIHNwZWNpYWwgaGFjaywgd2UgYWNjZXB0IHRoZQorCQkgZGlmZmVyZW5jZSBvZiB0d28gbG9jYWwgc3ltYm9scyBhcyBhIGNvbnN0YW50LiAgVGhpcworCQkgaXMgcmVxdWlyZWQgdG8gc3VwcG9zZSBlbWJlZGRlZCBQSUMgc3dpdGNoZXMsIHdoaWNoCisJCSB1c2UgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggbG9va3MgbGlrZQorCQkgICAgIGx3ICQ0LCRMMTItJExTMTIoJDQpCisJCSBUaGUgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIHRoaXMgaW4gYSBtb3JlIGdlbmVyYWwKKwkJIGZhc2hpb24gaXMgdGhhdCB0aGUgbWFjcm8gZnVuY3Rpb24gZG9lc24ndCBleHBlY3QgdG8KKwkJIHNlZSBhbnl0aGluZyB3aGljaCBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbmdsZQorCQkgY29uc3RhbnQgaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGlmIChjID09IDAKKwkJICAmJiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50CisJCSAgICAgIHx8IG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDgwMDAKKwkJICAgICAgfHwgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCkKKwkJICAmJiAobWlwc19waWMgIT0gRU1CRURERURfUElDCisJCSAgICAgIHx8IG9mZnNldF9leHByLlhfb3AgIT0gT19zdWJ0cmFjdAorCQkgICAgICB8fCBub3dfc2VnICE9IHRleHRfc2VjdGlvbgorCQkgICAgICB8fCAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpCisJCQkgICE9IHRleHRfc2VjdGlvbikpKQorCQlicmVhazsKKworCSAgICAgIGlmIChjID09ICdoJyB8fCBjID09ICdIJykKKwkJeworCQkgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCisJCSAgICBicmVhazsKKwkJICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPQorCQkgICAgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7CisJCX0KKwkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAncCc6CQkvKiBwYyByZWxhdGl2ZSBvZmZzZXQgKi8KKwkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfMTZfUENSRUxfUzI7CisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAndSc6CQkvKiB1cHBlciAxNiBiaXRzICovCisJICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTE8xNjsKKwkgICAgICBpZiAoYykKKwkJeworCQkgIGlmIChjICE9ICdsJykKKwkJICAgIHsKKwkJICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKKwkJCWltbV9leHByLlhfYWRkX251bWJlciA9CisJCQkgIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOworCQkgICAgICBlbHNlIGlmIChjID09ICdoJykKKwkJCXsKKwkJCSAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTZfUzsKKwkJCSAgaW1tX3VubWF0Y2hlZF9oaSA9IHRydWU7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCWltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2OworCQkgICAgfQorCQkgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKKwkJICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweGZmZmY7CisJCX0KKwkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJCSAgJiYgKGltbV9leHByLlhfYWRkX251bWJlciA8IDAKKwkJICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDB4MTAwMDApKQorCQlhc19iYWQgKF8oImx1aSBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIpKTsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnYSc6CQkvKiAyNiBiaXQgYWRkcmVzcyAqLworCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdOJzoJCS8qIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAqLworCSAgICBjYXNlICdNJzoJCS8qIDMgYml0IGNvbXBhcmUgY29uZGl0aW9uIGNvZGUgKi8KKwkgICAgICBpZiAoc3RybmNtcCAocywgIiRmY2MiLCA0KSAhPSAwKQorCQlicmVhazsKKwkgICAgICBzICs9IDQ7CisJICAgICAgcmVnbm8gPSAwOworCSAgICAgIGRvCisJCXsKKwkJICByZWdubyAqPSAxMDsKKwkJICByZWdubyArPSAqcyAtICcwJzsKKwkJICArK3M7CisJCX0KKwkgICAgICB3aGlsZSAoaXNkaWdpdCAoKnMpKTsKKwkgICAgICBpZiAocmVnbm8gPiA3KQorCQlhc19iYWQgKF8oImludmFsaWQgY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIgJGZjYyVkIiksIHJlZ25vKTsKKwkgICAgICBpZiAoKmFyZ3MgPT0gJ04nKQorCQlpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgT1BfU0hfQkNDOworCSAgICAgIGVsc2UKKwkJaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE9QX1NIX0NDQzsKKyAgICAgICAgICAgICAgY29udGludWU7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhc19iYWQgKF8oImJhZCBjaGFyID0gJyVjJ1xuIiksICphcmdzKTsKKwkgICAgICBpbnRlcm5hbEVycm9yICgpOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgICAvKiBBcmdzIGRvbid0IG1hdGNoLiAgKi8KKyAgICAgIGlmIChpbnNuICsgMSA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU10gJiYKKwkgICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCisJeworCSAgKytpbnNuOworCSAgcyA9IGFyZ3NTdGFydDsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGluc25fZXJyb3IgPSBfKCJpbGxlZ2FsIG9wZXJhbmRzIik7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBUaGlzIHJvdXRpbmUgYXNzZW1ibGVzIGFuIGluc3RydWN0aW9uIGludG8gaXRzIGJpbmFyeSBmb3JtYXQgd2hlbgorICAgYXNzZW1ibGluZyBmb3IgdGhlIG1pcHMxNi4gIEFzIGEgc2lkZSBlZmZlY3QsIGl0IHNldHMgb25lIG9mIHRoZQorICAgZ2xvYmFsIHZhcmlhYmxlcyBpbW1fcmVsb2Mgb3Igb2Zmc2V0X3JlbG9jIHRvIHRoZSB0eXBlIG9mCisgICByZWxvY2F0aW9uIHRvIGRvIGlmIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgYW4gYWRkcmVzcyBleHByZXNzaW9uLgorICAgSXQgYWxzbyBzZXRzIG1pcHMxNl9zbWFsbCBhbmQgbWlwczE2X2V4dCBpZiB0aGUgdXNlciBleHBsaWNpdGx5CisgICByZXF1ZXN0ZWQgYSBzbWFsbCBvciBleHRlbmRlZCBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCittaXBzMTZfaXAgKHN0ciwgaXApCisgICAgIGNoYXIgKnN0cjsKKyAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Cit7CisgIGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmFyZ3M7CisgIHN0cnVjdCBtaXBzX29wY29kZSAqaW5zbjsKKyAgY2hhciAqYXJnc3N0YXJ0OworICB1bnNpZ25lZCBpbnQgcmVnbm87CisgIHVuc2lnbmVkIGludCBsYXN0cmVnbm8gPSAwOworICBjaGFyICpzX3Jlc2V0OworCisgIGluc25fZXJyb3IgPSBOVUxMOworCisgIG1pcHMxNl9zbWFsbCA9IGZhbHNlOworICBtaXBzMTZfZXh0ID0gZmFsc2U7CisKKyAgZm9yIChzID0gc3RyOyBpc2xvd2VyICgqcyk7ICsrcykKKyAgICA7CisgIHN3aXRjaCAoKnMpCisgICAgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnICc6CisgICAgICAqcysrID0gJ1wwJzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLic6CisgICAgICBpZiAoc1sxXSA9PSAndCcgJiYgc1syXSA9PSAnICcpCisJeworCSAgKnMgPSAnXDAnOworCSAgbWlwczE2X3NtYWxsID0gdHJ1ZTsKKwkgIHMgKz0gMzsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2UnICYmIHNbMl0gPT0gJyAnKQorCXsKKwkgICpzID0gJ1wwJzsKKwkgIG1pcHMxNl9leHQgPSB0cnVlOworCSAgcyArPSAzOworCSAgYnJlYWs7CisJfQorICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBkZWZhdWx0OgorICAgICAgaW5zbl9lcnJvciA9IF8oInVua25vd24gb3Bjb2RlIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtaXBzX29wdHMubm9hdXRvZXh0ZW5kICYmICEgbWlwczE2X2V4dCkKKyAgICBtaXBzMTZfc21hbGwgPSB0cnVlOworCisgIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChtaXBzMTZfb3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbnNuX2Vycm9yID0gXygidW5yZWNvZ25pemVkIG9wY29kZSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhcmdzc3RhcnQgPSBzOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOworCisgICAgICBpcC0+aW5zbl9tbyA9IGluc247CisgICAgICBpcC0+aW5zbl9vcGNvZGUgPSBpbnNuLT5tYXRjaDsKKyAgICAgIGlwLT51c2VfZXh0ZW5kID0gZmFsc2U7CisgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7CisgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOworICAgICAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OworICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKKyAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7IDE7ICsrYXJncykKKwl7CisJICBpbnQgYzsKKworCSAgaWYgKCpzID09ICcgJykKKwkgICAgKytzOworCisJICAvKiBJbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQgd2UgY2FsbCBicmVhayBpZiB3ZSBkaWQgbm90IGZpbmQKKyAgICAgICAgICAgICBhIG1hdGNoLCBjb250aW51ZSBpZiB3ZSBkaWQgZmluZCBhIG1hdGNoLCBvciByZXR1cm4gaWYgd2UKKyAgICAgICAgICAgICBhcmUgZG9uZS4gICovCisKKwkgIGMgPSAqYXJnczsKKwkgIHN3aXRjaCAoYykKKwkgICAgeworCSAgICBjYXNlICdcMCc6CisJICAgICAgaWYgKCpzID09ICdcMCcpCisJCXsKKwkJICAvKiBTdHVmZiB0aGUgaW1tZWRpYXRlIHZhbHVlIGluIG5vdywgaWYgd2UgY2FuLiAgKi8KKwkJICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50CisJCSAgICAgICYmIGltbV9yZWxvYyA+IEJGRF9SRUxPQ19VTlVTRUQKKwkJICAgICAgJiYgaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKKwkJICAgIHsKKwkJICAgICAgbWlwczE2X2ltbWVkICgoY2hhciAqKSBOVUxMLCAwLAorCQkJCSAgICBpbW1fcmVsb2MgLSBCRkRfUkVMT0NfVU5VU0VELAorCQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIsIHRydWUsIG1pcHMxNl9zbWFsbCwKKwkJCQkgICAgbWlwczE2X2V4dCwgJmlwLT5pbnNuX29wY29kZSwKKwkJCQkgICAgJmlwLT51c2VfZXh0ZW5kLCAmaXAtPmV4dGVuZCk7CisJCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKwkJICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKKwkJICAgIH0KKworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJywnOgorCSAgICAgIGlmICgqcysrID09IGMpCisJCWNvbnRpbnVlOworCSAgICAgIHMtLTsKKwkgICAgICBzd2l0Y2ggKCorK2FyZ3MpCisJCXsKKwkJY2FzZSAndic6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKKwkJICBjb250aW51ZTsKKwkJY2FzZSAndyc6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJygnOgorCSAgICBjYXNlICcpJzoKKwkgICAgICBpZiAoKnMrKyA9PSBjKQorCQljb250aW51ZTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICd2JzoKKwkgICAgY2FzZSAndyc6CisJICAgICAgaWYgKHNbMF0gIT0gJyQnKQorCQl7CisJCSAgaWYgKGMgPT0gJ3YnKQorCQkgICAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKKwkJICBlbHNlCisJCSAgICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOworCQkgICsrYXJnczsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJICAgIGNhc2UgJ3gnOgorCSAgICBjYXNlICd5JzoKKwkgICAgY2FzZSAneic6CisJICAgIGNhc2UgJ1onOgorCSAgICBjYXNlICcwJzoKKwkgICAgY2FzZSAnUyc6CisJICAgIGNhc2UgJ1InOgorCSAgICBjYXNlICdYJzoKKwkgICAgY2FzZSAnWSc6CisJICAgICAgaWYgKHNbMF0gIT0gJyQnKQorCQlicmVhazsKKwkgICAgICBzX3Jlc2V0ID0gczsKKwkgICAgICBpZiAoaXNkaWdpdCAoc1sxXSkpCisJCXsKKwkJICArK3M7CisJCSAgcmVnbm8gPSAwOworCQkgIGRvCisJCSAgICB7CisJCSAgICAgIHJlZ25vICo9IDEwOworCQkgICAgICByZWdubyArPSAqcyAtICcwJzsKKwkJICAgICAgKytzOworCQkgICAgfQorCQkgIHdoaWxlIChpc2RpZ2l0ICgqcykpOworCQkgIGlmIChyZWdubyA+IDMxKQorCQkgICAgeworCQkgICAgICBhc19iYWQgKF8oImludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICglZCkiKSwgcmVnbm8pOworCQkgICAgICByZWdubyA9IDI7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoc1sxXSA9PSAnZicgJiYgc1syXSA9PSAncCcpCisJCSAgICB7CisJCSAgICAgIHMgKz0gMzsKKwkJICAgICAgcmVnbm8gPSBGUDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzWzFdID09ICdzJyAmJiBzWzJdID09ICdwJykKKwkJICAgIHsKKwkJICAgICAgcyArPSAzOworCQkgICAgICByZWdubyA9IFNQOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2cnICYmIHNbMl0gPT0gJ3AnKQorCQkgICAgeworCQkgICAgICBzICs9IDM7CisJCSAgICAgIHJlZ25vID0gR1A7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc1sxXSA9PSAnYScgJiYgc1syXSA9PSAndCcpCisJCSAgICB7CisJCSAgICAgIHMgKz0gMzsKKwkJICAgICAgcmVnbm8gPSBBVDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzWzFdID09ICdrJyAmJiBzWzJdID09ICd0JyAmJiBzWzNdID09ICcwJykKKwkJICAgIHsKKwkJICAgICAgcyArPSA0OworCQkgICAgICByZWdubyA9IEtUMDsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzWzFdID09ICdrJyAmJiBzWzJdID09ICd0JyAmJiBzWzNdID09ICcxJykKKwkJICAgIHsKKwkJICAgICAgcyArPSA0OworCQkgICAgICByZWdubyA9IEtUMTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgaWYgKCpzID09ICcgJykKKwkJKytzOworCSAgICAgIGlmIChhcmdzWzFdICE9ICpzKQorCQl7CisJCSAgaWYgKGMgPT0gJ3YnIHx8IGMgPT0gJ3cnKQorCQkgICAgeworCQkgICAgICByZWdubyA9IG1pcHMxNl90b18zMl9yZWdfbWFwW2xhc3RyZWdub107CisJCSAgICAgIHMgPSBzX3Jlc2V0OworCQkgICAgICBhcmdzKys7CisJCSAgICB9CisJCX0KKworCSAgICAgIHN3aXRjaCAoYykKKwkJeworCQljYXNlICd4JzoKKwkJY2FzZSAneSc6CisJCWNhc2UgJ3onOgorCQljYXNlICd2JzoKKwkJY2FzZSAndyc6CisJCWNhc2UgJ1onOgorCQkgIHJlZ25vID0gbWlwczMyX3RvXzE2X3JlZ19tYXBbcmVnbm9dOworCQkgIGJyZWFrOworCisJCWNhc2UgJzAnOgorCQkgIGlmIChyZWdubyAhPSAwKQorCQkgICAgcmVnbm8gPSBJTExFR0FMX1JFRzsKKwkJICBicmVhazsKKworCQljYXNlICdTJzoKKwkJICBpZiAocmVnbm8gIT0gU1ApCisJCSAgICByZWdubyA9IElMTEVHQUxfUkVHOworCQkgIGJyZWFrOworCisJCWNhc2UgJ1InOgorCQkgIGlmIChyZWdubyAhPSBSQSkKKwkJICAgIHJlZ25vID0gSUxMRUdBTF9SRUc7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCWNhc2UgJ1knOgorCQkgIGlmIChyZWdubyA9PSBBVCAmJiAhIG1pcHNfb3B0cy5ub2F0KQorCQkgICAgYXNfd2FybiAoXygidXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIikpOworCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgaW50ZXJuYWxFcnJvciAoKTsKKwkJfQorCisJICAgICAgaWYgKHJlZ25vID09IElMTEVHQUxfUkVHKQorCQlicmVhazsKKworCSAgICAgIHN3aXRjaCAoYykKKwkJeworCQljYXNlICd4JzoKKwkJY2FzZSAndic6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JYOworCQkgIGJyZWFrOworCQljYXNlICd5JzoKKwkJY2FzZSAndyc6CisJCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOworCQkgIGJyZWFrOworCQljYXNlICd6JzoKKwkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlo7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1onOgorCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9NT1ZFMzJaOworCQljYXNlICcwJzoKKwkJY2FzZSAnUyc6CisJCWNhc2UgJ1InOgorCQkgIGJyZWFrOworCQljYXNlICdYJzoKKwkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUkVHUjMyOworCQkgIGJyZWFrOworCQljYXNlICdZJzoKKwkJICByZWdubyA9ICgocmVnbm8gJiA3KSA8PCAyKSB8ICgocmVnbm8gJiAweDE4KSA+PiAzKTsKKwkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUkVHMzJSOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIGludGVybmFsRXJyb3IgKCk7CisJCX0KKworCSAgICAgIGxhc3RyZWdubyA9IHJlZ25vOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ1AnOgorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJHBjIiwgMykgPT0gMCkKKwkJeworCQkgIHMgKz0gMzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzwnOgorCSAgICBjYXNlICc+JzoKKwkgICAgY2FzZSAnWyc6CisJICAgIGNhc2UgJ10nOgorCSAgICBjYXNlICc0JzoKKwkgICAgY2FzZSAnNSc6CisJICAgIGNhc2UgJ0gnOgorCSAgICBjYXNlICdXJzoKKwkgICAgY2FzZSAnRCc6CisJICAgIGNhc2UgJ2onOgorCSAgICBjYXNlICc4JzoKKwkgICAgY2FzZSAnVic6CisJICAgIGNhc2UgJ0MnOgorCSAgICBjYXNlICdVJzoKKwkgICAgY2FzZSAnayc6CisJICAgIGNhc2UgJ0snOgorCSAgICAgIGlmIChzWzBdID09ICclJworCQkgICYmIHN0cm5jbXAgKHMgKyAxLCAiZ3ByZWwoIiwgc2l6ZW9mICJncHJlbCgiIC0gMSkgPT0gMCkKKwkJeworCQkgIC8qIFRoaXMgaXMgJWdwcmVsKFNZTUJPTCkuICBXZSBuZWVkIHRvIHJlYWQgU1lNQk9MLAorICAgICAgICAgICAgICAgICAgICAgYW5kIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSByZWxvYy4gIElmIHRoZSB0ZXh0CisgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgJWdwcmVsIGlzIG5vdCBhIHN5bWJvbCBuYW1lIHdpdGggYW4KKyAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIG9mZnNldCwgdGhlbiB3ZSBnZW5lcmF0ZSBhIG5vcm1hbCByZWxvYworICAgICAgICAgICAgICAgICAgICAgYW5kIHdpbGwgcHJvYmFibHkgZmFpbCBsYXRlci4gICovCisJCSAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzICsgc2l6ZW9mICIlZ3ByZWwiIC0gMSk7CisJCSAgaWYgKGltbV9leHByLlhfb3AgPT0gT19zeW1ib2wpCisJCSAgICB7CisJCSAgICAgIG1pcHMxNl9leHQgPSB0cnVlOworCQkgICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMOworCQkgICAgICBzID0gZXhwcl9lbmQ7CisJCSAgICAgIGlwLT51c2VfZXh0ZW5kID0gdHJ1ZTsKKwkJICAgICAgaXAtPmV4dGVuZCA9IDA7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogSnVzdCBwaWNrIHVwIGEgbm9ybWFsIGV4cHJlc3Npb24uICAqLworCQkgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJCX0KKworCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fcmVnaXN0ZXIpCisJCXsKKwkJICAvKiBXaGF0IHdlIHRob3VnaHQgd2FzIGFuIGV4cHJlc3Npb24gdHVybmVkIG91dCB0bworICAgICAgICAgICAgICAgICAgICAgYmUgYSByZWdpc3Rlci4gICovCisKKwkJICBpZiAoc1swXSA9PSAnKCcgJiYgYXJnc1sxXSA9PSAnKCcpCisJCSAgICB7CisJCSAgICAgIC8qIEl0IGxvb2tzIGxpa2UgdGhlIGV4cHJlc3Npb24gd2FzIG9taXR0ZWQKKwkJCSBiZWZvcmUgYSByZWdpc3RlciBpbmRpcmVjdGlvbiwgd2hpY2ggbWVhbnMKKwkJCSB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGltcGxpY2l0bHkgemVyby4gIFdlCisJCQkgc3RpbGwgc2V0IHVwIGltbV9leHByLCBzbyB0aGF0IHdlIGhhbmRsZQorCQkJIGV4cGxpY2l0IGV4dGVuc2lvbnMgY29ycmVjdGx5LiAgKi8KKwkJICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7CisJCSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IDA7CisJCSAgICAgIGltbV9yZWxvYyA9IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQgKyBjOworCQkgICAgICBjb250aW51ZTsKKwkJICAgIH0KKworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBXZSBuZWVkIHRvIHJlbGF4IHRoaXMgaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGltbV9yZWxvYyA9IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQgKyBjOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdwJzoKKwkgICAgY2FzZSAncSc6CisJICAgIGNhc2UgJ0EnOgorCSAgICBjYXNlICdCJzoKKwkgICAgY2FzZSAnRSc6CisJICAgICAgLyogV2UgdXNlIG9mZnNldF9yZWxvYyByYXRoZXIgdGhhbiBpbW1fcmVsb2MgZm9yIHRoZSBQQworICAgICAgICAgICAgICAgICByZWxhdGl2ZSBvcGVyYW5kcy4gIFRoaXMgbGV0cyBtYWNyb3Mgd2l0aCBib3RoCisgICAgICAgICAgICAgICAgIGltbWVkaWF0ZSBhbmQgYWRkcmVzcyBvcGVyYW5kcyB3b3JrIGNvcnJlY3RseS4gICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJm9mZnNldF9leHByLCBzKTsKKworCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fcmVnaXN0ZXIpCisJCWJyZWFrOworCisJICAgICAgLyogV2UgbmVlZCB0byByZWxheCB0aGlzIGluc3RydWN0aW9uLiAgKi8KKwkgICAgICBvZmZzZXRfcmVsb2MgPSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnNic6CQkvKiBicmVhayBjb2RlICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKKwkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDYzKQorCQl7CisJCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAorCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZjsKKwkJfQorCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgTUlQUzE2T1BfU0hfSU1NNjsKKwkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7CisJICAgICAgcyA9IGV4cHJfZW5kOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ2EnOgkJLyogMjYgYml0IGFkZHJlc3MgKi8KKwkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOworCSAgICAgIHMgPSBleHByX2VuZDsKKwkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfTUlQUzE2X0pNUDsKKwkgICAgICBpcC0+aW5zbl9vcGNvZGUgPDw9IDE2OworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ2wnOgkJLyogcmVnaXN0ZXIgbGlzdCBmb3IgZW50cnkgbWFjcm8gKi8KKwkgICAgY2FzZSAnTCc6CQkvKiByZWdpc3RlciBsaXN0IGZvciBleGl0IG1hY3JvICovCisJICAgICAgeworCQlpbnQgbWFzazsKKworCQlpZiAoYyA9PSAnbCcpCisJCSAgbWFzayA9IDA7CisJCWVsc2UKKwkJICBtYXNrID0gNyA8PCAzOworCQl3aGlsZSAoKnMgIT0gJ1wwJykKKwkJICB7CisJCSAgICBpbnQgZnJlZywgcmVnMSwgcmVnMjsKKworCQkgICAgd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnLCcpCisJCSAgICAgICsrczsKKwkJICAgIGlmICgqcyAhPSAnJCcpCisJCSAgICAgIHsKKwkJCWFzX2JhZCAoXygiY2FuJ3QgcGFyc2UgcmVnaXN0ZXIgbGlzdCIpKTsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgICArK3M7CisJCSAgICBpZiAoKnMgIT0gJ2YnKQorCQkgICAgICBmcmVnID0gMDsKKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJZnJlZyA9IDE7CisJCQkrK3M7CisJCSAgICAgIH0KKwkJICAgIHJlZzEgPSAwOworCQkgICAgd2hpbGUgKGlzZGlnaXQgKCpzKSkKKwkJICAgICAgeworCQkJcmVnMSAqPSAxMDsKKwkJCXJlZzEgKz0gKnMgLSAnMCc7CisJCQkrK3M7CisJCSAgICAgIH0KKwkJICAgIGlmICgqcyA9PSAnICcpCisJCSAgICAgICsrczsKKwkJICAgIGlmICgqcyAhPSAnLScpCisJCSAgICAgIHJlZzIgPSByZWcxOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQkrK3M7CisJCQlpZiAoKnMgIT0gJyQnKQorCQkJICBicmVhazsKKwkJCSsrczsKKwkJCWlmIChmcmVnKQorCQkJICB7CisJCQkgICAgaWYgKCpzID09ICdmJykKKwkJCSAgICAgICsrczsKKwkJCSAgICBlbHNlCisJCQkgICAgICB7CisJCQkJYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiKSk7CisJCQkJYnJlYWs7CisJCQkgICAgICB9CisJCQkgIH0KKwkJCXJlZzIgPSAwOworCQkJd2hpbGUgKGlzZGlnaXQgKCpzKSkKKwkJCSAgeworCQkJICAgIHJlZzIgKj0gMTA7CisJCQkgICAgcmVnMiArPSAqcyAtICcwJzsKKwkJCSAgICArK3M7CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgaWYgKGZyZWcgJiYgcmVnMSA9PSAwICYmIHJlZzIgPT0gMCAmJiBjID09ICdMJykKKwkJICAgICAgeworCQkJbWFzayAmPSB+ICg3IDw8IDMpOworCQkJbWFzayB8PSA1IDw8IDM7CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKGZyZWcgJiYgcmVnMSA9PSAwICYmIHJlZzIgPT0gMSAmJiBjID09ICdMJykKKwkJICAgICAgeworCQkJbWFzayAmPSB+ICg3IDw8IDMpOworCQkJbWFzayB8PSA2IDw8IDM7CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKHJlZzEgPT0gNCAmJiByZWcyID49IDQgJiYgcmVnMiA8PSA3ICYmIGMgIT0gJ0wnKQorCQkgICAgICBtYXNrIHw9IChyZWcyIC0gMykgPDwgMzsKKwkJICAgIGVsc2UgaWYgKHJlZzEgPT0gMTYgJiYgcmVnMiA+PSAxNiAmJiByZWcyIDw9IDE3KQorCQkgICAgICBtYXNrIHw9IChyZWcyIC0gMTUpIDw8IDE7CisJCSAgICBlbHNlIGlmIChyZWcxID09IDMxICYmIHJlZzIgPT0gMzEpCisJCSAgICAgIG1hc2sgfD0gMTsKKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiKSk7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkJLyogVGhlIG1hc2sgaXMgZmlsbGVkIGluIGluIHRoZSBvcGNvZGUgdGFibGUgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgIGJlbmVmaXQgb2YgdGhlIGRpc2Fzc2VtYmxlci4gIFdlIHJlbW92ZSBpdCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICBhcHBseWluZyB0aGUgYWN0dWFsIG1hc2suICAqLworCQlpcC0+aW5zbl9vcGNvZGUgJj0gfiAoKDcgPDwgMykgPDwgTUlQUzE2T1BfU0hfSU1NNik7CisJCWlwLT5pbnNuX29wY29kZSB8PSBtYXNrIDw8IE1JUFMxNk9QX1NIX0lNTTY7CisJICAgICAgfQorCSAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdlJzoJCS8qIGV4dGVuZCBjb2RlICovCisJICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKKwkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKKwkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDB4N2ZmKQorCQl7CisJCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAorCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHg3ZmY7CisJCX0KKwkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyOworCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKKwkgICAgICBzID0gZXhwcl9lbmQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBpbnRlcm5hbEVycm9yICgpOworCSAgICB9CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLworICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHMxNl9vcGNvZGVzW2JmZF9taXBzMTZfbnVtX29wY29kZXNdICYmCisJICBzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkgPT0gMCkKKwl7CisJICArK2luc247CisJICBzID0gYXJnc3N0YXJ0OworCSAgY29udGludWU7CisJfQorCisgICAgICBpbnNuX2Vycm9yID0gXygiaWxsZWdhbCBvcGVyYW5kcyIpOworCisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiB3ZSBrbm93IGFib3V0IGEgbWlwczE2IGltbWVkaWF0ZQorICAgYXJndW1lbnQgdHlwZS4gICovCisKK3N0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZAoreworICAvKiBUaGUgdHlwZSBjb2RlIHVzZWQgaW4gdGhlIGFyZ3VtZW50IHN0cmluZyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KKyAgaW50IHR5cGU7CisgIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc2hvcnQgZm9ybSBvZiB0aGUgb3Bjb2RlLiAgKi8KKyAgaW50IG5iaXRzOworICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGV4dGVuZGVkIGZvcm0gb2YgdGhlIG9wY29kZS4gICovCisgIGludCBleHRiaXRzOworICAvKiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzaG9ydCBmb3JtIGlzIHNoaWZ0ZWQgd2hlbiBpdCBpcyB1c2VkOworICAgICBmb3IgZXhhbXBsZSwgdGhlIHN3IGluc3RydWN0aW9uIGhhcyBhIHNoaWZ0IGNvdW50IG9mIDIuICAqLworICBpbnQgc2hpZnQ7CisgIC8qIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHNob3J0IGZvcm0gaXMgc2hpZnRlZCB3aGVuIGl0IGlzIHN0b3JlZAorICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbiBjb2RlLiAgKi8KKyAgaW50IG9wX3NoaWZ0OworICAvKiBOb24temVybyBpZiB0aGUgc2hvcnQgZm9ybSBpcyB1bnNpZ25lZC4gICovCisgIGludCB1bnNwOworICAvKiBOb24temVybyBpZiB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1bnNpZ25lZC4gICovCisgIGludCBleHR1OworICAvKiBOb24temVybyBpZiB0aGUgdmFsdWUgaXMgUEMgcmVsYXRpdmUuICAqLworICBpbnQgcGNyZWw7Cit9OworCisvKiBUaGUgbWlwczE2IGltbWVkaWF0ZSBvcGVyYW5kIHR5cGVzLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCBtaXBzMTZfaW1tZWRfb3BlcmFuZHNbXSA9Cit7CisgIHsgJzwnLCAgMywgIDUsIDAsIE1JUFMxNk9QX1NIX1JaLCAgIDEsIDEsIDAgfSwKKyAgeyAnPicsICAzLCAgNSwgMCwgTUlQUzE2T1BfU0hfUlgsICAgMSwgMSwgMCB9LAorICB7ICdbJywgIDMsICA2LCAwLCBNSVBTMTZPUF9TSF9SWiwgICAxLCAxLCAwIH0sCisgIHsgJ10nLCAgMywgIDYsIDAsIE1JUFMxNk9QX1NIX1JYLCAgIDEsIDEsIDAgfSwKKyAgeyAnNCcsICA0LCAxNSwgMCwgTUlQUzE2T1BfU0hfSU1NNCwgMCwgMCwgMCB9LAorICB7ICc1JywgIDUsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCisgIHsgJ0gnLCAgNSwgMTYsIDEsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKKyAgeyAnVycsICA1LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAorICB7ICdEJywgIDUsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCisgIHsgJ2onLCAgNSwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTUsIDAsIDAsIDAgfSwKKyAgeyAnOCcsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMCB9LAorICB7ICdWJywgIDgsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAwIH0sCisgIHsgJ0MnLCAgOCwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDAgfSwKKyAgeyAnVScsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMSwgMCB9LAorICB7ICdrJywgIDgsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAwIH0sCisgIHsgJ0snLCAgOCwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDAgfSwKKyAgeyAncCcsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMSB9LAorICB7ICdxJywgMTEsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAxIH0sCisgIHsgJ0EnLCAgOCwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDEgfSwKKyAgeyAnQicsICA1LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMSB9LAorICB7ICdFJywgIDUsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAxIH0KK307CisKKyNkZWZpbmUgTUlQUzE2X05VTV9JTU1FRCBcCisgIChzaXplb2YgbWlwczE2X2ltbWVkX29wZXJhbmRzIC8gc2l6ZW9mIG1pcHMxNl9pbW1lZF9vcGVyYW5kc1swXSkKKworLyogSGFuZGxlIGEgbWlwczE2IGluc3RydWN0aW9uIHdpdGggYW4gaW1tZWRpYXRlIHZhbHVlLiAgVGhpcyBvcidzIHRoZQorICAgc21hbGwgaW1tZWRpYXRlIHZhbHVlIGludG8gKklOU04uICBJdCBzZXRzICpVU0VfRVhURU5EIHRvIGluZGljYXRlCisgICB3aGV0aGVyIGFuIGV4dGVuZGVkIHZhbHVlIGlzIG5lZWRlZDsgaWYgb25lIGlzIG5lZWRlZCwgaXQgc2V0cworICAgKkVYVEVORCB0byB0aGUgdmFsdWUuICBUaGUgYXJndW1lbnQgdHlwZSBpcyBUWVBFLiAgVGhlIHZhbHVlIGlzIFZBTC4KKyAgIElmIFNNQUxMIGlzIHRydWUsIGFuIHVuZXh0ZW5kZWQgb3Bjb2RlIHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4KKyAgIElmIEVYVCBpcyB0cnVlLCBhbiBleHRlbmRlZCBvcGNvZGUgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgSWYKKyAgIFdBUk4gaXMgdHJ1ZSwgd2FybiBpZiBFWFQgZG9lcyBub3QgbWF0Y2ggcmVhbGl0eS4gICovCisKK3N0YXRpYyB2b2lkCittaXBzMTZfaW1tZWQgKGZpbGUsIGxpbmUsIHR5cGUsIHZhbCwgd2Fybiwgc21hbGwsIGV4dCwgaW5zbiwgdXNlX2V4dGVuZCwKKwkgICAgICBleHRlbmQpCisgICAgIGNoYXIgKmZpbGU7CisgICAgIHVuc2lnbmVkIGludCBsaW5lOworICAgICBpbnQgdHlwZTsKKyAgICAgb2Zmc2V0VCB2YWw7CisgICAgIGJvb2xlYW4gd2FybjsKKyAgICAgYm9vbGVhbiBzbWFsbDsKKyAgICAgYm9vbGVhbiBleHQ7CisgICAgIHVuc2lnbmVkIGxvbmcgKmluc247CisgICAgIGJvb2xlYW4gKnVzZV9leHRlbmQ7CisgICAgIHVuc2lnbmVkIHNob3J0ICpleHRlbmQ7Cit7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7CisgIGludCBtaW50aW55LCBtYXh0aW55OworICBib29sZWFuIG5lZWRleHQ7CisKKyAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7CisgIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQorICAgIHsKKyAgICAgICsrb3A7CisgICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7CisgICAgfQorCisgIGlmIChvcC0+dW5zcCkKKyAgICB7CisgICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCisJeworCSAgbWludGlueSA9IDE7CisJICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1pbnRpbnkgPSAwOworCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOworICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOworICAgIH0KKworICAvKiBCcmFuY2ggb2Zmc2V0cyBoYXZlIGFuIGltcGxpY2l0IDAgaW4gdGhlIGxvd2VzdCBiaXQuICAqLworICBpZiAodHlwZSA9PSAncCcgfHwgdHlwZSA9PSAncScpCisgICAgdmFsIC89IDI7CisKKyAgaWYgKCh2YWwgJiAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpKSAhPSAwCisgICAgICB8fCB2YWwgPCAobWludGlueSA8PCBvcC0+c2hpZnQpCisgICAgICB8fCB2YWwgPiAobWF4dGlueSA8PCBvcC0+c2hpZnQpKQorICAgIG5lZWRleHQgPSB0cnVlOworICBlbHNlCisgICAgbmVlZGV4dCA9IGZhbHNlOworCisgIGlmICh3YXJuICYmIGV4dCAmJiAhIG5lZWRleHQpCisgICAgYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgXygiZXh0ZW5kZWQgb3BlcmFuZCByZXF1ZXN0ZWQgYnV0IG5vdCByZXF1aXJlZCIpKTsKKyAgaWYgKHNtYWxsICYmIG5lZWRleHQpCisgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJpbnZhbGlkIHVuZXh0ZW5kZWQgb3BlcmFuZCB2YWx1ZSIpKTsKKworICBpZiAoc21hbGwgfHwgKCEgZXh0ICYmICEgbmVlZGV4dCkpCisgICAgeworICAgICAgaW50IGluc252YWw7CisKKyAgICAgICp1c2VfZXh0ZW5kID0gZmFsc2U7CisgICAgICBpbnNudmFsID0gKCh2YWwgPj4gb3AtPnNoaWZ0KSAmICgoMSA8PCBvcC0+bmJpdHMpIC0gMSkpOworICAgICAgaW5zbnZhbCA8PD0gb3AtPm9wX3NoaWZ0OworICAgICAgKmluc24gfD0gaW5zbnZhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb25nIG1pbmV4dCwgbWF4ZXh0OworICAgICAgaW50IGV4dHZhbDsKKworICAgICAgaWYgKG9wLT5leHR1KQorCXsKKwkgIG1pbmV4dCA9IDA7CisJICBtYXhleHQgPSAoMSA8PCBvcC0+ZXh0Yml0cykgLSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtaW5leHQgPSAtICgxIDw8IChvcC0+ZXh0Yml0cyAtIDEpKTsKKwkgIG1heGV4dCA9ICgxIDw8IChvcC0+ZXh0Yml0cyAtIDEpKSAtIDE7CisJfQorICAgICAgaWYgKHZhbCA8IG1pbmV4dCB8fCB2YWwgPiBtYXhleHQpCisJYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAorCQkgICAgICBfKCJvcGVyYW5kIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW5zdHJ1Y3Rpb24iKSk7CisKKyAgICAgICp1c2VfZXh0ZW5kID0gdHJ1ZTsKKyAgICAgIGlmIChvcC0+ZXh0Yml0cyA9PSAxNikKKwl7CisJICBleHR2YWwgPSAoKHZhbCA+PiAxMSkgJiAweDFmKSB8ICh2YWwgJiAweDdlMCk7CisJICB2YWwgJj0gMHgxZjsKKwl9CisgICAgICBlbHNlIGlmIChvcC0+ZXh0Yml0cyA9PSAxNSkKKwl7CisJICBleHR2YWwgPSAoKHZhbCA+PiAxMSkgJiAweGYpIHwgKHZhbCAmIDB4N2YwKTsKKwkgIHZhbCAmPSAweGY7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGV4dHZhbCA9ICgodmFsICYgMHgxZikgPDwgNikgfCAodmFsICYgMHgyMCk7CisJICB2YWwgPSAwOworCX0KKworICAgICAgKmV4dGVuZCA9ICh1bnNpZ25lZCBzaG9ydCkgZXh0dmFsOworICAgICAgKmluc24gfD0gdmFsOworICAgIH0KK30KKwwKKyNkZWZpbmUgTFAgJygnCisjZGVmaW5lIFJQICcpJworCitzdGF0aWMgaW50CitteV9nZXRTbWFsbEV4cHJlc3Npb24gKGVwLCBzdHIpCisgICAgIGV4cHJlc3Npb25TICplcDsKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICpzcDsKKyAgaW50IGMgPSAwOworCisgIGlmICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKyAgaWYgKCpzdHIgPT0gTFAKKyAgICAgIHx8ICgqc3RyID09ICclJyAmJgorCSAgKChzdHJbMV0gPT0gJ2gnICYmIHN0clsyXSA9PSAnaScpCisJICAgfHwgKHN0clsxXSA9PSAnSCcgJiYgc3RyWzJdID09ICdJJykKKwkgICB8fCAoc3RyWzFdID09ICdsJyAmJiBzdHJbMl0gPT0gJ28nKSkKKwkgICYmIHN0clszXSA9PSBMUCkpCisgICAgeworICAgICAgaWYgKCpzdHIgPT0gTFApCisJYyA9IDA7CisgICAgICBlbHNlCisJeworCSAgYyA9IHN0clsxXTsKKwkgIHN0ciArPSAzOworCX0KKworICAgICAgLyoKKyAgICAgICAqIEEgc21hbGwgZXhwcmVzc2lvbiBtYXkgYmUgZm9sbG93ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyLgorICAgICAgICogU2NhbiB0byB0aGUgZW5kIG9mIHRoaXMgb3BlcmFuZCwgYW5kIHRoZW4gYmFjayBvdmVyIGEgcG9zc2libGUKKyAgICAgICAqIGJhc2UgcmVnaXN0ZXIuICBUaGVuIHNjYW4gdGhlIHNtYWxsIGV4cHJlc3Npb24gdXAgdG8gdGhhdAorICAgICAgICogcG9pbnQuICAoQmFzZWQgb24gY29kZSBpbiBzcGFyYy5jLi4uKQorICAgICAgICovCisgICAgICBmb3IgKHNwID0gc3RyOyAqc3AgJiYgKnNwICE9ICcsJzsgc3ArKykKKwk7CisgICAgICBpZiAoc3AgLSA0ID49IHN0ciAmJiBzcFstMV0gPT0gUlApCisJeworCSAgaWYgKGlzZGlnaXQgKHNwWy0yXSkpCisJICAgIHsKKwkgICAgICBmb3IgKHNwIC09IDM7IHNwID49IHN0ciAmJiBpc2RpZ2l0ICgqc3ApOyBzcC0tKQorCQk7CisJICAgICAgaWYgKCpzcCA9PSAnJCcgJiYgc3AgPiBzdHIgJiYgc3BbLTFdID09IExQKQorCQl7CisJCSAgc3AtLTsKKwkJICBnb3RvIGRvX2l0OworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHNwIC0gNSA+PSBzdHIKKwkJICAgJiYgc3BbLTVdID09IExQCisJCSAgICYmIHNwWy00XSA9PSAnJCcKKwkJICAgJiYgKChzcFstM10gPT0gJ2YnICYmIHNwWy0yXSA9PSAncCcpCisJCSAgICAgICB8fCAoc3BbLTNdID09ICdzJyAmJiBzcFstMl0gPT0gJ3AnKQorCQkgICAgICAgfHwgKHNwWy0zXSA9PSAnZycgJiYgc3BbLTJdID09ICdwJykKKwkJICAgICAgIHx8IChzcFstM10gPT0gJ2EnICYmIHNwWy0yXSA9PSAndCcpKSkKKwkgICAgeworCSAgICAgIHNwIC09IDU7CisJICAgIGRvX2l0OgorCSAgICAgIGlmIChzcCA9PSBzdHIpCisJCXsKKwkJICAvKiBubyBleHByZXNzaW9uIG1lYW5zIHplcm8gb2Zmc2V0ICovCisJCSAgaWYgKGMpCisJCSAgICB7CisJCSAgICAgIC8qICV4eChyZWcpIGlzIGFuIGVycm9yICovCisJCSAgICAgIGVwLT5YX29wID0gT19hYnNlbnQ7CisJCSAgICAgIGV4cHJfZW5kID0gc3RyIC0gMzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGVwLT5YX29wID0gT19jb25zdGFudDsKKwkJICAgICAgZXhwcl9lbmQgPSBzcDsKKwkJICAgIH0KKwkJICBlcC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKKwkJICBlcC0+WF9vcF9zeW1ib2wgPSBOVUxMOworCQkgIGVwLT5YX2FkZF9udW1iZXIgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgKnNwID0gJ1wwJzsKKwkJICBteV9nZXRFeHByZXNzaW9uIChlcCwgc3RyKTsKKwkJICAqc3AgPSBMUDsKKwkJfQorCSAgICAgIHJldHVybiBjOworCSAgICB9CisJfQorICAgIH0KKyAgbXlfZ2V0RXhwcmVzc2lvbiAoZXAsIHN0cik7CisgIHJldHVybiBjOwkJCS8qID0+ICVoaSBvciAlbG8gZW5jb3VudGVyZWQgKi8KK30KKworc3RhdGljIHZvaWQKK215X2dldEV4cHJlc3Npb24gKGVwLCBzdHIpCisgICAgIGV4cHJlc3Npb25TICplcDsKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICpzYXZlX2luOworCisgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKyAgZXhwcmVzc2lvbiAoZXApOworICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKworICAvKiBJZiB3ZSBhcmUgaW4gbWlwczE2IG1vZGUsIGFuZCB0aGlzIGlzIGFuIGV4cHJlc3Npb24gYmFzZWQgb24gYC4nLAorICAgICB0aGVuIHdlIGJ1bXAgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYnkgMSBzaW5jZSB0aGF0IGlzIGhvdyBvdGhlcgorICAgICB0ZXh0IHN5bWJvbHMgYXJlIGhhbmRsZWQuICBXZSBkb24ndCBib3RoZXIgdG8gaGFuZGxlIGNvbXBsZXgKKyAgICAgZXhwcmVzc2lvbnMsIGp1c3QgYC4nIHBsdXMgb3IgbWludXMgYSBjb25zdGFudC4gICovCisgIGlmIChtaXBzX29wdHMubWlwczE2CisgICAgICAmJiBlcC0+WF9vcCA9PSBPX3N5bWJvbAorICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChlcC0+WF9hZGRfc3ltYm9sKSwgRkFLRV9MQUJFTF9OQU1FKSA9PSAwCisgICAgICAmJiBTX0dFVF9TRUdNRU5UIChlcC0+WF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCisgICAgICAmJiBlcC0+WF9hZGRfc3ltYm9sLT5zeV9mcmFnID09IGZyYWdfbm93CisgICAgICAmJiBlcC0+WF9hZGRfc3ltYm9sLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQKKyAgICAgICYmIGVwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9PSBmcmFnX25vd19maXggKCkpCisgICAgKytlcC0+WF9hZGRfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Cit9CisKKy8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudAorICAgb2YgdHlwZSB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlcgorICAgb2YgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcworICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLworCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBpbnQgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOworICBjaGFyICp0OworICBpbnQgaTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKKyAgICB9CisKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIDI7CisKKyAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisgICAgeworICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworCSAgbGl0UCArPSAyOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworCSAgbGl0UCArPSAyOworCX0KKyAgICB9CisgICAgIAorICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKKyAgICAgY2hhciAqYnVmOworICAgICB2YWx1ZVQgdmFsOworICAgICBpbnQgbjsKK3sKKyAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKKyAgZWxzZQorICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKK30KKwwKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJPOjpnOjpHOiI7CisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKyNkZWZpbmUgT1BUSU9OX01JUFMxIChPUFRJT05fTURfQkFTRSArIDEpCisgIHsibWlwczAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMxfSwKKyAgeyJtaXBzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzF9LAorI2RlZmluZSBPUFRJT05fTUlQUzIgKE9QVElPTl9NRF9CQVNFICsgMikKKyAgeyJtaXBzMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzJ9LAorI2RlZmluZSBPUFRJT05fTUlQUzMgKE9QVElPTl9NRF9CQVNFICsgMykKKyAgeyJtaXBzMyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzN9LAorI2RlZmluZSBPUFRJT05fTUlQUzQgKE9QVElPTl9NRF9CQVNFICsgNCkKKyAgeyJtaXBzNCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzR9LAorI2RlZmluZSBPUFRJT05fTUNQVSAoT1BUSU9OX01EX0JBU0UgKyA1KQorICB7Im1jcHUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01DUFV9LAorI2RlZmluZSBPUFRJT05fTUVNQkVEREVEX1BJQyAoT1BUSU9OX01EX0JBU0UgKyA2KQorICB7Im1lbWJlZGRlZC1waWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTUJFRERFRF9QSUN9LAorI2RlZmluZSBPUFRJT05fVFJBUCAoT1BUSU9OX01EX0JBU0UgKyA5KQorICB7InRyYXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQVB9LAorICB7Im5vLWJyZWFrIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFQfSwKKyNkZWZpbmUgT1BUSU9OX0JSRUFLIChPUFRJT05fTURfQkFTRSArIDEwKQorICB7ImJyZWFrIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CUkVBS30sCisgIHsibm8tdHJhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlJFQUt9LAorI2RlZmluZSBPUFRJT05fRUIgKE9QVElPTl9NRF9CQVNFICsgMTEpCisgIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKKyNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEyKQorICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCisjZGVmaW5lIE9QVElPTl9NNDY1MCAoT1BUSU9OX01EX0JBU0UgKyAxMykKKyAgeyJtNDY1MCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTQ2NTB9LAorI2RlZmluZSBPUFRJT05fTk9fTTQ2NTAgKE9QVElPTl9NRF9CQVNFICsgMTQpCisgIHsibm8tbTQ2NTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX000NjUwfSwKKyNkZWZpbmUgT1BUSU9OX000MDEwIChPUFRJT05fTURfQkFTRSArIDE1KQorICB7Im00MDEwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NNDAxMH0sCisjZGVmaW5lIE9QVElPTl9OT19NNDAxMCAoT1BUSU9OX01EX0JBU0UgKyAxNikKKyAgeyJuby1tNDAxMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTQwMTB9LAorI2RlZmluZSBPUFRJT05fTTQxMDAgKE9QVElPTl9NRF9CQVNFICsgMTcpCisgIHsibTQxMDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX000MTAwfSwKKyNkZWZpbmUgT1BUSU9OX05PX000MTAwIChPUFRJT05fTURfQkFTRSArIDE4KQorICB7Im5vLW00MTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NNDEwMH0sCisjZGVmaW5lIE9QVElPTl9NSVBTMTYgKE9QVElPTl9NRF9CQVNFICsgMjIpCisgIHsibWlwczE2Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMTZ9LAorI2RlZmluZSBPUFRJT05fTk9fTUlQUzE2IChPUFRJT05fTURfQkFTRSArIDIzKQorICB7Im5vLW1pcHMxNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTUlQUzE2fSwKKyNkZWZpbmUgT1BUSU9OX00zOTAwIChPUFRJT05fTURfQkFTRSArIDI2KQorICB7Im0zOTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NMzkwMH0sCisjZGVmaW5lIE9QVElPTl9OT19NMzkwMCAoT1BUSU9OX01EX0JBU0UgKyAyNykKKyAgeyJuby1tMzkwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTM5MDB9LAorCisKKyNkZWZpbmUgT1BUSU9OX01BQkkgKE9QVElPTl9NRF9CQVNFICsgMzgpCisgIHsibWFiaSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFCSX0sCisKKyNkZWZpbmUgT1BUSU9OX0NBTExfU0hBUkVEIChPUFRJT05fTURfQkFTRSArIDcpCisjZGVmaW5lIE9QVElPTl9OT05fU0hBUkVEIChPUFRJT05fTURfQkFTRSArIDgpCisjZGVmaW5lIE9QVElPTl9YR09UIChPUFRJT05fTURfQkFTRSArIDE5KQorI2RlZmluZSBPUFRJT05fMzIgKE9QVElPTl9NRF9CQVNFICsgMjApCisjZGVmaW5lIE9QVElPTl82NCAoT1BUSU9OX01EX0JBU0UgKyAyMSkKKyNpZmRlZiBPQkpfRUxGCisgIHsiS1BJQyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAorICB7Inhnb3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1hHT1R9LAorICB7ImNhbGxfc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCisgIHsibm9uX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9OX1NIQVJFRH0sCisgIHsiMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyfSwKKyAgeyI2NCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fNjR9LAorI2VuZGlmCisKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKKworaW50CittZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKKyAgICAgaW50IGM7CisgICAgIGNoYXIgKmFyZzsKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIE9QVElPTl9UUkFQOgorICAgICAgbWlwc190cmFwID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fQlJFQUs6CisgICAgICBtaXBzX3RyYXAgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9FQjoKKyAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fRUw6CisgICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ08nOgorICAgICAgaWYgKGFyZyAmJiBhcmdbMV0gPT0gJzAnKQorCW1pcHNfb3B0aW1pemUgPSAxOworICAgICAgZWxzZQorCW1pcHNfb3B0aW1pemUgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdnJzoKKyAgICAgIGlmIChhcmcgPT0gTlVMTCkKKwltaXBzX2RlYnVnID0gMjsKKyAgICAgIGVsc2UKKwltaXBzX2RlYnVnID0gYXRvaSAoYXJnKTsKKyAgICAgIC8qIFdoZW4gdGhlIE1JUFMgYXNzZW1ibGVyIHNlZXMgLWcgb3IgLWcyLCBpdCBkb2VzIG5vdCBkbworICAgICAgICAgb3B0aW1pemF0aW9ucyB3aGljaCBsaW1pdCBmdWxsIHN5bWJvbGljIGRlYnVnZ2luZy4gIFdlIHRha2UKKyAgICAgICAgIHRoYXQgdG8gYmUgZXF1aXZhbGVudCB0byAtTzAuICAqLworICAgICAgaWYgKG1pcHNfZGVidWcgPT0gMikKKwltaXBzX29wdGltaXplID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUlQUzE6CisgICAgICBtaXBzX29wdHMuaXNhID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUlQUzI6CisgICAgICBtaXBzX29wdHMuaXNhID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUlQUzM6CisgICAgICBtaXBzX29wdHMuaXNhID0gMzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUlQUzQ6CisgICAgICBtaXBzX29wdHMuaXNhID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUNQVToKKyAgICAgIHsKKwljaGFyICpwOworCisJLyogSWRlbnRpZnkgdGhlIHByb2Nlc3NvciB0eXBlICovCisJcCA9IGFyZzsKKwlpZiAoc3RyY21wIChwLCAiZGVmYXVsdCIpID09IDAKKwkgICAgfHwgc3RyY21wIChwLCAiREVGQVVMVCIpID09IDApCisJICBtaXBzX2NwdSA9IC0xOworCWVsc2UKKwkgIHsKKwkgICAgaW50IHN2ID0gMDsKKworCSAgICAvKiBXZSBuZWVkIHRvIGNvcGUgd2l0aCB0aGUgdmFyaW91cyAidnIiIHByZWZpeGVzIGZvciB0aGUgNDMwMAorCSAgICAgICBwcm9jZXNzb3IuICAqLworCSAgICBpZiAoKnAgPT0gJ3YnIHx8ICpwID09ICdWJykKKwkgICAgICB7CisJCXN2ID0gMTsKKwkJcCsrOworCSAgICAgIH0KKworCSAgICBpZiAoKnAgPT0gJ3InIHx8ICpwID09ICdSJykKKwkgICAgICBwKys7CisKKwkgICAgbWlwc19jcHUgPSAtMTsKKwkgICAgc3dpdGNoICgqcCkKKwkgICAgICB7CisJICAgICAgY2FzZSAnMSc6CisJCWlmIChzdHJjbXAgKHAsICIxMDAwMCIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAocCwgIjEwayIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAocCwgIjEwSyIpID09IDApCisJCSAgbWlwc19jcHUgPSAxMDAwMDsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICcyJzoKKwkJaWYgKHN0cmNtcCAocCwgIjIwMDAiKSA9PSAwCisJCSAgICB8fCBzdHJjbXAgKHAsICIyayIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAocCwgIjJLIikgPT0gMCkKKwkJICBtaXBzX2NwdSA9IDIwMDA7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnMyc6CisJCWlmIChzdHJjbXAgKHAsICIzMDAwIikgPT0gMAorCQkgICAgfHwgc3RyY21wIChwLCAiM2siKSA9PSAwCisJCSAgICB8fCBzdHJjbXAgKHAsICIzSyIpID09IDApCisJCSAgbWlwc19jcHUgPSAzMDAwOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAocCwgIjM5MDAiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSAzOTAwOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJzQnOgorCQlpZiAoc3RyY21wIChwLCAiNDAwMCIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAocCwgIjRrIikgPT0gMAorCQkgICAgfHwgc3RyY21wIChwLCAiNEsiKSA9PSAwKQorCQkgIG1pcHNfY3B1ID0gNDAwMDsKKwkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDEwMCIpID09IDApCisgICAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDEwMDsKKwkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDExMSIpID09IDApCisgICAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDExMTsKKwkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDMwMCIpID09IDApCisJCSAgbWlwc19jcHUgPSA0MzAwOworCQllbHNlIGlmIChzdHJjbXAgKHAsICI0NDAwIikgPT0gMCkKKwkJICBtaXBzX2NwdSA9IDQ0MDA7CisJCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQ2MDAiKSA9PSAwKQorCQkgIG1pcHNfY3B1ID0gNDYwMDsKKwkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDY1MCIpID09IDApCisJCSAgICBtaXBzX2NwdSA9IDQ2NTA7CisJCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQwMTAiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgbWlwc19jcHUgPSA0MDEwOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJzUnOgorCQlpZiAoc3RyY21wIChwLCAiNTAwMCIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAocCwgIjVrIikgPT0gMAorCQkgICAgfHwgc3RyY21wIChwLCAiNUsiKSA9PSAwKQorCQkgIG1pcHNfY3B1ID0gNTAwMDsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICc2JzoKKwkJaWYgKHN0cmNtcCAocCwgIjYwMDAiKSA9PSAwCisJCSAgICB8fCBzdHJjbXAgKHAsICI2ayIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAocCwgIjZLIikgPT0gMCkKKwkJICBtaXBzX2NwdSA9IDYwMDA7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnOCc6CisJCWlmIChzdHJjbXAgKHAsICI4MDAwIikgPT0gMAorCQkgICAgfHwgc3RyY21wIChwLCAiOGsiKSA9PSAwCisJCSAgICB8fCBzdHJjbXAgKHAsICI4SyIpID09IDApCisJCSAgbWlwc19jcHUgPSA4MDAwOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ28nOgorCQlpZiAoc3RyY21wIChwLCAib3Jpb24iKSA9PSAwKQorCQkgIG1pcHNfY3B1ID0gNDYwMDsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIGlmIChzdgorCQkmJiAobWlwc19jcHUgIT0gNDMwMAorCQkgICAgJiYgbWlwc19jcHUgIT0gNDEwMAorCQkgICAgJiYgbWlwc19jcHUgIT0gNDExMQorCQkgICAgJiYgbWlwc19jcHUgIT0gNTAwMCkpCisJICAgICAgeworCQlhc19iYWQgKF8oImlnbm9yaW5nIGludmFsaWQgbGVhZGluZyAndicgaW4gLW1jcHU9JXMgc3dpdGNoIiksIGFyZyk7CisJCXJldHVybiAwOworCSAgICAgIH0KKworCSAgICBpZiAobWlwc19jcHUgPT0gLTEpCisJICAgICAgeworCQlhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC1tY3B1PSVzIiksIGFyZyk7CisJCXJldHVybiAwOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTTQ2NTA6CisgICAgICBtaXBzX2NwdSA9IDQ2NTA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX05PX000NjUwOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9NNDAxMDoKKyAgICAgIG1pcHNfY3B1ID0gNDAxMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTk9fTTQwMTA6CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX000MTAwOgorICAgICAgbWlwc19jcHUgPSA0MTAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9OT19NNDEwMDoKKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIE9QVElPTl9NMzkwMDoKKyAgICAgIG1pcHNfY3B1ID0gMzkwMDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUFRJT05fTk9fTTM5MDA6CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX01JUFMxNjoKKyAgICAgIG1pcHNfb3B0cy5taXBzMTYgPSAxOworICAgICAgbWlwc19ub19wcmV2X2luc24gKGZhbHNlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTk9fTUlQUzE2OgorICAgICAgbWlwc19vcHRzLm1pcHMxNiA9IDA7CisgICAgICBtaXBzX25vX3ByZXZfaW5zbiAoZmFsc2UpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9NRU1CRURERURfUElDOgorICAgICAgbWlwc19waWMgPSBFTUJFRERFRF9QSUM7CisgICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBnX3N3aXRjaF9zZWVuKQorCXsKKwkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggZW1iZWRkZWQgUElDIGNvZGUiKSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBnX3N3aXRjaF92YWx1ZSA9IDB4N2ZmZmZmZmY7CisgICAgICBicmVhazsKKworICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIEVMRiBjb2RlLCB3ZSBwZXJtaXQgLUtQSUMgYW5kIC1jYWxsX3NoYXJlZCB0bworCSBzZWxlY3QgU1ZSNF9QSUMsIGFuZCAtbm9uX3NoYXJlZCB0byBzZWxlY3Qgbm8gUElDLiAgVGhpcyBpcworCSBpbnRlbmRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggSXJpeCA1LiAgKi8KKyAgICBjYXNlIE9QVElPTl9DQUxMX1NIQVJFRDoKKyAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisJeworCSAgYXNfYmFkIChfKCItY2FsbF9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiKSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBtaXBzX3BpYyA9IFNWUjRfUElDOworICAgICAgaWYgKGdfc3dpdGNoX3NlZW4gJiYgZ19zd2l0Y2hfdmFsdWUgIT0gMCkKKwl7CisJICBhc19iYWQgKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX05PTl9TSEFSRUQ6CisgICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorCXsKKwkgIGFzX2JhZCAoXygiLW5vbl9zaGFyZWQgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIEVMRiBmb3JtYXQiKSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBtaXBzX3BpYyA9IE5PX1BJQzsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBUaGUgLXhnb3Qgb3B0aW9uIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gdXNlIDMyIG9mZnNldHMgd2hlbgorICAgICAgICAgYWNjZXNzaW5nIHRoZSBnb3QgaW4gU1ZSNF9QSUMgbW9kZS4gIEl0IGlzIGZvciBJcml4CisgICAgICAgICBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICBjYXNlIE9QVElPTl9YR09UOgorICAgICAgbWlwc19iaWdfZ290ID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRyc6CisgICAgICBpZiAoISBVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQorCXsKKwkgIGFzX2JhZCAoXygiLUcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uIikpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDKQorCXsKKwkgIGFzX2JhZCAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBvciBlbWJlZGRlZCBQSUMgY29kZSIpKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGVsc2UKKwlnX3N3aXRjaF92YWx1ZSA9IGF0b2kgKGFyZyk7CisgICAgICBnX3N3aXRjaF9zZWVuID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBUaGUgLTMyIGFuZCAtNjQgb3B0aW9ucyB0ZWxsIHRoZSBhc3NlbWJsZXIgdG8gb3V0cHV0IHRoZSAzMgorICAgICAgICAgYml0IG9yIHRoZSA2NCBiaXQgTUlQUyBFTEYgZm9ybWF0LiAgKi8KKyAgICBjYXNlIE9QVElPTl8zMjoKKyAgICAgIG1pcHNfNjQgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl82NDoKKyAgICAgIHsKKwljb25zdCBjaGFyICoqbGlzdCwgKipsOworCisJbGlzdCA9IGJmZF90YXJnZXRfbGlzdCAoKTsKKwlmb3IgKGwgPSBsaXN0OyAqbCAhPSBOVUxMOyBsKyspCisJICBpZiAoc3RyY21wICgqbCwgImVsZjY0LWJpZ21pcHMiKSA9PSAwCisJICAgICAgfHwgc3RyY21wICgqbCwgImVsZjY0LWxpdHRsZW1pcHMiKSA9PSAwKQorCSAgICBicmVhazsKKwlpZiAoKmwgPT0gTlVMTCkKKwkgIGFzX2ZhdGFsIChfKCJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciA2NCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IikpOworCWZyZWUgKGxpc3QpOworCW1pcHNfNjQgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgT1BUSU9OX01BQkk6CisgICAgICBpZiAoc3RyY21wIChhcmcsIjMyIikgPT0gMAorCSAgfHwgc3RyY21wIChhcmcsIm4zMiIpID09IDAKKwkgIHx8IHN0cmNtcCAoYXJnLCI2NCIpID09IDAKKwkgIHx8IHN0cmNtcCAoYXJnLCJvNjQiKSA9PSAwCisJICB8fCBzdHJjbXAgKGFyZywiZWFiaSIpID09IDApCisJbWlwc19hYmlfc3RyaW5nID0gYXJnOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkCitzaG93IChzdHJlYW0sIHN0cmluZywgY29sX3AsIGZpcnN0X3ApCisgICAgIEZJTEUgKnN0cmVhbTsKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBpbnQgKmNvbF9wOworICAgICBpbnQgKmZpcnN0X3A7Cit7CisgIGlmICgqZmlyc3RfcCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdHJlYW0sICIlMjRzIiwgIiIpOworICAgICAgKmNvbF9wID0gMjQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiLCAiKTsKKyAgICAgICpjb2xfcCArPSAyOworICAgIH0KKworICBpZiAoKmNvbF9wICsgc3RybGVuIChzdHJpbmcpID4gNzIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiXG4lMjRzIiwgIiIpOworICAgICAgKmNvbF9wID0gMjQ7CisgICAgfQorCisgIGZwcmludGYgKHN0cmVhbSwgIiVzIiwgc3RyaW5nKTsKKyAgKmNvbF9wICs9IHN0cmxlbiAoc3RyaW5nKTsKKworICAqZmlyc3RfcCA9IDA7Cit9CisKKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGludCBjb2x1bW4sIGZpcnN0OworCisgIGZwcmludGYoc3RyZWFtLCBfKCJcCitNSVBTIG9wdGlvbnM6XG5cCistbWVtYmVkZGVkLXBpYwkJZ2VuZXJhdGUgZW1iZWRkZWQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAorLUVCCQkJZ2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcblwKKy1FTAkJCWdlbmVyYXRlIGxpdHRsZSBlbmRpYW4gb3V0cHV0XG5cCistZywgLWcyCQkJZG8gbm90IHJlbW92ZSB1bmVlZGVkIE5PUHMgb3Igc3dhcCBicmFuY2hlc1xuXAorLUcgTlVNCQkJYWxsb3cgcmVmZXJlbmNpbmcgb2JqZWN0cyB1cCB0byBOVU0gYnl0ZXNcblwKKwkJCWltcGxpY2l0bHkgd2l0aCB0aGUgZ3AgcmVnaXN0ZXIgW2RlZmF1bHQgOF1cbiIpKTsKKyAgZnByaW50ZihzdHJlYW0sIF8oIlwKKy1taXBzMQkJCWdlbmVyYXRlIE1JUFMgSVNBIEkgaW5zdHJ1Y3Rpb25zXG5cCistbWlwczIJCQlnZW5lcmF0ZSBNSVBTIElTQSBJSSBpbnN0cnVjdGlvbnNcblwKKy1taXBzMwkJCWdlbmVyYXRlIE1JUFMgSVNBIElJSSBpbnN0cnVjdGlvbnNcblwKKy1taXBzNAkJCWdlbmVyYXRlIE1JUFMgSVNBIElWIGluc3RydWN0aW9uc1xuXAorLW1jcHU9Q1BVCQlnZW5lcmF0ZSBjb2RlIGZvciBDUFUsIHdoZXJlIENQVSBpcyBvbmUgb2Y6XG4iKSk7CisKKyAgZmlyc3QgPSAxOworCisgIHNob3cgKHN0cmVhbSwgIjIwMDAiLCAmY29sdW1uLCAmZmlyc3QpOworICBzaG93IChzdHJlYW0sICIzMDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKKyAgc2hvdyAoc3RyZWFtLCAiMzkwMCIsICZjb2x1bW4sICZmaXJzdCk7CisgIHNob3cgKHN0cmVhbSwgIjQwMDAiLCAmY29sdW1uLCAmZmlyc3QpOworICBzaG93IChzdHJlYW0sICI0MDEwIiwgJmNvbHVtbiwgJmZpcnN0KTsKKyAgc2hvdyAoc3RyZWFtLCAiNDEwMCIsICZjb2x1bW4sICZmaXJzdCk7CisgIHNob3cgKHN0cmVhbSwgIjQxMTEiLCAmY29sdW1uLCAmZmlyc3QpOworICBzaG93IChzdHJlYW0sICI0MzAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKKyAgc2hvdyAoc3RyZWFtLCAiNDQwMCIsICZjb2x1bW4sICZmaXJzdCk7CisgIHNob3cgKHN0cmVhbSwgIjQ2MDAiLCAmY29sdW1uLCAmZmlyc3QpOworICBzaG93IChzdHJlYW0sICI0NjUwIiwgJmNvbHVtbiwgJmZpcnN0KTsKKyAgc2hvdyAoc3RyZWFtLCAiNTAwMCIsICZjb2x1bW4sICZmaXJzdCk7CisgIHNob3cgKHN0cmVhbSwgIjYwMDAiLCAmY29sdW1uLCAmZmlyc3QpOworICBzaG93IChzdHJlYW0sICI4MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKKyAgc2hvdyAoc3RyZWFtLCAiMTAwMDAiLCAmY29sdW1uLCAmZmlyc3QpOworICBmcHV0YyAoJ1xuJywgc3RyZWFtKTsKKworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKy1tQ1BVCQkJZXF1aXZhbGVudCB0byAtbWNwdT1DUFUuXG5cCistbm8tbUNQVQkJZG9uJ3QgZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byBDUFUuXG5cCisJCQlGb3IgLW1DUFUgYW5kIC1uby1tQ1BVLCBDUFUgbXVzdCBiZSBvbmUgb2Y6XG4iKSk7CisKKyAgZmlyc3QgPSAxOworCisgIHNob3cgKHN0cmVhbSwgIjM5MDAiLCAmY29sdW1uLCAmZmlyc3QpOworICBzaG93IChzdHJlYW0sICI0MDEwIiwgJmNvbHVtbiwgJmZpcnN0KTsKKyAgc2hvdyAoc3RyZWFtLCAiNDEwMCIsICZjb2x1bW4sICZmaXJzdCk7CisgIHNob3cgKHN0cmVhbSwgIjQ2NTAiLCAmY29sdW1uLCAmZmlyc3QpOworICBmcHV0YyAoJ1xuJywgc3RyZWFtKTsKKworICBmcHJpbnRmKHN0cmVhbSwgXygiXAorLW1pcHMxNgkJCWdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcblwKKy1uby1taXBzMTYJCWRvIG5vdCBnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG4iKSk7CisgIGZwcmludGYoc3RyZWFtLCBfKCJcCistTzAJCQlyZW1vdmUgdW5uZWVkZWQgTk9QcywgZG8gbm90IHN3YXAgYnJhbmNoZXNcblwKKy1PCQkJcmVtb3ZlIHVubmVlZGVkIE5PUHMgYW5kIHN3YXAgYnJhbmNoZXNcblwKKy0tdHJhcCwgLS1uby1icmVhawl0cmFwIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuXAorLS1icmVhaywgLS1uby10cmFwCWJyZWFrIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuIikpOworI2lmZGVmIE9CSl9FTEYKKyAgZnByaW50ZihzdHJlYW0sIF8oIlwKKy1LUElDLCAtY2FsbF9zaGFyZWQJZ2VuZXJhdGUgU1ZSNCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCistbm9uX3NoYXJlZAkJZG8gbm90IGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKKy14Z290CQkJYXNzdW1lIGEgMzIgYml0IEdPVFxuXAorLTMyCQkJY3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZSAoZGVmYXVsdClcblwKKy02NAkJCWNyZWF0ZSA2NCBiaXQgb2JqZWN0IGZpbGVcbiIpKTsKKyNlbmRpZgorfQorDAordm9pZAorbWlwc19pbml0X2FmdGVyX2FyZ3MgKCkKK3sKKyAgLyogaW5pdGlhbGl6ZSBvcGNvZGVzICovCisgIGJmZF9taXBzX251bV9vcGNvZGVzID0gYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2RlczsKKyAgbWlwc19vcGNvZGVzID0gKHN0cnVjdCBtaXBzX29wY29kZSopIG1pcHNfYnVpbHRpbl9vcGNvZGVzOworfQorCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgorICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAorICAgICAgJiYgISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICB7CisgICAgICAvKiBUaGlzIG1ha2VzIGEgYnJhbmNoIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wgYmUgYSBicmFuY2ggdG8gdGhlCisJIGN1cnJlbnQgbG9jYXRpb24uICAqLworICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgIC8qIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZGVsYXkgc2xvdCAqLworICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYnkgZW1pdF9leHByIHZpYSBUQ19DT05TX0ZJWF9ORVcgd2hlbiBjcmVhdGluZyBhCisgICByZWxvYyBmb3IgYSBjb25zLiAgV2UgY291bGQgdXNlIHRoZSBkZWZpbml0aW9uIHRoZXJlLCBleGNlcHQgdGhhdAorICAgd2Ugd2FudCB0byBoYW5kbGUgNjQgYml0IHJlbG9jcyBzcGVjaWFsbHkuICAqLworCit2b2lkCitjb25zX2ZpeF9uZXdfbWlwcyAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQorICAgICBmcmFnUyAqZnJhZzsKKyAgICAgaW50IHdoZXJlOworICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOworICAgICBleHByZXNzaW9uUyAqZXhwOworeworI2lmbmRlZiBPQkpfRUxGCisgIC8qIElmIHdlIGFyZSBhc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLCB0dXJuIGFuIDggYnl0ZSByZWxvYyBpbnRvIGEKKyAgICAgNCBieXRlIHJlbG9jLiAgKi8KKyAgaWYgKG5ieXRlcyA9PSA4ICYmICEgbWlwc182NCkKKyAgICB7CisgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJd2hlcmUgKz0gNDsKKyAgICAgIG5ieXRlcyA9IDQ7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKG5ieXRlcyAhPSAyICYmIG5ieXRlcyAhPSA0ICYmIG5ieXRlcyAhPSA4KQorICAgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgcmVsb2Mgc2l6ZSAlZCIpLCBuYnl0ZXMpOworCisgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgd2hlcmUsIChpbnQpIG5ieXRlcywgZXhwLCAwLAorCSAgICAgICAobmJ5dGVzID09IDIKKwkJPyBCRkRfUkVMT0NfMTYKKwkJOiAobmJ5dGVzID09IDQgPyBCRkRfUkVMT0NfMzIgOiBCRkRfUkVMT0NfNjQpKSk7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlIGlzIHByb2Nlc3NlZC4gIEluIG9yZGVyIHRvCisgICB3b3JrIHdpdGggZ2NjIHdoZW4gdXNpbmcgbWlwcy10ZmlsZSwgd2UgbXVzdCBrZWVwIGFsbCBsb2NhbCBsYWJlbHMuCisgICBIb3dldmVyLCBpbiBvdGhlciBjYXNlcywgd2Ugd2FudCB0byBkaXNjYXJkIHRoZW0uICBJZiB3ZSB3ZXJlCisgICBjYWxsZWQgd2l0aCAtZywgYnV0IHdlIGRpZG4ndCBzZWUgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaXQgbWF5CisgICBtZWFuIHRoYXQgZ2NjIGlzIHNtdWdnbGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdGhyb3VnaCB0bworICAgbWlwcy10ZmlsZSwgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IGdlbmVyYXRlIGFsbCBsb2NhbCBsYWJlbHMuICAqLworCit2b2lkCittaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpCit7CisjaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORworICBpZiAoRUNPRkZfREVCVUdHSU5HCisgICAgICAmJiBtaXBzX2RlYnVnICE9IDAKKyAgICAgICYmICEgZWNvZmZfZGVidWdnaW5nX3NlZW4pCisgICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7CisjZW5kaWYKK30KKworLyogU29ydCBhbnkgdW5tYXRjaGVkIEhJMTZfUyByZWxvY3Mgc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUKKyAgIHRoZSBjb3JyZXNwb25kaW5nIExPIHJlbG9jLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIG1kX2FwcGx5X2ZpeCBhbmQKKyAgIHRjX2dlbl9yZWxvYy4gIFVubWF0Y2hlZCBISTE2X1MgcmVsb2NzIGNhbiBvbmx5IGJlIGdlbmVyYXRlZCBieQorICAgZXhwbGljaXQgdXNlIG9mIHRoZSAlaGkgbW9kaWZpZXIuICAqLworCit2b2lkCittaXBzX2Zyb2JfZmlsZSAoKQoreworICBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbDsKKworICBmb3IgKGwgPSBtaXBzX2hpX2ZpeHVwX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87CisgICAgICBpbnQgcGFzczsKKworICAgICAgYXNzZXJ0IChsLT5maXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0hJMTZfUyk7CisKKyAgICAgIC8qIENoZWNrIHF1aWNrbHkgd2hldGhlciB0aGUgbmV4dCBmaXh1cCBoYXBwZW5zIHRvIGJlIGEgbWF0Y2hpbmcKKyAgICAgICAgICVsby4gICovCisgICAgICBpZiAobC0+Zml4cC0+ZnhfbmV4dCAhPSBOVUxMCisJICAmJiBsLT5maXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0xPMTYKKwkgICYmIGwtPmZpeHAtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X2FkZHN5CisJICAmJiBsLT5maXhwLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+Znhfb2Zmc2V0KQorCWNvbnRpbnVlOworCisgICAgICAvKiBMb29rIHRocm91Z2ggdGhlIGZpeHVwcyBmb3IgdGhpcyBzZWdtZW50IGZvciBhIG1hdGNoaW5nICVsby4KKyAgICAgICAgIFdoZW4gd2UgZmluZCBvbmUsIG1vdmUgdGhlICVoaSBqdXN0IGluIGZyb250IG9mIGl0LiAgV2UgZG8KKyAgICAgICAgIHRoaXMgaW4gdHdvIHBhc3Nlcy4gIEluIHRoZSBmaXJzdCBwYXNzLCB3ZSB0cnkgdG8gZmluZCBhCisgICAgICAgICB1bmlxdWUgJWxvLiAgSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBwZXJtaXQgbXVsdGlwbGUgJWhpCisgICAgICAgICByZWxvY3MgZm9yIGEgc2luZ2xlICVsbyAodGhpcyBpcyBhIEdOVSBleHRlbnNpb24pLiAgKi8KKyAgICAgIHNlZ2luZm8gPSBzZWdfaW5mbyAobC0+c2VnKTsKKyAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspCisJeworCSAgZml4UyAqZiwgKnByZXY7CisKKwkgIHByZXYgPSBOVUxMOworCSAgZm9yIChmID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGYgIT0gTlVMTDsgZiA9IGYtPmZ4X25leHQpCisJICAgIHsKKwkgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSAlbG8gZml4dXAgd2hpY2ggbWF0Y2hlcyBsLT5maXhwLiAgKi8KKwkgICAgICBpZiAoZi0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19MTzE2CisJCSAgJiYgZi0+ZnhfYWRkc3kgPT0gbC0+Zml4cC0+ZnhfYWRkc3kKKwkJICAmJiBmLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+Znhfb2Zmc2V0CisJCSAgJiYgKHBhc3MgPT0gMQorCQkgICAgICB8fCBwcmV2ID09IE5VTEwKKwkJICAgICAgfHwgcHJldi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1MKKwkJICAgICAgfHwgcHJldi0+ZnhfYWRkc3kgIT0gZi0+ZnhfYWRkc3kKKwkJICAgICAgfHwgcHJldi0+Znhfb2Zmc2V0ICE9ICBmLT5meF9vZmZzZXQpKQorCQl7CisJCSAgZml4UyAqKnBmOworCisJCSAgLyogTW92ZSBsLT5maXhwIGJlZm9yZSBmLiAgKi8KKwkJICBmb3IgKHBmID0gJnNlZ2luZm8tPmZpeF9yb290OworCQkgICAgICAgKnBmICE9IGwtPmZpeHA7CisJCSAgICAgICBwZiA9ICYoKnBmKS0+ZnhfbmV4dCkKKwkJICAgIGFzc2VydCAoKnBmICE9IE5VTEwpOworCisJCSAgKnBmID0gbC0+Zml4cC0+ZnhfbmV4dDsKKworCQkgIGwtPmZpeHAtPmZ4X25leHQgPSBmOworCQkgIGlmIChwcmV2ID09IE5VTEwpCisJCSAgICBzZWdpbmZvLT5maXhfcm9vdCA9IGwtPmZpeHA7CisJCSAgZWxzZQorCQkgICAgcHJldi0+ZnhfbmV4dCA9IGwtPmZpeHA7CisKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgcHJldiA9IGY7CisJICAgIH0KKworCSAgaWYgKGYgIT0gTlVMTCkKKwkgICAgYnJlYWs7CisKKyNpZiAwIC8qIEdDQyBjb2RlIG1vdGlvbiBwbHVzIGluY29tcGxldGUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uCisJIGNhbiBsZWF2ZSBhICVoaSB3aXRob3V0IGEgJWxvLiAgKi8KKwkgIGlmIChwYXNzID09IDEpCisJICAgIGFzX3dhcm5fd2hlcmUgKGwtPmZpeHAtPmZ4X2ZpbGUsIGwtPmZpeHAtPmZ4X2xpbmUsCisJCQkgICBfKCJVbm1hdGNoZWQgJSVoaSByZWxvYyIpKTsKKyNlbmRpZgorCX0KKyAgICB9Cit9CisKKy8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBuZWVkIHRvIHVzZSBhIHNwZWNpYWwKKyAgIHJlbG9jYXRpb24gdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZSAudGV4dAorICAgc2VjdGlvbiAoc3dpdGNoIHRhYmxlcyB1c2UgYSBkaWZmZXJlbmNlIG9mIHRoaXMgc29ydCkuICBTZWUKKyAgIGluY2x1ZGUvY29mZi9taXBzLmggZm9yIGRldGFpbHMuICBUaGlzIG1hY3JvIGNoZWNrcyB3aGV0aGVyIHRoaXMKKyAgIGZpeHVwIHJlcXVpcmVzIHRoZSBzcGVjaWFsIHJlbG9jLiAgKi8KKyNkZWZpbmUgU1dJVENIX1RBQkxFKGZpeHApIFwKKyAgKChmaXhwKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMiBcCisgICAmJiAoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwgXAorICAgJiYgKGZpeHApLT5meF9zdWJzeSAhPSBOVUxMIFwKKyAgICYmIFNfR0VUX1NFR01FTlQgKChmaXhwKS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbiBcCisgICAmJiBTX0dFVF9TRUdNRU5UICgoZml4cCktPmZ4X3N1YnN5KSA9PSB0ZXh0X3NlY3Rpb24pCisKKy8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSB3ZSBtdXN0IGtlZXAgYWxsIFBDIHJlbGF0aXZlCisgICByZWxvY2F0aW9ucywgaW4gY2FzZSB0aGUgbGlua2VyIGhhcyB0byByZWxheCBhIGNhbGwuICBXZSBhbHNvIG5lZWQKKyAgIHRvIGtlZXAgcmVsb2NhdGlvbnMgZm9yIHN3aXRjaCB0YWJsZSBlbnRyaWVzLiAgKi8KKworLypBUkdTVVNFRCovCitpbnQKK21pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAobWlwc19waWMgPT0gRU1CRURERURfUElDCisJICAmJiAoZml4cC0+ZnhfcGNyZWwKKwkgICAgICB8fCBTV0lUQ0hfVEFCTEUgKGZpeHApCisJICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MKKwkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpKTsKK30KKworLyogQXBwbHkgYSBmaXh1cCB0byB0aGUgb2JqZWN0IGZpbGUuICAqLworCitpbnQKK21kX2FwcGx5X2ZpeCAoZml4UCwgdmFsdWVQKQorICAgICBmaXhTICpmaXhQOworICAgICB2YWx1ZVQgKnZhbHVlUDsKK3sKKyAgdW5zaWduZWQgY2hhciAqYnVmOworICBsb25nIGluc24sIHZhbHVlOworCisgIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSA0CisJICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2CisJICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0CisJICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCisJICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSk7CisKKyAgdmFsdWUgPSAqdmFsdWVQOworCisgIC8qIElmIHdlIGFyZW4ndCBhZGp1c3RpbmcgdGhpcyBmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uCisgICAgIHN5bWJvbCwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlLiAgKi8KKyNpZmRlZiBPQkpfRUxGCisgIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMICYmIE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICBpZiAoU19HRVRfT1RIRVIgKGZpeFAtPmZ4X2FkZHN5KSA9PSBTVE9fTUlQUzE2IAorICAgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQorICAgICAgICB8fCAoZml4UC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MKKyAgICAgICAgICAgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICAgICAgICAgICAgICAmIFNFQ19MSU5LX09OQ0UgIT0gMCkKKyAgICAgICAgICAgICAgIHx8ICFzdHJuY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5nbnUubGlua29uY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIi5nbnUubGlua29uY2UiKSAtIDEpKSkKKworICAgICAgeworICAgICAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpOworICAgICAgICBpZiAodmFsdWUgIT0gMCAmJiAhIGZpeFAtPmZ4X3BjcmVsKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEluIHRoaXMgY2FzZSwgdGhlIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gcm91dGluZSB3aWxsCisgICAgICAgICAgICAgICBpbmNvcnJlY3RseSBhZGQgdGhlIHN5bWJvbCB2YWx1ZSBiYWNrIGluLiAgV2UganVzdCB3YW50CisgICAgICAgICAgICAgICB0aGUgYWRkZW5kIHRvIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLworICAgICAgICAgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKKyAgICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKworCisgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgdGNfZ2VuX3JlbG9jICovCisKKyAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwgJiYgISBmaXhQLT5meF9wY3JlbCkKKyAgICBmaXhQLT5meF9kb25lID0gMTsKKworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6CisgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKKyAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HUFJFTDoKKyAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUw6CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMMTY6CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1QxNjoKKyAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNjoKKyAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2OgorICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2OgorICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2OgorICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9HUFJFTDoKKyAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKKwlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCSAgICAgIF8oIkludmFsaWQgUEMgcmVsYXRpdmUgcmVsb2MiKSk7CisgICAgICAvKiBOb3RoaW5nIG5lZWRlZCB0byBkby4gVGhlIHZhbHVlIGNvbWVzIGZyb20gdGhlIHJlbG9jIGVudHJ5ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX01JUFMxNl9KTVA6CisgICAgICAvKiBXZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCwgd2hpY2gKKyAgICAgICAgIG1lYW5zIHRoYXQgd2UgZG9uJ3Qgd2FudCBhbiBhZGRlbmQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzCisgICAgICAgICBkZWZpbmVkLiAgKi8KKyAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKKyAgICAgIC8qIFRoZSBhZGRlbmQgZm9yIHRoaXMgaXMgdHJpY2t5IGlmIGl0IGlzIGludGVybmFsLCBzbyB3ZSBqdXN0CisJIGRvIGV2ZXJ5dGhpbmcgaGVyZSByYXRoZXIgdGhhbiBpbiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KKyAgICAgIGlmICgoZml4UC0+ZnhfYWRkc3ktPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQorCXsKKwkgIC8qIEZvciBhbiBleHRlcm5hbCBzeW1ib2wgYWRqdXN0IGJ5IHRoZSBhZGRyZXNzIHRvIG1ha2UgaXQKKwkgICAgIHBjcmVsX29mZnNldC4gIFdlIHVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgUkVMTE8gcmVsb2MKKwkgICAgIHdoaWNoIGZvbGxvd3MgdGhpcyBvbmUuICAqLworCSAgdmFsdWUgKz0gKGZpeFAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKKwkJICAgICsgZml4UC0+ZnhfbmV4dC0+Znhfd2hlcmUpOworCX0KKyAgICAgIGlmICh2YWx1ZSAmIDB4ODAwMCkKKwl2YWx1ZSArPSAweDEwMDAwOworICAgICAgdmFsdWUgPj49IDE2OworICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCWJ1ZiArPSAyOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKKyAgICAgIC8qIFRoZSBhZGRlbmQgZm9yIHRoaXMgaXMgdHJpY2t5IGlmIGl0IGlzIGludGVybmFsLCBzbyB3ZSBqdXN0CisJIGRvIGV2ZXJ5dGhpbmcgaGVyZSByYXRoZXIgdGhhbiBpbiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KKyAgICAgIGlmICgoZml4UC0+ZnhfYWRkc3ktPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQorCXZhbHVlICs9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKKyAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKKyAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKwlidWYgKz0gMjsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DXzY0OgorICAgICAgLyogVGhpcyBpcyBoYW5kbGVkIGxpa2UgQkZEX1JFTE9DXzMyLCBidXQgd2Ugb3V0cHV0IGEgc2lnbgorICAgICAgICAgZXh0ZW5kZWQgdmFsdWUgaWYgd2UgYXJlIG9ubHkgMzIgYml0cy4gICovCisgICAgICBpZiAoZml4UC0+ZnhfZG9uZQorCSAgfHwgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQyAmJiBTV0lUQ0hfVEFCTEUgKGZpeFApKSkKKwl7CisJICBpZiAoOCA8PSBzaXplb2YgKHZhbHVlVCkpCisJICAgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAorCQkJCXZhbHVlLCA4KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGxvbmcgdzEsIHcyOworCSAgICAgIGxvbmcgaGl2OworCisJICAgICAgdzEgPSB3MiA9IGZpeFAtPmZ4X3doZXJlOworCSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKwkJdzEgKz0gNDsKKwkgICAgICBlbHNlCisJCXcyICs9IDQ7CisJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgdzEsIHZhbHVlLCA0KTsKKwkgICAgICBpZiAoKHZhbHVlICYgMHg4MDAwMDAwMCkgIT0gMCkKKwkJaGl2ID0gMHhmZmZmZmZmZjsKKwkgICAgICBlbHNlCisJCWhpdiA9IDA7CisJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgdzIsIGhpdiwgNCk7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DXzMyOgorICAgICAgLyogSWYgd2UgYXJlIGRlbGV0aW5nIHRoaXMgcmVsb2MgZW50cnksIHdlIG11c3QgZmlsbCBpbiB0aGUKKwkgdmFsdWUgbm93LiAgVGhpcyBjYW4gaGFwcGVuIGlmIHdlIGhhdmUgYSAud29yZCB3aGljaCBpcyBub3QKKwkgcmVzb2x2ZWQgd2hlbiBpdCBhcHBlYXJzIGJ1dCBpcyBsYXRlciBkZWZpbmVkLiAgV2UgYWxzbyBuZWVkCisJIHRvIGZpbGwgaW4gdGhlIHZhbHVlIGlmIHRoaXMgaXMgYW4gZW1iZWRkZWQgUElDIHN3aXRjaCB0YWJsZQorCSBlbnRyeS4gICovCisgICAgICBpZiAoZml4UC0+ZnhfZG9uZQorCSAgfHwgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQyAmJiBTV0lUQ0hfVEFCTEUgKGZpeFApKSkKKwltZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKKwkJCSAgICB2YWx1ZSwgNCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DXzE2OgorICAgICAgLyogSWYgd2UgYXJlIGRlbGV0aW5nIHRoaXMgcmVsb2MgZW50cnksIHdlIG11c3QgZmlsbCBpbiB0aGUKKyAgICAgICAgIHZhbHVlIG5vdy4gICovCisgICAgICBhc3NlcnQgKGZpeFAtPmZ4X3NpemUgPT0gMik7CisgICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKKwltZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKKwkJCSAgICB2YWx1ZSwgMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CisgICAgICAvKiBXaGVuIGhhbmRsaW5nIGFuIGVtYmVkZGVkIFBJQyBzd2l0Y2ggc3RhdGVtZW50LCB3ZSBjYW4gd2luZAorCSB1cCBkZWxldGluZyBhIExPMTYgcmVsb2MuICBTZWUgdGhlICdvJyBjYXNlIGluIG1pcHNfaXAuICAqLworICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUpCisJeworCSAgaWYgKHZhbHVlIDwgLTB4ODAwMCB8fCB2YWx1ZSA+IDB4N2ZmZikKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOworCSAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOworCSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCSAgICBidWYgKz0gMjsKKwkgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMik7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKKyAgICAgIC8qCisgICAgICAgKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGJpdHMgaW4gdGhlIGluc3RydWN0aW9uIHNpbmNlIGZpeHVwX3NlZ21lbnQoKQorICAgICAgICogbWlnaHQgYmUgZGVsZXRpbmcgdGhlIHJlbG9jYXRpb24gZW50cnkgKGkuZS4sIGEgYnJhbmNoIHdpdGhpbgorICAgICAgICogdGhlIGN1cnJlbnQgc2VnbWVudCkuCisgICAgICAgKi8KKyAgICAgIGlmICgodmFsdWUgJiAweDMpICE9IDApCisJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkgICAgICBfKCJCcmFuY2ggdG8gb2RkIGFkZHJlc3MgKCVseCkiKSwgdmFsdWUpOworICAgICAgdmFsdWUgPj49IDI7CisKKyAgICAgIC8qIHVwZGF0ZSBvbGQgaW5zdHJ1Y3Rpb24gZGF0YSAqLworICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgKGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCk7CisgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJaW5zbiA9IChidWZbMF0gPDwgMjQpIHwgKGJ1ZlsxXSA8PCAxNikgfCAoYnVmWzJdIDw8IDgpIHwgYnVmWzNdOworICAgICAgZWxzZQorCWluc24gPSAoYnVmWzNdIDw8IDI0KSB8IChidWZbMl0gPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlswXTsKKworICAgICAgaWYgKHZhbHVlID49IC0weDgwMDAgJiYgdmFsdWUgPCAweDgwMDApCisJaW5zbiB8PSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgYnJhbmNoIG9mZnNldCBpcyB0b28gbGFyZ2UuICBJZiB0aGlzIGlzIGFuCisgICAgICAgICAgICAgdW5jb25kaXRpb25hbCBicmFuY2gsIGFuZCB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUsCisgICAgICAgICAgICAgd2UgY2FuIGNvbnZlcnQgaXQgdG8gYW4gYWJzb2x1dGUganVtcCBpbnN0cnVjdGlvbi4gICovCisJICBpZiAobWlwc19waWMgPT0gTk9fUElDCisJICAgICAgJiYgZml4UC0+ZnhfZG9uZQorCSAgICAgICYmIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgPj0gdGV4dF9zZWN0aW9uLT52bWEKKwkgICAgICAmJiAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcworCQkgIDwgdGV4dF9zZWN0aW9uLT52bWEgKyB0ZXh0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKKwkgICAgICAmJiAoKGluc24gJiAweGZmZmYwMDAwKSA9PSAweDEwMDAwMDAwCSAvKiBiZXEgJDAsJDAgKi8KKwkJICB8fCAoaW5zbiAmIDB4ZmZmZjAwMDApID09IDB4MDQwMTAwMDAJIC8qIGJnZXogJDAgKi8KKwkJICB8fCAoaW5zbiAmIDB4ZmZmZjAwMDApID09IDB4MDQxMTAwMDApKSAvKiBiZ2V6YWwgJDAgKi8KKwkgICAgeworCSAgICAgIGlmICgoaW5zbiAmIDB4ZmZmZjAwMDApID09IDB4MDQxMTAwMDApCSAvKiBiZ2V6YWwgJDAgKi8KKwkJaW5zbiA9IDB4MGMwMDAwMDA7CS8qIGphbCAqLworCSAgICAgIGVsc2UKKwkJaW5zbiA9IDB4MDgwMDAwMDA7CS8qIGogKi8KKwkgICAgICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfTUlQU19KTVA7CisJICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7CisJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAodGV4dF9zZWN0aW9uKTsKKwkgICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSAodmFsdWUgPDwgMikgKyBtZF9wY3JlbF9mcm9tIChmaXhQKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRklYTUUuICBJdCB3b3VsZCBiZSBwb3NzaWJsZSBpbiBwcmluY2lwbGUgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHdoaWNoIG92ZXJmbG93LiAgVGhleSBjb3VsZCBiZQorICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBpbnRvIGEgYnJhbmNoIGFyb3VuZCBhIGp1bXAuICBUaGlzIHdvdWxkCisgICAgICAgICAgICAgICAgIHJlcXVpcmUgc2V0dGluZyB1cCB2YXJpYW50IGZyYWdzIGZvciBlYWNoIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICBicmFuY2ggdHlwZS4gIFRoZSBuYXRpdmUgTUlQUyBhc3NlbWJsZXIgYXR0ZW1wdHMgdG8KKyAgICAgICAgICAgICAgICAgaGFuZGxlIHRoZXNlIGNhc2VzLCBidXQgaXQgYXBwZWFycyB0byBkbyBpdAorICAgICAgICAgICAgICAgICBpbmNvcnJlY3RseS4gICovCisJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICAgIF8oIkJyYW5jaCBvdXQgb2YgcmFuZ2UiKSk7CisJICAgIH0KKwl9CisKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgYnVmLCAodmFsdWVUKSBpbnNuLCA0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CisgICAgICBmaXhQLT5meF9kb25lID0gMDsKKyAgICAgIGlmIChmaXhQLT5meF9hZGRzeQorICAgICAgICAgICYmICFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQorICAgICAgICAgICYmICFTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKKyAgICAgICAgU19TRVRfV0VBSyAoZml4UC0+ZnhfYWRkc3kpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6CisgICAgICBmaXhQLT5meF9kb25lID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGludGVybmFsRXJyb3IgKCk7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisjaWYgMAordm9pZAorcHJpbnRJbnNuIChvYykKKyAgICAgdW5zaWduZWQgbG9uZyBvYzsKK3sKKyAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpwOworICBpbnQgdHJlZywgc3JlZywgZHJlZywgc2hhbXQ7CisgIHNob3J0IGltbTsKKyAgY29uc3QgY2hhciAqYXJnczsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7ICsraSkKKyAgICB7CisgICAgICBwID0gJm1pcHNfb3Bjb2Rlc1tpXTsKKyAgICAgIGlmICgoKG9jICYgcC0+bWFzaykgPT0gcC0+bWF0Y2gpICYmIChwLT5waW5mbyAhPSBJTlNOX01BQ1JPKSkKKwl7CisJICBwcmludGYgKCIlMDhseCAlc1x0Iiwgb2MsIHAtPm5hbWUpOworCSAgdHJlZyA9IChvYyA+PiAxNikgJiAweDFmOworCSAgc3JlZyA9IChvYyA+PiAyMSkgJiAweDFmOworCSAgZHJlZyA9IChvYyA+PiAxMSkgJiAweDFmOworCSAgc2hhbXQgPSAob2MgPj4gNikgJiAweDFmOworCSAgaW1tID0gb2M7CisJICBmb3IgKGFyZ3MgPSBwLT5hcmdzOzsgKythcmdzKQorCSAgICB7CisJICAgICAgc3dpdGNoICgqYXJncykKKwkJeworCQljYXNlICdcMCc6CisJCSAgcHJpbnRmICgiXG4iKTsKKwkJICBicmVhazsKKworCQljYXNlICcsJzoKKwkJY2FzZSAnKCc6CisJCWNhc2UgJyknOgorCQkgIHByaW50ZiAoIiVjIiwgKmFyZ3MpOworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgJ3InOgorCQkgIGFzc2VydCAodHJlZyA9PSBzcmVnKTsKKwkJICBwcmludGYgKCIkJWQsJCVkIiwgdHJlZywgc3JlZyk7CisJCSAgY29udGludWU7CisKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ0cnOgorCQkgIHByaW50ZiAoIiQlZCIsIGRyZWcpOworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgJ3QnOgorCQljYXNlICdFJzoKKwkJICBwcmludGYgKCIkJWQiLCB0cmVnKTsKKwkJICBjb250aW51ZTsKKworCQljYXNlICdrJzoKKwkJICBwcmludGYgKCIweCV4IiwgdHJlZyk7CisJCSAgY29udGludWU7CisKKwkJY2FzZSAnYic6CisJCWNhc2UgJ3MnOgorCQkgIHByaW50ZiAoIiQlZCIsIHNyZWcpOworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgJ2EnOgorCQkgIHByaW50ZiAoIjB4JTA4bHgiLCBvYyAmIDB4MWZmZmZmZik7CisJCSAgY29udGludWU7CisKKwkJY2FzZSAnaSc6CisJCWNhc2UgJ2onOgorCQljYXNlICdvJzoKKwkJY2FzZSAndSc6CisJCSAgcHJpbnRmICgiJWQiLCBpbW0pOworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgJzwnOgorCQljYXNlICc+JzoKKwkJICBwcmludGYgKCIkJWQiLCBzaGFtdCk7CisJCSAgY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJICBpbnRlcm5hbEVycm9yICgpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisgICAgfQorICBwcmludGYgKF8oIiUwOGx4ICBVTkRFRklORURcbiIpLCBvYyk7Cit9CisjZW5kaWYKKworc3RhdGljIHN5bWJvbFMgKgorZ2V0X3N5bWJvbCAoKQoreworICBpbnQgYzsKKyAgY2hhciAqbmFtZTsKKyAgc3ltYm9sUyAqcDsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHAgPSAoc3ltYm9sUyAqKSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgIHJldHVybiBwOworfQorCisvKiBBbGlnbiB0aGUgY3VycmVudCBmcmFnIHRvIGEgZ2l2ZW4gcG93ZXIgb2YgdHdvLiAgVGhlIE1JUFMgYXNzZW1ibGVyCisgICBhbHNvIGF1dG9tYXRpY2FsbHkgYWRqdXN0cyBhbnkgcHJlY2VkaW5nIGxhYmVsLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfYWxpZ24gKHRvLCBmaWxsLCBsYWJlbCkKKyAgICAgaW50IHRvOworICAgICBpbnQgZmlsbDsKKyAgICAgc3ltYm9sUyAqbGFiZWw7Cit7CisgIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKKyAgZnJhZ19hbGlnbiAodG8sIGZpbGwsIDApOworICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0byk7CisgIGlmIChsYWJlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobGFiZWwpID09IG5vd19zZWcpOworICAgICAgbGFiZWwtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKyAgICAgIFNfU0VUX1ZBTFVFIChsYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKKyAgICB9Cit9CisKKy8qIEFsaWduIHRvIGEgZ2l2ZW4gcG93ZXIgb2YgdHdvLiAgLmFsaWduIDAgdHVybnMgb2ZmIHRoZSBhdXRvbWF0aWMKKyAgIGFsaWdubWVudCB1c2VkIGJ5IHRoZSBkYXRhIGNyZWF0aW5nIHBzZXVkby1vcHMuICAqLworCitzdGF0aWMgdm9pZAorc19hbGlnbiAoeCkKKyAgICAgaW50IHg7Cit7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKKyAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7CisKKyAgLyoKKworICAgIG8gIE5vdGUgdGhhdCB0aGUgYXNzZW1ibGVyIHB1bGxzIGRvd24gYW55IGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgbGFiZWwKKyAgICAgICB0byB0aGUgYWxpZ25lZCBhZGRyZXNzLgorICAgIG8gIEl0J3Mgbm90IGRvY3VtZW50ZWQgYnV0IGF1dG8gYWxpZ25tZW50IGlzIHJlaW5zdGF0ZWQgYnkKKyAgICAgICBhIC5hbGlnbiBwc2V1ZG8gaW5zdHJ1Y3Rpb24uCisgICAgbyAgTm90ZSBhbHNvIHRoYXQgYWZ0ZXIgYXV0byBhbGlnbm1lbnQgaXMgdHVybmVkIG9mZiB0aGUgbWlwcyBhc3NlbWJsZXIKKyAgICAgICBpc3N1ZXMgYW4gZXJyb3Igb24gYXR0ZW1wdCB0byBhc3NlbWJsZSBhbiBpbXByb3Blcmx5IGFsaWduZWQgZGF0YSBpdGVtLgorICAgICAgIFdlIGRvbid0LgorCisgICAgKi8KKworICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKKyAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCB0ZW1wID0gbWF4X2FsaWdubWVudCk7CisgIGVsc2UgaWYgKHRlbXAgPCAwKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkLiIpKTsKKyAgICAgIHRlbXAgPSAwOworICAgIH0KKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgfQorICBlbHNlCisgICAgdGVtcF9maWxsID0gMDsKKyAgaWYgKHRlbXApCisgICAgeworICAgICAgYXV0b19hbGlnbiA9IDE7CisgICAgICBtaXBzX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsCisJCSAgaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGF1dG9fYWxpZ24gPSAwOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkCittaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCit7CisgIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKKyAgbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfY2hhbmdlX3NlYyAoc2VjKQorICAgICBpbnQgc2VjOworeworICBzZWdUIHNlZzsKKworICAvKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG9ubHkgdXNlIHRoZSAudGV4dCwgLmxpdDgsCisgICAgIC5zZGF0YSBhbmQgLnNic3Mgc2VjdGlvbnMuICBXZSBjaGFuZ2UgdGhlIC5kYXRhIGFuZCAucmRhdGEKKyAgICAgcHNldWRvLW9wcyB0byB1c2UgLnNkYXRhLiAgKi8KKyAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQworICAgICAgJiYgKHNlYyA9PSAnZCcgfHwgc2VjID09ICdyJykpCisgICAgc2VjID0gJ3MnOworCisjaWZkZWYgT0JKX0VMRgorICAvKiBUaGUgRUxGIGJhY2tlbmQgbmVlZHMgdG8ga25vdyB0aGF0IHdlIGFyZSBjaGFuZ2luZyBzZWN0aW9ucywgc28KKyAgICAgdGhhdCAucHJldmlvdXMgd29ya3MgY29ycmVjdGx5LiAgV2UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UgY2hlY2sKKyAgICAgZm9yIGEgb2JqX3NlY3Rpb25fY2hhbmdlX2hvb2sgbWFjcm8sIGJ1dCB0aGF0IG1pZ2h0IGJlIGNvbmZ1c2luZworICAgICBhcyBpdCB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgdG8gdXNlIGl0IGluIHRoZSBzZWN0aW9uIGNoYW5naW5nCisgICAgIGZ1bmN0aW9ucyBpbiByZWFkLmMsIHNpbmNlIG9iai1lbGYuYyBpbnRlcmNlcHRzIHRob3NlLiAgRklYTUU6CisgICAgIFRoaXMgc2hvdWxkIGJlIGNsZWFuZXIsIHNvbWVob3cuICAqLworICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7CisjZW5kaWYKKworICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7CisgIHN3aXRjaCAoc2VjKQorICAgIHsKKyAgICBjYXNlICd0JzoKKyAgICAgIHNfdGV4dCAoMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgIHNfZGF0YSAoMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncic6CisgICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKKwl7CisJICBzZWcgPSBzdWJzZWdfbmV3IChSREFUQV9TRUNUSU9OX05BTUUsCisJCQkgICAgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKwkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCisJICAgIHsKKwkgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAorCQkJCSAgICAgKFNFQ19BTExPQworCQkJCSAgICAgIHwgU0VDX0xPQUQKKwkJCQkgICAgICB8IFNFQ19SRUFET05MWQorCQkJCSAgICAgIHwgU0VDX1JFTE9DCisJCQkJICAgICAgfCBTRUNfREFUQSkpOworCSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCisJCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCA0KTsKKwkgICAgfQorCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJObyByZWFkIG9ubHkgZGF0YSBzZWN0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOworCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3MnOgorICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCisJeworCSAgc2VnID0gc3Vic2VnX25ldyAoIi5zZGF0YSIsIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisJICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorCSAgICB7CisJICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKKwkJCQkgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCisJCQkJICAgICB8IFNFQ19EQVRBKTsKKwkgICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQorCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgNCk7CisJICAgIH0KKwkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisJICBicmVhazsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJHbG9iYWwgcG9pbnRlcnMgbm90IHN1cHBvcnRlZDsgcmVjb21waWxlIC1HIDAiKSk7CisJICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgYXV0b19hbGlnbiA9IDE7Cit9CisKK3ZvaWQKK21pcHNfZW5hYmxlX2F1dG9fYWxpZ24gKCkKK3sKKyAgYXV0b19hbGlnbiA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitzX2NvbnMgKGxvZ19zaXplKQorICAgICBpbnQgbG9nX3NpemU7Cit7CisgIHN5bWJvbFMgKmxhYmVsOworCisgIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7CisgIG1pcHNfZW1pdF9kZWxheXMgKGZhbHNlKTsKKyAgaWYgKGxvZ19zaXplID4gMCAmJiBhdXRvX2FsaWduKQorICAgIG1pcHNfYWxpZ24gKGxvZ19zaXplLCAwLCBsYWJlbCk7CisgIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7CisgIGNvbnMgKDEgPDwgbG9nX3NpemUpOworfQorCitzdGF0aWMgdm9pZAorc19mbG9hdF9jb25zICh0eXBlKQorICAgICBpbnQgdHlwZTsKK3sKKyAgc3ltYm9sUyAqbGFiZWw7CisKKyAgbGFiZWwgPSBpbnNuX2xhYmVscyAhPSBOVUxMID8gaW5zbl9sYWJlbHMtPmxhYmVsIDogTlVMTDsKKworICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7CisKKyAgaWYgKGF1dG9fYWxpZ24pCisgICAgaWYgKHR5cGUgPT0gJ2QnKQorICAgICAgbWlwc19hbGlnbiAoMywgMCwgbGFiZWwpOworICAgIGVsc2UKKyAgICAgIG1pcHNfYWxpZ24gKDIsIDAsIGxhYmVsKTsKKworICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOworCisgIGZsb2F0X2NvbnMgKHR5cGUpOworfQorCisvKiBIYW5kbGUgLmdsb2JsLiAgV2UgbmVlZCB0byBvdmVycmlkZSBpdCBiZWNhdXNlIG9uIElyaXggNSB5b3UgYXJlCisgICBwZXJtaXR0ZWQgdG8gc2F5CisgICAgICAgLmdsb2JsIGZvbyAudGV4dAorICAgd2hlcmUgZm9vIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHRvIG1lYW4gdGhhdCBmb28gc2hvdWxkIGJlCisgICBjb25zaWRlcmVkIHRvIGJlIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorc19taXBzX2dsb2JsICh4KQorICAgICBpbnQgeDsKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50IGM7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisgIGZsYWd3b3JkIGZsYWc7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgLyogT24gSXJpeCA1LCBldmVyeSBnbG9iYWwgc3ltYm9sIHRoYXQgaXMgbm90IGV4cGxpY2l0bHkgbGFiZWxsZWQgYXMKKyAgICAgYmVpbmcgYSBmdW5jdGlvbiBpcyBhcHBhcmVudGx5IGxhYmVsbGVkIGFzIGJlaW5nIGFuIG9iamVjdC4gICovCisgIGZsYWcgPSBCU0ZfT0JKRUNUOworCisgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICBjaGFyICpzZWNuYW1lOworICAgICAgYXNlY3Rpb24gKnNlYzsKKworICAgICAgc2VjbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIHNlY25hbWUpOworICAgICAgaWYgKHNlYyA9PSBOVUxMKQorCWFzX2JhZCAoXygiJXM6IG5vIHN1Y2ggc2VjdGlvbiIpLCBzZWNuYW1lKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKKwlmbGFnID0gQlNGX0ZVTkNUSU9OOworICAgIH0KKworICBzeW1ib2xQLT5ic3ltLT5mbGFncyB8PSBmbGFnOworCisgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3Nfb3B0aW9uICh4KQorICAgICBpbnQgeDsKK3sKKyAgY2hhciAqb3B0OworICBjaGFyIGM7CisKKyAgb3B0ID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgaWYgKCpvcHQgPT0gJ08nKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBXaGF0IGRvZXMgdGhpcyBtZWFuPyAgKi8KKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKG9wdCwgInBpYyIsIDMpID09IDApCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGkgPSBhdG9pIChvcHQgKyAzKTsKKyAgICAgIGlmIChpID09IDApCisJbWlwc19waWMgPSBOT19QSUM7CisgICAgICBlbHNlIGlmIChpID09IDIpCisJbWlwc19waWMgPSBTVlI0X1BJQzsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oIi5vcHRpb24gcGljJWQgbm90IHN1cHBvcnRlZCIpLCBpKTsKKworICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQgJiYgbWlwc19waWMgPT0gU1ZSNF9QSUMpCisJeworCSAgaWYgKGdfc3dpdGNoX3NlZW4gJiYgZ19zd2l0Y2hfdmFsdWUgIT0gMCkKKwkgICAgYXNfd2FybiAoXygiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggU1ZSNCBQSUMgY29kZSIpKTsKKwkgIGdfc3dpdGNoX3ZhbHVlID0gMDsKKwkgIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCAwKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiVzXCIiKSwgb3B0KTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgc3RhY2sgb2YgLnNldCB2YWx1ZXMuICAqLworCitzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sKK3sKKyAgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICpuZXh0OworICBzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucyBvcHRpb25zOworfTsKKworc3RhdGljIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqbWlwc19vcHRzX3N0YWNrOworCisvKiBIYW5kbGUgdGhlIC5zZXQgcHNldWRvLW9wLiAgKi8KKworc3RhdGljIHZvaWQKK3NfbWlwc3NldCAoeCkKKyAgICAgaW50IHg7Cit7CisgIGNoYXIgKm5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXIsIGNoOworCisgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBjaCA9ICppbnB1dF9saW5lX3BvaW50ZXI7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOworCisgIGlmIChzdHJjbXAgKG5hbWUsICJyZW9yZGVyIikgPT0gMCkKKyAgICB7CisgICAgICBpZiAobWlwc19vcHRzLm5vcmVvcmRlciAmJiBwcmV2X25vcF9mcmFnICE9IE5VTEwpCisJeworCSAgLyogSWYgd2Ugc3RpbGwgaGF2ZSBwZW5kaW5nIG5vcHMsIHdlIGNhbiBkaXNjYXJkIHRoZW0uICBUaGUKKwkgICAgIHVzdWFsIG5vcCBoYW5kbGluZyB3aWxsIGluc2VydCBhbnkgdGhhdCBhcmUgc3RpbGwKKwkgICAgIG5lZWRlZC4gKi8KKwkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSAocHJldl9ub3BfZnJhZ19ob2xkcworCQkJCSAgICAqIChtaXBzX29wdHMubWlwczE2ID8gMiA6IDQpKTsKKwkgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOworCX0KKyAgICAgIG1pcHNfb3B0cy5ub3Jlb3JkZXIgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9yZW9yZGVyIikgPT0gMCkKKyAgICB7CisgICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKKyAgICAgIG1pcHNfb3B0cy5ub3Jlb3JkZXIgPSAxOworICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF0IikgPT0gMCkKKyAgICB7CisgICAgICBtaXBzX29wdHMubm9hdCA9IDA7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub2F0IikgPT0gMCkKKyAgICB7CisgICAgICBtaXBzX29wdHMubm9hdCA9IDE7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtYWNybyIpID09IDApCisgICAgeworICAgICAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vbWFjcm8iKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChtaXBzX29wdHMubm9yZW9yZGVyID09IDApCisJYXNfYmFkIChfKCJgbm9yZW9yZGVyJyBtdXN0IGJlIHNldCBiZWZvcmUgYG5vbWFjcm8nIikpOworICAgICAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vdmUiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgIm5vdm9sYXRpbGUiKSA9PSAwKQorICAgIHsKKyAgICAgIG1pcHNfb3B0cy5ub21vdmUgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9tb3ZlIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICJ2b2xhdGlsZSIpID09IDApCisgICAgeworICAgICAgbWlwc19vcHRzLm5vbW92ZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJib3B0IikgPT0gMCkKKyAgICB7CisgICAgICBtaXBzX29wdHMubm9ib3B0ID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vYm9wdCIpID09IDApCisgICAgeworICAgICAgbWlwc19vcHRzLm5vYm9wdCA9IDE7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtaXBzMTYiKSA9PSAwCisJICAgfHwgc3RyY21wIChuYW1lLCAiTUlQUy0xNiIpID09IDApCisgICAgbWlwc19vcHRzLm1pcHMxNiA9IDE7CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vbWlwczE2IikgPT0gMAorCSAgIHx8IHN0cmNtcCAobmFtZSwgIm5vTUlQUy0xNiIpID09IDApCisgICAgbWlwc19vcHRzLm1pcHMxNiA9IDA7CisgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICJtaXBzIiwgNCkgPT0gMCkKKyAgICB7CisgICAgICBpbnQgaXNhOworCisgICAgICAvKiBQZXJtaXQgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBJU0Egb24gdGhlIGZseS4gIE5lZWRsZXNzIHRvCisJIHNheSwgbWlzdXNlIGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zLiAgKi8KKyAgICAgIGlzYSA9IGF0b2kgKG5hbWUgKyA0KTsKKyAgICAgIGlmIChpc2EgPT0gMCkKKwltaXBzX29wdHMuaXNhID0gZmlsZV9taXBzX2lzYTsKKyAgICAgIGVsc2UgaWYgKGlzYSA8IDEgfHwgaXNhID4gNCkKKwlhc19iYWQgKF8oInVua25vd24gSVNBIGxldmVsIikpOworICAgICAgZWxzZQorCW1pcHNfb3B0cy5pc2EgPSBpc2E7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJhdXRvZXh0ZW5kIikgPT0gMCkKKyAgICBtaXBzX29wdHMubm9hdXRvZXh0ZW5kID0gMDsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9hdXRvZXh0ZW5kIikgPT0gMCkKKyAgICBtaXBzX29wdHMubm9hdXRvZXh0ZW5kID0gMTsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicHVzaCIpID09IDApCisgICAgeworICAgICAgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICpzOworCisgICAgICBzID0gKHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKnMpOworICAgICAgcy0+bmV4dCA9IG1pcHNfb3B0c19zdGFjazsKKyAgICAgIHMtPm9wdGlvbnMgPSBtaXBzX29wdHM7CisgICAgICBtaXBzX29wdHNfc3RhY2sgPSBzOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicG9wIikgPT0gMCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKnM7CisKKyAgICAgIHMgPSBtaXBzX29wdHNfc3RhY2s7CisgICAgICBpZiAocyA9PSBOVUxMKQorCWFzX2JhZCAoXygiLnNldCBwb3Agd2l0aCBubyAuc2V0IHB1c2giKSk7CisgICAgICBlbHNlCisJeworCSAgLyogSWYgd2UncmUgY2hhbmdpbmcgdGhlIHJlb3JkZXIgbW9kZSB3ZSBuZWVkIHRvIGhhbmRsZQorICAgICAgICAgICAgIGRlbGF5IHNsb3RzIGNvcnJlY3RseS4gICovCisJICBpZiAocy0+b3B0aW9ucy5ub3Jlb3JkZXIgJiYgISBtaXBzX29wdHMubm9yZW9yZGVyKQorCSAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKKwkgIGVsc2UgaWYgKCEgcy0+b3B0aW9ucy5ub3Jlb3JkZXIgJiYgbWlwc19vcHRzLm5vcmVvcmRlcikKKwkgICAgeworCSAgICAgIGlmIChwcmV2X25vcF9mcmFnICE9IE5VTEwpCisJCXsKKwkJICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gKHByZXZfbm9wX2ZyYWdfaG9sZHMKKwkJCQkJICAgICogKG1pcHNfb3B0cy5taXBzMTYgPyAyIDogNCkpOworCQkgIHByZXZfbm9wX2ZyYWcgPSBOVUxMOworCQl9CisJICAgIH0KKworCSAgbWlwc19vcHRzID0gcy0+b3B0aW9uczsKKwkgIG1pcHNfb3B0c19zdGFjayA9IHMtPm5leHQ7CisJICBmcmVlIChzKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfd2FybiAoXygiVHJpZWQgdG8gc2V0IHVucmVjb2duaXplZCBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7CisgICAgfQorICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2g7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLmFiaWNhbGxzIHBzZXVkby1vcC4gIEkgYmVsaWV2ZSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgIC5vcHRpb24gcGljMi4gIEl0IG1lYW5zIHRvIGdlbmVyYXRlIFNWUjQgUElDIGNhbGxzLiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWJpY2FsbHMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgbWlwc19waWMgPSBTVlI0X1BJQzsKKyAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCisgICAgeworICAgICAgaWYgKGdfc3dpdGNoX3NlZW4gJiYgZ19zd2l0Y2hfdmFsdWUgIT0gMCkKKwlhc193YXJuIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IFBJQyBjb2RlIikpOworICAgICAgZ19zd2l0Y2hfdmFsdWUgPSAwOworICAgIH0KKyAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIDApOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIC5jcGxvYWQgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBTVlI0CisgICBQSUMgY29kZS4gIEl0IHNldHMgdGhlICRncCByZWdpc3RlciBmb3IgdGhlIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZQorICAgZnVuY3Rpb24gYWRkcmVzcywgd2hpY2ggaXMgaW4gdGhlIHJlZ2lzdGVyIG5hbWVkIGluIHRoZSBhcmd1bWVudC4KKyAgIFRoaXMgdXNlcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBfZ3BfZGlzcCwgd2hpY2ggaXMgaGFuZGxlZCBzcGVjaWFsbHkKKyAgIGJ5IHRoZSBsaW5rZXIuICBUaGUgcmVzdWx0IGlzOgorCWx1aQkkZ3AsJWhpKF9ncF9kaXNwKQorCWFkZGl1CSRncCwkZ3AsJWxvKF9ncF9kaXNwKQorCWFkZHUJJGdwLCRncCwuY3Bsb2FkIGFyZ3VtZW50CisgICBUaGUgLmNwbG9hZCBhcmd1bWVudCBpcyBub3JtYWxseSAkMjUgPT0gJHQ5LiAgKi8KKworc3RhdGljIHZvaWQKK3NfY3Bsb2FkIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGV4cHJlc3Npb25TIGV4OworICBpbnQgaWNudCA9IDA7CisKKyAgLyogSWYgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUsIC5jcGxvYWQgaXMgaWdub3JlZC4gICovCisgIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKKyAgICB7CisgICAgICBzX2lnbm9yZSAoMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIC5jcGxvYWQgc2hvdWxkIGJlIGEgaW4gLnNldCBub3Jlb3JkZXIgc2VjdGlvbi4gICovCisgIGlmIChtaXBzX29wdHMubm9yZW9yZGVyID09IDApCisgICAgYXNfd2FybiAoXygiLmNwbG9hZCBub3QgaW4gbm9yZW9yZGVyIHNlY3Rpb24iKSk7CisKKyAgZXguWF9vcCA9IE9fc3ltYm9sOworICBleC5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgiX2dwX2Rpc3AiKTsKKyAgZXguWF9vcF9zeW1ib2wgPSBOVUxMOworICBleC5YX2FkZF9udW1iZXIgPSAwOworCisgIC8qIEluIEVMRiwgdGhpcyBzeW1ib2wgaXMgaW1wbGljaXRseSBhbiBTVFRfT0JKRUNUIHN5bWJvbC4gICovCisgIGV4LlhfYWRkX3N5bWJvbC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKKworICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsIEdQKTsKKyAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXgsICJhZGRpdSIsICJ0LHIsaiIsIEdQLCBHUCwKKwkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOworCisgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJhZGR1IiwgImQsdix0IiwKKwkgICAgICAgR1AsIEdQLCB0Y19nZXRfcmVnaXN0ZXIgKDApKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLiAgVGhpcyBzdG9yZXMgJGdwIGludG8gYSBnaXZlbgorICAgb2Zmc2V0IGZyb20gJHNwLiAgVGhlIG9mZnNldCBpcyByZW1lbWJlcmVkLCBhbmQgYWZ0ZXIgbWFraW5nIGEgUElDCisgICBjYWxsICRncCBpcyByZXN0b3JlZCBmcm9tIHRoYXQgbG9jYXRpb24uICAqLworCitzdGF0aWMgdm9pZAorc19jcHJlc3RvcmUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgZXhwcmVzc2lvblMgZXg7CisgIGludCBpY250ID0gMDsKKworICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwcmVzdG9yZSBpcyBpZ25vcmVkLiAgKi8KKyAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQorICAgIHsKKyAgICAgIHNfaWdub3JlICgwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisKKyAgZXguWF9vcCA9IE9fY29uc3RhbnQ7CisgIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7CisgIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKKyAgZXguWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OworCisgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LAorCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKKwkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQorCQk/ICJzdyIgOiAic2QiKSwKKwkgICAgICAgInQsbyhiKSIsIEdQLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgU1ApOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLmdwd29yZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFBJQworICAgY29kZS4gIEl0IGdlbmVyYXRlcyBhIDMyIGJpdCBHUCByZWxhdGl2ZSByZWxvYy4gICovCisKK3N0YXRpYyB2b2lkCitzX2dwd29yZCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzeW1ib2xTICpsYWJlbDsKKyAgZXhwcmVzc2lvblMgZXg7CisgIGNoYXIgKnA7CisKKyAgLyogV2hlbiBub3QgZ2VuZXJhdGluZyBQSUMgY29kZSwgdGhpcyBpcyB0cmVhdGVkIGFzIC53b3JkLiAgKi8KKyAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQorICAgIHsKKyAgICAgIHNfY29ucyAoMik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7CisgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOworICBpZiAoYXV0b19hbGlnbikKKyAgICBtaXBzX2FsaWduICgyLCAwLCBsYWJlbCk7CisgIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7CisKKyAgZXhwcmVzc2lvbiAoJmV4KTsKKworICBpZiAoZXguWF9vcCAhPSBPX3N5bWJvbCB8fCBleC5YX2FkZF9udW1iZXIgIT0gMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIlVuc3VwcG9ydGVkIHVzZSBvZiAuZ3B3b3JkIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CisKKyAgcCA9IGZyYWdfbW9yZSAoNCk7CisgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgMCwgNCk7CisgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LCAmZXgsIDAsCisJICAgICAgIEJGRF9SRUxPQ19NSVBTX0dQUkVMMzIpOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLmNwYWRkIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCBzd2l0Y2gKKyAgIHRhYmxlcyBpbiBTVlI0IFBJQyBjb2RlLiAgKi8KKworc3RhdGljIHZvaWQKK3NfY3BhZGQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IGljbnQgPSAwOworICBpbnQgcmVnOworCisgIC8qIFRoaXMgaXMgaWdub3JlZCB3aGVuIG5vdCBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUuICAqLworICBpZiAobWlwc19waWMgIT0gU1ZSNF9QSUMpCisgICAgeworICAgICAgc19pZ25vcmUgKDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBBZGQgJGdwIHRvIHRoZSByZWdpc3RlciBuYW1lZCBhcyBhbiBhcmd1bWVudC4gICovCisgIHJlZyA9IHRjX2dldF9yZWdpc3RlciAoMCk7CisgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCisJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgorCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCisJCT8gImFkZHUiIDogImRhZGR1IiksCisJICAgICAgICJkLHYsdCIsIHJlZywgcmVnLCBHUCk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsgIAorfQorCisvKiBIYW5kbGUgdGhlIC5pbnNuIHBzZXVkby1vcC4gIFRoaXMgbWFya3MgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluCisgICBtaXBzMTYgbW9kZS4gIFRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGhhbmRsZSB0aGVtIHNwZWNpYWxseSwKKyAgIHN1Y2ggYXMgZ2VuZXJhdGluZyBqYWx4IGluc3RydWN0aW9ucyB3aGVuIG5lZWRlZC4gIFdlIGFsc28gbWFrZQorICAgdGhlbSBvZGQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXNzZW1ibHksIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZQorICAgcmlnaHQgc29ydCBvZiBjb2RlLiAgV2Ugd2lsbCBtYWtlIHRoZW0gZXZlbiBpbiB0aGUgYWRqdXN0X3N5bXRhYgorICAgcm91dGluZSwgd2hpbGUgbGVhdmluZyB0aGVtIG1hcmtlZC4gIFRoaXMgaXMgY29udmVuaWVudCBmb3IgdGhlCisgICBkZWJ1Z2dlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4gIFRoZSBsaW5rZXIga25vd3MgdG8gbWFrZSB0aGVtIG9kZAorICAgYWdhaW4uICAqLworCitzdGF0aWMgdm9pZAorc19pbnNuIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChtaXBzX29wdHMubWlwczE2KQorICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuc3RhYm4gZGlyZWN0aXZlLiAgV2UgbmVlZCB0aGVzZSBpbiBvcmRlciB0byBtYXJrIGEgbGFiZWwKKyAgIGFzIGJlaW5nIGEgbWlwczE2IHRleHQgbGFiZWwgY29ycmVjdGx5LiAgU29tZXRpbWVzIHRoZSBjb21waWxlcgorICAgd2lsbCBlbWl0IGEgbGFiZWwsIGZvbGxvd2VkIGJ5IGEgLnN0YWJuLCBhbmQgdGhlbiBzd2l0Y2ggc2VjdGlvbnMuCisgICBJZiB0aGUgbGFiZWwgYW5kIC5zdGFibiBhcmUgaW4gbWlwczE2IG1vZGUsIHRoZW4gdGhlIGxhYmVsIGlzCisgICByZWFsbHkgYSBtaXBzMTYgdGV4dCBsYWJlbC4gICovCisKK3N0YXRpYyB2b2lkCitzX21pcHNfc3RhYiAodHlwZSkKKyAgICAgaW50IHR5cGU7Cit7CisgIGlmICh0eXBlID09ICduJyAmJiBtaXBzX29wdHMubWlwczE2KQorICAgIG1pcHMxNl9tYXJrX2xhYmVscyAoKTsKKworICBzX3N0YWIgKHR5cGUpOworfQorCisvKiBIYW5kbGUgdGhlIC53ZWFrZXh0IHBzZXVkby1vcCBhcyBkZWZpbmVkIGluIEthbmUgYW5kIEhlaW5yaWNoLgorICovCisKK3N0YXRpYyB2b2lkCitzX21pcHNfd2Vha2V4dCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgYzsKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgZXhwcmVzc2lvblMgZXhwOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKKwl7CisJICBhc19iYWQgKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIsCisJCSAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOworCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICAKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwl7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwl9CisgICAgICAKKyAgICAgIGV4cHJlc3Npb24gKCZleHApOworICAgICAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQorCXsKKwkgIGFzX2JhZCAoImJhZCAud2Vha2V4dCBkaXJlY3RpdmUiKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzeW1ib2xQLT5zeV92YWx1ZSA9IGV4cDsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogUGFyc2UgYSByZWdpc3RlciBzdHJpbmcgaW50byBhIG51bWJlci4gIENhbGxlZCBmcm9tIHRoZSBFQ09GRiBjb2RlCisgICB0byBwYXJzZSAuZnJhbWUuICBUaGUgYXJndW1lbnQgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgZnJhbWUKKyAgIHJlZ2lzdGVyLCBzbyB0aGF0IHdlIGNhbiByZWNvcmQgaXQgaW4gbWlwc19mcmFtZV9yZWcuICAqLworCitpbnQKK3RjX2dldF9yZWdpc3RlciAoZnJhbWUpCisgICAgIGludCBmcmFtZTsKK3sKKyAgaW50IHJlZzsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyQnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oImV4cGVjdGVkIGAkJyIpKTsKKyAgICAgIHJlZyA9IDA7CisgICAgfQorICBlbHNlIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCisgICAgeworICAgICAgcmVnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBpZiAocmVnIDwgMCB8fCByZWcgPj0gMzIpCisJeworCSAgYXNfd2FybiAoXygiQmFkIHJlZ2lzdGVyIG51bWJlciIpKTsKKwkgIHJlZyA9IDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmcCIsIDIpID09IDApCisJcmVnID0gRlA7CisgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzcCIsIDIpID09IDApCisJcmVnID0gU1A7CisgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJncCIsIDIpID09IDApCisJcmVnID0gR1A7CisgICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJhdCIsIDIpID09IDApCisJcmVnID0gQVQ7CisgICAgICBlbHNlCisJeworCSAgYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIHJlZ2lzdGVyIG5hbWUiKSk7CisJICByZWcgPSAwOworCX0KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOworICAgIH0KKyAgaWYgKGZyYW1lKQorICAgIG1pcHNfZnJhbWVfcmVnID0gcmVnICE9IDAgPyByZWcgOiBTUDsKKyAgcmV0dXJuIHJlZzsKK30KKwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCisgICAgIGFzZWN0aW9uICpzZWc7CisgICAgIHZhbHVlVCBhZGRyOworeworICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7CisKKyNpZmRlZiBPQkpfRUxGCisgIC8qIFdlIGRvbid0IG5lZWQgdG8gYWxpZ24gRUxGIHNlY3Rpb25zIHRvIHRoZSBmdWxsIGFsaWdubWVudC4KKyAgICAgSG93ZXZlciwgSXJpeCA1IG1heSBwcmVmZXIgdGhhdCB3ZSBhbGlnbiB0aGVtIGF0IGxlYXN0IHRvIGEgMTYKKyAgICAgYnl0ZSBib3VuZGFyeS4gIFdlIGRvbid0IGJvdGhlciB0byBhbGlnbiB0aGUgc2VjdGlvbnMgaWYgd2UgYXJlCisgICAgIHRhcmdldGVkIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uICAqLworICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSA9PSAwKQorICAgIHJldHVybiBhZGRyOworICBpZiAoYWxpZ24gPiA0KQorICAgIGFsaWduID0gNDsKKyNlbmRpZgorCisgIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOworfQorCisvKiBVdGlsaXR5IHJvdXRpbmUsIGNhbGxlZCBmcm9tIGFib3ZlIGFzIHdlbGwuICBJZiBjYWxsZWQgd2hpbGUgdGhlCisgICBpbnB1dCBmaWxlIGlzIHN0aWxsIGJlaW5nIHJlYWQsIGl0J3Mgb25seSBhbiBhcHByb3hpbWF0aW9uLiAgKEZvcgorICAgZXhhbXBsZSwgYSBzeW1ib2wgbWF5IGxhdGVyIGJlY29tZSBkZWZpbmVkIHdoaWNoIGFwcGVhcmVkIHRvIGJlCisgICB1bmRlZmluZWQgZWFybGllci4pICAqLworCitzdGF0aWMgaW50Citub3BpY19uZWVkX3JlbGF4IChzeW0sIGJlZm9yZV9yZWxheGluZykKKyAgICAgc3ltYm9sUyAqc3ltOworICAgICBpbnQgYmVmb3JlX3JlbGF4aW5nOworeworICBpZiAoc3ltID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKKyAgICAgIGludCBjaGFuZ2U7CisKKyAgICAgIC8qIEZpbmQgb3V0IHdoZXRoZXIgdGhpcyBzeW1ib2wgY2FuIGJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUAorCSByZWdpc3Rlci4gIEl0IGNhbiBiZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIC1HIHNpemUgb3IgaWYKKwkgaXQgaXMgaW4gdGhlIC5zZGF0YSBvciAuc2JzcyBzZWN0aW9uLiAgQ2VydGFpbiBzeW1ib2xzIGNhbgorCSBub3QgYmUgcmVmZXJlbmNlZCBvZmYgdGhlIEdQLCBhbHRob3VnaCBpdCBhcHBlYXJzIGFzIHRob3VnaAorCSB0aGV5IGNhbi4gICovCisgICAgICBzeW1uYW1lID0gU19HRVRfTkFNRSAoc3ltKTsKKyAgICAgIGlmIChzeW1uYW1lICE9IChjb25zdCBjaGFyICopIE5VTEwKKwkgICYmIChzdHJjbXAgKHN5bW5hbWUsICJlcHJvbCIpID09IDAKKwkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJldGV4dCIpID09IDAKKwkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZ3AiKSA9PSAwCisJICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiZWRhdGEiKSA9PSAwCisJICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2Zic3MiKSA9PSAwCisJICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2ZkYXRhIikgPT0gMAorCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9mdGV4dCIpID09IDAKKwkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJlbmQiKSA9PSAwCisJICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKSkKKwljaGFuZ2UgPSAxOworICAgICAgZWxzZSBpZiAoKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKQorCSAgICAgICAmJiAoMAorI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKKwkJICAgfHwgKHN5bS0+ZWNvZmZfZXh0ZXJuX3NpemUgIT0gMAorCQkgICAgICAgJiYgc3ltLT5lY29mZl9leHRlcm5fc2l6ZSA8PSBnX3N3aXRjaF92YWx1ZSkKKyNlbmRpZgorCQkgICAvKiBXZSBtdXN0IGRlZmVyIHRoaXMgZGVjaXNpb24gdW50aWwgYWZ0ZXIgdGhlIHdob2xlCisJCSAgICAgIGZpbGUgaGFzIGJlZW4gcmVhZCwgc2luY2UgdGhlcmUgbWlnaHQgYmUgYSAuZXh0ZXJuCisJCSAgICAgIGFmdGVyIHRoZSBmaXJzdCB1c2Ugb2YgdGhpcyBzeW1ib2wuICAqLworCQkgICB8fCAoYmVmb3JlX3JlbGF4aW5nCisjaWZuZGVmIE5PX0VDT0ZGX0RFQlVHR0lORworCQkgICAgICAgJiYgc3ltLT5lY29mZl9leHRlcm5fc2l6ZSA9PSAwCisjZW5kaWYKKwkJICAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IDApCisJCSAgIHx8IChTX0dFVF9WQUxVRSAoc3ltKSAhPSAwCisJCSAgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA8PSBnX3N3aXRjaF92YWx1ZSkpKQorCWNoYW5nZSA9IDA7CisgICAgICBlbHNlCisJeworCSAgY29uc3QgY2hhciAqc2VnbmFtZTsKKworCSAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSk7CisJICBhc3NlcnQgKHN0cmNtcCAoc2VnbmFtZSwgIi5saXQ4IikgIT0gMAorCQkgICYmIHN0cmNtcCAoc2VnbmFtZSwgIi5saXQ0IikgIT0gMCk7CisJICBjaGFuZ2UgPSAoc3RyY21wIChzZWduYW1lLCAiLnNkYXRhIikgIT0gMAorCQkgICAgJiYgc3RyY21wIChzZWduYW1lLCAiLnNic3MiKSAhPSAwKTsKKwl9CisgICAgICByZXR1cm4gY2hhbmdlOworICAgIH0KKyAgZWxzZQorICAgIC8qIFdlIGFyZSBub3Qgb3B0aW1pemluZyBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KKyAgICByZXR1cm4gMTsKK30KKworLyogR2l2ZW4gYSBtaXBzMTYgdmFyaWFudCBmcmFnIEZSQUdQLCByZXR1cm4gbm9uLXplcm8gaWYgaXQgbmVlZHMgYW4KKyAgIGV4dGVuZGVkIG9wY29kZS4gIFNFQyBpcyB0aGUgc2VjdGlvbiB0aGUgZnJhZyBpcyBpbi4gICovCisKK3N0YXRpYyBpbnQKK21pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VjLCBzdHJldGNoKQorICAgICBmcmFnUyAqZnJhZ3A7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGxvbmcgc3RyZXRjaDsKK3sKKyAgaW50IHR5cGU7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7CisgIG9mZnNldFQgdmFsOworICBpbnQgbWludGlueSwgbWF4dGlueTsKKyAgc2VnVCBzeW1zZWM7CisKKyAgaWYgKFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMIChmcmFncC0+ZnJfc3VidHlwZSkpCisgICAgcmV0dXJuIDA7CisgIGlmIChSRUxBWF9NSVBTMTZfVVNFUl9FWFQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKKyAgICByZXR1cm4gMTsKKworICB0eXBlID0gUkVMQVhfTUlQUzE2X1RZUEUgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKKyAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7CisgIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQorICAgIHsKKyAgICAgICsrb3A7CisgICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7CisgICAgfQorCisgIGlmIChvcC0+dW5zcCkKKyAgICB7CisgICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCisJeworCSAgbWludGlueSA9IDE7CisJICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1pbnRpbnkgPSAwOworCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOworICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOworICAgIH0KKworICAvKiBXZSBjYW4ndCBjYWxsIFNfR0VUX1ZBTFVFIGhlcmUsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBsb2NrIGluCisgICAgIGEgcGFydGljdWxhciBmcmFnIGFkZHJlc3MuICAqLworICBpZiAoZnJhZ3AtPmZyX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIHZhbCA9IChmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIKKwkgICAgICsgZnJhZ3AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7CisgICAgICBzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChmcmFncC0+ZnJfc3ltYm9sKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdwLT5mcl9zeW1ib2wtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKKwkgICAmJiAoZnJhZ3AtPmZyX3N5bWJvbC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sLT5zeV92YWx1ZS5YX29wCisJICAgICAgID09IE9fY29uc3RhbnQpKQorICAgIHsKKyAgICAgIHZhbCA9IChmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX251bWJlcgorCSAgICAgKyBmcmFncC0+ZnJfc3ltYm9sLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wtPnN5X2ZyYWctPmZyX2FkZHJlc3MKKwkgICAgICsgZnJhZ3AtPmZyX3N5bWJvbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyCisJICAgICArIGZyYWdwLT5mcl9zeW1ib2wtPnN5X2ZyYWctPmZyX2FkZHJlc3MpOworICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gMTsKKworICBpZiAob3AtPnBjcmVsKQorICAgIHsKKyAgICAgIGFkZHJlc3NUIGFkZHI7CisKKyAgICAgIC8qIFdlIHdvbid0IGhhdmUgdGhlIHNlY3Rpb24gd2hlbiB3ZSBhcmUgY2FsbGVkIGZyb20KKyAgICAgICAgIG1pcHNfcmVsYXhfZnJhZy4gIEhvd2V2ZXIsIHdlIHdpbGwgYWx3YXlzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgIGZyb20gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggZmlyc3QuICBJZiB0aGlzIGlzIGEKKyAgICAgICAgIGJyYW5jaCB0byBhIGRpZmZlcmVudCBzZWN0aW9uLCB3ZSBtYXJrIGl0IGFzIHN1Y2guICBJZiBTRUMgaXMKKyAgICAgICAgIE5VTEwsIGFuZCB0aGUgZnJhZyBpcyBub3QgbWFya2VkLCB0aGVuIGl0IG11c3QgYmUgYSBicmFuY2ggdG8KKyAgICAgICAgIHRoZSBzYW1lIHNlY3Rpb24uICAqLworICAgICAgaWYgKHNlYyA9PSBOVUxMKQorCXsKKwkgIGlmIChSRUxBWF9NSVBTMTZfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKSkKKwkgICAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChzeW1zZWMgIT0gc2VjKQorCSAgICB7CisJICAgICAgZnJhZ3AtPmZyX3N1YnR5cGUgPQorCQlSRUxBWF9NSVBTMTZfTUFSS19MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpOworCisJICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBzdXBwb3J0IHRoaXMsIGFuZCBsZXQgdGhlIGxpbmtlcgorICAgICAgICAgICAgICAgICBjYXRjaCBicmFuY2hlcyBhbmQgbG9hZHMgdGhhdCBhcmUgb3V0IG9mIHJhbmdlLiAgKi8KKwkgICAgICBhc19iYWRfd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwKKwkJCSAgICBfKCJ1bnN1cHBvcnRlZCBQQyByZWxhdGl2ZSByZWZlcmVuY2UgdG8gZGlmZmVyZW50IHNlY3Rpb24iKSk7CisKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKworICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBrbm93IGZvciBzdXJlIHRoYXQgdGhlIHN5bWJvbCBmcmFnbWVudCBpcyBpbgorCSB0aGUgc2FtZSBzZWN0aW9uLiAgSWYgdGhlIGZyX2FkZHJlc3Mgb2YgdGhlIHN5bWJvbCBmcmFnbWVudAorCSBpcyBncmVhdGVyIHRoZW4gdGhlIGFkZHJlc3Mgb2YgdGhpcyBmcmFnbWVudCB3ZSB3YW50IHRvIGFkZAorCSBpbiBTVFJFVENIIGluIG9yZGVyIHRvIGdldCBhIGJldHRlciBlc3RpbWF0ZSBvZiB0aGUgYWRkcmVzcy4KKwkgVGhpcyBwYXJ0aWN1bGFybHkgbWF0dGVycyBiZWNhdXNlIG9mIHRoZSBzaGlmdCBiaXRzLiAgKi8KKyAgICAgIGlmIChzdHJldGNoICE9IDAKKwkgICYmIGZyYWdwLT5mcl9zeW1ib2wtPnN5X2ZyYWctPmZyX2FkZHJlc3MgPj0gZnJhZ3AtPmZyX2FkZHJlc3MpCisJeworCSAgZnJhZ1MgKmY7CisKKwkgIC8qIEFkanVzdCBzdHJldGNoIGZvciBhbnkgYWxpZ25tZW50IGZyYWcuICBOb3RlIHRoYXQgaWYgaGF2ZQorICAgICAgICAgICAgIGJlZW4gZXhwYW5kaW5nIHRoZSBlYXJsaWVyIGNvZGUsIHRoZSBzeW1ib2wgbWF5IGJlCisgICAgICAgICAgICAgZGVmaW5lZCBpbiB3aGF0IGFwcGVhcnMgdG8gYmUgYW4gZWFybGllciBmcmFnLiAgRklYTUU6CisgICAgICAgICAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSB0aGUgZnJfc3VidHlwZSBmaWVsZCwgd2hpY2ggc3BlY2lmaWVzCisgICAgICAgICAgICAgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBza2lwIHdoZW4gZG9pbmcgYW4KKyAgICAgICAgICAgICBhbGlnbm1lbnQuICAqLworCSAgZm9yIChmID0gZnJhZ3A7CisJICAgICAgIGYgIT0gTlVMTCAmJiBmICE9IGZyYWdwLT5mcl9zeW1ib2wtPnN5X2ZyYWc7CisJICAgICAgIGYgPSBmLT5mcl9uZXh0KQorCSAgICB7CisJICAgICAgaWYgKGYtPmZyX3R5cGUgPT0gcnNfYWxpZ24gfHwgZi0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlKQorCQl7CisJCSAgaWYgKHN0cmV0Y2ggPCAwKQorCQkgICAgc3RyZXRjaCA9IC0gKCgtIHN0cmV0Y2gpCisJCQkJICYgfiAoKDEgPDwgKGludCkgZi0+ZnJfb2Zmc2V0KSAtIDEpKTsKKwkJICBlbHNlCisJCSAgICBzdHJldGNoICY9IH4gKCgxIDw8IChpbnQpIGYtPmZyX29mZnNldCkgLSAxKTsKKwkJICBpZiAoc3RyZXRjaCA9PSAwKQorCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgaWYgKGYgIT0gTlVMTCkKKwkgICAgdmFsICs9IHN0cmV0Y2g7CisJfQorCisgICAgICBhZGRyID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OworCisgICAgICAvKiBUaGUgYmFzZSBhZGRyZXNzIHJ1bGVzIGFyZSBjb21wbGljYXRlZC4gIFRoZSBiYXNlIGFkZHJlc3Mgb2YKKyAgICAgICAgIGEgYnJhbmNoIGlzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICBUaGUgYmFzZSBhZGRyZXNzIG9mIGEKKyAgICAgICAgIFBDIHJlbGF0aXZlIGxvYWQgb3IgYWRkIGlzIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsIGJ1dCBpZiBpdAorICAgICAgICAgaXMgaW4gYSBkZWxheSBzbG90IChpbiB3aGljaCBjYXNlIGl0IGNhbiBub3QgYmUgZXh0ZW5kZWQpIHVzZQorICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHdob3NlIGRlbGF5IHNsb3QgaXQgaXMgaW4uICAqLworICAgICAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQorCXsKKwkgIGFkZHIgKz0gMjsKKworCSAgLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3N1bWluZyB0aGF0IHRoaXMgZnJhZyBzaG91bGQgYmUKKwkgICAgIGV4dGVuZGVkLCB0aGVuLCB0aGUgY3VycmVudCBhZGRyZXNzIGlzIHR3byBieXRlcworCSAgICAgaGlnaGVyLiAqLworCSAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQorCSAgICBhZGRyICs9IDI7CisKKwkgIC8qIElnbm9yZSB0aGUgbG93IGJpdCBpbiB0aGUgdGFyZ2V0LCBzaW5jZSBpdCB3aWxsIGJlIHNldAorICAgICAgICAgICAgIGZvciBhIHRleHQgbGFiZWwuICAqLworCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQorCSAgICAtLXZhbDsKKwl9CisgICAgICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCisJYWRkciAtPSA0OworICAgICAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCisJYWRkciAtPSAyOworCisgICAgICB2YWwgLT0gYWRkciAmIH4gKCgxIDw8IG9wLT5zaGlmdCkgLSAxKTsKKworICAgICAgLyogQnJhbmNoIG9mZnNldHMgaGF2ZSBhbiBpbXBsaWNpdCAwIGluIHRoZSBsb3dlc3QgYml0LiAgKi8KKyAgICAgIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKKwl2YWwgLz0gMjsKKworICAgICAgLyogSWYgYW55IG9mIHRoZSBzaGlmdGVkIGJpdHMgYXJlIHNldCwgd2UgbXVzdCB1c2UgYW4gZXh0ZW5kZWQKKyAgICAgICAgIG9wY29kZS4gIElmIHRoZSBhZGRyZXNzIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhpcworICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoaXMgY2FuIGxlYWQgdG8gYSBsb29wLCBzbyB3ZSBhcnJhbmdlIHRvIGFsd2F5cworICAgICAgICAgdXNlIGFuIGV4dGVuZGVkIG9wY29kZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyB3aGVuIHdlIGFyZSBpbgorICAgICAgICAgdGhlIG1haW4gcmVsYXhhdGlvbiBsb29wLCB3aGVuIFNFQyBpcyBOVUxMLiAgKi8KKyAgICAgIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMCAmJiBzZWMgPT0gTlVMTCkKKwl7CisJICBmcmFncC0+ZnJfc3VidHlwZSA9CisJICAgIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIElmIHdlIGFyZSBhYm91dCB0byBtYXJrIGEgZnJhZyBhcyBleHRlbmRlZCBiZWNhdXNlIHRoZSB2YWx1ZQorICAgICAgICAgaXMgcHJlY2lzZWx5IG1heHRpbnkgKyAxLCB0aGVuIHRoZXJlIGlzIGEgY2hhbmNlIG9mIGFuCisgICAgICAgICBpbmZpbml0ZSBsb29wIGFzIGluIHRoZSBmb2xsb3dpbmcgY29kZToKKwkgICAgIGxhCSQ0LGZvbworCSAgICAgLnNraXAJMTAyMAorCSAgICAgLmFsaWduCTIKKwkgICBmb286CisJIEluIHRoaXMgY2FzZSB3aGVuIHRoZSBsYSBpcyBleHRlbmRlZCwgZm9vIGlzIDB4M2ZjIGJ5dGVzCisJIGF3YXksIHNvIHRoZSBsYSBjYW4gYmUgc2hydW5rLCBidXQgdGhlbiBmb28gaXMgMHg0MDAgYXdheSwgc28KKwkgdGhlIGxhIG11c3QgYmUgZXh0ZW5kZWQuICBUbyBhdm9pZCB0aGlzIGxvb3AsIHdlIG1hcmsgdGhlCisJIGZyYWcgYXMgZXh0ZW5kZWQgaWYgaXQgd2FzIHNtYWxsLCBhbmQgaXMgYWJvdXQgdG8gYmVjb21lCisJIGV4dGVuZGVkIHdpdGggYSB2YWx1ZSBvZiBtYXh0aW55ICsgMS4gICovCisgICAgICBpZiAodmFsID09ICgobWF4dGlueSArIDEpIDw8IG9wLT5zaGlmdCkKKwkgICYmICEgUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkKKwkgICYmIHNlYyA9PSBOVUxMKQorCXsKKwkgIGZyYWdwLT5mcl9zdWJ0eXBlID0KKwkgICAgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHN5bXNlYyAhPSBhYnNvbHV0ZV9zZWN0aW9uICYmIHNlYyAhPSBOVUxMKQorICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCBfKCJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIikpOworCisgIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMAorICAgICAgfHwgdmFsIDwgKG1pbnRpbnkgPDwgb3AtPnNoaWZ0KQorICAgICAgfHwgdmFsID4gKG1heHRpbnkgPDwgb3AtPnNoaWZ0KSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4aW5nLiAgVW5sZXNzIHRoaXMgaXMgdGhlCisgICBtaXBzMTYsIHdlIGFyZSBub3QgcmVhbGx5IHJlbGF4aW5nIGhlcmUsIGFuZCB0aGUgZmluYWwgc2l6ZSBpcworICAgZW5jb2RlZCBpbiB0aGUgc3VidHlwZSBpbmZvcm1hdGlvbi4gIEZvciB0aGUgbWlwczE2LCB3ZSBoYXZlIHRvCisgICBkZWNpZGUgd2hldGhlciB3ZSBhcmUgdXNpbmcgYW4gZXh0ZW5kZWQgb3Bjb2RlIG9yIG5vdC4gICovCisKKy8qQVJHU1VTRUQqLworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZ3R5cGUpCisgICAgIGZyYWdTICpmcmFncDsKKyAgICAgYXNlY3Rpb24gKnNlZ3R5cGU7Cit7CisgIGludCBjaGFuZ2U7CisKKyAgaWYgKFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCisgICAgeworICAgICAgaWYgKG1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VndHlwZSwgMCkpCisJeworCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOworCSAgcmV0dXJuIDQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7CisJICByZXR1cm4gMjsKKwl9CisgICAgfQorCisgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCisgICAgeworICAgICAgY2hhbmdlID0gbm9waWNfbmVlZF9yZWxheCAoZnJhZ3AtPmZyX3N5bWJvbCwgMCk7CisgICAgfQorICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKKyAgICB7CisgICAgICBzeW1ib2xTICpzeW07CisgICAgICBhc2VjdGlvbiAqc3ltc2VjOworCisgICAgICBzeW0gPSBmcmFncC0+ZnJfc3ltYm9sOworCisgICAgICAvKiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4gICovCisgICAgICB3aGlsZSAoc3ltLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCisJICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQorCXsKKwkgIHN5bWJvbFMgKm47CisKKwkgIC8qIEl0J3MgcG9zc2libGUgdG8gZ2V0IGEgbG9vcCBoZXJlIGluIGEgYmFkbHkgd3JpdHRlbgorICAgICAgICAgICAgIHByb2dyYW0uICAqLworCSAgbiA9IHN5bS0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOworCSAgaWYgKG4gPT0gc3ltKQorCSAgICBicmVhazsKKwkgIHN5bSA9IG47CisJfQorCisgICAgICBzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOworCisgICAgICAvKiBUaGlzIG11c3QgZHVwbGljYXRlIHRoZSB0ZXN0IGluIGFkanVzdF9yZWxvY19zeW1zLiAgKi8KKyAgICAgIGNoYW5nZSA9IChzeW1zZWMgIT0gJmJmZF91bmRfc2VjdGlvbgorCQkmJiBzeW1zZWMgIT0gJmJmZF9hYnNfc2VjdGlvbgorCQkmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc2VjKSk7CisgICAgfQorICBlbHNlCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKGNoYW5nZSkKKyAgICB7CisgICAgICAvKiBSZWNvcmQgdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgcmVsb2MgaW4gdGhlIGZyX29wY29kZSBmaWVsZC4KKwkgVGhpcyBsZXRzIG1kX2NvbnZlcnRfZnJhZyBhbmQgdGNfZ2VuX3JlbG9jIGtub3cgdGhhdCB0aGUgY29kZQorCSBtdXN0IGJlIGV4cGFuZGVkLiAgKi8KKyAgICAgIGZyYWdwLT5mcl9vcGNvZGUgPSAoZnJhZ3AtPmZyX2xpdGVyYWwKKwkJCSAgKyBmcmFncC0+ZnJfZml4CisJCQkgIC0gUkVMQVhfT0xEIChmcmFncC0+ZnJfc3VidHlwZSkKKwkJCSAgKyBSRUxBWF9SRUxPQzEgKGZyYWdwLT5mcl9zdWJ0eXBlKSk7CisgICAgICAvKiBGSVhNRTogVGhpcyByZWFsbHkgbmVlZHMgYXNfd2Fybl93aGVyZS4gICovCisgICAgICBpZiAoUkVMQVhfV0FSTiAoZnJhZ3AtPmZyX3N1YnR5cGUpKQorCWFzX3dhcm4gKF8oIkFUIHVzZWQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiBvciBtYWNybyB1c2VkIGFmdGVyIFwiLnNldCBub21hY3JvXCIiKSk7CisgICAgfQorCisgIGlmICghIGNoYW5nZSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiBSRUxBWF9ORVcgKGZyYWdwLT5mcl9zdWJ0eXBlKSAtIFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB0byBzZWUgd2hldGhlciBhIHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbAorICAgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICBEb24ndCBhZGp1c3QKKyAgIE1JUFMxNiBqdW1wIHJlbG9jYXRpb25zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBmb3JtYXQKKyAgIG9mIHRoZSBvZmZzZXQgaW4gdGhlIC5vIGZpbGUuICBEb24ndCBhZGp1c3QgcmVsb2NhdGlvbnMgYWdhaW5zdAorICAgbWlwczE2IHN5bWJvbHMsIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gZmluZCB0aGVtIGlmIGl0IG5lZWRzIHRvIHNldAorICAgdXAgYSBzdHViLiAgKi8KKworaW50CittaXBzX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQorICAgICBmaXhTICpmaXhwOworeworICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQorICAgIHJldHVybiAwOworICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDA7CisgIGlmIChmaXhwLT5meF9hZGRzeSA9PSBOVUxMKQorICAgIHJldHVybiAxOworI2lmZGVmIE9CSl9FTEYKKyAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorICAgICAgJiYgU19HRVRfT1RIRVIgKGZpeHAtPmZ4X2FkZHN5KSA9PSBTVE9fTUlQUzE2CisgICAgICAmJiBmaXhwLT5meF9zdWJzeSA9PSBOVUxMKQorICAgIHJldHVybiAwOworI2VuZGlmCisgIHJldHVybiAxOworfQorCisvKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKKyAgIGZvcm1hdC4gICovCisKK2FyZWxlbnQgKioKK3RjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIHN0YXRpYyBhcmVsZW50ICpyZXR2YWxbNF07CisgIGFyZWxlbnQgKnJlbG9jOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKKworICByZWxvYyA9IHJldHZhbFswXSA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworICByZXR2YWxbMV0gPSBOVUxMOworCisgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKyAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisKKyAgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQworICAgICAgJiYgU1dJVENIX1RBQkxFIChmaXhwKSkKKyAgICB7CisgICAgICAvKiBGb3IgYSBzd2l0Y2ggdGFibGUgZW50cnkgd2UgdXNlIGEgc3BlY2lhbCByZWxvYy4gIFRoZSBhZGRlbmQKKwkgaXMgYWN0dWFsbHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgdGhlCisJIHN1YnRyYWhlbmQuICAqLworICAgICAgcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRyZXNzIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKKyAgICAgIGlmIChPVVRQVVRfRkxBVk9SICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKKwlhc19mYXRhbCAoXygiRG91YmxlIGNoZWNrIGZ4X3JfdHlwZSBpbiB0Yy1taXBzLmM6dGNfZ2VuX3JlbG9jIikpOworICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0dQUkVMMzI7CisgICAgfQorICBlbHNlIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpCisgICAgeworICAgICAgLyogV2UgdXNlIGEgc3BlY2lhbCBhZGRlbmQgZm9yIGFuIGludGVybmFsIFJFTExPIHJlbG9jLiAgKi8KKyAgICAgIGlmIChmaXhwLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisJcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRyZXNzIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKKyAgICAgIGVsc2UKKwlyZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyICsgcmVsb2MtPmFkZHJlc3M7CisgICAgfQorICBlbHNlIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUykKKyAgICB7CisgICAgICBhc3NlcnQgKGZpeHAtPmZ4X25leHQgIT0gTlVMTAorCSAgICAgICYmIGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfTE8xNik7CisgICAgICAvKiBXZSB1c2UgYSBzcGVjaWFsIGFkZGVuZCBmb3IgYW4gaW50ZXJuYWwgUkVMSEkgcmVsb2MuICBUaGUKKwkgcmVsb2MgaXMgcmVsYXRpdmUgdG8gdGhlIFJFTExPOyBhZGp1c3QgdGhlIGFkZGVuZAorCSBhY2NvcmRpbmdseS4gICovCisgICAgICBpZiAoZml4cC0+ZnhfYWRkc3ktPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQorCXJlbG9jLT5hZGRlbmQgPSAoZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcworCQkJICsgZml4cC0+ZnhfbmV4dC0+Znhfd2hlcmUKKwkJCSAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSkpOworICAgICAgZWxzZQorCXJlbG9jLT5hZGRlbmQgPSAoZml4cC0+ZnhfYWRkbnVtYmVyCisJCQkgKyBmaXhwLT5meF9uZXh0LT5meF9mcmFnLT5mcl9hZGRyZXNzCisJCQkgKyBmaXhwLT5meF9uZXh0LT5meF93aGVyZSk7CisgICAgfQorICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCA9PSAwKQorICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKKwkvKiBBIGdydWVzb21lIGhhY2sgd2hpY2ggaXMgYSByZXN1bHQgb2YgdGhlIGdydWVzb21lIGdhcyByZWxvYworCSAgIGhhbmRsaW5nLiAgKi8KKwlyZWxvYy0+YWRkZW5kID0gcmVsb2MtPmFkZHJlc3M7CisgICAgICBlbHNlCisJcmVsb2MtPmFkZGVuZCA9IC1yZWxvYy0+YWRkcmVzczsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIHZhcmlhbnQgZnJhZywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBleGlzdGluZworICAgICByZWxvYyBhbmQgZ2VuZXJhdGUgYSBuZXcgb25lLiAgKi8KKyAgaWYgKGZpeHAtPmZ4X2ZyYWctPmZyX29wY29kZSAhPSBOVUxMCisgICAgICAmJiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMCisJICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UMTYKKwkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMMTYKKwkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNgorCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2CisJICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2CisJICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KSkKKyAgICB7CisgICAgICBhcmVsZW50ICpyZWxvYzI7CisKKyAgICAgIGFzc2VydCAoISBSRUxBWF9NSVBTMTZfUCAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpOworCisgICAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCByZWxvYyBpbiB0aGlzIGZyYWcsIHRoZW4gd2UgaGF2ZSB0d28KKwkgR1BSRUwgcmVsb2NzLCBvciBhIEdPVF9ISTE2L0dPVF9MTzE2IHBhaXIsIG9yIGEKKwkgQ0FMTF9ISTE2L0NBTExfTE8xNiwgYm90aCBvZiB3aGljaCBhcmUgYmVpbmcgcmVwbGFjZWQuICBMZXQKKwkgdGhlIHNlY29uZCBvbmUgaGFuZGxlIGFsbCBvZiB0aGVtLiAgKi8KKyAgICAgIGlmIChmaXhwLT5meF9uZXh0ICE9IE5VTEwKKwkgICYmIGZpeHAtPmZ4X2ZyYWcgPT0gZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZykKKwl7CisJICBhc3NlcnQgKChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwKKwkJICAgJiYgZml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMKQorCQkgIHx8IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKKwkJICAgICAgJiYgKGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZQorCQkJICA9PSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikpCisJCSAgfHwgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKKwkJICAgICAgJiYgKGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZQorCQkJICA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpKSk7CisJICByZXR2YWxbMF0gPSBOVUxMOworCSAgcmV0dXJuIHJldHZhbDsKKwl9CisKKyAgICAgIGZpeHAtPmZ4X3doZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfb3Bjb2RlIC0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKKyAgICAgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworICAgICAgcmVsb2MyID0gcmV0dmFsWzFdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisgICAgICByZXR2YWxbMl0gPSBOVUxMOworICAgICAgcmVsb2MyLT5zeW1fcHRyX3B0ciA9ICZmaXhwLT5meF9hZGRzeS0+YnN5bTsKKyAgICAgIHJlbG9jMi0+YWRkcmVzcyA9IChyZWxvYy0+YWRkcmVzcworCQkJICsgKFJFTEFYX1JFTE9DMiAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkKKwkJCSAgICAtIFJFTEFYX1JFTE9DMSAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpKTsKKyAgICAgIHJlbG9jMi0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOworICAgICAgcmVsb2MyLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfTE8xNik7CisgICAgICBhc3NlcnQgKHJlbG9jMi0+aG93dG8gIT0gTlVMTCk7CisKKyAgICAgIGlmIChSRUxBWF9SRUxPQzMgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKQorCXsKKwkgIGFyZWxlbnQgKnJlbG9jMzsKKworCSAgcmVsb2MzID0gcmV0dmFsWzJdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisJICByZXR2YWxbM10gPSBOVUxMOworCSAgKnJlbG9jMyA9ICpyZWxvYzI7CisJICByZWxvYzMtPmFkZHJlc3MgKz0gNDsKKwl9CisKKyAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCisJeworCSAgYXNzZXJ0IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwpOworCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0hJMTZfUzsKKwl9CisgICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKKwl7CisJICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0ICgpOworCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVDE2OgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTEwxNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTY6CisJICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX01JUFNfR09UMTY7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisgICAgfQorCisgIC8qIFNpbmNlIE1JUFMgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZSB2dGFibGUgZW50cnkKKyAgICAgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHsKKyAgICAgIHJlbG9jLT5hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKKyAgICAgIHJlbG9jLT5hZGRlbmQgPSAwOworICAgIH0KKworICAvKiBTaW5jZSBESUZGX0VYUFJfT0sgaXMgZGVmaW5lZCBpbiB0Yy1taXBzLmgsIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAgICAgZml4dXBfc2VnbWVudCBjb252ZXJ0ZWQgYSBub24tUEMgcmVsYXRpdmUgcmVsb2MgaW50byBhIFBDCisgICAgIHJlbGF0aXZlIHJlbG9jLiAgSW4gc3VjaCBhIGNhc2UsIHdlIG5lZWQgdG8gY29udmVydCB0aGUgcmVsb2MKKyAgICAgY29kZS4gICovCisgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7CisgIGlmIChmaXhwLT5meF9wY3JlbCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGNvZGUpCisJeworCWNhc2UgQkZEX1JFTE9DXzg6CisJICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ18xNjoKKwkgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ18zMjoKKwkgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ182NDoKKwkgIGNvZGUgPSBCRkRfUkVMT0NfNjRfUENSRUw7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ184X1BDUkVMOgorCWNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgorCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgorCWNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgorCWNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgorCWNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKKwljYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCV8oIkNhbm5vdCBtYWtlICVzIHJlbG9jYXRpb24gUEMgcmVsYXRpdmUiKSwKKwkJCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7CisJfQorICAgIH0KKworICAvKiBUbyBzdXBwb3J0IGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlCisgICAgIGZvciBFQ09GRiwgd2UgdXNlIGEgQ3lnbnVzIGV4dGVuc2lvbi4gIFdlIGNoZWNrIGZvciB0aGF0IGhlcmUgdG8KKyAgICAgbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgbGV0IHN1Y2ggYSByZWxvYyBlc2NhcGUgbm9ybWFsbHkuICAqLworICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKKyAgICAgICYmIGNvZGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyCisgICAgICAmJiBtaXBzX3BpYyAhPSBFTUJFRERFRF9QSUMpCisgICAgcmVsb2MtPmhvd3RvID0gTlVMTDsKKyAgZWxzZQorICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKKworICBpZiAocmVsb2MtPmhvd3RvID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorCQkgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAorCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKKyAgICAgIHJldHZhbFswXSA9IE5VTEw7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIFJlbGF4IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgYW1vdW50IGJ5IHdoaWNoCisgICB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBmcmFnIHNob3VsZCBjaGFuZ2UuICAqLworCitpbnQKK21pcHNfcmVsYXhfZnJhZyAoZnJhZ3AsIHN0cmV0Y2gpCisgICAgIGZyYWdTICpmcmFncDsKKyAgICAgbG9uZyBzdHJldGNoOworeworICBpZiAoISBSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQorICAgIHJldHVybiAwOworCisgIGlmIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyAoZnJhZ3AsIChhc2VjdGlvbiAqKSBOVUxMLCBzdHJldGNoKSkKKyAgICB7CisgICAgICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCisJcmV0dXJuIDA7CisgICAgICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKKwlyZXR1cm4gMDsKKyAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7CisgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gICovCisKK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoYWJmZCwgYXNlYywgZnJhZ3ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VnVCBhc2VjOworICAgICBmcmFnUyAqZnJhZ3A7Cit7CisgIGludCBvbGQsIG5ldzsKKyAgY2hhciAqZml4cHRyOworCisgIGlmIChSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQorICAgIHsKKyAgICAgIGludCB0eXBlOworICAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKKyAgICAgIGJvb2xlYW4gc21hbGwsIGV4dDsKKyAgICAgIG9mZnNldFQgdmFsOworICAgICAgYmZkX2J5dGUgKmJ1ZjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGV4dGVuZDsKKworICAgICAgdHlwZSA9IFJFTEFYX01JUFMxNl9UWVBFIChmcmFncC0+ZnJfc3VidHlwZSk7CisgICAgICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKKyAgICAgIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQorCSsrb3A7CisKKyAgICAgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKKwl7CisJICBzbWFsbCA9IGZhbHNlOworCSAgZXh0ID0gdHJ1ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc21hbGwgPSB0cnVlOworCSAgZXh0ID0gZmFsc2U7CisJfQorCisgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZ3AtPmZyX3N5bWJvbCwgMSk7CisgICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoZnJhZ3AtPmZyX3N5bWJvbCk7CisgICAgICBpZiAob3AtPnBjcmVsKQorCXsKKwkgIGFkZHJlc3NUIGFkZHI7CisKKwkgIGFkZHIgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7CisKKwkgIC8qIFRoZSBydWxlcyBmb3IgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jIGFyZQorICAgICAgICAgICAgIGNvbXBsaWNhdGVkOyBzZWUgbWlwczE2X2V4dGVuZGVkX2ZyYWcuICAqLworCSAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQorCSAgICB7CisJICAgICAgYWRkciArPSAyOworCSAgICAgIGlmIChleHQpCisJCWFkZHIgKz0gMjsKKwkgICAgICAvKiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gdGhlIHRhcmdldCwgc2luY2UgaXQgd2lsbCBiZQorICAgICAgICAgICAgICAgICBzZXQgZm9yIGEgdGV4dCBsYWJlbC4gICovCisJICAgICAgaWYgKCh2YWwgJiAxKSAhPSAwKQorCQktLXZhbDsKKwkgICAgfQorCSAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQorCSAgICBhZGRyIC09IDQ7CisJICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKKwkgICAgYWRkciAtPSAyOworCisJICBhZGRyICY9IH4gKGFkZHJlc3NUKSAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpOworCSAgdmFsIC09IGFkZHI7CisKKwkgIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiB3aW5kcyB1cCB3aXRoIHRoZSBhbGlnbm1lbnQgd2UgaGF2ZQorICAgICAgICAgICAgIGFzc3VtZWQuICAqLworCSAgaWYgKG9wLT5zaGlmdCA+IDApCisJICAgIHJlY29yZF9hbGlnbm1lbnQgKGFzZWMsIG9wLT5zaGlmdCk7CisJfQorCisgICAgICBpZiAoZXh0CisJICAmJiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpCisJICAgICAgfHwgUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpKQorCWFzX3dhcm5fd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwKKwkJICAgICAgIF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7CisKKyAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSAoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KTsKKworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCWluc24gPSBiZmRfZ2V0YjE2IChidWYpOworICAgICAgZWxzZQorCWluc24gPSBiZmRfZ2V0bDE2IChidWYpOworCisgICAgICBtaXBzMTZfaW1tZWQgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgdHlwZSwgdmFsLAorCQkgICAgUkVMQVhfTUlQUzE2X1VTRVJfRVhUIChmcmFncC0+ZnJfc3VidHlwZSksCisJCSAgICBzbWFsbCwgZXh0LCAmaW5zbiwgJnVzZV9leHRlbmQsICZleHRlbmQpOworCisgICAgICBpZiAodXNlX2V4dGVuZCkKKwl7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgMHhmMDAwIHwgZXh0ZW5kLCAyKTsKKwkgIGZyYWdwLT5mcl9maXggKz0gMjsKKwkgIGJ1ZiArPSAyOworCX0KKworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIGluc24sIDIpOworICAgICAgZnJhZ3AtPmZyX2ZpeCArPSAyOworICAgICAgYnVmICs9IDI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGZyYWdwLT5mcl9vcGNvZGUgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAgIG9sZCA9IFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOworICAgICAgbmV3ID0gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSk7CisgICAgICBmaXhwdHIgPSBmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXg7CisKKyAgICAgIGlmIChuZXcgPiAwKQorCW1lbWNweSAoZml4cHRyIC0gb2xkLCBmaXhwdHIsIG5ldyk7CisKKyAgICAgIGZyYWdwLT5mcl9maXggKz0gbmV3IC0gb2xkOworICAgIH0KK30KKworI2lmZGVmIE9CSl9FTEYKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgorICAgV2UndmUgYmVlbiBzdG9yaW5nIG1pcHMxNiB0ZXh0IGxhYmVscyBhcyBvZGQuICBIZXJlIHdlIGNvbnZlcnQgdGhlbQorICAgYmFjayB0byBldmVuIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGRlYnVnZ2VyLiAgKi8KKwordm9pZAorbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCit7CisgIGFzeW1ib2wgKipzeW1zOworICB1bnNpZ25lZCBpbnQgY291bnQsIGk7CisKKyAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICByZXR1cm47CisKKyAgc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoc3Rkb3V0cHV0KTsKKyAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChzdGRvdXRwdXQpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltcysrKQorICAgIHsKKyAgICAgIGlmIChlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPT0gU1RPX01JUFMxNgorCSAgJiYgKCgqc3ltcyktPnZhbHVlICYgMSkgIT0gMCkKKwl7CisJICAoKnN5bXMpLT52YWx1ZSAmPSB+MTsKKwkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGFuIG9kZCBzaXplLCBpdCB3YXMgcHJvYmFibHkgY29tcHV0ZWQKKwkgICAgIGluY29ycmVjdGx5LCBzbyBhZGp1c3QgdGhhdCBhcyB3ZWxsLiAgKi8KKwkgIGlmICgoZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgJiAxKSAhPSAwKQorCSAgICArK2VsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOworCX0KKyAgICB9Cit9CisKKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIGxhYmVsIGlzIGRlZmluZWQuICBJdCBpcyB1c2VkCisgICB3aGVuIGhhbmRsaW5nIGJyYW5jaCBkZWxheXM7IGlmIGEgYnJhbmNoIGhhcyBhIGxhYmVsLCB3ZSBhc3N1bWUgd2UKKyAgIGNhbiBub3QgbW92ZSBpdC4gICovCisKK3ZvaWQKK21pcHNfZGVmaW5lX2xhYmVsIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKKworICBpZiAoZnJlZV9pbnNuX2xhYmVscyA9PSBOVUxMKQorICAgIGwgPSAoc3RydWN0IGluc25fbGFiZWxfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKmwpOworICBlbHNlCisgICAgeworICAgICAgbCA9IGZyZWVfaW5zbl9sYWJlbHM7CisgICAgICBmcmVlX2luc25fbGFiZWxzID0gbC0+bmV4dDsKKyAgICB9CisKKyAgbC0+bGFiZWwgPSBzeW07CisgIGwtPm5leHQgPSBpbnNuX2xhYmVsczsKKyAgaW5zbl9sYWJlbHMgPSBsOworfQorDAorI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCisKKy8qIFNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBhIE1JUFMgRUxGIGZpbGUuICAqLworCit2b2lkCittaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nICgpCit7CisgIC8qIFdyaXRlIG91dCB0aGUgcmVnaXN0ZXIgaW5mb3JtYXRpb24uICAqLworICBpZiAoISBtaXBzXzY0KQorICAgIHsKKyAgICAgIEVsZjMyX1JlZ0luZm8gczsKKworICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOworICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOworICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOworICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOworICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOworICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCisKKyAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCisJCQkJICAgICAgICgoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKQorCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gczsKKworICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOworICAgICAgcy5yaV9wYWQgPSAwOworICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOworICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOworICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOworICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOworICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCisKKyAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCisJCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQorCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOworICAgIH0KKworICAvKiBTZXQgdGhlIE1JUFMgRUxGIGZsYWcgYml0cy4gIEZJWE1FOiBUaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgc29tZQorICAgICBzb3J0IG9mIEJGRCBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLworICBpZiAobWlwc19hbnlfbm9yZW9yZGVyKQorICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU19OT1JFT1JERVI7CisgIGlmIChtaXBzX3BpYyAhPSBOT19QSUMpCisgICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTX1BJQzsKKworICAvKiBTZXQgdGhlIE1JUFMgRUxGIEFCSSBmbGFncy4gKi8KKyAgaWYgKG1pcHNfYWJpX3N0cmluZyA9PSAwKQorICAgIDsKKyAgZWxzZSBpZiAoc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsIjMyIikgPT0gMCkKKyAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzMyOworICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywibzY0IikgPT0gMCkKKyAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzY0OworICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiZWFiaSIpID09IDApCisgICAgeworICAgICAgaWYgKG1pcHNfZWFiaTY0KQorCWVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9FQUJJNjQ7CisgICAgICBlbHNlCisJZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX0VBQkkzMjsKKyAgICB9CisKKyAgaWYgKG1pcHNfMzJiaXRtb2RlKQorICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU18zMkJJVE1PREU7Cit9CisKKyNlbmRpZiAvKiBPQkpfRUxGIHx8IE9CSl9NQVlCRV9FTEYgKi8KKwwKK3R5cGVkZWYgc3RydWN0IHByb2MKKyAgeworICAgIHN0cnVjdCBzeW1ib2wgKmlzeW07CisgICAgdW5zaWduZWQgbG9uZyByZWdfbWFzazsKKyAgICB1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBmcHJlZ19tYXNrOworICAgIHVuc2lnbmVkIGxvbmcgZnByZWdfb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfcmVnOworICAgIHVuc2lnbmVkIGxvbmcgcGNfcmVnOworICB9Citwcm9jUzsKKworc3RhdGljIHByb2NTIGN1cl9wcm9jOworc3RhdGljIHByb2NTICpjdXJfcHJvY19wdHI7CitzdGF0aWMgaW50IG51bXByb2NzOworCitzdGF0aWMgdm9pZAorbWRfb2JqX2JlZ2luICgpCit7Cit9CisKK3N0YXRpYyB2b2lkCittZF9vYmpfZW5kICgpCit7CisgIC8qIGNoZWNrIGZvciBwcmVtYXR1cmUgZW5kLCBuZXN0aW5nIGVycm9ycywgZXRjICovCisgIGlmIChjdXJfcHJvY19wdHIpCisgICAgYXNfd2FybiAoXygibWlzc2luZyBgLmVuZCcgYXQgZW5kIG9mIGFzc2VtYmx5IikpOworfQorCitzdGF0aWMgbG9uZworZ2V0X251bWJlciAoKQoreworICBpbnQgbmVnYXRpdmUgPSAwOworICBsb25nIHZhbCA9IDA7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQorICAgIHsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgbmVnYXRpdmUgPSAxOworICAgIH0KKyAgaWYgKCFpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSkKKyAgICBhc19iYWQgKF8oIkV4cGVjdGVkIHNpbXBsZSBudW1iZXIuIikpOworICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJykKKyAgICB7CisgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICd4JykKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKwkgIHdoaWxlIChpc3hkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCisJICAgIHsKKwkgICAgICB2YWwgPDw9IDQ7CisJICAgICAgdmFsIHw9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKKwkgICAgfQorCSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKKwl9CisgICAgICBlbHNlCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICB3aGlsZSAoaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCisJICAgIHsKKwkgICAgICB2YWwgPDw9IDM7CisJICAgICAgdmFsIHw9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAtICcwJzsKKwkgICAgfQorCSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKKwl9CisgICAgfQorICBpZiAoIWlzZGlnaXQgKCppbnB1dF9saW5lX3BvaW50ZXIpKQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyVjJyAweCUwMnhcbiIpLAorCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIsICppbnB1dF9saW5lX3BvaW50ZXIpOworICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBudW1iZXIiKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB3aGlsZSAoaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikpCisgICAgeworICAgICAgdmFsICo9IDEwOworICAgICAgdmFsICs9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAtICcwJzsKKyAgICB9CisgIHJldHVybiBuZWdhdGl2ZSA/IC12YWwgOiB2YWw7Cit9CisKKy8qIFRoZSAuZmlsZSBkaXJlY3RpdmU7IGp1c3QgbGlrZSB0aGUgdXN1YWwgLmZpbGUgZGlyZWN0aXZlLCBidXQgdGhlcmUKKyAgIGlzIGFuIGluaXRpYWwgbnVtYmVyIHdoaWNoIGlzIHRoZSBFQ09GRiBmaWxlIGluZGV4LiAgKi8KKworc3RhdGljIHZvaWQKK3NfZmlsZSAoeCkKKyAgICAgaW50IHg7Cit7CisgIGludCBsaW5lOworCisgIGxpbmUgPSBnZXRfbnVtYmVyICgpOworICBzX2FwcF9maWxlICgwKTsKK30KKworCisvKiBUaGUgLmVuZCBkaXJlY3RpdmUuICAqLworCitzdGF0aWMgdm9pZAorc19taXBzX2VuZCAoeCkKKyAgICAgaW50IHg7Cit7CisgIHN5bWJvbFMgKnA7CisgIGludCBtYXliZV90ZXh0OworCisgIGlmICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorICAgIHsKKyAgICAgIHAgPSBnZXRfc3ltYm9sICgpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBwID0gTlVMTDsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKKyAgICBtYXliZV90ZXh0ID0gMTsKKyAgZWxzZQorICAgIG1heWJlX3RleHQgPSAwOworI2Vsc2UKKyAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCisgICAgbWF5YmVfdGV4dCA9IDE7CisgIGVsc2UKKyAgICBtYXliZV90ZXh0ID0gMDsKKyNlbmRpZgorCisgIGlmICghbWF5YmVfdGV4dCkKKyAgICBhc193YXJuIChfKCIuZW5kIG5vdCBpbiB0ZXh0IHNlY3Rpb24iKSk7CisKKyAgaWYgKCFjdXJfcHJvY19wdHIpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZS4iKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzc2VydCAoU19HRVRfTkFNRSAocCkpOworICAgICAgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAocCksIFNfR0VUX05BTUUgKGN1cl9wcm9jX3B0ci0+aXN5bSkpKQorCWFzX3dhcm4gKF8oIi5lbmQgc3ltYm9sIGRvZXMgbm90IG1hdGNoIC5lbnQgc3ltYm9sLiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBtaXNzaW5nIG9yIHVua25vd24gc3ltYm9sIikpOworCisjaWZkZWYgTUlQU19TVEFCU19FTEYKKyAgeworICAgIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKKyAgICBzdWJzZWdUIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7CisgICAgZnJhZ1MgKnNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKKyAgICB2YWx1ZVQgZG90OworICAgIHNlZ1Qgc2VnOworICAgIGV4cHJlc3Npb25TIGV4cDsKKyAgICBjaGFyICpmcmFncDsKKworICAgIGRvdCA9IGZyYWdfbm93X2ZpeCAoKTsKKworI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisgICAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICAgIGFzc2VydCAocGRyX3NlZyk7CisgICAgc3Vic2VnX3NldCAocGRyX3NlZywgMCk7CisKKyAgICAvKiBXcml0ZSB0aGUgc3ltYm9sICovCisgICAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKKyAgICBleHAuWF9hZGRfc3ltYm9sID0gcDsKKyAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKKyAgICBlbWl0X2V4cHIgKCZleHAsIDQpOworCisgICAgZnJhZ3AgPSBmcmFnX21vcmUgKDcqNCk7CisKKyAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwLCAgICAgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5yZWdfbWFzaywgNCk7CisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArIDQsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cmVnX29mZnNldCwgNCk7CisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArIDgsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnByZWdfbWFzaywgNCk7CisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMTIsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnByZWdfb2Zmc2V0LCA0KTsKKyAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsxNiwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcmFtZV9vZmZzZXQsIDQpOworICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzIwLCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZyYW1lX3JlZywgNCk7CisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMjQsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+cGNfcmVnLCA0KTsKKworICAgIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKKyAgfQorI2VuZGlmCisKKyAgY3VyX3Byb2NfcHRyID0gTlVMTDsKK30KKworLyogVGhlIC5hZW50IGFuZCAuZW50IGRpcmVjdGl2ZXMuICAqLworCitzdGF0aWMgdm9pZAorc19taXBzX2VudCAoYWVudCkKKyAgICAgaW50IGFlbnQ7Cit7CisgIGludCBudW1iZXIgPSAwOworICBzeW1ib2xTICpzeW1ib2xQOworICBpbnQgbWF5YmVfdGV4dDsKKworICBzeW1ib2xQID0gZ2V0X3N5bWJvbCAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKKyAgICBudW1iZXIgPSBnZXRfbnVtYmVyICgpOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQorICAgIG1heWJlX3RleHQgPSAxOworICBlbHNlCisgICAgbWF5YmVfdGV4dCA9IDA7CisjZWxzZQorICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24gJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKKyAgICBtYXliZV90ZXh0ID0gMTsKKyAgZWxzZQorICAgIG1heWJlX3RleHQgPSAwOworI2VuZGlmCisKKyAgaWYgKCFtYXliZV90ZXh0KQorICAgIGFzX3dhcm4gKF8oIi5lbnQgb3IgLmFlbnQgbm90IGluIHRleHQgc2VjdGlvbi4iKSk7CisKKyAgaWYgKCFhZW50ICYmIGN1cl9wcm9jX3B0cikKKyAgICBhc193YXJuIChfKCJtaXNzaW5nIGAuZW5kJyIpKTsKKworICBpZiAoIWFlbnQpCisgICAgeworICAgICAgY3VyX3Byb2NfcHRyID0gJmN1cl9wcm9jOworICAgICAgbWVtc2V0IChjdXJfcHJvY19wdHIsICdcMCcsIHNpemVvZiAocHJvY1MpKTsKKworICAgICAgY3VyX3Byb2NfcHRyLT5pc3ltID0gc3ltYm9sUDsKKworICAgICAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOworCisgICAgICBudW1wcm9jcysrOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLmZyYW1lIGRpcmVjdGl2ZS4gSWYgdGhlIG1kZWJ1ZyBzZWN0aW9uIGlzIHByZXNlbnQgKElSSVggNSBuYXRpdmUpCisgICB0aGVuIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSkgaXMgdXNlZC4gRm9yIGVtYmVkZGVkIHRhcmdldHMsIAorICAgc19taXBzX2ZyYW1lIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBQRFIgaW5mb3JtYXRpb24gY29ycmVjdGx5LgorICAgV2UgY2FuJ3QgdXNlIHRoZSBlY29mZiByb3V0aW5lcyBiZWNhdXNlIHRoZXkgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGVjb2ZmIAorICAgc3ltYm9sIHRhYmxlIChpbiB0aGUgbWRlYnVnIHNlY3Rpb24pLiAgKi8KKworc3RhdGljIHZvaWQKK3NfbWlwc19mcmFtZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworI2lmZGVmIE1JUFNfU1RBQlNfRUxGCisKKyAgbG9uZyB2YWw7CisKKyAgaWYgKGN1cl9wcm9jX3B0ciA9PSAgKHByb2NTICopIE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLmZyYW1lIG91dHNpZGUgb2YgLmVudCIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGN1cl9wcm9jX3B0ci0+ZnJhbWVfcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCisgICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIikpOworICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjdXJfcHJvY19wdHItPmZyYW1lX29mZnNldCA9IHZhbDsKKyAgY3VyX3Byb2NfcHRyLT5wY19yZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisjZWxzZQorICBzX2lnbm9yZSAoaWdub3JlKTsKKyNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLworfQorCisvKiBUaGUgLmZtYXNrIGFuZCAubWFzayBkaXJlY3RpdmVzLiBJZiB0aGUgbWRlYnVnIHNlY3Rpb24gaXMgcHJlc2VudCAKKyAgIChJUklYIDUgbmF0aXZlKSB0aGVuIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9tYXNrKSBpcyB1c2VkLiBGb3IgCisgICBlbWJlZGRlZCB0YXJnZXRzLCBzX21pcHNfbWFzayBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgUERSCisgICBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuIFdlIGNhbid0IHVzZSB0aGUgZWNvZmYgcm91dGluZXMgYmVjYXVzZSB0aGV5IAorICAgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGVjb2ZmIHN5bWJvbCB0YWJsZSAoaW4gdGhlIG1kZWJ1ZyBzZWN0aW9uKS4gICovCisKK3N0YXRpYyB2b2lkCitzX21pcHNfbWFzayAocmVnX3R5cGUpCisgICAgIGNoYXIgcmVnX3R5cGU7Cit7CisjaWZkZWYgTUlQU19TVEFCU19FTEYKKyAgbG9uZyBtYXNrLCBvZmY7CisgIAorICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jUyAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5tYXNrLy5mbWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZtYXNrKSAhPSAnLCcpCisgICAgeworICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrLy5mbWFzayBkaXJlY3RpdmUiKSk7CisgICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG9mZiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisgIGlmIChyZWdfdHlwZSA9PSAnRicpCisgICAgeworICAgICAgY3VyX3Byb2NfcHRyLT5mcHJlZ19tYXNrID0gbWFzazsKKyAgICAgIGN1cl9wcm9jX3B0ci0+ZnByZWdfb2Zmc2V0ID0gb2ZmOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN1cl9wcm9jX3B0ci0+cmVnX21hc2sgPSBtYXNrOworICAgICAgY3VyX3Byb2NfcHRyLT5yZWdfb2Zmc2V0ID0gb2ZmOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworI2Vsc2UKKyAgc19pZ25vcmUgKHJlZ190eXBlKTsKKyNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLworfQorCisvKiBUaGUgLmxvYyBkaXJlY3RpdmUuICAqLworCisjaWYgMAorc3RhdGljIHZvaWQKK3NfbG9jICh4KQorICAgICBpbnQgeDsKK3sKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgaW50IGxpbmVubzsKKyAgaW50IGFkZHJvZmY7CisKKyAgYXNzZXJ0IChub3dfc2VnID09IHRleHRfc2VjdGlvbik7CisKKyAgbGluZW5vID0gZ2V0X251bWJlciAoKTsKKyAgYWRkcm9mZiA9IGZyYWdfbm93X2ZpeCAoKTsKKworICBzeW1ib2xQID0gc3ltYm9sX25ldyAoIiIsIE5fU0xJTkUsIGFkZHJvZmYsIGZyYWdfbm93KTsKKyAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9TTElORSk7CisgIFNfU0VUX09USEVSIChzeW1ib2xQLCAwKTsKKyAgU19TRVRfREVTQyAoc3ltYm9sUCwgbGluZW5vKTsKKyAgc3ltYm9sUC0+c3lfc2VnbWVudCA9IG5vd19zZWc7Cit9CisjZW5kaWYKKworCisgIApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1taXBzLmggYi9nYXMvY29uZmlnL3RjLW1pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjhhZWRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1taXBzLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qIHRjLW1pcHMuaCAtLSBoZWFkZXIgZmlsZSBmb3IgdGMtbWlwcy5jLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgdGhlIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwuCisgICBXcml0dGVuIGJ5IEtlaXRoIEtub3dsZXMgYW5kIFJhbHBoIENhbXBiZWxsLCB3b3JraW5nIGluZGVwZW5kZW50bHkuCisgICBNb2RpZmllZCBmb3IgRUNPRkYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVENfTUlQUworCisjZGVmaW5lIFRDX01JUFMKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworc3RydWN0IGZyYWc7CitzdHJ1Y3QgZXhwcmVzc2lvblM7CisjZW5kaWYKKworLyogRGVmYXVsdCB0byBiaWcgZW5kaWFuLiAgKi8KKyNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JCTEKKyNlbmRpZgorCisjZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX21pcHMKKworI2RlZmluZSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAkxCisjZGVmaW5lIE9MRF9GTE9BVF9SRUFEUworI2RlZmluZSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUworI2RlZmluZSBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKKyNkZWZpbmUgTUFYX1JFTE9DX0VYUEFOU0lPTiAzCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCisKKy8qIE1heGltdW0gc3ltYm9sIG9mZnNldCB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIGEgQkZEX1JFTE9DX01JUFNfR1BSRUwKKyAgIHJlbG9jYXRpb246ICovCisjZGVmaW5lIE1BWF9HUFJFTF9PRkZTRVQgKDB4N0ZGNCkKKworI2RlZmluZSBtZF9yZWxheF9mcmFnKGZyYWdwLCBzdHJldGNoKSBtaXBzX3JlbGF4X2ZyYWcoZnJhZ3AsIHN0cmV0Y2gpCitleHRlcm4gaW50IG1pcHNfcmVsYXhfZnJhZyBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBsb25nKSk7CisKKyNkZWZpbmUgbWRfdW5kZWZpbmVkX3N5bWJvbChuYW1lKQkoMCkKKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCisvKiBXZSBwZXJtaXQgUEMgcmVsYXRpdmUgZGlmZmVyZW5jZSBleHByZXNzaW9ucyB3aGVuIGdlbmVyYXRpbmcKKyAgIGVtYmVkZGVkIFBJQyBjb2RlLiAgKi8KKyNkZWZpbmUgRElGRl9FWFBSX09LCisKKy8qIFRlbGwgYXNzZW1ibGVyIHRoYXQgd2UgaGF2ZSBhbiBpdGJsX21pcHMuaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlLiAqLworI2RlZmluZSBIQVZFX0lUQkxfQ1BVCisKKy8qIFRoZSBlbmRpYW5uZXNzIG9mIHRoZSB0YXJnZXQgZm9ybWF0IG1heSBjaGFuZ2UgYmFzZWQgb24gY29tbWFuZAorICAgbGluZSBhcmd1bWVudHMuICAqLworI2RlZmluZSBUQVJHRVRfRk9STUFUIG1pcHNfdGFyZ2V0X2Zvcm1hdCgpCitleHRlcm4gY29uc3QgY2hhciAqbWlwc190YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RydWN0IG1pcHNfY2xfaW5zbgoreworICB1bnNpZ25lZCBsb25nIGluc25fb3Bjb2RlOworICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc25fbW87CisgIC8qIFRoZSBuZXh0IHR3byBmaWVsZHMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIG1pcHMxNiBjb2RlLiAgKi8KKyAgYm9vbGVhbiB1c2VfZXh0ZW5kOworICB1bnNpZ25lZCBzaG9ydCBleHRlbmQ7Cit9OworCitleHRlcm4gaW50IHRjX2dldF9yZWdpc3RlciBQQVJBTVMgKChpbnQgZnJhbWUpKTsKKworI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MoKSBtaXBzX2luaXRfYWZ0ZXJfYXJncygpCitleHRlcm4gdm9pZCBtaXBzX2luaXRfYWZ0ZXJfYXJncyBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgbWRfcGFyc2VfbG9uZ19vcHRpb24oYXJnKSBtaXBzX3BhcnNlX2xvbmdfb3B0aW9uIChhcmcpCitleHRlcm4gaW50IG1pcHNfcGFyc2VfbG9uZ19vcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKyNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIG1pcHNfZGVmaW5lX2xhYmVsIChzeW0pCitleHRlcm4gdm9pZCBtaXBzX2RlZmluZV9sYWJlbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKKworI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCgpIG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKK2V4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIHRjX2Zyb2JfZmlsZSgpIG1pcHNfZnJvYl9maWxlICgpCitleHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZSBQQVJBTVMgKCh2b2lkKSk7CisKKyNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQorI2RlZmluZSB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIG1pcHNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcworZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorCisjZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfbWlwcworZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X21pcHMKKyAgUEFSQU1TICgoc3RydWN0IGZyYWcgKiwgaW50LCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBleHByZXNzaW9uUyAqKSk7CisKKyNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgbWlwc19maXhfYWRqdXN0YWJsZSAoZml4cCkKK2V4dGVybiBpbnQgbWlwc19maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKworLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIHdlIG11c3Qga2VlcCBQQyByZWxhdGl2ZQorICAgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIG1pcHNfZm9yY2VfcmVsb2NhdGlvbiAoZml4cCkKK2V4dGVybiBpbnQgbWlwc19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworCisvKiBtZF9hcHBseV9maXggc2V0cyBmeF9kb25lIGNvcnJlY3RseS4gICovCisjZGVmaW5lIFRDX0hBTkRMRV9GWF9ET05FIDEKKworLyogUmVnaXN0ZXIgbWFzayB2YXJpYWJsZXMuICBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBNSVBTIGFzc2VtYmx5IGNvZGUKKyAgIGFuZCB1c2VkIGJ5IEVDT0ZGIGFuZCBwb3NzaWJseSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIG1pcHNfZ3BybWFzazsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1pcHNfY3BybWFza1s0XTsKKworI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCisKKyNkZWZpbmUgZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZworZXh0ZXJuIHZvaWQgbWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAorICB7ICIuc2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKKyAgeyAiLnNic3MiLAlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCisgIHsgIi5saXQ0IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCisgIHsgIi5saXQ4IiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfTUlQU19HUFJFTAl9LCBcCisgIHsgIi51Y29kZSIsCVNIVF9NSVBTX1VDT0RFLAkwCQkJCQl9LCBcCisgIHsgIi5tZGVidWciLAlTSFRfTUlQU19ERUJVRywJMAkJCQkJfSwKKy8qIE90aGVyIHNwZWNpYWwgc2VjdGlvbnMgbm90IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyOiAucmVnaW5mbywKKyAgIC5saWJsaXN0LCAuY29uZmxpY3QsIC5ncHRhYiwgLmdvdCwgLmR5bmFtaWMsIC5yZWwuZHluLiAgKi8KKworI2VuZGlmCisKK2V4dGVybiB2b2lkIG1kX21pcHNfZW5kIFBBUkFNUyAoKHZvaWQpKTsKKyNkZWZpbmUgbWRfZW5kKCkJbWRfbWlwc19lbmQoKQorCisjZGVmaW5lIFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQJKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyIFwKKwkJCQkgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorCitleHRlcm4gdm9pZCBtaXBzX3BvcF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBtZF9wb3BfaW5zZXJ0KCkJCW1pcHNfcG9wX2luc2VydCgpCisKK2V4dGVybiB2b2lkIG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0CisKK2V4dGVybiB2b2lkIG1pcHNfZW5hYmxlX2F1dG9fYWxpZ24gUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpCW1pcHNfZW5hYmxlX2F1dG9fYWxpZ24oKQorCisjZW5kaWYgLyogVENfTUlQUyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzgwOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmMKQEAgLTAsMCArMSwxNDE0IEBACisvKiB0Yy1tbjEwMjAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMjAwCisKKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKKyNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgorDAorLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLworc3RydWN0IHJlZ19uYW1lCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCB2YWx1ZTsKK307CisKKy8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7IyI7CisKKy8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSAKKyAgIHNpbmdsZSBsaW5lLiAgKi8KK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAorICAgcG9pbnQgbnVtYmVyLiAgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKKyAgIGFzIGluIDBkMS4wLiAgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOworDAorCitjb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0geworICAvKiBiQ0MgcmVsYXhpbmcgKi8KKyAgezB4ODEsIC0weDdlLCAyLCAxfSwKKyAgezB4ODAwNCwgLTB4N2ZmYiwgNSwgMn0sCisgIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA3LCAwfSwKKyAgLyogYkNDeCByZWxheGluZyAqLworICB7MHg4MSwgLTB4N2UsIDMsIDR9LAorICB7MHg4MDA0LCAtMHg3ZmZiLCA2LCA1fSwKKyAgezB4ODAwMDA2LCAtMHg3ZmZmZjksIDgsIDB9LAorICAvKiBqc3IgcmVsYXhpbmcgKi8KKyAgezB4ODAwNCwgLTB4N2ZmYiwgMywgN30sCisgIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA1LCAwfSwKKyAgLyogam1wIHJlbGF4aW5nICovCisgIHsweDgxLCAtMHg3ZSwgMiwgOX0sCisgIHsweDgwMDQsIC0weDdmZmIsIDMsIDEwfSwKKyAgezB4ODAwMDA2LCAtMHg3ZmZmZjksIDUsIDB9LAorCit9OworLyogbG9jYWwgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBtbjEwMjAwX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqLAorCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCwKKwkJCQkJICAgIHVuc2lnbmVkKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaGVja19vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICosCisJCQkJCSAgICBvZmZzZXRUKSk7CitzdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiwgaW50LCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGRhdGFfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKK3N0YXRpYyBib29sZWFuIGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKK3N0YXRpYyBib29sZWFuIG90aGVyX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7CisKKworLyogZml4dXBzICovCisjZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKK3N0cnVjdCBtbjEwMjAwX2ZpeHVwCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgaW50IG9waW5kZXg7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKK307CitzdHJ1Y3QgbW4xMDIwMF9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKK3N0YXRpYyBpbnQgZmM7CisMCitjb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgCisKKy8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsgTlVMTCwgICAgICAgTlVMTCwgICAgICAgICAgIDAgfQorfTsKKworLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1uMTAyMDBfaGFzaDsKKworLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBkYXRhX3JlZ2lzdGVyc1tdID0KK3sKKyAgeyAiZDAiLCAwIH0sCisgIHsgImQxIiwgMSB9LAorICB7ICJkMiIsIDIgfSwKKyAgeyAiZDMiLCAzIH0sCit9OworI2RlZmluZSBEQVRBX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGRhdGFfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGFkZHJlc3NfcmVnaXN0ZXJzW10gPQoreworICB7ICJhMCIsIDAgfSwKKyAgeyAiYTEiLCAxIH0sCisgIHsgImEyIiwgMiB9LAorICB7ICJhMyIsIDMgfSwKK307CisjZGVmaW5lIEFERFJFU1NfUkVHX05BTUVfQ05UCShzaXplb2YoYWRkcmVzc19yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgb3RoZXJfcmVnaXN0ZXJzW10gPQoreworICB7ICJtZHIiLCAwIH0sCisgIHsgInBzdyIsIDAgfSwKK307CisjZGVmaW5lIE9USEVSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKG90aGVyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKKworLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQorICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCisgICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KKworc3RhdGljIGludAorcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKKyAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICpyZWdzOworICAgICBpbnQgcmVnY291bnQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGludCBtaWRkbGUsIGxvdywgaGlnaDsKKyAgaW50IGNtcDsKKworICBsb3cgPSAwOworICBoaWdoID0gcmVnY291bnQgLSAxOworCisgIGRvCisgICAgeworICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKKyAgICAgIGlmIChjbXAgPCAwKQorCWhpZ2ggPSBtaWRkbGUgLSAxOworICAgICAgZWxzZSBpZiAoY21wID4gMCkKKwlsb3cgPSBtaWRkbGUgKyAxOworICAgICAgZWxzZSAKKwkgIHJldHVybiByZWdzW21pZGRsZV0udmFsdWU7CisgICAgfQorICB3aGlsZSAobG93IDw9IGhpZ2gpOworICByZXR1cm4gLTE7Cit9CisKKworLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCisgKgorICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KKyAqCisgKiBvdXQ6IEEgZXhwcmVzc2lvblMuCisgKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAorICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCisgKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgorICoJaXRzIG9yaWdpbmFsIHN0YXRlLgorICovCitzdGF0aWMgYm9vbGVhbgorZGF0YV9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworICBpbnQgcmVnX251bWJlcjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqc3RhcnQ7CisgIGNoYXIgYzsKKworICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLworICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChkYXRhX3JlZ2lzdGVycywgREFUQV9SRUdfTkFNRV9DTlQsIG5hbWUpOworCisgIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCisgIGlmIChyZWdfbnVtYmVyID49IDApIAorICAgIHsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOworCisgICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOworICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgorICoKKyAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCisgKgorICogb3V0OiBBIGV4cHJlc3Npb25TLgorICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKKyAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgorICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KKyAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAqLworc3RhdGljIGJvb2xlYW4KK2FkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCisgICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKK3sKKyAgaW50IHJlZ19udW1iZXI7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnN0YXJ0OworICBjaGFyIGM7CisKKyAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KKyAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoYWRkcmVzc19yZWdpc3RlcnMsIEFERFJFU1NfUkVHX05BTUVfQ05ULCBuYW1lKTsKKworICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLworICBpZiAocmVnX251bWJlciA+PSAwKSAKKyAgICB7CisgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7CisgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKKworICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCisgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KKyAqCisgKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgorICoKKyAqIG91dDogQSBleHByZXNzaW9uUy4KKyAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCisgKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KKyAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCisgKglpdHMgb3JpZ2luYWwgc3RhdGUuCisgKi8KK3N0YXRpYyBib29sZWFuCitvdGhlcl9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworICBpbnQgcmVnX251bWJlcjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqc3RhcnQ7CisgIGNoYXIgYzsKKworICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLworICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChvdGhlcl9yZWdpc3RlcnMsIE9USEVSX1JFR19OQU1FX0NOVCwgbmFtZSk7CisKKyAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KKyAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCisgICAgeworICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7CisKKyAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7CisgICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICBGSUxFICpzdHJlYW07Cit7CisgIGZwcmludGYoc3RyZWFtLCBfKCJNTjEwMjAwIG9wdGlvbnM6XG5cCitub25lIHlldFxuIikpOworfSAKKworaW50CittZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKKyAgICAgaW50IGM7CisgICAgIGNoYXIgKmFyZzsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0cCwgc2l6ZXApCisgIGludCB0eXBlOworICBjaGFyICpsaXRwOworICBpbnQgKnNpemVwOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07CisgIGNoYXIgKnQ7CisgIGludCBpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplcCA9IDA7CisgICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOworICAgIH0KKyAgCisgIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOworICBpZiAodCkKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OworCisgICpzaXplcCA9IHByZWMgKiAyOworCisgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKKyAgICAgIGxpdHAgKz0gMjsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQorICBiZmQgKmFiZmQ7CisgIGFzZWN0aW9uICpzZWM7CisgIGZyYWdTICpmcmFnUDsKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFiZWxfY291bnQgPSAwOworICBjaGFyIGJ1Zls0MF07CisKKyAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKKyAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDApCisgICAgeworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCisgICAgeworICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLworICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7CisgICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7CisKKyAgICAgIHN3aXRjaCAob3Bjb2RlKQorCXsKKwljYXNlIDB4ZTg6CisJICBvcGNvZGUgPSAweGU5OworCSAgYnJlYWs7CisJY2FzZSAweGU5OgorCSAgb3Bjb2RlID0gMHhlODsKKwkgIGJyZWFrOworCWNhc2UgMHhlMDoKKwkgIG9wY29kZSA9IDB4ZTI7CisJICBicmVhazsKKwljYXNlIDB4ZTI6CisJICBvcGNvZGUgPSAweGUwOworCSAgYnJlYWs7CisJY2FzZSAweGUzOgorCSAgb3Bjb2RlID0gMHhlMTsKKwkgIGJyZWFrOworCWNhc2UgMHhlMToKKwkgIG9wY29kZSA9IDB4ZTM7CisJICBicmVhazsKKwljYXNlIDB4ZTQ6CisJICBvcGNvZGUgPSAweGU2OworCSAgYnJlYWs7CisJY2FzZSAweGU2OgorCSAgb3Bjb2RlID0gMHhlNDsKKwkgIGJyZWFrOworCWNhc2UgMHhlNzoKKwkgIG9wY29kZSA9IDB4ZTU7CisJICBicmVhazsKKwljYXNlIDB4ZTU6CisJICBvcGNvZGUgPSAweGU3OworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7CisKKyAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCisJICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKKworICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKKwkgZmluYWwgdGFyZ2V0LiAgKi8KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhmYzsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMywgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKKyAgICB7CisgICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKKworICAgICAgc3dpdGNoIChvcGNvZGUpCisJeworCWNhc2UgMHhlODoKKwkgIG9wY29kZSA9IDB4ZTk7CisJICBicmVhazsKKwljYXNlIDB4ZTk6CisJICBvcGNvZGUgPSAweGU4OworCSAgYnJlYWs7CisJY2FzZSAweGUwOgorCSAgb3Bjb2RlID0gMHhlMjsKKwkgIGJyZWFrOworCWNhc2UgMHhlMjoKKwkgIG9wY29kZSA9IDB4ZTA7CisJICBicmVhazsKKwljYXNlIDB4ZTM6CisJICBvcGNvZGUgPSAweGUxOworCSAgYnJlYWs7CisJY2FzZSAweGUxOgorCSAgb3Bjb2RlID0gMHhlMzsKKwkgIGJyZWFrOworCWNhc2UgMHhlNDoKKwkgIG9wY29kZSA9IDB4ZTY7CisJICBicmVhazsKKwljYXNlIDB4ZTY6CisJICBvcGNvZGUgPSAweGU0OworCSAgYnJlYWs7CisJY2FzZSAweGU3OgorCSAgb3Bjb2RlID0gMHhlNTsKKwkgIGJyZWFrOworCWNhc2UgMHhlNToKKwkgIG9wY29kZSA9IDB4ZTc7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKKworICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLworICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKKwkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOworCisgICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQorCSBmaW5hbCB0YXJnZXQuICAqLworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGY0OworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGUwOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDc7CisgICAgfQorICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQorICAgIHsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7CisgICAgfQorICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA0KQorICAgIHsKKyAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KKyAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OworICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdICYgMHhmZjsKKworICAgICAgc3dpdGNoIChvcGNvZGUpCisJeworCWNhc2UgMHhmYzoKKwkgIG9wY29kZSA9IDB4ZmQ7CisJICBicmVhazsKKwljYXNlIDB4ZmQ6CisJICBvcGNvZGUgPSAweGZjOworCSAgYnJlYWs7CisJY2FzZSAweGZlOgorCSAgb3Bjb2RlID0gMHhmZjsKKwkgIGJyZWFrOworCWNhc2UgMHhmZjoKKwkgIG9wY29kZSA9IDB4ZmU7CisJY2FzZSAweGU4OgorCSAgb3Bjb2RlID0gMHhlOTsKKwkgIGJyZWFrOworCWNhc2UgMHhlOToKKwkgIG9wY29kZSA9IDB4ZTg7CisJICBicmVhazsKKwljYXNlIDB4ZTA6CisJICBvcGNvZGUgPSAweGUyOworCSAgYnJlYWs7CisJY2FzZSAweGUyOgorCSAgb3Bjb2RlID0gMHhlMDsKKwkgIGJyZWFrOworCWNhc2UgMHhlMzoKKwkgIG9wY29kZSA9IDB4ZTE7CisJICBicmVhazsKKwljYXNlIDB4ZTE6CisJICBvcGNvZGUgPSAweGUzOworCSAgYnJlYWs7CisJY2FzZSAweGU0OgorCSAgb3Bjb2RlID0gMHhlNjsKKwkgIGJyZWFrOworCWNhc2UgMHhlNjoKKwkgIG9wY29kZSA9IDB4ZTQ7CisJICBicmVhazsKKwljYXNlIDB4ZTc6CisJICBvcGNvZGUgPSAweGU1OworCSAgYnJlYWs7CisJY2FzZSAweGU1OgorCSAgb3Bjb2RlID0gMHhlNzsKKwkgIGJyZWFrOworCWNhc2UgMHhlYzoKKwkgIG9wY29kZSA9IDB4ZWQ7CisJICBicmVhazsKKwljYXNlIDB4ZWQ6CisJICBvcGNvZGUgPSAweGVjOworCSAgYnJlYWs7CisJY2FzZSAweGVlOgorCSAgb3Bjb2RlID0gMHhlZjsKKwkgIGJyZWFrOworCWNhc2UgMHhlZjoKKwkgIG9wY29kZSA9IDB4ZWU7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7CisKKyAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCisJICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKKworICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKKwkgZmluYWwgdGFyZ2V0LiAgKi8KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhmYzsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNSkKKyAgICB7CisgICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7CisKKyAgICAgIHN3aXRjaCAob3Bjb2RlKQorCXsKKwljYXNlIDB4ZmM6CisJICBvcGNvZGUgPSAweGZkOworCSAgYnJlYWs7CisJY2FzZSAweGZkOgorCSAgb3Bjb2RlID0gMHhmYzsKKwkgIGJyZWFrOworCWNhc2UgMHhmZToKKwkgIG9wY29kZSA9IDB4ZmY7CisJICBicmVhazsKKwljYXNlIDB4ZmY6CisJICBvcGNvZGUgPSAweGZlOworCWNhc2UgMHhlODoKKwkgIG9wY29kZSA9IDB4ZTk7CisJICBicmVhazsKKwljYXNlIDB4ZTk6CisJICBvcGNvZGUgPSAweGU4OworCSAgYnJlYWs7CisJY2FzZSAweGUwOgorCSAgb3Bjb2RlID0gMHhlMjsKKwkgIGJyZWFrOworCWNhc2UgMHhlMjoKKwkgIG9wY29kZSA9IDB4ZTA7CisJICBicmVhazsKKwljYXNlIDB4ZTM6CisJICBvcGNvZGUgPSAweGUxOworCSAgYnJlYWs7CisJY2FzZSAweGUxOgorCSAgb3Bjb2RlID0gMHhlMzsKKwkgIGJyZWFrOworCWNhc2UgMHhlNDoKKwkgIG9wY29kZSA9IDB4ZTY7CisJICBicmVhazsKKwljYXNlIDB4ZTY6CisJICBvcGNvZGUgPSAweGU0OworCSAgYnJlYWs7CisJY2FzZSAweGU3OgorCSAgb3Bjb2RlID0gMHhlNTsKKwkgIGJyZWFrOworCWNhc2UgMHhlNToKKwkgIG9wY29kZSA9IDB4ZTc7CisJICBicmVhazsKKwljYXNlIDB4ZWM6CisJICBvcGNvZGUgPSAweGVkOworCSAgYnJlYWs7CisJY2FzZSAweGVkOgorCSAgb3Bjb2RlID0gMHhlYzsKKwkgIGJyZWFrOworCWNhc2UgMHhlZToKKwkgIG9wY29kZSA9IDB4ZWY7CisJICBicmVhazsKKwljYXNlIDB4ZWY6CisJICBvcGNvZGUgPSAweGVlOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOworCisgICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCisgICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAorCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7CisKKyAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCisJIGZpbmFsIHRhcmdldC4gICovCisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZjQ7CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA0XSA9IDB4ZTA7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDUsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gODsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDYpCisgICAgeworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7CisgICAgfQorICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA3KQorICAgIHsKKyAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZjQ7CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IDB4ZTE7CisKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOCkKKyAgICB7CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4XSA9IDB4ZWE7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZjOworCisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEwKQorICAgIHsKKyAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZjQ7CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IDB4ZTA7CisKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OworICAgIH0KKyAgZWxzZQorICAgIGFib3J0ICgpOworfQorCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKKyAgICAgYXNlY3Rpb24gKnNlZzsKKyAgICAgdmFsdWVUIGFkZHI7Cit7CisgIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKKyAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Cit9CisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGNoYXIgKnByZXZfbmFtZSA9ICIiOworICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wOworCisgIG1uMTAyMDBfaGFzaCA9IGhhc2hfbmV3KCk7CisKKyAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgTU4xMDIwMCBpbnN0cnVjdGlvbiBzZXQKKyAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKKyAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bworICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCisKKyAgb3AgPSBtbjEwMjAwX29wY29kZXM7CisgIHdoaWxlIChvcC0+bmFtZSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wLT5uYW1lKSkgCisJeworCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AtPm5hbWU7CisJICBoYXNoX2luc2VydCAobW4xMDIwMF9oYXNoLCBvcC0+bmFtZSwgKGNoYXIgKikgb3ApOworCX0KKyAgICAgIG9wKys7CisgICAgfQorCisgIC8qIFRoaXMgaXMgYm90aCBhIHNpbXBsaWZpY2F0aW9uICh3ZSBkb24ndCBoYXZlIHRvIHdyaXRlIG1kX2FwcGx5X2ZpeCkKKyAgICAgYW5kIHN1cHBvcnQgZm9yIGZ1dHVyZSBvcHRpbWl6YXRpb25zIChicmFuY2ggc2hvcnRlbmluZyBhbmQgc2ltaWxhcgorICAgICBzdHVmZiBpbiB0aGUgbGlua2VyLiAgKi8KKyAgbGlua3JlbGF4ID0gMTsKK30KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikgCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgY2hhciAqczsKKyAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcGNvZGU7CisgIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqbmV4dF9vcGNvZGU7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOworICBpbnQgbmV4dF9vcGluZGV4LCByZWxheGFibGU7CisgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uLCBzaXplID0gMDsKKyAgY2hhciAqZjsKKyAgaW50IGk7CisgIGludCBtYXRjaDsKKworICAvKiBHZXQgdGhlIG9wY29kZS4gICovCisgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQorICAgIDsKKyAgaWYgKCpzICE9ICdcMCcpCisgICAgKnMrKyA9ICdcMCc7CisKKyAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCisgIG9wY29kZSA9IChzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKiloYXNoX2ZpbmQgKG1uMTAyMDBfaGFzaCwgc3RyKTsKKyAgaWYgKG9wY29kZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdHIgPSBzOworICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCisgICAgKytzdHI7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworCisgIGZvcig7OykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOworICAgICAgaW50IG9wX2lkeDsKKyAgICAgIGNoYXIgKmhvbGQ7CisgICAgICBpbnQgZXh0cmFfc2hpZnQgPSAwOworCisgICAgICByZWxheGFibGUgPSAwOworICAgICAgZmMgPSAwOworICAgICAgbWF0Y2ggPSAwOworICAgICAgbmV4dF9vcGluZGV4ID0gMDsKKyAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKKyAgICAgIGV4dGVuc2lvbiA9IDA7CisgICAgICBmb3IgKG9wX2lkeCA9IDEsIG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsKKwkgICAqb3BpbmRleF9wdHIgIT0gMDsKKwkgICBvcGluZGV4X3B0cisrLCBvcF9pZHgrKykKKwl7CisJICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOworCSAgZXhwcmVzc2lvblMgZXg7CisKKwkgIGlmIChuZXh0X29waW5kZXggPT0gMCkKKwkgICAgeworCSAgICAgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbbmV4dF9vcGluZGV4XTsKKwkgICAgICBuZXh0X29waW5kZXggPSAwOworCSAgICB9CisKKwkgIGVycm1zZyA9IE5VTEw7CisKKwkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKKwkgICAgKytzdHI7CisKKwkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9SRUxBWCkKKwkgICAgcmVsYXhhYmxlID0gMTsKKworCSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAqLworCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKworCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKQorCSAgICB7CisJICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyknICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJygnKQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKwkgIC8qIFNlZSBpZiB3ZSBjYW4gbWF0Y2ggdGhlIG9wZXJhbmRzLiAgKi8KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0RSRUcpCisJICAgIHsKKwkgICAgICBpZiAoIWRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKKwkJeworCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJCSAgc3RyID0gaG9sZDsKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0FSRUcpCisJICAgIHsKKwkgICAgICBpZiAoIWFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKKwkJeworCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJCSAgc3RyID0gaG9sZDsKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BTVykKKwkgICAgeworCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisJICAgICAgaWYgKHN0cmNtcCAoc3RhcnQsICJwc3ciKSAhPSAwKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01EUikKKwkgICAgeworCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisJICAgICAgaWYgKHN0cmNtcCAoc3RhcnQsICJtZHIiKSAhPSAwKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKwkgIGVsc2UgaWYgKGRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgc3RyID0gaG9sZDsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlIGlmIChhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCisJICAgIHsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCSAgICAgIHN0ciA9IGhvbGQ7CisJICAgICAgZ290byBlcnJvcjsKKwkgICAgfQorCSAgZWxzZSBpZiAob3RoZXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgc3RyID0gaG9sZDsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlIGlmICgqc3RyID09ICcpJyB8fCAqc3RyID09ICcoJykKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgc3RyID0gaG9sZDsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHByZXNzaW9uICgmZXgpOworCSAgICB9CisKKwkgIHN3aXRjaCAoZXguWF9vcCkgCisJICAgIHsKKwkgICAgY2FzZSBPX2lsbGVnYWw6CisJICAgICAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7CisJICAgICAgZ290byBlcnJvcjsKKwkgICAgY2FzZSBPX2Fic2VudDoKKwkgICAgICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICBjYXNlIE9fcmVnaXN0ZXI6CisJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncworICAgICAgICAgICAgICAgICAgICYgKE1OMTAyMDBfT1BFUkFORF9EUkVHIHwgTU4xMDIwMF9PUEVSQU5EX0FSRUcpKSA9PSAwKQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkJCisJICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8yIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF81KQorCQlleHRyYV9zaGlmdCA9IDg7CisJICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzYKKwkJICAgICAgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF83KQorCQlleHRyYV9zaGlmdCA9IDE2OworCSAgICAgIGVsc2UKKwkJZXh0cmFfc2hpZnQgPSAwOworCSAgICAgIAorCSAgICAgIG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAorCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKKwkJCQkgICAgICAwLCBleHRyYV9zaGlmdCk7CisKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE9fY29uc3RhbnQ6CisJICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgYW5kIGl0IGRvZXNuJ3QKKwkJIGZpdCBpbnRvIHRoZSBhbGxvY2F0ZWQgYml0ZmllbGQgZm9yIHRoaXMgaW5zbiwKKwkJIHRoZW4gcHJvbW90ZSBpdCAoaWUgdGhpcyBvcGNvZGUgZG9lcyBub3QgbWF0Y2gpLiAgKi8KKwkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MKKwkJICAmIChNTjEwMjAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWCkKKwkJICAmJiAhIGNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcikpCisJCXsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCisJCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAorCQkJCSAgICAgIDAsIDApOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgdGhlbiB0aGlzIG9wY29kZSBkaWRuJ3QKKwkJIG1hdGNoIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgaXQgbmVlZGVkIHByb21vdGlvbiEgICovCisJICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BST01PVEUpCisJCXsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLworCSAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCisJCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisJICAgICAgZml4dXBzW2ZjXS5leHAgPSBleDsKKwkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7CisJICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7CisJICAgICAgKytmYzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCitrZWVwX2dvaW5nOgorCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKworCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQorCSAgICArK3N0cjsKKworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHdlIHVzZWQgYWxsIHRoZSBvcGVyYW5kcyEgICovCisgICAgICBpZiAoKnN0ciAhPSAnLCcpCisJbWF0Y2ggPSAxOworCisgICAgZXJyb3I6CisgICAgICBpZiAobWF0Y2ggPT0gMCkKKyAgICAgICAgeworCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOworCSAgaWYgKCFzdHJjbXAobmV4dF9vcGNvZGUtPm5hbWUsIG9wY29kZS0+bmFtZSkpCisJICAgIHsKKwkgICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgCisJICBhc19iYWQgKCIlcyIsIGVycm1zZyk7CisJICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAgIAorICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCisgICAgKytzdHI7CisKKyAgaWYgKCpzdHIgIT0gJ1wwJykKKyAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKKworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7CisKKyAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8xKQorICAgIHNpemUgPSAxOworICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNCkKKyAgICBzaXplID0gMjsKKyAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzUpCisgICAgc2l6ZSA9IDM7CisgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF82KQorICAgIHNpemUgPSA0OworICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKKyAgICBzaXplID0gNTsKKyAgZWxzZQorICAgIGFib3J0ICgpOworICAgICAgICAgCisgIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCisgIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQorICAgIHsKKyAgICAgIGludCB0eXBlOworCisgICAgICAvKiBiQ0MgKi8KKyAgICAgIGlmIChzaXplID09IDIgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYzAwMDApCisJeworCSAgLyogSGFuZGxlIGJyYSBzcGVjaWFsbHkuICBCYXNpY2FsbHkgdHJlYXQgaXQgbGlrZSBqbXAgc28KKwkgICAgIHRoYXQgd2UgYXV0b21hdGljYWxseSBoYW5kbGUgOCwgMTYgYW5kIDMyIGJpdCBvZmZzZXRzCisJICAgICBjb3JyZWN0bHkgYXMgd2VsbCBhcyBqdW1wcyB0byBhbiB1bmRlZmluZWQgYWRkcmVzcy4KKworCSAgICAgSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90IHRyZWF0IGl0IGxpa2Ugb3RoZXIgYkNDCisJICAgICBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGxvbmcgZm9ybXMgb2YgYnJhIGlzIGRpZmZlcmVudAorCSAgICAgZnJvbSBvdGhlciBiQ0MgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgICAgICAgICBpZiAob3Bjb2RlLT5vcGNvZGUgPT0gMHhlYTAwKQorICAgICAgICAgICAgdHlwZSA9IDg7CisJICBlbHNlCisJICAgIHR5cGUgPSAwOworCX0KKyAgICAgIC8qIGpzciAqLworICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4ZmQwMDAwKQorCXR5cGUgPSA2OworICAgICAgLyogam1wICovCisgICAgICBlbHNlIGlmIChzaXplID09IDMgJiYgb3Bjb2RlLT5vcGNvZGUgPT0gMHhmYzAwMDApCisJdHlwZSA9IDg7CisgICAgICAvKiBiQ0N4ICovCisgICAgICBlbHNlCisJdHlwZSA9IDM7CisKKyAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDggLSBzaXplLCB0eXBlLAorCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCisJCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKKwkJICAgIChjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOworICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSk7CisgICAgICBpZiAoOCAtIHNpemUgPiA0KQorCXsKKwkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplLCAwLCA0KTsKKwkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplICsgNCwgMCwgOCAtIHNpemUgLSA0KTsKKwl9CisgICAgICBlbHNlCisJbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIHNpemUsIDAsIDggLSBzaXplKTsKKyAgICB9CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGYgPSBmcmFnX21vcmUgKHNpemUpOworCisgICAgICAvKiBPaCwgd2hhdCBhIG1lc3MuICBUaGUgaW5zdHJ1Y3Rpb24gaXMgaW4gYmlnIGVuZGlhbiBmb3JtYXQsIGJ1dAorCSAxNiBhbmQgMjRiaXQgaW1tZWRpYXRlcyBhcmUgbGl0dGxlIGVuZGlhbiEgICovCisgICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMpCisJeworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZiwgMSk7CisJICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgaW5zbiAmIDB4ZmZmZiwgMik7CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzYpCisJeworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKKwkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKKwl9CisgICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKKwl7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOworCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIGluc24gJiAweGZmZmYsIDIpOworCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplID4gNCA/IDQgOiBzaXplKTsKKwl9CisKKyAgICAgIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQorCXsKKwkgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7CisKKwkgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF07CisJICBpZiAoZml4dXBzW2ldLnJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCisJICAgIHsKKwkgICAgICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bzsKKwkgICAgICBpbnQgc2l6ZTsKKwkgICAgICBpbnQgb2Zmc2V0OworCSAgICAgIGZpeFMgKmZpeFA7CisKKwkgICAgICByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOworCisJICAgICAgaWYgKCFyZWxvY19ob3d0bykKKwkJYWJvcnQoKTsKKwkgIAorCSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKKworCSAgICAgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKKwkJYWJvcnQoKTsKKworCSAgICAgIG9mZnNldCA9IDQgLSBzaXplOworCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKKwkJCQkgIHNpemUsCisJCQkJICAmZml4dXBzW2ldLmV4cCwgCisJCQkJICByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCisJCQkJICBmaXh1cHNbaV0ucmVsb2MpOworCisJICAgICAgLyogUEMtcmVsYXRpdmUgb2Zmc2V0cyBhcmUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dAorCQkgaW5zdHJ1Y3Rpb24sIG5vdCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCisJICAgICAgaWYgKHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSkKKwkJZml4UC0+Znhfb2Zmc2V0ICs9IHNpemU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCByZWxvYywgcGNyZWwsIHJlbG9jX3NpemUsIG9mZnNldDsKKwkgICAgICBmaXhTICpmaXhQOworCisJICAgICAgcmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKKwkgICAgICAvKiBIb3cgYmlnIGlzIHRoZSByZWxvYz8gIFJlbWVtYmVyIFNQTElUIHJlbG9jcyBhcmUKKwkJIGltcGxpY2l0bHkgMzJiaXRzLiAgKi8KKwkgICAgICByZWxvY19zaXplID0gb3BlcmFuZC0+Yml0czsKKworCSAgICAgIG9mZnNldCA9IHNpemUgLSByZWxvY19zaXplIC8gODsKKworCSAgICAgIC8qIElzIHRoZSByZWxvYyBwYy1yZWxhdGl2ZT8gICovCisJICAgICAgcGNyZWwgPSAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUENSRUwpICE9IDA7CisKKworCSAgICAgIC8qIENob29zZSBhIHByb3BlciBCRkQgcmVsb2NhdGlvbiB0eXBlLiAgKi8KKwkgICAgICBpZiAocGNyZWwpCisJCXsKKwkJICBpZiAocmVsb2Nfc2l6ZSA9PSA4KQorCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKKwkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDI0KQorCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMjRfUENSRUw7CisJCSAgZWxzZQorCQkgICAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKKwkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyOworCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCisJCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNjsKKwkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCisJCSAgICByZWxvYyA9IEJGRF9SRUxPQ184OworCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMjQpCisJCSAgICByZWxvYyA9IEJGRF9SRUxPQ18yNDsKKwkJICBlbHNlCisJCSAgICBhYm9ydCAoKTsKKwkJfQorCisJICAgICAgLyogQ29udmVydCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgaW50byB3aGF0IGZpeF9uZXdfZXhwIHdhbnRzLiAgKi8KKwkgICAgICByZWxvY19zaXplID0gcmVsb2Nfc2l6ZSAvIDg7CisJICAgICAgaWYgKHJlbG9jX3NpemUgPT0gOCkKKwkJcmVsb2Nfc2l6ZSA9IDA7CisJICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKKwkJcmVsb2Nfc2l6ZSA9IDE7CisJICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAzMiB8fCByZWxvY19zaXplID09IDI0KQorCQlyZWxvY19zaXplID0gMjsKKworCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKKwkJCQkgIHJlbG9jX3NpemUsICZmaXh1cHNbaV0uZXhwLCBwY3JlbCwKKwkJCQkgICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvYykpOworCisJICAgICAgLyogUEMtcmVsYXRpdmUgb2Zmc2V0cyBhcmUgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dAorCQkgaW5zdHJ1Y3Rpb24sIG5vdCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCisJICAgICAgaWYgKHBjcmVsKQorCQlmaXhQLT5meF9vZmZzZXQgKz0gc2l6ZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCisvKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLworICAgICAgICAgICAgICAgICAKK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCisgICAgIGFzZWN0aW9uICpzZWc7CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGFyZWxlbnQgKnJlbG9jOworICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCisgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOworICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCisgICAgeworICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAorCQkgICAgKGludClmaXhwLT5meF9yX3R5cGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKworICBpZiAoZml4cC0+ZnhfYWRkc3kgJiYgZml4cC0+Znhfc3Vic3kpCisgICAgeworICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpKQorCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uKQorCXsKKwkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCSJEaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICZiZmRfYWJzX3N5bWJvbDsKKyAgICAgIHJlbG9jLT5hZGRlbmQgPSAoU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KQorCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpICsgZml4cC0+Znhfb2Zmc2V0KTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworICAgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKKyAgICB9CisgIHJldHVybiByZWxvYzsKK30KKworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKKyAgICAgZnJhZ1MgKmZyYWdwOworICAgICBhc2VjdGlvbiAqc2VnOworeworICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMCkKKyAgICByZXR1cm4gMjsKKyAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDMpCisgICAgcmV0dXJuIDM7CisgIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSA2KQorICAgIHsKKyAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQorCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQorCXsKKwkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gNzsKKwkgIHJldHVybiA1OworCX0KKyAgICAgIHJldHVybiAzOworICAgIH0KKyAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCisgICAgeworICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpKQorCXsKKwkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTA7CisJICByZXR1cm4gNTsKKwl9CisgICAgICByZXR1cm4gMjsKKyAgICB9Cit9IAorCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhwKQorICAgICBmaXhTICpmaXhwOworeworICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKKyNpZiAwCisgIGlmIChmaXhwLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMICYmICEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkpCisgICAgeworICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKyNlbmRpZgorfQorCitpbnQKK21kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQorICAgICBmaXhTICpmaXhwOworICAgICB2YWx1ZVQgKnZhbHVlcDsKKyAgICAgc2VnVCBzZWc7Cit7CisgIC8qIFdlIHNob3VsZG4ndCBldmVyIGdldCBoZXJlIGJlY2F1c2UgbGlua3JlbGF4IGlzIG5vbnplcm8uICAqLworICBhYm9ydCAoKTsKKyAgZml4cC0+ZnhfZG9uZSA9IDE7CisgIHJldHVybiAwOworfQorCisvKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK21uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKGluc25wLCBleHRlbnNpb25wLCBvcGVyYW5kLCB2YWwsIGZpbGUsIGxpbmUsIHNoaWZ0KQorICAgICB1bnNpZ25lZCBsb25nICppbnNucDsKKyAgICAgdW5zaWduZWQgbG9uZyAqZXh0ZW5zaW9ucDsKKyAgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgb2Zmc2V0VCB2YWw7CisgICAgIGNoYXIgKmZpbGU7CisgICAgIHVuc2lnbmVkIGludCBsaW5lOworICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7Cit7CisgIC8qIE5vIG5lZWQgdG8gY2hlY2sgMjQgb3IgMzJiaXQgb3BlcmFuZHMgZm9yIGEgYml0LiAgKi8KKyAgaWYgKG9wZXJhbmQtPmJpdHMgPCAyNAorICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spID09IDApCisgICAgeworICAgICAgbG9uZyBtaW4sIG1heDsKKyAgICAgIG9mZnNldFQgdGVzdDsKKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCisJeworCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOworCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7CisgICAgICAgICAgbWluID0gMDsKKyAgICAgICAgfQorCisgICAgICB0ZXN0ID0gdmFsOworCisKKyAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciA9CisgICAgICAgICAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7CisgICAgICAgICAgY2hhciBidWZbMTAwXTsKKworICAgICAgICAgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKKyAgICAgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQorICAgICAgICAgICAgYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOworICAgICAgICB9CisgICAgfQorCisgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQpID09IDApCisgICAgeworICAgICAgKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQorCQkgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKKwkqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCisJCSAgIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgMikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpleHRlbnNpb25wIHw9ICh2YWwgPj4gMTYpICYgMHhmZjsKKyAgICAgICppbnNucCB8PSB2YWwgJiAweGZmZmY7CisgICAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIG9mZnNldFQgdmFsOworeworICAvKiBObyBuZWVkIHRvIGNoZWNrIDI0Yml0IG9yIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gICovCisgIGlmIChvcGVyYW5kLT5iaXRzIDwgMjQKKyAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLKSA9PSAwKQorICAgIHsKKyAgICAgIGxvbmcgbWluLCBtYXg7CisgICAgICBvZmZzZXRUIHRlc3Q7CisKKyAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQorCXsKKwkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKKwkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOworICAgICAgICAgIG1pbiA9IDA7CisgICAgICAgIH0KKworICAgICAgdGVzdCA9IHZhbDsKKworCisgICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCisJcmV0dXJuIDA7CisgICAgICBlbHNlCisJcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzZTU2OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtbW4xMDIwMC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHRjLW1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbW4xMDIwMC5jLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUgVENfTU4xMDIwMAorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisgI2Vycm9yIE1OMTAyMDAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCisjZW5kaWYKKworLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbW4xMDIwMAorCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW1uMTAyMDAiCisKKyNkZWZpbmUgTURfQVBQTFlfRklYMworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKKy8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLworI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisvKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKyNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KKworLyogRG9uJ3QgYm90aGVyIHRvIGFkanVzdCByZWxvY3MuICAqLworI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpIDAKKworLyogV2UgZG8gcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBhcyB3ZWxsIGFzIHRoZSBsaW5rZXIuICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107CisjZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKKwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjllOWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMKQEAgLTAsMCArMSwxNjQ5IEBACisvKiB0Yy1tbjEwMzAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwCisKKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKKyNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIgorDAorLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLworc3RydWN0IHJlZ19uYW1lCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCB2YWx1ZTsKK307CisKKy8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7IyI7CisKKy8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYSAKKyAgIHNpbmdsZSBsaW5lLiAgKi8KK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAorICAgcG9pbnQgbnVtYmVyLiAgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKKyAgIGFzIGluIDBkMS4wLiAgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOworDAorCitjb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0geworICAvKiBiQ0MgcmVsYXhpbmcgKi8KKyAgezB4N2YsIC0weDgwLCAyLCAxfSwKKyAgezB4N2ZmZiwgLTB4ODAwMCwgNSwgMn0sCisgIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgNywgMH0sCisKKyAgLyogYkNDIHJlbGF4aW5nICh1bmNvbW1vbiBjYXNlcykgKi8KKyAgezB4N2YsIC0weDgwLCAzLCA0fSwKKyAgezB4N2ZmZiwgLTB4ODAwMCwgNiwgNX0sCisgIHsweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgOCwgMH0sCisKKyAgLyogY2FsbCByZWxheGluZyAqLworICB7MHg3ZmZmLCAtMHg4MDAwLCA1LCA3fSwKKyAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA3LCAwfSwKKworICAvKiBjYWxscyByZWxheGluZyAqLworICB7MHg3ZmZmLCAtMHg4MDAwLCA0LCA5fSwKKyAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA2LCAwfSwKKworICAvKiBqbXAgcmVsYXhpbmcgKi8KKyAgezB4N2YsIC0weDgwLCAyLCAxMX0sCisgIHsweDdmZmYsIC0weDgwMDAsIDMsIDEyfSwKKyAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA1LCAwfSwKKworfTsKKworLyogbG9jYWwgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBtbjEwMzAwX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqLAorCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCwKKwkJCQkJICAgIHVuc2lnbmVkKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaGVja19vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICosCisJCQkJCSAgICBvZmZzZXRUKSk7CitzdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKiwgaW50LCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGRhdGFfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKK3N0YXRpYyBib29sZWFuIGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKK3N0YXRpYyBib29sZWFuIG90aGVyX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7CitzdGF0aWMgdm9pZCBzZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgaW50IGN1cnJlbnRfbWFjaGluZTsKKworLyogZml4dXBzICovCisjZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKK3N0cnVjdCBtbjEwMzAwX2ZpeHVwCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgaW50IG9waW5kZXg7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKK307CitzdHJ1Y3QgbW4xMDMwMF9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKK3N0YXRpYyBpbnQgZmM7CisKKy8qIFdlIG11c3Qgc3RvcmUgdGhlIHZhbHVlIG9mIGVhY2ggcmVnaXN0ZXIgb3BlcmFuZCBzbyB0aGF0IHdlIGNhbgorICAgdmVyaWZ5IHRoYXQgY2VydGFpbiByZWdpc3RlcnMgZG8gbm90IG1hdGNoLiAgKi8KK2ludCBtbjEwMzAwX3JlZ19vcGVyYW5kc1tNTjEwMzAwX01BWF9PUEVSQU5EU107CisMCitjb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgCisKKy8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsgImFtMzAiLAlzZXRfYXJjaF9tYWNoLAkJMzAwIH0sCisgIHsgIm1uMTAzMDAiLAlzZXRfYXJjaF9tYWNoLAkJMzAwIH0sCisgIHtOVUxMLCAwLCAwfQorfTsKKworLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm1uMTAzMDBfaGFzaDsKKworLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuIFN1aXRhYmxlIGZvciBzZWFyY2hpbmcgYnkgYSBiaW5hcnkgc2VhcmNoLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBkYXRhX3JlZ2lzdGVyc1tdID0KK3sKKyAgeyAiZDAiLCAwIH0sCisgIHsgImQxIiwgMSB9LAorICB7ICJkMiIsIDIgfSwKKyAgeyAiZDMiLCAzIH0sCit9OworI2RlZmluZSBEQVRBX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGRhdGFfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGFkZHJlc3NfcmVnaXN0ZXJzW10gPQoreworICB7ICJhMCIsIDAgfSwKKyAgeyAiYTEiLCAxIH0sCisgIHsgImEyIiwgMiB9LAorICB7ICJhMyIsIDMgfSwKK307CisjZGVmaW5lIEFERFJFU1NfUkVHX05BTUVfQ05UCShzaXplb2YoYWRkcmVzc19yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBvdGhlcl9yZWdpc3RlcnNbXSA9Cit7CisgIHsgIm1kciIsIDAgfSwKKyAgeyAicHN3IiwgMCB9LAorICB7ICJzcCIsIDAgfSwKK307CisjZGVmaW5lIE9USEVSX1JFR19OQU1FX0NOVAkoc2l6ZW9mKG90aGVyX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKKworLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQorICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCisgICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KKworc3RhdGljIGludAorcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKKyAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICpyZWdzOworICAgICBpbnQgcmVnY291bnQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGludCBtaWRkbGUsIGxvdywgaGlnaDsKKyAgaW50IGNtcDsKKworICBsb3cgPSAwOworICBoaWdoID0gcmVnY291bnQgLSAxOworCisgIGRvCisgICAgeworICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKKyAgICAgIGlmIChjbXAgPCAwKQorCWhpZ2ggPSBtaWRkbGUgLSAxOworICAgICAgZWxzZSBpZiAoY21wID4gMCkKKwlsb3cgPSBtaWRkbGUgKyAxOworICAgICAgZWxzZSAKKwkgIHJldHVybiByZWdzW21pZGRsZV0udmFsdWU7CisgICAgfQorICB3aGlsZSAobG93IDw9IGhpZ2gpOworICByZXR1cm4gLTE7Cit9CisKKworCisvKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KKyAqCisgKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgorICoKKyAqIG91dDogQSBleHByZXNzaW9uUy4KKyAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCisgKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KKyAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCisgKglpdHMgb3JpZ2luYWwgc3RhdGUuCisgKi8KK3N0YXRpYyBib29sZWFuCitkYXRhX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Cit7CisgIGludCByZWdfbnVtYmVyOworICBjaGFyICpuYW1lOworICBjaGFyICpzdGFydDsKKyAgY2hhciBjOworCisgIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCisgIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGRhdGFfcmVnaXN0ZXJzLCBEQVRBX1JFR19OQU1FX0NOVCwgbmFtZSk7CisKKyAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KKyAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCisgICAgeworICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7CisKKyAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7CisgICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCisgKgorICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KKyAqCisgKiBvdXQ6IEEgZXhwcmVzc2lvblMuCisgKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAorICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCisgKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgorICoJaXRzIG9yaWdpbmFsIHN0YXRlLgorICovCitzdGF0aWMgYm9vbGVhbgorYWRkcmVzc19yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworICBpbnQgcmVnX251bWJlcjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqc3RhcnQ7CisgIGNoYXIgYzsKKworICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLworICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChhZGRyZXNzX3JlZ2lzdGVycywgQUREUkVTU19SRUdfTkFNRV9DTlQsIG5hbWUpOworCisgIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCisgIGlmIChyZWdfbnVtYmVyID49IDApIAorICAgIHsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOworCisgICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOworICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgorICoKKyAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCisgKgorICogb3V0OiBBIGV4cHJlc3Npb25TLgorICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKKyAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgorICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KKyAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAqLworc3RhdGljIGJvb2xlYW4KK290aGVyX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Cit7CisgIGludCByZWdfbnVtYmVyOworICBjaGFyICpuYW1lOworICBjaGFyICpzdGFydDsKKyAgY2hhciBjOworCisgIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCisgIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKG90aGVyX3JlZ2lzdGVycywgT1RIRVJfUkVHX05BTUVfQ05ULCBuYW1lKTsKKworICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLworICBpZiAocmVnX251bWJlciA+PSAwKSAKKyAgICB7CisgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7CisgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKKworICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCisgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgIEZJTEUgKnN0cmVhbTsKK3sKKyAgZnByaW50ZihzdHJlYW0sIF8oIk1OMTAzMDAgb3B0aW9uczpcblwKK25vbmUgeWV0XG4iKSk7Cit9IAorCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICByZXR1cm4gMDsKK30KKworc3ltYm9sUyAqCittZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQorICBjaGFyICpuYW1lOworeworICByZXR1cm4gMDsKK30KKworY2hhciAqCittZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKKyAgaW50IHR5cGU7CisgIGNoYXIgKmxpdHA7CisgIGludCAqc2l6ZXA7Cit7CisgIGludCBwcmVjOworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKKyAgY2hhciAqdDsKKyAgaW50IGk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKnNpemVwID0gMDsKKyAgICAgIHJldHVybiAiYmFkIGNhbGwgdG8gbWRfYXRvZiI7CisgICAgfQorICAKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVwID0gcHJlYyAqIDI7CisKKyAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworICAgICAgbGl0cCArPSAyOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCisgIGJmZCAqYWJmZDsKKyAgYXNlY3Rpb24gKnNlYzsKKyAgZnJhZ1MgKmZyYWdQOworeworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYWJlbF9jb3VudCA9IDA7CisgIGNoYXIgYnVmWzQwXTsKKworICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOworICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCkKKyAgICB7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCisgICAgeworICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLworICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7CisgICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7CisKKyAgICAgIHN3aXRjaCAob3Bjb2RlKQorCXsKKwljYXNlIDB4Yzg6CisJICBvcGNvZGUgPSAweGM5OworCSAgYnJlYWs7CisJY2FzZSAweGM5OgorCSAgb3Bjb2RlID0gMHhjODsKKwkgIGJyZWFrOworCWNhc2UgMHhjMDoKKwkgIG9wY29kZSA9IDB4YzI7CisJICBicmVhazsKKwljYXNlIDB4YzI6CisJICBvcGNvZGUgPSAweGMwOworCSAgYnJlYWs7CisJY2FzZSAweGMzOgorCSAgb3Bjb2RlID0gMHhjMTsKKwkgIGJyZWFrOworCWNhc2UgMHhjMToKKwkgIG9wY29kZSA9IDB4YzM7CisJICBicmVhazsKKwljYXNlIDB4YzQ6CisJICBvcGNvZGUgPSAweGM2OworCSAgYnJlYWs7CisJY2FzZSAweGM2OgorCSAgb3Bjb2RlID0gMHhjNDsKKwkgIGJyZWFrOworCWNhc2UgMHhjNzoKKwkgIG9wY29kZSA9IDB4YzU7CisJICBicmVhazsKKwljYXNlIDB4YzU6CisJICBvcGNvZGUgPSAweGM3OworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7CisKKyAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCisJICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7CisKKyAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCisJIGZpbmFsIHRhcmdldC4gICovCisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4Y2M7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7CisgICAgfQorICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQorICAgIHsKKyAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KKyAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OworICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOworCisgICAgICBzd2l0Y2ggKG9wY29kZSkKKwl7CisJY2FzZSAweGM4OgorCSAgb3Bjb2RlID0gMHhjOTsKKwkgIGJyZWFrOworCWNhc2UgMHhjOToKKwkgIG9wY29kZSA9IDB4Yzg7CisJICBicmVhazsKKwljYXNlIDB4YzA6CisJICBvcGNvZGUgPSAweGMyOworCSAgYnJlYWs7CisJY2FzZSAweGMyOgorCSAgb3Bjb2RlID0gMHhjMDsKKwkgIGJyZWFrOworCWNhc2UgMHhjMzoKKwkgIG9wY29kZSA9IDB4YzE7CisJICBicmVhazsKKwljYXNlIDB4YzE6CisJICBvcGNvZGUgPSAweGMzOworCSAgYnJlYWs7CisJY2FzZSAweGM0OgorCSAgb3Bjb2RlID0gMHhjNjsKKwkgIGJyZWFrOworCWNhc2UgMHhjNjoKKwkgIG9wY29kZSA9IDB4YzQ7CisJICBicmVhazsKKwljYXNlIDB4Yzc6CisJICBvcGNvZGUgPSAweGM1OworCSAgYnJlYWs7CisJY2FzZSAweGM1OgorCSAgb3Bjb2RlID0gMHhjNzsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOworCisgICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCisgICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAorCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOworCisgICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQorCSBmaW5hbCB0YXJnZXQuICAqLworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gPSAweGRjOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAzLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKKyAgICB7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDQpCisgICAgeworICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLworICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7CisgICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOworCisgICAgICBzd2l0Y2ggKG9wY29kZSkKKwl7CisJY2FzZSAweGU4OgorCSAgb3Bjb2RlID0gMHhlOTsKKwkgIGJyZWFrOworCWNhc2UgMHhlOToKKwkgIG9wY29kZSA9IDB4ZTg7CisJICBicmVhazsKKwljYXNlIDB4ZWE6CisJICBvcGNvZGUgPSAweGViOworCSAgYnJlYWs7CisJY2FzZSAweGViOgorCSAgb3Bjb2RlID0gMHhlYTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKKworICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLworICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKKwkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKKworICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKKwkgZmluYWwgdGFyZ2V0LiAgKi8KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhjYzsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDUpCisgICAgeworICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLworICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7CisgICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOworCisgICAgICBzd2l0Y2ggKG9wY29kZSkKKwl7CisJY2FzZSAweGU4OgorCSAgb3Bjb2RlID0gMHhlOTsKKwkgIGJyZWFrOworCWNhc2UgMHhlYToKKwkgIG9wY29kZSA9IDB4ZWI7CisJICBicmVhazsKKwljYXNlIDB4ZWI6CisJICBvcGNvZGUgPSAweGVhOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOworCisgICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCisgICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAorCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOworCisgICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQorCSBmaW5hbCB0YXJnZXQuICAqLworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGRjOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA4OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNikKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGNkOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA1OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNykKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGRkOworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNV0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXTsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDZdID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNF07CisKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gNzsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDgpCisgICAgeworICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYTsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhmZjsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDkpCisgICAgeworICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7CisgICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYzsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gMHhmZjsKKworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OworICAgIH0KKyAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMTApCisgICAgeworICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeF0gPSAweGNhOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CisgICAgfQorICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGNjOworCisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7CisgICAgfQorICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMikKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGRjOworCisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7CisgICAgfQorICBlbHNlCisgICAgYWJvcnQgKCk7Cit9CisKK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQorICAgICBhc2VjdGlvbiAqc2VnOworICAgICB2YWx1ZVQgYWRkcjsKK3sKKyAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOworICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKK30KKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgY2hhciAqcHJldl9uYW1lID0gIiI7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3A7CisKKyAgbW4xMDMwMF9oYXNoID0gaGFzaF9uZXcoKTsKKworICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBNTjEwMzAwIGluc3RydWN0aW9uIHNldAorICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAorICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCisgICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KKworICBvcCA9IG1uMTAzMDBfb3Bjb2RlczsKKyAgd2hpbGUgKG9wLT5uYW1lKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AtPm5hbWUpKSAKKwl7CisJICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcC0+bmFtZTsKKwkgIGhhc2hfaW5zZXJ0IChtbjEwMzAwX2hhc2gsIG9wLT5uYW1lLCAoY2hhciAqKSBvcCk7CisJfQorICAgICAgb3ArKzsKKyAgICB9CisKKyAgLyogVGhpcyBpcyBib3RoIGEgc2ltcGxpZmljYXRpb24gKHdlIGRvbid0IGhhdmUgdG8gd3JpdGUgbWRfYXBwbHlfZml4KQorICAgICBhbmQgc3VwcG9ydCBmb3IgZnV0dXJlIG9wdGltaXphdGlvbnMgKGJyYW5jaCBzaG9ydGVuaW5nIGFuZCBzaW1pbGFyCisgICAgIHN0dWZmIGluIHRoZSBsaW5rZXIpLiAgKi8KKyAgbGlua3JlbGF4ID0gMTsKKworICAvKiBTZXQgdGhlIGRlZmF1bHQgbWFjaGluZSB0eXBlLiAgKi8KKyAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9tbjEwMzAwLCAzMDApKQorICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOworCisgIGN1cnJlbnRfbWFjaGluZSA9IDMwMDsKK30KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikgCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgY2hhciAqczsKKyAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcGNvZGU7CisgIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqbmV4dF9vcGNvZGU7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOworICBpbnQgbmV4dF9vcGluZGV4LCByZWxheGFibGU7CisgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uLCBzaXplID0gMDsKKyAgY2hhciAqZjsKKyAgaW50IGk7CisgIGludCBtYXRjaDsKKworICAvKiBHZXQgdGhlIG9wY29kZS4gICovCisgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQorICAgIDsKKyAgaWYgKCpzICE9ICdcMCcpCisgICAgKnMrKyA9ICdcMCc7CisKKyAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCisgIG9wY29kZSA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiloYXNoX2ZpbmQgKG1uMTAzMDBfaGFzaCwgc3RyKTsKKyAgaWYgKG9wY29kZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdHIgPSBzOworICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCisgICAgKytzdHI7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworCisgIGZvcig7OykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICplcnJtc2c7CisgICAgICBpbnQgb3BfaWR4OworICAgICAgY2hhciAqaG9sZDsKKyAgICAgIGludCBleHRyYV9zaGlmdCA9IDA7CisKKworICAgICAgZXJybXNnID0gXygiSW52YWxpZCBvcGNvZGUvb3BlcmFuZHMiKTsKKworICAgICAgLyogUmVzZXQgdGhlIGFycmF5IG9mIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KKyAgICAgIG1lbXNldCAobW4xMDMwMF9yZWdfb3BlcmFuZHMsIC0xLCBzaXplb2YgKG1uMTAzMDBfcmVnX29wZXJhbmRzKSk7CisKKyAgICAgIHJlbGF4YWJsZSA9IDA7CisgICAgICBmYyA9IDA7CisgICAgICBtYXRjaCA9IDA7CisgICAgICBuZXh0X29waW5kZXggPSAwOworICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOworICAgICAgZXh0ZW5zaW9uID0gMDsKKworICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgbWFjaGluZQorCSB0aGVuIGl0IGNhbiBub3QgcG9zc2libHkgbWF0Y2guICAqLworICAgICAgaWYgKG9wY29kZS0+bWFjaGluZQorCSAgJiYgKG9wY29kZS0+bWFjaGluZSAhPSBjdXJyZW50X21hY2hpbmUpKQorCWdvdG8gZXJyb3I7CisKKyAgICAgIGZvciAob3BfaWR4ID0gMSwgb3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOworCSAgICpvcGluZGV4X3B0ciAhPSAwOworCSAgIG9waW5kZXhfcHRyKyssIG9wX2lkeCsrKQorCXsKKwkgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7CisJICBleHByZXNzaW9uUyBleDsKKworCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQorCSAgICB7CisJICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1tuZXh0X29waW5kZXhdOworCSAgICAgIG5leHRfb3BpbmRleCA9IDA7CisJICAgIH0KKworCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQorCSAgICArK3N0cjsKKworCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFTEFYKQorCSAgICByZWxheGFibGUgPSAxOworCisJICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICovCisJICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworCisJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pCisJICAgIHsKKwkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKScgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKCcpCisJCXsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKKwkgICAgfQorCSAgLyogU2VlIGlmIHdlIGNhbiBtYXRjaCB0aGUgb3BlcmFuZHMuICAqLworCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfRFJFRykKKwkgICAgeworCSAgICAgIGlmICghZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfQVJFRykKKwkgICAgeworCSAgICAgIGlmICghYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1ApCisJICAgIHsKKwkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInNwIikgIT0gMCkKKwkJeworCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJCSAgc3RyID0gaG9sZDsKKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJICAgICAgZ290byBrZWVwX2dvaW5nOworCSAgICB9CisJICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QU1cpCisJICAgIHsKKwkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgInBzdyIpICE9IDApCisJCXsKKwkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKKwkgICAgfQorCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTURSKQorCSAgICB7CisJICAgICAgY2hhciAqc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgY2hhciBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKwkgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJtZHIiKSAhPSAwKQorCQl7CisJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICBzdHIgPSBob2xkOworCQkgIGdvdG8gZXJyb3I7CisJCX0KKwkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKwkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnWycpCisJCXsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgLyogRWF0IHRoZSAnWycuICAqLworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgICAgCisJICAgICAgLyogV2UgdXNlZCB0byByZWplY3QgYSBudWxsIHJlZ2lzdGVyIGxpc3QgaGVyZTsgaG93ZXZlciwKKwkJIHdlIGFjY2VwdCBpdCBub3cgc28gdGhlIGNvbXBpbGVyIGNhbiBlbWl0ICJjYWxsIiBpbnN0cnVjdGlvbnMKKwkJIGZvciBhbGwgY2FsbHMgdG8gbmFtZWQgZnVuY3Rpb25zLgorCisJCSBUaGUgbGlua2VyIGNhbiB0aGVuIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGJpdHMgZm9yIHRoZQorCQkgcmVnaXN0ZXIgbGlzdCBhbmQgc3RhY2sgc2l6ZSBvciBjaGFuZ2UgdGhlIGluc3RydWN0aW9uCisJCSBpbnRvIGEgImNhbGxzIiBpZiB1c2luZyAiY2FsbCIgaXMgbm90IHByb2ZpdGFibGUuICAqLworCSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICddJykKKwkJeworCQkgIGNoYXIgKnN0YXJ0OworCQkgIGNoYXIgYzsKKworCQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwkJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCisJCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisJCSAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZDIiKSA9PSAwKQorCQkgICAgeworCQkgICAgICB2YWx1ZSB8PSAweDgwOworCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImQzIikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgdmFsdWUgfD0gMHg0MDsKKwkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJhMiIpID09IDApCisJCSAgICB7CisJCSAgICAgIHZhbHVlIHw9IDB4MjA7CisJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiYTMiKSA9PSAwKQorCQkgICAgeworCQkgICAgICB2YWx1ZSB8PSAweDEwOworCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm90aGVyIikgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgdmFsdWUgfD0gMHgwODsKKwkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgICAgICBzdHIgPSBob2xkOworCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQorCQl9CisJICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICAgICAgICAgIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7CisJICAgICAgZ290byBrZWVwX2dvaW5nOworCisJICAgIH0KKwkgIGVsc2UgaWYgKGRhdGFfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgc3RyID0gaG9sZDsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlIGlmIChhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCisJICAgIHsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCSAgICAgIHN0ciA9IGhvbGQ7CisJICAgICAgZ290byBlcnJvcjsKKwkgICAgfQorCSAgZWxzZSBpZiAob3RoZXJfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgc3RyID0gaG9sZDsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlIGlmICgqc3RyID09ICcpJyB8fCAqc3RyID09ICcoJykKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgc3RyID0gaG9sZDsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHByZXNzaW9uICgmZXgpOworCSAgICB9CisKKwkgIHN3aXRjaCAoZXguWF9vcCkgCisJICAgIHsKKwkgICAgY2FzZSBPX2lsbGVnYWw6CisJICAgICAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7CisJICAgICAgZ290byBlcnJvcjsKKwkgICAgY2FzZSBPX2Fic2VudDoKKwkgICAgICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKKwkgICAgICBnb3RvIGVycm9yOworCSAgICBjYXNlIE9fcmVnaXN0ZXI6CisJICAgICAgeworCQlpbnQgbWFzazsKKworCQltYXNrID0gTU4xMDMwMF9PUEVSQU5EX0RSRUcgfCBNTjEwMzAwX09QRVJBTkRfQVJFRzsKKwkJaWYgKChvcGVyYW5kLT5mbGFncyAmIG1hc2spID09IDApCisJCSAgeworCQkgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKwkJICAgIHN0ciA9IGhvbGQ7CisJCSAgICBnb3RvIGVycm9yOworCQkgIH0KKwkJCisJCWlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDEgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxKQorCQkgIGV4dHJhX3NoaWZ0ID0gODsKKwkJZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyCisJCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0CisJCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyCisJCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0CisJCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2CisJCQkgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q1KQorCQkgIGV4dHJhX3NoaWZ0ID0gMTY7CisJCWVsc2UKKwkJICBleHRyYV9zaGlmdCA9IDA7CisJICAgICAgCisJCW1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAorCQkJCQlleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCisJCQkJCTAsIGV4dHJhX3NoaWZ0KTsKKworCisJCS8qIEFuZCBub3RlIHRoZSByZWdpc3RlciBudW1iZXIgaW4gdGhlIHJlZ2lzdGVyIGFycmF5LiAgKi8KKwkJbW4xMDMwMF9yZWdfb3BlcmFuZHNbb3BfaWR4IC0gMV0gPSBleC5YX2FkZF9udW1iZXI7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICBjYXNlIE9fY29uc3RhbnQ6CisJICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgYW5kIGl0IGRvZXNuJ3QKKwkJIGZpdCBpbnRvIHRoZSBhbGxvY2F0ZWQgYml0ZmllbGQgZm9yIHRoaXMgaW5zbiwKKwkJIHRoZW4gcHJvbW90ZSBpdCAoaWUgdGhpcyBvcGNvZGUgZG9lcyBub3QgbWF0Y2gpLiAgKi8KKwkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MKKwkJICAmIChNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCkKKwkJICAmJiAhIGNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlcikpCisJCXsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCisJCQkJICAgICAgZXguWF9hZGRfbnVtYmVyLCAoY2hhciAqKSBOVUxMLAorCQkJCSAgICAgIDAsIDApOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogSWYgdGhpcyBvcGVyYW5kIGNhbiBiZSBwcm9tb3RlZCwgdGhlbiB0aGlzIG9wY29kZSBkaWRuJ3QKKwkJIG1hdGNoIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgaXQgbmVlZGVkIHByb21vdGlvbiEgICovCisJICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BST01PVEUpCisJCXsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCQkgIHN0ciA9IGhvbGQ7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLworCSAgICAgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCisJCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisJICAgICAgZml4dXBzW2ZjXS5leHAgPSBleDsKKwkgICAgICBmaXh1cHNbZmNdLm9waW5kZXggPSAqb3BpbmRleF9wdHI7CisJICAgICAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7CisJICAgICAgKytmYzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCitrZWVwX2dvaW5nOgorCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKworCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnKQorCSAgICArK3N0cjsKKworCX0KKworICAgICAgLyogTWFrZSBzdXJlIHdlIHVzZWQgYWxsIHRoZSBvcGVyYW5kcyEgICovCisgICAgICBpZiAoKnN0ciAhPSAnLCcpCisJbWF0Y2ggPSAxOworCisgICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGhhcyByZWdpc3RlcnMgdGhhdCBtdXN0IG5vdCBtYXRjaCwgdmVyaWZ5CisJIHRoYXQgdGhleSBkbyBpbmRlZWQgbm90IG1hdGNoLiAgKi8KKyAgICAgIGlmIChvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQorCXsKKwkgIGludCBpOworCisJICAvKiBMb29rIGF0IGVhY2ggb3BlcmFuZCB0byBzZWUgaWYgaXQncyBtYXJrZWQuICAqLworCSAgZm9yIChpID0gMDsgaSA8IE1OMTAzMDBfTUFYX09QRVJBTkRTOyBpKyspCisJICAgIHsKKwkgICAgICBpZiAoKDEgPDwgaSkgJiBvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQorCQl7CisJCSAgaW50IGo7CisKKwkJICAvKiBvcGVyYW5kIEkgaXMgbWFya2VkLiAgQ2hlY2sgdGhhdCBpdCBkb2VzIG5vdCBtYXRjaCBhbnkKKwkJICAgICBvcGVyYW5kcyA+IEkgd2hpY2ggYXJlIG1hcmtlZC4gICovCisJCSAgZm9yIChqID0gaSArIDE7IGogPCBNTjEwMzAwX01BWF9PUEVSQU5EUzsgaisrKQorCQkgICAgeworCQkgICAgICBpZiAoKCgxIDw8IGopICYgb3Bjb2RlLT5ub19tYXRjaF9vcGVyYW5kcykKKwkJCSAgJiYgbW4xMDMwMF9yZWdfb3BlcmFuZHNbaV0gPT0gbW4xMDMwMF9yZWdfb3BlcmFuZHNbal0pCisJCQl7CisJCQkgIGVycm1zZyA9IF8oIkludmFsaWQgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbi4iKTsKKwkJCSAgbWF0Y2ggPSAwOworCQkJICBnb3RvIGVycm9yOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKyAgICBlcnJvcjoKKyAgICAgIGlmIChtYXRjaCA9PSAwKQorICAgICAgICB7CisJICBuZXh0X29wY29kZSA9IG9wY29kZSArIDE7CisJICBpZiAoIXN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKKwkgICAgeworCSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAKKwkgIGFzX2JhZCAoIiVzIiwgZXJybXNnKTsKKwkgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgICAgCisgIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKKyAgICArK3N0cjsKKworICBpZiAoKnN0ciAhPSAnXDAnKQorICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOworCisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKworICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMCkKKyAgICBzaXplID0gMTsKKworICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMCkKKyAgICBzaXplID0gMjsKKworICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKKyAgICBzaXplID0gMzsKKworCisgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQpCisgICAgc2l6ZSA9IDU7CisKKyAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCisgICAgc2l6ZSA9IDc7CisKKyAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMikKKyAgICBzaXplID0gNDsKKworICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQorICAgIHNpemUgPSA2OworCisgIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQorICAgIHsKKyAgICAgIGludCB0eXBlOworCisgICAgICAvKiBiQ0MgKi8KKyAgICAgIGlmIChzaXplID09IDIpCisJeworCSAgLyogSGFuZGxlIGJyYSBzcGVjaWFsbHkuICBCYXNpY2FsbHkgdHJlYXQgaXQgbGlrZSBqbXAgc28KKwkgICAgIHRoYXQgd2UgYXV0b21hdGljYWxseSBoYW5kbGUgOCwgMTYgYW5kIDMyIGJpdCBvZmZzZXRzCisJICAgICBjb3JyZWN0bHkgYXMgd2VsbCBhcyBqdW1wcyB0byBhbiB1bmRlZmluZWQgYWRkcmVzcy4KKworCSAgICAgSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90IHRyZWF0IGl0IGxpa2Ugb3RoZXIgYkNDCisJICAgICBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGxvbmcgZm9ybXMgb2YgYnJhIGlzIGRpZmZlcmVudAorCSAgICAgZnJvbSBvdGhlciBiQ0MgaW5zdHJ1Y3Rpb25zLiAgKi8KKwkgIGlmIChvcGNvZGUtPm9wY29kZSA9PSAweGNhMDApCisJICAgIHR5cGUgPSAxMDsKKwkgIGVsc2UKKwkgICAgdHlwZSA9IDA7CisJfQorICAgICAgLyogY2FsbCAqLworICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA1KQorICAgICAgICB0eXBlID0gNjsKKyAgICAgIC8qIGNhbGxzICovCisgICAgICBlbHNlIGlmIChzaXplID09IDQpCisJdHlwZSA9IDg7CisgICAgICAvKiBqbXAgKi8KKyAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGNjMDAwMCkKKwl0eXBlID0gMTA7CisgICAgICAvKiBiQ0MgKHVuY29tbW9uIGNhc2VzKSAqLworICAgICAgZWxzZQorCXR5cGUgPSAzOworCisgICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCA4IC0gc2l6ZSwgdHlwZSwKKwkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAorCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCisJCSAgICAoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKKyAgICAgIAorICAgICAgLyogVGhpcyBpcyBwcmV0dHkgaG9rZXkuICBXZSBiYXNpY2FsbHkganVzdCBjYXJlIGFib3V0IHRoZQorCSBvcGNvZGUsIHNvIHdlIGhhdmUgdG8gd3JpdGUgb3V0IHRoZSBmaXJzdCB3b3JkIGJpZyBlbmRpYW4uCisKKwkgVGhlIGV4Y2VwdGlvbiBpcyAiY2FsbCIsIHdoaWNoIGhhcyB0d28gb3BlcmFuZHMgdGhhdCB3ZQorCSBjYXJlIGFib3V0LgorCisJIFRoZSBmaXJzdCBvcGVyYW5kICh0aGUgcmVnaXN0ZXIgbGlzdCkgaGFwcGVucyB0byBiZSBpbiB0aGUKKwkgZmlyc3QgaW5zdHJ1Y3Rpb24gd29yZCwgYW5kIHdpbGwgYmUgaW4gdGhlIHJpZ2h0IHBsYWNlIGlmCisJIHdlIG91dHB1dCB0aGUgZmlyc3Qgd29yZCBpbiBiaWcgZW5kaWFuIG1vZGUuCisKKwkgVGhlIHNlY29uZCBvcGVyYW5kIChzdGFjayBzaXplKSBpcyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsCisJIGFuZCB3ZSB3YW50IGl0IHRvIGFwcGVhciBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBleHRlbnNpb24KKwkgd29yZCAoYXMgaXQgYXBwZWFycyBpbiBtZW1vcnkpLiAgTHVja2lseSwgd3JpdGluZyB0aGUgZXh0ZW5zaW9uCisJIHdvcmQgaW4gYmlnIGVuZGlhbiBmb3JtYXQgd2lsbCBkbyB3aGF0IHdlIHdhbnQuICAqLworICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSA+IDQgPyA0IDogc2l6ZSk7CisgICAgICBpZiAoc2l6ZSA+IDgpCisJeworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiwgNCk7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgOCwgMCwgc2l6ZSAtIDgpOworCX0KKyAgICAgIGVsc2UgaWYgKHNpemUgPiA0KQorCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24sIHNpemUgLSA0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgICAgIGYgPSBmcmFnX21vcmUgKHNpemUpOworCisgICAgICAvKiBGaWxsIGluIGJ5dGVzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBOb3RlIHRoYXQgb3Bjb2RlIGZpZWxkcworCSBhcmUgd3JpdHRlbiBiaWctZW5kaWFuLCAxNiAmIDMyYml0IGltbWVkaWF0ZXMgYXJlIHdyaXR0ZW4KKwkgbGl0dGxlIGVuZGlhbi4gIEVnYWQuICAqLworICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMAorCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MxCisJICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDAKKwkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSkKKwl7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplKTsKKwl9CisgICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKKwkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZjAwMDAKKwkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkZTAwMDApCisJeworCSAgLyogQSBmb3JtYXQgUzIgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBfbm90XyAicmV0IiBhbmQgInJldGYiLiAgKi8KKwkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOworCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMikKKwl7CisJICAvKiBUaGlzIG11c3QgYmUgYSByZXQgb3IgcmV0Ziwgd2hpY2ggaXMgd3JpdHRlbiBlbnRpcmVseSBpbgorCSAgICAgYmlnLWVuZGlhbiBmb3JtYXQuICAqLworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgMyk7CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0CisJICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZGMwMDAwMDApCisJeworCSAgLyogVGhpcyBtdXN0IGJlIGEgZm9ybWF0IFM0ICJjYWxsIiBpbnN0cnVjdGlvbi4gIFdoYXQgYSBwYWluLiAgKi8KKwkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IChpbnNuID4+IDgpICYgMHhmZmZmOworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7CisJICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgMik7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgMywgaW5zbiAmIDB4ZmYsIDEpOworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKKwl7CisJICAvKiBUaGlzIG11c3QgYmUgYSBmb3JtYXQgUzQgImptcCIgaW5zdHJ1Y3Rpb24uICAqLworCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpIHwgKGV4dGVuc2lvbiAmIDB4ZmYpOworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7CisJICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2KQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KQorCSAgICB8ICgoZXh0ZW5zaW9uID4+IDE2KSAmIDB4ZmYpOworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMjQpICYgMHhmZiwgMSk7CisJICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgdGVtcCwgNCk7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNSwgKGV4dGVuc2lvbiA+PiA4KSAmIDB4ZmYsIDEpOworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDYsIGV4dGVuc2lvbiAmIDB4ZmYsIDEpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMgorCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjgwMDAwCisJICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmMDAwMDAKKwkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWY0MDAwMCkKKwl7CisJICAvKiBBIGZvcm1hdCBEMiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgMTZiaXQgaW1tZWRpYXRlIGlzCisJICAgICByZWFsbHkgYSBzaW5nbGUgMTZiaXQgdmFsdWUsIG5vdCB0d28gOGJpdCB2YWx1ZXMuICAqLworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKKwkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKKwl9CisgICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIpCisJeworCSAgLyogQSBmb3JtYXQgRDIgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIDE2Yml0IGltbWVkaWF0ZQorCSAgICAgaXMgcmVhbGx5IHR3byA4Yml0IGltbWVkaWF0ZXMuICAqLworCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgNCk7CisJfQorICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiAmIDB4ZmZmZik7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOworCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIHRlbXAsIDQpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKKwl7CisJICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KQorCSAgICAJCQl8ICgoZXh0ZW5zaW9uID4+IDgpICYgMHhmZmZmKTsKKwkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7CisJICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgdGVtcCwgNCk7CisJICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNiwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7CisJfQorCisgICAgICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKKwl7CisJICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOworCisJICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOworCSAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQorCSAgICB7CisJICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG87CisJICAgICAgaW50IHNpemU7CisJICAgICAgaW50IG9mZnNldDsKKwkgICAgICBmaXhTICpmaXhQOworCisJICAgICAgcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKKworCSAgICAgIGlmICghcmVsb2NfaG93dG8pCisJCWFib3J0KCk7CisJICAKKwkgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7CisKKwkgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCisJCWFib3J0KCk7CisKKwkgICAgICBvZmZzZXQgPSA0IC0gc2l6ZTsKKwkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCisJCQkJICBzaXplLCAmZml4dXBzW2ldLmV4cCwKKwkJCQkgIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKKwkJCQkgIGZpeHVwc1tpXS5yZWxvYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCByZWxvYywgcGNyZWwsIHJlbG9jX3NpemUsIG9mZnNldDsKKwkgICAgICBmaXhTICpmaXhQOworCisJICAgICAgcmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKKwkgICAgICAvKiBIb3cgYmlnIGlzIHRoZSByZWxvYz8gIFJlbWVtYmVyIFNQTElUIHJlbG9jcyBhcmUKKwkJIGltcGxpY2l0bHkgMzJiaXRzLiAgKi8KKwkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSAhPSAwKQorCQlyZWxvY19zaXplID0gMzI7CisJICAgICAgZWxzZQorCQlyZWxvY19zaXplID0gb3BlcmFuZC0+Yml0czsKKworCSAgICAgIC8qIElzIHRoZSByZWxvYyBwYy1yZWxhdGl2ZT8gICovCisJICAgICAgcGNyZWwgPSAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDA7CisKKwkgICAgICAvKiBHcm9zcy4gIFRoaXMgZGlzZ3VzdGluZyBoYWNrIGlzIHRvIG1ha2Ugc3VyZSB3ZQorCQkgZ2V0IHRoZSByaWdodCBvZmZzZXQgZm9yIHRoZSAxNi8zMiBiaXQgcmVsb2MgaW4gCisJCSAiY2FsbCIgaW5zdHJ1Y3Rpb25zLiAgQmFzaWNhbGx5IHRoZXkncmUgYSBwYWluCisJCSBiZWNhdXNlIHRoZSByZWxvYyBpc24ndCBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCisJICAgICAgaWYgKChzaXplID09IDUgfHwgc2l6ZSA9PSA3KQorCQkgICYmICgoKGluc24gPj4gMjQpICYgMHhmZikgPT0gMHhjZAorCQkgICAgICB8fCAoKGluc24gPj4gMjQpICYgMHhmZikgPT0gMHhkZCkpCisJCXNpemUgLT0gMjsKKworCSAgICAgIC8qIFNpbWlsYXJseSBmb3IgY2VydGFpbiBiaXQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvbid0CisJCSBoYXYgdGhlaXIgMzJiaXQgcmVsb2MgYXQgdGhlIHRhaWwgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKwkgICAgICBpZiAoc2l6ZSA9PSA3CisJCSAgJiYgKCgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMAorCQkgICAgICB8fCAoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDEKKwkJICAgICAgfHwgKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAyKSkKKwkJc2l6ZSAtPSAxOworCQorCSAgICAgIG9mZnNldCA9IHNpemUgLSByZWxvY19zaXplIC8gODsKKworCSAgICAgIC8qIENob29zZSBhIHByb3BlciBCRkQgcmVsb2NhdGlvbiB0eXBlLiAgKi8KKwkgICAgICBpZiAocGNyZWwpCisJCXsKKwkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKKwkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMOworCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCisJCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKKwkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCisJCSAgICByZWxvYyA9IEJGRF9SRUxPQ184X1BDUkVMOworCQkgIGVsc2UKKwkJICAgIGFib3J0ICgpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCisJCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMjsKKwkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQorCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTY7CisJCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQorCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfODsKKwkJICBlbHNlCisJCSAgICBhYm9ydCAoKTsKKwkJfQorCisJICAgICAgLyogQ29udmVydCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgaW50byB3aGF0IGZpeF9uZXdfZXhwIHdhbnRzLiAgKi8KKwkgICAgICByZWxvY19zaXplID0gcmVsb2Nfc2l6ZSAvIDg7CisJICAgICAgaWYgKHJlbG9jX3NpemUgPT0gOCkKKwkJcmVsb2Nfc2l6ZSA9IDA7CisJICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKKwkJcmVsb2Nfc2l6ZSA9IDE7CisJICAgICAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKKwkJcmVsb2Nfc2l6ZSA9IDI7CisKKwkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCisJCQkJICByZWxvY19zaXplLCAmZml4dXBzW2ldLmV4cCwgcGNyZWwsCisJCQkJICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2MpKTsKKworCSAgICAgIGlmIChwY3JlbCkKKwkJZml4UC0+Znhfb2Zmc2V0ICs9IG9mZnNldDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCisvKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLworICAgICAgICAgICAgICAgICAKK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCisgICAgIGFzZWN0aW9uICpzZWc7CisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGFyZWxlbnQgKnJlbG9jOworICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworCisgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXhwLT5meF9yX3R5cGUpOworICBpZiAocmVsb2MtPmhvd3RvID09IChyZWxvY19ob3d0b190eXBlICopIE5VTEwpCisgICAgeworICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorICAgICAgICAgICAgICAgICAgICBfKCJyZWxvYyAlZCBub3Qgc3VwcG9ydGVkIGJ5IG9iamVjdCBmaWxlIGZvcm1hdCIpLAorCQkgICAgKGludClmaXhwLT5meF9yX3R5cGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKworICBpZiAoZml4cC0+ZnhfYWRkc3kgJiYgZml4cC0+Znhfc3Vic3kpCisgICAgeworICAgIAorICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpKQorCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpID09IHVuZGVmaW5lZF9zZWN0aW9uKQorCXsKKwkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCSJEaWZmZXJlbmNlIG9mIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkgIHJldHVybiBOVUxMOworCX0KKworICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmJmZF9hYnNfc3ltYm9sOworICAgICAgcmVsb2MtPmFkZGVuZCA9IChTX0dFVF9WQUxVRSAoZml4cC0+ZnhfYWRkc3kpCisJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSkgKyBmaXhwLT5meF9vZmZzZXQpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07CisgICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworICAgIH0KKyAgcmV0dXJuIHJlbG9jOworfQorCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQorICAgICBmcmFnUyAqZnJhZ3A7CisgICAgIGFzZWN0aW9uICpzZWc7Cit7CisgIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQorICAgIHJldHVybiAyOworICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKKyAgICByZXR1cm4gMzsKKyAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCisgICAgeworICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCisJICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCisJeworCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OworCSAgcmV0dXJuIDc7CisJfQorICAgICAgZWxzZQorCXJldHVybiA1OworICAgIH0KKyAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCisgICAgeworICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCisJICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCisJeworCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA5OworCSAgcmV0dXJuIDY7CisJfQorICAgICAgZWxzZQorCXJldHVybiA0OworICAgIH0KKyAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwKQorICAgIHsKKyAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQorCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQorCXsKKwkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTI7CisJICByZXR1cm4gNTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDI7CisgICAgfQorfSAKKworbG9uZworbWRfcGNyZWxfZnJvbSAoZml4cCkKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7CisjaWYgMAorICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisjZW5kaWYKK30KKworaW50CittZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKKyAgICAgZml4UyAqZml4cDsKKyAgICAgdmFsdWVUICp2YWx1ZXA7CisgICAgIHNlZ1Qgc2VnOworeworICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KKyAgYWJvcnQgKCk7CisgIGZpeHAtPmZ4X2RvbmUgPSAxOworICByZXR1cm4gMDsKK30KKworLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCittbjEwMzAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKKyAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7CisgICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7CisgICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIG9mZnNldFQgdmFsOworICAgICBjaGFyICpmaWxlOworICAgICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgICAgdW5zaWduZWQgaW50IHNoaWZ0OworeworICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAorICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCisgIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCisgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCisgICAgeworICAgICAgbG9uZyBtaW4sIG1heDsKKyAgICAgIG9mZnNldFQgdGVzdDsKKyAgICAgIGludCBiaXRzOworCisgICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDApCisJeworCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOworCSAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7CisgICAgICAgICAgbWluID0gMDsKKyAgICAgICAgfQorCisgICAgICB0ZXN0ID0gdmFsOworCisKKyAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciA9CisgICAgICAgICAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7CisgICAgICAgICAgY2hhciBidWZbMTAwXTsKKworICAgICAgICAgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKKyAgICAgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQorICAgICAgICAgICAgYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOworICAgICAgICB9CisgICAgfQorCisgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCisgICAgeworICAgICAgKmluc25wIHw9ICh2YWwgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7CisgICAgICAqZXh0ZW5zaW9ucCB8PSAoKHZhbCAmICgoMSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKSkKKwkJICAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOworICAgIH0KKyAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKSA9PSAwKQorICAgIHsKKyAgICAgICppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKKwkJIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0KSk7CisKKyAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQpICE9IDApCisJKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQorCQkgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCArIG9wZXJhbmQtPmJpdHMpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKKwkJICAgICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKKwkqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKKwkJCTw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2NoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOworICAgICBvZmZzZXRUIHZhbDsKK3sKKyAgLyogTm8gbmVlZCB0byBjaGVjayAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICBOb3RlIHRoYXQKKyAgICAgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGlzIGFuIGltcGxpY2l0IDMyYml0IG9wZXJhbmQuICAqLworICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMgorICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSA9PSAwKQorICAgIHsKKyAgICAgIGxvbmcgbWluLCBtYXg7CisgICAgICBvZmZzZXRUIHRlc3Q7CisgICAgICBpbnQgYml0czsKKworICAgICAgYml0cyA9IG9wZXJhbmQtPmJpdHM7CisKKyAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQorCXsKKwkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKKwkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7CisJfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOworICAgICAgICAgIG1pbiA9IDA7CisgICAgICAgIH0KKworICAgICAgdGVzdCA9IHZhbDsKKworCisgICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCisJcmV0dXJuIDA7CisgICAgICBlbHNlCisJcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3NldF9hcmNoX21hY2ggKG1hY2gpCisgICAgIGludCBtYWNoOworeworICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIG1hY2gpKQorICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOworCisgIGN1cnJlbnRfbWFjaGluZSA9IG1hY2g7Cit9CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmY2IyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaApAQCAtMCwwICsxLDUwIEBACisvKiB0Yy1tbjEwMzAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLW1uMTAzMDAuYy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjZGVmaW5lIFRDX01OMTAzMDAKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICNlcnJvciBNTjEwMzAwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgorI2VuZGlmCisKKy8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCisjZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX21uMTAzMDAKKworI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tbjEwMzAwIgorCisjZGVmaW5lIE1EX0FQUExZX0ZJWDMKKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCisvKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisjZGVmaW5lIG1kX251bWJlcl90b19jaGFycyBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCisKKy8qIERvbid0IGJvdGhlciB0byBhZGp1c3QgcmVsb2NzLiAgKi8KKyNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKSAwCisKKy8qIFdlIGRvIHJlbGF4aW5nIGluIHRoZSBhc3NlbWJsZXIgYXMgd2VsbCBhcyB0aGUgbGlua2VyLiAgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW5zMzJrLmMgYi9nYXMvY29uZmlnL3RjLW5zMzJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYzUyOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtbnMzMmsuYwpAQCAtMCwwICsxLDIzMjggQEAKKy8qIG5zMzJrLmMgIC0tIEFzc2VtYmxlIG9uIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyayBzZXJpZXMKKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiNkZWZpbmUgU0hPV19OVU0gMSovLyogdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAib3Bjb2RlL25zMzJrLmgiCisKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisKKy8qIE1hY3JvcyAqLworI2RlZmluZSBJSUZfRU5UUklFUyAxMwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaWlmICovCisjZGVmaW5lIFBSSVZBVEVfU0laRSAyNTYJLyogc2l6ZSBvZiBteSBnYXJiYWdlIG1lbW9yeSAqLworI2RlZmluZSBNQVhfQVJHUyA0CisjZGVmaW5lIERFRkFVTFQJLTEJCS8qIGFkZHJfbW9kZSByZXR1cm5zIHRoaXMgdmFsdWUgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbiBjb25zdGFudCBvciBsYWJlbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvdW50ZXJlZCAqLworCisjZGVmaW5lIElJRihwdHIsYTEsYzEsZTEsZzEsaTEsazEsbTEsbzEscTEsczEsdTEpCVwKKyAgICBpaWYuaWlmUFtwdHJdLnR5cGU9IGExOwkJCQlcCisgICAgaWlmLmlpZlBbcHRyXS5zaXplPSBjMTsJCQkJXAorICAgIGlpZi5paWZQW3B0cl0ub2JqZWN0PSBlMTsJCQkJXAorICAgIGlpZi5paWZQW3B0cl0ub2JqZWN0X2FkanVzdD0gZzE7CQkJXAorICAgIGlpZi5paWZQW3B0cl0ucGNyZWw9IGkxOwkJCQlcCisgICAgaWlmLmlpZlBbcHRyXS5wY3JlbF9hZGp1c3Q9IGsxOwkJCVwKKyAgICBpaWYuaWlmUFtwdHJdLmltX2Rpc3A9IG0xOwkJCQlcCisgICAgaWlmLmlpZlBbcHRyXS5yZWxheF9zdWJzdGF0ZT0gbzE7CQkJXAorICAgIGlpZi5paWZQW3B0cl0uYml0X2ZpeFA9IHExOwkJCQlcCisgICAgaWlmLmlpZlBbcHRyXS5hZGRyX21vZGU9IHMxOwkJCVwKKyAgICBpaWYuaWlmUFtwdHJdLmJzcj0gdTE7CisKKyNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKKyNkZWZpbmUgTElORV9DT01NRU5UX0NIQVJTICJ8IgorI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJ0AnCisjZGVmaW5lIElNTUVESUFURV9QUkVGSVggJyMnCisjZW5kaWYKKworI2lmbmRlZiBMSU5FX0NPTU1FTlRfQ0hBUlMKKyNkZWZpbmUgTElORV9DT01NRU5UX0NIQVJTICIjIgorI2VuZGlmCisKK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9IExJTkVfQ09NTUVOVF9DSEFSUzsKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworI2lmICFkZWZpbmVkKEFCU09MVVRFX1BSRUZJWCkgJiYgIWRlZmluZWQoSU1NRURJQVRFX1BSRUZJWCkKKyNkZWZpbmUgQUJTT0xVVEVfUFJFRklYICdAJwkvKiBPbmUgb3IgdGhlIG90aGVyIE1VU1QgYmUgZGVmaW5lZCAqLworI2VuZGlmCisKK3N0cnVjdCBhZGRyX21vZGUKKyAgeworICAgIGNoYXIgbW9kZTsJCQkvKiBhZGRyZXNzaW5nIG1vZGUgb2Ygb3BlcmFuZCAoMC0zMSkgKi8KKyAgICBjaGFyIHNjYWxlZF9tb2RlOwkJLyogbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZCBtb2RlICovCisgICAgY2hhciBzY2FsZWRfcmVnOwkJLyogcmVnaXN0ZXIgdXNlZCBpbiBzY2FsZWQrMSAoMS04KSAqLworICAgIGNoYXIgZmxvYXRfZmxhZzsJCS8qIHNldCBpZiBSMC4uUjcgd2FzIEYwLi5GNyBpZSBhCisJCQkJICAgZmxvYXRpbmctcG9pbnQtcmVnaXN0ZXIgKi8KKyAgICBjaGFyIGFtX3NpemU7CQkvKiBlc3RpbWF0ZWQgbWF4IHNpemUgb2YgZ2VuZXJhbCBhZGRyLW1vZGUKKwkJCQkgICBwYXJ0cyAqLworICAgIGNoYXIgaW1fZGlzcDsJCS8qIGlmIGltX2Rpc3A9PTEgd2UgaGF2ZSBhIGRpc3BsYWNlbWVudCAqLworICAgIGNoYXIgcGNyZWw7CQkJLyogMSBpZiBwY3JlbCwgdGhpcyBpcyByZWFsbHkgcmVkdW5kYW50IGluZm8gKi8KKyAgICBjaGFyIGRpc3Bfc3VmZml4WzJdOwkvKiBsZW5ndGggb2YgZGlzcGxhY2VtZW50KHMpLCAwPXVuZGVmaW5lZCAqLworICAgIGNoYXIgKmRpc3BbMl07CQkvKiBwb2ludGVyKHMpIGF0IGRpc3BsYWNlbWVudChzKQorCQkJCSAgIG9yIGltbWVkaWF0ZXMocykgICAgIChhc2NpaSkgKi8KKyAgICBjaGFyIGluZGV4X2J5dGU7CQkvKiBpbmRleCBieXRlICovCisgIH07Cit0eXBlZGVmIHN0cnVjdCBhZGRyX21vZGUgYWRkcl9tb2RlUzsKKworCitjaGFyICpmcmVlcHRyLCAqZnJlZXB0cl9zdGF0aWM7CS8qIHBvaW50cyBhdCBzb21lIG51bWJlciBvZiBmcmVlIGJ5dGVzICovCitzdHJ1Y3QgaGFzaF9jb250cm9sICppbnN0X2hhc2hfaGFuZGxlOworCitzdHJ1Y3QgbnMzMmtfb3Bjb2RlICpkZXNjOwkvKiBwb2ludGVyIGF0IGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uICovCithZGRyX21vZGVTIGFkZHJfbW9kZVA7Citjb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZmQiOwkvKiB3ZSBkb24ndCB3YW50IHRvIHN1cHBvcnQgbG93ZXJjYXNlLCBkbyB3ZSAqLworCisvKiBVUFBFUkNBU0UgZGVub3RlcyBsaXZlIG5hbWVzIHdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgYnVpbHQsIElJRiBpcworICogdXNlZCBhcyBhbiBpbnRlcm1lZGlhdGUgZm9ybSB0byBzdG9yZSB0aGUgYWN0dWFsIHBhcnRzIG9mIHRoZQorICogaW5zdHJ1Y3Rpb24uIEEgbnMzMmsgbWFjaGluZSBpbnN0cnVjdGlvbiBjYW4gYmUgZGl2aWRlZCBpbnRvIGEKKyAqIGNvdXBsZSBvZiBzdWIgUEFSVHMuIFdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgYXNzZW1ibGVkIHRoZQorICogYXBwcm9wcmlhdGUgUEFSVCBnZXQgYW4gYXNzaWdubWVudC4gV2hlbiBhbiBJSUYgaGFzIGJlZW4gY29tcGxldGVkCisgKiBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBGUkFHbWVudCBhcyBzcGVjaWZpZWQgaW4gQVMuSCAqLworCisvKiBpbnRlcm5hbCBzdHJ1Y3RzICovCitzdHJ1Y3QgbnMzMmtfb3B0aW9uCisgIHsKKyAgICBjaGFyICpwYXR0ZXJuOworICAgIHVuc2lnbmVkIGxvbmcgb3I7CisgICAgdW5zaWduZWQgbG9uZyBhbmQ7CisgIH07CisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBpbnQgdHlwZTsJCQkvKiBob3cgdG8gaW50ZXJwcmV0IG9iamVjdCAqLworICAgIGludCBzaXplOwkJCS8qIEVzdGltYXRlZCBtYXggc2l6ZSBvZiBvYmplY3QgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9iamVjdDsJLyogYmluYXJ5IGRhdGEgKi8KKyAgICBpbnQgb2JqZWN0X2FkanVzdDsJCS8qIG51bWJlciBhZGRlZCB0byBvYmplY3QgKi8KKyAgICBpbnQgcGNyZWw7CQkJLyogVHJ1ZSBpZiBvYmplY3QgaXMgcGNyZWwgKi8KKyAgICBpbnQgcGNyZWxfYWRqdXN0OwkJLyogbGVuZ3RoIGluIGJ5dGVzIGZyb20gdGhlCisJCQkJCSAgIGluc3RydWN0aW9uIHN0YXJ0IHRvIHRoZQorCQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KKyAgICBpbnQgaW1fZGlzcDsJCS8qIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGRpc3BsYWNlbWVudCAqLworICAgIHJlbGF4X3N1YnN0YXRlVCByZWxheF9zdWJzdGF0ZTsJLyogSW5pdGlhbCByZWxheHN1YnN0YXRlICovCisgICAgYml0X2ZpeFMgKmJpdF9maXhQOwkJLyogUG9pbnRlciBhdCBiaXRfZml4IHN0cnVjdCAqLworICAgIGludCBhZGRyX21vZGU7CQkvKiBXaGF0IGFkZHJtb2RlIGRvIHdlIGFzc29jaWF0ZSB3aXRoIHRoaXMKKwkJCQkgICBpaWYtZW50cnkgKi8KKyAgICBjaGFyIGJzcjsJCQkvKiBTZXF1ZW50IGhhY2sgKi8KKyAgfSBpaWZfZW50cnlUOwkJCS8qIEludGVybmFsIEluc3RydWN0aW9uIEZvcm1hdCAqLworCitzdHJ1Y3QgaW50X2luc19mb3JtCisgIHsKKyAgICBpbnQgaW5zdHJfc2l6ZTsJCS8qIE1heCBzaXplIG9mIGluc3RydWN0aW9uIGluIGJ5dGVzLiAqLworICAgIGlpZl9lbnRyeVQgaWlmUFtJSUZfRU5UUklFUyArIDFdOworICB9Oworc3RydWN0IGludF9pbnNfZm9ybSBpaWY7CitleHByZXNzaW9uUyBleHByUDsKK2NoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKKy8qIGRlc2NyaXB0aW9uIG9mIHRoZSBQQVJUcyBpbiBJSUYKKyAqb2JqZWN0W25dOgorICogMAl0b3RhbCBsZW5ndGggaW4gYnl0ZXMgb2YgZW50cmllcyBpbiBpaWYKKyAqIDEJb3Bjb2RlCisgKiAyCWluZGV4X2J5dGVfYQorICogMwlpbmRleF9ieXRlX2IKKyAqIDQJZGlzcF9hXzEKKyAqIDUJZGlzcF9hXzIKKyAqIDYJZGlzcF9iXzEKKyAqIDcJZGlzcF9iXzIKKyAqIDgJaW1tX2EKKyAqIDkJaW1tX2IKKyAqIDEwCWltcGxpZWQxCisgKiAxMQlpbXBsaWVkMgorICoKKyAqIEZvciBldmVyeSBlbnRyeSB0aGVyZSBpcyBhIGRhdGFsZW5ndGggaW4gYnl0ZXMuIFRoaXMgaXMgc3RvcmVkIGluIHNpemVbbl0uCisgKgkgMCwJdGhlIG9iamVjdGxlbmd0aCBpcyBub3QgZXhwbGljaXRseSBnaXZlbiBieSB0aGUgaW5zdHJ1Y3Rpb24KKyAqCQlhbmQgdGhlIG9wZXJhbmQgaXMgdW5kZWZpbmVkLiBUaGlzIGlzIGEgY2FzZSBmb3IgcmVsYXhhdGlvbi4KKyAqCQlSZXNlcnZlIDQgYnl0ZXMgZm9yIHRoZSBmaW5hbCBvYmplY3QuCisgKgorICoJIDEsCXRoZSBlbnRyeSBjb250YWlucyBvbmUgYnl0ZQorICoJIDIsCXRoZSBlbnRyeSBjb250YWlucyB0d28gYnl0ZXMKKyAqCSAzLAl0aGUgZW50cnkgY29udGFpbnMgdGhyZWUgYnl0ZXMKKyAqCSA0LAl0aGUgZW50cnkgY29udGFpbnMgZm91ciBieXRlcworICoJZXRjCisgKgorICogRnVydGhlcm1vcmUsIGV2ZXJ5IGVudHJ5IGhhcyBhIGRhdGEgdHlwZSBpZGVudGlmaWVyIGluIHR5cGVbbl0uCisgKgorICogCSAwLAl0aGUgZW50cnkgaXMgdm9pZCwgaWdub3JlIGl0LgorICogCSAxLAl0aGUgZW50cnkgaXMgYSBiaW5hcnkgbnVtYmVyLgorICoJIDIsCXRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgYXQgYW4gZXhwcmVzc2lvbi4KKyAqCQlXaGVyZSBleHByZXNzaW9uIG1heSBiZSBhcyBzaW1wbGUgYXMgYSBzaW5nbGUgJzEnLAorICoJCWFuZCBhcyBjb21wbGljYXRlZCBhcyAgZm9vLWJhcisxMiwKKyAqIAkJZm9vIGFuZCBiYXIgbWF5IGJlIHVuZGVmaW5lZCBidXQgc3VmZml4ZWQgYnkgOntifHd8ZH0gdG8KKyAqCQljb250cm9sIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdC4KKyAqCisgKgkgMywJdGhlIGVudHJ5IGlzIGEgcG9pbnRlciBhdCBhIGJpZ251bSBzdHJ1Y3QKKyAqCisgKgorICogVGhlIGxvdy1vcmRlci1ieXRlIGNvcmVzcG9uZHMgdG8gbG93IHBoeXNpY2FsIG1lbW9yeS4KKyAqIE9idmlvdXNseSBhIEZSQUdtZW50IG11c3QgYmUgY3JlYXRlZCBmb3IgZWFjaCB2YWxpZCBkaXNwIGluIFBBUlQgd2hvc2UKKyAqIGRhdGFsZW5ndGggaXMgdW5kZWZpbmVkICh0byBiYWQpIC4KKyAqIFRoZSBjYXNlIHdoZXJlIGp1c3QgdGhlIGV4cHJlc3Npb24gaXMgdW5kZWZpbmVkIGlzIGxlc3Mgc2V2ZXJlIGFuZCBpcworICogaGFuZGxlZCBieSBmaXguIEhlcmUgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgb2JqZWN0ZmlsZSBpcyBrbm93bi4KKyAqIFdpdGggdGhpcyByZXByZXNlbnRhdGlvbiB3ZSBzaW1wbGlmeSB0aGUgYXNzZW1ibHkgYW5kIHNlcGFyYXRlcyB0aGUKKyAqIG1hY2hpbmUgZGVwZW5kZW50L2luZGVwZW5kZW50IHBhcnRzIGluIGEgbW9yZSBjbGVhbiB3YXkgKHNhaWQgT0UpCisgKi8KKwwKK3N0cnVjdCBuczMya19vcHRpb24gb3B0MVtdID0JCS8qIHJlc3RvcmUsIGV4aXQgKi8KK3sKKyAgeyJyMCIsIDB4ODAsIDB4ZmZ9LAorICB7InIxIiwgMHg0MCwgMHhmZn0sCisgIHsicjIiLCAweDIwLCAweGZmfSwKKyAgeyJyMyIsIDB4MTAsIDB4ZmZ9LAorICB7InI0IiwgMHgwOCwgMHhmZn0sCisgIHsicjUiLCAweDA0LCAweGZmfSwKKyAgeyJyNiIsIDB4MDIsIDB4ZmZ9LAorICB7InI3IiwgMHgwMSwgMHhmZn0sCisgIHswLCAweDAwLCAweGZmfQorfTsKK3N0cnVjdCBuczMya19vcHRpb24gb3B0MltdID0JCS8qIHNhdmUsIGVudGVyICovCit7CisgIHsicjAiLCAweDAxLCAweGZmfSwKKyAgeyJyMSIsIDB4MDIsIDB4ZmZ9LAorICB7InIyIiwgMHgwNCwgMHhmZn0sCisgIHsicjMiLCAweDA4LCAweGZmfSwKKyAgeyJyNCIsIDB4MTAsIDB4ZmZ9LAorICB7InI1IiwgMHgyMCwgMHhmZn0sCisgIHsicjYiLCAweDQwLCAweGZmfSwKKyAgeyJyNyIsIDB4ODAsIDB4ZmZ9LAorICB7MCwgMHgwMCwgMHhmZn0KK307CitzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDNbXSA9CQkvKiBzZXRjZmcgKi8KK3sKKyAgeyJjIiwgMHg4LCAweGZmfSwKKyAgeyJtIiwgMHg0LCAweGZmfSwKKyAgeyJmIiwgMHgyLCAweGZmfSwKKyAgeyJpIiwgMHgxLCAweGZmfSwKKyAgezAsIDB4MCwgMHhmZn0KK307CitzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDRbXSA9CQkvKiBjaW52ICovCit7CisgIHsiYSIsIDB4NCwgMHhmZn0sCisgIHsiaSIsIDB4MiwgMHhmZn0sCisgIHsiZCIsIDB4MSwgMHhmZn0sCisgIHswLCAweDAsIDB4ZmZ9Cit9Oworc3RydWN0IG5zMzJrX29wdGlvbiBvcHQ1W10gPQkJLyogc3RyaW5nIGluc3QgKi8KK3sKKyAgeyJiIiwgMHgyLCAweGZmfSwKKyAgeyJ1IiwgMHhjLCAweGZmfSwKKyAgeyJ3IiwgMHg0LCAweGZmfSwKKyAgezAsIDB4MCwgMHhmZn0KK307CitzdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDZbXSA9CQkvKiBwbGFpbiByZWcgZXh0LGN2dHAgZXRjICovCit7CisgIHsicjAiLCAweDAwLCAweGZmfSwKKyAgeyJyMSIsIDB4MDEsIDB4ZmZ9LAorICB7InIyIiwgMHgwMiwgMHhmZn0sCisgIHsicjMiLCAweDAzLCAweGZmfSwKKyAgeyJyNCIsIDB4MDQsIDB4ZmZ9LAorICB7InI1IiwgMHgwNSwgMHhmZn0sCisgIHsicjYiLCAweDA2LCAweGZmfSwKKyAgeyJyNyIsIDB4MDcsIDB4ZmZ9LAorICB7MCwgMHgwMCwgMHhmZn0KK307CisKKyNpZiAhZGVmaW5lZChOUzMyMDMyKSAmJiAhZGVmaW5lZChOUzMyNTMyKQorI2RlZmluZSBOUzMyNTMyCisjZW5kaWYKKworc3RydWN0IG5zMzJrX29wdGlvbiBjcHVyZWdfNTMyW10gPQkvKiBscHIgc3ByICovCit7CisgIHsidXMiLCAweDAsIDB4ZmZ9LAorICB7ImRjciIsIDB4MSwgMHhmZn0sCisgIHsiYnBjIiwgMHgyLCAweGZmfSwKKyAgeyJkc3IiLCAweDMsIDB4ZmZ9LAorICB7ImNhciIsIDB4NCwgMHhmZn0sCisgIHsiZnAiLCAweDgsIDB4ZmZ9LAorICB7InNwIiwgMHg5LCAweGZmfSwKKyAgeyJzYiIsIDB4YSwgMHhmZn0sCisgIHsidXNwIiwgMHhiLCAweGZmfSwKKyAgeyJjZmciLCAweGMsIDB4ZmZ9LAorICB7InBzciIsIDB4ZCwgMHhmZn0sCisgIHsiaW50YmFzZSIsIDB4ZSwgMHhmZn0sCisgIHsibW9kIiwgMHhmLCAweGZmfSwKKyAgezAsIDB4MDAsIDB4ZmZ9Cit9Oworc3RydWN0IG5zMzJrX29wdGlvbiBtbXVyZWdfNTMyW10gPQkvKiBsbXIgc21yICovCit7CisgIHsibWNyIiwgMHg5LCAweGZmfSwKKyAgeyJtc3IiLCAweGEsIDB4ZmZ9LAorICB7InRlYXIiLCAweGIsIDB4ZmZ9LAorICB7InB0YjAiLCAweGMsIDB4ZmZ9LAorICB7InB0YjEiLCAweGQsIDB4ZmZ9LAorICB7Iml2YXIwIiwgMHhlLCAweGZmfSwKKyAgeyJpdmFyMSIsIDB4ZiwgMHhmZn0sCisgIHswLCAweDAsIDB4ZmZ9Cit9OworCitzdHJ1Y3QgbnMzMmtfb3B0aW9uIGNwdXJlZ18wMzJbXSA9CS8qIGxwciBzcHIgKi8KK3sKKyAgeyJ1cHNyIiwgMHgwLCAweGZmfSwKKyAgeyJmcCIsIDB4OCwgMHhmZn0sCisgIHsic3AiLCAweDksIDB4ZmZ9LAorICB7InNiIiwgMHhhLCAweGZmfSwKKyAgeyJwc3IiLCAweGQsIDB4ZmZ9LAorICB7ImludGJhc2UiLCAweGUsIDB4ZmZ9LAorICB7Im1vZCIsIDB4ZiwgMHhmZn0sCisgIHswLCAweDAsIDB4ZmZ9Cit9Oworc3RydWN0IG5zMzJrX29wdGlvbiBtbXVyZWdfMDMyW10gPQkvKiBsbXIgc21yICovCit7CisgIHsiYnByMCIsIDB4MCwgMHhmZn0sCisgIHsiYnByMSIsIDB4MSwgMHhmZn0sCisgIHsicGYwIiwgMHg0LCAweGZmfSwKKyAgeyJwZjEiLCAweDUsIDB4ZmZ9LAorICB7InNjIiwgMHg4LCAweGZmfSwKKyAgeyJtc3IiLCAweGEsIDB4ZmZ9LAorICB7ImJjbnQiLCAweGIsIDB4ZmZ9LAorICB7InB0YjAiLCAweGMsIDB4ZmZ9LAorICB7InB0YjEiLCAweGQsIDB4ZmZ9LAorICB7ImVpYSIsIDB4ZiwgMHhmZn0sCisgIHswLCAweDAsIDB4ZmZ9Cit9OworCisjaWYgZGVmaW5lZChOUzMyNTMyKQorc3RydWN0IG5zMzJrX29wdGlvbiAqY3B1cmVnID0gY3B1cmVnXzUzMjsKK3N0cnVjdCBuczMya19vcHRpb24gKm1tdXJlZyA9IG1tdXJlZ181MzI7CisjZWxzZQorc3RydWN0IG5zMzJrX29wdGlvbiAqY3B1cmVnID0gY3B1cmVnXzAzMjsKK3N0cnVjdCBuczMya19vcHRpb24gKm1tdXJlZyA9IG1tdXJlZ18wMzI7CisjZW5kaWYKKwwKKworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sJCQkJCS8qIHNvIGZhciBlbXB0eSAqLworICB7MCwgMCwgMH0KK307CisKKyNkZWZpbmUgSU5EKHgseSkJKCgoeCk8PDIpKyh5KSkKKworLyogdGhvc2UgYXJlIGluZGV4J3MgdG8gcmVsYXggZ3JvdXBzIGluIG1kX3JlbGF4X3RhYmxlIGllIGl0IG11c3QgYmUKKyAgIG11bHRpcGxpZWQgYnkgNCB0byBwb2ludCBhdCBhIGdyb3VwIHN0YXJ0LiBWaXogSU5EKHgseSkgU2UgZnVuY3Rpb24KKyAgIHJlbGF4X3NlZ21lbnQgaW4gd3JpdGUuYyBmb3IgbW9yZSBpbmZvICovCisKKyNkZWZpbmUgQlJBTkNICQkxCisjZGVmaW5lIFBDUkVMCQkyCisKKy8qIHRob3NlIGFyZSBpbmRleCdzIHRvIGVudHJpZXMgaW4gYSByZWxheCBncm91cCAqLworCisjZGVmaW5lIEJZVEUJCTAKKyNkZWZpbmUgV09SRAkJMQorI2RlZmluZSBET1VCTEUJCTIKKyNkZWZpbmUgVU5ERUYgICAgICAgICAgIDMKKy8qIFRob3NlIGxpbWl0cyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkaXNwbGFjZW1lbnQgc3RhcnQgaW4gbWVtb3J5LgorICAgVGhlIG5zMzJrIHVzZXMgdGhlIGJlZ2luaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiBhcyBkaXNwbGFjZW1lbnQKKyAgIGJhc2UuICBUaGlzIHR5cGUgb2YgZGlzcGxhY2VtZW50cyBjb3VsZCBiZSBoYW5kbGVkIGhlcmUgYnkgbW92aW5nCisgICB0aGUgbGltaXQgd2luZG93IHVwIG9yIGRvd24uIEkgY2hvb3NlIHRvIHVzZSBhbiBpbnRlcm5hbAorICAgZGlzcGxhY2VtZW50IGJhc2UtYWRqdXN0IGFzIHRoZXJlIGFyZSBvdGhlciByb3V0aW5lcyB0aGF0IG11c3QKKyAgIGNvbnNpZGVyIHRoaXMuIEFsc28sIGFzIHdlIGhhdmUgdHdvIHZhcmlvdXMgb2Zmc2V0LWFkanVzdHMgaW4gdGhlCisgICBuczMyayAoYWNiIHZlcnN1cyBici9icnMvanNyL2Jjb25kKSwgdHdvIHNldCBvZiBsaW1pdHMgd291bGQgaGF2ZQorICAgaGFkIHRvIGJlIHVzZWQuICBOb3cgd2UgZG9udCBoYXZlIHRvIHRoaW5rIGFib3V0IHRoYXQuICovCisKKworY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Cit7CisgIHsxLCAxLCAwLCAwfSwKKyAgezEsIDEsIDAsIDB9LAorICB7MSwgMSwgMCwgMH0sCisgIHsxLCAxLCAwLCAwfSwKKworICB7KDYzKSwgKC02NCksIDEsIElORCAoQlJBTkNILCBXT1JEKX0sCisgIHsoODE5MiksICgtODE5MiksIDIsIElORCAoQlJBTkNILCBET1VCTEUpfSwKKyAgezAsIDAsIDQsIDB9LAorICB7MSwgMSwgMCwgMH0KK307CisKKy8qIEFycmF5IHVzZWQgdG8gdGVzdCBpZiBtb2RlIGNvbnRhaW5zIGRpc3BsYWNlbWVudHMuCisgICBWYWx1ZSBpcyB0cnVlIGlmIG1vZGUgY29udGFpbnMgZGlzcGxhY2VtZW50LiAqLworCitjaGFyIGRpc3BfdGVzdFtdID0KK3swLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMCwKKyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKKworLyogQXJyYXkgdXNlZCB0byBjYWxjdWxhdGUgbWF4IHNpemUgb2YgZGlzcGxhY2VtZW50cyAqLworCitjaGFyIGRpc3Bfc2l6ZVtdID0KK3s0LCAxLCAyLCAwLCA0fTsKKwwKK3N0YXRpYyB2b2lkIGV2YWx1YXRlX2V4cHIgUEFSQU1TICgoZXhwcmVzc2lvblMgKiByZXN1bHRQLCBjaGFyICpwdHIpKTsKK3N0YXRpYyB2b2lkIG1kX251bWJlcl90b19kaXNwIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyB2YWwsIGludCBuKSk7CitzdGF0aWMgdm9pZCBtZF9udW1iZXJfdG9faW1tIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyB2YWwsIGludCBuKSk7CisKKy8qIFBhcnNlcyBhIGdlbmVyYWwgb3BlcmFuZCBpbnRvIGFuIGFkZHJlc3Npbmdtb2RlIHN0cnVjdAorCisgICBpbjogIHBvaW50ZXIgYXQgb3BlcmFuZCBpbiBhc2NpaSBmb3JtCisgICBwb2ludGVyIGF0IGFkZHJfbW9kZSBzdHJ1Y3QgZm9yIHJlc3VsdAorICAgdGhlIGxldmVsIG9mIHJlY3Vyc2lvbi4gKGFsd2F5cyAwIG9yIDEpCisKKyAgIG91dDogZGF0YSBpbiBhZGRyX21vZGUgc3RydWN0CisgICAqLworaW50CithZGRyX21vZGUgKG9wZXJhbmQsIGFkZHJfbW9kZVAsIHJlY3Vyc2l2ZV9sZXZlbCkKKyAgICAgY2hhciAqb3BlcmFuZDsKKyAgICAgcmVnaXN0ZXIgYWRkcl9tb2RlUyAqYWRkcl9tb2RlUDsKKyAgICAgaW50IHJlY3Vyc2l2ZV9sZXZlbDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqc3RyOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgaW50IHN0cmw7CisgIHJlZ2lzdGVyIGludCBtb2RlOworICBpbnQgajsKKyAgbW9kZSA9IERFRkFVTFQ7CQkvKiBkZWZhdWx0ICovCisgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gMDsJLyogd2h5IG5vdCAqLworICBhZGRyX21vZGVQLT5zY2FsZWRfcmVnID0gMDsJLyogaWYgMCwgbm90IHNjYWxlZCBpbmRleCAqLworICBhZGRyX21vZGVQLT5mbG9hdF9mbGFnID0gMDsKKyAgYWRkcl9tb2RlUC0+YW1fc2l6ZSA9IDA7CisgIGFkZHJfbW9kZVAtPmltX2Rpc3AgPSAwOworICBhZGRyX21vZGVQLT5wY3JlbCA9IDA7CS8qIG5vdCBzZXQgaW4gdGhpcyBmdW5jdGlvbiAqLworICBhZGRyX21vZGVQLT5kaXNwX3N1ZmZpeFswXSA9IDA7CisgIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzFdID0gMDsKKyAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IE5VTEw7CisgIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBOVUxMOworICBzdHIgPSBvcGVyYW5kOworICBpZiAoc3RyWzBdID09IDApCisgICAgeworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CQkJCS8qIHdlIGRvbid0IHdhbnQgdGhpcyAqLworICBzdHJsID0gc3RybGVuIChzdHIpOworICBzd2l0Y2ggKHN0clswXSkKKyAgICB7CisgICAgICAvKiB0aGUgZm9sbG93aW5nIHRocmVlIGNhc2Ugc3RhdGVtZW50cyBjb250cm9scyB0aGUgbW9kZS1jaGFycworCSB0aGlzIGlzIHRoZSBwbGFjZSB0byBlZCBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlbSAqLworI2lmZGVmIEFCU09MVVRFX1BSRUZJWAorICAgIGNhc2UgQUJTT0xVVEVfUFJFRklYOgorICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJ10nKQorCWJyZWFrOworICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IDIxOwkvKiBhYnNvbHV0ZSAqLworICAgICAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDE7CisgICAgICByZXR1cm4gKC0xKTsKKyNlbmRpZgorI2lmZGVmIElNTUVESUFURV9QUkVGSVgKKyAgICBjYXNlIElNTUVESUFURV9QUkVGSVg6CisgICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCisJYnJlYWs7CisgICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjA7CS8qIGltbWVkaWF0ZSAqLworICAgICAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDE7CisgICAgICByZXR1cm4gKC0xKTsKKyNlbmRpZgorICAgIGNhc2UgJy4nOgorICAgICAgaWYgKHN0cltzdHJsIC0gMV0gIT0gJ10nKQorCXsKKwkgIHN3aXRjaCAoc3RyWzFdKQorCSAgICB7CisJICAgIGNhc2UgJy0nOgorCSAgICBjYXNlICcrJzoKKwkgICAgICBpZiAoc3RyWzJdICE9ICdcMDAwJykKKwkJeworCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSAyNzsJLyogcGMtcmVsYXRpdiAqLworCQkgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHIgKyAyOworCQkgIHJldHVybiAoLTEpOworCQl9CisJICAgIGRlZmF1bHQ6CisJICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBzeW50YXggaW4gUEMtcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIikpOworCSAgICAgIHJldHVybiAoMCk7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlICdlJzoKKyAgICAgIGlmIChzdHJbc3RybCAtIDFdICE9ICddJykKKwl7CisJICBpZiAoKCFzdHJuY21wIChzdHIsICJleHQoIiwgNCkpICYmIHN0cmwgPiA3KQorCSAgICB7CQkJCS8qIGV4dGVybmFsICovCisJICAgICAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDQ7CisJICAgICAgaSA9IDA7CisJICAgICAgaiA9IDI7CisJICAgICAgZG8KKwkJewkJCS8qIGRpc3BbMF0ncyB0ZXJtaW5hdGlvbiBwb2ludCAqLworCQkgIGogKz0gMTsKKwkJICBpZiAoc3RyW2pdID09ICcoJykKKwkJICAgIGkrKzsKKwkJICBpZiAoc3RyW2pdID09ICcpJykKKwkJICAgIGktLTsKKwkJfQorCSAgICAgIHdoaWxlIChqIDwgc3RybCAmJiBpICE9IDApOworCSAgICAgIGlmIChpICE9IDAgfHwgIShzdHJbaiArIDFdID09ICctJyB8fCBzdHJbaiArIDFdID09ICcrJykpCisJCXsKKwkJICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBFeHRlcm5hbCBhZGRyZXNzaW5nIG1vZGUiKSk7CisJCSAgcmV0dXJuICgwKTsKKwkJfQorCSAgICAgIHN0cltqXSA9ICdcMDAwJzsJCS8qIG51bGwgdGVybWluYXRlIGRpc3BbMF0gKi8KKwkgICAgICBhZGRyX21vZGVQLT5kaXNwWzFdID0gc3RyICsgaiArIDI7CisJICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IDIyOworCSAgICAgIHJldHVybiAoLTEpOworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDo7CisgICAgfQorICBzdHJsID0gc3RybGVuIChzdHIpOworICBzd2l0Y2ggKHN0cmwpCisgICAgeworICAgIGNhc2UgMjoKKyAgICAgIHN3aXRjaCAoc3RyWzBdKQorCXsKKwljYXNlICdmJzoKKwkgIGFkZHJfbW9kZVAtPmZsb2F0X2ZsYWcgPSAxOworCWNhc2UgJ3InOgorCSAgaWYgKHN0clsxXSA+PSAnMCcgJiYgc3RyWzFdIDwgJzgnKQorCSAgICB7CisJICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IHN0clsxXSAtICcwJzsKKwkgICAgICByZXR1cm4gKC0xKTsKKwkgICAgfQorCX0KKyAgICBjYXNlIDM6CisgICAgICBpZiAoIXN0cm5jbXAgKHN0ciwgInRvcyIsIDMpKQorCXsKKwkgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMzsJLyogVG9wT2ZTdGFjayAqLworCSAgcmV0dXJuICgtMSk7CisJfQorICAgIGRlZmF1bHQ6OworICAgIH0KKyAgaWYgKHN0cmwgPiA0KQorICAgIHsKKyAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICcpJykKKwl7CisJICBpZiAoc3RyW3N0cmwgLSAyXSA9PSAnKScpCisJICAgIHsKKwkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDVdLCAiKGZwIiwgMykpCisJCXsKKwkJICBtb2RlID0gMTY7CQkvKiBNZW1vcnkgUmVsYXRpdmUgKi8KKwkJfQorCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoc3AiLCAzKSkKKwkJeworCQkgIG1vZGUgPSAxNzsKKwkJfQorCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoc2IiLCAzKSkKKwkJeworCQkgIG1vZGUgPSAxODsKKwkJfQorCSAgICAgIGlmIChtb2RlICE9IERFRkFVTFQpCisJCXsJCQkvKiBtZW1vcnkgcmVsYXRpdmUgKi8KKwkJICBhZGRyX21vZGVQLT5tb2RlID0gbW9kZTsKKwkJICBqID0gc3RybCAtIDU7CQkvKiB0ZW1wIGZvciBlbmQgb2YgZGlzcFswXSAqLworCQkgIGkgPSAwOworCQkgIGRvCisJCSAgICB7CisJCSAgICAgIHN0cmwgLT0gMTsKKwkJICAgICAgaWYgKHN0cltzdHJsXSA9PSAnKScpCisJCQlpKys7CisJCSAgICAgIGlmIChzdHJbc3RybF0gPT0gJygnKQorCQkJaS0tOworCQkgICAgfQorCQkgIHdoaWxlIChzdHJsID4gLTEgJiYgaSAhPSAwKTsKKwkJICBpZiAoaSAhPSAwKQorCQkgICAgeworCQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBNZW1vcnkgUmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIikpOworCQkgICAgICByZXR1cm4gKDApOworCQkgICAgfQorCQkgIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBzdHI7CisJCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIHN0cmwgKyAxOworCQkgIHN0cltqXSA9ICdcMDAwJzsJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFswXSAqLworCQkgIHN0cltzdHJsXSA9ICdcMDAwJzsJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFsxXSAqLworCQkgIHJldHVybiAoLTEpOworCQl9CisJICAgIH0KKwkgIHN3aXRjaCAoc3RyW3N0cmwgLSAzXSkKKwkgICAgeworCSAgICBjYXNlICdyJzoKKwkgICAgY2FzZSAnUic6CisJICAgICAgaWYgKHN0cltzdHJsIC0gMl0gPj0gJzAnCisJCSAgJiYgc3RyW3N0cmwgLSAyXSA8ICc4JworCQkgICYmIHN0cltzdHJsIC0gNF0gPT0gJygnKQorCQl7CisJCSAgYWRkcl9tb2RlUC0+bW9kZSA9IHN0cltzdHJsIC0gMl0gLSAnMCcgKyA4OworCQkgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHI7CisJCSAgc3RyW3N0cmwgLSA0XSA9IDA7CisJCSAgcmV0dXJuICgtMSk7CQkvKiByZWcgcmVsICovCisJCX0KKwkgICAgZGVmYXVsdDoKKwkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKGZwIiwgMykpCisJCXsKKwkJICBtb2RlID0gMjQ7CisJCX0KKwkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKHNwIiwgMykpCisJCXsKKwkJICBtb2RlID0gMjU7CisJCX0KKwkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKHNiIiwgMykpCisJCXsKKwkJICBtb2RlID0gMjY7CisJCX0KKwkgICAgICBpZiAoIXN0cm5jbXAgKCZzdHJbc3RybCAtIDRdLCAiKHBjIiwgMykpCisJCXsKKwkJICBtb2RlID0gMjc7CisJCX0KKwkgICAgICBpZiAobW9kZSAhPSBERUZBVUxUKQorCQl7CisJCSAgYWRkcl9tb2RlUC0+bW9kZSA9IG1vZGU7CisJCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKKwkJICBzdHJbc3RybCAtIDRdID0gJ1wwJzsKKwkJICByZXR1cm4gKC0xKTsJCS8qIG1lbW9yeSBzcGFjZSAqLworCQl9CisJICAgIH0KKwl9CisgICAgICAvKiBubyB0cmFpbGluZyAnKScgZG8gd2UgaGF2ZSBhICddJyA/ICovCisgICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCisJeworCSAgc3dpdGNoIChzdHJbc3RybCAtIDJdKQorCSAgICB7CisJICAgIGNhc2UgJ2InOgorCSAgICAgIG1vZGUgPSAyODsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAndyc6CisJICAgICAgbW9kZSA9IDI5OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdkJzoKKwkgICAgICBtb2RlID0gMzA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3EnOgorCSAgICAgIG1vZGUgPSAzMTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDo7CisJICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBzY2FsZWQtaW5kZXhlZCBtb2RlLCB1c2UgKGIsdyxkLHEpIikpOworCSAgICAgIGlmIChzdHJbc3RybCAtIDNdICE9ICc6JyB8fCBzdHJbc3RybCAtIDZdICE9ICdbJworCQkgIHx8IHN0cltzdHJsIC0gNV0gPT0gJ3InIHx8IHN0cltzdHJsIC0gNF0gPCAnMCcKKwkJICB8fCBzdHJbc3RybCAtIDRdID4gJzcnKQorCQl7CisJCSAgYXNfd2FybiAoXygiU3ludGF4IGluIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSBbUm46bV0gd2hlcmUgbj1bMC4uN10gbT17Yix3LGQscX0iKSk7CisJCX0KKwkgICAgfSAvKiBzY2FsZWQgaW5kZXggKi8KKwkgIHsKKwkgICAgaWYgKHJlY3Vyc2l2ZV9sZXZlbCA+IDApCisJICAgICAgeworCQlhc193YXJuIChfKCJTY2FsZWQtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiKSk7CisJCXJldHVybiAoMCk7CisJICAgICAgfQorCSAgICBhZGRyX21vZGVQLT5hbV9zaXplICs9IDE7CS8qIHNjYWxlZCBpbmRleCBieXRlICovCisJICAgIGogPSBzdHJbc3RybCAtIDRdIC0gJzAnOwkvKiBzdG9yZSB0ZW1wb3JhcnkgKi8KKwkgICAgc3RyW3N0cmwgLSA2XSA9ICdcMDAwJzsJLyogbnVsbHRlcm1pbmF0ZSBmb3IgcmVjdXJzaXZlIGNhbGwgKi8KKwkgICAgaSA9IGFkZHJfbW9kZSAoc3RyLCBhZGRyX21vZGVQLCAxKTsKKwkgICAgaWYgKCFpIHx8IGFkZHJfbW9kZVAtPm1vZGUgPT0gMjApCisJICAgICAgeworCQlhc193YXJuIChfKCJJbnZhbGlkIG9yIGlsbGVnYWwgYWRkcmVzc2luZyBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkLWluZGV4IikpOworCQlyZXR1cm4gKDApOworCSAgICAgIH0KKwkgICAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSBhZGRyX21vZGVQLT5tb2RlOwkvKiBzdG9yZSB0aGUgaW5mZXJpb3IKKwkJCQkJCQkgICBtb2RlICovCisJICAgIGFkZHJfbW9kZVAtPm1vZGUgPSBtb2RlOworCSAgICBhZGRyX21vZGVQLT5zY2FsZWRfcmVnID0gaiArIDE7CisJICAgIHJldHVybiAoLTEpOworCSAgfQorCX0KKyAgICB9CisgIGFkZHJfbW9kZVAtPm1vZGUgPSBERUZBVUxUOwkvKiBkZWZhdWx0IHRvIHdoYXRldmVyICovCisgIGFkZHJfbW9kZVAtPmRpc3BbMF0gPSBzdHI7CisgIHJldHVybiAoLTEpOworfQorDAorLyogcHRyIHBvaW50cyBhdCBzdHJpbmcgYWRkcl9tb2RlUCBwb2ludHMgYXQgc3RydWN0IHdpdGggcmVzdWx0IFRoaXMKKyAgIHJvdXRpbmUgY2FsbHMgYWRkcl9tb2RlIHRvIGRldGVybWluZSB0aGUgZ2VuZXJhbCBhZGRyLm1vZGUgb2YgdGhlCisgICBvcGVyYW5kLiBXaGVuIHRoaXMgaXMgcmVhZHkgaXQgcGFyc2VzIHRoZSBkaXNwbGFjZW1lbnRzIGZvciBzaXplCisgICBzcGVjaWZ5aW5nIHN1ZmZpeGVzIGFuZCBkZXRlcm1pbmVzIHNpemUgb2YgaW1tZWRpYXRlIG1vZGUgdmlhCisgICBuczMyay1vcGNvZGUuICBBbHNvIGJ1aWxkcyBpbmRleCBieXRlcyBpZiBuZWVkZWQuICAqLworaW50CitnZXRfYWRkcl9tb2RlIChwdHIsIGFkZHJfbW9kZVApCisgICAgIGNoYXIgKnB0cjsKKyAgICAgYWRkcl9tb2RlUyAqYWRkcl9tb2RlUDsKK3sKKyAgaW50IHRtcDsKKyAgYWRkcl9tb2RlIChwdHIsIGFkZHJfbW9kZVAsIDApOworICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSBERUZBVUxUIHx8IGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID09IC0xKQorICAgIHsKKyAgICAgIC8qIHJlc29sdmUgYW1iaWdpb3VzIG9wZXJhbmRzLCB0aGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgaWYKKwkgb25lIHVzZXMgc3RhbmRhcmQgTlNDIG9wZXJhbmQgc3ludGF4LiBCdXQgdGhlIHNlcXVlbnQKKwkgY29tcGlsZXIgZG9lc24ndCEhISAgVGhpcyBmaW5kcyBhIHByb3BlciBhZGRyZXNzaW5naW5nIG1vZGUKKwkgaWYgaXQgaXMgaW1wbGljaXRseSBzdGF0ZWQuIFNlZSBuczMyay1vcGNvZGUuaCAqLworICAgICAgKHZvaWQpIGV2YWx1YXRlX2V4cHIgKCZleHByUCwgcHRyKTsgLyogdGhpcyBjYWxsIHRha2VzIHRpbWUgU2lnaCEgKi8KKyAgICAgIGlmIChhZGRyX21vZGVQLT5tb2RlID09IERFRkFVTFQpCisJeworCSAgaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKKwkgICAgeworCSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVsOyAvKiB3ZSBoYXZlIGEgbGFiZWwgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWM7IC8qIHdlIGhhdmUgYSBjb25zdGFudCAqLworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpCisJICAgIHsKKwkgICAgICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWw7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlYzsKKwkgICAgfQorCX0KKyAgICAgIC8qIG11c3QgcHV0IHRoaXMgbWVzcyBkb3duIGluIGFkZHJfbW9kZSB0byBoYW5kbGUgdGhlIHNjYWxlZAorICAgICAgICAgY2FzZSBiZXR0ZXIgKi8KKyAgICB9CisgIC8qIEl0IGFwcGVhcnMgYXMgdGhlIHNlcXVlbnQgY29tcGlsZXIgd2FudHMgYW4gYWJzb2x1dGUgd2hlbiB3ZSBoYXZlCisgICAgIGEgbGFiZWwgd2l0aG91dCBALiBDb25zdGFudHMgYmVjb21lcyBpbW1lZGlhdGVzIGJlc2lkZXMgdGhlIGFkZHIKKyAgICAgY2FzZS4gIFRoaW5rIGl0IGRvZXMgc28gd2l0aCBsb2NhbCBsYWJlbHMgdG9vLCBub3Qgb3B0aW11bSwgcGNyZWwKKyAgICAgaXMgYmV0dGVyLiAgV2hlbiBJIGhhdmUgdGltZSBJIHdpbGwgbWFrZSBnYXMgY2hlY2sgdGhpcyBhbmQKKyAgICAgc2VsZWN0IHBjcmVsIHdoZW4gcG9zc2libGUgQWN0dWFsbHkgdGhhdCBpcyB0cml2aWFsLiAgKi8KKyAgaWYgKHRtcCA9IGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcpCisgICAgewkJCQkvKiBidWlsZCBpbmRleGJ5dGUgKi8KKyAgICAgIHRtcC0tOwkJCS8qIHJlbWVtYmVyIHJlZ251bWJlciBjb21lcyBpbmNyZW1lbnRlZCBmb3IKKwkJCQkgICBmbGFncHVycG9zZSAqLworICAgICAgdG1wIHw9IGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlIDw8IDM7CisgICAgICBhZGRyX21vZGVQLT5pbmRleF9ieXRlID0gKGNoYXIpIHRtcDsKKyAgICAgIGFkZHJfbW9kZVAtPmFtX3NpemUgKz0gMTsKKyAgICB9CisgIGlmIChkaXNwX3Rlc3RbYWRkcl9tb2RlUC0+bW9kZV0pCisgICAgewkJCQkvKiB0aGVyZSB3YXMgYSBkaXNwbGFjZW1lbnQsIHByb2JlIGZvciBsZW5ndGgKKwkJCQkgICBzcGVjaWZ5aW5nIHN1ZmZpeCAqLworICAgICAgeworCXJlZ2lzdGVyIGNoYXIgYzsKKwlyZWdpc3RlciBjaGFyIHN1ZmZpeDsKKwlyZWdpc3RlciBjaGFyIHN1ZmZpeF9zdWI7CisJcmVnaXN0ZXIgaW50IGk7CisJcmVnaXN0ZXIgY2hhciAqdG9QOworCXJlZ2lzdGVyIGNoYXIgKmZyb21QOworCisJYWRkcl9tb2RlUC0+cGNyZWwgPSAwOworCWlmIChkaXNwX3Rlc3RbYWRkcl9tb2RlUC0+bW9kZV0pCisJICB7CQkJLyogdGhlcmUgaXMgYSBkaXNwbGFjZW1lbnQgKi8KKwkgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gMjcgfHwgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPT0gMjcpCisJICAgICAgewkJCS8qIGRvIHdlIGhhdmUgcGNyZWwuIG1vZGUgKi8KKwkJYWRkcl9tb2RlUC0+cGNyZWwgPSAxOworCSAgICAgIH0KKwkgICAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDE7CisJICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJICAgICAgeworCQlzdWZmaXhfc3ViID0gc3VmZml4ID0gMDsKKwkJaWYgKHRvUCA9IGFkZHJfbW9kZVAtPmRpc3BbaV0pCisJCSAgewkJLyogc3VmZml4IG9mIGV4cHJlc3Npb24sIHRoZSBsYXJnZXN0IHNpemUKKwkJCQkgICBydWxlcyAqLworCQkgICAgZnJvbVAgPSB0b1A7CisJCSAgICB3aGlsZSAoYyA9ICpmcm9tUCsrKQorCQkgICAgICB7CisJCQkqdG9QKysgPSBjOworCQkJaWYgKGMgPT0gJzonKQorCQkJICB7CisJCQkgICAgc3dpdGNoICgqZnJvbVApCisJCQkgICAgICB7CisJCQkgICAgICBjYXNlICdcMCc6CisJCQkJYXNfd2FybiAoXygiUHJlbWF0dXJlIGVuZCBvZiBzdWZmaXggLS0gRGVmYXVsdGluZyB0byBkIikpOworCQkJCXN1ZmZpeCA9IDQ7CisJCQkJY29udGludWU7CisJCQkgICAgICBjYXNlICdiJzoKKwkJCQlzdWZmaXhfc3ViID0gMTsKKwkJCQlicmVhazsKKwkJCSAgICAgIGNhc2UgJ3cnOgorCQkJCXN1ZmZpeF9zdWIgPSAyOworCQkJCWJyZWFrOworCQkJICAgICAgY2FzZSAnZCc6CisJCQkJc3VmZml4X3N1YiA9IDQ7CisJCQkJYnJlYWs7CisJCQkgICAgICBkZWZhdWx0OgorCQkJCWFzX3dhcm4gKF8oIkJhZCBzdWZmaXggYWZ0ZXIgJzonIHVzZSB7Ynx3fGR9IERlZmF1bHRpbmcgdG8gZCIpKTsKKwkJCQlzdWZmaXggPSA0OworCQkJICAgICAgfQorCQkJICAgIGZyb21QKys7CisJCQkgICAgdG9QLS07CS8qIFNvIHdlIHdyaXRlIG92ZXIgdGhlICc6JyAqLworCQkJICAgIGlmIChzdWZmaXggPCBzdWZmaXhfc3ViKQorCQkJICAgICAgc3VmZml4ID0gc3VmZml4X3N1YjsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICAqdG9QID0gJ1wwJzsvKiB0ZXJtaW5hdGUgcHJvcGVybHkgKi8KKwkJICAgIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4W2ldID0gc3VmZml4OworCQkgICAgYWRkcl9tb2RlUC0+YW1fc2l6ZSArPSBzdWZmaXggPyBzdWZmaXggOiA0OworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gMjApCisJewkJCS8qIGxvb2sgaW4gbnMzMmtfb3Bjb2RlIGZvciBzaXplICovCisJICBhZGRyX21vZGVQLT5kaXNwX3N1ZmZpeFswXSA9IGFkZHJfbW9kZVAtPmFtX3NpemUgPSBkZXNjLT5pbV9zaXplOworCSAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDA7CisJfQorICAgIH0KKyAgcmV0dXJuIGFkZHJfbW9kZVAtPm1vZGU7Cit9CisKKworLyogcmVhZCBhbiBvcHRpb25saXN0ICovCit2b2lkCitvcHRsaXN0IChzdHIsIG9wdGlvblAsIGRlZmF1bHRfbWFwKQorICAgICBjaGFyICpzdHI7CQkJLyogdGhlIHN0cmluZyB0byBleHRyYWN0IG9wdGlvbnMgZnJvbSAqLworICAgICBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwkvKiBob3cgdG8gc2VhcmNoIHRoZSBzdHJpbmcgKi8KKyAgICAgdW5zaWduZWQgbG9uZyAqZGVmYXVsdF9tYXA7CS8qIGRlZmF1bHQgcGF0dGVybiBhbmQgb3V0cHV0ICovCit7CisgIHJlZ2lzdGVyIGludCBpLCBqLCBrLCBzdHJsZW4xLCBzdHJsZW4yOworICByZWdpc3RlciBjaGFyICpwYXR0ZXJuUCwgKnN0clA7CisgIHN0cmxlbjEgPSBzdHJsZW4gKHN0cik7CisgIGlmIChzdHJsZW4xIDwgMSkKKyAgICB7CisgICAgICBhc19mYXRhbCAoXygiVmVyeSBzaG9ydCBpbnN0ciB0byBvcHRpb24sIGllIHlvdSBjYW4ndCBkbyBpdCBvbiBhIE5VTExzdHIiKSk7CisgICAgfQorICBmb3IgKGkgPSAwOyBvcHRpb25QW2ldLnBhdHRlcm4gIT0gMDsgaSsrKQorICAgIHsKKyAgICAgIHN0cmxlbjIgPSBzdHJsZW4gKG9wdGlvblBbaV0ucGF0dGVybik7CisgICAgICBmb3IgKGogPSAwOyBqIDwgc3RybGVuMTsgaisrKQorCXsKKwkgIHBhdHRlcm5QID0gb3B0aW9uUFtpXS5wYXR0ZXJuOworCSAgc3RyUCA9ICZzdHJbal07CisJICBmb3IgKGsgPSAwOyBrIDwgc3RybGVuMjsgaysrKQorCSAgICB7CisJICAgICAgaWYgKCooc3RyUCsrKSAhPSAqKHBhdHRlcm5QKyspKQorCQlicmVhazsKKwkgICAgfQorCSAgaWYgKGsgPT0gc3RybGVuMikKKwkgICAgewkJCS8qIG1hdGNoICovCisJICAgICAgKmRlZmF1bHRfbWFwIHw9IG9wdGlvblBbaV0ub3I7CisJICAgICAgKmRlZmF1bHRfbWFwICY9IG9wdGlvblBbaV0uYW5kOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogc2VhcmNoIHN0cnVjdCBmb3Igc3ltYm9scworICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgc2hvcnQgaW50ZWdlciBmb3JtIG9mIHJlZyBuYW1lcyBpbgorICAgdGhlIGluc3RydWN0aW9ucyBsbXIsIHNtciwgbHByLCBzcHIgcmV0dXJuIHRydWUgaWYgc3RyIGlzIGZvdW5kIGluCisgICBsaXN0ICovCisKK2ludAorbGlzdF9zZWFyY2ggKHN0ciwgb3B0aW9uUCwgZGVmYXVsdF9tYXApCisgICAgIGNoYXIgKnN0cjsJCQkJLyogdGhlIHN0cmluZyB0byBtYXRjaCAqLworICAgICBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwkvKiBsaXN0IHRvIHNlYXJjaCAqLworICAgICB1bnNpZ25lZCBsb25nICpkZWZhdWx0X21hcDsJLyogZGVmYXVsdCBwYXR0ZXJuIGFuZCBvdXRwdXQgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGZvciAoaSA9IDA7IG9wdGlvblBbaV0ucGF0dGVybiAhPSAwOyBpKyspCisgICAgeworICAgICAgaWYgKCFzdHJuY21wIChvcHRpb25QW2ldLnBhdHRlcm4sIHN0ciwgMjApKQorCXsJCQkJLyogdXNlIHN0cm5jbXAgdG8gYmUgc2FmZSAqLworCSAgKmRlZmF1bHRfbWFwIHw9IG9wdGlvblBbaV0ub3I7CisJICAqZGVmYXVsdF9tYXAgJj0gb3B0aW9uUFtpXS5hbmQ7CisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKyAgYXNfd2FybiAoXygiTm8gc3VjaCBlbnRyeSBpbiBsaXN0LiAoY3B1L21tdSByZWdpc3RlcikiKSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZXZhbHVhdGVfZXhwciAocmVzdWx0UCwgcHRyKQorICAgICBleHByZXNzaW9uUyAqcmVzdWx0UDsKKyAgICAgY2hhciAqcHRyOworeworICByZWdpc3RlciBjaGFyICp0bXBfbGluZTsKKworICB0bXBfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gcHRyOworICBleHByZXNzaW9uICgmZXhwclApOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBfbGluZTsKK30KKwwKKy8qIENvbnZlcnQgb3BlcmFuZHMgdG8gaWlmLWZvcm1hdCBhbmQgYWRkcyBiaXRmaWVsZHMgdG8gdGhlIG9wY29kZS4KKyAgIE9wZXJhbmRzIGFyZSBwYXJzZWQgaW4gc3VjaCBhbiBvcmRlciB0aGF0IHRoZSBvcGNvZGUgaXMgdXBkYXRlZCBmcm9tCisgICBpdHMgbW9zdCBzaWduaWZpY2FudCBiaXQsIHRoYXQgaXMgd2hlbiB0aGUgb3BlcmFuZCBuZWVkIHRvIGFsdGVyIHRoZQorICAgb3Bjb2RlLgorICAgQmUgY2FyZWZ1bGwgbm90IHRvIHB1dCB0byBvYmplY3RzIGluIHRoZSBzYW1lIGlpZi1zbG90LgorICAgKi8KKwordm9pZAorZW5jb2RlX29wZXJhbmQgKGFyZ2MsIGFyZ3YsIG9wZXJhbmRzUCwgc3VmZml4UCwgaW1fc2l6ZSwgb3Bjb2RlX2JpdF9wdHIpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqb3BlcmFuZHNQOworICAgICBjaGFyICpzdWZmaXhQOworICAgICBjaGFyIGltX3NpemU7CisgICAgIGNoYXIgb3Bjb2RlX2JpdF9wdHI7Cit7CisgIHJlZ2lzdGVyIGludCBpLCBqOworICBjaGFyIGQ7CisgIGludCBwY3JlbCwgdG1wLCBiLCBsb29wLCBwY3JlbF9hZGp1c3Q7CisgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBhcmdjOyBsb29wKyspCisgICAgeworICAgICAgaSA9IG9wZXJhbmRzUFtsb29wIDw8IDFdIC0gJzEnOwkvKiB3aGF0IG9wZXJhbmQgYXJlIHdlIHN1cHBvc2VkCisJCQkJCSAgIHRvIHdvcmsgb24gKi8KKyAgICAgIGlmIChpID4gMykKKwlhc19mYXRhbCAoXygiSW50ZXJuYWwgY29uc2lzdGVuY3kgZXJyb3IuICBjaGVjayBuczMyay1vcGNvZGUuaCIpKTsKKyAgICAgIHBjcmVsID0gMDsKKyAgICAgIHBjcmVsX2FkanVzdCA9IDA7CisgICAgICB0bXAgPSAwOworICAgICAgc3dpdGNoICgoZCA9IG9wZXJhbmRzUFsobG9vcCA8PCAxKSArIDFdKSkKKwl7CisJY2FzZSAnZic6CQkvKiBvcGVyYW5kIG9mIHNmc3IgdHVybnMgb3V0IHRvIGJlIGEgbmFzdHkKKwkJCQkgICBzcGVjaWFsY2FzZSAqLworCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNTsKKwljYXNlICdaJzoJCS8qIGZsb2F0IG5vdCBpbW1lZGlhdGUgKi8KKwljYXNlICdGJzoJCS8qIDMyIGJpdCBmbG9hdAlnZW5lcmFsIGZvcm0gKi8KKwljYXNlICdMJzoJCS8qIDY0IGJpdCBmbG9hdAkqLworCWNhc2UgJ0knOgkJLyogaW50ZWdlciBub3QgaW1tZWRpYXRlICovCisJY2FzZSAnQic6CQkvKiBieXRlCSAqLworCWNhc2UgJ1cnOgkJLyogd29yZAkgKi8KKwljYXNlICdEJzoJCS8qIGRvdWJsZS13b3JkCSovCisJY2FzZSAnQSc6CQkvKiBkb3VibGUtd29yZAlnZW4tYWRkcmVzcy1mb3JtIGllIG5vIHJlZ3MKKwkJCQkgICBhbGxvd2VkICovCisJICBnZXRfYWRkcl9tb2RlIChhcmd2W2ldLCAmYWRkcl9tb2RlUCk7CisJICBpZigoYWRkcl9tb2RlUC5tb2RlID09IDIwKSAmJgorCSAgICAgKGQgPT0gJ0knIHx8IGQgPT0gJ1onIHx8IGQgPT0gJ0EnKSkgeworCSAgICBhc19mYXRhbChkID09ICdBJz8gXygiQWRkcmVzcyBvZiBpbW1lZGlhdGUgb3BlcmFuZCIpOgorCQkgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlIHdyaXRlIG9wZXJhbmQuIikpOworCSAgfQorCisJICBpZiAob3Bjb2RlX2JpdF9wdHIgPT0gZGVzYy0+b3Bjb2RlX3NpemUpCisJICAgIGIgPSA0OworCSAgZWxzZQorCSAgICBiID0gNjsKKwkgIGZvciAoaiA9IGI7IGogPCAoYiArIDIpOyBqKyspCisJICAgIHsKKwkgICAgICBpZiAoYWRkcl9tb2RlUC5kaXNwW2ogLSBiXSkKKwkJeworCQkgIElJRiAoaiwKKwkJICAgICAgIDIsCisJCSAgICAgICBhZGRyX21vZGVQLmRpc3Bfc3VmZml4W2ogLSBiXSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyX21vZGVQLmRpc3BbaiAtIGJdLAorCQkgICAgICAgMCwKKwkJICAgICAgIGFkZHJfbW9kZVAucGNyZWwsCisJCSAgICAgICBpaWYuaW5zdHJfc2l6ZSwKKwkJICAgICAgIGFkZHJfbW9kZVAuaW1fZGlzcCwKKwkJICAgICAgIElORCAoQlJBTkNILCBCWVRFKSwKKwkJICAgICAgIE5VTEwsCisJCSAgICAgICAoYWRkcl9tb2RlUC5zY2FsZWRfcmVnID8gYWRkcl9tb2RlUC5zY2FsZWRfbW9kZQorCQkJOiBhZGRyX21vZGVQLm1vZGUpLAorCQkgICAgICAgMCk7CisJCX0KKwkgICAgfQorCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNTsKKwkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSAoKGxvbmcpIGFkZHJfbW9kZVAubW9kZSkgPDwgb3Bjb2RlX2JpdF9wdHI7CisJICBpZiAoYWRkcl9tb2RlUC5zY2FsZWRfcmVnKQorCSAgICB7CisJICAgICAgaiA9IGIgLyAyOworCSAgICAgIElJRiAoaiwgMSwgMSwgKHVuc2lnbmVkIGxvbmcpIGFkZHJfbW9kZVAuaW5kZXhfYnl0ZSwKKwkJICAgMCwgMCwgMCwgMCwgMCwgTlVMTCwgLTEsIDApOworCSAgICB9CisJICBicmVhazsKKwljYXNlICdiJzoJCS8qIG11bHRpcGxlIGluc3RydWN0aW9uIGRpc3AgKi8KKwkgIGZyZWVwdHIrKzsJCS8qIE9WRTp0aGlzIGlzIGFuIHVzZWZ1bCBoYWNrICovCisJICBzcHJpbnRmIChmcmVlcHRyLCAiKCglcy0xKSolZClcMDAwIiwgYXJndltpXSwgZGVzYy0+aW1fc2l6ZSk7CisJICBhcmd2W2ldID0gZnJlZXB0cjsKKwkgIHBjcmVsIC09IDE7CQkvKiBtYWtlIHBjcmVsIDAgaW5zcGl0ZSBvZiB3aGF0IGNhc2UgJ3AnOgorCQkJCSAgIHdhbnRzICovCisJICAvKiBmYWxsIHRocnUgKi8KKwljYXNlICdwJzoJCS8qIGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgKi8KKwkgIHBjcmVsICs9IDE7CisJICAvKiBmYWxsIHRocnUgKi8KKwljYXNlICdkJzoJCS8qIGRpc3BsYWNlbWVudCAqLworCSAgaWlmLmluc3RyX3NpemUgKz0gc3VmZml4UFtpXSA/IHN1ZmZpeFBbaV0gOiA0OworCSAgSUlGICgxMiwgMiwgc3VmZml4UFtpXSwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsCisJICAgICAgIHBjcmVsLCBwY3JlbF9hZGp1c3QsIDEsIElORCAoQlJBTkNILCBCWVRFKSwgTlVMTCwgLTEsIDApOworCSAgYnJlYWs7CisJY2FzZSAnSCc6CQkvKiBzZXF1ZW50LWhhY2s6IHRoZSBsaW5rZXIgd2FudHMgYSBiaXQgc2V0CisJCQkJICAgd2hlbiBic3IgKi8KKwkgIHBjcmVsID0gMTsKKwkgIGlpZi5pbnN0cl9zaXplICs9IHN1ZmZpeFBbaV0gPyBzdWZmaXhQW2ldIDogNDsKKwkgIElJRiAoMTIsIDIsIHN1ZmZpeFBbaV0sICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLCAwLAorCSAgICAgICBwY3JlbCwgcGNyZWxfYWRqdXN0LCAxLCBJTkQgKEJSQU5DSCwgQllURSksIE5VTEwsIC0xLCAxKTsKKwkgIGJyZWFrOworCWNhc2UgJ3EnOgkJLyogcXVpY2sgKi8KKwkgIG9wY29kZV9iaXRfcHRyIC09IDQ7CisJICBJSUYgKDExLCAyLCA0MiwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsIDAsIDAsIDAsIDAsCisJICAgICAgIGJpdF9maXhfbmV3ICg0LCBvcGNvZGVfYml0X3B0ciwgLTgsIDcsIDAsIDEsIDApLCAtMSwgMCk7CisJICBicmVhazsKKwljYXNlICdyJzoJCS8qIHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKSAqLworCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIG9wdDYsICZ0bXApOworCSAgb3Bjb2RlX2JpdF9wdHIgLT0gMzsKKwkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgb3Bjb2RlX2JpdF9wdHI7CisJICBicmVhazsKKwljYXNlICdPJzoJCS8qIHNldGNmZyBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdCAqLworCSAgb3B0bGlzdCAoYXJndltpXSwgb3B0MywgJnRtcCk7CisJICBvcGNvZGVfYml0X3B0ciAtPSA0OworCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCAxNTsKKwkgIGJyZWFrOworCWNhc2UgJ0MnOgkJLyogY2ludiBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdCAqLworCSAgb3B0bGlzdCAoYXJndltpXSwgb3B0NCwgJnRtcCk7CisJICBvcGNvZGVfYml0X3B0ciAtPSA0OworCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCAxNTsgLyogaW5zZXJ0IHRoZSByZWd0eXBlIGluIG9wY29kZSAqLworCSAgYnJlYWs7CisJY2FzZSAnUyc6CQkvKiBzdHJpbmdpbnN0cnVjdGlvbiBvcHRpb25zbGlzdCAqLworCSAgb3B0bGlzdCAoYXJndltpXSwgb3B0NSwgJnRtcCk7CisJICBvcGNvZGVfYml0X3B0ciAtPSA0OworCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCAxNTsKKwkgIGJyZWFrOworCWNhc2UgJ3UnOgorCWNhc2UgJ1UnOgkJLyogcmVnaXN0ZXJsaXN0ICovCisJICBJSUYgKDEwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCAtMSwgMCk7CisJICBzd2l0Y2ggKG9wZXJhbmRzUFsoaSA8PCAxKSArIDFdKQorCSAgICB7CisJICAgIGNhc2UgJ3UnOgkJLyogcmVzdG9yZSwgZXhpdCAqLworCSAgICAgIG9wdGxpc3QgKGFyZ3ZbaV0sIG9wdDEsICZpaWYuaWlmUFsxMF0ub2JqZWN0KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnVSc6CQkvKiBzYXZlLGVudGVyICovCisJICAgICAgb3B0bGlzdCAoYXJndltpXSwgb3B0MiwgJmlpZi5paWZQWzEwXS5vYmplY3QpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpaWYuaW5zdHJfc2l6ZSArPSAxOworCSAgYnJlYWs7CisJY2FzZSAnTSc6CQkvKiBtbXUgcmVnaXN0ZXIgKi8KKwkgIGxpc3Rfc2VhcmNoIChhcmd2W2ldLCBtbXVyZWcsICZ0bXApOworCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKKwkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgb3Bjb2RlX2JpdF9wdHI7CisJICBicmVhazsKKwljYXNlICdQJzoJCS8qIGNwdSByZWdpc3RlciAgKi8KKwkgIGxpc3Rfc2VhcmNoIChhcmd2W2ldLCBjcHVyZWcsICZ0bXApOworCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKKwkgIGlpZi5paWZQWzFdLm9iamVjdCB8PSB0bXAgPDwgb3Bjb2RlX2JpdF9wdHI7CisJICBicmVhazsKKwljYXNlICdnJzoJCS8qIGluc3MgZXh0cyAqLworCSAgaWlmLmluc3RyX3NpemUgKz0gMTsJLyogMSBieXRlIGlzIGFsbG9jYXRlZCBhZnRlciB0aGUgb3Bjb2RlICovCisJICBJSUYgKDEwLCAyLCAxLAorCSAgICAgICAodW5zaWduZWQgbG9uZykgYXJndltpXSwJLyogaSBhbHdheXMgMiBoZXJlICovCisJICAgICAgIDAsIDAsIDAsIDAsIDAsCisJICAgICAgIGJpdF9maXhfbmV3ICgzLCA1LCAwLCA3LCAwLCAwLCAwKSwgLyogYSBiaXRfZml4IGlzIHRhcmdldGVkIHRvCisJCQkJCQkgICAgIHRoZSBieXRlICovCisJICAgICAgIC0xLCAwKTsKKwkgIGJyZWFrOworCWNhc2UgJ0cnOgorCSAgSUlGICgxMSwgMiwgNDIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLAkvKiBpIGFsd2F5cyAzIGhlcmUgKi8KKwkgICAgICAgMCwgMCwgMCwgMCwgMCwKKwkgICAgICAgYml0X2ZpeF9uZXcgKDUsIDAsIDEsIDMyLCAtMSwgMCwgLTEpLCAtMSwgMCk7CisJICBicmVhazsKKwljYXNlICdpJzoKKwkgIGlpZi5pbnN0cl9zaXplICs9IDE7CisJICBiID0gMiArIGk7CQkvKiBwdXQgdGhlIGV4dGVuc2lvbiBieXRlIGFmdGVyIG9wY29kZSAqLworCSAgSUlGIChiLCAyLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYXNfZmF0YWwgKF8oIkJhZCBvcGNvZGUtdGFibGUtb3B0aW9uLCBjaGVjayBpbiBmaWxlIG5zMzJrLW9wY29kZS5oIikpOworCX0KKyAgICB9Cit9CisMCisvKiBpbjogIGluc3RydWN0aW9uIGxpbmUKKyAgIG91dDogaW50ZXJuYWwgc3RydWN0dXJlIG9mIGluc3RydWN0aW9uCisgICB0aGF0IGhhcyBiZWVuIHByZXBhcmVkIGZvciBkaXJlY3QgY29udmVyc2lvbiB0byBmcmFnbWVudChzKSBhbmQKKyAgIGZpeGVzIGluIGEgc3lzdGVtYXRpY2FsIGZhc2hpb24KKyAgIFJldHVybi12YWx1ZSA9IHJlY3Vyc2l2ZV9sZXZlbAorICAgKi8KKy8qIGJ1aWxkIGlpZiBvZiBvbmUgYXNzZW1ibHkgdGV4dCBsaW5lICovCitpbnQKK3BhcnNlIChsaW5lLCByZWN1cnNpdmVfbGV2ZWwpCisgICAgIGNoYXIgKmxpbmU7CisgICAgIGludCByZWN1cnNpdmVfbGV2ZWw7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKmxpbmVwdHIsIGMsIHN1ZmZpeF9zZXBhcmF0b3I7CisgIHJlZ2lzdGVyIGludCBpOworICBpbnQgYXJnYywgYXJnX3R5cGU7CisgIGNoYXIgc3FyLCBzZXA7CisgIGNoYXIgc3VmZml4W01BWF9BUkdTXSwgKmFyZ3ZbTUFYX0FSR1NdOwkvKiBubyBtb3JlIHRoYW4gNCBvcGVyYW5kcyAqLworICBpZiAocmVjdXJzaXZlX2xldmVsIDw9IDApCisgICAgewkJCQkvKiBjYWxsZWQgZnJvbSBtZF9hc3NlbWJsZSAqLworICAgICAgZm9yIChsaW5lcHRyID0gbGluZTsgKCpsaW5lcHRyKSAhPSAnXDAnICYmICgqbGluZXB0cikgIT0gJyAnOyBsaW5lcHRyKyspOworICAgICAgYyA9ICpsaW5lcHRyOworICAgICAgKmxpbmVwdHIgPSAnXDAnOworICAgICAgaWYgKCEoZGVzYyA9IChzdHJ1Y3QgbnMzMmtfb3Bjb2RlICopIGhhc2hfZmluZCAoaW5zdF9oYXNoX2hhbmRsZSwgbGluZSkpKQorCXsKKwkgIGFzX2ZhdGFsIChfKCJObyBzdWNoIG9wY29kZSIpKTsKKwl9CisgICAgICAqbGluZXB0ciA9IGM7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGluZXB0ciA9IGxpbmU7CisgICAgfQorICBhcmdjID0gMDsKKyAgaWYgKCpkZXNjLT5vcGVyYW5kcykKKyAgICB7CisgICAgICBpZiAoKmxpbmVwdHIrKyAhPSAnXDAnKQorCXsKKwkgIHNxciA9ICdbJzsKKwkgIHNlcCA9ICcsJzsKKwkgIHdoaWxlICgqbGluZXB0ciAhPSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKGRlc2MtPm9wZXJhbmRzW2FyZ2MgPDwgMV0pCisJCXsKKwkJICBzdWZmaXhbYXJnY10gPSAwOworCQkgIGFyZ190eXBlID0gZGVzYy0+b3BlcmFuZHNbKGFyZ2MgPDwgMSkgKyAxXTsKKwkJICBzd2l0Y2ggKGFyZ190eXBlKQorCQkgICAgeworCQkgICAgY2FzZSAnZCc6CisJCSAgICBjYXNlICdiJzoKKwkJICAgIGNhc2UgJ3AnOgorCQkgICAgY2FzZSAnSCc6CS8qIHRoZSBvcGVyYW5kIGlzIHN1cHBvc2VkIHRvIGJlIGEKKwkJCQkgICBkaXNwbGFjZW1lbnQgKi8KKwkJICAgICAgLyogSGFja3dhcm5pbmc6IGRvIG5vdCBmb3JnZXQgdG8gdXBkYXRlIHRoZSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZXMgYWJvdmUgd2hlbiBlZGl0aW5nIG5zMzJrLW9wY29kZS5oICovCisJCSAgICAgIHN1ZmZpeF9zZXBhcmF0b3IgPSAnOic7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgc3VmZml4X3NlcGFyYXRvciA9ICdcMjU1JzsgLyogaWYgdGhpcyBjaGFyIG9jY3VycyB3ZQorCQkJCQkJICAgIGxvb3NlICovCisJCSAgICB9CisJCSAgc3VmZml4W2FyZ2NdID0gMDsgLyogMCB3aGVuIG5vICc6JyBpcyBlbmNvdW50ZXJlZCAqLworCQkgIGFyZ3ZbYXJnY10gPSBmcmVlcHRyOworCQkgICpmcmVlcHRyID0gJ1wwJzsKKwkJICB3aGlsZSAoKGMgPSAqbGluZXB0cikgIT0gJ1wwJyAmJiBjICE9IHNlcCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGMgPT0gc3FyKQorCQkJeworCQkJICBpZiAoc3FyID09ICdbJykKKwkJCSAgICB7CisJCQkgICAgICBzcXIgPSAnXSc7CisJCQkgICAgICBzZXAgPSAnXDAnOworCQkJICAgIH0KKwkJCSAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgIHNxciA9ICdbJzsKKwkJCSAgICAgIHNlcCA9ICcsJzsKKwkJCSAgICB9CisJCQl9CisJCSAgICAgIGlmIChjID09IHN1ZmZpeF9zZXBhcmF0b3IpCisJCQl7CS8qICc6JyAtIGxhYmVsL3N1ZmZpeCBzZXBhcmF0b3IgKi8KKwkJCSAgc3dpdGNoIChsaW5lcHRyWzFdKQorCQkJICAgIHsKKwkJCSAgICBjYXNlICdiJzoKKwkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDE7CisJCQkgICAgICBicmVhazsKKwkJCSAgICBjYXNlICd3JzoKKwkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDI7CisJCQkgICAgICBicmVhazsKKwkJCSAgICBjYXNlICdkJzoKKwkJCSAgICAgIHN1ZmZpeFthcmdjXSA9IDQ7CisJCQkgICAgICBicmVhazsKKwkJCSAgICBkZWZhdWx0OgorCQkJICAgICAgYXNfd2FybiAoXygiQmFkIHN1ZmZpeCwgZGVmYXVsdGluZyB0byBkIikpOworCQkJICAgICAgc3VmZml4W2FyZ2NdID0gNDsKKwkJCSAgICAgIGlmIChsaW5lcHRyWzFdID09ICdcMCcgfHwgbGluZXB0clsxXSA9PSBzZXApCisJCQkJeworCQkJCSAgbGluZXB0ciArPSAxOworCQkJCSAgY29udGludWU7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgbGluZXB0ciArPSAyOworCQkJICBjb250aW51ZTsKKwkJCX0KKwkJICAgICAgKmZyZWVwdHIrKyA9IGM7CisJCSAgICAgIGxpbmVwdHIrKzsKKwkJICAgIH0KKwkJICAqZnJlZXB0cisrID0gJ1wwJzsKKwkJICBhcmdjICs9IDE7CisJCSAgaWYgKCpsaW5lcHRyID09ICdcMCcpCisJCSAgICBjb250aW51ZTsKKwkJICBsaW5lcHRyICs9IDE7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhc19mYXRhbCAoXygiVG9vIG1hbnkgb3BlcmFuZHMgcGFzc2VkIHRvIGluc3RydWN0aW9uIikpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBpZiAoYXJnYyAhPSBzdHJsZW4gKGRlc2MtPm9wZXJhbmRzKSAvIDIpCisgICAgeworICAgICAgaWYgKHN0cmxlbiAoZGVzYy0+ZGVmYXVsdF9hcmdzKSkKKwl7CQkJLyogd2UgY2FuIGFwcGx5IGRlZmF1bHQsIGRvbnQgZ29vZiAqLworCSAgaWYgKHBhcnNlIChkZXNjLT5kZWZhdWx0X2FyZ3MsIDEpICE9IDEpCisJICAgIHsJCQkvKiBjaGVjayBlcnJvciBpbiBkZWZhdWx0ICovCisJICAgICAgYXNfZmF0YWwgKF8oIldyb25nIG51bWJlcnMgb2Ygb3BlcmFuZHMgaW4gZGVmYXVsdCwgY2hlY2sgbnMzMmstb3Bjb2Rlcy5oIikpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFzX2ZhdGFsIChfKCJXcm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMiKSk7CisJfQorCisgICAgfQorICBmb3IgKGkgPSAwOyBpIDwgSUlGX0VOVFJJRVM7IGkrKykKKyAgICB7CisgICAgICBpaWYuaWlmUFtpXS50eXBlID0gMDsJLyogbWFyayBhbGwgZW50cmllcyBhcyB2b2lkKi8KKyAgICB9CisKKyAgLyogYnVpbGQgb3Bjb2RlIGlpZi1lbnRyeSAqLworICBpaWYuaW5zdHJfc2l6ZSA9IGRlc2MtPm9wY29kZV9zaXplIC8gODsKKyAgSUlGICgxLCAxLCBpaWYuaW5zdHJfc2l6ZSwgZGVzYy0+b3Bjb2RlX3NlZWQsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwKTsKKworICAvKiB0aGlzIGNhbGwgZW5jb2RlcyBvcGVyYW5kcyB0byBpaWYgZm9ybWF0ICovCisgIGlmIChhcmdjKQorICAgIHsKKyAgICAgIGVuY29kZV9vcGVyYW5kIChhcmdjLAorCQkgICAgICBhcmd2LAorCQkgICAgICAmZGVzYy0+b3BlcmFuZHNbMF0sCisJCSAgICAgICZzdWZmaXhbMF0sCisJCSAgICAgIGRlc2MtPmltX3NpemUsCisJCSAgICAgIGRlc2MtPm9wY29kZV9zaXplKTsKKyAgICB9CisgIHJldHVybiByZWN1cnNpdmVfbGV2ZWw7Cit9CisMCisKKy8qIENvbnZlcnQgaWlmIHRvIGZyYWdtZW50cy4gIEZyb20gdGhpcyBwb2ludCB3ZSBzdGFydCB0byBkcmliYmxlIHdpdGgKKyAqIGZ1bmN0aW9ucyBpbiBvdGhlciBmaWxlcyB0aGFuIHRoaXMgb25lLihFeGNlcHQgaGFzaC5jKSBTbywgaWYgaXQncworICogcG9zc2libGUgdG8gbWFrZSBhbiBpaWYgZm9yIGFuIG90aGVyIENQVSwgeW91IGRvbid0IG5lZWQgdG8ga25vdworICogd2hhdCBmcmFncywgcmVsYXgsIG9ic3RhY2tzLCBldGMgaXMgaW4gb3JkZXIgdG8gcG9ydCB0aGlzCisgKiBhc3NlbWJsZXIuIFlvdSBvbmx5IG5lZWQgdG8ga25vdyBpZiBpdCdzIHBvc3NpYmxlIHRvIHJlZHVjZSB5b3VyCisgKiBjcHUtaW5zdHJ1Y3Rpb24gdG8gaWlmLWZvcm1hdCAodGFrZXMgc29tZSB3b3JrKSBhbmQgYWRvcHQgdGhlIG90aGVyCisgKiBtZF8/IHBhcnRzIGFjY29yZGluZyB0byBnaXZlbiBpbnN0cnVjdGlvbnMgTm90ZSB0aGF0IGlpZiB3YXMKKyAqIGludmVudGVkIGZvciB0aGUgY2xlYW4gbnMzMmtgcyBhcmNoaXRlY3VyZS4KKyAqLworCisvKiBHQVMgZm9yIHRoZSBuczMyayBoYXMgYSBwcm9ibGVtLiBQQyByZWxhdGl2ZSBkaXNwbGFjZW1lbnRzIGFyZQorICogcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9wY29kZSwgbm90IHRoZSBhZGRyZXNzIG9mIHRoZQorICogb3BlcmFuZC4gV2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgb3BlcmFuZAorICogYW5kIHRoZSBvcGNvZGUgaW4gcGNyZWxfYWRqdXN0IGZvciBlYWNoIGZyYWcgYW5kIGVhY2ggZml4LiBIb3dldmVyLAorICogd2UgZ2V0IGludG8gdHJvdWJsZSB3aGVyZSB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgcGMtcmVsYXRpdmUKKyAqIG9wZXJhbmRzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3Qgb25lIGNhbid0IGJlIGRldGVybWluZWQuIFRoZW4gaW4KKyAqIHRoZSByZWxheCBwaGFzZSwgdGhlIHNpemUgb2YgdGhlIGZpcnN0IG9wZXJhbmQgd2lsbCBjaGFuZ2UgYW5kCisgKiBwY3JlbF9hZGp1c3Qgd2lsbCBubyBsb25nZXIgYmUgY29ycmVjdC4gIFRoZSBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiBrZWVwIGEgcG9pbnRlciB0byB0aGUgZnJhZyB3aXRoIHRoZSBvcGNvZGUgaW4gaXQgYW5kIHRoZSBvZmZzZXQgaW4KKyAqIHRoYXQgZnJhZyBmb3IgZWFjaCBmcmFnIGFuZCBlYWNoIGZpeC4gVGhlbiwgd2hlbiBuZWVkZWQsIHdlIGNhbgorICogYWx3YXlzIGZpZ3VyZSBvdXQgaG93IGZhciBpdCBpcyBiZXR3ZWVuIHRoZSBvcGNvZGUgYW5kIHRoZSBwY3JlbAorICogb2JqZWN0LiAgU2VlIGFsc28gbWRfcGNyZWxfYWRqdXN0IGFuZCBtZF9maXhfcGNyZWxfYWRqdXN0LiAgRm9yCisgKiBvYmplY3RzIG5vdCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uLCB0aGUgcG9pbnRlciB0byB0aGUgb3Bjb2RlIGZyYWcKKyAqIGlzIGFsd2F5cyB6ZXJvLiAgKi8KKwordm9pZAorY29udmVydF9paWYgKCkKK3sKKyAgaW50IGk7CisgIGJpdF9maXhTICpqOworICBmcmFnUyAqaW5zdF9mcmFnOworICB1bnNpZ25lZCBpbnQgaW5zdF9vZmZzZXQ7CisgIGNoYXIgKmluc3Rfb3Bjb2RlOworICBjaGFyICptZW1QOworICBpbnQgbDsKKyAgaW50IGs7CisgIGNoYXIgdHlwZTsKKyAgY2hhciBzaXplID0gMDsKKyAgaW50IHNpemVfc29fZmFyOworCisgIG1lbVAgPSBmcmFnX21vcmUgKDApOworICBpbnN0X29wY29kZSA9IG1lbVA7CisgIGluc3Rfb2Zmc2V0ID0gKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7CisgIGluc3RfZnJhZyA9IGZyYWdfbm93OworCisgIGZvciAoaSA9IDA7IGkgPCBJSUZfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICh0eXBlID0gaWlmLmlpZlBbaV0udHlwZSkKKwl7CQkJLyogdGhlIG9iamVjdCBleGlzdCwgc28gaGFuZGxlIGl0ICovCisJICBzd2l0Y2ggKHNpemUgPSBpaWYuaWlmUFtpXS5zaXplKQorCSAgICB7CisJICAgIGNhc2UgNDI6CisJICAgICAgc2l6ZSA9IDA7CQkvKiBpdCdzIGEgYml0Zml4IHRoYXQgb3BlcmF0ZXMgb24gYW4gZXhpc3RpbmcKKwkJCQkgICBvYmplY3QqLworCSAgICAgIGlmIChpaWYuaWlmUFtpXS5iaXRfZml4UC0+ZnhfYml0X2Jhc2UpCisJCXsJCS8qIGV4cGFuZCBmeF9iaXRfYmFzZSB0byBwb2ludCBhdCBvcGNvZGUgKi8KKwkJICBpaWYuaWlmUFtpXS5iaXRfZml4UC0+ZnhfYml0X2Jhc2UgPSAobG9uZykgaW5zdF9vcGNvZGU7CisJCX0KKwkgICAgY2FzZSA4OgkJLyogYmlnbnVtIG9yIGRvdWJsZWZsb2F0ICovCisJICAgIGNhc2UgMToKKwkgICAgY2FzZSAyOgorCSAgICBjYXNlIDM6CisJICAgIGNhc2UgNDoJCS8qIHRoZSBmaW5hbCBzaXplIGluIG9iamVjdG1lbW9yeSBpcyBrbm93biAqLworCSAgICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7CisJICAgICAgaiA9IGlpZi5paWZQW2ldLmJpdF9maXhQOworCSAgICAgIHN3aXRjaCAodHlwZSkKKwkJeworCQljYXNlIDE6CS8qIHRoZSBvYmplY3QgaXMgcHVyZSBiaW5hcnkgKi8KKwkJICBpZiAoaiB8fCBpaWYuaWlmUFtpXS5wY3JlbCkKKwkJICAgIHsKKwkJICAgICAgZml4X25ld19uczMyayAoZnJhZ19ub3csCisJCQkJICAgICAobG9uZykgKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCisJCQkJICAgICBzaXplLAorCQkJCSAgICAgMCwKKwkJCQkgICAgIGlpZi5paWZQW2ldLm9iamVjdCwKKwkJCQkgICAgIGlpZi5paWZQW2ldLnBjcmVsLAorCQkJCSAgICAgaWlmLmlpZlBbaV0uaW1fZGlzcCwKKwkJCQkgICAgIGosCisJCQkJICAgICBpaWYuaWlmUFtpXS5ic3IsCS8qIHNlcXVlbnQgaGFjayAqLworCQkJCSAgICAgaW5zdF9mcmFnLCBpbnN0X29mZnNldCk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgewkJLyogZ29vZCwganVzdCBwdXQgdGhlbSBieXRlcyBvdXQgKi8KKwkJICAgICAgc3dpdGNoIChpaWYuaWlmUFtpXS5pbV9kaXNwKQorCQkJeworCQkJY2FzZSAwOgorCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKG1lbVAsIGlpZi5paWZQW2ldLm9iamVjdCwgc2l6ZSk7CisJCQkgIGJyZWFrOworCQkJY2FzZSAxOgorCQkJICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgaWlmLmlpZlBbaV0ub2JqZWN0LCBzaXplKTsKKwkJCSAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICBhc19mYXRhbCAoXygiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvYmluYXJ5IikpOworCQkJfQorCQkgICAgfQorCQkgIGJyZWFrOworCQljYXNlIDI6CisJCSAgLyogdGhlIG9iamVjdCBpcyBhIHBvaW50ZXIgYXQgYW4gZXhwcmVzc2lvbiwgc28KKyAgICAgICAgICAgICAgICAgICAgIHVucGFjayBpdCwgbm90ZSB0aGF0IGJpZ251bXMgbWF5IHJlc3VsdCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiAqLworCQkgIGV2YWx1YXRlX2V4cHIgKCZleHByUCwgKGNoYXIgKikgaWlmLmlpZlBbaV0ub2JqZWN0KTsKKwkJICBpZiAoZXhwclAuWF9vcCA9PSBPX2JpZyB8fCBzaXplID09IDgpCisJCSAgICB7CisJCSAgICAgIGlmICgoayA9IGV4cHJQLlhfYWRkX251bWJlcikgPiAwKQorCQkJeworCQkJICAvKiB3ZSBoYXZlIGEgYmlnbnVtIGllIGEgcXVhZC4gVGhpcyBjYW4gb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW5zIGluIGEgbG9uZyBzdWZmaXhlZCBpbnN0cnVjdGlvbiAqLworCQkJICBpZiAoayAqIDIgPiBzaXplKQorCQkJICAgIGFzX3dhcm4gKF8oIkJpZ251bSB0b28gYmlnIGZvciBsb25nIikpOworCQkJICBpZiAoayA9PSAzKQorCQkJICAgIG1lbVAgKz0gMjsKKwkJCSAgZm9yIChsID0gMDsgayA+IDA7IGstLSwgbCArPSAyKQorCQkJICAgIHsKKwkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAobWVtUCArIGwsCisJCQkJCQkgIGdlbmVyaWNfYmlnbnVtW2wgPj4gMV0sCisJCQkJCQkgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsJLyogZmxvbnVtICovCisJCQkgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOworCisJCQkgIHN3aXRjaCAoc2l6ZSkKKwkJCSAgICB7CisJCQkgICAgY2FzZSA0OgorCQkJICAgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgMiwgOCk7CisJCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QLCAobG9uZykgd29yZHNbMF0sCisJCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisJCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QICsgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSksCisJCQkJCQkobG9uZykgd29yZHNbMV0sCisJCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisJCQkgICAgICBicmVhazsKKwkJCSAgICBjYXNlIDg6CisJCQkgICAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCA0LCAxMSk7CisJCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QLCAobG9uZykgd29yZHNbMF0sCisJCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisJCQkgICAgICBtZF9udW1iZXJfdG9faW1tIChtZW1QICsgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSksCisJCQkJCQkobG9uZykgd29yZHNbMV0sCisJCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisJCQkgICAgICBtZF9udW1iZXJfdG9faW1tICgobWVtUCArIDIKKwkJCQkJCSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSwKKwkJCQkJCShsb25nKSB3b3Jkc1syXSwKKwkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKwkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKChtZW1QICsgMworCQkJCQkJICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpLAorCQkJCQkJKGxvbmcpIHdvcmRzWzNdLAorCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBpZiAoaiB8fAorCQkgICAgICBleHByUC5YX2FkZF9zeW1ib2wgfHwKKwkJICAgICAgZXhwclAuWF9vcF9zeW1ib2wgfHwKKwkJICAgICAgaWlmLmlpZlBbaV0ucGNyZWwpCisJCSAgICB7CisJCSAgICAgIC8qIFRoZSBleHByZXNzaW9uIHdhcyB1bmRlZmluZWQgZHVlIHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGxhYmVsLiBDcmVhdGUgYSBmaXggc28gd2UgY2FuIGZpeAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvYmplY3QgbGF0ZXIuICovCisJCSAgICAgIGV4cHJQLlhfYWRkX251bWJlciArPSBpaWYuaWlmUFtpXS5vYmplY3RfYWRqdXN0OworCQkgICAgICBmaXhfbmV3X25zMzJrX2V4cCAoZnJhZ19ub3csCisJCQkJCSAobG9uZykgKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCisJCQkJCSBzaXplLAorCQkJCQkgJmV4cHJQLAorCQkJCQkgaWlmLmlpZlBbaV0ucGNyZWwsCisJCQkJCSBpaWYuaWlmUFtpXS5pbV9kaXNwLAorCQkJCQkgaiwKKwkJCQkJIGlpZi5paWZQW2ldLmJzciwKKwkJCQkJIGluc3RfZnJhZywgaW5zdF9vZmZzZXQpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogZ29vZCwganVzdCBwdXQgdGhlbSBieXRlcyBvdXQgKi8KKwkJICAgICAgc3dpdGNoIChpaWYuaWlmUFtpXS5pbV9kaXNwKQorCQkJeworCQkJY2FzZSAwOgorCQkJICBtZF9udW1iZXJfdG9faW1tIChtZW1QLCBleHByUC5YX2FkZF9udW1iZXIsIHNpemUpOworCQkJICBicmVhazsKKwkJCWNhc2UgMToKKwkJCSAgbWRfbnVtYmVyX3RvX2Rpc3AgKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7CisJCQkgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgYXNfZmF0YWwgKF8oImlpZiBjb252ZXJ0IGludGVybmFsIHBjcmVsL3BvaW50ZXIiKSk7CisJCQl9CisJCSAgICB9CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yIGluIGlpZi5paWZQW25dLnR5cGUiKSk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAwOgorCSAgICAgIC8qIFRvIGJhZCwgdGhlIG9iamVjdCBtYXkgYmUgdW5kZWZpbmVkIGFzIGZhciBhcyBpdHMKKwkJIGZpbmFsIG5zaXplIGluIG9iamVjdCBtZW1vcnkgaXMgY29uY2VybmVkLiAgVGhlIHNpemUKKwkJIG9mIHRoZSBvYmplY3QgaW4gb2JqZWN0bWVtb3J5IGlzIG5vdCBleHBsaWNpdGx5CisJCSBnaXZlbi4gIElmIHRoZSBvYmplY3QgaXMgZGVmaW5lZCBpdHMgbGVuZ3RoIGNhbiBiZQorCQkgZGV0ZXJtaW5lZCBhbmQgYSBmaXggY2FuIHJlcGxhY2UgdGhlIGZyYWcuICovCisJICAgICAgeworCQlldmFsdWF0ZV9leHByICgmZXhwclAsIChjaGFyICopIGlpZi5paWZQW2ldLm9iamVjdCk7CisJCWlmICgoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKSAmJgorCQkgICAgIWlpZi5paWZQW2ldLnBjcmVsKQorCQkgIHsKKwkJICAgIC8qIFNpemUgaXMgdW5rbm93biB1bnRpbCBsaW5rIHRpbWUgc28gaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyA0IGJ5dGVzLiAqLworCQkgICAgc2l6ZSA9IDQ7CisJCSAgICBtZW1QID0gZnJhZ19tb3JlKHNpemUpOworCQkgICAgZml4X25ld19uczMya19leHAgKGZyYWdfbm93LAorCQkJCSAgICAgICAobG9uZykgKG1lbVAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCksCisJCQkJICAgICAgIHNpemUsCisJCQkJICAgICAgICZleHByUCwKKwkJCQkgICAgICAgMCwgLyogbmV2ZXIgaWlmLmlpZlBbaV0ucGNyZWwsICovCisJCQkJICAgICAgIDEsIC8qIGFsd2F5cyBpaWYuaWlmUFtpXS5pbV9kaXNwICovCisJCQkJICAgICAgIChiaXRfZml4UyAqKSAwLCAwLAorCQkJCSAgICAgICBpbnN0X2ZyYWcsCisJCQkJICAgICAgIGluc3Rfb2Zmc2V0KTsKKwkJICAgIGJyZWFrOwkJLyogZXhpdCB0aGlzIGFic29sdXRlIGhhY2sgKi8KKwkJICB9CisKKwkJaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKKwkJICB7CQkJLyogZnJhZyBpdCAqLworCQkgICAgaWYgKGV4cHJQLlhfb3Bfc3ltYm9sKQorCQkgICAgICB7CQkJLyogV2UgY2FudCByZWxheCB0aGlzIGNhc2UgKi8KKwkJCWFzX2ZhdGFsIChfKCJDYW4ndCByZWxheCBkaWZmZXJlbmNlIikpOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKworCQkJLyogU2l6ZSBpcyBub3QgaW1wb3J0YW50LiBUaGlzIGdldHMgZml4ZWQgYnkgcmVsYXgsCisJCQkgKiBidXQgd2UgYXNzdW1lIDAgaW4gd2hhdCBmb2xsb3dzCisJCQkgKi8KKwkJCW1lbVAgPSBmcmFnX21vcmUoNCk7IC8qIE1heCBzaXplICovCisJCQlzaXplID0gMDsKKworCQkJeworCQkJICBmcmFnUyAqb2xkX2ZyYWcgPSBmcmFnX25vdzsKKwkJCSAgZnJhZ192YXJpYW50IChyc19tYWNoaW5lX2RlcGVuZGVudCwKKwkJCQkJNCwgLyogTWF4IHNpemUgKi8KKwkJCQkJMCwgLyogc2l6ZSAqLworCQkJCQlJTkQgKEJSQU5DSCwgVU5ERUYpLCAvKiBleHBlY3RpbmcgdGhlIHdvcnN0ICovCisJCQkJCWV4cHJQLlhfYWRkX3N5bWJvbCwKKwkJCQkJZXhwclAuWF9hZGRfbnVtYmVyLAorCQkJCQlpbnN0X29wY29kZSk7CisJCQkgIGZyYWdfb3Bjb2RlX2ZyYWcob2xkX2ZyYWcpID0gaW5zdF9mcmFnOworCQkJICBmcmFnX29wY29kZV9vZmZzZXQob2xkX2ZyYWcpID0gaW5zdF9vZmZzZXQ7CisJCQkgIGZyYWdfYnNyKG9sZF9mcmFnKSA9IGlpZi5paWZQW2ldLmJzcjsKKwkJCX0KKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIC8qIFRoaXMgZHVwbGljYXRlcyBjb2RlIGluIG1kX251bWJlcl90b19kaXNwICovCisJCSAgICBpZiAoLTY0IDw9IGV4cHJQLlhfYWRkX251bWJlciAmJiBleHByUC5YX2FkZF9udW1iZXIgPD0gNjMpCisJCSAgICAgIHsKKwkJCXNpemUgPSAxOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCWlmICgtODE5MiA8PSBleHByUC5YX2FkZF9udW1iZXIKKwkJCSAgICAmJiBleHByUC5YX2FkZF9udW1iZXIgPD0gODE5MSkKKwkJCSAgeworCQkJICAgIHNpemUgPSAyOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBpZiAoLTB4MjAwMDAwMDA8PWV4cHJQLlhfYWRkX251bWJlciAmJgorCQkJCWV4cHJQLlhfYWRkX251bWJlcjw9MHgxZmZmZmZmZikKKwkJCSAgICAgIHsKKwkJCQlzaXplID0gNDsKKwkJCSAgICAgIH0KKwkJCSAgICBlbHNlCisJCQkgICAgICB7CisJCQkJYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IHRvIGxhcmdlIGZvciA6ZCIpKTsKKwkJCQlzaXplID0gNDsKKwkJCSAgICAgIH0KKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBtZW1QID0gZnJhZ19tb3JlKHNpemUpOworCQkgICAgbWRfbnVtYmVyX3RvX2Rpc3AgKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbXS50eXBlIikpOworCSAgICB9CisJfQorICAgIH0KK30KKwwKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisvKiBUaGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIHJlYWxseSBiZSBpbiB0aGUgYmZkIGxpYnJhcnkgKi8KK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKK3JlbG9jIChpbnQgc2l6ZSwgaW50IHBjcmVsLCBpbnQgdHlwZSkKK3sKKyAgaW50IGxlbmd0aCwgaW5kZXg7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY3NbXSA9IHsKKyAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzgsCisgICAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwKKyAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyLAorICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwKKyAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLAorICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsCisKKyAgICAvKiBuczMyayBkaXNwbGFjZW1lbnRzICovCisgICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwKKyAgICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwKKyAgICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwKKyAgICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLAorICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLAorICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyX1BDUkVMLAorCisgICAgLyogTm9ybWFsIDIncyBjb21wbGVtZW50ICovCisgICAgQkZEX1JFTE9DXzgsCisgICAgQkZEX1JFTE9DXzE2LAorICAgIEJGRF9SRUxPQ18zMiwKKyAgICBCRkRfUkVMT0NfOF9QQ1JFTCwKKyAgICBCRkRfUkVMT0NfMTZfUENSRUwsCisgICAgQkZEX1JFTE9DXzMyX1BDUkVMCisgICAgfTsKKyAgc3dpdGNoIChzaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBsZW5ndGggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGVuZ3RoID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGxlbmd0aCA9IDI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbGVuZ3RoID0gLTE7CisgICAgICBicmVhazsKKyAgICB9CisgIGluZGV4ID0gbGVuZ3RoICsgMyAqIHBjcmVsICsgNiAqIHR5cGU7CisgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZW9mKHJlbG9jcykvc2l6ZW9mKHJlbG9jc1swXSkpCisgICAgcmV0dXJuIHJlbG9jc1tpbmRleF07CisgIGlmIChwY3JlbCkKKyAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiKSwKKwkgICAgc2l6ZSwgdHlwZSk7CisgIGVsc2UKKyAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiKSwKKwkgICAgc2l6ZSwgdHlwZSk7CisgIHJldHVybiBCRkRfUkVMT0NfTk9ORTsKKworfQorCisjZW5kaWYKKwordm9pZAorbWRfYXNzZW1ibGUgKGxpbmUpCisgICAgIGNoYXIgKmxpbmU7Cit7CisgIGZyZWVwdHIgPSBmcmVlcHRyX3N0YXRpYzsKKyAgcGFyc2UgKGxpbmUsIDApOwkJLyogZXhwbG9kZSBsaW5lIHRvIG1vcmUgZml4IGZvcm0gaW4gaWlmICovCisgIGNvbnZlcnRfaWlmICgpOwkJLyogY29udmVydCBpaWYgdG8gZnJhZ3MsIGZpeCdzIGV0YyAqLworI2lmZGVmIFNIT1dfTlVNCisgIHByaW50ZiAoIiBcdFx0XHQlc1xuIiwgbGluZSk7CisjZW5kaWYKK30KKworCit2b2lkCittZF9iZWdpbiAoKQoreworICAvKiBidWlsZCBhIGhhc2h0YWJsZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zICovCisgIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgKnB0cjsKKyAgY29uc3QgY2hhciAqc3RhdDsKKyAgaW5zdF9oYXNoX2hhbmRsZSA9IGhhc2hfbmV3ICgpOworICBmb3IgKHB0ciA9IG5zMzJrX29wY29kZXM7IHB0ciA8IGVuZG9wOyBwdHIrKykKKyAgICB7CisgICAgICBpZiAoKHN0YXQgPSBoYXNoX2luc2VydCAoaW5zdF9oYXNoX2hhbmRsZSwgcHRyLT5uYW1lLCAoY2hhciAqKSBwdHIpKSkKKwl7CisJICBhc19mYXRhbCAoXygiQ2FuJ3QgaGFzaCAlczogJXMiKSwgcHRyLT5uYW1lLCBzdGF0KTsJLypmYXRhbCovCisJfQorICAgIH0KKyAgZnJlZXB0cl9zdGF0aWMgPSAoY2hhciAqKSBtYWxsb2MgKFBSSVZBVEVfU0laRSk7IC8qIHNvbWUgcHJpdmF0ZSBzcGFjZQorCQkJCQkJICAgICAgcGxlYXNlISAqLworfQorCisvKiBNdXN0IGJlIGVxdWFsIHRvIE1BWF9QUkVDSVNPTiBpbiBhdG9mLWllZWUuYyAqLworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKKy8qIFR1cm4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IGxpdFAgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisgICBvZiB0eXBlIHR5cGUsIGFuZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBieXRlcy4gIFRoZSBudW1iZXIgb2YKKyAgIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKKyAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKKyAgTElUVExFTlVNX1RZUEUgKndvcmRQOworICBjaGFyICp0OworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOworICAgIH0KKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjOyBwcmVjLS07KQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqLS13b3JkUCksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKwwKKy8qIENvbnZlcnQgbnVtYmVyIHRvIGNoYXJzIGluIGNvcnJlY3Qgb3JkZXIgKi8KKwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuYnl0ZXMpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbHVlOworICAgICBpbnQgbmJ5dGVzOworeworICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbHVlLCBuYnl0ZXMpOworfQorCisKKy8qIFRoaXMgaXMgYSB2YXJpYW50IG9mIG1kX251bWJlcnNfdG9fY2hhcnMuIFRoZSByZWFzb24gZm9yIGl0cycKKyAgIGV4aXN0ZW5jZSBpcyB0aGUgZmFjdCB0aGF0IG5zMzJrIHVzZXMgSHVmZm1hbiBjb2RlZAorICAgZGlzcGxhY2VtZW50cy4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGJpdCBvcmRlciBpcyByZXZlcnNlZCBpbgorICAgZGlzcGxhY2VtZW50cyBhbmQgdGhhdCB0aGV5IGFyZSBwcmVmaXhlZCB3aXRoIGEgc2l6ZS10YWcuCisKKyAgIGJpbmFyeTogbXNiIC0+IGxzYgorICAgMHh4eHh4eHgJCQkJYnl0ZQorICAgMTB4eHh4eHggeHh4eHh4eHgJCQl3b3JkCisgICAxMXh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eAlkb3VibGUgd29yZAorCisgICBUaGlzIG11c3QgYmUgdGFrZW4gY2FyZSBvZiBhbmQgd2UgZG8gaXQgaGVyZSEgICovCitzdGF0aWMgdm9pZAorbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQorICAgICBjaGFyICpidWY7CisgICAgIGxvbmcgdmFsOworICAgICBjaGFyIG47Cit7CisgIHN3aXRjaCAobikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKHZhbCA8IC02NCB8fCB2YWwgPiA2MykKKwlhc193YXJuIChfKCJCeXRlIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UuICBsaW5lIG51bWJlciBub3QgdmFsaWQiKSk7CisgICAgICB2YWwgJj0gMHg3ZjsKKyNpZmRlZiBTSE9XX05VTQorICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGlmICh2YWwgPCAtODE5MiB8fCB2YWwgPiA4MTkxKQorCWFzX3dhcm4gKF8oIldvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIpKTsKKyAgICAgIHZhbCAmPSAweDNmZmY7CisgICAgICB2YWwgfD0gMHg4MDAwOworI2lmZGVmIFNIT1dfTlVNCisgICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOworI2VuZGlmCisgICAgICAqYnVmKysgPSAodmFsID4+IDgpOworI2lmZGVmIFNIT1dfTlVNCisgICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKKyNlbmRpZgorICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgaWYgKHZhbCA8IC0weDIwMDAwMDAwIHx8IHZhbCA+PSAweDIwMDAwMDAwKQorCWFzX3dhcm4gKF8oIkRvdWJsZSB3b3JkIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICB2YWwgfD0gMHhjMDAwMDAwMDsKKyNpZmRlZiBTSE9XX05VTQorICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDI0ICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOworI2lmZGVmIFNIT1dfTlVNCisgICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMTYgJiAweGZmKTsKKyNlbmRpZgorICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7CisjaWZkZWYgU0hPV19OVU0KKyAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7CisjaWZkZWYgU0hPV19OVU0KKyAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOworI2VuZGlmCisgICAgICAqYnVmKysgPSB2YWw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yLiAgbGluZSAlcywgZmlsZSBcIiVzXCIiKSwKKwkJX19MSU5FX18sIF9fRklMRV9fKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbikKKyAgICAgY2hhciAqYnVmOworICAgICBsb25nIHZhbDsKKyAgICAgY2hhciBuOworeworICBzd2l0Y2ggKG4pCisgICAgeworICAgIGNhc2UgMToKKyNpZmRlZiBTSE9XX05VTQorICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyNpZmRlZiBTSE9XX05VTQorICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKKyNlbmRpZgorICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKKyNpZmRlZiBTSE9XX05VTQorICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyNpZmRlZiBTSE9XX05VTQorICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDI0ICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOworI2lmZGVmIFNIT1dfTlVNCisgICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMTYgJiAweGZmKTsKKyNlbmRpZgorICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7CisjaWZkZWYgU0hPV19OVU0KKyAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7CisjZW5kaWYKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7CisjaWZkZWYgU0hPV19OVU0KKyAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOworI2VuZGlmCisgICAgICAqYnVmKysgPSB2YWw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIGxvZ2ljIGVycm9yLiBsaW5lICVzLCBmaWxlIFwiJXNcIiIpLAorCQlfX0xJTkVfXywgX19GSUxFX18pOworICAgIH0KK30KKworCisvKiBmYXN0IGJpdGZpZGRsaW5nIHN1cHBvcnQgKi8KKy8qIG1hc2sgdXNlZCB0byB6ZXJvIGJpdGZpZWxkIGJlZm9yZSBvcmluZyBpbiB0aGUgdHJ1ZSBmaWVsZCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsX21hc2tbXSA9Cit7CisgIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmUsIDB4ZmZmZmZmZmMsIDB4ZmZmZmZmZjgsCisgIDB4ZmZmZmZmZjAsIDB4ZmZmZmZmZTAsIDB4ZmZmZmZmYzAsIDB4ZmZmZmZmODAsCisgIDB4ZmZmZmZmMDAsIDB4ZmZmZmZlMDAsIDB4ZmZmZmZjMDAsIDB4ZmZmZmY4MDAsCisgIDB4ZmZmZmYwMDAsIDB4ZmZmZmUwMDAsIDB4ZmZmZmMwMDAsIDB4ZmZmZjgwMDAsCisgIDB4ZmZmZjAwMDAsIDB4ZmZmZTAwMDAsIDB4ZmZmYzAwMDAsIDB4ZmZmODAwMDAsCisgIDB4ZmZmMDAwMDAsIDB4ZmZlMDAwMDAsIDB4ZmZjMDAwMDAsIDB4ZmY4MDAwMDAsCisgIDB4ZmYwMDAwMDAsIDB4ZmUwMDAwMDAsIDB4ZmMwMDAwMDAsIDB4ZjgwMDAwMDAsCisgIDB4ZjAwMDAwMDAsIDB4ZTAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsCit9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgcl9tYXNrW10gPQoreworICAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAzLCAweDAwMDAwMDA3LAorICAweDAwMDAwMDBmLCAweDAwMDAwMDFmLCAweDAwMDAwMDNmLCAweDAwMDAwMDdmLAorICAweDAwMDAwMGZmLCAweDAwMDAwMWZmLCAweDAwMDAwM2ZmLCAweDAwMDAwN2ZmLAorICAweDAwMDAwZmZmLCAweDAwMDAxZmZmLCAweDAwMDAzZmZmLCAweDAwMDA3ZmZmLAorICAweDAwMDBmZmZmLCAweDAwMDFmZmZmLCAweDAwMDNmZmZmLCAweDAwMDdmZmZmLAorICAweDAwMGZmZmZmLCAweDAwMWZmZmZmLCAweDAwM2ZmZmZmLCAweDAwN2ZmZmZmLAorICAweDAwZmZmZmZmLCAweDAxZmZmZmZmLCAweDAzZmZmZmZmLCAweDA3ZmZmZmZmLAorICAweDBmZmZmZmZmLCAweDFmZmZmZmZmLCAweDNmZmZmZmZmLCAweDdmZmZmZmZmLAorfTsKKyNkZWZpbmUgTUFTS19CSVRTIDMxCisvKiBJbnNlcnQgYml0ZmllbGQgZGVzY3JpYmVkIGJ5IGZpZWxkX3B0ciBhbmQgdmFsIGF0IGJ1ZgorICAgVGhpcyByb3V0aW5lIGlzIHdyaXR0ZW4gZm9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgZmlyc3QgNCBieXRlcyBwb2ludGVkCisgICB0byBieSBidWYsIHRvIHlpZWxkIHNwZWVkLgorICAgVGhlIGlmZGVmIHN0dWZmIGlzIGZvciBzZWxlY3Rpb24gYmV0d2VlbiBhIG5zMzJrLWRlcGVuZGVudCByb3V0aW5lCisgICBhbmQgYSBnZW5lcmFsIHZlcnNpb24uIChNeSBhZHZpY2U6IHVzZSB0aGUgZ2VuZXJhbCB2ZXJzaW9uISkKKyAgICovCisKK3N0YXRpYyB2b2lkCittZF9udW1iZXJfdG9fZmllbGQgKGJ1ZiwgdmFsLCBmaWVsZF9wdHIpCisgICAgIHJlZ2lzdGVyIGNoYXIgKmJ1ZjsKKyAgICAgcmVnaXN0ZXIgbG9uZyB2YWw7CisgICAgIHJlZ2lzdGVyIGJpdF9maXhTICpmaWVsZF9wdHI7Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgb2JqZWN0OworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1hc2s7CisgIC8qIGRlZmluZSBFTkRJQU4gb24gYSBuczMyayBtYWNoaW5lICovCisjaWZkZWYgRU5ESUFOCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKm1lbV9wdHI7CisjZWxzZQorICByZWdpc3RlciBjaGFyICptZW1fcHRyOworI2VuZGlmCisgIGlmIChmaWVsZF9wdHItPmZ4X2JpdF9taW4gPD0gdmFsICYmIHZhbCA8PSBmaWVsZF9wdHItPmZ4X2JpdF9tYXgpCisgICAgeworI2lmZGVmIEVORElBTgorICAgICAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2UpCisJewkJCS8qIG92ZXJyaWRlIGJ1ZiAqLworCSAgbWVtX3B0ciA9ICh1bnNpZ25lZCBsb25nICopIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1lbV9wdHIgPSAodW5zaWduZWQgbG9uZyAqKSBidWY7CisJfQorICAgICAgbWVtX3B0ciA9ICgodW5zaWduZWQgbG9uZyAqKQorCQkgKChjaGFyICopIG1lbV9wdHIgKyBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlX2FkaikpOworI2Vsc2UKKyAgICAgIGlmIChmaWVsZF9wdHItPmZ4X2JpdF9iYXNlKQorCXsJCQkvKiBvdmVycmlkZSBidWYgKi8KKwkgIG1lbV9wdHIgPSAoY2hhciAqKSBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtZW1fcHRyID0gYnVmOworCX0KKyAgICAgIG1lbV9wdHIgKz0gZmllbGRfcHRyLT5meF9iaXRfYmFzZV9hZGo7CisjZW5kaWYKKyNpZmRlZiBFTkRJQU4JCQkvKiB3ZSBoYXZlIGEgbmljZSBuczMyayBtYWNoaW5lIHdpdGggbG93Ynl0ZQorCQkJCSAgIGF0IGxvdy1waHlzaWNhbCBtZW0gKi8KKyAgICAgIG9iamVjdCA9ICptZW1fcHRyOwkvKiBnZXQgc29tZSBieXRlcyAqLworI2Vsc2UgLyogT1ZFIEdvb2YhIHRoZSBtYWNoaW5lIGlzIGEgbTY4ayBvciBkaXRvICovCisgICAgICAvKiBUaGF0IHRha2VzIG1vcmUgYnl0ZSBmaWRkbGluZyAqLworICAgICAgb2JqZWN0ID0gMDsKKyAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzNdICYgMHhmZjsKKyAgICAgIG9iamVjdCA8PD0gODsKKyAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzJdICYgMHhmZjsKKyAgICAgIG9iamVjdCA8PD0gODsKKyAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzFdICYgMHhmZjsKKyAgICAgIG9iamVjdCA8PD0gODsKKyAgICAgIG9iamVjdCB8PSBtZW1fcHRyWzBdICYgMHhmZjsKKyNlbmRpZgorICAgICAgbWFzayA9IDA7CisgICAgICBtYXNrIHw9IChyX21hc2tbZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0XSk7CisgICAgICBtYXNrIHw9IChsX21hc2tbZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0ICsgZmllbGRfcHRyLT5meF9iaXRfc2l6ZV0pOworICAgICAgb2JqZWN0ICY9IG1hc2s7CisgICAgICB2YWwgKz0gZmllbGRfcHRyLT5meF9iaXRfYWRkOworICAgICAgb2JqZWN0IHw9ICgodmFsIDw8IGZpZWxkX3B0ci0+ZnhfYml0X29mZnNldCkgJiAobWFzayBeIDB4ZmZmZmZmZmYpKTsKKyNpZmRlZiBFTkRJQU4KKyAgICAgICptZW1fcHRyID0gb2JqZWN0OworI2Vsc2UKKyAgICAgIG1lbV9wdHJbMF0gPSAoY2hhcikgb2JqZWN0OworICAgICAgb2JqZWN0ID4+PSA4OworICAgICAgbWVtX3B0clsxXSA9IChjaGFyKSBvYmplY3Q7CisgICAgICBvYmplY3QgPj49IDg7CisgICAgICBtZW1fcHRyWzJdID0gKGNoYXIpIG9iamVjdDsKKyAgICAgIG9iamVjdCA+Pj0gODsKKyAgICAgIG1lbV9wdHJbM10gPSAoY2hhcikgb2JqZWN0OworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfd2FybiAoXygiQml0IGZpZWxkIG91dCBvZiByYW5nZSIpKTsKKyAgICB9Cit9CisKK2ludCBtZF9wY3JlbF9hZGp1c3QgKGZyYWdTICpmcmFnUCkKK3sKKyAgZnJhZ1MgKm9wY29kZV9mcmFnOworICBhZGRyZXNzVCBvcGNvZGVfYWRkcmVzczsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgb3Bjb2RlX2ZyYWcgPSBmcmFnX29wY29kZV9mcmFnKGZyYWdQKTsKKyAgaWYgKG9wY29kZV9mcmFnID09IDApCisgICAgcmV0dXJuIDA7CisgIG9mZnNldCA9IGZyYWdfb3Bjb2RlX29mZnNldChmcmFnUCk7CisgIG9wY29kZV9hZGRyZXNzID0gb2Zmc2V0ICsgb3Bjb2RlX2ZyYWctPmZyX2FkZHJlc3M7CisgIHJldHVybiBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSBvcGNvZGVfYWRkcmVzczsKK30KKworaW50IG1kX2ZpeF9wY3JlbF9hZGp1c3QgKGZpeFMgKmZpeFApCit7CisgIGZyYWdTICpmcmFnUCA9IGZpeFAtPmZ4X2ZyYWc7CisgIGZyYWdTICpvcGNvZGVfZnJhZzsKKyAgYWRkcmVzc1Qgb3Bjb2RlX2FkZHJlc3M7CisgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgIG9wY29kZV9mcmFnID0gZml4X29wY29kZV9mcmFnKGZpeFApOworICBpZiAob3Bjb2RlX2ZyYWcgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgb2Zmc2V0ID0gZml4X29wY29kZV9vZmZzZXQoZml4UCk7CisgIG9wY29kZV9hZGRyZXNzID0gb2Zmc2V0ICsgb3Bjb2RlX2ZyYWctPmZyX2FkZHJlc3M7CisgIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBvcGNvZGVfYWRkcmVzczsKK30KKworLyogQXBwbHkgYSBmaXhTIChmaXh1cCBvZiBhbiBpbnN0cnVjdGlvbiBvciBkYXRhIHRoYXQgd2UgZGlkbid0IGhhdmUKKyAgIGVub3VnaCBpbmZvIHRvIGNvbXBsZXRlIGltbWVkaWF0ZWx5KSB0byB0aGUgZGF0YSBpbiBhIGZyYWcuCisKKyAgIE9uIHRoZSBuczMyaywgZXZlcnl0aGluZyBpcyBpbiBhIGRpZmZlcmVudCBmb3JtYXQsIHNvIHdlIGhhdmUgYnJva2VuCisgICBvdXQgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciBlYWNoIGtpbmQgb2YgdGhpbmcgd2UgY291bGQgYmUgZml4aW5nLgorICAgVGhleSBhbGwgZ2V0IGNhbGxlZCBmcm9tIGhlcmUuICAqLworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgoraW50CittZF9hcHBseV9maXggKGZpeFAsIHZhbHApCisgICAgIGZpeFMgKmZpeFA7CisgICAgIHZhbHVlVCAqdmFscDsKKyNlbHNlCit2b2lkCittZF9hcHBseV9maXggKGZpeFAsIHZhbCkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgbG9uZyB2YWw7CisjZW5kaWYKK3sKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIGxvbmcgdmFsID0gKnZhbHA7CisjZW5kaWYKKyAgZnJhZ1MgKmZyYWdQID0gZml4UC0+ZnhfZnJhZzsKKworICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7CisKKyAgaWYgKGZpeF9iaXRfZml4UChmaXhQKSkKKyAgICB7CQkJCS8qIEJpdGZpZWxkcyB0byBmaXgsIHNpZ2ggKi8KKyAgICAgIG1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpeF9iaXRfZml4UChmaXhQKSk7CisgICAgfQorICBlbHNlCisgICAgc3dpdGNoIChmaXhfaW1fZGlzcChmaXhQKSkKKyAgICAgIHsKKworICAgICAgY2FzZSAwOgkJCS8qIEltbWVkaWF0ZSBmaWVsZCAqLworCW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBmaXhQLT5meF9zaXplKTsKKwlicmVhazsKKworICAgICAgY2FzZSAxOgkJCS8qIERpc3BsYWNlbWVudCBmaWVsZCAqLworCS8qIENhbGN1bGF0ZSBvZmZzZXQgKi8KKwl7CisJbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwKKwkJCSAgIChmaXhQLT5meF9wY3JlbCA/IHZhbCArIG1kX2ZpeF9wY3JlbF9hZGp1c3QoZml4UCkKKwkJCSAgICA6IHZhbCksIGZpeFAtPmZ4X3NpemUpOworCX0KKwlicmVhazsKKworICAgICAgY2FzZSAyOgkJCS8qIFBvaW50ZXIgaW4gYSBkYXRhIG9iamVjdCAqLworCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOworCWJyZWFrOworICAgICAgfQorI2lmZGVmIEJTRF9BU1NFTUJMRVIKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKwwKKy8qIENvbnZlcnQgYSByZWxheGVkIGRpc3BsYWNlbWVudCB0byBkaXR0byBpbiBmaW5hbCBvdXRwdXQgKi8KKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlYywgZnJhZ1ApCisgICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOworICAgICBzZWdUIHNlYzsKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworI2Vsc2UKK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKKyAgICAgYmZkICphYmZkOworICAgICBzZWdUIHNlYzsKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworI2VuZGlmCit7CisgIGxvbmcgZGlzcDsKKyAgbG9uZyBleHQgPSAwOworCisgIC8qIEFkZHJlc3MgaW4gZ2FzIGNvcmUgb2YgdGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBkaXNwbGFjZW1lbnQuICAqLworICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbDsKKyAgLyogQWRkcmVzcyBpbiBvYmplY3QgY29kZSBvZiB0aGUgZGlzcGxhY2VtZW50LiAgKi8KKyAgaW50IG9iamVjdF9hZGRyZXNzOworCisgIGZyYWdTICpvcGNvZGVfZnJhZzsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIElORCAoQlJBTkNILCBCWVRFKToKKyAgICAgIGV4dCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElORCAoQlJBTkNILCBXT1JEKToKKyAgICAgIGV4dCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIElORCAoQlJBTkNILCBET1VCTEUpOgorICAgICAgZXh0ID0gNDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZihleHQgPT0gMCkKKyAgICByZXR1cm47CisKKyAga25vdyAoZnJhZ1AtPmZyX3N5bWJvbCk7CisKKyAgb2JqZWN0X2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7CisgIC8qIFRoZSBkaXNwbGFjZW1lbnQgb2YgdGhlIGFkZHJlc3MsIGZyb20gY3VycmVudCBsb2NhdGlvbi4gICovCisgIGRpc3AgPSAoU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldCkgLSBvYmplY3RfYWRkcmVzczsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIGRpc3AgKz0gZnJhZ1AtPmZyX3N5bWJvbC0+c3lfZnJhZy0+ZnJfYWRkcmVzczsKKyNlbmRpZgorICBkaXNwICs9IG1kX3BjcmVsX2FkanVzdChmcmFnUCk7CisKKyAgbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZmZlcl9hZGRyZXNzLCAobG9uZykgZGlzcCwgKGludCkgZXh0KTsKKyAgZnJhZ1AtPmZyX2ZpeCArPSBleHQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXN0aW1hdGVkIHNpemUgYSB2YXJpYWJsZSBvYmplY3Qgd2lsbCBvY2N1cHksCisgICBvbmUgY2FuIHNheSB0aGF0IHdlIHRyaWVzIHRvIGd1ZXNzIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIGJlZm9yZSB3ZQorICAgYWN0dWFsbHkga25vdyBpdCAqLworCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworICAgICBzZWdUIHNlZ21lbnQ7Cit7CisgIGludCBvbGRfZml4OworICBvbGRfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKKyAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKKyAgICB7CisgICAgY2FzZSBJTkQgKEJSQU5DSCwgVU5ERUYpOgorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCisJeworCSAgLyogdGhlIHN5bWJvbCBoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlICovCisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IElORCAoQlJBTkNILCBCWVRFKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogd2UgZG9uJ3QgcmVsYXggc3ltYm9scyBkZWZpbmVkIGluIGFuIG90aGVyIHNlZ21lbnQgdGhlCisJICAgICB0aGluZyB0byBkbyBpcyB0byBhc3N1bWUgdGhlIG9iamVjdCB3aWxsIG9jY3VweSA0IGJ5dGVzICovCisJICBmaXhfbmV3X25zMzJrIChmcmFnUCwKKwkJCSAoaW50KSAoZnJhZ1AtPmZyX2ZpeCksCisJCQkgNCwKKwkJCSBmcmFnUC0+ZnJfc3ltYm9sLAorCQkJIGZyYWdQLT5mcl9vZmZzZXQsCisJCQkgMSwKKwkJCSAxLAorCQkJIDAsCisJCQkgZnJhZ19ic3IoZnJhZ1ApLCAvKnNlcXVlbnQgaGFjayAqLworCQkJIGZyYWdfb3Bjb2RlX2ZyYWcoZnJhZ1ApLAorCQkJIGZyYWdfb3Bjb2RlX29mZnNldChmcmFnUCkpOworCSAgZnJhZ1AtPmZyX2ZpeCArPSA0OworCSAgLyogZnJhZ1AtPmZyX29wY29kZVsxXT0weGZmOyAqLworCSAgZnJhZ193YW5lIChmcmFnUCk7CisJICBicmVhazsKKwl9CisgICAgY2FzZSBJTkQgKEJSQU5DSCwgQllURSk6CisgICAgICBmcmFnUC0+ZnJfdmFyICs9IDE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZml4OworfQorCitpbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMzsKK2ludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDU7Citjb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KKwordm9pZAorbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOworICAgICBmcmFnUyAqZnJhZzsKKyAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOworeworICB2YWx1ZVQgb2Zmc2V0OworCisgIG9mZnNldCA9IHRvX2FkZHIgLSBmcm9tX2FkZHI7CisgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweEVBLCAxKTsKKyAgbWRfbnVtYmVyX3RvX2Rpc3AgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgMik7Cit9CisKK3ZvaWQKK21kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOworICAgICBmcmFnUyAqZnJhZzsKKyAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOworeworICB2YWx1ZVQgb2Zmc2V0OworCisgIG9mZnNldCA9IHRvX2FkZHIgLSBmcm9tX2FkZHI7CisgIG1kX251bWJlcl90b19jaGFycyAocHRyLCAodmFsdWVUKSAweEVBLCAxKTsKKyAgbWRfbnVtYmVyX3RvX2Rpc3AgKHB0ciArIDEsICh2YWx1ZVQpIG9mZnNldCwgNCk7Cit9CisMCitDT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibToiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ20nOgorICAgICAgaWYgKCFzdHJjbXAgKGFyZywgIjMyMDMyIikpCisJeworCSAgY3B1cmVnID0gY3B1cmVnXzAzMjsKKwkgIG1tdXJlZyA9IG1tdXJlZ18wMzI7CisJfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoYXJnLCAiMzI1MzIiKSkKKwl7CisJICBjcHVyZWcgPSBjcHVyZWdfNTMyOworCSAgbW11cmVnID0gbW11cmVnXzUzMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSBvcHRpb24gLW0lcyIpLCBhcmcpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKKyAgZnByaW50ZihzdHJlYW0sIF8oIlwKK05TMzJLIG9wdGlvbnM6XG5cCistbTMyMDMyIHwgLW0zMjUzMglzZWxlY3QgdmFyaWFudCBvZiBOUzMySyBhcmNoaXRlY3R1cmVcbiIpKTsKK30KKworDAorLyoKKyAqCQkJYml0X2ZpeF9uZXcoKQorICoKKyAqIENyZWF0ZSBhIGJpdF9maXhTIGluIG9ic3RhY2sgJ25vdGVzJy4KKyAqIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcHJvZmlsZSB0aGUgbm9ybWFsIGZpeC4gSWYgdGhlIGJpdF9maXhQIGlzIGEKKyAqIHZhbGlkIHBvaW50ZXIgKG5vdCBOVUxMKSB0aGUgYml0X2ZpeCBkYXRhIHdpbGwgYmUgdXNlZCB0byBmb3JtYXQgdGhlIGZpeC4KKyAqLworYml0X2ZpeFMgKgorYml0X2ZpeF9uZXcgKHNpemUsIG9mZnNldCwgbWluLCBtYXgsIGFkZCwgYmFzZV90eXBlLCBiYXNlX2FkaikKKyAgICAgY2hhciBzaXplOwkJCS8qIExlbmd0aCBvZiBiaXRmaWVsZAkJKi8KKyAgICAgY2hhciBvZmZzZXQ7CQkvKiBCaXQgb2Zmc2V0IHRvIGJpdGZpZWxkCSovCisgICAgIGxvbmcgbWluOwkJCS8qIFNpZ25leHRlbmRlZCBtaW4gZm9yIGJpdGZpZWxkICovCisgICAgIGxvbmcgbWF4OwkJCS8qIFNpZ25leHRlbmRlZCBtYXggZm9yIGJpdGZpZWxkICovCisgICAgIGxvbmcgYWRkOwkJCS8qIEFkZCBtYXNrLCB1c2VkIGZvciBodWZmbWFuIHByZWZpeCAqLworICAgICBsb25nIGJhc2VfdHlwZTsJCS8qIDAgb3IgMSwgaWYgMSBpdCdzIGV4cGxvZGVkIHRvIG9wY29kZSBwdHIgKi8KKyAgICAgbG9uZyBiYXNlX2FkajsKK3sKKyAgcmVnaXN0ZXIgYml0X2ZpeFMgKmJpdF9maXhQOworCisgIGJpdF9maXhQID0gKGJpdF9maXhTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChiaXRfZml4UykpOworCisgIGJpdF9maXhQLT5meF9iaXRfc2l6ZSA9IHNpemU7CisgIGJpdF9maXhQLT5meF9iaXRfb2Zmc2V0ID0gb2Zmc2V0OworICBiaXRfZml4UC0+ZnhfYml0X2Jhc2UgPSBiYXNlX3R5cGU7CisgIGJpdF9maXhQLT5meF9iaXRfYmFzZV9hZGogPSBiYXNlX2FkajsKKyAgYml0X2ZpeFAtPmZ4X2JpdF9tYXggPSBtYXg7CisgIGJpdF9maXhQLT5meF9iaXRfbWluID0gbWluOworICBiaXRfZml4UC0+ZnhfYml0X2FkZCA9IGFkZDsKKworICByZXR1cm4gKGJpdF9maXhQKTsKK30KKwordm9pZAorZml4X25ld19uczMyayAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgcGNyZWwsCisJICAgICAgIGltX2Rpc3AsIGJpdF9maXhQLCBic3IsIG9wY29kZV9mcmFnLCBvcGNvZGVfb2Zmc2V0KQorICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCisgICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCisgICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KKyAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLworICAgICBsb25nIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KKyAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KKyAgICAgY2hhciBpbV9kaXNwOwkJLyogdHJ1ZSBpZiB0aGUgdmFsdWUgdG8gd3JpdGUgaXMgYQorCQkJCSAgIGRpc3BsYWNlbWVudCAqLworICAgICBiaXRfZml4UyAqYml0X2ZpeFA7CS8qIHBvaW50ZXIgYXQgc3RydWN0IG9mIGJpdF9maXgncywgaWdub3JlZCBpZgorCQkJCSAgIE5VTEwgKi8KKyAgICAgY2hhciBic3I7CQkJLyogc2VxdWVudC1saW5rZXItaGFjazogMSB3aGVuIHJlbG9jb2JqZWN0IGlzCisJCQkJICAgYSBic3IgKi8KKyAgICAgZnJhZ1MgKm9wY29kZV9mcmFnOworICAgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldDsKKworeworICBmaXhTICpmaXhQID0gZml4X25ldyAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsCisJCQlvZmZzZXQsIHBjcmVsLAorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKwkJCWJpdF9maXhQPyBOT19SRUxPQzogcmVsb2Moc2l6ZSwgcGNyZWwsIGltX2Rpc3ApCisjZWxzZQorCQkJTk9fUkVMT0MKKyNlbmRpZgorCQkJKTsKKworICBmaXhfb3Bjb2RlX2ZyYWcoZml4UCkgPSBvcGNvZGVfZnJhZzsKKyAgZml4X29wY29kZV9vZmZzZXQoZml4UCkgPSBvcGNvZGVfb2Zmc2V0OworICBmaXhfaW1fZGlzcChmaXhQKSA9IGltX2Rpc3A7CisgIGZpeF9ic3IoZml4UCkgPSBic3I7CisgIGZpeF9iaXRfZml4UChmaXhQKSA9IGJpdF9maXhQOworfQkJCQkvKiBmaXhfbmV3X25zMzJrKCkgKi8KKwordm9pZAorZml4X25ld19uczMya19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLAorCQkgICBpbV9kaXNwLCBiaXRfZml4UCwgYnNyLCBvcGNvZGVfZnJhZywgb3Bjb2RlX29mZnNldCkKKyAgICAgZnJhZ1MgKmZyYWc7CQkvKiBXaGljaCBmcmFnPyAqLworICAgICBpbnQgd2hlcmU7CQkJLyogV2hlcmUgaW4gdGhhdCBmcmFnPyAqLworICAgICBpbnQgc2l6ZTsJCQkvKiAxLCAyICBvciA0IHVzdWFsbHkuICovCisgICAgIGV4cHJlc3Npb25TICpleHA7CQkvKiBFeHByZXNzaW9uLiAqLworICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLworICAgICBjaGFyIGltX2Rpc3A7CQkvKiB0cnVlIGlmIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBhCisJCQkJICAgZGlzcGxhY2VtZW50ICovCisgICAgIGJpdF9maXhTICpiaXRfZml4UDsJLyogcG9pbnRlciBhdCBzdHJ1Y3Qgb2YgYml0X2ZpeCdzLCBpZ25vcmVkIGlmCisJCQkJICAgTlVMTCAqLworICAgICBjaGFyIGJzcjsJCQkvKiBzZXF1ZW50LWxpbmtlci1oYWNrOiAxIHdoZW4gcmVsb2NvYmplY3QgaXMKKwkJCQkgICBhIGJzciAqLworICAgICBmcmFnUyAqb3Bjb2RlX2ZyYWc7CisgICAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OworeworICBmaXhTICpmaXhQID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLAorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKwkJCSAgICBiaXRfZml4UD8gTk9fUkVMT0M6IHJlbG9jKHNpemUsIHBjcmVsLCBpbV9kaXNwKQorI2Vsc2UKKwkJCSAgICBOT19SRUxPQworI2VuZGlmCisJCQkgICAgKTsKKworICBmaXhfb3Bjb2RlX2ZyYWcoZml4UCkgPSBvcGNvZGVfZnJhZzsKKyAgZml4X29wY29kZV9vZmZzZXQoZml4UCkgPSBvcGNvZGVfb2Zmc2V0OworICBmaXhfaW1fZGlzcChmaXhQKSA9IGltX2Rpc3A7CisgIGZpeF9ic3IoZml4UCkgPSBic3I7CisgIGZpeF9iaXRfZml4UChmaXhQKSA9IGJpdF9maXhQOworfQkJCQkvKiBmaXhfbmV3X25zMzJrKCkgKi8KKworLyogVGhpcyBpcyBUQ19DT05TX0ZJWF9ORVcsIGNhbGxlZCBieSBlbWl0X2V4cHIgaW4gcmVhZC5jLiAgKi8KKwordm9pZAorY29uc19maXhfbmV3X25zMzJrIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQorICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCisgICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCisgICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KKyAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICovCit7CisgIGZpeF9uZXdfbnMzMmtfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLAorCQkgICAgIDAsIDIsIDAsIDAsIDAsIDApOworfQorCisvKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1Qgc2VnbWVudDsKKyAgICAgdmFsdWVUIHNpemU7Cit7CisgIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KK30KKworLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPyAgT24gdGhlCisgICBuczMyaywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAqLworbG9uZworbWRfcGNyZWxfZnJvbSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgbG9uZyByZXM7CisgIHJlcyA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKKyNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKKyAgaWYgKGZyYWdfYnNyKGZpeFAtPmZ4X2ZyYWcpKQorICAgIHJlcyArPSAweDEyCQkJLyogRk9PIEtsdWRnZSBhbGVydCEgKi8KKyNlbmRpZgorICAgICAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKworYXJlbGVudCAqCit0Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBmaXhTICpmaXhwOworeworICBhcmVsZW50ICpyZWw7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworCisgIGNvZGUgPSByZWxvYyhmaXhwLT5meF9zaXplLCBmaXhwLT5meF9wY3JlbCwgZml4X2ltX2Rpc3AoZml4cCkpOworCisgIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworICByZWwtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisgIGlmIChmaXhwLT5meF9wY3JlbCkKKyAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKKyAgZWxzZQorICAgIHJlbC0+YWRkZW5kID0gMDsKKworICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOworICBpZiAoIXJlbC0+aG93dG8pCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJbmFtZSA9IF8oIjx1bmtub3duPiIpOworICAgICAgYXNfZmF0YWwgKF8oIkNhbm5vdCBmaW5kIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVkIiksCisJCW5hbWUsIChpbnQpIGNvZGUpOworICAgIH0KKworICByZXR1cm4gcmVsOworfQorI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLworCisjaWZkZWYgT0JKX0FPVVQKK3ZvaWQKK2NvbnNfZml4X25ld19uczMyayAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQorICAgICBjaGFyICp3aGVyZTsKKyAgICAgc3RydWN0IGZpeCAqZml4UDsKKyAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Cit7CisgIC8qCisgICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KKyAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KKyAgICovCisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKKyAgbG9uZyByX3N5bWJvbG51bTsKKworICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKKworICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAorICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAorCQkgICAgICA0KTsKKworICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQorCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKKwkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7CisKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSArIDQsCisJCSAgICAgICgobG9uZykgKHJfc3ltYm9sbnVtKQorCQkgICAgICAgfCAobG9uZykgKGZpeFAtPmZ4X3BjcmVsIDw8IDI0KQorCQkgICAgICAgfCAobG9uZykgKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCAyNSkKKwkJICAgICAgIHwgKGxvbmcpICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCAyNykKKwkJICAgICAgIHwgKGxvbmcpIChmaXhfYnNyKGZpeFApIDw8IDI4KQorCQkgICAgICAgfCAobG9uZykgKGZpeF9pbV9kaXNwKGZpeFApIDw8IDI5KSksCisJCSAgICAgIDQpOworfQorCisjZW5kaWYgLyogT0JKX0FPVVQgKi8KKyNlbmRpZiAvKiBCRkRfQVNTTUVCTEVSICovCisKKy8qIGVuZCBvZiB0Yy1uczMyay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW5zMzJrLmggYi9nYXMvY29uZmlnL3RjLW5zMzJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMzhlYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtbnMzMmsuaApAQCAtMCwwICsxLDE1NSBAQAorLyogdGMtbnMzMmsuaCAtLSBPcGNvZGUgdGFibGUgZm9yIE5hdGlvbmFsIFNlbWkgMzJrIHByb2Nlc3NvcgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQ19OUzMySworCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTAKKworI2RlZmluZSBUQ19QQ1JFTF9BREpVU1QoRikgbWRfcGNyZWxfYWRqdXN0KEYpCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCisKKyNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX25zMzJrCisKKyNpZm5kZWYgVEFSR0VUX0ZPUk1BVAkJLyogTWF5YmUgZGVmaW5lZCBpbiB0ZS0qLmggKi8KKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LXBjNTMyLW1hY2giCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIE5PX1JFTE9DIDAKKyNlbmRpZgorCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCisKKyNpbmNsdWRlICJiaXRfZml4LmgiCisKKyNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLworI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLworCisjaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCisjZGVmaW5lIERFRl9NT0RFQyAyMAorI2RlZmluZSBERUZfTU9ERUwgMjEKKyNlbmRpZgorCisjaWZuZGVmIERFRl9NT0RFQworI2RlZmluZSBERUZfTU9ERUMgMjAKKyNlbmRpZgorCisjaWZuZGVmIERFRl9NT0RFTAorI2RlZmluZSBERUZfTU9ERUwgMjAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9BUkdTIDQKKyNkZWZpbmUgQVJHX0xFTiA1MAorCisjZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfbnMzMmsKK2V4dGVybiB2b2lkIGZpeF9uZXdfbnMzMmtfZXhwIFBBUkFNUygoZnJhZ1MgKmZyYWcsCisJCQkJICAgaW50IHdoZXJlLAorCQkJCSAgIGludCBzaXplLAorCQkJCSAgIGV4cHJlc3Npb25TICpleHAsCisJCQkJICAgaW50IHBjcmVsLAorCQkJCSAgIGludCBpbV9kaXNwLAorCQkJCSAgIGJpdF9maXhTICpiaXRfZml4UCwJLyogcmVhbGx5IGJpdF9maXhTICovCisJCQkJICAgaW50IGJzciwKKwkJCQkgICBmcmFnUyAqb3Bjb2RlX2ZyYWcsCisJCQkJICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQpKTsKKworCitleHRlcm4gdm9pZCBmaXhfbmV3X25zMzJrIFBBUkFNUyAoKGZyYWdTICpmcmFnLAorCQkJCSAgIGludCB3aGVyZSwKKwkJCQkgICBpbnQgc2l6ZSwKKwkJCQkgICBzdHJ1Y3Qgc3ltYm9sICphZGRfc3ltYm9sLAorCQkJCSAgIGxvbmcgb2Zmc2V0LAorCQkJCSAgIGludCBwY3JlbCwKKwkJCQkgICBpbnQgaW1fZGlzcCwKKwkJCQkgICBiaXRfZml4UyAqYml0X2ZpeFAsCS8qIHJlYWxseSBiaXRfZml4UyAqLworCQkJCSAgIGludCBic3IsCisJCQkJICAgZnJhZ1MgKm9wY29kZV9mcmFnLAorCQkJCSAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0KSk7CisKK2V4dGVybiB2b2lkIGNvbnNfZml4X25ld19uczMyayBQQVJBTVMgKChmcmFnUyAqZnJhZywKKwkJCQkJaW50IHdoZXJlLAorCQkJCQlpbnQgc2l6ZSwKKwkJCQkJZXhwcmVzc2lvblMgKmV4cCkpOworCisvKiB0aGUgTlMzMngzMiBoYXMgYSBub24gMCBub3AgaW5zdHJ1Y3Rpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gYWxpZ25zICovCisjZGVmaW5lIE5PUF9PUENPREUgMHhhMgorCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107CisjZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKKworI2RlZmluZSBUQ19GUkFHX1RZUEUJCQkJXAorc3RydWN0IHsJCQkJCVwKKyAgZnJhZ1MgKmZyX29wY29kZV9mcmFnUDsJCQlcCisgIHVuc2lnbmVkIGludCBmcl9vcGNvZGVfb2Zmc2V0OwkJXAorICBjaGFyIGZyX2JzcjsJCQkJCVwKK30KKworI2RlZmluZSBUQ19GUkFHX0lOSVQoWCkJCQkJXAorICBkbwkJCQkJCVwKKyAgICAgewkJCQkJCVwKKyAgICAgICBmcmFnX29wY29kZV9mcmFnIChYKSA9IE5VTEw7CQlcCisgICAgICAgZnJhZ19vcGNvZGVfb2Zmc2V0IChYKSA9IDA7CQlcCisgICAgICAgZnJhZ19ic3IgKFgpID0gMDsJCQkJXAorICAgICB9CQkJCQkJXAorICB3aGlsZSgwKQorCisvKiBBY2Nlc3NvciBtYWNyb3MgZm9yIHRoaW5ncyB3aGljaCBtYXkgbW92ZSBhcm91bmQgKi8KKyNkZWZpbmUgZnJhZ19vcGNvZGVfZnJhZyhYKSAgIChYKS0+dGNfZnJhZ19kYXRhLmZyX29wY29kZV9mcmFnUAorI2RlZmluZSBmcmFnX29wY29kZV9vZmZzZXQoWCkgKFgpLT50Y19mcmFnX2RhdGEuZnJfb3Bjb2RlX29mZnNldAorI2RlZmluZSBmcmFnX2JzcihYKSAgICAgICAgICAgKFgpLT50Y19mcmFnX2RhdGEuZnJfYnNyCisKKyNkZWZpbmUgVENfRklYX1RZUEUJCQkJXAorc3RydWN0CQkJCQkJXAorewkJCQkJCVwKKyAgZnJhZ1MgKm9wY29kZV9mcmFnUDsJCQkJXAorICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldDsJCQlcCisgIHVuc2lnbmVkIGludCBic3IgOiAxOwkJCQlcCit9CisKKy8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhpbmdzIHdoaWNoIG1heSBtb3ZlIGFyb3VuZC4KKyAgIFNlZSBjb21tZW50cyBpbiB3cml0ZS5oLiAgKi8KKyNkZWZpbmUgZml4X2ltX2Rpc3AoWCkgICAgICAgKFgpLT5meF9pbV9kaXNwCisjZGVmaW5lIGZpeF9iaXRfZml4UChYKSAgICAgIChYKS0+ZnhfYml0X2ZpeFAKKyNkZWZpbmUgZml4X29wY29kZV9mcmFnKFgpICAgKFgpLT50Y19maXhfZGF0YS5vcGNvZGVfZnJhZ1AKKyNkZWZpbmUgZml4X29wY29kZV9vZmZzZXQoWCkgKFgpLT50Y19maXhfZGF0YS5vcGNvZGVfb2Zmc2V0CisjZGVmaW5lIGZpeF9ic3IoWCkgICAgICAgICAgIChYKS0+dGNfZml4X2RhdGEuYnNyCisKKyNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShYKQkJCVwKKyAgZG8JCQkJCQlcCisgICAgIHsJCQkJCQlcCisgICAgICAgZml4X29wY29kZV9mcmFnKFgpID0gTlVMTDsJCVwKKyAgICAgICBmaXhfb3Bjb2RlX29mZnNldChYKSA9IDA7CQlcCisgICAgICAgZml4X2JzcihYKSA9IDA7CQkJCVwKKyAgICAgfQkJCQkJCVwKKyAgd2hpbGUoMCkKKworI2RlZmluZSBUQ19GSVhfREFUQV9QUklOVChGSUxFLCBGSVhQKQkJCQkJXAorICBkbwkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgZnByaW50ZigoRklMRSksICJvcGNvZGVfZnJhZz0lbGQsIG9wZXJhbmQgb2Zmc2V0PSVkLCBic3I9JWRcbiIsCVwKKwkgICAgICAodW5zaWduZWQgbG9uZykgZml4X29wY29kZV9mcmFnIChGSVhQKSwJCQlcCisJICAgICAgZml4X29wY29kZV9vZmZzZXQgKEZJWFApLAkJCQkJXAorCSAgICAgIGZpeF9ic3IgKEZJWFApKTsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtcHBjLmMgYi9nYXMvY29uZmlnL3RjLXBwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzFiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXBwYy5jCkBAIC0wLDAgKzEsNTAwMyBAQAorLyogdGMtcHBjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBQb3dlclBDIG9yIFBPV0VSIChSUy82MDAwKQorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorCisjaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgorCisjaWZkZWYgT0JKX0VMRgorI2luY2x1ZGUgImVsZi9wcGMuaCIKKyNlbmRpZgorCisjaWZkZWYgVEVfUEUKKyNpbmNsdWRlICJjb2ZmL3BlLmgiCisjZW5kaWYKKworLyogVGhpcyBpcyB0aGUgYXNzZW1ibGVyIGZvciB0aGUgUG93ZXJQQyBvciBQT1dFUiAoUlMvNjAwMCkgY2hpcHMuICAqLworCisvKiBUZWxsIHRoZSBtYWluIGNvZGUgd2hhdCB0aGUgZW5kaWFubmVzcyBpcy4gICovCitleHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOworCisvKiBXaGV0aGVyIG9yIG5vdCwgd2UndmUgc2V0IHRhcmdldF9iaWdfZW5kaWFuLiAgKi8KK3N0YXRpYyBpbnQgc2V0X3RhcmdldF9lbmRpYW4gPSAwOworCisvKiBXaGV0aGVyIHRvIHVzZSB1c2VyIGZyaWVuZGx5IHJlZ2lzdGVyIG5hbWVzLiAgKi8KKyNpZm5kZWYgVEFSR0VUX1JFR19OQU1FU19QCisjaWZkZWYgVEVfUEUKKyNkZWZpbmUgVEFSR0VUX1JFR19OQU1FU19QIHRydWUKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9SRUdfTkFNRVNfUCBmYWxzZQorI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGJvb2xlYW4gcmVnX25hbWVzX3AgPSBUQVJHRVRfUkVHX05BTUVTX1A7CisKK3N0YXRpYyBib29sZWFuIHJlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOworc3RhdGljIHZvaWQgcHBjX3NldF9jcHUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHBjX2luc2VydF9vcGVyYW5kCisgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZCwKKwkgICBvZmZzZXRUIHZhbCwgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpKTsKK3N0YXRpYyB2b2lkIHBwY19tYWNybyBQQVJBTVMgKChjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybykpOworc3RhdGljIHZvaWQgcHBjX2J5dGUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgaW50IHBwY19pc190b2Nfc3ltIFBBUkFNUyAoKHN5bWJvbFMgKnN5bSkpOworc3RhdGljIHZvaWQgcHBjX3RjIFBBUkFNUyAoKGludCkpOworCisjaWZkZWYgT0JKX1hDT0ZGCitzdGF0aWMgdm9pZCBwcGNfY29tbSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19iYiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19iYyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19iZiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19iaWVpIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2JzIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2ViIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2VjIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2VmIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2VzIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2NzZWN0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2NoYW5nZV9jc2VjdCBQQVJBTVMgKChzeW1ib2xTICopKTsKK3N0YXRpYyB2b2lkIHBwY19mdW5jdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19leHRlcm4gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwcGNfbGdsb2JsIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwcGNfbmFtZWRfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19zdGFieCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19yZW5hbWUgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwcGNfdG9jIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX3hjb2ZmX2NvbnMgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwcGNfdmJ5dGUgUEFSQU1TICgoaW50KSk7CisjZW5kaWYKKworI2lmZGVmIE9CSl9FTEYKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcHBjX2VsZl9zdWZmaXggUEFSQU1TICgoY2hhciAqKiwgZXhwcmVzc2lvblMgKikpOworc3RhdGljIHZvaWQgcHBjX2VsZl9jb25zIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX2VsZl9yZGF0YSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19lbGZfbGNvbW0gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwcGNfZWxmX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChmaXhTICosIHNlZ1QpKTsKKyNlbmRpZgorCisjaWZkZWYgVEVfUEUKK3N0YXRpYyB2b2lkIHBwY19zZXRfY3VycmVudF9zZWN0aW9uIFBBUkFNUyAoKHNlZ1QpKTsKK3N0YXRpYyB2b2lkIHBwY19wcmV2aW91cyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19wZGF0YSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY195ZGF0YSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19yZWxkYXRhIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX3JkYXRhIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX3VhbG9uZyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY196bm9wIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcHBjX3BlX2NvbW0gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBwcGNfcGVfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19wZV9mdW5jdGlvbiBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIHBwY19wZV90b2NkIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisMCisvKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwKKyAgIHRhcmdldHMuICAqLworCisjaWZkZWYgT0JKX0VMRgorLyogVGhpcyBzdHJpbmcgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQorICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLiAgVGhlIG1hY3JvCisgICB0Y19jb21tZW50X2NoYXJzIHBvaW50cyB0byB0aGlzLiAgV2UgdXNlIHRoaXMsIHJhdGhlciB0aGFuIHRoZQorICAgdXN1YWwgY29tbWVudF9jaGFycywgc28gdGhhdCB3ZSBjYW4gc3dpdGNoIGZvciBTb2xhcmlzIGNvbnZlbnRpb25zLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnNbXSA9ICIjISI7CitzdGF0aWMgY29uc3QgY2hhciBwcGNfZWFiaV9jb21tZW50X2NoYXJzW10gPSAiIyI7CisKKyNpZmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCitjb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFycyA9IHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnM7CisjZWxzZQorY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfZWFiaV9jb21tZW50X2NoYXJzOworI2VuZGlmCisjZWxzZQorY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7CisjZW5kaWYKKworLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhCisgICBzaW5nbGUgbGluZS4gICovCitjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7CisKKy8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZworICAgcG9pbnQgbnVtYmVyLiAgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAorICAgYXMgaW4gMGQxLjAuICAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7CisMCisvKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCisKK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIC8qIFBzZXVkby1vcHMgd2hpY2ggbXVzdCBiZSBvdmVycmlkZGVuLiAgKi8KKyAgeyAiYnl0ZSIsCXBwY19ieXRlLAkwIH0sCisKKyNpZmRlZiBPQkpfWENPRkYKKyAgLyogUHNldWRvLW9wcyBzcGVjaWZpYyB0byB0aGUgUlMvNjAwMCBYQ09GRiBmb3JtYXQuICBTb21lIG9mIHRoZXNlCisgICAgIGxlZ2l0aW1hdGVseSBiZWxvbmcgaW4gdGhlIG9iai0qLmMgZmlsZS4gIEhvd2V2ZXIsIFhDT0ZGIGlzIGJhc2VkCisgICAgIG9uIENPRkYsIGFuZCBpcyBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUgUlMvNjAwMC4gIFdlIGp1c3QgdXNlCisgICAgIG9iai1jb2ZmLmMsIGFuZCBhZGQgd2hhdCB3ZSBuZWVkIGhlcmUuICAqLworICB7ICJjb21tIiwJcHBjX2NvbW0sCTAgfSwKKyAgeyAibGNvbW0iLAlwcGNfY29tbSwJMSB9LAorICB7ICJiYiIsCXBwY19iYiwJCTAgfSwKKyAgeyAiYmMiLAlwcGNfYmMsCQkwIH0sCisgIHsgImJmIiwJcHBjX2JmLAkJMCB9LAorICB7ICJiaSIsCXBwY19iaWVpLAkwIH0sCisgIHsgImJzIiwJcHBjX2JzLAkJMCB9LAorICB7ICJjc2VjdCIsCXBwY19jc2VjdCwJMCB9LAorICB7ICJkYXRhIiwJcHBjX3NlY3Rpb24sCSdkJyB9LAorICB7ICJlYiIsCXBwY19lYiwJCTAgfSwKKyAgeyAiZWMiLAlwcGNfZWMsCQkwIH0sCisgIHsgImVmIiwJcHBjX2VmLAkJMCB9LAorICB7ICJlaSIsCXBwY19iaWVpLAkxIH0sCisgIHsgImVzIiwJcHBjX2VzLAkJMCB9LAorICB7ICJleHRlcm4iLAlwcGNfZXh0ZXJuLAkwIH0sCisgIHsgImZ1bmN0aW9uIiwJcHBjX2Z1bmN0aW9uLAkwIH0sCisgIHsgImxnbG9ibCIsCXBwY19sZ2xvYmwsCTAgfSwKKyAgeyAicmVuYW1lIiwJcHBjX3JlbmFtZSwJMCB9LAorICB7ICJzZWN0aW9uIiwJcHBjX25hbWVkX3NlY3Rpb24sIDAgfSwKKyAgeyAic3RhYngiLAlwcGNfc3RhYngsCTAgfSwKKyAgeyAidGV4dCIsCXBwY19zZWN0aW9uLAkndCcgfSwKKyAgeyAidG9jIiwJcHBjX3RvYywJMCB9LAorICB7ICJsb25nIiwJcHBjX3hjb2ZmX2NvbnMsCTIgfSwKKyAgeyAid29yZCIsCXBwY194Y29mZl9jb25zLAkxIH0sCisgIHsgInNob3J0IiwJcHBjX3hjb2ZmX2NvbnMsCTEgfSwKKyAgeyAidmJ5dGUiLCAgICBwcGNfdmJ5dGUsCTAgfSwKKyNlbmRpZgorCisjaWZkZWYgT0JKX0VMRgorICB7ICJsb25nIiwJcHBjX2VsZl9jb25zLAk0IH0sCisgIHsgIndvcmQiLAlwcGNfZWxmX2NvbnMsCTIgfSwKKyAgeyAic2hvcnQiLAlwcGNfZWxmX2NvbnMsCTIgfSwKKyAgeyAicmRhdGEiLAlwcGNfZWxmX3JkYXRhLAkwIH0sCisgIHsgInJvZGF0YSIsCXBwY19lbGZfcmRhdGEsCTAgfSwKKyAgeyAibGNvbW0iLAlwcGNfZWxmX2xjb21tLAkwIH0sCisjZW5kaWYKKworI2lmZGVmIFRFX1BFCisgIC8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFdpbmRvd3MgTlQgUG93ZXJQQyBQRSAoY29mZikgZm9ybWF0ICovCisgIHsgInByZXZpb3VzIiwgcHBjX3ByZXZpb3VzLCAgIDAgfSwKKyAgeyAicGRhdGEiLCAgICBwcGNfcGRhdGEsICAgICAgMCB9LAorICB7ICJ5ZGF0YSIsICAgIHBwY195ZGF0YSwgICAgICAwIH0sCisgIHsgInJlbGRhdGEiLCAgcHBjX3JlbGRhdGEsICAgIDAgfSwKKyAgeyAicmRhdGEiLCAgICBwcGNfcmRhdGEsICAgICAgMCB9LAorICB7ICJ1YWxvbmciLCAgIHBwY191YWxvbmcsICAgICAwIH0sCisgIHsgInpub3AiLCAgICAgcHBjX3pub3AsICAgICAgIDAgfSwKKyAgeyAiY29tbSIsCXBwY19wZV9jb21tLAkwIH0sCisgIHsgImxjb21tIiwJcHBjX3BlX2NvbW0sCTEgfSwKKyAgeyAic2VjdGlvbiIsICBwcGNfcGVfc2VjdGlvbiwgMCB9LAorICB7ICJmdW5jdGlvbiIsCXBwY19wZV9mdW5jdGlvbiwwIH0sCisgIHsgInRvY2QiLCAgICAgcHBjX3BlX3RvY2QsICAgIDAgfSwKKyNlbmRpZgorCisgIC8qIFRoaXMgcHNldWRvLW9wIGlzIHVzZWQgZXZlbiB3aGVuIG5vdCBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dC4gICovCisgIHsgInRjIiwJcHBjX3RjLAkJMCB9LAorCisgIHsgTlVMTCwJTlVMTCwJCTAgfQorfTsKKworDAorLyogUHJlZGVmaW5lZCByZWdpc3RlciBuYW1lcyBpZiAtbXJlZ25hbWVzIChvciBkZWZhdWx0IGZvciBXaW5kb3dzIE5UKS4gICovCisvKiBJbiBnZW5lcmFsLCB0aGVyZSBhcmUgbG90cyBvZiB0aGVtLCBpbiBhbiBhdHRlbXB0IHRvIGJlIGNvbXBhdGlibGUgKi8KKy8qIHdpdGggYSBudW1iZXIgb2Ygb3RoZXIgV2luZG93cyBOVCBhc3NlbWJsZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCitzdHJ1Y3QgcGRfcmVnCisgIHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCB2YWx1ZTsKKyAgfTsKKworLyogTGlzdCBvZiByZWdpc3RlcnMgdGhhdCBhcmUgcHJlLWRlZmluZWQ6CisKKyAgIEVhY2ggZ2VuZXJhbCByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKKyAgIDEuIHI8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCisgICAyLiByLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KKworCisgICBFYWNoIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGhhcyBwcmVkZWZpbmVkIG5hbWVzIG9mIHRoZSBmb3JtOgorICAgMS4gZjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KKyAgIDIuIGYuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgorCisgICBFYWNoIGNvbmRpdGlvbiByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKKyAgIDEuIGNyPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgorICAgMi4gY3IuPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgorCisgICBUaGVyZSBhcmUgaW5kaXZpZHVhbCByZWdpc3RlcnMgYXMgd2VsbDoKKyAgIHNwIG9yIHIuc3AgICAgIGhhcyB0aGUgdmFsdWUgMQorICAgcnRvYyBvciByLnRvYyAgaGFzIHRoZSB2YWx1ZSAyCisgICBmcHNjciAgICAgICAgICBoYXMgdGhlIHZhbHVlIDAKKyAgIHhlciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMQorICAgbHIgICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSA4CisgICBjdHIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDkKKyAgIHBtciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMAorICAgZGFyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAxOQorICAgZHNpc3IgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAxOAorICAgZGVjICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyMgorICAgc2RyMSAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyNQorICAgc3JyMCAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyNgorICAgc3JyMSAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAyNworCisgICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQoreworICB7ICJjci4wIiwgMCB9LCAgICAvKiBDb25kaXRpb24gUmVnaXN0ZXJzICovCisgIHsgImNyLjEiLCAxIH0sCisgIHsgImNyLjIiLCAyIH0sCisgIHsgImNyLjMiLCAzIH0sCisgIHsgImNyLjQiLCA0IH0sCisgIHsgImNyLjUiLCA1IH0sCisgIHsgImNyLjYiLCA2IH0sCisgIHsgImNyLjciLCA3IH0sCisKKyAgeyAiY3IwIiwgMCB9LAorICB7ICJjcjEiLCAxIH0sCisgIHsgImNyMiIsIDIgfSwKKyAgeyAiY3IzIiwgMyB9LAorICB7ICJjcjQiLCA0IH0sCisgIHsgImNyNSIsIDUgfSwKKyAgeyAiY3I2IiwgNiB9LAorICB7ICJjcjciLCA3IH0sCisKKyAgeyAiY3RyIiwgOSB9LAorCisgIHsgImRhciIsIDE5IH0sICAgIC8qIERhdGEgQWNjZXNzIFJlZ2lzdGVyICovCisgIHsgImRlYyIsIDIyIH0sICAgIC8qIERlY3JlbWVudGVyICovCisgIHsgImRzaXNyIiwgMTggfSwgIC8qIERhdGEgU3RvcmFnZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyAgeyAiZi4wIiwgMCB9LCAgICAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisgIHsgImYuMSIsIDEgfSwgCisgIHsgImYuMTAiLCAxMCB9LCAKKyAgeyAiZi4xMSIsIDExIH0sIAorICB7ICJmLjEyIiwgMTIgfSwgCisgIHsgImYuMTMiLCAxMyB9LCAKKyAgeyAiZi4xNCIsIDE0IH0sIAorICB7ICJmLjE1IiwgMTUgfSwgCisgIHsgImYuMTYiLCAxNiB9LCAKKyAgeyAiZi4xNyIsIDE3IH0sIAorICB7ICJmLjE4IiwgMTggfSwgCisgIHsgImYuMTkiLCAxOSB9LCAKKyAgeyAiZi4yIiwgMiB9LCAKKyAgeyAiZi4yMCIsIDIwIH0sIAorICB7ICJmLjIxIiwgMjEgfSwgCisgIHsgImYuMjIiLCAyMiB9LCAKKyAgeyAiZi4yMyIsIDIzIH0sIAorICB7ICJmLjI0IiwgMjQgfSwgCisgIHsgImYuMjUiLCAyNSB9LCAKKyAgeyAiZi4yNiIsIDI2IH0sIAorICB7ICJmLjI3IiwgMjcgfSwgCisgIHsgImYuMjgiLCAyOCB9LCAKKyAgeyAiZi4yOSIsIDI5IH0sIAorICB7ICJmLjMiLCAzIH0sIAorICB7ICJmLjMwIiwgMzAgfSwKKyAgeyAiZi4zMSIsIDMxIH0sCisgIHsgImYuNCIsIDQgfSwgCisgIHsgImYuNSIsIDUgfSwgCisgIHsgImYuNiIsIDYgfSwgCisgIHsgImYuNyIsIDcgfSwgCisgIHsgImYuOCIsIDggfSwgCisgIHsgImYuOSIsIDkgfSwgCisKKyAgeyAiZjAiLCAwIH0sIAorICB7ICJmMSIsIDEgfSwgCisgIHsgImYxMCIsIDEwIH0sIAorICB7ICJmMTEiLCAxMSB9LCAKKyAgeyAiZjEyIiwgMTIgfSwgCisgIHsgImYxMyIsIDEzIH0sIAorICB7ICJmMTQiLCAxNCB9LCAKKyAgeyAiZjE1IiwgMTUgfSwgCisgIHsgImYxNiIsIDE2IH0sIAorICB7ICJmMTciLCAxNyB9LCAKKyAgeyAiZjE4IiwgMTggfSwgCisgIHsgImYxOSIsIDE5IH0sIAorICB7ICJmMiIsIDIgfSwgCisgIHsgImYyMCIsIDIwIH0sIAorICB7ICJmMjEiLCAyMSB9LCAKKyAgeyAiZjIyIiwgMjIgfSwgCisgIHsgImYyMyIsIDIzIH0sIAorICB7ICJmMjQiLCAyNCB9LCAKKyAgeyAiZjI1IiwgMjUgfSwgCisgIHsgImYyNiIsIDI2IH0sIAorICB7ICJmMjciLCAyNyB9LCAKKyAgeyAiZjI4IiwgMjggfSwgCisgIHsgImYyOSIsIDI5IH0sIAorICB7ICJmMyIsIDMgfSwgCisgIHsgImYzMCIsIDMwIH0sCisgIHsgImYzMSIsIDMxIH0sCisgIHsgImY0IiwgNCB9LCAKKyAgeyAiZjUiLCA1IH0sIAorICB7ICJmNiIsIDYgfSwgCisgIHsgImY3IiwgNyB9LCAKKyAgeyAiZjgiLCA4IH0sIAorICB7ICJmOSIsIDkgfSwgCisKKyAgeyAiZnBzY3IiLCAwIH0sCisKKyAgeyAibHIiLCA4IH0sICAgICAvKiBMaW5rIFJlZ2lzdGVyICovCisKKyAgeyAicG1yIiwgMCB9LAorCisgIHsgInIuMCIsIDAgfSwgICAgLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVycyAqLworICB7ICJyLjEiLCAxIH0sCisgIHsgInIuMTAiLCAxMCB9LAorICB7ICJyLjExIiwgMTEgfSwKKyAgeyAici4xMiIsIDEyIH0sCisgIHsgInIuMTMiLCAxMyB9LAorICB7ICJyLjE0IiwgMTQgfSwKKyAgeyAici4xNSIsIDE1IH0sCisgIHsgInIuMTYiLCAxNiB9LAorICB7ICJyLjE3IiwgMTcgfSwKKyAgeyAici4xOCIsIDE4IH0sCisgIHsgInIuMTkiLCAxOSB9LAorICB7ICJyLjIiLCAyIH0sCisgIHsgInIuMjAiLCAyMCB9LAorICB7ICJyLjIxIiwgMjEgfSwKKyAgeyAici4yMiIsIDIyIH0sCisgIHsgInIuMjMiLCAyMyB9LAorICB7ICJyLjI0IiwgMjQgfSwKKyAgeyAici4yNSIsIDI1IH0sCisgIHsgInIuMjYiLCAyNiB9LAorICB7ICJyLjI3IiwgMjcgfSwKKyAgeyAici4yOCIsIDI4IH0sCisgIHsgInIuMjkiLCAyOSB9LAorICB7ICJyLjMiLCAzIH0sCisgIHsgInIuMzAiLCAzMCB9LAorICB7ICJyLjMxIiwgMzEgfSwKKyAgeyAici40IiwgNCB9LAorICB7ICJyLjUiLCA1IH0sCisgIHsgInIuNiIsIDYgfSwKKyAgeyAici43IiwgNyB9LAorICB7ICJyLjgiLCA4IH0sCisgIHsgInIuOSIsIDkgfSwKKworICB7ICJyLnNwIiwgMSB9LCAgIC8qIFN0YWNrIFBvaW50ZXIgKi8KKworICB7ICJyLnRvYyIsIDIgfSwgIC8qIFBvaW50ZXIgdG8gdGhlIHRhYmxlIG9mIGNvbnRlbnRzICovCisKKyAgeyAicjAiLCAwIH0sICAgICAvKiBNb3JlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KKyAgeyAicjEiLCAxIH0sCisgIHsgInIxMCIsIDEwIH0sCisgIHsgInIxMSIsIDExIH0sCisgIHsgInIxMiIsIDEyIH0sCisgIHsgInIxMyIsIDEzIH0sCisgIHsgInIxNCIsIDE0IH0sCisgIHsgInIxNSIsIDE1IH0sCisgIHsgInIxNiIsIDE2IH0sCisgIHsgInIxNyIsIDE3IH0sCisgIHsgInIxOCIsIDE4IH0sCisgIHsgInIxOSIsIDE5IH0sCisgIHsgInIyIiwgMiB9LAorICB7ICJyMjAiLCAyMCB9LAorICB7ICJyMjEiLCAyMSB9LAorICB7ICJyMjIiLCAyMiB9LAorICB7ICJyMjMiLCAyMyB9LAorICB7ICJyMjQiLCAyNCB9LAorICB7ICJyMjUiLCAyNSB9LAorICB7ICJyMjYiLCAyNiB9LAorICB7ICJyMjciLCAyNyB9LAorICB7ICJyMjgiLCAyOCB9LAorICB7ICJyMjkiLCAyOSB9LAorICB7ICJyMyIsIDMgfSwKKyAgeyAicjMwIiwgMzAgfSwKKyAgeyAicjMxIiwgMzEgfSwKKyAgeyAicjQiLCA0IH0sCisgIHsgInI1IiwgNSB9LAorICB7ICJyNiIsIDYgfSwKKyAgeyAicjciLCA3IH0sCisgIHsgInI4IiwgOCB9LAorICB7ICJyOSIsIDkgfSwKKworICB7ICJydG9jIiwgMiB9LCAgLyogVGFibGUgb2YgY29udGVudHMgKi8KKworICB7ICJzZHIxIiwgMjUgfSwgLyogU3RvcmFnZSBEZXNjcmlwdGlvbiBSZWdpc3RlciAxICovCisKKyAgeyAic3AiLCAxIH0sCisKKyAgeyAic3JyMCIsIDI2IH0sIC8qIE1hY2hpbmUgU3RhdHVzIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAwICovCisgIHsgInNycjEiLCAyNyB9LCAvKiBNYWNoaW5lIFN0YXR1cyBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMSAqLworCisgIHsgInhlciIsIDEgfSwKKworfTsKKworI2RlZmluZSBSRUdfTkFNRV9DTlQJKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKQorCisvKiBHaXZlbiBOQU1FLCBmaW5kIHRoZSByZWdpc3RlciBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZSwgcmV0dXJuCisgICB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgLTEgb24gZmFpbHVyZS4gICovCisKK3N0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoCisgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBwZF9yZWcgKiwgaW50LCBjb25zdCBjaGFyICogbmFtZSkpOworCitzdGF0aWMgaW50CityZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQorICAgICBjb25zdCBzdHJ1Y3QgcGRfcmVnICpyZWdzOworICAgICBpbnQgcmVnY291bnQ7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGludCBtaWRkbGUsIGxvdywgaGlnaDsKKyAgaW50IGNtcDsKKworICBsb3cgPSAwOworICBoaWdoID0gcmVnY291bnQgLSAxOworCisgIGRvCisgICAgeworICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKKyAgICAgIGlmIChjbXAgPCAwKQorCWhpZ2ggPSBtaWRkbGUgLSAxOworICAgICAgZWxzZSBpZiAoY21wID4gMCkKKwlsb3cgPSBtaWRkbGUgKyAxOworICAgICAgZWxzZQorCXJldHVybiByZWdzW21pZGRsZV0udmFsdWU7CisgICAgfQorICB3aGlsZSAobG93IDw9IGhpZ2gpOworCisgIHJldHVybiAtMTsKK30KKworLyoKKyAqIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgorICoKKyAqIGluOglJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCisgKgorICogb3V0OglBIGV4cHJlc3Npb25TLgorICogICAgICBUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAorICogICAgICBYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KKyAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluIGl0cworICogICAgICBvcmlnaW5hbCBzdGF0ZS4KKyAqLworCitzdGF0aWMgYm9vbGVhbgorcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCisgICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKK3sKKyAgaW50IHJlZ19udW1iZXI7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnN0YXJ0OworICBjaGFyIGM7CisKKyAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KKyAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpZiAobmFtZVswXSA9PSAnJScgJiYgaXNhbHBoYSAobmFtZVsxXSkpCisgICAgbmFtZSA9ICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIGVsc2UgaWYgKCFyZWdfbmFtZXNfcCB8fCAhaXNhbHBoYSAobmFtZVswXSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAocHJlX2RlZmluZWRfcmVnaXN0ZXJzLCBSRUdfTkFNRV9DTlQsIG5hbWUpOworCisgIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCisgIGlmIChyZWdfbnVtYmVyID49IDApIAorICAgIHsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOworICAgICAgCisgICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOworICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwwKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCBzZWVuIGluIGFuIGV4cHJlc3Npb24uICBJdAorICAgaGFuZGxlcyB0aGUgc3BlY2lhbCBwYXJzaW5nIHdoaWNoIFBvd2VyUEMgYXNzZW1ibGVycyBhcmUgc3VwcG9zZWQKKyAgIHRvIHVzZSBmb3IgY29uZGl0aW9uIGNvZGVzLiAgKi8KKworLyogV2hldGhlciB0byBkbyB0aGUgc3BlY2lhbCBwYXJzaW5nLiAgKi8KK3N0YXRpYyBib29sZWFuIGNyX29wZXJhbmQ7CisKKy8qIE5hbWVzIHRvIHJlY29nbml6ZSBpbiBhIGNvbmRpdGlvbiBjb2RlLiAgVGhpcyB0YWJsZSBpcyBzb3J0ZWQuICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgY3JfbmFtZXNbXSA9Cit7CisgIHsgImNyMCIsIDAgfSwKKyAgeyAiY3IxIiwgMSB9LAorICB7ICJjcjIiLCAyIH0sCisgIHsgImNyMyIsIDMgfSwKKyAgeyAiY3I0IiwgNCB9LAorICB7ICJjcjUiLCA1IH0sCisgIHsgImNyNiIsIDYgfSwKKyAgeyAiY3I3IiwgNyB9LAorICB7ICJlcSIsIDIgfSwKKyAgeyAiZ3QiLCAxIH0sCisgIHsgImx0IiwgMCB9LAorICB7ICJzbyIsIDMgfSwKKyAgeyAidW4iLCAzIH0KK307CisKKy8qIFBhcnNpbmcgZnVuY3Rpb24uICBUaGlzIHJldHVybnMgbm9uLXplcm8gaWYgaXQgcmVjb2duaXplZCBhbgorICAgZXhwcmVzc2lvbi4gICovCisKK2ludAorcHBjX3BhcnNlX25hbWUgKG5hbWUsIGV4cHIpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGV4cHJlc3Npb25TICpleHByOworeworICBpbnQgdmFsOworCisgIGlmICghIGNyX29wZXJhbmQpCisgICAgcmV0dXJuIDA7CisKKyAgdmFsID0gcmVnX25hbWVfc2VhcmNoIChjcl9uYW1lcywgc2l6ZW9mIGNyX25hbWVzIC8gc2l6ZW9mIGNyX25hbWVzWzBdLAorCQkJIG5hbWUpOworICBpZiAodmFsIDwgMCkKKyAgICByZXR1cm4gMDsKKworICBleHByLT5YX29wID0gT19jb25zdGFudDsKKyAgZXhwci0+WF9hZGRfbnVtYmVyID0gdmFsOworCisgIHJldHVybiAxOworfQorDAorLyogTG9jYWwgdmFyaWFibGVzLiAgKi8KKworLyogVGhlIHR5cGUgb2YgcHJvY2Vzc29yIHdlIGFyZSBhc3NlbWJsaW5nIGZvci4gIFRoaXMgaXMgb25lIG9yIG1vcmUKKyAgIG9mIHRoZSBQUENfT1BDT0RFIGZsYWdzIGRlZmluZWQgaW4gb3Bjb2RlL3BwYy5oLiAgKi8KK3N0YXRpYyBpbnQgcHBjX2NwdSA9IDA7CisKKy8qIFRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3Igd2UgYXJlIGFzc2VtYmxpbmcgZm9yLiAgVGhpcyBpcyBlaXRoZXIKKyAgIFBQQ19PUENPREVfMzIgb3IgUFBDX09QQ09ERV82NC4gICovCitzdGF0aWMgaW50IHBwY19zaXplID0gUFBDX09QQ09ERV8zMjsKKworLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBwY19oYXNoOworCisvKiBNYWNybyBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwcGNfbWFjcm9faGFzaDsKKworI2lmZGVmIE9CSl9FTEYKKy8qIFdoYXQgdHlwZSBvZiBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIHVzZSAqLworc3RhdGljIGVudW0geyBTSExJQl9OT05FLCBTSExJQl9QSUMsIFNISUxCX01SRUxPQ0FUQUJMRSB9IHNobGliID0gU0hMSUJfTk9ORTsKKworLyogRmxhZ3MgdG8gc2V0IGluIHRoZSBlbGYgaGVhZGVyICovCitzdGF0aWMgZmxhZ3dvcmQgcHBjX2ZsYWdzID0gMDsKKworLyogV2hldGhlciB0aGlzIGlzIFNvbGFyaXMgb3Igbm90LiAgKi8KKyNpZmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCisjZGVmaW5lIFNPTEFSSVNfUCB0cnVlCisjZWxzZQorI2RlZmluZSBTT0xBUklTX1AgZmFsc2UKKyNlbmRpZgorCitzdGF0aWMgYm9vbGVhbiBtc29sYXJpcyA9IFNPTEFSSVNfUDsKKyNlbmRpZgorCisjaWZkZWYgT0JKX1hDT0ZGCisKKy8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIHRoZSAuY3NlY3QgcHNldWRvLW9wIHRvIGdlbmVyYXRlIGNvZGUKKyAgIHVzaW5nIGEgYnVuY2ggb2YgZGlmZmVyZW50IHNlY3Rpb25zLiAgVGhlc2UgYXNzZW1ibGVyIHNlY3Rpb25zLAorICAgaG93ZXZlciwgYXJlIGFsbCBlbmNvbXBhc3NlZCB3aXRoaW4gdGhlIC50ZXh0IG9yIC5kYXRhIHNlY3Rpb25zIG9mCisgICB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieSB1c2luZyBkaWZmZXJlbnQKKyAgIHN1YnNlZ21lbnRzIHdpdGhpbiB0aGVzZSBtYWluIHNlZ21lbnRzLiAgKi8KKworLyogTmV4dCBzdWJzZWdtZW50IHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgLnRleHQgc2VnbWVudC4gICovCitzdGF0aWMgc3Vic2VnVCBwcGNfdGV4dF9zdWJzZWdtZW50ID0gMjsKKworLyogTGlua2VkIGxpc3Qgb2YgY3NlY3RzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICAqLworc3RhdGljIHN5bWJvbFMgKnBwY190ZXh0X2NzZWN0czsKKworLyogTmV4dCBzdWJzZWdtZW50IHRvIGFsbG9jYXRlIHdpdGhpbiB0aGUgLmRhdGEgc2VnbWVudC4gICovCitzdGF0aWMgc3Vic2VnVCBwcGNfZGF0YV9zdWJzZWdtZW50ID0gMjsKKworLyogTGlua2VkIGxpc3Qgb2YgY3NlY3RzIGluIHRoZSBkYXRhIHNlY3Rpb24uICAqLworc3RhdGljIHN5bWJvbFMgKnBwY19kYXRhX2NzZWN0czsKKworLyogVGhlIGN1cnJlbnQgY3NlY3QuICAqLworc3RhdGljIHN5bWJvbFMgKnBwY19jdXJyZW50X2NzZWN0OworCisvKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyBhIFRPQyB3aGljaCBob2xkcyBhZGRyZXNzZXMgb2YgZnVuY3Rpb25zCisgICBhbmQgdmFyaWFibGVzLiAgU3ltYm9scyBhcmUgcHV0IGluIHRoZSBUT0Mgd2l0aCB0aGUgLnRjIHBzZXVkby1vcC4KKyAgIEEgc3BlY2lhbCByZWxvY2F0aW9uIGlzIHVzZWQgd2hlbiBhY2Nlc3NpbmcgVE9DIGVudHJpZXMuICBXZSBoYW5kbGUKKyAgIHRoZSBUT0MgYXMgYSBzdWJzZWdtZW50IHdpdGhpbiB0aGUgLmRhdGEgc2VnbWVudC4gIFdlIHNldCBpdCB1cCBpZgorICAgd2Ugc2VlIGEgLnRvYyBwc2V1ZG8tb3AsIGFuZCBzYXZlIHRoZSBjc2VjdCBzeW1ib2wgaGVyZS4gICovCitzdGF0aWMgc3ltYm9sUyAqcHBjX3RvY19jc2VjdDsKKworLyogVGhlIGZpcnN0IGZyYWcgaW4gdGhlIFRPQyBzdWJzZWdtZW50LiAgKi8KK3N0YXRpYyBmcmFnUyAqcHBjX3RvY19mcmFnOworCisvKiBUaGUgZmlyc3QgZnJhZyBpbiB0aGUgZmlyc3Qgc3Vic2VnbWVudCBhZnRlciB0aGUgVE9DIGluIHRoZSAuZGF0YQorICAgc2VnbWVudC4gIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHN1YnNlZ21lbnRzIGFmdGVyIHRoZSBUT0MuICAqLworc3RhdGljIGZyYWdTICpwcGNfYWZ0ZXJfdG9jX2ZyYWc7CisKKy8qIFRoZSBjdXJyZW50IHN0YXRpYyBibG9jay4gICovCitzdGF0aWMgc3ltYm9sUyAqcHBjX2N1cnJlbnRfYmxvY2s7CisKKy8qIFRoZSBDT0ZGIGRlYnVnZ2luZyBzZWN0aW9uOyBzZXQgYnkgbWRfYmVnaW4uICBUaGlzIGlzIG5vdCB0aGUKKyAgIC5kZWJ1ZyBzZWN0aW9uLCBidXQgaXMgaW5zdGVhZCB0aGUgc2VjcmV0IEJGRCBzZWN0aW9uIHdoaWNoIHdpbGwKKyAgIGNhdXNlIEJGRCB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyIG9mIGEgc3ltYm9sIHRvIE5fREVCVUcuICAqLworc3RhdGljIGFzZWN0aW9uICpwcGNfY29mZl9kZWJ1Z19zZWN0aW9uOworCisjZW5kaWYgLyogT0JKX1hDT0ZGICovCisKKyNpZmRlZiBURV9QRQorCisvKiBWYXJpb3VzIHNlY3Rpb25zIHRoYXQgd2UgbmVlZCBmb3IgUEUgY29mZiBzdXBwb3J0LiAgKi8KK3N0YXRpYyBzZWdUIHlkYXRhX3NlY3Rpb247CitzdGF0aWMgc2VnVCBwZGF0YV9zZWN0aW9uOworc3RhdGljIHNlZ1QgcmVsZGF0YV9zZWN0aW9uOworc3RhdGljIHNlZ1QgcmRhdGFfc2VjdGlvbjsKK3N0YXRpYyBzZWdUIHRvY2RhdGFfc2VjdGlvbjsKKworLyogVGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgdGhlIHByZXZpb3VzIHNlY3Rpb24uIFNlZSBwcGNfcHJldmlvdXMuICovCitzdGF0aWMgc2VnVCBwcGNfcHJldmlvdXNfc2VjdGlvbjsKK3N0YXRpYyBzZWdUIHBwY19jdXJyZW50X3NlY3Rpb247CisKKyNlbmRpZiAvKiBURV9QRSAqLworCisjaWZkZWYgT0JKX0VMRgorc3ltYm9sUyAqR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRSIgKi8KKyNlbmRpZiAvKiBPQkpfRUxGICovCisMCisjaWZkZWYgT0JKX0VMRgorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImI6bDp1c206SzpWUToiOworI2Vsc2UKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJ1bToiOworI2VuZGlmCitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7CisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAndSc6CisgICAgICAvKiAtdSBtZWFucyB0aGF0IGFueSB1bmRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgdHJlYXRlZCBhcworCSBleHRlcm5hbCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIGdhcyBhbnlob3cuICAqLworICAgICAgYnJlYWs7CisKKyNpZmRlZiBPQkpfRUxGCisgICAgY2FzZSAnbCc6CisgICAgICAvKiBTb2xhcmlzIGFzIHRha2VzIC1sZSAocHJlc3VtYWJseSBmb3IgbGl0dGxlIGVuZGlhbikuICBGb3IgY29tcGxldGVuZXNzCisgICAgICAgICBzYWtlLCByZWNvZ25pemUgLWJlIGFsc28uICAqLworICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiZSIpID09IDApCisJeworCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOworCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdiJzoKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgImUiKSA9PSAwKQorCXsKKwkgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKKwkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnSyc6CisgICAgICAvKiBSZWNvZ25pemUgLUsgUElDICovCisgICAgICBpZiAoc3RyY21wIChhcmcsICJQSUMiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAicGljIikgPT0gMCkKKwl7CisJICBzaGxpYiA9IFNITElCX1BJQzsKKwkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEVfTElCOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGNhc2UgJ20nOgorICAgICAgLyogLW1wd3J4IGFuZCAtbXB3cjIgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlIElCTSBQT1dFUi8yCisgICAgICAgICAoUklPUzIpLiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInB3cngiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAicHdyMiIpID09IDApCisJcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMjsKKyAgICAgIC8qIC1tcHdyIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgSUJNIFBPV0VSIChSSU9TMSkuICAqLworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwd3IiKSA9PSAwKQorCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOworICAgICAgLyogLW02MDEgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSwgd2hpY2ggaW5jbHVkZXMKKyAgICAgICAgIGluc3RydWN0aW9ucyB0aGF0IGFyZSBob2xkb3ZlcnMgZnJvbSB0aGUgUG93ZXIuICovCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIjYwMSIpID09IDApCisJcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDE7CisgICAgICAvKiAtbXBwYywgLW1wcGMzMiwgLW02MDMsIGFuZCAtbTYwNCBtZWFuIHRvIGFzc2VtYmxlIGZvciB0aGUKKyAgICAgICAgIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNC4gICovCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInBwYyIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChhcmcsICJwcGMzMiIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChhcmcsICI0MDMiKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNjAzIikgPT0gMAorCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjYwNCIpID09IDApCisJcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDOworICAgICAgLyogLW1wcGM2NCBhbmQgLW02MjAgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlIDY0LWJpdCBQb3dlclBDCisgICAgICAgICA2MjAuICAqLworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGM2NCIpID09IDAgfHwgc3RyY21wIChhcmcsICI2MjAiKSA9PSAwKQorCXsKKwkgIHBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKKwkgIHBwY19zaXplID0gUFBDX09QQ09ERV82NDsKKwl9CisgICAgICAvKiAtbWNvbSBtZWFucyBhc3NlbWJsZSBmb3IgdGhlIGNvbW1vbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiBQb3dlcgorCSBhbmQgUG93ZXJQQy4gIEF0IHByZXNlbnQsIHdlIGp1c3QgYWxsb3cgdGhlIHVuaW9uLCByYXRoZXIKKwkgdGhhbiB0aGUgaW50ZXJzZWN0aW9uLiAgKi8KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAiY29tIikgPT0gMCkKKwlwcGNfY3B1ID0gUFBDX09QQ09ERV9DT01NT047CisgICAgICAvKiAtbWFueSBtZWFucyB0byBhc3NlbWJsZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKS4gICovCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImFueSIpID09IDApCisJcHBjX2NwdSA9IFBQQ19PUENPREVfQU5ZOworCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlZ25hbWVzIikgPT0gMCkKKwlyZWdfbmFtZXNfcCA9IHRydWU7CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tcmVnbmFtZXMiKSA9PSAwKQorCXJlZ19uYW1lc19wID0gZmFsc2U7CisKKyNpZmRlZiBPQkpfRUxGCisgICAgICAvKiAtbXJlbG9jYXRhYmxlLy1tcmVsb2NhdGFibGUtbGliIC0tIHdhcm4gYWJvdXQgaW5pdGlhbGl6YXRpb25zIHRoYXQgcmVxdWlyZSByZWxvY2F0aW9uICovCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlIikgPT0gMCkKKwl7CisJICBzaGxpYiA9IFNISUxCX01SRUxPQ0FUQUJMRTsKKwkgIHBwY19mbGFncyB8PSBFRl9QUENfUkVMT0NBVEFCTEU7CisJfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInJlbG9jYXRhYmxlLWxpYiIpID09IDApCisJeworCSAgc2hsaWIgPSBTSElMQl9NUkVMT0NBVEFCTEU7CisJICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKKwl9CisKKyAgICAgIC8qIC1tZW1iLCBzZXQgZW1iZWRkZWQgYml0ICovCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImVtYiIpID09IDApCisJcHBjX2ZsYWdzIHw9IEVGX1BQQ19FTUI7CisKKyAgICAgIC8qIC1tbGl0dGxlLy1tYmlnIHNldCB0aGUgZW5kaWFuZXNzICovCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImxpdHRsZSIpID09IDAgfHwgc3RyY21wIChhcmcsICJsaXR0bGUtZW5kaWFuIikgPT0gMCkKKwl7CisJICB0YXJnZXRfYmlnX2VuZGlhbiA9IDA7CisJICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7CisJfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImJpZyIpID09IDAgfHwgc3RyY21wIChhcmcsICJiaWctZW5kaWFuIikgPT0gMCkKKwl7CisJICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7CisJICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7CisJfQorCisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInNvbGFyaXMiKSA9PSAwKQorCXsKKwkgIG1zb2xhcmlzID0gdHJ1ZTsKKwkgIHBwY19jb21tZW50X2NoYXJzID0gcHBjX3NvbGFyaXNfY29tbWVudF9jaGFyczsKKwl9CisKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8tc29sYXJpcyIpID09IDApCisJeworCSAgbXNvbGFyaXMgPSBmYWxzZTsKKwkgIHBwY19jb21tZW50X2NoYXJzID0gcHBjX2VhYmlfY29tbWVudF9jaGFyczsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBhc19iYWQgKF8oImludmFsaWQgc3dpdGNoIC1tJXMiKSwgYXJnKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGJyZWFrOworCisjaWZkZWYgT0JKX0VMRgorICAgICAgLyogLVY6IFNWUjQgYXJndW1lbnQgdG8gcHJpbnQgdmVyc2lvbiBJRC4gICovCisgICAgY2FzZSAnVic6CisgICAgICBwcmludF92ZXJzaW9uX2lkICgpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIC1ReSwgLVFuOiBTVlI0IGFyZ3VtZW50cyBjb250cm9sbGluZyB3aGV0aGVyIGEgLmNvbW1lbnQgc2VjdGlvbgorCSBzaG91bGQgYmUgZW1pdHRlZCBvciBub3QuICBGSVhNRTogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICBjYXNlICdRJzoKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTb2xhcmlzIHRha2VzIC1zIHRvIHNwZWNpZnkgdGhhdCAuc3RhYnMgZ28gaW4gYSAuc3RhYnMgc2VjdGlvbiwKKwkgcmF0aGVyIHRoYW4gLnN0YWJzLmV4Y2wsIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlIGxpbmtlci4KKwkgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgY2FzZSAncyc6CisgICAgICBpZiAoYXJnKQorCXJldHVybiAwOworCisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGZwcmludGYoc3RyZWFtLCBfKCJcCitQb3dlclBDIG9wdGlvbnM6XG5cCistdQkJCWlnbm9yZWRcblwKKy1tcHdyeCwgLW1wd3IyCQlnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIvMiAoUklPUzIpXG5cCistbXB3cgkJCWdlbmVyYXRlIGNvZGUgZm9yIElCTSBQT1dFUiAoUklPUzEpXG5cCistbTYwMQkJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAxXG5cCistbXBwYywgLW1wcGMzMiwgLW00MDMsIC1tNjAzLCAtbTYwNFxuXAorCQkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDMvNjA0XG5cCistbXBwYzY0LCAtbTYyMAkJZ2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MjBcblwKKy1tY29tCQkJZ2VuZXJhdGUgY29kZSBQb3dlci9Qb3dlclBDIGNvbW1vbiBpbnN0cnVjdGlvbnNcblwKKy1tYW55CQkJZ2VuZXJhdGUgY29kZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKVxuXAorLW1yZWduYW1lcwkJQWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuXAorLW1uby1yZWduYW1lcwkJRG8gbm90IGFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcbiIpKTsKKyNpZmRlZiBPQkpfRUxGCisgIGZwcmludGYoc3RyZWFtLCBfKCJcCistbXJlbG9jYXRhYmxlCQlzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUgb3B0aW9uXG5cCistbXJlbG9jYXRhYmxlLWxpYglzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUtbGliIG9wdGlvblxuXAorLW1lbWIJCQlzZXQgUFBDX0VNQiBiaXQgaW4gRUxGIGZsYWdzXG5cCistbWxpdHRsZSwgLW1saXR0bGUtZW5kaWFuXG5cCisJCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuXAorLW1iaWcsIC1tYmlnLWVuZGlhbglnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuXAorLW1zb2xhcmlzCQlnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG5cCistbW5vLXNvbGFyaXMJCWRvIG5vdCBnZW5lcmF0ZSBjb2RlIGZvciBTb2xhcmlzXG5cCistVgkJCXByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuXAorLVF5LCAtUW4JCWlnbm9yZWRcbiIpKTsKKyNlbmRpZgorfQorDAorLyogU2V0IHBwY19jcHUgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19zZXRfY3B1ICgpCit7CisgIGNvbnN0IGNoYXIgKmRlZmF1bHRfb3MgID0gVEFSR0VUX09TOworICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7CisKKyAgaWYgKHBwY19jcHUgPT0gMCkKKyAgICB7CisgICAgICBpZiAoc3RybmNtcCAoZGVmYXVsdF9vcywgImFpeCIsIDMpID09IDAKKwkgICYmIGRlZmF1bHRfb3NbM10gPj0gJzQnICYmIGRlZmF1bHRfb3NbM10gPD0gJzknKQorCXBwY19jcHUgPSBQUENfT1BDT0RFX0NPTU1PTjsKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGRlZmF1bHRfb3MsICJhaXgzIiwgNCkgPT0gMCkKKwlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJyczYwMDAiKSA9PSAwKQorCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSOworICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGMiKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjbGUiKSA9PSAwKQorCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKKyAgICAgIGVsc2UKKwlhc19mYXRhbCAoXygiVW5rbm93biBkZWZhdWx0IGNwdSA9ICVzLCBvcyA9ICVzIiksIGRlZmF1bHRfY3B1LCBkZWZhdWx0X29zKTsKKyAgICB9Cit9CisKKy8qIEZpZ3VyZSBvdXQgdGhlIEJGRCBhcmNoaXRlY3R1cmUgdG8gdXNlLiAgKi8KKworZW51bSBiZmRfYXJjaGl0ZWN0dXJlCitwcGNfYXJjaCAoKQoreworICBjb25zdCBjaGFyICpkZWZhdWx0X2NwdSA9IFRBUkdFVF9DUFU7CisgIHBwY19zZXRfY3B1ICgpOworCisgIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfUFBDKSAhPSAwKQorICAgIHJldHVybiBiZmRfYXJjaF9wb3dlcnBjOworICBlbHNlIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfUE9XRVIpICE9IDApCisgICAgcmV0dXJuIGJmZF9hcmNoX3JzNjAwMDsKKyAgZWxzZSBpZiAoKHBwY19jcHUgJiAoUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSkpICE9IDApCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJyczYwMDAiKSA9PSAwKQorCXJldHVybiBiZmRfYXJjaF9yczYwMDA7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwYyIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGNsZSIpID09IDApCisJcmV0dXJuIGJmZF9hcmNoX3Bvd2VycGM7CisgICAgfQorCisgIGFzX2ZhdGFsIChfKCJOZWl0aGVyIFBvd2VyIG5vciBQb3dlclBDIG9wY29kZXMgd2VyZSBzZWxlY3RlZC4iKSk7CisgIHJldHVybiBiZmRfYXJjaF91bmtub3duOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzIHVwLiAgSXQgaXMgY2FsbGVkCisgICBhZnRlciB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkIGFuZCB0aGUgb3V0cHV0IGZpbGUgaGFzIGJlZW4KKyAgIG9wZW5lZC4gICovCisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3A7CisgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3BfZW5kOworICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm87CisgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNyb19lbmQ7CisgIGJvb2xlYW4gZHVwX2luc24gPSBmYWxzZTsKKworICBwcGNfc2V0X2NwdSAoKTsKKworI2lmZGVmIE9CSl9FTEYKKyAgLyogU2V0IHRoZSBFTEYgZmxhZ3MgaWYgZGVzaXJlZC4gKi8KKyAgaWYgKHBwY19mbGFncyAmJiAhbXNvbGFyaXMpCisgICAgYmZkX3NldF9wcml2YXRlX2ZsYWdzIChzdGRvdXRwdXQsIHBwY19mbGFncyk7CisjZW5kaWYKKworICAvKiBJbnNlcnQgdGhlIG9wY29kZXMgaW50byBhIGhhc2ggdGFibGUuICAqLworICBwcGNfaGFzaCA9IGhhc2hfbmV3ICgpOworCisgIG9wX2VuZCA9IHBvd2VycGNfb3Bjb2RlcyArIHBvd2VycGNfbnVtX29wY29kZXM7CisgIGZvciAob3AgPSBwb3dlcnBjX29wY29kZXM7IG9wIDwgb3BfZW5kOyBvcCsrKQorICAgIHsKKyAgICAgIGtub3cgKChvcC0+b3Bjb2RlICYgb3AtPm1hc2spID09IG9wLT5vcGNvZGUpOworCisgICAgICBpZiAoKG9wLT5mbGFncyAmIHBwY19jcHUpICE9IDAKKwkgICYmICgob3AtPmZsYWdzICYgKFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFXzY0KSkgPT0gMAorCSAgICAgIHx8IChvcC0+ZmxhZ3MgJiAoUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfNjQpKSA9PSBwcGNfc2l6ZSkpCisJeworCSAgY29uc3QgY2hhciAqcmV0dmFsOworCisJICByZXR2YWwgPSBoYXNoX2luc2VydCAocHBjX2hhc2gsIG9wLT5uYW1lLCAoUFRSKSBvcCk7CisJICBpZiAocmV0dmFsICE9IChjb25zdCBjaGFyICopIE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBJZ25vcmUgUG93ZXIgZHVwbGljYXRlcyBmb3IgLW02MDEgKi8KKwkgICAgICBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFXzYwMSkgIT0gMAorCQkgICYmIChvcC0+ZmxhZ3MgJiBQUENfT1BDT0RFX1BPV0VSKSAhPSAwKQorCQljb250aW51ZTsKKworCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBpbnN0cnVjdGlvbiAlcyIpLCBvcC0+bmFtZSk7CisJICAgICAgZHVwX2luc24gPSB0cnVlOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBJbnNlcnQgdGhlIG1hY3JvcyBpbnRvIGEgaGFzaCB0YWJsZS4gICovCisgIHBwY19tYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgbWFjcm9fZW5kID0gcG93ZXJwY19tYWNyb3MgKyBwb3dlcnBjX251bV9tYWNyb3M7CisgIGZvciAobWFjcm8gPSBwb3dlcnBjX21hY3JvczsgbWFjcm8gPCBtYWNyb19lbmQ7IG1hY3JvKyspCisgICAgeworICAgICAgaWYgKChtYWNyby0+ZmxhZ3MgJiBwcGNfY3B1KSAhPSAwKQorCXsKKwkgIGNvbnN0IGNoYXIgKnJldHZhbDsKKworCSAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKHBwY19tYWNyb19oYXNoLCBtYWNyby0+bmFtZSwgKFBUUikgbWFjcm8pOworCSAgaWYgKHJldHZhbCAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIG1hY3JvICVzIiksIG1hY3JvLT5uYW1lKTsKKwkgICAgICBkdXBfaW5zbiA9IHRydWU7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChkdXBfaW5zbikKKyAgICBhYm9ydCAoKTsKKworICAvKiBUZWxsIHRoZSBtYWluIGNvZGUgd2hhdCB0aGUgZW5kaWFubmVzcyBpcyBpZiBpdCBpcyBub3Qgb3ZlcmlkZGVuIGJ5IHRoZSB1c2VyLiAgKi8KKyAgaWYgKCFzZXRfdGFyZ2V0X2VuZGlhbikKKyAgICB7CisgICAgICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7CisgICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IFBQQ19CSUdfRU5ESUFOOworICAgIH0KKworI2lmZGVmIE9CSl9YQ09GRgorICBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChzdGRvdXRwdXQsIE5fREVCVUcpOworCisgIC8qIENyZWF0ZSBkdW1teSBzeW1ib2xzIHRvIHNlcnZlIGFzIGluaXRpYWwgY3NlY3RzLiAgVGhpcyBmb3JjZXMgdGhlCisgICAgIHRleHQgY3NlY3RzIHRvIHByZWNlZGUgdGhlIGRhdGEgY3NlY3RzLiAgVGhlc2Ugc3ltYm9scyB3aWxsIG5vdAorICAgICBiZSBvdXRwdXQuICAqLworICBwcGNfdGV4dF9jc2VjdHMgPSBzeW1ib2xfbWFrZSAoImR1bW15XDAwMSIpOworICBwcGNfdGV4dF9jc2VjdHMtPnN5X3RjLndpdGhpbiA9IHBwY190ZXh0X2NzZWN0czsKKyAgcHBjX2RhdGFfY3NlY3RzID0gc3ltYm9sX21ha2UgKCJkdW1teVwwMDEiKTsKKyAgcHBjX2RhdGFfY3NlY3RzLT5zeV90Yy53aXRoaW4gPSBwcGNfZGF0YV9jc2VjdHM7CisjZW5kaWYKKworI2lmZGVmIFRFX1BFCisKKyAgcHBjX2N1cnJlbnRfc2VjdGlvbiA9IHRleHRfc2VjdGlvbjsKKyAgcHBjX3ByZXZpb3VzX3NlY3Rpb24gPSAwOyAgCisKKyNlbmRpZgorfQorCisvKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3BwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIG9mZnNldFQgdmFsOworICAgICBjaGFyICpmaWxlOworICAgICB1bnNpZ25lZCBpbnQgbGluZTsKK3sKKyAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCisgICAgeworICAgICAgbG9uZyBtaW4sIG1heDsKKyAgICAgIG9mZnNldFQgdGVzdDsKKworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMCkKKwl7CisJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTk9QVCkgIT0gMAorCSAgICAgICYmIHBwY19zaXplID09IFBQQ19PUENPREVfMzIpCisJICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKKwkgIGVsc2UKKwkgICAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOworCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKKworCSAgaWYgKHBwY19zaXplID09IFBQQ19PUENPREVfMzIpCisJICAgIHsKKwkgICAgICAvKiBTb21lIHBlb3BsZSB3cml0ZSAzMiBiaXQgaGV4IGNvbnN0YW50cyB3aXRoIHRoZSBzaWduCisJCSBleHRlbnNpb24gZG9uZSBieSBoYW5kLiAgVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGJlCisJCSB2YWxpZCwgYnV0LCB0byBwZXJtaXQgdGhpcyBjb2RlIHRvIGFzc2VtYmxlIG9uIGEgNjQKKwkJIGJpdCBob3N0LCB3ZSBzaWduIGV4dGVuZCB0aGUgMzIgYml0IHZhbHVlLiAgKi8KKwkgICAgICBpZiAodmFsID4gMAorCQkgICYmICh2YWwgJiAweDgwMDAwMDAwKSAhPSAwCisJCSAgJiYgKHZhbCAmIDB4ZmZmZmZmZmYpID09IHZhbCkKKwkJeworCQkgIHZhbCAtPSAweDgwMDAwMDAwOworCQkgIHZhbCAtPSAweDgwMDAwMDAwOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOworCSAgbWluID0gMDsKKwl9CisKKyAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORUdBVElWRSkgIT0gMCkKKwl0ZXN0ID0gLSB2YWw7CisgICAgICBlbHNlCisJdGVzdCA9IHZhbDsKKworICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQorCXsKKwkgIGNvbnN0IGNoYXIgKmVyciA9CisJICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKKwkgIGNoYXIgYnVmWzEwMF07CisKKwkgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKKwkgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCisJICAgIGFzX2JhZCAoZXJyLCBidWYsIG1pbiwgbWF4KTsKKwkgIGVsc2UKKwkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOworCX0KKyAgICB9CisKKyAgaWYgKG9wZXJhbmQtPmluc2VydCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICplcnJtc2c7CisKKyAgICAgIGVycm1zZyA9IE5VTEw7CisgICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAobG9uZykgdmFsLCAmZXJybXNnKTsKKyAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKKwlhc19iYWQgKGVycm1zZyk7CisgICAgfQorICBlbHNlCisgICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKKwkgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKKworICByZXR1cm4gaW5zbjsKK30KKworDAorI2lmZGVmIE9CSl9FTEYKKy8qIFBhcnNlIEBnb3QsIGV0Yy4gYW5kIHJldHVybiB0aGUgZGVzaXJlZCByZWxvY2F0aW9uLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKK3BwY19lbGZfc3VmZml4IChzdHJfcCwgZXhwX3ApCisgICAgIGNoYXIgKipzdHJfcDsKKyAgICAgZXhwcmVzc2lvblMgKmV4cF9wOworeworICBzdHJ1Y3QgbWFwX2JmZCB7CisgICAgY2hhciAqc3RyaW5nOworICAgIGludCBsZW5ndGg7CisgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworICB9OworCisgIGNoYXIgaWRlbnRbMjBdOworICBjaGFyICpzdHIgPSAqc3RyX3A7CisgIGNoYXIgKnN0cjI7CisgIGludCBjaDsKKyAgaW50IGxlbjsKKyAgc3RydWN0IG1hcF9iZmQgKnB0cjsKKworI2RlZmluZSBNQVAoc3RyLHJlbG9jKSB7IHN0ciwgc2l6ZW9mKHN0ciktMSwgcmVsb2MgfQorCisgIHN0YXRpYyBzdHJ1Y3QgbWFwX2JmZCBtYXBwaW5nW10gPSB7CisgICAgTUFQICgibCIsCQlCRkRfUkVMT0NfTE8xNiksCisgICAgTUFQICgiaCIsCQlCRkRfUkVMT0NfSEkxNiksCisgICAgTUFQICgiaGEiLAkJQkZEX1JFTE9DX0hJMTZfUyksCisgICAgTUFQICgiYnJ0YWtlbiIsCUJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4pLAorICAgIE1BUCAoImJybnRha2VuIiwJQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4pLAorICAgIE1BUCAoImdvdCIsCQlCRkRfUkVMT0NfMTZfR09UT0ZGKSwKKyAgICBNQVAgKCJnb3RAbCIsCUJGRF9SRUxPQ19MTzE2X0dPVE9GRiksCisgICAgTUFQICgiZ290QGgiLAlCRkRfUkVMT0NfSEkxNl9HT1RPRkYpLAorICAgIE1BUCAoImdvdEBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGKSwKKyAgICBNQVAgKCJmaXh1cCIsCUJGRF9SRUxPQ19DVE9SKSwJCS8qIHdhcm5pbmdzIHdpdGggLW1yZWxvY2F0YWJsZSAqLworICAgIE1BUCAoInBsdCIsCQlCRkRfUkVMT0NfMjRfUExUX1BDUkVMKSwKKyAgICBNQVAgKCJwbHRyZWwyNCIsCUJGRF9SRUxPQ18yNF9QTFRfUENSRUwpLAorICAgIE1BUCAoImNvcHkiLAlCRkRfUkVMT0NfUFBDX0NPUFkpLAorICAgIE1BUCAoImdsb2JkYXQiLAlCRkRfUkVMT0NfUFBDX0dMT0JfREFUKSwKKyAgICBNQVAgKCJsb2NhbDI0cGMiLAlCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyksCisgICAgTUFQICgibG9jYWwiLAlCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyksCisgICAgTUFQICgicGx0cmVsIiwJQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCksCisgICAgTUFQICgicGx0QGwiLAlCRkRfUkVMT0NfTE8xNl9QTFRPRkYpLAorICAgIE1BUCAoInBsdEBoIiwJQkZEX1JFTE9DX0hJMTZfUExUT0ZGKSwKKyAgICBNQVAgKCJwbHRAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiksCisgICAgTUFQICgic2RhcmVsIiwJQkZEX1JFTE9DX0dQUkVMMTYpLAorICAgIE1BUCAoInNlY3RvZmYiLAlCRkRfUkVMT0NfMzJfQkFTRVJFTCksCisgICAgTUFQICgic2VjdG9mZkBsIiwJQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCksCisgICAgTUFQICgic2VjdG9mZkBoIiwJQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCksCisgICAgTUFQICgic2VjdG9mZkBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCksCisgICAgTUFQICgibmFkZHIiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyKSwKKyAgICBNQVAgKCJuYWRkcjE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiksCisgICAgTUFQICgibmFkZHJAbCIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8pLAorICAgIE1BUCAoIm5hZGRyQGgiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJKSwKKyAgICBNQVAgKCJuYWRkckBoYSIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEpLAorICAgIE1BUCAoInNkYWkxNiIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiksCisgICAgTUFQICgic2RhMnJlbCIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwpLAorICAgIE1BUCAoInNkYTJpMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2KSwKKyAgICBNQVAgKCJzZGEyMSIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTIxKSwKKyAgICBNQVAgKCJtcmtyZWYiLAlCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYpLAorICAgIE1BUCAoInJlbHNlY3QiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiksCisgICAgTUFQICgicmVsc2VjdEBsIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8pLAorICAgIE1BUCAoInJlbHNlY3RAaCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJKSwKKyAgICBNQVAgKCJyZWxzZWN0QGhhIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEpLAorICAgIE1BUCAoImJpdGZsZCIsCUJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQpLAorICAgIE1BUCAoInJlbHNkYSIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQSksCisgICAgTUFQICgieGdvdCIsCUJGRF9SRUxPQ19QUENfVE9DMTYpLAorCisgICAgeyAoY2hhciAqKTAsCTAsCUJGRF9SRUxPQ19VTlVTRUQgfQorICB9OworCisgIGlmICgqc3RyKysgIT0gJ0AnKQorICAgIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOworCisgIGZvciAoY2ggPSAqc3RyLCBzdHIyID0gaWRlbnQ7CisgICAgICAgKHN0cjIgPCBpZGVudCArIHNpemVvZiAoaWRlbnQpIC0gMQorCSYmIChpc2FsbnVtIChjaCkgfHwgY2ggPT0gJ0AnKSk7CisgICAgICAgY2ggPSAqKytzdHIpCisgICAgeworICAgICAgKnN0cjIrKyA9IChpc2xvd2VyIChjaCkpID8gY2ggOiB0b2xvd2VyIChjaCk7CisgICAgfQorCisgICpzdHIyID0gJ1wwJzsKKyAgbGVuID0gc3RyMiAtIGlkZW50OworCisgIGNoID0gaWRlbnRbMF07CisgIGZvciAocHRyID0gJm1hcHBpbmdbMF07IHB0ci0+bGVuZ3RoID4gMDsgcHRyKyspCisgICAgaWYgKGNoID09IHB0ci0+c3RyaW5nWzBdCisJJiYgbGVuID09IHB0ci0+bGVuZ3RoCisJJiYgbWVtY21wIChpZGVudCwgcHRyLT5zdHJpbmcsIHB0ci0+bGVuZ3RoKSA9PSAwKQorICAgICAgeworCWlmIChleHBfcC0+WF9hZGRfbnVtYmVyICE9IDAKKwkgICAgJiYgKHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DXzE2X0dPVE9GRgorCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19MTzE2X0dPVE9GRgorCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgorCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGKSkKKwkgIGFzX3dhcm4gKF8oImlkZW50aWZpZXIrY29uc3RhbnRAZ290IG1lYW5zIGlkZW50aWZpZXJAZ290K2NvbnN0YW50IikpOworCisJLyogTm93IGNoZWNrIGZvciBpZGVudGlmaWVyQHN1ZmZpeCtjb25zdGFudCAqLworCWlmICgqc3RyID09ICctJyB8fCAqc3RyID09ICcrJykKKwkgIHsKKwkgICAgY2hhciAqb3JpZ19saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgICBleHByZXNzaW9uUyBuZXdfZXhwOworCisJICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKwkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOworCSAgICBpZiAobmV3X2V4cC5YX29wID09IE9fY29uc3RhbnQpCisJICAgICAgeworCQlleHBfcC0+WF9hZGRfbnVtYmVyICs9IG5ld19leHAuWF9hZGRfbnVtYmVyOworCQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgfQorCisJICAgIGlmICgmaW5wdXRfbGluZV9wb2ludGVyICE9IHN0cl9wKQorCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9yaWdfbGluZTsKKwkgIH0KKworCSpzdHJfcCA9IHN0cjsKKwlyZXR1cm4gcHRyLT5yZWxvYzsKKyAgICAgIH0KKworICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKK30KKworLyogTGlrZSBub3JtYWwgLmxvbmcvLnNob3J0Ly53b3JkLCBleGNlcHQgc3VwcG9ydCBAZ290LCBldGMuICovCisvKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyAqLworLyogZW5kLW9mLWxpbmUuICovCitzdGF0aWMgdm9pZAorcHBjX2VsZl9jb25zIChuYnl0ZXMpCisgICAgIHJlZ2lzdGVyIGludCBuYnl0ZXM7CS8qIDE9LmJ5dGUsIDI9LndvcmQsIDQ9LmxvbmcgKi8KK3sKKyAgZXhwcmVzc2lvblMgZXhwOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CisKKyAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisgICAgeworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZG8KKyAgICB7CisgICAgICBleHByZXNzaW9uICgmZXhwKTsKKyAgICAgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbAorCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKKwkgICYmIChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmaW5wdXRfbGluZV9wb2ludGVyLCAmZXhwKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKKwl7CisJICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7CisJICBpbnQgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOworCisJICBpZiAoc2l6ZSA+IG5ieXRlcykKKwkgICAgYXNfYmFkIChfKCIlcyByZWxvY2F0aW9ucyBkbyBub3QgZml0IGluICVkIGJ5dGVzXG4iKSwgcmVsb2NfaG93dG8tPm5hbWUsIG5ieXRlcyk7CisKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJlZ2lzdGVyIGNoYXIgKnAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7CisJICAgICAgaW50IG9mZnNldCA9IG5ieXRlcyAtIHNpemU7CisKKwkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwgJmV4cCwgMCwgcmVsb2MpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCWVtaXRfZXhwciAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKKyAgICB9CisgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKKworICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFNvbGFyaXMgcHNlZHVvIG9wIHRvIGNoYW5nZSB0byB0aGUgLnJvZGF0YSBzZWN0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcGNfZWxmX3JkYXRhICh4eHgpCisgICAgIGludCB4eHg7Cit7CisgIGNoYXIgKnNhdmVfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgc3RhdGljIGNoYXIgc2VjdGlvbltdID0gIi5yb2RhdGFcbiI7CisKKyAgLyogSnVzdCBwcmV0ZW5kIHRoaXMgaXMgLnNlY3Rpb24gLnJvZGF0YSAqLworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzZWN0aW9uOworICBvYmpfZWxmX3NlY3Rpb24gKHh4eCk7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9saW5lOworfQorCisvKiBQc2V1ZG8gb3AgdG8gbWFrZSBmaWxlIHNjb3BlIGJzcyBpdGVtcyAqLworc3RhdGljIHZvaWQKK3BwY19lbGZfbGNvbW0oeHh4KQorICAgICBpbnQgeHh4OworeworICByZWdpc3RlciBjaGFyICpuYW1lOworICByZWdpc3RlciBjaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIG9mZnNldFQgc2l6ZTsKKyAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKKyAgb2Zmc2V0VCBhbGlnbjsKKyAgc2VnVCBvbGRfc2VjOworICBpbnQgb2xkX3N1YnNlYzsKKyAgY2hhciAqcGZyYWc7CisgIGludCBhbGlnbjI7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLworICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqcCA9IGM7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KKyAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSBzaXplKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAubGNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICBhbGlnbiA9IDg7CisgIGVsc2UKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBpZiAoYWxpZ24gPD0gMCkKKwl7CisJICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOworCSAgYWxpZ24gPSA4OworCX0KKyAgICB9CisKKyAgKnAgPSAwOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICpwID0gYzsKKworICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAorCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCisgICAgeworICAgICAgYXNfYmFkIChfKCJMZW5ndGggb2YgLmxjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAorCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLAorCSAgICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCisJICAgICAgKGxvbmcpIHNpemUpOworCisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBhbGxvY2F0ZV9ic3M6ICovCisgIG9sZF9zZWMgPSBub3dfc2VnOworICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKKyAgaWYgKGFsaWduKQorICAgIHsKKyAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLworICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKythbGlnbjIpOworICAgICAgaWYgKGFsaWduICE9IDEpCisJeworCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBhbGlnbjIgPSAwOworCisgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbjIpOworICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7CisgIGlmIChhbGlnbjIpCisgICAgZnJhZ19hbGlnbiAoYWxpZ24yLCAwLCAwKTsKKyAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQorICAgIHN5bWJvbFAtPnN5X2ZyYWctPmZyX3N5bWJvbCA9IDA7CisgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKyAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLCBzaXplLAorCQkgICAgKGNoYXIgKikgMCk7CisgICpwZnJhZyA9IDA7CisgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOworICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7CisgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBWYWxpZGF0ZSBhbnkgcmVsb2NhdGlvbnMgZW1pdHRlZCBmb3IgLW1yZWxvY2F0YWJsZSwgcG9zc2libHkgYWRkaW5nCisgICBmaXh1cHMgZm9yIHdvcmQgcmVsb2NhdGlvbnMgaW4gd3JpdGFibGUgc2VnbWVudHMsIHNvIHdlIGNhbiBhZGp1c3QKKyAgIHRoZW0gYXQgcnVudGltZS4gICovCitzdGF0aWMgdm9pZAorcHBjX2VsZl92YWxpZGF0ZV9maXggKGZpeHAsIHNlZykKKyAgICAgZml4UyAqZml4cDsKKyAgICAgc2VnVCBzZWc7Cit7CisgIGlmIChmaXhwLT5meF9kb25lIHx8IGZpeHAtPmZ4X3BjcmVsKQorICAgIHJldHVybjsKKworICBzd2l0Y2ggKHNobGliKQorICAgIHsKKyAgICBjYXNlIFNITElCX05PTkU6CisgICAgY2FzZSBTSExJQl9QSUM6CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIFNISUxCX01SRUxPQ0FUQUJMRToKKyAgICAgIGlmIChmaXhwLT5meF9yX3R5cGUgPD0gQkZEX1JFTE9DX1VOVVNFRAorCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18xNl9HT1RPRkYKKwkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYKKwkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKKwkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRgorCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9CQVNFUkVMCisJICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAorCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0JBU0VSRUwKKwkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwKKwkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmdvdDIiKSAhPSAwCisJICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5kdG9ycyIpICE9IDAKKwkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmN0b3JzIikgIT0gMAorCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZml4dXAiKSAhPSAwCisJICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5zdGFiIikgIT0gMAorCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZ2NjX2V4Y2VwdF90YWJsZSIpICE9IDAKKwkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmVoX2ZyYW1lIikgIT0gMAorCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZXhfc2hhcmVkIikgIT0gMCkKKwl7CisJICBpZiAoKHNlZy0+ZmxhZ3MgJiAoU0VDX1JFQURPTkxZIHwgU0VDX0NPREUpKSAhPSAwCisJICAgICAgfHwgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19DVE9SKQorCSAgICB7CisJICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorCQkJICAgIF8oIlJlbG9jYXRpb24gY2Fubm90IGJlIGRvbmUgd2hlbiB1c2luZyAtbXJlbG9jYXRhYmxlIikpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuOworICAgIH0KK30KKyNlbmRpZiAvKiBPQkpfRUxGICovCisMCisjaWZkZWYgVEVfUEUKKworLyoKKyAqIFN1bW1hcnkgb2YgcGFyc2VfdG9jX2VudHJ5KCkuCisgKgorICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gdGhlICdbJyBpbiBvbmUgb2Y6CisgKgorICogICAgICAgIFt0b2NdIFt0b2N2XSBbdG9jMzJdIFt0b2M2NF0KKyAqCisgKiAgICAgIEFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3Igb2Ygb25lIGtpbmQgb3IgYW5vdGhlci4KKyAqCisgKiBvdXQ6CQorICogICByZXR1cm4gdmFsdWU6IHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICogICB0b2Nfa2luZDogICAgIGtpbmQgb2YgdG9jIHJlZmVyZW5jZQorICogICBpbnB1dF9saW5lX3BvaW50ZXI6CisgKiAgICAgc3VjY2VzczogZmlyc3QgY2hhciBhZnRlciB0aGUgJ10nCisgKiAgICAgZmFpbHVyZTogdW5jaGFuZ2VkCisgKgorICogc2V0dGluZ3M6CisgKgorICogICAgIFt0b2NdICAgLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IGRlZmF1bHRfdG9jCisgKiAgICAgW3RvY3ZdICAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gZGF0YV9pbl90b2MKKyAqICAgICBbdG9jMzJdIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBtdXN0X2JlXzMyCisgKiAgICAgW3RvYzY0XSAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gbXVzdF9iZV82NAorICoKKyAqLworCitlbnVtIHRvY19zaXplX3F1YWxpZmllciAKK3sgCisgIGRlZmF1bHRfdG9jLCAvKiBUaGUgdG9jIGNlbGwgY29uc3RydWN0ZWQgc2hvdWxkIGJlIHRoZSBzeXN0ZW0gZGVmYXVsdCBzaXplICovCisgIGRhdGFfaW5fdG9jLCAvKiBUaGlzIGlzIGEgZGlyZWN0IHJlZmVyZW5jZSB0byBhIHRvYyBjZWxsICAgICAgICAgICAgICAgICAgICovCisgIG11c3RfYmVfMzIsICAvKiBUaGUgdG9jIGNlbGwgY29uc3RydWN0ZWQgbXVzdCBiZSAzMiBiaXRzIHdpZGUgICAgICAgICAgICAgICovCisgIG11c3RfYmVfNjQgICAvKiBUaGUgdG9jIGNlbGwgY29uc3RydWN0ZWQgbXVzdCBiZSA2NCBiaXRzIHdpZGUgICAgICAgICAgICAgICovCit9OworCitzdGF0aWMgaW50CitwYXJzZV90b2NfZW50cnkodG9jX2tpbmQpCisgICAgIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyICp0b2Nfa2luZDsKK3sKKyAgY2hhciAqc3RhcnQ7CisgIGNoYXIgKnRvY19zcGVjOworICBjaGFyIGM7CisgIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyIHQ7CisKKyAgLyogc2F2ZSB0aGUgaW5wdXRfbGluZV9wb2ludGVyICovCisgIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIC8qIHNraXAgb3ZlciB0aGUgJ1snICwgYW5kIHdoaXRlc3BhY2UgKi8KKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgCisgIC8qIGZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCisgIHRvY19zcGVjID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYyIpID09IDApIAorICAgIHsKKyAgICAgIHQgPSBkZWZhdWx0X3RvYzsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvY3YiKSA9PSAwKSAKKyAgICB7CisgICAgICB0ID0gZGF0YV9pbl90b2M7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2MzMiIpID09IDApIAorICAgIHsKKyAgICAgIHQgPSBtdXN0X2JlXzMyOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jNjQiKSA9PSAwKSAKKyAgICB7CisgICAgICB0ID0gbXVzdF9iZV82NDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvcjogaW52YWxpZCB0b2Mgc3BlY2lmaWVyIGAlcyciKSwgdG9jX3NwZWMpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIG5vdyBmaW5kIHRoZSAnXScgKi8KKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsJICAgICAvKiBsZWFkaW5nIHdoaXRlc3BhY2UgY291bGQgYmUgdGhlcmUuICovCisgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7IC8qIGlucHV0X2xpbmVfcG9pbnRlci0+cGFzdCBjaGFyIGluIGMuICovCisKKyAgaWYgKGMgIT0gJ10nKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOiBleHBlY3RlZCBgXScsIGZvdW5kICBgJWMnIiksIGMpOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICp0b2Nfa2luZCA9IHQ7ICAgICAgICAgICAgIC8qIHNldCByZXR1cm4gdmFsdWUgKi8KKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKwwKKworLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcworICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCisgICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuICAqLworCitzdHJ1Y3QgcHBjX2ZpeHVwCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgaW50IG9waW5kZXg7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKK307CisKKyNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQorCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4gICovCisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgY2hhciAqczsKKyAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7CisgIGludCBza2lwX29wdGlvbmFsOworICBpbnQgbmVlZF9wYXJlbjsKKyAgaW50IG5leHRfb3BpbmRleDsKKyAgc3RydWN0IHBwY19maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKKyAgaW50IGZjOworICBjaGFyICpmOworICBpbnQgaTsKKyNpZmRlZiBPQkpfRUxGCisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKKyNlbmRpZgorCisgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KKyAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCisgICAgOworICBpZiAoKnMgIT0gJ1wwJykKKyAgICAqcysrID0gJ1wwJzsKKworICAvKiBMb29rIHVwIHRoZSBvcGNvZGUgaW4gdGhlIGhhc2ggdGFibGUuICAqLworICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIGhhc2hfZmluZCAocHBjX2hhc2gsIHN0cik7CisgIGlmIChvcGNvZGUgPT0gKGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqKSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybzsKKworICAgICAgbWFjcm8gPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKikgaGFzaF9maW5kIChwcGNfbWFjcm9faGFzaCwgc3RyKTsKKyAgICAgIGlmIChtYWNybyA9PSAoY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKikgTlVMTCkKKwlhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKKyAgICAgIGVsc2UKKwlwcGNfbWFjcm8gKHMsIG1hY3JvKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7CisKKyAgc3RyID0gczsKKyAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQorICAgICsrc3RyOworCisgIC8qIFBvd2VyUEMgb3BlcmFuZHMgYXJlIGp1c3QgZXhwcmVzc2lvbnMuICBUaGUgb25seSByZWFsIGlzc3VlIGlzCisgICAgIHRoYXQgYSBmZXcgb3BlcmFuZCB0eXBlcyBhcmUgb3B0aW9uYWwuICBBbGwgY2FzZXMgd2hpY2ggbWlnaHQgdXNlCisgICAgIGFuIG9wdGlvbmFsIG9wZXJhbmQgc2VwYXJhdGUgdGhlIG9wZXJhbmRzIG9ubHkgd2l0aCBjb21tYXMgKGluCisgICAgIHNvbWUgY2FzZXMgcGFyZW50aGVzZXMgYXJlIHVzZWQsIGFzIGluIGBgbHd6IDEsMCgxKScnIGJ1dCBzdWNoCisgICAgIGNhc2VzIG5ldmVyIGhhdmUgb3B0aW9uYWwgb3BlcmFuZHMpLiAgVGhlcmUgaXMgbmV2ZXIgbW9yZSB0aGFuCisgICAgIG9uZSBvcHRpb25hbCBvcGVyYW5kIGZvciBhbiBpbnN0cnVjdGlvbi4gIFNvLCBiZWZvcmUgd2Ugc3RhcnQKKyAgICAgc2VyaW91c2x5IHBhcnNpbmcgdGhlIG9wZXJhbmRzLCB3ZSBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbgorICAgICBvcHRpb25hbCBvcGVyYW5kLCBhbmQsIGlmIHdlIGRvLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIGNvbW1hcyB0bworICAgICBzZWUgd2hldGhlciB0aGUgb3BlcmFuZCBzaG91bGQgYmUgb21pdHRlZC4gICovCisgIHNraXBfb3B0aW9uYWwgPSAwOworICBmb3IgKG9waW5kZXhfcHRyID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXhfcHRyICE9IDA7IG9waW5kZXhfcHRyKyspCisgICAgeworICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKKworICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzWypvcGluZGV4X3B0cl07CisgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDApCisJeworCSAgdW5zaWduZWQgaW50IG9wY291bnQ7CisKKwkgIC8qIFRoZXJlIGlzIGFuIG9wdGlvbmFsIG9wZXJhbmQuICBDb3VudCB0aGUgbnVtYmVyIG9mCisJICAgICBjb21tYXMgaW4gdGhlIGlucHV0IGxpbmUuICAqLworCSAgaWYgKCpzdHIgPT0gJ1wwJykKKwkgICAgb3Bjb3VudCA9IDA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvcGNvdW50ID0gMTsKKwkgICAgICBzID0gc3RyOworCSAgICAgIHdoaWxlICgocyA9IHN0cmNociAocywgJywnKSkgIT0gKGNoYXIgKikgTlVMTCkKKwkJeworCQkgICsrb3Bjb3VudDsKKwkJICArK3M7CisJCX0KKwkgICAgfQorCisJICAvKiBJZiB0aGVyZSBhcmUgZmV3ZXIgb3BlcmFuZHMgaW4gdGhlIGxpbmUgdGhlbiBhcmUgY2FsbGVkCisJICAgICBmb3IgYnkgdGhlIGluc3RydWN0aW9uLCB3ZSB3YW50IHRvIHNraXAgdGhlIG9wdGlvbmFsCisJICAgICBvcGVyYW5kLiAgKi8KKwkgIGlmIChvcGNvdW50IDwgc3RybGVuIChvcGNvZGUtPm9wZXJhbmRzKSkKKwkgICAgc2tpcF9vcHRpb25hbCA9IDE7CisKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogR2F0aGVyIHRoZSBvcGVyYW5kcy4gICovCisgIG5lZWRfcGFyZW4gPSAwOworICBuZXh0X29waW5kZXggPSAwOworICBmYyA9IDA7CisgIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIrKykKKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOworICAgICAgY29uc3QgY2hhciAqZXJybXNnOworICAgICAgY2hhciAqaG9sZDsKKyAgICAgIGV4cHJlc3Npb25TIGV4OworICAgICAgY2hhciBlbmRjOworCisgICAgICBpZiAobmV4dF9vcGluZGV4ID09IDApCisJb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzWypvcGluZGV4X3B0cl07CisgICAgICBlbHNlCisJeworCSAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW25leHRfb3BpbmRleF07CisJICBuZXh0X29waW5kZXggPSAwOworCX0KKworICAgICAgZXJybXNnID0gTlVMTDsKKworICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2Ugb3BlcmFuZCwgdGhlbiB3ZSBkbyBub3QgZXhwZWN0IGFueXRoaW5nCisJIGZyb20gdGhlIGlucHV0LiAgKi8KKyAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9GQUtFKSAhPSAwKQorCXsKKwkgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIDBMLCAmZXJybXNnKTsKKwkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKKwkgICAgYXNfYmFkIChlcnJtc2cpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIG9wdGlvbmFsIG9wZXJhbmQsIGFuZCB3ZSBhcmUgc2tpcHBpbmcgaXQsIGp1c3QKKwkgaW5zZXJ0IGEgemVyby4gICovCisgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKKwkgICYmIHNraXBfb3B0aW9uYWwpCisJeworCSAgaWYgKG9wZXJhbmQtPmluc2VydCkKKwkgICAgeworCSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIDBMLCAmZXJybXNnKTsKKwkgICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCisJCWFzX2JhZCAoZXJybXNnKTsKKwkgICAgfQorCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX05FWFQpICE9IDApCisJICAgIG5leHRfb3BpbmRleCA9ICpvcGluZGV4X3B0ciArIDE7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gICovCisgICAgICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworCisjaWZkZWYgVEVfUEUKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdbJykgCisJeworCSAgLyogV2UgYXJlIGV4cGVjdGluZyBzb21ldGhpbmcgbGlrZSB0aGUgc2Vjb25kIGFyZ3VtZW50IGhlcmU6CisKKwkgICAgICAgIGx3eiByNCxbdG9jXS5HUy4wLnN0YXRpY19pbnQocnRvYykKKyAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisJICAgICBUaGUgYXJndW1lbnQgZm9sbG93aW5nIHRoZSBgXScgbXVzdCBiZSBhIHN5bWJvbCBuYW1lLCBhbmQgdGhlIAorICAgICAgICAgICAgIHJlZ2lzdGVyIG11c3QgYmUgdGhlIHRvYyByZWdpc3RlcjogJ3J0b2MnIG9yICcyJworCisJICAgICBUaGUgZWZmZWN0IGlzIHRvIDAgYXMgdGhlIGRpc3BsYWNlbWVudCBmaWVsZAorCSAgICAgaW4gdGhlIGluc3RydWN0aW9uLCBhbmQgaXNzdWUgYW4gSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAob3IKKwkgICAgIHRoZSBhcHByb3ByaWF0ZSB2YXJpYXRpb24pIHJlbG9jIGFnYWluc3QgaXQgYmFzZWQgb24gdGhlIHN5bWJvbC4KKwkgICAgIFRoZSBsaW5rZXIgd2lsbCBidWlsZCB0aGUgdG9jLCBhbmQgaW5zZXJ0IHRoZSByZXNvbHZlZCB0b2Mgb2Zmc2V0LgorCisJICAgICBOb3RlOgorCSAgICAgbyBUaGUgc2l6ZSBvZiB0aGUgdG9jIGVudHJ5IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRvIGJlCisJICAgICAgIDMyIGJpdHMuIFRoaXMgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRvIGJlIGEgaGFyZCBjb2RlZAorCSAgICAgICBudW1iZXIuCisJICAgICBvIEluIGFuIGVmZm9ydCB0byBjb3BlIHdpdGggYSBjaGFuZ2UgZnJvbSAzMiB0byA2NCBiaXRzLAorCSAgICAgICB0aGVyZSBhcmUgYWxzbyB0b2MgZW50cmllcyB0aGF0IGFyZSBzcGVjaWZpZWQgdG8gYmUKKwkgICAgICAgZWl0aGVyIDMyIG9yIDY0IGJpdHM6CisgICAgICAgICAgICAgICAgIGx3eiByNCxbdG9jMzJdLkdTLjAuc3RhdGljX2ludChydG9jKQorCSAgICAgICAgIGx3eiByNCxbdG9jNjRdLkdTLjAuc3RhdGljX2ludChydG9jKQorCSAgICAgICBUaGVzZSBkZW1hbmQgdG9jIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCBzaXplLCBhbmQgdGhlCisJICAgICAgIGluc3RydWN0aW9uIHByb2JhYmx5IHJlcXVpcmVzIGl0LgorICAgICAgICAgICovCisKKwkgIGludCB2YWxpZF90b2M7CisJICBlbnVtIHRvY19zaXplX3F1YWxpZmllciB0b2Nfa2luZDsKKwkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSB0b2NfcmVsb2M7CisKKwkgIC8qIGdvIHBhcnNlIG9mZiB0aGUgW3RvY1hYXSBwYXJ0ICovCisJICB2YWxpZF90b2MgPSBwYXJzZV90b2NfZW50cnkoJnRvY19raW5kKTsKKworCSAgaWYgKCF2YWxpZF90b2MpIAorCSAgICB7CisJICAgICAgLyogTm90ZTogbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZC4gICAgICovCisJICAgICAgLyogRklYTUU6IHdoYXQgc29ydCBvZiByZWNvdmVyeSBzaG91bGQgd2UgZG8/ICovCisJICAgICAgLyogICAgICAgIGRlbWFuZF9yZXN0X29mX2xpbmUoKTsgcmV0dXJuOyA/ICAgICovCisJICAgIH0KKworCSAgLyogTm93IGdldCB0aGUgc3ltYm9sIGZvbGxvd2luZyB0aGUgJ10nICovCisJICBleHByZXNzaW9uKCZleCk7CisKKwkgIHN3aXRjaCAodG9jX2tpbmQpCisJICAgIHsKKwkgICAgY2FzZSBkZWZhdWx0X3RvYzoKKwkgICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIG1heSBub3QgaGF2ZSBzZWVuIHRoZSBzeW1ib2wgeWV0LCBzaW5jZSAgKi8KKwkgICAgICAvKiBpdCBpcyBhbGxvd2VkIHRvIGFwcGVhciBvbiBhIC5leHRlcm4gb3IgLmdsb2JsIG9yIGp1c3QgYmUgKi8KKwkgICAgICAvKiBhIGxhYmVsIGluIHRoZSAuZGF0YSBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGRhdGFfaW5fdG9jOgorCSAgICAgIC8qIDEuIFRoZSBzeW1ib2wgbXVzdCBiZSBkZWZpbmVkIGFuZCBlaXRoZXIgaW4gdGhlIHRvYyAgICAgICAgKi8KKwkgICAgICAvKiAgICBzZWN0aW9uLCBvciBhIGdsb2JhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJICAgICAgLyogMi4gVGhlIHJlbG9jIGdlbmVyYXRlZCBtdXN0IGhhdmUgdGhlIFRPQ0RFRk4gZmxhZyBzZXQgaW4gICAqLworCSAgICAgIC8qICAgIHVwcGVyIGJpdCBtZXNzIG9mIHRoZSByZWxvYyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICAvKiBGSVhNRTogSXQncyBhIGxpdHRsZSBjb25mdXNpbmcgd2hhdCB0aGUgdG9jdiBxdWFsaWZpZXIgY2FuICovCisJICAgICAgLyogICAgICAgIGJlIHVzZWQgZm9yLiBBdCB0aGUgdmVyeSBsZWFzdCwgSSd2ZSBzZWVuIHRocmVlICAgICAqLworCSAgICAgIC8qICAgICAgICB1c2VzLCBvbmx5IG9uZSBvZiB3aGljaCBJJ20gc3VyZSBJIGNhbiBleHBsYWluLiAgICAgKi8KKwkgICAgICBpZiAoZXguWF9vcCA9PSBPX3N5bWJvbCkgCisJCXsJCSAgCisJCSAgYXNzZXJ0IChleC5YX2FkZF9zeW1ib2wgIT0gTlVMTCk7CisJCSAgaWYgKGV4LlhfYWRkX3N5bWJvbC0+YnN5bS0+c2VjdGlvbiAhPSB0b2NkYXRhX3NlY3Rpb24pCisJCSAgICB7CisJCSAgICAgIGFzX2JhZChfKCJbdG9jdl0gc3ltYm9sIGlzIG5vdCBhIHRvYyBzeW1ib2wiKSk7CisJCSAgICB9CisJCX0KKworCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19QUENfVE9DMTY7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgbXVzdF9iZV8zMjoKKwkgICAgICAvKiBGSVhNRTogdGhlc2UgbmV4dCB0d28gc3BlY2lmaWNhbGx5IHNwZWNpZnkgMzIvNjQgYml0IHRvYyAgICovCisJICAgICAgLyogICAgICAgIGVudHJpZXMuIFdlIGRvbid0IHN1cHBvcnQgdGhlbSB0b2RheS4gSXMgdGhpcyB0aGUgICAqLworCSAgICAgIC8qICAgICAgICByaWdodCB3YXkgdG8gc2F5IHRoYXQ/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOworCSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCB0b2MzMiBleHByZXNzaW9uIG1vZGlmaWVyIikpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIG11c3RfYmVfNjQ6CisJICAgICAgLyogRklYTUU6IHNlZSBhYm92ZSAqLworCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7CisJICAgICAgYXNfYmFkIChfKCJVbmltcGxlbWVudGVkIHRvYzY0IGV4cHJlc3Npb24gbW9kaWZpZXIiKSk7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZnByaW50ZihzdGRlcnIsIAorCQkgICAgICBfKCJVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBbJWRdIGZyb20gcGFyc2VfdG9jX2VudHJ5IVxuIiksCisJCSAgICAgIHRvY19raW5kKTsKKwkgICAgICBhYm9ydCgpOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KKwkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCisJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisKKwkgIGZpeHVwc1tmY10ucmVsb2MgPSB0b2NfcmVsb2M7CisJICBmaXh1cHNbZmNdLmV4cCA9IGV4OworCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOworCSAgKytmYzsKKworICAgICAgICAgIC8qIE9rLiBXZSd2ZSBzZXQgdXAgdGhlIGZpeHVwIGZvciB0aGUgaW5zdHJ1Y3Rpb24uIE5vdyBtYWtlIGl0CisJICAgICBsb29rIGxpa2UgdGhlIGNvbnN0YW50IDAgd2FzIGZvdW5kIGhlcmUgKi8KKwkgIGV4LlhfdW5zaWduZWQgPSAxOworCSAgZXguWF9vcCA9IE9fY29uc3RhbnQ7CisJICBleC5YX2FkZF9udW1iZXIgPSAwOworCSAgZXguWF9hZGRfc3ltYm9sID0gTlVMTDsKKwkgIGV4Llhfb3Bfc3ltYm9sID0gTlVMTDsKKwl9CisKKyAgICAgIGVsc2UKKyNlbmRpZgkJLyogVEVfUEUgKi8KKwl7CisJICBpZiAoISByZWdpc3Rlcl9uYW1lICgmZXgpKQorCSAgICB7CisJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0NSKSAhPSAwKQorCQljcl9vcGVyYW5kID0gdHJ1ZTsKKwkgICAgICBleHByZXNzaW9uICgmZXgpOworCSAgICAgIGNyX29wZXJhbmQgPSBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKworICAgICAgaWYgKGV4Llhfb3AgPT0gT19pbGxlZ2FsKQorCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOworICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX2Fic2VudCkKKwlhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKKyAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19yZWdpc3RlcikKKwl7CisJICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCisJCQkJICAgICAoY2hhciAqKSBOVUxMLCAwKTsKKwl9CisgICAgICBlbHNlIGlmIChleC5YX29wID09IE9fY29uc3RhbnQpCisJeworI2lmZGVmIE9CSl9FTEYKKwkgIC8qIEFsbG93IEBIQSwgQEwsIEBIIG9uIGNvbnN0YW50cy4gKi8KKwkgIGNoYXIgKm9yaWdfc3RyID0gc3RyOworCisJICBpZiAoKHJlbG9jID0gcHBjX2VsZl9zdWZmaXggKCZzdHIsICZleCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCisJICAgIHN3aXRjaCAocmVsb2MpCisJICAgICAgeworCSAgICAgIGRlZmF1bHQ6CisJCXN0ciA9IG9yaWdfc3RyOworCQlicmVhazsKKworCSAgICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CisJCS8qIFhfdW5zaWduZWQgaXMgdGhlIGRlZmF1bHQsIHNvIGlmIHRoZSB1c2VyIGhhcyBkb25lCisgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIHdoaWNoIGNsZWFyZWQgaXQsIHdlIGFsd2F5cyBwcm9kdWNlIGEKKyAgICAgICAgICAgICAgICAgICBzaWduZWQgdmFsdWUuICAqLworCQlpZiAoZXguWF91bnNpZ25lZAorCQkgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSA9PSAwKQorCQkgIGV4LlhfYWRkX251bWJlciAmPSAweGZmZmY7CisJCWVsc2UKKwkJICBleC5YX2FkZF9udW1iZXIgPSAoKChleC5YX2FkZF9udW1iZXIgJiAweGZmZmYpCisJCQkJICAgICAgXiAweDgwMDApCisJCQkJICAgICAtIDB4ODAwMCk7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKKwkJZXguWF9hZGRfbnVtYmVyID0gKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgorCQlleC5YX2FkZF9udW1iZXIgPSAoKChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmKQorCQkJCSAgICsgKChleC5YX2FkZF9udW1iZXIgPj4gMTUpICYgMSkpOworCQlicmVhazsKKwkgICAgICB9CisjZW5kaWYKKwkgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKKwkJCQkgICAgIChjaGFyICopIE5VTEwsIDApOworCX0KKyNpZmRlZiBPQkpfRUxGCisgICAgICBlbHNlIGlmICgocmVsb2MgPSBwcGNfZWxmX3N1ZmZpeCAoJnN0ciwgJmV4KSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKKwl7CisJICAvKiBGb3IgdGhlIGFic291bHRlIGZvcm1zIG9mIGJyYW5jaHMsIGNvbnZlcnQgdGhlIFBDIHJlbGF0aXZlIGZvcm0gYmFjayBpbnRvCisJICAgICB0aGUgYWJzb2x1dGUuICAqLworCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQorCSAgICB7CisJICAgICAgc3dpdGNoIChyZWxvYykKKwkJeworCQljYXNlIEJGRF9SRUxPQ19QUENfQjI2OgorCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTI2OworCQkgIGJyZWFrOworCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2OgorCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTE2OworCQkgIGJyZWFrOworCQljYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU46CisJCSAgcmVsb2MgPSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTjsKKwkJICBicmVhazsKKwkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTjoKKwkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTjsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KKwkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCisJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisJICBmaXh1cHNbZmNdLmV4cCA9IGV4OworCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gMDsKKwkgIGZpeHVwc1tmY10ucmVsb2MgPSByZWxvYzsKKwkgICsrZmM7CisJfQorI2VuZGlmIC8qIE9CSl9FTEYgKi8KKworICAgICAgZWxzZQorCXsKKwkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KKwkgIGlmIChmYyA+PSBNQVhfSU5TTl9GSVhVUFMpCisJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisJICBmaXh1cHNbZmNdLmV4cCA9IGV4OworCSAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOworCSAgZml4dXBzW2ZjXS5yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7CisJICArK2ZjOworCX0KKworICAgICAgaWYgKG5lZWRfcGFyZW4pCisJeworCSAgZW5kYyA9ICcpJzsKKwkgIG5lZWRfcGFyZW4gPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMCkKKwl7CisJICBlbmRjID0gJygnOworCSAgbmVlZF9wYXJlbiA9IDE7CisJfQorICAgICAgZWxzZQorCWVuZGMgPSAnLCc7CisKKyAgICAgIC8qIFRoZSBjYWxsIHRvIGV4cHJlc3Npb24gc2hvdWxkIGhhdmUgYWR2YW5jZWQgc3RyIHBhc3QgYW55CisJIHdoaXRlc3BhY2UuICAqLworICAgICAgaWYgKCpzdHIgIT0gZW5kYworCSAgJiYgKGVuZGMgIT0gJywnIHx8ICpzdHIgIT0gJ1wwJykpCisJeworCSAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I7IGZvdW5kIGAlYycgYnV0IGV4cGVjdGVkIGAlYyciKSwgKnN0ciwgZW5kYyk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmICgqc3RyICE9ICdcMCcpCisJKytzdHI7CisgICAgfQorCisgIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKKyAgICArK3N0cjsKKworICBpZiAoKnN0ciAhPSAnXDAnKQorICAgIGFzX2JhZCAoXygianVuayBhdCBlbmQgb2YgbGluZTogYCVzJyIpLCBzdHIpOworCisgIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBmID0gZnJhZ19tb3JlICg0KTsKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCA0KTsKKworICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCisgICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKKyAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5CisgICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgorICAgICBtZF9hcHBseV9maXguICAqLworICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOworCisgICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOworICAgICAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQorCXsKKwkgIHJlbG9jX2hvd3RvX3R5cGUgKnJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHVwc1tpXS5yZWxvYyk7CisJICBpbnQgc2l6ZTsKKwkgIGludCBvZmZzZXQ7CisJICBmaXhTICpmaXhQOworCisJICBpZiAoIXJlbG9jX2hvd3RvKQorCSAgICBhYm9ydCAoKTsKKworCSAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOworCSAgb2Zmc2V0ID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAoNCAtIHNpemUpIDogMDsKKworCSAgaWYgKHNpemUgPCAxIHx8IHNpemUgPiA0KQorCSAgICBhYm9ydCgpOworCisJICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsIHNpemUsCisJCQkgICAgICAmZml4dXBzW2ldLmV4cCwgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAorCQkJICAgICAgZml4dXBzW2ldLnJlbG9jKTsKKworCSAgLyogVHVybiBvZmYgY29tcGxhaW50cyB0aGF0IHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlIGZvciB0aGluZ3MgbGlrZQorCSAgICAgZm9vKzEwMDAwMEBoYS4gICovCisJICBzd2l0Y2ggKGZpeHVwc1tpXS5yZWxvYykKKwkgICAgeworCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6CisJICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgorCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKKwkJICAgICAmZml4dXBzW2ldLmV4cCwKKwkJICAgICAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMCwKKwkJICAgICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKKwkJICAgICAgIChmaXh1cHNbaV0ub3BpbmRleCArIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpKSk7CisgICAgfQorfQorCisvKiBIYW5kbGUgYSBtYWNyby4gIEdhdGhlciBhbGwgdGhlIG9wZXJhbmRzLCB0cmFuc2Zvcm0gdGhlbSBhcworICAgZGVzY3JpYmVkIGJ5IHRoZSBtYWNybywgYW5kIGNhbGwgbWRfYXNzZW1ibGUgcmVjdXJzaXZlbHkuICBBbGwgdGhlCisgICBvcGVyYW5kcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hczsgd2UgZG9uJ3QgYWNjZXB0IHBhcmVudGhlc2VzCisgICBhcm91bmQgb3BlcmFuZHMgaGVyZS4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfbWFjcm8gKHN0ciwgbWFjcm8pCisgICAgIGNoYXIgKnN0cjsKKyAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOworeworICBjaGFyICpvcGVyYW5kc1sxMF07CisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgY2hhciAqczsKKyAgdW5zaWduZWQgaW50IGxlbjsKKyAgY29uc3QgY2hhciAqZm9ybWF0OworICBpbnQgYXJnOworICBjaGFyICpzZW5kOworICBjaGFyICpjb21wbGV0ZTsKKworICAvKiBHYXRoZXIgdGhlIHVzZXJzIG9wZXJhbmRzIGludG8gdGhlIG9wZXJhbmRzIGFycmF5LiAgKi8KKyAgY291bnQgPSAwOworICBzID0gc3RyOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoY291bnQgPj0gc2l6ZW9mIG9wZXJhbmRzIC8gc2l6ZW9mIG9wZXJhbmRzWzBdKQorCWJyZWFrOworICAgICAgb3BlcmFuZHNbY291bnQrK10gPSBzOworICAgICAgcyA9IHN0cmNociAocywgJywnKTsKKyAgICAgIGlmIChzID09IChjaGFyICopIE5VTEwpCisJYnJlYWs7CisgICAgICAqcysrID0gJ1wwJzsKKyAgICB9ICAKKworICBpZiAoY291bnQgIT0gbWFjcm8tPm9wZXJhbmRzKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygid3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBXb3JrIG91dCBob3cgbGFyZ2UgdGhlIHN0cmluZyBtdXN0IGJlICh0aGUgc2l6ZSBpcyB1bmJvdW5kZWQKKyAgICAgYmVjYXVzZSBpdCBpbmNsdWRlcyB1c2VyIGlucHV0KS4gICovCisgIGxlbiA9IDA7CisgIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7CisgIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCisgICAgeworICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQorCXsKKwkgICsrbGVuOworCSAgKytmb3JtYXQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFyZyA9IHN0cnRvbCAoZm9ybWF0ICsgMSwgJnNlbmQsIDEwKTsKKwkgIGtub3cgKHNlbmQgIT0gZm9ybWF0ICYmIGFyZyA+PSAwICYmIGFyZyA8IGNvdW50KTsKKwkgIGxlbiArPSBzdHJsZW4gKG9wZXJhbmRzW2FyZ10pOworCSAgZm9ybWF0ID0gc2VuZDsKKwl9CisgICAgfQorCisgIC8qIFB1dCB0aGUgc3RyaW5nIHRvZ2V0aGVyLiAgKi8KKyAgY29tcGxldGUgPSBzID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKKyAgZm9ybWF0ID0gbWFjcm8tPmZvcm1hdDsKKyAgd2hpbGUgKCpmb3JtYXQgIT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAoKmZvcm1hdCAhPSAnJScpCisJKnMrKyA9ICpmb3JtYXQrKzsKKyAgICAgIGVsc2UKKwl7CisJICBhcmcgPSBzdHJ0b2wgKGZvcm1hdCArIDEsICZzZW5kLCAxMCk7CisJICBzdHJjcHkgKHMsIG9wZXJhbmRzW2FyZ10pOworCSAgcyArPSBzdHJsZW4gKHMpOworCSAgZm9ybWF0ID0gc2VuZDsKKwl9CisgICAgfQorICAqcyA9ICdcMCc7CisKKyAgLyogQXNzZW1ibGUgdGhlIGNvbnN0cnVjdGVkIGluc3RydWN0aW9uLiAgKi8KKyAgbWRfYXNzZW1ibGUgKGNvbXBsZXRlKTsKK30gIAorDAorI2lmZGVmIE9CSl9FTEYKKy8qIEZvciBFTEYsIGFkZCBzdXBwb3J0IGZvciBTSEZfRVhDTFVERSBhbmQgU0hUX09SREVSRUQgKi8KKworaW50CitwcGNfc2VjdGlvbl9sZXR0ZXIgKGxldHRlciwgcHRyX21zZykKKyAgICAgaW50IGxldHRlcjsKKyAgICAgY2hhciAqKnB0cl9tc2c7Cit7CisgIGlmIChsZXR0ZXIgPT0gJ2UnKQorICAgIHJldHVybiBTSEZfRVhDTFVERTsKKworICAqcHRyX21zZyA9IF8oIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHgsZSBpbiBzdHJpbmciKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorcHBjX3NlY3Rpb25fd29yZCAocHRyX3N0cikKKyAgICAgY2hhciAqKnB0cl9zdHI7Cit7CisgIGlmIChzdHJuY21wICgqcHRyX3N0ciwgImV4Y2x1ZGUiLCBzaXplb2YgKCJleGNsdWRlIiktMSkgPT0gMCkKKyAgICB7CisgICAgICAqcHRyX3N0ciArPSBzaXplb2YgKCJleGNsdWRlIiktMTsKKyAgICAgIHJldHVybiBTSEZfRVhDTFVERTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorcHBjX3NlY3Rpb25fdHlwZSAocHRyX3N0cikKKyAgICAgY2hhciAqKnB0cl9zdHI7Cit7CisgIGlmIChzdHJuY21wICgqcHRyX3N0ciwgIm9yZGVyZWQiLCBzaXplb2YgKCJvcmRlcmVkIiktMSkgPT0gMCkKKyAgICB7CisgICAgICAqcHRyX3N0ciArPSBzaXplb2YgKCJvcmRlcmVkIiktMTsKKyAgICAgIHJldHVybiBTSFRfT1JERVJFRDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorcHBjX3NlY3Rpb25fZmxhZ3MgKGZsYWdzLCBhdHRyLCB0eXBlKQorICAgICBpbnQgZmxhZ3M7CisgICAgIGludCBhdHRyOworICAgICBpbnQgdHlwZTsKK3sKKyAgaWYgKHR5cGUgPT0gU0hUX09SREVSRUQpCisgICAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfU09SVF9FTlRSSUVTOworCisgIGlmIChhdHRyICYgU0hGX0VYQ0xVREUpCisgICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7CisKKyAgcmV0dXJuIGZsYWdzOworfQorI2VuZGlmIC8qIE9CSl9FTEYgKi8KKworDAorLyogUHNldWRvLW9wIGhhbmRsaW5nLiAgKi8KKworLyogVGhlIC5ieXRlIHBzZXVkby1vcC4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbm9ybWFsIC5ieXRlCisgICBwc2V1ZG8tb3AsIGJ1dCBpdCBjYW4gYWxzbyB0YWtlIGEgc2luZ2xlIEFTQ0lJIHN0cmluZy4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfYnl0ZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCInKQorICAgIHsKKyAgICAgIGNvbnMgKDEpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBHYXRoZXIgY2hhcmFjdGVycy4gIEEgcmVhbCBkb3VibGUgcXVvdGUgaXMgZG91YmxlZC4gIFVudXN1YWwKKyAgICAgY2hhcmFjdGVycyBhcmUgbm90IHBlcm1pdHRlZC4gICovCisgICsraW5wdXRfbGluZV9wb2ludGVyOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjaGFyIGM7CisKKyAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CisKKyAgICAgIGlmIChjID09ICdcIicpCisJeworCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKKwkgICAgYnJlYWs7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwl9CisKKyAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisMCisjaWZkZWYgT0JKX1hDT0ZGCisKKy8qIFhDT0ZGIHNwZWNpZmljIHBzZXVkby1vcCBoYW5kbGluZy4gICovCisKKy8qIFRoaXMgaXMgc2V0IGlmIHdlIGFyZSBjcmVhdGluZyBhIC5zdGFieCBzeW1ib2wsIHNpbmNlIHdlIGRvbid0IHdhbnQKKyAgIHRvIGhhbmRsZSBzeW1ib2wgc3VmZml4ZXMgZm9yIHN1Y2ggc3ltYm9scy4gICovCitzdGF0aWMgYm9vbGVhbiBwcGNfc3RhYl9zeW1ib2w7CisKKy8qIFRoZSAuY29tbSBhbmQgLmxjb21tIHBzZXVkby1vcHMgZm9yIFhDT0ZGLiAgWENPRkYgcHV0cyBjb21tb24KKyAgIHN5bWJvbHMgaW4gdGhlIC5ic3Mgc2VnbWVudCBhcyB0aG91Z2ggdGhleSB3ZXJlIGxvY2FsIGNvbW1vbgorICAgc3ltYm9scywgYW5kIHVzZXMgYSBkaWZmZXJlbnQgc21jbGFzLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19jb21tIChsY29tbSkKKyAgICAgaW50IGxjb21tOworeworICBhc2VjdGlvbiAqY3VycmVudF9zZWcgPSBub3dfc2VnOworICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBlbmRjOworICBjaGFyICplbmRfbmFtZTsKKyAgb2Zmc2V0VCBzaXplOworICBvZmZzZXRUIGFsaWduOworICBzeW1ib2xTICpsY29tbV9zeW0gPSBOVUxMOworICBzeW1ib2xTICpzeW07CisgIGNoYXIgKnBmcmFnOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICplbmRfbmFtZSA9IGVuZGM7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyBzaXplIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgaWYgKHNpemUgPCAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibmVnYXRpdmUgc2l6ZSIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghIGxjb21tKQorICAgIHsKKyAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKwlhbGlnbiA9IDM7CisgICAgICBlbHNlCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCSAgaWYgKGFsaWduIDw9IDApCisJICAgIHsKKwkgICAgICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOworCSAgICAgIGFsaWduID0gMzsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpsY29tbV9uYW1lOworICAgICAgY2hhciBsY29tbV9lbmRjOworCisgICAgICBpZiAoc2l6ZSA8PSAxKQorCWFsaWduID0gMDsKKyAgICAgIGVsc2UgaWYgKHNpemUgPD0gMikKKwlhbGlnbiA9IDE7CisgICAgICBlbHNlIGlmIChzaXplIDw9IDQpCisJYWxpZ24gPSAyOworICAgICAgZWxzZQorCWFsaWduID0gMzsKKworICAgICAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5sY29tbSBhcHBlYXJzIHRvIGJlIHRoZSByZWFsIGxvY2FsCisJIGNvbW1vbiBzeW1ib2wgdG8gY3JlYXRlLiAgUmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIG5hbWVkIGluCisJIHRoZSBmaXJzdCBhcmd1bWVudCBhcmUgdHVybmVkIGludG8gcmVmZXJlbmNlcyB0byB0aGUgdGhpcmQKKwkgYXJndW1lbnQuICAqLworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorCXsKKwkgIGFzX2JhZCAoXygibWlzc2luZyByZWFsIHN5bWJvbCBuYW1lIikpOworCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICAgICAgbGNvbW1fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGxjb21tX2VuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIAorICAgICAgbGNvbW1fc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobGNvbW1fbmFtZSk7CisKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBsY29tbV9lbmRjOworICAgIH0KKworICAqZW5kX25hbWUgPSAnXDAnOworICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKmVuZF9uYW1lID0gZW5kYzsKKworICBpZiAoU19JU19ERUZJTkVEIChzeW0pCisgICAgICB8fCBTX0dFVF9WQUxVRSAoc3ltKSAhPSAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKKwkgIAorICBpZiAoISBsY29tbQorICAgICAgfHwgISBTX0lTX0RFRklORUQgKGxjb21tX3N5bSkpCisgICAgeworICAgICAgc3ltYm9sUyAqZGVmX3N5bTsKKyAgICAgIG9mZnNldFQgZGVmX3NpemU7CisKKyAgICAgIGlmICghIGxjb21tKQorCXsKKwkgIGRlZl9zeW0gPSBzeW07CisJICBkZWZfc2l6ZSA9IHNpemU7CisJICBTX1NFVF9FWFRFUk5BTCAoc3ltKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGNvbW1fc3ltLT5zeV90Yy5vdXRwdXQgPSAxOworCSAgZGVmX3N5bSA9IGxjb21tX3N5bTsKKwkgIGRlZl9zaXplID0gMDsKKwl9CisKKyAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAxKTsKKyAgICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKKyAgCisgICAgICBkZWZfc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIGRlZl9zeW0sCisJCQlkZWZfc2l6ZSwgKGNoYXIgKikgTlVMTCk7CisgICAgICAqcGZyYWcgPSAwOworICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bSwgYnNzX3NlY3Rpb24pOworICAgICAgZGVmX3N5bS0+c3lfdGMuYWxpZ24gPSBhbGlnbjsKKyAgICB9CisgIGVsc2UgaWYgKGxjb21tKQorICAgIHsKKyAgICAgIC8qIEFsaWduIHRoZSBzaXplIG9mIGxjb21tX3N5bS4gICovCisgICAgICBsY29tbV9zeW0tPnN5X2ZyYWctPmZyX29mZnNldCA9CisJKChsY29tbV9zeW0tPnN5X2ZyYWctPmZyX29mZnNldCArICgxIDw8IGFsaWduKSAtIDEpCisJICZ+ICgoMSA8PCBhbGlnbikgLSAxKSk7CisgICAgICBpZiAoYWxpZ24gPiBsY29tbV9zeW0tPnN5X3RjLmFsaWduKQorCWxjb21tX3N5bS0+c3lfdGMuYWxpZ24gPSBhbGlnbjsKKyAgICB9CisKKyAgaWYgKGxjb21tKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3ltIGFuIG9mZnNldCBmcm9tIGxjb21tX3N5bS4gICovCisgICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGJzc19zZWN0aW9uKTsKKyAgICAgIHN5bS0+c3lfZnJhZyA9IGxjb21tX3N5bS0+c3lfZnJhZzsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIGxjb21tX3N5bS0+c3lfZnJhZy0+ZnJfb2Zmc2V0KTsKKyAgICAgIGxjb21tX3N5bS0+c3lfZnJhZy0+ZnJfb2Zmc2V0ICs9IHNpemU7CisgICAgfQorCisgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhlIC5jc2VjdCBwc2V1ZG8tb3AuICBUaGlzIHN3aXRjaGVzIHVzIGludG8gYSBkaWZmZXJlbnQKKyAgIHN1YnNlZ21lbnQuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBzeW1ib2wgd2hvc2UgdmFsdWUgaXMgdGhlCisgICBzdGFydCBvZiB0aGUgLmNzZWN0LiAgSW4gQ09GRiwgY3NlY3Qgc3ltYm9scyBnZXQgc3BlY2lhbCBhdXgKKyAgIGVudHJpZXMgZGVmaW5lZCBieSB0aGUgeF9jc2VjdCBmaWVsZCBvZiB1bmlvbiBpbnRlcm5hbF9hdXhlbnQuICBUaGUKKyAgIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYWxpZ25tZW50ICh0aGUgZGVmYXVsdCBpcyAyKS4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfY3NlY3QgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBlbmRjOworICBzeW1ib2xTICpzeW07CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAKKyAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7CisKKyAgaWYgKFNfR0VUX05BTUUgKHN5bSlbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBBbiB1bm5hbWVkIGNzZWN0IGlzIGFzc3VtZWQgdG8gYmUgW1BSXS4gICovCisgICAgICBzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1BSOworICAgIH0KKworICBwcGNfY2hhbmdlX2NzZWN0IChzeW0pOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIHN5bS0+c3lfdGMuYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogQ2hhbmdlIHRvIGEgZGlmZmVyZW50IGNzZWN0LiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19jaGFuZ2VfY3NlY3QgKHN5bSkKKyAgICAgc3ltYm9sUyAqc3ltOworeworICBpZiAoU19JU19ERUZJTkVEIChzeW0pKQorICAgIHN1YnNlZ19zZXQgKFNfR0VUX1NFR01FTlQgKHN5bSksIHN5bS0+c3lfdGMuc3Vic2VnKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN5bWJvbFMgKipsaXN0X3B0cjsKKyAgICAgIGludCBhZnRlcl90b2M7CisgICAgICBpbnQgaG9sZF9jaHVua3NpemU7CisgICAgICBzeW1ib2xTICpsaXN0OworCisgICAgICAvKiBUaGlzIGlzIGEgbmV3IGNzZWN0LiAgV2UgbmVlZCB0byBsb29rIGF0IHRoZSBzeW1ib2wgY2xhc3MgdG8KKwkgZmlndXJlIG91dCB3aGV0aGVyIGl0IHNob3VsZCBnbyBpbiB0aGUgdGV4dCBzZWN0aW9uIG9yIHRoZQorCSBkYXRhIHNlY3Rpb24uICAqLworICAgICAgYWZ0ZXJfdG9jID0gMDsKKyAgICAgIHN3aXRjaCAoc3ltLT5zeV90Yy5jbGFzcykKKwl7CisJY2FzZSBYTUNfUFI6CisJY2FzZSBYTUNfUk86CisJY2FzZSBYTUNfREI6CisJY2FzZSBYTUNfR0w6CisJY2FzZSBYTUNfWE86CisJY2FzZSBYTUNfU1Y6CisJY2FzZSBYTUNfVEk6CisJY2FzZSBYTUNfVEI6CisJICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7CisJICBzeW0tPnN5X3RjLnN1YnNlZyA9IHBwY190ZXh0X3N1YnNlZ21lbnQ7CisJICArK3BwY190ZXh0X3N1YnNlZ21lbnQ7CisJICBsaXN0X3B0ciA9ICZwcGNfdGV4dF9jc2VjdHM7CisJICBicmVhazsKKwljYXNlIFhNQ19SVzoKKwljYXNlIFhNQ19UQzA6CisJY2FzZSBYTUNfVEM6CisJY2FzZSBYTUNfRFM6CisJY2FzZSBYTUNfVUE6CisJY2FzZSBYTUNfQlM6CisJY2FzZSBYTUNfVUM6CisJICBpZiAocHBjX3RvY19jc2VjdCAhPSBOVUxMCisJICAgICAgJiYgcHBjX3RvY19jc2VjdC0+c3lfdGMuc3Vic2VnICsgMSA9PSBwcGNfZGF0YV9zdWJzZWdtZW50KQorCSAgICBhZnRlcl90b2MgPSAxOworCSAgU19TRVRfU0VHTUVOVCAoc3ltLCBkYXRhX3NlY3Rpb24pOworCSAgc3ltLT5zeV90Yy5zdWJzZWcgPSBwcGNfZGF0YV9zdWJzZWdtZW50OworCSAgKytwcGNfZGF0YV9zdWJzZWdtZW50OworCSAgbGlzdF9wdHIgPSAmcHBjX2RhdGFfY3NlY3RzOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgLyogV2Ugc2V0IHRoZSBvYnN0YWNrIGNodW5rIHNpemUgdG8gYSBzbWFsbCB2YWx1ZSBiZWZvcmUKKyAgICAgICAgIGNoYW5naW5nIHN1YnNlZ21lbnRzLCBzbyB0aGF0IHdlIGRvbid0IHVzZSBhIGxvdCBvZiBtZW1vcnkKKyAgICAgICAgIHNwYWNlIGZvciB3aGF0IG1heSBiZSBhIHNtYWxsIHNlY3Rpb24uICAqLworICAgICAgaG9sZF9jaHVua3NpemUgPSBjaHVua3NpemU7CisgICAgICBjaHVua3NpemUgPSA2NDsKKworICAgICAgc3Vic2VnX25ldyAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKSwgc3ltLT5zeV90Yy5zdWJzZWcpOworCisgICAgICBjaHVua3NpemUgPSBob2xkX2NodW5rc2l6ZTsKKworICAgICAgaWYgKGFmdGVyX3RvYykKKwlwcGNfYWZ0ZXJfdG9jX2ZyYWcgPSBmcmFnX25vdzsKKworICAgICAgc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOworCisgICAgICBzeW0tPnN5X3RjLmFsaWduID0gMjsKKyAgICAgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKyAgICAgIHN5bS0+c3lfdGMud2l0aGluID0gc3ltOworCSAgCisgICAgICBmb3IgKGxpc3QgPSAqbGlzdF9wdHI7CisJICAgbGlzdC0+c3lfdGMubmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMOworCSAgIGxpc3QgPSBsaXN0LT5zeV90Yy5uZXh0KQorCTsKKyAgICAgIGxpc3QtPnN5X3RjLm5leHQgPSBzeW07CisJICAKKyAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisgICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIGxpc3QtPnN5X3RjLndpdGhpbiwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisgICAgfQorCisgIHBwY19jdXJyZW50X2NzZWN0ID0gc3ltOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIC50ZXh0IGFuZCAuZGF0YSBwc2V1ZG8tb3BzLiAgVGhlc2UKKyAgIHBzZXVkby1vcHMgYXJlbid0IHJlYWxseSB1c2VkIGJ5IFhDT0ZGOyB3ZSBpbXBsZW1lbnQgdGhlbSBmb3IgdGhlCisgICBjb252ZW5pZW5jZSBvZiBwZW9wbGUgd2hvIGFyZW4ndCB1c2VkIHRvIFhDT0ZGLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19zZWN0aW9uICh0eXBlKQorICAgICBpbnQgdHlwZTsKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgc3ltYm9sUyAqc3ltOworCisgIGlmICh0eXBlID09ICd0JykKKyAgICBuYW1lID0gIi50ZXh0W1BSXSI7CisgIGVsc2UgaWYgKHR5cGUgPT0gJ2QnKQorICAgIG5hbWUgPSAiLmRhdGFbUlddIjsKKyAgZWxzZQorICAgIGFib3J0ICgpOworCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgIHBwY19jaGFuZ2VfY3NlY3QgKHN5bSk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSAuc2VjdGlvbiBwc2V1ZG8tb3AuICBUaGlzIGlzIG1vc3RseSB0bworICAgZ2l2ZSBhbiBlcnJvciwgc2luY2UgWENPRkYgb25seSBzdXBwb3J0cyAudGV4dCwgLmRhdGEgYW5kIC5ic3MsIGJ1dAorICAgd2UgZG8gcGVybWl0IHRoZSB1c2VyIHRvIG5hbWUgdGhlIHRleHQgb3IgZGF0YSBzZWN0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19uYW1lZF9zZWN0aW9uIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKnVzZXJfbmFtZTsKKyAgY29uc3QgY2hhciAqcmVhbF9uYW1lOworICBjaGFyIGM7CisgIHN5bWJvbFMgKnN5bTsKKworICB1c2VyX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICBpZiAoc3RyY21wICh1c2VyX25hbWUsICIudGV4dCIpID09IDApCisgICAgcmVhbF9uYW1lID0gIi50ZXh0W1BSXSI7CisgIGVsc2UgaWYgKHN0cmNtcCAodXNlcl9uYW1lLCAiLmRhdGEiKSA9PSAwKQorICAgIHJlYWxfbmFtZSA9ICIuZGF0YVtSV10iOworICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJUaGUgWENPRkYgZmlsZSBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMiKSk7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKHJlYWxfbmFtZSk7CisKKyAgcHBjX2NoYW5nZV9jc2VjdCAoc3ltKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLmV4dGVybiBwc2V1ZG8tb3AuICBXZSBjcmVhdGUgYW4gdW5kZWZpbmVkIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfZXh0ZXJuIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgZW5kYzsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgKHZvaWQpIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoZSAubGdsb2JsIHBzZXVkby1vcC4gIEtlZXAgdGhlIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19sZ2xvYmwgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBlbmRjOworICBzeW1ib2xTICpzeW07CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOworCisgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLnJlbmFtZSBwc2V1ZG8tb3AuICBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgY2FuIHJlbmFtZSBzeW1ib2xzLAorICAgYWx0aG91Z2ggSSBkb24ndCBrbm93IHdoeSBpdCBib3RoZXJzLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19yZW5hbWUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBlbmRjOworICBzeW1ib2xTICpzeW07CisgIGludCBsZW47CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgcmVuYW1lIHN0cmluZyIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBzeW0tPnN5X3RjLnJlYWxfbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLnN0YWJ4IHBzZXVkby1vcC4gIFRoaXMgaXMgc2ltaWxhciB0byBhIG5vcm1hbCAuc3RhYnMKKyAgIHBzZXVkby1vcCwgYnV0IHNsaWdodGx5IGRpZmZlcmVudC4gIEEgc2FtcGxlIGlzCisgICAgICAgLnN0YWJ4ICJtYWluOkYtMSIsLm1haW4sMTQyLDAKKyAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgc3ltYm9sIG5hbWUgdG8gY3JlYXRlLiAgVGhlIHNlY29uZCBpcyB0aGUKKyAgIHZhbHVlLCBhbmQgdGhlIHRoaXJkIGlzIHRoZSBzdG9yYWdlIGNsYXNzLiAgVGhlIGZvdXJ0aCBzZWVtcyB0byBiZQorICAgYWx3YXlzIHplcm8sIGFuZCBJIGFtIGFzc3VtaW5nIGl0IGlzIHRoZSB0eXBlLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19zdGFieCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgbGVuOworICBzeW1ib2xTICpzeW07CisgIGV4cHJlc3Npb25TIGV4cDsKKworICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmFsdWUiKSk7CisgICAgICByZXR1cm47CisgICAgfQorICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBwcGNfc3RhYl9zeW1ib2wgPSB0cnVlOworICBzeW0gPSBzeW1ib2xfbWFrZSAobmFtZSk7CisgIHBwY19zdGFiX3N5bWJvbCA9IGZhbHNlOworCisgIHN5bS0+c3lfdGMucmVhbF9uYW1lID0gbmFtZTsKKworICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7CisKKyAgc3dpdGNoIChleHAuWF9vcCkKKyAgICB7CisgICAgY2FzZSBPX2lsbGVnYWw6CisgICAgY2FzZSBPX2Fic2VudDoKKyAgICBjYXNlIE9fYmlnOgorICAgICAgYXNfYmFkIChfKCJpbGxlZ2FsIC5zdGFieCBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7CisgICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSBPX2NvbnN0YW50OgorICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7CisgICAgICBzeW0tPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT19zeW1ib2w6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCisJc3ltLT5zeV92YWx1ZSA9IGV4cDsKKyAgICAgIGVsc2UKKwl7CisJICBTX1NFVF9WQUxVRSAoc3ltLAorCQkgICAgICAgZXhwLlhfYWRkX251bWJlciArIFNfR0VUX1ZBTFVFIChleHAuWF9hZGRfc3ltYm9sKSk7CisJICBzeW0tPnN5X2ZyYWcgPSBleHAuWF9hZGRfc3ltYm9sLT5zeV9mcmFnOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFRoZSB2YWx1ZSBpcyBzb21lIGNvbXBsZXggZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBwcm9iYWJseQorICAgICAgICAgZmFpbCBhdCBzb21lIGxhdGVyIHBvaW50LCBidXQgdGhpcyBpcyBwcm9iYWJseSB0aGUgcmlnaHQKKyAgICAgICAgIHRoaW5nIHRvIGRvIGhlcmUuICAqLworICAgICAgc3ltLT5zeV92YWx1ZSA9IGV4cDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBTX1NFVF9TRUdNRU5UIChzeW0sIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pOworICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyBjbGFzcyIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdHlwZSIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIFNfU0VUX0RBVEFfVFlQRSAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisKKyAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOworCisgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfU1RTWU0pCisgICAgc3ltLT5zeV90Yy53aXRoaW4gPSBwcGNfY3VycmVudF9ibG9jazsKKworICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wKKyAgICAgIHx8ICEgU19JU19FWFRFUk5BTCAoZXhwLlhfYWRkX3N5bWJvbCkKKyAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGV4cC5YX2FkZF9zeW1ib2wpICE9IGJzc19zZWN0aW9uKQorICAgIHBwY19mcm9iX2xhYmVsIChzeW0pOworICBlbHNlCisgICAgeworICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgZXhwLlhfYWRkX3N5bWJvbCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisgICAgICBpZiAocHBjX2N1cnJlbnRfY3NlY3QtPnN5X3RjLndpdGhpbiA9PSBleHAuWF9hZGRfc3ltYm9sKQorCXBwY19jdXJyZW50X2NzZWN0LT5zeV90Yy53aXRoaW4gPSBzeW07CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoZSAuZnVuY3Rpb24gcHNldWRvLW9wLiAgVGhpcyB0YWtlcyBzZXZlcmFsIGFyZ3VtZW50cy4gIFRoZSBmaXJzdAorICAgYXJndW1lbnQgc2VlbXMgdG8gYmUgdGhlIGV4dGVybmFsIG5hbWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzZWNvbmQKKyAgIGFyZ21lbnQgc2VlbXMgdG8gYmUgdGhlIGxhYmVsIGZvciB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgZ2NjCisgICB1c2VzIHRoZSBzYW1lIG5hbWUgZm9yIGJvdGguICBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSB0aGlyZCBhbmQKKyAgIGZvdXJ0aCBhcmd1bWVudHMgYXJlIG1lYW50IHRvIGJlLiAgVGhlIG9wdGlvbmFsIGZpZnRoIGFyZ3VtZW50IGlzCisgICBhbiBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24uICBJbiBDT0ZGIHRoaXMgc3ltYm9sCisgICBnZXRzIGFuIGF1eCBlbnRyeSBsaWtlIHRoYXQgdXNlZCBmb3IgYSBjc2VjdC4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfZnVuY3Rpb24gKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBlbmRjOworICBjaGFyICpzOworICBzeW1ib2xTICpleHRfc3ltOworICBzeW1ib2xTICpsYWJfc3ltOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICAvKiBJZ25vcmUgYW55IFtQUl0gc3VmZml4LiAgKi8KKyAgbmFtZSA9IHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpOworICBzID0gc3RyY2hyIChuYW1lLCAnWycpOworICBpZiAocyAhPSAoY2hhciAqKSBOVUxMCisgICAgICAmJiBzdHJjbXAgKHMgKyAxLCAiUFJdIikgPT0gMCkKKyAgICAqcyA9ICdcMCc7CisKKyAgZXh0X3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOworCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIm1pc3Npbmcgc3ltYm9sIG5hbWUiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGxhYl9zeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKKworICBpZiAoZXh0X3N5bSAhPSBsYWJfc3ltKQorICAgIHsKKyAgICAgIGV4dF9zeW0tPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKKyAgICAgIGV4dF9zeW0tPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9IGxhYl9zeW07CisgICAgICBleHRfc3ltLT5zeV92YWx1ZS5YX29wX3N5bWJvbCA9IE5VTEw7CisgICAgICBleHRfc3ltLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgPSAwOworICAgIH0KKworICBpZiAoZXh0X3N5bS0+c3lfdGMuY2xhc3MgPT0gLTEpCisgICAgZXh0X3N5bS0+c3lfdGMuY2xhc3MgPSBYTUNfUFI7CisgIGV4dF9zeW0tPnN5X3RjLm91dHB1dCA9IDE7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgIGV4cHJlc3Npb25TIGlnbm9yZTsKKworICAgICAgLyogSWdub3JlIHRoZSB0aGlyZCBhcmd1bWVudC4gICovCisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGV4cHJlc3Npb24gKCZpZ25vcmUpOworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorCXsKKwkgIC8qIElnbm9yZSB0aGUgZm91cnRoIGFyZ3VtZW50LiAgKi8KKwkgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgZXhwcmVzc2lvbiAoJmlnbm9yZSk7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisJICAgIHsKKwkgICAgICAvKiBUaGUgZmlmdGggYXJndW1lbnQgaXMgdGhlIGZ1bmN0aW9uIHNpemUuICAqLworCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGV4dF9zeW0tPnN5X3RjLnNpemUgPSBzeW1ib2xfbmV3ICgiTDBcMDAxIiwKKwkJCQkJCWFic29sdXRlX3NlY3Rpb24sCisJCQkJCQkodmFsdWVUKSAwLAorCQkJCQkJJnplcm9fYWRkcmVzc19mcmFnKTsKKwkgICAgICBwc2V1ZG9fc2V0IChleHRfc3ltLT5zeV90Yy5zaXplKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgU19TRVRfREFUQV9UWVBFIChleHRfc3ltLCBEVF9GQ04gPDwgTl9CVFNIRlQpOworICBTRl9TRVRfRlVOQ1RJT04gKGV4dF9zeW0pOworICBTRl9TRVRfUFJPQ0VTUyAoZXh0X3N5bSk7CisgIGNvZmZfYWRkX2xpbmVzeW0gKGV4dF9zeW0pOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoZSAuYmYgcHNldWRvLW9wLiAgVGhpcyBpcyBqdXN0IGxpa2UgYSBDT0ZGIENfRkNOIHN5bWJvbCBuYW1lZAorICAgIi5iZiIuICAqLworCitzdGF0aWMgdm9pZAorcHBjX2JmIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHN5bWJvbFMgKnN5bTsKKworICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5iZiIpOworICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7CisgIHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93OworICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRkNOKTsKKworICBjb2ZmX2xpbmVfYmFzZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7CisgIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBjb2ZmX2xpbmVfYmFzZSk7CisKKyAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOworCisgIHBwY19mcm9iX2xhYmVsIChzeW0pOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoZSAuZWYgcHNldWRvLW9wLiAgVGhpcyBpcyBqdXN0IGxpa2UgYSBDT0ZGIENfRkNOIHN5bWJvbCBuYW1lZAorICAgIi5lZiIsIGV4Y2VwdCB0aGF0IHRoZSBsaW5lIG51bWJlciBpcyBhYnNvbHV0ZSwgbm90IHJlbGF0aXZlIHRvIHRoZQorICAgbW9zdCByZWNlbnQgIi5iZiIgc3ltYm9sLiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19lZiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzeW1ib2xTICpzeW07CisKKyAgc3ltID0gc3ltYm9sX21ha2UgKCIuZWYiKTsKKyAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOworICBzeW0tPnN5X2ZyYWcgPSBmcmFnX25vdzsKKyAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKKyAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0ZDTik7CisgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7CisgIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKworICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLmJpIGFuZCAuZWkgcHNldWRvLW9wcy4gIFRoZXNlIHRha2UgYSBzdHJpbmcgYXJndW1lbnQgYW5kCisgICBnZW5lcmF0ZXMgYSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9sLCB3aGljaCBnb2VzIGF0IHRoZSBzdGFydCBvZgorICAgdGhlIHN5bWJvbCBsaXN0LiAgKi8KKworc3RhdGljIHZvaWQKK3BwY19iaWVpIChlaSkKKyAgICAgaW50IGVpOworeworICBzdGF0aWMgc3ltYm9sUyAqbGFzdF9iaWVpOworCisgIGNoYXIgKm5hbWU7CisgIGludCBsZW47CisgIHN5bWJvbFMgKnN5bTsKKyAgc3ltYm9sUyAqbG9vazsKKworICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOworCisgIC8qIFRoZSB2YWx1ZSBvZiB0aGVzZSBzeW1ib2xzIGlzIGFjdHVhbGx5IGZpbGUgb2Zmc2V0LiAgSGVyZSB3ZSBzZXQKKyAgICAgdGhlIHZhbHVlIHRvIHRoZSBpbmRleCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzLiAgSW4KKyAgICAgcHBjX2Zyb2Jfc3ltYm9scyB3ZSBzZXQgdGhlIGZpeF9saW5lIGZpZWxkLCB3aGljaCB3aWxsIGNhdXNlIEJGRAorICAgICB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLworCisgIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKKyAgLyogb2JqLWNvZmYuYyBjdXJyZW50bHkgb25seSBoYW5kbGVzIGxpbmUgbnVtYmVycyBjb3JyZWN0bHkgaW4gdGhlCisgICAgIC50ZXh0IHNlY3Rpb24uICAqLworICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7CisgIFNfU0VUX1ZBTFVFIChzeW0sIGNvZmZfbl9saW5lX25vcyk7CisgIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKKworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIGVpID8gQ19FSU5DTCA6IENfQklOQ0wpOworICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7CisgIAorICBmb3IgKGxvb2sgPSBsYXN0X2JpZWkgPyBsYXN0X2JpZWkgOiBzeW1ib2xfcm9vdFA7CisgICAgICAgKGxvb2sgIT0gKHN5bWJvbFMgKikgTlVMTAorCSYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChsb29rKSA9PSBDX0ZJTEUKKwkgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAobG9vaykgPT0gQ19CSU5DTAorCSAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChsb29rKSA9PSBDX0VJTkNMKSk7CisgICAgICAgbG9vayA9IHN5bWJvbF9uZXh0IChsb29rKSkKKyAgICA7CisgIGlmIChsb29rICE9IChzeW1ib2xTICopIE5VTEwpCisgICAgeworICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bSwgbG9vaywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7CisgICAgICBsYXN0X2JpZWkgPSBzeW07CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoZSAuYnMgcHNldWRvLW9wLiAgVGhpcyBnZW5lcmF0ZXMgYSBDX0JTVEFUIHN5bWJvbCBuYW1lZCAiLmJzIi4KKyAgIFRoZXJlIGlzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgYSBjc2VjdCBzeW1ib2wuICBUaGUgdmFsdWUgb2YgdGhlCisgICAuYnMgc3ltYm9sIGlzIHRoZSBpbmRleCBvZiB0aGlzIGNzZWN0IHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfYnMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBlbmRjOworICBzeW1ib2xTICpjc2VjdDsKKyAgc3ltYm9sUyAqc3ltOworCisgIGlmIChwcGNfY3VycmVudF9ibG9jayAhPSBOVUxMKQorICAgIGFzX2JhZCAoXygibmVzdGVkIC5icyBibG9ja3MiKSk7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGNzZWN0ID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7CisKKyAgc3ltID0gc3ltYm9sX21ha2UgKCIuYnMiKTsKKyAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKTsKKyAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JTVEFUKTsKKyAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOworICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7CisKKyAgc3ltLT5zeV90Yy53aXRoaW4gPSBjc2VjdDsKKworICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKKworICBwcGNfY3VycmVudF9ibG9jayA9IHN5bTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLmVzIHBzZXVkby1vcC4gIEdlbmVyYXRlIGEgQ19FU1RBUlQgc3ltYm9sIG5hbWVkIC5lcy4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfZXMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3ltYm9sUyAqc3ltOworCisgIGlmIChwcGNfY3VycmVudF9ibG9jayA9PSBOVUxMKQorICAgIGFzX2JhZCAoXygiLmVzIHdpdGhvdXQgcHJlY2VkaW5nIC5icyIpKTsKKworICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lcyIpOworICBTX1NFVF9TRUdNRU5UIChzeW0sIG5vd19zZWcpOworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRVNUQVQpOworICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7CisgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKworICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKKworICBwcGNfY3VycmVudF9ibG9jayA9IE5VTEw7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhlIC5iYiBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfQkxPQ0sgc3ltYm9sIG5hbWVkIC5iYiwgd2l0aCBhCisgICBsaW5lIG51bWJlci4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfYmIgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3ltYm9sUyAqc3ltOworCisgIHN5bSA9IHN5bWJvbF9tYWtlICgiLmJiIik7CisgIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKKyAgc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7CisgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CTE9DSyk7CisKKyAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCAxKTsKKyAgU0FfU0VUX1NZTV9MTk5PIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKworICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7CisKKyAgU0ZfU0VUX1BST0NFU1MgKHN5bSk7CisKKyAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhlIC5lYiBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfQkxPQ0sgc3ltYm9sIG5hbWVkIC5lYiwgd2l0aCBhCisgICBsaW5lIG51bWJlci4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfZWIgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3ltYm9sUyAqc3ltOworCisgIHN5bSA9IHN5bWJvbF9tYWtlICgiLmViIik7CisgIFNfU0VUX1NFR01FTlQgKHN5bSwgdGV4dF9zZWN0aW9uKTsKKyAgc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7CisgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CTE9DSyk7CisgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7CisgIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKworICBTRl9TRVRfUFJPQ0VTUyAoc3ltKTsKKworICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLmJjIHBzZXVkby1vcC4gIFRoaXMganVzdCBjcmVhdGVzIGEgQ19CQ09NTSBzeW1ib2wgd2l0aCBhCisgICBzcGVjaWZpZWQgbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfYmMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50IGxlbjsKKyAgc3ltYm9sUyAqc3ltOworCisgIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7CisgIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKKyAgU19TRVRfU0VHTUVOVCAoc3ltLCBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKTsKKyAgc3ltLT5ic3ltLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOworICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQkNPTU0pOworICBTX1NFVF9WQUxVRSAoc3ltLCAwKTsKKyAgc3ltLT5zeV90Yy5vdXRwdXQgPSAxOworCisgIHBwY19mcm9iX2xhYmVsIChzeW0pOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIFRoZSAuZWMgcHNldWRvLW9wLiAgVGhpcyBqdXN0IGNyZWF0ZXMgYSBDX0VDT01NIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfZWMgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc3ltYm9sUyAqc3ltOworCisgIHN5bSA9IHN5bWJvbF9tYWtlICgiLmVjIik7CisgIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7CisgIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKKyAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0VDT01NKTsKKyAgU19TRVRfVkFMVUUgKHN5bSwgMCk7CisgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKworICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBUaGUgLnRvYyBwc2V1ZG8tb3AuICBTd2l0Y2ggdG8gdGhlIC50b2Mgc3Vic2VnbWVudC4gICovCisKK3N0YXRpYyB2b2lkCitwcGNfdG9jIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChwcGNfdG9jX2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCisgICAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCBwcGNfdG9jX2NzZWN0LT5zeV90Yy5zdWJzZWcpOworICBlbHNlCisgICAgeworICAgICAgc3Vic2VnVCBzdWJzZWc7CisgICAgICBzeW1ib2xTICpzeW07CisgICAgICBzeW1ib2xTICpsaXN0OworICAgIAorICAgICAgc3Vic2VnID0gcHBjX2RhdGFfc3Vic2VnbWVudDsKKyAgICAgICsrcHBjX2RhdGFfc3Vic2VnbWVudDsKKworICAgICAgc3Vic2VnX25ldyAoc2VnbWVudF9uYW1lIChkYXRhX3NlY3Rpb24pLCBzdWJzZWcpOworICAgICAgcHBjX3RvY19mcmFnID0gZnJhZ19ub3c7CisKKyAgICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJUT0NbVEMwXSIpOworICAgICAgc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGRhdGFfc2VjdGlvbik7CisgICAgICBTX1NFVF9WQUxVRSAoc3ltLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOworICAgICAgc3ltLT5zeV90Yy5zdWJzZWcgPSBzdWJzZWc7CisgICAgICBzeW0tPnN5X3RjLm91dHB1dCA9IDE7CisgICAgICBzeW0tPnN5X3RjLndpdGhpbiA9IHN5bTsKKworICAgICAgcHBjX3RvY19jc2VjdCA9IHN5bTsKKwkgIAorICAgICAgZm9yIChsaXN0ID0gcHBjX2RhdGFfY3NlY3RzOworCSAgIGxpc3QtPnN5X3RjLm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTDsKKwkgICBsaXN0ID0gbGlzdC0+c3lfdGMubmV4dCkKKwk7CisgICAgICBsaXN0LT5zeV90Yy5uZXh0ID0gc3ltOworCisgICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBsaXN0LT5zeV90Yy53aXRoaW4sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworICAgIH0KKworICBwcGNfY3VycmVudF9jc2VjdCA9IHBwY190b2NfY3NlY3Q7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogVGhlIEFJWCBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBhbGlnbnMgdGhlIG9wZXJhbmRzIG9mIGEgLmxvbmcgb3IKKyAgIC5zaG9ydCBwc2V1ZG8tb3AsIGFuZCB3ZSB3YW50IHRvIGJlIGNvbXBhdGlibGUuICAqLworCitzdGF0aWMgdm9pZAorcHBjX3hjb2ZmX2NvbnMgKGxvZ19zaXplKQorICAgICBpbnQgbG9nX3NpemU7Cit7CisgIGZyYWdfYWxpZ24gKGxvZ19zaXplLCAwLCAwKTsKKyAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbG9nX3NpemUpOworICBjb25zICgxIDw8IGxvZ19zaXplKTsKK30KKworc3RhdGljIHZvaWQKK3BwY192Ynl0ZSAoZHVtbXkpCisgICAgIGludCBkdW1teTsKK3sKKyAgZXhwcmVzc2lvblMgZXhwOworICBpbnQgYnl0ZV9jb3VudDsKKworICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7CisKKyAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCisgICAgeworICAgICAgYXNfYmFkIChfKCJub24tY29uc3RhbnQgYnl0ZSBjb3VudCIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYnl0ZV9jb3VudCA9IGV4cC5YX2FkZF9udW1iZXI7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIGNvbnMgKGJ5dGVfY291bnQpOworfQorCisjZW5kaWYgLyogT0JKX1hDT0ZGICovCisMCisvKiBUaGUgLnRjIHBzZXVkby1vcC4gIFRoaXMgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIFhDT0ZGIG9yCisgICBFTEYuICBUaGlzIHRha2VzIHR3byBvciBtb3JlIGFyZ3VtZW50cy4KKworICAgV2hlbiBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIHRvCisgICBnaXZlIHRvIHRoaXMgbG9jYXRpb24gaW4gdGhlIHRvYzsgdGhpcyB3aWxsIGJlIGEgc3ltYm9sIHdpdGggY2xhc3MKKyAgIFRDLiAgVGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcmUgNCBieXRlIHZhbHVlcyB0byBhY3R1YWxseSBwdXQgYXQKKyAgIHRoaXMgbG9jYXRpb24gaW4gdGhlIFRPQzsgb2Z0ZW4gdGhlcmUgaXMganVzdCBvbmUgbW9yZSBhcmd1bWVudCwgYQorICAgcmVsb2NhdGVhYmxlIHN5bWJvbCByZWZlcmVuY2UuCisKKyAgIFdoZW4gbm90IGdlbmVyYXRpbmcgWENPRkYgb3V0cHV0LCB0aGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSwgYnV0CisgICB0aGUgZmlyc3QgYXJndW1lbnQgaXMgc2ltcGx5IGlnbm9yZWQuICAqLworCitzdGF0aWMgdm9pZAorcHBjX3RjIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisjaWZkZWYgT0JKX1hDT0ZGCisKKyAgLyogRGVmaW5lIHRoZSBUT0Mgc3ltYm9sIG5hbWUuICAqLworICB7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyIGVuZGM7CisgICAgc3ltYm9sUyAqc3ltOworCisgICAgaWYgKHBwY190b2NfY3NlY3QgPT0gKHN5bWJvbFMgKikgTlVMTAorCXx8IHBwY190b2NfY3NlY3QgIT0gcHBjX2N1cnJlbnRfY3NlY3QpCisgICAgICB7CisJYXNfYmFkIChfKCIudGMgbm90IGluIC50b2Mgc2VjdGlvbiIpKTsKKwlpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCXJldHVybjsKKyAgICAgIH0KKworICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgICAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisKKyAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKKworICAgIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCisgICAgICB7CisJc3ltYm9sUyAqbGFiZWw7CisKKwlsYWJlbCA9IHBwY19jdXJyZW50X2NzZWN0LT5zeV90Yy53aXRoaW47CisJaWYgKGxhYmVsLT5zeV90Yy5jbGFzcyAhPSBYTUNfVEMwKQorCSAgeworCSAgICBhc19iYWQgKF8oIi50YyB3aXRoIG5vIGxhYmVsIikpOworCSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgICByZXR1cm47CisJICB9CisKKwlTX1NFVF9TRUdNRU5UIChsYWJlbCwgU19HRVRfU0VHTUVOVCAoc3ltKSk7CisJbGFiZWwtPnN5X2ZyYWcgPSBzeW0tPnN5X2ZyYWc7CisJU19TRVRfVkFMVUUgKGxhYmVsLCBTX0dFVF9WQUxVRSAoc3ltKSk7CisKKwl3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKworCXJldHVybjsKKyAgICAgIH0KKworICAgIFNfU0VUX1NFR01FTlQgKHN5bSwgbm93X3NlZyk7CisgICAgc3ltLT5zeV9mcmFnID0gZnJhZ19ub3c7CisgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKKyAgICBzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1RDOworICAgIHN5bS0+c3lfdGMub3V0cHV0ID0gMTsKKworICAgIHBwY19mcm9iX2xhYmVsIChzeW0pOworICB9CisKKyNlbHNlIC8qICEgZGVmaW5lZCAoT0JKX1hDT0ZGKSAqLworCisgIC8qIFNraXAgdGhlIFRPQyBzeW1ib2wgbmFtZS4gICovCisgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpCisJIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1snCisJIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ10nCisJIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3snCisJIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ30nKQorICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIC8qIEFsaWduIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KKyAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7CisgIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOworCisjZW5kaWYgLyogISBkZWZpbmVkIChPQkpfWENPRkYpICovCisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGNvbnMgKDQpOworICAgIH0KK30KKwwKKyNpZmRlZiBURV9QRQorCisvKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBXaW5kb3dzIE5UIFBvd2VyUEMgUEUgKGNvZmYpIGZvcm1hdCAqLworCisvKiBTZXQgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCitzdGF0aWMgdm9pZAorcHBjX3NldF9jdXJyZW50X3NlY3Rpb24gKG5ldykKKyAgICAgc2VnVCBuZXc7Cit7CisgIHBwY19wcmV2aW91c19zZWN0aW9uID0gcHBjX2N1cnJlbnRfc2VjdGlvbjsKKyAgcHBjX2N1cnJlbnRfc2VjdGlvbiA9IG5ldzsKK30KKworLyogcHNldWRvLW9wOiAucHJldmlvdXMKKyAgIGJlaGF2aW91cjogdG9nZ2xlcyB0aGUgY3VycmVudCBzZWN0aW9uIHdpdGggdGhlIHByZXZpb3VzIHNlY3Rpb24uCisgICBlcnJvcnM6ICAgIE5vbmUKKyAgIHdhcm5pbmdzOiAgIk5vIHByZXZpb3VzIHNlY3Rpb24iCisqLworc3RhdGljIHZvaWQKK3BwY19wcmV2aW91cyhpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHN5bWJvbFMgKnRtcDsKKworICBpZiAocHBjX3ByZXZpb3VzX3NlY3Rpb24gPT0gTlVMTCkgCisgICAgeworICAgICAgYXNfd2FybihfKCJObyBwcmV2aW91cyBzZWN0aW9uIHRvIHJldHVybiB0by4gRGlyZWN0aXZlIGlnbm9yZWQuIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdWJzZWdfc2V0KHBwY19wcmV2aW91c19zZWN0aW9uLCAwKTsKKworICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihwcGNfcHJldmlvdXNfc2VjdGlvbik7Cit9CisKKy8qIHBzZXVkby1vcDogLnBkYXRhCisgICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgorICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCisgICBlcnJvcnM6ICAgIE5vbmUKKyAgIHdhcm5pbmdzOiAgTm9uZQorICAgaW5pdGlhbDogICAuc2VjdGlvbiAucGRhdGEgImFkcjMiCisgICAgICAgICAgICAgIGEgLSBkb24ndCBrbm93IC0tIG1heWJlIGEgbWlzcHJpbnQKKwkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQorCSAgICAgIHIgLSByZWFkYWJsZQorCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKKworICAgY29tbWVudGFyeToKKyAgIFRhZyBpbmRleCB0YWJsZXMgKGFsc28ga25vd24gYXMgdGhlIGZ1bmN0aW9uIHRhYmxlKSBmb3IgZXhjZXB0aW9uCisgICBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuCisKKyovCitzdGF0aWMgdm9pZAorcHBjX3BkYXRhKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKHBkYXRhX3NlY3Rpb24gPT0gMCkgCisgICAgeworICAgICAgcGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucGRhdGEiLCAwKTsKKyAgICAgIAorICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHBkYXRhX3NlY3Rpb24sCisJCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQworCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKKyAgICAgIAorICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBwZGF0YV9zZWN0aW9uLCAyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldygiLnBkYXRhIiwgMCk7CisgICAgfQorICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihwZGF0YV9zZWN0aW9uKTsKK30KKworLyogcHNldWRvLW9wOiAueWRhdGEKKyAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCisgICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKKyAgIGVycm9yczogICAgTm9uZQorICAgd2FybmluZ3M6ICBOb25lCisgICBpbml0aWFsOiAgIC5zZWN0aW9uIC55ZGF0YSAiZHJ3MyIKKyAgICAgICAgICAgICAgYSAtIGRvbid0IGtub3cgLS0gbWF5YmUgYSBtaXNwcmludAorCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCisJICAgICAgciAtIHJlYWRhYmxlCisJICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQorICAgY29tbWVudGFyeToKKyAgIFRhZyB0YWJsZXMgKGFsc28ga25vd24gYXMgdGhlIHNjb3BlIHRhYmxlKSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nLAorICAgZGVidWdnaW5nLCBldGMuCisqLworc3RhdGljIHZvaWQKK3BwY195ZGF0YShpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmICh5ZGF0YV9zZWN0aW9uID09IDApIAorICAgIHsKKyAgICAgIHlkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnlkYXRhIiwgMCk7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgeWRhdGFfc2VjdGlvbiwKKwkJCSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKKwkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKKworICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB5ZGF0YV9zZWN0aW9uLCAzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5ZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi55ZGF0YSIsIDApOworICAgIH0KKyAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24oeWRhdGFfc2VjdGlvbik7Cit9CisKKy8qIHBzZXVkby1vcDogLnJlbGRhdGEKKyAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIHdyaXRlIGRhdGEgc2VjdGlvbgorICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkICg0LWJ5dGUpCisJICAgICAgRklYTUU6IHJlbG9jYXRpb24gaXMgYXBwbGllZCB0byBpdAorCSAgICAgIEZJWE1FOiB3aGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAuZGF0YT8KKyAgIGVycm9yczogICAgTm9uZQorICAgd2FybmluZ3M6ICBOb25lCisgICBpbml0aWFsOiAgIC5zZWN0aW9uIC5yZWxkYXRhICJkcnczIgorCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCisJICAgICAgciAtIHJlYWRhYmxlCisJICAgICAgdyAtIHdyaXRlYWJsZQorCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDggYnl0ZSBib3VuZGFyeSkKKworICAgY29tbWVudGFyeToKKyAgIExpa2UgLmRhdGEsIGJ1dCBpbnRlbmRlZCB0byBob2xkIGRhdGEgc3ViamVjdCB0byByZWxvY2F0aW9uLCBzdWNoIGFzCisgICBmdW5jdGlvbiBkZXNjcmlwdG9ycywgZXRjLgorKi8KK3N0YXRpYyB2b2lkCitwcGNfcmVsZGF0YShpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChyZWxkYXRhX3NlY3Rpb24gPT0gMCkKKyAgICB7CisgICAgICByZWxkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJlbGRhdGEiLCAwKTsKKworICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHJlbGRhdGFfc2VjdGlvbiwKKwkJCSAgICAgKCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAKKwkJCSAgICAgIHwgU0VDX0RBVEEgKSk7CisKKyAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcmVsZGF0YV9zZWN0aW9uLCAyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWxkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJlbGRhdGEiLCAwKTsKKyAgICB9CisgIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHJlbGRhdGFfc2VjdGlvbik7Cit9CisKKy8qIHBzZXVkby1vcDogLnJkYXRhCisgICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgorICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCisgICBlcnJvcnM6ICAgIE5vbmUKKyAgIHdhcm5pbmdzOiAgTm9uZQorICAgaW5pdGlhbDogICAuc2VjdGlvbiAucmRhdGEgImRyMyIKKwkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQorCSAgICAgIHIgLSByZWFkYWJsZQorCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKKyovCitzdGF0aWMgdm9pZAorcHBjX3JkYXRhKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKHJkYXRhX3NlY3Rpb24gPT0gMCkKKyAgICB7CisgICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOworICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHJkYXRhX3NlY3Rpb24sCisJCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQworCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKKworICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCByZGF0YV9zZWN0aW9uLCAyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOworICAgIH0KKyAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocmRhdGFfc2VjdGlvbik7Cit9CisKKy8qIHBzZXVkby1vcDogLnVhbG9uZworICAgYmVoYXZpb3VyOiBtdWNoIGxpa2UgLmludCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgbm8gYWxpZ25tZW50IGlzIAorICAgICAgICAgICAgICBwZXJmb3JtZWQuCisJICAgICAgRklYTUU6IHRlc3QgdGhlIGFsaWdubWVudCBzdGF0ZW1lbnQKKyAgIGVycm9yczogICAgTm9uZQorICAgd2FybmluZ3M6ICBOb25lCisqLworc3RhdGljIHZvaWQKK3BwY191YWxvbmcoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICAvKiB0cnkgZm9yIGxvbmcgKi8KKyAgY29ucyAoIDQgKTsKK30KKworLyogcHNldWRvLW9wOiAuem5vcCAgPHN5bWJvbCBuYW1lPgorICAgYmVoYXZpb3VyOiBJc3N1ZSBhIG5vcCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICBJc3N1ZSBhIElNQUdFX1JFTF9QUENfSUZHTFVFIHJlbG9jYXRpb24gYWdhaW5zdCBpdCwgdXNpbmcKKwkgICAgICB0aGUgc3VwcGxpZWQgc3ltYm9sIG5hbWUuCisgICBlcnJvcnM6ICAgIE5vbmUKKyAgIHdhcm5pbmdzOiAgTWlzc2luZyBzeW1ib2wgbmFtZQorKi8KK3N0YXRpYyB2b2lkCitwcGNfem5vcChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7CisgIGV4cHJlc3Npb25TIGV4OworICBjaGFyICpmOworCisgIHN5bWJvbFMgKnN5bTsKKworICAvKiBTdHJpcCBvdXQgdGhlIHN5bWJvbCBuYW1lICovCisgIGNoYXIgKnN5bWJvbF9uYW1lOworICBjaGFyIGM7CisgIGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGludCBleHA7CisgIGZsYWd3b3JkIGZsYWdzOworICBhc2VjdGlvbiAqc2VjOworCisgIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHN5bWJvbF9uYW1lICsgMSk7CisgIHN0cmNweSAobmFtZSwgc3ltYm9sX25hbWUpOworCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICAvKiBMb29rIHVwIHRoZSBvcGNvZGUgaW4gdGhlIGhhc2ggdGFibGUuICAqLworICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIGhhc2hfZmluZCAocHBjX2hhc2gsICJub3AiKTsKKworICAvKiBzdGljayBpbiB0aGUgbm9wICovCisgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKKworICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgZiA9IGZyYWdfbW9yZSAoNCk7CisgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7CisgIGZpeF9uZXcgKGZyYWdfbm93LAorCSAgIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkgICA0LAorCSAgIHN5bSwKKwkgICAwLAorCSAgIDAsCisJICAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCk7CisKK30KKworLyogcHNldWRvLW9wOiAKKyAgIGJlaGF2aW91cjogCisgICBlcnJvcnM6ICAgIAorICAgd2FybmluZ3M6ICAKKyovCitzdGF0aWMgdm9pZAorcHBjX3BlX2NvbW0obGNvbW0pCisgICAgIGludCBsY29tbTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKKyAgcmVnaXN0ZXIgY2hhciBjOworICByZWdpc3RlciBjaGFyICpwOworICBvZmZzZXRUIHRlbXA7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CisgIG9mZnNldFQgYWxpZ247CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLworICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAqcCA9IGM7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KKyAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghIGxjb21tKQorICAgIHsKKyAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKwlhbGlnbiA9IDM7CisgICAgICBlbHNlCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCSAgaWYgKGFsaWduIDw9IDApCisJICAgIHsKKwkgICAgICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOworCSAgICAgIGFsaWduID0gMzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgKnAgPSAwOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisKKyAgKnAgPSBjOworICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAorCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkpCisgICAgeworICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSB0ZW1wKQorCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAorCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKKwkJKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKKwkJKGxvbmcpIHRlbXApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSB0ZW1wKTsKKyAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyoKKyAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgorICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQorICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KKyAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcworICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbworICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKKyAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAorICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCisgKiBzdWJzZWdtZW50IG51bWJlci4KKyAqCisgKiBGSVhNRTogdGhpcyBpcyBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gcHJvY2Vzc2luZyBmcm9tIG9iai1jb2ZmLmMsIHdpdGgKKyAqIGFkZGl0aW9ucy9jaGFuZ2VzIGZvciB0aGUgbW90by1wYXMgYXNzZW1ibGVyIHN1cHBvcnQuIFRoZXJlIGFyZSB0aHJlZQorICogY2F0ZWdvcmllczoKKyAqCisgKiBGSVhNRTogSSBqdXN0IG5vdGljZWQgdGhpcy4gVGhpcyBkb2Vzbid0IHdvcmsgYXQgYWxsIHJlYWxseS4gSXQgaXQgCisgKiAgICAgICAgc2V0dGluZyBiaXRzIHRoYXQgYmZkIHByb2JhYmx5IG5laXRoZXIgdW5kZXJzdGFuZHMgb3IgdXNlcy4gVGhlCisgKiAgICAgICAgY29ycmVjdCBhcHByb2FjaCAoPykgd2lsbCBoYXZlIHRvIGluY29ycG9yYXRlIGV4dHJhIGZpZWxkcyBhdHRhY2hlZAorICogICAgICAgIHRvIHRoZSBzZWN0aW9uIHRvIGhvbGQgdGhlIHN5c3RlbSBzcGVjaWZpYyBzdHVmZi4gKGtyaykKKyAqCisgKiBTZWN0aW9uIENvbnRlbnRzOgorICogJ2EnIC0gdW5rbm93biAtIHJlZmVycmVkIHRvIGluIGRvY3VtZW50YXRpb24sIGJ1dCBubyBkZWZpbml0aW9uIHN1cHBsaWVkCisgKiAnYycgLSBzZWN0aW9uIGhhcyBjb2RlCisgKiAnZCcgLSBzZWN0aW9uIGhhcyBpbml0aWFsaXplZCBkYXRhCisgKiAndScgLSBzZWN0aW9uIGhhcyB1bmluaXRpYWxpemVkIGRhdGEKKyAqICdpJyAtIHNlY3Rpb24gY29udGFpbnMgZGlyZWN0aXZlcyAoaW5mbykKKyAqICduJyAtIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZAorICogJ1InIC0gcmVtb3ZlIHNlY3Rpb24gYXQgbGluayB0aW1lCisgKgorICogU2VjdGlvbiBQcm90ZWN0aW9uOgorICogJ3InIC0gc2VjdGlvbiBpcyByZWFkYWJsZQorICogJ3cnIC0gc2VjdGlvbiBpcyB3cml0ZWFibGUKKyAqICd4JyAtIHNlY3Rpb24gaXMgZXhlY3V0YWJsZQorICogJ3MnIC0gc2VjdGlvbiBpcyBzaGFyYWJsZQorICoKKyAqIFNlY3Rpb24gQWxpZ25tZW50OgorICogJzAnIC0gYWxpZ24gdG8gYnl0ZSBib3VuZGFyeQorICogJzEnIC0gYWxpZ24gdG8gaGFsZndvcmQgdW5kYXJ5CisgKiAnMicgLSBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5CisgKiAnMycgLSBhbGlnbiB0byBkb3VibGV3b3JkIGJvdW5kYXJ5CisgKiAnNCcgLSBhbGlnbiB0byBxdWFkd29yZCBib3VuZGFyeQorICogJzUnIC0gYWxpZ24gdG8gMzIgYnl0ZSBib3VuZGFyeQorICogJzYnIC0gYWxpZ24gdG8gNjQgYnl0ZSBib3VuZGFyeQorICoKKyAqLworCit2b2lkCitwcGNfcGVfc2VjdGlvbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLworICBjaGFyICpzZWN0aW9uX25hbWU7CisgIGNoYXIgYzsKKyAgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgaW50IGV4cDsKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIHNlZ1Qgc2VjOworICBpbnQgYWxpZ247CisKKyAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOworICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIGV4cCA9IDA7CisgIGZsYWdzID0gU0VDX05PX0ZMQUdTOworCisgIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkMiIpID09IDApCisgICAgeworICAgICAgYWxpZ24gPSAwOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDMiKSA9PSAwKQorICAgIHsKKyAgICAgIGFsaWduID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQ0IikgPT0gMCkKKyAgICB7CisgICAgICBhbGlnbiA9IDI7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkNSIpID09IDApCisgICAgeworICAgICAgYWxpZ24gPSAyOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDYiKSA9PSAwKQorICAgIHsKKyAgICAgIGFsaWduID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICBhbGlnbiA9IDQ7IC8qIGRlZmF1bHQgYWxpZ25tZW50IHRvIDE2IGJ5dGUgYm91bmRhcnkgKi8KKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCisJZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBlbHNlCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKKwkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorCSAgICB7CisJICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQorCQl7CisJCSAgLyogU2VjdGlvbiBDb250ZW50cyAqLworCQljYXNlICdhJzogLyogdW5rbm93biAqLworCQkgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgLS0gJ2EnIikpOworCQkgIGJyZWFrOworCQljYXNlICdjJzogLyogY29kZSBzZWN0aW9uICovCisJCSAgZmxhZ3MgfD0gU0VDX0NPREU7IAorCQkgIGJyZWFrOworCQljYXNlICdkJzogLyogc2VjdGlvbiBoYXMgaW5pdGlhbGl6ZWQgZGF0YSAqLworCQkgIGZsYWdzIHw9IFNFQ19EQVRBOworCQkgIGJyZWFrOworCQljYXNlICd1JzogLyogc2VjdGlvbiBoYXMgdW5pbml0aWFsaXplZCBkYXRhICovCisJCSAgLyogRklYTUU6IFRoaXMgaXMgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEKKwkJICAgICBpbiB3aW5udC5oICovCisJCSAgZmxhZ3MgfD0gU0VDX1JPTTsKKwkJICBicmVhazsKKwkJY2FzZSAnaSc6IC8qIHNlY3Rpb24gY29udGFpbnMgZGlyZWN0aXZlcyAoaW5mbykgKi8KKwkJICAvKiBGSVhNRTogVGhpcyBpcyBJTUFHRV9TQ05fTE5LX0lORk8KKwkJICAgICBpbiB3aW5udC5oICovCisJCSAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKKwkJICBicmVhazsKKwkJY2FzZSAnbic6IC8qIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZCAqLworCQkgIGZsYWdzICY9fiBTRUNfTE9BRDsgCisJCSAgYnJlYWs7CisJCWNhc2UgJ1InOiAvKiBSZW1vdmUgc2VjdGlvbiBhdCBsaW5rIHRpbWUgKi8KKwkJICBmbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKKwkJICBicmVhazsKKworCQkgIC8qIFNlY3Rpb24gUHJvdGVjdGlvbiAqLworCQljYXNlICdyJzogLyogc2VjdGlvbiBpcyByZWFkYWJsZSAqLworCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRDsKKwkJICBicmVhazsKKwkJY2FzZSAndyc6IC8qIHNlY3Rpb24gaXMgd3JpdGVhYmxlICovCisJCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9XUklURTsKKwkJICBicmVhazsKKwkJY2FzZSAneCc6IC8qIHNlY3Rpb24gaXMgZXhlY3V0YWJsZSAqLworCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsKKwkJICBicmVhazsKKwkJY2FzZSAncyc6IC8qIHNlY3Rpb24gaXMgc2hhcmFibGUgKi8KKwkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1NIQVJFRDsKKwkJICBicmVhazsKKworCQkgIC8qIFNlY3Rpb24gQWxpZ25tZW50ICovCisJCWNhc2UgJzAnOiAvKiBhbGlnbiB0byBieXRlIGJvdW5kYXJ5ICovCisJCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzFCWVRFUzsKKwkJICBhbGlnbiA9IDA7CisJCSAgYnJlYWs7CisJCWNhc2UgJzEnOiAgLyogYWxpZ24gdG8gaGFsZndvcmQgYm91bmRhcnkgKi8KKwkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMkJZVEVTOworCQkgIGFsaWduID0gMTsKKwkJICBicmVhazsKKwkJY2FzZSAnMic6ICAvKiBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5ICovCisJCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzRCWVRFUzsKKwkJICBhbGlnbiA9IDI7CisJCSAgYnJlYWs7CisJCWNhc2UgJzMnOiAgLyogYWxpZ24gdG8gZG91Ymxld29yZCBib3VuZGFyeSAqLworCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl84QllURVM7CisJCSAgYWxpZ24gPSAzOworCQkgIGJyZWFrOworCQljYXNlICc0JzogIC8qIGFsaWduIHRvIHF1YWR3b3JkIGJvdW5kYXJ5ICovCisJCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzE2QllURVM7CisJCSAgYWxpZ24gPSA0OworCQkgIGJyZWFrOworCQljYXNlICc1JzogIC8qIGFsaWduIHRvIDMyIGJ5dGUgYm91bmRhcnkgKi8KKwkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUzsKKwkJICBhbGlnbiA9IDU7CisJCSAgYnJlYWs7CisJCWNhc2UgJzYnOiAgLyogYWxpZ24gdG8gNjQgYnl0ZSBib3VuZGFyeSAqLworCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl82NEJZVEVTOworCQkgIGFsaWduID0gNjsKKwkJICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgIGFzX2JhZChfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKKwkJCSAqaW5wdXRfbGluZV9wb2ludGVyKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgICB9CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCisJICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCX0KKyAgICB9CisKKyAgc2VjID0gc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7CisKKyAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24oc2VjKTsKKworICBpZiAoZmxhZ3MgIT0gU0VDX05PX0ZMQUdTKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKSkKKwlhc19iYWQgKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKKwkJYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAorCQliZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgfQorCisgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWMsIGFsaWduKTsKKworfQorCitzdGF0aWMgdm9pZAorcHBjX3BlX2Z1bmN0aW9uIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgZW5kYzsKKyAgc3ltYm9sUyAqZXh0X3N5bTsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgZXh0X3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOworCisgIFNfU0VUX0RBVEFfVFlQRSAoZXh0X3N5bSwgRFRfRkNOIDw8IE5fQlRTSEZUKTsKKyAgU0ZfU0VUX0ZVTkNUSU9OIChleHRfc3ltKTsKKyAgU0ZfU0VUX1BST0NFU1MgKGV4dF9zeW0pOworICBjb2ZmX2FkZF9saW5lc3ltIChleHRfc3ltKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCitzdGF0aWMgdm9pZAorcHBjX3BlX3RvY2QgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaWYgKHRvY2RhdGFfc2VjdGlvbiA9PSAwKQorICAgIHsKKyAgICAgIHRvY2RhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudG9jZCIsIDApOworICAgICAgLyogRklYTUU6IHNlY3Rpb24gZmxhZ3Mgd29uJ3Qgd29yayAqLworICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRvY2RhdGFfc2VjdGlvbiwKKwkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCisJCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOworCisgICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHRvY2RhdGFfc2VjdGlvbiwgMik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudG9jZCIsIDApOworICAgIH0KKworICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbih0b2NkYXRhX3NlY3Rpb24pOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIERvbid0IGFkanVzdCBUT0MgcmVsb2NzIHRvIHVzZSB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLworCitpbnQKK3BwY19wZV9maXhfYWRqdXN0YWJsZSAoZml4KQorICAgICBmaXhTICpmaXg7Cit7CisgIHJldHVybiBmaXgtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfUFBDX1RPQzE2OworfQorCisjZW5kaWYKKwwKKyNpZmRlZiBPQkpfWENPRkYKKworLyogWENPRkYgc3BlY2lmaWMgc3ltYm9sIGFuZCBmaWxlIGhhbmRsaW5nLiAgKi8KKworLyogQ2Fub25pY2FsaXplIHRoZSBzeW1ib2wgbmFtZS4gIFdlIHVzZSB0aGUgdG8gZm9yY2UgdGhlIHN1ZmZpeCwgaWYKKyAgIGFueSwgdG8gdXNlIHNxdWFyZSBicmFja2V0cywgYW5kIHRvIGJlIGluIHVwcGVyIGNhc2UuICAqLworCitjaGFyICoKK3BwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGNoYXIgKnM7CisKKyAgaWYgKHBwY19zdGFiX3N5bWJvbCkKKyAgICByZXR1cm4gbmFtZTsKKworICBmb3IgKHMgPSBuYW1lOyAqcyAhPSAnXDAnICYmICpzICE9ICd7JyAmJiAqcyAhPSAnWyc7IHMrKykKKyAgICA7CisgIGlmICgqcyAhPSAnXDAnKQorICAgIHsKKyAgICAgIGNoYXIgYnJhYzsKKworICAgICAgaWYgKCpzID09ICdbJykKKwlicmFjID0gJ10nOworICAgICAgZWxzZQorCXsKKwkgICpzID0gJ1snOworCSAgYnJhYyA9ICd9JzsKKwl9CisKKyAgICAgIGZvciAocysrOyAqcyAhPSAnXDAnICYmICpzICE9IGJyYWM7IHMrKykKKwlpZiAoaXNsb3dlciAoKnMpKQorCSAgKnMgPSB0b3VwcGVyICgqcyk7CisKKyAgICAgIGlmICgqcyA9PSAnXDAnIHx8IHNbMV0gIT0gJ1wwJykKKwlhc19iYWQgKF8oImJhZCBzeW1ib2wgc3VmZml4IikpOworCisgICAgICAqcyA9ICddJzsKKyAgICB9CisKKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qIFNldCB0aGUgY2xhc3Mgb2YgYSBzeW1ib2wgYmFzZWQgb24gdGhlIHN1ZmZpeCwgaWYgYW55LiAgVGhpcyBpcworICAgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IHN5bWJvbCBpcyBjcmVhdGVkLiAgKi8KKwordm9pZAorcHBjX3N5bWJvbF9uZXdfaG9vayAoc3ltKQorICAgICBzeW1ib2xTICpzeW07Cit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgc3ltLT5zeV90Yy5uZXh0ID0gTlVMTDsKKyAgc3ltLT5zeV90Yy5vdXRwdXQgPSAwOworICBzeW0tPnN5X3RjLmNsYXNzID0gLTE7CisgIHN5bS0+c3lfdGMucmVhbF9uYW1lID0gTlVMTDsKKyAgc3ltLT5zeV90Yy5zdWJzZWcgPSAwOworICBzeW0tPnN5X3RjLmFsaWduID0gMDsKKyAgc3ltLT5zeV90Yy5zaXplID0gTlVMTDsKKyAgc3ltLT5zeV90Yy53aXRoaW4gPSBOVUxMOworCisgIGlmIChwcGNfc3RhYl9zeW1ib2wpCisgICAgcmV0dXJuOworCisgIHMgPSBzdHJjaHIgKFNfR0VUX05BTUUgKHN5bSksICdbJyk7CisgIGlmIChzID09IChjb25zdCBjaGFyICopIE5VTEwpCisgICAgeworICAgICAgLyogVGhlcmUgaXMgbm8gc3VmZml4LiAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKytzOworCisgIHN3aXRjaCAoc1swXSkKKyAgICB7CisgICAgY2FzZSAnQic6CisgICAgICBpZiAoc3RyY21wIChzLCAiQlNdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX0JTOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CisgICAgICBpZiAoc3RyY21wIChzLCAiREJdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX0RCOworICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiRFNdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX0RTOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRyc6CisgICAgICBpZiAoc3RyY21wIChzLCAiR0xdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX0dMOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUCc6CisgICAgICBpZiAoc3RyY21wIChzLCAiUFJdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1BSOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUic6CisgICAgICBpZiAoc3RyY21wIChzLCAiUk9dIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1JPOworICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiUlddIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1JXOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6CisgICAgICBpZiAoc3RyY21wIChzLCAiU1ZdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1NWOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnVCc6CisgICAgICBpZiAoc3RyY21wIChzLCAiVENdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1RDOworICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEldIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1RJOworICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEJdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1RCOworICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEMwXSIpID09IDAgfHwgc3RyY21wIChzLCAiVDBdIikgPT0gMCkKKwlzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1RDMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1UnOgorICAgICAgaWYgKHN0cmNtcCAocywgIlVBXSIpID09IDApCisJc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19VQTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlVDXSIpID09IDApCisJc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19VQzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1gnOgorICAgICAgaWYgKHN0cmNtcCAocywgIlhPXSIpID09IDApCisJc3ltLT5zeV90Yy5jbGFzcyA9IFhNQ19YTzsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAoc3ltLT5zeV90Yy5jbGFzcyA9PSAtMSkKKyAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBzeW1ib2wgc3VmZml4IikpOworfQorCisvKiBTZXQgdGhlIGNsYXNzIG9mIGEgbGFiZWwgYmFzZWQgb24gd2hlcmUgaXQgaXMgZGVmaW5lZC4gIFRoaXMKKyAgIGhhbmRsZXMgc3ltYm9scyB3aXRob3V0IHN1ZmZpeGVzLiAgQWxzbywgbW92ZSB0aGUgc3ltYm9sIHNvIHRoYXQgaXQKKyAgIGZvbGxvd3MgdGhlIGNzZWN0IHN5bWJvbC4gICovCisKK3ZvaWQKK3BwY19mcm9iX2xhYmVsIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgaWYgKHBwY19jdXJyZW50X2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCisgICAgeworICAgICAgaWYgKHN5bS0+c3lfdGMuY2xhc3MgPT0gLTEpCisJc3ltLT5zeV90Yy5jbGFzcyA9IHBwY19jdXJyZW50X2NzZWN0LT5zeV90Yy5jbGFzczsKKworICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKyAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgcHBjX2N1cnJlbnRfY3NlY3QtPnN5X3RjLndpdGhpbiwgJnN5bWJvbF9yb290UCwKKwkJICAgICAmc3ltYm9sX2xhc3RQKTsKKyAgICAgIHBwY19jdXJyZW50X2NzZWN0LT5zeV90Yy53aXRoaW4gPSBzeW07CisgICAgfQorfQorCisvKiBUaGlzIHZhcmlhYmxlIGlzIHNldCBieSBwcGNfZnJvYl9zeW1ib2wgaWYgYW55IGFic29sdXRlIHN5bWJvbHMgYXJlCisgICBzZWVuLiAgSXQgdGVsbHMgcHBjX2FkanVzdF9zeW10YWIgd2hldGhlciBpdCBuZWVkcyB0byBsb29rIHRocm91Z2gKKyAgIHRoZSBzeW1ib2xzLiAgKi8KKworc3RhdGljIGJvb2xlYW4gcHBjX3Nhd19hYnM7CisKKy8qIENoYW5nZSB0aGUgbmFtZSBvZiBhIHN5bWJvbCBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFNldCB0aGUKKyAgIHJlYWwgbmFtZSBpZiB0aGUgLnJlbmFtZSBwc2V1ZG8tb3Agd2FzIHVzZWQuICBPdGhlcndpc2UsIHJlbW92ZSBhbnkKKyAgIGNsYXNzIHN1ZmZpeC4gIFJldHVybiAxIGlmIHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgIHN5bWJvbCB0YWJsZS4gICovCisKK2ludAorcHBjX2Zyb2Jfc3ltYm9sIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgc3RhdGljIHN5bWJvbFMgKnBwY19sYXN0X2Z1bmN0aW9uOworICBzdGF0aWMgc3ltYm9sUyAqc2V0X2VuZDsKKworICAvKiBEaXNjYXJkIHN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgc3ltYm9sCisgICAgIHRhYmxlLiAgKi8KKyAgaWYgKCEgc3ltLT5zeV91c2VkX2luX3JlbG9jCisgICAgICAmJiAoKHN5bS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKKwkgIHx8ICghIFNfSVNfRVhURVJOQUwgKHN5bSkKKwkgICAgICAmJiAhIHN5bS0+c3lfdGMub3V0cHV0CisJICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0ZJTEUpKSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoc3ltLT5zeV90Yy5yZWFsX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKKyAgICBTX1NFVF9OQU1FIChzeW0sIHN5bS0+c3lfdGMucmVhbF9uYW1lKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBjb25zdCBjaGFyICpzOworCisgICAgICBuYW1lID0gU19HRVRfTkFNRSAoc3ltKTsKKyAgICAgIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CisgICAgICBpZiAocyAhPSAoY2hhciAqKSBOVUxMKQorCXsKKwkgIHVuc2lnbmVkIGludCBsZW47CisJICBjaGFyICpzbmV3OworCisJICBsZW4gPSBzIC0gbmFtZTsKKwkgIHNuZXcgPSB4bWFsbG9jIChsZW4gKyAxKTsKKwkgIG1lbWNweSAoc25ldywgbmFtZSwgbGVuKTsKKwkgIHNuZXdbbGVuXSA9ICdcMCc7CisKKwkgIFNfU0VUX05BTUUgKHN5bSwgc25ldyk7CisJfQorICAgIH0KKworICBpZiAoc2V0X2VuZCAhPSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIHsKKyAgICAgIFNBX1NFVF9TWU1fRU5ETkRYIChzZXRfZW5kLCBzeW0pOworICAgICAgc2V0X2VuZCA9IE5VTEw7CisgICAgfQorCisgIGlmIChTRl9HRVRfRlVOQ1RJT04gKHN5bSkpCisgICAgeworICAgICAgaWYgKHBwY19sYXN0X2Z1bmN0aW9uICE9IChzeW1ib2xTICopIE5VTEwpCisJYXNfYmFkIChfKCJ0d28gLmZ1bmN0aW9uIHBzZXVkby1vcHMgd2l0aCBubyBpbnRlcnZlbmluZyAuZWYiKSk7CisgICAgICBwcGNfbGFzdF9mdW5jdGlvbiA9IHN5bTsKKyAgICAgIGlmIChzeW0tPnN5X3RjLnNpemUgIT0gKHN5bWJvbFMgKikgTlVMTCkKKwl7CisJICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltLT5zeV90Yy5zaXplLCAxKTsKKwkgIFNBX1NFVF9TWU1fRlNJWkUgKHN5bSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW0tPnN5X3RjLnNpemUpKTsKKwl9CisgICAgfQorICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRkNOCisJICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChzeW0pLCAiLmVmIikgPT0gMCkKKyAgICB7CisgICAgICBpZiAocHBjX2xhc3RfZnVuY3Rpb24gPT0gKHN5bWJvbFMgKikgTlVMTCkKKwlhc19iYWQgKF8oIi5lZiB3aXRoIG5vIHByZWNlZGluZyAuZnVuY3Rpb24iKSk7CisgICAgICBlbHNlCisJeworCSAgc2V0X2VuZCA9IHBwY19sYXN0X2Z1bmN0aW9uOworCSAgcHBjX2xhc3RfZnVuY3Rpb24gPSBOVUxMOworCisJICAvKiBXZSBkb24ndCBoYXZlIGEgQ19FRkNOIHN5bWJvbCwgYnV0IHdlIG5lZWQgdG8gZm9yY2UgdGhlCisJICAgICBDT0ZGIGJhY2tlbmQgdG8gYmVsaWV2ZSB0aGF0IGl0IGhhcyBzZWVuIG9uZS4gICovCisJICBjb2ZmX2xhc3RfZnVuY3Rpb24gPSBOVUxMOworCX0KKyAgICB9CisKKyAgaWYgKCEgU19JU19FWFRFUk5BTCAoc3ltKQorICAgICAgJiYgKHN5bS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKKyAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19GSUxFCisgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRkNOCisgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQkxPQ0sKKyAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CU1RBVAorICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0VTVEFUCisgICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQklOQ0wKKyAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19FSU5DTAorICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKQorICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19ISURFWFQpOworCisgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCisgICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfSElERVhUKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphOworCisgICAgICAvKiBDcmVhdGUgYSBjc2VjdCBhdXguICAqLworICAgICAgaSA9IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSk7CisgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIGkgKyAxKTsKKyAgICAgIGEgPSAmY29mZnN5bWJvbCAoc3ltLT5ic3ltKS0+bmF0aXZlW2kgKyAxXS51LmF1eGVudDsKKyAgICAgIGlmIChzeW0tPnN5X3RjLmNsYXNzID09IFhNQ19UQzApCisJeworCSAgLyogVGhpcyBpcyB0aGUgVE9DIHRhYmxlLiAgKi8KKwkgIGtub3cgKHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIlRPQyIpID09IDApOworCSAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKKwkgIGEtPnhfY3NlY3QueF9zbXR5cCA9ICgyIDw8IDMpIHwgWFRZX1NEOworCX0KKyAgICAgIGVsc2UgaWYgKHN5bS0+c3lfdGMuc3Vic2VnICE9IDApCisJeworCSAgLyogVGhpcyBpcyBhIGNzZWN0IHN5bWJvbC4gIHhfc2NubGVuIGlzIHRoZSBzaXplIG9mIHRoZQorCSAgICAgY3NlY3QuICAqLworCSAgaWYgKHN5bS0+c3lfdGMubmV4dCA9PSAoc3ltYm9sUyAqKSBOVUxMKQorCSAgICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LAorCQkJCQkJICAgICAgIFNfR0VUX1NFR01FTlQgKHN5bSkpCisJCQkJICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW0tPnN5X3RjLm5leHQsIDEpOworCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChTX0dFVF9WQUxVRSAoc3ltLT5zeV90Yy5uZXh0KQorCQkJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKKwkgICAgfQorCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKHN5bS0+c3lfdGMuYWxpZ24gPDwgMykgfCBYVFlfU0Q7CisJfQorICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSBic3Nfc2VjdGlvbikKKwl7CisJICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gICovCisJICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSBzeW0tPnN5X2ZyYWctPmZyX29mZnNldDsKKwkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IChzeW0tPnN5X3RjLmFsaWduIDw8IDMpIHwgWFRZX0NNOworCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bSkpCisJICAgIHN5bS0+c3lfdGMuY2xhc3MgPSBYTUNfUlc7CisJICBlbHNlCisJICAgIHN5bS0+c3lfdGMuY2xhc3MgPSBYTUNfQlM7CisJfQorICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorCXsKKwkgIC8qIFRoaXMgaXMgYW4gYWJzb2x1dGUgc3ltYm9sLiAgVGhlIGNzZWN0IHdpbGwgYmUgY3JlYXRlZCBieQorICAgICAgICAgICAgIHBwY19hZGp1c3Rfc3ltdGFiLiAgKi8KKwkgIHBwY19zYXdfYWJzID0gdHJ1ZTsKKwkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKKwkgIGlmIChzeW0tPnN5X3RjLmNsYXNzID09IC0xKQorCSAgICBzeW0tPnN5X3RjLmNsYXNzID0gWE1DX1hPOworCX0KKyAgICAgIGVsc2UgaWYgKCEgU19JU19ERUZJTkVEIChzeW0pKQorCXsKKwkgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KKwkgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7CisJICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfRVI7CisJfQorICAgICAgZWxzZSBpZiAoc3ltLT5zeV90Yy5jbGFzcyA9PSBYTUNfVEMpCisJeworCSAgc3ltYm9sUyAqbmV4dDsKKworCSAgLyogVGhpcyBpcyBhIFRPQyBkZWZpbml0aW9uLiAgeF9zY25sZW4gaXMgdGhlIHNpemUgb2YgdGhlCisJICAgICBUT0MgZW50cnkuICAqLworCSAgbmV4dCA9IHN5bWJvbF9uZXh0IChzeW0pOworCSAgd2hpbGUgKG5leHQtPnN5X3RjLmNsYXNzID09IFhNQ19UQzApCisJICAgIG5leHQgPSBzeW1ib2xfbmV4dCAobmV4dCk7CisJICBpZiAobmV4dCA9PSAoc3ltYm9sUyAqKSBOVUxMCisJICAgICAgfHwgbmV4dC0+c3lfdGMuY2xhc3MgIT0gWE1DX1RDKQorCSAgICB7CisJICAgICAgaWYgKHBwY19hZnRlcl90b2NfZnJhZyA9PSAoZnJhZ1MgKikgTlVMTCkKKwkJYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwKKwkJCQkJCQkgICBkYXRhX3NlY3Rpb24pCisJCQkJCSAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKKwkgICAgICBlbHNlCisJCWEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChwcGNfYWZ0ZXJfdG9jX2ZyYWctPmZyX2FkZHJlc3MKKwkJCQkJIC0gU19HRVRfVkFMVUUgKHN5bSkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAobmV4dCwgMSk7CisJICAgICAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gKFNfR0VUX1ZBTFVFIChuZXh0KQorCQkJCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKKwkgICAgfQorCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKDIgPDwgMykgfCBYVFlfU0Q7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN5bWJvbFMgKmNzZWN0OworCisJICAvKiBUaGlzIGlzIGEgbm9ybWFsIHN5bWJvbCBkZWZpbml0aW9uLiAgeF9zY25sZW4gaXMgdGhlCisJICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIGNvbnRhaW5pbmcgY3NlY3QuICAqLworCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gdGV4dF9zZWN0aW9uKQorCSAgICBjc2VjdCA9IHBwY190ZXh0X2NzZWN0czsKKwkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gZGF0YV9zZWN0aW9uKQorCSAgICBjc2VjdCA9IHBwY19kYXRhX2NzZWN0czsKKwkgIGVsc2UKKwkgICAgYWJvcnQgKCk7CisKKwkgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KKwkgIGNzZWN0ID0gY3NlY3QtPnN5X3RjLm5leHQ7CisKKwkgIGlmIChjc2VjdCA9PSAoc3ltYm9sUyAqKSBOVUxMKQorCSAgICB7CisJICAgICAgYXNfd2FybiAoXygid2FybmluZzogc3ltYm9sICVzIGhhcyBubyBjc2VjdCIpLCBTX0dFVF9OQU1FIChzeW0pKTsKKwkgICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB3aGlsZSAoY3NlY3QtPnN5X3RjLm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTCkKKwkJeworCQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChjc2VjdC0+c3lfdGMubmV4dCwgMSk7CisJCSAgaWYgKFNfR0VUX1ZBTFVFIChjc2VjdC0+c3lfdGMubmV4dCkgPiBTX0dFVF9WQUxVRSAoc3ltKSkKKwkJICAgIGJyZWFrOworCQkgIGNzZWN0ID0gY3NlY3QtPnN5X3RjLm5leHQ7CisJCX0KKworCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ucCA9IGNvZmZzeW1ib2wgKGNzZWN0LT5ic3ltKS0+bmF0aXZlOworCSAgICAgIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZVtpICsgMV0uZml4X3NjbmxlbiA9IDE7CisJICAgIH0KKwkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IFhUWV9MRDsKKwl9CisJCisgICAgICBhLT54X2NzZWN0LnhfcGFybWhhc2ggPSAwOworICAgICAgYS0+eF9jc2VjdC54X3NuaGFzaCA9IDA7CisgICAgICBpZiAoc3ltLT5zeV90Yy5jbGFzcyA9PSAtMSkKKwlhLT54X2NzZWN0Lnhfc21jbGFzID0gWE1DX1BSOworICAgICAgZWxzZQorCWEtPnhfY3NlY3QueF9zbWNsYXMgPSBzeW0tPnN5X3RjLmNsYXNzOworICAgICAgYS0+eF9jc2VjdC54X3N0YWIgPSAwOworICAgICAgYS0+eF9jc2VjdC54X3Nuc3RhYiA9IDA7CisKKyAgICAgIC8qIERvbid0IGxldCB0aGUgQ09GRiBiYWNrZW5kIHJlc29ydCB0aGVzZSBzeW1ib2xzLiAgKi8KKyAgICAgIHN5bS0+YnN5bS0+ZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQ7CisgICAgfQorICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfQlNUQVQpCisgICAgeworICAgICAgLyogV2Ugd2FudCB0aGUgdmFsdWUgdG8gYmUgdGhlIHN5bWJvbCBpbmRleCBvZiB0aGUgcmVmZXJlbmNlZAorCSBjc2VjdCBzeW1ib2wuICBCRkQgd2lsbCBkbyB0aGF0IGZvciB1cyBpZiB3ZSBzZXQgdGhlIHJpZ2h0CisJIGZsYWdzLiAgKi8KKyAgICAgIFNfU0VUX1ZBTFVFIChzeW0sCisJCSAgICh2YWx1ZVQpIGNvZmZzeW1ib2wgKHN5bS0+c3lfdGMud2l0aGluLT5ic3ltKS0+bmF0aXZlKTsKKyAgICAgIGNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZS0+Zml4X3ZhbHVlID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVFNZTSkKKyAgICB7CisgICAgICBzeW1ib2xTICpibG9jazsKKyAgICAgIHN5bWJvbFMgKmNzZWN0OworCisgICAgICAvKiBUaGUgdmFsdWUgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmNsb3NpbmcgY3NlY3QuICAqLworICAgICAgYmxvY2sgPSBzeW0tPnN5X3RjLndpdGhpbjsKKyAgICAgIGNzZWN0ID0gYmxvY2stPnN5X3RjLndpdGhpbjsKKyAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChjc2VjdCwgMSk7CisgICAgICBTX1NFVF9WQUxVRSAoc3ltLCBTX0dFVF9WQUxVRSAoc3ltKSAtIFNfR0VUX1ZBTFVFIChjc2VjdCkpOworICAgIH0KKyAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0JJTkNMCisJICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VJTkNMKQorICAgIHsKKyAgICAgIC8qIFdlIHdhbnQgdGhlIHZhbHVlIHRvIGJlIGEgZmlsZSBvZmZzZXQgaW50byB0aGUgbGluZSBudW1iZXJzLgorICAgICAgICAgQkZEIHdpbGwgZG8gdGhhdCBmb3IgdXMgaWYgd2Ugc2V0IHRoZSByaWdodCBmbGFncy4gIFdlIGhhdmUKKyAgICAgICAgIGFscmVhZHkgc2V0IHRoZSB2YWx1ZSBjb3JyZWN0bHkuICAqLworICAgICAgY29mZnN5bWJvbCAoc3ltLT5ic3ltKS0+bmF0aXZlLT5maXhfbGluZSA9IDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBBZGp1c3QgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY3JlYXRlcyBjc2VjdCBzeW1ib2xzIGZvciBhbGwKKyAgIGFic29sdXRlIHN5bWJvbHMuICAqLworCit2b2lkCitwcGNfYWRqdXN0X3N5bXRhYiAoKQoreworICBzeW1ib2xTICpzeW07CisKKyAgaWYgKCEgcHBjX3Nhd19hYnMpCisgICAgcmV0dXJuOworCisgIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCisgICAgeworICAgICAgc3ltYm9sUyAqY3NlY3Q7CisgICAgICBpbnQgaTsKKyAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYTsKKworICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgIT0gYWJzb2x1dGVfc2VjdGlvbikKKwljb250aW51ZTsKKworICAgICAgY3NlY3QgPSBzeW1ib2xfY3JlYXRlICgiLmFic1tYT10iLCBhYnNvbHV0ZV9zZWN0aW9uLAorCQkJICAgICBTX0dFVF9WQUxVRSAoc3ltKSwgJnplcm9fYWRkcmVzc19mcmFnKTsKKyAgICAgIGNzZWN0LT5ic3ltLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW0pOworICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoY3NlY3QsIENfSElERVhUKTsKKyAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChjc2VjdCk7CisgICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChjc2VjdCwgaSArIDEpOworICAgICAgYSA9ICZjb2Zmc3ltYm9sIChjc2VjdC0+YnN5bSktPm5hdGl2ZVtpICsgMV0udS5hdXhlbnQ7CisgICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOworICAgICAgYS0+eF9jc2VjdC54X3NtdHlwID0gWFRZX1NEOworICAgICAgYS0+eF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKKyAgICAgIGEtPnhfY3NlY3QueF9zbmhhc2ggPSAwOworICAgICAgYS0+eF9jc2VjdC54X3NtY2xhcyA9IFhNQ19YTzsKKyAgICAgIGEtPnhfY3NlY3QueF9zdGFiID0gMDsKKyAgICAgIGEtPnhfY3NlY3QueF9zbnN0YWIgPSAwOworCisgICAgICBzeW1ib2xfaW5zZXJ0IChjc2VjdCwgc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKworICAgICAgaSA9IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSk7CisgICAgICBhID0gJmNvZmZzeW1ib2wgKHN5bS0+YnN5bSktPm5hdGl2ZVtpXS51LmF1eGVudDsKKyAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ucCA9IGNvZmZzeW1ib2wgKGNzZWN0LT5ic3ltKS0+bmF0aXZlOworICAgICAgY29mZnN5bWJvbCAoc3ltLT5ic3ltKS0+bmF0aXZlW2ldLmZpeF9zY25sZW4gPSAxOworICAgIH0KKworICBwcGNfc2F3X2FicyA9IGZhbHNlOworfQorCisvKiBTZXQgdGhlIFZNQSBmb3IgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgb24gYWxsIHRoZSBzZWN0aW9ucyBpbgorICAgdHVybi4gICovCisKK3ZvaWQKK3BwY19mcm9iX3NlY3Rpb24gKHNlYykKKyAgICAgYXNlY3Rpb24gKnNlYzsKK3sKKyAgc3RhdGljIGJmZF9zaXplX3R5cGUgdm1hID0gMDsKKworICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgdm1hKTsKKyAgdm1hICs9IGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjKTsKK30KKworI2VuZGlmIC8qIE9CSl9YQ09GRiAqLworDAorLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisgICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdHAuICBUaGUgbnVtYmVyCisgICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplcCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCisgICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0cCwgc2l6ZXApCisgICAgIGludCB0eXBlOworICAgICBjaGFyICpsaXRwOworICAgICBpbnQgKnNpemVwOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07CisgIGNoYXIgKnQ7CisgIGludCBpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplcCA9IDA7CisgICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOworICAgIH0KKworICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKworICAqc2l6ZXAgPSBwcmVjICogMjsKKworICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKKwl7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdHAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKKwkgIGxpdHAgKz0gMjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworCSAgbGl0cCArPSAyOworCX0KKyAgICB9CisgICAgIAorICByZXR1cm4gTlVMTDsKK30KKworLyogV3JpdGUgYSB2YWx1ZSBvdXQgdG8gdGhlIG9iamVjdCBmaWxlLCB1c2luZyB0aGUgYXBwcm9wcmlhdGUKKyAgIGVuZGlhbm5lc3MuICAqLworCit2b2lkCittZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQorICAgICBjaGFyICpidWY7CisgICAgIHZhbHVlVCB2YWw7CisgICAgIGludCBuOworeworICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOworICBlbHNlCisgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOworfQorCisvKiBBbGlnbiBhIHNlY3Rpb24gKEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBpcyBtYWNoaW5lIGRlcGVuZGVudCkuICAqLworCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKKyAgICAgYXNlY3Rpb24gKnNlZzsKKyAgICAgdmFsdWVUIGFkZHI7Cit7CisgIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKKworICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKK30KKworLyogV2UgZG9uJ3QgaGF2ZSBhbnkgZm9ybSBvZiByZWxheGluZy4gICovCisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCisgICAgIGZyYWdTICpmcmFncDsKKyAgICAgYXNlY3Rpb24gKnNlZzsKK3sKKyAgYWJvcnQgKCk7CisgIHJldHVybiAwOworfQorCisvKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFdlIG5ldmVyIGdlbmVyYXRlIHRoZXNlLiAgKi8KKwordm9pZAorbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdwKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIGZyYWdTICpmcmFncDsKK3sKKyAgYWJvcnQgKCk7Cit9CisKKy8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KKworLypBUkdTVVNFRCovCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiAwOworfQorDAorLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KKworLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAorICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCisKK2xvbmcKK21kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4cCwgc2VjKQorICAgICBmaXhTICpmaXhwOworICAgICBzZWdUIHNlYzsKK3sKKyAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKK30KKworI2lmZGVmIE9CSl9YQ09GRgorCisvKiBUaGlzIGlzIGNhbGxlZCB0byBzZWUgd2hldGhlciBhIGZpeHVwIHNob3VsZCBiZSBhZGp1c3RlZCB0byB1c2UgYQorICAgc2VjdGlvbiBzeW1ib2wuICBXZSB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBjaGFuZ2UgYSBmaXh1cCBhZ2FpbnN0CisgICBhIHN5bWJvbCBpbiB0aGUgVE9DIHN1YnNlZ21lbnQgaW50byBhIHJlbG9jIGFnYWluc3QgdGhlCisgICBjb3JyZXNwb25kaW5nIC50YyBzeW1ib2wuICAqLworCitpbnQKK3BwY19maXhfYWRqdXN0YWJsZSAoZml4KQorICAgICBmaXhTICpmaXg7Cit7CisgIHZhbHVlVCB2YWw7CisKKyAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZpeC0+ZnhfYWRkc3ksIDEpOworICB2YWwgPSBTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSk7CisgIGlmIChwcGNfdG9jX2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwKKyAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAorICAgICAgJiYgZml4LT5meF9hZGRzeSAhPSBwcGNfdG9jX2NzZWN0CisgICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBkYXRhX3NlY3Rpb24KKyAgICAgICYmIHZhbCA+PSBwcGNfdG9jX2ZyYWctPmZyX2FkZHJlc3MKKyAgICAgICYmIChwcGNfYWZ0ZXJfdG9jX2ZyYWcgPT0gKGZyYWdTICopIE5VTEwKKwkgIHx8IHZhbCA8IHBwY19hZnRlcl90b2NfZnJhZy0+ZnJfYWRkcmVzcykpCisgICAgeworICAgICAgc3ltYm9sUyAqc3k7CisKKyAgICAgIGZvciAoc3kgPSBzeW1ib2xfbmV4dCAocHBjX3RvY19jc2VjdCk7CisJICAgc3kgIT0gKHN5bWJvbFMgKikgTlVMTDsKKwkgICBzeSA9IHN5bWJvbF9uZXh0IChzeSkpCisJeworCSAgaWYgKHN5LT5zeV90Yy5jbGFzcyA9PSBYTUNfVEMwKQorCSAgICBjb250aW51ZTsKKwkgIGlmIChzeS0+c3lfdGMuY2xhc3MgIT0gWE1DX1RDKQorCSAgICBicmVhazsKKwkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeSwgMSk7CisJICBpZiAodmFsID09IFNfR0VUX1ZBTFVFIChzeSkpCisJICAgIHsKKwkgICAgICBmaXgtPmZ4X2FkZHN5ID0gc3k7CisJICAgICAgZml4LT5meF9hZGRudW1iZXIgPSB2YWwgLSBwcGNfdG9jX2ZyYWctPmZyX2FkZHJlc3M7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCisJCSAgICBfKCJzeW1ib2wgaW4gLnRvYyBkb2VzIG5vdCBtYXRjaCBhbnkgLnRjIikpOworICAgIH0KKworICAvKiBQb3NzaWJseSBhZGp1c3QgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LiAgKi8KKyAgaWYgKGZpeC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAorICAgICAgJiYgZml4LT5meF9hZGRzeS0+c3lfdGMuc3Vic2VnID09IDAKKyAgICAgICYmIGZpeC0+ZnhfYWRkc3ktPnN5X3RjLmNsYXNzICE9IFhNQ19UQzAKKyAgICAgICYmIGZpeC0+ZnhfYWRkc3ktPnN5X3RjLmNsYXNzICE9IFhNQ19UQworICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24KKyAgICAgIC8qIERvbid0IGFkanVzdCBpZiB0aGlzIGlzIGEgcmVsb2MgaW4gdGhlIHRvYyBzZWN0aW9uLiAgKi8KKyAgICAgICYmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSAhPSBkYXRhX3NlY3Rpb24KKwkgIHx8IHBwY190b2NfY3NlY3QgPT0gTlVMTAorCSAgfHwgdmFsIDwgcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzCisJICB8fCAocHBjX2FmdGVyX3RvY19mcmFnICE9IE5VTEwKKwkgICAgICAmJiB2YWwgPj0gcHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzKSkpCisgICAgeworICAgICAgc3ltYm9sUyAqY3NlY3Q7CisKKyAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSB0ZXh0X3NlY3Rpb24pCisJY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7CisgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBkYXRhX3NlY3Rpb24pCisJY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisKKyAgICAgIC8qIFNraXAgdGhlIGluaXRpYWwgZHVtbXkgc3ltYm9sLiAgKi8KKyAgICAgIGNzZWN0ID0gY3NlY3QtPnN5X3RjLm5leHQ7CisKKyAgICAgIGlmIChjc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMKQorCXsKKwkgIHdoaWxlIChjc2VjdC0+c3lfdGMubmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMCisJCSAmJiAoY3NlY3QtPnN5X3RjLm5leHQtPnN5X2ZyYWctPmZyX2FkZHJlc3MKKwkJICAgICA8PSBmaXgtPmZ4X2FkZHN5LT5zeV9mcmFnLT5mcl9hZGRyZXNzKSkKKwkgICAgeworCSAgICAgIC8qIElmIHRoZSBjc2VjdCBhZGRyZXNzIGVxdWFscyB0aGUgc3ltYm9sIHZhbHVlLCB0aGVuIHdlCisgICAgICAgICAgICAgICAgIGhhdmUgdG8gbG9vayB0aHJvdWdoIHRoZSBmdWxsIHN5bWJvbCB0YWJsZSB0byBzZWUKKyAgICAgICAgICAgICAgICAgd2hldGhlciB0aGlzIGlzIHRoZSBjc2VjdCB3ZSB3YW50LiAgTm90ZSB0aGF0IHdlIHdpbGwKKyAgICAgICAgICAgICAgICAgb25seSBnZXQgaGVyZSBpZiB0aGUgY3NlY3QgaGFzIHplcm8gbGVuZ3RoLiAgKi8KKwkgICAgICBpZiAoKGNzZWN0LT5zeV9mcmFnLT5mcl9hZGRyZXNzCisJCSAgID09IGZpeC0+ZnhfYWRkc3ktPnN5X2ZyYWctPmZyX2FkZHJlc3MpCisJCSAgJiYgU19HRVRfVkFMVUUgKGNzZWN0KSA9PSBTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkpCisJCXsKKwkJICBzeW1ib2xTICpzY2FuOworCisJCSAgZm9yIChzY2FuID0gY3NlY3QtPnN5X25leHQ7CisJCSAgICAgICBzY2FuICE9IE5VTEw7CisJCSAgICAgICBzY2FuID0gc2Nhbi0+c3lfbmV4dCkKKwkJICAgIHsKKwkJICAgICAgaWYgKHNjYW4tPnN5X3RjLnN1YnNlZyAhPSAwKQorCQkJYnJlYWs7CisJCSAgICAgIGlmIChzY2FuID09IGZpeC0+ZnhfYWRkc3kpCisJCQlicmVhazsKKwkJICAgIH0KKworCQkgIC8qIElmIHdlIGZvdW5kIHRoZSBzeW1ib2wgYmVmb3JlIHRoZSBuZXh0IGNzZWN0CisgICAgICAgICAgICAgICAgICAgICBzeW1ib2wsIHRoZW4gdGhpcyBpcyB0aGUgY3NlY3Qgd2Ugd2FudC4gICovCisJCSAgaWYgKHNjYW4gPT0gZml4LT5meF9hZGRzeSkKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgICBjc2VjdCA9IGNzZWN0LT5zeV90Yy5uZXh0OworCSAgICB9CisKKwkgIGZpeC0+Znhfb2Zmc2V0ICs9IChTX0dFVF9WQUxVRSAoZml4LT5meF9hZGRzeSkKKwkJCSAgICAgLSBjc2VjdC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7CisJICBmaXgtPmZ4X2FkZHN5ID0gY3NlY3Q7CisJfQorICAgIH0KKworICAvKiBBZGp1c3QgYSByZWxvYyBhZ2FpbnN0IGEgLmxjb21tIHN5bWJvbCB0byBiZSBhZ2FpbnN0IHRoZSBiYXNlCisgICAgIC5sY29tbS4gICovCisgIGlmIChmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKKyAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeC0+ZnhfYWRkc3kpID09IGJzc19zZWN0aW9uCisgICAgICAmJiAhIFNfSVNfRVhURVJOQUwgKGZpeC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChmaXgtPmZ4X2FkZHN5LT5zeV9mcmFnLT5mcl9zeW1ib2wsIDEpOworICAgICAgZml4LT5meF9vZmZzZXQgKz0gKFNfR0VUX1ZBTFVFIChmaXgtPmZ4X2FkZHN5KQorCQkJIC0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3ktPnN5X2ZyYWctPmZyX3N5bWJvbCkpOworICAgICAgZml4LT5meF9hZGRzeSA9IGZpeC0+ZnhfYWRkc3ktPnN5X2ZyYWctPmZyX3N5bWJvbDsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEEgcmVsb2MgZnJvbSBvbmUgY3NlY3QgdG8gYW5vdGhlciBtdXN0IGJlIGtlcHQuICBUaGUgYXNzZW1ibGVyCisgICB3aWxsLCBvZiBjb3Vyc2UsIGtlZXAgcmVsb2NzIGJldHdlZW4gc2VjdGlvbnMsIGFuZCBpdCB3aWxsIGtlZXAKKyAgIGFic29sdXRlIHJlbG9jcywgYnV0IHdlIG5lZWQgdG8gZm9yY2UgaXQgdG8ga2VlcCBQQyByZWxhdGl2ZSByZWxvY3MKKyAgIGJldHdlZW4gdHdvIGNzZWN0cyBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KKworaW50CitwcGNfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQorICAgICBmaXhTICpmaXg7Cit7CisgIC8qIEF0IHRoaXMgcG9pbnQgZml4LT5meF9hZGRzeSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY29udmVydGVkIHRvCisgICAgIGEgY3NlY3Qgc3ltYm9sLiAgSWYgdGhlIGNzZWN0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZyYWdtZW50LCB0aGVuCisgICAgIHdlIG5lZWQgdG8gZm9yY2UgdGhlIHJlbG9jYXRpb24uICAqLworICBpZiAoZml4LT5meF9wY3JlbAorICAgICAgJiYgZml4LT5meF9hZGRzeSAhPSBOVUxMCisgICAgICAmJiBmaXgtPmZ4X2FkZHN5LT5zeV90Yy5zdWJzZWcgIT0gMAorICAgICAgJiYgKGZpeC0+ZnhfYWRkc3ktPnN5X2ZyYWctPmZyX2FkZHJlc3MgPiBmaXgtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKKwkgIHx8IChmaXgtPmZ4X2FkZHN5LT5zeV90Yy5uZXh0ICE9IE5VTEwKKwkgICAgICAmJiAoZml4LT5meF9hZGRzeS0+c3lfdGMubmV4dC0+c3lfZnJhZy0+ZnJfYWRkcmVzcworCQkgIDw9IGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcykpKSkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIE9CSl9YQ09GRiAqLworCisvKiBTZWUgd2hldGhlciBhIHN5bWJvbCBpcyBpbiB0aGUgVE9DIHNlY3Rpb24uICAqLworCitzdGF0aWMgaW50CitwcGNfaXNfdG9jX3N5bSAoc3ltKQorICAgICBzeW1ib2xTICpzeW07Cit7CisjaWZkZWYgT0JKX1hDT0ZGCisgIHJldHVybiBzeW0tPnN5X3RjLmNsYXNzID09IFhNQ19UQzsKKyNlbHNlCisgIHJldHVybiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSksICIuZ290IikgPT0gMDsKKyNlbmRpZgorfQorCisvKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgY29kZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBhbGwgdGhlCisgICBmaXh1cHMgd2UgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsIHRvIGZpeF9uZXdfZXhwLCBhYm92ZS4gIEluIHRoZSBjYWxsCisgICBhYm92ZSB3ZSB1c2VkIGEgcmVsb2MgY29kZSB3aGljaCB3YXMgdGhlIGxhcmdlc3QgbGVnYWwgcmVsb2MgY29kZQorICAgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIEhlcmUgd2UgdW5kbyB0aGF0IHRvIHJlY292ZXIgdGhlIG9wZXJhbmQKKyAgIGluZGV4LiAgQXQgdGhpcyBwb2ludCBhbGwgc3ltYm9sIHZhbHVlcyBzaG91bGQgYmUgZnVsbHkgcmVzb2x2ZWQsCisgICBhbmQgd2UgYXR0ZW1wdCB0byBjb21wbGV0ZWx5IHJlc29sdmUgdGhlIHJlbG9jLiAgSWYgd2UgY2FuIG5vdCBkbworICAgdGhhdCwgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlbG9jIGNvZGUgYW5kIHB1dCBpdCBiYWNrIGluIHRoZQorICAgZml4dXAuICAqLworCitpbnQKK21kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQorICAgICBmaXhTICpmaXhwOworICAgICB2YWx1ZVQgKnZhbHVlcDsKKyAgICAgc2VnVCBzZWc7Cit7CisgIHZhbHVlVCB2YWx1ZTsKKworI2lmZGVmIE9CSl9FTEYKKyAgdmFsdWUgPSAqdmFsdWVwOworICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBgKnZhbHVlcCcgbWF5IGNvbnRhaW4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgb24gd2hpY2ggdGhlIHJlbG9jCisJIHdpbGwgYmUgYmFzZWQ7IHdlIGhhdmUgdG8gcmVtb3ZlIGl0LiAgKi8KKyAgICAgIGlmIChmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYworCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24KKwkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbgorCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSkpCisJdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X2FkZHN5KTsKKworICAgICAgLyogRklYTUU6IFdoeSAnKyc/ICBCZXR0ZXIgeWV0LCB3aGF0IGV4YWN0bHkgaXMgJyp2YWx1ZXAnCisJIHN1cHBvc2VkIHRvIGJlPyAgSSB0aGluayB0aGlzIGlzIHJlbGF0ZWQgdG8gdmFyaW91cyBzaW1pbGFyCisJIEZJWE1FcyBpbiB0Yy1pMzg2LmMgYW5kIHRjLXNwYXJjLmMuICAqLworICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQorCXZhbHVlICs9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXhwLT5meF9kb25lID0gMTsKKyAgICB9CisjZWxzZQorICAvKiBGSVhNRSBGSVhNRSBGSVhNRTogVGhlIHZhbHVlIHdlIGFyZSBwYXNzZWQgaW4gKnZhbHVlcCBpbmNsdWRlcworICAgICB0aGUgc3ltYm9sIHZhbHVlcy4gIFNpbmNlIHdlIGFyZSB1c2luZyBCRkRfQVNTRU1CTEVSLCBpZiB3ZSBhcmUKKyAgICAgZG9pbmcgdGhpcyByZWxvY2F0aW9uIHRoZSBjb2RlIGluIHdyaXRlLmMgaXMgZ29pbmcgdG8gY2FsbAorICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLCB3aGljaCBpcyBhbHNvIGdvaW5nIHRvIHVzZSB0aGUgc3ltYm9sCisgICAgIHZhbHVlLiAgVGhhdCBtZWFucyB0aGF0IGlmIHRoZSByZWxvYyBpcyBmdWxseSByZXNvbHZlZCB3ZSB3YW50IHRvCisgICAgIHVzZSAqdmFsdWVwIHNpbmNlIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gaXMgbm90IGJlaW5nIHVzZWQuCisgICAgIEhvd2V2ZXIsIGlmIHRoZSByZWxvYyBpcyBub3QgZnVsbHkgcmVzb2x2ZWQgd2UgZG8gbm90IHdhbnQgdG8gdXNlCisgICAgICp2YWx1ZXAsIGFuZCBtdXN0IHVzZSBmeF9vZmZzZXQgaW5zdGVhZC4gIEhvd2V2ZXIsIGlmIHRoZSByZWxvYworICAgICBpcyBQQyByZWxhdGl2ZSwgd2UgZG8gd2FudCB0byB1c2UgKnZhbHVlcCBzaW5jZSBpdCBpbmNsdWRlcyB0aGUKKyAgICAgcmVzdWx0IG9mIG1kX3BjcmVsX2Zyb20uICBUaGlzIGlzIGNvbmZ1c2luZy4gICovCisgIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIHsKKyAgICAgIHZhbHVlID0gKnZhbHVlcDsKKyAgICAgIGZpeHAtPmZ4X2RvbmUgPSAxOworICAgIH0KKyAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwpCisgICAgdmFsdWUgPSAqdmFsdWVwOworICBlbHNlCisgICAgeworICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7CisgICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKKwl7CisJICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCisJICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSBjYW4ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KKwkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKKworICBpZiAoKGludCkgZml4cC0+Znhfcl90eXBlID49IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQpCisgICAgeworICAgICAgaW50IG9waW5kZXg7CisgICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOworICAgICAgY2hhciAqd2hlcmU7CisgICAgICB1bnNpZ25lZCBsb25nIGluc247CisKKyAgICAgIG9waW5kZXggPSAoaW50KSBmaXhwLT5meF9yX3R5cGUgLSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOworCisgICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbb3BpbmRleF07CisKKyNpZmRlZiBPQkpfWENPRkYKKyAgICAgIC8qIEl0IGFwcGVhcnMgdGhhdCBhbiBpbnN0cnVjdGlvbiBsaWtlCisJICAgICBsIDksTEMuLjEoMzApCisJIHdoZW4gTEMuLjEgaXMgbm90IGEgVE9DIHN5bWJvbCBkb2VzIG5vdCBnZW5lcmF0ZSBhIHJlbG9jLiAgSXQKKwkgdXNlcyB0aGUgb2Zmc2V0IG9mIExDLi4xIHdpdGhpbiBpdHMgY3NlY3QuICBIb3dldmVyLCAubG9uZworCSBMQy4uMSB3aWxsIGdlbmVyYXRlIGEgcmVsb2MuICBJIGNhbid0IGZpbmQgYW55IGRvY3VtZW50YXRpb24KKwkgb24gaG93IHRoZXNlIGNhc2VzIGFyZSB0byBiZSBkaXN0aW5ndWlzaGVkLCBzbyB0aGlzIGlzIGEgd2lsZAorCSBndWVzcy4gIFRoZXNlIGNhc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjIC1tbWluaW1hbC10b2MuICAqLworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMAorCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgorCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMAorCSAgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwKKwkgICYmIGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKKwkgICYmIGZpeHAtPmZ4X2FkZHN5LT5zeV90Yy5zdWJzZWcgIT0gMAorCSAgJiYgZml4cC0+ZnhfYWRkc3ktPnN5X3RjLmNsYXNzICE9IFhNQ19UQworCSAgJiYgZml4cC0+ZnhfYWRkc3ktPnN5X3RjLmNsYXNzICE9IFhNQ19UQzAKKwkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBic3Nfc2VjdGlvbikKKwl7CisJICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKKwkgIGZpeHAtPmZ4X2RvbmUgPSAxOworCX0KKyNlbmRpZgorCisgICAgICAvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24sIGluc2VydCB0aGUgZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZAorCSB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLiAgKi8KKyAgICAgIHdoZXJlID0gZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlOworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCWluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgICBlbHNlCisJaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGluc24gPSBwcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIChvZmZzZXRUKSB2YWx1ZSwKKwkJCQkgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7CisgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGVsc2UKKwliZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworCisgICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKKwl7CisJICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4KKwkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50bworCSByZWxvY3MuCisJIEZJWE1FOiBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgRFMgZmllbGQgYXQgdGhlIHZlcnkgbGVhc3QuCisJIEZJWE1FOiBTZWxlY3RpbmcgdGhlIHJlbG9jIHR5cGUgaXMgYSBiaXQgaGFwaGF6YXJkOyBwZXJoYXBzCisJIHRoZXJlIHNob3VsZCBiZSBhIG5ldyBmaWVsZCBpbiB0aGUgb3BlcmFuZCB0YWJsZS4gICovCisgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAKKwkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjYKKwkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCisJZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CMjY7CisgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9SRUxBVElWRSkgIT0gMAorCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgorCSAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMCkKKwlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX0IxNjsKKyAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwCisJICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjYKKwkgICAgICAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMCkKKwlmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX0JBMjY7CisgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMAorCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDE2CisJICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCisJZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CQTE2OworICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUEFSRU5TKSAhPSAwCisJICAgICAgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKKwkgICAgICAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMAorCSAgICAgICAmJiBvcGVyYW5kLT5pbnNlcnQgPT0gTlVMTAorCSAgICAgICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCisJICAgICAgICYmIHBwY19pc190b2Nfc3ltIChmaXhwLT5meF9hZGRzeSkpCisJeworCSAgZml4cC0+Znhfc2l6ZSA9IDI7CisJICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJICAgIGZpeHAtPmZ4X3doZXJlICs9IDI7CisJICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICpzZmlsZTsKKwkgIHVuc2lnbmVkIGludCBzbGluZTsKKworCSAgLyogVXNlIGV4cHJfc3ltYm9sX3doZXJlIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGV4cHJlc3Npb24KKyAgICAgICAgICAgICBzeW1ib2wuICAqLworCSAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChmaXhwLT5meF9hZGRzeSwgJnNmaWxlLCAmc2xpbmUpKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgIF8oInVucmVzb2x2ZWQgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcmVzb2x2ZWQiKSk7CisJICBlbHNlCisJICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCSAgXygidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIikpOworCSAgZml4cC0+ZnhfZG9uZSA9IDE7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIE9CSl9FTEYKKyAgICAgIHBwY19lbGZfdmFsaWRhdGVfZml4IChmaXhwLCBzZWcpOworI2VuZGlmCisgICAgICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKwl7CisJY2FzZSBCRkRfUkVMT0NfMzI6CisJY2FzZSBCRkRfUkVMT0NfQ1RPUjoKKwkgIGlmIChmaXhwLT5meF9wY3JlbCkKKwkgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOworCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgQkZEX1JFTE9DX1JWQToKKwljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKKwljYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgorCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMjoKKwkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAorCQkJICAgICAgdmFsdWUsIDQpOworCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19MTzE2OgorCWNhc2UgQkZEX1JFTE9DXzE2OgorCWNhc2UgQkZEX1JFTE9DX0dQUkVMMTY6CisJY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgorCWNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoKKwljYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoKKwljYXNlIEJGRF9SRUxPQ19ISTE2X0dPVE9GRjoKKwljYXNlIEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGOgorCWNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoKKwljYXNlIEJGRF9SRUxPQ19ISTE2X0JBU0VSRUw6CisJY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUw6CisJY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2OgorCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTzoKKwljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CisJY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hBOgorCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2OgorCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTDoKKwljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJJMTY6CisJY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNjoKKwljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOgorCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEk6CisJY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQToKKwljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQToKKwljYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6CisJICBpZiAoZml4cC0+ZnhfcGNyZWwpCisJICAgIHsKKwkgICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKKwkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorCQkJICAgICAgXygiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzIiksCisJCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSwKKwkJCSAgICAgIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7CisJICAgICAgZWxzZQorCQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgICAgICBfKCJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uIiksCisJCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7CisJICAgIH0KKworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCisJCQkgICAgICB2YWx1ZSwgMik7CisJICBicmVhazsKKworCSAgLyogVGhpcyBjYXNlIGhhcHBlbnMgd2hlbiB5b3Ugd3JpdGUsIGZvciBleGFtcGxlLAorCSAgICAgbGlzICVyMywoTDEtTDIpQGhhCisJICAgICB3aGVyZSBMMSBhbmQgTDIgYXJlIGRlZmluZWQgbGF0ZXIuICAqLworCWNhc2UgQkZEX1JFTE9DX0hJMTY6CisJICBpZiAoZml4cC0+ZnhfcGNyZWwpCisJICAgIGFib3J0ICgpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCisJCQkgICAgICB2YWx1ZSA+PiAxNiwgMik7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ19ISTE2X1M6CisJICBpZiAoZml4cC0+ZnhfcGNyZWwpCisJICAgIGFib3J0ICgpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmUsCisJCQkgICAgICB2YWx1ZSArIDB4ODAwMCA+PiAxNiwgMik7CisJICBicmVhazsKKworCSAgLyogQmVjYXVzZSBTREEyMSBtb2RpZmllcyB0aGUgcmVnaXN0ZXIgZmllbGQsIHRoZSBzaXplIGlzIHNldCB0byA0CisJICAgICBieXRlcywgcmF0aGVyIHRoYW4gMiwgc28gb2Zmc2V0IGl0IGhlcmUgYXBwcm9wcmlhdGVseSAqLworCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjE6CisJICBpZiAoZml4cC0+ZnhfcGNyZWwpCisJICAgIGFib3J0ICgpOworCisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZQorCQkJICAgICAgKyAoKHRhcmdldF9iaWdfZW5kaWFuKSA/IDIgOiAwKSwKKwkJCSAgICAgIHZhbHVlLCAyKTsKKwkgIGJyZWFrOworCisJY2FzZSBCRkRfUkVMT0NfODoKKwkgIGlmIChmaXhwLT5meF9wY3JlbCkKKwkgICAgYWJvcnQgKCk7CisKKwkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAorCQkJICAgICAgdmFsdWUsIDEpOworCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ18yNF9QTFRfUENSRUw6CisJY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoKKwkgIGlmICghZml4cC0+ZnhfcGNyZWwgJiYgIWZpeHAtPmZ4X2RvbmUpCisJICAgIGFib3J0ICgpOworCisJICBpZiAoZml4cC0+ZnhfZG9uZSkKKwkgIHsKKwkgICAgY2hhciAqd2hlcmU7CisJICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKwkgICAgCisJICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCisJICAgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLworCSAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKKwkgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCSAgICAgIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisJICAgIGVsc2UKKwkgICAgICBpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworCSAgICBpZiAoKHZhbHVlICYgMykgIT0gMCkKKwkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgICAgXygibXVzdCBicmFuY2ggdG8gYW4gYWRkcmVzcyBhIG11bHRpcGxlIG9mIDQiKSk7CisJICAgIGlmICgob2Zmc2V0VCkgdmFsdWUgPCAtMHg0MDAwMDAwMAorCQl8fCAob2Zmc2V0VCkgdmFsdWUgPj0gMHg0MDAwMDAwMCkKKwkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgICAgXygiQGxvY2FsIG9yIEBwbHQgYnJhbmNoIGRlc3RpbmF0aW9uIGlzIHRvbyBmYXIgYXdheSwgJWxkIGJ5dGVzIiksCisJCQkgICAgdmFsdWUpOworCSAgICBpbnNuID0gaW5zbiB8ICh2YWx1ZSAmIDB4MDNmZmZmZmMpOworCSAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKwkgICAgZWxzZQorCSAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisJICB9CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgorCSAgZml4cC0+ZnhfZG9uZSA9IDA7CisJICBpZiAoZml4cC0+ZnhfYWRkc3kKKwkgICAgICAmJiAhU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKKwkgICAgICAmJiAhU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCisJICAgIFNfU0VUX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KTsKKwkgIGJyZWFrOworCisJY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorCSAgZml4cC0+ZnhfZG9uZSA9IDA7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBmcHJpbnRmKHN0ZGVyciwKKwkJICBfKCJHYXMgZmFpbHVyZSwgcmVsb2MgdmFsdWUgJWRcbiIpLCBmaXhwLT5meF9yX3R5cGUpOworCSAgZmZsdXNoKHN0ZGVycik7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisjaWZkZWYgT0JKX0VMRgorICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKKyNlbHNlCisgIGlmIChmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1BQQ19UT0MxNikKKyAgICBmaXhwLT5meF9hZGRudW1iZXIgPSAwOworICBlbHNlCisgICAgeworI2lmZGVmIFRFX1BFCisgICAgICBmaXhwLT5meF9hZGRudW1iZXIgPSAwOworI2Vsc2UKKyAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHNlZ21lbnQgb2YgdGhlCisJIHN5bWJvbCwgbm90IHRoZSBhY3R1YWwgVk1BIG9mIHRoZSBzeW1ib2wuICAqLworICAgICAgZml4cC0+ZnhfYWRkbnVtYmVyID0KKwktIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgIHJldHVybiAxOworfQorCisvKiBHZW5lcmF0ZSBhIHJlbG9jIGZvciBhIGZpeHVwLiAgKi8KKworYXJlbGVudCAqCit0Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKKyAgICAgYXNlY3Rpb24gKnNlZzsKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgYXJlbGVudCAqcmVsb2M7CisKKyAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKworICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmZml4cC0+ZnhfYWRkc3ktPmJzeW07CisgIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOworICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKKyAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKKworICByZXR1cm4gcmVsb2M7Cit9CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXBwYy5oIGIvZ2FzL2NvbmZpZy90Yy1wcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODcxZDEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1wcGMuaApAQCAtMCwwICsxLDI3NiBAQAorLyogdGMtcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXBwYy5jLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjZGVmaW5lIFRDX1BQQworCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3QgZml4OworI2VuZGlmCisKKy8qIFNldCB0aGUgZW5kaWFubmVzcyB3ZSBhcmUgdXNpbmcuICBEZWZhdWx0IHRvIGJpZyBlbmRpYW4uICAqLworI2lmbmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgorI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCisjZW5kaWYKKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisgI2Vycm9yIFBvd2VyUEMgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCisjZW5kaWYKKworLyogSWYgT0JKX0NPRkYgaXMgZGVmaW5lZCwgYW5kIFRFX1BFIGlzIG5vdCBkZWZpbmVkLCB3ZSBhcmUgYXNzZW1ibGluZworICAgWENPRkYgZm9yIEFJWCBvciBQb3dlck1hYy4gIElmIFRFX1BFIGlzIGRlZmluZWQsIHdlIGFyZSBhc3NlbWJsaW5nCisgICBDT0ZGIGZvciBXaW5kb3dzIE5ULiAgKi8KKworI2lmZGVmIE9CSl9DT0ZGCisjaWZuZGVmIFRFX1BFCisjZGVmaW5lIE9CSl9YQ09GRgorI2VuZGlmCisjZW5kaWYKKworLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0FSQ0ggKHBwY19hcmNoICgpKQorZXh0ZXJuIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBwcGNfYXJjaCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFdoZXRoZXIgb3Igbm90IHRoZSB0YXJnZXQgaXMgYmlnIGVuZGlhbiAqLworZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKKworLyogVGhlIHRhcmdldCBCRkQgZm9ybWF0LiAgKi8KKyNpZmRlZiBPQkpfQ09GRgorI2lmZGVmIFRFX1BFCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gInBlLXBvd2VycGMiIDogInBlLXBvd2VycGNsZSIpCisjZWxzZQorI2RlZmluZSBUQVJHRVRfRk9STUFUICJhaXhjb2ZmLXJzNjAwMCIKKyNlbmRpZgorI2VuZGlmCisKKy8qIFBvd2VyTWFjIGhhcyBhIEJGRCBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBBSVgncy4gICovCisjaWZkZWYgVEVfUE9XRVJNQUMKKyNpZmRlZiBUQVJHRVRfRk9STUFUCisjdW5kZWYgVEFSR0VUX0ZPUk1BVAorI2VuZGlmCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgInhjb2ZmLXBvd2VybWFjIgorI2VuZGlmCisKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVsZjMyLXBvd2VycGMiIDogImVsZjMyLXBvd2VycGNsZSIpCisjZW5kaWYKKworLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCisKKy8qICQgaXMgdXNlZCB0byByZWZlciB0byB0aGUgY3VycmVudCBsb2NhdGlvbi4gICovCisjZGVmaW5lIERPTExBUl9ET1QKKworLyogU3RyaW5ncyBkbyBub3QgdXNlIGJhY2tzbGFzaCBlc2NhcGVzIHVuZGVyIENPRkYuICAqLworI2lmZGVmIE9CSl9DT0ZGCisjZGVmaW5lIE5PX1NUUklOR19FU0NBUEVTCisjZW5kaWYKKworI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiBmb28tLiBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLworI2VuZGlmCisKKyNpZiBUQVJHRVRfQllURVNfQklHX0VORElBTgorI2RlZmluZSBQUENfQklHX0VORElBTiAxCisjZWxzZQorI2RlZmluZSBQUENfQklHX0VORElBTiAwCisjZW5kaWYKKworLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisvKiBXZSBzZXQgdGhlIGZ4X2RvbmUgZmllbGQgYXBwcm9wcmlhdGVseSBpbiBtZF9hcHBseV9maXguICAqLworI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKKwwKKyNpZmRlZiBURV9QRQorCisvKiBRdWVzdGlvbiBtYXJrcyBhcmUgcGVybWl0dGVkIGluIHN5bWJvbCBuYW1lcy4gICovCisjZGVmaW5lIExFWF9RTSAxCisKKy8qIERvbid0IGFkanVzdCBUT0MgcmVsb2NzLiAgKi8KKyNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoZml4cCkgcHBjX3BlX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQorZXh0ZXJuIGludCBwcGNfcGVfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7CisKKyNlbmRpZgorCisjaWZkZWYgT0JKX1hDT0ZGCisKKy8qIERlY2xhcmF0aW9ucyBuZWVkZWQgd2hlbiBnZW5lcmF0aW5nIFhDT0ZGIGNvZGUuICBYQ09GRiBpcyBhbgorICAgZXh0ZW5zaW9uIG9mIENPRkYsIHVzZWQgb25seSBvbiB0aGUgUlMvNjAwMC4gIFJhdGhlciB0aGFuIGNyZWF0ZSBhbgorICAgb2JqLXhjb2ZmLCB3ZSBqdXN0IHVzZSBvYmotY29mZiwgYW5kIGhhbmRsZSB0aGUgZXh0ZW5zaW9ucyBoZXJlIGluCisgICB0Yy1wcGMuICAqLworCisvKiBXZSBuZWVkIHRvIGtlZXAgc29tZSBpbmZvcm1hdGlvbiBmb3Igc3ltYm9scy4gICovCitzdHJ1Y3QgcHBjX3RjX3N5Cit7CisgIC8qIFdlIGtlZXAgYSBmZXcgbGlua2VkIGxpc3RzIG9mIHN5bWJvbHMuICAqLworICBzdHJ1Y3Qgc3ltYm9sICpuZXh0OworICAvKiBOb24temVybyBpZiB0aGUgc3ltYm9sIHNob3VsZCBiZSBvdXRwdXQuICBUaGUgUlMvNjAwMCBhc3NlbWJsZXIKKyAgICAgb25seSBvdXRwdXRzIHN5bWJvbHMgdGhhdCBhcmUgZXh0ZXJuYWwgb3IgYXJlIG1lbnRpb25lZCBpbiBhCisgICAgIC5nbG9ibCBvciAubGdsb2JsIHN0YXRlbWVudC4gICovCisgIGludCBvdXRwdXQ7CisgIC8qIFRoZSBzeW1ib2wgY2xhc3MuICAqLworICBpbnQgY2xhc3M7CisgIC8qIFRoZSByZWFsIG5hbWUsIGlmIHRoZSBzeW1ib2wgd2FzIHJlbmFtZWQuICAqLworICBjaGFyICpyZWFsX25hbWU7CisgIC8qIEZvciBhIGNzZWN0IHN5bWJvbCwgdGhlIHN1YnNlZ21lbnQgd2UgYXJlIHVzaW5nLiAgVGhpcyBpcyB6ZXJvCisgICAgIGZvciBzeW1ib2xzIHRoYXQgYXJlIG5vdCBjc2VjdHMuICAqLworICBzdWJzZWdUIHN1YnNlZzsKKyAgLyogRm9yIGEgY3NlY3Qgb3IgY29tbW9uIHN5bWJvbCwgdGhlIGFsaWdubWVudCB0byB1c2UuICAqLworICBpbnQgYWxpZ247CisgIC8qIEZvciBhIGZ1bmN0aW9uIHN5bWJvbCwgYSBzeW1ib2wgd2hvc2UgdmFsdWUgaXMgdGhlIHNpemUuICBUaGUKKyAgICAgZmllbGQgaXMgTlVMTCBpZiB0aGVyZSBpcyBubyBzaXplLiAgKi8KKyAgc3RydWN0IHN5bWJvbCAqc2l6ZTsKKyAgLyogRm9yIGEgY3NlY3Qgc3ltYm9sLCB0aGUgbGFzdCBzeW1ib2wgd2hpY2ggaGFzIGJlZW4gZGVmaW5lZCBpbgorICAgICB0aGlzIGNzZWN0LCBvciBOVUxMIGlmIG5vbmUgaGF2ZSBiZWVuIGRlZmluZWQgc28gZmFyLiAgRm9yIGEgLmJzCisgICAgIHN5bWJvbCwgdGhlIHJlZmVyZW5jZWQgY3NlY3Qgc3ltYm9sLiAgKi8KKyAgc3RydWN0IHN5bWJvbCAqd2l0aGluOworfTsKKworI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN0cnVjdCBwcGNfdGNfc3kKKworLyogV2UgbmVlZCBhbiBhZGRpdGlvbmFsIGF1eGVudCBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCisjZGVmaW5lIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTIDIKKworLyogU3F1YXJlIGFuZCBjdXJseSBicmFja2V0cyBhcmUgcGVybWl0dGVkIGluIHN5bWJvbCBuYW1lcy4gICovCisjZGVmaW5lIExFWF9CUiAzCisKKy8qIENhbm9uaWNhbGl6ZSB0aGUgc3ltYm9sIG5hbWUuICAqLworI2RlZmluZSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUobmFtZSkgcHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAobmFtZSkKK2V4dGVybiBjaGFyICpwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCisvKiBHZXQgdGhlIHN5bWJvbCBjbGFzcyBmcm9tIHRoZSBuYW1lLiAgKi8KKyNkZWZpbmUgdGNfc3ltYm9sX25ld19ob29rKHN5bSkgcHBjX3N5bWJvbF9uZXdfaG9vayAoc3ltKQorZXh0ZXJuIHZvaWQgcHBjX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICopKTsKKworLyogU2V0IHRoZSBzeW1ib2wgY2xhc3Mgb2YgYSBsYWJlbCBiYXNlZCBvbiB0aGUgY3NlY3QuICAqLworI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgcHBjX2Zyb2JfbGFiZWwgKHN5bSkKK2V4dGVybiB2b2lkIHBwY19mcm9iX2xhYmVsIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworCisvKiBUT0MgcmVsb2NzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcuICAqLworI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShmaXhwKSBwcGNfZml4X2FkanVzdGFibGUgKGZpeHApCitleHRlcm4gaW50IHBwY19maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKKworLyogQSByZWxvY2F0aW9uIGZyb20gb25lIGNzZWN0IHRvIGFub3RoZXIgbXVzdCBiZSBrZXB0LiAgKi8KKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKSBwcGNfZm9yY2VfcmVsb2NhdGlvbiAoRklYUCkKK2V4dGVybiBpbnQgcHBjX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7CisKKy8qIFdlIG5lZWQgdG8gc2V0IHRoZSBzZWN0aW9uIFZNQS4gICovCisjZGVmaW5lIHRjX2Zyb2Jfc2VjdGlvbihzZWMpIHBwY19mcm9iX3NlY3Rpb24gKHNlYykKK2V4dGVybiB2b2lkIHBwY19mcm9iX3NlY3Rpb24gUEFSQU1TICgoYXNlY3Rpb24gKikpOworCisvKiBGaW5pc2ggdXAgdGhlIHN5bWJvbC4gICovCisjZGVmaW5lIHRjX2Zyb2Jfc3ltYm9sKHN5bSwgcHVudCkgcHVudCA9IHBwY19mcm9iX3N5bWJvbCAoc3ltKQorZXh0ZXJuIGludCBwcGNfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CisKKy8qIEZpbmlzaCB1cCB0aGUgZW50aXJlIHN5bXRhYi4gICovCisjZGVmaW5lIHRjX2FkanVzdF9zeW10YWIoKSBwcGNfYWRqdXN0X3N5bXRhYiAoKQorZXh0ZXJuIHZvaWQgcHBjX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOworCisvKiBOaWNsYXMgQW5kZXJzc29uIDxuaWNhbkBpZGEubGl1LnNlPiBzYXlzIHRoaXMgaXMgbmVlZGVkLiAgKi8KKyNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAyCisKKyNlbmRpZiAvKiBPQkpfWENPRkYgKi8KKworI2lmZGVmIE9CSl9FTEYKKworLyogQnJhbmNoIHByZWRpY3Rpb24gcmVsb2NhdGlvbnMgbXVzdCBmb3JjZSByZWxvY2F0aW9uLCBhcyBtdXN0CisgICB0aGUgdnRhYmxlIGRlc2NyaXB0aW9uIHJlbG9jcy4gICovCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkJCQkJCVwKKygoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOCQkJCVwKKyB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUFBDX0IxNl9CUk5UQUtFTgkJCVwKKyB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTgkJCVwKKyB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4JCQlcCisgfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCQkJXAorIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisKKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKEZJWFAsU0VDKQkJCQlcCisoVENfRk9SQ0VfUkVMT0NBVElPTiAoRklYUCkJCQkJCQlcCisgfHwgKChGSVhQKS0+ZnhfYWRkc3kgJiYgIShGSVhQKS0+Znhfc3Vic3kgJiYgKEZJWFApLT5meF9hZGRzeS0+YnN5bQlcCisgICAgICYmIChGSVhQKS0+ZnhfYWRkc3ktPmJzeW0tPnNlY3Rpb24gIT0gU0VDKSkKKworLyogU3VwcG9ydCBmb3IgU0hGX0VYQ0xVREUgYW5kIFNIVF9PUkRFUkVEICovCitleHRlcm4gaW50IHBwY19zZWN0aW9uX2xldHRlciBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKK2V4dGVybiBpbnQgcHBjX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjaGFyICoqKSk7CitleHRlcm4gaW50IHBwY19zZWN0aW9uX3dvcmQgUEFSQU1TICgoY2hhciAqKikpOworZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChpbnQsIGludCwgaW50KSk7CisKKyNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fbGV0dGVyKExFVFRFUiwgUFRSX01TRykJcHBjX3NlY3Rpb25fbGV0dGVyIChMRVRURVIsIFBUUl9NU0cpCisjZGVmaW5lIG1kX2VsZl9zZWN0aW9uX3R5cGUoUFRSX1NUUikJCXBwY19zZWN0aW9uX3R5cGUgKFBUUl9TVFIpCisjZGVmaW5lIG1kX2VsZl9zZWN0aW9uX3dvcmQoUFRSX1NUUikJCXBwY19zZWN0aW9uX3dvcmQgKFBUUl9TVFIpCisjZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2ZsYWdzKEZMQUdTLCBBVFRSLCBUWVBFKQlwcGNfc2VjdGlvbl9mbGFncyAoRkxBR1MsIEFUVFIsIFRZUEUpCisKKy8qIEFkZCBleHRyYSBQUEMgc2VjdGlvbnMgLS0gTm90ZSwgZm9yIG5vdywgbWFrZSAuc2JzczIgYW5kIC5QUEMuRU1CLnNic3MwIGEKKyAgIG5vcm1hbCBzZWN0aW9uLCBhbmQgbm90IGEgYnNzIHNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIGRvZXNuJ3QgY3JhdGVyCisgICB3aGVuIHRyeWluZyB0byBtYWtlIG1vcmUgdGhhbiAyIHNlY3Rpb25zLiAgKi8KKyNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAorICB7ICIudGFncyIsCQlTSFRfT1JERVJFRCwJU0hGX0FMTE9DIH0sIFwKKyAgeyAiLnNkYXRhIiwJCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKKyAgeyAiLnNic3MiLAkJU0hUX05PQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKKyAgeyAiLnNkYXRhMiIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCisgIHsgIi5zYnNzMiIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCisgIHsgIi5QUEMuRU1CLnNkYXRhMCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DIH0sIFwKKyAgeyAiLlBQQy5FTUIuc2JzczAiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LAorCisjZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgcHBjX2NvbW1lbnRfY2hhcnMKK2V4dGVybiBjb25zdCBjaGFyICpwcGNfY29tbWVudF9jaGFyczsKKworLyogS2VlcCByZWxvY2F0aW9ucyByZWxhdGl2ZSB0byB0aGUgR09ULCBvciBub24tUEMgcmVsYXRpdmUuICovCisjZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgIAkJXAorICAoKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMTZfR09UT0ZGICAgICAgICAgICAgICAJCVwKKyAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0xPMTZfR09UT0ZGICAgICAgICAgCQlcCisgICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRiAgICAgICAgIAkJXAorICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRiAgICAgICAJCVwKKyAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0dQUkVMMTYgICAgICAgICAgICAgCQlcCisgICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAkJCVwKKyAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQkJCVwKKyAgICYmICEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAorICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKKyAgICYmICgoRklYKS0+ZnhfcGNyZWwJCQkJICAgICAgICAJCVwKKyAgICAgICB8fCAoKEZJWCktPmZ4X3N1YnN5ICE9IE5VTEwJCQkJCVwKKwkgICAmJiAoU19HRVRfU0VHTUVOVCAoKEZJWCktPmZ4X3N1YnN5KQkJCQlcCisJICAgICAgID09IFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9hZGRzeSkpKQkJCVwKKyAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKChGSVgpLT5meF9hZGRzeSksICdcMDAxJykgIT0gTlVMTAkJXAorICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAoKEZJWCktPmZ4X2FkZHN5KSwgJ1wwMDInKSAhPSBOVUxMKSkKKworLyogV2UgbXVzdCBuZXZlciBldmVyIHRyeSB0byByZXNvbHZlIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlCisgICBzeW1ib2xzIGluIHRoZSBhc3NlbWJsZXIsIGJlY2F1c2UgdGhlIC5vIGZpbGUgbWlnaHQgZ28gaW50byBhIHNoYXJlZAorICAgbGlicmFyeSwgYW5kIHNvbWUgb3RoZXIgc2hhcmVkIGxpYnJhcnkgbWlnaHQgb3ZlcnJpZGUgdGhhdCBzeW1ib2wuICAqLworI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAorICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAorICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCisgICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAorICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCisgICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCisKKyNlbmRpZiAvKiBPQkpfRUxGICovCisKKy8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KKyNkZWZpbmUgTURfQVBQTFlfRklYMworCisvKiBjYWxsIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiwgbm90IG1kX3BjcmVsX2Zyb20gKi8KKyNkZWZpbmUgTURfUENSRUxfRlJPTV9TRUNUSU9OKEZJWFAsIFNFQykgbWRfcGNyZWxfZnJvbV9zZWN0aW9uKEZJWFAsIFNFQykKK2V4dGVybiBsb25nIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHNlZ1QpKTsKKworI2RlZmluZSBtZF9wYXJzZV9uYW1lKG5hbWUsIGV4cCkgcHBjX3BhcnNlX25hbWUgKG5hbWUsIGV4cCkKK2V4dGVybiBpbnQgcHBjX3BhcnNlX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOworCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zaC5jIGIvZ2FzL2NvbmZpZy90Yy1zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOGNhODEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXNoLmMKQEAgLTAsMCArMSwyNDI1IEBACisvKiB0Yy1zaC5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIHRoZSBIaXRhY2hpIFN1cGVyLUgKKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgorICAgc2FjQGN5Z251cy5jb20KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNkZWZpbmUgREVGSU5FX1RBQkxFCisjaW5jbHVkZSAib3Bjb2Rlcy9zaC1vcGMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Citjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Citjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKKworc3RhdGljIHZvaWQgc191c2VzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCBzaF9jb3VudF9yZWxvY3MgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOworc3RhdGljIHZvaWQgc2hfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKKworLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgorICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKKyAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90CisgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKKyAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCisgKi8KKwordm9pZCBjb25zICgpOwordm9pZCBzX2FsaWduX2J5dGVzICgpOworc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7CisKK2ludCBzaGwgPSAwOworCitzdGF0aWMgdm9pZAorbGl0dGxlIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHNobCA9IDE7CisgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKK30KKworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJpbnQiLCBjb25zLCA0fSwKKyAgeyJ3b3JkIiwgY29ucywgMn0sCisgIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAorICB7ImxpdHRsZSIsIGxpdHRsZSwgMH0sCisgIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAorICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKKyAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCisgIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKKyAgeyJ1c2VzIiwgc191c2VzLCAwfSwKKyAgeyJ1YXdvcmQiLCBzX3VhY29ucywgMn0sCisgIHsidWFsb25nIiwgc191YWNvbnMsIDR9LAorICB7MCwgMCwgMH0KK307CisKKy8qaW50IG1kX3JlbG9jX3NpemU7ICovCisKK2ludCBzaF9yZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLworCisvKiBXaGV0aGVyIC1zbWFsbCB3YXMgc2Vlbi4gICovCisKK2ludCBzaF9zbWFsbDsKKworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBBcyBpbiAwZjEyLjQ1NiAqLworLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKKworI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKKworI2RlZmluZSBKUkVHIDE0CQkJLyogUmVnaXN0ZXIgdXNlZCBhcyBhIHRlbXAgd2hlbiByZWxheGluZyAqLworI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDQpICsgKGxlbmd0aCkpCisjZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+NCkpCisKKy8qIFRoZXNlIGFyZSB0aGUgdGhyZWUgdHlwZXMgb2YgcmVsYXhhYmxlIGluc3RyY3Rpb24gKi8KKyNkZWZpbmUgQ09ORF9KVU1QIDEKKyNkZWZpbmUgQ09ORF9KVU1QX0RFTEFZIDIKKyNkZWZpbmUgVU5DT05EX0pVTVAgIDMKKyNkZWZpbmUgRU5EIDQKKworI2RlZmluZSBVTkRFRl9ESVNQIDAKKyNkZWZpbmUgQ09ORDggIDEKKyNkZWZpbmUgQ09ORDEyIDIKKyNkZWZpbmUgQ09ORDMyIDMKKyNkZWZpbmUgVU5DT05EMTIgMQorI2RlZmluZSBVTkNPTkQzMiAyCisjZGVmaW5lIFVOREVGX1dPUkRfRElTUCA0CisKKyNkZWZpbmUgVU5DT05EMTIgMQorI2RlZmluZSBVTkNPTkQzMiAyCisKKy8qIEJyYW5jaCBkaXNwbGFjZW1lbnRzIGFyZSBmcm9tIHRoZSBhZGRyZXNzIG9mIHRoZSBicmFuY2ggcGx1cworICAgZm91ciwgdGh1cyBhbGwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgaGF2ZSA0IGFkZGVkIHRvIHRoZW0uICAqLworI2RlZmluZSBDT05EOF9GIDI1OAorI2RlZmluZSBDT05EOF9NIC0yNTIKKyNkZWZpbmUgQ09ORDhfTEVOR1RIIDIKKworLyogVGhlcmUgaXMgb25lIGV4dHJhIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgYnJhbmNoLCBzbyB3ZSBtdXN0IGFkZAorICAgdHdvIG1vcmUgYnl0ZXMgdG8gYWNjb3VudCBmb3IgaXQuICAqLworI2RlZmluZSBDT05EMTJfRiA0MTAwCisjZGVmaW5lIENPTkQxMl9NIC00MDkwCisjZGVmaW5lIENPTkQxMl9MRU5HVEggNgorCisjZGVmaW5lIENPTkQxMl9ERUxBWV9MRU5HVEggNAorCisvKiA/Pz8gVGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGFyZSB3cm9uZywgYnV0IHRoaXMgZG9lcyBub3QgbWF0dGVyCisgICBzaW5jZSB0aGlzIHJlbG9jYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCisjZGVmaW5lIENPTkQzMl9GICgxPDwzMCkKKyNkZWZpbmUgQ09ORDMyX00gLSgxPDwzMCkKKyNkZWZpbmUgQ09ORDMyX0xFTkdUSCAxNAorCisjZGVmaW5lIFVOQ09ORDEyX0YgNDA5OAorI2RlZmluZSBVTkNPTkQxMl9NIC00MDkyCisjZGVmaW5lIFVOQ09ORDEyX0xFTkdUSCAyCisKKy8qID8/PyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHdyb25nLCBidXQgdGhpcyBkb2VzIG5vdCBtYXR0ZXIKKyAgIHNpbmNlIHRoaXMgcmVsb2NhdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KKyNkZWZpbmUgVU5DT05EMzJfRiAoMTw8MzApCisjZGVmaW5lIFVOQ09ORDMyX00gLSgxPDwzMCkKKyNkZWZpbmUgVU5DT05EMzJfTEVOR1RIIDE0CisKK2NvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldID0geworICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCisgIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKKworICB7IDAgfSwKKyAgLyogQyAoQ09ORF9KVU1QLCBDT05EOCkgKi8KKyAgeyBDT05EOF9GLCBDT05EOF9NLCBDT05EOF9MRU5HVEgsIEMgKENPTkRfSlVNUCwgQ09ORDEyKSB9LAorICAvKiBDIChDT05EX0pVTVAsIENPTkQxMikgKi8KKyAgeyBDT05EMTJfRiwgQ09ORDEyX00sIENPTkQxMl9MRU5HVEgsIEMgKENPTkRfSlVNUCwgQ09ORDMyKSwgfSwKKyAgLyogQyAoQ09ORF9KVU1QLCBDT05EMzIpICovCisgIHsgQ09ORDMyX0YsIENPTkQzMl9NLCBDT05EMzJfTEVOR1RILCAwLCB9LAorICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKKyAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAorCisgIHsgMCB9LAorICAvKiBDIChDT05EX0pVTVBfREVMQVksIENPTkQ4KSAqLworICB7IENPTkQ4X0YsIENPTkQ4X00sIENPTkQ4X0xFTkdUSCwgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpIH0sCisgIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyKSAqLworICB7IENPTkQxMl9GLCBDT05EMTJfTSwgQ09ORDEyX0RFTEFZX0xFTkdUSCwgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMzIpLCB9LAorICAvKiBDIChDT05EX0pVTVBfREVMQVksIENPTkQzMikgKi8KKyAgeyBDT05EMzJfRiwgQ09ORDMyX00sIENPTkQzMl9MRU5HVEgsIDAsIH0sCisgIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAorICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCisKKyAgeyAwIH0sCisgIC8qIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMikgKi8KKyAgeyBVTkNPTkQxMl9GLCBVTkNPTkQxMl9NLCBVTkNPTkQxMl9MRU5HVEgsIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMiksIH0sCisgIC8qIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMikgKi8KKyAgeyBVTkNPTkQzMl9GLCBVTkNPTkQzMl9NLCBVTkNPTkQzMl9MRU5HVEgsIDAsIH0sCisgIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKKyAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAorICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCisgKi8KKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKKyAgY2hhciAqcHJldl9uYW1lID0gIiI7CisKKyAgaWYgKCEgc2hsKQorICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKKworICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7CisKKyAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KKyAgZm9yIChvcGNvZGUgPSBzaF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCisJeworCSAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOworCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCisJICAgICBzdHJpbmcgKi8KKwkgIG9wY29kZS0+bmFtZSA9IHByZXZfbmFtZTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlZ19tOworc3RhdGljIGludCByZWdfbjsKK3N0YXRpYyBpbnQgcmVnX2I7CisKK3N0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHNoX2FyZ190eXBlIHR5cGU7CisgICAgaW50IHJlZzsKKyAgfQorCitzaF9vcGVyYW5kX2luZm87CisKKy8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KK3N0YXRpYyBpbnQKK3BhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcpCisgICAgIGNoYXIgKnNyYzsKKyAgICAgaW50ICptb2RlOworICAgICBpbnQgKnJlZzsKK3sKKyAgLyogV2UgdXNlICFpc2FsbnVtIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHJlZ2lzdGVyIG5hbWUsIHRvCisgICAgIG1ha2Ugc3VyZSB0aGF0IHdlIHdvbid0IGFjY2lkZW50YWxseSByZWNvZ25pemUgYSBzeW1ib2wgbmFtZSBzdWNoIGFzCisgICAgICdzcmFtJyBhcyBiZWluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVnaXN0ZXIgJ3NyJy4gICovCisKKyAgaWYgKHNyY1swXSA9PSAncicpCisgICAgeworICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JyAmJiBzdHJuY21wKCZzcmNbMl0sICJfYmFuayIsIDUpID09IDAKKwkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s3XSkpCisJeworCSAgKm1vZGUgPSBBX1JFR19COworCSAgKnJlZyAgPSAoc3JjWzFdIC0gJzAnKTsKKwkgIHJldHVybiA3OworCX0KKyAgICB9CisKKyAgaWYgKHNyY1swXSA9PSAncicpCisgICAgeworICAgICAgaWYgKHNyY1sxXSA9PSAnMScpCisJeworCSAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc1JworCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisJICAgIHsKKwkgICAgICAqbW9kZSA9IEFfUkVHX047CisJICAgICAgKnJlZyA9IDEwICsgc3JjWzJdIC0gJzAnOworCSAgICAgIHJldHVybiAzOworCSAgICB9CisJfQorICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc5JworCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKKwl7CisJICAqbW9kZSA9IEFfUkVHX047CisJICAqcmVnID0gKHNyY1sxXSAtICcwJyk7CisJICByZXR1cm4gMjsKKwl9CisgICAgfQorCisgIGlmIChzcmNbMF0gPT0gJ3MnCisgICAgICAmJiBzcmNbMV0gPT0gJ3MnCisgICAgICAmJiBzcmNbMl0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisgICAgeworICAgICAgKm1vZGUgPSBBX1NTUjsKKyAgICAgIHJldHVybiAzOworICAgIH0KKworICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnICYmIHNyY1syXSA9PSAnYycKKyAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisgICAgeworICAgICAgKm1vZGUgPSBBX1NQQzsKKyAgICAgIHJldHVybiAzOworICAgIH0KKworICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ2cnICYmIHNyY1syXSA9PSAncicKKyAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisgICAgeworICAgICAgKm1vZGUgPSBBX1NHUjsKKyAgICAgIHJldHVybiAzOworICAgIH0KKworICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKKyAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisgICAgeworICAgICAgKm1vZGUgPSBBX0RCUjsKKyAgICAgIHJldHVybiAzOworICAgIH0KKworICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCisgICAgeworICAgICAgKm1vZGUgPSBBX1NSOworICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKKyAgICB7CisgICAgICAqbW9kZSA9IEFfUkVHX047CisgICAgICAqcmVnID0gMTU7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdyJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQorICAgIHsKKyAgICAgICptb2RlID0gQV9QUjsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdjJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQorICAgIHsKKyAgICAgICptb2RlID0gQV9ESVNQX1BDOworICAgICAgcmV0dXJuIDI7CisgICAgfQorICBpZiAoc3JjWzBdID09ICdnJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKKyAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisgICAgeworICAgICAgKm1vZGUgPSBBX0dCUjsKKyAgICAgIHJldHVybiAzOworICAgIH0KKyAgaWYgKHNyY1swXSA9PSAndicgJiYgc3JjWzFdID09ICdiJyAmJiBzcmNbMl0gPT0gJ3InCisgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQorICAgIHsKKyAgICAgICptb2RlID0gQV9WQlI7CisgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgaWYgKHNyY1swXSA9PSAnbScgJiYgc3JjWzFdID09ICdhJyAmJiBzcmNbMl0gPT0gJ2MnCisgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQorICAgIHsKKyAgICAgIGlmIChzcmNbM10gPT0gJ2wnKQorCXsKKwkgICptb2RlID0gQV9NQUNMOworCSAgcmV0dXJuIDQ7CisJfQorICAgICAgaWYgKHNyY1szXSA9PSAnaCcpCisJeworCSAgKm1vZGUgPSBBX01BQ0g7CisJICByZXR1cm4gNDsKKwl9CisgICAgfQorICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3InKQorICAgIHsKKyAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQorCXsKKwkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNScKKwkgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQorCSAgICB7CisJICAgICAgKm1vZGUgPSBGX1JFR19OOworCSAgICAgICpyZWcgPSAxMCArIHNyY1szXSAtICcwJzsKKwkgICAgICByZXR1cm4gNDsKKwkgICAgfQorCX0KKyAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOScKKwkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCisJeworCSAgKm1vZGUgPSBGX1JFR19OOworCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpOworCSAgcmV0dXJuIDM7CisJfQorICAgIH0KKyAgaWYgKHNyY1swXSA9PSAnZCcgJiYgc3JjWzFdID09ICdyJykKKyAgICB7CisgICAgICBpZiAoc3JjWzJdID09ICcxJykKKwl7CisJICBpZiAoc3JjWzNdID49ICcwJyAmJiBzcmNbM10gPD0gJzQnICYmICEgKChzcmNbM10gLSAnMCcpICYgMSkKKwkgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQorCSAgICB7CisJICAgICAgKm1vZGUgPSBEX1JFR19OOworCSAgICAgICpyZWcgPSAxMCArIHNyY1szXSAtICcwJzsKKwkgICAgICByZXR1cm4gNDsKKwkgICAgfQorCX0KKyAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOCcgJiYgISAoKHNyY1syXSAtICcwJykgJiAxKQorCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKKwl7CisJICAqbW9kZSA9IERfUkVHX047CisJICAqcmVnID0gKHNyY1syXSAtICcwJyk7CisJICByZXR1cm4gMzsKKwl9CisgICAgfQorICBpZiAoc3JjWzBdID09ICd4JyAmJiBzcmNbMV0gPT0gJ2QnKQorICAgIHsKKyAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQorCXsKKwkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNCcgJiYgISAoKHNyY1szXSAtICcwJykgJiAxKQorCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCisJICAgIHsKKwkgICAgICAqbW9kZSA9IFhfUkVHX047CisJICAgICAgKnJlZyA9IDExICsgc3JjWzNdIC0gJzAnOworCSAgICAgIHJldHVybiA0OworCSAgICB9CisJfQorICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc4JyAmJiAhICgoc3JjWzJdIC0gJzAnKSAmIDEpCisJICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQorCXsKKwkgICptb2RlID0gWF9SRUdfTjsKKwkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKSArIDE7CisJICByZXR1cm4gMzsKKwl9CisgICAgfQorICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3YnKQorICAgIHsKKyAgICAgIGlmIChzcmNbMl0gPT0gJzEnJiYgc3JjWzNdID09ICcyJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQorCXsKKwkgICptb2RlID0gVl9SRUdfTjsKKwkgICpyZWcgPSAxMjsKKwkgIHJldHVybiA0OworCX0KKyAgICAgIGlmICgoc3JjWzJdID09ICcwJyB8fCBzcmNbMl0gPT0gJzQnIHx8IHNyY1syXSA9PSAnOCcpCisJICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQorCXsKKwkgICptb2RlID0gVl9SRUdfTjsKKwkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKTsKKwkgIHJldHVybiAzOworCX0KKyAgICB9CisgIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICd1JyAmJiBzcmNbM10gPT0gJ2wnCisgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQorICAgIHsKKyAgICAgICptb2RlID0gRlBVTF9OOworICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICdzJyAmJiBzcmNbM10gPT0gJ2MnCisgICAgICAmJiBzcmNbNF0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s1XSkpCisgICAgeworICAgICAgKm1vZGUgPSBGUFNDUl9OOworICAgICAgcmV0dXJuIDU7CisgICAgfQorCisgIGlmIChzcmNbMF0gPT0gJ3gnICYmIHNyY1sxXSA9PSAnbScgJiYgc3JjWzJdID09ICd0JyAmJiBzcmNbM10gPT0gJ3InCisgICAgICAmJiBzcmNbNF0gPT0gJ3gnICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s1XSkpCisgICAgeworICAgICAgKm1vZGUgPSBYTVRSWF9NNDsKKyAgICAgIHJldHVybiA1OworICAgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN5bWJvbFMgKmRvdCgpCit7CisgIGNvbnN0IGNoYXIgKmZha2U7CisKKyAgLyogSkY6ICcuJyBpcyBwc2V1ZG8gc3ltYm9sIHdpdGggdmFsdWUgb2YgY3VycmVudCBsb2NhdGlvbgorICAgICBpbiBjdXJyZW50IHNlZ21lbnQuICAqLworICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOworICByZXR1cm4gIHN5bWJvbF9uZXcgKGZha2UsCisJCSAgICAgIG5vd19zZWcsCisJCSAgICAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKKwkJICAgICAgZnJhZ19ub3cpOworCit9CisKKworc3RhdGljCitjaGFyICoKK3BhcnNlX2V4cCAocykKKyAgICAgY2hhciAqczsKK3sKKyAgY2hhciAqc2F2ZTsKKyAgY2hhciAqbmV3OworCisgIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisgIGV4cHJlc3Npb24gKCZpbW1lZGlhdGUpOworICBpZiAoaW1tZWRpYXRlLlhfb3AgPT0gT19hYnNlbnQpCisgICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisgIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKKyAgcmV0dXJuIG5ldzsKK30KKworCisvKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgorCisgICBSbiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBkaXJlY3QKKyAgIEBSbiAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGluZGlyZWN0CisgICBAUm4rICAgICAgICAgICAgICAgICBBdXRvaW5jcmVtZW50CisgICBALVJuICAgICAgICAgICAgICAgICBBdXRvZGVjcmVtZW50CisgICBAKGRpc3A6NCxSbikKKyAgIEAoZGlzcDo4LEdCUikKKyAgIEAoZGlzcDo4LFBDKQorCisgICBAKFIwLFJuKQorICAgQChSMCxHQlIpCisKKyAgIGRpc3A6OAorICAgZGlzcDoxMgorICAgI2ltbTgKKyAgIHByLCBnYnIsIHZiciwgbWFjbCwgbWFjaAorCisgKi8KKworc3RhdGljCitjaGFyICoKK3BhcnNlX2F0IChzcmMsIG9wKQorICAgICBjaGFyICpzcmM7CisgICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Cit7CisgIGludCBsZW47CisgIGludCBtb2RlOworICBzcmMrKzsKKyAgaWYgKHNyY1swXSA9PSAnLScpCisgICAgeworICAgICAgLyogTXVzdCBiZSBwcmVkZWNyZW1lbnQgKi8KKyAgICAgIHNyYysrOworCisgICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOworICAgICAgaWYgKG1vZGUgIT0gQV9SRUdfTikKKwlhc19iYWQgKF8oImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQC0iKSk7CisKKyAgICAgIG9wLT50eXBlID0gQV9ERUNfTjsKKyAgICAgIHNyYyArPSBsZW47CisgICAgfQorICBlbHNlIGlmIChzcmNbMF0gPT0gJygnKQorICAgIHsKKyAgICAgIC8qIENvdWxkIGJlIEAoZGlzcCwgcm4pLCBAKGRpc3AsIGdiciksIEAoZGlzcCwgcGMpLCAgQChyMCwgZ2JyKSBvcgorICAgICAgICAgQChyMCwgcm4pICovCisgICAgICBzcmMrKzsKKyAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7CisgICAgICBpZiAobGVuICYmIG1vZGUgPT0gQV9SRUdfTikKKwl7CisJICBzcmMgKz0gbGVuOworCSAgaWYgKG9wLT5yZWcgIT0gMCkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygibXVzdCBiZSBAKHIwLC4uLikiKSk7CisJICAgIH0KKwkgIGlmIChzcmNbMF0gPT0gJywnKQorCSAgICBzcmMrKzsKKwkgIC8qIE5vdyBjYW4gYmUgcm4gb3IgZ2JyICovCisJICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOworCSAgaWYgKG1vZGUgPT0gQV9HQlIpCisJICAgIHsKKwkgICAgICBvcC0+dHlwZSA9IEFfUjBfR0JSOworCSAgICB9CisJICBlbHNlIGlmIChtb2RlID09IEFfUkVHX04pCisJICAgIHsKKwkgICAgICBvcC0+dHlwZSA9IEFfSU5EX1IwX1JFR19OOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKHIwLC4uLikiKSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTXVzdCBiZSBhbiBAKGRpc3AsLi4gdGhpbmcpICovCisJICBzcmMgPSBwYXJzZV9leHAgKHNyYyk7CisJICBpZiAoc3JjWzBdID09ICcsJykKKwkgICAgc3JjKys7CisJICAvKiBOb3cgY2FuIGJlIHJuLCBnYnIgb3IgcGMgKi8KKwkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcpOworCSAgaWYgKGxlbikKKwkgICAgeworCSAgICAgIGlmIChtb2RlID09IEFfUkVHX04pCisJCXsKKwkJICBvcC0+dHlwZSA9IEFfRElTUF9SRUdfTjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQV9HQlIpCisJCXsKKwkJICBvcC0+dHlwZSA9IEFfRElTUF9HQlI7CisJCX0KKwkgICAgICBlbHNlIGlmIChtb2RlID09IEFfRElTUF9QQykKKwkJeworCQkgIC8qIFR1cm4gYSBwbGFpbiBAKDQscGMpIGludG8gQCguKzQscGMpICovCisJCSAgaWYgKGltbWVkaWF0ZS5YX29wID09IE9fY29uc3RhbnQpIHsgCisJCSAgICBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sID0gZG90KCk7CisJCSAgICBpbW1lZGlhdGUuWF9vcCA9IE9fc3ltYm9sOworCQkgIH0KKwkJICBvcC0+dHlwZSA9IEFfRElTUF9QQzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAoZGlzcCxbUm4sIGdiciwgcGNdKSIpKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKGRpc3AsW1JuLCBnYnIsIHBjXSkiKSk7CisJICAgIH0KKwl9CisgICAgICBzcmMgKz0gbGVuOworICAgICAgaWYgKHNyY1swXSAhPSAnKScpCisJYXNfYmFkIChfKCJleHBlY3RpbmcgKSIpKTsKKyAgICAgIGVsc2UKKwlzcmMrKzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzcmMgKz0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKKyAgICAgIGlmIChtb2RlICE9IEFfUkVHX04pCisJeworCSAgYXNfYmFkIChfKCJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAiKSk7CisJfQorICAgICAgaWYgKHNyY1swXSA9PSAnKycpCisJeworCSAgb3AtPnR5cGUgPSBBX0lOQ19OOworCSAgc3JjKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG9wLT50eXBlID0gQV9JTkRfTjsKKwl9CisgICAgfQorICByZXR1cm4gc3JjOworfQorCitzdGF0aWMgdm9pZAorZ2V0X29wZXJhbmQgKHB0ciwgb3ApCisgICAgIGNoYXIgKipwdHI7CisgICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Cit7CisgIGNoYXIgKnNyYyA9ICpwdHI7CisgIGludCBtb2RlID0gLTE7CisgIHVuc2lnbmVkIGludCBsZW47CisKKyAgaWYgKHNyY1swXSA9PSAnIycpCisgICAgeworICAgICAgc3JjKys7CisgICAgICAqcHRyID0gcGFyc2VfZXhwIChzcmMpOworICAgICAgb3AtPnR5cGUgPSBBX0lNTTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZWxzZSBpZiAoc3JjWzBdID09ICdAJykKKyAgICB7CisgICAgICAqcHRyID0gcGFyc2VfYXQgKHNyYywgb3ApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKKyAgaWYgKGxlbikKKyAgICB7CisgICAgICAqcHRyID0gc3JjICsgbGVuOworICAgICAgb3AtPnR5cGUgPSBtb2RlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdCBhIHJlZywgdGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBhIGRpc3BsYWNlbWVudCAqLworICAgICAgKnB0ciA9IHBhcnNlX2V4cCAoc3JjKTsKKyAgICAgIG9wLT50eXBlID0gQV9ESVNQX1BDOworICAgICAgcmV0dXJuOworICAgIH0KK30KKworc3RhdGljCitjaGFyICoKK2dldF9vcGVyYW5kcyAoaW5mbywgYXJncywgb3BlcmFuZCkKKyAgICAgc2hfb3Bjb2RlX2luZm8gKmluZm87CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKKworeworICBjaGFyICpwdHIgPSBhcmdzOworICBpZiAoaW5mby0+YXJnWzBdKQorICAgIHsKKyAgICAgIHB0cisrOworCisgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDApOworICAgICAgaWYgKGluZm8tPmFyZ1sxXSkKKwl7CisJICBpZiAoKnB0ciA9PSAnLCcpCisJICAgIHsKKwkgICAgICBwdHIrKzsKKwkgICAgfQorCSAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxKTsKKwkgIGlmIChpbmZvLT5hcmdbMl0pCisJICAgIHsKKwkgICAgICBpZiAoKnB0ciA9PSAnLCcpCisJCXsKKwkJICBwdHIrKzsKKwkJfQorCSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9wZXJhbmRbMl0udHlwZSA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgb3BlcmFuZFsxXS50eXBlID0gMDsKKwkgIG9wZXJhbmRbMl0udHlwZSA9IDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG9wZXJhbmRbMF0udHlwZSA9IDA7CisgICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOworICAgICAgb3BlcmFuZFsyXS50eXBlID0gMDsKKyAgICB9CisgIHJldHVybiBwdHI7Cit9CisKKy8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAorICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcworICAgcHJvdmlkZWQKKyAqLworCitzdGF0aWMKK3NoX29wY29kZV9pbmZvICoKK2dldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kcykKKyAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKKyAgICAgc2hfb3BlcmFuZF9pbmZvICpvcGVyYW5kczsKK3sKKyAgc2hfb3Bjb2RlX2luZm8gKnRoaXNfdHJ5ID0gb3Bjb2RlOworICBjaGFyICpuYW1lID0gb3Bjb2RlLT5uYW1lOworICBpbnQgbiA9IDA7CisgIHdoaWxlIChvcGNvZGUtPm5hbWUpCisgICAgeworICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKKyAgICAgIGlmICh0aGlzX3RyeS0+bmFtZSAhPSBuYW1lKQorCXsKKwkgIC8qIFdlJ3ZlIGxvb2tlZCBzbyBmYXIgZG93biB0aGUgdGFibGUgdGhhdCB3ZSd2ZSBydW4gb3V0IG9mCisJICAgICBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSAqLworCSAgcmV0dXJuIDA7CisJfQorICAgICAgLyogbG9vayBhdCBib3RoIG9wZXJhbmRzIG5lZWRlZCBieSB0aGUgb3Bjb2RlcyBhbmQgcHJvdmlkZWQgYnkKKyAgICAgICAgIHRoZSB1c2VyIC0gc2luY2UgYW4gYXJnIHRlc3Qgd2lsbCBvZnRlbiBmYWlsIG9uIHRoZSBzYW1lIGFyZworICAgICAgICAgYWdhaW4gYW5kIGFnYWluLCB3ZSdsbCB0cnkgYW5kIHRlc3QgdGhlIGxhc3QgZmFpbGluZyBhcmcgdGhlCisgICAgICAgICBmaXJzdCBvbiBlYWNoIG9wY29kZSB0cnkgKi8KKworICAgICAgZm9yIChuID0gMDsgdGhpc190cnktPmFyZ1tuXTsgbisrKQorCXsKKwkgIHNoX29wZXJhbmRfaW5mbyAqdXNlciA9IG9wZXJhbmRzICsgbjsKKwkgIHNoX2FyZ190eXBlIGFyZyA9IHRoaXNfdHJ5LT5hcmdbbl07CisJICBzd2l0Y2ggKGFyZykKKwkgICAgeworCSAgICBjYXNlIEFfSU1NOgorCSAgICBjYXNlIEFfQkRJU1AxMjoKKwkgICAgY2FzZSBBX0JESVNQODoKKwkgICAgY2FzZSBBX0RJU1BfR0JSOgorCSAgICBjYXNlIEFfRElTUF9QQzoKKwkgICAgY2FzZSBBX01BQ0g6CisJICAgIGNhc2UgQV9QUjoKKwkgICAgY2FzZSBBX01BQ0w6CisJICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQorCQlnb3RvIGZhaWw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9SMDoKKwkgICAgICAvKiBvcGNvZGUgbmVlZHMgcjAgKi8KKwkgICAgICBpZiAodXNlci0+dHlwZSAhPSBBX1JFR19OIHx8IHVzZXItPnJlZyAhPSAwKQorCQlnb3RvIGZhaWw7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9SMF9HQlI6CisJICAgICAgaWYgKHVzZXItPnR5cGUgIT0gQV9SMF9HQlIgfHwgdXNlci0+cmVnICE9IDApCisJCWdvdG8gZmFpbDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBGX0ZSMDoKKwkgICAgICBpZiAodXNlci0+dHlwZSAhPSBGX1JFR19OIHx8IHVzZXItPnJlZyAhPSAwKQorCQlnb3RvIGZhaWw7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBX1JFR19OOgorCSAgICBjYXNlIEFfSU5DX046CisJICAgIGNhc2UgQV9ERUNfTjoKKwkgICAgY2FzZSBBX0lORF9OOgorCSAgICBjYXNlIEFfSU5EX1IwX1JFR19OOgorCSAgICBjYXNlIEFfRElTUF9SRUdfTjoKKwkgICAgY2FzZSBGX1JFR19OOgorCSAgICBjYXNlIERfUkVHX046CisJICAgIGNhc2UgWF9SRUdfTjoKKwkgICAgY2FzZSBWX1JFR19OOgorCSAgICBjYXNlIEZQVUxfTjoKKwkgICAgY2FzZSBGUFNDUl9OOgorCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLworCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKKwkJZ290byBmYWlsOworCSAgICAgIHJlZ19uID0gdXNlci0+cmVnOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEZEX1JFR19OOgorCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEZfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBEX1JFR19OKQorCQlnb3RvIGZhaWw7CisJICAgICAgcmVnX24gPSB1c2VyLT5yZWc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFhfUkVHX046CisJICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRF9SRUdfTiAmJiB1c2VyLT50eXBlICE9IFhfUkVHX04pCisJCWdvdG8gZmFpbDsKKwkgICAgICByZWdfbiA9IHVzZXItPnJlZzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0dCUjoKKwkgICAgY2FzZSBBX1NSOgorCSAgICBjYXNlIEFfVkJSOgorCSAgICBjYXNlIEFfU1NSOgorCSAgICBjYXNlIEFfU1BDOgorCSAgICBjYXNlIEFfU0dSOgorCSAgICBjYXNlIEFfREJSOgorCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKKwkJZ290byBmYWlsOworCSAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFfUkVHX0I6CisJICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQorCQlnb3RvIGZhaWw7CisJICAgICAgcmVnX2IgPSB1c2VyLT5yZWc7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBX1JFR19NOgorCSAgICBjYXNlIEFfSU5DX006CisJICAgIGNhc2UgQV9ERUNfTToKKwkgICAgY2FzZSBBX0lORF9NOgorCSAgICBjYXNlIEFfSU5EX1IwX1JFR19NOgorCSAgICBjYXNlIEFfRElTUF9SRUdfTToKKwkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KKwkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBBX1JFR19NICsgQV9SRUdfTikKKwkJZ290byBmYWlsOworCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRl9SRUdfTToKKwkgICAgY2FzZSBEX1JFR19NOgorCSAgICBjYXNlIFhfUkVHX006CisJICAgIGNhc2UgVl9SRUdfTToKKwkgICAgY2FzZSBGUFVMX006CisJICAgIGNhc2UgRlBTQ1JfTToKKwkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KKwkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBGX1JFR19NICsgRl9SRUdfTikKKwkJZ290byBmYWlsOworCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERYX1JFR19NOgorCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBYX1JFR19OKQorCQlnb3RvIGZhaWw7CisJICAgICAgcmVnX20gPSB1c2VyLT5yZWc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgWE1UUlhfTTQ6CisJICAgICAgaWYgKHVzZXItPnR5cGUgIT0gWE1UUlhfTTQpCisJCWdvdG8gZmFpbDsKKwkgICAgICByZWdfbSA9IDQ7CisJICAgICAgYnJlYWs7CisJCisJICAgIGRlZmF1bHQ6CisJICAgICAgcHJpbnRmIChfKCJ1bmhhbmRsZWQgJWRcbiIpLCBhcmcpOworCSAgICAgIGdvdG8gZmFpbDsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiB0aGlzX3RyeTsKKyAgICBmYWlsOjsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKKyAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7CisgICAgIGludCBsb3c7CisgICAgIGludCBoaWdoOworeworICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50CisgICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKKyAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCisgICAgeworICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7CisgICAgfQorICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOworfQorCisKK3N0YXRpYyB2b2lkCitpbnNlcnQgKHdoZXJlLCBob3csIHBjcmVsKQorICAgICBjaGFyICp3aGVyZTsKKyAgICAgaW50IGhvdzsKKyAgICAgaW50IHBjcmVsOworeworICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCisJICAgICAgIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJICAgICAgIDIsCisJICAgICAgICZpbW1lZGlhdGUsCisJICAgICAgIHBjcmVsLAorCSAgICAgICBob3cpOworfQorCitzdGF0aWMgdm9pZAorYnVpbGRfcmVsYXggKG9wY29kZSkKKyAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKK3sKKyAgaW50IGhpZ2hfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7CisgIGNoYXIgKnA7CisKKyAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQorICAgIHsKKyAgICAgIGludCB3aGF0ID0gKG9wY29kZS0+bmliYmxlc1sxXSAmIDQpID8gQ09ORF9KVU1QX0RFTEFZIDogQ09ORF9KVU1QOworICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKKwkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGgsCisJCSAgICBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGgsCisJCSAgICBDICh3aGF0LCAwKSwKKwkJICAgIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wsCisJCSAgICBpbW1lZGlhdGUuWF9hZGRfbnVtYmVyLAorCQkgICAgMCk7CisgICAgICBwW2hpZ2hfYnl0ZV0gPSAob3Bjb2RlLT5uaWJibGVzWzBdIDw8IDQpIHwgKG9wY29kZS0+bmliYmxlc1sxXSk7CisgICAgfQorICBlbHNlIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIpCisgICAgeworICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKKwkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMildLnJseF9sZW5ndGgsCisJCSAgICBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpXS5ybHhfbGVuZ3RoLAorCQkgICAgQyAoVU5DT05EX0pVTVAsIDApLAorCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCwKKwkJICAgIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCisJCSAgICAwKTsKKyAgICAgIHBbaGlnaF9ieXRlXSA9IChvcGNvZGUtPm5pYmJsZXNbMF0gPDwgNCk7CisgICAgfQorCit9CisKKy8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCisgKi8KK3N0YXRpYyB2b2lkCitidWlsZF9NeXRlcyAob3Bjb2RlLCBvcGVyYW5kKQorICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOworICAgICBzaF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7CisKK3sKKyAgaW50IGluZGV4OworICBjaGFyIG5idWZbNF07CisgIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAoMik7CisgIGludCBsb3dfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMSA6IDA7CisgIG5idWZbMF0gPSAwOworICBuYnVmWzFdID0gMDsKKyAgbmJ1ZlsyXSA9IDA7CisgIG5idWZbM10gPSAwOworCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCisgICAgeworICAgICAgc2hfbmliYmxlX3R5cGUgaSA9IG9wY29kZS0+bmliYmxlc1tpbmRleF07CisgICAgICBpZiAoaSA8IDE2KQorCXsKKwkgIG5idWZbaW5kZXhdID0gaTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChpKQorCSAgICB7CisJICAgIGNhc2UgUkVHX046CisJICAgICAgbmJ1ZltpbmRleF0gPSByZWdfbjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSRUdfTToKKwkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19tOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJFR19OTToKKwkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19uIHwgKHJlZ19tID4+IDIpOworCSAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRUdfQjoKKwkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19iIHwgMHgwODsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBESVNQXzQ6CisJICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTQsIDApOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIElNTV80Qlk0OgorCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU00Qlk0LCAwKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJTU1fNEJZMjoKKwkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNEJZMiwgMCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSU1NXzQ6CisJICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTQsIDApOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIElNTV84Qlk0OgorCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU04Qlk0LCAwKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJTU1fOEJZMjoKKwkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NOEJZMiwgMCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSU1NXzg6CisJICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTgsIDApOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBDUkVMSU1NXzhCWTQ6CisJICAgICAgaW5zZXJ0IChvdXRwdXQsIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQsIDEpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBDUkVMSU1NXzhCWTI6CisJICAgICAgaW5zZXJ0IChvdXRwdXQsIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsIDEpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHByaW50ZiAoXygiZmFpbGVkIGZvciAlZFxuIiksIGkpOworCSAgICB9CisJfQorICAgIH0KKyAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pIHsKKyAgICBvdXRwdXRbMV0gPSAobmJ1ZlswXSA8PCA0KSB8IChuYnVmWzFdKTsKKyAgICBvdXRwdXRbMF0gPSAobmJ1ZlsyXSA8PCA0KSB8IChuYnVmWzNdKTsKKyAgfQorICBlbHNlIHsKKyAgICBvdXRwdXRbMF0gPSAobmJ1ZlswXSA8PCA0KSB8IChuYnVmWzFdKTsKKyAgICBvdXRwdXRbMV0gPSAobmJ1ZlsyXSA8PCA0KSB8IChuYnVmWzNdKTsKKyAgfQorfQorCisvKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKKyAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0CisgICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgorICovCisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQ7CisgIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKKyAgc2hfb3BlcmFuZF9pbmZvIG9wZXJhbmRbM107CisgIHNoX29wY29kZV9pbmZvICpvcGNvZGU7CisgIGNoYXIgbmFtZVsyMF07CisgIGludCBubGVuID0gMDsKKyAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgd2hpbGUgKCpzdHIgPT0gJyAnKQorICAgIHN0cisrOworCisgIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCisgIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKKyAgICAgICAqb3BfZW5kCisgICAgICAgJiYgbmxlbiA8IDIwCisgICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOworICAgICAgIG9wX2VuZCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG9wX3N0YXJ0W25sZW5dOworCisgICAgICAvKiBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIHdpbGwgY29udmVydCBDTVAvRVEgaW50byBjbXAvRVEKKwkgYmVjYXVzZSBpdCB0aGlua3MgdGhlICcvJyBpcyB0aGUgZW5kIG9mIHRoZSBzeW1ib2wuICBJbnN0ZWFkIG9mCisJIGhhY2tpbmcgdXAgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSwgd2UganVzdCBkZWFsIHdpdGggaXQKKwkgaGVyZS4gICovCisgICAgICBjID0gaXN1cHBlciAoYykgPyB0b2xvd2VyIChjKSA6IGM7CisgICAgICBuYW1lW25sZW5dID0gYzsKKyAgICAgIG5sZW4rKzsKKyAgICB9CisgIG5hbWVbbmxlbl0gPSAwOworCisgIGlmIChubGVuID09IDApCisgICAgeworICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7CisgICAgfQorCisgIG9wY29kZSA9IChzaF9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOworCisgIGlmIChvcGNvZGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2hfcmVsYXgKKyAgICAgICYmICEgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQorICAgIHsKKyAgICAgIC8qIE91dHB1dCBhIENPREUgcmVsb2MgdG8gdGVsbCB0aGUgbGlua2VyIHRoYXQgdGhlIGZvbGxvd2luZworICAgICAgICAgYnl0ZXMgYXJlIGluc3RydWN0aW9ucywgbm90IGRhdGEuICAqLworICAgICAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmFic19zeW1ib2wsIDAsIDAsCisJICAgICAgIEJGRF9SRUxPQ19TSF9DT0RFKTsKKyAgICAgIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSA9IDE7CisgICAgfQorCisgIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIKKyAgICAgIHx8IG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQorICAgIHsKKyAgICAgIHBhcnNlX2V4cCAob3BfZW5kICsgMSk7CisgICAgICBidWlsZF9yZWxheCAob3Bjb2RlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAob3Bjb2RlLT5hcmdbMF0gIT0gQV9FTkQpCisJeworCSAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7CisJfQorICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOworCisgICAgICBpZiAob3Bjb2RlID09IDApCisJeworCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KKwkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKKworCSAgd2hlcmVbMF0gPSAweDA7CisJICB3aGVyZVsxXSA9IDB4MDsKKwkgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOworCSAgcmV0dXJuOworCX0KKworICAgICAgYnVpbGRfTXl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7CisgICAgfQorCit9CisKKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbGFiZWwgZGVmaW5pdGlvbiBpcyBzZWVuLiAgSXQKKyAgIGVtaXRzIGEgQkZEX1JFTE9DX1NIX0xBQkVMIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCisKK3ZvaWQKK3NoX2Zyb2JfbGFiZWwgKCkKK3sKKyAgc3RhdGljIGZyYWdTICpsYXN0X2xhYmVsX2ZyYWc7CisgIHN0YXRpYyBpbnQgbGFzdF9sYWJlbF9vZmZzZXQ7CisKKyAgaWYgKHNoX3JlbGF4CisgICAgICAmJiBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCisgICAgeworICAgICAgaW50IG9mZnNldDsKKworICAgICAgb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOworICAgICAgaWYgKGZyYWdfbm93ICE9IGxhc3RfbGFiZWxfZnJhZworCSAgfHwgb2Zmc2V0ICE9IGxhc3RfbGFiZWxfb2Zmc2V0KQorCXsJCisJICBmaXhfbmV3IChmcmFnX25vdywgb2Zmc2V0LCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwgQkZEX1JFTE9DX1NIX0xBQkVMKTsKKwkgIGxhc3RfbGFiZWxfZnJhZyA9IGZyYWdfbm93OworCSAgbGFzdF9sYWJlbF9vZmZzZXQgPSBvZmZzZXQ7CisJfQorICAgIH0KK30KKworLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgaXMgYWJvdXQgdG8gb3V0cHV0IHNvbWUKKyAgIGRhdGEuICBJdCBlbWl0cyBhIEJGRF9SRUxPQ19TSF9EQVRBIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCisKK3ZvaWQKK3NoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCit7CisgIGlmIChzaF9yZWxheAorICAgICAgJiYgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQorICAgIHsKKyAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZhYnNfc3ltYm9sLCAwLCAwLAorCSAgICAgICBCRkRfUkVMT0NfU0hfREFUQSk7CisgICAgICBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUgPSAwOworICAgIH0KK30KKworc3ltYm9sUyAqCitERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAorICAgICAgIGNoYXIgKm5hbWUpCit7CisgIHJldHVybiAwOworfQorCisjaWZkZWYgT0JKX0NPRkYKKwordm9pZAorREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAorICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKK30KKwordm9pZAorREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAorICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKK30KKworI2VuZGlmCisKKy8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCisvKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCisjZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKKworLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKKyAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKKyAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgorICovCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBpbnQgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOworICBjaGFyICp0OworICBpbnQgaTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKKyAgICB9CisKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIDI7CisKKyAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCisgICAgeworICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworCSAgbGl0UCArPSAyOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworCSAgbGl0UCArPSAyOworCX0KKyAgICB9CisgICAgIAorICByZXR1cm4gTlVMTDsKK30KKworLyogSGFuZGxlIHRoZSAudXNlcyBwc2V1ZG8tb3AuICBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGp1c3QgYmVmb3JlIGEKKyAgIGNhbGwgaW5zdHJ1Y3Rpb24uICBJdCByZWZlcnMgdG8gYSBsYWJlbCBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKKyAgIGxvYWRzIHRoZSByZWdpc3RlciB3aGljaCB0aGUgY2FsbCB1c2VzLiAgV2UgdXNlIGl0IHRvIGdlbmVyYXRlIGEKKyAgIHNwZWNpYWwgcmVsb2MgZm9yIHRoZSBsaW5rZXIuICAqLworCitzdGF0aWMgdm9pZAorc191c2VzIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGV4cHJlc3Npb25TIGV4OworCisgIGlmICghIHNoX3JlbGF4KQorICAgIGFzX3dhcm4gKF8oIi51c2VzIHBzZXVkby1vcCBzZWVuIHdoZW4gbm90IHJlbGF4aW5nIikpOworCisgIGV4cHJlc3Npb24gKCZleCk7CisKKyAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCisgICAgeworICAgICAgYXNfYmFkIChfKCJiYWQgLnVzZXMgZm9ybWF0IikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZml4X25ld19leHAgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZleCwgMSwgQkZEX1JFTE9DX1NIX1VTRVMpOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisMCitDT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKworI2RlZmluZSBPUFRJT05fUkVMQVggIChPUFRJT05fTURfQkFTRSkKKyNkZWZpbmUgT1BUSU9OX0xJVFRMRSAoT1BUSU9OX01EX0JBU0UgKyAxKQorI2RlZmluZSBPUFRJT05fU01BTEwgKE9QVElPTl9MSVRUTEUgKyAxKQorCisgIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKKyAgeyJsaXR0bGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRX0sCisgIHsic21hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NNQUxMfSwKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKKworaW50CittZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKKyAgICAgaW50IGM7CisgICAgIGNoYXIgKmFyZzsKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIE9QVElPTl9SRUxBWDoKKyAgICAgIHNoX3JlbGF4ID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTElUVExFOgorICAgICAgc2hsID0gMTsKKyAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fU01BTEw6CisgICAgICBzaF9zbWFsbCA9IDE7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK21kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKKyAgICAgRklMRSAqc3RyZWFtOworeworICBmcHJpbnRmKHN0cmVhbSwgXygiXAorU0ggb3B0aW9uczpcblwKKy1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKKy1yZWxheAkJCWFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcblwKKy1zbWFsbAkJCWFsaWduIHNlY3Rpb25zIHRvIDQgYnl0ZSBib3VuZGFyaWVzLCBub3QgMTZcbiIpKTsKK30KKwwKK3ZvaWQKK3RjX05vdXRfZml4X3RvX2NoYXJzICgpCit7CisgIHByaW50ZiAoXygiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIpKTsKKyAgYWJvcnQgKCk7Cit9CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc2hfY291bnRfcmVsb2NzIHRocm91Z2gKKyAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCisKK3N0cnVjdCBzaF9jb3VudF9yZWxvY3MKK3sKKyAgLyogU3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCisgIHN5bWJvbFMgKnN5bTsKKyAgLyogQ291bnQgb2YgcmVsb2NzIGZvdW5kLiAgKi8KKyAgaW50IGNvdW50OworfTsKKworLyogQ291bnQgdGhlIG51bWJlciBvZiBmaXh1cHMgaW4gYSBzZWN0aW9uIHdoaWNoIHJlZmVyIHRvIGEgcGFydGljdWxhcgorICAgc3ltYm9sLiAgV2hlbiB1c2luZyBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIGNhbGxlZCB2aWEKKyAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3NoX2NvdW50X3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlZ1Qgc2VjOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyAqaW5mbyA9IChzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICopIGRhdGE7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOworICBzeW1ib2xTICpzeW07CisgIGZpeFMgKmZpeDsKKworICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7CisgIGlmIChzZWdpbmZvID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHN5bSA9IGluZm8tPnN5bTsKKyAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICBpZiAoZml4LT5meF9hZGRzeSA9PSBzeW0pCisJeworCSAgKytpbmZvLT5jb3VudDsKKwkgIGZpeC0+ZnhfdGNiaXQgPSAxOworCX0KKyAgICB9Cit9CisKKy8qIEhhbmRsZSB0aGUgY291bnQgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFdoZW4gdXNpbmcKKyAgIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitzaF9mcm9iX3NlY3Rpb24gKGFiZmQsIHNlYywgaWdub3JlKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlZ1Qgc2VjOworICAgICBQVFIgaWdub3JlOworeworICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKKyAgZml4UyAqZml4OworCisgIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKKyAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICBzeW1ib2xTICpzeW07CisgICAgICBiZmRfdm1hIHZhbDsKKyAgICAgIGZpeFMgKmZzY2FuOworICAgICAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyBpbmZvOworCisgICAgICBpZiAoZml4LT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX1VTRVMpCisJY29udGludWU7CisKKyAgICAgIC8qIFRoZSBCRkRfUkVMT0NfU0hfVVNFUyByZWxvYyBzaG91bGQgcmVmZXIgdG8gYSBkZWZpbmVkIGxvY2FsCisJIHN5bWJvbCBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KKyAgICAgIHN5bSA9IGZpeC0+ZnhfYWRkc3k7CisgICAgICBpZiAoc3ltID09IE5VTEwKKwkgIHx8IGZpeC0+Znhfc3Vic3kgIT0gTlVMTAorCSAgfHwgZml4LT5meF9hZGRudW1iZXIgIT0gMAorCSAgfHwgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSBzZWMKKyNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE9CSl9DT0ZGKQorCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VYVAorI2VuZGlmCisJICB8fCBTX0lTX0VYVEVSTkFMIChzeW0pKQorCXsKKwkgIGFzX3dhcm5fd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAorCQkJIF8oIi51c2VzIGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGFnYWluLCB0aGlzIHRpbWUgbG9va2luZyBmb3Igb25lCisJIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzIHN5bS4gICovCisgICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltKTsKKyAgICAgIGZvciAoZnNjYW4gPSBzZWdpbmZvLT5maXhfcm9vdDsKKwkgICBmc2NhbiAhPSBOVUxMOworCSAgIGZzY2FuID0gZnNjYW4tPmZ4X25leHQpCisJaWYgKHZhbCA9PSBmc2Nhbi0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZzY2FuLT5meF93aGVyZQorCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9BTElHTgorCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9DT0RFCisJICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0RBVEEKKwkgICAgJiYgZnNjYW4tPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfTEFCRUwpCisJICBicmVhazsKKyAgICAgIGlmIChmc2NhbiA9PSBOVUxMKQorCXsKKwkgIGFzX3dhcm5fd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAorCQkJIF8oImNhbid0IGZpbmQgZml4dXAgcG9pbnRlZCB0byBieSAudXNlcyIpKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKGZzY2FuLT5meF90Y2JpdCkKKwl7CisJICAvKiBXZSd2ZSBhbHJlYWR5IGRvbmUgdGhpcyBvbmUuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBmc2NhbiBzaG91bGQgYWxzbyBiZSBhIGZpeHVwIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lCisJIHNlY3Rpb24uICAqLworICAgICAgc3ltID0gZnNjYW4tPmZ4X2FkZHN5OworICAgICAgaWYgKHN5bSA9PSBOVUxMCisJICB8fCBmc2Nhbi0+Znhfc3Vic3kgIT0gTlVMTAorCSAgfHwgZnNjYW4tPmZ4X2FkZG51bWJlciAhPSAwCisJICB8fCBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHNlYworI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoT0JKX0NPRkYpCisJICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCisjZW5kaWYKKwkgIHx8IFNfSVNfRVhURVJOQUwgKHN5bSkpCisJeworCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCisJCQkgXygiLnVzZXMgdGFyZ2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iKSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIE5vdyB3ZSBsb29rIHRocm91Z2ggYWxsIHRoZSBmaXh1cHMgb2YgYWxsIHRoZSBzZWN0aW9ucywKKwkgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBmaW5kIGEgcmVmZXJlbmNlIHRvIHN5bS4gICovCisgICAgICBpbmZvLnN5bSA9IHN5bTsKKyAgICAgIGluZm8uY291bnQgPSAwOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBzaF9jb3VudF9yZWxvY3MsIChQVFIpICZpbmZvKTsKKyNlbHNlCisgICAgICB7CisJaW50IGlzY2FuOworCisJZm9yIChpc2NhbiA9IFNFR19FMDsgaXNjYW4gPCBTRUdfVU5LTk9XTjsgaXNjYW4rKykKKwkgIHNoX2NvdW50X3JlbG9jcyAoKGJmZCAqKSBOVUxMLCBpc2NhbiwgKFBUUikgJmluZm8pOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChpbmZvLmNvdW50IDwgMSkKKwlhYm9ydCAoKTsKKworICAgICAgLyogR2VuZXJhdGUgYSBCRkRfUkVMT0NfU0hfQ09VTlQgZml4dXAgYXQgdGhlIGxvY2F0aW9uIG9mIHN5bS4KKwkgV2UgaGF2ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSB2YWx1ZSBvZiBzeW0gdG8gaW5jbHVkZSB0aGUKKwkgZnJhZ21lbnQgYWRkcmVzcywgc28gd2UgdW5kbyB0aGF0IGFkanVzdG1lbnQgaGVyZS4gICovCisgICAgICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOworICAgICAgZml4X25ldyAoc3ltLT5zeV9mcmFnLCBTX0dFVF9WQUxVRSAoc3ltKSAtIHN5bS0+c3lfZnJhZy0+ZnJfYWRkcmVzcywKKwkgICAgICAgNCwgJmFic19zeW1ib2wsIGluZm8uY291bnQsIDAsIEJGRF9SRUxPQ19TSF9DT1VOVCk7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIGNvbXBsZXRlZCwKKyAgIGJ1dCBiZWZvcmUgdGhlIHJlbG9jcyBvciBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuIG91dC4KKyAgIElmIHdlIGhhdmUgc2VlbiBhbnkgLnVzZXMgcHNldWRvLW9wcywgdGhleSBwb2ludCB0byBhbiBpbnN0cnVjdGlvbgorICAgd2hpY2ggbG9hZHMgYSByZWdpc3RlciB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uICBXZSBsb29rCisgICB0aHJvdWdoIHRoZSBmaXh1cHMgdG8gZmluZCB3aGVyZSB0aGUgZnVuY3Rpb24gYWRkcmVzcyBpcyBiZWluZworICAgbG9hZGVkIGZyb20uICBXZSB0aGVuIGdlbmVyYXRlIGEgQ09VTlQgcmVsb2MgZ2l2aW5nIHRoZSBudW1iZXIgb2YKKyAgIHRpbWVzIHRoYXQgZnVuY3Rpb24gYWRkcmVzcyBpcyByZWZlcnJlZCB0by4gIFRoZSBsaW5rZXIgdXNlcyB0aGlzCisgICBpbmZvcm1hdGlvbiB3aGVuIGRvaW5nIHJlbGF4aW5nLCB0byBkZWNpZGUgd2hlbiBpdCBjYW4gZWxpbWluYXRlCisgICB0aGUgc3RvcmVkIGZ1bmN0aW9uIGFkZHJlc3MgZW50aXJlbHkuICAqLworCit2b2lkCitzaF9mcm9iX2ZpbGUgKCkKK3sKKyAgaWYgKCEgc2hfcmVsYXgpCisgICAgcmV0dXJuOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgc2hfZnJvYl9zZWN0aW9uLCAoUFRSKSBOVUxMKTsKKyNlbHNlCisgIHsKKyAgICBpbnQgaXNlZzsKKworICAgIGZvciAoaXNlZyA9IFNFR19FMDsgaXNlZyA8IFNFR19VTktOT1dOOyBpc2VnKyspCisgICAgICBzaF9mcm9iX3NlY3Rpb24gKChiZmQgKikgTlVMTCwgaXNlZywgKFBUUikgTlVMTCk7CisgIH0KKyNlbmRpZgorfQorCisvKiBDYWxsZWQgYWZ0ZXIgcmVsYXhpbmcuICBTZXQgdGhlIGNvcnJlY3Qgc2l6ZXMgb2YgdGhlIGZyYWdtZW50cywgYW5kCisgICBjcmVhdGUgcmVsb2NzIHNvIHRoYXQgbWRfYXBwbHlfZml4IHdpbGwgZmlsbCBpbiB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLworCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICBiZmQgKmhlYWRlcnM7CisjZWxzZQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKKyNlbmRpZgorICAgICBzZWdUIHNlZzsKKyAgICAgZnJhZ1MgKmZyYWdQOworeworICBpbnQgZG9uZXJlbGF4ID0gMDsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDgpOgorICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EOCk6CisgICAgICBzdWJzZWdfY2hhbmdlIChzZWcsIDApOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCisJICAgICAgIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyKTsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik6CisgICAgICBzdWJzZWdfY2hhbmdlIChzZWcsIDApOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCisJICAgICAgIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMik7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpOgorICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6CisgICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbCA9PSBOVUxMKQorCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCisJCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcyk7CisgICAgICBlbHNlIGlmIChTX0lTX0RFRklORUQgKGZyYWdQLT5mcl9zeW1ib2wpKQorCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byBkZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCisJCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQorCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7CisgICAgICBlbHNlCisJYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIpLAorCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MsCQkKKwkJU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkpOworCisjaWYgMAkJCQkvKiBUaGlzIGNvZGUgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgcG9vciBjb2RlIGFuZCB0aGUgY29tcGlsZXIKKwkJCQkgICBzaG91bGQgbmV2ZXIgcHJvZHVjZSBhIHNlcXVlbmNlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgdXNlZC4gICovCisKKyAgICAgIC8qIEEganVtcCB3b250IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2ggbG9va3MgbGlrZQorCSBicmEgZm9vCisJIG1vdi53IEAoMCwgUEMpLCByMTQKKwkgLmxvbmcgZGlzcAorCSBmb286IGJyYSBAcjE0CisJICovCisgICAgICBpbnQgdCA9IGJ1ZmZlclswXSAmIDB4MTA7CisKKyAgICAgIGJ1ZmZlcltoaWdoYnl0ZV0gPSAweGEwOwkvKiBicmFuY2ggb3ZlciBtb3ZlIGFuZCBkaXNwICovCisgICAgICBidWZmZXJbbG93Ynl0ZV0gPSAzOworICAgICAgYnVmZmVyW2hpZ2hieXRlKzJdID0gMHhkMCB8IEpSRUc7CS8qIEJ1aWxkIG1vdiBpbnNuICovCisgICAgICBidWZmZXJbbG93Ynl0ZSsyXSA9IDB4MDA7CisKKyAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQganVtcCBkaXNwICovCisgICAgICBidWZmZXJbbG93Ynl0ZSs0XSA9IDA7CisgICAgICBidWZmZXJbaGlnaGJ5dGUrNl0gPSAwOworICAgICAgYnVmZmVyW2xvd2J5dGUrNl0gPSAwOworCisgICAgICBidWZmZXJbaGlnaGJ5dGUrOF0gPSAweDQwIHwgSlJFRzsJLyogQnVpbGQgam1wIEBKUkVHICovCisgICAgICBidWZmZXJbbG93Ynl0ZSs4XSA9IHQgPyAweGIgOiAweDJiOworCisgICAgICBidWZmZXJbaGlnaGJ5dGUrMTBdID0gMHgyMDsgLyogYnVpbGQgbm9wICovCisgICAgICBidWZmZXJbbG93Ynl0ZSsxMF0gPSAweDBiOworCisgICAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCisgICAgICBmaXhfbmV3IChmcmFnUCwKKwkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIDQsCisJICAgICAgIDQsCisJICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCisJICAgICAgIDAsCisJICAgICAgIEJGRF9SRUxPQ18zMik7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IFVOQ09ORDMyX0xFTkdUSDsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZG9uZXJlbGF4ID0gMTsKKyNlbmRpZgorCisgICAgICBicmVhazsKKworICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMTIpOgorICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpOgorICAgICAgLyogQSBiY29uZCB3b24ndCBmaXQsIHNvIHR1cm4gaXQgaW50byBhIGIhY29uZDsgYnJhIGRpc3A7IG5vcCAqLworICAgICAgLyogSSBmb3VuZCB0aGF0IGEgcmVsYXggZmFpbHVyZSBmb3IgZ2NjLmMtdG9ydHVyZS9leGVjdXRlLzkzMDYyOC0xLmMKKwkgd2FzIGR1ZSB0byBnYXMgaW5jb3JyZWN0bHkgcmVsYXhpbmcgYW4gb3V0LW9mLXJhbmdlIGNvbmRpdGlvbmFsCisJIGJyYW5jaCB3aXRoIGRlbGF5IHNsb3QuICBJdCB0dXJuZWQ6CisgICAgICAgICAgICAgICAgICAgICBiZi5zICAgIEw2ICAgICAgICAgICAgICAoc2xvdCBtb3YubCAgIHIxMixAKDQ0LHIwKSkKKyAgICAgICAgIGludG86CisgICAKKzJjOiAgOGYgMDEgYTAgOGIgICAgIGJmLnMgICAgMzIgPF9tYWluKzMyPiAgIChzbG90IGJyYSAgICAgICBMNikKKzMwOiAgMDAgMDkgICAgICAgICAgIG5vcAorMzI6ICAxMCBjYiAgICAgICAgICAgbW92LmwgICByMTIsQCg0NCxyMCkKKyAgICAgICAgIFRoZXJlZm9yZSwgYnJhbmNoZXMgd2l0aCBkZWxheSBzbG90cyBoYXZlIHRvIGJlIGhhbmRsZWQKKwkgZGlmZmVyZW50bHkgZnJvbSBvbmVzIHdpdGhvdXQgZGVsYXkgc2xvdHMuICAqLworICAgICAgeworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9CisJICAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKKwlpbnQgaGlnaGJ5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDAgOiAxOworCWludCBsb3dieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAxIDogMDsKKwlpbnQgZGVsYXkgPSBmcmFnUC0+ZnJfc3VidHlwZSA9PSBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMik7CisKKwkvKiBUb2dnbGUgdGhlIHRydWUvZmFsc2UgYml0IG9mIHRoZSBiY29uZC4gICovCisJYnVmZmVyW2hpZ2hieXRlXSBePSAweDI7CisKKwkvKiBJZiB0aGlzIGlzIGEgZGFsYXllZCBicmFuY2gsIHdlIG1heSBub3QgcHV0IHRoZSB0aGUgYnJhIGluIHRoZQorCSAgIHNsb3QuICBTbyB3ZSBjaGFuZ2UgaXQgdG8gYSBub24tZGVsYXllZCBicmFuY2gsIGxpa2UgdGhhdDoKKwkgICBiISBjb25kIHNsb3RfbGFiZWw7IGJyYSBkaXNwOyBzbG90X2xhYmVsOiBzbG90X2luc24KKwkgICA/Pz8gV2Ugc2hvdWxkIHRyeSBpZiBzd2FwcGluZyB0aGUgY29uZGl0aW9uYWwgYnJhbmNoIGFuZAorCSAgIGl0cyBkZWxheS1zbG90IGluc24gYWxyZWFkeSBtYWtlcyB0aGUgYnJhbmNoIHJlYWNoLiAgKi8KKworCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiB0byBzaXggLyBmb3VyIGJ5dGVzIGZhcnRoZXIgb24uICAqLworCXN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7CisJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCQkgc2VjdGlvbl9zeW1ib2wgKHNlZyksCisjZWxzZQorCQkgc2VnX2luZm8gKHNlZyktPmRvdCwKKyNlbmRpZgorCQkgZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4ICsgKGRlbGF5ID8gNCA6IDYpLAorCQkgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIpOworCisJLyogU2V0IHVwIGEganVtcCBpbnN0cnVjdGlvbi4gICovCisJYnVmZmVyW2hpZ2hieXRlICsgMl0gPSAweGEwOworCWJ1ZmZlcltsb3dieXRlICsgMl0gPSAwOworCWZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMik7CisKKwlpZiAoZGVsYXkpCisJICB7CisJICAgIGJ1ZmZlcltoaWdoYnl0ZV0gJj0gfjB4NDsgLyogUmVtb3ZlcyBkZWxheSBzbG90IGZyb20gYnJhbmNoLiAgKi8KKwkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgLyogRmlsbCBpbiBhIE5PUCBpbnN0cnVjdGlvbi4gICovCisJICAgIGJ1ZmZlcltoaWdoYnl0ZSArIDRdID0gMHgwOworCSAgICBidWZmZXJbbG93Ynl0ZSArIDRdID0gMHg5OworCisJICAgIGZyYWdQLT5mcl9maXggKz0gNjsKKwkgIH0KKwlmcmFnUC0+ZnJfdmFyID0gMDsKKwlkb25lcmVsYXggPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDMyKToKKyAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDMyKToKKyAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKKyAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfV09SRF9ESVNQKToKKyAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sID09IE5VTEwpCisJYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyA4LWJpdCBmaWVsZCIpLCAKKwkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKKyAgICAgIGVsc2UgaWYgKFNfSVNfREVGSU5FRCAoZnJhZ1AtPmZyX3N5bWJvbCkpCisJYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiKSwKKwkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCisJCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgOC1iaXQgZmllbGQgIiksCisJCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQorCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7CisKKyNpZiAwCQkJCS8qIFRoaXMgY29kZSB3b3JrcywgYnV0IGdlbmVyYXRlcyBwb29yIGNvZGUsIGFuZCB0aGUgY29tcGlsZXIKKwkJCQkgICBzaG91bGQgbmV2ZXIgcHJvZHVjZSBhIHNlcXVlbmNlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgdXNlZC4gICovCisKKyAgICAgIC8qIEEgYmNvbmQgd29uJ3QgZml0IGFuZCBpdCB3b24ndCBnbyBpbnRvIGEgMTIgYml0CisJIGRpc3BsYWNlbWVudCBlaXRoZXIsIHRoZSBjb2RlIHNlcXVlbmNlIGxvb2tzIGxpa2U6CisJIGIhY29uZCBmb29wCisJIG1vdi53IEAobiwgUEMpLCByMTQKKwkgam1wICBAcjE0CisJIG5vcAorCSAubG9uZyB3aGVyZQorCSBmb29wOgorCSAqLworCisgICAgICBidWZmZXJbMF0gXj0gMHgyOwkJLyogVG9nZ2xlIFQvRiBiaXQgKi8KKyNkZWZpbmUgSlJFRyAxNAorICAgICAgYnVmZmVyWzFdID0gNTsJCS8qIGJyYW5jaCBvdmVyIG1vdiwganVtcCwgbm9wIGFuZCBwdHIgKi8KKyAgICAgIGJ1ZmZlclsyXSA9IDB4ZDAgfCBKUkVHOwkvKiBCdWlsZCBtb3YgaW5zbiAqLworICAgICAgYnVmZmVyWzNdID0gMHgyOworICAgICAgYnVmZmVyWzRdID0gMHg0MCB8IEpSRUc7CS8qIEJ1aWxkIGptcCBASlJFRyAqLworICAgICAgYnVmZmVyWzVdID0gMHgwYjsKKyAgICAgIGJ1ZmZlcls2XSA9IDB4MjA7CQkvKiBidWlsZCBub3AgKi8KKyAgICAgIGJ1ZmZlcls3XSA9IDB4MGI7CisgICAgICBidWZmZXJbOF0gPSAwOwkJLyogc3BhY2UgZm9yIDMyIGJpdCBqdW1wIGRpc3AgKi8KKyAgICAgIGJ1ZmZlcls5XSA9IDA7CisgICAgICBidWZmZXJbMTBdID0gMDsKKyAgICAgIGJ1ZmZlclsxMV0gPSAwOworICAgICAgYnVmZmVyWzEyXSA9IDA7CisgICAgICBidWZmZXJbMTNdID0gMDsKKyAgICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KKyAgICAgIGZpeF9uZXcgKGZyYWdQLAorCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgOCwKKwkgICAgICAgNCwKKwkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKKwkgICAgICAgMCwKKwkgICAgICAgQkZEX1JFTE9DXzMyKTsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gQ09ORDMyX0xFTkdUSDsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgZG9uZXJlbGF4ID0gMTsKKyNlbmRpZgorCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKGRvbmVyZWxheCAmJiAhc2hfcmVsYXgpCisgICAgYXNfd2Fybl93aGVyZSAoZnJhZ1AtPmZyX2ZpbGUsIGZyYWdQLT5mcl9saW5lLAorCQkgICBfKCJvdmVyZmxvdyBpbiBicmFuY2ggdG8gJXM7IGNvbnZlcnRlZCBpbnRvIGxvbmdlciBpbnN0cnVjdGlvbiBzZXF1ZW5jZSIpLAorCQkgICAoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMCisJCSAgICA/IFNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpCisJCSAgICA6ICIiKSk7Cit9CisKK3ZhbHVlVAorREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAorICAgICAgIHNlZ1Qgc2VnIEFORAorICAgICAgIHZhbHVlVCBzaXplKQoreworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyNpZmRlZiBPQkpfRUxGCisgIHJldHVybiBzaXplOworI2Vsc2UgLyogISBPQkpfRUxGICovCisgIHJldHVybiAoKHNpemUgKyAoMSA8PCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZykpIC0gMSkKKwkgICYgKC0xIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkpOworI2VuZGlmIC8qICEgT0JKX0VMRiAqLworI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCisgIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpCisJICAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7CisjZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCit9CisKKy8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGlzIHNldCBieSBzX3VhY29ucyB0byB0ZWxsIHNoX2NvbnNfYWxpZ24gdGhhdAorICAgdGhlIGV4cGVzc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuICAqLworCitzdGF0aWMgaW50IHNoX25vX2FsaWduX2NvbnMgPSAwOworCisvKiBUaGlzIGhhbmRsZXMgdGhlIHVuYWxpZ25lZCBzcGFjZSBhbGxvY2F0aW9uIHBzZXVkby1vcHMsIHN1Y2ggYXMKKyAgIC51YXdvcmQuICAudWF3b3JkIGlzIGp1c3QgbGlrZSAud29yZCwgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBuZWVkCisgICB0byBiZSBhbGlnbmVkLiAgKi8KKworc3RhdGljIHZvaWQKK3NfdWFjb25zIChieXRlcykKKyAgICAgaW50IGJ5dGVzOworeworICAvKiBUZWxsIHNoX2NvbnNfYWxpZ24gbm90IHRvIGFsaWduIHRoaXMgdmFsdWUuICAqLworICBzaF9ub19hbGlnbl9jb25zID0gMTsKKyAgY29ucyAoYnl0ZXMpOworfQorCisvKiBJZiBhIC53b3JkLCBldC4gYWwuLCBwc2V1ZC1vcCBpcyBzZWVuLCB3YXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QKKyAgIGFsaWduZWQgY29ycmVjdGx5LiAgTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIHdhcm5pbmdzIHRvIGJlIGlzc3VlZAorICAgd2hlbiBhc3NlbWJsaW5nIGluaXRpYWxpemVkIHN0cnVjdHVyZWQgd2hpY2ggd2VyZSBkZWNsYXJlZCB3aXRoIHRoZQorICAgcGFja2VkIGF0dHJpYnV0ZS4gIEZJWE1FOiBQZXJoYXBzIHdlIHNob3VsZCByZXF1aXJlIGFuIG9wdGlvbiB0bworICAgZW5hYmxlIHRoaXMgd2FybmluZz8gICovCisKK3ZvaWQKK3NoX2NvbnNfYWxpZ24gKG5ieXRlcykKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgaW50IG5hbGlnbjsKKyAgY2hhciAqcDsKKworICBpZiAoc2hfbm9fYWxpZ25fY29ucykKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGFuIHVuYWxpZ25lZCBwc2V1ZG8tb3AuICAqLworICAgICAgc2hfbm9fYWxpZ25fY29ucyA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG5hbGlnbiA9IDA7CisgIHdoaWxlICgobmJ5dGVzICYgMSkgPT0gMCkKKyAgICB7CisgICAgICArK25hbGlnbjsKKyAgICAgIG5ieXRlcyA+Pj0gMTsKKyAgICB9CisKKyAgaWYgKG5hbGlnbiA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHsKKyAgICAgIGlmICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICYgKCgxIDw8IG5hbGlnbikgLSAxKSkgIT0gMCkKKwlhc193YXJuIChfKCJtaXNhbGlnbmVkIGRhdGEiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKKwkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIG5hbGlnbiwgKGNoYXIgKikgTlVMTCk7CisKKyAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbmFsaWduKTsKK30KKworLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBvdXRwdXQgYSByZWxvYyBmb3IgYW55IC5hbGlnbiBkaXJlY3RpdmUKKyAgIHRoYXQgcmVxdWVzdHMgYWxpZ25tZW50IHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5IG9yIGxhcmdlci4gIFRoaXMgaXMKKyAgIGFsc28gd2hlcmUgd2UgY2hlY2sgZm9yIG1pc2FsaWduZWQgZGF0YS4gICovCisKK3ZvaWQKK3NoX2hhbmRsZV9hbGlnbiAoZnJhZykKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIGlmIChzaF9yZWxheAorICAgICAgJiYgZnJhZy0+ZnJfdHlwZSA9PSByc19hbGlnbgorICAgICAgJiYgZnJhZy0+ZnJfYWRkcmVzcyArIGZyYWctPmZyX2ZpeCA+IDAKKyAgICAgICYmIGZyYWctPmZyX29mZnNldCA+IDEKKyAgICAgICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCisgICAgZml4X25ldyAoZnJhZywgZnJhZy0+ZnJfZml4LCAyLCAmYWJzX3N5bWJvbCwgZnJhZy0+ZnJfb2Zmc2V0LCAwLAorCSAgICAgQkZEX1JFTE9DX1NIX0FMSUdOKTsKKworICBpZiAoZnJhZy0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlCisgICAgICAmJiBmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2ZpeCAhPSAwKQorICAgIGFzX3dhcm5fd2hlcmUgKGZyYWctPmZyX2ZpbGUsIGZyYWctPmZyX2xpbmUsIF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKK30KKworLyogVGhpcyBtYWNybyBkZWNpZGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHJlbG9jIGlzIGFuIGVudHJ5IGluIGEKKyAgIHN3aXRjaCB0YWJsZS4gIEl0IGlzIHVzZWQgd2hlbiByZWxheGluZywgYmVjYXVzZSB0aGUgbGlua2VyIG5lZWRzCisgICB0byBrbm93IGFib3V0IGFsbCBzdWNoIGVudHJpZXMgc28gdGhhdCBpdCBjYW4gYWRqdXN0IHRoZW0gaWYKKyAgIG5lY2Vzc2FyeS4gICovCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjZGVmaW5lIFNXSVRDSF9UQUJMRV9DT05TKGZpeCkgKDApCisjZWxzZQorI2RlZmluZSBTV0lUQ0hfVEFCTEVfQ09OUyhmaXgpCQkJCVwKKyAgKChmaXgpLT5meF9yX3R5cGUgPT0gMAkJCQlcCisgICAmJiAoKGZpeCktPmZ4X3NpemUgPT0gMgkJCQlcCisgICAgICAgfHwgKGZpeCktPmZ4X3NpemUgPT0gMQkJCQlcCisgICAgICAgfHwgKGZpeCktPmZ4X3NpemUgPT0gNCkpCisjZW5kaWYKKworI2RlZmluZSBTV0lUQ0hfVEFCTEUoZml4KQkJCQlcCisgICgoZml4KS0+ZnhfYWRkc3kgIT0gTlVMTAkJCQlcCisgICAmJiAoZml4KS0+Znhfc3Vic3kgIT0gTlVMTAkJCQlcCisgICAmJiBTX0dFVF9TRUdNRU5UICgoZml4KS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbglcCisgICAmJiBTX0dFVF9TRUdNRU5UICgoZml4KS0+Znhfc3Vic3kpID09IHRleHRfc2VjdGlvbglcCisgICAmJiAoKGZpeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIJCQlcCisgICAgICAgfHwgKGZpeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYJCVwKKyAgICAgICB8fCAoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184CQlcCisgICAgICAgfHwgU1dJVENIX1RBQkxFX0NPTlMgKGZpeCkpKQorCisvKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCisgICByZWxheGluZy4gICovCisKK2ludAorc2hfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQorICAgICBmaXhTICpmaXg7Cit7CisKKyAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoISBzaF9yZWxheCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gKGZpeC0+ZnhfcGNyZWwKKwkgIHx8IFNXSVRDSF9UQUJMRSAoZml4KQorCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPVU5UCisJICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04KKwkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT0RFCisJICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQorCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0xBQkVMKTsKK30KKworI2lmZGVmIE9CSl9FTEYKK2Jvb2xlYW4KK3NoX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQorICAgZml4UyAqZml4UDsKK3sKKworICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgCisgIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KKyAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorI2VuZGlmCisKKy8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKK2ludAorbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQorICAgICBmaXhTICpmaXhQOworICAgICB2YWx1ZVQgKnZhbHA7CisjZWxzZQordm9pZAorbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCisgICAgIGZpeFMgKmZpeFA7CisgICAgIGxvbmcgdmFsOworI2VuZGlmCit7CisgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKKyAgaW50IGxvd2J5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDEgOiAwOworICBpbnQgaGlnaGJ5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDAgOiAxOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgbG9uZyB2YWwgPSAqdmFscDsKKyNlbmRpZgorICBsb25nIG1heCwgbWluOworICBpbnQgc2hpZnQ7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIC8qIGFkanVzdF9yZWxvY19zeW1zIHdvbid0IGNvbnZlcnQgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wKKyAgICAgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLCBidXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsCisgICAgIHNjcmV3IHVwIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc28gd2UgaGF2ZSB0byBhZGp1c3QgdmFsIGhlcmUKKyAgICAgdG8gYXZvaWQgdGhlIHNjcmV3IHVwIGxhdGVyLiAgKi8KKyAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKKyAgICAgICYmIFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHZhbCAtPSBTX0dFVF9WQUxVRSAgKGZpeFAtPmZ4X2FkZHN5KTsKKyNlbmRpZgorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChmaXhQLT5meF9zaXplID09IDIpCisJZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzE2OworICAgICAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSA0KQorCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMjsKKyAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKKwlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfODsKKyAgICAgIGVsc2UKKwlhYm9ydCAoKTsKKyAgICB9CisjZW5kaWYKKworICBtYXggPSBtaW4gPSAwOworICBzaGlmdCA9IDA7CisgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQorICAgIHsKKyAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00OgorICAgICAgbWF4ID0gMHhmOworICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAodmFsICYgMHhmKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfU0hfSU1NNEJZMjoKKyAgICAgIG1heCA9IDB4ZjsKKyAgICAgIHNoaWZ0ID0gMTsKKyAgICAgICpidWYgPSAoKmJ1ZiAmIDB4ZjApIHwgKCh2YWwgPj4gMSkgJiAweGYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00Qlk0OgorICAgICAgbWF4ID0gMHhmOworICAgICAgc2hpZnQgPSAyOworICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAoKHZhbCA+PiAyKSAmIDB4Zik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTThCWTI6CisgICAgICBtYXggPSAweGZmOworICAgICAgc2hpZnQgPSAxOworICAgICAgKmJ1ZiA9IHZhbCA+PiAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU04Qlk0OgorICAgICAgbWF4ID0gMHhmZjsKKyAgICAgIHNoaWZ0ID0gMjsKKyAgICAgICpidWYgPSB2YWwgPj4gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfODoKKyAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU04OgorICAgICAgLyogU29tZXRpbWVzIHRoZSA4IGJpdCB2YWx1ZSBpcyBzaWduIGV4dGVuZGVkIChlLmcuLCBhZGQpIGFuZAorICAgICAgICAgc29tZXRpbWVzIGl0IGlzIG5vdCAoZS5nLiwgYW5kKS4gIFdlIHBlcm1pdCBhbnkgOCBiaXQgdmFsdWUuCisgICAgICAgICBOb3RlIHRoYXQgYWRkaW5nIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG1heSBpbnZhbGlkYXRlCisgICAgICAgICByZWFzb25hYmxlIGxvb2tpbmcgYXNzZW1ibHkgY29kZSwgc3VjaCBhcyBgYGFuZCAtMHgxLHIwJycuICAqLworICAgICAgbWF4ID0gMHhmZjsKKyAgICAgIG1pbiA9IC0gMHhmZjsKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgorICAgICAgLyogVGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZSBQQyBhcmUgY2xlYXJlZCBiZWZvcmUgdGhlCisgICAgICAgICBkaXNwbGFjZW1lbnQgaXMgYWRkZWQgaW4uICBXZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgICBpcyBvbiBhIDQgYnl0ZSBib3VuZGF5LiAgSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhbHNvIG9uIGEgNAorICAgICAgICAgYnl0ZSBib3VuZGFyeSwgdGhlbiB3ZSB3YW50CisJICAgKHRhcmdldCAtIGhlcmUpIC8gNAorCSBhbmQgdGFyZ2V0IC0gaGVyZSBpcyBhIG11bHRpcGxlIG9mIDQuCisJIE90aGVyd2lzZSwgd2UgYXJlIG9uIGEgMiBieXRlIGJvdW5kYXJ5LCBhbmQgd2Ugd2FudAorCSAgICh0YXJnZXQgLSAoaGVyZSAtIDIpKSAvIDQKKwkgYW5kIHRhcmdldCAtIGhlcmUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gIENvbXB1dGluZworCSAgICh0YXJnZXQgLSAoaGVyZSAtIDIpKSAvIDQgPT0gKHRhcmdldCAtIGhlcmUgKyAyKSAvIDQKKwkgd29ya3MgZm9yIGJvdGggY2FzZXMsIHNpbmNlIGluIHRoZSBmaXJzdCBjYXNlIHRoZSBhZGRpdGlvbiBvZgorCSAyIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgZGl2aXNpb24uICB0YXJnZXQgLSBoZXJlIGlzIGluIHRoZQorCSB2YXJpYWJsZSB2YWwuICAqLworICAgICAgdmFsID0gKHZhbCArIDIpIC8gNDsKKyAgICAgIGlmICh2YWwgJiB+MHhmZikKKwlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7CisgICAgICBidWZbbG93Ynl0ZV0gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMjoKKyAgICAgIHZhbCAvPSAyOworICAgICAgaWYgKHZhbCAmIH4weGZmKQorCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygicGNyZWwgdG9vIGZhciIpKTsKKyAgICAgIGJ1Zltsb3dieXRlXSA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQOEJZMjoKKyAgICAgIHZhbCAvPSAyOworICAgICAgaWYgKHZhbCA8IC0weDgwIHx8IHZhbCA+IDB4N2YpCisJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOworICAgICAgYnVmW2xvd2J5dGVdID0gdmFsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMjoKKyAgICAgIHZhbCAvPSAyOworICAgICAgaWYgKHZhbCA8IC0weDgwMCB8fCB2YWwgPj0gMHg3ZmYpCisJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOworICAgICAgYnVmW2xvd2J5dGVdID0gdmFsICYgMHhmZjsKKyAgICAgIGJ1ZltoaWdoYnl0ZV0gfD0gKHZhbCA+PiA4KSAmIDB4ZjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikgCisJeworCSAgKmJ1ZisrID0gdmFsID4+IDA7CisJICAqYnVmKysgPSB2YWwgPj4gODsKKwkgICpidWYrKyA9IHZhbCA+PiAxNjsKKwkgICpidWYrKyA9IHZhbCA+PiAyNDsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgICpidWYrKyA9IHZhbCA+PiAyNDsKKwkgICpidWYrKyA9IHZhbCA+PiAxNjsKKwkgICpidWYrKyA9IHZhbCA+PiA4OworCSAgKmJ1ZisrID0gdmFsID4+IDA7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGRF9SRUxPQ18xNjoKKyAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorCXsKKwkgICpidWYrKyA9IHZhbCA+PiAwOworCSAgKmJ1ZisrID0gdmFsID4+IDg7CisJfSAKKyAgICAgIGVsc2UgCisJeworCSAgKmJ1ZisrID0gdmFsID4+IDg7CisJICAqYnVmKysgPSB2YWwgPj4gMDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQkZEX1JFTE9DX1NIX1VTRVM6CisgICAgICAvKiBQYXNzIHRoZSB2YWx1ZSBpbnRvIHNoX2NvZmZfcmVsb2NfbWFuZ2xlLiAgKi8KKyAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfU0hfQ09VTlQ6CisgICAgY2FzZSBCRkRfUkVMT0NfU0hfQUxJR046CisgICAgY2FzZSBCRkRfUkVMT0NfU0hfQ09ERToKKyAgICBjYXNlIEJGRF9SRUxPQ19TSF9EQVRBOgorICAgIGNhc2UgQkZEX1JFTE9DX1NIX0xBQkVMOgorICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6CisgICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgorICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7CisgICAgICByZXR1cm47CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGlmIChzaGlmdCAhPSAwKQorICAgIHsKKyAgICAgIGlmICgodmFsICYgKCgxIDw8IHNoaWZ0KSAtIDEpKSAhPSAwKQorCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygibWlzYWxpZ25lZCBvZmZzZXQiKSk7CisgICAgICBpZiAodmFsID49IDApCisJdmFsID4+PSBzaGlmdDsKKyAgICAgIGVsc2UKKwl2YWwgPSAoKHZhbCA+PiBzaGlmdCkKKwkgICAgICAgfCAoKGxvbmcpIC0xICYgfiAoKGxvbmcpIC0xID4+IHNoaWZ0KSkpOworICAgIH0KKyAgaWYgKG1heCAhPSAwICYmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSkKKyAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oIm9mZnNldCBvdXQgb2YgcmFuZ2UiKSk7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8qIENhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24uICBSZXR1cm4gdGhlIGxlbmd0aAorICAgYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbi4gICovCisKK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Cit7CisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX0RJU1ApOgorICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KKyAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik7CisJICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKV0ucmx4X2xlbmd0aDsKKwl9CisgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCisJeworCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpOworCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMildLnJseF9sZW5ndGg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7CisJICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKV0ucmx4X2xlbmd0aDsKKwkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpXS5ybHhfbGVuZ3RoOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKKyAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfRElTUCk6CisgICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLworICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKKwkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKKwl7CisJICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7CisJICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCisJICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKKwkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7CisJfQorICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKKwl7CisJICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7CisJICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLworCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOworCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGg7CisJICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOworCSAgLyogV2Uga25vdyB0aGUgYWJzIHZhbHVlICovCisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKKwkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7CisJfQorCisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBmcmFnUC0+ZnJfdmFyOworfQorCisvKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKwordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQorICAgICBjaGFyICpwdHI7CisgICAgIHZhbHVlVCB1c2U7CisgICAgIGludCBuYnl0ZXM7Cit7CisgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQorICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOworICBlbHNlCisgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Cit9CisKK2xvbmcKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgMjsKK30KKworI2lmZGVmIE9CSl9DT0ZGCisKK2ludAordGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOworfQorCisjZW5kaWYgLyogT0JKX0NPRkYgKi8KKworLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLiAgKi8KKworaW50CitzaF9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCisgICAgIGludCBuOworICAgICBjb25zdCBjaGFyICpmaWxsOworICAgICBpbnQgbGVuOworICAgICBpbnQgbWF4OworeworICBpZiAoZmlsbCA9PSBOVUxMCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgJiYgKG5vd19zZWctPmZsYWdzICYgU0VDX0NPREUpICE9IDAKKyNlbHNlCisgICAgICAmJiBub3dfc2VnICE9IGRhdGFfc2VjdGlvbgorICAgICAgJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbgorI2VuZGlmCisgICAgICAmJiBuID4gMSkKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiaWdfbm9wX3BhdHRlcm5bXSA9IHsgMHgwMCwgMHgwOSB9OworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0dGxlX25vcF9wYXR0ZXJuW10gPSB7IDB4MDksIDB4MDAgfTsKKworICAgICAgLyogRmlyc3QgYWxpZ24gdG8gYSAyIGJ5dGUgYm91bmRhcnksIGluIGNhc2UgdGhlcmUgaXMgYW4gb2RkCisgICAgICAgICAuYnl0ZS4gICovCisgICAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKKyAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKwlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGJpZ19ub3BfcGF0dGVybiwgc2l6ZW9mIGJpZ19ub3BfcGF0dGVybiwgbWF4KTsKKyAgICAgIGVsc2UKKwlmcmFnX2FsaWduX3BhdHRlcm4gKG4sIGxpdHRsZV9ub3BfcGF0dGVybiwgc2l6ZW9mIGxpdHRsZV9ub3BfcGF0dGVybiwKKwkJCSAgICBtYXgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyNpZmRlZiBPQkpfQ09GRgorCisvKiBNYXAgQkZEIHJlbG9jcyB0byBTSCBDT0ZGIHJlbG9jcy4gICovCisKK3N0cnVjdCByZWxvY19tYXAKK3sKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvYzsKKyAgaW50IHNoX3JlbG9jOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgY29mZl9yZWxvY19tYXBbXSA9Cit7CisgIHsgQkZEX1JFTE9DXzMyLCBSX1NIX0lNTTMyIH0sCisgIHsgQkZEX1JFTE9DXzE2LCBSX1NIX0lNTTE2IH0sCisgIHsgQkZEX1JFTE9DXzgsIFJfU0hfSU1NOCB9LAorICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyLCBSX1NIX1BDRElTUDhCWTIgfSwKKyAgeyBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTIsIFJfU0hfUENESVNQIH0sCisgIHsgQkZEX1JFTE9DX1NIX0lNTTQsIFJfU0hfSU1NNCB9LAorICB7IEJGRF9SRUxPQ19TSF9JTU00QlkyLCBSX1NIX0lNTTRCWTIgfSwKKyAgeyBCRkRfUkVMT0NfU0hfSU1NNEJZNCwgUl9TSF9JTU00Qlk0IH0sCisgIHsgQkZEX1JFTE9DX1NIX0lNTTgsIFJfU0hfSU1NOCB9LAorICB7IEJGRF9SRUxPQ19TSF9JTU04QlkyLCBSX1NIX0lNTThCWTIgfSwKKyAgeyBCRkRfUkVMT0NfU0hfSU1NOEJZNCwgUl9TSF9JTU04Qlk0IH0sCisgIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwgUl9TSF9QQ1JFTElNTThCWTIgfSwKKyAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX1BDUkVMSU1NOEJZNCB9LAorICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NIX1NXSVRDSDggfSwKKyAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMTYgfSwKKyAgeyBCRkRfUkVMT0NfU0hfU1dJVENIMzIsIFJfU0hfU1dJVENIMzIgfSwKKyAgeyBCRkRfUkVMT0NfU0hfVVNFUywgUl9TSF9VU0VTIH0sCisgIHsgQkZEX1JFTE9DX1NIX0NPVU5ULCBSX1NIX0NPVU5UIH0sCisgIHsgQkZEX1JFTE9DX1NIX0FMSUdOLCBSX1NIX0FMSUdOIH0sCisgIHsgQkZEX1JFTE9DX1NIX0NPREUsIFJfU0hfQ09ERSB9LAorICB7IEJGRF9SRUxPQ19TSF9EQVRBLCBSX1NIX0RBVEEgfSwKKyAgeyBCRkRfUkVMT0NfU0hfTEFCRUwsIFJfU0hfTEFCRUwgfSwKKyAgeyBCRkRfUkVMT0NfVU5VU0VELCAwIH0KK307CisKKy8qIEFkanVzdCBhIHJlbG9jIGZvciB0aGUgU0guICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdlbmVyaWMgY29kZSwKKyAgIGJ1dCBkb2VzIHNvbWUgbWlub3IgdHdlYWtpbmcuICAqLworCit2b2lkCitzaF9jb2ZmX3JlbG9jX21hbmdsZSAoc2VnLCBmaXgsIGludHIsIHBhZGRyKQorICAgICBzZWdtZW50X2luZm9fdHlwZSAqc2VnOworICAgICBmaXhTICpmaXg7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKKyAgICAgdW5zaWduZWQgaW50IHBhZGRyOworeworICBzeW1ib2xTICpzeW1ib2xfcHRyID0gZml4LT5meF9hZGRzeTsKKyAgc3ltYm9sUyAqZG90OworCisgIGludHItPnJfdmFkZHIgPSBwYWRkciArIGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeC0+Znhfd2hlcmU7CisKKyAgaWYgKCEgU1dJVENIX1RBQkxFIChmaXgpKQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCByZWxvY19tYXAgKnJtOworCisgICAgICBmb3IgKHJtID0gY29mZl9yZWxvY19tYXA7IHJtLT5iZmRfcmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRDsgcm0rKykKKwlpZiAocm0tPmJmZF9yZWxvYyA9PSAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSBmaXgtPmZ4X3JfdHlwZSkKKwkgIGJyZWFrOworICAgICAgaWYgKHJtLT5iZmRfcmVsb2MgPT0gQkZEX1JFTE9DX1VOVVNFRCkKKwlhc19iYWRfd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAorCQkgICAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCisJCSAgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXgtPmZ4X3JfdHlwZSkpOworICAgICAgaW50ci0+cl90eXBlID0gcm0tPnNoX3JlbG9jOworICAgICAgaW50ci0+cl9vZmZzZXQgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGtub3cgKHNoX3JlbGF4KTsKKworICAgICAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNikKKwlpbnRyLT5yX3R5cGUgPSBSX1NIX1NXSVRDSDE2OworICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzgpCisJaW50ci0+cl90eXBlID0gUl9TSF9TV0lUQ0g4OworICAgICAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyKQorCWludHItPnJfdHlwZSA9IFJfU0hfU1dJVENIMzI7CisgICAgICBlbHNlCisJYWJvcnQgKCk7CisKKyAgICAgIC8qIEZvciBhIHN3aXRjaCByZWxvYywgd2Ugc2V0IHJfb2Zmc2V0IHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgICAgIHRoZSByZWxvYyBhZGRyZXNzIGFuZCB0aGUgc3VidHJhaGVuZC4gIFdoZW4gdGhlIGxpbmtlciBpcworICAgICAgICAgZG9pbmcgcmVsYXhpbmcsIGl0IGNhbiB1c2UgdGhlIGRldGVybWluZSB0aGUgc3RhcnRpbmcgYW5kCisgICAgICAgICBlbmRpbmcgcG9pbnRzIG9mIHRoZSBzd2l0Y2ggZGlmZmVyZW5jZSBleHByZXNzaW9uLiAgKi8KKyAgICAgIGludHItPnJfb2Zmc2V0ID0gaW50ci0+cl92YWRkciAtIFNfR0VUX1ZBTFVFIChmaXgtPmZ4X3N1YnN5KTsKKyAgICB9CisKKyAgLyogUEMgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KKyAgaWYgKHN5bWJvbF9wdHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGZpeC0+Znhfcl90eXBlKQorCXsKKwljYXNlIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTI6CisJY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgorCWNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTI6CisJY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQMTJCWTI6CisJY2FzZSBCRkRfUkVMT0NfU0hfVVNFUzoKKwkgIHN5bWJvbF9wdHIgPSBzZWctPmRvdDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfVVNFUykKKyAgICB7CisgICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgb2Zmc2V0IGluIHRoZSBvYmplY3QgZmlsZSwgc2luY2UgdGhpcworCSByZWxvYyBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuCisJIFRoZSBmeF9hZGRudW1iZXIgZmllbGQgd2FzIHNldCBpbiBtZF9hcHBseV9maXguICAqLworICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X2FkZG51bWJlcjsKKyAgICB9CisgIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT1VOVCkKKyAgICB7CisgICAgICAvKiBXZSBjYW4ndCBzdG9yZSB0aGUgY291bnQgaW4gdGhlIG9iamVjdCBmaWxlLCBzaW5jZSB0aGlzIHJlbG9jCisgICAgICAgICBkb2VzIG5vdCB0YWtlIHVwIGFueSBzcGFjZSwgc28gd2Ugc3RvcmUgaXQgaW4gcl9vZmZzZXQuICBUaGUKKyAgICAgICAgIGZ4X29mZnNldCBmaWVsZCB3YXMgc2V0IHdoZW4gdGhlIGZpeHVwIHdhcyBjcmVhdGVkIGluCisgICAgICAgICBzaF9jb2ZmX2Zyb2JfZmlsZS4gICovCisgICAgICBpbnRyLT5yX29mZnNldCA9IGZpeC0+Znhfb2Zmc2V0OworICAgICAgLyogVGhpcyByZWxvYyBpcyBhbHdheXMgYWJzb2x1dGUuICAqLworICAgICAgc3ltYm9sX3B0ciA9IE5VTEw7CisgICAgfQorICBlbHNlIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04pCisgICAgeworICAgICAgLyogU3RvcmUgdGhlIGFsaWdubWVudCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICAqLworICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X29mZnNldDsKKyAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWx3YXlzIGFic29sdXRlLiAgKi8KKyAgICAgIHN5bWJvbF9wdHIgPSBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPREUKKwkgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQorCSAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9MQUJFTCkKKyAgICB7CisgICAgICAvKiBUaGVzZSByZWxvY3MgYXJlIGFsd2F5cyBhYnNvbHV0ZS4gICovCisgICAgICBzeW1ib2xfcHRyID0gTlVMTDsKKyAgICB9CisKKyAgLyogVHVybiB0aGUgc2VnbWVudCBvZiB0aGUgc3ltYm9sIGludG8gYW4gb2Zmc2V0LiAgKi8KKyAgaWYgKHN5bWJvbF9wdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBkb3QgPSBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cildLmRvdDsKKyAgICAgIGlmIChkb3QgIT0gTlVMTCkKKwlpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOworICAgICAgZWxzZQorCWludHItPnJfc3ltbmR4ID0gc3ltYm9sX3B0ci0+c3lfbnVtYmVyOworICAgIH0KKyAgZWxzZQorICAgIGludHItPnJfc3ltbmR4ID0gLTE7Cit9CisKKyNlbmRpZiAvKiBPQkpfQ09GRiAqLworI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCisvKiBDcmVhdGUgYSByZWxvYy4gICovCisKK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQorICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgYXJlbGVudCAqcmVsOworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlOworCisgIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOworICByZWwtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7CisKKyAgcl90eXBlID0gZml4cC0+Znhfcl90eXBlOworCisgIGlmIChTV0lUQ0hfVEFCTEUgKGZpeHApKQorICAgIHsKKyAgICAgIHJlbC0+YWRkZW5kID0gcmVsLT5hZGRyZXNzIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKKyAgICAgIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DXzE2KQorCXJfdHlwZSA9IEJGRF9SRUxPQ19TSF9TV0lUQ0gxNjsKKyAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfOCkKKwlyX3R5cGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKKyAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfMzIpCisJcl90eXBlID0gQkZEX1JFTE9DX1NIX1NXSVRDSDMyOworICAgICAgZWxzZQorCWFib3J0ICgpOworICAgIH0KKyAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ19TSF9VU0VTKQorICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOworICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPVU5UKQorICAgIHJlbC0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0FMSUdOKQorICAgIHJlbC0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCisgICAgICAgICAgIHx8IHJfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJlbC0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKKyAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKKyAgZWxzZQorICAgIHJlbC0+YWRkZW5kID0gMDsKKworICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIHJfdHlwZSk7CisgIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCisgICAgeworICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorCQkgICAgXygiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiKSwKKwkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChyX3R5cGUpKTsKKyAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCisgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7CisgICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7CisgICAgfQorCisgIHJldHVybiByZWw7Cit9CisKKyNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXNoLmggYi9nYXMvY29uZmlnL3RjLXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtc2guaApAQCAtMCwwICsxLDE1MiBAQAorLyogVGhpcyBmaWxlIGlzIHRjLXNoLmgKKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVENfU0gKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKyNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfc2gKKworI2lmIEFOU0lfUFJPVE9UWVBFUworc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3Q7CitzdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7CisjZW5kaWYKKworLyogV2hldGhlciBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuICAqLworZXh0ZXJuIGludCBzaGw7CisKKy8qIFdoZXRoZXIgLXJlbGF4IHdhcyB1c2VkLiAgKi8KK2V4dGVybiBpbnQgc2hfcmVsYXg7CisKKy8qIFdoZXRoZXIgLXNtYWxsIHdhcyB1c2VkLiAgKi8KK2V4dGVybiBpbnQgc2hfc21hbGw7CisKKy8qIERvbid0IHRyeSB0byBicmVhayB3b3Jkcy4gICovCisjZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKKworLyogV2UgcmVxdWlyZSAubG9uZywgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLworI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc2hfY29uc19hbGlnbiAobmJ5dGVzKQorZXh0ZXJuIHZvaWQgc2hfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKKworLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBnZW5lcmF0ZSByZWxvY2F0aW9ucyBmb3IgYWxpZ25tZW50CisgICBkaXJlY3RpdmVzLiAgKi8KKyNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWcpIHNoX2hhbmRsZV9hbGlnbiAoZnJhZykKK2V4dGVybiB2b2lkIHNoX2hhbmRsZV9hbGlnbiBQQVJBTVMgKChmcmFnUyAqKSk7CisKKy8qIFdlIG5lZWQgdG8gZm9yY2Ugb3V0IHNvbWUgcmVsb2NhdGlvbnMgd2hlbiByZWxheGluZy4gICovCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBzaF9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCitleHRlcm4gaW50IHNoX2ZvcmNlX3JlbG9jYXRpb24gKCk7CisKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBzaF9maXhfYWRqdXN0YWJsZShmaXhQKQorI2VuZGlmCisKKyNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKKworI2RlZmluZSBMSVNUSU5HX0hFQURFUiAoc2hsID8gIkhpdGFjaGkgU3VwZXItSCBHQVMgTGl0dGxlIEVuZGlhbiIgOiAiSGl0YWNoaSBTdXBlci1IIEdBUyBCaWcgRW5kaWFuIikKKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCisKKy8qIFdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AKKyAgIHBhdHRlcm4uICAqLworZXh0ZXJuIGludCBzaF9kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKKyNkZWZpbmUgbWRfZG9fYWxpZ24obixmaWxsLGxlbixtYXgsbCkgaWYgKHNoX2RvX2FsaWduIChuLGZpbGwsbGVuLG1heCkpIGdvdG8gbAorCisvKiBXZSByZWNvcmQsIGZvciBlYWNoIHNlY3Rpb24sIHdoZXRoZXIgd2UgaGF2ZSBtb3N0IHJlY2VudGx5IG91dHB1dCBhCisgICBDT0RFIHJlbG9jIG9yIGEgREFUQSByZWxvYy4gICovCitzdHJ1Y3Qgc2hfc2VnbWVudF9pbmZvX3R5cGUKK3sKKyAgaW50IGluX2NvZGUgOiAxOworfTsKKyNkZWZpbmUgVENfU0VHTUVOVF9JTkZPX1RZUEUgc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlCisKKy8qIFdlIGNhbGwgYSByb3V0aW5lIHRvIGVtaXQgYSByZWxvYyBmb3IgYSBsYWJlbCwgc28gdGhhdCB0aGUgbGlua2VyCisgICBjYW4gYWxpZ24gbG9hZHMgYW5kIHN0b3JlcyB3aXRob3V0IGNyb3NzaW5nIGEgbGFiZWwuICAqLworZXh0ZXJuIHZvaWQgc2hfZnJvYl9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBzaF9mcm9iX2xhYmVsICgpCisKKy8qIFdlIGNhbGwgYSByb3V0aW5lIHRvIGZsdXNoIHBlbmRpbmcgb3V0cHV0IGluIG9yZGVyIHRvIG91dHB1dCBhIERBVEEKKyAgIHJlbG9jIHdoZW4gcmVxdWlyZWQuICAqLworZXh0ZXJuIHZvaWQgc2hfZmx1c2hfcGVuZGluZ19vdXRwdXQgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCgpIHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjZGVmaW5lIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IHNoX2Zyb2JfZmlsZQorI2Vsc2UKKyNkZWZpbmUgdGNfZnJvYl9maWxlIHNoX2Zyb2JfZmlsZQorI2VuZGlmCitleHRlcm4gdm9pZCBzaF9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOworCisjaWZkZWYgT0JKX0NPRkYKKy8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisjZGVmaW5lIERPX05PVF9TVFJJUCAwCisKKy8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCisjZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeCkgKChmaXgpLT5meF9yX3R5cGUpCisKKyNkZWZpbmUgQkZEX0FSQ0ggVEFSR0VUX0FSQ0gKKworI2RlZmluZSBDT0ZGX01BR0lDIChzaGwgPyBTSF9BUkNIX01BR0lDX0xJVFRMRSA6IFNIX0FSQ0hfTUFHSUNfQklHKQorCisvKiBXZSBuZWVkIHRvIHdyaXRlIG91dCByZWxvY3Mgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21wbGV0ZWQuICAqLworI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXgpICgoZml4KS0+ZnhfYWRkc3kgIT0gTlVMTCkKKworI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUoc2VnLCBmaXgsIGludCwgcGFkZHIpIFwKKyAgc2hfY29mZl9yZWxvY19tYW5nbGUgKChzZWcpLCAoZml4KSwgKGludCksIChwYWRkcikpCitleHRlcm4gdm9pZCBzaF9jb2ZmX3JlbG9jX21hbmdsZQorICBQQVJBTVMgKChzdHJ1Y3Qgc2VnbWVudF9pbmZvX3N0cnVjdCAqLCBzdHJ1Y3QgZml4ICosCisJICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHVuc2lnbmVkIGludCkpOworCisjZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKSA7IC8qIG5vdCB1c2VkICovCisKKyNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQorCisjZGVmaW5lIFRDX0tFRVBfRlhfT0ZGU0VUIDEKKworI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKK2V4dGVybiBpbnQgdGNfY29mZl9zaXplbWFjaGRlcCBQQVJBTVMgKChmcmFnUyAqKSk7CisKKy8qIFdlIGFsaWduIG1vc3Qgc2VjdGlvbnMgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LiAgKi8KKyNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKQkJCQkJXAorICAoc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5zdGFic3RyIiwgOCkgPT0gMAkJXAorICAgPyAwCQkJCQkJCQlcCisgICA6ICgoc3RybmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5zdGFiIiwgNSkgPT0gMAlcCisgICAgICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmN0b3JzIikgPT0gMAlcCisgICAgICAgfHwgc3RyY21wIChvYmpfc2VnbWVudF9uYW1lIChTRUcpLCAiLmR0b3JzIikgPT0gMCkJXAorICAgICAgPyAyCQkJCQkJCVwKKyAgICAgIDogKHNoX3NtYWxsID8gMiA6IDQpKSkKKworI2VuZGlmIC8qIE9CSl9DT0ZGICovCisKKyNpZmRlZiBPQkpfRUxGCisvKiBFTEYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGlzIGJpZyBlbmRpYW4gKi8KK2V4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47CisKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAoc2hsID8gImVsZjMyLXNobCIgOiAiZWxmMzItc2giKQorCisjZW5kaWYgLyogT0JKX0VMRiAqLworCisvKiBlbmQgb2YgdGMtc2guaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MThhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXNwYXJjLmMKQEAgLTAsMCArMSwzNTUxIEBACisvKiB0Yy1zcGFyYy5jIC0tIEFzc2VtYmxlIGZvciB0aGUgU1BBUkMKKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAtOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKKyAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisKKyNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKKworI2lmZGVmIE9CSl9FTEYKKyNpbmNsdWRlICJlbGYvc3BhcmMuaCIKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggKmxvb2t1cF9hcmNoIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHZvaWQgaW5pdF9kZWZhdWx0X2FyY2ggUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgc3BhcmNfaXAgUEFSQU1TICgoY2hhciAqLCBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqKSk7CitzdGF0aWMgaW50IGluX3NpZ25lZF9yYW5nZSBQQVJBTVMgKChiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKK3N0YXRpYyBpbnQgaW5fdW5zaWduZWRfcmFuZ2UgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX3ZtYSkpOworc3RhdGljIGludCBpbl9iaXRmaWVsZF9yYW5nZSBQQVJBTVMgKChiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKK3N0YXRpYyBpbnQgc3BhcmNfZmZzIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworc3RhdGljIGJmZF92bWEgQlNSIFBBUkFNUyAoKGJmZF92bWEsIGludCkpOworc3RhdGljIGludCBjbXBfcmVnX2VudHJ5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CitzdGF0aWMgaW50IHBhcnNlX2tleXdvcmRfYXJnIFBBUkFNUyAoKGludCAoKikgKGNvbnN0IGNoYXIgKiksIGNoYXIgKiosIGludCAqKSk7CitzdGF0aWMgaW50IHBhcnNlX2NvbnN0X2V4cHJfYXJnIFBBUkFNUyAoKGNoYXIgKiosIGludCAqKSk7CitzdGF0aWMgaW50IGdldF9leHByZXNzaW9uIFBBUkFNUyAoKGNoYXIgKnN0cikpOworCisvKiBEZWZhdWx0IGFyY2hpdGVjdHVyZS4gICovCisvKiA/Pz8gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIFY4LCBidXQgc3BhcmNsaXRlIHN1cHBvcnQgd2FzIGFkZGVkCisgICBieSBtYWtpbmcgaXQgdGhlIGRlZmF1bHQuICBHQ0Mgbm93IHBhc3NlcyAtQXNwYXJjbGl0ZSwgc28gbWF5YmUgc29tZXRpbWUgaW4KKyAgIHRoZSBmdXR1cmUgd2UgY2FuIHNldCB0aGlzIHRvIFY4LiAgKi8KKyNpZm5kZWYgREVGQVVMVF9BUkNICisjZGVmaW5lIERFRkFVTFRfQVJDSCAic3BhcmNsaXRlIgorI2VuZGlmCitzdGF0aWMgY2hhciAqZGVmYXVsdF9hcmNoID0gREVGQVVMVF9BUkNIOworCisvKiBOb24temVybyBpZiB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgYG1heF9hcmNoaXRlY3R1cmUnIGFuZCBgc3BhcmNfYXJjaF9zaXplJworICAgaGF2ZSBiZWVuIHNldC4gICovCitzdGF0aWMgaW50IGRlZmF1bHRfaW5pdF9wOworCisvKiBDdXJyZW50IGFyY2hpdGVjdHVyZS4gIFdlIGRvbid0IGJ1bXAgdXAgdW5sZXNzIG5lY2Vzc2FyeS4gICovCitzdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgY3VycmVudF9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9WNjsKKworLyogVGhlIG1heGltdW0gYXJjaGl0ZWN0dXJlIGxldmVsIHdlIGNhbiBidW1wIHVwIHRvLgorICAgSW4gYSAzMiBiaXQgZW52aXJvbm1lbnQsIGRvbid0IGFsbG93IGJ1bXBpbmcgdXAgdG8gdjkgYnkgZGVmYXVsdC4KKyAgIFRoZSBuYXRpdmUgYXNzZW1ibGVyIHdvcmtzIHRoaXMgd2F5LiAgVGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcGFzcworICAgYW4gZXhwbGljaXQgYXJndW1lbnQgYmVmb3JlIHdlJ2xsIGNyZWF0ZSB2OSBvYmplY3QgZmlsZXMuICBIb3dldmVyLCBpZgorICAgd2UgZG9uJ3Qgc2VlIGFueSB2OSBpbnNucywgYSB2OHBsdXMgb2JqZWN0IGZpbGUgaXMgbm90IGNyZWF0ZWQuICAqLworc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG1heF9hcmNoaXRlY3R1cmU7CisKKy8qIEVpdGhlciAzMiBvciA2NCwgc2VsZWN0cyBmaWxlIGZvcm1hdC4gICovCitzdGF0aWMgaW50IHNwYXJjX2FyY2hfc2l6ZTsKKy8qIEluaXRpYWwgKGRlZmF1bHQpIHZhbHVlLCByZWNvcmRlZCBzZXBhcmF0ZWx5IGluIGNhc2UgYSB1c2VyIG9wdGlvbgorICAgY2hhbmdlcyB0aGUgdmFsdWUgYmVmb3JlIG1kX3Nob3dfdXNhZ2UgaXMgY2FsbGVkLiAgKi8KK3N0YXRpYyBpbnQgZGVmYXVsdF9hcmNoX3NpemU7CisKKyNpZmRlZiBPQkpfRUxGCisvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHY5IG1lbW9yeSBtb2RlbC4gIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yCisgICBFTEYuICAqLworc3RhdGljIGVudW0geyBNTV9UU08sIE1NX1BTTywgTU1fUk1PIH0gc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUk1POworI2VuZGlmCisKK3N0YXRpYyBpbnQgYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZDsKK3N0YXRpYyBpbnQgd2Fybl9vbl9idW1wOworCisvKiBJZiB3YXJuX29uX2J1bXAgYW5kIHRoZSBuZWVkZWQgYXJjaGl0ZWN0dXJlIGlzIGhpZ2hlciB0aGFuIHRoaXMKKyAgIGFyY2hpdGVjdHVyZSwgaXNzdWUgYSB3YXJuaW5nLiAgKi8KK3N0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZTsKKworLyogTm9uLXplcm8gaWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUuICAqLworaW50IHNwYXJjX3BpY19jb2RlOworCisvKiBOb24temVybyBpZiB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvciB3aGVuIG1pc2FsaWduZWQgZGF0YSBpcyBzZWVuLiAgKi8KK3N0YXRpYyBpbnQgZW5mb3JjZV9hbGlnbmVkX2RhdGE7CisKK2V4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47CisKK3N0YXRpYyBpbnQgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YTsKKworLyogVjkgYW5kIDg2eCBoYXZlIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBkYXRhLCBidXQgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgYmlnCisgICBlbmRpYW4uICBUaGUgc3BhcmNsZXQgaGFzIGJpLWVuZGlhbiBzdXBwb3J0IGJ1dCBib3RoIGRhdGEgYW5kIGluc25zIGhhdmUKKyAgIHRoZSBzYW1lIGVuZGlhbm5lc3MuICBHbG9iYWwgYHRhcmdldF9iaWdfZW5kaWFuJyBpcyB1c2VkIGZvciBkYXRhLgorICAgVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIGZvciBpbnN0cnVjdGlvbnMuICAqLworI2lmbmRlZiBJTlNOX0JJR19FTkRJQU4KKyNkZWZpbmUgSU5TTl9CSUdfRU5ESUFOICh0YXJnZXRfYmlnX2VuZGlhbiBcCisJCQkgfHwgZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggXAorCQkJIHx8IFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpKQorI2VuZGlmCisKKy8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOworCitzdGF0aWMgaW50IGxvZzIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2RhdGExIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNfc2VnIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19wcm9jIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19yZXNlcnZlIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc19jb21tb24gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzX2VtcHR5IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7CisKK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwJLyogRGVmYXVsdGluZyBpcyBpbnZhbGlkICgwKSAqLworICB7ImNvbW1vbiIsIHNfY29tbW9uLCAwfSwKKyAgeyJlbXB0eSIsIHNfZW1wdHksIDB9LAorICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAorICB7ImhhbGYiLCBjb25zLCAyfSwKKyAgeyJvcHRpbSIsIHNfaWdub3JlLCAwfSwKKyAgeyJwcm9jIiwgc19wcm9jLCAwfSwKKyAgeyJyZXNlcnZlIiwgc19yZXNlcnZlLCAwfSwKKyAgeyJzZWciLCBzX3NlZywgMH0sCisgIHsic2tpcCIsIHNfc3BhY2UsIDB9LAorICB7IndvcmQiLCBjb25zLCA0fSwKKyAgeyJ4d29yZCIsIGNvbnMsIDh9LAorICB7InVhaGFsZiIsIHNfdWFjb25zLCAyfSwKKyAgeyJ1YXdvcmQiLCBzX3VhY29ucywgNH0sCisgIHsidWF4d29yZCIsIHNfdWFjb25zLCA4fSwKKyNpZmRlZiBPQkpfRUxGCisgIC8qIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBzcGFyYy9zdnI0ICovCisgIHsicHVzaHNlY3Rpb24iLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAorICB7InBvcHNlY3Rpb24iLCBvYmpfZWxmX3ByZXZpb3VzLCAwfSwKKyAgeyIyYnl0ZSIsIHNfdWFjb25zLCAyfSwKKyAgeyI0Ynl0ZSIsIHNfdWFjb25zLCA0fSwKKyAgeyI4Ynl0ZSIsIHNfdWFjb25zLCA4fSwKKyNlbmRpZgorICB7TlVMTCwgMCwgMH0sCit9OworCitjb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCisKKy8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQorICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIhIjsJLyogSkYgcmVtb3ZlZCAnfCcgZnJvbSBjb21tZW50X2NoYXJzICovCisKKy8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCisgICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KKy8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cworICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCisvKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMKKyAgIHdvcmsgaWYgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKKworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7CisKKy8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCitjb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKKworLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KKy8qIEFzIGluIDBmMTIuNDU2ICovCisvKiBvciAgICAwZDEuMjM0NWUxMiAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOworCisvKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCisgICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCisgICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG9jdGFsWzI1Nl07CisjZGVmaW5lIGlzb2N0YWwoYykgIG9jdGFsWyh1bnNpZ25lZCBjaGFyKSAoYyldCitzdGF0aWMgdW5zaWduZWQgY2hhciB0b0hleFsyNTZdOworCitzdHJ1Y3Qgc3BhcmNfaXQKKyAgeworICAgIGNoYXIgKmVycm9yOworICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOworICAgIGV4cHJlc3Npb25TIGV4cDsKKyAgICBpbnQgcGNyZWw7CisgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworICB9OworCitzdHJ1Y3Qgc3BhcmNfaXQgdGhlX2luc24sIHNldF9pbnNuOworCitzdGF0aWMgdm9pZCBvdXRwdXRfaW5zbgorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICosIHN0cnVjdCBzcGFyY19pdCAqKSk7CisMCisvKiBUYWJsZSBvZiBhcmd1bWVudHMgdG8gLUEuCisgICBUaGUgc3BhcmNfb3Bjb2RlX2FyY2ggdGFibGUgaW4gc3BhcmMtb3BjLmMgaXMgaW5zdWZmaWNpZW50IGFuZCBpbmNvcnJlY3QKKyAgIGZvciB0aGlzIHVzZS4gIFRoYXQgdGFibGUgaXMgZm9yIG9wY29kZXMgb25seS4gIFRoaXMgdGFibGUgaXMgZm9yIG9wY29kZXMKKyAgIGFuZCBmaWxlIGZvcm1hdHMuICAqLworCitlbnVtIHNwYXJjX2FyY2hfdHlwZXMge3Y2LCB2NywgdjgsIHNwYXJjbGV0LCBzcGFyY2xpdGUsIHNwYXJjODZ4LCB2OHBsdXMsCisJCSAgICAgICB2OHBsdXNhLCB2OSwgdjlhLCB2OV82NH07CisKK3N0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCB7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKm9wY29kZV9hcmNoOworICBlbnVtIHNwYXJjX2FyY2hfdHlwZXMgYXJjaF90eXBlOworICAvKiBEZWZhdWx0IHdvcmQgc2l6ZSwgYXMgc3BlY2lmaWVkIGR1cmluZyBjb25maWd1cmF0aW9uLgorICAgICBBIHZhbHVlIG9mIHplcm8gbWVhbnMgY2FuJ3QgYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgYXJjaGl0ZWN0dXJlLiAgKi8KKyAgaW50IGRlZmF1bHRfYXJjaF9zaXplOworICAvKiBBbGxvd2FibGUgYXJnIHRvIC1BPyAgKi8KKyAgaW50IHVzZXJfb3B0aW9uX3A7Cit9IHNwYXJjX2FyY2hfdGFibGVbXSA9IHsKKyAgeyAidjYiLCAidjYiLCB2NiwgMCwgMSB9LAorICB7ICJ2NyIsICJ2NyIsIHY3LCAwLCAxIH0sCisgIHsgInY4IiwgInY4IiwgdjgsIDMyLCAxIH0sCisgIHsgInNwYXJjbGV0IiwgInNwYXJjbGV0Iiwgc3BhcmNsZXQsIDMyLCAxIH0sCisgIHsgInNwYXJjbGl0ZSIsICJzcGFyY2xpdGUiLCBzcGFyY2xpdGUsIDMyLCAxIH0sCisgIHsgInNwYXJjODZ4IiwgInNwYXJjbGl0ZSIsIHNwYXJjODZ4LCAzMiwgMSB9LAorICB7ICJ2OHBsdXMiLCAidjkiLCB2OSwgMCwgMSB9LAorICB7ICJ2OHBsdXNhIiwgInY5YSIsIHY5LCAwLCAxIH0sCisgIHsgInY5IiwgInY5IiwgdjksIDAsIDEgfSwKKyAgeyAidjlhIiwgInY5YSIsIHY5LCAwLCAxIH0sCisgIC8qIFRoaXMgZXhpc3RzIHRvIGFsbG93IGNvbmZpZ3VyZS5pbi9NYWtlZmlsZS5pbiB0byBwYXNzIG9uZQorICAgICB2YWx1ZSB0byBzcGVjaWZ5IGJvdGggdGhlIGRlZmF1bHQgbWFjaGluZSBhbmQgZGVmYXVsdCB3b3JkIHNpemUuICAqLworICB7ICJ2OS02NCIsICJ2OSIsIHY5LCA2NCwgMCB9LAorICB7IE5VTEwsIE5VTEwsIHY4LCAwLCAwIH0KK307CisKKy8qIFZhcmlhbnQgb2YgZGVmYXVsdF9hcmNoICovCitzdGF0aWMgZW51bSBzcGFyY19hcmNoX3R5cGVzIGRlZmF1bHRfYXJjaF90eXBlOworCitzdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggKgorbG9va3VwX2FyY2ggKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBzcGFyY19hcmNoICpzYTsKKworICBmb3IgKHNhID0gJnNwYXJjX2FyY2hfdGFibGVbMF07IHNhLT5uYW1lICE9IE5VTEw7IHNhKyspCisgICAgaWYgKHN0cmNtcCAoc2EtPm5hbWUsIG5hbWUpID09IDApCisgICAgICBicmVhazsKKyAgaWYgKHNhLT5uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBzYTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBvcGNvZGUgYXJjaCBhbmQgd29yZCBzaXplIGZyb20gdGhlIGRlZmF1bHQKKyAgIGFyY2hpdGVjdHVyZSBuYW1lLiAgKi8KKworc3RhdGljIHZvaWQKK2luaXRfZGVmYXVsdF9hcmNoICgpCit7CisgIHN0cnVjdCBzcGFyY19hcmNoICpzYSA9IGxvb2t1cF9hcmNoIChkZWZhdWx0X2FyY2gpOworCisgIGlmIChzYSA9PSBOVUxMCisgICAgICB8fCBzYS0+ZGVmYXVsdF9hcmNoX3NpemUgPT0gMCkKKyAgICBhc19mYXRhbCAoXygiSW52YWxpZCBkZWZhdWx0IGFyY2hpdGVjdHVyZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7CisKKyAgbWF4X2FyY2hpdGVjdHVyZSA9IHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAoc2EtPm9wY29kZV9hcmNoKTsKKyAgaWYgKG1heF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfQkFEKQorICAgIGFzX2ZhdGFsIChfKCJCYWQgb3Bjb2RlIHRhYmxlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKKyAgZGVmYXVsdF9hcmNoX3NpemUgPSBzcGFyY19hcmNoX3NpemUgPSBzYS0+ZGVmYXVsdF9hcmNoX3NpemU7CisgIGRlZmF1bHRfaW5pdF9wID0gMTsKKyAgZGVmYXVsdF9hcmNoX3R5cGUgPSBzYS0+YXJjaF90eXBlOworfQorCisvKiBDYWxsZWQgYnkgVEFSR0VUX0ZPUk1BVC4gICovCisKK2NvbnN0IGNoYXIgKgorc3BhcmNfdGFyZ2V0X2Zvcm1hdCAoKQoreworICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgd2UncmUgY2FsbGVkLAorICAgICBzbyBoYW5kbGUgdGhhdCBub3cuICAqLworICBpZiAoISBkZWZhdWx0X2luaXRfcCkKKyAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKKworI2lmZGVmIE9CSl9BT1VUCisjaWZkZWYgVEVfTmV0QlNECisgIHJldHVybiAiYS5vdXQtc3BhcmMtbmV0YnNkIjsKKyNlbHNlCisjaWZkZWYgVEVfU1BBUkNBT1VUCisgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKyAgICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7CisgIGVsc2UgaWYgKGRlZmF1bHRfYXJjaF90eXBlID09IHNwYXJjODZ4ICYmIHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEpCisgICAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOworICBlbHNlIHJldHVybiAiYS5vdXQtc3BhcmMtbGl0dGxlIjsKKyNlbHNlCisgIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE9CSl9CT1VUCisgIHJldHVybiAiYi5vdXQuYmlnIjsKKyNlbmRpZgorCisjaWZkZWYgT0JKX0NPRkYKKyNpZmRlZiBURV9MWU5YCisgIHJldHVybiAiY29mZi1zcGFyYy1seW54IjsKKyNlbHNlCisgIHJldHVybiAiY29mZi1zcGFyYyI7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT0JKX0VMRgorICByZXR1cm4gc3BhcmNfYXJjaF9zaXplID09IDY0ID8gImVsZjY0LXNwYXJjIiA6ICJlbGYzMi1zcGFyYyI7CisjZW5kaWYKKworICBhYm9ydCAoKTsKK30KKwwKKy8qCisgKiBtZF9wYXJzZV9vcHRpb24KKyAqCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCisgKglTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6CisgKgorICoJLWJ1bXAKKyAqCQlXYXJuIG9uIGFyY2hpdGVjdHVyZSBidW1wcy4gIFNlZSBhbHNvIC1BLgorICoKKyAqCS1BdjYsIC1BdjcsIC1BdjgsIC1Bc3BhcmNsaXRlLCAtQXNwYXJjbGV0CisgKgkJU3RhbmRhcmQgMzIgYml0IGFyY2hpdGVjdHVyZXMuCisgKgktQXY4cGx1cywgLUF2OHBsdXNhCisgKgkJU3BhcmM2NCBpbiBhIDMyIGJpdCB3b3JsZC4KKyAqCS1BdjksIC1BdjlhCisgKgkJU3BhcmM2NCBpbiBlaXRoZXIgYSAzMiBvciA2NCBiaXQgd29ybGQgKC0zMi8tNjQgc2F5cyB3aGljaCkuCisgKgkJVGhpcyB1c2VkIHRvIG9ubHkgbWVhbiA2NCBiaXRzLCBidXQgcHJvcGVybHkgc3BlY2lmeWluZyBpdAorICoJCWNvbXBsaWNhdGVkIGdjYydzIEFTTV9TUEVDcywgc28gbm93IG9wY29kZSBzZWxlY3Rpb24gaXMKKyAqCQlzcGVjaWZpZWQgb3J0aG9nb25hbGx5IHRvIHdvcmQgc2l6ZSAoZXhjZXB0IHdoZW4gc3BlY2lmeWluZworICoJCXRoZSBkZWZhdWx0LCBidXQgdGhhdCBpcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwpLgorICoJLXhhcmNoPXY4cGx1cywgLXhhcmNoPXY4cGx1c2EKKyAqCQlTYW1lIGFzIC1BdjhwbHVzeyxhfSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW4ncyBhc3NlbWJsZXIuCisgKgorICoJCVNlbGVjdCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBwb3NzaWJseSB0aGUgZmlsZSBmb3JtYXQuCisgKgkJSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkCisgKgkJYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KKyAqCisgKgkJVGhlIGRlZmF1bHQgaXMgdG8gc3RhcnQgYXQgdjYsIGFuZCBidW1wIHRoZSBhcmNoaXRlY3R1cmUgdXAKKyAqCQl3aGVuZXZlciBhbiBpbnN0cnVjdGlvbiBpcyBzZWVuIGF0IGEgaGlnaGVyIGxldmVsLiAgSW4gMzIgYml0CisgKgkJZW52aXJvbm1lbnRzLCB2OSBpcyBub3QgYnVtcGVkIHVwIHRvLCB0aGUgdXNlciBtdXN0IHBhc3MKKyAqIAkJLUF2OHBsdXN7LGF9LgorICoKKyAqCQlJZiAtYnVtcCBpcyBzcGVjaWZpZWQsIGEgd2FybmluZyBpcyBwcmludGluZyB3aGVuIGJ1bXBpbmcgdG8KKyAqCQloaWdoZXIgbGV2ZWxzLgorICoKKyAqCQlJZiBhbiBhcmNoaXRlY3R1cmUgaXMgc3BlY2lmaWVkLCBhbGwgaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2gKKyAqCQl0aGF0IGFyY2hpdGVjdHVyZS4gIEFueSBoaWdoZXIgbGV2ZWwgaW5zdHJ1Y3Rpb25zIGFyZSBmbGFnZ2VkCisgKgkJYXMgZXJyb3JzLiAgTm90ZSB0aGF0IGluIHRoZSAzMiBiaXQgZW52aXJvbm1lbnQgc3BlY2lmeWluZworICoJCS1BdjhwbHVzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgdjhwbHVzIG9iamVjdCBmaWxlLCBhCisgKgkJdjkgaW5zbiBtdXN0IGJlIHNlZW4uCisgKgorICoJCUlmIGJvdGggYW4gYXJjaGl0ZWN0dXJlIGFuZCAtYnVtcCBhcmUgc3BlY2lmaWVkLCB0aGUKKyAqCQlhcmNoaXRlY3R1cmUgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwsIGJ1dCBidW1wcyBhcmUKKyAqCQl3YXJuaW5ncy4gIE5vdGUgdGhhdCB3ZSBjYW4ndCBzZXQgYGN1cnJlbnRfYXJjaGl0ZWN0dXJlJyB0bworICoJCXRoZSByZXF1ZXN0ZWQgbGV2ZWwgaW4gdGhpcyBjYXNlOiBpbiB0aGUgMzIgYml0IGVudmlyb25tZW50LAorICoJCXdlIHN0aWxsIG11c3QgYXZvaWQgY3JlYXRpbmcgdjhwbHVzIG9iamVjdCBmaWxlcyB1bmxlc3MgdjkKKyAqIAkJaW5zbnMgYXJlIHNlZW4uCisgKgorICogTm90ZToKKyAqCQlCdW1waW5nIGJldHdlZW4gaW5jb21wYXRpYmxlIGFyY2hpdGVjdHVyZXMgaXMgYWx3YXlzIGFuCisgKgkJZXJyb3IuICBGb3IgZXhhbXBsZSwgZnJvbSBzcGFyY2xpdGUgdG8gdjkuCisgKi8KKworI2lmZGVmIE9CSl9FTEYKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOks6VlE6c3EiOworI2Vsc2UKKyNpZmRlZiBPQkpfQU9VVAorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6ayI7CisjZWxzZQorQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6IjsKKyNlbmRpZgorI2VuZGlmCitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7CisjZGVmaW5lIE9QVElPTl9CVU1QIChPUFRJT05fTURfQkFTRSkKKyAgeyJidW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CVU1QfSwKKyNkZWZpbmUgT1BUSU9OX1NQQVJDIChPUFRJT05fTURfQkFTRSArIDEpCisgIHsic3BhcmMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQQVJDfSwKKyNkZWZpbmUgT1BUSU9OX1hBUkNIIChPUFRJT05fTURfQkFTRSArIDIpCisgIHsieGFyY2giLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1hBUkNIfSwKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIE9QVElPTl8zMiAoT1BUSU9OX01EX0JBU0UgKyAzKQorICB7IjMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMn0sCisjZGVmaW5lIE9QVElPTl82NCAoT1BUSU9OX01EX0JBU0UgKyA0KQorICB7IjY0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl82NH0sCisjZGVmaW5lIE9QVElPTl9UU08gKE9QVElPTl9NRF9CQVNFICsgNSkKKyAgeyJUU08iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RTT30sCisjZGVmaW5lIE9QVElPTl9QU08gKE9QVElPTl9NRF9CQVNFICsgNikKKyAgeyJQU08iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BTT30sCisjZGVmaW5lIE9QVElPTl9STU8gKE9QVElPTl9NRF9CQVNFICsgNykKKyAgeyJSTU8iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JNT30sCisjZW5kaWYKKyNpZmRlZiBTUEFSQ19CSUVORElBTgorI2RlZmluZSBPUFRJT05fTElUVExFX0VORElBTiAoT1BUSU9OX01EX0JBU0UgKyA4KQorICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVRUTEVfRU5ESUFOfSwKKyNkZWZpbmUgT1BUSU9OX0JJR19FTkRJQU4gKE9QVElPTl9NRF9CQVNFICsgOSkKKyAgeyJFQiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQklHX0VORElBTn0sCisjZW5kaWYKKyNkZWZpbmUgT1BUSU9OX0VORk9SQ0VfQUxJR05FRF9EQVRBIChPUFRJT05fTURfQkFTRSArIDEwKQorICB7ImVuZm9yY2UtYWxpZ25lZC1kYXRhIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQX0sCisjZGVmaW5lIE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEEgKE9QVElPTl9NRF9CQVNFICsgMTEpCisgIHsibGl0dGxlLWVuZGlhbi1kYXRhIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEF9LAorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgd2UncmUgY2FsbGVkLAorICAgICBzbyBoYW5kbGUgdGhhdCBub3cuICAqLworICBpZiAoISBkZWZhdWx0X2luaXRfcCkKKyAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKKworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgT1BUSU9OX0JVTVA6CisgICAgICB3YXJuX29uX2J1bXAgPSAxOworICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9WNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fWEFSQ0g6CisgICAgICAvKiBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3VuJ3MgYXNzZW1ibGVyLiAgKi8KKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInY4cGx1cyIpICE9IDAKKwkgICYmIHN0cmNtcCAoYXJnLCAidjhwbHVzYSIpICE9IDApCisJeworCSAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteGFyY2g9JXMiKSwgYXJnKTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogZmFsbCB0aHJvdWdoICovCisKKyAgICBjYXNlICdBJzoKKyAgICAgIHsKKwlzdHJ1Y3Qgc3BhcmNfYXJjaCAqc2E7CisJZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgb3Bjb2RlX2FyY2g7CisKKwlzYSA9IGxvb2t1cF9hcmNoIChhcmcpOworCWlmIChzYSA9PSBOVUxMCisJICAgIHx8ICEgc2EtPnVzZXJfb3B0aW9uX3ApCisJICB7CisJICAgIGFzX2JhZCAoXygiaW52YWxpZCBhcmNoaXRlY3R1cmUgLUElcyIpLCBhcmcpOworCSAgICByZXR1cm4gMDsKKwkgIH0KKworCW9wY29kZV9hcmNoID0gc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChzYS0+b3Bjb2RlX2FyY2gpOworCWlmIChvcGNvZGVfYXJjaCA9PSBTUEFSQ19PUENPREVfQVJDSF9CQUQpCisJICBhc19mYXRhbCAoXygiQmFkIG9wY29kZSB0YWJsZSwgYnJva2VuIGFzc2VtYmxlci4iKSk7CisKKwltYXhfYXJjaGl0ZWN0dXJlID0gb3Bjb2RlX2FyY2g7CisJYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1NQQVJDOgorICAgICAgLyogSWdub3JlIC1zcGFyYywgdXNlZCBieSBTdW5PUyBtYWtlIGRlZmF1bHQgLnMubyBydWxlLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEE6CisgICAgICBlbmZvcmNlX2FsaWduZWRfZGF0YSA9IDE7CisgICAgICBicmVhazsKKworI2lmZGVmIFNQQVJDX0JJRU5ESUFOCisgICAgY2FzZSBPUFRJT05fTElUVExFX0VORElBTjoKKyAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKKyAgICAgIGlmIChkZWZhdWx0X2FyY2hfdHlwZSAhPSBzcGFyY2xldCkKKwlhc19mYXRhbCAoIlRoaXMgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgLUVMIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9MSVRUTEVfRU5ESUFOX0RBVEE6CisgICAgICB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhID0gMTsKKyAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKKyAgICAgIGlmIChkZWZhdWx0X2FyY2hfdHlwZSAhPSBzcGFyYzg2eAorCSAgJiYgZGVmYXVsdF9hcmNoX3R5cGUgIT0gdjkpCisJYXNfZmF0YWwgKCJUaGlzIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IC0tbGl0dGxlLWVuZGlhbi1kYXRhIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9CSUdfRU5ESUFOOgorICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOworICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIE9CSl9BT1VUCisgICAgY2FzZSAnayc6CisgICAgICBzcGFyY19waWNfY29kZSA9IDE7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgT0JKX0VMRgorICAgIGNhc2UgT1BUSU9OXzMyOgorICAgIGNhc2UgT1BUSU9OXzY0OgorICAgICAgeworCWNvbnN0IGNoYXIgKipsaXN0LCAqKmw7CisKKwlzcGFyY19hcmNoX3NpemUgPSBjID09IE9QVElPTl8zMiA/IDMyIDogNjQ7CisJbGlzdCA9IGJmZF90YXJnZXRfbGlzdCAoKTsKKwlmb3IgKGwgPSBsaXN0OyAqbCAhPSBOVUxMOyBsKyspCisJICB7CisJICAgIGlmIChzcGFyY19hcmNoX3NpemUgPT0gMzIpCisJICAgICAgeworCQlpZiAoc3RyY21wICgqbCwgImVsZjMyLXNwYXJjIikgPT0gMCkKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWlmIChzdHJjbXAgKCpsLCAiZWxmNjQtc3BhcmMiKSA9PSAwKQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgIH0KKwlpZiAoKmwgPT0gTlVMTCkKKwkgIGFzX2ZhdGFsIChfKCJObyBjb21waWxlZCBpbiBzdXBwb3J0IGZvciAlZCBiaXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCisJCSAgICBzcGFyY19hcmNoX3NpemUpOworCWZyZWUgKGxpc3QpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UU086CisgICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9UU087CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1BTTzoKKyAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1BTTzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fUk1POgorICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUk1POworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdWJzoKKyAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1EnOgorICAgICAgLyogUXkgLSBkbyBlbWl0IC5jb21tZW50CisJIFFuIC0gZG8gbm90IGVtaXQgLmNvbW1lbnQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncyc6CisgICAgICAvKiB1c2UgLnN0YWIgaW5zdGVhZCBvZiAuc3RhYi5leGNsICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3EnOgorICAgICAgLyogcXVpY2sgLS0gbmF0aXZlIGFzc2VtYmxlciBkb2VzIGZld2VyIGNoZWNrcyAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdLJzoKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgIlBJQyIpICE9IDApCisJYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIG9wdGlvbiBmb2xsb3dpbmcgLUsiKSk7CisgICAgICBlbHNlCisJc3BhcmNfcGljX2NvZGUgPSAxOworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK21kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKKyAgICAgRklMRSAqc3RyZWFtOworeworICBjb25zdCBzdHJ1Y3Qgc3BhcmNfYXJjaCAqYXJjaDsKKworICAvKiBXZSBkb24ndCBnZXQgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBiZWZvcmUgd2UncmUgY2FsbGVkLAorICAgICBzbyBoYW5kbGUgdGhhdCBub3cuICAqLworICBpZiAoISBkZWZhdWx0X2luaXRfcCkKKyAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKKworICBmcHJpbnRmKHN0cmVhbSwgXygiU1BBUkMgb3B0aW9uczpcbiIpKTsKKyAgZm9yIChhcmNoID0gJnNwYXJjX2FyY2hfdGFibGVbMF07IGFyY2gtPm5hbWU7IGFyY2grKykKKyAgICB7CisgICAgICBpZiAoYXJjaCAhPSAmc3BhcmNfYXJjaF90YWJsZVswXSkKKwlmcHJpbnRmIChzdHJlYW0sICIgfCAiKTsKKyAgICAgIGlmIChhcmNoLT51c2VyX29wdGlvbl9wKQorCWZwcmludGYgKHN0cmVhbSwgIi1BJXMiLCBhcmNoLT5uYW1lKTsKKyAgICB9CisgIGZwcmludGYgKHN0cmVhbSwgXygiXG4teGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2FcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCisJCQlzcGVjaWZ5IHZhcmlhbnQgb2YgU1BBUkMgYXJjaGl0ZWN0dXJlXG5cCistYnVtcAkJCXdhcm4gd2hlbiBhc3NlbWJsZXIgc3dpdGNoZXMgYXJjaGl0ZWN0dXJlc1xuXAorLXNwYXJjCQkJaWdub3JlZFxuXAorLS1lbmZvcmNlLWFsaWduZWQtZGF0YQlmb3JjZSAubG9uZywgZXRjLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHlcbiIpKTsKKyNpZmRlZiBPQkpfQU9VVAorICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKy1rCQkJZ2VuZXJhdGUgUElDXG4iKSk7CisjZW5kaWYKKyNpZmRlZiBPQkpfRUxGCisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorLTMyCQkJY3JlYXRlIDMyIGJpdCBvYmplY3QgZmlsZVxuXAorLTY0CQkJY3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIikpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKKwkJCVtkZWZhdWx0IGlzICVkXVxuIiksIGRlZmF1bHRfYXJjaF9zaXplKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCistVFNPCQkJdXNlIFRvdGFsIFN0b3JlIE9yZGVyaW5nXG5cCistUFNPCQkJdXNlIFBhcnRpYWwgU3RvcmUgT3JkZXJpbmdcblwKKy1STU8JCQl1c2UgUmVsYXhlZCBNZW1vcnkgT3JkZXJpbmdcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCisJCQlbZGVmYXVsdCBpcyAlc11cbiIpLCAoZGVmYXVsdF9hcmNoX3NpemUgPT0gNjQpID8gIlJNTyIgOiAiVFNPIik7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorLUtQSUMJCQlnZW5lcmF0ZSBQSUNcblwKKy1WCQkJcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyXG5cCistcQkJCWlnbm9yZWRcblwKKy1ReSwgLVFuCQlpZ25vcmVkXG5cCistcwkJCWlnbm9yZWRcbiIpKTsKKyNlbmRpZgorI2lmZGVmIFNQQVJDX0JJRU5ESUFOCisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorLUVMCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcblwKKy1FQgkJCWdlbmVyYXRlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBtYWNoaW5lXG5cCistLWxpdHRsZS1lbmRpYW4tZGF0YQlnZW5lcmF0ZSBjb2RlIGZvciBhIG1hY2hpbmUgaGF2aW5nIGJpZyBlbmRpYW5cblwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucyBhbmQgbGl0dGxlIGVuZGlhbiBkYXRhLiIpKTsKKyNlbmRpZgorfQorDAorLyogc3BhcmM2NCBwcml2aWxlZGdlZCByZWdpc3RlcnMgKi8KKworc3RydWN0IHByaXZfcmVnX2VudHJ5CisgIHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCByZWdudW07CisgIH07CisKK3N0cnVjdCBwcml2X3JlZ19lbnRyeSBwcml2X3JlZ190YWJsZVtdID0KK3sKKyAgeyJ0cGMiLCAwfSwKKyAgeyJ0bnBjIiwgMX0sCisgIHsidHN0YXRlIiwgMn0sCisgIHsidHQiLCAzfSwKKyAgeyJ0aWNrIiwgNH0sCisgIHsidGJhIiwgNX0sCisgIHsicHN0YXRlIiwgNn0sCisgIHsidGwiLCA3fSwKKyAgeyJwaWwiLCA4fSwKKyAgeyJjd3AiLCA5fSwKKyAgeyJjYW5zYXZlIiwgMTB9LAorICB7ImNhbnJlc3RvcmUiLCAxMX0sCisgIHsiY2xlYW53aW4iLCAxMn0sCisgIHsib3RoZXJ3aW4iLCAxM30sCisgIHsid3N0YXRlIiwgMTR9LAorICB7ImZxIiwgMTV9LAorICB7InZlciIsIDMxfSwKKyAgeyIiLCAtMX0sCQkJLyogZW5kIG1hcmtlciAqLworfTsKKworLyogdjlhIHNwZWNpZmljIGFzcnMgKi8KKworc3RydWN0IHByaXZfcmVnX2VudHJ5IHY5YV9hc3JfdGFibGVbXSA9Cit7CisgIHsidGlja19jbXByIiwgMjN9LAorICB7InNvZnRpbnQiLCAyMn0sCisgIHsic2V0X3NvZnRpbnQiLCAyMH0sCisgIHsicGljIiwgMTd9LAorICB7InBjciIsIDE2fSwKKyAgeyJnc3IiLCAxOX0sCisgIHsiZGNyIiwgMTh9LAorICB7ImNsZWFyX3NvZnRpbnQiLCAyMX0sCisgIHsiIiwgLTF9LAkJCS8qIGVuZCBtYXJrZXIgKi8KK307CisKK3N0YXRpYyBpbnQKK2NtcF9yZWdfZW50cnkgKHBhcmcsIHFhcmcpCisgICAgIGNvbnN0IFBUUiBwYXJnOworICAgICBjb25zdCBQVFIgcWFyZzsKK3sKKyAgY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpwID0gKGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqKSBwYXJnOworICBjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKnEgPSAoY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICopIHFhcmc7CisKKyAgcmV0dXJuIHN0cmNtcCAocS0+bmFtZSwgcC0+bmFtZSk7Cit9CisMCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCisgICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gKi8KKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcmV0dmFsID0gTlVMTDsKKyAgaW50IGxvc2UgPSAwOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7CisKKyAgLyogV2UgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIGluaXRpYWxpemUgYW55dGhpbmcgYmVmb3JlIG1kX3BhcnNlX29wdGlvbgorICAgICBpcyBjYWxsZWQsIGFuZCBpdCBtYXkgbm90IGJlIGNhbGxlZCwgc28gaGFuZGxlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24KKyAgICAgbm93IGlmIG5vdCBhbHJlYWR5IGRvbmUuICAqLworICBpZiAoISBkZWZhdWx0X2luaXRfcCkKKyAgICBpbml0X2RlZmF1bHRfYXJjaCAoKTsKKworICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgd2hpbGUgKGkgPCAodW5zaWduZWQgaW50KSBzcGFyY19udW1fb3Bjb2RlcykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lOworICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIG5hbWUsIChQVFIpICZzcGFyY19vcGNvZGVzW2ldKTsKKyAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKKwkJICAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOworCSAgbG9zZSA9IDE7CisJfQorICAgICAgZG8KKwl7CisJICBpZiAoc3BhcmNfb3Bjb2Rlc1tpXS5tYXRjaCAmIHNwYXJjX29wY29kZXNbaV0ubG9zZSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKKwkJICAgICAgIHNwYXJjX29wY29kZXNbaV0ubmFtZSwgc3BhcmNfb3Bjb2Rlc1tpXS5hcmdzKTsKKwkgICAgICBsb3NlID0gMTsKKwkgICAgfQorCSAgKytpOworCX0KKyAgICAgIHdoaWxlIChpIDwgKHVuc2lnbmVkIGludCkgc3BhcmNfbnVtX29wY29kZXMKKwkgICAgICYmICFzdHJjbXAgKHNwYXJjX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOworICAgIH0KKworICBpZiAobG9zZSkKKyAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7CisKKyAgZm9yIChpID0gJzAnOyBpIDwgJzgnOyArK2kpCisgICAgb2N0YWxbaV0gPSAxOworICBmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyArK2kpCisgICAgdG9IZXhbaV0gPSBpIC0gJzAnOworICBmb3IgKGkgPSAnYSc7IGkgPD0gJ2YnOyArK2kpCisgICAgdG9IZXhbaV0gPSBpICsgMTAgLSAnYSc7CisgIGZvciAoaSA9ICdBJzsgaSA8PSAnRic7ICsraSkKKyAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdBJzsKKworICBxc29ydCAocHJpdl9yZWdfdGFibGUsIHNpemVvZiAocHJpdl9yZWdfdGFibGUpIC8gc2l6ZW9mIChwcml2X3JlZ190YWJsZVswXSksCisJIHNpemVvZiAocHJpdl9yZWdfdGFibGVbMF0pLCBjbXBfcmVnX2VudHJ5KTsKKworICAvKiBJZiAtYnVtcCwgcmVjb3JkIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgYXQgd2hpY2ggd2Ugc3RhcnQgaXNzdWluZworICAgICB3YXJuaW5ncy4gIFRoZSBiZWhhdmlvdXIgaXMgZGlmZmVyZW50IGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgYW4KKyAgICAgYXJjaGl0ZWN0dXJlIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4gIElmIGl0IHdhc24ndCwgd2UgaXNzdWUgd2FybmluZ3MKKyAgICAgZm9yIGFsbCB1cHdhcmRzIGJ1bXBzLiAgSWYgaXQgd2FzLCB3ZSBkb24ndCBzdGFydCBpc3N1aW5nIHdhcm5pbmdzIHVudGlsCisgICAgIHdlIG5lZWQgdG8gYnVtcCBiZXlvbmQgdGhlIHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUgb3Igd2hlbiB3ZSBidW1wIGJldHdlZW4KKyAgICAgY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcy4gICovCisKKyAgaWYgKHdhcm5fb25fYnVtcAorICAgICAgJiYgYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCkKKyAgICB7CisgICAgICAvKiBgbWF4X2FyY2hpdGVjdHVyZScgcmVjb3JkcyB0aGUgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZS4KKwkgSXNzdWUgd2FybmluZ3MgaWYgd2UgZ28gYWJvdmUgaXQuICAqLworICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUgPSBtYXhfYXJjaGl0ZWN0dXJlOworCisgICAgICAvKiBGaW5kIHRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBsZXZlbCB0aGF0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aAorCSB0aGUgcmVxdWVzdGVkIG9uZS4gICovCisgICAgICBmb3IgKG1heF9hcmNoaXRlY3R1cmUgPSBTUEFSQ19PUENPREVfQVJDSF9NQVg7CisJICAgbWF4X2FyY2hpdGVjdHVyZSA+IHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlOworCSAgIC0tbWF4X2FyY2hpdGVjdHVyZSkKKwlpZiAoISBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCAobWF4X2FyY2hpdGVjdHVyZSwKKwkJCQkgICAgICAgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUpKQorCSAgYnJlYWs7CisgICAgfQorfQorCisvKiBDYWxsZWQgYWZ0ZXIgYWxsIGFzc2VtYmx5IGhhcyBiZWVuIGRvbmUuICAqLworCit2b2lkCitzcGFyY19tZF9lbmQgKCkKK3sKKyAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSA2NCkKKyAgICB7CisgICAgICBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQorCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OWEpOworICAgICAgZWxzZQorCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQorCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OHBsdXMpOworICAgICAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPT0gU1BBUkNfT1BDT0RFX0FSQ0hfVjlBKQorCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY192OHBsdXNhKTsKKyAgICAgIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKQorCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCk7CisgICAgICBlbHNlIGlmIChkZWZhdWx0X2FyY2hfdHlwZSA9PSBzcGFyYzg2eCAmJiB0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhKQorCWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOworICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBzcGFyY2xpdGUgaXMgdHJlYXRlZCBsaWtlIGEgbm9ybWFsIHNwYXJjLiAgUGVyaGFwcyBpdCBzaG91bGRuJ3QKKwkgICAgIGJlIGJ1dCBmb3Igbm93IGl0IGlzIChzaW5jZSB0aGF0J3MgdGhlIHdheSBpdCdzIGFsd2F5cyBiZWVuCisJICAgICB0cmVhdGVkKS4gICovCisJICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmMpOworCX0KKyAgICB9Cit9CisMCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAtKE1BWCsxKSB0byBNQVguICAqLworCitzdGF0aWMgSU5MSU5FIGludAoraW5fc2lnbmVkX3JhbmdlICh2YWwsIG1heCkKKyAgICAgYmZkX3NpZ25lZF92bWEgdmFsLCBtYXg7Cit7CisgIGlmIChtYXggPD0gMCkKKyAgICBhYm9ydCAoKTsKKyAgLyogU2lnbi1leHRlbmQgdGhlIHZhbHVlIGZyb20gdGhlIGFyY2hpdGVjdHVyZSB3b3JkIHNpemUsIHNvIHRoYXQKKyAgICAgMHhmZmZmZmZmZiBpcyBhbHdheXMgY29uc2lkZXJlZCAtMSBvbiBzcGFyYzMyLiAgKi8KKyAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMikKKyAgICB7CisgICAgICBiZmRfc2lnbmVkX3ZtYSBzaWduID0gKGJmZF9zaWduZWRfdm1hKTEgPDwgMzE7CisgICAgICB2YWwgPSAoKHZhbCAmIDB4ZmZmZmZmZmYpIF4gc2lnbikgLSBzaWduOworICAgIH0KKyAgaWYgKHZhbCA+IG1heCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHZhbCA8IH5tYXgpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAwIHRvIE1BWC4gICovCisKK3N0YXRpYyBJTkxJTkUgaW50Citpbl91bnNpZ25lZF9yYW5nZSAodmFsLCBtYXgpCisgICAgIGJmZF92bWEgdmFsLCBtYXg7Cit7CisgIGlmICh2YWwgPiBtYXgpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgVkFMIGlzIGluIHRoZSByYW5nZSAtKE1BWC8yKzEpIHRvIE1BWC4KKyAgIChlLmcuIC0xNSB0byArMzEpLiAgKi8KKworc3RhdGljIElOTElORSBpbnQKK2luX2JpdGZpZWxkX3JhbmdlICh2YWwsIG1heCkKKyAgICAgYmZkX3NpZ25lZF92bWEgdmFsLCBtYXg7Cit7CisgIGlmIChtYXggPD0gMCkKKyAgICBhYm9ydCAoKTsKKyAgaWYgKHZhbCA+IG1heCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHZhbCA8IH4obWF4ID4+IDEpKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorc3BhcmNfZmZzIChtYXNrKQorICAgICB1bnNpZ25lZCBpbnQgbWFzazsKK3sKKyAgaW50IGk7CisKKyAgaWYgKG1hc2sgPT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yIChpID0gMDsgKG1hc2sgJiAxKSA9PSAwOyArK2kpCisgICAgbWFzayA+Pj0gMTsKKyAgcmV0dXJuIGk7Cit9CisKKy8qIEltcGxlbWVudCBiaWcgc2hpZnQgcmlnaHQuICAqLworc3RhdGljIGJmZF92bWEKK0JTUiAodmFsLCBhbW91bnQpCisgICAgIGJmZF92bWEgdmFsOworICAgICBpbnQgYW1vdW50OworeworICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA8PSA0ICYmIGFtb3VudCA+PSAzMikKKyAgICBhc19mYXRhbCAoXygiU3VwcG9ydCBmb3IgNjQtYml0IGFyaXRobWV0aWMgbm90IGNvbXBpbGVkIGluLiIpKTsKKyAgcmV0dXJuIHZhbCA+PiBhbW91bnQ7Cit9CisMCisvKiBGb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHNwYXJjX2lwIGFuZCBnZXRfZXhwcmVzc2lvbi4gICovCitzdGF0aWMgY2hhciAqZXhwcl9lbmQ7CisKKy8qIEZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gbWRfYXNzZW1ibGUgYW5kIHNwYXJjX2lwLiAgKi8KK3N0YXRpYyBpbnQgc3BlY2lhbF9jYXNlOworCisvKiBWYWx1ZXMgZm9yIGBzcGVjaWFsX2Nhc2UnLgorICAgSW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSB3aWVyZCBoYW5kbGluZyBiZWNhdXNlIHRoZXkncmUgbG9uZ2VyIHRoYW4KKyAgIDQgYnl0ZXMuICAqLworI2RlZmluZSBTUEVDSUFMX0NBU0VfTk9ORQkwCisjZGVmaW5lCVNQRUNJQUxfQ0FTRV9TRVQJMQorI2RlZmluZSBTUEVDSUFMX0NBU0VfU0VUU1cJMgorI2RlZmluZSBTUEVDSUFMX0NBU0VfU0VUWAkzCisvKiBGSVhNRTogc3BhcmMtb3BjLmMgZG9lc24ndCBoYXZlIG5lY2Vzc2FyeSAiUyIgdHJpZ2dlciB0byBlbmFibGUgdGhpcy4gICovCisjZGVmaW5lCVNQRUNJQUxfQ0FTRV9GRElWCTQKKworLyogQml0IG1hc2tzIG9mIHZhcmlvdXMgaW5zbnMuICAqLworI2RlZmluZSBOT1BfSU5TTiAweDAxMDAwMDAwCisjZGVmaW5lIE9SX0lOU04gMHg4MDEwMDAwMAorI2RlZmluZSBGTU9WU19JTlNOIDB4ODFBMDAwMjAKKyNkZWZpbmUgU0VUSElfSU5TTiAweDAxMDAwMDAwCisjZGVmaW5lIFNMTFhfSU5TTiAweDgxMjgxMDAwCisjZGVmaW5lIFNSQV9JTlNOIDB4ODEzODAwMDAKKworLyogVGhlIGxhc3QgaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpsYXN0X2luc247CisvKiBUaGUgYXNzZW1ibGVkIG9wY29kZSBvZiBgbGFzdF9pbnNuJy4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X29wY29kZTsKKwwKKy8qIE1haW4gZW50cnkgcG9pbnQgdG8gYXNzZW1ibGUgb25lIGluc3RydWN0aW9uLiAgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOworCisgIGtub3cgKHN0cik7CisgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9OT05FOworICBzcGFyY19pcCAoc3RyLCAmaW5zbik7CisKKyAgLyogV2Ugd2FybiBhYm91dCBhdHRlbXB0cyB0byBwdXQgYSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW4gYSBkZWxheSBzbG90LAorICAgICB1bmxlc3MgdGhlIGRlbGF5IHNsb3QgaGFzIGJlZW4gYW5udWxsZWQuICAqLworICBpZiAoaW5zbiAhPSBOVUxMCisgICAgICAmJiBsYXN0X2luc24gIT0gTlVMTAorICAgICAgJiYgKGluc24tPmZsYWdzICYgRl9GQlIpICE9IDAKKyAgICAgICYmIChsYXN0X2luc24tPmZsYWdzICYgRl9ERUxBWUVEKSAhPSAwCisgICAgICAvKiA/Pz8gVGhpcyB0ZXN0IGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUuICBXZSBhc3N1bWUgYW55dGhpbmcgd2l0aAorCSBGX3tVTkJSLENPTkRCUixGQlJ9IHNldCBpcyBhbm51bGxhYmxlLiAgKi8KKyAgICAgICYmICgobGFzdF9pbnNuLT5mbGFncyAmIChGX1VOQlIgfCBGX0NPTkRCUiB8IEZfRkJSKSkgPT0gMAorCSAgfHwgKGxhc3Rfb3Bjb2RlICYgQU5OVUwpID09IDApKQorICAgIGFzX3dhcm4gKF8oIkZQIGJyYW5jaCBpbiBkZWxheSBzbG90IikpOworCisgIC8qIFNQQVJDIGJlZm9yZSB2OSByZXF1aXJlcyBhIG5vcCBpbnN0cnVjdGlvbiBiZXR3ZWVuIGEgZmxvYXRpbmcKKyAgICAgcG9pbnQgaW5zdHJ1Y3Rpb24gYW5kIGEgZmxvYXRpbmcgcG9pbnQgYnJhbmNoLiAgV2UgaW5zZXJ0IG9uZQorICAgICBhdXRvbWF0aWNhbGx5LCB3aXRoIGEgd2FybmluZy4gICovCisgIGlmIChtYXhfYXJjaGl0ZWN0dXJlIDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkKKyAgICAgICYmIGluc24gIT0gTlVMTAorICAgICAgJiYgbGFzdF9pbnNuICE9IE5VTEwKKyAgICAgICYmIChpbnNuLT5mbGFncyAmIEZfRkJSKSAhPSAwCisgICAgICAmJiAobGFzdF9pbnNuLT5mbGFncyAmIEZfRkxPQVQpICE9IDApCisgICAgeworICAgICAgc3RydWN0IHNwYXJjX2l0IG5vcF9pbnNuOworCisgICAgICBub3BfaW5zbi5vcGNvZGUgPSBOT1BfSU5TTjsKKyAgICAgIG5vcF9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7CisgICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJm5vcF9pbnNuKTsKKyAgICAgIGFzX3dhcm4gKF8oIkZQIGJyYW5jaCBwcmVjZWRlZCBieSBGUCBpbnN0cnVjdGlvbjsgTk9QIGluc2VydGVkIikpOworICAgIH0KKworICBzd2l0Y2ggKHNwZWNpYWxfY2FzZSkKKyAgICB7CisgICAgY2FzZSBTUEVDSUFMX0NBU0VfTk9ORToKKyAgICAgIC8qIG5vcm1hbCBpbnNuICovCisgICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUOgorICAgICAgeworCWludCBuZWVkX2hpMjJfcCA9IDA7CisKKwkvKiAic2V0IiBpcyBub3QgZGVmaW5lZCBmb3IgbmVnYXRpdmUgbnVtYmVycyBpbiB2OTogaXQgZG9lc24ndCB5aWVsZAorCSAgIHdoYXQgeW91IGV4cGVjdCBpdCB0by4gICovCisJaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpCisJICAgICYmIHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCisJICB7CisJICAgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgMCkKKwkgICAgICBhc193YXJuIChfKCJzZXQ6IHVzZWQgd2l0aCBuZWdhdGl2ZSBudW1iZXIiKSk7CisJICAgIGVsc2UgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPiAob2Zmc2V0VCkgMHhmZmZmZmZmZikKKwkgICAgICBhc193YXJuIChfKCJzZXQ6IG51bWJlciBsYXJnZXIgdGhhbiA0Mjk0OTY3Mjk1IikpOworCSAgfQorCisJLyogU2VlIGlmIG9wZXJhbmQgaXMgYWJzb2x1dGUgYW5kIHNtYWxsOyBza2lwIHNldGhpIGlmIHNvLiAgKi8KKwlpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAorCSAgICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID49ICgxIDw8IDEyKQorCSAgICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgLSgxIDw8IDEyKSkKKwkgIHsKKwkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7CisJICAgIG5lZWRfaGkyMl9wID0gMTsKKwkgIH0KKwkvKiBTZWUgaWYgb3BlcmFuZCBoYXMgbm8gbG93LW9yZGVyIGJpdHM7IHNraXAgT1IgaWYgc28uICAqLworCWlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50CisJICAgIHx8IChuZWVkX2hpMjJfcCAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmIDB4M0ZGKSAhPSAwKQorCSAgICB8fCAhIG5lZWRfaGkyMl9wKQorCSAgeworCSAgICBpbnQgcmQgPSAodGhlX2luc24ub3Bjb2RlICYgUkQgKH4wKSkgPj4gMjU7CisJICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgKG5lZWRfaGkyMl9wID8gUlMxIChyZCkgOiAwKQorCQkJICAgICAgIHwgUkQgKHJkKQorCQkJICAgICAgIHwgSU1NRUQKKwkJCSAgICAgICB8ICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyCisJCQkJICAmIChuZWVkX2hpMjJfcCA/IDB4M2ZmIDogMHgxZmZmKSkpOworCSAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50CisJCQkgICAgICA/IEJGRF9SRUxPQ19MTzEwCisJCQkgICAgICA6IEJGRF9SRUxPQ19OT05FKTsKKwkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7CisJICB9CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIFNQRUNJQUxfQ0FTRV9TRVRTVzoKKyAgICAgIHsKKwkvKiBGSVhNRTogTm90IGZpbmlzaGVkLiAgKi8KKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgU1BFQ0lBTF9DQVNFX1NFVFg6CisgICAgICB7CisjZGVmaW5lIFNJR05FWFQzMih4KSAoKCgoeCkgJiAweGZmZmZmZmZmKSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkKKwlpbnQgdXBwZXIzMiA9IFNJR05FWFQzMiAoQlNSICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyLCAzMikpOworCWludCBsb3dlcjMyID0gU0lHTkVYVDMyICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyKTsKKyN1bmRlZiBTSUdORVhUMzIKKwlpbnQgdG1wcmVnID0gKHRoZV9pbnNuLm9wY29kZSAmIFJTMSAofjApKSA+PiAxNDsKKwlpbnQgZHN0cmVnID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OworCS8qIE91dHB1dCBkaXJlY3RseSB0byBkc3QgcmVnIGlmIGxvd2VyIDMyIGJpdHMgYXJlIGFsbCB6ZXJvLiAgKi8KKwlpbnQgdXBwZXJfZHN0cmVnID0gKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQKKwkJCSAgICAmJiBsb3dlcjMyID09IDApID8gZHN0cmVnIDogdG1wcmVnOworCWludCBuZWVkX2hoMjJfcCA9IDAsIG5lZWRfaG0xMF9wID0gMCwgbmVlZF9oaTIyX3AgPSAwLCBuZWVkX2xvMTBfcCA9IDA7CisKKwkvKiBUaGUgdG1wIHJlZyBzaG91bGQgbm90IGJlIHRoZSBkc3QgcmVnLiAgKi8KKwlpZiAodG1wcmVnID09IGRzdHJlZykKKwkgIGFzX3dhcm4gKF8oInNldHg6IHRlbXBvcmFyeSByZWdpc3RlciBzYW1lIGFzIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIikpOworCisJLyogUmVzZXQgWF9hZGRfbnVtYmVyLCB3ZSd2ZSBleHRyYWN0ZWQgaXQgYXMgdXBwZXIzMi9sb3dlcjMyLgorCSAgIE90aGVyd2lzZSBmaXh1cF9zZWdtZW50IHdpbGwgY29tcGxhaW4gYWJvdXQgbm90IGJlaW5nIGFibGUgdG8KKwkgICB3cml0ZSBhbiA4IGJ5dGUgbnVtYmVyIGluIGEgNCBieXRlIGZpZWxkLiAgKi8KKwl0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID0gMDsKKworCS8qID8/PyBPYnZpb3VzbHkgdGhlcmUgYXJlIG90aGVyIG9wdGltaXphdGlvbnMgd2UgY2FuIGRvCisJICAgKGUuZy4gc2V0aGkrc2hpZnQgZm9yIDB4MWYwMDAwMDAwKSBhbmQgcGVyaGFwcyB3ZSBzaG91bGRuJ3QgYmUKKwkgICBkb2luZyBzb21lIG9mIHRoZXNlLiAgTGF0ZXIuICBJZiB5b3UgZG8gY2hhbmdlIHRoaW5ncywgdHJ5IHRvCisJICAgY2hhbmdlIGFsbCBvZiB0aGlzIHRvIGJlIHRhYmxlIGRyaXZlbiBhcyB3ZWxsLiAgKi8KKworCS8qIFdoYXQgdG8gb3V0cHV0IGRlcGVuZHMgb24gdGhlIG51bWJlciBpZiBpdCdzIGNvbnN0YW50LgorCSAgIENvbXB1dGUgdGhhdCBmaXJzdCwgdGhlbiBvdXRwdXQgd2hhdCB3ZSd2ZSBkZWNpZGVkIHVwb24uICAqLworCWlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQorCSAgbmVlZF9oaDIyX3AgPSBuZWVkX2htMTBfcCA9IG5lZWRfaGkyMl9wID0gbmVlZF9sbzEwX3AgPSAxOworCWVsc2UKKwkgIHsKKwkgICAgLyogT25seSBuZWVkIGhoMjIgaWYgYG9yJyBpbnNuIGNhbid0IGhhbmRsZSBjb25zdGFudC4gICovCisJICAgIGlmICh1cHBlcjMyIDwgLSgxIDw8IDEyKSB8fCB1cHBlcjMyID49ICgxIDw8IDEyKSkKKwkgICAgICBuZWVkX2hoMjJfcCA9IDE7CisKKwkgICAgLyogRG9lcyBib3R0b20gcGFydCAoYWZ0ZXIgc2V0aGkpIGhhdmUgYml0cz8gICovCisJICAgIGlmICgobmVlZF9oaDIyX3AgJiYgKHVwcGVyMzIgJiAweDNmZikgIT0gMCkKKwkJLyogTm8gaGgyMiwgYnV0IGRvZXMgdXBwZXIzMiBzdGlsbCBoYXZlIGJpdHMgd2UgY2FuJ3Qgc2V0CisJCSAgIGZyb20gbG93ZXIzMj8gICovCisJCXx8ICghIG5lZWRfaGgyMl9wCisJCSAgICAmJiB1cHBlcjMyICE9IDAKKwkJICAgICYmICh1cHBlcjMyICE9IC0xIHx8IGxvd2VyMzIgPj0gMCkpKQorCSAgICAgIG5lZWRfaG0xMF9wID0gMTsKKworCSAgICAvKiBJZiB0aGUgbG93ZXIgaGFsZiBpcyBhbGwgemVybywgd2UgYnVpbGQgdGhlIHVwcGVyIGhhbGYgZGlyZWN0bHkKKwkgICAgICAgaW50byB0aGUgZHN0IHJlZy4gICovCisJICAgIGlmIChsb3dlcjMyICE9IDAKKwkJLyogTmVlZCBsb3dlciBoYWxmIGlmIG51bWJlciBpcyB6ZXJvLiAgKi8KKwkJfHwgKCEgbmVlZF9oaDIyX3AgJiYgISBuZWVkX2htMTBfcCkpCisJICAgICAgeworCQkvKiBObyBuZWVkIGZvciBzZXRoaSBpZiBgb3InIGluc24gY2FuIGhhbmRsZSBjb25zdGFudC4gICovCisJCWlmIChsb3dlcjMyIDwgLSgxIDw8IDEyKSB8fCBsb3dlcjMyID49ICgxIDw8IDEyKQorCQkgICAgLyogTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBhIG5lZ2F0aXZlIGNvbnN0YW50IGluIHRoZSBgb3InCisJCSAgICAgICBpbnNuIHVubGVzcyB0aGUgdXBwZXIgMzIgYml0cyBhcmUgYWxsIG9uZXMuICAqLworCQkgICAgfHwgKGxvd2VyMzIgPCAwICYmIHVwcGVyMzIgIT0gLTEpKQorCQkgIG5lZWRfaGkyMl9wID0gMTsKKworCQkvKiBEb2VzIGJvdHRvbSBwYXJ0IChhZnRlciBzZXRoaSkgaGF2ZSBiaXRzPyAgKi8KKwkJaWYgKChuZWVkX2hpMjJfcCAmJiAobG93ZXIzMiAmIDB4M2ZmKSAhPSAwKQorCQkgICAgLyogTm8gc2V0aGkuICAqLworCQkgICAgfHwgKCEgbmVlZF9oaTIyX3AgJiYgKGxvd2VyMzIgJiAweDFmZmYpICE9IDApCisJCSAgICAvKiBOZWVkIGBvcicgaWYgd2UgZGlkbid0IHNldCBhbnl0aGluZyBlbHNlLiAgKi8KKwkJICAgIHx8ICghIG5lZWRfaGkyMl9wICYmICEgbmVlZF9oaDIyX3AgJiYgISBuZWVkX2htMTBfcCkpCisJCSAgbmVlZF9sbzEwX3AgPSAxOworCSAgICAgIH0KKwkgIH0KKworCWlmIChuZWVkX2hoMjJfcCkKKwkgIHsKKwkgICAgdGhlX2luc24ub3Bjb2RlID0gKFNFVEhJX0lOU04gfCBSRCAodXBwZXJfZHN0cmVnKQorCQkJICAgICAgIHwgKCh1cHBlcjMyID4+IDEwKSAmIDB4M2ZmZmZmKSk7CisJICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKKwkJCSAgICAgID8gQkZEX1JFTE9DX1NQQVJDX0hIMjIgOiBCRkRfUkVMT0NfTk9ORSk7CisJICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOworCSAgfQorCisJaWYgKG5lZWRfaG0xMF9wKQorCSAgeworCSAgICB0aGVfaW5zbi5vcGNvZGUgPSAoT1JfSU5TTgorCQkJICAgICAgIHwgKG5lZWRfaGgyMl9wID8gUlMxICh1cHBlcl9kc3RyZWcpIDogMCkKKwkJCSAgICAgICB8IFJEICh1cHBlcl9kc3RyZWcpCisJCQkgICAgICAgfCBJTU1FRAorCQkJICAgICAgIHwgKHVwcGVyMzIKKwkJCQkgICYgKG5lZWRfaGgyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7CisJICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKKwkJCSAgICAgID8gQkZEX1JFTE9DX1NQQVJDX0hNMTAgOiBCRkRfUkVMT0NfTk9ORSk7CisJICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOworCSAgfQorCisJaWYgKG5lZWRfaGkyMl9wKQorCSAgeworCSAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEIChkc3RyZWcpCisJCQkgICAgICAgfCAoKGxvd2VyMzIgPj4gMTApICYgMHgzZmZmZmYpKTsKKwkgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfSEkyMjsKKwkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7CisJICB9CisKKwlpZiAobmVlZF9sbzEwX3ApCisJICB7CisJICAgIC8qIEZJWE1FOiBPbmUgbmljZSBvcHRpbWl6YXRpb24gdG8gZG8gaGVyZSBpcyB0byBPUiB0aGUgbG93IHBhcnQKKwkgICAgICAgd2l0aCB0aGUgaGlnaHBhcnQgaWYgaGkyMiBpc24ndCBuZWVkZWQgYW5kIHRoZSBsb3cgcGFydCBpcworCSAgICAgICBwb3NpdGl2ZS4gICovCisJICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgKG5lZWRfaGkyMl9wID8gUlMxIChkc3RyZWcpIDogMCkKKwkJCSAgICAgICB8IFJEIChkc3RyZWcpCisJCQkgICAgICAgfCBJTU1FRAorCQkJICAgICAgIHwgKGxvd2VyMzIKKwkJCQkgICYgKG5lZWRfaGkyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7CisJICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX0xPMTA7CisJICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOworCSAgfQorCisJLyogSWYgd2UgbmVlZGVkIHRvIGJ1aWxkIHRoZSB1cHBlciBwYXJ0LCBzaGlmdCBpdCBpbnRvIHBsYWNlLiAgKi8KKwlpZiAobmVlZF9oaDIyX3AgfHwgbmVlZF9obTEwX3ApCisJICB7CisJICAgIHRoZV9pbnNuLm9wY29kZSA9IChTTExYX0lOU04gfCBSUzEgKHVwcGVyX2RzdHJlZykgfCBSRCAodXBwZXJfZHN0cmVnKQorCQkJICAgICAgIHwgSU1NRUQgfCAzMik7CisJICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7CisJICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOworCSAgfQorCisJLyogSWYgd2UgbmVlZGVkIHRvIGJ1aWxkIGJvdGggdXBwZXIgYW5kIGxvd2VyIHBhcnRzLCBPUiB0aGVtIHRvZ2V0aGVyLiAgKi8KKwlpZiAoKG5lZWRfaGgyMl9wIHx8IG5lZWRfaG0xMF9wKQorCSAgICAmJiAobmVlZF9oaTIyX3AgfHwgbmVlZF9sbzEwX3ApKQorCSAgeworCSAgICB0aGVfaW5zbi5vcGNvZGUgPSAoT1JfSU5TTiB8IFJTMSAoZHN0cmVnKSB8IFJTMiAodXBwZXJfZHN0cmVnKQorCQkJICAgICAgIHwgUkQgKGRzdHJlZykpOworCSAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOworCSAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKKwkgIH0KKwkvKiBXZSBkaWRuJ3QgbmVlZCBib3RoIHJlZ3MsIGJ1dCB3ZSBtYXkgaGF2ZSB0byBzaWduIGV4dGVuZCBsb3dlcjMyLiAgKi8KKwllbHNlIGlmIChuZWVkX2hpMjJfcCAmJiB1cHBlcjMyID09IC0xKQorCSAgeworCSAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU1JBX0lOU04gfCBSUzEgKGRzdHJlZykgfCBSRCAoZHN0cmVnKQorCQkJICAgICAgIHwgSU1NRUQgfCAwKTsKKwkgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKKwkgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7CisJICB9CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIFNQRUNJQUxfQ0FTRV9GRElWOgorICAgICAgeworCWludCByZCA9ICh0aGVfaW5zbi5vcGNvZGUgPj4gMjUpICYgMHgxZjsKKworCW91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOworCisJLyogQWNjb3JkaW5nIHRvIGluZm9ybWF0aW9uIGxlYWtlZCBmcm9tIFN1biwgdGhlICJmZGl2IiBpbnN0cnVjdGlvbnMKKwkgICBvbiBlYXJseSBTUEFSQyBtYWNoaW5lcyB3b3VsZCBwcm9kdWNlIGluY29ycmVjdCByZXN1bHRzIHNvbWV0aW1lcy4KKwkgICBUaGUgd29ya2Fyb3VuZCBpcyB0byBhZGQgYW4gZm1vdnMgb2YgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIHRvCisJICAgaXRzZWxmIGp1c3QgYWZ0ZXIgdGhlIGluc3RydWN0aW9uLiAgVGhpcyB3YXMgdHJ1ZSBvbiBtYWNoaW5lcworCSAgIHdpdGggV2VpdGVrIDExNjUgZmxvYXQgY2hpcHMsIHN1Y2ggYXMgdGhlIFN1bi00LzI2MCBhbmQgLzI4MC4gKi8KKwlhc3NlcnQgKHRoZV9pbnNuLnJlbG9jID09IEJGRF9SRUxPQ19OT05FKTsKKwl0aGVfaW5zbi5vcGNvZGUgPSBGTU9WU19JTlNOIHwgcmQgfCBSRCAocmQpOworCW91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOworCWJyZWFrOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc3BlY2lhbCBjYXNlIGluc24gc2FuaXR5IGNoZWNrIikpOworICAgIH0KK30KKworLyogU3Vicm91dGluZSBvZiBtZF9hc3NlbWJsZSB0byBkbyB0aGUgYWN0dWFsIHBhcnNpbmcuICAqLworCitzdGF0aWMgdm9pZAorc3BhcmNfaXAgKHN0ciwgcGluc24pCisgICAgIGNoYXIgKnN0cjsKKyAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKnBpbnNuOworeworICBjaGFyICplcnJvcl9tZXNzYWdlID0gIiI7CisgIGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKmFyZ3M7CisgIGNoYXIgYzsKKyAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKKyAgY2hhciAqYXJnc1N0YXJ0OworICB1bnNpZ25lZCBsb25nIG9wY29kZTsKKyAgdW5zaWduZWQgaW50IG1hc2sgPSAwOworICBpbnQgbWF0Y2ggPSAwOworICBpbnQgY29tbWEgPSAwOworICBpbnQgdjlfYXJnX3A7CisKKyAgcyA9IHN0cjsKKyAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisgICAgeworICAgICAgZG8KKwkrK3M7CisgICAgICB3aGlsZSAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKSB8fCBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKTsKKyAgICB9CisKKyAgc3dpdGNoICgqcykKKyAgICB7CisgICAgY2FzZSAnXDAnOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcsJzoKKyAgICAgIGNvbW1hID0gMTsKKworICAgICAgLypGQUxMVEhST1VHSCAqLworCisgICAgY2FzZSAnICc6CisgICAgICAqcysrID0gJ1wwJzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOworICAgIH0KKyAgaW5zbiA9IChzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKTsKKyAgKnBpbnNuID0gaW5zbjsKKyAgaWYgKGluc24gPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoY29tbWEpCisgICAgeworICAgICAgKi0tcyA9ICcsJzsKKyAgICB9CisKKyAgYXJnc1N0YXJ0ID0gczsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKKyAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7CisgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOworICAgICAgdjlfYXJnX3AgPSAwOworCisgICAgICAvKgorICAgICAgICogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZQorICAgICAgICogc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBtYXRjaAorICAgICAgICovCisgICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQorCXsKKwkgIHN3aXRjaCAoKmFyZ3MpCisJICAgIHsKKwkgICAgY2FzZSAnSyc6CisJICAgICAgeworCQlpbnQga21hc2sgPSAwOworCisJCS8qIFBhcnNlIGEgc2VyaWVzIG9mIG1hc2tzLiAgKi8KKwkJaWYgKCpzID09ICcjJykKKwkJICB7CisJCSAgICB3aGlsZSAoKnMgPT0gJyMnKQorCQkgICAgICB7CisJCQlpbnQgbWFzazsKKworCQkJaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9tZW1iYXIsICZzLAorCQkJCQkJICZtYXNrKSkKKwkJCSAgeworCQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgbWVtYmFyIG1hc2sgbmFtZSIpOworCQkJICAgIGdvdG8gZXJyb3I7CisJCQkgIH0KKwkJCWttYXNrIHw9IG1hc2s7CisJCQl3aGlsZSAoKnMgPT0gJyAnKSB7ICsrczsgY29udGludWU7IH0KKwkJCWlmICgqcyA9PSAnfCcgfHwgKnMgPT0gJysnKQorCQkJICArK3M7CisJCQl3aGlsZSAoKnMgPT0gJyAnKSB7ICsrczsgY29udGludWU7IH0KKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGlmICghIHBhcnNlX2NvbnN0X2V4cHJfYXJnICgmcywgJmttYXNrKSkKKwkJICAgICAgeworCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBtZW1iYXIgbWFzayBleHByZXNzaW9uIik7CisJCQlnb3RvIGVycm9yOworCQkgICAgICB9CisJCSAgICBpZiAoa21hc2sgPCAwIHx8IGttYXNrID4gMTI3KQorCQkgICAgICB7CisJCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIG1lbWJhciBtYXNrIG51bWJlciIpOworCQkJZ290byBlcnJvcjsKKwkJICAgICAgfQorCQkgIH0KKworCQlvcGNvZGUgfD0gTUVNQkFSIChrbWFzayk7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICBjYXNlICcqJzoKKwkgICAgICB7CisJCWludCBmY24gPSAwOworCisJCS8qIFBhcnNlIGEgcHJlZmV0Y2ggZnVuY3Rpb24uICAqLworCQlpZiAoKnMgPT0gJyMnKQorCQkgIHsKKwkJICAgIGlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfcHJlZmV0Y2gsICZzLCAmZmNuKSkKKwkJICAgICAgeworCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBuYW1lIik7CisJCQlnb3RvIGVycm9yOworCQkgICAgICB9CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAmZmNuKSkKKwkJICAgICAgeworCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBleHByZXNzaW9uIik7CisJCQlnb3RvIGVycm9yOworCQkgICAgICB9CisJCSAgICBpZiAoZmNuIDwgMCB8fCBmY24gPiAzMSkKKwkJICAgICAgeworCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXIiKTsKKwkJCWdvdG8gZXJyb3I7CisJCSAgICAgIH0KKwkJICB9CisJCW9wY29kZSB8PSBSRCAoZmNuKTsKKwkJY29udGludWU7CisJICAgICAgfQorCisJICAgIGNhc2UgJyEnOgorCSAgICBjYXNlICc/JzoKKwkgICAgICAvKiBQYXJzZSBhIHNwYXJjNjQgcHJpdmlsZWdlZCByZWdpc3Rlci4gICovCisJICAgICAgaWYgKCpzID09ICclJykKKwkJeworCQkgIHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IHByaXZfcmVnX3RhYmxlOworCQkgIHVuc2lnbmVkIGludCBsZW4gPSA5OTk5OTk5OyAvKiBpbml0IHRvIG1ha2UgZ2NjIGhhcHB5ICovCisKKwkJICBzICs9IDE7CisJCSAgd2hpbGUgKHAtPm5hbWVbMF0gPiBzWzBdKQorCQkgICAgcCsrOworCQkgIHdoaWxlIChwLT5uYW1lWzBdID09IHNbMF0pCisJCSAgICB7CisJCSAgICAgIGxlbiA9IHN0cmxlbiAocC0+bmFtZSk7CisJCSAgICAgIGlmIChzdHJuY21wIChwLT5uYW1lLCBzLCBsZW4pID09IDApCisJCQlicmVhazsKKwkJICAgICAgcCsrOworCQkgICAgfQorCQkgIGlmIChwLT5uYW1lWzBdICE9IHNbMF0pCisJCSAgICB7CisJCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiKTsKKwkJICAgICAgZ290byBlcnJvcjsKKwkJICAgIH0KKwkJICBpZiAoKmFyZ3MgPT0gJz8nKQorCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMTQpOworCQkgIGVsc2UKKwkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDI1KTsKKwkJICBzICs9IGxlbjsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiKTsKKwkJICBnb3RvIGVycm9yOworCQl9CisKKwkgICAgY2FzZSAnXyc6CisJICAgIGNhc2UgJy8nOgorCSAgICAgIC8qIFBhcnNlIGEgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3Rlci4gICovCisJICAgICAgaWYgKCpzID09ICclJykKKwkJeworCQkgIHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IHY5YV9hc3JfdGFibGU7CisJCSAgdW5zaWduZWQgaW50IGxlbiA9IDk5OTk5OTk7IC8qIGluaXQgdG8gbWFrZSBnY2MgaGFwcHkgKi8KKworCQkgIHMgKz0gMTsKKwkJICB3aGlsZSAocC0+bmFtZVswXSA+IHNbMF0pCisJCSAgICBwKys7CisJCSAgd2hpbGUgKHAtPm5hbWVbMF0gPT0gc1swXSkKKwkJICAgIHsKKwkJICAgICAgbGVuID0gc3RybGVuIChwLT5uYW1lKTsKKwkJICAgICAgaWYgKHN0cm5jbXAgKHAtPm5hbWUsIHMsIGxlbikgPT0gMCkKKwkJCWJyZWFrOworCQkgICAgICBwKys7CisJCSAgICB9CisJCSAgaWYgKHAtPm5hbWVbMF0gIT0gc1swXSkKKwkJICAgIHsKKwkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIpOworCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQorCQkgIGlmICgqYXJncyA9PSAnLycgJiYgKHAtPnJlZ251bSA9PSAyMCB8fCBwLT5yZWdudW0gPT0gMjEpKQorCQkgICAgeworCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiByZCBvbiB3cml0ZSBvbmx5IGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIpOworCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQkJICAgICAgCisJCSAgaWYgKCphcmdzID09ICcvJykKKwkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDE0KTsKKwkJICBlbHNlCisJCSAgICBvcGNvZGUgfD0gKHAtPnJlZ251bSA8PCAyNSk7CisJCSAgcyArPSBsZW47CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBlcnJvcl9tZXNzYWdlID0gXygiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7CisJCSAgZ290byBlcnJvcjsKKwkJfQorCisJICAgIGNhc2UgJ00nOgorCSAgICBjYXNlICdtJzoKKwkgICAgICBpZiAoc3RybmNtcCAocywgIiVhc3IiLCA0KSA9PSAwKQorCQl7CisJCSAgcyArPSA0OworCisJCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisJCSAgICB7CisJCSAgICAgIGxvbmcgbnVtID0gMDsKKworCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKKwkJCXsKKwkJCSAgbnVtID0gbnVtICogMTAgKyAqcyAtICcwJzsKKwkJCSAgKytzOworCQkJfQorCisJCSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKKwkJCXsKKwkJCSAgaWYgKG51bSA8IDE2IHx8IDMxIDwgbnVtKQorCQkJICAgIHsKKwkJCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDE2IGFuZCAzMSIpOworCQkJICAgICAgZ290byBlcnJvcjsKKwkJCSAgICB9CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgaWYgKG51bSA8IDAgfHwgMzEgPCBudW0pCisJCQkgICAgeworCQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEiKTsKKwkJCSAgICAgIGdvdG8gZXJyb3I7CisJCQkgICAgfQorCQkJfQorCisJCSAgICAgIG9wY29kZSB8PSAoKmFyZ3MgPT0gJ00nID8gUlMxIChudW0pIDogUkQgKG51bSkpOworCQkgICAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGV4cGVjdGluZyAlYXNyTiIpOworCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQorCQl9IC8qIGlmICVhc3IgKi8KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdJJzoKKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ18xMTsKKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdqJzoKKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ18xMDsKKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdYJzoKKwkgICAgICAvKiBWOCBzeXN0ZW1zIGRvbid0IHVuZGVyc3RhbmQgQkZEX1JFTE9DX1NQQVJDXzUuICAqLworCSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKKwkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfNTsKKwkgICAgICBlbHNlCisJCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7CisJICAgICAgLyogVGhlc2UgZmllbGRzIGFyZSB1bnNpZ25lZCwgYnV0IGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSwKKwkJIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyBhcyB3ZWxsLiAgKi8KKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdZJzoKKwkgICAgICAvKiBWOCBzeXN0ZW1zIGRvbid0IHVuZGVyc3RhbmQgQkZEX1JFTE9DX1NQQVJDXzYuICAqLworCSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKKwkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfNjsKKwkgICAgICBlbHNlCisJCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7CisJICAgICAgLyogVGhlc2UgZmllbGRzIGFyZSB1bnNpZ25lZCwgYnV0IGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSwKKwkJIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyBhcyB3ZWxsLiAgKi8KKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdrJzoKKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IC8qIFJFTE9DX1dESVNQMl8xNCAqLyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjsKKwkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAnRyc6CisJICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOTsKKwkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAnTic6CisJICAgICAgaWYgKCpzID09ICdwJyAmJiBzWzFdID09ICduJykKKwkJeworCQkgIHMgKz0gMjsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ1QnOgorCSAgICAgIGlmICgqcyA9PSAncCcgJiYgc1sxXSA9PSAndCcpCisJCXsKKwkJICBzICs9IDI7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICd6JzoKKwkgICAgICBpZiAoKnMgPT0gJyAnKQorCQl7CisJCSAgKytzOworCQl9CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICIlaWNjIiwgNCkgPT0gMCkKKwkJeworCQkgIHMgKz0gNDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ1onOgorCSAgICAgIGlmICgqcyA9PSAnICcpCisJCXsKKwkJICArK3M7CisJCX0KKwkgICAgICBpZiAoc3RybmNtcCAocywgIiV4Y2MiLCA0KSA9PSAwKQorCQl7CisJCSAgcyArPSA0OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnNic6CisJICAgICAgaWYgKCpzID09ICcgJykKKwkJeworCQkgICsrczsKKwkJfQorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzAiLCA1KSA9PSAwKQorCQl7CisJCSAgcyArPSA1OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnNyc6CisJICAgICAgaWYgKCpzID09ICcgJykKKwkJeworCQkgICsrczsKKwkJfQorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzEiLCA1KSA9PSAwKQorCQl7CisJCSAgcyArPSA1OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnOCc6CisJICAgICAgaWYgKCpzID09ICcgJykKKwkJeworCQkgICsrczsKKwkJfQorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzIiLCA1KSA9PSAwKQorCQl7CisJCSAgcyArPSA1OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnOSc6CisJICAgICAgaWYgKCpzID09ICcgJykKKwkJeworCQkgICsrczsKKwkJfQorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzMiLCA1KSA9PSAwKQorCQl7CisJCSAgcyArPSA1OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnUCc6CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICIlcGMiLCAzKSA9PSAwKQorCQl7CisJCSAgcyArPSAzOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnVyc6CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICIldGljayIsIDUpID09IDApCisJCXsKKwkJICBzICs9IDU7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLworCSAgICAgIGlmICgqcyA9PSAnXDAnKQorCQl7CisJCSAgbWF0Y2ggPSAxOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnKyc6CisJICAgICAgaWYgKCpzID09ICcrJykKKwkJeworCQkgICsrczsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGlmICgqcyA9PSAnLScpCisJCXsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ1snOgkJLyogdGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5ICovCisJICAgIGNhc2UgJ10nOgorCSAgICBjYXNlICcsJzoKKwkgICAgY2FzZSAnICc6CisJICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCisJCWNvbnRpbnVlOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJyMnOgkJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KKwkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKyspKQorCQl7CisJCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisJCSAgICB7CisJCSAgICAgICsrczsKKwkJICAgIH0KKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0MnOgkJLyogY29wcm9jZXNzb3Igc3RhdGUgcmVnaXN0ZXIgKi8KKwkgICAgICBpZiAoc3RybmNtcCAocywgIiVjc3IiLCA0KSA9PSAwKQorCQl7CisJCSAgcyArPSA0OworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnYic6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBjb3Byb2Nlc3NvciByZWdpc3RlciAqLworCSAgICBjYXNlICdjJzoKKwkgICAgY2FzZSAnRCc6CisJICAgICAgaWYgKCpzKysgPT0gJyUnICYmICpzKysgPT0gJ2MnICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisJCXsKKwkJICBtYXNrID0gKnMrKzsKKwkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKKwkJICAgIHsKKwkJICAgICAgbWFzayA9IDEwICogKG1hc2sgLSAnMCcpICsgKCpzKysgLSAnMCcpOworCQkgICAgICBpZiAobWFzayA+PSAzMikKKwkJCXsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBtYXNrIC09ICcwJzsKKwkJICAgIH0KKwkJICBzd2l0Y2ggKCphcmdzKQorCQkgICAgeworCisJCSAgICBjYXNlICdiJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICdjJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2s7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICdEJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQorCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAncic6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCisJICAgIGNhc2UgJ08nOgorCSAgICBjYXNlICcxJzoKKwkgICAgY2FzZSAnMic6CisJICAgIGNhc2UgJ2QnOgorCSAgICAgIGlmICgqcysrID09ICclJykKKwkJeworCQkgIHN3aXRjaCAoYyA9ICpzKyspCisJCSAgICB7CisKKwkJICAgIGNhc2UgJ2YnOgkvKiBmcmFtZSBwb2ludGVyICovCisJCSAgICAgIGlmICgqcysrID09ICdwJykKKwkJCXsKKwkJCSAgbWFzayA9IDB4MWU7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBnb3RvIGVycm9yOworCisJCSAgICBjYXNlICdnJzoJLyogZ2xvYmFsIHJlZ2lzdGVyICovCisJCSAgICAgIGlmIChpc29jdGFsIChjID0gKnMrKykpCisJCQl7CisJCQkgIG1hc2sgPSBjIC0gJzAnOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgZ290byBlcnJvcjsKKworCQkgICAgY2FzZSAnaSc6CS8qIGluIHJlZ2lzdGVyICovCisJCSAgICAgIGlmIChpc29jdGFsIChjID0gKnMrKykpCisJCQl7CisJCQkgIG1hc2sgPSBjIC0gJzAnICsgMjQ7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBnb3RvIGVycm9yOworCisJCSAgICBjYXNlICdsJzoJLyogbG9jYWwgcmVnaXN0ZXIgKi8KKwkJICAgICAgaWYgKGlzb2N0YWwgKGMgPSAqcysrKSkKKwkJCXsKKwkJCSAgbWFzayA9IChjIC0gJzAnICsgMTYpOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgZ290byBlcnJvcjsKKworCQkgICAgY2FzZSAnbyc6CS8qIG91dCByZWdpc3RlciAqLworCQkgICAgICBpZiAoaXNvY3RhbCAoYyA9ICpzKyspKQorCQkJeworCQkJICBtYXNrID0gKGMgLSAnMCcgKyA4KTsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICAgIGdvdG8gZXJyb3I7CisKKwkJICAgIGNhc2UgJ3MnOgkvKiBzdGFjayBwb2ludGVyICovCisJCSAgICAgIGlmICgqcysrID09ICdwJykKKwkJCXsKKwkJCSAgbWFzayA9IDB4ZTsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICAgIGdvdG8gZXJyb3I7CisKKwkJICAgIGNhc2UgJ3InOgkvKiBhbnkgcmVnaXN0ZXIgKi8KKwkJICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKGMgPSAqcysrKSkpCisJCQl7CisJCQkgIGdvdG8gZXJyb3I7CisJCQl9CisJCSAgICAgIC8qIEZBTExUSFJPVUdIICovCisJCSAgICBjYXNlICcwJzoKKwkJICAgIGNhc2UgJzEnOgorCQkgICAgY2FzZSAnMic6CisJCSAgICBjYXNlICczJzoKKwkJICAgIGNhc2UgJzQnOgorCQkgICAgY2FzZSAnNSc6CisJCSAgICBjYXNlICc2JzoKKwkJICAgIGNhc2UgJzcnOgorCQkgICAgY2FzZSAnOCc6CisJCSAgICBjYXNlICc5JzoKKwkJICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCisJCQl7CisJCQkgIGlmICgoYyA9IDEwICogKGMgLSAnMCcpICsgKCpzKysgLSAnMCcpKSA+PSAzMikKKwkJCSAgICB7CisJCQkgICAgICBnb3RvIGVycm9yOworCQkJICAgIH0KKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBjIC09ICcwJzsKKwkJCX0KKwkJICAgICAgbWFzayA9IGM7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQorCisJCSAgLyogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKKwkJICAgICBpdCBnb2VzIGluIHRoZSBvcGNvZGUuICAqLworCQkgIHN3aXRjaCAoKmFyZ3MpCisJCSAgICB7CisJCSAgICBjYXNlICcxJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICcyJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2s7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICdkJzoKKwkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7CisJCSAgICAgIGNvbnRpbnVlOworCisJCSAgICBjYXNlICdyJzoKKwkJICAgICAgb3Bjb2RlIHw9IChtYXNrIDw8IDI1KSB8IChtYXNrIDw8IDE0KTsKKwkJICAgICAgY29udGludWU7CisKKwkJICAgIGNhc2UgJ08nOgorCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMCk7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfQorCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnZSc6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLworCSAgICBjYXNlICd2JzoKKwkgICAgY2FzZSAnVic6CisKKwkgICAgY2FzZSAnZic6CisJICAgIGNhc2UgJ0InOgorCSAgICBjYXNlICdSJzoKKworCSAgICBjYXNlICdnJzoKKwkgICAgY2FzZSAnSCc6CisJICAgIGNhc2UgJ0onOgorCSAgICAgIHsKKwkJY2hhciBmb3JtYXQ7CisKKwkJaWYgKCpzKysgPT0gJyUnCisJCSAgICAmJiAoKGZvcm1hdCA9ICpzKSA9PSAnZicpCisJCSAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKisrcykpCisJCSAgeworCQkgICAgZm9yIChtYXNrID0gMDsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQorCQkgICAgICB7CisJCQltYXNrID0gMTAgKiBtYXNrICsgKCpzIC0gJzAnKTsKKwkJICAgICAgfQkJLyogcmVhZCB0aGUgbnVtYmVyICovCisKKwkJICAgIGlmICgoKmFyZ3MgPT0gJ3YnCisJCQkgfHwgKmFyZ3MgPT0gJ0InCisJCQkgfHwgKmFyZ3MgPT0gJ0gnKQorCQkJJiYgKG1hc2sgJiAxKSkKKwkJICAgICAgeworCQkJYnJlYWs7CisJCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBudW1iZXJlZCAqLworCisJCSAgICBpZiAoKCphcmdzID09ICdWJworCQkJIHx8ICphcmdzID09ICdSJworCQkJIHx8ICphcmdzID09ICdKJykKKwkJCSYmIChtYXNrICYgMykpCisJCSAgICAgIHsKKwkJCWJyZWFrOworCQkgICAgICB9CQkvKiByZWdpc3RlciBtdXN0IGJlIG11bHRpcGxlIG9mIDQgKi8KKworCQkgICAgaWYgKG1hc2sgPj0gNjQpCisJCSAgICAgIHsKKwkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKKwkJCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogVGhlcmUgYXJlIG9ubHkgNjQgZiByZWdpc3RlcnM7IFswLTYzXSIpOworCQkJZWxzZQorCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7CisJCQlnb3RvIGVycm9yOworCQkgICAgICB9CS8qIG9uIGVycm9yICovCisJCSAgICBlbHNlIGlmIChtYXNrID49IDMyKQorCQkgICAgICB7CisJCQlpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCisJCQkgIHsKKwkJCSAgICB2OV9hcmdfcCA9IDE7CisJCQkgICAgbWFzayAtPSAzMTsJLyogd3JhcCBoaWdoIGJpdCAqLworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7CisJCQkgICAgZ290byBlcnJvcjsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgYnJlYWs7CisJCSAgfQkvKiBpZiBub3QgYW4gJ2YnIHJlZ2lzdGVyLiAqLworCisJCXN3aXRjaCAoKmFyZ3MpCisJCSAgeworCQkgIGNhc2UgJ3YnOgorCQkgIGNhc2UgJ1YnOgorCQkgIGNhc2UgJ2UnOgorCQkgICAgb3Bjb2RlIHw9IFJTMSAobWFzayk7CisJCSAgICBjb250aW51ZTsKKworCisJCSAgY2FzZSAnZic6CisJCSAgY2FzZSAnQic6CisJCSAgY2FzZSAnUic6CisJCSAgICBvcGNvZGUgfD0gUlMyIChtYXNrKTsKKwkJICAgIGNvbnRpbnVlOworCisJCSAgY2FzZSAnZyc6CisJCSAgY2FzZSAnSCc6CisJCSAgY2FzZSAnSic6CisJCSAgICBvcGNvZGUgfD0gUkQgKG1hc2spOworCQkgICAgY29udGludWU7CisJCSAgfQkJLyogcGFjayBpdCBpbi4gKi8KKworCQlrbm93ICgwKTsKKwkJYnJlYWs7CisJICAgICAgfQkJCS8qIGZsb2F0IGFyZyAqLworCisJICAgIGNhc2UgJ0YnOgorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZzciIsIDQpID09IDApCisJCXsKKwkJICBzICs9IDQ7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICcwJzoJCS8qIDY0IGJpdCBpbW1lZGlhdGUgKHNldHggaW5zbikgKi8KKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOyAvKiByZWxvYyBoYW5kbGVkIGVsc2V3aGVyZSAqLworCSAgICAgIGdvdG8gaW1tZWRpYXRlOworCisJICAgIGNhc2UgJ2gnOgkJLyogaGlnaCAyMiBiaXRzICovCisJICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfSEkyMjsKKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdsJzoJCS8qIDIyIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUgKi8KKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOworCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdMJzoJCS8qIDMwIGJpdCBpbW1lZGlhdGUgKi8KKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjsKKwkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7CisJICAgICAgZ290byBpbW1lZGlhdGU7CisKKwkgICAgY2FzZSAnbic6CQkvKiAyMiBiaXQgaW1tZWRpYXRlICovCisJICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMyMjsKKwkgICAgICBnb3RvIGltbWVkaWF0ZTsKKworCSAgICBjYXNlICdpJzoJCS8qIDEzIGJpdCBpbW1lZGlhdGUgKi8KKwkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzEzOworCisJICAgICAgLyogZmFsbHRocm91Z2ggKi8KKworCSAgICBpbW1lZGlhdGU6CisJICAgICAgaWYgKCpzID09ICcgJykKKwkJcysrOworCisJICAgICAgLyogQ2hlY2sgZm9yICVoaSwgZXRjLiAgKi8KKwkgICAgICBpZiAoKnMgPT0gJyUnKQorCQl7CisJCSAgc3RhdGljIHN0cnVjdCBvcHMgeworCQkgICAgLyogVGhlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhc3NlbWJsZXIuICAqLworCQkgICAgY2hhciAqbmFtZTsKKwkJICAgIC8qIHN0cmxlbiAobmFtZSksIHByZWNvbXB1dGVkIGZvciBzcGVlZCAqLworCQkgICAgaW50IGxlbjsKKwkJICAgIC8qIFRoZSByZWxvYyB0aGlzIHBzZXVkby1vcCB0cmFuc2xhdGVzIHRvLiAgKi8KKwkJICAgIGludCByZWxvYzsKKwkJICAgIC8qIE5vbi16ZXJvIGlmIGZvciB2OSBvbmx5LiAgKi8KKwkJICAgIGludCB2OV9wOworCQkgICAgLyogTm9uLXplcm8gaWYgY2FuIGJlIHVzZWQgaW4gcGMtcmVsYXRpdmUgY29udGV4dHMuICAqLworCQkgICAgaW50IHBjcmVsX3A7LypGSVhNRTp3aXAqLworCQkgIH0gb3BzW10gPSB7CisJCSAgICAvKiBoaXgvbG94IG11c3QgYXBwZWFyIGJlZm9yZSBoaS9sbyBzbyAlaGl4IHdvbid0IGJlCisJCSAgICAgICBtaXN0YWtlbiBmb3IgJWhpLiAgKi8KKwkJICAgIHsgImhpeCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19ISVgyMiwgMSwgMCB9LAorCQkgICAgeyAibG94IiwgMywgQkZEX1JFTE9DX1NQQVJDX0xPWDEwLCAxLCAwIH0sCisJCSAgICB7ICJoaSIsIDIsIEJGRF9SRUxPQ19ISTIyLCAwLCAxIH0sCisJCSAgICB7ICJsbyIsIDIsIEJGRF9SRUxPQ19MTzEwLCAwLCAxIH0sCisJCSAgICB7ICJoaCIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ISDIyLCAxLCAxIH0sCisJCSAgICB7ICJobSIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ITTEwLCAxLCAxIH0sCisJCSAgICB7ICJsbSIsIDIsIEJGRF9SRUxPQ19TUEFSQ19MTTIyLCAxLCAxIH0sCisJCSAgICB7ICJoNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSDQ0LCAxLCAwIH0sCisJCSAgICB7ICJtNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfTTQ0LCAxLCAwIH0sCisJCSAgICB7ICJsNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfTDQ0LCAxLCAwIH0sCisJCSAgICB7ICJ1aGkiLCAzLCBCRkRfUkVMT0NfU1BBUkNfSEgyMiwgMSwgMCB9LAorCQkgICAgeyAidWxvIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDAgfSwKKwkJICAgIHsgTlVMTCB9CisJCSAgfTsKKwkJICBzdHJ1Y3Qgb3BzICpvOworCisJCSAgZm9yIChvID0gb3BzOyBvLT5uYW1lOyBvKyspCisJCSAgICBpZiAoc3RybmNtcCAocyArIDEsIG8tPm5hbWUsIG8tPmxlbikgPT0gMCkKKwkJICAgICAgYnJlYWs7CisJCSAgaWYgKG8tPm5hbWUgPT0gTlVMTCkKKwkJICAgIGJyZWFrOworCisJCSAgdGhlX2luc24ucmVsb2MgPSBvLT5yZWxvYzsKKwkJICBzICs9IG8tPmxlbiArIDE7CisJCSAgdjlfYXJnX3AgPSBvLT52OV9wOworCQl9CisKKwkgICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGdldF9leHByZXNzaW9uKCkgZmFpbHMsIHdlIHdpbGwgc3RpbGwKKwkJIGhhdmUgY3JlYXRlZCBVIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlCisJCSAnc3ltYm9scycgaW4gdGhlIGlucHV0IHN0cmluZy4gIFRyeSBub3QgdG8gY3JlYXRlIFUKKwkJIHN5bWJvbHMgZm9yIHJlZ2lzdGVycywgZXRjLiAgKi8KKwkgICAgICB7CisJCS8qIFRoaXMgc3R1ZmYgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZXhwcmVzc2lvbiBlbmRzIGluCisJCSAgICslcmVnLiAgSWYgaXQgZG9lcywgaXQgcmVtb3ZlcyB0aGUgcmVnaXN0ZXIgZnJvbQorCQkgICB0aGUgZXhwcmVzc2lvbiwgYW5kIHJlLXNldHMgJ3MnIHRvIHBvaW50IHRvIHRoZQorCQkgICByaWdodCBwbGFjZS4gICovCisKKwkJY2hhciAqczE7CisKKwkJZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspIDsKKworCQlpZiAoczEgIT0gcyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgczFbLTFdKSkKKwkJICB7CisJCSAgICBpZiAoczFbLTJdID09ICclJyAmJiBzMVstM10gPT0gJysnKQorCQkgICAgICB7CisJCQlzMSAtPSAzOworCQkJKnMxID0gJ1wwJzsKKwkJCSh2b2lkKSBnZXRfZXhwcmVzc2lvbiAocyk7CisJCQkqczEgPSAnKyc7CisJCQlzID0gczE7CisJCQljb250aW51ZTsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAoc3RyY2hyICgiZ29saTAxMjM0NTY3ODkiLCBzMVstMl0pICYmIHMxWy0zXSA9PSAnJScgJiYgczFbLTRdID09ICcrJykKKwkJICAgICAgeworCQkJczEgLT0gNDsKKwkJCSpzMSA9ICdcMCc7CisJCQkodm9pZCkgZ2V0X2V4cHJlc3Npb24gKHMpOworCQkJKnMxID0gJysnOworCQkJcyA9IHMxOworCQkJY29udGludWU7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgICAgICh2b2lkKSBnZXRfZXhwcmVzc2lvbiAocyk7CisJICAgICAgcyA9IGV4cHJfZW5kOworCisJICAgICAgLyogQ2hlY2sgZm9yIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgZW1pdHRpbmcgYSByZWxvYy4gICovCisJICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQKKwkJICAmJiB0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IDAKKwkJICAmJiB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gMCkKKwkJeworCQkgIC8qIEZvciBwYy1yZWxhdGl2ZSBjYWxsIGluc3RydWN0aW9ucywgd2UgcmVqZWN0CisJCSAgICAgY29uc3RhbnRzIHRvIGdldCBiZXR0ZXIgY29kZS4gICovCisJCSAgaWYgKHRoZV9pbnNuLnBjcmVsCisJCSAgICAgICYmIHRoZV9pbnNuLnJlbG9jID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgorCQkgICAgICAmJiBpbl9zaWduZWRfcmFuZ2UgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIsIDB4M2ZmZikpCisJCSAgICB7CisJCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFBDLXJlbGF0aXZlIG9wZXJhbmQgY2FuJ3QgYmUgYSBjb25zdGFudCIpOworCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQorCisJCSAgLyogQ29uc3RhbnRzIHRoYXQgd29uJ3QgZml0IGFyZSBjaGVja2VkIGluIG1kX2FwcGx5X2ZpeDMKKwkJICAgICBhbmQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KKwkJICAgICA/Pz8gSXQgd291bGQgYmUgcHJlZmVyYWJsZSB0byBpbnN0YWxsIHRoZSBjb25zdGFudHMKKwkJICAgICBpbnRvIHRoZSBpbnNuIGhlcmUgYW5kIHNhdmUgaGF2aW5nIHRvIGNyZWF0ZSBhIGZpeFMKKwkJICAgICBmb3IgZWFjaCBvbmUuICBUaGVyZSBhbHJlYWR5IGV4aXN0cyBjb2RlIHRvIGhhbmRsZQorCQkgICAgIGFsbCB0aGUgdmFyaW91cyBjYXNlcyAoZS5nLiBpbiBtZF9hcHBseV9maXgzIGFuZAorCQkgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pIHNvIGR1cGxpY2F0aW5nIGFsbCB0aGF0IGNvZGUKKwkJICAgICBoZXJlIGlzbid0IHJpZ2h0LiAgKi8KKwkJfQorCisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnYSc6CisJICAgICAgaWYgKCpzKysgPT0gJ2EnKQorCQl7CisJCSAgb3Bjb2RlIHw9IEFOTlVMOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnQSc6CisJICAgICAgeworCQlpbnQgYXNpID0gMDsKKworCQkvKiBQYXJzZSBhbiBhc2kuICAqLworCQlpZiAoKnMgPT0gJyMnKQorCQkgIHsKKwkJICAgIGlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfYXNpLCAmcywgJmFzaSkpCisJCSAgICAgIHsKKwkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIG5hbWUiKTsKKwkJCWdvdG8gZXJyb3I7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBpZiAoISBwYXJzZV9jb25zdF9leHByX2FyZyAoJnMsICZhc2kpKQorCQkgICAgICB7CisJCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBleHByZXNzaW9uIik7CisJCQlnb3RvIGVycm9yOworCQkgICAgICB9CisJCSAgICBpZiAoYXNpIDwgMCB8fCBhc2kgPiAyNTUpCisJCSAgICAgIHsKKwkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIG51bWJlciIpOworCQkJZ290byBlcnJvcjsKKwkJICAgICAgfQorCQkgIH0KKwkJb3Bjb2RlIHw9IEFTSSAoYXNpKTsKKwkJY29udGludWU7CisJICAgICAgfQkJCS8qIGFsdGVybmF0ZSBzcGFjZSAqLworCisJICAgIGNhc2UgJ3AnOgorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXBzciIsIDQpID09IDApCisJCXsKKwkJICBzICs9IDQ7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdxJzoJCS8qIGZsb2F0aW5nIHBvaW50IHF1ZXVlICovCisJICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnEiLCAzKSA9PSAwKQorCQl7CisJCSAgcyArPSAzOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnUSc6CQkvKiBjb3Byb2Nlc3NvciBxdWV1ZSAqLworCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNxIiwgMykgPT0gMCkKKwkJeworCQkgIHMgKz0gMzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ1MnOgorCSAgICAgIGlmIChzdHJjbXAgKHN0ciwgInNldCIpID09IDAKKwkJICB8fCBzdHJjbXAgKHN0ciwgInNldHV3IikgPT0gMCkKKwkJeworCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVQ7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInNldHN3IikgPT0gMCkKKwkJeworCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVRTVzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAic2V0eCIpID09IDApCisJCXsKKwkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUWDsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHN0ciwgImZkaXYiLCA0KSA9PSAwKQorCQl7CisJCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX0ZESVY7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdvJzoKKwkgICAgICBpZiAoc3RybmNtcCAocywgIiVhc2kiLCA0KSAhPSAwKQorCQlicmVhazsKKwkgICAgICBzICs9IDQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAncyc6CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnBycyIsIDUpICE9IDApCisJCWJyZWFrOworCSAgICAgIHMgKz0gNTsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdFJzoKKwkgICAgICBpZiAoc3RybmNtcCAocywgIiVjY3IiLCA0KSAhPSAwKQorCQlicmVhazsKKwkgICAgICBzICs9IDQ7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAndCc6CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICIldGJyIiwgNCkgIT0gMCkKKwkJYnJlYWs7CisJICAgICAgcyArPSA0OworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ3cnOgorCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXdpbSIsIDQpICE9IDApCisJCWJyZWFrOworCSAgICAgIHMgKz0gNDsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICd4JzoKKwkgICAgICB7CisJCWNoYXIgKnB1c2ggPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJCWV4cHJlc3Npb25TIGU7CisKKwkJaW5wdXRfbGluZV9wb2ludGVyID0gczsKKwkJZXhwcmVzc2lvbiAoJmUpOworCQlpZiAoZS5YX29wID09IE9fY29uc3RhbnQpCisJCSAgeworCQkgICAgaW50IG4gPSBlLlhfYWRkX251bWJlcjsKKwkJICAgIGlmIChuICE9IGUuWF9hZGRfbnVtYmVyIHx8IChuICYgfjB4MWZmKSAhPSAwKQorCQkgICAgICBhc19iYWQgKF8oIk9QRiBpbW1lZGlhdGUgb3BlcmFuZCBvdXQgb2YgcmFuZ2UgKDAtMHgxZmYpIikpOworCQkgICAgZWxzZQorCQkgICAgICBvcGNvZGUgfD0gZS5YX2FkZF9udW1iZXIgPDwgNTsKKwkJICB9CisJCWVsc2UKKwkJICBhc19iYWQgKF8oIm5vbi1pbW1lZGlhdGUgT1BGIG9wZXJhbmQsIGlnbm9yZWQiKSk7CisJCXMgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJCWlucHV0X2xpbmVfcG9pbnRlciA9IHB1c2g7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICBjYXNlICd5JzoKKwkgICAgICBpZiAoc3RybmNtcCAocywgIiV5IiwgMikgIT0gMCkKKwkJYnJlYWs7CisJICAgICAgcyArPSAyOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ3UnOgorCSAgICBjYXNlICdVJzoKKwkgICAgICB7CisJCS8qIFBhcnNlIGEgc3BhcmNsZXQgY3ByZWcuICAqLworCQlpbnQgY3ByZWc7CisJCWlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcsICZzLCAmY3ByZWcpKQorCQkgIHsKKwkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgY3ByZWcgbmFtZSIpOworCQkgICAgZ290byBlcnJvcjsKKwkJICB9CisJCW9wY29kZSB8PSAoKmFyZ3MgPT0gJ1UnID8gUlMxIChjcHJlZykgOiBSRCAoY3ByZWcpKTsKKwkJY29udGludWU7CisJICAgICAgfQorCisJICAgIGRlZmF1bHQ6CisJICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOworCSAgICB9CQkJLyogc3dpdGNoIG9uIGFyZyBjb2RlICovCisKKwkgIC8qIEJyZWFrIG91dCBvZiBmb3IoKSBsb29wLiAgKi8KKwkgIGJyZWFrOworCX0JCQkvKiBmb3IgZWFjaCBhcmcgdGhhdCB3ZSBleHBlY3QgKi8KKworICAgIGVycm9yOgorICAgICAgaWYgKG1hdGNoID09IDApCisJeworCSAgLyogQXJncyBkb24ndCBtYXRjaC4gKi8KKwkgIGlmICgmaW5zblsxXSAtIHNwYXJjX29wY29kZXMgPCBzcGFyY19udW1fb3Bjb2RlcworCSAgICAgICYmIChpbnNuLT5uYW1lID09IGluc25bMV0ubmFtZQorCQkgIHx8ICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpKQorCSAgICB7CisJICAgICAgKytpbnNuOworCSAgICAgIHMgPSBhcmdzU3RhcnQ7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kcyVzIiksIGVycm9yX21lc3NhZ2UpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBoYXZlIGEgbWF0Y2guICBOb3cgc2VlIGlmIHRoZSBhcmNoaXRlY3R1cmUgaXMgb2suICAqLworCSAgaW50IG5lZWRlZF9hcmNoX21hc2sgPSBpbnNuLT5hcmNoaXRlY3R1cmU7CisKKwkgIGlmICh2OV9hcmdfcCkKKwkgICAgeworCSAgICAgIG5lZWRlZF9hcmNoX21hc2sgJj0gfiAoKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCisJCQkJICAgICB8ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkpOworCSAgICAgIG5lZWRlZF9hcmNoX21hc2sgfD0gKDEgPDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkpOworCSAgICB9CisKKwkgIGlmIChuZWVkZWRfYXJjaF9tYXNrICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQorCSAgICA7IC8qIG9rICovCisJICAvKiBDYW4gd2UgYnVtcCB1cCB0aGUgYXJjaGl0ZWN0dXJlPyAgKi8KKwkgIGVsc2UgaWYgKG5lZWRlZF9hcmNoX21hc2sgJiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChtYXhfYXJjaGl0ZWN0dXJlKSkKKwkgICAgeworCSAgICAgIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIG5lZWRlZF9hcmNoaXRlY3R1cmUgPQorCQlzcGFyY19mZnMgKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKG1heF9hcmNoaXRlY3R1cmUpCisJCQkgICAmIG5lZWRlZF9hcmNoX21hc2spOworCisJICAgICAgYXNzZXJ0IChuZWVkZWRfYXJjaGl0ZWN0dXJlIDw9IFNQQVJDX09QQ09ERV9BUkNIX01BWCk7CisJICAgICAgaWYgKHdhcm5fb25fYnVtcAorCQkgICYmIG5lZWRlZF9hcmNoaXRlY3R1cmUgPiB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSkKKwkJeworCQkgIGFzX3dhcm4gKF8oImFyY2hpdGVjdHVyZSBidW1wZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIG9uIFwiJXNcIiIpLAorCQkJICAgc3BhcmNfb3Bjb2RlX2FyY2hzW2N1cnJlbnRfYXJjaGl0ZWN0dXJlXS5uYW1lLAorCQkJICAgc3BhcmNfb3Bjb2RlX2FyY2hzW25lZWRlZF9hcmNoaXRlY3R1cmVdLm5hbWUsCisJCQkgICBzdHIpOworCQkgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlID0gbmVlZGVkX2FyY2hpdGVjdHVyZTsKKwkJfQorCSAgICAgIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gbmVlZGVkX2FyY2hpdGVjdHVyZTsKKwkgICAgfQorCSAgLyogQ29uZmxpY3QuICAqLworCSAgLyogPz8/IFRoaXMgc2VlbXMgdG8gYmUgYSBiaXQgZnJhZ2lsZS4gIFdoYXQgaWYgdGhlIG5leHQgZW50cnkgaW4KKwkgICAgIHRoZSBvcGNvZGUgdGFibGUgaXMgdGhlIG9uZSB3ZSB3YW50IGFuZCBpdCBpcyBzdXBwb3J0ZWQ/CisJICAgICBJdCBpcyBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSB0YWJsZSB0b2RheSBzbyB0aGF0IHRoaXMgY2FuJ3QKKwkgICAgIGhhcHBlbiBidXQgd2hhdCBhYm91dCB0b21vcnJvdz8gICovCisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnQgYXJjaCxwcmludGVkX29uZV9wID0gMDsKKwkgICAgICBjaGFyICpwOworCSAgICAgIGNoYXIgcmVxdWlyZWRfYXJjaHNbU1BBUkNfT1BDT0RFX0FSQ0hfTUFYICogMTZdOworCisJICAgICAgLyogQ3JlYXRlIGEgbGlzdCBvZiB0aGUgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgdGhlIGluc24uICAqLworCSAgICAgIG5lZWRlZF9hcmNoX21hc2sgJj0gfiBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChtYXhfYXJjaGl0ZWN0dXJlKTsKKwkgICAgICBwID0gcmVxdWlyZWRfYXJjaHM7CisJICAgICAgYXJjaCA9IHNwYXJjX2ZmcyAobmVlZGVkX2FyY2hfbWFzayk7CisJICAgICAgd2hpbGUgKCgxIDw8IGFyY2gpIDw9IG5lZWRlZF9hcmNoX21hc2spCisJCXsKKwkJICBpZiAoKDEgPDwgYXJjaCkgJiBuZWVkZWRfYXJjaF9tYXNrKQorCQkgICAgeworCQkgICAgICBpZiAocHJpbnRlZF9vbmVfcCkKKwkJCSpwKysgPSAnfCc7CisJCSAgICAgIHN0cmNweSAocCwgc3BhcmNfb3Bjb2RlX2FyY2hzW2FyY2hdLm5hbWUpOworCQkgICAgICBwICs9IHN0cmxlbiAocCk7CisJCSAgICAgIHByaW50ZWRfb25lX3AgPSAxOworCQkgICAgfQorCQkgICsrYXJjaDsKKwkJfQorCisJICAgICAgYXNfYmFkIChfKCJBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gXCIlc1wiLiIpLCBzdHIpOworCSAgICAgIGFzX3Rza3RzayAoXygiIChSZXF1aXJlcyAlczsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyAlcy4pIiksCisJCQkgcmVxdWlyZWRfYXJjaHMsCisJCQkgc3BhcmNfb3Bjb2RlX2FyY2hzW21heF9hcmNoaXRlY3R1cmVdLm5hbWUpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0gLyogaWYgbm8gbWF0Y2ggKi8KKworICAgICAgYnJlYWs7CisgICAgfSAvKiBmb3JldmVyIGxvb2tpbmcgZm9yIGEgbWF0Y2ggKi8KKworICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Cit9CisKKy8qIFBhcnNlIGFuIGFyZ3VtZW50IHRoYXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBhIGtleXdvcmQuCisgICAoZWc6ICNTdG9yZVN0b3JlIG9yICVjY2ZyKS4KKyAgIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4KKyAgIElmIHN1Y2Nlc3NmdWwsIElOUFVUX1BPSU5URVIgaXMgdXBkYXRlZC4gICovCisKK3N0YXRpYyBpbnQKK3BhcnNlX2tleXdvcmRfYXJnIChsb29rdXBfZm4sIGlucHV0X3BvaW50ZXJQLCB2YWx1ZVApCisgICAgIGludCAoKmxvb2t1cF9mbikgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisgICAgIGNoYXIgKippbnB1dF9wb2ludGVyUDsKKyAgICAgaW50ICp2YWx1ZVA7Cit7CisgIGludCB2YWx1ZTsKKyAgY2hhciBjLCAqcCwgKnE7CisKKyAgcCA9ICppbnB1dF9wb2ludGVyUDsKKyAgZm9yIChxID0gcCArICgqcCA9PSAnIycgfHwgKnAgPT0gJyUnKTsKKyAgICAgICBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnEpIHx8ICpxID09ICdfJzsKKyAgICAgICArK3EpCisgICAgY29udGludWU7CisgIGMgPSAqcTsKKyAgKnEgPSAwOworICB2YWx1ZSA9ICgqbG9va3VwX2ZuKSAocCk7CisgICpxID0gYzsKKyAgaWYgKHZhbHVlID09IC0xKQorICAgIHJldHVybiAwOworICAqdmFsdWVQID0gdmFsdWU7CisgICppbnB1dF9wb2ludGVyUCA9IHE7CisgIHJldHVybiAxOworfQorCisvKiBQYXJzZSBhbiBhcmd1bWVudCB0aGF0IGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KKyAgIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4gICovCisKK3N0YXRpYyBpbnQKK3BhcnNlX2NvbnN0X2V4cHJfYXJnIChpbnB1dF9wb2ludGVyUCwgdmFsdWVQKQorICAgICBjaGFyICoqaW5wdXRfcG9pbnRlclA7CisgICAgIGludCAqdmFsdWVQOworeworICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOworICBleHByZXNzaW9uUyBleHA7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gKmlucHV0X3BvaW50ZXJQOworICAvKiBUaGUgbmV4dCBleHByZXNzaW9uIG1heSBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGNvbnN0YW50CisgICAgIChzYXkgaWYgd2UncmUgbm90IHByb2Nlc3NpbmcgdGhlIHJpZ2h0IHZhcmlhbnQgb2YgdGhlIGluc24pLgorICAgICBEb24ndCBjYWxsIGV4cHJlc3Npb24gdW5sZXNzIHdlJ3JlIHN1cmUgaXQgd2lsbCBzdWNjZWVkIGFzIGl0IHdpbGwKKyAgICAgc2lnbmFsIGFuIGVycm9yICh3aGljaCB3ZSB3YW50IHRvIGRlZmVyIHVudGlsIGxhdGVyKS4gICovCisgIC8qIEZJWE1FOiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZGVmaW5lIG1kX29wZXJhbmQgYW5kIGhhdmUgaXQgcmVjb2duaXplCisgICAgIHRoaW5ncyBsaWtlICVhc2ksIGV0Yy4gYnV0IGNvbnRpbnVpbmcgdGhhdCByb3V0ZSB0aHJvdWdoIHRvIHRoZSBlbmQKKyAgICAgaXMgYSBsb3Qgb2Ygd29yay4gICovCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICclJykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBleHByZXNzaW9uICgmZXhwKTsKKyAgKmlucHV0X3BvaW50ZXJQID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOworICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKKyAgICByZXR1cm4gMDsKKyAgKnZhbHVlUCA9IGV4cC5YX2FkZF9udW1iZXI7CisgIHJldHVybiAxOworfQorCisvKiBTdWJyb3V0aW5lIG9mIHNwYXJjX2lwIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24uICAqLworCitzdGF0aWMgaW50CitnZXRfZXhwcmVzc2lvbiAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNoYXIgKnNhdmVfaW47CisgIHNlZ1Qgc2VnOworCisgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKyAgc2VnID0gZXhwcmVzc2lvbiAoJnRoZV9pbnNuLmV4cCk7CisgIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IHRleHRfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IGRhdGFfc2VjdGlvbgorICAgICAgJiYgc2VnICE9IGJzc19zZWN0aW9uCisgICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCisgICAgeworICAgICAgdGhlX2luc24uZXJyb3IgPSBfKCJiYWQgc2VnbWVudCIpOworICAgICAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2YgbWRfYXNzZW1ibGUgdG8gb3V0cHV0IG9uZSBpbnNuLiAgKi8KKworc3RhdGljIHZvaWQKK291dHB1dF9pbnNuIChpbnNuLCB0aGVfaW5zbikKKyAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKKyAgICAgc3RydWN0IHNwYXJjX2l0ICp0aGVfaW5zbjsKK3sKKyAgY2hhciAqdG9QID0gZnJhZ19tb3JlICg0KTsKKworICAvKiBwdXQgb3V0IHRoZSBvcGNvZGUgKi8KKyAgaWYgKElOU05fQklHX0VORElBTikKKyAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuICh0b1AsICh2YWx1ZVQpIHRoZV9pbnNuLT5vcGNvZGUsIDQpOworICBlbHNlCisgICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAodG9QLCAodmFsdWVUKSB0aGVfaW5zbi0+b3Bjb2RlLCA0KTsKKworICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCisgIGlmICh0aGVfaW5zbi0+cmVsb2MgIT0gQkZEX1JFTE9DX05PTkUpCisgICAgeworICAgICAgZml4UyAqZml4UCA9ICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCS8qIHdoaWNoIGZyYWcgKi8KKwkJCQkgKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwJLyogd2hlcmUgKi8KKwkJCQkgNCwJCS8qIHNpemUgKi8KKwkJCQkgJnRoZV9pbnNuLT5leHAsCisJCQkJIHRoZV9pbnNuLT5wY3JlbCwKKwkJCQkgdGhlX2luc24tPnJlbG9jKTsKKyAgICAgIC8qIFR1cm4gb2ZmIG92ZXJmbG93IGNoZWNraW5nIGluIGZpeHVwX3NlZ21lbnQuICBXZSdsbCBkbyBvdXIKKwkgb3duIG92ZXJmbG93IGNoZWNraW5nIGluIG1kX2FwcGx5X2ZpeDMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCisJIHRoZSBpbnNuIHNpemUgaXMgNCBhbmQgZml4dXBfc2VnbWVudCB3aWxsIHNpZ25hbCBhbiBvdmVyZmxvdyBmb3IKKwkgbGFyZ2UgOCBieXRlIHF1YW50aXRpZXMuICAqLworICAgICAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOworICAgIH0KKworICBsYXN0X2luc24gPSBpbnNuOworICBsYXN0X29wY29kZSA9IHRoZV9pbnNuLT5vcGNvZGU7Cit9CisMCisvKgorICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbWRfYXRvZiBpbiBtNjhrLmMuICBJIHRoaW5rIHRoaXMgaXMgcmlnaHQsCisgIGJ1dCBJJ20gbm90IHN1cmUuCisKKyAgVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKKyAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KKyAgKi8KKworLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGNoYXIgdHlwZTsKKyAgICAgY2hhciAqbGl0UDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IGkscHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBjaGFyICp0OworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7CisgICAgfQorCisgIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOworICBpZiAodCkKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OworICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisKKyAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCisJeworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOworCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKwkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisJfQorICAgIH0KKyAgICAgCisgIHJldHVybiAwOworfQorCisvKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQorICAgZW5kaWFubmVzcy4gICovCisKK3ZvaWQKK21kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG47Cit7CisgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKyAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7CisgIGVsc2UgaWYgKHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEKKwkgICAmJiAoKG4gPT0gNCB8fCBuID09IDIpICYmIH5ub3dfc2VnLT5mbGFncyAmIFNFQ19BTExPQykpCisgICAgLyogT3V0cHV0IGRlYnVnIHdvcmRzLCB3aGljaCBhcmUgbm90IGluIGFsbG9jYXRlZCBzZWN0aW9ucywgYXMgYmlnIGVuZGlhbiAqLworICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKKyAgZWxzZSBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSB8fCAhIHRhcmdldF9iaWdfZW5kaWFuKQorICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKK30KKwwKKy8qIEFwcGx5IGEgZml4UyB0byB0aGUgZnJhZ3MsIG5vdyB0aGF0IHdlIGtub3cgdGhlIHZhbHVlIGl0IG91Z2h0IHRvCisgICBob2xkLiAqLworCitpbnQKK21kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHVlLCBzZWdtZW50KQorICAgICBmaXhTICpmaXhQOworICAgICB2YWx1ZVQgKnZhbHVlOworICAgICBzZWdUIHNlZ21lbnQ7Cit7CisgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKKyAgb2Zmc2V0VCB2YWw7CisgIGxvbmcgaW5zbjsKKworICB2YWwgPSAqdmFsdWU7CisKKyAgYXNzZXJ0IChmaXhQLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKTsKKworICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWw7CS8qIFJlbWVtYmVyIHZhbHVlIGZvciBlbWl0X3JlbG9jICovCisKKyNpZmRlZiBPQkpfRUxGCisgIC8qIEZJWE1FOiBTUEFSQyBFTEYgcmVsb2NhdGlvbnMgZG9uJ3QgdXNlIGFuIGFkZGVuZCBpbiB0aGUgZGF0YQorICAgICBmaWVsZCBpdHNlbGYuICBUaGlzIHdob2xlIGFwcHJvYWNoIHNob3VsZCBiZSBzb21laG93IGNvbWJpbmVkCisgICAgIHdpdGggdGhlIGNhbGxzIHRvIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBBbHNvLCB0aGUgdmFsdWUgcGFzc2VkCisgICAgIGluIGJ5IGZpeHVwX3NlZ21lbnQgaW5jbHVkZXMgdGhlIHZhbHVlIG9mIGEgZGVmaW5lZCBzeW1ib2wuICBXZQorICAgICBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIHZhbHVlIG9mIGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wuICAqLworICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZml4UC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MKKwkgICYmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKKwkgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQorCSAgICAgIHx8IChzcGFyY19waWNfY29kZSAmJiAhIGZpeFAtPmZ4X3BjcmVsKQorCSAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnbWVudAorCQkgICYmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCisJCQkJCSAgICAgIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKKwkJICAgICAgICYgU0VDX0xJTktfT05DRSkgIT0gMAorCQkgICAgICB8fCBzdHJuY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSksCisJCQkJICAiLmdudS5saW5rb25jZSIsCisJCQkJICBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkpKQorCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24KKwkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbgorCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkpCisJZml4UC0+ZnhfYWRkbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKworICAvKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8KKyAgICAgaGFuZGxlIHRoaXMuICBQcm9iYWJseSBpbiB0ZXJtcyBvZiBob3d0byBmaWVsZHMsIG9uY2UKKyAgICAgd2UgY2FuIGxvb2sgYXQgdGhlc2UgZml4dXBzIGluIHRlcm1zIG9mIGhvd3Rvcy4gICovCisgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyICYmIGZpeFAtPmZ4X2FkZHN5KQorICAgIHZhbCArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7CisKKyNpZmRlZiBPQkpfQU9VVAorICAvKiBGSVhNRTogTW9yZSByaWRpY3Vsb3VzIGdhcyByZWxvYyBoYWNraW5nLiAgSWYgd2UgYXJlIGdvaW5nIHRvCisgICAgIGdlbmVyYXRlIGEgcmVsb2MsIHRoZW4gd2UganVzdCB3YW50IHRvIGxldCB0aGUgcmVsb2MgYWRkZW5kIHNldAorICAgICB0aGUgdmFsdWUuICBXZSBkbyBub3Qgd2FudCB0byBhbHNvIHN0dWZmIHRoZSBhZGRlbmQgaW50byB0aGUKKyAgICAgb2JqZWN0IGZpbGUuICBJbmNsdWRpbmcgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUgd29ya3Mgd2hlbgorICAgICBkb2luZyBhIHN0YXRpYyBsaW5rLCBiZWNhdXNlIHRoZSBsaW5rZXIgd2lsbCBpZ25vcmUgdGhlIG9iamVjdAorICAgICBmaWxlIGNvbnRlbnRzLiAgSG93ZXZlciwgdGhlIGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGlnbm9yZSB0aGUKKyAgICAgb2JqZWN0IGZpbGUgY29udGVudHMuICAqLworICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAorICAgICAgJiYgZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMikKKyAgICB2YWwgPSAwOworCisgIC8qIFdoZW4gZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgZG8gbm90IHdhbnQgYW4gYWRkZW5kIGZvciBhIHJlbG9jCisgICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICBXZSBhZGp1c3QgZnhfYWRkbnVtYmVyIHRvIGNhbmNlbCBvdXQgdGhlCisgICAgIHZhbHVlIGFscmVhZHkgaW5jbHVkZWQgaW4gdmFsLCBhbmQgdG8gYWxzbyBjYW5jZWwgb3V0IHRoZQorICAgICBhZGp1c3RtZW50IHdoaWNoIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbCBjcmVhdGUuICAqLworICBpZiAoc3BhcmNfcGljX2NvZGUKKyAgICAgICYmIGZpeFAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKKyAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKKyAgICAgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KQorICAgICAgJiYgKGZpeFAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKKyAgICBmaXhQLT5meF9hZGRudW1iZXIgLT0gMiAqIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7CisKKyAgLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBuZWVkIHRvIGZpZGRsZSB0byBnZXQKKyAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB0byBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIGEgUEMgcmVsYXRpdmUKKyAgICAgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8ga2VlcC4gICovCisgIGlmIChzcGFyY19waWNfY29kZQorICAgICAgJiYgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgorICAgICAgJiYgZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAorICAgICAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeFAtPmZ4X2FkZHN5KQorCSAgfHwgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCisgICAgICAmJiBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQorICAgICAgJiYgISBTX0lTX0NPTU1PTiAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHsKKyAgICAgIHZhbCA9IDA7CisgICAgICBmaXhQLT5meF9hZGRudW1iZXIgLT0gMiAqIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7CisgICAgfQorI2VuZGlmCisKKyAgLyogSWYgdGhpcyBpcyBhIGRhdGEgcmVsb2NhdGlvbiwganVzdCBvdXRwdXQgVkFMLiAgKi8KKworICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNikKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCAyKTsKKyAgICB9CisgIGVsc2UgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIKKwkgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NQQVJDX1JFVjMyKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDQpOworICAgIH0KKyAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ182NCkKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCA4KTsKKyAgICB9CisgIGVsc2UgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQgCisgICAgICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHsKKyAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSXQncyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiBpbnN0cnVjdGlvbi4gICovCisKKyAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCisJaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIGJ1Zik7CisgICAgICBlbHNlCisJaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIGJ1Zik7CisgICAgCisgICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKwl7CisJY2FzZSBCRkRfUkVMT0NfMzJfUENSRUxfUzI6CisJICB2YWwgPSB2YWwgPj4gMjsKKwkgIC8qIEZJWE1FOiBUaGlzIGluY3JlbWVudC1ieS1vbmUgZGVzZXJ2ZXMgYSBjb21tZW50IG9mIHdoeSBpdCdzCisJICAgICBiZWluZyBkb25lISAgKi8KKwkgIGlmICghIHNwYXJjX3BpY19jb2RlCisJICAgICAgfHwgZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAorCSAgICAgIHx8IChmaXhQLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCisJICAgICsrdmFsOworCSAgaW5zbiB8PSB2YWwgJiAweDNmZmZmZmZmOworCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ18xMToKKwkgIGlmICghIGluX3NpZ25lZF9yYW5nZSAodmFsLCAweDdmZikpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKKwkgIGluc24gfD0gdmFsICYgMHg3ZmY7CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzEwOgorCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4M2ZmKSkKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOworCSAgaW5zbiB8PSB2YWwgJiAweDNmZjsKKwkgIGJyZWFrOworCisJY2FzZSBCRkRfUkVMT0NfU1BBUkNfNzoKKwkgIGlmICghIGluX2JpdGZpZWxkX3JhbmdlICh2YWwsIDB4N2YpKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7CisJICBpbnNuIHw9IHZhbCAmIDB4N2Y7CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzY6CisJICBpZiAoISBpbl9iaXRmaWVsZF9yYW5nZSAodmFsLCAweDNmKSkKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOworCSAgaW5zbiB8PSB2YWwgJiAweDNmOworCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ181OgorCSAgaWYgKCEgaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgMHgxZikpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKKwkgIGluc24gfD0gdmFsICYgMHgxZjsKKwkgIGJyZWFrOworCisJY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjoKKwkgIC8qIEZJWE1FOiBzaW1wbGlmeSAqLworCSAgaWYgKCgodmFsID4gMCkgJiYgKHZhbCAmIH4weDNmZmZjKSkKKwkgICAgICB8fCAoKHZhbCA8IDApICYmICh+KHZhbCAtIDEpICYgfjB4M2ZmZmMpKSkKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOworCSAgLyogRklYTUU6IFRoZSArMSBkZXNlcnZlcyBhIGNvbW1lbnQuICAqLworCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7CisJICBpbnNuIHw9ICgodmFsICYgMHhjMDAwKSA8PCA2KSB8ICh2YWwgJiAweDNmZmYpOworCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5OgorCSAgLyogRklYTUU6IHNpbXBsaWZ5ICovCisJICBpZiAoKCh2YWwgPiAwKSAmJiAodmFsICYgfjB4MWZmZmZjKSkKKwkgICAgICB8fCAoKHZhbCA8IDApICYmICh+KHZhbCAtIDEpICYgfjB4MWZmZmZjKSkpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKKwkgIC8qIEZJWE1FOiBUaGUgKzEgZGVzZXJ2ZXMgYSBjb21tZW50LiAgKi8KKwkgIHZhbCA9ICh2YWwgPj4gMikgKyAxOworCSAgaW5zbiB8PSB2YWwgJiAweDdmZmZmOworCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ19ISDIyOgorCSAgdmFsID0gQlNSICh2YWwsIDMyKTsKKwkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgorCWNhc2UgQkZEX1JFTE9DX0hJMjI6CisJICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQorCSAgICB7CisJICAgICAgaW5zbiB8PSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBGSVhNRTogTmVlZCBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHdlIGRvIHRoaXMuICAqLworCSAgICAgIGluc24gJj0gfjB4ZmZmZjsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQzIyOgorCSAgaWYgKHZhbCAmIH4weDAwM2ZmZmZmKQorCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7CisJICBpbnNuIHw9ICh2YWwgJiAweDNmZmZmZik7CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6CisJICB2YWwgPSBCU1IgKHZhbCwgMzIpOworCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKworCWNhc2UgQkZEX1JFTE9DX0xPMTA6CisJICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQorCSAgICB7CisJICAgICAgaW5zbiB8PSB2YWwgJiAweDNmZjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRklYTUU6IE5lZWQgY29tbWVudCBleHBsYWluaW5nIHdoeSB3ZSBkbyB0aGlzLiAgKi8KKwkgICAgICBpbnNuICY9IH4weGZmOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6CisJICBpZiAoISBpbl9zaWduZWRfcmFuZ2UgKHZhbCwgMHgxZmZmKSkKKwkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOworCSAgaW5zbiB8PSB2YWwgJiAweDFmZmY7CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI6CisJICB2YWwgPSAodmFsID4+IDIpICsgMTsKKwkgIC8qIEZBTExUSFJPVUdIICovCisJY2FzZSBCRkRfUkVMT0NfU1BBUkNfQkFTRTIyOgorCSAgaW5zbiB8PSB2YWwgJiAweDNmZmZmZjsKKwkgIGJyZWFrOworCisJY2FzZSBCRkRfUkVMT0NfU1BBUkNfSDQ0OgorCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKKwkgICAgeworCSAgICAgIGJmZF92bWEgdHZhbCA9IHZhbDsKKwkgICAgICB0dmFsID4+PSAyMjsKKwkgICAgICBpbnNuIHw9IHR2YWwgJiAweDNmZmZmZjsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6CisJICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQorCSAgICBpbnNuIHw9ICh2YWwgPj4gMTIpICYgMHgzZmY7CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0w0NDoKKwkgIGlmICghZml4UC0+ZnhfYWRkc3kpCisJICAgIGluc24gfD0gdmFsICYgMHhmZmY7CisJICBicmVhazsKKworCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgorCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKKwkgICAgeworCSAgICAgIHZhbCBePSB+IChvZmZzZXRUKSAwOworCSAgICAgIGluc24gfD0gKHZhbCA+PiAxMCkgJiAweDNmZmZmZjsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIEJGRF9SRUxPQ19TUEFSQ19MT1gxMDoKKwkgIGlmICghZml4UC0+ZnhfYWRkc3kpCisJICAgIGluc24gfD0gMHgxYzAwIHwgKHZhbCAmIDB4M2ZmKTsKKwkgIGJyZWFrOworCisJY2FzZSBCRkRfUkVMT0NfTk9ORToKKwlkZWZhdWx0OgorCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJXygiYmFkIG9yIHVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGU6IDB4JTAyeCIpLAorCQkJZml4UC0+Znhfcl90eXBlKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKElOU05fQklHX0VORElBTikKKwliZmRfcHV0YjMyIChpbnNuLCAodW5zaWduZWQgY2hhciAqKSBidWYpOworICAgICAgZWxzZQorCWJmZF9wdXRsMzIgKGluc24sICh1bnNpZ25lZCBjaGFyICopIGJ1Zik7CisgICAgfQorCisgIC8qIEFyZSB3ZSBmaW5pc2hlZCB3aXRoIHRoaXMgcmVsb2NhdGlvbiBub3c/ICAqLworICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gMCAmJiAhZml4UC0+ZnhfcGNyZWwpCisgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAorICAgZm9ybWF0LiAgKi8KK2FyZWxlbnQgKgordGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQorICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgZml4UyAqZml4cDsKK3sKKyAgYXJlbGVudCAqcmVsb2M7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOworCisgIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisKKyAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmZpeHAtPmZ4X2FkZHN5LT5ic3ltOworICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKworICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCRkRfUkVMT0NfMTY6CisgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisgICAgY2FzZSBCRkRfUkVMT0NfSEkyMjoKKyAgICBjYXNlIEJGRF9SRUxPQ19MTzEwOgorICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMX1MyOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6CisgICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTY6CisgICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOToKKyAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOgorICAgIGNhc2UgQkZEX1JFTE9DXzY0OgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzU6CisgICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNjoKKyAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ183OgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzEwOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzExOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hIMjI6CisgICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSE0xMDoKKyAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjI6CisgICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfSE0xMDoKKyAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKKyAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6CisgICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgorICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1JFVjMyOgorICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKKyAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKKyAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkKKyAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQKKyAgICAgc2V0IG9mIHJlbG9jcy4gICovCisKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIEdPVF9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisjZWxzZQorI2RlZmluZSBHT1RfTkFNRSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyNlbmRpZgorCisgIGlmIChzcGFyY19waWNfY29kZSkKKyAgICB7CisgICAgICBzd2l0Y2ggKGNvZGUpCisJeworCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMX1MyOgorCSAgaWYgKCEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKKwkgICAgICB8fCBTX0lTX0NPTU1PTiAoZml4cC0+ZnhfYWRkc3kpCisJICAgICAgfHwgU19JU19FWFRFUk5BTCAoZml4cC0+ZnhfYWRkc3kpCisJICAgICAgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCisJICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwOworCSAgYnJlYWs7CisJY2FzZSBCRkRfUkVMT0NfSEkyMjoKKwkgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMCisJICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSksIEdPVF9OQU1FKSA9PSAwKQorCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX1BDMjI7CisJICBlbHNlCisJICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMjI7CisJICBicmVhazsKKwljYXNlIEJGRF9SRUxPQ19MTzEwOgorCSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKKwkgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwgR09UX05BTUUpID09IDApCisJICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfUEMxMDsKKwkgIGVsc2UKKwkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QxMDsKKwkgIGJyZWFrOworCWNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6CisJICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDEzOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYgLyogZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0FPVVQpICovCisKKyAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOworICBpZiAocmVsb2MtPmhvd3RvID09IDApCisgICAgeworICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorCQkgICAgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIpLAorCQkgICAgZml4cC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIEBAIFdoeSBmeF9hZGRudW1iZXIgc29tZXRpbWVzIGFuZCBmeF9vZmZzZXQgb3RoZXIgdGltZXM/ICAqLworI2lmZGVmIE9CSl9BT1VUCisKKyAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gMAorICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMxMAorICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMyMikKKyAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOworICBlbHNlIGlmIChzcGFyY19waWNfY29kZQorCSAgICYmIGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKKwkgICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCisJICAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeHAtPmZ4X2FkZHN5KQorCSAgICAgICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKKwkgICAmJiBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQorCSAgICYmICEgU19JU19DT01NT04gKGZpeHAtPmZ4X2FkZHN5KSkKKyAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOworICBlbHNlCisgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCAtIHJlbG9jLT5hZGRyZXNzOworCisjZWxzZSAvKiBlbGYgb3IgY29mZiAqLworCisgIGlmIChyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlID09IDAKKyAgICAgIHx8IGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX1BDMTAKKyAgICAgIHx8IGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX1BDMjIpCisgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKKyAgZWxzZSBpZiAoKGZpeHAtPmZ4X2FkZHN5LT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKyAgICByZWxvYy0+YWRkZW5kID0gKHNlY3Rpb24tPnZtYQorCQkgICAgICsgZml4cC0+ZnhfYWRkbnVtYmVyCisJCSAgICAgKyBtZF9wY3JlbF9mcm9tIChmaXhwKSk7CisgIGVsc2UKKyAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OworI2VuZGlmCisKKyAgcmV0dXJuIHJlbG9jOworfQorDAorLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICovCisKKy8qIEFSR1NVU0VEICovCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiAwOworfQkJCQkvKiBtZF91bmRlZmluZWRfc3ltYm9sKCkgKi8KKworLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAqLwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQorICAgICBzZWdUIHNlZ21lbnQ7CisgICAgIHZhbHVlVCBzaXplOworeworI2lmbmRlZiBPQkpfRUxGCisgIC8qIFRoaXMgaXMgbm90IHJpZ2h0IGZvciBFTEY7IGEub3V0IHdhbnRzIGl0LCBhbmQgQ09GRiB3aWxsIGZvcmNlCisgICAgIHRoZSBhbGlnbm1lbnQgYW55d2F5cy4gICovCisgIHZhbHVlVCBhbGlnbiA9ICgodmFsdWVUKSAxCisJCSAgPDwgKHZhbHVlVCkgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KSk7CisgIHZhbHVlVCBuZXdzaXplOworICAvKiB0dXJuIGFsaWdubWVudCB2YWx1ZSBpbnRvIGEgbWFzayAqLworICBhbGlnbi0tOworICBuZXdzaXplID0gKHNpemUgKyBhbGlnbikgJiB+YWxpZ247CisgIHJldHVybiBuZXdzaXplOworI2Vsc2UKKyAgcmV0dXJuIHNpemU7CisjZW5kaWYKK30KKworLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPworICAgT24gdGhlIHNwYXJjLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKKyAgIGl0cyBzaXplLiAgVGhpcyBnZXRzIHVzIHRvIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uCisgICAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OKSAqLworbG9uZyAKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIGxvbmcgcmV0OworCisgIHJldCA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKKyAgaWYgKCEgc3BhcmNfcGljX2NvZGUKKyAgICAgIHx8IGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwKKyAgICAgIHx8IChmaXhQLT5meF9hZGRzeS0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCisgICAgcmV0ICs9IGZpeFAtPmZ4X3NpemU7CisgIHJldHVybiByZXQ7Cit9CisMCisvKiBSZXR1cm4gbG9nMiAoVkFMVUUpLCBvciAtMSBpZiBWQUxVRSBpcyBub3QgYW4gZXhhY3QgcG9zaXRpdmUgcG93ZXIKKyAgIG9mIHR3by4gICovCisKK3N0YXRpYyBpbnQKK2xvZzIgKHZhbHVlKQorICAgICBpbnQgdmFsdWU7Cit7CisgIGludCBzaGlmdDsKKworICBpZiAodmFsdWUgPD0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yIChzaGlmdCA9IDA7ICh2YWx1ZSAmIDEpID09IDA7IHZhbHVlID4+PSAxKQorICAgICsrc2hpZnQ7CisKKyAgcmV0dXJuICh2YWx1ZSA9PSAxKSA/IHNoaWZ0IDogLTE7Cit9CisKKy8qCisgKiBzb3J0IG9mIGxpa2Ugc19sY29tbQorICovCisKKyNpZm5kZWYgT0JKX0VMRgorc3RhdGljIGludCBtYXhfYWxpZ25tZW50ID0gMTU7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3NfcmVzZXJ2ZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyICpwOworICBjaGFyIGM7CisgIGludCBhbGlnbjsKKyAgaW50IHNpemU7CisgIGludCB0ZW1wOworICBzeW1ib2xTICpzeW1ib2xQOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKnAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIGlmICgoc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCisgICAgeworICAgICAgYXNfYmFkIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCBzaXplKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQkJCQkvKiBiYWQgbGVuZ3RoICovCisKKyAgKnAgPSAwOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICpwID0gYzsKKworICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLFwiYnNzXCIiLCA2KSAhPSAwCisgICAgICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIsXCIuYnNzXCIiLCA3KSAhPSAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiYmFkIC5yZXNlcnZlIHNlZ21lbnQgLS0gZXhwZWN0ZWQgQlNTIHNlZ21lbnQiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMl0gPT0gJy4nKQorICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA3OworICBlbHNlCisgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCisJeworCSAgYXNfYmFkIChfKCJtaXNzaW5nIGFsaWdubWVudCIpKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBhbGlnbiA9IChpbnQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisjaWZuZGVmIE9CSl9FTEYKKyAgICAgIGlmIChhbGlnbiA+IG1heF9hbGlnbm1lbnQpCisJeworCSAgYWxpZ24gPSBtYXhfYWxpZ25tZW50OworCSAgYXNfd2FybiAoXygiYWxpZ25tZW50IHRvbyBsYXJnZTsgYXNzdW1pbmcgJWQiKSwgYWxpZ24pOworCX0KKyNlbmRpZgorCisgICAgICBpZiAoYWxpZ24gPCAwKQorCXsKKwkgIGFzX2JhZCAoXygibmVnYXRpdmUgYWxpZ25tZW50IikpOworCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmIChhbGlnbiAhPSAwKQorCXsKKwkgIHRlbXAgPSBsb2cyIChhbGlnbik7CisJICBpZiAodGVtcCA8IDApCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIikpOworCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIGFsaWduID0gdGVtcDsKKwl9CisKKyAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7CisgICAgfQorICBlbHNlCisgICAgYWxpZ24gPSAwOworCisgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKQorI2lmZGVmIE9CSl9BT1VUCisgICAgICAmJiBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMAorICAgICAgJiYgU19HRVRfREVTQyAoc3ltYm9sUCkgPT0gMAorI2VuZGlmCisgICAgICApCisgICAgeworICAgICAgaWYgKCEgbmVlZF9wYXNzXzIpCisJeworCSAgY2hhciAqcGZyYWc7CisJICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKKwkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOworCisJICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMSk7IC8qIHN3aXRjaCB0byBic3MgKi8KKworCSAgaWYgKGFsaWduKQorCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7IC8qIGRvIGFsaWdubWVudCAqLworCisJICAvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZyAqLworCSAgaWYgKFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCisJICAgIHN5bWJvbFAtPnN5X2ZyYWctPmZyX3N5bWJvbCA9IE5VTEw7CisKKwkgIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKwkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAorCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKTApOworCSAgKnBmcmFnID0gMDsKKworCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOworCisJICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOworCisjaWZkZWYgT0JKX0VMRgorCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7CisjZW5kaWYKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfd2FybigiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzIiwKKwkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisgICAgfQkJCQkvKiBpZiBub3QgcmVkZWZpbmluZyAqLworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitzX2NvbW1vbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGNoYXIgKnA7CisgIGludCB0ZW1wLCBzaXplOworICBzeW1ib2xTICpzeW1ib2xQOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCisgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICpwID0gYzsKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCisgIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCisgICAgeworICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgc2l6ZSA9IHRlbXA7CisgICpwID0gMDsKKyAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAqcCA9IGM7CisgIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKKyAgICB7CisgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCisJeworCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCisJCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworI2lmbmRlZiBPQkpfRUxGCisgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7CisgICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisjZW5kaWYKKyAgICB9CisgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCisgICAgeworICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisjaWZuZGVmIE9CSl9FTEYKKyAgICAgIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKKwl7CisJICB0ZW1wID0gbWF4X2FsaWdubWVudDsKKwkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIHRlbXApOworCX0KKyNlbmRpZgorCisgICAgICBpZiAodGVtcCA8IDApCisJeworCSAgYXNfYmFkIChfKCJuZWdhdGl2ZSBhbGlnbm1lbnQiKSk7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKworI2lmZGVmIE9CSl9FTEYKKyAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKKwl7CisJICBzZWdUIG9sZF9zZWM7CisJICBpbnQgb2xkX3N1YnNlYzsKKwkgIGNoYXIgKnA7CisJICBpbnQgYWxpZ247CisKKwkgIG9sZF9zZWMgPSBub3dfc2VnOworCSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7CisKKwkgIGlmICh0ZW1wID09IDApCisJICAgIGFsaWduID0gMDsKKwkgIGVsc2UKKwkgICAgYWxpZ24gPSBsb2cyICh0ZW1wKTsKKworCSAgaWYgKGFsaWduIDwgMCkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7CisJICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlY3Rpb24sIGFsaWduKTsKKwkgIHN1YnNlZ19zZXQgKGJzc19zZWN0aW9uLCAwKTsKKwkgIGlmIChhbGlnbikKKwkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOworCSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQorCSAgICBzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOworCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OworCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCisJCQkob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7CisJICAqcCA9IDA7CisJICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7CisJICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKKwkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOworCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7CisJfQorICAgICAgZWxzZQorI2VuZGlmIC8qIE9CSl9FTEYgKi8KKwl7CisJYWxsb2NhdGVfY29tbW9uOgorCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOworI2lmZGVmIE9CSl9FTEYKKwkgIFNfU0VUX0FMSUdOIChzeW1ib2xQLCB0ZW1wKTsKKwkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOworI2VuZGlmCisJICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisJICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCisJaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLworICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKKwkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQorCXsKKwkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQorCSAgICA7CisJICBpbnB1dF9saW5lX3BvaW50ZXItLTsKKwkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OworCX0KKyAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQorCTsKKyAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOworICAgIH0KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKKyNlbmRpZgorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIHJldHVybjsKKworICB7CisgIGJhZF9jb21tb25fc2VnbWVudDoKKyAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQorICAgICAgcCsrOworICAgIGMgPSAqcDsKKyAgICAqcCA9ICdcMCc7CisgICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOworICAgICpwID0gYzsKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOworICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qIEhhbmRsZSB0aGUgLmVtcHR5IHBzZXVkby1vcC4gIFRoaXMgc3VwcmVzc2VzIHRoZSB3YXJuaW5ncyBhYm91dAorICAgaW52YWxpZCBkZWxheSBzbG90IHVzYWdlLiAgKi8KKworc3RhdGljIHZvaWQKK3NfZW1wdHkgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgLyogVGhlIGVhc3kgd2F5IHRvIGltcGxlbWVudCBpcyB0byBqdXN0IGZvcmdldCBhYm91dCB0aGUgbGFzdAorICAgICBpbnN0cnVjdGlvbi4gICovCisgIGxhc3RfaW5zbiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzX3NlZyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworCisgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcInRleHRcIiIsIDYpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7CisgICAgICBzX3RleHQgKDApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwiZGF0YVwiIiwgNikgPT0gMCkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKKyAgICAgIHNfZGF0YSAoMCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhMVwiIiwgNykgPT0gMCkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKKyAgICAgIHNfZGF0YTEgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJic3NcIiIsIDUpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7CisgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgMiBzZWdtZW50cyAtLSB0ZXh0IGFuZCBkYXRhIC0tIGZvciBub3csIHNvCisJIHRoaW5ncyBpbiB0aGUgImJzcyBzZWdtZW50IiB3aWxsIGhhdmUgdG8gZ28gaW50byBkYXRhIGZvciBub3cuCisJIFlvdSBjYW4gc3RpbGwgYWxsb2NhdGUgU0VHX0JTUyBzdHVmZiB3aXRoIC5sY29tbSBvciAucmVzZXJ2ZS4gKi8KKyAgICAgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMjU1KTsJLyogRklYTUUtU09NRURBWSAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfZGF0YTEgKCkKK3sKKyAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAxKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3NfcHJvYyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgICsraW5wdXRfbGluZV9wb2ludGVyOworfQorCisvKiBUaGlzIHN0YXRpYyB2YXJpYWJsZSBpcyBzZXQgYnkgc191YWNvbnMgdG8gdGVsbCBzcGFyY19jb25zX2FsaWduCisgICB0aGF0IHRoZSBleHBlc3Npb24gZG9lcyBub3QgbmVlZCB0byBiZSBhbGlnbmVkLiAgKi8KKworc3RhdGljIGludCBzcGFyY19ub19hbGlnbl9jb25zID0gMDsKKworLyogVGhpcyBoYW5kbGVzIHRoZSB1bmFsaWduZWQgc3BhY2UgYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBzdWNoIGFzCisgICAudWF3b3JkLiAgLnVhd29yZCBpcyBqdXN0IGxpa2UgLndvcmQsIGJ1dCB0aGUgdmFsdWUgZG9lcyBub3QgbmVlZAorICAgdG8gYmUgYWxpZ25lZC4gICovCisKK3N0YXRpYyB2b2lkCitzX3VhY29ucyAoYnl0ZXMpCisgICAgIGludCBieXRlczsKK3sKKyAgLyogVGVsbCBzcGFyY19jb25zX2FsaWduIG5vdCB0byBhbGlnbiB0aGlzIHZhbHVlLiAgKi8KKyAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDE7CisgIGNvbnMgKGJ5dGVzKTsKK30KKworLyogSWYgdGhlIC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEgb3B0aW9uIGlzIHVzZWQsIHdlIHJlcXVpcmUgLndvcmQsCisgICBldC4gYWwuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseS4gIFdlIGRvIGl0IGJ5IHNldHRpbmcgdXAgYW4KKyAgIHJzX2FsaWduX2NvZGUgZnJhZywgYW5kIGNoZWNraW5nIGluIEhBTkRMRV9BTElHTiB0byBtYWtlIHN1cmUgdGhhdAorICAgbm8gdW5leHBlY3RlZCBhbGlnbm1lbnQgd2FzIGludHJvZHVjZWQuCisKKyAgIFRoZSBTdW5PUyBhbmQgU29sYXJpcyBuYXRpdmUgYXNzZW1ibGVycyBlbmZvcmNlIGFsaWduZWQgZGF0YSBieQorICAgZGVmYXVsdC4gIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdCwgYmVjYXVzZSBnY2MgY2FuIGRlbGliZXJhdGVseQorICAgZ2VuZXJhdGUgbWlzYWxpZ25lZCBkYXRhIGlmIHRoZSBwYWNrZWQgYXR0cmlidXRlIGlzIHVzZWQuICBJbnN0ZWFkLAorICAgd2UgcGVybWl0IG1pc2FsaWduZWQgZGF0YSBieSBkZWZhdWx0LCBhbmQgcGVybWl0IHRoZSB1c2VyIHRvIHNldCBhbgorICAgb3B0aW9uIHRvIGNoZWNrIGZvciBpdC4gICovCisKK3ZvaWQKK3NwYXJjX2NvbnNfYWxpZ24gKG5ieXRlcykKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgaW50IG5hbGlnbjsKKyAgY2hhciAqcDsKKworICAvKiBPbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGVuZm9yY2luZyBhbGlnbmVkIGRhdGEuICAqLworICBpZiAoISBlbmZvcmNlX2FsaWduZWRfZGF0YSkKKyAgICByZXR1cm47CisKKyAgaWYgKHNwYXJjX25vX2FsaWduX2NvbnMpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhbiB1bmFsaWduZWQgcHNldWRvLW9wLiAgKi8KKyAgICAgIHNwYXJjX25vX2FsaWduX2NvbnMgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuYWxpZ24gPSBsb2cyIChuYnl0ZXMpOworICBpZiAobmFsaWduID09IDApCisgICAgcmV0dXJuOworCisgIGFzc2VydCAobmFsaWduID4gMCk7CisKKyAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKyAgICB7CisgICAgICBpZiAoKGFic19zZWN0aW9uX29mZnNldCAmICgoMSA8PCBuYWxpZ24pIC0gMSkpICE9IDApCisJYXNfYmFkIChfKCJtaXNhbGlnbmVkIGRhdGEiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKKwkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIG5hbGlnbiwgKGNoYXIgKikgTlVMTCk7CisKKyAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbmFsaWduKTsKK30KKworLyogVGhpcyBpcyB3aGVyZSB3ZSBkbyB0aGUgdW5leHBlY3RlZCBhbGlnbm1lbnQgY2hlY2suCisgICBUaGlzIGlzIGNhbGxlZCBmcm9tIEhBTkRMRV9BTElHTiBpbiB0Yy1zcGFyYy5oLiAgKi8KKwordm9pZAorc3BhcmNfaGFuZGxlX2FsaWduIChmcmFncCkKKyAgICAgZnJhZ1MgKmZyYWdwOworeworICBpZiAoZnJhZ3AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSAmJiAhZnJhZ3AtPmZyX3N1YnR5cGUKKyAgICAgICYmIGZyYWdwLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfZml4ICE9IDApCisgICAgYXNfYmFkX3doZXJlIChmcmFncC0+ZnJfZmlsZSwgZnJhZ3AtPmZyX2xpbmUsIF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKKyAgaWYgKGZyYWdwLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUgJiYgZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMTAyNCkKKyAgICB7CisgICAgICBpbnQgY291bnQgPSBmcmFncC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2ZpeDsKKyAgICAgIAorICAgICAgaWYgKGNvdW50ID49IDQKKwkgICYmICEoY291bnQgJiAzKQorCSAgJiYgY291bnQgPD0gMTAyNAorCSAgJiYgISgobG9uZykoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KSAmIDMpKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgKnAgPSAodW5zaWduZWQgKikoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KTsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gNCwgcCsrKQorICAgICAgICAgICAgaWYgKElOU05fQklHX0VORElBTikKKyAgICAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoKGNoYXIgKilwLCAweDAxMDAwMDAwLCA0KTsgLyogZW1pdCBub3BzICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKChjaGFyICopcCwgMHgxMDAwMDAwMCwgNCk7CisKKyAgICAgICAgICBpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkgJiYgY291bnQgPiA4KQorICAgICAgICAgICAgeworCSAgICAgIGNoYXIgKndhZGRyID0gJmZyYWdwLT5mcl9saXRlcmFsW2ZyYWdwLT5mcl9maXhdOworCSAgICAgIHVuc2lnbmVkIHd2YWwgPSAoMHgzMDY4MDAwMCB8IGNvdW50ID4+IDIpOyAvKiBiYSxhLHB0ICV4Y2MsIDFmICovCisJICAgICAgaWYgKElOU05fQklHX0VORElBTikKKwkJbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAod2FkZHIsIHd2YWwsIDQpOworCSAgICAgIGVsc2UKKwkJbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAod2FkZHIsIHd2YWwsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgIGZyYWdwLT5mcl92YXIgPSBjb3VudDsKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmZGVmIE9CSl9FTEYKKy8qIFNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBhIFNwYXJjIEVMRiBmaWxlLiAgKi8KKwordm9pZAorc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgKCkKK3sKKyAgLyogU2V0IHRoZSBTcGFyYyBFTEYgZmxhZyBiaXRzLiAgRklYTUU6IFRoZXJlIHNob3VsZCBwcm9iYWJseSBiZSBzb21lCisgICAgIHNvcnQgb2YgQkZEIGludGVyZmFjZSBmb3IgdGhpcy4gICovCisgIGlmIChzcGFyY19hcmNoX3NpemUgPT0gNjQpCisgICAgeworICAgICAgc3dpdGNoIChzcGFyY19tZW1vcnlfbW9kZWwpCisJeworCWNhc2UgTU1fUk1POgorCSAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ1Y5X1JNTzsKKwkgIGJyZWFrOworCWNhc2UgTU1fUFNPOgorCSAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ1Y5X1BTTzsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKKyAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUzsKKyAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKKyAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDX1NVTl9VUzE7Cit9CisjZW5kaWYKKworLyogVGhpcyBpcyBjYWxsZWQgYnkgZW1pdF9leHByIHZpYSBUQ19DT05TX0ZJWF9ORVcgd2hlbiBjcmVhdGluZyBhCisgICByZWxvYyBmb3IgYSBjb25zLiAgV2UgY291bGQgdXNlIHRoZSBkZWZpbml0aW9uIHRoZXJlLCBleGNlcHQgdGhhdAorICAgd2Ugd2FudCB0byBoYW5kbGUgbGl0dGxlIGVuZGlhbiByZWxvY3Mgc3BlY2lhbGx5LiAgKi8KKwordm9pZAorY29uc19maXhfbmV3X3NwYXJjIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCisgICAgIGZyYWdTICpmcmFnOworICAgICBpbnQgd2hlcmU7CisgICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7CisgICAgIGV4cHJlc3Npb25TICpleHA7Cit7CisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOworCisgIHIgPSAobmJ5dGVzID09IDEgPyBCRkRfUkVMT0NfOCA6CisgICAgICAgKG5ieXRlcyA9PSAyID8gQkZEX1JFTE9DXzE2IDoKKwkobmJ5dGVzID09IDQgPyBCRkRfUkVMT0NfMzIgOiBCRkRfUkVMT0NfNjQpKSk7CisKKyAgaWYgKHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgJiYgbmJ5dGVzID09IDQKKyAgICAgICYmIG5vd19zZWctPmZsYWdzICYgU0VDX0FMTE9DKSAgCisgICAgciA9IEJGRF9SRUxPQ19TUEFSQ19SRVYzMjsKKyAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCAoaW50KSBuYnl0ZXMsIGV4cCwgMCwgcik7Cit9CisKKyNpZmRlZiBPQkpfRUxGCitpbnQKK2VsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCisgICAgICBzdHJ1Y3QgZml4ICpmaXhwOworeworICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAorICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCisgICAgcmV0dXJuIDE7CisgCisgIHJldHVybiAwOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc3BhcmMuaCBiL2dhcy9jb25maWcvdGMtc3BhcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTA1NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oCkBAIC0wLDAgKzEsMTY0IEBACisvKiB0Yy1zcGFyYy5oIC0gTWFjcm9zIGFuZCB0eXBlIGRlZmluZXMgZm9yIHRoZSBzcGFyYy4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAtOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKKyAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUQ19TUEFSQworI2RlZmluZSBUQ19TUEFSQyAxCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3N0cnVjdCBmcmFnOworI2VuZGlmCisKKy8qIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGB0YXJnZXRfYmlnX2VuZGlhbicuICAqLworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCisKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9zcGFyYworCitleHRlcm4gY29uc3QgY2hhciAqc3BhcmNfdGFyZ2V0X2Zvcm1hdCBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgc3BhcmNfdGFyZ2V0X2Zvcm1hdCAoKQorCisjaWYgMAorI2lmZGVmIFRFX1NQQVJDQU9VVAorLyogQmktZW5kaWFuIHN1cHBvcnQgbWF5IGV2ZW50dWFsbHkgYmUgdW5jb25kaXRpb25hbCwgYnV0IHVudGlsIHRoaW5ncyBhcmUKKyAgIHdvcmtpbmcgd2VsbCBpdCdzIG9ubHkgcHJvdmlkZWQgZm9yIHRhcmdldHMgdGhhdCBuZWVkIGl0LiAgKi8KKyNkZWZpbmUgU1BBUkNfQklFTkRJQU4KKyNlbmRpZgorI2VuZGlmCisvKiBNYWtlIGl0IHVuY29uZGl0aW9uYWwgYW5kIGNoZWNrIGlmIC1FTCBpcyB2YWxpZCBhZnRlciBvcHRpb24gcGFyc2luZyAqLworI2RlZmluZSBTUEFSQ19CSUVORElBTgorCisjZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKKworI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQl7YXNfZmF0YWwgKF8oInNwYXJjIGNvbnZlcnRfZnJhZ1xuIikpO30KKyNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCisJCQkoYXNfZmF0YWwoXygiZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggY2FsbGVkIikpLDEpCisKKyNkZWZpbmUgTElTVElOR19IRUFERVIgIlNQQVJDIEdBUyAiCisKK2V4dGVybiBpbnQgc3BhcmNfcGljX2NvZGU7CisKKyNkZWZpbmUgbWRfZG9fYWxpZ24obiwgZmlsbCwgbGVuLCBtYXgsIGFyb3VuZCkJCQkJXAoraWYgKChuKSAmJiAobikgPD0gMTAgJiYgIW5lZWRfcGFzc18yICYmICEoZmlsbCkJCQkJXAorICAgICYmIG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCQlcCisgIHsJCQkJCQkJCQlcCisgICAgY2hhciAqcDsJCQkJCQkJCVwKKyAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEgPDwgbiwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMTAyNCwJXAorICAgICAgICAgICAgICAgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCisgICAgKnAgPSAweDAwOwkJCQkJCQkJXAorICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCisgIH0KKworLyogV2UgcmVxdWlyZSAud29yZCwgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICAqLworI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykgc3BhcmNfY29uc19hbGlnbiAobmJ5dGVzKQorZXh0ZXJuIHZvaWQgc3BhcmNfY29uc19hbGlnbiBQQVJBTVMgKChpbnQpKTsKKyNkZWZpbmUgSEFORExFX0FMSUdOKGZyYWdwKSBzcGFyY19oYW5kbGVfYWxpZ24gKGZyYWdwKQorZXh0ZXJuIHZvaWQgc3BhcmNfaGFuZGxlX2FsaWduIFBBUkFNUyAoKHN0cnVjdCBmcmFnICopKTsKKworI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9BT1VUKQorCisvKiBUaGlzIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlIGlmIHRoZSByZWxvY2F0aW9uIGlzIGZvciBhIGxvY2FsCisgICBvYmplY3QgZm9yIHdoaWNoIHdlIHN0aWxsIHdhbnQgdG8gZG8gdGhlIHJlbG9jYXRpb24gYXQgcnVudGltZS4KKyAgIFRydWUgaWYgd2UgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcKKyAgIHRoZSAubyBmaWxlLgorCisgICBJZiB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLCB0aGVuIHRoZQorICAgYS5vdXQgYXNzZW1ibGVyIHNob3VsZCBub3QgZG8gdGhlIHJlbG9jYXRpb24gaWYgZ2VuZXJhdGluZyBQSUMsIGFuZAorICAgdGhlIEVMRiBhc3NlbWJsZXIgc2hvdWxkIG5ldmVyIGRvIHRoZSByZWxvY2F0aW9uLiAgKi8KKworI2lmZGVmIE9CSl9FTEYKKyNkZWZpbmUgb2JqX3JlbG9jYXRlX2V4dGVybiAwCisjZWxzZQorI2RlZmluZSBvYmpfcmVsb2NhdGVfZXh0ZXJuICghIHNwYXJjX3BpY19jb2RlKQorI2VuZGlmCisKKyNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKKyAgKG9ial9yZWxvY2F0ZV9leHRlcm4gXAorICAgfHwgKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAorICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCisgICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAorICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCisgICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCisjZW5kaWYKKworLyogSSBrbm93IHRoYXQgImNhbGwgMCIgZmFpbHMgaW4gc3BhcmMtY29mZiBpZiB0aGlzIGRvZXNuJ3QgcmV0dXJuIDEuICBJCisgICBkb24ndCBrbm93IGFib3V0IG90aGVyIHJlbG9jYXRpb24gdHlwZXMsIG9yIG90aGVyIGZvcm1hdHMsIHlldC4gICovCisjaWZkZWYgT0JKX0NPRkYKKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQlcCisJKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiBcCisJICYmICgoRklYUCktPmZ4X2FkZHN5ID09IDAgXAorCSAgICAgfHwgU19HRVRfU0VHTUVOVCAoKEZJWFApLT5meF9hZGRzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCisjZGVmaW5lIFJFTE9DX1JFUVVJUkVTX1NZTUJPTAorI2VuZGlmCisKKyNpZmRlZiBPQkpfRUxGCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQorZXh0ZXJuIGludCBlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworI2VuZGlmCisKKyNkZWZpbmUgTURfQVBQTFlfRklYMworI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKKworI2lmZGVmIE9CSl9FTEYKKy8qIEtlZXAgcmVsb2NhdGlvbnMgYWdhaW5zdCBnbG9iYWwgc3ltYm9scy4gIERvbid0IHR1cm4gdGhlbSBpbnRvCisgICByZWxvY2F0aW9ucyBhZ2FpbnN0IHNlY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGR5bmFtaWMKKyAgIGxpbmtlciB0byBvcGVyYXRlIHByb3Blcmx5LiAgV2hlbiBnZW5lcmF0aW5nIFBJQywgd2UgbmVlZCB0byBrZWVwCisgICBhbnkgbm9uIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KKyNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKKyAgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCQkJXAorICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKKyAgICYmICghIHNwYXJjX3BpY19jb2RlCQkJCQkJCVwKKyAgICAgICB8fCAoRklYKS0+ZnhfcGNyZWwJCQkJCQlcCisgICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCQlcCisJICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQkJXAorCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCisgICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FICgoRklYKS0+ZnhfYWRkc3kpLCAnXDAwMScpICE9IE5VTEwJCVwKKyAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKChGSVgpLT5meF9hZGRzeSksICdcMDAyJykgIT0gTlVMTCkpCisjZW5kaWYKKworI2lmZGVmIE9CSl9BT1VUCisvKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG11c3Qgbm90IGFkanVzdCBhbnkgcmVsb2Mgd2hpY2ggd2lsbAorICAgdHVybiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgbm9yIGFueSByZWxvYworICAgd2hpY2ggd2Ugd2lsbCBuZWVkIGlmIGEgc3ltYm9sIGlzIG92ZXJyaWRkZW4uICAqLworI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpCQkJCQkJXAorICAoISBzcGFyY19waWNfY29kZQkJCQkJCQlcCisgICB8fCAoKEZJWCktPmZ4X3BjcmVsCQkJCQkJCVwKKyAgICAgICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKKwkgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAorCSAgICAgICAmJiAhIFNfSVNfV0VBSyAoKEZJWCktPmZ4X2FkZHN5KSkpKQkJCVwKKyAgIHx8IChGSVgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2CQkJCQlcCisgICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMikKKyNlbmRpZgorCisjZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nIHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nCitleHRlcm4gdm9pZCBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCitleHRlcm4gdm9pZCBzcGFyY19tZF9lbmQgUEFSQU1TICgodm9pZCkpOworI2RlZmluZSBtZF9lbmQoKSBzcGFyY19tZF9lbmQgKCkKKworI2VuZGlmCisKKyNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19zcGFyYworZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X3NwYXJjCisgIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGludCwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgZXhwcmVzc2lvblMgKikpOworCisvKiBlbmQgb2YgdGMtc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10YWhvZS5jIGIvZ2FzL2NvbmZpZy90Yy10YWhvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDYzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXRhaG9lLmMKQEAgLTAsMCArMSwyMDI3IEBACisvKiB0Yy10YWhvZS5jCisgICBOb3QgcGFydCBvZiBHQVMgeWV0LiAqLworCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisKKy8qIHRoaXMgYml0IGdsb21tZWQgZnJvbSB0YWhvZS1pbnN0LmggKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJ5dGU7Cit0eXBlZGVmIGJ5dGUgdGFob2Vfb3Bjb2RlVDsKKworLyoKKyAqIFRoaXMgaXMgcGFydCBvZiB0YWhvZS1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCisgKiBXZSB3YW50IHRvIHBhcnNlIGEgdGFob2UgaW5zdHJ1Y3Rpb24gdGV4dCBpbnRvIGEgdHJlZSBkZWZpbmVkIGhlcmUuCisgKi8KKworI2RlZmluZSBUSVRfTUFYX09QRVJBTkRTICg0KQkvKiBtYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBpbiBvbmUKKwkJCQkgICBzaW5nbGUgdGFob2UgaW5zdHJ1Y3Rpb24gKi8KKworc3RydWN0IHRvcAkJCS8qIHRhaG9lIGluc3RydWN0aW9uIG9wZXJhbmQgKi8KK3sKKyAgaW50IHRvcF9uZHg7CQkJLyogLTEsIG9yIGluZGV4IHJlZ2lzdGVyLiBlZyA3PVtSN10gKi8KKyAgaW50IHRvcF9yZWc7CQkJLyogLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgNyA9IFI3IG9yIChSNykgKi8KKyAgYnl0ZSB0b3BfbW9kZTsJCS8qIEFkZHJlc3NpbmcgbW9kZSBieXRlLiBUaGlzIGJ5dGUsIGRlZmluZXMKKwkJCQkgICB3aGljaCBvZiB0aGUgMTEgbW9kZXMgb3Bjb2RlIGlzLiAqLworCisgIGNoYXIgdG9wX2FjY2VzczsJCS8qIEFjY2VzcyB0eXBlIHdhbnRlZCBmb3IgdGhpcyBvcHBlcmFuZAorCQkJCSAgICdiJ2JyYW5jaCAnICduby1pbnN0cnVjdGlvbiAnYW1ydncnICovCisgIGNoYXIgdG9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCBleHBlY3RlZCwgb25lIG9mICJid2xxPy06ISIgKi8KKworICBjaGFyICp0b3BfZXJyb3I7CQkvKiBTYXkgaWYgb3BlcmFuZCBpcyBpbmFwcHJvcHJpYXRlICAgICAgICAgKi8KKworICBzZWdUIHNlZ19vZl9vcGVyYW5kOwkJLyogc2VnbWVudCBhcyByZXR1cm5lZCBieSBleHByZXNzaW9uKCkqLworCisgIGV4cHJlc3Npb25TIGV4cF9vZl9vcGVyYW5kOwkvKiBUaGUgZXhwcmVzc2lvbiBhcyBwYXJzZWQgYnkgZXhwcmVzc2lvbigpKi8KKworICBieXRlIHRvcF9kaXNwc2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgZGlzcGxhY2VtZW50IGlmIHdlCisJCQkJICAgY2FuIGZpZ3VyZSBpdCBvdXQgKi8KK307CisKKy8qIFRoZSBhZGRyZXNzaW5nIG1vZGVzIGZvciBhbiBvcGVyYW5kLiBUaGVzZSBudW1iZXJzIGFyZSB0aGUgYWN1dGFsIHZhbHVlcworICAgZm9yIGNlcnRhaW4gbW9kZXMsIHNvIGJlIGNhcmVmdWxsIGlmIHlvdSBzY3JldyB3aXRoIHRoZW0uICovCisjZGVmaW5lIFRBSE9FX0RJUkVDVF9SRUcgKDB4NTApCisjZGVmaW5lIFRBSE9FX1JFR19ERUZFUlJFRCAoMHg2MCkKKworI2RlZmluZSBUQUhPRV9SRUdfRElTUCAoMHhFMCkKKyNkZWZpbmUgVEFIT0VfUkVHX0RJU1BfREVGRVJSRUQgKDB4RjApCisKKyNkZWZpbmUgVEFIT0VfSU1NRURJQVRFICgweDhGKQorI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfQllURSAoMHg4OCkKKyNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX1dPUkQgKDB4ODkpCisjZGVmaW5lIFRBSE9FX0lNTUVESUFURV9MT05HV09SRCAoMHg4RikKKyNkZWZpbmUgVEFIT0VfQUJTT0xVVEVfQUREUiAoMHg5RikKKworI2RlZmluZSBUQUhPRV9ESVNQTEFDRURfUkVMQVRJVkUgKDB4RUYpCisjZGVmaW5lIFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEICgweEZGKQorCisjZGVmaW5lIFRBSE9FX0FVVE9fREVDICgweDdFKQorI2RlZmluZSBUQUhPRV9BVVRPX0lOQyAoMHg4RSkKKyNkZWZpbmUgVEFIT0VfQVVUT19JTkNfREVGRVJSRUQgKDB4OUUpCisvKiBJTkRFWEVEX1JFRyBpcyBkZWNpZGVkIGJ5IHRoZSBleGlzdGFuY2Ugb3IgbGFjayBvZiBhIFtyZWddICovCisKKy8qIFRoZXNlIGFyZSBlbmNvZGVkIGludG8gdG9wX3dpZHRoIHdoZW4gdG9wX2FjY2Vzcz09J2InCisgICBhbmQgaXQncyBhIHBzdWVkbyBvcC4qLworI2RlZmluZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUCAgICAgICctJworI2RlZmluZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QICc/JworI2RlZmluZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVAgICAgICchJworI2RlZmluZSBUQUhPRV9XSURUSF9CSUdfTk9OX1JFVl9KVU1QICc6JworCisvKiBUaGUgaGV4IGNvZGUgZm9yIGNlcnRhaW4gdGFob2UgY29tbWFuZHMgYW5kIG1vZGVzLgorICAgVGhpcyBpcyBqdXN0IGZvciByZWFkYWJpbGl0eS4gKi8KKyNkZWZpbmUgVEFIT0VfSk1QICgweDcxKQorI2RlZmluZSBUQUhPRV9QQ19SRUxfTE9ORyAoMHhFRikKKyNkZWZpbmUgVEFIT0VfQlJCICgweDExKQorI2RlZmluZSBUQUhPRV9CUlcgKDB4MTMpCisvKiBUaGVzZSwgd2hlbiAnb3JlZCcgd2l0aCwgb3IgYWRkZWQgdG8sIGEgcmVnaXN0ZXIgbnVtYmVyLAorICAgc2V0IHVwIHRoZSBudW1iZXIgZm9yIHRoZSBkaXNwbGFjZW1lbnQgbW9kZS4gKi8KKyNkZWZpbmUgVEFIT0VfUENfT1JfQllURSAoMHhBMCkKKyNkZWZpbmUgVEFIT0VfUENfT1JfV09SRCAoMHhDMCkKKyNkZWZpbmUgVEFIT0VfUENfT1JfTE9ORyAoMHhFMCkKKworc3RydWN0IHRpdAkJCS8qIGdldCBpdCBvdXQgb2YgdGhlIHNld2VyLCBpdCBzdGFuZHMgZm9yCisJCQkJICAgdGFob2UgaW5zdHJ1Y3Rpb24gdHJlZSAoR2VlemUhKSAqLworeworICB0YWhvZV9vcGNvZGVUIHRpdF9vcGNvZGU7CS8qIFRoZSBvcGNvZGUuICovCisgIGJ5dGUgdGl0X29wZXJhbmRzOwkJLyogSG93IG1hbnkgb3BlcmFuZHMgYXJlIGhlcmUuICovCisgIHN0cnVjdCB0b3AgdGl0X29wZXJhbmRbVElUX01BWF9PUEVSQU5EU107CS8qIE9wZXJhbmRzICovCisgIGNoYXIgKnRpdF9lcnJvcjsJCS8qICIiIG9yIGZhdGFsIGVycm9yIHRleHQgKi8KK307CisKKy8qIGVuZDogdGFob2UtaW5zdC5oICovCisKKy8qIHRhaG9lLmMgLSB0YWhvZS1zcGVjaWZpYyAtCisgICBOb3QgcGFydCBvZiBnYXMgeWV0LgorICAgKi8KKworI2luY2x1ZGUgIm9wY29kZS90YWhvZS5oIgorCisvKiBUaGlzIGlzIHRoZSBudW1iZXIgdG8gcHV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGEub3V0IGZpbGUgKi8KK2xvbmcgb21hZ2ljID0gT01BR0lDOworCisvKiBUaGVzZSBjaGFycyBzdGFydCBhIGNvbW1lbnQgYW55d2hlcmUgaW4gYSBzb3VyY2UgZmlsZSAoZXhjZXB0IGluc2lkZQorICAgYW5vdGhlciBjb21tZW50IG9yIGEgcXVvdGVkIHN0cmluZy4gKi8KK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiM7IjsKKworLyogVGhlc2UgY2hhcnMgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICovCitjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOworCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisgICBhcyBpbiAwZjEyMy40NTYKKyAgIG9yICAgIDBkMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKQorICAgTm90ZTogVGhlIFRhaG9lIHBvcnQgZG9lc24ndCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4gVGhpcyBpcworICAgICAgICAgY29uc2lzdGFudCB3aXRoICdhcycgSWYgaXQncyBuZWVkZWQsIEkgY2FuIGFsd2F5cyBhZGQgaXQgbGF0ZXIuICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImRmIjsKKworLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQorICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKKyAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLgorICAgKFRoZSB0YWhvZSBoYXMgcGxlbnR5IG9mIHJvb20sIHNvIHRoZSBjaGFuZ2UgY3VycmVudGx5IGlzbid0IG5lZWRlZC4pCisgICAqLworCitzdGF0aWMgc3RydWN0IHRpdCB0OwkJLyogQSB0YWhvZSBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KKwordm9pZCBmbG9hdF9jb25zICgpOworLyogQSB0YWJsZSBvZiBwc2V1ZG8gb3BzIChzYW5zIC4pLCB0aGUgZnVuY3Rpb24gY2FsbGVkLCBhbmQgYW4gaW50ZWdlciBvcAorICAgdGhhdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICovCisKK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKKyAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAorICB7MH0KK307CisMCisvKgorICogRm9yIFRhaG9lLCByZWxhdGl2ZSBhZGRyZXNzZXMgb2YgImp1c3QgdGhlIHJpZ2h0IGxlbmd0aCIgYXJlIHByZXR0eSBlYXN5LgorICogVGhlIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYWx3YXlzIHRoZSBsYXN0IG9wZXJhbmQsIGV2ZW4gaW4KKyAqIHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuCisgKiBGb3IgVGFob2UsIHdlIGVuY29kZSB0aGUgcmVsYXhfc3Vic3RhdGVUcyAoaW4gZS5nLiBmcl9zdWJzdGF0ZSkgYXM6CisgKgorICoJCSAgICA0ICAgICAgIDMgICAgICAgMiAgICAgICAxICAgICAgIDAJICAgICBiaXQgbnVtYmVyCisgKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgKgkJfCAgICAgd2hhdCBzdGF0ZSA/CXwgIGhvdyBsb25nID8JfAorICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICoKKyAqIFRoZSAiaG93IGxvbmciIGJpdHMgYXJlIDAwPWJ5dGUsIDAxPXdvcmQsIDEwPWxvbmcuCisgKiBUaGlzIGlzIGEgVW4qeCBjb252ZW50aW9uLgorICogTm90IGFsbCBsZW5ndGhzIGFyZSBsZWdpdCBmb3IgYSBnaXZlbiB2YWx1ZSBvZiAod2hhdCBzdGF0ZSkuCisgKiBUaGUgZm91ciBzdGF0ZXMgYXJlIGxpc3RlZCBiZWxvdy4KKyAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCisgKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCisgKgorCitTdGF0ZXMgZm9yIFRhaG9lIGFkZHJlc3MgcmVsYXhpbmcuCisxLglUQUhPRV9XSURUSF9BTFdBWVNfSlVNUCAoLSkKKwlGb3JtYXQ6ICJiLSIKKwlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKKwkJanIJCTExCisJCWpicgkJMTEKKwlTaW1wbGUgYnJhbmNoLgorCUFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCisJSWYgd29yZCBvciBsb25nd29yZCwgY2hhbmdlIG9wY29kZSB0byBicncgb3Igam1wLgorCisJCisyLglUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QICg/KQorCUo8Y29uZD4gd2hlcmUgPGNvbmQ+IGlzIGEgc2ltcGxlIGZsYWcgdGVzdC4KKwlGb3JtYXQ6ICJiPyIKKwlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKKwkJam5lcS9qbmVxdQkyMQorCQlqZXFsL2plcWx1CTMxCisJCWpndHIJCTQxCisJCWpsZXEJCTUxCisJCWpnZXEJCTgxCisJCWpsc3MJCTkxCisJCWpndHJ1CQlhMQorCQlqbGVxdQkJYjEKKwkJanZjCQljMQorCQlqdnMJCWQxCisJCWpsc3N1L2pjcwllMQorCQlqZ2VxdS9qY2MJZjEKKwlBbHdheXMsIHlvdSBjb21wbGVtZW50IDR0aCBiaXQgdG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uLgorCUFsd2F5cywgMS1ieXRlIG9wY29kZSwgdGhlbiAxLWJ5dGUgZGlzcGxhY2VtZW50LgorCiszLglUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVAgKCEpCisJSmJjL0picyB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KKwlGb3JtYXQ6ICJybHZsYiEiCisJVGFob2Ugb3Bjb2RlcyBhcmU6CShIZXgpCisJCWpicwkJMGUKKwkJamJjCQkxZQorCUFsd2F5cywgeW91IGNvbXBsZW1lbnQgNHRoIGJpdCB0byByZXZlcnNlIHRoZSBjb25kaXRpb24uCisJQWx3YXlzLCAxLWJ5dGUgb3BjZGUsIGxvbmd3b3JkLCBsb25nd29yZC1hZGRyZXNzLCAxLXdvcmQtZGlzcGxhY2VtZW50CisKKzQuCVRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVAgKDopCisJSmFvYmxYWC9KYnNzaQorCUZvcm1hdDogInJsbWxiOiIKKwlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKKwkJYW9qbHNzCQkyZgorCQlqYW9ibHNzCQkyZgorCQlhb2psZXEJCTNmCisJCWphb2JsZXEJCTNmCisJCWpic3NpCQk1ZgorCUFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCisJZGlzcGxhY2VtZW50LgorCitXZSBuZWVkIHRvIG1vZGlmeSB0aGUgb3Bjb2RlIGlzIGZvciBjbGFzcyAxLCAyIGFuZCAzIGluc3RydWN0aW9ucy4KK0FmdGVyIHJlbGF4KCkgd2UgbWF5IGNvbXBsZW1lbnQgdGhlIDR0aCBiaXQgb2YgMiBvciAzIHRvIHJldmVyc2Ugc2Vuc2Ugb2YKK2JyYW5jaC4KKworV2Ugc29tZXRpbWVzIHN0b3JlIGNvbnRleHQgaW4gdGhlIG9wZXJhbmQgbGl0ZXJhbC4gVGhpcyB3YXkgd2UgY2FuIGZpZ3VyZSBvdXQKK2FmdGVyIHJlbGF4KCkgd2hhdCB0aGUgb3JpZ2luYWwgYWRkcmVzc2luZyBtb2RlIHdhcy4gKFdhcyBpcyBwY19yZWwsIG9yCitwY19yZWxfZGlzcD8gVGhhdCBzb3J0IG9mIHRoaW5nLikgKi8KKwwKKy8qIFRoZXNlIGRpc3BsYWNlbWVudHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBTVEFSVCBhZGRyZXNzIG9mIHRoZQorICAgZGlzcGxhY2VtZW50IHdoaWNoIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZGlzcGxhY2VtZW50LCBub3QgdGhlIGVuZCBvZgorICAgdGhlIGluc3RydWN0aW9uLiBUaGUgaGFyZHdhcmUgcGNfcmVsIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucy4KKyAgIFRoYXQncyB3aHkgYWxsIHRoZSBkaXNwbGFjZW1lbnRzIGhhdmUgdGhlIGxlbmd0aCBvZiB0aGUgZGlzcGxhY2VtZW50IGFkZGVkCisgICB0byB0aGVtLiAoV0YgKyBsZW5ndGgod29yZCkpCisKKyAgIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4KKyAgIDJuZCBsZXR0ZXIgaXMgRm9yd2FyZCwgQmFja3dhcmQuICovCisjZGVmaW5lIEJGICgxKyAxMjcpCisjZGVmaW5lIEJCICgxKy0xMjgpCisjZGVmaW5lIFdGICgyKyAzMjc2NykKKyNkZWZpbmUgV0IgKDIrLTMyNzY4KQorLyogRG9udCBuZWVkIExGLCBMQiBiZWNhdXNlIHRoZXkgYWx3YXlzIHJlYWNoLiBbVGhleSBhcmUgY29kZWQgYXMgMC5dICovCisKKyNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCisvKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCisjZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKKyNkZWZpbmUgUkVMQVhfU1RBVEUod2hhdCkgKCh3aGF0KSA+PiAyKQorI2RlZmluZSBSRUxBWF9MRU5HVEgobGVuZ3RoKSAoKGxlbmd0aCkgJiYgMykKKworI2RlZmluZSBTVEFURV9BTFdBWVNfQlJBTkNIICAgICAgICAgICAgICgxKQorI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0ggICAgICAgICgyKQorI2RlZmluZSBTVEFURV9CSUdfUkVWX0JSQU5DSCAgICAgICAgICAgICgzKQorI2RlZmluZSBTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0ggICAgICAgICg0KQorI2RlZmluZSBTVEFURV9QQ19SRUxBVElWRQkJKDUpCisKKyNkZWZpbmUgU1RBVEVfQllURSAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU1RBVEVfV09SRCAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgU1RBVEVfTE9ORyAgICAgICAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgU1RBVEVfVU5ERiAgICAgICAgICAgICAgICAgICAgICAoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLworCisvKiBUaGlzIGlzIHRoZSB0YWJsZSB1c2VkIGJ5IGdhcyB0byBmaWd1cmUgb3V0IHJlbGF4aW5nIG1vZGVzLiBUaGUgZmllbGRzIGFyZQorICAgZm9yd2FyZF9icmFuY2ggcmVhY2gsIGJhY2t3YXJkX2JyYW5jaCByZWFjaCwgbnVtYmVyIG9mIGJ5dGVzIGl0IHdvdWxkIHRha2UsCisgICB3aGVyZSB0aGUgbmV4dCBiaWdnZXN0IGJyYW5jaCBpcy4gKi8KK2NvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQoreworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMQkqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMgkqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDAsMwkqLworLyogVW5jb25kaXRpb25hbCBicmFuY2ggY2FzZXMgImpyYiIKKyAgICAgVGhlIHJlbGF4IHBhcnQgaXMgdGhlIGFjdHVhbCBkaXNwbGFjZW1lbnQgKi8KKyAgeworICAgIEJGLCBCQiwgMSwgQyAoMSwgMSkKKyAgfSwJCQkJLyogYnJiIEJgZm9vCSAgICAxLDAgKi8KKyAgeworICAgIFdGLCBXQiwgMiwgQyAoMSwgMikKKyAgfSwJCQkJLyogYnJ3IFdgZm9vCSAgICAxLDEgKi8KKyAgeworICAgIDAsIDAsIDUsIDAKKyAgfSwJCQkJLyogSm1wIExgZm9vCSAgICAxLDIgKi8KKyAgeworICAgIDEsIDEsIDAsIDAKKyAgfSwJCQkJLyogdW51c2VkCSAgICAxLDMgKi8KKy8qIFJldmVyc2libGUgQ29uZGl0aW9uYWwgQnJhbmNoLiBJZiB0aGUgYnJhbmNoIHdvbid0IHJlYWNoLCByZXZlcnNlCisgICAgIGl0LCBhbmQganVtcCBvdmVyIGEgYnJ3IG9yIGEgam1wIHRoYXQgd2lsbCByZWFjaC4gVGhlIHJlbGF4IHBhcnQgaXMgdGhlCisgICAgIGFjdHVhbCBhZGRyZXNzLiAqLworICB7CisgICAgQkYsIEJCLCAxLCBDICgyLCAxKQorICB9LAkJCQkvKiBiPGNvbmQ+IEJgZm9vICAgIDIsMCAqLworICB7CisgICAgV0YgKyAyLCBXQiArIDIsIDQsIEMgKDIsIDIpCisgIH0sCQkJCS8qIGJyZXYgb3ZlciwgYnJ3IFdgZm9vLCBvdmVyOiAyLDEgKi8KKyAgeworICAgIDAsIDAsIDcsIDAKKyAgfSwJCQkJLyogYnJldiBvdmVyLCBqbXAgTGBmb28sIG92ZXI6IDIsMiAqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDIsMyAqLworLyogQW5vdGhlciB0eXBlIG9mIHJldmVyc2FibGUgYnJhbmNoLiBCdXQgdGhpcyBvbmx5IGhhcyBhIHdvcmQKKyAgICAgZGlzcGxhY2VtZW50LiAqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDMsMCAqLworICB7CisgICAgV0YsIFdCLCAyLCBDICgzLCAyKQorICB9LAkJCQkvKiBqYlggV2Bmb28JICAgIDMsMSAqLworICB7CisgICAgMCwgMCwgOCwgMAorICB9LAkJCQkvKiBqcmV2WCBvdmVyLCBqbXAgTGBmb28sIG92ZXI6ICAzLDIgKi8KKyAgeworICAgIDEsIDEsIDAsIDAKKyAgfSwJCQkJLyogdW51c2VkCSAgICAzLDMgKi8KKy8qIFRoZXNlIGFyZSB0aGUgbm9uIHJldmVyc2FibGUgYnJhbmNoZXMsIGFsbCBvZiB3aGljaCBoYXZlIGEgd29yZAorICAgICBkaXNwbGFjZW1lbnQuIElmIEkgY2FuJ3QgcmVhY2gsIGJyYW5jaCBvdmVyIGEgYnl0ZSBicmFuY2gsIHRvIGEKKyAgICAganVtcCB0aGF0IHdpbGwgcmVhY2guIFRoZSBqdW1wZWQgYnJhbmNoIGp1bXBzIG92ZXIgdGhlIHJlYWNoaW5nCisgICAgIGJyYW5jaCwgdG8gY29udGludWUgd2l0aCB0aGUgZmxvdyBvZiB0aGUgcHJvZ3JhbS4gSXQncyBsaWtlIHBsYXlpbmcKKyAgICAgbGVhcCBmcm9nLiAqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDQsMCAqLworICB7CisgICAgV0YsIFdCLCAyLCBDICg0LCAyKQorICB9LAkJCQkvKiBhb2JsXyBXYGZvbwkgICAgNCwxICovCisgIHsKKyAgICAwLCAwLCAxMCwgMAorICB9LAkJCQkvKmFvYmxfIFdgaG9wLGJyIG92ZXIsaG9wOiBqbXAgTF5mb28sb3ZlciA0LDIqLworICB7CisgICAgMSwgMSwgMCwgMAorICB9LAkJCQkvKiB1bnVzZWQJICAgIDQsMyAqLworLyogTm9ybWFsIGRpc3BsYWNlbWVudCBtb2RlLCBubyBqdW1waW5nIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4KKyAgICAgVGhlIHJlbGF4IHBvaW50cyB0byBvbmUgYnl0ZSBiZWZvcmUgdGhlIGFkZHJlc3MsIHRoYXRzIHdoeSBhbGwKKyAgICAgdGhlIG51bWJlcnMgYXJlIHVwIGJ5IG9uZS4gKi8KKyAgeworICAgIEJGICsgMSwgQkIgKyAxLCAyLCBDICg1LCAxKQorICB9LAkJCQkvKiBCXiJmb28iCSAgICA1LDAgKi8KKyAgeworICAgIFdGICsgMSwgV0IgKyAxLCAzLCBDICg1LCAyKQorICB9LAkJCQkvKiBXXiJmb28iCSAgICA1LDEgKi8KKyAgeworICAgIDAsIDAsIDUsIDAKKyAgfSwJCQkJLyogTF4iZm9vIgkgICAgNSwyICovCisgIHsKKyAgICAxLCAxLCAwLCAwCisgIH0sCQkJCS8qIHVudXNlZAkgICAgNSwzICovCit9OworCisjdW5kZWYgQworI3VuZGVmIEJGCisjdW5kZWYgQkIKKyN1bmRlZiBXRgorI3VuZGVmIFdCCisvKiBFbmQgcmVsYXggc3R1ZmYgKi8KKwwKKy8qIEhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUuICBOVUxMIG1lYW5zIGFueSB1c2UgYmVmb3JlCisgICBtZF9iZWdpbigpIHdpbGwgY3Jhc2guICAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2g7CisKKy8qIEluaXQgZnVuY3Rpb24uIEJ1aWxkIHRoZSBoYXNoIHRhYmxlLiAqLwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgc3RydWN0IHRvdCAqdFA7CisgIGNoYXIgKmVycm9ydmFsID0gMDsKKyAgaW50IHN5bnRoZXRpY190b28gPSAxOwkvKiBJZiAwLCBqdXN0IHVzZSByZWFsIG9wY29kZXMuICovCisKKyAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOworCisgIGZvciAodFAgPSB0b3RzdHJzOyAqdFAtPm5hbWUgJiYgIWVycm9ydmFsOyB0UCsrKQorICAgIGVycm9ydmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHRQLT5uYW1lLCAmdFAtPmRldGFpbCk7CisKKyAgaWYgKHN5bnRoZXRpY190b28pCisgICAgZm9yICh0UCA9IHN5bnRoZXRpY190b3RzdHJzOyAqdFAtPm5hbWUgJiYgIWVycm9ydmFsOyB0UCsrKQorICAgICAgZXJyb3J2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdFAtPm5hbWUsICZ0UC0+ZGV0YWlsKTsKKworICBpZiAoZXJyb3J2YWwpCisgICAgYXNfZmF0YWwgKGVycm9ydmFsKTsKK30KKwwKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJhZDpTVHQ6ViI7CitzdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7CisgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KK307CitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CisKK2ludAorbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCisgICAgIGludCBjOworICAgICBjaGFyICphcmc7Cit7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAnYSc6CisgICAgICBhc193YXJuIChfKCJUaGUgLWEgb3B0aW9uIGRvZXNuJ3QgZXhpc3QuIChEZXNwaXRlIHdoYXQgdGhlIG1hbiBwYWdlIHNheXMhIikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgIGFzX3dhcm4gKF8oIkRpc3BsYWNlbWVudCBsZW5ndGggJXMgaWdub3JlZCEiKSwgYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUyc6CisgICAgICBhc193YXJuIChfKCJTWU1CT0wgVEFCTEUgbm90IGltcGxlbWVudGVkIikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdUJzoKKyAgICAgIGFzX3dhcm4gKF8oIlRPS0VOIFRSQUNFIG5vdCBpbXBsZW1lbnRlZCIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndCc6CisgICAgICBhc193YXJuIChfKCJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIpLCBhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdWJzoKKyAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgdXNlIGFuIGludGVycGFzcyBmaWxlISAtViBpZ25vcmVkIikpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKKyAgZnByaW50ZihzdHJlYW0sIF8oIlwKK1RhaG9lIG9wdGlvbnM6XG5cCistYQkJCWlnbm9yZWRcblwKKy1kIExFTkdUSAkJaWdub3JlZFxuXAorLUoJCQlpZ25vcmVkXG5cCistUwkJCWlnbm9yZWRcblwKKy10IEZJTEUJCQlpZ25vcmVkXG5cCistVAkJCWlnbm9yZWRcblwKKy1WCQkJaWdub3JlZFxuIikpOworfQorDAorLyogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gdGFrZSBudW1iZXJzIGluIHRoZSBtYWNoaW5lIGZvcm1hdCwgYW5kCisgICBtdW5nZXMgdGhlbSBpbnRvIFRhaG9lIGJ5dGUgb3JkZXIuCisgICBUaGV5IGV4aXN0IHByaW1hcmlseSBmb3IgY3Jvc3MgYXNzZW1ibHkgcHVycG9zZS4gKi8KK3ZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KK21kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKQorICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCisgICAgIHZhbHVlVCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KKyAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLworeworICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChjb24sIHZhbHVlLCBuYnl0ZXMpOworfQorCisjaWZkZWYgY29tbWVudAordm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLworbWRfbnVtYmVyX3RvX2ltbSAoY29uLCB2YWx1ZSwgbmJ5dGVzKQorICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCisgICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLworICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCit7CisgIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKK30KKworI2VuZGlmIC8qIGNvbW1lbnQgKi8KKwordm9pZAordGNfYXBwbHlfZml4IChmaXhQLCB2YWwpCisgICAgIGZpeFMgKmZpeFA7CisgICAgIGxvbmcgdmFsOworeworICAvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICovCisgIGtub3cgKDApOworfQorCit2b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCittZF9udW1iZXJfdG9fZGlzcCAoY29uLCB2YWx1ZSwgbmJ5dGVzKQorICAgICBjaGFyIGNvbltdOwkJLyogUmV0dXJuICduYnl0ZXMnIG9mIGNoYXJzIGhlcmUuICovCisgICAgIGxvbmcgaW50IHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLworICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCit7CisgIG1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKK30KKwordm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLworbWRfbnVtYmVyX3RvX2ZpZWxkIChjb24sIHZhbHVlLCBuYnl0ZXMpCisgICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KKyAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCisgICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KK3sKKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOworfQorCisvKiBQdXQgdGhlIGJpdHMgaW4gYW4gb3JkZXIgdGhhdCBhIHRhaG9lIHdpbGwgdW5kZXJzdGFuZCwgZGVzcGl0ZSB0aGUgb3JkZXJpbmcKKyAgIG9mIHRoZSBuYXRpdmUgbWFjaGluZS4KKyAgIE9uIFRhaG9lOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgYmlnIGVuZGlhbiBsb25nLAorICAgbmV4dCB0aHJlZSBieXRlcyBhcmUgc3ltYm9sbnVtLCBpbiBraW5kIG9mIDMgYnl0ZSBiaWcgZW5kaWFuIChsZWFzdCBzaWcuIGJ5dGUgbGFzdCkuCisgICBUaGUgbGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoIGJpdCA3IGFzIHBjcmVsLAorICAgCWJpdHMgNiAmIDUgYXMgbGVuZ3RoLAorCWJpdCA0IGFzIGV4dGVybiBhbmQgdGhlIGxhc3QgbmliYmxlIGFzICd1bmRlZmluZWQnLiAqLworCisjaWYgY29tbWVudAordm9pZAorbWRfcmlfdG9fY2hhcnMgKHJpX3AsIHJpKQorICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaV9wLCByaTsKK3sKKyAgYnl0ZSB0aGVfYnl0ZXNbc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKV07CisgIC8qIFRoZSByZWFzb24gSSBjYW4ndCBqdXN0IGVuY29kZSB0aGVzZSBkaXJlY3RseSBpbnRvIHJpX3AgaXMgdGhhdAorICAgICByaV9wIG1heSBwb2ludCB0byByaS4gKi8KKworICAvKiBUaGlzIGlzIGVhc3kgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKKworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICB0aGVfYnl0ZXNbNF0gPSAocmkucl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7CisgIHRoZV9ieXRlc1s1XSA9IChyaS5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOworICB0aGVfYnl0ZXNbNl0gPSByaS5yX3N5bWJvbG51bSAmIDB4MGZmOworICB0aGVfYnl0ZXNbN10gPSAoKChyaS5yX2V4dGVybiA8PCA0KSAmIDB4MTApIHwgKChyaS5yX2xlbmd0aCA8PCA1KSAmIDB4NjApIHwKKwkJICAoKHJpLnJfcGNyZWwgPDwgNykgJiAweDgwKSkgJiAweGYwOworCisgIGJjb3B5ICh0aGVfYnl0ZXMsIChjaGFyICopIHJpX3AsIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOworfQorCisjZW5kaWYgLyogY29tbWVudCAqLworCisvKiBQdXQgdGhlIGJpdHMgaW4gYW4gb3JkZXIgdGhhdCBhIHRhaG9lIHdpbGwgdW5kZXJzdGFuZCwgZGVzcGl0ZSB0aGUgb3JkZXJpbmcKKyAgIG9mIHRoZSBuYXRpdmUgbWFjaGluZS4KKyAgIE9uIFRhaG9lOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgYmlnIGVuZGlhbiBsb25nLAorICAgbmV4dCB0aHJlZSBieXRlcyBhcmUgc3ltYm9sbnVtLCBpbiBraW5kIG9mIDMgYnl0ZSBiaWcgZW5kaWFuIChsZWFzdCBzaWcuIGJ5dGUgbGFzdCkuCisgICBUaGUgbGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoIGJpdCA3IGFzIHBjcmVsLAorICAgCWJpdHMgNiAmIDUgYXMgbGVuZ3RoLAorCWJpdCA0IGFzIGV4dGVybiBhbmQgdGhlIGxhc3QgbmliYmxlIGFzICd1bmRlZmluZWQnLiAqLworCit2b2lkIAordGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKKyAgICAgY2hhciAqd2hlcmU7CisgICAgIGZpeFMgKmZpeFA7CisgICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOworeworICBsb25nIHJfc3ltYm9sbnVtOworCisgIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOworCisgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCisgICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCisJCSAgICAgIDQpOworCisgIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCisJCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQorCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKKworICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKKyAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKKyAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOworICB3aGVyZVs3XSA9ICgoKGlzX3BjcmVsIChmaXhQKSA8PCA3KSAmIDB4ODApCisJICAgICAgfCAoKCgoZml4UC0+ZnhfdHlwZSA9PSBGWF84IHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUw4CisJCSAgICA/IDAKKwkJICAgIDogKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMTYgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDE2CisJCSAgICAgICA/IDEKKwkJICAgIDogKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMzIgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDMyCisJCSAgICAgICA/IDIKKwkJICAgICAgIDogNDIpKSkpIDw8IDUpICYgMHg2MCkKKwkgICAgICB8ICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpIDw8IDQpICYgMHgxMCkpOworfQorCisvKiBSZWxvY2F0ZSBieXRlIHN0dWZmICovCisMCisvKiBUaGlzIGlzIGZvciBicm9rZW4gd29yZC4gKi8KK2NvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOworCit2b2lkCittZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKKyAgICAgY2hhciAqcHRyOworICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7CisgICAgIGZyYWdTICpmcmFnOworICAgICBzeW1ib2xTICp0b19zeW1ib2w7Cit7CisgIHZhbHVlVCBvZmZzZXQ7CisKKyAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAxKTsKKyAgKnB0cisrID0gVEFIT0VfQlJXOworICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCAyKTsKK30KKworY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLworCit2b2lkCittZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQorICAgICBjaGFyICpwdHI7CisgICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKKyAgICAgZnJhZ1MgKmZyYWc7CisgICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKK3sKKyAgdmFsdWVUIG9mZnNldDsKKworICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDQpOworICAqcHRyKysgPSBUQUhPRV9KTVA7CisgICpwdHIrKyA9IFRBSE9FX1BDX1JFTF9MT05HOworICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCA0KTsKK30KKwwKKy8qCisgKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKKyAqCisgKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KKyAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLCBzbyB3ZSBhc3N1bWVkCisgKiB0aGF0IGl0IHdpbGwgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KKyAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLCBmb3IgcmVsYXgoKQorICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuIChIb3cgYmlnIEkgdGhpbmsgdGhpcworICogd2lsbCBiZS4pCisgKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCisgKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgorICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQorICogMCB2YWx1ZS4KKyAqLworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworICAgICBzZWdUIHNlZ21lbnRfdHlwZTsJCS8qIE5fREFUQSBvciBOX1RFWFQuICovCit7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIHJlZ2lzdGVyIGludCBvbGRfZnJfZml4OworICAvKiAgaW50IHBjX3JlbDsgRklYTUU6IHJlbW92ZSB0aGlzICovCisKKyAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7CisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfVU5ERik6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQorCXsKKwkgIC8qIFRoZSBzeW1ib2wgd2FzIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlIG9wY29kZSwgYW5kIGl0J3MKKwkgYSByZWFsIHBjX3JlbCBjYXNlIHNvIGl0J3MgYSByZWxheGFibGUgY2FzZS4gKi8KKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoaXMgY2FzZSBpcyBzdGlsbCB1bmRlZmluZWQsIHNvIGFzdW1lIGl0J3MgYSBsb25nIHdvcmQgZm9yIHRoZQorCSBsaW5rZXIgdG8gZml4LiAqLworCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKKwkgICpwIHw9IFRBSE9FX1BDX09SX0xPTkc7CisJICAvKiBXZSBub3cga25vdyBob3cgYmlnIGl0IHdpbGwgYmUsIG9uZSBsb25nIHdvcmQuICovCisJICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OworCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBmcmFnUC0+ZnJfc3ltYm9sLAorCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKKwkgIGZyYWdfd2FuZSAoZnJhZ1ApOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfVU5ERik6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OworCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMHgxMDsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCisJICAqcCsrID0gNjsKKwkgICpwKysgPSBUQUhPRV9KTVA7CisJICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7CisJICBmcmFnUC0+ZnJfZml4ICs9IDEgKyAxICsgMSArIDQ7CisJICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDMsIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOworCSAgZnJhZ193YW5lIChmcmFnUCk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1VOREYpOgorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9CisJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OworCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMHgxMDsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCisJICAqcCsrID0gMDsKKwkgICpwKysgPSA2OworCSAgKnArKyA9IFRBSE9FX0pNUDsKKwkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKKwkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyA0OworCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKKwkgIGZyYWdfd2FuZSAoZnJhZ1ApOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfVU5ERik6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX1dPUkQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OworCSAgKnArKyA9IDI7CisJICAqcCsrID0gMDsKKwkgICpwKysgPSBUQUhPRV9CUkI7CisJICAqcCsrID0gNjsKKwkgICpwKysgPSBUQUhPRV9KTVA7CisJICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7CisJICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgMiArIDQ7CisJICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDYsIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOworCSAgZnJhZ193YW5lIChmcmFnUCk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfVU5ERik6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKKwkgICpmcmFnUC0+ZnJfb3Bjb2RlID0gVEFIT0VfSk1QOworCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOworCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKKwkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7CisJICBmcmFnX3dhbmUgKGZyYWdQKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKK30JCQkJLyogbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKSAqLworDAorLyoKKyAqCQkJbWRfY29udmVydF9mcmFnKCk7CisgKgorICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCisgKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgorICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KKyAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgorICoKKyAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KKyAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KKyAqLwordm9pZAorbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKKyAgICAgc2VnVCBzZWc7CisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqYWRkcmVzc1A7CS8qIC0+IF92YXIgdG8gY2hhbmdlLiAqLworICByZWdpc3RlciBjaGFyICpvcGNvZGVQOwkvKiAtPiBvcGNvZGUgY2hhcihzKSB0byBjaGFuZ2UuICovCisgIHJlZ2lzdGVyIHNob3J0IGludCBsZW5ndGhfY29kZTsJLyogMj1sb25nIDE9d29yZCAwPWJ5dGUgKi8KKyAgcmVnaXN0ZXIgc2hvcnQgaW50IGV4dGVuc2lvbiA9IDA7CS8qIFNpemUgb2YgcmVsYXhlZCBhZGRyZXNzLgorCQkJCSAgIEFkZGVkIHRvIGZyX2ZpeDogaW5jbC4gQUxMIHZhciBjaGFycy4gKi8KKyAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKKyAgcmVnaXN0ZXIgbG9uZyBpbnQgd2hlcmU7CisgIHJlZ2lzdGVyIGxvbmcgaW50IGFkZHJlc3Nfb2ZfdmFyOworICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgaXMgX3ZhciBvZiAqZnJhZ1A/ICovCisgIHJlZ2lzdGVyIGxvbmcgaW50IHRhcmdldF9hZGRyZXNzOworICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgZG9lcyBhZGRyIHBvaW50PyAqLworCisgIGtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KTsKKyAgbGVuZ3RoX2NvZGUgPSBSRUxBWF9MRU5HVEggKGZyYWdQLT5mcl9zdWJ0eXBlKTsKKyAga25vdyAobGVuZ3RoX2NvZGUgPj0gMCAmJiBsZW5ndGhfY29kZSA8IDMpOworICB3aGVyZSA9IGZyYWdQLT5mcl9maXg7CisgIGFkZHJlc3NQID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKKyAgb3Bjb2RlUCA9IGZyYWdQLT5mcl9vcGNvZGU7CisgIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOworICBrbm93IChzeW1ib2xQKTsKKyAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OworICBhZGRyZXNzX29mX3ZhciA9IGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmU7CisgIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCisgICAgeworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk6CisgICAgICAvKiAqYWRkcmVzc1AgaG9sZHMgdGhlIHJlZ2lzdGVycyBudW1iZXIsIHBsdXMgMHgxMCwgaWYgaXQncyBkZWZlcnJlZAorICAgICAgIG1vZGUuIFRvIHNldCB1cCB0aGUgcmlnaHQgbW9kZSwganVzdCBPUiB0aGUgc2l6ZSBvZiB0aGlzIGRpc3BsYWNlbWVudCAqLworICAgICAgLyogQnl0ZSBkaXNwbGFjZW1lbnQuICovCisgICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9CWVRFOworICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfV09SRCk6CisgICAgICAvKiBXb3JkIGRpc3BsYWNlbWVudC4gKi8KKyAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX1dPUkQ7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDMpLCAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfTE9ORyk6CisgICAgICAvKiBMb25nIHdvcmQgZGlzcGxhY2VtZW50LiAqLworICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfTE9ORzsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOworICAgICAgZXh0ZW5zaW9uID0gNTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk6CisgICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOworICAgICAgZXh0ZW5zaW9uID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfV09SRCk6CisgICAgICAqb3Bjb2RlUCBePSAweDEwOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLworICAgICAgKmFkZHJlc3NQKysgPSAzOwkJLyogSnVtcCBvdmVyIHdvcmQgYnJhbmNoICovCisgICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0JSVzsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNCksIDIpOworICAgICAgZXh0ZW5zaW9uID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfTE9ORyk6CisgICAgICAqb3Bjb2RlUCBePSAweDEwOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLworICAgICAgKmFkZHJlc3NQKysgPSA2OworICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7CisgICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOworICAgICAgZXh0ZW5zaW9uID0gNzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOgorICAgICAgKmFkZHJlc3NQID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKKyAgICAgIGV4dGVuc2lvbiA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9XT1JEKToKKyAgICAgICpvcGNvZGVQID0gVEFIT0VfQlJXOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7CisgICAgICBleHRlbnNpb24gPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfTE9ORyk6CisgICAgICAqb3Bjb2RlUCA9IFRBSE9FX0pNUDsKKyAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKKyAgICAgIGV4dGVuc2lvbiA9IDU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk6CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfTE9ORyk6CisgICAgICAqb3Bjb2RlUCBePSAweDEwOworICAgICAgKmFkZHJlc3NQKysgPSAwOworICAgICAgKmFkZHJlc3NQKysgPSA2OworICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9KTVA7CisgICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX1BDX1JFTF9MT05HOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MsIDQpOworICAgICAgZXh0ZW5zaW9uID0gODsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk6CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsIFNUQVRFX0xPTkcpOgorICAgICAgKmFkZHJlc3NQKysgPSAwOworICAgICAgKmFkZHJlc3NQKysgPSAyOworICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9CUkI7CisgICAgICAqYWRkcmVzc1ArKyA9IDY7CisgICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKKyAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7CisgICAgICBleHRlbnNpb24gPSAxMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOworfQkJCQkvKiBtZF9jb252ZXJ0X2ZyYWcgKi8KKwwKKworLyogVGhpcyBpcyB0aGUgc3R1ZmYgZm9yIG1kX2Fzc2VtYmxlLiAqLworI2RlZmluZSBGUF9SRUcgMTMKKyNkZWZpbmUgU1BfUkVHIDE0CisjZGVmaW5lIFBDX1JFRyAxNQorI2RlZmluZSBCSUdHRVNUUkVHIFBDX1JFRworCisvKgorICogUGFyc2UgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IFNUQVJUCisgKiBJZiBpdCByZXByZXNlbnRzIGEgdmFsaWQgcmVnaXN0ZXIsIHBvaW50IFNUQVJUIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIKKyAqIHRoZSBsYXN0IHZhbGlkIHJlZ2lzdGVyIGNoYXIsIGFuZCByZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciAoMC0xNSkuCisgKiBJZiBpbnZhbGlkLCBsZWF2ZSBTVEFSVCBhbG9uZSwgcmV0dXJuIC0xLgorICogVGhlIGZvcm1hdCBoYXMgdG8gYmUgZXhhY3QuIEkgZG9uJ3QgZG8gdGhpbmdzIGxpa2UgZWF0IGxlYWRpbmcgemVyb3MKKyAqIG9yIHRoZSBsaWtlLgorICogTm90ZTogVGhpcyBkb2Vzbid0IGNoZWNrIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBtYWtpbmcKKyAqIHRoaXMgaW52YWxpZC4gRXg6IFIxMjMgd291bGQgcmV0dXJuIDEyLCBpdCdzIHRoZSBjYWxsZXJzIGpvYiB0byBjaGVjaworICogd2hhdCBzdGFydCBpcyBwb2ludCB0byBhcG9uIHJldHVybi4KKyAqCisgKiBWYWxpZCByZWdpc3RlcnMgYXJlIFIxLVIxNSwgJTEtJTE1LCBGUCAoMTMpLCBTUCAoMTQpLCBQQyAoMTUpCisgKiBDYXNlIGRvZXNuJ3QgbWF0dGVyLgorICovCitpbnQKK3RhaG9lX3JlZ19wYXJzZSAoc3RhcnQpCisgICAgIGNoYXIgKipzdGFydDsJCS8qIEEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIHBhcnNlLiAqLworeworICByZWdpc3RlciBjaGFyICpyZWdwb2ludCA9ICpzdGFydDsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bSA9IC0xOworCisgIHN3aXRjaCAoKnJlZ3BvaW50KyspCisgICAgeworICAgIGNhc2UgJyUnOgkJCS8qIFJlZ2lzdGVycyBjYW4gc3RhcnQgd2l0aCBhICUsCisJCQkJICAgUiBvciByLCBhbmQgdGhlbiBhIG51bWJlci4gKi8KKyAgICBjYXNlICdSJzoKKyAgICBjYXNlICdyJzoKKyAgICAgIGlmIChpc2RpZ2l0ICgqcmVncG9pbnQpKQorCXsKKwkgIC8qIEdvdCB0aGUgZmlyc3QgZGlnaXQuICovCisJICByZWdudW0gPSAqcmVncG9pbnQrKyAtICcwJzsKKwkgIGlmICgocmVnbnVtID09IDEpICYmIGlzZGlnaXQgKCpyZWdwb2ludCkpCisJICAgIHsKKwkgICAgICAvKiBJdHMgYSB0d28gZGlnaXQgbnVtYmVyLiAqLworCSAgICAgIHJlZ251bSA9IDEwICsgKCpyZWdwb2ludCsrIC0gJzAnKTsKKwkgICAgICBpZiAocmVnbnVtID4gQklHR0VTVFJFRykKKwkJewkJLyogTnVtYmVyIHRvbyBiaWc/ICovCisJCSAgcmVnbnVtID0gLTE7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0YnOgkJCS8qIElzIGl0IHRoZSBGUCAqLworICAgIGNhc2UgJ2YnOgorICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKKwl7CisJY2FzZSAncCc6CisJY2FzZSAnUCc6CisJICByZWdudW0gPSBGUF9SRUc7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CQkJLyogSG93IGFib3V0IHRoZSBTUCAqLworICAgIGNhc2UgJ1MnOgorICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKKwl7CisJY2FzZSAncCc6CisJY2FzZSAnUCc6CisJICByZWdudW0gPSBTUF9SRUc7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CQkJLyogT1IgdGhlIFBDIGV2ZW4gKi8KKyAgICBjYXNlICdQJzoKKyAgICAgIHN3aXRjaCAoKnJlZ3BvaW50KyspCisJeworCWNhc2UgJ2MnOgorCWNhc2UgJ0MnOgorCSAgcmVnbnVtID0gUENfUkVHOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAocmVnbnVtICE9IC0xKQorICAgIHsJCQkJLyogTm8gZXJyb3IsIHNvIG1vdmUgc3RyaW5nIHBvaW50ZXIgKi8KKyAgICAgICpzdGFydCA9IHJlZ3BvaW50OworICAgIH0KKyAgcmV0dXJuIHJlZ251bTsJCS8qIFJldHVybiByZXN1bHRzICovCit9CQkJCS8qIHRhaG9lX3JlZ19wYXJzZSAqLworDAorLyoKKyAqIFRoaXMgY2hvcHMgdXAgYW4gb3BlcmFuZCBhbmQgZmlndXJlcyBvdXQgaXRzIG1vZGVzIGFuZCBzdHVmZi4KKyAqIEl0J3MgYSBsaXR0bGUgdG91Y2h5IGFib3V0IGV4dHJhIGNoYXJhY3RlcnMuCisgKiBPcHRleCB0byBzdGFydCB3aXRoIG9uZSBleHRyYSBjaGFyYWN0ZXIgc28gaXQgY2FuIGJlIG92ZXJ3cml0dGVuIGZvcgorICogdGhlIGJhY2t3YXJkIHBhcnQgb2YgdGhlIHBhcnNpbmcuCisgKiBZb3UgY2FuJ3QgcHV0IGEgYnVuY2ggb2YgZXh0cmEgY2hhcmFjdGVycyBpbiBzaWRlIHRvCisgKiBtYWtlIHRoZSBjb21tYW5kIGxvb2sgY3V0ZS4gaWU6ICogZm9vICggcjEgKSBbICByMCBdCisgKiBJZiB5b3UgbGlrZSBkb2luZyBhIGxvdCBvZiB0eXBpbmcsIHRyeSBDT0JPTCEKKyAqIEFjdHVhbGx5LCB0aGlzIHBhcnNlciBpcyBhIGxpdHRsZSB3ZWFrIGFsbCBhcm91bmQuIEl0J3MgZGVzaWduZWQgdG8gYmUKKyAqIHVzZWQgd2l0aCBjb21wbGllcnMsIHNvIEkgZW1waGlzaXNlIGNvcnJlY3QgZGVjb2Rpbmcgb2YgdmFsaWQgY29kZSBxdWlja2x5CisgKiByYXRoZXIgdGhhdCBjYXRjaGluZyBldmVyeSBwb3NzYWJsZSBlcnJvci4KKyAqIE5vdGU6IFRoaXMgdXNlcyB0aGUgZXhwcmVzc2lvbiBmdW5jdGlvbiwgc28gc2F2ZSBpbnB1dF9saW5lX3BvaW50ZXIgYmVmb3JlCisgKiBjYWxsaW5nLgorICoKKyAqIFNwZXJyeSBkZWZpbmVzIHRoZSBzZW1hbnRpY3Mgb2YgYWRkcmVzcyBtb2RlcyAoYW5kIHZhbHVlcykKKyAqIGJ5IGEgdHdvLWxldHRlciBjb2RlLCBleHBsYWluZWQgaGVyZS4KKyAqCisgKiAgIGxldHRlciAxOiAgIGFjY2VzcyB0eXBlCisgKgorICogICAgIGEgICAgICAgICBhZGRyZXNzIGNhbGN1bGF0aW9uIC0gbm8gZGF0YSBhY2Nlc3MsIHJlZ2lzdGVycyBmb3JiaWRkZW4KKyAqICAgICBiICAgICAgICAgYnJhbmNoIGRpc3BsYWNlbWVudAorICogICAgIG0gICAgICAgICByZWFkIC0gbGV0IGdvIG9mIGJ1cyAtIHdyaXRlIGJhY2sgIm1vZGlmeSIKKyAqICAgICByICAgICAgICAgcmVhZAorICogICAgIHcgICAgICAgICB3cml0ZQorICogICAgIHYgICAgICAgICBiaXQgZmllbGQgYWRkcmVzczogbGlrZSAnYScgYnV0IHJlZ2lzdGVycyBhcmUgT0sKKyAqCisgKiAgIGxldHRlciAyOiAgIGRhdGEgdHlwZSAoaS5lLiB3aWR0aCwgYWxpZ25tZW50KQorICoKKyAqICAgICBiICAgICAgICAgYnl0ZQorICogICAgIHcgICAgICAgICB3b3JkCisgKiAgICAgbCAgICAgICAgIGxvbmd3b3JkCisgKiAgICAgcSAgICAgICAgIHF1YWR3b3JkIChFdmVuIHJlZ3MgPCAxNCBhbGxvd2VkKSAoaWYgMTIsIHlvdSBnZXQgYSB3YXJuaW5nKQorICogICAgIC0JIHVuY29uZGl0aW9uYWwgc3ludGhldGljIGpiciBvcGVyYW5kCisgKiAgICAgPwkgc2ltcGxlIHN5bnRoZXRpYyByZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCisgKiAgICAgIQkgY29tcGxleCBzeW50aGV0aWMgcmV2ZXJzYWJsZSBicmFuY2ggb3BlcmFuZAorICogICAgIDoJIGNvbXBsZXggc3ludGhldGljIG5vbi1yZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCisgKgorICogVGhlICctPyE6JyBsZXR0ZXIgMidzIGFyZSBub3QgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLiBUaGV5IGFyZSB1c2VkCisgKiBieSBHQVMgZm9yIHBzdWVkbyBvcHMgcmVsYXhpbmcgY29kZS4KKyAqCisgKiBBZnRlciBwYXJzaW5nIHRvcFAgaGFzOgorICoKKyAqICAgdG9wX25keDogICAgICAgIC0xLCBvciB0aGUgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQorICogICB0b3BfcmVnOiAgICAgICAgLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgNyA9IFI3IG9yIChSNykKKyAqICAgdG9wX21vZGU6ICAgICAgIFRoZSBhZGRyZXNzaW5nIG1vZGUgYnl0ZS4gVGhpcyBieXRlLCBkZWZpbmVzIHdoaWNoIG9mCisgKiAgICAgICAgICAgICAgICAgICB0aGUgMTEgbW9kZXMgb3Bjb2RlIGlzLgorICogICB0b3BfYWNjZXNzOiAgICAgQWNjZXNzIHR5cGUgd2FudGVkIGZvciB0aGlzIG9wcGVyYW5kICdiJ2JyYW5jaCAnICcKKyAqICAgICAgICAgICAgICAgICAgIG5vLWluc3RydWN0aW9uICdhbXJ2dycKKyAqICAgdG9wX3dpZHRoOiAgICAgIE9wZXJhbmQgd2lkdGggZXhwZWN0ZWQsIG9uZSBvZiAiYndscT8tOiEiCisgKiAgIGV4cF9vZl9vcGVyYW5kOiBUaGUgZXhwcmVzc2lvbiBhcyBwYXJzZWQgYnkgZXhwcmVzc2lvbigpCisgKiAgIHRvcF9kaXNwc2l6ZTogICBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpc3BsYWNlbWVudCBpZiB3ZSBjYW4gZmlndXJlIGl0CisgKiAgICAgICAgICAgICAgICAgICBvdXQgYW5kIGl0J3MgcmVsYXZlbnQuCisgKgorICogTmVlZCBzeW50YXggY2hlY2tzIGJ1aWx0LgorICovCisKK3ZvaWQKK3RpcF9vcCAob3B0ZXgsIHRvcFApCisgICAgIGNoYXIgKm9wdGV4OwkJLyogVGhlIHVzZXJzIHRleHQgaW5wdXQsIHdpdGggb25lIGxlYWRpbmcgY2hhcmFjdGVyICovCisgICAgIHN0cnVjdCB0b3AgKnRvcFA7CQkvKiBUaGUgdGFob2UgaW5zdHJ1Y3Rpb24gd2l0aCBzb21lIGZpZWxkcyBhbHJlYWR5IHNldDoKKwkJCSBpbjogYWNjZXNzLCB3aWR0aAorCQkJIG91dDogbmR4LCByZWcsIG1vZGUsIGVycm9yLCBkaXNwc2l6ZSAqLworCit7CisgIGludCBtb2RlID0gMDsJCQkvKiBUaGlzIG9wZXJhbmQncyBtb2RlLiAqLworICBjaGFyIHNlZ2ZhdWx0ID0gKm9wdGV4OwkvKiBUbyBrZWVwIHRoZSBiYWNrIHBhcnNpbmcgZnJvbSBmcmVha2luZy4gKi8KKyAgY2hhciAqcG9pbnQgPSBvcHRleCArIDE7CS8qIFBhcnNpbmcgZnJvbSBmcm9udCB0byBiYWNrLiAqLworICBjaGFyICplbmQ7CQkJLyogUGFyc2luZyBmcm9tIGJhY2sgdG8gZnJvbnQuICovCisgIGludCByZWcgPSAtMTsJCQkvKiBtYWpvciByZWdpc3RlciwgLTEgbWVhbnMgYWJzZW50ICovCisgIGludCBpbXJlZyA9IC0xOwkJLyogTWFqb3IgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUgKi8KKyAgaW50IG5keCA9IC0xOwkJCS8qIGluZGV4IHJlZ2lzdGVyIG51bWJlciwgLTEgbWVhbnMgYWJzZW50ICovCisgIGNoYXIgZGVjX2luYyA9ICcgJzsJCS8qIElzIHRoZSBTUCBhdXRvLWluY3JlbWVudGVkICcrJyBvcgorCQkJCSAgIGF1dG8tZGVjcmVtZW50ZWQgJy0nIG9yIG5laXRoZXIgJyAnLiAqLworICBpbnQgaW1tZWRpYXRlID0gMDsJCS8qIDEgaWYgJyQnIGltbWVkaWF0ZSBtb2RlICovCisgIGludCBjYWxsX3dpZHRoID0gMDsJCS8qIElmIHRoZSBjYWxsZXIgY2FzdHMgdGhlIGRpc3BsYWNlbWVudCAqLworICBpbnQgYWJzX3dpZHRoID0gMDsJCS8qIFRoZSB3aWR0aCBvZiB0aGUgYWJzb2x1dGUgZGlzcGxhY21lbnQgKi8KKyAgaW50IGNvbV93aWR0aCA9IDA7CQkvKiBEaXNwbGFjZW1lbnQgd2lkdGggcmVxdWlyZWQgYnkgYnJhbmNoICovCisgIGludCBkZWZlcnJlZCA9IDA7CQkvKiAxIGlmICcqJyBkZWZlcnJhbCBpcyB1c2VkICovCisgIGJ5dGUgZGlzcF9zaXplID0gMDsJCS8qIEhvdyBiaWcgaXMgdGhpcyBvcGVyYW5kLiAwID09IGRvbid0IGtub3cgKi8KKyAgY2hhciAqb3BfYmFkID0gIiI7CQkvKiBCYWQgb3BlcmFuZCBlcnJvciAqLworCisgIGNoYXIgKnRwLCAqdGVtcCwgYzsJCS8qIFRlbXBvcmFyeSBob2xkZXJzICovCisKKyAgY2hhciBhY2Nlc3MgPSB0b3BQLT50b3BfYWNjZXNzOwkvKiBTYXZlIG9uIGEgZGVyZWYuICovCisgIGNoYXIgd2lkdGggPSB0b3BQLT50b3Bfd2lkdGg7CisKKyAgaW50IHJlYWxseV9ub25lID0gMDsJCS8qIEVtcHR5IGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIDAKKwkJCQkgICBidXQgSSBuZWVkIHRvIGtub3cgaWYgaXQncyB0aGVyZSBvciBub3QgKi8KKyAgZXhwcmVzc2lvblMgKmV4cFA7CQkvKiAtPiBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhpcyBvcGVyYW5kICovCisKKyAgLyogRG9lcyB0aGlzIGNvbW1hbmQgcmVzdHJpY3QgdGhlIGRpc3BsYWNlbWVudCBzaXplLiAqLworICBpZiAoYWNjZXNzID09ICdiJykKKyAgICBjb21fd2lkdGggPSAod2lkdGggPT0gJ2InID8gMSA6CisJCSAod2lkdGggPT0gJ3cnID8gMiA6CisJCSAgKHdpZHRoID09ICdsJyA/IDQgOiAwKSkpOworCisgICpvcHRleCA9ICdcMCc7CQkvKiBUaGlzIGlzIGtpbmQgb2YgYSBiYWNrIHN0b3AgZm9yIGFsbAorCQkJCSAgIHRoZSBzZWFyY2hlcyB0byBmYWlsIG9uIGlmIG5lZWRlZC4qLworICBpZiAoKnBvaW50ID09ICcqJykKKyAgICB7CQkJCS8qIEEgZGVyZWZlcmVuY2U/ICovCisgICAgICBkZWZlcnJlZCA9IDE7CisgICAgICBwb2ludCsrOworICAgIH0KKworICAvKiBGb3JjZSB3b3JkcyBpbnRvIGEgY2VydGFpbiBtb2RlICovCisgIC8qIEJpdGNoLCBCaXRjaCwgQml0Y2ghICovCisgIC8qCisgICAqIFVzaW5nIHRoZSBeIG9wZXJhdG9yIGlzIGFtYmlnb3VzLiBJZiBJIGhhdmUgYW4gYWJzb2x1dGUgbGFiZWwKKyAgICogY2FsbGVkICd3JyBzZXQgdG8sIHNheSAyLCBhbmQgSSBoYXZlIHRoZSBleHByZXNzaW9uICd3XjEnLCBkbyBJIGdldAorICAgKiAxLCBmb3JjZWQgdG8gYmUgaW4gd29yZCBkaXNwbGFjZW1lbnQgbW9kZSwgb3IgZG8gSSBnZXQgdGhlIHZhbHVlIG9mCisgICAqICd3JyBvcidlZCB3aXRoIDEgKDMgaW4gdGhpcyBjYXNlKS4KKyAgICogVGhlIGRlZmF1bHQgaXMgJ3cnIGFzIGFuIG9mZnNldCwgc28gdGhhdCdzIHdoYXQgSSB1c2UuCisgICAqIFN0aWNrIHdpdGggYCwgaXQgZG9lcyB0aGUgc2FtZSwgYW5kIGlzbid0IGFtYmlnLgorICAgKi8KKworICBpZiAoKnBvaW50ICE9ICdcMCcgJiYgKChwb2ludFsxXSA9PSAnXicpIHx8IChwb2ludFsxXSA9PSAnYCcpKSkKKyAgICBzd2l0Y2ggKCpwb2ludCkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ2InOgorICAgICAgY2FzZSAnQic6CisgICAgICBjYXNlICd3JzoKKyAgICAgIGNhc2UgJ1cnOgorICAgICAgY2FzZSAnbCc6CisgICAgICBjYXNlICdMJzoKKwlpZiAoY29tX3dpZHRoKQorCSAgYXNfd2FybiAoXygiQ2FzdGluZyBhIGJyYW5jaCBkaXNwbGFjZW1lbnQgaXMgYmFkIGZvcm0sIGFuZCBpcyBpZ25vcmVkLiIpKTsKKwllbHNlCisJICB7CisJICAgIGMgPSAoaXN1cHBlciAoKnBvaW50KSA/IHRvbG93ZXIgKCpwb2ludCkgOiAqcG9pbnQpOworCSAgICBjYWxsX3dpZHRoID0gKChjID09ICdiJykgPyAxIDoKKwkJCSAgKChjID09ICd3JykgPyAyIDogNCkpOworCSAgfQorCXBvaW50ICs9IDI7CisJYnJlYWs7CisgICAgICB9CisKKyAgLyogU2V0dGluZyBpbW1lZGlhdGUgbW9kZSAqLworICBpZiAoKnBvaW50ID09ICckJykKKyAgICB7CisgICAgICBpbW1lZGlhdGUgPSAxOworICAgICAgcG9pbnQrKzsKKyAgICB9CisKKyAgLyoKKyAgICogSSd2ZSBwdWxsZWQgb2ZmIGFsbCB0aGUgZWFzeSBzdHVmZiBvZmYgdGhlIGZyb250LCBtb3ZlIHRvIHRoZSBlbmQgYW5kCisgICAqIHlhbmsuCisgICAqLworCisgIGZvciAoZW5kID0gcG9pbnQ7ICplbmQgIT0gJ1wwJzsgZW5kKyspCS8qIE1vdmUgdG8gdGhlIGVuZC4gKi8KKyAgICA7CisKKyAgaWYgKGVuZCAhPSBwb2ludCkJCS8qIE51bGwgc3RyaW5nPyAqLworICAgIGVuZC0tOworCisgIGlmIChlbmQgPiBwb2ludCAmJiAqZW5kID09ICcgJyAmJiBlbmRbLTFdICE9ICdcJycpCisgICAgZW5kLS07CQkJLyogSG9wIHdoaXRlIHNwYWNlICovCisKKyAgLyogSXMgdGhpcyBhbiBpbmRleCByZWcuICovCisgIGlmICgoKmVuZCA9PSAnXScpICYmIChlbmRbLTFdICE9ICdcJycpKQorICAgIHsKKyAgICAgIHRlbXAgPSBlbmQ7CisKKyAgICAgIC8qIEZpbmQgb3BlbmluZyBicmFjZS4gKi8KKyAgICAgIGZvciAoLS1lbmQ7ICgqZW5kICE9ICdbJyAmJiBlbmQgIT0gcG9pbnQpOyBlbmQtLSkKKwk7CisKKyAgICAgIC8qIElmIEkgZm91bmQgdGhlIG9wZW5pbmcgYnJhY2UsIGdldCB0aGUgaW5kZXggcmVnaXN0ZXIgbnVtYmVyLiAqLworICAgICAgaWYgKCplbmQgPT0gJ1snKQorCXsKKwkgIHRwID0gZW5kICsgMTsJCS8qIHRwIHNob3VsZCBwb2ludCB0byB0aGUgc3RhcnQgb2YgYSByZWcuICovCisJICBuZHggPSB0YWhvZV9yZWdfcGFyc2UgKCZ0cCk7CisJICBpZiAodHAgIT0gdGVtcCkKKwkgICAgewkJCS8qIFJlZy4gcGFyc2UgZXJyb3IuICovCisJICAgICAgbmR4ID0gLTE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGVuZC0tOwkJLyogRm91bmQgaXQsIG1vdmUgcGFzdCBicmFjZS4gKi8KKwkgICAgfQorCSAgaWYgKG5keCA9PSAtMSkKKwkgICAgeworCSAgICAgIG9wX2JhZCA9IF8oIkNvdWxkbid0IHBhcnNlIHRoZSBbaW5kZXhdIGluIHRoaXMgb3BlcmFuZC4iKTsKKwkgICAgICBlbmQgPSBwb2ludDsJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIG9wX2JhZCA9IF8oIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJ1snIGZvciB0aGUgaW5kZXggb2YgdGhpcyBvcGVyYW5kLiIpOworCSAgZW5kID0gcG9pbnQ7CQkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCisJfQorICAgIH0KKworICAvKiBQb3N0IGluY3JlbWVudD8gKi8KKyAgaWYgKCplbmQgPT0gJysnKQorICAgIHsKKyAgICAgIGRlY19pbmMgPSAnKyc7CisgICAgICAvKiB3YXM6ICAgICplbmQtLTsgKi8KKyAgICAgIGVuZC0tOworICAgIH0KKworICAvKiByZWdpc3RlciBpbiBwYXJlbnM/ICovCisgIGlmICgoKmVuZCA9PSAnKScpICYmIChlbmRbLTFdICE9ICdcJycpKQorICAgIHsKKyAgICAgIHRlbXAgPSBlbmQ7CisKKyAgICAgIC8qIEZpbmQgb3BlbmluZyBwYXJlbi4gKi8KKyAgICAgIGZvciAoLS1lbmQ7ICgqZW5kICE9ICcoJyAmJiBlbmQgIT0gcG9pbnQpOyBlbmQtLSkKKwk7CisKKyAgICAgIC8qIElmIEkgZm91bmQgdGhlIG9wZW5pbmcgcGFyZW4sIGdldCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAqLworICAgICAgaWYgKCplbmQgPT0gJygnKQorCXsKKwkgIHRwID0gZW5kICsgMTsKKwkgIHJlZyA9IHRhaG9lX3JlZ19wYXJzZSAoJnRwKTsKKwkgIGlmICh0cCAhPSB0ZW1wKQorCSAgICB7CisJICAgICAgLyogTm90IGEgcmVnaXN0ZXIsIGJ1dCBjb3VsZCBiZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uLiAqLworCSAgICAgIHJlZyA9IC0xOworCSAgICAgIGVuZCA9IHRlbXA7CS8qIFJlc3QgdGhlIHBvaW50ZXIgYmFjayAqLworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBlbmQtLTsJCS8qIEZvdW5kIHRoZSByZWcuIG1vdmUgYmVmb3JlIG9wZW5pbmcgcGFyZW4uICovCisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgb3BfYmFkID0gXygiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnKCcgZm9yIHRoZSBkZXJlZiBvZiB0aGlzIG9wZXJhbmQuIik7CisJICBlbmQgPSBwb2ludDsJCS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KKwl9CisgICAgfQorCisgIC8qIFByZSBkZWNyZW1lbnQ/ICovCisgIGlmICgqZW5kID09ICctJykKKyAgICB7CisgICAgICBpZiAoZGVjX2luYyAhPSAnICcpCisJeworCSAgb3BfYmFkID0gXygiT3BlcmFuZCBjYW4ndCBiZSBib3RoIHByZS1pbmMgYW5kIHBvc3QtZGVjLiIpOworCSAgZW5kID0gcG9pbnQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRlY19pbmMgPSAnLSc7CisJICAvKiB3YXM6ICAgICAgKmVuZC0tOyAqLworCSAgZW5kLS07CisJfQorICAgIH0KKworICAvKgorICAgKiBFdmVyeXRoaW5nIGJldHdlZW4gcG9pbnQgYW5kIGVuZCBpcyB0aGUgJ2V4cHJlc3Npb24nLCB1bmxlc3MgaXQncworICAgKiBhIHJlZ2lzdGVyIG5hbWUuCisgICAqLworCisgIGMgPSBlbmRbMV07CisgIGVuZFsxXSA9ICdcMCc7CisKKyAgdHAgPSBwb2ludDsKKyAgaW1yZWcgPSB0YWhvZV9yZWdfcGFyc2UgKCZwb2ludCk7CS8qIEdldCB0aGUgaW1tZWRpYXRlIHJlZ2lzdGVyCisJCQkJICAgICAgaWYgaXQgaXMgdGhlcmUuKi8KKyAgaWYgKCpwb2ludCAhPSAnXDAnKQorICAgIHsKKyAgICAgIC8qIElmIHRoZXJlIGlzIGp1bmsgYWZ0ZXIgcG9pbnQsIHRoZW4gdGhlIGl0J3Mgbm90IGltbWVkaWF0ZSByZWcuICovCisgICAgICBwb2ludCA9IHRwOworICAgICAgaW1yZWcgPSAtMTsKKyAgICB9CisKKyAgaWYgKGltcmVnICE9IC0xICYmIHJlZyAhPSAtMSkKKyAgICBvcF9iYWQgPSBfKCJJIHBhcnNlZCAyIHJlZ2lzdGVycyBpbiB0aGlzIG9wZXJhbmQuIik7CisKKyAgLyoKKyAgICogRXZhbHVhdGUgd2hhdHMgbGVmdCBvZiB0aGUgZXhwcmVzc2lvbiB0byBzZWUgaWYgaXQncyB2YWxpZC4KKyAgICogTm90ZSBhZ2FpbjogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxpbmcgZXhwcmVzc2lvbiBoYXMgc2F2ZWQKKyAgICogaW5wdXRfbGluZV9wb2ludGVyLiAoTmFnLCBuYWcsIG5hZyEpCisgICAqLworCisgIGlmICgqb3BfYmFkID09ICdcMCcpCisgICAgeworICAgICAgLyogc3RhdGVtZW50IGhhcyBubyBzeW50YXggZ29vZnMgeWV0OiBsZXRzIHNuaWZmIHRoZSBleHByZXNzaW9uICovCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwb2ludDsKKyAgICAgIGV4cFAgPSAmKHRvcFAtPmV4cF9vZl9vcGVyYW5kKTsKKyAgICAgIHRvcFAtPnNlZ19vZl9vcGVyYW5kID0gZXhwcmVzc2lvbiAoZXhwUCk7CisgICAgICBzd2l0Y2ggKGV4cFAtPlhfb3ApCisJeworCWNhc2UgT19hYnNlbnQ6CisJICAvKiBObyBleHByZXNzaW9uLiBGb3IgQlNENC4yIGNvbXBhdGliaWxpdHksIG1pc3NpbmcgZXhwcmVzc2lvbiBpcworCSAgICAgYWJzb2x1dGUgMCAqLworCSAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOworCSAgcmVhbGx5X25vbmUgPSAxOworCWNhc2UgT19jb25zdGFudDoKKwkgIC8qIGZvciBTRUdfQUJTT0xVVEUsIHdlIHNob3VsZG50IG5lZWQgdG8gc2V0IFhfb3Bfc3ltYm9sLAorCSAgICAgWF9hZGRfc3ltYm9sIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAqLworCSAgLyogQnV0LCB3ZSB3aWxsIHByb2dyYW0gZGVmZW5zaXZlbHkuIFNpbmNlIHRoaXMgc2l0dWF0aW9uIG9jY3VycworCSAgICAgcmFyZWx5IHNvIGl0IGNvc3RzIHVzIGxpdHRsZSB0byBkbyBzby4gKi8KKwkgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7CisJICBleHBQLT5YX29wX3N5bWJvbCA9IE5VTEw7CisJICAvKiBIb3cgbWFueSBieXRlcyBhcmUgbmVlZGVkIHRvIGV4cHJlc3MgdGhpcyBhYnMgdmFsdWU/ICovCisJICBhYnNfd2lkdGggPQorCSAgICAoKCgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGRkY4MCkgPT0gMCkgfHwKKwkgICAgICAoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRkZGODApID09IDB4RkZGRkZGODApKSA/IDEgOgorCSAgICAgKCgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGODAwMCkgPT0gMCkgfHwKKwkgICAgICAoKGV4cFAtPlhfYWRkX251bWJlciAmIDB4RkZGRjgwMDApID09IDB4RkZGRjgwMDApKSA/IDIgOiA0KTsKKworCWNhc2UgT19zeW1ib2w6CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKgorCSAgICogTWFqb3IgYnVnLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGNhc2Ugb2YgYSBvcGVyYXRvcgorCSAgICogZXhwcmVzc2lvbiBpbiBhIHN5bnRoZXRpYyBvcGNvZGUgdmFyaWFibGUtbGVuZ3RoCisJICAgKiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhdmUgYSBmcmFnIHR5cGUgdGhhdCBpcyBzbWFydAorCSAgICogZW5vdWdoIHRvIHJlbGF4IGEgb3BlcmF0b3IsIGFuZCBzbyB3ZSBqdXN0IGZvcmNlIGFsbAorCSAgICogb3BlcmF0b3JzIHRvIGJlaGF2ZSBsaWtlIFNFR19QQVNTMXMuICBDbGVhcmx5LCBpZiB0aGVyZSBpcworCSAgICogYSBkZW1hbmQgd2UgY2FuIGludmVudCBhIG5ldyBvciBtb2RpZmllZCBmcmFnIHR5cGUgYW5kCisJICAgKiB0aGVuIGNvZGluZyB1cCBhIGZyYWcgZm9yIHRoaXMgY2FzZSB3aWxsIGJlIGVhc3kuCisJICAgKi8KKwkgIG5lZWRfcGFzc18yID0gMTsKKwkgIG9wX2JhZCA9IF8oIkNhbid0IHJlbG9jYXRlIGV4cHJlc3Npb24gZXJyb3IuIik7CisJICBicmVhazsKKworCWNhc2UgT19iaWc6CisJICAvKiBUaGlzIGlzIGFuIGVycm9yLiBUYWhvZSBkb2Vzbid0IGFsbG93IGFueSBleHByZXNzaW9ucworCSAgICAgYmlnZ2VyIHRoYXQgYSAzMiBiaXQgbG9uZyB3b3JkLiBBbnkgYmlnZ2VyIGhhcyB0byBiZSByZWZlcmVuY2VkCisJICAgICBieSBhZGRyZXNzLiAqLworCSAgb3BfYmFkID0gXygiRXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UgZm9yIGEgMzIgYml0cy4iKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcMCcpCisJeworCSAgb3BfYmFkID0gXygiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbi4iKTsKKwl9CisgICAgfQorCisgIGVuZFsxXSA9IGM7CisKKyAgLyogSSdtIGRvbmUsIHNvIHJlc3RvcmUgb3B0ZXggKi8KKyAgKm9wdGV4ID0gc2VnZmF1bHQ7CisKKworICAvKgorICAgKiBBdCB0aGlzIHBvaW50IGluIHRoZSBnYW1lLCB3ZSAoaW4gdGhlb3J5KSBoYXZlIGFsbCB0aGUgY29tcG9uZW50cyBvZgorICAgKiB0aGUgb3BlcmFuZCBhdCBsZWFzdCBwYXJzZWQuIE5vdyBpdCdzIHRpbWUgdG8gY2hlY2sgZm9yIHN5bnRheC9zZW1hbnRpYworICAgKiBlcnJvcnMsIGFuZCBidWlsZCB0aGUgbW9kZS4KKyAgICogVGhpcyBpcyB3aGF0IEkgaGF2ZToKKyAgICogICBkZWZlcnJlZCA9IDEgaWYgJyonCisgICAqICAgY2FsbF93aWR0aCA9IDAsMSwyLDQKKyAgICogICBhYnNfd2lkdGggPSAwLDEsMiw0CisgICAqICAgY29tX3dpZHRoID0gMCwxLDIsNAorICAgKiAgIGltbWVkaWF0ZSA9IDEgaWYgJyQnCisgICAqICAgbmR4ID0gLTEgb3IgcmVnIG51bQorICAgKiAgIGRlY19pbmMgPSAnLScgb3IgJysnIG9yICcgJworICAgKiAgIHJlZyA9IC0xIG9yIHJlZyBudW0KKyAgICogICBpbXJlZyA9IC0xIG9yIHJlZyBudW0KKyAgICogICB0b3BQLT5leHBfb2Zfb3BlcmFuZAorICAgKiAgIHJlYWxseV9ub25lCisgICAqLworICAvKiBJcyB0aGVyZSBhIGRpc3BsYWNlbWVudCBzaXplPyAqLworICBkaXNwX3NpemUgPSAoY2FsbF93aWR0aCA/IGNhbGxfd2lkdGggOgorCSAgICAgICAoY29tX3dpZHRoID8gY29tX3dpZHRoIDoKKwkJYWJzX3dpZHRoID8gYWJzX3dpZHRoIDogMCkpOworCisgIGlmICgqb3BfYmFkID09ICdcMCcpCisgICAgeworICAgICAgaWYgKGltcmVnICE9IC0xKQorCXsKKwkgIC8qIFJuICovCisJICBtb2RlID0gVEFIT0VfRElSRUNUX1JFRzsKKwkgIGlmIChkZWZlcnJlZCB8fCBpbW1lZGlhdGUgfHwgKGRlY19pbmMgIT0gJyAnKSB8fAorCSAgICAgIChyZWcgIT0gLTEpIHx8ICFyZWFsbHlfbm9uZSkKKwkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIpOworCSAgZWxzZSBpZiAobmR4ICE9IC0xKQorCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBkaXJlY3QgcmVnaXN0ZXIgbW9kZS4iKTsKKwkgIGVsc2UgaWYgKGltcmVnID09IFNQX1JFRyAmJiBhY2Nlc3MgPT0gJ3InKQorCSAgICBvcF9iYWQgPQorCSAgICAgIF8oIlNQIGNhbid0IGJlIHRoZSBzb3VyY2Ugb3BlcmFuZCB3aXRoIGRpcmVjdCByZWdpc3RlciBhZGRyZXNzaW5nLiIpOworCSAgZWxzZSBpZiAoYWNjZXNzID09ICdhJykKKwkgICAgb3BfYmFkID0gXygiQ2FuJ3QgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIHJlZ2lzdGVyLiIpOworCSAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKKwkgICAgb3BfYmFkID0gXygiRGlyZWN0IFJlZ2lzdGVyIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7CisJICBlbHNlIGlmICh3aWR0aCA9PSAncScgJiYgKChpbXJlZyAlIDIpIHx8IChpbXJlZyA+IDEzKSkpCisJICAgIG9wX2JhZCA9IF8oIkZvciBxdWFkIGFjY2VzcywgdGhlIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBhbmQgPCAxNC4iKTsKKwkgIGVsc2UgaWYgKGNhbGxfd2lkdGgpCisJICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBjYXN0IGEgZGlyZWN0IHJlZ2lzdGVyLiIpOworCisJICBpZiAoKm9wX2JhZCA9PSAnXDAnKQorCSAgICB7CisJICAgICAgLyogTm8gZXJyb3JzLCBjaGVjayBmb3Igd2FybmluZ3MgKi8KKwkgICAgICBpZiAod2lkdGggPT0gJ3EnICYmIGltcmVnID09IDEyKQorCQlhc193YXJuIChfKCJVc2luZyByZWcgMTQgZm9yIHF1YWR3b3JkcyBjYW4gdHJvbXAgdGhlIEZQIHJlZ2lzdGVyLiIpKTsKKworCSAgICAgIHJlZyA9IGltcmVnOworCSAgICB9CisKKwkgIC8qIFdlIGtub3c6IGltbSA9IC0xICovCisJfQorICAgICAgZWxzZSBpZiAoZGVjX2luYyA9PSAnLScpCisJeworCSAgLyogLShTUCkgKi8KKwkgIG1vZGUgPSBUQUhPRV9BVVRPX0RFQzsKKwkgIGlmIChkZWZlcnJlZCB8fCBpbW1lZGlhdGUgfHwgIXJlYWxseV9ub25lKQorCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gYXV0by1kZWMgbW9kZS4iKTsKKwkgIGVsc2UgaWYgKG5keCAhPSAtMSkKKwkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggYXV0byBkZWMgbW9kZS4iKTsKKwkgIGVsc2UgaWYgKGFjY2VzcyA9PSAncicpCisJICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIG1vZGUgY2FudCBiZSB1c2VkIGZvciByZWFkaW5nLiIpOworCSAgZWxzZSBpZiAocmVnICE9IFNQX1JFRykKKwkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7CisJICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQorCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOworCSAgZWxzZSBpZiAod2lkdGggPT0gJ3EnKQorCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIpOworCisJICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyAhPSAnLScgKi8KKwl9CisgICAgICBlbHNlIGlmIChkZWNfaW5jID09ICcrJykKKwl7CisJICBpZiAoaW1tZWRpYXRlIHx8ICFyZWFsbHlfbm9uZSkKKwkgICAgb3BfYmFkID0gXygiU3ludGF4IGVycm9yIGluIG9uZSBvZiB0aGUgYXV0by1pbmMgbW9kZXMuIik7CisJICBlbHNlIGlmIChkZWZlcnJlZCkKKwkgICAgeworCSAgICAgIC8qICooU1ApKyAqLworCSAgICAgIG1vZGUgPSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRDsKKwkgICAgICBpZiAocmVnICE9IFNQX1JFRykKKwkJb3BfYmFkID0gXygiQXV0byBpbmMgZGVmZXJyZWQgb25seSB3b3JrcyBvZiB0aGUgU1AgcmVnaXN0ZXIuIik7CisJICAgICAgZWxzZSBpZiAobmR4ICE9IC0xKQorCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGluYyBkZWZlcnJlZCBtb2RlLiIpOworCSAgICAgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCisJCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIChTUCkrICovCisJICAgICAgbW9kZSA9IFRBSE9FX0FVVE9fSU5DOworCSAgICAgIGlmIChhY2Nlc3MgPT0gJ20nIHx8IGFjY2VzcyA9PSAndycpCisJCW9wX2JhZCA9IF8oIllvdSBjYW4ndCB3cml0ZSB0byBhbiBhdXRvIGluYyByZWdpc3Rlci4iKTsKKwkgICAgICBlbHNlIGlmIChyZWcgIT0gU1BfUkVHKQorCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKKwkgICAgICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQorCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIpOworCSAgICAgIGVsc2UgaWYgKHdpZHRoID09ICdxJykKKwkJb3BfYmFkID0gXygiQXV0byBpbmMgd29uJ3Qgd29yayB3aXRoIHF1YWR3b3Jkcy4iKTsKKwkgICAgICBlbHNlIGlmIChuZHggIT0gLTEpCisJCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGluIGF1dG8gaW5jIG1vZGUuIik7CisJICAgIH0KKworCSAgLyogV2Uga25vdzogaW1tID0gLTEsIGRlY19pbmMgPT0gJyAnICovCisJfQorICAgICAgZWxzZSBpZiAocmVnICE9IC0xKQorCXsKKwkgIGlmICgobmR4ICE9IC0xKSAmJiAocmVnID09IFNQX1JFRykpCisJICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCB0aGUgc3AgcmVnaXN0ZXIuIik7CisJICBpZiAoZGVmZXJyZWQpCisJICAgIHsKKwkgICAgICAvKiAqPGRpc3A+KFJuKSAqLworCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRDsKKwkgICAgICBpZiAoaW1tZWRpYXRlKQorCQlvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gcmVnaXN0ZXIgZGlzcGxhY2VkIG1vZGUuIik7CisJICAgIH0KKwkgIGVsc2UgaWYgKHJlYWxseV9ub25lKQorCSAgICB7CisJICAgICAgLyogKFJuKSAqLworCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfREVGRVJSRUQ7CisJICAgICAgLyogaWYgcmVnID0gU1AgdGhlbiBjYW50IGJlIGluZGV4ZWQgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogPGRpc3A+KFJuKSAqLworCSAgICAgIG1vZGUgPSBUQUhPRV9SRUdfRElTUDsKKwkgICAgfQorCisJICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyA9PSAnICcsIFJlZyA9IC0xICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChyZWFsbHlfbm9uZSkKKwkgICAgb3BfYmFkID0gXygiQW4gb2ZmZXN0IGlzIG5lZWRlZCBmb3IgdGhpcyBvcGVyYW5kLiIpOworCSAgaWYgKGRlZmVycmVkICYmIGltbWVkaWF0ZSkKKwkgICAgeworCSAgICAgIC8qICokPEFERFI+ICovCisJICAgICAgbW9kZSA9IFRBSE9FX0FCU09MVVRFX0FERFI7CisJICAgICAgZGlzcF9zaXplID0gNDsKKwkgICAgfQorCSAgZWxzZSBpZiAoaW1tZWRpYXRlKQorCSAgICB7CisJICAgICAgLyogJDxkaXNwPiAqLworCSAgICAgIG1vZGUgPSBUQUhPRV9JTU1FRElBVEU7CisJICAgICAgaWYgKG5keCAhPSAtMSkKKwkJb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gaW1tZWRpYXRlIG1vZGUuIik7CisJICAgICAgaWYgKGFjY2VzcyA9PSAnYScpCisJCW9wX2JhZCA9IF8oIkltbWVkaWF0ZSBhY2Nlc3MgY2FuJ3QgYmUgdXNlZCBhcyBhbiBhZGRyZXNzLiIpOworCSAgICAgIC8qIHBvbmRlciB0aGUgd2lzZG9tIG9mIGEgY2FzdCBiZWNhdXNlIGl0IGRvZXNuJ3QgZG8gYW55IGdvb2QuICovCisJICAgIH0KKwkgIGVsc2UgaWYgKGRlZmVycmVkKQorCSAgICB7CisJICAgICAgLyogKjxkaXNwPiAqLworCSAgICAgIG1vZGUgPSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogPGRpc3A+ICovCisJICAgICAgbW9kZSA9IFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyoKKyAgICogQXQgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvcnMgd2UgY2FuIGRvIGhhdmUgYmUgY2hlY2tlZCBmb3IuCisgICAqIFdlIGNhbiBidWlsZCB0aGUgJ3RvcCcuICovCisKKyAgdG9wUC0+dG9wX25keCA9IG5keDsKKyAgdG9wUC0+dG9wX3JlZyA9IHJlZzsKKyAgdG9wUC0+dG9wX21vZGUgPSBtb2RlOworICB0b3BQLT50b3BfZXJyb3IgPSBvcF9iYWQ7CisgIHRvcFAtPnRvcF9kaXNwc2l6ZSA9IGRpc3Bfc2l6ZTsKK30JCQkJLyogdGlwX29wICovCisMCisvKgorICogICAgICAgICAgICAgICAgICB0IGkgcCAoICkKKyAqCisgKiBUaGlzIGNvbnZlcnRzIGEgc3RyaW5nIGludG8gYSB0YWhvZSBpbnN0cnVjdGlvbi4KKyAqIFRoZSBzdHJpbmcgbXVzdCBiZSBhIGJhcmUgc2luZ2xlIGluc3RydWN0aW9uIGluIHRhaG9lICh3aXRoIEJTRDQgZnJvYnMpCisgKiBmb3JtYXQuCisgKiBJdCBwcm92aWRlcyBhdCBtb3N0IG9uZSBmYXRhbCBlcnJvciBtZXNzYWdlICh3aGljaCBzdG9wcyB0aGUgc2NhbikKKyAqIHNvbWUgd2FybmluZyBtZXNzYWdlcyBhcyBpdCBmaW5kcyB0aGVtLgorICogVGhlIHRhaG9lIGluc3RydWN0aW9uIGlzIHJldHVybmVkIGluIGV4cGxvZGVkIGZvcm0uCisgKgorICogVGhlIGV4cGxvZGVkIGluc3RydWN0aW9uIGlzIHJldHVybmVkIHRvIGEgc3RydWN0IHRpdCBvZiB5b3VyIGNob2ljZS4KKyAqICNpbmNsdWRlICJ0YWhvZS1pbnN0LmgiIHRvIGtub3cgd2hhdCBhIHN0cnVjdCB0aXQgaXMuCisgKgorICovCisKK3N0YXRpYyB2b2lkCit0aXAgKHRpdFAsIGluc3RyaW5nKQorICAgICBzdHJ1Y3QgdGl0ICp0aXRQOwkJLyogV2UgYnVpbGQgYW4gZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaGVyZS4gKi8KKyAgICAgY2hhciAqaW5zdHJpbmc7CQkvKiBUZXh0IG9mIGEgdmF4IGluc3RydWN0aW9uOiB3ZSBtb2RpZnkuICovCit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0b3Rfd290ICp0d1AgPSBOVUxMOwkvKiBIb3cgdG8gYml0LWVuY29kZSB0aGlzIG9wY29kZS4gKi8KKyAgcmVnaXN0ZXIgY2hhciAqcDsJCS8qIDEvc2tpcCB3aGl0ZXNwYWNlLjIvc2NhbiB2b3RfaG93ICovCisgIHJlZ2lzdGVyIGNoYXIgKnE7CQkvKiAgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjb3VudDsJLyogY291bnRzIG51bWJlciBvZiBvcGVyYW5kcyBzZWVuICovCisgIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKm9wZXJhbmRwOy8qIHNjYW4gb3BlcmFuZHMgaW4gc3RydWN0IHRpdCAqLworICByZWdpc3RlciBjaGFyICphbGxvcGVyciA9ICIiOwkvKiBlcnJvciBvdmVyIGFsbCBvcGVyYW5kcyAqLworICByZWdpc3RlciBjaGFyIGM7CQkvKiBSZW1lbWJlciBjaGFyLCAod2UgY2xvYmJlciBpdAorCQkJCSAgIHdpdGggJ1wwJyB0ZW1wb3JhcmlseSkuICovCisgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOworCisgIGlmICgqaW5zdHJpbmcgPT0gJyAnKQorICAgICsraW5zdHJpbmc7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCisgIGZvciAocCA9IGluc3RyaW5nOyAqcCAmJiAqcCAhPSAnICc7IHArKykKKyAgICA7CQkJCS8qIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcgb3IKKwkJCQkgICBleGFjdGx5IDEgc3BhY2UuICovCisgIC8qIFNjYW5uZWQgdXAgdG8gZW5kIG9mIG9wZXJhdGlvbi1jb2RlLiAqLworICAvKiBPcGVyYXRpb24tY29kZSBpcyBlbmRlZCB3aXRoIHdoaXRlc3BhY2UuICovCisgIGlmIChwID09IGluc3RyaW5nKQorICAgIHsKKyAgICAgIHRpdFAtPnRpdF9lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7CisgICAgICBjb3VudCA9IDA7CisgICAgICB0aXRQLT50aXRfb3Bjb2RlID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjID0gKnA7CisgICAgICAqcCA9ICdcMCc7CisgICAgICAvKgorICAgICAqIEhlcmUgd2l0aCBpbnN0cmluZyBwb2ludGluZyB0byB3aGF0IGJldHRlciBiZSBhbiBvcC1uYW1lLCBhbmQgcAorICAgICAqIHBvaW50aW5nIHRvIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhhdC4KKyAgICAgKiBXZSB0cnVzdCBpbnN0cmluZyBwb2ludHMgdG8gYW4gb3AtbmFtZSwgd2l0aCBubyB3aGl0ZXNwYWNlLgorICAgICAqLworICAgICAgdHdQID0gKHN0cnVjdCB0b3Rfd290ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOworICAgICAgKnAgPSBjOwkJCS8qIFJlc3RvcmUgY2hhciBhZnRlciBvcC1jb2RlLiAqLworICAgICAgaWYgKHR3UCA9PSAwKQorCXsKKwkgIHRpdFAtPnRpdF9lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKKwkgIGNvdW50ID0gMDsKKwkgIHRpdFAtPnRpdF9vcGNvZGUgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKgorICAgICAgICogV2UgZm91bmQgYSBtYXRjaCEgU28gbGV0cyBwaWNrIHVwIGFzIG1hbnkgb3BlcmFuZHMgYXMgdGhlCisgICAgICAgKiBpbnN0cnVjdGlvbiB3YW50cywgYW5kIGV2ZW4gZ3JpcGUgaWYgdGhlcmUgYXJlIHRvbyBtYW55LgorICAgICAgICogV2UgZXhwZWN0IGNvbW1hIHRvIHNlcGVyYXRlIGVhY2ggb3BlcmFuZC4KKyAgICAgICAqIFdlIGxldCBpbnN0cmluZyB0cmFjayB0aGUgdGV4dCwgd2hpbGUgcCB0cmFja3MgYSBwYXJ0IG9mIHRoZQorICAgICAgICogc3RydWN0IHRvdC4KKyAgICAgICAqLworCisJICBjb3VudCA9IDA7CQkvKiBubyBvcGVyYW5kcyBzZWVuIHlldCAqLworCSAgaW5zdHJpbmcgPSBwICsgKCpwICE9ICdcMCcpOwkvKiBwb2ludCBwYXN0IHRoZSBvcGVyYXRpb24gY29kZSAqLworCSAgLyogdGlwX29wKCkgc2NyZXdzIHdpdGggdGhlIGlucHV0X2xpbmVfcG9pbnRlciwgc28gc2F2ZSBpdCBiZWZvcmUKKwkgSSBqdW1wIGluICovCisJICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGZvciAocCA9IHR3UC0+YXJncywgb3BlcmFuZHAgPSB0aXRQLT50aXRfb3BlcmFuZDsKKwkgICAgICAgISphbGxvcGVyciAmJiAqcDsKKwkgICAgICAgb3BlcmFuZHArKywgcCArPSAyKQorCSAgICB7CisJICAgICAgLyoKKwkgKiBIZXJlIHRvIHBhcnNlIG9uZSBvcGVyYW5kLiBMZWF2ZSBpbnN0cmluZyBwb2ludGluZyBqdXN0CisJICogcGFzdCBhbnkgb25lICcsJyB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhpcyBvcGVyYW5kLgorCSAqLworCSAgICAgIGlmICghcFsxXSkKKwkJYXNfZmF0YWwgKF8oIkNvbXBpbGVyIGJ1ZzogT0REIG51bWJlciBvZiBieXRlcyBpbiBhcmcgc3RydWN0dXJlICVzLiIpLAorCQkJICB0d1AtPmFyZ3MpOworCSAgICAgIGVsc2UgaWYgKCppbnN0cmluZykKKwkJeworCQkgIGZvciAocSA9IGluc3RyaW5nOyAoKnEgIT0gJywnICYmICpxICE9ICdcMCcpOyBxKyspCisJCSAgICB7CisJCSAgICAgIGlmICgqcSA9PSAnXCcnICYmIHFbMV0gIT0gJ1wwJykJLyogSnVtcCBxdW90ZWQgY2hhcmFjdGVycyAqLworCQkJcSsrOworCQkgICAgfQorCQkgIGMgPSAqcTsKKwkJICAvKgorCSAgICogUSBwb2ludHMgdG8gJywnIG9yICdcMCcgdGhhdCBlbmRzIGFyZ3VtZW50LiBDIGlzIHRoYXQKKwkgICAqIGNoYXJhY3Rlci4KKwkgICAqLworCQkgICpxID0gJ1wwJzsKKwkJICBvcGVyYW5kcC0+dG9wX2FjY2VzcyA9IHBbMF07CisJCSAgb3BlcmFuZHAtPnRvcF93aWR0aCA9IHBbMV07CisJCSAgdGlwX29wIChpbnN0cmluZyAtIDEsIG9wZXJhbmRwKTsKKwkJICAqcSA9IGM7CS8qIFJlc3RvcmUgaW5wdXQgdGV4dC4gKi8KKwkJICBpZiAoKihvcGVyYW5kcC0+dG9wX2Vycm9yKSkKKwkJICAgIHsKKwkJICAgICAgYWxsb3BlcnIgPSBvcGVyYW5kcC0+dG9wX2Vycm9yOworCQkgICAgfQorCQkgIGluc3RyaW5nID0gcSArIChjID8gMSA6IDApOwkvKiBuZXh0IG9wZXJhbmQgKGlmIGFueSkgKi8KKwkJICBjb3VudCsrOwkvKiAgd29uIGFub3RoZXIgYXJndW1lbnQsIG1heSBoYXZlIGFuIG9wZXJyICovCisJCX0KKwkgICAgICBlbHNlCisJCWFsbG9wZXJyID0gXygiTm90IGVub3VnaCBvcGVyYW5kcyIpOworCSAgICB9CisJICAvKiBSZXN0b3JlIHRoZSBwb2ludGVyLiAqLworCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7CisKKwkgIGlmICghKmFsbG9wZXJyKQorCSAgICB7CisJICAgICAgaWYgKCppbnN0cmluZyA9PSAnICcpCisJCWluc3RyaW5nKys7CS8qIFNraXAgd2hpdGVzcGFjZS4gKi8KKwkgICAgICBpZiAoKmluc3RyaW5nKQorCQlhbGxvcGVyciA9IF8oIlRvbyBtYW55IG9wZXJhbmRzIik7CisJICAgIH0KKwkgIHRpdFAtPnRpdF9lcnJvciA9IGFsbG9wZXJyOworCX0KKyAgICB9CisKKyAgdGl0UC0+dGl0X29wY29kZSA9IHR3UC0+Y29kZTsJLyogVGhlIG9wLWNvZGUuICovCisgIHRpdFAtPnRpdF9vcGVyYW5kcyA9IGNvdW50OworfQkJCQkvKiB0aXAgKi8KKwwKKy8qIG1kX2Fzc2VtYmxlKCkgZW1pdCBmcmFncyBmb3IgMSBpbnN0cnVjdGlvbiAqLwordm9pZAorbWRfYXNzZW1ibGUgKGluc3RydWN0aW9uX3N0cmluZykKKyAgICAgY2hhciAqaW5zdHJ1Y3Rpb25fc3RyaW5nOwkvKiBBIHN0cmluZzogYXNzZW1ibGUgMSBpbnN0cnVjdGlvbi4gKi8KK3sKKyAgY2hhciAqcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqb3BlcmFuZFA7LyogQW4gb3BlcmFuZC4gU2NhbnMgYWxsIG9wZXJhbmRzLiAqLworICAvKiAgY2hhciBjX3NhdmU7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KKyAgLyogIHN0cnVjdCBmcmFnICpmcmFnUDsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBGcmFnbWVudCBvZiBjb2RlIHdlIGp1c3QgbWFkZS4gKi8KKyAgLyogIHJlZ2lzdGVyIHN0cnVjdCB0b3AgKmVuZF9vcGVyYW5kUDsgZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiAtPiBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kCisJCQkJCUxpbWl0IG9mIHRoZSBmb3IgKGVhY2ggb3BlcmFuZCkuICovCisgIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwkvKiAtPiBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhpcyBvcGVyYW5kICovCisKKyAgLyogVGhlc2UgcmVmZXIgdG8gYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCBleHByZXNzaW9uLiAqLworICBzZWdUIHRvX3NlZzsJCQkvKiBUYXJnZXQgc2VnbWVudCBvZiB0aGUgYWRkcmVzcy4JICovCisKKyAgcmVnaXN0ZXIgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqdGhpc19hZGRfc3ltYm9sOwkvKiArdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KKworICAvKiAgdGFob2Vfb3Bjb2RlVCBvcGNvZGVfYXNfbnVtYmVyOyBmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFRoZSBvcGNvZGUgYXMgYSBudW1iZXIuICovCisgIGNoYXIgKm9wY29kZVA7CQkvKiBXaGVyZSBpdCBpcyBpbiBhIGZyYWcuICovCisgIC8qICBjaGFyICpvcG1vZGVQOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIFdoZXJlIG9wY29kZSB0eXBlIGlzLCBpbiBhIGZyYWcuICovCisKKyAgaW50IGRpc3BzaXplOwkJCS8qIEZyb20gdG9wX2Rpc3BzaXplOiB0YWhvZV9vcGVyYW5kX3dpZHRoCisJCQkJICAgKGluIGJ5dGVzKSAqLworICBpbnQgaXNfdW5kZWZpbmVkOwkJLyogMSBpZiBvcGVyYW5kIGV4cHJlc3Npb24ncworCQkJCSAgIHNlZ21lbnQgbm90IGtub3duIHlldC4gKi8KKyAgaW50IHBjX3JlbDsJCQkvKiBJcyB0aGlzIG9wZXJhbmQgcGMgcmVsYXRpdmU/ICovCisKKyAgLyogRGVjb2RlIHRoZSBvcGVyYW5kLiAqLworICB0aXAgKCZ0LCBpbnN0cnVjdGlvbl9zdHJpbmcpOworCisgIC8qCisgICAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIG9wZXJhbmQgZGVjb2RlIHByb3Blcmx5LgorICAgKiBOb3RpY2UgdGhhdCB3ZSBoYXZlbid0IG1hZGUgYW55IGZyYWdzIHlldC4KKyAgICogSWYgaXQgZ29vZmVkLCB0aGVuIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB3ZWRnZSBpbiBhbnkgcGFzcywKKyAgICogYW5kIHdlIGNhbiBzYWZlbHkgZmx1c2ggaXQsIHdpdGhvdXQgY2F1c2luZyBpbnRlcnBhc3Mgc3ltYm9sIHBoYXNlCisgICAqIGVycm9ycy4gVGhhdCBpcywgd2l0aG91dCBjaGFuZ2luZyBsYWJlbCB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhc3Nlcy4KKyAgICovCisgIGlmICgqdC50aXRfZXJyb3IpCisgICAgeworICAgICAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiKSwgdC50aXRfZXJyb3IpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIHNhdyBubyBlcnJvcnMgaW4gYW55IG9wZXJhbmRzIC0gdHJ5IHRvIG1ha2UgZnJhZyhzKSAqLworICAgICAgLyogRW1pdCBvcC1jb2RlLiAqLworICAgICAgLyogUmVtZW1iZXIgd2hlcmUgaXQgaXMsIGluIGNhc2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlIG9wLWNvZGUgbGF0ZXIuICovCisgICAgICBvcGNvZGVQID0gZnJhZ19tb3JlICgxKTsKKyAgICAgICpvcGNvZGVQID0gdC50aXRfb3Bjb2RlOworICAgICAgLyogTm93IGRvIGVhY2ggb3BlcmFuZC4gKi8KKyAgICAgIGZvciAob3BlcmFuZFAgPSB0LnRpdF9vcGVyYW5kOworCSAgIG9wZXJhbmRQIDwgdC50aXRfb3BlcmFuZCArIHQudGl0X29wZXJhbmRzOworCSAgIG9wZXJhbmRQKyspCisJewkJCS8qIGZvciBlYWNoIG9wZXJhbmQgKi8KKwkgIGV4cFAgPSAmKG9wZXJhbmRQLT5leHBfb2Zfb3BlcmFuZCk7CisJICBpZiAob3BlcmFuZFAtPnRvcF9uZHggPj0gMCkKKwkgICAgeworCSAgICAgIC8qIEluZGV4ZWQgYWRkcmVzc2luZyBieXRlCisJICAgTGVnYWxpdHkgb2YgaW5kZXhlZCBtb2RlIGFscmVhZHkgY2hlY2tlZDogaXQgaXMgT0sgKi8KKwkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDB4NDAgKyBvcGVyYW5kUC0+dG9wX25keCk7CisJICAgIH0JCQkvKiBpZih0b3BfbmR4Pj0wKSAqLworCisJICAvKiBIZXJlIHRvIG1ha2UgbWFpbiBvcGVyYW5kIGZyYWcocykuICovCisJICB0aGlzX2FkZF9udW1iZXIgPSBleHBQLT5YX2FkZF9udW1iZXI7CisJICB0aGlzX2FkZF9zeW1ib2wgPSBleHBQLT5YX2FkZF9zeW1ib2w7CisJICB0b19zZWcgPSBvcGVyYW5kUC0+c2VnX29mX29wZXJhbmQ7CisJICBrbm93ICh0b19zZWcgPT0gU0VHX1VOS05PV04gfHwgXAorCQl0b19zZWcgPT0gU0VHX0FCU09MVVRFIHx8IFwKKwkJdG9fc2VnID09IFNFR19EQVRBIHx8IFwKKwkJdG9fc2VnID09IFNFR19URVhUIHx8IFwKKwkJdG9fc2VnID09IFNFR19CU1MpOworCSAgaXNfdW5kZWZpbmVkID0gKHRvX3NlZyA9PSBTRUdfVU5LTk9XTik7CisJICAvKiBEbyB3ZSBrbm93IGhvdyBiaWcgdGhpcyBvcHBlcmFuZCBpcz8gKi8KKwkgIGRpc3BzaXplID0gb3BlcmFuZFAtPnRvcF9kaXNwc2l6ZTsKKwkgIHBjX3JlbCA9IDA7CisJICAvKiBEZWFsIHdpdGggdGhlIGJyYW5jaCBwb3NzYWJpbGl0aWVzLiAoTm90ZSwgdGhpcyBkb2Vzbid0IGluY2x1ZGUKKwkganVtcHMuKSovCisJICBpZiAob3BlcmFuZFAtPnRvcF9hY2Nlc3MgPT0gJ2InKQorCSAgICB7CisJICAgICAgLyogQnJhbmNoZXMgbXVzdCBiZSBleHByZXNzaW9ucy4gQSBwc3VlZG8gYnJhbmNoIGNhbiBhbHNvIGp1bXAgdG8KKwkgICBhbiBhYnNvbHV0ZSBhZGRyZXNzLiAqLworCSAgICAgIGlmICh0b19zZWcgPT0gbm93X3NlZyB8fCBpc191bmRlZmluZWQpCisJCXsKKwkJICAvKiBJZiBpc191bmRlZmluZWQsIHRoZW4gaXQgbWlnaHQgQkVDT01FIG5vd19zZWcgYnkgcmVsYXggdGltZS4gKi8KKwkJICBpZiAoZGlzcHNpemUpCisJCSAgICB7CisJCSAgICAgIC8qIEkga25vdyBob3cgYmlnIHRoZSBicmFuY2ggaXMgc3VwcG9zZWQgdG8gYmUgKGl0J3MgYSBub3JtYWwKKwkgICAgICAgYnJhbmNoKSwgc28gSSBzZXQgdXAgdGhlIGZyYWcsIGFuZCBsZXQgR0FTIGRvIHRoZSByZXN0LiAqLworCQkgICAgICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSk7CisJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCQkgICAgICAgc2l6ZV90b19meCAoZGlzcHNpemUsIDEpLAorCQkJICAgICAgIE5VTEwpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogKHRvX3NlZz09bm93X3NlZyB8fCB0b19zZWcgPT0gU0VHX1VOS05PV04pICYmIGRpc3BzaXplPT0wICovCisJCSAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgaG93IGJpZyBpdCBpcywgdGhlbiBpdHMgYSBzeW50aGV0aWMgYnJhbmNoLAorCSAgICAgICBzbyB3ZSBzZXQgdXAgYSBzaW1wbGUgcmVsYXggc3RhdGUuICovCisJCSAgICAgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF93aWR0aCkKKwkJCXsKKwkJCWNhc2UgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUDoKKwkJCSAgLyogU2ltcGxlIChjb25kaXRpb25hbCkganVtcC4gSSBtYXkgaGF2ZSB0byByZXZlcnNlIHRoZQorCQkgY29uZGl0aW9uIG9mIG9wY29kZVAsIGFuZCB0aGVuIGp1bXAgdG8gbXkgZGVzdGluYXRpb24uCisJCSBJIHNldCAxIGJ5dGUgYXNpZGUgZm9yIHRoZSBicmFuY2ggb2ZmIHNldCwgYW5kIGNvdWxkIG5lZWQgNgorCQkgbW9yZSBieXRlcyBmb3IgdGhlIHBjX3JlbCBqdW1wICovCisJCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNywgMSwKKwkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsCisJCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKKwkJCQkgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIG9wY29kZVApOworCQkJICBicmVhazsKKwkJCWNhc2UgVEFIT0VfV0lEVEhfQUxXQVlTX0pVTVA6CisJCQkgIC8qIFNpbXBsZSAodW5jb25kaXRpb25hbCkganVtcC4gSSBtYXkgaGF2ZSB0byBjb252ZXJ0IHRoaXMgdG8KKwkJIGEgd29yZCBicmFuY2gsIG9yIGFuIGFic29sdXRlIGp1bXAuICovCisJCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMSwKKwkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILAorCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCisJCQkJIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCBvcGNvZGVQKTsKKwkJCSAgYnJlYWs7CisJCQkgIC8qIFRoZSBzbWFsbGVzdCBzaXplIGZvciB0aGUgbmV4dCAyIGNhc2VzIGlzIHdvcmQuICovCisJCQljYXNlIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUDoKKwkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAyLAorCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILAorCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfV09SRCksCisJCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAorCQkJCSAgICBvcGNvZGVQKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVA6CisJCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCisJCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILAorCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfV09SRCksCisJCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAorCQkJCSAgICBvcGNvZGVQKTsKKwkJCSAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICBhc19mYXRhbCAoXygiQ29tcGxpbGVyIGJ1ZzogR290IGEgY2FzZSAoJWQpIEkgd2Fzbid0IGV4cGVjdGluZy4iKSwKKwkJCQkgICAgb3BlcmFuZFAtPnRvcF93aWR0aCk7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gc2VnX3Vua25vd24gKHN0aWxsIGluIGJyYW5jaCkKKwkgICAgIEluIG90aGVyIHdvcmRzLCBJJ20ganVtcGluZyBvdXQgb2YgbXkgc2VnbWVudCBzbyBleHRlbmQgdGhlCisJICAgICBicmFuY2hlcyB0byBqdW1wcywgYW5kIGxldCBHQVMgZml4IHRoZW0uICovCisKKwkJICAvKiBUaGVzZSBhcmUgImJyYW5jaGVzIiB3aGF0IHdpbGwgYWx3YXlzIGJlIGJyYW5jaGVzIGFyb3VuZCBhIGp1bXAKKwkgICAgIHRvIHRoZSBjb3JyZWN0IGFkZHJlc3NzIGluIHJlYWwgbGlmZS4KKwkgICAgIElmIHRvX3NlZyBpcyBTRUdfQUJTT0xVVEUsIGp1c3QgZW5jb2RlIHRoZSBicmFuY2ggaW4sCisJICAgICBlbHNlIGxldCBHQVMgZml4IHRoZSBhZGRyZXNzLiAqLworCisJCSAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX3dpZHRoKQorCQkgICAgeworCQkgICAgICAvKiBUaGUgdGhlb3J5OgorCSAgICAgICBGb3IgU0VHX0FCU09MVVRFLCB0aGVuIG1vZGUgaXMgQUJTT0xVVEVfQUREUiwganVtcAorCSAgICAgICB0byB0aGF0IGFkZHJlc3NzIChub3QgcGNfcmVsKS4KKwkgICAgICAgRm9yIG90aGVyIHNlZ3MsIGFkZHJlc3MgaXMgYSBsb25nIHdvcmQgUEMgcmVsIGp1bXAuICovCisJCSAgICBjYXNlIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVA6CisJCSAgICAgIC8qIGI8Y29uZD4gKi8KKwkJICAgICAgLyogVG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uIGluIGEgVEFIT0UgYnJhbmNoLAorCSAgICAgICBjb21wbGVtZW50IGJpdCA0ICovCisJCSAgICAgICpvcGNvZGVQIF49IDB4MTA7CisJCSAgICAgIHAgPSBmcmFnX21vcmUgKDcpOworCQkgICAgICAqcCsrID0gNjsKKwkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKKwkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KKwkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKKwkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKKwkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKKwkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7CisJCSAgICAgIC8qCisJICAgICAqIE5vdyAoZWcpCUJMRVEJMWYKKwkgICAgICoJCUpNUAlmb28KKwkgICAgICoJMToKKwkgICAgICovCisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUDoKKwkJICAgICAgLyogYnIsIGp1c3QgdHVybiBpdCBpbnRvIGEganVtcCAqLworCQkgICAgICAqb3Bjb2RlUCA9IFRBSE9FX0pNUDsKKwkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7CisJCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09CisJCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6CisJCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7CisJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOworCQkgICAgICAvKiBOb3cgKGVnKSBKTVAgZm9vICovCisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBUQUhPRV9XSURUSF9CSUdfUkVWX0pVTVA6CisJCSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOworCQkgICAgICAqb3Bjb2RlUCBePSAweDEwOworCQkgICAgICAqcCsrID0gMDsKKwkJICAgICAgKnArKyA9IDY7CisJCSAgICAgICpwKysgPSBUQUhPRV9KTVA7CisJCSAgICAgICpwKysgPSAob3BlcmFuZFAtPnRvcF9tb2RlID09CisJCQkgICAgICBUQUhPRV9BQlNPTFVURV9BRERSID8gVEFIT0VfQUJTT0xVVEVfQUREUiA6CisJCQkgICAgICBUQUhPRV9QQ19SRUxfTE9ORyk7CisJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCSAgICAgICAodG9fc2VnICE9IFNFR19BQlNPTFVURSkgPyBGWF9QQ1JFTDMyIDogRlhfMzIsIE5VTEwpOworCQkgICAgICAvKgorCSAgICAgKiBOb3cgKGVnKQlBQ0J4CTFmCisJICAgICAqCQlKTVAgICAgIGZvbworCSAgICAgKgkxOgorCSAgICAgKi8KKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVA6CisJCSAgICAgIHAgPSBmcmFnX21vcmUgKDEwKTsKKwkJICAgICAgKnArKyA9IDA7CisJCSAgICAgICpwKysgPSAyOworCQkgICAgICAqcCsrID0gVEFIT0VfQlJCOworCQkgICAgICAqcCsrID0gNjsKKwkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKKwkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KKwkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKKwkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKKwkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKKwkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7CisJCSAgICAgIC8qCisJICAgICAqIE5vdyAoZWcpCXhPQnh4eAkxZgorCSAgICAgKgkJQlJCCTJmCisJICAgICAqCTE6CUpNUAlAI2ZvbworCSAgICAgKgkyOgorCSAgICAgKi8KKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdiJzoKKwkJICAgIGNhc2UgJ3cnOgorCQkgICAgICBhc193YXJuIChfKCJSZWFsIGJyYW5jaCBkaXNwbGFjZW1lbnRzIG11c3QgYmUgZXhwcmVzc2lvbnMuIikpOworCQkgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGFzX2ZhdGFsIChfKCJDb21wbGllciBlcnJvcjogSSBnb3QgYW4gdW5rbm93biBzeW50aGV0aWMgYnJhbmNoIDolYyIpLAorCQkJCW9wZXJhbmRQLT50b3Bfd2lkdGgpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBJdCBhaW4ndCBhIGJyYW5jaCBvcGVyYW5kLiAqLworCSAgICAgIHN3aXRjaCAob3BlcmFuZFAtPnRvcF9tb2RlKQorCQl7CisJCSAgLyogQXV0by1mb28gYWNjZXNzLCBvbmx5IHdvcmtzIGZvciBvbmUgcmVnIChTUCkKKwkgICAgIHNvIHRoZSBvbmx5IHRoaW5nIG5lZWRlZCBpcyB0aGUgbW9kZS4gKi8KKwkJY2FzZSBUQUhPRV9BVVRPX0RFQzoKKwkJY2FzZSBUQUhPRV9BVVRPX0lOQzoKKwkJY2FzZSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRDoKKwkJICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT50b3BfbW9kZSk7CisJCSAgYnJlYWs7CisKKwkJICAvKiBOdW1iZXJlZCBSZWdpc3RlciBvbmx5IGFjY2Vzcy4gT25seSB0aGluZyBuZWVkZWQgaXMgdGhlCisJICAgICBtb2RlICsgUmVnaXN0ZXIgbnVtYmVyICovCisJCWNhc2UgVEFIT0VfRElSRUNUX1JFRzoKKwkJY2FzZSBUQUhPRV9SRUdfREVGRVJSRUQ6CisJCSAgRlJBR19BUFBFTkRfMV9DSEFSIChvcGVyYW5kUC0+dG9wX21vZGUgKyBvcGVyYW5kUC0+dG9wX3JlZyk7CisJCSAgYnJlYWs7CisKKwkJICAvKiBBbiBhYnNvbHV0ZSBhZGRyZXNzLiBJdCdzIHNpemUgaXMgYWx3YXlzIDUgYnl0ZXMuCisJICAgICAobW9kZV90eXBlICsgNCBieXRlIGFkZHJlc3MpLiAqLworCQljYXNlIFRBSE9FX0FCU09MVVRFX0FERFI6CisJCSAga25vdyAoKHRoaXNfYWRkX3N5bWJvbCA9PSBOVUxMKSk7CisJCSAgcCA9IGZyYWdfbW9yZSAoNSk7CisJCSAgKnAgPSBUQUhPRV9BQlNPTFVURV9BRERSOworCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgNCk7CisJCSAgYnJlYWs7CisKKwkJICAvKiBJbW1lZGlhdGUgZGF0YS4gSWYgdGhlIHNpemUgaXNuJ3Qga25vd24sIHRoZW4gaXQncyBhbiBhZGRyZXNzCisJICAgICArIGFuZCBvZmZzZXQsIHdoaWNoIGlzIDQgYnl0ZXMgYmlnLiAqLworCQljYXNlIFRBSE9FX0lNTUVESUFURToKKwkJICBpZiAodGhpc19hZGRfc3ltYm9sICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOworCQkgICAgICAqcCsrID0gVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEOworCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAorCQkJICAgICAgIEZYXzMyLCBOVUxMKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIC8qIEl0J3MgYSBpbnRlZ2VyLCBhbmQgSSBrbm93IGl0J3Mgc2l6ZS4gKi8KKwkJICAgICAgaWYgKCh1bnNpZ25lZCkgdGhpc19hZGRfbnVtYmVyIDwgMHg0MCkKKwkJCXsKKwkJCSAgLyogV2lsbCBpdCBmaXQgaW4gYSBsaXRlcmFsPyAqLworCQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKChieXRlKSB0aGlzX2FkZF9udW1iZXIpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplICsgMSk7CisJCQkgIHN3aXRjaCAoZGlzcHNpemUpCisJCQkgICAgeworCQkJICAgIGNhc2UgMToKKwkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfQllURTsKKwkJCSAgICAgICpwID0gKGJ5dGUpIHRoaXNfYWRkX251bWJlcjsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgMjoKKwkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfV09SRDsKKwkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdGhpc19hZGRfbnVtYmVyLCAyKTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgNDoKKwkJCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQ7CisJCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHRoaXNfYWRkX251bWJlciwgNCk7CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgYnJlYWs7CisKKwkJICAvKiBEaXN0YW5jZSBmcm9tIHRoZSBQQy4gSWYgdGhlIHNpemUgaXNuJ3Qga25vd24sIHdlIGhhdmUgdG8gcmVsYXgKKwkgICAgIGludG8gaXQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgZGlzcChzcCkgaXMgdGhhdAorCSAgICAgdGhpcyBvZmZzZXQgaXMgcGNfcmVsLCBhbmQgZGlzcChzcCkgaXNuJ3QuCisJICAgICBOb3RlIHRoZSBkcm9wIHRocm91Z2ggY29kZS4gKi8KKworCQljYXNlIFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRToKKwkJY2FzZSBUQUhPRV9ESVNQX1JFTF9ERUZFUlJFRDoKKwkJICBvcGVyYW5kUC0+dG9wX3JlZyA9IFBDX1JFRzsKKwkJICBwY19yZWwgPSAxOworCisJCSAgLyogUmVnaXN0ZXIsIHBsdXMgYSBkaXNwbGFjZW1lbnQgbW9kZS4gU2F2ZSB0aGUgcmVnaXN0ZXIgbnVtYmVyLAorCSAgICAgYW5kIHdlYXRoZXIgaXRzIGRlZmZlcmVkIG9yIG5vdCwgYW5kIHJlbGF4IHRoZSBzaXplIGlmIGl0IGlzbid0CisJICAgICBrbm93bi4gKi8KKwkJY2FzZSBUQUhPRV9SRUdfRElTUDoKKwkJY2FzZSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRDoKKwkJICBpZiAob3BlcmFuZFAtPnRvcF9tb2RlID09IFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEIHx8CisJCSAgICAgIG9wZXJhbmRQLT50b3BfbW9kZSA9PSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRCkKKwkJICAgIG9wZXJhbmRQLT50b3BfcmVnICs9IDB4MTA7CS8qIGRlZmZlcmVkIG1vZGUgaXMgYWx3YXlzIDB4MTAgaGlnaGVyCisJCQkJCSAgdGhhbiBpdCdzIG5vbi1kZWZmZXJlZCBzaWJsaW5nLiAqLworCisJCSAgLyogSXMgdGhpcyBhIHZhbHVlIG91dCBvZiB0aGlzIHNlZ21lbnQ/CisJICAgICBUaGUgZmlyc3QgcGFydCBvZiB0aGlzIGNvbmRpdGlvbmFsIGlzIGEgY2x1ZGdlIHRvIG1ha2UgZ2FzCisJICAgICBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dCBhcyAnYXMnIHdoZW4gdGhlcmUgaXMgYSBsYWJsZSwgaW4KKwkgICAgIHRoZSBjdXJyZW50IHNlZ21lbnQsIGRpc3BsYWNlaW5nIGEgcmVnaXN0ZXIuIEl0J3Mgc3RyYW5nZSwKKwkgICAgIGFuZCBubyBvbmUgaW4gdGhlaXIgcmlnaHQgbWluZCB3b3VsZCBkbyBpdCwgYnV0IGl0J3MgZWFzeQorCSAgICAgdG8gY2x1ZGdlLiAqLworCQkgIGlmICgoZGlzcHNpemUgPT0gMCAmJiAhcGNfcmVsKSB8fAorCQkgICAgICAodG9fc2VnICE9IG5vd19zZWcgJiYgIWlzX3VuZGVmaW5lZCAmJiB0b19zZWcgIT0gU0VHX0FCU09MVVRFKSkKKwkJICAgIGRpc3BzaXplID0gNDsKKworCQkgIGlmIChkaXNwc2l6ZSA9PSAwKQorCQkgICAgeworCQkgICAgICAvKgorCSAgICAgKiBXZSBoYXZlIGEgU0VHX1VOS05PV04gc3ltYm9sLCBvciB0aGUgc2l6ZSBpc24ndCBjYXN0LgorCSAgICAgKiBJdCBtaWdodCB0dXJuIG91dCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50IGFzCisJICAgICAqIHRoZSBpbnN0cnVjdGlvbiwgcGVybWl0dGluZyByZWxheGF0aW9uLgorCSAgICAgKi8KKwkJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMiwKKwkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwKKwkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAorCQkJCSAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgMCk7CisJCSAgICAgICpwID0gb3BlcmFuZFAtPnRvcF9yZWc7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBFaXRoZXIgdGhpcyBpcyBhbiBhYnMsIG9yIGEgY2FzdC4gKi8KKwkJICAgICAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUgKyAxKTsKKwkJICAgICAgc3dpdGNoIChkaXNwc2l6ZSkKKwkJCXsKKwkJCWNhc2UgMToKKwkJCSAgKnAgPSBUQUhPRV9QQ19PUl9CWVRFICsgb3BlcmFuZFAtPnRvcF9yZWc7CisJCQkgIGJyZWFrOworCQkJY2FzZSAyOgorCQkJICAqcCA9IFRBSE9FX1BDX09SX1dPUkQgKyBvcGVyYW5kUC0+dG9wX3JlZzsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDQ6CisJCQkgICpwID0gVEFIT0VfUENfT1JfTE9ORyArIG9wZXJhbmRQLT50b3BfcmVnOworCQkJICBicmVhazsKKwkJCX07CisJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAorCQkJICAgICAgIHNpemVfdG9fZnggKGRpc3BzaXplLCBwY19yZWwpLCBOVUxMKTsKKwkJICAgIH0KKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBhc19mYXRhbCAoXygiQmFyZiwgYmFkIG1vZGUgJXhcbiIpLCBvcGVyYW5kUC0+dG9wX21vZGUpOworCQl9CisJICAgIH0KKwl9CQkJLyogZm9yKG9wZXJhbmRQKSAqLworICAgIH0JCQkJLyogaWYoIW5lZWRfcGFzc18yICYmICFnb29mZWQpICovCit9CQkJCS8qIHRhaG9lX2Fzc2VtYmxlKCkgKi8KKworCisvKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KKworLyogQVJHU1VTRUQgKi8KK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIDA7Cit9CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLworCisvKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1Qgc2VnbWVudDsKKyAgICAgdmFsdWVUIHNpemU7Cit7CisgIHJldHVybiAoKHNpemUgKyA3KSAmIH43KTsJLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDggKi8KK30JCQkJLyogbWRfc2VjdGlvbl9hbGlnbigpICovCisKKy8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KKyAgIE9uIHRoZSBzcGFyYywgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCisgICBpdHMgc2l6ZS4gIFRoaXMgZ2V0cyB1cyB0byB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLgorICAgKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KK2xvbmcgCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICByZXR1cm4gKCgoZml4UC0+ZnhfdHlwZSA9PSBGWF84CisJICAgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUw4KQorCSAgID8gMQorCSAgIDogKChmaXhQLT5meF90eXBlID09IEZYXzE2CisJICAgICAgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwxNikKKwkgICAgICA/IDIKKwkgICAgICA6ICgoZml4UC0+ZnhfdHlwZSA9PSBGWF8zMgorCQkgIHx8IGZpeFAtPmZ4X3R5cGUgPT0gRlhfUENSRUwzMikKKwkJID8gNAorCQkgOiAwKSkpICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzKTsKK30JCQkJLyogbWRfcGNyZWxfZnJvbSgpICovCisKK2ludCAKK3RjX2lzX3BjcmVsIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICAvKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICovCisgIGtub3cgKDApOworICByZXR1cm4gKDApOworfQkJCQkvKiB0Y19pc19wY3JlbCgpICovCisKKy8qIGVuZCBvZiB0Yy10YWhvZS5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRhaG9lLmggYi9nYXMvY29uZmlnL3RjLXRhaG9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4YTViZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtdGFob2UuaApAQCAtMCwwICsxLDQzIEBACisvKiBUaGlzIGZpbGUgaXMgdGMtdGFob2UuaAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRDX1RBSE9FIDEKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCisKKyNkZWZpbmUgTk9fTElTVElORworCisjZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIGRvbid0IG5lZWQgaXQuICovCisjZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogZG9uJ3QgbmVlZCBpdC4gKi8KKyNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayhhKQl7O30KKworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOworI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjb21tZW50LWNvbHVtbjogMAorICogZmlsbC1jb2x1bW46IDEzMQorICogRW5kOgorICovCisKKy8qIGVuZCBvZiB0Yy10YWhvZS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzMwLmMgYi9nYXMvY29uZmlnL3RjLXRpYzMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlZDkwNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtdGljMzAuYwpAQCAtMCwwICsxLDE4ODcgQEAKKy8qIHRjLWMzMC5jIC0tIEFzc2VtYmx5IGNvZGUgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAKKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICAgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwIG1hY2hpbmUgc3BlY2lmaWMgZ2FzLgorICAgV3JpdHRlbiBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KS4KKyAgIEJ1Z3MgJiBzdWdnZXN0aW9ucyBhcmUgY29tcGxldGVseSB3ZWxjb21lLiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLgorICAgUGxlYXNlIGhlbHAgdXMgbWFrZSBpdCBiZXR0ZXIuCisgKi8KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAib3Bjb2RlL3RpYzMwLmgiCisKKy8qIHB1dCBoZXJlIGFsbCBub24tZGlnaXQgbm9uLWxldHRlciBjaGFyY3RlcnMgdGhhdCBtYXkgb2NjdXIgaW4gYW4gb3BlcmFuZCAqLworc3RhdGljIGNoYXIgb3BlcmFuZF9zcGVjaWFsX2NoYXJzW10gPSAiJSQtKygsKSouX34vPD4mXiE6W0BdIjsKK3N0YXRpYyBjaGFyICpvcmRpbmFsX25hbWVzW10gPQoreyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiLCAiZm91cnRoIiwgImZpZnRoIn07CisKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gMDsKKworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Citjb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIioiOworY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7CisKK2NvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KK3sKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKKworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKKworLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KKy8qIEFzIGluIDBmMTIuNDU2ICovCisvKiBvciAgICAwZDEuMjM0NWUxMiAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmRmREeFgiOworCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIHRhYmxlcyBmb3IgbGV4aWNhbCBhbmFseXNpcyAqLworc3RhdGljIGNoYXIgb3Bjb2RlX2NoYXJzWzI1Nl07CitzdGF0aWMgY2hhciByZWdpc3Rlcl9jaGFyc1syNTZdOworc3RhdGljIGNoYXIgb3BlcmFuZF9jaGFyc1syNTZdOworc3RhdGljIGNoYXIgc3BhY2VfY2hhcnNbMjU2XTsKK3N0YXRpYyBjaGFyIGlkZW50aWZpZXJfY2hhcnNbMjU2XTsKK3N0YXRpYyBjaGFyIGRpZ2l0X2NoYXJzWzI1Nl07CisKKy8qIGxleGljYWwgbWFjcm9zICovCisjZGVmaW5lIGlzX29wY29kZV9jaGFyKHgpIChvcGNvZGVfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQorI2RlZmluZSBpc19vcGVyYW5kX2NoYXIoeCkgKG9wZXJhbmRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQorI2RlZmluZSBpc19yZWdpc3Rlcl9jaGFyKHgpIChyZWdpc3Rlcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCisjZGVmaW5lIGlzX3NwYWNlX2NoYXIoeCkgKHNwYWNlX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKKyNkZWZpbmUgaXNfaWRlbnRpZmllcl9jaGFyKHgpIChpZGVudGlmaWVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKKyNkZWZpbmUgaXNfZGlnaXRfY2hhcih4KSAoZGlnaXRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQorCitjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworICB7MCwgMCwgMH0KK307CisKKyN1bmRlZiBVU0VfU1RET1VUCisjZGVmaW5lIFVTRV9TVERPVVQgMQorCisjaWZkZWYgVVNFX1NUREFSRworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludAorZGVidWcgKGNvbnN0IGNoYXIgKnN0cmluZywuLi4pCit7CisgIGlmIChmbGFnX2RlYnVnKQorICAgIHsKKyAgICAgIHZhX2xpc3QgYXJncHRyOworICAgICAgY2hhciBzdHJbMTAwXTsKKworICAgICAgdmFfc3RhcnQgKGFyZ3B0ciwgc3RyaW5nKTsKKyAgICAgIHZzcHJpbnRmIChzdHIsIHN0cmluZywgYXJncHRyKTsKKyAgICAgIGlmIChzdHJbMF0gPT0gJ1wwJykKKwlyZXR1cm4gKDApOworICAgICAgdmFfZW5kIChhcmdwdHIpOworICAgICAgZnB1dHMgKHN0ciwgVVNFX1NURE9VVCA/IHN0ZG91dCA6IHN0ZGVycik7CisgICAgICByZXR1cm4gc3RybGVuIChzdHIpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2Vsc2UKK2ludAorZGVidWcgKHN0cmluZywgdmFfYWxpc3QpCisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgdmFfZGNsCit7CisgIGlmIChmbGFnX2RlYnVnKQorICAgIHsKKyAgICAgIHZhX2xpc3QgYXJncHRyOworICAgICAgY2hhciBzdHJbMTAwXTsKKyAgICAgIGludCBjbnQ7CisKKyAgICAgIHZhX3N0YXJ0IChhcmdwdHIsIHN0cmluZyk7CisgICAgICBjbnQgPSB2c3ByaW50ZiAoc3RyLCBzdHJpbmcsIGFyZ3B0cik7CisgICAgICBpZiAoc3RyWzBdID09IE5VTEwpCisJcmV0dXJuICgwKTsKKyAgICAgIHZhX2VuZCAoYXJncHRyKTsKKyAgICAgIGZwdXRzIChzdHIsIFVTRV9TVERPVVQgPyBzdGRvdXQgOiBzdGRlcnIpOworICAgICAgcmV0dXJuIChjbnQpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qIGhhc2ggdGFibGUgZm9yIG9wY29kZSBsb29rdXAgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOworLyogaGFzaCB0YWJsZSBmb3IgcGFyYWxsZWwgb3Bjb2RlIGxvb2t1cCAqLworc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnBhcm9wX2hhc2g7CisvKiBoYXNoIHRhYmxlIGZvciByZWdpc3RlciBsb29rdXAgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZWdfaGFzaDsKKy8qIGhhc2ggdGFibGUgZm9yIGluZGlyZWN0IGFkZHJlc3NpbmcgbG9va3VwICovCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqaW5kX2hhc2g7CisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGNvbnN0IGNoYXIgKmhhc2hfZXJyOworICBkZWJ1ZyAoIkluIG1kX2JlZ2luKClcbiIpOworICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7CisgIHsKKyAgICBjb25zdCB0ZW1wbGF0ZSAqY3VycmVudF9vcHRhYiA9IHRpYzMwX29wdGFiOworICAgIGZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCisgICAgICB7CisJaGFzaF9lcnIgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgY3VycmVudF9vcHRhYi0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9vcHRhYik7CisJaWYgKGhhc2hfZXJyKQorCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X29wdGFiLT5uYW1lLCBoYXNoX2Vycik7CisgICAgICB9CisgIH0KKyAgcGFyb3BfaGFzaCA9IGhhc2hfbmV3ICgpOworICB7CisgICAgY29uc3QgcGFydGVtcGxhdGUgKmN1cnJlbnRfcGFyb3AgPSB0aWMzMF9wYXJvcHRhYjsKKyAgICBmb3IgKDsgY3VycmVudF9wYXJvcCA8IHRpYzMwX3Bhcm9wdGFiX2VuZDsgY3VycmVudF9wYXJvcCsrKQorICAgICAgeworCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKHBhcm9wX2hhc2gsIGN1cnJlbnRfcGFyb3AtPm5hbWUsIChjaGFyICopIGN1cnJlbnRfcGFyb3ApOworCWlmIChoYXNoX2VycikKKwkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9wYXJvcC0+bmFtZSwgaGFzaF9lcnIpOworICAgICAgfQorICB9CisgIHJlZ19oYXNoID0gaGFzaF9uZXcgKCk7CisgIHsKKyAgICBjb25zdCByZWcgKmN1cnJlbnRfcmVnID0gdGljMzBfcmVndGFiOworICAgIGZvciAoOyBjdXJyZW50X3JlZyA8IHRpYzMwX3JlZ3RhYl9lbmQ7IGN1cnJlbnRfcmVnKyspCisgICAgICB7CisJaGFzaF9lcnIgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIGN1cnJlbnRfcmVnLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X3JlZyk7CisJaWYgKGhhc2hfZXJyKQorCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X3JlZy0+bmFtZSwgaGFzaF9lcnIpOworICAgICAgfQorICB9CisgIGluZF9oYXNoID0gaGFzaF9uZXcgKCk7CisgIHsKKyAgICBjb25zdCBpbmRfYWRkcl90eXBlICpjdXJyZW50X2luZCA9IHRpYzMwX2luZGFkZHJfdGFiOworICAgIGZvciAoOyBjdXJyZW50X2luZCA8IHRpYzMwX2luZGFkZHJ0YWJfZW5kOyBjdXJyZW50X2luZCsrKQorICAgICAgeworCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKGluZF9oYXNoLCBjdXJyZW50X2luZC0+c3ludGF4LCAoY2hhciAqKSBjdXJyZW50X2luZCk7CisJaWYgKGhhc2hfZXJyKQorCSAgYXNfZmF0YWwgKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgSGFzaCAlczogJXMiLCBjdXJyZW50X2luZC0+c3ludGF4LCBoYXNoX2Vycik7CisgICAgICB9CisgIH0KKyAgLyogZmlsbCBpbiBsZXhpY2FsIHRhYmxlczogIG9wY29kZV9jaGFycywgb3BlcmFuZF9jaGFycywgc3BhY2VfY2hhcnMgKi8KKyAgeworICAgIHJlZ2lzdGVyIGludCBjOworICAgIHJlZ2lzdGVyIGNoYXIgKnA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCisgICAgICB7CisJaWYgKGlzbG93ZXIgKGMpIHx8IGlzZGlnaXQgKGMpKQorCSAgeworCSAgICBvcGNvZGVfY2hhcnNbY10gPSBjOworCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IGM7CisJICB9CisJZWxzZSBpZiAoaXN1cHBlciAoYykpCisJICB7CisJICAgIG9wY29kZV9jaGFyc1tjXSA9IHRvbG93ZXIgKGMpOworCSAgICByZWdpc3Rlcl9jaGFyc1tjXSA9IG9wY29kZV9jaGFyc1tjXTsKKwkgIH0KKwllbHNlIGlmIChjID09ICcpJyB8fCBjID09ICcoJykKKwkgIHsKKwkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOworCSAgfQorCWlmIChpc3VwcGVyIChjKSB8fCBpc2xvd2VyIChjKSB8fCBpc2RpZ2l0IChjKSkKKwkgIG9wZXJhbmRfY2hhcnNbY10gPSBjOworCWlmIChpc2RpZ2l0IChjKSB8fCBjID09ICctJykKKwkgIGRpZ2l0X2NoYXJzW2NdID0gYzsKKwlpZiAoaXNhbHBoYSAoYykgfHwgYyA9PSAnXycgfHwgYyA9PSAnLicgfHwgaXNkaWdpdCAoYykpCisJICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKKwlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCSAgc3BhY2VfY2hhcnNbY10gPSBjOworCWlmIChjID09ICdfJykKKwkgIG9wY29kZV9jaGFyc1tjXSA9IGM7CisgICAgICB9CisgICAgZm9yIChwID0gb3BlcmFuZF9zcGVjaWFsX2NoYXJzOyAqcCAhPSAnXDAnOyBwKyspCisgICAgICBvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSAqcF0gPSAqcDsKKyAgfQorfQorCisvKiBBZGRyZXNzIE1vZGUgT1IgdmFsdWVzICovCisjZGVmaW5lIEFNX1JlZ2lzdGVyICAweDAwMDAwMDAwCisjZGVmaW5lIEFNX0RpcmVjdCAgICAweDAwMjAwMDAwCisjZGVmaW5lIEFNX0luZGlyZWN0ICAweDAwNDAwMDAwCisjZGVmaW5lIEFNX0ltbWVkaWF0ZSAweDAwNjAwMDAwCisjZGVmaW5lIEFNX05vdFJlcSAgICAweEZGRkZGRkZGCisKKy8qIFBDIFJlbGF0aXZlIE9SIHZhbHVlcyAqLworI2RlZmluZSBQQ19SZWdpc3RlciAweDAwMDAwMDAwCisjZGVmaW5lIFBDX1JlbGF0aXZlIDB4MDIwMDAwMDAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgb3BfdHlwZTsKKyAgc3RydWN0CisgICAgeworICAgICAgaW50IHJlc29sdmVkOworICAgICAgdW5zaWduZWQgYWRkcmVzczsKKyAgICAgIGNoYXIgKmxhYmVsOworICAgICAgZXhwcmVzc2lvblMgZGlyZWN0X2V4cHI7CisgICAgfQorICBkaXJlY3Q7CisgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIG1vZDsKKyAgICAgIGludCBBUm51bTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZGlzcDsKKyAgICB9CisgIGluZGlyZWN0OworICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBvcGNvZGU7CisgICAgfQorICByZWc7CisgIHN0cnVjdAorICAgIHsKKyAgICAgIGludCByZXNvbHZlZDsKKyAgICAgIGludCBkZWNpbWFsX2ZvdW5kOworICAgICAgZmxvYXQgZl9udW1iZXI7CisgICAgICBpbnQgc19udW1iZXI7CisgICAgICB1bnNpZ25lZCBpbnQgdV9udW1iZXI7CisgICAgICBjaGFyICpsYWJlbDsKKyAgICAgIGV4cHJlc3Npb25TIGltbV9leHByOworICAgIH0KKyAgaW1tZWRpYXRlOworfQorb3BlcmFuZDsKKworaW50IHRpYzMwX3BhcmFsbGVsX2luc24gUEFSQU1TICgoY2hhciAqKSk7CitvcGVyYW5kICp0aWMzMF9vcGVyYW5kIFBBUkFNUyAoKGNoYXIgKikpOworY2hhciAqdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7CisKK3RlbXBsYXRlICpvcGNvZGU7CisKK3N0cnVjdCB0aWMzMF9pbnNuCisgIHsKKyAgICB0ZW1wbGF0ZSAqdG07CQkvKiBUZW1wbGF0ZSBvZiBjdXJyZW50IGluc3RydWN0aW9uICovCisgICAgdW5zaWduZWQgb3Bjb2RlOwkJLyogRmluYWwgb3Bjb2RlICovCisgICAgaW50IG9wZXJhbmRzOwkJLyogTnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzICovCisgICAgLyogVHlwZSBvZiBvcGVyYW5kIGdpdmVuIGluIGluc3RydWN0aW9uICovCisgICAgb3BlcmFuZCAqb3BlcmFuZF90eXBlW01BWF9PUEVSQU5EU107CisgICAgdW5zaWduZWQgYWRkcmVzc2luZ19tb2RlOwkvKiBGaW5hbCBhZGRyZXNzaW5nIG1vZGUgb2YgaW5zdHJ1Y3Rpb24gKi8KKyAgfTsKKworc3RydWN0IHRpYzMwX2luc24gaW5zbjsKK3N0YXRpYyBpbnQgZm91bmRfcGFyYWxsZWxfaW5zbjsKKwordm9pZAorbWRfYXNzZW1ibGUgKGxpbmUpCisgICAgIGNoYXIgKmxpbmU7Cit7CisgIHRlbXBsYXRlICpvcGNvZGU7CisgIGNoYXIgKmN1cnJlbnRfcG9zbjsKKyAgY2hhciAqdG9rZW5fc3RhcnQ7CisgIGNoYXIgc2F2ZV9jaGFyOworICBpbnQgY291bnQ7CisKKyAgZGVidWcgKCJJbiBtZF9hc3NlbWJsZSgpIHdpdGggYXJndW1lbnQgJXNcbiIsIGxpbmUpOworICBtZW1zZXQgKCZpbnNuLCAnXDAnLCBzaXplb2YgKGluc24pKTsKKyAgaWYgKGZvdW5kX3BhcmFsbGVsX2luc24pCisgICAgeworICAgICAgZGVidWcgKCJMaW5lIGlzIHNlY29uZCBwYXJ0IG9mIHBhcmFsbGVsIGluc3RydWN0aW9uXG5cbiIpOworICAgICAgZm91bmRfcGFyYWxsZWxfaW5zbiA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoKGN1cnJlbnRfcG9zbiA9IHRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiAobGluZSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSkpID09IE5VTEwpCisgICAgY3VycmVudF9wb3NuID0gbGluZTsKKyAgZWxzZQorICAgIGZvdW5kX3BhcmFsbGVsX2luc24gPSAxOworICB3aGlsZSAoaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCisgICAgY3VycmVudF9wb3NuKys7CisgIHRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOworICBpZiAoIWlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKKyAgICB7CisgICAgICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGNvZGUiLCBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbikpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgLyogQ2hlY2sgaWYgaW5zdHJ1Y3Rpb24gaXMgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBieSBzZWVpbmcgaWYgdGhlIGZpcnN0CisgICAgIGNoYXJhY3RlciBpcyBhIHEuICovCisgIGlmICgqdG9rZW5fc3RhcnQgPT0gJ3EnKQorICAgIHsKKyAgICAgIGlmICh0aWMzMF9wYXJhbGxlbF9pbnNuICh0b2tlbl9zdGFydCkpCisJeworCSAgaWYgKGZvdW5kX3BhcmFsbGVsX2luc24pCisJICAgIGZyZWUgKHRva2VuX3N0YXJ0KTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorICB3aGlsZSAoaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQorICAgIGN1cnJlbnRfcG9zbisrOworICB7CQkJCS8qIEZpbmQgaW5zdHJ1Y3Rpb24gKi8KKyAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOworICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOworICAgIG9wY29kZSA9ICh0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHRva2VuX3N0YXJ0KTsKKyAgICBpZiAob3Bjb2RlKQorICAgICAgeworCWRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIG9wY29kZS0+bmFtZSk7CisJaW5zbi50bSA9IG9wY29kZTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJZGVidWcgKCJEaWRuJ3QgZmluZCBpbnNuXG4iKTsKKwlhc19iYWQgKCJVbmtub3duIFRNUzMyMEMzMCBpbnN0cnVjdGlvbjogJXMiLCB0b2tlbl9zdGFydCk7CisJcmV0dXJuOworICAgICAgfQorICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7CisgIH0KKyAgaWYgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pCisgICAgewkJCQkvKiBGaW5kIG9wZXJhbmRzICovCisgICAgICBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOworICAgICAgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKKyAgICAgIGludCB0aGlzX29wZXJhbmQ7CisgICAgICBkbworCXsKKwkgIC8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KKwkgIHdoaWxlICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQorCSAgICB7CisJICAgICAgaWYgKCFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKKwkJeworCQkgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSAlcyBvcGVyYW5kIiwKKwkJCSAgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAorCQkJICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBjdXJyZW50X3Bvc24rKzsKKwkgICAgfQorCSAgdG9rZW5fc3RhcnQgPSBjdXJyZW50X3Bvc247CS8qIGFmdGVyIHdoaXRlIHNwYWNlICovCisJICBwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOworCSAgd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqY3VycmVudF9wb3NuICE9ICcsJykKKwkgICAgeworCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQorCQl7CisJCSAgaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKKwkJICAgIHsKKwkJICAgICAgYXNfYmFkICgiVW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiAlcyBvcGVyYW5kLiIsCisJCQkgICAgICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKKwkJICAgICAgcmV0dXJuOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLworCQl9CisJICAgICAgZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQorCQl7CisJCSAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gJXMgb3BlcmFuZCIsCisJCQkgIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKKwkJCSAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJygnKQorCQkrK3BhcmVuX25vdF9iYWxhbmNlZDsKKwkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKScpCisJCS0tcGFyZW5fbm90X2JhbGFuY2VkOworCSAgICAgIGN1cnJlbnRfcG9zbisrOworCSAgICB9CisJICBpZiAoY3VycmVudF9wb3NuICE9IHRva2VuX3N0YXJ0KQorCSAgICB7CQkJLyogeWVzLCB3ZSd2ZSByZWFkIGluIGFub3RoZXIgb3BlcmFuZCAqLworCSAgICAgIHRoaXNfb3BlcmFuZCA9IGluc24ub3BlcmFuZHMrKzsKKwkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IE1BWF9PUEVSQU5EUykKKwkJeworCQkgIGFzX2JhZCAoIlNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIsCisJCQkgIE1BWF9PUEVSQU5EUyk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2luc24nIGFzIHdlIGdvIGFsb25nICovCisJICAgICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKKwkgICAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKKwkgICAgICBpbnNuLm9wZXJhbmRfdHlwZVt0aGlzX29wZXJhbmRdID0gdGljMzBfb3BlcmFuZCAodG9rZW5fc3RhcnQpOworCSAgICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7CisJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW3RoaXNfb3BlcmFuZF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoZXhwZWN0aW5nX29wZXJhbmQpCisJCXsKKwkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQorCQl7CisJCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYmVmb3JlICcsJzsgZ290IG5vdGhpbmciKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgfQorCSAgLyogbm93ICpjdXJyZW50X3Bvc24gbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCisJICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCisJICAgIHsKKwkgICAgICBpZiAoKisrY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQorCQl7CQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KKwkJICBhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgZXhwZWN0aW5nX29wZXJhbmQgPSAxOworCSAgICB9CisJfQorICAgICAgd2hpbGUgKCpjdXJyZW50X3Bvc24gIT0gRU5EX09GX0lOU04pOwkvKiB1bnRpbCB3ZSBnZXQgZW5kIG9mIGluc24gKi8KKyAgICB9CisgIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGZvdW5kOiAlZFxuIiwgaW5zbi5vcGVyYW5kcyk7CisgIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIG9wZXJhbmRzIGlzIGNvcnJlY3QgKi8KKyAgaWYgKGluc24ub3BlcmFuZHMgIT0gaW5zbi50bS0+b3BlcmFuZHMpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgbnVtb3BzID0gaW5zbi50bS0+b3BlcmFuZHM7CisgICAgICAvKiBJZiBvcGVyYW5kcyBhcmUgbm90IHRoZSBzYW1lLCB0aGVuIHNlZSBpZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGFyZSBub3QKKyAgICAgICAgIHJlcXVpcmVkLiAgVGhlbiByZWNoZWNrIHdpdGggbnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzLiAgSWYgdGhleSBhcmUgc3RpbGwgbm90CisgICAgICAgICB0aGUgc2FtZSwgdGhlbiBnaXZlIGFuIGVycm9yLCBvdGhlcndpc2UgY2Fycnkgb24uICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi50bS0+b3BlcmFuZHM7IGkrKykKKwlpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1tpXSAmIE5vdFJlcSkKKwkgIG51bW9wcy0tOworICAgICAgaWYgKGluc24ub3BlcmFuZHMgIT0gbnVtb3BzKQorCXsKKwkgIGFzX2JhZCAoIkluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4iKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX05vdFJlcTsKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaW5zbi5vcGVyYW5kczsgY291bnQrKykKKyAgICB7CisgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdLT5vcF90eXBlICYgaW5zbi50bS0+b3BlcmFuZF90eXBlc1tjb3VudF0pCisJeworCSAgZGVidWcgKCJPcGVyYW5kICVkIG1hdGNoZXNcbiIsIGNvdW50ICsgMSk7CisJICAvKiBJZiBpbnN0cnVjdGlvbiBoYXMgdHdvIG9wZXJhbmRzIGFuZCBoYXMgYW4gQWRkcmVzc01vZGUgbW9kaWZpZXIgdGhlbiBzZXQKKwkgICAgIGFkZHJlc3NpbmcgbW9kZSB0eXBlIGZvciBpbnN0cnVjdGlvbiAqLworCSAgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkKKwkgICAgeworCSAgICAgIGludCBhZGRyX2luc24gPSAwOworCSAgICAgIC8qIFN0b3JlIGluc3RydWN0aW9uIHVzZXMgdGhlIHNlY29uZCBvcGVyYW5kIGZvciB0aGUgYWRkcmVzcyBtb2RlLiAqLworCSAgICAgIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1sxXSAmIChJbmRpcmVjdCB8IERpcmVjdCkpID09IChJbmRpcmVjdCB8IERpcmVjdCkpCisJCWFkZHJfaW5zbiA9IDE7CisJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2FkZHJfaW5zbl0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKKwkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9SZWdpc3RlcjsKKwkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgRGlyZWN0KQorCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0RpcmVjdDsKKwkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgSW5kaXJlY3QpCisJCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW5kaXJlY3Q7CisJICAgICAgZWxzZQorCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0ltbWVkaWF0ZTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc19iYWQgKCJUaGUgJXMgb3BlcmFuZCBkb2Vzbid0IG1hdGNoIiwgb3JkaW5hbF9uYW1lc1tjb3VudF0pOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIC8qIE5vdyBzZXQgdGhlIGFkZHJlc3NpbmcgbW9kZSBmb3IgMyBvcGVyYW5kIGluc3RydWN0aW9ucy4gKi8KKyAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgb3AzVDEpICYmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgb3AzVDIpKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgYWRkcmVzc2luZyBtb2RlIHRvIHRoZSB2YWx1ZXMgdXNlZCBmb3IgMiBvcGVyYW5kIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgICAgICAgIEcgYWRkcmVzc2luZyBmaWVsZCBvZiB0aGUgb3Bjb2RlLiAqLworICAgICAgY2hhciAqcDsKKyAgICAgIHN3aXRjaCAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUpCisJeworCWNhc2UgUm46CisJY2FzZSBBUm46CisJY2FzZSBEUFJlZzoKKwljYXNlIE90aGVyUmVnOgorCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCisJICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fUmVnaXN0ZXI7CisJICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQorCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0RpcmVjdDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFNob3VsZG4ndCBtYWtlIGl0IHRvIHRoaXMgc3RhZ2UgKi8KKwkgICAgICBhc19iYWQgKCJJbmNvbXBhdGlibGUgZmlyc3QgYW5kIHNlY29uZCBvcGVyYW5kcyBpbiBpbnN0cnVjdGlvbiIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBJbmRpcmVjdDoKKwkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQorCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0luZGlyZWN0OworCSAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKKwkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbW1lZGlhdGU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBTaG91bGRuJ3QgbWFrZSBpdCB0byB0aGlzIHN0YWdlICovCisJICAgICAgYXNfYmFkICgiSW5jb21wYXRpYmxlIGZpcnN0IGFuZCBzZWNvbmQgb3BlcmFuZHMgaW4gaW5zdHJ1Y3Rpb24iKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIE5vdyBtYWtlIHVwIHRoZSBvcGNvZGUgZm9yIHRoZSAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLiAgQXMgaW4gcGFyYWxsZWwKKyAgICAgICAgIGluc3RydWN0aW9ucywgdGhlcmUgd2lsbCBiZSBubyB1bnJlc29sdmVkIHZhbHVlcywgc28gdGhleSBjYW4gYmUgZnVsbHkgZm9ybWVkCisgICAgICAgICBhbmQgYWRkZWQgdG8gdGhlIGZyYWcgdGFibGUuICovCisgICAgICBpbnNuLm9wY29kZSA9IGluc24udG0tPmJhc2Vfb3Bjb2RlOworICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCisJeworCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbmRpcmVjdC5BUm51bSk7CisJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKKwl9CisgICAgICBlbHNlCisJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKKyAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQorCXsKKwkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7CisJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7CisJfQorICAgICAgZWxzZQorCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCA4KTsKKyAgICAgIGlmIChpbnNuLm9wZXJhbmRzID09IDMpCisJaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzJdLT5yZWcub3Bjb2RlIDw8IDE2KTsKKyAgICAgIGluc24ub3Bjb2RlIHw9IGluc24uYWRkcmVzc2luZ19tb2RlOworICAgICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisgICAgfQorICBlbHNlCisgICAgewkJCQkvKiBOb3QgYSB0aHJlZSBvcGVyYW5kIGluc3RydWN0aW9uICovCisgICAgICBjaGFyICpwOworICAgICAgaW50IGFtX2luc24gPSAtMTsKKyAgICAgIGluc24ub3Bjb2RlID0gaW5zbi50bS0+YmFzZV9vcGNvZGU7CisgICAgICAvKiBDcmVhdGUgZnJhZyBmb3IgaW5zdHJ1Y3Rpb24gLSBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSA0IGJ5dGVzIGxvbmcuICovCisgICAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOworICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMCkgJiYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkpCisJeworCSAgaW5zbi5vcGNvZGUgfD0gaW5zbi5hZGRyZXNzaW5nX21vZGU7CisJICBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fSW5kaXJlY3QpCisJICAgIHsKKwkgICAgICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZCBnaXZlcyB0aGUgYWRkcmVzc2luZyBtb2RlICovCisJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCisJCWFtX2luc24gPSAwOworCSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDEpICYmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KSkKKwkJYW1faW5zbiA9IDE7CisJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5kaXNwKTsKKwkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOworCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKKwkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCisJCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVshYW1faW5zbl0tPnJlZy5vcGNvZGUgPDwgMTYpOworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX1JlZ2lzdGVyKQorCSAgICB7CisJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKKwkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCisJCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7CisJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoaW5zbi5hZGRyZXNzaW5nX21vZGUgPT0gQU1fRGlyZWN0KQorCSAgICB7CisJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlICYgRGlyZWN0KQorCQlhbV9pbnNuID0gMDsKKwkgICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAxKSAmJiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBEaXJlY3QpKQorCQlhbV9pbnNuID0gMTsKKwkgICAgICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCisJCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVshYW1faW5zbl0tPnJlZy5vcGNvZGUgPDwgMTYpOworCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LnJlc29sdmVkID09IDEpCisJCXsKKwkJICAvKiBSZXNvbHZlZCB2YWx1ZXMgY2FuIGJlIHBsYWNlZCBzdHJhaWdodCBpbnRvIGluc3RydWN0aW9uIHdvcmQsIGFuZCBvdXRwdXQgKi8KKwkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5hZGRyZXNzICYgMHgwMDAwRkZGRik7CisJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJewkJLyogVW5yZXNvbHZlZCBkaXJlY3QgYWRkcmVzc2luZyBtb2RlIGluc3RydWN0aW9uICovCisJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QuZGlyZWN0X2V4cHIsIDAsIDApOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0ltbWVkaWF0ZSkKKwkgICAgeworCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCisJCXsKKwkJICBjaGFyICprZWVwbG9jOworCQkgIGludCBzaXplOworCQkgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKKwkJICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7CisJCSAgc3dpdGNoIChpbnNuLnRtLT5pbW1fYXJnX3R5cGUpCisJCSAgICB7CisJCSAgICBjYXNlIEltbV9GbG9hdDoKKwkJICAgICAgZGVidWcgKCJGbG9hdGluZyBwb2ludCBmaXJzdCBvcGVyYW5kXG4iKTsKKwkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkJICAgICAga2VlcGxvYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5sYWJlbDsKKwkJICAgICAgaWYgKG1kX2F0b2YgKCdmJywgcCArIDIsICZzaXplKSAhPSAwKQorCQkJeworCQkJICBhc19iYWQgKCJpbnZhbGlkIHNob3J0IGZvcm0gZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIG9wZXJhbmQiKTsKKwkJCSAgcmV0dXJuOworCQkJfQorCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBrZWVwbG9jOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgSW1tX1VJbnQ6CisJCSAgICAgIGRlYnVnICgiVW5zaWduZWQgaW50IGZpcnN0IG9wZXJhbmRcbiIpOworCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQorCQkJYXNfd2FybiAoInJvdW5kaW5nIGRvd24gZmlyc3Qgb3BlcmFuZCBmbG9hdCB0byB1bnNpZ25lZCBpbnQiKTsKKwkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweEZGRkYpCisJCQlhc193YXJuICgib25seSBsb3dlciAxNi1iaXRzIG9mIGZpcnN0IG9wZXJhbmQgYXJlIHVzZWQiKTsKKwkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwMDBGRkZGTCk7CisJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBJbW1fU0ludDoKKwkJICAgICAgZGVidWcgKCJJbnQgZmlyc3Qgb3BlcmFuZFxuIik7CisJCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQpCisJCQlhc193YXJuICgicm91bmRpbmcgZG93biBmaXJzdCBvcGVyYW5kIGZsb2F0IHRvIHNpZ25lZCBpbnQiKTsKKwkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPCAtMzI3NjggfHwKKwkJCSAgaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA+IDMyNzY3KQorCQkJeworCQkJICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgMTYtYml0IHNpZ25lZCBpbnQiKTsKKwkJCSAgcmV0dXJuOworCQkJfQorCQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciAmIDB4MDAwMEZGRkZMKTsKKwkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsJCS8qIFVucmVzb2x2ZWQgaW1tZWRpYXRlIGxhYmVsICovCisJCSAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQorCQkgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKKwkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBQQ1JlbCkKKwl7CisJICAvKiBDb25kaXRpb25hbCBCcmFuY2ggYW5kIENhbGwgaW5zdHJ1Y3Rpb25zICovCisJICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoQWxsUmVnIHwgRGlzcCkpID09IChBbGxSZWcgfCBEaXNwKSkKKwkgICAgeworCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIChBbGxSZWcpKQorCQl7CisJCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlKTsKKwkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWdpc3RlcjsKKwkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7CisJCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKKwkJICAgIHsKKwkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgJiAweDAwMDBGRkZGKTsKKwkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAyLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMSwgMCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBBUm4pID09IEFSbikKKwkgICAgeworCSAgICAgIC8qIERlY3JlbWVudCBhbmQgQnJhbmNoIGluc3RydWN0aW9ucyAqLworCSAgICAgIGluc24ub3Bjb2RlIHw9ICgoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUgLSAweDA4KSA8PCAyMik7CisJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgKEFsbFJlZykpCisJCXsKKwkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUpOworCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlZ2lzdGVyOworCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJCX0KKwkgICAgICBlbHNlIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCisJCXsKKwkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQorCQkgICAgeworCQkgICAgICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIGZsb2F0aW5nIHBvaW50Iik7CisJCSAgICAgIHJldHVybjsKKwkJICAgIH0KKwkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA8IC0zMjc2OCB8fAorCQkgICAgICBpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyID4gMzI3NjcpCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciAxNi1iaXQgc2lnbmVkIGludCIpOworCQkgICAgICByZXR1cm47CisJCSAgICB9CisJCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUuc19udW1iZXIpOworCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOworCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKKwkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDIgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgJmluc24ub3BlcmFuZF90eXBlWzFdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDEsIDApOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdID09IElWZWN0b3IpCisJeworCSAgLyogVHJhcCBpbnN0cnVjdGlvbnMgKi8KKwkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIElWZWN0b3IpCisJICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyKTsKKwkgIGVsc2UKKwkgICAgewkJCS8qIFNob3VsZG4ndCBnZXQgaGVyZSAqLworCSAgICAgIGFzX2JhZCAoImludGVycnVwdCB2ZWN0b3IgZm9yIHRyYXAgaW5zdHJ1Y3Rpb24gb3V0IG9mIHJhbmdlIik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCX0KKyAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBTdGFja09wIHx8IGluc24udG0tPm9wY29kZV9tb2RpZmllciA9PSBSb3RhdGUpCisJeworCSAgLyogUHVzaCwgUG9wIGFuZCBSb3RhdGUgaW5zdHJ1Y3Rpb25zICovCisJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPnJlZy5vcGNvZGUgPDwgMTYpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwl9CisgICAgICBlbHNlIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIChBYnMyNCB8IERpcmVjdCkpID09IChBYnMyNCB8IERpcmVjdCkpCisJeworCSAgLyogTERQIEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIHRlc3RlZCBmb3IgYmVmb3JlIHRoZSBuZXh0IHNlY3Rpb24gKi8KKwkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIERpcmVjdCkKKwkgICAgeworCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LnJlc29sdmVkID09IDEpCisJCXsKKwkJICAvKiBEaXJlY3QgYWRkcmVzc2luZyB1c2VzIGxvd2VyIDggYml0cyBvZiBkaXJlY3QgYWRkcmVzcyAqLworCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LmFkZHJlc3MgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZml4UyAqZml4OworCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJCSAgZml4ID0gZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMyAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDEsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+ZGlyZWN0LmRpcmVjdF9leHByLCAwLCAwKTsKKwkJICAvKiBFbnN1cmUgdGhhdCB0aGUgYXNzZW1ibGVyIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgZml0dGluZyBhIDI0LWJpdAorCQkgICAgIGFkZHJlc3MgaW50byA4IGJpdHMuICovCisJCSAgZml4LT5meF9ub19vdmVyZmxvdyA9IDE7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKKwkJeworCQkgIC8qIEltbWVkaWF0ZSBhZGRyZXNzaW5nIHVzZXMgdXBwZXIgOCBiaXRzIG9mIGFkZHJlc3MgKi8KKwkJICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4MDBGRkZGRkYpCisJCSAgICB7CisJCSAgICAgIGFzX2JhZCAoIkxEUCBpbnN0cnVjdGlvbiBuZWVkcyBhIDI0LWJpdCBvcGVyYW5kIik7CisJCSAgICAgIHJldHVybjsKKwkJICAgIH0KKwkJICBpbnNuLm9wY29kZSB8PSAoKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGZpeFMgKmZpeDsKKwkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCQkgIGZpeCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDMgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAxLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7CisJCSAgZml4LT5meF9ub19vdmVyZmxvdyA9IDE7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoSW1tMjQpKQorCXsKKwkgIC8qIFVuY29uZGl0aW9uYWwgQnJhbmNoIGFuZCBDYWxsIGluc3RydWN0aW9ucyAqLworCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUucmVzb2x2ZWQgPT0gMSkKKwkgICAgeworCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHgwMEZGRkZGRikKKwkJYXNfd2FybiAoImZpcnN0IG9wZXJhbmQgaXMgdG9vIGxhcmdlIGZvciBhIDI0LWJpdCBkaXNwbGFjZW1lbnQiKTsKKwkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciAmIDB4MDBGRkZGRkYpOworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMSAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDMsICZpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLmltbV9leHByLCAwLCAwKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBOb3RSZXEpCisJeworCSAgLyogQ2hlY2sgZm9yIE5PUCBpbnN0cnVjdGlvbiB3aXRob3V0IGFyZ3VtZW50cy4gKi8KKwkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7CisJfQorICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZHMgPT0gMCkKKwl7CisJICAvKiBDaGVjayBmb3IgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgb3BlcmFuZHMuICovCisJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOworCX0KKyAgICB9CisgIGRlYnVnICgiQWRkcmVzc2luZyBtb2RlOiAlMDhYXG4iLCBpbnNuLmFkZHJlc3NpbmdfbW9kZSk7CisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5zbi5vcGVyYW5kczsgaSsrKQorICAgICAgeworCWlmIChpbnNuLm9wZXJhbmRfdHlwZVtpXS0+aW1tZWRpYXRlLmxhYmVsKQorCSAgZnJlZSAoaW5zbi5vcGVyYW5kX3R5cGVbaV0tPmltbWVkaWF0ZS5sYWJlbCk7CisJZnJlZSAoaW5zbi5vcGVyYW5kX3R5cGVbaV0pOworICAgICAgfQorICB9CisgIGRlYnVnICgiRmluYWwgb3Bjb2RlOiAlMDhYXG4iLCBpbnNuLm9wY29kZSk7CisgIGRlYnVnICgiXG4iKTsKK30KKworc3RydWN0IHRpYzMwX3Bhcl9pbnNuCit7CisgIHBhcnRlbXBsYXRlICp0bTsJCS8qIFRlbXBsYXRlIG9mIGN1cnJlbnQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gKi8KKyAgaW50IG9wZXJhbmRzWzJdOwkJLyogTnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzIGZvciBlYWNoIGluc24gKi8KKyAgLyogVHlwZSBvZiBvcGVyYW5kIGdpdmVuIGluIGluc3RydWN0aW9uICovCisgIG9wZXJhbmQgKm9wZXJhbmRfdHlwZVsyXVtNQVhfT1BFUkFORFNdOworICBpbnQgc3dhcF9vcGVyYW5kczsJCS8qIFdoZXRoZXIgdG8gc3dhcCBvcGVyYW5kcyBhcm91bmQuICovCisgIHVuc2lnbmVkIHBfZmllbGQ7CQkvKiBWYWx1ZSBvZiBwIGZpZWxkIGluIG11bHRpcGx5IGFkZC9zdWIgaW5zdHJ1Y3Rpb25zICovCisgIHVuc2lnbmVkIG9wY29kZTsJCS8qIEZpbmFsIG9wY29kZSAqLworfTsKKworc3RydWN0IHRpYzMwX3Bhcl9pbnNuIHBfaW5zbjsKKworaW50Cit0aWMzMF9wYXJhbGxlbF9pbnNuIChjaGFyICp0b2tlbikKK3sKKyAgc3RhdGljIHBhcnRlbXBsYXRlICpwX29wY29kZTsKKyAgY2hhciAqY3VycmVudF9wb3NuID0gdG9rZW47CisgIGNoYXIgKnRva2VuX3N0YXJ0OworICBjaGFyIHNhdmVfY2hhcjsKKworICBkZWJ1ZyAoIkluIHRpYzMwX3BhcmFsbGVsX2luc24gd2l0aCAlc1xuIiwgdG9rZW4pOworICBtZW1zZXQgKCZwX2luc24sICdcMCcsIHNpemVvZiAocF9pbnNuKSk7CisgIHdoaWxlIChpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCisgICAgY3VycmVudF9wb3NuKys7CisgIHsJCQkJLyogRmluZCBpbnN0cnVjdGlvbiAqLworICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247CisgICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7CisgICAgcF9vcGNvZGUgPSAocGFydGVtcGxhdGUgKikgaGFzaF9maW5kIChwYXJvcF9oYXNoLCB0b2tlbik7CisgICAgaWYgKHBfb3Bjb2RlKQorICAgICAgeworCWRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIHBfb3Bjb2RlLT5uYW1lKTsKKwlwX2luc24udG0gPSBwX29wY29kZTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJY2hhciBmaXJzdF9vcGNvZGVbNl0gPQorCXswfTsKKwljaGFyIHNlY29uZF9vcGNvZGVbNl0gPQorCXswfTsKKwlpbnQgaTsKKwlpbnQgY3VycmVudF9vcGNvZGUgPSAtMTsKKwlpbnQgY2hhcl9wdHIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHN0cmxlbiAodG9rZW4pOyBpKyspCisJICB7CisJICAgIGNoYXIgY2ggPSAqKHRva2VuICsgaSk7CisJICAgIGlmIChjaCA9PSAnXycgJiYgY3VycmVudF9vcGNvZGUgPT0gLTEpCisJICAgICAgeworCQljdXJyZW50X29wY29kZSA9IDA7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgaWYgKGNoID09ICdfJyAmJiBjdXJyZW50X29wY29kZSA9PSAwKQorCSAgICAgIHsKKwkJY3VycmVudF9vcGNvZGUgPSAxOworCQljaGFyX3B0ciA9IDA7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgc3dpdGNoIChjdXJyZW50X29wY29kZSkKKwkgICAgICB7CisJICAgICAgY2FzZSAwOgorCQlmaXJzdF9vcGNvZGVbY2hhcl9wdHIrK10gPSBjaDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAxOgorCQlzZWNvbmRfb3Bjb2RlW2NoYXJfcHRyKytdID0gY2g7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwlkZWJ1ZyAoImZpcnN0X29wY29kZSA9ICVzXG4iLCBmaXJzdF9vcGNvZGUpOworCWRlYnVnICgic2Vjb25kX29wY29kZSA9ICVzXG4iLCBzZWNvbmRfb3Bjb2RlKTsKKwlzcHJpbnRmICh0b2tlbiwgInFfJXNfJXMiLCBzZWNvbmRfb3Bjb2RlLCBmaXJzdF9vcGNvZGUpOworCXBfb3Bjb2RlID0gKHBhcnRlbXBsYXRlICopIGhhc2hfZmluZCAocGFyb3BfaGFzaCwgdG9rZW4pOworCWlmIChwX29wY29kZSkKKwkgIHsKKwkgICAgZGVidWcgKCJGb3VuZCBpbnN0cnVjdGlvbiAlc1xuIiwgcF9vcGNvZGUtPm5hbWUpOworCSAgICBwX2luc24udG0gPSBwX29wY29kZTsKKwkgICAgcF9pbnNuLnN3YXBfb3BlcmFuZHMgPSAxOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorICAgICpjdXJyZW50X3Bvc24gPSBzYXZlX2NoYXI7CisgIH0KKyAgewkJCQkvKiBGaW5kIG9wZXJhbmRzICovCisgICAgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKKyAgICBpbnQgZXhwZWN0aW5nX29wZXJhbmQgPSAwOworICAgIGludCBmb3VuZF9zZXBhcmF0b3IgPSAwOworICAgIGRvCisgICAgICB7CisJLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLworCXdoaWxlICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQorCSAgeworCSAgICBpZiAoIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICpjdXJyZW50X3Bvc24gIT0gUEFSQUxMRUxfU0VQQVJBVE9SKQorCSAgICAgIHsKKwkJYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlICVzIG9wZXJhbmQiLAorCQkJb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pLAorCQkJb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7CisJCXJldHVybiAxOworCSAgICAgIH0KKwkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gUEFSQUxMRUxfU0VQQVJBVE9SKQorCSAgICAgIGZvdW5kX3NlcGFyYXRvciA9IDE7CisJICAgIGN1cnJlbnRfcG9zbisrOworCSAgfQorCXRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLworCXBhcmVuX25vdF9iYWxhbmNlZCA9IDA7CisJd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqY3VycmVudF9wb3NuICE9ICcsJykKKwkgIHsKKwkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCisJICAgICAgeworCQlpZiAocGFyZW5fbm90X2JhbGFuY2VkKQorCQkgIHsKKwkJICAgIGFzX2JhZCAoIlVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gJXMgb3BlcmFuZC4iLAorCQkJICAgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOworCQkgICAgcmV0dXJuIDE7CisJCSAgfQorCQllbHNlCisJCSAgYnJlYWs7CS8qIHdlIGFyZSBkb25lICovCisJICAgICAgfQorCSAgICBlbHNlIGlmICgqY3VycmVudF9wb3NuID09IFBBUkFMTEVMX1NFUEFSQVRPUikKKwkgICAgICB7CisJCXdoaWxlIChpc19zcGFjZV9jaGFyICgqKGN1cnJlbnRfcG9zbiAtIDEpKSkKKwkJICBjdXJyZW50X3Bvc24tLTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBlbHNlIGlmICghaXNfb3BlcmFuZF9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAhaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCisJICAgICAgeworCQlhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBpbiAlcyBvcGVyYW5kIiwKKwkJCW91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKKwkJCW9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOworCQlyZXR1cm4gMTsKKwkgICAgICB9CisJICAgIGlmICgqY3VycmVudF9wb3NuID09ICcoJykKKwkgICAgICArK3BhcmVuX25vdF9iYWxhbmNlZDsKKwkgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJyknKQorCSAgICAgIC0tcGFyZW5fbm90X2JhbGFuY2VkOworCSAgICBjdXJyZW50X3Bvc24rKzsKKwkgIH0KKwlpZiAoY3VycmVudF9wb3NuICE9IHRva2VuX3N0YXJ0KQorCSAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KKwkgICAgcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0rKzsKKwkgICAgaWYgKHBfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdID4gTUFYX09QRVJBTkRTKQorCSAgICAgIHsKKwkJYXNfYmFkICgiU3B1cmlvdXMgb3BlcmFuZHM7ICglZCBvcGVyYW5kcy9pbnN0cnVjdGlvbiBtYXgpIiwKKwkJCU1BWF9PUEVSQU5EUyk7CisJCXJldHVybiAxOworCSAgICAgIH0KKwkgICAgLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2luc24nIGFzIHdlIGdvIGFsb25nICovCisJICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247CisJICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOworCSAgICBwX2luc24ub3BlcmFuZF90eXBlW2ZvdW5kX3NlcGFyYXRvcl1bcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gLSAxXSA9CisJICAgICAgdGljMzBfb3BlcmFuZCAodG9rZW5fc3RhcnQpOworCSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOworCSAgICBpZiAoIXBfaW5zbi5vcGVyYW5kX3R5cGVbZm91bmRfc2VwYXJhdG9yXVtwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSAtIDFdKQorCSAgICAgIHJldHVybiAxOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGV4cGVjdGluZ19vcGVyYW5kKQorCSAgICAgIHsKKwkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOworCQlyZXR1cm4gMTsKKwkgICAgICB9CisJICAgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKKwkgICAgICB7CisJCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIik7CisJCXJldHVybiAxOworCSAgICAgIH0KKwkgIH0KKwkvKiBub3cgKmN1cnJlbnRfcG9zbiBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KKwlpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCisJICB7CisJICAgIGlmICgqKytjdXJyZW50X3Bvc24gPT0gRU5EX09GX0lOU04pCisJICAgICAgewkJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLworCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIik7CisJCXJldHVybiAxOworCSAgICAgIH0KKwkgICAgZXhwZWN0aW5nX29wZXJhbmQgPSAxOworCSAgfQorICAgICAgfQorICAgIHdoaWxlICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCisgIH0KKyAgaWYgKHBfaW5zbi5zd2FwX29wZXJhbmRzKQorICAgIHsKKyAgICAgIGludCB0ZW1wX251bSwgaTsKKyAgICAgIG9wZXJhbmQgKnRlbXBfb3A7CisKKyAgICAgIHRlbXBfbnVtID0gcF9pbnNuLm9wZXJhbmRzWzBdOworICAgICAgcF9pbnNuLm9wZXJhbmRzWzBdID0gcF9pbnNuLm9wZXJhbmRzWzFdOworICAgICAgcF9pbnNuLm9wZXJhbmRzWzFdID0gdGVtcF9udW07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX09QRVJBTkRTOyBpKyspCisJeworCSAgdGVtcF9vcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1baV07CisJICBwX2luc24ub3BlcmFuZF90eXBlWzBdW2ldID0gcF9pbnNuLm9wZXJhbmRfdHlwZVsxXVtpXTsKKwkgIHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1baV0gPSB0ZW1wX29wOworCX0KKyAgICB9CisgIGlmIChwX2luc24ub3BlcmFuZHNbMF0gIT0gcF9pbnNuLnRtLT5vcGVyYW5kc18xKQorICAgIHsKKyAgICAgIGFzX2JhZCAoImluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGluc3RydWN0aW9uIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGlmIChwX2luc24ub3BlcmFuZHNbMV0gIT0gcF9pbnNuLnRtLT5vcGVyYW5kc18yKQorICAgIHsKKyAgICAgIGFzX2JhZCAoImluY29ycmVjdCBudW1iZXIgb2Ygb3BlcmFuZHMgZ2l2ZW4gaW4gdGhlIHNlY29uZCBpbnN0cnVjdGlvbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBpbiBmaXJzdCBpbnNuOiAlZFxuIiwgcF9pbnNuLm9wZXJhbmRzWzBdKTsKKyAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgaW4gc2Vjb25kIGluc246ICVkXG4iLCBwX2luc24ub3BlcmFuZHNbMV0pOworICB7CQkJCS8qIE5vdyBjaGVjayBpZiBvcGVyYW5kcyBhcmUgY29ycmVjdCAqLworICAgIGludCBjb3VudDsKKyAgICBpbnQgbnVtX3JuID0gMDsKKyAgICBpbnQgbnVtX2luZCA9IDA7CisgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjsgY291bnQrKykKKyAgICAgIHsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcF9pbnNuLm9wZXJhbmRzW2NvdW50XTsgaSsrKQorCSAgeworCSAgICBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYKKwkJIHBfaW5zbi50bS0+b3BlcmFuZF90eXBlc1tjb3VudF1baV0pID09IDApCisJICAgICAgeworCQlhc19iYWQgKCIlcyBpbnN0cnVjdGlvbiwgb3BlcmFuZCAlZCBkb2Vzbid0IG1hdGNoIiwgb3JkaW5hbF9uYW1lc1tjb3VudF0sIGkgKyAxKTsKKwkJcmV0dXJuIDE7CisJICAgICAgfQorCSAgICAvKiBHZXQgbnVtYmVyIG9mIFIgcmVnaXN0ZXIgYW5kIGluZGlyZWN0IHJlZmVyZW5jZSBjb250YWluZWQgd2l0aGluIHRoZSBmaXJzdAorCSAgICAgICB0d28gb3BlcmFuZHMgb2YgZWFjaCBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBtdWx0aXBseQorCSAgICAgICBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgd2hpY2ggcmVxdWlyZSB0d28gUiByZWdpc3RlcnMgYW5kIHR3byBpbmRpcmVjdAorCSAgICAgICByZWZlcmVuY2VzLCBidXQgbm90IGluIGFueSBwYXJ0aWN1bGFyIHBsYWNlLiAqLworCSAgICBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYgUm4pICYmIGkgPCAyKQorCSAgICAgIG51bV9ybisrOworCSAgICBlbHNlIGlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVtjb3VudF1baV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkgJiYgaSA8IDIpCisJICAgICAgbnVtX2luZCsrOworCSAgfQorICAgICAgfQorICAgIGlmICgocF9pbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdWzBdICYgKEluZGlyZWN0IHwgUm4pKSA9PSAoSW5kaXJlY3QgfCBSbikpCisgICAgICB7CisJLyogQ2hlY2sgZm9yIHRoZSBtdWx0aXBseSBpbnN0cnVjdGlvbnMgKi8KKwlpZiAobnVtX3JuICE9IDIpCisJICB7CisJICAgIGFzX2JhZCAoImluY29ycmVjdCBmb3JtYXQgZm9yIG11bHRpcGx5IHBhcmFsbGVsIGluc3RydWN0aW9uIik7CisJICAgIHJldHVybiAxOworCSAgfQorCWlmIChudW1faW5kICE9IDIpCisJICB7CQkJLyogU2hvdWxkbid0IGdldCBoZXJlICovCisJICAgIGFzX2JhZCAoImluY29ycmVjdCBmb3JtYXQgZm9yIG11bHRpcGx5IHBhcmFsbGVsIGluc3RydWN0aW9uIik7CisJICAgIHJldHVybiAxOworCSAgfQorCWlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSAhPSAweDAwKSAmJgorCSAgICAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSAhPSAweDAxKSkKKwkgIHsKKwkgICAgYXNfYmFkICgiZGVzdGluYXRpb24gZm9yIG11bHRpcGx5IGNhbiBvbmx5IGJlIFIwIG9yIFIxIik7CisJICAgIHJldHVybiAxOworCSAgfQorCWlmICgocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSAhPSAweDAyKSAmJgorCSAgICAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSAhPSAweDAzKSkKKwkgIHsKKwkgICAgYXNfYmFkICgiZGVzdGluYXRpb24gZm9yIGFkZC9zdWJ0cmFjdCBjYW4gb25seSBiZSBSMiBvciBSMyIpOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwkvKiBOb3cgZGV0ZXJtaW5lIHRoZSBQIGZpZWxkIGZvciB0aGUgaW5zdHJ1Y3Rpb24gKi8KKwlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQorCSAgeworCSAgICBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+b3BfdHlwZSAmIEluZGlyZWN0KQorCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMDAwMDAwMDsJLyogSW5kICogSW5kLCBSbiAgKy8tIFJuICAqLworCSAgICBlbHNlIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCisJICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAxMDAwMDAwOwkvKiBJbmQgKiBSbiwgIEluZCArLy0gUm4gICovCisJICAgIGVsc2UKKwkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDMwMDAwMDA7CS8qIEluZCAqIFJuLCAgUm4gICsvLSBJbmQgKi8KKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5vcF90eXBlICYgUm4pCisJICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAyMDAwMDAwOwkvKiBSbiAgKiBSbiwgIEluZCArLy0gSW5kICovCisJICAgIGVsc2UgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKKwkgICAgICB7CisJCW9wZXJhbmQgKnRlbXA7CisJCXBfaW5zbi5wX2ZpZWxkID0gMHgwMTAwMDAwMDsJLyogUm4gICogSW5kLCBJbmQgKy8tIFJuICAqLworCQkvKiBOZWVkIHRvIHN3YXAgdGhlIHR3byBtdWx0aXBseSBvcGVyYW5kcyBhcm91bmQgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCSAgIGl0cyBwbGFjZSBmb3IgdGhlIG9wY29kZSBtYWtldXAgaWUgc28gSW5kICogUm4sIEluZCArLy0gUm4gKi8KKwkJdGVtcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF07CisJCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0gPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdOworCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdID0gdGVtcDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCW9wZXJhbmQgKnRlbXA7CisJCXBfaW5zbi5wX2ZpZWxkID0gMHgwMzAwMDAwMDsJLyogUm4gICogSW5kLCBSbiAgKy8tIEluZCAqLworCQl0ZW1wID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXTsKKwkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV07CisJCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0gPSB0ZW1wOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorICBkZWJ1ZyAoIlAgZmllbGQ6ICUwOFhcbiIsIHBfaW5zbi5wX2ZpZWxkKTsKKyAgLyogRmluYWxpc2Ugb3Bjb2RlLiAgVGhpcyBpcyBlYXNpZXIgZm9yIHBhcmFsbGVsIGluc3RydWN0aW9ucyBhcyB0aGV5IGhhdmUgdG8gYmUKKyAgICAgZnVsbHkgcmVzb2x2ZWQsIHRoZXJlIGFyZSBubyBtZW1vcnkgYWRkcmVzc2VzIGFsbG93ZWQsIGV4Y2VwdCB0aHJvdWdoIGluZGlyZWN0CisgICAgIGFkZHJlc3NpbmcsIHNvIHRoZXJlIGFyZSBubyBsYWJlbHMgdG8gcmVzb2x2ZS4gKi8KKyAgeworICAgIHBfaW5zbi5vcGNvZGUgPSBwX2luc24udG0tPmJhc2Vfb3Bjb2RlOworICAgIHN3aXRjaCAocF9pbnNuLnRtLT5vcG9yZGVyKQorICAgICAgeworICAgICAgY2FzZSBPT180b3AxOgorCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtKTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDIyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgT09fNG9wMjoKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAyMik7CisJaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPT0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSkKKwkgIGFzX3dhcm4gKCJsb2FkaW5nIHRoZSBzYW1lIHJlZ2lzdGVyIGluIHBhcmFsbGVsIG9wZXJhdGlvbiIpOworCWJyZWFrOworICAgICAgY2FzZSBPT180b3AzOgorCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDIyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgT09fNW9wMToKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA8PCAyMik7CisJYnJlYWs7CisgICAgICBjYXNlIE9PXzVvcDI6CisJcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKKwlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOworCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPDwgMjIpOworCWJyZWFrOworICAgICAgY2FzZSBPT19QRmllbGQ6CisJcF9pbnNuLm9wY29kZSB8PSBwX2luc24ucF9maWVsZDsKKwlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsyXS0+cmVnLm9wY29kZSA9PSAweDAxKQorCSAgcF9pbnNuLm9wY29kZSB8PSAweDAwODAwMDAwOworCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzJdLT5yZWcub3Bjb2RlID09IDB4MDMpCisJICBwX2luc24ub3Bjb2RlIHw9IDB4MDA0MDAwMDA7CisJc3dpdGNoIChwX2luc24ucF9maWVsZCkKKwkgIHsKKwkgIGNhc2UgMHgwMDAwMDAwMDoKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QuQVJudW0pOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxOSk7CisJICAgIGJyZWFrOworCSAgY2FzZSAweDAxMDAwMDAwOgorCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSk7CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5yZWcub3Bjb2RlIDw8IDE5KTsKKwkgICAgYnJlYWs7CisJICBjYXNlIDB4MDIwMDAwMDA6CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtKTsKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOworCSAgICBicmVhazsKKwkgIGNhc2UgMHgwMzAwMDAwMDoKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0pOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7CisJICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOworCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKKwkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7CisJICAgIGJyZWFrOworCSAgfQorCWJyZWFrOworICAgICAgfQorICB9CQkJCS8qIE9wY29kZSBpcyBmaW5hbGlzZWQgYXQgdGhpcyBwb2ludCBmb3IgYWxsIHBhcmFsbGVsIGluc3RydWN0aW9ucy4gKi8KKyAgewkJCQkvKiBPdXRwdXQgb3Bjb2RlICovCisgICAgY2hhciAqcDsKKyAgICBwID0gZnJhZ19tb3JlIChJTlNOX1NJWkUpOworICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgcF9pbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKKyAgfQorICB7CisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgIGZvciAoaiA9IDA7IGogPCBwX2luc24ub3BlcmFuZHNbaV07IGorKykKKwlmcmVlIChwX2luc24ub3BlcmFuZF90eXBlW2ldW2pdKTsKKyAgfQorICBkZWJ1ZyAoIkZpbmFsIG9wY29kZTogJTA4WFxuIiwgcF9pbnNuLm9wY29kZSk7CisgIGRlYnVnICgiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK29wZXJhbmQgKgordGljMzBfb3BlcmFuZCAodG9rZW4pCisgICAgIGNoYXIgKnRva2VuOworeworICBpbnQgY291bnQ7CisgIGNoYXIgaW5kX2J1ZmZlcltzdHJsZW4gKHRva2VuKV07CisgIG9wZXJhbmQgKmN1cnJlbnRfb3A7CisKKyAgZGVidWcgKCJJbiB0aWMzMF9vcGVyYW5kIHdpdGggJXNcbiIsIHRva2VuKTsKKyAgY3VycmVudF9vcCA9IChvcGVyYW5kICopIG1hbGxvYyAoc2l6ZW9mIChvcGVyYW5kKSk7CisgIG1lbXNldCAoY3VycmVudF9vcCwgJ1wwJywgc2l6ZW9mIChvcGVyYW5kKSk7CisgIGlmICgqdG9rZW4gPT0gRElSRUNUX1JFRkVSRU5DRSkKKyAgICB7CisgICAgICBjaGFyICp0b2tlbl9wb3NuID0gdG9rZW4gKyAxOworICAgICAgaW50IGRpcmVjdF9sYWJlbCA9IDA7CisgICAgICBkZWJ1ZyAoIkZvdW5kIGRpcmVjdCByZWZlcmVuY2VcbiIpOworICAgICAgd2hpbGUgKCp0b2tlbl9wb3NuKQorCXsKKwkgIGlmICghaXNfZGlnaXRfY2hhciAoKnRva2VuX3Bvc24pKQorCSAgICBkaXJlY3RfbGFiZWwgPSAxOworCSAgdG9rZW5fcG9zbisrOworCX0KKyAgICAgIGlmIChkaXJlY3RfbGFiZWwpCisJeworCSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7CisJICBzZWdUIHJldHZhbDsKKwkgIGRlYnVnICgiRGlyZWN0IHJlZmVyZW5jZSBpcyBhIGxhYmVsXG4iKTsKKwkgIGN1cnJlbnRfb3AtPmRpcmVjdC5sYWJlbCA9IHRva2VuICsgMTsKKwkgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgaW5wdXRfbGluZV9wb2ludGVyID0gdG9rZW4gKyAxOworCSAgZGVidWcgKCJDdXJyZW50IGlucHV0X2xpbmVfcG9pbnRlcjogJXNcbiIsIGlucHV0X2xpbmVfcG9pbnRlcik7CisJICByZXR2YWwgPSBleHByZXNzaW9uICgmY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByKTsKKwkgIGRlYnVnICgiRXhwcmVzc2lvbiB0eXBlOiAlZFxuIiwgY3VycmVudF9vcC0+ZGlyZWN0LmRpcmVjdF9leHByLlhfb3ApOworCSAgZGVidWcgKCJFeHByZXNzaW9uIGFkZG51bTogJWRcbiIsIGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX2FkZF9udW1iZXIpOworCSAgZGVidWcgKCJTZWdtZW50OiAlZFxuIiwgcmV0dmFsKTsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOworCSAgaWYgKGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX29wID09IE9fY29uc3RhbnQpCisJICAgIHsKKwkgICAgICBjdXJyZW50X29wLT5kaXJlY3QuYWRkcmVzcyA9IGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX2FkZF9udW1iZXI7CisJICAgICAgY3VycmVudF9vcC0+ZGlyZWN0LnJlc29sdmVkID0gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBkZWJ1ZyAoIkRpcmVjdCByZWZlcmVuY2UgaXMgYSBudW1iZXJcbiIpOworCSAgY3VycmVudF9vcC0+ZGlyZWN0LmFkZHJlc3MgPSBhdG9pICh0b2tlbiArIDEpOworCSAgY3VycmVudF9vcC0+ZGlyZWN0LnJlc29sdmVkID0gMTsKKwl9CisgICAgICBjdXJyZW50X29wLT5vcF90eXBlID0gRGlyZWN0OworICAgIH0KKyAgZWxzZSBpZiAoKnRva2VuID09IElORElSRUNUX1JFRkVSRU5DRSkKKyAgICB7CQkJCS8qIEluZGlyZWN0IHJlZmVyZW5jZSBvcGVyYW5kICovCisgICAgICBpbnQgZm91bmRfYXIgPSAwOworICAgICAgaW50IGZvdW5kX2Rpc3AgPSAwOworICAgICAgaW50IGFyX251bWJlciA9IC0xOworICAgICAgaW50IGRpc3BfbnVtYmVyID0gMDsKKyAgICAgIGludCBidWZmZXJfcG9zbiA9IDE7CisgICAgICBpbmRfYWRkcl90eXBlICppbmRfYWRkcl9vcDsKKyAgICAgIGRlYnVnICgiRm91bmQgaW5kaXJlY3QgcmVmZXJlbmNlXG4iKTsKKyAgICAgIGluZF9idWZmZXJbMF0gPSAqdG9rZW47CisgICAgICBmb3IgKGNvdW50ID0gMTsgY291bnQgPCBzdHJsZW4gKHRva2VuKTsgY291bnQrKykKKwl7CQkJLyogU3RyaXAgb3BlcmFuZCAqLworCSAgaW5kX2J1ZmZlcltidWZmZXJfcG9zbl0gPSB0b2xvd2VyICgqKHRva2VuICsgY291bnQpKTsKKwkgIGlmICgoKih0b2tlbiArIGNvdW50IC0gMSkgPT0gJ2EnIHx8ICoodG9rZW4gKyBjb3VudCAtIDEpID09ICdBJykgJiYKKwkgICAgICAoKih0b2tlbiArIGNvdW50KSA9PSAncicgfHwgKih0b2tlbiArIGNvdW50KSA9PSAnUicpKQorCSAgICB7CisJICAgICAgLyogQVIgcmVmZXJlbmNlIGlzIGZvdW5kLCBzbyBnZXQgaXRzIG51bWJlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGJ1ZmZlcgorCSAgICAgICAgIHNvIGl0IGNhbiBwYXNzIHRocm91Z2ggaGFzaF9maW5kKCkgKi8KKwkgICAgICBpZiAoZm91bmRfYXIpCisJCXsKKwkJICBhc19iYWQgKCJNb3JlIHRoYW4gb25lIEFSIHJlZ2lzdGVyIGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOworCQkgIHJldHVybiBOVUxMOworCQl9CisJICAgICAgaWYgKCoodG9rZW4gKyBjb3VudCArIDEpIDwgJzAnIHx8ICoodG9rZW4gKyBjb3VudCArIDEpID4gJzcnKQorCQl7CisJCSAgYXNfYmFkICgiSWxsZWdhbCBBUiByZWdpc3RlciBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKKwkJICByZXR1cm4gTlVMTDsKKwkJfQorCSAgICAgIGFyX251bWJlciA9ICoodG9rZW4gKyBjb3VudCArIDEpIC0gJzAnOworCSAgICAgIGZvdW5kX2FyID0gMTsKKwkgICAgICBjb3VudCsrOworCSAgICB9CisJICBpZiAoKih0b2tlbiArIGNvdW50KSA9PSAnKCcpCisJICAgIHsKKwkgICAgICAvKiBQYXJlbnRoZXNpcyBmb3VuZCwgc28gY2hlY2sgaWYgYSBkaXNwbGFjZW1lbnQgdmFsdWUgaXMgaW5zaWRlLiAgSWYgc28sIGdldAorCSAgICAgICAgIHRoZSB2YWx1ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGJ1ZmZlci4gKi8KKwkgICAgICBpZiAoaXNfZGlnaXRfY2hhciAoKih0b2tlbiArIGNvdW50ICsgMSkpKQorCQl7CisJCSAgY2hhciBkaXNwWzEwXTsKKwkJICBpbnQgZGlzcF9wb3NuID0gMDsKKworCQkgIGlmIChmb3VuZF9kaXNwKQorCQkgICAgeworCQkgICAgICBhc19iYWQgKCJNb3JlIHRoYW4gb25lIGRpc3BsYWNlbWVudCBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKKwkJICAgICAgcmV0dXJuIE5VTEw7CisJCSAgICB9CisJCSAgY291bnQrKzsKKwkJICB3aGlsZSAoKih0b2tlbiArIGNvdW50KSAhPSAnKScpCisJCSAgICB7CisJCSAgICAgIGlmICghaXNfZGlnaXRfY2hhciAoKih0b2tlbiArIGNvdW50KSkpCisJCQl7CisJCQkgIGFzX2JhZCAoIkludmFsaWQgZGlzcGxhY2VtZW50IGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOworCQkJICByZXR1cm4gTlVMTDsKKwkJCX0KKwkJICAgICAgZGlzcFtkaXNwX3Bvc24rK10gPSAqKHRva2VuICsgKGNvdW50KyspKTsKKwkJICAgIH0KKwkJICBkaXNwW2Rpc3BfcG9zbl0gPSAnXDAnOworCQkgIGRpc3BfbnVtYmVyID0gYXRvaSAoZGlzcCk7CisJCSAgY291bnQtLTsKKwkJICBmb3VuZF9kaXNwID0gMTsKKwkJfQorCSAgICB9CisJICBidWZmZXJfcG9zbisrOworCX0KKyAgICAgIGluZF9idWZmZXJbYnVmZmVyX3Bvc25dID0gJ1wwJzsKKyAgICAgIGlmICghZm91bmRfYXIpCisJeworCSAgYXNfYmFkICgiQVIgcmVnaXN0ZXIgbm90IGZvdW5kIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgaW5kX2FkZHJfb3AgPSAoaW5kX2FkZHJfdHlwZSAqKSBoYXNoX2ZpbmQgKGluZF9oYXNoLCBpbmRfYnVmZmVyKTsKKyAgICAgIGlmIChpbmRfYWRkcl9vcCkKKwl7CisJICBkZWJ1ZyAoIkZvdW5kIGluZGlyZWN0IHJlZmVyZW5jZTogJXNcbiIsIGluZF9hZGRyX29wLT5zeW50YXgpOworCSAgaWYgKGluZF9hZGRyX29wLT5kaXNwbGFjZW1lbnQgPT0gSU1QTElFRF9ESVNQKQorCSAgICB7CisJICAgICAgZm91bmRfZGlzcCA9IDE7CisJICAgICAgZGlzcF9udW1iZXIgPSAxOworCSAgICB9CisJICBlbHNlIGlmICgoaW5kX2FkZHJfb3AtPmRpc3BsYWNlbWVudCA9PSBESVNQX1JFUVVJUkVEKSAmJiAhZm91bmRfZGlzcCkKKwkgICAgeworCSAgICAgIC8qIE1heWJlIGFuIGltcGxpZWQgZGlzcGxhY2VtZW50IG9mIDEgYWdhaW4gKi8KKwkgICAgICBhc19iYWQgKCJyZXF1aXJlZCBkaXNwbGFjZW1lbnQgd2Fzbid0IGdpdmVuIGluIGluZGlyZWN0IHJlZmVyZW5jZSIpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFzX2JhZCAoImlsbGVnYWwgaW5kaXJlY3QgcmVmZXJlbmNlIik7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBpZiAoZm91bmRfZGlzcCAmJiAoZGlzcF9udW1iZXIgPCAwIHx8IGRpc3BfbnVtYmVyID4gMjU1KSkKKwl7CisJICBhc19iYWQgKCJkaXNwbGFjZW1lbnQgbXVzdCBiZSBhbiB1bnNpZ25lZCA4LWJpdCBudW1iZXIiKTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0Lm1vZCA9IGluZF9hZGRyX29wLT5tb2RmaWVsZDsKKyAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0LmRpc3AgPSBkaXNwX251bWJlcjsKKyAgICAgIGN1cnJlbnRfb3AtPmluZGlyZWN0LkFSbnVtID0gYXJfbnVtYmVyOworICAgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IEluZGlyZWN0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlZyAqcmVnb3AgPSAocmVnICopIGhhc2hfZmluZCAocmVnX2hhc2gsIHRva2VuKTsKKyAgICAgIGlmIChyZWdvcCkKKwl7CisJICBkZWJ1ZyAoIkZvdW5kIHJlZ2lzdGVyIG9wZXJhbmQ6ICVzXG4iLCByZWdvcC0+bmFtZSk7CisJICBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX0FSbikKKwkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IEFSbjsKKwkgIGVsc2UgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19SbikKKwkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IFJuOworCSAgZWxzZSBpZiAocmVnb3AtPnJlZ3R5cGUgPT0gUkVHX0RQKQorCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gRFBSZWc7CisJICBlbHNlCisJICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBPdGhlclJlZzsKKwkgIGN1cnJlbnRfb3AtPnJlZy5vcGNvZGUgPSByZWdvcC0+b3Bjb2RlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCp0b2tlbikgfHwgKih0b2tlbiArIDEpID09ICd4JyB8fCBzdHJjaHIgKHRva2VuLCAnaCcpKQorCSAgICB7CisJICAgICAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgc2VnVCByZXR2YWw7CisJICAgICAgZGVidWcgKCJQcm9iYWJseSBhIGxhYmVsOiAlc1xuIiwgdG9rZW4pOworCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0b2tlbikgKyAxKTsKKwkgICAgICBzdHJjcHkgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCwgdG9rZW4pOworCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbFtzdHJsZW4gKHRva2VuKV0gPSAnXDAnOworCSAgICAgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRva2VuOworCSAgICAgIGRlYnVnICgiQ3VycmVudCBpbnB1dF9saW5lX3BvaW50ZXI6ICVzXG4iLCBpbnB1dF9saW5lX3BvaW50ZXIpOworCSAgICAgIHJldHZhbCA9IGV4cHJlc3Npb24gKCZjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIpOworCSAgICAgIGRlYnVnICgiRXhwcmVzc2lvbiB0eXBlOiAlZFxuIiwgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfb3ApOworCSAgICAgIGRlYnVnICgiRXhwcmVzc2lvbiBhZGRudW06ICVkXG4iLCBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKKwkgICAgICBkZWJ1ZyAoIlNlZ21lbnQ6ICVkXG4iLCByZXR2YWwpOworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIGlmIChjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQorCQl7CisJCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnNfbnVtYmVyID0gY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcjsKKwkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPSAodW5zaWduZWQgaW50KSBjdXJyZW50X29wLT5pbW1lZGlhdGUuaW1tX2V4cHIuWF9hZGRfbnVtYmVyOworCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5yZXNvbHZlZCA9IDE7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdW5zaWduZWQgY291bnQ7CisJICAgICAgZGVidWcgKCJGb3VuZCBhIG51bWJlciBvciBkaXNwbGFjZW1lbnRcbiIpOworCSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN0cmxlbiAodG9rZW4pOyBjb3VudCsrKQorCQlpZiAoKih0b2tlbiArIGNvdW50KSA9PSAnLicpCisJCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLmRlY2ltYWxfZm91bmQgPSAxOworCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuICh0b2tlbikgKyAxKTsKKwkgICAgICBzdHJjcHkgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbCwgdG9rZW4pOworCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5sYWJlbFtzdHJsZW4gKHRva2VuKV0gPSAnXDAnOworCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5mX251bWJlciA9IChmbG9hdCkgYXRvZiAodG9rZW4pOworCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5zX251bWJlciA9IChpbnQpIGF0b2kgKHRva2VuKTsKKwkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUudV9udW1iZXIgPSAodW5zaWduZWQgaW50KSBhdG9pICh0b2tlbik7CisJICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnJlc29sdmVkID0gMTsKKwkgICAgfQorCSAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERpc3AgfCBBYnMyNCB8IEltbTE2IHwgSW1tMjQ7CisJICBpZiAoY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID49IDAgJiYgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyIDw9IDMxKQorCSAgICBjdXJyZW50X29wLT5vcF90eXBlIHw9IElWZWN0b3I7CisJfQorICAgIH0KKyAgcmV0dXJuIGN1cnJlbnRfb3A7Cit9CisKKy8qIG5leHRfbGluZSBwb2ludHMgdG8gdGhlIG5leHQgbGluZSBhZnRlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiAoY3VycmVudF9saW5lKS4KKyAgIFNlYXJjaCBmb3IgdGhlIHBhcmFsbGVsIGJhcnMsIGFuZCBpZiBmb3VuZCwgbWVyZ2UgdHdvIGxpbmVzIGludG8gaW50ZXJuYWwgc3ludGF4CisgICBmb3IgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbjoKKyAgIHFfW0lOU04xXV9bSU5TTjJdIFtPUEVSQU5EUzFdIHwgW09QRVJBTkRTMl0KKyAgIEJ5IHRoaXMgc3RhZ2UsIGFsbCBjb21tZW50cyBhcmUgc2NydWJiZWQsIGFuZCBvbmx5IHRoZSBiYXJlIGxpbmVzIGFyZSBnaXZlbi4KKyAqLworCisjZGVmaW5lIE5PTkUgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBUlRfT1BDT0RFICAgMQorI2RlZmluZSBFTkRfT1BDT0RFICAgICAyCisjZGVmaW5lIFNUQVJUX09QRVJBTkRTIDMKKyNkZWZpbmUgRU5EX09QRVJBTkRTICAgNAorCitjaGFyICoKK3RpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiAoY3VycmVudF9saW5lLCBuZXh0X2xpbmUpCisgICAgIGNoYXIgKmN1cnJlbnRfbGluZTsKKyAgICAgY2hhciAqbmV4dF9saW5lOworeworICBpbnQgZm91bmRfcGFyYWxsZWwgPSAwOworICBjaGFyIGZpcnN0X29wY29kZVsyNTZdOworICBjaGFyIHNlY29uZF9vcGNvZGVbMjU2XTsKKyAgY2hhciBmaXJzdF9vcGVyYW5kc1syNTZdOworICBjaGFyIHNlY29uZF9vcGVyYW5kc1syNTZdOworICBjaGFyICpwYXJhbGxlbF9pbnNuOworCisgIGRlYnVnICgiSW4gdGljMzBfZmluZF9wYXJhbGxlbF9pbnNuKClcbiIpOworICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyhpbnQpICpuZXh0X2xpbmVdKQorICAgIHsKKyAgICAgIGlmICgqbmV4dF9saW5lID09IFBBUkFMTEVMX1NFUEFSQVRPUiAmJiAqKG5leHRfbGluZSArIDEpID09IFBBUkFMTEVMX1NFUEFSQVRPUikKKwl7CisJICBmb3VuZF9wYXJhbGxlbCA9IDE7CisJICBuZXh0X2xpbmUrKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIG5leHRfbGluZSsrOworICAgIH0KKyAgaWYgKCFmb3VuZF9wYXJhbGxlbCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZGVidWcgKCJGb3VuZCBhIHBhcmFsbGVsIGluc3RydWN0aW9uXG4iKTsKKyAgeworICAgIGludCBpOworICAgIGNoYXIgKm9wY29kZSwgKm9wZXJhbmRzLCAqbGluZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICB7CisJaWYgKGkgPT0gMCkKKwkgIHsKKwkgICAgb3Bjb2RlID0gJmZpcnN0X29wY29kZVswXTsKKwkgICAgb3BlcmFuZHMgPSAmZmlyc3Rfb3BlcmFuZHNbMF07CisJICAgIGxpbmUgPSBjdXJyZW50X2xpbmU7CisJICB9CisJZWxzZQorCSAgeworCSAgICBvcGNvZGUgPSAmc2Vjb25kX29wY29kZVswXTsKKwkgICAgb3BlcmFuZHMgPSAmc2Vjb25kX29wZXJhbmRzWzBdOworCSAgICBsaW5lID0gbmV4dF9saW5lOworCSAgfQorCXsKKwkgIGludCBzZWFyY2hfc3RhdHVzID0gTk9ORTsKKwkgIGludCBjaGFyX3B0ciA9IDA7CisJICBjaGFyIGM7CisKKwkgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKGludCkgKGMgPSAqbGluZSldICYmICpsaW5lKQorCSAgICB7CisJICAgICAgaWYgKGlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IE5PTkUpCisJCXsKKwkJICBvcGNvZGVbY2hhcl9wdHIrK10gPSB0b2xvd2VyIChjKTsKKwkJICBzZWFyY2hfc3RhdHVzID0gU1RBUlRfT1BDT0RFOworCQl9CisJICAgICAgZWxzZSBpZiAoaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BDT0RFKQorCQl7CisJCSAgb3Bjb2RlW2NoYXJfcHRyKytdID0gdG9sb3dlciAoYyk7CisJCX0KKwkgICAgICBlbHNlIGlmICghaXNfb3Bjb2RlX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gU1RBUlRfT1BDT0RFKQorCQl7CisJCSAgb3Bjb2RlW2NoYXJfcHRyXSA9ICdcMCc7CisJCSAgY2hhcl9wdHIgPSAwOworCQkgIHNlYXJjaF9zdGF0dXMgPSBFTkRfT1BDT0RFOworCQl9CisJICAgICAgZWxzZSBpZiAoaXNfb3BlcmFuZF9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QRVJBTkRTKQorCQl7CisJCSAgb3BlcmFuZHNbY2hhcl9wdHIrK10gPSBjOworCQl9CisJICAgICAgaWYgKGlzX29wZXJhbmRfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBFTkRfT1BDT0RFKQorCQl7CisJCSAgb3BlcmFuZHNbY2hhcl9wdHIrK10gPSBjOworCQkgIHNlYXJjaF9zdGF0dXMgPSBTVEFSVF9PUEVSQU5EUzsKKwkJfQorCSAgICAgIGxpbmUrKzsKKwkgICAgfQorCSAgaWYgKHNlYXJjaF9zdGF0dXMgIT0gU1RBUlRfT1BFUkFORFMpCisJICAgIHJldHVybiBOVUxMOworCSAgb3BlcmFuZHNbY2hhcl9wdHJdID0gJ1wwJzsKKwl9CisgICAgICB9CisgIH0KKyAgcGFyYWxsZWxfaW5zbiA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChmaXJzdF9vcGNvZGUpICsgc3RybGVuIChmaXJzdF9vcGVyYW5kcykgKworCQkgICAgIHN0cmxlbiAoc2Vjb25kX29wY29kZSkgKyBzdHJsZW4gKHNlY29uZF9vcGVyYW5kcykgKyA4KTsKKyAgc3ByaW50ZiAocGFyYWxsZWxfaW5zbiwgInFfJXNfJXMgJXMgfCAlcyIsIGZpcnN0X29wY29kZSwgc2Vjb25kX29wY29kZSwgZmlyc3Rfb3BlcmFuZHMsIHNlY29uZF9vcGVyYW5kcyk7CisgIGRlYnVnICgicGFyYWxsZWwgaW5zbiA9ICVzXG4iLCBwYXJhbGxlbF9pbnNuKTsKKyAgcmV0dXJuIHBhcmFsbGVsX2luc247Cit9CisKKyN1bmRlZiBOT05FCisjdW5kZWYgU1RBUlRfT1BDT0RFCisjdW5kZWYgRU5EX09QQ09ERQorI3VuZGVmIFNUQVJUX09QRVJBTkRTCisjdW5kZWYgRU5EX09QRVJBTkRTCisKKy8qIEluIG9yZGVyIHRvIGdldCBnYXMgdG8gaWdub3JlIGFueSB8IGNoYXJzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUsCisgICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhIHwgaXMgZm91bmQgaW4gYSBsaW5lLiAqLworCitpbnQKK3RpYzMwX3VucmVjb2duaXplZF9saW5lIChjKQorICAgICBpbnQgYzsKK3sKKyAgZGVidWcgKCJJbiB0Y191bnJlY29nbml6ZWRfbGluZVxuIik7CisgIHJldHVybiAoYyA9PSBQQVJBTExFTF9TRVBBUkFUT1IpOworfQorCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKKyAgICAgZnJhZ1MgKmZyYWdQOworICAgICBzZWdUIHNlZ21lbnQ7Cit7CisgIGRlYnVnICgiSW4gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKVxuIik7CisgIHJldHVybiAwOworfQorCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VnVCBzZWM7CisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKK3sKKyAgZGVidWcgKCJJbiBtZF9jb252ZXJ0X2ZyYWcoKVxuIik7Cit9CisKK2ludAorbWRfYXBwbHlfZml4IChmaXhQLCB2YWxQKQorICAgICBmaXhTICpmaXhQOworICAgICB2YWx1ZVQgKnZhbFA7Cit7CisgIHZhbHVlVCB2YWx1ZSA9ICp2YWxQOworCisgIGRlYnVnICgiSW4gbWRfYXBwbHlfZml4KCkgd2l0aCB2YWx1ZSA9ICVsZFxuIiwgKGxvbmcpIHZhbHVlKTsKKyAgZGVidWcgKCJWYWx1ZXMgaW4gZml4UFxuIik7CisgIGRlYnVnICgiZnhfc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKKyAgZGVidWcgKCJmeF9wY3JlbCA9ICVkXG4iLCBmaXhQLT5meF9wY3JlbCk7CisgIGRlYnVnICgiZnhfd2hlcmUgPSAlZFxuIiwgZml4UC0+Znhfd2hlcmUpOworICBkZWJ1ZyAoImZ4X29mZnNldCA9ICVkXG4iLCAoaW50KSBmaXhQLT5meF9vZmZzZXQpOworICB7CisgICAgY2hhciAqYnVmID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOworICAgIHZhbHVlIC89IElOU05fU0laRTsKKyAgICBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxKQorICAgICAgewkJCQkvKiBTcGVjaWFsIGZpeCBmb3IgTERQIGluc3RydWN0aW9uLiAqLworCXZhbHVlID0gKHZhbHVlICYgMHgwMEZGMDAwMCkgPj4gMTY7CisgICAgICB9CisgICAgZGVidWcgKCJuZXcgdmFsdWUgPSAlbGRcbiIsIChsb25nKSB2YWx1ZSk7CisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50CittZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKKyAgICAgaW50IGM7CisgICAgIGNoYXIgKmFyZzsKK3sKKyAgaW50IGk7CisKKyAgZGVidWcgKCJJbiBtZF9wYXJzZV9vcHRpb24oKVxuIik7CisgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCisgICAgeworICAgICAgcHJpbnRmICgiJWNcbiIsIGFyZ1tjXSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGRlYnVnICgiSW4gbWRfc2hvd191c2FnZSgpXG4iKTsKK30KKworc3ltYm9sUyAqCittZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBkZWJ1ZyAoIkluIG1kX3VuZGVmaW5lZF9zeW1ib2woKVxuIik7CisgIHJldHVybiAoc3ltYm9sUyAqKSAwOworfQorCit2YWx1ZVQKK21kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCisgICAgIHNlZ1Qgc2VnbWVudDsKKyAgICAgdmFsdWVUIHNpemU7Cit7CisgIGRlYnVnICgiSW4gbWRfc2VjdGlvbl9hbGlnbigpIHNlZ21lbnQgPSAlZCBhbmQgc2l6ZSA9ICVkXG4iLCBzZWdtZW50LCBzaXplKTsKKyAgc2l6ZSA9IChzaXplICsgMykgLyA0OworICBzaXplICo9IDQ7CisgIGRlYnVnICgiTmV3IHNpemUgdmFsdWUgPSAlZFxuIiwgc2l6ZSk7CisgIHJldHVybiBzaXplOworfQorCitsb25nCittZF9wY3JlbF9mcm9tIChmaXhQKQorICAgICBmaXhTICpmaXhQOworeworICBpbnQgb2Zmc2V0OworCisgIGRlYnVnICgiSW4gbWRfcGNyZWxfZnJvbSgpXG4iKTsKKyAgZGVidWcgKCJmeF93aGVyZSA9ICVkXG4iLCBmaXhQLT5meF93aGVyZSk7CisgIGRlYnVnICgiZnhfc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKKyAgLyogRmluZCB0aGUgb3Bjb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpbiB0aGUgZnJfbGl0ZXJhbAorICAgICBzdG9yYWdlIGFyZWEsIGFuZCBjaGVjayBiaXQgMjEuICBCaXQgMjEgY29udGFpbnMgd2hldGhlciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbgorICAgICBpcyBhIGRlbGF5ZWQgb25lIG9yIG5vdCwgYW5kIHRoZW4gc2V0IHRoZSBvZmZzZXQgdmFsdWUgYXBwcm9wcmlhdGVseS4gKi8KKyAgaWYgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWxbZml4UC0+Znhfd2hlcmUgLSBmaXhQLT5meF9zaXplICsgMV0gJiAweDIwKQorICAgIG9mZnNldCA9IDM7CisgIGVsc2UKKyAgICBvZmZzZXQgPSAxOworICBkZWJ1ZyAoIm9mZnNldCA9ICVkXG4iLCBvZmZzZXQpOworICAvKiBQQyBSZWxhdGl2ZSBpbnN0cnVjdGlvbnMgaGF2ZSBhIGZvcm1hdDoKKyAgICAgZGlzcGxhY2VtZW50ID0gTGFiZWwgLSAoUEMgKyBvZmZzZXQpCisgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBQQyArIG9mZnNldCB3aGVyZToKKyAgICAgZnhfd2hlcmUgLSBmeF9zaXplID0gUEMKKyAgICAgSU5TTl9TSVpFICogb2Zmc2V0ID0gb2Zmc2V0IG51bWJlciBvZiBpbnN0cnVjdGlvbnMKKyAgICovCisgIHJldHVybiBmaXhQLT5meF93aGVyZSAtIGZpeFAtPmZ4X3NpemUgKyAoSU5TTl9TSVpFICogb2Zmc2V0KTsKK30KKworY2hhciAqCittZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCisgICAgIGludCB3aGF0X3N0YXRlbWVudF90eXBlOworICAgICBjaGFyICpsaXRlcmFsUDsKKyAgICAgaW50ICpzaXplUDsKK3sKKyAgaW50IHByZWM7CisgIGNoYXIgKnRva2VuOworICBjaGFyIGtlZXB2YWw7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIC8qICBjaGFyICphdG9mX2llZWUgKCk7ICovCisgIGZsb2F0IGZsb2F0X3ZhbHVlOworICBkZWJ1ZyAoIkluIG1kX2F0b2YoKVxuIik7CisgIGRlYnVnICgicHJlY2lzaW9uID0gJWNcbiIsIHdoYXRfc3RhdGVtZW50X3R5cGUpOworICBkZWJ1ZyAoImxpdGVyYWwgPSAlc1xuIiwgbGl0ZXJhbFApOworICBkZWJ1ZyAoImxpbmUgPSAiKTsKKyAgdG9rZW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkKSAqaW5wdXRfbGluZV9wb2ludGVyXSAmJiAoKmlucHV0X2xpbmVfcG9pbnRlcikgJiYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKSkKKyAgICB7CisgICAgICBkZWJ1ZyAoIiVjIiwgKmlucHV0X2xpbmVfcG9pbnRlcik7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICB9CisgIGtlZXB2YWwgPSAqaW5wdXRfbGluZV9wb2ludGVyOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKKyAgZGVidWcgKCJcbiIpOworICBmbG9hdF92YWx1ZSA9IChmbG9hdCkgYXRvZiAodG9rZW4pOworICAqaW5wdXRfbGluZV9wb2ludGVyID0ga2VlcHZhbDsKKyAgZGVidWcgKCJmbG9hdF92YWx1ZSA9ICVmXG4iLCBmbG9hdF92YWx1ZSk7CisgIHN3aXRjaCAod2hhdF9zdGF0ZW1lbnRfdHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSI7CisgICAgfQorICBpZiAoZmxvYXRfdmFsdWUgPT0gMC4wKQorICAgIHsKKyAgICAgIHZhbHVlID0gKHByZWMgPT0gMikgPyAweDAwMDA4MDAwTCA6IDB4ODAwMDAwMDBMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgZXhwLCBzaWduLCBtYW50LCB0bXNmbG9hdDsKKyAgICAgIHRtc2Zsb2F0ID0gKigobG9uZyAqKSAmZmxvYXRfdmFsdWUpOworICAgICAgc2lnbiA9IHRtc2Zsb2F0ICYgMHg4MDAwMDAwMDsKKyAgICAgIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7CisgICAgICBleHAgPSB0bXNmbG9hdCAmIDB4N0Y4MDAwMDA7CisgICAgICBleHAgPDw9IDE7CisgICAgICBpZiAoZXhwID09IDB4RkYwMDAwMDApCisJeworCSAgaWYgKG1hbnQgPT0gMCkKKwkgICAgdmFsdWUgPSAweDdGN0ZGRkZGOworCSAgZWxzZSBpZiAoc2lnbiA9PSAwKQorCSAgICB2YWx1ZSA9IDB4N0Y3RkZGRkY7CisJICBlbHNlCisJICAgIHZhbHVlID0gMHg3RjgwMDAwMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXhwIC09IDB4N0YwMDAwMDA7CisJICBpZiAoc2lnbikKKwkgICAgeworCSAgICAgIG1hbnQgPSBtYW50ICYgMHgwMDdGRkZGRjsKKwkgICAgICBtYW50ID0gLW1hbnQ7CisJICAgICAgbWFudCA9IG1hbnQgJiAweDAwRkZGRkZGOworCSAgICAgIGlmIChtYW50ID09IDApCisJCXsKKwkJICBtYW50IHw9IDB4MDA4MDAwMDA7CisJCSAgZXhwID0gKGxvbmcpIGV4cCAtIDB4MDEwMDAwMDA7CisJCX0KKwkgICAgfQorCSAgdG1zZmxvYXQgPSBleHAgfCBtYW50OworCSAgdmFsdWUgPSB0bXNmbG9hdDsKKwl9CisgICAgICBpZiAocHJlYyA9PSAyKQorCXsKKwkgIGxvbmcgZXhwLCBtYW50OworCisJICBpZiAodG1zZmxvYXQgPT0gMHg4MDAwMDAwMCkKKwkgICAgeworCSAgICAgIHZhbHVlID0gMHg4MDAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB2YWx1ZSA9IDA7CisJICAgICAgZXhwID0gKHRtc2Zsb2F0ICYgMHhGRjAwMDAwMCk7CisJICAgICAgZXhwID4+PSAyNDsKKwkgICAgICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOworCSAgICAgIGlmICh0bXNmbG9hdCAmIDB4MDA4MDAwMDApCisJCXsKKwkJICBtYW50IHw9IDB4RkYwMDAwMDA7CisJCSAgbWFudCArPSAweDAwMDAwODAwOworCQkgIG1hbnQgPj49IDEyOworCQkgIG1hbnQgfD0gMHgwMDAwMDgwMDsKKwkJICBtYW50ICY9IDB4MEZGRjsKKwkJICBpZiAoZXhwID4gNykKKwkJICAgIHZhbHVlID0gMHg3ODAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgbWFudCB8PSAweDAwODAwMDAwOworCQkgIG1hbnQgKz0gMHgwMDAwMDgwMDsKKwkJICBleHAgKz0gKG1hbnQgPj4gMjQpOworCQkgIG1hbnQgPj49IDEyOworCQkgIG1hbnQgJj0gMHgwN0ZGOworCQkgIGlmIChleHAgPiA3KQorCQkgICAgdmFsdWUgPSAweDc3RkY7CisJCX0KKwkgICAgICBpZiAoZXhwIDwgLTgpCisJCXZhbHVlID0gMHg4MDAwOworCSAgICAgIGlmICh2YWx1ZSA9PSAwKQorCQl7CisJCSAgbWFudCA9IChleHAgPDwgMTIpIHwgbWFudDsKKwkJICB2YWx1ZSA9IG1hbnQgJiAweEZGRkY7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsIHZhbHVlLCBwcmVjKTsKKyAgKnNpemVQID0gcHJlYzsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK21kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG47Cit7CisgIGRlYnVnICgiSW4gbWRfbnVtYmVyX3RvX2NoYXJzKClcbiIpOworICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7CisgIC8qICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuKGJ1Zix2YWwsbik7ICovCit9CisKKyNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCisjZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYoU1osUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhaworCithcmVsZW50ICoKK3RjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4UCkKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGZpeFMgKmZpeFA7Cit7CisgIGFyZWxlbnQgKnJlbDsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUgPSAwOworCisgIGRlYnVnICgiSW4gdGNfZ2VuX3JlbG9jKClcbiIpOworICBkZWJ1ZyAoImZpeFAuc2l6ZSA9ICVkXG4iLCBmaXhQLT5meF9zaXplKTsKKyAgZGVidWcgKCJmaXhQLnBjcmVsID0gJWRcbiIsIGZpeFAtPmZ4X3BjcmVsKTsKKyAgZGVidWcgKCJhZGRzeS5uYW1lID0gJXNcbiIsIFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSk7CisgIHN3aXRjaCAoRiAoZml4UC0+Znhfc2l6ZSwgZml4UC0+ZnhfcGNyZWwpKQorICAgIHsKKyAgICAgIE1BUCAoMSwgMCwgQkZEX1JFTE9DX1RJQzMwX0xEUCk7CisgICAgICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7CisgICAgICBNQVAgKDMsIDAsIEJGRF9SRUxPQ18yNCk7CisgICAgICBNQVAgKDIsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7CisgICAgICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2JhZCAoIkNhbiBub3QgZG8gJWQgYnl0ZSAlc3JlbG9jYXRpb24iLCBmaXhQLT5meF9zaXplLAorCSAgICAgIGZpeFAtPmZ4X3BjcmVsID8gInBjLXJlbGF0aXZlICIgOiAiIik7CisgICAgfQorI3VuZGVmIE1BUAorI3VuZGVmIEYKKworICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKKyAgYXNzZXJ0IChyZWwgIT0gMCk7CisgIHJlbC0+c3ltX3B0cl9wdHIgPSAmZml4UC0+ZnhfYWRkc3ktPmJzeW07CisgIHJlbC0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKKyAgaWYgKGZpeFAtPmZ4X3BjcmVsKQorICAgIHJlbC0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOworICBlbHNlCisgICAgcmVsLT5hZGRlbmQgPSAwOworICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOworICBpZiAoIXJlbC0+aG93dG8pCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCW5hbWUgPSAiPHVua25vd24+IjsKKyAgICAgIGFzX2ZhdGFsICgiQ2Fubm90IGdlbmVyYXRlIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVzIiwgbmFtZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKKyAgICB9CisgIHJldHVybiByZWw7Cit9CisKK3ZvaWQKK3RjX2FvdXRfcHJlX3dyaXRlX2hvb2sgKCkKK3sKKyAgZGVidWcgKCJJbiB0Y19hb3V0X3ByZV93cml0ZV9ob29rKClcbiIpOworfQorCit2b2lkCittZF9vcGVyYW5kIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworICBkZWJ1ZyAoIkluIG1kX29wZXJhbmQoKVxuIik7Cit9CisKK2NoYXIgb3V0cHV0X2ludmFsaWRfYnVmWzhdOworCitjaGFyICoKK291dHB1dF9pbnZhbGlkIChjKQorICAgICBjaGFyIGM7Cit7CisgIGlmIChpc3ByaW50IChjKSkKKyAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICInJWMnIiwgYyk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChvdXRwdXRfaW52YWxpZF9idWYsICIoMHgleCkiLCAodW5zaWduZWQpIGMpOworICByZXR1cm4gb3V0cHV0X2ludmFsaWRfYnVmOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5oIGIvZ2FzL2NvbmZpZy90Yy10aWMzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzJkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXRpYzMwLmgKQEAgLTAsMCArMSw1NSBAQAorLyogdGMtdGljMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdGljMzAuYworICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX1RDX1RJQzMwX0hfCisjZGVmaW5lIF9UQ19USUMzMF9IXworCisjZGVmaW5lIFRDX1RJQzMwIDEKKworI2lmZGVmIE9CSl9BT1VUCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXRpYzMwIgorI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX3RpYzMwCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTEKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKK2NoYXIgKm91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCBjKSk7CisKKyNkZWZpbmUgRU5EX09GX0lOU04gJ1wwJworI2RlZmluZSBNQVhfT1BFUkFORFMgNgorI2RlZmluZSBESVJFQ1RfUkVGRVJFTkNFICdAJworI2RlZmluZSBJTkRJUkVDVF9SRUZFUkVOQ0UgJyonCisjZGVmaW5lIFBBUkFMTEVMX1NFUEFSQVRPUiAnfCcKKyNkZWZpbmUgSU5TTl9TSVpFIDQKKworLyogRGVmaW5lIHRoaXMgdG8gMSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgb3V0cHV0IHRvIGJlIG9uIHN0ZG91dCwKKyAgIG90aGVyd2lzZSBzdGRlcnIgd2lsbCBiZSB1c2VkLiAgSWYgc3RkZXJyIGlzIHVzZWQsIHRoZXJlIHdpbGwgYmUgYQorICAgYmV0dGVyIHN5bmNocm9uaXNhdGlvbiB3aXRoIHRoZSBhc19iYWQgb3V0cHV0cywgYnV0IHlvdSBjYW4ndAorICAgY2FwdHVyZSB0aGUgb3V0cHV0LiAqLworI2RlZmluZSBVU0VfU1RET1VUIDAKKworI2RlZmluZSB0Y191bnJlY29nbml6ZWRfbGluZSB0aWMzMF91bnJlY29nbml6ZWRfbGluZQorCitleHRlcm4gaW50IHRpYzMwX3VucmVjb2duaXplZF9saW5lIFBBUkFNUyAoKGludCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljODAuYyBiL2dhcy9jb25maWcvdGMtdGljODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFkYmEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy10aWM4MC5jCkBAIC0wLDAgKzEsMTA2MSBAQAorLyogdGMtdGljODAuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIFRJIFRNUzMyMEM4MCAoTVYpCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgIm9wY29kZS90aWM4MC5oIgorCisjZGVmaW5lIGludGVybmFsX2Vycm9yKHdoYXQpIFwKKyAgYXNfZmF0YWwoXygiaW50ZXJuYWwgZXJyb3I6JXM6JWQ6ICVzXG4iKSxfX0ZJTEVfXyxfX0xJTkVfXyx3aGF0KQorI2RlZmluZSBpbnRlcm5hbF9lcnJvcl9hKHdoYXQsYXJnKSBcCisgIGFzX2ZhdGFsKF8oImludGVybmFsIGVycm9yOiVzOiVkOiAlcyAlZFxuIiksX19GSUxFX18sX19MSU5FX18sd2hhdCxhcmcpCisKKwwKKy8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbCB0YXJnZXRzLiAqLworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICovCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICI7IjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICI7KiMiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgc2luZ2xlCisgICBsaW5lLiBUaGUgc2VtaWNvbG9uIGlzIHN1Y2ggYSBjaGFyYWN0ZXIgYnkgZGVmYXVsdCBhbmQgc2hvdWxkIG5vdCBiZQorICAgZXhwbGljaXRseSBsaXN0ZWQuICovCitjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBhcmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBleHBvbmVudCBpbiBhIGZsb2F0aW5nIAorICAgcG9pbnQgbnVtYmVyLiAgKi8KK2NvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LCAKKyAgIGFzIGluIDBmMS4wLiAgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkYiOworCisvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCisgICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgorCisgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAorICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCisgICBpbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiAqLworCitleHRlcm4gdm9pZCBvYmpfY29mZl9zZWN0aW9uICgpOworCitjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworICB7ICJhbGlnbiIsCXNfYWxpZ25fYnl0ZXMsCQk0IH0sCS8qIERvIGJ5dGUgYWxpZ25tZW50LCBkZWZhdWx0IGlzIGEgNCBieXRlIGJvdW5kYXJ5ICovCisgIHsgIndvcmQiLAljb25zLAkJCTQgfSwJLyogRklYTUU6IFNob3VsZCB0aGlzIGJlIG1hY2hpbmUgaW5kZXBlbmRlbnQ/ICovCisgIHsgImJzcyIsCXNfbGNvbW1fYnl0ZXMsCQkxIH0sCisgIHsgInNlY3QiLAlvYmpfY29mZl9zZWN0aW9uLAkwfSwJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUSSB0b29scyAqLworICB7ICJzZWN0aW9uIiwJb2JqX2NvZmZfc2VjdGlvbiwJMH0sCS8qIFN0YW5kYXJkIENPRkYgLnNlY3Rpb24gcHNldWRvLW9wICovCisgIHsgTlVMTCwJTlVMTCwJCQkwIH0KK307CisKKy8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0aWM4MF9oYXNoOworCitzdGF0aWMgc3RydWN0IHRpYzgwX29wY29kZSAqIGZpbmRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCB0aWM4MF9vcGNvZGUgKiwgZXhwcmVzc2lvblMgW10pKTsKK3N0YXRpYyB2b2lkIGJ1aWxkX2luc24gUEFSQU1TICgoc3RydWN0IHRpYzgwX29wY29kZSAqLCBleHByZXNzaW9uUyAqKSk7CitzdGF0aWMgaW50IGdldF9vcGVyYW5kcyBQQVJBTVMgKChleHByZXNzaW9uUyBleHBbXSkpOworc3RhdGljIGludCBjb25zdF9vdmVyZmxvdyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG51bSwgaW50IGJpdHMsIGludCBmbGFncykpOworCisvKiBSZXBsYWNlIHNob3J0IFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyB3aXRoIGxvbmcgZm9ybSB3aGVuIG5lY2Vzc2FyeS4gIEN1cnJlbnRseQorICAgdGhpcyBpcyBvZmYgYnkgZGVmYXVsdCBvciB3aGVuIGdpdmVuIHRoZSAtbm8tcmVsYXggb3B0aW9uLiAgVHVybmluZyBpdCBvbiBieSB1c2luZworICAgdGhlIC1yZWxheCBvcHRpb24gZm9yY2VzIGFsbCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgdG8gdXNlIHRoZSBsb25nIGZvcm0sIHdoaWNoCisgICBpcyB3aHkgaXQgaXMgY3VycmVudGx5IG5vdCB0aGUgZGVmYXVsdC4gKi8KK3N0YXRpYyBpbnQgdGljODBfcmVsYXggPSAwOworCisMCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQorICAgICBmcmFnUyAqZnJhZ1A7CisgICAgIHNlZ1Qgc2VnbWVudF90eXBlOworeworICBpbnRlcm5hbF9lcnJvciAoXygiUmVsYXhhdGlvbiBpcyBhIGx1eHVyeSB3ZSBjYW4ndCBhZmZvcmQiKSk7CisgIHJldHVybiAoLTEpOworfQorCisvKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCisKKy8qIEFSR1NVU0VEICovCitzeW1ib2xTICoKK21kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiAwOworfQorCisvKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQorICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUworICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCisgKi8KKworI2RlZmluZSBNQVhfTElUVExFTlVNUyA0CisKK2NoYXIgKgorbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCisgICAgIGludCB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7CisgIGNoYXIgKnQ7CisgIGNoYXIgKmF0b2ZfaWVlZSAoKTsKKyAgCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiAoKSIpOworICAgIH0KKworICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKyAgICB9CisgIAorICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgIAorICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKyAgcmV0dXJuIChOVUxMKTsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjb25zdGFudCB2YWx1ZSBpbiBOVU0gd2lsbCBmaXQgaW4gYSBmaWVsZCBvZgorICAgd2lkdGggQklUUyBpZiBpdCBoYXMgZmxhZ3MgRkxBR1MuICovCisKK3N0YXRpYyBpbnQKK2NvbnN0X292ZXJmbG93IChudW0sIGJpdHMsIGZsYWdzKQorICAgICB1bnNpZ25lZCBsb25nIG51bTsKKyAgICAgaW50IGJpdHM7CisgICAgIGludCBmbGFnczsKK3sKKyAgbG9uZyBtaW4sIG1heDsKKyAgaW50IHJldHZhbCA9IDA7CisKKyAgLyogT25seSBuZWVkIHRvIGNoZWNrIGZpZWxkcyBsZXNzIHRoYW4gMzIgYml0cyB3aWRlICovCisgIGlmIChiaXRzIDwgMzIpCisgICAgaWYgKGZsYWdzICYgVElDODBfT1BFUkFORF9TSUdORUQpCisgICAgICB7CisJbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOyAKKwltaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOyAgCisJcmV0dmFsID0gKChsb25nKSBudW0gPiBtYXgpIHx8ICgobG9uZykgbnVtIDwgbWluKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJbWF4ID0gKDEgPDwgYml0cykgLSAxOworCW1pbiA9IDA7CisJcmV0dmFsID0gKG51bSA+IG1heCkgfHwgKG51bSA8IG1pbik7CisgICAgICB9CisgIHJldHVybiAocmV0dmFsKTsKK30KKworLyogZ2V0X29wZXJhbmRzKCkgcGFyc2VzIGEgc3RyaW5nIG9mIG9wZXJhbmRzIGFuZCBmaWxscyBpbiBhIHBhc3NlZCBhcnJheSBvZgorICAgZXhwcmVzc2lvbnMgaW4gRVhQLgorCisgICBOb3RlIHRoYXQgd2UgdXNlIE9fYWJzZW50IGV4cHJlc3Npb25zIHRvIHJlY29yZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgcHJldmlvdXMgbm9uLU9fYWJzZW50IGV4cHJlc3Npb24sIHN1Y2ggYXMgIjptIiBvciAiOnMiCisgICBtb2RpZmllcnMgb3IgcmVnaXN0ZXIgbnVtYmVycyBlbmNsb3NlZCBpbiBwYXJlbnMgbGlrZSAiKHIxMCkiLgorCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgdGhhdCB3ZXJlIHBsYWNlZCBpbiBFWFAuCisKKyAgICovCisKK3N0YXRpYyBpbnQKK2dldF9vcGVyYW5kcyAoZXhwKSAKKyAgICAgZXhwcmVzc2lvblMgZXhwW107Cit7CisgIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGludCBudW1leHAgPSAwOworICBpbnQgbWZsYWcgPSAwOworICBpbnQgc2ZsYWcgPSAwOworICBpbnQgcGFyZW5zID0gMDsKKworICB3aGlsZSAoKnApICAKKyAgICB7CisgICAgICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCisJeworCSAgcCsrOworCX0KKworICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW55IG9wZXJhbmRzIGxlZnQgdG8gcGFyc2UgKi8KKyAgICAgIGlmICgqcCA9PSAwIHx8ICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgCisJeworCSAgYnJlYWs7CisJfQorICAgICAgCisgICAgICAvKiBOb3RpY2Ugc2NhbGluZyBvciBkaXJlY3QgbWVtb3J5IG9wZXJhbmQgbW9kaWZpZXJzIGFuZCBzYXZlIHRoZW0gaW4KKwkgYW4gT19hYnNlbnQgZXhwcmVzc2lvbiBhZnRlciB0aGUgZXhwcmVzc2lvbiB0aGF0IHRoZXkgbW9kaWZ5LiAqLworCisgICAgICBpZiAoKnAgPT0gJzonKSAKKwl7CisJICBwKys7CisJICBleHBbbnVtZXhwXS5YX29wID0gT19hYnNlbnQ7CisJICBpZiAoKnAgPT0gJ20nKSAKKwkgICAgeworCSAgICAgIHArKzsKKwkgICAgICAvKiBUaGlzIGlzIGEgIjptIiBtb2RpZmllciAqLworCSAgICAgIGV4cFtudW1leHBdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfTV9TSSB8IFRJQzgwX09QRVJBTkRfTV9MSTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnAgPT0gJ3MnKQorCSAgICB7CisJICAgICAgcCsrOworCSAgICAgIC8qIFRoaXMgaXMgYSAiOnMiIG1vZGlmaWVyICovCisJICAgICAgZXhwW251bWV4cF0uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9TQ0FMRUQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiJzonIG5vdCBmb2xsb3dlZCBieSAnbScgb3IgJ3MnIikpOworCSAgICB9CisJICBudW1leHArKzsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSGFuZGxlIGxlYWRpbmcgJygnIG9uIG9wZXJhbmRzIHRoYXQgdXNlIHRoZW0sIGJ5IHJlY29yZGluZyB0aGF0IHdlCisJIGhhdmUgZW50ZXJlZCBhIHBhcmVuIG5lc3RpbmcgbGV2ZWwgYW5kIHRoZW4gY29udGludWluZy4gIFdlIGNvbXBsYWluCisJIGFib3V0IG11bHRpcGxlIG5lc3RpbmcuICovCisKKyAgICAgIGlmICgqcCA9PSAnKCcpCisJeworCSAgaWYgKCsrcGFyZW5zICE9IDEpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oInBhcmVuIG5lc3RpbmciKSk7CisJICAgIH0KKwkgIHArKzsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSGFuZGxlIHRyYWlsaW5nICcpJyBvbiBvcGVyYW5kcyB0aGF0IHVzZSB0aGVtLCBieSByZWR1Y2luZyB0aGUKKwkgbmVzdGluZyBsZXZlbCBhbmQgdGhlbiBjb250aW51aW5nLiAgV2UgY29tcGxhaW4gaWYgdGhlcmUgd2VyZSB0b28KKwkgbWFueSBjbG9zdXJlcy4gKi8KKworICAgICAgaWYgKCpwID09ICcpJykgCisJeworCSAgLyogUmVjb3JkIHRoYXQgd2UgaGF2ZSBsZWZ0IGEgcGFyZW4gZ3JvdXAgYW5kIGNvbnRpbnVlICovCisJICBpZiAoLS1wYXJlbnMgPCAwKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJtaXNtYXRjaGVkIHBhcmVudGhlc2lzIikpOworCSAgICB9CisJICBwKys7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIEJlZ2luIG9wZXJhbmQgcGFyc2luZyBhdCB0aGUgY3VycmVudCBzY2FuIHBvaW50LiAqLworCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOworICAgICAgZXhwcmVzc2lvbiAoJmV4cFtudW1leHBdKTsKKworICAgICAgaWYgKGV4cFtudW1leHBdLlhfb3AgPT0gT19pbGxlZ2FsKQorCXsKKwkgIGFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOworCX0KKyAgICAgIGVsc2UgaWYgKGV4cFtudW1leHBdLlhfb3AgPT0gT19hYnNlbnQpCisJeworCSAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7CisJfQorCisgICAgICBudW1leHArKzsKKyAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgfQorCisgIGlmIChwYXJlbnMpCisgICAgeworICAgICAgZXhwW251bWV4cF0uWF9vcCA9IE9fYWJzZW50OworICAgICAgZXhwW251bWV4cCsrXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX1BBUkVOUzsKKyAgICB9CisKKyAgLyogTWFyayB0aGUgZW5kIG9mIHRoZSB2YWxpZCBvcGVyYW5kcyB3aXRoIGFuIGlsbGVnYWwgZXhwcmVzc2lvbi4gKi8KKyAgZXhwW251bWV4cF0uWF9vcCA9IE9faWxsZWdhbDsKKworICByZXR1cm4gKG51bWV4cCk7Cit9CisKKy8qIGZpbmRfb3Bjb2RlKCkgZ2V0cyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUgdGhhdAorICAgbWF0Y2hlcyB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgYXNzZW1ibGVkLCBvciByZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBtYXRjaAorICAgaXMgZm91bmQuCisKKyAgIEZpcnN0IGl0IHBhcnNlcyBhbGwgdGhlIG9wZXJhbmRzIGFuZCBzYXZlIHRoZW0gYXMgZXhwcmVzc2lvbnMuICBOb3RlIHRoYXQKKyAgIHdlIHVzZSBPX2Fic2VudCBleHByZXNzaW9ucyB0byByZWNvcmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgIHByZXZpb3VzIG5vbi1PX2Fic2VudCBleHByZXNzaW9uLCBzdWNoIGFzICI6bSIgb3IgIjpzIiBtb2RpZmllcnMgb3IKKyAgIHJlZ2lzdGVyIG51bWJlcnMgZW5jbG9zZWQgaW4gcGFyZW5zIGxpa2UgIihyMTApIi4KKworICAgSXQgdGhlbiBsb29rcyBhdCBhbGwgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHVzZXMgdGhlIG9wZXJhbmRzIHRvCisgICBjaG9vc2UgdGhlIGNvcnJlY3Qgb3Bjb2RlLiAgKi8KKworc3RhdGljIHN0cnVjdCB0aWM4MF9vcGNvZGUgKgorZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpCisgICAgIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKKyAgICAgZXhwcmVzc2lvblMgbXlvcHNbXTsKK3sKKyAgaW50IG51bWV4cDsJCQkJLyogTnVtYmVyIG9mIGV4cHJlc3Npb25zIGZyb20gcGFyc2luZyBvcGVyYW5kcyAqLworICBpbnQgZXhwaTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBleHByZXNzaW9uIHRvIG1hdGNoICovCisgIGludCBvcGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgb3BlcmFuZCB0byBtYXRjaCAqLworICBpbnQgbWF0Y2ggPSAwOwkJCS8qIFNldCB0byAxIHdoZW4gYW4gb3BlcmFuZCBtYXRjaCBpcyBmb3VuZCAqLworICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGMgPSBvcGNvZGU7CS8qIFBvaW50ZXIgdG8gY3VycmVudCBvcGNvZGUgdGFibGUgZW50cnkgKi8KKyAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqZW5kOwkvKiBQb2ludGVyIHRvIGVuZCBvZiBvcGNvZGUgdGFibGUgKi8KKworICAvKiBGaXJzdCBwYXJzZSBhbGwgdGhlIG9wZXJhbmRzIHNvIHdlIG9ubHkgaGF2ZSB0byBkbyBpdCBvbmNlLiAgVGhlcmUgbWF5CisgICAgIGJlIG1vcmUgZXhwcmVzc2lvbnMgZ2VuZXJhdGVkIHRoYW4gdGhlcmUgYXJlIG9wZXJhbmRzLiAqLworCisgIG51bWV4cCA9IGdldF9vcGVyYW5kcyAobXlvcHMpOworCisgIC8qIEZvciBlYWNoIG9wY29kZSB3aXRoIHRoZSBzYW1lIG5hbWUsIHRyeSB0byBtYXRjaCBpdCBhZ2FpbnN0IHRoZSBwYXJzZWQKKyAgICAgb3BlcmFuZHMuICovCisKKyAgZW5kID0gdGljODBfb3Bjb2RlcyArIHRpYzgwX251bV9vcGNvZGVzOworICB3aGlsZSAoIW1hdGNoICYmIChvcGMgPCBlbmQpICYmIChzdHJjbXAgKG9wYyAtPiBuYW1lLCBvcGNvZGUgLT4gbmFtZSkgPT0gMCkpCisgICAgeworICAgICAgLyogU3RhcnQgb2ZmIGFzc3VtaW5nIGEgbWF0Y2guICBJZiB3ZSBmaW5kIGEgbWlzbWF0Y2gsIHRoZW4gdGhpcyBpcworCSByZXNldCBhbmQgdGhlIG9wZXJhbmQvZXhwciBtYXRjaGluZyBsb29wIHRlcm1pbmF0ZXMgd2l0aCBtYXRjaAorCSBlcXVhbCB0byB6ZXJvLCB3aGljaCBhbGxvd3MgdXMgdG8gdHJ5IHRoZSBuZXh0IG9wY29kZS4gKi8KKworICAgICAgbWF0Y2ggPSAxOworCisgICAgICAvKiBGb3IgZWFjaCBleHByZXNzaW9uLCB0cnkgdG8gbWF0Y2ggaXQgYWdhaW5zdCB0aGUgY3VycmVudCBvcGVyYW5kCisJIGZvciB0aGUgY3VycmVudCBvcGNvZGUuICBVcG9uIGFueSBtaXNtYXRjaCwgd2UgYWJhbmRvbiBmdXJ0aGVyCisJIG1hdGNoaW5nIGZvciB0aGUgY3VycmVudCBvcGNvZGUgdGFibGUgZW50cnkuICAqLworCisgICAgICBmb3IgKGV4cGkgPSAwLCBvcGkgPSAtMTsgKGV4cGkgPCBudW1leHApICYmIG1hdGNoOyBleHBpKyspCisJeworCSAgaW50IGJpdHMsIGZsYWdzLCBYX29wLCBudW07CisKKwkgIFhfb3AgPSBteW9wc1tleHBpXS5YX29wOworCSAgbnVtID0gbXlvcHNbZXhwaV0uWF9hZGRfbnVtYmVyOworCisJICAvKiBUaGUgT19hYnNlbnQgZXhwcmVzc2lvbnMgYXBwbHkgdG8gdGhlIHNhbWUgb3BlcmFuZCBhcyB0aGUgbW9zdAorCSAgICAgcmVjZW50IG5vbiBPX2Fic2VudCBleHByZXNzaW9uLiAgU28gb25seSBpbmNyZW1lbnQgdGhlIG9wZXJhbmQKKwkgICAgIGluZGV4IHdoZW4gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBub3Qgb25lIG9mIHRoZXNlIHNwZWNpYWwKKwkgICAgIGV4cHJlc3Npb25zLiAqLworCisJICBpZiAoWF9vcCAhPSBPX2Fic2VudCkKKwkgICAgeworCSAgICAgIG9waSsrOworCSAgICB9CisKKwkgIGZsYWdzID0gdGljODBfb3BlcmFuZHNbb3BjIC0+IG9wZXJhbmRzW29waV1dLmZsYWdzOworCSAgYml0cyA9IHRpYzgwX29wZXJhbmRzW29wYyAtPiBvcGVyYW5kc1tvcGldXS5iaXRzOworCisJICBzd2l0Y2ggKFhfb3ApCisJICAgIHsKKwkgICAgY2FzZSBPX3JlZ2lzdGVyOgorCSAgICAgIC8qIEFsc28gY2hlY2sgdGhhdCByZWdpc3RlcnMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgZXZlbiBhY3R1YWxseQorCQkgYXJlIGV2ZW4uICovCisJICAgICAgaWYgKCgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0dQUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfR1BSKSkgfHwKKwkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0ZQQSkpIHx8CisJCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQ1IpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0NSKSkgfHwKKwkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FVkVOKSAmJiAobnVtICYgMSkpIHx8CisJCSAgY29uc3Rfb3ZlcmZsb3cgKG51bSAmIH5USUM4MF9PUEVSQU5EX01BU0ssIGJpdHMsIGZsYWdzKSkKKwkJeworCQkgIG1hdGNoID0gMDsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE9fY29uc3RhbnQ6CisJICAgICAgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRU5ETUFTSykgJiYgKG51bSA9PSAzMikpCisJCXsKKwkJICAvKiBFbmRtYXNrIHZhbHVlcyBvZiAwIGFuZCAzMiBnaXZlIGlkZW50aWNhbCByZXN1bHRzICovCisJCSAgbnVtID0gMDsKKwkJfQorCSAgICAgIGlmICgoZmxhZ3MgJiAoVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0dQUikpIHx8CisJCSAgY29uc3Rfb3ZlcmZsb3cgKG51bSwgYml0cywgZmxhZ3MpKQorCQl7CisJCSAgbWF0Y2ggPSAwOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT19zeW1ib2w6CisJICAgICAgaWYgKChiaXRzIDwgMzIpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpICYmICF0aWM4MF9yZWxheCkKKwkJeworCQkgIC8qIFRoZSBkZWZhdWx0IGlzIHRvIHByZWZlciB0aGUgc2hvcnQgZm9ybSBvZiBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KKwkJICAgICBUaGlzIGlzIHRoZSBvbmx5IGZvcm0gdGhhdCB0aGUgVEkgYXNzZW1ibGVyIHN1cHBvcnRzLgorCQkgICAgIElmIHRoZSAtcmVsYXggb3B0aW9uIGlzIGdpdmVuLCB3ZSBuZXZlciB1c2UgdGhlIHNob3J0IGZvcm1zLgorCQkgICAgIEZJWE1FOiBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgImJlc3QtZml0Ii4gKi8KKwkJfQorCSAgICAgIGVsc2UgaWYgKChiaXRzID09IDMyKSAvKiAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JBU0VSRUwpICovKQorCQl7CisJCSAgLyogVGhlIGRlZmF1bHQgaXMgdG8gcHJlZmVyIHRoZSBsb25nIGZvcm0gb2YgYmFzZSByZWxhdGl2ZSByZWxvY2F0aW9ucy4KKwkJICAgICBUaGlzIGlzIHRoZSBvbmx5IGZvcm0gdGhhdCB0aGUgVEkgYXNzZW1ibGVyIHN1cHBvcnRzLgorCQkgICAgIElmIHRoZSAtbm8tcmVsYXggb3B0aW9uIGlzIGdpdmVuLCB3ZSBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0gb2YKKwkJICAgICBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KKwkJICAgICBGSVhNRTogU2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlICJiZXN0LWZpdCIuICovCisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBTeW1ib2xzIHRoYXQgZG9uJ3QgbWF0Y2ggb25lIG9mIHRoZSBhYm92ZSBjYXNlcyBhcmUKKwkJICAgICByZWplY3RlZCBhcyBhbiBvcGVyYW5kLiAqLworCQkgIG1hdGNoID0gMDsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE9fYWJzZW50OgorCSAgICAgIC8qIElmIHRoaXMgaXMgYW4gT19hYnNlbnQgZXhwcmVzc2lvbiwgdGhlbiBpdCBtYXkgYmUgYW4gZXhwcmVzc2lvbiB0aGF0CisJCSBzdXBwbGllcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcGVyYW5kLCBzdWNoIGFzICI6bSIgb3IKKwkJICI6cyIgbW9kaWZpZXJzLiBDaGVjayB0byBzZWUgdGhhdCB0aGUgb3BlcmFuZCBtYXRjaGVzIHRoaXMgcmVxdWlyZW1lbnQuICovCisJICAgICAgaWYgKCEoKG51bSAmIFRJQzgwX09QRVJBTkRfTV9TSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX1NJKSB8fAorCQkgICAgKG51bSAmIFRJQzgwX09QRVJBTkRfTV9MSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX0xJKSB8fAorCQkgICAgKG51bSAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkpKQorCQl7CisJCSAgbWF0Y2ggPSAwOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT19iaWc6CisJICAgICAgaWYgKChudW0gPiAwKSB8fCAhKGZsYWdzICYgVElDODBfT1BFUkFORF9GTE9BVCkpCisJCXsKKwkJICBtYXRjaCA9IDA7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBPX2lsbGVnYWw6CisJICAgIGNhc2UgT19zeW1ib2xfcnZhOgorCSAgICBjYXNlIE9fdW1pbnVzOgorCSAgICBjYXNlIE9fYml0X25vdDoKKwkgICAgY2FzZSBPX2xvZ2ljYWxfbm90OgorCSAgICBjYXNlIE9fbXVsdGlwbHk6CisJICAgIGNhc2UgT19kaXZpZGU6CisJICAgIGNhc2UgT19tb2R1bHVzOgorCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoKKwkgICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgorCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKKwkgICAgY2FzZSBPX2JpdF9vcl9ub3Q6CisJICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgorCSAgICBjYXNlIE9fYml0X2FuZDoKKwkgICAgY2FzZSBPX2FkZDoKKwkgICAgY2FzZSBPX3N1YnRyYWN0OgorCSAgICBjYXNlIE9fZXE6CisJICAgIGNhc2UgT19uZToKKwkgICAgY2FzZSBPX2x0OgorCSAgICBjYXNlIE9fbGU6CisJICAgIGNhc2UgT19nZToKKwkgICAgY2FzZSBPX2d0OgorCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6CisJICAgIGNhc2UgT19sb2dpY2FsX29yOgorCSAgICBjYXNlIE9fbWF4OgorCSAgICBkZWZhdWx0OgorCSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBleHByZXNzaW9uIHR5cGUiKSwgWF9vcCk7CisJICAgIH0KKwl9CisgICAgICBpZiAoIW1hdGNoKQorCXsKKwkgIG9wYysrOworCX0KKyAgICB9ICAKKworICByZXR1cm4gKG1hdGNoID8gb3BjIDogTlVMTCk7CisKKyNpZiAwCisKKyAgLyogTm93IHNlYXJjaCB0aGUgb3Bjb2RlIHRhYmxlIHRhYmxlIGZvciBvbmUgd2l0aCBvcGVyYW5kcyB0aGF0CisgICAgIG1hdGNoZXMgd2hhdCB3ZSd2ZSBnb3QuICovCisKKyAgd2hpbGUgKCFtYXRjaCkKKyAgICB7CisgICAgICBtYXRjaCA9IDE7CisgICAgICBmb3IgKGkgPSAwOyBvcGNvZGUgLT4gb3BlcmFuZHNbaV07IGkrKykgCisJeworCSAgaW50IGZsYWdzID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisJICBpbnQgWF9vcCA9IG15b3BzW2ldLlhfb3A7CisJICBpbnQgbnVtID0gbXlvcHNbaV0uWF9hZGRfbnVtYmVyOworCisJICBpZiAoWF9vcCA9PSAwKSAKKwkgICAgeworCSAgICAgIG1hdGNoID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICAgIAorCSAgaWYgKGZsYWdzICYgKFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0NSKSkgCisJICAgIHsKKwkgICAgICBpZiAoKFhfb3AgIT0gT19yZWdpc3RlcikgfHwKKwkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0dQUikpIHx8CisJCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRlBBKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9GUEEpKSB8fAorCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9DUikpKQorCQl7CisJCSAgbWF0Y2g9MDsKKwkJICBicmVhazsKKwkJfQkgIAorCSAgICB9CisJICAgICAgCisJICBpZiAoKChmbGFncyAmIFRJQzgwX09QRVJBTkRfTUlOVVMpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX01JTlVTKSkpIHx8CisJICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfUExVUykgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfUExVUykpKSB8fAorCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0FUTUlOVVMpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX0FUTUlOVVMpKSkgfHwKKwkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9BVFBBUikgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IFRJQzgwX09QRVJBTkRfQVRQQVIpKSkgfHwKKwkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9BVFNJR04pICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX0FUU0lHTikpKSkgCisJICAgIHsKKwkgICAgICBtYXRjaD0wOworCSAgICAgIGJyZWFrOworCSAgICB9CSAgICAgIAorCX0KKyAgICAgIC8qIHdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCisJIGFyZSBubyBtb3JlIHRvIGNoZWNrICovCisgICAgICBpZiAobWF0Y2ggJiYgbXlvcHNbaV0uWF9vcD09MCkgCisJYnJlYWs7CisgICAgICBlbHNlCisJbWF0Y2ggPSAwOworCisgICAgICBuZXh0X29wY29kZSA9IG9wY29kZSsxOworICAgICAgaWYgKG5leHRfb3Bjb2RlLT5vcGNvZGUgPT0gMCkgCisJYnJlYWs7CisgICAgICBpZiAoc3RyY21wKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQorCWJyZWFrOworICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7CisgICAgfQorCisgIGlmICghbWF0Y2gpICAKKyAgICB7CisgICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKworICAvKiBDaGVjayB0aGF0IGFsbCByZWdpc3RlcnMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgZXZlbiBhcmUuICovCisgIC8qIEFsc28sIGlmIGFueSBvcGVyYW5kcyB3ZXJlIG1hcmtlZCBhcyByZWdpc3RlcnMsIGJ1dCB3ZXJlIHJlYWxseSBzeW1ib2xzICovCisgIC8qIGZpeCB0aGF0IGhlcmUuICovCisgIGZvciAoaT0wOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAorICAgIHsKKyAgICAgIGlmICgodGljODBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VWRU4pICYmCisJICAobXlvcHNbaV0uWF9hZGRfbnVtYmVyICYgMSkpIAorCWFzX2ZhdGFsIChfKCJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIikpOworICAgICAgaWYgKG15b3BzW2ldLlhfb3AgPT0gT19yZWdpc3RlcikKKwl7CisJICBpZiAoISh0aWM4MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFncyAmIFRJQzgwX09QRVJBTkRfUkVHKSkgCisJICAgIHsKKwkgICAgICBteW9wc1tpXS5YX29wID0gT19zeW1ib2w7CisJICAgICAgbXlvcHNbaV0uWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNoYXIgKilteW9wc1tpXS5YX29wX3N5bWJvbCk7CisJICAgICAgbXlvcHNbaV0uWF9hZGRfbnVtYmVyID0gMDsKKwkgICAgICBteW9wc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorCisjZW5kaWYKK30KKworLyogYnVpbGRfaW5zbiB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlCisgICBhbmQgdGhlIGFycmF5IG9mIG9wZXJhbmQgZXhwcmVzc2lvbnMgYW5kIHdyaXRlcyBvdXQgdGhlIGluc3RydWN0aW9uLgorCisgICBOb3RlIHRoYXQgdGhlIG9wY29kZSB3b3JkIGFuZCBleHRlbmRlZCB3b3JkIG1heSBiZSB3cml0dGVuIHRvIGRpZmZlcmVudAorICAgZnJhZ3MsIHdpdGggdGhlIG9wY29kZSBhdCB0aGUgZW5kIG9mIG9uZSBmcmFnIGFuZCB0aGUgZXh0ZW5zaW9uIGF0IHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBuZXh0LiAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfaW5zbiAob3Bjb2RlLCBvcGVycykgCisgICAgIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKKyAgICAgZXhwcmVzc2lvblMgKm9wZXJzOworeworICBpbnQgZXhwaTsJCQkJLyogSW5kZXggb2YgY3VycmVudCBleHByZXNzaW9uIHRvIG1hdGNoICovCisgIGludCBvcGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgb3BlcmFuZCB0byBtYXRjaCAqLworICB1bnNpZ25lZCBsb25nIGluc25bMl07CQkvKiBJbnN0cnVjdGlvbiBhbmQgbG9uZyBpbW1lZGlhdGUgKGlmIGFueSkgKi8KKyAgY2hhciAqZjsJCQkJLyogUG9pbnRlciB0byBmcmFnIGxvY2F0aW9uIGZvciBpbnNuWzBdICovCisgIGZyYWdTICpmZnJhZzsJCQkJLyogRnJhZyBjb250YWluaW5nIGxvY2F0aW9uIGYgKi8KKyAgY2hhciAqZnggPSBOVUxMOwkJCS8qIFBvaW50ZXIgdG8gZnJhZyBsb2NhdGlvbiBmb3IgaW5zblsxXSAqLworICBmcmFnUyAqZnhmcmFnOwkJCS8qIEZyYWcgY29udGFpbmluZyBsb2NhdGlvbiBmeCAqLworCisgIC8qIFN0YXJ0IHdpdGggdGhlIHJhdyBvcGNvZGUgYml0cyBmcm9tIHRoZSBvcGNvZGUgdGFibGUuICovCisgIGluc25bMF0gPSBvcGNvZGUgLT4gb3Bjb2RlOworCisgIC8qIFdlIGFyZSBnb2luZyB0byBpbnNlcnQgYXQgbGVhc3Qgb25lIDMyIGJpdCBvcGNvZGUgc28gZ2V0IHRoZQorICAgICBmcmFnIG5vdy4gKi8KKworICBmID0gZnJhZ19tb3JlICg0KTsKKyAgZmZyYWcgPSBmcmFnX25vdzsKKworICAvKiBGb3IgZWFjaCBvcGVyYW5kIGV4cHJlc3Npb24sIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbnRvIHRoZQorICAgICBpbnN0cnVjdGlvbiAuICovCisgIGZvciAoZXhwaSA9IDAsIG9waSA9IC0xOyBvcGVyc1tleHBpXS5YX29wICE9IE9faWxsZWdhbDsgZXhwaSsrKQorICAgIHsKKyAgICAgIGludCBiaXRzLCBzaGlmdCwgZmxhZ3MsIFhfb3AsIG51bTsKKworICAgICAgWF9vcCA9IG9wZXJzW2V4cGldLlhfb3A7CisgICAgICBudW0gPSBvcGVyc1tleHBpXS5YX2FkZF9udW1iZXI7CisKKyAgICAgIC8qIFRoZSBPX2Fic2VudCBleHByZXNzaW9ucyBhcHBseSB0byB0aGUgc2FtZSBvcGVyYW5kIGFzIHRoZSBtb3N0CisJIHJlY2VudCBub24gT19hYnNlbnQgZXhwcmVzc2lvbi4gIFNvIG9ubHkgaW5jcmVtZW50IHRoZSBvcGVyYW5kCisJIGluZGV4IHdoZW4gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBpcyBub3Qgb25lIG9mIHRoZXNlIHNwZWNpYWwKKwkgZXhwcmVzc2lvbnMuICovCisKKyAgICAgIGlmIChYX29wICE9IE9fYWJzZW50KQorCXsKKwkgIG9waSsrOworCX0KKworICAgICAgZmxhZ3MgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uZmxhZ3M7CisgICAgICBiaXRzID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLmJpdHM7CisgICAgICBzaGlmdCA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5zaGlmdDsKKworICAgICAgc3dpdGNoIChYX29wKQorCXsKKwljYXNlIE9fcmVnaXN0ZXI6CisJICBudW0gJj0gflRJQzgwX09QRVJBTkRfTUFTSzsKKwkgIGluc25bMF0gPSBpbnNuWzBdIHwgKG51bSA8PCBzaGlmdCk7CisJICBicmVhazsKKwljYXNlIE9fY29uc3RhbnQ6CisJICBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9FTkRNQVNLKSAmJiAobnVtID09IDMyKSkKKwkgICAgeworCSAgICAgIC8qIEVuZG1hc2sgdmFsdWVzIG9mIDAgYW5kIDMyIGdpdmUgaWRlbnRpY2FsIHJlc3VsdHMgKi8KKwkgICAgICBudW0gPSAwOworCSAgICB9CisJICBlbHNlIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVE5VTSkpCisJICAgIHsKKwkgICAgICAvKiBCSVROVU0gdmFsdWVzIGFyZSBzdG9yZWQgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtICovCisJICAgICAgbnVtID0gKH5udW0gJiAweDFGKTsKKwkgICAgfQorCSAgLyogTWFzayBvZmYgdXBwZXIgYml0cywganVzdCBpdCBjYXNlIGl0IGlzIHNpZ25lZCBhbmQgaXMgbmVnYXRpdmUgKi8KKwkgIGlmIChiaXRzIDwgMzIpCisJICAgIHsKKwkgICAgICBudW0gJj0gKDEgPDwgYml0cykgLSAxOworCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKG51bSA8PCBzaGlmdCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZ4ID0gZnJhZ19tb3JlICg0KTsKKwkgICAgICBmeGZyYWcgPSBmcmFnX25vdzsKKwkgICAgICBpbnNuWzFdID0gbnVtOworCSAgICB9CisJICBicmVhazsKKwljYXNlIE9fc3ltYm9sOgorCSAgaWYgKGJpdHMgPT0gMzIpCisJICAgIHsKKwkgICAgICBmeCA9IGZyYWdfbW9yZSAoNCk7CisJICAgICAgZnhmcmFnID0gZnJhZ19ub3c7CisJICAgICAgaW5zblsxXSA9IDA7CisJICAgICAgaWYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkKKwkJeworCQkgIGZpeF9uZXdfZXhwIChmeGZyYWcsCisJCQkgICAgICAgZnggLSAoZnhmcmFnIC0+IGZyX2xpdGVyYWwpLAorCQkJICAgICAgIDQsCisJCQkgICAgICAgJm9wZXJzW2V4cGldLCAKKwkJCSAgICAgICAxLAorCQkJICAgICAgIFJfTVBQQ1IpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZml4X25ld19leHAgKGZ4ZnJhZywKKwkJCSAgICAgICBmeCAtIChmeGZyYWcgLT4gZnJfbGl0ZXJhbCksCisJCQkgICAgICAgNCwKKwkJCSAgICAgICAmb3BlcnNbZXhwaV0sIAorCQkJICAgICAgIDAsCisJCQkgICAgICAgUl9SRUxMT05HWCk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKQorCSAgICB7CisJICAgICAgZml4X25ld19leHAgKGZmcmFnLAorCQkJICAgZiAtIChmZnJhZyAtPiBmcl9saXRlcmFsKSwKKwkJCSAgIDQsCQkJLyogRklYTUUhIGhvdyBpcyB0aGlzIHVzZWQ/ICovCisJCQkgICAmb3BlcnNbZXhwaV0sCisJCQkgICAxLAorCQkJICAgUl9NUFBDUjE1Vyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludGVybmFsX2Vycm9yIChfKCJzeW1ib2wgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgb3IgMzIgYml0cyIpKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBPX2Fic2VudDoKKwkgIC8qIEVhY2ggT19hYnNlbnQgZXhwcmVzc2lvbiBjYW4gaW5kaWNhdGUgZXhhY3RseSBvbmUgcG9zc2libGUgbW9kaWZpZXIuICovCisJICBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfTV9TSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX1NJKSkKKwkgICAgeworCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKDEgPDwgMTcpOworCSAgICB9CisJICBlbHNlIGlmICgobnVtICYgVElDODBfT1BFUkFORF9NX0xJKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01fTEkpKQorCSAgICB7CisJICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxNSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9TQ0FMRUQpKQorCSAgICB7CisJICAgICAgaW5zblswXSA9IGluc25bMF0gfCAoMSA8PCAxMSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX1BBUkVOUykgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQVJFTlMpKQorCSAgICB7CisJICAgICAgLyogTm8gY29kZSB0byBnZW5lcmF0ZSwganVzdCBhY2NlcHQgYW5kIGRpc2NhcmQgdGhpcyBleHByZXNzaW9uICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBvcGVyYW5kIG1vZGlmaWVyIiksIG9wZXJzW2V4cGldLlhfYWRkX251bWJlcik7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgT19iaWc6CisJICBmeCA9IGZyYWdfbW9yZSAoNCk7CisJICBmeGZyYWcgPSBmcmFnX25vdzsKKwkgIHsKKwkgICAgaW50IHByZWNpc2lvbiA9IDI7CisJICAgIGxvbmcgZXhwb25lbnRfYml0cyA9IDhMOworCSAgICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1syXTsKKwkgICAgLyogVmFsdWUgaXMgc3RpbGwgaW4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgKi8KKwkgICAgZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKTsKKwkgICAgaW5zblsxXSA9ICh3b3Jkc1swXSA8PCAxNikgfCB3b3Jkc1sxXTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgT19pbGxlZ2FsOgorCWNhc2UgT19zeW1ib2xfcnZhOgorCWNhc2UgT191bWludXM6CisJY2FzZSBPX2JpdF9ub3Q6CisJY2FzZSBPX2xvZ2ljYWxfbm90OgorCWNhc2UgT19tdWx0aXBseToKKwljYXNlIE9fZGl2aWRlOgorCWNhc2UgT19tb2R1bHVzOgorCWNhc2UgT19sZWZ0X3NoaWZ0OgorCWNhc2UgT19yaWdodF9zaGlmdDoKKwljYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKKwljYXNlIE9fYml0X29yX25vdDoKKwljYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKKwljYXNlIE9fYml0X2FuZDoKKwljYXNlIE9fYWRkOgorCWNhc2UgT19zdWJ0cmFjdDoKKwljYXNlIE9fZXE6CisJY2FzZSBPX25lOgorCWNhc2UgT19sdDoKKwljYXNlIE9fbGU6CisJY2FzZSBPX2dlOgorCWNhc2UgT19ndDoKKwljYXNlIE9fbG9naWNhbF9hbmQ6CisJY2FzZSBPX2xvZ2ljYWxfb3I6CisJY2FzZSBPX21heDoKKwlkZWZhdWx0OgorCSAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIGV4cHJlc3Npb24iKSwgWF9vcCk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24sIGVpdGhlciA0IG9yIDggYnl0ZXMuICAqLworCisgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zblswXSwgNCk7CisgIGlmIChmeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoZngsIGluc25bMV0sIDQpOworICAgIH0KK30KKworLyogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIEdhcworICAgY2FsbHMgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBpbnB1dCBsaW5lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYQorICAgcHNldWRvb3AuCisKKyAgU1RSIHBvaW50cyB0byBhIE5VTEwgdGVybWluYXRlZCBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMKKyAgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdCB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLiAgKi8KKwordm9pZAorbWRfYXNzZW1ibGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBjaGFyICpzY2FuOworICB1bnNpZ25lZCBjaGFyICppbnB1dF9saW5lX3NhdmU7CisgIHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZTsKKyAgZXhwcmVzc2lvblMgbXlvcHNbMTZdOworICB1bnNpZ25lZCBsb25nIGluc247CisKKyAgLyogRW5zdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZSB0byBhc3NlbWJsZS4gKi8KKyAgYXNzZXJ0IChzdHIpOworCisgIC8qIERyb3AgYW55IGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKyAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQorICAgIHsKKyAgICAgIHN0cisrOworICAgIH0KKworICAvKiBJc29sYXRlIHRoZSBtbmVtb25pYyBmcm9tIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgYnkgZmluZGluZyB0aGUgZmlyc3QKKyAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgYW5kIHphcHBpbmcgaXQgdG8gYSBudWxsIGJ5dGUuICovCisgIGZvciAoc2NhbiA9IHN0cjsgKnNjYW4gIT0gJ1wwMDAnICYmICFpc3NwYWNlICgqc2Nhbik7IHNjYW4rKykgezt9CisgIGlmICgqc2NhbiAhPSAnXDAwMCcpCisgICAgeworICAgICAgKnNjYW4rKyA9ICdcMDAwJzsKKyAgICB9CisKKyAgLyogVHJ5IHRvIGZpbmQgdGhpcyBtbmVtb25pYyBpbiB0aGUgaGFzaCB0YWJsZSAqLworICBpZiAoKG9wY29kZSA9IChzdHJ1Y3QgdGljODBfb3Bjb2RlICopIGhhc2hfZmluZCAodGljODBfaGFzaCwgc3RyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIkludmFsaWQgbW5lbW9uaWM6ICclcyciKSwgc3RyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3RyID0gc2NhbjsKKyAgd2hpbGUgKGlzc3BhY2UgKCpzY2FuKSkKKyAgICB7CisgICAgICBzY2FuKys7CisgICAgfQorCisgIGlucHV0X2xpbmVfc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworCisgIG9wY29kZSA9IGZpbmRfb3Bjb2RlIChvcGNvZGUsIG15b3BzKTsKKyAgaWYgKG9wY29kZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBvcGVyYW5kczogJyVzJyIpLCBpbnB1dF9saW5lX3NhdmUpOworICAgIH0KKworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3NhdmU7CisgIGJ1aWxkX2luc24gKG9wY29kZSwgbXlvcHMpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGF0IHRoZSBzdGFydCBvZiBhc3NlbWJseSwgYWZ0ZXIgdGhlIGNvbW1hbmQKKyAgIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudAorICAgaW5pdGlhbGl6YXRpb25zIGhhdmUgYmVlbiBjb21wbGV0ZWQuCisKKyAgIEl0IHNob3VsZCBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4sIHRoYXQgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHBhcnQgb2YKKyAgIHRoZSBhc3NlbWJsZXIgd2lsbCBuZWVkLiAgKi8KKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgY2hhciAqcHJldl9uYW1lID0gIiI7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wOworICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcF9lbmQ7CisgIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKKyAgZXh0ZXJuIGludCBjb2ZmX2ZsYWdzOwkJCS8qIERlZmluZWQgaW4gb2JqLWNvZmYuYyAqLworCisgIC8qIFNldCBGX0FSMzJXUiBpbiBjb2ZmX2ZsYWdzLCB3aGljaCB3aWxsIGVuZCB1cCBpbiB0aGUgZmlsZSBoZWFkZXIKKyAgICAgZl9mbGFncyBmaWVsZC4gKi8KKworICBjb2ZmX2ZsYWdzIHw9IEZfQVIzMldSOwkvKiBUSWM4MCBpcyAzMiBiaXQgbGl0dGxlIGVuZGlhbiAqLworCisgIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIFRJYzgwIGluc3RydWN0aW9uIHNldAorICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAorICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCisgICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KKworICB0aWM4MF9oYXNoID0gaGFzaF9uZXcgKCk7CisgIG9wX2VuZCA9IHRpYzgwX29wY29kZXMgKyB0aWM4MF9udW1fb3Bjb2RlczsKKyAgZm9yIChvcCA9IHRpYzgwX29wY29kZXM7IG9wIDwgb3BfZW5kOyBvcCsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AgLT4gbmFtZSkgIT0gMCkgCisJeworCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AgLT4gbmFtZTsKKwkgIGhhc2hfaW5zZXJ0ICh0aWM4MF9oYXNoLCBvcCAtPiBuYW1lLCAoY2hhciAqKSBvcCk7CisJfQorICAgIH0KKworICAvKiBJbnNlcnQgdGhlIHByZWRlZmluZWQgc3ltYm9scyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBXZSB1c2Ugc3ltYm9sX2NyZWF0ZQorICAgICByYXRoZXIgdGhhbiBzeW1ib2xfbmV3IHNvIHRoYXQgdGhlc2Ugc3ltYm9scyBkb24ndCBlbmQgdXAgaW4gdGhlIG9iamVjdAorICAgICBmaWxlcycgc3ltYm9sIHRhYmxlLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHByZWRlZmluZWQgc3ltYm9scyBpbmNsdWRlCisgICAgIHNvbWUgdXBwZXIgYml0cyB0aGF0IGRpc3Rpbmd1aXNoIHRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKHJlZ2lzdGVyLCBiaXRudW0sCisgICAgIGNvbmRpdGlvbiBjb2RlLCBldGMpIGFuZCB0aGVzZSBiaXRzIG11c3QgYmUgbWFza2VkIGF3YXkgYmVmb3JlIGFjdHVhbGx5CisgICAgIGluc2VydGluZyB0aGUgdmFsdWVzIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4gIEZvciByZWdpc3RlcnMgd2UgcHV0CisgICAgIHRoZXNlIGJpdHMgaW4gdGhlIHN5bWJvbCB0YWJsZSBzaW5jZSB3ZSB1c2UgdGhlbSBsYXRlciBhbmQgdGhlcmUgaXMgbm8KKyAgICAgcXVlc3Rpb24gdGhhdCB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZSByZWdpc3RlciBudW1iZXIuICBGb3IgY29uc3RhbnRzIHdlCisgICAgIGNhbid0IGRvIHRoYXQgc2luY2UgdGhlIGNvbnN0YW50IGNhbiBiZSBhbnkgdmFsdWUsIHNvIHRoZXkgYXJlIG1hc2tlZCBvZmYKKyAgICAgYmVmb3JlIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICovCisKKyAgcGRzcCA9IE5VTEw7CisgIHdoaWxlICgocGRzcCA9IHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgKHBkc3ApKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNlZ1Qgc2VnbWVudDsKKyAgICAgIHZhbHVlVCB2YWx1OworICAgICAgaW50IHN5bXR5cGU7CisKKyAgICAgIHN5bXR5cGUgPSBQRFNfVkFMVUUgKHBkc3ApICYgVElDODBfT1BFUkFORF9NQVNLOworICAgICAgc3dpdGNoIChzeW10eXBlKQorCXsKKwljYXNlIFRJQzgwX09QRVJBTkRfR1BSOgorCWNhc2UgVElDODBfT1BFUkFORF9GUEE6CisJY2FzZSBUSUM4MF9PUEVSQU5EX0NSOgorCSAgc2VnbWVudCA9IHJlZ19zZWN0aW9uOworCSAgdmFsdSA9IFBEU19WQUxVRSAocGRzcCk7CisJICBicmVhazsKKwljYXNlIFRJQzgwX09QRVJBTkRfQ0M6CisJY2FzZSBUSUM4MF9PUEVSQU5EX0JJVE5VTToKKwkgIHNlZ21lbnQgPSBhYnNvbHV0ZV9zZWN0aW9uOworCSAgdmFsdSA9IFBEU19WQUxVRSAocGRzcCkgJiB+VElDODBfT1BFUkFORF9NQVNLOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBwcmVkZWZpbmVkIHN5bWJvbCBiaXRzIiksIHN5bXR5cGUpOworCSAgYnJlYWs7CisJfQorICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAoUERTX05BTUUgKHBkc3ApLCBzZWdtZW50LCB2YWx1LAorCQkJCQkgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworICAgIH0KK30KKworDAorCisvKiBUaGUgYXNzZW1ibGVyIGFkZHMgbWRfc2hvcnRvcHRzIHRvIHRoZSBzdHJpbmcgcGFzc2VkIHRvIGdldG9wdC4gKi8KKworQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7CisKKy8qIFRoZSBhc3NlbWJsZXIgYWRkcyBtZF9sb25nb3B0cyB0byB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBsb25nIG9wdGlvbnMKKyAgIHRoYXQgYXJlIHBhc3NlZCB0byBnZXRvcHQuICovCisKK3N0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKKworI2RlZmluZSBPUFRJT05fUkVMQVgJKE9QVElPTl9NRF9CQVNFKQorICB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCisKKyNkZWZpbmUgT1BUSU9OX05PX1JFTEFYCShPUFRJT05fUkVMQVggKyAxKQorICB7Im5vLXJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19SRUxBWH0sCisKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKKworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCisvKiBUaGUgbWRfcGFyc2Vfb3B0aW9uIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGdldG9wdCByZXR1cm5zIGFuCisgICB1bnJlY29nbml6ZWQgY29kZSwgcHJlc3VtYWJseSBpbmRpY2F0aW5nIGEgc3BlY2lhbCBjb2RlIHZhbHVlIHdoaWNoCisgICBhcHBlYXJzIGluIG1kX2xvbmdvcHRzIGZvciBtYWNoaW5lIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLiAqLworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgT1BUSU9OX1JFTEFYOgorICAgICAgdGljODBfcmVsYXggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fTk9fUkVMQVg6CisgICAgICB0aWM4MF9yZWxheCA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIHJldHVybiAoMSk7Cit9CisKKy8qIFRoZSBtZF9zaG93X3VzYWdlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgdXNhZ2UgbWVzc2FnZSBpcworICAgcHJpbnRlZC4gIEl0IHNob3VsZCBwcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtYWNoaW5lIHNwZWNpZmljIG9wdGlvbnMKKyAgIGZvdW5kIGluIG1kX2xvbmdvcHRzLiAqLworCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKKyAgZnByaW50ZiAoc3RyZWFtLCAiXAorVEljODAgb3B0aW9uczpcblwKKy1yZWxheAkJCWFsdGVyIFBDIHJlbGF0aXZlIGJyYW5jaCBpbnN0cnVjdGlvbnMgdG8gdXNlIGxvbmcgZm9ybSB3aGVuIG5lZWRlZFxuXAorLW5vLXJlbGF4CQlhbHdheXMgdXNlIHNob3J0IFBDIHJlbGF0aXZlIGJyYW5jaCBpbnN0cnVjdGlvbnMsIGVycm9yIG9uIG92ZXJmbG93XG4iKTsKK30KKworDAorLyogQXR0ZW1wdCB0byBzaW1wbGlmeSBvciBldmVuIGVsaW1pbmF0ZSBhIGZpeHVwLiAgVGhlIHJldHVybiB2YWx1ZSBpcworICAgaWdub3JlZDsgcGVyaGFwcyBpdCB3YXMgb25jZSBtZWFuaW5nZnVsLCBidXQgbm93IGl0IGlzIGhpc3RvcmljYWwuCisgICBUbyBpbmRpY2F0ZSB0aGF0IGEgZml4dXAgaGFzIGJlZW4gZWxpbWluYXRlZCwgc2V0IGZpeFAtPmZ4X2RvbmUuCisgICAqLworCit2b2lkCittZF9hcHBseV9maXggKGZpeFAsIHZhbCkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgbG9uZyB2YWw7Cit7CisgIGNoYXIgKmRlc3QgPSAgZml4UCAtPiBmeF9mcmFnIC0+IGZyX2xpdGVyYWwgKyBmaXhQIC0+IGZ4X3doZXJlOworICBpbnQgb3ZlcmZsb3c7CisKKyAgc3dpdGNoIChmaXhQIC0+IGZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBSX1JFTExPTkdYOgorICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChkZXN0LCAodmFsdWVUKSB2YWwsIDQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX01QUENSOgorICAgICAgdmFsID4+PSAyOworICAgICAgdmFsICs9IDE7CSAgLyogVGFyZ2V0IGFkZHJlc3MgY29tcHV0ZWQgZnJvbSBpbnN0IHN0YXJ0ICovCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfTVBQQ1IxNVc6CisgICAgICBvdmVyZmxvdyA9ICh2YWwgPCAtNjU1MzZMKSB8fCAodmFsID4gNjU1MzJMKTsKKyAgICAgIGlmIChvdmVyZmxvdykKKwl7CisJICBhc19iYWRfd2hlcmUgKGZpeFAgLT4gZnhfZmlsZSwgZml4UCAtPiBmeF9saW5lLAorCQkJXygiUEMgb2Zmc2V0IDB4JWx4IG91dHNpZGUgcmFuZ2UgMHglbHgtMHglbHgiKSwKKwkJCXZhbCwgLTY1NTM2TCwgNjU1MzJMKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdmFsID4+PSAyOworCSAgKmRlc3QrKyA9IHZhbCAmIDB4RkY7CisJICB2YWwgPj49IDg7CisJICAqZGVzdCA9ICgqZGVzdCAmIDB4ODApIHwgKHZhbCAmIDB4N0YpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9BQlM6CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGRlc3QsICh2YWx1ZVQpIHZhbCwgZml4UCAtPiBmeF9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlIGluIGZpeHVwIiksIGZpeFAgLT4gZnhfcl90eXBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworDAorLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KKworLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAorICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4KKworICAgRm9yIHRoZSBUSWM4MCwgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgMzIgYml0IG9wY29kZSBjb250YWluaW5nCisgICB0aGUgUEMgcmVsYXRpdmUgZmllbGQuICovCisKK2xvbmcKK21kX3BjcmVsX2Zyb20gKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHJldHVybiAoZml4UCAtPiBmeF9mcmFnIC0+IGZyX2FkZHJlc3MgKyBmaXhQIC0+IGZ4X3doZXJlKSA7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KKyAqIEluOglBZGRyZXNzIG9mIGZyYWcuCisgKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgorICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCisgKgorICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgorICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgorICovCisKK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7CisgICAgIHNlZ1Qgc2VnOworICAgICBmcmFnUyAqZnJhZ1A7Cit7CisgIGludGVybmFsX2Vycm9yIChfKCJtZF9jb252ZXJ0X2ZyYWcoKSBub3QgaW1wbGVtZW50ZWQgeWV0IikpOworICBhYm9ydCAoKTsKK30KKworDAorLypBUkdTVVNFRCovCit2b2lkCit0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKGlnbm9yZSkKKyAgICAgc3ltYm9sUyAqaWdub3JlOworeworfQorCisjaWYgZGVmaW5lZCBPQkpfQ09GRgorCitzaG9ydAordGNfY29mZl9maXgycnR5cGUgKGZpeFApCisgICAgIGZpeFMgKmZpeFA7Cit7CisgIHJldHVybiAoZml4UCAtPiBmeF9yX3R5cGUpOworfQorCisjZW5kaWYJLyogT0JKX0NPRkYgKi8KKworLyogZW5kIG9mIHRjLXRpYzgwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljODAuaCBiL2dhcy9jb25maWcvdGMtdGljODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZmMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy10aWM4MC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIFRoaXMgZmlsZSBpcyB0Yy10aWM4MC5oCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVENfVElDODAKKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKyNkZWZpbmUgVEFSR0VUX0FSQ0gJYmZkX2FyY2hfdGljODAKKyNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkiY29mZi10aWM4MCIKKyNkZWZpbmUgQkZEX0FSQ0gJVEFSR0VUX0FSQ0gKKworLyogV2UgbmVlZCB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGZpeHVwIHN0cnVjdCB0byBwdXQgdGhlIHJlbG9jYXRpb24gaW4uICovCisKKyNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKKworLyogRGVmaW5lIG1kX251bWJlcl90b19jaGFycyBhcyB0aGUgYXBwcm9wcmlhdGUgc3RhbmRhcmQgYmlnIGVuZGlhbiBvcgorICAgbGl0dGxlIGVuZGlhbiBmdW5jdGlvbi4gIFNob3VsZCB3ZSBzb21lZGF5IHN1cHBvcnQgZW5kaWFubmVzcyBhcyBhCisgICBydW50aW1lIGRlY2lzaW9uLCB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UuICovCisKKyNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KKworLyogRGVmaW5lIGF3YXkgdGhlIGNhbGwgdG8gbWRfb3BlcmFuZCBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzaW5nIGNvZGUuCisgICBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZXhwcmVzc2lvbiBwYXJzZXIgY2FuJ3QgcGFyc2UgdGhlIGlucHV0CisgICBhbmQgZ2l2ZXMgdGhlIGFzc2VtYmxlciBiYWNrZW5kIGEgY2hhbmNlIHRvIGRlYWwgd2l0aCBpdCBpbnN0ZWFkLiAqLworCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKworI2lmZGVmIE9CSl9DT0ZGCisKKy8qIENPRkYgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisjZGVmaW5lIENPRkZfTUFHSUMJVElDODBfQVJDSF9NQUdJQworCisvKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCisKKyNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4cCkgKChmaXhwKSAtPiBmeF9hZGRzeSAhPSBOVUxMKQorCisvKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLworCisjZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCisKK2V4dGVybiBzaG9ydCB0Y19jb2ZmX2ZpeDJydHlwZSAoKTsKKworI2VuZGlmCS8qIE9CSl9DT0ZGICovCisKKy8qIGVuZCBvZiB0Yy10aWM4MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXY4NTAuYyBiL2dhcy9jb25maWcvdGMtdjg1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWIxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXY4NTAuYwpAQCAtMCwwICsxLDI0NzggQEAKKy8qIHRjLXY4NTAuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE5FQyBWODUwCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCisjaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKKworI2RlZmluZSBBUkVBX1pEQSAwCisjZGVmaW5lIEFSRUFfU0RBIDEKKyNkZWZpbmUgQVJFQV9UREEgMgorCisvKiBzaWduLWV4dGVuZCBhIDE2LWJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDE2KHgpCSgoKCh4KSAmIDB4ZmZmZikgXiAofiAweDdmZmYpKSArIDB4ODAwMCkKKworLyogVGVtcG9yYXJpbHkgaG9sZHMgdGhlIHJlbG9jIGluIGEgY29ucyBleHByZXNzaW9uLiAgKi8KK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgaG9sZF9jb25zX3JlbG9jOworCisvKiBTZXQgdG8gVFJVRSBpZiB3ZSB3YW50IHRvIGJlIHBlZGFudGljIGFib3V0IHNpZ25lZCBvdmVyZmxvd3MuICAqLworc3RhdGljIGJvb2xlYW4gd2Fybl9zaWduZWRfb3ZlcmZsb3dzICAgPSBGQUxTRTsKK3N0YXRpYyBib29sZWFuIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzID0gRkFMU0U7CisKKy8qIEluZGljYXRlcyB0aGUgdGFyZ2V0IEJGRCBtYWNoaW5lIG51bWJlci4gICovCitzdGF0aWMgaW50ICAgICBtYWNoaW5lID0gLTE7CisKKy8qIEluZGljYXRlcyB0aGUgdGFyZ2V0IHByb2Nlc3NvcihzKSBmb3IgdGhlIGFzc2VtYmxlLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJcHJvY2Vzc29yX21hc2sgPSAtMTsKKworDAorLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLworc3RydWN0IHJlZ19uYW1lCit7CisgIGNvbnN0IGNoYXIgKiBuYW1lOworICBpbnQgICAgICAgICAgdmFsdWU7Cit9OworCisvKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KKworLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7CisKKy8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KK2NvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOworCisvKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCisgICBzaW5nbGUgbGluZS4gICovCitjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7CisKKy8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKKyAgIHBvaW50IG51bWJlci4gICovCitjb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKKworLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCisgICBhcyBpbiAwZDEuMC4gICovCitjb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKKwwKKworY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Cit7CisgIC8qIENvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKi8KKyAgezB4ZmYsICAgICAtMHgxMDAsICAgIDIsIDF9LAorICB7MHgxZmZmZmYsIC0weDIwMDAwMCwgNiwgMH0sCisgIC8qIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICAqLworICB7MHhmZiwgICAgIC0weDEwMCwgICAgMiwgM30sCisgIHsweDFmZmZmZiwgLTB4MjAwMDAwLCA0LCAwfSwKK307CisKKworc3RhdGljIHNlZ1Qgc2RhdGFfc2VjdGlvbiA9IE5VTEw7CitzdGF0aWMgc2VnVCB0ZGF0YV9zZWN0aW9uID0gTlVMTDsKK3N0YXRpYyBzZWdUIHpkYXRhX3NlY3Rpb24gPSBOVUxMOworc3RhdGljIHNlZ1Qgc2Jzc19zZWN0aW9uID0gTlVMTDsKK3N0YXRpYyBzZWdUIHRic3Nfc2VjdGlvbiA9IE5VTEw7CitzdGF0aWMgc2VnVCB6YnNzX3NlY3Rpb24gPSBOVUxMOworc3RhdGljIHNlZ1Qgcm9zZGF0YV9zZWN0aW9uID0gTlVMTDsKK3N0YXRpYyBzZWdUIHJvemRhdGFfc2VjdGlvbiA9IE5VTEw7CitzdGF0aWMgc2VnVCBzY29tbW9uX3NlY3Rpb24gPSBOVUxMOworc3RhdGljIHNlZ1QgdGNvbW1vbl9zZWN0aW9uID0gTlVMTDsKK3N0YXRpYyBzZWdUIHpjb21tb25fc2VjdGlvbiA9IE5VTEw7CitzdGF0aWMgc2VnVCBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiA9IE5VTEw7CitzdGF0aWMgc2VnVCBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiA9IE5VTEw7CisKKy8qIGZpeHVwcyAqLworI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCitzdHJ1Y3Qgdjg1MF9maXh1cAoreworICBleHByZXNzaW9uUyAgICAgICAgICAgICAgZXhwOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgb3BpbmRleDsKKyAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworfTsKKworc3RydWN0IHY4NTBfZml4dXAgZml4dXBzIFtNQVhfSU5TTl9GSVhVUFNdOworc3RhdGljIGludCBmYzsKKworDAordm9pZAordjg1MF9zZGF0YSAoaW50IGlnbm9yZSkKK3sKKyAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7CisgIAorICBzdWJzZWdfc2V0IChzZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK3Y4NTBfdGRhdGEgKGludCBpZ25vcmUpCit7CisgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworICAKKyAgc3Vic2VnX3NldCAodGRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKyAgCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK3Y4NTBfemRhdGEgKGludCBpZ25vcmUpCit7CisgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworICAKKyAgc3Vic2VnX3NldCAoemRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKyAgCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK3Y4NTBfc2JzcyAoaW50IGlnbm9yZSkKK3sKKyAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7CisgIAorICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIAorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkCit2ODUwX3Ric3MgKGludCBpZ25vcmUpCit7CisgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworICAKKyAgc3Vic2VnX3NldCAodGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworICAKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwordm9pZAordjg1MF96YnNzIChpbnQgaWdub3JlKQoreworICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKKyAgCisgIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKyAgCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK3Y4NTBfcm9zZGF0YSAoaW50IGlnbm9yZSkKK3sKKyAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7CisgIAorICBzdWJzZWdfc2V0IChyb3NkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIAorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkCit2ODUwX3JvemRhdGEgKGludCBpZ25vcmUpCit7CisgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworICAKKyAgc3Vic2VnX3NldCAocm96ZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOworICAKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwordm9pZAordjg1MF9jYWxsX3RhYmxlX2RhdGEgKGludCBpZ25vcmUpCit7CisgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworICAKKyAgc3Vic2VnX3NldCAoY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7CisgIAorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkCit2ODUwX2NhbGxfdGFibGVfdGV4dCAoaW50IGlnbm9yZSkKK3sKKyAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7CisgIAorICBzdWJzZWdfc2V0IChjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKKyAgCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3ZvaWQKK3Y4NTBfYnNzIChpbnQgaWdub3JlKQoreworICByZWdpc3RlciBpbnQgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworICAKKyAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKKyAgIAorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkCit2ODUwX29mZnNldCAoaW50IGlnbm9yZSkKK3sKKyAgaW50IHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgCisgIHRlbXAgLT0gZnJhZ19ub3dfZml4KCk7CisgIAorICBpZiAodGVtcCA+IDApCisgICAgKHZvaWQpIGZyYWdfbW9yZSAodGVtcCk7CisgIAorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBDb3BpZWQgZnJvbSBvYmpfZWxmX2NvbW1vbigpIGluIGdhcy9jb25maWcvb2JqLWVsZi5jICovCitzdGF0aWMgdm9pZAordjg1MF9jb21tIChhcmVhKQorICAgICBpbnQgYXJlYTsKK3sKKyAgY2hhciAqICAgIG5hbWU7CisgIGNoYXIgICAgICBjOworICBjaGFyICogICAgcDsKKyAgaW50ICAgICAgIHRlbXA7CisgIGludCAgICAgICBzaXplOworICBzeW1ib2xTICogc3ltYm9sUDsKKyAgaW50ICAgICAgIGhhdmVfYWxpZ247CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAKKyAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCisgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICpwID0gYzsKKyAgCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CQkvKiBza2lwICcsJyAqLworICAKKyAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8IDAhIElnbm9yZWQuIiksIHRlbXApOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBzaXplID0gdGVtcDsKKyAgKnAgPSAwOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICpwID0gYzsKKyAgCisgIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCisgICAgeworICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQorCXsKKwkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKKwkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOworCX0KKyAgICB9CisgIAorICBrbm93IChzeW1ib2xQLT5zeV9mcmFnID09ICYgemVyb19hZGRyZXNzX2ZyYWcpOworICAKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIGhhdmVfYWxpZ24gPSAwOworICBlbHNlCisgICAgeworICAgICAgaGF2ZV9hbGlnbiA9IDE7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICB9CisgIAorICBpZiAoISBoYXZlX2FsaWduIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQorICAgIHsKKyAgICAgIGlmICghIGhhdmVfYWxpZ24pCisJdGVtcCA9IDA7CisgICAgICBlbHNlCisJeworCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCSAgCisJICBpZiAodGVtcCA8IDApCisJICAgIHsKKwkgICAgICB0ZW1wID0gMDsKKwkgICAgICBhc193YXJuIChfKCJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiKSk7CisJICAgIH0KKwl9CisgICAgICAKKyAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKKwl7CisJICBzZWdUICAgb2xkX3NlYzsKKwkgIGludCAgICBvbGRfc3Vic2VjOworCSAgY2hhciAqIHBmcmFnOworCSAgaW50ICAgIGFsaWduOworCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKKworCSAgb2xkX3NlYyA9IG5vd19zZWc7CisJICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKKyAgICAgIAorCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7CisJCSAgCisJICBhcHBsaWNhYmxlICY9IFNFQ19BTExPQzsKKwkgIAorCSAgc3dpdGNoIChhcmVhKQorCSAgICB7CisJICAgIGNhc2UgQVJFQV9TREE6CisJICAgICAgaWYgKHNic3Nfc2VjdGlvbiA9PSBOVUxMKQorCQl7CisJCSAgc2Jzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMCk7CisJICAgICAgCisJCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7CisJICAgICAgCisJCSAgc2VnX2luZm8gKHNic3Nfc2VjdGlvbiktPmJzcyA9IDE7CisJCX0KKwkgICAgICBicmVhazsKKwkgIAorCSAgICBjYXNlIEFSRUFfWkRBOgorCSAgICAgIGlmICh6YnNzX3NlY3Rpb24gPT0gTlVMTCkKKwkJeworCQkgIHpic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuemJzcyIsIDApOworCQkgIAorCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOworCSAgICAgIAorCQkgIHNlZ19pbmZvICh6YnNzX3NlY3Rpb24pLT5ic3MgPSAxOworCQl9CisJICAgICAgYnJlYWs7CisJICAKKwkgICAgY2FzZSBBUkVBX1REQToKKwkgICAgICBpZiAodGJzc19zZWN0aW9uID09IE5VTEwpCisJCXsKKwkJICB0YnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRic3MiLCAwKTsKKwkJICAKKwkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGJzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKKwkJICAKKwkJICBzZWdfaW5mbyAodGJzc19zZWN0aW9uKS0+YnNzID0gMTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmICh0ZW1wKQorCSAgICB7CisJICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCisJICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbikKKwkJOworCSAgICAgIAorCSAgICAgIGlmICh0ZW1wICE9IDEpCisJCXsKKwkJICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKKwkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCQkgIHJldHVybjsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIGFsaWduID0gMDsKKwkgIAorCSAgc3dpdGNoIChhcmVhKQorCSAgICB7CisJICAgIGNhc2UgQVJFQV9TREE6CisJICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2Jzc19zZWN0aW9uLCBhbGlnbik7CisJICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7CisJICAgICAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAwKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEFSRUFfWkRBOgorCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHpic3Nfc2VjdGlvbiwgYWxpZ24pOworCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOworCSAgICAgIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgMCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBUkVBX1REQToKKwkgICAgICByZWNvcmRfYWxpZ25tZW50ICh0YnNzX3NlY3Rpb24sIGFsaWduKTsKKwkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKKwkgICAgICBzdWJzZWdfc2V0ICh0YnNzX3NlY3Rpb24sIDApOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQoKTsKKwkgICAgfQorCSAgCisJICBpZiAoYWxpZ24pCisJICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKKworCSAgc3dpdGNoIChhcmVhKQorCSAgICB7CisJICAgIGNhc2UgQVJFQV9TREE6CisJICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHNic3Nfc2VjdGlvbikKKwkJc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gMDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEFSRUFfWkRBOgorCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB6YnNzX3NlY3Rpb24pCisJCXN5bWJvbFAtPnN5X2ZyYWctPmZyX3N5bWJvbCA9IDA7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBUkVBX1REQToKKwkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdGJzc19zZWN0aW9uKQorCQlzeW1ib2xQLT5zeV9mcmFnLT5mcl9zeW1ib2wgPSAwOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQoKTsKKwkgICAgfQorCSAgCisJICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7CisJICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCisJCQkgICAgKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOworCSAgKnBmcmFnID0gMDsKKwkgIFNfU0VUX1NJWkUgKHN5bWJvbFAsIHNpemUpOworCSAgCisJICBzd2l0Y2ggKGFyZWEpCisJICAgIHsKKwkgICAgY2FzZSBBUkVBX1NEQToKKwkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzYnNzX3NlY3Rpb24pOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEFSRUFfWkRBOgorCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHpic3Nfc2VjdGlvbik7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQVJFQV9UREE6CisJICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgdGJzc19zZWN0aW9uKTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCgpOworCSAgICB9CisJICAgIAorCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7CisJICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKKwkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJYWxsb2NhdGVfY29tbW9uOgorCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOworCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOworCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOworCSAgCisJICBzd2l0Y2ggKGFyZWEpCisJICAgIHsKKwkgICAgY2FzZSBBUkVBX1NEQToKKwkgICAgICBpZiAoc2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCisJCXsKKwkJICBmbGFnd29yZAlhcHBsaWNhYmxlOworCQkgIAorCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOworCQkgIAorCQkgIHNjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuc2NvbW1vbiIsIDApOworCQkgIAorCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzY29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKKwkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCisJCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7CisJCX0KKwkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzY29tbW9uX3NlY3Rpb24pOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEFSRUFfWkRBOgorCSAgICAgIGlmICh6Y29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKKwkJeworCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7CisJCSAgCisJCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7CisJCSAgCisJCSAgemNvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi56Y29tbW9uIiwgMCk7CisJCSAgCisJCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHpjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQorCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKKwkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKKwkJfQorCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHpjb21tb25fc2VjdGlvbik7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQVJFQV9UREE6CisJICAgICAgaWYgKHRjb21tb25fc2VjdGlvbiA9PSBOVUxMKQorCQl7CisJCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKKwkJICAKKwkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKKwkJICAKKwkJICB0Y29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRjb21tb24iLCAwKTsKKwkJICAKKwkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGNvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCisJCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQorCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOworCQl9CisJICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgdGNvbW1vbl9zZWN0aW9uKTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCgpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQorCWlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KKyAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCisJICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKKwl7CisJICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKKwkgICAgOworCSAgaW5wdXRfbGluZV9wb2ludGVyLS07CisJICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKKwl9CisgICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKKwk7CisgICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKKyAgICB9CisKKyAgc3ltYm9sUC0+YnN5bS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICByZXR1cm47CisKKyAgeworICBiYWRfY29tbW9uX3NlZ21lbnQ6CisgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJ1xuJykKKyAgICAgIHArKzsKKyAgICBjID0gKnA7CisgICAgKnAgPSAnXDAnOworICAgIGFzX2JhZCAoXygiYmFkIC5jb21tb24gc2VnbWVudCAlcyIpLCBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKKyAgICAqcCA9IGM7CisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKKyAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkCitzZXRfbWFjaGluZSAoaW50IG51bWJlcikKK3sKKyAgbWFjaGluZSA9IG51bWJlcjsKKyAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2hpbmUpOworCisgIHN3aXRjaCAobWFjaGluZSkKKyAgICB7CisgICAgY2FzZSAwOiBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwOyBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEU7IGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7IGJyZWFrOworICAgIH0KK30KKworLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJzZGF0YSIsICAgdjg1MF9zZGF0YSwgICAwfSwKKyAgeyJ0ZGF0YSIsICAgdjg1MF90ZGF0YSwgICAwfSwKKyAgeyJ6ZGF0YSIsICAgdjg1MF96ZGF0YSwgICAwfSwKKyAgeyJzYnNzIiwgICAgdjg1MF9zYnNzLCAgICAwfSwKKyAgeyJ0YnNzIiwgICAgdjg1MF90YnNzLCAgICAwfSwKKyAgeyJ6YnNzIiwgICAgdjg1MF96YnNzLCAgICAwfSwKKyAgeyJyb3NkYXRhIiwgdjg1MF9yb3NkYXRhLCAwfSwKKyAgeyJyb3pkYXRhIiwgdjg1MF9yb3pkYXRhLCAwfSwKKyAgeyJic3MiLCAgICAgdjg1MF9ic3MsICAgICAwfSwKKyAgeyJvZmZzZXQiLCAgdjg1MF9vZmZzZXQsICAwfSwKKyAgeyJ3b3JkIiwgICAgY29ucywgICAgICAgICA0fSwKKyAgeyJ6Y29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1pEQX0sCisgIHsic2NvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9TREF9LAorICB7InRjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfVERBfSwKKyAgeyJ2ODUwIiwgICAgc2V0X21hY2hpbmUsICAwfSwKKyAgeyJjYWxsX3RhYmxlX2RhdGEiLCB2ODUwX2NhbGxfdGFibGVfZGF0YSwgMH0sCisgIHsiY2FsbF90YWJsZV90ZXh0Iiwgdjg1MF9jYWxsX3RhYmxlX3RleHQsIDB9LAorICB7InY4NTBlIiwgICAgICAgICAgIHNldF9tYWNoaW5lLCAgICAgICAgICBiZmRfbWFjaF92ODUwZX0sCisgIHsidjg1MGVhIiwgICAgICAgICAgc2V0X21hY2hpbmUsICAgICAgICAgIGJmZF9tYWNoX3Y4NTBlYX0sCisgIHsgTlVMTCwgICAgIE5VTEwsICAgICAgICAgMH0KK307CisKKy8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp2ODUwX2hhc2g7CisKKy8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQoreworICB7ICJlcCIsICAzMCB9LAkJLyogZXAgLSBlbGVtZW50IHB0ciAqLworICB7ICJncCIsICAgNCB9LAkJLyogZ3AgLSBnbG9iYWwgcHRyICovCisgIHsgImhwIiwgICAyIH0sCQkvKiBocCAtIGhhbmRsZXIgc3RhY2sgcHRyICovCisgIHsgImxwIiwgIDMxIH0sCQkvKiBscCAtIGxpbmsgcHRyICovCisgIHsgInIwIiwgICAwIH0sCisgIHsgInIxIiwgICAxIH0sCisgIHsgInIxMCIsIDEwIH0sCisgIHsgInIxMSIsIDExIH0sCisgIHsgInIxMiIsIDEyIH0sCisgIHsgInIxMyIsIDEzIH0sCisgIHsgInIxNCIsIDE0IH0sCisgIHsgInIxNSIsIDE1IH0sCisgIHsgInIxNiIsIDE2IH0sCisgIHsgInIxNyIsIDE3IH0sCisgIHsgInIxOCIsIDE4IH0sCisgIHsgInIxOSIsIDE5IH0sCisgIHsgInIyIiwgICAyIH0sCisgIHsgInIyMCIsIDIwIH0sCisgIHsgInIyMSIsIDIxIH0sCisgIHsgInIyMiIsIDIyIH0sCisgIHsgInIyMyIsIDIzIH0sCisgIHsgInIyNCIsIDI0IH0sCisgIHsgInIyNSIsIDI1IH0sCisgIHsgInIyNiIsIDI2IH0sCisgIHsgInIyNyIsIDI3IH0sCisgIHsgInIyOCIsIDI4IH0sCisgIHsgInIyOSIsIDI5IH0sCisgIHsgInIzIiwgICAzIH0sCisgIHsgInIzMCIsIDMwIH0sCisgIHsgInIzMSIsIDMxIH0sCisgIHsgInI0IiwgICA0IH0sCisgIHsgInI1IiwgICA1IH0sCisgIHsgInI2IiwgICA2IH0sCisgIHsgInI3IiwgICA3IH0sCisgIHsgInI4IiwgICA4IH0sCisgIHsgInI5IiwgICA5IH0sCisgIHsgInNwIiwgICAzIH0sCQkvKiBzcCAtIHN0YWNrIHB0ciAqLworICB7ICJ0cCIsICAgNSB9LAkJLyogdHAgLSB0ZXh0IHB0ciAqLworICB7ICJ6ZXJvIiwgMCB9LAorfTsKKyNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YgKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBzeXN0ZW1fcmVnaXN0ZXJzW10gPSAKK3sKKyAgeyAiY3RicCIsICAyMCB9LAorICB7ICJjdHBjIiwgIDE2IH0sCisgIHsgImN0cHN3IiwgMTcgfSwKKyAgeyAiZGJwYyIsICAxOCB9LAorICB7ICJkYnBzdyIsIDE5IH0sCisgIHsgImVjciIsICAgIDQgfSwKKyAgeyAiZWlwYyIsICAgMCB9LAorICB7ICJlaXBzdyIsICAxIH0sCisgIHsgImZlcGMiLCAgIDIgfSwKKyAgeyAiZmVwc3ciLCAgMyB9LAorICB7ICJwc3ciLCAgICA1IH0sCit9OworI2RlZmluZSBTWVNSRUdfTkFNRV9DTlQJKHNpemVvZiAoc3lzdGVtX3JlZ2lzdGVycykgLyBzaXplb2YgKHN0cnVjdCByZWdfbmFtZSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgc3lzdGVtX2xpc3RfcmVnaXN0ZXJzW10gPQoreworICB7IlBTIiwgICAgICA1IH0sCisgIHsiU1IiLCAgICAgIDAgKyAxfQorfTsKKyNkZWZpbmUgU1lTUkVHTElTVF9OQU1FX0NOVAkoc2l6ZW9mIChzeXN0ZW1fbGlzdF9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGNjX25hbWVzW10gPQoreworICB7ICJjIiwgIDB4MSB9LAorICB7ICJlIiwgIDB4MiB9LAorICB7ICJnZSIsIDB4ZSB9LAorICB7ICJndCIsIDB4ZiB9LAorICB7ICJoIiwgIDB4YiB9LAorICB7ICJsIiwgIDB4MSB9LAorICB7ICJsZSIsIDB4NyB9LAorICB7ICJsdCIsIDB4NiB9LAorICB7ICJuIiwgIDB4NCB9LAorICB7ICJuYyIsIDB4OSB9LAorICB7ICJuZSIsIDB4YSB9LAorICB7ICJuaCIsIDB4MyB9LAorICB7ICJubCIsIDB4OSB9LAorICB7ICJucyIsIDB4YyB9LAorICB7ICJudiIsIDB4OCB9LAorICB7ICJueiIsIDB4YSB9LAorICB7ICJwIiwgIDB4YyB9LAorICB7ICJzIiwgIDB4NCB9LAorICB7ICJzYSIsIDB4ZCB9LAorICB7ICJ0IiwgIDB4NSB9LAorICB7ICJ2IiwgIDB4MCB9LAorICB7ICJ6IiwgIDB4MiB9LAorfTsKKyNkZWZpbmUgQ0NfTkFNRV9DTlQJKHNpemVvZiAoY2NfbmFtZXMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQorCisvKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIHRhYmxlCisgICB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKKyAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLworCitzdGF0aWMgaW50CityZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lLCBhY2NlcHRfbnVtYmVycykKKyAgICAgY29uc3Qgc3RydWN0IHJlZ19uYW1lICogcmVnczsKKyAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVnY291bnQ7CisgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgIG5hbWU7CisgICAgIGJvb2xlYW4gICAgICAgICAgICAgICAgIGFjY2VwdF9udW1iZXJzOworeworICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7CisgIGludCBjbXA7CisgIHN5bWJvbFMgKiBzeW1ib2xQOworCisgIC8qIElmIHRoZSByZWdpc3RlciBuYW1lIGlzIGEgc3ltYm9sLCB0aGVuIGV2YWx1YXRlIGl0LiAgKi8KKyAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBzeW1ib2wgaXMgYW4gYWxpYXMgZm9yIGFub3RoZXIgbmFtZSB0aGVuIHVzZSB0aGF0LgorCSBJZiB0aGUgc3ltYm9sIGlzIGFuIGFsaWFzIGZvciBhIG51bWJlciwgdGhlbiByZXR1cm4gdGhlIG51bWJlci4gICovCisgICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCkKKwl7CisJICBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKTsKKwl9CisgICAgICBlbHNlIGlmIChhY2NlcHRfbnVtYmVycykKKwl7CisJICBpbnQgcmVnID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOworCSAgCisJICBpZiAocmVnID49IDAgJiYgcmVnIDw9IDMxKQorCSAgICByZXR1cm4gcmVnOworCX0KKworICAgICAgLyogT3RoZXJ3aXNlIGRyb3AgdGhyb3VnaCBhbmQgdHJ5IHBhcnNpbmcgbmFtZSBub3JtYWxseS4gICovCisgICAgfQorICAKKyAgbG93ID0gMDsKKyAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKKworICBkbworICAgIHsKKyAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7CisgICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7CisgICAgICBpZiAoY21wIDwgMCkKKwloaWdoID0gbWlkZGxlIC0gMTsKKyAgICAgIGVsc2UgaWYgKGNtcCA+IDApCisJbG93ID0gbWlkZGxlICsgMTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOworICAgIH0KKyAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKKyAgcmV0dXJuIC0xOworfQorCisKKy8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgorICoKKyAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCisgKgorICogb3V0OiBBIGV4cHJlc3Npb25TLgorICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKKyAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgorICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KKyAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAqLworc3RhdGljIGJvb2xlYW4KK3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOworeworICBpbnQgICAgcmVnX251bWJlcjsKKyAgY2hhciAqIG5hbWU7CisgIGNoYXIgKiBzdGFydDsKKyAgY2hhciAgIGM7CisKKyAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KKyAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMsIFJFR19OQU1FX0NOVCwKKwkJCQluYW1lLCBGQUxTRSk7CisKKyAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCisgIAorICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLworICBpZiAocmVnX251bWJlciA+PSAwKSAKKyAgICB7CisgICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19yZWdpc3RlcjsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOworCisgICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOworICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7CisgICAgICAKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CisgICAgICAKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFN1bW1hcnkgb2Ygc3lzdGVtX3JlZ2lzdGVyX25hbWUoKS4KKyAqCisgKiBpbjogIElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KKyAqICAgICAgZXhwcmVzc2lvblAgcG9pbnRzIHRvIGFuIGV4cHJlc3Npb24gc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbi4KKyAqICAgICAgYWNjZXB0X251bWJlcnMgaXMgdHJ1ZSBpZmYgbnVtZXJpY2FsIHJlZ2lzdGVyIG5hbWVzIG1heSBiZSB1c2VkLgorICogICAgICBhY2NlcHRfbGlzdF9uYW1lcyBpcyB0cnVlIGlmZiB0aGUgc3BlY2lhbCBuYW1lcyBQUyBhbmQgU1IgbWF5IGJlIAorICogICAgICBhY2NlcHRlZC4KKyAqCisgKiBvdXQ6IEEgZXhwcmVzc2lvblMgc3RydWN0dXJlIGluIGV4cHJlc3Npb25QLgorICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKKyAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgorICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KKyAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAqLworc3RhdGljIGJvb2xlYW4KK3N5c3RlbV9yZWdpc3Rlcl9uYW1lIChleHByZXNzaW9uUCwgYWNjZXB0X251bWJlcnMsIGFjY2VwdF9saXN0X25hbWVzKQorICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOworICAgICBib29sZWFuICAgICAgIGFjY2VwdF9udW1iZXJzOworICAgICBib29sZWFuICAgICAgIGFjY2VwdF9saXN0X25hbWVzOworeworICBpbnQgICAgcmVnX251bWJlcjsKKyAgY2hhciAqIG5hbWU7CisgIGNoYXIgKiBzdGFydDsKKyAgY2hhciAgIGM7CisKKyAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KKyAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoc3lzdGVtX3JlZ2lzdGVycywgU1lTUkVHX05BTUVfQ05ULCBuYW1lLAorCQkJCWFjY2VwdF9udW1iZXJzKTsKKworICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworICAKKyAgaWYgKHJlZ19udW1iZXIgPCAwCisgICAgICAmJiBhY2NlcHRfbnVtYmVycykKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgICA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KKworICAgICAgaWYgKGlzZGlnaXQgKCogaW5wdXRfbGluZV9wb2ludGVyKSkKKwl7CisJICByZWdfbnVtYmVyID0gc3RydG9sIChpbnB1dF9saW5lX3BvaW50ZXIsICYgaW5wdXRfbGluZV9wb2ludGVyLCAxMCk7CisKKwkgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdpc3RlciBudW1iZXIgaXMgYWxsb3dhYmxlLiAqLworCSAgaWYgKCAgIHJlZ19udW1iZXIgPCAwCisJCSB8fCByZWdfbnVtYmVyID4gNQorCQkgJiYgcmVnX251bWJlciA8IDE2CisJCSB8fCByZWdfbnVtYmVyID4gMjAKKwkJICkKKwkgICAgeworCSAgICAgIHJlZ19udW1iZXIgPSAtMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGFjY2VwdF9saXN0X25hbWVzKQorCXsKKwkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKwkgIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHN5c3RlbV9saXN0X3JlZ2lzdGVycywKKwkJCQkJU1lTUkVHTElTVF9OQU1FX0NOVCwgbmFtZSwgRkFMU0UpOworCisJICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLworCX0KKyAgICB9CisgIAorICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLworICBpZiAocmVnX251bWJlciA+PSAwKSAKKyAgICB7CisgICAgICBleHByZXNzaW9uUC0+WF9vcCAgICAgICAgID0gT19yZWdpc3RlcjsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOworCisgICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOworICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sICA9IE5VTEw7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CisgICAgICAKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFN1bW1hcnkgb2YgY2NfbmFtZSgpLgorICoKKyAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCisgKgorICogb3V0OiBBIGV4cHJlc3Npb25TLgorICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKKyAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgorICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KKyAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAqLworc3RhdGljIGJvb2xlYW4KK2NjX25hbWUgKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOworeworICBpbnQgICAgcmVnX251bWJlcjsKKyAgY2hhciAqIG5hbWU7CisgIGNoYXIgKiBzdGFydDsKKyAgY2hhciAgIGM7CisKKyAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KKyAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoY2NfbmFtZXMsIENDX05BTUVfQ05ULCBuYW1lLCBGQUxTRSk7CisKKyAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KKyAgCisgIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCisgIGlmIChyZWdfbnVtYmVyID49IDApIAorICAgIHsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX2NvbnN0YW50OworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7CisKKyAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7CisgICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKKyAgICAgIAorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NraXBfd2hpdGVfc3BhY2UgKHZvaWQpCit7CisgIHdoaWxlICggICAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcKKwkgfHwgKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKKyAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Cit9CisKKy8qIFN1bW1hcnkgb2YgcGFyc2VfcmVnaXN0ZXJfbGlzdCAoKS4KKyAqCisgKiBpbjogSW5wdXRfbGluZV9wb2ludGVyICBwb2ludHMgdG8gMXN0IGNoYXIgb2YgYSBsaXN0IG9mIHJlZ2lzdGVycy4KKyAqICAgICBpbnNuICAgICAgICAgICAgICAgIGlzIHRoZSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQgaW5zdHJ1Y3Rpb24uCisgKiAgICAgb3BlcmFuZCAgICAgICAgICAgICBpcyB0aGUgb3BlcmFuZCBiZWluZyBpbnNlcnRlZC4KKyAqCisgKiBvdXQ6IE5VTEwgaWYgdGhlIHBhcnNlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSBhCisgKiAgICAgIHBvaW50ZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZC4gIElmIHRoZSBwYXJzZQorICogICAgICBjb21wbGV0ZXMgdGhlIGNvcnJlY3QgYml0IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAqICAgICAgd2lsbCBiZSBmaWxsZWQgaW4uCisgKgorICogUGFyc2VzIHJlZ2lzdGVyIGxpc3RzIHdpdGggdGhlIHN5bnRheDoKKyAqCisgKiAgIHsgclggfQorICogICB7IHJYLCByWSB9CisgKiAgIHsgclggLSByWSB9CisgKiAgIHsgclggLSByWSwgclogfQorICogICBldGMKKyAqCisgKiBhbmQgYWxzbyBwYXJzZXMgY29uc3RhbnQgZXB4cmVzc2lvbnMgd2hvZXMgYml0cyBpbmRpY2F0ZSB0aGUKKyAqIHJlZ2lzdGVycyBpbiB0aGUgbGlzdHMuICBUaGUgTFNCIGluIHRoZSBleHByZXNzaW9uIHJlZmVycyB0bworICogdGhlIGxvd2VzdCBudW1iZXJlZCBwZXJtaXNzYWJsZSByZWdpc3RlciBpbiB0aGUgcmVnaXN0ZXIgbGlzdCwKKyAqIGFuZCBzbyBvbiB1cHdhcmRzLiAgU3lzdGVtIHJlZ2lzdGVycyBhcmUgY29uc2lkZXJlZCB0byBiZSB2ZXJ5CisgKiBoaWdoIG51bWJlcnMuCisgKiAKKyAqLworc3RhdGljIGNoYXIgKgorcGFyc2VfcmVnaXN0ZXJfbGlzdAorKAorICB1bnNpZ25lZCBsb25nICogICAgICAgICAgICAgaW5zbiwKKyAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQKKykKK3sKKyAgc3RhdGljIGludCAgdHlwZTFfcmVnc1sgMzIgXSA9IHsgMzAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKKyAgc3RhdGljIGludCAgdHlwZTJfcmVnc1sgMzIgXSA9IHsgMTksIDE4LCAxNywgMTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKKyAgc3RhdGljIGludCAgdHlwZTNfcmVnc1sgMzIgXSA9IHsgIDMsICAyLCAgMSwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE0LCAxNSwgMTMsIDEyLCAgNywgIDYsICA1LCAgNCwgMTEsIDEwLCAgOSwgIDggfTsKKyAgaW50ICogICAgICAgcmVnczsKKyAgZXhwcmVzc2lvblMgZXhwOworCisKKyAgLyogU2VsZWN0IGEgcmVnaXN0ZXIgYXJyYXkgdG8gcGFyc2UuICovCisgIHN3aXRjaCAob3BlcmFuZC0+c2hpZnQpCisgICAgeworICAgIGNhc2UgMHhmZmUwMDAwMTogcmVncyA9IHR5cGUxX3JlZ3M7IGJyZWFrOworICAgIGNhc2UgMHhmZmY4MDAwZjogcmVncyA9IHR5cGUyX3JlZ3M7IGJyZWFrOworICAgIGNhc2UgMHhmZmY4MDAxZjogcmVncyA9IHR5cGUzX3JlZ3M7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc19iYWQgKF8oInVua25vd24gb3BlcmFuZCBzaGlmdDogJXhcbiIpLCBvcGVyYW5kLT5zaGlmdCk7CisgICAgICByZXR1cm4gXygiaW50ZXJuYWwgZmFpbHVyZSBpbiBwYXJzZV9yZWdpc3Rlcl9saXN0Iik7CisgICAgfQorCisgIHNraXBfd2hpdGVfc3BhY2UgKCk7CisKKyAgLyogSWYgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggYSBjdXJseSBicmFjZSBpdCBpcyBhIHJlZ2lzdGVyIGxpc3QuCisgICAgIE90aGVyd2lzZSBpdCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHdob2VzIGJpdHMgaW5kaWNhdGUgd2hpY2gKKyAgICAgcmVnaXN0ZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4gICovCisgIAorICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgIT0gJ3snKQorICAgIHsKKyAgICAgIGludCBiaXRzOworICAgICAgaW50IHJlZzsKKyAgICAgIGludCBpOworCQkKKyAgICAgIGV4cHJlc3Npb24gKCYgZXhwKTsKKyAgICAgIAorICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCisJcmV0dXJuIF8oImNvbnN0YW50IGV4cHJlc3Npb24gb3IgcmVnaXN0ZXIgbGlzdCBleHBlY3RlZCIpOworCisgICAgICBpZiAocmVncyA9PSB0eXBlMV9yZWdzKQorCXsKKwkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZGRjAwMCkKKwkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7CisJICAKKwkgIGZvciAocmVnID0gMjA7IHJlZyA8IDMyOyByZWcgKyspCisJICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDIwKSkpCisJICAgICAgeworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJICBpZiAocmVnc1tpXSA9PSByZWcpCisJCSAgICAqIGluc24gfD0gKDEgPDwgaSk7CisJICAgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHJlZ3MgPT0gdHlwZTJfcmVncykKKwl7CisJICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRTAwMDApCisJICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOworCSAgCisJICBmb3IgKHJlZyA9IDE7IHJlZyA8IDE2OyByZWcgKyspCisJICAgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgKHJlZyAtIDEpKSkKKwkgICAgICB7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkgIGlmIChyZWdzW2ldID09IHJlZykKKwkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKKwkgICAgICB9CisKKwkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTUpKQorCSAgICAqIGluc24gfD0gKDEgPDwgMyk7CisJICAKKwkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTYpKQorCSAgICAqIGluc24gfD0gKDEgPDwgMTkpOworCX0KKyAgICAgIGVsc2UgLyogcmVncyA9PSB0eXBlM19yZWdzICovCisJeworCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkUwMDAwKQorCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKKwkgIAorCSAgZm9yIChyZWcgPSAxNjsgcmVnIDwgMzI7IHJlZyArKykKKwkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMTYpKSkKKwkgICAgICB7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkgIGlmIChyZWdzW2ldID09IHJlZykKKwkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKKwkgICAgICB9CisKKwkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgKDEgPDwgMTYpKQorCSAgICAqIGluc24gfD0gKDEgPDwgMTkpOworCX0KKworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKKworICAvKiBQYXJzZSB0aGUgcmVnaXN0ZXIgbGlzdCB1bnRpbCBhIHRlcm1pbmF0b3IgKGNsb3NpbmcgY3VybHkgYnJhY2Ugb3IKKyAgICAgbmV3LWxpbmUpIGlzIGZvdW5kLiAgKi8KKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAocmVnaXN0ZXJfbmFtZSAoJiBleHApKQorCXsKKwkgIGludCAgaTsKKwkgIAorCSAgLyogTG9jYXRlIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbGlzdCwgYW5kIGlmIGl0IGlzIHRoZXJlLAorCSAgICAgaW5zZXJ0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCisJICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkgICAgeworCSAgICAgIGlmIChyZWdzWyBpIF0gPT0gZXhwLlhfYWRkX251bWJlcikKKwkJeworCQkgICogaW5zbiB8PSAoMSA8PCBpKTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIGlmIChpID09IDMyKQorCSAgICB7CisJICAgICAgcmV0dXJuIF8oImlsbGVnYWwgcmVnaXN0ZXIgaW5jbHVkZWQgaW4gbGlzdCIpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXhwLCB0cnVlLCB0cnVlKSkKKwl7CisJICBpZiAocmVncyA9PSB0eXBlMV9yZWdzKQorCSAgICB7CisJICAgICAgcmV0dXJuIF8oInN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoZXhwLlhfYWRkX251bWJlciA9PSA1KQorCSAgICB7CisJICAgICAgaWYgKHJlZ3MgPT0gdHlwZTJfcmVncykKKwkJcmV0dXJuIF8oIlBTVyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOworCSAgICAgIGVsc2UKKwkJKiBpbnNuIHw9IDB4ODsKKwkgICAgfQorCSAgZWxzZSBpZiAoZXhwLlhfYWRkX251bWJlciA8IDQpCisJICAgICogaW5zbiB8PSAweDgwMDAwOworCSAgZWxzZQorCSAgICByZXR1cm4gXygiSGlnaCB2YWx1ZSBzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7CisJfQorICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJ30nKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CisJICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCisJeworCSAgLyogV2UgaGF2ZSBlbmNvdW50ZXJlZCBhIHJhbmdlIG9mIHJlZ2lzdGVyczogclggLSByWSAqLworCSAgaW50ICAgICAgICAgajsKKwkgIGV4cHJlc3Npb25TIGV4cDI7CisKKwkgIC8qIFNraXAgdGhlIGRhc2guICAqLworCSAgKysgaW5wdXRfbGluZV9wb2ludGVyOworCisJICAvKiBHZXQgdGhlIHNlY29uZCByZWdpc3RlciBpbiB0aGUgcmFuZ2UuICAqLworCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJiBleHAyKSkKKwkgICAgeworCSAgICAgIHJldHVybiBfKCJzZWNvbmQgcmVnaXN0ZXIgc2hvdWxkIGZvbGxvdyBkYXNoIGluIHJlZ2lzdGVyIGxpc3QiKTsKKwkgICAgICBleHAyLlhfYWRkX251bWJlciA9IGV4cC5YX2FkZF9udW1iZXI7CisJICAgIH0KKworCSAgLyogQWRkIHRoZSByZXN0IG9mIHRoZSByZWdpc3RlcnMgaW4gdGhlIHJhbmdlLiAgKi8KKwkgIGZvciAoaiA9IGV4cC5YX2FkZF9udW1iZXIgKyAxOyBqIDw9IGV4cDIuWF9hZGRfbnVtYmVyOyBqKyspCisJICAgIHsKKwkgICAgICBpbnQgIGk7CisJICAKKwkgICAgICAvKiBMb2NhdGUgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsaXN0LCBhbmQgaWYgaXQgaXMgdGhlcmUsCisJCSBpbnNlcnQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJeworCQkgIGlmIChyZWdzWyBpIF0gPT0gaikKKwkJICAgIHsKKwkJICAgICAgKiBpbnNuIHw9ICgxIDw8IGkpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCisJICAgICAgaWYgKGkgPT0gMzIpCisJCXJldHVybiBfKCJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBicmVhazsKKwl9CisKKyAgICAgIHNraXBfd2hpdGVfc3BhY2UgKCk7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitDT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIm06IjsKKworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KK3sKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKK3NpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIG1kX2xvbmdvcHRzOyAKKworCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgIEZJTEUgKiBzdHJlYW07Cit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiIFY4NTAgb3B0aW9uczpcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgICAgV2FybiBpZiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIikpOworICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW13YXJuLXVuc2lnbmVkLW92ZXJmbG93ICBXYXJuIGlmIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MCAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGUgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlXG4iKSk7CisgIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXY4NTBlYSAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZWFcbiIpKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGFueSAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgZ2VuZXJpYywgZGVzcGl0ZSBhbnkgcHJvY2Vzc29yIHNwZWNpZmljIGluc3RydWN0aW9uc1xuIikpOworfQorCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgICAgYzsKKyAgICAgY2hhciAqIGFyZzsKK3sKKyAgaWYgKGMgIT0gJ20nKQorICAgIHsKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBjLCBhcmcpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChzdHJjbXAgKGFyZywgIndhcm4tc2lnbmVkLW92ZXJmbG93IikgPT0gMCkKKyAgICB7CisgICAgICB3YXJuX3NpZ25lZF9vdmVyZmxvd3MgPSBUUlVFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ3YXJuLXVuc2lnbmVkLW92ZXJmbG93IikgPT0gMCkKKyAgICB7CisgICAgICB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cyA9IFRSVUU7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTAiKSA9PSAwKQorICAgIHsKKyAgICAgIG1hY2hpbmUgPSAwOworICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGUiKSA9PSAwKQorICAgIHsKKyAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZTsKKyAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwZWEiKSA9PSAwKQorICAgIHsKKyAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF92ODUwZWE7CisgICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwRUE7CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBhbnkiKSA9PSAwKQorICAgIHsKKyAgICAgIG1hY2hpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogVGVsbCB0aGUgd29ybGQgdGhhdCB0aGlzIGlzIGZvciBhbnkgdjg1MCBjaGlwLiAgKi8KKyAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsgLyogQnV0IHN1cHBvcnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZXh0ZW5kZWQgdmVyc2lvbnMuICAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gY29tbWFuZCBsaW5lIG9wdGlvbjogLSVjJXNcbiIpLCBjLCBhcmcpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAKKyAgcmV0dXJuIDE7Cit9CisKK3N5bWJvbFMgKgorbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKKyAgY2hhciAqIG5hbWU7Cit7CisgIHJldHVybiAwOworfQorCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQorICBpbnQgICAgdHlwZTsKKyAgY2hhciAqIGxpdHA7CisgIGludCAqICBzaXplcDsKK3sKKyAgaW50ICAgICAgICAgICAgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07CisgIGNoYXIgKiAgICAgICAgIHQ7CisgIGludCAgICAgICAgICAgIGk7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICAgIHByZWMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgIHByZWMgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgKnNpemVwID0gMDsKKyAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7CisgICAgfQorICAKKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVwID0gcHJlYyAqIDI7CisKKyAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOworICAgICAgbGl0cCArPSAyOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworCisvKiBWZXJ5IGdyb3NzLiAgKi8KK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKKyAgYmZkICogICAgICBhYmZkOworICBhc2VjdGlvbiAqIHNlYzsKKyAgZnJhZ1MgKiAgICBmcmFnUDsKK3sKKyAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKKyAgCisgIC8qIEluIHJhbmdlIGNvbmRpdGlvbmFsIG9yIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDAgfHwgZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKKyAgICB7CisgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArIChpbnQpZnJhZ1AtPmZyX29wY29kZSk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKKyAgICB9CisgIC8qIE91dCBvZiByYW5nZSBjb25kaXRpb25hbCBicmFuY2guICBFbWl0IGEgYnJhbmNoIGFyb3VuZCBhIGp1bXAuICAqLworICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IAorCSh1bnNpZ25lZCBjaGFyICopIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwpOworCisgICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCisgICAgICBidWZmZXJbMF0gXj0gMHgwODsKKyAgICAgIC8qIE1hc2sgb2ZmIGFsbCB0aGUgZGlzcGxhY2VtZW50IGJpdHMuICAqLworICAgICAgYnVmZmVyWzBdICY9IDB4OGY7CisgICAgICBidWZmZXJbMV0gJj0gMHgwNzsKKyAgICAgIC8qIE5vdyBzZXQgdGhlIGRpc3BsYWNlbWVudCBiaXRzIHNvIHRoYXQgd2UgYnJhbmNoCisJIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLworICAgICAgYnVmZmVyWzBdIHw9IDB4MzA7CisKKyAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlIGZpbmFsCisJIHRhcmdldC4gICovCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIDIsIDB4MDAwMDA3ODAsIDQpOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsKKwkgICAgICAgKGludCkgZnJhZ1AtPmZyX29wY29kZSArIDEpOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7CisgICAgfQorICAvKiBPdXQgb2YgcmFuZ2UgdW5jb25kaXRpb25hbCBicmFuY2guICBFbWl0IGEganVtcC4gICovCisgIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDMpCisgICAgeworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWwsIDB4MDAwMDA3ODAsIDQpOworICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKworCSAgICAgICAoaW50KSBmcmFnUC0+ZnJfb3Bjb2RlICsgMSk7CisgICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKKyAgICB9CisgIGVsc2UKKyAgICBhYm9ydCAoKTsKK30KKwordmFsdWVUCittZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCisgICAgIGFzZWN0aW9uICogc2VnOworICAgICB2YWx1ZVQgICAgIGFkZHI7Cit7CisgIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKTsKKyAgcmV0dXJuICgoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Cit9CisKK3ZvaWQKK21kX2JlZ2luICgpCit7CisgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfbmFtZSA9ICIiOworICByZWdpc3RlciBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiBvcDsKKyAgZmxhZ3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZTsKKworICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTBlYSIsIDYpID09IDApCisgICAgeworICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCisJbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlYTsKKyAgICAgIAorICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQorCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKFRBUkdFVF9DUFUsICJ2ODUwZSIsIDUpID09IDApCisgICAgeworICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCisJbWFjaGluZSAgICAgICAgPSBiZmRfbWFjaF92ODUwZTsKKyAgICAgIAorICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQorCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOworICAgIH0KKyAgZWxzZQorICBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTAiLCA0KSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChtYWNoaW5lID09IC0xKQorCW1hY2hpbmUgICAgICAgID0gMDsKKyAgICAgIAorICAgICAgaWYgKHByb2Nlc3Nvcl9tYXNrID09IC0xKQorCXByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTA7CisgICAgfQorICBlbHNlCisgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICBhc19iYWQgKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCB0YXJnZXQgcHJvY2Vzc29yIGZyb20gc3RyaW5nOiAlcyIpLCAKKyAgICAgICAgICAgIFRBUkdFVF9DUFUpOworCisgIHY4NTBfaGFzaCA9IGhhc2hfbmV3KCk7CisKKyAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUuICBUaGUgVjg1MCBpbnN0cnVjdGlvbiBzZXQKKyAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKKyAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bworICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCisKKyAgb3AgPSB2ODUwX29wY29kZXM7CisgIHdoaWxlIChvcC0+bmFtZSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wLT5uYW1lKSkgCisJeworCSAgcHJldl9uYW1lID0gKGNoYXIgKikgb3AtPm5hbWU7CisJICBoYXNoX2luc2VydCAodjg1MF9oYXNoLCBvcC0+bmFtZSwgKGNoYXIgKikgb3ApOworCX0KKyAgICAgIG9wKys7CisgICAgfQorCisgIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoaW5lKTsKKworICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKKyAgCisgIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jYWxsX3RhYmxlX2RhdGEiLCAwKTsKKyAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNhbGxfdGFibGVfZGF0YV9zZWN0aW9uLAorCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKKwkJCQkgICAgICAgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKKyAgCisgIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5jYWxsX3RhYmxlX3RleHQiLCAwKTsKKyAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNhbGxfdGFibGVfdGV4dF9zZWN0aW9uLAorCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKKwkJCQkgICAgICAgfCBTRUNfQ09ERSkpOworICAKKyAgLyogUmVzdG9yZSB0ZXh0IHNlY3Rpb24gYXMgdGhlIGN1cnJlbnQgZGVmYXVsdC4gICovCisgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Cit9CisKKworc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQoraGFuZGxlX2N0b2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKK3sKKyAgaWYgKG9wZXJhbmQgPT0gTlVMTCkKKyAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUOworCisgIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSA2CisgICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiY3RvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKKyAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCisgICAgfQorICAgICAgCisgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOworfQorCitzdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCitoYW5kbGVfc2Rhb2ZmIChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKK3sKKyAgaWYgKG9wZXJhbmQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOworICBpZiAob3BlcmFuZC0+Yml0cyA9PSAxNSAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxNykgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQ7CisgIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDsKKyAgCisgIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSAxNgorICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMTYpCisgICAgeworICAgICAgYXNfYmFkIChfKCJzZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKKyAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCisgICAgfQorICAKKyAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQ7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKK2hhbmRsZV96ZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQoreworICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ7CisgIGlmIChvcGVyYW5kLT5iaXRzID09IDE1ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE3KSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDsKKyAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOworCisgIGlmICggICBvcGVyYW5kLT5iaXRzICAhPSAxNgorICAgICAgfHwgb3BlcmFuZC0+c2hpZnQgIT0gMTYpCisgICAgeworICAgICAgYXNfYmFkIChfKCJ6ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKKyAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCisgICAgfQorICAKKyAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ7Cit9CisKK3N0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKK2hhbmRsZV90ZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQoreworICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQ7ICAvKiBkYXRhIGl0ZW0sIG5vdCBhbiBpbnN0cnVjdGlvbi4gICovCisgIGlmIChvcGVyYW5kLT5iaXRzID09IDYgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMSkgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVDsgIC8qIHNsZC53L3NzdC53LCBvcGVyYW5kOiBEOF82ICAqLworICBpZiAob3BlcmFuZC0+Yml0cyA9PSA0ICYmIG9wZXJhbmQtPmluc2VydCAhPSBOVUxMKSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQ7ICAvKiBzbGQuaHUsIG9wZXJhbmQ6IEQ1LTQgKi8KKyAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNCAmJiBvcGVyYW5kLT5pbnNlcnQgPT0gTlVMTCkgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VUOyAgLyogc2xkLmJ1LCBvcGVyYW5kOiBENCAgICovCisgIGlmIChvcGVyYW5kLT5iaXRzID09IDE2ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE2KSAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOyAvKiBzZXQxICYgY2h1bXMsIG9wZXJhbmRzOiBEMTYgKi8KKyAgCisgIGlmIChvcGVyYW5kLT5iaXRzICE9IDcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJ0ZGFvZmYoKSByZWxvY2F0aW9uIHVzZWQgb24gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBpdCIpKTsKKyAgICAgIHJldHVybiBCRkRfUkVMT0NfNjQ7ICAvKiBVc2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCisgICAgfQorICAKKyAgcmV0dXJuICBvcGVyYW5kLT5pbnNlcnQgIT0gTlVMTAorICAgID8gQkZEX1JFTE9DX1Y4NTBfVERBXzdfOF9PRkZTRVQgICAgIC8qIHNsZC5oL3NzdC5oLCBvcGVyYW5kOiBEOF83ICovCisgICAgOiBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVDsgICAgLyogc2xkLmIvc3N0LmIsIG9wcmVhbmQ6IEQ3ICAgKi8KK30KKworLyogV2FybmluZzogVGhlIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiByZWxpZXMgdXBvbiB0aGUgZGVmaW5pdGlvbnMKKyAgIGluIHRoZSB2ODUwX29wZXJhbmRzW10gYXJyYXkgKGRlZmluZWQgaW4gb3Bjb2Rlcy92ODUwLW9wYy5jKQorICAgbWF0Y2hpbmcgdGhlIGhhcmQgY29kZWQgdmFsdWVzIGNvbnRhaW5lZCBoZXJlaW4uICAqLworCitzdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCit2ODUwX3JlbG9jX3ByZWZpeCAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCit7CisgIGJvb2xlYW4gcGFyZW5fc2tpcHBlZCA9IGZhbHNlOworCisKKyAgLyogU2tpcCBsZWFkaW5nIG9wZW5pbmcgcGFyZW50aGVzaXMuICAqLworICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJygnKQorICAgIHsKKyAgICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIHBhcmVuX3NraXBwZWQgPSB0cnVlOworICAgIH0KKworI2RlZmluZSBDSEVDS18obmFtZSwgcmVsb2MpIAkJCQkJCVwKKyAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgbmFtZSMjIigiLCBzdHJsZW4gKG5hbWUpICsgMSkgPT0gMCkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RybGVuIChuYW1lKTsJCQkJXAorICAgICAgcmV0dXJuIHJlbG9jOwkJCQkJCQlcCisgICAgfQorICAKKyAgQ0hFQ0tfICgiaGkwIiwgICAgQkZEX1JFTE9DX0hJMTYpOworICBDSEVDS18gKCJoaSIsICAgICBCRkRfUkVMT0NfSEkxNl9TKTsKKyAgQ0hFQ0tfICgibG8iLCAgICAgQkZEX1JFTE9DX0xPMTYpOworICBDSEVDS18gKCJzZGFvZmYiLCBoYW5kbGVfc2Rhb2ZmIChvcGVyYW5kKSk7CisgIENIRUNLXyAoInpkYW9mZiIsIGhhbmRsZV96ZGFvZmYgKG9wZXJhbmQpKTsKKyAgQ0hFQ0tfICgidGRhb2ZmIiwgaGFuZGxlX3RkYW9mZiAob3BlcmFuZCkpOworICBDSEVDS18gKCJoaWxvIiwgICBCRkRfUkVMT0NfMzIpOworICBDSEVDS18gKCJjdG9mZiIsICBoYW5kbGVfY3RvZmYgKG9wZXJhbmQpKTsKKyAgCisgIC8qIFJlc3RvcmUgc2tpcHBlZCBwYXJlbnRoZXNpcy4gICovCisgIGlmIChwYXJlbl9za2lwcGVkKQorICAgIC0tIGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgCisgIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOworfQorCisvKiBJbnNlcnQgYW4gb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3Y4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc3RyKQorICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7CisgICAgIG9mZnNldFQgICAgICAgICAgICAgICAgICAgICB2YWw7CisgICAgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBmaWxlOworICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgbGluZTsKKyAgICAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIHN0cjsKK3sKKyAgaWYgKG9wZXJhbmQtPmluc2VydCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICogbWVzc2FnZSA9IE5VTEw7CisgICAgICAKKyAgICAgIGluc24gPSBvcGVyYW5kLT5pbnNlcnQgKGluc24sIHZhbCwgJiBtZXNzYWdlKTsKKyAgICAgIGlmIChtZXNzYWdlICE9IE5VTEwpCisJeworCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCisJICAgICAgJiYgISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MKKwkgICAgICAmJiBzdHJzdHIgKG1lc3NhZ2UsICJvdXQgb2YgcmFuZ2UiKSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogc2tpcCB3YXJuaW5nLi4uICovCisJICAgIH0KKwkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpID09IDAKKwkJICAgJiYgISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cworCQkgICAmJiBzdHJzdHIgKG1lc3NhZ2UsICJvdXQgb2YgcmFuZ2UiKSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogc2tpcCB3YXJuaW5nLi4uICovCisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cikKKwkgICAgeworCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCisJCWFzX3dhcm4gKCIlczogJXMiLCBzdHIsIG1lc3NhZ2UpOworCSAgICAgIGVsc2UKKwkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgIiVzOiAlcyIsIHN0ciwgbWVzc2FnZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCisJCWFzX3dhcm4gKG1lc3NhZ2UpOworCSAgICAgIGVsc2UKKwkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgbWVzc2FnZSk7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gMzIpCisJeworCSAgbG9uZyAgICBtaW4sIG1heDsKKwkgIG9mZnNldFQgdGVzdDsKKworCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpICE9IDApCisJICAgIHsKKwkgICAgICBpZiAoISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MpCisJCW1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKKwkgICAgICBlbHNlCisJCW1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKKwkgICAgICAKKwkgICAgICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7CisJICAgICAgCisJICAgICAgaWYgKCEgd2Fybl91bnNpZ25lZF9vdmVyZmxvd3MpCisJCW1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7CisJICAgICAgZWxzZQorCQltaW4gPSAwOworCSAgICB9CisJICAKKwkgIGlmICh2YWwgPCAob2Zmc2V0VCkgbWluIHx8IHZhbCA+IChvZmZzZXRUKSBtYXgpCisJICAgIHsKKwkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICAgIGNvbnN0IGNoYXIgKiBlcnIgPSBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7CisJICAgICAgY2hhciAgICAgICAgIGJ1ZlsxMDBdOworCSAgICAgIAorCSAgICAgIC8qIFJlc3RvcmUgbWluIGFuZCBtaXggdG8gZXhwZWN0ZWQgdmFsdWVzIGZvciBkZWNpbWFsIHJhbmdlcy4gICovCisJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCisJCSAgJiYgISB3YXJuX3NpZ25lZF9vdmVyZmxvd3MpCisJCW1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKKworCSAgICAgIGlmICghIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCisJCSAgJiYgISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cykKKwkJbWluID0gMDsKKworCSAgICAgIGlmIChzdHIpCisJCXsKKwkJICBzcHJpbnRmIChidWYsICIlczogIiwgc3RyKTsKKwkJICAKKwkJICBzcHJpbnRfdmFsdWUgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgdmFsKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJc3ByaW50X3ZhbHVlIChidWYsIHZhbCk7CisJICAgICAgCisJICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKKwkJYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKKwkgICAgICBlbHNlCisJCWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7CisJICAgIH0KKwl9CisKKyAgICAgIGluc24gfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0KTsKKyAgICB9CisgIAorICByZXR1cm4gaW5zbjsKK30KKworDAorc3RhdGljIGNoYXIgICAgICAgICAgICAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24gWzEyOF07CisKK3ZvaWQKK21kX2Fzc2VtYmxlIChzdHIpIAorICAgICBjaGFyICogc3RyOworeworICBjaGFyICogICAgICAgICAgICAgICAgICAgIHM7CisgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2Zfb3BlcmFuZHM7CisgIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgb3Bjb2RlOworICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgIG5leHRfb3Bjb2RlOworICBjb25zdCB1bnNpZ25lZCBjaGFyICogICAgIG9waW5kZXhfcHRyOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG5leHRfb3BpbmRleDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICByZWxheGFibGU7CisgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgaW5zbjsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBpbnNuX3NpemU7CisgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgZjsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICBpOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOworICBib29sZWFuICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOworICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGFfbGVuOworICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGV4dHJhX2RhdGE7CisgIGNoYXIgKgkJICAgIHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKKworICAKKyAgc3RybmNweSAoY29weV9vZl9pbnN0cnVjdGlvbiwgc3RyLCBzaXplb2YgKGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pIC0gMSk7CisgIAorICAvKiBHZXQgdGhlIG9wY29kZS4gICovCisgIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhIGlzc3BhY2UgKCpzKTsgcysrKQorICAgIGNvbnRpbnVlOworICAKKyAgaWYgKCpzICE9ICdcMCcpCisgICAgKnMrKyA9ICdcMCc7CisKKyAgLyogZmluZCB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggdGhlIHByb3BlciBuYW1lICovCisgIG9wY29kZSA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKikgaGFzaF9maW5kICh2ODUwX2hhc2gsIHN0cik7CisgIGlmIChvcGNvZGUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdHIgPSBzOworICB3aGlsZSAoaXNzcGFjZSAoKiBzdHIpKQorICAgICsrIHN0cjsKKworICBzdGFydF9vZl9vcGVyYW5kcyA9IHN0cjsKKworICBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIAorICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKiBlcnJtc2cgPSBOVUxMOworCisgICAgICBtYXRjaCA9IDA7CisgICAgICAKKyAgICAgIGlmICgob3Bjb2RlLT5wcm9jZXNzb3JzICYgcHJvY2Vzc29yX21hc2spID09IDApCisJeworCSAgZXJybXNnID0gXygiVGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW5zdHJ1Y3Rpb24uIik7CisJICBnb3RvIGVycm9yOworCX0KKyAgICAgIAorICAgICAgcmVsYXhhYmxlID0gMDsKKyAgICAgIGZjID0gMDsKKyAgICAgIG5leHRfb3BpbmRleCA9IDA7CisgICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7CisgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyID0gc3RhcnRfb2Zfb3BlcmFuZHM7CisKKyAgICAgIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIgKyspCisJeworCSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7CisJICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgaG9sZDsKKwkgIGV4cHJlc3Npb25TICAgICAgICAgICAgICAgICBleDsKKwkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgICByZWxvYzsKKworCSAgaWYgKG5leHRfb3BpbmRleCA9PSAwKQorCSAgICB7CisJICAgICAgb3BlcmFuZCA9ICYgdjg1MF9vcGVyYW5kc1sgKiBvcGluZGV4X3B0ciBdOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvcGVyYW5kICAgICAgPSAmIHY4NTBfb3BlcmFuZHNbIG5leHRfb3BpbmRleCBdOworCSAgICAgIG5leHRfb3BpbmRleCA9IDA7CisJICAgIH0KKworCSAgZXJybXNnID0gTlVMTDsKKworCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nKQorCSAgICArKyBzdHI7CisKKwkgIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUxBWCkKKwkgICAgcmVsYXhhYmxlID0gMTsKKworCSAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAqLworCSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKKwkgIAorCSAgLyogbG8oKSwgaGkoKSwgaGkwKCksIGV0Yy4uLiAqLworCSAgaWYgKChyZWxvYyA9IHY4NTBfcmVsb2NfcHJlZml4IChvcGVyYW5kKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSBmYWtlIHJlbG9jLCB1c2VkIHRvIGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCisJICAgICAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ182NCkKKwkJeworCQkgIG1hdGNoID0gMTsKKwkJICBnb3RvIGVycm9yOworCQl9CisJCSAKKwkgICAgICBleHByZXNzaW9uICgmIGV4KTsKKworCSAgICAgIGlmIChleC5YX29wID09IE9fY29uc3RhbnQpCisJCXsKKwkJICBzd2l0Y2ggKHJlbG9jKQorCQkgICAgeworCQkgICAgY2FzZSBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgorCQkgICAgICAvKiBUbyBjb3BlIHdpdGggIm5vdDEgNywgemRhb2ZmKDB4ZmZmZmYwMDYpW3IwXSIKKwkJCSBhbmQgdGhlIGxpa2UuICAqLworCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworCQkgICAgICAKKwkJICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CisJCSAgICAgIHsKKwkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCisJCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKGV4LlhfYWRkX251bWJlcik7CisJCQlicmVhazsKKwkJICAgICAgfQorCisJCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgorCQkgICAgICB7CisJCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLworCQkJZXguWF9hZGRfbnVtYmVyID0gU0VYVDE2IChleC5YX2FkZF9udW1iZXIgPj4gMTYpOworCQkJYnJlYWs7CisJCSAgICAgIH0KKworCQkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgorCQkgICAgICB7CisJCQkvKiBUcnVuY2F0ZSwgdGhlbiBzaWduIGV4dGVuZCB0aGUgdmFsdWUuICAqLworCQkgICAgICAgIGludCB0ZW1wID0gKGV4LlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7CisKKwkJCXRlbXAgKz0gKGV4LlhfYWRkX251bWJlciA+PiAxNSkgJiAxOworCisJCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKHRlbXApOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICAgIAorCQkgICAgY2FzZSBCRkRfUkVMT0NfMzI6CisJCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgPT0gMCkKKwkJCXsKKwkJCSAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7CisJCQkgIGdvdG8gZXJyb3I7CisJCQl9CisJCSAgICAgIAorCQkgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOworCQkgICAgICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OworCQkgICAgICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7CisJCSAgICAgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7CisJCSAgICAgIGJyZWFrOworCQkgICAgICAKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlbG9jOiAlZFxuIiwgcmVsb2MpOworCQkgICAgICBhc19iYWQgKF8oIkFBQVJHIC0+IHVuaGFuZGxlZCBjb25zdGFudCByZWxvYyIpKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisKKwkJICBpZiAoZmMgPiBNQVhfSU5TTl9GSVhVUFMpCisJCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOworCQkgIAorCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7CisJCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOworCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gcmVsb2M7CisJCSAgZmMrKzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfMzIpCisJCSAgICB7CisJCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgPT0gMCkKKwkJCXsKKwkJCSAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7CisJCQkgIGdvdG8gZXJyb3I7CisJCQl9CisJCSAgICAgIAorCQkgICAgICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOworCQkgICAgICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSA0OworCQkgICAgICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7CisJCSAgICB9CisJCSAgICAgIAorCQkgIGlmIChmYyA+IE1BWF9JTlNOX0ZJWFVQUykKKwkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisKKwkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OworCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKKwkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IHJlbG9jOworCQkgIGZjKys7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZXJybXNnID0gTlVMTDsKKwkgICAgICAKKwkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgIT0gMCkgCisJCXsKKwkJICBpZiAoIXJlZ2lzdGVyX25hbWUgKCYgZXgpKQorCQkgICAgeworCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG5hbWUiKTsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX05PVF9SMCkKKwkJICAgICAgJiYgZXguWF9hZGRfbnVtYmVyID09IDApCisJCSAgICB7CisJCSAgICAgIGVycm1zZyA9IF8oInJlZ2lzdGVyIHIwIGNhbm5vdCBiZSB1c2VkIGhlcmUiKTsKKwkJICAgICAgCisJCSAgICAgIC8qIEZvcmNlIGFuIGVycm9yIG1lc3NhZ2UgdG8gYmUgZ2VuZXJhdGVkIGJ5CisJCQkgc2tpcHBpbmcgb3ZlciBhbnkgZm9sbG93aW5nIHBvdGVudGlhbCBtYXRjaGVzCisJCQkgZm9yIHRoaXMgb3Bjb2RlLiAgKi8KKwkJICAgICAgb3Bjb2RlICs9IDM7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU1JHKSAhPSAwKSAKKwkJeworCQkgIGlmICghc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXgsIHRydWUsIGZhbHNlKSkKKwkJICAgIHsKKwkJICAgICAgZXJybXNnID0gXygiaW52YWxpZCBzeXN0ZW0gcmVnaXN0ZXIgbmFtZSIpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0VQKSAhPSAwKQorCQl7CisJCSAgY2hhciAqIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCQkgIGNoYXIgICBjICAgICA9IGdldF9zeW1ib2xfZW5kICgpOworCQkgIAorCQkgIGlmIChzdHJjbXAgKHN0YXJ0LCAiZXAiKSAhPSAwICYmIHN0cmNtcCAoc3RhcnQsICJyMzAiKSAhPSAwKQorCQkgICAgeworCQkgICAgICAvKiBQdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB3ZSBmb3VuZCB0aGVtLiAgKi8KKwkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OworCQkgICAgICBlcnJtc2cgPSBfKCJleHBlY3RlZCBFUCByZWdpc3RlciIpOworCQkgICAgICBnb3RvIGVycm9yOworCQkgICAgfQorCQkgIAorCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworCSAgICAgIAorCQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJykKKwkJICAgICsrIHN0cjsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9DQykgIT0gMCkgCisJCXsKKwkJICBpZiAoIWNjX25hbWUgKCYgZXgpKQorCQkgICAgeworCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIG5hbWUiKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfUFVTSF9QT1ApIAorCQl7CisJCSAgZXJybXNnID0gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoJiBpbnNuLCBvcGVyYW5kKTsKKwkJICAKKwkJICAvKiBUaGUgcGFyc2VfcmVnaXN0ZXJfbGlzdCgpIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGRvbmUKKwkJICAgICBldmVyeXRoaW5nLCBzbyBmYWtlIGEgZHVtbXkgZXhwcmVzc2lvbi4gICovCisJCSAgZXguWF9vcCAgICAgICAgID0gT19jb25zdGFudDsKKwkJICBleC5YX2FkZF9udW1iZXIgPSAwOworCQl9CisJICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUxNikgCisJCXsKKwkJICBleHByZXNzaW9uICgmIGV4KTsKKworCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCisJCSAgICBlcnJtc2cgPSBfKCJjb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIik7CisJCSAgZWxzZSBpZiAoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmMDAwMCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGV4LlhfYWRkX251bWJlciAmIDB4ZmZmZikKKwkJCWVycm1zZyA9IF8oImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iKTsKKwkJICAgICAgZWxzZSBpZiAoKGluc24gJiAweDAwMWZmZmMwKSA9PSAweDAwMTMwNzgwKQorCQkJZXguWF9hZGRfbnVtYmVyID4+PSAxNjsKKwkJICAgICAgZWxzZQorCQkJZXJybXNnID0gXygiY29uc3RhbnQgdG9vIGJpZyB0byBmaXQgaW50byBpbnN0cnVjdGlvbiIpOworCQkgICAgfQorCQkgIAorCQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7CisJCSAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gMjsKKwkJICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7CisJCSAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MEVfSU1NRURJQVRFMzIpIAorCQl7CisJCSAgZXhwcmVzc2lvbiAoJiBleCk7CisJCSAgCisJCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKKwkJICAgIGVycm1zZyA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKwkJICAKKwkJICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSB0cnVlOworCQkgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7CisJCSAgZXh0cmFfZGF0YSAgICAgICAgICAgID0gZXguWF9hZGRfbnVtYmVyOworCQkgIGV4LlhfYWRkX251bWJlciAgICAgICA9IDA7CisJCX0KKwkgICAgICBlbHNlIGlmIChyZWdpc3Rlcl9uYW1lICgmIGV4KQorCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgPT0gMCkKKwkJeworCQkgIGNoYXIgYzsKKwkJICBpbnQgIGV4aXN0cyA9IDA7CisJCSAgCisJCSAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBhbiBhbGlhcyBoYXMgYmVlbiBkZWZpbmVkIHRoYXQKKwkJICAgICBtYXRjaGVzIGEgcmVnaXN0ZXIgbmFtZS4gIEZvciBleGFtcGxlIHRoZSBjb2RlIG1heQorCQkgICAgIGluY2x1ZGUgYSAiLnNldCBaRVJPLCAwIiBkaXJlY3RpdmUsIHdoaWNoIG1hdGNoZXMKKwkJICAgICB0aGUgcmVnaXN0ZXIgbmFtZSAiemVybyIuICBBdHRlbXB0IHRvIHJlcGFyc2UgdGhlCisJCSAgICAgZmllbGQgYXMgYW4gZXhwcmVzc2lvbiwgYW5kIG9ubHkgY29tcGxhaW4gaWYgd2UKKwkJICAgICBjYW5ub3QgZ2VuZXJhdGUgYSBjb25zdGFudC4gICovCisKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7CisKKwkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisJCSAgCisJCSAgaWYgKHN5bWJvbF9maW5kIChzdHIpICE9IE5VTEwpCisJCSAgICBleGlzdHMgPSAxOworCQkgIAorCQkgICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7CisJCSAgCisJCSAgZXhwcmVzc2lvbiAoJiBleCk7CisKKwkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQorCQkgICAgeworCQkgICAgICAvKiBJZiB0aGlzIHJlZ2lzdGVyIGlzIGFjdHVhbGx5IG9jY3VyaW5nIHRvbyBlYXJseSBvbgorCQkJIHRoZSBwYXJzaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiwgKGJlY2F1c2UgYW5vdGhlcgorCQkJIGZpZWxkIGlzIG1pc3NpbmcpIHRoZW4gcmVwb3J0IHRoaXMuICAqLworCQkgICAgICBpZiAob3BpbmRleF9wdHJbMV0gIT0gMAorCQkJICAmJiAodjg1MF9vcGVyYW5kcyBbb3BpbmRleF9wdHIgWzFdXS5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpKQorCQkJZXJybXNnID0gXygic3ludGF4IGVycm9yOiB2YWx1ZSBpcyBtaXNzaW5nIGJlZm9yZSB0aGUgcmVnaXN0ZXIgbmFtZSIpOworCQkgICAgICBlbHNlCisJCQllcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIpOworCisJCSAgICAgIC8qIElmIHdlIGNyZWF0ZWQgYSBzeW1ib2wgaW4gdGhlIHByb2Nlc3Mgb2YgdGhpcyB0ZXN0IHRoZW4KKwkJCSBkZWxldGUgaXQgbm93LCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIG91dHB1dCB3aXRoIHRoZSByZWFsCisJCQkgc3ltYm9scy4uLiAqLworCQkgICAgICBpZiAoZXhpc3RzID09IDAKKwkJCSAgJiYgZXguWF9vcCA9PSBPX3N5bWJvbCkKKwkJCXN5bWJvbF9yZW1vdmUgKGV4LlhfYWRkX3N5bWJvbCwKKwkJCQkgICAgICAgJiBzeW1ib2xfcm9vdFAsICYgc3ltYm9sX2xhc3RQKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lICgmIGV4LCBmYWxzZSwgZmFsc2UpCisJCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU1JHKSA9PSAwKQorCQl7CisJCSAgZXJybXNnID0gXygic3ludGF4IGVycm9yOiBzeXN0ZW0gcmVnaXN0ZXIgbm90IGV4cGVjdGVkIik7CisJCX0KKwkgICAgICBlbHNlIGlmIChjY19uYW1lICgmZXgpCisJCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfQ0MpID09IDApCisJCXsKKwkJICBlcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IGNvbmRpdGlvbiBjb2RlIG5vdCBleHBlY3RlZCIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZXhwcmVzc2lvbiAoJiBleCk7CisJCSAgLyogU3BlY2lhbCBjYXNlOgorCQkgICAgIElmIHdlIGFyZSBhc3NlbWJsaW5nIGEgTU9WIGluc3RydWN0aW9uIChvciBhIENBTExULi4uLiA6LSkKKwkJICAgICBhbmQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW50byB0aGUgYml0cworCQkgICAgIGF2YWlsYWJsZSB0aGVuIGNyZWF0ZSBhIGZha2UgZXJyb3Igc28gdGhhdCB0aGUgbmV4dCBNT1YKKwkJICAgICBpbnN0cnVjdGlvbiB3aWxsIGJlIHNlbGVjdGVkLiAgVGhpcyBvbmUgaGFzIGEgMzIgYml0CisJCSAgICAgaW1tZWRpYXRlIGZpZWxkLiAgKi8KKworCQkgIGlmICgoKGluc24gJiAweDA3ZTApID09IDB4MDIwMCkKKwkJICAgICAgJiYgZXguWF9vcCA9PSBPX2NvbnN0YW50CisJCSAgICAgICYmIChleC5YX2FkZF9udW1iZXIgPCAoLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkKKwkJCSAgfHwgZXguWF9hZGRfbnVtYmVyID4gKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpKQorCQkgICAgZXJybXNnID0gXygiaW1tZWRpYXRlIG9wZXJhbmQgaXMgdG9vIGxhcmdlIik7CisJCX0KKworCSAgICAgIGlmIChlcnJtc2cpCisJCWdvdG8gZXJyb3I7CisJICAgICAgCisvKiBmcHJpbnRmIChzdGRlcnIsICIgaW5zbjogJXgsIG9wZXJhbmQgJWQsIG9wOiAlZCwgYWRkX251bWJlcjogJWRcbiIsCisgICBpbnNuLCBvcGluZGV4X3B0ciAtIG9wY29kZS0+b3BlcmFuZHMsIGV4Llhfb3AsIGV4LlhfYWRkX251bWJlcik7ICovCisKKwkgICAgICBzd2l0Y2ggKGV4Llhfb3ApIAorCQl7CisJCWNhc2UgT19pbGxlZ2FsOgorCQkgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOworCQkgIGdvdG8gZXJyb3I7CisJCWNhc2UgT19hYnNlbnQ6CisJCSAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7CisJCSAgZ290byBlcnJvcjsKKwkJY2FzZSBPX3JlZ2lzdGVyOgorCQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiAoVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfT1BFUkFORF9TUkcpKSA9PSAwKQorCQkgICAgeworCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIG9wZXJhbmQiKTsKKwkJICAgICAgZ290byBlcnJvcjsKKwkJICAgIH0KKwkJICBpbnNuID0gdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAorCQkJCQkgICAgICAoY2hhciAqKSBOVUxMLCAwLAorCQkJCQkgICAgICBjb3B5X29mX2luc3RydWN0aW9uKTsKKwkJICBicmVhazsKKworCQljYXNlIE9fY29uc3RhbnQ6CisJCSAgaW5zbiA9IHY4NTBfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIGV4LlhfYWRkX251bWJlciwKKwkJCQkJICAgICAgKGNoYXIgKikgTlVMTCwgMCwKKwkJCQkJICAgICAgY29weV9vZl9pbnN0cnVjdGlvbik7CisJCSAgYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCisJCSAgaWYgKGZjID49IE1BWF9JTlNOX0ZJWFVQUykKKwkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7CisKKwkJICBmaXh1cHNbIGZjIF0uZXhwICAgICA9IGV4OworCQkgIGZpeHVwc1sgZmMgXS5vcGluZGV4ID0gKiBvcGluZGV4X3B0cjsKKwkJICBmaXh1cHNbIGZjIF0ucmVsb2MgICA9IEJGRF9SRUxPQ19VTlVTRUQ7CisJCSAgKytmYzsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisKKwkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJyB8fCAqc3RyID09ICdbJyB8fCAqc3RyID09ICddJworCQkgfHwgKnN0ciA9PSAnKScpCisJICAgICsrc3RyOworCX0KKyAgICAgIG1hdGNoID0gMTsKKworICAgIGVycm9yOgorICAgICAgaWYgKG1hdGNoID09IDApCisgICAgICAgIHsKKwkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKKwkgIGlmIChuZXh0X29wY29kZS0+bmFtZSAhPSBOVUxMCisJICAgICAgJiYgc3RyY21wIChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7CisKKwkgICAgICAvKiBTa2lwIHZlcnNpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldAorCQkgcHJvY2Vzc29yLiAgKi8KKwkgICAgICBpZiAoKG9wY29kZS0+cHJvY2Vzc29ycyAmIHByb2Nlc3Nvcl9tYXNrKSA9PSAwKQorCQlnb3RvIGVycm9yOworCSAgICAgIAorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAKKwkgIGFzX2JhZCAoIiVzOiAlcyIsIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24sIGVycm1zZyk7CisJICAKKwkgIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnXScpCisJICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIAorCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgICAgCisgIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKKyAgICArK3N0cjsKKworICBpZiAoKnN0ciAhPSAnXDAnKQorICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOworCisgIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICovCisgIAorICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKKyAgICB7CisgICAgICBpbnNuX3NpemUgPSAyOworICAgICAgZmMgPSAwOworCisgICAgICBpZiAoIXN0cmNtcCAob3Bjb2RlLT5uYW1lLCAiYnIiKSkKKwl7CisJICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAyLCAyLAorCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCisJCQlmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKKwkJCShjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLCBpbnNuX3NpemUpOworCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgMiwgMCwgMik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDYsIDQsIDAsCisJCQlmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKKwkJCWZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAorCQkJKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyAyLCAwLCA0KTsKKwl9CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIC8qIEZvdXIgYnl0ZSBpbnNucyBoYXZlIGFuIG9wY29kZSB3aXRoIHRoZSB0d28gaGlnaCBiaXRzIG9uLiAgKi8KKyAgICAgIGlmICgoaW5zbiAmIDB4MDYwMCkgPT0gMHgwNjAwKQorCWluc25fc2l6ZSA9IDQ7CisgICAgICBlbHNlCisJaW5zbl9zaXplID0gMjsKKworICAgICAgLyogU3BlY2lhbCBjYXNlOiAzMiBiaXQgTU9WICovCisgICAgICBpZiAoKGluc24gJiAweGZmZTApID09IDB4MDYyMCkKKwlpbnNuX3NpemUgPSAyOworICAgICAgCisgICAgICBmID0gZnJhZ19tb3JlIChpbnNuX3NpemUpOworICAgICAgCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7CisKKyAgICAgIGlmIChleHRyYV9kYXRhX2FmdGVyX2luc24pCisJeworCSAgZiA9IGZyYWdfbW9yZSAoZXh0cmFfZGF0YV9sZW4pOworCSAgCisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGV4dHJhX2RhdGEsIGV4dHJhX2RhdGFfbGVuKTsKKworCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7CisJfQorICAgIH0KKworICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhCisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwgYnV0IGluc3RlYWQganVzdCB1c2UgdGhlCisgICAgIEJGRF9SRUxPQ19VTlVTRUQgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkKKyAgICAgaGFuZGxlIGZpeHVwcyBmb3IgYW55IG9wZXJhbmQgdHlwZSwgYWx0aG91Z2ggdGhhdCBpcyBhZG1pdHRlZGx5CisgICAgIG5vdCBhIHZlcnkgZXhjaXRpbmcgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbgorICAgICBtZF9hcHBseV9maXguICAqLyAgCisgIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kOworICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICAgIHJlbG9jOworICAgICAgCisgICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBmaXh1cHNbaV0ub3BpbmRleCBdOworCisgICAgICByZWxvYyA9IGZpeHVwc1tpXS5yZWxvYzsKKyAgICAgIAorICAgICAgaWYgKHJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCisJeworCSAgcmVsb2NfaG93dG9fdHlwZSAqIHJlbG9jX2hvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsCisJCQkJCQkJCSAgcmVsb2MpOworCSAgaW50ICAgICAgICAgICAgICAgIHNpemU7CisJICBpbnQgICAgICAgICAgICAgICAgYWRkcmVzczsKKwkgIGZpeFMgKiAgICAgICAgICAgICBmaXhQOworCisJICBpZiAoIXJlbG9jX2hvd3RvKQorCSAgICBhYm9ydCgpOworCSAgCisJICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7CisKKwkgIC8qIFhYWCBUaGlzIHdpbGwgYWJvcnQgb24gYW4gUl9WODUwXzggcmVsb2MgLQorCSAgICAgaXMgdGhpcyByZWxvYyBhY3R1YWxseSB1c2VkID8gKi8KKwkgIGlmIChzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSAKKwkgICAgYWJvcnQgKCk7CisKKwkgIGFkZHJlc3MgPSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSArIGluc25fc2l6ZSAtIHNpemU7CisKKwkgIGlmIChyZWxvYyA9PSBCRkRfUkVMT0NfMzIpCisJICAgIHsKKwkgICAgICBhZGRyZXNzICs9IDI7CisJICAgIH0KKwkgIAorCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgYWRkcmVzcywgc2l6ZSwKKwkJCSAgICAgICYgZml4dXBzW2ldLmV4cCwgCisJCQkgICAgICByZWxvY19ob3d0by0+cGNfcmVsYXRpdmUsCisJCQkgICAgICByZWxvYyk7CisKKwkgIHN3aXRjaCAocmVsb2MpCisJICAgIHsKKwkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKKwkgICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgorCSAgICAgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBmaXhfbmV3X2V4cCAoCisJCSAgICAgICBmcmFnX25vdywKKwkJICAgICAgIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKKwkJICAgICAgICYgZml4dXBzW2ldLmV4cCwKKwkJICAgICAgIDEgLyogRklYTUU6IFY4NTBfT1BFUkFORF9SRUxBVElWRSA/Pz8gKi8sCisJCSAgICAgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSAoZml4dXBzW2ldLm9waW5kZXgKKwkJCQkJCSAgICsgKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKKwkJICAgICAgICk7CisJfQorICAgIH0KKworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlZF9pbnB1dF9saW5lX3BvaW50ZXI7Cit9CisKKworLyogSWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCisvKiB0aGVuIGl0IGlzIGRvbmUgaGVyZS4gICovCisgICAgICAgICAgICAgICAgIAorYXJlbGVudCAqCit0Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKKyAgICAgYXNlY3Rpb24gKiBzZWc7CisgICAgIGZpeFMgKiAgICAgZml4cDsKK3sKKyAgYXJlbGVudCAqIHJlbG9jOworICAKKyAgcmVsb2MgICAgICAgICAgICAgID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7CisgIHJlbG9jLT5zeW1fcHRyX3B0ciA9ICYgZml4cC0+ZnhfYWRkc3ktPmJzeW07CisgIHJlbG9jLT5hZGRyZXNzICAgICA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKKyAgcmVsb2MtPmhvd3RvICAgICAgID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7CisKKyAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCisJCSAgICAoaW50KSBmaXhwLT5meF9yX3R5cGUpOworCisgICAgICB4ZnJlZSAocmVsb2MpOworICAgICAgCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKKyAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpCisgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKKyAgZWxzZQorICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7CisgIAorICByZXR1cm4gcmVsb2M7Cit9CisKKy8qIEFzc3VtZSBldmVyeXRoaW5nIHdpbGwgZml0IGluIHR3byBieXRlcywgdGhlbiBleHBhbmQgYXMgbmVjZXNzYXJ5LiAgKi8KK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCisgICAgIGZyYWdTICogZnJhZ3A7CisgICAgIGFzZWN0aW9uICogc2VnOworeworICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMCkKKyAgICBmcmFncC0+ZnJfdmFyID0gNDsKKyAgZWxzZSBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMikKKyAgICBmcmFncC0+ZnJfdmFyID0gMjsKKyAgZWxzZQorICAgIGFib3J0ICgpOworICByZXR1cm4gMjsKK30gCisKK2xvbmcKK3Y4NTBfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWN0aW9uKQorICAgICBmaXhTICogZml4cDsKKyAgICAgc2VnVCAgIHNlY3Rpb247Cit7CisgIC8qIElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBvciBpbiBhIHNlY3Rpb24gb3RoZXIgdGhhbiBvdXIgb3duLAorICAgICB0aGVuIGxldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLworICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAorICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKKwkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjdGlvbikpKQorICAgIHsKKyAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkL25vdCBpbiBvdXIgc2VjdGlvbi4KKwkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKK30KKworaW50CittZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKKyAgICAgZml4UyAqICAgZml4cDsKKyAgICAgdmFsdWVUICogdmFsdWVwOworICAgICBzZWdUICAgICBzZWc7Cit7CisgIHZhbHVlVCB2YWx1ZTsKKyAgY2hhciAqIHdoZXJlOworCisgIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCisgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKKyAgICB7CisgICAgICBmaXhwLT5meF9kb25lID0gMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKKyAgICB7CisgICAgICB2YWx1ZSA9ICogdmFsdWVwOworICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7CisgICAgfQorICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKKyAgICB2YWx1ZSA9ICogdmFsdWVwOworICBlbHNlCisgICAgeworICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7CisgICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKKwl7CisJICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCisJICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KKwkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCisJCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQorICAgIHsKKyAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBvcGluZGV4OworICAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7CisgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKKworICAgICAgb3BpbmRleCA9IChpbnQpIGZpeHAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7CisgICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBvcGluZGV4IF07CisKKyAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCisgICAgICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLgorCisJIE5vdGUgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIHN0b3JlZCBpbiBsaXR0bGUgZW5kaWFuCisJIGZvcm1hdCEgICovCisgICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKKworICAgICAgaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKKyAgICAgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCisJCQkJICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBOVUxMKTsKKyAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisKKyAgICAgIGlmIChmaXhwLT5meF9kb25lKQorCXsKKwkgIC8qIE5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLiAqLworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uICAKKwkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuICovCisKKyAgICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDIyKQorCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMOworICAgICAgZWxzZSBpZiAob3BlcmFuZC0+Yml0cyA9PSA5KQorCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzlfUENSRUw7CisgICAgICBlbHNlCisJeworCSAgLyogZnByaW50ZiAoc3RkZXJyLCAiYml0czogJWQsIGluc246ICV4XG4iLCBvcGVyYW5kLT5iaXRzLCBpbnNuKTsgKi8KKwkgIAorCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAorCQkgICAgICAgXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKKwkgIGZpeHAtPmZ4X2RvbmUgPSAxOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZml4cC0+ZnhfZG9uZSkKKyAgICB7CisgICAgICAvKiBXZSBzdGlsbCBoYXZlIHRvIGluc2VydCB0aGUgdmFsdWUgaW50byBtZW1vcnkhICAqLworICAgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7CisKKyAgICAgIGlmIChmaXhwLT5meF9zaXplID09IDEpCisJKiB3aGVyZSA9IHZhbHVlICYgMHhmZjsKKyAgICAgIGVsc2UgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKKwliZmRfcHV0bDE2ICh2YWx1ZSAmIDB4ZmZmZiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOworICAgICAgZWxzZSBpZiAoZml4cC0+Znhfc2l6ZSA9PSA0KQorCWJmZF9wdXRsMzIgKHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7CisgICAgfQorICAKKyAgZml4cC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7CisgIHJldHVybiAxOworfQorCisMCisvKiBQYXJzZSBhIGNvbnMgZXhwcmVzc2lvbi4gIFdlIGhhdmUgdG8gaGFuZGxlIGhpKCksIGxvKCksIGV0YworICAgb24gdGhlIHY4NTAuICAqLwordm9pZAorcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAgKGV4cCkKKyAgZXhwcmVzc2lvblMgKmV4cDsKK3sKKyAgLyogU2VlIGlmIHRoZXJlJ3MgYSByZWxvYyBwcmVmaXggbGlrZSBoaSgpIHdlIGhhdmUgdG8gaGFuZGxlLiAgKi8KKyAgaG9sZF9jb25zX3JlbG9jID0gdjg1MF9yZWxvY19wcmVmaXggKE5VTEwpOworCisgIC8qIERvIG5vcm1hbCBleHByZXNzaW9uIHBhcnNpbmcuICAqLworICBleHByZXNzaW9uIChleHApOworfQorCisvKiBDcmVhdGUgYSBmaXh1cCBmb3IgYSBjb25zIGV4cHJlc3Npb24uICBJZiBwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MAorICAgZm91bmQgYSByZWxvYyBwcmVmaXgsIHRoZW4gd2UgdXNlIHRoYXQgcmVsb2MsIGVsc2Ugd2UgY2hvb3NlIGFuCisgICBhcHByb3ByaWF0ZSBvbmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGV4cHJlc3Npb24uICAqLwordm9pZAorY29uc19maXhfbmV3X3Y4NTAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCisgICAgIGZyYWdTICpmcmFnOworICAgICBpbnQgd2hlcmU7CisgICAgIGludCBzaXplOworICAgICBleHByZXNzaW9uUyAqZXhwOworeworICBpZiAoaG9sZF9jb25zX3JlbG9jID09IEJGRF9SRUxPQ19VTlVTRUQpCisgICAgeworICAgICAgaWYgKHNpemUgPT0gNCkKKwlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfMzI7CisgICAgICBpZiAoc2l6ZSA9PSAyKQorCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ18xNjsKKyAgICAgIGlmIChzaXplID09IDEpCisJaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzg7CisgICAgfQorCisgIGlmIChleHAgIT0gTlVMTCkKKyAgICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgMCwgaG9sZF9jb25zX3JlbG9jKTsKKyAgZWxzZQorICAgIGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBOVUxMLCAwLCAwLCBob2xkX2NvbnNfcmVsb2MpOworfQorYm9vbGVhbgordjg1MF9maXhfYWRqdXN0YWJsZSAoZml4UCkKKyAgICBmaXhTICpmaXhQOworeworIAorICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAKKyAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCisgIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCisgICAgcmV0dXJuIDA7CisgIC8qIERvbid0IGFkanVzdCBmdW5jdGlvbiBuYW1lcyAqLworICBpZiAoU19JU19GVU5DVElPTiAoZml4UC0+ZnhfYWRkc3kpKQorICAgIHJldHVybiAwOworCisgIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KKyAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJldHVybiAwOworIAorICByZXR1cm4gMTsKK30KKyAKK2ludAordjg1MF9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQorICAgICAgc3RydWN0IGZpeCAqZml4cDsKK3sKKyAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKKyAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQorICAgIHJldHVybiAxOworIAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdjg1MC5oIGIvZ2FzL2NvbmZpZy90Yy12ODUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkNGQxYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtdjg1MC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIHRjLXY4NTAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdjg1MC5jLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICovCisKKyNkZWZpbmUgVENfVjg1MAorCisjaW5jbHVkZSA8ZWxmL3Y4NTAuaD4KKworI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICNlcnJvciBWODUwIHN1cHBvcnQgcmVxdWlyZXMgQkZEX0FTU0VNQkxFUgorI2VuZGlmCisKKy8qIFRoZSB0YXJnZXQgQkZEIGFyY2hpdGVjdHVyZS4gICovCisjZGVmaW5lIFRBUkdFVF9BUkNIIAkJYmZkX2FyY2hfdjg1MAorCisvKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLworI2RlZmluZSBUQVJHRVRfRk9STUFUIAkJImVsZjMyLXY4NTAiCisKKyNkZWZpbmUgTURfQVBQTFlfRklYMworI2RlZmluZSBtZF9vcGVyYW5kKHgpCisKKyNkZWZpbmUgb2JqX2ZpeF9hZGp1c3RhYmxlKGZpeFApIHY4NTBfZml4X2FkanVzdGFibGUoZml4UCkKKyNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXhwKSB2ODUwX2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKK2V4dGVybiBpbnQgdjg1MF9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOworCisvKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCisKKy8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCisjZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKKworI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgorICAgICAKKy8qIFdlIG5lZWQgdG8gaGFuZGxlIGxvKCksIGhpKCksIGV0YyBldGMgaW4gLmh3b3JkLCAud29yZCwgZXRjCisgICBkaXJlY3RpdmVzLCBzbyB3ZSBoYXZlIHRvIHBhcnNlICJjb25zIiBleHByZXNzaW9ucyBvdXJzZWx2ZXMuICAqLworI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwIChFWFApCisjZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfdjg1MAorZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107CisjZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKKworCisvKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgc21hbGwgZGF0YSBhcmVhIChwb2ludGVkIHRvIGJ5IEdQKS4gICovCisjZGVmaW5lIFNIRl9WODUwX0dQUkVMCQkweDEwMDAwMDAwCisvKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgdGlueSBkYXRhIGFyZWEgKHBvaW50ZWQgdG8gYnkgRVApLiAgKi8KKyNkZWZpbmUgU0hGX1Y4NTBfRVBSRUwJCTB4MjAwMDAwMDAKKy8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSB6ZXJvIGRhdGEgYXJlYSAocG9pbnRlZCB0byBieSBSMCkuICAqLworI2RlZmluZSBTSEZfVjg1MF9SMFJFTAkJMHg0MDAwMDAwMAorCisjZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKKyAgeyAiLnNkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAorICB7ICIucm9zZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArICAgICAgICAgICAgIFNIRl9WODUwX0dQUkVMCX0sIFwKKyAgeyAiLnNic3MiLAlTSFRfTk9CSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAorICB7ICIuc2NvbW1vbiIsCVNIVF9WODUwX1NDT01NT04sIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9HUFJFTAl9LCBcCisgIHsgIi50ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0VQUkVMCX0sIFwKKyAgeyAiLnRic3MiLAlTSFRfTk9CSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfRVBSRUwJfSwgXAorICB7ICIudGNvbW1vbiIsCVNIVF9WODUwX1RDT01NT04sCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKKyAgeyAiLnpkYXRhIiwJU0hUX1BST0dCSVRTLAkJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAorICB7ICIucm96ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArICAgICAgICAgICAgIFNIRl9WODUwX1IwUkVMCX0sIFwKKyAgeyAiLnpic3MiLAlTSFRfTk9CSVRTLAkgIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCisgIHsgIi56Y29tbW9uIiwJU0hUX1Y4NTBfWkNPTU1PTiwgCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKKyAgeyAiLmNhbGxfdGFibGVfZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sCSAgIFwKKyAgeyAiLmNhbGxfdGFibGVfdGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0VYRUNJTlNUUiB9LAorCisjZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihmaXhQLHNlY3Rpb24pIHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhQLCBzZWN0aW9uKQorZXh0ZXJuIGxvbmcgdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24gKCk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXZheC5jIGIvZ2FzL2NvbmZpZy90Yy12YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU0YTliCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy12YXguYwpAQCAtMCwwICsxLDMyNDIgQEAKKy8qIHRjLXZheC5jIC0gdmF4LXNwZWNpZmljIC0KKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYXMuaCIKKworI2luY2x1ZGUgInZheC1pbnN0LmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgkJLyogRm9yIEZSQUdfQVBQRU5EXzFfQ0hBUiBtYWNybyBpbiAiZnJhZ3MuaCIgKi8KKworLyogVGhlc2UgY2hhcnMgc3RhcnQgYSBjb21tZW50IGFueXdoZXJlIGluIGEgc291cmNlIGZpbGUgKGV4Y2VwdCBpbnNpZGUKKyAgIGFub3RoZXIgY29tbWVudCAqLworY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7CisKKy8qIFRoZXNlIGNoYXJzIG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAqLworLyogTm90ZSB0aGF0IGZvciB0aGUgVkFYIHRoZSBhcmUgdGhlIHNhbWUgYXMgY29tbWVudF9jaGFycyBhYm92ZS4gKi8KK2NvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7CisKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOworCisvKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBhcyBpbiAwZjEyMy40NTYgKi8KKy8qIG9yICAgIDBIMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKSAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRGZGZ0doSCI7CisKKy8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKKyAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCisgICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCisKKy8qIEhvbGQgZGV0YWlscyBvZiBhbiBvcGVyYW5kIGV4cHJlc3Npb24gKi8KK3N0YXRpYyBleHByZXNzaW9uUyBleHBfb2Zfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsKK3N0YXRpYyBzZWdUIHNlZ19vZl9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOworCisvKiBBIHZheCBpbnN0cnVjdGlvbiBhZnRlciBkZWNvZGluZy4gKi8KK3N0YXRpYyBzdHJ1Y3Qgdml0IHY7CisKKy8qIEhvbGQgZGV0YWlscyBvZiBiaWcgb3BlcmFuZHMuICovCitMSVRUTEVOVU1fVFlQRSBiaWdfb3BlcmFuZF9iaXRzW1ZJVF9NQVhfT1BFUkFORFNdW1NJWkVfT0ZfTEFSR0VfTlVNQkVSXTsKK0ZMT05VTV9UWVBFIGZsb2F0X29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107CisvKiBBYm92ZSBpcyBtYWRlIHRvIHBvaW50IGludG8gYmlnX29wZXJhbmRfYml0cyBieSBtZF9iZWdpbigpLiAqLworCitpbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCitpbnQgZmxhZ19vbmU7CQkJLyogLTEgKi8KK2ludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCitpbnQgZmxhZ19ub19oYXNoX21peGVkX2Nhc2U7CS8qIC1oIE5VTSAqLworDAorLyoKKyAqIEZvciBWQVgsIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiAianVzdCB0aGUgcmlnaHQgbGVuZ3RoIiBhcmUgZWFzeS4KKyAqIFRoZSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGFsd2F5cyB0aGUgbGFzdCBvcGVyYW5kLCBldmVuIGluCisgKiBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLgorICogRm9yIFZBWCwgd2UgZW5jb2RlIHRoZSByZWxheF9zdWJzdGF0ZVRzIChpbiBlLmcuIGZyX3N1YnN0YXRlKSBhczoKKyAqCisgKgkJICAgIDQgICAgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkgICAgIGJpdCBudW1iZXIKKyAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAqCQl8ICAgICB3aGF0IHN0YXRlID8JfCAgaG93IGxvbmcgPwl8CisgKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgKgorICogVGhlICJob3cgbG9uZyIgYml0cyBhcmUgMDA9Ynl0ZSwgMDE9d29yZCwgMTA9bG9uZy4KKyAqIFRoaXMgaXMgYSBVbip4IGNvbnZlbnRpb24uCisgKiBOb3QgYWxsIGxlbmd0aHMgYXJlIGxlZ2l0IGZvciBhIGdpdmVuIHZhbHVlIG9mICh3aGF0IHN0YXRlKS4KKyAqIFRoZSAiaG93IGxvbmciIHJlZmVycyBtZXJlbHkgdG8gdGhlIGRpc3BsYWNlbWVudCBsZW5ndGguCisgKiBUaGUgYWRkcmVzcyB1c3VhbGx5IGhhcyBzb21lIGNvbnN0YW50IGJ5dGVzIGluIGl0IGFzIHdlbGwuCisgKgorCisgZ3JvdXBzIGZvciBWQVggYWRkcmVzcyByZWxheGluZy4KKworIDEuCSJmb28iIHBjLXJlbGF0aXZlLgorIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nCisKKyAyYS4JSjxjb25kPiB3aGVyZSA8Y29uZD4gaXMgYSBzaW1wbGUgZmxhZyB0ZXN0LgorIGxlbmd0aCBvZiBieXRlLCB3b3JkLCBsb25nLgorIFZBWCBvcGNvZGVzIGFyZToJKEhleCkKKyBibmVxL2JuZXF1CTEyCisgYmVxbC9iZXFsdQkxMworIGJndHIJCTE0CisgYmxlcQkJMTUKKyBiZ2VxCQkxOAorIGJsc3MJCTE5CisgYmd0cnUJCTFhCisgYmxlcXUJCTFiCisgYnZjCQkxYworIGJ2cwkJMWQKKyBiZ2VxdS9iY2MJMWUKKyBibHNzdS9iY3MJMWYKKyBBbHdheXMsIHlvdSBjb21wbGVtZW50IDB0aCBiaXQgdG8gcmV2ZXJzZSBjb25kaXRpb24uCisgQWx3YXlzLCAxLWJ5dGUgb3Bjb2RlLCB0aGVuIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCisKKyAyYi4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGEgbWVtb3J5IGJpdC4KKyBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZy4KKyBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCisgYmJzCQllMAorIGJiYwkJZTEKKyBiYnNzCQllMgorIGJiY3MJCWUzCisgYmJzYwkJZTQKKyBiYmNjCQllNQorIGJic3NpCQllNgorIGJiY2NpCQllNworIEFsd2F5cywgeW91IGNvbXBsZW1lbnQgMHRoIGJpdCB0byByZXZlcnNlIGNvbmRpdGlvbi4KKyBBbHdheXMsIDEtYnl0ZSBvcGNkZSwgbG9uZ3dvcmQtYWRkcmVzcywgYnl0ZS1hZGRyZXNzLCAxLWJ5dGUtZGlzcGxhY2VtZW50CisKKyAyYy4JSjxjb25kPiB3aGVyZSBjb25kIHRlc3RzIGxvdy1vcmRlciBtZW1vcnkgYml0CisgbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgorIFZheCBvcGNvZGVzIGFyZToJKEhleCkKKyBibGJzCQllOAorIGJsYmMJCWU5CisgQWx3YXlzLCB5b3UgY29tcGxlbWVudCAwdGggYml0IHRvIHJldmVyc2UgY29uZGl0aW9uLgorIEFsd2F5cywgMS1ieXRlIG9wY29kZSwgbG9uZ3dvcmQtYWRkcmVzcywgMS1ieXRlIGRpc3BsYWNlbWVudC4KKworIDMuCUpicy9KYnIuCisgbGVuZ3RoIG9mIGJ5dGUsd29yZCxsb25nLgorIFZheCBvcGNvZGVzIGFyZToJKEhleCkKKyBic2JiCQkxMAorIGJyYgkJMTEKKyBUaGVzZSBhcmUgbGlrZSAoMikgYnV0IHRoZXJlIGlzIG5vIGNvbmRpdGlvbiB0byByZXZlcnNlLgorIEFsd2F5cywgMSBieXRlIG9wY29kZSwgdGhlbiBkaXNwbGFjZW1lbnQvYWJzb2x1dGUuCisKKyA0YS4JSmFjYlgKKyBsZW5ndGggb2Ygd29yZCwgbG9uZy4KKyBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCisgYWNidwkJM2QKKyBhY2JmCQk0ZgorIGFjYmQJCTZmCisgYWJjYgkJOWQKKyBhY2JsCQlmMQorIGFjYmcJICAgICAgNGZmZAorIGFjYmgJICAgICAgNmZmZAorIEFsd2F5cywgd2UgY2Fubm90IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2g7IHdlIGhhdmUgYSB3b3JkCisgZGlzcGxhY2VtZW50LgorIFRoZSBkb3VibGUtYnl0ZSBvcC1jb2RlcyBkb24ndCBodXJ0OiB3ZSBuZXZlciB3YW50IHRvIG1vZGlmeSB0aGUKKyBvcGNvZGUsIHNvIHdlIGRvbid0IGNhcmUgaG93IG1hbnkgYnl0ZXMgYXJlIGJldHdlZW4gdGhlIG9wY29kZSBhbmQKKyB0aGUgb3BlcmFuZC4KKworIDRiLglKWG9iWFhYCisgbGVuZ3RoIG9mIGxvbmcsIGxvbmcsIGJ5dGUuCisgVmF4IG9wY29kZXMgYXJlOgkoSGV4KQorIGFvYmxzcwkJZjIKKyBhb2JsZXEJCWYzCisgc29iZ2VxCQlmNAorIHNvYmd0cgkJZjUKKyBBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgYnl0ZQorIGRpc3BsYWNlbWVudC4KKworIFRoZSBvbmx5IHRpbWUgd2UgbmVlZCB0byBtb2RpZnkgdGhlIG9wY29kZSBpcyBmb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMuCisgQWZ0ZXIgcmVsYXgoKSB3ZSBtYXkgY29tcGxlbWVudCB0aGUgbG93ZXN0IG9yZGVyIGJpdCBvZiBzdWNoIGluc3RydWN0aW9uCisgdG8gcmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guCisKKyBGb3IgY2xhc3MgMiBpbnN0cnVjdGlvbnMsIHdlIHN0b3JlIGNvbnRleHQgb2YgIndoZXJlIGlzIHRoZSBvcGNvZGUgbGl0ZXJhbCIuCisgV2UgY2FuIGNoYW5nZSBhbiBvcGNvZGUncyBsb3dlc3Qgb3JkZXIgYml0IHdpdGhvdXQgYnJlYWtpbmcgYW55dGhpbmcgZWxzZS4KKworIFdlIHNvbWV0aW1lcyBzdG9yZSBjb250ZXh0IGluIHRoZSBvcGVyYW5kIGxpdGVyYWwuIFRoaXMgd2F5IHdlIGNhbiBmaWd1cmUgb3V0CisgYWZ0ZXIgcmVsYXgoKSB3aGF0IHRoZSBvcmlnaW5hbCBhZGRyZXNzaW5nIG1vZGUgd2FzLgorICovCisMCisvKiBUaGVzZSBkaXNwbGFjZW1lbnRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKKyAgIGRpc3BsYWNlbWVudC4gIFRoZSBmaXJzdCBsZXR0ZXIgaXMgQnl0ZSwgV29yZC4gIDJuZCBsZXR0ZXIgaXMKKyAgIEZvcndhcmQsIEJhY2t3YXJkLiAqLworI2RlZmluZSBCRiAoMSsgMTI3KQorI2RlZmluZSBCQiAoMSstMTI4KQorI2RlZmluZSBXRiAoMisgMzI3NjcpCisjZGVmaW5lIFdCICgyKy0zMjc2OCkKKy8qIERvbnQgbmVlZCBMRiwgTEIgYmVjYXVzZSB0aGV5IGFsd2F5cyByZWFjaC4gW1RoZXkgYXJlIGNvZGVkIGFzIDAuXSAqLworCisKKyNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCisvKiBUaGlzIG1hY3JvIGhhcyBubyBzaWRlLWVmZmVjdHMuICovCisjZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKKworY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Cit7CisgIHsxLCAxLCAwLCAwfSwJCQkvKiBlcnJvciBzZW50aW5lbCAgIDAsMAkqLworICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAwLDEJKi8KKyAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMCwyCSovCisgIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDAsMwkqLworICB7QkYgKyAxLCBCQiArIDEsIDIsIEMgKDEsIDEpfSwvKiBCXiJmb28iCSAgICAxLDAgKi8KKyAge1dGICsgMSwgV0IgKyAxLCAzLCBDICgxLCAyKX0sLyogV14iZm9vIgkgICAgMSwxICovCisgIHswLCAwLCA1LCAwfSwJCQkvKiBMXiJmb28iCSAgICAxLDIgKi8KKyAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMSwzICovCisgIHtCRiwgQkIsIDEsIEMgKDIsIDEpfSwJLyogYjxjb25kPiBCXiJmb28iICAyLDAgKi8KKyAge1dGICsgMiwgV0IgKyAyLCA0LCBDICgyLCAyKX0sLyogYnIuKz8gYnJ3IFgJICAgIDIsMSAqLworICB7MCwgMCwgNywgMH0sCQkJLyogYnIuKz8gam1wIFgJICAgIDIsMiAqLworICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAyLDMgKi8KKyAge0JGLCBCQiwgMSwgQyAoMywgMSl9LAkvKiBicmIgQl5mb28JICAgIDMsMCAqLworICB7V0YsIFdCLCAyLCBDICgzLCAyKX0sCS8qIGJydyBXXmZvbwkgICAgMywxICovCisgIHswLCAwLCA1LCAwfSwJCQkvKiBKbXAgTF5mb28JICAgIDMsMiAqLworICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAzLDMgKi8KKyAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgNCwwICovCisgIHtXRiwgV0IsIDIsIEMgKDQsIDIpfSwJLyogYWNiXyBeV2ZvbwkgICAgNCwxICovCisgIHswLCAwLCAxMCwgMH0sCQkvKiBhY2JfLGJyLGptcCBMXmZvbzQsMiAqLworICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICA0LDMgKi8KKyAge0JGLCBCQiwgMSwgQyAoNSwgMSl9LAkvKiBYb2JfX18sLGZvbyAgICAgIDUsMCAqLworICB7V0YgKyA0LCBXQiArIDQsIDYsIEMgKDUsIDIpfSwvKiBYb2IuKzIsYnJiLiszLGJydzUsMSAqLworICB7MCwgMCwgOSwgMH0sCQkJLyogWG9iLisyLGJyYi4rNixqbXA1LDIgKi8KK307CisKKyN1bmRlZiBDCisjdW5kZWYgQkYKKyN1bmRlZiBCQgorI3VuZGVmIFdGCisjdW5kZWYgV0IKKwordm9pZCBmbG9hdF9jb25zICgpOworCitjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQoreworICB7ImRmbG9hdCIsIGZsb2F0X2NvbnMsICdkJ30sCisgIHsiZmZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKKyAgeyJnZmxvYXQiLCBmbG9hdF9jb25zLCAnZyd9LAorICB7ImhmbG9hdCIsIGZsb2F0X2NvbnMsICdoJ30sCisgIHswfSwKK307CisKKyNkZWZpbmUgU1RBVEVfUENfUkVMQVRJVkUJCSgxKQorI2RlZmluZSBTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gJKDIpCisjZGVmaW5lIFNUQVRFX0FMV0FZU19CUkFOQ0gJCSgzKQkvKiBpbmNsdWRlcyBCU0IuLi4gKi8KKyNkZWZpbmUgU1RBVEVfQ09NUExFWF9CUkFOQ0gJICAgICAgICAoNCkKKyNkZWZpbmUgU1RBVEVfQ09NUExFWF9IT1AJCSg1KQorCisjZGVmaW5lIFNUQVRFX0JZVEUJCQkoMCkKKyNkZWZpbmUgU1RBVEVfV09SRAkJCSgxKQorI2RlZmluZSBTVEFURV9MT05HCQkJKDIpCisjZGVmaW5lIFNUQVRFX1VOREYJCQkoMykJLyogU3ltYm9sIHVuZGVmaW5lZCBpbiBwYXNzMSAqLworCisKKyNkZWZpbmUgbWluKGEsIGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKK2ludCBmbG9udW1fZ2VuMnZheCBQQVJBTVMgKChjaGFyIGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKKwkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7CitzdGF0aWMgY29uc3QgY2hhciAqdmlwX2JlZ2luIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCQkJICAgICAgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCB2aXBfb3BfZGVmYXVsdHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIHZvaWQgdmlwX29wIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IHZvcCAqKSk7CitzdGF0aWMgdm9pZCB2aXAgUEFSQU1TICgoc3RydWN0IHZpdCAqLCBjaGFyICopKTsKKwordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgY29uc3QgY2hhciAqZXJydHh0OworICBGTE9OVU1fVFlQRSAqZlA7CisgIGludCBpOworCisgIGlmICgoZXJydHh0ID0gdmlwX2JlZ2luICgxLCAiJCIsICIqIiwgImAiKSkgIT0gMCkKKyAgICB7CisgICAgICBhc19mYXRhbCAoXygiVklQX0JFR0lOIGVycm9yOiVzIiksIGVycnR4dCk7CisgICAgfQorCisgIGZvciAoaSA9IDAsIGZQID0gZmxvYXRfb3BlcmFuZDsKKyAgICAgICBmUCA8IGZsb2F0X29wZXJhbmQgKyBWSVRfTUFYX09QRVJBTkRTOworICAgICAgIGkrKywgZlArKykKKyAgICB7CisgICAgICBmUC0+bG93ID0gJmJpZ19vcGVyYW5kX2JpdHNbaV1bMF07CisgICAgICBmUC0+aGlnaCA9ICZiaWdfb3BlcmFuZF9iaXRzW2ldW1NJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMV07CisgICAgfQorfQorDAordm9pZAorbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpCisgICAgIGNoYXIgY29uW107CisgICAgIHZhbHVlVCB2YWx1ZTsKKyAgICAgaW50IG5ieXRlczsKK3sKKyAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoY29uLCB2YWx1ZSwgbmJ5dGVzKTsKK30KKworLyogRml4IHVwIHNvbWUgZGF0YSBvciBpbnN0cnVjdGlvbnMgYWZ0ZXIgd2UgZmluZCBvdXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sCisgICB0aGF0IHRoZXkgcmVmZXJlbmNlLiAgKi8KKwordm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLworbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZSkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgbG9uZyB2YWx1ZTsKK3sKKyAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsLAorCQkJCSh2YWx1ZVQpIHZhbHVlLCBmaXhQLT5meF9zaXplKTsKK30KKworbG9uZworbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKKyAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLworICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KK3sKKyAgbG9uZyByZXR2YWw7CisgIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKKyAgICB7CisgICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7CisgICAgICByZXR2YWwgfD0gKmNvbjsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisMCisvKiB2YXg6bWRfYXNzZW1ibGUoKSBlbWl0IGZyYWdzIGZvciAxIGluc3RydWN0aW9uICovCisKK3ZvaWQKK21kX2Fzc2VtYmxlIChpbnN0cnVjdGlvbl9zdHJpbmcpCisgICAgIGNoYXIgKmluc3RydWN0aW9uX3N0cmluZzsJLyogQSBzdHJpbmc6IGFzc2VtYmxlIDEgaW5zdHJ1Y3Rpb24uICovCit7CisgIC8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgZXhwcmVzc2lvbidzIHNlZ21lbnQgaXMgbm90IGtub3duIHlldC4gKi8KKyAgaW50IGlzX3VuZGVmaW5lZDsKKworICBpbnQgbGVuZ3RoX2NvZGU7CisgIGNoYXIgKnA7CisgIC8qIEFuIG9wZXJhbmQuIFNjYW5zIGFsbCBvcGVyYW5kcy4gKi8KKyAgc3RydWN0IHZvcCAqb3BlcmFuZFA7CisgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOworCQkJLyogV2hhdCB1c2VkIHRvIGxpdmUgYWZ0ZXIgYW4gZXhwcmVzc2lvbi4gKi8KKyAgY2hhciBjX3NhdmU7CisgIC8qIDE6IGluc3RydWN0aW9uX3N0cmluZyBiYWQgZm9yIGFsbCBwYXNzZXMuICovCisgIGludCBnb29mZWQ7CisgIC8qIFBvaW50cyB0byBzbG90IGp1c3QgYWZ0ZXIgbGFzdCBvcGVyYW5kLiAgKi8KKyAgc3RydWN0IHZvcCAqZW5kX29wZXJhbmRQOworICAvKiBQb2ludHMgdG8gZXhwcmVzc2lvbiB2YWx1ZXMgZm9yIHRoaXMgb3BlcmFuZC4gICovCisgIGV4cHJlc3Npb25TICpleHBQOworICBzZWdUICpzZWdQOworCisgIC8qIFRoZXNlIHJlZmVyIHRvIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgZXhwcmVzc2lvbi4gKi8KKyAgLyogVGFyZ2V0IHNlZ21lbnQgb2YgdGhlIGFkZHJlc3MuCSAqLworICBzZWdUIHRvX3NlZzsKKyAgdmFsdWVUIHRoaXNfYWRkX251bWJlcjsKKyAgLyogUG9zaXRpdmUgKG1pbnVlbmQpIHN5bWJvbC4gKi8KKyAgc3RydWN0IHN5bWJvbCAqdGhpc19hZGRfc3ltYm9sOworICAvKiBBcyBhIG51bWJlci4gKi8KKyAgbG9uZyBvcGNvZGVfYXNfbnVtYmVyOworICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdC4gKi8KKyAgY2hhciAqb3Bjb2RlX2FzX2NoYXJzOworICAvKiBBcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAqLworICAvKiBMZWFzdCBzaWduaWZpY2FudCBieXRlIDFzdCAqLworICBjaGFyICpvcGNvZGVfbG93X2J5dGVQOworICAvKiBsZW5ndGggKGJ5dGVzKSBtZWFudCBieSB2b3Bfc2hvcnQuICovCisgIGludCBsZW5ndGg7CisgIC8qIDAsIG9yIDEgaWYgJ0AnIGlzIGluIGFkZHJlc3NpbmcgbW9kZS4gKi8KKyAgaW50IGF0OworICAvKiBGcm9tIHZvcF9uYnl0ZXM6IHZheF9vcGVyYW5kX3dpZHRoIChpbiBieXRlcykgKi8KKyAgaW50IG5ieXRlczsKKyAgRkxPTlVNX1RZUEUgKmZsb2F0UDsKKyAgTElUVExFTlVNX1RZUEUgbGl0ZXJhbF9mbG9hdFs4XTsKKyAgLyogQmlnIGVub3VnaCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuICovCisKKyAgdmlwICgmdiwgaW5zdHJ1Y3Rpb25fc3RyaW5nKTsKKworICAvKgorICAgKiBOb3cgd2UgdHJ5IHRvIGZpbmQgYXMgbWFueSBhc193YXJuKClzIGFzIHdlIGNhbi4gSWYgd2UgZG8gYW55IGFzX3dhcm4oKXMKKyAgICogdGhlbiBnb29mZWQ9MS4gTm90aWNlIHRoYXQgd2UgZG9uJ3QgbWFrZSBhbnkgZnJhZ3MgeWV0LgorICAgKiBTaG91bGQgZ29vZmVkIGJlIDEsIHRoZW4gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHdlZGdlIGluIGFueSBwYXNzLAorICAgKiBhbmQgd2UgY2FuIHNhZmVseSBmbHVzaCBpdCwgd2l0aG91dCBjYXVzaW5nIGludGVycGFzcyBzeW1ib2wgcGhhc2UKKyAgICogZXJyb3JzLiBUaGF0IGlzLCB3aXRob3V0IGNoYW5naW5nIGxhYmVsIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFzc2VzLgorICAgKi8KKyAgaWYgKChnb29mZWQgPSAoKnYudml0X2Vycm9yKSkgIT0gMCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIpLCB2LnZpdF9lcnJvcik7CisgICAgfQorICAvKgorICAgKiBXZSBuZWVkIHRvIHVzZSBleHByZXNzaW9uKCkgYW5kIGZyaWVuZHMsIHdoaWNoIHJlcXVpcmUgdXMgdG8gZGlkZGxlCisgICAqIGlucHV0X2xpbmVfcG9pbnRlci4gU28gd2Ugc2F2ZSBpdCBhbmQgcmVzdG9yZSBpdCBsYXRlci4KKyAgICovCisgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOworICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKKyAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCisgICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAorICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCisgICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOworCisgICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7CisKKyAgICAgICBvcGVyYW5kUCsrLCBleHBQKyssIHNlZ1ArKywgZmxvYXRQKyspCisgICAgewkJCQkvKiBmb3IgZWFjaCBvcGVyYW5kICovCisgICAgICBpZiAob3BlcmFuZFAtPnZvcF9lcnJvcikKKwl7CisJICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgYmVjYXVzZSBcIiVzXCIiKSwgb3BlcmFuZFAtPnZvcF9lcnJvcik7CisJICBnb29mZWQgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBzdGF0ZW1lbnQgaGFzIG5vIHN5bnRheCBnb29mczogbGV0cyBzbmlmZiB0aGUgZXhwcmVzc2lvbiAqLworCSAgaW50IGNhbl9iZV9zaG9ydCA9IDA7CS8qIDEgaWYgYSBiaWdudW0gY2FuIGJlIHJlZHVjZWQgdG8gYSBzaG9ydCBsaXRlcmFsLiAqLworCisJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcGVyYW5kUC0+dm9wX2V4cHJfYmVnaW47CisJICBjX3NhdmUgPSBvcGVyYW5kUC0+dm9wX2V4cHJfZW5kWzFdOworCSAgb3BlcmFuZFAtPnZvcF9leHByX2VuZFsxXSA9ICdcMCc7CisJICAvKiBJZiB0b19zZWcgPT0gU0VHX1BBU1MxLCBleHByZXNzaW9uKCkgd2lsbCBoYXZlIHNldCBuZWVkX3Bhc3NfMiA9IDEuICovCisJICAqc2VnUCA9IGV4cHJlc3Npb24gKGV4cFApOworCSAgc3dpdGNoIChleHBQLT5YX29wKQorCSAgICB7CisJICAgIGNhc2UgT19hYnNlbnQ6CisJICAgICAgLyogZm9yIEJTRDQuMiBjb21wYXRpYmlsaXR5LCBtaXNzaW5nIGV4cHJlc3Npb24gaXMgYWJzb2x1dGUgMCAqLworCSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OworCSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7CisJICAgICAgLyogRm9yIFNFR19BQlNPTFVURSwgd2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IFhfb3Bfc3ltYm9sLAorCQkgWF9hZGRfc3ltYm9sIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAgQnV0LCB3ZSB3aWxsIHByb2dyYW0KKwkJIGRlZmVuc2l2ZWx5LiBTaW5jZSB0aGlzIHNpdHVhdGlvbiBvY2N1cnMgcmFyZWx5IHNvIGl0IGNvc3RzCisJCSB1cyBsaXR0bGUgdG8gZG8sIGFuZCBzdG9wcyBEZWFuIHdvcnJ5aW5nIGFib3V0IHRoZSBvcmlnaW4gb2YKKwkJIHJhbmRvbSBiaXRzIGluIGV4cHJlc3Npb25TJ3MuICAqLworCSAgICAgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7CisJICAgICAgZXhwUC0+WF9vcF9zeW1ib2wgPSBOVUxMOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgT19zeW1ib2w6CisJICAgIGNhc2UgT19jb25zdGFudDoKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qCisJICAgICAgICogTWFqb3IgYnVnLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGNhc2Ugb2YgYQorCSAgICAgICAqIFNFR19PUCBleHByZXNzaW9uIGluIGEgVklUX09QQ09ERV9TWU5USEVUSUMKKwkgICAgICAgKiB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb24uCisJICAgICAgICogV2UgZG9uJ3QgaGF2ZSBhIGZyYWcgdHlwZSB0aGF0IGlzIHNtYXJ0IGVub3VnaCB0bworCSAgICAgICAqIHJlbGF4IGEgU0VHX09QLCBhbmQgc28gd2UganVzdCBmb3JjZSBhbGwKKwkgICAgICAgKiBTRUdfT1BzIHRvIGJlaGF2ZSBsaWtlIFNFR19QQVNTMXMuCisJICAgICAgICogQ2xlYXJseSwgaWYgdGhlcmUgaXMgYSBkZW1hbmQgd2UgY2FuIGludmVudCBhIG5ldyBvcgorCSAgICAgICAqIG1vZGlmaWVkIGZyYWcgdHlwZSBhbmQgdGhlbiBjb2RpbmcgdXAgYSBmcmFnIGZvciB0aGlzCisJICAgICAgICogY2FzZSB3aWxsIGJlIGVhc3kuIFNFR19PUCB3YXMgaW52ZW50ZWQgZm9yIHRoZQorCSAgICAgICAqIC53b3JkcyBhZnRlciBhIENBU0Ugb3Bjb2RlLCBhbmQgd2FzIG5ldmVyIGludGVuZGVkIGZvcgorCSAgICAgICAqIGluc3RydWN0aW9uIG9wZXJhbmRzLgorCSAgICAgICAqLworCSAgICAgIG5lZWRfcGFzc18yID0gMTsKKwkgICAgICBhc193YXJuIChfKCJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIikpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgT19iaWc6CisJICAgICAgLyogUHJlc2VydmUgdGhlIGJpdHMuICovCisJICAgICAgaWYgKGV4cFAtPlhfYWRkX251bWJlciA+IDApCisJCXsKKwkJICBiaWdudW1fY29weSAoZ2VuZXJpY19iaWdudW0sIGV4cFAtPlhfYWRkX251bWJlciwKKwkJCSAgICAgICBmbG9hdFAtPmxvdywgU0laRV9PRl9MQVJHRV9OVU1CRVIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAga25vdyAoZXhwUC0+WF9hZGRfbnVtYmVyIDwgMCk7CisJCSAgZmxvbnVtX2NvcHkgKCZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciwKKwkJCSAgICAgICBmbG9hdFApOworCQkgIGlmIChzdHJjaHIgKCJzIGkiLCBvcGVyYW5kUC0+dm9wX3Nob3J0KSkKKwkJICAgIHsKKwkJICAgICAgLyogQ291bGQgcG9zc2libHkgYmVjb21lIFNeIyAqLworCQkgICAgICBmbG9udW1fZ2VuMnZheCAoLWV4cFAtPlhfYWRkX251bWJlciwgZmxvYXRQLCBsaXRlcmFsX2Zsb2F0KTsKKwkJICAgICAgc3dpdGNoICgtZXhwUC0+WF9hZGRfbnVtYmVyKQorCQkJeworCQkJY2FzZSAnZic6CisJCQkgIGNhbl9iZV9zaG9ydCA9CisJCQkgICAgKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZDMEYpID09IDB4NDAwMAorCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMV0gPT0gMDsKKwkJCSAgYnJlYWs7CisKKwkJCWNhc2UgJ2QnOgorCQkJICBjYW5fYmVfc2hvcnQgPQorCQkJICAgIChsaXRlcmFsX2Zsb2F0WzBdICYgMHhGQzBGKSA9PSAweDQwMDAKKwkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzFdID09IDAKKwkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzJdID09IDAKKwkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzNdID09IDA7CisJCQkgIGJyZWFrOworCisJCQljYXNlICdnJzoKKwkJCSAgY2FuX2JlX3Nob3J0ID0KKwkJCSAgICAobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkY4MSkgPT0gMHg0MDAwCisJCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsxXSA9PSAwCisJCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCisJCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwOworCQkJICBicmVhazsKKworCQkJY2FzZSAnaCc6CisJCQkgIGNhbl9iZV9zaG9ydCA9ICgobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkZGOCkgPT0gMHg0MDAwCisJCQkJCSAgJiYgKGxpdGVyYWxfZmxvYXRbMV0gJiAweEUwMDApID09IDAKKwkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzJdID09IDAKKwkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzNdID09IDAKKwkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzRdID09IDAKKwkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzVdID09IDAKKwkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzZdID09IDAKKwkJCQkJICAmJiBsaXRlcmFsX2Zsb2F0WzddID09IDApOworCQkJICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCSAgQkFEX0NBU0UgKC1leHBQLT5YX2FkZF9udW1iZXIpOworCQkJICBicmVhazsKKwkJCX0JLyogc3dpdGNoIChmbG9hdCB0eXBlKSAqLworCQkgICAgfQkJLyogaWYgKGNvdWxkIHdhbnQgdG8gYmVjb21lIFNeIy4uLikgKi8KKwkJfQkJLyogYmlnbnVtIG9yIGZsb251bSA/ICovCisKKwkgICAgICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAncycKKwkJICB8fCBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdpJworCQkgIHx8IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJworCQkgICAgICAmJiBvcGVyYW5kUC0+dm9wX3JlZyA9PSAweEYKKwkJICAgICAgJiYgKG9wZXJhbmRQLT52b3BfbW9kZSAmIDB4RSkgPT0gMHg4KSkKKwkJeworCQkgIC8qIFNhdyBhICcjJy4gKi8KKwkJICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCisJCSAgICB7CisJCSAgICAgIC8qIFdlIG11c3QgY2hvc2UgU14gb3IgSV4uICovCisJCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQorCQkJeworCQkJICAvKiBCaWdudW06IFNob3J0IGxpdGVyYWwgaW1wb3NzaWJsZS4gKi8KKwkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKKwkJCSAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKKwkJCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICAvKiBGbG9udW06IFRyeSB0byBkbyBpdC4gKi8KKwkJCSAgaWYgKGNhbl9iZV9zaG9ydCkKKwkJCSAgICB7CisJCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ3MnOworCQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gMDsKKwkJCSAgICAgIG9wZXJhbmRQLT52b3BfbmR4ID0gLTE7CisJCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IC0xOworCQkJICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKKwkJCSAgICAgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7CisJCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsJLyogVkFYIFBDICovCisJCQkgICAgfQorCQkJfQkvKiBiaWdudW0gb3IgZmxvbnVtID8gKi8KKwkJICAgIH0JCS8qICBpZiAjLCBidXQgbm8gU14gb3IgSV4gc2Vlbi4gKi8KKwkJICAvKiBObyBtb3JlICcgJyBjYXNlOiBlaXRoZXIgJ3MnIG9yICdpJy4gKi8KKwkJICBpZiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAncycpCisJCSAgICB7CisJCSAgICAgIC8qIFdhbnRzIHRvIGJlIGEgc2hvcnQgbGl0ZXJhbC4gKi8KKwkJICAgICAgaWYgKGV4cFAtPlhfYWRkX251bWJlciA+IDApCisJCQl7CisJCQkgIGFzX3dhcm4gKF8oIkJpZ251bSBub3QgcGVybWl0dGVkIGluIHNob3J0IGxpdGVyYWwuIEltbWVkaWF0ZSBtb2RlIGFzc3VtZWQuIikpOworCQkJICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOworCQkJICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OworCQkJICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsJLyogVkFYIFBDLiAqLworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGlmICghY2FuX2JlX3Nob3J0KQorCQkJICAgIHsKKwkJCSAgICAgIGFzX3dhcm4gKF8oIkNhbid0IGRvIGZsb251bSBzaG9ydCBsaXRlcmFsOiBpbW1lZGlhdGUgbW9kZSB1c2VkLiIpKTsKKwkJCSAgICAgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7CisJCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OworCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CS8qIEVuY29kZSBzaG9ydCBsaXRlcmFsIG5vdy4gKi8KKwkJCSAgICAgIGludCB0ZW1wID0gMDsKKworCQkJICAgICAgc3dpdGNoICgtZXhwUC0+WF9hZGRfbnVtYmVyKQorCQkJCXsKKwkJCQljYXNlICdmJzoKKwkJCQljYXNlICdkJzoKKwkJCQkgIHRlbXAgPSBsaXRlcmFsX2Zsb2F0WzBdID4+IDQ7CisJCQkJICBicmVhazsKKworCQkJCWNhc2UgJ2cnOgorCQkJCSAgdGVtcCA9IGxpdGVyYWxfZmxvYXRbMF0gPj4gMTsKKwkJCQkgIGJyZWFrOworCisJCQkJY2FzZSAnaCc6CisJCQkJICB0ZW1wID0gKChsaXRlcmFsX2Zsb2F0WzBdIDw8IDMpICYgMDcwKQorCQkJCSAgICB8ICgobGl0ZXJhbF9mbG9hdFsxXSA+PiAxMykgJiAwNyk7CisJCQkJICBicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJICBCQURfQ0FTRSAoLWV4cFAtPlhfYWRkX251bWJlcik7CisJCQkJICBicmVhazsKKwkJCQl9CisKKwkJCSAgICAgIGZsb2F0UC0+bG93WzBdID0gdGVtcCAmIDA3NzsKKwkJCSAgICAgIGZsb2F0UC0+bG93WzFdID0gMDsKKwkJCSAgICB9CS8qIGlmIGNhbiBiZSBzaG9ydCBsaXRlcmFsIGZsb2F0ICovCisJCQl9CS8qIGZsb251bSBvciBiaWdudW0gPyAqLworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsJCS8qIEleIyBzZWVuOiBzZXQgaXQgdXAgaWYgZmxvYXQuICovCisJCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPCAwKQorCQkJeworCQkJICBtZW1jcHkgKGZsb2F0UC0+bG93LCBsaXRlcmFsX2Zsb2F0LCBzaXplb2YgKGxpdGVyYWxfZmxvYXQpKTsKKwkJCX0KKwkJICAgIH0JCS8qIGlmIFNeIyBzZWVuLiAqLworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgYXNfd2FybiAoXygiQSBiaWdudW0vZmxvbnVtIG1heSBub3QgYmUgYSBkaXNwbGFjZW1lbnQ6IDB4JWx4IHVzZWQiKSwKKwkJCSAgIChleHBQLT5YX2FkZF9udW1iZXIgPSAweDgwMDAwMDAwTCkpOworCQkgIC8qIENob3NlbiBzbyBsdXNlciBnZXRzIHRoZSBtb3N0IG9mZnNldCBiaXRzIHRvIHBhdGNoIGxhdGVyLiAqLworCQl9CisJICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gZmxvYXRQLT5sb3dbMF0KKwkJfCAoKExJVFRMRU5VTV9NQVNLICYgKGZsb2F0UC0+bG93WzFdKSkgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKKwkgICAgICAvKgorCSAgICAgICAqIEZvciB0aGUgT19iaWcgY2FzZSB3ZSBoYXZlOgorCSAgICAgICAqIElmIHZvcF9zaG9ydCA9PSAncycgdGhlbiBhIHNob3J0IGZsb2F0aW5nIGxpdGVyYWwgaXMgaW4gdGhlCisJICAgICAgICoJbG93ZXN0IDYgYml0cyBvZiBmbG9hdFAgLT4gbG93IFswXSwgd2hpY2ggaXMKKwkgICAgICAgKgliaWdfb3BlcmFuZF9iaXRzIFstLS1dIFswXS4KKwkgICAgICAgKiBJZiB2b3Bfc2hvcnQgPT0gJ2knIHRoZW4gdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBlbGVtZW50cworCSAgICAgICAqCW9mIGJpZ19vcGVyYW5kX2JpdHMgWy0tLV0gWy4uLl0gYXJlIHNldCB1cCB3aXRoIHRoZSBjb3JyZWN0CisJICAgICAgICoJYml0cy4KKwkgICAgICAgKiBBbHNvLCBqdXN0IGluIGNhc2Ugd2lkdGggaXMgYnl0ZSB3b3JkIG9yIGxvbmcsIHdlIGNvcHkgdGhlIGxvd2VzdAorCSAgICAgICAqIDMyIGJpdHMgb2YgdGhlIG51bWJlciB0byBYX2FkZF9udW1iZXIuCisJICAgICAgICovCisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gb3BlcmFuZFAtPnZvcF9leHByX2VuZCArIDEpCisJICAgIHsKKwkgICAgICBhc193YXJuICgiSnVuayBhdCBlbmQgb2YgZXhwcmVzc2lvbiBcIiVzXCIiLCBpbnB1dF9saW5lX3BvaW50ZXIpOworCSAgICAgIGdvb2ZlZCA9IDE7CisJICAgIH0KKwkgIG9wZXJhbmRQLT52b3BfZXhwcl9lbmRbMV0gPSBjX3NhdmU7CisJfQorICAgIH0JCQkJLyogZm9yKGVhY2ggb3BlcmFuZCkgKi8KKworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKKworICBpZiAobmVlZF9wYXNzXzIgfHwgZ29vZmVkKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKworICAvKiBFbWl0IG9wLWNvZGUuICovCisgIC8qIFJlbWVtYmVyIHdoZXJlIGl0IGlzLCBpbiBjYXNlIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBvcC1jb2RlIGxhdGVyLiAqLworICBvcGNvZGVfbG93X2J5dGVQID0gZnJhZ19tb3JlICh2LnZpdF9vcGNvZGVfbmJ5dGVzKTsKKyAgbWVtY3B5IChvcGNvZGVfbG93X2J5dGVQLCB2LnZpdF9vcGNvZGUsIHYudml0X29wY29kZV9uYnl0ZXMpOworICBvcGNvZGVfYXNfbnVtYmVyID0gbWRfY2hhcnNfdG9fbnVtYmVyIChvcGNvZGVfYXNfY2hhcnMgPSB2LnZpdF9vcGNvZGUsIDQpOworICBmb3IgKG9wZXJhbmRQID0gdi52aXRfb3BlcmFuZCwKKyAgICAgICBleHBQID0gZXhwX29mX29wZXJhbmQsCisgICAgICAgc2VnUCA9IHNlZ19vZl9vcGVyYW5kLAorICAgICAgIGZsb2F0UCA9IGZsb2F0X29wZXJhbmQsCisgICAgICAgZW5kX29wZXJhbmRQID0gdi52aXRfb3BlcmFuZCArIHYudml0X29wZXJhbmRzOworCisgICAgICAgb3BlcmFuZFAgPCBlbmRfb3BlcmFuZFA7CisKKyAgICAgICBvcGVyYW5kUCsrLAorICAgICAgIGZsb2F0UCsrLAorICAgICAgIHNlZ1ArKywKKyAgICAgICBleHBQKyspCisgICAgeworICAgICAgaWYgKG9wZXJhbmRQLT52b3BfbmR4ID49IDApCisJeworCSAgLyogaW5kZXhlZCBhZGRyZXNzaW5nIGJ5dGUgKi8KKwkgIC8qIExlZ2FsaXR5IG9mIGluZGV4ZWQgbW9kZSBhbHJlYWR5IGNoZWNrZWQ6IGl0IGlzIE9LICovCisJICBGUkFHX0FQUEVORF8xX0NIQVIgKDB4NDAgKyBvcGVyYW5kUC0+dm9wX25keCk7CisJfQkJCS8qIGlmKHZvcF9uZHg+PTApICovCisKKyAgICAgIC8qIEhlcmUgdG8gbWFrZSBtYWluIG9wZXJhbmQgZnJhZyhzKS4gKi8KKyAgICAgIHRoaXNfYWRkX251bWJlciA9IGV4cFAtPlhfYWRkX251bWJlcjsKKyAgICAgIHRoaXNfYWRkX3N5bWJvbCA9IGV4cFAtPlhfYWRkX3N5bWJvbDsKKyAgICAgIHRvX3NlZyA9ICpzZWdQOworICAgICAgaXNfdW5kZWZpbmVkID0gKHRvX3NlZyA9PSBTRUdfVU5LTk9XTik7CisgICAgICBhdCA9IG9wZXJhbmRQLT52b3BfbW9kZSAmIDE7CisgICAgICBsZW5ndGggPSAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnYicKKwkJPyAxIDogKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3cnCisJCSAgICAgICA/IDIgOiAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnbCcKKwkJCSAgICAgID8gNCA6IDApKSk7CisgICAgICBuYnl0ZXMgPSBvcGVyYW5kUC0+dm9wX25ieXRlczsKKyAgICAgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYicpCisJeworCSAgaWYgKHRvX3NlZyA9PSBub3dfc2VnIHx8IGlzX3VuZGVmaW5lZCkKKwkgICAgeworCSAgICAgIC8qIElmIGlzX3VuZGVmaW5lZCwgdGhlbiBpdCBtaWdodCBCRUNPTUUgbm93X3NlZy4gKi8KKwkgICAgICBpZiAobmJ5dGVzKQorCQl7CisJCSAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKKwkJICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsCisJCQkgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOworCQl9CisJICAgICAgZWxzZQorCQl7CQkvKiB0b19zZWc9PW5vd19zZWcgfHwgdG9fc2VnID09IFNFR19VTktOT1dOICovCisJCSAgLyogbmJ5dGVzPT0wICovCisJCSAgbGVuZ3RoX2NvZGUgPSBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURTsKKwkJICBpZiAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1BFQ0lBTCkKKwkJICAgIHsKKwkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCkKKwkJCXsKKwkJCSAgLyogYnIgb3IganNiICovCisJCQkgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMSwKKwkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKKwkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCQkJICAgIG9wY29kZV9sb3dfYnl0ZVApOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCisJCQkgICAgeworCQkJICAgICAgbGVuZ3RoX2NvZGUgPSBTVEFURV9XT1JEOworCQkJICAgICAgLyogSkY6IFRoZXJlIGlzIG5vIHN0YXRlX2J5dGUgZm9yIHRoaXMgb25lISAqLworCQkJICAgICAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKKwkJCQkJRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgbGVuZ3RoX2NvZGUpLAorCQkJCQl0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKKwkJCQkJb3Bjb2RlX2xvd19ieXRlUCk7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKKwkJCSAgICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOSwgMSwKKwkJCSAgICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIGxlbmd0aF9jb2RlKSwKKwkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCQkJCW9wY29kZV9sb3dfYnl0ZVApOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVApOworCQkgICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDcsIDEsCisJCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgbGVuZ3RoX2NvZGUpLAorCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAorCQkJCW9wY29kZV9sb3dfYnl0ZVApOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBTRUdfVU5LTk9XTiAqLworCSAgICAgIC8qCisJICAgICAgICogLS0tIFNFRyBGTE9BVCBNQVkgQVBQRUFSIEhFUkUgLS0tLQorCSAgICAgICAqLworCSAgICAgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQorCQl7CisJCSAgaWYgKG5ieXRlcykKKwkJICAgIHsKKwkJICAgICAga25vdyAoIShvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpKTsKKwkJICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKKwkJICAgICAgLyogQ29udmVudGlvbmFsIHJlbG9jYXRpb24uICovCisJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkgICAgICAgbmJ5dGVzLCAmYWJzX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAorCQkJICAgICAgIDEsIE5PX1JFTE9DKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGtub3cgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NZTlRIRVRJQyk7CisJCSAgICAgIGlmIChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TUEVDSUFMKQorCQkJeworCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QKQorCQkJICAgIHsKKwkJCSAgICAgIC8qIGJyIG9yIGpzYiAqLworCQkJICAgICAgKm9wY29kZV9sb3dfYnl0ZVAgPSBvcGNvZGVfYXNfY2hhcnNbMF0gKyBWQVhfV0lERU5fTE9ORzsKKwkJCSAgICAgIGtub3cgKG9wY29kZV9hc19jaGFyc1sxXSA9PSAwKTsKKwkJCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOworCQkJICAgICAgcFswXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLworCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKKwkJCSAgICAgIC8qIE5vdyAoZWcpIEpNUCBAI2ZvbyBvciBKU0IgQCNmb28uICovCisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1dPUkRfSlVNUCkKKwkJCQl7CisJCQkJICBwID0gZnJhZ19tb3JlICgxMCk7CisJCQkJICBwWzBdID0gMjsKKwkJCQkgIHBbMV0gPSAwOworCQkJCSAgcFsyXSA9IFZBWF9CUkI7CisJCQkJICBwWzNdID0gNjsKKwkJCQkgIHBbNF0gPSBWQVhfSk1QOworCQkJCSAgcFs1XSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLworCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNiwgdGhpc19hZGRfbnVtYmVyLCA0KTsKKwkJCQkgIC8qCisJCQkJICAgKiBOb3cgKGVnKQlBQ0J4CTFmCisJCQkJICAgKgkJQlJCCTJmCisJCQkJICAgKgkxOglKTVAJQCNmb28KKwkJCQkgICAqCTI6CisJCQkJICAgKi8KKwkJCQl9CisJCQkgICAgICBlbHNlCisJCQkJeworCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKKwkJCQkgIHAgPSBmcmFnX21vcmUgKDkpOworCQkJCSAgcFswXSA9IDI7CisJCQkJICBwWzFdID0gVkFYX0JSQjsKKwkJCQkgIHBbMl0gPSA2OworCQkJCSAgcFszXSA9IFZBWF9KTVA7CisJCQkJICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREUgKyAxOwkvKiBAIy4uLiAqLworCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKKwkJCQkgIC8qCisJCQkJICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKKwkJCQkgICAqCQlCUkIJMmYKKwkJCQkgICAqCTE6CUpNUAlAI2ZvbworCQkJCSAgICoJMjoKKwkJCQkgICAqLworCQkJCX0KKwkJCSAgICB9CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgLyogYjxjb25kPiAqLworCQkJICAqb3Bjb2RlX2xvd19ieXRlUCBePSAxOworCQkJICAvKiBUbyByZXZlcnNlIHRoZSBjb25kaXRpb24gaW4gYSBWQVggYnJhbmNoLAorCQkJICAgICBjb21wbGVtZW50IHRoZSBsb3dlc3Qgb3JkZXIgYml0LiAqLworCQkJICBwID0gZnJhZ19tb3JlICg3KTsKKwkJCSAgcFswXSA9IDY7CisJCQkgIHBbMV0gPSBWQVhfSk1QOworCQkJICBwWzJdID0gVkFYX0FCU09MVVRFX01PREU7CS8qIEAjLi4uICovCisJCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDMsIHRoaXNfYWRkX251bWJlciwgNCk7CisJCQkgIC8qCisJCQkgICAqIE5vdyAoZWcpCUJMRVEJMWYKKwkJCSAgICoJCUpNUAlAI2ZvbworCQkJICAgKgkxOgorCQkJICAgKi8KKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBTRUdfVU5LTk9XTiAmJiB0b19TZWcgIT0gU0VHX0FCU09MVVRFICovCisJCSAgaWYgKG5ieXRlcyA+IDApCisJCSAgICB7CisJCSAgICAgIC8qIFBjLXJlbGF0aXZlLiBDb252ZW50aW9uYWwgcmVsb2NhdGlvbi4gKi8KKwkJICAgICAga25vdyAoIShvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpKTsKKwkJICAgICAgcCA9IGZyYWdfbW9yZSAobmJ5dGVzKTsKKwkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJCSAgICAgICBuYnl0ZXMsICZhYnNfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCQkgICAgICAgMSwgTk9fUkVMT0MpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAga25vdyAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKTsKKwkJICAgICAgaWYgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NQRUNJQUwpCisJCQl7CisJCQkgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9VTkNPTkRJVElPTkFMX0pVTVApCisJCQkgICAgeworCQkJICAgICAgLyogYnIgb3IganNiICovCisJCQkgICAgICBrbm93IChvcGNvZGVfYXNfY2hhcnNbMV0gPT0gMCk7CisJCQkgICAgICAqb3Bjb2RlX2xvd19ieXRlUCA9IG9wY29kZV9hc19jaGFyc1swXSArIFZBWF9XSURFTl9MT05HOworCQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7CisJCQkgICAgICBwWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CisJCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywKKwkJCQkgICAgICAgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKKwkJCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLAorCQkJCSAgICAgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKKwkJCSAgICAgIC8qIE5vdyBlZyBKTVAgZm9vIG9yIEpTQiBmb28uICovCisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1dPUkRfSlVNUCkKKwkJCQl7CisJCQkJICBwID0gZnJhZ19tb3JlICgxMCk7CisJCQkJICBwWzBdID0gMDsKKwkJCQkgIHBbMV0gPSAyOworCQkJCSAgcFsyXSA9IFZBWF9CUkI7CisJCQkJICBwWzNdID0gNjsKKwkJCQkgIHBbNF0gPSBWQVhfSk1QOworCQkJCSAgcFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOworCQkJCSAgZml4X25ldyAoZnJhZ19ub3csCisJCQkJCSAgIHAgKyA2IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCisJCQkJCSAgIHRoaXNfYWRkX3N5bWJvbCwKKwkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7CisJCQkJICAvKgorCQkJCSAgICogTm93IChlZykJQUNCeAkxZgorCQkJCSAgICoJCUJSQgkyZgorCQkJCSAgICoJMToJSk1QCWZvbworCQkJCSAgICoJMjoKKwkJCQkgICAqLworCQkJCX0KKwkJCSAgICAgIGVsc2UKKwkJCQl7CisJCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9CWVRFX0pVTVApOworCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOworCQkJCSAgcFswXSA9IDI7CisJCQkJICBwWzFdID0gVkFYX0JSQjsKKwkJCQkgIHBbMl0gPSA2OworCQkJCSAgcFszXSA9IFZBWF9KTVA7CisJCQkJICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CisJCQkJICBmaXhfbmV3IChmcmFnX25vdywKKwkJCQkJICAgcCArIDUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJCQkJICAgNCwgdGhpc19hZGRfc3ltYm9sLAorCQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKKwkJCQkgIC8qCisJCQkJICAgKiBOb3cgKGVnKQl4T0J4eHgJMWYKKwkJCQkgICAqCQlCUkIJMmYKKwkJCQkgICAqCTE6CUpNUAlmb28KKwkJCQkgICAqCTI6CisJCQkJICAgKi8KKwkJCQl9CisJCQkgICAgfQorCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVApOworCQkJICAqb3Bjb2RlX2xvd19ieXRlUCBePSAxOwkvKiBSZXZlcnNlIGJyYW5jaCBjb25kaXRpb24uICovCisJCQkgIHAgPSBmcmFnX21vcmUgKDcpOworCQkJICBwWzBdID0gNjsKKwkJCSAgcFsxXSA9IFZBWF9KTVA7CisJCQkgIHBbMl0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKKwkJCSAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAzIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkJICAgNCwgdGhpc19hZGRfc3ltYm9sLAorCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAga25vdyAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgIT0gJ2InKTsJLyogU28gaXQgaXMgb3JkaW5hcnkgb3BlcmFuZC4gKi8KKwkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzICE9ICcgJyk7CS8qICcgJyB0YXJnZXQtaW5kZXBlbmRlbnQ6IGVsc2V3aGVyZS4gKi8KKwkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICdhJworCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnbScKKwkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3InCisJCXx8IG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICd2JworCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndycpOworCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQorCSAgICB7CisJICAgICAgaWYgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpCisJCXsKKwkJICBpZiAodGhpc19hZGRfbnVtYmVyID49IDY0KQorCQkgICAgeworCQkgICAgICBhc193YXJuIChfKCJTaG9ydCBsaXRlcmFsIG92ZXJmbG93KCVsZC4pLCBpbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIpLAorCQkJICAgICAgIChsb25nKSB0aGlzX2FkZF9udW1iZXIpOworCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOworCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OworCQkgICAgICBvcGVyYW5kUC0+dm9wX3JlZyA9IDB4RjsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGFzX3dhcm4gKF8oIkZvcmNlZCBzaG9ydCBsaXRlcmFsIHRvIGltbWVkaWF0ZSBtb2RlLiBub3dfc2VnPSVzIHRvX3NlZz0lcyIpLAorCQkJICAgc2VnbWVudF9uYW1lIChub3dfc2VnKSwgc2VnbWVudF9uYW1lICh0b19zZWcpKTsKKwkJICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOworCQkgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7CisJCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CisJCX0KKwkgICAgfQorCSAgaWYgKG9wZXJhbmRQLT52b3BfcmVnID49IDAgJiYgKG9wZXJhbmRQLT52b3BfbW9kZSA8IDgKKwkJICB8fCAob3BlcmFuZFAtPnZvcF9yZWcgIT0gMHhGICYmIG9wZXJhbmRQLT52b3BfbW9kZSA8IDEwKSkpCisJICAgIHsKKwkgICAgICAvKiBPbmUgYnl0ZSBvcGVyYW5kLiAqLworCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3BfbW9kZSA+IDMpOworCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnZvcF9tb2RlIDw8IDQgfCBvcGVyYW5kUC0+dm9wX3JlZyk7CisJICAgICAgLyogQWxsIDEtYnl0ZXMgZXhjZXB0IFNeIyBoYXBwZW4gaGVyZS4gKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyoge0B9e3FefWZvb3soUm4pfSBvciBTXiNmb28gKi8KKwkgICAgICBpZiAob3BlcmFuZFAtPnZvcF9yZWcgPT0gLTEgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAncycpCisJCXsKKwkJICAvKiAie0B9e3FefWZvbyIgKi8KKwkJICBpZiAodG9fc2VnID09IG5vd19zZWcpCisJCSAgICB7CisJCSAgICAgIGlmIChsZW5ndGggPT0gMCkKKwkJCXsKKwkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpOworCQkJICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKKwkJCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKSwKKwkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCQkJCW9wY29kZV9sb3dfYnl0ZVApOworCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX21vZGUgPT0gMTAgKyBhdCk7CisJCQkgICpwID0gYXQgPDwgNDsKKwkJCSAgLyogQXQgaXMgdGhlIG9ubHkgY29udGV4dCB3ZSBuZWVkIHRvIGNhcnJ5CisJCQkgICAgIHRvIG90aGVyIHNpZGUgb2YgcmVsYXgoKSBwcm9jZXNzLiAgTXVzdAorCQkJICAgICBiZSBpbiB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgVkFYCisJCQkgICAgIG9wZXJhbmQgc3BlYy4gYnl0ZS4gKi8KKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBrbm93IChsZW5ndGgpOworCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3Nob3J0ICE9ICcgJyk7CisJCQkgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOworCQkJICBwWzBdID0gMHhGIHwgKChhdCArICI/XDEyXDE0P1wxNiJbbGVuZ3RoXSkgPDwgNCk7CisJCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkJCSAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAorCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsJCS8qIHRvX3NlZyAhPSBub3dfc2VnICovCisJCSAgICAgIGlmICh0aGlzX2FkZF9zeW1ib2wgPT0gTlVMTCkKKwkJCXsKKwkJCSAga25vdyAodG9fc2VnID09IFNFR19BQlNPTFVURSk7CisJCQkgIC8qIERvIEAjZm9vOiBzaW1wbGVyIHJlbG9jYXRpb24gdGhhbiBmb28tLihwYykgYW55d2F5LiAqLworCQkJICBwID0gZnJhZ19tb3JlICg1KTsKKwkJCSAgcFswXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLworCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIDQpOworCQkJICBpZiAobGVuZ3RoICYmIGxlbmd0aCAhPSA0KQorCQkJICAgIHsKKwkJCSAgICAgIGFzX3dhcm4gKF8oIkxlbmd0aCBzcGVjaWZpY2F0aW9uIGlnbm9yZWQuIEFkZHJlc3MgbW9kZSA5RiB1c2VkIikpOworCQkJICAgIH0KKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICAvKiB7QH17cV59b3RoZXJfc2VnICovCisJCQkgIGtub3cgKChsZW5ndGggPT0gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJykKKwkJCSAgICAgfHwgKGxlbmd0aCA+IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpKTsKKwkJCSAgaWYgKGlzX3VuZGVmaW5lZCkKKwkJCSAgICB7CisJCQkgICAgICAvKgorCQkJICAgICAgICogV2UgaGF2ZSBhIFNFR19VTktOT1dOIHN5bWJvbC4gSXQgbWlnaHQKKwkJCSAgICAgICAqIHR1cm4gb3V0IHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMKKwkJCSAgICAgICAqIHRoZSBpbnN0cnVjdGlvbiwgcGVybWl0dGluZyByZWxheGF0aW9uLgorCQkJICAgICAgICovCisJCQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAyLAorCQkJICAgICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpLAorCQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCisJCQkJCSAgICAwKTsKKwkJCSAgICAgIHBbMF0gPSBhdCA8PCA0OworCQkJICAgIH0KKwkJCSAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgIGlmIChsZW5ndGggPT0gMCkKKwkJCQl7CisJCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJyk7CisJCQkJICBsZW5ndGggPSA0OwkvKiBMb25nZXN0IHBvc3NpYmxlLiAqLworCQkJCX0KKwkJCSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCArIDEpOworCQkJICAgICAgcFswXSA9IDB4RiB8ICgoYXQgKyAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOworCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCBsZW5ndGgpOworCQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csCisJCQkJICAgICAgIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkJICAgICAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAorCQkJCSAgICAgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiB7QH17cV59Zm9vKFJuKSBvciBTXiMgb3IgSV4jIG9yICMgKi8KKwkJICBpZiAob3BlcmFuZFAtPnZvcF9tb2RlIDwgMHhBKQorCQkgICAgeworCQkgICAgICAvKiAjIG9yIFNeIyBvciBJXiMgKi8KKwkJICAgICAgaWYgKG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICd2JworCQkJICB8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYScpCisJCQl7CisJCQkgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicpCisJCQkgICAgYXNfd2FybiAoXygiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYmFzZSBhZGRyZXNzLiIpKTsKKwkJCSAgZWxzZQorCQkJICAgIGFzX3dhcm4gKF8oIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGFkZHJlc3MuIikpOworCQkJICAvKiBnY2MgMi42LjMgaXMga25vd24gdG8gZ2VuZXJhdGUgdGhlc2UgaW4gYXQgbGVhc3QKKwkJCSAgICAgb25lIGNhc2UuICAqLworCQkJfQorCQkgICAgICBpZiAobGVuZ3RoID09IDAKKwkJCSAgJiYgdG9fc2VnID09IFNFR19BQlNPTFVURSAmJiAoZXhwUC0+WF9vcCAhPSBPX2JpZykKKwkJCSAgJiYgb3BlcmFuZFAtPnZvcF9tb2RlID09IDgJLyogTm8gJ0AnLiAqLworCQkJICAmJiB0aGlzX2FkZF9udW1iZXIgPCA2NCkKKwkJCXsKKwkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdzJzsKKwkJCX0KKwkJICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQorCQkJeworCQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKHRoaXNfYWRkX251bWJlcik7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgLyogSV4jLi4uICovCisJCQkgIGtub3cgKG5ieXRlcyk7CisJCQkgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyArIDEpOworCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3JlZyA9PSAweEYpOworCQkJICBwWzBdID0gKG9wZXJhbmRQLT52b3BfbW9kZSA8PCA0KSB8IDB4RjsKKwkJCSAgaWYgKCh0b19zZWcgPT0gU0VHX0FCU09MVVRFKSAmJiAoZXhwUC0+WF9vcCAhPSBPX2JpZykpCisJCQkgICAgeworCQkJICAgICAgLyoKKwkJCSAgICAgICAqIElmIG5ieXRlcyA+IDQsIHRoZW4gd2UgYXJlIHNjcm9kLiBXZQorCQkJICAgICAgICogZG9uJ3Qga25vdyBpZiB0aGUgaGlnaCBvcmRlciBieXRlcworCQkJICAgICAgICogYXJlIHRvIGJlIDB4RkYgb3IgMHgwMC4gIEJTRDQuMiAmIFJNUworCQkJICAgICAgICogc2F5IHVzZSAweDAwLiBPSyAtLS0gYnV0IHRoaXMKKwkJCSAgICAgICAqIGFzc2VtYmxlciBuZWVkcyBBTk9USEVSIHJld3JpdGUgdG8KKwkJCSAgICAgICAqIGNvcGUgcHJvcGVybHkgd2l0aCB0aGlzIGJ1Zy4gKi8KKwkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbWluICg0LCBuYnl0ZXMpKTsKKwkJCSAgICAgIGlmIChuYnl0ZXMgPiA0KQorCQkJCXsKKwkJCQkgIG1lbXNldCAocCArIDUsICdcMCcsIG5ieXRlcyAtIDQpOworCQkJCX0KKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBpZiAoZXhwUC0+WF9vcCA9PSBPX2JpZykKKwkJCQl7CisJCQkJICAvKgorCQkJCSAgICogUHJvYmxlbSBoZXJlIGlzIHRvIGdldCB0aGUgYnl0ZXMKKwkJCQkgICAqIGluIHRoZSByaWdodCBvcmRlci4gIFdlIHN0b3JlZAorCQkJCSAgICogb3VyIGNvbnN0YW50IGFzIExJVFRMRU5VTXMsIG5vdAorCQkJCSAgICogYnl0ZXMuICovCisJCQkJICBMSVRUTEVOVU1fVFlQRSAqbFA7CisKKwkJCQkgIGxQID0gZmxvYXRQLT5sb3c7CisJCQkJICBpZiAobmJ5dGVzICYgMSkKKwkJCQkgICAgeworCQkJCSAgICAgIGtub3cgKG5ieXRlcyA9PSAxKTsKKwkJCQkgICAgICBwWzFdID0gKmxQOworCQkJCSAgICB9CisJCQkJICBlbHNlCisJCQkJICAgIHsKKwkJCQkgICAgICBmb3IgKHArKzsgbmJ5dGVzOyBuYnl0ZXMgLT0gMiwgcCArPSAyLCBsUCsrKQorCQkJCQl7CisJCQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAqbFAsIDIpOworCQkJCQl9CisJCQkJICAgIH0KKwkJCQl9CisJCQkgICAgICBlbHNlCisJCQkJeworCQkJCSAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCQkJCSAgIG5ieXRlcywgdGhpc19hZGRfc3ltYm9sLAorCQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDAsIE5PX1JFTE9DKTsKKwkJCQl9CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsJCS8qIHtAfXtxXn1mb28oUm4pICovCisJCSAgICAgIGtub3cgKChsZW5ndGggPT0gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICcgJykKKwkJCSAgICB8fCAobGVuZ3RoID4gMCAmJiBvcGVyYW5kUC0+dm9wX3Nob3J0ICE9ICcgJykpOworCQkgICAgICBpZiAobGVuZ3RoID09IDApCisJCQl7CisJCQkgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQorCQkJICAgIHsKKwkJCSAgICAgIGxvbmcgdGVzdDsKKworCQkJICAgICAgdGVzdCA9IHRoaXNfYWRkX251bWJlcjsKKworCQkJICAgICAgaWYgKHRlc3QgPCAwKQorCQkJCXRlc3QgPSB+dGVzdDsKKworCQkJICAgICAgbGVuZ3RoID0gdGVzdCAmIDB4ZmZmZjgwMDAgPyA0CisJCQkJOiB0ZXN0ICYgMHhmZmZmZmY4MCA/IDIKKwkJCQk6IDE7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgbGVuZ3RoID0gNDsKKwkJCSAgICB9CisJCQl9CisJCSAgICAgIHAgPSBmcmFnX21vcmUgKDEgKyBsZW5ndGgpOworCQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX3JlZyA+PSAwKTsKKwkJICAgICAgcFswXSA9IG9wZXJhbmRQLT52b3BfcmVnCisJCQl8ICgoYXQgfCAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOworCQkgICAgICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKKwkJCXsKKwkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCBsZW5ndGgpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAorCQkJCSAgIGxlbmd0aCwgdGhpc19hZGRfc3ltYm9sLAorCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMCwgTk9fUkVMT0MpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0JCQkvKiBpZihzaW5nbGUtYnl0ZS1vcGVyYW5kKSAqLworCX0KKyAgICB9CQkJCS8qIGZvcihvcGVyYW5kUCkgKi8KK30JCQkJLyogdmF4X2Fzc2VtYmxlKCkgKi8KKwwKKy8qCisgKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKKyAqCisgKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KKyAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgorICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcuCisgKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4KKyAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KKyAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCisgKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCisgKiAwIHZhbHVlLgorICovCitpbnQKK21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKKyAgICAgZnJhZ1MgKmZyYWdQOworICAgICBzZWdUIHNlZ21lbnQ7Cit7CisgIGNoYXIgKnA7CisgIGludCBvbGRfZnJfZml4OworCisgIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1VOREYpOgorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCisJewkJCS8qIEEgcmVsYXhhYmxlIGNhc2UuICovCisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OworCSAgcFswXSB8PSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogUHJlc2VydmUgQCBiaXQuICovCisJICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OworCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAorCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7CisJICBmcmFnX3dhbmUgKGZyYWdQKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX1VOREYpOgorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCisJeworCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7CisJICAqZnJhZ1AtPmZyX29wY29kZSBePSAxOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KKwkgIHBbMF0gPSA2OworCSAgcFsxXSA9IFZBWF9KTVA7CisJICBwWzJdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihQQykgKi8KKwkgIGZyYWdQLT5mcl9maXggKz0gMSArIDEgKyAxICsgNDsKKwkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMywgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOworCSAgZnJhZ193YW5lIChmcmFnUCk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX1VOREYpOgorICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCisJeworCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfQlJBTkNILCBTVEFURV9XT1JEKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKKwkgIHBbMF0gPSAyOworCSAgcFsxXSA9IDA7CisJICBwWzJdID0gVkFYX0JSQjsKKwkgIHBbM10gPSA2OworCSAgcFs0XSA9IFZBWF9KTVA7CisJICBwWzVdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihwYykgKi8KKwkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyAxICsgMSArIDQ7CisJICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDYsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCisJCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKKwkgIGZyYWdfd2FuZSAoZnJhZ1ApOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9VTkRGKToKKyAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQorCXsKKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfQllURSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7CisJICBwWzBdID0gMjsKKwkgIHBbMV0gPSBWQVhfQlJCOworCSAgcFsyXSA9IDY7CisJICBwWzNdID0gVkFYX0pNUDsKKwkgIHBbNF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogLi4uKHBjKSAqLworCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgMiArIDEgKyAxICsgNDsKKwkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOworCSAgZnJhZ193YW5lIChmcmFnUCk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfVU5ERik6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKKwl7CisJICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7CisJICAqZnJhZ1AtPmZyX29wY29kZSArPSBWQVhfV0lERU5fTE9ORzsKKwkgIHBbMF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsJLyogLi4uKFBDKSAqLworCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKKwkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKKwkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOworCSAgZnJhZ193YW5lIChmcmFnUCk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gKGZyYWdQLT5mcl92YXIgKyBmcmFnUC0+ZnJfZml4IC0gb2xkX2ZyX2ZpeCk7Cit9CQkJCS8qIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkgKi8KKwwKKy8qCisgKgkJCW1kX2NvbnZlcnRfZnJhZygpOworICoKKyAqIENhbGxlZCBhZnRlciByZWxheCgpIGlzIGZpbmlzaGVkLgorICogSW46CUFkZHJlc3Mgb2YgZnJhZy4KKyAqCWZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCisgKglmcl9zdWJ0eXBlIGlzIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4KKyAqCisgKiBPdXQ6CUFueSBmaXhTcyBhbmQgY29uc3RhbnRzIGFyZSBzZXQgdXAuCisgKglDYWxsZXIgd2lsbCB0dXJuIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCisgKi8KK3ZvaWQKK21kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7CisgICAgIHNlZ1Qgc2VnOworICAgICBmcmFnUyAqZnJhZ1A7Cit7CisgIGNoYXIgKmFkZHJlc3NQOwkJLyogLT4gX3ZhciB0byBjaGFuZ2UuICovCisgIGNoYXIgKm9wY29kZVA7CQkvKiAtPiBvcGNvZGUgY2hhcihzKSB0byBjaGFuZ2UuICovCisgIHNob3J0IGludCBsZW5ndGhfY29kZTsJLyogMj1sb25nIDE9d29yZCAwPWJ5dGUgKi8KKyAgc2hvcnQgaW50IGV4dGVuc2lvbiA9IDA7CS8qIFNpemUgb2YgcmVsYXhlZCBhZGRyZXNzLiAqLworICAvKiBBZGRlZCB0byBmcl9maXg6IGluY2wuIEFMTCB2YXIgY2hhcnMuICovCisgIHN5bWJvbFMgKnN5bWJvbFA7CisgIGxvbmcgd2hlcmU7CisgIGxvbmcgYWRkcmVzc19vZl92YXI7CisgIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBpcyBfdmFyIG9mICpmcmFnUD8gKi8KKyAgbG9uZyB0YXJnZXRfYWRkcmVzcyA9IDA7CisgIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBkb2VzIGFkZHIgcG9pbnQ/ICovCisKKyAga25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpOworICBsZW5ndGhfY29kZSA9IGZyYWdQLT5mcl9zdWJ0eXBlICYgMzsJLyogZGVwZW5kcyBvbiBFTkNPREVfUkVMQVgoKSAqLworICBrbm93IChsZW5ndGhfY29kZSA+PSAwICYmIGxlbmd0aF9jb2RlIDwgMyk7CisgIHdoZXJlID0gZnJhZ1AtPmZyX2ZpeDsKKyAgYWRkcmVzc1AgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOworICBvcGNvZGVQID0gZnJhZ1AtPmZyX29wY29kZTsKKyAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7CisgIGtub3cgKHN5bWJvbFApOworICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIGZyYWdQLT5mcl9vZmZzZXQ7CisgIGFkZHJlc3Nfb2ZfdmFyID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZTsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSk6CisgICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCisgICAgICBhZGRyZXNzUFswXSB8PSAweEFGOwkvKiBCeXRlIGRpc3BsYWNlbWVudC4gKi8KKyAgICAgIGFkZHJlc3NQWzFdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfV09SRCk6CisgICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCisgICAgICBhZGRyZXNzUFswXSB8PSAweENGOwkvKiBXb3JkIGRpc3BsYWNlbWVudC4gKi8KKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDMpLCAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfTE9ORyk6CisgICAgICBrbm93ICgqYWRkcmVzc1AgPT0gMCB8fCAqYWRkcmVzc1AgPT0gMHgxMCk7CS8qICdAJyBiaXQuICovCisgICAgICBhZGRyZXNzUFswXSB8PSAweEVGOwkvKiBMb25nIHdvcmQgZGlzcGxhY2VtZW50LiAqLworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDEsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOworICAgICAgZXh0ZW5zaW9uID0gNTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk6CisgICAgICBhZGRyZXNzUFswXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7CisgICAgICBleHRlbnNpb24gPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9XT1JEKToKKyAgICAgIG9wY29kZVBbMF0gXj0gMTsJCS8qIFJldmVyc2Ugc2Vuc2Ugb2YgdGVzdC4gKi8KKyAgICAgIGFkZHJlc3NQWzBdID0gMzsKKyAgICAgIGFkZHJlc3NQWzFdID0gVkFYX0JSQiArIFZBWF9XSURFTl9XT1JEOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDIsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNCksIDIpOworICAgICAgZXh0ZW5zaW9uID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfTE9ORyk6CisgICAgICBvcGNvZGVQWzBdIF49IDE7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCisgICAgICBhZGRyZXNzUFswXSA9IDY7CisgICAgICBhZGRyZXNzUFsxXSA9IFZBWF9KTVA7CisgICAgICBhZGRyZXNzUFsyXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDMsIHRhcmdldF9hZGRyZXNzLCA0KTsKKyAgICAgIGV4dGVuc2lvbiA9IDc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9CWVRFKToKKyAgICAgIGFkZHJlc3NQWzBdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKKyAgICAgIGV4dGVuc2lvbiA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9XT1JEKToKKyAgICAgIG9wY29kZVBbMF0gKz0gVkFYX1dJREVOX1dPUkQ7CS8qIGJyYiAtPiBicncsIGJzYmIgLT4gYnNidyAqLworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7CisgICAgICBleHRlbnNpb24gPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfTE9ORyk6CisgICAgICBvcGNvZGVQWzBdICs9IFZBWF9XSURFTl9MT05HOwkvKiBicmIgLT4gam1wLCBic2JiIC0+IGpzYiAqLworICAgICAgYWRkcmVzc1BbMF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKKyAgICAgIGV4dGVuc2lvbiA9IDU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfV09SRCk6CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfTE9ORyk6CisgICAgICBhZGRyZXNzUFswXSA9IDI7CisgICAgICBhZGRyZXNzUFsxXSA9IDA7CisgICAgICBhZGRyZXNzUFsyXSA9IFZBWF9CUkI7CisgICAgICBhZGRyZXNzUFszXSA9IDY7CisgICAgICBhZGRyZXNzUFs0XSA9IFZBWF9KTVA7CisgICAgICBhZGRyZXNzUFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDYsIHRhcmdldF9hZGRyZXNzLCA0KTsKKyAgICAgIGV4dGVuc2lvbiA9IDEwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0JZVEUpOgorICAgICAgYWRkcmVzc1BbMF0gPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOworICAgICAgZXh0ZW5zaW9uID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9XT1JEKToKKyAgICAgIGFkZHJlc3NQWzBdID0gMjsKKyAgICAgIGFkZHJlc3NQWzFdID0gVkFYX0JSQjsKKyAgICAgIGFkZHJlc3NQWzJdID0gMzsKKyAgICAgIGFkZHJlc3NQWzNdID0gVkFYX0JSVzsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA0LCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDYpLCAyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfTE9ORyk6CisgICAgICBhZGRyZXNzUFswXSA9IDI7CisgICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkI7CisgICAgICBhZGRyZXNzUFsyXSA9IDY7CisgICAgICBhZGRyZXNzUFszXSA9IFZBWF9KTVA7CisgICAgICBhZGRyZXNzUFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCArIDUsIHRhcmdldF9hZGRyZXNzLCA0KTsKKyAgICAgIGV4dGVuc2lvbiA9IDk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3N1YnR5cGUpOworICAgICAgYnJlYWs7CisgICAgfQorICBmcmFnUC0+ZnJfZml4ICs9IGV4dGVuc2lvbjsKK30JCQkJLyogbWRfY29udmVydF9mcmFnKCkgKi8KKworLyogVHJhbnNsYXRlIGludGVybmFsIGZvcm1hdCBvZiByZWxvY2F0aW9uIGluZm8gaW50byB0YXJnZXQgZm9ybWF0LgorCisgICBPbiB2YXg6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nLCBuZXh0IHRocmVlIGJ5dGVzCisgICBhcmUgc3ltYm9sbnVtLCBsZWFzdCBzaWcuIGJ5dGUgZmlyc3QuICBMYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGgKKyAgIHRoZSB1cHBlciBuaWJibGUgYXMgbnV0aGluLCBiaXQgMyBhcyBleHRlcm4sIGJpdHMgMiAmIDEgYXMgbGVuZ3RoLCBhbmQKKyAgIGJpdCAwIGFzIHBjcmVsLiAqLworI2lmZGVmIGNvbW1lbnQKK3ZvaWQKK21kX3JpX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpKQorICAgICBjaGFyICp0aGVfYnl0ZXM7CisgICAgIHN0cnVjdCByZWxvY19pbmZvX2dlbmVyaWMgcmk7Cit7CisgIC8qIHRoaXMgaXMgZWFzeSAqLworICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOworICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLworICB0aGVfYnl0ZXNbNl0gPSAocmkucl9zeW1ib2xudW0gPj4gMTYpICYgMHgwZmY7CisgIHRoZV9ieXRlc1s1XSA9IChyaS5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOworICB0aGVfYnl0ZXNbNF0gPSByaS5yX3N5bWJvbG51bSAmIDB4MGZmOworICB0aGVfYnl0ZXNbN10gPSAoKChyaS5yX2V4dGVybiA8PCAzKSAmIDB4MDgpIHwgKChyaS5yX2xlbmd0aCA8PCAxKSAmIDB4MDYpIHwKKwkJICAoKHJpLnJfcGNyZWwgPDwgMCkgJiAweDAxKSkgJiAweDBGOworfQorCisjZW5kaWYgLyogY29tbWVudCAqLworCit2b2lkIAordGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKKyAgICAgY2hhciAqd2hlcmU7CisgICAgIGZpeFMgKmZpeFA7CisgICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOworeworICAvKgorICAgKiBJbjogbGVuZ3RoIG9mIHJlbG9jYXRpb24gKG9yIG9mIGFkZHJlc3MpIGluIGNoYXJzOiAxLCAyIG9yIDQuCisgICAqIE91dDogR05VIExEIHJlbG9jYXRpb24gbGVuZ3RoIGNvZGU6IDAsIDEsIG9yIDIuCisgICAqLworCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ieXRlc19yX2xlbmd0aFtdID0gezQyLCAwLCAxLCA0MiwgMn07CisgIGxvbmcgcl9zeW1ib2xudW07CisKKyAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7CisKKyAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKKyAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKKwkJICAgICAgNCk7CisKKyAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKKwkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCisJCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOworCisgIHdoZXJlWzZdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOworICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOworICB3aGVyZVs0XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7CisgIHdoZXJlWzddID0gKCgoKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkgPDwgMykgJiAweDA4KQorCSAgICAgIHwgKChuYnl0ZXNfcl9sZW5ndGhbZml4UC0+Znhfc2l6ZV0gPDwgMSkgJiAweDA2KQorCSAgICAgIHwgKCgoZml4UC0+ZnhfcGNyZWwgPDwgMCkgJiAweDAxKSAmIDB4MGYpKTsKK30KKworLyoKKyAqICAgICAgIEJVR1MsIEdSSVBFUywgIEFQT0xPR0lBLCBldGMuCisgKgorICogVGhlIG9wY29kZSB0YWJsZSAndm90c3RycycgbmVlZHMgdG8gYmUgc29ydGVkIG9uIG9wY29kZSBmcmVxdWVuY3kuCisgKiBUaGF0IGlzLCBBRlRFUiB3ZSBoYXNoIGl0IHdpdGggaGFzaF8uLi4oKSwgd2Ugd2FudCBtb3N0LXVzZWQgb3Bjb2RlcworICogdG8gY29tZSBvdXQgb2YgdGhlIGhhc2ggdGFibGUgZmFzdGVyLgorICoKKyAqIEkgYW0gc29ycnkgdG8gaW5mbGljdCB5ZXQgYW5vdGhlciBWQVggYXNzZW1ibGVyIG9uIHRoZSB3b3JsZCwgYnV0CisgKiBSTVMgc2F5cyB3ZSBtdXN0IGRvIGV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoLCB0byBwcmV2ZW50IHBpbi1oZWFkcworICogcmVzdHJpY3RpbmcgdGhpcyBzb2Z0d2FyZS4KKyAqLworCisvKgorICogVGhpcyBpcyBhIHZhZ3VlbHkgbW9kdWxhciBzZXQgb2Ygcm91dGluZXMgaW4gQyB0byBwYXJzZSBWQVgKKyAqIGFzc2VtYmx5IGNvZGUgdXNpbmcgREVDIG1uZW1vbmljcy4gSXQgaXMgTk9UIHVuKnggc3BlY2lmaWMuCisgKgorICogVGhlIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSBhc3NlbWJsZXIgaGFzIHRha2VuIGNhcmUgb2YgYWxsOgorICogICBsYWJlbHMKKyAqICAgbWFjcm9zCisgKiAgIGxpc3RpbmcKKyAqICAgcHNldWRvLW9wcworICogICBsaW5lIGNvbnRpbnVhdGlvbgorICogICBjb21tZW50cworICogICBjb25kZW5zaW5nIGFueSB3aGl0ZXNwYWNlIGRvd24gdG8gZXhhY3RseSBvbmUgc3BhY2UKKyAqIGFuZCBhbGwgd2UgaGF2ZSB0byBkbyBpcyBwYXJzZSAxIGxpbmUgaW50byBhIHZheCBpbnN0cnVjdGlvbgorICogcGFydGlhbGx5IGZvcm1lZC4gV2Ugd2lsbCBhY2NlcHQgYSBsaW5lLCBhbmQgZGVsaXZlcjoKKyAqICAgYW4gZXJyb3IgbWVzc2FnZSAoaG9wZWZ1bGx5IGVtcHR5KQorICogICBhIHNrZWxldG9uIFZBWCBpbnN0cnVjdGlvbiAodHJlZSBzdHJ1Y3R1cmUpCisgKiAgIHRleHR1YWwgcG9pbnRlcnMgdG8gYWxsIHRoZSBvcGVyYW5kIGV4cHJlc3Npb25zCisgKiAgIGEgd2FybmluZyBtZXNzYWdlIHRoYXQgbm90ZXMgYSBzaWxseSBvcGVyYW5kIChob3BlZnVsbHkgZW1wdHkpCisgKi8KKwwKKy8qCisgKgkJRSBEIEkgVCAgIEggSSBTIFQgTyBSIFkKKyAqCisgKiAxN21heTg2IERlYW4gRWxzbmVyLiBCdWcgaWYgbGluZSBlbmRzIGltbWVkaWF0ZWx5IGFmdGVyIG9wY29kZS4KKyAqIDMwYXByODYgRGVhbiBFbHNuZXIuIE5ldyB2aXBfb3AoKSB1c2VzIGFyZyBibG9jayBzbyBjaGFuZ2UgY2FsbC4KKyAqICA2amFuODYgRGVhbiBFbHNuZXIuIENyb2NrIHZpcF9iZWdpbigpIHRvIGNhbGwgdmlwX29wX2RlZmF1bHRzKCkuCisgKiAgMmphbjg2IERlYW4gRWxzbmVyLiBJbnZlbnQgc3ludGhldGljIG9wY29kZXMuCisgKglXaWRlbiB2YXhfb3Bjb2RlVCB0byAzMiBiaXRzLiBVc2UgYSBiaXQgZm9yIFZJVF9PUENPREVfU1lOVEhFVElDLAorICoJd2hpY2ggbWVhbnMgdGhpcyBpcyBub3QgYSByZWFsIG9wY29kZSwgaXQgaXMgbGlrZSBhIG1hY3JvOyBpdCB3aWxsCisgKgliZSByZWxheCgpZWQgaW50byAxIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zLgorICoJVXNlIGFub3RoZXIgYml0IGZvciBWSVRfT1BDT0RFX1NQRUNJQUwgaWYgdGhlIG9wLWNvZGUgaXMgbm90IG9wdGltaXNlZAorICoJbGlrZSBhIHJlZ3VsYXIgYnJhbmNoIGluc3RydWN0aW9uLiBPcHRpb24gYWRkZWQgdG8gdmlwX2JlZ2luKCk6CisgKglleGNsdWRlCXN5bnRoZXRpYyBvcGNvZGVzLiBJbnZlbnQgc3ludGhldGljX3ZvdHN0cnNbXS4KKyAqIDMxZGVjODUgRGVhbiBFbHNuZXIuIEludmVudCB2aXRfb3Bjb2RlX25ieXRlcy4KKyAqCUFsc28gbWFrZSB2aXRfb3Bjb2RlIGludG8gYSBjaGFyW10uIFdlIG5vdyBoYXZlIG4tYnl0ZSB2YXggb3Bjb2RlcywKKyAqCXNvIGNhbGxlcidzIGRvbid0IGhhdmUgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgMS1ieXRlICYgYQorICoJMi1ieXRlIG9wLWNvZGUuIFN0aWxsIG5lZWQgdmF4X29wY29kZVQgY29uY2VwdCwgc28gd2Uga25vdyBob3cKKyAqCWJpZyBhbiBvYmplY3QgbXVzdCBiZSB0byBob2xkIGFuIG9wLmNvZGUuCisgKiAzMGRlYzg1IERlYW4gRWxzbmVyLiBXaWRlbiB0eXBlZGVmIHZheF9vcGNvZGVUIGluICJ2YXgtaW5zdC5oIgorICoJYmVjYXVzZSB2YXggb3Bjb2RlcyBtYXkgYmUgMTYgYml0cy4gT3VyIGNydWZ0eSBDIGNvbXBpbGVyIHdhcworICoJaGFwcGlseSBpbml0aWFsaXNpbmcgOC1iaXQgdm90X2NvZGVzIHdpdGggMTYtYml0IG51bWJlcnMhCisgKgkoV291bGRuJ3QgdGhlICdwaG9uZSBjb21wYW55IGxpa2UgdG8gY29tcHJlc3MgZGF0YSBzbyBlYXNpbHkhKQorICogMjlkZWM4NSBEZWFuIEVsc25lci4gTmV3IHN0YXRpYyB0YWJsZSB2YXhfb3BlcmFuZF93aWR0aF9zaXplW10uCisgKglJbnZlbnRlZCBzbyB3ZSBrbm93IGh3IG1hbnkgYnl0ZXMgYSAiSV4jNDIiIG5lZWRzIGluIGl0cyBpbW1lZGlhdGUKKyAqCW9wZXJhbmQuIFJldmlzZWQgc3RydWN0IHZvcCBpbiAidmF4LWluc3QuaCI6IGV4cGxpY2l0bHkgaW5jbHVkZQorICoJYnl0ZSBsZW5ndGggb2YgZWFjaCBvcGVyYW5kLCBhbmQgaXQncyBsZXR0ZXItY29kZSBkYXR1bSB0eXBlLgorICogMTdub3Y4NSBEZWFuIEVsc25lci4gTmFtZSBDaGFuZ2UuCisgKglEdWUgdG8gYXIoMSkgdHJ1bmNhdGluZyBuYW1lcywgd2UgbGVhcm5lZCB0aGUgaGFyZCB3YXkgdGhhdAorICoJInZheC1pbnN0LXBhcnNlLmMiIC0+ICJ2YXgtaW5zdC1wYXJzZS4iIGRyb3BwaW5nIHRoZSAibyIgb2ZmCisgKgl0aGUgYXJjaGl2ZWQgb2JqZWN0IG5hbWUuIFNPLi4uIHdlIHNob3J0ZW5lZCB0aGUgbmFtZSBvZiB0aGlzCisgKglzb3VyY2UgZmlsZSwgYW5kIGNoYW5nZWQgdGhlIG1ha2VmaWxlLgorICovCisKKy8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOworCisvKgorICogSW46CTEgY2hhcmFjdGVyLCBmcm9tICJiZGZnaGxvcXB3IiBiZWluZyB0aGUgZGF0YS10eXBlIG9mIGFuIG9wZXJhbmQKKyAqCW9mIGEgdmF4IGluc3RydWN0aW9uLgorICoKKyAqIE91dDoJdGhlIGxlbmd0aCBvZiBhbiBvcGVyYW5kIG9mIHRoYXQgdHlwZSwgaW4gYnl0ZXMuCisgKglTcGVjaWFsIGJyYW5jaCBvcGVyYW5kcyB0eXBlcyAiLT8hIiBoYXZlIGxlbmd0aCAwLgorICovCisKK3N0YXRpYyBjb25zdCBzaG9ydCBpbnQgdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVsyNTZdID0KK3sKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgIDAsIDAsIDEsIDAsIDgsIDAsIDQsIDgsIDE2LCAwLCAwLCAwLCA0LCAwLCAwLDE2LAkvKiAuLmIuZC5mZ2guLi5sLi5vICovCisgIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDIsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAucS4uLi4udy4uLi4uLi4uICovCisgIDAsIDAsIDEsIDAsIDgsIDAsIDQsIDgsIDE2LCAwLCAwLCAwLCA0LCAwLCAwLDE2LAkvKiAuLmIuZC5mZ2guLi5sLi5vICovCisgIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDIsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAucS4uLi4udy4uLi4uLi4uICovCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKK307CisMCisvKgorICogVGhpcyBwZXJ2ZXJzaW9uIGVuY29kZXMgYWxsIHRoZSB2YXggb3Bjb2RlcyBhcyBhIGJ1bmNoIG9mIHN0cmluZ3MuCisgKiBSTVMgc2F5cyB3ZSBzaG91bGQgYnVpbGQgb3VyIGhhc2gtdGFibGUgYXQgcnVuLXRpbWUuIEhtbS4KKyAqIFBsZWFzZSB3b3VsZCBzb21lb25lIGFycmFuZ2UgdGhlc2UgaW4gZGVjcmVhc2luZyBmcmVxdWVuY3kgb2Ygb3Bjb2RlPworICogQmVjYXVzZSBvZiB0aGUgd2F5IGhhc2hfLi4uKCkgd29ya3MsIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcGNvZGUKKyAqIHNob3VsZCBiZSB0ZXh0dWFsbHkgZmlyc3QgYW5kIHNvIG9uLgorICoKKyAqIElucHV0IGZvciB0aGlzIHRhYmxlIHdhcyAndmF4Lm9wY29kZXMnLCBhd2soMSllZCBieSAndmF4Lm9wY29kZXMuYy5hd2snIC4KKyAqIFNvIGNoYW5nZSAndmF4Lm9wY29kZXMnLCB0aGVuIHJlLWdlbmVyYXRlIHRoaXMgdGFibGUuCisgKi8KKworI2luY2x1ZGUgIm9wY29kZS92YXguaCIKKwwKKy8qCisgKiBUaGlzIGlzIGEgdGFibGUgb2Ygb3B0aW9uYWwgb3AtY29kZXMuIEFsbCBvZiB0aGVtIHJlcHJlc2VudAorICogJ3N5bnRoZXRpYycgaW5zdHJ1Y3Rpb25zIHRoYXQgc2VlbSBwb3B1bGFyLgorICoKKyAqIEhlcmUgd2UgbWFrZSBzb21lIHBzZXVkbyBvcC1jb2Rlcy4gRXZlcnkgY29kZSBoYXMgYSBiaXQgc2V0IHRvIHNheQorICogaXQgaXMgc3ludGhldGljLiBUaGlzIGxldHMgeW91IGNhdGNoIHRoZW0gaWYgeW91IHdhbnQgdG8KKyAqIGJhbiB0aGVzZSBvcGNvZGVzLiBUaGV5IGFyZSBtbmVtb25pY3MgZm9yICJlbGFzdGljIiBpbnN0cnVjdGlvbnMKKyAqIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGFzc2VtYmxlIGludG8gdGhlIGZld2VzdCBieXRlcyBuZWVkZWQgdG8gZG8gYQorICogYnJhbmNoLCBvciB0byBkbyBhIGNvbmRpdGlvbmFsIGJyYW5jaCwgb3Igd2hhdGV2ZXIuCisgKgorICogVGhlIG9wY29kZSBpcyBpbiB0aGUgdXN1YWwgcGxhY2UgW2xvdy1vcmRlciBuKjggYml0c10uIFRoaXMgbWVhbnMKKyAqIHRoYXQgaWYgeW91IG1hc2sgb2ZmIHRoZSBidWNreSBiaXRzLCB0aGUgdXN1YWwgcnVsZXMgYXBwbHkgYWJvdXQKKyAqIGhvdyBsb25nIHRoZSBvcGNvZGUgaXMuCisgKgorICogQWxsIFZBWCBicmFuY2ggZGlzcGxhY2VtZW50cyBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLgorICogRm9yIHNpbXBsZSBicmFuY2hlcyAoMS1ieXRlIG9wY29kZSArIDEtYnl0ZSBkaXNwbGFjZW1lbnQpIHRoZSBsYXN0CisgKiBvcGVyYW5kIGlzIGNvZGVkICdiPycgd2hlcmUgdGhlICJkYXRhIHR5cGUiICc/JyBpcyBhIGNsdWUgdGhhdCB3ZQorICogbWF5IHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBicmFuY2ggKGNvbXBsZW1lbnQgbG93ZXN0IG9yZGVyIGJpdCkKKyAqIGFuZCBicmFuY2ggYXJvdW5kIGEganVtcC4gVGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2UuCisgKiBUaGF0IGlzIHdoeSB0aGUgVklUX09QQ09ERV9TWU5USEVUSUMgYml0IGlzIHNldDogaXQgc2F5cyB0aGlzIGlzCisgKiBhIDAtYnl0ZSBvcC1jb2RlIGZvbGxvd2VkIGJ5IDIgb3IgbW9yZSBieXRlcyBvZiBvcGVyYW5kIGFkZHJlc3MuCisgKgorICogSWYgdGhlIG9wLWNvZGUgaGFzIFZJVF9PUENPREVfU1BFQ0lBTCBzZXQsIHRoZW4gd2UgaGF2ZSBhIG1vcmUgdW51c3VhbAorICogY2FzZS4KKyAqCisgKiBGb3IgSkJTQiAmIEpCUiB0aGUgdHJlYXRtZW50IGlzIHRoZSBzaW1pbGFyLCBleGNlcHQgKDEpIHdlIGhhdmUgYSAnYncnCisgKiBvcHRpb24gYmVmb3JlICgyKSB3ZSBjYW4gZGlyZWN0bHkgSlNCL0pNUCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbmRpdGlvbi4KKyAqIFRoZXNlIG9wZXJhbmRzIGhhdmUgJ2ItJyBhcyB0aGVpciBhY2Nlc3MvZGF0YSB0eXBlLgorICoKKyAqIFRoYXQgbGVhdmVzIGEgYnVuY2ggb2YgcmFuZG9tIG9wY29kZXM6IEpBQ0J4LCBKeE9CeHh4LiBJbiB0aGVzZQorICogY2FzZXMsIHdlIGRvIHRoZSBzYW1lIGlkZWEuIEpBQ0J4eHggYXJlIGFsbCBtYXJrZWQgd2l0aCBhICdiIScKKyAqIEpBT0J4eHggJiBKU09CeHh4IGFyZSBtYXJrZWQgd2l0aCBhICdiOicuCisgKgorICovCisjaWYgKFZJVF9PUENPREVfU1lOVEhFVElDICE9IDB4ODAwMDAwMDApCitZb3UgaGF2ZSBqdXN0IGJyb2tlbiB0aGUgZW5jb2RpbmcgYmVsb3csIHdoaWNoIGFzc3VtZXMgdGhlIHNpZ24gYml0CisgIG1lYW5zICdJIGFtIGFuIGltYWdpbmFyeSBpbnN0cnVjdGlvbicuCisjZW5kaWYKKworI2lmIChWSVRfT1BDT0RFX1NQRUNJQUwgIT0gMHg0MDAwMDAwMCkKKyAgWW91IGhhdmUganVzdCBicm9rZW4gdGhlIGVuY29kaW5nIGJlbG93LCB3aGljaCBhc3N1bWVzIHRoZSAweDQwIE0gYml0IG1lYW5zCisgICdJIGFtIG5vdCB0byBiZSAib3B0aW1pc2VkIiB0aGUgd2F5IG5vcm1hbCBicmFuY2hlcyBhcmUnLgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90CisgIHN5bnRoZXRpY192b3RzdHJzW10gPQoreworICB7Impic2IiLAl7ImItIiwgMHhDMDAwMDAxMH19LAkJLyogQlNEIDQuMiAqLworLyoganNiIHVzZWQgYWxyZWFkeSAqLworICB7ImpiciIsCXsiYi0iLCAweEMwMDAwMDExfX0sCQkvKiBCU0QgNC4yICovCisgIHsianIiLAl7ImItIiwgMHhDMDAwMDAxMX19LAkJLyogY29uc2lzdGVudCAqLworICB7ImpuZXEiLAl7ImI/IiwgMHg4MDAwMDAxMn19LAorICB7ImpuZXF1IiwJeyJiPyIsIDB4ODAwMDAwMTJ9fSwKKyAgeyJqZXFsIiwJeyJiPyIsIDB4ODAwMDAwMTN9fSwKKyAgeyJqZXFsdSIsCXsiYj8iLCAweDgwMDAwMDEzfX0sCisgIHsiamd0ciIsCXsiYj8iLCAweDgwMDAwMDE0fX0sCisgIHsiamxlcSIsCXsiYj8iLCAweDgwMDAwMDE1fX0sCisvKiB1bi11c2VkIG9wY29kZXMgaGVyZSAqLworICB7ImpnZXEiLAl7ImI/IiwgMHg4MDAwMDAxOH19LAorICB7Impsc3MiLAl7ImI/IiwgMHg4MDAwMDAxOX19LAorICB7ImpndHJ1IiwJeyJiPyIsIDB4ODAwMDAwMWF9fSwKKyAgeyJqbGVxdSIsCXsiYj8iLCAweDgwMDAwMDFifX0sCisgIHsianZjIiwJeyJiPyIsIDB4ODAwMDAwMWN9fSwKKyAgeyJqdnMiLAl7ImI/IiwgMHg4MDAwMDAxZH19LAorICB7ImpnZXF1IiwJeyJiPyIsIDB4ODAwMDAwMWV9fSwKKyAgeyJqY2MiLAl7ImI/IiwgMHg4MDAwMDAxZX19LAorICB7Impsc3N1IiwJeyJiPyIsIDB4ODAwMDAwMWZ9fSwKKyAgeyJqY3MiLAl7ImI/IiwgMHg4MDAwMDAxZn19LAorCisgIHsiamFjYnciLAl7InJ3cndtd2IhIiwgMHhDMDAwMDAzZH19LAorICB7ImphY2JmIiwJeyJyZnJmbWZiISIsIDB4QzAwMDAwNGZ9fSwKKyAgeyJqYWNiZCIsCXsicmRyZG1kYiEiLCAweEMwMDAwMDZmfX0sCisgIHsiamFjYmIiLAl7InJicmJtYmIhIiwgMHhDMDAwMDA5ZH19LAorICB7ImphY2JsIiwJeyJybHJsbWxiISIsIDB4QzAwMDAwZjF9fSwKKyAgeyJqYWNiZyIsCXsicmdyZ21nYiEiLCAweEMwMDA0ZmZkfX0sCisgIHsiamFjYmgiLAl7InJocmhtaGIhIiwgMHhDMDAwNmZmZH19LAorCisgIHsiamJzIiwJeyJybHZiYj8iLCAweDgwMDAwMGUwfX0sCisgIHsiamJjIiwJeyJybHZiYj8iLCAweDgwMDAwMGUxfX0sCisgIHsiamJzcyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMn19LAorICB7ImpiY3MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTN9fSwKKyAgeyJqYnNjIiwJeyJybHZiYj8iLCAweDgwMDAwMGU0fX0sCisgIHsiamJjYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNX19LAorICB7Impic3NpIiwJeyJybHZiYj8iLCAweDgwMDAwMGU2fX0sCisgIHsiamJjY2kiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTd9fSwKKyAgeyJqbGJzIiwJeyJybGI/IiwgMHg4MDAwMDBlOH19LAorICB7ImpsYmMiLAl7InJsYj8iLCAweDgwMDAwMGU5fX0sCisKKyAgeyJqYW9ibHNzIiwJeyJybG1sYjoiLCAweEMwMDAwMGYyfX0sCisgIHsiamFvYmxlcSIsCXsicmxtbGI6IiwgMHhDMDAwMDBmM319LAorICB7Impzb2JnZXEiLAl7Im1sYjoiLCAweEMwMDAwMGY0fX0sCisgIHsianNvYmd0ciIsCXsibWxiOiIsIDB4QzAwMDAwZjV9fSwKKworLyogQ0FTRXggaGFzIG5vIGJyYW5jaCBhZGRyZXNzZXMgaW4gb3VyIGNvbmNlcHRpb24gb2YgaXQuICovCisvKiBZb3Ugc2hvdWxkIHVzZSAiLndvcmQgLi4uIiBzdGF0ZW1lbnRzIGFmdGVyIHRoZSAiY2FzZSAuLi4iLiAqLworCisgIHsiIiwJeyIiLCAwfX0JCQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KKworfTsJCQkJLyogc3ludGhldGljX3ZvdHN0cnMgKi8KKwwKKy8qCisgKiAgICAgICAgICAgICAgICAgIHYgaSBwIF8gYiBlIGcgaSBuICggKQorICoKKyAqIENhbGwgbWUgb25jZSBiZWZvcmUgeW91IGRlY29kZSBhbnkgbGluZXMuCisgKiBJIGRlY29kZSB2b3RzdHJzIGludG8gYSBoYXNoIHRhYmxlIGF0IG9wX2hhc2ggKHdoaWNoIEkgY3JlYXRlKS4KKyAqIEkgcmV0dXJuIGFuIGVycm9yIHRleHQgb3IgbnVsbC4KKyAqIElmIHlvdSB3YW50LCBJIHdpbGwgaW5jbHVkZSB0aGUgJ3N5bnRoZXRpYycgalhYWCBpbnN0cnVjdGlvbnMgaW4gdGhlCisgKiBpbnN0cnVjdGlvbiB0YWJsZS4KKyAqIFlvdSBtdXN0IG5vbWluYXRlIG1ldGFjaGFyYWN0ZXJzIGZvciBlZyBERUMncyAiIyIsICJAIiwgIl4iLgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3ZpcF9iZWdpbiAoc3ludGhldGljX3RvbywgaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbikKKyAgICAgaW50IHN5bnRoZXRpY190b287CQkvKiAxIG1lYW5zIGluY2x1ZGUgalhYWCBvcC1jb2Rlcy4gKi8KKyAgICAgY29uc3QgY2hhciAqaW1tZWRpYXRlLCAqaW5kaXJlY3QsICpkaXNwbGVuOworeworICBjb25zdCBzdHJ1Y3Qgdm90ICp2UDsJCS8qIHNjYW4gdm90c3RycyAqLworICBjb25zdCBjaGFyICpyZXR2YWwgPSAwOwkvKiBlcnJvciB0ZXh0ICovCisKKyAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOworCisgIGZvciAodlAgPSB2b3RzdHJzOyAqdlAtPnZvdF9uYW1lICYmICFyZXR2YWw7IHZQKyspCisgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIHZQLT52b3RfbmFtZSwgKFBUUikgJnZQLT52b3RfZGV0YWlsKTsKKworICBpZiAoc3ludGhldGljX3RvbykKKyAgICBmb3IgKHZQID0gc3ludGhldGljX3ZvdHN0cnM7ICp2UC0+dm90X25hbWUgJiYgIXJldHZhbDsgdlArKykKKyAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB2UC0+dm90X25hbWUsIChQVFIpICZ2UC0+dm90X2RldGFpbCk7CisKKyNpZm5kZWYgQ09OU1RfVEFCTEUKKyAgdmlwX29wX2RlZmF1bHRzIChpbW1lZGlhdGUsIGluZGlyZWN0LCBkaXNwbGVuKTsKKyNlbmRpZgorCisgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqICAgICAgICAgICAgICAgICAgdiBpIHAgKCApCisgKgorICogVGhpcyBjb252ZXJ0cyBhIHN0cmluZyBpbnRvIGEgdmF4IGluc3RydWN0aW9uLgorICogVGhlIHN0cmluZyBtdXN0IGJlIGEgYmFyZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaW4gZGVjLXZheCAod2l0aCBCU0Q0IGZyb2JzKQorICogZm9ybWF0LgorICogSXQgcHJvdmlkZXMgc29tZSBlcnJvciBtZXNzYWdlczogYXQgbW9zdCBvbmUgZmF0YWwgZXJyb3IgbWVzc2FnZSAod2hpY2gKKyAqIHN0b3BzIHRoZSBzY2FuKSBhbmQgYXQgbW9zdCBvbmUgd2FybmluZyBtZXNzYWdlIGZvciBlYWNoIG9wZXJhbmQuCisgKiBUaGUgdmF4IGluc3RydWN0aW9uIGlzIHJldHVybmVkIGluIGV4cGxvZGVkIGZvcm0sIHNpbmNlIHdlIGhhdmUgbm8KKyAqIGtub3dsZWRnZSBvZiBob3cgeW91IHBhcnNlIChvciBldmFsdWF0ZSkgeW91ciBleHByZXNzaW9ucy4KKyAqIFdlIGRvIGhvd2V2ZXIgc3RyaXAgb2ZmIGFuZCBkZWNvZGUgYWRkcmVzc2luZyBtb2RlcyBhbmQgb3BlcmF0aW9uCisgKiBtbmVtb25pYy4KKyAqCisgKiBUaGUgZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgdG8gYSBzdHJ1Y3Qgdml0IG9mIHlvdXIgY2hvaWNlLgorICogI2luY2x1ZGUgInZheC1pbnN0LmgiIHRvIGtub3cgd2hhdCBhIHN0cnVjdCB2aXQgaXMuCisgKgorICogVGhpcyBmdW5jdGlvbidzIHZhbHVlIGlzIGEgc3RyaW5nLiBJZiBpdCBpcyBub3QgIiIgdGhlbiBhbiBpbnRlcm5hbAorICogbG9naWMgZXJyb3Igd2FzIGZvdW5kOiByZWFkIHRoaXMgY29kZSB0byBhc3NpZ24gbWVhbmluZyB0byB0aGUgc3RyaW5nLgorICogTm8gYXJndW1lbnQgc3RyaW5nIHNob3VsZCBnZW5lcmF0ZSBzdWNoIGFuIGVycm9yIHN0cmluZzoKKyAqIGl0IG1lYW5zIGEgYnVnIGluIG91ciBjb2RlLCBub3QgaW4gdGhlIHVzZXIncyB0ZXh0LgorICoKKyAqIFlvdSBNVVNUIGhhdmUgY2FsbGVkIHZpcF9iZWdpbigpIG9uY2UgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KKworc3RhdGljIHZvaWQKK3ZpcCAodml0UCwgaW5zdHJpbmcpCisgICAgIHN0cnVjdCB2aXQgKnZpdFA7CQkvKiBXZSBidWlsZCBhbiBleHBsb2RlZCBpbnN0cnVjdGlvbiBoZXJlLiAqLworICAgICBjaGFyICppbnN0cmluZzsJCS8qIFRleHQgb2YgYSB2YXggaW5zdHJ1Y3Rpb246IHdlIG1vZGlmeS4gKi8KK3sKKyAgLyogSG93IHRvIGJpdC1lbmNvZGUgdGhpcyBvcGNvZGUuICovCisgIHN0cnVjdCB2b3Rfd290ICp2d1A7CisgIC8qIDEvc2tpcCB3aGl0ZXNwYWNlLjIvc2NhbiB2b3RfaG93ICovCisgIGNoYXIgKnA7CisgIGNoYXIgKnE7CisgIC8qIGNvdW50cyBudW1iZXIgb2Ygb3BlcmFuZHMgc2VlbiAqLworICB1bnNpZ25lZCBjaGFyIGNvdW50OworICAvKiBzY2FuIG9wZXJhbmRzIGluIHN0cnVjdCB2aXQgKi8KKyAgc3RydWN0IHZvcCAqb3BlcmFuZHA7CisgIC8qIGVycm9yIG92ZXIgYWxsIG9wZXJhbmRzICovCisgIGNvbnN0IGNoYXIgKmFsbG9wZXJyOworICAvKiBSZW1lbWJlciBjaGFyLCAod2UgY2xvYmJlciBpdCB3aXRoICdcMCcgdGVtcG9yYXJpbHkpLiAqLworICBjaGFyIGM7CisgIC8qIE9wLWNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4gKi8KKyAgdmF4X29wY29kZVQgb2M7CisKKyAgaWYgKCppbnN0cmluZyA9PSAnICcpCisgICAgKytpbnN0cmluZzsJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKyAgZm9yIChwID0gaW5zdHJpbmc7ICpwICYmICpwICE9ICcgJzsgcCsrKTs7CS8qIE1VU1QgZW5kIGluIGVuZC1vZi1zdHJpbmcgb3IgZXhhY3RseSAxIHNwYWNlLiAqLworICAvKiBTY2FubmVkIHVwIHRvIGVuZCBvZiBvcGVyYXRpb24tY29kZS4gKi8KKyAgLyogT3BlcmF0aW9uLWNvZGUgaXMgZW5kZWQgd2l0aCB3aGl0ZXNwYWNlLiAqLworICBpZiAocCAtIGluc3RyaW5nID09IDApCisgICAgeworICAgICAgdml0UC0+dml0X2Vycm9yID0gXygiTm8gb3BlcmF0b3IiKTsKKyAgICAgIGNvdW50ID0gMDsKKyAgICAgIG1lbXNldCAodml0UC0+dml0X29wY29kZSwgJ1wwJywgc2l6ZW9mICh2aXRQLT52aXRfb3Bjb2RlKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYyA9ICpwOworICAgICAgKnAgPSAnXDAnOworICAgICAgLyoKKyAgICAgICAqIEhlcmUgd2l0aCBpbnN0cmluZyBwb2ludGluZyB0byB3aGF0IGJldHRlciBiZSBhbiBvcC1uYW1lLCBhbmQgcAorICAgICAgICogcG9pbnRpbmcgdG8gY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGF0LgorICAgICAgICogV2UgdHJ1c3QgaW5zdHJpbmcgcG9pbnRzIHRvIGFuIG9wLW5hbWUsIHdpdGggbm8gd2hpdGVzcGFjZS4KKyAgICAgICAqLworICAgICAgdndQID0gKHN0cnVjdCB2b3Rfd290ICopIGhhc2hfZmluZCAob3BfaGFzaCwgaW5zdHJpbmcpOworICAgICAgKnAgPSBjOwkJCS8qIFJlc3RvcmUgY2hhciBhZnRlciBvcC1jb2RlLiAqLworICAgICAgaWYgKHZ3UCA9PSAwKQorCXsKKwkgIHZpdFAtPnZpdF9lcnJvciA9IF8oIlVua25vd24gb3BlcmF0b3IiKTsKKwkgIGNvdW50ID0gMDsKKwkgIG1lbXNldCAodml0UC0+dml0X29wY29kZSwgJ1wwJywgc2l6ZW9mICh2aXRQLT52aXRfb3Bjb2RlKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qCisJICAgKiBXZSBmb3VuZCBhIG1hdGNoISBTbyBsZXRzIHBpY2sgdXAgYXMgbWFueSBvcGVyYW5kcyBhcyB0aGUKKwkgICAqIGluc3RydWN0aW9uIHdhbnRzLCBhbmQgZXZlbiBncmlwZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkuCisJICAgKiBXZSBleHBlY3QgY29tbWEgdG8gc2VwZXJhdGUgZWFjaCBvcGVyYW5kLgorCSAgICogV2UgbGV0IGluc3RyaW5nIHRyYWNrIHRoZSB0ZXh0LCB3aGlsZSBwIHRyYWNrcyBhIHBhcnQgb2YgdGhlCisJICAgKiBzdHJ1Y3Qgdm90LgorCSAgICovCisJICBjb25zdCBjaGFyICpob3dwOworCSAgLyoKKwkgICAqIFRoZSBsaW5lcyBiZWxvdyBrbm93IGFib3V0IDItYnl0ZSBvcGNvZGVzIHN0YXJ0aW5nIEZELEZFIG9yIEZGLgorCSAgICogVGhleSBhbHNvIHVuZGVyc3RhbmQgc3ludGhldGljIG9wY29kZXMuIE5vdGU6CisJICAgKiB3ZSByZXR1cm4gMzIgYml0cyBvZiBvcGNvZGUsIGluY2x1ZGluZyBidWNreSBiaXRzLCBCVVQKKwkgICAqIGFuIG9wY29kZSBsZW5ndGggaXMgZWl0aGVyIDggb3IgMTYgYml0cyBmb3Igdml0X29wY29kZV9uYnl0ZXMuCisJICAgKi8KKwkgIG9jID0gdndQLT52b3RfY29kZTsJLyogVGhlIG9wLWNvZGUuICovCisJICB2aXRQLT52aXRfb3Bjb2RlX25ieXRlcyA9IChvYyAmIDB4RkYpID49IDB4RkQgPyAyIDogMTsKKwkgIG1kX251bWJlcl90b19jaGFycyAodml0UC0+dml0X29wY29kZSwgb2MsIDQpOworCSAgY291bnQgPSAwOwkJLyogbm8gb3BlcmFuZHMgc2VlbiB5ZXQgKi8KKwkgIGluc3RyaW5nID0gcDsJCS8qIHBvaW50IGp1c3QgcGFzdCBvcGVyYXRpb24gY29kZSAqLworCSAgYWxsb3BlcnIgPSAiIjsKKwkgIGZvciAoaG93cCA9IHZ3UC0+dm90X2hvdywgb3BlcmFuZHAgPSB2aXRQLT52aXRfb3BlcmFuZDsKKwkgICAgICAgIShhbGxvcGVyciAmJiAqYWxsb3BlcnIpICYmICpob3dwOworCSAgICAgICBvcGVyYW5kcCsrLCBob3dwICs9IDIpCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIEhlcmUgdG8gcGFyc2Ugb25lIG9wZXJhbmQuIExlYXZlIGluc3RyaW5nIHBvaW50aW5nIGp1c3QKKwkgICAgICAgKiBwYXN0IGFueSBvbmUgJywnIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQuCisJICAgICAgICovCisJICAgICAgaWYgKCFob3dwWzFdKQorCQlhc19mYXRhbCAoXygib2RkIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kIGRlc2NyaXB0aW9uIikpOworCSAgICAgIGVsc2UgaWYgKCppbnN0cmluZykKKwkJeworCQkgIGZvciAocSA9IGluc3RyaW5nOyAoYyA9ICpxKSAmJiBjICE9ICcsJzsgcSsrKQorCQkgICAgOworCQkgIC8qCisJCSAgICogUSBwb2ludHMgdG8gJywnIG9yICdcMCcgdGhhdCBlbmRzIGFyZ3VtZW50LiBDIGlzIHRoYXQKKwkJICAgKiBjaGFyYWN0ZXIuCisJCSAgICovCisJCSAgKnEgPSAwOworCQkgIG9wZXJhbmRwLT52b3Bfd2lkdGggPSBob3dwWzFdOworCQkgIG9wZXJhbmRwLT52b3BfbmJ5dGVzID0gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVsodW5zaWduZWQpIGhvd3BbMV1dOworCQkgIG9wZXJhbmRwLT52b3BfYWNjZXNzID0gaG93cFswXTsKKwkJICB2aXBfb3AgKGluc3RyaW5nLCBvcGVyYW5kcCk7CisJCSAgKnEgPSBjOwkvKiBSZXN0b3JlIGlucHV0IHRleHQuICovCisJCSAgaWYgKG9wZXJhbmRwLT52b3BfZXJyb3IpCisJCSAgICBhbGxvcGVyciA9IF8oIkJhZCBvcGVyYW5kIik7CisJCSAgaW5zdHJpbmcgPSBxICsgKGMgPyAxIDogMCk7CS8qIG5leHQgb3BlcmFuZCAoaWYgYW55KSAqLworCQkgIGNvdW50Kys7CS8qICB3b24gYW5vdGhlciBhcmd1bWVudCwgbWF5IGhhdmUgYW4gb3BlcnIgKi8KKwkJfQorCSAgICAgIGVsc2UKKwkJYWxsb3BlcnIgPSBfKCJOb3QgZW5vdWdoIG9wZXJhbmRzIik7CisJICAgIH0KKwkgIGlmICghKmFsbG9wZXJyKQorCSAgICB7CisJICAgICAgaWYgKCppbnN0cmluZyA9PSAnICcpCisJCWluc3RyaW5nKys7CS8qIFNraXAgd2hpdGVzcGFjZS4gKi8KKwkgICAgICBpZiAoKmluc3RyaW5nKQorCQlhbGxvcGVyciA9IF8oIlRvbyBtYW55IG9wZXJhbmRzIik7CisJICAgIH0KKwkgIHZpdFAtPnZpdF9lcnJvciA9IGFsbG9wZXJyOworCX0KKyAgICB9CisgIHZpdFAtPnZpdF9vcGVyYW5kcyA9IGNvdW50OworfQorDAorI2lmZGVmIHRlc3QKKworLyoKKyAqIFRlc3QgcHJvZ3JhbSBmb3IgYWJvdmUuCisgKi8KKworc3RydWN0IHZpdCBteXZpdDsJCS8qIGJ1aWxkIGFuIGV4cGxvZGVkIHZheCBpbnN0cnVjdGlvbiBoZXJlICovCitjaGFyIGFuc3dlclsxMDBdOwkJLyogaHVtYW4gdHlwZXMgYSBsaW5lIG9mIHZheCBhc3NlbWJsZXIgaGVyZSAqLworY2hhciAqbXlidWc7CQkJLyogIiIgb3IgYW4gaW50ZXJuYWwgbG9naWMgZGlhZ25vc3RpYyAqLworaW50IG15Y291bnQ7CQkJLyogbnVtYmVyIG9mIG9wZXJhbmRzICovCitzdHJ1Y3Qgdm9wICpteXZvcDsJCS8qIHNjYW4gb3BlcmFuZHMgZnJvbSBteXZpdCAqLworaW50IG15c3ludGg7CQkJLyogMSBtZWFucyB3YW50IHN5bnRoZXRpYyBvcGNvZGVzLiAqLworY2hhciBteV9pbW1lZGlhdGVbMjAwXTsKK2NoYXIgbXlfaW5kaXJlY3RbMjAwXTsKK2NoYXIgbXlfZGlzcGxlblsyMDBdOworCittYWluICgpCit7CisgIGNoYXIgKnA7CisKKyAgcHJpbnRmICgiMCBtZWFucyBubyBzeW50aGV0aWMgaW5zdHJ1Y3Rpb25zLiAgICIpOworICBwcmludGYgKCJWYWx1ZSBmb3IgdmlwX2JlZ2luPyAgIik7CisgIGdldHMgKGFuc3dlcik7CisgIHNzY2FuZiAoYW5zd2VyLCAiJWQiLCAmbXlzeW50aCk7CisgIHByaW50ZiAoIlN5bnRoZXRpYyBvcGNvZGVzICVzIGJlIGluY2x1ZGVkLlxuIiwgbXlzeW50aCA/ICJ3aWxsIiA6ICJ3aWxsIG5vdCIpOworICBwcmludGYgKCJlbnRlciBpbW1lZGlhdGUgc3ltYm9scyBlZyBlbnRlciAjICAgIik7CisgIGdldHMgKG15X2ltbWVkaWF0ZSk7CisgIHByaW50ZiAoImVudGVyIGluZGlyZWN0IHN5bWJvbHMgIGVnIGVudGVyIEAgICAiKTsKKyAgZ2V0cyAobXlfaW5kaXJlY3QpOworICBwcmludGYgKCJlbnRlciBkaXNwbGVuIHN5bWJvbHMgICBlZyBlbnRlciBeICAgIik7CisgIGdldHMgKG15X2Rpc3BsZW4pOworICBpZiAocCA9IHZpcF9iZWdpbiAobXlzeW50aCwgbXlfaW1tZWRpYXRlLCBteV9pbmRpcmVjdCwgbXlfZGlzcGxlbikpCisgICAgeworICAgICAgZXJyb3IgKCJ2aXBfYmVnaW49JXMiLCBwKTsKKyAgICB9CisgIHByaW50ZiAoIkFuIGVtcHR5IGlucHV0IGxpbmUgd2lsbCBxdWl0IHlvdSBmcm9tIHRoZSB2YXggaW5zdHJ1Y3Rpb24gcGFyc2VyXG4iKTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBwcmludGYgKCJ2YXggaW5zdHJ1Y3Rpb246ICIpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgZ2V0cyAoYW5zd2VyKTsKKyAgICAgIGlmICghKmFuc3dlcikKKwl7CisJICBicmVhazsJCS8qIG91dCBvZiBmb3IgZWFjaCBpbnB1dCB0ZXh0IGxvb3AgKi8KKwl9CisgICAgICB2aXAgKCZteXZpdCwgYW5zd2VyKTsKKyAgICAgIGlmICgqbXl2aXQudml0X2Vycm9yKQorCXsKKwkgIHByaW50ZiAoIkVSUjpcIiVzXCJcbiIsIG15dml0LnZpdF9lcnJvcik7CisJfQorICAgICAgcHJpbnRmICgib3Bjb2RlPSIpOworICAgICAgZm9yIChteWNvdW50ID0gbXl2aXQudml0X29wY29kZV9uYnl0ZXMsIHAgPSBteXZpdC52aXRfb3Bjb2RlOworCSAgIG15Y291bnQ7CisJICAgbXljb3VudC0tLCBwKysKKwkpCisJeworCSAgcHJpbnRmICgiJTAyeCAiLCAqcCAmIDB4RkYpOworCX0KKyAgICAgIHByaW50ZiAoIiAgIG9wZXJhbmQgY291bnQ9JWQuXG4iLCBteWNvdW50ID0gbXl2aXQudml0X29wZXJhbmRzKTsKKyAgICAgIGZvciAobXl2b3AgPSBteXZpdC52aXRfb3BlcmFuZDsgbXljb3VudDsgbXljb3VudC0tLCBteXZvcCsrKQorCXsKKwkgIHByaW50ZiAoIm1vZGU9JXh4IHJlZz0leHggbmR4PSV4eCBsZW49JyVjJz0lYyVjJWQuIGV4cHI9XCIiLAorCQkgIG15dm9wLT52b3BfbW9kZSwgbXl2b3AtPnZvcF9yZWcsIG15dm9wLT52b3BfbmR4LAorCQkgIG15dm9wLT52b3Bfc2hvcnQsIG15dm9wLT52b3BfYWNjZXNzLCBteXZvcC0+dm9wX3dpZHRoLAorCQkgIG15dm9wLT52b3BfbmJ5dGVzKTsKKwkgIGZvciAocCA9IG15dm9wLT52b3BfZXhwcl9iZWdpbjsgcCA8PSBteXZvcC0+dm9wX2V4cHJfZW5kOyBwKyspCisJICAgIHsKKwkgICAgICBwdXRjaGFyICgqcCk7CisJICAgIH0KKwkgIHByaW50ZiAoIlwiXG4iKTsKKwkgIGlmIChteXZvcC0+dm9wX2Vycm9yKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiICBlcnI6XCIlc1wiXG4iLCBteXZvcC0+dm9wX2Vycm9yKTsKKwkgICAgfQorCSAgaWYgKG15dm9wLT52b3Bfd2FybikKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiAgd3JuOlwiJXNcIlxuIiwgbXl2b3AtPnZvcF93YXJuKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHZpcF9lbmQgKCk7CisgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgdGVzdCAqLworCisvKiBlbmQgb2YgdmF4X2luc19wYXJzZS5jICovCisKKy8qIHZheF9yZWdfcGFyc2UuYyAtIGNvbnZlcnQgYSBWQVggcmVnaXN0ZXIgbmFtZSB0byBhIG51bWJlciAqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5ODcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIEEgcGFydCBvZiBHTlUuICovCisKKy8qCisgKiAgICAgICAgICB2IGEgeCBfIHIgZSBnIF8gcCBhIHIgcyBlICggKQorICoKKyAqIFRha2UgMyBjaGFyLnMsIHRoZSBsYXN0IG9mIHdoaWNoIG1heSBiZSBgXDBgIChub24tZXhpc3RlbnQpCisgKiBhbmQgcmV0dXJuIHRoZSBWQVggcmVnaXN0ZXIgbnVtYmVyIHRoYXQgdGhleSByZXByZXNlbnQuCisgKgorICogUmV0dXJuIC0xIGlmIHRoZXkgZG9uJ3QgZm9ybSBhIHJlZ2lzdGVyIG5hbWUuIEdvb2QgbmFtZXMgcmV0dXJuCisgKiBhIG51bWJlciBmcm9tIDA6MTUgaW5jbHVzaXZlLgorICoKKyAqIENhc2UgaXMgbm90IGltcG9ydGFudCBpbiBhIG5hbWUuCisgKgorICogUmVnaXN0ZXIgbmFtZXMgdW5kZXJzdG9vZCBhcmU6CisgKgorICoJUjAKKyAqCVIxCisgKglSMgorICoJUjMKKyAqCVI0CisgKglSNQorICoJUjYKKyAqIAlSNworICoJUjgKKyAqCVI5CisgKglSMTAKKyAqCVIxMQorICoJUjEyCUFQCisgKglSMTMJRlAKKyAqCVIxNAlTUAorICoJUjE1CVBDCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBBUCAoMTIpCisjZGVmaW5lIEZQICgxMykKKyNkZWZpbmUgU1AgKDE0KQorI2RlZmluZSBQQyAoMTUpCisMCitpbnQJCQkJLyogcmV0dXJuIC0xIG9yIDA6MTUgKi8KK3ZheF9yZWdfcGFyc2UgKGMxLCBjMiwgYzMpCS8qIDMgY2hhcnMgb2YgcmVnaXN0ZXIgbmFtZSAqLworICAgICBjaGFyIGMxLCBjMiwgYzM7CQkvKiBjMyA9PSAwIGlmIDItY2hhcmFjdGVyIHJlZyBuYW1lICovCit7CisgIGludCByZXR2YWw7CQkvKiByZXR1cm4gLTE6MTUgKi8KKworICByZXR2YWwgPSAtMTsKKworICBpZiAoaXN1cHBlciAoYzEpKQorICAgIGMxID0gdG9sb3dlciAoYzEpOworICBpZiAoaXN1cHBlciAoYzIpKQorICAgIGMyID0gdG9sb3dlciAoYzIpOworICBpZiAoaXNkaWdpdCAoYzIpICYmIGMxID09ICdyJykKKyAgICB7CisgICAgICByZXR2YWwgPSBjMiAtICcwJzsKKyAgICAgIGlmIChpc2RpZ2l0IChjMykpCisJeworCSAgcmV0dmFsID0gcmV0dmFsICogMTAgKyBjMyAtICcwJzsKKwkgIHJldHZhbCA9IChyZXR2YWwgPiAxNSkgPyAtMSA6IHJldHZhbDsKKwkgIC8qIGNsYW1wIHRoZSByZWdpc3RlciB2YWx1ZSB0byAxIGhleCBkaWdpdCAqLworCX0KKyAgICAgIGVsc2UgaWYgKGMzKQorCXJldHZhbCA9IC0xOwkJLyogYzMgbXVzdCBiZSAnXDAnIG9yIGEgZGlnaXQgKi8KKyAgICB9CisgIGVsc2UgaWYgKGMzKQkJCS8qIFRoZXJlIGFyZSBubyB0aHJlZSBsZXR0ZXIgcmVncyAqLworICAgIHJldHZhbCA9IC0xOworICBlbHNlIGlmIChjMiA9PSAncCcpCisgICAgeworICAgICAgc3dpdGNoIChjMSkKKwl7CisJY2FzZSAncyc6CisJICByZXR2YWwgPSBTUDsKKwkgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgcmV0dmFsID0gRlA7CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIHJldHZhbCA9IEFQOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHJldHZhbCA9IC0xOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGMxID09ICdwJyAmJiBjMiA9PSAnYycpCisgICAgcmV0dmFsID0gUEM7CisgIGVsc2UKKyAgICByZXR2YWwgPSAtMTsKKyAgcmV0dXJuIChyZXR2YWwpOworfQorCisvKgorICogICAgICAgICAgICAgICB2IGkgcCBfIG8gcCAoICkKKyAqCisgKiBQYXJzZSBhIHZheCBvcGVyYW5kIGluIERFQyBhc3NlbWJsZXIgbm90YXRpb24uCisgKiBGb3Igc3BlZWQsIGV4cGVjdCBhIHN0cmluZyBvZiB3aGl0ZXNwYWNlIHRvIGJlIHJlZHVjZWQgdG8gYSBzaW5nbGUgJyAnLgorICogVGhpcyBpcyB0aGUgY2FzZSBmb3IgR05VIEFTLCBhbmQgaXMgZWFzeSBmb3Igb3RoZXIgREVDLWNvbXBhdGlibGUKKyAqIGFzc2VtYmxlcnMuCisgKgorICogS25vd2xlZGdlIGFib3V0IERFQyBWQVggYXNzZW1ibGVyIG9wZXJhbmQgbm90YXRpb24gbGl2ZXMgaGVyZS4KKyAqIFRoaXMgZG9lc24ndCBldmVuIGtub3cgd2hhdCBhIHJlZ2lzdGVyIG5hbWUgaXMsIGV4Y2VwdCBpdCBiZWxpZXZlcworICogYWxsIHJlZ2lzdGVyIG5hbWVzIGFyZSAyIG9yIDMgY2hhcmFjdGVycywgYW5kIGxldHMgdmF4X3JlZ19wYXJzZSgpIHNheQorICogd2hhdCBudW1iZXIgZWFjaCBuYW1lIHJlcHJlc2VudHMuCisgKiBJdCBkb2VzLCBob3dldmVyLCBrbm93IHRoYXQgUEMsIFNQIGV0YyBhcmUgc3BlY2lhbCByZWdpc3RlcnMgc28gaXQgY2FuCisgKiBkZXRlY3QgYWRkcmVzc2luZyBtb2RlcyB0aGF0IGFyZSBzaWxseSBmb3IgdGhvc2UgcmVnaXN0ZXJzLgorICoKKyAqIFdoZXJlIHBvc3NpYmxlLCBpdCBkZWxpdmVycyAxIGZhdGFsIG9yIDEgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBvcGVyYW5kCisgKiBpcyBzdXNwZWN0LiBFeGFjdGx5IHdoYXQgd2UgdGVzdCBmb3IgaXMgc3RpbGwgZXZvbHZpbmcuCisgKi8KKworLyoKKyAqCQkgICAJQiB1IGcgcworICoKKyAqCUFyZyBibG9jay4KKyAqCisgKiBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mICdtaXNtYXRjaGVkIGFyZ3VtZW50IHR5cGUnIGJ1Z3MgdG8gdmlwX29wLgorICogVGhlIG1vc3QgZ2VuZXJhbCBzb2x1dGlvbiBpcyB0byB0eXBlZGVmIGVhY2ggKG9mIG1hbnkpIGFyZ3VtZW50cy4KKyAqIFdlIHVzZWQgaW5zdGVhZCBhIHR5cGVkZWYnZCBhcmd1bWVudCBibG9jay4gVGhpcyBpcyBsZXNzIG1vZHVsYXIKKyAqIHRoYW4gdXNpbmcgc2VwZXJhdGUgcmV0dXJuIHBvaW50ZXJzIGZvciBlYWNoIHJlc3VsdCwgYnV0IHJ1bnMgZmFzdGVyCisgKiBvbiBtb3N0IGVuZ2luZXMsIGFuZCBzZWVtcyB0byBrZWVwIHByb2dyYW1tZXJzIGhhcHB5LiBJdCB3aWxsIGhhdmUKKyAqIHRvIGJlIGRvbmUgcHJvcGVybHkgaWYgd2UgZXZlciB3YW50IHRvIHVzZSB2aXBfb3AgYXMgYSBnZW5lcmFsLXB1cnBvc2UKKyAqIG1vZHVsZSAoaXQgd2FzIGRlc2lnbmVkIHRvIGJlKS4KKyAqCisgKglHXgorICoKKyAqIERvZXNuJ3Qgc3VwcG9ydCBERUMgIkdeIiBmb3JtYXQgb3BlcmFuZHMuIFRoZXNlIGFsd2F5cyB0YWtlIDUgYnl0ZXMKKyAqIHRvIGV4cHJlc3MsIGFuZCBjb2RlIGFzIG1vZGVzIDhGIG9yIDlGLiBSZWFzb246ICJHXiIgZGVwcml2ZXMgeW91IG9mCisgKiBvcHRpbWlzaW5nIHRvIChzYXkpIGEgIkJeIiBpZiB5b3UgYXJlIGx1Y2t5IGluIHRoZSB3YXkgeW91IGxpbmsuCisgKiBXaGVuIHNvbWVvbmUgYnVpbGRzIGEgbGlua2VyIHNtYXJ0IGVub3VnaCB0byBjb252ZXJ0ICJHXiIgdG8gIkJeIiwgIldeIgorICogd2hlbmV2ZXIgcG9zc2libGUsIHRoZW4gd2Ugc2hvdWxkIGltcGxlbWVudCBpdC4KKyAqIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgdXNlIGZvciAiR14iLCBmZWVsIGZyZWUgdG8gY29kZSBpdCBpbiEKKyAqCisgKgorICoJc3BlZWQKKyAqCisgKiBJZiBJIG5lc3RlZCBpZigpcyBtb3JlLCBJIGNvdWxkIGF2b2lkIHRlc3RpbmcgKCplcnIpIHdoaWNoIHdvdWxkIHNhdmUKKyAqIHRpbWUsIHNwYWNlIGFuZCBwYWdlIGZhdWx0cy4gSSBkaWRuJ3QgbmVzdCBhbGwgdGhvc2UgaWYoKXMgZm9yIGNsYXJpdHkKKyAqIGFuZCBiZWNhdXNlIEkgdGhpbmsgdGhlIG1vZGUgdGVzdGluZyBjYW4gYmUgcmUtYXJyYW5nZWQgMXN0IHRvIHRlc3QgdGhlCisgKiBjb21tb25lciBjb25zdHJ1Y3RzIDFzdC4gRG9lcyBhbnlib2R5IGhhdmUgc3RhdGlzdGljcyBvbiB0aGlzPworICoKKyAqCisgKgorICoJZXJyb3IgbWVzc2FnZXMKKyAqCisgKiBJbiBmdXR1cmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvICdjb21wb3NlJyBlcnJvciBtZXNzYWdlcyBpbiBhIHNjcmF0Y2ggYXJlYQorICogYW5kIGdpdmUgdGhlIHVzZXIgTVVDSCBtb3JlIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBBbHRob3VnaCB0aGlzIHRha2VzCisgKiBhIGxpdHRsZSBtb3JlIGNvZGUgYXQgcnVuLXRpbWUsIGl0IHdpbGwgbWFrZSB0aGlzIG1vZHVsZSBtdWNoIG1vcmUgc2VsZi0KKyAqIGRvY3VtZW50aW5nLiBBcyBhbiBleGFtcGxlIG9mIHdoYXQgc3Vja3Mgbm93OiBtb3N0IGVycm9yIG1lc3NhZ2VzIGhhdmUKKyAqIGhhcmR3aXJlZCBpbnRvIHRoZW0gdGhlIERFQyBWQVggbWV0YWNoYXJhY3RlcnMgIiNeQCIgd2hpY2ggYXJlIG5vdGhpbmcgbGlrZQorICogdGhlIFVuKnggY2hhcmFjdGVycyAiJGAqIiwgdGhhdCBtb3N0IHVzZXJzIHdpbGwgZXhwZWN0IGZyb20gdGhpcyBBUy4KKyAqLworDAorLyoKKyAqIFRoZSBpbnB1dCBpcyBhIHN0cmluZywgZW5kaW5nIHdpdGggJ1wwJy4KKyAqCisgKiBXZSBhbHNvIHJlcXVpcmUgYSAnaGludCcgb2Ygd2hhdCBraW5kIG9mIG9wZXJhbmQgaXMgZXhwZWN0ZWQ6IHNvCisgKiB3ZSBjYW4gcmVtaW5kIGNhbGxlciBub3QgdG8gd3JpdGUgaW50byBsaXRlcmFscyBmb3IgaW5zdGFuY2UuCisgKgorICogVGhlIG91dHB1dCBpcyBhIHNrZWxldGFsIGluc3RydWN0aW9uLgorICoKKyAqIFRoZSBhbGdvcml0aG0gaGFzIHR3byBwYXJ0cy4KKyAqIDEuIGV4dHJhY3QgdGhlIHN5bnRhY3RpYyBmZWF0dXJlcyAocGFyc2Ugb2ZmIGFsbCB0aGUgQF4jLSgpK1tdIG1vZGUgY3J1ZCk7CisgKiAyLiBleHByZXNzIHRoZSBAXiMtKCkrW10gYXMgc29tZSBwYXJhbWV0ZXJzIHN1aXRlZCB0byBmdXJ0aGVyIGFuYWx5c2lzLgorICoKKyAqIDJuZCBzdGVwIGlzIHdoZXJlIHdlIGRldGVjdCB0aGUgZ29vZ2xlcyBvZiBwb3NzaWJsZSBpbnZhbGlkIGNvbWJpbmF0aW9ucworICogYSBodW1hbiAob3IgY29tcGlsZXIpIG1pZ2h0IHdyaXRlLiBOb3RlIHRoYXQgaWYgd2UgZG8gYSBoYWxmLXdheQorICogZGVjZW50IGFzc2VtYmxlciwgd2UgZG9uJ3Qga25vdyBob3cgbG9uZyB0byBtYWtlIChlZykgZGlzcGxhY2VtZW50CisgKiBmaWVsZHMgd2hlbiB3ZSBmaXJzdCBtZWV0IHRoZW0gKGJlY2F1c2UgdGhleSBtYXkgbm90IGhhdmUgZGVmaW5lZCB2YWx1ZXMpLgorICogU28gd2UgbXVzdCB3YWl0IHVudGlsIHdlIGtub3cgaG93IG1hbnkgYml0cyBhcmUgbmVlZGVkIGZvciBlYWNoIGFkZHJlc3MsCisgKiB0aGVuIHdlIGNhbiBrbm93IGJvdGggbGVuZ3RoIGFuZCBvcGNvZGVzIG9mIGluc3RydWN0aW9ucy4KKyAqIEZvciByZWFzb24ocykgYWJvdmUsIHdlIHdpbGwgcGFzcyB0byBvdXIgY2FsbGVyIGEgJ2Jyb2tlbicgaW5zdHJ1Y3Rpb24KKyAqIG9mIHRoZXNlIG1ham9yIGNvbXBvbmVudHMsIGZyb20gd2hpY2ggb3VyIGNhbGxlciBjYW4gZ2VuZXJhdGUgaW5zdHJ1Y3Rpb25zOgorICogIC0gIGRpc3BsYWNlbWVudCBsZW5ndGggICAgICBJXiBTXiBMXiBCXiBXXiB1bnNwZWNpZmllZAorICogIC0gIG1vZGUgICAgICAgICAgICAgICAgICAgICAobWFueSkKKyAqICAtICByZWdpc3RlciAgICAgICAgICAgICAgICAgUjAtUjE1IG9yIGFic2VudAorICogIC0gIGluZGV4IHJlZ2lzdGVyICAgICAgICAgICBSMC1SMTUgb3IgYWJzZW50CisgKiAgLSAgZXhwcmVzc2lvbiB0ZXh0ICAgICAgICAgIHdoYXQgd2UgZG9uJ3QgcGFyc2UKKyAqICAtICBlcnJvciB0ZXh0KHMpICAgICAgICAgICAgd2h5IHdlIGNvdWxkbid0IHVuZGVyc3RhbmQgdGhlIG9wZXJhbmQKKyAqLworCisvKgorICogVG8gZGVjb2RlIG91dHB1dCBvZiB0aGlzLCB0ZXN0IGVycnR4dC4gSWYgZXJydHh0WzBdID09ICdcMCcsIHRoZW4KKyAqIHdlIGhhZCBubyBlcnJvcnMgdGhhdCBwcmV2ZW50ZWQgcGFyc2luZy4gQWxzbywgaWYgd2UgZXZlciByZXBvcnQKKyAqIGFuIGludGVybmFsIGJ1ZywgZXJydHh0WzBdIGlzIHNldCBub24temVyby4gU28gb25lIHRlc3QgdGVsbHMgeW91CisgKiBpZiB0aGUgb3RoZXIgb3V0cHV0cyBhcmUgdG8gYmUgdGFrZW4gc2VyaW91c2x5LgorICovCisKKworLyoKKyAqIEJlY2F1c2UgdGhpcyBtb2R1bGUgaXMgdXNlZnVsIGZvciBib3RoIFZNUyBhbmQgVU4qWCBzdHlsZSBhc3NlbWJsZXJzCisgKiBhbmQgYmVjYXVzZSBvZiB0aGUgdmFyaWV0eSBvZiBVTipYIGFzc2VtYmxlcnMgd2UgbXVzdCByZWNvZ25pc2UKKyAqIHRoZSBkaWZmZXJlbnQgY29udmVudGlvbnMgZm9yIGFzc2VtYmxlciBvcGVyYW5kIG5vdGF0aW9uLiBGb3IgZXhhbXBsZQorICogVk1TIHNheXMgIiM0MiIgZm9yIGltbWVkaWF0ZSBtb2RlLCB3aGlsZSBtb3N0IFVOKlggc2F5ICIkNDIiLgorICogV2UgcGVybWl0IGFyYml0cmFyeSBzZXRzIG9mIChzaW5nbGUpIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IHRoZQorICogMyBjb25jZXB0cyB0aGF0IERFQyB3cml0ZXMgJyMnLCAnQCcsICdeJy4KKyAqLworCisvKiBjaGFyYWN0ZXIgdGVzdHMgKi8KKyNkZWZpbmUgVklQX0lNTUVESUFURSAwMQkvKiBDaGFyYWN0ZXIgaXMgbGlrZSBERUMgIyAqLworI2RlZmluZSBWSVBfSU5ESVJFQ1QgIDAyCS8qIENoYXIgaXMgbGlrZSBERUMgQCAqLworI2RlZmluZSBWSVBfRElTUExFTiAgIDA0CS8qIENoYXIgaXMgbGlrZSBERUMgXiAqLworCisjZGVmaW5lIElNTUVESUFURVAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9JTU1FRElBVEUpCisjZGVmaW5lIElORElSRUNUUChjKQkodmlwX21ldGFjaGFyYWN0ZXJzIFsoYykmMHhmZl0mVklQX0lORElSRUNUKQorI2RlZmluZSBESVNQTEVOUChjKQkodmlwX21ldGFjaGFyYWN0ZXJzIFsoYykmMHhmZl0mVklQX0RJU1BMRU4pCisKKy8qIFdlIGFzc3VtZSA4IGJpdHMgcGVyIGJ5dGUuIFVzZSB2aXBfb3BfZGVmYXVsdHMoKSB0byBzZXQgdGhlc2UgdXAgQkVGT1JFIHdlCisgKiBhcmUgZXZlciBjYWxsZWQuCisgKi8KKworI2lmIGRlZmluZWQoQ09OU1RfVEFCTEUpCisjZGVmaW5lIF8gMCwKKyNkZWZpbmUgSSBWSVBfSU1NRURJQVRFLAorI2RlZmluZSBTIFZJUF9JTkRJUkVDVCwKKyNkZWZpbmUgRCBWSVBfRElTUExFTiwKK3N0YXRpYyBjb25zdCBjaGFyCit2aXBfbWV0YWNoYXJhY3RlcnNbMjU2XSA9Cit7CisgIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLyogXkAgXkEgXkIgXkMgXkQgXkUgXkYgXkcgXkggXkkgXkogXksgXkwgXk0gXk4gXk8qLworICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qIF5QIF5RIF5SIF5TIF5UIF5VIF5WIF5XIF5YIF5ZIF5aIF5bIF5cIF5dIF5eIF5fICovCisgIF8gXyBfIF8gSSBfIF8gXyBfIF8gUyBfIF8gXyBfIF8JLyogc3AgISAgIiAgIyAgJCAgJSAgJiAnICAoICApICAqICArICAsICAtICAuICAvICovCisgIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLyowICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICA6ICA7ICA8ICA9ICA+ICA/Ki8KKyAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKkAgIEEgIEIgIEMgIEQgIEUgIEYgIEcgIEggIEkgIEogIEsgIEwgIE0gIE4gIE8qLworICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qUCAgUSAgUiAgUyAgVCAgVSAgViAgVyAgWCAgWSAgWiAgWyAgXCAgXSAgXiAgXyovCisgIEQgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypgICBhICBiICBjICBkICBlICBmICBnICBoICBpICBqICBrICBsICBtICBuICBvKi8KKyAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKnAgIHEgIHIgIHMgIHQgIHUgIHYgIHcgIHggIHkgIHogIHsgIHwgIH0gIH4gIF4/Ki8KKworICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCisgIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KKyAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXworICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCisgIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KKyAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXworICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCisgIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KK307CisjdW5kZWYgXworI3VuZGVmIEkKKyN1bmRlZiBTCisjdW5kZWYgRAorI2Vsc2UKK3N0YXRpYyBjaGFyIHZpcF9tZXRhY2hhcmFjdGVyc1syNTZdOworCitzdGF0aWMgdm9pZAordmlwX29wXzEgKGJpdCwgc3ltcykKKyAgICAgaW50IGJpdDsKKyAgICAgY29uc3QgY2hhciAqc3ltczsKK3sKKyAgdW5zaWduZWQgY2hhciB0OworCisgIHdoaWxlICgodCA9ICpzeW1zKyspICE9IDApCisgICAgdmlwX21ldGFjaGFyYWN0ZXJzW3RdIHw9IGJpdDsKK30KKworLyogQ2FuIGJlIGNhbGxlZCBhbnkgdGltZS4gIE1vcmUgYXJndW1lbnRzIG1heSBhcHBlYXIgaW4gZnV0dXJlLiAgKi8KK3N0YXRpYyB2b2lkIAordmlwX29wX2RlZmF1bHRzIChpbW1lZGlhdGUsIGluZGlyZWN0LCBkaXNwbGVuKQorICAgICBjb25zdCBjaGFyICppbW1lZGlhdGU7CisgICAgIGNvbnN0IGNoYXIgKmluZGlyZWN0OworICAgICBjb25zdCBjaGFyICpkaXNwbGVuOworeworICB2aXBfb3BfMSAoVklQX0lNTUVESUFURSwgaW1tZWRpYXRlKTsKKyAgdmlwX29wXzEgKFZJUF9JTkRJUkVDVCwgaW5kaXJlY3QpOworICB2aXBfb3BfMSAoVklQX0RJU1BMRU4sIGRpc3BsZW4pOworfQorCisjZW5kaWYKKwwKKworLyoKKyAqIERlYyBkZWZpbmVzIHRoZSBzZW1hbnRpY3Mgb2YgYWRkcmVzcyBtb2RlcyAoYW5kIHZhbHVlcykKKyAqIGJ5IGEgdHdvLWxldHRlciBjb2RlLCBleHBsYWluZWQgaGVyZS4KKyAqCisgKiAgIGxldHRlciAxOiAgIGFjY2VzcyB0eXBlCisgKgorICogICAgIGEgICAgICAgICBhZGRyZXNzIGNhbGN1bGF0aW9uIC0gbm8gZGF0YSBhY2Nlc3MsIHJlZ2lzdGVycyBmb3JiaWRkZW4KKyAqICAgICBiICAgICAgICAgYnJhbmNoIGRpc3BsYWNlbWVudAorICogICAgIG0gICAgICAgICByZWFkIC0gbGV0IGdvIG9mIGJ1cyAtIHdyaXRlIGJhY2sgICAgIm1vZGlmeSIKKyAqICAgICByICAgICAgICAgcmVhZAorICogICAgIHYgICAgICAgICBiaXQgZmllbGQgYWRkcmVzczogbGlrZSAnYScgYnV0IHJlZ2lzdGVycyBhcmUgT0sKKyAqICAgICB3ICAgICAgICAgd3JpdGUKKyAqICAgICBzcGFjZQkgbm8gb3BlcmF0b3IgKGVnICIubG9uZyBmb28iKSBbb3VyIGNvbnZlbnRpb25dCisgKgorICogICBsZXR0ZXIgMjogICBkYXRhIHR5cGUgKGkuZS4gd2lkdGgsIGFsaWdubWVudCkKKyAqCisgKiAgICAgYiAgICAgICAgIGJ5dGUKKyAqICAgICBkICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCAoRCBmb3JtYXQpCisgKiAgICAgZiAgICAgICAgIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKEYgZm9ybWF0KQorICogICAgIGcgICAgICAgICBHIGZvcm1hdCBmbG9hdGluZworICogICAgIGggICAgICAgICBIIGZvcm1hdCBmbG9hdGluZworICogICAgIGwgICAgICAgICBsb25nd29yZAorICogICAgIG8gICAgICAgICBvY3Rhd29yZAorICogICAgIHEgICAgICAgICBxdWFkd29yZAorICogICAgIHcgICAgICAgICB3b3JkCisgKiAgICAgPwkgc2ltcGxlIHN5bnRoZXRpYyBicmFuY2ggb3BlcmFuZAorICogICAgIC0JIHVuY29uZGl0aW9uYWwgc3ludGhldGljIEpTQi9KU1Igb3BlcmFuZAorICogICAgICEJIGNvbXBsZXggc3ludGhldGljIGJyYW5jaCBvcGVyYW5kCisgKgorICogVGhlICctPyEnIGxldHRlciAyJ3MgYXJlIG5vdCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uIFRoZXkgYXJlIHVzZWQKKyAqIGZvciB2YXJpb3VzIGFzc2VtYmxlcnMuIEdlbmVyYWxseSwgYWxsIHVua25vd24gd2lkdGhzIGFyZSBhc3N1bWVkIDAuCisgKiBXZSBkb24ndCBsaW1pdCB5b3VyIGNob2ljZSBvZiB3aWR0aCBjaGFyYWN0ZXIuCisgKgorICogREVDIG9wZXJhbmRzIGFyZSBoYXJkIHdvcmsgdG8gcGFyc2UuIEZvciBleGFtcGxlLCAnQCcgYXMgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgbWVhbnMgaW5kaXJlY3QgKGRlZmVycmVkKSBtb2RlIGJ1dCBlbHN3aGVyZSBpdCBpcyBhIHNoaWZ0CisgKiBvcGVyYXRvci4KKyAqIFRoZSBsb25nLXdpbmRlZCBleHBsYW5hdGlvbiBvZiBob3cgdGhpcyBpcyBzdXBwb3NlZCB0byB3b3JrIGlzCisgKiBjYW5jZWxsZWQuIFJlYWQgYSBERUMgdmF4IG1hbnVhbC4KKyAqIFdlIHRyeSBoYXJkIG5vdCB0byBwYXJzZSBhbnl0aGluZyB0aGF0IE1JR0hUIGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24KKyAqIGJ1cmllZCBpbiB0aGF0IHN5bnRheC4gRm9yIGV4YW1wbGUgaWYgd2Ugc2VlIEAuLi4oUm4pIHdlIGRvbid0IGNoZWNrCisgKiBmb3IgJy0nIGJlZm9yZSB0aGUgJygnIGJlY2F1c2UgbW9kZSBALShSbikgZG9lcyBub3QgZXhpc3QuCisgKgorICogQWZ0ZXIgcGFyc2luZyB3ZSBoYXZlOgorICoKKyAqIGF0ICAgICAgICAgICAgICAgICAgICAgMSBpZiBsZWFkaW5nICdAJyAob3IgVW4qeCAnKicpCisgKiBsZW4gICAgICAgICAgICAgICAgICAgIHRha2VzIG9uZSB2YWx1ZSBmcm9tICIgYmlsc3ciLiBlZyBCXiAtPiAnYicuCisgKiBoYXNoICAgICAgICAgICAgICAgICAgIDEgaWYgbGVhZGluZyAnIycgKG9yIFVuKnggJyQnKQorICogZXhwcl9iZWdpbiwgZXhwcl9lbmQgICB0aGUgZXhwcmVzc2lvbiB3ZSBkaWQgbm90IHBhcnNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGludGVycHJldCBpdCwgd2UgbWFrZSB1c2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgb2YgaXRzIHByZXNlbmNlIG9yIGFic2VuY2UuCisgKiBzaWduICAgICAgICAgICAgICAgICAgIC0xOiAtKFJuKSAgICAwOiBhYnNlbnQgICAgKzE6IChSbikrCisgKiBwYXJlbiAgICAgICAgICAgICAgICAgIDEgaWYgKCkgYXJlIGFyb3VuZCByZWdpc3RlcgorICogcmVnICAgICAgICAgICAgICAgICAgICBtYWpvciByZWdpc3RlciBudW1iZXIgMDoxNSAgICAtMSBtZWFucyBhYnNlbnQKKyAqIG5keCAgICAgICAgICAgICAgICAgICAgaW5kZXggcmVnaXN0ZXIgbnVtYmVyIDA6MTUgICAgLTEgbWVhbnMgYWJzZW50CisgKgorICogQWdhaW4sIEkgZGFyZSBub3QgZXhwbGFpbiBpdDoganVzdCB0cmFjZSBBTEwgdGhlIGNvZGUhCisgKi8KKwwKK3N0YXRpYyB2b2lkCit2aXBfb3AgKG9wdGV4dCwgdm9wUCkKKyAgICAgLyogdXNlcidzIGlucHV0IHN0cmluZyBlLmcuOiAiQEJeZm9vQGJhcihBUClbRlBdOiIgKi8KKyAgICAgY2hhciAqb3B0ZXh0OworICAgICAvKiBJbnB1dCBmaWVsZHM6IHZvcF9hY2Nlc3MsIHZvcF93aWR0aC4KKwlPdXRwdXQgZmllbGRzOiBfbmR4LCBfcmVnLCBfbW9kZSwgX3Nob3J0LCBfd2FybiwKKwlfZXJyb3IgX2V4cHJfYmVnaW4sIF9leHByX2VuZCwgX25ieXRlcy4KKwl2b3BfbmJ5dGVzIDogbnVtYmVyIG9mIGJ5dGVzIGluIGEgZGF0dW0uICovCisgICAgIHN0cnVjdCB2b3AgKnZvcFA7Cit7CisgIC8qIHRyYWNrIG9wZXJhbmQgdGV4dCBmb3J3YXJkICovCisgIGNoYXIgKnA7CisgIC8qIHRyYWNrIG9wZXJhbmQgdGV4dCBiYWNrd2FyZCAqLworICBjaGFyICpxOworICAvKiAxIGlmIGxlYWRpbmcgJ0AnICgnKicpIHNlZW4gKi8KKyAgaW50IGF0OworICAvKiBvbmUgb2YgIiBiaWxzdyIgKi8KKyAgY2hhciBsZW47CisgIC8qIDEgaWYgbGVhZGluZyAnIycgKCckJykgc2VlbiAqLworICBpbnQgaGFzaDsKKyAgLyogLTEsIDAgb3IgKzEgKi8KKyAgaW50IHNpZ24gPSAwOworICAvKiAxIGlmICgpIHN1cnJvdW5kIHJlZ2lzdGVyICovCisgIGludCBwYXJlbiA9IDA7CisgIC8qIHJlZ2lzdGVyIG51bWJlciwgLTE6YWJzZW50ICovCisgIGludCByZWcgPSAwOworICAvKiBpbmRleCByZWdpc3RlciBudW1iZXIgLTE6YWJzZW50ICovCisgIGludCBuZHggPSAwOworICAvKiByZXBvcnQgaWxsZWdhbCBvcGVyYW5kLCAiIj09T0sgKi8KKyAgLyogIiAiIGlzIGEgRkFLRSBlcnJvcjogbWVhbnMgd2Ugd29uICovCisgIC8qIEFOWSBlcnIgdGhhdCBiZWdpbnMgd2l0aCAnICcgaXMgYSBmYWtlLiAqLworICAvKiAiICIgaXMgY29udmVydGVkIHRvICIiIGJlZm9yZSByZXR1cm4gKi8KKyAgY29uc3QgY2hhciAqZXJyOworICAvKiB3YXJuIGFib3V0IHdlaXJkIG1vZGVzIHBmIGFkZHJlc3MgKi8KKyAgY29uc3QgY2hhciAqd3JuOworICAvKiBwcmVzZXJ2ZSBxIGluIGNhc2Ugd2UgYmFja3VwICovCisgIGNoYXIgKm9sZHEgPSBOVUxMOworICAvKiBidWlsZCB1cCA0LWJpdCBvcGVyYW5kIG1vZGUgaGVyZSAqLworICAvKiBub3RlOiBpbmRleCBtb2RlIGlzIGluIG5keCwgdGhpcyBpcyAqLworICAvKiB0aGUgbWFqb3IgbW9kZSBvZiBvcGVyYW5kIGFkZHJlc3MgKi8KKyAgaW50IG1vZGUgPSAwOworICAvKgorICAgKiBOb3RpY2UgaG93IHdlIG1vdmUgd3JvbmctYXJnLXR5cGUgYnVncyBJTlNJREUgdGhpcyBtb2R1bGU6IGlmIHdlCisgICAqIGdldCB0aGUgdHlwZXMgd3JvbmcgYmVsb3csIHdlIGxvc2UgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGF0CisgICAqIGxpbnQgb3IgcnVuIHRpbWUuCisgICAqLworICBjaGFyIGFjY2Vzc19tb2RlOwkJLyogdm9wX2FjY2Vzcy4gKi8KKyAgY2hhciB3aWR0aDsJCQkvKiB2b3Bfd2lkdGguICovCisKKyAgYWNjZXNzX21vZGUgPSB2b3BQLT52b3BfYWNjZXNzOworICB3aWR0aCA9IHZvcFAtPnZvcF93aWR0aDsKKyAgLyogTm9uZSBvZiBvdXIgY29kZSBidWdzICh5ZXQpLCBubyB1c2VyIHRleHQgZXJyb3JzLCBubyB3YXJuaW5ncworICAgICBldmVuLiAgKi8KKyAgZXJyID0gd3JuID0gMDsKKworICBwID0gb3B0ZXh0OworCisgIGlmICgqcCA9PSAnICcpCQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCisgICAgcCsrOwkJCS8qIHNraXAgb3ZlciB3aGl0ZXNwYWNlICovCisKKyAgaWYgKChhdCA9IElORElSRUNUUCAoKnApKSAhPSAwKQorICAgIHsJCQkJLyogMSBpZiAqcD09J0AnKG9yICcqJyBmb3IgVW4qeCkgKi8KKyAgICAgIHArKzsJCQkvKiBhdCBpcyBkZXRlcm1pbmVkICovCisgICAgICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLworCXArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLworICAgIH0KKworICAvKgorICAgKiBUaGlzIGNvZGUgaXMgc3VidGxlLiBJdCB0cmllcyB0byBkZXRlY3QgYWxsIGxlZ2FsIChsZXR0ZXIpJ14nCisgICAqIGJ1dCBpdCBkb2Vzbid0IHdhc3RlIHRpbWUgZXhwbGljaXRseSB0ZXN0aW5nIGZvciBwcmVtYXR1cmUgJ1wwJyBiZWNhdXNlCisgICAqIHRoaXMgY2FzZSBpcyByZWplY3RlZCBhcyBhIG1pc21hdGNoIGFnYWluc3QgZWl0aGVyIChsZXR0ZXIpIG9yICdeJy4KKyAgICovCisgIHsKKyAgICBjaGFyIGM7CisKKyAgICBjID0gKnA7CisgICAgaWYgKGlzdXBwZXIgKGMpKQorICAgICAgYyA9IHRvbG93ZXIgKGMpOworICAgIGlmIChESVNQTEVOUCAocFsxXSkgJiYgc3RyY2hyICgiYmlsd3MiLCBsZW4gPSBjKSkKKyAgICAgIHAgKz0gMjsJCQkvKiBza2lwIChsZXR0ZXIpICdeJyAqLworICAgIGVsc2UJCQkvKiBubyAobGV0dGVyKSAnXicgc2VlbiAqLworICAgICAgbGVuID0gJyAnOwkJLyogbGVuIGlzIGRldGVybWluZWQgKi8KKyAgfQorCisgIGlmICgqcCA9PSAnICcpCQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCisgICAgcCsrOwkJCS8qIHNraXAgb3ZlciB3aGl0ZXNwYWNlICovCisKKyAgaWYgKChoYXNoID0gSU1NRURJQVRFUCAoKnApKSAhPSAwKQkvKiAxIGlmICpwPT0nIycgKCckJyBmb3IgVW4qeCkgKi8KKyAgICBwKys7CQkJLyogaGFzaCBpcyBkZXRlcm1pbmVkICovCisKKyAgLyoKKyAgICogcCBwb2ludHMgdG8gd2hhdCBtYXkgYmUgdGhlIGJlZ2lubmluZyBvZiBhbiBleHByZXNzaW9uLgorICAgKiBXZSBoYXZlIHBlZWxlZCBvZmYgdGhlIGZyb250IGFsbCB0aGF0IGlzIHBlZWxhYmxlLgorICAgKiBXZSBrbm93IGF0LCBsZW4sIGhhc2guCisgICAqCisgICAqIExldHMgcG9pbnQgcSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGFuZCBwYXJzZSB0aGF0IChiYWNrd2FyZHMpLgorICAgKi8KKworICBmb3IgKHEgPSBwOyAqcTsgcSsrKQorICAgIDsKKyAgcS0tOwkJCQkvKiBub3cgcSBwb2ludHMgYXQgbGFzdCBjaGFyIG9mIHRleHQgKi8KKwwKKyAgaWYgKCpxID09ICcgJyAmJiBxID49IHApCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KKyAgICBxLS07CisgIC8qIHJldmVyc2Ugb3ZlciB3aGl0ZXNwYWNlLCBidXQgZG9uJ3QgKi8KKyAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLworCisgIC8qCisgICAqIEFzIGEgbWF0dGVyIG9mIHBvbGljeSBoZXJlLCB3ZSBsb29rIGZvciBbUm5dLCBhbHRob3VnaCBib3RoIFJuIGFuZCBTXiMKKyAgICogZm9yYmlkIFtSbl0uIFRoaXMgaXMgYmVjYXVzZSBpdCBpcyBlYXN5LCBhbmQgYmVjYXVzZSBvbmx5IGEgc2ljaworICAgKiBjeWJvcmcgd291bGQgaGF2ZSBbLi4uXSB0cmFpbGluZyBhbiBleHByZXNzaW9uIGluIGEgVkFYLWxpa2UgYXNzZW1ibGVyLgorICAgKiBBIG1ldGljdWxvdXMgcGFyc2VyIHdvdWxkIGZpcnN0IGNoZWNrIGZvciBSbiBmb2xsb3dlZCBieSAnKCcgb3IgJ1snCisgICAqIGFuZCBub3QgcGFyc2UgYSB0cmFpbGluZyAnXScgaWYgaXQgZm91bmQgYW5vdGhlci4gV2UganVzdCBiYW4gZXhwcmVzc2lvbnMKKyAgICogZW5kaW5nIGluICddJy4KKyAgICovCisgIGlmICgqcSA9PSAnXScpCisgICAgeworICAgICAgd2hpbGUgKHEgPj0gcCAmJiAqcSAhPSAnWycpCisJcS0tOworICAgICAgLyogZWl0aGVyIHE8cCBvciB3ZSBnb3QgbWF0Y2hpbmcgJ1snICovCisgICAgICBpZiAocSA8IHApCisJZXJyID0gXygibm8gJ1snIHRvIG1hdGNoICddJyIpOworICAgICAgZWxzZQorCXsKKwkgIC8qCisJICAgKiBDb25mdXNlcnMgbGlrZSAiW10iIHdpbGwgZXZlbnR1YWxseSBsb3NlIHdpdGggYSBiYWQgcmVnaXN0ZXIKKwkgICAqIG5hbWUgZXJyb3IuIFNvIGFnYWluIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGVhcmx5ICdcMCcuCisJICAgKi8KKwkgIGlmIChxWzNdID09ICddJykKKwkgICAgbmR4ID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgMCk7CisJICBlbHNlIGlmIChxWzRdID09ICddJykKKwkgICAgbmR4ID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgcVszXSk7CisJICBlbHNlCisJICAgIG5keCA9IC0xOworCSAgLyoKKwkgICAqIFNpbmNlIHdlIHNhdyBhICddJyB3ZSB3aWxsIGRlbWFuZCBhIHJlZ2lzdGVyIG5hbWUgaW4gdGhlIFtdLgorCSAgICogSWYgbHVzZXIgaGFzbid0IGdpdmVuIHVzIG9uZTogYmUgcnVkZS4KKwkgICAqLworCSAgaWYgKG5keCA8IDApCisJICAgIGVyciA9IF8oImJhZCByZWdpc3RlciBpbiBbXSIpOworCSAgZWxzZSBpZiAobmR4ID09IFBDKQorCSAgICBlcnIgPSBfKCJbUENdIGluZGV4IGJhbm5lZCIpOworCSAgZWxzZQorCSAgICBxLS07CQkvKiBwb2ludCBxIGp1c3QgYmVmb3JlICJbLi4uXSIgKi8KKwl9CisgICAgfQorICBlbHNlCisgICAgbmR4ID0gLTE7CQkJLyogbm8gJ10nLCBzbyBubyBpTkRlWCByZWdpc3RlciAqLworCisgIC8qCisgICAqIElmIGVyciA9ICIuLi4iIHRoZW4gd2UgbG9zdDogcnVuIGF3YXkuCisgICAqIE90aGVyd2lzZSBuZHggPT0gLTEgaWYgdGhlcmUgd2FzIG5vICJbLi4uXSIuCisgICAqIE90aGVyd2lzZSwgbmR4IGlzIGluZGV4IHJlZ2lzdGVyIG51bWJlciwgYW5kIHEgcG9pbnRzIGJlZm9yZSAiWy4uLl0iLgorICAgKi8KKwwKKyAgaWYgKCpxID09ICcgJyAmJiBxID49IHApCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KKyAgICBxLS07CisgIC8qIHJldmVyc2Ugb3ZlciB3aGl0ZXNwYWNlLCBidXQgZG9uJ3QgKi8KKyAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLworICBpZiAoIWVyciB8fCAhKmVycikKKyAgICB7CisgICAgICBzaWduID0gMDsJCQkvKiBubyAoKSsgb3IgLSgpIHNlZW4geWV0ICovCisKKyAgICAgIGlmIChxID4gcCArIDMgJiYgKnEgPT0gJysnICYmIHFbLTFdID09ICcpJykKKwl7CisJICBzaWduID0gMTsJCS8qIHdlIHNhdyBhICIpKyIgKi8KKwkgIHEtLTsJCQkvKiBxIHBvaW50cyB0byAnKScgKi8KKwl9CisKKyAgICAgIGlmICgqcSA9PSAnKScgJiYgcSA+IHAgKyAyKQorCXsKKwkgIHBhcmVuID0gMTsJCS8qIGFzc3VtZSB3ZSBoYXZlICIoLi4uKSIgKi8KKwkgIHdoaWxlIChxID49IHAgJiYgKnEgIT0gJygnKQorCSAgICBxLS07CisJICAvKiBlaXRoZXIgcTxwIG9yIHdlIGdvdCBtYXRjaGluZyAnKCcgKi8KKwkgIGlmIChxIDwgcCkKKwkgICAgZXJyID0gXygibm8gJygnIHRvIG1hdGNoICcpJyIpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyoKKwkgICAgICAgKiBDb25mdXNlcnMgbGlrZSAiKCkiIHdpbGwgZXZlbnR1YWxseSBsb3NlIHdpdGggYSBiYWQgcmVnaXN0ZXIKKwkgICAgICAgKiBuYW1lIGVycm9yLiBTbyBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBlYXJseSAnXDAnLgorCSAgICAgICAqLworCSAgICAgIGlmIChxWzNdID09ICcpJykKKwkJcmVnID0gdmF4X3JlZ19wYXJzZSAocVsxXSwgcVsyXSwgMCk7CisJICAgICAgZWxzZSBpZiAocVs0XSA9PSAnKScpCisJCXJlZyA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIHFbM10pOworCSAgICAgIGVsc2UKKwkJcmVnID0gLTE7CisJICAgICAgLyoKKwkgICAgICAgKiBTaW5jZSB3ZSBzYXcgYSAnKScgd2Ugd2lsbCBkZW1hbmQgYSByZWdpc3RlciBuYW1lIGluIHRoZSAnKScuCisJICAgICAgICogVGhpcyBpcyBuYXN0eTogd2h5IGNhbid0IG91ciBoeXBvdGhldGljYWwgYXNzZW1ibGVyIHBlcm1pdAorCSAgICAgICAqIHBhcmVudGhlc2lzZWQgZXhwcmVzc2lvbnM/IEJFQ0FVU0UgSSBBTSBMQVpZISBUaGF0IGlzIHdoeS4KKwkgICAgICAgKiBBYnVzZSBsdXNlciBpZiB3ZSBkaWRuJ3Qgc3B5IGEgcmVnaXN0ZXIgbmFtZS4KKwkgICAgICAgKi8KKwkgICAgICBpZiAocmVnIDwgMCkKKwkJeworCQkgIC8qIEpGIGFsbG93IHBhcmVudGhhc2l6ZWQgZXhwcmVzc2lvbnMuICBJIGhvcGUgdGhpcyB3b3JrcyAqLworCQkgIHBhcmVuID0gMDsKKwkJICB3aGlsZSAoKnEgIT0gJyknKQorCQkgICAgcSsrOworCQkgIC8qIGVyciA9ICJ1bmtub3duIHJlZ2lzdGVyIGluICgpIjsgKi8KKwkJfQorCSAgICAgIGVsc2UKKwkJcS0tOwkJLyogcG9pbnQganVzdCBiZWZvcmUgJygnIG9mICIoLi4uKSIgKi8KKwkgICAgICAvKgorCSAgICAgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuIFJ1biBhd2F5LgorCSAgICAgICAqIE90aGVyd2lzZSBpZiByZWcgPj0gMCB0aGVuIHdlIHNhdyAoUm4pLgorCSAgICAgICAqLworCSAgICB9CisJICAvKgorCSAgICogSWYgZXJyID09ICIuLi4iIHRoZW4gd2UgbG9zdC4KKwkgICAqIE90aGVyd2lzZSBwYXJlbj09MSBhbmQgcmVnID0gcmVnaXN0ZXIgaW4gIigpIi4KKwkgICAqLworCX0KKyAgICAgIGVsc2UKKwlwYXJlbiA9IDA7CisgICAgICAvKgorICAgICAgICogSWYgZXJyID09ICIuLi4iIHRoZW4gd2UgbG9zdC4KKyAgICAgICAqIE90aGVyd2lzZSwgcSBwb2ludHMganVzdCBiZWZvcmUgIihSbikiLCBpZiBhbnkuCisgICAgICAgKiBJZiB0aGVyZSB3YXMgYSAiKC4uLikiIHRoZW4gcGFyZW49PTEsIGFuZCByZWcgaXMgdGhlIHJlZ2lzdGVyLgorICAgICAgICovCisMCisgICAgICAvKgorICAgICAgICogV2Ugc2hvdWxkIG9ubHkgc2VlayAnLScgb2YgIi0oLi4uKSIgaWY6CisgICAgICAgKiAgIHdlIHNhdyAiKC4uLikiICAgICAgICAgICAgICAgICAgICBwYXJlbiA9PSAxCisgICAgICAgKiAgIHdlIGhhdmUgbm8gZXJyb3JzIHNvIGZhciAgICAgICAgICAhICplcnIKKyAgICAgICAqICAgd2UgZGlkIG5vdCBzZWUgJysnIG9mICIoLi4uKSsiICAgIHNpZ24gPCAxCisgICAgICAgKiBXZSBkb24ndCBjaGVjayBsZW4uIFdlIHdhbnQgYSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIGxhdGVyIGlmCisgICAgICAgKiB1c2VyIHRyaWVzICJ4Xi4uLi0oUm4pIi4gVGhpcyBpcyBhIGZlYXR1cmUgbm90IGEgYnVnLgorICAgICAgICovCisgICAgICBpZiAoIWVyciB8fCAhKmVycikKKwl7CisJICBpZiAocGFyZW4gJiYgc2lnbiA8IDEpLyogIXNpZ24gaXMgYWRlcXVhdGUgdGVzdCAqLworCSAgICB7CisJICAgICAgaWYgKCpxID09ICctJykKKwkJeworCQkgIHNpZ24gPSAtMTsKKwkJICBxLS07CisJCX0KKwkgICAgfQorCSAgLyoKKwkgICAqIFdlIGhhdmUgYmFjay10cmFja2VkIG92ZXIgbW9zdAorCSAgICogb2YgdGhlIGNydWQgYXQgdGhlIGVuZCBvZiBhbiBvcGVyYW5kLgorCSAgICogVW5sZXNzIGVyciwgd2Uga25vdzogc2lnbiwgcGFyZW4uIElmIHBhcmVuLCB3ZSBrbm93IHJlZy4KKwkgICAqIFRoZSBsYXN0IGNhc2UgaXMgb2YgYW4gZXhwcmVzc2lvbiAiUm4iLgorCSAgICogVGhpcyBpcyB3b3J0aCBodW50aW5nIGZvciBpZiAhZXJyLCAhcGFyZW4uCisJICAgKiBXZSB3b3VsZG4ndCBiZSBoZXJlIGlmIGVyci4KKwkgICAqIFdlIHJlbWVtYmVyIHRvIHNhdmUgcSwgaW4gY2FzZSB3ZSBkaWRuJ3Qgd2FudCAiUm4iIGFueXdheS4KKwkgICAqLworCSAgaWYgKCFwYXJlbikKKwkgICAgeworCSAgICAgIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCisJCXEtLTsKKwkgICAgICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCisJICAgICAgLyogcnVuIGJhY2sgb3ZlciAqcCAqLworCSAgICAgIGlmIChxID4gcCAmJiBxIDwgcCArIDMpCS8qIHJvb20gZm9yIFJuIG9yIFJubiBleGFjdGx5PyAqLworCQlyZWcgPSB2YXhfcmVnX3BhcnNlIChwWzBdLCBwWzFdLCBxIDwgcCArIDIgPyAwIDogcFsyXSk7CisJICAgICAgZWxzZQorCQlyZWcgPSAtMTsJLyogYWx3YXlzIGNvbWVzIGhlcmUgaWYgbm8gcmVnaXN0ZXIgYXQgYWxsICovCisJICAgICAgLyoKKwkgICAgICAgKiBIZXJlIHdpdGggYSBkZWZpbml0aXZlIHJlZyB2YWx1ZS4KKwkgICAgICAgKi8KKwkgICAgICBpZiAocmVnID49IDApCisJCXsKKwkJICBvbGRxID0gcTsKKwkJICBxID0gcCAtIDE7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIC8qCisgICAqIGhhdmUgcmVnLiAtMTphYnNlbnQ7IGVsc2UgMDoxNQorICAgKi8KKworICAvKgorICAgKiBXZSBoYXZlOiAgZXJyLCBhdCwgbGVuLCBoYXNoLCBuZHgsIHNpZ24sIHBhcmVuLCByZWcuCisgICAqIEFsc28sIGFueSByZW1haW5pbmcgZXhwcmVzc2lvbiBpcyBmcm9tICpwIHRocm91Z2ggKnEgaW5jbHVzaXZlLgorICAgKiBTaG91bGQgdGhlcmUgYmUgbm8gZXhwcmVzc2lvbiwgcT09cC0xLiBTbyBleHByZXNzaW9uIGxlbmd0aCA9IHEtcCsxLgorICAgKiBUaGlzIGNvbXBsZXRlcyB0aGUgZmlyc3QgcGFydDogcGFyc2luZyB0aGUgb3BlcmFuZCB0ZXh0LgorICAgKi8KKwwKKyAgLyoKKyAgICogV2Ugbm93IHdhbnQgdG8gYm9pbCB0aGUgZGF0YSBkb3duLCBjaGVja2luZyBjb25zaXN0ZW5jeSBvbiB0aGUgd2F5LgorICAgKiBXZSB3YW50OiAgbGVuLCBtb2RlLCByZWcsIG5keCwgZXJyLCBwLCBxLCB3cm4sIGJ1Zy4KKyAgICogV2Ugd2lsbCBkZWxpdmVyIGEgNC1iaXQgcmVnLCBhbmQgYSA0LWJpdCBtb2RlLgorICAgKi8KKworICAvKgorICAgKiBDYXNlIG9mIGJyYW5jaCBvcGVyYW5kLiBEaWZmZXJlbnQuIE5vIExeQl5XXkleU14gYWxsb3dlZCBmb3IgaW5zdGFuY2UuCisgICAqCisgICAqIGluOiAgYXQJPworICAgKiAgICAgIGxlbgk/CisgICAqICAgICAgaGFzaAk/CisgICAqICAgICAgcDpxCT8KKyAgICogICAgICBzaWduICA/CisgICAqICAgICAgcGFyZW4JPworICAgKiAgICAgIHJlZyAgID8KKyAgICogICAgICBuZHggICA/CisgICAqCisgICAqIG91dDogbW9kZSAgMAorICAgKiAgICAgIHJlZyAgIC0xCisgICAqICAgICAgbGVuCScgJworICAgKiAgICAgIHA6cQl3aGF0ZXZlciB3YXMgaW5wdXQKKyAgICogICAgICBuZHgJLTEKKyAgICogICAgICBlcnIJIiAiCQkgb3IgZXJyb3IgbWVzc2FnZSwgYW5kIG90aGVyIG91dHB1dHMgdHJhc2hlZAorICAgKi8KKyAgLyogYnJhbmNoIG9wZXJhbmRzIGhhdmUgcmVzdHJpY3RlZCBmb3JtcyAqLworICBpZiAoKCFlcnIgfHwgISplcnIpICYmIGFjY2Vzc19tb2RlID09ICdiJykKKyAgICB7CisgICAgICBpZiAoYXQgfHwgaGFzaCB8fCBzaWduIHx8IHBhcmVuIHx8IG5keCA+PSAwIHx8IHJlZyA+PSAwIHx8IGxlbiAhPSAnICcpCisJZXJyID0gXygiaW52YWxpZCBicmFuY2ggb3BlcmFuZCIpOworICAgICAgZWxzZQorCWVyciA9ICIgIjsKKyAgICB9CisMCisgIC8qIFNpbmNlIG5vYm9keSBzZWVtcyB0byB1c2UgaXQ6IGNvbW1lbnQgdGhpcyAnZmVhdHVyZScoPykgb3V0IGZvciBub3cuICovCisjaWZkZWYgTkVWRVIKKyAgLyoKKyAgICogQ2FzZSBvZiBzdGFuZC1hbG9uZSBvcGVyYW5kLiBlLmcuICIubG9uZyBmb28iCisgICAqCisgICAqIGluOiAgYXQJPworICAgKiAgICAgIGxlbgk/CisgICAqICAgICAgaGFzaAk/CisgICAqICAgICAgcDpxCT8KKyAgICogICAgICBzaWduICA/CisgICAqICAgICAgcGFyZW4JPworICAgKiAgICAgIHJlZyAgID8KKyAgICogICAgICBuZHggICA/CisgICAqCisgICAqIG91dDogbW9kZSAgMAorICAgKiAgICAgIHJlZyAgIC0xCisgICAqICAgICAgbGVuCScgJworICAgKiAgICAgIHA6cQl3aGF0ZXZlciB3YXMgaW5wdXQKKyAgICogICAgICBuZHgJLTEKKyAgICogICAgICBlcnIJIiAiCQkgb3IgZXJyb3IgbWVzc2FnZSwgYW5kIG90aGVyIG91dHB1dHMgdHJhc2hlZAorICAgKi8KKyAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBhY2Nlc3NfbW9kZSA9PSAnICcpCisgICAgeworICAgICAgaWYgKGF0KQorCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIEAiKTsKKyAgICAgIGVsc2UgaWYgKGhhc2gpCisJZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgIyIpOworICAgICAgZWxzZSBpZiAoc2lnbikKKwl7CisJICBpZiAoc2lnbiA8IDApCisJICAgIGVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIC0oKSIpOworCSAgZWxzZQorCSAgICBlcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAoKSsiKTsKKwl9CisgICAgICBlbHNlIGlmIChwYXJlbikKKwllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAoKSIpOworICAgICAgZWxzZSBpZiAobmR4ID49IDApCisJZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgW10iKTsKKyAgICAgIGVsc2UgaWYgKHJlZyA+PSAwKQorCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIHJlZ2lzdGVyIik7CisgICAgICBlbHNlIGlmIChsZW4gIT0gJyAnKQorCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIGRpc3BsYWNlbWVudCBsZW5ndGggc3BlY2lmaWVyIik7CisgICAgICBlbHNlCisJeworCSAgZXJyID0gIiAiOwkvKiBzdWNjZWVkICovCisJICBtb2RlID0gMDsKKwl9CisgICAgfQorI2VuZGlmIC8qI0lmZGVmIE5FVkVSKi8KKwwKKyAgLyoKKyAgICogQ2FzZSBvZiBTXiMuCisgICAqCisgICAqIGluOiAgYXQgICAgICAgMAorICAgKiAgICAgIGxlbiAgICAgICdzJyAgICAgICAgICAgICAgIGRlZmluaXRpb24KKyAgICogICAgICBoYXNoICAgICAxICAgICAgICAgICAgICBkZW1hbmQKKyAgICogICAgICBwOnEgICAgICAgICAgICAgICAgICAgICAgICBkZW1hbmQgbm90IGVtcHR5CisgICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcGFyZW49PTAKKyAgICogICAgICBwYXJlbiAgICAwICAgICAgICAgICAgIGJ5ICIoKSIgc2NhbiBsb2dpYyBiZWNhdXNlICJTXiIgc2VlbgorICAgKiAgICAgIHJlZyAgICAgIC0xICAgICAgICAgICAgICAgIG9yIG5uIGJ5IG1pc3Rha2UKKyAgICogICAgICBuZHggICAgICAtMQorICAgKgorICAgKiBvdXQ6IG1vZGUgICAgIDAKKyAgICogICAgICByZWcgICAgICAtMQorICAgKiAgICAgIGxlbiAgICAgICdzJworICAgKiAgICAgIGV4cAorICAgKiAgICAgIG5keCAgICAgIC0xCisgICAqLworICBpZiAoKCFlcnIgfHwgISplcnIpICYmIGxlbiA9PSAncycpCisgICAgeworICAgICAgaWYgKCFoYXNoIHx8IHBhcmVuIHx8IGF0IHx8IG5keCA+PSAwKQorCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiBTXiMiKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAocmVnID49IDApCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIFNISVQhIHdlIHNhdyBTXiNSbm4gISBwdXQgdGhlIFJubiBiYWNrIGluCisJICAgICAgICogZXhwcmVzc2lvbi4gS0xVREdFISBVc2Ugb2xkcSBzbyB3ZSBkb24ndAorCSAgICAgICAqIG5lZWQgdG8ga25vdyBleGFjdCBsZW5ndGggb2YgcmVnIG5hbWUuCisJICAgICAgICovCisJICAgICAgcSA9IG9sZHE7CisJICAgICAgcmVnID0gMDsKKwkgICAgfQorCSAgLyoKKwkgICAqIFdlIGhhdmUgYWxsIHRoZSBleHByZXNzaW9uIHdlIHdpbGwgZXZlciBnZXQuCisJICAgKi8KKwkgIGlmIChwID4gcSkKKwkgICAgZXJyID0gXygiU14jIG5lZWRzIGV4cHJlc3Npb24iKTsKKwkgIGVsc2UgaWYgKGFjY2Vzc19tb2RlID09ICdyJykKKwkgICAgeworCSAgICAgIGVyciA9ICIgIjsJLyogV0lOISAqLworCSAgICAgIG1vZGUgPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIGVyciA9IF8oIlNeIyBtYXkgb25seSByZWFkLWFjY2VzcyIpOworCX0KKyAgICB9CisMCisgIC8qCisgICAqIENhc2Ugb2YgLShSbiksIHdoaWNoIGlzIHdlaXJkIGNhc2UuCisgICAqCisgICAqIGluOiAgYXQgICAgICAgMAorICAgKiAgICAgIGxlbiAgICAgICcKKyAgICogICAgICBoYXNoICAgICAwCisgICAqICAgICAgcDpxICAgICAgcTxwCisgICAqICAgICAgc2lnbiAgICAgLTEgICAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgorICAgKiAgICAgIHBhcmVuICAgIDEgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KKyAgICogICAgICByZWcgICAgICBwcmVzZW50ICAgICAgICAgICBieSBkZWZpbml0aW9uCisgICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKKyAgICoKKyAgICogb3V0OiBtb2RlICAgICA3CisgICAqICAgICAgcmVnICAgICAgcHJlc2VudAorICAgKiAgICAgIGxlbiAgICAgICcgJworICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgorICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKKyAgICovCisgIGlmICgoIWVyciB8fCAhKmVycikgJiYgc2lnbiA8IDApCisgICAgeworICAgICAgaWYgKGxlbiAhPSAnICcgfHwgaGFzaCB8fCBhdCB8fCBwIDw9IHEpCisJZXJyID0gXygiaW52YWxpZCBvcGVyYW5kIG9mIC0oKSIpOworICAgICAgZWxzZQorCXsKKwkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLworCSAgbW9kZSA9IDc7CisJICBpZiAocmVnID09IFBDKQorCSAgICB3cm4gPSBfKCItKFBDKSB1bnByZWRpY3RhYmxlIik7CisJICBlbHNlIGlmIChyZWcgPT0gbmR4KQorCSAgICB3cm4gPSBfKCJbXWluZGV4IHNhbWUgYXMgLSgpcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiKTsKKwl9CisgICAgfQorDAorICAvKgorICAgKiBXZSBjb252ZXJ0ICIoUm4pIiB0byAiQFJuIiBmb3Igb3VyIGNvbnZlbmllbmNlLgorICAgKiAoSSBob3BlIHRoaXMgaXMgY29udmVuaWVudDogaGFzIHNvbWVvbmUgZ290IGEgYmV0dGVyIHdheSB0byBwYXJzZSB0aGlzPykKKyAgICogQSBzaWRlLWVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgIkBSbiIgaXMgYSB2YWxpZCBvcGVyYW5kLgorICAgKi8KKyAgaWYgKHBhcmVuICYmICFzaWduICYmICFoYXNoICYmICFhdCAmJiBsZW4gPT0gJyAnICYmIHAgPiBxKQorICAgIHsKKyAgICAgIGF0ID0gMTsKKyAgICAgIHBhcmVuID0gMDsKKyAgICB9CisKKyAgLyoKKyAgICogQ2FzZSBvZiAoUm4pKywgd2hpY2ggaXMgc2xpZ2h0bHkgZGlmZmVyZW50LgorICAgKgorICAgKiBpbjogIGF0CisgICAqICAgICAgbGVuICAgICAgJyAnCisgICAqICAgICAgaGFzaCAgICAgMAorICAgKiAgICAgIHA6cSAgICAgIHE8cAorICAgKiAgICAgIHNpZ24gICAgICsxICAgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KKyAgICogICAgICBwYXJlbiAgICAxICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCisgICAqICAgICAgcmVnICAgICAgcHJlc2VudCAgICAgICAgICAgYnkgZGVmaW5pdGlvbgorICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCisgICAqCisgICAqIG91dDogbW9kZSAgICAgOCtACisgICAqICAgICAgcmVnICAgICAgcHJlc2VudAorICAgKiAgICAgIGxlbiAgICAgICcgJworICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgorICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKKyAgICovCisgIGlmICgoIWVyciB8fCAhKmVycikgJiYgc2lnbiA+IDApCisgICAgeworICAgICAgaWYgKGxlbiAhPSAnICcgfHwgaGFzaCB8fCBwIDw9IHEpCisJZXJyID0gXygiaW52YWxpZCBvcGVyYW5kIG9mICgpKyIpOworICAgICAgZWxzZQorCXsKKwkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLworCSAgbW9kZSA9IDggKyAoYXQgPyAxIDogMCk7CisJICBpZiAocmVnID09IFBDKQorCSAgICB3cm4gPSBfKCIoUEMpKyB1bnByZWRpY3RhYmxlIik7CisJICBlbHNlIGlmIChyZWcgPT0gbmR4KQorCSAgICB3cm4gPSBfKCJbXWluZGV4IHNhbWUgYXMgKCkrcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiKTsKKwl9CisgICAgfQorDAorICAvKgorICAgKiBDYXNlIG9mICMsIHdpdGhvdXQgU14uCisgICAqCisgICAqIGluOiAgYXQKKyAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2knCisgICAqICAgICAgaGFzaCAgICAgMSAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgorICAgKiAgICAgIHA6cQorICAgKiAgICAgIHNpZ24gICAgIDAKKyAgICogICAgICBwYXJlbiAgICAwCisgICAqICAgICAgcmVnICAgICAgYWJzZW50CisgICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKKyAgICoKKyAgICogb3V0OiBtb2RlICAgICA4K0AKKyAgICogICAgICByZWcgICAgICBQQworICAgKiAgICAgIGxlbiAgICAgICcgJyBvciAnaScKKyAgICogICAgICBleHAKKyAgICogICAgICBuZHggICAgICBvcHRpb25hbAorICAgKi8KKyAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBoYXNoKQorICAgIHsKKyAgICAgIGlmIChsZW4gIT0gJ2knICYmIGxlbiAhPSAnICcpCisJZXJyID0gXygiIyBjb25mbGljdHMgbGVuZ3RoIik7CisgICAgICBlbHNlIGlmIChwYXJlbikKKwllcnIgPSBfKCIjIGJhcnMgcmVnaXN0ZXIiKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAocmVnID49IDApCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIFNISVQhIHdlIHNhdyAjUm5uISBQdXQgdGhlIFJubiBiYWNrIGludG8gdGhlIGV4cHJlc3Npb24uCisJICAgICAgICogQnkgdXNpbmcgb2xkcSwgd2UgZG9uJ3QgbmVlZCB0byBrbm93IGhvdyBsb25nIFJubiB3YXMuCisJICAgICAgICogS0xVREdFIQorCSAgICAgICAqLworCSAgICAgIHEgPSBvbGRxOworCSAgICAgIHJlZyA9IC0xOwkJLyogbm8gcmVnaXN0ZXIgYW55IG1vcmUgKi8KKwkgICAgfQorCSAgZXJyID0gIiAiOwkJLyogd2luICovCisKKwkgIC8qIEpGIGEgYnVnZml4LCBJIHRoaW5rISAqLworCSAgaWYgKGF0ICYmIGFjY2Vzc19tb2RlID09ICdhJykKKwkgICAgdm9wUC0+dm9wX25ieXRlcyA9IDQ7CisKKwkgIG1vZGUgPSAoYXQgPyA5IDogOCk7CisJICByZWcgPSBQQzsKKwkgIGlmICgoYWNjZXNzX21vZGUgPT0gJ20nIHx8IGFjY2Vzc19tb2RlID09ICd3JykgJiYgIWF0KQorCSAgICB3cm4gPSBfKCJ3cml0aW5nIG9yIG1vZGlmeWluZyAjIGlzIHVucHJlZGljdGFibGUiKTsKKwl9CisgICAgfQorICAvKgorICAgKiBJZiAhKmVyciwgdGhlbiAgICAgICAgc2lnbiA9PSAwCisgICAqICAgICAgICAgICAgICAgICAgICAgICBoYXNoID09IDAKKyAgICovCisMCisgIC8qCisgICAqIENhc2Ugb2YgUm4uIFdlIHNlcGVyYXRlIHRoaXMgb25lIGJlY2F1c2UgaXQgaGFzIGEgZmV3IHNwZWNpYWwKKyAgICogZXJyb3JzIHRoZSByZW1haW5pbmcgbW9kZXMgbGFjay4KKyAgICoKKyAgICogaW46ICBhdCAgICAgICBvcHRpb25hbAorICAgKiAgICAgIGxlbiAgICAgICcgJworICAgKiAgICAgIGhhc2ggICAgIDAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYworICAgKiAgICAgIHA6cSAgICAgIGVtcHR5CisgICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYworICAgKiAgICAgIHBhcmVuICAgIDAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgorICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQgICAgICAgICAgIGJ5IGRlZmluaXRpb24KKyAgICogICAgICBuZHggICAgICBvcHRpb25hbAorICAgKgorICAgKiBvdXQ6IG1vZGUgICAgIDUrQAorICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKKyAgICogICAgICBsZW4gICAgICAnICcgICAgICAgICAgICAgICBlbmZvcmNlIG5vIGxlbmd0aAorICAgKiAgICAgIGV4cCAgICAgICIiICAgICAgICAgICAgICAgIGVuZm9yY2UgZW1wdHkgZXhwcmVzc2lvbgorICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKKyAgICovCisgIGlmICgoIWVyciB8fCAhKmVycikgJiYgIXBhcmVuICYmIHJlZyA+PSAwKQorICAgIHsKKyAgICAgIGlmIChsZW4gIT0gJyAnKQorCWVyciA9IF8oImxlbmd0aCBub3QgbmVlZGVkIik7CisgICAgICBlbHNlIGlmIChhdCkKKwl7CisJICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KKwkgIG1vZGUgPSA2OwkJLyogQFJuICovCisJfQorICAgICAgZWxzZSBpZiAobmR4ID49IDApCisJZXJyID0gXygiY2FuJ3QgW11pbmRleCBhIHJlZ2lzdGVyLCBiZWNhdXNlIGl0IGhhcyBubyBhZGRyZXNzIik7CisgICAgICBlbHNlIGlmIChhY2Nlc3NfbW9kZSA9PSAnYScpCisJZXJyID0gXygiYSByZWdpc3RlciBoYXMgbm8gYWRkcmVzcyIpOworICAgICAgZWxzZQorCXsKKwkgIC8qCisJICAgKiBJZGVhIGhlcmUgaXMgdG8gZGV0ZWN0IGZyb20gbGVuZ3RoIG9mIGRhdHVtCisJICAgKiBhbmQgZnJvbSByZWdpc3RlciBudW1iZXIgaWYgd2Ugd2lsbCB0b3VjaCBQQy4KKwkgICAqIFdhcm4gaWYgd2UgZG8uCisJICAgKiB2b3BfbmJ5dGVzIGlzIG51bWJlciBvZiBieXRlcyBpbiBvcGVyYW5kLgorCSAgICogQ29tcHV0ZSBoaWdoZXN0IGJ5dGUgYWZmZWN0ZWQsIGNvbXBhcmUgdG8gUEMwLgorCSAgICovCisJICBpZiAoKHZvcFAtPnZvcF9uYnl0ZXMgKyByZWcgKiA0KSA+IDYwKQorCSAgICB3cm4gPSBfKCJQQyBwYXJ0IG9mIG9wZXJhbmQgdW5wcmVkaWN0YWJsZSIpOworCSAgZXJyID0gIiAiOwkJLyogd2luICovCisJICBtb2RlID0gNTsJCS8qIFJuICovCisJfQorICAgIH0KKyAgLyoKKyAgICogSWYgISplcnIsICAgICAgICBzaWduICA9PSAwCisgICAqICAgICAgICAgICAgICAgICAgaGFzaCAgPT0gMAorICAgKiAgICAgICAgICAgICAgICAgIHBhcmVuID09IDEgIE9SIHJlZz09LTEKKyAgICovCisMCisgIC8qCisgICAqIFJlc3Qgb2YgY2FzZXMgZml0IGludG8gb25lIGJ1bmNoLgorICAgKgorICAgKiBpbjogIGF0ICAgICAgIG9wdGlvbmFsCisgICAqICAgICAgbGVuICAgICAgJyAnIG9yICdiJyBvciAndycgb3IgJ2wnCisgICAqICAgICAgaGFzaCAgICAgMCAgICAgICAgICAgICBieSBwcm9ncmFtIGxvZ2ljCisgICAqICAgICAgcDpxICAgICAgZXhwZWN0ZWQgICAgICAgICAgKGVtcHR5IGlzIG5vdCBhbiBlcnJvcikKKyAgICogICAgICBzaWduICAgICAwICAgICAgICAgICAgICAgICBieSBwcm9ncmFtIGxvZ2ljCisgICAqICAgICAgcGFyZW4gICAgb3B0aW9uYWwKKyAgICogICAgICByZWcgICAgICBvcHRpb25hbAorICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCisgICAqCisgICAqIG91dDogbW9kZSAgICAgMTAgKyBAICsgbGVuCisgICAqICAgICAgcmVnICAgICAgb3B0aW9uYWwKKyAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2InIG9yICd3JyBvciAnbCcKKyAgICogICAgICBleHAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSBlbXB0eQorICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsICAgICAgICAgIHdhcm4gaWYgc2FtZSBhcyByZWcKKyAgICovCisgIGlmICghZXJyIHx8ICEqZXJyKQorICAgIHsKKyAgICAgIGVyciA9ICIgIjsJCS8qIHdpbiAoYWx3YXlzKSAqLworICAgICAgbW9kZSA9IDEwICsgKGF0ID8gMSA6IDApOworICAgICAgc3dpdGNoIChsZW4pCisJeworCWNhc2UgJ2wnOgorCSAgbW9kZSArPSAyOworCWNhc2UgJ3cnOgorCSAgbW9kZSArPSAyOworCWNhc2UgJyAnOgkJLyogYXNzdW1lZCBCXiB1bnRpbCBvdXIgY2FsbGVyIGNoYW5nZXMgaXQgKi8KKwljYXNlICdiJzoKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyoKKyAgICogaGVyZSB3aXRoIGNvbXBsZXRlbHkgc3BlY2lmaWVkICAgICBtb2RlCisgICAqCQkJCQlsZW4KKyAgICoJCQkJCXJlZworICAgKgkJCQkJZXhwcmVzc2lvbiAgIHAscQorICAgKgkJCQkJbmR4CisgICAqLworCisgIGlmICgqZXJyID09ICcgJykKKyAgICBlcnIgPSAwOwkJCS8qICIgIiBpcyBubyBsb25nZXIgYW4gZXJyb3IgKi8KKworICB2b3BQLT52b3BfbW9kZSA9IG1vZGU7CisgIHZvcFAtPnZvcF9yZWcgPSByZWc7CisgIHZvcFAtPnZvcF9zaG9ydCA9IGxlbjsKKyAgdm9wUC0+dm9wX2V4cHJfYmVnaW4gPSBwOworICB2b3BQLT52b3BfZXhwcl9lbmQgPSBxOworICB2b3BQLT52b3BfbmR4ID0gbmR4OworICB2b3BQLT52b3BfZXJyb3IgPSBlcnI7CisgIHZvcFAtPnZvcF93YXJuID0gd3JuOworfQorDAorLyoKKworICBTdW1tYXJ5IG9mIHZpcF9vcCBvdXRwdXRzLgorCisgIG1vZGUJcmVnCWxlbgluZHgKKyAgKFJuKSA9PiBAUm4KKyAge0B9Um4JCQk1K0AJbgknICcJb3B0aW9uYWwKKyAgYnJhbmNoIG9wZXJhbmQJCTAJLTEJJyAnCS0xCisgIFNeI2ZvbwkJCTAJLTEJJ3MnCS0xCisgIC0oUm4pCQkJNwluCScgJwlvcHRpb25hbAorICB7QH0oUm4pKwkJOCtACW4JJyAnCW9wdGlvbmFsCisgIHtAfSNmb28sIG5vIFNeCQk4K0AJUEMJIiBpIglvcHRpb25hbAorICB7QH17cV59eyhSbil9CQkxMCtAK3EJb3B0aW9uCSIgYndsIglvcHRpb25hbAorCisgICovCisMCisjaWZkZWYgVEVTVAkJCS8qICNEZWZpbmUgdG8gdXNlIHRoaXMgdGVzdGJlZC4gKi8KKworLyoKKyAqIEZvbGxvd3MgYSB0ZXN0IHByb2dyYW0gZm9yIHRoaXMgZnVuY3Rpb24uCisgKiBXZSBkZWNsYXJlIGFycmF5cyBub24tbG9jYWwgaW4gY2FzZSBzb21lIG9mIG91ciB0aW55LW1pbmRlZCBtYWNoaW5lcworICogZGVmYXVsdCB0byBzbWFsbCBzdGFja3MuIEFsc28sIGhlbHBzIHdpdGggc29tZSBkZWJ1Z2dlcnMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2NoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiB0eXBlcyBpbnRvIGhlcmUgKi8KK2NoYXIgKnA7CQkJLyogICovCitjaGFyICpteWVycjsKK2NoYXIgKm15d3JuOworY2hhciAqbXlidWc7CitjaGFyIG15YWNjZXNzOworY2hhciBteXdpZHRoOworY2hhciBteW1vZGU7CitjaGFyIG15cmVnOworY2hhciBteWxlbjsKK2NoYXIgKm15bGVmdDsKK2NoYXIgKm15cmlnaHQ7CitjaGFyIG15bmR4OworaW50IG15X29wZXJhbmRfbGVuZ3RoOworY2hhciBteV9pbW1lZGlhdGVbMjAwXTsKK2NoYXIgbXlfaW5kaXJlY3RbMjAwXTsKK2NoYXIgbXlfZGlzcGxlblsyMDBdOworCittYWluICgpCit7CisgIHByaW50ZiAoImVudGVyIGltbWVkaWF0ZSBzeW1ib2xzIGVnIGVudGVyICMgICAiKTsKKyAgZ2V0cyAobXlfaW1tZWRpYXRlKTsKKyAgcHJpbnRmICgiZW50ZXIgaW5kaXJlY3Qgc3ltYm9scyAgZWcgZW50ZXIgQCAgICIpOworICBnZXRzIChteV9pbmRpcmVjdCk7CisgIHByaW50ZiAoImVudGVyIGRpc3BsZW4gc3ltYm9scyAgIGVnIGVudGVyIF4gICAiKTsKKyAgZ2V0cyAobXlfZGlzcGxlbik7CisgIHZpcF9vcF9kZWZhdWx0cyAobXlfaW1tZWRpYXRlLCBteV9pbmRpcmVjdCwgbXlfZGlzcGxlbik7CisgIGZvciAoOzspCisgICAgeworICAgICAgcHJpbnRmICgiYWNjZXNzLHdpZHRoIChlZyAnYWInIG9yICd3aCcpIFtlbXB0eSBsaW5lIHRvIHF1aXRdIDogICIpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgZ2V0cyAoYW5zd2VyKTsKKyAgICAgIGlmICghYW5zd2VyWzBdKQorCWV4aXQgKEVYSVRfU1VDQ0VTUyk7CisgICAgICBteWFjY2VzcyA9IGFuc3dlclswXTsKKyAgICAgIG15d2lkdGggPSBhbnN3ZXJbMV07CisgICAgICBzd2l0Y2ggKG15d2lkdGgpCisJeworCWNhc2UgJ2InOgorCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBteV9vcGVyYW5kX2xlbmd0aCA9IDg7CisJICBicmVhazsKKwljYXNlICdmJzoKKwkgIG15X29wZXJhbmRfbGVuZ3RoID0gNDsKKwkgIGJyZWFrOworCWNhc2UgJ2cnOgorCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxNjsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAzMjsKKwkgIGJyZWFrOworCWNhc2UgJ2wnOgorCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA0OworCSAgYnJlYWs7CisJY2FzZSAnbyc6CisJICBteV9vcGVyYW5kX2xlbmd0aCA9IDE2OworCSAgYnJlYWs7CisJY2FzZSAncSc6CisJICBteV9vcGVyYW5kX2xlbmd0aCA9IDg7CisJICBicmVhazsKKwljYXNlICd3JzoKKwkgIG15X29wZXJhbmRfbGVuZ3RoID0gMjsKKwkgIGJyZWFrOworCWNhc2UgJyEnOgorCWNhc2UgJz8nOgorCWNhc2UgJy0nOgorCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAwOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAyOworCSAgcHJpbnRmICgiSSBkbid0IHVuZGVyc3RhbmQgYWNjZXNzIHdpZHRoICVjXG4iLCBteXdpZHRoKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHByaW50ZiAoIlZBWCBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gb3BlcmFuZDogIik7CisgICAgICBmZmx1c2ggKHN0ZG91dCk7CisgICAgICBnZXRzIChhbnN3ZXIpOworICAgICAgbXlidWcgPSB2aXBfb3AgKGFuc3dlciwgbXlhY2Nlc3MsIG15d2lkdGgsIG15X29wZXJhbmRfbGVuZ3RoLAorCQkgICAgICAmbXltb2RlLCAmbXlyZWcsICZteWxlbiwgJm15bGVmdCwgJm15cmlnaHQsICZteW5keCwKKwkJICAgICAgJm15ZXJyLCAmbXl3cm4pOworICAgICAgaWYgKCpteWVycikKKwl7CisJICBwcmludGYgKCJlcnJvcjogXCIlc1wiXG4iLCBteWVycik7CisJICBpZiAoKm15YnVnKQorCSAgICBwcmludGYgKCIgYnVnOiBcIiVzXCJcbiIsIG15YnVnKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCpteXdybikKKwkgICAgcHJpbnRmICgid2FybmluZzogXCIlc1wiXG4iLCBteXdybik7CisJICBtdW1ibGUgKCJtb2RlIiwgbXltb2RlKTsKKwkgIG11bWJsZSAoInJlZ2lzdGVyIiwgbXlyZWcpOworCSAgbXVtYmxlICgiaW5kZXgiLCBteW5keCk7CisJICBwcmludGYgKCJ3aWR0aDonJWMnICAiLCBteWxlbik7CisJICBwcmludGYgKCJleHByZXNzaW9uOiBcIiIpOworCSAgd2hpbGUgKG15bGVmdCA8PSBteXJpZ2h0KQorCSAgICBwdXRjaGFyICgqbXlsZWZ0KyspOworCSAgcHJpbnRmICgiXCJcbiIpOworCX0KKyAgICB9Cit9CisKK211bWJsZSAodGV4dCwgdmFsdWUpCisgICAgIGNoYXIgKnRleHQ7CisgICAgIGludCB2YWx1ZTsKK3sKKyAgcHJpbnRmICgiJXM6IiwgdGV4dCk7CisgIGlmICh2YWx1ZSA+PSAwKQorICAgIHByaW50ZiAoIiV4eCIsIHZhbHVlKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIkFCU0VOVCIpOworICBwcmludGYgKCIgICIpOworfQorCisjZW5kaWYgLyogaWZkZWYgVEVTVCAqLworCisvKiBlbmQ6IHZpcF9vcC5jICovCisKK2NvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOworY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKK2NvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLworCit2b2lkCittZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKKyAgICAgY2hhciAqcHRyOworICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7CisgICAgIGZyYWdTICpmcmFnOworICAgICBzeW1ib2xTICp0b19zeW1ib2w7Cit7CisgIHZhbHVlVCBvZmZzZXQ7CisKKyAgLyogVGhpcyBmb3JtZXIgY2FsY3VsYXRpb24gd2FzIG9mZiBieSB0d286CisgICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEpOworICAgICBXZSBuZWVkIHRvIGFjY291bnQgZm9yIHRoZSBvbmUgYnl0ZSBpbnN0cnVjdGlvbiBhbmQgYWxzbyBpdHMKKyAgICAgdHdvIGJ5dGUgb3BlcmFuZC4gICovCisgIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMSArIDIpOworICAqcHRyKysgPSBWQVhfQlJXOwkJLyogYnJhbmNoIHdpdGggd29yZCAoMTYgYml0KSBvZmZzZXQgKi8KKyAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgMik7Cit9CisKK3ZvaWQKK21kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOworICAgICBmcmFnUyAqZnJhZzsKKyAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOworeworICB2YWx1ZVQgb2Zmc2V0OworCisgIG9mZnNldCA9IHRvX2FkZHIgLSBTX0dFVF9WQUxVRSAodG9fc3ltYm9sKTsKKyAgKnB0cisrID0gVkFYX0pNUDsJCS8qIGFyYml0cmFyeSBqdW1wICovCisgICpwdHIrKyA9IFZBWF9BQlNPTFVURV9NT0RFOworICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgb2Zmc2V0LCA0KTsKKyAgZml4X25ldyAoZnJhZywgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwgdG9fc3ltYm9sLCAobG9uZykgMCwgMCwgTk9fUkVMT0MpOworfQorDAorI2lmZGVmIE9CSl9WTVMKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJkOlNUdDpWKzFoOkh2OjoiOworI2Vsc2UKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJkOlNUdDpWIjsKKyNlbmRpZgorc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ1MnOgorICAgICAgYXNfd2FybiAoXygiU1lNQk9MIFRBQkxFIG5vdCBpbXBsZW1lbnRlZCIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVCc6CisgICAgICBhc193YXJuIChfKCJUT0tFTiBUUkFDRSBub3QgaW1wbGVtZW50ZWQiKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgICAgYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIpLCBhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd0JzoKKyAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgbmVlZCBvciB1c2UgdGVtcC4gZmlsZSBcIiVzXCIuIiksIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1YnOgorICAgICAgYXNfd2FybiAoXygiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiKSk7CisgICAgICBicmVhazsKKworI2lmZGVmIE9CSl9WTVMKKyAgICBjYXNlICcrJzoJCQkvKiBGb3IgZysrLiAgSGFzaCBhbnkgbmFtZSA+IDMxIGNoYXJzIGxvbmcuICovCisgICAgICBmbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzEnOgkJCS8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgICBmbGFnX29uZSA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0gnOgkJCS8qIFNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb24gKi8KKyAgICAgIGZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2gnOgkJCS8qIE5vIGhhc2hpbmcgb2YgbWl4ZWQtY2FzZSBuYW1lcyAqLworICAgICAgeworCWV4dGVybiBjaGFyIHZtc19uYW1lX21hcHBpbmc7CisJdm1zX25hbWVfbWFwcGluZyA9IGF0b2kgKGFyZyk7CisJZmxhZ19ub19oYXNoX21peGVkX2Nhc2UgPSAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd2JzoKKyAgICAgIHsKKwlleHRlcm4gY2hhciAqY29tcGlsZXJfdmVyc2lvbl9zdHJpbmc7CisJaWYgKCFhcmcgfHwgISphcmcgfHwgYWNjZXNzIChhcmcsIDApID09IDApCisJICByZXR1cm4gMDsJCS8qIGhhdmUgY2FsbGVyIHNob3cgdGhlIGFzc2VtYmxlciB2ZXJzaW9uICovCisJY29tcGlsZXJfdmVyc2lvbl9zdHJpbmcgPSBhcmc7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGZwcmludGYoc3RyZWFtLCBfKCJcCitWQVggb3B0aW9uczpcblwKKy1kIExFTkdUSAkJaWdub3JlZFxuXAorLUoJCQlpZ25vcmVkXG5cCistUwkJCWlnbm9yZWRcblwKKy10IEZJTEUJCQlpZ25vcmVkXG5cCistVAkJCWlnbm9yZWRcblwKKy1WCQkJaWdub3JlZFxuIikpOworI2lmZGVmIE9CSl9WTVMKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCitWTVMgb3B0aW9uczpcblwKKy0rCQkJaGFzaCBlbmNvZGUgbmFtZXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVyc1xuXAorLTEJCQlgY29uc3QnIGhhbmRsaW5nIGNvbXBhdGlibGUgd2l0aCBnY2MgMS54XG5cCistSAkJCXNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cblwKKy1oIE5VTQkJCWRvbid0IGhhc2ggbWl4ZWQtY2FzZSBuYW1lcywgYW5kIGFkanVzdCBjYXNlOlxuXAorCQkJMCA9IHVwcGVyLCAyID0gbG93ZXIsIDMgPSBwcmVzZXJ2ZSBjYXNlXG5cCistdlwiVkVSU0lPTlwiCQljb2RlIGJlaW5nIGFzc2VtYmxlZCB3YXMgcHJvZHVjZWQgYnkgY29tcGlsZXIgXCJWRVJTSU9OXCJcbiIpKTsKKyNlbmRpZgorfQorDAorLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLworCisvKiBBUkdTVVNFRCAqLworc3ltYm9sUyAqCittZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICByZXR1cm4gMDsKK30KKworLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KK3ZhbHVlVAorbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKKyAgICAgc2VnVCBzZWdtZW50OworICAgICB2YWx1ZVQgc2l6ZTsKK3sKKyAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLworfQorCisvKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/CisgICBPbiB0aGUgdmF4LCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKKyAgIGl0cyBzaXplLiAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OKSAqLworbG9uZworbWRfcGNyZWxfZnJvbSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Cit9CisKKy8qIGVuZCBvZiB0Yy12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12YXguaCBiL2dhcy9jb25maWcvdGMtdmF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3OTFmNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGMtdmF4LmgKQEAgLTAsMCArMSw0NSBAQAorLyogdGMtdmF4LmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXZheC5jLgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2RlZmluZSBUQ19WQVggMQorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKKworI2RlZmluZSBOT19SRUxPQyAwCisjZGVmaW5lIE5PUF9PUENPREUgMHgwMQorCisjZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCisjZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCitsb25nIG1kX2NoYXJzX3RvX251bWJlciBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworCitleHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKKyNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQorCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogY29tbWVudC1jb2x1bW46IDAKKyAqIGZpbGwtY29sdW1uOiAxMzEKKyAqIEVuZDoKKyAqLworCisvKiBlbmQgb2YgdGMtdmF4LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdzY1LmMgYi9nYXMvY29uZmlnL3RjLXc2NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjAxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXc2NS5jCkBAIC0wLDAgKzEsMTIxOSBAQAorLyogdGMtdzY1LmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIFc2NTgxNgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAgIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgIHNhY0BjeWdudXMuY29tCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjZGVmaW5lIERFRklORV9UQUJMRQorI2luY2x1ZGUgIi4uL29wY29kZXMvdzY1LW9wYy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK2NvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOworQ09OU1QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOworY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIhIyI7CisKKy8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKKyAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6CisgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAorICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCisgICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgorICovCisKKyNkZWZpbmUgT1BfQkNDCTB4OTAKKyNkZWZpbmUgT1BfQkNTCTB4QjAKKyNkZWZpbmUgT1BfQkVRCTB4RjAKKyNkZWZpbmUgT1BfQk1JCTB4MzAKKyNkZWZpbmUgT1BfQk5FCTB4RDAKKyNkZWZpbmUgT1BfQlBMCTB4MTAKKyNkZWZpbmUgT1BfQlJBCTB4ODAKKyNkZWZpbmUgT1BfQlJMCTB4ODIKKyNkZWZpbmUgT1BfQlZDCTB4NTAKKyNkZWZpbmUgT1BfQlZTCTB4NzAKKwordm9pZCBzX2xvbmdhICgpOworY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KK3sKKyAgeyJpbnQiLCBjb25zLCAyfSwKKyAgeyJ3b3JkIiwgY29ucywgMn0sCisgIHsibG9uZ2EiLCBzX2xvbmdhLCAwfSwKKyAgeyJsb25naSIsIHNfbG9uZ2EsIDF9LAorICB7MCwgMCwgMH0KK307CisKKwordm9pZCBjb25zICgpOwordm9pZCBzX2FsaWduX2J5dGVzICgpOworCisKKy8qaW50IG1kX3JlbG9jX3NpemU7ICovCisKK3N0YXRpYyBpbnQgcmVsYXg7CQkvKiBzZXQgaWYgLXJlbGF4IHNlZW4gKi8KKworY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7CisKKy8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCisvKiBBcyBpbiAwZjEyLjQ1NiAqLworLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KK2NvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKKworCisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCisKK2ludCBNOwkJCQkvKiBNIGZsYWcgKi8KK2ludCBYOwkJCQkvKiBYIGZsYWcgKi8KKworCisKKworI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKKyNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQorCisjZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+MikpCisKKyNkZWZpbmUgQllURV9ESVNQIDEKKyNkZWZpbmUgV09SRF9ESVNQIDIKKyNkZWZpbmUgVU5ERUZfQllURV9ESVNQIDAKKyNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDMKKworI2RlZmluZSBDT05EX0JSQU5DSCAJMQorI2RlZmluZSBVTkNPTkRfQlJBTkNIICAgMgorI2RlZmluZSBFTkQgCTMKKworI2RlZmluZSBCWVRFX0YgMTI3CQkvKiBIb3cgZmFyIHdlIGNhbiBicmFuY2ggZm9yd2FyZHMgKi8KKyNkZWZpbmUgQllURV9CIC0xMjYJCS8qIEhvdyBmYXIgd2UgY2FuIGJyYW5jaCBiYWNrd2FyZHMgKi8KKyNkZWZpbmUgV09SRF9GIDMyNzY3CisjZGVmaW5lIFdPUkRfQiAzMjc2OAorCityZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtDIChFTkQsIDApXTsKKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAorICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCisgKi8KKworCit2b2lkCitzX2xvbmdhICh4bW9kZSkKK3sKKyAgaW50ICpwID0geG1vZGUgPyAmWCA6ICZNOworICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCisgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvbiIsIDIpID09IDApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisgICAgICAqcCA9IDA7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvZmYiLCAzKSA9PSAwKQorICAgIHsKKyAgICAgICpwID0gMTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOworICAgIH0KKyAgZWxzZQorICAgIGFzX2JhZCAoXygibmVlZCBvbiBvciBvZmYuIikpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQordm9pZAorbWRfYmVnaW4gKCkKK3sKKyAgcmVsYXhfdHlwZVMgKnRhYmxlOworICBzdHJ1Y3Qgb3BpbmZvICpvcGNvZGU7CisgIGNoYXIgKnByZXZfbmFtZSA9ICIiOworCisgIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKKworICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLworICBmb3IgKG9wY29kZSA9IG9wdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisgICAgeworICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQorCXsKKwkgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKKwkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE1ha2UgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBwb2ludCB0byB0aGUgc2FtZQorCSAgICAgc3RyaW5nICovCisJICBvcGNvZGUtPm5hbWUgPSBwcmV2X25hbWU7CisJfQorICAgIH0KKworCisgIC8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlLiAgV2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQKKyAgICAgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEgc3VwcG9zZWRseSBjb25zdCBkYXRhIHN0cnVjdHVyZS4gICovCisgIHRhYmxlID0gKHJlbGF4X3R5cGVTICopIG1kX3JlbGF4X3RhYmxlOworICB0YWJsZVtDIChDT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7CisgIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7CisgIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKKyAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCk7CisKKyAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOworICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COworICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDU7CisgIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7CisKKyAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7CisgIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKKyAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDI7CisgIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKTsKKworICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKKyAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COworICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKKyAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOworCisgIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKK30KKworc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLworc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTE7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KKworCitzdGF0aWMgc3ltYm9sUyAqCitkb3QgKCkKK3sKKyAgY29uc3QgY2hhciAqZmFrZTsKKworICAvKiBKRjogJy4nIGlzIHBzZXVkbyBzeW1ib2wgd2l0aCB2YWx1ZSBvZiBjdXJyZW50IGxvY2F0aW9uCisgICAgIGluIGN1cnJlbnQgc2VnbWVudC4gICovCisgIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7CisgIHJldHVybiBzeW1ib2xfbmV3IChmYWtlLAorCQkgICAgIG5vd19zZWcsCisJCSAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAorCQkgICAgIGZyYWdfbm93KTsKKworfQorCitpbnQgZXhwcl9zaXplOworaW50IGV4cHJfc2hpZnQ7CitpbnQgdGNfY29uc19yZWxvYzsKK3ZvaWQKK3c2NV9leHByZXNzaW9uIChkZXN0LCBieXRlcykKKyAgICAgZXhwcmVzc2lvblMgKmRlc3Q7CisgICAgIHVuc2lnbmVkIGludCBieXRlczsKK3sKKyAgZXhwcl9zaXplID0gMDsKKyAgZXhwcl9zaGlmdCA9IDA7CisgIHRjX2NvbnNfcmVsb2MgPSAwOworICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCisgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQorICAgIHsKKyAgICAgIGV4cHJfc2l6ZSA9IDE7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICB9CisgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJz4nKQorICAgIHsKKyAgICAgIGV4cHJfc2hpZnQgPSAxOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgfQorICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdeJykKKyAgICB7CisgICAgICBleHByX3NoaWZ0ID0gMjsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgIH0KKworICBleHByICgwLCBkZXN0KTsKK30KKworaW50IGFtb2RlOworc3RhdGljCitjaGFyICoKK3BhcnNlX2V4cCAocywgYnl0ZXMpCisgICAgIGNoYXIgKnM7CisgICAgIGludCBieXRlczsKK3sKKyAgY2hhciAqc2F2ZTsKKyAgY2hhciAqbmV3OworCisgIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisgIHc2NV9leHByZXNzaW9uICgmaW1tZWRpYXRlLCBieXRlcyk7CisgIGlmIChpbW1lZGlhdGUuWF9vcCA9PSBPX2Fic2VudCkKKyAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKKyAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOworICByZXR1cm4gbmV3OworfQorCisKK3N0YXRpYworY2hhciAqCitnZXRfb3BlcmFuZHMgKGluZm8sIHB0cikKKyAgICAgc3RydWN0IG9waW5mbyAqaW5mbzsKKyAgICAgY2hhciAqcHRyOworeworICByZWdpc3RlciBpbnQgb3ZlcnJpZGVfbGVuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGJ5dGVzID0gMDsKKyAgd2hpbGUgKCpwdHIgPT0gJyAnKQorICAgIHB0cisrOworCisgIGlmIChwdHJbMF0gPT0gJyMnKQorICAgIHsKKyAgICAgIHB0cisrOworICAgICAgc3dpdGNoIChpbmZvLT5hbW9kZSkKKwl7CisJY2FzZSBBRERSX0lNTVRPSToKKwkgIGJ5dGVzID0gWCA/IDEgOiAyOworCSAgYW1vZGUgPSBBRERSX0lNTVRPSTsKKwkgIGJyZWFrOworCWNhc2UgQUREUl9JTU1UT0E6CisJICBieXRlcyA9IE0gPyAxIDogMjsKKwkgIGFtb2RlID0gQUREUl9JTU1UT0E7CisJICBicmVhazsKKwljYXNlIEFERFJfSU1NQ09QOgorCSAgYnl0ZXMgPSAxOworCSAgYW1vZGUgPSBBRERSX0lNTUNPUDsKKwkgIGJyZWFrOworCWNhc2UgQUREUl9ESVI6CisJICBieXRlcyA9IDI7CisJICBhbW9kZSA9IEFERFJfQUJTOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCSAgYnJlYWs7CisJfQorICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIpOworICAgIH0KKyAgZWxzZSBpZiAocHRyWzBdID09ICchJykKKyAgICB7CisgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOworICAgICAgaWYgKHB0clswXSA9PSAnLCcpCisJeworCSAgaWYgKHB0clsxXSA9PSAneScpCisJICAgIHsKKwkgICAgICBhbW9kZSA9IEFERFJfQUJTX0lEWF9ZOworCSAgICAgIGJ5dGVzID0gMjsKKwkgICAgICBwdHIgKz0gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKKwkgICAgeworCSAgICAgIGFtb2RlID0gQUREUl9BQlNfSURYX1g7CisJICAgICAgYnl0ZXMgPSAyOworCSAgICAgIHB0ciArPSAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIikpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFtb2RlID0gQUREUl9BQlM7CisJICBieXRlcyA9IDI7CisJfQorICAgIH0KKyAgZWxzZSBpZiAocHRyWzBdID09ICc+JykKKyAgICB7CisgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOworICAgICAgaWYgKHB0clswXSA9PSAnLCcgJiYgcHRyWzFdID09ICd4JykKKwl7CisJICBhbW9kZSA9IEFERFJfQUJTX0xPTkdfSURYX1g7CisJICBieXRlcyA9IDM7CisJICBwdHIgKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgYW1vZGUgPSBBRERSX0FCU19MT05HOworCSAgYnl0ZXMgPSAzOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHB0clswXSA9PSAnPCcpCisgICAgeworICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIgKyAxKTsKKyAgICAgIGlmIChwdHJbMF0gPT0gJywnKQorCXsKKwkgIGlmIChwdHJbMV0gPT0gJ3knKQorCSAgICB7CisJICAgICAgYW1vZGUgPSBBRERSX0RJUl9JRFhfWTsKKwkgICAgICBwdHIgKz0gMjsKKwkgICAgICBieXRlcyA9IDI7CisJICAgIH0KKwkgIGVsc2UgaWYgKHB0clsxXSA9PSAneCcpCisJICAgIHsKKwkgICAgICBhbW9kZSA9IEFERFJfRElSX0lEWF9YOworCSAgICAgIHB0ciArPSAyOworCSAgICAgIGJ5dGVzID0gMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgYWZ0ZXIgPGV4cCIpKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBhbW9kZSA9IEFERFJfRElSOworCSAgYnl0ZXMgPSAxOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHB0clswXSA9PSAnYScpCisgICAgeworICAgICAgYW1vZGUgPSBBRERSX0FDQzsKKyAgICB9CisgIGVsc2UgaWYgKHB0clswXSA9PSAnKCcpCisgICAgeworICAgICAgLyogTG9vayBmb3IgKGV4cCkseQorCSAoPGV4cCkseQorCSAoZXhwLHgpCisJICg8ZXhwLHgpCisJIChleHApCisJICghZXhwKQorCSAoZXhwKQorCSAoPGV4cCkKKwkgKGV4cCx4KQorCSAoIWV4cCx4KQorCSAoZXhwLHMpCisJIChleHAscykseSAqLworCisgICAgICBwdHIrKzsKKyAgICAgIGlmIChwdHJbMF0gPT0gJzwnKQorCXsKKwkgIG92ZXJyaWRlX2xlbiA9IDE7CisJICBwdHIrKzsKKwl9CisgICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJyEnKQorCXsKKwkgIG92ZXJyaWRlX2xlbiA9IDI7CisJICBwdHIrKzsKKwl9CisgICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJz4nKQorCXsKKwkgIG92ZXJyaWRlX2xlbiA9IDM7CisJICBwdHIrKzsKKwl9CisgICAgICBlbHNlCisJeworCSAgb3ZlcnJpZGVfbGVuID0gMDsKKwl9CisgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0cik7CisKKyAgICAgIGlmIChwdHJbMF0gPT0gJywnKQorCXsKKwkgIHB0cisrOworCSAgaWYgKHB0clswXSA9PSAneCcgJiYgcHRyWzFdID09ICcpJykKKwkgICAgeworCSAgICAgIHB0ciArPSAyOworCisJICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQorCQl7CisJCSAgYW1vZGUgPSBBRERSX0RJUl9JRFhfSU5EX1g7CisJCSAgYnl0ZXMgPSAyOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgYW1vZGUgPSBBRERSX0FCU19JTkRfSURYOworCQkgIGJ5dGVzID0gMjsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChwdHJbMF0gPT0gJ3MnICYmIHB0clsxXSA9PSAnKScgJiYgcHRyWzJdID09ICcsJyAmJiBwdHJbM10gPT0gJ3knKQorCSAgICB7CisJICAgICAgYW1vZGUgPSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWDsKKwkgICAgICBieXRlcyA9IDE7CisJICAgICAgcHRyICs9IDQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJyknKQorCXsKKwkgIGlmIChwdHJbMV0gPT0gJywnICYmIHB0clsyXSA9PSAneScpCisJICAgIHsKKwkgICAgICBhbW9kZSA9IEFERFJfRElSX0lORF9JRFhfWTsKKwkgICAgICBwdHIgKz0gMzsKKwkgICAgICBieXRlcyA9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKKwkJeworCQkgIGFtb2RlID0gQUREUl9ESVJfSU5EOworCQkgIGJ5dGVzID0gMTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGFtb2RlID0gQUREUl9BQlNfSU5EOworCQkgIGJ5dGVzID0gMjsKKwkJfQorCSAgICAgIHB0cisrOworCisJICAgIH0KKwl9CisKKyAgICB9CisgIGVsc2UgaWYgKHB0clswXSA9PSAnWycpCisgICAgeworICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIgKyAxKTsKKyAgICAgIGlmIChwdHJbMF0gPT0gJ10nKQorCXsKKwkgIHB0cisrOworCSAgaWYgKHB0clswXSA9PSAnLCcgJiYgcHRyWzFdID09ICd5JykKKwkgICAgeworCSAgICAgIGJ5dGVzID0gMTsKKwkgICAgICBhbW9kZSA9IEFERFJfRElSX0lORF9JRFhfWV9MT05HOworCSAgICAgIHB0ciArPSAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoaW5mby0+Y29kZSA9PSBPX2ptcCkgCisJCXsKKwkJYnl0ZXMgPSAyOworCQlhbW9kZSA9IEFERFJfQUJTX0lORF9MT05HOworCSAgICAgIH0gCisJICAgICAgZWxzZSAKK3sKKwkJYnl0ZXMgPSAxOworCSAgICAgIAorCQlhbW9kZSA9IEFERFJfRElSX0lORF9MT05HOworCSAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciwgMik7CisgICAgICBpZiAocHRyWzBdID09ICcsJykKKwl7CisJICBpZiAocHRyWzFdID09ICd5JykKKwkgICAgeworCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKKwkJeworCQkgIGJ5dGVzID0gMTsKKwkJICBhbW9kZSA9IEFERFJfRElSX0lEWF9ZOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgYW1vZGUgPSBBRERSX0FCU19JRFhfWTsKKwkJICBieXRlcyA9IDI7CisJCX0KKwkgICAgICBwdHIgKz0gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKKwkgICAgeworCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKKwkJeworCQkgIGFtb2RlID0gQUREUl9ESVJfSURYX1g7CisJCSAgYnl0ZXMgPSAxOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgYW1vZGUgPSBBRERSX0FCU19JRFhfWDsKKwkJICBieXRlcyA9IDI7CisJCX0KKwkgICAgICBwdHIgKz0gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAocHRyWzFdID09ICdzJykKKwkgICAgeworCSAgICAgIGJ5dGVzID0gMTsKKwkgICAgICBhbW9kZSA9IEFERFJfU1RBQ0tfUkVMOworCSAgICAgIHB0ciArPSAyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBieXRlcyA9IDE7CisJICAgICAgaW1tZWRpYXRlMSA9IGltbWVkaWF0ZTsKKwkgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOworCSAgICAgIGFtb2RlID0gQUREUl9CTE9DS19NT1ZFOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN3aXRjaCAoaW5mby0+YW1vZGUpCisJICAgIHsKKwkgICAgY2FzZSBBRERSX1BDX1JFTDoKKwkgICAgICBhbW9kZSA9IEFERFJfUENfUkVMOworCSAgICAgIGJ5dGVzID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBRERSX1BDX1JFTF9MT05HOgorCSAgICAgIGFtb2RlID0gQUREUl9QQ19SRUxfTE9ORzsKKwkgICAgICBieXRlcyA9IDI7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQorCQl7CisJCSAgYW1vZGUgPSBBRERSX0RJUjsKKwkJICBieXRlcyA9IDE7CisJCX0KKwkgICAgICBlbHNlIGlmIChvdmVycmlkZV9sZW4gPT0gMykKKwkJeworCQkgIGJ5dGVzID0gMzsKKwkJICBhbW9kZSA9IEFERFJfQUJTX0xPTkc7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBhbW9kZSA9IEFERFJfQUJTOworCQkgIGJ5dGVzID0gMjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICBzd2l0Y2ggKGJ5dGVzKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBzd2l0Y2ggKGV4cHJfc2hpZnQpCisJeworCWNhc2UgMDoKKwkgIGlmIChhbW9kZSA9PSBBRERSX0RJUikKKwl0Y19jb25zX3JlbG9jID0gUl9XNjVfRFA7CisJICBlbHNlCit0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTODsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4Uzg7CisJICBicmVhazsKKwljYXNlIDI6CisJICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTOFMxNjsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHN3aXRjaCAoZXhwcl9zaGlmdCkKKwl7CisJY2FzZSAwOgorCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzE2OworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzE2Uzg7CisJICBicmVhazsKKwljYXNlIDI6CisJICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTZTMTY7CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gcHRyOworfQorCisvKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKKyAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKKyAgIHByb3ZpZGVkCisgKi8KKworc3RhdGljCitzdHJ1Y3Qgb3BpbmZvICoKK2dldF9zcGVjaWZpYyAob3Bjb2RlKQorICAgICBzdHJ1Y3Qgb3BpbmZvICpvcGNvZGU7Cit7CisgIGludCBvY29kZSA9IG9wY29kZS0+Y29kZTsKKworICBmb3IgKDsgb3Bjb2RlLT5jb2RlID09IG9jb2RlOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBhbW9kZSkKKwlyZXR1cm4gb3Bjb2RlOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKKyAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7CisgICAgIGludCBsb3c7CisgICAgIGludCBoaWdoOworeworICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50CisgICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKKyAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCisgICAgeworICAgICAgYXNfYmFkICgib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIsIGxvdywgaGlnaCk7CisgICAgfQorICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOworfQorCisKK3N0YXRpYyBpbnQgbG9nMltdID0KK3swLCAwLCAxLCAwLCAyfTsKKworLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KKyAqLworc3RhdGljIHZvaWQKK2J1aWxkX015dGVzIChvcGNvZGUpCisgICAgIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKK3sKKyAgaW50IHNpemU7CisgIGludCB0eXBlOworICBpbnQgcGNyZWw7CisgIGNoYXIgKm91dHB1dDsKKworICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX0lNUExJRUQpCisgICAgeworICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgxKTsKKyAgICB9CisgIGVsc2UgaWYgKG9wY29kZS0+YW1vZGUgPT0gQUREUl9QQ19SRUwpCisgICAgeworICAgICAgaW50IHR5cGU7CisgICAgICAvKiBUaGlzIGlzIGEgcmVsYXhhYmxlIGluc24sIHNvIHdlIGRvIHNvbWUgc3BlY2lhbCBoYW5kbGluZyAqLworICAgICAgdHlwZSA9IG9wY29kZS0+dmFsID09IE9QX0JSQSA/IFVOQ09ORF9CUkFOQ0ggOiBDT05EX0JSQU5DSDsKKyAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKKwkJCSBtZF9yZWxheF90YWJsZVtDICh0eXBlLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoLAorCQkJIG1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIEJZVEVfRElTUCldLnJseF9sZW5ndGgsCisJCQkgQyAodHlwZSwgVU5ERUZfQllURV9ESVNQKSwKKwkJCSBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sLAorCQkJIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCisJCQkgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChvcGNvZGUtPmFtb2RlKQorCXsKKwkgIEdFVElORk8gKHNpemUsIHR5cGUsIHBjcmVsKTsKKwl9CisKKyAgICAgIC8qIElmIHNvbWV0aGluZyBzcGVjaWFsIHdhcyBkb25lIGluIHRoZQorCSBleHByZXNzaW9uIG1vZGlmeSB0aGUgcmVsb2MgdHlwZSAqLworICAgICAgaWYgKHRjX2NvbnNfcmVsb2MpCisJeworCSAgdHlwZSA9IHRjX2NvbnNfcmVsb2M7CisJfQorCisKKworICAgICAgLyogMSBieXRlIGZvciB0aGUgb3Bjb2RlICsgdGhlIGJ5dGVzIGZvciB0aGUgYWRkcm1vZGUgKi8KKyAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoc2l6ZSArIDEpOworCisgICAgICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX0JMT0NLX01PVkUpCisJeworCSAgLyogVHdvIHJlbG9jcyBmb3IgdGhpcyBvbmUgKi8KKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIG91dHB1dCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJICAgICAgIDEsCisJCSAgICAgICAmaW1tZWRpYXRlLAorCQkgICAgICAgMCwKKwkJICAgICAgIFJfVzY1X0FCUzhTMTYpOworCisJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCisJCSAgICAgICBvdXRwdXQgKyAyIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCisJCSAgICAgICAxLAorCQkgICAgICAgJmltbWVkaWF0ZTEsCisJCSAgICAgICAwLAorCQkgICAgICAgUl9XNjVfQUJTOFMxNik7CisJfQorICAgICAgZWxzZSBpZiAodHlwZSA+PSAwCisJICAgICAgICYmIG9wY29kZS0+YW1vZGUgIT0gQUREUl9JTVBMSUVECisJICAgICAgICYmIG9wY29kZS0+YW1vZGUgIT0gQUREUl9BQ0MKKwkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX1NUQUNLKQorCXsKKwkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKKwkJICAgICAgIG91dHB1dCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKKwkJICAgICAgIHNpemUsCisJCSAgICAgICAmaW1tZWRpYXRlLAorCQkgICAgICAgcGNyZWwsCisJCSAgICAgICB0eXBlKTsKKwl9CisgICAgfQorICBvdXRwdXRbMF0gPSBvcGNvZGUtPnZhbDsKK30KKworLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCisgICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAorICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KKyAqLworCit2b2lkCittZF9hc3NlbWJsZSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIHVuc2lnbmVkIGNoYXIgKm9wX3N0YXJ0OworICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7CisgIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKKyAgY2hhciBuYW1lWzIwXTsKKyAgaW50IG5sZW4gPSAwOworICBjaGFyICpwOworCisgIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICAvKiBhbGwgb3Bjb2RlcyBhcmUgdGhyZWUgbGV0dGVycyAqLworICBuYW1lWzBdID0gc3RyWzBdOworICBuYW1lWzFdID0gc3RyWzFdOworICBuYW1lWzJdID0gc3RyWzJdOworICBuYW1lWzNdID0gMDsKKworICB0Y19jb25zX3JlbG9jID0gMDsKKyAgc3RyICs9IDM7CisgIG9wY29kZSA9IChzdHJ1Y3Qgb3BpbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7CisKKyAgaWYgKG9wY29kZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChvcGNvZGUtPmFtb2RlICE9IEFERFJfSU1QTElFRAorICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX1NUQUNLKQorICAgIHsKKyAgICAgIGdldF9vcGVyYW5kcyAob3Bjb2RlLCBzdHIpOworICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUpOworICAgIH0KKworICBpZiAob3Bjb2RlID09IDApCisgICAgeworICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KKworCisgICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMSk7CisKKyAgICAgIHdoZXJlWzBdID0gMHgwOworICAgICAgd2hlcmVbMV0gPSAweDA7CisgICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYnVpbGRfTXl0ZXMgKG9wY29kZSk7Cit9CisKKwordm9pZAorREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAorICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKK30KKworc3ltYm9sUyAqCitERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAorICAgICAgIGNoYXIgKm5hbWUpCit7CisgIHJldHVybiAwOworfQorCit2b2lkCitERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCisgICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQoreworICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOworfQorCisvKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLworLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKKy8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCisgICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCisgICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KKyAqLworY2hhciAqCittZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKKyAgICAgY2hhciB0eXBlOworICAgICBjaGFyICpsaXRQOworICAgICBpbnQgKnNpemVQOworeworICBpbnQgcHJlYzsKKyAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOworICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7CisgIGNoYXIgKnQ7CisgIGNoYXIgKmF0b2ZfaWVlZSAoKTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgIGNhc2UgJ3MnOgorICAgIGNhc2UgJ1MnOgorICAgICAgcHJlYyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgcHJlYyA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ1gnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ1AnOgorICAgICAgcHJlYyA9IDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAqc2l6ZVAgPSAwOworICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIpOworICAgIH0KKyAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7CisgIGlmICh0KQorICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7CisKKyAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFAtLSksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKKyAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKworaW50CittZF9wYXJzZV9vcHRpb24gKGMsYSkKKyAgICBpbnQgYzsKKyAgICBjaGFyICphOworCit7CisgIHJldHVybiAxOworfQorCit2b2lkCit0Y19Ob3V0X2ZpeF90b19jaGFycyAoKQoreworICBwcmludGYgKF8oImNhbGwgdG8gdGNfTm91dF9maXhfdG9fY2hhcnMgXG4iKSk7CisgIGFib3J0ICgpOworfQorCisvKgorY2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlCisqLwordm9pZAorbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQorICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKKyAgICAgc2VnVCBzZWc7CisgICAgIGZyYWdTICpmcmFnUDsKK3sKKyAgaW50IGRpc3Bfc2l6ZSA9IDA7CisgIGludCBpbnN0X3NpemUgPSAwOworICB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApOgorICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKToKKyAgICAgIGRpc3Bfc2l6ZSA9IDE7CisgICAgICBpbnN0X3NpemUgPSAxOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGNvbmQgYnJhbmNoZXMgdG8gYSBrbm93biAxNiBiaXQgZGlzcGxhY2VtZW50ICovCisgICAgY2FzZSBDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKToKKyAgICAgIHN3aXRjaCAoYnVmZmVyWzBdKQorCXsKKwljYXNlIE9QX0JDQzoKKwljYXNlIE9QX0JDUzoKKwljYXNlIE9QX0JFUToKKwljYXNlIE9QX0JNSToKKwljYXNlIE9QX0JORToKKwljYXNlIE9QX0JQTDoKKwljYXNlIE9QX0JWUzoKKwljYXNlIE9QX0JWQzoKKwkgIC8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgKi8KKwkgIGJ1ZmZlclswXSBePSAweDIwOworCSAgYnVmZmVyWzFdID0gMzsJLyogSnVtcCBvdmVyIGZvbGxvd2luZyBicmwgKi8KKwkgIGJ1ZmZlclsyXSA9IE9QX0JSTDsKKwkgIGJ1ZmZlclszXSA9IDA7CisJICBidWZmZXJbNF0gPSAwOworCSAgZGlzcF9zaXplID0gMjsKKwkgIGluc3Rfc2l6ZSA9IDM7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApOgorICAgICAgLyogVW5jb25kaXRpb25hbCBicmFuY2hlcyB0byBhIGtub3duIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KKworICAgICAgc3dpdGNoIChidWZmZXJbMF0pCisJeworCWNhc2UgT1BfQlJBOgorCSAgYnVmZmVyWzBdID0gT1BfQlJMOworCSAgZGlzcF9zaXplID0gMjsKKwkgIGluc3Rfc2l6ZSA9IDE7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgYnJlYWs7CisgICAgICAvKiBnb3QgdG8gY3JlYXRlIGEgYnJhbmNoIG92ZXIgYSByZWxvYyBoZXJlICovCisgICAgY2FzZSBDIChDT05EX0JSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKKyAgICAgIGJ1ZmZlclswXSBePSAweDIwOwkvKiBpbnZlcnQgdGVzdCAqLworICAgICAgYnVmZmVyWzFdID0gMzsKKyAgICAgIGJ1ZmZlclsyXSA9IE9QX0JSTDsKKyAgICAgIGJ1ZmZlclszXSA9IDA7CisgICAgICBidWZmZXJbNF0gPSAwOworICAgICAgZml4X25ldyAoZnJhZ1AsCisJICAgICAgIGZyYWdQLT5mcl9maXggKyAzLAorCSAgICAgICA0LAorCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAorCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAorCSAgICAgICAwLAorCSAgICAgICBSX1c2NV9QQ1IxNik7CisKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFVOREVGX1dPUkRfRElTUCk6CisgICAgICBidWZmZXJbMF0gPSBPUF9CUkw7CisgICAgICBidWZmZXJbMV0gPSAwOworICAgICAgYnVmZmVyWzJdID0gMDsKKyAgICAgIGZpeF9uZXcgKGZyYWdQLAorCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgMSwKKwkgICAgICAgNCwKKwkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKKwkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKKwkgICAgICAgMCwKKwkgICAgICAgUl9XNjVfUENSMTYpOworCisgICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKKyAgICAgIGZyYWdQLT5mcl92YXIgPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgaWYgKGluc3Rfc2l6ZSkKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIGludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyBkaXNwX3NpemUgKyBpbnN0X3NpemU7CisgICAgICBpbnQgdGFyZ19hZGRyID0gKFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArCisJCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0KTsKKyAgICAgIGludCBkaXNwID0gdGFyZ19hZGRyIC0gbmV4dF9pbnN0OworCisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIGluc3Rfc2l6ZSwgZGlzcCwgZGlzcF9zaXplKTsKKyAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOworICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7CisgICAgfQorfQorCisKK3ZhbHVlVAorREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAorICAgICAgIHNlZ1Qgc2VnIEFORAorICAgICAgIHZhbHVlVCBzaXplKQoreworICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKQorCSAgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOworCit9CisKK3ZvaWQKK21kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQorICAgICBmaXhTICpmaXhQOworICAgICBsb25nIHZhbDsKK3sKKyAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOworICBpbnQgYWRkciA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKKworICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCisgICAgeworICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKKwlmaXhQLT5meF9yX3R5cGUgPSBSX1c2NV9BQlM4OworICAgICAgZWxzZQorCWZpeFAtPmZ4X3JfdHlwZSA9IFJfVzY1X0FCUzE2OworICAgIH0KKworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBSX1c2NV9BQlM4UzE2OgorICAgICAgdmFsID4+PSA4OworICAgIGNhc2UgUl9XNjVfQUJTOFM4OgorICAgICAgdmFsID4+PSA4OworICAgIGNhc2UgUl9XNjVfQUJTODoKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9XNjVfQUJTMTZTMTY6CisgICAgICB2YWwgPj49IDg7CisgICAgY2FzZSBSX1c2NV9BQlMxNlM4OgorICAgICAgdmFsID4+PSA4OworICAgIGNhc2UgUl9XNjVfQUJTMTY6CisgICAgICAqYnVmKysgPSB2YWwgPj4gMDsKKyAgICAgICpidWYrKyA9IHZhbCA+PiA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1c2NV9BQlMyNDoKKyAgICAgICpidWYrKyA9IHZhbCA+PiAwOworICAgICAgKmJ1ZisrID0gdmFsID4+IDg7CisgICAgICAqYnVmKysgPSB2YWwgPj4gMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfVzY1X1BDUjg6CisgICAgICAqYnVmKysgPSB2YWwgLSBhZGRyIC0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9XNjVfUENSMTY6CisgICAgICB2YWwgPSB2YWwgLSBhZGRyIC0gMTsKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgICpidWYrKyA9IHZhbCA+PiA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBSX1c2NV9EUDoKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCisKK3ZvaWQKK21kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKKyAgICAgY2hhciAqcHRyOworICAgICB2YWx1ZVQgdXNlOworICAgICBpbnQgbmJ5dGVzOworeworICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKK30KKworbG9uZworbWRfcGNyZWxfZnJvbSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgaW50IGdhcCA9IGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSAxOworICByZXR1cm4gZ2FwOworfQorCit2b2lkCit0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHgpCisgICAgc3RydWN0IHN5bWJvbCAqeDsKK3sKK30KKworc2hvcnQKK3RjX2NvZmZfZml4MnJ0eXBlIChmaXhfcHRyKQorICAgICBmaXhTICpmaXhfcHRyOworeworICByZXR1cm4gZml4X3B0ci0+Znhfcl90eXBlOworfQorCit2b2lkCit0Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCisgICAgIGZpeFMgKmZpeF9wdHI7CisgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKKyAgICAgYmZkX3ZtYSBiYXNlOworCit7CisgIHN5bWJvbFMgKnN5bWJvbF9wdHI7CisKKyAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OworCisgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKKyAgICAgdG8gb3V0cHV0IGl0ICovCisgIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCisgICAgeworICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCisgICAgICAgKi8KKyAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKKwl7CisJY2FzZSAyOgorCSAgaW50ci0+cl90eXBlID0gUl9JTU0xNjsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIGludHItPnJfdHlwZSA9IFJfSU1NODsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGZpeF9wdHItPmZ4X3NpemUgPT0gNCkKKwlpbnRyLT5yX3R5cGUgPSBSX1c2NV9BQlMyNDsKKyAgICAgIGVsc2UKKwlpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7CisgICAgfQorCisgIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOworICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKKworICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLworICBpZiAoc3ltYm9sX3B0cikKKyAgICB7CisgICAgICBzeW1ib2xTICpkb3Q7CisKKyAgICAgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OworICAgICAgaWYgKGRvdCkKKwl7CisJICBpbnRyLT5yX29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltYm9sX3B0cik7CisJICBpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKKyAgICB9Cit9CisKK2ludAordGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOworfQorCisKKworCisKKy8qCitjYWxsZWQganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLCByZXR1cm4gdGhlIGxlbmd0aAorYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbgorKi8KK2ludAorbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCisgICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKKyAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Cit7CisgIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKKworICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSBDIChDT05EX0JSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKKyAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFVOREVGX0JZVEVfRElTUCk6CisgICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLworICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKKwl7CisJICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCisJIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KKwkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQllURV9ESVNQKTsKKwkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLworCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOworCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7CisJICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKKwl9CisgICAgfQorICByZXR1cm4gZnJhZ1AtPmZyX3ZhcjsKK30KKworCisKK0NPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworI2RlZmluZSBPUFRJT05fUkVMQVggKE9QVElPTl9NRF9CQVNFKQorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9OworCit2b2lkCittZF9zaG93X3VzYWdlIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKKworfQorCitzaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXc2NS5oIGIvZ2FzL2NvbmZpZy90Yy13NjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzk0YWQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90Yy13NjUuaApAQCAtMCwwICsxLDYxIEBACisvKiBUaGlzIGZpbGUgaXMgdGMtdzY1LmgKKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjZGVmaW5lIFRDX1c2NQorCisjZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKKworI2lmIEFOU0lfUFJPVE9UWVBFUworc3RydWN0IGludGVybmFsX3JlbG9jOworI2VuZGlmCisKKyNkZWZpbmUgV09SS0lOR19ET1RfV09SRAorCisvKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLworI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQorCisjZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX3c2NQorI2RlZmluZSBDT0ZGX01BR0lDIDB4NjUwMAorCisjZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCisKKyNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKK2V4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQorICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7CisKKyNkZWZpbmUgRE9fTk9UX1NUUklQIDAKKyNkZWZpbmUgTElTVElOR19IRUFERVIgIlc2NTgxNiBHQVMgIgorI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCisjZGVmaW5lIFJFTE9DXzMyIDEyMzQKKworI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKKyNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSB3NjVfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCisjZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQorI2RlZmluZSBUQ19DT05TX1JFTE9DIHRjX2NvbnNfcmVsb2MKKyNkZWZpbmUgRE9OVF9PVkVSRkxPVworaW50IHRjX2NvbnNfcmVsb2M7CisKKyNkZWZpbmUgbWRfb3BlcmFuZCh4KQorCitleHRlcm4gc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKKyNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQorCisvKiBlbmQgb2YgdGMtdzY1LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmMgYi9nYXMvY29uZmlnL3RjLXo4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTEzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXo4ay5jCkBAIC0wLDAgKzEsMTU4OSBAQAorLyogdGMtejhrLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIFppbG9nIFo4MDBuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCisgIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgc2FjQGN5Z251cy5jb20KKyAgKi8KKyNkZWZpbmUgREVGSU5FX1RBQkxFCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9wY29kZXMvejhrLW9wYy5oIgorCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitjb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9Cit7JyEnLCAwfTsKK2NvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9Cit7JzsnLCAwfTsKK2NvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPQoreycjJywgMH07CisKK2V4dGVybiBpbnQgbWFjaGluZTsKK2V4dGVybiBpbnQgY29mZl9mbGFnczsKK2ludCBzZWdtZW50ZWRfbW9kZTsKK2NvbnN0IGludCBtZF9yZWxvY19zaXplOworCisvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCisgICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgorICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKKyAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAorICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAgICovCisKK3ZvaWQgY29ucyAoKTsKKwordm9pZAorc19zZWdtICgpCit7CisgIHNlZ21lbnRlZF9tb2RlID0gMTsKKyAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAxOworICBjb2ZmX2ZsYWdzID0gRl9aODAwMTsKK30KKwordm9pZAorc191bnNlZyAoKQoreworICBzZWdtZW50ZWRfbW9kZSA9IDA7CisgIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMjsKKyAgY29mZl9mbGFncyA9IEZfWjgwMDI7Cit9CisKK3N0YXRpYwordm9pZAorZXZlbiAoKQoreworICBmcmFnX2FsaWduICgxLCAwLCAwKTsKKyAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Cit9CisKK3ZvaWQgb2JqX2NvZmZfc2VjdGlvbiAoKTsKKworaW50Cit0b2hleCAoYykKKyAgICAgaW50IGM7Cit7CisgIGlmIChpc2RpZ2l0IChjKSkKKyAgICByZXR1cm4gYyAtICcwJzsKKyAgaWYgKGlzbG93ZXIgKGMpKQorICAgIHJldHVybiBjIC0gJ2EnICsgMTA7CisgIHJldHVybiBjIC0gJ0EnICsgMTA7Cit9CisKK3ZvaWQKK3N2YWwgKCkKK3sKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCisgICAgeworICAgICAgaW50IGM7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICB3aGlsZSAoYyAhPSAnXCcnKQorCXsKKwkgIGlmIChjID09ICclJykKKwkgICAgeworCSAgICAgIGMgPSAodG9oZXggKGlucHV0X2xpbmVfcG9pbnRlclswXSkgPDwgNCkKKwkJfCB0b2hleCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKTsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKwkgICAgfQorCSAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKKwkgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CisJfQorICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CisKK30KK2NvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Cit7CisgIHsiaW50IiwgY29ucywgMn0sCisgIHsiZGF0YS5iIiwgY29ucywgMX0sCisgIHsiZGF0YS53IiwgY29ucywgMn0sCisgIHsiZGF0YS5sIiwgY29ucywgNH0sCisgIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAorICB7ImhlYWRpbmciLCBsaXN0aW5nX3RpdGxlLCAwfSwKKyAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCisgIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAorICB7InByb2dyYW0iLCBzX2lnbm9yZSwgMH0sCisgIHsiejgwMDEiLCBzX3NlZ20sIDB9LAorICB7Ino4MDAyIiwgc191bnNlZywgMH0sCisKKworICB7InNlZ20iLCBzX3NlZ20sIDB9LAorICB7InVuc2VnbSIsIHNfdW5zZWcsIDB9LAorICB7InVuc2VnIiwgc191bnNlZywgMH0sCisgIHsibmFtZSIsIHNfYXBwX2ZpbGUsIDB9LAorICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAorICB7Ind2YWwiLCBjb25zLCAyfSwKKyAgeyJsdmFsIiwgY29ucywgNH0sCisgIHsiYnZhbCIsIGNvbnMsIDF9LAorICB7InN2YWwiLCBzdmFsLCAwfSwKKyAgeyJyc2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAorICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKKyAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAorICB7ImV2ZW4iLCBldmVuLCAwfSwKKyAgezAsIDAsIDB9Cit9OworCitjb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKKworLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KKy8qIEFzIGluIDBmMTIuNDU2ICovCisvKiBvciAgICAwZDEuMjM0NWUxMiAqLworY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOworCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLworCit2b2lkCittZF9iZWdpbiAoKQoreworICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOworICBjaGFyICpwcmV2X25hbWUgPSAiIjsKKyAgaW50IGlkeCA9IDA7CisKKyAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOworCisgIGZvciAob3Bjb2RlID0gejhrX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgIHsKKyAgICAgIC8qIE9ubHkgZW50ZXIgdW5pcXVlIGNvZGVzIGludG8gdGhlIHRhYmxlICovCisgICAgICBjaGFyICpzcmMgPSBvcGNvZGUtPm5hbWU7CisKKyAgICAgIGlmIChzdHJjbXAgKG9wY29kZS0+bmFtZSwgcHJldl9uYW1lKSkKKwl7CisJICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOworCSAgaWR4Kys7CisJfQorICAgICAgb3Bjb2RlLT5pZHggPSBpZHg7CisgICAgICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7CisgICAgfQorCisgIC8qIGRlZmF1bHQgdG8gejgwMDIgKi8KKyAgc191bnNlZyAoKTsKKworICAvKiBpbnNlcnQgdGhlIHBzZXVkbyBvcHMgdG9vICovCisgIGZvciAoaWR4ID0gMDsgbWRfcHNldWRvX3RhYmxlW2lkeF0ucG9jX25hbWU7IGlkeCsrKQorICAgIHsKKyAgICAgIG9wY29kZV9lbnRyeV90eXBlICpmYWtlX29wY29kZTsKKyAgICAgIGZha2Vfb3Bjb2RlID0gKG9wY29kZV9lbnRyeV90eXBlICopIG1hbGxvYyAoc2l6ZW9mIChvcGNvZGVfZW50cnlfdHlwZSkpOworICAgICAgZmFrZV9vcGNvZGUtPm5hbWUgPSBtZF9wc2V1ZG9fdGFibGVbaWR4XS5wb2NfbmFtZSwKKwlmYWtlX29wY29kZS0+ZnVuYyA9ICh2b2lkICopIChtZF9wc2V1ZG9fdGFibGUgKyBpZHgpOworICAgICAgZmFrZV9vcGNvZGUtPm9wY29kZSA9IDI1MDsKKyAgICAgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBmYWtlX29wY29kZS0+bmFtZSwgZmFrZV9vcGNvZGUpOworICAgIH0KKworICBsaW5rcmVsYXggPSAxOworfQorCitzdHJ1Y3QgejhrX2V4cAoreworICBjaGFyICplX2JlZzsKKyAgY2hhciAqZV9lbmQ7CisgIGV4cHJlc3Npb25TIGVfZXhwOworfTsKK3R5cGVkZWYgc3RydWN0IHo4a19vcAoreworICBjaGFyIHJlZ3NpemU7CQkJLyogJ2InLCd3JywncicsJ3EnICovCisgIHVuc2lnbmVkIGludCByZWc7CQkvKiAwLi4xNSAqLworCisgIGludCBtb2RlOworCisgIHVuc2lnbmVkIGludCB4X3JlZzsJCS8qIGFueSBvdGhlciByZWdpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGUgKi8KKyAgZXhwcmVzc2lvblMgZXhwOwkJLyogYW55IGV4cHJlc3Npb24gKi8KK30KKworb3BfdHlwZTsKKworc3RhdGljIGV4cHJlc3Npb25TICpkYV9vcGVyYW5kOworc3RhdGljIGV4cHJlc3Npb25TICppbW1fb3BlcmFuZDsKKworaW50IHJlZ1sxNl07CitpbnQgdGhlX2NjOworaW50IHRoZV9jdHJsOworaW50IHRoZV9mbGFnczsKK2ludCB0aGVfaW50ZXJydXB0OworCitjaGFyICoKK0RFRlVOICh3aGF0cmVnLCAocmVnLCBzcmMpLAorICAgICAgIGludCAqcmVnIEFORAorICAgICAgIGNoYXIgKnNyYykKK3sKKyAgaWYgKGlzZGlnaXQgKHNyY1sxXSkpCisgICAgeworICAgICAgKnJlZyA9IChzcmNbMF0gLSAnMCcpICogMTAgKyBzcmNbMV0gLSAnMCc7CisgICAgICByZXR1cm4gc3JjICsgMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcmVnID0gKHNyY1swXSAtICcwJyk7CisgICAgICByZXR1cm4gc3JjICsgMTsKKyAgICB9Cit9CisKKy8qCisgIHBhcnNlIG9wZXJhbmRzCisKKyAgcmgwLXJoNywgcmwwLXJsNworICByMC1yMTUKKyAgcnIwLXJyMTQKKyAgcnEwLS1ycTEyCisgIFdSRUcgcjAscjEscjIscjMscjQscjUscjYscjcsZnAsc3AKKyAgcjBsLHIwaCwuLnI3bCxyN2gKKyAgQFdSRUcKKyAgQFdSRUcrCisgIEAtV1JFRworICAjY29uc3QKKworICAqLworCisvKiB0cnkgYW5kIHBhcnNlIGEgcmVnIG5hbWUsIHJldHVybnMgbnVtYmVyIG9mIGNoYXJzIGNvbnN1bWVkICovCitjaGFyICoKK0RFRlVOIChwYXJzZV9yZWcsIChzcmMsIG1vZGUsIHJlZyksCisgICAgICAgY2hhciAqc3JjIEFORAorICAgICAgIGludCAqbW9kZSBBTkQKKyAgICAgICB1bnNpZ25lZCBpbnQgKnJlZykKK3sKKyAgY2hhciAqcmVzID0gMDsKKyAgY2hhciByZWdubzsKKworICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQorICAgIHsKKyAgICAgIGlmIChzZWdtZW50ZWRfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0xPTkc7CisgICAgICAgICAgKnJlZyA9IDE0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19XT1JEOworICAgICAgICAgICpyZWcgPSAxNTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHNyYyArIDI7CisgICAgfQorICBpZiAoc3JjWzBdID09ICdyJykKKyAgICB7CisgICAgICBpZiAoc3JjWzFdID09ICdyJykKKyAgICAgICAgeworICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0xPTkc7CisgICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKKwkgIHJlZ25vID0gKnJlZzsKKwkgIGlmIChyZWdubyA+IDE0KQorICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByciVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ2gnKQorICAgICAgICB7CisgICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfQllURTsKKyAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOworCSAgcmVnbm8gPSAqcmVnOworCSAgaWYgKHJlZ25vID4gNykKKyAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcmglZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoc3JjWzFdID09ICdsJykKKyAgICAgICAgeworICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0JZVEU7CisgICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKKwkgIHJlZ25vID0gKnJlZzsKKwkgIGlmIChyZWdubyA+IDcpCisgICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJsJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7CisgICAgICAgICAgKnJlZyArPSA4OworICAgICAgICB9CisgICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ3EnKQorICAgICAgICB7CisgICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfUVVBRDsKKyAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOworCSAgcmVnbm8gPSAqcmVnOworCSAgaWYgKHJlZ25vID4gMTIpCisgICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJxJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX1dPUkQ7CisgICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAxKTsKKwkgIHJlZ25vID0gKnJlZzsKKwkgIGlmIChyZWdubyA+IDE1KQorICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiByZXM7CisKK30KKworY2hhciAqCitERUZVTiAocGFyc2VfZXhwLCAocywgb3ApLAorICAgICAgIGNoYXIgKnMgQU5ECisgICAgICAgZXhwcmVzc2lvblMgKiBvcCkKK3sKKyAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgY2hhciAqbmV3OworCisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7CisgIGV4cHJlc3Npb24gKG9wKTsKKyAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQorICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOworICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7CisgIHJldHVybiBuZXc7Cit9CisKKy8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6CisKKyAgIDxyYj4KKyAgIDxyPgorICAgPHJyPgorICAgPHJxPgorICAgQHIKKyAgICNleHAKKyAgIGV4cAorICAgZXhwKHIpCisgICByKCNleHApCisgICByKHIpCisKKworCisgICAqLworCitzdGF0aWMKK2NoYXIgKgorREVGVU4gKGNoZWNrZm9yLCAocHRyLCB3aGF0KSwKKyAgICAgICBjaGFyICpwdHIgQU5ECisgICAgICAgY2hhciB3aGF0KQoreworICBpZiAoKnB0ciA9PSB3aGF0KQorICAgIHB0cisrOworICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCAlYyIpLCB3aGF0KTsKKyAgICB9CisgIHJldHVybiBwdHI7Cit9CisKKy8qIE1ha2Ugc3VyZSB0aGUgbW9kZSBzdXBwbGllZCBpcyB0aGUgc2l6ZSBvZiBhIHdvcmQgKi8KK3N0YXRpYyB2b2lkCitERUZVTiAocmVnd29yZCwgKG1vZGUsIHN0cmluZyksCisgICAgICAgaW50IG1vZGUgQU5ECisgICAgICAgY2hhciAqc3RyaW5nKQoreworICBpbnQgb2s7CisKKyAgb2sgPSBDTEFTU19SRUdfV09SRDsKKyAgaWYgKG9rICE9IG1vZGUpCisgICAgeworICAgICAgYXNfYmFkIChfKCJyZWdpc3RlciBpcyB3cm9uZyBzaXplIGZvciBhIHdvcmQgJXMiKSwgc3RyaW5nKTsKKyAgICB9Cit9CisKKy8qIE1ha2Ugc3VyZSB0aGUgbW9kZSBzdXBwbGllZCBpcyB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzICovCitzdGF0aWMgdm9pZAorREVGVU4gKHJlZ2FkZHIsIChtb2RlLCBzdHJpbmcpLAorICAgICAgIGludCBtb2RlIEFORAorICAgICAgIGNoYXIgKnN0cmluZykKK3sKKyAgaW50IG9rOworCisgIG9rID0gc2VnbWVudGVkX21vZGUgPyBDTEFTU19SRUdfTE9ORyA6IENMQVNTX1JFR19XT1JEOworICBpZiAob2sgIT0gbW9kZSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGFkZHJlc3MgJXMiKSwgc3RyaW5nKTsKKyAgICB9Cit9CisKK3N0cnVjdCBjdHJsX25hbWVzCit7CisgICBpbnQgdmFsdWU7CisgICBjaGFyICpuYW1lOworfTsKKworc3RydWN0IGN0cmxfbmFtZXMgY3RybF90YWJsZVtdID0KK3sKKyAgIDB4MiwgImZjdyIsCisgICAwWDMsICJyZWZyZXNoIiwKKyAgIDB4NCwgInBzYXBzZWciLAorICAgMHg1LCAicHNhcG9mZiIsCisgICAweDUsICJwc2FwIiwKKyAgIDB4NiwgIm5zcHNlZyIsCisgICAweDcsICJuc3BvZmYiLAorICAgMHg3LCAibnNwIiwKKyAgIDAsIDAKK307CisgICAKK3N0YXRpYyB2b2lkCitERUZVTiAoZ2V0X2N0cmxfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKKyAgICAgICBjaGFyICoqcHRyIEFORAorICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECisgICAgICAgdW5zaWduZWQgaW50IGRzdCkKK3sKKyAgY2hhciAqc3JjID0gKnB0cjsKKyAgaW50IHI7CisgIGludCBpOworCisgIHdoaWxlICgqc3JjID09ICcgJykKKyAgICBzcmMrKzsKKworICBtb2RlLT5tb2RlID0gQ0xBU1NfQ1RSTDsKKyAgZm9yIChpID0gMDsgY3RybF90YWJsZVtpXS5uYW1lOyBpKyspCisgICAgeworICAgICAgaW50IGo7CisKKyAgICAgIGZvciAoaiA9IDA7IGN0cmxfdGFibGVbaV0ubmFtZVtqXTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGN0cmxfdGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgIHRoZV9jdHJsID0gY3RybF90YWJsZVtpXS52YWx1ZTsKKyAgICAgICpwdHIgPSBzcmMgKyBqOworICAgICAgcmV0dXJuOworICAgIGZhaWw6OworICAgIH0KKyAgdGhlX2N0cmwgPSAwOworICByZXR1cm47Cit9CisKK3N0cnVjdCBmbGFnX25hbWVzCit7CisgIGludCB2YWx1ZTsKKyAgY2hhciAqbmFtZTsKKworfTsKKworc3RydWN0IGZsYWdfbmFtZXMgZmxhZ190YWJsZVtdID0KK3sKKyAgMHgxLCAicCIsCisgIDB4MSwgInYiLAorICAweDIsICJzIiwKKyAgMHg0LCAieiIsCisgIDB4OCwgImMiLAorICAweDAsICIrIiwKKyAgMCwgMAorfTsKKworc3RhdGljIHZvaWQKK0RFRlVOIChnZXRfZmxhZ3Nfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKKyAgICAgICBjaGFyICoqcHRyIEFORAorICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECisgICAgICAgdW5zaWduZWQgaW50IGRzdCkKK3sKKyAgY2hhciAqc3JjID0gKnB0cjsKKyAgaW50IHI7CisgIGludCBpOworICBpbnQgajsKKworICB3aGlsZSAoKnNyYyA9PSAnICcpCisgICAgc3JjKys7CisKKyAgbW9kZS0+bW9kZSA9IENMQVNTX0ZMQUdTOworICB0aGVfZmxhZ3MgPSAwOworICBmb3IgKGogPSAwOyBqIDw9IDk7IGorKykKKyAgICB7CisgICAgIGlmICghc3JjW2pdKQorCWdvdG8gZG9uZTsKKyAgICAgZm9yIChpID0gMDsgZmxhZ190YWJsZVtpXS5uYW1lOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZmxhZ190YWJsZVtpXS5uYW1lWzBdID09IHNyY1tqXSkKKwkJeworCSAgICAgICAgdGhlX2ZsYWdzID0gdGhlX2ZsYWdzIHwgZmxhZ190YWJsZVtpXS52YWx1ZTsKKwkJZ290byBtYXRjaDsKKwkJfQorICAgICAgICB9CisgICAgICBnb3RvIGRvbmU7CisgICAgbWF0Y2g6CisgICAgIDsKKyAgICB9CisgIGRvbmU6CisgICpwdHIgPSBzcmMgKyBqOworICByZXR1cm47Cit9CisKKworc3RydWN0IGludGVycnVwdF9uYW1lcworeworICBpbnQgdmFsdWU7CisgIGNoYXIgKm5hbWU7CisKK307CisKK3N0cnVjdCBpbnRlcnJ1cHRfbmFtZXMgaW50cl90YWJsZVtdID0KK3sKKyAgMHgxLCAibnZpIiwKKyAgMHgyLCAidmkiLAorICAweDMsICJib3RoIiwKKyAgMHgzLCAiYWxsIiwKKyAgMCwgMAorfTsKKworc3RhdGljIHZvaWQKK0RFRlVOIChnZXRfaW50ZXJydXB0X29wZXJhbmQsIChwdHIsIG1vZGUsIGRzdCksCisgICAgICAgY2hhciAqKnB0ciBBTkQKKyAgICAgICBzdHJ1Y3QgejhrX29wICptb2RlIEFORAorICAgICAgIHVuc2lnbmVkIGludCBkc3QpCit7CisgIGNoYXIgKnNyYyA9ICpwdHI7CisgIGludCByOworICBpbnQgaTsKKworICB3aGlsZSAoKnNyYyA9PSAnICcpCisgICAgc3JjKys7CisKKyAgbW9kZS0+bW9kZSA9IENMQVNTX0lNTTsKKyAgZm9yIChpID0gMDsgaW50cl90YWJsZVtpXS5uYW1lOyBpKyspCisgICAgeworICAgICAgaW50IGo7CisKKyAgICAgIGZvciAoaiA9IDA7IGludHJfdGFibGVbaV0ubmFtZVtqXTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGludHJfdGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgIHRoZV9pbnRlcnJ1cHQgPSBpbnRyX3RhYmxlW2ldLnZhbHVlOworICAgICAgKnB0ciA9IHNyYyArIGo7CisgICAgICByZXR1cm47CisgICAgZmFpbDo7CisgICAgfQorICB0aGVfaW50ZXJydXB0ID0gMHgwOworICByZXR1cm47Cit9CisKK3N0cnVjdCBjY19uYW1lcworeworICBpbnQgdmFsdWU7CisgIGNoYXIgKm5hbWU7CisKK307CisKK3N0cnVjdCBjY19uYW1lcyB0YWJsZVtdID0KK3sKKyAgMHgwLCAiZiIsCisgIDB4MSwgImx0IiwKKyAgMHgyLCAibGUiLAorICAweDMsICJ1bGUiLAorICAweDQsICJvdiIsCisgIDB4NCwgInBlIiwKKyAgMHg1LCAibWkiLAorICAweDYsICJlcSIsCisgIDB4NiwgInoiLAorICAweDcsICJjIiwKKyAgMHg3LCAidWx0IiwKKyAgMHg4LCAidCIsCisgIDB4OSwgImdlIiwKKyAgMHhhLCAiZ3QiLAorICAweGIsICJ1Z3QiLAorICAweGMsICJub3YiLAorICAweGMsICJwbyIsCisgIDB4ZCwgInBsIiwKKyAgMHhlLCAibmUiLAorICAweGUsICJueiIsCisgIDB4ZiwgIm5jIiwKKyAgMHhmLCAidWdlIiwKKyAgMCwgMAorfTsKKworc3RhdGljIHZvaWQKK0RFRlVOIChnZXRfY2Nfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKKyAgICAgICBjaGFyICoqcHRyIEFORAorICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECisgICAgICAgdW5zaWduZWQgaW50IGRzdCkKK3sKKyAgY2hhciAqc3JjID0gKnB0cjsKKyAgaW50IHI7CisgIGludCBpOworCisgIHdoaWxlICgqc3JjID09ICcgJykKKyAgICBzcmMrKzsKKworICBtb2RlLT5tb2RlID0gQ0xBU1NfQ0M7CisgIGZvciAoaSA9IDA7IHRhYmxlW2ldLm5hbWU7IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKworICAgICAgZm9yIChqID0gMDsgdGFibGVbaV0ubmFtZVtqXTsgaisrKQorCXsKKwkgIGlmICh0YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKKwkgICAgZ290byBmYWlsOworCX0KKyAgICAgIHRoZV9jYyA9IHRhYmxlW2ldLnZhbHVlOworICAgICAgKnB0ciA9IHNyYyArIGo7CisgICAgICByZXR1cm47CisgICAgZmFpbDo7CisgICAgfQorICB0aGVfY2MgPSAweDg7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfb3BlcmFuZCAocHRyLCBtb2RlLCBkc3QpCisgICAgIGNoYXIgKipwdHI7CisgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGU7CisgICAgIHVuc2lnbmVkIGludCBkc3Q7Cit7CisgIGNoYXIgKnNyYyA9ICpwdHI7CisgIGNoYXIgKmVuZDsKKyAgdW5zaWduZWQgaW50IG51bTsKKyAgdW5zaWduZWQgaW50IGxlbjsKKyAgdW5zaWduZWQgaW50IHNpemU7CisKKyAgbW9kZS0+bW9kZSA9IDA7CisKKyAgd2hpbGUgKCpzcmMgPT0gJyAnKQorICAgIHNyYysrOworICBpZiAoKnNyYyA9PSAnIycpCisgICAgeworICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX0lNTTsKKyAgICAgIGltbV9vcGVyYW5kID0gJihtb2RlLT5leHApOworICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMgKyAxLCAmKG1vZGUtPmV4cCkpOworICAgIH0KKyAgZWxzZSBpZiAoKnNyYyA9PSAnQCcpCisgICAgeworICAgICAgaW50IGQ7CisKKyAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19JUjsKKyAgICAgIHNyYyA9IHBhcnNlX3JlZyAoc3JjICsgMSwgJmQsICZtb2RlLT5yZWcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCByZWduOworCisgICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUtPm1vZGUsICZyZWduKTsKKworICAgICAgaWYgKGVuZCkKKwl7CisJICBpbnQgbncsIG5yOworCisJICBzcmMgPSBlbmQ7CisJICBpZiAoKnNyYyA9PSAnKCcpCisJICAgIHsKKwkgICAgICBzcmMrKzsKKwkgICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJm53LCAmbnIpOworCSAgICAgIGlmIChlbmQpCisJCXsKKwkJICAvKiBHb3QgUmEoUmIpICovCisJCSAgc3JjID0gZW5kOworCisJCSAgaWYgKCpzcmMgIT0gJyknKQorCQkgICAgeworCQkgICAgICBhc19iYWQgKF8oIk1pc3NpbmcgKSBpbiByYShyYikiKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBzcmMrKzsKKwkJICAgIH0KKworCQkgIHJlZ2FkZHIgKG1vZGUtPm1vZGUsICJyYShyYikgcmEiKTsKKy8qCQkgIHJlZ3dvcmQgKG1vZGUtPm1vZGUsICJyYShyYikgcmIiKTsqLworCQkgIG1vZGUtPm1vZGUgPSBDTEFTU19CWDsKKwkJICBtb2RlLT5yZWcgPSByZWduOworCQkgIG1vZGUtPnhfcmVnID0gbnI7CisJCSAgcmVnW0FSR19SWF0gPSBucjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIEdvdCBSYShkaXNwKSAqLworCQkgIGlmICgqc3JjID09ICcjJykKKwkJICAgIHNyYysrOworCQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmKG1vZGUtPmV4cCkpOworCQkgIHNyYyA9IGNoZWNrZm9yIChzcmMsICcpJyk7CisJCSAgbW9kZS0+bW9kZSA9IENMQVNTX0JBOworCQkgIG1vZGUtPnJlZyA9IHJlZ247CisJCSAgbW9kZS0+eF9yZWcgPSAwOworCQkgIGltbV9vcGVyYW5kID0gJihtb2RlLT5leHApOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1vZGUtPnJlZyA9IHJlZ247CisJICAgICAgbW9kZS0+eF9yZWcgPSAwOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5vIGluaXRpYWwgcmVnICovCisJICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJihtb2RlLT5leHApKTsKKwkgIGlmICgqc3JjID09ICcoJykKKwkgICAgeworCSAgICAgIHNyYysrOworCSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmKG1vZGUtPm1vZGUpLCAmcmVnbik7CisJICAgICAgcmVnd29yZCAobW9kZS0+bW9kZSwgImFkZHIoUmEpIHJhIik7CisJICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX1g7CisJICAgICAgbW9kZS0+cmVnID0gcmVnbjsKKwkgICAgICBtb2RlLT54X3JlZyA9IDA7CisJICAgICAgZGFfb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKKwkgICAgICBzcmMgPSBjaGVja2ZvciAoZW5kLCAnKScpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBKdXN0IGFuIGFkZHJlc3MgKi8KKwkgICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfREE7CisJICAgICAgbW9kZS0+cmVnID0gMDsKKwkgICAgICBtb2RlLT54X3JlZyA9IDA7CisJICAgICAgZGFfb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKKwkgICAgfQorCX0KKyAgICB9CisgICpwdHIgPSBzcmM7Cit9CisKK3N0YXRpYworY2hhciAqCitnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLCBvcGVyYW5kKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOworICAgICBjaGFyICpvcF9lbmQ7CisgICAgIG9wX3R5cGUgKm9wZXJhbmQ7Cit7CisgIGNoYXIgKnB0ciA9IG9wX2VuZDsKK2NoYXIgKnNhdnB0cjsKKyAgc3dpdGNoIChvcGNvZGUtPm5vcGVyYW5kcykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKKyAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgIHB0cisrOworICAgICAgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfQ0MpCisgICAgICAgIHsKKyAgICAgICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0ZMQUdTKQorICAgICAgICB7CisgICAgICAgICAgZ2V0X2ZsYWdzX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSAoQ0xBU1NfSU1NICsoQVJHX0lNTTIpKSkKKyAgICAgICAgeworICAgICAgICAgIGdldF9pbnRlcnJ1cHRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOworICAgICAgICB9CisgICAgICBvcGVyYW5kWzFdLm1vZGUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBwdHIrKzsKKyAgICAgIHNhdnB0ciA9IHB0cjsKKyAgICAgIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0NDKQorICAgICAgICB7CisgICAgICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19DVFJMKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGdldF9jdHJsX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKKyAgICAgICAgICAgICAgIGlmICh0aGVfY3RybCA9PSAwKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcHRyID0gc2F2cHRyOworICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgaWYgKHB0ciA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgIGlmICgqcHRyID09ICcsJykKKyAgICAgICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgICAgICAgIGdldF9jdHJsX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKKyAgICAgICAgfQorICAgICAgaWYgKHB0ciA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoKnB0ciA9PSAnLCcpCisgICAgICAgIHB0cisrOworICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgcHRyKys7CisgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOworICAgICAgaWYgKCpwdHIgPT0gJywnKQorCXB0cisrOworICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKKyAgICAgIGlmICgqcHRyID09ICcsJykKKwlwdHIrKzsKKyAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMiwgMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgIHB0cisrOworICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKKyAgICAgIGlmICgqcHRyID09ICcsJykKKwlwdHIrKzsKKyAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSk7CisgICAgICBpZiAoKnB0ciA9PSAnLCcpCisJcHRyKys7CisgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDIsIDIpOworICAgICAgaWYgKCpwdHIgPT0gJywnKQorCXB0cisrOworICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAzLCAzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcmV0dXJuIHB0cjsKK30KKworLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50CisgICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCisgICBwcm92aWRlZAorICAgKi8KKworc3RhdGljCitvcGNvZGVfZW50cnlfdHlwZSAqCitERUZVTiAoZ2V0X3NwZWNpZmljLCAob3Bjb2RlLCBvcGVyYW5kcyksCisgICAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKiBvcGNvZGUgQU5ECisgICAgICAgb3BfdHlwZSAqIG9wZXJhbmRzKQorCit7CisgIG9wY29kZV9lbnRyeV90eXBlICp0aGlzX3RyeSA9IG9wY29kZTsKKyAgaW50IGZvdW5kID0gMDsKKyAgdW5zaWduZWQgaW50IG5vcGVyYW5kcyA9IG9wY29kZS0+bm9wZXJhbmRzOworCisgIHVuc2lnbmVkIGludCBkaXNwcmVnOworICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IG9wY29kZS0+aWR4OworCisgIHdoaWxlICh0aGlzX2luZGV4ID09IG9wY29kZS0+aWR4ICYmICFmb3VuZCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBub3BlcmFuZHM7IGkrKykKKwl7CisJICBpbnQgbW9kZSA9IG9wZXJhbmRzW2ldLm1vZGU7CisKKwkgIGlmICgobW9kZSAmIENMQVNTX01BU0spICE9ICh0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBDTEFTU19NQVNLKSkKKwkgICAgeworCSAgICAgIC8qIGl0IGNvdWxkIGJlIGFuIHBjIHJlbCBvcGVyYW5kLCBpZiB0aGlzIGlzIGEgZGEgbW9kZSBhbmQKKwkgICB3ZSBsaWtlIGRpc3BzLCB0aGVuIGluc2VydCBpdCAqLworCisJICAgICAgaWYgKG1vZGUgPT0gQ0xBU1NfREEgJiYgdGhpc190cnktPmFyZ19pbmZvW2ldID09IENMQVNTX0RJU1ApCisJCXsKKwkJICAvKiBUaGlzIGlzIHRoZSBjYXNlICovCisJCSAgb3BlcmFuZHNbaV0ubW9kZSA9IENMQVNTX0RJU1A7CisJCX0KKwkgICAgICBlbHNlIGlmIChtb2RlID09IENMQVNTX0JBICYmIHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSkKKwkJeworCQkgIC8qIENhbid0IHRoaW5rIG9mIGEgd2F5IHRvIHR1cm4gd2hhdCB3ZSd2ZSBiZWVuIGdpdmVuIGludG8KKwkgICAgIHNvbWV0aGluZyB0aGF0J3Mgb2sgKi8KKwkJICBnb3RvIGZhaWw7CisJCX0KKwkgICAgICBlbHNlIGlmICh0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBDTEFTU19QUikKKwkJeworCQkgIGlmIChtb2RlID09IENMQVNTX1JFR19MT05HICYmIHNlZ21lbnRlZF9tb2RlKQorCQkgICAgeworCQkgICAgICAvKiBvayAqLworCQkgICAgfQorCQkgIGVsc2UgaWYgKG1vZGUgPT0gQ0xBU1NfUkVHX1dPUkQgJiYgIXNlZ21lbnRlZF9tb2RlKQorCQkgICAgeworCQkgICAgICAvKiBvayAqLworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGdvdG8gZmFpbDsKKwkJfQorCSAgICAgIGVsc2UKKwkJZ290byBmYWlsOworCSAgICB9CisJICBzd2l0Y2ggKG1vZGUgJiBDTEFTU19NQVNLKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ0xBU1NfWDoKKwkgICAgY2FzZSBDTEFTU19JUjoKKwkgICAgY2FzZSBDTEFTU19CQToKKwkgICAgY2FzZSBDTEFTU19CWDoKKwkgICAgY2FzZSBDTEFTU19ESVNQOgorCSAgICBjYXNlIENMQVNTX1JFRzoKKwkgICAgY2FzZSBDTEFTU19SRUdfV09SRDoKKwkgICAgY2FzZSBDTEFTU19SRUdfQllURToKKwkgICAgY2FzZSBDTEFTU19SRUdfUVVBRDoKKwkgICAgY2FzZSBDTEFTU19SRUdfTE9ORzoKKwkgICAgY2FzZSBDTEFTU19SRUdOMDoKKwkgICAgICByZWdbdGhpc190cnktPmFyZ19pbmZvW2ldICYgQVJHX01BU0tdID0gb3BlcmFuZHNbaV0ucmVnOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBmb3VuZCA9IDE7CisgICAgZmFpbDo7CisgICAgfQorICBpZiAoZm91bmQpCisgICAgcmV0dXJuIHRoaXNfdHJ5OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitERUZVTiAoY2hlY2tfb3BlcmFuZCwgKG9wZXJhbmQsIHdpZHRoLCBzdHJpbmcpLAorICAgICAgIHN0cnVjdCB6OGtfb3AgKm9wZXJhbmQgQU5ECisgICAgICAgdW5zaWduZWQgaW50IHdpZHRoIEFORAorICAgICAgIGNoYXIgKnN0cmluZykKK3sKKyAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMAorICAgICAgJiYgb3BlcmFuZC0+ZXhwLlhfb3Bfc3ltYm9sID09IDApCisgICAgeworCisgICAgICAvKiBObyBzeW1ib2wgaW52b2x2ZWQsIGxldCdzIGxvb2sgYXQgb2Zmc2V0LCBpdCdzIGRhbmdlcm91cyBpZiBhbnkgb2YKKyAgICAgICB0aGUgaGlnaCBiaXRzIGFyZSBub3QgMCBvciBmZidzLCBmaW5kIG91dCBieSBvcmluZyBvciBhbmRpbmcgd2l0aAorICAgICAgIHRoZSB3aWR0aCBhbmQgc2VlaW5nIGlmIHRoZSBhbnN3ZXIgaXMgMCBvciBhbGwgZnMqLworICAgICAgaWYgKChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgfndpZHRoKSAhPSAwICYmCisJICAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8IHdpZHRoKSAhPSAofjApKQorCXsKKwkgIGFzX3dhcm4gKF8oIm9wZXJhbmQgJXMweCV4IG91dCBvZiByYW5nZS4iKSwgc3RyaW5nLCBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKKwl9CisgICAgfQorCit9CisKK3N0YXRpYyBjaGFyIGJ1ZmZlclsyMF07CisKK3N0YXRpYyB2b2lkCitERUZVTiAobmV3Zml4LCAocHRyLCB0eXBlLCBvcGVyYW5kKSwKKyAgICAgICBpbnQgcHRyIEFORAorICAgICAgIGludCB0eXBlIEFORAorICAgICAgIGV4cHJlc3Npb25TICogb3BlcmFuZCkKK3sKKyAgaWYgKG9wZXJhbmQtPlhfYWRkX3N5bWJvbAorICAgICAgfHwgb3BlcmFuZC0+WF9vcF9zeW1ib2wKKyAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlcikKKyAgICB7CisgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCisJCSAgIHB0ciwKKwkJICAgMSwKKwkJICAgb3BlcmFuZCwKKwkJICAgMCwKKwkJICAgdHlwZSk7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitERUZVTiAoYXBwbHlfZml4LCAocHRyLCB0eXBlLCBvcGVyYW5kLCBzaXplKSwKKyAgICAgICBjaGFyICpwdHIgQU5ECisgICAgICAgaW50IHR5cGUgQU5ECisgICAgICAgZXhwcmVzc2lvblMgKiBvcGVyYW5kIEFORAorICAgICAgIGludCBzaXplKQoreworICBpbnQgbiA9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKKworICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPSBuOworICBuZXdmaXggKChwdHIgLSBidWZmZXIpIC8gMiwgdHlwZSwgb3BlcmFuZCk7CisjaWYgMQorICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgODoJCQkvKiA4IG5pYmJsZXMgPT0gMzIgYml0cyAqLworICAgICAgKnB0cisrID0gbiA+PiAyODsKKyAgICAgICpwdHIrKyA9IG4gPj4gMjQ7CisgICAgICAqcHRyKysgPSBuID4+IDIwOworICAgICAgKnB0cisrID0gbiA+PiAxNjsKKyAgICBjYXNlIDQ6CQkJLyogNCBuaWJsbGVzID09IDE2IGJpdHMgKi8KKyAgICAgICpwdHIrKyA9IG4gPj4gMTI7CisgICAgICAqcHRyKysgPSBuID4+IDg7CisgICAgY2FzZSAyOgorICAgICAgKnB0cisrID0gbiA+PiA0OworICAgIGNhc2UgMToKKyAgICAgICpwdHIrKyA9IG4gPj4gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICByZXR1cm4gcHRyOworCit9CisKKy8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCisgKi8KKyNkZWZpbmUgSU5TRVJUKHgseSkgKngrKyA9IHk+PjI0OyAqeCsrID0geT4+IDE2OyAqeCsrPXk+Pjg7ICp4KysgPXk7CitzdGF0aWMgdm9pZAorYnVpbGRfYnl0ZXMgKHRoaXNfdHJ5LCBvcGVyYW5kKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqIHRoaXNfdHJ5OworICAgICBzdHJ1Y3QgejhrX29wICpvcGVyYW5kOworeworICB1bnNpZ25lZCBpbnQgaTsKKworICBpbnQgbGVuZ3RoOworICBjaGFyICpvdXRwdXQ7CisgIGNoYXIgKm91dHB1dF9wdHIgPSBidWZmZXI7CisgIGNoYXIgcGFydDsKKyAgaW50IGM7CisgIGNoYXIgaGlnaDsKKyAgaW50IG5pYjsKKyAgaW50IG5pYmJsZTsKKyAgdW5zaWduZWQgaW50ICpjbGFzc19wdHI7CisKKyAgZnJhZ193YW5lIChmcmFnX25vdyk7CisgIGZyYWdfbmV3ICgwKTsKKworICBtZW1zZXQgKGJ1ZmZlciwgMjAsIDApOworICBjbGFzc19wdHIgPSB0aGlzX3RyeS0+Ynl0ZV9pbmZvOwordG9wOjsKKworICBmb3IgKG5pYmJsZSA9IDA7IGMgPSAqY2xhc3NfcHRyKys7IG5pYmJsZSsrKQorICAgIHsKKworICAgICAgc3dpdGNoIChjICYgQ0xBU1NfTUFTSykKKwl7CisJZGVmYXVsdDoKKworCSAgYWJvcnQgKCk7CisJY2FzZSBDTEFTU19BRERSRVNTOgorCSAgLyogRGlyZWN0IGFkZHJlc3MsIHdlIGRvbid0IGNvcGUgd2l0aCB0aGUgU1MgbW9kZSByaWdodCBub3cgKi8KKwkgIGlmIChzZWdtZW50ZWRfbW9kZSkKKwkgICAgeworCSAgICAgIGRhX29wZXJhbmQtPlhfYWRkX251bWJlciB8PSAweDgwMDAwMDAwOworCSAgICAgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMzIsIGRhX29wZXJhbmQsIDgpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBkYV9vcGVyYW5kLCA0KTsKKwkgICAgfQorCSAgZGFfb3BlcmFuZCA9IDA7CisJICBicmVhazsKKwljYXNlIENMQVNTX0RJU1A4OgorCSAgLyogcGMgcmVsIDggYml0ICovCisJICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0pSLCBkYV9vcGVyYW5kLCAyKTsKKwkgIGRhX29wZXJhbmQgPSAwOworCSAgYnJlYWs7CisKKwljYXNlIENMQVNTXzBESVNQNzoKKwkgIC8qIHBjIHJlbCA3IGJpdCAqLworCSAgKm91dHB1dF9wdHIgPSAwOworCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9ESVNQNywgZGFfb3BlcmFuZCwgMik7CisJICBkYV9vcGVyYW5kID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSBDTEFTU18xRElTUDc6CisJICAvKiBwYyByZWwgNyBiaXQgKi8KKwkgICpvdXRwdXRfcHRyID0gMHg4MDsKKwkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfRElTUDcsIGRhX29wZXJhbmQsIDIpOworICAgICAgICAgIG91dHB1dF9wdHJbLTJdID0gIDB4ODsKKwkgIGRhX29wZXJhbmQgPSAwOworCSAgYnJlYWs7CisKKwljYXNlIENMQVNTX0JJVF8xT1IyOgorCSAgKm91dHB1dF9wdHIgPSBjICYgMHhmOworCSAgaWYgKGltbV9vcGVyYW5kKQorCSAgICB7CisJICAgICAgaWYgKGltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMikKKwkJeworCQkgICpvdXRwdXRfcHRyIHw9IDI7CisJCX0KKwkgICAgICBlbHNlIGlmIChpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyICE9IDEpCisJCXsKKwkJICBhc19iYWQgKF8oImltbWVkaWF0ZSBtdXN0IGJlIDEgb3IgMiIpKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSAxIG9yIDIgZXhwZWN0ZWQiKSk7CisJICAgIH0KKwkgIG91dHB1dF9wdHIrKzsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfQ0M6CisJICAqb3V0cHV0X3B0cisrID0gdGhlX2NjOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0xBU1NfMENDQzoKKyAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2N0cmw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0xBU1NfMUNDQzoKKyAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2N0cmwgfCAweDg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0xBU1NfMDBJSToKKyAgICAgICAgICAqb3V0cHV0X3B0cisrID0gKH50aGVfaW50ZXJydXB0ICYgMHgzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDTEFTU18wMUlJOgorICAgICAgICAgICpvdXRwdXRfcHRyKysgPSAofnRoZV9pbnRlcnJ1cHQgJiAweDMpIHwgMHg0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENMQVNTX0ZMQUdTOgorICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfZmxhZ3M7CisgICAgICAgICAgYnJlYWs7CisJY2FzZSBDTEFTU19CSVQ6CisJICAqb3V0cHV0X3B0cisrID0gYyAmIDB4ZjsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHTjA6CisJICBpZiAocmVnW2MgJiAweGZdID09IDApCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oImNhbid0IHVzZSBSMCBoZXJlIikpOworCSAgICB9CisJY2FzZSBDTEFTU19SRUc6CisJY2FzZSBDTEFTU19SRUdfQllURToKKwljYXNlIENMQVNTX1JFR19XT1JEOgorCWNhc2UgQ0xBU1NfUkVHX0xPTkc6CisJY2FzZSBDTEFTU19SRUdfUVVBRDoKKwkgIC8qIEluc2VydCBiaXQgbWF0dGVybiBvZgorCSByaWdodCByZWcgKi8KKwkgICpvdXRwdXRfcHRyKysgPSByZWdbYyAmIDB4Zl07CisJICBicmVhazsKKwljYXNlIENMQVNTX0RJU1A6CisJICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBkYV9vcGVyYW5kLCA0KTsKKwkgIGRhX29wZXJhbmQgPSAwOworCSAgYnJlYWs7CisKKwljYXNlIENMQVNTX0lNTToKKwkgIHsKKwkgICAgbmliID0gMDsKKwkgICAgc3dpdGNoIChjICYgQVJHX01BU0spCisJICAgICAgeworCSAgICAgIGNhc2UgQVJHX0lNTTQ6CisJCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBBUkdfSU1NNE0xOgorCQlpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyLS07CisJCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBBUkdfSU1NTk1JTlVTMToKKwkJaW1tX29wZXJhbmQtPlhfYWRkX251bWJlci0tOworCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTRMLCBpbW1fb3BlcmFuZCwgMSk7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQVJHX05JTTg6CisJCWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgPSAtaW1tX29wZXJhbmQtPlhfYWRkX251bWJlcjsKKwkgICAgICBjYXNlIEFSR19JTU04OgorCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTgsIGltbV9vcGVyYW5kLCAyKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBBUkdfSU1NMTY6CisJCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGltbV9vcGVyYW5kLCA0KTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIEFSR19JTU0zMjoKKwkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0zMiwgaW1tX29wZXJhbmQsIDgpOworCQlicmVhazsKKworCSAgICAgIGRlZmF1bHQ6CisJCWFib3J0ICgpOworCSAgICAgIH0KKwkgIH0KKwl9CisgICAgfQorCisgIC8qIENvcHkgZnJvbSB0aGUgbmliYmxlIGJ1ZmZlciBpbnRvIHRoZSBmcmFnICovCisKKyAgeworICAgIGludCBsZW5ndGggPSAob3V0cHV0X3B0ciAtIGJ1ZmZlcikgLyAyOworICAgIGNoYXIgKnNyYyA9IGJ1ZmZlcjsKKyAgICBjaGFyICpmcmFncCA9IGZyYWdfbW9yZSAobGVuZ3RoKTsKKworICAgIHdoaWxlIChzcmMgPCBvdXRwdXRfcHRyKQorICAgICAgeworCSpmcmFncCA9IChzcmNbMF0gPDwgNCkgfCBzcmNbMV07CisJc3JjICs9IDI7CisJZnJhZ3ArKzsKKyAgICAgIH0KKworICB9CisKK30KKworLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCisgICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAorICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KKyAgICovCisKK3ZvaWQKK0RFRlVOIChtZF9hc3NlbWJsZSwgKHN0ciksCisgICAgICAgY2hhciAqc3RyKQoreworICBjaGFyICpvcF9zdGFydDsKKyAgY2hhciAqb3BfZW5kOworICB1bnNpZ25lZCBpbnQgaTsKKyAgc3RydWN0IHo4a19vcCBvcGVyYW5kWzNdOworICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOworICBvcGNvZGVfZW50cnlfdHlwZSAqcHJldl9vcGNvZGU7CisKKyAgY2hhciAqZG90ID0gMDsKKyAgY2hhciBjOworCisgIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgIHdoaWxlICgqc3RyID09ICcgJykKKyAgICBzdHIrKzsKKworICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLworICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOworICAgICAgICpvcF9lbmQgIT0gMCAmJiAqb3BfZW5kICE9ICcgJzsKKyAgICAgICBvcF9lbmQrKykKKyAgICB7CisgICAgfQorCisgIDsKKworICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOworICAgIH0KKyAgYyA9ICpvcF9lbmQ7CisKKyAgKm9wX2VuZCA9IDA7CisKKyAgb3Bjb2RlID0gKG9wY29kZV9lbnRyeV90eXBlICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwKKwkJCQkJICAgIG9wX3N0YXJ0KTsKKworCisgIGlmIChvcGNvZGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAob3Bjb2RlLT5vcGNvZGUgPT0gMjUwKQorICAgIHsKKyAgICAgIC8qIHdhcyByZWFsbHkgYSBwc2V1ZG8gb3AgKi8KKworICAgICAgcHNldWRvX3R5cGVTICpwOworICAgICAgY2hhciBvYzsKKworICAgICAgY2hhciAqb2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgKm9wX2VuZCA9IGM7CisKKworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOworCisgICAgICBvYyA9ICpvbGQ7CisgICAgICAqb2xkID0gJ1xuJzsKKyAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKKwlpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIHAgPSAocHNldWRvX3R5cGVTICopIChvcGNvZGUtPmZ1bmMpOworCisgICAgICAocC0+cG9jX2hhbmRsZXIpIChwLT5wb2NfdmFsKTsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZDsKKyAgICAgICpvbGQgPSBvYzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLAorCQkJCQkgb3BlcmFuZCk7CisgICAgICBwcmV2X29wY29kZSA9IG9wY29kZTsKKworICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOworCisgICAgICBpZiAob3Bjb2RlID09IDApCisJeworCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KKwkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKKworCSAgd2hlcmVbMF0gPSAweDA7CisJICB3aGVyZVsxXSA9IDB4MDsKKworCSAgYXNfYmFkIChfKCJDYW4ndCBmaW5kIG9wY29kZSB0byBtYXRjaCBvcGVyYW5kcyIpKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpOworICAgIH0KK30KKwordm9pZAorREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAorICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKK30KKworc3ltYm9sUyAqCitERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAorICAgICAgIGNoYXIgKm5hbWUpCit7CisgIHJldHVybiAwOworfQorCit2b2lkCitERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCisgICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQoreworICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOworfQorCisvKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLworLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLworI2RlZmluZSBNQVhfTElUVExFTlVNUyA2CisKKy8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCisgICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCisgICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KKyAgICovCitjaGFyICoKK21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQorICAgICBjaGFyIHR5cGU7CisgICAgIGNoYXIgKmxpdFA7CisgICAgIGludCAqc2l6ZVA7Cit7CisgIGludCBwcmVjOworICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107CisgIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKKyAgY2hhciAqdDsKKyAgY2hhciAqYXRvZl9pZWVlICgpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnUyc6CisgICAgICBwcmVjID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAncic6CisgICAgY2FzZSAnUic6CisgICAgICBwcmVjID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisgICAgICBwcmVjID0gNjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICpzaXplUCA9IDA7CisgICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7CisgICAgfQorICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKKyAgaWYgKHQpCisgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKKworICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7CisgIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKKyAgICB7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7CisgICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisMCitDT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiejoiOworc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0geworICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9Oworc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOworCitpbnQKK21kX3BhcnNlX29wdGlvbiAoYywgYXJnKQorICAgICBpbnQgYzsKKyAgICAgY2hhciAqYXJnOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ3onOgorICAgICAgaWYgKCFzdHJjbXAgKGFyZywgIjgwMDEiKSkKKwlzX3NlZ20gKCk7CisgICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICI4MDAyIikpCisJc191bnNlZyAoKTsKKyAgICAgIGVsc2UKKwl7CisJICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC16JXMiKSwgYXJnKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKwordm9pZAorbWRfc2hvd191c2FnZSAoc3RyZWFtKQorICAgICBGSUxFICpzdHJlYW07Cit7CisgIGZwcmludGYoc3RyZWFtLCBfKCJcCitaOEsgb3B0aW9uczpcblwKKy16ODAwMQkJCWdlbmVyYXRlIHNlZ21lbnRlZCBjb2RlXG5cCistejgwMDIJCQlnZW5lcmF0ZSB1bnNlZ21lbnRlZCBjb2RlXG4iKSk7Cit9CisMCit2b2lkCit0Y19hb3V0X2ZpeF90b19jaGFycyAoKQoreworICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7CisgIGFib3J0ICgpOworfQorCit2b2lkCittZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCisgICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOworICAgICBzZWdUIHNlZzsKKyAgICAgZnJhZ1MgKmZyYWdQOworeworICBwcmludGYgKF8oImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIikpOworICBhYm9ydCAoKTsKK30KKwordmFsdWVUCitERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCisgICAgICAgc2VnVCBzZWcgQU5ECisgICAgICAgdmFsdWVUIHNpemUpCit7CisgIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKKworfQorCit2b2lkCittZF9hcHBseV9maXggKGZpeFAsIHZhbCkKKyAgICAgZml4UyAqZml4UDsKKyAgICAgbG9uZyB2YWw7Cit7CisgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKKworICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKKyAgICB7CisgICAgY2FzZSBSX0lNTTRMOgorICAgICAgYnVmWzBdID0gKGJ1ZlswXSAmIDB4ZjApIHwgKChidWZbMF0gKyB2YWwpICYgMHhmKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0pSOgorCisgICAgICAqYnVmKysgPSB2YWw7CisgICAgICAvKiAgICBpZiAodmFsICE9IDApIGFib3J0KCk7Ki8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSX0RJU1A3OgorCisgICAgICAqYnVmKysgKz0gdmFsOworICAgICAgLyogICAgaWYgKHZhbCAhPSAwKSBhYm9ydCgpOyovCisgICAgICBicmVhazsKKworICAgIGNhc2UgUl9JTU04OgorICAgICAgYnVmWzBdICs9IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUl9JTU0xNjoKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7CisgICAgICAqYnVmKysgPSB2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJfSU1NMzI6CisgICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOworICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKKyAgICAgICpidWYrKyA9IHZhbDsKKyAgICAgIGJyZWFrOworI2lmIDAKKyAgICBjYXNlIFJfREEgfCBSX1NFRzoKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOworICAgICAgKmJ1ZisrID0gMHgwMDsKKyAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7CisgICAgICAqYnVmKysgPSB2YWw7CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSAwOgorICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKworICAgIH0KK30KKworaW50CittZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKK3sKKyAgcHJpbnRmIChfKCJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iKSk7CisgIGFib3J0ICgpOworfQorCisvKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KKwordm9pZAorREVGVU4gKG1kX251bWJlcl90b19jaGFycywgKHB0ciwgdXNlLCBuYnl0ZXMpLAorICAgICAgIGNoYXIgKnB0ciBBTkQKKyAgICAgICB2YWx1ZVQgdXNlIEFORAorICAgICAgIGludCBuYnl0ZXMpCit7CisgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOworfQorbG9uZworbWRfcGNyZWxfZnJvbSAoZml4UCkKKyAgICAgZml4UyAqZml4UDsKK3sKKyAgYWJvcnQgKCk7Cit9CisKK3ZvaWQKK3RjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAocykKKyAgICAgc3RydWN0IHN5bWJvbCAqczsKK3sKK30KKwordm9pZAordGNfcmVsb2NfbWFuZ2xlIChmaXhfcHRyLCBpbnRyLCBiYXNlKQorICAgICBmaXhTICpmaXhfcHRyOworICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7CisgICAgIGJmZF92bWEgYmFzZTsKKworeworICBzeW1ib2xTICpzeW1ib2xfcHRyOworCisgIGlmIChmaXhfcHRyLT5meF9hZGRzeSAmJgorICAgICAgZml4X3B0ci0+Znhfc3Vic3kpIAorICAgIHsKKyAgICAgIHN5bWJvbFMgKmFkZCA9IGZpeF9wdHItPmZ4X2FkZHN5OworICAgICAgc3ltYm9sUyAqc3ViID0gZml4X3B0ci0+Znhfc3Vic3k7CisgICAgICBpZiAoU19HRVRfU0VHTUVOVChhZGQpICE9IFNfR0VUX1NFR01FTlQoc3ViKSkKKwl7CisJICBhc19iYWQoXygiQ2FuJ3Qgc3VidHJhY3Qgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgJXMgJXMiKSwKKwkJIFNfR0VUX05BTUUoYWRkKSwgU19HRVRfTkFNRShzdWIpKTsKKwl9CisgICAgICBlbHNlIHsKKwlpbnQgZGlmZiA9IFNfR0VUX1ZBTFVFKGFkZCkgLSBTX0dFVF9WQUxVRShzdWIpOworCWZpeF9wdHItPmZ4X2FkZHN5ID0gMDsKKwlmaXhfcHRyLT5meF9zdWJzeSA9IDA7CisJZml4X3B0ci0+Znhfb2Zmc2V0ICs9IGRpZmY7CisgICAgICB9CisgICAgfQorICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7CisKKyAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvaworICAgICB0byBvdXRwdXQgaXQgKi8KKyAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLiAqLworICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQorCXsKKwljYXNlIDI6CisJICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgaW50ci0+cl90eXBlID0gUl9JTU04OworCSAgYnJlYWs7CisJY2FzZSA0OgorCSAgaW50ci0+cl90eXBlID0gUl9JTU0zMjsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7CisgICAgfQorCisgIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOworICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKKworICBpZiAoc3ltYm9sX3B0cikKKyAgICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKKyAgZWxzZQorICAgIGludHItPnJfc3ltbmR4ID0gLTE7Cit9CisKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmggYi9nYXMvY29uZmlnL3RjLXo4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGI2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RjLXo4ay5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIFRoaXMgZmlsZSBpcyB0Yy16OGsuaAorICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIsIDkzLCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2RlZmluZSBUQ19aOEsKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQorCisjaWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3QgaW50ZXJuYWxfcmVsb2M7CisjZW5kaWYKKworI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorI2RlZmluZSBMT0NBTF9MQUJFTCh4KSAwCisjZW5kaWYKKworLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KKyNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgYWJvcnQoKTsKKworI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF96OGsKKyNkZWZpbmUgQ09GRl9NQUdJQyAweDgwMDAKKyNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKDEpCisjZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCisKKyNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHMsYSxiLGMpIHRjX3JlbG9jX21hbmdsZShhLGIsYykKK2V4dGVybiB2b2lkIHRjX3JlbG9jX21hbmdsZQorICBQQVJBTVMgKChzdHJ1Y3QgZml4ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfdm1hKSk7CisKKyNkZWZpbmUgRE9fTk9UX1NUUklQIDAKKyNkZWZpbmUgTElTVElOR19IRUFERVIgIlppbG9nIFo4MDAwIEdBUyAiCisjZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKKyNkZWZpbmUgUkVMT0NfMzIgMTIzNAorCisjZGVmaW5lIG1kX29wZXJhbmQoeCkKKworLyogZW5kIG9mIHRjLXo4ay5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLTM4NmJzZC5oIGIvZ2FzL2NvbmZpZy90ZS0zODZic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmZmOTkwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS0zODZic2QuaApAQCAtMCwwICsxLDMxIEBACisvKiB0ZS0zODZic2QuaCAtLSAzODZCU0QgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIAorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKyAgIAorICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRFXzM4NkJTRAkxCisKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjb21tZW50LWNvbHVtbjogMAorICogZmlsbC1jb2x1bW46IDEzMQorICogRW5kOgorICovCisKKy8qIGVuZCBvZiB0ZS1zdW4zLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtYXV4LmggYi9nYXMvY29uZmlnL3RlLWF1eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmZhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLWF1eC5oCkBAIC0wLDAgKzEsMTcgQEAKKyNkZWZpbmUgVEVfQVVYCisKKy8qIEZyb20gb2JqLWNvZmYuaDoKKyAgIFRoaXMgaW50ZXJuYWxfbGluZW5vIGNyYXAgaXMgdG8gc3RvcCBuYW1lc3BhY2UgcG9sbHV0aW9uIGZyb20gdGhlCisgICBiZmQgaW50ZXJuYWwgY29mZiBoZWFkZXJmaWxlLiAqLworI2RlZmluZSBpbnRlcm5hbF9saW5lbm8gYmZkX2ludGVybmFsX2xpbmVubworI2luY2x1ZGUgImNvZmYvYXV4LWNvZmYuaCIJLyogb3ZlcnJpZGUgYml0cyBpbiBjb2ZmL2ludGVybmFsLmggKi8KKyN1bmRlZiBpbnRlcm5hbF9saW5lbm8KKworI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCisjZGVmaW5lIEtFRVBfUkVMT0NfSU5GTworCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgorCisjaWZuZGVmIExPQ0FMX0xBQkVMU19GQgorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oIGIvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNkNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaApAQCAtMCwwICsxLDEzIEBACisvKiBUaGlzIGZpbGUgaXMgdGUtZGVsdGE4OC5oLiAgKi8KKworI2RlZmluZSBURV9ERUxUQTg4IDEKKworI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCTEKKworLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5CisgICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKKyAgIGxhYmVscy4gICovCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIJMQorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIJCTEKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZGVsdGEuaCBiL2dhcy9jb25maWcvdGUtZGVsdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZjNjJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1kZWx0YS5oCkBAIC0wLDAgKzEsMTQgQEAKKyNkZWZpbmUgVEVfREVMVEEKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKKworI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCTEKKyNkZWZpbmUgQ09GRl9DT01NT05fQURERU5ECTEKKworLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5CisgICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKKyAgIGxhYmVscy4gICovCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIJMQorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIJCTEKKworLyogZW5kIG9mIHRlLWRlbHRhLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZHB4Mi5oIGIvZ2FzL2NvbmZpZy90ZS1kcHgyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNDFjYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtZHB4Mi5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qIE1hY2hpbmUgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlIGRweDIgbWFjaGluZSAqLworCisvKiBUaGUgbWFnaWMgbnVtYmVyIGlzIG5vdCB0aGUgdXN1YWwgTUM2OE1BR0lDLiAqLworI2RlZmluZSBDT0ZGX01BR0lDICAgICAgIE1DNjhLQkNTTUFHSUMKKworI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQorCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ay11biIKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKKworLyogZW5kIG9mIHRlLWRweDIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1keW5peC5oIGIvZ2FzL2NvbmZpZy90ZS1keW5peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllN2IzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLWR5bml4LmgKQEAgLTAsMCArMSw3IEBACisvKiBUaGlzIGlzIGZvciBpMzg2LXNlcXVlbnQtYnNkLiAgVGhlIGFzc2VtYmxlciBwcm9iYWJseSBkb2VzIG5vdAorICAgYWN0dWFsbHkgd29yaywgYXMgdGhlIHN1cHBvcnQgaW4gQkZEIGlzIG5vdCBjb21wbGV0ZSBhcyBvZiB0aGlzCisgICB3cml0aW5nLiAgU2VlIGJmZC9pMzg2LWR5bml4LmMuICAqLworCisjZGVmaW5lIFRFX0RZTklYIDEKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oIGIvZ2FzL2NvbmZpZy90ZS1lcG9jLXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1ZjkxNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBURV9QRQorI2RlZmluZSBURV9FUE9DCisjZGVmaW5lIExFWF9BVCAxIC8qIGNhbiBoYXZlIEAncyBpbnNpZGUgbGFiZWxzICovCisKKy8qIFRoZSBQRSBmb3JtYXQgc3VwcG9ydHMgbG9uZyBzZWN0aW9uIG5hbWVzLiAgKi8KKyNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oIGIvZ2FzL2NvbmZpZy90ZS1nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlZGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtZ2VuZXJpYy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgdGUtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgorICogdGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KKyAqCisgKiBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgd2lsbCBldm9sdmUgaW50byBhIGZpbGUgc3VpdGFibGUgZm9yIGNvbmZpZywKKyAqIGNvbXBpbGUsIGFuZCBjb3B5aW5nIGFzIGFuIGFpZCBmb3IgdGVzdGluZyBhbmQgcG9ydGluZy4gIHhveG9yaWNoLgorICovCisKKy8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQorICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCisgICBsYWJlbHMuICAqLworI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KKyNpZmRlZiBPQkpfSEVBREVSCisjaW5jbHVkZSBPQkpfSEVBREVSCisjZWxzZQorI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKKyNlbmRpZgorCisvKiBlbmQgb2YgdGUtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWdvMzIuaCBiL2dhcy9jb25maWcvdGUtZ28zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmJkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLWdvMzIuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHRlLWdvMzIuaAorICovCisKKyNkZWZpbmUgVEVfR08zMgorCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtZ28zMiIKKworLyogR0FTIHNob3VsZCB0cmVhdCAnLmFsaWduIHZhbHVlJyBhcyBhbiBhbGlnbm1lbnQgb2YgMioqdmFsdWUgKi8KKyNkZWZpbmUgVVNFX0FMSUdOX1BUV08KKworLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWhwMzAwLmggYi9nYXMvY29uZmlnL3RlLWhwMzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5NGFiNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtaHAzMDAuaApAQCAtMCwwICsxLDI1IEBACisvKiB0ZS1ocDMwMC5oIC0tIGhwdXggOTAwMC8zMDAgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgorCisvKiBlbmQgb2YgdGUtaHAzMDAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1ocHBhLmggYi9nYXMvY29uZmlnL3RlLWhwcGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM0ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1ocHBhLmgKQEAgLTAsMCArMSwyNiBAQAorLyogTWFjaGluZSBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUgUEEgbWFjaGluZQorICAgQ29weXJpZ2h0IDE5ODcsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisgICAKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKwlIUCBQQS1SSVNDIGFuZCBPU0YvMSBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvcgorCVNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4KKyAqLworCisvKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oIGIvZ2FzL2NvbmZpZy90ZS1pMzg2YWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmMDk0NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgdGUtaTM4NmFpeC5oIGFuZCBpcyBidWlsdCBmcm9tIHBpZWNlcyBvZiBjb2RlIGZyb20gTWluaCBUcmFuLUxlCisgKiA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4gYnkgcmljaEBjeWdudXMuY29tLgorICovCisKKyNkZWZpbmUgVEVfSTM4NkFJWCAxCisKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCisKKy8qCisgKiBVbmRlZmluZSBSRVZFUlNFX1NPUlRfUkVMT0NTIHRvIGtlZXAgdGhlIHJlbG9jYXRpb24gZW50cmllcyBzb3J0ZWQKKyAqIGluIGFzY2VuZGluZyB2YWRkci4KKyAqLworI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKKworLyoKKyAqIERlZmluZSBLRUVQX1JFTE9DX0lORk8gc28gdGhhdCB0aGUgc3RyaXAgcmVsb2MgaW5mbyBmbGFnIEZfUkVMRkxHCisgKiBpcyBub3QgdXNlZCBpbiB0aGUgZmlsZWhkciBmb3IgQ09GRiBvdXRwdXQuCisgKi8KKyNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjb21tZW50LWNvbHVtbjogMAorICogZmlsbC1jb2x1bW46IDc5CisgKiBFbmQ6CisgKi8KKworLyogZW5kIG9mIHRlLWkzODZhaXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oIGIvZ2FzL2NvbmZpZy90ZS1pYzk2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLWljOTYwLmgKQEAgLTAsMCArMSwzOCBAQAorLyogVGhpcyBmaWxlIGlzIHRlLWljOTYwLmgKKyAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgdGUtaWM5NjAuaCBhbmQgaXMgaW50ZW5kZWQgdG8gZGVmaW5lIGljOTYwIGVudmlyb25tZW50CisgKiBzcGVjaWZpYyBkaWZmZXJlbmNlcy4KKyAqLworCisjZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAoKG5hbWVbMF0gPT0nTCcpIFwKKwkJCSAgIHx8IChuYW1lWzBdID09Jy4nIFwKKwkJCSAgICAgICAmJiAobmFtZVsxXT09J0MnIFwKKwkJCQkgICB8fCBuYW1lWzFdPT0nSScgXAorCQkJCSAgIHx8IG5hbWVbMV09PScuJykpKQorI2VuZGlmCisKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCisKKy8qIGVuZCBvZiB0ZS1pYzk2MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWxpbnV4LmggYi9nYXMvY29uZmlnL3RlLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzNWE3YQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtbGludXguaApAQCAtMCwwICsxLDQgQEAKKyNkZWZpbmUgVEVfTElOVVgKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbG5ld3MuaCBiL2dhcy9jb25maWcvdGUtbG5ld3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JjYzVhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1sbmV3cy5oCkBAIC0wLDAgKzEsNSBAQAorLyogdGUtbG5ld3MuaCAtLSBsaXR0bGUtZW5kaWFuIE5FV1MgZW11bGF0aW9uLiAgKi8KKworI2RlZmluZSBFQ09GRl9MSVRUTEVfRk9STUFUICJlY29mZi1iaWdsaXR0bGVtaXBzIgorCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1seW54LmggYi9nYXMvY29uZmlnL3RlLWx5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg1MTVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1seW54LmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIFRFX0xZTlgKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKKworI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tYWNoLmggYi9nYXMvY29uZmlnL3RlLW1hY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU0N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1tYWNoLmgKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFRFX01hY2gKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW1hY29zLmggYi9nYXMvY29uZmlnL3RlLW1hY29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0OGRjNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtbWFjb3MuaApAQCAtMCwwICsxLDExIEBACisvKiBUaGlzIGZpbGUgaXMgdGUtbWFjb3MuaC4gICovCisKKyNkZWZpbmUgVEVfUE9XRVJNQUMgMQorCisvKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKKyAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAorICAgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCisKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW11bHRpLmggYi9nYXMvY29uZmlnL3RlLW11bHRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlZGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtbXVsdGkuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHRlLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IKKyAqIHRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisgKgorICogSXQgaXMgbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIHdpbGwgZXZvbHZlIGludG8gYSBmaWxlIHN1aXRhYmxlIGZvciBjb25maWcsCisgKiBjb21waWxlLCBhbmQgY29weWluZyBhcyBhbiBhaWQgZm9yIHRlc3RpbmcgYW5kIHBvcnRpbmcuICB4b3hvcmljaC4KKyAqLworCisvKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKKyAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAorICAgbGFiZWxzLiAgKi8KKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCisjZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCisKKy8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCisjaWZkZWYgT0JKX0hFQURFUgorI2luY2x1ZGUgT0JKX0hFQURFUgorI2Vsc2UKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCisjZW5kaWYKKworLyogZW5kIG9mIHRlLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1uYnNkLmggYi9nYXMvY29uZmlnL3RlLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU0NjAwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1uYnNkLmgKQEAgLTAsMCArMSwyMyBAQAorLyogdGUtbmJzZC5oIC0tIE5ldEJTRCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisgICAKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEVfTmV0QlNECTEKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaCBiL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjllNWYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHRlLW5ldGJzZDUzMi5oCisgKgorICogV3JpdHRlbiBieSBJYW4gRGFsbCA8aWRhbGxAZWxlY2VuZy5hZGVsYWlkZS5lZHUuYXU+CisgKiAKKyAqIDE5LUp1bi05NAorICogCisgKi8KKworI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtbnMzMmstbmV0YnNkIgorCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgorCisvKiBNYXliZSB0aGVzZSBzaG91bGQgYmUgbW9yZSBsaWtlIFRDX05TMzI1MzIgYW5kIFRDX05TMzIzODEgaW4gY2FzZQorICogb2YgY29uZmxpY3RzLiBOUzMyMzgxIGlzIHVzZWQgaW4gb3Bjb2RlL25zMzJrLmggYW5kIHRoYXQgaXMgYWxzbworICogdXNlZCBieSBHREIuIE5lZWQgdG8gY2hlY2suCisgKi8KKyNkZWZpbmUgTlMzMjUzMgorI2RlZmluZSBOUzMyMzgxCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBjNTMybWFjaC5oIGIvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU3ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaApAQCAtMCwwICsxLDE5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHRlLXBjNTMyLmgKKyAqCisgKiBXcml0dGVuIGJ5IElhbiBEYWxsIDxpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdT4KKyAqIAorICogMjQtTWF5LTk0CisgKiAKKyAqLworCisjZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1wYzUzMi1tYWNoIgorCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgorCisvKiBNYXliZSB0aGVzZSBzaG91bGQgYmUgbW9yZSBsaWtlIFRDX05TMzI1MzIgYW5kIFRDX05TMzIzODEgaW4gY2FzZQorICogb2YgY29uZmxpY3RzLiBOUzMyMzgxIGlzIHVzZWQgaW4gb3Bjb2RlL25zMzJrLmggYW5kIHRoYXQgaXMgYWxzbworICogdXNlZCBieSBHREIuIE5lZWQgdG8gY2hlY2suCisgKi8KKyNkZWZpbmUgTlMzMjUzMgorI2RlZmluZSBOUzMyMzgxCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXBlLmggYi9nYXMvY29uZmlnL3RlLXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxZjBiMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtcGUuaApAQCAtMCwwICsxLDcgQEAKKyNkZWZpbmUgVEVfUEUKKyNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KKworLyogVGhlIFBFIGZvcm1hdCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMuICAqLworI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUworCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wcGNudy5oIGIvZ2FzL2NvbmZpZy90ZS1wcGNudy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGYwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLXBwY253LmgKQEAgLTAsMCArMSwzMSBAQAorLyogdGUtcHBjbncuaCAtLSBQb3dlciBQQyBydW5uaW5nIE5ldHdhcmUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorICAgCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQorICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCisgICBsYWJlbHMuICAqLworI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCisKKy8qIGdjYyB1c2VzIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHBwYy9uZXR3YXJlICovCisKKyN1bmRlZiBOT19TVFJJTkdfRVNDQVBFUwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wc29zLmggYi9nYXMvY29uZmlnL3RlLXBzb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ0MTUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1wc29zLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyB0ZS1wc29zLmggZm9yIGVtYmVkZGVkIHN5c3RlbXMgcnVubmluZyBwU09TLgorICogQ29udHJpYnV0ZWQgYnkgTWFydGluIEFuYW50aGFyYW1hbiAobWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlKQorICovCisKKyNkZWZpbmUgVEVfUFNPUworCisvKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKKyAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAorICAgbGFiZWxzLiAgKi8KKworI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworLyogVGhpcyBtYWtlcyBHQVMgbW9yZSB2ZXJzYXRpbGUgYW5kIGJsb2NrcyBzb21lIEVMRidpc21zIGluCisgICB0Yy1tNjhrLmguICovCisKKyNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDEKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKKworLyogZW5kIG9mIHRlLXBzb3MuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaCBiL2dhcy9jb25maWcvdGUtcmlzY2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3MjUzZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtcmlzY2l4LmgKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIFRFX1JJU0NJWAorCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisjaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaCBiL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxMDE4NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmgKQEAgLTAsMCArMSwyMSBAQAorLyogdGUtc3BhcmNhb3V0LmggLS0gZW1iZWRkZWQgc3BhcmMtYW91dCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorICAgCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEVfU1BBUkNBT1VUCTEKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN1bjMuaCBiL2dhcy9jb25maWcvdGUtc3VuMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NWQ0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLXN1bjMuaApAQCAtMCwwICsxLDQ4IEBACisvKiB0ZS1zdW4zLmggLS0gU3VuLTMgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSAjZGVmaW5lcyBzcGVjaWZpYworICAgdG8gU1VOIGNvbXB1dGVyIFNVTiAzIHNlcmllcyBjb21wdXRlcnMuICAoVGhlIG9ubHkga2luZAorICAgd2UgaGF2ZSBhcm91bmQgaGVyZSwgdW5mb3J0dW5hdGx5LikKKworICAgUnVtb3IgaGFzIGl0IHRoYXQgdGhpcyBmaWxlIHdpbGwgd29yayBvbiB0aGUgU3VuLTIgaWYgdGhlIGFzc2VtYmxlcgorICAgaXMgY2FsbGVkIHdpdGggLW02ODAxMCAgVGhpcyBpcyBub3QgdGVzdGVkLiAgKi8KKworCisjZGVmaW5lIFRFX1NVTjMJMQorCisjZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQorI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQorCisvKiBDb3VsZCBhbHNvIGJlIDoKKyAgICNkZWZpbmUgU19MT0NBTF9OQU1FKHMpCShTX0dFVF9OQU1FKHMpWzBdID09ICcuJyAmJgorICAgU19HRVRfTkFNRShzKVsxXSA9PSAnTCcgfHwKKyAgIFNfR0VUX05BTUUocylbMV0gPT0gJy4nKQorICAgKi8KKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGNvbW1lbnQtY29sdW1uOiAwCisgKiBmaWxsLWNvbHVtbjogMTMxCisgKiBFbmQ6CisgKi8KKworLyogZW5kIG9mIHRlLXN1bjMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zdnI0LmggYi9nYXMvY29uZmlnL3RlLXN2cjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjE3ZWUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy90ZS1zdnI0LmgKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIFRFX1NWUjQKKyNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKKworI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3lzdjMyLmggYi9nYXMvY29uZmlnL3RlLXN5c3YzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2U2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3RlLXN5c3YzMi5oCkBAIC0wLDAgKzEsNiBAQAorLyogUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIHRoZSBnY2MgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lcyAqLworI2RlZmluZSBTVFJJUF9VTkRFUlNDT1JFCisKKyNpbmNsdWRlICJvYmotZm9ybWF0LmgiCisKKy8qIGVuZCBvZiB0ZS1zeXN2MzIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92YXgtaW5zdC5oIGIvZ2FzL2NvbmZpZy92YXgtaW5zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDhmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlnL3ZheC1pbnN0LmgKQEAgLTAsMCArMSw3NyBAQAorLyogdmF4LWluc3QuaCAtIEdOVSAtIFBhcnQgb2YgdmF4LmMKKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogVGhpcyBpcyBwYXJ0IG9mIHZheC1pbnMtcGFyc2UuYyAmIGZyaWVuZHMuCisgKiBXZSB3YW50IHRvIHBhcnNlIGEgdmF4IGluc3RydWN0aW9uIHRleHQgaW50byBhIHRyZWUgZGVmaW5lZCBoZXJlLgorICovCisKKyNkZWZpbmUgVklUX01BWF9PUEVSQU5EUyAoNikJLyogbWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gb25lICAgICAgICovCisvKiBzaW5nbGUgdmF4IGluc3RydWN0aW9uICovCisKK3N0cnVjdCB2b3AJCQkvKiB2YXggaW5zdHJ1Y3Rpb24gb3BlcmFuZCAgICAgICAgICAgICAgICAgKi8KK3sKKyAgc2hvcnQgaW50IHZvcF9uZHg7CQkvKiAtMSwgb3IgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XQkgICAqLworICBzaG9ydCBpbnQgdm9wX3JlZzsJCS8qIC0xLCBvciByZWdpc3RlciBudW1iZXIuIGVnIEBJXiM9MHhGICAgICAqLworICAvKiBIZWxwcyBkaXN0aW5ndWlzaCAiYWJzIiBmcm9tICJhYnMoUEMpIi4gKi8KKyAgc2hvcnQgaW50IHZvcF9tb2RlOwkJLyogYWRkcmVzc2luZyBtb2RlIDQgYml0cy4gZWcgSV4jPTB4OQkgICAqLworICBjaGFyIHZvcF9zaG9ydDsJCS8qIG9wZXJhbmQgZGlzcGxhY2VtZW50IGxlbmd0aCBhcyB3cml0dGVuICAqLworICAvKiAnICc9bm9uZSwgImJpbHN3Ij1CXkleTF5TXldeLiAgICAgICAgICAgKi8KKyAgY2hhciB2b3BfYWNjZXNzOwkJLyogJ2InYnJhbmNoICcgJ25vLWluc3RydWN0aW9uICdhbXJ2dydub3JtICovCisgIGNoYXIgdm9wX3dpZHRoOwkJLyogT3BlcmFuZCB3aWR0aCwgb25lIG9mICJiZGZnaGxvcXciCSAgICovCisgIGNvbnN0IGNoYXIgKnZvcF93YXJuOwkJLyogd2FybmluZyBtZXNzYWdlIG9mIHRoaXMgb3BlcmFuZCwgaWYgYW55ICovCisgIGNvbnN0IGNoYXIgKnZvcF9lcnJvcjsJLyogc2F5IGlmIG9wZXJhbmQgaXMgaW5hcHByb3ByaWF0ZSAgICAgICAgICovCisgIGNoYXIgKnZvcF9leHByX2JlZ2luOwkJLyogVW5wYXJzZWQgZXhwcmVzc2lvbiwgMXN0IGNoYXIgLi4uCSAgICovCisgIGNoYXIgKnZvcF9leHByX2VuZDsJCS8qIC4uLiBsYXN0IGNoYXIuCQkJICAgKi8KKyAgdW5zaWduZWQgY2hhciB2b3BfbmJ5dGVzOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZGF0dW0JCSAgICovCit9OworCisKK3R5cGVkZWYgbG9uZyB2YXhfb3Bjb2RlVDsJLyogRm9yIGluaXRpYWxpc2luZyBhcnJheSBvZiBvcGNvZGVzCSAgICovCisvKiBTb21lIHN5bnRoZXRpYyBvcGNvZGVzID4gMTYgYml0cyEgICAgICAgKi8KKworI2RlZmluZSBWSVRfT1BDT0RFX1NZTlRIRVRJQyAweDgwMDAwMDAwCS8qIE5vdCByZWFsIGhhcmR3YXJlIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVklUX09QQ09ERV9TUEVDSUFMICAgMHg0MDAwMDAwMAkvKiBOb3Qgbm9ybWFsIGJyYW5jaCBvcHRpbWlzaW5nLiAgICovCisvKiBOZXZlciBzZXQgd2l0aG91dCAuLi5fU1lOVEhFVElDICovCisKKyNkZWZpbmUgVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCAnLScJLyogVGhlc2UgYXJlIGVuY29kZWQgaW50byAgICAgICAgICovCisjZGVmaW5lIFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QICAgJz8nCS8qIHZvcF93aWR0aCB3aGVuIHZvcF9hY2Nlc3M9PSdiJyAqLworI2RlZmluZSBWQVhfV0lEVEhfV09SRF9KVU1QICAgICAgICAgICchJwkvKiBhbmQgVklUX09QQ09ERV9TWU5USEVUSUMgc2V0LiAgKi8KKyNkZWZpbmUgVkFYX1dJRFRIX0JZVEVfSlVNUAkgICAgICc6JwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBWQVhfSk1QICgweDE3KQkJLyogVXNlZnVsIGZvciBicmFuY2ggb3B0aW1pc2luZy4gSnVtcCBpbnN0ciovCisjZGVmaW5lIFZBWF9QQ19SRUxBVElWRV9NT0RFICgweGVmKQkvKiBVc2UgaXQgYWZ0ZXIgVkFYX0pNUAkJICAgKi8KKyNkZWZpbmUgVkFYX0FCU09MVVRFX01PREUgKDB4OUYpLyogVXNlIGFzIEAjLi4uCQkJICAgKi8KKyNkZWZpbmUgVkFYX0JSQiAoMHgxMSkJCS8qIENhbm9uaWNhbCBicmFuY2guCQkJICAgKi8KKyNkZWZpbmUgVkFYX0JSVyAoMHgzMSkJCS8qIEFub3RoZXIgY2Fub25pY2FsIGJyYW5jaAkJICAgKi8KKyNkZWZpbmUgVkFYX1dJREVOX1dPUkQgKDB4MjApCS8qIEFkZCB0aGlzIHRvIGJ5dGUgYnJhbmNoIHRvIGdldCB3b3JkIGJyLiAqLworI2RlZmluZSBWQVhfV0lERU5fTE9ORyAoMHg2KQkvKiBBZGQgdGhpcyB0byBieXRlIGJyYW5jaCB0byBnZXQgbG9uZyBqbXAuKi8KKy8qIE5lZWRzIFZBWF9QQ19SRUxBVElWRV9NT0RFIGJ5dGUgYWZ0ZXIgaXQqLworCitzdHJ1Y3Qgdml0CQkJLyogdmF4IGluc3RydWN0aW9uIHRyZWUgICAgICAgICAgICAgICAgICAgICovCit7CisgIC8qIHZpdF9vcGNvZGUgaXMgY2hhcltdIGZvciBwb3J0YWJpbGl0eS4gICAqLworICBjaGFyIHZpdF9vcGNvZGVbc2l6ZW9mICh2YXhfb3Bjb2RlVCldOworICB1bnNpZ25lZCBjaGFyIHZpdF9vcGNvZGVfbmJ5dGVzOwkvKiBIb3cgbG9uZyBpcyBfb3Bjb2RlPyAoY2hhcnMpCSAgICovCisgIHVuc2lnbmVkIGNoYXIgdml0X29wZXJhbmRzOwkvKgkJCQkJICAgKi8KKyAgc3RydWN0IHZvcCB2aXRfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsJLyogb3BlcmFuZHMgICAgICAgICAgICAgKi8KKyAgY29uc3QgY2hhciAqdml0X2Vycm9yOwkvKiAiIiBvciBlcnJvciB0ZXh0ICovCit9OworCisvKiBlbmQgb2YgdmF4LWluc3QuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODhmYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZy92bXMtYS1jb25mLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIHZtcy1hbHBoYS1jb25mLmguICBHZW5lcmF0ZWQgbWFudWFsbHkgZnJvbSBjb25mLmluLAorICAgYW5kIHVzZWQgYnkgY29uZmlnLWdhcy1hbHBoYS5jb20gd2hlbiBjb25zdHJ1Y3RpbmcgY29uZmlnLmguICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI2lmZGVmIF9fR05VQ19fCisjdW5kZWYgQ19BTExPQ0EKKyNlbHNlCisjZGVmaW5lIENfQUxMT0NBCisjZW5kaWYKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjaWZkZWYgX19HTlVDX18KKyN1bmRlZiBpbmxpbmUKKyNlbHNlCisjZGVmaW5lIGlubGluZQorI2VuZGlmCisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisJU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICgtMSkKKworLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovCisjZGVmaW5lIEJGRF9BU1NFTUJMRVIKKworLyogU29tZSBhc3NlcnQvcHJlcHJvY2Vzc29yIGNvbWJpbmF0aW9ucyBhcmUgaW5jYXBhYmxlIG9mIGhhbmRsaW5nCisgICBjZXJ0YWluIGtpbmRzIG9mIGNvbnN0cnVjdHMgaW4gdGhlIGFyZ3VtZW50IG9mIGFzc2VydC4gIEZvciBleGFtcGxlLAorICAgcXVvdGVkIHN0cmluZ3MgKGlmIHJlcXVvdGluZyBpc24ndCBkb25lIHJpZ2h0KSBvciBuZXdsaW5lcy4gICovCisjaWZkZWYgX19HTlVDX18KKyN1bmRlZiBCUk9LRU5fQVNTRVJUCisjZWxzZQorI2RlZmluZSBCUk9LRU5fQVNTRVJUCisjZW5kaWYKKworLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLAorICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLworI3VuZGVmIENST1NTX0NPTVBJTEUKKworLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLworI2RlZmluZSBUQVJHRVRfQUxJQVMJImFscGhhLXZtcyIKKyNkZWZpbmUgVEFSR0VUX0NQVQkiYWxwaGEiCisjZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwJImFscGhhLWRlYy12bXMiCisjZGVmaW5lIFRBUkdFVF9PUwkib3BlblZNUy9BbHBoYSIKKyNkZWZpbmUgVEFSR0VUX1ZFTkRPUgkiZGVjIgorCisvKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCisKKy8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorCisvKiBTb21ldGltZXMgZXJybm8uaCBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaXRzZWxmLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCisKKyN1bmRlZiBNQU5ZX1NFR01FTlRTCisKKy8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uICovCisjdW5kZWYgc3BhcmN2OQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfUkVNT1ZFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1VOTElOSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9TVERBUkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICisjZWxzZQorI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1VOSVNURF9ICS8qIGNvbmZpZy1nYXMuY29tIHdpbGwgbWFrZSBvbmUgaWYgbmVjZXNzYXJ5ICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFSQVJHU19ICisKKy8qIFZNUy1zcGVjaWZpYzogIHdlIG5lZWQgdG8gc2V0IHVwIEVYSVRfeHh4IGhlcmUgYmVjYXVzZSB0aGUgZGVmYXVsdAorICAgdmFsdWVzIGluIGFzLmggYXJlIGluYXBwcm9wcmlhdGUgZm9yIFZNUywgYnV0IHdlIGFsc28gd2FudCB0byBwcmV2ZW50CisgICBhcy5oJ3MgaW5jbHVzaW9uIG9mIDxzdGRsaWIuaD4gZnJvbSB0cmlnZ2VyaW5nIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KKyAgIDxzdGRsaWIuaD4gZ3VhcmRzIGl0c2VsZiBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiwgc28gaW5jbHVkaW5nIGl0CisgICBoZXJlIHR1cm5zIGFzLmgncyBsYXRlciAjaW5jbHVkZSBpbnRvIGEgbm8tb3AuICAoV2UgY2FuJ3Qgc2ltcGx5IHVzZQorICAgI2lmbmRlZiBIQVZFX1NURExJQl9IIGhlcmUsIGJlY2F1c2UgdGhlIDxzdGRsaWIuaD4gaW4gc2V2ZXJhbCBvbGRlcgorICAgZ2NjLXZtcyBkaXN0cmlidXRpb25zIG5lZ2xlY3RzIHRvIGRlZmluZSB0aGVzZSB0d28gcmVxdWlyZWQgbWFjcm9zLikgICovCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWYgX19ERUNDCisjdW5kZWYgRVhJVF9TVUNDRVNTCisjdW5kZWYgRVhJVF9GQUlMVVJFCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAxCQkJLyogU1MkX05PUk1BTCwgU1RTJEtfU1VDQ0VTUyAqLworI2RlZmluZSBFWElUX0ZBSUxVUkUgMHgxMDAwMDAwMgkJLyogKFNUUyRLX0VSUk9SIHwgU1RTJE1fSU5ISUJfTVNHKSAqLworI2VuZGlmCisKKyNpbmNsdWRlIDx1bml4bGliLmg+CisjaWYgX19ERUNDCitleHRlcm4gaW50IHN0cmNhc2VjbXAgKCk7CitleHRlcm4gaW50IHN0cm5jYXNlY21wICgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3Ztcy1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyNWNmYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWcvdm1zLWNvbmYuaApAQCAtMCwwICsxLDE3OSBAQAorLyogdm1zLWNvbmYuaC4gIEdlbmVyYXRlZCBtYW51YWxseSBmcm9tIGNvbmYuaW4sCisgICBhbmQgdXNlZCBieSBjb25maWctZ2FzLmNvbSB3aGVuIGNvbnN0cnVjdGluZyBjb25maWcuaC4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjaWZkZWYgX19HTlVDX18KKyN1bmRlZiBDX0FMTE9DQQorI2Vsc2UKKyNkZWZpbmUgQ19BTExPQ0EKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI3VuZGVmIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgaW5saW5lCisjZW5kaWYKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gKC0xKQorCisvKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLworI3VuZGVmIFlZVEVYVF9QT0lOVEVSCisKKy8qIE5hbWUgb2YgcGFja2FnZS4gICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLworLyogRGVmaW5lIGluIGJ5IGNvbmZpZy1nYXMuY29tICovCisvKiAjdW5kZWYgVkVSU0lPTiAqLworCisvKiBTaG91bGQgZ2FzIHVzZSBoaWdoLWxldmVsIEJGRCBpbnRlcmZhY2VzPyAgKi8KKyN1bmRlZiBCRkRfQVNTRU1CTEVSCisKKy8qIFNvbWUgYXNzZXJ0L3ByZXByb2Nlc3NvciBjb21iaW5hdGlvbnMgYXJlIGluY2FwYWJsZSBvZiBoYW5kbGluZworICAgY2VydGFpbiBraW5kcyBvZiBjb25zdHJ1Y3RzIGluIHRoZSBhcmd1bWVudCBvZiBhc3NlcnQuICBGb3IgZXhhbXBsZSwKKyAgIHF1b3RlZCBzdHJpbmdzIChpZiByZXF1b3RpbmcgaXNuJ3QgZG9uZSByaWdodCkgb3IgbmV3bGluZXMuICAqLworI2lmZGVmIF9fR05VQ19fCisjdW5kZWYgQlJPS0VOX0FTU0VSVAorI2Vsc2UKKyNkZWZpbmUgQlJPS0VOX0FTU0VSVAorI2VuZGlmCisKKy8qIElmIHdlIGFyZW4ndCBkb2luZyBjcm9zcy1hc3NlbWJsaW5nLCBzb21lIG9wZXJhdGlvbnMgY2FuIGJlIG9wdGltaXplZCwKKyAgIHNpbmNlIGJ5dGUgb3JkZXJzIGFuZCB2YWx1ZSBzaXplcyBkb24ndCBuZWVkIHRvIGJlIGFkanVzdGVkLiAgKi8KKyN1bmRlZiBDUk9TU19DT01QSUxFCisKKy8qIFNvbWUgZ2FzIGNvZGUgd2FudHMgdG8ga25vdyB0aGVzZSBwYXJhbWV0ZXJzLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0FMSUFTCSJ2bXMiCisjZGVmaW5lIFRBUkdFVF9DUFUJInZheCIKKyNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTAkidmF4LWRlYy12bXMiCisjZGVmaW5lIFRBUkdFVF9PUwkidm1zIgorI2RlZmluZSBUQVJHRVRfVkVORE9SCSJkZWMiCisKKy8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIHN0cnN0ci4gICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKKworLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgbWFsbG9jIGFuZCByZWFsbG9jLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQworCisvKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBmcmVlLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKKworLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgc2Jyay4gICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCisKKy8qIFNvbWV0aW1lcyBlcnJuby5oIGRvZXNuJ3QgZGVjbGFyZSBlcnJubyBpdHNlbGYuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRVJSTk8KKworI3VuZGVmIE1BTllfU0VHTUVOVFMKKworLyogVGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGVmaW5lcyB0aGlzIGZvciBzb21lIHRhcmdldHMgYmFzZWQgb24gdGhlCisgICB0YXJnZXQgbmFtZSB1c2VkLiAgSXQgaXMgbm90IGFsd2F5cyBkZWZpbmVkLiAgKi8KKyN1bmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgorCisvKiBOZWVkZWQgb25seSBmb3Igc29tZSBjb25maWd1cmF0aW9ucyB0aGF0IGNhbiBwcm9kdWNlIG11bHRpcGxlIG91dHB1dAorICAgZm9ybWF0cy4gICovCisjdW5kZWYgREVGQVVMVF9FTVVMQVRJT04KKyN1bmRlZiBFTVVMQVRJT05TCisjdW5kZWYgVVNFX0VNVUxBVElPTlMKKyN1bmRlZiBPQkpfTUFZQkVfQU9VVAorI3VuZGVmIE9CSl9NQVlCRV9CT1VUCisjdW5kZWYgT0JKX01BWUJFX0NPRkYKKyN1bmRlZiBPQkpfTUFZQkVfRUNPRkYKKyN1bmRlZiBPQkpfTUFZQkVfRUxGCisjdW5kZWYgT0JKX01BWUJFX0dFTkVSSUMKKyN1bmRlZiBPQkpfTUFZQkVfSFAzMDAKKyN1bmRlZiBPQkpfTUFZQkVfSUVFRQorI3VuZGVmIE9CSl9NQVlCRV9TT00KKyN1bmRlZiBPQkpfTUFZQkVfVk1TCisKKy8qIFVzZWQgZm9yIHNvbWUgb2YgdGhlIENPRkYgY29uZmlndXJhdGlvbnMsIHdoZW4gdGhlIENPRkYgY29kZSBuZWVkcworICAgdG8gc2VsZWN0IHNvbWV0aGluZyBiYXNlZCBvbiB0aGUgQ1BVIHR5cGUgYmVmb3JlIGl0IGtub3dzIGl0Li4uICovCisjdW5kZWYgSTM4NkNPRkYKKyN1bmRlZiBNNjhLQ09GRgorI3VuZGVmIE04OEtDT0ZGCisKKy8qIFVzaW5nIGNnZW4gY29kZT8gICovCisjdW5kZWYgVVNJTkdfQ0dFTgorCisvKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbi4gICovCisjdW5kZWYgREVGQVVMVF9BUkNICisKKy8qIE5lZWRlZCBvbmx5IGZvciBQb3dlclBDIFNvbGFyaXMuICAqLworI3VuZGVmIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQKKworLyogTmVlZGVkIG9ubHkgZm9yIFNDTyA1LiAgKi8KKyN1bmRlZiBTQ09fRUxGCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVtb3ZlIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9SRU1PVkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KKy8qIHNicmsoKSBpcyBhdmFpbGFibGUsIGJ1dCB3ZSBkb24ndCB3YW50IGdhcyB0byB1c2UgaXQuICAqLworI3VuZGVmIEhBVkVfU0JSSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9VTkxJTksKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX0VSUk5PX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU1REQVJHX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSAorI2Vsc2UKKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisjZW5kaWYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSAkvKiBjb25maWctZ2FzLmNvbSB3aWxsIG1ha2Ugb25lIGlmIG5lY2Vzc2FyeSAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1ZBUkFSR1NfSAorCisvKiBWTVMtc3BlY2lmaWM6ICB3ZSBuZWVkIHRvIHNldCB1cCBFWElUX3h4eCBoZXJlIGJlY2F1c2UgdGhlIGRlZmF1bHQKKyAgIHZhbHVlcyBpbiBhcy5oIGFyZSBpbmFwcHJvcHJpYXRlIGZvciBWTVMsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcHJldmVudAorICAgYXMuaCdzIGluY2x1c2lvbiBvZiA8c3RkbGliLmg+IGZyb20gdHJpZ2dlcmluZyByZWRlZmluaXRpb24gd2FybmluZ3MuCisgICA8c3RkbGliLmg+IGd1YXJkcyBpdHNlbGYgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24sIHNvIGluY2x1ZGluZyBpdAorICAgaGVyZSB0dXJucyBhcy5oJ3MgbGF0ZXIgI2luY2x1ZGUgaW50byBhIG5vLW9wLiAgKFdlIGNhbid0IHNpbXBseSB1c2UKKyAgICNpZm5kZWYgSEFWRV9TVERMSUJfSCBoZXJlLCBiZWNhdXNlIHRoZSA8c3RkbGliLmg+IGluIHNldmVyYWwgb2xkZXIKKyAgIGdjYy12bXMgZGlzdHJpYnV0aW9ucyBuZWdsZWN0cyB0byBkZWZpbmUgdGhlc2UgdHdvIHJlcXVpcmVkIG1hY3Jvcy4pICAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyN1bmRlZiBFWElUX1NVQ0NFU1MKKyN1bmRlZiBFWElUX0ZBSUxVUkUKKyNlbmRpZgorI2RlZmluZSBFWElUX1NVQ0NFU1MgMQkJCS8qIFNTJF9OT1JNQUwsIFNUUyRLX1NVQ0NFU1MgKi8KKyNkZWZpbmUgRVhJVF9GQUlMVVJFIDB4MTAwMDAwMDIJCS8qIChTVFMkS19FUlJPUiB8IFNUUyRNX0lOSElCX01TRykgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWd1cmUgYi9nYXMvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4ZWVmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvY29uZmlndXJlCkBAIC0wLDAgKzEsNTc1MCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyICB1c2UgQkZEIGJhY2sgZW5kIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcyIKK2FjX2hlbHA9IiRhY19oZWxwCisgICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1hcy5oCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5MjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTM6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYzMTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NjY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzE5OiBjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiID4mNQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAorICAgZmkKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKKyAgICAgICYmIHRlc3QgIiQqIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgMT4mMjsgZXhpdCAxOyB9CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdGZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siIDE+JjI7IGV4aXQgMTsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAiJGFjX3QiInllcyIgMT4mNgoraWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc3NjogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisKK1BBQ0tBR0U9Z2FzCisKK1ZFUlNJT049Mi45LjQKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9CitmaQorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitFT0YKKworCisKK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBQ0xPQ0FMPWFjbG9jYWwKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODM1OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPQ09ORj1hdXRvY29uZgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg0ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT01BS0U9YXV0b21ha2UKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIE1BS0VJTkZPPW1ha2VpbmZvCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKK25vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisqKQorICBlbmFibGVfc2hhcmVkPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc2hhcmVkPXllcworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKK25vKSBlbmFibGVfc3RhdGljPW5vIDs7CisqKQorICBlbmFibGVfc3RhdGljPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTk3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKyA7OworICAgIGVzYWMKKyAgZmkKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA4MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKKworI2xpbmUgMTA5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwOTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEyMjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMjc6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKKworYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCithY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE1NTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKKyAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5OTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKKyAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAorICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgIC8qIHwgW0EtWmEtel06XFwqKQorICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMTc6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorZWxzZQorICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisgICAgICBlbHNlCisgICAgICAgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitlbHNlCisgIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRhY19jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJExEIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3Rlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjU2OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICBhY19jdl9wcm9nX2dudV9sZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2CisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjcyOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBhY19jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gL3Vzci91Y2IgL3Vzci9jY3MvYmluICRQQVRIIC9iaW47IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICBhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgorICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKKyAgICAgIGVsc2UKKyAgICAgICAgYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSIKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCitmaQorZmkKKworTk09IiRhY19jdl9wYXRoX05NIgorZWNobyAiJGFjX3QiIiROTSIgMT4mNgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMDc6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIHJtIC1mIGNvbmZ0ZXN0ZGF0YQoraWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKK3RoZW4KKyAgcm0gLWYgY29uZnRlc3RkYXRhCisgIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCitlbHNlCisgIGFjX2N2X3Byb2dfTE5fUz1sbgorZmkKK2ZpCitMTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgoraWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgorICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQorZWxzZQorICBhY190b29sX3ByZWZpeD0KK2ZpCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKKworIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KK2xpYnRvb2xfZmxhZ3M9Cit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgordGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgordGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgordGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgorCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAiJGhvc3QiIGluCisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lIDEzNDkgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtMzIiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICA7OworCisqLSotY3lnd2luKikKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0RMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKK2ZpCitmaQorRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIERMTFRPT0w9ImZhbHNlIgorZmkKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0FTPSIkYWNfY3ZfcHJvZ19BUyIKK2lmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKK2ZpCitmaQorQVM9IiRhY19jdl9wcm9nX0FTIgoraWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorICBBUz0iZmFsc2UiCitmaQorZmkKKworCisgIDs7CisKK2VzYWMKKworIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KK0NDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAorTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAorRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKKyR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKKyRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCit8fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9CisKKyMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90CisjIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgorZXhlYyA1Pj4uL2NvbmZpZy5sb2cKKworCit1c2VyX2JmZF9nYXM9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYmZkLWFzc2VtYmxlciBvciAtLWRpc2FibGUtYmZkLWFzc2VtYmxlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9iZmRfYXNzZW1ibGVyK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9iZmRfYXNzZW1ibGVyIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKKyAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKKyAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZ2l2ZW4gZm9yIGJmZC1hc3NlbWJsZXIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKK2ZpCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KKwkgICAgOzsKKyAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWMKK2ZpCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OworICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OworICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworZmkKKwordXNpbmdfY2dlbj1ubworCisjIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUKKworCisKKwordGVfZmlsZT1nZW5lcmljCisKKyMgTWFrZWZpbGUgdGFyZ2V0IGZvciBpbnN0YWxsaW5nIGdhcyBpbiAkKHRvb2xkaXIpL2Jpbi4KK2luc3RhbGxfdG9vbGRpcj1pbnN0YWxsLWV4ZWMtdG9vbGRpcgorCitjYW5vbl90YXJnZXRzPSIiCitpZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgorICBmb3IgdCBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYDsgZG8KKyAgICByZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0IDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgorICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKKyMgICAgZWxzZQorIyAgICAgICMgUGVybWl0ICJhbGwiLCBldGMuICBXZSBkb24ndCBzdXBwb3J0IGl0IHlldCB0aG91Z2guCisjICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHQiCisgICAgZmkKKyAgZG9uZQorICBfZ2FzX3VuaXFfbGlzdD0iJGNhbm9uX3RhcmdldHMiCitfZ2FzX3VuaXFfbmV3bGlzdD0iIgorZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbworICBjYXNlICRfZ2FzX3VuaXFfaSBpbgorICBfZ2FzX3VuaXFfZHVtbXkpIDs7CisgICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgorICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKKyAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKKyAgICAgZXNhYyA7OworICBlc2FjCitkb25lCitjYW5vbl90YXJnZXRzPSRfZ2FzX3VuaXFfbmV3bGlzdAorCitmaQorCitlbXVsYXRpb25zPSIiCisKK2ZvciB0aGlzX3RhcmdldCBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzIDsgZG8KKworICAgIGV2YWwgYGVjaG8gJHRoaXNfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvY3B1PVwxIHZlbmRvcj1cMiBvcz1cMy8nYAorCisgICAgIyBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzCisgICAgYXJjaD0KKyAgICBlbmRpYW49CisgICAgY2FzZSAke2NwdX0gaW4KKyAgICAgIGFscGhhKikJCWNwdV90eXBlPWFscGhhIDs7CisgICAgICBhcm1lYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7CisgICAgICBhcm0qKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIGFybWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIGFybXYqbCkJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7CisgICAgICBhcm12KmIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OworICAgICAgc3Ryb25nYXJtKikJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIHRodW1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7CisgICAgICBocHBhKikJCWNwdV90eXBlPWhwcGEgOzsKKyAgICAgIGlbNDU2XTg2KQkJY3B1X3R5cGU9aTM4NiA7OworICAgICAgbTY4MFswMTIzNDZdMCkJY3B1X3R5cGU9bTY4ayA7OworICAgICAgbTY4MDA4KQkJY3B1X3R5cGU9bTY4ayA7OworICAgICAgbTY4Mz8/KQkJY3B1X3R5cGU9bTY4ayA7OworICAgICAgbTUyMDApCQljcHVfdHlwZT1tNjhrIDs7CisgICAgICBtOCopCQljcHVfdHlwZT1tODhrIDs7CisgICAgICBtaXBzKmVsKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49bGl0dGxlIDs7CisgICAgICBtaXBzKikJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWJpZyA7OworICAgICAgcG93ZXJwY2xlKikJY3B1X3R5cGU9cHBjIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIHBvd2VycGMqKQkJY3B1X3R5cGU9cHBjIGVuZGlhbj1iaWcgOzsKKyAgICAgIHJzNjAwMCopCQljcHVfdHlwZT1wcGMgOzsKKyAgICAgIHNwYXJjbGl0ZSopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7CisgICAgICBzcGFyY2xldCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsZXQgOzsKKyAgICAgIHNwYXJjNjQqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD12OS02NCA7OworICAgICAgc3BhcmM4NngqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjODZ4ICA7OworICAgICAgc3BhcmMqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsgIyA/Pz8gU2VlIHRjLXNwYXJjLmMuCisgICAgICB2ODUwKikJCWNwdV90eXBlPXY4NTAgOzsKKyAgICAgICopCQljcHVfdHlwZT0ke2NwdX0gOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KKyAgICAgIHRhcmdldF9jcHVfdHlwZT0ke2NwdV90eXBlfQorICAgIGVsaWYgdGVzdCAke3RhcmdldF9jcHVfdHlwZX0gIT0gJHtjcHVfdHlwZX0gOyB0aGVuCisgICAgICBjb250aW51ZQorICAgIGZpCisKKyAgICBnZW5lcmljX3RhcmdldD0ke2NwdV90eXBlfS0kdmVuZG9yLSRvcworICAgIGRldj1ubworICAgIGJmZF9nYXM9bm8KKyAgICBlbT1nZW5lcmljCisKKyAgICAjIGFzc2lnbiBvYmplY3QgZm9ybWF0CisgICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSBpbgorICAgICAgYTI5ay0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICBhMjlrLWFtZC11ZGkpICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGEyOWstYW1kLWVibW9uKSAgICAgICBmbXQ9Y29mZiA7OworICAgICAgYTI5ay1ueXUtc3ltMSkgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICBhMjlrLSotdnh3b3JrcyopICAgICAgZm10PWNvZmYgOzsKKworICAgICAgYWxwaGEqLSotKnZtcyopCSAgICBmbXQ9ZXZheCA7OworICAgICAgYWxwaGEqLSotbmV0d2FyZSopICAgIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotb3BlbmJzZCopICAgIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotb3NmKikgICAgICAgIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotbGludXhlY29mZiopIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotbGludXgtZ251KikgIGZtdD1lbGYgZW09bGludXggOzsKKyAgICAgIGFscGhhKi0qLW5ldGJzZCopICAgICBmbXQ9ZWxmIGVtPW5ic2QgOzsKKworICAgICAgYXJjLSotZWxmKikgICAgICAgICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKworICAgICAgYXJtLSotYW91dCkJICAgICAgICAgICAgICAgIGZtdD1hb3V0IDs7CisgICAgICBhcm0tKi1jb2ZmIHwgdGh1bWItKi1jb2ZmKSAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGFybS0qLWVsZiB8IHRodW1iLSotZWxmKSAgICAgICAgICBmbXQ9ZWxmIDs7CisgICAgICBhcm0tKi1saW51eCphb3V0KikJICAgICAgICBmbXQ9YW91dCBlbT1saW51eCA7OworICAgICAgYXJtLSotbGludXgqIHwgYXJtdiotKi1saW51eC1nbnUpCWZtdD1lbGYgIGVtPWxpbnV4IDs7CisgICAgICBhcm0tKi1uZXRic2QqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OworICAgICAgYXJtLSotb2FiaSB8IHRodW1iLSotb2FiaSkgICAgICAgIGZtdD1lbGYgOzsKKyAgICAgIGFybS1lcG9jLXBlIHwgdGh1bWItZXBvYy1wZSkgICAgICBmbXQ9Y29mZiBlbT1lcG9jLXBlIDs7CisgICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKKyAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKKworICAgICAgZDEwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgZDMwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworCisKKyAgICAgIGZyMzAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKworICAgICAgaHBwYS0qLSplbGYqKSAgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OworICAgICAgaHBwYS0qLWxpdGVzKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OworICAgICAgaHBwYS0qLW9zZiopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLXJ0ZW1zKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OworICAgICAgaHBwYS0qLWhwdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLW1wZWl4KikgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLWJzZCopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLWhpdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworCisgICAgICBoODMwMC0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKKworICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKKyAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OworICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKKyAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKKyAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKKyAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKKyAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7CisgICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKKyAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OworICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCisJCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgaTM4Ni0qLWZyZWVic2RlbGYqKSAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIGkzODYtKi1mcmVlYnNkKikgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKKyAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgorCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCisJCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNDT19FTEYgMQorRU9GCisKKwkJCSAgICBmaQorCQkJICAgIDs7CisgICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OworICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKKwkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKKyAgICAgIGkzODYtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiA7OworICAgICAgaTM4Ni0qLWdudSopICAgICAgICAgIGZtdD1lbGYgOzsKKyAgICAgIGkzODYtKi1tYWNoKikKKwkJCSAgICBmbXQ9YW91dCBlbT1tYWNoIGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotbXNkb3MqKSAgICAgICAgZm10PWFvdXQgOzsKKyAgICAgIGkzODYtKi1tb3NzKikJICAgIGZtdD1lbGYgOzsKKyAgICAgIGkzODYtKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OworICAgICAgaTM4Ni0qLWN5Z3dpbiopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotbWluZ3czMiopICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKKyAgICAgIGkzODYtKi0qbnQqKSAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OworICAgICAgaTk2MC0qLWJvdXQpICAgICAgICAgIGZtdD1ib3V0IDs7CisgICAgICBpOTYwLSotY29mZikgICAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKKyAgICAgIGk5NjAtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OworICAgICAgaTk2MC0qLW5pbmR5KikgICAgICAgIGZtdD1ib3V0IDs7CisgICAgICBpOTYwLSotdnh3b3JrczQqKSAgICAgZm10PWJvdXQgOzsKKyAgICAgIGk5NjAtKi12eHdvcmtzNS4wKSAgICBmbXQ9Ym91dCA7OworICAgICAgaTk2MC0qLXZ4d29ya3M1LiopICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7CisgICAgICBpOTYwLSotdnh3b3JrcyopICAgICAgZm10PWJvdXQgOzsKKworICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworCisgICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCisJCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OworICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7CisgICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OworICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OworICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKKwkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKKyAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OworICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQorCQkJICAgIGZtdD1jb2ZmIDs7CisgICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7CisgICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKKyAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7CisgICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKKyAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7CisgICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OworICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKKyAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKKyAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OworCisgICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7CisgICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKKworICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7CisgICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKKworICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKKyAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7CisgICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7CisgICAgICBtaXBzLSotYnNkKikgICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfSA7OworICAgICAgbWlwcy0qLXVsdHJpeCopICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7CisgICAgICBtaXBzLSotb3NmKikgICAgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKKyAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKKyAgICAgIG1pcHMtKi1pcml4NiopCSAgICBmbXQ9ZWxmIDs7CisgICAgICBtaXBzLSotaXJpeDUqKSAgICAgICAgZm10PWVsZiA7OworICAgICAgbWlwcy0qLWlyaXgqKSAgICAgICAgIGZtdD1lY29mZiA7OworICAgICAgbWlwcy0qLWxuZXdzKikgICAgICAgIGZtdD1lY29mZiBlbT1sbmV3cyA7OworICAgICAgbWlwcy0qLXJpc2NvcyopICAgICAgIGZtdD1lY29mZiA7OworICAgICAgbWlwcy0qLXN5c3YqKSAgICAgICAgIGZtdD1lY29mZiA7OworICAgICAgbWlwcy0qLWVsZiogfCBtaXBzLSotcnRlbXMqIHwgbWlwcy0qLWxpbnV4LWdudSogfCBtaXBzLSotZ251KiB8IG1pcHMtKi1vcGVuYnNkKikKKwkJCSAgICBmbXQ9ZWxmIDs7CisgICAgICBtaXBzLSotdnh3b3JrcyopICAgICAgZm10PWVsZgorCQkJICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBNSVBTX1NUQUJTX0VMRiAxCitFT0YKKworCQkJICAgIDs7CisgICAgICBtbjEwMjAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIG1uMTAzMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgcHBjLSotcGUgfCBwcGMtKi1jeWd3aW4qIHwgcHBjLSotd2lubnQqKQorCQkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OworICAgICAgcHBjLSotYWl4KikgICAgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICBwcGMtKi1iZW9zKikgICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIHBwYy0qLSpic2QqIHwgcHBjLSotZWxmKiB8IHBwYy0qLWVhYmkqIHwgcHBjLSotc3lzdjQqKQorCQkJICAgIGZtdD1lbGYgOzsKKyAgICAgIHBwYy0qLWxpbnV4LWdudSopCSAgICBmbXQ9ZWxmCisJCQkgICAgY2FzZSAiJGVuZGlhbiIgaW4KKwkJCSAgICBiaWcpICA7OworCQkJICAgICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR05VL0xpbnV4IG11c3QgYmUgY29uZmlndXJlZCBiaWcgZW5kaWFuIiAxPiYyOyBleGl0IDE7IH0gOzsKKwkJCSAgICBlc2FjCisJCQkgICAgOzsKKyAgICAgIHBwYy0qLXNvbGFyaXMqKQkgICAgZm10PWVsZgorCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCisJCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQgMQorRU9GCisKKwkJCSAgICBmaQorCQkJICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KKwkJCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFNvbGFyaXMgbXVzdCBiZSBjb25maWd1cmVkIGxpdHRsZSBlbmRpYW4iIDE+JjI7IGV4aXQgMTsgfQorCQkJICAgIGZpCisJCQkgICAgOzsKKyAgICAgIHBwYy0qLXJ0ZW1zKikJICAgIGZtdD1lbGYgOzsKKyAgICAgIHBwYy0qLW1hY29zKiB8IHBwYy0qLW1wdyopCisJCQkgICAgZm10PWNvZmYgZW09bWFjb3MgOzsKKyAgICAgIHBwYy0qLW5ldHdhcmUqKSAgICAgICBmbXQ9ZWxmIGVtPXBwY253IDs7CisKKyAgICAgIHNoLSotZWxmKikJICAgIGZtdD1lbGYgOzsKKyAgICAgIHNoLSotY29mZiopICAgICAgICAgICBmbXQ9Y29mZiA7OworICAgICAgc2gtKi1ydGVtcyopCSAgICBmbXQ9Y29mZiA7OworCisgICAgICBuczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikgICAgZm10PWFvdXQgZW09cGM1MzJtYWNoIDs7CisgICAgICBuczMyay1wYzUzMi1uZXRic2QqIHwgbnMzMmstcGM1MzItbGl0ZXMqKSAgZm10PWFvdXQgZW09bmJzZDUzMiA7OworICAgICAgbnMzMmstcGM1MzItb3BlbmJzZCopIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKKworICAgICAgc3BhcmMtKi1ydGVtcyopICAgICAgIGZtdD1hb3V0IDs7CisgICAgICBzcGFyYy0qLXN1bm9zNCopICAgICAgZm10PWFvdXQgZW09c3VuMyA7OworICAgICAgc3BhcmMtKi1hb3V0IHwgc3BhcmMqLSotdnh3b3JrcyopCisJCQkgICAgZm10PWFvdXQgZW09c3BhcmNhb3V0IDs7CisgICAgICBzcGFyYy0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIHNwYXJjLSotbGludXgqYW91dCopICBmbXQ9YW91dCBlbT1saW51eCA7OworICAgICAgc3BhcmMtKi1saW51eC1nbnUqKSAgIGZtdD1lbGYgZW09bGludXggOzsKKyAgICAgIHNwYXJjLSotbHlueG9zKikgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7CisgICAgICBzcGFyYy1mdWppdHN1LW5vbmUpICAgZm10PWFvdXQgOzsKKyAgICAgIHNwYXJjLSotZWxmIHwgc3BhcmMtKi1zeXN2NCogfCBzcGFyYy0qLXNvbGFyaXMqKQorCQkJICAgIGZtdD1lbGYgOzsKKyAgICAgIHNwYXJjLSotbmV0YnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7CisgICAgICBzcGFyYy0qLW9wZW5ic2QqKSAgICAgZm10PWFvdXQgZW09bmJzZCA7OworCisgICAgICBzdHJvbmdhcm0tKi1jb2ZmKSAgICAgZm10PWNvZmYgOzsKKyAgICAgIHN0cm9uZ2FybS0qLWVsZikgICAgICBmbXQ9ZWxmIDs7CisKKyAgICAgIHRpYzMwLSotKmFvdXQqKQkgICAgZm10PWFvdXQgYmZkX2dhcz15ZXMgOzsKKyAgICAgIHRpYzMwLSotKmNvZmYqKSAgICAgICBmbXQ9Y29mZiBiZmRfZ2FzPXllcyA7OworICAgICAgdGljODAtKi0qKQkgICAgZm10PWNvZmYgOzsKKworICAgICAgdjg1MC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgdjg1MGUtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgdjg1MGVhLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKworICAgICAgdmF4LSotYnNkKiB8IHZheC0qLXVsdHJpeCopCisJCQkgICAgZm10PWFvdXQgOzsKKyAgICAgIHZheC0qLXZtcykgICAgICAgICAgICBmbXQ9dm1zIDs7CisKKworICAgICAgejhrLSotY29mZiB8IHo4ay0qLXNpbSkKKwkJCSAgICBmbXQ9Y29mZiA7OworCisgICAgICB3NjUtKi0qKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKKworICAgICAgKi0qLWFvdXQgfCAqLSotc2NvdXQpCisJCQkgICAgZm10PWFvdXQgOzsKKyAgICAgICotKi1uaW5keSopCisJCQkgICAgZm10PWJvdXQgOzsKKyAgICAgICotKi1ic2QqKQorCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKKyAgICAgICotKi1nZW5lcmljKSAgICAgICAgICBmbXQ9Z2VuZXJpYyA7OworICAgICAgKi0qLXhyYXkgfCAqLSotaG1zKSAgIGZtdD1jb2ZmIDs7CisgICAgICAqLSotc2ltKSAgICAgICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgICotKi1lbGYgfCAqLSotc3lzdjQqIHwgKi0qLXNvbGFyaXMqKQorCQkJICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogR0FTIHN1cHBvcnQgZm9yICR7Z2VuZXJpY190YXJnZXR9IGlzIGluY29tcGxldGUuIiAxPiYyCisJCQkgICAgZm10PWVsZiBkZXY9eWVzIDs7CisgICAgICAqLSotdnh3b3JrcykgICAgICAgICAgZm10PWFvdXQgOzsKKyAgICAgICotKi1uZXR3YXJlKSAgICAgICAgICBmbXQ9ZWxmIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCisgICAgICBlbmRpYW5fZGVmPQorICAgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgorCWVuZGlhbl9kZWY9MQorICAgICAgZWxpZiB0ZXN0IHgke2VuZGlhbn0gPSB4bGl0dGxlOyB0aGVuCisJZW5kaWFuX2RlZj0wCisgICAgICBmaQorICAgICAgaWYgdGVzdCB4JHtlbmRpYW5fZGVmfSAhPSB4OyB0aGVuCisJY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gJGVuZGlhbl9kZWYKK0VPRgorCisgICAgICBmaQorICAgIGZpCisKKyAgICBjYXNlICR7Y3B1X3R5cGV9LSR7Zm10fSBpbgorICAgICAgYWxwaGEqLSopCWJmZF9nYXM9eWVzIDs7CisgICAgICBhcm0tKikJYmZkX2dhcz15ZXMgOzsKKyAgICAjIG5vdCB5ZXQKKyAgICAjIGkzODYtYW91dCkJYmZkX2dhcz1wcmVmZXJyZWQgOzsKKyAgICAgIG1pcHMtKikJYmZkX2dhcz15ZXMgOzsKKyAgICAgIG5zMzJrLSopCWJmZF9nYXM9eWVzIDs7CisgICAgICBwcGMtKikJYmZkX2dhcz15ZXMgOzsKKyAgICAgIHNwYXJjLSopCWJmZF9nYXM9eWVzIDs7CisgICAgICBzdHJvbmdhcm0tKikJYmZkX2dhcz15ZXMgOzsKKyAgICAgICotZWxmKQliZmRfZ2FzPXllcyA7OworICAgICAgKi1lY29mZikJYmZkX2dhcz15ZXMgOzsKKyAgICAgICotc29tKQliZmRfZ2FzPXllcyA7OworICAgICAgKikJCTs7CisgICAgZXNhYworCisjIE90aGVyIHJhbmRvbSBzdHVmZi4KKworICAgICMgRG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PworICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KKyAgICAgIHZheCB8IGkzODYgfCB0aWMzMCkKKwk7OworCisgICAgICAqKQorCW5lZWRfb3Bjb2Rlcz15ZXMKKworCWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCisJeWVzKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7CisJKm9wY29kZXMqKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7CisJKikgc2hhcmVkX29wY29kZXM9ZmFsc2UgOzsKKwllc2FjCisJaWYgdGVzdCAiJHtzaGFyZWRfb3Bjb2Rlc30iID0gInRydWUiOyB0aGVuCisJICAjIEEgc2hhcmVkIGxpYm9wY29kZXMgbXVzdCBiZSBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuCisJICBuZWVkX2JmZD15ZXMKKwlmaQorCTs7CisgICAgZXNhYworCisgICAgIyBBbnkgb3RoZXIgc3BlY2lhbCBvYmplY3QgZmlsZXMgbmVlZGVkID8KKyAgICBjYXNlICR7Y3B1X3R5cGV9IGluCisgICAgICBmcjMwIHwgbTMycikKKwl1c2luZ19jZ2VuPXllcworCTs7CisKKyAgICAgIG02OGspCisJY2FzZSAke2V4dHJhX29iamVjdHN9IGluCisJKm02OGstcGFyc2UubyopIDs7CisJKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgbTY4ay1wYXJzZS5vIiA7OworCWVzYWMKKwk7OworCisgICAgICBtaXBzKQorCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtcGFyc2UubyIgCisJaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KKwkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtcGFyc2UubyIKKwlmaQorCisJZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1sZXgubyIgCisJaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KKwkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtbGV4Lm8iCisJZmkKKworCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0Ymwtb3BzLm8iIAorCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCisJICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLW9wcy5vIgorCWZpCisJOzsKKworICAgICAgc3BhcmMpCisJaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgorCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgREVGQVVMVF9BUkNIICIke2FyY2h9IgorRU9GCisKKwlmaQorCTs7CisgICAgICAqKQorCTs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KKwljYXNlICJ4JHtleHRyYV9vYmplY3RzfSIgaW4KKwkqY2dlbi5vKikgOzsKKwkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBjZ2VuLm8iIDs7CisJZXNhYworICAgIGZpCisKKyMgU2VlIGlmIHdlIHJlYWxseSBjYW4gc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZW11bGF0aW9uIGNvZGUuCisKKyAgICBpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCisgICAgICBwcmltYXJ5X2JmZF9nYXM9JGJmZF9nYXMKKyAgICAgIG9ial9mb3JtYXQ9JGZtdAorICAgICAgdGVfZmlsZT0kZW0KKworICAgICAgaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgorCSMgQ2FuJ3Qgc3VwcG9ydCBvdGhlciBjb25maWd1cmF0aW9ucyB0aGlzIHdheS4KKwlicmVhaworICAgICAgZmkKKyAgICBlbGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KKyAgICAgICMgQ2FuJ3Qgc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAgICBicmVhaworICAgIGZpCisKKyMgRnJvbSB0YXJnZXQgbmFtZSBhbmQgZm9ybWF0LCBwcm9kdWNlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KKworICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0tJHtmbXR9IGluCisgICAgICBtaXBzLSotaXJpeDUqLSopCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OworICAgICAgbWlwcy0qLWxpbnV4LWdudSotKikgY2FzZSAiJGVuZGlhbiIgaW4KKwkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7CisJCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYgbWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKKwkJCWVzYWMgOzsKKyAgICAgIG1pcHMtKi1sbmV3cyotZWNvZmYpIDs7CisgICAgICBtaXBzLSotKi1lY29mZikJY2FzZSAiJGVuZGlhbiIgaW4KKwkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OworCQkJKikJZW11bGF0aW9uPSJtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OworCQkJZXNhYyA7OworICAgICAgbWlwcy0qLSotZWxmKQljYXNlICIkZW5kaWFuIiBpbgorCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYiIDs7CisJCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYiIDs7CisgICAgICAjIFVuY29tbWVudGluZyB0aGUgbmV4dCBsaW5lIHdpbGwgdHVybiBvbiBzdXBwb3J0IGZvciBpMzg2IENPRkYKKyAgICAgICMgaW4gYW55IGkzODYgRUxGIGNvbmZpZ3VyYXRpb24uICBUaGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yaworICAgICAgIyBjb3JyZWN0bHkuCisgICAgICAjIGkzODYtKi0qLWVsZikJZW11bGF0aW9uPSJpMzg2Y29mZiBpMzg2ZWxmIiA7OworCQkJZXNhYyA7OworICAgIGVzYWMKKworICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zICRlbXVsYXRpb24iCisKK2RvbmUKKworIyBBc3NpZ24gZmxvYXRpbmcgcG9pbnQgdHlwZS4gIE1vc3QgcHJvY2Vzc29ycyB3aXRoIEZQIHN1cHBvcnQKKyMgSUVFRSBGUC4gIE9uIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBGUCBhdCBhbGwsIHVzdWFsbHkgSUVFRQorIyBpcyBlbXVsYXRlZC4KK2Nhc2UgJHt0YXJnZXRfY3B1fSBpbgorICB2YXggfCB0YWhvZSApCWF0b2Y9JHt0YXJnZXRfY3B1fSA7OworICAqKQkJYXRvZj1pZWVlIDs7Citlc2FjCisKK2Nhc2UgIiR7b2JqX2Zvcm1hdH0iIGluCisgICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBrbm93IHdoYXQgZm9ybWF0IHRvIHVzZSBmb3IgdGFyZ2V0ICR7dGFyZ2V0fSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKyMgVW5mb3J0dW5hdGVseSB0aGUgY3B1IGluIGNwdS1vcGMuaCBmaWxlIGlzbid0IGFsd2F5cyAkKFRBUkdFVF9DUFUpLgorY2dlbl9jcHVfcHJlZml4PSIiCitpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgorICBjYXNlICR7dGFyZ2V0X2NwdX0gaW4KKyAgICAqKSBjZ2VuX2NwdV9wcmVmaXg9JHt0YXJnZXRfY3B1fSA7OworICBlc2FjCisgIAorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVVNJTkdfQ0dFTiAxCitFT0YKKworZmkKKworCitpZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy90Yy0ke3RhcmdldF9jcHVfdHlwZX0uYzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCBDUFUgJHt0YXJnZXRfY3B1X3R5cGV9IiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2lmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL29iai0ke29ial9mb3JtYXR9LmM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBvYmplY3QgZmlsZSBmb3JtYXQgJHtvYmpfZm9ybWF0fSIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitjYXNlICR7dXNlcl9iZmRfZ2FzfS0ke3ByaW1hcnlfYmZkX2dhc30gaW4KKyAgeWVzLXllcyB8IG5vLW5vKQorICAgICMgV2UgZGlkbid0IG92ZXJyaWRlIHVzZXIncyBjaG9pY2UuCisgICAgOzsKKyAgbm8teWVzKQorICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogVXNlIG9mIEJGRCBpcyByZXF1aXJlZCBmb3IgJHt0YXJnZXR9OyBvdmVycmlkaW5nIGNvbmZpZyBvcHRpb25zLiIgMT4mMgorICAgIDs7CisgIG5vLXByZWZlcnJlZCkKKyAgICBwcmltYXJ5X2JmZF9nYXM9bm8KKyAgICA7OworICAqLXByZWZlcnJlZCkKKyAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCisgICAgOzsKKyAgeWVzLSopCisgICAgcHJpbWFyeV9iZmRfZ2FzPXllcworICAgIDs7CisgIC0qKQorICAgICMgVXNlciBzcGVjaWZpZWQgbm90aGluZy4KKyAgICA7OworZXNhYworCisjIFNvbWUgQ09GRiBjb25maWd1cmF0aW9ucyB3YW50IHRoZXNlIHJhbmRvbSBvdGhlciBmbGFncyBzZXQuCitjYXNlICR7b2JqX2Zvcm1hdH0gaW4KKyAgY29mZikKKyAgICBjYXNlICR7dGFyZ2V0X2NwdV90eXBlfSBpbgorICAgICAgaTM4NikgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEkzODZDT0ZGIDEKK0VPRgorIDs7CisgICAgICBtNjhrKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTTY4S0NPRkYgMQorRU9GCisgOzsKKyAgICAgIG04OGspIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBNODhLQ09GRiAxCitFT0YKKyA7OworICAgIGVzYWMKKyAgICA7OworZXNhYworCisjIEdldHRpbmcgdGhpcyBkb25lIHJpZ2h0IGlzIGdvaW5nIHRvIGJlIGEgYml0Y2guICBFYWNoIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkCisjIHdpdGggLS1lbmFibGUtdGFyZ2V0cz0uLi4gc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGVudmlyb25tZW50LCBmb3JtYXQsIGNwdSwgYW5kCisjIGJmZF9nYXMgc2V0dGluZy4KKyMKKyMgRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgdGhlIG5lY2Vzc2FyeSBvYmplY3QgZmlsZSBzdXBwb3J0IGNvZGUgbXVzdCBiZSBsaW5rZWQKKyMgaW4uICBUaGlzIG1pZ2h0IGJlIG9ubHkgb25lLCBpdCBtaWdodCBiZSB1cCB0byBmb3VyLiAgVGhlIG5lY2Vzc2FyeSBlbXVsYXRpb24KKyMgY29kZSBuZWVkcyB0byBiZSBwcm92aWRlZCwgdG9vLgorIworIyBBbmQgdGhlbiB0aGVyZSdzICItLWVuYWJsZS10YXJnZXRzPWFsbCIuLi4uCisjCisjIEZvciBub3csIGp1c3QgYWx3YXlzIGRvIGl0IGZvciBNSVBTIEVMRiBvciBFQ09GRiBjb25maWd1cmF0aW9ucy4gIFNpZ2guCisKK2Zvcm1hdHM9IiR7b2JqX2Zvcm1hdH0iCitlbWZpbGVzPSIiCitFTVVMQVRJT05TPSIiCitfZ2FzX3VuaXFfbGlzdD0iJGVtdWxhdGlvbnMiCitfZ2FzX3VuaXFfbmV3bGlzdD0iIgorZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbworICBjYXNlICRfZ2FzX3VuaXFfaSBpbgorICBfZ2FzX3VuaXFfZHVtbXkpIDs7CisgICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgorICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKKyAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKKyAgICAgZXNhYyA7OworICBlc2FjCitkb25lCitlbXVsYXRpb25zPSRfZ2FzX3VuaXFfbmV3bGlzdAorCitmb3IgZW0gaW4gLiAkZW11bGF0aW9ucyA7IGRvCisgIGNhc2UgJGVtIGluCisgICAgLikJY29udGludWUgOzsKKyAgICBtaXBzYmVsZiB8IG1pcHNsZWxmKQorCWZtdD1lbGYgICBmaWxlPW1pcHNlbGYgOzsKKyAgICBtaXBzYmVjb2ZmIHwgbWlwc2xlY29mZikKKwlmbXQ9ZWNvZmYgZmlsZT1taXBzZWNvZmYgOzsKKyAgICBpMzg2Y29mZikKKwlmbXQ9Y29mZiAgZmlsZT1pMzg2Y29mZiA7OworICAgIGkzODZlbGYpCisJZm10PWVsZiAgIGZpbGU9aTM4NmVsZiA7OworICBlc2FjCisgIGZvcm1hdHM9IiRmb3JtYXRzICRmbXQiCisgIGVtZmlsZXM9IiRlbWZpbGVzIGUtJGZpbGUubyIKKyAgRU1VTEFUSU9OUz0iJEVNVUxBVElPTlMgJiRlbSwiCitkb25lCitfZ2FzX3VuaXFfbGlzdD0iJGZvcm1hdHMiCitfZ2FzX3VuaXFfbmV3bGlzdD0iIgorZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbworICBjYXNlICRfZ2FzX3VuaXFfaSBpbgorICBfZ2FzX3VuaXFfZHVtbXkpIDs7CisgICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgorICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKKyAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKKyAgICAgZXNhYyA7OworICBlc2FjCitkb25lCitmb3JtYXRzPSRfZ2FzX3VuaXFfbmV3bGlzdAorCitfZ2FzX3VuaXFfbGlzdD0iJGVtZmlsZXMiCitfZ2FzX3VuaXFfbmV3bGlzdD0iIgorZm9yIF9nYXNfdW5pcV9pIGluIF9nYXNfdW5pcV9kdW1teSAkX2dhc191bmlxX2xpc3QgOyBkbworICBjYXNlICRfZ2FzX3VuaXFfaSBpbgorICBfZ2FzX3VuaXFfZHVtbXkpIDs7CisgICopIGNhc2UgIiAkX2dhc191bmlxX25ld2xpc3QgIiBpbgorICAgICAgICoiICRfZ2FzX3VuaXFfaSAiKikgOzsKKyAgICAgICAqKSBfZ2FzX3VuaXFfbmV3bGlzdD0iJF9nYXNfdW5pcV9uZXdsaXN0ICRfZ2FzX3VuaXFfaSIgOzsKKyAgICAgZXNhYyA7OworICBlc2FjCitkb25lCitlbWZpbGVzPSRfZ2FzX3VuaXFfbmV3bGlzdAorCitpZiB0ZXN0IGBzZXQgLiAkZm9ybWF0cyA7IHNoaWZ0IDsgZWNobyAkI2AgLWd0IDEgOyB0aGVuCisgIGZvciBmbXQgaW4gJGZvcm1hdHMgOyBkbworICAgIGNhc2UgJGZtdCBpbgorICAgICAgYW91dCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE9CSl9NQVlCRV9BT1VUIDEKK0VPRgorICAgOzsKKyAgICAgIGJvdXQpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBPQkpfTUFZQkVfQk9VVCAxCitFT0YKKyAgIDs7CisgICAgICBjb2ZmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgT0JKX01BWUJFX0NPRkYgMQorRU9GCisgICAgOzsKKyAgICAgIGVjb2ZmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgT0JKX01BWUJFX0VDT0ZGIDEKK0VPRgorICAgOzsKKyAgICAgIGVsZikJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE9CSl9NQVlCRV9FTEYgMQorRU9GCisgICAgIDs7CisgICAgICBnZW5lcmljKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgT0JKX01BWUJFX0dFTkVSSUMgMQorRU9GCisgOzsKKyAgICAgIGhwMzAwKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgT0JKX01BWUJFX0hQMzAwIDEKK0VPRgorICAgOzsKKyAgICAgIGllZWUpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBPQkpfTUFZQkVfSUVFRSAxCitFT0YKKyAgICA7OworICAgICAgc29tKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgT0JKX01BWUJFX1NPTSAxCitFT0YKKyAgICAgOzsKKyAgICAgIHZtcykJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE9CSl9NQVlCRV9WTVMgMQorRU9GCisgICAgIDs7CisgICAgZXNhYworICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG9iai0kZm10Lm8iCisgIGRvbmUKKyAgb2JqX2Zvcm1hdD1tdWx0aQorZmkKK2lmIHRlc3QgYHNldCAuICRlbWZpbGVzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMCA7IHRoZW4KKyAgdGVfZmlsZT1tdWx0aQorICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyAkZW1maWxlcyIKKyAgREVGQVVMVF9FTVVMQVRJT049YHNldCAuICRlbXVsYXRpb25zIDsgZWNobyAkMmAKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFVTRV9FTVVMQVRJT05TIDEKK0VPRgorCitmaQorCitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBFTVVMQVRJT05TICRFTVVMQVRJT05TCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgREVGQVVMVF9FTVVMQVRJT04gIiRERUZBVUxUX0VNVUxBVElPTiIKK0VPRgorCisKK2Nhc2UgJHtwcmltYXJ5X2JmZF9nYXN9LSR7dGFyZ2V0X2NwdV90eXBlfS0ke29ial9mb3JtYXR9IGluCisgIHllcy0qLWNvZmYpCW5lZWRfYmZkPXllcyA7OworICBuby0qLWNvZmYpCW5lZWRfYmZkPXllcworCQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTUFOWV9TRUdNRU5UUyAxCitFT0YKKyA7OworZXNhYworCityZWplY3RfZGV2X2NvbmZpZ3M9eWVzCisKK2Nhc2UgJHtyZWplY3RfZGV2X2NvbmZpZ3N9LSR7ZGV2fSBpbgorICB5ZXMteWVzKSAjIE9vcHMuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBHQVMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJHtnZW5lcmljX3RhcmdldH0gY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7Citlc2FjCisKKworCisKKworCisKK2Nhc2UgIiR7cHJpbWFyeV9iZmRfZ2FzfSIgaW4KKyAgeWVzKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQkZEX0FTU0VNQkxFUiAxCitFT0YKKworCW5lZWRfYmZkPXllcyA7OworZXNhYworCisjIGRvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KK2Nhc2UgIiR7bmVlZF9vcGNvZGVzfSIgaW4KK3llcykKKyAgT1BDT0RFU19MSUI9Li4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCisgIDs7Citlc2FjCisKK2Nhc2UgIiR7bmVlZF9iZmR9IiBpbgoreWVzKQorICBCRkRMSUI9Li4vYmZkL2xpYmJmZC5sYQorICBBTExfT0JKX0RFUFM9IiRBTExfT0JKX0RFUFMgLi4vYmZkL2JmZC5oIgorICA7OworZXNhYworCisKKworCisKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVEFSR0VUX0FMSUFTICIke3RhcmdldF9hbGlhc30iCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTCAiJHt0YXJnZXR9IgorRU9GCisKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFRBUkdFVF9DUFUgIiR7dGFyZ2V0X2NwdX0iCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVEFSR0VUX1ZFTkRPUiAiJHt0YXJnZXRfdmVuZG9yfSIKK0VPRgorCitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBUQVJHRVRfT1MgIiR7dGFyZ2V0X29zfSIKK0VPRgorCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMyMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM1MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MzY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDI0NDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0Nzg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDgzOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDkyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1MTE6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKworZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYworZG8KKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1NDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgoraWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK3Rlc3QgLW4gIiRZQUNDIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTc5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1OTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MDA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI2MTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI2MjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKK2ZvciBhY19wcm9nIGluIGZsZXggbGV4CitkbworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY2NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCisgIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitMRVg9IiRhY19jdl9wcm9nX0xFWCIKK2lmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwordGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKK2RvbmUKK3Rlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY5NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCisgIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKK2ZpCitmaQorTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCitpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRMRVhMSUIiCit0aGVuCisgIGNhc2UgIiRMRVgiIGluCisgIGZsZXgqKSBhY19saWI9ZmwgOzsKKyAgKikgYWNfbGliPWwgOzsKKyAgZXNhYworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjczMTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQorYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbCRhY19saWIgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjczOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHl5d3JhcCgpOworCitpbnQgbWFpbigpIHsKK3l5d3JhcCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTEVYTElCPSItbCRhY19saWIiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NzM6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF9yb290JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCisjIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCitlY2hvICclJQorJSUnIHwgJExFWAoraWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgorICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQorZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KKyAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQorZWxzZQorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9CitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2CitMRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzk0OiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCisjIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQorIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KK2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCitlY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKK2FjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSIkTElCUyAkTEVYTElCIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjgwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitgY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKK2ludCBtYWluKCkgeworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKK3JtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKK0VPRgorCitmaQorCisKK0FMTF9MSU5HVUFTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4Mzc6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4NTg6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4NjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg4OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTYyOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5NjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDM3OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDUxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA3NzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTEwOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxMTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxNDU6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTUwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTc4OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyNDM6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI3MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzI3OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMjg6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzM2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM4MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzODUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQxOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzQyNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDcyOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY0ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2NTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjg4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNjkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3NDU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM3NTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc3MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODA3OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM4MTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzg0MDogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODYwOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4Nzk6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM4ODQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg4OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5MDY6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzkxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozOTM0OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzk0MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5Njk6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzk3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDQzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MDQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwNzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwOTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQxNjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MjA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDI0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQyNzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQzNjY6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQzOTQ6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQzOTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NDQwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NDY3OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX01BSU5UQUlORVJfTU9ERT1ubworZmkKKworICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKKyAgCisKK2lmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9CisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKK2Vsc2UKKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KK2ZpCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICAKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDQ5MDogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDQ5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisjaWZuZGVmIF9fQ1lHV0lOX18KKyNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KKyNlbmRpZgorcmV0dXJuIF9fQ1lHV0lOX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUwNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2N5Z3dpbj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY3lnd2luPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2CitDWUdXSU49Cit0ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDUyMzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NTI4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gX19NSU5HVzMyX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUzNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X21pbmd3MzI9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X21pbmd3MzI9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2CitNSU5HVzMyPQordGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NTU0OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgorICBhY19jdl9leGVleHQ9LmV4ZQorZWxzZQorICBybSAtZiBjb25mdGVzdCoKKyAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X2V4ZWV4dD0KKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCisgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKKyAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KgorICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCitmaQorZmkKKworRVhFRVhUPSIiCit0ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgorYWNfZXhlZXh0PSRFWEVFWFQKKworCitmb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0ZGxpYi5oIG1lbW9yeS5oIHN0cmluZ3MuaCB1bmlzdGQuaCBzdGRhcmcuaCB2YXJhcmdzLmggZXJybm8uaCBzeXMvdHlwZXMuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1ODk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NTk0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTk5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisjIFB1dCB0aGlzIGhlcmUgc28gdGhhdCBhdXRvY29uZidzICJjcm9zcy1jb21waWxpbmciIG1lc3NhZ2UgZG9lc24ndCBjb25mdXNlCisjIHBlb3BsZSB3aG8gYXJlIG5vdCBjcm9zcy1jb21waWxpbmcgYnV0IGFyZSBjb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVycy4KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgY29tcGlsaW5nIGEgY3Jvc3MtYXNzZW1ibGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NjI5OiBjaGVja2luZyB3aGV0aGVyIGNvbXBpbGluZyBhIGNyb3NzLWFzc2VtYmxlciIgPiY1CitpZiB0ZXN0ICIke2hvc3R9IiA9ICIke3RhcmdldH0iOyB0aGVuCisgIGNyb3NzX2dhcz1ubworZWxzZQorICBjcm9zc19nYXM9eWVzCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDUk9TU19DT01QSUxFIDEKK0VPRgorCitmaQorZWNobyAiJGFjX3QiIiRjcm9zc19nYXMiIDE+JjYKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDY0NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ2NDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ2Nzc6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDY4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDc0MjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ3NDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NzcyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0Nzc3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4MDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDgyNzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ4MzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ4NzY6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDg4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4OTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworCisjIFZNUyBkb2Vzbid0IGhhdmUgdW5saW5rLgorZm9yIGFjX2Z1bmMgaW4gdW5saW5rIHJlbW92ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDkyMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDkyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBTb21lIHN5c3RlbXMgZG9uJ3QgaGF2ZSBzYnJrKCkuCitmb3IgYWNfZnVuYyBpbiBzYnJrCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0OTc3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0OTgyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAorIyBlbm91Z2gsIGJ1dCBvbiBzb21lIG9mIHRob3NlIHN5c3RlbXMsIHRoZSBhc3NlcnQgbWFjcm8gcmVsaWVzIG9uIHJlcXVvdGluZworIyB3b3JraW5nIHByb3Blcmx5IQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXNzZXJ0IG1hY3JvIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MDM0OiBjaGVja2luZyBmb3Igd29ya2luZyBhc3NlcnQgbWFjcm8iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9hc3NlcnRfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1MDM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oKSB7CisKKy8qIGNoZWNrIGZvciByZXF1b3RpbmcgcHJvYmxlbXMgKi8KK3N0YXRpYyBpbnQgYSwgYiwgYywgZDsKK3N0YXRpYyBjaGFyICpzOworYXNzZXJ0ICghc3RyY21wKHMsICJmb28gYmFyIGJheiBxdXV4IikpOworLyogY2hlY2sgZm9yIG5ld2xpbmUgaGFuZGxpbmcgKi8KK2Fzc2VydCAoYSA9PSBiCisgICAgICAgIHx8IGMgPT0gZCk7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfYXNzZXJ0X29rPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfYXNzZXJ0X29rPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorZWNobyAiJGFjX3QiIiRnYXNfY3ZfYXNzZXJ0X29rIiAxPiY2Cit0ZXN0ICRnYXNfY3ZfYXNzZXJ0X29rID0geWVzIHx8IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBCUk9LRU5fQVNTRVJUIDEKK0VPRgorCisKKworIyBPbiBzb21lIHN5c3RlbXMsIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG1heSBub3QgZGVjbGFyZSBtYWxsb2MsIHJlYWxsb2MsCisjIGFuZCBmcmVlLiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSBnYXMgbmVlZHMgdGhlc2UgZnVuY3Rpb25zIHRvIGhhdmUgYmVlbgorIyBkZWNsYXJlZCAtLSBzdWNoIGFzIHdoZW4gdGFraW5nIHRoZWlyIGFkZHJlc3Nlcy4KK2dhc190ZXN0X2hlYWRlcnM9IgorI2lmZGVmIEhBVkVfTUVNT1JZX0gKKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorIgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBzdHJzdHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUwOTY6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHN0cnN0ciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUxMDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorJGdhc190ZXN0X2hlYWRlcnMKK2ludCBtYWluKCkgeworCit0eXBlZGVmIGNoYXIgKigqZikoKTsKK2YgeDsKK3ggPSAoZikgc3Ryc3RyOworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTExMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2VjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciIgMT4mNgoraWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX3N0cnN0ciA9IHllczsgdGhlbgorIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCitFT0YKKworZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBtYWxsb2MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUxMzM6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIG1hbGxvYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUxMzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorJGdhc190ZXN0X2hlYWRlcnMKK2ludCBtYWluKCkgeworCit0eXBlZGVmIGNoYXIgKigqZikoKTsKK2YgeDsKK3ggPSAoZikgbWFsbG9jOworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYz1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2VjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYyIgMT4mNgoraWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX21hbGxvYyA9IHllczsgdGhlbgorIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAxCitFT0YKKworZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBmcmVlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MTcwOiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBmcmVlIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUxNzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorJGdhc190ZXN0X2hlYWRlcnMKK2ludCBtYWluKCkgeworCit0eXBlZGVmIHZvaWQgKCpmKSgpOworZiB4OworeCA9IChmKSBmcmVlOworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWU9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWU9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgoraWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KKyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUkVFIDEKK0VPRgorCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHNicmsiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUyMDc6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHNicmsiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9zYnJrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTIxMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCiskZ2FzX3Rlc3RfaGVhZGVycworaW50IG1haW4oKSB7CisKK3R5cGVkZWYgY2hhciAqKCpmKSgpOworZiB4OworeCA9IChmKSBzYnJrOworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTIyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2FzX2N2X2RlY2xfbmVlZGVkX3Nicms9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2FzX2N2X2RlY2xfbmVlZGVkX3Nicms9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfc2JyayIgMT4mNgoraWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsgPSB5ZXM7IHRoZW4KKyBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TQlJLIDEKK0VPRgorCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVudmlyb24iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUyNDQ6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVudmlyb24iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI0OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCiskZ2FzX3Rlc3RfaGVhZGVycworaW50IG1haW4oKSB7CisKK3R5cGVkZWYgY2hhciAqKmY7CitmIHg7Cit4ID0gKGYpIGVudmlyb247CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitlY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uIiAxPiY2CitpZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiA9IHllczsgdGhlbgorIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04gMQorRU9GCisKK2ZpCisKKworIyBEb2VzIGVycm5vLmggZGVjbGFyZSBlcnJubywgb3IgZG8gd2UgaGF2ZSB0byBhZGQgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbgorIyBmb3IgaXQ/CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVycm5vIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1Mjg0OiBjaGVja2luZyB3aGV0aGVyIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGZvciBlcnJubyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI4OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKK2ludCBtYWluKCkgeworCit0eXBlZGVmIGludCBmOworZiB4OworeCA9IChmKSBlcnJubzsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGdhc19jdl9kZWNsX25lZWRlZF9lcnJubz1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm89eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8iIDE+JjYKK2lmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9lcnJubyA9IHllczsgdGhlbgorIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PIDEKK0VPRgorCitmaQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgZG9jL01ha2VmaWxlIC5nZGJpbml0OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQEZGTEFHU0AlJEZGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBQQUNLQUdFQCUkUEFDS0FHRSVnCitzJUBWRVJTSU9OQCUkVkVSU0lPTiVnCitzJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCitzJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKK3MlQEFVVE9NQUtFQCUkQVVUT01BS0UlZworcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZworcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBDQ0AlJENDJWcKK3MlQExEQCUkTEQlZworcyVATk1AJSROTSVnCitzJUBMTl9TQCUkTE5fUyVnCitzJUBMSUJUT09MQCUkTElCVE9PTCVnCitzJUBETExUT09MQCUkRExMVE9PTCVnCitzJUBBU0AlJEFTJWcKK3MlQGNnZW5fY3B1X3ByZWZpeEAlJGNnZW5fY3B1X3ByZWZpeCVnCitzJUBleHRyYV9vYmplY3RzQCUkZXh0cmFfb2JqZWN0cyVnCitzJUB0YXJnZXRfY3B1X3R5cGVAJSR0YXJnZXRfY3B1X3R5cGUlZworcyVAb2JqX2Zvcm1hdEAlJG9ial9mb3JtYXQlZworcyVAdGVfZmlsZUAlJHRlX2ZpbGUlZworcyVAaW5zdGFsbF90b29sZGlyQCUkaW5zdGFsbF90b29sZGlyJWcKK3MlQGF0b2ZAJSRhdG9mJWcKK3MlQEJGRExJQkAlJEJGRExJQiVnCitzJUBPUENPREVTX0xJQkAlJE9QQ09ERVNfTElCJWcKK3MlQEFMTF9PQkpfREVQU0AlJEFMTF9PQkpfREVQUyVnCitzJUBZQUNDQCUkWUFDQyVnCitzJUBMRVhAJSRMRVglZworcyVATEVYTElCQCUkTEVYTElCJWcKK3MlQENQUEAlJENQUCVnCitzJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCitzJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgZG9jL01ha2VmaWxlIC5nZGJpbml0OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKwordGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQorIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KKyBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KKyB0ZV9maWxlPSR7dGVfZmlsZX0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgordGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKK3JtIC1mIHRhcmctY3B1LmMgdGFyZy1jcHUuaCBvYmotZm9ybWF0Lmggb2JqLWZvcm1hdC5jIHRhcmctZW52LmggYXRvZi10YXJnLmMgaXRibC1jcHUuaAorIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IHRhcmctY3B1LmgKKyBlY2hvICcjaW5jbHVkZSAib2JqLSciJHtvYmpfZm9ybWF0fSInLmgiJyA+IG9iai1mb3JtYXQuaAorIGVjaG8gJyNpbmNsdWRlICJ0ZS0nIiR7dGVfZmlsZX0iJy5oIicgPiB0YXJnLWVudi5oCisgZWNobyAnI2luY2x1ZGUgIml0YmwtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiBpdGJsLWNwdS5oCisgaWYgdGVzdCAieCRjZ2VuX2NwdV9wcmVmaXgiICE9IHggOyB0aGVuCisgICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiR7Y2dlbl9jcHVfcHJlZml4fSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmgKKyBmaQorCisgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZS5iYXQgYi9nYXMvY29uZmlndXJlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQyNjlmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2NvbmZpZ3VyZS5iYXQKQEAgLTAsMCArMSw1NyBAQAorQGVjaG8gb2ZmDQoraWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQorDQorZWNobyBDb25maWd1cmluZyBnYXMgZm9yIGdvMzINCit1cGRhdGUgY29uZmlnL3RjLWkzODYuYyB0YXJnLWNwdS5jDQordXBkYXRlIGNvbmZpZy90Yy1pMzg2LmggdGFyZy1jcHUuaA0KK3VwZGF0ZSBjb25maWcvdGUtZ28zMi5oIHRhcmctZW52LmgNCit1cGRhdGUgY29uZmlnL29iai1jb2ZmLmggb2JqLWZvcm1hdC5oDQordXBkYXRlIGNvbmZpZy9vYmotY29mZi5jIG9iai1mb3JtYXQuYw0KK3VwZGF0ZSBjb25maWcvYXRvZi1pZWVlLmMgYXRvZi10YXJnLmMNCitnb3RvIGNvbW1vbg0KKw0KKzpoODMwMA0KK2VjaG8gQ29uZmlndXJpbmcgZ2FzIGZvciBIOC8zMDANCitjb3B5IGNvbmZpZ1xoby1nbzMyLmggaG9zdC5oDQorY29weSBjb25maWdcdGMtaDgzMDAuYyB0YXJnLWNwdS5jDQorY29weSBjb25maWdcdGMtaDgzMDAuaCB0YXJnLWNwdS5oDQorY29weSBjb25maWdcdGUtZ2VuZXJpYy5oIHRhcmctZW52LmgNCitjb3B5IGNvbmZpZ1xvYmpjb2ZmYmZkLmggb2JqLWZvcm1hdC5oDQorY29weSBjb25maWdcb2JqY29mZmJmZC5jIG9iai1mb3JtYXQuYw0KK2NvcHkgY29uZmlnXGF0b2YtaWVlZS5jIGF0b2YtdGFyZy5jDQorDQorOmNvbW1vbg0KKw0KK2VjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZS4yDQorZWNobyBhbGwuZG9zIDogYXMubmV3IGdhc3AubmV3Pj4gTWFrZWZpbGUuMg0KKw0KK2lmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCisNCitlY2hvICJzL0BzcmNkaXJALy4vZwkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL0B0YXJnZXRfYWxpYXNAL2dvMzIvCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy9AcHJlZml4QC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvQENDQC9nY2MvZwkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL0BPUENPREVTX0xJQkAvLi5cL29wY29kZXNcL2xpYm9wY29kZXMuYS9nCSI+PiBjb25maWcuc2VkDQorZWNobyAicy9AQkZETElCQC8uLlwvYmZkXC9saWJiZmQuYS9nCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL0BBTExfT0JKX0RFUFNALy4uXC9iZmRcL2JmZC5oL2cJCQkiPj4gY29uZmlnLnNlZA0KKw0KK2VjaG8gIi9eYWxsWyAJXSo6LyBhXAkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJkdW1teToJCQkJCQkiPj4gY29uZmlnLnNlZA0KKw0KK2VjaG8gInMvXC91c3JbXiBdKi5oLy9nCQkJCQkiPj4gY29uZmlnLnNlZA0KKw0KK2VjaG8gIi9eY29uZmlnLmhbIAldKjovIGQJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL15NYWtlZmlsZS9ub3QtTWFrZWZpbGUvCQkJCSI+PiBjb25maWcuc2VkDQorDQorc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KK3NlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZS4yDQordXBkYXRlIE1ha2VmaWxlLjIgTWFrZWZpbGUNCitkZWwgTWFrZWZpbGUuMg0KK2RlbCBjb25maWcuc2VkDQorZGVsIGNvbmZpZzIuc2VkDQorDQorZWNobyAjaWZuZGVmIEdBU19WRVJTSU9OPiBjb25maWcubmV3DQorc2VkIC1uICIvXlZFUlNJT049L3AiIE1ha2VmaWxlLmluIHwgc2VkIC1lICJzL1ZFUlNJT049LyNkZWZpbmUgR0FTX1ZFUlNJT04gXCIvIiAtZSAicy8kL1wiLyI+PiBjb25maWcubmV3DQordHlwZSBjb25maWdcZ28zMi5jZmcgPj4gY29uZmlnLm5ldw0KK2VjaG8gI2VuZGlmPj4gY29uZmlnLm5ldw0KK3VwZGF0ZSBjb25maWcubmV3IGNvbmZpZy5oDQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZS5pbiBiL2dhcy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NDdiYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw3NjYgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sCitkbmwgQW5kIGJlIGNhcmVmdWwgd2hlbiBjaGFuZ2luZyBpdCEgIElmIHlvdSBtdXN0IGFkZCB0ZXN0cyB3aXRoIHNxdWFyZQorZG5sIGJyYWNrZXRzLCBiZSBzdXJlIGNoYW5nZXF1b3RlIGludm9jYXRpb25zIHN1cnJvdW5kIGl0LgorZG5sCitkbmwKK2RubCB2Mi41IG5lZWRlZCBmb3IgLS1iaW5kaXIgZXQgYWwKK0FDX1BSRVJFUSgyLjEzKQorQUNfSU5JVChhcy5oKQorCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FNX0lOSVRfQVVUT01BS0UoZ2FzLCAyLjkuNCkKKworQU1fUFJPR19MSUJUT09MCisKK3VzZXJfYmZkX2dhcz0KK0FDX0FSR19FTkFCTEUoYmZkLWFzc2VtYmxlciwKK1sgIC0tZW5hYmxlLWJmZC1hc3NlbWJsZXIgIHVzZSBCRkQgYmFjayBlbmQgZm9yIHdyaXRpbmcgb2JqZWN0IGZpbGVzXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgbmVlZF9iZmQ9eWVzIHVzZXJfYmZkX2dhcz15ZXMgOzsKKyAgbm8pICB1c2VyX2JmZF9nYXM9bm8gOzsKKyAgKikgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24pIDs7Citlc2FjXSlkbmwKK0FDX0FSR19FTkFCTEUodGFyZ2V0cywKK1sgICAgdGFyZ2V0cyAgICAgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyBiZXNpZGVzIHRoZSBwcmltYXJ5XSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKKwkgICAgOzsKKyAgbm8pCSAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikJICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWNdKWRubAorQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCitbICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OworICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OworICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OworZXNhY10pZG5sCisKK3VzaW5nX2NnZW49bm8KKworIyBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlCitBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKKwordGVfZmlsZT1nZW5lcmljCisKKyMgTWFrZWZpbGUgdGFyZ2V0IGZvciBpbnN0YWxsaW5nIGdhcyBpbiAkKHRvb2xkaXIpL2Jpbi4KK2luc3RhbGxfdG9vbGRpcj1pbnN0YWxsLWV4ZWMtdG9vbGRpcgorCitjYW5vbl90YXJnZXRzPSIiCitpZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgorICBmb3IgdCBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYDsgZG8KKyAgICByZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0IDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgorICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKKyMgICAgZWxzZQorIyAgICAgICMgUGVybWl0ICJhbGwiLCBldGMuICBXZSBkb24ndCBzdXBwb3J0IGl0IHlldCB0aG91Z2guCisjICAgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHQiCisgICAgZmkKKyAgZG9uZQorICBHQVNfVU5JUShjYW5vbl90YXJnZXRzKQorZmkKKworZW11bGF0aW9ucz0iIgorCitmb3IgdGhpc190YXJnZXQgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cyA7IGRvCisKK2NoYW5nZXF1b3RlKCwpZG5sCisgICAgZXZhbCBgZWNobyAkdGhpc190YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9jcHU9XDEgdmVuZG9yPVwyIG9zPVwzLydgCitjaGFuZ2VxdW90ZShbLF0pZG5sCisKKyAgICAjIGNoZWNrIGZvciBhcmNoaXRlY3R1cmUgdmFyaWFudHMKKyAgICBhcmNoPQorICAgIGVuZGlhbj0KKyAgICBjYXNlICR7Y3B1fSBpbgorICAgICAgYWxwaGEqKQkJY3B1X3R5cGU9YWxwaGEgOzsKKyAgICAgIGFybWViKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKKyAgICAgIGFybSopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OworICAgICAgYXJtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OworICAgICAgYXJtdipsKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIGFybXYqYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7CisgICAgICBzdHJvbmdhcm0qKQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OworICAgICAgdGh1bWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIGhwcGEqKQkJY3B1X3R5cGU9aHBwYSA7OworY2hhbmdlcXVvdGUoLClkbmwKKyAgICAgIGlbNDU2XTg2KQkJY3B1X3R5cGU9aTM4NiA7OworICAgICAgbTY4MFswMTIzNDZdMCkJY3B1X3R5cGU9bTY4ayA7OworY2hhbmdlcXVvdGUoWyxdKWRubAorICAgICAgbTY4MDA4KQkJY3B1X3R5cGU9bTY4ayA7OworICAgICAgbTY4Mz8/KQkJY3B1X3R5cGU9bTY4ayA7OworICAgICAgbTUyMDApCQljcHVfdHlwZT1tNjhrIDs7CisgICAgICBtOCopCQljcHVfdHlwZT1tODhrIDs7CisgICAgICBtaXBzKmVsKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49bGl0dGxlIDs7CisgICAgICBtaXBzKikJCWNwdV90eXBlPW1pcHMgZW5kaWFuPWJpZyA7OworICAgICAgcG93ZXJwY2xlKikJY3B1X3R5cGU9cHBjIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIHBvd2VycGMqKQkJY3B1X3R5cGU9cHBjIGVuZGlhbj1iaWcgOzsKKyAgICAgIHJzNjAwMCopCQljcHVfdHlwZT1wcGMgOzsKKyAgICAgIHNwYXJjbGl0ZSopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsaXRlIDs7CisgICAgICBzcGFyY2xldCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmNsZXQgOzsKKyAgICAgIHNwYXJjNjQqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD12OS02NCA7OworICAgICAgc3BhcmM4NngqKQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjODZ4ICA7OworICAgICAgc3BhcmMqKQkJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsgIyA/Pz8gU2VlIHRjLXNwYXJjLmMuCisgICAgICB2ODUwKikJCWNwdV90eXBlPXY4NTAgOzsKKyAgICAgICopCQljcHVfdHlwZT0ke2NwdX0gOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KKyAgICAgIHRhcmdldF9jcHVfdHlwZT0ke2NwdV90eXBlfQorICAgIGVsaWYgdGVzdCAke3RhcmdldF9jcHVfdHlwZX0gIT0gJHtjcHVfdHlwZX0gOyB0aGVuCisgICAgICBjb250aW51ZQorICAgIGZpCisKKyAgICBnZW5lcmljX3RhcmdldD0ke2NwdV90eXBlfS0kdmVuZG9yLSRvcworICAgIGRldj1ubworICAgIGJmZF9nYXM9bm8KKyAgICBlbT1nZW5lcmljCisKKyAgICAjIGFzc2lnbiBvYmplY3QgZm9ybWF0CisgICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSBpbgorICAgICAgYTI5ay0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICBhMjlrLWFtZC11ZGkpICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGEyOWstYW1kLWVibW9uKSAgICAgICBmbXQ9Y29mZiA7OworICAgICAgYTI5ay1ueXUtc3ltMSkgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICBhMjlrLSotdnh3b3JrcyopICAgICAgZm10PWNvZmYgOzsKKworICAgICAgYWxwaGEqLSotKnZtcyopCSAgICBmbXQ9ZXZheCA7OworICAgICAgYWxwaGEqLSotbmV0d2FyZSopICAgIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotb3BlbmJzZCopICAgIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotb3NmKikgICAgICAgIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotbGludXhlY29mZiopIGZtdD1lY29mZiA7OworICAgICAgYWxwaGEqLSotbGludXgtZ251KikgIGZtdD1lbGYgZW09bGludXggOzsKKyAgICAgIGFscGhhKi0qLW5ldGJzZCopICAgICBmbXQ9ZWxmIGVtPW5ic2QgOzsKKworICAgICAgYXJjLSotZWxmKikgICAgICAgICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKworICAgICAgYXJtLSotYW91dCkJICAgICAgICAgICAgICAgIGZtdD1hb3V0IDs7CisgICAgICBhcm0tKi1jb2ZmIHwgdGh1bWItKi1jb2ZmKSAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGFybS0qLWVsZiB8IHRodW1iLSotZWxmKSAgICAgICAgICBmbXQ9ZWxmIDs7CisgICAgICBhcm0tKi1saW51eCphb3V0KikJICAgICAgICBmbXQ9YW91dCBlbT1saW51eCA7OworICAgICAgYXJtLSotbGludXgqIHwgYXJtdiotKi1saW51eC1nbnUpCWZtdD1lbGYgIGVtPWxpbnV4IDs7CisgICAgICBhcm0tKi1uZXRic2QqKQkgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OworICAgICAgYXJtLSotb2FiaSB8IHRodW1iLSotb2FiaSkgICAgICAgIGZtdD1lbGYgOzsKKyAgICAgIGFybS1lcG9jLXBlIHwgdGh1bWItZXBvYy1wZSkgICAgICBmbXQ9Y29mZiBlbT1lcG9jLXBlIDs7CisgICAgICBhcm0tKi1wZSB8IHRodW1iLSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKKyAgICAgIGFybS0qLXJpc2NpeCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1yaXNjaXggOzsKKworICAgICAgZDEwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgZDMwdi0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworCisKKyAgICAgIGZyMzAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKworICAgICAgaHBwYS0qLSplbGYqKSAgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OworICAgICAgaHBwYS0qLWxpdGVzKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OworICAgICAgaHBwYS0qLW9zZiopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLXJ0ZW1zKikgICAgICAgIGZtdD1lbGYgZW09aHBwYSA7OworICAgICAgaHBwYS0qLWhwdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLW1wZWl4KikgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLWJzZCopICAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworICAgICAgaHBwYS0qLWhpdXgqKSAgICAgICAgIGZtdD1zb20gZW09aHBwYSA7OworCisgICAgICBoODMwMC0qLWNvZmYpICAgICAgICAgZm10PWNvZmYgOzsKKworICAgICAgaTM4Ni1pYm0tYWl4KikgICAgICAgIGZtdD1jb2ZmIGVtPWkzODZhaXggOzsKKyAgICAgIGkzODYtc2VxdWVudC1ic2QqKSAgICBmbXQ9YW91dCBlbT1keW5peCBiZmRfZ2FzPXllcyA7OworICAgICAgaTM4Ni0qLWJlb3NwZSopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotYmVvc2VsZiogfCBpMzg2LSotYmVvcyopIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIGkzODYtKi1ic2QqKSAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKKyAgICAgIGkzODYtKi1uZXRic2QwLjgpICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKKyAgICAgIGkzODYtKi1uZXRic2QqKSAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKKyAgICAgIGkzODYtKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzOzsKKyAgICAgIGkzODYtKi1saW51eCphb3V0KiB8IGkzODYtKi1saW51eG9sZGxkKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7CisgICAgICBpMzg2LSotbGludXgqY29mZiopICAgZm10PWNvZmYgZW09bGludXggOzsKKyAgICAgIGkzODYtKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OworICAgICAgaTM4Ni0qLXN5c3Y0KiB8IGkzODYtKi1zb2xhcmlzKiB8IGkzODYtKi1lbGYpCisJCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgaTM4Ni0qLWZyZWVic2RlbGYqKSAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIGkzODYtKi1mcmVlYnNkKikgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKKyAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgorCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCisJCQkJQUNfREVGSU5FKFNDT19FTEYsIDEsCisJCQkJICAgIFtEZWZpbmUgaWYgZGVmYXVsdGluZyB0byBFTEYgb24gU0NPIDUuXSkKKwkJCSAgICBmaQorCQkJICAgIDs7CisgICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OworICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKKwkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKKyAgICAgIGkzODYtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiA7OworICAgICAgaTM4Ni0qLWdudSopICAgICAgICAgIGZtdD1lbGYgOzsKKyAgICAgIGkzODYtKi1tYWNoKikKKwkJCSAgICBmbXQ9YW91dCBlbT1tYWNoIGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotbXNkb3MqKSAgICAgICAgZm10PWFvdXQgOzsKKyAgICAgIGkzODYtKi1tb3NzKikJICAgIGZtdD1lbGYgOzsKKyAgICAgIGkzODYtKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OworICAgICAgaTM4Ni0qLWN5Z3dpbiopICAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7CisgICAgICBpMzg2LSotbWluZ3czMiopICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKKyAgICAgIGkzODYtKi0qbnQqKSAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OworICAgICAgaTk2MC0qLWJvdXQpICAgICAgICAgIGZtdD1ib3V0IDs7CisgICAgICBpOTYwLSotY29mZikgICAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKKyAgICAgIGk5NjAtKi1ydGVtcyopICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OworICAgICAgaTk2MC0qLW5pbmR5KikgICAgICAgIGZtdD1ib3V0IDs7CisgICAgICBpOTYwLSotdnh3b3JrczQqKSAgICAgZm10PWJvdXQgOzsKKyAgICAgIGk5NjAtKi12eHdvcmtzNS4wKSAgICBmbXQ9Ym91dCA7OworICAgICAgaTk2MC0qLXZ4d29ya3M1LiopICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7CisgICAgICBpOTYwLSotdnh3b3JrcyopICAgICAgZm10PWJvdXQgOzsKKworICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworCisgICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCisJCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OworICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7CisgICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OworICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OworICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKKwkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKKyAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OworICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQorCQkJICAgIGZtdD1jb2ZmIDs7CisgICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7CisgICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKKyAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7CisgICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKKyAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7CisgICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OworICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKKyAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKKyAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OworCisgICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7CisgICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKKworICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7CisgICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKKworICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKKyAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKKyAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7CisgICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7CisgICAgICBtaXBzLSotYnNkKikgICAgICAgICAgQUNfTVNHX0VSUk9SKFVua25vd24gdmVuZG9yIGZvciBtaXBzLWJzZCBjb25maWd1cmF0aW9uLikgOzsKKyAgICAgIG1pcHMtKi11bHRyaXgqKSAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OworICAgICAgbWlwcy0qLW9zZiopICAgICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7CisgICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7CisgICAgICBtaXBzLSotZWNvZmYqKSAgICAgICAgZm10PWVjb2ZmIDs7CisgICAgICBtaXBzLSotaXJpeDYqKQkgICAgZm10PWVsZiA7OworICAgICAgbWlwcy0qLWlyaXg1KikgICAgICAgIGZtdD1lbGYgOzsKKyAgICAgIG1pcHMtKi1pcml4KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKKyAgICAgIG1pcHMtKi1sbmV3cyopICAgICAgICBmbXQ9ZWNvZmYgZW09bG5ld3MgOzsKKyAgICAgIG1pcHMtKi1yaXNjb3MqKSAgICAgICBmbXQ9ZWNvZmYgOzsKKyAgICAgIG1pcHMtKi1zeXN2KikgICAgICAgICBmbXQ9ZWNvZmYgOzsKKyAgICAgIG1pcHMtKi1lbGYqIHwgbWlwcy0qLXJ0ZW1zKiB8IG1pcHMtKi1saW51eC1nbnUqIHwgbWlwcy0qLWdudSogfCBtaXBzLSotb3BlbmJzZCopCisJCQkgICAgZm10PWVsZiA7OworICAgICAgbWlwcy0qLXZ4d29ya3MqKSAgICAgIGZtdD1lbGYKKwkJCSAgICBBQ19ERUZJTkUoTUlQU19TVEFCU19FTEYsIDEsCisJCQkJW1VzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFic10pCisJCQkgICAgOzsKKyAgICAgIG1uMTAyMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OworICAgICAgbW4xMDMwMC0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7CisgICAgICBwcGMtKi1wZSB8IHBwYy0qLWN5Z3dpbiogfCBwcGMtKi13aW5udCopCisJCSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7CisgICAgICBwcGMtKi1haXgqKSAgICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIHBwYy0qLWJlb3MqKSAgICAgICAgICBmbXQ9Y29mZiA7OworICAgICAgcHBjLSotKmJzZCogfCBwcGMtKi1lbGYqIHwgcHBjLSotZWFiaSogfCBwcGMtKi1zeXN2NCopCisJCQkgICAgZm10PWVsZiA7OworICAgICAgcHBjLSotbGludXgtZ251KikJICAgIGZtdD1lbGYKKwkJCSAgICBjYXNlICIkZW5kaWFuIiBpbgorCQkJICAgIGJpZykgIDs7CisJCQkgICAgKikgICAgQUNfTVNHX0VSUk9SKEdOVS9MaW51eCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmlnIGVuZGlhbikgOzsKKwkJCSAgICBlc2FjCisJCQkgICAgOzsKKyAgICAgIHBwYy0qLXNvbGFyaXMqKQkgICAgZm10PWVsZgorCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCisJCQkJQUNfREVGSU5FKFRBUkdFVF9TT0xBUklTX0NPTU1FTlQsIDEsCisJCQkJW0RlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuXSkKKwkJCSAgICBmaQorCQkJICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KKwkJCQlBQ19NU0dfRVJST1IoU29sYXJpcyBtdXN0IGJlIGNvbmZpZ3VyZWQgbGl0dGxlIGVuZGlhbikKKwkJCSAgICBmaQorCQkJICAgIDs7CisgICAgICBwcGMtKi1ydGVtcyopCSAgICBmbXQ9ZWxmIDs7CisgICAgICBwcGMtKi1tYWNvcyogfCBwcGMtKi1tcHcqKQorCQkJICAgIGZtdD1jb2ZmIGVtPW1hY29zIDs7CisgICAgICBwcGMtKi1uZXR3YXJlKikgICAgICAgZm10PWVsZiBlbT1wcGNudyA7OworCisgICAgICBzaC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7CisgICAgICBzaC0qLWNvZmYqKSAgICAgICAgICAgZm10PWNvZmYgOzsKKyAgICAgIHNoLSotcnRlbXMqKQkgICAgZm10PWNvZmYgOzsKKworICAgICAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopICAgIGZtdD1hb3V0IGVtPXBjNTMybWFjaCA7OworICAgICAgbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKKyAgICAgIG5zMzJrLXBjNTMyLW9wZW5ic2QqKSBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7CisKKyAgICAgIHNwYXJjLSotcnRlbXMqKSAgICAgICBmbXQ9YW91dCA7OworICAgICAgc3BhcmMtKi1zdW5vczQqKSAgICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKKyAgICAgIHNwYXJjLSotYW91dCB8IHNwYXJjKi0qLXZ4d29ya3MqKQorCQkJICAgIGZtdD1hb3V0IGVtPXNwYXJjYW91dCA7OworICAgICAgc3BhcmMtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICBzcGFyYy0qLWxpbnV4KmFvdXQqKSAgZm10PWFvdXQgZW09bGludXggOzsKKyAgICAgIHNwYXJjLSotbGludXgtZ251KikgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7CisgICAgICBzcGFyYy0qLWx5bnhvcyopICAgICAgZm10PWNvZmYgZW09bHlueCA7OworICAgICAgc3BhcmMtZnVqaXRzdS1ub25lKSAgIGZtdD1hb3V0IDs7CisgICAgICBzcGFyYy0qLWVsZiB8IHNwYXJjLSotc3lzdjQqIHwgc3BhcmMtKi1zb2xhcmlzKikKKwkJCSAgICBmbXQ9ZWxmIDs7CisgICAgICBzcGFyYy0qLW5ldGJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCA7OworICAgICAgc3BhcmMtKi1vcGVuYnNkKikgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKKworICAgICAgc3Ryb25nYXJtLSotY29mZikgICAgIGZtdD1jb2ZmIDs7CisgICAgICBzdHJvbmdhcm0tKi1lbGYpICAgICAgZm10PWVsZiA7OworCisgICAgICB0aWMzMC0qLSphb3V0KikJICAgIGZtdD1hb3V0IGJmZF9nYXM9eWVzIDs7CisgICAgICB0aWMzMC0qLSpjb2ZmKikgICAgICAgZm10PWNvZmYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIHRpYzgwLSotKikJICAgIGZtdD1jb2ZmIDs7CisKKyAgICAgIHY4NTAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIHY4NTBlLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKKyAgICAgIHY4NTBlYS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7CisKKyAgICAgIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQorCQkJICAgIGZtdD1hb3V0IDs7CisgICAgICB2YXgtKi12bXMpICAgICAgICAgICAgZm10PXZtcyA7OworCisKKyAgICAgIHo4ay0qLWNvZmYgfCB6OGstKi1zaW0pCisJCQkgICAgZm10PWNvZmYgOzsKKworICAgICAgdzY1LSotKikgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7CisKKyAgICAgICotKi1hb3V0IHwgKi0qLXNjb3V0KQorCQkJICAgIGZtdD1hb3V0IDs7CisgICAgICAqLSotbmluZHkqKQorCQkJICAgIGZtdD1ib3V0IDs7CisgICAgICAqLSotYnNkKikKKwkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7CisgICAgICAqLSotZ2VuZXJpYykgICAgICAgICAgZm10PWdlbmVyaWMgOzsKKyAgICAgICotKi14cmF5IHwgKi0qLWhtcykgICBmbXQ9Y29mZiA7OworICAgICAgKi0qLXNpbSkgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7CisgICAgICAqLSotZWxmIHwgKi0qLXN5c3Y0KiB8ICotKi1zb2xhcmlzKikKKwkJCSAgICBBQ19NU0dfV0FSTihHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4pCisJCQkgICAgZm10PWVsZiBkZXY9eWVzIDs7CisgICAgICAqLSotdnh3b3JrcykgICAgICAgICAgZm10PWFvdXQgOzsKKyAgICAgICotKi1uZXR3YXJlKSAgICAgICAgICBmbXQ9ZWxmIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCisgICAgICBlbmRpYW5fZGVmPQorICAgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgorCWVuZGlhbl9kZWY9MQorICAgICAgZWxpZiB0ZXN0IHgke2VuZGlhbn0gPSB4bGl0dGxlOyB0aGVuCisJZW5kaWFuX2RlZj0wCisgICAgICBmaQorICAgICAgaWYgdGVzdCB4JHtlbmRpYW5fZGVmfSAhPSB4OyB0aGVuCisJQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAkZW5kaWFuX2RlZiwKKwkJCSAgIFtEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLl0pCisgICAgICBmaQorICAgIGZpCisKKyAgICBjYXNlICR7Y3B1X3R5cGV9LSR7Zm10fSBpbgorICAgICAgYWxwaGEqLSopCWJmZF9nYXM9eWVzIDs7CisgICAgICBhcm0tKikJYmZkX2dhcz15ZXMgOzsKKyAgICAjIG5vdCB5ZXQKKyAgICAjIGkzODYtYW91dCkJYmZkX2dhcz1wcmVmZXJyZWQgOzsKKyAgICAgIG1pcHMtKikJYmZkX2dhcz15ZXMgOzsKKyAgICAgIG5zMzJrLSopCWJmZF9nYXM9eWVzIDs7CisgICAgICBwcGMtKikJYmZkX2dhcz15ZXMgOzsKKyAgICAgIHNwYXJjLSopCWJmZF9nYXM9eWVzIDs7CisgICAgICBzdHJvbmdhcm0tKikJYmZkX2dhcz15ZXMgOzsKKyAgICAgICotZWxmKQliZmRfZ2FzPXllcyA7OworICAgICAgKi1lY29mZikJYmZkX2dhcz15ZXMgOzsKKyAgICAgICotc29tKQliZmRfZ2FzPXllcyA7OworICAgICAgKikJCTs7CisgICAgZXNhYworCisjIE90aGVyIHJhbmRvbSBzdHVmZi4KKworICAgICMgRG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PworICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KKyAgICAgIHZheCB8IGkzODYgfCB0aWMzMCkKKwk7OworCisgICAgICAqKQorCW5lZWRfb3Bjb2Rlcz15ZXMKKworCWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCisJeWVzKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7CisJKm9wY29kZXMqKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7CisJKikgc2hhcmVkX29wY29kZXM9ZmFsc2UgOzsKKwllc2FjCisJaWYgdGVzdCAiJHtzaGFyZWRfb3Bjb2Rlc30iID0gInRydWUiOyB0aGVuCisJICAjIEEgc2hhcmVkIGxpYm9wY29kZXMgbXVzdCBiZSBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuCisJICBuZWVkX2JmZD15ZXMKKwlmaQorCTs7CisgICAgZXNhYworCisgICAgIyBBbnkgb3RoZXIgc3BlY2lhbCBvYmplY3QgZmlsZXMgbmVlZGVkID8KKyAgICBjYXNlICR7Y3B1X3R5cGV9IGluCisgICAgICBmcjMwIHwgbTMycikKKwl1c2luZ19jZ2VuPXllcworCTs7CisKKyAgICAgIG02OGspCisJY2FzZSAke2V4dHJhX29iamVjdHN9IGluCisJKm02OGstcGFyc2UubyopIDs7CisJKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgbTY4ay1wYXJzZS5vIiA7OworCWVzYWMKKwk7OworCisgICAgICBtaXBzKQorCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtcGFyc2UubyIgCisJaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KKwkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtcGFyc2UubyIKKwlmaQorCisJZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1sZXgubyIgCisJaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KKwkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtbGV4Lm8iCisJZmkKKworCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0Ymwtb3BzLm8iIAorCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCisJICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLW9wcy5vIgorCWZpCisJOzsKKworICAgICAgc3BhcmMpCisJaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgorCSAgQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfQVJDSCwgIiR7YXJjaH0iLCBbRGVmYXVsdCBhcmNoaXRlY3R1cmUuXSkKKwlmaQorCTs7CisgICAgICAqKQorCTs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KKwljYXNlICJ4JHtleHRyYV9vYmplY3RzfSIgaW4KKwkqY2dlbi5vKikgOzsKKwkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBjZ2VuLm8iIDs7CisJZXNhYworICAgIGZpCisKKyMgU2VlIGlmIHdlIHJlYWxseSBjYW4gc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZW11bGF0aW9uIGNvZGUuCisKKyAgICBpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCisgICAgICBwcmltYXJ5X2JmZF9nYXM9JGJmZF9nYXMKKyAgICAgIG9ial9mb3JtYXQ9JGZtdAorICAgICAgdGVfZmlsZT0kZW0KKworICAgICAgaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgorCSMgQ2FuJ3Qgc3VwcG9ydCBvdGhlciBjb25maWd1cmF0aW9ucyB0aGlzIHdheS4KKwlicmVhaworICAgICAgZmkKKyAgICBlbGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KKyAgICAgICMgQ2FuJ3Qgc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAgICBicmVhaworICAgIGZpCisKKyMgRnJvbSB0YXJnZXQgbmFtZSBhbmQgZm9ybWF0LCBwcm9kdWNlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KKworICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0tJHtmbXR9IGluCisgICAgICBtaXBzLSotaXJpeDUqLSopCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OworICAgICAgbWlwcy0qLWxpbnV4LWdudSotKikgY2FzZSAiJGVuZGlhbiIgaW4KKwkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7CisJCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYgbWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKKwkJCWVzYWMgOzsKKyAgICAgIG1pcHMtKi1sbmV3cyotZWNvZmYpIDs7CisgICAgICBtaXBzLSotKi1lY29mZikJY2FzZSAiJGVuZGlhbiIgaW4KKwkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OworCQkJKikJZW11bGF0aW9uPSJtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OworCQkJZXNhYyA7OworICAgICAgbWlwcy0qLSotZWxmKQljYXNlICIkZW5kaWFuIiBpbgorCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYiIDs7CisJCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYiIDs7CisgICAgICAjIFVuY29tbWVudGluZyB0aGUgbmV4dCBsaW5lIHdpbGwgdHVybiBvbiBzdXBwb3J0IGZvciBpMzg2IENPRkYKKyAgICAgICMgaW4gYW55IGkzODYgRUxGIGNvbmZpZ3VyYXRpb24uICBUaGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yaworICAgICAgIyBjb3JyZWN0bHkuCisgICAgICAjIGkzODYtKi0qLWVsZikJZW11bGF0aW9uPSJpMzg2Y29mZiBpMzg2ZWxmIiA7OworCQkJZXNhYyA7OworICAgIGVzYWMKKworICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zICRlbXVsYXRpb24iCisKK2RvbmUKKworIyBBc3NpZ24gZmxvYXRpbmcgcG9pbnQgdHlwZS4gIE1vc3QgcHJvY2Vzc29ycyB3aXRoIEZQIHN1cHBvcnQKKyMgSUVFRSBGUC4gIE9uIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBGUCBhdCBhbGwsIHVzdWFsbHkgSUVFRQorIyBpcyBlbXVsYXRlZC4KK2Nhc2UgJHt0YXJnZXRfY3B1fSBpbgorICB2YXggfCB0YWhvZSApCWF0b2Y9JHt0YXJnZXRfY3B1fSA7OworICAqKQkJYXRvZj1pZWVlIDs7Citlc2FjCisKK2Nhc2UgIiR7b2JqX2Zvcm1hdH0iIGluCisgICIiKSBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IGtub3cgd2hhdCBmb3JtYXQgdG8gdXNlIGZvciB0YXJnZXQgJHt0YXJnZXR9KSA7OworZXNhYworCisjIFVuZm9ydHVuYXRlbHkgdGhlIGNwdSBpbiBjcHUtb3BjLmggZmlsZSBpc24ndCBhbHdheXMgJChUQVJHRVRfQ1BVKS4KK2NnZW5fY3B1X3ByZWZpeD0iIgoraWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KKyAgY2FzZSAke3RhcmdldF9jcHV9IGluCisgICAgKikgY2dlbl9jcHVfcHJlZml4PSR7dGFyZ2V0X2NwdX0gOzsKKyAgZXNhYworICBBQ19TVUJTVChjZ2VuX2NwdV9wcmVmaXgpCisgIEFDX0RFRklORShVU0lOR19DR0VOLCAxLCBbVXNpbmcgY2dlbiBjb2RlP10pCitmaQorCitkbmwKK2RubCBNYWtlIHN1cmUgdGhlIGRlc2lyZWQgc3VwcG9ydCBmaWxlcyBleGlzdC4KK2RubAorCitpZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy90Yy0ke3RhcmdldF9jcHVfdHlwZX0uYzsgdGhlbgorICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IENQVSAke3RhcmdldF9jcHVfdHlwZX0pCitmaQorCitpZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy9vYmotJHtvYmpfZm9ybWF0fS5jOyB0aGVuCisgIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBvYmplY3QgZmlsZSBmb3JtYXQgJHtvYmpfZm9ybWF0fSkKK2ZpCisKK2Nhc2UgJHt1c2VyX2JmZF9nYXN9LSR7cHJpbWFyeV9iZmRfZ2FzfSBpbgorICB5ZXMteWVzIHwgbm8tbm8pCisgICAgIyBXZSBkaWRuJ3Qgb3ZlcnJpZGUgdXNlcidzIGNob2ljZS4KKyAgICA7OworICBuby15ZXMpCisgICAgQUNfTVNHX1dBUk4oVXNlIG9mIEJGRCBpcyByZXF1aXJlZCBmb3IgJHt0YXJnZXR9OyBvdmVycmlkaW5nIGNvbmZpZyBvcHRpb25zLikKKyAgICA7OworICBuby1wcmVmZXJyZWQpCisgICAgcHJpbWFyeV9iZmRfZ2FzPW5vCisgICAgOzsKKyAgKi1wcmVmZXJyZWQpCisgICAgcHJpbWFyeV9iZmRfZ2FzPXllcworICAgIDs7CisgIHllcy0qKQorICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKKyAgICA7OworICAtKikKKyAgICAjIFVzZXIgc3BlY2lmaWVkIG5vdGhpbmcuCisgICAgOzsKK2VzYWMKKworIyBTb21lIENPRkYgY29uZmlndXJhdGlvbnMgd2FudCB0aGVzZSByYW5kb20gb3RoZXIgZmxhZ3Mgc2V0LgorY2FzZSAke29ial9mb3JtYXR9IGluCisgIGNvZmYpCisgICAgY2FzZSAke3RhcmdldF9jcHVfdHlwZX0gaW4KKyAgICAgIGkzODYpIEFDX0RFRklORShJMzg2Q09GRiwgMSwgW1VzaW5nIGkzODYgQ09GRj9dKSA7OworICAgICAgbTY4aykgQUNfREVGSU5FKE02OEtDT0ZGLCAxLCBbVXNpbmcgbTY4ayBDT0ZGP10pIDs7CisgICAgICBtODhrKSBBQ19ERUZJTkUoTTg4S0NPRkYsIDEsIFtVc2luZyBtODhrIENPRkY/XSkgOzsKKyAgICBlc2FjCisgICAgOzsKK2VzYWMKKworIyBHZXR0aW5nIHRoaXMgZG9uZSByaWdodCBpcyBnb2luZyB0byBiZSBhIGJpdGNoLiAgRWFjaCBjb25maWd1cmF0aW9uIHNwZWNpZmllZAorIyB3aXRoIC0tZW5hYmxlLXRhcmdldHM9Li4uIHNob3VsZCBiZSBjaGVja2VkIGZvciBlbnZpcm9ubWVudCwgZm9ybWF0LCBjcHUsIGFuZAorIyBiZmRfZ2FzIHNldHRpbmcuCisjCisjIEZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIHRoZSBuZWNlc3Nhcnkgb2JqZWN0IGZpbGUgc3VwcG9ydCBjb2RlIG11c3QgYmUgbGlua2VkCisjIGluLiAgVGhpcyBtaWdodCBiZSBvbmx5IG9uZSwgaXQgbWlnaHQgYmUgdXAgdG8gZm91ci4gIFRoZSBuZWNlc3NhcnkgZW11bGF0aW9uCisjIGNvZGUgbmVlZHMgdG8gYmUgcHJvdmlkZWQsIHRvby4KKyMKKyMgQW5kIHRoZW4gdGhlcmUncyAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiLi4uLgorIworIyBGb3Igbm93LCBqdXN0IGFsd2F5cyBkbyBpdCBmb3IgTUlQUyBFTEYgb3IgRUNPRkYgY29uZmlndXJhdGlvbnMuICBTaWdoLgorCitmb3JtYXRzPSIke29ial9mb3JtYXR9IgorZW1maWxlcz0iIgorRU1VTEFUSU9OUz0iIgorR0FTX1VOSVEoZW11bGF0aW9ucykKK2ZvciBlbSBpbiAuICRlbXVsYXRpb25zIDsgZG8KKyAgY2FzZSAkZW0gaW4KKyAgICAuKQljb250aW51ZSA7OworICAgIG1pcHNiZWxmIHwgbWlwc2xlbGYpCisJZm10PWVsZiAgIGZpbGU9bWlwc2VsZiA7OworICAgIG1pcHNiZWNvZmYgfCBtaXBzbGVjb2ZmKQorCWZtdD1lY29mZiBmaWxlPW1pcHNlY29mZiA7OworICAgIGkzODZjb2ZmKQorCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7CisgICAgaTM4NmVsZikKKwlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7CisgIGVzYWMKKyAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKKyAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgorICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKK2RvbmUKK0dBU19VTklRKGZvcm1hdHMpCitHQVNfVU5JUShlbWZpbGVzKQoraWYgdGVzdCBgc2V0IC4gJGZvcm1hdHMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAxIDsgdGhlbgorICBmb3IgZm10IGluICRmb3JtYXRzIDsgZG8KKyAgICBjYXNlICRmbXQgaW4KKyAgICAgIGFvdXQpCUFDX0RFRklORShPQkpfTUFZQkVfQU9VVCwgMSwgICAgW2Eub3V0IHN1cHBvcnQ/XSkgICA7OworICAgICAgYm91dCkJQUNfREVGSU5FKE9CSl9NQVlCRV9CT1VULCAxLCAgICBbYi5vdXQgc3VwcG9ydD9dKSAgIDs7CisgICAgICBjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0NPRkYsIDEsICAgIFtDT0ZGIHN1cHBvcnQ/XSkgICAgOzsKKyAgICAgIGVjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0VDT0ZGLCAxLCAgIFtFQ09GRiBzdXBwb3J0P10pICAgOzsKKyAgICAgIGVsZikJQUNfREVGSU5FKE9CSl9NQVlCRV9FTEYsIDEsICAgICBbRUxGIHN1cHBvcnQ/XSkgICAgIDs7CisgICAgICBnZW5lcmljKQlBQ19ERUZJTkUoT0JKX01BWUJFX0dFTkVSSUMsIDEsIFtnZW5lcmljIHN1cHBvcnQ/XSkgOzsKKyAgICAgIGhwMzAwKQlBQ19ERUZJTkUoT0JKX01BWUJFX0hQMzAwLCAxLCAgIFtIUDMwMCBzdXBwb3J0P10pICAgOzsKKyAgICAgIGllZWUpCUFDX0RFRklORShPQkpfTUFZQkVfSUVFRSwgMSwgICAgW0lFRUUgc3VwcG9ydD9dKSAgICA7OworICAgICAgc29tKQlBQ19ERUZJTkUoT0JKX01BWUJFX1NPTSwgMSwgICAgIFtTT00gc3VwcG9ydD9dKSAgICAgOzsKKyAgICAgIHZtcykJQUNfREVGSU5FKE9CSl9NQVlCRV9WTVMsIDEsICAgICBbVk1TIHN1cHBvcnQ/XSkgICAgIDs7CisgICAgZXNhYworICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG9iai0kZm10Lm8iCisgIGRvbmUKKyAgb2JqX2Zvcm1hdD1tdWx0aQorZmkKK2lmIHRlc3QgYHNldCAuICRlbWZpbGVzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMCA7IHRoZW4KKyAgdGVfZmlsZT1tdWx0aQorICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyAkZW1maWxlcyIKKyAgREVGQVVMVF9FTVVMQVRJT049YHNldCAuICRlbXVsYXRpb25zIDsgZWNobyAkMmAKKyAgQUNfREVGSU5FKFVTRV9FTVVMQVRJT05TLCAxLCBbVXNlIGVtdWxhdGlvbiBzdXBwb3J0P10pCitmaQorQUNfU1VCU1QoZXh0cmFfb2JqZWN0cykKK0FDX0RFRklORV9VTlFVT1RFRChFTVVMQVRJT05TLCAkRU1VTEFUSU9OUywgW1N1cHBvcnRlZCBlbXVsYXRpb25zLl0pCitBQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9FTVVMQVRJT04sICIkREVGQVVMVF9FTVVMQVRJT04iLAorCQkgICBbRGVmYXVsdCBlbXVsYXRpb24uXSkKKworY2FzZSAke3ByaW1hcnlfYmZkX2dhc30tJHt0YXJnZXRfY3B1X3R5cGV9LSR7b2JqX2Zvcm1hdH0gaW4KKyAgeWVzLSotY29mZikJbmVlZF9iZmQ9eWVzIDs7CisgIG5vLSotY29mZikJbmVlZF9iZmQ9eWVzCisJCUFDX0RFRklORShNQU5ZX1NFR01FTlRTLCAxLCBbb2xkIENPRkYgc3VwcG9ydD9dKSA7OworZXNhYworCityZWplY3RfZGV2X2NvbmZpZ3M9eWVzCisKK2Nhc2UgJHtyZWplY3RfZGV2X2NvbmZpZ3N9LSR7ZGV2fSBpbgorICB5ZXMteWVzKSAjIE9vcHMuCisgICAgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAke2dlbmVyaWNfdGFyZ2V0fSBjb25maWd1cmF0aW9uLikKKyAgICA7OworZXNhYworCitBQ19TVUJTVCh0YXJnZXRfY3B1X3R5cGUpCitBQ19TVUJTVChvYmpfZm9ybWF0KQorQUNfU1VCU1QodGVfZmlsZSkKK0FDX1NVQlNUKGluc3RhbGxfdG9vbGRpcikKK0FDX1NVQlNUKGF0b2YpCitkbmwgQUNfU1VCU1QoZW11bGF0aW9uKQorCitjYXNlICIke3ByaW1hcnlfYmZkX2dhc30iIGluCisgIHllcykJQUNfREVGSU5FKEJGRF9BU1NFTUJMRVIsIDEsIFtVc2UgQkZEIGludGVyZmFjZT9dKQorCW5lZWRfYmZkPXllcyA7OworZXNhYworCisjIGRvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KK2Nhc2UgIiR7bmVlZF9vcGNvZGVzfSIgaW4KK3llcykKKyAgT1BDT0RFU19MSUI9Li4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCisgIDs7Citlc2FjCisKK2Nhc2UgIiR7bmVlZF9iZmR9IiBpbgoreWVzKQorICBCRkRMSUI9Li4vYmZkL2xpYmJmZC5sYQorICBBTExfT0JKX0RFUFM9IiRBTExfT0JKX0RFUFMgLi4vYmZkL2JmZC5oIgorICA7OworZXNhYworCitBQ19TVUJTVChCRkRMSUIpCitBQ19TVUJTVChPUENPREVTX0xJQikKKworQUNfU1VCU1QoQUxMX09CSl9ERVBTKQorCitBQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0FMSUFTLAkiJHt0YXJnZXRfYWxpYXN9IiwgW1RhcmdldCBhbGlhcy5dKQorQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9DQU5PTklDQUwsCSIke3RhcmdldH0iLCAgICAgICBbQ2Fub25pY2FsIHRhcmdldC5dKQorQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9DUFUsCQkiJHt0YXJnZXRfY3B1fSIsICAgW1RhcmdldCBDUFUuXSkKK0FDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfVkVORE9SLAkiJHt0YXJnZXRfdmVuZG9yfSIsIFtUYXJnZXQgdmVuZG9yLl0pCitBQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX09TLAkJIiR7dGFyZ2V0X29zfSIsICAgIFtUYXJnZXQgT1MuXSkKKworQUNfUFJPR19DQworCitBQ19QUk9HX1lBQ0MKK0FNX1BST0dfTEVYCisKK0FMTF9MSU5HVUFTPQorQ1lfR05VX0dFVFRFWFQKKworQU1fTUFJTlRBSU5FUl9NT0RFCitBQ19FWEVFWFQKKworQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdGRsaWIuaCBtZW1vcnkuaCBzdHJpbmdzLmggdW5pc3RkLmggc3RkYXJnLmggdmFyYXJncy5oIGVycm5vLmggc3lzL3R5cGVzLmgpCisKKyMgUHV0IHRoaXMgaGVyZSBzbyB0aGF0IGF1dG9jb25mJ3MgImNyb3NzLWNvbXBpbGluZyIgbWVzc2FnZSBkb2Vzbid0IGNvbmZ1c2UKKyMgcGVvcGxlIHdobyBhcmUgbm90IGNyb3NzLWNvbXBpbGluZyBidXQgYXJlIGNvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXJzLgorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgY29tcGlsaW5nIGEgY3Jvc3MtYXNzZW1ibGVyKQoraWYgdGVzdCAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IjsgdGhlbgorICBjcm9zc19nYXM9bm8KK2Vsc2UKKyAgY3Jvc3NfZ2FzPXllcworICBBQ19ERUZJTkUoQ1JPU1NfQ09NUElMRSwgMSwgW0NvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXI/XSkKK2ZpCitBQ19NU0dfUkVTVUxUKCRjcm9zc19nYXMpCisKK2RubCBhbnNpZGVjbC5oIHdpbGwgZGVhbCB3aXRoIGNvbnN0CitkbmwgQUNfQ09OU1QKK0FDX0ZVTkNfQUxMT0NBCitBQ19DX0lOTElORQorCisjIFZNUyBkb2Vzbid0IGhhdmUgdW5saW5rLgorQUNfQ0hFQ0tfRlVOQ1ModW5saW5rIHJlbW92ZSwgYnJlYWspCisKKyMgU29tZSBzeXN0ZW1zIGRvbid0IGhhdmUgc2JyaygpLgorQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKKworIyBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAorIyBlbm91Z2gsIGJ1dCBvbiBzb21lIG9mIHRob3NlIHN5c3RlbXMsIHRoZSBhc3NlcnQgbWFjcm8gcmVsaWVzIG9uIHJlcXVvdGluZworIyB3b3JraW5nIHByb3Blcmx5IQorR0FTX1dPUktJTkdfQVNTRVJUCisKKyMgT24gc29tZSBzeXN0ZW1zLCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBtYXkgbm90IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLAorIyBhbmQgZnJlZS4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgZ2FzIG5lZWRzIHRoZXNlIGZ1bmN0aW9ucyB0byBoYXZlIGJlZW4KKyMgZGVjbGFyZWQgLS0gc3VjaCBhcyB3aGVuIHRha2luZyB0aGVpciBhZGRyZXNzZXMuCitnYXNfdGVzdF9oZWFkZXJzPSIKKyNpZmRlZiBIQVZFX01FTU9SWV9ICisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyIKK0dBU19DSEVDS19ERUNMX05FRURFRChzdHJzdHIsIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCitHQVNfQ0hFQ0tfREVDTF9ORUVERUQobWFsbG9jLCBmLCBjaGFyICooKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQorR0FTX0NIRUNLX0RFQ0xfTkVFREVEKGZyZWUsIGYsIHZvaWQgKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKK0dBU19DSEVDS19ERUNMX05FRURFRChzYnJrLCBmLCBjaGFyICooKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQorR0FTX0NIRUNLX0RFQ0xfTkVFREVEKGVudmlyb24sIGYsIGNoYXIgKipmLCAkZ2FzX3Rlc3RfaGVhZGVycykKKworIyBEb2VzIGVycm5vLmggZGVjbGFyZSBlcnJubywgb3IgZG8gd2UgaGF2ZSB0byBhZGQgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbgorIyBmb3IgaXQ/CitHQVNfQ0hFQ0tfREVDTF9ORUVERUQoZXJybm8sIGYsIGludCBmLCBbCisjaWZkZWYgSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorXSkKKworZG5sIFRoaXMgbXVzdCBjb21lIGxhc3QuCisKK2RubCBXZSB1c2VkIHRvIG1ha2Ugc3ltbGlua3MgdG8gZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJ1dCBub3cKK2RubCB3ZSBqdXN0IHVzZSB0aGUgcmlnaHQgbmFtZSBmb3IgLmMgZmlsZXMsIGFuZCBjcmVhdGUgLmggZmlsZXMgaW4KK2RubCB0aGUgYnVpbGQgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGUgdGhlIHJpZ2h0IC5oIGZpbGUuICBNYWtlIHN1cmUKK2RubCB0aGUgb2xkIHN5bWxpbmtzIGRvbid0IGV4aXN0LCBzbyB0aGF0IGEgcmVjb25maWd1cmUgaW4gYW4gZXhpc3RpbmcKK2RubCBkaXJlY3RvcnkgYmVoYXZlcyByZWFzb25hYmx5LgorCitBQ19PVVRQVVQoTWFrZWZpbGUgZG9jL01ha2VmaWxlIC5nZGJpbml0OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKK1tybSAtZiB0YXJnLWNwdS5jIHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIG9iai1mb3JtYXQuYyB0YXJnLWVudi5oIGF0b2YtdGFyZy5jIGl0YmwtY3B1LmgKKyBlY2hvICcjaW5jbHVkZSAidGMtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiB0YXJnLWNwdS5oCisgZWNobyAnI2luY2x1ZGUgIm9iai0nIiR7b2JqX2Zvcm1hdH0iJy5oIicgPiBvYmotZm9ybWF0LmgKKyBlY2hvICcjaW5jbHVkZSAidGUtJyIke3RlX2ZpbGV9IicuaCInID4gdGFyZy1lbnYuaAorIGVjaG8gJyNpbmNsdWRlICJpdGJsLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gaXRibC1jcHUuaAorIGlmIHRlc3QgIngkY2dlbl9jcHVfcHJlZml4IiAhPSB4IDsgdGhlbgorICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIke2NnZW5fY3B1X3ByZWZpeH0iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oCisgZmkKKworIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0sCitbdGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQorIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KKyBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KKyB0ZV9maWxlPSR7dGVfZmlsZX1dKQpkaWZmIC0tZ2l0IGEvZ2FzL2RlYnVnLmMgYi9nYXMvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlmMjNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RlYnVnLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qIFRoaXMgZmlsZSBpcyBkZWJ1Zy5jCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogUm91dGluZXMgZm9yIGRlYnVnIHVzZSBvbmx5LiAgKi8KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorCitkbXBfZnJhZ3MgKCkKK3sKKyAgZnJjaGFpblMgKmNocDsKKyAgY2hhciAqcDsKKworICBmb3IgKGNocCA9IGZyY2hhaW5fcm9vdDsgY2hwOyBjaHAgPSBjaHAtPmZyY2hfbmV4dCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGNocC0+ZnJjaF9zZWcpCisJeworCWNhc2UgU0VHX0RBVEE6CisJICBwID0gIkRhdGEiOworCSAgYnJlYWs7CisJY2FzZSBTRUdfVEVYVDoKKwkgIHAgPSAiVGV4dCI7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcCA9ICI/Pz8iOworCSAgYnJlYWs7CisJfQorICAgICAgcHJpbnRmICgiXG5TRUdNRU5UICVzICVkXG4iLCBwLCBjaHAtPmZyY2hfc3Vic2VnKTsKKyAgICAgIGRtcF9mcmFnIChjaHAtPmZyY2hfcm9vdCwgIlx0Iik7CisgICAgfQorfQorCitkbXBfZnJhZyAoZnAsIGluZGVudCkKKyAgICAgc3RydWN0IGZyYWcgKmZwOworICAgICBjaGFyICppbmRlbnQ7Cit7CisgIGZvciAoOyBmcDsgZnAgPSBmcC0+ZnJfbmV4dCkKKyAgICB7CisgICAgICBwcmludGYgKCIlc0ZSQUdNRU5UIEAgMHgleFxuIiwgaW5kZW50LCBmcCk7CisgICAgICBzd2l0Y2ggKGZwLT5mcl90eXBlKQorCXsKKwljYXNlIHJzX2FsaWduOgorCSAgcHJpbnRmICgiJXNyc19hbGlnbiglZClcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7CisJICBicmVhazsKKwljYXNlIHJzX2ZpbGw6CisJICBwcmludGYgKCIlc3JzX2ZpbGwoJWQpXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOworCSAgcHJpbnRmICgiJXMiLCBpbmRlbnQpOworCSAgdmFyX2NoYXJzIChmcCwgZnAtPmZyX3ZhciArIGZwLT5mcl9maXgpOworCSAgcHJpbnRmICgiJXNcdCByZXBlYXRlZCAlZCB0aW1lcywiLAorCQkgIGluZGVudCwgZnAtPmZyX29mZnNldCk7CisJICBwcmludGYgKCIgZml4ZWQgbGVuZ3RoIGlmICMgY2hhcnMgPT0gMClcbiIpOworCSAgYnJlYWs7CisJY2FzZSByc19vcmc6CisJICBwcmludGYgKCIlc3JzX29yZyglZCtzeW0gQDB4JXgpXG4iLCBpbmRlbnQsCisJCSAgZnAtPmZyX29mZnNldCwgZnAtPmZyX3N5bWJvbCk7CisJICBwcmludGYgKCIlc2ZpbGwgd2l0aCAiLCBpbmRlbnQpOworCSAgdmFyX2NoYXJzIChmcCwgMSk7CisJICBwcmludGYgKCJcbiIpOworCSAgYnJlYWs7CisJY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKKwkgIHByaW50ZiAoIiVzbWFjaGluZV9kZXBcbiIsIGluZGVudCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcHJpbnRmICgiJXN1bmtub3duIHR5cGVcbiIsIGluZGVudCk7CisJICBicmVhazsKKwl9CisgICAgICBwcmludGYgKCIlc2FkZHI9JWQoMHgleClcbiIsIGluZGVudCwgZnAtPmZyX2FkZHJlc3MsIGZwLT5mcl9hZGRyZXNzKTsKKyAgICAgIHByaW50ZiAoIiVzZnJfZml4PSVkXG4iLCBpbmRlbnQsIGZwLT5mcl9maXgpOworICAgICAgcHJpbnRmICgiJXNmcl92YXI9JWRcbiIsIGluZGVudCwgZnAtPmZyX3Zhcik7CisgICAgICBwcmludGYgKCIlc2ZyX29mZnNldD0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKKyAgICAgIHByaW50ZiAoIiVzY2hhcnMgQCAweCV4XG4iLCBpbmRlbnQsIGZwLT5mcl9saXRlcmFsKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgfQorfQorCit2YXJfY2hhcnMgKGZwLCBuKQorICAgICBzdHJ1Y3QgZnJhZyAqZnA7CisgICAgIGludCBuOworeworICB1bnNpZ25lZCBjaGFyICpwOworCisgIGZvciAocCA9ICh1bnNpZ25lZCBjaGFyICopIGZwLT5mcl9saXRlcmFsOyBuOyBuLS0sIHArKykKKyAgICB7CisgICAgICBwcmludGYgKCIlMDJ4ICIsICpwKTsKKyAgICB9Cit9CisKKy8qIGVuZCBvZiBkZWJ1Zy5jICovCmRpZmYgLS1naXQgYS9nYXMvZGVwLWluLnNlZCBiL2dhcy9kZXAtaW4uc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2Y5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZGVwLWluLnNlZApAQCAtMCwwICsxLDQ1IEBACis6bG9vcAorL1xcJC9OCisvXFwkL2IgbG9vcAorCitzISAuLi9jb25maWcuaCEhZworcyEgLi4vLi4vYmZkL2JmZC5oISFnCitzISAuLi9pdGJsLXBhcnNlLmghIWcKK3MhQElOQ0RJUkAhJChJTkNESVIpIWcKK3MhQEJGRERJUkAhJChCRkRESVIpIWcKK3MhQFNSQ0RJUkAvY29uZmlnISQoc3JjZGlyKS9jb25maWchZworcyFAU1JDRElSQC8uLi9vcGNvZGVzISQoc3JjZGlyKS8uLi9vcGNvZGVzIWcKK3MhQFNSQ0RJUkAvISFnCitzISBjb25maWcuaCEhZworcyEgYXMuaCEhZworcyEgYXNpbnRsLmghIWcKK3MhIHRhcmctZW52LmghIWcKK3MhIG9iai1mb3JtYXQuaCEhZworcyEgdGFyZy1jcHUuaCEhZworcyEgZmxvbnVtLmghIWcKK3MhIGV4cHIuaCEhZworcyEgc3RydWMtc3ltYm9sLmghIWcKK3MhIHdyaXRlLmghIWcKK3MhIGZyYWdzLmghIWcKK3MhIGhhc2guaCEhZworcyEgcmVhZC5oISFnCitzISBzeW1ib2xzLmghIWcKK3MhIHRjLmghIWcKK3MhIG9iai5oISFnCitzISBsaXN0aW5nLmghIWcKK3MhIGJpZ251bS5oISFnCitzISBiaXRfZml4LmghIWcKK3MhIGl0YmwtY3B1LmghIWcKK3MhIFwkKHNyY2RpcikvY29uZmlnL3RlLWdlbmVyaWMuaCEhZworcyEgXCQoSU5DRElSKS9saWJpYmVydHkuaCEhZworcyEgXCQoSU5DRElSKS9hbnNpZGVjbC5oISFnCitzISBcJChJTkNESVIpL2ZvcGVuLXNhbWUuaCEhZworCitzL1xcXG4gKi8gL2cKKworcy8gKiQvLworcy8gICovIC9nCisvOiQvZAorCitzL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAorICAvZwpkaWZmIC0tZ2l0IGEvZ2FzL2RlcGVuZC5jIGIvZ2FzL2RlcGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxN2M3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZGVwZW5kLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qIGRlcGVuZC5jIC0gSGFuZGxlIGRlcGVuZGVuY3kgdHJhY2tpbmcuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhcy5oIgorCisvKiBUaGUgZmlsZSB0byB3cml0ZSB0bywgb3IgTlVMTCBpZiBubyBkZXBlbmRlbmNpZXMgYmVpbmcga2VwdC4gICovCitzdGF0aWMgY2hhciAqZGVwX2ZpbGUgPSBOVUxMOworCitzdHJ1Y3QgZGVwZW5kZW5jeQoreworICBjaGFyICpmaWxlOworICBzdHJ1Y3QgZGVwZW5kZW5jeSAqbmV4dDsKK307CisKKy8qIEFsbCB0aGUgZmlsZXMgd2UgZGVwZW5kIG9uLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVwZW5kZW5jeSAqZGVwX2NoYWluID0gTlVMTDsKKworLyogQ3VycmVudCBjb2x1bW4gaW4gb3V0cHV0IGZpbGUuICAqLworc3RhdGljIGludCBjb2x1bW4gPSAwOworCitzdGF0aWMgaW50IHF1b3RlX3N0cmluZ19mb3JfbWFrZSBQQVJBTVMgKChGSUxFICosIGNoYXIgKikpOworc3RhdGljIHZvaWQgd3JhcF9vdXRwdXQgUEFSQU1TICgoRklMRSAqLCBjaGFyICosIGludCkpOworCisvKiBOdW1iZXIgb2YgY29sdW1ucyBhbGxvd2FibGUuICAqLworI2RlZmluZSBNQVhfQ09MVU1OUyA3MgorCisMCisKKy8qIFN0YXJ0IHNhdmluZyBkZXBlbmRlbmNpZXMsIHRvIGJlIHdyaXR0ZW4gdG8gRklMRU5BTUUuICBJZiB0aGlzIGlzCisgICBuZXZlciBjYWxsZWQsIHRoZW4gZGVwZW5kZW5jeSB0cmFja2luZyBpcyBzaW1wbHkgc2tpcHBlZC4gICovCisKK3ZvaWQKK3N0YXJ0X2RlcGVuZGVuY2llcyAoZmlsZW5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBkZXBfZmlsZSA9IGZpbGVuYW1lOworfQorCisvKiBOb3RpY2VkIGEgbmV3IGZpbGVuYW1lLCBzbyB0cnkgdG8gcmVnaXN0ZXIgaXQuICAqLworCit2b2lkCityZWdpc3Rlcl9kZXBlbmRlbmN5IChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXA7CisKKyAgaWYgKGRlcF9maWxlID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoZGVwID0gZGVwX2NoYWluOyBkZXAgIT0gTlVMTDsgZGVwID0gZGVwLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICghIHN0cmNtcCAoZmlsZW5hbWUsIGRlcC0+ZmlsZSkpCisJcmV0dXJuOworICAgIH0KKworICBkZXAgPSAoc3RydWN0IGRlcGVuZGVuY3kgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGVwZW5kZW5jeSkpOworICBkZXAtPmZpbGUgPSB4c3RyZHVwIChmaWxlbmFtZSk7CisgIGRlcC0+bmV4dCA9IGRlcF9jaGFpbjsKKyAgZGVwX2NoYWluID0gZGVwOworfQorCisvKiBRdW90ZSBhIGZpbGUgbmFtZSB0aGUgd2F5IGBtYWtlJyB3YW50cyBpdCwgYW5kIHByaW50IGl0IHRvIEZJTEUuCisgICBJZiBGSUxFIGlzIE5VTEwsIGRvIG5vIHByaW50aW5nLCBidXQgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlCisgICBxdW90ZWQgc3RyaW5nLgorCisgICBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSBnY2Mgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMuICAqLworCitzdGF0aWMgaW50CitxdW90ZV9zdHJpbmdfZm9yX21ha2UgKGZpbGUsIHNyYykKKyAgICAgRklMRSAqZmlsZTsKKyAgICAgY2hhciAqc3JjOworeworICBjaGFyICpwID0gc3JjOworICBpbnQgaSA9IDA7CisgIGZvciAoOzspCisgICAgeworICAgICAgY2hhciBjID0gKnArKzsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXDAnOgorCWNhc2UgJyAnOgorCWNhc2UgJ1x0JzoKKwkgIHsKKwkgICAgLyogR05VIG1ha2UgdXNlcyBhIHdlaXJkIHF1b3Rpbmcgc2NoZW1lIGZvciB3aGl0ZSBzcGFjZS4KKwkgICAgICAgQSBzcGFjZSBvciB0YWIgcHJlY2VkZWQgYnkgMk4rMSBiYWNrc2xhc2hlcyByZXByZXNlbnRzCisJICAgICAgIE4gYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgc3BhY2U7IGEgc3BhY2Ugb3IgdGFiCisJICAgICAgIHByZWNlZGVkIGJ5IDJOIGJhY2tzbGFzaGVzIHJlcHJlc2VudHMgTiBiYWNrc2xhc2hlcyBhdAorCSAgICAgICB0aGUgZW5kIG9mIGEgZmlsZSBuYW1lOyBhbmQgYmFja3NsYXNoZXMgaW4gb3RoZXIKKwkgICAgICAgY29udGV4dHMgc2hvdWxkIG5vdCBiZSBkb3VibGVkLiAgKi8KKwkgICAgY2hhciAqcTsKKwkgICAgZm9yIChxID0gcCAtIDE7IHNyYyA8IHEgJiYgcVstMV0gPT0gJ1xcJzsgIHEtLSkKKwkgICAgICB7CisJCWlmIChmaWxlKQorCQkgIHB1dGMgKCdcXCcsIGZpbGUpOworCQlpKys7CisJICAgICAgfQorCSAgfQorCSAgaWYgKCFjKQorCSAgICByZXR1cm4gaTsKKwkgIGlmIChmaWxlKQorCSAgICBwdXRjICgnXFwnLCBmaWxlKTsKKwkgIGkrKzsKKwkgIGdvdG8gb3JkaW5hcnlfY2hhcjsKKwkgIAorCWNhc2UgJyQnOgorCSAgaWYgKGZpbGUpCisJICAgIHB1dGMgKGMsIGZpbGUpOworCSAgaSsrOworCSAgLyogRmFsbCB0aHJvdWdoLiAgVGhpcyBjYW4gbWlzaGFuZGxlIHRoaW5ncyBsaWtlICIkKCIgYnV0CisJICAgICB0aGVyZSdzIG5vIGVhc3kgZml4LiAgKi8KKwlkZWZhdWx0OgorCW9yZGluYXJ5X2NoYXI6CisJICAvKiBUaGlzIGNhbiBtaXNoYW5kbGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nICJcMFxuJSo/W1xcfiI7CisJICAgICBleGFjdGx5IHdoaWNoIGNoYXJzIGFyZSBtaXNoYW5kbGVkIGRlcGVuZHMgb24gdGhlIGBtYWtlJyB2ZXJzaW9uLgorCSAgICAgV2Uga25vdyBvZiBubyBwb3J0YWJsZSBzb2x1dGlvbiBmb3IgdGhpczsKKwkgICAgIGV2ZW4gR05VIG1ha2UgMy43Ni4xIGRvZXNuJ3Qgc29sdmUgdGhlIHByb2JsZW0gZW50aXJlbHkuCisJICAgICAoQWxzbywgJ1wwJyBpcyBtaXNoYW5kbGVkIGR1ZSB0byBvdXIgY2FsbGluZyBjb252ZW50aW9ucy4pICAqLworCSAgaWYgKGZpbGUpCisJICAgIHB1dGMgKGMsIGZpbGUpOworCSAgaSsrOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworLyogQXBwZW5kIHNvbWUgb3V0cHV0IHRvIHRoZSBmaWxlLCBrZWVwaW5nIHRyYWNrIG9mIGNvbHVtbnMgYW5kIGRvaW5nCisgICB3cmFwcGluZyBhcyBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgdm9pZAord3JhcF9vdXRwdXQgKGYsIHN0cmluZywgc3BhY2VyKQorICAgICBGSUxFICpmOworICAgICBjaGFyICpzdHJpbmc7CisgICAgIGludCBzcGFjZXI7Cit7CisgIGludCBsZW4gPSBxdW90ZV9zdHJpbmdfZm9yX21ha2UgKE5VTEwsIHN0cmluZyk7CisKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoY29sdW1uICYmIE1BWF9DT0xVTU5TIC0gMSAvKnNwYWNlciovIC0gMiAvKmAgXCcqLyA8IGNvbHVtbiArIGxlbikKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiIFxcXG4gIik7CisgICAgICBjb2x1bW4gPSAwOworICAgICAgaWYgKHNwYWNlciA9PSAnICcpCisJc3BhY2VyID0gJ1wwJzsKKyAgICB9CisKKyAgaWYgKHNwYWNlciA9PSAnICcpCisgICAgeworICAgICAgcHV0YyAoc3BhY2VyLCBmKTsKKyAgICAgICsrY29sdW1uOworICAgIH0KKworICBxdW90ZV9zdHJpbmdfZm9yX21ha2UgKGYsIHN0cmluZyk7CisgIGNvbHVtbiArPSBsZW47CisKKyAgaWYgKHNwYWNlciA9PSAnOicpCisgICAgeworICAgICAgcHV0YyAoc3BhY2VyLCBmKTsKKyAgICAgICsrY29sdW1uOworICAgIH0KK30KKworLyogUHJpbnQgZGVwZW5kZW5jeSBmaWxlLiAgKi8KKwordm9pZAorcHJpbnRfZGVwZW5kZW5jaWVzICgpCit7CisgIEZJTEUgKmY7CisgIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXA7CisKKyAgaWYgKGRlcF9maWxlID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGYgPSBmb3BlbiAoZGVwX2ZpbGUsICJ3Iik7CisgIGlmIChmID09IE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiQ2FuJ3Qgb3BlbiBgJXMnIGZvciB3cml0aW5nIiksIGRlcF9maWxlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29sdW1uID0gMDsKKyAgd3JhcF9vdXRwdXQgKGYsIG91dF9maWxlX25hbWUsICc6Jyk7CisgIGZvciAoZGVwID0gZGVwX2NoYWluOyBkZXAgIT0gTlVMTDsgZGVwID0gZGVwLT5uZXh0KQorICAgIHdyYXBfb3V0cHV0IChmLCBkZXAtPmZpbGUsICcgJyk7CisKKyAgcHV0YyAoJ1xuJywgZik7CisKKyAgaWYgKGZjbG9zZSAoZikpCisgICAgYXNfd2FybiAoXygiQ2FuJ3QgY2xvc2UgYCVzJyIpLCBkZXBfZmlsZSk7Cit9CmRpZmYgLS1naXQgYS9nYXMvZG9jL01ha2VmaWxlLmFtIGIvZ2FzL2RvYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY1YTRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ5IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCisKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKKworIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZworQ09ORklHPWFsbAorCittYW5fTUFOUyA9IGFzLjEKKworaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCisKK2FzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCisJcm0gLWYgYXNjb25maWcudGV4aQorCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKKwkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKKwkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKKworQ1BVX0RPQ1MgPSBcCisJYy1hMjlrLnRleGkgXAorCWMtYXJtLnRleGkgXAorCWMtZDEwdi50ZXhpIFwKKwljLWg4MzAwLnRleGkgXAorCWMtaDg1MDAudGV4aSBcCisJYy1ocHBhLnRleGkgXAorCWMtaTM4Ni50ZXhpIFwKKwljLWk5NjAudGV4aSBcCisJYy1tNjhrLnRleGkgXAorCWMtbWlwcy50ZXhpIFwKKwljLW5zMzJrLnRleGkgXAorCWMtc2gudGV4aSBcCisJYy1zcGFyYy50ZXhpIFwKKwljLXZheC50ZXhpIFwKKwljLXY4NTAudGV4aSBcCisJYy16OGsudGV4aQorCitnYXN2ZXIudGV4aTogTWFrZWZpbGUKKwlybSAtZiAkQAorCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACisKK2FzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKK2FzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQorCisjIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KKworbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKKworRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuaW4gYi9nYXMvZG9jL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGQxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDM4IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKK1NIRUxMID0gQFNIRUxMQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitiaW5kaXIgPSBAYmluZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsaWJkaXIgPSBAbGliZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKKworREVTVERJUiA9CisKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACisKK3RvcF9idWlsZGRpciA9IC4uCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACisKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQUxMX09CSl9ERVBTID0gQEFMTF9PQkpfREVQU0AKK0FTID0gQEFTQAorQkZETElCID0gQEJGRExJQkAKK0NBVEFMT0dTID0gQENBVEFMT0dTQAorQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKK0NDID0gQENDQAorREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACitETExUT09MID0gQERMTFRPT0xACitFWEVFWFQgPSBARVhFRVhUQAorR01PRklMRVMgPSBAR01PRklMRVNACitHTVNHRk1UID0gQEdNU0dGTVRACitHVF9OTyA9IEBHVF9OT0AKK0dUX1lFUyA9IEBHVF9ZRVNACitJTkNMVURFX0xPQ0FMRV9IID0gQElOQ0xVREVfTE9DQUxFX0hACitJTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACitJTlRMREVQUyA9IEBJTlRMREVQU0AKK0lOVExMSUJTID0gQElOVExMSUJTQAorSU5UTE9CSlMgPSBASU5UTE9CSlNACitMRCA9IEBMREAKK0xFWCA9IEBMRVhACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorTVNHRk1UID0gQE1TR0ZNVEAKK05NID0gQE5NQAorT1BDT0RFU19MSUIgPSBAT1BDT0RFU19MSUJACitQQUNLQUdFID0gQFBBQ0tBR0VACitQT0ZJTEVTID0gQFBPRklMRVNACitQT1NVQiA9IEBQT1NVQkAKK1JBTkxJQiA9IEBSQU5MSUJACitVU0VfSU5DTFVERURfTElCSU5UTCA9IEBVU0VfSU5DTFVERURfTElCSU5UTEAKK1VTRV9OTFMgPSBAVVNFX05MU0AKK1VTRV9TWU1CT0xfVU5ERVJTQ09SRSA9IEBVU0VfU1lNQk9MX1VOREVSU0NPUkVACitWRVJTSU9OID0gQFZFUlNJT05ACitZQUNDID0gQFlBQ0NACithdG9mID0gQGF0b2ZACitjZ2VuX2NwdV9wcmVmaXggPSBAY2dlbl9jcHVfcHJlZml4QAorZXh0cmFfb2JqZWN0cyA9IEBleHRyYV9vYmplY3RzQAoraW5zdGFsbF90b29sZGlyID0gQGluc3RhbGxfdG9vbGRpckAKK2wgPSBAbEAKK29ial9mb3JtYXQgPSBAb2JqX2Zvcm1hdEAKK3RhcmdldF9jcHVfdHlwZSA9IEB0YXJnZXRfY3B1X3R5cGVACit0ZV9maWxlID0gQHRlX2ZpbGVACisKK0FVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKKworIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZworQ09ORklHID0gYWxsCisKK21hbl9NQU5TID0gYXMuMQorCitpbmZvX1RFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKKworQ1BVX0RPQ1MgPSBcCisJYy1hMjlrLnRleGkgXAorCWMtYXJtLnRleGkgXAorCWMtZDEwdi50ZXhpIFwKKwljLWg4MzAwLnRleGkgXAorCWMtaDg1MDAudGV4aSBcCisJYy1ocHBhLnRleGkgXAorCWMtaTM4Ni50ZXhpIFwKKwljLWk5NjAudGV4aSBcCisJYy1tNjhrLnRleGkgXAorCWMtbWlwcy50ZXhpIFwKKwljLW5zMzJrLnRleGkgXAorCWMtc2gudGV4aSBcCisJYy1zcGFyYy50ZXhpIFwKKwljLXZheC50ZXhpIFwKKwljLXY4NTAudGV4aSBcCisJYy16OGsudGV4aQorCisKKyMgVGhpcyBvbmUgaXNuJ3QgcmVhZHkgZm9yIHByaW1lIHRpbWUgeWV0LiAgTm90IGV2ZW4gYSBsaXR0bGUgYml0LgorCitub2luc3RfVEVYSU5GT1MgPSBpbnRlcm5hbHMudGV4aQorCitESVNUQ0xFQU5GSUxFUyA9IGFzY29uZmlnLnRleGkKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBnYXN2ZXIudGV4aQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IC4uL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSAKK1RFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKK1RFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4CitJTkZPX0RFUFMgPSBhcy5pbmZvIGdhc3AuaW5mbworRFZJUyA9IGFzLmR2aSBnYXNwLmR2aQorVEVYSU5GT1MgPSBhcy50ZXhpbmZvIGdhc3AudGV4aQorbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCitNQU5TID0gJChtYW5fTUFOUykKKworTlJPRkYgPSBucm9mZgorRElTVF9DT01NT04gPSAgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4KKworCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCitUQVIgPSB0YXIKK0daSVBfRU5WID0gLS1iZXN0CithbGw6IGFsbC1yZWRpcmVjdAorLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuZHZpIC5pbmZvIC5wcyAudGV4aSAudGV4aW5mbyAudHhpCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIGRvYy9NYWtlZmlsZQorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworCithcy5pbmZvOiBhcy50ZXhpbmZvCithcy5kdmk6IGFzLnRleGluZm8KKworCitnYXNwLmluZm86IGdhc3AudGV4aQorZ2FzcC5kdmk6IGdhc3AudGV4aQorCisKK0RWSVBTID0gZHZpcHMKKworLnRleGkuaW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aS5kdmk6CisJVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCisJICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAorCisudGV4aToKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aW5mby5pbmZvOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50ZXhpbmZvOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50ZXhpbmZvLmR2aToKKwlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKKwkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8CisKKy50eGkuaW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudHhpLmR2aToKKwlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKKwkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8CisKKy50eGk6CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKy5kdmkucHM6CisJJChEVklQUykgJDwgLW8gJEAKKworaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCisJQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCisJICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAorCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCisJICAgIGVsc2UgOiA7IGZpOyBcCisJICBkb25lOyBcCisJZG9uZQorCUAkKFBPU1RfSU5TVEFMTCkKKwlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBsaXN0PSckKElORk9fREVQUyknOyBcCisJICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAorCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCisJICBkb25lOyBcCisJZWxzZSA6IDsgZmkKKwordW5pbnN0YWxsLWluZm86CisJJChQUkVfVU5JTlNUQUxMKQorCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGlpPXllczsgXAorCWVsc2UgaWk9OyBmaTsgXAorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgLXogIiRpaSIgXAorCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKKwlkb25lCisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKKwlkb25lCisKK2Rpc3QtaW5mbzogJChJTkZPX0RFUFMpCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKworbW9zdGx5Y2xlYW4tYW1pbmZvOgorCS1ybSAtZiBhcy5hdXggYXMuY3AgYXMuY3BzIGFzLmR2aSBhcy5mbiBhcy5mbnMgYXMua3kgYXMua3lzIGFzLnBzIFwKKwkgIGFzLmxvZyBhcy5wZyBhcy50b2MgYXMudHAgYXMudHBzIGFzLnZyIGFzLnZycyBhcy5vcCBhcy50ciBcCisJICBhcy5jdiBhcy5jbiBnYXNwLmF1eCBnYXNwLmNwIGdhc3AuY3BzIGdhc3AuZHZpIGdhc3AuZm4gXAorCSAgZ2FzcC5mbnMgZ2FzcC5reSBnYXNwLmt5cyBnYXNwLnBzIGdhc3AubG9nIGdhc3AucGcgZ2FzcC50b2MgXAorCSAgZ2FzcC50cCBnYXNwLnRwcyBnYXNwLnZyIGdhc3AudnJzIGdhc3Aub3AgZ2FzcC50ciBnYXNwLmN2IFwKKwkgIGdhc3AuY24KKworY2xlYW4tYW1pbmZvOgorCitkaXN0Y2xlYW4tYW1pbmZvOgorCittYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKKwlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKKwkgIHJtIC1mICQkaTsgXAorCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCisJICAgIHJtIC1mICQkaS1bMC05XSo7IFwKKwkgIGZpOyBcCisJZG9uZQorY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCisKK2luc3RhbGwtbWFuMToKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCisJQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKKwlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCisJICBjYXNlICIkJGkiIGluIFwKKwkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKKwkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCisJICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAorCWRvbmUKKwordW5pbnN0YWxsLW1hbjE6CisJQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKKwlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCisJICBjYXNlICIkJGkiIGluIFwKKwkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKKwkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCisJICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKKwlkb25lCitpbnN0YWxsLW1hbjogJChNQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQordW5pbnN0YWxsLW1hbjoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCit0YWdzOiBUQUdTCitUQUdTOgorCisKK2Rpc3RkaXIgPSAkKHRvcF9idWlsZGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorCitzdWJkaXIgPSBkb2MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAorCSAgZmk7IFwKKwlkb25lCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KK2luZm8tYW06ICQoSU5GT19ERVBTKQoraW5mbzogaW5mby1hbQorZHZpLWFtOiAkKERWSVMpCitkdmk6IGR2aS1hbQorY2hlY2stYW06CitjaGVjazogY2hlY2stYW0KK2luc3RhbGxjaGVjay1hbToKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLWluZm8tYW06IAoraW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KK2luc3RhbGwtZXhlYy1hbToKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCitpbnN0YWxsOiBpbnN0YWxsLWFtCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1tYW4KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCithbGwtYW06IE1ha2VmaWxlICQoTUFOUykKK2FsbC1yZWRpcmVjdDogYWxsLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCitpbnN0YWxsZGlyczoKKwkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKKworCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgorCS10ZXN0IC16ICIkKERJU1RDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChESVNUQ0xFQU5GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK21vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK2NsZWFuLWFtOiAgY2xlYW4tYW1pbmZvIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KKworY2xlYW46IGNsZWFuLWFtCisKK2Rpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KKwktcm0gLWYgbGlidG9vbAorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCittYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKKwkJZGlzdGNsZWFuLWFtCisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKworLlBIT05ZOiBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gbW9zdGx5Y2xlYW4tYW1pbmZvIFwKK2Rpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tYW1pbmZvIGluc3RhbGwtbWFuMSBcCit1bmluc3RhbGwtbWFuMSBpbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuIHRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAorZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCitpbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIFwKK2luc3RhbGwtYW0gaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIFwKK2luc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KKworCithc2NvbmZpZy50ZXhpOiAkKENPTkZJRykudGV4aQorCXJtIC1mIGFzY29uZmlnLnRleGkKKwlsbiAtcyAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpID4vZGV2L251bGwgMj4mMSBcCisJICB8fCBsbiAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpID4vZGV2L251bGwgMj4mMSBcCisJICB8fCBjcCAkKHNyY2RpcikvJChDT05GSUcpLnRleGkgLi9hc2NvbmZpZy50ZXhpCisKK2dhc3Zlci50ZXhpOiBNYWtlZmlsZQorCXJtIC1mICRACisJZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKKworYXMuaW5mbzogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQorYXMuZHZpOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYWxsLnRleGkgYi9nYXMvZG9jL2FsbC50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTBjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL2FsbC50ZXhpCkBAIC0wLDAgKzEsNzIgQEAKK0BjIENvcHlyaWdodCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBHQVMgbWFudWFsCisKK0BjIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGFsbC1pbmNsdXNpdmUgdmVyc2lvbiBvZiBtYW51YWwKKworQGMgc3dpdGNoZXM6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAYyBQcm9wZXJ0aWVzIG9mIHRoZSBtYW51YWwKK0BjID09PT09PT09PT09PT09PT09PT09PT09PQorQGMgRGlzY3VzcyBhbGwgYXJjaGl0ZWN0dXJlcz8KK0BzZXQgQUxMLUFSQ0gKK0BjIEEgZ2VuZXJpYyBmb3JtIG9mIG1hbnVhbCAobm90IHRhaWxvcmVkIHRvIHNwZWNpZmljIHRhcmdldCk/CitAc2V0IEdFTkVSSUMKK0BjIEluY2x1ZGUgdGV4dCBvbiBhc3NlbWJsZXIgaW50ZXJuYWxzPworQGNsZWFyIElOVEVSTkFMUworQGMgTWFueSBvYmplY3QgZm9ybWF0cyBzdXBwb3J0ZWQgaW4gdGhpcyBjb25maWc/CitAc2V0IE1VTFRJLU9CSgorCitAYyBPYmplY3QgZm9ybWF0cyBvZiBpbnRlcmVzdAorQGMgPT09PT09PT09PT09PT09PT09PT09PT09PT0KK0BzZXQgQU9VVAorQHNldCBCT1VUCitAc2V0IENPRkYKK0BzZXQgRUxGCitAc2V0IFNPTQorCitAYyBDUFVzIG9mIGludGVyZXN0CitAYyA9PT09PT09PT09PT09PT09CitAc2V0IEEyOUsKK0BzZXQgQVJDCitAc2V0IEFSTQorQHNldCBEMTBWCitAc2V0IEQzMFYKK0BzZXQgSDgvMzAwCitAc2V0IEg4LzUwMAorQHNldCBTSAorQHNldCBJODAzODYKK0BzZXQgSTk2MAorQHNldCBNQ09SRQorQHNldCBNSVBTCitAc2V0IE0zMlIKK0BzZXQgTTY4MFgwCitAc2V0IFo4MDAwCitAc2V0IFNQQVJDCitAc2V0IFZBWAorQHNldCBWWFdPUktTCitAc2V0IEhQUEEKK0BzZXQgVjg1MAorCitAYyBEb2VzIHRoaXMgdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIHVzZSB0aGUgZGlmZmVyZW5jZS10YWJsZSBrbHVnZT8KK0BzZXQgRElGRi1UQkwtS0xVR0UKKworQGMgRG8gYWxsIG1hY2hpbmVzIGRlc2NyaWJlZCB1c2UgSUVFRSBmbG9hdGluZyBwb2ludD8KK0BjbGVhciBJRUVFRkxPQVQKKworQGMgSXMgYSB3b3JkIDMyIGJpdHMsIG9yIDE2PworQGNsZWFyIFczMgorQHNldCBXMTYKKworQGMgRG8gc3ltYm9scyBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIHRoYW4gdXN1YWw/CitAY2xlYXIgU1BFQ0lBTC1TWU1TCisKK0BjIHN0cmluZ3M6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAYyBOYW1lIG9mIHRoZSBhc3NlbWJsZXI6CitAc2V0IEFTIGFzCitAYyBOYW1lIG9mIEMgY29tcGlsZXI6CitAc2V0IEdDQyBnY2MKK0BjIE5hbWUgb2YgbGlua2VyOgorQHNldCBMRCBsZAorQGMgVGV4dCBmb3IgdGFyZ2V0IG1hY2hpbmUgKGJlc3Qgbm90IHVzZWQgaW4gZ2VuZXJpYyBjYXNlOyBidXQganVzdCBpbiBjYXNlLi4uKQorQHNldCBUQVJHRVQgbWFjaGluZSBzcGVjaWZpYworQGMgTmFtZSBvZiBvYmplY3QgZm9ybWF0IE5PVCBTRVQgaW4gZ2VuZXJpYyB2ZXJzaW9uCitAY2xlYXIgT0JKLU5BTUUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMuMSBiL2dhcy9kb2MvYXMuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGYyODg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9hcy4xCkBAIC0wLDAgKzEsMzAyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggYXMgMSAiMjkgTWFyY2ggMTk5NiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgorCisuU0ggTkFNRQorR05VIGFzIFwtIHRoZSBwb3J0YWJsZSBHTlUgYXNzZW1ibGVyLgorCisuU0ggU1lOT1BTSVMKKy5uYQorLkIgYXMKKy5SQiAiW1x8IiBcLWEgIltcfCIgZGhsbnMgIlx8XSIgXGMKK1wmXFtcfFw9XGMKKy5JIGZpbGVcYworXCZcfF1cfF0KKy5SQiAiW1x8IiBcLUQgIlx8XSIKKy5SQiAiW1x8IiBcLVwtZGVmc3ltXCBTWU09VkFMICJcfF0iCisuUkIgIltcfCIgXC1mICJcfF0iCisuUkIgIltcfCIgXC1cLWdzdGFicyAiXHxdIgorLlJCICJbXHwiIFwtSQorLkkgcGF0aFxjCitcJlx8XQorLlJCICJbXHwiIFwtSyAiXHxdIgorLlJCICJbXHwiIFwtTCAiXHxdIgorLlJCICJbXHwiIFwtTVwgfFwgXC1cLW1yaSAiXHxdIgorLlJCICJbXHwiIFwtbyAKKy5JIG9iamZpbGVcYworXCZcfF0KKy5SQiAiW1x8IiBcLVIgIlx8XSIKKy5SQiAiW1x8IiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdCAiXHxdIgorLlJCICJbXHwiIFwtdiAiXHxdIgorLlJCICJbXHwiIFwtdyAiXHxdIgorLlJCICJbXHwiIFwtXF5cLSAiXCB8XCAiIFxjCisuSSBmaWxlc1xjCitcJlx8Llx8Llx8Llx8XQorCisuSSBpOTYwLW9ubHkgb3B0aW9uczoKKy5icgorLlJCICJbXHwiIFwtQUNBICJcfHxcfCIgXC1BQ0FfQSAiXHx8XHwiIFwtQUNCXGMKKy5SQiAiXHx8XHwiIFwtQUNDICJcfHxcfCIgXC1BS0EgIlx8fFx8IiBcLUFLQlxjCisuUkIgIlx8fFx8IiBcLUFLQyAiXHx8XHwiIFwtQU1DICJcfF0iCisuUkIgIltcfCIgXC1iICJcfF0iCisuUkIgIltcfCIgXC1uby1yZWxheCAiXHxdIgorCisuSSBtNjgweDAtb25seSBvcHRpb25zOgorLmJyCisuUkIgIltcfCIgXC1sICJcfF0iCisuUkIgIltcfCIgXC1tYzY4MDAwICJcfHxcfCIgXC1tYzY4MDEwICJcfHxcfCIgXC1tYzY4MDIwICJcfF0iCisuYWQgYgorCisuU0ggREVTQ1JJUFRJT04KK0dOVSBcYworLkIgYXNcYworXCYgaXMgcmVhbGx5IGEgZmFtaWx5IG9mIGFzc2VtYmxlcnMuICAKK0lmIHlvdSB1c2UgKG9yIGhhdmUgdXNlZCkgdGhlIEdOVSBhc3NlbWJsZXIgb24gb25lIGFyY2hpdGVjdHVyZSwgeW91CitzaG91bGQgZmluZCBhIGZhaXJseSBzaW1pbGFyIGVudmlyb25tZW50IHdoZW4geW91IHVzZSBpdCBvbiBhbm90aGVyCithcmNoaXRlY3R1cmUuICBFYWNoIHZlcnNpb24gaGFzIG11Y2ggaW4gY29tbW9uIHdpdGggdGhlIG90aGVycywKK2luY2x1ZGluZyBvYmplY3QgZmlsZSBmb3JtYXRzLCBtb3N0IGFzc2VtYmxlciBkaXJlY3RpdmVzIChvZnRlbiBjYWxsZWQKK1xjCisuSSBwc2V1ZG8tb3BzKVxjCitcJiBhbmQgYXNzZW1ibGVyIHN5bnRheC4gIAorCitGb3IgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IEdOVSBcYworLkIgYXNcYworXCYsIHNlZSBgXHxcYworLkIgYXNcYworXHwnIGVudHJ5IGluIFxjCisuQiBpbmZvIFxjCisob3IgdGhlIG1hbnVhbCBcYworLkkKKy5JCitVc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYworXCYpLgorCitcYworLkIgYXNcYworXCYgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YgdGhlIEdOVSBDCitjb21waWxlciBcYworLkIgZ2NjXGMKK1wmIGZvciB1c2UgYnkgdGhlIGxpbmtlciBcYworLkIgbGRcYworXCYuICBOZXZlcnRoZWxlc3MsCit3ZSd2ZSB0cmllZCB0byBtYWtlIFxjCisuQiBhc1xjCitcJiBhc3NlbWJsZSBjb3JyZWN0bHkgZXZlcnl0aGluZyB0aGF0IHRoZSBuYXRpdmUKK2Fzc2VtYmxlciB3b3VsZC4KK1RoaXMgZG9lc24ndCBtZWFuIFxjCisuQiBhc1xjCitcJiBhbHdheXMgdXNlcyB0aGUgc2FtZSBzeW50YXggYXMgYW5vdGhlcgorYXNzZW1ibGVyIGZvciB0aGUgc2FtZSBhcmNoaXRlY3R1cmU7IGZvciBleGFtcGxlLCB3ZSBrbm93IG9mIHNldmVyYWwKK2luY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiA2ODB4MCBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXguCisKK0VhY2ggdGltZSB5b3UgcnVuIFxjCisuQiBhc1xjCitcJiBpdCBhc3NlbWJsZXMgZXhhY3RseSBvbmUgc291cmNlCitwcm9ncmFtLiAgVGhlIHNvdXJjZSBwcm9ncmFtIGlzIG1hZGUgdXAgb2Ygb25lIG9yIG1vcmUgZmlsZXMuCisoVGhlIHN0YW5kYXJkIGlucHV0IGlzIGFsc28gYSBmaWxlLikKKworSWYgXGMKKy5CIGFzXGMKK1wmIGlzIGdpdmVuIG5vIGZpbGUgbmFtZXMgaXQgYXR0ZW1wdHMgdG8gcmVhZCBvbmUgaW5wdXQgZmlsZQorZnJvbSB0aGUgXGMKKy5CIGFzXGMKK1wmIHN0YW5kYXJkIGlucHV0LCB3aGljaCBpcyBub3JtYWxseSB5b3VyIHRlcm1pbmFsLiAgWW91CittYXkgaGF2ZSB0byB0eXBlIFxjCisuQiBjdGwtRFxjCitcJiB0byB0ZWxsIFxjCisuQiBhc1xjCitcJiB0aGVyZSBpcyBubyBtb3JlIHByb2dyYW0KK3RvIGFzc2VtYmxlLiAgVXNlIGBcfFxjCisuQiBcLVxeXC1cYworXHwnIGlmIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgbmFtZSB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQoraW4geW91ciBjb21tYW5kIGxpbmUuCisKKy5CIGFzXGMKK1wmIG1heSB3cml0ZSB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIGVycm9yCitmaWxlICh1c3VhbGx5IHlvdXIgdGVybWluYWwpLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuIFxjCisuQiBhc1xjCitcJiBpcworcnVuIGF1dG9tYXRpY2FsbHkgYnkgYSBjb21waWxlci4gIFdhcm5pbmdzIHJlcG9ydCBhbiBhc3N1bXB0aW9uIG1hZGUgc28KK3RoYXQgXGMKKy5CIGFzXGMKK1wmIGNvdWxkIGtlZXAgYXNzZW1ibGluZyBhIGZsYXdlZCBwcm9ncmFtOyBlcnJvcnMgcmVwb3J0IGEKK2dyYXZlIHByb2JsZW0gdGhhdCBzdG9wcyB0aGUgYXNzZW1ibHkuCisKKy5TSCBPUFRJT05TCisuVFAKKy5CUiBcLWEKK1R1cm4gb24gYXNzZW1ibHkgbGlzdGluZ3MuICBUaGVyZSBhcmUgdmFyaW91cyBzdWJvcHRpb25zLgorLkIgZAorb21pdHMgZGVidWdnaW5nIGRpcmVjdGl2ZXMuCisuQiBoCitpbmNsdWRlcyB0aGUgaGlnaCBsZXZlbCBzb3VyY2UgY29kZTsgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUKK3NvdXJjZSBmaWxlIGNhbiBiZSBmb3VuZCwgYW5kIHRoZSBjb2RlIHdhcyBjb21waWxlZCB3aXRoCisuQiBcLWcuCisuQiBsCitpbmNsdWRlcyBhbiBhc3NlbWJseSBsaXN0aW5nLgorLkIgbgorb21pdHMgZm9ybXMgcHJvY2Vzc2luZy4KKy5CIHMKK2luY2x1ZGVzIGEgc3ltYm9sIGxpc3RpbmcuCisuQiA9CisuSSBmaWxlCitzZXRzIHRoZSBsaXN0aW5nIGZpbGUgbmFtZTsgdGhpcyBtdXN0IGJlIHRoZSBsYXN0IHN1Ym9wdGlvbi4KK1RoZSBkZWZhdWx0IHN1Ym9wdGlvbnMgYXJlCisuQiBobHMuCisuVFAKKy5CIFwtRAorVGhpcyBvcHRpb24gaXMgYWNjZXB0ZWQgb25seSBmb3Igc2NyaXB0IGNvbXBhdGliaWxpdHkgd2l0aCBjYWxscyB0bworb3RoZXIgYXNzZW1ibGVyczsgaXQgaGFzIG5vIGVmZmVjdCBvbiBcYworLkIgYXNcYworXCYuCisuVFAKKy5CIFwtXC1kZWZzeW0gU1lNPVZBTFVFCitEZWZpbmUgdGhlIHN5bWJvbCBTWU0gdG8gYmUgVkFMVUUgYmVmb3JlIGFzc2VtYmxpbmcgdGhlIGlucHV0IGZpbGUuCitWQUxVRSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQuICBBcyBpbiBDLCBhIGxlYWRpbmcgMHggaW5kaWNhdGVzIGEKK2hleGFkZWNpbWFsIHZhbHVlLCBhbmQgYSBsZWFkaW5nIDAgaW5kaWNhdGVzIGFuIG9jdGFsIHZhbHVlLgorLlRQCisuQiBcLWYKK2BgZmFzdCcnLS1za2lwIHByZXByb2Nlc3NpbmcgKGFzc3VtZSBzb3VyY2UgaXMgY29tcGlsZXIgb3V0cHV0KS4KKy5UUAorLkJJICJcLUlcICIgcGF0aAorQWRkIAorLkkgcGF0aAordG8gdGhlIHNlYXJjaCBsaXN0IGZvciAKKy5CIC5pbmNsdWRlCitkaXJlY3RpdmVzLgorLlRQCisuQiBcLVwtZ3N0YWJzCitHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCittYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgorLlRQCisuQiBcLUsKK0lzc3VlIHdhcm5pbmdzIHdoZW4gZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgorLlRQCisuQiBcLUwKK0tlZXAgKGluIHN5bWJvbCB0YWJsZSkgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgd2l0aCBgXHxcYworLkIgTFxjCitcfCcKKy5UUAorLkIgXC1NLCBcLVwtbXJpCitBc3NlbWJsZSBpbiBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLgorLlRQCisuQkkgIlwtb1wgIiBvYmpmaWxlCitOYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgZnJvbSBcYworLkIgYXMKKy5UUAorLkIgXC1SCitGb2xkIGRhdGEgc2VjdGlvbiBpbnRvIHRleHQgc2VjdGlvbgorLlRQCisuQiBcLVwtdHJhZGl0aW9uYWxcLWZvcm1hdAorVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIsIHdoZW4gcG9zc2libGUuCisuVFAKKy5CIFwtdgorQW5ub3VuY2UgXGMKKy5CIGFzXGMKK1wmIHZlcnNpb24KKy5UUAorLkIgXC1XCitTdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzCisuVFAKKy5JUiAiXC1cXlwtIiAiXCB8XCAiICJmaWxlc1x8Llx8Llx8LiIKK1NvdXJjZSBmaWxlcyB0byBhc3NlbWJsZSwgb3Igc3RhbmRhcmQgaW5wdXQgKFxjCisuQlIgIlwtXF5cLSIgIikiCisuVFAKKy5CSSBcLUEgdmFyCisuSQorKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKK1NwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgOTYwIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgorLlRQCisuQiBcLWIKKy5JCisoV2hlbiBjb25maWd1cmVkIGZvciBJbnRlbCA5NjAuKQorQWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuLgorLlRQCisuQiBcLW5vLXJlbGF4CisuSQorKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKK0RvIG5vdCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHM7CitlcnJvciBpZiBuZWNlc3NhcnkuCisuVFAKKy5CIFwtbAorLkkKKyhXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAorLmJyCitTaG9ydGVuIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkIHN5bWJvbHMsIHRvIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvLgorLlRQCisuQlIgIlwtbWM2ODAwMCIgIlx8fFx8IiAiXC1tYzY4MDEwIiAiXHx8XHwiICJcLW1jNjgwMjAiCisuSQorKFdoZW4gY29uZmlndXJlZCBmb3IgTW90b3JvbGEgNjgwMDApLiAgCisuYnIKK1NwZWNpZnkgd2hhdCBwcm9jZXNzb3IgaW4gdGhlIDY4MDAwIGZhbWlseSBpcyB0aGUgdGFyZ2V0IChkZWZhdWx0IDY4MDIwKQorCisuUFAKK09wdGlvbnMgbWF5IGJlIGluIGFueSBvcmRlciwgYW5kIG1heSBiZQorYmVmb3JlLCBhZnRlciwgb3IgYmV0d2VlbiBmaWxlIG5hbWVzLiAgVGhlIG9yZGVyIG9mIGZpbGUgbmFtZXMgaXMKK3NpZ25pZmljYW50LgorCitgXHxcYworLkIgXC1cXlwtXGMKK1x8JyAodHdvIGh5cGhlbnMpIGJ5IGl0c2VsZiBuYW1lcyB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQorZXhwbGljaXRseSwgYXMgb25lIG9mIHRoZSBmaWxlcyBmb3IgXGMKKy5CIGFzXGMKK1wmIHRvIGFzc2VtYmxlLgorCitFeGNlcHQgZm9yIGBcfFxjCisuQiBcLVxeXC1cYworXHwnIGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdGhhdCBiZWdpbnMgd2l0aCBhCitoeXBoZW4gKGBcfFxjCisuQiBcLVxjCitcfCcpIGlzIGFuIG9wdGlvbi4gIEVhY2ggb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCitcYworLkIgYXNcYworXCYuICBObyBvcHRpb24gY2hhbmdlcyB0aGUgd2F5IGFub3RoZXIgb3B0aW9uIHdvcmtzLiAgQW4KK29wdGlvbiBpcyBhIGBcfFxjCisuQiBcLVxjCitcfCcgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbGV0dGVyczsgdGhlIGNhc2Ugb2YKK3RoZSBsZXR0ZXIgaXMgaW1wb3J0YW50LiAgIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KKworVGhlIGBcfFxjCisuQiBcLW9cYworXHwnIG9wdGlvbiBleHBlY3RzIGV4YWN0bHkgb25lIGZpbGUgbmFtZSB0byBmb2xsb3cuICBUaGUgZmlsZQorbmFtZSBtYXkgZWl0aGVyIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uJ3MgbGV0dGVyIChjb21wYXRpYmxlCit3aXRoIG9sZGVyIGFzc2VtYmxlcnMpIG9yIGl0IG1heSBiZSB0aGUgbmV4dCBjb21tYW5kIGFyZ3VtZW50IChHTlUKK3N0YW5kYXJkKS4gIAorCitUaGVzZSB0d28gY29tbWFuZCBsaW5lcyBhcmUgZXF1aXZhbGVudDoKKy5icgorLkIKK2FzXCBcIFwtb1wgXCBteVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKKy5icgorLkIKK2FzXCBcIFwtb215XC1vYmplY3RcLWZpbGUub1wgXCBtdW1ibGUucworCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGFzICJcfCciCitlbnRyeSBpbiAKKy5CCitpbmZvXGMKK1wmOyAKKy5JCitVc2luZyBhczogVGhlIEdOVSBBc3NlbWJsZXJcYworXCY7CisuQlIgZ2NjICIoIiAxICIpLCIKKy5CUiBsZCAiKCIgMSAiKS4iCisKKy5TSCBDT1BZSU5HCitDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKK21hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAordmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCit0cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCit0aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMudGV4aW5mbyBiL2dhcy9kb2MvYXMudGV4aW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUzNjJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9hcy50ZXhpbmZvCkBAIC0wLDAgKzEsNTMyMiBAQAorXGlucHV0IHRleGluZm8gQGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotVGV4aW5mby0qLQorQGMgIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorQGMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVVBEQVRFISEgIE9uIGZ1dHVyZSB1cGRhdGVzLS0KK0BjICAgKDEpICAgY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KK0BjICAgICAgICAgbWRfcGFyc2Vfb3B0aW9uIGRlZmluaXRpb25zIGluIGNvbmZpZy90Yy0qLmMKK0BjICAgKDIpICAgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdGl2ZXMsIGV4YW1pbmUgbWRfcHNldWRvX29wCitAYyAgICAgICAgIGluIGNvbmZpZy90Yy0qLmMKK0BjICAgKDMpICAgZm9yIG9iamVjdC1mb3JtYXQgc3BlY2lmaWMgZGlyZWN0aXZlcywgZXhhbWluZSBvYmpfcHNldWRvX29wCitAYyAgICAgICAgIGluIGNvbmZpZy9vYmotKi5jICAgICAgIAorQGMgICAoNCkgICBwb3J0YWJsZSBkaXJlY3RpdmVzIGluIHBvdGFibGVbXSBpbiByZWFkLmMKK0BjICUqKnN0YXJ0IG9mIGhlYWRlcgorQHNldGZpbGVuYW1lIGFzLmluZm8KK0BjIC0tLWNvbmZpZy0tLQorQGMgZGVmYXVsdHMsIGNvbmZpZyBmaWxlIG1heSBvdmVycmlkZToKK0BzZXQgaGF2ZS1zdGFicworQGMgLS0tCitAaW5jbHVkZSBhc2NvbmZpZy50ZXhpCitAaW5jbHVkZSBnYXN2ZXIudGV4aQorQGMgLS0tCitAYyBjb21tb24gT1IgY29tYmluYXRpb25zIG9mIGNvbmRpdGlvbnMKK0BpZnNldCBBT1VUCitAc2V0IGFvdXQtYm91dAorQGVuZCBpZnNldAorQGlmc2V0IEFSTS9UaHVtYgorQHNldCBBUk0KK0BlbmQgaWZzZXQKK0BpZnNldCBCT1VUCitAc2V0IGFvdXQtYm91dAorQGVuZCBpZnNldAorQGlmc2V0IEg4LzMwMAorQHNldCBIOAorQGVuZCBpZnNldAorQGlmc2V0IEg4LzUwMAorQHNldCBIOAorQGVuZCBpZnNldAorQGlmc2V0IFNICitAc2V0IEg4CitAZW5kIGlmc2V0CitAaWZzZXQgSFBQQQorQHNldCBhYm5vcm1hbC1zZXBhcmF0b3IKK0BlbmQgaWZzZXQKK0BjIC0tLS0tLS0tLS0tLQorQGlmc2V0IEdFTkVSSUMKK0BzZXR0aXRsZSBVc2luZyBAdmFsdWV7QVN9CitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAc2V0dGl0bGUgVXNpbmcgQHZhbHVle0FTfSAoQHZhbHVle1RBUkdFVH0pCitAZW5kIGlmY2xlYXIKK0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKK0BjICUqKmVuZCBvZiBoZWFkZXIKKworQGMgQHNtYWxsYm9vaworQGMgQHNldCBTTUFMTAorQGMgV0FSRSEgU29tZSBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgc2VjdGlvbnMgY29udGFpbiB0YWJsZXMgb2YgbWFjaGluZQorQGMgaW5zdHJ1Y3Rpb25zLiAgRXhjZXB0IGluIG11bHRpLWNvbHVtbiBmb3JtYXQsIHRoZXNlIHRhYmxlcyBsb29rIHNpbGx5LgorQGMgVW5mb3J0dW5hdGVseSwgVGV4aW5mbyBkb2Vzbid0IGhhdmUgYSBnZW5lcmFsLXB1cnBvc2UgbXVsdGktY29sIGZvcm1hdCwgc28KK0BjIHRoZSBtdWx0aS1jb2wgZm9ybWF0IGlzIGZha2VkIHdpdGhpbiBAZXhhbXBsZSBzZWN0aW9ucy4KK0BjIAorQGMgQWdhaW4gdW5mb3J0dW5hdGVseSwgdGhlIG5hdHVyYWwgc2l6ZSB0aGF0IGZpdHMgb24gYSBwYWdlLCBmb3IgdGhlc2UgdGFibGVzLAorQGMgaXMgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCBzbWFsbGJvb2sgaXMgdHVybmVkIG9uLgorQGMgVGhpcyBtYXR0ZXJzLCBiZWNhdXNlIG9mIG9yZGVyOiB0ZXh0IGZsb3cgc3dpdGNoZXMgY29sdW1ucyBhdCBlYWNoIHBhZ2UKK0BjIGJyZWFrLgorQGMgCitAYyBUaGUgZm9ybWF0IGZha2VkIGluIHRoaXMgc291cmNlIHdvcmtzIHJlYXNvbmFibHkgd2VsbCBmb3Igc21hbGxib29rLAorQGMgbm90IHdlbGwgZm9yIHRoZSBkZWZhdWx0IGxhcmdlLXBhZ2UgZm9ybWF0LiAgVGhpcyBtYW51YWwgZXhwZWN0cyB0aGF0IGlmIHlvdQorQGMgdHVybiBvbiBAc21hbGxib29rLCB5b3Ugd2lsbCBhbHNvIHVuY29tbWVudCB0aGUgIkBzZXQgU01BTEwiIHRvIGVuYWJsZSB0aGUKK0BjIHRhYmxlcyBpbiBxdWVzdGlvbi4gIFlvdSBjYW4gdHVybiBvbiBvbmUgd2l0aG91dCB0aGUgb3RoZXIgYXQgeW91cgorQGMgZGlzY3JldGlvbiwgb2YgY291cnNlLiAKK0BpZmluZm8KK0BzZXQgU01BTEwKK0BjIHRoZSBpbnNuIHRhYmxlcyBsb29rIGp1c3QgYXMgc2lsbHkgaW4gaW5mbyBmaWxlcyByZWdhcmRsZXNzIG9mIHNtYWxsYm9vaywKK0BjIG1pZ2h0IGFzIHdlbGwgc2hvdyAnZW0gYW55d2F5cy4KK0BlbmQgaWZpbmZvCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIEFzOiAoYXMpLiAgICAgICAgICAgICAgICAgICAgIFRoZSBHTlUgYXNzZW1ibGVyLgorRU5ELUlORk8tRElSLUVOVFJZCitAZW5kIGZvcm1hdAorQGVuZCBpZmluZm8KKworQGZpbmFsb3V0CitAc3luY29kZWluZGV4IGt5IGNwCisKK0BpZmluZm8KK1RoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBBc3NlbWJsZXIgIkB2YWx1ZXtBU30iLgorCitDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKKyh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworQGVuZCBpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMgbWFudWFsCit1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlIHJlc3VsdGluZworZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0bwordGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIGlmaW5mbworCitAdGl0bGVwYWdlCitAdGl0bGUgVXNpbmcgQHZhbHVle0FTfQorQHN1YnRpdGxlIFRoZSBAc2N7Z251fSBBc3NlbWJsZXIKK0BpZmNsZWFyIEdFTkVSSUMKK0BzdWJ0aXRsZSBmb3IgdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseQorQGVuZCBpZmNsZWFyCitAc3AgMQorQHN1YnRpdGxlIFZlcnNpb24gQHZhbHVle1ZFUlNJT059CitAc3AgMQorQHNwIDEzCitUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEluYy4gIHRoYW5rcyBUaGUgTmljZSBDb21wdXRlcgorQ29tcGFueSBvZiBBdXN0cmFsaWEgZm9yIGxvYW5pbmcgRGVhbiBFbHNuZXIgdG8gd3JpdGUgdGhlCitmaXJzdCAoVmF4KSB2ZXJzaW9uIG9mIEBjb2Rle2FzfSBmb3IgUHJvamVjdCBAc2N7Z251fS4KK1RoZSBwcm9wcmlldG9ycywgbWFuYWdlbWVudCBhbmQgc3RhZmYgb2YgVE5DQ0EgdGhhbmsgRlNGIGZvcgorZGlzdHJhY3RpbmcgdGhlIGJvc3Mgd2hpbGUgdGhleSBnb3Qgc29tZSB3b3JrCitkb25lLgorQHNwIDMKK0BhdXRob3IgRGVhbiBFbHNuZXIsIEpheSBGZW5sYXNvbiAmIGZyaWVuZHMKK0BwYWdlCitAdGV4Cit7XHBhcnNraXA9MHB0CitcaGZpbGwge1xpdCBVc2luZyB7XHR0IEB2YWx1ZXtBU319fVxwYXIKK1xoZmlsbCBFZGl0ZWQgYnkgQ3lnbnVzIFN1cHBvcnRccGFyCit9CislImJveGl0IiBtYWNybyBmb3IgZmlndXJlczoKKyVNb2RpZmllZCBmcm9tIEtudXRoJ3MgYGBib3hpdCcnIG1hY3JvIGZyb20gVGVYYm9vayAoYW5zd2VyIHRvIGV4ZXJjaXNlIDIxLjMpCitcZ2RlZlxib3hpdCMxIzJ7XHZib3h7XGhydWxlXGhib3h7XHZydWxlXGtlcm4zcHQKKyAgICAgXHZib3h7XHBhcmluZGVudD0wcHRccGFyc2tpcD0wcHRcaHNpemU9IzFca2VybjNwdFxzdHJ1dFxoZmlsCisjMlxoZmlsXHN0cnV0XGtlcm4zcHR9XGtlcm4zcHRcdnJ1bGV9XGhydWxlfX0lYm94IHdpdGggdmlzaWJsZSBvdXRsaW5lCitcZ2RlZlxpYm94IzEjMntcaGJveCB0byAjMXsjMlxoZmlsfVxrZXJuOHB0fSUgaW52aXNpYmxlIGJveAorQGVuZCB0ZXgKKworQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMgbWFudWFsCit1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlIHJlc3VsdGluZworZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0bwordGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorCitAaWZpbmZvCitAbm9kZSBUb3AKK0B0b3AgVXNpbmcgQHZhbHVle0FTfQorCitUaGlzIGZpbGUgaXMgYSB1c2VyIGd1aWRlIHRvIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgQGNvZGV7QHZhbHVle0FTfX0gdmVyc2lvbgorQHZhbHVle1ZFUlNJT059LgorQGlmY2xlYXIgR0VORVJJQworVGhpcyB2ZXJzaW9uIG9mIHRoZSBmaWxlIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkIHRvIGdlbmVyYXRlCitjb2RlIGZvciBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgorQGVuZCBpZmNsZWFyCitAbWVudQorKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBPdmVydmlldworKiBJbnZva2luZzo6ICAgICAgICAgICAgICAgICAgICBDb21tYW5kLUxpbmUgT3B0aW9ucworKiBTeW50YXg6OiAgICAgICAgICAgICAgICAgICAgICBTeW50YXgKKyogU2VjdGlvbnM6OiAgICAgICAgICAgICAgICAgICAgU2VjdGlvbnMgYW5kIFJlbG9jYXRpb24KKyogU3ltYm9sczo6ICAgICAgICAgICAgICAgICAgICAgU3ltYm9scworKiBFeHByZXNzaW9uczo6ICAgICAgICAgICAgICAgICBFeHByZXNzaW9ucworKiBQc2V1ZG8gT3BzOjogICAgICAgICAgICAgICAgICBBc3NlbWJsZXIgRGlyZWN0aXZlcworKiBNYWNoaW5lIERlcGVuZGVuY2llczo6ICAgICAgICBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcworKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncworKiBBY2tub3dsZWRnZW1lbnRzOjogICAgICAgICAgICBXaG8gRGlkIFdoYXQKKyogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKK0BlbmQgbWVudQorQGVuZCBpZmluZm8KKworQG5vZGUgT3ZlcnZpZXcKK0BjaGFwdGVyIE92ZXJ2aWV3CitAaWZ0ZXgKK1RoaXMgbWFudWFsIGlzIGEgdXNlciBndWlkZSB0byB0aGUgQHNje2dudX0gYXNzZW1ibGVyIEBjb2Rle0B2YWx1ZXtBU319LgorQGlmY2xlYXIgR0VORVJJQworVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgZGVzY3JpYmVzIEBjb2Rle0B2YWx1ZXtBU319IGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUKK2NvZGUgZm9yIEB2YWx1ZXtUQVJHRVR9IGFyY2hpdGVjdHVyZXMuCitAZW5kIGlmY2xlYXIKK0BlbmQgaWZ0ZXgKKworQGNpbmRleCBpbnZvY2F0aW9uIHN1bW1hcnkKK0BjaW5kZXggb3B0aW9uIHN1bW1hcnkKK0BjaW5kZXggc3VtbWFyeSBvZiBvcHRpb25zCitIZXJlIGlzIGEgYnJpZWYgc3VtbWFyeSBvZiBob3cgdG8gaW52b2tlIEBjb2Rle0B2YWx1ZXtBU319LiAgRm9yIGRldGFpbHMsCitAcHhyZWZ7SW52b2tpbmcsLENvbWFuZC1MaW5lIE9wdGlvbnN9LgorCitAYyBXZSBkb24ndCB1c2UgZGVmZm4gYW5kIGZyaWVuZHMgZm9yIHRoZSBmb2xsb3dpbmcgYmVjYXVzZSB0aGV5IHNlZW0KK0BjIHRvIGJlIGxpbWl0ZWQgdG8gb25lIGxpbmUgZm9yIHRoZSBoZWFkZXIuCitAc21hbGxleGFtcGxlCitAdmFsdWV7QVN9IFsgLWFbY2RobG5zXVs9ZmlsZV0gXSBbIC1EIF0gIFsgLS1kZWZzeW0gQHZhcntzeW19PUB2YXJ7dmFsfSBdCisgWyAtZiBdIFsgLS1nc3RhYnMgXSBbIC0taGVscCBdIFsgLUkgQHZhcntkaXJ9IF0gWyAtSiBdIFsgLUsgXSBbIC1MIF0KKyBbIC0ta2VlcC1sb2NhbHMgXSBbIC1vIEB2YXJ7b2JqZmlsZX0gXSBbIC1SIF0gWyAtLXN0YXRpc3RpY3MgXSBbIC12IF0KKyBbIC12ZXJzaW9uIF0gWyAtLXZlcnNpb24gXSBbIC1XIF0gWyAtdyBdIFsgLXggXSBbIC1aIF0KK0BpZnNldCBBMjlLCitAYyBhbTI5ayBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMKK0BlbmQgaWZzZXQKK0BpZnNldCBBUkMKKyBbIC1tYmlnLWVuZGlhbiB8IC1tbGl0dGxlLWVuZGlhbiBdCitAZW5kIGlmc2V0CitAaWZzZXQgQVJNCisgWyAtbVthcm1dMSB8IC1tW2FybV0yIHwgLW1bYXJtXTI1MCB8IC1tW2FybV0zIHwgLW1bYXJtXTYgfCAtbVthcm1dN1t0XVtbZF1tW2ldXSBdCisgWyAtbVthcm1ddjIgfCAtbVthcm1ddjJhIHwgLW1bYXJtXXYzIHwgLW1bYXJtXXYzbSB8IC1tW2FybV12NCB8IC1tW2FybV12NHQgXQorIFsgLW10aHVtYiB8IC1tYWxsIF0KKyBbIC1tZnBhMTAgfCAtbWZwYTExIHwgLW1mcGUtb2xkIHwgLW1uby1mcHUgXQorIFsgLUVCIHwgLUVMIF0KKyBbIC1tYXBjcy0zMiB8IC1tYXBjcy0yNiBdCitAZW5kIGlmc2V0CitAaWZzZXQgRDEwVgorIFsgLU8gXQorQGVuZCBpZnNldAorQGlmc2V0IEQzMFYKKyBbIC1PIHwgLW4gfCAtTiBdCitAZW5kIGlmc2V0CitAaWZzZXQgSDgKK0BjIEhpdGFjaGkgZmFtaWx5IGNoaXBzIGhhdmUgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMKK0BlbmQgaWZzZXQKK0BpZnNldCBIUFBBCitAYyBIUFBBIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucyAoeWV0KS4KK0BlbmQgaWZzZXQKK0BpZnNldCBTUEFSQworQGMgVGhlIG9yZGVyIGhlcmUgaXMgaW1wb3J0YW50LiAgU2VlIGMtc3BhcmMudGV4aS4KKyBbIC1BdjYgfCAtQXY3IHwgLUF2OCB8IC1Bc3BhcmNsZXQgfCAtQXNwYXJjbGl0ZQorICAgLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEgXQorIFsgLXhhcmNoPXY4cGx1cyB8IC14YXJjaD12OHBsdXNhIF0gWyAtYnVtcCBdIFsgLTMyIHwgLTY0IF0KK0BlbmQgaWZzZXQKK0BpZnNldCBaODAwMAorQGMgWjgwMDAgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zCitAZW5kIGlmc2V0CitAaWZzZXQgSTk2MAorQGMgc2VlIG1kX3BhcnNlX29wdGlvbiBpbiB0Yy1pOTYwLmMKKyBbIC1BQ0EgfCAtQUNBX0EgfCAtQUNCIHwgLUFDQyB8IC1BS0EgfCAtQUtCIHwgLUFLQyB8IC1BTUMgXQorIFsgLWIgXSBbIC1uby1yZWxheCBdCitAZW5kIGlmc2V0CitAaWZzZXQgTTY4MFgwCisgWyAtbCBdIFsgLW02ODAwMCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLi4uIF0KK0BlbmQgaWZzZXQKK0BpZnNldCBNQ09SRQorIFsgLWpzcmkyYnNyIF0gWyAtc2lmaWx0ZXIgXSBbIC1yZWxheCBdCitAZW5kIGlmc2V0CitAaWZzZXQgTUlQUworIFsgLW5vY3BwIF0gWyAtRUwgXSBbIC1FQiBdIFsgLUcgQHZhcntudW19IF0gWyAtbWNwdT1AdmFye0NQVX0gXQorIFsgLW1pcHMxIF0gWyAtbWlwczIgXSBbIC1taXBzMyBdIFsgLW00NjUwIF0gWyAtbm8tbTQ2NTAgXQorIFsgLS10cmFwIF0gWyAtLWJyZWFrIF0KKyBbIC0tZW11bGF0aW9uPUB2YXJ7bmFtZX0gXQorQGVuZCBpZnNldAorIFsgLS0gfCBAdmFye2ZpbGVzfSBAZG90c3t9IF0KK0BlbmQgc21hbGxleGFtcGxlCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLWFbY2RobG1uc10KK1R1cm4gb24gbGlzdGluZ3MsIGluIGFueSBvZiBhIHZhcmlldHkgb2Ygd2F5czoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAtYWMKK29taXQgZmFsc2UgY29uZGl0aW9uYWxzCisKK0BpdGVtIC1hZAorb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlcworCitAaXRlbSAtYWgKK2luY2x1ZGUgaGlnaC1sZXZlbCBzb3VyY2UKKworQGl0ZW0gLWFsCitpbmNsdWRlIGFzc2VtYmx5CisKK0BpdGVtIC1hbQoraW5jbHVkZSBtYWNybyBleHBhbnNpb25zCisKK0BpdGVtIC1hbgorb21pdCBmb3JtcyBwcm9jZXNzaW5nCisKK0BpdGVtIC1hcworaW5jbHVkZSBzeW1ib2xzCisKK0BpdGVtID1maWxlCitzZXQgdGhlIG5hbWUgb2YgdGhlIGxpc3RpbmcgZmlsZQorQGVuZCB0YWJsZQorCitZb3UgbWF5IGNvbWJpbmUgdGhlc2Ugb3B0aW9uczsgZm9yIGV4YW1wbGUsIHVzZSBAc2FtcHstYWxufSBmb3IgYXNzZW1ibHkKK2xpc3Rpbmcgd2l0aG91dCBmb3JtcyBwcm9jZXNzaW5nLiAgVGhlIEBzYW1wez1maWxlfSBvcHRpb24sIGlmIHVzZWQsIG11c3QgYmUKK3RoZSBsYXN0IG9uZS4gIEJ5IGl0c2VsZiwgQHNhbXB7LWF9IGRlZmF1bHRzIHRvIEBzYW1wey1haGxzfS4KKworQGl0ZW0gLUQKK0lnbm9yZWQuICBUaGlzIG9wdGlvbiBpcyBhY2NlcHRlZCBmb3Igc2NyaXB0IGNvbXBhdGliaWxpdHkgd2l0aCBjYWxscyB0bworb3RoZXIgYXNzZW1ibGVycy4KKworQGl0ZW0gLS1kZWZzeW0gQHZhcntzeW19PUB2YXJ7dmFsdWV9CitEZWZpbmUgdGhlIHN5bWJvbCBAdmFye3N5bX0gdG8gYmUgQHZhcnt2YWx1ZX0gYmVmb3JlIGFzc2VtYmxpbmcgdGhlIGlucHV0IGZpbGUuCitAdmFye3ZhbHVlfSBtdXN0IGJlIGFuIGludGVnZXIgY29uc3RhbnQuICBBcyBpbiBDLCBhIGxlYWRpbmcgQHNhbXB7MHh9CitpbmRpY2F0ZXMgYSBoZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIGEgbGVhZGluZyBAc2FtcHswfSBpbmRpY2F0ZXMgYW4gb2N0YWwgdmFsdWUuCisKK0BpdGVtIC1mCitgYGZhc3QnJy0tLXNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudCBwcmVwcm9jZXNzaW5nIChhc3N1bWUgc291cmNlIGlzCitjb21waWxlciBvdXRwdXQpLgorCitAaXRlbSAtLWdzdGFicworR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGFzc2VtYmxlciBsaW5lLiAgVGhpcworbWF5IGhlbHAgZGVidWdnaW5nIGFzc2VtYmxlciBjb2RlLCBpZiB0aGUgZGVidWdnZXIgY2FuIGhhbmRsZSBpdC4KKworQGl0ZW0gLS1oZWxwCitQcmludCBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBleGl0LgorCitAaXRlbSAtSSBAdmFye2Rpcn0KK0FkZCBkaXJlY3RvcnkgQHZhcntkaXJ9IHRvIHRoZSBzZWFyY2ggbGlzdCBmb3IgQGNvZGV7LmluY2x1ZGV9IGRpcmVjdGl2ZXMuCisKK0BpdGVtIC1KCitEb24ndCB3YXJuIGFib3V0IHNpZ25lZCBvdmVyZmxvdy4KKworQGl0ZW0gLUsKK0BpZmNsZWFyIERJRkYtVEJMLUtMVUdFCitUaGlzIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LgorQGVuZCBpZmNsZWFyCitAaWZzZXQgRElGRi1UQkwtS0xVR0UKK0lzc3VlIHdhcm5pbmdzIHdoZW4gZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzLgorQGVuZCBpZnNldAorCitAaXRlbSAtTAorQGl0ZW14IC0ta2VlcC1sb2NhbHMKK0tlZXAgKGluIHRoZSBzeW1ib2wgdGFibGUpIGxvY2FsIHN5bWJvbHMuICBPbiB0cmFkaXRpb25hbCBhLm91dCBzeXN0ZW1zCit0aGVzZSBzdGFydCB3aXRoIEBzYW1we0x9LCBidXQgZGlmZmVyZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgbG9jYWwKK2xhYmVsIHByZWZpeGVzLgorCitAaXRlbSAtbyBAdmFye29iamZpbGV9CitOYW1lIHRoZSBvYmplY3QtZmlsZSBvdXRwdXQgZnJvbSBAY29kZXtAdmFsdWV7QVN9fSBAdmFye29iamZpbGV9LgorCitAaXRlbSAtUgorRm9sZCB0aGUgZGF0YSBzZWN0aW9uIGludG8gdGhlIHRleHQgc2VjdGlvbi4KKworQGl0ZW0gLS1zdGF0aXN0aWNzCitQcmludCB0aGUgbWF4aW11bSBzcGFjZSAoaW4gYnl0ZXMpIGFuZCB0b3RhbCB0aW1lIChpbiBzZWNvbmRzKSB1c2VkIGJ5Cithc3NlbWJseS4KKworQGl0ZW0gLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZQorUmVtb3ZlIGxvY2FsIGFic29sdXRlIHN5bWJvbHMgZnJvbSB0aGUgb3V0Z29pbmcgc3ltYm9sIHRhYmxlLgorCitAaXRlbSAtdgorQGl0ZW14IC12ZXJzaW9uCitQcmludCB0aGUgQGNvZGV7YXN9IHZlcnNpb24uCisKK0BpdGVtIC0tdmVyc2lvbgorUHJpbnQgdGhlIEBjb2Rle2FzfSB2ZXJzaW9uIGFuZCBleGl0LgorCitAaXRlbSAtVworU3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy4KKworQGl0ZW0gLXcKK0lnbm9yZWQuCisKK0BpdGVtIC14CitJZ25vcmVkLgorCitAaXRlbSAtWgorR2VuZXJhdGUgYW4gb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnMuCisKK0BpdGVtIC0tIHwgQHZhcntmaWxlc30gQGRvdHN7fQorU3RhbmRhcmQgaW5wdXQsIG9yIHNvdXJjZSBmaWxlcyB0byBhc3NlbWJsZS4KKworQGVuZCB0YWJsZQorCitAaWZzZXQgQVJDCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKK2FuIEFSQyBwcm9jZXNzb3IuCisKK0B0YWJsZSBAY29kZQorCitAY2luZGV4IEFSQyBlbmRpYW5uZXNzCitAY2luZGV4IGVuZGlhbm5lc3MsIEFSQworQGNpbmRleCBiaWcgZW5kaWFuIG91dHB1dCwgQVJDCitAaXRlbSAtbWJpZy1lbmRpYW4KK0dlbmVyYXRlIGBgYmlnIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCisKK0BjaW5kZXggbGl0dGxlIGVuZGlhbiBvdXRwdXQsIEFSQworQGl0ZW0gLW1saXR0bGUtZW5kaWFuCitHZW5lcmF0ZSBgYGxpdHRsZSBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgorCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBBUk0KK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUgQVJNCitwcm9jZXNzb3IgZmFtaWx5LgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1tW2FybV0xIHwgLW1bYXJtXTIgfCAtbVthcm1dMjUwIHwgLW1bYXJtXTMgfCAtbVthcm1dNiB8IC1tW2FybV03W3RdW1tkXW1dIHwgLW1bYXJtXXYyIHwgLW1bYXJtXXYyYSB8IC1tW2FybV12MyB8IC1tW2FybV12M20gfCAtbVthcm1ddjQgfCAtbVthcm1ddjR0IAorU3BlY2lmeSB3aGljaCB2YXJpYW50IG9mIHRoZSBBUk0gYXJjaGl0ZWN0dXJlIGlzIHRoZSB0YXJnZXQuCitAaXRlbSAtbXRodW1iIHwgLW1hbGwKK0VuYWJsZSBvciBkaXNhYmxlIFRodW1iIG9ubHkgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuCitAaXRlbSAtbWZwYTEwIHwgLW1mcGExMSB8IC1tZnBlLW9sZCB8IC1tbm8tZnB1CitTZWxlY3Qgd2hpY2ggRmxvYXRpbmcgUG9pbnQgYXJjaGl0Y3R1cmUgaXMgdGhlIHRhcmdldC4KK0BpdGVtIC1tYXBjcy0zMiB8IC1tYXBjcy0yNgorU2VsZWN0IHdoaWNoIHByb2NlZHVyZSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgaW4gdXNlLgorQGl0ZW0gLUVCIHwgLUVMCitTZWxlY3QgZWl0aGVyIGJpZy1lbmRpYW4gKC1FQikgb3IgbGl0dGxlLWVuZGlhbiAoLUVMKSBvdXRwdXQuCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBEMTBWCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKK2EgRDEwViBwcm9jZXNzb3IuCitAdGFibGUgQGNvZGUKK0BjaW5kZXggRDEwViBvcHRpbWl6YXRpb24KK0BjaW5kZXggb3B0aW1pemF0aW9uLCBEMTBWCitAaXRlbSAtTworT3B0aW1pemUgb3V0cHV0IGJ5IHBhcmFsbGVsaXppbmcgaW5zdHJ1Y3Rpb25zLgorQGVuZCB0YWJsZQorQGVuZCBpZnNldAorCitAaWZzZXQgRDMwVgorVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIGEgRDMwVgorcHJvY2Vzc29yLgorQHRhYmxlIEBjb2RlCitAY2luZGV4IEQzMFYgb3B0aW1pemF0aW9uCitAY2luZGV4IG9wdGltaXphdGlvbiwgRDMwVgorQGl0ZW0gLU8KK09wdGltaXplIG91dHB1dCBieSBwYXJhbGxlbGl6aW5nIGluc3RydWN0aW9ucy4KKworQGNpbmRleCBEMzBWIG5vcHMKK0BpdGVtIC1uCitXYXJuIHdoZW4gbm9wcyBhcmUgZ2VuZXJhdGVkLgorCitAY2luZGV4IEQzMFYgbm9wcyBhZnRlciAzMi1iaXQgbXVsdGlwbHkKK0BpdGVtIC1OCitXYXJuIHdoZW4gYSBub3AgYWZ0ZXIgYSAzMi1iaXQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24gaXMgZ2VuZXJhdGVkLgorQGVuZCB0YWJsZQorQGVuZCBpZnNldAorCitAaWZzZXQgSTk2MAorVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZQorSW50ZWwgODA5NjAgcHJvY2Vzc29yLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1BQ0EgfCAtQUNBX0EgfCAtQUNCIHwgLUFDQyB8IC1BS0EgfCAtQUtCIHwgLUFLQyB8IC1BTUMKK1NwZWNpZnkgd2hpY2ggdmFyaWFudCBvZiB0aGUgOTYwIGFyY2hpdGVjdHVyZSBpcyB0aGUgdGFyZ2V0LgorCitAaXRlbSAtYgorQWRkIGNvZGUgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IGJyYW5jaGVzIHRha2VuLgorCitAaXRlbSAtbm8tcmVsYXgKK0RvIG5vdCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHM7CitlcnJvciBpZiBuZWNlc3NhcnkuCisKK0BlbmQgdGFibGUKK0BlbmQgaWZzZXQKKworCitAaWZzZXQgTTY4MFgwCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlCitNb3Rvcm9sYSA2ODAwMCBzZXJpZXMuCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSAtbAorU2hvcnRlbiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLCB0byBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3by4KKworQGl0ZW0gLW02ODAwMCB8IC1tNjgwMDggfCAtbTY4MDEwIHwgLW02ODAyMCB8IC1tNjgwMzAgfCAtbTY4MDQwIHwgLW02ODA2MAorQGl0ZW14IHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbWNwdTMyIHwgLW01MjAwCitTcGVjaWZ5IHdoYXQgcHJvY2Vzc29yIGluIHRoZSA2ODAwMCBmYW1pbHkgaXMgdGhlIHRhcmdldC4gIFRoZSBkZWZhdWx0CitpcyBub3JtYWxseSB0aGUgNjgwMjAsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkIGF0IGNvbmZpZ3VyYXRpb24gdGltZS4KKworQGl0ZW0gLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MgorVGhlIHRhcmdldCBtYWNoaW5lIGRvZXMgKG9yIGRvZXMgbm90KSBoYXZlIGEgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3IuCitUaGUgZGVmYXVsdCBpcyB0byBhc3N1bWUgYSBjb3Byb2Nlc3NvciBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzIuICBBbHRob3VnaAordGhlIGJhc2ljIDY4MDAwIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIDY4ODgxLCBhIGNvbWJpbmF0aW9uIG9mIHRoZQordHdvIGNhbiBiZSBzcGVjaWZpZWQsIHNpbmNlIGl0J3MgcG9zc2libGUgdG8gZG8gZW11bGF0aW9uIG9mIHRoZQorY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIG1haW4gcHJvY2Vzc29yLgorCitAaXRlbSAtbTY4ODUxIHwgLW1uby02ODg1MQorVGhlIHRhcmdldCBtYWNoaW5lIGRvZXMgKG9yIGRvZXMgbm90KSBoYXZlIGEgbWVtb3J5LW1hbmFnZW1lbnQKK3VuaXQgY29wcm9jZXNzb3IuICBUaGUgZGVmYXVsdCBpcyB0byBhc3N1bWUgYW4gTU1VIGZvciA2ODAyMCBhbmQgdXAuCisKK0BlbmQgdGFibGUKK0BlbmQgaWZzZXQKKworQGlmc2V0IFNQQVJDCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQKK2ZvciB0aGUgU1BBUkMgYXJjaGl0ZWN0dXJlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1BdjYgfCAtQXY3IHwgLUF2OCB8IC1Bc3BhcmNsZXQgfCAtQXNwYXJjbGl0ZQorQGl0ZW14IC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhCitFeHBsaWNpdGx5IHNlbGVjdCBhIHZhcmlhbnQgb2YgdGhlIFNQQVJDIGFyY2hpdGVjdHVyZS4KKworQHNhbXB7LUF2OHBsdXN9IGFuZCBAc2FtcHstQXY4cGx1c2F9IHNlbGVjdCBhIDMyIGJpdCBlbnZpcm9ubWVudC4KK0BzYW1wey1Bdjl9IGFuZCBAc2FtcHstQXY5YX0gc2VsZWN0IGEgNjQgYml0IGVudmlyb25tZW50LgorCitAc2FtcHstQXY4cGx1c2F9IGFuZCBAc2FtcHstQXY5YX0gZW5hYmxlIHRoZSBTUEFSQyBWOSBpbnN0cnVjdGlvbiBzZXQgd2l0aAorVWx0cmFTUEFSQyBleHRlbnNpb25zLgorCitAaXRlbSAteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2EKK0ZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgdjkgYXNzZW1ibGVyLiAgVGhlc2Ugb3B0aW9ucyBhcmUKK2VxdWl2YWxlbnQgdG8gLUF2OHBsdXMgYW5kIC1BdjhwbHVzYSwgcmVzcGVjdGl2ZWx5LgorCitAaXRlbSAtYnVtcAorV2FybiB3aGVuIHRoZSBhc3NlbWJsZXIgc3dpdGNoZXMgdG8gYW5vdGhlciBhcmNoaXRlY3R1cmUuCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBNSVBTCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKK2EgTUlQUyBwcm9jZXNzb3IuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLUcgQHZhcntudW19CitUaGlzIG9wdGlvbiBzZXRzIHRoZSBsYXJnZXN0IHNpemUgb2YgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQKK2ltcGxpY2l0bHkgd2l0aCB0aGUgQGNvZGV7Z3B9IHJlZ2lzdGVyLiAgSXQgaXMgb25seSBhY2NlcHRlZCBmb3IgdGFyZ2V0cyB0aGF0Cit1c2UgRUNPRkYgZm9ybWF0LCBzdWNoIGFzIGEgREVDc3RhdGlvbiBydW5uaW5nIFVsdHJpeC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguCisKK0BjaW5kZXggTUlQUyBlbmRpYW5uZXNzCitAY2luZGV4IGVuZGlhbm5lc3MsIE1JUFMKK0BjaW5kZXggYmlnIGVuZGlhbiBvdXRwdXQsIE1JUFMKK0BpdGVtIC1FQgorR2VuZXJhdGUgYGBiaWcgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KKworQGNpbmRleCBsaXR0bGUgZW5kaWFuIG91dHB1dCwgTUlQUworQGl0ZW0gLUVMCitHZW5lcmF0ZSBgYGxpdHRsZSBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgorCitAY2luZGV4IE1JUFMgSVNBCitAaXRlbSAtbWlwczEKK0BpdGVteCAtbWlwczIKK0BpdGVteCAtbWlwczMKK0dlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwuCitAc2FtcHstbWlwczF9IGNvcnJlc3BvbmRzIHRvIHRoZSBAc2N7cjIwMDB9IGFuZCBAc2N7cjMwMDB9IHByb2Nlc3NvcnMsCitAc2FtcHstbWlwczJ9IHRvIHRoZSBAc2N7cjYwMDB9IHByb2Nlc3NvciwgYW5kIEBzYW1wey1taXBzM30gdG8gdGhlIEBzY3tyNDAwMH0KK3Byb2Nlc3Nvci4KKworQGl0ZW0gLW00NjUwCitAaXRlbXggLW5vLW00NjUwCitHZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyBAc2N7cjQ2NTB9IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0Cit0aGUgQHNhbXB7bWFkfSBhbmQgQHNhbXB7bWFkdX0gaW5zdHJ1Y3Rpb24sIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfQoraW5zdHJ1Y3Rpb25zIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLgorQHNhbXB7LW5vLW00NjUwfSB0dXJucyBvZmYgdGhpcyBvcHRpb24uCisKK0BpdGVtIC1tY3B1PUB2YXJ7Q1BVfQorR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgY3B1LiAgVGhpcyBoYXMgbGl0dGxlIGVmZmVjdCBvbiB0aGUKK2Fzc2VtYmxlciwgYnV0IGl0IGlzIHBhc3NlZCBieSBAY29kZXtAdmFsdWV7R0NDfX0uCisKK0BjaW5kZXggZW11bGF0aW9uCitAaXRlbSAtLWVtdWxhdGlvbj1AdmFye25hbWV9CitUaGlzIG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZW11bGF0ZSBAY29kZXtAdmFsdWV7QVN9fSBjb25maWd1cmVkCitmb3Igc29tZSBvdGhlciB0YXJnZXQsIGluIGFsbCByZXNwZWN0cywgaW5jbHVkaW5nIG91dHB1dCBmb3JtYXQgKGNob29zaW5nCitiZXR3ZWVuIEVMRiBhbmQgRUNPRkYgb25seSksIGhhbmRsaW5nIG9mIHBzZXVkby1vcGNvZGVzIHdoaWNoIG1heSBnZW5lcmF0ZQorZGVidWdnaW5nIGluZm9ybWF0aW9uIG9yIHN0b3JlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiwgYW5kIGRlZmF1bHQKK2VuZGlhbm5lc3MuICBUaGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gbmFtZXMgYXJlOiBAc2FtcHttaXBzZWNvZmZ9LAorQHNhbXB7bWlwc2VsZn0sIEBzYW1we21pcHNsZWNvZmZ9LCBAc2FtcHttaXBzYmVjb2ZmfSwgQHNhbXB7bWlwc2xlbGZ9LAorQHNhbXB7bWlwc2JlbGZ9LiAgVGhlIGZpcnN0IHR3byBkbyBub3QgYWx0ZXIgdGhlIGRlZmF1bHQgZW5kaWFubmVzcyBmcm9tIHRoYXQKK29mIHRoZSBwcmltYXJ5IHRhcmdldCBmb3Igd2hpY2ggdGhlIGFzc2VtYmxlciB3YXMgY29uZmlndXJlZDsgdGhlIG90aGVycyBjaGFuZ2UKK3RoZSBkZWZhdWx0IHRvIGxpdHRsZS0gb3IgYmlnLWVuZGlhbiBhcyBpbmRpY2F0ZWQgYnkgdGhlIEBzYW1we2J9IG9yIEBzYW1we2x9CitpbiB0aGUgbmFtZS4gIFVzaW5nIEBzYW1wey1FQn0gb3IgQHNhbXB7LUVMfSB3aWxsIG92ZXJyaWRlIHRoZSBlbmRpYW5uZXNzCitzZWxlY3Rpb24gaW4gYW55IGNhc2UuCisKK1RoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSB3aGVuIHRoZSBwcmltYXJ5IHRhcmdldAorQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgaXMgYSBNSVBTIEVMRiBvciBFQ09GRiB0YXJnZXQuCitGdXJ0aGVybW9yZSwgdGhlIHByaW1hcnkgdGFyZ2V0IG9yIG90aGVycyBzcGVjaWZpZWQgd2l0aAorQHNhbXB7LS1lbmFibGUtdGFyZ2V0cz1AZG90c3t9fSBhdCBjb25maWd1cmF0aW9uIHRpbWUgbXVzdCBpbmNsdWRlIHN1cHBvcnQgZm9yCit0aGUgb3RoZXIgZm9ybWF0LCBpZiBib3RoIGFyZSB0byBiZSBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwgdGhlIElyaXggNQorY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzdXBwb3J0IGZvciBib3RoLgorCitFdmVudHVhbGx5LCB0aGlzIG9wdGlvbiB3aWxsIHN1cHBvcnQgbW9yZSBjb25maWd1cmF0aW9ucywgd2l0aCBtb3JlCitmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHRoZSBhc3NlbWJsZXIncyBiZWhhdmlvciwgYW5kIHdpbGwgYmUgc3VwcG9ydGVkIGZvcgorbW9yZSBwcm9jZXNzb3JzLgorCitAaXRlbSAtbm9jcHAKK0Bjb2Rle0B2YWx1ZXtBU319IGlnbm9yZXMgdGhpcyBvcHRpb24uICBJdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCit0aGUgbmF0aXZlIHRvb2xzLgorCitAbmVlZCA5MDAKK0BpdGVtIC0tdHJhcAorQGl0ZW14IC0tbm8tdHJhcAorQGl0ZW14IC0tYnJlYWsKK0BpdGVteCAtLW5vLWJyZWFrCitDb250cm9sIGhvdyB0byBkZWFsIHdpdGggbXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgYW5kIGRpdmlzaW9uIGJ5IHplcm8uCitAc2FtcHstLXRyYXB9IG9yIEBzYW1wey0tbm8tYnJlYWt9ICh3aGljaCBhcmUgc3lub255bXMpIHRha2UgYSB0cmFwIGV4Y2VwdGlvbgorKGFuZCBvbmx5IHdvcmsgZm9yIEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgMiBhbmQgaGlnaGVyKTsKK0BzYW1wey0tYnJlYWt9IG9yIEBzYW1wey0tbm8tdHJhcH0gKGFsc28gc3lub255bXMsIGFuZCB0aGUgZGVmYXVsdCkgdGFrZSBhCiticmVhayBleGNlcHRpb24uCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBNQ09SRQorVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yCithbiBNQ29yZSBwcm9jZXNzb3IuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLWpzcmkyYnNyCitAaXRlbXggLW5vanNyaTJic3IKK0VuYWJsZSBvciBkaXNhYmxlIHRoZSBKU1JJIHRvIEJTUiB0cmFuc2Zvcm1hdGlvbi4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBlbmFibGVkLgorVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gQHNhbXB7LW5vanNyaTJic3J9IGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgaXQuCisKK0BpdGVtIC1zaWZpbHRlcgorQGl0ZW14IC1ub3NpZmlsdGVyCitFbmFibGUgb3IgZGlzYWJsZSB0aGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3VyLiAgQnkgZGVmYXVsdCB0aGlzIGlzIGRpc2FibGVkLgorVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJpZGRlbiBieSB0aGUgQHNhbXB7LXNpZmlsdGVyfSBjb21tYW5kIGxpbmUgb3B0aW9uLgorCitAaXRlbSAtcmVsYXgKK0FsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHMuCisKKworQGVuZCB0YWJsZQorQGVuZCBpZnNldAorCitAbWVudQorKiBNYW51YWw6OiAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUgb2YgdGhpcyBNYW51YWwKKyogR05VIEFzc2VtYmxlcjo6ICAgICAgICAgICAgICAgVGhlIEdOVSBBc3NlbWJsZXIKKyogT2JqZWN0IEZvcm1hdHM6OiAgICAgICAgICAgICAgT2JqZWN0IEZpbGUgRm9ybWF0cworKiBDb21tYW5kIExpbmU6OiAgICAgICAgICAgICAgICBDb21tYW5kIExpbmUKKyogSW5wdXQgRmlsZXM6OiAgICAgICAgICAgICAgICAgSW5wdXQgRmlsZXMKKyogT2JqZWN0OjogICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IChPYmplY3QpIEZpbGUKKyogRXJyb3JzOjogICAgICAgICAgICAgICAgICAgICAgRXJyb3IgYW5kIFdhcm5pbmcgTWVzc2FnZXMKK0BlbmQgbWVudQorCitAbm9kZSBNYW51YWwKK0BzZWN0aW9uIFN0cnVjdHVyZSBvZiB0aGlzIE1hbnVhbAorCitAY2luZGV4IG1hbnVhbCwgc3RydWN0dXJlIGFuZCBwdXJwb3NlCitUaGlzIG1hbnVhbCBpcyBpbnRlbmRlZCB0byBkZXNjcmliZSB3aGF0IHlvdSBuZWVkIHRvIGtub3cgdG8gdXNlCitAc2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fS4gIFdlIGNvdmVyIHRoZSBzeW50YXggZXhwZWN0ZWQgaW4gc291cmNlIGZpbGVzLCBpbmNsdWRpbmcKK25vdGF0aW9uIGZvciBzeW1ib2xzLCBjb25zdGFudHMsIGFuZCBleHByZXNzaW9uczsgdGhlIGRpcmVjdGl2ZXMgdGhhdAorQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHM7IGFuZCBvZiBjb3Vyc2UgaG93IHRvIGludm9rZSBAY29kZXtAdmFsdWV7QVN9fS4KKworQGlmY2xlYXIgR0VORVJJQworV2UgYWxzbyBjb3ZlciBzcGVjaWFsIGZlYXR1cmVzIGluIHRoZSBAdmFsdWV7VEFSR0VUfQorY29uZmlndXJhdGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSwgaW5jbHVkaW5nIGFzc2VtYmxlciBkaXJlY3RpdmVzLgorQGVuZCBpZmNsZWFyCitAaWZzZXQgR0VORVJJQworVGhpcyBtYW51YWwgYWxzbyBkZXNjcmliZXMgc29tZSBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgZmVhdHVyZXMgb2YKK3ZhcmlvdXMgZmxhdm9ycyBvZiB0aGUgYXNzZW1ibGVyLgorQGVuZCBpZnNldAorCitAY2luZGV4IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIChub3QgY292ZXJlZCkKK09uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG1hbnVhbCBpcyBAZW1waHtub3R9IGludGVuZGVkIGFzIGFuIGludHJvZHVjdGlvbgordG8gcHJvZ3JhbW1pbmcgaW4gYXNzZW1ibHkgbGFuZ3VhZ2UtLS1sZXQgYWxvbmUgcHJvZ3JhbW1pbmcgaW4gZ2VuZXJhbCEKK0luIGEgc2ltaWxhciB2ZWluLCB3ZSBtYWtlIG5vIGF0dGVtcHQgdG8gaW50cm9kdWNlIHRoZSBtYWNoaW5lCithcmNoaXRlY3R1cmU7IHdlIGRvIEBlbXBoe25vdH0gZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIHNldCwgc3RhbmRhcmQKK21uZW1vbmljcywgcmVnaXN0ZXJzIG9yIGFkZHJlc3NpbmcgbW9kZXMgdGhhdCBhcmUgc3RhbmRhcmQgdG8gYQorcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCitAaWZzZXQgR0VORVJJQworWW91IG1heSB3YW50IHRvIGNvbnN1bHQgdGhlIG1hbnVmYWN0dXJlcidzCittYWNoaW5lIGFyY2hpdGVjdHVyZSBtYW51YWwgZm9yIHRoaXMgaW5mb3JtYXRpb24uCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAaWZzZXQgSDgvMzAwCitGb3IgaW5mb3JtYXRpb24gb24gdGhlIEg4LzMwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle0g4LzMwMAorU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgQURFLS02MDItLTAyNSkuICBGb3IgdGhlIEg4LzMwMEgsCitzZWUgQGNpdGV7SDgvMzAwSCBTZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSkuCitAZW5kIGlmc2V0CitAaWZzZXQgSDgvNTAwCitGb3IgaW5mb3JtYXRpb24gb24gdGhlIEg4LzUwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle0g4LzUwMAorU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgTTIxVDAwMSkuCitAZW5kIGlmc2V0CitAaWZzZXQgU0gKK0ZvciBpbmZvcm1hdGlvbiBvbiB0aGUgSGl0YWNoaSBTSCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCitAY2l0ZXtTSC1NaWNyb2NvbXB1dGVyIFVzZXIncyBNYW51YWx9IChIaXRhY2hpIE1pY3JvIFN5c3RlbXMsIEluYy4pLgorQGVuZCBpZnNldAorQGlmc2V0IFo4MDAwCitGb3IgaW5mb3JtYXRpb24gb24gdGhlIFo4MDAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7WjgwMDAgQ1BVIFRlY2huaWNhbCBNYW51YWx9CitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQGMgSSB0aGluayB0aGlzIGlzIHByZW1hdHVyZS0tLWRvY0BjeWdudXMuY29tLCAxN2phbjE5OTEKK0BpZ25vcmUKK1Rocm91Z2hvdXQgdGhpcyBtYW51YWwsIHdlIGFzc3VtZSB0aGF0IHlvdSBhcmUgcnVubmluZyBAZGZue0dOVX0sCit0aGUgcG9ydGFibGUgb3BlcmF0aW5nIHN5c3RlbSBmcm9tIHRoZSBAZGZue0ZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy59LiAgVGhpcyByZXN0cmljdHMgb3VyIGF0dGVudGlvbiB0byBjZXJ0YWluIGtpbmRzIG9mCitjb21wdXRlciAoaW4gcGFydGljdWxhciwgdGhlIGtpbmRzIG9mIGNvbXB1dGVycyB0aGF0IEBzY3tnbnV9IGNhbiBydW4gb24pOworb25jZSB0aGlzIGFzc3VtcHRpb24gaXMgZ3JhbnRlZCBleGFtcGxlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZCBsZXNzCitxdWFsaWZpY2F0aW9uLgorCitAY29kZXtAdmFsdWV7QVN9fSBpcyBwYXJ0IG9mIGEgdGVhbSBvZiBwcm9ncmFtcyB0aGF0IHR1cm4gYSBoaWdoLWxldmVsCitodW1hbi1yZWFkYWJsZSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zIGludG8gYSBsb3ctbGV2ZWwKK2NvbXB1dGVyLXJlYWRhYmxlIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMuICBEaWZmZXJlbnQgdmVyc2lvbnMgb2YKK0Bjb2Rle0B2YWx1ZXtBU319IGFyZSB1c2VkIGZvciBkaWZmZXJlbnQga2luZHMgb2YgY29tcHV0ZXIuCitAZW5kIGlnbm9yZQorCitAYyBUaGVyZSB1c2VkIHRvIGJlIGEgc2VjdGlvbiAiVGVybWlub2xvZ3kiIGhlcmUsIHdoaWNoIGRlZmluZWQKK0BjICJjb250ZW50cyIsICJieXRlIiwgIndvcmQiLCBhbmQgImxvbmciLiAgRGVmaW5pbmcgIndvcmQiIHRvIGFueQorQGMgcGFydGljdWxhciBzaXplIGlzIGNvbmZ1c2luZyB3aGVuIHRoZSAud29yZCBkaXJlY3RpdmUgbWF5IGdlbmVyYXRlIDE2CitAYyBiaXRzIG9uIG9uZSBtYWNoaW5lIGFuZCAzMiBiaXRzIG9uIGFub3RoZXI7IGluIGdlbmVyYWwsIGZvciB0aGUgdXNlcgorQGMgdmVyc2lvbiBvZiB0aGlzIG1hbnVhbCwgbm9uZSBvZiB0aGVzZSB0ZXJtcyBzZWVtIGVzc2VudGlhbCB0byBkZWZpbmUuCitAYyBUaGV5IHdlcmUgdXNlZCB2ZXJ5IGxpdHRsZSBldmVuIGluIHRoZSBmb3JtZXIgZHJhZnQgb2YgdGhlIG1hbnVhbDsKK0BjIHRoaXMgZHJhZnQgbWFrZXMgYW4gZWZmb3J0IHRvIGF2b2lkIHRoZW0gKGV4Y2VwdCBpbiBuYW1lcyBvZgorQGMgZGlyZWN0aXZlcykuCisKK0Bub2RlIEdOVSBBc3NlbWJsZXIKK0BzZWN0aW9uIFRoZSBHTlUgQXNzZW1ibGVyCisKK0BzY3tnbnV9IEBjb2Rle2FzfSBpcyByZWFsbHkgYSBmYW1pbHkgb2YgYXNzZW1ibGVycy4KK0BpZmNsZWFyIEdFTkVSSUMKK1RoaXMgbWFudWFsIGRlc2NyaWJlcyBAY29kZXtAdmFsdWV7QVN9fSwgYSBtZW1iZXIgb2YgdGhhdCBmYW1pbHkgd2hpY2ggaXMKK2NvbmZpZ3VyZWQgZm9yIHRoZSBAdmFsdWV7VEFSR0VUfSBhcmNoaXRlY3R1cmVzLgorQGVuZCBpZmNsZWFyCitJZiB5b3UgdXNlIChvciBoYXZlIHVzZWQpIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgb24gb25lIGFyY2hpdGVjdHVyZSwgeW91CitzaG91bGQgZmluZCBhIGZhaXJseSBzaW1pbGFyIGVudmlyb25tZW50IHdoZW4geW91IHVzZSBpdCBvbiBhbm90aGVyCithcmNoaXRlY3R1cmUuICBFYWNoIHZlcnNpb24gaGFzIG11Y2ggaW4gY29tbW9uIHdpdGggdGhlIG90aGVycywKK2luY2x1ZGluZyBvYmplY3QgZmlsZSBmb3JtYXRzLCBtb3N0IGFzc2VtYmxlciBkaXJlY3RpdmVzIChvZnRlbiBjYWxsZWQKK0BkZm57cHNldWRvLW9wc30pIGFuZCBhc3NlbWJsZXIgc3ludGF4LkByZWZpbGwKKworQGNpbmRleCBwdXJwb3NlIG9mIEBzY3tnbnV9IGFzc2VtYmxlcgorQGNvZGV7QHZhbHVle0FTfX0gaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGFzc2VtYmxlIHRoZSBvdXRwdXQgb2YgdGhlCitAc2N7Z251fSBDIGNvbXBpbGVyIEBjb2Rle0B2YWx1ZXtHQ0N9fSBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIKK0Bjb2Rle0B2YWx1ZXtMRH19LiAgTmV2ZXJ0aGVsZXNzLCB3ZSd2ZSB0cmllZCB0byBtYWtlIEBjb2Rle0B2YWx1ZXtBU319Cithc3NlbWJsZSBjb3JyZWN0bHkgZXZlcnl0aGluZyB0aGF0IG90aGVyIGFzc2VtYmxlcnMgZm9yIHRoZSBzYW1lCittYWNoaW5lIHdvdWxkIGFzc2VtYmxlLgorQGlmc2V0IFZBWAorQW55IGV4Y2VwdGlvbnMgYXJlIGRvY3VtZW50ZWQgZXhwbGljaXRseSAoQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSkuCitAZW5kIGlmc2V0CitAaWZzZXQgTTY4MFgwCitAYyBUaGlzIHJlbWFyayBzaG91bGQgYXBwZWFyIGluIGdlbmVyaWMgdmVyc2lvbiBvZiBtYW51YWw7IGFzc3VtcHRpb24KK0BjIGhlcmUgaXMgdGhhdCBnZW5lcmljIHZlcnNpb24gc2V0cyBNNjgweDAuCitUaGlzIGRvZXNuJ3QgbWVhbiBAY29kZXtAdmFsdWV7QVN9fSBhbHdheXMgdXNlcyB0aGUgc2FtZSBzeW50YXggYXMgYW5vdGhlcgorYXNzZW1ibGVyIGZvciB0aGUgc2FtZSBhcmNoaXRlY3R1cmU7IGZvciBleGFtcGxlLCB3ZSBrbm93IG9mIHNldmVyYWwKK2luY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiA2ODB4MCBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXguCitAZW5kIGlmc2V0CisKK1VubGlrZSBvbGRlciBhc3NlbWJsZXJzLCBAY29kZXtAdmFsdWV7QVN9fSBpcyBkZXNpZ25lZCB0byBhc3NlbWJsZSBhIHNvdXJjZQorcHJvZ3JhbSBpbiBvbmUgcGFzcyBvZiB0aGUgc291cmNlIGZpbGUuICBUaGlzIGhhcyBhIHN1YnRsZSBpbXBhY3Qgb24gdGhlCitAa2Jkey5vcmd9IGRpcmVjdGl2ZSAoQHB4cmVme09yZywsQGNvZGV7Lm9yZ319KS4KKworQG5vZGUgT2JqZWN0IEZvcm1hdHMKK0BzZWN0aW9uIE9iamVjdCBGaWxlIEZvcm1hdHMKKworQGNpbmRleCBvYmplY3QgZmlsZSBmb3JtYXQKK1RoZSBAc2N7Z251fSBhc3NlbWJsZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBzZXZlcmFsIGFsdGVybmF0aXZlCitvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHRoaXMgZG9lcyBub3QgYWZmZWN0IGhvdyB5b3UKK3dyaXRlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1zOyBidXQgZGlyZWN0aXZlcyBmb3IgZGVidWdnaW5nIHN5bWJvbHMKK2FyZSB0eXBpY2FsbHkgZGlmZmVyZW50IGluIGRpZmZlcmVudCBmaWxlIGZvcm1hdHMuICBAeHJlZntTeW1ib2wKK0F0dHJpYnV0ZXMsLFN5bWJvbCBBdHRyaWJ1dGVzfS4KK0BpZmNsZWFyIEdFTkVSSUMKK0BpZmNsZWFyIE1VTFRJLU9CSgorT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIHRvIHByb2R1Y2UKK0B2YWx1ZXtPQkotTkFNRX0gZm9ybWF0IG9iamVjdCBmaWxlcy4KK0BlbmQgaWZjbGVhcgorQGMgVGhlIGZvbGxvd2luZyBzaG91bGQgZXhoYXVzdCBhbGwgY29uZmlncyB0aGF0IHNldCBNVUxUSS1PQkosIGlkZWFsbHkKK0BpZnNldCBBMjlLCitPbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCitAY29kZXthLm91dH0gb3IgQ09GRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgorQGVuZCBpZnNldAorQGlmc2V0IEk5NjAKK09uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKK0Bjb2Rle2Iub3V0fSBvciBDT0ZGIGZvcm1hdCBvYmplY3QgZmlsZXMuCitAZW5kIGlmc2V0CitAaWZzZXQgSFBQQQorT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgorU09NIG9yIEVMRiBmb3JtYXQgb2JqZWN0IGZpbGVzLgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCisKK0Bub2RlIENvbW1hbmQgTGluZQorQHNlY3Rpb24gQ29tbWFuZCBMaW5lCisKK0BjaW5kZXggY29tbWFuZCBsaW5lIGNvbnZlbnRpb25zCitBZnRlciB0aGUgcHJvZ3JhbSBuYW1lIEBjb2Rle0B2YWx1ZXtBU319LCB0aGUgY29tbWFuZCBsaW5lIG1heSBjb250YWluCitvcHRpb25zIGFuZCBmaWxlIG5hbWVzLiAgT3B0aW9ucyBtYXkgYXBwZWFyIGluIGFueSBvcmRlciwgYW5kIG1heSBiZQorYmVmb3JlLCBhZnRlciwgb3IgYmV0d2VlbiBmaWxlIG5hbWVzLiAgVGhlIG9yZGVyIG9mIGZpbGUgbmFtZXMgaXMKK3NpZ25pZmljYW50LgorCitAY2luZGV4IHN0YW5kYXJkIGlucHV0LCBhcyBpbnB1dCBmaWxlCitAa2luZGV4IC0tCitAZmlsZXstLX0gKHR3byBoeXBoZW5zKSBieSBpdHNlbGYgbmFtZXMgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKK2V4cGxpY2l0bHksIGFzIG9uZSBvZiB0aGUgZmlsZXMgZm9yIEBjb2Rle0B2YWx1ZXtBU319IHRvIGFzc2VtYmxlLgorCitAY2luZGV4IG9wdGlvbnMsIGNvbW1hbmQgbGluZQorRXhjZXB0IGZvciBAc2FtcHstLX0gYW55IGNvbW1hbmQgbGluZSBhcmd1bWVudCB0aGF0IGJlZ2lucyB3aXRoIGEKK2h5cGhlbiAoQHNhbXB7LX0pIGlzIGFuIG9wdGlvbi4gIEVhY2ggb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCitAY29kZXtAdmFsdWV7QVN9fS4gIE5vIG9wdGlvbiBjaGFuZ2VzIHRoZSB3YXkgYW5vdGhlciBvcHRpb24gd29ya3MuICBBbgorb3B0aW9uIGlzIGEgQHNhbXB7LX0gZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbGV0dGVyczsgdGhlIGNhc2Ugb2YKK3RoZSBsZXR0ZXIgaXMgaW1wb3J0YW50LiAgIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KKworU29tZSBvcHRpb25zIGV4cGVjdCBleGFjdGx5IG9uZSBmaWxlIG5hbWUgdG8gZm9sbG93IHRoZW0uICBUaGUgZmlsZQorbmFtZSBtYXkgZWl0aGVyIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgb3B0aW9uJ3MgbGV0dGVyIChjb21wYXRpYmxlCit3aXRoIG9sZGVyIGFzc2VtYmxlcnMpIG9yIGl0IG1heSBiZSB0aGUgbmV4dCBjb21tYW5kIGFyZ3VtZW50IChAc2N7Z251fQorc3RhbmRhcmQpLiAgVGhlc2UgdHdvIGNvbW1hbmQgbGluZXMgYXJlIGVxdWl2YWxlbnQ6CisKK0BzbWFsbGV4YW1wbGUKK0B2YWx1ZXtBU30gLW8gbXktb2JqZWN0LWZpbGUubyBtdW1ibGUucworQHZhbHVle0FTfSAtb215LW9iamVjdC1maWxlLm8gbXVtYmxlLnMKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIElucHV0IEZpbGVzCitAc2VjdGlvbiBJbnB1dCBGaWxlcworCitAY2luZGV4IGlucHV0CitAY2luZGV4IHNvdXJjZSBwcm9ncmFtCitAY2luZGV4IGZpbGVzLCBpbnB1dAorV2UgdXNlIHRoZSBwaHJhc2UgQGRmbntzb3VyY2UgcHJvZ3JhbX0sIGFiYnJldmlhdGVkIEBkZm57c291cmNlfSwgdG8KK2Rlc2NyaWJlIHRoZSBwcm9ncmFtIGlucHV0IHRvIG9uZSBydW4gb2YgQGNvZGV7QHZhbHVle0FTfX0uICBUaGUgcHJvZ3JhbSBtYXkKK2JlIGluIG9uZSBvciBtb3JlIGZpbGVzOyBob3cgdGhlIHNvdXJjZSBpcyBwYXJ0aXRpb25lZCBpbnRvIGZpbGVzCitkb2Vzbid0IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgc291cmNlLgorCitAYyBJIGFkZGVkICJjb24iIHByZWZpeCB0byAiY2F0ZW5hdGlvbiIganVzdCB0byBwcm92ZSBJIGNhbiBvdmVyY29tZSBteQorQGMgQVBMIHRyYWluaW5nLi4uICAgZG9jQGN5Z251cy5jb20KK1RoZSBzb3VyY2UgcHJvZ3JhbSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIHRleHQgaW4gYWxsIHRoZSBmaWxlcywgaW4gdGhlCitvcmRlciBzcGVjaWZpZWQuCisKK0VhY2ggdGltZSB5b3UgcnVuIEBjb2Rle0B2YWx1ZXtBU319IGl0IGFzc2VtYmxlcyBleGFjdGx5IG9uZSBzb3VyY2UKK3Byb2dyYW0uICBUaGUgc291cmNlIHByb2dyYW0gaXMgbWFkZSB1cCBvZiBvbmUgb3IgbW9yZSBmaWxlcy4KKyhUaGUgc3RhbmRhcmQgaW5wdXQgaXMgYWxzbyBhIGZpbGUuKQorCitZb3UgZ2l2ZSBAY29kZXtAdmFsdWV7QVN9fSBhIGNvbW1hbmQgbGluZSB0aGF0IGhhcyB6ZXJvIG9yIG1vcmUgaW5wdXQgZmlsZQorbmFtZXMuICBUaGUgaW5wdXQgZmlsZXMgYXJlIHJlYWQgKGZyb20gbGVmdCBmaWxlIG5hbWUgdG8gcmlnaHQpLiAgQQorY29tbWFuZCBsaW5lIGFyZ3VtZW50IChpbiBhbnkgcG9zaXRpb24pIHRoYXQgaGFzIG5vIHNwZWNpYWwgbWVhbmluZworaXMgdGFrZW4gdG8gYmUgYW4gaW5wdXQgZmlsZSBuYW1lLgorCitJZiB5b3UgZ2l2ZSBAY29kZXtAdmFsdWV7QVN9fSBubyBmaWxlIG5hbWVzIGl0IGF0dGVtcHRzIHRvIHJlYWQgb25lIGlucHV0IGZpbGUKK2Zyb20gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHN0YW5kYXJkIGlucHV0LCB3aGljaCBpcyBub3JtYWxseSB5b3VyIHRlcm1pbmFsLiAgWW91CittYXkgaGF2ZSB0byB0eXBlIEBrZXl7Y3RsLUR9IHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0gdGhlcmUgaXMgbm8gbW9yZSBwcm9ncmFtCit0byBhc3NlbWJsZS4KKworVXNlIEBzYW1wey0tfSBpZiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IG5hbWUgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKK2luIHlvdXIgY29tbWFuZCBsaW5lLgorCitJZiB0aGUgc291cmNlIGlzIGVtcHR5LCBAY29kZXtAdmFsdWV7QVN9fSBwcm9kdWNlcyBhIHNtYWxsLCBlbXB0eSBvYmplY3QKK2ZpbGUuCisKK0BzdWJoZWFkaW5nIEZpbGVuYW1lcyBhbmQgTGluZS1udW1iZXJzCisKK0BjaW5kZXggaW5wdXQgZmlsZSBsaW5lbnVtYmVycworQGNpbmRleCBsaW5lIG51bWJlcnMsIGluIGlucHV0IGZpbGVzCitUaGVyZSBhcmUgdHdvIHdheXMgb2YgbG9jYXRpbmcgYSBsaW5lIGluIHRoZSBpbnB1dCBmaWxlIChvciBmaWxlcykgYW5kCitlaXRoZXIgbWF5IGJlIHVzZWQgaW4gcmVwb3J0aW5nIGVycm9yIG1lc3NhZ2VzLiAgT25lIHdheSByZWZlcnMgdG8gYSBsaW5lCitudW1iZXIgaW4gYSBwaHlzaWNhbCBmaWxlOyB0aGUgb3RoZXIgcmVmZXJzIHRvIGEgbGluZSBudW1iZXIgaW4gYQorYGBsb2dpY2FsJycgZmlsZS4gIEB4cmVme0Vycm9ycywgLEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzfS4KKworQGRmbntQaHlzaWNhbCBmaWxlc30gYXJlIHRob3NlIGZpbGVzIG5hbWVkIGluIHRoZSBjb21tYW5kIGxpbmUgZ2l2ZW4KK3RvIEBjb2Rle0B2YWx1ZXtBU319LgorCitAZGZue0xvZ2ljYWwgZmlsZXN9IGFyZSBzaW1wbHkgbmFtZXMgZGVjbGFyZWQgZXhwbGljaXRseSBieSBhc3NlbWJsZXIKK2RpcmVjdGl2ZXM7IHRoZXkgYmVhciBubyByZWxhdGlvbiB0byBwaHlzaWNhbCBmaWxlcy4gIExvZ2ljYWwgZmlsZSBuYW1lcyBoZWxwCitlcnJvciBtZXNzYWdlcyByZWZsZWN0IHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UKK2lzIGl0c2VsZiBzeW50aGVzaXplZCBmcm9tIG90aGVyIGZpbGVzLiAgQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlCitAc2FtcHsjfSBkaXJlY3RpdmVzIGVtaXR0ZWQgYnkgdGhlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBwcmVwcm9jZXNzb3IuICBTZWUgYWxzbworQHJlZntGaWxlLCxAY29kZXsuZmlsZX19LgorCitAbm9kZSBPYmplY3QKK0BzZWN0aW9uIE91dHB1dCAoT2JqZWN0KSBGaWxlCisKK0BjaW5kZXggb2JqZWN0IGZpbGUKK0BjaW5kZXggb3V0cHV0IGZpbGUKK0BraW5kZXggYS5vdXQKK0BraW5kZXggLm8KK0V2ZXJ5IHRpbWUgeW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fSBpdCBwcm9kdWNlcyBhbiBvdXRwdXQgZmlsZSwgd2hpY2ggaXMKK3lvdXIgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbSB0cmFuc2xhdGVkIGludG8gbnVtYmVycy4gIFRoaXMgZmlsZQoraXMgdGhlIG9iamVjdCBmaWxlLiAgSXRzIGRlZmF1bHQgbmFtZSBpcworQGlmY2xlYXIgQk9VVAorQGNvZGV7YS5vdXR9LgorQGVuZCBpZmNsZWFyCitAaWZzZXQgQk9VVAorQGlmc2V0IEdFTkVSSUMKK0Bjb2Rle2Eub3V0fSwgb3IgCitAZW5kIGlmc2V0CitAY29kZXtiLm91dH0gd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciB0aGUgSW50ZWwgODA5NjAuCitAZW5kIGlmc2V0CitZb3UgY2FuIGdpdmUgaXQgYW5vdGhlciBuYW1lIGJ5IHVzaW5nIHRoZSBAY29kZXstb30gb3B0aW9uLiAgQ29udmVudGlvbmFsbHksCitvYmplY3QgZmlsZSBuYW1lcyBlbmQgd2l0aCBAZmlsZXsub30uICBUaGUgZGVmYXVsdCBuYW1lIGlzIHVzZWQgZm9yIGhpc3RvcmljYWwKK3JlYXNvbnM6IG9sZGVyIGFzc2VtYmxlcnMgd2VyZSBjYXBhYmxlIG9mIGFzc2VtYmxpbmcgc2VsZi1jb250YWluZWQgcHJvZ3JhbXMKK2RpcmVjdGx5IGludG8gYSBydW5uYWJsZSBwcm9ncmFtLiAgKEZvciBzb21lIGZvcm1hdHMsIHRoaXMgaXNuJ3QgY3VycmVudGx5Citwb3NzaWJsZSwgYnV0IGl0IGNhbiBiZSBkb25lIGZvciB0aGUgQGNvZGV7YS5vdXR9IGZvcm1hdC4pCisKK0BjaW5kZXggbGlua2VyCitAa2luZGV4IGxkCitUaGUgb2JqZWN0IGZpbGUgaXMgbWVhbnQgZm9yIGlucHV0IHRvIHRoZSBsaW5rZXIgQGNvZGV7QHZhbHVle0xEfX0uICBJdCBjb250YWlucworYXNzZW1ibGVkIHByb2dyYW0gY29kZSwgaW5mb3JtYXRpb24gdG8gaGVscCBAY29kZXtAdmFsdWV7TER9fSBpbnRlZ3JhdGUKK3RoZSBhc3NlbWJsZWQgcHJvZ3JhbSBpbnRvIGEgcnVubmFibGUgZmlsZSwgYW5kIChvcHRpb25hbGx5KSBzeW1ib2xpYworaW5mb3JtYXRpb24gZm9yIHRoZSBkZWJ1Z2dlci4KKworQGMgbGluayBhYm92ZSB0byBzb21lIGluZm8gZmlsZShzKSBsaWtlIHRoZSBkZXNjcmlwdGlvbiBvZiBhLm91dC4KK0BjIGRvbid0IGZvcmdldCB0byBkZXNjcmliZSBAc2N7Z251fSBpbmZvIGFzIHdlbGwgYXMgVW5peCBsb3NzYWdlLgorCitAbm9kZSBFcnJvcnMKK0BzZWN0aW9uIEVycm9yIGFuZCBXYXJuaW5nIE1lc3NhZ2VzCisKK0BjaW5kZXggZXJyb3IgbWVzc3NhZ2VzCitAY2luZGV4IHdhcm5pbmcgbWVzc2FnZXMKK0BjaW5kZXggbWVzc2FnZXMgZnJvbSBhc3NlbWJsZXIKK0Bjb2Rle0B2YWx1ZXtBU319IG1heSB3cml0ZSB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN0YW5kYXJkIGVycm9yCitmaWxlICh1c3VhbGx5IHlvdXIgdGVybWluYWwpLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiB3aGVuICBhIGNvbXBpbGVyCitydW5zIEBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkuICBXYXJuaW5ncyByZXBvcnQgYW4gYXNzdW1wdGlvbiBtYWRlIHNvCit0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGNvdWxkIGtlZXAgYXNzZW1ibGluZyBhIGZsYXdlZCBwcm9ncmFtOyBlcnJvcnMgcmVwb3J0IGEKK2dyYXZlIHByb2JsZW0gdGhhdCBzdG9wcyB0aGUgYXNzZW1ibHkuCisKK0BjaW5kZXggZm9ybWF0IG9mIHdhcm5pbmcgbWVzc2FnZXMKK1dhcm5pbmcgbWVzc2FnZXMgaGF2ZSB0aGUgZm9ybWF0CisKK0BzbWFsbGV4YW1wbGUKK2ZpbGVfbmFtZTpAYntOTk59Oldhcm5pbmcgTWVzc2FnZSBUZXh0CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK0BjaW5kZXggbGluZSBudW1iZXJzLCBpbiB3YXJuaW5ncy9lcnJvcnMKKyh3aGVyZSBAYntOTk59IGlzIGEgbGluZSBudW1iZXIpLiAgSWYgYSBsb2dpY2FsIGZpbGUgbmFtZSBoYXMgYmVlbiBnaXZlbgorKEBweHJlZntGaWxlLCxAY29kZXsuZmlsZX19KSBpdCBpcyB1c2VkIGZvciB0aGUgZmlsZW5hbWUsIG90aGVyd2lzZSB0aGUgbmFtZSBvZgordGhlIGN1cnJlbnQgaW5wdXQgZmlsZSBpcyB1c2VkLiAgSWYgYSBsb2dpY2FsIGxpbmUgbnVtYmVyIHdhcyBnaXZlbgorQGlmc2V0IEdFTkVSSUMKKyhAcHhyZWZ7TGluZSwsQGNvZGV7LmxpbmV9fSkKK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZmNsZWFyIEEyOUsKKyhAcHhyZWZ7TGluZSwsQGNvZGV7LmxpbmV9fSkKK0BlbmQgaWZjbGVhcgorQGlmc2V0IEEyOUsKKyhAcHhyZWZ7TG4sLEBjb2Rley5sbn19KQorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCit0aGVuIGl0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgcHJpbnRlZCwKK290aGVyd2lzZSB0aGUgYWN0dWFsIGxpbmUgaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgaXMgcHJpbnRlZC4gIFRoZQorbWVzc2FnZSB0ZXh0IGlzIGludGVuZGVkIHRvIGJlIHNlbGYgZXhwbGFuYXRvcnkgKGluIHRoZSBncmFuZCBVbml4Cit0cmFkaXRpb24pLgorCitAY2luZGV4IGZvcm1hdCBvZiBlcnJvciBtZXNzYWdlcworRXJyb3IgbWVzc2FnZXMgaGF2ZSB0aGUgZm9ybWF0CitAc21hbGxleGFtcGxlCitmaWxlX25hbWU6QGJ7Tk5OfTpGQVRBTDpFcnJvciBNZXNzYWdlIFRleHQKK0BlbmQgc21hbGxleGFtcGxlCitUaGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUgZGVyaXZlZCBhcyBmb3Igd2FybmluZworbWVzc2FnZXMuICBUaGUgYWN0dWFsIG1lc3NhZ2UgdGV4dCBtYXkgYmUgcmF0aGVyIGxlc3MgZXhwbGFuYXRvcnkKK2JlY2F1c2UgbWFueSBvZiB0aGVtIGFyZW4ndCBzdXBwb3NlZCB0byBoYXBwZW4uCisKK0Bub2RlIEludm9raW5nCitAY2hhcHRlciBDb21tYW5kLUxpbmUgT3B0aW9ucworCitAY2luZGV4IG9wdGlvbnMsIGFsbCB2ZXJzaW9ucyBvZiBhc3NlbWJsZXIKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgY29tbWFuZC1saW5lIG9wdGlvbnMgYXZhaWxhYmxlIGluIEBlbXBoe2FsbH0KK3ZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXI7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30sIGZvciBvcHRpb25zIHNwZWNpZmljCitAaWZjbGVhciBHRU5FUklDCit0byB0aGUgQHZhbHVle1RBUkdFVH0uCitAZW5kIGlmY2xlYXIKK0BpZnNldCBHRU5FUklDCit0byBwYXJ0aWN1bGFyIG1hY2hpbmUgYXJjaGl0ZWN0dXJlcy4KK0BlbmQgaWZzZXQKKworSWYgeW91IGFyZSBpbnZva2luZyBAY29kZXtAdmFsdWV7QVN9fSB2aWEgdGhlIEBzY3tnbnV9IEMgY29tcGlsZXIgKHZlcnNpb24gMiksCit5b3UgY2FuIHVzZSB0aGUgQHNhbXB7LVdhfSBvcHRpb24gdG8gcGFzcyBhcmd1bWVudHMgdGhyb3VnaCB0byB0aGUgYXNzZW1ibGVyLgorVGhlIGFzc2VtYmxlciBhcmd1bWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIChhbmQgdGhlIEBzYW1wey1XYX0pCitieSBjb21tYXMuICBGb3IgZXhhbXBsZToKKworQHNtYWxsZXhhbXBsZQorZ2NjIC1jIC1nIC1PIC1XYSwtYWxoLC1MIGZpbGUuYworQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUaGlzIHBhc3NlcyB0d28gb3B0aW9ucyB0byB0aGUgYXNzZW1ibGVyOiBAc2FtcHstYWxofSAoZW1pdCBhIGxpc3RpbmcgdG8KK3N0YW5kYXJkIG91dHB1dCB3aXRoIHdpdGggaGlnaC1sZXZlbCBhbmQgYXNzZW1ibHkgc291cmNlKSBhbmQgQHNhbXB7LUx9IChyZXRhaW4KK2xvY2FsIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZSkuCisKK1VzdWFsbHkgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIEBzYW1wey1XYX0gbWVjaGFuaXNtLCBzaW5jZSBtYW55IGNvbXBpbGVyCitjb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgYXV0b21hdGljYWxseSBwYXNzZWQgdG8gdGhlIGFzc2VtYmxlciBieSB0aGUgY29tcGlsZXIuCisoWW91IGNhbiBjYWxsIHRoZSBAc2N7Z251fSBjb21waWxlciBkcml2ZXIgd2l0aCB0aGUgQHNhbXB7LXZ9IG9wdGlvbiB0byBzZWUKK3ByZWNpc2VseSB3aGF0IG9wdGlvbnMgaXQgcGFzc2VzIHRvIGVhY2ggY29tcGlsYXRpb24gcGFzcywgaW5jbHVkaW5nIHRoZQorYXNzZW1ibGVyLikKKworQG1lbnUKKyogYTo6ICAgICAgICAgICAgIC1hW2NkaGxuc10gZW5hYmxlIGxpc3RpbmdzCisqIEQ6OiAgICAgICAgICAgICAtRCBmb3IgY29tcGF0aWJpbGl0eQorKiBmOjogICAgICAgICAgICAgLWYgdG8gd29yayBmYXN0ZXIKKyogSTo6ICAgICAgICAgICAgIC1JIGZvciAuaW5jbHVkZSBzZWFyY2ggcGF0aAorQGlmY2xlYXIgRElGRi1UQkwtS0xVR0UKKyogSzo6ICAgICAgICAgICAgIC1LIGZvciBjb21wYXRpYmlsaXR5CitAZW5kIGlmY2xlYXIKK0BpZnNldCBESUZGLVRCTC1LTFVHRQorKiBLOjogICAgICAgICAgICAgLUsgZm9yIGRpZmZlcmVuY2UgdGFibGVzCitAZW5kIGlmc2V0CisKKyogTDo6ICAgICAgICAgICAgIC1MIHRvIHJldGFpbiBsb2NhbCBsYWJlbHMKKyogTTo6CQkgIC1NIG9yIC0tbXJpIHRvIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUKKyogTUQ6OiAgICAgICAgICAgIC0tTUQgZm9yIGRlcGVuZGVuY3kgdHJhY2tpbmcKKyogbzo6ICAgICAgICAgICAgIC1vIHRvIG5hbWUgdGhlIG9iamVjdCBmaWxlCisqIFI6OiAgICAgICAgICAgICAtUiB0byBqb2luIGRhdGEgYW5kIHRleHQgc2VjdGlvbnMKKyogc3RhdGlzdGljczo6ICAgIC0tc3RhdGlzdGljcyB0byBzZWUgc3RhdGlzdGljcyBhYm91dCBhc3NlbWJseQorKiB0cmFkaXRpb25hbC1mb3JtYXQ6OiAtLXRyYWRpdGlvbmFsLWZvcm1hdCBmb3IgY29tcGF0aWJsZSBvdXRwdXQKKyogdjo6ICAgICAgICAgICAgIC12IHRvIGFubm91bmNlIHZlcnNpb24KKyogVzo6ICAgICAgICAgICAgIC1XIHRvIHN1cHByZXNzIHdhcm5pbmdzCisqIFo6OiAgICAgICAgICAgICAtWiB0byBtYWtlIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzCitAZW5kIG1lbnUKKworQG5vZGUgYQorQHNlY3Rpb24gRW5hYmxlIExpc3RpbmdzOiBAY29kZXstYVtjZGhsbnNdfQorCitAa2luZGV4IC1hCitAa2luZGV4IC1hYworQGtpbmRleCAtYWQKK0BraW5kZXggLWFoCitAa2luZGV4IC1hbAorQGtpbmRleCAtYW4KK0BraW5kZXggLWFzCitAY2luZGV4IGxpc3RpbmdzLCBlbmFibGluZworQGNpbmRleCBhc3NlbWJseSBsaXN0aW5ncywgZW5hYmxpbmcKKworVGhlc2Ugb3B0aW9ucyBlbmFibGUgbGlzdGluZyBvdXRwdXQgZnJvbSB0aGUgYXNzZW1ibGVyLiAgQnkgaXRzZWxmLAorQHNhbXB7LWF9IHJlcXVlc3RzIGhpZ2gtbGV2ZWwsIGFzc2VtYmx5LCBhbmQgc3ltYm9scyBsaXN0aW5nLgorWW91IGNhbiB1c2Ugb3RoZXIgbGV0dGVycyB0byBzZWxlY3Qgc3BlY2lmaWMgb3B0aW9ucyBmb3IgdGhlIGxpc3Q6CitAc2FtcHstYWh9IHJlcXVlc3RzIGEgaGlnaC1sZXZlbCBsYW5ndWFnZSBsaXN0aW5nLAorQHNhbXB7LWFsfSByZXF1ZXN0cyBhbiBvdXRwdXQtcHJvZ3JhbSBhc3NlbWJseSBsaXN0aW5nLCBhbmQKK0BzYW1wey1hc30gcmVxdWVzdHMgYSBzeW1ib2wgdGFibGUgbGlzdGluZy4KK0hpZ2gtbGV2ZWwgbGlzdGluZ3MgcmVxdWlyZSB0aGF0IGEgY29tcGlsZXIgZGVidWdnaW5nIG9wdGlvbiBsaWtlCitAc2FtcHstZ30gYmUgdXNlZCwgYW5kIHRoYXQgYXNzZW1ibHkgbGlzdGluZ3MgKEBzYW1wey1hbH0pIGJlIHJlcXVlc3RlZAorYWxzby4KKworVXNlIHRoZSBAc2FtcHstYWN9IG9wdGlvbiB0byBvbWl0IGZhbHNlIGNvbmRpdGlvbmFscyBmcm9tIGEgbGlzdGluZy4gIEFueSBsaW5lcword2hpY2ggYXJlIG5vdCBhc3NlbWJsZWQgYmVjYXVzZSBvZiBhIGZhbHNlIEBjb2Rley5pZn0gKG9yIEBjb2Rley5pZmRlZn0sIG9yIGFueQorb3RoZXIgY29uZGl0aW9uYWwpLCBvciBhIHRydWUgQGNvZGV7LmlmfSBmb2xsb3dlZCBieSBhbiBAY29kZXsuZWxzZX0sIHdpbGwgYmUKK29taXR0ZWQgZnJvbSB0aGUgbGlzdGluZy4KKworVXNlIHRoZSBAc2FtcHstYWR9IG9wdGlvbiB0byBvbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzIGZyb20gdGhlCitsaXN0aW5nLgorCitPbmNlIHlvdSBoYXZlIHNwZWNpZmllZCBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBmdXJ0aGVyIGNvbnRyb2wKK2xpc3Rpbmcgb3V0cHV0IGFuZCBpdHMgYXBwZWFyYW5jZSB1c2luZyB0aGUgZGlyZWN0aXZlcyBAY29kZXsubGlzdH0sCitAY29kZXsubm9saXN0fSwgQGNvZGV7LnBzaXplfSwgQGNvZGV7LmVqZWN0fSwgQGNvZGV7LnRpdGxlfSwgYW5kCitAY29kZXsuc2J0dGx9LgorVGhlIEBzYW1wey1hbn0gb3B0aW9uIHR1cm5zIG9mZiBhbGwgZm9ybXMgcHJvY2Vzc2luZy4KK0lmIHlvdSBkbyBub3QgcmVxdWVzdCBsaXN0aW5nIG91dHB1dCB3aXRoIG9uZSBvZiB0aGUgQHNhbXB7LWF9IG9wdGlvbnMsIHRoZQorbGlzdGluZy1jb250cm9sIGRpcmVjdGl2ZXMgaGF2ZSBubyBlZmZlY3QuCisKK1RoZSBsZXR0ZXJzIGFmdGVyIEBzYW1wey1hfSBtYXkgYmUgY29tYmluZWQgaW50byBvbmUgb3B0aW9uLAorQGVtcGh7ZS5nLn0sIEBzYW1wey1hbG59LgorCitAbm9kZSBECitAc2VjdGlvbiBAY29kZXstRH0KKworQGtpbmRleCAtRAorVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCB3aGF0c29ldmVyLCBidXQgaXQgaXMgYWNjZXB0ZWQgdG8gbWFrZSBpdCBtb3JlCitsaWtlbHkgdGhhdCBzY3JpcHRzIHdyaXR0ZW4gZm9yIG90aGVyIGFzc2VtYmxlcnMgYWxzbyB3b3JrIHdpdGgKK0Bjb2Rle0B2YWx1ZXtBU319LgorCitAbm9kZSBmCitAc2VjdGlvbiBXb3JrIEZhc3RlcjogQGNvZGV7LWZ9CisKK0BraW5kZXggLWYKK0BjaW5kZXggdHJ1c3RlZCBjb21waWxlcgorQGNpbmRleCBmYXN0ZXIgcHJvY2Vzc2luZyAoQGNvZGV7LWZ9KQorQHNhbXB7LWZ9IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhc3NlbWJsaW5nIHByb2dyYW1zIHdyaXR0ZW4gYnkgYQorKHRydXN0ZWQpIGNvbXBpbGVyLiAgQHNhbXB7LWZ9IHN0b3BzIHRoZSBhc3NlbWJsZXIgZnJvbSBkb2luZyB3aGl0ZXNwYWNlCithbmQgY29tbWVudCBwcmVwcm9jZXNzaW5nIG9uCit0aGUgaW5wdXQgZmlsZShzKSBiZWZvcmUgYXNzZW1ibGluZyB0aGVtLiAgQHhyZWZ7UHJlcHJvY2Vzc2luZywKKyxQcmVwcm9jZXNzaW5nfS4KKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IGlmIHlvdSB1c2UgQHNhbXB7LWZ9IHdoZW4gdGhlIGZpbGVzIGFjdHVhbGx5IG5lZWQgdG8gYmUKK3ByZXByb2Nlc3NlZCAoaWYgdGhleSBjb250YWluIGNvbW1lbnRzLCBmb3IgZXhhbXBsZSksIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMKK25vdCB3b3JrIGNvcnJlY3RseS4KK0BlbmQgcXVvdGF0aW9uCisKK0Bub2RlIEkKK0BzZWN0aW9uIEBjb2Rley5pbmNsdWRlfSBzZWFyY2ggcGF0aDogQGNvZGV7LUl9IEB2YXJ7cGF0aH0KKworQGtpbmRleCAtSSBAdmFye3BhdGh9CitAY2luZGV4IHBhdGhzIGZvciBAY29kZXsuaW5jbHVkZX0KK0BjaW5kZXggc2VhcmNoIHBhdGggZm9yIEBjb2Rley5pbmNsdWRlfQorQGNpbmRleCBAY29kZXtpbmNsdWRlfSBkaXJlY3RpdmUgc2VhcmNoIHBhdGgKK1VzZSB0aGlzIG9wdGlvbiB0byBhZGQgYSBAdmFye3BhdGh9IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzCitAY29kZXtAdmFsdWV7QVN9fSBzZWFyY2hlcyBmb3IgZmlsZXMgc3BlY2lmaWVkIGluIEBjb2Rley5pbmNsdWRlfQorZGlyZWN0aXZlcyAoQHB4cmVme0luY2x1ZGUsLEBjb2Rley5pbmNsdWRlfX0pLiAgWW91IG1heSB1c2UgQGNvZGV7LUl9IGFzCittYW55IHRpbWVzIGFzIG5lY2Vzc2FyeSB0byBpbmNsdWRlIGEgdmFyaWV0eSBvZiBwYXRocy4gIFRoZSBjdXJyZW50Cit3b3JraW5nIGRpcmVjdG9yeSBpcyBhbHdheXMgc2VhcmNoZWQgZmlyc3Q7IGFmdGVyIHRoYXQsIEBjb2Rle0B2YWx1ZXtBU319CitzZWFyY2hlcyBhbnkgQHNhbXB7LUl9IGRpcmVjdG9yaWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgd2VyZQorc3BlY2lmaWVkIChsZWZ0IHRvIHJpZ2h0KSBvbiB0aGUgY29tbWFuZCBsaW5lLgorCitAbm9kZSBLCitAc2VjdGlvbiBEaWZmZXJlbmNlIFRhYmxlczogQGNvZGV7LUt9CisKK0BraW5kZXggLUsKK0BpZmNsZWFyIERJRkYtVEJMLUtMVUdFCitPbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCB0aGlzIG9wdGlvbiBpcyBhbGxvd2VkLCBidXQgaGFzIG5vIGVmZmVjdC4gIEl0IGlzCitwZXJtaXR0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQHNje2dudX0gYXNzZW1ibGVyIG9uIG90aGVyIHBsYXRmb3JtcywKK3doZXJlIGl0IGNhbiBiZSB1c2VkIHRvIHdhcm4gd2hlbiB0aGUgYXNzZW1ibGVyIGFsdGVycyB0aGUgbWFjaGluZSBjb2RlCitnZW5lcmF0ZWQgZm9yIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzIGluIGRpZmZlcmVuY2UgdGFibGVzLiAgVGhlIEB2YWx1ZXtUQVJHRVR9CitmYW1pbHkgZG9lcyBub3QgaGF2ZSB0aGUgYWRkcmVzc2luZyBsaW1pdGF0aW9ucyB0aGF0IHNvbWV0aW1lcyBsZWFkIHRvIHRoaXMKK2FsdGVyYXRpb24gb24gb3RoZXIgcGxhdGZvcm1zLgorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBESUZGLVRCTC1LTFVHRQorQGNpbmRleCBkaWZmZXJlbmNlIHRhYmxlcywgd2FybmluZworQGNpbmRleCB3YXJuaW5nIGZvciBhbHRlcmVkIGRpZmZlcmVuY2UgdGFibGVzCitAY29kZXtAdmFsdWV7QVN9fSBzb21ldGltZXMgYWx0ZXJzIHRoZSBjb2RlIGVtaXR0ZWQgZm9yIGRpcmVjdGl2ZXMgb2YgdGhlIGZvcm0KK0BzYW1wey53b3JkIEB2YXJ7c3ltMX0tQHZhcntzeW0yfX07IEBweHJlZntXb3JkLCxAY29kZXsud29yZH19LgorWW91IGNhbiB1c2UgdGhlIEBzYW1wey1LfSBvcHRpb24gaWYgeW91IHdhbnQgYSB3YXJuaW5nIGlzc3VlZCB3aGVuIHRoaXMKK2lzIGRvbmUuCitAZW5kIGlmc2V0CisKK0Bub2RlIEwKK0BzZWN0aW9uIEluY2x1ZGUgTG9jYWwgTGFiZWxzOiBAY29kZXstTH0KKworQGtpbmRleCAtTAorQGNpbmRleCBsb2NhbCBsYWJlbHMsIHJldGFpbmluZyBpbiBvdXRwdXQKK0xhYmVscyBiZWdpbm5pbmcgd2l0aCBAc2FtcHtMfSAodXBwZXIgY2FzZSBvbmx5KSBhcmUgY2FsbGVkIEBkZm57bG9jYWwKK2xhYmVsc30uIEB4cmVme1N5bWJvbCBOYW1lc30uICBOb3JtYWxseSB5b3UgZG8gbm90IHNlZSBzdWNoIGxhYmVscyB3aGVuCitkZWJ1Z2dpbmcsIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgZm9yIHRoZSB1c2Ugb2YgcHJvZ3JhbXMgKGxpa2UKK2NvbXBpbGVycykgdGhhdCBjb21wb3NlIGFzc2VtYmxlciBwcm9ncmFtcywgbm90IGZvciB5b3VyIG5vdGljZS4KK05vcm1hbGx5IGJvdGggQGNvZGV7QHZhbHVle0FTfX0gYW5kIEBjb2Rle0B2YWx1ZXtMRH19IGRpc2NhcmQgc3VjaCBsYWJlbHMsIHNvIHlvdSBkbyBub3QKK25vcm1hbGx5IGRlYnVnIHdpdGggdGhlbS4KKworVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gcmV0YWluIHRob3NlIEBzYW1we0xAZG90c3t9fSBzeW1ib2xzCitpbiB0aGUgb2JqZWN0IGZpbGUuICBVc3VhbGx5IGlmIHlvdSBkbyB0aGlzIHlvdSBhbHNvIHRlbGwgdGhlIGxpbmtlcgorQGNvZGV7QHZhbHVle0xEfX0gdG8gcHJlc2VydmUgc3ltYm9scyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIEBzYW1we0x9LgorCitCeSBkZWZhdWx0LCBhIGxvY2FsIGxhYmVsIGlzIGFueSBsYWJlbCBiZWdpbm5pbmcgd2l0aCBAc2FtcHtMfSwgYnV0IGVhY2gKK3RhcmdldCBpcyBhbGxvd2VkIHRvIHJlZGVmaW5lIHRoZSBsb2NhbCBsYWJlbCBwcmVmaXguCitAaWZzZXQgSFBQQQorT24gdGhlIEhQUEEgbG9jYWwgbGFiZWxzIGJlZ2luIHdpdGggQHNhbXB7TCR9LgorQGVuZCBpZnNldAorQGlmc2V0IEFSTQorQHNhbXB7O30gZm9yIHRoZSBBUk0gZmFtaWx5OworQGVuZCBpZnNldAorCitAbm9kZSBNCitAc2VjdGlvbiBBc3NlbWJsZSBpbiBNUkkgQ29tcGF0aWJpbGl0eSBNb2RlOiBAY29kZXstTX0KKworQGtpbmRleCAtTQorQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSBtb2RlCitUaGUgQGNvZGV7LU19IG9yIEBjb2Rley0tbXJpfSBvcHRpb24gc2VsZWN0cyBNUkkgY29tcGF0aWJpbGl0eSBtb2RlLiAgVGhpcworY2hhbmdlcyB0aGUgc3ludGF4IGFuZCBwc2V1ZG8tb3AgaGFuZGxpbmcgb2YgQGNvZGV7QHZhbHVle0FTfX0gdG8gbWFrZSBpdAorY29tcGF0aWJsZSB3aXRoIHRoZSBAY29kZXtBU002OEt9IG9yIHRoZSBAY29kZXtBU005NjB9IChkZXBlbmRpbmcgdXBvbiB0aGUKK2NvbmZpZ3VyZWQgdGFyZ2V0KSBhc3NlbWJsZXIgZnJvbSBNaWNyb3RlYyBSZXNlYXJjaC4gIFRoZSBleGFjdCBuYXR1cmUgb2YgdGhlCitNUkkgc3ludGF4IHdpbGwgbm90IGJlIGRvY3VtZW50ZWQgaGVyZTsgc2VlIHRoZSBNUkkgbWFudWFscyBmb3IgbW9yZQoraW5mb3JtYXRpb24uICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgaGFuZGxpbmcgb2YgbWFjcm9zIGFuZCBtYWNybworYXJndW1lbnRzIGlzIHNvbWV3aGF0IGRpZmZlcmVudC4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3B0aW9uIGlzIHRvIHBlcm1pdAorYXNzZW1ibGluZyBleGlzdGluZyBNUkkgYXNzZW1ibGVyIGNvZGUgdXNpbmcgQGNvZGV7QHZhbHVle0FTfX0uCisKK1RoZSBNUkkgY29tcGF0aWJpbGl0eSBpcyBub3QgY29tcGxldGUuICBDZXJ0YWluIG9wZXJhdGlvbnMgb2YgdGhlIE1SSSBhc3NlbWJsZXIKK2RlcGVuZCB1cG9uIGl0cyBvYmplY3QgZmlsZSBmb3JtYXQsIGFuZCBjYW4gbm90IGJlIHN1cHBvcnRlZCB1c2luZyBvdGhlciBvYmplY3QKK2ZpbGUgZm9ybWF0cy4gIFN1cHBvcnRpbmcgdGhlc2Ugd291bGQgcmVxdWlyZSBlbmhhbmNpbmcgZWFjaCBvYmplY3QgZmlsZSBmb3JtYXQKK2luZGl2aWR1YWxseS4gIFRoZXNlIGFyZToKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0gZ2xvYmFsIHN5bWJvbHMgaW4gY29tbW9uIHNlY3Rpb24KKworVGhlIG02OGsgTVJJIGFzc2VtYmxlciBzdXBwb3J0cyBjb21tb24gc2VjdGlvbnMgd2hpY2ggYXJlIG1lcmdlZCBieSB0aGUgbGlua2VyLgorT3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3Qgc3VwcG9ydCB0aGlzLiAgQGNvZGV7QHZhbHVle0FTfX0gaGFuZGxlcworY29tbW9uIHNlY3Rpb25zIGJ5IHRyZWF0aW5nIHRoZW0gYXMgYSBzaW5nbGUgY29tbW9uIHN5bWJvbC4gIEl0IHBlcm1pdHMgbG9jYWwKK3N5bWJvbHMgdG8gYmUgZGVmaW5lZCB3aXRoaW4gYSBjb21tb24gc2VjdGlvbiwgYnV0IGl0IGNhbiBub3Qgc3VwcG9ydCBnbG9iYWwKK3N5bWJvbHMsIHNpbmNlIGl0IGhhcyBubyB3YXkgdG8gZGVzY3JpYmUgdGhlbS4KKworQGl0ZW0gY29tcGxleCByZWxvY2F0aW9ucworCitUaGUgTVJJIGFzc2VtYmxlcnMgc3VwcG9ydCByZWxvY2F0aW9ucyBhZ2FpbnN0IGEgbmVnYXRlZCBzZWN0aW9uIGFkZHJlc3MsIGFuZAorcmVsb2NhdGlvbnMgd2hpY2ggY29tYmluZSB0aGUgc3RhcnQgYWRkcmVzc2VzIG9mIHR3byBvciBtb3JlIHNlY3Rpb25zLiAgVGhlc2UKK2FyZSBub3Qgc3VwcG9ydCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgorCitAaXRlbSBAY29kZXtFTkR9IHBzZXVkby1vcCBzcGVjaWZ5aW5nIHN0YXJ0IGFkZHJlc3MKKworVGhlIE1SSSBAY29kZXtFTkR9IHBzZXVkby1vcCBwZXJtaXRzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgc3RhcnQgYWRkcmVzcy4KK1RoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhlIHN0YXJ0IGFkZHJlc3MgbWF5CitpbnN0ZWFkIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgQGNvZGV7LWV9IG9wdGlvbiB0byB0aGUgbGlua2VyLCBvciBpbiBhIGxpbmtlcgorc2NyaXB0LgorCitAaXRlbSBAY29kZXtJRE5UfSwgQGNvZGV7LmlkZW50fSBhbmQgQGNvZGV7TkFNRX0gcHNldWRvLW9wcworCitUaGUgTVJJIEBjb2Rle0lETlR9LCBAY29kZXsuaWRlbnR9IGFuZCBAY29kZXtOQU1FfSBwc2V1ZG8tb3BzIGFzc2lnbiBhIG1vZHVsZQorbmFtZSB0byB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KKworQGl0ZW0gQGNvZGV7T1JHfSBwc2V1ZG8tb3AKKworVGhlIG02OGsgTVJJIEBjb2Rle09SR30gcHNldWRvLW9wIGJlZ2lucyBhbiBhYnNvbHV0ZSBzZWN0aW9uIGF0IGEgZ2l2ZW4KK2FkZHJlc3MuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdXN1YWwgQGNvZGV7QHZhbHVle0FTfX0gQGNvZGV7Lm9yZ30gcHNldWRvLW9wLAord2hpY2ggY2hhbmdlcyB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBjdXJyZW50IHNlY3Rpb24uICBBYnNvbHV0ZSBzZWN0aW9ucyBhcmUKK25vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoZSBhZGRyZXNzIG9mIGEgc2VjdGlvbiBtYXkgYmUKK2Fzc2lnbmVkIHdpdGhpbiBhIGxpbmtlciBzY3JpcHQuCitAZW5kIGl0ZW1pemUKKworVGhlcmUgYXJlIHNvbWUgb3RoZXIgZmVhdHVyZXMgb2YgdGhlIE1SSSBhc3NlbWJsZXIgd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgYnkKK0Bjb2Rle0B2YWx1ZXtBU319LCB0eXBpY2FsbHkgZWl0aGVyIGJlY2F1c2UgdGhleSBhcmUgZGlmZmljdWx0IG9yIGJlY2F1c2UgdGhleQorc2VlbSBvZiBsaXR0bGUgY29uc2VxdWVuY2UuICBTb21lIG9mIHRoZXNlIG1heSBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorCitAaXRlbWl6ZSBAYnVsbGV0CisKK0BpdGVtIEVCQ0RJQyBzdHJpbmdzCisKK0VCQ0RJQyBzdHJpbmdzIGFyZSBub3Qgc3VwcG9ydGVkLgorCitAaXRlbSBwYWNrZWQgYmluYXJ5IGNvZGVkIGRlY2ltYWwKKworUGFja2VkIGJpbmFyeSBjb2RlZCBkZWNpbWFsIGlzIG5vdCBzdXBwb3J0ZWQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIEBjb2Rle0RDLlB9CithbmQgQGNvZGV7RENCLlB9IHBzZXVkby1vcHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisKK0BpdGVtIEBjb2Rle0ZFUVV9IHBzZXVkby1vcAorCitUaGUgbTY4ayBAY29kZXtGRVFVfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KKworQGl0ZW0gQGNvZGV7Tk9PQkp9IHBzZXVkby1vcAorCitUaGUgbTY4ayBAY29kZXtOT09CSn0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCisKK0BpdGVtIEBjb2Rle09QVH0gYnJhbmNoIGNvbnRyb2wgb3B0aW9ucworCitUaGUgbTY4ayBAY29kZXtPUFR9IGJyYW5jaCBjb250cm9sIG9wdGlvbnMtLS1AY29kZXtCfSwgQGNvZGV7QlJTfSwgQGNvZGV7QlJCfSwKK0Bjb2Rle0JSTH0sIGFuZCBAY29kZXtCUld9LS0tYXJlIGlnbm9yZWQuICBAY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5CityZWxheGVzIGFsbCBicmFuY2hlcywgd2hldGhlciBmb3J3YXJkIG9yIGJhY2t3YXJkLCB0byBhbiBhcHByb3ByaWF0ZSBzaXplLCBzbwordGhlc2Ugb3B0aW9ucyBzZXJ2ZSBubyBwdXJwb3NlLgorCitAaXRlbSBAY29kZXtPUFR9IGxpc3QgY29udHJvbCBvcHRpb25zCisKK1RoZSBmb2xsb3dpbmcgbTY4ayBAY29kZXtPUFR9IGxpc3QgY29udHJvbCBvcHRpb25zIGFyZSBpZ25vcmVkOiBAY29kZXtDfSwKK0Bjb2Rle0NFWH0sIEBjb2Rle0NMfSwgQGNvZGV7Q1JFfSwgQGNvZGV7RX0sIEBjb2Rle0d9LCBAY29kZXtJfSwgQGNvZGV7TX0sCitAY29kZXtNRVh9LCBAY29kZXtNQ30sIEBjb2Rle01EfSwgQGNvZGV7WH0uCisKK0BpdGVtIG90aGVyIEBjb2Rle09QVH0gb3B0aW9ucworCitUaGUgZm9sbG93aW5nIG02OGsgQGNvZGV7T1BUfSBvcHRpb25zIGFyZSBpZ25vcmVkOiBAY29kZXtORVNUfSwgQGNvZGV7T30sCitAY29kZXtPTER9LCBAY29kZXtPUH0sIEBjb2Rle1B9LCBAY29kZXtQQ099LCBAY29kZXtQQ1J9LCBAY29kZXtQQ1N9LCBAY29kZXtSfS4KKworQGl0ZW0gQGNvZGV7T1BUfSBAY29kZXtEfSBvcHRpb24gaXMgZGVmYXVsdAorCitUaGUgbTY4ayBAY29kZXtPUFR9IEBjb2Rle0R9IG9wdGlvbiBpcyB0aGUgZGVmYXVsdCwgdW5saWtlIHRoZSBNUkkgYXNzZW1ibGVyLgorQGNvZGV7T1BUIE5PRH0gbWF5IGJlIHVzZWQgdG8gdHVybiBpdCBvZmYuCisKK0BpdGVtIEBjb2Rle1hSRUZ9IHBzZXVkby1vcC4KKworVGhlIG02OGsgQGNvZGV7WFJFRn0gcHNldWRvLW9wIGlzIGlnbm9yZWQuCisKK0BpdGVtIEBjb2Rley5kZWJ1Z30gcHNldWRvLW9wCisKK1RoZSBpOTYwIEBjb2Rley5kZWJ1Z30gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCisKK0BpdGVtIEBjb2Rley5leHRlbmRlZH0gcHNldWRvLW9wCisKK1RoZSBpOTYwIEBjb2Rley5leHRlbmRlZH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCisKK0BpdGVtIEBjb2Rley5saXN0fSBwc2V1ZG8tb3AuCisKK1RoZSB2YXJpb3VzIG9wdGlvbnMgb2YgdGhlIGk5NjAgQGNvZGV7Lmxpc3R9IHBzZXVkby1vcCBhcmUgbm90IHN1cHBvcnRlZC4KKworQGl0ZW0gQGNvZGV7Lm9wdGltaXplfSBwc2V1ZG8tb3AKKworVGhlIGk5NjAgQGNvZGV7Lm9wdGltaXplfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KKworQGl0ZW0gQGNvZGV7Lm91dHB1dH0gcHNldWRvLW9wCisKK1RoZSBpOTYwIEBjb2Rley5vdXRwdXR9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgorCitAaXRlbSBAY29kZXsuc2V0cmVhbH0gcHNldWRvLW9wCisKK1RoZSBpOTYwIEBjb2Rley5zZXRyZWFsfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KKworQGVuZCBpdGVtaXplCisKK0Bub2RlIE1ECitAc2VjdGlvbiBEZXBlbmRlbmN5IHRyYWNraW5nOiBAY29kZXstLU1EfQorCitAa2luZGV4IC0tTUQKK0BjaW5kZXggZGVwZW5kZW5jeSB0cmFja2luZworQGNpbmRleCBtYWtlIHJ1bGVzCisKK0Bjb2Rle0B2YWx1ZXtBU319IGNhbiBnZW5lcmF0ZSBhIGRlcGVuZGVuY3kgZmlsZSBmb3IgdGhlIGZpbGUgaXQgY3JlYXRlcy4gIFRoaXMKK2ZpbGUgY29uc2lzdHMgb2YgYSBzaW5nbGUgcnVsZSBzdWl0YWJsZSBmb3IgQGNvZGV7bWFrZX0gZGVzY3JpYmluZyB0aGUKK2RlcGVuZGVuY2llcyBvZiB0aGUgbWFpbiBzb3VyY2UgZmlsZS4KKworVGhlIHJ1bGUgaXMgd3JpdHRlbiB0byB0aGUgZmlsZSBuYW1lZCBpbiBpdHMgYXJndW1lbnQuCisKK1RoaXMgZmVhdHVyZSBpcyB1c2VkIGluIHRoZSBhdXRvbWF0aWMgdXBkYXRpbmcgb2YgbWFrZWZpbGVzLgorCitAbm9kZSBvCitAc2VjdGlvbiBOYW1lIHRoZSBPYmplY3QgRmlsZTogQGNvZGV7LW99CisKK0BraW5kZXggLW8KK0BjaW5kZXggbmFtaW5nIG9iamVjdCBmaWxlCitAY2luZGV4IG9iamVjdCBmaWxlIG5hbWUKK1RoZXJlIGlzIGFsd2F5cyBvbmUgb2JqZWN0IGZpbGUgb3V0cHV0IHdoZW4geW91IHJ1biBAY29kZXtAdmFsdWV7QVN9fS4gIEJ5CitkZWZhdWx0IGl0IGhhcyB0aGUgbmFtZQorQGlmc2V0IEdFTkVSSUMKK0BpZnNldCBJOTYwCitAZmlsZXthLm91dH0gKG9yIEBmaWxle2Iub3V0fSwgZm9yIEludGVsIDk2MCB0YXJnZXRzIG9ubHkpLgorQGVuZCBpZnNldAorQGlmY2xlYXIgSTk2MAorQGZpbGV7YS5vdXR9LgorQGVuZCBpZmNsZWFyCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAaWZzZXQgSTk2MAorQGZpbGV7Yi5vdXR9LgorQGVuZCBpZnNldAorQGlmY2xlYXIgSTk2MAorQGZpbGV7YS5vdXR9LgorQGVuZCBpZmNsZWFyCitAZW5kIGlmY2xlYXIKK1lvdSB1c2UgdGhpcyBvcHRpb24gKHdoaWNoIHRha2VzIGV4YWN0bHkgb25lIGZpbGVuYW1lKSB0byBnaXZlIHRoZQorb2JqZWN0IGZpbGUgYSBkaWZmZXJlbnQgbmFtZS4KKworV2hhdGV2ZXIgdGhlIG9iamVjdCBmaWxlIGlzIGNhbGxlZCwgQGNvZGV7QHZhbHVle0FTfX0gb3ZlcndyaXRlcyBhbnkKK2V4aXN0aW5nIGZpbGUgb2YgdGhlIHNhbWUgbmFtZS4KKworQG5vZGUgUgorQHNlY3Rpb24gSm9pbiBEYXRhIGFuZCBUZXh0IFNlY3Rpb25zOiBAY29kZXstUn0KKworQGtpbmRleCAtUgorQGNpbmRleCBkYXRhIGFuZCB0ZXh0IHNlY3Rpb25zLCBqb2luaW5nCitAY2luZGV4IHRleHQgYW5kIGRhdGEgc2VjdGlvbnMsIGpvaW5pbmcKK0BjaW5kZXggam9pbmluZyB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zCitAY2luZGV4IG1lcmdpbmcgdGV4dCBhbmQgZGF0YSBzZWN0aW9ucworQGNvZGV7LVJ9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHdyaXRlIHRoZSBvYmplY3QgZmlsZSBhcyBpZiBhbGwKK2RhdGEtc2VjdGlvbiBkYXRhIGxpdmVzIGluIHRoZSB0ZXh0IHNlY3Rpb24uICBUaGlzIGlzIG9ubHkgZG9uZSBhdAordGhlIHZlcnkgbGFzdCBtb21lbnQ6ICB5b3VyIGJpbmFyeSBkYXRhIGFyZSB0aGUgc2FtZSwgYnV0IGRhdGEKK3NlY3Rpb24gcGFydHMgYXJlIHJlbG9jYXRlZCBkaWZmZXJlbnRseS4gIFRoZSBkYXRhIHNlY3Rpb24gcGFydCBvZgoreW91ciBvYmplY3QgZmlsZSBpcyB6ZXJvIGJ5dGVzIGxvbmcgYmVjYXVzZSBhbGwgaXRzIGJ5dGVzIGFyZQorYXBwZW5kZWQgdG8gdGhlIHRleHQgc2VjdGlvbi4gIChAeHJlZntTZWN0aW9ucywsU2VjdGlvbnMgYW5kIFJlbG9jYXRpb259LikKKworV2hlbiB5b3Ugc3BlY2lmeSBAY29kZXstUn0gaXQgd291bGQgYmUgcG9zc2libGUgdG8gZ2VuZXJhdGUgc2hvcnRlcgorYWRkcmVzcyBkaXNwbGFjZW1lbnRzIChiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIHRvIGNyb3NzIGJldHdlZW4gdGV4dCBhbmQKK2RhdGEgc2VjdGlvbikuICBXZSByZWZyYWluIGZyb20gZG9pbmcgdGhpcyBzaW1wbHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorb2xkZXIgdmVyc2lvbnMgb2YgQGNvZGV7QHZhbHVle0FTfX0uICBJbiBmdXR1cmUsIEBjb2Rley1SfSBtYXkgd29yayB0aGlzIHdheS4KKworQGlmc2V0IENPRkYKK1doZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQ09GRiBvdXRwdXQsCit0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgdXNlIHNlY3Rpb25zIG5hbWVkIEBzYW1wey50ZXh0fSBhbmQKK0BzYW1wey5kYXRhfS4KK0BlbmQgaWZzZXQKKworQGlmc2V0IEhQUEEKK0Bjb2Rley1SfSBpcyBub3Qgc3VwcG9ydGVkIGZvciBhbnkgb2YgdGhlIEhQUEEgdGFyZ2V0cy4gIFVzaW5nCitAY29kZXstUn0gZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIEBjb2Rle0B2YWx1ZXtBU319LgorQGVuZCBpZnNldAorCitAbm9kZSBzdGF0aXN0aWNzCitAc2VjdGlvbiBEaXNwbGF5IEFzc2VtYmx5IFN0YXRpc3RpY3M6IEBjb2Rley0tc3RhdGlzdGljc30KKworQGtpbmRleCAtLXN0YXRpc3RpY3MKK0BjaW5kZXggc3RhdGlzdGljcywgYWJvdXQgYXNzZW1ibHkKK0BjaW5kZXggdGltZSwgdG90YWwgZm9yIGFzc2VtYmx5CitAY2luZGV4IHNwYWNlIHVzZWQsIG1heGltdW0gZm9yIGFzc2VtYmx5CitVc2UgQHNhbXB7LS1zdGF0aXN0aWNzfSB0byBkaXNwbGF5IHR3byBzdGF0aXN0aWNzIGFib3V0IHRoZSByZXNvdXJjZXMgdXNlZCBieQorQGNvZGV7QHZhbHVle0FTfX06IHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzcGFjZSBhbGxvY2F0ZWQgZHVyaW5nIHRoZSBhc3NlbWJseQorKGluIGJ5dGVzKSwgYW5kIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSB0YWtlbiBmb3IgdGhlIGFzc2VtYmx5IChpbiBAc2N7Y3B1fQorc2Vjb25kcykuCisKK0Bub2RlIHRyYWRpdGlvbmFsLWZvcm1hdAorQHNlY3Rpb24gQ29tcGF0aWJsZSBvdXRwdXQ6IEBjb2Rley0tdHJhZGl0aW9uYWwtZm9ybWF0fQorCitAa2luZGV4IC0tdHJhZGl0aW9uYWwtZm9ybWF0CitGb3Igc29tZSB0YXJnZXRzLCB0aGUgb3V0cHV0IG9mIEBjb2Rle0B2YWx1ZXtBU319IGlzIGRpZmZlcmVudCBpbiBzb21lIHdheXMKK2Zyb20gdGhlIG91dHB1dCBvZiBzb21lIGV4aXN0aW5nIGFzc2VtYmxlci4gIFRoaXMgc3dpdGNoIHJlcXVlc3RzCitAY29kZXtAdmFsdWV7QVN9fSB0byB1c2UgdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnN0ZWFkLgorCitGb3IgZXhhbXBsZSwgaXQgZGlzYWJsZXMgdGhlIGV4Y2VwdGlvbiBmcmFtZSBvcHRpbWl6YXRpb25zIHdoaWNoCitAY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSBkb2VzIGJ5IGRlZmF1bHQgb24gQGNvZGV7QHZhbHVle0dDQ319IG91dHB1dC4KKworQG5vZGUgdgorQHNlY3Rpb24gQW5ub3VuY2UgVmVyc2lvbjogQGNvZGV7LXZ9CisKK0BraW5kZXggLXYKK0BraW5kZXggLXZlcnNpb24KK0BjaW5kZXggYXNzZW1ibGVyIHZlcnNpb24KK0BjaW5kZXggdmVyc2lvbiBvZiBhc3NlbWJsZXIKK1lvdSBjYW4gZmluZCBvdXQgd2hhdCB2ZXJzaW9uIG9mIGFzIGlzIHJ1bm5pbmcgYnkgaW5jbHVkaW5nIHRoZQorb3B0aW9uIEBzYW1wey12fSAod2hpY2ggeW91IGNhbiBhbHNvIHNwZWxsIGFzIEBzYW1wey12ZXJzaW9ufSkgb24gdGhlCitjb21tYW5kIGxpbmUuCisKK0Bub2RlIFcKK0BzZWN0aW9uIFN1cHByZXNzIFdhcm5pbmdzOiBAY29kZXstV30KKworQGtpbmRleCAtVworQGNpbmRleCBzdXBwcmVzc2luZyB3YXJuaW5ncworQGNpbmRleCB3YXJuaW5ncywgc3VwcHJlc3NpbmcKK0Bjb2Rle0B2YWx1ZXtBU319IHNob3VsZCBuZXZlciBnaXZlIGEgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIHdoZW4KK2Fzc2VtYmxpbmcgY29tcGlsZXIgb3V0cHV0LiAgQnV0IHByb2dyYW1zIHdyaXR0ZW4gYnkgcGVvcGxlIG9mdGVuCitjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSB0byBnaXZlIGEgd2FybmluZyB0aGF0IGEgcGFydGljdWxhciBhc3N1bXB0aW9uIHdhcworbWFkZS4gIEFsbCBzdWNoIHdhcm5pbmdzIGFyZSBkaXJlY3RlZCB0byB0aGUgc3RhbmRhcmQgZXJyb3IgZmlsZS4KK0lmIHlvdSB1c2UgdGhpcyBvcHRpb24sIG5vIHdhcm5pbmdzIGFyZSBpc3N1ZWQuICBUaGlzIG9wdGlvbiBvbmx5CithZmZlY3RzIHRoZSB3YXJuaW5nIG1lc3NhZ2VzOiBpdCBkb2VzIG5vdCBjaGFuZ2UgYW55IHBhcnRpY3VsYXIgb2YgaG93CitAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgeW91ciBmaWxlLiAgRXJyb3JzLCB3aGljaCBzdG9wIHRoZSBhc3NlbWJseSwgYXJlCitzdGlsbCByZXBvcnRlZC4KKworQG5vZGUgWgorQHNlY3Rpb24gR2VuZXJhdGUgT2JqZWN0IEZpbGUgaW4gU3BpdGUgb2YgRXJyb3JzOiBAY29kZXstWn0KK0BjaW5kZXggb2JqZWN0IGZpbGUsIGFmdGVyIGVycm9ycworQGNpbmRleCBlcnJvcnMsIGNvbnRpbnVpbmcgYWZ0ZXIKK0FmdGVyIGFuIGVycm9yIG1lc3NhZ2UsIEBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IHByb2R1Y2VzIG5vIG91dHB1dC4gIElmIGZvcgorc29tZSByZWFzb24geW91IGFyZSBpbnRlcmVzdGVkIGluIG9iamVjdCBmaWxlIG91dHB1dCBldmVuIGFmdGVyCitAY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBtZXNzYWdlIG9uIHlvdXIgcHJvZ3JhbSwgdXNlIHRoZSBAc2FtcHstWn0KK29wdGlvbi4gIElmIHRoZXJlIGFyZSBhbnkgZXJyb3JzLCBAY29kZXtAdmFsdWV7QVN9fSBjb250aW51ZXMgYW55d2F5cywgYW5kCit3cml0ZXMgYW4gb2JqZWN0IGZpbGUgYWZ0ZXIgYSBmaW5hbCB3YXJuaW5nIG1lc3NhZ2Ugb2YgdGhlIGZvcm0gQHNhbXB7QHZhcntufQorZXJyb3JzLCBAdmFye219IHdhcm5pbmdzLCBnZW5lcmF0aW5nIGJhZCBvYmplY3QgZmlsZS59CisKK0Bub2RlIFN5bnRheAorQGNoYXB0ZXIgU3ludGF4CisKK0BjaW5kZXggbWFjaGluZS1pbmRlcGVuZGVudCBzeW50YXgKK0BjaW5kZXggc3ludGF4LCBtYWNoaW5lLWluZGVwZW5kZW50CitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBtYWNoaW5lLWluZGVwZW5kZW50IHN5bnRheCBhbGxvd2VkIGluIGEKK3NvdXJjZSBmaWxlLiAgQGNvZGV7QHZhbHVle0FTfX0gc3ludGF4IGlzIHNpbWlsYXIgdG8gd2hhdCBtYW55IG90aGVyCithc3NlbWJsZXJzIHVzZTsgaXQgaXMgaW5zcGlyZWQgYnkgdGhlIEJTRCA0LjIKK0BpZmNsZWFyIFZBWAorYXNzZW1ibGVyLgorQGVuZCBpZmNsZWFyCitAaWZzZXQgVkFYCithc3NlbWJsZXIsIGV4Y2VwdCB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IGFzc2VtYmxlIFZheCBiaXQtZmllbGRzLgorQGVuZCBpZnNldAorCitAbWVudQorKiBQcmVwcm9jZXNzaW5nOjogICAgICAgICAgICAgIFByZXByb2Nlc3NpbmcKKyogV2hpdGVzcGFjZTo6ICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZQorKiBDb21tZW50czo6ICAgICAgICAgICAgICAgICAgICBDb21tZW50cworKiBTeW1ib2wgSW50cm86OiAgICAgICAgICAgICAgICBTeW1ib2xzCisqIFN0YXRlbWVudHM6OiAgICAgICAgICAgICAgICAgIFN0YXRlbWVudHMKKyogQ29uc3RhbnRzOjogICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzCitAZW5kIG1lbnUKKworQG5vZGUgUHJlcHJvY2Vzc2luZworQHNlY3Rpb24gUHJlcHJvY2Vzc2luZworCitAY2luZGV4IHByZXByb2Nlc3NpbmcKK1RoZSBAY29kZXtAdmFsdWV7QVN9fSBpbnRlcm5hbCBwcmVwcm9jZXNzb3I6CitAaXRlbWl6ZSBAYnVsbGV0CitAY2luZGV4IHdoaXRlc3BhY2UsIHJlbW92ZWQgYnkgcHJlcHJvY2Vzc29yCitAaXRlbQorYWRqdXN0cyBhbmQgcmVtb3ZlcyBleHRyYSB3aGl0ZXNwYWNlLiAgSXQgbGVhdmVzIG9uZSBzcGFjZSBvciB0YWIgYmVmb3JlCit0aGUga2V5d29yZHMgb24gYSBsaW5lLCBhbmQgdHVybnMgYW55IG90aGVyIHdoaXRlc3BhY2Ugb24gdGhlIGxpbmUgaW50bworYSBzaW5nbGUgc3BhY2UuCisKK0BjaW5kZXggY29tbWVudHMsIHJlbW92ZWQgYnkgcHJlcHJvY2Vzc29yCitAaXRlbQorcmVtb3ZlcyBhbGwgY29tbWVudHMsIHJlcGxhY2luZyB0aGVtIHdpdGggYSBzaW5nbGUgc3BhY2UsIG9yIGFuCithcHByb3ByaWF0ZSBudW1iZXIgb2YgbmV3bGluZXMuCisKK0BjaW5kZXggY29uc3RhbnRzLCBjb252ZXJ0ZWQgYnkgcHJlcHJvY2Vzc29yCitAaXRlbQorY29udmVydHMgY2hhcmFjdGVyIGNvbnN0YW50cyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBudW1lcmljIHZhbHVlcy4KK0BlbmQgaXRlbWl6ZQorCitJdCBkb2VzIG5vdCBkbyBtYWNybyBwcm9jZXNzaW5nLCBpbmNsdWRlIGZpbGUgaGFuZGxpbmcsIG9yCithbnl0aGluZyBlbHNlIHlvdSBtYXkgZ2V0IGZyb20geW91ciBDIGNvbXBpbGVyJ3MgcHJlcHJvY2Vzc29yLiAgWW91IGNhbgorZG8gaW5jbHVkZSBmaWxlIHByb2Nlc3Npbmcgd2l0aCB0aGUgQGNvZGV7LmluY2x1ZGV9IGRpcmVjdGl2ZQorKEBweHJlZntJbmNsdWRlLCxAY29kZXsuaW5jbHVkZX19KS4gIFlvdSBjYW4gdXNlIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyIGRyaXZlcgordG8gZ2V0IG90aGVyIGBgQ1BQJycgc3R5bGUgcHJlcHJvY2Vzc2luZywgYnkgZ2l2aW5nIHRoZSBpbnB1dCBmaWxlIGEKK0BzYW1wey5TfSBzdWZmaXguICBAeHJlZntPdmVyYWxsIE9wdGlvbnMsLCBPcHRpb25zIENvbnRyb2xsaW5nIHRoZSBLaW5kIG9mCitPdXRwdXQsIGdjYy5pbmZvLCBVc2luZyBHTlUgQ0N9LgorCitFeGNlc3Mgd2hpdGVzcGFjZSwgY29tbWVudHMsIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzCitjYW5ub3QgYmUgdXNlZCBpbiB0aGUgcG9ydGlvbnMgb2YgdGhlIGlucHV0IHRleHQgdGhhdCBhcmUgbm90CitwcmVwcm9jZXNzZWQuCisKK0BjaW5kZXggdHVybmluZyBwcmVwcm9jZXNzaW5nIG9uIGFuZCBvZmYKK0BjaW5kZXggcHJlcHJvY2Vzc2luZywgdHVybmluZyBvbiBhbmQgb2ZmCitAa2luZGV4ICNOT19BUFAKK0BraW5kZXggI0FQUAorSWYgdGhlIGZpcnN0IGxpbmUgb2YgYW4gaW5wdXQgZmlsZSBpcyBAY29kZXsjTk9fQVBQfSBvciBpZiB5b3UgdXNlIHRoZQorQHNhbXB7LWZ9IG9wdGlvbiwgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIGlucHV0IGZpbGUuCitXaXRoaW4gYW4gaW5wdXQgZmlsZSwgeW91IGNhbiBhc2sgZm9yIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcmVtb3ZhbCBpbgorc3BlY2lmaWMgcG9ydGlvbnMgb2YgdGhlIGJ5IHB1dHRpbmcgYSBsaW5lIHRoYXQgc2F5cyBAY29kZXsjQVBQfSBiZWZvcmUgdGhlCit0ZXh0IHRoYXQgbWF5IGNvbnRhaW4gd2hpdGVzcGFjZSBvciBjb21tZW50cywgYW5kIHB1dHRpbmcgYSBsaW5lIHRoYXQgc2F5cworQGNvZGV7I05PX0FQUH0gYWZ0ZXIgdGhpcyB0ZXh0LiAgVGhpcyBmZWF0dXJlIGlzIG1haW5seSBpbnRlbmQgdG8gc3VwcG9ydAorQGNvZGV7YXNtfSBzdGF0ZW1lbnRzIGluIGNvbXBpbGVycyB3aG9zZSBvdXRwdXQgaXMgb3RoZXJ3aXNlIGZyZWUgb2YgY29tbWVudHMKK2FuZCB3aGl0ZXNwYWNlLgorCitAbm9kZSBXaGl0ZXNwYWNlCitAc2VjdGlvbiBXaGl0ZXNwYWNlCisKK0BjaW5kZXggd2hpdGVzcGFjZQorQGRmbntXaGl0ZXNwYWNlfSBpcyBvbmUgb3IgbW9yZSBibGFua3Mgb3IgdGFicywgaW4gYW55IG9yZGVyLgorV2hpdGVzcGFjZSBpcyB1c2VkIHRvIHNlcGFyYXRlIHN5bWJvbHMsIGFuZCB0byBtYWtlIHByb2dyYW1zIG5lYXRlciBmb3IKK3Blb3BsZSB0byByZWFkLiAgVW5sZXNzIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzCisoQHB4cmVme0NoYXJhY3RlcnMsLENoYXJhY3RlciBDb25zdGFudHN9KSwgYW55IHdoaXRlc3BhY2UgbWVhbnMgdGhlIHNhbWUKK2FzIGV4YWN0bHkgb25lIHNwYWNlLgorCitAbm9kZSBDb21tZW50cworQHNlY3Rpb24gQ29tbWVudHMKKworQGNpbmRleCBjb21tZW50cworVGhlcmUgYXJlIHR3byB3YXlzIG9mIHJlbmRlcmluZyBjb21tZW50cyB0byBAY29kZXtAdmFsdWV7QVN9fS4gIEluIGJvdGgKK2Nhc2VzIHRoZSBjb21tZW50IGlzIGVxdWl2YWxlbnQgdG8gb25lIHNwYWNlLgorCitBbnl0aGluZyBmcm9tIEBzYW1wey8qfSB0aHJvdWdoIHRoZSBuZXh0IEBzYW1weyovfSBpcyBhIGNvbW1lbnQuCitUaGlzIG1lYW5zIHlvdSBtYXkgbm90IG5lc3QgdGhlc2UgY29tbWVudHMuCisKK0BzbWFsbGV4YW1wbGUKKy8qCisgIFRoZSBvbmx5IHdheSB0byBpbmNsdWRlIGEgbmV3bGluZSAoJ1xuJykgaW4gYSBjb21tZW50CisgIGlzIHRvIHVzZSB0aGlzIHNvcnQgb2YgY29tbWVudC4KKyovCisKKy8qIFRoaXMgc29ydCBvZiBjb21tZW50IGRvZXMgbm90IG5lc3QuICovCitAZW5kIHNtYWxsZXhhbXBsZQorCitAY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKK0FueXRoaW5nIGZyb20gdGhlIEBkZm57bGluZSBjb21tZW50fSBjaGFyYWN0ZXIgdG8gdGhlIG5leHQgbmV3bGluZQoraXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIGlnbm9yZWQuICBUaGUgbGluZSBjb21tZW50IGNoYXJhY3RlciBpcworQGlmc2V0IEEyOUsKK0BzYW1wezt9IGZvciB0aGUgQU1EIDI5SyBmYW1pbHk7CitAZW5kIGlmc2V0CitAaWZzZXQgQVJDCitAc2FtcHs7fSBvbiB0aGUgQVJDOworQGVuZCBpZnNldAorQGlmc2V0IEg4LzMwMAorQHNhbXB7O30gZm9yIHRoZSBIOC8zMDAgZmFtaWx5OworQGVuZCBpZnNldAorQGlmc2V0IEg4LzUwMAorQHNhbXB7IX0gZm9yIHRoZSBIOC81MDAgZmFtaWx5OworQGVuZCBpZnNldAorQGlmc2V0IEhQUEEKK0BzYW1wezt9IGZvciB0aGUgSFBQQTsKK0BlbmQgaWZzZXQKK0BpZnNldCBJOTYwCitAc2FtcHsjfSBvbiB0aGUgaTk2MDsKK0BlbmQgaWZzZXQKK0BpZnNldCBTSAorQHNhbXB7IX0gZm9yIHRoZSBIaXRhY2hpIFNIOworQGVuZCBpZnNldAorQGlmc2V0IFNQQVJDCitAc2FtcHshfSBvbiB0aGUgU1BBUkM7CitAZW5kIGlmc2V0CitAaWZzZXQgTTMyUgorQHNhbXB7I30gb24gdGhlIG0zMnI7CitAZW5kIGlmc2V0CitAaWZzZXQgTTY4MFgwCitAc2FtcHt8fSBvbiB0aGUgNjgweDA7CitAZW5kIGlmc2V0CitAaWZzZXQgVkFYCitAc2FtcHsjfSBvbiB0aGUgVmF4OworQGVuZCBpZnNldAorQGlmc2V0IFo4MDAwCitAc2FtcHshfSBmb3IgdGhlIFo4MDAwOworQGVuZCBpZnNldAorQGlmc2V0IFY4NTAKK0BzYW1weyN9IG9uIHRoZSBWODUwOworQGVuZCBpZnNldAorc2VlIEByZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LiAgQHJlZmlsbAorQGMgRklYTUUgV2hhdCBhYm91dCBpMzg2LCBtODhrLCBpODYwPworCitAaWZzZXQgR0VORVJJQworT24gc29tZSBtYWNoaW5lcyB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVycy4gIE9uZQorY2hhcmFjdGVyIG9ubHkgYmVnaW5zIGEgY29tbWVudCBpZiBpdCBpcyB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIG9uCithIGxpbmUsIHdoaWxlIHRoZSBvdGhlciBhbHdheXMgYmVnaW5zIGEgY29tbWVudC4KK0BlbmQgaWZzZXQKKworQGlmc2V0IFY4NTAKK1RoZSBWODUwIGFzc2VtYmxlciBhbHNvIHN1cHBvcnRzIGEgZG91YmxlIGRhc2ggYXMgc3RhcnRpbmcgYSBjb21tZW50IHRoYXQKK2V4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKworQHNhbXB7LS19OworQGVuZCBpZnNldAorCitAa2luZGV4ICMKK0BjaW5kZXggbGluZXMgc3RhcnRpbmcgd2l0aCBAY29kZXsjfQorQGNpbmRleCBsb2dpY2FsIGxpbmUgbnVtYmVycworVG8gYmUgY29tcGF0aWJsZSB3aXRoIHBhc3QgYXNzZW1ibGVycywgbGluZXMgdGhhdCBiZWdpbiB3aXRoIEBzYW1weyN9IGhhdmUgYQorc3BlY2lhbCBpbnRlcnByZXRhdGlvbi4gIEZvbGxvd2luZyB0aGUgQHNhbXB7I30gc2hvdWxkIGJlIGFuIGFic29sdXRlCitleHByZXNzaW9uIChAcHhyZWZ7RXhwcmVzc2lvbnN9KTogdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIgb2YgdGhlIEBlbXBoe25leHR9CitsaW5lLiAgVGhlbiBhIHN0cmluZyAoQHB4cmVme1N0cmluZ3MsLCBTdHJpbmdzfSkgaXMgYWxsb3dlZDogaWYgcHJlc2VudCBpdCBpcyBhCituZXcgbG9naWNhbCBmaWxlIG5hbWUuICBUaGUgcmVzdCBvZiB0aGUgbGluZSwgaWYgYW55LCBzaG91bGQgYmUgd2hpdGVzcGFjZS4KKworSWYgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgb24gdGhlIGxpbmUgYXJlIG5vdCBudW1lcmljLAordGhlIGxpbmUgaXMgaWdub3JlZC4gIChKdXN0IGxpa2UgYSBjb21tZW50LikKKworQHNtYWxsZXhhbXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gb3JkaW5hcnkgY29tbWVudC4KKyMgNDItNiAibmV3X2ZpbGVfbmFtZSIgICAgIyBOZXcgbG9naWNhbCBmaWxlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGxvZ2ljYWwgbGluZSAjIDM2LgorQGVuZCBzbWFsbGV4YW1wbGUKK1RoaXMgZmVhdHVyZSBpcyBkZXByZWNhdGVkLCBhbmQgbWF5IGRpc2FwcGVhciBmcm9tIGZ1dHVyZSB2ZXJzaW9ucworb2YgQGNvZGV7QHZhbHVle0FTfX0uCisKK0Bub2RlIFN5bWJvbCBJbnRybworQHNlY3Rpb24gU3ltYm9scworCitAY2luZGV4IGNoYXJhY3RlcnMgdXNlZCBpbiBzeW1ib2xzCitAaWZjbGVhciBTUEVDSUFMLVNZTVMKK0EgQGRmbntzeW1ib2x9IGlzIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgY2hvc2VuIGZyb20gdGhlIHNldCBvZiBhbGwKK2xldHRlcnMgKGJvdGggdXBwZXIgYW5kIGxvd2VyIGNhc2UpLCBkaWdpdHMgYW5kIHRoZSB0aHJlZSBjaGFyYWN0ZXJzCitAc2FtcHtfLiR9LgorQGVuZCBpZmNsZWFyCitAaWZzZXQgU1BFQ0lBTC1TWU1TCitAaWZjbGVhciBHRU5FUklDCitAaWZzZXQgSDgKK0EgQGRmbntzeW1ib2x9IGlzIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgY2hvc2VuIGZyb20gdGhlIHNldCBvZiBhbGwKK2xldHRlcnMgKGJvdGggdXBwZXIgYW5kIGxvd2VyIGNhc2UpLCBkaWdpdHMgYW5kIHRoZSB0aHJlZSBjaGFyYWN0ZXJzCitAc2FtcHsuXyR9LiAgKFNhdmUgdGhhdCwgb24gdGhlIEg4LzMwMCBvbmx5LCB5b3UgbWF5IG5vdCB1c2UgQHNhbXB7JH0gaW4KK3N5bWJvbCBuYW1lcy4pCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKK0BlbmQgaWZzZXQKK0BpZnNldCBHRU5FUklDCitPbiBtb3N0IG1hY2hpbmVzLCB5b3UgY2FuIGFsc28gdXNlIEBjb2RleyR9IGluIHN5bWJvbCBuYW1lczsgZXhjZXB0aW9ucworYXJlIG5vdGVkIGluIEByZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgorQGVuZCBpZnNldAorTm8gc3ltYm9sIG1heSBiZWdpbiB3aXRoIGEgZGlnaXQuICBDYXNlIGlzIHNpZ25pZmljYW50LgorVGhlcmUgaXMgbm8gbGVuZ3RoIGxpbWl0OiBhbGwgY2hhcmFjdGVycyBhcmUgc2lnbmlmaWNhbnQuICBTeW1ib2xzIGFyZQorZGVsaW1pdGVkIGJ5IGNoYXJhY3RlcnMgbm90IGluIHRoYXQgc2V0LCBvciBieSB0aGUgYmVnaW5uaW5nIG9mIGEgZmlsZQorKHNpbmNlIHRoZSBzb3VyY2UgcHJvZ3JhbSBtdXN0IGVuZCB3aXRoIGEgbmV3bGluZSwgdGhlIGVuZCBvZiBhIGZpbGUgaXMKK25vdCBhIHBvc3NpYmxlIHN5bWJvbCBkZWxpbWl0ZXIpLiAgQHhyZWZ7U3ltYm9sc30uCitAY2luZGV4IGxlbmd0aCBvZiBzeW1ib2xzCisKK0Bub2RlIFN0YXRlbWVudHMKK0BzZWN0aW9uIFN0YXRlbWVudHMKKworQGNpbmRleCBzdGF0ZW1lbnRzLCBzdHJ1Y3R1cmUgb2YKK0BjaW5kZXggbGluZSBzZXBhcmF0b3IgY2hhcmFjdGVyCitAY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyCitAaWZjbGVhciBHRU5FUklDCitAaWZjbGVhciBhYm5vcm1hbC1zZXBhcmF0b3IKK0EgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBhdCBhCitzZW1pY29sb24gKEBzYW1wezt9KS4gIFRoZSBuZXdsaW5lIG9yIHNlbWljb2xvbiBpcyBjb25zaWRlcmVkIHBhcnQgb2YKK3RoZSBwcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlbWljb2xvbnMgd2l0aGluIGNoYXJhY3RlcgorY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgorQGVuZCBpZmNsZWFyCitAaWZzZXQgYWJub3JtYWwtc2VwYXJhdG9yCitAaWZzZXQgQTI5SworQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGFuIGBgYXQnJworc2lnbiAoQHNhbXB7QEB9KS4gIFRoZSBuZXdsaW5lIG9yIGF0IHNpZ24gaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZQorcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBhdCBzaWducyB3aXRoaW4gY2hhcmFjdGVyIGNvbnN0YW50cworYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCitAZW5kIGlmc2V0CitAaWZzZXQgSFBQQQorQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGFuIGV4Y2xhbWF0aW9uIAorcG9pbnQgKEBzYW1weyF9KS4gIFRoZSBuZXdsaW5lIG9yIGV4Y2xhbWF0aW9uIHBvaW50IGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUKK3ByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgZXhjbGFtYXRpb24gcG9pbnRzIHdpdGhpbiBjaGFyYWN0ZXIKK2NvbnN0YW50cyBhcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KK0BlbmQgaWZzZXQKK0BpZnNldCBIOAorQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pOyBvciAoZm9yIHRoZQorSDgvMzAwKSBhIGRvbGxhciBzaWduIChAc2FtcHskfSk7IG9yIChmb3IgdGhlCitIaXRhY2hpLVNIIG9yIHRoZQorSDgvNTAwKSBhIHNlbWljb2xvbgorKEBzYW1wezt9KS4gIFRoZSBuZXdsaW5lIG9yIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mCit0aGUgcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZXBhcmF0b3JzIHdpdGhpbiBjaGFyYWN0ZXIKK2NvbnN0YW50cyBhcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorQGlmc2V0IEdFTkVSSUMKK0EgQGRmbntzdGF0ZW1lbnR9IGVuZHMgYXQgYSBuZXdsaW5lIGNoYXJhY3RlciAoQHNhbXB7XG59KSBvciBsaW5lCitzZXBhcmF0b3IgY2hhcmFjdGVyLiAgKFRoZSBsaW5lIHNlcGFyYXRvciBpcyB1c3VhbGx5IEBzYW1wezt9LCB1bmxlc3MKK3RoaXMgY29uZmxpY3RzIHdpdGggdGhlIGNvbW1lbnQgY2hhcmFjdGVyOyBAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LikgIFRoZQorbmV3bGluZSBvciBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHJlY2VkaW5nCitzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VwYXJhdG9ycyB3aXRoaW4gY2hhcmFjdGVyIGNvbnN0YW50cyBhcmUgYW4KK2V4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCitAZW5kIGlmc2V0CisKK0BjaW5kZXggbmV3bGluZSwgcmVxdWlyZWQgYXQgZmlsZSBlbmQKK0BjaW5kZXggRU9GLCBuZXdsaW5lIG11c3QgcHJlY2VkZQorSXQgaXMgYW4gZXJyb3IgdG8gZW5kIGFueSBzdGF0ZW1lbnQgd2l0aCBlbmQtb2YtZmlsZTogIHRoZSBsYXN0CitjaGFyYWN0ZXIgb2YgYW55IGlucHV0IGZpbGUgc2hvdWxkIGJlIGEgbmV3bGluZS5AcmVmaWxsCisKK0FuIGVtcHR5IHN0YXRlbWVudCBpcyBhbGxvd2VkLCBhbmQgbWF5IGluY2x1ZGUgd2hpdGVzcGFjZS4gIEl0IGlzIGlnbm9yZWQuCisKK0BjaW5kZXggaW5zdHJ1Y3Rpb25zIGFuZCBkaXJlY3RpdmVzCitAY2luZGV4IGRpcmVjdGl2ZXMgYW5kIGluc3RydWN0aW9ucworQGMgImtleSBzeW1ib2wiIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQ7IHNlZW1zIHBlZGFudGljIHRvCitAYyBAZGVmbnt9IGl0IGluIHRoYXQgY2FzZSwgYXMgd2FzIGRvbmUgcHJldmlvdXNseS4uLiAgZG9jQGN5Z251cy5jb20sCitAYyAxM2ZlYjkxLgorQSBzdGF0ZW1lbnQgYmVnaW5zIHdpdGggemVybyBvciBtb3JlIGxhYmVscywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhCitrZXkgc3ltYm9sIHdoaWNoIGRldGVybWluZXMgd2hhdCBraW5kIG9mIHN0YXRlbWVudCBpdCBpcy4gIFRoZSBrZXkKK3N5bWJvbCBkZXRlcm1pbmVzIHRoZSBzeW50YXggb2YgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlbWVudC4gIElmIHRoZQorc3ltYm9sIGJlZ2lucyB3aXRoIGEgZG90IEBzYW1wey59IHRoZW4gdGhlIHN0YXRlbWVudCBpcyBhbiBhc3NlbWJsZXIKK2RpcmVjdGl2ZTogdHlwaWNhbGx5IHZhbGlkIGZvciBhbnkgY29tcHV0ZXIuICBJZiB0aGUgc3ltYm9sIGJlZ2lucyB3aXRoCithIGxldHRlciB0aGUgc3RhdGVtZW50IGlzIGFuIGFzc2VtYmx5IGxhbmd1YWdlIEBkZm57aW5zdHJ1Y3Rpb259OiBpdAorYXNzZW1ibGVzIGludG8gYSBtYWNoaW5lIGxhbmd1YWdlIGluc3RydWN0aW9uLgorQGlmc2V0IEdFTkVSSUMKK0RpZmZlcmVudCB2ZXJzaW9ucyBvZiBAY29kZXtAdmFsdWV7QVN9fSBmb3IgZGlmZmVyZW50IGNvbXB1dGVycworcmVjb2duaXplIGRpZmZlcmVudCBpbnN0cnVjdGlvbnMuICBJbiBmYWN0LCB0aGUgc2FtZSBzeW1ib2wgbWF5CityZXByZXNlbnQgYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24gaW4gYSBkaWZmZXJlbnQgY29tcHV0ZXIncyBhc3NlbWJseQorbGFuZ3VhZ2UuQHJlZmlsbAorQGVuZCBpZnNldAorCitAY2luZGV4IEBjb2Rlezp9IChsYWJlbCkKK0BjaW5kZXggbGFiZWwgKEBjb2Rlezp9KQorQSBsYWJlbCBpcyBhIHN5bWJvbCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbG9uIChAY29kZXs6fSkuCitXaGl0ZXNwYWNlIGJlZm9yZSBhIGxhYmVsIG9yIGFmdGVyIGEgY29sb24gaXMgcGVybWl0dGVkLCBidXQgeW91IG1heSBub3QKK2hhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIGEgbGFiZWwncyBzeW1ib2wgYW5kIGl0cyBjb2xvbi4gQHhyZWZ7TGFiZWxzfS4KKworQGlmc2V0IEhQUEEKK0ZvciBIUFBBIHRhcmdldHMsIGxhYmVscyBuZWVkIG5vdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbG9uLCBidXQgCit0aGUgZGVmaW5pdGlvbiBvZiBhIGxhYmVsIG11c3QgYmVnaW4gaW4gY29sdW1uIHplcm8uICBUaGlzIGFsc28gaW1wbGllcyB0aGF0Citvbmx5IG9uZSBsYWJlbCBtYXkgYmUgZGVmaW5lZCBvbiBlYWNoIGxpbmUuCitAZW5kIGlmc2V0CisKK0BzbWFsbGV4YW1wbGUKK2xhYmVsOiAgICAgLmRpcmVjdGl2ZSAgICBmb2xsb3dlZCBieSBzb21ldGhpbmcKK2Fub3RoZXJfbGFiZWw6ICAgICAgICAgICAjIFRoaXMgaXMgYW4gZW1wdHkgc3RhdGVtZW50LgorICAgICAgICAgICBpbnN0cnVjdGlvbiAgIG9wZXJhbmRfMSwgb3BlcmFuZF8yLCBAZG90c3t9CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9kZSBDb25zdGFudHMKK0BzZWN0aW9uIENvbnN0YW50cworCitAY2luZGV4IGNvbnN0YW50cworQSBjb25zdGFudCBpcyBhIG51bWJlciwgd3JpdHRlbiBzbyB0aGF0IGl0cyB2YWx1ZSBpcyBrbm93biBieQoraW5zcGVjdGlvbiwgd2l0aG91dCBrbm93aW5nIGFueSBjb250ZXh0LiAgTGlrZSB0aGlzOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCisuYnl0ZSAgNzQsIDAxMTIsIDA5MiwgMHg0QSwgMFg0YSwgJ0osICdcSiAjIEFsbCB0aGUgc2FtZSB2YWx1ZS4KKy5hc2NpaSAiUmluZyB0aGUgYmVsbFw3IiAgICAgICAgICAgICAgICAgICMgQSBzdHJpbmcgY29uc3RhbnQuCisub2N0YSAgMHgxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5QUJDREVGMCAjIEEgYmlnbnVtLgorLmZsb2F0IDBmLTMxNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyN1wKKzk1MDI4ODQxOTcxLjY5Mzk5Mzc1MUUtNDAgICAgICAgICAgICAgICAgICMgLSBwaSwgYSBmbG9udW0uCitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbWVudQorKiBDaGFyYWN0ZXJzOjogICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIgQ29uc3RhbnRzCisqIE51bWJlcnM6OiAgICAgICAgICAgICAgICAgICAgIE51bWJlciBDb25zdGFudHMKK0BlbmQgbWVudQorCitAbm9kZSBDaGFyYWN0ZXJzCitAc3Vic2VjdGlvbiBDaGFyYWN0ZXIgQ29uc3RhbnRzCisKK0BjaW5kZXggY2hhcmFjdGVyIGNvbnN0YW50cworQGNpbmRleCBjb25zdGFudHMsIGNoYXJhY3RlcgorVGhlcmUgYXJlIHR3byBraW5kcyBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgQSBAZGZue2NoYXJhY3Rlcn0gc3RhbmRzCitmb3Igb25lIGNoYXJhY3RlciBpbiBvbmUgYnl0ZSBhbmQgaXRzIHZhbHVlIG1heSBiZSB1c2VkIGluCitudW1lcmljIGV4cHJlc3Npb25zLiAgU3RyaW5nIGNvbnN0YW50cyAocHJvcGVybHkgY2FsbGVkIHN0cmluZworQGVtcGh7bGl0ZXJhbHN9KSBhcmUgcG90ZW50aWFsbHkgbWFueSBieXRlcyBhbmQgdGhlaXIgdmFsdWVzIG1heSBub3QgYmUKK3VzZWQgaW4gYXJpdGhtZXRpYyBleHByZXNzaW9ucy4KKworQG1lbnUKKyogU3RyaW5nczo6ICAgICAgICAgICAgICAgICAgICAgU3RyaW5ncworKiBDaGFyczo6ICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJzCitAZW5kIG1lbnUKKworQG5vZGUgU3RyaW5ncworQHN1YnN1YnNlY3Rpb24gU3RyaW5ncworCitAY2luZGV4IHN0cmluZyBjb25zdGFudHMKK0BjaW5kZXggY29uc3RhbnRzLCBzdHJpbmcKK0EgQGRmbntzdHJpbmd9IGlzIHdyaXR0ZW4gYmV0d2VlbiBkb3VibGUtcXVvdGVzLiAgSXQgbWF5IGNvbnRhaW4KK2RvdWJsZS1xdW90ZXMgb3IgbnVsbCBjaGFyYWN0ZXJzLiAgVGhlIHdheSB0byBnZXQgc3BlY2lhbCBjaGFyYWN0ZXJzCitpbnRvIGEgc3RyaW5nIGlzIHRvIEBkZm57ZXNjYXBlfSB0aGVzZSBjaGFyYWN0ZXJzOiBwcmVjZWRlIHRoZW0gd2l0aAorYSBiYWNrc2xhc2ggQHNhbXB7XH0gY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGUgQHNhbXB7XFx9IHJlcHJlc2VudHMKK29uZSBiYWNrc2xhc2g6ICB0aGUgZmlyc3QgQGNvZGV7XH0gaXMgYW4gZXNjYXBlIHdoaWNoIHRlbGxzCitAY29kZXtAdmFsdWV7QVN9fSB0byBpbnRlcnByZXQgdGhlIHNlY29uZCBjaGFyYWN0ZXIgbGl0ZXJhbGx5IGFzIGEgYmFja3NsYXNoCisod2hpY2ggcHJldmVudHMgQGNvZGV7QHZhbHVle0FTfX0gZnJvbSByZWNvZ25pemluZyB0aGUgc2Vjb25kIEBjb2Rle1x9IGFzIGFuCitlc2NhcGUgY2hhcmFjdGVyKS4gIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGVzY2FwZXMgZm9sbG93cy4KKworQGNpbmRleCBlc2NhcGUgY29kZXMsIGNoYXJhY3RlcgorQGNpbmRleCBjaGFyYWN0ZXIgZXNjYXBlIGNvZGVzCitAdGFibGUgQGtiZAorQGMgICAgICBAaXRlbSBcYQorQGMgICAgICBNbmVtb25pYyBmb3IgQUNLbm93bGVkZ2U7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDA3LgorQGMKK0BjaW5kZXggQGNvZGV7XGJ9IChiYWNrc3BhY2UgY2hhcmFjdGVyKQorQGNpbmRleCBiYWNrc3BhY2UgKEBjb2Rle1xifSkKK0BpdGVtIFxiCitNbmVtb25pYyBmb3IgYmFja3NwYWNlOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMC4KKworQGMgICAgICBAaXRlbSBcZQorQGMgICAgICBNbmVtb25pYyBmb3IgRU9UZXh0OyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAwNC4KK0BjCitAY2luZGV4IEBjb2Rle1xmfSAoZm9ybWZlZWQgY2hhcmFjdGVyKQorQGNpbmRleCBmb3JtZmVlZCAoQGNvZGV7XGZ9KQorQGl0ZW0gXGYKK01uZW1vbmljIGZvciBGb3JtRmVlZDsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTQuCisKK0BjaW5kZXggQGNvZGV7XG59IChuZXdsaW5lIGNoYXJhY3RlcikKK0BjaW5kZXggbmV3bGluZSAoQGNvZGV7XG59KQorQGl0ZW0gXG4KK01uZW1vbmljIGZvciBuZXdsaW5lOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMi4KKworQGMgICAgICBAaXRlbSBccAorQGMgICAgICBNbmVtb25pYyBmb3IgcHJlZml4OyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAzMywgdXN1YWxseSBrbm93biBhcyBAY29kZXtlc2NhcGV9LgorQGMKK0BjaW5kZXggQGNvZGV7XHJ9IChjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVyKQorQGNpbmRleCBjYXJyaWFnZSByZXR1cm4gKEBjb2Rle1xyfSkKK0BpdGVtIFxyCitNbmVtb25pYyBmb3IgY2FycmlhZ2UtUmV0dXJuOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxNS4KKworQGMgICAgICBAaXRlbSBccworQGMgICAgICBNbmVtb25pYyBmb3Igc3BhY2U7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDQwLiAgSW5jbHVkZWQgZm9yIGNvbXBsaWFuY2Ugd2l0aAorQGMgICAgICBvdGhlciBhc3NlbWJsZXJzLgorQGMKK0BjaW5kZXggQGNvZGV7XHR9ICh0YWIpCitAY2luZGV4IHRhYiAoQGNvZGV7XHR9KQorQGl0ZW0gXHQKK01uZW1vbmljIGZvciBob3Jpem9udGFsIFRhYjsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTEuCisKK0BjICAgICAgQGl0ZW0gXHYKK0BjICAgICAgTW5lbW9uaWMgZm9yIFZlcnRpY2FsIHRhYjsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMTMuCitAYyAgICAgIEBpdGVtIFx4IEB2YXJ7ZGlnaXR9IEB2YXJ7ZGlnaXR9IEB2YXJ7ZGlnaXR9CitAYyAgICAgIEEgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIGNvZGUuICBUaGUgbnVtZXJpYyBjb2RlIGlzIDMgaGV4YWRlY2ltYWwgZGlnaXRzLgorQGMKK0BjaW5kZXggQGNvZGV7XEB2YXJ7ZGRkfX0gKG9jdGFsIGNoYXJhY3RlciBjb2RlKQorQGNpbmRleCBvY3RhbCBjaGFyYWN0ZXIgY29kZSAoQGNvZGV7XEB2YXJ7ZGRkfX0pCitAaXRlbSBcIEB2YXJ7ZGlnaXR9IEB2YXJ7ZGlnaXR9IEB2YXJ7ZGlnaXR9CitBbiBvY3RhbCBjaGFyYWN0ZXIgY29kZS4gIFRoZSBudW1lcmljIGNvZGUgaXMgMyBvY3RhbCBkaWdpdHMuCitGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFVuaXggc3lzdGVtcywgOCBhbmQgOSBhcmUgYWNjZXB0ZWQgYXMgZGlnaXRzOgorZm9yIGV4YW1wbGUsIEBjb2Rle1wwMDh9IGhhcyB0aGUgdmFsdWUgMDEwLCBhbmQgQGNvZGV7XDAwOX0gdGhlIHZhbHVlIDAxMS4KKworQGNpbmRleCBAY29kZXtcQHZhcnt4ZC4uLn19IChoZXggY2hhcmFjdGVyIGNvZGUpCitAY2luZGV4IGhleCBjaGFyYWN0ZXIgY29kZSAoQGNvZGV7XEB2YXJ7eGQuLi59fSkKK0BpdGVtIFxAY29kZXt4fSBAdmFye2hleC1kaWdpdHMuLi59CitBIGhleCBjaGFyYWN0ZXIgY29kZS4gIEFsbCB0cmFpbGluZyBoZXggZGlnaXRzIGFyZSBjb21iaW5lZC4gIEVpdGhlciB1cHBlciBvcgorbG93ZXIgY2FzZSBAY29kZXt4fSB3b3Jrcy4KKworQGNpbmRleCBAY29kZXtcXH0gKEBzYW1we1x9IGNoYXJhY3RlcikKK0BjaW5kZXggYmFja3NsYXNoIChAY29kZXtcXH0pCitAaXRlbSBcXAorUmVwcmVzZW50cyBvbmUgQHNhbXB7XH0gY2hhcmFjdGVyLgorCitAYyAgICAgIEBpdGVtIFwnCitAYyAgICAgIFJlcHJlc2VudHMgb25lIEBzYW1weyd9IChhY2NlbnQgYWN1dGUpIGNoYXJhY3Rlci4KK0BjICAgICAgVGhpcyBpcyBuZWVkZWQgaW4gc2luZ2xlIGNoYXJhY3RlciBsaXRlcmFscworQGMgICAgICAoQHhyZWZ7Q2hhcmFjdGVycywsQ2hhcmFjdGVyIENvbnN0YW50c30uKSB0byByZXByZXNlbnQKK0BjICAgICAgYSBAc2FtcHsnfS4KK0BjCitAY2luZGV4IEBjb2Rle1wifSAoZG91YmxlcXVvdGUgY2hhcmFjdGVyKQorQGNpbmRleCBkb3VibGVxdW90ZSAoQGNvZGV7XCJ9KQorQGl0ZW0gXCIKK1JlcHJlc2VudHMgb25lIEBzYW1weyJ9IGNoYXJhY3Rlci4gIE5lZWRlZCBpbiBzdHJpbmdzIHRvIHJlcHJlc2VudAordGhpcyBjaGFyYWN0ZXIsIGJlY2F1c2UgYW4gdW5lc2NhcGVkIEBzYW1weyJ9IHdvdWxkIGVuZCB0aGUgc3RyaW5nLgorCitAaXRlbSBcIEB2YXJ7YW55dGhpbmctZWxzZX0KK0FueSBvdGhlciBjaGFyYWN0ZXIgd2hlbiBlc2NhcGVkIGJ5IEBrYmR7XH0gZ2l2ZXMgYSB3YXJuaW5nLCBidXQKK2Fzc2VtYmxlcyBhcyBpZiB0aGUgQHNhbXB7XH0gd2FzIG5vdCBwcmVzZW50LiAgVGhlIGlkZWEgaXMgdGhhdCBpZgoreW91IHVzZWQgYW4gZXNjYXBlIHNlcXVlbmNlIHlvdSBjbGVhcmx5IGRpZG4ndCB3YW50IHRoZSBsaXRlcmFsCitpbnRlcnByZXRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3Rlci4gIEhvd2V2ZXIgQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vCitvdGhlciBpbnRlcnByZXRhdGlvbiwgc28gQGNvZGV7QHZhbHVle0FTfX0ga25vd3MgaXQgaXMgZ2l2aW5nIHlvdSB0aGUgd3JvbmcKK2NvZGUgYW5kIHdhcm5zIHlvdSBvZiB0aGUgZmFjdC4KK0BlbmQgdGFibGUKKworV2hpY2ggY2hhcmFjdGVycyBhcmUgZXNjYXBhYmxlLCBhbmQgd2hhdCB0aG9zZSBlc2NhcGVzIHJlcHJlc2VudCwKK3ZhcmllcyB3aWRlbHkgYW1vbmcgYXNzZW1ibGVycy4gIFRoZSBjdXJyZW50IHNldCBpcyB3aGF0IHdlIHRoaW5rCit0aGUgQlNEIDQuMiBhc3NlbWJsZXIgcmVjb2duaXplcywgYW5kIGlzIGEgc3Vic2V0IG9mIHdoYXQgbW9zdCBDCitjb21waWxlcnMgcmVjb2duaXplLiAgSWYgeW91IGFyZSBpbiBkb3VidCwgZG8gbm90IHVzZSBhbiBlc2NhcGUKK3NlcXVlbmNlLgorCitAbm9kZSBDaGFycworQHN1YnN1YnNlY3Rpb24gQ2hhcmFjdGVycworCitAY2luZGV4IHNpbmdsZSBjaGFyYWN0ZXIgY29uc3RhbnQKK0BjaW5kZXggY2hhcmFjdGVyLCBzaW5nbGUKK0BjaW5kZXggY29uc3RhbnQsIHNpbmdsZSBjaGFyYWN0ZXIKK0Egc2luZ2xlIGNoYXJhY3RlciBtYXkgYmUgd3JpdHRlbiBhcyBhIHNpbmdsZSBxdW90ZSBpbW1lZGlhdGVseQorZm9sbG93ZWQgYnkgdGhhdCBjaGFyYWN0ZXIuICBUaGUgc2FtZSBlc2NhcGVzIGFwcGx5IHRvIGNoYXJhY3RlcnMgYXMKK3RvIHN0cmluZ3MuICBTbyBpZiB5b3Ugd2FudCB0byB3cml0ZSB0aGUgY2hhcmFjdGVyIGJhY2tzbGFzaCwgeW91CittdXN0IHdyaXRlIEBrYmR7J1xcfSB3aGVyZSB0aGUgZmlyc3QgQGNvZGV7XH0gZXNjYXBlcyB0aGUgc2Vjb25kCitAY29kZXtcfS4gIEFzIHlvdSBjYW4gc2VlLCB0aGUgcXVvdGUgaXMgYW4gYWN1dGUgYWNjZW50LCBub3QgYQorZ3JhdmUgYWNjZW50LiAgQSBuZXdsaW5lCitAaWZjbGVhciBHRU5FUklDCitAaWZjbGVhciBhYm5vcm1hbC1zZXBhcmF0b3IKKyhvciBzZW1pY29sb24gQHNhbXB7O30pCitAZW5kIGlmY2xlYXIKK0BpZnNldCBhYm5vcm1hbC1zZXBhcmF0b3IKK0BpZnNldCBBMjlLCisob3IgYXQgc2lnbiBAc2FtcHtAQH0pCitAZW5kIGlmc2V0CitAaWZzZXQgSDgKKyhvciBkb2xsYXIgc2lnbiBAc2FtcHskfSwgZm9yIHRoZSBIOC8zMDA7IG9yIHNlbWljb2xvbiBAc2FtcHs7fSBmb3IgdGhlCitIaXRhY2hpIFNIIG9yCitIOC81MDApCitAZW5kIGlmc2V0CitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKK2ltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbiBhY3V0ZSBhY2NlbnQgaXMgdGFrZW4gYXMgYSBsaXRlcmFsIGNoYXJhY3RlcgorYW5kIGRvZXMgbm90IGNvdW50IGFzIHRoZSBlbmQgb2YgYSBzdGF0ZW1lbnQuICBUaGUgdmFsdWUgb2YgYSBjaGFyYWN0ZXIKK2NvbnN0YW50IGluIGEgbnVtZXJpYyBleHByZXNzaW9uIGlzIHRoZSBtYWNoaW5lJ3MgYnl0ZS13aWRlIGNvZGUgZm9yCit0aGF0IGNoYXJhY3Rlci4gIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgeW91ciBjaGFyYWN0ZXIgY29kZSBpcyBBU0NJSToKK0BrYmR7J0F9IG1lYW5zIDY1LCBAa2JkeydCfSBtZWFucyA2NiwgYW5kIHNvIG9uLiBAcmVmaWxsCisKK0Bub2RlIE51bWJlcnMKK0BzdWJzZWN0aW9uIE51bWJlciBDb25zdGFudHMKKworQGNpbmRleCBjb25zdGFudHMsIG51bWJlcgorQGNpbmRleCBudW1iZXIgY29uc3RhbnRzCitAY29kZXtAdmFsdWV7QVN9fSBkaXN0aW5ndWlzaGVzIHRocmVlIGtpbmRzIG9mIG51bWJlcnMgYWNjb3JkaW5nIHRvIGhvdyB0aGV5CithcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQgbWFjaGluZS4gIEBlbXBoe0ludGVnZXJzfSBhcmUgbnVtYmVycyB0aGF0Cit3b3VsZCBmaXQgaW50byBhbiBAY29kZXtpbnR9IGluIHRoZSBDIGxhbmd1YWdlLiAgQGVtcGh7QmlnbnVtc30gYXJlCitpbnRlZ2VycywgYnV0IHRoZXkgYXJlIHN0b3JlZCBpbiBtb3JlIHRoYW4gMzIgYml0cy4gIEBlbXBoe0Zsb251bXN9CithcmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgZGVzY3JpYmVkIGJlbG93LgorCitAbWVudQorKiBJbnRlZ2Vyczo6ICAgICAgICAgICAgICAgICAgICBJbnRlZ2VycworKiBCaWdudW1zOjogICAgICAgICAgICAgICAgICAgICBCaWdudW1zCisqIEZsb251bXM6OiAgICAgICAgICAgICAgICAgICAgIEZsb251bXMKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZnNldCBJOTYwCisqIEJpdCBGaWVsZHM6OiAgICAgICAgICAgICAgICAgIEJpdCBGaWVsZHMKK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorQGVuZCBtZW51CisKK0Bub2RlIEludGVnZXJzCitAc3Vic3Vic2VjdGlvbiBJbnRlZ2VycworQGNpbmRleCBpbnRlZ2VycworQGNpbmRleCBjb25zdGFudHMsIGludGVnZXIKKworQGNpbmRleCBiaW5hcnkgaW50ZWdlcnMKK0BjaW5kZXggaW50ZWdlcnMsIGJpbmFyeQorQSBiaW5hcnkgaW50ZWdlciBpcyBAc2FtcHswYn0gb3IgQHNhbXB7MEJ9IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBvZgordGhlIGJpbmFyeSBkaWdpdHMgQHNhbXB7MDF9LgorCitAY2luZGV4IG9jdGFsIGludGVnZXJzCitAY2luZGV4IGludGVnZXJzLCBvY3RhbAorQW4gb2N0YWwgaW50ZWdlciBpcyBAc2FtcHswfSBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgb2YgdGhlIG9jdGFsCitkaWdpdHMgKEBzYW1wezAxMjM0NTY3fSkuCisKK0BjaW5kZXggZGVjaW1hbCBpbnRlZ2VycworQGNpbmRleCBpbnRlZ2VycywgZGVjaW1hbAorQSBkZWNpbWFsIGludGVnZXIgc3RhcnRzIHdpdGggYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yCittb3JlIGRpZ2l0cyAoQHNhbXB7MDEyMzQ1Njc4OX0pLgorCitAY2luZGV4IGhleGFkZWNpbWFsIGludGVnZXJzCitAY2luZGV4IGludGVnZXJzLCBoZXhhZGVjaW1hbAorQSBoZXhhZGVjaW1hbCBpbnRlZ2VyIGlzIEBzYW1wezB4fSBvciBAc2FtcHswWH0gZm9sbG93ZWQgYnkgb25lIG9yCittb3JlIGhleGFkZWNpbWFsIGRpZ2l0cyBjaG9zZW4gZnJvbSBAc2FtcHswMTIzNDU2Nzg5YWJjZGVmQUJDREVGfS4KKworSW50ZWdlcnMgaGF2ZSB0aGUgdXN1YWwgdmFsdWVzLiAgVG8gZGVub3RlIGEgbmVnYXRpdmUgaW50ZWdlciwgdXNlCit0aGUgcHJlZml4IG9wZXJhdG9yIEBzYW1wey19IGRpc2N1c3NlZCB1bmRlciBleHByZXNzaW9ucworKEBweHJlZntQcmVmaXggT3BzLCxQcmVmaXggT3BlcmF0b3JzfSkuCisKK0Bub2RlIEJpZ251bXMKK0BzdWJzdWJzZWN0aW9uIEJpZ251bXMKKworQGNpbmRleCBiaWdudW1zCitAY2luZGV4IGNvbnN0YW50cywgYmlnbnVtCitBIEBkZm57YmlnbnVtfSBoYXMgdGhlIHNhbWUgc3ludGF4IGFuZCBzZW1hbnRpY3MgYXMgYW4gaW50ZWdlcgorZXhjZXB0IHRoYXQgdGhlIG51bWJlciAob3IgaXRzIG5lZ2F0aXZlKSB0YWtlcyBtb3JlIHRoYW4gMzIgYml0cyB0bworcmVwcmVzZW50IGluIGJpbmFyeS4gIFRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGJlY2F1c2UgaW4gc29tZSBwbGFjZXMKK2ludGVnZXJzIGFyZSBwZXJtaXR0ZWQgd2hpbGUgYmlnbnVtcyBhcmUgbm90LgorCitAbm9kZSBGbG9udW1zCitAc3Vic3Vic2VjdGlvbiBGbG9udW1zCitAY2luZGV4IGZsb251bXMKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycworQGNpbmRleCBjb25zdGFudHMsIGZsb2F0aW5nIHBvaW50CisKK0BjaW5kZXggcHJlY2lzaW9uLCBmbG9hdGluZyBwb2ludAorQSBAZGZue2Zsb251bX0gcmVwcmVzZW50cyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gIFRoZSB0cmFuc2xhdGlvbiBpcworaW5kaXJlY3Q6IGEgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBudW1iZXIgZnJvbSB0aGUgdGV4dCBpcyBjb252ZXJ0ZWQgYnkKK0Bjb2Rle0B2YWx1ZXtBU319IHRvIGEgZ2VuZXJpYyBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9mIG1vcmUgdGhhbgorc3VmZmljaWVudCBwcmVjaXNpb24uICBUaGlzIGdlbmVyaWMgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGlzIGNvbnZlcnRlZAordG8gYSBwYXJ0aWN1bGFyIGNvbXB1dGVyJ3MgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IChvciBmb3JtYXRzKSBieSBhCitwb3J0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHNwZWNpYWxpemVkIHRvIHRoYXQgY29tcHV0ZXIuCisKK0EgZmxvbnVtIGlzIHdyaXR0ZW4gYnkgd3JpdGluZyAoaW4gb3JkZXIpCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVGhlIGRpZ2l0IEBzYW1wezB9LgorQGlmc2V0IEhQUEEKKyhAc2FtcHswfSBpcyBvcHRpb25hbCBvbiB0aGUgSFBQQS4pCitAZW5kIGlmc2V0CisKK0BpdGVtCitBIGxldHRlciwgdG8gdGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0aGUgcmVzdCBvZiB0aGUgbnVtYmVyIGlzIGEgZmxvbnVtLgorQGlmc2V0IEdFTkVSSUMKK0BrYmR7ZX0gaXMgcmVjb21tZW5kZWQuICBDYXNlIGlzIG5vdCBpbXBvcnRhbnQuCitAaWdub3JlCitAYyBGSVhNRTogdmVyaWZ5IGlmIGZsb251bSBzeW50YXggcmVhbGx5IHRoaXMgdmFndWUgZm9yIG1vc3QgY2FzZXMKKyhBbnkgb3RoZXJ3aXNlIGlsbGVnYWwgbGV0dGVyIHdvcmtzIGhlcmUsIGJ1dCB0aGF0IG1pZ2h0IGJlIGNoYW5nZWQuICBWYXggQlNECis0LjIgYXNzZW1ibGVyIHNlZW1zIHRvIGFsbG93IGFueSBvZiBAc2FtcHtkZWZnaERFRkdIfS4pCitAZW5kIGlnbm9yZQorCitPbiB0aGUgSDgvMzAwLCBIOC81MDAsCitIaXRhY2hpIFNILAorYW5kIEFNRCAyOUsgYXJjaGl0ZWN0dXJlcywgdGhlIGxldHRlciBtdXN0IGJlCitvbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZQUlNYfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCisKK09uIHRoZSBBUkMsIHRoZSBsZXR0ZXIgbXVzdCBiZSBvbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZSU30KKyhpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KKworT24gdGhlIEludGVsIDk2MCBhcmNoaXRlY3R1cmUsIHRoZSBsZXR0ZXIgbXVzdCBiZQorb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we0RGVH0gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgorCitPbiB0aGUgSFBQQSBhcmNoaXRlY3R1cmUsIHRoZSBsZXR0ZXIgbXVzdCBiZSBAc2FtcHtFfSAodXBwZXIgY2FzZSBvbmx5KS4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZnNldCBBMjlLCitPbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZQUlNYfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCitAZW5kIGlmc2V0CitAaWZzZXQgQVJDCitPbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZSU30gKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgorQGVuZCBpZnNldAorQGlmc2V0IEg4CitPbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZQUlNYfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCitAZW5kIGlmc2V0CitAaWZzZXQgSFBQQQorVGhlIGxldHRlciBAc2FtcHtFfSAodXBwZXIgY2FzZSBvbmx5KS4KK0BlbmQgaWZzZXQKK0BpZnNldCBJOTYwCitPbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZUfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQGl0ZW0KK0FuIG9wdGlvbmFsIHNpZ246IGVpdGhlciBAc2FtcHsrfSBvciBAc2FtcHstfS4KKworQGl0ZW0KK0FuIG9wdGlvbmFsIEBkZm57aW50ZWdlciBwYXJ0fTogemVybyBvciBtb3JlIGRlY2ltYWwgZGlnaXRzLgorCitAaXRlbQorQW4gb3B0aW9uYWwgQGRmbntmcmFjdGlvbmFsIHBhcnR9OiBAc2FtcHsufSBmb2xsb3dlZCBieSB6ZXJvCitvciBtb3JlIGRlY2ltYWwgZGlnaXRzLgorCitAaXRlbQorQW4gb3B0aW9uYWwgZXhwb25lbnQsIGNvbnNpc3Rpbmcgb2Y6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitBbiBAc2FtcHtFfSBvciBAc2FtcHtlfS4KK0BjIEkgY2FuJ3QgZmluZCBhIGNvbmZpZyB3aGVyZSAiRVhQX0NIQVJTIiBpcyBvdGhlciB0aGFuICdlRScsIGJ1dCBpbgorQGMgcHJpbmNpcGxlIHRoaXMgY2FuIHBlcmZlY3RseSB3ZWxsIGJlIGRpZmZlcmVudCBvbiBkaWZmZXJlbnQgdGFyZ2V0cy4KK0BpdGVtCitPcHRpb25hbCBzaWduOiBlaXRoZXIgQHNhbXB7K30gb3IgQHNhbXB7LX0uCitAaXRlbQorT25lIG9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCitAZW5kIGl0ZW1pemUKKworQGVuZCBpdGVtaXplCisKK0F0IGxlYXN0IG9uZSBvZiB0aGUgaW50ZWdlciBwYXJ0IG9yIHRoZSBmcmFjdGlvbmFsIHBhcnQgbXVzdCBiZQorcHJlc2VudC4gIFRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgaGFzIHRoZSB1c3VhbCBiYXNlLTEwIHZhbHVlLgorCitAY29kZXtAdmFsdWV7QVN9fSBkb2VzIGFsbCBwcm9jZXNzaW5nIHVzaW5nIGludGVnZXJzLiAgRmxvbnVtcyBhcmUgY29tcHV0ZWQKK2luZGVwZW5kZW50bHkgb2YgYW55IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlIGluIHRoZSBjb21wdXRlciBydW5uaW5nCitAY29kZXtAdmFsdWV7QVN9fS4KKworQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IEk5NjAKK0BjIEJpdCBmaWVsZHMgYXJlIHdyaXR0ZW4gYXMgYSBnZW5lcmFsIGZhY2lsaXR5IGJ1dCBhcmUgYWxzbyBjb250cm9sbGVkCitAYyBieSBhIGNvbmRpdGlvbmFsLWNvbXBpbGF0aW9uIGZsYWctLS13aGljaCBpcyBhcyBvZiBub3cgKDIxbWFyOTEpCitAYyB0dXJuZWQgb24gb25seSBieSB0aGUgaTk2MCBjb25maWcgb2YgR0FTLgorQG5vZGUgQml0IEZpZWxkcworQHN1YnN1YnNlY3Rpb24gQml0IEZpZWxkcworCitAY2luZGV4IGJpdCBmaWVsZHMKK0BjaW5kZXggY29uc3RhbnRzLCBiaXQgZmllbGQKK1lvdSBjYW4gYWxzbyBkZWZpbmUgbnVtZXJpYyBjb25zdGFudHMgYXMgQGRmbntiaXQgZmllbGRzfS4KK3NwZWNpZnkgdHdvIG51bWJlcnMgc2VwYXJhdGVkIGJ5IGEgY29sb24tLS0KK0BleGFtcGxlCitAdmFye21hc2t9OkB2YXJ7dmFsdWV9CitAZW5kIGV4YW1wbGUKK0Bub2luZGVudAorQGNvZGV7QHZhbHVle0FTfX0gYXBwbGllcyBhIGJpdHdpc2UgQHNje2FuZH0gYmV0d2VlbiBAdmFye21hc2t9IGFuZAorQHZhcnt2YWx1ZX0uCisKK1RoZSByZXN1bHRpbmcgbnVtYmVyIGlzIHRoZW4gcGFja2VkCitAaWZzZXQgR0VORVJJQworQGMgdGhpcyBjb25kaXRpb25hbCBwYXJlbiBpbiBjYXNlIGJpdCBmaWVsZHMgdHVybmVkIG9uIGVsc2V3aGVyZSB0aGFuIDk2MAorKGluIGhvc3QtZGVwZW5kZW50IGJ5dGUgb3JkZXIpCitAZW5kIGlmc2V0CitpbnRvIGEgZmllbGQgd2hvc2Ugd2lkdGggZGVwZW5kcyBvbiB3aGljaCBhc3NlbWJsZXIgZGlyZWN0aXZlIGhhcyB0aGUKK2JpdC1maWVsZCBhcyBpdHMgYXJndW1lbnQuICBPdmVyZmxvdyAoYSByZXN1bHQgZnJvbSB0aGUgYml0d2lzZSBhbmQKK3JlcXVpcmluZyBtb3JlIGJpbmFyeSBkaWdpdHMgdG8gcmVwcmVzZW50KSBpcyBub3QgYW4gZXJyb3I7IGluc3RlYWQsCittb3JlIGNvbnN0YW50cyBhcmUgZ2VuZXJhdGVkLCBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLCBiZWdpbm5pbmcgd2l0aCB0aGUKK2xlYXN0IHNpZ25pZmljYW50IGRpZ2l0cy5AcmVmaWxsCisKK1RoZSBkaXJlY3RpdmVzIEBjb2Rley5ieXRlfSwgQGNvZGV7Lmh3b3JkfSwgQGNvZGV7LmludH0sIEBjb2Rley5sb25nfSwKK0Bjb2Rley5zaG9ydH0sIGFuZCBAY29kZXsud29yZH0gYWNjZXB0IGJpdC1maWVsZCBhcmd1bWVudHMuCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQG5vZGUgU2VjdGlvbnMKK0BjaGFwdGVyIFNlY3Rpb25zIGFuZCBSZWxvY2F0aW9uCitAY2luZGV4IHNlY3Rpb25zCitAY2luZGV4IHJlbG9jYXRpb24KKworQG1lbnUKKyogU2VjcyBCYWNrZ3JvdW5kOjogICAgICAgICAgICAgQmFja2dyb3VuZAorKiBMZCBTZWN0aW9uczo6ICAgICAgICAgICAgICAgICBMaW5rZXIgU2VjdGlvbnMKKyogQXMgU2VjdGlvbnM6OiAgICAgICAgICAgICAgICAgQXNzZW1ibGVyIEludGVybmFsIFNlY3Rpb25zCisqIFN1Yi1TZWN0aW9uczo6ICAgICAgICAgICAgICAgIFN1Yi1TZWN0aW9ucworKiBic3M6OiAgICAgICAgICAgICAgICAgICAgICAgICBic3MgU2VjdGlvbgorQGVuZCBtZW51CisKK0Bub2RlIFNlY3MgQmFja2dyb3VuZAorQHNlY3Rpb24gQmFja2dyb3VuZAorCitSb3VnaGx5LCBhIHNlY3Rpb24gaXMgYSByYW5nZSBvZiBhZGRyZXNzZXMsIHdpdGggbm8gZ2FwczsgYWxsIGRhdGEKK2BgaW4nJyB0aG9zZSBhZGRyZXNzZXMgaXMgdHJlYXRlZCB0aGUgc2FtZSBmb3Igc29tZSBwYXJ0aWN1bGFyIHB1cnBvc2UuCitGb3IgZXhhbXBsZSB0aGVyZSBtYXkgYmUgYSBgYHJlYWQgb25seScnIHNlY3Rpb24uCisKK0BjaW5kZXggbGlua2VyLCBhbmQgYXNzZW1ibGVyCitAY2luZGV4IGFzc2VtYmxlciwgYW5kIGxpbmtlcgorVGhlIGxpbmtlciBAY29kZXtAdmFsdWV7TER9fSByZWFkcyBtYW55IG9iamVjdCBmaWxlcyAocGFydGlhbCBwcm9ncmFtcykgYW5kCitjb21iaW5lcyB0aGVpciBjb250ZW50cyB0byBmb3JtIGEgcnVubmFibGUgcHJvZ3JhbS4gIFdoZW4gQGNvZGV7QHZhbHVle0FTfX0KK2VtaXRzIGFuIG9iamVjdCBmaWxlLCB0aGUgcGFydGlhbCBwcm9ncmFtIGlzIGFzc3VtZWQgdG8gc3RhcnQgYXQgYWRkcmVzcyAwLgorQGNvZGV7QHZhbHVle0xEfX0gYXNzaWducyB0aGUgZmluYWwgYWRkcmVzc2VzIGZvciB0aGUgcGFydGlhbCBwcm9ncmFtLCBzbyB0aGF0CitkaWZmZXJlbnQgcGFydGlhbCBwcm9ncmFtcyBkbyBub3Qgb3ZlcmxhcC4gIFRoaXMgaXMgYWN0dWFsbHkgYW4KK292ZXJzaW1wbGlmaWNhdGlvbiwgYnV0IGl0IHN1ZmZpY2VzIHRvIGV4cGxhaW4gaG93IEBjb2Rle0B2YWx1ZXtBU319IHVzZXMKK3NlY3Rpb25zLgorCitAY29kZXtAdmFsdWV7TER9fSBtb3ZlcyBibG9ja3Mgb2YgYnl0ZXMgb2YgeW91ciBwcm9ncmFtIHRvIHRoZWlyIHJ1bi10aW1lCithZGRyZXNzZXMuICBUaGVzZSBibG9ja3Mgc2xpZGUgdG8gdGhlaXIgcnVuLXRpbWUgYWRkcmVzc2VzIGFzIHJpZ2lkCit1bml0czsgdGhlaXIgbGVuZ3RoIGRvZXMgbm90IGNoYW5nZSBhbmQgbmVpdGhlciBkb2VzIHRoZSBvcmRlciBvZiBieXRlcword2l0aGluIHRoZW0uICBTdWNoIGEgcmlnaWQgdW5pdCBpcyBjYWxsZWQgYSBAZW1waHtzZWN0aW9ufS4gIEFzc2lnbmluZworcnVuLXRpbWUgYWRkcmVzc2VzIHRvIHNlY3Rpb25zIGlzIGNhbGxlZCBAZGZue3JlbG9jYXRpb259LiAgSXQgaW5jbHVkZXMKK3RoZSB0YXNrIG9mIGFkanVzdGluZyBtZW50aW9ucyBvZiBvYmplY3QtZmlsZSBhZGRyZXNzZXMgc28gdGhleSByZWZlciB0bwordGhlIHByb3BlciBydW4tdGltZSBhZGRyZXNzZXMuCitAaWZzZXQgSDgKK0ZvciB0aGUgSDgvMzAwIGFuZCBIOC81MDAsCithbmQgZm9yIHRoZSBIaXRhY2hpIFNILAorQGNvZGV7QHZhbHVle0FTfX0gcGFkcyBzZWN0aW9ucyBpZiBuZWVkZWQgdG8KK2Vuc3VyZSB0aGV5IGVuZCBvbiBhIHdvcmQgKHNpeHRlZW4gYml0KSBib3VuZGFyeS4KK0BlbmQgaWZzZXQKKworQGNpbmRleCBzdGFuZGFyZCBhc3NlbWJsZXIgc2VjdGlvbnMKK0FuIG9iamVjdCBmaWxlIHdyaXR0ZW4gYnkgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGF0IGxlYXN0IHRocmVlIHNlY3Rpb25zLCBhbnkKK29mIHdoaWNoIG1heSBiZSBlbXB0eS4gIFRoZXNlIGFyZSBuYW1lZCBAZGZue3RleHR9LCBAZGZue2RhdGF9IGFuZAorQGRmbntic3N9IHNlY3Rpb25zLgorCitAaWZzZXQgQ09GRgorQGlmc2V0IEdFTkVSSUMKK1doZW4gaXQgZ2VuZXJhdGVzIENPRkYgb3V0cHV0LAorQGVuZCBpZnNldAorQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFsc28gZ2VuZXJhdGUgd2hhdGV2ZXIgb3RoZXIgbmFtZWQgc2VjdGlvbnMgeW91IHNwZWNpZnkKK3VzaW5nIHRoZSBAc2FtcHsuc2VjdGlvbn0gZGlyZWN0aXZlIChAcHhyZWZ7U2VjdGlvbiwsQGNvZGV7LnNlY3Rpb259fSkuCitJZiB5b3UgZG8gbm90IHVzZSBhbnkgZGlyZWN0aXZlcyB0aGF0IHBsYWNlIG91dHB1dCBpbiB0aGUgQHNhbXB7LnRleHR9CitvciBAc2FtcHsuZGF0YX0gc2VjdGlvbnMsIHRoZXNlIHNlY3Rpb25zIHN0aWxsIGV4aXN0LCBidXQgYXJlIGVtcHR5LgorQGVuZCBpZnNldAorCitAaWZzZXQgSFBQQQorQGlmc2V0IEdFTkVSSUMKK1doZW4gQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIFNPTSBvciBFTEYgb3V0cHV0IGZvciB0aGUgSFBQQSwKK0BlbmQgaWZzZXQKK0Bjb2Rle0B2YWx1ZXtBU319IGNhbiBhbHNvIGdlbmVyYXRlIHdoYXRldmVyIG90aGVyIG5hbWVkIHNlY3Rpb25zIHlvdQorc3BlY2lmeSB1c2luZyB0aGUgQHNhbXB7LnNwYWNlfSBhbmQgQHNhbXB7LnN1YnNwYWNlfSBkaXJlY3RpdmVzLiAgU2VlCitAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfQorKEhQIDkyNDMyLTkwMDAxKSBmb3IgZGV0YWlscyBvbiB0aGUgQHNhbXB7LnNwYWNlfSBhbmQgQHNhbXB7LnN1YnNwYWNlfQorYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCisKK0BpZnNldCBTT00KK0FkZGl0aW9uYWxseSwgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBzdGFuZGFyZAordGV4dCwgZGF0YSwgYW5kIGJzcyBzZWN0aW9ucyB3aGVuIGdlbmVyYXRpbmcgU09NIG91dHB1dC4gIFByb2dyYW0gdGV4dAoraXMgcGxhY2VkIGludG8gdGhlIEBzYW1weyRDT0RFJH0gc2VjdGlvbiwgZGF0YSBpbnRvIEBzYW1weyREQVRBJH0sIGFuZAorQlNTIGludG8gQHNhbXB7JEJTUyR9LgorQGVuZCBpZnNldAorQGVuZCBpZnNldAorCitXaXRoaW4gdGhlIG9iamVjdCBmaWxlLCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBhdCBhZGRyZXNzIEBjb2RlezB9LCB0aGUKK2RhdGEgc2VjdGlvbiBmb2xsb3dzLCBhbmQgdGhlIGJzcyBzZWN0aW9uIGZvbGxvd3MgdGhlIGRhdGEgc2VjdGlvbi4KKworQGlmc2V0IEhQUEEKK1doZW4gZ2VuZXJhdGluZyBlaXRoZXIgU09NIG9yIEVMRiBvdXRwdXQgZmlsZXMgb24gdGhlIEhQUEEsIHRoZSB0ZXh0CitzZWN0aW9uIHN0YXJ0cyBhdCBhZGRyZXNzIEBjb2RlezB9LCB0aGUgZGF0YSBzZWN0aW9uIGF0IGFkZHJlc3MKK0Bjb2RlezB4NDAwMDAwMH0sIGFuZCB0aGUgYnNzIHNlY3Rpb24gZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uLgorQGVuZCBpZnNldAorCitUbyBsZXQgQGNvZGV7QHZhbHVle0xEfX0ga25vdyB3aGljaCBkYXRhIGNoYW5nZXMgd2hlbiB0aGUgc2VjdGlvbnMgYXJlCityZWxvY2F0ZWQsIGFuZCBob3cgdG8gY2hhbmdlIHRoYXQgZGF0YSwgQGNvZGV7QHZhbHVle0FTfX0gYWxzbyB3cml0ZXMgdG8gdGhlCitvYmplY3QgZmlsZSBkZXRhaWxzIG9mIHRoZSByZWxvY2F0aW9uIG5lZWRlZC4gIFRvIHBlcmZvcm0gcmVsb2NhdGlvbgorQGNvZGV7QHZhbHVle0xEfX0gbXVzdCBrbm93LCBlYWNoIHRpbWUgYW4gYWRkcmVzcyBpbiB0aGUgb2JqZWN0CitmaWxlIGlzIG1lbnRpb25lZDoKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitXaGVyZSBpbiB0aGUgb2JqZWN0IGZpbGUgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHJlZmVyZW5jZSB0bworYW4gYWRkcmVzcz8KK0BpdGVtCitIb3cgbG9uZyAoaW4gYnl0ZXMpIGlzIHRoaXMgcmVmZXJlbmNlPworQGl0ZW0KK1doaWNoIHNlY3Rpb24gZG9lcyB0aGUgYWRkcmVzcyByZWZlciB0bz8gIFdoYXQgaXMgdGhlIG51bWVyaWMgdmFsdWUgb2YKK0BkaXNwbGF5CisoQHZhcnthZGRyZXNzfSkgQG1pbnVze30gKEB2YXJ7c3RhcnQtYWRkcmVzcyBvZiBzZWN0aW9ufSk/CitAZW5kIGRpc3BsYXkKK0BpdGVtCitJcyB0aGUgcmVmZXJlbmNlIHRvIGFuIGFkZHJlc3MgYGBQcm9ncmFtLUNvdW50ZXIgcmVsYXRpdmUnJz8KK0BlbmQgaXRlbWl6ZQorCitAY2luZGV4IGFkZHJlc3NlcywgZm9ybWF0IG9mCitAY2luZGV4IHNlY3Rpb24tcmVsYXRpdmUgYWRkcmVzc2luZworSW4gZmFjdCwgZXZlcnkgYWRkcmVzcyBAY29kZXtAdmFsdWV7QVN9fSBldmVyIHVzZXMgaXMgZXhwcmVzc2VkIGFzCitAZGlzcGxheQorKEB2YXJ7c2VjdGlvbn0pICsgKEB2YXJ7b2Zmc2V0IGludG8gc2VjdGlvbn0pCitAZW5kIGRpc3BsYXkKK0Bub2luZGVudAorRnVydGhlciwgbW9zdCBleHByZXNzaW9ucyBAY29kZXtAdmFsdWV7QVN9fSBjb21wdXRlcyBoYXZlIHRoaXMgc2VjdGlvbi1yZWxhdGl2ZQorbmF0dXJlLgorQGlmc2V0IFNPTQorKEZvciBzb21lIG9iamVjdCBmb3JtYXRzLCBzdWNoIGFzIFNPTSBmb3IgdGhlIEhQUEEsIHNvbWUgZXhwcmVzc2lvbnMgYXJlCitzeW1ib2wtcmVsYXRpdmUgaW5zdGVhZC4pCitAZW5kIGlmc2V0CisKK0luIHRoaXMgbWFudWFsIHdlIHVzZSB0aGUgbm90YXRpb24gQHtAdmFye3NlY25hbWV9IEB2YXJ7Tn1AfSB0byBtZWFuIGBgb2Zmc2V0CitAdmFye059IGludG8gc2VjdGlvbiBAdmFye3NlY25hbWV9LicnCisKK0FwYXJ0IGZyb20gdGV4dCwgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHlvdSBuZWVkIHRvIGtub3cgYWJvdXQgdGhlCitAZGZue2Fic29sdXRlfSBzZWN0aW9uLiAgV2hlbiBAY29kZXtAdmFsdWV7TER9fSBtaXhlcyBwYXJ0aWFsIHByb2dyYW1zLAorYWRkcmVzc2VzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHJlbWFpbiB1bmNoYW5nZWQuICBGb3IgZXhhbXBsZSwgYWRkcmVzcworQGNvZGV7QHthYnNvbHV0ZSAwQH19IGlzIGBgcmVsb2NhdGVkJycgdG8gcnVuLXRpbWUgYWRkcmVzcyAwIGJ5CitAY29kZXtAdmFsdWV7TER9fS4gIEFsdGhvdWdoIHRoZSBsaW5rZXIgbmV2ZXIgYXJyYW5nZXMgdHdvIHBhcnRpYWwgcHJvZ3JhbXMnCitkYXRhIHNlY3Rpb25zIHdpdGggb3ZlcmxhcHBpbmcgYWRkcmVzc2VzIGFmdGVyIGxpbmtpbmcsIEBlbXBoe2J5IGRlZmluaXRpb259Cit0aGVpciBhYnNvbHV0ZSBzZWN0aW9ucyBtdXN0IG92ZXJsYXAuICBBZGRyZXNzIEBjb2Rle0B7YWJzb2x1dGVAIDIzOUB9fSBpbiBvbmUKK3BhcnQgb2YgYSBwcm9ncmFtIGlzIGFsd2F5cyB0aGUgc2FtZSBhZGRyZXNzIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVubmluZyBhcworYWRkcmVzcyBAY29kZXtAe2Fic29sdXRlQCAyMzlAfX0gaW4gYW55IG90aGVyIHBhcnQgb2YgdGhlIHByb2dyYW0uCisKK1RoZSBpZGVhIG9mIHNlY3Rpb25zIGlzIGV4dGVuZGVkIHRvIHRoZSBAZGZue3VuZGVmaW5lZH0gc2VjdGlvbi4gIEFueQorYWRkcmVzcyB3aG9zZSBzZWN0aW9uIGlzIHVua25vd24gYXQgYXNzZW1ibHkgdGltZSBpcyBieSBkZWZpbml0aW9uCityZW5kZXJlZCBAe3VuZGVmaW5lZCBAdmFye1V9QH0tLS13aGVyZSBAdmFye1V9IGlzIGZpbGxlZCBpbiBsYXRlci4KK1NpbmNlIG51bWJlcnMgYXJlIGFsd2F5cyBkZWZpbmVkLCB0aGUgb25seSB3YXkgdG8gZ2VuZXJhdGUgYW4gdW5kZWZpbmVkCithZGRyZXNzIGlzIHRvIG1lbnRpb24gYW4gdW5kZWZpbmVkIHN5bWJvbC4gIEEgcmVmZXJlbmNlIHRvIGEgbmFtZWQKK2NvbW1vbiBibG9jayB3b3VsZCBiZSBzdWNoIGEgc3ltYm9sOiBpdHMgdmFsdWUgaXMgdW5rbm93biBhdCBhc3NlbWJseQordGltZSBzbyBpdCBoYXMgc2VjdGlvbiBAZW1waHt1bmRlZmluZWR9LgorCitCeSBhbmFsb2d5IHRoZSB3b3JkIEBlbXBoe3NlY3Rpb259IGlzIHVzZWQgdG8gZGVzY3JpYmUgZ3JvdXBzIG9mIHNlY3Rpb25zIGluCit0aGUgbGlua2VkIHByb2dyYW0uICBAY29kZXtAdmFsdWV7TER9fSBwdXRzIGFsbCBwYXJ0aWFsIHByb2dyYW1zJyB0ZXh0CitzZWN0aW9ucyBpbiBjb250aWd1b3VzIGFkZHJlc3NlcyBpbiB0aGUgbGlua2VkIHByb2dyYW0uICBJdCBpcworY3VzdG9tYXJ5IHRvIHJlZmVyIHRvIHRoZSBAZW1waHt0ZXh0IHNlY3Rpb259IG9mIGEgcHJvZ3JhbSwgbWVhbmluZyBhbGwKK3RoZSBhZGRyZXNzZXMgb2YgYWxsIHBhcnRpYWwgcHJvZ3JhbXMnIHRleHQgc2VjdGlvbnMuICBMaWtld2lzZSBmb3IKK2RhdGEgYW5kIGJzcyBzZWN0aW9ucy4KKworU29tZSBzZWN0aW9ucyBhcmUgbWFuaXB1bGF0ZWQgYnkgQGNvZGV7QHZhbHVle0xEfX07IG90aGVycyBhcmUgaW52ZW50ZWQgZm9yCit1c2Ugb2YgQGNvZGV7QHZhbHVle0FTfX0gYW5kIGhhdmUgbm8gbWVhbmluZyBleGNlcHQgZHVyaW5nIGFzc2VtYmx5LgorCitAbm9kZSBMZCBTZWN0aW9ucworQHNlY3Rpb24gTGlua2VyIFNlY3Rpb25zCitAY29kZXtAdmFsdWV7TER9fSBkZWFscyB3aXRoIGp1c3QgZm91ciBraW5kcyBvZiBzZWN0aW9ucywgc3VtbWFyaXplZCBiZWxvdy4KKworQHRhYmxlIEBzdHJvbmcKKworQGlmc2V0IENPRkYKK0BjaW5kZXggbmFtZWQgc2VjdGlvbnMKK0BjaW5kZXggc2VjdGlvbnMsIG5hbWVkCitAaXRlbSBuYW1lZCBzZWN0aW9ucworQGVuZCBpZnNldAorQGlmc2V0IGFvdXQtYm91dAorQGNpbmRleCB0ZXh0IHNlY3Rpb24KK0BjaW5kZXggZGF0YSBzZWN0aW9uCitAaXRlbXggdGV4dCBzZWN0aW9uCitAaXRlbXggZGF0YSBzZWN0aW9uCitAZW5kIGlmc2V0CitUaGVzZSBzZWN0aW9ucyBob2xkIHlvdXIgcHJvZ3JhbS4gIEBjb2Rle0B2YWx1ZXtBU319IGFuZCBAY29kZXtAdmFsdWV7TER9fSB0cmVhdCB0aGVtIGFzCitzZXBhcmF0ZSBidXQgZXF1YWwgc2VjdGlvbnMuICBBbnl0aGluZyB5b3UgY2FuIHNheSBvZiBvbmUgc2VjdGlvbiBpcwordHJ1ZSBhbm90aGVyLgorQGlmc2V0IGFvdXQtYm91dAorV2hlbiB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nLCBob3dldmVyLCBpdCBpcworY3VzdG9tYXJ5IGZvciB0aGUgdGV4dCBzZWN0aW9uIHRvIGJlIHVuYWx0ZXJhYmxlLiAgVGhlCit0ZXh0IHNlY3Rpb24gaXMgb2Z0ZW4gc2hhcmVkIGFtb25nIHByb2Nlc3NlczogaXQgY29udGFpbnMKK2luc3RydWN0aW9ucywgY29uc3RhbnRzIGFuZCB0aGUgbGlrZS4gIFRoZSBkYXRhIHNlY3Rpb24gb2YgYSBydW5uaW5nCitwcm9ncmFtIGlzIHVzdWFsbHkgYWx0ZXJhYmxlOiBmb3IgZXhhbXBsZSwgQyB2YXJpYWJsZXMgd291bGQgYmUgc3RvcmVkCitpbiB0aGUgZGF0YSBzZWN0aW9uLgorQGVuZCBpZnNldAorCitAY2luZGV4IGJzcyBzZWN0aW9uCitAaXRlbSBic3Mgc2VjdGlvbgorVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHplcm9lZCBieXRlcyB3aGVuIHlvdXIgcHJvZ3JhbSBiZWdpbnMgcnVubmluZy4gIEl0CitpcyB1c2VkIHRvIGhvbGQgdW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIGNvbW1vbiBzdG9yYWdlLiAgVGhlIGxlbmd0aCBvZgorZWFjaCBwYXJ0aWFsIHByb2dyYW0ncyBic3Mgc2VjdGlvbiBpcyBpbXBvcnRhbnQsIGJ1dCBiZWNhdXNlIGl0IHN0YXJ0cworb3V0IGNvbnRhaW5pbmcgemVyb2VkIGJ5dGVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcmUgZXhwbGljaXQgemVybworYnl0ZXMgaW4gdGhlIG9iamVjdCBmaWxlLiAgVGhlIGJzcyBzZWN0aW9uIHdhcyBpbnZlbnRlZCB0byBlbGltaW5hdGUKK3Rob3NlIGV4cGxpY2l0IHplcm9zIGZyb20gb2JqZWN0IGZpbGVzLgorCitAY2luZGV4IGFic29sdXRlIHNlY3Rpb24KK0BpdGVtIGFic29sdXRlIHNlY3Rpb24KK0FkZHJlc3MgMCBvZiB0aGlzIHNlY3Rpb24gaXMgYWx3YXlzIGBgcmVsb2NhdGVkJycgdG8gcnVudGltZSBhZGRyZXNzIDAuCitUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byByZWZlciB0byBhbiBhZGRyZXNzIHRoYXQgQGNvZGV7QHZhbHVle0xEfX0gbXVzdAorbm90IGNoYW5nZSB3aGVuIHJlbG9jYXRpbmcuICBJbiB0aGlzIHNlbnNlIHdlIHNwZWFrIG9mIGFic29sdXRlCithZGRyZXNzZXMgYmVpbmcgYGB1bnJlbG9jYXRhYmxlJyc6IHRoZXkgZG8gbm90IGNoYW5nZSBkdXJpbmcgcmVsb2NhdGlvbi4KKworQGNpbmRleCB1bmRlZmluZWQgc2VjdGlvbgorQGl0ZW0gdW5kZWZpbmVkIHNlY3Rpb24KK1RoaXMgYGBzZWN0aW9uJycgaXMgYSBjYXRjaC1hbGwgZm9yIGFkZHJlc3MgcmVmZXJlbmNlcyB0byBvYmplY3RzIG5vdCBpbgordGhlIHByZWNlZGluZyBzZWN0aW9ucy4KK0BjIEZJWE1FOiByZWYgdG8gc29tZSBvdGhlciBkb2Mgb24gb2JqLWZpbGUgZm9ybWF0cyBjb3VsZCBnbyBoZXJlLgorQGVuZCB0YWJsZQorCitAY2luZGV4IHJlbG9jYXRpb24gZXhhbXBsZQorQW4gaWRlYWxpemVkIGV4YW1wbGUgb2YgdGhyZWUgcmVsb2NhdGFibGUgc2VjdGlvbnMgZm9sbG93cy4KK0BpZnNldCBDT0ZGCitUaGUgZXhhbXBsZSB1c2VzIHRoZSB0cmFkaXRpb25hbCBzZWN0aW9uIG5hbWVzIEBzYW1wey50ZXh0fSBhbmQgQHNhbXB7LmRhdGF9LgorQGVuZCBpZnNldAorTWVtb3J5IGFkZHJlc3NlcyBhcmUgb24gdGhlIGhvcml6b250YWwgYXhpcy4KKworQGMgVEVYSTJST0ZGLUtJTEwKK0BpZmluZm8KK0BjIEVORCBURVhJMlJPRkYtS0lMTAorQHNtYWxsZXhhbXBsZQorICAgICAgICAgICAgICAgICAgICAgICstLS0tLSstLS0tKy0tKworcGFydGlhbCBwcm9ncmFtICMgMTogIHx0dHR0dHxkZGRkfDAwfAorICAgICAgICAgICAgICAgICAgICAgICstLS0tLSstLS0tKy0tKworCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCAgIGRhdGEgYnNzCisgICAgICAgICAgICAgICAgICAgICAgc2VnLiAgIHNlZy4gc2VnLgorCisgICAgICAgICAgICAgICAgICAgICAgKy0tLSstLS0rLS0tKworcGFydGlhbCBwcm9ncmFtICMgMjogIHxUVFR8REREfDAwMHwKKyAgICAgICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rCisKKyAgICAgICAgICAgICAgICAgICAgICArLS0rLS0tKy0tLS0tKy0tKy0tLS0rLS0tKy0tLS0tK35+CitsaW5rZWQgcHJvZ3JhbTogICAgICAgfCAgfFRUVHx0dHR0dHwgIHxkZGRkfERERHwwMDAwMHwKKyAgICAgICAgICAgICAgICAgICAgICArLS0rLS0tKy0tLS0tKy0tKy0tLS0rLS0tKy0tLS0tK35+CisKKyAgICBhZGRyZXNzZXM6ICAgICAgICAwIEBkb3Rze30KK0BlbmQgc21hbGxleGFtcGxlCitAYyBURVhJMlJPRkYtS0lMTAorQGVuZCBpZmluZm8KK0BuZWVkIDUwMDAKK0B0ZXgKKworXGxpbmV7XGl0IFBhcnRpYWwgcHJvZ3JhbSBcIzE6IFxoZmlsfQorXGxpbmV7XGlib3h7Mi41Y219e1x0dCB0ZXh0fVxpYm94ezJjbX17XHR0IGRhdGF9XGlib3h7MWNtfXtcdHQgYnNzfVxoZmlsfQorXGxpbmV7XGJveGl0ezIuNWNtfXtcdHQgdHR0dHR9XGJveGl0ezJjbX17XHR0IGRkZGR9XGJveGl0ezFjbX17XHR0IDAwfVxoZmlsfQorCitcbGluZXtcaXQgUGFydGlhbCBwcm9ncmFtIFwjMjogXGhmaWx9CitcbGluZXtcaWJveHsxY219e1x0dCB0ZXh0fVxpYm94ezEuNWNtfXtcdHQgZGF0YX1caWJveHsxY219e1x0dCBic3N9XGhmaWx9CitcbGluZXtcYm94aXR7MWNtfXtcdHQgVFRUfVxib3hpdHsxLjVjbX17XHR0IERERER9XGJveGl0ezFjbX17XHR0IDAwMH1caGZpbH0KKworXGxpbmV7XGl0IGxpbmtlZCBwcm9ncmFtOiBcaGZpbH0KK1xsaW5le1xpYm94ey41Y219e31caWJveHsxY219e1x0dCB0ZXh0fVxpYm94ezIuNWNtfXt9XGlib3h7Ljc1Y219e31caWJveHsyY219e1x0dCBkYXRhfVxpYm94ezEuNWNtfXt9XGlib3h7MmNtfXtcdHQgYnNzfVxoZmlsfQorXGxpbmV7XGJveGl0ey41Y219e31cYm94aXR7MWNtfXtcdHQgVFRUfVxib3hpdHsyLjVjbX17XHR0Cit0dHR0dH1cYm94aXR7Ljc1Y219e31cYm94aXR7MmNtfXtcdHQgZGRkZH1cYm94aXR7MS41Y219e1x0dAorRERERH1cYm94aXR7MmNtfXtcdHQgMDAwMDB9XCBcZG90c1xoZmlsfQorCitcbGluZXtcaXQgYWRkcmVzc2VzOiBcaGZpbH0KK1xsaW5lezBcZG90c1xoZmlsfQorCitAZW5kIHRleAorQGMgRU5EIFRFWEkyUk9GRi1LSUxMCisKK0Bub2RlIEFzIFNlY3Rpb25zCitAc2VjdGlvbiBBc3NlbWJsZXIgSW50ZXJuYWwgU2VjdGlvbnMKKworQGNpbmRleCBpbnRlcm5hbCBhc3NlbWJsZXIgc2VjdGlvbnMKK0BjaW5kZXggc2VjdGlvbnMgaW4gbWVzc2FnZXMsIGludGVybmFsCitUaGVzZSBzZWN0aW9ucyBhcmUgbWVhbnQgb25seSBmb3IgdGhlIGludGVybmFsIHVzZSBvZiBAY29kZXtAdmFsdWV7QVN9fS4gIFRoZXkKK2hhdmUgbm8gbWVhbmluZyBhdCBydW4tdGltZS4gIFlvdSBkbyBub3QgcmVhbGx5IG5lZWQgdG8ga25vdyBhYm91dCB0aGVzZQorc2VjdGlvbnMgZm9yIG1vc3QgcHVycG9zZXM7IGJ1dCB0aGV5IGNhbiBiZSBtZW50aW9uZWQgaW4gQGNvZGV7QHZhbHVle0FTfX0KK3dhcm5pbmcgbWVzc2FnZXMsIHNvIGl0IG1pZ2h0IGJlIGhlbHBmdWwgdG8gaGF2ZSBhbiBpZGVhIG9mIHRoZWlyCittZWFuaW5ncyB0byBAY29kZXtAdmFsdWV7QVN9fS4gIFRoZXNlIHNlY3Rpb25zIGFyZSB1c2VkIHRvIHBlcm1pdCB0aGUKK3ZhbHVlIG9mIGV2ZXJ5IGV4cHJlc3Npb24gaW4geW91ciBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtIHRvIGJlIGEKK3NlY3Rpb24tcmVsYXRpdmUgYWRkcmVzcy4KKworQHRhYmxlIEBiCitAY2luZGV4IGFzc2VtYmxlciBpbnRlcm5hbCBsb2dpYyBlcnJvcgorQGl0ZW0gQVNTRU1CTEVSLUlOVEVSTkFMLUxPR0lDLUVSUk9SIQorQW4gaW50ZXJuYWwgYXNzZW1ibGVyIGxvZ2ljIGVycm9yIGhhcyBiZWVuIGZvdW5kLiAgVGhpcyBtZWFucyB0aGVyZSBpcyBhCitidWcgaW4gdGhlIGFzc2VtYmxlci4KKworQGNpbmRleCBleHByIChpbnRlcm5hbCBzZWN0aW9uKQorQGl0ZW0gZXhwciBzZWN0aW9uCitUaGUgYXNzZW1ibGVyIHN0b3JlcyBjb21wbGV4IGV4cHJlc3Npb24gaW50ZXJuYWxseSBhcyBjb21iaW5hdGlvbnMgb2YKK3N5bWJvbHMuICBXaGVuIGl0IG5lZWRzIHRvIHJlcHJlc2VudCBhbiBleHByZXNzaW9uIGFzIGEgc3ltYm9sLCBpdCBwdXRzCitpdCBpbiB0aGUgZXhwciBzZWN0aW9uLgorQGMgRklYTUUgaXRlbSBkZWJ1ZworQGMgRklYTUUgaXRlbSB0cmFuc2Zlclt0XSB2ZWN0b3IgcHJlbG9hZAorQGMgRklYTUUgaXRlbSB0cmFuc2Zlclt0XSB2ZWN0b3IgcG9zdGxvYWQKK0BjIEZJWE1FIGl0ZW0gcmVnaXN0ZXIKK0BlbmQgdGFibGUKKworQG5vZGUgU3ViLVNlY3Rpb25zCitAc2VjdGlvbiBTdWItU2VjdGlvbnMKKworQGNpbmRleCBudW1iZXJlZCBzdWJzZWN0aW9ucworQGNpbmRleCBncm91cGluZyBkYXRhCitAaWZzZXQgYW91dC1ib3V0CitBc3NlbWJsZWQgYnl0ZXMKK0BpZnNldCBDT0ZGCitjb252ZW50aW9uYWxseQorQGVuZCBpZnNldAorZmFsbCBpbnRvIHR3byBzZWN0aW9uczogdGV4dCBhbmQgZGF0YS4KK0BlbmQgaWZzZXQKK1lvdSBtYXkgaGF2ZSBzZXBhcmF0ZSBncm91cHMgb2YKK0BpZnNldCBHRU5FUklDCitkYXRhIGluIG5hbWVkIHNlY3Rpb25zCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAaWZjbGVhciBhb3V0LWJvdXQKK2RhdGEgaW4gbmFtZWQgc2VjdGlvbnMKK0BlbmQgaWZjbGVhcgorQGlmc2V0IGFvdXQtYm91dAordGV4dCBvciBkYXRhCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKK3RoYXQgeW91IHdhbnQgdG8gZW5kIHVwIG5lYXIgdG8gZWFjaCBvdGhlciBpbiB0aGUgb2JqZWN0IGZpbGUsIGV2ZW4gdGhvdWdoIHRoZXkKK2FyZSBub3QgY29udGlndW91cyBpbiB0aGUgYXNzZW1ibGVyIHNvdXJjZS4gIEBjb2Rle0B2YWx1ZXtBU319IGFsbG93cyB5b3UgdG8KK3VzZSBAZGZue3N1YnNlY3Rpb25zfSBmb3IgdGhpcyBwdXJwb3NlLiAgV2l0aGluIGVhY2ggc2VjdGlvbiwgdGhlcmUgY2FuIGJlCitudW1iZXJlZCBzdWJzZWN0aW9ucyB3aXRoIHZhbHVlcyBmcm9tIDAgdG8gODE5Mi4gIE9iamVjdHMgYXNzZW1ibGVkIGludG8gdGhlCitzYW1lIHN1YnNlY3Rpb24gZ28gaW50byB0aGUgb2JqZWN0IGZpbGUgdG9nZXRoZXIgd2l0aCBvdGhlciBvYmplY3RzIGluIHRoZSBzYW1lCitzdWJzZWN0aW9uLiAgRm9yIGV4YW1wbGUsIGEgY29tcGlsZXIgbWlnaHQgd2FudCB0byBzdG9yZSBjb25zdGFudHMgaW4gdGhlIHRleHQKK3NlY3Rpb24sIGJ1dCBtaWdodCBub3Qgd2FudCB0byBoYXZlIHRoZW0gaW50ZXJzcGVyc2VkIHdpdGggdGhlIHByb2dyYW0gYmVpbmcKK2Fzc2VtYmxlZC4gIEluIHRoaXMgY2FzZSwgdGhlIGNvbXBpbGVyIGNvdWxkIGlzc3VlIGEgQHNhbXB7LnRleHQgMH0gYmVmb3JlIGVhY2gKK3NlY3Rpb24gb2YgY29kZSBiZWluZyBvdXRwdXQsIGFuZCBhIEBzYW1wey50ZXh0IDF9IGJlZm9yZSBlYWNoIGdyb3VwIG9mCitjb25zdGFudHMgYmVpbmcgb3V0cHV0LgorCitTdWJzZWN0aW9ucyBhcmUgb3B0aW9uYWwuICBJZiB5b3UgZG8gbm90IHVzZSBzdWJzZWN0aW9ucywgZXZlcnl0aGluZworZ29lcyBpbiBzdWJzZWN0aW9uIG51bWJlciB6ZXJvLgorCitAaWZzZXQgR0VORVJJQworRWFjaCBzdWJzZWN0aW9uIGlzIHplcm8tcGFkZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgZm91ciBieXRlcy4KKyhTdWJzZWN0aW9ucyBtYXkgYmUgcGFkZGVkIGEgZGlmZmVyZW50IGFtb3VudCBvbiBkaWZmZXJlbnQgZmxhdm9ycworb2YgQGNvZGV7QHZhbHVle0FTfX0uKQorQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IEg4CitPbiB0aGUgSDgvMzAwIGFuZCBIOC81MDAgcGxhdGZvcm1zLCBlYWNoIHN1YnNlY3Rpb24gaXMgemVyby1wYWRkZWQgdG8gYSB3b3JkCitib3VuZGFyeSAodHdvIGJ5dGVzKS4KK1RoZSBzYW1lIGlzIHRydWUgb24gdGhlIEhpdGFjaGkgU0guCitAZW5kIGlmc2V0CitAaWZzZXQgSTk2MAorQGMgRklYTUUgc2VjdGlvbiBwYWRkaW5nIChhbGlnbm1lbnQpPworQGMgUmljaCBQaXhsZXkgc2F5cyBwYWRkaW5nIGhlcmUgZGVwZW5kcyBvbiB0YXJnZXQgb2JqIGNvZGUgZm9ybWF0OyB0aGF0CitAYyBkb2Vzbid0IHNlZW0gcGFydGljdWxhcmx5IHVzZWZ1bCB0byBzYXkgd2l0aG91dCBmdXJ0aGVyIGVsYWJvcmF0aW9uLAorQGMgc28gZm9yIG5vdyBJIHNheSBub3RoaW5nIGFib3V0IGl0LiAgSWYgdGhpcyBpcyBhIGdlbmVyaWMgQkZEIGlzc3VlLAorQGMgdGhlc2UgcGFyYWdyYXBocyBtaWdodCBuZWVkIHRvIHZhbmlzaCBmcm9tIHRoaXMgbWFudWFsLCBhbmQgYmUKK0BjIGRpc2N1c3NlZCBpbiBCRkQgY2hhcHRlciBvZiBiaW51dGlscyAob3Igc29tZSBzdWNoKS4KK0BlbmQgaWZzZXQKK0BpZnNldCBBMjlLCitPbiB0aGUgQU1EIDI5SyBmYW1pbHksIG5vIHBhcnRpY3VsYXIgcGFkZGluZyBpcyBhZGRlZCB0byBzZWN0aW9uIG9yCitzdWJzZWN0aW9uIHNpemVzOyBAdmFsdWV7QVN9IGZvcmNlcyBubyBhbGlnbm1lbnQgb24gdGhpcyBwbGF0Zm9ybS4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitTdWJzZWN0aW9ucyBhcHBlYXIgaW4geW91ciBvYmplY3QgZmlsZSBpbiBudW1lcmljIG9yZGVyLCBsb3dlc3QgbnVtYmVyZWQKK3RvIGhpZ2hlc3QuICAoQWxsIHRoaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuKQorVGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIG5vIHJlcHJlc2VudGF0aW9uIG9mIHN1YnNlY3Rpb25zOyBAY29kZXtAdmFsdWV7TER9fSBhbmQKK290aGVyIHByb2dyYW1zIHRoYXQgbWFuaXB1bGF0ZSBvYmplY3QgZmlsZXMgc2VlIG5vIHRyYWNlIG9mIHRoZW0uCitUaGV5IGp1c3Qgc2VlIGFsbCB5b3VyIHRleHQgc3Vic2VjdGlvbnMgYXMgYSB0ZXh0IHNlY3Rpb24sIGFuZCBhbGwgeW91cgorZGF0YSBzdWJzZWN0aW9ucyBhcyBhIGRhdGEgc2VjdGlvbi4KKworVG8gc3BlY2lmeSB3aGljaCBzdWJzZWN0aW9uIHlvdSB3YW50IHN1YnNlcXVlbnQgc3RhdGVtZW50cyBhc3NlbWJsZWQKK2ludG8sIHVzZSBhIG51bWVyaWMgYXJndW1lbnQgdG8gc3BlY2lmeSBpdCwgaW4gYSBAc2FtcHsudGV4dAorQHZhcntleHByZXNzaW9ufX0gb3IgYSBAc2FtcHsuZGF0YSBAdmFye2V4cHJlc3Npb259fSBzdGF0ZW1lbnQuCitAaWZzZXQgQ09GRgorQGlmc2V0IEdFTkVSSUMKK1doZW4gZ2VuZXJhdGluZyBDT0ZGIG91dHB1dCwgeW91CitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitZb3UKK0BlbmQgaWZjbGVhcgorY2FuIGFsc28gdXNlIGFuIGV4dHJhIHN1YnNlY3Rpb24KK2FyZ3VtZW50IHdpdGggYXJiaXRyYXJ5IG5hbWVkIHNlY3Rpb25zOiBAc2FtcHsuc2VjdGlvbiBAdmFye25hbWV9LAorQHZhcntleHByZXNzaW9ufX0uCitAZW5kIGlmc2V0CitAdmFye0V4cHJlc3Npb259IHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLgorKEB4cmVme0V4cHJlc3Npb25zfS4pICBJZiB5b3UganVzdCBzYXkgQHNhbXB7LnRleHR9IHRoZW4gQHNhbXB7LnRleHQgMH0KK2lzIGFzc3VtZWQuICBMaWtld2lzZSBAc2FtcHsuZGF0YX0gbWVhbnMgQHNhbXB7LmRhdGEgMH0uICBBc3NlbWJseQorYmVnaW5zIGluIEBjb2Rle3RleHQgMH0uICBGb3IgaW5zdGFuY2U6CitAc21hbGxleGFtcGxlCisudGV4dCAwICAgICAjIFRoZSBkZWZhdWx0IHN1YnNlY3Rpb24gaXMgdGV4dCAwIGFueXdheS4KKy5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZmlyc3QgdGV4dCBzdWJzZWN0aW9uLiAqIgorLnRleHQgMQorLmFzY2lpICJCdXQgdGhpcyBsaXZlcyBpbiB0aGUgc2Vjb25kIHRleHQgc3Vic2VjdGlvbi4iCisuZGF0YSAwCisuYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGRhdGEgc2VjdGlvbiwiCisuYXNjaWkgImluIHRoZSBmaXJzdCBkYXRhIHN1YnNlY3Rpb24uIgorLnRleHQgMAorLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBmaXJzdCB0ZXh0IHNlY3Rpb24sIgorLmFzY2lpICJpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGFzdGVyaXNrICgqKS4iCitAZW5kIHNtYWxsZXhhbXBsZQorCitFYWNoIHNlY3Rpb24gaGFzIGEgQGRmbntsb2NhdGlvbiBjb3VudGVyfSBpbmNyZW1lbnRlZCBieSBvbmUgZm9yIGV2ZXJ5IGJ5dGUKK2Fzc2VtYmxlZCBpbnRvIHRoYXQgc2VjdGlvbi4gIEJlY2F1c2Ugc3Vic2VjdGlvbnMgYXJlIG1lcmVseSBhIGNvbnZlbmllbmNlCityZXN0cmljdGVkIHRvIEBjb2Rle0B2YWx1ZXtBU319IHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYSBzdWJzZWN0aW9uIGxvY2F0aW9uCitjb3VudGVyLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUgYSBsb2NhdGlvbiBjb3VudGVyLS0tYnV0IHRoZQorQGNvZGV7LmFsaWdufSBkaXJlY3RpdmUgY2hhbmdlcyBpdCwgYW5kIGFueSBsYWJlbCBkZWZpbml0aW9uIGNhcHR1cmVzIGl0cworY3VycmVudCB2YWx1ZS4gIFRoZSBsb2NhdGlvbiBjb3VudGVyIG9mIHRoZSBzZWN0aW9uIHdoZXJlIHN0YXRlbWVudHMgYXJlIGJlaW5nCithc3NlbWJsZWQgaXMgc2FpZCB0byBiZSB0aGUgQGRmbnthY3RpdmV9IGxvY2F0aW9uIGNvdW50ZXIuCisKK0Bub2RlIGJzcworQHNlY3Rpb24gYnNzIFNlY3Rpb24KKworQGNpbmRleCBic3Mgc2VjdGlvbgorQGNpbmRleCBjb21tb24gdmFyaWFibGUgc3RvcmFnZQorVGhlIGJzcyBzZWN0aW9uIGlzIHVzZWQgZm9yIGxvY2FsIGNvbW1vbiB2YXJpYWJsZSBzdG9yYWdlLgorWW91IG1heSBhbGxvY2F0ZSBhZGRyZXNzIHNwYWNlIGluIHRoZSBic3Mgc2VjdGlvbiwgYnV0IHlvdSBtYXkKK25vdCBkaWN0YXRlIGRhdGEgdG8gbG9hZCBpbnRvIGl0IGJlZm9yZSB5b3VyIHByb2dyYW0gZXhlY3V0ZXMuICBXaGVuCit5b3VyIHByb2dyYW0gc3RhcnRzIHJ1bm5pbmcsIGFsbCB0aGUgY29udGVudHMgb2YgdGhlIGJzcworc2VjdGlvbiBhcmUgemVyb2VkIGJ5dGVzLgorCitUaGUgQGNvZGV7Lmxjb21tfSBwc2V1ZG8tb3AgZGVmaW5lcyBhIHN5bWJvbCBpbiB0aGUgYnNzIHNlY3Rpb247IHNlZQorQHJlZntMY29tbSwsQGNvZGV7Lmxjb21tfX0uCisKK1RoZSBAY29kZXsuY29tbX0gcHNldWRvLW9wIG1heSBiZSB1c2VkIHRvIGRlY2xhcmUgYSBjb21tb24gc3ltYm9sLCB3aGljaCBpcworYW5vdGhlciBmb3JtIG9mIHVuaW5pdGlhbGl6ZWQgc3ltYm9sOyBzZWUgQHhyZWZ7Q29tbSwsQGNvZGV7LmNvbW19fS4KKworQGlmc2V0IEdFTkVSSUMKK1doZW4gYXNzZW1ibGluZyBmb3IgYSB0YXJnZXQgd2hpY2ggc3VwcG9ydHMgbXVsdGlwbGUgc2VjdGlvbnMsIHN1Y2ggYXMgRUxGIG9yCitDT0ZGLCB5b3UgbWF5IHN3aXRjaCBpbnRvIHRoZSBAY29kZXsuYnNzfSBzZWN0aW9uIGFuZCBkZWZpbmUgc3ltYm9scyBhcyB1c3VhbDsKK3NlZSBAcmVme1NlY3Rpb24sLEBjb2Rley5zZWN0aW9ufX0uICBZb3UgbWF5IG9ubHkgYXNzZW1ibGUgemVybyB2YWx1ZXMgaW50byB0aGUKK3NlY3Rpb24uICBUeXBpY2FsbHkgdGhlIHNlY3Rpb24gd2lsbCBvbmx5IGNvbnRhaW4gc3ltYm9sIGRlZmluaXRpb25zIGFuZAorQGNvZGV7LnNraXB9IGRpcmVjdGl2ZXMgKEBweHJlZntTa2lwLCxAY29kZXsuc2tpcH19KS4KK0BlbmQgaWZzZXQKKworQG5vZGUgU3ltYm9scworQGNoYXB0ZXIgU3ltYm9scworCitAY2luZGV4IHN5bWJvbHMKK1N5bWJvbHMgYXJlIGEgY2VudHJhbCBjb25jZXB0OiB0aGUgcHJvZ3JhbW1lciB1c2VzIHN5bWJvbHMgdG8gbmFtZQordGhpbmdzLCB0aGUgbGlua2VyIHVzZXMgc3ltYm9scyB0byBsaW5rLCBhbmQgdGhlIGRlYnVnZ2VyIHVzZXMgc3ltYm9scwordG8gZGVidWcuCisKK0BxdW90YXRpb24KK0BjaW5kZXggZGVidWdnZXJzLCBhbmQgc3ltYm9sIG9yZGVyCitAZW1waHtXYXJuaW5nOn0gQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgcGxhY2Ugc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUgaW4KK3RoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC4gIFRoaXMgbWF5IGJyZWFrIHNvbWUgZGVidWdnZXJzLgorQGVuZCBxdW90YXRpb24KKworQG1lbnUKKyogTGFiZWxzOjogICAgICAgICAgICAgICAgICAgICAgTGFiZWxzCisqIFNldHRpbmcgU3ltYm9sczo6ICAgICAgICAgICAgIEdpdmluZyBTeW1ib2xzIE90aGVyIFZhbHVlcworKiBTeW1ib2wgTmFtZXM6OiAgICAgICAgICAgICAgICBTeW1ib2wgTmFtZXMKKyogRG90OjogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNwZWNpYWwgRG90IFN5bWJvbAorKiBTeW1ib2wgQXR0cmlidXRlczo6ICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlcworQGVuZCBtZW51CisKK0Bub2RlIExhYmVscworQHNlY3Rpb24gTGFiZWxzCisKK0BjaW5kZXggbGFiZWxzCitBIEBkZm57bGFiZWx9IGlzIHdyaXR0ZW4gYXMgYSBzeW1ib2wgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb2xvbgorQHNhbXB7On0uICBUaGUgc3ltYm9sIHRoZW4gcmVwcmVzZW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUKK2FjdGl2ZSBsb2NhdGlvbiBjb3VudGVyLCBhbmQgaXMsIGZvciBleGFtcGxlLCBhIHN1aXRhYmxlIGluc3RydWN0aW9uCitvcGVyYW5kLiAgWW91IGFyZSB3YXJuZWQgaWYgeW91IHVzZSB0aGUgc2FtZSBzeW1ib2wgdG8gcmVwcmVzZW50IHR3bworZGlmZmVyZW50IGxvY2F0aW9uczogdGhlIGZpcnN0IGRlZmluaXRpb24gb3ZlcnJpZGVzIGFueSBvdGhlcgorZGVmaW5pdGlvbnMuCisKK0BpZnNldCBIUFBBCitPbiB0aGUgSFBQQSwgdGhlIHVzdWFsIGZvcm0gZm9yIGEgbGFiZWwgbmVlZCBub3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYQorY29sb24sIGJ1dCBpbnN0ZWFkIG11c3Qgc3RhcnQgaW4gY29sdW1uIHplcm8uICBPbmx5IG9uZSBsYWJlbCBtYXkgYmUgZGVmaW5lZCBvbgorYSBzaW5nbGUgbGluZS4gIFRvIHdvcmsgYXJvdW5kIHRoaXMsIHRoZSBIUFBBIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gYWxzbworcHJvdmlkZXMgYSBzcGVjaWFsIGRpcmVjdGl2ZSBAY29kZXsubGFiZWx9IGZvciBkZWZpbmluZyBsYWJlbHMgbW9yZSBmbGV4aWJseS4KK0BlbmQgaWZzZXQKKworQG5vZGUgU2V0dGluZyBTeW1ib2xzCitAc2VjdGlvbiBHaXZpbmcgU3ltYm9scyBPdGhlciBWYWx1ZXMKKworQGNpbmRleCBhc3NpZ25pbmcgdmFsdWVzIHRvIHN5bWJvbHMKK0BjaW5kZXggc3ltYm9sIHZhbHVlcywgYXNzaWduaW5nCitBIHN5bWJvbCBjYW4gYmUgZ2l2ZW4gYW4gYXJiaXRyYXJ5IHZhbHVlIGJ5IHdyaXRpbmcgYSBzeW1ib2wsIGZvbGxvd2VkCitieSBhbiBlcXVhbHMgc2lnbiBAc2FtcHs9fSwgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbgorKEBweHJlZntFeHByZXNzaW9uc30pLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBAY29kZXsuc2V0fQorZGlyZWN0aXZlLiAgQHhyZWZ7U2V0LCxAY29kZXsuc2V0fX0uCisKK0Bub2RlIFN5bWJvbCBOYW1lcworQHNlY3Rpb24gU3ltYm9sIE5hbWVzCisKK0BjaW5kZXggc3ltYm9sIG5hbWVzCitAY2luZGV4IG5hbWVzLCBzeW1ib2wKK0BpZmNsZWFyIFNQRUNJQUwtU1lNUworU3ltYm9sIG5hbWVzIGJlZ2luIHdpdGggYSBsZXR0ZXIgb3Igd2l0aCBvbmUgb2YgQHNhbXB7Ll99LiAgT24gbW9zdAorbWFjaGluZXMsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzOyBleGNlcHRpb25zIGFyZQorbm90ZWQgaW4gQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uICBUaGF0IGNoYXJhY3RlciBtYXkgYmUgZm9sbG93ZWQgYnkgYW55CitzdHJpbmcgb2YgZGlnaXRzLCBsZXR0ZXJzLCBkb2xsYXIgc2lnbnMgKHVubGVzcyBvdGhlcndpc2Ugbm90ZWQgaW4KK0ByZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9KSwgYW5kIHVuZGVyc2NvcmVzLgorQGVuZCBpZmNsZWFyCitAaWZzZXQgQTI5SworRm9yIHRoZSBBTUQgMjlLIGZhbWlseSwgQHNhbXB7P30gaXMgYWxzbyBhbGxvd2VkIGluIHRoZQorYm9keSBvZiBhIHN5bWJvbCBuYW1lLCB0aG91Z2ggbm90IGF0IGl0cyBiZWdpbm5pbmcuCitAZW5kIGlmc2V0CisKK0BpZnNldCBTUEVDSUFMLVNZTVMKK0BpZnNldCBIOAorU3ltYm9sIG5hbWVzIGJlZ2luIHdpdGggYSBsZXR0ZXIgb3Igd2l0aCBvbmUgb2YgQHNhbXB7Ll99LiAgT24gdGhlCitIaXRhY2hpIFNIIG9yIHRoZQorSDgvNTAwLCB5b3UgY2FuIGFsc28gdXNlIEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcy4gIFRoYXQgY2hhcmFjdGVyIG1heQorYmUgZm9sbG93ZWQgYnkgYW55IHN0cmluZyBvZiBkaWdpdHMsIGxldHRlcnMsIGRvbGxhciBzaWducyAoc2F2ZSBvbiB0aGUKK0g4LzMwMCksIGFuZCB1bmRlcnNjb3Jlcy4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQ2FzZSBvZiBsZXR0ZXJzIGlzIHNpZ25pZmljYW50OiBAY29kZXtmb299IGlzIGEgZGlmZmVyZW50IHN5bWJvbCBuYW1lCit0aGFuIEBjb2Rle0Zvb30uCisKK0VhY2ggc3ltYm9sIGhhcyBleGFjdGx5IG9uZSBuYW1lLiAgRWFjaCBuYW1lIGluIGFuIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0KK3JlZmVycyB0byBleGFjdGx5IG9uZSBzeW1ib2wuICBZb3UgbWF5IHVzZSB0aGF0IHN5bWJvbCBuYW1lIGFueSBudW1iZXIgb2YgdGltZXMKK2luIGEgcHJvZ3JhbS4KKworQHN1YmhlYWRpbmcgTG9jYWwgU3ltYm9sIE5hbWVzCisKK0BjaW5kZXggbG9jYWwgc3ltYm9sIG5hbWVzCitAY2luZGV4IHN5bWJvbCBuYW1lcywgbG9jYWwKK0BjaW5kZXggdGVtcG9yYXJ5IHN5bWJvbCBuYW1lcworQGNpbmRleCBzeW1ib2wgbmFtZXMsIHRlbXBvcmFyeQorTG9jYWwgc3ltYm9scyBoZWxwIGNvbXBpbGVycyBhbmQgcHJvZ3JhbW1lcnMgdXNlIG5hbWVzIHRlbXBvcmFyaWx5LgorVGhlcmUgYXJlIHRlbiBsb2NhbCBzeW1ib2wgbmFtZXMsIHdoaWNoIGFyZSByZS11c2VkIHRocm91Z2hvdXQgdGhlCitwcm9ncmFtLiAgWW91IG1heSByZWZlciB0byB0aGVtIHVzaW5nIHRoZSBuYW1lcyBAc2FtcHswfSBAc2FtcHsxfQorQGRvdHN7fSBAc2FtcHs5fS4gIFRvIGRlZmluZSBhIGxvY2FsIHN5bWJvbCwgd3JpdGUgYSBsYWJlbCBvZiB0aGUgZm9ybQorQHNhbXB7QGJ7Tn06fSAod2hlcmUgQGJ7Tn0gcmVwcmVzZW50cyBhbnkgZGlnaXQpLiAgVG8gcmVmZXIgdG8gdGhlIG1vc3QKK3JlY2VudCBwcmV2aW91cyBkZWZpbml0aW9uIG9mIHRoYXQgc3ltYm9sIHdyaXRlIEBzYW1we0Bie059Yn0sIHVzaW5nIHRoZQorc2FtZSBkaWdpdCBhcyB3aGVuIHlvdSBkZWZpbmVkIHRoZSBsYWJlbC4gIFRvIHJlZmVyIHRvIHRoZSBuZXh0CitkZWZpbml0aW9uIG9mIGEgbG9jYWwgbGFiZWwsIHdyaXRlIEBzYW1we0Bie059Zn0tLS13aGVyZSBAYntOfSBnaXZlcyB5b3UKK2EgY2hvaWNlIG9mIDEwIGZvcndhcmQgcmVmZXJlbmNlcy4gIFRoZSBAc2FtcHtifSBzdGFuZHMgZm9yCitgYGJhY2t3YXJkcycnIGFuZCB0aGUgQHNhbXB7Zn0gc3RhbmRzIGZvciBgYGZvcndhcmRzJycuCisKK0xvY2FsIHN5bWJvbHMgYXJlIG5vdCBlbWl0dGVkIGJ5IHRoZSBjdXJyZW50IEBzY3tnbnV9IEMgY29tcGlsZXIuCisKK1RoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIGhvdyB5b3UgY2FuIHVzZSB0aGVzZSBsYWJlbHMsIGJ1dAorcmVtZW1iZXIgdGhhdCBhdCBhbnkgcG9pbnQgaW4gdGhlIGFzc2VtYmx5IHlvdSBjYW4gcmVmZXIgdG8gYXQgbW9zdAorMTAgcHJpb3IgbG9jYWwgbGFiZWxzIGFuZCB0byBhdCBtb3N0IDEwIGZvcndhcmQgbG9jYWwgbGFiZWxzLgorCitMb2NhbCBzeW1ib2wgbmFtZXMgYXJlIG9ubHkgYSBub3RhdGlvbiBkZXZpY2UuICBUaGV5IGFyZSBpbW1lZGlhdGVseQordHJhbnNmb3JtZWQgaW50byBtb3JlIGNvbnZlbnRpb25hbCBzeW1ib2wgbmFtZXMgYmVmb3JlIHRoZSBhc3NlbWJsZXIKK3VzZXMgdGhlbS4gIFRoZSBzeW1ib2wgbmFtZXMgc3RvcmVkIGluIHRoZSBzeW1ib2wgdGFibGUsIGFwcGVhcmluZyBpbgorZXJyb3IgbWVzc2FnZXMgYW5kIG9wdGlvbmFsbHkgZW1pdHRlZCB0byB0aGUgb2JqZWN0IGZpbGUgaGF2ZSB0aGVzZQorcGFydHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gTAorQWxsIGxvY2FsIGxhYmVscyBiZWdpbiB3aXRoIEBzYW1we0x9LiBOb3JtYWxseSBib3RoIEBjb2Rle0B2YWx1ZXtBU319IGFuZAorQGNvZGV7QHZhbHVle0xEfX0gZm9yZ2V0IHN5bWJvbHMgdGhhdCBzdGFydCB3aXRoIEBzYW1we0x9LiBUaGVzZSBsYWJlbHMgYXJlCit1c2VkIGZvciBzeW1ib2xzIHlvdSBhcmUgbmV2ZXIgaW50ZW5kZWQgdG8gc2VlLiAgSWYgeW91IHVzZSB0aGUKK0BzYW1wey1MfSBvcHRpb24gdGhlbiBAY29kZXtAdmFsdWV7QVN9fSByZXRhaW5zIHRoZXNlIHN5bWJvbHMgaW4gdGhlCitvYmplY3QgZmlsZS4gSWYgeW91IGFsc28gaW5zdHJ1Y3QgQGNvZGV7QHZhbHVle0xEfX0gdG8gcmV0YWluIHRoZXNlIHN5bWJvbHMsCit5b3UgbWF5IHVzZSB0aGVtIGluIGRlYnVnZ2luZy4KKworQGl0ZW0gQHZhcntkaWdpdH0KK0lmIHRoZSBsYWJlbCBpcyB3cml0dGVuIEBzYW1wezA6fSB0aGVuIHRoZSBkaWdpdCBpcyBAc2FtcHswfS4KK0lmIHRoZSBsYWJlbCBpcyB3cml0dGVuIEBzYW1wezE6fSB0aGVuIHRoZSBkaWdpdCBpcyBAc2FtcHsxfS4KK0FuZCBzbyBvbiB1cCB0aHJvdWdoIEBzYW1wezk6fS4KKworQGl0ZW0gQGtiZHtDLUF9CitUaGlzIHVudXN1YWwgY2hhcmFjdGVyIGlzIGluY2x1ZGVkIHNvIHlvdSBkbyBub3QgYWNjaWRlbnRhbGx5IGludmVudAorYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZS4gIFRoZSBjaGFyYWN0ZXIgaGFzIEFTQ0lJIHZhbHVlCitAc2FtcHtcMDAxfS4KKworQGl0ZW0gQGVtcGh7b3JkaW5hbCBudW1iZXJ9CitUaGlzIGlzIGEgc2VyaWFsIG51bWJlciB0byBrZWVwIHRoZSBsYWJlbHMgZGlzdGluY3QuICBUaGUgZmlyc3QKK0BzYW1wezA6fSBnZXRzIHRoZSBudW1iZXIgQHNhbXB7MX07IFRoZSAxNXRoIEBzYW1wezA6fSBnZXRzIHRoZQorbnVtYmVyIEBzYW1wezE1fTsgQGVtcGh7ZXRjLn0uICBMaWtld2lzZSBmb3IgdGhlIG90aGVyIGxhYmVscyBAc2FtcHsxOn0KK3Rocm91Z2ggQHNhbXB7OTp9LgorQGVuZCB0YWJsZQorCitGb3IgaW5zdGFuY2UsIHRoZSBmaXJzdCBAY29kZXsxOn0gaXMgbmFtZWQgQGNvZGV7TDFAa2Jke0MtQX0xfSwgdGhlIDQ0dGgKK0Bjb2RlezM6fSBpcyBuYW1lZCBAY29kZXtMM0BrYmR7Qy1BfTQ0fS4KKworQG5vZGUgRG90CitAc2VjdGlvbiBUaGUgU3BlY2lhbCBEb3QgU3ltYm9sCisKK0BjaW5kZXggZG90IChzeW1ib2wpCitAY2luZGV4IEBjb2Rley59IChzeW1ib2wpCitAY2luZGV4IGN1cnJlbnQgYWRkcmVzcworQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyCitUaGUgc3BlY2lhbCBzeW1ib2wgQHNhbXB7Ln0gcmVmZXJzIHRvIHRoZSBjdXJyZW50IGFkZHJlc3MgdGhhdAorQGNvZGV7QHZhbHVle0FTfX0gaXMgYXNzZW1ibGluZyBpbnRvLiAgVGh1cywgdGhlIGV4cHJlc3Npb24gQHNhbXB7bWVsdmluOgorLmxvbmcgLn0gZGVmaW5lcyBAY29kZXttZWx2aW59IHRvIGNvbnRhaW4gaXRzIG93biBhZGRyZXNzLgorQXNzaWduaW5nIGEgdmFsdWUgdG8gQGNvZGV7Ln0gaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBhIEBjb2Rley5vcmd9CitkaXJlY3RpdmUuICBUaHVzLCB0aGUgZXhwcmVzc2lvbiBAc2FtcHsuPS4rNH0gaXMgdGhlIHNhbWUgYXMgc2F5aW5nCitAaWZjbGVhciBuby1zcGFjZS1kaXIKK0BzYW1wey5zcGFjZSA0fS4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IG5vLXNwYWNlLWRpcgorQGlmc2V0IEEyOUsKK0BzYW1wey5ibG9jayA0fS4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQG5vZGUgU3ltYm9sIEF0dHJpYnV0ZXMKK0BzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzCisKK0BjaW5kZXggc3ltYm9sIGF0dHJpYnV0ZXMKK0BjaW5kZXggYXR0cmlidXRlcywgc3ltYm9sCitFdmVyeSBzeW1ib2wgaGFzLCBhcyB3ZWxsIGFzIGl0cyBuYW1lLCB0aGUgYXR0cmlidXRlcyBgYFZhbHVlJycgYW5kCitgYFR5cGUnJy4gIERlcGVuZGluZyBvbiBvdXRwdXQgZm9ybWF0LCBzeW1ib2xzIGNhbiBhbHNvIGhhdmUgYXV4aWxpYXJ5CithdHRyaWJ1dGVzLgorQGlmc2V0IElOVEVSTkFMUworVGhlIGRldGFpbGVkIGRlZmluaXRpb25zIGFyZSBpbiBAZmlsZXthLm91dC5ofS4KK0BlbmQgaWZzZXQKKworSWYgeW91IHVzZSBhIHN5bWJvbCB3aXRob3V0IGRlZmluaW5nIGl0LCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHplcm8gZm9yCithbGwgdGhlc2UgYXR0cmlidXRlcywgYW5kIHByb2JhYmx5IHdvbid0IHdhcm4geW91LiAgVGhpcyBtYWtlcyB0aGUKK3N5bWJvbCBhbiBleHRlcm5hbGx5IGRlZmluZWQgc3ltYm9sLCB3aGljaCBpcyBnZW5lcmFsbHkgd2hhdCB5b3UKK3dvdWxkIHdhbnQuCisKK0BtZW51CisqIFN5bWJvbCBWYWx1ZTo6ICAgICAgICAgICAgICAgIFZhbHVlCisqIFN5bWJvbCBUeXBlOjogICAgICAgICAgICAgICAgIFR5cGUKK0BpZnNldCBhb3V0LWJvdXQKK0BpZnNldCBHRU5FUklDCisqIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZmNsZWFyIEJPVVQKKyogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fQorQGVuZCBpZmNsZWFyCitAaWZzZXQgQk9VVAorKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9LCBAY29kZXtiLm91dH0KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorQGVuZCBpZnNldAorQGlmc2V0IENPRkYKKyogQ09GRiBTeW1ib2xzOjogICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIENPRkYKK0BlbmQgaWZzZXQKK0BpZnNldCBTT00KKyogU09NIFN5bWJvbHM6OiAgICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlcyBmb3IgU09NCitAZW5kIGlmc2V0CitAZW5kIG1lbnUKKworQG5vZGUgU3ltYm9sIFZhbHVlCitAc3Vic2VjdGlvbiBWYWx1ZQorCitAY2luZGV4IHZhbHVlIG9mIGEgc3ltYm9sCitAY2luZGV4IHN5bWJvbCB2YWx1ZQorVGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzICh1c3VhbGx5KSAzMiBiaXRzLiAgRm9yIGEgc3ltYm9sIHdoaWNoIGxhYmVscyBhCitsb2NhdGlvbiBpbiB0aGUgdGV4dCwgZGF0YSwgYnNzIG9yIGFic29sdXRlIHNlY3Rpb25zIHRoZSB2YWx1ZSBpcyB0aGUKK251bWJlciBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhhdCBzZWN0aW9uIHRvIHRoZSBsYWJlbC4KK05hdHVyYWxseSBmb3IgdGV4dCwgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBjaGFuZ2VzCithcyBAY29kZXtAdmFsdWV7TER9fSBjaGFuZ2VzIHNlY3Rpb24gYmFzZSBhZGRyZXNzZXMgZHVyaW5nIGxpbmtpbmcuICBBYnNvbHV0ZQorc3ltYm9scycgdmFsdWVzIGRvIG5vdCBjaGFuZ2UgZHVyaW5nIGxpbmtpbmc6IHRoYXQgaXMgd2h5IHRoZXkgYXJlCitjYWxsZWQgYWJzb2x1dGUuCisKK1RoZSB2YWx1ZSBvZiBhbiB1bmRlZmluZWQgc3ltYm9sIGlzIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheS4gIElmIGl0IGlzCiswIHRoZW4gdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIGFzc2VtYmxlciBzb3VyY2UgZmlsZSwgYW5kCitAY29kZXtAdmFsdWV7TER9fSB0cmllcyB0byBkZXRlcm1pbmUgaXRzIHZhbHVlIGZyb20gb3RoZXIgZmlsZXMgbGlua2VkIGludG8gdGhlCitzYW1lIHByb2dyYW0uICBZb3UgbWFrZSB0aGlzIGtpbmQgb2Ygc3ltYm9sIHNpbXBseSBieSBtZW50aW9uaW5nIGEgc3ltYm9sCituYW1lIHdpdGhvdXQgZGVmaW5pbmcgaXQuICBBIG5vbi16ZXJvIHZhbHVlIHJlcHJlc2VudHMgYSBAY29kZXsuY29tbX0KK2NvbW1vbiBkZWNsYXJhdGlvbi4gIFRoZSB2YWx1ZSBpcyBob3cgbXVjaCBjb21tb24gc3RvcmFnZSB0byByZXNlcnZlLCBpbgorYnl0ZXMgKGFkZHJlc3NlcykuICBUaGUgc3ltYm9sIHJlZmVycyB0byB0aGUgZmlyc3QgYWRkcmVzcyBvZiB0aGUKK2FsbG9jYXRlZCBzdG9yYWdlLgorCitAbm9kZSBTeW1ib2wgVHlwZQorQHN1YnNlY3Rpb24gVHlwZQorCitAY2luZGV4IHR5cGUgb2YgYSBzeW1ib2wKK0BjaW5kZXggc3ltYm9sIHR5cGUKK1RoZSB0eXBlIGF0dHJpYnV0ZSBvZiBhIHN5bWJvbCBjb250YWlucyByZWxvY2F0aW9uIChzZWN0aW9uKQoraW5mb3JtYXRpb24sIGFueSBmbGFnIHNldHRpbmdzIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCBpcyBleHRlcm5hbCwgYW5kCisob3B0aW9uYWxseSksIG90aGVyIGluZm9ybWF0aW9uIGZvciBsaW5rZXJzIGFuZCBkZWJ1Z2dlcnMuICBUaGUgZXhhY3QKK2Zvcm1hdCBkZXBlbmRzIG9uIHRoZSBvYmplY3QtY29kZSBvdXRwdXQgZm9ybWF0IGluIHVzZS4KKworQGlmc2V0IGFvdXQtYm91dAorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IEJPVVQKK0BjIFRoZSBmb2xsb3dpbmcgYXZvaWRzIGEgIndpZG93IiBzdWJzZWN0aW9uIHRpdGxlLiAgQGdyb3VwIHdvdWxkIGJlCitAYyBiZXR0ZXIgaWYgaXQgd2VyZSBhdmFpbGFibGUgb3V0c2lkZSBleGFtcGxlcy4KK0BuZWVkIDEwMDAKK0Bub2RlIGEub3V0IFN5bWJvbHMKK0BzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0sIEBjb2Rle2Iub3V0fQorCitAY2luZGV4IEBjb2Rle2Iub3V0fSBzeW1ib2wgYXR0cmlidXRlcworQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcywgQGNvZGV7Yi5vdXR9CitUaGVzZSBzeW1ib2wgYXR0cmlidXRlcyBhcHBlYXIgb25seSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yCitvbmUgb2YgdGhlIEJlcmtlbGV5LWRlc2NlbmRlZCBvYmplY3Qgb3V0cHV0IGZvcm1hdHMtLS1AY29kZXthLm91dH0gb3IKK0Bjb2Rle2Iub3V0fS4KKworQGVuZCBpZnNldAorQGlmY2xlYXIgQk9VVAorQG5vZGUgYS5vdXQgU3ltYm9scworQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fQorCitAY2luZGV4IEBjb2Rle2Eub3V0fSBzeW1ib2wgYXR0cmlidXRlcworQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcywgQGNvZGV7YS5vdXR9CisKK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCitAaWZzZXQgR0VORVJJQworQG5vZGUgYS5vdXQgU3ltYm9scworQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fQorCitAY2luZGV4IEBjb2Rle2Eub3V0fSBzeW1ib2wgYXR0cmlidXRlcworQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcywgQGNvZGV7YS5vdXR9CisKK0BlbmQgaWZzZXQKK0BtZW51CisqIFN5bWJvbCBEZXNjOjogICAgICAgICAgICAgICAgIERlc2NyaXB0b3IKKyogU3ltYm9sIE90aGVyOjogICAgICAgICAgICAgICAgT3RoZXIKK0BlbmQgbWVudQorCitAbm9kZSBTeW1ib2wgRGVzYworQHN1YnN1YnNlY3Rpb24gRGVzY3JpcHRvcgorCitAY2luZGV4IGRlc2NyaXB0b3IsIG9mIEBjb2Rle2Eub3V0fSBzeW1ib2wKK1RoaXMgaXMgYW4gYXJiaXRyYXJ5IDE2LWJpdCB2YWx1ZS4gIFlvdSBtYXkgZXN0YWJsaXNoIGEgc3ltYm9sJ3MKK2Rlc2NyaXB0b3IgdmFsdWUgYnkgdXNpbmcgYSBAY29kZXsuZGVzY30gc3RhdGVtZW50CisoQHB4cmVme0Rlc2MsLEBjb2Rley5kZXNjfX0pLiAgQSBkZXNjcmlwdG9yIHZhbHVlIG1lYW5zIG5vdGhpbmcgdG8KK0Bjb2Rle0B2YWx1ZXtBU319LgorCitAbm9kZSBTeW1ib2wgT3RoZXIKK0BzdWJzdWJzZWN0aW9uIE90aGVyCisKK0BjaW5kZXggb3RoZXIgYXR0cmlidXRlLCBvZiBAY29kZXthLm91dH0gc3ltYm9sCitUaGlzIGlzIGFuIGFyYml0cmFyeSA4LWJpdCB2YWx1ZS4gIEl0IG1lYW5zIG5vdGhpbmcgdG8gQGNvZGV7QHZhbHVle0FTfX0uCitAZW5kIGlmc2V0CisKK0BpZnNldCBDT0ZGCitAbm9kZSBDT0ZGIFN5bWJvbHMKK0BzdWJzZWN0aW9uIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBDT0ZGCisKK0BjaW5kZXggQ09GRiBzeW1ib2wgYXR0cmlidXRlcworQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcywgQ09GRgorCitUaGUgQ09GRiBmb3JtYXQgc3VwcG9ydHMgYSBtdWx0aXR1ZGUgb2YgYXV4aWxpYXJ5IHN5bWJvbCBhdHRyaWJ1dGVzOworbGlrZSB0aGUgcHJpbWFyeSBzeW1ib2wgYXR0cmlidXRlcywgdGhleSBhcmUgc2V0IGJldHdlZW4gQGNvZGV7LmRlZn0gYW5kCitAY29kZXsuZW5kZWZ9IGRpcmVjdGl2ZXMuCisKK0BzdWJzdWJzZWN0aW9uIFByaW1hcnkgQXR0cmlidXRlcworCitAY2luZGV4IHByaW1hcnkgYXR0cmlidXRlcywgQ09GRiBzeW1ib2xzCitUaGUgc3ltYm9sIG5hbWUgaXMgc2V0IHdpdGggQGNvZGV7LmRlZn07IHRoZSB2YWx1ZSBhbmQgdHlwZSwKK3Jlc3BlY3RpdmVseSwgd2l0aCBAY29kZXsudmFsfSBhbmQgQGNvZGV7LnR5cGV9LgorCitAc3Vic3Vic2VjdGlvbiBBdXhpbGlhcnkgQXR0cmlidXRlcworCitAY2luZGV4IGF1eGlsaWFyeSBhdHRyaWJ1dGVzLCBDT0ZGIHN5bWJvbHMKK1RoZSBAY29kZXtAdmFsdWV7QVN9fSBkaXJlY3RpdmVzIEBjb2Rley5kaW19LCBAY29kZXsubGluZX0sIEBjb2Rley5zY2x9LAorQGNvZGV7LnNpemV9LCBhbmQgQGNvZGV7LnRhZ30gY2FuIGdlbmVyYXRlIGF1eGlsaWFyeSBzeW1ib2wgdGFibGUKK2luZm9ybWF0aW9uIGZvciBDT0ZGLgorQGVuZCBpZnNldAorCitAaWZzZXQgU09NCitAbm9kZSBTT00gU3ltYm9scworQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIFNPTQorCitAY2luZGV4IFNPTSBzeW1ib2wgYXR0cmlidXRlcworQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcywgU09NCisKK1RoZSBTT00gZm9ybWF0IGZvciB0aGUgSFBQQSBzdXBwb3J0cyBhIG11bHRpdHVkZSBvZiBzeW1ib2wgYXR0cmlidXRlcyBzZXQgd2l0aAordGhlIEBjb2Rley5FWFBPUlR9IGFuZCBAY29kZXsuSU1QT1JUfSBkaXJlY3RpdmVzLgorCitUaGUgYXR0cmlidXRlcyBhcmUgZGVzY3JpYmVkIGluIEBjaXRle0hQOTAwMCBTZXJpZXMgODAwIEFzc2VtYmx5IAorTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0gKEhQIDkyNDMyLTkwMDAxKSB1bmRlciB0aGUgQGNvZGV7SU1QT1JUfSBhbmQKK0Bjb2Rle0VYUE9SVH0gYXNzZW1ibGVyIGRpcmVjdGl2ZSBkb2N1bWVudGF0aW9uLgorQGVuZCBpZnNldAorCitAbm9kZSBFeHByZXNzaW9ucworQGNoYXB0ZXIgRXhwcmVzc2lvbnMKKworQGNpbmRleCBleHByZXNzaW9ucworQGNpbmRleCBhZGRyZXNzZXMKK0BjaW5kZXggbnVtZXJpYyB2YWx1ZXMKK0FuIEBkZm57ZXhwcmVzc2lvbn0gc3BlY2lmaWVzIGFuIGFkZHJlc3Mgb3IgbnVtZXJpYyB2YWx1ZS4KK1doaXRlc3BhY2UgbWF5IHByZWNlZGUgYW5kL29yIGZvbGxvdyBhbiBleHByZXNzaW9uLgorCitUaGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBhYnNvbHV0ZSBudW1iZXIsIG9yIGVsc2UgYW4gb2Zmc2V0IGludG8KK2EgcGFydGljdWxhciBzZWN0aW9uLiAgSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgYWJzb2x1dGUsIGFuZCB0aGVyZSBpcyBub3QKK2Vub3VnaCBpbmZvcm1hdGlvbiB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IHNlZXMgdGhlIGV4cHJlc3Npb24gdG8ga25vdyBpdHMKK3NlY3Rpb24sIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgc291cmNlIHByb2dyYW0gbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGludGVycHJldAordGhlIGV4cHJlc3Npb24tLS1idXQgdGhlIHNlY29uZCBwYXNzIGlzIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQuCitAY29kZXtAdmFsdWV7QVN9fSBhYm9ydHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgc2l0dWF0aW9uLgorCitAbWVudQorKiBFbXB0eSBFeHByczo6ICAgICAgICAgICAgICAgICBFbXB0eSBFeHByZXNzaW9ucworKiBJbnRlZ2VyIEV4cHJzOjogICAgICAgICAgICAgICBJbnRlZ2VyIEV4cHJlc3Npb25zCitAZW5kIG1lbnUKKworQG5vZGUgRW1wdHkgRXhwcnMKK0BzZWN0aW9uIEVtcHR5IEV4cHJlc3Npb25zCisKK0BjaW5kZXggZW1wdHkgZXhwcmVzc2lvbnMKK0BjaW5kZXggZXhwcmVzc2lvbnMsIGVtcHR5CitBbiBlbXB0eSBleHByZXNzaW9uIGhhcyBubyB2YWx1ZTogaXQgaXMganVzdCB3aGl0ZXNwYWNlIG9yIG51bGwuCitXaGVyZXZlciBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIGlzIHJlcXVpcmVkLCB5b3UgbWF5IG9taXQgdGhlCitleHByZXNzaW9uLCBhbmQgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyBhIHZhbHVlIG9mIChhYnNvbHV0ZSkgMC4gIFRoaXMKK2lzIGNvbXBhdGlibGUgd2l0aCBvdGhlciBhc3NlbWJsZXJzLgorCitAbm9kZSBJbnRlZ2VyIEV4cHJzCitAc2VjdGlvbiBJbnRlZ2VyIEV4cHJlc3Npb25zCisKK0BjaW5kZXggaW50ZWdlciBleHByZXNzaW9ucworQGNpbmRleCBleHByZXNzaW9ucywgaW50ZWdlcgorQW4gQGRmbntpbnRlZ2VyIGV4cHJlc3Npb259IGlzIG9uZSBvciBtb3JlIEBlbXBoe2FyZ3VtZW50c30gZGVsaW1pdGVkCitieSBAZW1waHtvcGVyYXRvcnN9LgorCitAbWVudQorKiBBcmd1bWVudHM6OiAgICAgICAgICAgICAgICAgICBBcmd1bWVudHMKKyogT3BlcmF0b3JzOjogICAgICAgICAgICAgICAgICAgT3BlcmF0b3JzCisqIFByZWZpeCBPcHM6OiAgICAgICAgICAgICAgICAgIFByZWZpeCBPcGVyYXRvcnMKKyogSW5maXggT3BzOjogICAgICAgICAgICAgICAgICAgSW5maXggT3BlcmF0b3JzCitAZW5kIG1lbnUKKworQG5vZGUgQXJndW1lbnRzCitAc3Vic2VjdGlvbiBBcmd1bWVudHMKKworQGNpbmRleCBleHByZXNzaW9uIGFyZ3VtZW50cworQGNpbmRleCBhcmd1bWVudHMgaW4gZXhwcmVzc2lvbnMKK0BjaW5kZXggb3BlcmFuZHMgaW4gZXhwcmVzc2lvbnMKK0BjaW5kZXggYXJpdGhtZXRpYyBvcGVyYW5kcworQGRmbntBcmd1bWVudHN9IGFyZSBzeW1ib2xzLCBudW1iZXJzIG9yIHN1YmV4cHJlc3Npb25zLiAgSW4gb3RoZXIKK2NvbnRleHRzIGFyZ3VtZW50cyBhcmUgc29tZXRpbWVzIGNhbGxlZCBgYGFyaXRobWV0aWMgb3BlcmFuZHMnJy4gIEluCit0aGlzIG1hbnVhbCwgdG8gYXZvaWQgY29uZnVzaW5nIHRoZW0gd2l0aCB0aGUgYGBpbnN0cnVjdGlvbiBvcGVyYW5kcycnIG9mCit0aGUgbWFjaGluZSBsYW5ndWFnZSwgd2UgdXNlIHRoZSB0ZXJtIGBgYXJndW1lbnQnJyB0byByZWZlciB0byBwYXJ0cyBvZgorZXhwcmVzc2lvbnMgb25seSwgcmVzZXJ2aW5nIHRoZSB3b3JkIGBgb3BlcmFuZCcnIHRvIHJlZmVyIG9ubHkgdG8gbWFjaGluZQoraW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCisKK1N5bWJvbHMgYXJlIGV2YWx1YXRlZCB0byB5aWVsZCBAe0B2YXJ7c2VjdGlvbn0gQHZhcntOTk59QH0gd2hlcmUKK0B2YXJ7c2VjdGlvbn0gaXMgb25lIG9mIHRleHQsIGRhdGEsIGJzcywgYWJzb2x1dGUsCitvciB1bmRlZmluZWQuICBAdmFye05OTn0gaXMgYSBzaWduZWQsIDIncyBjb21wbGVtZW50IDMyIGJpdAoraW50ZWdlci4KKworTnVtYmVycyBhcmUgdXN1YWxseSBpbnRlZ2Vycy4KKworQSBudW1iZXIgY2FuIGJlIGEgZmxvbnVtIG9yIGJpZ251bS4gIEluIHRoaXMgY2FzZSwgeW91IGFyZSB3YXJuZWQKK3RoYXQgb25seSB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIHVzZWQsIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBwcmV0ZW5kcwordGhlc2UgMzIgYml0cyBhcmUgYW4gaW50ZWdlci4gIFlvdSBtYXkgd3JpdGUgaW50ZWdlci1tYW5pcHVsYXRpbmcKK2luc3RydWN0aW9ucyB0aGF0IGFjdCBvbiBleG90aWMgY29uc3RhbnRzLCBjb21wYXRpYmxlIHdpdGggb3RoZXIKK2Fzc2VtYmxlcnMuCisKK0BjaW5kZXggc3ViZXhwcmVzc2lvbnMKK1N1YmV4cHJlc3Npb25zIGFyZSBhIGxlZnQgcGFyZW50aGVzaXMgQHNhbXB7KH0gZm9sbG93ZWQgYnkgYW4gaW50ZWdlcgorZXhwcmVzc2lvbiwgZm9sbG93ZWQgYnkgYSByaWdodCBwYXJlbnRoZXNpcyBAc2FtcHspfTsgb3IgYSBwcmVmaXgKK29wZXJhdG9yIGZvbGxvd2VkIGJ5IGFuIGFyZ3VtZW50LgorCitAbm9kZSBPcGVyYXRvcnMKK0BzdWJzZWN0aW9uIE9wZXJhdG9ycworCitAY2luZGV4IG9wZXJhdG9ycywgaW4gZXhwcmVzc2lvbnMKK0BjaW5kZXggYXJpdGhtZXRpYyBmdW5jdGlvbnMKK0BjaW5kZXggZnVuY3Rpb25zLCBpbiBleHByZXNzaW9ucworQGRmbntPcGVyYXRvcnN9IGFyZSBhcml0aG1ldGljIGZ1bmN0aW9ucywgbGlrZSBAY29kZXsrfSBvciBAY29kZXslfS4gIFByZWZpeAorb3BlcmF0b3JzIGFyZSBmb2xsb3dlZCBieSBhbiBhcmd1bWVudC4gIEluZml4IG9wZXJhdG9ycyBhcHBlYXIKK2JldHdlZW4gdGhlaXIgYXJndW1lbnRzLiAgT3BlcmF0b3JzIG1heSBiZSBwcmVjZWRlZCBhbmQvb3IgZm9sbG93ZWQgYnkKK3doaXRlc3BhY2UuCisKK0Bub2RlIFByZWZpeCBPcHMKK0BzdWJzZWN0aW9uIFByZWZpeCBPcGVyYXRvcgorCitAY2luZGV4IHByZWZpeCBvcGVyYXRvcnMKK0Bjb2Rle0B2YWx1ZXtBU319IGhhcyB0aGUgZm9sbG93aW5nIEBkZm57cHJlZml4IG9wZXJhdG9yc30uICBUaGV5IGVhY2ggdGFrZQorb25lIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGFic29sdXRlLgorCitAYyB0aGUgdGV4L2VuZCB0ZXggc3R1ZmYgc3Vycm91bmRpbmcgdGhpcyBzbWFsbCB0YWJsZSBpcyBtZWFudCB0byBtYWtlCitAYyBpdCBhbGlnbiwgb24gdGhlIHByaW50ZWQgcGFnZSwgd2l0aCB0aGUgc2ltaWxhciB0YWJsZSBpbiB0aGUgbmV4dAorQGMgc2VjdGlvbiAod2hpY2ggaXMgaW5zaWRlIGFuIGVudW1lcmF0ZSkuCitAdGV4CitcZ2xvYmFsXGFkdmFuY2VcbGVmdHNraXAgYnkgXGl0ZW1pbmRlbnQKK0BlbmQgdGV4CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLQorQGRmbntOZWdhdGlvbn0uICBUd28ncyBjb21wbGVtZW50IG5lZ2F0aW9uLgorQGl0ZW0gfgorQGRmbntDb21wbGVtZW50YXRpb259LiAgQml0d2lzZSBub3QuCitAZW5kIHRhYmxlCisKK0B0ZXgKK1xnbG9iYWxcYWR2YW5jZVxsZWZ0c2tpcCBieSAtXGl0ZW1pbmRlbnQKK0BlbmQgdGV4CisKK0Bub2RlIEluZml4IE9wcworQHN1YnNlY3Rpb24gSW5maXggT3BlcmF0b3JzCisKK0BjaW5kZXggaW5maXggb3BlcmF0b3JzCitAY2luZGV4IG9wZXJhdG9ycywgcGVybWl0dGVkIGFyZ3VtZW50cworQGRmbntJbmZpeCBvcGVyYXRvcnN9IHRha2UgdHdvIGFyZ3VtZW50cywgb25lIG9uIGVpdGhlciBzaWRlLiAgT3BlcmF0b3JzCitoYXZlIHByZWNlZGVuY2UsIGJ1dCBvcGVyYXRpb25zIHdpdGggZXF1YWwgcHJlY2VkZW5jZSBhcmUgcGVyZm9ybWVkIGxlZnQKK3RvIHJpZ2h0LiAgQXBhcnQgZnJvbSBAY29kZXsrfSBvciBAY29kZXstfSwgYm90aCBhcmd1bWVudHMgbXVzdCBiZQorYWJzb2x1dGUsIGFuZCB0aGUgcmVzdWx0IGlzIGFic29sdXRlLgorCitAZW51bWVyYXRlCitAY2luZGV4IG9wZXJhdG9yIHByZWNlZGVuY2UKK0BjaW5kZXggcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMKKworQGl0ZW0KK0hpZ2hlc3QgUHJlY2VkZW5jZQorCitAdGFibGUgQGNvZGUKK0BpdGVtICoKK0BkZm57TXVsdGlwbGljYXRpb259LgorCitAaXRlbSAvCitAZGZue0RpdmlzaW9ufS4gIFRydW5jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIEMgb3BlcmF0b3IgQHNhbXB7L30KKworQGl0ZW0gJQorQGRmbntSZW1haW5kZXJ9LgorCitAaXRlbSA8CitAaXRlbXggPDwKK0BkZm57U2hpZnQgTGVmdH0uICBTYW1lIGFzIHRoZSBDIG9wZXJhdG9yIEBzYW1wezw8fS4KKworQGl0ZW0gPgorQGl0ZW14ID4+CitAZGZue1NoaWZ0IFJpZ2h0fS4gIFNhbWUgYXMgdGhlIEMgb3BlcmF0b3IgQHNhbXB7Pj59LgorQGVuZCB0YWJsZQorCitAaXRlbQorSW50ZXJtZWRpYXRlIHByZWNlZGVuY2UKKworQHRhYmxlIEBjb2RlCitAaXRlbSB8CisKK0BkZm57Qml0d2lzZSBJbmNsdXNpdmUgT3J9LgorCitAaXRlbSAmCitAZGZue0JpdHdpc2UgQW5kfS4KKworQGl0ZW0gXgorQGRmbntCaXR3aXNlIEV4Y2x1c2l2ZSBPcn0uCisKK0BpdGVtICEKK0BkZm57Qml0d2lzZSBPciBOb3R9LgorQGVuZCB0YWJsZQorCitAaXRlbQorTG93ZXN0IFByZWNlZGVuY2UKKworQHRhYmxlIEBjb2RlCitAY2luZGV4IGFkZGl0aW9uLCBwZXJtaXR0ZWQgYXJndW1lbnRzCitAY2luZGV4IHBsdXMsIHBlcm1pdHRlZCBhcmd1bWVudHMKK0BjaW5kZXggYXJndW1lbnRzIGZvciBhZGRpdGlvbgorQGl0ZW0gKworQGRmbntBZGRpdGlvbn0uICBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaGFzIHRoZSBzZWN0aW9uIG9mCit0aGUgb3RoZXIgYXJndW1lbnQuICBZb3UgbWF5IG5vdCBhZGQgdG9nZXRoZXIgYXJndW1lbnRzIGZyb20gZGlmZmVyZW50CitzZWN0aW9ucy4KKworQGNpbmRleCBzdWJ0cmFjdGlvbiwgcGVybWl0dGVkIGFyZ3VtZW50cworQGNpbmRleCBtaW51cywgcGVybWl0dGVkIGFyZ3VtZW50cworQGNpbmRleCBhcmd1bWVudHMgZm9yIHN1YnRyYWN0aW9uCitAaXRlbSAtCitAZGZue1N1YnRyYWN0aW9ufS4gIElmIHRoZSByaWdodCBhcmd1bWVudCBpcyBhYnNvbHV0ZSwgdGhlCityZXN1bHQgaGFzIHRoZSBzZWN0aW9uIG9mIHRoZSBsZWZ0IGFyZ3VtZW50LgorSWYgYm90aCBhcmd1bWVudHMgYXJlIGluIHRoZSBzYW1lIHNlY3Rpb24sIHRoZSByZXN1bHQgaXMgYWJzb2x1dGUuCitZb3UgbWF5IG5vdCBzdWJ0cmFjdCBhcmd1bWVudHMgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMuCitAYyBGSVhNRSBpcyB0aGVyZSBzdGlsbCBzb21ldGhpbmcgdXNlZnVsIHRvIHNheSBhYm91dCB1bmRlZmluZWQgLSB1bmRlZmluZWQgPworQGVuZCB0YWJsZQorQGVuZCBlbnVtZXJhdGUKKworSW4gc2hvcnQsIGl0J3Mgb25seSBtZWFuaW5nZnVsIHRvIGFkZCBvciBzdWJ0cmFjdCB0aGUgQGVtcGh7b2Zmc2V0c30gaW4gYW4KK2FkZHJlc3M7IHlvdSBjYW4gb25seSBoYXZlIGEgZGVmaW5lZCBzZWN0aW9uIGluIG9uZSBvZiB0aGUgdHdvIGFyZ3VtZW50cy4KKworQG5vZGUgUHNldWRvIE9wcworQGNoYXB0ZXIgQXNzZW1ibGVyIERpcmVjdGl2ZXMKKworQGNpbmRleCBkaXJlY3RpdmVzLCBtYWNoaW5lIGluZGVwZW5kZW50CitAY2luZGV4IHBzZXVkby1vcHMsIG1hY2hpbmUgaW5kZXBlbmRlbnQKK0BjaW5kZXggbWFjaGluZSBpbmRlcGVuZGVudCBkaXJlY3RpdmVzCitBbGwgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgaGF2ZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBwZXJpb2QgKEBzYW1wey59KS4KK1RoZSByZXN0IG9mIHRoZSBuYW1lIGlzIGxldHRlcnMsIHVzdWFsbHkgaW4gbG93ZXIgY2FzZS4KKworVGhpcyBjaGFwdGVyIGRpc2N1c3NlcyBkaXJlY3RpdmVzIHRoYXQgYXJlIGF2YWlsYWJsZSByZWdhcmRsZXNzIG9mIHRoZQordGFyZ2V0IG1hY2hpbmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIEBzY3tnbnV9IGFzc2VtYmxlci4KK0BpZnNldCBHRU5FUklDCitTb21lIG1hY2hpbmUgY29uZmlndXJhdGlvbnMgcHJvdmlkZSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMuCitAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAaWZzZXQgbWFjaGluZS1kaXJlY3RpdmVzCitAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30gZm9yIGFkZGl0aW9uYWwgZGlyZWN0aXZlcy4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitAbWVudQorKiBBYm9ydDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYWJvcnR9CitAaWZzZXQgQ09GRgorKiBBQk9SVDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuQUJPUlR9CitAZW5kIGlmc2V0CisKKyogQWxpZ246OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19CisqIEFzY2lpOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hc2NpaSAiQHZhcntzdHJpbmd9In1AZG90c3t9CisqIEFzY2l6OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hc2NpeiAiQHZhcntzdHJpbmd9In1AZG90c3t9CisqIEJhbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5iYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KKyogQnl0ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmJ5dGUgQHZhcntleHByZXNzaW9uc319CisqIENvbW06OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5jb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofSB9CisqIERhdGE6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kYXRhIEB2YXJ7c3Vic2VjdGlvbn19CitAaWZzZXQgQ09GRgorKiBEZWY6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGVmIEB2YXJ7bmFtZX19CitAZW5kIGlmc2V0CitAaWZzZXQgYW91dC1ib3V0CisqIERlc2M6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kZXNjIEB2YXJ7c3ltYm9sfSwgQHZhcnthYnMtZXhwcmVzc2lvbn19CitAZW5kIGlmc2V0CitAaWZzZXQgQ09GRgorKiBEaW06OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZGltfQorQGVuZCBpZnNldAorCisqIERvdWJsZTo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kb3VibGUgQHZhcntmbG9udW1zfX0KKyogRWplY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVqZWN0fQorKiBFbHNlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZWxzZX0KKyogRW5kOjoJCQkJQGNvZGV7LmVuZH0KK0BpZnNldCBDT0ZGCisqIEVuZGVmOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRlZn0KK0BlbmQgaWZzZXQKKworKiBFbmRmdW5jOjogICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kZnVuY30KKyogRW5kaWY6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGlmfQorKiBFcXU6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXF1IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KKyogRXF1aXY6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVxdWl2IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KKyogRXJyOjoJCQkJQGNvZGV7LmVycn0KKyogRXhpdG06OgkJCUBjb2Rley5leGl0bX0KKyogRXh0ZXJuOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmV4dGVybn0KKyogRmFpbDo6CQkJQGNvZGV7LmZhaWx9CitAaWZjbGVhciBuby1maWxlLWRpcgorKiBGaWxlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZmlsZSBAdmFye3N0cmluZ319CitAZW5kIGlmY2xlYXIKKworKiBGaWxsOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZmlsbCBAdmFye3JlcGVhdH0gLCBAdmFye3NpemV9ICwgQHZhcnt2YWx1ZX19CisqIEZsb2F0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5mbG9hdCBAdmFye2Zsb251bXN9fQorKiBGdW5jOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZnVuY30gIAorKiBHbG9iYWw6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZ2xvYmFsIEB2YXJ7c3ltYm9sfX0sIEBjb2Rley5nbG9ibCBAdmFye3N5bWJvbH19CisqIGh3b3JkOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5od29yZCBAdmFye2V4cHJlc3Npb25zfX0KKyogSWRlbnQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmlkZW50fQorKiBJZjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaWYgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufX0KKyogSW5jbHVkZTo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmluY2x1ZGUgIkB2YXJ7ZmlsZX0ifQorKiBJbnQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaW50IEB2YXJ7ZXhwcmVzc2lvbnN9fQorKiBJcnA6OgkJCQlAY29kZXsuaXJwIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQorKiBJcnBjOjoJCQlAY29kZXsuaXJwYyBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KKyogTGNvbW06OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmxjb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofX0KKyogTGZsYWdzOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxmbGFnc30KK0BpZmNsZWFyIG5vLWxpbmUtZGlyCisqIExpbmU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5saW5lIEB2YXJ7bGluZS1udW1iZXJ9fQorQGVuZCBpZmNsZWFyCisKKyogTG46OiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxuIEB2YXJ7bGluZS1udW1iZXJ9fQorKiBMaW5rb25jZTo6CQkJQGNvZGV7LmxpbmtvbmNlIFtAdmFye3R5cGV9XX0KKyogTGlzdDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmxpc3R9CisqIExvbmc6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sb25nIEB2YXJ7ZXhwcmVzc2lvbnN9fQorQGlnbm9yZQorKiBMc3ltOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubHN5bSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19CitAZW5kIGlnbm9yZQorCisqIE1hY3JvOjoJCQlAY29kZXsubWFjcm8gQHZhcntuYW1lfSBAdmFye2FyZ3N9fUBkb3Rze30KKyogTVJJOjoJCQkJQGNvZGV7Lm1yaSBAdmFye3ZhbH19CisKKyogTm9saXN0OjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lm5vbGlzdH0KKyogT2N0YTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lm9jdGEgQHZhcntiaWdudW1zfX0KKyogT3JnOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lm9yZyBAdmFye25ldy1sY30gLCBAdmFye2ZpbGx9fQorKiBQMmFsaWduOjogICAgICAgICAgICAgICAgICAgICBAY29kZXsucDJhbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQorKiBQcmludDo6CQkJQGNvZGV7LnByaW50IEB2YXJ7c3RyaW5nfX0KKyogUHNpemU6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnBzaXplIEB2YXJ7bGluZXN9LCBAdmFye2NvbHVtbnN9fQorKiBQdXJnZW06OgkJCUBjb2Rley5wdXJnZW0gQHZhcntuYW1lfX0KKyogUXVhZDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnF1YWQgQHZhcntiaWdudW1zfX0KKyogUmVwdDo6CQkJQGNvZGV7LnJlcHQgQHZhcntjb3VudH19CisqIFNidHRsOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zYnR0bCAiQHZhcntzdWJoZWFkaW5nfSJ9CitAaWZzZXQgQ09GRgorKiBTY2w6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2NsIEB2YXJ7Y2xhc3N9fQorKiBTZWN0aW9uOjogICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2VjdGlvbiBAdmFye25hbWV9LCBAdmFye3N1YnNlY3Rpb259fQorQGVuZCBpZnNldAorCisqIFNldDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zZXQgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQorKiBTaG9ydDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc2hvcnQgQHZhcntleHByZXNzaW9uc319CisqIFNpbmdsZTo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zaW5nbGUgQHZhcntmbG9udW1zfX0KK0BpZnNldCBDT0ZGCisqIFNpemU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zaXplfQorQGVuZCBpZnNldAorCisqIFNraXA6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5za2lwIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9fQorKiBTbGViMTI4OjoJCQlAY29kZXsuc2xlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KKyogU3BhY2U6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNwYWNlIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9fQorQGlmc2V0IGhhdmUtc3RhYnMKKyogU3RhYjo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnN0YWJkLCAuc3RhYm4sIC5zdGFic30KK0BlbmQgaWZzZXQKKworKiBTdHJpbmc6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3RyaW5nICJAdmFye3N0cn0ifQorKiBTdHJ1Y3Q6OgkJCUBjb2Rley5zdHJ1Y3QgQHZhcntleHByZXNzaW9ufX0KK0BpZnNldCBFTEYKKyogU3ltdmVyOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnN5bXZlciBAdmFye25hbWV9LEB2YXJ7bmFtZTJAQG5vZGVuYW1lfX0KK0BlbmQgaWZzZXQKK0BpZnNldCBDT0ZGCisqIFRhZzo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50YWcgQHZhcntzdHJ1Y3RuYW1lfX0KK0BlbmQgaWZzZXQKKworKiBUZXh0OjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudGV4dCBAdmFye3N1YnNlY3Rpb259fQorKiBUaXRsZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudGl0bGUgIkB2YXJ7aGVhZGluZ30ifQorQGlmc2V0IENPRkYKKyogVHlwZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnR5cGUgQHZhcntpbnR9fQorKiBWYWw6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudmFsIEB2YXJ7YWRkcn19CitAZW5kIGlmc2V0CisKKyogVWxlYjEyODo6ICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnVsZWIxMjggQHZhcntleHByZXNzaW9uc319CisqIFdvcmQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley53b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQorKiBEZXByZWNhdGVkOjogICAgICAgICAgICAgICAgICBEZXByZWNhdGVkIERpcmVjdGl2ZXMKK0BlbmQgbWVudQorCitAbm9kZSBBYm9ydAorQHNlY3Rpb24gQGNvZGV7LmFib3J0fQorCitAY2luZGV4IEBjb2Rle2Fib3J0fSBkaXJlY3RpdmUKK0BjaW5kZXggc3RvcHBpbmcgdGhlIGFzc2VtYmx5CitUaGlzIGRpcmVjdGl2ZSBzdG9wcyB0aGUgYXNzZW1ibHkgaW1tZWRpYXRlbHkuICBJdCBpcyBmb3IKK2NvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBhc3NlbWJsZXJzLiAgVGhlIG9yaWdpbmFsIGlkZWEgd2FzIHRoYXQgdGhlCithc3NlbWJseSBsYW5ndWFnZSBzb3VyY2Ugd291bGQgYmUgcGlwZWQgaW50byB0aGUgYXNzZW1ibGVyLiAgSWYgdGhlIHNlbmRlcgorb2YgdGhlIHNvdXJjZSBxdWl0LCBpdCBjb3VsZCB1c2UgdGhpcyBkaXJlY3RpdmUgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8KK3F1aXQgYWxzby4gIE9uZSBkYXkgQGNvZGV7LmFib3J0fSB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQuCisKK0BpZnNldCBDT0ZGCitAbm9kZSBBQk9SVAorQHNlY3Rpb24gQGNvZGV7LkFCT1JUfQorCitAY2luZGV4IEBjb2Rle0FCT1JUfSBkaXJlY3RpdmUKK1doZW4gcHJvZHVjaW5nIENPRkYgb3V0cHV0LCBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGFzIGEKK3N5bm9ueW0gZm9yIEBzYW1wey5hYm9ydH0uCisKK0BpZnNldCBCT1VUCitXaGVuIHByb2R1Y2luZyBAY29kZXtiLm91dH0gb3V0cHV0LCBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlLAorYnV0IGlnbm9yZXMgaXQuCitAZW5kIGlmc2V0CitAZW5kIGlmc2V0CisKK0Bub2RlIEFsaWduCitAc2VjdGlvbiBAY29kZXsuYWxpZ24gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KKworQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyCitAY2luZGV4IEBjb2Rle2FsaWdufSBkaXJlY3RpdmUKK1BhZCB0aGUgbG9jYXRpb24gY291bnRlciAoaW4gdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgdG8gYSBwYXJ0aWN1bGFyIHN0b3JhZ2UKK2JvdW5kYXJ5LiAgVGhlIGZpcnN0IGV4cHJlc3Npb24gKHdoaWNoIG11c3QgYmUgYWJzb2x1dGUpIGlzIHRoZSBhbGlnbm1lbnQKK3JlcXVpcmVkLCBhcyBkZXNjcmliZWQgYmVsb3cuCisKK1RoZSBzZWNvbmQgZXhwcmVzc2lvbiAoYWxzbyBhYnNvbHV0ZSkgZ2l2ZXMgdGhlIGZpbGwgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQorcGFkZGluZyBieXRlcy4gIEl0IChhbmQgdGhlIGNvbW1hKSBtYXkgYmUgb21pdHRlZC4gIElmIGl0IGlzIG9taXR0ZWQsIHRoZQorcGFkZGluZyBieXRlcyBhcmUgbm9ybWFsbHkgemVyby4gIEhvd2V2ZXIsIG9uIHNvbWUgc3lzdGVtcywgaWYgdGhlIHNlY3Rpb24gaXMKK21hcmtlZCBhcyBjb250YWluaW5nIGNvZGUgYW5kIHRoZSBmaWxsIHZhbHVlIGlzIG9taXR0ZWQsIHRoZSBzcGFjZSBpcyBmaWxsZWQKK3dpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zLgorCitUaGUgdGhpcmQgZXhwcmVzc2lvbiBpcyBhbHNvIGFic29sdXRlLCBhbmQgaXMgYWxzbyBvcHRpb25hbC4gIElmIGl0IGlzIHByZXNlbnQsCitpdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBieSB0aGlzIGFsaWdubWVudAorZGlyZWN0aXZlLiAgSWYgZG9pbmcgdGhlIGFsaWdubWVudCB3b3VsZCByZXF1aXJlIHNraXBwaW5nIG1vcmUgYnl0ZXMgdGhhbiB0aGUKK3NwZWNpZmllZCBtYXhpbXVtLCB0aGVuIHRoZSBhbGlnbm1lbnQgaXMgbm90IGRvbmUgYXQgYWxsLiAgWW91IGNhbiBvbWl0IHRoZQorZmlsbCB2YWx1ZSAodGhlIHNlY29uZCBhcmd1bWVudCkgZW50aXJlbHkgYnkgc2ltcGx5IHVzaW5nIHR3byBjb21tYXMgYWZ0ZXIgdGhlCityZXF1aXJlZCBhbGlnbm1lbnQ7IHRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgYWxpZ25tZW50IHRvIGJlIGZpbGxlZAord2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS4KKworVGhlIHdheSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IGlzIHNwZWNpZmllZCB2YXJpZXMgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLgorRm9yIHRoZSBhMjlrLCBocHBhLCBtNjhrLCBtODhrLCB3NjUsIHNwYXJjLCBhbmQgSGl0YWNoaSBTSCwgYW5kIGkzODYgdXNpbmcgRUxGCitmb3JtYXQsCit0aGUgZmlyc3QgZXhwcmVzc2lvbiBpcyB0aGUKK2FsaWdubWVudCByZXF1ZXN0IGluIGJ5dGVzLiAgRm9yIGV4YW1wbGUgQHNhbXB7LmFsaWduIDh9IGFkdmFuY2VzCit0aGUgbG9jYXRpb24gY291bnRlciB1bnRpbCBpdCBpcyBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlcgoraXMgYWxyZWFkeSBhIG11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCisKK0ZvciBvdGhlciBzeXN0ZW1zLCBpbmNsdWRpbmcgdGhlIGkzODYgdXNpbmcgYS5vdXQgZm9ybWF0LCBpdCBpcyB0aGUKK251bWJlciBvZiBsb3ctb3JkZXIgemVybyBiaXRzIHRoZSBsb2NhdGlvbiBjb3VudGVyIG11c3QgaGF2ZSBhZnRlcgorYWR2YW5jZW1lbnQuICBGb3IgZXhhbXBsZSBAc2FtcHsuYWxpZ24gM30gYWR2YW5jZXMgdGhlIGxvY2F0aW9uCitjb3VudGVyIHVudGlsIGl0IGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIGFscmVhZHkgYQorbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KKworVGhpcyBpbmNvbnNpc3RlbmN5IGlzIGR1ZSB0byB0aGUgZGlmZmVyZW50IGJlaGF2aW9ycyBvZiB0aGUgdmFyaW91cworbmF0aXZlIGFzc2VtYmxlcnMgZm9yIHRoZXNlIHN5c3RlbXMgd2hpY2ggR0FTIG11c3QgZW11bGF0ZS4KK0dBUyBhbHNvIHByb3ZpZGVzIEBjb2Rley5iYWxpZ259IGFuZCBAY29kZXsucDJhbGlnbn0gZGlyZWN0aXZlcywKK2Rlc2NyaWJlZCBsYXRlciwgd2hpY2ggaGF2ZSBhIGNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGFsbAorYXJjaGl0ZWN0dXJlcyAoYnV0IGFyZSBzcGVjaWZpYyB0byBHQVMpLgorCitAbm9kZSBBc2NpaQorQHNlY3Rpb24gQGNvZGV7LmFzY2lpICJAdmFye3N0cmluZ30ifUBkb3Rze30KKworQGNpbmRleCBAY29kZXthc2NpaX0gZGlyZWN0aXZlCitAY2luZGV4IHN0cmluZyBsaXRlcmFscworQGNvZGV7LmFzY2lpfSBleHBlY3RzIHplcm8gb3IgbW9yZSBzdHJpbmcgbGl0ZXJhbHMgKEBweHJlZntTdHJpbmdzfSkKK3NlcGFyYXRlZCBieSBjb21tYXMuICBJdCBhc3NlbWJsZXMgZWFjaCBzdHJpbmcgKHdpdGggbm8gYXV0b21hdGljCit0cmFpbGluZyB6ZXJvIGJ5dGUpIGludG8gY29uc2VjdXRpdmUgYWRkcmVzc2VzLgorCitAbm9kZSBBc2NpegorQHNlY3Rpb24gQGNvZGV7LmFzY2l6ICJAdmFye3N0cmluZ30ifUBkb3Rze30KKworQGNpbmRleCBAY29kZXthc2Npen0gZGlyZWN0aXZlCitAY2luZGV4IHplcm8tdGVybWluYXRlZCBzdHJpbmdzCitAY2luZGV4IG51bGwtdGVybWluYXRlZCBzdHJpbmdzCitAY29kZXsuYXNjaXp9IGlzIGp1c3QgbGlrZSBAY29kZXsuYXNjaWl9LCBidXQgZWFjaCBzdHJpbmcgaXMgZm9sbG93ZWQgYnkKK2EgemVybyBieXRlLiAgVGhlIGBgeicnIGluIEBzYW1wey5hc2Npen0gc3RhbmRzIGZvciBgYHplcm8nJy4KKworQG5vZGUgQmFsaWduCitAc2VjdGlvbiBAY29kZXsuYmFsaWduW3dsXSBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9fQorCitAY2luZGV4IHBhZGRpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzCitAY2luZGV4IEBjb2Rle2JhbGlnbn0gZGlyZWN0aXZlCitQYWQgdGhlIGxvY2F0aW9uIGNvdW50ZXIgKGluIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIHRvIGEgcGFydGljdWxhcgorc3RvcmFnZSBib3VuZGFyeS4gIFRoZSBmaXJzdCBleHByZXNzaW9uICh3aGljaCBtdXN0IGJlIGFic29sdXRlKSBpcyB0aGUKK2FsaWdubWVudCByZXF1ZXN0IGluIGJ5dGVzLiAgRm9yIGV4YW1wbGUgQHNhbXB7LmJhbGlnbiA4fSBhZHZhbmNlcwordGhlIGxvY2F0aW9uIGNvdW50ZXIgdW50aWwgaXQgaXMgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIKK2lzIGFscmVhZHkgYSBtdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgorCitUaGUgc2Vjb25kIGV4cHJlc3Npb24gKGFsc28gYWJzb2x1dGUpIGdpdmVzIHRoZSBmaWxsIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiB0aGUKK3BhZGRpbmcgYnl0ZXMuICBJdCAoYW5kIHRoZSBjb21tYSkgbWF5IGJlIG9taXR0ZWQuICBJZiBpdCBpcyBvbWl0dGVkLCB0aGUKK3BhZGRpbmcgYnl0ZXMgYXJlIG5vcm1hbGx5IHplcm8uICBIb3dldmVyLCBvbiBzb21lIHN5c3RlbXMsIGlmIHRoZSBzZWN0aW9uIGlzCittYXJrZWQgYXMgY29udGFpbmluZyBjb2RlIGFuZCB0aGUgZmlsbCB2YWx1ZSBpcyBvbWl0dGVkLCB0aGUgc3BhY2UgaXMgZmlsbGVkCit3aXRoIG5vLW9wIGluc3RydWN0aW9ucy4KKworVGhlIHRoaXJkIGV4cHJlc3Npb24gaXMgYWxzbyBhYnNvbHV0ZSwgYW5kIGlzIGFsc28gb3B0aW9uYWwuICBJZiBpdCBpcyBwcmVzZW50LAoraXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgYnkgdGhpcyBhbGlnbm1lbnQKK2RpcmVjdGl2ZS4gIElmIGRvaW5nIHRoZSBhbGlnbm1lbnQgd291bGQgcmVxdWlyZSBza2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gdGhlCitzcGVjaWZpZWQgbWF4aW11bSwgdGhlbiB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4gIFlvdSBjYW4gb21pdCB0aGUKK2ZpbGwgdmFsdWUgKHRoZSBzZWNvbmQgYXJndW1lbnQpIGVudGlyZWx5IGJ5IHNpbXBseSB1c2luZyB0d28gY29tbWFzIGFmdGVyIHRoZQorcmVxdWlyZWQgYWxpZ25tZW50OyB0aGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdGhlIGFsaWdubWVudCB0byBiZSBmaWxsZWQKK3dpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zIHdoZW4gYXBwcm9wcmlhdGUuCisKK0BjaW5kZXggQGNvZGV7YmFsaWdud30gZGlyZWN0aXZlCitAY2luZGV4IEBjb2Rle2JhbGlnbmx9IGRpcmVjdGl2ZQorVGhlIEBjb2Rley5iYWxpZ253fSBhbmQgQGNvZGV7LmJhbGlnbmx9IGRpcmVjdGl2ZXMgYXJlIHZhcmlhbnRzIG9mIHRoZQorQGNvZGV7LmJhbGlnbn0gZGlyZWN0aXZlLiAgVGhlIEBjb2Rley5iYWxpZ253fSBkaXJlY3RpdmUgdHJlYXRzIHRoZSBmaWxsCitwYXR0ZXJuIGFzIGEgdHdvIGJ5dGUgd29yZCB2YWx1ZS4gIFRoZSBAY29kZXsuYmFsaWdubH0gZGlyZWN0aXZlcyB0cmVhdHMgdGhlCitmaWxsIHBhdHRlcm4gYXMgYSBmb3VyIGJ5dGUgbG9uZ3dvcmQgdmFsdWUuICBGb3IgZXhhbXBsZSwgQGNvZGV7LmJhbGlnbncKKzQsMHgzNjhkfSB3aWxsIGFsaWduIHRvIGEgbXVsdGlwbGUgb2YgNC4gIElmIGl0IHNraXBzIHR3byBieXRlcywgdGhleSB3aWxsIGJlCitmaWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgMHgzNjhkICh0aGUgZXhhY3QgcGxhY2VtZW50IG9mIHRoZSBieXRlcyBkZXBlbmRzIHVwb24KK3RoZSBlbmRpYW5uZXNzIG9mIHRoZSBwcm9jZXNzb3IpLiAgSWYgaXQgc2tpcHMgMSBvciAzIGJ5dGVzLCB0aGUgZmlsbCB2YWx1ZSBpcwordW5kZWZpbmVkLgorCitAbm9kZSBCeXRlCitAc2VjdGlvbiBAY29kZXsuYnl0ZSBAdmFye2V4cHJlc3Npb25zfX0KKworQGNpbmRleCBAY29kZXtieXRlfSBkaXJlY3RpdmUKK0BjaW5kZXggaW50ZWdlcnMsIG9uZSBieXRlCitAY29kZXsuYnl0ZX0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZXhwcmVzc2lvbnMsIHNlcGFyYXRlZCBieSBjb21tYXMuCitFYWNoIGV4cHJlc3Npb24gaXMgYXNzZW1ibGVkIGludG8gdGhlIG5leHQgYnl0ZS4KKworQG5vZGUgQ29tbQorQHNlY3Rpb24gQGNvZGV7LmNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9IH0KKworQGNpbmRleCBAY29kZXtjb21tfSBkaXJlY3RpdmUKK0BjaW5kZXggc3ltYm9sLCBjb21tb24KK0Bjb2Rley5jb21tfSBkZWNsYXJlcyBhIGNvbW1vbiBzeW1ib2wgbmFtZWQgQHZhcntzeW1ib2x9LiAgV2hlbiBsaW5raW5nLCBhCitjb21tb24gc3ltYm9sIGluIG9uZSBvYmplY3QgZmlsZSBtYXkgYmUgbWVyZ2VkIHdpdGggYSBkZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wKK29mIHRoZSBzYW1lIG5hbWUgaW4gYW5vdGhlciBvYmplY3QgZmlsZS4gIElmIEBjb2Rle0B2YWx1ZXtMRH19IGRvZXMgbm90IHNlZSBhCitkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sLS1qdXN0IG9uZSBvciBtb3JlIGNvbW1vbiBzeW1ib2xzLS10aGVuIGl0IHdpbGwKK2FsbG9jYXRlIEB2YXJ7bGVuZ3RofSBieXRlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gIEB2YXJ7bGVuZ3RofSBtdXN0IGJlIGFuCithYnNvbHV0ZSBleHByZXNzaW9uLiAgSWYgQGNvZGV7QHZhbHVle0xEfX0gc2VlcyBtdWx0aXBsZSBjb21tb24gc3ltYm9scyB3aXRoCit0aGUgc2FtZSBuYW1lLCBhbmQgdGhleSBkbyBub3QgYWxsIGhhdmUgdGhlIHNhbWUgc2l6ZSwgaXQgd2lsbCBhbGxvY2F0ZSBzcGFjZQordXNpbmcgdGhlIGxhcmdlc3Qgc2l6ZS4KKworQGlmc2V0IEVMRgorV2hlbiB1c2luZyBFTEYsIHRoZSBAY29kZXsuY29tbX0gZGlyZWN0aXZlIHRha2VzIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LgorVGhpcyBpcyB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbCwgc3BlY2lmaWVkIGFzIGEgYnl0ZSBib3VuZGFyeSAoZm9yCitleGFtcGxlLCBhbiBhbGlnbm1lbnQgb2YgMTYgbWVhbnMgdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNCBiaXRzIG9mIHRoZQorYWRkcmVzcyBzaG91bGQgYmUgemVybykuICBUaGUgYWxpZ25tZW50IG11c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiwgYW5kIGl0CittdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiAgSWYgQGNvZGV7QHZhbHVle0xEfX0gYWxsb2NhdGVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5Citmb3IgdGhlIGNvbW1vbiBzeW1ib2wsIGl0IHdpbGwgdXNlIHRoZSBhbGlnbm1lbnQgd2hlbiBwbGFjaW5nIHRoZSBzeW1ib2wuICBJZgorbm8gYWxpZ25tZW50IGlzIHNwZWNpZmllZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBzZXQgdGhlIGFsaWdubWVudCB0byB0aGUKK2xhcmdlc3QgcG93ZXIgb2YgdHdvIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sLCB1cCB0byBhCittYXhpbXVtIG9mIDE2LgorQGVuZCBpZnNldAorCitAaWZzZXQgSFBQQQorVGhlIHN5bnRheCBmb3IgQGNvZGV7LmNvbW19IGRpZmZlcnMgc2xpZ2h0bHkgb24gdGhlIEhQUEEuICBUaGUgc3ludGF4IGlzCitAc2FtcHtAdmFye3N5bWJvbH0gLmNvbW0sIEB2YXJ7bGVuZ3RofX07IEB2YXJ7c3ltYm9sfSBpcyBvcHRpb25hbC4KK0BlbmQgaWZzZXQKKworQG5vZGUgRGF0YQorQHNlY3Rpb24gQGNvZGV7LmRhdGEgQHZhcntzdWJzZWN0aW9ufX0KKworQGNpbmRleCBAY29kZXtkYXRhfSBkaXJlY3RpdmUKK0Bjb2Rley5kYXRhfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBhc3NlbWJsZSB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgb250byB0aGUKK2VuZCBvZiB0aGUgZGF0YSBzdWJzZWN0aW9uIG51bWJlcmVkIEB2YXJ7c3Vic2VjdGlvbn0gKHdoaWNoIGlzIGFuCithYnNvbHV0ZSBleHByZXNzaW9uKS4gIElmIEB2YXJ7c3Vic2VjdGlvbn0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMKK3RvIHplcm8uCisKK0BpZnNldCBDT0ZGCitAbm9kZSBEZWYKK0BzZWN0aW9uIEBjb2Rley5kZWYgQHZhcntuYW1lfX0KKworQGNpbmRleCBAY29kZXtkZWZ9IGRpcmVjdGl2ZQorQGNpbmRleCBDT0ZGIHN5bWJvbHMsIGRlYnVnZ2luZworQGNpbmRleCBkZWJ1Z2dpbmcgQ09GRiBzeW1ib2xzCitCZWdpbiBkZWZpbmluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sIEB2YXJ7bmFtZX07IHRoZQorZGVmaW5pdGlvbiBleHRlbmRzIHVudGlsIHRoZSBAY29kZXsuZW5kZWZ9IGRpcmVjdGl2ZSBpcyBlbmNvdW50ZXJlZC4KK0BpZnNldCBCT1VUCisKK1RoaXMgZGlyZWN0aXZlIGlzIG9ubHkgb2JzZXJ2ZWQgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBDT0ZGCitmb3JtYXQgb3V0cHV0OyB3aGVuIHByb2R1Y2luZyBAY29kZXtiLm91dH0sIEBzYW1wey5kZWZ9IGlzIHJlY29nbml6ZWQsCitidXQgaWdub3JlZC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQGlmc2V0IGFvdXQtYm91dAorQG5vZGUgRGVzYworQHNlY3Rpb24gQGNvZGV7LmRlc2MgQHZhcntzeW1ib2x9LCBAdmFye2Ficy1leHByZXNzaW9ufX0KKworQGNpbmRleCBAY29kZXtkZXNjfSBkaXJlY3RpdmUKK0BjaW5kZXggQ09GRiBzeW1ib2wgZGVzY3JpcHRvcgorQGNpbmRleCBzeW1ib2wgZGVzY3JpcHRvciwgQ09GRgorVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgc3ltYm9sIChAcHhyZWZ7U3ltYm9sIEF0dHJpYnV0ZXN9KQordG8gdGhlIGxvdyAxNiBiaXRzIG9mIGFuIGFic29sdXRlIGV4cHJlc3Npb24uCisKK0BpZnNldCBDT0ZGCitUaGUgQHNhbXB7LmRlc2N9IGRpcmVjdGl2ZSBpcyBub3QgYXZhaWxhYmxlIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMKK2NvbmZpZ3VyZWQgZm9yIENPRkYgb3V0cHV0OyBpdCBpcyBvbmx5IGZvciBAY29kZXthLm91dH0gb3IgQGNvZGV7Yi5vdXR9CitvYmplY3QgZm9ybWF0LiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhdGliaWxpdHksIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMKK2l0LCBidXQgcHJvZHVjZXMgbm8gb3V0cHV0LCB3aGVuIGNvbmZpZ3VyZWQgZm9yIENPRkYuCitAZW5kIGlmc2V0CitAZW5kIGlmc2V0CisKK0BpZnNldCBDT0ZGCitAbm9kZSBEaW0KK0BzZWN0aW9uIEBjb2Rley5kaW19CisKK0BjaW5kZXggQGNvZGV7ZGltfSBkaXJlY3RpdmUKK0BjaW5kZXggQ09GRiBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uCitAY2luZGV4IGF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24sIENPRkYKK1RoaXMgZGlyZWN0aXZlIGlzIGdlbmVyYXRlZCBieSBjb21waWxlcnMgdG8gaW5jbHVkZSBhdXhpbGlhcnkgZGVidWdnaW5nCitpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgaXMgb25seSBwZXJtaXR0ZWQgaW5zaWRlCitAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLgorQGlmc2V0IEJPVVQKKworQHNhbXB7LmRpbX0gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KK0Bjb2Rle0B2YWx1ZXtBU319IGlzIGdlbmVyYXRpbmcgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dAoraWdub3JlcyBpdC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQG5vZGUgRG91YmxlCitAc2VjdGlvbiBAY29kZXsuZG91YmxlIEB2YXJ7ZmxvbnVtc319CisKK0BjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoZG91YmxlKQorQGNvZGV7LmRvdWJsZX0gZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0Cithc3NlbWJsZXMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KK0BpZnNldCBHRU5FUklDCitUaGUgZXhhY3Qga2luZCBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGVtaXR0ZWQgZGVwZW5kcyBvbiBob3cKK0Bjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQuICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAaWZzZXQgSUVFRUZMT0FUCitPbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5IEBzYW1wey5kb3VibGV9IGVtaXRzIDY0LWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXJzCitpbiBAc2N7aWVlZX0gZm9ybWF0LgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCisKK0Bub2RlIEVqZWN0CitAc2VjdGlvbiBAY29kZXsuZWplY3R9CisKK0BjaW5kZXggQGNvZGV7ZWplY3R9IGRpcmVjdGl2ZQorQGNpbmRleCBuZXcgcGFnZSwgaW4gbGlzdGluZ3MKK0BjaW5kZXggcGFnZSwgaW4gbGlzdGluZ3MKK0BjaW5kZXggbGlzdGluZyBjb250cm9sOiBuZXcgcGFnZQorRm9yY2UgYSBwYWdlIGJyZWFrIGF0IHRoaXMgcG9pbnQsIHdoZW4gZ2VuZXJhdGluZyBhc3NlbWJseSBsaXN0aW5ncy4KKworQG5vZGUgRWxzZQorQHNlY3Rpb24gQGNvZGV7LmVsc2V9CisKK0BjaW5kZXggQGNvZGV7ZWxzZX0gZGlyZWN0aXZlCitAY29kZXsuZWxzZX0gaXMgcGFydCBvZiB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCBmb3IgY29uZGl0aW9uYWwKK2Fzc2VtYmx5OyBAcHhyZWZ7SWYsLEBjb2Rley5pZn19LiAgSXQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiBhIHNlY3Rpb24KK29mIGNvZGUgdG8gYmUgYXNzZW1ibGVkIGlmIHRoZSBjb25kaXRpb24gZm9yIHRoZSBwcmVjZWRpbmcgQGNvZGV7LmlmfQord2FzIGZhbHNlLgorCitAbm9kZSBFbmQKK0BzZWN0aW9uIEBjb2Rley5lbmR9CisKK0BjaW5kZXggQGNvZGV7ZW5kfSBkaXJlY3RpdmUKK0Bjb2Rley5lbmR9IG1hcmtzIHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5IGZpbGUuICBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdAorcHJvY2VzcyBhbnl0aGluZyBpbiB0aGUgZmlsZSBwYXN0IHRoZSBAY29kZXsuZW5kfSBkaXJlY3RpdmUuCisKK0BpZnNldCBDT0ZGCitAbm9kZSBFbmRlZgorQHNlY3Rpb24gQGNvZGV7LmVuZGVmfQorCitAY2luZGV4IEBjb2Rle2VuZGVmfSBkaXJlY3RpdmUKK1RoaXMgZGlyZWN0aXZlIGZsYWdzIHRoZSBlbmQgb2YgYSBzeW1ib2wgZGVmaW5pdGlvbiBiZWd1biB3aXRoCitAY29kZXsuZGVmfS4KK0BpZnNldCBCT1VUCisKK0BzYW1wey5lbmRlZn0gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IGlmCitAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIHRvIGdlbmVyYXRlIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzCitkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCitAZW5kIGlmc2V0CitAZW5kIGlmc2V0CisKK0Bub2RlIEVuZGZ1bmMKK0BzZWN0aW9uIEBjb2Rley5lbmRmdW5jfQorQGNpbmRleCBAY29kZXtlbmRmdW5jfSBkaXJlY3RpdmUKK0Bjb2Rley5lbmRmdW5jfSBtYXJrcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gc3BlY2lmaWVkIHdpdGggQGNvZGV7LmZ1bmN9LgorCitAbm9kZSBFbmRpZgorQHNlY3Rpb24gQGNvZGV7LmVuZGlmfQorCitAY2luZGV4IEBjb2Rle2VuZGlmfSBkaXJlY3RpdmUKK0Bjb2Rley5lbmRpZn0gaXMgcGFydCBvZiB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCBmb3IgY29uZGl0aW9uYWwgYXNzZW1ibHk7CitpdCBtYXJrcyB0aGUgZW5kIG9mIGEgYmxvY2sgb2YgY29kZSB0aGF0IGlzIG9ubHkgYXNzZW1ibGVkCitjb25kaXRpb25hbGx5LiAgQHhyZWZ7SWYsLEBjb2Rley5pZn19LgorCitAbm9kZSBFcXUKK0BzZWN0aW9uIEBjb2Rley5lcXUgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQorCitAY2luZGV4IEBjb2Rle2VxdX0gZGlyZWN0aXZlCitAY2luZGV4IGFzc2lnbmluZyB2YWx1ZXMgdG8gc3ltYm9scworQGNpbmRleCBzeW1ib2xzLCBhc3NpZ25pbmcgdmFsdWVzIHRvCitUaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSB2YWx1ZSBvZiBAdmFye3N5bWJvbH0gdG8gQHZhcntleHByZXNzaW9ufS4KK0l0IGlzIHN5bm9ueW1vdXMgd2l0aCBAc2FtcHsuc2V0fTsgQHB4cmVme1NldCwsQGNvZGV7LnNldH19LgorCitAaWZzZXQgSFBQQQorVGhlIHN5bnRheCBmb3IgQGNvZGV7ZXF1fSBvbiB0aGUgSFBQQSBpcyAKK0BzYW1we0B2YXJ7c3ltYm9sfSAuZXF1IEB2YXJ7ZXhwcmVzc2lvbn19LgorQGVuZCBpZnNldAorCitAbm9kZSBFcXVpdgorQHNlY3Rpb24gQGNvZGV7LmVxdWl2IEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KK0BjaW5kZXggQGNvZGV7ZXF1aXZ9IGRpcmVjdGl2ZQorVGhlIEBjb2Rley5lcXVpdn0gZGlyZWN0aXZlIGlzIGxpa2UgQGNvZGV7LmVxdX0gYW5kIEBjb2Rley5zZXR9LCBleGNlcHQgdGhhdAordGhlIGFzc2VtYmxlciB3aWxsIHNpZ25hbCBhbiBlcnJvciBpZiBAdmFye3N5bWJvbH0gaXMgYWxyZWFkeSBkZWZpbmVkLgorCitFeGNlcHQgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgZXJyb3IgbWVzc2FnZSwgdGhpcyBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gCitAc21hbGxleGFtcGxlCisuaWZkZWYgU1lNCisuZXJyCisuZW5kaWYKKy5lcXUgU1lNLFZBTAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgRXJyCitAc2VjdGlvbiBAY29kZXsuZXJyfQorQGNpbmRleCBAY29kZXtlcnJ9IGRpcmVjdGl2ZQorSWYgQGNvZGV7QHZhbHVle0FTfX0gYXNzZW1ibGVzIGEgQGNvZGV7LmVycn0gZGlyZWN0aXZlLCBpdCB3aWxsIHByaW50IGFuIGVycm9yCittZXNzYWdlIGFuZCwgdW5sZXNzIHRoZSBAY29kZXstWn0gb3B0aW9uIHdhcyB1c2VkLCBpdCB3aWxsIG5vdCBnZW5lcmF0ZSBhbgorb2JqZWN0IGZpbGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBlcnJvciBhbiBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGNvZGUuCisKK0Bub2RlIEV4aXRtCitAc2VjdGlvbiBAY29kZXsuZXhpdG19CitFeGl0IGVhcmx5IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbi4gIEB4cmVme01hY3JvfS4KKworQG5vZGUgRXh0ZXJuCitAc2VjdGlvbiBAY29kZXsuZXh0ZXJufQorCitAY2luZGV4IEBjb2Rle2V4dGVybn0gZGlyZWN0aXZlCitAY29kZXsuZXh0ZXJufSBpcyBhY2NlcHRlZCBpbiB0aGUgc291cmNlIHByb2dyYW0tLS1mb3IgY29tcGF0aWJpbGl0eQord2l0aCBvdGhlciBhc3NlbWJsZXJzLS0tYnV0IGl0IGlzIGlnbm9yZWQuICBAY29kZXtAdmFsdWV7QVN9fSB0cmVhdHMKK2FsbCB1bmRlZmluZWQgc3ltYm9scyBhcyBleHRlcm5hbC4KKworQG5vZGUgRmFpbAorQHNlY3Rpb24gQGNvZGV7LmZhaWwgQHZhcntleHByZXNzaW9ufX0KKworQGNpbmRleCBAY29kZXtmYWlsfSBkaXJlY3RpdmUKK0dlbmVyYXRlcyBhbiBlcnJvciBvciBhIHdhcm5pbmcuICBJZiB0aGUgdmFsdWUgb2YgdGhlIEB2YXJ7ZXhwcmVzc2lvbn0gaXMgNTAwCitvciBtb3JlLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIHByaW50IGEgd2FybmluZyBtZXNzYWdlLiAgSWYgdGhlIHZhbHVlIGlzIGxlc3MKK3RoYW4gNTAwLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBUaGUgbWVzc2FnZSB3aWxsCitpbmNsdWRlIHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259LiAgVGhpcyBjYW4gb2NjYXNpb25hbGx5IGJlIHVzZWZ1bCBpbnNpZGUKK2NvbXBsZXggbmVzdGVkIG1hY3JvcyBvciBjb25kaXRpb25hbCBhc3NlbWJseS4KKworQGlmY2xlYXIgbm8tZmlsZS1kaXIKK0Bub2RlIEZpbGUKK0BzZWN0aW9uIEBjb2Rley5maWxlIEB2YXJ7c3RyaW5nfX0KKworQGNpbmRleCBAY29kZXtmaWxlfSBkaXJlY3RpdmUKK0BjaW5kZXggbG9naWNhbCBmaWxlIG5hbWUKK0BjaW5kZXggZmlsZSBuYW1lLCBsb2dpY2FsCitAY29kZXsuZmlsZX0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3RhcnQgYSBuZXcgbG9naWNhbAorZmlsZS4gIEB2YXJ7c3RyaW5nfSBpcyB0aGUgbmV3IGZpbGUgbmFtZS4gIEluIGdlbmVyYWwsIHRoZSBmaWxlbmFtZSBpcworcmVjb2duaXplZCB3aGV0aGVyIG9yIG5vdCBpdCBpcyBzdXJyb3VuZGVkIGJ5IHF1b3RlcyBAc2FtcHsifTsgYnV0IGlmIHlvdSB3aXNoCit0byBzcGVjaWZ5IGFuIGVtcHR5IGZpbGUgbmFtZSwgeW91IG11c3QgZ2l2ZSB0aGUgcXVvdGVzLS1AY29kZXsiIn0uICBUaGlzCitzdGF0ZW1lbnQgbWF5IGdvIGF3YXkgaW4gZnV0dXJlOiBpdCBpcyBvbmx5IHJlY29nbml6ZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoCitvbGQgQGNvZGV7QHZhbHVle0FTfX0gcHJvZ3JhbXMuCitAaWZzZXQgQTI5SworSW4gc29tZSBjb25maWd1cmF0aW9ucyBvZiBAY29kZXtAdmFsdWV7QVN9fSwgQGNvZGV7LmZpbGV9IGhhcyBhbHJlYWR5IGJlZW4KK3JlbW92ZWQgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgYXNzZW1ibGVycy4gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBGaWxsCitAc2VjdGlvbiBAY29kZXsuZmlsbCBAdmFye3JlcGVhdH0gLCBAdmFye3NpemV9ICwgQHZhcnt2YWx1ZX19CisKK0BjaW5kZXggQGNvZGV7ZmlsbH0gZGlyZWN0aXZlCitAY2luZGV4IHdyaXRpbmcgcGF0dGVybnMgaW4gbWVtb3J5CitAY2luZGV4IHBhdHRlcm5zLCB3cml0aW5nIGluIG1lbW9yeQorQHZhcntyZXN1bHR9LCBAdmFye3NpemV9IGFuZCBAdmFye3ZhbHVlfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuCitUaGlzIGVtaXRzIEB2YXJ7cmVwZWF0fSBjb3BpZXMgb2YgQHZhcntzaXplfSBieXRlcy4gIEB2YXJ7UmVwZWF0fQorbWF5IGJlIHplcm8gb3IgbW9yZS4gIEB2YXJ7U2l6ZX0gbWF5IGJlIHplcm8gb3IgbW9yZSwgYnV0IGlmIGl0IGlzCittb3JlIHRoYW4gOCwgdGhlbiBpdCBpcyBkZWVtZWQgdG8gaGF2ZSB0aGUgdmFsdWUgOCwgY29tcGF0aWJsZSB3aXRoCitvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiAgVGhlIGNvbnRlbnRzIG9mIGVhY2ggQHZhcntyZXBlYXR9IGJ5dGVzCitpcyB0YWtlbiBmcm9tIGFuIDgtYnl0ZSBudW1iZXIuICBUaGUgaGlnaGVzdCBvcmRlciA0IGJ5dGVzIGFyZQoremVyby4gIFRoZSBsb3dlc3Qgb3JkZXIgNCBieXRlcyBhcmUgQHZhcnt2YWx1ZX0gcmVuZGVyZWQgaW4gdGhlCitieXRlLW9yZGVyIG9mIGFuIGludGVnZXIgb24gdGhlIGNvbXB1dGVyIEBjb2Rle0B2YWx1ZXtBU319IGlzIGFzc2VtYmxpbmcgZm9yLgorRWFjaCBAdmFye3NpemV9IGJ5dGVzIGluIGEgcmVwZXRpdGlvbiBpcyB0YWtlbiBmcm9tIHRoZSBsb3dlc3Qgb3JkZXIKK0B2YXJ7c2l6ZX0gYnl0ZXMgb2YgdGhpcyBudW1iZXIuICBBZ2FpbiwgdGhpcyBiaXphcnJlIGJlaGF2aW9yIGlzCitjb21wYXRpYmxlIHdpdGggb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4KKworQHZhcntzaXplfSBhbmQgQHZhcnt2YWx1ZX0gYXJlIG9wdGlvbmFsLgorSWYgdGhlIHNlY29uZCBjb21tYSBhbmQgQHZhcnt2YWx1ZX0gYXJlIGFic2VudCwgQHZhcnt2YWx1ZX0gaXMKK2Fzc3VtZWQgemVyby4gIElmIHRoZSBmaXJzdCBjb21tYSBhbmQgZm9sbG93aW5nIHRva2VucyBhcmUgYWJzZW50LAorQHZhcntzaXplfSBpcyBhc3N1bWVkIHRvIGJlIDEuCisKK0Bub2RlIEZsb2F0CitAc2VjdGlvbiBAY29kZXsuZmxvYXQgQHZhcntmbG9udW1zfX0KKworQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzIChzaW5nbGUpCitAY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUKK1RoaXMgZGlyZWN0aXZlIGFzc2VtYmxlcyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0CitoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIEBjb2Rley5zaW5nbGV9LgorQGlmc2V0IEdFTkVSSUMKK1RoZSBleGFjdCBraW5kIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZW1pdHRlZCBkZXBlbmRzIG9uIGhvdworQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZC4KK0B4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZnNldCBJRUVFRkxPQVQKK09uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHksIEBjb2Rley5mbG9hdH0gZW1pdHMgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMKK2luIEBzY3tpZWVlfSBmb3JtYXQuCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQG5vZGUgRnVuYworQHNlY3Rpb24gQGNvZGV7LmZ1bmMgQHZhcntuYW1lfVssQHZhcntsYWJlbH1dfQorQGNpbmRleCBAY29kZXtmdW5jfSBkaXJlY3RpdmUKK0Bjb2Rley5mdW5jfSBlbWl0cyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIGZ1bmN0aW9uIEB2YXJ7bmFtZX0sIGFuZAoraXMgaWdub3JlZCB1bmxlc3MgdGhlIGZpbGUgaXMgYXNzZW1ibGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQuCitPbmx5IEBzYW1wey0tZ3N0YWJzfSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLgorQHZhcntsYWJlbH0gaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBmdW5jdGlvbiBhbmQgaWYgb21pdHRlZCBAdmFye25hbWV9CitwcmVwZW5kZWQgd2l0aCB0aGUgQHNhbXB7bGVhZGluZyBjaGFyfSBpcyB1c2VkLgorQHNhbXB7bGVhZGluZyBjaGFyfSBpcyB1c3VhbGx5IEBjb2Rle199IG9yIG5vdGhpbmcsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LgorQWxsIGZ1bmN0aW9ucyBhcmUgY3VycmVudGx5IGRlZmluZWQgdG8gaGF2ZSBAY29kZXt2b2lkfSByZXR1cm4gdHlwZS4KK1RoZSBmdW5jdGlvbiBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBAY29kZXsuZW5kZnVuY30uCisKK0Bub2RlIEdsb2JhbAorQHNlY3Rpb24gQGNvZGV7Lmdsb2JhbCBAdmFye3N5bWJvbH19LCBAY29kZXsuZ2xvYmwgQHZhcntzeW1ib2x9fQorCitAY2luZGV4IEBjb2Rle2dsb2JhbH0gZGlyZWN0aXZlCitAY2luZGV4IHN5bWJvbCwgbWFraW5nIHZpc2libGUgdG8gbGlua2VyCitAY29kZXsuZ2xvYmFsfSBtYWtlcyB0aGUgc3ltYm9sIHZpc2libGUgdG8gQGNvZGV7QHZhbHVle0xEfX0uICBJZiB5b3UgZGVmaW5lCitAdmFye3N5bWJvbH0gaW4geW91ciBwYXJ0aWFsIHByb2dyYW0sIGl0cyB2YWx1ZSBpcyBtYWRlIGF2YWlsYWJsZSB0bworb3RoZXIgcGFydGlhbCBwcm9ncmFtcyB0aGF0IGFyZSBsaW5rZWQgd2l0aCBpdC4gIE90aGVyd2lzZSwKK0B2YXJ7c3ltYm9sfSB0YWtlcyBpdHMgYXR0cmlidXRlcyBmcm9tIGEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUKK2Zyb20gYW5vdGhlciBmaWxlIGxpbmtlZCBpbnRvIHRoZSBzYW1lIHByb2dyYW0uCisKK0JvdGggc3BlbGxpbmdzIChAc2FtcHsuZ2xvYmx9IGFuZCBAc2FtcHsuZ2xvYmFsfSkgYXJlIGFjY2VwdGVkLCBmb3IKK2NvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBhc3NlbWJsZXJzLgorCitAaWZzZXQgSFBQQQorT24gdGhlIEhQUEEsIEBjb2Rley5nbG9iYWx9IGlzIG5vdCBhbHdheXMgZW5vdWdoIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB0byBvdGhlcgorcGFydGlhbCBwcm9ncmFtcy4gIFlvdSBtYXkgbmVlZCB0aGUgSFBQQS1vbmx5IEBjb2Rley5FWFBPUlR9IGRpcmVjdGl2ZSBhcyB3ZWxsLgorQHhyZWZ7SFBQQSBEaXJlY3RpdmVzLCwgSFBQQSBBc3NlbWJsZXIgRGlyZWN0aXZlc30uCitAZW5kIGlmc2V0CisKK0Bub2RlIGh3b3JkCitAc2VjdGlvbiBAY29kZXsuaHdvcmQgQHZhcntleHByZXNzaW9uc319CisKK0BjaW5kZXggQGNvZGV7aHdvcmR9IGRpcmVjdGl2ZQorQGNpbmRleCBpbnRlZ2VycywgMTYtYml0CitAY2luZGV4IG51bWJlcnMsIDE2LWJpdAorQGNpbmRleCBzaXh0ZWVuIGJpdCBpbnRlZ2VycworVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgYW5kIGVtaXRzCithIDE2IGJpdCBudW1iZXIgZm9yIGVhY2guCisKK0BpZnNldCBHRU5FUklDCitUaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5zaG9ydH07IGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0CithcmNoaXRlY3R1cmUsIGl0IG1heSBhbHNvIGJlIGEgc3lub255bSBmb3IgQHNhbXB7LndvcmR9LgorQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IFczMgorVGhpcyBkaXJlY3RpdmUgaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuc2hvcnR9LgorQGVuZCBpZnNldAorQGlmc2V0IFcxNgorVGhpcyBkaXJlY3RpdmUgaXMgYSBzeW5vbnltIGZvciBib3RoIEBzYW1wey5zaG9ydH0gYW5kIEBzYW1wey53b3JkfS4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBJZGVudAorQHNlY3Rpb24gQGNvZGV7LmlkZW50fQorCitAY2luZGV4IEBjb2Rle2lkZW50fSBkaXJlY3RpdmUKK1RoaXMgZGlyZWN0aXZlIGlzIHVzZWQgYnkgc29tZSBhc3NlbWJsZXJzIHRvIHBsYWNlIHRhZ3MgaW4gb2JqZWN0IGZpbGVzLgorQGNvZGV7QHZhbHVle0FTfX0gc2ltcGx5IGFjY2VwdHMgdGhlIGRpcmVjdGl2ZSBmb3Igc291cmNlLWZpbGUKK2NvbXBhdGliaWxpdHkgd2l0aCBzdWNoIGFzc2VtYmxlcnMsIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBlbWl0IGFueXRoaW5nCitmb3IgaXQuCisKK0Bub2RlIElmCitAc2VjdGlvbiBAY29kZXsuaWYgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufX0KKworQGNpbmRleCBjb25kaXRpb25hbCBhc3NlbWJseQorQGNpbmRleCBAY29kZXtpZn0gZGlyZWN0aXZlCitAY29kZXsuaWZ9IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uIG9mIGNvZGUgd2hpY2ggaXMgb25seQorY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzb3VyY2UgcHJvZ3JhbSBiZWluZyBhc3NlbWJsZWQgaWYgdGhlIGFyZ3VtZW50Cisod2hpY2ggbXVzdCBiZSBhbiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259KSBpcyBub24temVyby4gIFRoZSBlbmQgb2YKK3RoZSBjb25kaXRpb25hbCBzZWN0aW9uIG9mIGNvZGUgbXVzdCBiZSBtYXJrZWQgYnkgQGNvZGV7LmVuZGlmfQorKEBweHJlZntFbmRpZiwsQGNvZGV7LmVuZGlmfX0pOyBvcHRpb25hbGx5LCB5b3UgbWF5IGluY2x1ZGUgY29kZSBmb3IgdGhlCithbHRlcm5hdGl2ZSBjb25kaXRpb24sIGZsYWdnZWQgYnkgQGNvZGV7LmVsc2V9IChAcHhyZWZ7RWxzZSwsQGNvZGV7LmVsc2V9fSkuCisKK1RoZSBmb2xsb3dpbmcgdmFyaWFudHMgb2YgQGNvZGV7LmlmfSBhcmUgYWxzbyBzdXBwb3J0ZWQ6CitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7aWZkZWZ9IGRpcmVjdGl2ZQorQGl0ZW0gLmlmZGVmIEB2YXJ7c3ltYm9sfQorQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBzcGVjaWZpZWQgQHZhcntzeW1ib2x9CitoYXMgYmVlbiBkZWZpbmVkLgorCitAY2luZGV4IEBjb2Rle2lmY30gZGlyZWN0aXZlCitAaXRlbSAuaWZjIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfQorQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgdGhlIHNhbWUuICBUaGUKK3N0cmluZ3MgbWF5IGJlIG9wdGlvbmFsbHkgcXVvdGVkIHdpdGggc2luZ2xlIHF1b3Rlcy4gIElmIHRoZXkgYXJlIG5vdCBxdW90ZWQsCit0aGUgZmlyc3Qgc3RyaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCBjb21tYSwgYW5kIHRoZSBzZWNvbmQgc3RyaW5nIHN0b3BzIGF0IHRoZQorZW5kIG9mIHRoZSBsaW5lLiAgU3RyaW5ncyB3aGljaCBjb250YWluIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHF1b3RlZC4gIFRoZQorc3RyaW5nIGNvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuCisKK0BjaW5kZXggQGNvZGV7aWZlcX0gZGlyZWN0aXZlCitAaXRlbSAuaWZlcSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259CitBc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIHplcm8uCisKK0BjaW5kZXggQGNvZGV7aWZlcXN9IGRpcmVjdGl2ZQorQGl0ZW0gLmlmZXFzIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfQorQW5vdGhlciBmb3JtIG9mIEBjb2Rley5pZmN9LiAgVGhlIHN0cmluZ3MgbXVzdCBiZSBxdW90ZWQgdXNpbmcgZG91YmxlIHF1b3Rlcy4KKworQGNpbmRleCBAY29kZXtpZmdlfSBkaXJlY3RpdmUKK0BpdGVtIC5pZmdlIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KK0Fzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgZ3JlYXRlciB0aGFuIG9yCitlcXVhbCB0byB6ZXJvLgorCitAY2luZGV4IEBjb2Rle2lmZ3R9IGRpcmVjdGl2ZQorQGl0ZW0gLmlmZ3QgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQorQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gemVyby4KKworQGNpbmRleCBAY29kZXtpZmxlfSBkaXJlY3RpdmUKK0BpdGVtIC5pZmxlIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KK0Fzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsCit0byB6ZXJvLgorCitAY2luZGV4IEBjb2Rle2lmbHR9IGRpcmVjdGl2ZQorQGl0ZW0gLmlmbHQgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQorQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4gemVyby4KKworQGNpbmRleCBAY29kZXtpZm5jfSBkaXJlY3RpdmUKK0BpdGVtIC5pZm5jIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfS4KK0xpa2UgQGNvZGV7LmlmY30sIGJ1dCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgaXMgcmV2ZXJzZWQ6IHRoaXMgYXNzZW1ibGVzIHRoZQorZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZS4KKworQGNpbmRleCBAY29kZXtpZm5kZWZ9IGRpcmVjdGl2ZQorQGNpbmRleCBAY29kZXtpZm5vdGRlZn0gZGlyZWN0aXZlCitAaXRlbSAuaWZuZGVmIEB2YXJ7c3ltYm9sfQorQGl0ZW14IC5pZm5vdGRlZiBAdmFye3N5bWJvbH0KK0Fzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgc3BlY2lmaWVkIEB2YXJ7c3ltYm9sfQoraGFzIG5vdCBiZWVuIGRlZmluZWQuICBCb3RoIHNwZWxsaW5nIHZhcmlhbnRzIGFyZSBlcXVpdmFsZW50LgorCitAY2luZGV4IEBjb2Rle2lmbmV9IGRpcmVjdGl2ZQorQGl0ZW0gLmlmbmUgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQorQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgZXF1YWwgdG8gemVybworKGluIG90aGVyIHdvcmRzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gQGNvZGV7LmlmfSkuCisKK0BjaW5kZXggQGNvZGV7aWZuZXN9IGRpcmVjdGl2ZQorQGl0ZW0gLmlmbmVzIEB2YXJ7c3RyaW5nMX0sQHZhcntzdHJpbmcyfQorTGlrZSBAY29kZXsuaWZlcXN9LCBidXQgdGhlIHNlbnNlIG9mIHRoZSB0ZXN0IGlzIHJldmVyc2VkOiB0aGlzIGFzc2VtYmxlcyB0aGUKK2ZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUuCitAZW5kIHRhYmxlCisKK0Bub2RlIEluY2x1ZGUKK0BzZWN0aW9uIEBjb2Rley5pbmNsdWRlICJAdmFye2ZpbGV9In0KKworQGNpbmRleCBAY29kZXtpbmNsdWRlfSBkaXJlY3RpdmUKK0BjaW5kZXggc3VwcG9ydGluZyBmaWxlcywgaW5jbHVkaW5nCitAY2luZGV4IGZpbGVzLCBpbmNsdWRpbmcKK1RoaXMgZGlyZWN0aXZlIHByb3ZpZGVzIGEgd2F5IHRvIGluY2x1ZGUgc3VwcG9ydGluZyBmaWxlcyBhdCBzcGVjaWZpZWQKK3BvaW50cyBpbiB5b3VyIHNvdXJjZSBwcm9ncmFtLiAgVGhlIGNvZGUgZnJvbSBAdmFye2ZpbGV9IGlzIGFzc2VtYmxlZCBhcworaWYgaXQgZm9sbG93ZWQgdGhlIHBvaW50IG9mIHRoZSBAY29kZXsuaW5jbHVkZX07IHdoZW4gdGhlIGVuZCBvZiB0aGUKK2luY2x1ZGVkIGZpbGUgaXMgcmVhY2hlZCwgYXNzZW1ibHkgb2YgdGhlIG9yaWdpbmFsIGZpbGUgY29udGludWVzLiAgWW91CitjYW4gY29udHJvbCB0aGUgc2VhcmNoIHBhdGhzIHVzZWQgd2l0aCB0aGUgQHNhbXB7LUl9IGNvbW1hbmQtbGluZSBvcHRpb24KKyhAcHhyZWZ7SW52b2tpbmcsLENvbW1hbmQtTGluZSBPcHRpb25zfSkuICBRdW90YXRpb24gbWFya3MgYXJlIHJlcXVpcmVkCithcm91bmQgQHZhcntmaWxlfS4KKworQG5vZGUgSW50CitAc2VjdGlvbiBAY29kZXsuaW50IEB2YXJ7ZXhwcmVzc2lvbnN9fQorCitAY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlCitAY2luZGV4IGludGVnZXJzLCAzMi1iaXQKK0V4cGVjdCB6ZXJvIG9yIG1vcmUgQHZhcntleHByZXNzaW9uc30sIG9mIGFueSBzZWN0aW9uLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgorRm9yIGVhY2ggZXhwcmVzc2lvbiwgZW1pdCBhIG51bWJlciB0aGF0LCBhdCBydW4gdGltZSwgaXMgdGhlIHZhbHVlIG9mIHRoYXQKK2V4cHJlc3Npb24uICBUaGUgYnl0ZSBvcmRlciBhbmQgYml0IHNpemUgb2YgdGhlIG51bWJlciBkZXBlbmRzIG9uIHdoYXQga2luZAorb2YgdGFyZ2V0IHRoZSBhc3NlbWJseSBpcyBmb3IuCisKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZnNldCBIOAorT24gdGhlIEg4LzUwMCBhbmQgbW9zdCBmb3JtcyBvZiB0aGUgSDgvMzAwLCBAY29kZXsuaW50fSBlbWl0cyAxNi1iaXQKK2ludGVnZXJzLiAgT24gdGhlIEg4LzMwMEggYW5kIHRoZSBIaXRhY2hpIFNILCBob3dldmVyLCBAY29kZXsuaW50fSBlbWl0cworMzItYml0IGludGVnZXJzLgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCisKK0Bub2RlIElycAorQHNlY3Rpb24gQGNvZGV7LmlycCBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KKworQGNpbmRleCBAY29kZXtpcnB9IGRpcmVjdGl2ZQorRXZhbHVhdGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGFzc2lnbmluZyBkaWZmZXJlbnQgdmFsdWVzIHRvIEB2YXJ7c3ltYm9sfS4KK1RoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIHN0YXJ0cyBhdCB0aGUgQGNvZGV7LmlycH0gZGlyZWN0aXZlLCBhbmQgaXMKK3Rlcm1pbmF0ZWQgYnkgYW4gQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZS4gIEZvciBlYWNoIEB2YXJ7dmFsdWV9LCBAdmFye3N5bWJvbH0gaXMKK3NldCB0byBAdmFye3ZhbHVlfSwgYW5kIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzIGFzc2VtYmxlZC4gIElmIG5vCitAdmFye3ZhbHVlfSBpcyBsaXN0ZWQsIHRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGlzIGFzc2VtYmxlZCBvbmNlLCB3aXRoCitAdmFye3N5bWJvbH0gc2V0IHRvIHRoZSBudWxsIHN0cmluZy4gIFRvIHJlZmVyIHRvIEB2YXJ7c3ltYm9sfSB3aXRoaW4gdGhlCitzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCB1c2UgQHZhcntcc3ltYm9sfS4KKworRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKKworQGV4YW1wbGUKKyAgICAgICAgLmlycCAgICBwYXJhbSwxLDIsMworICAgICAgICBtb3ZlICAgIGRccGFyYW0sc3BAQC0KKyAgICAgICAgLmVuZHIKK0BlbmQgZXhhbXBsZQorCitpcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKKworQGV4YW1wbGUKKyAgICAgICAgbW92ZSAgICBkMSxzcEBALQorICAgICAgICBtb3ZlICAgIGQyLHNwQEAtCisgICAgICAgIG1vdmUgICAgZDMsc3BAQC0KK0BlbmQgZXhhbXBsZQorCitAbm9kZSBJcnBjCitAc2VjdGlvbiBAY29kZXsuaXJwYyBAdmFye3N5bWJvbH0sQHZhcnt2YWx1ZXN9fUBkb3Rze30KKworQGNpbmRleCBAY29kZXtpcnBjfSBkaXJlY3RpdmUKK0V2YWx1YXRlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBhc3NpZ25pbmcgZGlmZmVyZW50IHZhbHVlcyB0byBAdmFye3N5bWJvbH0uCitUaGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBzdGFydHMgYXQgdGhlIEBjb2Rley5pcnBjfSBkaXJlY3RpdmUsIGFuZCBpcwordGVybWluYXRlZCBieSBhbiBAY29kZXsuZW5kcn0gZGlyZWN0aXZlLiAgRm9yIGVhY2ggY2hhcmFjdGVyIGluIEB2YXJ7dmFsdWV9LAorQHZhcntzeW1ib2x9IGlzIHNldCB0byB0aGUgY2hhcmFjdGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMKK2Fzc2VtYmxlZC4gIElmIG5vIEB2YXJ7dmFsdWV9IGlzIGxpc3RlZCwgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMKK2Fzc2VtYmxlZCBvbmNlLCB3aXRoIEB2YXJ7c3ltYm9sfSBzZXQgdG8gdGhlIG51bGwgc3RyaW5nLiAgVG8gcmVmZXIgdG8KK0B2YXJ7c3ltYm9sfSB3aXRoaW4gdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMsIHVzZSBAdmFye1xzeW1ib2x9LgorCitGb3IgZXhhbXBsZSwgYXNzZW1ibGluZworCitAZXhhbXBsZQorICAgICAgICAuaXJwYyAgICBwYXJhbSwxMjMKKyAgICAgICAgbW92ZSAgICBkXHBhcmFtLHNwQEAtCisgICAgICAgIC5lbmRyCitAZW5kIGV4YW1wbGUKKworaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCisKK0BleGFtcGxlCisgICAgICAgIG1vdmUgICAgZDEsc3BAQC0KKyAgICAgICAgbW92ZSAgICBkMixzcEBALQorICAgICAgICBtb3ZlICAgIGQzLHNwQEAtCitAZW5kIGV4YW1wbGUKKworQG5vZGUgTGNvbW0KK0BzZWN0aW9uIEBjb2Rley5sY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH19CisKK0BjaW5kZXggQGNvZGV7bGNvbW19IGRpcmVjdGl2ZQorQGNpbmRleCBsb2NhbCBjb21tb24gc3ltYm9scworQGNpbmRleCBzeW1ib2xzLCBsb2NhbCBjb21tb24KK1Jlc2VydmUgQHZhcntsZW5ndGh9IChhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSBieXRlcyBmb3IgYSBsb2NhbCBjb21tb24KK2Rlbm90ZWQgYnkgQHZhcntzeW1ib2x9LiAgVGhlIHNlY3Rpb24gYW5kIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSBhcmUKK3Rob3NlIG9mIHRoZSBuZXcgbG9jYWwgY29tbW9uLiAgVGhlIGFkZHJlc3NlcyBhcmUgYWxsb2NhdGVkIGluIHRoZSBic3MKK3NlY3Rpb24sIHNvIHRoYXQgYXQgcnVuLXRpbWUgdGhlIGJ5dGVzIHN0YXJ0IG9mZiB6ZXJvZWQuICBAdmFye1N5bWJvbH0KK2lzIG5vdCBkZWNsYXJlZCBnbG9iYWwgKEBweHJlZntHbG9iYWwsLEBjb2Rley5nbG9iYWx9fSksIHNvIGlzIG5vcm1hbGx5Citub3QgdmlzaWJsZSB0byBAY29kZXtAdmFsdWV7TER9fS4KKworQGlmc2V0IEdFTkVSSUMKK1NvbWUgdGFyZ2V0cyBwZXJtaXQgYSB0aGlyZCBhcmd1bWVudCB0byBiZSB1c2VkIHdpdGggQGNvZGV7Lmxjb21tfS4gIFRoaXMKK2FyZ3VtZW50IHNwZWNpZmllcyB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbCBpbiB0aGUgYnNzIHNlY3Rpb24uCitAZW5kIGlmc2V0CisKK0BpZnNldCBIUFBBCitUaGUgc3ludGF4IGZvciBAY29kZXsubGNvbW19IGRpZmZlcnMgc2xpZ2h0bHkgb24gdGhlIEhQUEEuICBUaGUgc3ludGF4IGlzCitAc2FtcHtAdmFye3N5bWJvbH0gLmxjb21tLCBAdmFye2xlbmd0aH19OyBAdmFye3N5bWJvbH0gaXMgb3B0aW9uYWwuCitAZW5kIGlmc2V0CisKK0Bub2RlIExmbGFncworQHNlY3Rpb24gQGNvZGV7LmxmbGFnc30KKworQGNpbmRleCBAY29kZXtsZmxhZ3N9IGRpcmVjdGl2ZSAoaWdub3JlZCkKK0Bjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKK2Fzc2VtYmxlcnMsIGJ1dCBpZ25vcmVzIGl0LgorCitAaWZjbGVhciBuby1saW5lLWRpcgorQG5vZGUgTGluZQorQHNlY3Rpb24gQGNvZGV7LmxpbmUgQHZhcntsaW5lLW51bWJlcn19CisKK0BjaW5kZXggQGNvZGV7bGluZX0gZGlyZWN0aXZlCitAZW5kIGlmY2xlYXIKK0BpZnNldCBuby1saW5lLWRpcgorQG5vZGUgTG4KK0BzZWN0aW9uIEBjb2Rley5sbiBAdmFye2xpbmUtbnVtYmVyfX0KKworQGNpbmRleCBAY29kZXtsbn0gZGlyZWN0aXZlCitAZW5kIGlmc2V0CitAY2luZGV4IGxvZ2ljYWwgbGluZSBudW1iZXIKK0BpZnNldCBhb3V0LWJvdXQKK0NoYW5nZSB0aGUgbG9naWNhbCBsaW5lIG51bWJlci4gIEB2YXJ7bGluZS1udW1iZXJ9IG11c3QgYmUgYW4gYWJzb2x1dGUKK2V4cHJlc3Npb24uICBUaGUgbmV4dCBsaW5lIGhhcyB0aGF0IGxvZ2ljYWwgbGluZSBudW1iZXIuICBUaGVyZWZvcmUgYW55IG90aGVyCitzdGF0ZW1lbnRzIG9uIHRoZSBjdXJyZW50IGxpbmUgKGFmdGVyIGEgc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIpIGFyZQorcmVwb3J0ZWQgYXMgb24gbG9naWNhbCBsaW5lIG51bWJlciBAdmFye2xpbmUtbnVtYmVyfSBAbWludXN7fSAxLiAgT25lIGRheQorQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBubyBsb25nZXIgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZTogaXQgaXMgcmVjb2duaXplZCBvbmx5Citmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFzc2VtYmxlciBwcm9ncmFtcy4KKworQGlmc2V0IEdFTkVSSUMKK0BpZnNldCBBMjlLCitAZW1waHtXYXJuaW5nOn0gSW4gdGhlIEFNRDI5SyBjb25maWd1cmF0aW9uIG9mIEB2YWx1ZXtBU30sIHRoaXMgY29tbWFuZCBpcworbm90IGF2YWlsYWJsZTsgdXNlIHRoZSBzeW5vbnltIEBjb2Rley5sbn0gaW4gdGhhdCBjb250ZXh0LgorQGVuZCBpZnNldAorQGVuZCBpZnNldAorQGVuZCBpZnNldAorCitAaWZjbGVhciBuby1saW5lLWRpcgorRXZlbiB0aG91Z2ggdGhpcyBpcyBhIGRpcmVjdGl2ZSBhc3NvY2lhdGVkIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvcgorQGNvZGV7Yi5vdXR9IG9iamVjdC1jb2RlIGZvcm1hdHMsIEBjb2Rle0B2YWx1ZXtBU319IHN0aWxsIHJlY29nbml6ZXMgaXQKK3doZW4gcHJvZHVjaW5nIENPRkYgb3V0cHV0LCBhbmQgdHJlYXRzIEBzYW1wey5saW5lfSBhcyB0aG91Z2ggaXQKK3dlcmUgdGhlIENPRkYgQHNhbXB7LmxufSBAZW1waHtpZn0gaXQgaXMgZm91bmQgb3V0c2lkZSBhCitAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXIuCisKK0luc2lkZSBhIEBjb2Rley5kZWZ9LCBAc2FtcHsubGluZX0gaXMsIGluc3RlYWQsIG9uZSBvZiB0aGUgZGlyZWN0aXZlcwordXNlZCBieSBjb21waWxlcnMgdG8gZ2VuZXJhdGUgYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IKK2RlYnVnZ2luZy4KK0BlbmQgaWZjbGVhcgorCitAbm9kZSBMaW5rb25jZQorQHNlY3Rpb24gQGNvZGV7LmxpbmtvbmNlIFtAdmFye3R5cGV9XX0KK0BjaW5kZXggQ09NREFUCitAY2luZGV4IEBjb2Rle2xpbmtvbmNlfSBkaXJlY3RpdmUKK0BjaW5kZXggY29tbW9uIHNlY3Rpb25zCitNYXJrIHRoZSBjdXJyZW50IHNlY3Rpb24gc28gdGhhdCB0aGUgbGlua2VyIG9ubHkgaW5jbHVkZXMgYSBzaW5nbGUgY29weSBvZiBpdC4KK1RoaXMgbWF5IGJlIHVzZWQgdG8gaW5jbHVkZSB0aGUgc2FtZSBzZWN0aW9uIGluIHNldmVyYWwgZGlmZmVyZW50IG9iamVjdCBmaWxlcywKK2J1dCBlbnN1cmUgdGhhdCB0aGUgbGlua2VyIHdpbGwgb25seSBpbmNsdWRlIGl0IG9uY2UgaW4gdGhlIGZpbmFsIG91dHB1dCBmaWxlLgorVGhlIEBjb2Rley5saW5rb25jZX0gcHNldWRvLW9wIG11c3QgYmUgdXNlZCBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGUgc2VjdGlvbi4KK0R1cGxpY2F0ZSBzZWN0aW9ucyBhcmUgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIHNlY3Rpb24gbmFtZSwgc28gaXQgc2hvdWxkIGJlCit1bmlxdWUuCisKK1RoaXMgZGlyZWN0aXZlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IGEgZmV3IG9iamVjdCBmaWxlIGZvcm1hdHM7IGFzIG9mIHRoaXMKK3dyaXRpbmcsIHRoZSBvbmx5IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBzdXBwb3J0cyBpdCBpcyB0aGUgUG9ydGFibGUKK0V4ZWN1dGFibGUgZm9ybWF0IHVzZWQgb24gV2luZG93cyBOVC4KKworVGhlIEB2YXJ7dHlwZX0gYXJndW1lbnQgaXMgb3B0aW9uYWwuICBJZiBzcGVjaWZpZWQsIGl0IG11c3QgYmUgb25lIG9mIHRoZQorZm9sbG93aW5nIHN0cmluZ3MuICBGb3IgZXhhbXBsZToKK0BzbWFsbGV4YW1wbGUKKy5saW5rb25jZSBzYW1lX3NpemUKK0BlbmQgc21hbGxleGFtcGxlCitOb3QgYWxsIHR5cGVzIG1heSBiZSBzdXBwb3J0ZWQgb24gYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZGlzY2FyZAorU2lsZW50bHkgZGlzY2FyZCBkdXBsaWNhdGUgc2VjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorCitAaXRlbSBvbmVfb25seQorV2FybiBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIHNlY3Rpb25zLCBidXQgc3RpbGwga2VlcCBvbmx5IG9uZSBjb3B5LgorCitAaXRlbSBzYW1lX3NpemUKK1dhcm4gaWYgYW55IG9mIHRoZSBkdXBsaWNhdGVzIGhhdmUgZGlmZmVyZW50IHNpemVzLgorCitAaXRlbSBzYW1lX2NvbnRlbnRzCitXYXJuIGlmIGFueSBvZiB0aGUgZHVwbGljYXRlcyBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGNvbnRlbnRzLgorQGVuZCB0YWJsZQorCitAbm9kZSBMbgorQHNlY3Rpb24gQGNvZGV7LmxuIEB2YXJ7bGluZS1udW1iZXJ9fQorCitAY2luZGV4IEBjb2Rle2xufSBkaXJlY3RpdmUKK0BpZmNsZWFyIG5vLWxpbmUtZGlyCitAc2FtcHsubG59IGlzIGEgc3lub255bSBmb3IgQHNhbXB7LmxpbmV9LgorQGVuZCBpZmNsZWFyCitAaWZzZXQgbm8tbGluZS1kaXIKK1RlbGwgQGNvZGV7QHZhbHVle0FTfX0gdG8gY2hhbmdlIHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgQHZhcntsaW5lLW51bWJlcn0KK211c3QgYmUgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBuZXh0IGxpbmUgaGFzIHRoYXQgbG9naWNhbAorbGluZSBudW1iZXIsIHNvIGFueSBvdGhlciBzdGF0ZW1lbnRzIG9uIHRoZSBjdXJyZW50IGxpbmUgKGFmdGVyIGEKK3N0YXRlbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyIEBjb2Rlezt9KSBhcmUgcmVwb3J0ZWQgYXMgb24gbG9naWNhbAorbGluZSBudW1iZXIgQHZhcntsaW5lLW51bWJlcn0gQG1pbnVze30gMS4KK0BpZnNldCBCT1VUCisKK1RoaXMgZGlyZWN0aXZlIGlzIGFjY2VwdGVkLCBidXQgaWdub3JlZCwgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcworY29uZmlndXJlZCBmb3IgQGNvZGV7Yi5vdXR9OyBpdHMgZWZmZWN0IGlzIG9ubHkgYXNzb2NpYXRlZCB3aXRoIENPRkYKK291dHB1dCBmb3JtYXQuCitAZW5kIGlmc2V0CitAZW5kIGlmc2V0CisKK0Bub2RlIE1SSQorQHNlY3Rpb24gQGNvZGV7Lm1yaSBAdmFye3ZhbH19CisKK0BjaW5kZXggQGNvZGV7bXJpfSBkaXJlY3RpdmUKK0BjaW5kZXggTVJJIG1vZGUsIHRlbXBvcmFyaWx5CitJZiBAdmFye3ZhbH0gaXMgbm9uLXplcm8sIHRoaXMgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZW50ZXIgTVJJIG1vZGUuICBJZgorQHZhcnt2YWx9IGlzIHplcm8sIHRoaXMgdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gZXhpdCBNUkkgbW9kZS4gIFRoaXMgY2hhbmdlCithZmZlY3RzIGNvZGUgYXNzZW1ibGVkIHVudGlsIHRoZSBuZXh0IEBjb2Rley5tcml9IGRpcmVjdGl2ZSwgb3IgdW50aWwgdGhlIGVuZAorb2YgdGhlIGZpbGUuICBAeHJlZntNLCBNUkkgbW9kZSwgTVJJIG1vZGV9LgorCitAbm9kZSBMaXN0CitAc2VjdGlvbiBAY29kZXsubGlzdH0KKworQGNpbmRleCBAY29kZXtsaXN0fSBkaXJlY3RpdmUKK0BjaW5kZXggbGlzdGluZyBjb250cm9sLCB0dXJuaW5nIG9uCitDb250cm9sIChpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBAY29kZXsubm9saXN0fSBkaXJlY3RpdmUpIHdoZXRoZXIgb3IKK25vdCBhc3NlbWJseSBsaXN0aW5ncyBhcmUgZ2VuZXJhdGVkLiAgVGhlc2UgdHdvIGRpcmVjdGl2ZXMgbWFpbnRhaW4gYW4KK2ludGVybmFsIGNvdW50ZXIgKHdoaWNoIGlzIHplcm8gaW5pdGlhbGx5KS4gICBAY29kZXsubGlzdH0gaW5jcmVtZW50cyB0aGUKK2NvdW50ZXIsIGFuZCBAY29kZXsubm9saXN0fSBkZWNyZW1lbnRzIGl0LiAgQXNzZW1ibHkgbGlzdGluZ3MgYXJlCitnZW5lcmF0ZWQgd2hlbmV2ZXIgdGhlIGNvdW50ZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8uCisKK0J5IGRlZmF1bHQsIGxpc3RpbmdzIGFyZSBkaXNhYmxlZC4gIFdoZW4geW91IGVuYWJsZSB0aGVtICh3aXRoIHRoZQorQHNhbXB7LWF9IGNvbW1hbmQgbGluZSBvcHRpb247IEBweHJlZntJbnZva2luZywsQ29tbWFuZC1MaW5lIE9wdGlvbnN9KSwKK3RoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBsaXN0aW5nIGNvdW50ZXIgaXMgb25lLgorCitAbm9kZSBMb25nCitAc2VjdGlvbiBAY29kZXsubG9uZyBAdmFye2V4cHJlc3Npb25zfX0KKworQGNpbmRleCBAY29kZXtsb25nfSBkaXJlY3RpdmUKK0Bjb2Rley5sb25nfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHsuaW50fSwgQHB4cmVme0ludCwsQGNvZGV7LmludH19LgorCitAaWdub3JlCitAYyBubyBvbmUgc2VlbXMgdG8ga25vdyB3aGF0IHRoaXMgaXMgZm9yIG9yIHdoZXRoZXIgdGhpcyBkZXNjcmlwdGlvbiBpcworQGMgd2hhdCBpdCByZWFsbHkgb3VnaHQgdG8gZG8KK0Bub2RlIExzeW0KK0BzZWN0aW9uIEBjb2Rley5sc3ltIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KKworQGNpbmRleCBAY29kZXtsc3ltfSBkaXJlY3RpdmUKK0BjaW5kZXggc3ltYm9sLCBub3QgcmVmZXJlbmNlZCBpbiBhc3NlbWJseQorQGNvZGV7LmxzeW19IGNyZWF0ZXMgYSBuZXcgc3ltYm9sIG5hbWVkIEB2YXJ7c3ltYm9sfSwgYnV0IGRvZXMgbm90IHB1dCBpdCBpbgordGhlIGhhc2ggdGFibGUsIGVuc3VyaW5nIGl0IGNhbm5vdCBiZSByZWZlcmVuY2VkIGJ5IG5hbWUgZHVyaW5nIHRoZQorcmVzdCBvZiB0aGUgYXNzZW1ibHkuICBUaGlzIHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHN5bWJvbCB0byBiZQordGhlIHNhbWUgYXMgdGhlIGV4cHJlc3Npb24gdmFsdWU6CitAc21hbGxleGFtcGxlCitAdmFye290aGVyfSA9IEB2YXJ7ZGVzY3JpcHRvcn0gPSAwCitAdmFye3R5cGV9ID0gQHJ7KHNlY3Rpb24gb2YgQHZhcntleHByZXNzaW9ufSl9CitAdmFye3ZhbHVlfSA9IEB2YXJ7ZXhwcmVzc2lvbn0KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK1RoZSBuZXcgc3ltYm9sIGlzIG5vdCBmbGFnZ2VkIGFzIGV4dGVybmFsLgorQGVuZCBpZ25vcmUKKworQG5vZGUgTWFjcm8KK0BzZWN0aW9uIEBjb2Rley5tYWNyb30KKworQGNpbmRleCBtYWNyb3MKK1RoZSBjb21tYW5kcyBAY29kZXsubWFjcm99IGFuZCBAY29kZXsuZW5kbX0gYWxsb3cgeW91IHRvIGRlZmluZSBtYWNyb3MgdGhhdAorZ2VuZXJhdGUgYXNzZW1ibHkgb3V0cHV0LiAgRm9yIGV4YW1wbGUsIHRoaXMgZGVmaW5pdGlvbiBzcGVjaWZpZXMgYSBtYWNybworQGNvZGV7c3VtfSB0aGF0IHB1dHMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzIGludG8gbWVtb3J5OgorCitAZXhhbXBsZQorICAgICAgICAubWFjcm8gIHN1bSBmcm9tPTAsIHRvPTUKKyAgICAgICAgLmxvbmcgICBcZnJvbQorICAgICAgICAuaWYgICAgIFx0by1cZnJvbQorICAgICAgICBzdW0gICAgICIoXGZyb20rMSkiLFx0bworICAgICAgICAuZW5kaWYKKyAgICAgICAgLmVuZG0KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1dpdGggdGhhdCBkZWZpbml0aW9uLCBAc2FtcHtTVU0gMCw1fSBpcyBlcXVpdmFsZW50IHRvIHRoaXMgYXNzZW1ibHkgaW5wdXQ6CisKK0BleGFtcGxlCisgICAgICAgIC5sb25nICAgMAorICAgICAgICAubG9uZyAgIDEKKyAgICAgICAgLmxvbmcgICAyCisgICAgICAgIC5sb25nICAgMworICAgICAgICAubG9uZyAgIDQKKyAgICAgICAgLmxvbmcgICA1CitAZW5kIGV4YW1wbGUKKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gLm1hY3JvIEB2YXJ7bWFjbmFtZX0KK0BpdGVteCAubWFjcm8gQHZhcnttYWNuYW1lfSBAdmFye21hY2FyZ3N9IEBkb3Rze30KK0BjaW5kZXggQGNvZGV7bWFjcm99IGRpcmVjdGl2ZQorQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQHZhcnttYWNuYW1lfS4gIElmIHlvdXIgbWFjcm8KK2RlZmluaXRpb24gcmVxdWlyZXMgYXJndW1lbnRzLCBzcGVjaWZ5IHRoZWlyIG5hbWVzIGFmdGVyIHRoZSBtYWNybyBuYW1lLAorc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMuICBZb3UgY2FuIHN1cHBseSBhIGRlZmF1bHQgdmFsdWUgZm9yIGFueQorbWFjcm8gYXJndW1lbnQgYnkgZm9sbG93aW5nIHRoZSBuYW1lIHdpdGggQHNhbXB7PUB2YXJ7ZGVmbHR9fS4gIEZvcgorZXhhbXBsZSwgdGhlc2UgYXJlIGFsbCB2YWxpZCBAY29kZXsubWFjcm99IHN0YXRlbWVudHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLm1hY3JvIGNvbW0KK0JlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle2NvbW19LCB3aGljaCB0YWtlcyBubworYXJndW1lbnRzLgorCitAaXRlbSAubWFjcm8gcGx1czEgcCwgcDEKK0BpdGVteCAubWFjcm8gcGx1czEgcCBwMQorRWl0aGVyIHN0YXRlbWVudCBiZWdpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7cGx1czF9LAord2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czsgd2l0aGluIHRoZSBtYWNybyBkZWZpbml0aW9uLCB3cml0ZQorQHNhbXB7XHB9IG9yIEBzYW1we1xwMX0gdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cy4KKworQGl0ZW0gLm1hY3JvIHJlc2VydmVfc3RyIHAxPTAgcDIKK0JlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle3Jlc2VydmVfc3RyfSwgd2l0aCB0d28KK2FyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBoYXMgYSBkZWZhdWx0IHZhbHVlLCBidXQgbm90IHRoZSBzZWNvbmQuCitBZnRlciB0aGUgZGVmaW5pdGlvbiBpcyBjb21wbGV0ZSwgeW91IGNhbiBjYWxsIHRoZSBtYWNybyBlaXRoZXIgYXMKK0BzYW1we3Jlc2VydmVfc3RyIEB2YXJ7YX0sQHZhcntifX0gKHdpdGggQHNhbXB7XHAxfSBldmFsdWF0aW5nIHRvCitAdmFye2F9IGFuZCBAc2FtcHtccDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSksIG9yIGFzIEBzYW1we3Jlc2VydmVfc3RyCissQHZhcntifX0gKHdpdGggQHNhbXB7XHAxfSBldmFsdWF0aW5nIGFzIHRoZSBkZWZhdWx0LCBpbiB0aGlzIGNhc2UKK0BzYW1wezB9LCBhbmQgQHNhbXB7XHAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLgorQGVuZCB0YWJsZQorCitXaGVuIHlvdSBjYWxsIGEgbWFjcm8sIHlvdSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgdmFsdWVzIGVpdGhlciBieQorcG9zaXRpb24sIG9yIGJ5IGtleXdvcmQuICBGb3IgZXhhbXBsZSwgQHNhbXB7c3VtIDksMTd9IGlzIGVxdWl2YWxlbnQgdG8KK0BzYW1we3N1bSB0bz0xNywgZnJvbT05fS4KKworQGl0ZW0gLmVuZG0KK0BjaW5kZXggQGNvZGV7ZW5kbX0gZGlyZWN0aXZlCitNYXJrIHRoZSBlbmQgb2YgYSBtYWNybyBkZWZpbml0aW9uLgorCitAaXRlbSAuZXhpdG0KK0BjaW5kZXggQGNvZGV7ZXhpdG19IGRpcmVjdGl2ZQorRXhpdCBlYXJseSBmcm9tIHRoZSBjdXJyZW50IG1hY3JvIGRlZmluaXRpb24uCisKK0BjaW5kZXggbnVtYmVyIG9mIG1hY3JvcyBleGVjdXRlZAorQGNpbmRleCBtYWNyb3MsIGNvdW50IGV4ZWN1dGVkCitAaXRlbSBcQEAKK0Bjb2Rle0B2YWx1ZXtBU319IG1haW50YWlucyBhIGNvdW50ZXIgb2YgaG93IG1hbnkgbWFjcm9zIGl0IGhhcworZXhlY3V0ZWQgaW4gdGhpcyBwc2V1ZG8tdmFyaWFibGU7IHlvdSBjYW4gY29weSB0aGF0IG51bWJlciB0byB5b3VyCitvdXRwdXQgd2l0aCBAc2FtcHtcQEB9LCBidXQgQGVtcGh7b25seSB3aXRoaW4gYSBtYWNybyBkZWZpbml0aW9ufS4KKworQGlnbm9yZQorQGl0ZW0gTE9DQUwgQHZhcntuYW1lfSBbICwgQGRvdHN7fSBdCitAZW1waHtXYXJuaW5nOiBAY29kZXtMT0NBTH0gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCBgYGFsdGVybmF0ZQorbWFjcm8gc3ludGF4Jycgd2l0aCBAc2FtcHstYX0gb3IgQHNhbXB7LS1hbHRlcm5hdGV9Ln0gIEB4cmVme0FsdGVybmF0ZSwsCitBbHRlcm5hdGUgbWFjcm8gc3ludGF4fS4KKworR2VuZXJhdGUgYSBzdHJpbmcgcmVwbGFjZW1lbnQgZm9yIGVhY2ggb2YgdGhlIEB2YXJ7bmFtZX0gYXJndW1lbnRzLCBhbmQKK3JlcGxhY2UgYW55IGluc3RhbmNlcyBvZiBAdmFye25hbWV9IGluIGVhY2ggbWFjcm8gZXhwYW5zaW9uLiAgVGhlCityZXBsYWNlbWVudCBzdHJpbmcgaXMgdW5pcXVlIGluIHRoZSBhc3NlbWJseSwgYW5kIGRpZmZlcmVudCBmb3IgZWFjaAorc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9uLiAgQGNvZGV7TE9DQUx9IGFsbG93cyB5b3UgdG8gd3JpdGUgbWFjcm9zIHRoYXQKK2RlZmluZSBzeW1ib2xzLCB3aXRob3V0IGZlYXIgb2YgY29uZmxpY3QgYmV0d2VlbiBzZXBhcmF0ZSBtYWNybyBleHBhbnNpb25zLgorQGVuZCBpZ25vcmUKK0BlbmQgZnRhYmxlCisKK0Bub2RlIE5vbGlzdAorQHNlY3Rpb24gQGNvZGV7Lm5vbGlzdH0KKworQGNpbmRleCBAY29kZXtub2xpc3R9IGRpcmVjdGl2ZQorQGNpbmRleCBsaXN0aW5nIGNvbnRyb2wsIHR1cm5pbmcgb2ZmCitDb250cm9sIChpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBAY29kZXsubGlzdH0gZGlyZWN0aXZlKSB3aGV0aGVyIG9yCitub3QgYXNzZW1ibHkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZC4gIFRoZXNlIHR3byBkaXJlY3RpdmVzIG1haW50YWluIGFuCitpbnRlcm5hbCBjb3VudGVyICh3aGljaCBpcyB6ZXJvIGluaXRpYWxseSkuICAgQGNvZGV7Lmxpc3R9IGluY3JlbWVudHMgdGhlCitjb3VudGVyLCBhbmQgQGNvZGV7Lm5vbGlzdH0gZGVjcmVtZW50cyBpdC4gIEFzc2VtYmx5IGxpc3RpbmdzIGFyZQorZ2VuZXJhdGVkIHdoZW5ldmVyIHRoZSBjb3VudGVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCitAbm9kZSBPY3RhCitAc2VjdGlvbiBAY29kZXsub2N0YSBAdmFye2JpZ251bXN9fQorCitAYyBGSVhNRTogZG91YmxlIHNpemUgZW1pdHRlZCBmb3IgIm9jdGEiIG9uIGk5NjAsIG90aGVycz8gIE9yIHdhcm4/CitAY2luZGV4IEBjb2Rle29jdGF9IGRpcmVjdGl2ZQorQGNpbmRleCBpbnRlZ2VyLCAxNi1ieXRlCitAY2luZGV4IHNpeHRlZW4gYnl0ZSBpbnRlZ2VyCitUaGlzIGRpcmVjdGl2ZSBleHBlY3RzIHplcm8gb3IgbW9yZSBiaWdudW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yIGVhY2gKK2JpZ251bSwgaXQgZW1pdHMgYSAxNi1ieXRlIGludGVnZXIuCisKK1RoZSB0ZXJtIGBgb2N0YScnIGNvbWVzIGZyb20gY29udGV4dHMgaW4gd2hpY2ggYSBgYHdvcmQnJyBpcyB0d28gYnl0ZXM7CitoZW5jZSBAZW1waHtvY3RhfS13b3JkIGZvciAxNiBieXRlcy4KKworQG5vZGUgT3JnCitAc2VjdGlvbiBAY29kZXsub3JnIEB2YXJ7bmV3LWxjfSAsIEB2YXJ7ZmlsbH19CisKK0BjaW5kZXggQGNvZGV7b3JnfSBkaXJlY3RpdmUKK0BjaW5kZXggbG9jYXRpb24gY291bnRlciwgYWR2YW5jaW5nCitAY2luZGV4IGFkdmFuY2luZyBsb2NhdGlvbiBjb3VudGVyCitAY2luZGV4IGN1cnJlbnQgYWRkcmVzcywgYWR2YW5jaW5nCitBZHZhbmNlIHRoZSBsb2NhdGlvbiBjb3VudGVyIG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8KK0B2YXJ7bmV3LWxjfS4gIEB2YXJ7bmV3LWxjfSBpcyBlaXRoZXIgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBvciBhbgorZXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIGN1cnJlbnQgc3Vic2VjdGlvbi4gIFRoYXQgaXMsCit5b3UgY2FuJ3QgdXNlIEBjb2Rley5vcmd9IHRvIGNyb3NzIHNlY3Rpb25zOiBpZiBAdmFye25ldy1sY30gaGFzIHRoZQord3Jvbmcgc2VjdGlvbiwgdGhlIEBjb2Rley5vcmd9IGRpcmVjdGl2ZSBpcyBpZ25vcmVkLiAgVG8gYmUgY29tcGF0aWJsZQord2l0aCBmb3JtZXIgYXNzZW1ibGVycywgaWYgdGhlIHNlY3Rpb24gb2YgQHZhcntuZXctbGN9IGlzIGFic29sdXRlLAorQGNvZGV7QHZhbHVle0FTfX0gaXNzdWVzIGEgd2FybmluZywgdGhlbiBwcmV0ZW5kcyB0aGUgc2VjdGlvbiBvZiBAdmFye25ldy1sY30KK2lzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24uCisKK0Bjb2Rley5vcmd9IG1heSBvbmx5IGluY3JlYXNlIHRoZSBsb2NhdGlvbiBjb3VudGVyLCBvciBsZWF2ZSBpdAordW5jaGFuZ2VkOyB5b3UgY2Fubm90IHVzZSBAY29kZXsub3JnfSB0byBtb3ZlIHRoZSBsb2NhdGlvbiBjb3VudGVyCitiYWNrd2FyZHMuCisKK0BjIGRvdWJsZSBuZWdhdGl2ZSB1c2VkIGJlbG93ICJub3QgdW5kZWZpbmVkIiBiZWNhdXNlIHRoaXMgaXMgYSBzcGVjaWZpYworQGMgcmVmZXJlbmNlIHRvICJ1bmRlZmluZWQiIChhcyBTRUdfVU5LTk9XTiBpcyBjYWxsZWQgaW4gdGhpcyBtYW51YWwpCitAYyBzZWN0aW9uLiBkb2NAY3lnbnVzLmNvbSAxOGZlYjkxCitCZWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHRyaWVzIHRvIGFzc2VtYmxlIHByb2dyYW1zIGluIG9uZSBwYXNzLCBAdmFye25ldy1sY30KK21heSBub3QgYmUgdW5kZWZpbmVkLiAgSWYgeW91IHJlYWxseSBkZXRlc3QgdGhpcyByZXN0cmljdGlvbiB3ZSBlYWdlcmx5IGF3YWl0CithIGNoYW5jZSB0byBzaGFyZSB5b3VyIGltcHJvdmVkIGFzc2VtYmxlci4KKworQmV3YXJlIHRoYXQgdGhlIG9yaWdpbiBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIG5vdAordG8gdGhlIHN0YXJ0IG9mIHRoZSBzdWJzZWN0aW9uLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIKK3Blb3BsZSdzIGFzc2VtYmxlcnMuCisKK1doZW4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKG9mIHRoZSBjdXJyZW50IHN1YnNlY3Rpb24pIGlzIGFkdmFuY2VkLCB0aGUKK2ludGVydmVuaW5nIGJ5dGVzIGFyZSBmaWxsZWQgd2l0aCBAdmFye2ZpbGx9IHdoaWNoIHNob3VsZCBiZSBhbgorYWJzb2x1dGUgZXhwcmVzc2lvbi4gIElmIHRoZSBjb21tYSBhbmQgQHZhcntmaWxsfSBhcmUgb21pdHRlZCwKK0B2YXJ7ZmlsbH0gZGVmYXVsdHMgdG8gemVyby4KKworQG5vZGUgUDJhbGlnbgorQHNlY3Rpb24gQGNvZGV7LnAyYWxpZ25bd2xdIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19CisKK0BjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlciBnaXZlbiBhIHBvd2VyIG9mIHR3bworQGNpbmRleCBAY29kZXtwMmFsaWdufSBkaXJlY3RpdmUKK1BhZCB0aGUgbG9jYXRpb24gY291bnRlciAoaW4gdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgdG8gYSBwYXJ0aWN1bGFyCitzdG9yYWdlIGJvdW5kYXJ5LiAgVGhlIGZpcnN0IGV4cHJlc3Npb24gKHdoaWNoIG11c3QgYmUgYWJzb2x1dGUpIGlzIHRoZQorbnVtYmVyIG9mIGxvdy1vcmRlciB6ZXJvIGJpdHMgdGhlIGxvY2F0aW9uIGNvdW50ZXIgbXVzdCBoYXZlIGFmdGVyCithZHZhbmNlbWVudC4gIEZvciBleGFtcGxlIEBzYW1wey5wMmFsaWduIDN9IGFkdmFuY2VzIHRoZSBsb2NhdGlvbgorY291bnRlciB1bnRpbCBpdCBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlciBpcyBhbHJlYWR5IGEKK211bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCisKK1RoZSBzZWNvbmQgZXhwcmVzc2lvbiAoYWxzbyBhYnNvbHV0ZSkgZ2l2ZXMgdGhlIGZpbGwgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQorcGFkZGluZyBieXRlcy4gIEl0IChhbmQgdGhlIGNvbW1hKSBtYXkgYmUgb21pdHRlZC4gIElmIGl0IGlzIG9taXR0ZWQsIHRoZQorcGFkZGluZyBieXRlcyBhcmUgbm9ybWFsbHkgemVyby4gIEhvd2V2ZXIsIG9uIHNvbWUgc3lzdGVtcywgaWYgdGhlIHNlY3Rpb24gaXMKK21hcmtlZCBhcyBjb250YWluaW5nIGNvZGUgYW5kIHRoZSBmaWxsIHZhbHVlIGlzIG9taXR0ZWQsIHRoZSBzcGFjZSBpcyBmaWxsZWQKK3dpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zLgorCitUaGUgdGhpcmQgZXhwcmVzc2lvbiBpcyBhbHNvIGFic29sdXRlLCBhbmQgaXMgYWxzbyBvcHRpb25hbC4gIElmIGl0IGlzIHByZXNlbnQsCitpdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBieSB0aGlzIGFsaWdubWVudAorZGlyZWN0aXZlLiAgSWYgZG9pbmcgdGhlIGFsaWdubWVudCB3b3VsZCByZXF1aXJlIHNraXBwaW5nIG1vcmUgYnl0ZXMgdGhhbiB0aGUKK3NwZWNpZmllZCBtYXhpbXVtLCB0aGVuIHRoZSBhbGlnbm1lbnQgaXMgbm90IGRvbmUgYXQgYWxsLiAgWW91IGNhbiBvbWl0IHRoZQorZmlsbCB2YWx1ZSAodGhlIHNlY29uZCBhcmd1bWVudCkgZW50aXJlbHkgYnkgc2ltcGx5IHVzaW5nIHR3byBjb21tYXMgYWZ0ZXIgdGhlCityZXF1aXJlZCBhbGlnbm1lbnQ7IHRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgYWxpZ25tZW50IHRvIGJlIGZpbGxlZAord2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS4KKworQGNpbmRleCBAY29kZXtwMmFsaWdud30gZGlyZWN0aXZlCitAY2luZGV4IEBjb2Rle3AyYWxpZ25sfSBkaXJlY3RpdmUKK1RoZSBAY29kZXsucDJhbGlnbnd9IGFuZCBAY29kZXsucDJhbGlnbmx9IGRpcmVjdGl2ZXMgYXJlIHZhcmlhbnRzIG9mIHRoZQorQGNvZGV7LnAyYWxpZ259IGRpcmVjdGl2ZS4gIFRoZSBAY29kZXsucDJhbGlnbnd9IGRpcmVjdGl2ZSB0cmVhdHMgdGhlIGZpbGwKK3BhdHRlcm4gYXMgYSB0d28gYnl0ZSB3b3JkIHZhbHVlLiAgVGhlIEBjb2Rley5wMmFsaWdubH0gZGlyZWN0aXZlcyB0cmVhdHMgdGhlCitmaWxsIHBhdHRlcm4gYXMgYSBmb3VyIGJ5dGUgbG9uZ3dvcmQgdmFsdWUuICBGb3IgZXhhbXBsZSwgQGNvZGV7LnAyYWxpZ253CisyLDB4MzY4ZH0gd2lsbCBhbGlnbiB0byBhIG11bHRpcGxlIG9mIDQuICBJZiBpdCBza2lwcyB0d28gYnl0ZXMsIHRoZXkgd2lsbCBiZQorZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIDB4MzY4ZCAodGhlIGV4YWN0IHBsYWNlbWVudCBvZiB0aGUgYnl0ZXMgZGVwZW5kcyB1cG9uCit0aGUgZW5kaWFubmVzcyBvZiB0aGUgcHJvY2Vzc29yKS4gIElmIGl0IHNraXBzIDEgb3IgMyBieXRlcywgdGhlIGZpbGwgdmFsdWUgaXMKK3VuZGVmaW5lZC4KKworQG5vZGUgUHJpbnQKK0BzZWN0aW9uIEBjb2Rley5wcmludCBAdmFye3N0cmluZ319CisKK0BjaW5kZXggQGNvZGV7cHJpbnR9IGRpcmVjdGl2ZQorQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBwcmludCBAdmFye3N0cmluZ30gb24gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcKK2Fzc2VtYmx5LiAgWW91IG11c3QgcHV0IEB2YXJ7c3RyaW5nfSBpbiBkb3VibGUgcXVvdGVzLgorCitAbm9kZSBQc2l6ZQorQHNlY3Rpb24gQGNvZGV7LnBzaXplIEB2YXJ7bGluZXN9ICwgQHZhcntjb2x1bW5zfX0KKworQGNpbmRleCBAY29kZXtwc2l6ZX0gZGlyZWN0aXZlCitAY2luZGV4IGxpc3RpbmcgY29udHJvbDogcGFwZXIgc2l6ZQorQGNpbmRleCBwYXBlciBzaXplLCBmb3IgbGlzdGluZ3MKK1VzZSB0aGlzIGRpcmVjdGl2ZSB0byBkZWNsYXJlIHRoZSBudW1iZXIgb2YgbGluZXMtLS1hbmQsIG9wdGlvbmFsbHksIHRoZQorbnVtYmVyIG9mIGNvbHVtbnMtLS10byB1c2UgZm9yIGVhY2ggcGFnZSwgd2hlbiBnZW5lcmF0aW5nIGxpc3RpbmdzLgorCitJZiB5b3UgZG8gbm90IHVzZSBAY29kZXsucHNpemV9LCBsaXN0aW5ncyB1c2UgYSBkZWZhdWx0IGxpbmUtY291bnQKK29mIDYwLiAgWW91IG1heSBvbWl0IHRoZSBjb21tYSBhbmQgQHZhcntjb2x1bW5zfSBzcGVjaWZpY2F0aW9uOyB0aGUKK2RlZmF1bHQgd2lkdGggaXMgMjAwIGNvbHVtbnMuCisKK0Bjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBmb3JtZmVlZHMgd2hlbmV2ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKK2xpbmVzIGlzIGV4Y2VlZGVkIChvciB3aGVuZXZlciB5b3UgZXhwbGljaXRseSByZXF1ZXN0IG9uZSwgdXNpbmcKK0Bjb2Rley5lamVjdH0pLgorCitJZiB5b3Ugc3BlY2lmeSBAdmFye2xpbmVzfSBhcyBAY29kZXswfSwgbm8gZm9ybWZlZWRzIGFyZSBnZW5lcmF0ZWQgc2F2ZQordGhvc2UgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBAY29kZXsuZWplY3R9LgorCitAbm9kZSBQdXJnZW0KK0BzZWN0aW9uIEBjb2Rley5wdXJnZW0gQHZhcntuYW1lfX0KKworQGNpbmRleCBAY29kZXtwdXJnZW19IGRpcmVjdGl2ZQorVW5kZWZpbmUgdGhlIG1hY3JvIEB2YXJ7bmFtZX0sIHNvIHRoYXQgbGF0ZXIgdXNlcyBvZiB0aGUgc3RyaW5nIHdpbGwgbm90IGJlCitleHBhbmRlZC4gIEB4cmVme01hY3JvfS4KKworQG5vZGUgUXVhZAorQHNlY3Rpb24gQGNvZGV7LnF1YWQgQHZhcntiaWdudW1zfX0KKworQGNpbmRleCBAY29kZXtxdWFkfSBkaXJlY3RpdmUKK0Bjb2Rley5xdWFkfSBleHBlY3RzIHplcm8gb3IgbW9yZSBiaWdudW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yCitlYWNoIGJpZ251bSwgaXQgZW1pdHMKK0BpZmNsZWFyIGJpZ251bS0xNgorYW4gOC1ieXRlIGludGVnZXIuICBJZiB0aGUgYmlnbnVtIHdvbid0IGZpdCBpbiA4IGJ5dGVzLCBpdCBwcmludHMgYQord2FybmluZyBtZXNzYWdlOyBhbmQganVzdCB0YWtlcyB0aGUgbG93ZXN0IG9yZGVyIDggYnl0ZXMgb2YgdGhlIGJpZ251bS4KK0BjaW5kZXggZWlnaHQtYnl0ZSBpbnRlZ2VyCitAY2luZGV4IGludGVnZXIsIDgtYnl0ZQorCitUaGUgdGVybSBgYHF1YWQnJyBjb21lcyBmcm9tIGNvbnRleHRzIGluIHdoaWNoIGEgYGB3b3JkJycgaXMgdHdvIGJ5dGVzOworaGVuY2UgQGVtcGh7cXVhZH0td29yZCBmb3IgOCBieXRlcy4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IGJpZ251bS0xNgorYSAxNi1ieXRlIGludGVnZXIuICBJZiB0aGUgYmlnbnVtIHdvbid0IGZpdCBpbiAxNiBieXRlcywgaXQgcHJpbnRzIGEKK3dhcm5pbmcgbWVzc2FnZTsgYW5kIGp1c3QgdGFrZXMgdGhlIGxvd2VzdCBvcmRlciAxNiBieXRlcyBvZiB0aGUgYmlnbnVtLgorQGNpbmRleCBzaXh0ZWVuLWJ5dGUgaW50ZWdlcgorQGNpbmRleCBpbnRlZ2VyLCAxNi1ieXRlCitAZW5kIGlmc2V0CisKK0Bub2RlIFJlcHQKK0BzZWN0aW9uIEBjb2Rley5yZXB0IEB2YXJ7Y291bnR9fQorCitAY2luZGV4IEBjb2Rle3JlcHR9IGRpcmVjdGl2ZQorUmVwZWF0IHRoZSBzZXF1ZW5jZSBvZiBsaW5lcyBiZXR3ZWVuIHRoZSBAY29kZXsucmVwdH0gZGlyZWN0aXZlIGFuZCB0aGUgbmV4dAorQGNvZGV7LmVuZHJ9IGRpcmVjdGl2ZSBAdmFye2NvdW50fSB0aW1lcy4KKworRm9yIGV4YW1wbGUsIGFzc2VtYmxpbmcKKworQGV4YW1wbGUKKyAgICAgICAgLnJlcHQgICAzCisgICAgICAgIC5sb25nICAgMAorICAgICAgICAuZW5kcgorQGVuZCBleGFtcGxlCisKK2lzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZworCitAZXhhbXBsZQorICAgICAgICAubG9uZyAgIDAKKyAgICAgICAgLmxvbmcgICAwCisgICAgICAgIC5sb25nICAgMAorQGVuZCBleGFtcGxlCisKK0Bub2RlIFNidHRsCitAc2VjdGlvbiBAY29kZXsuc2J0dGwgIkB2YXJ7c3ViaGVhZGluZ30ifQorCitAY2luZGV4IEBjb2Rle3NidHRsfSBkaXJlY3RpdmUKK0BjaW5kZXggc3VidGl0bGVzIGZvciBsaXN0aW5ncworQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHN1YnRpdGxlCitVc2UgQHZhcntzdWJoZWFkaW5nfSBhcyB0aGUgdGl0bGUgKHRoaXJkIGxpbmUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQordGl0bGUgbGluZSkgd2hlbiBnZW5lcmF0aW5nIGFzc2VtYmx5IGxpc3RpbmdzLgorCitUaGlzIGRpcmVjdGl2ZSBhZmZlY3RzIHN1YnNlcXVlbnQgcGFnZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcGFnZSBpZgoraXQgYXBwZWFycyB3aXRoaW4gdGVuIGxpbmVzIG9mIHRoZSB0b3Agb2YgYSBwYWdlLgorCitAaWZzZXQgQ09GRgorQG5vZGUgU2NsCitAc2VjdGlvbiBAY29kZXsuc2NsIEB2YXJ7Y2xhc3N9fQorCitAY2luZGV4IEBjb2Rle3NjbH0gZGlyZWN0aXZlCitAY2luZGV4IHN5bWJvbCBzdG9yYWdlIGNsYXNzIChDT0ZGKQorQGNpbmRleCBDT0ZGIHN5bWJvbCBzdG9yYWdlIGNsYXNzCitTZXQgdGhlIHN0b3JhZ2UtY2xhc3MgdmFsdWUgZm9yIGEgc3ltYm9sLiAgVGhpcyBkaXJlY3RpdmUgbWF5IG9ubHkgYmUKK3VzZWQgaW5zaWRlIGEgQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlyLiAgU3RvcmFnZSBjbGFzcyBtYXkgZmxhZword2hldGhlciBhIHN5bWJvbCBpcyBzdGF0aWMgb3IgZXh0ZXJuYWwsIG9yIGl0IG1heSByZWNvcmQgZnVydGhlcgorc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorQGlmc2V0IEJPVVQKKworVGhlIEBzYW1wey5zY2x9IGRpcmVjdGl2ZSBpcyBwcmltYXJpbHkgYXNzb2NpYXRlZCB3aXRoIENPRkYgb3V0cHV0OyB3aGVuCitjb25maWd1cmVkIHRvIGdlbmVyYXRlIEBjb2Rle2Iub3V0fSBvdXRwdXQgZm9ybWF0LCBAY29kZXtAdmFsdWV7QVN9fQorYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQG5vZGUgU2VjdGlvbgorQHNlY3Rpb24gQGNvZGV7LnNlY3Rpb24gQHZhcntuYW1lfX0KKworQGNpbmRleCBAY29kZXtzZWN0aW9ufSBkaXJlY3RpdmUKK0BjaW5kZXggbmFtZWQgc2VjdGlvbgorVXNlIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIHRvIGFzc2VtYmxlIHRoZSBmb2xsb3dpbmcgY29kZSBpbnRvIGEgc2VjdGlvbgorbmFtZWQgQHZhcntuYW1lfS4KKworVGhpcyBkaXJlY3RpdmUgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHRhcmdldHMgdGhhdCBhY3R1YWxseSBzdXBwb3J0IGFyYml0cmFyaWx5CituYW1lZCBzZWN0aW9uczsgb24gQGNvZGV7YS5vdXR9IHRhcmdldHMsIGZvciBleGFtcGxlLCBpdCBpcyBub3QgYWNjZXB0ZWQsIGV2ZW4KK3dpdGggYSBzdGFuZGFyZCBAY29kZXthLm91dH0gc2VjdGlvbiBuYW1lLgorCitAaWZzZXQgQ09GRgorRm9yIENPRkYgdGFyZ2V0cywgdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgaXMgdXNlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZword2F5czoKK0BzbWFsbGV4YW1wbGUKKy5zZWN0aW9uIEB2YXJ7bmFtZX1bLCAiQHZhcntmbGFnc30iXQorLnNlY3Rpb24gQHZhcntuYW1lfVssIEB2YXJ7c3Vic2VnbWVudH1dCitAZW5kIHNtYWxsZXhhbXBsZQorCitJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaXMgcXVvdGVkLCBpdCBpcyB0YWtlbiBhcyBmbGFncyB0byB1c2UgZm9yIHRoZQorc2VjdGlvbi4gIEVhY2ggZmxhZyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuICBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSByZWNvZ25pemVkOgorQHRhYmxlIEBjb2RlCitAaXRlbSBiCitic3Mgc2VjdGlvbiAodW5pbml0aWFsaXplZCBkYXRhKQorQGl0ZW0gbgorc2VjdGlvbiBpcyBub3QgbG9hZGVkCitAaXRlbSB3Cit3cml0YWJsZSBzZWN0aW9uCitAaXRlbSBkCitkYXRhIHNlY3Rpb24KK0BpdGVtIHIKK3JlYWQtb25seSBzZWN0aW9uCitAaXRlbSB4CitleGVjdXRhYmxlIHNlY3Rpb24KK0BlbmQgdGFibGUKKworSWYgbm8gZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgZmxhZ3MgZGVwZW5kIHVwb24gdGhlIHNlY3Rpb24gbmFtZS4gIElmCit0aGUgc2VjdGlvbiBuYW1lIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgZGVmYXVsdCB3aWxsIGJlIGZvciB0aGUgc2VjdGlvbiB0byBiZQorbG9hZGVkIGFuZCB3cml0YWJsZS4KKworSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRoZSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIGlzIG5vdCBxdW90ZWQsIGl0IGlzCit0YWtlbiBhcyBhIHN1YnNlZ21lbnQgbnVtYmVyIChAcHhyZWZ7U3ViLVNlY3Rpb25zfSkuCitAZW5kIGlmc2V0CisKK0BpZnNldCBFTEYKK0ZvciBFTEYgdGFyZ2V0cywgdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgaXMgdXNlZCBsaWtlIHRoaXM6CitAc21hbGxleGFtcGxlCisuc2VjdGlvbiBAdmFye25hbWV9WywgIkB2YXJ7ZmxhZ3N9IlssIEBAQHZhcnt0eXBlfV1dCitAZW5kIHNtYWxsZXhhbXBsZQorVGhlIG9wdGlvbmFsIEB2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGlzIGEgcXVvdGVkIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBhbnkKK2NvbWJpbnRpb24gb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgorQHRhYmxlIEBjb2RlCitAaXRlbSBhCitzZWN0aW9uIGlzIGFsbG9jYXRhYmxlCitAaXRlbSB3CitzZWN0aW9uIGlzIHdyaXRhYmxlCitAaXRlbSB4CitzZWN0aW9uIGlzIGV4ZWN1dGFibGUKK0BlbmQgdGFibGUKKworVGhlIG9wdGlvbmFsIEB2YXJ7dHlwZX0gYXJndW1lbnQgbWF5IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorQHRhYmxlIEBjb2RlCitAaXRlbSBAQHByb2diaXRzCitzZWN0aW9uIGNvbnRhaW5zIGRhdGEKK0BpdGVtIEBAbm9iaXRzCitzZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gZGF0YSAoaS5lLiwgc2VjdGlvbiBvbmx5IG9jY3VwaWVzIHNwYWNlKQorQGVuZCB0YWJsZQorCitJZiBubyBmbGFncyBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBmbGFncyBkZXBlbmQgdXBvbiB0aGUgc2VjdGlvbiBuYW1lLiAgSWYKK3RoZSBzZWN0aW9uIG5hbWUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBkZWZhdWx0IHdpbGwgYmUgZm9yIHRoZSBzZWN0aW9uIHRvIGhhdmUKK25vbmUgb2YgdGhlIGFib3ZlIGZsYWdzOiBpdCB3aWxsIG5vdCBiZSBhbGxvY2F0ZWQgaW4gbWVtb3J5LCBub3Igd3JpdGFibGUsIG5vcgorZXhlY3V0YWJsZS4gIFRoZSBzZWN0aW9uIHdpbGwgY29udGFpbiBkYXRhLgorCitGb3IgRUxGIHRhcmdldHMsIHRoZSBhc3NlbWJsZXIgc3VwcG9ydHMgYW5vdGhlciB0eXBlIG9mIEBjb2Rley5zZWN0aW9ufQorZGlyZWN0aXZlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgYXNzZW1ibGVyOgorQHNtYWxsZXhhbXBsZQorLnNlY3Rpb24gIkB2YXJ7bmFtZX0iWywgQHZhcntmbGFnc30uLi5dCitAZW5kIHNtYWxsZXhhbXBsZQorTm90ZSB0aGF0IHRoZSBzZWN0aW9uIG5hbWUgaXMgcXVvdGVkLiAgVGhlcmUgbWF5IGJlIGEgc2VxdWVuY2Ugb2YgY29tbWEKK3NlcGFyYXRlZCBmbGFnczoKK0B0YWJsZSBAY29kZQorQGl0ZW0gI2FsbG9jCitzZWN0aW9uIGlzIGFsbG9jYXRhYmxlCitAaXRlbSAjd3JpdGUKK3NlY3Rpb24gaXMgd3JpdGFibGUKK0BpdGVtICNleGVjaW5zdHIKK3NlY3Rpb24gaXMgZXhlY3V0YWJsZQorQGVuZCB0YWJsZQorQGVuZCBpZnNldAorCitAbm9kZSBTZXQKK0BzZWN0aW9uIEBjb2Rley5zZXQgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQorCitAY2luZGV4IEBjb2Rle3NldH0gZGlyZWN0aXZlCitAY2luZGV4IHN5bWJvbCB2YWx1ZSwgc2V0dGluZworU2V0IHRoZSB2YWx1ZSBvZiBAdmFye3N5bWJvbH0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoaXMKK2NoYW5nZXMgQHZhcntzeW1ib2x9J3MgdmFsdWUgYW5kIHR5cGUgdG8gY29uZm9ybSB0bworQHZhcntleHByZXNzaW9ufS4gIElmIEB2YXJ7c3ltYm9sfSB3YXMgZmxhZ2dlZCBhcyBleHRlcm5hbCwgaXQgcmVtYWlucworZmxhZ2dlZCAoQHB4cmVme1N5bWJvbCBBdHRyaWJ1dGVzfSkuCisKK1lvdSBtYXkgQGNvZGV7LnNldH0gYSBzeW1ib2wgbWFueSB0aW1lcyBpbiB0aGUgc2FtZSBhc3NlbWJseS4KKworSWYgeW91IEBjb2Rley5zZXR9IGEgZ2xvYmFsIHN5bWJvbCwgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgb2JqZWN0CitmaWxlIGlzIHRoZSBsYXN0IHZhbHVlIHN0b3JlZCBpbnRvIGl0LgorCitAaWZzZXQgSFBQQQorVGhlIHN5bnRheCBmb3IgQGNvZGV7c2V0fSBvbiB0aGUgSFBQQSBpcworQHNhbXB7QHZhcntzeW1ib2x9IC5zZXQgQHZhcntleHByZXNzaW9ufX0uCitAZW5kIGlmc2V0CisKK0Bub2RlIFNob3J0CitAc2VjdGlvbiBAY29kZXsuc2hvcnQgQHZhcntleHByZXNzaW9uc319CisKK0BjaW5kZXggQGNvZGV7c2hvcnR9IGRpcmVjdGl2ZQorQGlmc2V0IEdFTkVSSUMKK0Bjb2Rley5zaG9ydH0gaXMgbm9ybWFsbHkgdGhlIHNhbWUgYXMgQHNhbXB7LndvcmR9LgorQHhyZWZ7V29yZCwsQGNvZGV7LndvcmR9fS4KKworSW4gc29tZSBjb25maWd1cmF0aW9ucywgaG93ZXZlciwgQGNvZGV7LnNob3J0fSBhbmQgQGNvZGV7LndvcmR9IGdlbmVyYXRlCitudW1iZXJzIG9mIGRpZmZlcmVudCBsZW5ndGhzOyBAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgorQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IFcxNgorQGNvZGV7LnNob3J0fSBpcyB0aGUgc2FtZSBhcyBAc2FtcHsud29yZH0uICBAeHJlZntXb3JkLCxAY29kZXsud29yZH19LgorQGVuZCBpZnNldAorQGlmc2V0IFczMgorVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgYW5kIGVtaXRzCithIDE2IGJpdCBudW1iZXIgZm9yIGVhY2guCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQG5vZGUgU2luZ2xlCitAc2VjdGlvbiBAY29kZXsuc2luZ2xlIEB2YXJ7ZmxvbnVtc319CisKK0BjaW5kZXggQGNvZGV7c2luZ2xlfSBkaXJlY3RpdmUKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAoc2luZ2xlKQorVGhpcyBkaXJlY3RpdmUgYXNzZW1ibGVzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKK2hhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LmZsb2F0fS4KK0BpZnNldCBHRU5FUklDCitUaGUgZXhhY3Qga2luZCBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGVtaXR0ZWQgZGVwZW5kcyBvbiBob3cKK0Bjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQuICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAaWZzZXQgSUVFRUZMT0FUCitPbiB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5LCBAY29kZXsuc2luZ2xlfSBlbWl0cyAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKK251bWJlcnMgaW4gQHNje2llZWV9IGZvcm1hdC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitAaWZzZXQgQ09GRgorQG5vZGUgU2l6ZQorQHNlY3Rpb24gQGNvZGV7LnNpemV9CisKK0BjaW5kZXggQGNvZGV7c2l6ZX0gZGlyZWN0aXZlCitUaGlzIGRpcmVjdGl2ZSBpcyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzIHRvIGluY2x1ZGUgYXV4aWxpYXJ5IGRlYnVnZ2luZworaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEl0IGlzIG9ubHkgcGVybWl0dGVkIGluc2lkZQorQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycy4KK0BpZnNldCBCT1VUCisKK0BzYW1wey5zaXplfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgorQGNvZGV7QHZhbHVle0FTfX0gaXMgZ2VuZXJhdGluZyBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0CitpZ25vcmVzIGl0LgorQGVuZCBpZnNldAorQGVuZCBpZnNldAorCitAbm9kZSBTbGViMTI4CitAc2VjdGlvbiBAY29kZXsuc2xlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KKworQGNpbmRleCBAY29kZXtzbGViMTI4fSBkaXJlY3RpdmUKK0B2YXJ7c2xlYjEyOH0gc3RhbmRzIGZvciBgYHNpZ25lZCBsaXR0bGUgZW5kaWFuIGJhc2UgMTI4LicnICBUaGlzIGlzIGEgCitjb21wYWN0LCB2YXJpYWJsZSBsZW5ndGggcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyB1c2VkIGJ5IHRoZSBEV0FSRgorc3ltYm9saWMgZGVidWdnaW5nIGZvcm1hdC4gIEB4cmVme1VsZWIxMjgsQGNvZGV7LnVsZWIxMjh9fS4KKworQGlmY2xlYXIgbm8tc3BhY2UtZGlyCitAbm9kZSBTa2lwCitAc2VjdGlvbiBAY29kZXsuc2tpcCBAdmFye3NpemV9ICwgQHZhcntmaWxsfX0KKworQGNpbmRleCBAY29kZXtza2lwfSBkaXJlY3RpdmUKK0BjaW5kZXggZmlsbGluZyBtZW1vcnkKK1RoaXMgZGlyZWN0aXZlIGVtaXRzIEB2YXJ7c2l6ZX0gYnl0ZXMsIGVhY2ggb2YgdmFsdWUgQHZhcntmaWxsfS4gIEJvdGgKK0B2YXJ7c2l6ZX0gYW5kIEB2YXJ7ZmlsbH0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgSWYgdGhlIGNvbW1hIGFuZAorQHZhcntmaWxsfSBhcmUgb21pdHRlZCwgQHZhcntmaWxsfSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uICBUaGlzIGlzIHRoZSBzYW1lIGFzCitAc2FtcHsuc3BhY2V9LgorCitAbm9kZSBTcGFjZQorQHNlY3Rpb24gQGNvZGV7LnNwYWNlIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9fQorCitAY2luZGV4IEBjb2Rle3NwYWNlfSBkaXJlY3RpdmUKK0BjaW5kZXggZmlsbGluZyBtZW1vcnkKK1RoaXMgZGlyZWN0aXZlIGVtaXRzIEB2YXJ7c2l6ZX0gYnl0ZXMsIGVhY2ggb2YgdmFsdWUgQHZhcntmaWxsfS4gIEJvdGgKK0B2YXJ7c2l6ZX0gYW5kIEB2YXJ7ZmlsbH0gYXJlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgSWYgdGhlIGNvbW1hCithbmQgQHZhcntmaWxsfSBhcmUgb21pdHRlZCwgQHZhcntmaWxsfSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uICBUaGlzIGlzIHRoZSBzYW1lCithcyBAc2FtcHsuc2tpcH0uCisKK0BpZnNldCBIUFBBCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gQGNvZGV7LnNwYWNlfSBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBtZWFuaW5nIGZvciBIUFBBCit0YXJnZXRzOyB1c2UgQGNvZGV7LmJsb2NrfSBhcyBhIHN1YnN0aXR1dGUuICBTZWUgQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAKK0Fzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9IChIUCA5MjQzMi05MDAwMSkgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQorQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuICBAeHJlZntIUFBBIERpcmVjdGl2ZXMsLEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXN9LAorZm9yIGEgc3VtbWFyeS4KK0BlbmQgcXVvdGF0aW9uCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQGlmc2V0IEEyOUsKK0BpZmNsZWFyIEdFTkVSSUMKK0Bub2RlIFNwYWNlCitAc2VjdGlvbiBAY29kZXsuc3BhY2V9CitAY2luZGV4IEBjb2Rle3NwYWNlfSBkaXJlY3RpdmUKK0BlbmQgaWZjbGVhcgorT24gdGhlIEFNRCAyOUssIHRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvcgorY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEFNRCAyOUsgYXNzZW1ibGVycy4KKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IEluIG1vc3QgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgdGhlIGRpcmVjdGl2ZQorQGNvZGV7LnNwYWNlfSBoYXMgdGhlIGVmZmVjdCBvZiBAY29kZXsuYmxvY2t9ICBAeHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCitAZW5kIHF1b3RhdGlvbgorQGVuZCBpZnNldAorCitAaWZzZXQgaGF2ZS1zdGFicworQG5vZGUgU3RhYgorQHNlY3Rpb24gQGNvZGV7LnN0YWJkLCAuc3RhYm4sIC5zdGFic30KKworQGNpbmRleCBzeW1ib2xpYyBkZWJ1Z2dlcnMsIGluZm9ybWF0aW9uIGZvcgorQGNpbmRleCBAY29kZXtzdGFiQHZhcnt4fX0gZGlyZWN0aXZlcworVGhlcmUgYXJlIHRocmVlIGRpcmVjdGl2ZXMgdGhhdCBiZWdpbiBAc2FtcHsuc3RhYn0uCitBbGwgZW1pdCBzeW1ib2xzIChAcHhyZWZ7U3ltYm9sc30pLCBmb3IgdXNlIGJ5IHN5bWJvbGljIGRlYnVnZ2Vycy4KK1RoZSBzeW1ib2xzIGFyZSBub3QgZW50ZXJlZCBpbiB0aGUgQGNvZGV7QHZhbHVle0FTfX0gaGFzaCB0YWJsZTogdGhleQorY2Fubm90IGJlIHJlZmVyZW5jZWQgZWxzZXdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZS4KK1VwIHRvIGZpdmUgZmllbGRzIGFyZSByZXF1aXJlZDoKKworQHRhYmxlIEB2YXIKK0BpdGVtIHN0cmluZworVGhpcyBpcyB0aGUgc3ltYm9sJ3MgbmFtZS4gIEl0IG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0CitAc2FtcHtcMDAwfSwgc28gaXMgbW9yZSBnZW5lcmFsIHRoYW4gb3JkaW5hcnkgc3ltYm9sIG5hbWVzLiAgU29tZQorZGVidWdnZXJzIHVzZWQgdG8gY29kZSBhcmJpdHJhcmlseSBjb21wbGV4IHN0cnVjdHVyZXMgaW50byBzeW1ib2wgbmFtZXMKK3VzaW5nIHRoaXMgZmllbGQuCisKK0BpdGVtIHR5cGUKK0FuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgc3ltYm9sJ3MgdHlwZSBpcyBzZXQgdG8gdGhlIGxvdyA4IGJpdHMgb2YKK3RoaXMgZXhwcmVzc2lvbi4gIEFueSBiaXQgcGF0dGVybiBpcyBwZXJtaXR0ZWQsIGJ1dCBAY29kZXtAdmFsdWV7TER9fQorYW5kIGRlYnVnZ2VycyBjaG9rZSBvbiBzaWxseSBiaXQgcGF0dGVybnMuCisKK0BpdGVtIG90aGVyCitBbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIHN5bWJvbCdzIGBgb3RoZXInJyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRoZQorbG93IDggYml0cyBvZiB0aGlzIGV4cHJlc3Npb24uCisKK0BpdGVtIGRlc2MKK0FuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgc3ltYm9sJ3MgZGVzY3JpcHRvciBpcyBzZXQgdG8gdGhlIGxvdyAxNgorYml0cyBvZiB0aGlzIGV4cHJlc3Npb24uCisKK0BpdGVtIHZhbHVlCitBbiBhYnNvbHV0ZSBleHByZXNzaW9uIHdoaWNoIGJlY29tZXMgdGhlIHN5bWJvbCdzIHZhbHVlLgorQGVuZCB0YWJsZQorCitJZiBhIHdhcm5pbmcgaXMgZGV0ZWN0ZWQgd2hpbGUgcmVhZGluZyBhIEBjb2Rley5zdGFiZH0sIEBjb2Rley5zdGFibn0sCitvciBAY29kZXsuc3RhYnN9IHN0YXRlbWVudCwgdGhlIHN5bWJvbCBoYXMgcHJvYmFibHkgYWxyZWFkeSBiZWVuIGNyZWF0ZWQ7Cit5b3UgZ2V0IGEgaGFsZi1mb3JtZWQgc3ltYm9sIGluIHlvdXIgb2JqZWN0IGZpbGUuICBUaGlzIGlzCitjb21wYXRpYmxlIHdpdGggZWFybGllciBhc3NlbWJsZXJzIQorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7c3RhYmR9IGRpcmVjdGl2ZQorQGl0ZW0gLnN0YWJkIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30KKworVGhlIGBgbmFtZScnIG9mIHRoZSBzeW1ib2wgZ2VuZXJhdGVkIGlzIG5vdCBldmVuIGFuIGVtcHR5IHN0cmluZy4KK0l0IGlzIGEgbnVsbCBwb2ludGVyLCBmb3IgY29tcGF0aWJpbGl0eS4gIE9sZGVyIGFzc2VtYmxlcnMgdXNlZCBhCitudWxsIHBvaW50ZXIgc28gdGhleSBkaWRuJ3Qgd2FzdGUgc3BhY2UgaW4gb2JqZWN0IGZpbGVzIHdpdGggZW1wdHkKK3N0cmluZ3MuCisKK1RoZSBzeW1ib2wncyB2YWx1ZSBpcyBzZXQgdG8gdGhlIGxvY2F0aW9uIGNvdW50ZXIsCityZWxvY2F0YWJseS4gIFdoZW4geW91ciBwcm9ncmFtIGlzIGxpbmtlZCwgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sCitpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24gY291bnRlciB3aGVuIHRoZSBAY29kZXsuc3RhYmR9IHdhcworYXNzZW1ibGVkLgorCitAY2luZGV4IEBjb2Rle3N0YWJufSBkaXJlY3RpdmUKK0BpdGVtIC5zdGFibiBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9ICwgQHZhcnt2YWx1ZX0KK1RoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcgQGNvZGV7IiJ9LgorCitAY2luZGV4IEBjb2Rle3N0YWJzfSBkaXJlY3RpdmUKK0BpdGVtIC5zdGFicyBAdmFye3N0cmluZ30gLCAgQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfSAsIEB2YXJ7dmFsdWV9CitBbGwgZml2ZSBmaWVsZHMgYXJlIHNwZWNpZmllZC4KK0BlbmQgdGFibGUKK0BlbmQgaWZzZXQKK0BjIGVuZCAgICAgaGF2ZS1zdGFicworCitAbm9kZSBTdHJpbmcKK0BzZWN0aW9uIEBjb2Rley5zdHJpbmd9ICJAdmFye3N0cn0iCisKK0BjaW5kZXggc3RyaW5nLCBjb3B5aW5nIHRvIG9iamVjdCBmaWxlCitAY2luZGV4IEBjb2Rle3N0cmluZ30gZGlyZWN0aXZlCisKK0NvcHkgdGhlIGNoYXJhY3RlcnMgaW4gQHZhcntzdHJ9IHRvIHRoZSBvYmplY3QgZmlsZS4gIFlvdSBtYXkgc3BlY2lmeSBtb3JlIHRoYW4KK29uZSBzdHJpbmcgdG8gY29weSwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGZvciBhCitwYXJ0aWN1bGFyIG1hY2hpbmUsIHRoZSBhc3NlbWJsZXIgbWFya3MgdGhlIGVuZCBvZiBlYWNoIHN0cmluZyB3aXRoIGEgMCBieXRlLgorWW91IGNhbiB1c2UgYW55IG9mIHRoZSBlc2NhcGUgc2VxdWVuY2VzIGRlc2NyaWJlZCBpbiBAcmVme1N0cmluZ3MsLFN0cmluZ3N9LgorCitAbm9kZSBTdHJ1Y3QKK0BzZWN0aW9uIEBjb2Rley5zdHJ1Y3QgQHZhcntleHByZXNzaW9ufX0KKworQGNpbmRleCBAY29kZXtzdHJ1Y3R9IGRpcmVjdGl2ZQorU3dpdGNoIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBhbmQgc2V0IHRoZSBzZWN0aW9uIG9mZnNldCB0byBAdmFye2V4cHJlc3Npb259LAord2hpY2ggbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgWW91IG1pZ2h0IHVzZSB0aGlzIGFzIGZvbGxvd3M6CitAc21hbGxleGFtcGxlCisgICAgICAgIC5zdHJ1Y3QgMAorZmllbGQxOgorICAgICAgICAuc3RydWN0IGZpZWxkMSArIDQKK2ZpZWxkMjoKKyAgICAgICAgLnN0cnVjdCBmaWVsZDIgKyA0CitmaWVsZDM6CitAZW5kIHNtYWxsZXhhbXBsZQorVGhpcyB3b3VsZCBkZWZpbmUgdGhlIHN5bWJvbCBAY29kZXtmaWVsZDF9IHRvIGhhdmUgdGhlIHZhbHVlIDAsIHRoZSBzeW1ib2wKK0Bjb2Rle2ZpZWxkMn0gdG8gaGF2ZSB0aGUgdmFsdWUgNCwgYW5kIHRoZSBzeW1ib2wgQGNvZGV7ZmllbGQzfSB0byBoYXZlIHRoZQordmFsdWUgOC4gIEFzc2VtYmx5IHdvdWxkIGJlIGxlZnQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIGFuZCB5b3Ugd291bGQgbmVlZCB0bwordXNlIGEgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBvZiBzb21lIHNvcnQgdG8gY2hhbmdlIHRvIHNvbWUgb3RoZXIgc2VjdGlvbgorYmVmb3JlIGZ1cnRoZXIgYXNzZW1ibHkuCisKK0BpZnNldCBFTEYKK0Bub2RlIFN5bXZlcgorQHNlY3Rpb24gQGNvZGV7LnN5bXZlcn0KK0BjaW5kZXggQGNvZGV7c3ltdmVyfSBkaXJlY3RpdmUKK0BjaW5kZXggc3ltYm9sIHZlcnNpb25pbmcKK0BjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scworVXNlIHRoZSBAY29kZXsuc3ltdmVyfSBkaXJlY3RpdmUgdG8gYmluZCBzeW1ib2xzIHRvIHNwZWNpZmljIHZlcnNpb24gbm9kZXMKK3dpdGhpbiBhIHNvdXJjZSBmaWxlLiAgVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgcGxhdGZvcm1zLCBhbmQgaXMKK3R5cGljYWxseSB1c2VkIHdoZW4gYXNzZW1ibGluZyBmaWxlcyB0byBiZSBsaW5rZWQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LgorVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGl0IG1heSBtYWtlIHNlbnNlIHRvIHVzZSB0aGlzIGluIG9iamVjdHMgdG8gYmUgYm91bmQKK2ludG8gYW4gYXBwbGljYXRpb24gaXRzZWxmIHNvIGFzIHRvIG92ZXJyaWRlIGEgdmVyc2lvbmVkIHN5bWJvbCBmcm9tIGEKK3NoYXJlZCBsaWJyYXJ5LgorCitGb3IgRUxGIHRhcmdldHMsIHRoZSBAY29kZXsuc3ltdmVyfSBkaXJlY3RpdmUgaXMgdXNlZCBsaWtlIHRoaXM6CitAc21hbGxleGFtcGxlCisuc3ltdmVyIEB2YXJ7bmFtZX0sIEB2YXJ7bmFtZTJAQG5vZGVuYW1lfQorQGVuZCBzbWFsbGV4YW1wbGUKK0luIHRoaXMgY2FzZSwgdGhlIHN5bWJvbCBAdmFye25hbWV9IG11c3QgZXhpc3QgYW5kIGJlIGRlZmluZWQgd2l0aGluIHRoZSBmaWxlCitiZWluZyBhc3NlbWJsZWQuICBUaGUgQGNvZGV7LnZlcnN5bX0gZGlyZWN0aXZlIGVmZmVjdGl2ZWx5IGNyZWF0ZXMgYSBzeW1ib2wKK2FsaWFzIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lMkBAbm9kZW5hbWV9LCBhbmQgaW4gZmFjdCB0aGUgbWFpbiByZWFzb24gdGhhdCB3ZQoranVzdCBkb24ndCB0cnkgYW5kIGNyZWF0ZSBhIHJlZ3VsYXIgYWxpYXMgaXMgdGhhdCB0aGUgQHZhcntAQH0gY2hhcmFjdGVyIGlzbid0CitwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgVGhlIEB2YXJ7bmFtZTJ9IHBhcnQgb2YgdGhlIG5hbWUgaXMgdGhlIGFjdHVhbCBuYW1lCitvZiB0aGUgc3ltYm9sIGJ5IHdoaWNoIGl0IHdpbGwgYmUgZXh0ZXJuYWxseSByZWZlcmVuY2VkLiAgVGhlIG5hbWUgQHZhcntuYW1lfQoraXRzZWxmIGlzIG1lcmVseSBhIG5hbWUgb2YgY29udmVuaWVuY2UgdGhhdCBpcyB1c2VkIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KK2hhdmUgZGVmaW5pdGlvbnMgZm9yIG11bHRpcGxlIHZlcnNpb25zIG9mIGEgZnVuY3Rpb24gd2l0aGluIGEgc2luZ2xlIHNvdXJjZQorZmlsZSwgYW5kIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiB1bmFtYmlndW91c2x5IGtub3cgd2hpY2ggdmVyc2lvbiBvZiBhCitmdW5jdGlvbiBpcyBiZWluZyBtZW50aW9uZWQuICBUaGUgQHZhcntub2RlbmFtZX0gcG9ydGlvbiBvZiB0aGUgYWxpYXMgc2hvdWxkIGJlCit0aGUgbmFtZSBvZiBhIG5vZGUgc3BlY2lmaWVkIGluIHRoZSB2ZXJzaW9uIHNjcmlwdCBzdXBwbGllZCB0byB0aGUgbGlua2VyIHdoZW4KK2J1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkuICBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYSB2ZXJzaW9uZWQKK3N5bWJvbCBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gQHZhcntub2RlbmFtZX0gc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlCitub2RlbmFtZSBvZiB0aGUgc3ltYm9sIHlvdSBhcmUgdHJ5aW5nIHRvIG92ZXJyaWRlLgorQGVuZCBpZnNldAorCitAaWZzZXQgQ09GRgorQG5vZGUgVGFnCitAc2VjdGlvbiBAY29kZXsudGFnIEB2YXJ7c3RydWN0bmFtZX19CisKK0BjaW5kZXggQ09GRiBzdHJ1Y3R1cmUgZGVidWdnaW5nCitAY2luZGV4IHN0cnVjdHVyZSBkZWJ1Z2dpbmcsIENPRkYKK0BjaW5kZXggQGNvZGV7dGFnfSBkaXJlY3RpdmUKK1RoaXMgZGlyZWN0aXZlIGlzIGdlbmVyYXRlZCBieSBjb21waWxlcnMgdG8gaW5jbHVkZSBhdXhpbGlhcnkgZGVidWdnaW5nCitpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgaXMgb25seSBwZXJtaXR0ZWQgaW5zaWRlCitAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLiAgVGFncyBhcmUgdXNlZCB0byBsaW5rIHN0cnVjdHVyZQorZGVmaW5pdGlvbnMgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIGluc3RhbmNlcyBvZiB0aG9zZSBzdHJ1Y3R1cmVzLgorQGlmc2V0IEJPVVQKKworQHNhbXB7LnRhZ30gaXMgb25seSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBDT0ZGIGZvcm1hdCBvdXRwdXQ7IHdoZW4KK0Bjb2Rle0B2YWx1ZXtBU319IGlzIGdlbmVyYXRpbmcgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dAoraWdub3JlcyBpdC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQG5vZGUgVGV4dAorQHNlY3Rpb24gQGNvZGV7LnRleHQgQHZhcntzdWJzZWN0aW9ufX0KKworQGNpbmRleCBAY29kZXt0ZXh0fSBkaXJlY3RpdmUKK1RlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGFzc2VtYmxlIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBvbnRvIHRoZSBlbmQgb2YKK3RoZSB0ZXh0IHN1YnNlY3Rpb24gbnVtYmVyZWQgQHZhcntzdWJzZWN0aW9ufSwgd2hpY2ggaXMgYW4gYWJzb2x1dGUKK2V4cHJlc3Npb24uICBJZiBAdmFye3N1YnNlY3Rpb259IGlzIG9taXR0ZWQsIHN1YnNlY3Rpb24gbnVtYmVyIHplcm8KK2lzIHVzZWQuCisKK0Bub2RlIFRpdGxlCitAc2VjdGlvbiBAY29kZXsudGl0bGUgIkB2YXJ7aGVhZGluZ30ifQorCitAY2luZGV4IEBjb2Rle3RpdGxlfSBkaXJlY3RpdmUKK0BjaW5kZXggbGlzdGluZyBjb250cm9sOiB0aXRsZSBsaW5lCitVc2UgQHZhcntoZWFkaW5nfSBhcyB0aGUgdGl0bGUgKHNlY29uZCBsaW5lLCBpbW1lZGlhdGVseSBhZnRlciB0aGUKK3NvdXJjZSBmaWxlIG5hbWUgYW5kIHBhZ2VudW1iZXIpIHdoZW4gZ2VuZXJhdGluZyBhc3NlbWJseSBsaXN0aW5ncy4KKworVGhpcyBkaXJlY3RpdmUgYWZmZWN0cyBzdWJzZXF1ZW50IHBhZ2VzLCBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBhZ2UgaWYKK2l0IGFwcGVhcnMgd2l0aGluIHRlbiBsaW5lcyBvZiB0aGUgdG9wIG9mIGEgcGFnZS4KKworQGlmc2V0IENPRkYKK0Bub2RlIFR5cGUKK0BzZWN0aW9uIEBjb2Rley50eXBlIEB2YXJ7aW50fX0KKworQGNpbmRleCBDT0ZGIHN5bWJvbCB0eXBlCitAY2luZGV4IHN5bWJvbCB0eXBlLCBDT0ZGCitAY2luZGV4IEBjb2Rle3R5cGV9IGRpcmVjdGl2ZQorVGhpcyBkaXJlY3RpdmUsIHBlcm1pdHRlZCBvbmx5IHdpdGhpbiBAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLAorcmVjb3JkcyB0aGUgaW50ZWdlciBAdmFye2ludH0gYXMgdGhlIHR5cGUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgorQGlmc2V0IEJPVVQKKworQHNhbXB7LnR5cGV9IGlzIGFzc29jaWF0ZWQgb25seSB3aXRoIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgorQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IgQGNvZGV7Yi5vdXR9IG91dHB1dCwgaXQgYWNjZXB0cyB0aGlzCitkaXJlY3RpdmUgYnV0IGlnbm9yZXMgaXQuCitAZW5kIGlmc2V0CitAZW5kIGlmc2V0CisKK0BpZnNldCBDT0ZGCitAbm9kZSBWYWwKK0BzZWN0aW9uIEBjb2Rley52YWwgQHZhcnthZGRyfX0KKworQGNpbmRleCBAY29kZXt2YWx9IGRpcmVjdGl2ZQorQGNpbmRleCBDT0ZGIHZhbHVlIGF0dHJpYnV0ZQorQGNpbmRleCB2YWx1ZSBhdHRyaWJ1dGUsIENPRkYKK1RoaXMgZGlyZWN0aXZlLCBwZXJtaXR0ZWQgb25seSB3aXRoaW4gQGNvZGV7LmRlZn0vQGNvZGV7LmVuZGVmfSBwYWlycywKK3JlY29yZHMgdGhlIGFkZHJlc3MgQHZhcnthZGRyfSBhcyB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIHRhYmxlCitlbnRyeS4KK0BpZnNldCBCT1VUCisKK0BzYW1wey52YWx9IGlzIHVzZWQgb25seSBmb3IgQ09GRiBvdXRwdXQ7IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMKK2NvbmZpZ3VyZWQgZm9yIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKKworQG5vZGUgVWxlYjEyOAorQHNlY3Rpb24gQGNvZGV7LnVsZWIxMjggQHZhcntleHByZXNzaW9uc319CisKK0BjaW5kZXggQGNvZGV7dWxlYjEyOH0gZGlyZWN0aXZlCitAdmFye3VsZWIxMjh9IHN0YW5kcyBmb3IgYGB1bnNpZ25lZCBsaXR0bGUgZW5kaWFuIGJhc2UgMTI4LicnICBUaGlzIGlzIGEgCitjb21wYWN0LCB2YXJpYWJsZSBsZW5ndGggcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyB1c2VkIGJ5IHRoZSBEV0FSRgorc3ltYm9saWMgZGVidWdnaW5nIGZvcm1hdC4gIEB4cmVme1NsZWIxMjgsQGNvZGV7LnNsZWIxMjh9fS4KKworQG5vZGUgV29yZAorQHNlY3Rpb24gQGNvZGV7LndvcmQgQHZhcntleHByZXNzaW9uc319CisKK0BjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlCitUaGlzIGRpcmVjdGl2ZSBleHBlY3RzIHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgb2YgYW55IHNlY3Rpb24sCitzZXBhcmF0ZWQgYnkgY29tbWFzLgorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IFczMgorRm9yIGVhY2ggZXhwcmVzc2lvbiwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMgYSAzMi1iaXQgbnVtYmVyLgorQGVuZCBpZnNldAorQGlmc2V0IFcxNgorRm9yIGVhY2ggZXhwcmVzc2lvbiwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMgYSAxNi1iaXQgbnVtYmVyLgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCitAaWZzZXQgR0VORVJJQworCitUaGUgc2l6ZSBvZiB0aGUgbnVtYmVyIGVtaXR0ZWQsIGFuZCBpdHMgYnl0ZSBvcmRlciwKK2RlcGVuZCBvbiB3aGF0IHRhcmdldCBjb21wdXRlciB0aGUgYXNzZW1ibHkgaXMgZm9yLgorQGVuZCBpZnNldAorCitAYyBvbiBhbWQyOWssIGk5NjAsIHNwYXJjIHRoZSAic3BlY2lhbCB0cmVhdG1lbnQgdG8gc3VwcG9ydCBjb21waWxlcnMiIGRvZXNuJ3QKK0BjIGhhcHBlbi0tLTMyLWJpdCBhZGRyZXNzYWJpbGl0eSwgcGVyaW9kOyBubyBsb25nL3Nob3J0IGp1bXBzLgorQGlmc2V0IERJRkYtVEJMLUtMVUdFCitAY2luZGV4IGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQKK0BjaW5kZXggYWx0ZXJlZCBkaWZmZXJlbmNlIHRhYmxlcworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzogU3BlY2lhbCBUcmVhdG1lbnQgdG8gc3VwcG9ydCBDb21waWxlcnN9CitAZW5kIHF1b3RhdGlvbgorCitAaWZzZXQgR0VORVJJQworTWFjaGluZXMgd2l0aCBhIDMyLWJpdCBhZGRyZXNzIHNwYWNlLCBidXQgdGhhdCBkbyBsZXNzIHRoYW4gMzItYml0CithZGRyZXNzaW5nLCByZXF1aXJlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCB0cmVhdG1lbnQuICBJZiB0aGUgbWFjaGluZSBvZgoraW50ZXJlc3QgdG8geW91IGRvZXMgMzItYml0IGFkZHJlc3NpbmcgKG9yIGRvZXNuJ3QgcmVxdWlyZSBpdDsKK0BweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLCB5b3UgY2FuIGlnbm9yZSB0aGlzIGlzc3VlLgorCitAZW5kIGlmc2V0CitJbiBvcmRlciB0byBhc3NlbWJsZSBjb21waWxlciBvdXRwdXQgaW50byBzb21ldGhpbmcgdGhhdCB3b3JrcywKK0Bjb2Rle0B2YWx1ZXtBU319IG9jY2FzaW9ubGx5IGRvZXMgc3RyYW5nZSB0aGluZ3MgdG8gQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMuCitEaXJlY3RpdmVzIG9mIHRoZSBmb3JtIEBzYW1wey53b3JkIHN5bTEtc3ltMn0gYXJlIG9mdGVuIGVtaXR0ZWQgYnkKK2NvbXBpbGVycyBhcyBwYXJ0IG9mIGp1bXAgdGFibGVzLiAgVGhlcmVmb3JlLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyBhCitkaXJlY3RpdmUgb2YgdGhlIGZvcm0gQHNhbXB7LndvcmQgc3ltMS1zeW0yfSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KK0Bjb2Rle3N5bTF9IGFuZCBAY29kZXtzeW0yfSBkb2VzIG5vdCBmaXQgaW4gMTYgYml0cywgQGNvZGV7QHZhbHVle0FTfX0KK2NyZWF0ZXMgYSBAZGZue3NlY29uZGFyeSBqdW1wIHRhYmxlfSwgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBuZXh0IGxhYmVsLgorVGhpcyBzZWNvbmRhcnkganVtcCB0YWJsZSBpcyBwcmVjZWRlZCBieSBhIHNob3J0LWp1bXAgdG8gdGhlCitmaXJzdCBieXRlIGFmdGVyIHRoZSBzZWNvbmRhcnkgdGFibGUuICBUaGlzIHNob3J0LWp1bXAgcHJldmVudHMgdGhlIGZsb3cKK29mIGNvbnRyb2wgZnJvbSBhY2NpZGVudGFsbHkgZmFsbGluZyBpbnRvIHRoZSBuZXcgdGFibGUuICBJbnNpZGUgdGhlCit0YWJsZSBpcyBhIGxvbmctanVtcCB0byBAY29kZXtzeW0yfS4gIFRoZSBvcmlnaW5hbCBAc2FtcHsud29yZH0KK2NvbnRhaW5zIEBjb2Rle3N5bTF9IG1pbnVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nLWp1bXAgdG8KK0Bjb2Rle3N5bTJ9LgorCitJZiB0aGVyZSB3ZXJlIHNldmVyYWwgb2NjdXJyZW5jZXMgb2YgQHNhbXB7LndvcmQgc3ltMS1zeW0yfSBiZWZvcmUgdGhlCitzZWNvbmRhcnkganVtcCB0YWJsZSwgYWxsIG9mIHRoZW0gYXJlIGFkanVzdGVkLiAgSWYgdGhlcmUgd2FzIGEKK0BzYW1wey53b3JkIHN5bTMtc3ltNH0sIHRoYXQgYWxzbyBkaWQgbm90IGZpdCBpbiBzaXh0ZWVuIGJpdHMsIGEKK2xvbmctanVtcCB0byBAY29kZXtzeW00fSBpcyBpbmNsdWRlZCBpbiB0aGUgc2Vjb25kYXJ5IGp1bXAgdGFibGUsCithbmQgdGhlIEBjb2Rley53b3JkfSBkaXJlY3RpdmVzIGFyZSBhZGp1c3RlZCB0byBjb250YWluIEBjb2Rle3N5bTN9CittaW51cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9uZy1qdW1wIHRvIEBjb2Rle3N5bTR9OyBhbmQgc28gb24sIGZvciBhcyBtYW55CitlbnRyaWVzIGluIHRoZSBvcmlnaW5hbCBqdW1wIHRhYmxlIGFzIG5lY2Vzc2FyeS4KKworQGlmc2V0IElOVEVSTkFMUworQGVtcGh7VGhpcyBmZWF0dXJlIG1heSBiZSBkaXNhYmxlZCBieSBjb21waWxpbmcgQGNvZGV7QHZhbHVle0FTfX0gd2l0aCB0aGUKK0BzYW1wey1EV09SS0lOR19ET1RfV09SRH0gb3B0aW9uLn0gVGhpcyBmZWF0dXJlIGlzIGxpa2VseSB0byBjb25mdXNlCithc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycy4KK0BlbmQgaWZzZXQKK0BlbmQgaWZzZXQKK0BjIGVuZCAgICAgRElGRi1UQkwtS0xVR0UKKworQG5vZGUgRGVwcmVjYXRlZAorQHNlY3Rpb24gRGVwcmVjYXRlZCBEaXJlY3RpdmVzCisKK0BjaW5kZXggZGVwcmVjYXRlZCBkaXJlY3RpdmVzCitAY2luZGV4IG9ic29sZXNjZW50IGRpcmVjdGl2ZXMKK09uZSBkYXkgdGhlc2UgZGlyZWN0aXZlcyB3b24ndCB3b3JrLgorVGhleSBhcmUgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBhc3NlbWJsZXJzLgorQHRhYmxlIEB0CitAaXRlbSAuYWJvcnQKK0BpdGVtIC5saW5lCitAZW5kIHRhYmxlCisKK0BpZnNldCBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKKworQGNpbmRleCBtYWNoaW5lIGRlcGVuZGVuY2llcworVGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhcmUgKGFsbW9zdCBieSBkZWZpbml0aW9uKSBkaWZmZXJlbnQgb24KK2VhY2ggbWFjaGluZSB3aGVyZSBAY29kZXtAdmFsdWV7QVN9fSBydW5zLiAgRmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb25zCit2YXJ5IGFzIHdlbGwsIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBvZnRlbiBzdXBwb3J0cyBhIGZldyBhZGRpdGlvbmFsCitkaXJlY3RpdmVzIG9yIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKK2Fzc2VtYmxlcnMgb24gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLiAgRmluYWxseSwgc29tZSB2ZXJzaW9ucyBvZgorQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCBzcGVjaWFsIHBzZXVkby1pbnN0cnVjdGlvbnMgZm9yIGJyYW5jaAorb3B0aW1pemF0aW9uLgorCitUaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIG1vc3Qgb2YgdGhlc2UgZGlmZmVyZW5jZXMsIHRob3VnaCBpdCBkb2VzIG5vdAoraW5jbHVkZSBkZXRhaWxzIG9uIGFueSBtYWNoaW5lJ3MgaW5zdHJ1Y3Rpb24gc2V0LiAgRm9yIGRldGFpbHMgb24gdGhhdAorc3ViamVjdCwgc2VlIHRoZSBoYXJkd2FyZSBtYW51ZmFjdHVyZXIncyBtYW51YWwuCisKK0BtZW51CitAaWZzZXQgQTI5SworKiBBTUQyOUstRGVwZW5kZW50OjogICAgICAgICAgICBBTUQgMjlLIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IEFSQworKiBBUkMtRGVwZW5kZW50OjogICAgICAgICAgICAgICBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZzZXQgQVJNCisqIEFSTS1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZzZXQKK0BpZnNldCBEMTBWCisqIEQxMFYtRGVwZW5kZW50OjogICAgICAgICAgICAgIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZzZXQgRDMwVgorKiBEMzBWLURlcGVuZGVudDo6ICAgICAgICAgICAgICBEMzBWIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IEg4LzMwMAorKiBIOC8zMDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzMwMCBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZzZXQKK0BpZnNldCBIOC81MDAKKyogSDgvNTAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZzZXQgSFBQQQorKiBIUFBBLURlcGVuZGVudDo6ICAgICAgICAgICAgICBIUFBBIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IEk4MDM4NgorKiBpMzg2LURlcGVuZGVudDo6ICAgICAgICAgICAgICBJbnRlbCA4MDM4NiBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZzZXQKK0BpZnNldCBJOTYwCisqIGk5NjAtRGVwZW5kZW50OjogICAgICAgICAgICAgIEludGVsIDgwOTYwIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IE02ODBYMAorKiBNNjhLLURlcGVuZGVudDo6ICAgICAgICAgICAgICBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZzZXQgTUlQUworKiBNSVBTLURlcGVuZGVudDo6ICAgICAgICAgICAgICBNSVBTIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IFNICisqIFNILURlcGVuZGVudDo6ICAgICAgICAgICAgICAgIEhpdGFjaGkgU0ggRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZzZXQgU1BBUkMKKyogU3BhcmMtRGVwZW5kZW50OjogICAgICAgICAgICAgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZzZXQgVjg1MAorKiBWODUwLURlcGVuZGVudDo6ICAgICAgICAgICAgICBWODUwIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IFo4MDAwCisqIFo4MDAwLURlcGVuZGVudDo6ICAgICAgICAgICAgIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmc2V0IFZBWAorKiBWYXgtRGVwZW5kZW50OjogICAgICAgICAgICAgICBWQVggRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAZW5kIG1lbnUKKworQGxvd2Vyc2VjdGlvbnMKK0BlbmQgaWZzZXQKKworQGMgVGhlIGZvbGxvd2luZyBtYWpvciBub2RlcyBhcmUgKnNlY3Rpb25zKiBpbiB0aGUgR0VORVJJQyB2ZXJzaW9uLCAqY2hhcHRlcnMqCitAYyBpbiBzaW5nbGUtY3B1IHZlcnNpb25zLiAgVGhpcyBpcyBtYWlubHkgYWNoaWV2ZWQgYnkgQGxvd2Vyc2VjdGlvbnMuICBUaGVyZSBpcyBhCitAYyBwZWN1bGlhcml0eTogdG8gcHJlc2VydmUgY3Jvc3MtcmVmZXJlbmNlcywgdGhlcmUgbXVzdCBiZSBhIG5vZGUgY2FsbGVkCitAYyAiTWFjaGluZSBEZXBlbmRlbmNpZXMiLiAgSGVuY2UgdGhlIGNvbmRpdGlvbmFsIG5vZGVuYW1lcyBpbiBlYWNoCitAYyBtYWpvciBub2RlIGJlbG93LiAgTm9kZSBkZWZhdWx0aW5nIGluIG1ha2VpbmZvIHJlcXVpcmVzIGFkamFjZW5jeSBvZgorQGMgbm9kZSBhbmQgc2VjdGlvbmluZyBjb21tYW5kczsgaGVuY2UgdGhlIHJlcGV0aXRpb24gb2YgQGNoYXB0ZXIgQkxBSAorQGMgaW4gYm90aCBjb25kaXRpb25hbCBibG9ja3MuCisKK0BpZnNldCBBUkMKK0BpZnNldCBHRU5FUklDCitAcGFnZQorQG5vZGUgQVJDLURlcGVuZGVudAorQGNoYXB0ZXIgQVJDIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKK0BjaGFwdGVyIEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IEFSQyBzdXBwb3J0CitAbWVudQorKiBBUkMtT3B0czo6ICAgICAgICAgICAgICAgICAgICBPcHRpb25zCisqIEFSQy1GbG9hdDo6ICAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50CisqIEFSQy1EaXJlY3RpdmVzOjogICAgICAgICAgICAgIFNwYXJjIE1hY2hpbmUgRGlyZWN0aXZlcworQGVuZCBtZW51CisKK0Bub2RlIEFSQy1PcHRzCitAc2VjdGlvbiBPcHRpb25zCisKK0BjaW5kZXggb3B0aW9ucyBmb3IgQVJDCitAY2luZGV4IEFSQyBvcHRpb25zCitAY2luZGV4IGFyY2hpdGVjdHVyZXMsIEFSQworQGNpbmRleCBBUkMgYXJjaGl0ZWN0dXJlcworVGhlIEFSQyBjaGlwIGZhbWlseSBpbmNsdWRlcyBzZXZlcmFsIHN1Y2Nlc3NpdmUgbGV2ZWxzIChvciBvdGhlcgordmFyaWFudHMpIG9mIGNoaXAsIHVzaW5nIHRoZSBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0LCBidXQgaW5jbHVkaW5nCithIGZldyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCBlYWNoIGxldmVsLgorCitCeSBkZWZhdWx0LCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHRoZSBjb3JlIGluc3RydWN0aW9uIHNldCAoQVJDCitiYXNlKS4gIFRoZSBAY29kZXsuY3B1fSBwc2V1ZG8tb3AgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBzZWxlY3QKK3RoZSB2YXJpYW50LgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7LW1iaWctZW5kaWFufSBvcHRpb24gKEFSQykKK0BjaW5kZXggQGNvZGV7LW1saXR0bGUtZW5kaWFufSBvcHRpb24gKEFSQykKK0BjaW5kZXggQVJDIGJpZy1lbmRpYW4gb3V0cHV0CitAY2luZGV4IEFSQyBsaXR0bGUtZW5kaWFuIG91dHB1dAorQGNpbmRleCBiaWctZW5kaWFuIG91dHB1dCwgQVJDCitAY2luZGV4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LCBBUkMKK0BpdGVtIC1tYmlnLWVuZGlhbgorQGl0ZW14IC1tbGl0dGxlLWVuZGlhbgorQW55IEBzY3thcmN9IGNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gY2FuIHNlbGVjdCBiaWctZW5kaWFuIG9yCitsaXR0bGUtZW5kaWFuIG91dHB1dCBhdCBydW4gdGltZSAodW5saWtlIG1vc3Qgb3RoZXIgQHNje2dudX0gZGV2ZWxvcG1lbnQKK3Rvb2xzLCB3aGljaCBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIpLiAgVXNlCitAc2FtcHstbWJpZy1lbmRpYW59IHRvIHNlbGVjdCBiaWctZW5kaWFuIG91dHB1dCwgYW5kIEBzYW1wey1tbGl0dGxlLWVuZGlhbn0KK2ZvciBsaXR0bGUtZW5kaWFuLgorQGVuZCB0YWJsZQorCitAbm9kZSBBUkMtRmxvYXQKK0BzZWN0aW9uIEZsb2F0aW5nIFBvaW50CisKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEFSQyAoQHNje2llZWV9KQorQGNpbmRleCBBUkMgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKK1RoZSBBUkMgY3B1IGZhbWlseSBjdXJyZW50bHkgZG9lcyBub3QgaGF2ZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludAorc3VwcG9ydC4gIFNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgQGNvZGV7R0NDfQorYW5kIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisKK0Bub2RlIEFSQy1EaXJlY3RpdmVzCitAc2VjdGlvbiBBUkMgTWFjaGluZSBEaXJlY3RpdmVzCisKK0BjaW5kZXggQVJDIG1hY2hpbmUgZGlyZWN0aXZlcworQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEFSQworVGhlIEFSQyB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAorbWFjaGluZSBkaXJlY3RpdmVzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC5jcHUKK0BjaW5kZXggQGNvZGV7Y3B1fSBkaXJlY3RpdmUsIFNQQVJDCitUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIGRlc2lyZWQgY3B1LgorVGhlIEFSQyBpcyBpbnRlbmRlZCB0byBiZSBjdXN0b21pemFibGUsIEBjb2Rley5jcHV9IGlzIHVzZWQgdG8KK3NlbGVjdCB0aGUgZGVzaXJlZCB2YXJpYW50IFt0aG91Z2ggY3VycmVudGx5IHRoZXJlIGFyZSBub25lXS4KKworQGVuZCB0YWJsZQorCitAZW5kIGlmc2V0CisKK0BpZnNldCBBMjlLCitAaW5jbHVkZSBjLWEyOWsudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgQVJNCitAaW5jbHVkZSBjLWFybS50ZXhpCitAZW5kIGlmc2V0CisKK0BpZnNldCBIaXRhY2hpLWFsbAorQGlmY2xlYXIgR0VORVJJQworQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKK0BjaGFwdGVyIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCisKK1RoZSBtYWNoaW5lIGluc3RydWN0aW9uIHNldHMgYXJlIGRpZmZlcmVudCBvbiBlYWNoIEhpdGFjaGkgY2hpcCBmYW1pbHksCithbmQgdGhlcmUgYXJlIGFsc28gc29tZSBzeW50YXggZGlmZmVyZW5jZXMgYW1vbmcgdGhlIGZhbWlsaWVzLiAgVGhpcworY2hhcHRlciBkZXNjcmliZXMgdGhlIHNwZWNpZmljIEBjb2Rle0B2YWx1ZXtBU319IGZlYXR1cmVzIGZvciBlYWNoCitmYW1pbHkuCisKK0BtZW51CisqIEg4LzMwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvMzAwIERlcGVuZGVudCBGZWF0dXJlcworKiBIOC81MDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzUwMCBEZXBlbmRlbnQgRmVhdHVyZXMKKyogU0gtRGVwZW5kZW50OjogICAgICAgICAgICAgICAgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgbWVudQorQGxvd2Vyc2VjdGlvbnMKK0BlbmQgaWZjbGVhcgorQGVuZCBpZnNldAorCitAaWZzZXQgRDEwVgorQGluY2x1ZGUgYy1kMTB2LnRleGkKK0BlbmQgaWZzZXQKKworQGlmc2V0IEQzMFYKK0BpbmNsdWRlIGMtZDMwdi50ZXhpCitAZW5kIGlmc2V0CisKK0BpZnNldCBIOC8zMDAKK0BpbmNsdWRlIGMtaDgzMDAudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgSDgvNTAwCitAaW5jbHVkZSBjLWg4NTAwLnRleGkKK0BlbmQgaWZzZXQKKworQGlmc2V0IEhQUEEKK0BpbmNsdWRlIGMtaHBwYS50ZXhpCitAZW5kIGlmc2V0CisKK0BpZnNldCBJODAzODYKK0BpbmNsdWRlIGMtaTM4Ni50ZXhpCitAZW5kIGlmc2V0CisKK0BpZnNldCBJOTYwCitAaW5jbHVkZSBjLWk5NjAudGV4aQorQGVuZCBpZnNldAorCisKK0BpZnNldCBNNjgwWDAKK0BpbmNsdWRlIGMtbTY4ay50ZXhpCitAZW5kIGlmc2V0CisKK0BpZnNldCBNSVBTCitAaW5jbHVkZSBjLW1pcHMudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgTlMzMksKK0BpbmNsdWRlIGMtbnMzMmsudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgU0gKK0BpbmNsdWRlIGMtc2gudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgU1BBUkMKK0BpbmNsdWRlIGMtc3BhcmMudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgWjgwMDAKK0BpbmNsdWRlIGMtejhrLnRleGkKK0BlbmQgaWZzZXQKKworQGlmc2V0IFZBWAorQGluY2x1ZGUgYy12YXgudGV4aQorQGVuZCBpZnNldAorCitAaWZzZXQgVjg1MAorQGluY2x1ZGUgYy12ODUwLnRleGkKK0BlbmQgaWZzZXQKKworQGlmc2V0IEdFTkVSSUMKK0BjIHJldmVyc2UgZWZmZWN0IG9mIEBkb3duIGF0IHRvcCBvZiBnZW5lcmljIE1hY2hpbmUtRGVwIGNoYXB0ZXIKK0ByYWlzZXNlY3Rpb25zCitAZW5kIGlmc2V0CisKK0Bub2RlIFJlcG9ydGluZyBCdWdzCitAY2hhcHRlciBSZXBvcnRpbmcgQnVncworQGNpbmRleCBidWdzIGluIGFzc2VtYmxlcgorQGNpbmRleCByZXBvcnRpbmcgYnVncyBpbiBhc3NlbWJsZXIKKworWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyBAY29kZXtAdmFsdWV7QVN9fSByZWxpYWJsZS4KKworUmVwb3J0aW5nIGEgYnVnIG1heSBoZWxwIHlvdSBieSBicmluZ2luZyBhIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbSwgb3IgaXQgbWF5Citub3QuICBCdXQgaW4gYW55IGNhc2UgdGhlIHByaW5jaXBhbCBmdW5jdGlvbiBvZiBhIGJ1ZyByZXBvcnQgaXMgdG8gaGVscCB0aGUKK2VudGlyZSBjb21tdW5pdHkgYnkgbWFraW5nIHRoZSBuZXh0IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gd29yayBiZXR0ZXIuCitCdWcgcmVwb3J0cyBhcmUgeW91ciBjb250cmlidXRpb24gdG8gdGhlIG1haW50ZW5hbmNlIG9mIEBjb2Rle0B2YWx1ZXtBU319LgorCitJbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQoraW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgorCitAbWVudQorKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KKyogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCitAZW5kIG1lbnUKKworQG5vZGUgQnVnIENyaXRlcmlhCitAc2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KK0BjaW5kZXggYnVnIGNyaXRlcmlhCisKK0lmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAY2luZGV4IGZhdGFsIHNpZ25hbAorQGNpbmRleCBhc3NlbWJsZXIgY3Jhc2gKK0BjaW5kZXggY3Jhc2ggb2YgYXNzZW1ibGVyCitAaXRlbQorSWYgdGhlIGFzc2VtYmxlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKK0Bjb2Rle0B2YWx1ZXtBU319IGJ1Zy4gIFJlbGlhYmxlIGFzc2VtYmxlcnMgbmV2ZXIgY3Jhc2guCisKK0BjaW5kZXggZXJyb3Igb24gdmFsaWQgaW5wdXQKK0BpdGVtCitJZiBAY29kZXtAdmFsdWV7QVN9fSBwcm9kdWNlcyBhbiBlcnJvciBtZXNzYWdlIGZvciB2YWxpZCBpbnB1dCwgdGhhdCBpcyBhIGJ1Zy4KKworQGNpbmRleCBpbnZhbGlkIGlucHV0CitAaXRlbQorSWYgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0CitpcyBhIGJ1Zy4gIEhvd2V2ZXIsIHlvdSBzaG91bGQgbm90ZSB0aGF0IHlvdXIgaWRlYSBvZiBgYGludmFsaWQgaW5wdXQnJyBtaWdodAorYmUgb3VyIGlkZWEgb2YgYGBhbiBleHRlbnNpb24nJyBvciBgYHN1cHBvcnQgZm9yIHRyYWRpdGlvbmFsIHByYWN0aWNlJycuCisKK0BpdGVtCitJZiB5b3UgYXJlIGFuIGV4cGVyaWVuY2VkIHVzZXIgb2YgYXNzZW1ibGVycywgeW91ciBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnQKK29mIEBjb2Rle0B2YWx1ZXtBU319IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIEJ1ZyBSZXBvcnRpbmcKK0BzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncworQGNpbmRleCBidWcgcmVwb3J0cworQGNpbmRleCBhc3NlbWJsZXIgYnVncywgcmVwb3J0aW5nCisKK0EgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0gcHJvZHVjdHMuICBJZgoreW91IG9idGFpbmVkIEBjb2Rle0B2YWx1ZXtBU319IGZyb20gYSBzdXBwb3J0IG9yZ2FuaXphdGlvbiwgd2UgcmVjb21tZW5kIHlvdQorY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KKworWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCitpbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCitkaXN0cmlidXRpb24uCisKK0luIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgQGNvZGV7QHZhbHVle0FTfX0KK3RvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgorCitUaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6CitAc3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCitmYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCisKK09mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlIHByb2JsZW0KK2FuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodCBhc3N1bWUgdGhhdCB0aGUKK25hbWUgb2YgYSBzeW1ib2wgeW91IHVzZSBpbiBhbiBleGFtcGxlIGRvZXMgbm90IG1hdHRlci4gIFdlbGwsIHByb2JhYmx5IGl0IGRvZXMKK25vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcyBhIHN0cmF5IG1lbW9yeSByZWZlcmVuY2Ugd2hpY2gKK2hhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUgdGhhdCBuYW1lIGlzIHN0b3JlZCBpbiBtZW1vcnk7CitwZXJoYXBzLCBpZiB0aGUgbmFtZSB3ZXJlIGRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbAordGhlIGFzc2VtYmxlciBpbnRvIGRvaW5nIHRoZSByaWdodCB0aGluZyBkZXNwaXRlIHRoZSBidWcuICBQbGF5IGl0IHNhZmUgYW5kCitnaXZlIGEgc3BlY2lmaWMsIGNvbXBsZXRlIGV4YW1wbGUuICBUaGF0IGlzIHRoZSBlYXNpZXN0IHRoaW5nIGZvciB5b3UgdG8gZG8sCithbmQgdGhlIG1vc3QgaGVscGZ1bC4KKworS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHB1cnBvc2Ugb2YgYSBidWcgcmVwb3J0IGlzIHRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZyBpZgoraXQgaXMgbmV3IHRvIHVzLiAgVGhlcmVmb3JlLCBhbHdheXMgd3JpdGUgeW91ciBidWcgcmVwb3J0cyBvbiB0aGUgYXNzdW1wdGlvbgordGhhdCB0aGUgYnVnIGhhcyBub3QgYmVlbiByZXBvcnRlZCBwcmV2aW91c2x5LgorCitTb21ldGltZXMgcGVvcGxlIGdpdmUgYSBmZXcgc2tldGNoeSBmYWN0cyBhbmQgYXNrLCBgYERvZXMgdGhpcyByaW5nIGEKK2JlbGw/JycgIFRob3NlIGJ1ZyByZXBvcnRzIGFyZSB1c2VsZXNzLCBhbmQgd2UgdXJnZSBldmVyeW9uZSB0bworQGVtcGh7cmVmdXNlIHRvIHJlc3BvbmQgdG8gdGhlbX0gZXhjZXB0IHRvIGNoaWRlIHRoZSBzZW5kZXIgdG8gcmVwb3J0CitidWdzIHByb3Blcmx5LgorCitUbyBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcsIHlvdSBzaG91bGQgaW5jbHVkZSBhbGwgdGhlc2UgdGhpbmdzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVGhlIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0uICBAY29kZXtAdmFsdWV7QVN9fSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0CitpdCB3aXRoIHRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgorCitXaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKK3RoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fS4KKworQGl0ZW0KK0FueSBwYXRjaGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkIHRvIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UuCisKK0BpdGVtCitUaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAordmVyc2lvbiBudW1iZXIuCisKK0BpdGVtCitXaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7QHZhbHVle0FTfX0tLS1lLmcuCitgYEBjb2Rle2djYy0yLjd9JycuCisKK0BpdGVtCitUaGUgY29tbWFuZCBhcmd1bWVudHMgeW91IGdhdmUgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSB5b3VyIGV4YW1wbGUgYW5kCitvYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwgbGlzdCB0aGVtCithbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMgc3VmZmljaWVudC4KKworSWYgd2Ugd2VyZSB0byB0cnkgdG8gZ3Vlc3MgdGhlIGFyZ3VtZW50cywgd2Ugd291bGQgcHJvYmFibHkgZ3Vlc3Mgd3JvbmcKK2FuZCB0aGVuIHdlIG1pZ2h0IG5vdCBlbmNvdW50ZXIgdGhlIGJ1Zy4KKworQGl0ZW0KK0EgY29tcGxldGUgaW5wdXQgZmlsZSB0aGF0IHdpbGwgcmVwcm9kdWNlIHRoZSBidWcuICBJZiB0aGUgYnVnIGlzIG9ic2VydmVkIHdoZW4KK3RoZSBhc3NlbWJsZXIgaXMgaW52b2tlZCB2aWEgYSBjb21waWxlciwgc2VuZCB0aGUgYXNzZW1ibGVyIHNvdXJjZSwgbm90IHRoZQoraGlnaCBsZXZlbCBsYW5ndWFnZSBzb3VyY2UuICBNb3N0IGNvbXBpbGVycyB3aWxsIHByb2R1Y2UgdGhlIGFzc2VtYmxlciBzb3VyY2UKK3doZW4gcnVuIHdpdGggdGhlIEBzYW1wey1TfSBvcHRpb24uICBJZiB5b3UgYXJlIHVzaW5nIEBjb2Rle0B2YWx1ZXtHQ0N9fSwgdXNlCit0aGUgb3B0aW9ucyBAc2FtcHstdiAtLXNhdmUtdGVtcHN9OyB0aGlzIHdpbGwgc2F2ZSB0aGUgYXNzZW1ibGVyIHNvdXJjZSBpbiBhCitmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5zfSwgYW5kIGFsc28gc2hvdyB5b3UgZXhhY3RseSBob3cKK0Bjb2Rle0B2YWx1ZXtBU319IGlzIGJlaW5nIHJ1bi4KKworQGl0ZW0KK0EgZGVzY3JpcHRpb24gb2Ygd2hhdCBiZWhhdmlvciB5b3Ugb2JzZXJ2ZSB0aGF0IHlvdSBiZWxpZXZlIGlzCitpbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgYGBJdCBnZXRzIGEgZmF0YWwgc2lnbmFsLicnCisKK09mIGNvdXJzZSwgaWYgdGhlIGJ1ZyBpcyB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKK3dpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0IG5vdAorbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cyBhIGNoYW5jZSB0bworbWFrZSBhIG1pc3Rha2UuCisKK0V2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwgc2F5IHNvCitleHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcywgeW91ciBjb3B5IG9mCitAY29kZXtAdmFsdWV7QVN9fSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZSBDCitsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaCBhbmQgb3Vycword291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzIGZhaWxzIHRvIGNyYXNoLCB3ZQord291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYgeW91IGhhZCBub3QgdG9sZCB1cyB0bworZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdyBhbnkgY29uY2x1c2lvbiBmcm9tIG91cgorb2JzZXJ2YXRpb25zLgorCitAaXRlbQorSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzb3VyY2UsIHNlbmQgdXMgY29udGV4dAorZGlmZnMsIGFzIGdlbmVyYXRlZCBieSBAY29kZXtkaWZmfSB3aXRoIHRoZSBAc2FtcHstdX0sIEBzYW1wey1jfSwgb3IgQHNhbXB7LXB9CitvcHRpb24uICBBbHdheXMgc2VuZCBkaWZmcyBmcm9tIHRoZSBvbGQgZmlsZSB0byB0aGUgbmV3IGZpbGUuICBJZiB5b3UgZXZlbgorZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZSwgcmVmZXIgdG8gaXQgYnkgY29udGV4dCwgbm90CitieSBsaW5lIG51bWJlci4KKworVGhlIGxpbmUgbnVtYmVycyBpbiBvdXIgZGV2ZWxvcG1lbnQgc291cmNlcyB3aWxsIG5vdCBtYXRjaCB0aG9zZSBpbiB5b3VyCitzb3VyY2VzLiAgWW91ciBsaW5lIG51bWJlcnMgd291bGQgY29udmV5IG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB1cy4KK0BlbmQgaXRlbWl6ZQorCitIZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5OgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW52ZWxvcGUgb2YgdGhlIGJ1Zy4KKworT2Z0ZW4gcGVvcGxlIHdobyBlbmNvdW50ZXIgYSBidWcgc3BlbmQgYSBsb3Qgb2YgdGltZSBpbnZlc3RpZ2F0aW5nCit3aGljaCBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBmaWxlIHdpbGwgbWFrZSB0aGUgYnVnIGdvIGF3YXkgYW5kIHdoaWNoCitjaGFuZ2VzIHdpbGwgbm90IGFmZmVjdCBpdC4KKworVGhpcyBpcyBvZnRlbiB0aW1lIGNvbnN1bWluZyBhbmQgbm90IHZlcnkgdXNlZnVsLCBiZWNhdXNlIHRoZSB3YXkgd2UKK3dpbGwgZmluZCB0aGUgYnVnIGlzIGJ5IHJ1bm5pbmcgYSBzaW5nbGUgZXhhbXBsZSB1bmRlciB0aGUgZGVidWdnZXIKK3dpdGggYnJlYWtwb2ludHMsIG5vdCBieSBwdXJlIGRlZHVjdGlvbiBmcm9tIGEgc2VyaWVzIG9mIGV4YW1wbGVzLgorV2UgcmVjb21tZW5kIHRoYXQgeW91IHNhdmUgeW91ciB0aW1lIGZvciBzb21ldGhpbmcgZWxzZS4KKworT2YgY291cnNlLCBpZiB5b3UgY2FuIGZpbmQgYSBzaW1wbGVyIGV4YW1wbGUgdG8gcmVwb3J0IEBlbXBoe2luc3RlYWR9CitvZiB0aGUgb3JpZ2luYWwgb25lLCB0aGF0IGlzIGEgY29udmVuaWVuY2UgZm9yIHVzLiAgRXJyb3JzIGluIHRoZQorb3V0cHV0IHdpbGwgYmUgZWFzaWVyIHRvIHNwb3QsIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIHdpbGwgdGFrZQorbGVzcyB0aW1lLCBhbmQgc28gb24uCisKK0hvd2V2ZXIsIHNpbXBsaWZpY2F0aW9uIGlzIG5vdCB2aXRhbDsgaWYgeW91IGRvIG5vdCB3YW50IHRvIGRvIHRoaXMsCityZXBvcnQgdGhlIGJ1ZyBhbnl3YXkgYW5kIHNlbmQgdXMgdGhlIGVudGlyZSB0ZXN0IGNhc2UgeW91IHVzZWQuCisKK0BpdGVtCitBIHBhdGNoIGZvciB0aGUgYnVnLgorCitBIHBhdGNoIGZvciB0aGUgYnVnIGRvZXMgaGVscCB1cyBpZiBpdCBpcyBhIGdvb2Qgb25lLiAgQnV0IGRvIG5vdCBvbWl0Cit0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0ZXN0IGNhc2UsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKK2EgcGF0Y2ggaXMgYWxsIHdlIG5lZWQuICBXZSBtaWdodCBzZWUgcHJvYmxlbXMgd2l0aCB5b3VyIHBhdGNoIGFuZCBkZWNpZGUKK3RvIGZpeCB0aGUgcHJvYmxlbSBhbm90aGVyIHdheSwgb3Igd2UgbWlnaHQgbm90IHVuZGVyc3RhbmQgaXQgYXQgYWxsLgorCitTb21ldGltZXMgd2l0aCBhIHByb2dyYW0gYXMgY29tcGxpY2F0ZWQgYXMgQGNvZGV7QHZhbHVle0FTfX0gaXQgaXMgdmVyeSBoYXJkIHRvCitjb25zdHJ1Y3QgYW4gZXhhbXBsZSB0aGF0IHdpbGwgbWFrZSB0aGUgcHJvZ3JhbSBmb2xsb3cgYSBjZXJ0YWluIHBhdGggdGhyb3VnaAordGhlIGNvZGUuICBJZiB5b3UgZG8gbm90IHNlbmQgdXMgdGhlIGV4YW1wbGUsIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gY29uc3RydWN0CitvbmUsIHNvIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGJ1ZyBpcyBmaXhlZC4KKworQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKK3BhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKK2hlbHAgdXMgdG8gdW5kZXJzdGFuZC4KKworQGl0ZW0KK0EgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KKworU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAordGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIEFja25vd2xlZGdlbWVudHMKK0BjaGFwdGVyIEFja25vd2xlZGdlbWVudHMKKworSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgdG8gQGNvZGV7QHZhbHVle0FTfX0gYW5kIHlvdXIgbmFtZSBpc24ndCBsaXN0ZWQgaGVyZSwKK2l0IGlzIG5vdCBtZWFudCBhcyBhIHNsaWdodC4gIFdlIGp1c3QgZG9uJ3Qga25vdyBhYm91dCBpdC4gIFNlbmQgbWFpbCB0byB0aGUKK21haW50YWluZXIsIGFuZCB3ZSdsbCBjb3JyZWN0IHRoZSBzaXR1YXRpb24uICBDdXJyZW50bHkgCitAYyAoSmFudWFyeSAxOTk0KSwgCit0aGUgbWFpbnRhaW5lciBpcyBLZW4gUmFlYnVybiAoZW1haWwgYWRkcmVzcyBAY29kZXtyYWVidXJuQEBjeWdudXMuY29tfSkuCisKK0RlYW4gRWxzbmVyIHdyb3RlIHRoZSBvcmlnaW5hbCBAc2N7Z251fSBhc3NlbWJsZXIgZm9yIHRoZSBWQVguQGZvb3Rub3Rle0FueQorbW9yZSBkZXRhaWxzP30KKworSmF5IEZlbmxhc29uIG1haW50YWluZWQgR0FTIGZvciBhIHdoaWxlLCBhZGRpbmcgc3VwcG9ydCBmb3IgR0RCLXNwZWNpZmljIGRlYnVnCitpbmZvcm1hdGlvbiBhbmQgdGhlIDY4ayBzZXJpZXMgbWFjaGluZXMsIG1vc3Qgb2YgdGhlIHByZXByb2Nlc3NpbmcgcGFzcywgYW5kCitleHRlbnNpdmUgY2hhbmdlcyBpbiBAZmlsZXttZXNzYWdlcy5jfSwgQGZpbGV7aW5wdXQtZmlsZS5jfSwgQGZpbGV7d3JpdGUuY30uCisKK0suIFJpY2hhcmQgUGl4bGV5IG1haW50YWluZWQgR0FTIGZvciBhIHdoaWxlLCBhZGRpbmcgdmFyaW91cyBlbmhhbmNlbWVudHMgYW5kCittYW55IGJ1ZyBmaXhlcywgaW5jbHVkaW5nIG1lcmdpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbCBwcm9jZXNzb3JzLCBicmVha2luZyBHQVMKK3VwIHRvIGhhbmRsZSBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXQgYmFjayBlbmRzIChpbmNsdWRpbmcgaGVhdnkgcmV3cml0ZSwKK3Rlc3RpbmcsIGFuIGludGVncmF0aW9uIG9mIHRoZSBjb2ZmIGFuZCBiLm91dCBiYWNrIGVuZHMpLCBhZGRpbmcgY29uZmlndXJhdGlvbgoraW5jbHVkaW5nIGhlYXZ5IHRlc3RpbmcgYW5kIHZlcmlmaWNhdGlvbiBvZiBjcm9zcyBhc3NlbWJsZXJzIGFuZCBmaWxlIHNwbGl0cworYW5kIHJlbmFtaW5nLCBjb252ZXJ0ZWQgR0FTIHRvIHN0cmljdGx5IEFOU0kgQyBpbmNsdWRpbmcgZnVsbCBwcm90b3R5cGVzLCBhZGRlZAorc3VwcG9ydCBmb3IgbTY4MFszNF0wIGFuZCBjcHUzMiwgZGlkIGNvbnNpZGVyYWJsZSB3b3JrIG9uIGk5NjAgaW5jbHVkaW5nIGEgQ09GRgorcG9ydCAoaW5jbHVkaW5nIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIHJldmVyc2UgZW5naW5lZXJpbmcpLCBhIFNQQVJDIG9wY29kZQorZmlsZSByZXdyaXRlLCBERUNzdGF0aW9uLCByczYwMDAsIGFuZCBocDMwMGhwdXggaG9zdCBwb3J0cywgdXBkYXRlZCBgYGtub3cnJworYXNzZXJ0aW9ucyBhbmQgbWFkZSB0aGVtIHdvcmssIG11Y2ggb3RoZXIgcmVvcmdhbml6YXRpb24sIGNsZWFudXAsIGFuZCBsaW50LgorCitLZW4gUmFlYnVybiB3cm90ZSB0aGUgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlIGNvZGUgdG8gcmVwbGFjZSBtb3N0IG9mIHRoZSBjb2RlCitpbiBmb3JtYXQtc3BlY2lmaWMgSS9PIG1vZHVsZXMuCisKK1RoZSBvcmlnaW5hbCBWTVMgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgRGF2aWQgTC4gS2FzaHRhbi4gIEVyaWMgWW91bmdkYWxlCitoYXMgZG9uZSBtdWNoIHdvcmsgd2l0aCBpdCBzaW5jZS4KKworVGhlIEludGVsIDgwMzg2IG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIHdyaXR0ZW4gYnkgRWxpb3QgRHJlc3NlbGhhdXMuCisKK01pbmggVHJhbi1MZSBhdCBJbnRlbGxpQ29ycCBjb250cmlidXRlZCBzb21lIEFJWCAzODYgc3VwcG9ydC4KKworVGhlIE1vdG9yb2xhIDg4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyBjb250cmlidXRlZCBieSBEZXZvbiBCb3dlbiBvZiBCdWZmYWxvCitVbml2ZXJzaXR5IGFuZCBUb3Jiam9ybiBHcmFubHVuZCBvZiB0aGUgU3dlZGlzaCBJbnN0aXR1dGUgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKworS2VpdGggS25vd2xlcyBhdCB0aGUgT3BlbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHdyb3RlIHRoZSBvcmlnaW5hbCBNSVBTIGJhY2sgZW5kCisoQGZpbGV7dGMtbWlwcy5jfSwgQGZpbGV7dGMtbWlwcy5ofSksIGFuZCBjb250cmlidXRlZCBSb3NlIGZvcm1hdCBzdXBwb3J0Cisod2hpY2ggaGFzbid0IGJlZW4gbWVyZ2VkIGluIHlldCkuICBSYWxwaCBDYW1wYmVsbCB3b3JrZWQgd2l0aCB0aGUgTUlQUyBjb2RlIHRvCitzdXBwb3J0IGEub3V0IGZvcm1hdC4KKworU3VwcG9ydCBmb3IgdGhlIFppbG9nIFo4ayBhbmQgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzUwMCBwcm9jZXNzb3JzICh0Yy16OGssCit0Yy1oODMwMCwgdGMtaDg1MDApLCBhbmQgSUVFRSA2OTUgb2JqZWN0IGZpbGUgZm9ybWF0IChvYmotaWVlZSksIHdhcyB3cml0dGVuIGJ5CitTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4gIFN0ZXZlIGFsc28gbW9kaWZpZWQgdGhlIENPRkYgYmFjayBlbmQgdG8KK3VzZSBCRkQgZm9yIHNvbWUgbG93LWxldmVsIG9wZXJhdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgSDgvMzAwIGFuZCBBTUQgMjlrCit0YXJnZXRzLgorCitKb2huIEdpbG1vcmUgYnVpbHQgdGhlIEFNRCAyOTAwMCBzdXBwb3J0LCBhZGRlZCBAY29kZXsuaW5jbHVkZX0gc3VwcG9ydCwgYW5kCitzaW1wbGlmaWVkIHRoZSBjb25maWd1cmF0aW9uIG9mIHdoaWNoIHZlcnNpb25zIGFjY2VwdCB3aGljaCBkaXJlY3RpdmVzLiAgSGUKK3VwZGF0ZWQgdGhlIDY4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHNvIHRoYXQgTW90b3JvbGEncyBvcGNvZGVzIGFsd2F5cyBwcm9kdWNlZAorZml4ZWQtc2l6ZSBpbnN0cnVjdGlvbnMgKGUuZy4gQGNvZGV7anNyfSksIHdoaWxlIHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMKK3JlbWFpbmVkIHNocmlua2FibGUgKEBjb2Rle2pic3J9KS4gIEpvaG4gZml4ZWQgbWFueSBidWdzLCBpbmNsdWRpbmcgdHJ1ZSB0ZXN0ZWQKK2Nyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBvbmUgYnVnIGluIHJlbGF4YXRpb24gdGhhdCB0b29rIGEgd2VlayBhbmQKK3JlcXVpcmVkIHRoZSBwcm92ZXJiaWFsIG9uZS1iaXQgZml4LgorCitJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IG1lcmdlZCB0aGUgTW90b3JvbGEgYW5kIE1JVCBzeW50YXggZm9yIHRoZQorNjhrLCBjb21wbGV0ZWQgc3VwcG9ydCBmb3Igc29tZSBDT0ZGIHRhcmdldHMgKDY4aywgaTM4NiBTVlIzLCBhbmQgU0NPIFVuaXgpLAorYWRkZWQgc3VwcG9ydCBmb3IgTUlQUyBFQ09GRiBhbmQgRUxGIHRhcmdldHMsIHdyb3RlIHRoZSBpbml0aWFsIFJTLzYwMDAgYW5kCitQb3dlclBDIGFzc2VtYmxlciwgYW5kIG1hZGUgYSBmZXcgb3RoZXIgbWlub3IgcGF0Y2hlcy4KKworU3RldmUgQ2hhbWJlcmxhaW4gbWFkZSBAY29kZXtAdmFsdWV7QVN9fSBhYmxlIHRvIGdlbmVyYXRlIGxpc3RpbmdzLgorCitIZXdsZXR0LVBhY2thcmQgY29udHJpYnV0ZWQgc3VwcG9ydCBmb3IgdGhlIEhQOTAwMC8zMDAuCisKK0plZmYgTGF3IHdyb3RlIEdBUyBhbmQgQkZEIHN1cHBvcnQgZm9yIHRoZSBuYXRpdmUgSFBQQSBvYmplY3QgZm9ybWF0IChTT00pCithbG9uZyB3aXRoIGEgZmFpcmx5IGV4dGVuc2l2ZSBIUFBBIHRlc3RzdWl0ZSAoZm9yIGJvdGggU09NIGFuZCBFTEYgb2JqZWN0Citmb3JtYXRzKS4gIFRoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IGJvdGggdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdAordGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgQ3lnbnVzIFN1cHBvcnQuCisKK1N1cHBvcnQgZm9yIEVMRiBmb3JtYXQgZmlsZXMgaGFzIGJlZW4gd29ya2VkIG9uIGJ5IE1hcmsgRWljaGluIG9mIEN5Z251cworU3VwcG9ydCAob3JpZ2luYWwsIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24gZm9yIFNQQVJDKSwgUGV0ZSBIb29nZW5ib29tIGFuZAorSmVmZiBMYXcgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCAoSFBQQSBtYWlubHkpLCBNaWNoYWVsIE1laXNzbmVyIG9mIHRoZSBPcGVuCitTb2Z0d2FyZSBGb3VuZGF0aW9uIChpMzg2IG1haW5seSksIGFuZCBLZW4gUmFlYnVybiBvZiBDeWdudXMgU3VwcG9ydCAoc3BhcmMsCithbmQgc29tZSBpbml0aWFsIDY0LWJpdCBzdXBwb3J0KS4KKworUmljaGFyZCBIZW5kZXJzb24gcmV3cm90ZSB0aGUgQWxwaGEgYXNzZW1ibGVyLiBLbGF1cyBLYWVtcGYgd3JvdGUgR0FTIGFuZCBCRkQKK3N1cHBvcnQgZm9yIG9wZW5WTVMvQWxwaGEuCisKK1NldmVyYWwgZW5naW5lZXJzIGF0IEN5Z251cyBTdXBwb3J0IGhhdmUgYWxzbyBwcm92aWRlZCBtYW55IHNtYWxsIGJ1ZyBmaXhlcyBhbmQKK2NvbmZpZ3VyYXRpb24gZW5oYW5jZW1lbnRzLgorCitNYW55IG90aGVycyBoYXZlIGNvbnRyaWJ1dGVkIGxhcmdlIG9yIHNtYWxsIGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMuICBJZgoreW91IGhhdmUgY29udHJpYnV0ZWQgc2lnbmlmaWNhbnQgd29yayBhbmQgYXJlIG5vdCBtZW50aW9uZWQgb24gdGhpcyBsaXN0LCBhbmQKK3dhbnQgdG8gYmUsIGxldCB1cyBrbm93LiAgU29tZSBvZiB0aGUgaGlzdG9yeSBoYXMgYmVlbiBsb3N0OyB3ZSBhcmUgbm90CitpbnRlbnRpb25hbGx5IGxlYXZpbmcgYW55b25lIG91dC4KKworQG5vZGUgSW5kZXgKK0B1bm51bWJlcmVkIEluZGV4CisKK0BwcmludGluZGV4IGNwCisKK0Bjb250ZW50cworQGJ5ZQorQGMgTG9jYWwgVmFyaWFibGVzOgorQGMgZmlsbC1jb2x1bW46IDc5CitAYyBFbmQ6CmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtYTI5ay50ZXhpIGIvZ2FzL2RvYy9jLWEyOWsudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDExNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9jLWEyOWsudGV4aQpAQCAtMCwwICsxLDE4MiBAQAorQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgorQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCitAaWZzZXQgR0VORVJJQworQHBhZ2UKK0Bub2RlIEFNRDI5Sy1EZXBlbmRlbnQKK0BjaGFwdGVyIEFNRCAyOUsgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IEFNRCAyOUsgc3VwcG9ydAorQGNpbmRleCAyOUsgc3VwcG9ydAorQG1lbnUKKyogQU1EMjlLIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucworKiBBTUQyOUsgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKKyogQU1EMjlLIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKKyogQU1EMjlLIERpcmVjdGl2ZXM6OiAgICAgICAgICAgQU1EIDI5SyBNYWNoaW5lIERpcmVjdGl2ZXMKKyogQU1EMjlLIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcworQGVuZCBtZW51CisKK0Bub2RlIEFNRDI5SyBPcHRpb25zCitAc2VjdGlvbiBPcHRpb25zCitAY2luZGV4IEFNRCAyOUsgb3B0aW9ucyAobm9uZSkKK0BjaW5kZXggb3B0aW9ucyBmb3IgQU1EMjlLIChub25lKQorQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBBTUQKKzI5SyBmYW1pbHkuCisKK0Bub2RlIEFNRDI5SyBTeW50YXgKK0BzZWN0aW9uIFN5bnRheAorQG1lbnUKKyogQU1EMjlLLU1hY3Jvczo6CQlNYWNyb3MKKyogQU1EMjlLLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCisqIEFNRDI5Sy1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCitAZW5kIG1lbnUKKworQG5vZGUgQU1EMjlLLU1hY3JvcworQHN1YnNlY3Rpb24gTWFjcm9zCisKK0BjaW5kZXggTWFjcm9zLCBBTUQgMjlLCitAY2luZGV4IEFNRCAyOUsgbWFjcm9zCitUaGUgbWFjcm8gc3ludGF4IHVzZWQgb24gdGhlIEFNRCAyOUsgaXMgbGlrZSB0aGF0IGRlc2NyaWJlZCBpbiB0aGUgQU1ECisyOUsgRmFtaWx5IE1hY3JvIEFzc2VtYmxlciBTcGVjaWZpY2F0aW9uLiAgTm9ybWFsIEBjb2Rle0B2YWx1ZXtBU319CittYWNyb3Mgc2hvdWxkIHN0aWxsIHdvcmsuCisKK0Bub2RlIEFNRDI5Sy1DaGFycworQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCisKK0BjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgQU1EIDI5SworQGNpbmRleCBBTUQgMjlLIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKK0BzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgorCitAY2luZGV4IGlkZW50aWZpZXJzLCBBTUQgMjlLCitAY2luZGV4IEFNRCAyOUsgaWRlbnRpZmllcnMKK1RoZSBjaGFyYWN0ZXIgQHNhbXB7P30gaXMgcGVybWl0dGVkIGluIGlkZW50aWZpZXJzIChidXQgbWF5IG5vdCBiZWdpbgorYW4gaWRlbnRpZmllcikuCisKK0Bub2RlIEFNRDI5Sy1SZWdzCitAc3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcworCitAY2luZGV4IEFNRCAyOUsgcmVnaXN0ZXIgbmFtZXMKK0BjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIEFNRCAyOUsKK0dlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IHByZWRlZmluZWQgc3ltYm9scyBvZiB0aGUKK2Zvcm0gQHNhbXB7R1JAdmFye25ubn19IChmb3IgZ2xvYmFsIHJlZ2lzdGVycykgb3IgQHNhbXB7TFJAdmFye25ubn19CisoZm9yIGxvY2FsIHJlZ2lzdGVycyksIHdoZXJlIEB2YXJ7bm5ufSByZXByZXNlbnRzIGEgbnVtYmVyIGJldHdlZW4KK0Bjb2RlezB9IGFuZCBAY29kZXsxMjd9LCB3cml0dGVuIHdpdGggbm8gbGVhZGluZyB6ZXJvcy4gIFRoZSBsZWFkaW5nCitsZXR0ZXJzIG1heSBiZSBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBzYW1we2dyMTN9CithbmQgQHNhbXB7TFI3fSBhcmUgYm90aCB2YWxpZCByZWdpc3RlciBuYW1lcy4KKworWW91IG1heSBhbHNvIHJlZmVyIHRvIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgYnkgc3BlY2lmeWluZyB0aGUKK3JlZ2lzdGVyIG51bWJlciBhcyB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gKHByZWZpeGVkIHdpdGggQHNhbXB7JSV9Cit0byBmbGFnIHRoZSBleHByZXNzaW9uIGFzIGEgcmVnaXN0ZXIgbnVtYmVyKToKK0BzbWFsbGV4YW1wbGUKKyUlQHZhcntleHByZXNzaW9ufQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAorLS0td2hlcmUgQHZhcntleHByZXNzaW9ufSBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBhCitudW1iZXIgYmV0d2VlbiBAY29kZXswfSBhbmQgQGNvZGV7MjU1fS4gIFRoZSByYW5nZSBbMCwgMTI3XSByZWZlcnMgdG8KK2dsb2JhbCByZWdpc3RlcnMsIGFuZCB0aGUgcmFuZ2UgWzEyOCwgMjU1XSB0byBsb2NhbCByZWdpc3RlcnMuCisKK0BjaW5kZXggc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycywgQU1EIDI5SworQGNpbmRleCBBTUQgMjlLIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMKK0BjaW5kZXggcHJvdGVjdGVkIHJlZ2lzdGVycywgQU1EIDI5SworQGNpbmRleCBBTUQgMjlLIHByb3RlY3RlZCByZWdpc3RlcnMKK0luIGFkZGl0aW9uLCBAY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIHByb3RlY3RlZAorc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzIGZvciB0aGUgQU1EIDI5SyBmYW1pbHk6CisKK0BzbWFsbGV4YW1wbGUKKyAgdmFiICAgIGNoZCAgICBwYzAKKyAgb3BzICAgIGNoYyAgICBwYzEKKyAgY3BzICAgIHJicCAgICBwYzIKKyAgY2ZnICAgIHRtYyAgICBtbXUKKyAgY2hhICAgIHRtciAgICBscnUKK0BlbmQgc21hbGxleGFtcGxlCisKK1RoZXNlIHVucHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyBhcmUgYWxzbyByZWNvZ25pemVkOgorQHNtYWxsZXhhbXBsZQorICBpcGMgICAgYWx1ICAgIGZwZQorICBpcGEgICAgYnAgICAgIGludGUKKyAgaXBiICAgIGZjICAgICBmcHMKKyAgcSAgICAgIGNyICAgICBleG9wCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9kZSBBTUQyOUsgRmxvYXRpbmcgUG9pbnQKK0BzZWN0aW9uIEZsb2F0aW5nIFBvaW50CisKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEFNRCAyOUsgKEBzY3tpZWVlfSkKK0BjaW5kZXggQU1EIDI5SyBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQorVGhlIEFNRCAyOUsgZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisKK0Bub2RlIEFNRDI5SyBEaXJlY3RpdmVzCitAc2VjdGlvbiBBTUQgMjlLIE1hY2hpbmUgRGlyZWN0aXZlcworCitAY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgQU1EIDI5SworQGNpbmRleCBBTUQgMjlLIG1hY2hpbmUgZGlyZWN0aXZlcworQHRhYmxlIEBjb2RlCitAY2luZGV4IEBjb2Rle2Jsb2NrfSBkaXJlY3RpdmUsIEFNRCAyOUsKK0BpdGVtIC5ibG9jayBAdmFye3NpemV9ICwgQHZhcntmaWxsfQorVGhpcyBkaXJlY3RpdmUgZW1pdHMgQHZhcntzaXplfSBieXRlcywgZWFjaCBvZiB2YWx1ZSBAdmFye2ZpbGx9LiAgQm90aAorQHZhcntzaXplfSBhbmQgQHZhcntmaWxsfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBJZiB0aGUgY29tbWEKK2FuZCBAdmFye2ZpbGx9IGFyZSBvbWl0dGVkLCBAdmFye2ZpbGx9IGlzIGFzc3VtZWQgdG8gYmUgemVyby4KKworSW4gb3RoZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgdGhpcyBkaXJlY3RpdmUgaXMgY2FsbGVkCitAc2FtcHsuc3BhY2V9LgorQGVuZCB0YWJsZQorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7Y3B1dHlwZX0gZGlyZWN0aXZlLCBBTUQgMjlLCitAaXRlbSAuY3B1dHlwZQorVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgorQU1EIDI5SyBhc3NlbWJsZXJzLgorCitAY2luZGV4IEBjb2Rle2ZpbGV9IGRpcmVjdGl2ZSwgQU1EIDI5SworQGl0ZW0gLmZpbGUKK1RoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKK0FNRCAyOUsgYXNzZW1ibGVycy4KKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IGluIG90aGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIEBjb2Rley5maWxlfSBpcwordXNlZCBmb3IgdGhlIGRpcmVjdGl2ZSBjYWxsZWQgQGNvZGV7LmFwcC1maWxlfSBpbiB0aGUgQU1EIDI5SyBzdXBwb3J0LgorQGVuZCBxdW90YXRpb24KKworQGNpbmRleCBAY29kZXtsaW5lfSBkaXJlY3RpdmUsIEFNRCAyOUsKK0BpdGVtIC5saW5lCitUaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCitBTUQgMjlLIGFzc2VtYmxlcnMuCisKK0BpZ25vcmUKK0BjIHNpbmNlIHdlJ3JlIGlnbm9yaW5nIC5sc3ltLi4uCitAY2luZGV4IEBjb2Rle3JlZ30gZGlyZWN0aXZlLCBBTUQgMjlLCitAaXRlbSAucmVnIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufQorQGNvZGV7LnJlZ30gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsubHN5bX07IEBweHJlZntMc3ltLCxAY29kZXsubHN5bX19LgorQGVuZCBpZ25vcmUKKworQGNpbmRleCBAY29kZXtzZWN0fSBkaXJlY3RpdmUsIEFNRCAyOUsKK0BpdGVtIC5zZWN0CitUaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCitBTUQgMjlLIGFzc2VtYmxlcnMuCisKK0BjaW5kZXggQGNvZGV7dXNlfSBkaXJlY3RpdmUsIEFNRCAyOUsKK0BpdGVtIC51c2UgQHZhcntzZWN0aW9uIG5hbWV9CitFc3RhYmxpc2hlcyB0aGUgc2VjdGlvbiBhbmQgc3Vic2VjdGlvbiBmb3IgdGhlIGZvbGxvd2luZyBjb2RlOworQHZhcntzZWN0aW9uIG5hbWV9IG1heSBiZSBvbmUgb2YgQGNvZGV7LnRleHR9LCBAY29kZXsuZGF0YX0sCitAY29kZXsuZGF0YTF9LCBvciBAY29kZXsubGl0fS4gIFdpdGggb25lIG9mIHRoZSBmaXJzdCB0aHJlZSBAdmFye3NlY3Rpb24KK25hbWV9IG9wdGlvbnMsIEBzYW1wey51c2V9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1hY2hpbmUgZGlyZWN0aXZlCitAdmFye3NlY3Rpb24gbmFtZX07IHRoZSByZW1haW5pbmcgY2FzZSwgQHNhbXB7LnVzZSAubGl0fSwgaXMgdGhlIHNhbWUgYXMKK0BzYW1wey5kYXRhIDIwMH0uCitAZW5kIHRhYmxlCisKK0Bub2RlIEFNRDI5SyBPcGNvZGVzCitAc2VjdGlvbiBPcGNvZGVzCisKK0BjaW5kZXggQU1EIDI5SyBvcGNvZGVzCitAY2luZGV4IG9wY29kZXMgZm9yIEFNRCAyOUsKK0Bjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBBTUQgMjlLIG9wY29kZXMuICBObworYWRkaXRpb25hbCBwc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCisKK0ZvciBpbmZvcm1hdGlvbiBvbiB0aGUgMjlLIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7QW0yOTAwMAorVXNlcidzIE1hbnVhbH0sIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWFybS50ZXhpIGIvZ2FzL2RvYy9jLWFybS50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGZiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL2MtYXJtLnRleGkKQEAgLTAsMCArMSwyMDcgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorCitAaWZzZXQgR0VORVJJQworQHBhZ2UKK0Bub2RlIEFSTS1EZXBlbmRlbnQKK0BjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZzZXQKKworQGlmY2xlYXIgR0VORVJJQworQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKK0BjaGFwdGVyIEFSTSBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IEFSTSBzdXBwb3J0CitAY2luZGV4IFRodW1iIHN1cHBvcnQKK0BtZW51CisqIEFSTSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKKyogQVJNIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4CisqIEFSTSBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50CisqIEFSTSBEaXJlY3RpdmVzOjogICAgICAgICAgIEFSTSBNYWNoaW5lIERpcmVjdGl2ZXMKKyogQVJNIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcworQGVuZCBtZW51CisKK0Bub2RlIEFSTSBPcHRpb25zCitAc2VjdGlvbiBPcHRpb25zCitAY2luZGV4IEFSTSBvcHRpb25zIChub25lKQorQGNpbmRleCBvcHRpb25zIGZvciBBUk0gKG5vbmUpCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7LW1hcm19IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQorQGl0ZW0gLW1hcm0gQHZhcntbMnwyNTB8M3w2fDYwfDYwMHw2MTB8NjIwfDd8N218N2R8N2RtfDdkaXw3ZG1pfDcwfDcwMHw3MDBpfDcxMHw3MTBjfDcxMDB8NzUwMHw3NTAwZmV8N3RkbWl8OHw4MTB8OXw5dGRtaXN0cm9uZ2FybXxzdHJvbmdhcm0xMTB8c3Ryb25nYXJtMTEwMF19CitUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHRhcmdldCBwcm9jZXNzb3IuICBUaGUgYXNzZW1ibGVyIHdpbGwgaXNzdWUgYW4KK2Vycm9yIG1lc3NhZ2UgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHdoaWNoCit3aWxsIG5vdCBleGVjdXRlIG9uIHRoZSB0YXJnZXQgcHJvY2Vzc29yLgorQGNpbmRleCBAY29kZXstbWFybXZ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQorQGl0ZW0gLW1hcm12IEB2YXJ7WzJ8MmF8M3wzbXw0fDR0XX0KK1RoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIFRoZSBhc3NlbWJsZXIgd2lsbCBpc3N1ZQorYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKK3dpbGwgbm90IGV4ZWN1dGUgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCitAY2luZGV4IEBjb2Rley1tdGh1bWJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQorQGl0ZW0gLW10aHVtYgorVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgb25seSBUaHVtYiBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFzc2VtYmxlZC4KK0BjaW5kZXggQGNvZGV7LW1hbGx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQorQGl0ZW0gLW1hbGwKK1RoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IGFueSBBcm0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFzc2VtYmxlZC4KK0BjaW5kZXggQGNvZGV7LW1mcGF9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQorQGl0ZW0gLW1mcGEgQHZhcntbMTB8MTFdfQorVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBmbG9hdGluZyBwb2ludCBhcmNoaXRlY3R1cmUgaW4gdXNlIG9uIHRoZQordGFyZ2V0IHByb2Nlc3Nvci4gCitAY2luZGV4IEBjb2Rley1tZnBlLW9sZH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCitAaXRlbSAtbWZwZS1vbGQKK0RvIG5vdCBhbGxvdyB0aGUgYXNzZW1ibGUgb2YgZmxvYXRpbmcgcG9pbnQgbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zLgorQGNpbmRleCBAY29kZXstbW5vLWZwdX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCitAaXRlbSAtbW5vLWZwdQorRG8gbm90IGFsbG93IHRoZSBhc3NlbWJseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLgorQGNpbmRleCBAY29kZXstbXRodW1iLWludGVyd29ya30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCitAaXRlbSAtbXRodW1iLWludGVyd29yaworVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKK2JlIG1hcmtlZCBhcyBzdXBwb3J0aW5nIGludGVyd29ya2luZy4KK0BjaW5kZXggQGNvZGV7LW1hcGNzfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KK0BpdGVtIC1tYXBjcyBAdmFye1syNnwzMl19CitUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAorYmUgbWFya2VkIGFzIHN1cHBvcnRpbmcgdGhlIGluZGljYXRlZCB2ZXJzaW9uIG9mIHRoZSBBcm0gUHJvY2VkdXJlLgorQ2FsbGluZyBTdGFuZGFyZC4KK0BpdGVtIC1tYXBjcy1mbG9hdAorVGhpcyBpbmRpY2F0ZXMgdGhlIHRoZSBmbG9hdGluZyBwb2ludCB2YXJpYW50IG9mIHRoZSBBUENTIHNob3VsZCBiZQordXNlZC4gIEluIHRoaXMgdmFyaWFudCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBGUAorcmVnaXN0ZXJzIHJhdGVociB0aGFuIGludGVnZXIgcmVnaXN0ZXJzLgorQGl0ZW0gLW1hcGNzLXJlZW50cmFudAorVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVlbnRyYW50IHZhcmlhbnQgb2YgdGhlIEFQQ1Mgc2hvdWxkIGJlIHVzZWQuCitUaGlzIHZhcmlhbnQgc3VwcG9ydHMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4KK0BjaW5kZXggQGNvZGV7LUVCfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KK0BpdGVtIC1FQgorVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKK2JlIG1hcmtlZCBhcyBiZWluZyBlbmNvZGVkIGZvciBhIGJpZy1lbmRpYW4gcHJvY2Vzc29yLgorQGNpbmRleCBAY29kZXstRUx9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQorQGl0ZW0gLUVMCitUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCB0aGUgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgYXNzZW1ibGVyIHNob3VsZAorYmUgbWFya2VkIGFzIGJlaW5nIGVuY29kZWQgZm9yIGEgbGl0dGxlLWVuZGlhbiBwcm9jZXNzb3IuCitAY2luZGV4IEBjb2Rley1rfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KK0BjaW5kZXggUElDIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQVJNCitAaXRlbSAtaworVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBQSUMgKHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgorQGl0ZW0gLW1vYWJpCitUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBhc3NlbWJsZWQgdXNpbmcgdGhlIG9sZCBBUk0gRUxGCitjb252ZW50aW9ucywgYmFzZWQgb24gYSBiZXRhIHJlbGVhc2UgcmVsZWFzZSBvZiB0aGUgQVJNLUVMRgorc3BlY2lmaWNhdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGNvbnZlbnRpb25zIHdoaWNoIGFyZSBiYXNlZCBvbgordGhlIGZpbmFsIHJlbGVhc2Ugb2YgdGhlIEFSTS1FTEYgc3BlY2lmaWNhdGlvbnMuCitAZW5kIHRhYmxlCisKKworQG5vZGUgQVJNIFN5bnRheAorQHNlY3Rpb24gU3ludGF4CitAbWVudQorKiBBUk0tQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKKyogQVJNLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKK0BlbmQgbWVudQorCitAbm9kZSBBUk0tQ2hhcnMKK0BzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycworCitAY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEFSTQorQGNpbmRleCBBUk0gbGluZSBjb21tZW50IGNoYXJhY3RlcgorVGhlIHByZXNlbmNlIG9mIGEgQHNhbXB7I30gYW5kIEBzYW1we0BAfSBvbiBhIGxpbmUgaW5kaWNhdGVzIHRoZSBzdGFydCBvZgorYSBjb21tZW50IHRoYXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUuCisKK0BjaW5kZXggaWRlbnRpZmllcnMsIEFSTQorQGNpbmRleCBBUk0gaWRlbnRpZmllcnMKKypUT0RPKiBFeHBsYWluIGFib3V0IC9kYXRhIG1vZGlmaWVyIG9uIHN5bWJvbHMuCisKK0Bub2RlIEFSTS1SZWdzCitAc3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcworCitAY2luZGV4IEFSTSByZWdpc3RlciBuYW1lcworQGNpbmRleCByZWdpc3RlciBuYW1lcywgQVJNCisqVE9ETyogRXhwbGFpbiBhYm91dCBBUk0gcmVnaXN0ZXIgbmFtaW5nLCBhbmQgdGhlIHByZWRlZmluZWQgbmFtZXMuCisKK0Bub2RlIEFSTSBGbG9hdGluZyBQb2ludAorQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKKworQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQVJNIChAc2N7aWVlZX0pCitAY2luZGV4IEFSTSBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQorVGhlIEFSTSBmYW1pbHkgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKworCisKK0Bub2RlIEFSTSBEaXJlY3RpdmVzCitAc2VjdGlvbiBBUk0gTWFjaGluZSBEaXJlY3RpdmVzCisKK0BjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBBUk0KK0BjaW5kZXggQVJNIG1hY2hpbmUgZGlyZWN0aXZlcworQHRhYmxlIEBjb2RlCisKK0BjaW5kZXggQGNvZGV7cmVxfSBkaXJlY3RpdmUsIEFSTQorQGl0ZW0gQHZhcntuYW1lfSAucmVxIEB2YXJ7cmVnaXN0ZXIgbmFtZX0KK1RoaXMgY3JlYXRlcyBhbiBhbGlhcyBmb3IgQHZhcntyZWdpc3RlciBuYW1lfSBjYWxsZWQgQHZhcntuYW1lfS4gIEZvcgorZXhhbXBsZToKKworQHNtYWxsZXhhbXBsZQorICAgICAgICBmb28gLnJlcSByMAorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNpbmRleCBAY29kZXtjb2RlfSBkaXJlY3RpdmUsIEFSTQorQGl0ZW0gLmNvZGUgQHZhcntbMTZ8MzJdfQorVGhpcyBkaXJlY3RpdmUgc2VsZWN0cyB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGJlaW5nIGdlbmVyYXRlZC4gVGhlIHZhbHVlIDE2CitzZWxlY3RzIFRodW1iLCB3aXRoIHRoZSB2YWx1ZSAzMiBzZWxlY3RpbmcgQVJNLgorCitAY2luZGV4IEBjb2Rle3RodW1ifSBkaXJlY3RpdmUsIEFSTQorQGl0ZW0gLnRodW1iCitUaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBAdmFyey5jb2RlIDE2fS4KKworQGNpbmRleCBAY29kZXthcm19IGRpcmVjdGl2ZSwgQVJNCitAaXRlbSAuYXJtCitUaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBAdmFyey5jb2RlIDMyfS4KKworQGNpbmRleCBAY29kZXtmb3JjZV90aHVtYn0gZGlyZWN0aXZlLCBBUk0KK0BpdGVtIC5mb3JjZV90aHVtYgorVGhpcyBkaXJlY3RpdmUgZm9yY2VzIHRoZSBzZWxlY3Rpb24gb2YgVGh1bWIgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoZQordGFyZ2V0IHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRob3NlIGluc3RydWN0aW9ucworCitAY2luZGV4IEBjb2Rle3RodW1iX2Z1bmN9IGRpcmVjdGl2ZSwgQVJNCitAaXRlbSAudGh1bWJfZnVuYworVGhpcyBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgdGhlIGZvbGxvd2luZyBzeW1ib2wgaXMgdGhlIG5hbWUgb2YgYQorVGh1bWIgZW5jb2RlZCBmdW5jdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93Cit0aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIgdG8gZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvciBpbnRlcndvcmtpbmcKK2JldHdlZW4gQXJtIGFuZCBUaHVtYiBpbnN0cnVjdGlvbnMgYW5kIHNob3VsZCBiZSB1c2VkIGV2ZW4gaWYKK2ludGVyd29ya2luZyBpcyBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWVkLgorCitAY2luZGV4IEBjb2Rley5sdG9yZ30gZGlyZWN0aXZlLCBBUk0KK0BpdGVtIC5sdG9yZworVGhpcyBkaXJlY3RpdmUgY2F1c2VzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBsaXRlcmFsIHBvb2wgdG8gYmUKK2R1bXBlZCBpbnRvIHRoZSBjdXJyZW50IHNlY3Rpb24gKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgdGhlIC50ZXh0CitzZWN0aW9uKSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiAoYWxpZ25lZCB0byBhIHdvcmQgYm91bmRhcnkpLgorCitAY2luZGV4IEBjb2Rley5wb29sfSBkaXJlY3RpdmUsIEFSTQorQGl0ZW0gLnBvb2wKK1RoaXMgaXMgYSBzeW5vbnltIGZvciAubHRvcmcuCisKK0BlbmQgdGFibGUKKworQG5vZGUgQVJNIE9wY29kZXMKK0BzZWN0aW9uIE9wY29kZXMKKworQGNpbmRleCBBUk0gb3Bjb2RlcworQGNpbmRleCBvcGNvZGVzIGZvciBBUk0KK0Bjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBBUk0gb3Bjb2Rlcy4KKworKlRPRE8qIERvY3VtZW50IHRoZSBwc2V1ZG8tb3BzIChhZHIsIG5vcCkKKworR0FTIGZvciB0aGUgQVJNIHN1cHBvcnRzIGEgc3ludGhldGljIHJlZ2lzdGVyIGxvYWQgaW5zdHJ1Y3Rpb24gd2hvZXMKK3N5bnRheCBpczogCisKK0BzbWFsbGV4YW1wbGUKKyAgbGRyIDxyZWdpc3Rlcj4gLCA9IDxleHByZXNzaW9uPgorQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBudW1lcmljIGNvbnN0YW50IHRoZW4gYSBNT1Ygb3IgTVZOCitpbnN0cnVjdGlvbiB3aWxsIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIExEUiBpbnN0cnVjdGlvbiwgaWYgdGhlCitjb25zdGFudCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGVpdGhlciBvZiB0aGVzZSBpbnN0cnVjdGlvbnMuICBPdGhlcndpc2UKK3RoZSBjb25zdGFudCB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBuZWFyZXN0IGxpdGVyYWwgcG9vbCAoaWYgaXQgbm90CithbHJlYWR5IHRoZXJlKSBhbmQgYSBQQyByZWxhdGl2ZSBMRFIgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQuCisKK0ZvciBpbmZvcm1hdGlvbiBvbiB0aGUgQVJNIG9yIFRodW1iIGluc3RydWN0aW9uIHNldHMsIHNlZSBAY2l0ZXtBUk0KK1NvZnR3YXJlIERldmVsb3BtZW50IFRvb2xraXQgUmVmZXJlbmNlIE1hbnVhbH0sIEFkdmFuY2VkIFJJU0MgTWFjaGluZXMKK0x0ZC4KKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWQxMHYudGV4aSBiL2dhcy9kb2MvYy1kMTB2LnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3YmY4OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1kMTB2LnRleGkKQEAgLTAsMCArMSwyNTAgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAbm9kZSBEMTBWLURlcGVuZGVudAorQGNoYXB0ZXIgRDEwViBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEdFTkVSSUMKK0Bub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCitAY2hhcHRlciBEMTBWIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggRDEwViBzdXBwb3J0CitAbWVudQorKiBEMTBWLU9wdHM6OiAgICAgICAgICAgICAgICAgICBEMTBWIE9wdGlvbnMKKyogRDEwVi1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4CisqIEQxMFYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50CisqIEQxMFYtT3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKK0BlbmQgbWVudQorCitAbm9kZSBEMTBWLU9wdHMKK0BzZWN0aW9uIEQxMFYgT3B0aW9ucworQGNpbmRleCBvcHRpb25zLCBEMTBWCitAY2luZGV4IEQxMFYgb3B0aW9ucworVGhlIE1pdHN1YmlzaGkgRDEwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCitkZXBlbmRlbnQgb3B0aW9ucy4KKworQHRhYmxlIEBzYW1wCitAaXRlbSAtTworVGhlIEQxMFYgY2FuIG9mdGVuIGV4ZWN1dGUgdHdvIHN1Yi1pbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuIFdoZW4gdGhpcyBvcHRpb24KK2lzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBpdHMgb3V0cHV0IGJ5IGRldGVjdGluZyB3aGVuCitpbnN0cnVjdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgorQGl0ZW0gLS1ub3dhcm5zd2FwCitUbyBvcHRpbWl6ZSBleGVjdXRpb24gcGVyZm9ybWFuY2UsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgc29tZXRpbWVzIHN3YXAgdGhlCitvcmRlciBvZiBpbnN0cnVjdGlvbnMuIE5vcm1hbGx5IHRoaXMgZ2VuZXJhdGVzIGEgd2FybmluZy4gV2hlbiB0aGlzIG9wdGlvbiAKK2lzIHVzZWQsIG5vIHdhcm5pbmcgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBpbnN0cnVjdGlvbnMgYXJlIHN3YXBwZWQuCitAZW5kIHRhYmxlCisKK0Bub2RlIEQxMFYtU3ludGF4CitAc2VjdGlvbiBTeW50YXgKK0BjaW5kZXggRDEwViBzeW50YXgKK0BjaW5kZXggc3ludGF4LCBEMTBWCisKK1RoZSBEMTBWIHN5bnRheCBpcyBiYXNlZCBvbiB0aGUgc3ludGF4IGluIE1pdHN1YmlzaGkncyBEMTBWIGFyY2hpdGVjdHVyZSBtYW51YWwuCitUaGUgZGlmZmVyZW5jZXMgYXJlIGRldGFpbGVkIGJlbG93LgorCitAbWVudQorKiBEMTBWLVNpemU6OiAgICAgICAgICAgICAgICAgU2l6ZSBNb2RpZmllcnMKKyogRDEwVi1TdWJzOjogICAgICAgICAgICAgICAgIFN1Yi1JbnN0cnVjdGlvbnMKKyogRDEwVi1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycworKiBEMTBWLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKKyogRDEwVi1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKKyogRDEwVi1Xb3JkOjogICAgICAgICAgICAgICAgIEBAV09SRCBNb2RpZmllcgorQGVuZCBtZW51CisKKworQG5vZGUgRDEwVi1TaXplCitAc3Vic2VjdGlvbiBTaXplIE1vZGlmaWVycworQGNpbmRleCBEMTBWIHNpemUgbW9kaWZpZXJzCitAY2luZGV4IHNpemUgbW9kaWZpZXJzLCBEMTBWCitUaGUgRDEwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgdGhlIGluc3RydWN0aW9uIG5hbWVzIGluIHRoZSBEMTBWCitBcmNoaXRlY3R1cmUgTWFudWFsLiAgSG93ZXZlciwgdGhlIG5hbWVzIGluIHRoZSBtYW51YWwgYXJlIHNvbWV0aW1lcyBhbWJpZ3VvdXMuCitUaGVyZSBhcmUgaW5zdHJ1Y3Rpb24gbmFtZXMgdGhhdCBjYW4gYXNzZW1ibGUgdG8gYSBzaG9ydCBvciBsb25nIGZvcm0gb3Bjb2RlLgorSG93IGRvZXMgdGhlIGFzc2VtYmxlciBwaWNrIHRoZSBjb3JyZWN0IGZvcm0/ICBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGFsd2F5cyBwaWNrIHRoZQorc21hbGxlc3QgZm9ybSBpZiBpdCBjYW4uICBXaGVuIGRlYWxpbmcgd2l0aCBhIHN5bWJvbCB0aGF0IGlzIG5vdCBkZWZpbmVkIHlldCB3aGVuIGEKK2xpbmUgaXMgYmVpbmcgYXNzZW1ibGVkLCBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIGxvbmcgZm9ybS4gIElmIHlvdSBuZWVkIHRvIGZvcmNlIHRoZSAKK2Fzc2VtYmxlciB0byB1c2UgZWl0aGVyIHRoZSBzaG9ydCBvciBsb25nIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLCB5b3UgY2FuIGFwcGVuZAorZWl0aGVyIEBzYW1wey5zfSAoc2hvcnQpIG9yIEBzYW1wey5sfSAobG9uZykgdG8gaXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIAorYW4gYXNzZW1ibHkgcHJvZ3JhbSBhbmQgeW91IHdhbnQgdG8gZG8gYSBicmFuY2ggdG8gYSBzeW1ib2wgdGhhdCBpcyBkZWZpbmVkIGxhdGVyCitpbiB5b3VyIHByb2dyYW0sIHlvdSBjYW4gd3JpdGUgQHNhbXB7YnJhLnMgICBmb299LiAgCitPYmpkdW1wIGFuZCBHREIgd2lsbCBhbHdheXMgYXBwZW5kIEBzYW1wey5zfSBvciBAc2FtcHsubH0gdG8gaW5zdHJ1Y3Rpb25zIHdoaWNoCitoYXZlIGJvdGggc2hvcnQgYW5kIGxvbmcgZm9ybXMuCisKK0Bub2RlIEQxMFYtU3VicworQHN1YnNlY3Rpb24gU3ViLUluc3RydWN0aW9ucworQGNpbmRleCBEMTBWIHN1Yi1pbnN0cnVjdGlvbnMKK0BjaW5kZXggc3ViLWluc3RydWN0aW9ucywgRDEwVgorVGhlIEQxMFYgYXNzZW1ibGVyIHRha2VzIGFzIGlucHV0IGEgc2VyaWVzIG9mIGluc3RydWN0aW9ucywgZWl0aGVyIG9uZS1wZXItbGluZSwKK29yIGluIHRoZSBzcGVjaWFsIHR3by1wZXItbGluZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICBTb21lIG9mIHRoZXNlCitpbnN0cnVjdGlvbnMgd2lsbCBiZSBzaG9ydC1mb3JtIG9yIHN1Yi1pbnN0cnVjdGlvbnMuICBUaGVzZSBzdWItaW5zdHJ1Y3Rpb25zIGNhbiBiZSBwYWNrZWQKK2ludG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiAgSXQgd2lsbCBhbHNvIGRldGVjdAord2hlbiBpdCBzaG91bGQgbm90IHBhY2sgaW5zdHJ1Y3Rpb25zLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSBsYWJlbCBpcyBkZWZpbmVkLCB0aGUgbmV4dAoraW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBwYWNrYWdlZCB3aXRoIHRoZSBwcmV2aW91cyBvbmUuICBXaGVuZXZlciBhIGJyYW5jaCBhbmQgbGluaworaW5zdHJ1Y3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIG5vdCBiZSBwYWNrYWdlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uIHNvIHRoZSByZXR1cm4KK2FkZHJlc3Mgd2lsbCBiZSB2YWxpZC4gIE5vcHMgYXJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgd2hlbiBuZWNlc3NhcnkuCisKK0lmIHlvdSBkbyBub3Qgd2FudCB0aGUgYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgbWFraW5nIHRoZXNlIGRlY2lzaW9ucywgeW91IGNhbiBjb250cm9sCit0aGUgcGFja2FnaW5nIGFuZCBleGVjdXRpb24gdHlwZSAocGFyYWxsZWwgb3Igc2VxdWVudGlhbCkgd2l0aCB0aGUgc3BlY2lhbCBleGVjdXRpb24gCitzeW1ib2xzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgCisKK0Bub2RlIEQxMFYtQ2hhcnMKK0BzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycworQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBEMTBWCitAY2luZGV4IEQxMFYgbGluZSBjb21tZW50IGNoYXJhY3RlcgorQHNhbXB7O30gYW5kIEBzYW1weyN9IGFyZSB0aGUgbGluZSBjb21tZW50IGNoYXJhY3RlcnMuCitAY2luZGV4IHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZywgRDEwVgorQGNpbmRleCBEMTBWIHN1Yi1pbnN0cnVjdGlvbiBvcmRlcmluZworU3ViLWluc3RydWN0aW9ucyBtYXkgYmUgZXhlY3V0ZWQgaW4gb3JkZXIsIGluIHJldmVyc2Utb3JkZXIsIG9yIGluIHBhcmFsbGVsLgorSW5zdHJ1Y3Rpb25zIGxpc3RlZCBpbiB0aGUgc3RhbmRhcmQgb25lLXBlci1saW5lIGZvcm1hdCB3aWxsIGJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseS4KK1RvIHNwZWNpZnkgdGhlIGV4ZWN1dGluZyBvcmRlciwgdXNlIHRoZSBmb2xsb3dpbmcgc3ltYm9sczogCitAdGFibGUgQHNhbXAKK0BpdGVtIC0+CitTZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIGxlZnQgZmlyc3QuCitAaXRlbSA8LQorU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBmaXJzdC4KK0BpdGVtIHx8CitQYXJhbGxlbAorQGVuZCB0YWJsZQorVGhlIEQxMFYgc3ludGF4IGFsbG93cyBlaXRoZXIgb25lIGluc3RydWN0aW9uIHBlciBsaW5lLCBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUgd2l0aAordGhlIGV4ZWN1dGlvbiBzeW1ib2wsIG9yIHR3byBpbnN0cnVjdGlvbnMgcGVyIGxpbmUuICBGb3IgZXhhbXBsZQorQHRhYmxlIEBjb2RlCitAaXRlbSBhYnMgICAgICAgYTEgICAgICAtPiAgICAgIGFicyAgICAgcjAKK0V4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKK2NvbnRhaW5lciBhbmQgaXMgZXhlY3V0ZWQgc2Vjb25kLgorQGl0ZW0gYWJzICAgICAgIHIwICAgICAgPC0gICAgICBhYnMgICAgIGExCitFeGVjdXRlIHRoZXNlIHJldmVyc2Utc2VxdWVudGlhbGx5LiAgVGhlIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBpcyBpbiB0aGUgcmlnaHQKK2NvbnRhaW5lciwgYW5kIGlzIGV4ZWN1dGVkIGZpcnN0LgorQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIHx8ICAgICAgbWFjICAgICBhMCxyMCxyNworRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KK0BpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICB8fCAgICAgIAorQGl0ZW14IG1hYyAgICAgYTAscjAscjcKK1R3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBpbiBwYXJhbGxlbC4KK0BpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICAKK0BpdGVteCBtYWMgICAgIGEwLHIwLHI3CitUd28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5LiAgQXNzZW1ibGVyIHdpbGwKK3B1dCB0aGVtIGluIHRoZSBwcm9wZXIgY29udGFpbmVycy4KK0BpdGVtIGxkMncgICAgcjIsQEByOCsgICAgICAgICAtPgorQGl0ZW14IG1hYyAgICAgYTAscjAscjcKK1R3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBTYW1lIGFzIGFib3ZlIGJ1dAorc2Vjb25kIGluc3RydWN0aW9uIHdpbGwgYWx3YXlzIGdvIGludG8gcmlnaHQgY29udGFpbmVyLiAgCitAZW5kIHRhYmxlCitAY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KK0BjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCitTaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCisKK0Bub2RlIEQxMFYtUmVncworQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKK0BjaW5kZXggRDEwViByZWdpc3RlcnMKK0BjaW5kZXggcmVnaXN0ZXJzLCBEMTBWCitZb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSB0aHJvdWdoIEBzYW1we3IxNX0gdG8gcmVmZXIgdG8gdGhlIEQxMFYgCityZWdpc3RlcnMuICBZb3UgY2FuIGFsc28gdXNlIEBzYW1we3NwfSBhcyBhbiBhbGlhcyBmb3IgQHNhbXB7cjE1fS4gIFRoZSBhY2N1bXVsYXRvcnMKK2FyZSBAc2FtcHthMH0gYW5kIEBzYW1we2ExfS4gIFRoZXJlIGFyZSBzcGVjaWFsIHJlZ2lzdGVyLXBhaXIgbmFtZXMgdGhhdCBtYXkgCitvcHRpb25hbGx5IGJlIHVzZWQgaW4gb3Bjb2RlcyB0aGF0IHJlcXVpcmUgZXZlbi1udW1iZXJlZCByZWdpc3RlcnMuIFJlZ2lzdGVyIG5hbWVzIGFyZSAKK25vdCBjYXNlIHNlbnNpdGl2ZS4gIAorCitSZWdpc3RlciBQYWlycworQHRhYmxlIEBjb2RlCitAaXRlbSByMC1yMQorQGl0ZW0gcjItcjMKK0BpdGVtIHI0LXI1CitAaXRlbSByNi1yNworQGl0ZW0gcjgtcjkKK0BpdGVtIHIxMC1yMTEKK0BpdGVtIHIxMi1yMTMKK0BpdGVtIHIxNC1yMTUKK0BlbmQgdGFibGUKKworVGhlIEQxMFYgYWxzbyBoYXMgcHJlZGVmaW5lZCBzeW1ib2xzIGZvciB0aGVzZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgc3RhdHVzIGJpdHM6CitAdGFibGUgQGNvZGUKK0BpdGVtIHBzdworUHJvY2Vzc29yIFN0YXR1cyBXb3JkCitAaXRlbSBicHN3CitCYWNrdXAgUHJvY2Vzc29yIFN0YXR1cyBXb3JkCitAaXRlbSBwYworUHJvZ3JhbSBDb3VudGVyCitAaXRlbSBicGMKK0JhY2t1cCBQcm9ncmFtIENvdW50ZXIKK0BpdGVtIHJwdF9jCitSZXBlYXQgQ291bnQKK0BpdGVtIHJwdF9zCitSZXBlYXQgU3RhcnQgYWRkcmVzcworQGl0ZW0gcnB0X2UKK1JlcGVhdCBFbmQgYWRkcmVzcworQGl0ZW0gbW9kX3MKK01vZHVsbyBTdGFydCBhZGRyZXNzCitAaXRlbSBtb2RfZQorTW9kdWxvIEVuZCBhZGRyZXNzCitAaXRlbSBpYmEKK0luc3RydWN0aW9uIEJyZWFrIEFkZHJlc3MKK0BpdGVtIGYwCitGbGFnIDAKK0BpdGVtIGYxCitGbGFnIDEKK0BpdGVtIGMKK0NhcnJ5IGZsYWcKK0BlbmQgdGFibGUKKyAgICAgICAgCitAbm9kZSBEMTBWLUFkZHJlc3NpbmcKK0BzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKK0BjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgRDEwVgorQGNpbmRleCBEMTBWIGFkZHJlc3NpbmcgbW9kZXMKK0Bjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEQxMFYuCitAY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAorcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCitAdGFibGUgQGNvZGUKK0BpdGVtIFJAdmFye259CitSZWdpc3RlciBkaXJlY3QKK0BpdGVtIEBAUkB2YXJ7bn0KK1JlZ2lzdGVyIGluZGlyZWN0CitAaXRlbSBAQFJAdmFye259KworUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAorQGl0ZW0gQEBSQHZhcntufS0KK1JlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1kZWNyZW1lbnQKK0BpdGVtIEBALVNQCitSZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKK0BpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKK0BpdGVtIEB2YXJ7YWRkcn0KK1BDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgcmVwKS4gCitAaXRlbSAjQHZhcntpbW19CitJbW1lZGlhdGUgZGF0YSAodGhlIEBzYW1weyN9IGlzIG9wdGlvbmFsIGFuZCBpZ25vcmVkKQorQGVuZCB0YWJsZQorCitAbm9kZSBEMTBWLVdvcmQKK0BzdWJzZWN0aW9uIEBAV09SRCBNb2RpZmllcgorQGNpbmRleCBEMTBWIEBAd29yZCBtb2RpZmllcgorQGNpbmRleCBAQHdvcmQgbW9kaWZpZXIsIEQxMFYKK0FueSBzeW1ib2wgZm9sbG93ZWQgYnkgQGNvZGV7QEB3b3JkfSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzeW1ib2wncyB2YWx1ZQorc2hpZnRlZCByaWdodCBieSAyLiAgVGhpcyBpcyB1c2VkIGluIHNpdHVhdGlvbnMgc3VjaCBhcyBsb2FkaW5nIGEgcmVnaXN0ZXIKK3dpdGggdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiAob3IgYW55IG90aGVyIGNvZGUgZnJhZ21lbnQpLiAgRm9yIGV4YW1wbGUsIGlmCit5b3Ugd2FudCB0byBsb2FkIGEgcmVnaXN0ZXIgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIGZ1bmN0aW9uIEBjb2Rle21haW59IHRoZW4KK2p1bXAgdG8gdGhhdCBmdW5jdGlvbiwgeW91IGNvdWxkIGRvIGl0IGFzIGZvbGx3czoKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorbGRpICAgICByMiwgbWFpbkBAd29yZAoram1wICAgICByMgorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgRDEwVi1GbG9hdAorQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEQxMFYKK0BjaW5kZXggRDEwViBmbG9hdGluZyBwb2ludAorVGhlIEQxMFYgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0gYW5kIEBjb2Rley5kb3VibGV9CitkaXJlY3RpdmVzIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQord2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4gCisKK0Bub2RlIEQxMFYtT3Bjb2RlcworQHNlY3Rpb24gT3Bjb2RlcworQGNpbmRleCBEMTBWIG9wY29kZSBzdW1tYXJ5CitAY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBEMTBWCitAY2luZGV4IG1uZW1vbmljcywgRDEwVgorQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBEMTBWCitGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEQxMFYgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQorQGNpdGV7RDEwViBBcmNoaXRlY3R1cmU6IEEgVkxJVyBNaWNyb3Byb2Nlc3NvciBmb3IgTXVsdGltZWRpYSBBcHBsaWNhdGlvbnN9IAorKE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4pLgorQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEQxMFYgb3Bjb2Rlcy4gIFRoZSBvbmx5IGNoYW5nZXMgYXJlIHRob3NlCitkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gb24gc2l6ZSBtb2RpZmllcnMKKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWQzMHYudGV4aSBiL2dhcy9kb2MvYy1kMzB2LnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxYjM0NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1kMzB2LnRleGkKQEAgLTAsMCArMSwyOTIgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAbm9kZSBEMzBWLURlcGVuZGVudAorQGNoYXB0ZXIgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEdFTkVSSUMKK0Bub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCitAY2hhcHRlciBEMzBWIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggRDMwViBzdXBwb3J0CitAbWVudQorKiBEMzBWLU9wdHM6OiAgICAgICAgICAgICAgICAgICBEMzBWIE9wdGlvbnMKKyogRDMwVi1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4CisqIEQzMFYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50CisqIEQzMFYtT3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKK0BlbmQgbWVudQorCitAbm9kZSBEMzBWLU9wdHMKK0BzZWN0aW9uIEQzMFYgT3B0aW9ucworQGNpbmRleCBvcHRpb25zLCBEMzBWCitAY2luZGV4IEQzMFYgb3B0aW9ucworVGhlIE1pdHN1YmlzaGkgRDMwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCitkZXBlbmRlbnQgb3B0aW9ucy4KKworQHRhYmxlIEBzYW1wCitAaXRlbSAtTworVGhlIEQzMFYgY2FuIG9mdGVuIGV4ZWN1dGUgdHdvIHN1Yi1pbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuIFdoZW4gdGhpcyBvcHRpb24KK2lzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBpdHMgb3V0cHV0IGJ5IGRldGVjdGluZyB3aGVuCitpbnN0cnVjdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgorCitAaXRlbSAtbgorV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyBldmVyeQordGltZSBpdCBhZGRzIGEgbm9wIGluc3RydWN0aW9uLgorCitAaXRlbSAtTgorV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyBpZiBpdAorbmVlZHMgdG8gaW5zZXJ0IGEgbm9wIGFmdGVyIGEgMzItYml0IG11bHRpcGx5IGJlZm9yZSBhIGxvYWQgb3IgMTYtYml0CittdWx0aXBseSBpbnN0cnVjdGlvbi4KK0BlbmQgdGFibGUKKworQG5vZGUgRDMwVi1TeW50YXgKK0BzZWN0aW9uIFN5bnRheAorQGNpbmRleCBEMzBWIHN5bnRheAorQGNpbmRleCBzeW50YXgsIEQzMFYKKworVGhlIEQzMFYgc3ludGF4IGlzIGJhc2VkIG9uIHRoZSBzeW50YXggaW4gTWl0c3ViaXNoaSdzIEQzMFYgYXJjaGl0ZWN0dXJlIG1hbnVhbC4KK1RoZSBkaWZmZXJlbmNlcyBhcmUgZGV0YWlsZWQgYmVsb3cuCisKK0BtZW51CisqIEQzMFYtU2l6ZTo6ICAgICAgICAgICAgICAgICBTaXplIE1vZGlmaWVycworKiBEMzBWLVN1YnM6OiAgICAgICAgICAgICAgICAgU3ViLUluc3RydWN0aW9ucworKiBEMzBWLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCisqIEQzMFYtR3VhcmRlZDo6ICAgICAgICAgICAgICBHdWFyZGVkIEV4ZWN1dGlvbgorKiBEMzBWLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKKyogRDMwVi1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKK0BlbmQgbWVudQorCisKK0Bub2RlIEQzMFYtU2l6ZQorQHN1YnNlY3Rpb24gU2l6ZSBNb2RpZmllcnMKK0BjaW5kZXggRDMwViBzaXplIG1vZGlmaWVycworQGNpbmRleCBzaXplIG1vZGlmaWVycywgRDMwVgorVGhlIEQzMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lcyBpbiB0aGUgRDMwVgorQXJjaGl0ZWN0dXJlIE1hbnVhbC4gIEhvd2V2ZXIsIHRoZSBuYW1lcyBpbiB0aGUgbWFudWFsIGFyZSBzb21ldGltZXMgYW1iaWd1b3VzLgorVGhlcmUgYXJlIGluc3RydWN0aW9uIG5hbWVzIHRoYXQgY2FuIGFzc2VtYmxlIHRvIGEgc2hvcnQgb3IgbG9uZyBmb3JtIG9wY29kZS4KK0hvdyBkb2VzIHRoZSBhc3NlbWJsZXIgcGljayB0aGUgY29ycmVjdCBmb3JtPyAgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhbHdheXMgcGljayB0aGUKK3NtYWxsZXN0IGZvcm0gaWYgaXQgY2FuLiAgV2hlbiBkZWFsaW5nIHdpdGggYSBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCB5ZXQgd2hlbiBhCitsaW5lIGlzIGJlaW5nIGFzc2VtYmxlZCwgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0uICBJZiB5b3UgbmVlZCB0byBmb3JjZSB0aGUgCithc3NlbWJsZXIgdG8gdXNlIGVpdGhlciB0aGUgc2hvcnQgb3IgbG9uZyBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiwgeW91IGNhbiBhcHBlbmQKK2VpdGhlciBAc2FtcHsuc30gKHNob3J0KSBvciBAc2FtcHsubH0gKGxvbmcpIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyAKK2FuIGFzc2VtYmx5IHByb2dyYW0gYW5kIHlvdSB3YW50IHRvIGRvIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgZGVmaW5lZCBsYXRlcgoraW4geW91ciBwcm9ncmFtLCB5b3UgY2FuIHdyaXRlIEBzYW1we2JyYS5zIGZvb30uIAorT2JqZHVtcCBhbmQgR0RCIHdpbGwgYWx3YXlzIGFwcGVuZCBAc2FtcHsuc30gb3IgQHNhbXB7Lmx9IHRvIGluc3RydWN0aW9ucyB3aGljaAoraGF2ZSBib3RoIHNob3J0IGFuZCBsb25nIGZvcm1zLgorCitAbm9kZSBEMzBWLVN1YnMKK0BzdWJzZWN0aW9uIFN1Yi1JbnN0cnVjdGlvbnMKK0BjaW5kZXggRDMwViBzdWItaW5zdHJ1Y3Rpb25zCitAY2luZGV4IHN1Yi1pbnN0cnVjdGlvbnMsIEQzMFYKK1RoZSBEMzBWIGFzc2VtYmxlciB0YWtlcyBhcyBpbnB1dCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMsIGVpdGhlciBvbmUtcGVyLWxpbmUsCitvciBpbiB0aGUgc3BlY2lhbCB0d28tcGVyLWxpbmUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgU29tZSBvZiB0aGVzZQoraW5zdHJ1Y3Rpb25zIHdpbGwgYmUgc2hvcnQtZm9ybSBvciBzdWItaW5zdHJ1Y3Rpb25zLiAgVGhlc2Ugc3ViLWluc3RydWN0aW9ucyBjYW4gYmUgcGFja2VkCitpbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlciB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseS4gIEl0IHdpbGwgYWxzbyBkZXRlY3QKK3doZW4gaXQgc2hvdWxkIG5vdCBwYWNrIGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZCwgdGhlIG5leHQKK2luc3RydWN0aW9uIHdpbGwgbmV2ZXIgYmUgcGFja2FnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLiAgV2hlbmV2ZXIgYSBicmFuY2ggYW5kIGxpbmsKK2luc3RydWN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCBub3QgYmUgcGFja2FnZWQgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBzbyB0aGUgcmV0dXJuCithZGRyZXNzIHdpbGwgYmUgdmFsaWQuICBOb3BzIGFyZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHdoZW4gbmVjZXNzYXJ5LgorCitJZiB5b3UgZG8gbm90IHdhbnQgdGhlIGFzc2VtYmxlciBhdXRvbWF0aWNhbGx5IG1ha2luZyB0aGVzZSBkZWNpc2lvbnMsIHlvdSBjYW4gY29udHJvbAordGhlIHBhY2thZ2luZyBhbmQgZXhlY3V0aW9uIHR5cGUgKHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwpIHdpdGggdGhlIHNwZWNpYWwgZXhlY3V0aW9uIAorc3ltYm9scyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIAorCitAbm9kZSBEMzBWLUNoYXJzCitAc3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKK0BjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgRDMwVgorQGNpbmRleCBEMzBWIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKK0BzYW1wezt9IGFuZCBAc2FtcHsjfSBhcmUgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLgorQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcsIEQzMFYKK0BjaW5kZXggRDMwViBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcKK1N1Yi1pbnN0cnVjdGlvbnMgbWF5IGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBpbiByZXZlcnNlLW9yZGVyLCBvciBpbiBwYXJhbGxlbC4KK0luc3RydWN0aW9ucyBsaXN0ZWQgaW4gdGhlIHN0YW5kYXJkIG9uZS1wZXItbGluZSBmb3JtYXQgd2lsbCBiZSBleGVjdXRlZAorc2VxdWVudGlhbGx5IHVubGVzcyB5b3UgdXNlIHRoZSBAc2FtcHstT30gb3B0aW9uLgorCitUbyBzcGVjaWZ5IHRoZSBleGVjdXRpbmcgb3JkZXIsIHVzZSB0aGUgZm9sbG93aW5nIHN5bWJvbHM6IAorQHRhYmxlIEBzYW1wCitAaXRlbSAtPgorU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSBsZWZ0IGZpcnN0LgorCitAaXRlbSA8LQorU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBmaXJzdC4KKworQGl0ZW0gfHwKK1BhcmFsbGVsCitAZW5kIHRhYmxlCisKK1RoZSBEMzBWIHN5bnRheCBhbGxvd3MgZWl0aGVyIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSwgb25lIGluc3RydWN0aW9uIHBlciBsaW5lIHdpdGgKK3RoZSBleGVjdXRpb24gc3ltYm9sLCBvciB0d28gaW5zdHJ1Y3Rpb25zIHBlciBsaW5lLiAgRm9yIGV4YW1wbGUKK0B0YWJsZSBAY29kZQorQGl0ZW0gYWJzIHIyLHIzIC0+IGFicyByNCxyNQorRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAorY29udGFpbmVyIGFuZCBpcyBleGVjdXRlZCBzZWNvbmQuCisKK0BpdGVtIGFicyByMixyMyA8LSBhYnMgcjQscjUKK0V4ZWN1dGUgdGhlc2UgcmV2ZXJzZS1zZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAorY29udGFpbmVyLCBhbmQgaXMgZXhlY3V0ZWQgZmlyc3QuCisKK0BpdGVtIGFicyByMixyMyB8fCBhYnMgcjQscjUKK0V4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCisKK0BpdGVtIGxkdyByMixAQChyMyxyNCkgfHwKK0BpdGVteCBtdWx4IHI2LHI4LHI5CitUd28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCisKK0BpdGVtIG11bHggYTAscjgscjkKK0BpdGVteCBzdHcgcjIsQEAocjMscjQpCitUd28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5IHVubGVzcyBAc2FtcHstT30gb3B0aW9uIGlzCit1c2VkLiAgSWYgdGhlIEBzYW1wey1PfSBvcHRpb24gaXMgdXNlZCwgdGhlIGFzc2VtYmxlciB3aWxsIGRldGVybWluZSBpZgordGhlIGluc3RydWN0aW9ucyBjb3VsZCBiZSBkb25lIGluIHBhcmFsbGVsICh0aGUgYWJvdmUgdHdvIGluc3RydWN0aW9ucworY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwpLCBhbmQgaWYgc28sIGVtaXQgdGhlbSBhcyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCitUaGUgYXNzZW1ibGVyIHdpbGwgcHV0IHRoZW0gaW4gdGhlIHByb3BlciBjb250YWluZXJzLiAgSW4gdGhlIGFib3ZlCitleGFtcGxlLCB0aGUgYXNzZW1ibGVyIHdpbGwgcHV0IHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uIGluIGxlZnQKK2NvbnRhaW5lciBhbmQgdGhlIEBzYW1we211bHh9IGluc3RydWN0aW9uIGluIHRoZSByaWdodCBjb250YWluZXIuCisKK0BpdGVtIHN0dyByMixAQChyMyxyNCkgLT4KK0BpdGVteCBtdWx4IGEwLHI4LHI5CitUd28tbGluZSBmb3JtYXQuICBFeGVjdXRlIHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uIGZvbGxvd2VkIGJ5IHRoZQorQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gc2VxdWVudGlhbGx5LiAgVGhlIGZpcnN0IGluc3RydWN0aW9uIGdvZXMgaW4gdGhlCitsZWZ0IGNvbnRhaW5lciBhbmQgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBnb2VzIGludG8gcmlnaHQgY29udGFpbmVyLgorVGhlIGFzc2VtYmxlciB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgdGhlIG1hY2hpbmUgb3JkZXJpbmcgY29uc3RyYWludHMgYXJlCit2aW9sYXRlZC4KKworQGl0ZW0gc3R3IHIyLEBAKHIzLHI0KSA8LQorQGl0ZW14IG11bHggYTAscjgscjkKK1NhbWUgYXMgcHJldmlvdXMgZXhhbXBsZSwgZXhjZXB0IHRoYXQgdGhlIEBzYW1we211bHh9IGluc3RydWN0aW9uIGlzCitleGVjdXRlZCBiZWZvcmUgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24uCitAZW5kIHRhYmxlCisKK0BjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgorQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKK1NpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KKworQG5vZGUgRDMwVi1HdWFyZGVkCitAc3Vic2VjdGlvbiBHdWFyZGVkIEV4ZWN1dGlvbgorQGNpbmRleCBEMzBWIEd1YXJkZWQgRXhlY3V0aW9uCitAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZnVsbCByYW5nZSBvZiBndWFyZGVkIGV4ZWN1dGlvbgorZGlyZWN0aXZlcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4gIEp1c3QgYXBwZW5kIHRoZSBkaXJlY3RpdmUgYWZ0ZXIgdGhlCitpbnN0cnVjdGlvbiBwcm9wZXIuICBUaGUgZGlyZWN0aXZlcyBhcmU6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gL3R4CitFeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIHRydWUuCitAaXRlbSAvZngKK0V4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgZmFsc2UuCitAaXRlbSAveHQKK0V4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjEgaXMgdHJ1ZS4KK0BpdGVtIC94ZgorRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMSBpcyBmYWxzZS4KK0BpdGVtIC90dAorRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgYm90aCBmbGFncyBmMCBhbmQgZjEgYXJlIHRydWUuCitAaXRlbSAvdGYKK0V4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgdHJ1ZSBhbmQgZmxhZyBmMSBpcyBmYWxzZS4KK0BlbmQgdGFibGUKKworQG5vZGUgRDMwVi1SZWdzCitAc3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcworQGNpbmRleCBEMzBWIHJlZ2lzdGVycworQGNpbmRleCByZWdpc3RlcnMsIEQzMFYKK1lvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9IHRocm91Z2ggQHNhbXB7cjYzfSB0byByZWZlcgordG8gdGhlIEQzMFYgcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHtzcH0gYXMgYW4gYWxpYXMgZm9yCitAc2FtcHtyNjN9IGFuZCBAc2FtcHtsaW5rfSBhcyBhbiBhbGlhcyBmb3IgQHNhbXB7cjYyfS4gIFRoZSBhY2N1bXVsYXRvcnMKK2FyZSBAc2FtcHthMH0gYW5kIEBzYW1we2ExfS4KKworVGhlIEQzMFYgYWxzbyBoYXMgcHJlZGVmaW5lZCBzeW1ib2xzIGZvciB0aGVzZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgc3RhdHVzIGJpdHM6CitAdGFibGUgQGNvZGUKK0BpdGVtIHBzdworUHJvY2Vzc29yIFN0YXR1cyBXb3JkCitAaXRlbSBicHN3CitCYWNrdXAgUHJvY2Vzc29yIFN0YXR1cyBXb3JkCitAaXRlbSBwYworUHJvZ3JhbSBDb3VudGVyCitAaXRlbSBicGMKK0JhY2t1cCBQcm9ncmFtIENvdW50ZXIKK0BpdGVtIHJwdF9jCitSZXBlYXQgQ291bnQKK0BpdGVtIHJwdF9zCitSZXBlYXQgU3RhcnQgYWRkcmVzcworQGl0ZW0gcnB0X2UKK1JlcGVhdCBFbmQgYWRkcmVzcworQGl0ZW0gbW9kX3MKK01vZHVsbyBTdGFydCBhZGRyZXNzCitAaXRlbSBtb2RfZQorTW9kdWxvIEVuZCBhZGRyZXNzCitAaXRlbSBpYmEKK0luc3RydWN0aW9uIEJyZWFrIEFkZHJlc3MKK0BpdGVtIGYwCitGbGFnIDAKK0BpdGVtIGYxCitGbGFnIDEKK0BpdGVtIGYyCitGbGFnIDIKK0BpdGVtIGYzCitGbGFnIDMKK0BpdGVtIGY0CitGbGFnIDQKK0BpdGVtIGY1CitGbGFnIDUKK0BpdGVtIGY2CitGbGFnIDYKK0BpdGVtIGY3CitGbGFnIDcKK0BpdGVtIHMKK1NhbWUgYXMgZmxhZyA0IChzYXR1cmF0aW9uIGZsYWcpCitAaXRlbSB2CitTYW1lIGFzIGZsYWcgNSAob3ZlcmZsb3cgZmxhZykKK0BpdGVtIHZhCitTYW1lIGFzIGZsYWcgNiAoc3RpY2t5IG92ZXJmbG93IGZsYWcpCitAaXRlbSBjCitTYW1lIGFzIGZsYWcgNyAoY2FycnkvYm9ycm93IGZsYWcpCitAaXRlbSBiCitTYW1lIGFzIGZsYWcgNyAoY2FycnkvYm9ycm93IGZsYWcpCitAZW5kIHRhYmxlCisgICAgICAgIAorQG5vZGUgRDMwVi1BZGRyZXNzaW5nCitAc3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCitAY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEQzMFYKK0BjaW5kZXggRDMwViBhZGRyZXNzaW5nIG1vZGVzCitAY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBEMzBWLgorQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKK3JlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgorQHRhYmxlIEBjb2RlCitAaXRlbSBSQHZhcntufQorUmVnaXN0ZXIgZGlyZWN0CitAaXRlbSBAQFJAdmFye259CitSZWdpc3RlciBpbmRpcmVjdAorQGl0ZW0gQEBSQHZhcntufSsKK1JlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKK0BpdGVtIEBAUkB2YXJ7bn0tCitSZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtZGVjcmVtZW50CitAaXRlbSBAQC1TUAorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50CitAaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKK1JlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50CitAaXRlbSBAdmFye2FkZHJ9CitQQyByZWxhdGl2ZSBhZGRyZXNzIChmb3IgYnJhbmNoIG9yIHJlcCkuIAorQGl0ZW0gI0B2YXJ7aW1tfQorSW1tZWRpYXRlIGRhdGEgKHRoZSBAc2FtcHsjfSBpcyBvcHRpb25hbCBhbmQgaWdub3JlZCkKK0BlbmQgdGFibGUKKworQG5vZGUgRDMwVi1GbG9hdAorQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEQzMFYKK0BjaW5kZXggRDMwViBmbG9hdGluZyBwb2ludAorVGhlIEQzMFYgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0gYW5kIEBjb2Rley5kb3VibGV9CitkaXJlY3RpdmVzIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQord2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4gCisKK0Bub2RlIEQzMFYtT3Bjb2RlcworQHNlY3Rpb24gT3Bjb2RlcworQGNpbmRleCBEMzBWIG9wY29kZSBzdW1tYXJ5CitAY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBEMzBWCitAY2luZGV4IG1uZW1vbmljcywgRDMwVgorQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBEMzBWCitGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEQzMFYgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQorQGNpdGV7RDMwViBBcmNoaXRlY3R1cmU6IEEgVkxJVyBNaWNyb3Byb2Nlc3NvciBmb3IgTXVsdGltZWRpYSBBcHBsaWNhdGlvbnN9IAorKE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4pLgorQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEQzMFYgb3Bjb2Rlcy4gIFRoZSBvbmx5IGNoYW5nZXMgYXJlIHRob3NlCitkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gb24gc2l6ZSBtb2RpZmllcnMKKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWg4MzAwLnRleGkgYi9nYXMvZG9jL2MtaDgzMDAudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjcwOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9jLWg4MzAwLnRleGkKQEAgLTAsMCArMSwzNDIgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAZW5kIGlmc2V0CitAbm9kZSBIOC8zMDAtRGVwZW5kZW50CitAY2hhcHRlciBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCisKK0BjaW5kZXggSDgvMzAwIHN1cHBvcnQKK0BtZW51CisqIEg4LzMwMCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKKyogSDgvMzAwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4CisqIEg4LzMwMCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50CisqIEg4LzMwMCBEaXJlY3RpdmVzOjogICAgICAgICAgIEg4LzMwMCBNYWNoaW5lIERpcmVjdGl2ZXMKKyogSDgvMzAwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcworQGVuZCBtZW51CisKK0Bub2RlIEg4LzMwMCBPcHRpb25zCitAc2VjdGlvbiBPcHRpb25zCisKK0BjaW5kZXggSDgvMzAwIG9wdGlvbnMgKG5vbmUpCitAY2luZGV4IG9wdGlvbnMsIEg4LzMwMCAobm9uZSkKK0Bjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQorSDgvMzAwIGZhbWlseS4KKworQG5vZGUgSDgvMzAwIFN5bnRheAorQHNlY3Rpb24gU3ludGF4CitAbWVudQorKiBIOC8zMDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKKyogSDgvMzAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKKyogSDgvMzAwLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcworQGVuZCBtZW51CisKK0Bub2RlIEg4LzMwMC1DaGFycworQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCisKK0BjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgSDgvMzAwCitAY2luZGV4IEg4LzMwMCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCitAc2FtcHs7fSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KKworQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgSDgvMzAwCitAY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIEg4LzMwMAorQGNpbmRleCBIOC8zMDAgbGluZSBzZXBhcmF0b3IKK0BzYW1weyR9IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCitUaGVyZWZvcmUgQGVtcGh7eW91IG1heSBub3QgdXNlIEBzYW1weyR9IGluIHN5bWJvbCBuYW1lc30gb24gdGhlIEg4LzMwMC4KKworQG5vZGUgSDgvMzAwLVJlZ3MKK0BzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCisKK0BjaW5kZXggSDgvMzAwIHJlZ2lzdGVycworQGNpbmRleCByZWdpc3RlciBuYW1lcywgSDgvMzAwCitZb3UgY2FuIHVzZSBwcmVkZWZpbmVkIHN5bWJvbHMgb2YgdGhlIGZvcm0gQHNhbXB7ckB2YXJ7bn1ofSBhbmQKK0BzYW1we3JAdmFye259bH0gdG8gcmVmZXIgdG8gdGhlIEg4LzMwMCByZWdpc3RlcnMgYXMgc2l4dGVlbiA4LWJpdAorZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gIEB2YXJ7bn0gaXMgYSBkaWdpdCBmcm9tIEBzYW1wezB9IHRvCitAc2FtcHs3fSk7IGZvciBpbnN0YW5jZSwgYm90aCBAc2FtcHtyMGh9IGFuZCBAc2FtcHtyN2x9IGFyZSB2YWxpZAorcmVnaXN0ZXIgbmFtZXMuCisKK1lvdSBjYW4gYWxzbyB1c2UgdGhlIGVpZ2h0IHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyQHZhcntufX0gdG8gcmVmZXIKK3RvIHRoZSBIOC8zMDAgcmVnaXN0ZXJzIGFzIDE2LWJpdCByZWdpc3RlcnMgKHlvdSBtdXN0IHVzZSB0aGlzIGZvcm0gZm9yCithZGRyZXNzaW5nKS4KKworT24gdGhlIEg4LzMwMEgsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGVpZ2h0IHByZWRlZmluZWQgc3ltYm9scworQHNhbXB7ZXJAdmFye259fSAoQHNhbXB7ZXIwfSBAZG90c3t9IEBzYW1we2VyN30pIHRvIHJlZmVyIHRvIHRoZSAzMi1iaXQKK2dlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuCisKK1RoZSB0d28gY29udHJvbCByZWdpc3RlcnMgYXJlIGNhbGxlZCBAY29kZXtwY30gKHByb2dyYW0gY291bnRlcjsgYQorMTYtYml0IHJlZ2lzdGVyLCBleGNlcHQgb24gdGhlIEg4LzMwMEggd2hlcmUgaXQgaXMgMjQgYml0cykgYW5kCitAY29kZXtjY3J9IChjb25kaXRpb24gY29kZSByZWdpc3RlcjsgYW4gOC1iaXQgcmVnaXN0ZXIpLiAgQGNvZGV7cjd9IGlzCit1c2VkIGFzIHRoZSBzdGFjayBwb2ludGVyLCBhbmQgY2FuIGFsc28gYmUgY2FsbGVkIEBjb2Rle3NwfS4KKworQG5vZGUgSDgvMzAwLUFkZHJlc3NpbmcKK0BzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKKworQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBIOC8zMDAKK0BjaW5kZXggSDgvMzAwIGFkZHJlc3NpbmcgbW9kZXMKK0B2YWx1ZXtBU30gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgSDgvMzAwOgorQHRhYmxlIEBjb2RlCitAaXRlbSByQHZhcntufQorUmVnaXN0ZXIgZGlyZWN0CisKK0BpdGVtIEBAckB2YXJ7bn0KK1JlZ2lzdGVyIGluZGlyZWN0CisKK0BuZWVkIDEyMDAKK0BpdGVtIEBAKEB2YXJ7ZH0sIHJAdmFye259KQorQGl0ZW14IEBAKEB2YXJ7ZH06MTYsIHJAdmFye259KQorQGl0ZW14IEBAKEB2YXJ7ZH06MjQsIHJAdmFye259KQorUmVnaXN0ZXIgaW5kaXJlY3Q6IDE2LWJpdCBvciAyNC1iaXQgZGlzcGxhY2VtZW50IEB2YXJ7ZH0gZnJvbSByZWdpc3RlcgorQHZhcntufS4gICgyNC1iaXQgZGlzcGxhY2VtZW50cyBhcmUgb25seSBtZWFuaW5nZnVsIG9uIHRoZSBIOC8zMDBILikKKworQGl0ZW0gQEByQHZhcntufSsKK1JlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKKworQGl0ZW0gQEAtckB2YXJ7bn0KK1JlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAorCitAaXRlbSBAY29kZXtAQH1AdmFye2FhfQorQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjgKK0BpdGVteCBAY29kZXtAQH1AdmFye2FhfToxNgorQGl0ZW14IEBjb2Rle0BAfUB2YXJ7YWF9OjI0CitBYnNvbHV0ZSBhZGRyZXNzIEBjb2Rle2FhfS4gIChUaGUgYWRkcmVzcyBzaXplIEBzYW1wezoyNH0gb25seSBtYWtlcworc2Vuc2Ugb24gdGhlIEg4LzMwMEguKQorCitAaXRlbSAjQHZhcnt4eH0KK0BpdGVteCAjQHZhcnt4eH06OAorQGl0ZW14ICNAdmFye3h4fToxNgorQGl0ZW14ICNAdmFye3h4fTozMgorSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uICBZb3UgbWF5IHNwZWNpZnkgdGhlIEBzYW1wezo4fSwgQHNhbXB7OjE2fSwgb3IKK0BzYW1wezozMn0gZm9yIGNsYXJpdHksIGlmIHlvdSB3aXNoOyBidXQgQGNvZGV7QHZhbHVle0FTfX0gbmVpdGhlcgorcmVxdWlyZXMgdGhpcyBub3IgdXNlcyBpdC0tLXRoZSBkYXRhIHNpemUgcmVxdWlyZWQgaXMgdGFrZW4gZnJvbQorY29udGV4dC4KKworQGl0ZW0gQGNvZGV7QEB9QGNvZGV7QEB9QHZhcnthYX0KK0BpdGVteCBAY29kZXtAQH1AY29kZXtAQH1AdmFye2FhfTo4CitNZW1vcnkgaW5kaXJlY3QuICBZb3UgbWF5IHNwZWNpZnkgdGhlIEBzYW1wezo4fSBmb3IgY2xhcml0eSwgaWYgeW91Cit3aXNoOyBidXQgQGNvZGV7QHZhbHVle0FTfX0gbmVpdGhlciByZXF1aXJlcyB0aGlzIG5vciB1c2VzIGl0LgorQGVuZCB0YWJsZQorCitAbm9kZSBIOC8zMDAgRmxvYXRpbmcgUG9pbnQKK0BzZWN0aW9uIEZsb2F0aW5nIFBvaW50CisKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEg4LzMwMCAoQHNje2llZWV9KQorQGNpbmRleCBIOC8zMDAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKK1RoZSBIOC8zMDAgZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9CitkaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Cit3aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgorCitAcGFnZQorQG5vZGUgSDgvMzAwIERpcmVjdGl2ZXMKK0BzZWN0aW9uIEg4LzMwMCBNYWNoaW5lIERpcmVjdGl2ZXMKKworQGNpbmRleCBIOC8zMDAgbWFjaGluZSBkaXJlY3RpdmVzIChub25lKQorQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIEg4LzMwMCAobm9uZSkKK0BjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBIOC8zMDAKK0BjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUsIEg4LzMwMAorQGNvZGV7QHZhbHVle0FTfX0gaGFzIG9ubHkgb25lIG1hY2hpbmUtZGVwZW5kZW50IGRpcmVjdGl2ZSBmb3IgdGhlCitIOC8zMDA6CisKK0B0YWJsZSBAY29kZQorQGNpbmRleCBIOC8zMDBILCBhc3NlbWJsaW5nIGZvcgorQGl0ZW0gLmg4MzAwaAorUmVjb2duaXplIGFuZCBlbWl0IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSDgvMzAwSCB2YXJpYW50LCBhbmQKK2Fsc28gbWFrZSBAY29kZXsuaW50fSBlbWl0IDMyLWJpdCBudW1iZXJzIHJhdGhlciB0aGFuIHRoZSB1c3VhbCAoMTYtYml0KQorZm9yIHRoZSBIOC8zMDAgZmFtaWx5LgorQGVuZCB0YWJsZQorCitPbiB0aGUgSDgvMzAwIGZhbWlseSAoaW5jbHVkaW5nIHRoZSBIOC8zMDBIKSBAc2FtcHsud29yZH0gZGlyZWN0aXZlcworZ2VuZXJhdGUgMTYtYml0IG51bWJlcnMuCisKK0Bub2RlIEg4LzMwMCBPcGNvZGVzCitAc2VjdGlvbiBPcGNvZGVzCisKK0BjaW5kZXggSDgvMzAwIG9wY29kZSBzdW1tYXJ5CitAY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBIOC8zMDAKK0BjaW5kZXggbW5lbW9uaWNzLCBIOC8zMDAKK0BjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgSDgvMzAwCitGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEg4LzMwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCitAY2l0ZXtIOC8zMDAgU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgQURFLS02MDItLTAyNSkuICBGb3IKK2luZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBIOC8zMDBILCBzZWUgQGNpdGV7SDgvMzAwSCBTZXJpZXMKK1Byb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkpLgorCitAY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgSDgvMzAwIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCitwc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCisKK0BpZnNldCBTTUFMTAorQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5CitAYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgSDgvMzAwIG9wY29kZXMsIGFuZCB0aGVpciBhcmd1bWVudHMuCitFbnRyaWVzIG1hcmtlZCBAc2FtcHsqfSBhcmUgb3Bjb2RlcyB1c2VkIG9ubHkgb24gdGhlIEg4LzMwMEguCisKK0BzbWFsbGV4YW1wbGUKK0BjIFVzaW5nIEBncm91cCBzZWVtcyB0byB1c2UgdGhlIG5vcm1hbCBiYXNlbGluZXNraXAsIG5vdCB0aGUgc21hbGxleGFtcGxlCitAYyBiYXNlbGluZXNraXA7IGxvb2tzIGFwcHJveCBkb3VibGVzcGFjZWQuCisgICAgICAgICBAaXtMZWdlbmQ6fQorICAgICAgICAgICAgUnMgICBAcntzb3VyY2UgcmVnaXN0ZXJ9CisgICAgICAgICAgICBSZCAgIEBye2Rlc3RpbmF0aW9uIHJlZ2lzdGVyfQorICAgICAgICAgICAgYWJzICBAcnthYnNvbHV0ZSBhZGRyZXNzfQorICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KKyAgICAgICAgIGRpc3A6TiAgQHJ7Ti1iaXQgZGlzcGxhY2VtZW50IGZyb20gYSByZWdpc3Rlcn0KKyAgICAgICAgcGNyZWw6TiAgQHJ7Ti1iaXQgZGlzcGxhY2VtZW50IHJlbGF0aXZlIHRvIHByb2dyYW0gY291bnRlcn0KKworICAgYWRkLmIgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYW5kYyAjaW1tLGNjcgorICAgYWRkLmIgcnMscmQgICAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLHJkCisgICBhZGQudyBycyxyZCAgICAgICAgICAgICAgICAgICBiYW5kICNpbW0sQEByZAorKiAgYWRkLncgI2ltbSxyZCAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLEBAYWJzOjgKKyogIGFkZC5sIHJzLHJkICAgICAgICAgICAgICAgICAgIGJyYSAgcGNyZWw6OAorKiAgYWRkLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYnJhICBwY3JlbDoxNgorICAgYWRkcyAjaW1tLHJkICAgICAgICAgICAgICAgICAgYnQgICBwY3JlbDo4CisgICBhZGR4ICNpbW0scmQgICAgICAgICAgICAgICAqICBidCAgIHBjcmVsOjE2CisgICBhZGR4IHJzLHJkICAgICAgICAgICAgICAgICAgICBicm4gIHBjcmVsOjgKKyAgIGFuZC5iICNpbW0scmQgICAgICAgICAgICAgICogIGJybiAgcGNyZWw6MTYKKyAgIGFuZC5iIHJzLHJkICAgICAgICAgICAgICAgICAgIGJmICAgcGNyZWw6OAorKiAgYW5kLncgcnMscmQgICAgICAgICAgICAgICAgKiAgYmYgICBwY3JlbDoxNgorKiAgYW5kLncgI2ltbSxyZCAgICAgICAgICAgICAgICAgYmhpICBwY3JlbDo4CisqICBhbmQubCAjaW1tLHJkICAgICAgICAgICAgICAqICBiaGkgIHBjcmVsOjE2CisqICBhbmQubCBycyxyZCAgICAgICAgICAgICAgICAgICBibHMgIHBjcmVsOjgKK0BwYWdlCisqICBibHMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibGQgICNpbW0scmQKKyAgIGJjYyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJsZCAgI2ltbSxAQHJkCisqICBiY2MgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibGQgICNpbW0sQEBhYnM6OAorICAgYmhzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLHJkCisqICBiaHMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90ICNpbW0sQEByZAorICAgYmNzICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLEBAYWJzOjgKKyogIGJjcyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgcnMscmQKKyAgIGJsbyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgcnMsQEByZAorKiAgYmxvICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCBycyxAQGFiczo4CisgICBibmUgIHBjcmVsOjggICAgICAgICAgICAgICAgICBib3IgICNpbW0scmQKKyogIGJuZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJvciAgI2ltbSxAQHJkCisgICBiZXEgIHBjcmVsOjggICAgICAgICAgICAgICAgICBib3IgICNpbW0sQEBhYnM6OAorKiAgYmVxICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCAjaW1tLHJkCisgICBidmMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0ICNpbW0sQEByZAorKiAgYnZjICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNldCAjaW1tLEBAYWJzOjgKKyAgIGJ2cyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgcnMscmQKKyogIGJ2cyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgcnMsQEByZAorICAgYnBsICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCBycyxAQGFiczo4CisqICBicGwgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3IgIHBjcmVsOjgKKyAgIGJtaSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzciAgcGNyZWw6MTYKKyogIGJtaSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxyZAorICAgYmdlICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnN0ICAjaW1tLEBAcmQKKyogIGJnZSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxAQGFiczo4CisgICBibHQgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0ICNpbW0scmQKKyogIGJsdCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgI2ltbSxAQHJkCisgICBiZ3QgIHBjcmVsOjggICAgICAgICAgICAgICAgICBidHN0ICNpbW0sQEBhYnM6OAorKiAgYmd0ICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCBycyxyZAorICAgYmxlICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCBycyxAQHJkCisqICBibGUgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0IHJzLEBAYWJzOjgKKyAgIGJjbHIgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGJ4b3IgI2ltbSxyZAorICAgYmNsciAjaW1tLEBAcmQgICAgICAgICAgICAgICAgIGJ4b3IgI2ltbSxAQHJkCisgICBiY2xyICNpbW0sQEBhYnM6OCAgICAgICAgICAgICAgYnhvciAjaW1tLEBAYWJzOjgKKyAgIGJjbHIgcnMscmQgICAgICAgICAgICAgICAgICAgIGNtcC5iICNpbW0scmQKKyAgIGJjbHIgcnMsQEByZCAgICAgICAgICAgICAgICAgICBjbXAuYiBycyxyZAorICAgYmNsciBycyxAQGFiczo4ICAgICAgICAgICAgICAgIGNtcC53IHJzLHJkCisgICBiaWFuZCAjaW1tLHJkICAgICAgICAgICAgICAgICBjbXAudyBycyxyZAorICAgYmlhbmQgI2ltbSxAQHJkICAgICAgICAgICAgICogIGNtcC53ICNpbW0scmQKKyAgIGJpYW5kICNpbW0sQEBhYnM6OCAgICAgICAgICAqICBjbXAubCAjaW1tLHJkCisgICBiaWxkICNpbW0scmQgICAgICAgICAgICAgICAqICBjbXAubCBycyxyZAorICAgYmlsZCAjaW1tLEBAcmQgICAgICAgICAgICAgICAgIGRhYSAgcnMKKyAgIGJpbGQgI2ltbSxAQGFiczo4ICAgICAgICAgICAgICBkYXMgIHJzCisgICBiaW9yICNpbW0scmQgICAgICAgICAgICAgICAgICBkZWMuYiBycworICAgYmlvciAjaW1tLEBAcmQgICAgICAgICAgICAgICogIGRlYy53ICNpbW0scmQKKyAgIGJpb3IgI2ltbSxAQGFiczo4ICAgICAgICAgICAqICBkZWMubCAjaW1tLHJkCisgICBiaXN0ICNpbW0scmQgICAgICAgICAgICAgICAgICBkaXZ4dS5iIHJzLHJkCisgICBiaXN0ICNpbW0sQEByZCAgICAgICAgICAgICAgKiAgZGl2eHUudyBycyxyZAorICAgYmlzdCAjaW1tLEBAYWJzOjggICAgICAgICAgICogIGRpdnhzLmIgcnMscmQKKyAgIGJpeG9yICNpbW0scmQgICAgICAgICAgICAgICogIGRpdnhzLncgcnMscmQKKyAgIGJpeG9yICNpbW0sQEByZCAgICAgICAgICAgICAgICBlZXBtb3YKKyAgIGJpeG9yICNpbW0sQEBhYnM6OCAgICAgICAgICAqICBlZXBtb3Z3CitAcGFnZQorKiAgZXh0cy53IHJkICAgICAgICAgICAgICAgICAgICAgbW92LncgcnMsQEBhYnM6MTYKKyogIGV4dHMubCByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sICNpbW0scmQKKyogIGV4dHUudyByZCAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLHJkCisqICBleHR1LmwgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQHJzLHJkCisgICBpbmMgIHJzICAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQChkaXNwOjE2LHJzKSxyZAorKiAgaW5jLncgI2ltbSxyZCAgICAgICAgICAgICAgKiAgbW92LmwgQEAoZGlzcDoyNCxycykscmQKKyogIGluYy5sICNpbW0scmQgICAgICAgICAgICAgICogIG1vdi5sIEBAcnMrLHJkCisgICBqbXAgIEBAcnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBhYnM6MTYscmQKKyAgIGptcCAgYWJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAYWJzOjI0LHJkCisgICBqbXAgIEBAQEBhYnM6OCAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAcmQKKyAgIGpzciAgQEBycyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQChkaXNwOjE2LHJkKQorICAganNyICBhYnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAoZGlzcDoyNCxyZCkKKyAgIGpzciAgQEBAQGFiczo4ICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAtcmQKKyAgIGxkYyAgI2ltbSxjY3IgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAYWJzOjE2CisgICBsZGMgIHJzLGNjciAgICAgICAgICAgICAgICAqICBtb3YubCBycyxAQGFiczoyNAorKiAgbGRjICBAQGFiczoxNixjY3IgICAgICAgICAgICAgIG1vdmZwZSBAQGFiczoxNixyZAorKiAgbGRjICBAQGFiczoyNCxjY3IgICAgICAgICAgICAgIG1vdnRwZSBycyxAQGFiczoxNgorKiAgbGRjICBAQChkaXNwOjE2LHJzKSxjY3IgICAgICAgIG11bHh1LmIgcnMscmQKKyogIGxkYyAgQEAoZGlzcDoyNCxycyksY2NyICAgICAqICBtdWx4dS53IHJzLHJkCisqICBsZGMgIEBAcnMrLGNjciAgICAgICAgICAgICAgKiAgbXVseHMuYiBycyxyZAorKiAgbGRjICBAQHJzLGNjciAgICAgICAgICAgICAgICogIG11bHhzLncgcnMscmQKKyogIG1vdi5iIEBAKGRpc3A6MjQscnMpLHJkICAgICAgICBuZWcuYiBycworKiAgbW92LmIgcnMsQEAoZGlzcDoyNCxyZCkgICAgICogIG5lZy53IHJzCisgICBtb3YuYiBAQGFiczoxNixyZCAgICAgICAgICAgKiAgbmVnLmwgcnMKKyAgIG1vdi5iIHJzLHJkICAgICAgICAgICAgICAgICAgIG5vcAorICAgbW92LmIgQEBhYnM6OCxyZCAgICAgICAgICAgICAgIG5vdC5iIHJzCisgICBtb3YuYiBycyxAQGFiczo4ICAgICAgICAgICAgKiAgbm90LncgcnMKKyAgIG1vdi5iIHJzLHJkICAgICAgICAgICAgICAgICogIG5vdC5sIHJzCisgICBtb3YuYiAjaW1tLHJkICAgICAgICAgICAgICAgICBvci5iICNpbW0scmQKKyAgIG1vdi5iIEBAcnMscmQgICAgICAgICAgICAgICAgICBvci5iIHJzLHJkCisgICBtb3YuYiBAQChkaXNwOjE2LHJzKSxyZCAgICAgKiAgb3IudyAjaW1tLHJkCisgICBtb3YuYiBAQHJzKyxyZCAgICAgICAgICAgICAgKiAgb3IudyBycyxyZAorICAgbW92LmIgQEBhYnM6OCxyZCAgICAgICAgICAgICogIG9yLmwgI2ltbSxyZAorICAgbW92LmIgcnMsQEByZCAgICAgICAgICAgICAgICogIG9yLmwgcnMscmQKKyAgIG1vdi5iIHJzLEBAKGRpc3A6MTYscmQpICAgICAgICBvcmMgICNpbW0sY2NyCisgICBtb3YuYiBycyxAQC1yZCAgICAgICAgICAgICAgICAgcG9wLncgcnMKKyAgIG1vdi5iIHJzLEBAYWJzOjggICAgICAgICAgICAqICBwb3AubCBycworICAgbW92LncgcnMsQEByZCAgICAgICAgICAgICAgICAgIHB1c2gudyBycworKiAgbW92LncgQEAoZGlzcDoyNCxycykscmQgICAgICogIHB1c2gubCBycworKiAgbW92LncgcnMsQEAoZGlzcDoyNCxyZCkgICAgICAgIHJvdGwuYiBycworKiAgbW92LncgQEBhYnM6MjQscmQgICAgICAgICAgICogIHJvdGwudyBycworKiAgbW92LncgcnMsQEBhYnM6MjQgICAgICAgICAgICogIHJvdGwubCBycworICAgbW92LncgcnMscmQgICAgICAgICAgICAgICAgICAgcm90ci5iIHJzCisgICBtb3YudyAjaW1tLHJkICAgICAgICAgICAgICAqICByb3RyLncgcnMKKyAgIG1vdi53IEBAcnMscmQgICAgICAgICAgICAgICAqICByb3RyLmwgcnMKKyAgIG1vdi53IEBAKGRpc3A6MTYscnMpLHJkICAgICAgICByb3R4bC5iIHJzCisgICBtb3YudyBAQHJzKyxyZCAgICAgICAgICAgICAgKiAgcm90eGwudyBycworICAgbW92LncgQEBhYnM6MTYscmQgICAgICAgICAgICogIHJvdHhsLmwgcnMKKyAgIG1vdi53IHJzLEBAKGRpc3A6MTYscmQpICAgICAgICByb3R4ci5iIHJzCisgICBtb3YudyBycyxAQC1yZCAgICAgICAgICAgICAgKiAgcm90eHIudyBycworQHBhZ2UKKyogIHJvdHhyLmwgcnMgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAKGRpc3A6MjQscmQpCisgICBicHQgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQC1yZAorICAgcnRlICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEBhYnM6MTYKKyAgIHJ0cyAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAYWJzOjI0CisgICBzaGFsLmIgcnMgICAgICAgICAgICAgICAgICAgICBzdWIuYiBycyxyZAorKiAgc2hhbC53IHJzICAgICAgICAgICAgICAgICAgICAgc3ViLncgcnMscmQKKyogIHNoYWwubCBycyAgICAgICAgICAgICAgICAgICogIHN1Yi53ICNpbW0scmQKKyAgIHNoYXIuYiBycyAgICAgICAgICAgICAgICAgICogIHN1Yi5sIHJzLHJkCisqICBzaGFyLncgcnMgICAgICAgICAgICAgICAgICAqICBzdWIubCAjaW1tLHJkCisqICBzaGFyLmwgcnMgICAgICAgICAgICAgICAgICAgICBzdWJzICNpbW0scmQKKyAgIHNobGwuYiBycyAgICAgICAgICAgICAgICAgICAgIHN1YnggI2ltbSxyZAorKiAgc2hsbC53IHJzICAgICAgICAgICAgICAgICAgICAgc3VieCBycyxyZAorKiAgc2hsbC5sIHJzICAgICAgICAgICAgICAgICAgKiAgdHJhcGEgI2ltbQorICAgc2hsci5iIHJzICAgICAgICAgICAgICAgICAgICAgeG9yICAjaW1tLHJkCisqICBzaGxyLncgcnMgICAgICAgICAgICAgICAgICAgICB4b3IgIHJzLHJkCisqICBzaGxyLmwgcnMgICAgICAgICAgICAgICAgICAqICB4b3IudyAjaW1tLHJkCisgICBzbGVlcCAgICAgICAgICAgICAgICAgICAgICAqICB4b3IudyBycyxyZAorICAgc3RjICBjY3IscmQgICAgICAgICAgICAgICAgKiAgeG9yLmwgI2ltbSxyZAorKiAgc3RjICBjY3IsQEBycyAgICAgICAgICAgICAgICogIHhvci5sIHJzLHJkCisqICBzdGMgIGNjcixAQChkaXNwOjE2LHJkKSAgICAgICAgeG9yYyAjaW1tLGNjcgorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgaWZzZXQKKworQGNpbmRleCBzaXplIHN1ZmZpeGVzLCBIOC8zMDAKK0BjaW5kZXggSDgvMzAwIHNpemUgc3VmZml4ZXMKK0ZvdXIgSDgvMzAwIGluc3RydWN0aW9ucyAoQGNvZGV7YWRkfSwgQGNvZGV7Y21wfSwgQGNvZGV7bW92fSwKK0Bjb2Rle3N1Yn0pIGFyZSBkZWZpbmVkIHdpdGggdmFyaWFudHMgdXNpbmcgdGhlIHN1ZmZpeGVzIEBzYW1wey5ifSwKK0BzYW1wey53fSwgYW5kIEBzYW1wey5sfSB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIGEgbWVtb3J5IG9wZXJhbmQuCitAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGVzZSBzdWZmaXhlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlbTsKK3NpbmNlIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgYWx3YXlzIGEgcmVnaXN0ZXIsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgorZGVkdWNlIHRoZSBjb3JyZWN0IHNpemUuCisKK0ZvciBleGFtcGxlLCBzaW5jZSBAY29kZXtyMH0gcmVmZXJzIHRvIGEgMTYtYml0IHJlZ2lzdGVyLAorQGV4YW1wbGUKK21vdiAgICByMCxAQGZvbworQGV4ZGVudCBpcyBlcXVpdmFsZW50IHRvCittb3YudyAgcjAsQEBmb28KK0BlbmQgZXhhbXBsZQorCitJZiB5b3UgdXNlIHRoZSBzaXplIHN1ZmZpeGVzLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4KK3RoZSBzdWZmaXggYW5kIHRoZSByZWdpc3RlciBzaXplIGRvIG5vdCBtYXRjaC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1oODUwMC50ZXhpIGIvZ2FzL2RvYy9jLWg4NTAwLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmMGU2NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1oODUwMC50ZXhpCkBAIC0wLDAgKzEsMjcyIEBACitAYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitAYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCitAYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KK0BwYWdlCitAbm9kZSBIOC81MDAtRGVwZW5kZW50CitAY2hhcHRlciBIOC81MDAgRGVwZW5kZW50IEZlYXR1cmVzCisKK0BjaW5kZXggSDgvNTAwIHN1cHBvcnQKK0BtZW51CisqIEg4LzUwMCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKKyogSDgvNTAwIFN5bnRheDo6ICAgICAgICAgICAgICAgU3ludGF4CisqIEg4LzUwMCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50CisqIEg4LzUwMCBEaXJlY3RpdmVzOjogICAgICAgICAgIEg4LzUwMCBNYWNoaW5lIERpcmVjdGl2ZXMKKyogSDgvNTAwIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcworQGVuZCBtZW51CisKK0Bub2RlIEg4LzUwMCBPcHRpb25zCitAc2VjdGlvbiBPcHRpb25zCisKK0BjaW5kZXggSDgvNTAwIG9wdGlvbnMgKG5vbmUpCitAY2luZGV4IG9wdGlvbnMsIEg4LzUwMCAobm9uZSkKK0Bjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQorSDgvNTAwIGZhbWlseS4KKworQG5vZGUgSDgvNTAwIFN5bnRheAorQHNlY3Rpb24gU3ludGF4CisKK0BtZW51CisqIEg4LzUwMC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycworKiBIOC81MDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcworKiBIOC81MDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCitAZW5kIG1lbnUKKworQG5vZGUgSDgvNTAwLUNoYXJzCitAc3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKKworQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBIOC81MDAKK0BjaW5kZXggSDgvNTAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKK0BzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgorCitAY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBIOC81MDAKK0BjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgSDgvNTAwCitAY2luZGV4IEg4LzUwMCBsaW5lIHNlcGFyYXRvcgorQHNhbXB7O30gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KKworQGNpbmRleCBzeW1ib2wgbmFtZXMsIEBzYW1weyR9IGluCitAY2luZGV4IEBjb2RleyR9IGluIHN5bWJvbCBuYW1lcworU2luY2UgQHNhbXB7JH0gaGFzIG5vIHNwZWNpYWwgbWVhbmluZywgeW91IG1heSB1c2UgaXQgaW4gc3ltYm9sIG5hbWVzLgorCitAbm9kZSBIOC81MDAtUmVncworQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKKworQGNpbmRleCBIOC81MDAgcmVnaXN0ZXJzCitAY2luZGV4IHJlZ2lzdGVycywgSDgvNTAwCitZb3UgY2FuIHVzZSB0aGUgcHJlZGVmaW5lZCBzeW1ib2xzIEBzYW1we3IwfSwgQHNhbXB7cjF9LCBAc2FtcHtyMn0sCitAc2FtcHtyM30sIEBzYW1we3I0fSwgQHNhbXB7cjV9LCBAc2FtcHtyNn0sIGFuZCBAc2FtcHtyN30gdG8gcmVmZXIgdG8KK3RoZSBIOC81MDAgcmVnaXN0ZXJzLgorCitUaGUgSDgvNTAwIGFsc28gaGFzIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGNwCitjb2RlIHBvaW50ZXIKKworQGl0ZW0gZHAKK2RhdGEgcG9pbnRlcgorCitAaXRlbSBicAorYmFzZSBwb2ludGVyCisKK0BpdGVtIHRwCitzdGFjayB0b3AgcG9pbnRlcgorCitAaXRlbSBlcAorZXh0cmEgcG9pbnRlcgorCitAaXRlbSBzcgorc3RhdHVzIHJlZ2lzdGVyCisKK0BpdGVtIGNjcgorY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXIKK0BlbmQgdGFibGUKKworQWxsIHJlZ2lzdGVycyBhcmUgMTYgYml0cyBsb25nLiAgVG8gcmVwcmVzZW50IDMyIGJpdCBudW1iZXJzLCB1c2UgdHdvCithZGphY2VudCByZWdpc3RlcnM7IGZvciBkaXN0YW50IG1lbW9yeSBhZGRyZXNzZXMsIHVzZSBvbmUgb2YgdGhlIHNlZ21lbnQKK3BvaW50ZXJzIChAY29kZXtjcH0gZm9yIHRoZSBwcm9ncmFtIGNvdW50ZXI7IEBjb2Rle2RwfSBmb3IKK0Bjb2Rle3IwfS0tQGNvZGV7cjN9OyBAY29kZXtlcH0gZm9yIEBjb2Rle3I0fSBhbmQgQGNvZGV7cjV9OyBhbmQKK0Bjb2Rle3RwfSBmb3IgQGNvZGV7cjZ9IGFuZCBAY29kZXtyN30uCisKK0Bub2RlIEg4LzUwMC1BZGRyZXNzaW5nCitAc3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCisKK0BjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgSDgvNTAwCitAY2luZGV4IEg4LzUwMCBhZGRyZXNzaW5nIG1vZGVzCitAdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEg4LzUwMDoKK0B0YWJsZSBAY29kZQorQGl0ZW0gUkB2YXJ7bn0KK1JlZ2lzdGVyIGRpcmVjdAorCitAaXRlbSBAQFJAdmFye259CitSZWdpc3RlciBpbmRpcmVjdAorCitAaXRlbSBAQChkOjgsIFJAdmFye259KQorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50CisKK0BpdGVtIEBAKGQ6MTYsIFJAdmFye259KQorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudAorCitAaXRlbSBAQC1SQHZhcntufQorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50CisKK0BpdGVtIEBAUkB2YXJ7bn0rCitSZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50CisKK0BpdGVtIEBAQHZhcnthYX06OAorOCBiaXQgYWJzb2x1dGUgYWRkcmVzcworCitAaXRlbSBAQEB2YXJ7YWF9OjE2CisxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcworCitAaXRlbSAjQHZhcnt4eH06OAorOCBiaXQgaW1tZWRpYXRlCisKK0BpdGVtICNAdmFye3h4fToxNgorMTYgYml0IGltbWVkaWF0ZQorQGVuZCB0YWJsZQorCitAbm9kZSBIOC81MDAgRmxvYXRpbmcgUG9pbnQKK0BzZWN0aW9uIEZsb2F0aW5nIFBvaW50CisKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEg4LzUwMCAoQHNje2llZWV9KQorQGNpbmRleCBIOC81MDAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKK1RoZSBIOC81MDAgZmFtaWx5IGhhcyBubyBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCwgYnV0IHRoZSBAY29kZXsuZmxvYXR9CitkaXJlY3RpdmUgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Cit3aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLgorCitAbm9kZSBIOC81MDAgRGlyZWN0aXZlcworQHNlY3Rpb24gSDgvNTAwIE1hY2hpbmUgRGlyZWN0aXZlcworCitAY2luZGV4IEg4LzUwMCBtYWNoaW5lIGRpcmVjdGl2ZXMgKG5vbmUpCitAY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgSDgvNTAwIChub25lKQorQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIEg4LzUwMAorQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgSDgvNTAwCitAY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgZGlyZWN0aXZlcyBmb3IgdGhlIEg4LzUwMC4KK0hvd2V2ZXIsIG9uIHRoaXMgcGxhdGZvcm0gdGhlIEBzYW1wey5pbnR9IGFuZCBAc2FtcHsud29yZH0gZGlyZWN0aXZlcworZ2VuZXJhdGUgMTYtYml0IG51bWJlcnMuCisKK0Bub2RlIEg4LzUwMCBPcGNvZGVzCitAc2VjdGlvbiBPcGNvZGVzCisKK0BjaW5kZXggSDgvNTAwIG9wY29kZSBzdW1tYXJ5CitAY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBIOC81MDAKK0BjaW5kZXggbW5lbW9uaWNzLCBIOC81MDAKK0BjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgSDgvNTAwCitGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEg4LzUwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCitAY2l0ZXtIOC81MDAgU2VyaWVzIFByb2dyYW1taW5nIE1hbnVhbH0gKEhpdGFjaGkgTTIxVDAwMSkuCisKK0Bjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBIOC81MDAgb3Bjb2Rlcy4gIE5vIGFkZGl0aW9uYWwKK3BzZXVkby1pbnN0cnVjdGlvbnMgYXJlIG5lZWRlZCBvbiB0aGlzIGZhbWlseS4KKworQGlmc2V0IFNNQUxMCitAYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKK0BjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIEg4LzUwMCBvcGNvZGVzIGFuZCB0aGVpciBvcGVyYW5kczoKKworQGMgVXNlIEBncm91cCBpZiBpdCBldmVyIHdvcmtzLCBpbnN0ZWFkIG9mIEBwYWdlCitAcGFnZQorQHNtYWxsZXhhbXBsZQorQGl7TGVnZW5kOn0KK2FiczggICAgICBAcns4LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQorYWJzMTYgICAgIEByezE2LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQorYWJzMjQgICAgIEByezI0LWJpdCBhYnNvbHV0ZSBhZGRyZXNzfQorY3JiICAgICAgIEBye0Bjb2Rle2Njcn0sIEBjb2Rle2JyfSwgQGNvZGV7ZXB9LCBAY29kZXtkcH0sIEBjb2Rle3RwfSwgQGNvZGV7ZHB9fQorZGlzcDggICAgIEByezgtYml0IGRpc3BsYWNlbWVudH0KK2VhICAgICAgICBAcntAY29kZXtybn0sIEBjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQorICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fSx9CisgICAgICAgICAgQHJ7QGNvZGV7I3h4Ojh9LCBAY29kZXsjeHg6MTZ9fQorZWFfbWVtICAgIEBye0Bjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQorICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fX0KK2VhX25vaW1tICBAcntAY29kZXtybn0sIEBjb2Rle0BAcm59LCBAY29kZXtAQChkOjgsIHJuKX0sIEBjb2Rle0BAKGQ6MTYsIHJuKX0sfQorICAgICAgICAgIEBye0Bjb2Rle0BALXJufSwgQGNvZGV7QEBybit9LCBAY29kZXtAQGFhOjh9LCBAY29kZXtAQGFhOjE2fX0KK2ZwICAgICAgICByNgoraW1tNCAgICAgIEByezQtYml0IGltbWVkaWF0ZSBkYXRhfQoraW1tOCAgICAgIEByezgtYml0IGltbWVkaWF0ZSBkYXRhfQoraW1tMTYgICAgIEByezE2LWJpdCBpbW1lZGlhdGUgZGF0YX0KK3BjcmVsOCAgICBAcns4LWJpdCBvZmZzZXQgZnJvbSBwcm9ncmFtIGNvdW50ZXJ9CitwY3JlbDE2ICAgQHJ7MTYtYml0IG9mZnNldCBmcm9tIHByb2dyYW0gY291bnRlcn0KK3FpbSAgICAgICBAcntAY29kZXstMn0sIEBjb2Rley0xfSwgQGNvZGV7MX0sIEBjb2RlezJ9fQorcmQgICAgICAgIEBye2FueSByZWdpc3Rlcn0KK3JzICAgICAgICBAcnthIHJlZ2lzdGVyIGRpc3RpbmN0IGZyb20gcmR9CitybGlzdCAgICAgQHJ7Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIHBhcmVudGhlc2VzO30KKyAgICAgICAgICBAcntyZWdpc3RlciByYW5nZXMgQGNvZGV7cmQtcnN9IGFyZSBhbGxvd2VkfQorc3AgICAgICAgIEBye3N0YWNrIHBvaW50ZXIgKEBjb2Rle3I3fSl9CitzciAgICAgICAgQHJ7c3RhdHVzIHJlZ2lzdGVyfQorc3ogICAgICAgIEBye3NpemU7IEBzYW1wey5ifSBvciBAc2FtcHsud30uICBJZiBvbWl0dGVkLCBkZWZhdWx0IEBzYW1wey53fX0KKworbGRjWy5iXSBlYSxjcmIgICAgICAgICAgICAgICAgIGJjY1sud10gcGNyZWwxNgorbGRjWy53XSBlYSxzciAgICAgICAgICAgICAgICAgIGJjY1suYl0gcGNyZWw4IAorYWRkWzpxXSBzeiBxaW0sZWFfbm9pbW0gICAgICAgIGJoc1sud10gcGNyZWwxNgorYWRkWzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgIGJoc1suYl0gcGNyZWw4IAorYWRkcyBzeiBlYSxyZCAgICAgICAgICAgICAgICAgIGJjc1sud10gcGNyZWwxNgorYWRkeCBzeiBlYSxyZCAgICAgICAgICAgICAgICAgIGJjc1suYl0gcGNyZWw4IAorYW5kIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgIGJsb1sud10gcGNyZWwxNgorYW5kY1suYl0gaW1tOCxjcmIgICAgICAgICAgICAgIGJsb1suYl0gcGNyZWw4IAorYW5kY1sud10gaW1tMTYsc3IgICAgICAgICAgICAgIGJuZVsud10gcGNyZWwxNgorYnB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJuZVsuYl0gcGNyZWw4IAorYnJhWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJlcVsud10gcGNyZWwxNgorYnJhWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJlcVsuYl0gcGNyZWw4IAorYnRbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgIGJ2Y1sud10gcGNyZWwxNgorYnRbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgIGJ2Y1suYl0gcGNyZWw4IAorYnJuWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJ2c1sud10gcGNyZWwxNgorYnJuWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJ2c1suYl0gcGNyZWw4IAorYmZbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgIGJwbFsud10gcGNyZWwxNgorYmZbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgIGJwbFsuYl0gcGNyZWw4IAorYmhpWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJtaVsud10gcGNyZWwxNgorYmhpWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJtaVsuYl0gcGNyZWw4IAorYmxzWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIGJnZVsud10gcGNyZWwxNgorYmxzWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIGJnZVsuYl0gcGNyZWw4IAorQHBhZ2UKK2JsdFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtb3ZbOmddWy5iXSBpbW04LGVhX21lbSAgICAgICAKK2JsdFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBtb3ZbOmddWy53XSBpbW0xNixlYV9tZW0gICAgICAKK2JndFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtb3ZmcGVbLmJdIGVhLHJkICAgICAgICAgICAgICAKK2JndFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBtb3Z0cGVbLmJdIHJzLGVhX25vaW1tICAgICAgICAKK2JsZVsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBtdWx4dSBzeiBlYSxyZCAgICAgICAgICAgICAgICAKK2JsZVsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBuZWcgc3ogZWEgICAgICAgICAgICAgICAgICAgICAKK2JjbHIgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2JjbHIgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBub3Qgc3ogZWEgICAgICAgICAgICAgICAgICAgICAKK2Jub3Qgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBvciBzeiBlYSxyZCAgICAgICAgICAgICAgICAgICAKK2Jub3Qgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBvcmNbLmJdIGltbTgsY3JiICAgICAgICAgICAgICAKK2JzZXQgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBvcmNbLnddIGltbTE2LHNyICAgICAgICAgICAgICAKK2JzZXQgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBwam1wIGFiczI0ICAgICAgICAgICAgICAgICAgICAKK2JzclsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICBwam1wIEBAcmQgICAgICAgICAgICAgICAgICAgICAKK2Jzclsud10gcGNyZWwxNiAgICAgICAgICAgICAgICBwanNyIGFiczI0ICAgICAgICAgICAgICAgICAgICAKK2J0c3Qgc3ogaW1tNCxlYV9ub2ltbSAgICAgICAgICBwanNyIEBAcmQgICAgICAgICAgICAgICAgICAgICAKK2J0c3Qgc3ogcnMsZWFfbm9pbW0gICAgICAgICAgICBwcnRkIGltbTggICAgICAgICAgICAgICAgICAgICAKK2NsciBzeiBlYSAgICAgICAgICAgICAgICAgICAgICBwcnRkIGltbTE2ICAgICAgICAgICAgICAgICAgICAKK2NtcFs6ZV1bLmJdIGltbTgscmQgICAgICAgICAgICBwcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAKK2NtcFs6aV1bLnddIGltbTE2LHJkICAgICAgICAgICByb3RsIHN6IGVhICAgICAgICAgICAgICAgICAgICAKK2NtcFs6Z10uYiBpbW04LGVhX25vaW1tICAgICAgICByb3RyIHN6IGVhICAgICAgICAgICAgICAgICAgICAKK2NtcFs6Z11bLnddIGltbTE2LGVhX25vaW1tICAgICByb3R4bCBzeiBlYSAgICAgICAgICAgICAgICAgICAKK0NtcFs6Z10gc3ogZWEscmQgICAgICAgICAgICAgICByb3R4ciBzeiBlYSAgICAgICAgICAgICAgICAgICAKK2RhZGQgcnMscmQgICAgICAgICAgICAgICAgICAgICBydGQgaW1tOCAgICAgICAgICAgICAgICAgICAgIAorZGl2eHUgc3ogZWEscmQgICAgICAgICAgICAgICAgIHJ0ZCBpbW0xNiAgICAgICAgICAgICAgICAgICAgCitkc3ViIHJzLHJkICAgICAgICAgICAgICAgICAgICAgcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAKK2V4dHNbLmJdIHJkICAgICAgICAgICAgICAgICAgICBzY2IvZiBycyxwY3JlbDggICAgICAgICAgICAgICAKK2V4dHVbLmJdIHJkICAgICAgICAgICAgICAgICAgICBzY2IvbmUgcnMscGNyZWw4ICAgICAgICAgICAgIAoram1wIEBAcmQgICAgICAgICAgICAgICAgICAgICAgICBzY2IvZXEgcnMscGNyZWw4ICAgICAgICAgICAgIAoram1wIEBAKGltbTgscmQpICAgICAgICAgICAgICAgICBzaGFsIHN6IGVhICAgICAgICAgICAgICAgICAgIAoram1wIEBAKGltbTE2LHJkKSAgICAgICAgICAgICAgICBzaGFyIHN6IGVhICAgICAgICAgICAgICAgICAgICAKK2ptcCBhYnMxNiAgICAgICAgICAgICAgICAgICAgICBzaGxsIHN6IGVhICAgICAgICAgICAgCitqc3IgQEByZCAgICAgICAgICAgICAgICAgICAgICAgIHNobHIgc3ogZWEgICAgICAgICAgICAKK2pzciBAQChpbW04LHJkKSAgICAgICAgICAgICAgICAgc2xlZXAgICAgICAgICAgICAgICAgIAoranNyIEBAKGltbTE2LHJkKSAgICAgICAgICAgICAgICBzdGNbLmJdIGNyYixlYV9ub2ltbSAgCitqc3IgYWJzMTYgICAgICAgICAgICAgICAgICAgICAgc3RjWy53XSBzcixlYV9ub2ltbSAgIAorbGRtIEBAc3ArLChybGlzdCkgICAgICAgICAgICAgICBzdG0gKHJsaXN0KSxAQC1zcCAgICAgCitsaW5rIGZwLGltbTggICAgICAgICAgICAgICAgICAgc3ViIHN6IGVhLHJkICAgICAgICAgIAorbGluayBmcCxpbW0xNiAgICAgICAgICAgICAgICAgIHN1YnMgc3ogZWEscmQgICAgICAgICAKK21vdls6ZV1bLmJdIGltbTgscmQgICAgICAgICAgICBzdWJ4IHN6IGVhLHJkICAgICAgICAgCittb3ZbOmldWy53XSBpbW0xNixyZCAgICAgICAgICAgc3dhcFsuYl0gcmQgICAgICAgICAgIAorbW92WzpsXVsud10gYWJzOCxyZCAgICAgICAgICAgIHRhc1suYl0gZWEgICAgIAorbW92WzpsXS5iIGFiczgscmQgICAgICAgICAgICAgIHRyYXBhIGltbTQgICAgIAorbW92WzpzXVsud10gcnMsYWJzOCAgICAgICAgICAgIHRyYXAvdnMgICAgICAgIAorbW92WzpzXS5iIHJzLGFiczggICAgICAgICAgICAgIHRzdCBzeiBlYSAgICAgIAorbW92WzpmXVsud10gQEAoZGlzcDgsZnApLHJkICAgICB1bmxrIGZwICAgICAgICAKK21vdls6Zl1bLnddIHJzLEBAKGRpc3A4LGZwKSAgICAgeGNoWy53XSBycyxyZCAKK21vdls6Zl0uYiBAQChkaXNwOCxmcCkscmQgICAgICAgeG9yIHN6IGVhLHJkICAgCittb3ZbOmZdLmIgcnMsQEAoZGlzcDgsZnApICAgICAgIHhvcmMuYiBpbW04LGNyYgorbW92WzpnXSBzeiBycyxlYV9tZW0gICAgICAgICAgIHhvcmMudyBpbW0xNixzcgorbW92WzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgCitAZW5kIHNtYWxsZXhhbXBsZQorQGVuZCBpZnNldApkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWhwcGEudGV4aSBiL2dhcy9kb2MvYy1ocHBhLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNTM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1ocHBhLnRleGkKQEAgLTAsMCArMSwyNjMgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQHBhZ2UKK0Bub2RlIEhQUEEtRGVwZW5kZW50CitAY2hhcHRlciBIUFBBIERlcGVuZGVudCBGZWF0dXJlcworCitAY2luZGV4ICBzdXBwb3J0CitAbWVudQorKiBIUFBBIE5vdGVzOjogICAgICAgICAgICAgICAgTm90ZXMKKyogSFBQQSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKKyogSFBQQSBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAorKiBIUFBBIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKKyogSFBQQSBEaXJlY3RpdmVzOjogICAgICAgICAgIEhQUEEgTWFjaGluZSBEaXJlY3RpdmVzCisqIEhQUEEgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCitAZW5kIG1lbnUKKworQG5vZGUgSFBQQSBOb3RlcworQHNlY3Rpb24gTm90ZXMKK0FzIGEgYmFjayBlbmQgZm9yIEBzY3tnbnV9IEBzY3tjY30gQGNvZGV7QHZhbHVle0FTfX0gaGFzIGJlZW4gdGhyb3VnaGx5IHRlc3RlZCBhbmQgc2hvdWxkCit3b3JrIGV4dHJlbWVseSB3ZWxsLiAgV2UgaGF2ZSB0ZXN0ZWQgaXQgb25seSBtaW5pbWFsbHkgb24gaGFuZCB3cml0dGVuIGFzc2VtYmx5Citjb2RlIGFuZCBubyBvbmUgaGFzIHRlc3RlZCBpdCBtdWNoIG9uIHRoZSBhc3NlbWJseSBvdXRwdXQgZnJvbSB0aGUgSFAKK2NvbXBpbGVycy4KKworVGhlIGZvcm1hdCBvZiB0aGUgZGVidWdnaW5nIHNlY3Rpb25zIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbAorQGNvZGV7QHZhbHVle0FTfX0gcG9ydCAodmVyc2lvbiAxLjNYKSB3YXMgcmVsZWFzZWQ7IHRoZXJlZm9yZSwKK3lvdSBtdXN0IHJlYnVpbGQgYWxsIEhQUEEgb2JqZWN0cyBhbmQgbGlicmFyaWVzIHdpdGggdGhlIG5ldyAKK2Fzc2VtYmxlciBzbyB0aGF0IHlvdSBjYW4gZGVidWcgdGhlIGZpbmFsIGV4ZWN1dGFibGUuCisKK1RoZSBIUFBBIEBjb2Rle0B2YWx1ZXtBU319IHBvcnQgZ2VuZXJhdGVzIGEgc21hbGwgc3Vic2V0IG9mIHRoZSByZWxvY2F0aW9ucworYXZhaWxhYmxlIGluIHRoZSBTT00gYW5kIEVMRiBvYmplY3QgZmlsZSBmb3JtYXRzLiAgQWRkaXRpb25hbCByZWxvY2F0aW9uCitzdXBwb3J0IHdpbGwgYmUgYWRkZWQgYXMgaXQgYmVjb21lcyBuZWNlc3NhcnkuICAKKworQG5vZGUgSFBQQSBPcHRpb25zCitAc2VjdGlvbiBPcHRpb25zCitAY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIUFBBLgorCitAY2luZGV4IEhQUEEgU3ludGF4CitAbm9kZSBIUFBBIFN5bnRheAorQHNlY3Rpb24gU3ludGF4CitUaGUgYXNzZW1ibGVyIHN5bnRheCBjbG9zZWx5IGZvbGxvd3MgdGhlIEhQUEEgaW5zdHJ1Y3Rpb24gc2V0CityZWZlcmVuY2UgbWFudWFsOyBhc3NlbWJsZXIgZGlyZWN0aXZlcyBhbmQgZ2VuZXJhbCBzeW50YXggY2xvc2VseSBmb2xsb3cgdGhlCitIUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHJlZmVyZW5jZSBtYW51YWwsIHdpdGggYSBmZXcgbm90ZXdvcnRoeSBkaWZmZXJlbmNlcy4KKworRmlyc3QsIGEgY29sb24gbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyBhIGxhYmVsIGRlZmluaXRpb24uICBUaGlzIGlzCitzaW1wbHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBob3cgbW9zdCBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycword3JpdGUgY29kZS4KKworU29tZSBvYnNjdXJlIGV4cHJlc3Npb24gcGFyc2luZyBwcm9ibGVtcyBtYXkgYWZmZWN0IGhhbmQgd3JpdHRlbiBjb2RlIHdoaWNoCit1c2VzIHRoZSBAY29kZXtzcG9wfSBpbnN0cnVjdGlvbnMsIG9yIGNvZGUgd2hpY2ggbWFrZXMgc2lnbmlmaWNhbnQKK3VzZSBvZiB0aGUgQGNvZGV7IX0gbGluZSBzZXBhcmF0b3IuCisKK0Bjb2Rle0B2YWx1ZXtBU319IGlzIG11Y2ggbGVzcyBmb3JnaXZpbmcgYWJvdXQgbWlzc2luZyBhcmd1bWVudHMgYW5kIG90aGVyCitzaW1pbGFyIG92ZXJzaWdodHMgdGhhbiB0aGUgSFAgYXNzZW1ibGVyLiAgQGNvZGV7QHZhbHVle0FTfX0gbm90aWZpZXMgeW91CitvZiBtaXNzaW5nIGFyZ3VtZW50cyBhcyBzeW50YXggZXJyb3JzOyB0aGlzIGlzIHJlZ2FyZGVkIGFzIGEgZmVhdHVyZSwgbm90IGEKK2J1Zy4KKworRmluYWxseSwgQGNvZGV7QHZhbHVle0FTfX0gYWxsb3dzIHlvdSB0byB1c2UgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGhvdXQKK2V4cGxpY2l0bHkgaW1wb3J0aW5nIHRoZSBzeW1ib2wuICBAZW1waHtXYXJuaW5nOn0gaW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgYmUKK2FuIGVycm9yIGZvciBIUFBBIHRhcmdldHMuCisKK1NwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFBQQSB0YXJnZXRzIGluY2x1ZGU6CisKK0BzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgorCitAc2FtcHshfSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgorCitTaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCisKK0Bub2RlIEhQUEEgRmxvYXRpbmcgUG9pbnQKK0BzZWN0aW9uIEZsb2F0aW5nIFBvaW50CitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIUFBBIChAc2N7aWVlZX0pCitAY2luZGV4IEhQUEEgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKK1RoZSBIUFBBIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgorCitAbm9kZSBIUFBBIERpcmVjdGl2ZXMKK0BzZWN0aW9uIEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXMKKworQGNvZGV7QHZhbHVle0FTfX0gZm9yIHRoZSBIUFBBIHN1cHBvcnRzIG1hbnkgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGZvcgorY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBuYXRpdmUgYXNzZW1ibGVyLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGVtIG9ubHkKK2JyaWVmbHkuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gSFBQQS1zcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlcywgc2VlCitAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpLgorCitAY2luZGV4IEhQUEEgZGlyZWN0aXZlcyBub3Qgc3VwcG9ydGVkCitAY29kZXtAdmFsdWV7QVN9fSBkb2VzIEBlbXBoe25vdH0gc3VwcG9ydCB0aGUgZm9sbG93aW5nIGFzc2VtYmxlciBkaXJlY3RpdmVzCitkZXNjcmliZWQgaW4gdGhlIEhQIG1hbnVhbDoKKworQGV4YW1wbGUKKy5lbmRtICAgICAgICAgICAubGlzdG9uCisuZW50ZXIgICAgICAgICAgLmxvY2N0CisubGVhdmUgICAgICAgICAgLm1hY3JvICAKKy5saXN0b2ZmCitAZW5kIGV4YW1wbGUKKworQGNpbmRleCBAY29kZXsucGFyYW19IG9uIEhQUEEKK0JleW9uZCB0aG9zZSBpbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eSwgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgb25lCithZGRpdGlvbmFsIGFzc2VtYmxlciBkaXJlY3RpdmUgZm9yIHRoZSBIUFBBOiBAY29kZXsucGFyYW19LiAgSXQgY29udmV5cworcmVnaXN0ZXIgYXJndW1lbnQgbG9jYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgSXRzIHN5bnRheCBjbG9zZWx5IGZvbGxvd3MKK3RoZSBAY29kZXsuZXhwb3J0fSBkaXJlY3RpdmUuCisKK0BjaW5kZXggSFBQQS1vbmx5IGRpcmVjdGl2ZXMKK1RoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGluIEBjb2Rle0B2YWx1ZXtBU319IGZvciB0aGUgSFBQQToKKworQHRhYmxlIEBjb2RlCitAaXRlbSAuYmxvY2sgQHZhcntufQorQGl0ZW14IC5ibG9ja3ogQHZhcntufQorUmVzZXJ2ZSBAdmFye259IGJ5dGVzIG9mIHN0b3JhZ2UsIGFuZCBpbml0aWFsaXplIHRoZW0gdG8gemVyby4KKworQGl0ZW0gLmNhbGwgCitNYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9jZWR1cmUgY2FsbC4gIE9ubHkgdGhlIHNwZWNpYWwgY2FzZSB3aXRoIEBlbXBoe25vCithcmd1bWVudHN9IGlzIGFsbG93ZWQuCisKK0BpdGVtIC5jYWxsaW5mbyBbIEB2YXJ7cGFyYW19PUB2YXJ7dmFsdWV9LCBAZG90c3t9IF0gIFsgQHZhcntmbGFnfSwgQGRvdHN7fSBdCitTcGVjaWZ5IGEgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIGZsYWdzIHRoYXQgZGVmaW5lIHRoZSBlbnZpcm9ubWVudCBmb3IgYQorcHJvY2VkdXJlLgorCitAdmFye3BhcmFtfSBtYXkgYmUgYW55IG9mIEBzYW1we2ZyYW1lfSAoZnJhbWUgc2l6ZSksIEBzYW1we2VudHJ5X2dyfSAoZW5kIG9mCitnZW5lcmFsIHJlZ2lzdGVyIHJhbmdlKSwgQHNhbXB7ZW50cnlfZnJ9IChlbmQgb2YgZmxvYXQgcmVnaXN0ZXIgcmFuZ2UpLAorQHNhbXB7ZW50cnlfc3J9IChlbmQgb2Ygc3BhY2UgcmVnaXN0ZXIgcmFuZ2UpLgorCitUaGUgdmFsdWVzIGZvciBAdmFye2ZsYWd9IGFyZSBAc2FtcHtjYWxsc30gb3IgQHNhbXB7Y2FsbGVyfSAocHJvYyBoYXMKK3N1YnJvdXRpbmVzKSwgQHNhbXB7bm9fY2FsbHN9IChwcm9jIGRvZXMgbm90IGNhbGwgc3Vicm91dGluZXMpLCBAc2FtcHtzYXZlX3JwfQorKHByZXNlcnZlIHJldHVybiBwb2ludGVyKSwgQHNhbXB7c2F2ZV9zcH0gKHByb2MgcHJlc2VydmVzIHN0YWNrIHBvaW50ZXIpLAorQHNhbXB7bm9fdW53aW5kfSAoZG8gbm90IHVud2luZCB0aGlzIHByb2MpLCBAc2FtcHtocHV4X2ludH0gKHByb2MgaXMgaW50ZXJydXB0Cityb3V0aW5lKS4KKworQGl0ZW0gLmNvZGUKK0Fzc2VtYmxlIGludG8gdGhlIHN0YW5kYXJkIHNlY3Rpb24gY2FsbGVkIEBzYW1weyRURVhUJH0sIHN1YnNlY3Rpb24KK0BzYW1weyRDT0RFJH0uCisKK0BpZnNldCBTT00KK0BpdGVtIC5jb3B5cmlnaHQgIkB2YXJ7c3RyaW5nfSIKK0luIHRoZSBTT00gb2JqZWN0IGZvcm1hdCwgaW5zZXJ0IEB2YXJ7c3RyaW5nfSBpbnRvIHRoZSBvYmplY3QgY29kZSwgbWFya2VkIGFzIGEKK2NvcHlyaWdodCBzdHJpbmcuCitAZW5kIGlmc2V0CisKK0BpZnNldCBFTEYKK0BpdGVtIC5jb3B5cmlnaHQgIkB2YXJ7c3RyaW5nfSIKK0luIHRoZSBFTEYgb2JqZWN0IGZvcm1hdCwgaW5zZXJ0IEB2YXJ7c3RyaW5nfSBpbnRvIHRoZSBvYmplY3QgY29kZSwgbWFya2VkIGFzIGEKK3ZlcnNpb24gc3RyaW5nLgorQGVuZCBpZnNldAorCitAaXRlbSAuZW50ZXIKK05vdCB5ZXQgc3VwcG9ydGVkOyB0aGUgYXNzZW1ibGVyIHJlamVjdHMgcHJvZ3JhbXMgY29udGFpbmluZyB0aGlzIGRpcmVjdGl2ZS4KKworQGl0ZW0gLmVudHJ5CitNYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9jZWR1cmUuCisKK0BpdGVtIC5leGl0CitNYXJrIHRoZSBlbmQgb2YgYSBwcm9jZWR1cmUuCisKK0BpdGVtIC5leHBvcnQgQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXSAgWyAsQHZhcntwYXJhbX09QHZhcntyfSBdCitNYWtlIGEgcHJvY2VkdXJlIEB2YXJ7bmFtZX0gYXZhaWxhYmxlIHRvIGNhbGxlcnMuICBAdmFye3R5cH0sIGlmIHByZXNlbnQsIG11c3QKK2JlIG9uZSBvZiBAc2FtcHthYnNvbHV0ZX0sIEBzYW1we2NvZGV9IChFTEYgb25seSwgbm90IFNPTSksIEBzYW1we2RhdGF9LAorQHNhbXB7ZW50cnl9LCBAc2FtcHtkYXRhfSwgQHNhbXB7ZW50cnl9LCBAc2FtcHttaWxsaWNvZGV9LCBAc2FtcHtwbGFiZWx9LAorQHNhbXB7cHJpX3Byb2d9LCBvciBAc2FtcHtzZWNfcHJvZ30uCisKK0B2YXJ7cGFyYW19LCBpZiBwcmVzZW50LCBwcm92aWRlcyBlaXRoZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlCitwcm9jZWR1cmUgYXJndW1lbnRzIGFuZCByZXN1bHQsIG9yIGEgcHJpdmlsZWdlIGxldmVsLiAgQHZhcntwYXJhbX0gbWF5IGJlCitAc2FtcHthcmd3QHZhcntufX0gKHdoZXJlIEB2YXJ7bn0gcmFuZ2VzIGZyb20gQGNvZGV7MH0gdG8gQGNvZGV7M30sIGFuZAoraW5kaWNhdGVzIG9uZSBvZiBmb3VyIG9uZS13b3JkIGFyZ3VtZW50cyk7IEBzYW1we3J0bnZhbH0gKHRoZSBwcm9jZWR1cmUncworcmVzdWx0KTsgb3IgQHNhbXB7cHJpdl9sZXZ9IChwcml2aWxlZ2UgbGV2ZWwpLiAgRm9yIGFyZ3VtZW50cyBvciB0aGUgcmVzdWx0LAorQHZhcntyfSBzcGVjaWZpZXMgaG93IHRvIHJlbG9jYXRlLCBhbmQgbXVzdCBiZSBvbmUgb2YgQHNhbXB7bm99IChub3QKK3JlbG9jYXRhYmxlKSwgQHNhbXB7Z3J9IChhcmd1bWVudCBpcyBpbiBnZW5lcmFsIHJlZ2lzdGVyKSwgQHNhbXB7ZnJ9IChpbgorZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIpLCBvciBAc2FtcHtmdX0gKHVwcGVyIGhhbGYgb2YgZmxvYXQgcmVnaXN0ZXIpLgorRm9yIEBzYW1we3ByaXZfbGV2fSwgQHZhcntyfSBpcyBhbiBpbnRlZ2VyLgorCitAaXRlbSAuaGFsZiBAdmFye259CitEZWZpbmUgYSB0d28tYnl0ZSBpbnRlZ2VyIGNvbnN0YW50IEB2YXJ7bn07IHN5bm9ueW0gZm9yIHRoZSBwb3J0YWJsZQorQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0aXZlIEBjb2Rley5zaG9ydH0uCisKK0BpdGVtIC5pbXBvcnQgQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXQorQ29udmVyc2Ugb2YgQGNvZGV7LmV4cG9ydH07IG1ha2UgYSBwcm9jZWR1cmUgYXZhaWxhYmxlIHRvIGNhbGwuICBUaGUgYXJndW1lbnRzCit1c2UgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgZm9yIEBjb2Rley5leHBvcnR9LgorCitAaXRlbSAubGFiZWwgQHZhcntuYW1lfQorRGVmaW5lIEB2YXJ7bmFtZX0gYXMgYSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgYXNzZW1ibHkgbG9jYXRpb24uCisKK0BpdGVtIC5sZWF2ZQorTm90IHlldCBzdXBwb3J0ZWQ7IHRoZSBhc3NlbWJsZXIgcmVqZWN0cyBwcm9ncmFtcyBjb250YWluaW5nIHRoaXMgZGlyZWN0aXZlLgorCitAaXRlbSAub3JpZ2luIEB2YXJ7bGN9CitBZHZhbmNlIGxvY2F0aW9uIGNvdW50ZXIgdG8gQHZhcntsY30uIFN5bm9ueW0gZm9yIHRoZSBAY29kZXtAdmFsdWV7YXN9fQorcG9ydGFibGUgZGlyZWN0aXZlIEBjb2Rley5vcmd9LgorCitAaXRlbSAucGFyYW0gQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXSAgWyAsQHZhcntwYXJhbX09QHZhcntyfSBdCitAYyBOb3QgaW4gSFAgbWFudWFsOyBAc2N7Z251fSBIUFBBIGV4dGVuc2lvbgorU2ltaWxhciB0byBAY29kZXsuZXhwb3J0fSwgYnV0IHVzZWQgZm9yIHN0YXRpYyBwcm9jZWR1cmVzLgorCitAaXRlbSAucHJvYworVXNlIHByZWNlZGluZyB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIGEgcHJvY2VkdXJlLgorCitAaXRlbSAucHJvY2VuZAorVXNlIGZvbGxvd2luZyB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgYSBwcm9jZWR1cmUuCisKK0BpdGVtIEB2YXJ7bGFiZWx9IC5yZWcgQHZhcntleHByfQorQGMgPz8gTm90IGluIEhQIG1hbnVhbCAoSmFuIDE5ODggdm4pCitTeW5vbnltIGZvciBAY29kZXsuZXF1fTsgZGVmaW5lIEB2YXJ7bGFiZWx9IHdpdGggdGhlIGFic29sdXRlIGV4cHJlc3Npb24KK0B2YXJ7ZXhwcn0gYXMgaXRzIHZhbHVlLgorCitAaXRlbSAuc3BhY2UgQHZhcntzZWNuYW1lfSBbICxAdmFye3BhcmFtc30gXQorU3dpdGNoIHRvIHNlY3Rpb24gQHZhcntzZWNuYW1lfSwgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBieSB0aGF0IG5hbWUgaWYKK25lY2Vzc2FyeS4gIFlvdSBtYXkgb25seSB1c2UgQHZhcntwYXJhbXN9IHdoZW4gY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiwgbm90Cit3aGVuIHN3aXRjaGluZyB0byBhbiBleGlzdGluZyBvbmUuICBAdmFye3NlY25hbWV9IG1heSBpZGVudGlmeSBhIHNlY3Rpb24gYnkKK251bWJlciByYXRoZXIgdGhhbiBieSBuYW1lLgorCitJZiBzcGVjaWZpZWQsIHRoZSBsaXN0IEB2YXJ7cGFyYW1zfSBkZWNsYXJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uLAoraWRlbnRpZmllZCBieSBrZXl3b3Jkcy4gIFRoZSBrZXl3b3JkcyByZWNvZ25pemVkIGFyZSBAc2FtcHtzcG51bT1AdmFye2V4cH19CisoaWRlbnRpZnkgdGhpcyBzZWN0aW9uIGJ5IHRoZSBudW1iZXIgQHZhcntleHB9LCBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSwKK0BzYW1we3NvcnQ9QHZhcntleHB9fSAob3JkZXIgc2VjdGlvbnMgYWNjb3JkaW5nIHRvIHRoaXMgc29ydCBrZXkgd2hlbiBsaW5raW5nOworQHZhcntleHB9IGlzIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLCBAc2FtcHt1bmxvYWRhYmxlfSAoc2VjdGlvbiBjb250YWlucyBubworbG9hZGFibGUgZGF0YSksIEBzYW1we25vdGRlZmluZWR9ICh0aGlzIHNlY3Rpb24gZGVmaW5lZCBlbHNld2hlcmUpLCBhbmQKK0BzYW1we3ByaXZhdGV9IChkYXRhIGluIHRoaXMgc2VjdGlvbiBub3QgYXZhaWxhYmxlIHRvIG90aGVyIHByb2dyYW1zKS4KKworQGl0ZW0gLnNwbnVtIEB2YXJ7c2VjbmFtfQorQGMgPz8gTm90IGluIEhQIG1hbnVhbCAoSmFuIDE5ODgpCitBbGxvY2F0ZSBmb3VyIGJ5dGVzIG9mIHN0b3JhZ2UsIGFuZCBpbml0aWFsaXplIHRoZW0gd2l0aCB0aGUgc2VjdGlvbiBudW1iZXIgb2YKK3RoZSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjbmFtfS4gIChZb3UgY2FuIGRlZmluZSB0aGUgc2VjdGlvbiBudW1iZXIgd2l0aCB0aGUKK0hQUEEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuKQorCitAY2luZGV4IEBjb2Rle3N0cmluZ30gZGlyZWN0aXZlIG9uIEhQUEEKK0BpdGVtIC5zdHJpbmcgIkB2YXJ7c3RyfSIKK0NvcHkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBAdmFye3N0cn0gdG8gdGhlIG9iamVjdCBmaWxlLgorQHhyZWZ7U3RyaW5ncywsU3RyaW5nc30sIGZvciBpbmZvcm1hdGlvbiBvbiBlc2NhcGUgc2VxdWVuY2VzIHlvdSBjYW4gdXNlIGluCitAY29kZXtAdmFsdWV7QVN9fSBzdHJpbmdzLgorCitAZW1waHtXYXJuaW5nIX0gVGhlIEhQUEEgdmVyc2lvbiBvZiBAY29kZXsuc3RyaW5nfSBkaWZmZXJzIGZyb20gdGhlCit1c3VhbCBAY29kZXtAdmFsdWV7QVN9fSBkZWZpbml0aW9uOiBpdCBkb2VzIEBlbXBoe25vdH0gd3JpdGUgYSB6ZXJvIGJ5dGUKK2FmdGVyIGNvcHlpbmcgQHZhcntzdHJ9LgorCitAaXRlbSAuc3RyaW5neiAiQHZhcntzdHJ9IgorTGlrZSBAY29kZXsuc3RyaW5nfSwgYnV0IGFwcGVuZHMgYSB6ZXJvIGJ5dGUgYWZ0ZXIgY29weWluZyBAdmFye3N0cn0gdG8gb2JqZWN0CitmaWxlLgorCitAaXRlbSAuc3Vic3BhIEB2YXJ7bmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KK0BpdGVteCAubnN1YnNwYSBAdmFye25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCitTaW1pbGFyIHRvIEBjb2Rley5zcGFjZX0sIGJ1dCBzZWxlY3RzIGEgc3Vic2VjdGlvbiBAdmFye25hbWV9IHdpdGhpbiB0aGUKK2N1cnJlbnQgc2VjdGlvbi4gIFlvdSBtYXkgb25seSBzcGVjaWZ5IEB2YXJ7cGFyYW1zfSB3aGVuIHlvdSBjcmVhdGUgYQorc3Vic2VjdGlvbiAoaW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIEBjb2Rley5zdWJzcGF9IGZvciB0aGlzIEB2YXJ7bmFtZX0pLgorCitJZiBzcGVjaWZpZWQsIHRoZSBsaXN0IEB2YXJ7cGFyYW1zfSBkZWNsYXJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBzdWJzZWN0aW9uLAoraWRlbnRpZmllZCBieSBrZXl3b3Jkcy4gIFRoZSBrZXl3b3JkcyByZWNvZ25pemVkIGFyZSBAc2FtcHtxdWFkPUB2YXJ7ZXhwcn19CisoYGBxdWFkcmFudCcnIGZvciB0aGlzIHN1YnNlY3Rpb24pLCBAc2FtcHthbGlnbj1AdmFye2V4cHJ9fSAoYWxpZ25tZW50IGZvcgorYmVnaW5uaW5nIG9mIHRoaXMgc3Vic2VjdGlvbjsgYSBwb3dlciBvZiB0d28pLCBAc2FtcHthY2Nlc3M9QHZhcntleHByfX0gKHZhbHVlCitmb3IgYGBhY2Nlc3MgcmlnaHRzJycgZmllbGQpLCBAc2FtcHtzb3J0PUB2YXJ7ZXhwcn19IChzb3J0aW5nIG9yZGVyIGZvciB0aGlzCitzdWJzcGFjZSBpbiBsaW5rKSwgQHNhbXB7Y29kZV9vbmx5fSAoc3Vic2VjdGlvbiBjb250YWlucyBvbmx5IGNvZGUpLAorQHNhbXB7dW5sb2FkYWJsZX0gKHN1YnNlY3Rpb24gY2Fubm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeSksIEBzYW1we2NvbW1vbn0KKyhzdWJzZWN0aW9uIGlzIGNvbW1vbiBibG9jayksIEBzYW1we2R1cF9jb21tfSAoaW5pdGlhbGl6ZWQgZGF0YSBtYXkgaGF2ZQorZHVwbGljYXRlIG5hbWVzKSwgb3IgQHNhbXB7emVyb30gKHN1YnNlY3Rpb24gaXMgYWxsIHplcm9zLCBkbyBub3Qgd3JpdGUgaW4KK29iamVjdCBmaWxlKS4KKworQGNvZGV7Lm5zdWJzcGF9IGFsd2F5cyBjcmVhdGVzIGEgbmV3IHN1YnNwYWNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGV2ZW4KK2lmIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCisKK0BpdGVtIC52ZXJzaW9uICJAdmFye3N0cn0iCitXcml0ZSBAdmFye3N0cn0gYXMgdmVyc2lvbiBpZGVudGlmaWVyIGluIG9iamVjdCBjb2RlLgorQGVuZCB0YWJsZQorCitAbm9kZSBIUFBBIE9wY29kZXMKK0BzZWN0aW9uIE9wY29kZXMKK0ZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSFBQQSBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCitAY2l0ZXtQQS1SSVNDIEFyY2hpdGVjdHVyZSBhbmQgSW5zdHJ1Y3Rpb24gU2V0IFJlZmVyZW5jZSBNYW51YWx9IAorKEhQIDA5NzQwLTkwMDM5KS4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1pMzg2LnRleGkgYi9nYXMvZG9jL2MtaTM4Ni50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzg5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL2MtaTM4Ni50ZXhpCkBAIC0wLDAgKzEsNTE4IEBACitAYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAbm9kZSBpMzg2LURlcGVuZGVudAorQGNoYXB0ZXIgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgODAzODYgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmY2xlYXIKKworQGNpbmRleCBpMzg2IHN1cHBvcnQKK0BjaW5kZXggaTgwMzA2IHN1cHBvcnQKK0BtZW51CisqIGkzODYtT3B0aW9uczo6ICAgICAgICAgICAgICAgIE9wdGlvbnMKKyogaTM4Ni1TeW50YXg6OiAgICAgICAgICAgICAgICAgQVQmVCBTeW50YXggdmVyc3VzIEludGVsIFN5bnRheAorKiBpMzg2LU1uZW1vbmljczo6ICAgICAgICAgICAgICBJbnN0cnVjdGlvbiBOYW1pbmcKKyogaTM4Ni1SZWdzOjogICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtaW5nCisqIGkzODYtUHJlZml4ZXM6OiAgICAgICAgICAgICAgIEluc3RydWN0aW9uIFByZWZpeGVzCisqIGkzODYtTWVtb3J5OjogICAgICAgICAgICAgICAgIE1lbW9yeSBSZWZlcmVuY2VzCisqIGkzODYtanVtcHM6OiAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIG9mIEp1bXAgSW5zdHJ1Y3Rpb25zCisqIGkzODYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50CisqIGkzODYtU0lNRDo6ICAgICAgICAgICAgICAgICAgIEludGVsJ3MgTU1YIGFuZCBBTUQncyAzRE5vdyEgU0lNRCBPcGVyYXRpb25zCisqIGkzODYtMTZiaXQ6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgMTYtYml0IENvZGUKKyogaTM4Ni1CdWdzOjogICAgICAgICAgICAgICAgICAgQVQmVCBTeW50YXggYnVncworKiBpMzg2LU5vdGVzOjogICAgICAgICAgICAgICAgICBOb3RlcworQGVuZCBtZW51CisKK0Bub2RlIGkzODYtT3B0aW9ucworQHNlY3Rpb24gT3B0aW9ucworCitAY2luZGV4IG9wdGlvbnMgZm9yIGkzODYgKG5vbmUpCitAY2luZGV4IGkzODYgb3B0aW9ucyAobm9uZSkKK1RoZSA4MDM4NiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgb3B0aW9ucy4KKworQG5vZGUgaTM4Ni1TeW50YXgKK0BzZWN0aW9uIEFUJlQgU3ludGF4IHZlcnN1cyBJbnRlbCBTeW50YXgKKworQGNpbmRleCBpMzg2IHN5bnRheCBjb21wYXRpYmlsaXR5CitAY2luZGV4IHN5bnRheCBjb21wYXRpYmlsaXR5LCBpMzg2CitJbiBvcmRlciB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG91dHB1dCBvZiBAY29kZXtAdmFsdWV7R0NDfX0sCitAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBBVCZUIFN5c3RlbSBWLzM4NiBhc3NlbWJsZXIgc3ludGF4LiAgVGhpcyBpcyBxdWl0ZQorZGlmZmVyZW50IGZyb20gSW50ZWwgc3ludGF4LiAgV2UgbWVudGlvbiB0aGVzZSBkaWZmZXJlbmNlcyBiZWNhdXNlCithbG1vc3QgYWxsIDgwMzg2IGRvY3VtZW50cyB1c2UgSW50ZWwgc3ludGF4LiAgTm90YWJsZSBkaWZmZXJlbmNlcworYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzIGFyZToKKworQGNpbmRleCBpbW1lZGlhdGUgb3BlcmFuZHMsIGkzODYKK0BjaW5kZXggaTM4NiBpbW1lZGlhdGUgb3BlcmFuZHMKK0BjaW5kZXggcmVnaXN0ZXIgb3BlcmFuZHMsIGkzODYKK0BjaW5kZXggaTM4NiByZWdpc3RlciBvcGVyYW5kcworQGNpbmRleCBqdW1wL2NhbGwgb3BlcmFuZHMsIGkzODYKK0BjaW5kZXggaTM4NiBqdW1wL2NhbGwgb3BlcmFuZHMKK0BjaW5kZXggb3BlcmFuZCBkZWxpbWl0ZXJzLCBpMzg2CitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorQVQmVCBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIHByZWNlZGVkIGJ5IEBzYW1weyR9OyBJbnRlbCBpbW1lZGlhdGUKK29wZXJhbmRzIGFyZSB1bmRlbGltaXRlZCAoSW50ZWwgQHNhbXB7cHVzaCA0fSBpcyBBVCZUIEBzYW1we3B1c2hsICQ0fSkuCitBVCZUIHJlZ2lzdGVyIG9wZXJhbmRzIGFyZSBwcmVjZWRlZCBieSBAc2FtcHslfTsgSW50ZWwgcmVnaXN0ZXIgb3BlcmFuZHMKK2FyZSB1bmRlbGltaXRlZC4gIEFUJlQgYWJzb2x1dGUgKGFzIG9wcG9zZWQgdG8gUEMgcmVsYXRpdmUpIGp1bXAvY2FsbAorb3BlcmFuZHMgYXJlIHByZWZpeGVkIGJ5IEBzYW1weyp9OyB0aGV5IGFyZSB1bmRlbGltaXRlZCBpbiBJbnRlbCBzeW50YXguCisKK0BjaW5kZXggaTM4NiBzb3VyY2UsIGRlc3RpbmF0aW9uIG9wZXJhbmRzCitAY2luZGV4IHNvdXJjZSwgZGVzdGluYXRpb24gb3BlcmFuZHM7IGkzODYKK0BpdGVtCitBVCZUIGFuZCBJbnRlbCBzeW50YXggdXNlIHRoZSBvcHBvc2l0ZSBvcmRlciBmb3Igc291cmNlIGFuZCBkZXN0aW5hdGlvbgorb3BlcmFuZHMuICBJbnRlbCBAc2FtcHthZGQgZWF4LCA0fSBpcyBAc2FtcHthZGRsICQ0LCAlZWF4fS4gIFRoZQorQHNhbXB7c291cmNlLCBkZXN0fSBjb252ZW50aW9uIGlzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorcHJldmlvdXMgVW5peCBhc3NlbWJsZXJzLiAgTm90ZSB0aGF0IGluc3RydWN0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUKK3NvdXJjZSBvcGVyYW5kLCBzdWNoIGFzIHRoZSBAc2FtcHtlbnRlcn0gaW5zdHJ1Y3Rpb24sIGRvIEBlbXBoe25vdH0gaGF2ZQorcmV2ZXJzZWQgb3JkZXIuICBAcmVme2kzODYtQnVnc30uCisKK0BjaW5kZXggbW5lbW9uaWMgc3VmZml4ZXMsIGkzODYKK0BjaW5kZXggc2l6ZXMgb3BlcmFuZHMsIGkzODYKK0BjaW5kZXggaTM4NiBzaXplIHN1ZmZpeGVzCitAaXRlbQorSW4gQVQmVCBzeW50YXggdGhlIHNpemUgb2YgbWVtb3J5IG9wZXJhbmRzIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbGFzdAorY2hhcmFjdGVyIG9mIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYy4gIE1uZW1vbmljIHN1ZmZpeGVzIG9mIEBzYW1we2J9LAorQHNhbXB7d30sIGFuZCBAc2FtcHtsfSBzcGVjaWZ5IGJ5dGUgKDgtYml0KSwgd29yZCAoMTYtYml0KSwgYW5kIGxvbmcKKygzMi1iaXQpIG1lbW9yeSByZWZlcmVuY2VzLiAgSW50ZWwgc3ludGF4IGFjY29tcGxpc2hlcyB0aGlzIGJ5IHByZWZpeGluZworbWVtb3J5IG9wZXJhbmRzIChAZW1waHtub3R9IHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pY3MpIHdpdGggQHNhbXB7Ynl0ZQorcHRyfSwgQHNhbXB7d29yZCBwdHJ9LCBhbmQgQHNhbXB7ZHdvcmQgcHRyfS4gIFRodXMsIEludGVsIEBzYW1we21vdiBhbCwKK2J5dGUgcHRyIEB2YXJ7Zm9vfX0gaXMgQHNhbXB7bW92YiBAdmFye2Zvb30sICVhbH0gaW4gQVQmVCBzeW50YXguCisKK0BjaW5kZXggcmV0dXJuIGluc3RydWN0aW9ucywgaTM4NgorQGNpbmRleCBpMzg2IGp1bXAsIGNhbGwsIHJldHVybgorQGl0ZW0KK0ltbWVkaWF0ZSBmb3JtIGxvbmcganVtcHMgYW5kIGNhbGxzIGFyZQorQHNhbXB7bGNhbGwvbGptcCAkQHZhcntzZWN0aW9ufSwgJEB2YXJ7b2Zmc2V0fX0gaW4gQVQmVCBzeW50YXg7IHRoZQorSW50ZWwgc3ludGF4IGlzCitAc2FtcHtjYWxsL2ptcCBmYXIgQHZhcntzZWN0aW9ufTpAdmFye29mZnNldH19LiAgQWxzbywgdGhlIGZhciByZXR1cm4KK2luc3RydWN0aW9uCitpcyBAc2FtcHtscmV0ICRAdmFye3N0YWNrLWFkanVzdH19IGluIEFUJlQgc3ludGF4OyBJbnRlbCBzeW50YXggaXMKK0BzYW1we3JldCBmYXIgQHZhcntzdGFjay1hZGp1c3R9fS4KKworQGNpbmRleCBzZWN0aW9ucywgaTM4NgorQGNpbmRleCBpMzg2IHNlY3Rpb25zCitAaXRlbQorVGhlIEFUJlQgYXNzZW1ibGVyIGRvZXMgbm90IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2VjdGlvbgorcHJvZ3JhbXMuICBVbml4IHN0eWxlIHN5c3RlbXMgZXhwZWN0IGFsbCBwcm9ncmFtcyB0byBiZSBzaW5nbGUgc2VjdGlvbnMuCitAZW5kIGl0ZW1pemUKKworQG5vZGUgaTM4Ni1NbmVtb25pY3MKK0BzZWN0aW9uIEluc3RydWN0aW9uIE5hbWluZworCitAY2luZGV4IGkzODYgaW5zdHJ1Y3Rpb24gbmFtaW5nCitAY2luZGV4IGluc3RydWN0aW9uIG5hbWluZywgaTM4NgorSW5zdHJ1Y3Rpb24gbW5lbW9uaWNzIGFyZSBzdWZmaXhlZCB3aXRoIG9uZSBjaGFyYWN0ZXIgbW9kaWZpZXJzIHdoaWNoCitzcGVjaWZ5IHRoZSBzaXplIG9mIG9wZXJhbmRzLiAgVGhlIGxldHRlcnMgQHNhbXB7Yn0sIEBzYW1we3d9LCBhbmQKK0BzYW1we2x9IHNwZWNpZnkgYnl0ZSwgd29yZCwgYW5kIGxvbmcgb3BlcmFuZHMuICBJZiBubyBzdWZmaXggaXMKK3NwZWNpZmllZCBieSBhbiBpbnN0cnVjdGlvbiB0aGVuIEBjb2Rle0B2YWx1ZXtBU319IHRyaWVzIHRvIGZpbGwgaW4gdGhlCittaXNzaW5nIHN1ZmZpeCBiYXNlZCBvbiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgb3BlcmFuZCAodGhlIGxhc3Qgb25lCitieSBjb252ZW50aW9uKS4gIFRodXMsIEBzYW1we21vdiAlYXgsICVieH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3Z3CislYXgsICVieH07IGFsc28sIEBzYW1we21vdiAkMSwgJWJ4fSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdncgJDEsCislYnh9LiAgTm90ZSB0aGF0IHRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIEFUJlQgVW5peCBhc3NlbWJsZXIgd2hpY2gKK2Fzc3VtZXMgdGhhdCBhIG1pc3NpbmcgbW5lbW9uaWMgc3VmZml4IGltcGxpZXMgbG9uZyBvcGVyYW5kIHNpemUuICAoVGhpcworaW5jb21wYXRpYmlsaXR5IGRvZXMgbm90IGFmZmVjdCBjb21waWxlciBvdXRwdXQgc2luY2UgY29tcGlsZXJzIGFsd2F5cworZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBtbmVtb25pYyBzdWZmaXguKQorCitBbG1vc3QgYWxsIGluc3RydWN0aW9ucyBoYXZlIHRoZSBzYW1lIG5hbWVzIGluIEFUJlQgYW5kIEludGVsIGZvcm1hdC4KK1RoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLiAgVGhlIHNpZ24gZXh0ZW5kIGFuZCB6ZXJvIGV4dGVuZAoraW5zdHJ1Y3Rpb25zIG5lZWQgdHdvIHNpemVzIHRvIHNwZWNpZnkgdGhlbS4gIFRoZXkgbmVlZCBhIHNpemUgdG8KK3NpZ24vemVybyBleHRlbmQgQGVtcGh7ZnJvbX0gYW5kIGEgc2l6ZSB0byB6ZXJvIGV4dGVuZCBAZW1waHt0b30uICBUaGlzCitpcyBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdHdvIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIGluIEFUJlQKK3N5bnRheC4gIEJhc2UgbmFtZXMgZm9yIHNpZ24gZXh0ZW5kIGFuZCB6ZXJvIGV4dGVuZCBhcmUKK0BzYW1we21vdnNAZG90c3t9fSBhbmQgQHNhbXB7bW92ekBkb3Rze319IGluIEFUJlQgc3ludGF4IChAc2FtcHttb3ZzeH0KK2FuZCBAc2FtcHttb3Z6eH0gaW4gSW50ZWwgc3ludGF4KS4gIFRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcworYXJlIHRhY2tlZCBvbiB0byB0aGlzIGJhc2UgbmFtZSwgdGhlIEBlbXBoe2Zyb219IHN1ZmZpeCBiZWZvcmUgdGhlCitAZW1waHt0b30gc3VmZml4LiAgVGh1cywgQHNhbXB7bW92c2JsICVhbCwgJWVkeH0gaXMgQVQmVCBzeW50YXggZm9yCitgYG1vdmUgc2lnbiBleHRlbmQgQGVtcGh7ZnJvbX0gJWFsIEBlbXBoe3RvfSAlZWR4LicnICBQb3NzaWJsZSBzdWZmaXhlcywKK3RodXMsIGFyZSBAc2FtcHtibH0gKGZyb20gYnl0ZSB0byBsb25nKSwgQHNhbXB7Ynd9IChmcm9tIGJ5dGUgdG8gd29yZCksCithbmQgQHNhbXB7d2x9IChmcm9tIHdvcmQgdG8gbG9uZykuCisKK0BjaW5kZXggY29udmVyc2lvbiBpbnN0cnVjdGlvbnMsIGkzODYKK0BjaW5kZXggaTM4NiBjb252ZXJzaW9uIGluc3RydWN0aW9ucworVGhlIEludGVsLXN5bnRheCBjb252ZXJzaW9uIGluc3RydWN0aW9ucworCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorQHNhbXB7Y2J3fSAtLS0gc2lnbi1leHRlbmQgYnl0ZSBpbiBAc2FtcHslYWx9IHRvIHdvcmQgaW4gQHNhbXB7JWF4fSwKKworQGl0ZW0KK0BzYW1we2N3ZGV9IC0tLSBzaWduLWV4dGVuZCB3b3JkIGluIEBzYW1weyVheH0gdG8gbG9uZyBpbiBAc2FtcHslZWF4fSwKKworQGl0ZW0KK0BzYW1we2N3ZH0gLS0tIHNpZ24tZXh0ZW5kIHdvcmQgaW4gQHNhbXB7JWF4fSB0byBsb25nIGluIEBzYW1weyVkeDolYXh9LAorCitAaXRlbQorQHNhbXB7Y2RxfSAtLS0gc2lnbi1leHRlbmQgZHdvcmQgaW4gQHNhbXB7JWVheH0gdG8gcXVhZCBpbiBAc2FtcHslZWR4OiVlYXh9LAorQGVuZCBpdGVtaXplCisKK0Bub2luZGVudAorYXJlIGNhbGxlZCBAc2FtcHtjYnR3fSwgQHNhbXB7Y3d0bH0sIEBzYW1we2N3dGR9LCBhbmQgQHNhbXB7Y2x0ZH0gaW4KK0FUJlQgbmFtaW5nLiAgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyBlaXRoZXIgbmFtaW5nIGZvciB0aGVzZSBpbnN0cnVjdGlvbnMuCisKK0BjaW5kZXgganVtcCBpbnN0cnVjdGlvbnMsIGkzODYKK0BjaW5kZXggY2FsbCBpbnN0cnVjdGlvbnMsIGkzODYKK0ZhciBjYWxsL2p1bXAgaW5zdHJ1Y3Rpb25zIGFyZSBAc2FtcHtsY2FsbH0gYW5kIEBzYW1we2xqbXB9IGluCitBVCZUIHN5bnRheCwgYnV0IGFyZSBAc2FtcHtjYWxsIGZhcn0gYW5kIEBzYW1we2p1bXAgZmFyfSBpbiBJbnRlbAorY29udmVudGlvbi4KKworQG5vZGUgaTM4Ni1SZWdzCitAc2VjdGlvbiBSZWdpc3RlciBOYW1pbmcKKworQGNpbmRleCBpMzg2IHJlZ2lzdGVycworQGNpbmRleCByZWdpc3RlcnMsIGkzODYKK1JlZ2lzdGVyIG9wZXJhbmRzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCBAc2FtcHslfS4gIFRoZSA4MDM4NiByZWdpc3RlcnMKK2NvbnNpc3Qgb2YKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK3RoZSA4IDMyLWJpdCByZWdpc3RlcnMgQHNhbXB7JWVheH0gKHRoZSBhY2N1bXVsYXRvciksIEBzYW1weyVlYnh9LAorQHNhbXB7JWVjeH0sIEBzYW1weyVlZHh9LCBAc2FtcHslZWRpfSwgQHNhbXB7JWVzaX0sIEBzYW1weyVlYnB9ICh0aGUKK2ZyYW1lIHBvaW50ZXIpLCBhbmQgQHNhbXB7JWVzcH0gKHRoZSBzdGFjayBwb2ludGVyKS4KKworQGl0ZW0KK3RoZSA4IDE2LWJpdCBsb3ctZW5kcyBvZiB0aGVzZTogQHNhbXB7JWF4fSwgQHNhbXB7JWJ4fSwgQHNhbXB7JWN4fSwKK0BzYW1weyVkeH0sIEBzYW1weyVkaX0sIEBzYW1weyVzaX0sIEBzYW1weyVicH0sIGFuZCBAc2FtcHslc3B9LgorCitAaXRlbQordGhlIDggOC1iaXQgcmVnaXN0ZXJzOiBAc2FtcHslYWh9LCBAc2FtcHslYWx9LCBAc2FtcHslYmh9LAorQHNhbXB7JWJsfSwgQHNhbXB7JWNofSwgQHNhbXB7JWNsfSwgQHNhbXB7JWRofSwgYW5kIEBzYW1weyVkbH0gKFRoZXNlCithcmUgdGhlIGhpZ2gtYnl0ZXMgYW5kIGxvdy1ieXRlcyBvZiBAc2FtcHslYXh9LCBAc2FtcHslYnh9LAorQHNhbXB7JWN4fSwgYW5kIEBzYW1weyVkeH0pCisKK0BpdGVtCit0aGUgNiBzZWN0aW9uIHJlZ2lzdGVycyBAc2FtcHslY3N9IChjb2RlIHNlY3Rpb24pLCBAc2FtcHslZHN9CisoZGF0YSBzZWN0aW9uKSwgQHNhbXB7JXNzfSAoc3RhY2sgc2VjdGlvbiksIEBzYW1weyVlc30sIEBzYW1weyVmc30sCithbmQgQHNhbXB7JWdzfS4KKworQGl0ZW0KK3RoZSAzIHByb2Nlc3NvciBjb250cm9sIHJlZ2lzdGVycyBAc2FtcHslY3IwfSwgQHNhbXB7JWNyMn0sIGFuZAorQHNhbXB7JWNyM30uCisKK0BpdGVtCit0aGUgNiBkZWJ1ZyByZWdpc3RlcnMgQHNhbXB7JWRiMH0sIEBzYW1weyVkYjF9LCBAc2FtcHslZGIyfSwKK0BzYW1weyVkYjN9LCBAc2FtcHslZGI2fSwgYW5kIEBzYW1weyVkYjd9LgorCitAaXRlbQordGhlIDIgdGVzdCByZWdpc3RlcnMgQHNhbXB7JXRyNn0gYW5kIEBzYW1weyV0cjd9LgorCitAaXRlbQordGhlIDggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc3RhY2sgQHNhbXB7JXN0fSBvciBlcXVpdmFsZW50bHkKK0BzYW1weyVzdCgwKX0sIEBzYW1weyVzdCgxKX0sIEBzYW1weyVzdCgyKX0sIEBzYW1weyVzdCgzKX0sCitAc2FtcHslc3QoNCl9LCBAc2FtcHslc3QoNSl9LCBAc2FtcHslc3QoNil9LCBhbmQgQHNhbXB7JXN0KDcpfS4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBpMzg2LVByZWZpeGVzCitAc2VjdGlvbiBJbnN0cnVjdGlvbiBQcmVmaXhlcworCitAY2luZGV4IGkzODYgaW5zdHJ1Y3Rpb24gcHJlZml4ZXMKK0BjaW5kZXggaW5zdHJ1Y3Rpb24gcHJlZml4ZXMsIGkzODYKK0BjaW5kZXggcHJlZml4ZXMsIGkzODYKK0luc3RydWN0aW9uIHByZWZpeGVzIGFyZSB1c2VkIHRvIG1vZGlmeSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgVGhleQorYXJlIHVzZWQgdG8gcmVwZWF0IHN0cmluZyBpbnN0cnVjdGlvbnMsIHRvIHByb3ZpZGUgc2VjdGlvbiBvdmVycmlkZXMsIHRvCitwZXJmb3JtIGJ1cyBsb2NrIG9wZXJhdGlvbnMsIGFuZCB0byBjaGFuZ2Ugb3BlcmFuZCBhbmQgYWRkcmVzcyBzaXplcy4KKyhNb3N0IGluc3RydWN0aW9ucyB0aGF0IG5vcm1hbGx5IG9wZXJhdGUgb24gMzItYml0IG9wZXJhbmRzIHdpbGwgdXNlCisxNi1iaXQgb3BlcmFuZHMgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBhbiBgYG9wZXJhbmQgc2l6ZScnIHByZWZpeC4pCitJbnN0cnVjdGlvbiBwcmVmaXhlcyBhcmUgYmVzdCB3cml0dGVuIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGluc3RydWN0aW9uCit0aGV5IGFjdCB1cG9uLiBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we3NjYXN9IChzY2FuIHN0cmluZykgaW5zdHJ1Y3Rpb24gaXMKK3JlcGVhdGVkIHdpdGg6CisKK0BzbWFsbGV4YW1wbGUKKyAgICAgICAgcmVwbmUgc2NhcyAlZXM6KCVlZGkpLCVhbAorQGVuZCBzbWFsbGV4YW1wbGUKKworWW91IG1heSBhbHNvIHBsYWNlIHByZWZpeGVzIG9uIHRoZSBsaW5lcyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlCitpbnN0cnVjdGlvbiwgYnV0IHRoaXMgY2lyY3VtdmVudHMgY2hlY2tzIHRoYXQgQGNvZGV7QHZhbHVle0FTfX0gZG9lcword2l0aCBwcmVmaXhlcywgYW5kIHdpbGwgbm90IHdvcmsgd2l0aCBhbGwgcHJlZml4ZXMuCisKK0hlcmUgaXMgYSBsaXN0IG9mIGluc3RydWN0aW9uIHByZWZpeGVzOgorCitAY2luZGV4IHNlY3Rpb24gb3ZlcnJpZGUgcHJlZml4ZXMsIGkzODYKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitTZWN0aW9uIG92ZXJyaWRlIHByZWZpeGVzIEBzYW1we2NzfSwgQHNhbXB7ZHN9LCBAc2FtcHtzc30sIEBzYW1we2VzfSwKK0BzYW1we2ZzfSwgQHNhbXB7Z3N9LiAgVGhlc2UgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgc3BlY2lmeWluZwordXNpbmcgdGhlIEB2YXJ7c2VjdGlvbn06QHZhcnttZW1vcnktb3BlcmFuZH0gZm9ybSBmb3IgbWVtb3J5IHJlZmVyZW5jZXMuCisKK0BjaW5kZXggc2l6ZSBwcmVmaXhlcywgaTM4NgorQGl0ZW0KK09wZXJhbmQvQWRkcmVzcyBzaXplIHByZWZpeGVzIEBzYW1we2RhdGExNn0gYW5kIEBzYW1we2FkZHIxNn0KK2NoYW5nZSAzMi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzIGludG8gMTYtYml0IG9wZXJhbmRzL2FkZHJlc3NlcywKK3doaWxlIEBzYW1we2RhdGEzMn0gYW5kIEBzYW1we2FkZHIzMn0gY2hhbmdlIDE2LWJpdCBvbmVzIChpbiBhCitAY29kZXsuY29kZTE2fSBzZWN0aW9uKSBpbnRvIDMyLWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMuICBUaGVzZSBwcmVmaXhlcworQGVtcGh7bXVzdH0gYXBwZWFyIG9uIHRoZSBzYW1lIGxpbmUgb2YgY29kZSBhcyB0aGUgaW5zdHJ1Y3Rpb24gdGhleQorbW9kaWZ5LiBGb3IgZXhhbXBsZSwgaW4gYSAxNi1iaXQgQGNvZGV7LmNvZGUxNn0gc2VjdGlvbiwgeW91IG1pZ2h0Cit3cml0ZToKKworQHNtYWxsZXhhbXBsZQorICAgICAgICBhZGRyMzIgam1wbCAqKCVlYngpCitAZW5kIHNtYWxsZXhhbXBsZQorCitAY2luZGV4IGJ1cyBsb2NrIHByZWZpeGVzLCBpMzg2CitAY2luZGV4IGluaGliaXRpbmcgaW50ZXJydXB0cywgaTM4NgorQGl0ZW0KK1RoZSBidXMgbG9jayBwcmVmaXggQHNhbXB7bG9ja30gaW5oaWJpdHMgaW50ZXJydXB0cyBkdXJpbmcgZXhlY3V0aW9uIG9mCit0aGUgaW5zdHJ1Y3Rpb24gaXQgcHJlY2VkZXMuICAoVGhpcyBpcyBvbmx5IHZhbGlkIHdpdGggY2VydGFpbgoraW5zdHJ1Y3Rpb25zOyBzZWUgYSA4MDM4NiBtYW51YWwgZm9yIGRldGFpbHMpLgorCitAY2luZGV4IGNvcHJvY2Vzc29yIHdhaXQsIGkzODYKK0BpdGVtCitUaGUgd2FpdCBmb3IgY29wcm9jZXNzb3IgcHJlZml4IEBzYW1we3dhaXR9IHdhaXRzIGZvciB0aGUgY29wcm9jZXNzb3IgdG8KK2NvbXBsZXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgYmUgbmVlZGVkIGZvciB0aGUKKzgwMzg2LzgwMzg3IGNvbWJpbmF0aW9uLgorCitAY2luZGV4IHJlcGVhdCBwcmVmaXhlcywgaTM4NgorQGl0ZW0KK1RoZSBAc2FtcHtyZXB9LCBAc2FtcHtyZXBlfSwgYW5kIEBzYW1we3JlcG5lfSBwcmVmaXhlcyBhcmUgYWRkZWQKK3RvIHN0cmluZyBpbnN0cnVjdGlvbnMgdG8gbWFrZSB0aGVtIHJlcGVhdCBAc2FtcHslZWN4fSB0aW1lcyAoQHNhbXB7JWN4fQordGltZXMgaWYgdGhlIGN1cnJlbnQgYWRkcmVzcyBzaXplIGlzIDE2LWJpdHMpLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIGkzODYtTWVtb3J5CitAc2VjdGlvbiBNZW1vcnkgUmVmZXJlbmNlcworCitAY2luZGV4IGkzODYgbWVtb3J5IHJlZmVyZW5jZXMKK0BjaW5kZXggbWVtb3J5IHJlZmVyZW5jZXMsIGkzODYKK0FuIEludGVsIHN5bnRheCBpbmRpcmVjdCBtZW1vcnkgcmVmZXJlbmNlIG9mIHRoZSBmb3JtCisKK0BzbWFsbGV4YW1wbGUKK0B2YXJ7c2VjdGlvbn06W0B2YXJ7YmFzZX0gKyBAdmFye2luZGV4fSpAdmFye3NjYWxlfSArIEB2YXJ7ZGlzcH1dCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK2lzIHRyYW5zbGF0ZWQgaW50byB0aGUgQVQmVCBzeW50YXgKKworQHNtYWxsZXhhbXBsZQorQHZhcntzZWN0aW9ufTpAdmFye2Rpc3B9KEB2YXJ7YmFzZX0sIEB2YXJ7aW5kZXh9LCBAdmFye3NjYWxlfSkKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAord2hlcmUgQHZhcntiYXNlfSBhbmQgQHZhcntpbmRleH0gYXJlIHRoZSBvcHRpb25hbCAzMi1iaXQgYmFzZSBhbmQKK2luZGV4IHJlZ2lzdGVycywgQHZhcntkaXNwfSBpcyB0aGUgb3B0aW9uYWwgZGlzcGxhY2VtZW50LCBhbmQKK0B2YXJ7c2NhbGV9LCB0YWtpbmcgdGhlIHZhbHVlcyAxLCAyLCA0LCBhbmQgOCwgbXVsdGlwbGllcyBAdmFye2luZGV4fQordG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBvcGVyYW5kLiAgSWYgbm8gQHZhcntzY2FsZX0gaXMKK3NwZWNpZmllZCwgQHZhcntzY2FsZX0gaXMgdGFrZW4gdG8gYmUgMS4gIEB2YXJ7c2VjdGlvbn0gc3BlY2lmaWVzIHRoZQorb3B0aW9uYWwgc2VjdGlvbiByZWdpc3RlciBmb3IgdGhlIG1lbW9yeSBvcGVyYW5kLCBhbmQgbWF5IG92ZXJyaWRlIHRoZQorZGVmYXVsdCBzZWN0aW9uIHJlZ2lzdGVyIChzZWUgYSA4MDM4NiBtYW51YWwgZm9yIHNlY3Rpb24gcmVnaXN0ZXIKK2RlZmF1bHRzKS4gTm90ZSB0aGF0IHNlY3Rpb24gb3ZlcnJpZGVzIGluIEFUJlQgc3ludGF4IEBlbXBoe211c3R9CitiZSBwcmVjZWRlZCBieSBhIEBzYW1weyV9LiAgSWYgeW91IHNwZWNpZnkgYSBzZWN0aW9uIG92ZXJyaWRlIHdoaWNoCitjb2luY2lkZXMgd2l0aCB0aGUgZGVmYXVsdCBzZWN0aW9uIHJlZ2lzdGVyLCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIEBlbXBoe25vdH0KK291dHB1dCBhbnkgc2VjdGlvbiByZWdpc3RlciBvdmVycmlkZSBwcmVmaXhlcyB0byBhc3NlbWJsZSB0aGUgZ2l2ZW4KK2luc3RydWN0aW9uLiAgVGh1cywgc2VjdGlvbiBvdmVycmlkZXMgY2FuIGJlIHNwZWNpZmllZCB0byBlbXBoYXNpemUgd2hpY2gKK3NlY3Rpb24gcmVnaXN0ZXIgaXMgdXNlZCBmb3IgYSBnaXZlbiBtZW1vcnkgb3BlcmFuZC4KKworSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBJbnRlbCBhbmQgQVQmVCBzdHlsZSBtZW1vcnkgcmVmZXJlbmNlczoKKworQHRhYmxlIEBhc2lzCitAaXRlbSBBVCZUOiBAc2FtcHstNCglZWJwKX0sIEludGVsOiAgQHNhbXB7W2VicCAtIDRdfQorQHZhcntiYXNlfSBpcyBAc2FtcHslZWJwfTsgQHZhcntkaXNwfSBpcyBAc2FtcHstNH0uIEB2YXJ7c2VjdGlvbn0gaXMKK21pc3NpbmcsIGFuZCB0aGUgZGVmYXVsdCBzZWN0aW9uIGlzIHVzZWQgKEBzYW1weyVzc30gZm9yIGFkZHJlc3Npbmcgd2l0aAorQHNhbXB7JWVicH0gYXMgdGhlIGJhc2UgcmVnaXN0ZXIpLiAgQHZhcntpbmRleH0sIEB2YXJ7c2NhbGV9IGFyZSBib3RoIG1pc3NpbmcuCisKK0BpdGVtIEFUJlQ6IEBzYW1we2ZvbygsJWVheCw0KX0sIEludGVsOiBAc2FtcHtbZm9vICsgZWF4KjRdfQorQHZhcntpbmRleH0gaXMgQHNhbXB7JWVheH0gKHNjYWxlZCBieSBhIEB2YXJ7c2NhbGV9IDQpOyBAdmFye2Rpc3B9IGlzCitAc2FtcHtmb299LiAgQWxsIG90aGVyIGZpZWxkcyBhcmUgbWlzc2luZy4gIFRoZSBzZWN0aW9uIHJlZ2lzdGVyIGhlcmUKK2RlZmF1bHRzIHRvIEBzYW1weyVkc30uCisKK0BpdGVtIEFUJlQ6IEBzYW1we2ZvbygsMSl9OyBJbnRlbCBAc2FtcHtbZm9vXX0KK1RoaXMgdXNlcyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSBAc2FtcHtmb299IGFzIGEgbWVtb3J5IG9wZXJhbmQuCitOb3RlIHRoYXQgQHZhcntiYXNlfSBhbmQgQHZhcntpbmRleH0gYXJlIGJvdGggbWlzc2luZywgYnV0IHRoZXJlIGlzIG9ubHkKK0BlbXBoe29uZX0gQHNhbXB7LH0uICBUaGlzIGlzIGEgc3ludGFjdGljIGV4Y2VwdGlvbi4KKworQGl0ZW0gQVQmVDogQHNhbXB7JWdzOmZvb307IEludGVsIEBzYW1we2dzOmZvb30KK1RoaXMgc2VsZWN0cyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIEBzYW1we2Zvb30gd2l0aCBzZWN0aW9uCityZWdpc3RlciBAdmFye3NlY3Rpb259IGJlaW5nIEBzYW1weyVnc30uCitAZW5kIHRhYmxlCisKK0Fic29sdXRlIChhcyBvcHBvc2VkIHRvIFBDIHJlbGF0aXZlKSBjYWxsIGFuZCBqdW1wIG9wZXJhbmRzIG11c3QgYmUKK3ByZWZpeGVkIHdpdGggQHNhbXB7Kn0uICBJZiBubyBAc2FtcHsqfSBpcyBzcGVjaWZpZWQsIEBjb2Rle0B2YWx1ZXtBU319CithbHdheXMgY2hvb3NlcyBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIGZvciBqdW1wL2NhbGwgbGFiZWxzLgorCitBbnkgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYSBtZW1vcnkgb3BlcmFuZCwgYnV0IG5vIHJlZ2lzdGVyIG9wZXJhbmQsCitAZW1waHttdXN0fSBzcGVjaWZ5IGl0cyBzaXplIChieXRlLCB3b3JkLCBvciBsb25nKSB3aXRoIGFuIGluc3RydWN0aW9uCittbmVtb25pYyBzdWZmaXggKEBzYW1we2J9LCBAc2FtcHt3fSwgb3IgQHNhbXB7bH0sIHJlc3BlY3RpdmVseSkuCisKK0Bub2RlIGkzODYtanVtcHMKK0BzZWN0aW9uIEhhbmRsaW5nIG9mIEp1bXAgSW5zdHJ1Y3Rpb25zCisKK0BjaW5kZXgganVtcCBvcHRpbWl6YXRpb24sIGkzODYKK0BjaW5kZXggaTM4NiBqdW1wIG9wdGltaXphdGlvbgorSnVtcCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBvcHRpbWl6ZWQgdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZQorZGlzcGxhY2VtZW50cy4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIGJ5dGUgKDgtYml0KSBkaXNwbGFjZW1lbnQKK2p1bXBzIHdoZW5ldmVyIHRoZSB0YXJnZXQgaXMgc3VmZmljaWVudGx5IGNsb3NlLiAgSWYgYSBieXRlIGRpc3BsYWNlbWVudAoraXMgaW5zdWZmaWNpZW50IGEgbG9uZyAoMzItYml0KSBkaXNwbGFjZW1lbnQgaXMgdXNlZC4gIFdlIGRvIG5vdCBzdXBwb3J0Cit3b3JkICgxNi1iaXQpIGRpc3BsYWNlbWVudCBqdW1wcyBpbiAzMi1iaXQgbW9kZSAoaS5lLiBwcmVmaXhpbmcgdGhlIGp1bXAKK2luc3RydWN0aW9uIHdpdGggdGhlIEBzYW1we2RhdGExNn0gaW5zdHJ1Y3Rpb24gcHJlZml4KSwgc2luY2UgdGhlIDgwMzg2CitpbnNpc3RzIHVwb24gbWFza2luZyBAc2FtcHslZWlwfSB0byAxNiBiaXRzIGFmdGVyIHRoZSB3b3JkIGRpc3BsYWNlbWVudAoraXMgYWRkZWQuCisKK05vdGUgdGhhdCB0aGUgQHNhbXB7amN4en0sIEBzYW1we2plY3h6fSwgQHNhbXB7bG9vcH0sIEBzYW1we2xvb3B6fSwKK0BzYW1we2xvb3BlfSwgQHNhbXB7bG9vcG56fSBhbmQgQHNhbXB7bG9vcG5lfSBpbnN0cnVjdGlvbnMgb25seSBjb21lIGluIGJ5dGUKK2Rpc3BsYWNlbWVudHMsIHNvIHRoYXQgaWYgeW91IHVzZSB0aGVzZSBpbnN0cnVjdGlvbnMgKEBjb2Rle0B2YWx1ZXtHQ0N9fSBkb2VzCitub3QgdXNlIHRoZW0pIHlvdSBtYXkgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgKGFuZCBpbmNvcnJlY3QgY29kZSkuICBUaGUgQVQmVAorODAzODYgYXNzZW1ibGVyIHRyaWVzIHRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IGV4cGFuZGluZyBAc2FtcHtqY3h6IGZvb30KK3RvCisKK0BzbWFsbGV4YW1wbGUKKyAgICAgICAgIGpjeHogY3hfemVybworICAgICAgICAgam1wIGN4X25vbnplcm8KK2N4X3plcm86IGptcCBmb28KK2N4X25vbnplcm86CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9kZSBpMzg2LUZsb2F0CitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitAY2luZGV4IGkzODYgZmxvYXRpbmcgcG9pbnQKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIGkzODYKK0FsbCA4MDM4NyBmbG9hdGluZyBwb2ludCB0eXBlcyBleGNlcHQgcGFja2VkIEJDRCBhcmUgc3VwcG9ydGVkLgorKEJDRCBzdXBwb3J0IG1heSBiZSBhZGRlZCB3aXRob3V0IG11Y2ggZGlmZmljdWx0eSkuICBUaGVzZSBkYXRhCit0eXBlcyBhcmUgMTYtLCAzMi0sIGFuZCA2NC0gYml0IGludGVnZXJzLCBhbmQgc2luZ2xlICgzMi1iaXQpLAorZG91YmxlICg2NC1iaXQpLCBhbmQgZXh0ZW5kZWQgKDgwLWJpdCkgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LgorRWFjaCBzdXBwb3J0ZWQgdHlwZSBoYXMgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGFuZCBhIGNvbnN0cnVjdG9yCithc3NvY2lhdGVkIHdpdGggaXQuICBJbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBzcGVjaWZ5IHRoZSBvcGVyYW5kJ3MKK2RhdGEgdHlwZS4gIENvbnN0cnVjdG9ycyBidWlsZCB0aGVzZSBkYXRhIHR5cGVzIGludG8gbWVtb3J5LgorCitAY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIGkzODYKK0BjaW5kZXggQGNvZGV7c2luZ2xlfSBkaXJlY3RpdmUsIGkzODYKK0BjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIGkzODYKK0BjaW5kZXggQGNvZGV7dGZsb2F0fSBkaXJlY3RpdmUsIGkzODYKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitGbG9hdGluZyBwb2ludCBjb25zdHJ1Y3RvcnMgYXJlIEBzYW1wey5mbG9hdH0gb3IgQHNhbXB7LnNpbmdsZX0sCitAc2FtcHsuZG91YmxlfSwgYW5kIEBzYW1wey50ZmxvYXR9IGZvciAzMi0sIDY0LSwgYW5kIDgwLWJpdCBmb3JtYXRzLgorVGhlc2UgY29ycmVzcG9uZCB0byBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBAc2FtcHtzfSwgQHNhbXB7bH0sCithbmQgQHNhbXB7dH0uIEBzYW1we3R9IHN0YW5kcyBmb3IgODAtYml0ICh0ZW4gYnl0ZSkgcmVhbC4gIFRoZSA4MDM4Nworb25seSBzdXBwb3J0cyB0aGlzIGZvcm1hdCB2aWEgdGhlIEBzYW1we2ZsZHR9IChsb2FkIDgwLWJpdCByZWFsIHRvIHN0YWNrCit0b3ApIGFuZCBAc2FtcHtmc3RwdH0gKHN0b3JlIDgwLWJpdCByZWFsIGFuZCBwb3Agc3RhY2spIGluc3RydWN0aW9ucy4KKworQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUsIGkzODYKK0BjaW5kZXggQGNvZGV7bG9uZ30gZGlyZWN0aXZlLCBpMzg2CitAY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBpMzg2CitAY2luZGV4IEBjb2Rle3F1YWR9IGRpcmVjdGl2ZSwgaTM4NgorQGl0ZW0KK0ludGVnZXIgY29uc3RydWN0b3JzIGFyZSBAc2FtcHsud29yZH0sIEBzYW1wey5sb25nfSBvciBAc2FtcHsuaW50fSwgYW5kCitAc2FtcHsucXVhZH0gZm9yIHRoZSAxNi0sIDMyLSwgYW5kIDY0LWJpdCBpbnRlZ2VyIGZvcm1hdHMuICBUaGUKK2NvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgYXJlIEBzYW1we3N9IChzaW5nbGUpLAorQHNhbXB7bH0gKGxvbmcpLCBhbmQgQHNhbXB7cX0gKHF1YWQpLiAgQXMgd2l0aCB0aGUgODAtYml0IHJlYWwgZm9ybWF0LAordGhlIDY0LWJpdCBAc2FtcHtxfSBmb3JtYXQgaXMgb25seSBwcmVzZW50IGluIHRoZSBAc2FtcHtmaWxkcX0gKGxvYWQKK3F1YWQgaW50ZWdlciB0byBzdGFjayB0b3ApIGFuZCBAc2FtcHtmaXN0cHF9IChzdG9yZSBxdWFkIGludGVnZXIgYW5kIHBvcAorc3RhY2spIGluc3RydWN0aW9ucy4KK0BlbmQgaXRlbWl6ZQorCitSZWdpc3RlciB0byByZWdpc3RlciBvcGVyYXRpb25zIHNob3VsZCBub3QgdXNlIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzLgorQHNhbXB7ZnN0bCAlc3QsICVzdCgxKX0gd2lsbCBnaXZlIGEgd2FybmluZywgYW5kIGJlIGFzc2VtYmxlZCBhcyBpZiB5b3UKK3dyb3RlIEBzYW1we2ZzdCAlc3QsICVzdCgxKX0sIHNpbmNlIGFsbCByZWdpc3RlciB0byByZWdpc3RlciBvcGVyYXRpb25zCit1c2UgODAtYml0IGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzLiAoQ29udHJhc3QgdGhpcyB3aXRoIEBzYW1we2ZzdGwgJXN0LCBtZW19LAord2hpY2ggY29udmVydHMgQHNhbXB7JXN0fSBmcm9tIDgwLWJpdCB0byA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LAordGhlbiBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgNCBieXRlIGxvY2F0aW9uIEBzYW1we21lbX0pCisKK0Bub2RlIGkzODYtU0lNRAorQHNlY3Rpb24gSW50ZWwncyBNTVggYW5kIEFNRCdzIDNETm93ISBTSU1EIE9wZXJhdGlvbnMKKworQGNpbmRleCBNTVgsIGkzODYKK0BjaW5kZXggM0ROb3chLCBpMzg2CitAY2luZGV4IFNJTUQsIGkzODYKKworQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgSW50ZWwncyBNTVggaW5zdHJ1Y3Rpb24gc2V0IChTSU1ECitpbnN0cnVjdGlvbnMgZm9yIGludGVnZXIgZGF0YSksIGF2YWlsYWJsZSBvbiBJbnRlbCdzIFBlbnRpdW0gTU1YCitwcm9jZXNzb3JzIGFuZCBQZW50aXVtIElJIHByb2Nlc3NvcnMsIEFNRCdzIEs2IGFuZCBLNi0yIHByb2Nlc3NvcnMsCitDeXJpeCcgTTIgcHJvY2Vzc29yLCBhbmQgcHJvYmFibHkgb3RoZXJzLiAgSXQgYWxzbyBzdXBwb3J0cyBBTUQncyAzRE5vdyEKK2luc3RydWN0aW9uIHNldCAoU0lNRCBpbnN0cnVjdGlvbnMgZm9yIDMyLWJpdCBmbG9hdGluZyBwb2ludCBkYXRhKQorYXZhaWxhYmxlIG9uIEFNRCdzIEs2LTIgcHJvY2Vzc29yIGFuZCBwb3NzaWJseSBvdGhlcnMgaW4gdGhlIGZ1dHVyZS4KKworQ3VycmVudGx5LCBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgZmxvYXRpbmcgcG9pbnQKK1NJTUQsIEthdG1haSAoS05JKS4KKworVGhlIGVpZ2h0IDY0LWJpdCBNTVggb3BlcmFuZHMsIGFsc28gdXNlZCBieSAzRE5vdyEsIGFyZSBjYWxsZWQgQHNhbXB7JW1tMH0sCitAc2FtcHslbW0xfSwgLi4uIEBzYW1weyVtbTd9LiAgVGhleSBjb250YWluIGVpZ2h0IDgtYml0IGludGVnZXJzLCBmb3VyCisxNi1iaXQgaW50ZWdlcnMsIHR3byAzMi1iaXQgaW50ZWdlcnMsIG9uZSA2NC1iaXQgaW50ZWdlciwgb3IgdHdvIDMyLWJpdAorZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgVGhlIE1NWCByZWdpc3RlcnMgY2Fubm90IGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZQorYXMgdGhlIGZsb2F0aW5nIHBvaW50IHN0YWNrLgorCitTZWUgSW50ZWwgYW5kIEFNRCBkb2N1bWVudGF0aW9uLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgb3BlcmFuZCBvcmRlciBpbgoraW5zdHJ1Y3Rpb25zIGlzIHJldmVyc2VkIGZyb20gdGhlIEludGVsIHN5bnRheC4KKworQG5vZGUgaTM4Ni0xNmJpdAorQHNlY3Rpb24gV3JpdGluZyAxNi1iaXQgQ29kZQorCitAY2luZGV4IGkzODYgMTYtYml0IGNvZGUKK0BjaW5kZXggMTYtYml0IGNvZGUsIGkzODYKK0BjaW5kZXggcmVhbC1tb2RlIGNvZGUsIGkzODYKK0BjaW5kZXggQGNvZGV7Y29kZTE2fSBkaXJlY3RpdmUsIGkzODYKK0BjaW5kZXggQGNvZGV7Y29kZTMyfSBkaXJlY3RpdmUsIGkzODYKK1doaWxlIEBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IHdyaXRlcyBvbmx5IGBgcHVyZScnIDMyLWJpdCBpMzg2IGNvZGUsCitpdCBhbHNvIHN1cHBvcnRzIHdyaXRpbmcgY29kZSB0byBydW4gaW4gcmVhbCBtb2RlIG9yIGluIDE2LWJpdCBwcm90ZWN0ZWQKK21vZGUgY29kZSBzZWdtZW50cy4gIFRvIGRvIHRoaXMsIHB1dCBhIEBzYW1wey5jb2RlMTZ9IGRpcmVjdGl2ZSBiZWZvcmUKK3RoZSBhc3NlbWJseSBsYW5ndWFnZSBpbnN0cnVjdGlvbnMgdG8gYmUgcnVuIGluIDE2LWJpdCBtb2RlLiAgWW91IGNhbgorc3dpdGNoIEBjb2Rle0B2YWx1ZXtBU319IGJhY2sgdG8gd3JpdGluZyBub3JtYWwgMzItYml0IGNvZGUgd2l0aCB0aGUKK0BzYW1wey5jb2RlMzJ9IGRpcmVjdGl2ZS4KKworVGhlIGNvZGUgd2hpY2ggQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGluIDE2LWJpdCBtb2RlIHdpbGwgbm90CituZWNlc3NhcmlseSBydW4gb24gYSAxNi1iaXQgcHJlLTgwMzg2IHByb2Nlc3Nvci4gIFRvIHdyaXRlIGNvZGUgdGhhdAorcnVucyBvbiBzdWNoIGEgcHJvY2Vzc29yLCB5b3UgbXVzdCByZWZyYWluIGZyb20gdXNpbmcgQGVtcGh7YW55fSAzMi1iaXQKK2NvbnN0cnVjdHMgd2hpY2ggcmVxdWlyZSBAY29kZXtAdmFsdWV7QVN9fSB0byBvdXRwdXQgYWRkcmVzcyBvciBvcGVyYW5kCitzaXplIHByZWZpeGVzLgorCitOb3RlIHRoYXQgd3JpdGluZyAxNi1iaXQgY29kZSBpbnN0cnVjdGlvbnMgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIGEKK3ByZWZpeCBvciBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggd2l0aGluIGEgMzItYml0IGNvZGUgc2VjdGlvbgorZ2VuZXJhdGVzIGRpZmZlcmVudCBtYWNoaW5lIGluc3RydWN0aW9ucyB0aGFuIHRob3NlIGdlbmVyYXRlZCBmb3IgYQorMTYtYml0IGNvZGUgc2VnbWVudC4gIEluIGEgMzItYml0IGNvZGUgc2VjdGlvbiwgdGhlIGZvbGxvd2luZyBjb2RlCitnZW5lcmF0ZXMgdGhlIG1hY2hpbmUgb3Bjb2RlIGJ5dGVzIEBzYW1wezY2IDZhIDA0fSwgd2hpY2ggcHVzaGVzIHRoZQordmFsdWUgQHNhbXB7NH0gb250byB0aGUgc3RhY2ssIGRlY3JlbWVudGluZyBAc2FtcHslZXNwfSBieSAyLgorCitAc21hbGxleGFtcGxlCisgICAgICAgIHB1c2h3ICQ0CitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgc2FtZSBjb2RlIGluIGEgMTYtYml0IGNvZGUgc2VjdGlvbiB3b3VsZCBnZW5lcmF0ZSB0aGUgbWFjaGluZQorb3Bjb2RlIGJ5dGVzIEBzYW1wezZhIDA0fSAoaWUuIHdpdGhvdXQgdGhlIG9wZXJhbmQgc2l6ZSBwcmVmaXgpLCB3aGljaAoraXMgY29ycmVjdCBzaW5jZSB0aGUgcHJvY2Vzc29yIGRlZmF1bHQgb3BlcmFuZCBzaXplIGlzIGFzc3VtZWQgdG8gYmUgMTYKK2JpdHMgaW4gYSAxNi1iaXQgY29kZSBzZWN0aW9uLgorCitAbm9kZSBpMzg2LUJ1Z3MKK0BzZWN0aW9uIEFUJlQgU3ludGF4IGJ1Z3MKKworVGhlIFVuaXhXYXJlIGFzc2VtYmxlciwgYW5kIHByb2JhYmx5IG90aGVyIEFUJlQgZGVyaXZlZCBpeDg2IFVuaXgKK2Fzc2VtYmxlcnMsIGdlbmVyYXRlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyB3aXRoIHJldmVyc2VkIHNvdXJjZQorYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVycyBpbiBjZXJ0YWluIGNhc2VzLiAgVW5mb3J0dW5hdGVseSwgZ2NjIGFuZAorcG9zc2libHkgbWFueSBvdGhlciBwcm9ncmFtcyB1c2UgdGhpcyByZXZlcnNlZCBzeW50YXgsIHNvIHdlJ3JlIHN0dWNrCit3aXRoIGl0LgorCitGb3IgZXhhbXBsZQorCitAc21hbGxleGFtcGxlCisgICAgICAgIGZzdWIgJXN0LCVzdCgzKQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAorcmVzdWx0cyBpbiBAc2FtcHslc3QoMyl9IGJlaW5nIHVwZGF0ZWQgdG8gQHNhbXB7JXN0IC0gJXN0KDMpfSByYXRoZXIKK3RoYW4gdGhlIGV4cGVjdGVkIEBzYW1weyVzdCgzKSAtICVzdH0uICBUaGlzIGhhcHBlbnMgd2l0aCBhbGwgdGhlCitub24tY29tbXV0YXRpdmUgYXJpdGhtZXRpYyBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIHdpdGggdHdvIHJlZ2lzdGVyCitvcGVyYW5kcyB3aGVyZSB0aGUgc291cmNlIHJlZ2lzdGVyIGlzIEBzYW1weyVzdH0gYW5kIHRoZSBkZXN0aW5hdGlvbgorcmVnaXN0ZXIgaXMgQHNhbXB7JXN0KGkpfS4KKworQG5vZGUgaTM4Ni1Ob3RlcworQHNlY3Rpb24gTm90ZXMKKworQGNpbmRleCBpMzg2IEBjb2Rle211bH0sIEBjb2Rle2ltdWx9IGluc3RydWN0aW9ucworQGNpbmRleCBAY29kZXttdWx9IGluc3RydWN0aW9uLCBpMzg2CitAY2luZGV4IEBjb2Rle2ltdWx9IGluc3RydWN0aW9uLCBpMzg2CitUaGVyZSBpcyBzb21lIHRyaWNrZXJ5IGNvbmNlcm5pbmcgdGhlIEBzYW1we211bH0gYW5kIEBzYW1we2ltdWx9CitpbnN0cnVjdGlvbnMgdGhhdCBkZXNlcnZlcyBtZW50aW9uLiAgVGhlIDE2LSwgMzItLCBhbmQgNjQtYml0IGV4cGFuZGluZworbXVsdGlwbGllcyAoYmFzZSBvcGNvZGUgQHNhbXB7MHhmNn07IGV4dGVuc2lvbiA0IGZvciBAc2FtcHttdWx9IGFuZCA1Citmb3IgQHNhbXB7aW11bH0pIGNhbiBiZSBvdXRwdXQgb25seSBpbiB0aGUgb25lIG9wZXJhbmQgZm9ybS4gIFRodXMsCitAc2FtcHtpbXVsICVlYngsICVlYXh9IGRvZXMgQGVtcGh7bm90fSBzZWxlY3QgdGhlIGV4cGFuZGluZyBtdWx0aXBseTsKK3RoZSBleHBhbmRpbmcgbXVsdGlwbHkgd291bGQgY2xvYmJlciB0aGUgQHNhbXB7JWVkeH0gcmVnaXN0ZXIsIGFuZCB0aGlzCit3b3VsZCBjb25mdXNlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvdXRwdXQuICBVc2UgQHNhbXB7aW11bCAlZWJ4fSB0byBnZXQgdGhlCis2NC1iaXQgcHJvZHVjdCBpbiBAc2FtcHslZWR4OiVlYXh9LgorCitXZSBoYXZlIGFkZGVkIGEgdHdvIG9wZXJhbmQgZm9ybSBvZiBAc2FtcHtpbXVsfSB3aGVuIHRoZSBmaXJzdCBvcGVyYW5kCitpcyBhbiBpbW1lZGlhdGUgbW9kZSBleHByZXNzaW9uIGFuZCB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgYSByZWdpc3Rlci4KK1RoaXMgaXMganVzdCBhIHNob3J0aGFuZCwgc28gdGhhdCwgbXVsdGlwbHlpbmcgQHNhbXB7JWVheH0gYnkgNjksIGZvcgorZXhhbXBsZSwgY2FuIGJlIGRvbmUgd2l0aCBAc2FtcHtpbXVsICQ2OSwgJWVheH0gcmF0aGVyIHRoYW4gQHNhbXB7aW11bAorJDY5LCAlZWF4LCAlZWF4fS4KKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWk5NjAudGV4aSBiL2dhcy9kb2MvYy1pOTYwLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3MDMwYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1pOTYwLnRleGkKQEAgLTAsMCArMSwyOTggQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAbm9kZSBpOTYwLURlcGVuZGVudAorQGNoYXB0ZXIgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmY2xlYXIKKworQGNpbmRleCBpOTYwIHN1cHBvcnQKK0BtZW51CisqIE9wdGlvbnMtaTk2MDo6ICAgICAgICAgICAgICAgIGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnMKKyogRmxvYXRpbmcgUG9pbnQtaTk2MDo6ICAgICAgICAgRmxvYXRpbmcgUG9pbnQKKyogRGlyZWN0aXZlcy1pOTYwOjogICAgICAgICAgICAgaTk2MCBNYWNoaW5lIERpcmVjdGl2ZXMKKyogT3Bjb2RlcyBmb3IgaTk2MDo6ICAgICAgICAgICAgaTk2MCBPcGNvZGVzCitAZW5kIG1lbnUKKworQGMgRklYTUUhIEFkZCBTeW50YXggc2VjIHdpdGggZGlzY3Vzc2lvbiBvZiBiaXRmaWVsZHMgaGVyZSwgYXQgbGVhc3Qgc28KK0BjIGxvbmcgYXMgdGhleSdyZSBub3QgdHVybmVkIG9uIGZvciBvdGhlciBtYWNoaW5lcyB0aGFuIDk2MC4KKworQG5vZGUgT3B0aW9ucy1pOTYwCisKK0BzZWN0aW9uIGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnMKKworQGNpbmRleCBpOTYwIG9wdGlvbnMKK0BjaW5kZXggb3B0aW9ucywgaTk2MAorQHRhYmxlIEBjb2RlCisKK0BjaW5kZXggaTk2MCBhcmNoaXRlY3R1cmUgb3B0aW9ucworQGNpbmRleCBhcmNoaXRlY3R1cmUgb3B0aW9ucywgaTk2MAorQGNpbmRleCBAY29kZXstQX0gb3B0aW9ucywgaTk2MAorQGl0ZW0gLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQworU2VsZWN0IHRoZSA4MDk2MCBhcmNoaXRlY3R1cmUuICBJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90IHN1cHBvcnRlZAorYnkgdGhlIHNlbGVjdGVkIGFyY2hpdGVjdHVyZSBjYXVzZSBmYXRhbCBlcnJvcnMuCisKK0BzYW1wey1BQ0F9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7LUFDQV9BfTsgQHNhbXB7LUFLQ30gaXMgZXF1aXZhbGVudCB0bworQHNhbXB7LUFNQ30uICBTeW5vbnltcyBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciB0b29scy4KKworSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBvZiB0aGVzZSBvcHRpb25zLCBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgY29kZQorZm9yIGFueSBpbnN0cnVjdGlvbiBvciBmZWF0dXJlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IEBlbXBoe3NvbWV9IHZlcnNpb24gb2YgdGhlCis5NjAgKGV2ZW4gaWYgdGhpcyBtZWFucyBtaXhpbmcgYXJjaGl0ZWN0dXJlcyEpLiAgSW4gcHJpbmNpcGxlLAorQGNvZGV7QHZhbHVle0FTfX0gYXR0ZW1wdHMgdG8gZGVkdWNlIHRoZSBtaW5pbWFsIHN1ZmZpY2llbnQgcHJvY2Vzc29yIHR5cGUgaWYKK25vbmUgaXMgc3BlY2lmaWVkOyBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBjb2RlIGZvcm1hdCwgdGhlIHByb2Nlc3NvciB0eXBlIG1heQorYmUgcmVjb3JkZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgSWYgaXQgaXMgY3JpdGljYWwgdGhhdCB0aGUgQGNvZGV7QHZhbHVle0FTfX0KK291dHB1dCBtYXRjaCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSwgc3BlY2lmeSB0aGF0IGFyY2hpdGVjdHVyZSBleHBsaWNpdGx5LgorCitAY2luZGV4IEBjb2Rley1ifSBvcHRpb24sIGk5NjAKK0BjaW5kZXggYnJhbmNoIHJlY29yZGluZywgaTk2MAorQGNpbmRleCBpOTYwIGJyYW5jaCByZWNvcmRpbmcKK0BpdGVtIC1iCitBZGQgY29kZSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRha2VuLCBmb3IKK2xhdGVyIG9wdGltaXphdGlvbiB1c2luZyBicmFuY2ggcHJlZGljdGlvbiBiaXRzLiAgKFRoZSBjb25kaXRpb25hbCBicmFuY2gKK2luc3RydWN0aW9ucyBoYXZlIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgaW4gdGhlIENBLCBDQiwgYW5kIENDCithcmNoaXRlY3R1cmVzLikgIElmIEB2YXJ7QlJ9IHJlcHJlc2VudHMgYSBjb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24sCit0aGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbgorQHNhbXB7LWJ9IGlzIHNwZWNpZmllZDoKKworQHNtYWxsZXhhbXBsZQorICAgICAgICBjYWxsICAgIEB2YXJ7aW5jcmVtZW50IHJvdXRpbmV9CisgICAgICAgIC53b3JkICAgMCAgICAgICAjIHByZS1jb3VudGVyCitMYWJlbDogIEB2YXJ7QlJ9CisgICAgICAgIGNhbGwgICAgQHZhcntpbmNyZW1lbnQgcm91dGluZX0KKyAgICAgICAgLndvcmQgICAwICAgICAgICMgcG9zdC1jb3VudGVyCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgY291bnRlciBmb2xsb3dpbmcgYSBicmFuY2ggcmVjb3JkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJhbmNoCit3YXMgQGVtcGh7bm90fSB0YWtlbjsgdGhlIGRpZmZlcmVuYyBiZXR3ZWVuIHRoZSB0d28gY291bnRlcnMgaXMgdGhlCitudW1iZXIgb2YgdGltZXMgdGhlIGJyYW5jaCBAZW1waHt3YXN9IHRha2VuLgorCitAY2luZGV4IEBjb2Rle2dicjk2MH0sIGk5NjAgcG9zdHByb2Nlc3NvcgorQGNpbmRleCBicmFuY2ggc3RhdGlzdGljcyB0YWJsZSwgaTk2MAorQSB0YWJsZSBvZiBldmVyeSBzdWNoIEBjb2Rle0xhYmVsfSBpcyBhbHNvIGdlbmVyYXRlZCwgc28gdGhhdCB0aGUKK2V4dGVybmFsIHBvc3Rwcm9jZXNzb3IgQGNvZGV7Z2JyOTYwfSAoc3VwcGxpZWQgYnkgSW50ZWwpIGNhbiBsb2NhdGUgYWxsCit0aGUgY291bnRlcnMuICBUaGlzIHRhYmxlIGlzIGFsd2F5cyBsYWJlbGxlZCBAc2FtcHtfX0JSQU5DSF9UQUJMRV9ffTsKK3RoaXMgaXMgYSBsb2NhbCBzeW1ib2wgdG8gcGVybWl0IGNvbGxlY3Rpbmcgc3RhdGlzdGljcyBmb3IgbWFueSBzZXBhcmF0ZQorb2JqZWN0IGZpbGVzLiAgVGhlIHRhYmxlIGlzIHdvcmQgYWxpZ25lZCwgYW5kIGJlZ2lucyB3aXRoIGEgdHdvLXdvcmQKK2hlYWRlci4gIFRoZSBmaXJzdCB3b3JkLCBpbml0aWFsaXplZCB0byAwLCBpcyB1c2VkIGluIG1haW50YWluaW5nIGxpbmtlZAorbGlzdHMgb2YgYnJhbmNoIHRhYmxlcy4gIFRoZSBzZWNvbmQgd29yZCBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YKK2VudHJpZXMgaW4gdGhlIHRhYmxlLCB3aGljaCBmb2xsb3cgaW1tZWRpYXRlbHk6IGVhY2ggaXMgYSB3b3JkLCBwb2ludGluZwordG8gb25lIG9mIHRoZSBsYWJlbHMgaWxsdXN0cmF0ZWQgYWJvdmUuCisKK0BjIFRFWEkyUk9GRi1LSUxMCitAaWZpbmZvCitAYyBFTkQgVEVYSTJST0ZGLUtJTEwKK0BleGFtcGxlCisgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAuLi4gKy0tLS0tLS0tLS0tLSsKKyB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgfAorIHwgICpORVhUICAgICB8ICBDT1VOVDogTiAgfCAqQlJMQUIgMSAgIHwgICAgIHwgKkJSTEFCIE4gICB8CisgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rIC4uLiArLS0tLS0tLS0tLS0tKworCisgICAgICAgICAgICAgICBfX0JSQU5DSF9UQUJMRV9fIGxheW91dAorQGVuZCBleGFtcGxlCitAYyBURVhJMlJPRkYtS0lMTAorQGVuZCBpZmluZm8KK0BuZWVkIDIwMDAKK0B0ZXgKK1x2c2tpcCAxcGMKK1xsaW5le1xsZWZ0c2tpcD0wcHRcaHNraXBcdGFibGVpbmRlbnQKK1xib3hpdHsyY219e1x0dCAqTkVYVH1cYm94aXR7MmNtfXtcdHQgQ09VTlQ6IFxpdCBOfVxib3hpdHsyY219e1x0dAorKkJSTEFCIDF9XGlib3h7MWNtfXtccXVhZFxkb3RzfVxib3hpdHsyY219e1x0dCAqQlJMQUIgXGl0IE59XGhmaWx9CitcY2VudGVybGluZXtcaXQge1x0dCBcX1xfQlJBTkNIXF9UQUJMRVxfXF99IGxheW91dH0KK0BlbmQgdGV4CitAYyBFTkQgVEVYSTJST0ZGLUtJTEwKKworVGhlIGZpcnN0IHdvcmQgb2YgdGhlIGhlYWRlciBpcyB1c2VkIHRvIGxvY2F0ZSBtdWx0aXBsZSBicmFuY2ggdGFibGVzLAorc2luY2UgZWFjaCBvYmplY3QgZmlsZSBtYXkgY29udGFpbiBvbmUuIE5vcm1hbGx5IHRoZSBsaW5rcyBhcmUKK21haW50YWluZWQgd2l0aCBhIGNhbGwgdG8gYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgcGxhY2VkIGF0IHRoZQorYmVnaW5uaW5nIG9mIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGZpbGUuICBUaGUgQHNje2dudX0gQyBjb21waWxlcgorZ2VuZXJhdGVzIHRoZXNlIGNhbGxzIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgZ2l2ZSBpdCBhIEBzYW1wey1ifSBvcHRpb24uCitGb3IgZnVydGhlciBkZXRhaWxzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQHNhbXB7Z2JyOTYwfS4KKworQGNpbmRleCBAY29kZXstbm8tcmVsYXh9IG9wdGlvbiwgaTk2MAorQGl0ZW0gLW5vLXJlbGF4CitOb3JtYWxseSwgQ29tcGFyZS1hbmQtQnJhbmNoIGluc3RydWN0aW9ucyB3aXRoIHRhcmdldHMgdGhhdCByZXF1aXJlCitkaXNwbGFjZW1lbnRzIGdyZWF0ZXIgdGhhbiAxMyBiaXRzIChvciB0aGF0IGhhdmUgZXh0ZXJuYWwgdGFyZ2V0cykgYXJlCityZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgKG9yIEBzYW1we2Noa2JpdH0pIGFuZCBicmFuY2gKK2luc3RydWN0aW9ucy4gIFlvdSBjYW4gdXNlIHRoZSBAc2FtcHstbm8tcmVsYXh9IG9wdGlvbiB0byBzcGVjaWZ5IHRoYXQKK0Bjb2Rle0B2YWx1ZXtBU319IHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMgaW5zdGVhZCwgaWYgdGhlIHRhcmdldCBkaXNwbGFjZW1lbnQKK2lzIGxhcmdlciB0aGFuIDEzIGJpdHMuCisKK1RoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgQ29tcGFyZS1hbmQtSnVtcCBpbnN0cnVjdGlvbnM7IHRoZSBjb2RlCitlbWl0dGVkIGZvciB0aGVtIGlzIEBlbXBoe2Fsd2F5c30gYWRqdXN0ZWQgd2hlbiBuZWNlc3NhcnkgKGRlcGVuZGluZyBvbgorZGlzcGxhY2VtZW50IHNpemUpLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IHVzZSBAc2FtcHstbm8tcmVsYXh9LgorQGVuZCB0YWJsZQorCitAbm9kZSBGbG9hdGluZyBQb2ludC1pOTYwCitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBpOTYwIChAc2N7aWVlZX0pCitAY2luZGV4IGk5NjAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKK0Bjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgdGhlIGRpcmVjdGl2ZXMKK0BzYW1wey5mbG9hdH0sIEBzYW1wey5kb3VibGV9LCBAc2FtcHsuZXh0ZW5kZWR9LCBhbmQgQHNhbXB7LnNpbmdsZX0uCisKK0Bub2RlIERpcmVjdGl2ZXMtaTk2MAorQHNlY3Rpb24gaTk2MCBNYWNoaW5lIERpcmVjdGl2ZXMKKworQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIGk5NjAKK0BjaW5kZXggaTk2MCBtYWNoaW5lIGRpcmVjdGl2ZXMKKworQHRhYmxlIEBjb2RlCitAY2luZGV4IEBjb2Rle2Jzc30gZGlyZWN0aXZlLCBpOTYwCitAaXRlbSAuYnNzIEB2YXJ7c3ltYm9sfSwgQHZhcntsZW5ndGh9LCBAdmFye2FsaWdufQorUmVzZXJ2ZSBAdmFye2xlbmd0aH0gYnl0ZXMgaW4gdGhlIGJzcyBzZWN0aW9uIGZvciBhIGxvY2FsIEB2YXJ7c3ltYm9sfSwKK2FsaWduZWQgdG8gdGhlIHBvd2VyIG9mIHR3byBzcGVjaWZpZWQgYnkgQHZhcnthbGlnbn0uICBAdmFye2xlbmd0aH0gYW5kCitAdmFye2FsaWdufSBtdXN0IGJlIHBvc2l0aXZlIGFic29sdXRlIGV4cHJlc3Npb25zLiAgVGhpcyBkaXJlY3RpdmUKK2RpZmZlcnMgZnJvbSBAc2FtcHsubGNvbW19IG9ubHkgaW4gdGhhdCBpdCBwZXJtaXRzIHlvdSB0byBzcGVjaWZ5CithbiBhbGlnbm1lbnQuICBAeHJlZntMY29tbSwsQGNvZGV7Lmxjb21tfX0uCitAZW5kIHRhYmxlCisKK0B0YWJsZSBAY29kZQorQGNpbmRleCBAY29kZXtleHRlbmRlZH0gZGlyZWN0aXZlLCBpOTYwCitAaXRlbSAuZXh0ZW5kZWQgQHZhcntmbG9udW1zfQorQGNvZGV7LmV4dGVuZGVkfSBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzOyBmb3IKK2VhY2ggZmxvbnVtLCBAc2FtcHsuZXh0ZW5kZWR9IGVtaXRzIGFuIEBzY3tpZWVlfSBleHRlbmRlZC1mb3JtYXQgKDgwLWJpdCkKK2Zsb2F0aW5nLXBvaW50IG51bWJlci4KKworQGNpbmRleCBAY29kZXtsZWFmcHJvY30gZGlyZWN0aXZlLCBpOTYwCitAaXRlbSAubGVhZnByb2MgQHZhcntjYWxsLWxhYn0sIEB2YXJ7YmFsLWxhYn0KK1lvdSBjYW4gdXNlIHRoZSBAc2FtcHsubGVhZnByb2N9IGRpcmVjdGl2ZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorb3B0aW1pemVkIEBjb2Rle2NhbGxqfSBpbnN0cnVjdGlvbiB0byBlbmFibGUgZmFzdGVyIGNhbGxzIG9mIGxlYWYKK3Byb2NlZHVyZXMuICBJZiBhIHByb2NlZHVyZSBpcyBrbm93biB0byBjYWxsIG5vIG90aGVyIHByb2NlZHVyZXMsIHlvdQorbWF5IGRlZmluZSBhbiBlbnRyeSBwb2ludCB0aGF0IHNraXBzIHByb2NlZHVyZSBwcm9sb2cgY29kZSAoYW5kIHRoYXQgZG9lcworbm90IGRlcGVuZCBvbiBzeXN0ZW0tc3VwcGxpZWQgc2F2ZWQgY29udGV4dCksIGFuZCBkZWNsYXJlIGl0IGFzIHRoZQorQHZhcntiYWwtbGFifSB1c2luZyBAc2FtcHsubGVhZnByb2N9LiAgSWYgdGhlIHByb2NlZHVyZSBhbHNvIGhhcyBhbgorZW50cnkgcG9pbnQgdGhhdCBnb2VzIHRocm91Z2ggdGhlIG5vcm1hbCBwcm9sb2csIHlvdSBjYW4gc3BlY2lmeSB0aGF0CitlbnRyeSBwb2ludCBhcyBAdmFye2NhbGwtbGFifS4KKworQSBAc2FtcHsubGVhZnByb2N9IGRlY2xhcmF0aW9uIGlzIG1lYW50IGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKK29wdGltaXplZCBjYWxsIGluc3RydWN0aW9uIEBzYW1we2NhbGxqfTsgdGhlIGRpcmVjdGl2ZSByZWNvcmRzIHRoZSBkYXRhCituZWVkZWQgbGF0ZXIgdG8gY2hvb3NlIGJldHdlZW4gY29udmVydGluZyB0aGUgQHNhbXB7Y2FsbGp9IGludG8gYQorQGNvZGV7YmFsfSBvciBhIEBjb2Rle2NhbGx9LgorCitAdmFye2NhbGwtbGFifSBpcyBvcHRpb25hbDsgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJlc2VudCwgb3IgaWYgdGhlCit0d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwsIHRoZSBzaW5nbGUgYXJndW1lbnQgaXMgYXNzdW1lZCB0byBiZSB0aGUKK0Bjb2Rle2JhbH0gZW50cnkgcG9pbnQuCisKK0BjaW5kZXggQGNvZGV7c3lzcHJvY30gZGlyZWN0aXZlLCBpOTYwCitAaXRlbSAuc3lzcHJvYyBAdmFye25hbWV9LCBAdmFye2luZGV4fQorVGhlIEBzYW1wey5zeXNwcm9jfSBkaXJlY3RpdmUgZGVmaW5lcyBhIG5hbWUgZm9yIGEgc3lzdGVtIHByb2NlZHVyZS4KK0FmdGVyIHlvdSBkZWZpbmUgaXQgdXNpbmcgQHNhbXB7LnN5c3Byb2N9LCB5b3UgY2FuIHVzZSBAdmFye25hbWV9IHRvCityZWZlciB0byB0aGUgc3lzdGVtIHByb2NlZHVyZSBpZGVudGlmaWVkIGJ5IEB2YXJ7aW5kZXh9IHdoZW4gY2FsbGluZworcHJvY2VkdXJlcyB3aXRoIHRoZSBvcHRpbWl6ZWQgY2FsbCBpbnN0cnVjdGlvbiBAc2FtcHtjYWxsan0uCisKK0JvdGggYXJndW1lbnRzIGFyZSByZXF1aXJlZDsgQHZhcntpbmRleH0gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDMxCisoaW5jbHVzaXZlKS4KK0BlbmQgdGFibGUKKworQG5vZGUgT3Bjb2RlcyBmb3IgaTk2MAorQHNlY3Rpb24gaTk2MCBPcGNvZGVzCisKK0BjaW5kZXggb3Bjb2RlcywgaTk2MAorQGNpbmRleCBpOTYwIG9wY29kZXMKK0FsbCBJbnRlbCA5NjAgbWFjaGluZSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZDsKK0BweHJlZntPcHRpb25zLWk5NjAsLGk5NjAgQ29tbWFuZC1saW5lIE9wdGlvbnN9IGZvciBhIGRpc2N1c3Npb24gb2YKK3NlbGVjdGluZyB0aGUgaW5zdHJ1Y3Rpb24gc3Vic2V0IGZvciBhIHBhcnRpY3VsYXIgOTYwCithcmNoaXRlY3R1cmUuQHJlZmlsbAorCitTb21lIG9wY29kZXMgYXJlIHByb2Nlc3NlZCBiZXlvbmQgc2ltcGx5IGVtaXR0aW5nIGEgc2luZ2xlIGNvcnJlc3BvbmRpbmcKK2luc3RydWN0aW9uOiBAc2FtcHtjYWxsan0sIGFuZCBDb21wYXJlLWFuZC1CcmFuY2ggb3IgQ29tcGFyZS1hbmQtSnVtcAoraW5zdHJ1Y3Rpb25zIHdpdGggdGFyZ2V0IGRpc3BsYWNlbWVudHMgbGFyZ2VyIHRoYW4gMTMgYml0cy4KKworQG1lbnUKKyogY2FsbGotaTk2MDo6ICAgICAgICAgICAgICAgICAgQGNvZGV7Y2FsbGp9CisqIENvbXBhcmUtYW5kLWJyYW5jaC1pOTYwOjogICAgIENvbXBhcmUtYW5kLUJyYW5jaAorQGVuZCBtZW51CisKK0Bub2RlIGNhbGxqLWk5NjAKK0BzdWJzZWN0aW9uIEBjb2Rle2NhbGxqfQorCitAY2luZGV4IEBjb2Rle2NhbGxqfSwgaTk2MCBwc2V1ZG8tb3Bjb2RlCitAY2luZGV4IGk5NjAgQGNvZGV7Y2FsbGp9IHBzZXVkby1vcGNvZGUKK1lvdSBjYW4gd3JpdGUgQGNvZGV7Y2FsbGp9IHRvIGhhdmUgdGhlIGFzc2VtYmxlciBvciB0aGUgbGlua2VyIGRldGVybWluZQordGhlIG1vc3QgYXBwcm9wcmlhdGUgZm9ybSBvZiBzdWJyb3V0aW5lIGNhbGw6IEBzYW1we2NhbGx9LAorQHNhbXB7YmFsfSwgb3IgQHNhbXB7Y2FsbHN9LiAgSWYgdGhlIGFzc2VtYmx5IHNvdXJjZSBjb250YWlucworZW5vdWdoIGluZm9ybWF0aW9uLS0tYSBAc2FtcHsubGVhZnByb2N9IG9yIEBzYW1wey5zeXNwcm9jfSBkaXJlY3RpdmUKK2RlZmluaW5nIHRoZSBvcGVyYW5kLS0tdGhlbiBAY29kZXtAdmFsdWV7QVN9fSB0cmFuc2xhdGVzIHRoZQorQGNvZGV7Y2FsbGp9OyBpZiBub3QsIGl0IHNpbXBseSBlbWl0cyB0aGUgQGNvZGV7Y2FsbGp9LCBsZWF2aW5nIGl0Citmb3IgdGhlIGxpbmtlciB0byByZXNvbHZlLgorCitAbm9kZSBDb21wYXJlLWFuZC1icmFuY2gtaTk2MAorQHN1YnNlY3Rpb24gQ29tcGFyZS1hbmQtQnJhbmNoCisKK0BjaW5kZXggaTk2MCBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMKK0BjaW5kZXggY29tcGFyZS9icmFuY2ggaW5zdHJ1Y3Rpb25zLCBpOTYwCitUaGUgOTYwIGFyY2hpdGVjdHVyZXMgcHJvdmlkZSBjb21iaW5lZCBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zCit0aGF0IHBlcm1pdCB5b3UgdG8gc3RvcmUgdGhlIGJyYW5jaCB0YXJnZXQgaW4gdGhlIGxvd2VyIDEzIGJpdHMgb2YgdGhlCitpbnN0cnVjdGlvbiB3b3JkIGl0c2VsZi4gIEhvd2V2ZXIsIGlmIHlvdSBzcGVjaWZ5IGEgYnJhbmNoIHRhcmdldCBmYXIKK2Vub3VnaCBhd2F5IHRoYXQgaXRzIGFkZHJlc3Mgd29uJ3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgY2FuCitlaXRoZXIgaXNzdWUgYW4gZXJyb3IsIG9yIGNvbnZlcnQgeW91ciBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb24KK2ludG8gc2VwYXJhdGUgaW5zdHJ1Y3Rpb25zIHRvIGRvIHRoZSBjb21wYXJlIGFuZCB0aGUgYnJhbmNoLgorCitAY2luZGV4IGNvbXBhcmUgYW5kIGp1bXAgZXhwYW5zaW9ucywgaTk2MAorQGNpbmRleCBpOTYwIGNvbXBhcmUgYW5kIGp1bXAgZXhwYW5zaW9ucworV2hldGhlciBAY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBvciBleHBhbmRzIHRoZSBpbnN0cnVjdGlvbiBkZXBlbmRzCitvbiB0d28gY2hvaWNlcyB5b3UgY2FuIG1ha2U6IHdoZXRoZXIgeW91IHVzZSB0aGUgQHNhbXB7LW5vLXJlbGF4fSBvcHRpb24sCithbmQgd2hldGhlciB5b3UgdXNlIGEgYGBDb21wYXJlIGFuZCBCcmFuY2gnJyBpbnN0cnVjdGlvbiBvciBhIGBgQ29tcGFyZQorYW5kIEp1bXAnJyBpbnN0cnVjdGlvbi4gIFRoZSBgYEp1bXAnJyBpbnN0cnVjdGlvbnMgYXJlIEBlbXBoe2Fsd2F5c30KK2V4cGFuZGVkIGlmIG5lY2Vzc2FyeTsgdGhlIGBgQnJhbmNoJycgaW5zdHJ1Y3Rpb25zIGFyZSBleHBhbmRlZCB3aGVuCituZWNlc3NhcnkgQGVtcGh7dW5sZXNzfSB5b3Ugc3BlY2lmeSBAY29kZXstbm8tcmVsYXh9LS0taW4gd2hpY2ggY2FzZQorQGNvZGV7QHZhbHVle0FTfX0gZ2l2ZXMgYW4gZXJyb3IgaW5zdGVhZC4KKworVGhlc2UgYXJlIHRoZSBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zLCB0aGVpciBgYEp1bXAnJyB2YXJpYW50cywKK2FuZCB0aGUgaW5zdHJ1Y3Rpb24gcGFpcnMgdGhleSBtYXkgZXhwYW5kIGludG86CisKK0BjIFRFWEkyUk9GRi1LSUxMCitAaWZpbmZvCitAYyBFTkQgVEVYSTJST0ZGLUtJTEwKK0BleGFtcGxlCisgICAgICAgIENvbXBhcmUgYW5kCisgICAgIEJyYW5jaCAgICAgIEp1bXAgICAgICAgRXhwYW5kZWQgdG8KKyAgICAgLS0tLS0tICAgIC0tLS0tLSAgICAgICAtLS0tLS0tLS0tLS0KKyAgICAgICAgYmJjICAgICAgICAgICAgICAgICBjaGtiaXQ7IGJubworICAgICAgICBiYnMgICAgICAgICAgICAgICAgIGNoa2JpdDsgYm8KKyAgICAgY21waWJlICAgIGNtcGlqZSAgICAgICBjbXBpOyBiZQorICAgICBjbXBpYmcgICAgY21waWpnICAgICAgIGNtcGk7IGJnCisgICAgY21waWJnZSAgIGNtcGlqZ2UgICAgICAgY21waTsgYmdlCisgICAgIGNtcGlibCAgICBjbXBpamwgICAgICAgY21waTsgYmwKKyAgICBjbXBpYmxlICAgY21waWpsZSAgICAgICBjbXBpOyBibGUKKyAgICBjbXBpYm5vICAgY21waWpubyAgICAgICBjbXBpOyBibm8KKyAgICBjbXBpYm5lICAgY21waWpuZSAgICAgICBjbXBpOyBibmUKKyAgICAgY21waWJvICAgIGNtcGlqbyAgICAgICBjbXBpOyBibworICAgICBjbXBvYmUgICAgY21wb2plICAgICAgIGNtcG87IGJlCisgICAgIGNtcG9iZyAgICBjbXBvamcgICAgICAgY21wbzsgYmcKKyAgICBjbXBvYmdlICAgY21wb2pnZSAgICAgICBjbXBvOyBiZ2UKKyAgICAgY21wb2JsICAgIGNtcG9qbCAgICAgICBjbXBvOyBibAorICAgIGNtcG9ibGUgICBjbXBvamxlICAgICAgIGNtcG87IGJsZQorICAgIGNtcG9ibmUgICBjbXBvam5lICAgICAgIGNtcG87IGJuZQorQGVuZCBleGFtcGxlCitAYyBURVhJMlJPRkYtS0lMTAorQGVuZCBpZmluZm8KK0B0ZXgKK1xoc2tpcFx0YWJsZWluZGVudAorXGhhbGlnbntcaGZpbCB7XHR0ICN9XHF1YWQmXGhmaWwge1x0dCAjfVxxcXVhZCZ7XHR0ICN9XGhmaWxcY3IKK1xvbWl0e1xoZmlsXGl0IENvbXBhcmUgYW5kXGhmaWx9XHNwYW5cb21pdCZcY3IKK3tcaXQgQnJhbmNofSZ7XGl0IEp1bXB9JntcaXQgRXhwYW5kZWQgdG99XGNyCisgICAgICAgIGJiYyYgICAgICAgICAgICAgICAgICYgY2hrYml0OyBibm9cY3IKKyAgICAgICAgYmJzJiAgICAgICAgICAgICAgICAgJiBjaGtiaXQ7IGJvXGNyCisgICAgIGNtcGliZSYgICAgY21waWplJiAgICAgICBjbXBpOyBiZVxjcgorICAgICBjbXBpYmcmICAgIGNtcGlqZyYgICAgICAgY21waTsgYmdcY3IKKyAgICBjbXBpYmdlJiAgIGNtcGlqZ2UmICAgICAgIGNtcGk7IGJnZVxjcgorICAgICBjbXBpYmwmICAgIGNtcGlqbCYgICAgICAgY21waTsgYmxcY3IKKyAgICBjbXBpYmxlJiAgIGNtcGlqbGUmICAgICAgIGNtcGk7IGJsZVxjcgorICAgIGNtcGlibm8mICAgY21waWpubyYgICAgICAgY21waTsgYm5vXGNyCisgICAgY21waWJuZSYgICBjbXBpam5lJiAgICAgICBjbXBpOyBibmVcY3IKKyAgICAgY21waWJvJiAgICBjbXBpam8mICAgICAgIGNtcGk7IGJvXGNyCisgICAgIGNtcG9iZSYgICAgY21wb2plJiAgICAgICBjbXBvOyBiZVxjcgorICAgICBjbXBvYmcmICAgIGNtcG9qZyYgICAgICAgY21wbzsgYmdcY3IKKyAgICBjbXBvYmdlJiAgIGNtcG9qZ2UmICAgICAgIGNtcG87IGJnZVxjcgorICAgICBjbXBvYmwmICAgIGNtcG9qbCYgICAgICAgY21wbzsgYmxcY3IKKyAgICBjbXBvYmxlJiAgIGNtcG9qbGUmICAgICAgIGNtcG87IGJsZVxjcgorICAgIGNtcG9ibmUmICAgY21wb2puZSYgICAgICAgY21wbzsgYm5lXGNyfQorQGVuZCB0ZXgKK0BjIEVORCBURVhJMlJPRkYtS0lMTApkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW0zMnIudGV4aSBiL2dhcy9kb2MvYy1tMzJyLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMWVkZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1tMzJyLnRleGkKQEAgLTAsMCArMSwxMyBAQAorQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgorQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCitAaWZzZXQgR0VORVJJQworQHBhZ2UKK0Bub2RlIE0zMlItRGVwZW5kZW50CitAY2hhcHRlciBNMzJSIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKK0BjaGFwdGVyIE0zMlIgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmY2xlYXIKKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW02OGsudGV4aSBiL2dhcy9kb2MvYy1tNjhrLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmODU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1tNjhrLnRleGkKQEAgLTAsMCArMSw1MDMgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgorQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCitAaWZzZXQgR0VORVJJQworQHBhZ2UKK0Bub2RlIE02OEstRGVwZW5kZW50CitAY2hhcHRlciBNNjgweDAgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggTTY4MHgwIHN1cHBvcnQKK0BtZW51CisqIE02OEstT3B0czo6ICAgICAgICAgICAgICAgICAgIE02ODB4MCBPcHRpb25zCisqIE02OEstU3ludGF4OjogICAgICAgICAgICAgICAgIFN5bnRheAorKiBNNjhLLU1vdG8tU3ludGF4OjogICAgICAgICAgICBNb3Rvcm9sYSBTeW50YXgKKyogTTY4Sy1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKKyogTTY4Sy1EaXJlY3RpdmVzOjogICAgICAgICAgICAgNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCisqIE02OEstb3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKK0BlbmQgbWVudQorCitAbm9kZSBNNjhLLU9wdHMKK0BzZWN0aW9uIE02ODB4MCBPcHRpb25zCisKK0BjaW5kZXggb3B0aW9ucywgTTY4MHgwCitAY2luZGV4IE02ODB4MCBvcHRpb25zCitUaGUgTW90b3JvbGEgNjgweDAgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYSBmZXcgbWFjaGluZQorZGVwZW5kZW50IG9wdGlvbnMuCisKK0BjaW5kZXggQHNhbXB7LWx9IG9wdGlvbiwgTTY4MHgwCitZb3UgY2FuIHVzZSB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBzaG9ydGVuIHRoZSBzaXplIG9mIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCitzeW1ib2xzLiAgSWYgeW91IGRvIG5vdCB1c2UgdGhlIEBzYW1wey1sfSBvcHRpb24sIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkCitzeW1ib2xzIGFyZSB3aWRlIGVub3VnaCBmb3IgYSBmdWxsIEBjb2Rle2xvbmd9ICgzMiBiaXRzKS4gIChTaW5jZQorQGNvZGV7QHZhbHVle0FTfX0gY2Fubm90IGtub3cgd2hlcmUgdGhlc2Ugc3ltYm9scyBlbmQgdXAsIEBjb2Rle0B2YWx1ZXtBU319IGNhbgorb25seSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpbmtlciB0byBmaWxsIGluIGxhdGVyLiAgU2luY2UgQGNvZGV7QHZhbHVle0FTfX0KK2RvZXMgbm90IGtub3cgaG93IGZhciBhd2F5IHRoZXNlIHN5bWJvbHMgYXJlLCBpdCBhbGxvY2F0ZXMgYXMgbXVjaCBzcGFjZSBhcyBpdAorY2FuLikgIElmIHlvdSB1c2UgdGhpcyBvcHRpb24sIHRoZSByZWZlcmVuY2VzIGFyZSBvbmx5IG9uZSB3b3JkIHdpZGUgKDE2IGJpdHMpLgorVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZSB0byBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgYW5kCit5b3Uga25vdyB0aGF0IHRoZSByZWxldmFudCBzeW1ib2xzIGFyZSBhbHdheXMgbGVzcyB0aGFuIDE3IGJpdHMgYXdheS4KKworQGNpbmRleCBAc2FtcHstLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbH0gb3B0aW9uLCBNNjgweDAKK0ZvciBzb21lIGNvbmZpZ3VyYXRpb25zLCBlc3BlY2lhbGx5IHRob3NlIHdoZXJlIHRoZSBjb21waWxlciBub3JtYWxseQorZG9lcyBub3QgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB1c2VyIHZhcmlhYmxlcywgdGhlCithc3NlbWJsZXIgcmVxdWlyZXMgYSBAc2FtcHslfSBiZWZvcmUgYW55IHVzZSBvZiBhIHJlZ2lzdGVyIG5hbWUuICBUaGlzCitpcyBpbnRlbmRlZCB0byBsZXQgdGhlIGFzc2VtYmxlciBkaXN0aW5ndWlzaCBiZXR3ZWVuIEMgdmFyaWFibGVzIGFuZAorZnVuY3Rpb25zIG5hbWVkIEBzYW1we2EwfSB0aHJvdWdoIEBzYW1we2E3fSwgYW5kIHNvIG9uLiAgVGhlIEBzYW1weyV9IGlzCithbHdheXMgYWNjZXB0ZWQsIGJ1dCBpcyBub3QgcmVxdWlyZWQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMsIG5vdGFibHkKK0BzYW1we3N1bjN9LiAgVGhlIEBzYW1wey0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsfSBvcHRpb24gbWF5IGJlIHVzZWQKK3RvIHBlcm1pdCBvbWl0dGluZyB0aGUgQHNhbXB7JX0gZXZlbiBmb3IgY29uZmlndXJhdGlvbnMgZm9yIHdoaWNoIGl0IGlzCitub3JtYWxseSByZXF1aXJlZC4gIElmIHRoaXMgaXMgZG9uZSwgaXQgd2lsbCBnZW5lcmFsbHkgYmUgaW1wb3NzaWJsZSB0bworcmVmZXIgdG8gQyB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWVzIGFzIHJlZ2lzdGVyCituYW1lcy4KKworQGNpbmRleCBAc2FtcHstLWJpdHdpc2Utb3J9IG9wdGlvbiwgTTY4MHgwCitOb3JtYWxseSB0aGUgY2hhcmFjdGVyIEBzYW1we3x9IGlzIHRyZWF0ZWQgYXMgYSBjb21tZW50IGNoYXJhY3Rlciwgd2hpY2gKK21lYW5zIHRoYXQgaXQgY2FuIG5vdCBiZSB1c2VkIGluIGV4cHJlc3Npb25zLiAgVGhlIEBzYW1wey0tYml0d2lzZS1vcn0KK29wdGlvbiB0dXJucyBAc2FtcHt8fSBpbnRvIGEgbm9ybWFsIGNoYXJhY3Rlci4gIEluIHRoaXMgbW9kZSwgeW91IG11c3QKK2VpdGhlciB1c2UgQyBzdHlsZSBjb21tZW50cywgb3Igc3RhcnQgY29tbWVudHMgd2l0aCBhIEBzYW1weyN9IGNoYXJhY3RlcgorYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCisKK0BjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KK0BjaW5kZXggQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0zMn0KK0lmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBiYXNlIHJlZ2lzdGVyIHdpdGhvdXQgc3BlY2lmeWluZwordGhlIHNpemUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgbm9ybWFsbHkgdXNlIHRoZSBmdWxsIDMyIGJpdCB2YWx1ZS4KK0ZvciBleGFtcGxlLCB0aGUgYWRkcmVzc2luZyBtb2RlIEBzYW1weyVhMEBAKCVkMCl9IGlzIGVxdWl2YWxlbnQgdG8KK0BzYW1weyVhMEBAKCVkMDpsKX0uICBZb3UgbWF5IHVzZSB0aGUgQHNhbXB7LS1iYXNlLXNpemUtZGVmYXVsdC0xNn0KK29wdGlvbiB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRvIGRlZmF1bHQgdG8gdXNpbmcgdGhlIDE2IGJpdCB2YWx1ZS4KK0luIHRoaXMgY2FzZSwgQHNhbXB7JWEwQEAoJWQwKX0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHslYTBAQCglZDA6dyl9LgorWW91IG1heSB1c2UgdGhlIEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZQorZGVmYXVsdCBiZWhhdmlvdXIuCisKK0BjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0KK0BjaW5kZXggQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0zMn0KK0lmIHlvdSB1c2UgYW4gYWRkcmVzc2luZyBtb2RlIHdpdGggYSBkaXNwbGFjZW1lbnQsIGFuZCB0aGUgdmFsdWUgb2YgdGhlCitkaXNwbGFjZW1lbnQgaXMgbm90IGtub3duLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vcm1hbGx5IGFzc3VtZSB0aGF0Cit0aGUgdmFsdWUgaXMgMzIgYml0cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgc3ltYm9sIEBzYW1we2Rpc3B9IGhhcyBub3QKK2JlZW4gZGVmaW5lZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSB0aGUgYWRkcmVzc2luZyBtb2RlCitAc2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaCBAc2FtcHtkaXNwfSBpcyBhIDMyIGJpdCB2YWx1ZS4gIFlvdSBtYXkKK3VzZSB0aGUgQHNhbXB7LS1kaXNwLXNpemUtZGVmYXVsdC0xNn0gb3B0aW9uIHRvIHRlbGwgQGNvZGV7QHZhbHVle0FTfX0KK3RvIGluc3RlYWQgYXNzdW1lIHRoYXQgdGhlIGRpc3BsYWNlbWVudCBpcyAxNiBiaXRzLiAgSW4gdGhpcyBjYXNlLAorQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhc3NlbWJsZSBAc2FtcHslYTBAQChkaXNwLCVkMCl9IGFzIHRob3VnaAorQHNhbXB7ZGlzcH0gaXMgYSAxNiBiaXQgdmFsdWUuICBZb3UgbWF5IHVzZSB0aGUKK0BzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMzJ9IG9wdGlvbiB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KKworQGNpbmRleCBAc2FtcHstbTY4MDAwfSBhbmQgcmVsYXRlZCBvcHRpb25zCitAY2luZGV4IGFyY2hpdGVjdHVyZSBvcHRpb25zLCBNNjgweDAKK0BjaW5kZXggTTY4MHgwIGFyY2hpdGVjdHVyZSBvcHRpb25zCitAY29kZXtAdmFsdWV7QVN9fSBjYW4gYXNzZW1ibGUgY29kZSBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgbWVtYmVycyBvZiB0aGUKK01vdG9yb2xhIDY4MHgwIGZhbWlseS4gIFRoZSBkZWZhdWx0IGRlcGVuZHMgdXBvbiBob3cgQGNvZGV7QHZhbHVle0FTfX0KK3dhcyBjb25maWd1cmVkIHdoZW4gaXQgd2FzIGJ1aWx0OyBub3JtYWxseSwgdGhlIGRlZmF1bHQgaXMgdG8gYXNzZW1ibGUKK2NvZGUgZm9yIHRoZSA2ODAyMCBtaWNyb3Byb2Nlc3Nvci4gIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBtYXkgYmUgdXNlZCB0bworY2hhbmdlIHRoZSBkZWZhdWx0LiAgVGhlc2Ugb3B0aW9ucyBjb250cm9sIHdoaWNoIGluc3RydWN0aW9ucyBhbmQKK2FkZHJlc3NpbmcgbW9kZXMgYXJlIHBlcm1pdHRlZC4gIFRoZSBtZW1iZXJzIG9mIHRoZSA2ODB4MCBmYW1pbHkgYXJlCit2ZXJ5IHNpbWlsYXIuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpZmZlcmVuY2VzLCBzZWUgdGhlCitNb3Rvcm9sYSBtYW51YWxzLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIC1tNjgwMDAKK0BpdGVteCAtbTY4ZWMwMDAKK0BpdGVteCAtbTY4aGMwMDAKK0BpdGVteCAtbTY4aGMwMDEKK0BpdGVteCAtbTY4MDA4CitAaXRlbXggLW02ODMwMgorQGl0ZW14IC1tNjgzMDYKK0BpdGVteCAtbTY4MzA3CitAaXRlbXggLW02ODMyMgorQGl0ZW14IC1tNjgzNTYKK0Fzc2VtYmxlIGZvciB0aGUgNjgwMDAuIEBzYW1wey1tNjgwMDh9LCBAc2FtcHstbTY4MzAyfSwgYW5kIHNvIG9uIGFyZSBzeW5vbnltcworZm9yIEBzYW1wey1tNjgwMDB9LCBzaW5jZSB0aGUgY2hpcHMgYXJlIHRoZSBzYW1lIGZyb20gdGhlIHBvaW50IG9mIHZpZXcKK29mIHRoZSBhc3NlbWJsZXIuCisKK0BpdGVtIC1tNjgwMTAKK0Fzc2VtYmxlIGZvciB0aGUgNjgwMTAuCisKK0BpdGVtIC1tNjgwMjAKK0BpdGVteCAtbTY4ZWMwMjAKK0Fzc2VtYmxlIGZvciB0aGUgNjgwMjAuICBUaGlzIGlzIG5vcm1hbGx5IHRoZSBkZWZhdWx0LgorCitAaXRlbSAtbTY4MDMwCitAaXRlbXggLW02OGVjMDMwCitBc3NlbWJsZSBmb3IgdGhlIDY4MDMwLgorCitAaXRlbSAtbTY4MDQwCitAaXRlbXggLW02OGVjMDQwCitBc3NlbWJsZSBmb3IgdGhlIDY4MDQwLgorCitAaXRlbSAtbTY4MDYwCitAaXRlbXggLW02OGVjMDYwCitBc3NlbWJsZSBmb3IgdGhlIDY4MDYwLgorCitAaXRlbSAtbWNwdTMyCitAaXRlbXggLW02ODMzMAorQGl0ZW14IC1tNjgzMzEKK0BpdGVteCAtbTY4MzMyCitAaXRlbXggLW02ODMzMworQGl0ZW14IC1tNjgzMzQKK0BpdGVteCAtbTY4MzM2CitAaXRlbXggLW02ODM0MAorQGl0ZW14IC1tNjgzNDEKK0BpdGVteCAtbTY4MzQ5CitAaXRlbXggLW02ODM2MAorQXNzZW1ibGUgZm9yIHRoZSBDUFUzMiBmYW1pbHkgb2YgY2hpcHMuCisKK0BpdGVtIC1tNTIwMAorQXNzZW1ibGUgZm9yIHRoZSBDb2xkRmlyZSBmYW1pbHkgb2YgY2hpcHMuCisKK0BpdGVtIC1tNjg4ODEKK0BpdGVteCAtbTY4ODgyCitBc3NlbWJsZSA2ODg4MSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKKzY4MDIwLCA2ODAzMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhbmQgNjgwNjAgYWx3YXlzIHN1cHBvcnQKK2Zsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KKworQGl0ZW0gLW1uby02ODg4MQorRG8gbm90IGFzc2VtYmxlIDY4ODgxIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQKK2ZvciA2ODAwMCBhbmQgdGhlIDY4MDEwLiAgVGhlIDY4MDQwIGFuZCA2ODA2MCBhbHdheXMgc3VwcG9ydCBmbG9hdGluZworcG9pbnQgaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIHRoaXMgb3B0aW9uIGlzIHVzZWQuCisKK0BpdGVtIC1tNjg4NTEKK0Fzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgNjgwMjAsCis2ODAzMCwgYW5kIDY4MDYwLiAgVGhlIDY4MDQwIGFjY2VwdHMgYSBzb21ld2hhdCBkaWZmZXJlbnQgc2V0IG9mIE1NVQoraW5zdHJ1Y3Rpb25zOyBAc2FtcHstbTY4ODUxfSBhbmQgQHNhbXB7LW02ODA0MH0gc2hvdWxkIG5vdCBiZSB1c2VkCit0b2dldGhlci4KKworQGl0ZW0gLW1uby02ODg1MQorRG8gbm90IGFzc2VtYmxlIDY4ODUxIE1NVSBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUKKzY4MDAwLCA2ODAxMCwgYW5kIHRoZSBDUFUzMi4gIFRoZSA2ODA0MCBhY2NlcHRzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNldAorb2YgTU1VIGluc3RydWN0aW9ucy4KK0BlbmQgdGFibGUKKworQG5vZGUgTTY4Sy1TeW50YXgKK0BzZWN0aW9uIFN5bnRheAorCitAY2luZGV4IEBzY3ttaXR9CitUaGlzIHN5bnRheCBmb3IgdGhlIE1vdG9yb2xhIDY4MHgwIHdhcyBkZXZlbG9wZWQgYXQgQHNje21pdH0uCisKK0BjaW5kZXggTTY4MHgwIHN5bnRheAorQGNpbmRleCBzeW50YXgsIE02ODB4MAorQGNpbmRleCBNNjgweDAgc2l6ZSBtb2RpZmllcnMKK0BjaW5kZXggc2l6ZSBtb2RpZmllcnMsIE02ODB4MAorVGhlIDY4MHgwIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyBpbnN0cnVjdGlvbnMgbmFtZXMgYW5kCitzeW50YXggY29tcGF0aWJsZSB3aXRoIHRoZSBTdW4gYXNzZW1ibGVyLiAgSW50ZXJ2ZW5pbmcgcGVyaW9kcyBhcmUKK2lnbm9yZWQ7IGZvciBleGFtcGxlLCBAc2FtcHttb3ZsfSBpcyBlcXVpdmFsZW50IHRvIEBzYW1we21vdi5sfS4KKworSW4gdGhlIGZvbGxvd2luZyB0YWJsZSBAdmFye2FwY30gc3RhbmRzIGZvciBhbnkgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXJzCisoQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN30pLCB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslcGN9KSwgdGhlCit6ZXJvLWFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXpwY30pLCBhIHN1cHByZXNzZWQKK2FkZHJlc3MgcmVnaXN0ZXIgKEBzYW1weyV6YTB9IHRocm91Z2ggQHNhbXB7JXphN30pLCBvciBpdCBtYXkgYmUgb21pdHRlZAorZW50aXJlbHkuICBUaGUgdXNlIG9mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQKK2l0IG1heSBiZSBvbWl0dGVkLCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGNvbG9uLCB1bmxlc3MgYSBzY2FsZSBpcyBhbHNvCitzcGVjaWZpZWQuICBUaGUgdXNlIG9mIEB2YXJ7c2NhbGV9IG1lYW5zIG9uZSBvZiBAc2FtcHsxfSwgQHNhbXB7Mn0sCitAc2FtcHs0fSwgb3IgQHNhbXB7OH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlIG9taXR0ZWQgYWxvbmcgd2l0aCB0aGUKK2xlYWRpbmcgY29sb24uCisKK0BjaW5kZXggTTY4MHgwIGFkZHJlc3NpbmcgbW9kZXMKK0BjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgTTY4MHgwCitUaGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6CitAdGFibGUgQGRmbgorQGl0ZW0gSW1tZWRpYXRlCitAc2FtcHsjQHZhcntudW1iZXJ9fQorCitAaXRlbSBEYXRhIFJlZ2lzdGVyCitAc2FtcHslZDB9IHRocm91Z2ggQHNhbXB7JWQ3fQorCitAaXRlbSBBZGRyZXNzIFJlZ2lzdGVyCitAc2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fUAqCitAc2FtcHslYTd9IGlzIGFsc28ga25vd24gYXMgQHNhbXB7JXNwfSwgaS5lLiB0aGUgU3RhY2sgUG9pbnRlci4gIEBjb2RleyVhNn0KK2lzIGFsc28ga25vd24gYXMgQHNhbXB7JWZwfSwgdGhlIEZyYW1lIFBvaW50ZXIuCisKK0BpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QKK0BzYW1weyVhMEBAfSB0aHJvdWdoIEBzYW1weyVhN0BAfQorCitAaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFBvc3RpbmNyZW1lbnQKK0BzYW1weyVhMEBAK30gdGhyb3VnaCBAc2FtcHslYTdAQCt9CisKK0BpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUHJlZGVjcmVtZW50CitAc2FtcHslYTBAQC19IHRocm91Z2ggQHNhbXB7JWE3QEAtfQorCitAaXRlbSBJbmRpcmVjdCBQbHVzIE9mZnNldAorQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9KX0KKworQGl0ZW0gSW5kZXgKK0BzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KKworVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZC4KKworQGl0ZW0gUG9zdGluZGV4CitAc2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0pQEAoQHZhcntvbnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KX0KKworVGhlIEB2YXJ7b251bWJlcn0gb3IgdGhlIEB2YXJ7cmVnaXN0ZXJ9LCBidXQgbm90IGJvdGgsIG1heSBiZSBvbWl0dGVkLgorCitAaXRlbSBQcmVpbmRleAorQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9LEB2YXJ7cmVnaXN0ZXJ9OkB2YXJ7c2l6ZX06QHZhcntzY2FsZX0pQEAoQHZhcntvbnVtYmVyfSl9CisKK1RoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQuICBPbWl0dGluZyB0aGUgQHZhcntyZWdpc3Rlcn0gcHJvZHVjZXMKK3RoZSBQb3N0aW5kZXggYWRkcmVzc2luZyBtb2RlLgorCitAaXRlbSBBYnNvbHV0ZQorQHNhbXB7QHZhcntzeW1ib2x9fSwgb3IgQHNhbXB7QHZhcntkaWdpdHN9fSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieQorQHNhbXB7OmJ9LCBAc2FtcHs6d30sIG9yIEBzYW1wezpsfS4KK0BlbmQgdGFibGUKKworQG5vZGUgTTY4Sy1Nb3RvLVN5bnRheAorQHNlY3Rpb24gTW90b3JvbGEgU3ludGF4CisKK0BjaW5kZXggTW90b3JvbGEgc3ludGF4IGZvciB0aGUgNjgweDAKK0BjaW5kZXggYWx0ZXJuYXRlIHN5bnRheCBmb3IgdGhlIDY4MHgwCisKK1RoZSBzdGFuZGFyZCBNb3Rvcm9sYSBzeW50YXggZm9yIHRoaXMgY2hpcCBkaWZmZXJzIGZyb20gdGhlIHN5bnRheAorYWxyZWFkeSBkaXNjdXNzZWQgKEBweHJlZntNNjhLLVN5bnRheCwsU3ludGF4fSkuICBAY29kZXtAdmFsdWV7QVN9fSBjYW4KK2FjY2VwdCBNb3Rvcm9sYSBzeW50YXggZm9yIG9wZXJhbmRzLCBldmVuIGlmIEBzY3ttaXR9IHN5bnRheCBpcyB1c2VkIGZvcgorb3RoZXIgb3BlcmFuZHMgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgdHdvIGtpbmRzIG9mIHN5bnRheCBhcmUKK2Z1bGx5IGNvbXBhdGlibGUuCisKK0luIHRoZSBmb2xsb3dpbmcgdGFibGUgQHZhcnthcGN9IHN0YW5kcyBmb3IgYW55IG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVycworKEBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9KSwgdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXBjfSksIHRoZQoremVyby1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyV6cGN9KSwgb3IgYQorc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVyIChAc2FtcHslemEwfSB0aHJvdWdoIEBzYW1weyV6YTd9KS4gIFRoZSB1c2UKK29mIEB2YXJ7c2l6ZX0gbWVhbnMgb25lIG9mIEBzYW1we3d9IG9yIEBzYW1we2x9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZQorb21pdHRlZCBhbG9uZyB3aXRoIHRoZSBsZWFkaW5nIGRvdC4gIFRoZSB1c2Ugb2YgQHZhcntzY2FsZX0gbWVhbnMgb25lIG9mCitAc2FtcHsxfSwgQHNhbXB7Mn0sIEBzYW1wezR9LCBvciBAc2FtcHs4fSwgYW5kIGl0IG1heSBhbHdheXMgYmUgb21pdHRlZAorYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBhc3Rlcmlzay4KKworVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFkZHJlc3NpbmcgbW9kZXMgYXJlIHVuZGVyc3Rvb2Q6CisKK0B0YWJsZSBAZGZuCitAaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0CitAc2FtcHsoJWEwKX0gdGhyb3VnaCBAc2FtcHsoJWE3KX1AKiAKK0BzYW1weyVhN30gaXMgYWxzbyBrbm93biBhcyBAc2FtcHslc3B9LCBpLmUuIHRoZSBTdGFjayBQb2ludGVyLiAgQGNvZGV7JWE2fQoraXMgYWxzbyBrbm93biBhcyBAc2FtcHslZnB9LCB0aGUgRnJhbWUgUG9pbnRlci4KKworQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQb3N0aW5jcmVtZW50CitAc2FtcHsoJWEwKSt9IHRocm91Z2ggQHNhbXB7KCVhNykrfQorCitAaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFByZWRlY3JlbWVudAorQHNhbXB7LSglYTApfSB0aHJvdWdoIEBzYW1wey0oJWE3KX0KKworQGl0ZW0gSW5kaXJlY3QgUGx1cyBPZmZzZXQKK0BzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhMH0pfSB0aHJvdWdoIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVhN30pfSwKK29yIEBzYW1we0B2YXJ7bnVtYmVyfShAdmFyeyVwY30pfS4KKworVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYWxzbyBhcHBlYXIgd2l0aGluIHRoZSBwYXJlbnRoZXNlcywgYXMgaW4KK0BzYW1weyhAdmFye251bWJlcn0sQHZhcnslYTB9KX0uICBXaGVuIHVzZWQgd2l0aCB0aGUgQHZhcntwY30sIHRoZQorQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkICh3aXRoIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9taXR0aW5nIHRoZQorQHZhcntudW1iZXJ9IHByb2R1Y2VzIEFkZHJlc3MgUmVnaXN0ZXIgSW5kaXJlY3QgbW9kZSkuCisKK0BpdGVtIEluZGV4CitAc2FtcHtAdmFye251bWJlcn0oQHZhcnthcGN9LEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX0pfQorCitUaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLCBvciBpdCBtYXkgYXBwZWFyIHdpdGhpbiB0aGUKK3BhcmVudGhlc2VzLiAgVGhlIEB2YXJ7YXBjfSBtYXkgYmUgb21pdHRlZC4gIFRoZSBAdmFye3JlZ2lzdGVyfSBhbmQgdGhlCitAdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoIEB2YXJ7YXBjfSBhbmQKK0B2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9IGFuZCBAdmFye3NjYWxlfQorYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQKK3RoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgorCitAaXRlbSBQb3N0aW5kZXgKK0BzYW1weyhbQHZhcntudW1iZXJ9LEB2YXJ7YXBjfV0sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfSxAdmFye29udW1iZXJ9KX0KKworVGhlIEB2YXJ7b251bWJlcn0sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYm90aCwgbWF5IGJlIG9taXR0ZWQuCitFaXRoZXIgdGhlIEB2YXJ7bnVtYmVyfSBvciB0aGUgQHZhcnthcGN9IG1heSBiZSBvbWl0dGVkLCBidXQgbm90IGJvdGguCisKK0BpdGVtIFByZWluZGV4CitAc2FtcHsoW0B2YXJ7bnVtYmVyfSxAdmFye2FwY30sQHZhcntyZWdpc3Rlcn0uQHZhcntzaXplfSpAdmFye3NjYWxlfV0sQHZhcntvbnVtYmVyfSl9CisKK1RoZSBAdmFye251bWJlcn0sIG9yIHRoZSBAdmFye2FwY30sIG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgb3IgYW55IHR3byBvZgordGhlbSwgbWF5IGJlIG9taXR0ZWQuICBUaGUgQHZhcntvbnVtYmVyfSBtYXkgYmUgb21pdHRlZC4gIFRoZQorQHZhcntyZWdpc3Rlcn0gYW5kIHRoZSBAdmFye2FwY30gbWF5IGFwcGVhciBpbiBlaXRoZXIgb3JkZXIuICBJZiBib3RoCitAdmFye2FwY30gYW5kIEB2YXJ7cmVnaXN0ZXJ9IGFyZSBhZGRyZXNzIHJlZ2lzdGVycywgYW5kIHRoZSBAdmFye3NpemV9CithbmQgQHZhcntzY2FsZX0gYXJlIG9taXR0ZWQsIHRoZW4gdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHRha2VuIGFzIHRoZQorYmFzZSByZWdpc3RlciwgYW5kIHRoZSBzZWNvbmQgYXMgdGhlIGluZGV4IHJlZ2lzdGVyLgorQGVuZCB0YWJsZQorCitAbm9kZSBNNjhLLUZsb2F0CitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBNNjgweDAKK0BjaW5kZXggTTY4MHgwIGZsb2F0aW5nIHBvaW50CitQYWNrZWQgZGVjaW1hbCAoUCkgZm9ybWF0IGZsb2F0aW5nIGxpdGVyYWxzIGFyZSBub3Qgc3VwcG9ydGVkLgorRmVlbCBmcmVlIHRvIGFkZCB0aGUgY29kZSEKKworVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGRpcmVjdGl2ZXMgYXJlIHRoZXNlLgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZSwgTTY4MHgwCitAaXRlbSAuZmxvYXQKK0Bjb2Rle1NpbmdsZX0gcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KKworQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgTTY4MHgwCitAaXRlbSAuZG91YmxlCitAY29kZXtEb3VibGV9IHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCisKK0BjaW5kZXggQGNvZGV7ZXh0ZW5kfSBkaXJlY3RpdmUgTTY4MHgwCitAY2luZGV4IEBjb2Rle2xkb3VibGV9IGRpcmVjdGl2ZSBNNjgweDAKK0BpdGVtIC5leHRlbmQKK0BpdGVteCAubGRvdWJsZQorQGNvZGV7RXh0ZW5kZWR9IHByZWNpc2lvbiAoQGNvZGV7bG9uZyBkb3VibGV9KSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCitAZW5kIHRhYmxlCisKK0Bub2RlIE02OEstRGlyZWN0aXZlcworQHNlY3Rpb24gNjgweDAgTWFjaGluZSBEaXJlY3RpdmVzCisKK0BjaW5kZXggTTY4MHgwIGRpcmVjdGl2ZXMKK0BjaW5kZXggZGlyZWN0aXZlcywgTTY4MHgwCitJbiBvcmRlciB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIFN1biBhc3NlbWJsZXIgdGhlIDY4MHgwIGFzc2VtYmxlcgordW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzLgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7ZGF0YTF9IGRpcmVjdGl2ZSwgTTY4MHgwCitAaXRlbSAuZGF0YTEKK1RoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5kYXRhIDF9IGRpcmVjdGl2ZS4KKworQGNpbmRleCBAY29kZXtkYXRhMn0gZGlyZWN0aXZlLCBNNjgweDAKK0BpdGVtIC5kYXRhMgorVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LmRhdGEgMn0gZGlyZWN0aXZlLgorCitAY2luZGV4IEBjb2Rle2V2ZW59IGRpcmVjdGl2ZSwgTTY4MHgwCitAaXRlbSAuZXZlbgorVGhpcyBkaXJlY3RpdmUgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIEBjb2Rley5hbGlnbn0gZGlyZWN0aXZlOyBpdAorYWxpZ25zIHRoZSBvdXRwdXQgdG8gYW4gZXZlbiBieXRlIGJvdW5kYXJ5LgorCitAY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZSwgTTY4MHgwCitAaXRlbSAuc2tpcAorVGhpcyBkaXJlY3RpdmUgaXMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCitAZW5kIHRhYmxlCisKK0BuZWVkIDIwMDAKK0Bub2RlIE02OEstb3Bjb2RlcworQHNlY3Rpb24gT3Bjb2RlcworCitAY2luZGV4IE02ODB4MCBvcGNvZGVzCitAY2luZGV4IG9wY29kZXMsIE02ODB4MAorQGNpbmRleCBpbnN0cnVjdGlvbiBzZXQsIE02ODB4MAorQGMgZG9jQGN5Z251cy5jb206IEkgZG9uJ3Qgc2VlIGFueSBwb2ludCBpbiB0aGUgZm9sbG93aW5nCitAYyAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguICBCdWdzIGFyZSBidWdzOyBob3cgZG9lcyBzYXlpbmcgdGhpcworQGMgICAgICAgICAgICAgICAgICAgaGVscCBhbnlvbmU/CitAaWdub3JlCitEYW5nZXI6ICBTZXZlcmFsIGJ1Z3MgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBvcGNvZGUgdGFibGUgKGFuZAorZml4ZWQpLiAgTW9yZSBidWdzIG1heSBleGlzdC4gIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBvYnNjdXJlCitpbnN0cnVjdGlvbnMuCitAZW5kIGlnbm9yZQorCitAbWVudQorKiBNNjhLLUJyYW5jaDo6ICAgICAgICAgICAgICAgICBCcmFuY2ggSW1wcm92ZW1lbnQKKyogTTY4Sy1DaGFyczo6ICAgICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCitAZW5kIG1lbnUKKworQG5vZGUgTTY4Sy1CcmFuY2gKK0BzdWJzZWN0aW9uIEJyYW5jaCBJbXByb3ZlbWVudAorCitAY2luZGV4IHBzZXVkby1vcGNvZGVzLCBNNjgweDAKK0BjaW5kZXggTTY4MHgwIHBzZXVkby1vcGNvZGVzCitAY2luZGV4IGJyYW5jaCBpbXByb3ZlbWVudCwgTTY4MHgwCitAY2luZGV4IE02ODB4MCBicmFuY2ggaW1wcm92ZW1lbnQKK0NlcnRhaW4gcHNldWRvIG9wY29kZXMgYXJlIHBlcm1pdHRlZCBmb3IgYnJhbmNoIGluc3RydWN0aW9ucy4KK1RoZXkgZXhwYW5kIHRvIHRoZSBzaG9ydGVzdCBicmFuY2ggaW5zdHJ1Y3Rpb24gdGhhdCByZWFjaCB0aGUKK3RhcmdldC4gIEdlbmVyYWxseSB0aGVzZSBtbmVtb25pY3MgYXJlIG1hZGUgYnkgc3Vic3RpdHV0aW5nIEBzYW1we2p9IGZvcgorQHNhbXB7Yn0gYXQgdGhlIHN0YXJ0IG9mIGEgTW90b3JvbGEgbW5lbW9uaWMuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgcHNldWRvLW9wZXJhdGlvbnMuICBBIEBjb2Rleyp9IGZsYWdzCitjYXNlcyB0aGF0IGFyZSBtb3JlIGZ1bGx5IGRlc2NyaWJlZCBhZnRlciB0aGUgdGFibGU6CisKK0BzbWFsbGV4YW1wbGUKKyAgICAgICAgICBEaXNwbGFjZW1lbnQKKyAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIHwgICAgICAgICAgICAgICAgNjgwMjAgICA2ODAwMC8xMAorUHNldWRvLU9wIHxCWVRFICAgIFdPUkQgICAgTE9ORyAgICBMT05HICAgICAgbm9uLVBDIHJlbGF0aXZlCisgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgamJzciB8YnNycyAgICBic3IgICAgIGJzcmwgICAganNyICAgICAgIGpzcgorICAgICAganJhIHxicmFzICAgIGJyYSAgICAgYnJhbCAgICBqbXAgICAgICAgam1wCisqICAgICBqWFggfGJYWHMgICAgYlhYICAgICBiWFhsICAgIGJOWHM7am1wbCBiTlhzO2ptcAorKiAgICBkYlhYIHxkYlhYICAgIGRiWFggICAgICAgIGRiWFg7IGJyYTsgam1wbAorKiAgICBmalhYIHxmYlhYdyAgIGZiWFh3ICAgZmJYWGwgICAgICAgICAgICAgZmJOWHc7am1wCisKK1hYOiBjb25kaXRpb24KK05YOiBuZWdhdGl2ZSBvZiBjb25kaXRpb24gWFgKKworQGVuZCBzbWFsbGV4YW1wbGUKK0BjZW50ZXIgQGNvZGV7Kn0tLS1zZWUgZnVsbCBkZXNjcmlwdGlvbiBiZWxvdworCitAdGFibGUgQGNvZGUKK0BpdGVtIGpic3IKK0BpdGVteCBqcmEKK1RoZXNlIGFyZSB0aGUgc2ltcGxlc3QganVtcCBwc2V1ZG8tb3BlcmF0aW9uczsgdGhleSBhbHdheXMgbWFwIHRvIG9uZQorcGFydGljdWxhciBtYWNoaW5lIGluc3RydWN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIGRpc3BsYWNlbWVudCB0byB0aGUKK2JyYW5jaCB0YXJnZXQuCisKK0BpdGVtIGpAdmFye1hYfQorSGVyZSwgQHNhbXB7akB2YXJ7WFh9fSBzdGFuZHMgZm9yIGFuIGVudGlyZSBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMsCit3aGVyZSBAdmFye1hYfSBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvciBjb25kaXRpb24tY29kZSB0ZXN0LiAgVGhlIGZ1bGwKK2xpc3Qgb2YgcHNldWRvLW9wcyBpbiB0aGlzIGZhbWlseSBpczoKK0BzbWFsbGV4YW1wbGUKKyBqaGkgICBqbHMgICBqY2MgICBqY3MgICBqbmUgICBqZXEgICBqdmMKKyBqdnMgICBqcGwgICBqbWkgICBqZ2UgICBqbHQgICBqZ3QgICBqbGUKK0BlbmQgc21hbGxleGFtcGxlCisKK0ZvciB0aGUgY2FzZXMgb2Ygbm9uLVBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYW5kIGxvbmcgZGlzcGxhY2VtZW50cyBvbgordGhlIDY4MDAwIG9yIDY4MDEwLCBAY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSBsb25nZXIgY29kZSBmcmFnbWVudCBpbiB0ZXJtcyBvZgorQHZhcntOWH0sIHRoZSBvcHBvc2l0ZSBjb25kaXRpb24gdG8gQHZhcntYWH0uICBGb3IgZXhhbXBsZSwgZm9yIHRoZQorbm9uLVBDIHJlbGF0aXZlIGNhc2U6CitAc21hbGxleGFtcGxlCisgICAgakB2YXJ7WFh9IGZvbworQGVuZCBzbWFsbGV4YW1wbGUKK2dpdmVzCitAc21hbGxleGFtcGxlCisgICAgIGJAdmFye05YfXMgb29mCisgICAgIGptcCBmb28KKyBvb2Y6CitAZW5kIHNtYWxsZXhhbXBsZQorCitAaXRlbSBkYkB2YXJ7WFh9CitUaGUgZnVsbCBmYW1pbHkgb2YgcHNldWRvLW9wZXJhdGlvbnMgY292ZXJlZCBoZXJlIGlzCitAc21hbGxleGFtcGxlCisgZGJoaSAgIGRibHMgICBkYmNjICAgZGJjcyAgIGRibmUgICBkYmVxICAgZGJ2YworIGRidnMgICBkYnBsICAgZGJtaSAgIGRiZ2UgICBkYmx0ICAgZGJndCAgIGRibGUKKyBkYmYgICAgZGJyYSAgIGRidAorQGVuZCBzbWFsbGV4YW1wbGUKKworT3RoZXIgdGhhbiBmb3Igd29yZCBhbmQgYnl0ZSBkaXNwbGFjZW1lbnRzLCB3aGVuIHRoZSBzb3VyY2UgcmVhZHMKK0BzYW1we2RiQHZhcntYWH0gZm9vfSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKK0BzbWFsbGV4YW1wbGUKKyAgICAgZGJAdmFye1hYfSBvbzEKKyAgICAgYnJhIG9vMgorIG9vMTpqbXBsIGZvbworIG9vMjoKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIGZqQHZhcntYWH0KK1RoaXMgZmFtaWx5IGluY2x1ZGVzCitAc21hbGxleGFtcGxlCisgZmpuZSAgIGZqZXEgICBmamdlICAgZmpsdCAgIGZqZ3QgICBmamxlICAgZmpmCisgZmp0ICAgIGZqZ2wgICBmamdsZSAgZmpuZ2UgIGZqbmdsICBmam5nbGUgZmpuZ3QKKyBmam5sZSAgZmpubHQgIGZqb2dlICBmam9nbCAgZmpvZ3QgIGZqb2xlICBmam9sdAorIGZqb3IgICBmanNlcSAgZmpzZiAgIGZqc25lICBmanN0ICAgZmp1ZXEgIGZqdWdlCisgZmp1Z3QgIGZqdWxlICBmanVsdCAgZmp1bgorQGVuZCBzbWFsbGV4YW1wbGUKKworRm9yIGJyYW5jaCB0YXJnZXRzIHRoYXQgYXJlIG5vdCBQQyByZWxhdGl2ZSwgQGNvZGV7QHZhbHVle0FTfX0gZW1pdHMKK0BzbWFsbGV4YW1wbGUKKyAgICAgZmJAdmFye05YfSBvb2YKKyAgICAgam1wIGZvbworIG9vZjoKK0BlbmQgc21hbGxleGFtcGxlCit3aGVuIGl0IGVuY291bnRlcnMgQHNhbXB7ZmpAdmFye1hYfSBmb299LgorCitAZW5kIHRhYmxlCisKK0Bub2RlIE02OEstQ2hhcnMKK0BzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycworCitAY2luZGV4IHNwZWNpYWwgY2hhcmFjdGVycywgTTY4MHgwCitAY2luZGV4IE02ODB4MCBpbW1lZGlhdGUgY2hhcmFjdGVyCitAY2luZGV4IGltbWVkaWF0ZSBjaGFyYWN0ZXIsIE02ODB4MAorQGNpbmRleCBNNjgweDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgorQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBNNjgweDAKK0BjaW5kZXggY29tbWVudHMsIE02ODB4MAorVGhlIGltbWVkaWF0ZSBjaGFyYWN0ZXIgaXMgQHNhbXB7I30gZm9yIFN1biBjb21wYXRpYmlsaXR5LiAgVGhlCitsaW5lLWNvbW1lbnQgY2hhcmFjdGVyIGlzIEBzYW1we3x9ICh1bmxlc3MgdGhlIEBzYW1wey0tYml0d2lzZS1vcn0KK29wdGlvbiBpcyB1c2VkKS4gIElmIGEgQHNhbXB7I30gYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgaXQKK2lzIHRyZWF0ZWQgYXMgYSBjb21tZW50IHVubGVzcyBpdCBsb29rcyBsaWtlIEBzYW1weyMgbGluZSBmaWxlfSwgaW4KK3doaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBub3JtYWxseS4KKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW1pcHMudGV4aSBiL2dhcy9kb2MvYy1taXBzLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzZGRhMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1taXBzLnRleGkKQEAgLTAsMCArMSwyNTcgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitAYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCitAYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KK0BpZnNldCBHRU5FUklDCitAcGFnZQorQG5vZGUgTUlQUy1EZXBlbmRlbnQKK0BjaGFwdGVyIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IE1JUFMgcHJvY2Vzc29yCitAc2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSBmb3IgQHNje21pcHN9IGFyY2hpdGVjdHVyZXMgc3VwcG9ydHMgc2V2ZXJhbAorZGlmZmVyZW50IEBzY3ttaXBzfSBwcm9jZXNzb3JzLCBhbmQgTUlQUyBJU0EgbGV2ZWxzIEkgdGhyb3VnaCBJVi4gIEZvcgoraW5mb3JtYXRpb24gYWJvdXQgdGhlIEBzY3ttaXBzfSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtNSVBTIFJJU0MKK0FyY2hpdGVjdHVyZX0sIGJ5IEthbmUgYW5kIEhlaW5kcmljaCAoUHJlbnRpY2UtSGFsbCkuICBGb3IgYW4gb3ZlcnZpZXcKK29mIEBzY3ttaXBzfSBhc3NlbWJseSBjb252ZW50aW9ucywgc2VlIGBgQXBwZW5kaXggRDogQXNzZW1ibHkgTGFuZ3VhZ2UKK1Byb2dyYW1taW5nJycgaW4gdGhlIHNhbWUgd29yay4KKworQG1lbnUKKyogTUlQUyBPcHRzOjogICAJQXNzZW1ibGVyIG9wdGlvbnMKKyogTUlQUyBPYmplY3Q6OiAJRUNPRkYgb2JqZWN0IGNvZGUKKyogTUlQUyBTdGFiczo6ICAJRGlyZWN0aXZlcyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCisqIE1JUFMgSVNBOjogICAgCURpcmVjdGl2ZXMgdG8gb3ZlcnJpZGUgdGhlIElTQSBsZXZlbAorKiBNSVBTIGF1dG9leHRlbmQ6OglEaXJlY3RpdmVzIGZvciBleHRlbmRpbmcgTUlQUyAxNiBiaXQgaW5zdHJ1Y3Rpb25zCisqIE1JUFMgaW5zbjo6CQlEaXJlY3RpdmUgdG8gbWFyayBkYXRhIGFzIGFuIGluc3RydWN0aW9uCisqIE1JUFMgb3B0aW9uIHN0YWNrOjoJRGlyZWN0aXZlcyB0byBzYXZlIGFuZCByZXN0b3JlIG9wdGlvbnMKK0BlbmQgbWVudQorCitAbm9kZSBNSVBTIE9wdHMKK0BzZWN0aW9uIEFzc2VtYmxlciBvcHRpb25zCisKK1RoZSBAc2N7bWlwc30gY29uZmlndXJhdGlvbnMgb2YgQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydCB0aGVzZQorc3BlY2lhbCBvcHRpb25zOgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7LUd9IG9wdGlvbiAoTUlQUykKK0BpdGVtIC1HIEB2YXJ7bnVtfQorVGhpcyBvcHRpb24gc2V0cyB0aGUgbGFyZ2VzdCBzaXplIG9mIGFuIG9iamVjdCB0aGF0IGNhbiBiZSByZWZlcmVuY2VkCitpbXBsaWNpdGx5IHdpdGggdGhlIEBjb2Rle2dwfSByZWdpc3Rlci4gIEl0IGlzIG9ubHkgYWNjZXB0ZWQgZm9yIHRhcmdldHMKK3RoYXQgdXNlIEBzY3tlY29mZn0gZm9ybWF0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4KKworQGNpbmRleCBAY29kZXstRUJ9IG9wdGlvbiAoTUlQUykKK0BjaW5kZXggQGNvZGV7LUVMfSBvcHRpb24gKE1JUFMpCitAY2luZGV4IE1JUFMgYmlnLWVuZGlhbiBvdXRwdXQKK0BjaW5kZXggTUlQUyBsaXR0bGUtZW5kaWFuIG91dHB1dAorQGNpbmRleCBiaWctZW5kaWFuIG91dHB1dCwgTUlQUworQGNpbmRleCBsaXR0bGUtZW5kaWFuIG91dHB1dCwgTUlQUworQGl0ZW0gLUVCCitAaXRlbXggLUVMCitBbnkgQHNje21pcHN9IGNvbmZpZ3VyYXRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gY2FuIHNlbGVjdCBiaWctZW5kaWFuIG9yCitsaXR0bGUtZW5kaWFuIG91dHB1dCBhdCBydW4gdGltZSAodW5saWtlIHRoZSBvdGhlciBAc2N7Z251fSBkZXZlbG9wbWVudAordG9vbHMsIHdoaWNoIG11c3QgYmUgY29uZmlndXJlZCBmb3Igb25lIG9yIHRoZSBvdGhlcikuICBVc2UgQHNhbXB7LUVCfQordG8gc2VsZWN0IGJpZy1lbmRpYW4gb3V0cHV0LCBhbmQgQHNhbXB7LUVMfSBmb3IgbGl0dGxlLWVuZGlhbi4KKworQGNpbmRleCBNSVBTIGFyY2hpdGVjdHVyZSBvcHRpb25zCitAaXRlbSAtbWlwczEKK0BpdGVteCAtbWlwczIKK0BpdGVteCAtbWlwczMKK0BpdGVteCAtbWlwczQKK0dlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwuCitAc2FtcHstbWlwczF9IGNvcnJlc3BvbmRzIHRvIHRoZSBAc2N7cjIwMDB9IGFuZCBAc2N7cjMwMDB9IHByb2Nlc3NvcnMsCitAc2FtcHstbWlwczJ9IHRvIHRoZSBAc2N7cjYwMDB9IHByb2Nlc3NvciwgQHNhbXB7LW1pcHMzfSB0byB0aGUKK0BzY3tyNDAwMH0gcHJvY2Vzc29yLCBhbmQgQHNhbXB7LW1pcHM0fSB0byB0aGUgQHNje3I4MDAwfSBhbmQKK0BzY3tyMTAwMDB9IHByb2Nlc3NvcnMuICBZb3UgY2FuIGFsc28gc3dpdGNoIGluc3RydWN0aW9uIHNldHMgZHVyaW5nIHRoZQorYXNzZW1ibHk7IHNlZSBAcmVme01JUFMgSVNBLCwgRGlyZWN0aXZlcyB0byBvdmVycmlkZSB0aGUgSVNBIGxldmVsfS4KKworQGl0ZW0gLW1pcHMxNgorQGl0ZW14IC1uby1taXBzMTYKK0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIDE2IHByb2Nlc3Nvci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBwdXR0aW5nCitAc2FtcHsuc2V0IG1pcHMxNn0gYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSBmaWxlLiAgQHNhbXB7LW5vLW1pcHMxNn0KK3R1cm5zIG9mZiB0aGlzIG9wdGlvbi4KKworQGl0ZW0gLW00MDEwCitAaXRlbXggLW5vLW00MDEwCitHZW5lcmF0ZSBjb2RlIGZvciB0aGUgTFNJIEBzY3tyNDAxMH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0bworYWNjZXB0IHRoZSBAc2N7cjQwMTB9IHNwZWNpZmljIGluc3RydWN0aW9ucyAoQHNhbXB7YWRkY2l1fSwgQHNhbXB7ZmZjfSwKK2V0Yy4pLCBhbmQgdG8gbm90IHNjaGVkdWxlIEBzYW1we25vcH0gaW5zdHJ1Y3Rpb25zIGFyb3VuZCBhY2Nlc3NlcyB0bwordGhlIEBzYW1we0hJfSBhbmQgQHNhbXB7TE99IHJlZ2lzdGVycy4gIEBzYW1wey1uby1tNDAxMH0gdHVybnMgb2ZmIHRoaXMKK29wdGlvbi4KKworQGl0ZW0gLW00NjUwCitAaXRlbXggLW5vLW00NjUwCitHZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUyBAc2N7cjQ2NTB9IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0Cit0aGUgQHNhbXB7bWFkfSBhbmQgQHNhbXB7bWFkdX0gaW5zdHJ1Y3Rpb24sIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfQoraW5zdHJ1Y3Rpb25zIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLgorQHNhbXB7LW5vLW00NjUwfSB0dXJucyBvZmYgdGhpcyBvcHRpb24uCisKK0BpdGVteCAtbTM5MDAKK0BpdGVteCAtbm8tbTM5MDAKK0BpdGVteCAtbTQxMDAKK0BpdGVteCAtbm8tbTQxMDAKK0ZvciBlYWNoIG9wdGlvbiBAc2FtcHstbUB2YXJ7bm5ubn19LCBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgTUlQUworQHNje3JAdmFye25ubm59fSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCBpbnN0cnVjdGlvbnMKK3NwZWNpZmljIHRvIHRoYXQgY2hpcCwgYW5kIHRvIHNjaGVkdWxlIGZvciB0aGF0IGNoaXAncyBoYXphcmRzLgorCitAaXRlbSAtbWNwdT1AdmFye2NwdX0KK0dlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBNSVBTIGNwdS4gIEl0IGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0bworQHNhbXB7LW1AdmFye2NwdX19LCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgbW9yZSB2YWx1ZSBvZiBAdmFye2NwdX0KK3VuZGVyc3Rvb2QuICBWYWxpZCBAdmFye2NwdX0gdmFsdWUgYXJlOgorCitAcXVvdGF0aW9uCisyMDAwLAorMzAwMCwKKzM5MDAsCis0MDAwLAorNDAxMCwKKzQxMDAsCis0MTExLAorNDMwMCwKKzQ0MDAsCis0NjAwLAorNDY1MCwKKzUwMDAsCis2MDAwLAorODAwMCwKKzEwMDAwCitAZW5kIHF1b3RhdGlvbgorCisKK0BjaW5kZXggQGNvZGV7LW5vY3BwfSBpZ25vcmVkIChNSVBTKQorQGl0ZW0gLW5vY3BwCitUaGlzIG9wdGlvbiBpcyBpZ25vcmVkLiAgSXQgaXMgYWNjZXB0ZWQgZm9yIGNvbW1hbmQtbGluZSBjb21wYXRpYmlsaXR5IHdpdGgKK290aGVyIGFzc2VtYmxlcnMsIHdoaWNoIHVzZSBpdCB0byB0dXJuIG9mZiBDIHN0eWxlIHByZXByb2Nlc3NpbmcuICBXaXRoCitAc2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgQHNhbXB7LW5vY3BwfSwgYmVjYXVzZSB0aGUKK0BzY3tnbnV9IGFzc2VtYmxlciBpdHNlbGYgbmV2ZXIgcnVucyB0aGUgQyBwcmVwcm9jZXNzb3IuCisKK0BpdGVtIC0tdHJhcAorQGl0ZW14IC0tbm8tYnJlYWsKK0BjIEZJWE1FISAgKDEpIHJlZmxlY3QgdGhlc2Ugb3B0aW9ucyAobmV4dCBpdGVtIHRvbykgaW4gb3B0aW9uIHN1bW1hcmllczsKK0BjICAgICAgICAgKDIpIHN0b3AgdGVhc2luZywgc2F5IF93aGljaF8gaW5zdHJ1Y3Rpb25zIGV4cGFuZGVkIF9ob3dfLgorQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseSBtYWNybyBleHBhbmRzIGNlcnRhaW4gZGl2aXNpb24gYW5kCittdWx0aXBsaWNhdGlvbiBpbnN0cnVjdGlvbnMgdG8gY2hlY2sgZm9yIG92ZXJmbG93IGFuZCBkaXZpc2lvbiBieSB6ZXJvLiAgVGhpcworb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBnZW5lcmF0ZSBjb2RlIHRvIHRha2UgYSB0cmFwIGV4Y2VwdGlvbgorcmF0aGVyIHRoYW4gYSBicmVhayBleGNlcHRpb24gd2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gIFRoZSB0cmFwIGluc3RydWN0aW9ucworYXJlIG9ubHkgc3VwcG9ydGVkIGF0IEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgMiBhbmQgaGlnaGVyLgorCitAaXRlbSAtLWJyZWFrCitAaXRlbXggLS1uby10cmFwCitHZW5lcmF0ZSBjb2RlIHRvIHRha2UgYSBicmVhayBleGNlcHRpb24gcmF0aGVyIHRoYW4gYSB0cmFwIGV4Y2VwdGlvbiB3aGVuIGFuCitlcnJvciBpcyBkZXRlY3RlZC4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCitAZW5kIHRhYmxlCisKK0Bub2RlIE1JUFMgT2JqZWN0CitAc2VjdGlvbiBNSVBTIEVDT0ZGIG9iamVjdCBjb2RlCisKK0BjaW5kZXggRUNPRkYgc2VjdGlvbnMKK0BjaW5kZXggTUlQUyBFQ09GRiBzZWN0aW9ucworQXNzZW1ibGluZyBmb3IgYSBAc2N7bWlwc30gQHNje2Vjb2ZmfSB0YXJnZXQgc3VwcG9ydHMgc29tZSBhZGRpdGlvbmFsIHNlY3Rpb25zCitiZXNpZGVzIHRoZSB1c3VhbCBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSBhbmQgQGNvZGV7LmJzc30uICBUaGUKK2FkZGl0aW9uYWwgc2VjdGlvbnMgYXJlIEBjb2Rley5yZGF0YX0sIHVzZWQgZm9yIHJlYWQtb25seSBkYXRhLAorQGNvZGV7LnNkYXRhfSwgdXNlZCBmb3Igc21hbGwgZGF0YSwgYW5kIEBjb2Rley5zYnNzfSwgdXNlZCBmb3Igc21hbGwKK2NvbW1vbiBvYmplY3RzLgorCitAY2luZGV4IHNtYWxsIG9iamVjdHMsIE1JUFMgRUNPRkYKK0BjaW5kZXggQGNvZGV7Z3B9IHJlZ2lzdGVyLCBNSVBTCitXaGVuIGFzc2VtYmxpbmcgZm9yIEBzY3tlY29mZn0sIHRoZSBhc3NlbWJsZXIgdXNlcyB0aGUgQGNvZGV7JGdwfSAoQGNvZGV7JDI4fSkKK3JlZ2lzdGVyIHRvIGZvcm0gdGhlIGFkZHJlc3Mgb2YgYSBgYHNtYWxsIG9iamVjdCcnLiAgQW55IG9iamVjdCBpbiB0aGUKK0Bjb2Rley5zZGF0YX0gb3IgQGNvZGV7LnNic3N9IHNlY3Rpb25zIGlzIGNvbnNpZGVyZWQgYGBzbWFsbCcnIGluIHRoaXMgc2Vuc2UuCitGb3IgZXh0ZXJuYWwgb2JqZWN0cywgb3IgZm9yIG9iamVjdHMgaW4gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24sIHlvdSBjYW4gdXNlCit0aGUgQGNvZGV7QHZhbHVle0dDQ319IEBzYW1wey1HfSBvcHRpb24gdG8gY29udHJvbCB0aGUgc2l6ZSBvZiBvYmplY3RzIGFkZHJlc3NlZCB2aWEKK0Bjb2RleyRncH07IHRoZSBkZWZhdWx0IHZhbHVlIGlzIDgsIG1lYW5pbmcgdGhhdCBhIHJlZmVyZW5jZSB0byBhbnkgb2JqZWN0CitlaWdodCBieXRlcyBvciBzbWFsbGVyIHVzZXMgQGNvZGV7JGdwfS4gIFBhc3NpbmcgQHNhbXB7LUcgMH0gdG8KK0Bjb2Rle0B2YWx1ZXtBU319IHByZXZlbnRzIGl0IGZyb20gdXNpbmcgdGhlIEBjb2RleyRncH0gcmVnaXN0ZXIgb24gdGhlIGJhc2lzCitvZiBvYmplY3Qgc2l6ZSAoYnV0IHRoZSBhc3NlbWJsZXIgdXNlcyBAY29kZXskZ3B9IGZvciBvYmplY3RzIGluIEBjb2Rley5zZGF0YX0KK29yIEBjb2Rle3Nic3N9IGluIGFueSBjYXNlKS4gIFRoZSBzaXplIG9mIGFuIG9iamVjdCBpbiB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbgoraXMgc2V0IGJ5IHRoZSBAY29kZXsuY29tbX0gb3IgQGNvZGV7Lmxjb21tfSBkaXJlY3RpdmUgdGhhdCBkZWZpbmVzIGl0LiAgVGhlCitzaXplIG9mIGFuIGV4dGVybmFsIG9iamVjdCBtYXkgYmUgc2V0IHdpdGggdGhlIEBjb2Rley5leHRlcm59IGRpcmVjdGl2ZS4gIEZvcgorZXhhbXBsZSwgQHNhbXB7LmV4dGVybiBzeW0sNH0gZGVjbGFyZXMgdGhhdCB0aGUgb2JqZWN0IGF0IEBjb2Rle3N5bX0gaXMgNCBieXRlcworaW4gbGVuZ3RoLCB3aGllIGxlYXZpbmcgQGNvZGV7c3ltfSBvdGhlcndpc2UgdW5kZWZpbmVkLgorCitVc2luZyBzbWFsbCBAc2N7ZWNvZmZ9IG9iamVjdHMgcmVxdWlyZXMgbGlua2VyIHN1cHBvcnQsIGFuZCBhc3N1bWVzIHRoYXQgdGhlCitAY29kZXskZ3B9IHJlZ2lzdGVyIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCAobm9ybWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5Cit0aGUgc3RhcnR1cCBjb2RlKS4gIEBzY3ttaXBzfSBAc2N7ZWNvZmZ9IGFzc2VtYmx5IGNvZGUgbXVzdCBub3QgbW9kaWZ5IHRoZQorQGNvZGV7JGdwfSByZWdpc3Rlci4KKworQG5vZGUgTUlQUyBTdGFicworQHNlY3Rpb24gRGlyZWN0aXZlcyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCisKK0BjaW5kZXggTUlQUyBkZWJ1Z2dpbmcgZGlyZWN0aXZlcworQHNje21pcHN9IEBzY3tlY29mZn0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgc2V2ZXJhbCBkaXJlY3RpdmVzIHVzZWQgZm9yCitnZW5lcmF0aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCBhcmUgbm90IHN1cHBvcnQgYnkgdHJhZGl0aW9uYWwgQHNje21pcHN9Cithc3NlbWJsZXJzLiAgVGhlc2UgYXJlIEBjb2Rley5kZWZ9LCBAY29kZXsuZW5kZWZ9LCBAY29kZXsuZGltfSwgQGNvZGV7LmZpbGV9LAorQGNvZGV7LnNjbH0sIEBjb2Rley5zaXplfSwgQGNvZGV7LnRhZ30sIEBjb2Rley50eXBlfSwgQGNvZGV7LnZhbH0sCitAY29kZXsuc3RhYmR9LCBAY29kZXsuc3RhYm59LCBhbmQgQGNvZGV7LnN0YWJzfS4gIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KK2dlbmVyYXRlZCBieSB0aGUgdGhyZWUgQGNvZGV7LnN0YWJ9IGRpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgcmVhZCBieSBAc2N7Z2RifSwKK25vdCBieSB0cmFkaXRpb25hbCBAc2N7bWlwc30gZGVidWdnZXJzICh0aGlzIGVuaGFuY2VtZW50IGlzIHJlcXVpcmVkIHRvIGZ1bGx5CitzdXBwb3J0IEMrKyBkZWJ1Z2dpbmcpLiAgVGhlc2UgZGlyZWN0aXZlcyBhcmUgcHJpbWFyaWx5IHVzZWQgYnkgY29tcGlsZXJzLCBub3QKK2Fzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzIQorCitAbm9kZSBNSVBTIElTQQorQHNlY3Rpb24gRGlyZWN0aXZlcyB0byBvdmVycmlkZSB0aGUgSVNBIGxldmVsCisKK0BjaW5kZXggTUlQUyBJU0Egb3ZlcnJpZGUKK0BraW5kZXggQGNvZGV7LnNldCBtaXBzQHZhcntufX0KK0BzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIGFuIGFkZGl0aW9uYWwgZGlyZWN0aXZlIHRvIGNoYW5nZQordGhlIEBzY3ttaXBzfSBJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlIGxldmVsIG9uIHRoZSBmbHk6IEBjb2Rley5zZXQKK21pcHNAdmFye259fS4gIEB2YXJ7bn0gc2hvdWxkIGJlIGEgbnVtYmVyIGZyb20gMCB0byA0LiAgQSB2YWx1ZSBmcm9tIDEKK3RvIDQgbWFrZXMgdGhlIGFzc2VtYmxlciBhY2NlcHQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZworQHNje2lzYX0gbGV2ZWwsIGZyb20gdGhhdCBwb2ludCBvbiBpbiB0aGUgYXNzZW1ibHkuICBAY29kZXsuc2V0CittaXBzQHZhcntufX0gYWZmZWN0cyBub3Qgb25seSB3aGljaCBpbnN0cnVjdGlvbnMgYXJlIHBlcm1pdHRlZCwgYnV0IGFsc28KK2hvdyBjZXJ0YWluIG1hY3JvcyBhcmUgZXhwYW5kZWQuICBAY29kZXsuc2V0IG1pcHMwfSByZXN0b3JlcyB0aGUKK0BzY3tpc2F9IGxldmVsIHRvIGl0cyBvcmlnaW5hbCBsZXZlbDogZWl0aGVyIHRoZSBsZXZlbCB5b3Ugc2VsZWN0ZWQgd2l0aAorY29tbWFuZCBsaW5lIG9wdGlvbnMsIG9yIHRoZSBkZWZhdWx0IGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uICBZb3UgY2FuCit1c2UgdGhpcyBmZWF0dXJlIHRvIHBlcm1pdCBzcGVjaWZpYyBAc2N7cjQwMDB9IGluc3RydWN0aW9ucyB3aGlsZQorYXNzZW1ibGluZyBpbiAzMiBiaXQgbW9kZS4gIFVzZSB0aGlzIGRpcmVjdGl2ZSB3aXRoIGNhcmUhCisKK1RoZSBkaXJlY3RpdmUgQHNhbXB7LnNldCBtaXBzMTZ9IHB1dHMgdGhlIGFzc2VtYmxlciBpbnRvIE1JUFMgMTYgbW9kZSwKK2luIHdoaWNoIGl0IHdpbGwgYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgTUlQUyAxNiBwcm9jZXNzb3IuICBVc2UKK0BzYW1wey5zZXQgbm9taXBzMTZ9IHRvIHJldHVybiB0byBub3JtYWwgMzIgYml0IG1vZGUuCisKK1RyYWRpdGlvbmFsIEBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlLiAgCisKK0Bub2RlIE1JUFMgYXV0b2V4dGVuZAorQHNlY3Rpb24gRGlyZWN0aXZlcyBmb3IgZXh0ZW5kaW5nIE1JUFMgMTYgYml0IGluc3RydWN0aW9ucworCitAa2luZGV4IEBjb2Rley5zZXQgYXV0b2V4dGVuZH0KK0BraW5kZXggQGNvZGV7LnNldCBub2F1dG9leHRlbmR9CitCeSBkZWZhdWx0LCBNSVBTIDE2IGluc3RydWN0aW9ucyBhcmUgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byAzMiBiaXRzCit3aGVuIG5lY2Vzc2FyeS4gIFRoZSBkaXJlY3RpdmUgQHNhbXB7LnNldCBub2F1dG9leHRlbmR9IHdpbGwgdHVybiB0aGlzCitvZmYuICBXaGVuIEBzYW1wey5zZXQgbm9hdXRvZXh0ZW5kfSBpcyBpbiBlZmZlY3QsIGFueSAzMiBiaXQgaW5zdHJ1Y3Rpb24KK211c3QgYmUgZXhwbGljaXRseSBleHRlbmRlZCB3aXRoIHRoZSBAc2FtcHsuZX0gbW9kaWZpZXIgKGUuZy4sCitAc2FtcHtsaS5lICQ0LDEwMDB9KS4gIFRoZSBkaXJlY3RpdmUgQHNhbXB7LnNldCBhdXRvZXh0ZW5kfSBtYXkgYmUgdXNlZAordG8gb25jZSBhZ2FpbiBhdXRvbWF0aWNhbGx5IGV4dGVuZCBpbnN0cnVjdGlvbnMgd2hlbiBuZWNlc3NhcnkuCisKK1RoaXMgZGlyZWN0aXZlIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGluIE1JUFMgMTYgbW9kZS4gIFRyYWRpdGlvbmFsCitAc2N7bWlwc30gYXNzZW1ibGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGRpcmVjdGl2ZS4KKworQG5vZGUgTUlQUyBpbnNuCitAc2VjdGlvbiBEaXJlY3RpdmUgdG8gbWFyayBkYXRhIGFzIGFuIGluc3RydWN0aW9uCisKK0BraW5kZXggQGNvZGV7Lmluc259CitUaGUgQGNvZGV7Lmluc259IGRpcmVjdGl2ZSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0aGF0IHRoZSBmb2xsb3dpbmcKK2RhdGEgaXMgYWN0dWFsbHkgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gTUlQUyAxNiBtb2RlOgord2hlbiBsb2FkaW5nIHRoZSBhZGRyZXNzIG9mIGEgbGFiZWwgd2hpY2ggcHJlY2VkZXMgaW5zdHJ1Y3Rpb25zLAorQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseSBhZGRzIDEgdG8gdGhlIHZhbHVlLCBzbyB0aGF0IGp1bXBpbmcgdG8KK3RoZSBsb2FkZWQgYWRkcmVzcyB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4KKworQG5vZGUgTUlQUyBvcHRpb24gc3RhY2sKK0BzZWN0aW9uIERpcmVjdGl2ZXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBvcHRpb25zCisKK0BjaW5kZXggTUlQUyBvcHRpb24gc3RhY2sKK0BraW5kZXggQGNvZGV7LnNldCBwdXNofQorQGtpbmRleCBAY29kZXsuc2V0IHBvcH0KK1RoZSBkaXJlY3RpdmVzIEBjb2Rley5zZXQgcHVzaH0gYW5kIEBjb2Rley5zZXQgcG9wfSBtYXkgYmUgdXNlZCB0byBzYXZlCithbmQgcmVzdG9yZSB0aGUgY3VycmVudCBzZXR0aW5ncyBmb3IgYWxsIHRoZSBvcHRpb25zIHdoaWNoIGFyZQorY29udHJvbGxlZCBieSBAY29kZXsuc2V0fS4gIFRoZSBAY29kZXsuc2V0IHB1c2h9IGRpcmVjdGl2ZSBzYXZlcyB0aGUKK2N1cnJlbnQgc2V0dGluZ3Mgb24gYSBzdGFjay4gIFRoZSBAY29kZXsuc2V0IHBvcH0gZGlyZWN0aXZlIHBvcHMgdGhlCitzdGFjayBhbmQgcmVzdG9yZXMgdGhlIHNldHRpbmdzLgorCitUaGVzZSBkaXJlY3RpdmVzIGNhbiBiZSB1c2VmdWwgaW5zaWRlIGFuIG1hY3JvIHdoaWNoIG11c3QgY2hhbmdlIGFuCitvcHRpb24gc3VjaCBhcyB0aGUgSVNBIGxldmVsIG9yIGluc3RydWN0aW9uIHJlb3JkZXJpbmcgYnV0IGRvZXMgbm90IHdhbnQKK3RvIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGNvZGUgd2hpY2ggaW52b2tlZCB0aGUgbWFjcm8uCisKK1RyYWRpdGlvbmFsIEBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoZXNlIGRpcmVjdGl2ZXMuCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbnMzMmsudGV4aSBiL2dhcy9kb2MvYy1uczMyay50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YzYxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL2MtbnMzMmsudGV4aQpAQCAtMCwwICsxLDMwIEBACitAYyAgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgorQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCisKK0BpZ25vcmUKK0BjIEZJWE1FISAgU3RvcCBpZ25vcmluZyB3aGVuIGZpbGxlZCBpbi4KK0Bub2RlIDMyeDMyCitAY2hhcHRlciAzMngzMgorCitAc2VjdGlvbiBPcHRpb25zCitUaGUgMzJ4MzIgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGEgQHNhbXB7LW0zMjAzMn0gb3B0aW9uIHRvCitzcGVjaWZ5IHRoaWF0IGl0IGlzIGNvbXBpbGluZyBmb3IgYSAzMjAzMiBwcm9jZXNzb3IsIG9yIGEKK0BzYW1wey1tMzI1MzJ9IHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBjb21waWxpbmcgZm9yIGEgMzI1MzIgb3B0aW9uLgorVGhlIGRlZmF1bHQgKGlmIG5laXRoZXIgaXMgc3BlY2lmaWVkKSBpcyBjaG9zZW4gd2hlbiB0aGUgYXNzZW1ibGVyCitpcyBjb21waWxlZC4KKworQHNlY3Rpb24gU3ludGF4CitJIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIDMyeDMyIHN5bnRheCBhc3NlbWJsZWQgYnkKK0Bjb2Rle0B2YWx1ZXtBU319LiAgU29tZW9uZSB3aG8gdW5kZXJzYW5kcyB0aGUgcHJvY2Vzc29yIChJJ3ZlIG5ldmVyIHNlZW4KK29uZSkgYW5kIHRoZSBwb3NzaWJsZSBzeW50YXhlcyBzaG91bGQgd3JpdGUgdGhpcyBzZWN0aW9uLgorCitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorVGhlIDMyeDMyIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGJ1dCBAY29kZXtAdmFsdWV7QVN9fQorb25seSBjcmVhdGVzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcy4gIEkgZG9uJ3Qga25vdyBpZiB0aGUKKzMyeDMyIHVuZGVyc3RhbmRzIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXJzLgorCitAc2VjdGlvbiAzMngzMiBNYWNoaW5lIERpcmVjdGl2ZXMKK1RoZSAzMngzMiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgZGlyZWN0aXZlcy4KKworQGVuZCBpZ25vcmUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zaC50ZXhpIGIvZ2FzL2RvYy9jLXNoLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZjU1NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9kb2MvYy1zaC50ZXhpCkBAIC0wLDAgKzEsMjcyIEBACitAYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgorQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCitAcGFnZQorQG5vZGUgU0gtRGVwZW5kZW50CitAY2hhcHRlciBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcworCitAY2luZGV4IFNIIHN1cHBvcnQKK0BtZW51CisqIFNIIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucworKiBTSCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAorKiBTSCBGbG9hdGluZyBQb2ludDo6ICAgICAgIEZsb2F0aW5nIFBvaW50CisqIFNIIERpcmVjdGl2ZXM6OiAgICAgICAgICAgU0ggTWFjaGluZSBEaXJlY3RpdmVzCisqIFNIIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcworQGVuZCBtZW51CisKK0Bub2RlIFNIIE9wdGlvbnMKK0BzZWN0aW9uIE9wdGlvbnMKKworQGNpbmRleCBTSCBvcHRpb25zIChub25lKQorQGNpbmRleCBvcHRpb25zLCBTSCAobm9uZSkKK0Bjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgSGl0YWNoaQorU0ggZmFtaWx5LgorCitAbm9kZSBTSCBTeW50YXgKK0BzZWN0aW9uIFN5bnRheAorCitAbWVudQorKiBTSC1DaGFyczo6ICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycworKiBTSC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCisqIFNILUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcworQGVuZCBtZW51CisKK0Bub2RlIFNILUNoYXJzCitAc3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKKworQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBTSAorQGNpbmRleCBTSCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCitAc2FtcHshfSBpcyB0aGUgbGluZSBjb21tZW50IGNoYXJhY3Rlci4KKworQGNpbmRleCBsaW5lIHNlcGFyYXRvciwgU0gKK0BjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciwgU0gKK0BjaW5kZXggU0ggbGluZSBzZXBhcmF0b3IKK1lvdSBjYW4gdXNlIEBzYW1wezt9IGluc3RlYWQgb2YgYSBuZXdsaW5lIHRvIHNlcGFyYXRlIHN0YXRlbWVudHMuCisKK0BjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgorQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKK1NpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KKworQG5vZGUgU0gtUmVncworQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKKworQGNpbmRleCBTSCByZWdpc3RlcnMKK0BjaW5kZXggcmVnaXN0ZXJzLCBTSAorWW91IGNhbiB1c2UgdGhlIHByZWRlZmluZWQgc3ltYm9scyBAc2FtcHtyMH0sIEBzYW1we3IxfSwgQHNhbXB7cjJ9LAorQHNhbXB7cjN9LCBAc2FtcHtyNH0sIEBzYW1we3I1fSwgQHNhbXB7cjZ9LCBAc2FtcHtyN30sIEBzYW1we3I4fSwKK0BzYW1we3I5fSwgQHNhbXB7cjEwfSwgQHNhbXB7cjExfSwgQHNhbXB7cjEyfSwgQHNhbXB7cjEzfSwgQHNhbXB7cjE0fSwKK2FuZCBAc2FtcHtyMTV9IHRvIHJlZmVyIHRvIHRoZSBTSCByZWdpc3RlcnMuCisKK1RoZSBTSCBhbHNvIGhhcyB0aGVzZSBjb250cm9sIHJlZ2lzdGVyczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBwcgorcHJvY2VkdXJlIHJlZ2lzdGVyIChob2xkcyByZXR1cm4gYWRkcmVzcykKKworQGl0ZW0gcGMKK3Byb2dyYW0gY291bnRlcgorCitAaXRlbSBtYWNoCitAaXRlbXggbWFjbAoraGlnaCBhbmQgbG93IG11bHRpcGx5IGFjY3VtdWxhdG9yIHJlZ2lzdGVycworCitAaXRlbSBzcgorc3RhdHVzIHJlZ2lzdGVyCisKK0BpdGVtIGdicgorZ2xvYmFsIGJhc2UgcmVnaXN0ZXIKKworQGl0ZW0gdmJyCit2ZWN0b3IgYmFzZSByZWdpc3RlciAoZm9yIGludGVycnVwdCB2ZWN0b3JzKQorQGVuZCB0YWJsZQorCitAbm9kZSBTSC1BZGRyZXNzaW5nCitAc3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCisKK0BjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgU0gKK0BjaW5kZXggU0ggYWRkcmVzc2luZyBtb2RlcworQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgU0guCitAY29kZXtSQHZhcntufX0gaW4gdGhlIGZvbGxvd2luZyByZWZlcnMgdG8gYW55IG9mIHRoZSBudW1iZXJlZAorcmVnaXN0ZXJzLCBidXQgQGVtcGh7bm90fSB0aGUgY29udHJvbCByZWdpc3RlcnMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gUkB2YXJ7bn0KK1JlZ2lzdGVyIGRpcmVjdAorCitAaXRlbSBAQFJAdmFye259CitSZWdpc3RlciBpbmRpcmVjdAorCitAaXRlbSBAQC1SQHZhcntufQorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50CisKK0BpdGVtIEBAUkB2YXJ7bn0rCitSZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50CisKK0BpdGVtIEBAKEB2YXJ7ZGlzcH0sIFJAdmFye259KQorUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKKworQGl0ZW0gQEAoUjAsIFJAdmFye259KQorUmVnaXN0ZXIgaW5kZXhlZAorCitAaXRlbSBAQChAdmFye2Rpc3B9LCBHQlIpCitAY29kZXtHQlJ9IG9mZnNldAorCitAaXRlbSBAQChSMCwgR0JSKQorR0JSIGluZGV4ZWQKKworQGl0ZW0gQHZhcnthZGRyfQorQGl0ZW14IEBAKEB2YXJ7ZGlzcH0sIFBDKQorUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciBmb3IgYWRkcmVzc2luZyBtZW1vcnkpLiAgVGhlCitAY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIHVzZSB0aGUgc2ltcGxlciBmb3JtCitAdmFye2FkZHJ9IGFueXdoZXJlIGEgUEMgcmVsYXRpdmUgYWRkcmVzcyBpcyBjYWxsZWQgZm9yOyB0aGUgYWx0ZXJuYXRlCitmb3JtIGlzIHN1cHBvcnRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCisKK0BpdGVtICNAdmFye2ltbX0KK0ltbWVkaWF0ZSBkYXRhCitAZW5kIHRhYmxlCisKK0Bub2RlIFNIIEZsb2F0aW5nIFBvaW50CitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBTSCAoQHNje2llZWV9KQorQGNpbmRleCBTSCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQorVGhlIFNIIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQorZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQord2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KKworQG5vZGUgU0ggRGlyZWN0aXZlcworQHNlY3Rpb24gU0ggTWFjaGluZSBEaXJlY3RpdmVzCisKK0BjaW5kZXggU0ggbWFjaGluZSBkaXJlY3RpdmVzCitAY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgU0gKK0BjaW5kZXggQGNvZGV7dWF3b3JkfSBkaXJlY3RpdmUsIFNICitAY2luZGV4IEBjb2Rle3VhbG9uZ30gZGlyZWN0aXZlLCBTSAorCitAdGFibGUgQGNvZGUKK0BpdGVtIHVhd29yZAorQGl0ZW14IHVhbG9uZworQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBhIG1pc2FsaWduZWQgQGNvZGV7LndvcmR9IG9yCitAY29kZXsubG9uZ30gZGlyZWN0aXZlIGlzIHVzZWQuICBZb3UgbWF5IHVzZSBAY29kZXsudWF3b3JkfSBvcgorQGNvZGV7LnVhbG9uZ30gdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZW50aW9uYWxseSBtaXNhbGlnbmVkLgorQGVuZCB0YWJsZQorCitAbm9kZSBTSCBPcGNvZGVzCitAc2VjdGlvbiBPcGNvZGVzCisKK0BjaW5kZXggU0ggb3Bjb2RlIHN1bW1hcnkKK0BjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFNICitAY2luZGV4IG1uZW1vbmljcywgU0gKK0BjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgU0gKK0ZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgU0ggbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQorQGNpdGV7U0gtTWljcm9jb21wdXRlciBVc2VyJ3MgTWFudWFsfSAoSGl0YWNoaSBNaWNybyBTeXN0ZW1zLCBJbmMuKS4KKworQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIFNIIG9wY29kZXMuICBObyBhZGRpdGlvbmFsCitwc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuICBOb3RlLCBob3dldmVyLCB0aGF0CitiZWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIGEgc2ltcGxlciBmb3JtIG9mIFBDLXJlbGF0aXZlCithZGRyZXNzaW5nLCB5b3UgbWF5IHNpbXBseSB3cml0ZSAoZm9yIGV4YW1wbGUpCisKK0BleGFtcGxlCittb3YubCAgYmFyLHIwCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit3aGVyZSBvdGhlciBhc3NlbWJsZXJzIG1pZ2h0IHJlcXVpcmUgYW4gZXhwbGljaXQgZGlzcGxhY2VtZW50IHRvCitAY29kZXtiYXJ9IGZyb20gdGhlIHByb2dyYW0gY291bnRlcjoKKworQGV4YW1wbGUKK21vdi5sICBAQChAdmFye2Rpc3B9LCBQQykKK0BlbmQgZXhhbXBsZQorCitAaWZzZXQgU01BTEwKK0BjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQorQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgorCitIZXJlIGlzIGEgc3VtbWFyeSBvZiBTSCBvcGNvZGVzOgorCitAcGFnZQorQHNtYWxsZXhhbXBsZQorQGl7TGVnZW5kOn0KK1JuICAgICAgICBAcnthIG51bWJlcmVkIHJlZ2lzdGVyfQorUm0gICAgICAgIEBye2Fub3RoZXIgbnVtYmVyZWQgcmVnaXN0ZXJ9CisjaW1tICAgICAgQHJ7aW1tZWRpYXRlIGRhdGF9CitkaXNwICAgICAgQHJ7ZGlzcGxhY2VtZW50fQorZGlzcDggICAgIEByezgtYml0IGRpc3BsYWNlbWVudH0KK2Rpc3AxMiAgICBAcnsxMi1iaXQgZGlzcGxhY2VtZW50fQorCithZGQgI2ltbSxSbiAgICAgICAgICAgICAgICAgICAgbGRzLmwgQEBSbissUFIgICAgICAgICAgICAgIAorYWRkIFJtLFJuICAgICAgICAgICAgICAgICAgICAgIG1hYy53IEBAUm0rLEBAUm4rICAgICAgICAgICAKK2FkZGMgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YgI2ltbSxSbiAgICAgICAgICAgICAgICAgCithZGR2IFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92IFJtLFJuICAgICAgICAgICAgICAgICAgIAorYW5kICNpbW0sUjAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFJtLEBAKFIwLFJuKSAgICAgICAgICAKK2FuZCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBSbSxAQC1SbiAgICAgICAgICAgICAgCithbmQuYiAjaW1tLEBAKFIwLEdCUikgICAgICAgICAgIG1vdi5iIFJtLEBAUm4gICAgICAgICAgICAgICAKK2JmIGRpc3A4ICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChkaXNwLFJtKSxSMCAgICAgICAgCiticmEgZGlzcDEyICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoZGlzcCxHQlIpLFIwICAgICAgIAorYnNyIGRpc3AxMiAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKFIwLFJtKSxSbiAgICAgICAgICAKK2J0IGRpc3A4ICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQFJtKyxSbiAgICAgICAgICAgICAgCitjbHJtYWMgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEBSbSxSbiAgICAgICAgICAgICAgIAorY2xydCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIFIwLEBAKGRpc3AsUm0pICAgICAgICAKK2NtcC9lcSAjaW1tLFIwICAgICAgICAgICAgICAgICBtb3YuYiBSMCxAQChkaXNwLEdCUikgICAgICAgCitjbXAvZXEgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAoZGlzcCxSbikgICAgICAgIAorY21wL2dlIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAKFIwLFJuKSAgICAgICAgICAKK2NtcC9ndCBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQC1SbiAgICAgICAgICAgICAgCitjbXAvaGkgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEBSbiAgICAgICAgICAgICAgIAorY21wL2hzIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsUm4pLFJtICAgICAgICAKK2NtcC9wbCBSbiAgICAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLEdCUiksUjAgICAgICAgCitjbXAvcHogUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxQQyksUm4gICAgICAgIAorY21wL3N0ciBSbSxSbiAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKFIwLFJtKSxSbiAgICAgICAgICAKK2RpdjBzIFJtLFJuICAgICAgICAgICAgICAgICAgICBtb3YubCBAQFJtKyxSbiAgICAgICAgICAgICAgCitkaXYwdSAgICAgICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEBSbSxSbiAgICAgICAgICAgICAgIAorZGl2MSBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdi5sIFIwLEBAKGRpc3AsR0JSKSAgICAgICAKK2V4dHMuYiBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQChSMCxSbikgICAgICAgICAgCitleHRzLncgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEAtUm4gICAgICAgICAgICAgIAorZXh0dS5iIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBAUm4gICAgICAgICAgICAgICAKK2V4dHUudyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLFJtKSxSMCAgICAgICAgCitqbXAgQEBSbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsR0JSKSxSMCAgICAgICAKK2pzciBAQFJuICAgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxQQyksUm4gICAgICAgIAorbGRjIFJuLEdCUiAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKFIwLFJtKSxSbiAgICAgICAgICAKK2xkYyBSbixTUiAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQFJtKyxSbiAgICAgICAgICAgICAgCitsZGMgUm4sVkJSICAgICAgICAgICAgICAgICAgICAgbW92LncgQEBSbSxSbiAgICAgICAgICAgICAgIAorbGRjLmwgQEBSbissR0JSICAgICAgICAgICAgICAgICBtb3YudyBSMCxAQChkaXNwLFJtKSAgICAgICAgCitsZGMubCBAQFJuKyxTUiAgICAgICAgICAgICAgICAgIG1vdi53IFIwLEBAKGRpc3AsR0JSKSAgICAgICAKK2xkYy5sIEBAUm4rLFZCUiAgICAgICAgICAgICAgICAgbW92YSBAQChkaXNwLFBDKSxSMCAgICAgICAgIAorbGRzIFJuLE1BQ0ggICAgICAgICAgICAgICAgICAgIG1vdnQgUm4gICAgICAgICAgICAgICAgICAgICAKK2xkcyBSbixNQUNMICAgICAgICAgICAgICAgICAgICBtdWxzIFJtLFJuICAgICAgICAgICAgICAgICAgCitsZHMgUm4sUFIgICAgICAgICAgICAgICAgICAgICAgbXVsdSBSbSxSbiAgICAgICAgICAgICAgICAgIAorbGRzLmwgQEBSbissTUFDSCAgICAgICAgICAgICAgICBuZWcgUm0sUm4gICAgICAgICAgICAgICAgICAgCitsZHMubCBAQFJuKyxNQUNMICAgICAgICAgICAgICAgIG5lZ2MgUm0sUm4gICAgICAgICAgICAgICAgICAKK0BwYWdlCitub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RjIFZCUixSbiAgICAgICAgICAgICAgICAKK25vdCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBzdGMubCBHQlIsQEAtUm4gICAgICAgICAgIAorb3IgI2ltbSxSMCAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIFNSLEBALVJuICAgICAgICAgICAgCitvciBSbSxSbiAgICAgICAgICAgICAgICAgICAgICAgc3RjLmwgVkJSLEBALVJuICAgICAgICAgICAKK29yLmIgI2ltbSxAQChSMCxHQlIpICAgICAgICAgICAgc3RzIE1BQ0gsUm4gICAgICAgICAgICAgICAKK3JvdGNsIFJuICAgICAgICAgICAgICAgICAgICAgICBzdHMgTUFDTCxSbiAgICAgICAgICAgICAgIAorcm90Y3IgUm4gICAgICAgICAgICAgICAgICAgICAgIHN0cyBQUixSbiAgICAgICAgICAgICAgICAgCityb3RsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgTUFDSCxAQC1SbiAgICAgICAgICAKK3JvdHIgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBNQUNMLEBALVJuICAgICAgICAgIAorcnRlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIFBSLEBALVJuICAgICAgICAgICAgCitydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViIFJtLFJuICAgICAgICAgICAgICAgICAKK3NldHQgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjIFJtLFJuICAgICAgICAgICAgICAgIAorc2hhbCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnYgUm0sUm4gICAgICAgICAgICAgICAgCitzaGFyIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3dhcC5iIFJtLFJuICAgICAgICAgICAgICAKK3NobGwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzd2FwLncgUm0sUm4gICAgICAgICAgICAgIAorc2hsbDE2IFJuICAgICAgICAgICAgICAgICAgICAgIHRhcy5iIEBAUm4gICAgICAgICAgICAgICAgCitzaGxsMiBSbiAgICAgICAgICAgICAgICAgICAgICAgdHJhcGEgI2ltbSAgICAgICAgICAgICAgICAKK3NobGw4IFJuICAgICAgICAgICAgICAgICAgICAgICB0c3QgI2ltbSxSMCAgICAgICAgICAgICAgIAorc2hsciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHRzdCBSbSxSbiAgICAgICAgICAgICAgICAgCitzaGxyMTYgUm4gICAgICAgICAgICAgICAgICAgICAgdHN0LmIgI2ltbSxAQChSMCxHQlIpICAgICAKK3NobHIyIFJuICAgICAgICAgICAgICAgICAgICAgICB4b3IgI2ltbSxSMCAgICAgICAgICAgICAgIAorc2hscjggUm4gICAgICAgICAgICAgICAgICAgICAgIHhvciBSbSxSbiAgICAgICAgICAgICAgICAgCitzbGVlcCAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yLmIgI2ltbSxAQChSMCxHQlIpICAgICAKK3N0YyBHQlIsUm4gICAgICAgICAgICAgICAgICAgICB4dHJjdCBSbSxSbiAgICAgICAgICAgICAgIAorc3RjIFNSLFJuCitAZW5kIHNtYWxsZXhhbXBsZQorQGVuZCBpZnNldAorCitAaWZzZXQgSGl0YWNoaS1hbGwKK0BpZmNsZWFyIEdFTkVSSUMKK0ByYWlzZXNlY3Rpb25zCitAZW5kIGlmY2xlYXIKK0BlbmQgaWZzZXQKKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXNwYXJjLnRleGkgYi9nYXMvZG9jL2Mtc3BhcmMudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODcxYzgyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9jLXNwYXJjLnRleGkKQEAgLTAsMCArMSwxNzkgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAbm9kZSBTcGFyYy1EZXBlbmRlbnQKK0BjaGFwdGVyIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKK0BjaGFwdGVyIFNQQVJDIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggU1BBUkMgc3VwcG9ydAorQG1lbnUKKyogU3BhcmMtT3B0czo6ICAgICAgICAgICAgICAgICAgT3B0aW9ucworKiBTcGFyYy1BbGlnbmVkLURhdGE6OgkJT3B0aW9uIHRvIGVuZm9yY2UgYWxpZ25lZCBkYXRhCisqIFNwYXJjLUZsb2F0OjogICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50CisqIFNwYXJjLURpcmVjdGl2ZXM6OiAgICAgICAgICAgIFNwYXJjIE1hY2hpbmUgRGlyZWN0aXZlcworQGVuZCBtZW51CisKK0Bub2RlIFNwYXJjLU9wdHMKK0BzZWN0aW9uIE9wdGlvbnMKKworQGNpbmRleCBvcHRpb25zIGZvciBTUEFSQworQGNpbmRleCBTUEFSQyBvcHRpb25zCitAY2luZGV4IGFyY2hpdGVjdHVyZXMsIFNQQVJDCitAY2luZGV4IFNQQVJDIGFyY2hpdGVjdHVyZXMKK1RoZSBTUEFSQyBjaGlwIGZhbWlseSBpbmNsdWRlcyBzZXZlcmFsIHN1Y2Nlc3NpdmUgbGV2ZWxzLCB1c2luZyB0aGUgc2FtZQorY29yZSBpbnN0cnVjdGlvbiBzZXQsIGJ1dCBpbmNsdWRpbmcgYSBmZXcgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQKK2VhY2ggbGV2ZWwuICBUaGVyZSBhcmUgZXhjZXB0aW9ucyB0byB0aGlzIGhvd2V2ZXIuICBGb3IgZGV0YWlscyBvbiB3aGF0CitpbnN0cnVjdGlvbnMgZWFjaCB2YXJpYW50IHN1cHBvcnRzLCBwbGVhc2Ugc2VlIHRoZSBjaGlwJ3MgYXJjaGl0ZWN0dXJlCityZWZlcmVuY2UgbWFudWFsLgorCitCeSBkZWZhdWx0LCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIHRoZSBjb3JlIGluc3RydWN0aW9uIHNldCAoU1BBUkMKK3Y2KSwgYnV0IGBgYnVtcHMnJyB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIGFzIG5lZWRlZDogaXQgc3dpdGNoZXMgdG8KK3N1Y2Nlc3NpdmVseSBoaWdoZXIgYXJjaGl0ZWN0dXJlcyBhcyBpdCBlbmNvdW50ZXJzIGluc3RydWN0aW9ucyB0aGF0Citvbmx5IGV4aXN0IGluIHRoZSBoaWdoZXIgbGV2ZWxzLgorCitJZiBub3QgY29uZmlndXJlZCBmb3IgU1BBUkMgdjkgKEBjb2Rle3NwYXJjNjQtKi0qfSkgR0FTIHdpbGwgbm90IGJ1bXAKK3Bhc3NlZCBzcGFyY2xpdGUgYnkgZGVmYXVsdCwgYW4gb3B0aW9uIG11c3QgYmUgcGFzc2VkIHRvIGVuYWJsZSB0aGUKK3Y5IGluc3RydWN0aW9ucy4KKworR0FTIHRyZWF0cyBzcGFyY2xpdGUgYXMgYmVpbmcgY29tcGF0aWJsZSB3aXRoIHY4LCB1bmxlc3MgYW4gYXJjaGl0ZWN0dXJlCitpcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gIFNQQVJDIHY5IGlzIGFsd2F5cyBpbmNvbXBhdGlibGUgd2l0aCBzcGFyY2xpdGUuCisKK0BjIFRoZSBvcmRlciBoZXJlIGlzIHRoZSBzYW1lIGFzIHRoZSBvcmRlciBvZiBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbAorQGMgdG8gZ2l2ZSB0aGUgdXNlciBhIHNlbnNlIG9mIHRoZSBvcmRlciBvZiB0aGUgImJ1bXBpbmciLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggLUF2NgorQGtpbmRleCBBdjcKK0BraW5kZXggLUF2OAorQGtpbmRleCAtQXNwYXJjbGV0CitAa2luZGV4IC1Bc3BhcmNsaXRlCitAa2luZGV4IC1BdjkKK0BraW5kZXggLUF2OWEKK0BpdGVtIC1BdjYgfCAtQXY3IHwgLUF2OCB8IC1Bc3BhcmNsZXQgfCAtQXNwYXJjbGl0ZQorQGl0ZW14IC1BdjhwbHVzIHwgLUF2OHBsdXNhIHwgLUF2OSB8IC1BdjlhCitVc2Ugb25lIG9mIHRoZSBAc2FtcHstQX0gb3B0aW9ucyB0byBzZWxlY3Qgb25lIG9mIHRoZSBTUEFSQworYXJjaGl0ZWN0dXJlcyBleHBsaWNpdGx5LiAgSWYgeW91IHNlbGVjdCBhbiBhcmNoaXRlY3R1cmUgZXhwbGljaXRseSwKK0Bjb2Rle0B2YWx1ZXtBU319IHJlcG9ydHMgYSBmYXRhbCBlcnJvciBpZiBpdCBlbmNvdW50ZXJzIGFuIGluc3RydWN0aW9uCitvciBmZWF0dXJlIHJlcXVpcmluZyBhbiBpbmNvbXBhdGlibGUgb3IgaGlnaGVyIGxldmVsLgorCitAc2FtcHstQXY4cGx1c30gYW5kIEBzYW1wey1BdjhwbHVzYX0gc2VsZWN0IGEgMzIgYml0IGVudmlyb25tZW50LgorCitAc2FtcHstQXY5fSBhbmQgQHNhbXB7LUF2OWF9IHNlbGVjdCBhIDY0IGJpdCBlbnZpcm9ubWVudCBhbmQgYXJlIG5vdAorYXZhaWxhYmxlIHVubGVzcyBHQVMgaXMgZXhwbGljaXRseSBjb25maWd1cmVkIHdpdGggNjQgYml0IGVudmlyb25tZW50CitzdXBwb3J0LgorCitAc2FtcHstQXY4cGx1c2F9IGFuZCBAc2FtcHstQXY5YX0gZW5hYmxlIHRoZSBTUEFSQyBWOSBpbnN0cnVjdGlvbiBzZXQgd2l0aAorVWx0cmFTUEFSQyBleHRlbnNpb25zLgorCitAaXRlbSAteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2EKK0ZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgdjkgYXNzZW1ibGVyLiAgVGhlc2Ugb3B0aW9ucyBhcmUKK2VxdWl2YWxlbnQgdG8gLUF2OHBsdXMgYW5kIC1BdjhwbHVzYSwgcmVzcGVjdGl2ZWx5LgorCitAaXRlbSAtYnVtcAorV2FybiB3aGVuZXZlciBpdCBpcyBuZWNlc3NhcnkgdG8gc3dpdGNoIHRvIGFub3RoZXIgbGV2ZWwuCitJZiBhbiBhcmNoaXRlY3R1cmUgbGV2ZWwgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIEdBUyB3aWxsIG5vdCBpc3N1ZQord2FybmluZ3MgdW50aWwgdGhhdCBsZXZlbCBpcyByZWFjaGVkLCBhbmQgd2lsbCB0aGVuIGJ1bXAgdGhlIGxldmVsCithcyByZXF1aXJlZCAoZXhjZXB0IGJldHdlZW4gaW5jb21wYXRpYmxlIGxldmVscykuCisKK0BpdGVtIC0zMiB8IC02NAorU2VsZWN0IHRoZSB3b3JkIHNpemUsIGVpdGhlciAzMiBiaXRzIG9yIDY0IGJpdHMuCitUaGVzZSBvcHRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB3aXRoIHRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LAorYW5kIHJlcXVpcmUgdGhhdCB0aGUgbmVjZXNzYXJ5IEJGRCBzdXBwb3J0IGhhcyBiZWVuIGluY2x1ZGVkLgorQGVuZCB0YWJsZQorCitAbm9kZSBTcGFyYy1BbGlnbmVkLURhdGEKK0BzZWN0aW9uIEVuZm9yY2luZyBhbGlnbmVkIGRhdGEKKworQGNpbmRleCBkYXRhIGFsaWdubWVudCBvbiBTUEFSQworQGNpbmRleCBTUEFSQyBkYXRhIGFsaWdubWVudAorU1BBUkMgR0FTIG5vcm1hbGx5IHBlcm1pdHMgZGF0YSB0byBiZSBtaXNhbGlnbmVkLiAgRm9yIGV4YW1wbGUsIGl0CitwZXJtaXRzIHRoZSBAY29kZXsubG9uZ30gcHNldWRvLW9wIHRvIGJlIHVzZWQgb24gYSBieXRlIGJvdW5kYXJ5LgorSG93ZXZlciwgdGhlIG5hdGl2ZSBTdW5PUyBhbmQgU29sYXJpcyBhc3NlbWJsZXJzIGlzc3VlIGFuIGVycm9yIHdoZW4KK3RoZXkgc2VlIG1pc2FsaWduZWQgZGF0YS4KKworQGtpbmRleCAtLWVuZm9yY2UtYWxpZ25lZC1kYXRhCitZb3UgY2FuIHVzZSB0aGUgQGNvZGV7LS1lbmZvcmNlLWFsaWduZWQtZGF0YX0gb3B0aW9uIHRvIG1ha2UgU1BBUkMgR0FTCithbHNvIGlzc3VlIGFuIGVycm9yIGFib3V0IG1pc2FsaWduZWQgZGF0YSwganVzdCBhcyB0aGUgU3VuT1MgYW5kIFNvbGFyaXMKK2Fzc2VtYmxlcnMgZG8uCisKK1RoZSBAY29kZXstLWVuZm9yY2UtYWxpZ25lZC1kYXRhfSBvcHRpb24gaXMgbm90IHRoZSBkZWZhdWx0IGJlY2F1c2UgZ2NjCitpc3N1ZXMgbWlzYWxpZ25lZCBkYXRhIHBzZXVkby1vcHMgd2hlbiBpdCBpbml0aWFsaXplcyBjZXJ0YWluIHBhY2tlZAorZGF0YSBzdHJ1Y3R1cmVzIChzdHJ1Y3R1cmVzIGRlZmluZWQgdXNpbmcgdGhlIEBjb2Rle3BhY2tlZH0gYXR0cmlidXRlKS4KK1lvdSBtYXkgaGF2ZSB0byBhc3NlbWJsZSB3aXRoIEdBUyBpbiBvcmRlciB0byBpbml0aWFsaXplIHBhY2tlZCBkYXRhCitzdHJ1Y3R1cmVzIGluIHlvdXIgb3duIGNvZGUuCisKK0BpZ25vcmUKK0BjIEZJWE1FOiAoc3BhcmMpIEZpbGwgaW4gInN5bnRheCIgc2VjdGlvbiEKK0BjIHN1YnNlY3Rpb24gc3ludGF4CitJIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgU3BhcmMgc3ludGF4LiAgU29tZW9uZSB3aG8gZG9lcword2lsbCBoYXZlIHRvIHdyaXRlIHRoaXMgc2VjdGlvbi4KK0BlbmQgaWdub3JlCisKK0Bub2RlIFNwYXJjLUZsb2F0CitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBTUEFSQyAoQHNje2llZWV9KQorQGNpbmRleCBTUEFSQyBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQorVGhlIFNwYXJjIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisKK0Bub2RlIFNwYXJjLURpcmVjdGl2ZXMKK0BzZWN0aW9uIFNwYXJjIE1hY2hpbmUgRGlyZWN0aXZlcworCitAY2luZGV4IFNQQVJDIG1hY2hpbmUgZGlyZWN0aXZlcworQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFNQQVJDCitUaGUgU3BhcmMgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKK21hY2hpbmUgZGlyZWN0aXZlczoKKworQHRhYmxlIEBjb2RlCitAY2luZGV4IEBjb2Rle2FsaWdufSBkaXJlY3RpdmUsIFNQQVJDCitAaXRlbSAuYWxpZ24KK1RoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgZGVzaXJlZCBhbGlnbm1lbnQgaW4gYnl0ZXMuCisKK0BjaW5kZXggQGNvZGV7Y29tbW9ufSBkaXJlY3RpdmUsIFNQQVJDCitAaXRlbSAuY29tbW9uCitUaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzeW1ib2wgbmFtZSwgYSBwb3NpdGl2ZSBudW1iZXIsIGFuZAorQGNvZGV7ImJzcyJ9LiAgVGhpcyBiZWhhdmVzIHNvbWV3aGF0IGxpa2UgQGNvZGV7LmNvbW19LCBidXQgdGhlCitzeW50YXggaXMgZGlmZmVyZW50LgorCitAY2luZGV4IEBjb2Rle2hhbGZ9IGRpcmVjdGl2ZSwgU1BBUkMKK0BpdGVtIC5oYWxmCitUaGlzIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gQGNvZGV7LnNob3J0fS4KKworQGNpbmRleCBAY29kZXtwcm9jfSBkaXJlY3RpdmUsIFNQQVJDCitAaXRlbSAucHJvYworVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZC4gIEFueSB0ZXh0IGZvbGxvd2luZyBpdCBvbiB0aGUgc2FtZQorbGluZSBpcyBhbHNvIGlnbm9yZWQuCisKK0BjaW5kZXggQGNvZGV7cmVzZXJ2ZX0gZGlyZWN0aXZlLCBTUEFSQworQGl0ZW0gLnJlc2VydmUKK1RoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHN5bWJvbCBuYW1lLCBhIHBvc2l0aXZlIG51bWJlciwgYW5kCitAY29kZXsiYnNzIn0uICBUaGlzIGJlaGF2ZXMgc29tZXdoYXQgbGlrZSBAY29kZXsubGNvbW19LCBidXQgdGhlCitzeW50YXggaXMgZGlmZmVyZW50LgorCitAY2luZGV4IEBjb2Rle3NlZ30gZGlyZWN0aXZlLCBTUEFSQworQGl0ZW0gLnNlZworVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IEBjb2RleyJ0ZXh0In0sIEBjb2RleyJkYXRhIn0sIG9yCitAY29kZXsiZGF0YTEifS4gIEl0IGJlaGF2ZXMgbGlrZSBAY29kZXsudGV4dH0sIEBjb2Rley5kYXRhfSwgb3IKK0Bjb2Rley5kYXRhIDF9LgorCitAY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZSwgU1BBUkMKK0BpdGVtIC5za2lwCitUaGlzIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gdGhlIEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgorCitAY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgU1BBUkMKK0BpdGVtIC53b3JkCitPbiB0aGUgU3BhcmMsIHRoZSBAY29kZXsud29yZH0gZGlyZWN0aXZlIHByb2R1Y2VzIDMyIGJpdCB2YWx1ZXMsCitpbnN0ZWFkIG9mIHRoZSAxNiBiaXQgdmFsdWVzIGl0IHByb2R1Y2VzIG9uIG1hbnkgb3RoZXIgbWFjaGluZXMuCisKK0BjaW5kZXggQGNvZGV7eHdvcmR9IGRpcmVjdGl2ZSwgU1BBUkMKK0BpdGVtIC54d29yZAorT24gdGhlIFNwYXJjIFY5IHByb2Nlc3NvciwgdGhlIEBjb2Rley54d29yZH0gZGlyZWN0aXZlIHByb2R1Y2VzCis2NCBiaXQgdmFsdWVzLgorQGVuZCB0YWJsZQorCmRpZmYgLS1naXQgYS9nYXMvZG9jL2Mtdjg1MC50ZXhpIGIvZ2FzL2RvYy9jLXY4NTAudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE2ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9jLXY4NTAudGV4aQpAQCAtMCwwICsxLDM2MyBAQAorQGMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgorQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCisKK0Bub2RlIFY4NTAtRGVwZW5kZW50CitAY2hhcHRlciB2ODUwIERlcGVuZGVudCBGZWF0dXJlcworCitAY2luZGV4IFY4NTAgc3VwcG9ydAorQG1lbnUKKyogVjg1MCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKKyogVjg1MCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAorKiBWODUwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKKyogVjg1MCBEaXJlY3RpdmVzOjogICAgICAgICAgIFY4NTAgTWFjaGluZSBEaXJlY3RpdmVzCisqIFY4NTAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCitAZW5kIG1lbnUKKworQG5vZGUgVjg1MCBPcHRpb25zCitAc2VjdGlvbiBPcHRpb25zCitAY2luZGV4IFY4NTAgb3B0aW9ucyAobm9uZSkKK0BjaW5kZXggb3B0aW9ucyBmb3IgVjg1MCAobm9uZSkKK0Bjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucworZm9yIHRoZSBWODUwIHByb2Nlc3NvciBmYW1pbHk6CisKK0BjaW5kZXggY29tbWFuZCBsaW5lIG9wdGlvbnMsIFY4NTAKK0BjaW5kZXggVjg1MCBjb21tYW5kIGxpbmUgb3B0aW9ucworQHRhYmxlIEBjb2RlCisKK0BjaW5kZXggQGNvZGV7LXdzaWduZWRfb3ZlcmZsb3d9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKK0BpdGVtIC13c2lnbmVkX292ZXJmbG93CitDYXVzZXMgd2FybmluZ3MgdG8gYmUgcHJvZHVjZWQgd2hlbiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvdyB0aGUKK3NwYWNlIGF2YWlsYWJsZSBmb3IgdGhlbiB3aXRoaW4gdGhlaXIgb3Bjb2Rlcy4gIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KK2lzIGRpc2FibGVkIGFzIGl0IGlzIHBvc3NpYmxlIHRvIHJlY2VpdmUgc3B1cmlvdXMgd2FybmluZ3MgZHVlIHRvIHVzaW5nCitleGFjdCBiaXQgcGF0dGVybnMgYXMgaW1tZWRpYXRlIGNvbnN0YW50cy4KKworQGNpbmRleCBAY29kZXstd3Vuc2lnbmVkX292ZXJmbG93fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCitAaXRlbSAtd3Vuc2lnbmVkX292ZXJmbG93CitDYXVzZXMgd2FybmluZ3MgdG8gYmUgcHJvZHVjZWQgd2hlbiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93Cit0aGUgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGVuIHdpdGhpbiB0aGVpciBvcGNvZGVzLiAgQnkgZGVmYXVsdCB0aGlzCitvcHRpb24gaXMgZGlzYWJsZWQgYXMgaXQgaXMgcG9zc2libGUgdG8gcmVjZWl2ZSBzcHVyaW91cyB3YXJuaW5ncyBkdWUgdG8KK3VzaW5nIGV4YWN0IGJpdCBwYXR0ZXJucyBhcyBpbW1lZGlhdGUgY29uc3RhbnRzLgorCitAY2luZGV4IEBjb2Rley1tdjg1MH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAorQGl0ZW0gLW12ODUwCitTcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAordGhlIFY4NTAgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluaworc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCisKK0BjaW5kZXggQGNvZGV7LW12ODUwZX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAorQGl0ZW0gLW12ODUwZQorU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKK3RoZSBWODUwRSBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCitzdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KKworQGNpbmRleCBAY29kZXstbXY4NTBhbnl9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKK0BpdGVtIC1tdjg1MGFueQorU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKK3RoZSBWODUwIHByb2Nlc3NvciBidXQgc3VwcG9ydCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCitleHRlbmRlZCB2YXJpYW50cyBvZiB0aGUgcHJvY2Vzcy4gIFRoaXMgYWxsb3dzIHRoZSBwcm9kdWN0aW9uIG9mCitiaW5hcmllcyB0aGF0IGNvbnRhaW4gdGFyZ2V0IHNwZWNpZmljIGNvZGUsIGJ1dCB3aGljaCBhcmUgYWxzbyBpbnRlbmRlZAordG8gYmUgdXNlZCBpbiBhIGdlbmVyaWMgZmFzaGlvbi4gIEZvciBleGFtcGxlIGxpYmdjYy5hIGNvbnRhaW5zIGdlbmVyaWMKK3JvdXRpbmVzIHVzZWQgYnkgdGhlIGNvZGUgcHJvZHVjZWQgYnkgR0NDIGZvciBhbGwgdmVyc2lvbnMgb2YgdGhlIHY4NTAKK2FyY2hpdGVjdHVyZSwgdG9nZXRoZXIgd2l0aCBzdXBwb3J0IHJvdXRpbmVzIG9ubHkgdXNlZCBieSB0aGUgVjg1MEUKK2FyY2hpdGVjdHVyZS4KKworQGVuZCB0YWJsZQorCisKK0Bub2RlIFY4NTAgU3ludGF4CitAc2VjdGlvbiBTeW50YXgKK0BtZW51CisqIFY4NTAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKKyogVjg1MC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCitAZW5kIG1lbnUKKworQG5vZGUgVjg1MC1DaGFycworQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCisKK0BjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgVjg1MAorQGNpbmRleCBWODUwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKK0BzYW1weyN9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgorQG5vZGUgVjg1MC1SZWdzCitAc3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcworCitAY2luZGV4IFY4NTAgcmVnaXN0ZXIgbmFtZXMKK0BjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIFY4NTAKK0Bjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbmFtZXMgZm9yIHJlZ2lzdGVyczoKK0B0YWJsZSBAY29kZQorQGNpbmRleCBAY29kZXt6ZXJvfSByZWdpc3RlciwgVjg1MAorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAwCityMCwgemVybworQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxCityMQorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyCityMiwgaHAKK0BjaW5kZXggQGNvZGV7c3B9IHJlZ2lzdGVyLCBWODUwCitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMKK3IzLCBzcAorQGNpbmRleCBAY29kZXtncH0gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNAorcjQsIGdwCitAY2luZGV4IEBjb2Rle3RwfSByZWdpc3RlciwgVjg1MAorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA1CityNSwgdHAKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNgorcjYKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNworcjcKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgOAorcjgKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgOQorcjkKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTAKK3IxMAorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMQorcjExCitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEyCityMTIKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTMKK3IxMworQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNAorcjE0CitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE1CityMTUKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTYKK3IxNgorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNworcjE3CitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE4CityMTgKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTkKK3IxOQorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMAorcjIwCitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIxCityMjEKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjIKK3IyMgorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMworcjIzCitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI0CityMjQKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjUKK3IyNQorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNgorcjI2CitAaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI3CityMjcKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjgKK3IyOAorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyOQorcjI5CitAY2luZGV4IEBjb2Rle2VwfSByZWdpc3RlciwgVjg1MAorQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzMAorcjMwLCBlcAorQGNpbmRleCBAY29kZXtscH0gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMzEKK3IzMSwgbHAKK0BjaW5kZXggQGNvZGV7ZWlwY30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAwCitlaXBjCitAY2luZGV4IEBjb2Rle2VpcHN3fSByZWdpc3RlciwgVjg1MAorQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDEKK2VpcHN3CitAY2luZGV4IEBjb2Rle2ZlcGN9IHJlZ2lzdGVyLCBWODUwCitAaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMgorZmVwYworQGNpbmRleCBAY29kZXtmZXBzd30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAzCitmZXBzdworQGNpbmRleCBAY29kZXtlY3J9IHJlZ2lzdGVyLCBWODUwCitAaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgNAorZWNyCitAY2luZGV4IEBjb2Rle3Bzd30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciA1Citwc3cKK0BjaW5kZXggQGNvZGV7Y3RwY30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAxNgorY3RwYworQGNpbmRleCBAY29kZXtjdHBzd30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAxNworY3Rwc3cKK0BjaW5kZXggQGNvZGV7ZGJwY30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAxOAorZGJwYworQGNpbmRleCBAY29kZXtkYnBzd30gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAxOQorZGJwc3cKK0BjaW5kZXggQGNvZGV7Y3RicH0gcmVnaXN0ZXIsIFY4NTAKK0BpdGVtIHN5c3RlbSByZWdpc3RlciAyMAorY3RicAorQGVuZCB0YWJsZQorCitAbm9kZSBWODUwIEZsb2F0aW5nIFBvaW50CitAc2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBWODUwIChAc2N7aWVlZX0pCitAY2luZGV4IFY4NTAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKK1RoZSBWODUwIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgorCitAbm9kZSBWODUwIERpcmVjdGl2ZXMKK0BzZWN0aW9uIFY4NTAgTWFjaGluZSBEaXJlY3RpdmVzCisKK0BjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBWODUwCitAY2luZGV4IFY4NTAgbWFjaGluZSBkaXJlY3RpdmVzCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7b2Zmc2V0fSBkaXJlY3RpdmUsIFY4NTAKK0BpdGVtIC5vZmZzZXQgQHZhcns8ZXhwcmVzc2lvbj59CitNb3ZlcyB0aGUgb2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFtb3VudC4gCisKK0BjaW5kZXggQGNvZGV7c2VjdGlvbn0gZGlyZWN0aXZlLCBWODUwCitAaXRlbSAuc2VjdGlvbiAibmFtZSIsIDx0eXBlPgorVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIHN0YW5kYXJkIC5zZWN0aW9uIGRpcmVjdGl2ZS4gIEl0IHNldHMgdGhlCitjdXJyZW50IHNlY3Rpb24gdG8gYmUgPHR5cGU+IGFuZCBjcmVhdGVzIGFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24KK2NhbGxlZCAibmFtZSIuIAorCitAY2luZGV4IEBjb2Rley52ODUwfSBkaXJlY3RpdmUsIFY4NTAKK0BpdGVtIC52ODUwCitTcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAordGhlIFY4NTAgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluaworc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCisKK0BjaW5kZXggQGNvZGV7LnY4NTBlfSBkaXJlY3RpdmUsIFY4NTAKK0BpdGVtIC52ODUwZQorU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKK3RoZSBWODUwRSBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCitzdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KKworQGVuZCB0YWJsZQorCitAbm9kZSBWODUwIE9wY29kZXMKK0BzZWN0aW9uIE9wY29kZXMKKworQGNpbmRleCBWODUwIG9wY29kZXMKK0BjaW5kZXggb3Bjb2RlcyBmb3IgVjg1MAorQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIFY4NTAgb3Bjb2Rlcy4KKworQGNvZGV7QHZhbHVle0FTfX0gYWxzbyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgcHNldWRvIG9wczoKKworQHRhYmxlIEBjb2RlCisKK0BjaW5kZXggQGNvZGV7aGkwfSBwc2V1ZG8tb3AsIFY4NTAKK0BpdGVtIGhpMCgpCitDb21wdXRlcyB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCit0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAgICBAc2FtcHttdWxoaSBoaTAoaGVyZSAtIHRoZXJlKSwgcjUsIHI2fQorCitjb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGxhYmVscyAnaGVyZScgYW5kCisndGhlcmUnLCB0YWtlcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGlzIGRpZmZlcmVuY2UsIHNoaWZ0cyBpdCBkb3duIDE2CitiaXRzIGFuZCB0aGVuIG11dGxpcGxpZXMgaXQgYnkgdGhlIGxvd2VyIDE2IGJpdHMgaW4gcmVnaXN0ZXIgNSwgcHV0dGluZwordGhlIHJlc3VsdCBpbnRvIHJlZ2lzdGVyIDYuIAorCitAY2luZGV4IEBjb2Rle2xvfSBwc2V1ZG8tb3AsIFY4NTAKK0BpdGVtIGxvKCkKK0NvbXB1dGVzIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwordGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgorCisgICAgQHNhbXB7YWRkaSBsbyhoZXJlIC0gdGhlcmUpLCByNSwgcjZ9CisKK2NvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgbGFiZWxzICdoZXJlJyBhbmQKKyd0aGVyZScsIHRha2VzIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoaXMgZGlmZmVyZW5jZSBhbmQgYWRkcyBpdCB0bworcmVnaXN0ZXIgNSwgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gcmVnaXN0ZXIgNi4KKworQGNpbmRleCBAY29kZXtoaX0gcHNldWRvLW9wLCBWODUwCitAaXRlbSBoaSgpCitDb21wdXRlcyB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHRoZW4gYWRkcyB0aGUKK3ZhbHVlIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgZXhwcmVzc2lvbgorYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbgoraW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUKK2FkZHJlc3Mgb2YgdGhlIGxhYmVsICdoZXJlJyBhbmQgc3RvcmUgaXQgaW50byByZWdpc3RlciA2OgorCisgICAgQHNhbXB7bW92aGkgaGkoaGVyZSksIHIwLCByNn0KKyAgICBAc2FtcHttb3ZlYSBsbyhoZXJlKSwgcjYsIHI2fQorCitUaGUgcmVhc29uIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3VyIGlzIHRoYXQgbW92ZWEgcGVyZm9ybXMgYSBzaWduCitleHRlbnRpb24gb24gaXRzIGltbWVkaWF0ZSBvcGVyYW5kLiAgU28gZm9yIGV4YW1wbGUgaWYgdGhlIGFkZHJlc3Mgb2YKKydoZXJlJyB3YXMgMHhGRkZGRkZGRiB0aGVuIHdpdGhvdXQgdGhlIHNwZWNpYWwgYmVoYXZpb3VyIG9mIHRoZSBoaSgpCitwc2V1ZG8tb3AgdGhlIG1vdmhpIGluc3RydWN0aW9uIHdvdWxkIHB1dCAweEZGRkYwMDAwIGludG8gcjYsIHRoZW4gdGhlCittb3ZlYSBpbnN0cnVjdGlvbiB3b3VsZCB0YWtlcyBpdHMgaW1tZWRpYXRlIG9wZXJhbmQsIDB4RkZGRiwgc2lnbiBleHRlbmQKK2l0IHRvIDMyIGJpdHMsIDB4RkZGRkZGRkYsIGFuZCB0aGVuIGFkZCBpdCBpbnRvIHI2IGdpdmluZyAweEZGRkVGRkZGCit3aGljaCBpcyB3cm9uZyAodGhlIGZpZnRoIG5pYmJsZSBpcyBFKS4gIFdpdGggdGhlIGhpKCkgcHNldWRvIG9wIGFkZGluZworaW4gdGhlIHRvcCBiaXQgb2YgdGhlIGxvKCkgcHNldWRvIG9wLCB0aGUgbW92aGkgaW5zdHJ1Y3Rpb24gYWN0dWFsbHkKK3N0b3JlcyAwIGludG8gcjYgKDB4RkZGRiArIDEgPSAweDAwMDApLCBzbyB0aGF0IHRoZSBtb3ZlYSBpbnN0cnVjdGlvbgorc3RvcmVzIDB4RkZGRkZGRkYgaW50byByNiAtIHRoZSByaWdodCB2YWx1ZS4KKworQGNpbmRleCBAY29kZXtoaWxvfSBwc2V1ZG8tb3AsIFY4NTAKK0BpdGVtIGhpbG8oKQorQ29tcHV0ZXMgdGhlIDMyIGJpdCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KK3RoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gKHdoaWNoIG11c3QgYmUgYQorbW92IGluc3RydWN0aW9uKS4gIEZvciBleGFtcGxlOgorCisgICAgQHNhbXB7bW92IGhpbG8oaGVyZSksIHI2fQorCitjb21wdXRlcyB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiBsYWJlbCAnaGVyZScgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvCityZWdpc3RlciA2LiAgCisKK0BjaW5kZXggQGNvZGV7c2Rhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKK0BpdGVtIHNkYW9mZigpCitDb21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgU21hbGwKK0RhdGEgQXJlYSAod2hvZXMgYWRkcmVzcyBpcyBoZWxkIGluIHJlZ2lzdGVyIDQsIHRoZSBHUCByZWdpc3RlcikgYW5kCitzdG9yZXMgdGhlIHJlc3VsdCBhcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kCitmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZTogCisKKyAgICAgIEBzYW1we2xkLncgc2Rhb2ZmKF9hX3ZhcmlhYmxlKVtncF0scjZ9CisKK2xvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgbGFiZWwgJ19hX3ZhcmlhYmxlJworaW50byByZWdpc3RlciA2LCBwcm92aWRlZCB0aGF0IHRoZSBsYWJlbCBpcyBsb2NhdGVkIHNvbWV3aGVyZSB3aXRoaW4gKy8tCiszMksgb2YgdGhlIGFkZHJlc3MgaGVsZCBpbiB0aGUgR1AgcmVnaXN0ZXIuICBbTm90ZSB0aGUgbGlua2VyIGFzc3VtZXMKK3RoYXQgdGhlIEdQIHJlZ2lzdGVyIGNvbnRhaW5zIGEgZml4ZWQgYWRkcmVzcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCitsYWJlbCBjYWxsZWQgJ19fZ3AnLiAgVGhpcyBjYW4gZWl0aGVyIGJlIHNldCB1cCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQorbGlua2VyLCBvciBzcGVjaWZpY2FsbHkgc2V0IGJ5IHVzaW5nIHRoZSBAc2FtcHstLWRlZnN5bSBfX2dwPTx2YWx1ZT59Citjb21tYW5kIGxpbmUgb3B0aW9uXS4KKworQGNpbmRleCBAY29kZXt0ZGFvZmZ9IHBzZXVkby1vcCwgVjg1MAorQGl0ZW0gdGRhb2ZmKCkKK0NvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBUaW55CitEYXRhIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiByZWdpc3RlciAzMCwgdGhlIEVQIHJlZ2lzdGVyKSBhbmQKK3N0b3JlcyB0aGUgcmVzdWx0IGFzIGEgNCw1LCA3IG9yIDggYml0IHVuc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUKK29wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgIEBzYW1we3NsZC53IHRkYW9mZihfYV92YXJpYWJsZSlbZXBdLHI2fQorCitsb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGxhYmVsICdfYV92YXJpYWJsZScKK2ludG8gcmVnaXN0ZXIgNiwgcHJvdmlkZWQgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYXRlZCBzb21ld2hlcmUgd2l0aGluICsyNTYKK2J5dGVzIG9mIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlIEVQIHJlZ2lzdGVyLiAgW05vdGUgdGhlIGxpbmtlciBhc3N1bWVzCit0aGF0IHRoZSBFUCByZWdpc3RlciBjb250YWlucyBhIGZpeGVkIGFkZHJlc3Mgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQorbGFiZWwgY2FsbGVkICdfX2VwJy4gIFRoaXMgY2FuIGVpdGhlciBiZSBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUKK2xpbmtlciwgb3Igc3BlY2lmaWNhbGx5IHNldCBieSB1c2luZyB0aGUgQHNhbXB7LS1kZWZzeW0gX19lcD08dmFsdWU+fQorY29tbWFuZCBsaW5lIG9wdGlvbl0uCisKK0BjaW5kZXggQGNvZGV7emRhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKK0BpdGVtIHpkYW9mZigpCitDb21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIGFkZHJlc3MgMCBhbmQgc3RvcmVzIHRoZQorcmVzdWx0IGFzIGEgMTYgYml0IHNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlCitnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgorCisgICAgICBAc2FtcHttb3ZlYSB6ZGFvZmYoX2FfdmFyaWFibGUpLHplcm8scjZ9CisKK3B1dHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhYmVsICdfYV92YXJpYWJsZScgaW50byByZWdpc3RlciA2LCBhc3N1bWluZwordGhhdCB0aGUgbGFiZWwgaXMgc29tZXdoZXJlIHdpdGhpbiB0aGUgZmlyc3QgMzJLIG9mIG1lbW9yeS4gIChTdHJpY3RseQorc3BlYWtpbmcgaXQgYWxzbyBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGxhc3QgMzJLIG9mIG1lbW9yeSBhcyB3ZWxsLCBhcwordGhlIG9mZnNldHMgYXJlIHNpZ25lZCkuCisKK0BjaW5kZXggQGNvZGV7Y3RvZmZ9IHBzZXVkby1vcCwgVjg1MAorQGl0ZW0gY3RvZmYoKQorQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIENhbGwKK1RhYmxlIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZyBpbiBzeXN0ZW0gcmVnaXN0ZXIgMjAsIHRoZSBDVEJQCityZWdpc3RlcikgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGEgNiBvciAxNiBiaXQgdW5zaWduZWQgdmFsdWUgaW4gdGhlCitpbW1lZGlhdGUgZmllbGQgb2YgdGhlbiBnaXZlbiBpbnN0cnVjdGlvbiBvciBwaWVjZSBvZiBkYXRhLiAgRm9yCitleGFtcGxlOgorCisgICAgIEBzYW1we2NhbGx0IGN0b2ZmKHRhYmxlX2Z1bmMxKX0KKword2lsbCBwdXQgdGhlIGNhbGwgdGhlIGZ1bmN0aW9uIHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiB0aGUgY2FsbCB0YWJsZQorYXQgdGhlIGxvY2F0aW9uIGxhYmVsZWQgJ3RhYmxlX2Z1bmMxJy4KKworQGVuZCB0YWJsZQorCisKK0ZvciBpbmZvcm1hdGlvbiBvbiB0aGUgVjg1MCBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtWODUwCitGYW1pbHkgMzItLzE2LUJpdCBzaW5nbGUtQ2hpcCBNaWNyb2NvbnRyb2xsZXIgQXJjaGl0ZWN0dXJlIE1hbnVhbH0gZnJvbSBORUMuCitMdGQuCisKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy12YXgudGV4aSBiL2dhcy9kb2MvYy12YXgudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNkN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9jLXZheC50ZXhpCkBAIC0wLDAgKzEsMzU3IEBACitAYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGMgVkFYL1ZNUyBkZXNjcmlwdGlvbiBleGhhbmNlZCBhbmQgY29ycmVjdGVkIGJ5IEtsYXVzIEsiYWVtcGYsIGtrYWVtcGZAcHJvZ2lzLmRlCitAaWZzZXQgR0VORVJJQworQG5vZGUgVmF4LURlcGVuZGVudAorQGNoYXB0ZXIgVkFYIERlcGVuZGVudCBGZWF0dXJlcworQGNpbmRleCBWQVggc3VwcG9ydAorCitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcworQGNoYXB0ZXIgVkFYIERlcGVuZGVudCBGZWF0dXJlcworQGNpbmRleCBWQVggc3VwcG9ydAorCitAZW5kIGlmY2xlYXIKKworQG1lbnUKKyogVkFYLU9wdHM6OiAgICAgICAgICAgICAgICAgICAgVkFYIENvbW1hbmQtTGluZSBPcHRpb25zCisqIFZBWC1mbG9hdDo6ICAgICAgICAgICAgICAgICAgIFZBWCBGbG9hdGluZyBQb2ludAorKiBWQVgtZGlyZWN0aXZlczo6ICAgICAgICAgICAgICBWYXggTWFjaGluZSBEaXJlY3RpdmVzCisqIFZBWC1vcGNvZGVzOjogICAgICAgICAgICAgICAgIFZBWCBPcGNvZGVzCisqIFZBWC1icmFuY2g6OiAgICAgICAgICAgICAgICAgIFZBWCBCcmFuY2ggSW1wcm92ZW1lbnQKKyogVkFYLW9wZXJhbmRzOjogICAgICAgICAgICAgICAgVkFYIE9wZXJhbmRzCisqIFZBWC1ubzo6ICAgICAgICAgICAgICAgICAgICAgIE5vdCBTdXBwb3J0ZWQgb24gVkFYCitAZW5kIG1lbnUKKworCitAbm9kZSBWQVgtT3B0cworQHNlY3Rpb24gVkFYIENvbW1hbmQtTGluZSBPcHRpb25zCisKK0BjaW5kZXggY29tbWFuZC1saW5lIG9wdGlvbnMgaWdub3JlZCwgVkFYCitAY2luZGV4IFZBWCBjb21tYW5kLWxpbmUgb3B0aW9ucyBpZ25vcmVkCitUaGUgVmF4IHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zLAorZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgdGhhdCB0aGUgb3B0aW9uIHdhcyBpZ25vcmVkIGFuZCBwcm9jZWVkcy4KK1RoZXNlIG9wdGlvbnMgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc2NyaXB0cyBkZXNpZ25lZCBmb3Igb3RoZXIKK3Blb3BsZSdzIGFzc2VtYmxlcnMuCisKK0B0YWJsZSBAY29kZQorQGNpbmRleCBAY29kZXstRH0sIGlnbm9yZWQgb24gVkFYCitAY2luZGV4IEBjb2Rley1TfSwgaWdub3JlZCBvbiBWQVgKK0BjaW5kZXggQGNvZGV7LVR9LCBpZ25vcmVkIG9uIFZBWAorQGl0ZW0gQGNvZGV7LUR9IChEZWJ1ZykKK0BpdGVteCBAY29kZXstU30gKFN5bWJvbCBUYWJsZSkKK0BpdGVteCBAY29kZXstVH0gKFRva2VuIFRyYWNlKQorVGhlc2UgYXJlIG9ic29sZXRlIG9wdGlvbnMgdXNlZCB0byBkZWJ1ZyBvbGQgYXNzZW1ibGVycy4KKworQGNpbmRleCBAY29kZXstZH0sIFZBWCBvcHRpb24KK0BpdGVtIEBjb2Rley1kfSAoRGlzcGxhY2VtZW50IHNpemUgZm9yIEpVTVBzKQorVGhpcyBvcHRpb24gZXhwZWN0cyBhIG51bWJlciBmb2xsb3dpbmcgdGhlIEBzYW1wey1kfS4gIExpa2Ugb3B0aW9ucwordGhhdCBleHBlY3QgZmlsZW5hbWVzLCB0aGUgbnVtYmVyIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlCitAc2FtcHstZH0gKG9sZCBzdGFuZGFyZCkgb3IgY29uc3RpdHV0ZSB0aGUgd2hvbGUgb2YgdGhlIGNvbW1hbmQgbGluZQorYXJndW1lbnQgdGhhdCBmb2xsb3dzIEBzYW1wey1kfSAoQHNje2dudX0gc3RhbmRhcmQpLgorCitAY2luZGV4IEBjb2Rley1WfSwgcmVkdW5kYW50IG9uIFZBWAorQGl0ZW0gQGNvZGV7LVZ9IChWaXJ0dWFsaXplIEludGVycGFzcyBUZW1wb3JhcnkgRmlsZSkKK1NvbWUgb3RoZXIgYXNzZW1ibGVycyB1c2UgYSB0ZW1wb3JhcnkgZmlsZS4gIFRoaXMgb3B0aW9uCitjb21tYW5kZWQgdGhlbSB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBpbiBhY3RpdmUgbWVtb3J5IHJhdGhlcgordGhhbiBpbiBhIGRpc2sgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IGFsd2F5cyBkb2VzIHRoaXMsIHNvIHRoaXMKK29wdGlvbiBpcyByZWR1bmRhbnQuCisKK0BjaW5kZXggQGNvZGV7LUp9LCBpZ25vcmVkIG9uIFZBWAorQGl0ZW0gQGNvZGV7LUp9IChKVU1QaWZ5IExvbmdlciBCcmFuY2hlcykKK01hbnkgMzItYml0IGNvbXB1dGVycyBwZXJtaXQgYSB2YXJpZXR5IG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMKK3RvIGRvIHRoZSBzYW1lIGpvYi4gIFNvbWUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCAoYW5kCitmYXN0KSBidXQgaGF2ZSBhIGxpbWl0ZWQgcmFuZ2U7IG90aGVycyBhcmUgbG9uZyAoYW5kIHNsb3cpIGJ1dAorY2FuIGJyYW5jaCBhbnl3aGVyZSBpbiB2aXJ0dWFsIG1lbW9yeS4gIE9mdGVuIHRoZXJlIGFyZSAzCitmbGF2b3JzIG9mIGJyYW5jaDogc2hvcnQsIG1lZGl1bSBhbmQgbG9uZy4gIFNvbWUgb3RoZXIKK2Fzc2VtYmxlcnMgd291bGQgZW1pdCBzaG9ydCBhbmQgbWVkaXVtIGJyYW5jaGVzLCB1bmxlc3MgdG9sZCBieQordGhpcyBvcHRpb24gdG8gZW1pdCBzaG9ydCBhbmQgbG9uZyBicmFuY2hlcy4KKworQGNpbmRleCBAY29kZXstdH0sIGlnbm9yZWQgb24gVkFYCitAaXRlbSBAY29kZXstdH0gKFRlbXBvcmFyeSBGaWxlIERpcmVjdG9yeSkKK1NvbWUgb3RoZXIgYXNzZW1ibGVycyBtYXkgdXNlIGEgdGVtcG9yYXJ5IGZpbGUsIGFuZCB0aGlzIG9wdGlvbgordGFrZXMgYSBmaWxlbmFtZSBiZWluZyB0aGUgZGlyZWN0b3J5IHRvIHNpdGUgdGhlIHRlbXBvcmFyeQorZmlsZS4gIFNpbmNlIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90IHVzZSBhIHRlbXBvcmFyeSBkaXNrIGZpbGUsIHRoaXMKK29wdGlvbiBtYWtlcyBubyBkaWZmZXJlbmNlLiAgQHNhbXB7LXR9IG5lZWRzIGV4YWN0bHkgb25lCitmaWxlbmFtZS4KK0BlbmQgdGFibGUKKworQGNpbmRleCBWTVMgKFZBWCkgb3B0aW9ucworQGNpbmRleCBvcHRpb25zIGZvciBWQVgvVk1TCitAY2luZGV4IFZBWC9WTVMgb3B0aW9ucworQGNpbmRleCBWYXgtMTEgQyBjb21wYXRpYmlsaXR5CitAY2luZGV4IHN5bWJvbHMgd2l0aCB1cHBlcmNhc2UsIFZBWC9WTVMKK1RoZSBWYXggdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIGFjY2VwdHMgYWRkaXRpb25hbCBvcHRpb25zIHdoZW4KK2NvbXBpbGVkIGZvciBWTVM6CisKK0B0YWJsZSBAc2FtcAorQGNpbmRleCBAc2FtcHstaH0gb3B0aW9uLCBWQVgvVk1TCitAaXRlbSAtaCBAdmFye259CitFeHRlcm5hbCBzeW1ib2wgb3Igc2VjdGlvbiAodXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcykgbmFtZXMgYXJlIG5vdAorY2FzZSBzZW5zaXRpdmUgb24gVkFYL1ZNUyBhbmQgYWx3YXlzIG1hcHBlZCB0byB1cHBlciBjYXNlLiAgVGhpcyBpcworY29udHJhcnkgdG8gdGhlIEMgbGFuZ3VhZ2UgZGVmaW5pdGlvbiB3aGljaCBleHBsaWNpdGx5IGRpc3Rpbmd1aXNoZXMKK3VwcGVyIGFuZCBsb3dlciBjYXNlLiAgVG8gaW1wbGVtZW50IGEgc3RhbmRhcmQgY29uZm9ybWluZyBDIGNvbXBpbGVyLAorbmFtZXMgbXVzdCBiZSBjaGFuZ2VkIChtYXBwZWQpIHRvIHByZXNlcnZlIHRoZSBjYXNlIGluZm9ybWF0aW9uLiAgVGhlCitkZWZhdWx0IG1hcHBpbmcgaXMgdG8gY29udmVydCBhbGwgbG93ZXIgY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZSBhbmQKK2FkZGluZyBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGEgNiBkaWdpdCBoZXggdmFsdWUsIHJlcHJlc2VudGluZyBhIDI0CitkaWdpdCBiaW5hcnkgdmFsdWUuICBUaGUgb25lIGRpZ2l0cyBpbiB0aGUgYmluYXJ5IHZhbHVlIHJlcHJlc2VudCB3aGljaAorY2hhcmFjdGVycyBhcmUgdXBwZXJjYXNlIGluIHRoZSBvcmlnaW5hbCBzeW1ib2wgbmFtZS4KKworVGhlIEBzYW1wey1oIEB2YXJ7bn19IG9wdGlvbiBkZXRlcm1pbmVzIGhvdyB3ZSBtYXAgbmFtZXMuICBUaGlzIHRha2VzCitzZXZlcmFsIHZhbHVlcy4gIE5vIEBzYW1wey1ofSBzd2l0Y2ggYXQgYWxsIGFsbG93cyBjYXNlIGhhY2tpbmcgYXMKK2Rlc2NyaWJlZCBhYm92ZS4gIEEgdmFsdWUgb2YgemVybyAoQHNhbXB7LWgwfSkgaW1wbGllcyBuYW1lcyBzaG91bGQgYmUKK3VwcGVyIGNhc2UsIGFuZCBpbmhpYml0cyB0aGUgY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAyIChAc2FtcHstaDJ9KQoraW1wbGllcyBuYW1lcyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UsIHdpdGggbm8gY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAzCisoQHNhbXB7LWgzfSkgaW1wbGllcyB0aGF0IGNhc2Ugc2hvdWxkIGJlIHByZXNlcnZlZC4gIFRoZSB2YWx1ZSAxIGlzCit1bnVzZWQuICBUaGUgQGNvZGV7LUh9IG9wdGlvbiBkaXJlY3RzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGRpc3BsYXkKK2V2ZXJ5IG1hcHBlZCBzeW1ib2wgZHVyaW5nIGFzc2VtYmx5LgorCitTeW1ib2xzIHdob3NlIG5hbWVzIGluY2x1ZGUgYSBkb2xsYXIgc2lnbiBAc2FtcHskfSBhcmUgZXhjZXB0aW9ucyB0byB0aGUKK2dlbmVyYWwgbmFtZSBtYXBwaW5nLiAgVGhlc2Ugc3ltYm9scyBhcmUgbm9ybWFsbHkgb25seSB1c2VkIHRvIHJlZmVyZW5jZQorVk1TIGxpYnJhcnkgbmFtZXMuICBTdWNoIHN5bWJvbHMgYXJlIGFsd2F5cyBtYXBwZWQgdG8gdXBwZXIgY2FzZS4KKworQGNpbmRleCBAc2FtcHstK30gb3B0aW9uLCBWQVgvVk1TCitAaXRlbSAtKworVGhlIEBzYW1wey0rfSBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHRydW5jYXRlIGFueSBzeW1ib2wKK25hbWUgbGFyZ2VyIHRoYW4gMzEgY2hhcmFjdGVycy4gIFRoZSBAc2FtcHstK30gb3B0aW9uIGFsc28gcHJldmVudHMgc29tZQorY29kZSBmb2xsb3dpbmcgdGhlIEBzYW1we19tYWlufSBzeW1ib2wgbm9ybWFsbHkgYWRkZWQgdG8gbWFrZSB0aGUgb2JqZWN0CitmaWxlIGNvbXBhdGlibGUgd2l0aCBWYXgtMTEgIkMiLgorCitAY2luZGV4IEBzYW1wey0xfSBvcHRpb24sIFZBWC9WTVMKK0BpdGVtIC0xCitUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggQGNvZGV7QHZhbHVle0FTfX0KK3ZlcnNpb24gMS54LgorCitAY2luZGV4IEBzYW1wey1IfSBvcHRpb24sIFZBWC9WTVMKK0BpdGVtIC1ICitUaGUgQHNhbXB7LUh9IG9wdGlvbiBjYXVzZXMgQGNvZGV7QHZhbHVle0FTfX0gdG8gcHJpbnQgZXZlcnkgc3ltYm9sCit3aGljaCB3YXMgY2hhbmdlZCBieSBjYXNlIG1hcHBpbmcuCitAZW5kIHRhYmxlCisKK0Bub2RlIFZBWC1mbG9hdAorQHNlY3Rpb24gVkFYIEZsb2F0aW5nIFBvaW50CisKK0BjaW5kZXggVkFYIGZsb2F0aW5nIHBvaW50CitAY2luZGV4IGZsb2F0aW5nIHBvaW50LCBWQVgKK0NvbnZlcnNpb24gb2YgZmxvbnVtcyB0byBmbG9hdGluZyBwb2ludCBpcyBjb3JyZWN0LCBhbmQKK2NvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBhc3NlbWJsZXJzLiAgUm91bmRpbmcgaXMKK3Rvd2FyZHMgemVybyBpZiB0aGUgcmVtYWluZGVyIGlzIGV4YWN0bHkgaGFsZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgorCitAY29kZXtEfSwgQGNvZGV7Rn0sIEBjb2Rle0d9IGFuZCBAY29kZXtIfSBmbG9hdGluZyBwb2ludCBmb3JtYXRzCithcmUgdW5kZXJzdG9vZC4KKworSW1tZWRpYXRlIGZsb2F0aW5nIGxpdGVyYWxzIChAZW1waHtlLmcufSBAc2FtcHtTYCQ2Ljl9KQorYXJlIHJlbmRlcmVkIGNvcnJlY3RseS4gIEFnYWluLCByb3VuZGluZyBpcyB0b3dhcmRzIHplcm8gaW4gdGhlCitib3VuZGFyeSBjYXNlLgorCitAY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIFZBWAorQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZSwgVkFYCitUaGUgQGNvZGV7LmZsb2F0fSBkaXJlY3RpdmUgcHJvZHVjZXMgQGNvZGV7Zn0gZm9ybWF0IG51bWJlcnMuCitUaGUgQGNvZGV7LmRvdWJsZX0gZGlyZWN0aXZlIHByb2R1Y2VzIEBjb2Rle2R9IGZvcm1hdCBudW1iZXJzLgorCitAbm9kZSBWQVgtZGlyZWN0aXZlcworQHNlY3Rpb24gVmF4IE1hY2hpbmUgRGlyZWN0aXZlcworCitAY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgVkFYCitAY2luZGV4IFZBWCBtYWNoaW5lIGRpcmVjdGl2ZXMKK1RoZSBWYXggdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIHN1cHBvcnRzIGZvdXIgZGlyZWN0aXZlcyBmb3IKK2dlbmVyYXRpbmcgVmF4IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbiB0aGUKK3RhYmxlIGJlbG93LgorCitAY2luZGV4IHdpZGUgZmxvYXRpbmcgcG9pbnQgZGlyZWN0aXZlcywgVkFYCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7ZGZsb2F0fSBkaXJlY3RpdmUsIFZBWAorQGl0ZW0gLmRmbG9hdAorVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKK2Fzc2VtYmxlcyBWYXggQGNvZGV7ZH0gZm9ybWF0IDY0LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCisKK0BjaW5kZXggQGNvZGV7ZmZsb2F0fSBkaXJlY3RpdmUsIFZBWAorQGl0ZW0gLmZmbG9hdAorVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKK2Fzc2VtYmxlcyBWYXggQGNvZGV7Zn0gZm9ybWF0IDMyLWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCisKK0BjaW5kZXggQGNvZGV7Z2Zsb2F0fSBkaXJlY3RpdmUsIFZBWAorQGl0ZW0gLmdmbG9hdAorVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKK2Fzc2VtYmxlcyBWYXggQGNvZGV7Z30gZm9ybWF0IDY0LWJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCisKK0BjaW5kZXggQGNvZGV7aGZsb2F0fSBkaXJlY3RpdmUsIFZBWAorQGl0ZW0gLmhmbG9hdAorVGhpcyBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBhbmQKK2Fzc2VtYmxlcyBWYXggQGNvZGV7aH0gZm9ybWF0IDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgorCitAZW5kIHRhYmxlCisKK0Bub2RlIFZBWC1vcGNvZGVzCitAc2VjdGlvbiBWQVggT3Bjb2RlcworCitAY2luZGV4IFZBWCBvcGNvZGUgbW5lbW9uaWNzCitAY2luZGV4IG9wY29kZSBtbmVtb25pY3MsIFZBWAorQGNpbmRleCBtbmVtb25pY3MgZm9yIG9wY29kZXMsIFZBWAorQWxsIERFQyBtbmVtb25pY3MgYXJlIHN1cHBvcnRlZC4gIEJld2FyZSB0aGF0IEBjb2Rle2Nhc2VAZG90c3t9fQoraW5zdHJ1Y3Rpb25zIGhhdmUgZXhhY3RseSAzIG9wZXJhbmRzLiAgVGhlIGRpc3BhdGNoIHRhYmxlIHRoYXQKK2ZvbGxvd3MgdGhlIEBjb2Rle2Nhc2VAZG90c3t9fSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgbWFkZSB3aXRoCitAY29kZXsud29yZH0gc3RhdGVtZW50cy4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCB1bml4Cithc3NlbWJsZXJzIHdlIGtub3cgb2YuCisKK0Bub2RlIFZBWC1icmFuY2gKK0BzZWN0aW9uIFZBWCBCcmFuY2ggSW1wcm92ZW1lbnQKKworQGNpbmRleCBWQVggYnJhbmNoIGltcHJvdmVtZW50CitAY2luZGV4IGJyYW5jaCBpbXByb3ZlbWVudCwgVkFYCitAY2luZGV4IHBzZXVkby1vcHMgZm9yIGJyYW5jaCwgVkFYCitDZXJ0YWluIHBzZXVkbyBvcGNvZGVzIGFyZSBwZXJtaXR0ZWQuICBUaGV5IGFyZSBmb3IgYnJhbmNoCitpbnN0cnVjdGlvbnMuICBUaGV5IGV4cGFuZCB0byB0aGUgc2hvcnRlc3QgYnJhbmNoIGluc3RydWN0aW9uIHRoYXQKK3JlYWNoZXMgdGhlIHRhcmdldC4gIEdlbmVyYWxseSB0aGVzZSBtbmVtb25pY3MgYXJlIG1hZGUgYnkKK3N1YnN0aXR1dGluZyBAc2FtcHtqfSBmb3IgQHNhbXB7Yn0gYXQgdGhlIHN0YXJ0IG9mIGEgREVDIG1uZW1vbmljLgorVGhpcyBmZWF0dXJlIGlzIGluY2x1ZGVkIGJvdGggZm9yIGNvbXBhdGliaWxpdHkgYW5kIHRvIGhlbHAKK2NvbXBpbGVycy4gIElmIHlvdSBkbyBub3QgbmVlZCB0aGlzIGZlYXR1cmUsIGF2b2lkIHRoZXNlCitvcGNvZGVzLiAgSGVyZSBhcmUgdGhlIG1uZW1vbmljcywgYW5kIHRoZSBjb2RlIHRoZXkgY2FuIGV4cGFuZCBpbnRvLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGpic2IKK0BzYW1we0pzYn0gaXMgYWxyZWFkeSBhbiBpbnN0cnVjdGlvbiBtbmVtb25pYywgc28gd2UgY2hvc2UgQHNhbXB7amJzYn0uCitAdGFibGUgQGFzaXMKK0BpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKK0BrYmR7YnNiYiBAZG90c3t9fQorQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQorQGtiZHtic2J3IEBkb3Rze319CitAaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCitAa2Jke2pzYiBAZG90c3t9fQorQGVuZCB0YWJsZQorQGl0ZW0gamJyCitAaXRlbXgganIKK1VuY29uZGl0aW9uYWwgYnJhbmNoLgorQHRhYmxlIEBhc2lzCitAaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCitAa2Jke2JyYiBAZG90c3t9fQorQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQorQGtiZHticncgQGRvdHN7fX0KK0BpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKK0BrYmR7am1wIEBkb3Rze319CitAZW5kIHRhYmxlCitAaXRlbSBqQHZhcntDT05EfQorQHZhcntDT05EfSBtYXkgYmUgYW55IG9uZSBvZiB0aGUgY29uZGl0aW9uYWwgYnJhbmNoZXMKK0Bjb2Rle25lcX0sIEBjb2Rle25lcXV9LCBAY29kZXtlcWx9LCBAY29kZXtlcWx1fSwgQGNvZGV7Z3RyfSwKK0Bjb2Rle2dlcX0sIEBjb2Rle2xzc30sIEBjb2Rle2d0cnV9LCBAY29kZXtsZXF1fSwgQGNvZGV7dmN9LCBAY29kZXt2c30sCitAY29kZXtnZXF1fSwgQGNvZGV7Y2N9LCBAY29kZXtsc3N1fSwgQGNvZGV7Y3N9LgorQHZhcntDT05EfSBtYXkgYWxzbyBiZSBvbmUgb2YgdGhlIGJpdCB0ZXN0cworQGNvZGV7YnN9LCBAY29kZXtiY30sIEBjb2Rle2Jzc30sIEBjb2Rle2Jjc30sIEBjb2Rle2JzY30sIEBjb2Rle2JjY30sCitAY29kZXtic3NpfSwgQGNvZGV7YmNjaX0sIEBjb2Rle2xic30sIEBjb2Rle2xiY30uCitAdmFye05PVENPTkR9IGlzIHRoZSBvcHBvc2l0ZSBjb25kaXRpb24gdG8gQHZhcntDT05EfS4KK0B0YWJsZSBAYXNpcworQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQorQGtiZHtiQHZhcntDT05EfSBAZG90c3t9fQorQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQorQGtiZHtiQHZhcntOT1RDT05EfSBmb28gOyBicncgQGRvdHN7fSA7IGZvbzp9CitAaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCitAa2Jke2JAdmFye05PVENPTkR9IGZvbyA7IGptcCBAZG90c3t9IDsgZm9vOn0KK0BlbmQgdGFibGUKK0BpdGVtIGphY2JAdmFye1h9CitAdmFye1h9IG1heSBiZSBvbmUgb2YgQGNvZGV7YiBkIGYgZyBoIGwgd30uCitAdGFibGUgQGFzaXMKK0BpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKK0BrYmR7QHZhcntPUENPREV9IEBkb3Rze319CitAaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCitAZXhhbXBsZQorQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7CiticmIgYmFyIDsKK2Zvbzogam1wIEBkb3Rze30gOworYmFyOgorQGVuZCBleGFtcGxlCitAZW5kIHRhYmxlCitAaXRlbSBqYW9iQHZhcntZWVl9CitAdmFye1lZWX0gbWF5IGJlIG9uZSBvZiBAY29kZXtsc3MgbGVxfS4KK0BpdGVtIGpzb2JAdmFye1paWn0KK0B2YXJ7WlpafSBtYXkgYmUgb25lIG9mIEBjb2Rle2dlcSBndHJ9LgorQHRhYmxlIEBhc2lzCitAaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCitAa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQorQGl0ZW0gKHdvcmQgZGlzcGxhY2VtZW50KQorQGV4YW1wbGUKK0B2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOworYnJiIGJhciA7Citmb286IGJydyBAdmFye2Rlc3RpbmF0aW9ufSA7CitiYXI6CitAZW5kIGV4YW1wbGUKK0BpdGVtIChsb25nIGRpc3BsYWNlbWVudCkKK0BleGFtcGxlCitAdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKK2JyYiBiYXIgOworZm9vOiBqbXAgQHZhcntkZXN0aW5hdGlvbn0gOworYmFyOgorQGVuZCBleGFtcGxlCitAZW5kIHRhYmxlCitAaXRlbSBhb2JsZXEKK0BpdGVteCBhb2Jsc3MKK0BpdGVteCBzb2JnZXEKK0BpdGVteCBzb2JndHIKK0B0YWJsZSBAYXNpcworQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQorQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KK0BpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKK0BleGFtcGxlCitAdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKK2JyYiBiYXIgOworZm9vOiBicncgQHZhcntkZXN0aW5hdGlvbn0gOworYmFyOgorQGVuZCBleGFtcGxlCitAaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCitAZXhhbXBsZQorQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7CiticmIgYmFyIDsKK2Zvbzogam1wIEB2YXJ7ZGVzdGluYXRpb259IDsKK2JhcjoKK0BlbmQgZXhhbXBsZQorQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorCitAbm9kZSBWQVgtb3BlcmFuZHMKK0BzZWN0aW9uIFZBWCBPcGVyYW5kcworCitAY2luZGV4IFZBWCBvcGVyYW5kIG5vdGF0aW9uCitAY2luZGV4IG9wZXJhbmQgbm90YXRpb24sIFZBWAorQGNpbmRleCBpbW1lZGlhdGUgY2hhcmFjdGVyLCBWQVgKK0BjaW5kZXggVkFYIGltbWVkaWF0ZSBjaGFyYWN0ZXIKK1RoZSBpbW1lZGlhdGUgY2hhcmFjdGVyIGlzIEBzYW1weyR9IGZvciBVbml4IGNvbXBhdGliaWxpdHksIG5vdAorQHNhbXB7I30gYXMgREVDIHdyaXRlcyBpdC4KKworQGNpbmRleCBpbmRpcmVjdCBjaGFyYWN0ZXIsIFZBWAorQGNpbmRleCBWQVggaW5kaXJlY3QgY2hhcmFjdGVyCitUaGUgaW5kaXJlY3QgY2hhcmFjdGVyIGlzIEBzYW1weyp9IGZvciBVbml4IGNvbXBhdGliaWxpdHksIG5vdAorQHNhbXB7QEB9IGFzIERFQyB3cml0ZXMgaXQuCisKK0BjaW5kZXggZGlzcGxhY2VtZW50IHNpemluZyBjaGFyYWN0ZXIsIFZBWAorQGNpbmRleCBWQVggZGlzcGxhY2VtZW50IHNpemluZyBjaGFyYWN0ZXIKK1RoZSBkaXNwbGFjZW1lbnQgc2l6aW5nIGNoYXJhY3RlciBpcyBAc2FtcHtgfSAoYW4gYWNjZW50IGdyYXZlKSBmb3IKK1VuaXggY29tcGF0aWJpbGl0eSwgbm90IEBzYW1we159IGFzIERFQyB3cml0ZXMgaXQuICBUaGUgbGV0dGVyCitwcmVjZWRpbmcgQHNhbXB7YH0gbWF5IGhhdmUgZWl0aGVyIGNhc2UuICBAc2FtcHtHfSBpcyBub3QKK3VuZGVyc3Rvb2QsIGJ1dCBhbGwgb3RoZXIgbGV0dGVycyAoQGNvZGV7YiBpIGwgcyB3fSkgYXJlIHVuZGVyc3Rvb2QuCisKK0BjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIFZBWAorQGNpbmRleCBWQVggcmVnaXN0ZXIgbmFtZXMKK1JlZ2lzdGVyIG5hbWVzIHVuZGVyc3Rvb2QgYXJlIEBjb2Rle3IwIHIxIHIyIEBkb3Rze30gcjE1IGFwIGZwIHNwCitwY30uICBVcHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzIGFyZSBlcXVpdmFsZW50LgorCitGb3IgaW5zdGFuY2UKK0BzbWFsbGV4YW1wbGUKK3RzdGIgKndgJDQocjUpCitAZW5kIHNtYWxsZXhhbXBsZQorCitBbnkgZXhwcmVzc2lvbiBpcyBwZXJtaXR0ZWQgaW4gYW4gb3BlcmFuZC4gIE9wZXJhbmRzIGFyZSBjb21tYQorc2VwYXJhdGVkLgorCitAYyBUaGVyZSBpcyBzb21lIGJ1ZyB0byBkbyB3aXRoIHJlY29nbml6aW5nIGV4cHJlc3Npb25zCitAYyBpbiBvcGVyYW5kcywgYnV0IEkgZm9yZ2V0IHdoYXQgaXQgaXMuICBJdCBpcworQGMgYSBzeW50YXggY2xhc2ggYmVjYXVzZSAoKSBpcyB1c2VkIGFzIGFuIGFkZHJlc3MgbW9kZQorQGMgYW5kIHRvIGVuY2Fwc3VsYXRlIHN1Yi1leHByZXNzaW9ucy4KKworQG5vZGUgVkFYLW5vCitAc2VjdGlvbiBOb3QgU3VwcG9ydGVkIG9uIFZBWAorCitAY2luZGV4IFZBWCBiaXRmaWVsZHMgbm90IHN1cHBvcnRlZAorQGNpbmRleCBiaXRmaWVsZHMsIG5vdCBzdXBwb3J0ZWQgb24gVkFYCitWYXggYml0IGZpZWxkcyBjYW4gbm90IGJlIGFzc2VtYmxlZCB3aXRoIEBjb2Rle0B2YWx1ZXtBU319LiAgU29tZW9uZQorY2FuIGFkZCB0aGUgcmVxdWlyZWQgY29kZSBpZiB0aGV5IHJlYWxseSBuZWVkIGl0LgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLXo4ay50ZXhpIGIvZ2FzL2RvYy9jLXo4ay50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjEwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL2MtejhrLnRleGkKQEAgLTAsMCArMSwzODAgQEAKK0BjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KK0BjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgorQGlmc2V0IEdFTkVSSUMKK0BwYWdlCitAbm9kZSBaODAwMC1EZXBlbmRlbnQKK0BjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKK0BjaGFwdGVyIFo4MDAwIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggWjgwMDAgc3VwcG9ydAorVGhlIFo4MDAwIEB2YWx1ZXtBU30gc3VwcG9ydHMgYm90aCBtZW1iZXJzIG9mIHRoZSBaODAwMCBmYW1pbHk6IHRoZQordW5zZWdtZW50ZWQgWjgwMDIsIHdpdGggMTYgYml0IGFkZHJlc3NlcywgYW5kIHRoZSBzZWdtZW50ZWQgWjgwMDEgd2l0aAorMjQgYml0IGFkZHJlc3Nlcy4KKworV2hlbiB0aGUgYXNzZW1ibGVyIGlzIGluIHVuc2VnbWVudGVkIG1vZGUgKHNwZWNpZmllZCB3aXRoIHRoZQorQGNvZGV7dW5zZWdtfSBkaXJlY3RpdmUpLCBhbiBhZGRyZXNzIHRha2VzIHVwIG9uZSB3b3JkICgxNiBiaXQpCitzaXplZCByZWdpc3Rlci4gIFdoZW4gdGhlIGFzc2VtYmxlciBpcyBpbiBzZWdtZW50ZWQgbW9kZSAoc3BlY2lmaWVkIHdpdGgKK3RoZSBAY29kZXtzZWdtfSBkaXJlY3RpdmUpLCBhIDI0LWJpdCBhZGRyZXNzIHRha2VzIHVwIGEgbG9uZyAoMzIgYml0KQorcmVnaXN0ZXIuICBAeHJlZntaODAwMCBEaXJlY3RpdmVzLCxBc3NlbWJsZXIgRGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwfSwKK2ZvciBhIGxpc3Qgb2Ygb3RoZXIgWjgwMDAgc3BlY2lmaWMgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCisKK0BtZW51CisqIFo4MDAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgIE5vIHNwZWNpYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIFo4MDAwCisqIFo4MDAwIFN5bnRheDo6ICAgICAgICAgICAgICAgIEFzc2VtYmxlciBzeW50YXggZm9yIHRoZSBaODAwMAorKiBaODAwMCBEaXJlY3RpdmVzOjogICAgICAgICAgICBTcGVjaWFsIGRpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMAorKiBaODAwMCBPcGNvZGVzOjogICAgICAgICAgICAgICBPcGNvZGVzCitAZW5kIG1lbnUKKworQG5vZGUgWjgwMDAgT3B0aW9ucworQHNlY3Rpb24gT3B0aW9ucworCitAY2luZGV4IFo4MDAwIG9wdGlvbnMKK0BjaW5kZXggb3B0aW9ucywgWjgwMDAKK0Bjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgWmlsb2cKK1o4MDAwIGZhbWlseS4KKworQG5vZGUgWjgwMDAgU3ludGF4CitAc2VjdGlvbiBTeW50YXgKK0BtZW51CisqIFo4MDAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCisqIFo4MDAwLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKKyogWjgwMDAtQWRkcmVzc2luZzo6ICAgICAgICAgICBBZGRyZXNzaW5nIE1vZGVzCitAZW5kIG1lbnUKKworQG5vZGUgWjgwMDAtQ2hhcnMKK0BzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycworCitAY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIFo4MDAwCitAY2luZGV4IFo4MDAwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKK0BzYW1weyF9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgorCitAY2luZGV4IGxpbmUgc2VwYXJhdG9yLCBaODAwMAorQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBaODAwMAorQGNpbmRleCBaODAwMCBsaW5lIHNlcGFyYXRvcgorWW91IGNhbiB1c2UgQHNhbXB7O30gaW5zdGVhZCBvZiBhIG5ld2xpbmUgdG8gc2VwYXJhdGUgc3RhdGVtZW50cy4KKworQG5vZGUgWjgwMDAtUmVncworQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKKworQGNpbmRleCBaODAwMCByZWdpc3RlcnMKK0BjaW5kZXggcmVnaXN0ZXJzLCBaODAwMAorVGhlIFo4MDAwIGhhcyBzaXh0ZWVuIDE2IGJpdCByZWdpc3RlcnMsIG51bWJlcmVkIDAgdG8gMTUuICBZb3UgY2FuIHJlZmVyCit0byBkaWZmZXJlbnQgc2l6ZWQgZ3JvdXBzIG9mIHJlZ2lzdGVycyBieSByZWdpc3RlciBudW1iZXIsIHdpdGggdGhlCitwcmVmaXggQHNhbXB7cn0gZm9yIDE2IGJpdCByZWdpc3RlcnMsIEBzYW1we3JyfSBmb3IgMzIgYml0IHJlZ2lzdGVycyBhbmQKK0BzYW1we3JxfSBmb3IgNjQgYml0IHJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgY29udGVudHMgb2YKK3RoZSBmaXJzdCBlaWdodCAob2YgdGhlIHNpeHRlZW4gMTYgYml0IHJlZ2lzdGVycykgYnkgYnl0ZXMuICBUaGV5IGFyZQorbmFtZWQgQHNhbXB7ckB2YXJ7bn1ofSBhbmQgQHNhbXB7ckB2YXJ7bn1sfS4KKworQHNtYWxsZXhhbXBsZQorQGV4ZGVudCBAZW1waHtieXRlIHJlZ2lzdGVyc30KK3IwbCByMGggcjFoIHIxbCByMmggcjJsIHIzaCByM2wKK3I0aCByNGwgcjVoIHI1bCByNmggcjZsIHI3aCByN2wKKworQGV4ZGVudCBAZW1waHt3b3JkIHJlZ2lzdGVyc30KK3IwIHIxIHIyIHIzIHI0IHI1IHI2IHI3IHI4IHI5IHIxMCByMTEgcjEyIHIxMyByMTQgcjE1CisKK0BleGRlbnQgQGVtcGh7bG9uZyB3b3JkIHJlZ2lzdGVyc30KK3JyMCBycjIgcnI0IHJyNiBycjggcnIxMCBycjEyIHJyMTQKKworQGV4ZGVudCBAZW1waHtxdWFkIHdvcmQgcmVnaXN0ZXJzfQorcnEwIHJxNCBycTggcnExMgorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgWjgwMDAtQWRkcmVzc2luZworQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcworCitAY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFo4MDAwCitAY2luZGV4IFo4MDAgYWRkcmVzc2luZyBtb2RlcworQHZhbHVle0FTfSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBaODAwMDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSByQHZhcntufQorUmVnaXN0ZXIgZGlyZWN0CisKK0BpdGVtIEBAckB2YXJ7bn0KK0luZGlyZWN0IHJlZ2lzdGVyCisKK0BpdGVtIEB2YXJ7YWRkcn0KK0RpcmVjdDogdGhlIDE2IGJpdCBvciAyNCBiaXQgYWRkcmVzcyAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGFzc2VtYmxlcgoraXMgaW4gc2VnbWVudGVkIG9yIHVuc2VnbWVudGVkIG1vZGUpIG9mIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnN0cnVjdGlvbi4KKworQGl0ZW0gYWRkcmVzcyhyQHZhcntufSkKK0luZGV4ZWQ6IHRoZSAxNiBvciAyNCBiaXQgYWRkcmVzcyBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHJlZ2lzdGVyIHRvIHByb2R1Y2UKK3RoZSBmaW5hbCBhZGRyZXNzIGluIG1lbW9yeSBvZiB0aGUgb3BlcmFuZC4KKworQGl0ZW0gckB2YXJ7bn0oI0B2YXJ7aW1tfSkKK0Jhc2UgQWRkcmVzczogdGhlIDE2IG9yIDI0IGJpdCByZWdpc3RlciBpcyBhZGRlZCB0byB0aGUgMTYgYml0IHNpZ24KK2V4dGVuZGVkIGltbWVkaWF0ZSBkaXNwbGFjZW1lbnQgdG8gcHJvZHVjZSB0aGUgZmluYWwgYWRkcmVzcyBpbiBtZW1vcnkKK29mIHRoZSBvcGVyYW5kLgorCitAaXRlbSByQHZhcntufShyQHZhcnttfSkKK0Jhc2UgSW5kZXg6IHRoZSAxNiBvciAyNCBiaXQgcmVnaXN0ZXIgckB2YXJ7bn0gaXMgYWRkZWQgdG8gdGhlIHNpZ24KK2V4dGVuZGVkIDE2IGJpdCBpbmRleCByZWdpc3RlciByQHZhcnttfSB0byBwcm9kdWNlIHRoZSBmaW5hbCBhZGRyZXNzIGluCittZW1vcnkgb2YgdGhlIG9wZXJhbmQuCisKK0BpdGVtICNAdmFye3h4fQorSW1tZWRpYXRlIGRhdGEgQHZhcnt4eH0uCitAZW5kIHRhYmxlCisKK0Bub2RlIFo4MDAwIERpcmVjdGl2ZXMKK0BzZWN0aW9uIEFzc2VtYmxlciBEaXJlY3RpdmVzIGZvciB0aGUgWjgwMDAKKworQGNpbmRleCBaODAwMCBkaXJlY3RpdmVzCitAY2luZGV4IGRpcmVjdGl2ZXMsIFo4MDAwCitUaGUgWjgwMDAgcG9ydCBvZiBAdmFsdWV7QVN9IGluY2x1ZGVzIHRoZXNlIGFkZGl0aW9uYWwgYXNzZW1ibGVyIGRpcmVjdGl2ZXMsCitmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIFo4MDAwIGFzc2VtYmxlcnMuICBBcyBzaG93biwgdGhlc2UgZG8gbm90CitiZWdpbiB3aXRoIEBzYW1wey59ICh1bmxpa2UgdGhlIG9yZGluYXJ5IEB2YWx1ZXtBU30gZGlyZWN0aXZlcykuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZWdtCitAaXRlbSBzZWdtCitHZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHNlZ21lbnRlZCBaODAwMS4KKworQGtpbmRleCB1bnNlZ20KK0BpdGVtIHVuc2VnbQorR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSB1bnNlZ21lbnRlZCBaODAwMi4KKworQGtpbmRleCBuYW1lCitAaXRlbSBuYW1lCitTeW5vbnltIGZvciBAY29kZXsuZmlsZX0KKworQGtpbmRleCBnbG9iYWwKK0BpdGVtIGdsb2JhbAorU3lub255bSBmb3IgQGNvZGV7Lmdsb2JhbH0KKworQGtpbmRleCB3dmFsCitAaXRlbSB3dmFsCitTeW5vbnltIGZvciBAY29kZXsud29yZH0KKworQGtpbmRleCBsdmFsCitAaXRlbSBsdmFsCitTeW5vbnltIGZvciBAY29kZXsubG9uZ30KKworQGtpbmRleCBidmFsCitAaXRlbSBidmFsCitTeW5vbnltIGZvciBAY29kZXsuYnl0ZX0KKworQGtpbmRleCBzdmFsCitAaXRlbSBzdmFsCitBc3NlbWJsZSBhIHN0cmluZy4gIEBjb2Rle3N2YWx9IGV4cGVjdHMgb25lIHN0cmluZyBsaXRlcmFsLCBkZWxpbWl0ZWQgYnkKK3NpbmdsZSBxdW90ZXMuICBJdCBhc3NlbWJsZXMgZWFjaCBieXRlIG9mIHRoZSBzdHJpbmcgaW50byBjb25zZWN1dGl2ZQorYWRkcmVzc2VzLiAgWW91IGNhbiB1c2UgdGhlIGVzY2FwZSBzZXF1ZW5jZSBAc2FtcHslQHZhcnt4eH19ICh3aGVyZQorQHZhcnt4eH0gcmVwcmVzZW50cyBhIHR3by1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIpIHRvIHJlcHJlc2VudCB0aGUKK2NoYXJhY3RlciB3aG9zZSBAc2N7YXNjaWl9IHZhbHVlIGlzIEB2YXJ7eHh9LiAgVXNlIHRoaXMgZmVhdHVyZSB0bworZGVzY3JpYmUgc2luZ2xlIHF1b3RlIGFuZCBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBhcHBlYXIgaW4gc3RyaW5nCitsaXRlcmFscyBhcyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBDIHN0YXRlbWVudCBAd3tAc2FtcHtjaGFyICphID0KKyJoZSBzYWlkIFwiaXQncyA1MCUgb2ZmXCIiO319IGlzIHJlcHJlc2VudGVkIGluIFo4MDAwIGFzc2VtYmx5IGxhbmd1YWdlCisoc2hvd24gd2l0aCB0aGUgYXNzZW1ibGVyIG91dHB1dCBpbiBoZXggYXQgdGhlIGxlZnQpIGFzCisKK0BpZnRleAorQGJlZ2luZ3JvdXAKK0BsZXRAbm9uYXJyb3dpbmc9QGNvbW1lbnQKK0BlbmQgaWZ0ZXgKK0BzbWFsbGV4YW1wbGUKKzY4NjUyMDczICAgIHN2YWwgICAgJ2hlIHNhaWQgJTIyaXQlMjdzIDUwJTI1IG9mZiUyMiUwMCcKKzYxNjk2NDIwCisyMjY5NzQyNworNzMyMDM1MzAKKzI1MjA2RjY2Cis2NjIyMDAKK0BlbmQgc21hbGxleGFtcGxlCitAaWZ0ZXgKK0BlbmRncm91cAorQGVuZCBpZnRleAorCitAa2luZGV4IHJzZWN0CitAaXRlbSByc2VjdAorc3lub255bSBmb3IgQGNvZGV7LnNlY3Rpb259CisKK0BraW5kZXggYmxvY2sKK0BpdGVtIGJsb2NrCitzeW5vbnltIGZvciBAY29kZXsuc3BhY2V9CisKK0BraW5kZXggZXZlbgorQGl0ZW0gZXZlbgorc3BlY2lhbCBjYXNlIG9mIEBjb2Rley5hbGlnbn07IGFsaWducyBvdXRwdXQgdG8gZXZlbiBieXRlIGJvdW5kYXJ5LgorQGVuZCB0YWJsZQorCitAbm9kZSBaODAwMCBPcGNvZGVzCitAc2VjdGlvbiBPcGNvZGVzCisKK0BjaW5kZXggWjgwMDAgb3Bjb2RlIHN1bW1hcnkKK0BjaW5kZXggb3Bjb2RlIHN1bW1hcnksIFo4MDAwCitAY2luZGV4IG1uZW1vbmljcywgWjgwMDAKK0BjaW5kZXggaW5zdHJ1Y3Rpb24gc3VtbWFyeSwgWjgwMDAKK0ZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgWjgwMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQorQGNpdGV7WjgwMDAgVGVjaG5pY2FsIE1hbnVhbH0uCisKK0BpZnNldCBTTUFMTAorQGMgdGhpcyB0YWJsZSwgZHVlIHRvIHRoZSBtdWx0aS1jb2wgZmFraW5nIGFuZCBoYXJkY29kZWQgb3JkZXIsIGxvb2tzIHNpbGx5CitAYyBleGNlcHQgaW4gc21hbGxib29rLiAgU2VlIGNvbW1lbnRzIGJlbG93ICJAc2V0IFNNQUxMIiBuZWFyIHRvcCBvZiB0aGlzIGZpbGUuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3Bjb2RlcyBhbmQgdGhlaXIgYXJndW1lbnRzOgorQGlmdGV4CitAYmVnaW5ncm91cAorQGxldEBub25hcnJvd2luZz1AY29tbWVudAorQGVuZCBpZnRleAorQHNtYWxsZXhhbXBsZQorCisgICAgICAgICAgICBycyAgIEByezE2IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9CisgICAgICAgICAgICByZCAgIEByezE2IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KKyAgICAgICAgICAgIHJicyAgIEByezggYml0IHNvdXJjZSByZWdpc3Rlcn0KKyAgICAgICAgICAgIHJiZCAgIEByezggYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQorICAgICAgICAgICAgcnJzICAgQHJ7MzIgYml0IHNvdXJjZSByZWdpc3Rlcn0KKyAgICAgICAgICAgIHJyZCAgIEByezMyIGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KKyAgICAgICAgICAgIHJxcyAgIEByezY0IGJpdCBzb3VyY2UgcmVnaXN0ZXJ9CisgICAgICAgICAgICBycWQgICBAcns2NCBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9CisgICAgICAgICAgICBhZGRyIEByezE2LzI0IGJpdCBhZGRyZXNzfQorICAgICAgICAgICAgaW1tICBAcntpbW1lZGlhdGUgZGF0YX0KKworYWRjIHJkLHJzICAgICAgICAgICAgICAgY2xyYiBhZGRyICAgICAgICAgICAgICAgY3BzaXIgQEByZCxAQHJzLHJyLGNjCithZGNiIHJiZCxyYnMgICAgICAgICAgICBjbHJiIGFkZHIocmQpICAgICAgICAgICBjcHNpcmIgQEByZCxAQHJzLHJyLGNjCithZGQgcmQsQEBycyAgICAgICAgICAgICAgY2xyYiByYmQgICAgICAgICAgICAgICAgZGFiIHJiZAorYWRkIHJkLGFkZHIgICAgICAgICAgICAgY29tIEBAcmQgICAgICAgICAgICAgICAgIGRiam56IHJiZCxkaXNwNworYWRkIHJkLGFkZHIocnMpICAgICAgICAgY29tIGFkZHIgICAgICAgICAgICAgICAgZGVjIEBAcmQsaW1tNG0xCithZGQgcmQsaW1tMTYgICAgICAgICAgICBjb20gYWRkcihyZCkgICAgICAgICAgICBkZWMgYWRkcihyZCksaW1tNG0xCithZGQgcmQscnMgICAgICAgICAgICAgICBjb20gcmQgICAgICAgICAgICAgICAgICBkZWMgYWRkcixpbW00bTEKK2FkZGIgcmJkLEBAcnMgICAgICAgICAgICBjb21iIEBAcmQgICAgICAgICAgICAgICAgZGVjIHJkLGltbTRtMQorYWRkYiByYmQsYWRkciAgICAgICAgICAgY29tYiBhZGRyICAgICAgICAgICAgICAgZGVjYiBAQHJkLGltbTRtMQorYWRkYiByYmQsYWRkcihycykgICAgICAgY29tYiBhZGRyKHJkKSAgICAgICAgICAgZGVjYiBhZGRyKHJkKSxpbW00bTEKK2FkZGIgcmJkLGltbTggICAgICAgICAgIGNvbWIgcmJkICAgICAgICAgICAgICAgIGRlY2IgYWRkcixpbW00bTEKK2FkZGIgcmJkLHJicyAgICAgICAgICAgIGNvbWZsZyBmbGFncyAgICAgICAgICAgIGRlY2IgcmJkLGltbTRtMQorYWRkbCBycmQsQEBycyAgICAgICAgICAgIGNwIEBAcmQsaW1tMTYgICAgICAgICAgICBkaSBpMgorYWRkbCBycmQsYWRkciAgICAgICAgICAgY3AgYWRkcihyZCksaW1tMTYgICAgICAgZGl2IHJyZCxAQHJzCithZGRsIHJyZCxhZGRyKHJzKSAgICAgICBjcCBhZGRyLGltbTE2ICAgICAgICAgICBkaXYgcnJkLGFkZHIKK2FkZGwgcnJkLGltbTMyICAgICAgICAgIGNwIHJkLEBAcnMgICAgICAgICAgICAgICBkaXYgcnJkLGFkZHIocnMpCithZGRsIHJyZCxycnMgICAgICAgICAgICBjcCByZCxhZGRyICAgICAgICAgICAgICBkaXYgcnJkLGltbTE2CithbmQgcmQsQEBycyAgICAgICAgICAgICAgY3AgcmQsYWRkcihycykgICAgICAgICAgZGl2IHJyZCxycworYW5kIHJkLGFkZHIgICAgICAgICAgICAgY3AgcmQsaW1tMTYgICAgICAgICAgICAgZGl2bCBycWQsQEBycworYW5kIHJkLGFkZHIocnMpICAgICAgICAgY3AgcmQscnMgICAgICAgICAgICAgICAgZGl2bCBycWQsYWRkcgorYW5kIHJkLGltbTE2ICAgICAgICAgICAgY3BiIEBAcmQsaW1tOCAgICAgICAgICAgIGRpdmwgcnFkLGFkZHIocnMpCithbmQgcmQscnMgICAgICAgICAgICAgICBjcGIgYWRkcihyZCksaW1tOCAgICAgICBkaXZsIHJxZCxpbW0zMgorYW5kYiByYmQsQEBycyAgICAgICAgICAgIGNwYiBhZGRyLGltbTggICAgICAgICAgIGRpdmwgcnFkLHJycworYW5kYiByYmQsYWRkciAgICAgICAgICAgY3BiIHJiZCxAQHJzICAgICAgICAgICAgIGRqbnogcmQsZGlzcDcKK2FuZGIgcmJkLGFkZHIocnMpICAgICAgIGNwYiByYmQsYWRkciAgICAgICAgICAgIGVpIGkyCithbmRiIHJiZCxpbW04ICAgICAgICAgICBjcGIgcmJkLGFkZHIocnMpICAgICAgICBleCByZCxAQHJzCithbmRiIHJiZCxyYnMgICAgICAgICAgICBjcGIgcmJkLGltbTggICAgICAgICAgICBleCByZCxhZGRyCitiaXQgQEByZCxpbW00ICAgICAgICAgICAgY3BiIHJiZCxyYnMgICAgICAgICAgICAgZXggcmQsYWRkcihycykKK2JpdCBhZGRyKHJkKSxpbW00ICAgICAgIGNwZCByZCxAQHJzLHJyLGNjICAgICAgICBleCByZCxycworYml0IGFkZHIsaW1tNCAgICAgICAgICAgY3BkYiByYmQsQEBycyxycixjYyAgICAgIGV4YiByYmQsQEBycworYml0IHJkLGltbTQgICAgICAgICAgICAgY3BkciByZCxAQHJzLHJyLGNjICAgICAgIGV4YiByYmQsYWRkcgorYml0IHJkLHJzICAgICAgICAgICAgICAgY3BkcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4YiByYmQsYWRkcihycykKK2JpdGIgQEByZCxpbW00ICAgICAgICAgICBjcGkgcmQsQEBycyxycixjYyAgICAgICAgZXhiIHJiZCxyYnMKK2JpdGIgYWRkcihyZCksaW1tNCAgICAgIGNwaWIgcmJkLEBAcnMscnIsY2MgICAgICBleHQwZSBpbW04CitiaXRiIGFkZHIsaW1tNCAgICAgICAgICBjcGlyIHJkLEBAcnMscnIsY2MgICAgICAgZXh0MGYgaW1tOAorYml0YiByYmQsaW1tNCAgICAgICAgICAgY3BpcmIgcmJkLEBAcnMscnIsY2MgICAgIGV4dDhlIGltbTgKK2JpdGIgcmJkLHJzICAgICAgICAgICAgIGNwbCBycmQsQEBycyAgICAgICAgICAgICBleHQ4ZiBpbW04CiticHQgICAgICAgICAgICAgICAgICAgICBjcGwgcnJkLGFkZHIgICAgICAgICAgICBleHRzIHJyZAorY2FsbCBAQHJkICAgICAgICAgICAgICAgIGNwbCBycmQsYWRkcihycykgICAgICAgIGV4dHNiIHJkCitjYWxsIGFkZHIgICAgICAgICAgICAgICBjcGwgcnJkLGltbTMyICAgICAgICAgICBleHRzbCBycWQKK2NhbGwgYWRkcihyZCkgICAgICAgICAgIGNwbCBycmQscnJzICAgICAgICAgICAgIGhhbHQKK2NhbHIgZGlzcDEyICAgICAgICAgICAgIGNwc2QgQEByZCxAQHJzLHJyLGNjICAgICAgaW4gcmQsQEBycworY2xyIEBAcmQgICAgICAgICAgICAgICAgIGNwc2RiIEBAcmQsQEBycyxycixjYyAgICAgaW4gcmQsaW1tMTYKK2NsciBhZGRyICAgICAgICAgICAgICAgIGNwc2RyIEBAcmQsQEBycyxycixjYyAgICAgaW5iIHJiZCxAQHJzCitjbHIgYWRkcihyZCkgICAgICAgICAgICBjcHNkcmIgQEByZCxAQHJzLHJyLGNjICAgIGluYiByYmQsaW1tMTYKK2NsciByZCAgICAgICAgICAgICAgICAgIGNwc2kgQEByZCxAQHJzLHJyLGNjICAgICAgaW5jIEBAcmQsaW1tNG0xCitjbHJiIEBAcmQgICAgICAgICAgICAgICAgY3BzaWIgQEByZCxAQHJzLHJyLGNjICAgICBpbmMgYWRkcihyZCksaW1tNG0xCitpbmMgYWRkcixpbW00bTEgICAgICAgICBsZGIgcmJkLHJzKHJ4KSAgICAgICAgICBtdWx0IHJyZCxhZGRyKHJzKQoraW5jIHJkLGltbTRtMSAgICAgICAgICAgbGRiIHJkKGltbTE2KSxyYnMgICAgICAgbXVsdCBycmQsaW1tMTYKK2luY2IgQEByZCxpbW00bTEgICAgICAgICBsZGIgcmQocngpLHJicyAgICAgICAgICBtdWx0IHJyZCxycworaW5jYiBhZGRyKHJkKSxpbW00bTEgICAgbGRjdGwgY3RybCxycyAgICAgICAgICAgbXVsdGwgcnFkLEBAcnMKK2luY2IgYWRkcixpbW00bTEgICAgICAgIGxkY3RsIHJkLGN0cmwgICAgICAgICAgIG11bHRsIHJxZCxhZGRyCitpbmNiIHJiZCxpbW00bTEgICAgICAgICBsZGQgQEBycyxAQHJkLHJyICAgICAgICAgIG11bHRsIHJxZCxhZGRyKHJzKQoraW5kIEBAcmQsQEBycyxyYSAgICAgICAgICBsZGRiIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxpbW0zMgoraW5kYiBAQHJkLEBAcnMscmJhICAgICAgICBsZGRyIEBAcnMsQEByZCxyciAgICAgICAgIG11bHRsIHJxZCxycnMKK2luaWIgQEByZCxAQHJzLHJhICAgICAgICAgbGRkcmIgQEBycyxAQHJkLHJyICAgICAgICBuZWcgQEByZAoraW5pYnIgQEByZCxAQHJzLHJhICAgICAgICBsZGkgQEByZCxAQHJzLHJyICAgICAgICAgIG5lZyBhZGRyCitpcmV0ICAgICAgICAgICAgICAgICAgICBsZGliIEBAcmQsQEBycyxyciAgICAgICAgIG5lZyBhZGRyKHJkKQoranAgY2MsQEByZCAgICAgICAgICAgICAgIGxkaXIgQEByZCxAQHJzLHJyICAgICAgICAgbmVnIHJkCitqcCBjYyxhZGRyICAgICAgICAgICAgICBsZGlyYiBAQHJkLEBAcnMscnIgICAgICAgIG5lZ2IgQEByZAoranAgY2MsYWRkcihyZCkgICAgICAgICAgbGRrIHJkLGltbTQgICAgICAgICAgICAgbmVnYiBhZGRyCitqciBjYyxkaXNwOCAgICAgICAgICAgICBsZGwgQEByZCxycnMgICAgICAgICAgICAgbmVnYiBhZGRyKHJkKQorbGQgQEByZCxpbW0xNiAgICAgICAgICAgIGxkbCBhZGRyKHJkKSxycnMgICAgICAgIG5lZ2IgcmJkCitsZCBAQHJkLHJzICAgICAgICAgICAgICAgbGRsIGFkZHIscnJzICAgICAgICAgICAgbm9wCitsZCBhZGRyKHJkKSxpbW0xNiAgICAgICBsZGwgcmQoaW1tMTYpLHJycyAgICAgICBvciByZCxAQHJzCitsZCBhZGRyKHJkKSxycyAgICAgICAgICBsZGwgcmQocngpLHJycyAgICAgICAgICBvciByZCxhZGRyCitsZCBhZGRyLGltbTE2ICAgICAgICAgICBsZGwgcnJkLEBAcnMgICAgICAgICAgICAgb3IgcmQsYWRkcihycykKK2xkIGFkZHIscnMgICAgICAgICAgICAgIGxkbCBycmQsYWRkciAgICAgICAgICAgIG9yIHJkLGltbTE2CitsZCByZChpbW0xNikscnMgICAgICAgICBsZGwgcnJkLGFkZHIocnMpICAgICAgICBvciByZCxycworbGQgcmQocngpLHJzICAgICAgICAgICAgbGRsIHJyZCxpbW0zMiAgICAgICAgICAgb3JiIHJiZCxAQHJzCitsZCByZCxAQHJzICAgICAgICAgICAgICAgbGRsIHJyZCxycnMgICAgICAgICAgICAgb3JiIHJiZCxhZGRyCitsZCByZCxhZGRyICAgICAgICAgICAgICBsZGwgcnJkLHJzKGltbTE2KSAgICAgICBvcmIgcmJkLGFkZHIocnMpCitsZCByZCxhZGRyKHJzKSAgICAgICAgICBsZGwgcnJkLHJzKHJ4KSAgICAgICAgICBvcmIgcmJkLGltbTgKK2xkIHJkLGltbTE2ICAgICAgICAgICAgIGxkbSBAQHJkLHJzLG4gICAgICAgICAgICBvcmIgcmJkLHJicworbGQgcmQscnMgICAgICAgICAgICAgICAgbGRtIGFkZHIocmQpLHJzLG4gICAgICAgb3V0IEBAcmQscnMKK2xkIHJkLHJzKGltbTE2KSAgICAgICAgIGxkbSBhZGRyLHJzLG4gICAgICAgICAgIG91dCBpbW0xNixycworbGQgcmQscnMocngpICAgICAgICAgICAgbGRtIHJkLEBAcnMsbiAgICAgICAgICAgIG91dGIgQEByZCxyYnMKK2xkYSByZCxhZGRyICAgICAgICAgICAgIGxkbSByZCxhZGRyKHJzKSxuICAgICAgIG91dGIgaW1tMTYscmJzCitsZGEgcmQsYWRkcihycykgICAgICAgICBsZG0gcmQsYWRkcixuICAgICAgICAgICBvdXRkIEBAcmQsQEBycyxyYQorbGRhIHJkLHJzKGltbTE2KSAgICAgICAgbGRwcyBAQHJzICAgICAgICAgICAgICAgIG91dGRiIEBAcmQsQEBycyxyYmEKK2xkYSByZCxycyhyeCkgICAgICAgICAgIGxkcHMgYWRkciAgICAgICAgICAgICAgIG91dGliIEBAcmQsQEBycyxyYQorbGRhciByZCxkaXNwMTYgICAgICAgICAgbGRwcyBhZGRyKHJzKSAgICAgICAgICAgb3V0aWJyIEBAcmQsQEBycyxyYQorbGRiIEBAcmQsaW1tOCAgICAgICAgICAgIGxkciBkaXNwMTYscnMgICAgICAgICAgIHBvcCBAQHJkLEBAcnMKK2xkYiBAQHJkLHJicyAgICAgICAgICAgICBsZHIgcmQsZGlzcDE2ICAgICAgICAgICBwb3AgYWRkcihyZCksQEBycworbGRiIGFkZHIocmQpLGltbTggICAgICAgbGRyYiBkaXNwMTYscmJzICAgICAgICAgcG9wIGFkZHIsQEBycworbGRiIGFkZHIocmQpLHJicyAgICAgICAgbGRyYiByYmQsZGlzcDE2ICAgICAgICAgcG9wIHJkLEBAcnMKK2xkYiBhZGRyLGltbTggICAgICAgICAgIGxkcmwgZGlzcDE2LHJycyAgICAgICAgIHBvcGwgQEByZCxAQHJzCitsZGIgYWRkcixyYnMgICAgICAgICAgICBsZHJsIHJyZCxkaXNwMTYgICAgICAgICBwb3BsIGFkZHIocmQpLEBAcnMKK2xkYiByYmQsQEBycyAgICAgICAgICAgICBtYml0ICAgICAgICAgICAgICAgICAgICBwb3BsIGFkZHIsQEBycworbGRiIHJiZCxhZGRyICAgICAgICAgICAgbXJlcSByZCAgICAgICAgICAgICAgICAgcG9wbCBycmQsQEBycworbGRiIHJiZCxhZGRyKHJzKSAgICAgICAgbXJlcyAgICAgICAgICAgICAgICAgICAgcHVzaCBAQHJkLEBAcnMKK2xkYiByYmQsaW1tOCAgICAgICAgICAgIG1zZXQgICAgICAgICAgICAgICAgICAgIHB1c2ggQEByZCxhZGRyCitsZGIgcmJkLHJicyAgICAgICAgICAgICBtdWx0IHJyZCxAQHJzICAgICAgICAgICAgcHVzaCBAQHJkLGFkZHIocnMpCitsZGIgcmJkLHJzKGltbTE2KSAgICAgICBtdWx0IHJyZCxhZGRyICAgICAgICAgICBwdXNoIEBAcmQsaW1tMTYKK3B1c2ggQEByZCxycyAgICAgICAgICAgICBzZXQgYWRkcixpbW00ICAgICAgICAgICBzdWJsIHJyZCxpbW0zMgorcHVzaGwgQEByZCxAQHJzICAgICAgICAgICBzZXQgcmQsaW1tNCAgICAgICAgICAgICBzdWJsIHJyZCxycnMKK3B1c2hsIEBAcmQsYWRkciAgICAgICAgICBzZXQgcmQscnMgICAgICAgICAgICAgICB0Y2MgY2MscmQKK3B1c2hsIEBAcmQsYWRkcihycykgICAgICBzZXRiIEBAcmQsaW1tNCAgICAgICAgICAgdGNjYiBjYyxyYmQKK3B1c2hsIEBAcmQscnJzICAgICAgICAgICBzZXRiIGFkZHIocmQpLGltbTQgICAgICB0ZXN0IEBAcmQKK3JlcyBAQHJkLGltbTQgICAgICAgICAgICBzZXRiIGFkZHIsaW1tNCAgICAgICAgICB0ZXN0IGFkZHIKK3JlcyBhZGRyKHJkKSxpbW00ICAgICAgIHNldGIgcmJkLGltbTQgICAgICAgICAgIHRlc3QgYWRkcihyZCkKK3JlcyBhZGRyLGltbTQgICAgICAgICAgIHNldGIgcmJkLHJzICAgICAgICAgICAgIHRlc3QgcmQKK3JlcyByZCxpbW00ICAgICAgICAgICAgIHNldGZsZyBpbW00ICAgICAgICAgICAgIHRlc3RiIEBAcmQKK3JlcyByZCxycyAgICAgICAgICAgICAgIHNpbmIgcmJkLGltbTE2ICAgICAgICAgIHRlc3RiIGFkZHIKK3Jlc2IgQEByZCxpbW00ICAgICAgICAgICBzaW5iIHJkLGltbTE2ICAgICAgICAgICB0ZXN0YiBhZGRyKHJkKQorcmVzYiBhZGRyKHJkKSxpbW00ICAgICAgc2luZCBAQHJkLEBAcnMscmEgICAgICAgICB0ZXN0YiByYmQKK3Jlc2IgYWRkcixpbW00ICAgICAgICAgIHNpbmRiIEBAcmQsQEBycyxyYmEgICAgICAgdGVzdGwgQEByZAorcmVzYiByYmQsaW1tNCAgICAgICAgICAgc2luaWIgQEByZCxAQHJzLHJhICAgICAgICB0ZXN0bCBhZGRyCityZXNiIHJiZCxycyAgICAgICAgICAgICBzaW5pYnIgQEByZCxAQHJzLHJhICAgICAgIHRlc3RsIGFkZHIocmQpCityZXNmbGcgaW1tNCAgICAgICAgICAgICBzbGEgcmQsaW1tOCAgICAgICAgICAgICB0ZXN0bCBycmQKK3JldCBjYyAgICAgICAgICAgICAgICAgIHNsYWIgcmJkLGltbTggICAgICAgICAgIHRyZGIgQEByZCxAQHJzLHJiYQorcmwgcmQsaW1tMW9yMiAgICAgICAgICAgc2xhbCBycmQsaW1tOCAgICAgICAgICAgdHJkcmIgQEByZCxAQHJzLHJiYQorcmxiIHJiZCxpbW0xb3IyICAgICAgICAgc2xsIHJkLGltbTggICAgICAgICAgICAgdHJpYiBAQHJkLEBAcnMscmJyCitybGMgcmQsaW1tMW9yMiAgICAgICAgICBzbGxiIHJiZCxpbW04ICAgICAgICAgICB0cmlyYiBAQHJkLEBAcnMscmJyCitybGNiIHJiZCxpbW0xb3IyICAgICAgICBzbGxsIHJyZCxpbW04ICAgICAgICAgICB0cnRkcmIgQEByYSxAQHJiLHJicgorcmxkYiByYmIscmJhICAgICAgICAgICAgc291dCBpbW0xNixycyAgICAgICAgICAgdHJ0aWIgQEByYSxAQHJiLHJyCityciByZCxpbW0xb3IyICAgICAgICAgICBzb3V0YiBpbW0xNixyYnMgICAgICAgICB0cnRpcmIgQEByYSxAQHJiLHJicgorcnJiIHJiZCxpbW0xb3IyICAgICAgICAgc291dGQgQEByZCxAQHJzLHJhICAgICAgICB0cnRyYiBAQHJhLEBAcmIscmJyCitycmMgcmQsaW1tMW9yMiAgICAgICAgICBzb3V0ZGIgQEByZCxAQHJzLHJiYSAgICAgIHRzZXQgQEByZAorcnJjYiByYmQsaW1tMW9yMiAgICAgICAgc291dGliIEBAcmQsQEBycyxyYSAgICAgICB0c2V0IGFkZHIKK3JyZGIgcmJiLHJiYSAgICAgICAgICAgIHNvdXRpYnIgQEByZCxAQHJzLHJhICAgICAgdHNldCBhZGRyKHJkKQorcnN2ZDM2ICAgICAgICAgICAgICAgICAgc3JhIHJkLGltbTggICAgICAgICAgICAgdHNldCByZAorcnN2ZDM4ICAgICAgICAgICAgICAgICAgc3JhYiByYmQsaW1tOCAgICAgICAgICAgdHNldGIgQEByZAorcnN2ZDc4ICAgICAgICAgICAgICAgICAgc3JhbCBycmQsaW1tOCAgICAgICAgICAgdHNldGIgYWRkcgorcnN2ZDdlICAgICAgICAgICAgICAgICAgc3JsIHJkLGltbTggICAgICAgICAgICAgdHNldGIgYWRkcihyZCkKK3JzdmQ5ZCAgICAgICAgICAgICAgICAgIHNybGIgcmJkLGltbTggICAgICAgICAgIHRzZXRiIHJiZAorcnN2ZDlmICAgICAgICAgICAgICAgICAgc3JsbCBycmQsaW1tOCAgICAgICAgICAgeG9yIHJkLEBAcnMKK3JzdmRiOSAgICAgICAgICAgICAgICAgIHN1YiByZCxAQHJzICAgICAgICAgICAgICB4b3IgcmQsYWRkcgorcnN2ZGJmICAgICAgICAgICAgICAgICAgc3ViIHJkLGFkZHIgICAgICAgICAgICAgeG9yIHJkLGFkZHIocnMpCitzYmMgcmQscnMgICAgICAgICAgICAgICBzdWIgcmQsYWRkcihycykgICAgICAgICB4b3IgcmQsaW1tMTYKK3NiY2IgcmJkLHJicyAgICAgICAgICAgIHN1YiByZCxpbW0xNiAgICAgICAgICAgIHhvciByZCxycworc2MgaW1tOCAgICAgICAgICAgICAgICAgc3ViIHJkLHJzICAgICAgICAgICAgICAgeG9yYiByYmQsQEBycworc2RhIHJkLHJzICAgICAgICAgICAgICAgc3ViYiByYmQsQEBycyAgICAgICAgICAgIHhvcmIgcmJkLGFkZHIKK3NkYWIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLGFkZHIgICAgICAgICAgIHhvcmIgcmJkLGFkZHIocnMpCitzZGFsIHJyZCxycyAgICAgICAgICAgICBzdWJiIHJiZCxhZGRyKHJzKSAgICAgICB4b3JiIHJiZCxpbW04CitzZGwgcmQscnMgICAgICAgICAgICAgICBzdWJiIHJiZCxpbW04ICAgICAgICAgICB4b3JiIHJiZCxyYnMKK3NkbGIgcmJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLHJicyAgICAgICAgICAgIHhvcmIgcmJkLHJicworc2RsbCBycmQscnMgICAgICAgICAgICAgc3VibCBycmQsQEBycworc2V0IEBAcmQsaW1tNCAgICAgICAgICAgIHN1YmwgcnJkLGFkZHIKK3NldCBhZGRyKHJkKSxpbW00ICAgICAgIHN1YmwgcnJkLGFkZHIocnMpCitAZW5kIHNtYWxsZXhhbXBsZQorQGlmdGV4CitAZW5kZ3JvdXAKK0BlbmQgaWZ0ZXgKK0BlbmQgaWZzZXQKKwpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9nYXNwLnRleGkgYi9nYXMvZG9jL2dhc3AudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNkNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9nYXNwLnRleGkKQEAgLTAsMCArMSwxMDg2IEBACitcaW5wdXQgdGV4aW5mbyAgICAgICAgICAgICAgIEBjICAgICAgICAgICAgIC0qLSBUZXhpbmZvIC0qLQorQHNldGZpbGVuYW1lIGdhc3AuaW5mbworQGMKK0BjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGFzc2VtYmx5IHByZXByb2Nlc3NvciAiR0FTUCIKK0BjCitAYyBDb3B5cmlnaHQgKGMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitAYworQGMgVGhpcyB0ZXh0IG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK0BjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIGdhc3A6IChnYXNwKS4gICAgICAgICAgICAgICAgICAgICBUaGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IKK0VORC1JTkZPLURJUi1FTlRSWQorQGVuZCBmb3JtYXQKK0BlbmQgaWZpbmZvCisKK0BzeW5jb2RlaW5kZXgga3kgY3AKK0BzeW5jb2RlaW5kZXggZm4gY3AKKworQGZpbmFsb3V0CitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCitAc2V0dGl0bGUgR0FTUAorQHRpdGxlcGFnZQorQGMgRklYTUUgYm9yaW5nIHRpdGxlCitAdGl0bGUgR0FTUCwgYW4gYXNzZW1ibHkgcHJlcHJvY2Vzc29yCitAc3VidGl0bGUgZm9yIEdBU1AgdmVyc2lvbiAxCitAc3AgMQorQHN1YnRpdGxlIE1hcmNoIDE5OTQKK0BhdXRob3IgUm9sYW5kIFBlc2NoCitAcGFnZQorCitAdGV4Cit7XHBhcnNraXA9MHB0IFxoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIKK30KK0BlbmQgdGV4CisKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAordGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorCitAaWZpbmZvCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgYSBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorQGVuZCBpZ25vcmUKKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKK3RoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQorcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgorCitAbm9kZSBUb3AKK0B0b3AgR0FTUAorCitHQVNQIGlzIGEgcHJlcHJvY2Vzc29yIGZvciBhc3NlbWJseSBwcm9ncmFtcy4KKworVGhpcyBmaWxlIGRlc2NyaWJlcyB2ZXJzaW9uIDEgb2YgR0FTUC4KKworU3RldmUgQ2hhbWJlcmxhaW4gd3JvdGUgR0FTUDsgUm9sYW5kIFBlc2NoIHdyb3RlIHRoaXMgbWFudWFsLgorCitAbWVudQorKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBXaGF0IGlzIEdBU1A/CisqIEludm9raW5nIEdBU1A6OiAgICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zLgorKiBDb21tYW5kczo6ICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgY29tbWFuZHMuCisqIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4LgorQGVuZCBtZW51CitAZW5kIGlmaW5mbworCitAbm9kZSBPdmVydmlldworQGNoYXB0ZXIgV2hhdCBpcyBHQVNQPworCitUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgaXMgdG8gYXNzZW1ibGUgdGhlIG91dHB1dCBvZgorb3RoZXIgcHJvZ3JhbXMtLS1ub3RhYmx5IGNvbXBpbGVycy4gIFdoZW4geW91IGhhdmUgdG8gaGFuZC1jb2RlCitzcGVjaWFsaXplZCByb3V0aW5lcyBpbiBhc3NlbWJseSwgdGhhdCBtZWFucyB0aGUgQHNje2dudX0gYXNzZW1ibGVyIGlzCithbiB1bmZyaWVuZGx5IHByb2Nlc3NvcjogaXQgaGFzIG5vIGRpcmVjdGl2ZXMgZm9yIG1hY3JvcywgY29uZGl0aW9uYWxzLAorb3IgbWFueSBvdGhlciBjb252ZW5pZW5jZXMgdGhhdCB5b3UgbWlnaHQgZXhwZWN0LgorCitJbiBzb21lIGNhc2VzIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IsIG9yIGEgZ2VuZXJhbGl6ZWQKK3ByZXByb2Nlc3NvciBsaWtlIEBzY3ttNH07IGJ1dCB0aGlzIGNhbiBiZSBhd2t3YXJkLCBzaW5jZSBub25lIG9mIHRoZXNlCit0aGluZ3MgYXJlIGRlc2lnbmVkIHdpdGggYXNzZW1ibHkgaW4gbWluZC4KKworQHNje2dhc3B9IGZpbGxzIHRoaXMgbmVlZC4gIEl0IGlzIGV4cHJlc3NseSBkZXNpZ25lZCB0byBwcm92aWRlIHRoZQorZmFjaWxpdGllcyB5b3UgbmVlZCB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibHkgY29kZS4gIEltcGxlbWVudGluZyBpdCBhcyBhCitwcmVwcm9jZXNzb3IsIHJhdGhlciB0aGFuIHBhcnQgb2YgdGhlIGFzc2VtYmxlciwgYWxsb3dzIHRoZSBtYXhpbXVtCitmbGV4aWJpbGl0eTogeW91IGNhbiB1c2UgaXQgd2l0aCBoYW5kLWNvZGVkIGFzc2VtYmx5LCB3aXRob3V0IHBheWluZyBhCitwZW5hbHR5IG9mIGFkZGVkIGNvbXBsZXhpdHkgaW4gdGhlIGFzc2VtYmxlciB5b3UgdXNlIGZvciBjb21waWxlcgorb3V0cHV0LgorCitIZXJlIGlzIGEgc21hbGwgZXhhbXBsZSB0byBnaXZlIHRoZSBmbGF2b3Igb2YgQHNje2dhc3B9LiAgVGhpcyBpbnB1dCB0bworQHNje2dhc3B9CisKK0BjYXJ0b3VjaGUKK0BleGFtcGxlCisgICAgICAgIC5NQUNSTyAgc2F2ZXJlZ3MgZnJvbT04IHRvPTE0Citjb3VudCAgIC5BU1NJR05BIFxmcm9tCisgICAgICAgICEgc2F2ZSByXGZyb20uLnJcdG8KKyAgICAgICAgLkFXSElMRSAgXCZjb3VudCBMRSBcdG8KKyAgICAgICAgbW92ICAgICByXCZjb3VudCxAQC1zcAorY291bnQgICAuQVNTSUdOQSAgXCZjb3VudCArIDEKKyAgICAgICAgLkFFTkRXCisgICAgICAgIC5FTkRNCisKKyAgICAgICAgc2F2ZXJlZ3MgZnJvbT0xMgorCitiYXI6ICAgIG1vdiAgICAgI0gnZGVhZCsxMCxyMAorZm9vICAgICAuU0RBVEFDICJoZWxsbyI8MTA+CisgICAgICAgIC5FTkQKK0BlbmQgZXhhbXBsZQorQGVuZCBjYXJ0b3VjaGUKKworQG5vaW5kZW50CitnZW5lcmF0ZXMgdGhpcyBhc3NlbWJseSBwcm9ncmFtOgorCitAY2FydG91Y2hlCitAZXhhbXBsZQorICAgICAgICAhIHNhdmUgcjEyLi5yMTQKKyAgICAgICAgbW92ICAgICByMTIsQEAtc3AKKyAgICAgICAgbW92ICAgICByMTMsQEAtc3AKKyAgICAgICAgbW92ICAgICByMTQsQEAtc3AKKworYmFyOiAgICBtb3YgICAgICM1NzAwNSsxMCxyMAorZm9vOiAgICAuYnl0ZSAgIDYsMTA0LDEwMSwxMDgsMTA4LDExMSwxMAorQGVuZCBleGFtcGxlCitAZW5kIGNhcnRvdWNoZQorCitAbm9kZSBJbnZva2luZyBHQVNQCitAY2hhcHRlciBDb21tYW5kIExpbmUgT3B0aW9ucworCitAYyBGSVhNRSEgIE9yIGlzIHRoZXJlIGEgc2ltcGxlciB3YXksIGNhbGxpbmcgZnJvbSBHQVMgb3B0aW9uPworVGhlIHNpbXBsZXN0IHdheSB0byB1c2UgQHNje2dhc3B9IGlzIHRvIHJ1biBpdCBhcyBhIGZpbHRlciBhbmQgYXNzZW1ibGUKK2l0cyBvdXRwdXQuICBJbiBVbml4IGFuZCBpdHMgaWxrLCB5b3UgY2FuIGRvIHRoaXMsIGZvciBleGFtcGxlOgorCitAYyBGSVhNRSEgR0FTUCBmaWxlbmFtZSBzdWZmaXggY29udmVudGlvbj8KK0BleGFtcGxlCiskIGdhc3AgcHJvZy5hc20gfCBhcyAtbyBwcm9nLm8KK0BlbmQgZXhhbXBsZQorCitOYXR1cmFsbHksIHRoZXJlIGFyZSBhbHNvIGEgZmV3IGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGFsbG93IHlvdSB0bworcmVxdWVzdCB2YXJpYXRpb25zIG9uIHRoaXMgYmFzaWMgdGhlbWUuICBIZXJlIGlzIHRoZSBmdWxsIHNldCBvZgorcG9zc2liaWxpdGllcyBmb3IgdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUuCisKK0BleGFtcGxlCitnYXNwICBbIC1hIHwgLS1hbHRlcm5hdGUgXQorICAgICAgWyAtYyBAdmFye2NoYXJ9IHwgLS1jb21tZW50Y2hhciBAdmFye2NoYXJ9IF0KKyAgICAgIFsgLWQgfCAtLWRlYnVnIF0gIFsgLWggfCAtLWhlbHAgXSBbIC1NIHwgLS1tcmkgXQorICAgICAgWyAtbyBAdmFye291dGZpbGV9IHwgLS1vdXRwdXQgQHZhcntvdXRmaWxlfSBdCisgICAgICBbIC1wIHwgLS1wcmludCBdICBbIC1zIHwgLS1jb3B5c291cmNlIF0KKyAgICAgIFsgLXUgfCAtLXVucmVhc29uYWJsZSBdICBbIC12IHwgLS12ZXJzaW9uIF0KKyAgICAgIEB2YXJ7aW5maWxlfSBAZG90c3t9CitAZW5kIGV4YW1wbGUKKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gQHZhcntpbmZpbGV9IEBkb3Rze30KK0BjIEZJWE1FISBXaHkgbm90IHN0ZGluIGFzIGRlZmF1bHQgaW5maWxlPworVGhlIGlucHV0IGZpbGUgbmFtZXMuICBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlOyBpZiB5b3UKK3NwZWNpZnkgbW9yZSwgQHNje2dhc3B9IHByZXByb2Nlc3NlcyB0aGVtIGFsbCwgY29uY2F0ZW5hdGluZyB0aGUgb3V0cHV0CitpbiB0aGUgb3JkZXIgeW91IGxpc3QgdGhlIEB2YXJ7aW5maWxlfSBhcmd1bWVudHMuCisKK01hcmsgdGhlIGVuZCBvZiBlYWNoIGlucHV0IGZpbGUgd2l0aCB0aGUgcHJlcHJvY2Vzc29yIGNvbW1hbmQKK0Bjb2Rley5FTkR9LiAgQHhyZWZ7T3RoZXIgQ29tbWFuZHMsLCBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzfS4KKworQGl0ZW0gLWEKK0BpdGVteCAtLWFsdGVybmF0ZQorVXNlIGFsdGVybmF0aXZlIG1hY3JvIHN5bnRheC4gIEB4cmVme0FsdGVybmF0ZSwsIEFsdGVybmF0ZSBtYWNybworc3ludGF4fSwgZm9yIGEgZGlzY3Vzc2lvbiBvZiBob3cgdGhpcyBzeW50YXggZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0CitAc2N7Z2FzcH0gc3ludGF4LgorCitAY2luZGV4IGNvbW1lbnQgY2hhcmFjdGVyLCBjaGFuZ2luZworQGNpbmRleCBzZW1pY29sb24sIGFzIGNvbW1lbnQKK0BjaW5kZXggZXhjbGFtYXRpb24gbWFyaywgYXMgY29tbWVudAorQGNpbmRleCBzaHJpZWssIGFzIGNvbW1lbnQKK0BjaW5kZXggYmFuZywgYXMgY29tbWVudAorQGNpbmRleCBAY29kZXshfSBkZWZhdWx0IGNvbW1lbnQgY2hhcgorQGNpbmRleCBAY29kZXs7fSBhcyBjb21tZW50IGNoYXIKK0BpdGVtIC1jICdAdmFye2NoYXJ9JworQGl0ZW14IC0tY29tbWVudGNoYXIgJ0B2YXJ7Y2hhcn0nCitVc2UgQHZhcntjaGFyfSBhcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIuICBUaGUgZGVmYXVsdCBjb21tZW50IGNoYXJhY3RlcgoraXMgQHNhbXB7IX0uICBGb3IgZXhhbXBsZSwgdG8gdXNlIGEgc2VtaWNvbG9uIGFzIHRoZSBjb21tZW50IGNoYXJhY3RlciwKK3NwZWNpZnkgQHd7QHNhbXB7LWMgJzsnfX0gb24gdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUuICBTaW5jZQorYXNzZW1ibGVyIGNvbW1hbmQgY2hhcmFjdGVycyBvZnRlbiBoYXZlIHNwZWNpYWwgc2lnbmlmaWNhbmNlIHRvIGNvbW1hbmQKK3NoZWxscywgaXQgaXMgYSBnb29kIGlkZWEgdG8gcXVvdGUgb3IgZXNjYXBlIEB2YXJ7Y2hhcn0gd2hlbiB5b3Ugc3BlY2lmeQorYSBjb21tZW50IGNoYXJhY3Rlci4KKworRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIGFsbCBleGFtcGxlcyBpbiB0aGlzIG1hbnVhbCB1c2UgdGhlIGRlZmF1bHQKK2NvbW1lbnQgY2hhcmFjdGVyIEBzYW1weyF9LgorCitAaXRlbSAtZAorQGl0ZW14IC0tZGVidWcKK1Nob3cgZGVidWdnaW5nIHN0YXRpc3RpY3MuICBJbiB0aGlzIHZlcnNpb24gb2YgQHNje2dhc3B9LCB0aGlzIG9wdGlvbgorcHJvZHVjZXMgc3RhdGlzdGljcyBhYm91dCB0aGUgc3RyaW5nIGJ1ZmZlcnMgdGhhdCBAc2N7Z2FzcH0gYWxsb2NhdGVzCitpbnRlcm5hbGx5LiAgRm9yIGVhY2ggZGVmaW5lZCBidWZmZXJzaXplIEB2YXJ7c30sIEBzY3tnYXNwfSBzaG93cyB0aGUKK251bWJlciBvZiBzdHJpbmdzIEB2YXJ7bn0gdGhhdCBpdCBhbGxvY2F0ZWQsIHdpdGggYSBsaW5lIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK3N0cmluZ3Mgc2l6ZSBAdmFye3N9IDogQHZhcntufQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorQHNje2dhc3B9IGRpc3BsYXlzIHRoZXNlIHN0YXRpc3RpY3Mgb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSwgd2hlbgorZG9uZSBwcmVwcm9jZXNzaW5nLgorCitAaXRlbSAtaAorQGl0ZW14IC0taGVscAorRGlzcGxheSBhIHN1bW1hcnkgb2YgdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKworQGl0ZW0gLU0KK0BpdGVteCAtLW1yaQorVXNlIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuICBVc2luZyB0aGlzIG9wdGlvbiBjYXVzZXMgQHNje2dhc3B9IHRvCithY2NlcHQgdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IHRoZSBNaWNyb3RlYyBSZXNlYXJjaAorQGNvZGV7QVNNNjhLfSBhc3NlbWJsZXIuCisKK0BpdGVtIC1vIEB2YXJ7b3V0ZmlsZX0KK0BpdGVteCAtLW91dHB1dCBAdmFye291dGZpbGV9CitXcml0ZSB0aGUgb3V0cHV0IGluIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRmaWxlfS4gIElmIHlvdSBkbyBub3QgdXNlIHRoZQorQHNhbXB7LW99IG9wdGlvbiwgQHNje2dhc3B9IHdyaXRlcyBpdHMgb3V0cHV0IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQKK3N0cmVhbS4KKworQGl0ZW0gLXAKK0BpdGVteCAtLXByaW50CitQcmludCBsaW5lIG51bWJlcnMuICBAc2N7Z2FzcH0gb2JleXMgdGhpcyBvcHRpb24gQGVtcGh7b25seX0gaWYgeW91IGFsc28KK3NwZWNpZnkgQHNhbXB7LXN9IHRvIGNvcHkgc291cmNlIGxpbmVzIHRvIGl0cyBvdXRwdXQuICBXaXRoIEBzYW1wey1zCistcH0sIEBzY3tnYXNwfSBkaXNwbGF5cyB0aGUgbGluZSBudW1iZXIgb2YgZWFjaCBzb3VyY2UgbGluZSBjb3BpZWQKKyhpbW1lZGlhdGVseSBhZnRlciB0aGUgY29tbWVudCBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSkuCisKK0BpdGVtIC1zCitAaXRlbXggLS1jb3B5c291cmNlCitDb3B5IHRoZSBzb3VyY2UgbGluZXMgdG8gdGhlIG91dHB1dCBmaWxlLiAgVXNlIHRoaXMgb3B0aW9uCit0byBzZWUgdGhlIGVmZmVjdCBvZiBlYWNoIHByZXByb2Nlc3NvciBsaW5lIG9uIHRoZSBAc2N7Z2FzcH0gb3V0cHV0LgorQHNje2dhc3B9IHBsYWNlcyBhIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHshfSBieSBkZWZhdWx0KSBhdAordGhlIGJlZ2lubmluZyBvZiBlYWNoIHNvdXJjZSBsaW5lIGl0IGNvcGllcywgc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzCitvcHRpb24gYW5kIHN0aWxsIGFzc2VtYmxlIHRoZSByZXN1bHQuCisKK0BpdGVtIC11CitAaXRlbXggLS11bnJlYXNvbmFibGUKK0J5cGFzcyBgYHVucmVhc29uYWJsZSBleHBhbnNpb24nJyBsaW1pdC4gIFNpbmNlIHlvdSBjYW4gZGVmaW5lIEBzY3tnYXNwfQorbWFjcm9zIGluc2lkZSBvdGhlciBtYWNybyBkZWZpbml0aW9ucywgdGhlIHByZXByb2Nlc3NvciBub3JtYWxseQoraW5jbHVkZXMgYSBzYW5pdHkgY2hlY2suICBJZiB5b3VyIHByb2dyYW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEsMDAwCituZXN0ZWQgZXhwYW5zaW9ucywgQHNje2dhc3B9IG5vcm1hbGx5IGV4aXRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFVzZQordGhpcyBvcHRpb24gdG8gdHVybiBvZmYgdGhpcyBjaGVjaywgYWxsb3dpbmcgdW5saW1pdGVkIG5lc3RlZAorZXhwYW5zaW9ucy4KKworQGl0ZW0gLXYKK0BpdGVteCAtLXZlcnNpb24KK0Rpc3BsYXkgdGhlIEBzY3tnYXNwfSB2ZXJzaW9uIG51bWJlci4KK0BlbmQgZnRhYmxlCisKK0Bub2RlIENvbW1hbmRzCitAY2hhcHRlciBQcmVwcm9jZXNzb3IgQ29tbWFuZHMKKworQHNje2dhc3B9IGNvbW1hbmRzIGhhdmUgYSBzdHJhaWdodGZvcndhcmQgc3ludGF4IHRoYXQgZml0cyBpbiB3ZWxsIHdpdGgKK2Fzc2VtYmx5IGNvbnZlbnRpb25zLiAgSW4gZ2VuZXJhbCwgYSBjb21tYW5kIGV4dGVuZHMgZm9yIGEgbGluZSwgYW5kIG1heQoraGF2ZSB1cCB0byB0aHJlZSBmaWVsZHM6IGFuIG9wdGlvbmFsIGxhYmVsLCB0aGUgY29tbWFuZCBpdHNlbGYsIGFuZAorb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBjb21tYW5kLiAgWW91IGNhbiB3cml0ZSBjb21tYW5kcyBpbiB1cHBlciBvcgorbG93ZXIgY2FzZSwgdGhvdWdoIHRoaXMgbWFudWFsIHNob3dzIHRoZW0gaW4gdXBwZXIgY2FzZS4gIEB4cmVme1N5bnRheAorRGV0YWlscywsIERldGFpbHMgb2YgdGhlIEdBU1Agc3ludGF4fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0BtZW51CisqIENvbmRpdGlvbmFsczo6CisqIExvb3BzOjoKKyogVmFyaWFibGVzOjoKKyogTWFjcm9zOjoKKyogRGF0YTo6CisqIExpc3RpbmdzOjoKKyogT3RoZXIgQ29tbWFuZHM6OgorKiBTeW50YXggRGV0YWlsczo6CisqIEFsdGVybmF0ZTo6CitAZW5kIG1lbnUKKworQG5vZGUgQ29uZGl0aW9uYWxzCitAc2VjdGlvbiBDb25kaXRpb25hbCBhc3NlbWJseQorCitUaGUgY29uZGl0aW9uYWwtYXNzZW1ibHkgZGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gaW5jbHVkZSBvciBleGNsdWRlCitwb3J0aW9ucyBvZiBhbiBhc3NlbWJseSBkZXBlbmRpbmcgb24gaG93IGEgcGFpciBvZiBleHByZXNzaW9ucywgb3IgYQorcGFpciBvZiBzdHJpbmdzLCBjb21wYXJlLgorCitUaGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgY29uZGl0aW9uYWxzIGlzIGZhbWlsaWFyIGZyb20gbWFueSBvdGhlcgorY29udGV4dHMuICBAY29kZXsuQUlGfSBtYXJrcyB0aGUgc3RhcnQgb2YgYSBjb25kaXRpb25hbCwgYW5kIHByZWNlZGVzCithc3NlbWJseSBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUuICAgQW4gb3B0aW9uYWwKK0Bjb2Rley5BRUxTRX0gcHJlY2VkZXMgYXNzZW1ibHkgZm9yIHRoZSBjb252ZXJzZSBjYXNlLCBhbmQgYW4KK0Bjb2Rley5BRU5ESX0gbWFya3MgdGhlIGVuZCBvZiB0aGUgY29uZGl0aW9uLgorCitAYyBGSVhNRSEgV2h5IGRvZXNuJ3QgLXUgdHVybiBvZmYgdGhpcyBjaGVjaz8KK1lvdSBtYXkgbmVzdCBjb25kaXRpb25hbHMgdXAgdG8gYSBkZXB0aCBvZiAxMDA7IEBzY3tnYXNwfSByZWplY3RzCituZXN0aW5nIGJleW9uZCB0aGF0LCBiZWNhdXNlIGl0IG1heSBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIG1hY3JvCitzdHJ1Y3R1cmUuCisKK0BjIEZJWE1FISBXaHkgaXNuJ3QgdGhlcmUgc29tZXRoaW5nIGxpa2UgY3BwJ3MgLUQgb3B0aW9uPyAgQ29uZGl0aW9uYWxzCitAYyAgICAgICAgd291bGQgYmUgbXVjaCBtb3JlIHVzZWZ1bCBpZiB0aGVyZSB3ZXJlLgorQ29uZGl0aW9uYWxzIGFyZSBwcmltYXJpbHkgdXNlZnVsIGluc2lkZSBtYWNybyBkZWZpbml0aW9ucywgd2hlcmUgeW91CitvZnRlbiBuZWVkIGRpZmZlcmVudCBlZmZlY3RzIGRlcGVuZGluZyBvbiBhcmd1bWVudCB2YWx1ZXMuCitAeHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfSwgZm9yIGRldGFpbHMgYWJvdXQgZGVmaW5pbmcKK21hY3Jvcy4KKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gLkFJRiBAdmFye2V4cHJhfSBAdmFye2NtcH0gQHZhcntleHByYn0KK0BpdGVteCAuQUlGICJAdmFye3N0cmF9IiBAdmFye2NtcH0gIkB2YXJ7c3RyYn0iCisKK1RoZSBnb3Zlcm5pbmcgY29uZGl0aW9uIGdvZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgQGNvZGV7LkFJRn0KK3ByZXByb2Nlc3NvciBjb21tYW5kLiAgWW91IG1heSBjb21wYXJlIGVpdGhlciB0d28gc3RyaW5ncywgb3IgdHdvCitleHByZXNzaW9ucy4KKworV2hlbiB5b3UgY29tcGFyZSBzdHJpbmdzLCBvbmx5IHR3byBjb25kaXRpb25hbCBAdmFye2NtcH0gY29tcGFyaXNvbgorb3BlcmF0b3JzIGFyZSBhdmFpbGFibGU6IEBzYW1we0VRfSAodHJ1ZSBpZiBAdmFye3N0cmF9IGFuZCBAdmFye3N0cmJ9CithcmUgaWRlbnRpY2FsKSwgYW5kIEBzYW1we05FfSAodGhlIG9wcG9zaXRlKS4KKworV2hlbiB5b3UgY29tcGFyZSB0d28gZXhwcmVzc2lvbnMsIEBlbXBoe2JvdGggZXhwcmVzc2lvbnMgbXVzdCBiZQorYWJzb2x1dGV9IChAcHhyZWZ7RXhwcmVzc2lvbnMsLCBBcml0aG1ldGljIGV4cHJlc3Npb25zIGluIEdBU1B9KS4gIFlvdQorY2FuIHVzZSB0aGVzZSBAdmFye2NtcH0gY29tcGFyaXNvbiBvcGVyYXRvcnMgd2l0aCBleHByZXNzaW9uczoKKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gRVEKK0FyZSBAdmFye2V4cHJhfSBhbmQgQHZhcntleHByYn0gZXF1YWw/ICAoRm9yIHN0cmluZ3MsIGFyZSBAdmFye3N0cmF9IGFuZAorQHZhcntzdHJifSBpZGVudGljYWw/KQorCitAaXRlbSBORQorQXJlIEB2YXJ7ZXhwcmF9IGFuZCBAdmFye2V4cHJifSBkaWZmZXJlbnQ/ICAoRm9yIHN0cmluZ3MsIGFyZSBAdmFye3N0cmF9CithbmQgQHZhcntzdHJifSBkaWZmZXJlbnQ/CisKK0BpdGVtIExUCitJcyBAdmFye2V4cHJhfSBsZXNzIHRoYW4gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQorCitAaXRlbSBMRQorSXMgQHZhcntleHByYX0gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKKworQGl0ZW0gR1QKK0lzIEB2YXJ7ZXhwcmF9IGdyZWF0ZXIgdGhhbiBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCisKK0BpdGVtIEdFCitJcyBAdmFye2V4cHJhfSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yCitzdHJpbmdzLikKK0BlbmQgZnRhYmxlCisKK0BpdGVtIC5BRUxTRQorTWFya3MgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5IGNvZGUgdG8gYmUgaW5jbHVkZWQgaWYgdGhlIGNvbmRpdGlvbiBmYWlscy4KK09wdGlvbmFsLCBhbmQgb25seSBhbGxvd2VkIHdpdGhpbiBhIGNvbmRpdGlvbmFsIChiZXR3ZWVuIEBjb2Rley5BSUZ9IGFuZAorQGNvZGV7LkFFTkRJfSkuCisKK0BpdGVtIC5BRU5ESQorTWFya3MgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsIGFzc2VtYmx5LgorQGVuZCBmdGFibGUKKworQG5vZGUgTG9vcHMKK0BzZWN0aW9uIFJlcGV0aXRpdmUgc2VjdGlvbnMgb2YgYXNzZW1ibHkKKworVHdvIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFsbG93IHlvdSB0byByZXBlYXRlZGx5IGlzc3VlIGNvcGllcyBvZiB0aGUKK3NhbWUgYmxvY2sgb2YgYXNzZW1ibHkgY29kZS4KKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gLkFSRVBFQVQgQHZhcnthZXhwfQorQGl0ZW14IC5BRU5EUgorSWYgeW91IHNpbXBseSBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBibG9jayBvZiBhc3NlbWJseSBvdmVyIGFuZCBvdmVyIGEKK2ZpeGVkIG51bWJlciBvZiB0aW1lcywgc2FuZHdpY2ggb25lIGluc3RhbmNlIG9mIHRoZSByZXBlYXRlZCBibG9jaworYmV0d2VlbiBAY29kZXsuQVJFUEVBVH0gYW5kIEBjb2Rley5BRU5EUn0uICBTcGVjaWZ5IHRoZSBudW1iZXIgb2YKK2NvcGllcyBhcyBAdmFye2FleHB9ICh3aGljaCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLiAgRm9yCitleGFtcGxlLCB0aGlzIHJlcGVhdHMgdHdvIGFzc2VtYmx5IHN0YXRlbWVudHMgdGhyZWUgdGltZXMgaW4gc3VjY2Vzc2lvbjoKKworQGNhcnRvdWNoZQorQGV4YW1wbGUKKyAgICAgICAgLkFSRVBFQVQgICAgICAgIDMKKyAgICAgICAgcm90Y2wgICByMgorICAgICAgICBkaXYxICAgIHIwLHIxCisgICAgICAgIC5BRU5EUgorQGVuZCBleGFtcGxlCitAZW5kIGNhcnRvdWNoZQorCitAaXRlbSAuQVdISUxFIEB2YXJ7ZXhwcmF9IEB2YXJ7Y21wfSBAdmFye2V4cHJifQorQGl0ZW14IC5BRU5EVworQGl0ZW14IC5BV0hJTEUgQHZhcntzdHJhfSBAdmFye2NtcH0gQHZhcntzdHJifQorQGl0ZW14IC5BRU5EVworVG8gcmVwZWF0IGEgYmxvY2sgb2YgYXNzZW1ibHkgZGVwZW5kaW5nIG9uIGEgY29uZGl0aW9uYWwgdGVzdCwgcmF0aGVyCit0aGFuIHJlcGVhdGluZyBpdCBmb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMsIHVzZSBAY29kZXsuQVdISUxFfS4KK0Bjb2Rley5BRU5EV30gbWFya3MgdGhlIGVuZCBvZiB0aGUgcmVwZWF0ZWQgYmxvY2suICBUaGUgY29uZGl0aW9uYWwKK2NvbXBhcmlzb24gd29ya3MgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgZm9yIEBjb2Rley5BSUZ9LCB3aXRoIHRoZSBzYW1lCitjb21wYXJpc29uIG9wZXJhdG9ycyAoQHB4cmVme0NvbmRpdGlvbmFscywsIENvbmRpdGlvbmFsIGFzc2VtYmx5fSkuCisKK1NpbmNlIHRoZSB0ZXJtcyBvZiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24sCitAY29kZXsuQVdISUxFfSBpcyBwcmltYXJpbHkgdXNlZnVsIHdpdGhpbiBtYWNyb3MuICBAeHJlZntNYWNyb3MsLAorRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCitAZW5kIGZ0YWJsZQorCitAY2luZGV4IGxvb3BzLCBicmVha2luZyBvdXQgb2YKK0BjaW5kZXggYnJlYWtpbmcgb3V0IG9mIGxvb3BzCitZb3UgY2FuIHVzZSB0aGUgQGNvZGV7LkVYSVRNfSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIHRvIGJyZWFrIG91dCBvZgorbG9vcHMgZWFybHkgKGFzIHdlbGwgYXMgdG8gYnJlYWsgb3V0IG9mIG1hY3JvcykuICBAeHJlZntNYWNyb3MsLAorRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCisKK0Bub2RlIFZhcmlhYmxlcworQHNlY3Rpb24gUHJlcHJvY2Vzc29yIHZhcmlhYmxlcworCitZb3UgY2FuIHVzZSB2YXJpYWJsZXMgaW4gQHNje2dhc3B9IHRvIHJlcHJlc2VudCBzdHJpbmdzLCByZWdpc3RlcnMsIG9yCit0aGUgcmVzdWx0cyBvZiBleHByZXNzaW9ucy4KKworWW91IG11c3QgZGlzdGluZ3Vpc2ggdHdvIGtpbmRzIG9mIHZhcmlhYmxlczogCitAZW51bWVyYXRlCitAaXRlbQorVmFyaWFibGVzIGRlZmluZWQgd2l0aCBAY29kZXsuRVFVfSBvciBAY29kZXsuQVNTSUdOfS4gIFRvIGV2YWx1YXRlIHRoaXMKK2tpbmQgb2YgdmFyaWFibGUgaW4geW91ciBhc3NlbWJseSBvdXRwdXQsIHNpbXBseSBtZW50aW9uIGl0cyBuYW1lLiAgRm9yCitleGFtcGxlLCB0aGVzZSB0d28gbGluZXMgZGVmaW5lIGFuZCB1c2UgYSB2YXJpYWJsZSBAc2FtcHtlZ306CisKK0BjYXJ0b3VjaGUKK0BleGFtcGxlCitlZyAgICAgLkVRVSAgIEZMSVAtNjQKKyAgICAgICBAZG90c3t9CisgICAgICAgbW92LmwgIGVnLHIwCitAZW5kIGV4YW1wbGUKK0BlbmQgY2FydG91Y2hlCisKK0BlbXBoe0RvIG5vdCB1c2V9IHRoaXMga2luZCBvZiB2YXJpYWJsZSBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ucyBvcgord2hpbGUgbG9vcHM7IEBzY3tnYXNwfSBvbmx5IGV2YWx1YXRlcyB0aGVzZSB2YXJpYWJsZXMgd2hlbiB3cml0aW5nCithc3NlbWJseSBvdXRwdXQuCisKK0BpdGVtCitWYXJpYWJsZXMgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4gIFlvdSBjYW4gZGVmaW5lIHRoZXNlCit3aXRoIEBjb2Rley5BU1NJR05DfSBvciBAY29kZXsuQVNTSUdOQX0uICBUbyBldmFsdWF0ZSB0aGlzCitraW5kIG9mIHZhcmlhYmxlLCB3cml0ZSBAc2FtcHtcJn0gYmVmb3JlIHRoZSB2YXJpYWJsZSBuYW1lOyBmb3IgZXhhbXBsZSwKKworQGNhcnRvdWNoZQorQGV4YW1wbGUKK29wY2l0ICAuQVNTSUdOQSAgNDcKKyAgICAgICBAZG90c3t9CisgICAgICAgLkFXSElMRSAgXCZvcGNpdCBHVCAwCisgICAgICAgQGRvdHN7fQorICAgICAgIC5BRU5EVworQGVuZCBleGFtcGxlCitAZW5kIGNhcnRvdWNoZQorCitAc2N7Z2FzcH0gdHJlYXRzIG1hY3JvIGFyZ3VtZW50cyBhbG1vc3QgdGhlIHNhbWUgd2F5LCBidXQgdG8gZXZhbHVhdGUKK3RoZW0geW91IHVzZSB0aGUgcHJlZml4IEBzYW1we1x9IHJhdGhlciB0aGFuIEBzYW1we1wmfS4KK0B4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgorQGVuZCBlbnVtZXJhdGUKKworQGZ0YWJsZSBAY29kZQorQGl0ZW0gQHZhcntwdmFyfSAuRVFVIEB2YXJ7ZXhwcn0KK0BjIEZJWE1FISAgQW55dGhpbmcgdG8gYmV3YXJlIG9mIHJlIEdBUyBkaXJlY3RpdmUgb2Ygc2FtZSBuYW1lPworQXNzaWduIHByZXByb2Nlc3NvciB2YXJpYWJsZSBAdmFye3B2YXJ9IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgorQHZhcntleHByfS4gIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gcmVkZWZpbml0aW9uOyB1c2UgQHNhbXB7LkVRVX0KK3dpdGggdGhlIHNhbWUgQHZhcntwdmFyfSBhcyBvZnRlbiBhcyB5b3UgZmluZCBpdCBjb252ZW5pZW50LgorCitAaXRlbSBAdmFye3B2YXJ9IC5BU1NJR04gQHZhcntleHByfQorQWxtb3N0IHRoZSBzYW1lIGFzIEBjb2Rley5FUVV9LCBzYXZlIHRoYXQgeW91IG1heSBub3QgcmVkZWZpbmUKK0B2YXJ7cHZhcn0gdXNpbmcgQGNvZGV7LkFTU0lHTn0gb25jZSBpdCBoYXMgYSB2YWx1ZS4KK0BjIEZJWE1FISEgIFN1cHBvc2VkIHRvIHdvcmsgdGhpcyB3YXksIGFwcGFyZW50bHksIGJ1dCBvbiA5ZmViOTQgd29ya3MKK0BjICAgICAgICAgIGp1c3QgbGlrZSAuRVFVCisKK0BpdGVtIEB2YXJ7cHZhcn0gLkFTU0lHTkEgQHZhcnthZXhwcn0KK0RlZmluZSBhIHZhcmlhYmxlIHdpdGggYSBudW1lcmljIHZhbHVlLCBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorQHZhcnthZXhwcn0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgWW91IGNhbiByZWRlZmluZSB2YXJpYWJsZXMKK3dpdGggQGNvZGV7LkFTU0lHTkF9IGF0IGFueSB0aW1lLgorCitAaXRlbSBAdmFye3B2YXJ9IC5BU1NJR05DICJAdmFye3N0cn0iCitEZWZpbmUgYSB2YXJpYWJsZSB3aXRoIGEgc3RyaW5nIHZhbHVlLCBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorWW91IGNhbiByZWRlZmluZSB2YXJpYWJsZXMgd2l0aCBAY29kZXsuQVNTSUdOQ30gYXQgYW55IHRpbWUuCisKK0BpdGVtIEB2YXJ7cHZhcn0gLlJFRyAoQHZhcntyZWdpc3Rlcn0pCitVc2UgQGNvZGV7LlJFR30gdG8gZGVmaW5lIGEgdmFyaWFibGUgdGhhdCByZXByZXNlbnRzIGEgcmVnaXN0ZXIuICBJbgorcGFydGljdWxhciwgQHZhcntyZWdpc3Rlcn0gaXMgQGVtcGh7bm90IGV2YWx1YXRlZH0gYXMgYW4gZXhwcmVzc2lvbi4KK1lvdSBtYXkgdXNlIEBjb2Rley5SRUd9IGF0IHdpbGwgdG8gcmVkZWZpbmUgcmVnaXN0ZXIgdmFyaWFibGVzLgorQGVuZCBmdGFibGUKKworQWxsIHRoZXNlIGRpcmVjdGl2ZXMgYWNjZXB0IHRoZSB2YXJpYWJsZSBuYW1lIGluIHRoZSBgYGxhYmVsJycgcG9zaXRpb24sCit0aGF0IGlzIGF0IHRoZSBsZWZ0IG1hcmdpbi4gIFlvdSBtYXkgc3BlY2lmeSBhIGNvbG9uIGFmdGVyIHRoZSB2YXJpYWJsZQorbmFtZSBpZiB5b3Ugd2lzaDsgdGhlIGZpcnN0IGV4YW1wbGUgYWJvdmUgY291bGQgaGF2ZSBzdGFydGVkIEBzYW1we2VnOn0KK3dpdGggdGhlIHNhbWUgZWZmZWN0LgorCitAYyBwYWdlYnJlYWsgbWFrZXMgZm9yIGJldHRlciBhZXN0aGV0aWNzLS0tZW5zdXJlcyBtYWNybyBhbmQgZXhwYW5zaW9uIHRvZ2V0aGVyCitAcGFnZQorQG5vZGUgTWFjcm9zCitAc2VjdGlvbiBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzCisKK1RoZSBjb21tYW5kcyBAY29kZXsuTUFDUk99IGFuZCBAY29kZXsuRU5ETX0gYWxsb3cgeW91IHRvIGRlZmluZSBtYWNyb3MKK3RoYXQgZ2VuZXJhdGUgYXNzZW1ibHkgb3V0cHV0LiAgWW91IGNhbiB1c2UgdGhlc2UgbWFjcm9zIHdpdGggYSBzeW50YXgKK3NpbWlsYXIgdG8gYnVpbHQtaW4gQHNje2dhc3B9IG9yIGFzc2VtYmxlciBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCit0aGlzIGRlZmluaXRpb24gc3BlY2lmaWVzIGEgbWFjcm8gQGNvZGV7U1VNfSB0aGF0IGFkZHMgdG9nZXRoZXIgYSByYW5nZSBvZgorY29uc2VjdXRpdmUgcmVnaXN0ZXJzOgorCitAY2FydG91Y2hlCitAZXhhbXBsZQorICAgICAgICAuTUFDUk8gIFNVTSBGUk9NPTAsIFRPPTkKKyAgICAgICAgISBcRlJPTSBcVE8KKyAgICAgICAgbW92ICAgICByXEZST00scjEwCitDT1VOVCAgIC5BU1NJR05BICAgICAgICBcRlJPTSsxCisgICAgICAgIC5BV0hJTEUgXCZDT1VOVCBMRSBcVE8KKyAgICAgICAgYWRkICAgICByXCZDT1VOVCxyMTAKK0NPVU5UICAgLkFTU0lHTkEgICAgICAgIFwmQ09VTlQrMQorICAgICAgICAuQUVORFcKKyAgICAgICAgLkVORE0KK0BlbmQgZXhhbXBsZQorQGVuZCBjYXJ0b3VjaGUKKworQG5vaW5kZW50CitXaXRoIHRoYXQgZGVmaW5pdGlvbiwgQHNhbXB7U1VNIDAsNX0gZ2VuZXJhdGVzIHRoaXMgYXNzZW1ibHkgb3V0cHV0OgorCitAY2FydG91Y2hlCitAZXhhbXBsZQorICAgICAgICAhIDAgNQorICAgICAgICBtb3YgICAgIHIwLHIxMAorICAgICAgICBhZGQgICAgIHIxLHIxMAorICAgICAgICBhZGQgICAgIHIyLHIxMAorICAgICAgICBhZGQgICAgIHIzLHIxMAorICAgICAgICBhZGQgICAgIHI0LHIxMAorICAgICAgICBhZGQgICAgIHI1LHIxMAorQGVuZCBleGFtcGxlCitAZW5kIGNhcnRvdWNoZQorCitAZnRhYmxlIEBjb2RlCitAaXRlbSAuTUFDUk8gQHZhcnttYWNuYW1lfQorQGl0ZW14IC5NQUNSTyBAdmFye21hY25hbWV9IEB2YXJ7bWFjYXJnc30gQGRvdHN7fQorQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQHZhcnttYWNuYW1lfS4gIElmIHlvdXIgbWFjcm8KK2RlZmluaXRpb24gcmVxdWlyZXMgYXJndW1lbnRzLCBzcGVjaWZ5IHRoZWlyIG5hbWVzIGFmdGVyIHRoZSBtYWNybyBuYW1lLAorc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMuICBZb3UgY2FuIHN1cHBseSBhIGRlZmF1bHQgdmFsdWUgZm9yIGFueQorbWFjcm8gYXJndW1lbnQgYnkgZm9sbG93aW5nIHRoZSBuYW1lIHdpdGggQHNhbXB7PUB2YXJ7ZGVmbHR9fS4gIEZvcgorZXhhbXBsZSwgdGhlc2UgYXJlIGFsbCB2YWxpZCBAY29kZXsuTUFDUk99IHN0YXRlbWVudHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLk1BQ1JPIENPTU0KK0JlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle0NPTU19LCB3aGljaCB0YWtlcyBubworYXJndW1lbnRzLgorCitAaXRlbSAuTUFDUk8gUExVUzEgUCwgUDEKK0BpdGVteCAuTUFDUk8gUExVUzEgUCBQMQorRWl0aGVyIHN0YXRlbWVudCBiZWdpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7UExVUzF9LAord2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czsgd2l0aGluIHRoZSBtYWNybyBkZWZpbml0aW9uLCB3cml0ZQorQHNhbXB7XFB9IG9yIEBzYW1we1xQMX0gdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cy4KKworQGl0ZW0gLk1BQ1JPIFJFU0VSVkVfU1RSIFAxPTAgUDIKK0JlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle1JFU0VSVkVfU1RSfSwgd2l0aCB0d28KK2FyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBoYXMgYSBkZWZhdWx0IHZhbHVlLCBidXQgbm90IHRoZSBzZWNvbmQuCitBZnRlciB0aGUgZGVmaW5pdGlvbiBpcyBjb21wbGV0ZSwgeW91IGNhbiBjYWxsIHRoZSBtYWNybyBlaXRoZXIgYXMKK0BzYW1we1JFU0VSVkVfU1RSIEB2YXJ7YX0sQHZhcntifX0gKHdpdGggQHNhbXB7XFAxfSBldmFsdWF0aW5nIHRvCitAdmFye2F9IGFuZCBAc2FtcHtcUDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSksIG9yIGFzIEBzYW1we1JFU0VSVkVfU1RSCissQHZhcntifX0gKHdpdGggQHNhbXB7XFAxfSBldmFsdWF0aW5nIGFzIHRoZSBkZWZhdWx0LCBpbiB0aGlzIGNhc2UKK0BzYW1wezB9LCBhbmQgQHNhbXB7XFAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLgorQGVuZCB0YWJsZQorCitXaGVuIHlvdSBjYWxsIGEgbWFjcm8sIHlvdSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgdmFsdWVzIGVpdGhlciBieQorcG9zaXRpb24sIG9yIGJ5IGtleXdvcmQuICBGb3IgZXhhbXBsZSwgQHNhbXB7U1VNIDksMTd9IGlzIGVxdWl2YWxlbnQgdG8KK0BzYW1we1NVTSBUTz0xNywgRlJPTT05fS4gIE1hY3JvIGFyZ3VtZW50cyBhcmUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcworc2ltaWxhciB0byB0aGUgdmFyaWFibGVzIHlvdSBkZWZpbmUgd2l0aCBAc2FtcHsuQVNTSUdOQX0gb3IKK0BzYW1wey5BU1NJR05DfTsgaW4gcGFydGljdWxhciwgeW91IGNhbiB1c2UgdGhlbSBpbiBjb25kaXRpb25hbHMgb3IgZm9yCitsb29wIGNvbnRyb2wuICAoVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgcHJlZml4IHlvdSB3cml0ZSB0byBldmFsdWF0ZQordGhlIHZhcmlhYmxlOiBmb3IgYSBtYWNybyBhcmd1bWVudCwgd3JpdGUgQHNhbXB7XEB2YXJ7YXJnbmFtZX19LCBidXQgZm9yCithIHByZXByb2Nlc3NvciB2YXJpYWJsZSwgd3JpdGUgQHNhbXB7XCZAdmFye3Zhcm5hbWV9fS4pCisKK0BpdGVtIEB2YXJ7bmFtZX0gLk1BQ1JPCitAaXRlbXggQHZhcntuYW1lfSAuTUFDUk8gKCBAdmFye21hY2FyZ3N9IEBkb3Rze30gKQorQGMgRklYTUUgY2hlY2s6IEkgdGhpbmsgbm8gZXJyb3IgX2FuZF8gbm8gYXJncyByZWNvZ25pemVkIGlmIEkgdXNlIGZvcm0KK0BjICAgICAgIE5BTUUgIC5NQUNSTyAgIEFSRyBBUkcKK0FuIGFsdGVybmF0aXZlIGZvcm0gb2YgaW50cm9kdWNpbmcgYSBtYWNybyBkZWZpbml0aW9uOiBzcGVjaWZ5IHRoZSBtYWNybworbmFtZSBpbiB0aGUgbGFiZWwgcG9zaXRpb24sIGFuZCB0aGUgYXJndW1lbnRzIChpZiBhbnkpIGJldHdlZW4KK3BhcmVudGhlc2VzIGFmdGVyIHRoZSBuYW1lLiAgRGVmYXVsdGluZyBydWxlcyBhbmQgdXNhZ2Ugd29yayB0aGUgc2FtZQord2F5IGFzIGZvciB0aGUgb3RoZXIgbWFjcm8gZGVmaW5pdGlvbiBzeW50YXguCisKK0BpdGVtIC5FTkRNCitNYXJrIHRoZSBlbmQgb2YgYSBtYWNybyBkZWZpbml0aW9uLgorCitAaXRlbSAuRVhJVE0KK0V4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLCBAY29kZXsuQVJFUEVBVH0gbG9vcCwgb3IKK0Bjb2Rley5BV0hJTEV9IGxvb3AuCisKK0BjaW5kZXggbnVtYmVyIG9mIG1hY3JvcyBleGVjdXRlZAorQGNpbmRleCBtYWNyb3MsIGNvdW50IGV4ZWN1dGVkCitAaXRlbSBcQEAKK0BzY3tnYXNwfSBtYWludGFpbnMgYSBjb3VudGVyIG9mIGhvdyBtYW55IG1hY3JvcyBpdCBoYXMKK2V4ZWN1dGVkIGluIHRoaXMgcHNldWRvLXZhcmlhYmxlOyB5b3UgY2FuIGNvcHkgdGhhdCBudW1iZXIgdG8geW91cgorb3V0cHV0IHdpdGggQHNhbXB7XEBAfSwgYnV0IEBlbXBoe29ubHkgd2l0aGluIGEgbWFjcm8gZGVmaW5pdGlvbn0uCisKK0BpdGVtIExPQ0FMIEB2YXJ7bmFtZX0gWyAsIEBkb3Rze30gXQorQGVtcGh7V2FybmluZzogQGNvZGV7TE9DQUx9IGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgYGBhbHRlcm5hdGUKK21hY3JvIHN5bnRheCcnIHdpdGggQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfS59ICBAeHJlZntBbHRlcm5hdGUsLAorQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCisKK0dlbmVyYXRlIGEgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBlYWNoIG9mIHRoZSBAdmFye25hbWV9IGFyZ3VtZW50cywgYW5kCityZXBsYWNlIGFueSBpbnN0YW5jZXMgb2YgQHZhcntuYW1lfSBpbiBlYWNoIG1hY3JvIGV4cGFuc2lvbi4gIFRoZQorcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHVuaXF1ZSBpbiB0aGUgYXNzZW1ibHksIGFuZCBkaWZmZXJlbnQgZm9yIGVhY2gKK3NlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbi4gIEBjb2Rle0xPQ0FMfSBhbGxvd3MgeW91IHRvIHdyaXRlIG1hY3JvcyB0aGF0CitkZWZpbmUgc3ltYm9scywgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0IGJldHdlZW4gc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9ucy4KK0BlbmQgZnRhYmxlCisKK0Bub2RlIERhdGEKK0BzZWN0aW9uIERhdGEgb3V0cHV0CisKK0luIGFzc2VtYmx5IGNvZGUsIHlvdSBvZnRlbiBuZWVkIHRvIHNwZWNpZnkgd29ya2luZyBhcmVhcyBvZiBtZW1vcnk7CitkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uLCB5b3UgbWF5IHdhbnQgdG8gaW5pdGlhbGl6ZSBzdWNoIG1lbW9yeSBvcgorbm90LiAgQHNje2dhc3B9IHByb3ZpZGVzIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRvIGhlbHAgeW91IGF2b2lkCityZXBldGl0aXZlIGNvZGluZyBmb3IgYm90aCBwdXJwb3Nlcy4KKworWW91IGNhbiB1c2UgbGFiZWxzIGFzIHVzdWFsIHRvIG1hcmsgdGhlIGRhdGEgYXJlYXMuCisKK0BtZW51CisqIEluaXRpYWxpemVkOjoKKyogVW5pbml0aWFsaXplZDo6CitAZW5kIG1lbnUKKworQG5vZGUgSW5pdGlhbGl6ZWQKK0BzdWJzZWN0aW9uIEluaXRpYWxpemVkIGRhdGEKKworVGhlc2UgYXJlIHRoZSBAc2N7Z2FzcH0gZGlyZWN0aXZlcyBmb3IgaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIHRoZSBzdGFuZGFyZAorQHNje2dudX0gYXNzZW1ibGVyIGRpcmVjdGl2ZXMgdGhleSBleHBhbmQgdG86CisKK0BmdGFibGUgQGNvZGUKK0BpdGVtIC5EQVRBIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KK0BpdGVteCAuREFUQS5CIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KK0BpdGVteCAuREFUQS5XIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KK0BpdGVteCAuREFUQS5MIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KK0V2YWx1YXRlIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgQHZhcntleHByfSwgYW5kIGVtaXQgdGhlIGNvcnJlc3BvbmRpbmcKK0Bjb2Rle2FzfSBkaXJlY3RpdmUgKGxhYmVsbGVkIHdpdGggQHZhcntsYWJ9KS4gIFRoZSB1bnF1YWxpZmllZAorQGNvZGV7LkRBVEF9IGVtaXRzIEBzYW1wey5sb25nfTsgQGNvZGV7LkRBVEEuQn0gZW1pdHMgQHNhbXB7LmJ5dGV9OworQGNvZGV7LkRBVEEuV30gZW1pdHMgQHNhbXB7LnNob3J0fTsgYW5kIEBjb2Rley5EQVRBLkx9IGVtaXRzCitAc2FtcHsubG9uZ30uCisKK0ZvciBleGFtcGxlLCBAc2FtcHtmb28gLkRBVEEgMSwyLDN9IGVtaXRzIEBzYW1we2ZvbzogLmxvbmcgMSwyLDN9LgorCitAaXRlbSAuREFUQUIgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9CitAaXRlbXggLkRBVEFCLkIgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9CitAaXRlbXggLkRBVEFCLlcgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9CitAaXRlbXggLkRBVEFCLkwgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9CitAYyBGSVhNRSEgTG9va3MgbGlrZSBnYXNwIGFjY2VwdHMgYW5kIGlnbm9yZXMgYXJncyBhZnRlciAybmQuCitNYWtlIEBjb2Rle2FzfSBlbWl0IEB2YXJ7cmVwZWF0fSBjb3BpZXMgb2YgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCitAdmFye2V4cHJ9ICh1c2luZyB0aGUgQGNvZGV7YXN9IGRpcmVjdGl2ZSBAY29kZXsuZmlsbH0pLgorQHNhbXB7LkRBVEFCLkJ9IHJlcGVhdHMgb25lLWJ5dGUgdmFsdWVzOyBAc2FtcHsuREFUQUIuV30gcmVwZWF0cwordHdvLWJ5dGUgdmFsdWVzOyBhbmQgQHNhbXB7LkRBVEFCLkx9IHJlcGVhdHMgZm91ci1ieXRlIHZhbHVlcy4KK0BzYW1wey5EQVRBQn0gd2l0aG91dCBhIHN1ZmZpeCByZXBlYXRzIGZvdXItYnl0ZSB2YWx1ZXMsIGp1c3QgbGlrZQorQHNhbXB7LkRBVEFCLkx9LgorCitAYyBGSVhNRSEgQWxsb3dpbmcgemVybyBtaWdodCBiZSB1c2VmdWwgZm9yIGVkZ2UgY29uZGl0aW9ucyBpbiBtYWNyb3MuCitAdmFye3JlcGVhdH0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIHdpdGggYSBwb3NpdGl2ZSB2YWx1ZS4KKworQGl0ZW0gLlNEQVRBICJAdmFye3N0cn0iIEBkb3Rze30KK1N0cmluZyBkYXRhLiAgRW1pdHMgYSBjb25jYXRlbmF0aW9uIG9mIGJ5dGVzLCBwcmVjaXNlbHkgYXMgeW91IHNwZWNpZnkKK3RoZW0gKGluIHBhcnRpY3VsYXIsIEBlbXBoe25vdGhpbmcgaXMgYWRkZWQgdG8gbWFyayB0aGUgZW5kfSBvZiB0aGUKK3N0cmluZykuICBAeHJlZntDb25zdGFudHMsLCBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzfSwgZm9yIGRldGFpbHMKK2Fib3V0IGhvdyB0byB3cml0ZSBzdHJpbmdzLiAgQGNvZGV7LlNEQVRBfSBjb25jYXRlbmF0ZXMgbXVsdGlwbGUKK2FyZ3VtZW50cywgbWFraW5nIGl0IGVhc3kgdG8gc3dpdGNoIGJldHdlZW4gc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4gIFlvdQorY2FuIHVzZSBjb21tYXMgdG8gc2VwYXJhdGUgdGhlIGluZGl2aWR1YWwgYXJndW1lbnRzIGZvciBjbGFyaXR5LCBpZiB5b3UKK2Nob29zZS4KKworQGl0ZW0gLlNEQVRBQiBAdmFye3JlcGVhdH0sICJAdmFye3N0cn0iIEBkb3Rze30KK1JlcGVhdGVkIHN0cmluZyBkYXRhLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSBjb3BpZXMgb2YKK3RoZSBzdHJpbmcgdG8gZW1pdDsgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmeSB0aGUgc3RyaW5nLCBpbiB0aGUKK3NhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG8gQGNvZGV7LlNEQVRBfS4KKworQGl0ZW0gLlNEQVRBWiAiQHZhcntzdHJ9IiBAZG90c3t9CitaZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGRhdGEuICBKdXN0IGxpa2UgQGNvZGV7LlNEQVRBfSwgZXhjZXB0IHRoYXQKK0Bjb2Rley5TREFUQVp9IHdyaXRlcyBhIHplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisKK0BpdGVtIC5TREFUQUMgIkB2YXJ7c3RyfSIgQGRvdHN7fQorQ291bnQtcHJlZml4ZWQgc3RyaW5nIGRhdGEuICBKdXN0IGxpa2UgQGNvZGV7LlNEQVRBfSwgZXhjZXB0IHRoYXQKK0BzY3tnYXNwfSBwcmVjZWRlcyB0aGUgc3RyaW5nIHdpdGggYSBsZWFkaW5nIG9uZS1ieXRlIGNvdW50LiAgRm9yCitleGFtcGxlLCBAc2FtcHsuU0RBVEFDICJISSJ9IGdlbmVyYXRlcyBAc2FtcHsuYnl0ZSAyLDcyLDczfS4gIFNpbmNlIHRoZQorY291bnQgZmllbGQgaXMgb25seSBvbmUgYnl0ZSwgeW91IGNhbiBvbmx5IHVzZSBAY29kZXsuU0RBVEFDfSBmb3IKK3N0cmluZ3MgbGVzcyB0aGFuIDI1NiBieXRlcyBpbiBsZW5ndGguCitAZW5kIGZ0YWJsZQorCitAbm9kZSBVbmluaXRpYWxpemVkCitAc3Vic2VjdGlvbiBVbmluaXRpYWxpemVkIGRhdGEKKworQGMgRklYTUUhICAuc3BhY2UgZGlmZmVyZW50IG9uIHNvbWUgcGxhdGZvcm1zLCBub3RhYmx5IEhQUEEuICBDb25maWc/CitVc2UgdGhlIEBjb2Rley5SRVN9LCBAY29kZXsuU1JFU30sIEBjb2Rley5TUkVTQ30sIGFuZCBAY29kZXsuU1JFU1p9CitkaXJlY3RpdmVzIHRvIHJlc2VydmUgbWVtb3J5IGFuZCBsZWF2ZSBpdCB1bmluaXRpYWxpemVkLiAgQHNje2dhc3B9CityZXNvbHZlcyB0aGVzZSBkaXJlY3RpdmVzIHRvIGFwcHJvcHJpYXRlIGNhbGxzIG9mIHRoZSBAc2N7Z251fQorQGNvZGV7YXN9IEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgorCitAZnRhYmxlIEBjb2RlCitAaXRlbSAuUkVTIEB2YXJ7Y291bnR9CitAaXRlbXggLlJFUy5CIEB2YXJ7Y291bnR9CitAaXRlbXggLlJFUy5XIEB2YXJ7Y291bnR9CitAaXRlbXggLlJFUy5MIEB2YXJ7Y291bnR9CitSZXNlcnZlIHJvb20gZm9yIEB2YXJ7Y291bnR9IHVuaW5pdGlhbGl6ZWQgZWxlbWVudHMgb2YgZGF0YS4gIFRoZQorc3VmZml4IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQ6IEBjb2Rley5SRVMuQn0gcmVzZXJ2ZXMKK0B2YXJ7Y291bnR9IGJ5dGVzLCBAY29kZXsuUkVTLld9IHJlc2VydmVzIEB2YXJ7Y291bnR9IHBhaXJzIG9mIGJ5dGVzLAorYW5kIEBjb2Rley5SRVMuTH0gcmVzZXJ2ZXMgQHZhcntjb3VudH0gcXVhcnRldHMuICBAY29kZXsuUkVTfSB3aXRob3V0IGEKK3N1ZmZpeCBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley5SRVMuTH0uCisKK0BpdGVtIC5TUkVTIEB2YXJ7Y291bnR9CitAaXRlbXggLlNSRVMuQiBAdmFye2NvdW50fQorQGl0ZW14IC5TUkVTLlcgQHZhcntjb3VudH0KK0BpdGVteCAuU1JFUy5MIEB2YXJ7Y291bnR9CitAYyBGSVhNRSEgIFRoaXMgaXMgYm9yaW5nLiAgU2hvdWxkbid0IGl0IGF0IGxlYXN0IGhhdmUgYSBkaWZmZXJlbnQKK0BjICAgICAgICAgZGVmYXVsdCBzaXplPyAgKGUuZy4gdGhlICJTIiBzdWdnZXN0cyAic3RyaW5nIiwgZm9yIHdoaWNoIC5CCitAYyAgICAgICAgIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUpCitAY29kZXsuU1JFU30gaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuUkVTfS4KKworQGl0ZW0gLlNSRVNDIEB2YXJ7Y291bnR9CitAaXRlbXggLlNSRVNDLkIgQHZhcntjb3VudH0KK0BpdGVteCAuU1JFU0MuVyBAdmFye2NvdW50fQorQGl0ZW14IC5TUkVTQy5MIEB2YXJ7Y291bnR9CitMaWtlIEBjb2Rley5TUkVTfSwgYnV0IHJlc2VydmVzIHNwYWNlIGZvciBAY29kZXtAdmFye2NvdW50fSsxfSBlbGVtZW50cy4KKworQGl0ZW0gLlNSRVNaIEB2YXJ7Y291bnR9CitAaXRlbXggLlNSRVNaLkIgQHZhcntjb3VudH0KK0BpdGVteCAuU1JFU1ouVyBAdmFye2NvdW50fQorQGl0ZW14IC5TUkVTWi5MIEB2YXJ7Y291bnR9CitMaWtlIEBjb2Rley5TUkVTfSwgYnV0IHJlc2VydmVzIHNwYWNlIGZvciBAY29kZXtAdmFye2NvdW50fSsxfSBlbGVtZW50cy4KK0BlbmQgZnRhYmxlCisKK0Bub2RlIExpc3RpbmdzCitAc2VjdGlvbiBBc3NlbWJseSBsaXN0aW5nIGNvbnRyb2wKKworVGhlIEBzY3tnYXNwfSBsaXN0aW5nLWNvbnRyb2wgZGlyZWN0aXZlcyBjb3JyZXNwb25kIHRvCityZWxhdGVkIEBzY3tnbnV9IEBjb2Rle2FzfSBkaXJlY3RpdmVzLgorCitAZnRhYmxlIEBjb2RlCitAaXRlbSAuUFJJTlQgTElTVAorQGl0ZW14IC5QUklOVCBOT0xJU1QKK1ByaW50IGNvbnRyb2wuICBUaGlzIGRpcmVjdGl2ZSBlbWl0cyB0aGUgQHNje2dudX0gQGNvZGV7YXN9IGRpcmVjdGl2ZQorQGNvZGV7Lmxpc3R9IG9yIEBjb2Rley5ub2xpc3R9LCBhY2NvcmRpbmcgdG8gaXRzIGFyZ3VtZW50LiAgQHhyZWZ7TGlzdCwsCitAY29kZXsubGlzdH0sIGFzLmluZm8sIFVzaW5nIGFzfSwgZm9yIGRldGFpbHMgb24gaG93IHRoZXNlIGRpcmVjdGl2ZXMKK2ludGVyYWN0LgorCitAaXRlbSAuRk9STSBMSU49QHZhcntsbn0KK0BpdGVteCAuRk9STSBDT0w9QHZhcntjb2xzfQorQGl0ZW14IC5GT1JNIExJTj1AdmFye2xufSBDT0w9QHZhcntjb2xzfQorU3BlY2lmeSB0aGUgcGFnZSBzaXplIGZvciBhc3NlbWJseSBsaXN0aW5nczogQHZhcntsbn0gcmVwcmVzZW50cyB0aGUKK251bWJlciBvZiBsaW5lcywgYW5kIEB2YXJ7Y29sc30gdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgWW91IG1heSBzcGVjaWZ5CitlaXRoZXIgcGFnZSBkaW1lbnNpb24gaW5kZXBlbmRlbnRseSwgb3IgYm90aCB0b2dldGhlci4gIElmIHlvdSBkbyBub3QKK3NwZWNpZnkgdGhlIG51bWJlciBvZiBsaW5lcywgQHNje2dhc3B9IGFzc3VtZXMgNjAgbGluZXM7IGlmIHlvdSBkbyBub3QKK3NwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zLCBAc2N7Z2FzcH0gYXNzdW1lcyAxMzIgY29sdW1ucy4KKyhBbnkgdmFsdWVzIHlvdSBtYXkgaGF2ZSBzcGVjaWZpZWQgaW4gcHJldmlvdXMgaW5zdGFuY2VzIG9mIEBjb2Rley5GT1JNfQorZG8gQGVtcGh7bm90fSBjYXJyeSBvdmVyIGFzIGRlZmF1bHRzLikgIEVtaXRzIHRoZSBAY29kZXsucHNpemV9Cithc3NlbWJsZXIgZGlyZWN0aXZlLgorCitAaXRlbSAuSEVBRElORyBAdmFye3N0cmluZ30KK1NwZWNpZnkgQHZhcntzdHJpbmd9IGFzIHRoZSB0aXRsZSBvZiB5b3VyIGFzc2VtYmx5IGxpc3RpbmdzLiAgRW1pdHMKK0BzYW1wey50aXRsZSAiQHZhcntzdHJpbmd9In0uCisKK0BpdGVtIC5QQUdFCitGb3JjZSBhIG5ldyBwYWdlIGluIGFzc2VtYmx5IGxpc3RpbmdzLiAgRW1pdHMgQHNhbXB7LmVqZWN0fS4KK0BlbmQgZnRhYmxlCisKK0Bub2RlIE90aGVyIENvbW1hbmRzCitAc2VjdGlvbiBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzCisKK0BmdGFibGUgQGNvZGUKK0BpdGVtIC5BTFRFUk5BVEUKK1VzZSB0aGUgYWx0ZXJuYXRlIG1hY3JvIHN5bnRheCBoZW5jZWZvcnRoIGluIHRoZSBhc3NlbWJseS4KK0B4cmVme0FsdGVybmF0ZSwsIEFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgorCitAaXRlbSAuT1JHCitAYyBGSVhNRSEgIFRoaXMgaXMgdmVyeSBzdHJhbmdlLCBzaW5jZSBfR0FTXyB1bmRlcnN0YW5kcyAub3JnCitUaGlzIGNvbW1hbmQgaXMgcmVjb2duaXplZCwgYnV0IG5vdCB5ZXQgaW1wbGVtZW50ZWQuICBAc2N7Z2FzcH0KK2dlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ncmFtcyB0aGF0IHVzZSBAY29kZXsuT1JHfS4KKworQGl0ZW0gLlJBRElYIEB2YXJ7c30KK0BjIEZJWE1FIG5vIHRlc3QgY2FzZXMgaW4gdGVzdHN1aXRlL2dhc3AKK0BzY3tnYXNwfSB1bmRlcnN0YW5kcyBudW1iZXJzIGluIGFueSBvZiBiYXNlIHR3bywgZWlnaHQsIHRlbiwgb3IKK3NpeHRlZW4uICBZb3UgY2FuIGVuY29kZSB0aGUgYmFzZSBleHBsaWNpdGx5IGluIGFueSBudW1lcmljIGNvbnN0YW50CisoQHB4cmVme0NvbnN0YW50cywsIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHN9KS4gIElmIHlvdSB3cml0ZQorbnVtYmVycyB3aXRob3V0IGFuIGV4cGxpY2l0IGluZGljYXRpb24gb2YgdGhlIGJhc2UsIHRoZSBtb3N0IHJlY2VudAorQHNhbXB7LlJBRElYIEB2YXJ7c319IGNvbW1hbmQgZGV0ZXJtaW5lcyBob3cgdGhleSBhcmUgaW50ZXJwcmV0ZWQuCitAdmFye3N9IGlzIGEgc2luZ2xlIGxldHRlciwgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLlJBRElYIEIKK0Jhc2UgMi4KKworQGl0ZW0gLlJBRElYIFEKK0Jhc2UgOC4KKworQGl0ZW0gLlJBRElYIEQKK0Jhc2UgMTAuICBUaGlzIGlzIHRoZSBvcmlnaW5hbCBkZWZhdWx0IHJhZGl4LgorCitAaXRlbSAuUkFESVggSAorQmFzZSAxNi4KK0BlbmQgdGFibGUKKworWW91IG1heSBzcGVjaWZ5IHRoZSBhcmd1bWVudCBAdmFye3N9IGluIGxvd2VyIGNhc2UgKGFueSBvZiBAc2FtcHticWRofSkKK3dpdGggdGhlIHNhbWUgZWZmZWN0cy4KKworQGl0ZW0gLkVYUE9SVCBAdmFye25hbWV9CitAaXRlbXggLkdMT0JBTCBAdmFye25hbWV9CitAYyBGSVhNRSEgTm8gdGVzdCBjYXNlcyBpbiB0ZXN0c3VpdGUvZ2FzcAorRGVjbGFyZSBAdmFye25hbWV9IGdsb2JhbCAoZW1pdHMgQHNhbXB7Lmdsb2JhbCBAdmFye25hbWV9fSkuICBUaGUgdHdvCitkaXJlY3RpdmVzIGFyZSBzeW5vbnltb3VzLgorCitAaXRlbSAuUFJPR1JBTQorTm8gZWZmZWN0OiBAc2N7Z2FzcH0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwgYW5kIHNpbGVudGx5IGlnbm9yZXMgaXQuCisKK0BpdGVtIC5FTkQKK01hcmsgZW5kIG9mIGVhY2ggcHJlcHJvY2Vzc29yIGZpbGUuICBAc2N7Z2FzcH0gaXNzdWVzIGEgd2FybmluZyBpZiBpdAorcmVhY2hlcyBlbmQgb2YgZmlsZSB3aXRob3V0IHNlZWluZyB0aGlzIGNvbW1hbmQuCisKK0BpdGVtIC5JTkNMVURFICJAdmFye3N0cn0iCitQcmVwcm9jZXNzIHRoZSBmaWxlIG5hbWVkIGJ5IEB2YXJ7c3RyfSwgYXMgaWYgaXRzIGNvbnRlbnRzIGFwcGVhcmVkCit3aGVyZSB0aGUgQGNvZGV7LklOQ0xVREV9IGRpcmVjdGl2ZSBkb2VzLiAgQHNje2dhc3B9IGltcG9zZXMgYSBtYXhpbXVtCitsaW1pdCBvZiAzMCBzdGFja2VkIGluY2x1ZGUgZmlsZXMsIGFzIGEgc2FuaXR5IGNoZWNrLgorQGMgRklYTUUhICBXaHkgaXMgaW5jbHVkZSBkZXB0aCBub3QgYWZmZWN0ZWQgYnkgLXU/CisKK0BpdGVtIC5BTElHTiBAdmFye3NpemV9CitAYyBGSVhNRSEgV2h5IGlzIHRoaXMgbm90IHV0dGVybHkgcG9pbnRsZXNzPworRXZhbHVhdGUgdGhlIGFic29sdXRlIGV4cHJlc3Npb24gQHZhcntzaXplfSwgYW5kIGVtaXQgdGhlIGFzc2VtYmx5CitpbnN0cnVjdGlvbiBAc2FtcHsuYWxpZ24gQHZhcntzaXplfX0gdXNpbmcgdGhlIHJlc3VsdC4KK0BlbmQgZnRhYmxlCisKK0Bub2RlIFN5bnRheCBEZXRhaWxzCitAc2VjdGlvbiBEZXRhaWxzIG9mIHRoZSBHQVNQIHN5bnRheAorCitTaW5jZSBAc2N7Z2FzcH0gaXMgbWVhbnQgdG8gd29yayB3aXRoIGFzc2VtYmx5IGNvZGUsIGl0cyBzdGF0ZW1lbnQKK3N5bnRheCBoYXMgbm8gc3VycHJpc2VzIGZvciB0aGUgYXNzZW1ibHkgcHJvZ3JhbW1lci4KKworQGNpbmRleCB3aGl0ZXNwYWNlCitAZW1waHtXaGl0ZXNwYWNlfSAoYmxhbmtzIG9yIHRhYnM7IEBlbXBoe25vdH0gbmV3bGluZSkgaXMgcGFydGlhbGx5CitzaWduaWZpY2FudCwgaW4gdGhhdCBpdCBkZWxpbWl0cyB1cCB0byB0aHJlZSBmaWVsZHMgaW4gYSBsaW5lLiAgVGhlCithbW91bnQgb2Ygd2hpdGVzcGFjZSBkb2VzIG5vdCBtYXR0ZXI7IHlvdSBtYXkgbGluZSB1cCBmaWVsZHMgaW4gc2VwYXJhdGUKK2xpbmVzIGlmIHlvdSB3aXNoLCBidXQgQHNje2dhc3B9IGRvZXMgbm90IHJlcXVpcmUgdGhhdC4KKworQGNpbmRleCBmaWVsZHMgb2YgQHNje2dhc3B9IHNvdXJjZSBsaW5lCitAY2luZGV4IGxhYmVsIGZpZWxkCitUaGUgQGVtcGh7Zmlyc3QgZmllbGR9LCBhbiBvcHRpb25hbCBAZGZue2xhYmVsfSwgbXVzdCBiZSBmbHVzaCBsZWZ0IGluIGEKK2xpbmUgKHdpdGggbm8gbGVhZGluZyB3aGl0ZXNwYWNlKSBpZiBpdCBhcHBlYXJzIGF0IGFsbC4gIFlvdSBtYXkgdXNlIGEKK2NvbG9uIGFmdGVyIHRoZSBsYWJlbCBpZiB5b3Ugd2lzaDsgQHNje2dhc3B9IG5laXRoZXIgcmVxdWlyZXMgdGhlIGNvbG9uCitub3Igb2JqZWN0cyB0byBpdCAoYnV0IHdpbGwgbm90IGluY2x1ZGUgaXQgYXMgcGFydCBvZiB0aGUgbGFiZWwgbmFtZSkuCisKK0BjaW5kZXggZGlyZWN0aXZlIGZpZWxkCitUaGUgQGVtcGh7c2Vjb25kIGZpZWxkfSwgd2hpY2ggbXVzdCBhcHBlYXIgYWZ0ZXIgc29tZSB3aGl0ZXNwYWNlLAorY29udGFpbnMgYSBAc2N7Z2FzcH0gb3IgYXNzZW1ibHkgQGRmbntkaXJlY3RpdmV9LgorCitAY2luZGV4IGFyZ3VtZW50IGZpZWxkcworQW55IEBlbXBoe2Z1cnRoZXIgZmllbGRzfSBvbiBhIGxpbmUgYXJlIEBkZm57YXJndW1lbnRzfSB0byB0aGUKK2RpcmVjdGl2ZTsgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGZyb20gb25lIGFub3RoZXIgdXNpbmcgZWl0aGVyIGNvbW1hcyBvcgord2hpdGVzcGFjZS4KKworQG1lbnUKKyogTWFya2Vyczo6CisqIENvbnN0YW50czo6CisqIFN5bWJvbHM6OgorKiBFeHByZXNzaW9uczo6CisqIFN0cmluZyBCdWlsdGluczo6CitAZW5kIG1lbnUKKworQG5vZGUgTWFya2VycworQHN1YnNlY3Rpb24gU3BlY2lhbCBzeW50YWN0aWMgbWFya2VycworCitAc2N7Z2FzcH0gcmVjb2duaXplcyBhIGZldyBzcGVjaWFsIG1hcmtlcnM6IHRvIGRlbGltaXQgY29tbWVudHMsIHRvCitjb250aW51ZSBhIHN0YXRlbWVudCBvbiB0aGUgbmV4dCBsaW5lLCB0byBzZXBhcmF0ZSBzeW1ib2xzIGZyb20gb3RoZXIKK2NoYXJhY3RlcnMsIGFuZCB0byBjb3B5IHRleHQgdG8gdGhlIG91dHB1dCBsaXRlcmFsbHkuICAoT25lIG90aGVyCitzcGVjaWFsIG1hcmtlciwgQHNhbXB7XEBAfSwgd29ya3Mgb25seSB3aXRoaW4gbWFjcm8gZGVmaW5pdGlvbnM7CitAcHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uKQorCitAY2luZGV4IGNvbW1lbnRzCitUaGUgdHJhaWxpbmcgcGFydCBvZiBhbnkgQHNje2dhc3B9IHNvdXJjZSBsaW5lIG1heSBiZSBhIEBkZm57Y29tbWVudH0uCitBIGNvbW1lbnQgYmVnaW5zIHdpdGggdGhlIGZpcnN0IHVucXVvdGVkIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHshfSBieQorZGVmYXVsdCksIG9yIGFuIGVzY2FwZWQgb3IgZG91YmxlZCBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7XCF9IG9yCitAc2FtcHshIX0gYnkgZGVmYXVsdCksIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgYSBsaW5lLiAgWW91IGNhbgorc3BlY2lmeSB3aGF0IGNvbW1lbnQgY2hhcmFjdGVyIHRvIHVzZSB3aXRoIHRoZSBAc2FtcHstY30gb3B0aW9uCisoQHB4cmVme0ludm9raW5nIEdBU1AsLCBDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgVGhlIHR3byBraW5kcyBvZgorY29tbWVudCBtYXJrZXJzIGxlYWQgdG8gc2xpZ2h0bHkgZGlmZmVyZW50IHRyZWF0bWVudDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAhCitBIHNpbmdsZSwgdW4tZXNjYXBlZCBjb21tZW50IGNoYXJhY3RlciBnZW5lcmF0ZXMgYW4gYXNzZW1ibHkgY29tbWVudCBpbgordGhlIEBzY3tnYXNwfSBvdXRwdXQuICBAc2N7Z2FzcH0gZXZhbHVhdGVzIGFueSBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCisobWFjcm8gYXJndW1lbnRzLCBvciB2YXJpYWJsZXMgZGVmaW5lZCB3aXRoIEBjb2Rley5BU1NJR05BfSBvcgorQGNvZGV7LkFTU0lHTkN9KSBwcmVzZW50LiAgRm9yIGV4YW1wbGUsIGEgbWFjcm8gdGhhdCBiZWdpbnMgbGlrZSB0aGlzCisKK0BleGFtcGxlCisgICAgICAgIC5NQUNSTyAgU1VNIEZST009MCwgVE89OQorICAgICAgICAhIFxGUk9NIFxUTworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAoraXNzdWVzIGFzIHRoZSBmaXJzdCBsaW5lIG9mIG91dHB1dCBhIGNvbW1lbnQgdGhhdCByZWNvcmRzIHRoZQordmFsdWVzIHlvdSB1c2VkIHRvIGNhbGwgdGhlIG1hY3JvLgorCitAYyBjb21tZW50cywgcHJlcHJvY2Vzc29yLW9ubHkKK0BjIHByZXByb2Nlc3Nvci1vbmx5IGNvbW1lbnRzCitAYyBHQVNQLW9ubHkgY29tbWVudHMKK0BpdGVtIFwhCitAaXRlbXggISEKK0VpdGhlciBhbiBlc2NhcGVkIGNvbW1lbnQgY2hhcmFjdGVyLCBvciBhIGRvdWJsZSBjb21tZW50IGNoYXJhY3RlciwKK21hcmtzIGEgQHNje2dhc3B9IHNvdXJjZSBjb21tZW50LiAgQHNje2dhc3B9IGRvZXMgbm90IGNvcHkgc3VjaCBjb21tZW50cwordG8gdGhlIGFzc2VtYmx5IG91dHB1dC4KK0BlbmQgdGFibGUKKworQGNpbmRleCBjb250aW51YXRpb24gY2hhcmFjdGVyCitAa2luZGV4ICsKK1RvIEBlbXBoe2NvbnRpbnVlIGEgc3RhdGVtZW50fSBvbiB0aGUgbmV4dCBsaW5lIG9mIHRoZSBmaWxlLCBiZWdpbiB0aGUKK3NlY29uZCBsaW5lIHdpdGggdGhlIGNoYXJhY3RlciBAc2FtcHsrfS4KKworQGNpbmRleCBsaXRlcmFsIGNvcHkgdG8gb3V0cHV0CitAY2luZGV4IGNvcHlpbmcgbGl0ZXJhbGx5IHRvIG91dHB1dAorQGNpbmRleCBwcmVwcm9jZXNzaW5nLCBhdm9pZGluZworQGNpbmRleCBhdm9pZGluZyBwcmVwcm9jZXNzaW5nCitPY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgQHNje2dhc3B9IGZyb20gcHJlcHJvY2Vzc2luZyBzb21lCitwYXJ0aWN1bGFyIGJpdCBvZiB0ZXh0LiAgVG8gQGVtcGh7Y29weSBsaXRlcmFsbHl9IGZyb20gdGhlIEBzY3tnYXNwfQorc291cmNlIHRvIGl0cyBvdXRwdXQsIHBsYWNlIEBzYW1we1wofSBiZWZvcmUgdGhlIHN0cmluZyB0byBjb3B5LCBhbmQKK0BzYW1weyl9IGF0IHRoZSBlbmQuICBGb3IgZXhhbXBsZSwgd3JpdGUgQHNhbXB7XChcISl9IGlmIHlvdSBuZWVkIHRoZQorY2hhcmFjdGVycyBAc2FtcHtcIX0gaW4geW91ciBhc3NlbWJseSBvdXRwdXQuCisKK0BjaW5kZXggc3ltYm9sIHNlcGFyYXRvcgorQGNpbmRleCB0ZXh0LCBzZXBhcmF0aW5nIGZyb20gc3ltYm9scworQGNpbmRleCBzeW1ib2xzLCBzZXBhcmF0aW5nIGZyb20gdGV4dAorVG8gQGVtcGh7c2VwYXJhdGUgYSBwcmVwcm9jZXNzb3IgdmFyaWFibGV9IGZyb20gdGV4dCB0byBhcHBlYXIKK2ltbWVkaWF0ZWx5IGFmdGVyIGl0cyB2YWx1ZSwgd3JpdGUgYSBzaW5nbGUgcXVvdGUgKEBjb2Rleyd9KS4gIEZvcgorZXhhbXBsZSwgQHNhbXB7LlNEQVRBICJcUCcxIn0gd3JpdGVzIGEgc3RyaW5nIGJ1aWx0IGJ5IGNvbmNhdGVuYXRpbmcgdGhlCit2YWx1ZSBvZiBAY29kZXtQfSBhbmQgdGhlIGRpZ2l0IEBzYW1wezF9LiAgKFlvdSBjYW5ub3QgYWNoaWV2ZSB0aGlzIGJ5Cit3cml0aW5nIGp1c3QgQHNhbXB7XFAxfSwgc2luY2UgQHNhbXB7UDF9IGlzIGl0c2VsZiBhIHZhbGlkIG5hbWUgZm9yIGEKK3ByZXByb2Nlc3NvciB2YXJpYWJsZS4pCisKK0Bub2RlIENvbnN0YW50cworQHN1YnNlY3Rpb24gU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50cworCitUaGVyZSBhcmUgdHdvIHdheXMgb2Ygd3JpdGluZyBAZGZue3N0cmluZyBjb25zdGFudHN9IGluIEBzY3tnYXNwfTogYXMKK2xpdGVyYWwgdGV4dCwgYW5kIGJ5IG51bWVyaWMgYnl0ZSB2YWx1ZS4gIFNwZWNpZnkgYSBzdHJpbmcgbGl0ZXJhbAorYmV0d2VlbiBkb3VibGUgcXVvdGVzIChAY29kZXsiQHZhcntzdHJ9In0pLiAgU3BlY2lmeSBhbiBpbmRpdmlkdWFsCitudW1lcmljIGJ5dGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBiZXR3ZWVuIGFuZ2xlIGJyYWNrZXRzCisoQGNvZGV7PEB2YXJ7ZXhwcn0+fS4gIERpcmVjdGl2ZXMgdGhhdCBvdXRwdXQgc3RyaW5ncyBhbGxvdyB5b3UgdG8KK3NwZWNpZnkgYW55IG51bWJlciBvZiBlaXRoZXIga2luZCBvZiB2YWx1ZSwgaW4gd2hhdGV2ZXIgb3JkZXIgaXMKK2NvbnZlbmllbnQsIGFuZCBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0LiAgKEFsdGVybmF0ZSBzeW50YXggbW9kZQoraW50cm9kdWNlcyBhIG51bWJlciBvZiBhbHRlcm5hdGl2ZSBzdHJpbmcgbm90YXRpb25zOyBAcHhyZWZ7QWx0ZXJuYXRlLCwKK0FsdGVybmF0ZSBtYWNybyBzeW50YXh9LikKKworQGMgRGV0YWlscyBvZiBudW1lcmljIG5vdGF0aW9uLCBlLmcuIGJhc2UgcHJlZml4ZXMKK1lvdSBjYW4gd3JpdGUgQGRmbntudW1lcmljIGNvbnN0YW50c30gZWl0aGVyIGluIGEgc3BlY2lmaWMgYmFzZSwgb3IgaW4KK3doYXRldmVyIGJhc2UgaXMgY3VycmVudGx5IHNlbGVjdGVkIChlaXRoZXIgMTAsIG9yIHNlbGVjdGVkIGJ5IHRoZSBtb3N0CityZWNlbnQgQGNvZGV7LlJBRElYfSkuCisKK1RvIHdyaXRlIGEgbnVtYmVyIGluIGEgQGVtcGh7c3BlY2lmaWMgYmFzZX0sIHVzZSB0aGUgcGF0dGVybgorQGNvZGV7QHZhcntzfSdAdmFye2RkZH19OiBhIGJhc2Ugc3BlY2lmaWVyIGNoYXJhY3RlciBAdmFye3N9LCBmb2xsb3dlZAorYnkgYSBzaW5nbGUgcXVvdGUgZm9sbG93ZWQgYnkgZGlnaXRzIEB2YXJ7ZGRkfS4gIFRoZSBiYXNlIHNwZWNpZmllcgorY2hhcmFjdGVyIG1hdGNoZXMgdGhvc2UgeW91IGNhbiBzcGVjaWZ5IHdpdGggQGNvZGV7LlJBRElYfTogQHNhbXB7Qn0gZm9yCitiYXNlIDIsIEBzYW1we1F9IGZvciBiYXNlIDgsIEBzYW1we0R9IGZvciBiYXNlIDEwLCBhbmQgQHNhbXB7SH0gZm9yIGJhc2UKKzE2LiAgKFlvdSBjYW4gd3JpdGUgdGhpcyBjaGFyYWN0ZXIgaW4gbG93ZXIgY2FzZSBpZiB5b3UgcHJlZmVyLikKKworQGMgRklYTUUhIFdoYXQgYXJlIHJ1bGVzIGZvciByZWNvZ25pemluZyBudW1iZXIgaW4gZGVmbHQgYmFzZT8gIFdoYXRldmVyCitAYyAgICAgICAgaXMgbGVmdCBvdmVyIGFmdGVyIHBhcnNpbmcgb3RoZXIgdGhpbmdzPz8KKworQG5vZGUgU3ltYm9scworQHN1YnNlY3Rpb24gU3ltYm9scworCitAc2N7Z2FzcH0gcmVjb2duaXplcyBzeW1ib2wgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGFueSBhbHBoYWJldGljIGNoYXJhY3RlciwKK0BzYW1we199LCBvciBAc2FtcHskfSwgYW5kIGNvbnRpbnVlIHdpdGggYW55IG9mIHRoZSBzYW1lIGNoYXJhY3RlcnMgb3IKK3dpdGggZGlnaXRzLiAgTGFiZWwgbmFtZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzLgorCitAbm9kZSBFeHByZXNzaW9ucworQHN1YnNlY3Rpb24gQXJpdGhtZXRpYyBleHByZXNzaW9ucyBpbiBHQVNQCisKK0BjaW5kZXggYWJzb2x1dGUgZXhwcmVzc2lvbnMKK0BjaW5kZXggcmVsb2NhdGFibGUgZXhwcmVzc2lvbnMKK1RoZXJlIGFyZSB0d28ga2luZHMgb2YgZXhwcmVzc2lvbnMsIGRlcGVuZGluZyBvbiB0aGVpciByZXN1bHQ6CitAZGZue2Fic29sdXRlfSBleHByZXNzaW9ucywgd2hpY2ggcmVzb2x2ZSB0byBhIGNvbnN0YW50ICh0aGF0IGlzLCB0aGV5CitkbyBub3QgaW52b2x2ZSBhbnkgdmFsdWVzIHVua25vd24gdG8gQHNje2dhc3B9KSwgYW5kIEBkZm57cmVsb2NhdGFibGV9CitleHByZXNzaW9ucywgd2hpY2ggbXVzdCByZWR1Y2UgdG8gdGhlIGZvcm0KKworQGV4YW1wbGUKK0B2YXJ7YWRkc3ltfStAdmFye2NvbnN0fS1AdmFye3N1YnN5bX0KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3doZXJlIEB2YXJ7YWRkc3ltfSBhbmQgQHZhcntzdWJzeW19IGFyZSBhc3NlbWJseSBzeW1ib2xzIG9mIHVua25vd24KK3ZhbHVlLCBhbmQgQHZhcntjb25zdH0gaXMgYSBjb25zdGFudC4KKworQXJpdGhtZXRpYyBmb3IgQHNje2dhc3B9IGV4cHJlc3Npb25zIGZvbGxvd3MgdmVyeSBzaW1pbGFyIHJ1bGVzIHRvIEMuCitZb3UgY2FuIHVzZSBwYXJlbnRoZXNlcyB0byBjaGFuZ2UgcHJlY2VkZW5jZTsgb3RoZXJ3aXNlLCBhcml0aG1ldGljCitwcmltaXRpdmVzIGhhdmUgZGVjcmVhc2luZyBwcmVjZWRlbmNlIGluIHRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nCitsaXN0LgorCitAZW51bWVyYXRlCitAaXRlbQorU2luZ2xlLWFyZ3VtZW50IEBjb2Rleyt9IChpZGVudGl0eSksIEBjb2Rley19IChhcml0aG1ldGljIG9wcG9zaXRlKSwgb3IKK0Bjb2Rle359IChiaXR3aXNlIG5lZ2F0aW9uKS4gIEBlbXBoe1RoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGFic29sdXRlCitleHByZXNzaW9uLn0KKworQGl0ZW0KK0Bjb2Rleyp9IChtdWx0aXBsaWNhdGlvbikgYW5kIEBjb2Rley99IChkaXZpc2lvbikuICBAZW1waHtCb3RoIGFyZ3VtZW50cworbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9ucy59CisKK0BpdGVtCitAY29kZXsrfSAoYWRkaXRpb24pIGFuZCBAY29kZXstfSAoc3VidHJhY3Rpb24pLiAgQGVtcGh7QXQgbGVhc3Qgb25lIGFyZ3VtZW50CittdXN0IGJlIGFic29sdXRlLn0KK0BjIEZJWE1FISAgQWN0dWFsbHksIHN1YnRyYWN0aW9uIGRvZXNuJ3QgY2hlY2sgZm9yIHRoaXMuCisKK0BpdGVtCitAY29kZXsmfSAoYml0d2lzZSBhbmQpLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMgbXVzdCBiZSBhYnNvbHV0ZS59CisKK0BpdGVtCitAYyBGSVhNRSEgIEkgYWdyZWUgfiBpcyBhIGJldHRlciBub3RhdGlvbiB0aGFuIF4gZm9yIHhvciwgYnV0IGlzIHRoZQorQGMgICAgICAgICBpbXByb3ZlbWVudCB3b3J0aCBkaWZmZXJpbmcgZnJvbSBDPworQGNvZGV7fH0gKGJpdHdpc2Ugb3IpIGFuZCBAY29kZXt+fSAoYml0d2lzZSBleGNsdXNpdmUgb3I7IEBjb2Rle159IGluCitDKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzIG11c3QgYmUgYWJzb2x1dGUufQorQGVuZCBlbnVtZXJhdGUKKworQG5vZGUgU3RyaW5nIEJ1aWx0aW5zCitAc3Vic2VjdGlvbiBTdHJpbmcgcHJpbWl0aXZlcworCitZb3UgY2FuIHVzZSB0aGVzZSBwcmltaXRpdmVzIHRvIG1hbmlwdWxhdGUgc3RyaW5ncyAoaW4gdGhlIGFyZ3VtZW50CitmaWVsZCBvZiBAc2N7Z2FzcH0gc3RhdGVtZW50cyk6CisKK0BmdGFibGUgQGNvZGUKK0BpdGVtIC5MRU4oIkB2YXJ7c3RyfSIpCitDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGNvZGV7IkB2YXJ7c3RyfSJ9LCBhcyBhbiBhYnNvbHV0ZQorZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlLCBAc2FtcHsuUkVTLkIgLkxFTigic2FtcGxlIil9IHJlc2VydmVzIHNpeAorYnl0ZXMgb2YgbWVtb3J5LgorCitAaXRlbSAuSU5TVFIoIkB2YXJ7c3RyaW5nfSIsICJAdmFye3NlZ30iLCBAdmFye2l4fSkKK1NlYXJjaCBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQHZhcntzZWd9IGFmdGVyIHBvc2l0aW9uIEB2YXJ7aXh9IG9mCitAdmFye3N0cmluZ30uICBGb3IgZXhhbXBsZSwgQHNhbXB7LklOU1RSKCJBQkNERUZHIiwgIkNERSIsIDApfSBldmFsdWF0ZXMKK3RvIHRoZSBhYnNvbHV0ZSByZXN1bHQgQGNvZGV7Mn0uCisKK1RoZSByZXN1bHQgaXMgQGNvZGV7LTF9IGlmIEB2YXJ7c2VnfSBkb2VzIG5vdCBvY2N1ciBpbiBAdmFye3N0cmluZ30KK2FmdGVyIHBvc2l0aW9uIEB2YXJ7aXh9LgorCitAaXRlbSAuU1VCU1RSKCJAdmFye3N0cmluZ30iLEB2YXJ7c3RhcnR9LEB2YXJ7bGVufSkKK1RoZSBzdWJzdHJpbmcgb2YgQHZhcntzdHJpbmd9IGJlZ2lubmluZyBhdCBieXRlIG51bWJlciBAdmFye3N0YXJ0fSBhbmQKK2V4dGVuZGluZyBmb3IgQHZhcntsZW59IGJ5dGVzLgorQGVuZCBmdGFibGUKKworQG5vZGUgQWx0ZXJuYXRlCitAc2VjdGlvbiBBbHRlcm5hdGUgbWFjcm8gc3ludGF4CisKK0lmIHlvdSBzcGVjaWZ5IEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0gb24gdGhlIEBzY3tnYXNwfSBjb21tYW5kCitsaW5lLCB0aGUgcHJlcHJvY2Vzc29yIHVzZXMgc29tZXdoYXQgZGlmZmVyZW50IHN5bnRheC4gIFRoaXMgc3ludGF4IGlzCityZW1pbmlzY2VudCBvZiB0aGUgc3ludGF4IG9mIFBoYXIgTGFwIG1hY3JvIGFzc2VtYmxlciwgYnV0IGl0CitpcyBAZW1waHtub3R9IG1lYW50IHRvIGJlIGEgZnVsbCBlbXVsYXRpb24gb2YgUGhhciBMYXAgb3Igc2ltaWxhcgorYXNzZW1ibGVycy4gIEluIHBhcnRpY3VsYXIsIEBzY3tnYXNwfSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdGl2ZXMgc3VjaAorYXMgQGNvZGV7REJ9IGFuZCBAY29kZXtJUlB9LCBldmVuIGluIGFsdGVybmF0ZSBzeW50YXggbW9kZS4KKworSW4gcGFydGljdWxhciwgQHNhbXB7LWF9IChvciBAc2FtcHstLWFsdGVybmF0ZX0pIGVsaWNpdHMgdGhlc2UKK2RpZmZlcmVuY2VzOgorCitAdGFibGUgQGVtcGgKK0BpdGVtIFByZXByb2Nlc3NvciBkaXJlY3RpdmVzCitZb3UgY2FuIHVzZSBAc2N7Z2FzcH0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgd2l0aG91dCBhIGxlYWRpbmcgQHNhbXB7Ln0KK2RvdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIEBzYW1we1NEQVRBfSB3aXRoIHRoZSBzYW1lIGVmZmVjdCBhcworQHNhbXB7LlNEQVRBfS4KKworQGl0ZW0gTE9DQUwKK09uZSBhZGRpdGlvbmFsIGRpcmVjdGl2ZSwgQGNvZGV7TE9DQUx9LCBpcyBhdmFpbGFibGUuICBAeHJlZntNYWNyb3MsLAorRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30sIGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgdG8gdXNlCitAY29kZXtMT0NBTH0uCisKK0BuZWVkIDIwMDAKK0BpdGVtIFN0cmluZyBkZWxpbWl0ZXJzCitZb3UgY2FuIHdyaXRlIHN0cmluZ3MgZGVsaW1pdGVkIGluIHRoZXNlIG90aGVyIHdheXMgYmVzaWRlcworQGNvZGV7IkB2YXJ7c3RyaW5nfSJ9OgorCitAdGFibGUgQGNvZGUKK0BpdGVtICdAdmFye3N0cmluZ30nCitZb3UgY2FuIGRlbGltaXQgc3RyaW5ncyB3aXRoIHNpbmdsZS1xdW90ZSBjaGFyYXRlcnMuCisKK0BpdGVtIDxAdmFye3N0cmluZ30+CitZb3UgY2FuIGRlbGltaXQgc3RyaW5ncyB3aXRoIG1hdGNoaW5nIGFuZ2xlIGJyYWNrZXRzLgorQGVuZCB0YWJsZQorCitAaXRlbSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBlc2NhcGUKK1RvIGluY2x1ZGUgYW55IHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbGx5IGluIGEgc3RyaW5nIChldmVuIGlmIHRoZQorY2hhcmFjdGVyIHdvdWxkIG90aGVyd2lzZSBoYXZlIHNvbWUgc3BlY2lhbCBtZWFuaW5nKSwgeW91IGNhbiBwcmVmaXggdGhlCitjaGFyYWN0ZXIgd2l0aCBAc2FtcHshfSAoYW4gZXhjbGFtYXRpb24gbWFyaykuICBGb3IgZXhhbXBsZSwgeW91IGNhbgord3JpdGUgQHNhbXB7PDQuMyAhPiA1LjQhIT59IHRvIGdldCB0aGUgbGl0ZXJhbCB0ZXh0IEBzYW1wezQuMyA+IDUuNCF9LgorCitAaXRlbSBFeHByZXNzaW9uIHJlc3VsdHMgYXMgc3RyaW5ncworWW91IGNhbiB3cml0ZSBAc2FtcHslQHZhcntleHByfX0gdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gQHZhcntleHByfQorYW5kIHVzZSB0aGUgcmVzdWx0IGFzIGEgc3RyaW5nLiAgCitAZW5kIHRhYmxlCisKK0Bub2RlIEluZGV4CitAdW5udW1iZXJlZCBJbmRleAorCitAcHJpbnRpbmRleCBjcAorCitAY29udGVudHMKK0BieWUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvaDgudGV4aSBiL2dhcy9kb2MvaDgudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGYxNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2RvYy9oOC50ZXhpCkBAIC0wLDAgKzEsMjYgQEAKK0BjbGVhciBBTEwtQVJDSAorQGNsZWFyIEdFTkVSSUMKK0BjbGVhciBJTlRFUk5BTFMKK0BjbGVhciBNVUxUSS1PQkoKK0BjbGVhciBBT1VUCitAY2xlYXIgQk9VVAorQHNldCBDT0ZGCitAY2xlYXIgRUxGCitAc2V0IEhpdGFjaGktYWxsCitAc2V0IEg4LzMwMAorQHNldCBIOC81MDAKK0BzZXQgU0gKK0BjbGVhciBESUZGLVRCTC1LTFVHRQorQHNldCBJRUVFRkxPQVQKK0BjbGVhciBXMzIKK0BzZXQgVzE2CitAc2V0IFNQRUNJQUwtU1lNUworQHNldCBBUyBhcworQHNldCBHQ0MgZ2NjCitAc2V0IExEIGxkCitAc2V0IFRBUkdFVCBIOC8zMDAgYW5kIEg4LzUwMAorQHNldCBUQVJHRVQgSDgvMzAwLCBIOC81MDAsIGFuZCBIaXRhY2hpIFNICitAc2V0IE9CSi1OQU1FIENPRkYKK0BjCitAY2xlYXIgaGF2ZS1zdGFicworQHNldCBhYm5vcm1hbC1zZXBhcmF0b3IKZGlmZiAtLWdpdCBhL2dhcy9kb2MvaW50ZXJuYWxzLnRleGkgYi9nYXMvZG9jL2ludGVybmFscy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2I0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZG9jL2ludGVybmFscy50ZXhpCkBAIC0wLDAgKzEsMTU1NyBAQAorXGlucHV0IHRleGluZm8KK0BzZXRmaWxlbmFtZSBpbnRlcm5hbHMuaW5mbworQG5vZGUgVG9wCitAdG9wIEFzc2VtYmxlciBJbnRlcm5hbHMKK0ByYWlzZXNlY3Rpb25zCitAY2luZGV4IGludGVybmFscworCitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGFzc2VtYmxlci4gIEl0IGlzIGluY29tcGxldGUsIGJ1dAoraXQgbWF5IGhlbHAgYSBiaXQuCisKK1RoaXMgY2hhcHRlciB3YXMgbGFzdCBtb2RpZmllZCBvbiAkRGF0ZSQuICBJdCBpcyBub3QgdXBkYXRlZCByZWd1bGFybHksIGFuZCBpdAorbWF5IGJlIG91dCBvZiBkYXRlLgorCitAbWVudQorKiBHQVMgdmVyc2lvbnM6OiAgICAgICAgR0FTIHZlcnNpb25zCisqIERhdGEgdHlwZXM6OgkJRGF0YSB0eXBlcworKiBHQVMgcHJvY2Vzc2luZzo6ICAgICAgV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKKyogUG9ydGluZyBHQVM6OiAgICAgICAgIFBvcnRpbmcgR0FTCisqIFJlbGF4YXRpb246OiAgICAgICAgICBSZWxheGF0aW9uCisqIEJyb2tlbiB3b3Jkczo6ICAgICAgICBCcm9rZW4gd29yZHMKKyogSW50ZXJuYWwgZnVuY3Rpb25zOjogIEludGVybmFsIGZ1bmN0aW9ucworKiBUZXN0IHN1aXRlOjogICAgICAgICAgVGVzdCBzdWl0ZQorQGVuZCBtZW51CisKK0Bub2RlIEdBUyB2ZXJzaW9ucworQHNlY3Rpb24gR0FTIHZlcnNpb25zCisKK0dBUyBoYXMgYWNxdWlyZWQgbGF5ZXJzIG9mIGNvZGUgb3ZlciB0aW1lLiAgVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUKK2Eub3V0IG9iamVjdCBmaWxlIGZvcm1hdCwgd2l0aCB0aHJlZSBzZWN0aW9ucy4gIFN1cHBvcnQgZm9yIG11bHRpcGxlIHNlY3Rpb25zCitoYXMgYmVlbiBhZGRlZCBpbiB0d28gZGlmZmVyZW50IHdheXMuCisKK1RoZSBwcmVmZXJyZWQgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG9mIEdBUyBjcmVhdGVkIHdoZW4gdGhlIHN5bWJvbAorQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgZGVmaW5lZC4gIFRoZSBvdGhlciB2ZXJzaW9ucyBvZiBHQVMgYXJlIGRvY3VtZW50ZWQgZm9yCitoaXN0b3JpY2FsIHB1cnBvc2VzLCBhbmQgdG8gaGVscCBhbnlib2R5IHdobyBoYXMgdG8gZGVidWcgY29kZSB3cml0dGVuIGZvcgordGhlbS4KKworVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgdXNlZCB0byByZXByZXNlbnQgYSBzZWN0aW9uIGluIGNvZGUgd2hpY2ggbXVzdCB3b3JrCit3aXRoIGFsbCB2ZXJzaW9ucyBvZiBHQVMuCisKK0BtZW51CisqIE9yaWdpbmFsIEdBUzo6ICAgICAgICBPcmlnaW5hbCBHQVMgdmVyc2lvbgorKiBNQU5ZX1NFR01FTlRTOjogICAgICAgTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgorKiBCRkRfQVNTRU1CTEVSOjogICAgICAgQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgorQGVuZCBtZW51CisKK0Bub2RlIE9yaWdpbmFsIEdBUworQHN1YnNlY3Rpb24gT3JpZ2luYWwgR0FTCisKK1RoZSBvcmlnaW5hbCBHQVMgb25seSBzdXBwb3J0ZWQgdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aXRoIHRocmVlCitzZWN0aW9uczogQHNhbXB7LnRleHR9LCBAc2FtcHsuZGF0YX0sIGFuZCBAc2FtcHsuYnNzfS4gIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YKK0dBUyB0aGF0IGlzIGNvbXBpbGVkIGlmIG5laXRoZXIgQGNvZGV7QkZEX0FTU0VNQkxFUn0gbm9yIEBjb2Rle01BTllfU0VHTUVOVFN9CitpcyBkZWZpbmVkLiAgVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciB0aGUgbTY4ay1hb3V0IHRhcmdldCwgYW5kCitwZXJoYXBzIG90aGVycy4KKworVGhpcyB2ZXJzaW9uIG9mIEdBUyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGFueSBuZXcgZGV2ZWxvcG1lbnQuCisKK1RoZXJlIGlzIHN0aWxsIGNvZGUgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGlzIHZlcnNpb24gb2YgR0FTLCBub3RhYmx5IGluCitAZmlsZXt3cml0ZS5jfS4gIFRoZXJlIGlzIG5vIHdheSBmb3IgdGhpcyBjb2RlIHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlCitzZWN0aW9uczsgaXQgc2ltcGx5IGxvb2tzIGF0IGdsb2JhbCB2YXJpYWJsZXMgbGlrZSBAY29kZXt0ZXh0X2ZyYWdfcm9vdH0gYW5kCitAY29kZXtkYXRhX2ZyYWdfcm9vdH0uCisKK1RoZSB0eXBlIEBjb2Rle3NlZ1R9IGlzIGFuIGVudW0uCisKK0Bub2RlIE1BTllfU0VHTUVOVFMKK0BzdWJzZWN0aW9uIE1BTllfU0VHTUVOVFMgZ2FzIHZlcnNpb24KK0BjaW5kZXggTUFOWV9TRUdNRU5UUworCitUaGUgQGNvZGV7TUFOWV9TRUdNRU5UU30gdmVyc2lvbiBvZiBnYXMgaXMgb25seSB1c2VkIGZvciBDT0ZGLiAgSXQgdXNlcyB0aGUgQkZECitsaWJyYXJ5LCBidXQgaXQgd3JpdGVzIG91dCBhbGwgdGhlIGRhdGEgaXRzZWxmIHVzaW5nIEBjb2Rle2JmZF93cml0ZX0uICBUaGlzCit2ZXJzaW9uIG9mIGdhcyBzdXBwb3J0cyB1cCB0byA0MCBub3JtYWwgc2VjdGlvbnMuICBUaGUgc2VjdGlvbiBuYW1lcyBhcmUgc3RvcmVkCitpbiB0aGUgQGNvZGV7c2VnX25hbWV9IGFycmF5LiAgT3RoZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZQorQGNvZGV7c2VnbWVudF9pbmZvfSBhcnJheS4KKworVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4gIENvZGUgdGhhdCB3YW50cyB0byBleGFtaW5lIGFsbCB0aGUgc2VjdGlvbnMKK2NhbiB1c2UgYSBAY29kZXtzZWdUfSB2YXJpYWJsZSBhcyBsb29wIGluZGV4IGZyb20gQGNvZGV7U0VHX0UwfSB1cCB0byBidXQgbm90CitpbmNsdWRpbmcgQGNvZGV7U0VHX1VOS05PV059LgorCitNb3N0IG9mIHRoZSBjb2RlIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMgaXMgaW4gdGhlIGZpbGUKK0BmaWxle2NvbmZpZy9vYmotY29mZi5jfSwgaW4gdGhlIHBvcnRpb24gb2YgdGhhdCBmaWxlIHRoYXQgaXMgY29tcGlsZWQgd2hlbgorQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuCisKK1RoaXMgdmVyc2lvbiBvZiBHQVMgaXMgc3RpbGwgdXNlZCBmb3Igc2V2ZXJhbCBDT0ZGIHRhcmdldHMuCisKK0Bub2RlIEJGRF9BU1NFTUJMRVIKK0BzdWJzZWN0aW9uIEJGRF9BU1NFTUJMRVIgZ2FzIHZlcnNpb24KK0BjaW5kZXggQkZEX0FTU0VNQkxFUgorCitUaGUgcHJlZmVycmVkIHZlcnNpb24gb2YgR0FTIGlzIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uLiAgSW4gdGhpcwordmVyc2lvbiBvZiBHQVMsIHRoZSBvdXRwdXQgZmlsZSBpcyBhIG5vcm1hbCBCRkQsIGFuZCB0aGUgQkZEIHJvdXRpbmVzIGFyZSB1c2VkCit0byBnZW5lcmF0ZSB0aGUgb3V0cHV0LgorCitAY29kZXtCRkRfQVNTRU1CTEVSfSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdXNlZCBmb3IgY2VydGFpbiB0YXJnZXRzLCBpbmNsdWRpbmcKK3Rob3NlIHRoYXQgdXNlIHRoZSBFTEYsIEVDT0ZGLCBhbmQgU09NIG9iamVjdCBmaWxlIGZvcm1hdHMsIGFuZCBhbHNvIGFsbCBBbHBoYSwKK01JUFMsIFBvd2VyUEMsIGFuZCBTUEFSQyB0YXJnZXRzLiAgWW91IGNhbiBmb3JjZSB0aGUgdXNlIG9mCitAY29kZXtCRkRfQVNTRU1CTEVSfSBmb3Igb3RoZXIgdGFyZ2V0cyB3aXRoIHRoZSBjb25maWd1cmUgb3B0aW9uCitAc2FtcHstLWVuYWJsZS1iZmQtYXNzZW1ibGVyfTsgaG93ZXZlciwgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCBmb3IgbWFueQordGFyZ2V0cywgYW5kIGNhbiBub3QgYmUgYXNzdW1lZCB0byB3b3JrLgorCitAbm9kZSBEYXRhIHR5cGVzCitAc2VjdGlvbiBEYXRhIHR5cGVzCitAY2luZGV4IGludGVybmFscywgZGF0YSB0eXBlcworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgZnVuZGFtZW50YWwgR0FTIGRhdGEgdHlwZXMuCisKK0BtZW51CisqIFN5bWJvbHM6OiAgICAgICAgICAgICBUaGUgc3ltYm9sUyBzdHJ1Y3R1cmUKKyogRXhwcmVzc2lvbnM6OiAgICAgICAgIFRoZSBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKKyogRml4dXBzOjoJCVRoZSBmaXhTIHN0cnVjdHVyZQorKiBGcmFnczo6ICAgICAgICAgICAgICAgVGhlIGZyYWdTIHN0cnVjdHVyZQorQGVuZCBtZW51CisKK0Bub2RlIFN5bWJvbHMKK0BzdWJzZWN0aW9uIFN5bWJvbHMKK0BjaW5kZXggaW50ZXJuYWxzLCBzeW1ib2xzCitAY2luZGV4IHN5bWJvbHMsIGludGVybmFsCitAY2luZGV4IHN5bWJvbFMgc3RydWN0dXJlCisKK1RoZSBkZWZpbml0aW9uIGZvciBAY29kZXtzdHJ1Y3Qgc3ltYm9sfSwgYWxzbyBrbm93biBhcyBAY29kZXtzeW1ib2xTfSwgaXMKK2xvY2F0ZWQgaW4gQGZpbGV7c3RydWMtc3ltYm9sLmh9LiAgU3ltYm9sIHN0cnVjdHVyZXMgY29udGFpbiB0aGUgZm9sbG93aW5nCitmaWVsZHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gc3lfdmFsdWUKK1RoaXMgaXMgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHRoYXQgZGVzY3JpYmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSXQgbWlnaHQKK3JlZmVyIHRvIG9uZSBvciBtb3JlIG90aGVyIHN5bWJvbHM7IGlmIHNvLCBpdHMgdHJ1ZSB2YWx1ZSBtYXkgbm90IGJlIGtub3duCit1bnRpbCBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gaXMgY2FsbGVkIGluIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfS4KKworVGhlIGV4cHJlc3Npb24gaXMgb2Z0ZW4gc2ltcGx5IGEgY29uc3RhbnQuICBCZWZvcmUgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9CitpcyBjYWxsZWQsIHRoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGZyYWcgKEBweHJlZntGcmFnc30pLiAgQWZ0ZXJ3YXJkLAordGhlIGZyYWcgYWRkcmVzcyBoYXMgYmVlbiBhZGRlZCBpbi4KKworQGl0ZW0gc3lfcmVzb2x2ZWQKK1RoaXMgZmllbGQgaXMgbm9uLXplcm8gaWYgdGhlIHN5bWJvbCdzIHZhbHVlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVzb2x2ZWQuICBJdAoraXMgdXNlZCBkdXJpbmcgdGhlIGZpbmFsIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlLgorCitAaXRlbSBzeV9yZXNvbHZpbmcKK1RoaXMgZmllbGQgaXMgdXNlZCB0byBkZXRlY3QgbG9vcHMgd2hpbGUgcmVzb2x2aW5nIHRoZSBzeW1ib2wncyB2YWx1ZS4KKworQGl0ZW0gc3lfdXNlZF9pbl9yZWxvYworVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sIGlzIHVzZWQgYnkgYSByZWxvY2F0aW9uIGVudHJ5LiAgSWYgYSBsb2NhbAorc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LCBpdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHJlZGlyZWN0IHRob3NlCityZWxvY2F0aW9ucyB0byBvdGhlciBzeW1ib2xzLCBvciB0aGlzIHN5bWJvbCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbAorc3ltYm9sIGxpc3QuCisKK0BpdGVtIHN5X25leHQKK0BpdGVteCBzeV9wcmV2aW91cworVGhlc2UgcG9pbnRlcnMgdG8gb3RoZXIgQGNvZGV7c3ltYm9sU30gc3RydWN0dXJlcyBkZXNjcmliZSBhIHNpbmdseSBvciBkb3VibHkKK2xpbmtlZCBsaXN0LiAgKElmIEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzIG5vdCBkZWZpbmVkLCB0aGUKK0Bjb2Rle3N5X3ByZXZpb3VzfSBmaWVsZCB3aWxsIGJlIG9taXR0ZWQ7IEBjb2Rle1NZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlN9IGlzCithbHdheXMgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfS4pICBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGgKK3RoZSBAY29kZXtzeW1ib2xfbmV4dH0gYW5kIEBjb2Rle3N5bWJvbF9wcmV2aW91c30gbWFjcm9zLgorCitAaXRlbSBzeV9mcmFnCitUaGlzIHBvaW50cyB0byB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhhdCB0aGlzIHN5bWJvbCBpcyBhdHRhY2hlZCB0by4KKworQGl0ZW0gc3lfdXNlZAorV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgTm90ZTogTm90IGFsbCBvZgordGhlIGJhY2tlbmRzIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBhY2N1cmF0ZTsgYmFja2VuZHMgd2hpY2ggdXNlIHRoaXMgYml0IGFyZQorcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbiBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuCisKK0BpdGVtIHN5X21yaV9jb21tb24KK1doZXRoZXIgdGhlIHN5bWJvbCBpcyBhbiBNUkkgY29tbW9uIHN5bWJvbCBjcmVhdGVkIGJ5IHRoZSBAY29kZXtDT01NT059Citwc2V1ZG8tb3Agd2hlbiBhc3NlbWJsaW5nIGluIE1SSSBtb2RlLgorCitAaXRlbSBic3ltCitJZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLCB0aGlzIHBvaW50cyB0byB0aGUgQkZEIEBjb2Rle2FzeW1ib2x9IHRoYXQKK3dpbGwgYmUgdXNlZCBpbiB3cml0aW5nIHRoZSBvYmplY3QgZmlsZS4KKworQGl0ZW0gc3lfbmFtZV9vZmZzZXQKKyhPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUgcG9zaXRpb24gb2YKK3RoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcgdGFibGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgT24gc29tZSBmb3JtYXRzLAordGhpcyB3aWxsIHN0YXJ0IGF0IHBvc2l0aW9uIDQsIHdpdGggcG9zaXRpb24gMCByZXNlcnZlZCBmb3IgdW5uYW1lZCBzeW1ib2xzLgorVGhpcyBmaWVsZCBpcyBub3QgdXNlZCB1bnRpbCBAY29kZXt3cml0ZV9vYmplY3RfZmlsZX0gaXMgY2FsbGVkLgorCitAaXRlbSBzeV9zeW1ib2wKKyhPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyB0aGUKK2Zvcm1hdC1zcGVjaWZpYyBzeW1ib2wgc3RydWN0dXJlLCBhcyBpdCB3b3VsZCBiZSB3cml0dGVuIGludG8gdGhlIG9iamVjdCBmaWxlLgorCitAaXRlbSBzeV9udW1iZXIKKyhPbmx5IHVzZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgbm90IGRlZmluZWQuKSAgVGhpcyBpcyBhIDI0LWJpdCBzeW1ib2wKK251bWJlciwgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgcmVsb2NhdGlvbiB0YWJsZSBlbnRyaWVzLgorCitAaXRlbSBzeV9vYmoKK1RoaXMgZm9ybWF0LXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0uICBJZiBubyBtYWNybyBieQordGhhdCBuYW1lIGlzIGRlZmluZWQgaW4gQGZpbGV7b2JqLWZvcm1hdC5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KKworQGl0ZW0gc3lfdGMKK1RoaXMgcHJvY2Vzc29yLXNwZWNpZmljIGRhdGEgaXMgb2YgdHlwZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvCitieSB0aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXt0YXJnLWNwdS5ofSwgdGhpcyBmaWVsZCBpcyBub3QgZGVmaW5lZC4KKworQGl0ZW0gVEFSR0VUX1NZTUJPTF9GSUVMRFMKK0lmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgaXQgZGVmaW5lcyBhZGRpdGlvbmFsIGZpZWxkcyBpbiB0aGUgc3ltYm9sIHN0cnVjdHVyZS4KK1RoaXMgbWFjcm8gaXMgb2Jzb2xldGUsIGFuZCBzaG91bGQgYmUgcmVwbGFjZWQgd2hlbiBwb3NzaWJsZSBieSB1c2VzIG9mCitAY29kZXtPQkpfU1lNRklFTERfVFlQRX0gYW5kIEBjb2Rle1RDX1NZTUZJRUxEX1RZUEV9LgorQGVuZCB0YWJsZQorCitUaGVyZSBhcmUgYSBudW1iZXIgb2YgYWNjZXNzIHJvdXRpbmVzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZmllbGRzIG9mIGEKK0Bjb2Rle3N5bWJvbFN9IHN0cnVjdHVyZS4gIFdoZW4gcG9zc2libGUsIHRoZXNlIHJvdXRpbmVzIHNob3VsZCBiZSB1c2VkIHJhdGhlcgordGhhbiByZWZlcnJpbmcgdG8gdGhlIGZpZWxkcyBkaXJlY3RseS4gIFRoZXNlIHJvdXRpbmVzIHdpbGwgd29yayBmb3IgYW55IEdBUwordmVyc2lvbi4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBTX1NFVF9WQUxVRQorQGNpbmRleCBTX1NFVF9WQUxVRQorU2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4KKworQGl0ZW0gU19HRVRfVkFMVUUKK0BjaW5kZXggU19HRVRfVkFMVUUKK0dldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBUaGlzIHdpbGwgY2F1c2UgQGNvZGV7cmVzb2x2ZV9zeW1ib2xfdmFsdWV9IHRvIGJlCitjYWxsZWQgaWYgbmVjZXNzYXJ5LCBzbyBAY29kZXtTX0dFVF9WQUxVRX0gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaXQgaXMKK3NhZmUgdG8gcmVzb2x2ZSBzeW1ib2xzIChpLmUuLCBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhZCBhbmQKK2FsbCBzeW1ib2xzIGhhdmUgYmVlbiBkZWZpbmVkKS4KKworQGl0ZW0gU19TRVRfU0VHTUVOVAorQGNpbmRleCBTX1NFVF9TRUdNRU5UCitTZXQgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbC4KKworQGl0ZW0gU19HRVRfU0VHTUVOVAorQGNpbmRleCBTX0dFVF9TRUdNRU5UCitHZXQgdGhlIHN5bWJvbCdzIHNlY3Rpb24uCisKK0BpdGVtIFNfR0VUX05BTUUKK0BjaW5kZXggU19HRVRfTkFNRQorR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCisKK0BpdGVtIFNfU0VUX05BTUUKK0BjaW5kZXggU19TRVRfTkFNRQorU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuCisKK0BpdGVtIFNfSVNfRVhURVJOQUwKK0BjaW5kZXggU19JU19FWFRFUk5BTAorUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLgorCitAaXRlbSBTX0lTX0VYVEVSTgorQGNpbmRleCBTX0lTX0VYVEVSTgorQSBzeW5vbnltIGZvciBAY29kZXtTX0lTX0VYVEVSTkFMfS4gIERvbid0IHVzZSBpdC4KKworQGl0ZW0gU19JU19XRUFLCitAY2luZGV4IFNfSVNfV0VBSworUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgd2Vhay4KKworQGl0ZW0gU19JU19DT01NT04KK0BjaW5kZXggU19JU19DT01NT04KK1JldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIENvbW1vbiBzeW1ib2xzIGFyZSBzb21ldGltZXMKK3JlcHJlc2VudGVkIGFzIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggYSB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwKK25vdCBiZSByZWxpYWJsZS4KKworQGl0ZW0gU19JU19ERUZJTkVECitAY2luZGV4IFNfSVNfREVGSU5FRAorUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxpYWJsZSB3aGVuCitjYWxsZWQgb24gYSBjb21tb24gc3ltYm9sLgorCitAaXRlbSBTX0lTX0RFQlVHCitAY2luZGV4IFNfSVNfREVCVUcKK1JldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgZGVidWdnaW5nIHN5bWJvbC4KKworQGl0ZW0gU19JU19MT0NBTAorQGNpbmRleCBTX0lTX0xPQ0FMCitSZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBpcyBhIGxvY2FsIGFzc2VtYmxlciBzeW1ib2wgd2hpY2ggc2hvdWxkIG5vdCBiZQoraW5jbHVkZWQgaW4gdGhlIGZpbmFsIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb3Bwb3NpdGUgb2YKK0Bjb2Rle1NfSVNfRVhURVJOQUx9LiAgVGhlIEBzYW1wey1MfSBhc3NlbWJsZXIgb3B0aW9uIGFmZmVjdHMgdGhlIHJldHVybiB2YWx1ZQorb2YgdGhpcyBmdW5jdGlvbi4KKworQGl0ZW0gU19TRVRfRVhURVJOQUwKK0BjaW5kZXggU19TRVRfRVhURVJOQUwKK01hcmsgdGhlIHN5bWJvbCBhcyBleHRlcm5hbGx5IHZpc2libGUuCisKK0BpdGVtIFNfQ0xFQVJfRVhURVJOQUwKK0BjaW5kZXggU19DTEVBUl9FWFRFUk5BTAorTWFyayB0aGUgc3ltYm9sIGFzIG5vdCBleHRlcm5hbGx5IHZpc2libGUuCisKK0BpdGVtIFNfU0VUX1dFQUsKK0BjaW5kZXggU19TRVRfV0VBSworTWFyayB0aGUgc3ltYm9sIGFzIHdlYWsuCisKK0BpdGVtIFNfR0VUX1RZUEUKK0BpdGVtIFNfR0VUX0RFU0MKK0BpdGVtIFNfR0VUX09USEVSCitAY2luZGV4IFNfR0VUX1RZUEUKK0BjaW5kZXggU19HRVRfREVTQworQGNpbmRleCBTX0dFVF9PVEhFUgorR2V0IHRoZSBAY29kZXt0eXBlfSwgQGNvZGV7ZGVzY30sIGFuZCBAY29kZXtvdGhlcn0gZmllbGRzIG9mIHRoZSBzeW1ib2wuICBUaGVzZQorYXJlIG9ubHkgZGVmaW5lZCBmb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBmb3Igd2hpY2ggdGhleSBtYWtlIHNlbnNlIChwcmltYXJpbHkKK2Eub3V0KS4KKworQGl0ZW0gU19TRVRfVFlQRQorQGl0ZW0gU19TRVRfREVTQworQGl0ZW0gU19TRVRfT1RIRVIKK0BjaW5kZXggU19TRVRfVFlQRQorQGNpbmRleCBTX1NFVF9ERVNDCitAY2luZGV4IFNfU0VUX09USEVSCitTZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCithcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQorYS5vdXQpLgorCitAaXRlbSBTX0dFVF9TSVpFCitAY2luZGV4IFNfR0VUX1NJWkUKK0dldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgord2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgorCitAaXRlbSBTX1NFVF9TSVpFCitAY2luZGV4IFNfU0VUX1NJWkUKK1NldCB0aGUgc2l6ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvcgord2hpY2ggaXQgbWFrZXMgc2Vuc2UgKHByaW1hcmlseSBFTEYpLgorQGVuZCB0YWJsZQorCitAbm9kZSBFeHByZXNzaW9ucworQHN1YnNlY3Rpb24gRXhwcmVzc2lvbnMKK0BjaW5kZXggaW50ZXJuYWxzLCBleHByZXNzaW9ucworQGNpbmRleCBleHByZXNzaW9ucywgaW50ZXJuYWwKK0BjaW5kZXggZXhwcmVzc2lvblMgc3RydWN0dXJlCisKK0V4cHJlc3Npb25zIGFyZSBzdG9yZWQgaW4gYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZS4gIFRoZSBzdHJ1Y3R1cmUgaXMKK2RlZmluZWQgaW4gQGZpbGV7ZXhwci5ofS4KKworQGNpbmRleCBleHByZXNzaW9uCitUaGUgbWFjcm8gQGNvZGV7ZXhwcmVzc2lvbn0gd2lsbCBjcmVhdGUgYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBiYXNlZAorb24gdGhlIHRleHQgZm91bmQgYXQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9LgorCitAY2luZGV4IG1ha2VfZXhwcl9zeW1ib2wKK0BjaW5kZXggZXhwcl9zeW1ib2xfd2hlcmUKK0Egc2luZ2xlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgY2FuIHJlcHJlc2VudCBhIHNpbmdsZSBvcGVyYXRpb24uCitDb21wbGV4IGV4cHJlc3Npb25zIGFyZSBmb3JtZWQgYnkgY3JlYXRpbmcgQGRmbntleHByZXNzaW9uIHN5bWJvbHN9IGFuZAorY29tYmluaW5nIHRoZW0gaW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZXMuICBBbiBleHByZXNzaW9uIHN5bWJvbCBpcworY3JlYXRlZCBieSBjYWxsaW5nIEBjb2Rle21ha2VfZXhwcl9zeW1ib2x9LiAgQW4gZXhwcmVzc2lvbiBzeW1ib2wgc2hvdWxkCituYXR1cmFsbHkgbmV2ZXIgYXBwZWFyIGluIGEgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mCitAY29kZXtTX0lTX0xPQ0FMfSAoQHB4cmVme1N5bWJvbHN9KSByZWZsZWN0cyB0aGF0LiAgVGhlIGZ1bmN0aW9uCitAY29kZXtleHByX3N5bWJvbF93aGVyZX0gcmV0dXJucyBub24temVybyBpZiBhIHN5bWJvbCBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCwKK2FuZCBhbHNvIHJldHVybnMgdGhlIGZpbGUgYW5kIGxpbmUgZm9yIHRoZSBleHByZXNzaW9uIHdoaWNoIGNhdXNlZCBpdCB0byBiZQorY3JlYXRlZC4KKworVGhlIEBjb2Rle2V4cHJlc3Npb25TfSBzdHJ1Y3R1cmUgaGFzIHR3byBzeW1ib2wgZmllbGRzLCBhIG51bWJlciBmaWVsZCwgYW4KK29wZXJhdG9yIGZpZWxkLCBhbmQgYSBmaWVsZCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG51bWJlciBpcyB1bnNpZ25lZC4KKworVGhlIG9wZXJhdG9yIGZpZWxkIGlzIG9mIHR5cGUgQGNvZGV7b3BlcmF0b3JUfSwgYW5kIGRlc2NyaWJlcyBob3cgdG8gaW50ZXJwcmV0Cit0aGUgb3RoZXIgZmllbGRzOyBzZWUgdGhlIGRlZmluaXRpb24gaW4gQGZpbGV7ZXhwci5ofSBmb3IgdGhlIHBvc3NpYmlsaXRpZXMuCisKK0FuIEBjb2Rle29wZXJhdG9yVH0gdmFsdWUgb2YgQGNvZGV7T19iaWd9IGluZGljYXRlcyBlaXRoZXIgYSBmbG9hdGluZyBwb2ludAorbnVtYmVyLCBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcn0sIG9yCithbiBpbnRlZ2VyIHRvIGxhcmdlIHRvIHN0b3JlIGluIGFuIEBjb2Rle29mZnNldFR9IHR5cGUsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsCithcnJheSBAY29kZXtnZW5lcmljX2JpZ251bX0uICBUaGlzIHJhdGhlciBpbmZsZXhpYmxlIGFwcHJvYWNoIG1ha2VzIGl0CitpbXBvc3NpYmxlIHRvIHVzZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9yIGxhcmdlIGV4cHJlc3Npb25zIGluIGNvbXBsZXgKK2V4cHJlc3Npb25zLgorCitAbm9kZSBGaXh1cHMKK0BzdWJzZWN0aW9uIEZpeHVwcworQGNpbmRleCBpbnRlcm5hbHMsIGZpeHVwcworQGNpbmRleCBmaXh1cHMKK0BjaW5kZXggZml4UyBzdHJ1Y3R1cmUKKworQSBAZGZue2ZpeHVwfSBpcyBiYXNpY2FsbHkgYW55dGhpbmcgd2hpY2ggY2FuIG5vdCBiZSByZXNvbHZlZCBpbiB0aGUgZmlyc3QKK3Bhc3MuICBTb21ldGltZXMgYSBmaXh1cCBjYW4gYmUgcmVzb2x2ZWQgYnkgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHk7IGlmIG5vdCwKK3RoZSBmaXh1cCBiZWNvbWVzIGEgcmVsb2NhdGlvbiBlbnRyeSBpbiB0aGUgb2JqZWN0IGZpbGUuCisKK0BjaW5kZXggZml4X25ldworQGNpbmRleCBmaXhfbmV3X2V4cAorQSBmaXh1cCBpcyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBAY29kZXtmaXhfbmV3fSBvciBAY29kZXtmaXhfbmV3X2V4cH0uICBCb3RoCit0YWtlIGEgZnJhZyAoQHB4cmVme0ZyYWdzfSksIGEgcG9zaXRpb24gd2l0aGluIHRoZSBmcmFnLCBhIHNpemUsIGFuIGluZGljYXRpb24KK29mIHdoZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLCBhbmQgYSB0eXBlLiAgSW4gYSBAY29kZXtCRkRfQVNTRU1CTEVSfQorR0FTLCB0aGUgdHlwZSBpcyBub21pbmFsbHkgYSBAY29kZXtiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGV9LCBidXQgc2V2ZXJhbAordGFyZ2V0cyB1c2Ugb3RoZXIgdHlwZSBjb2RlcyB0byByZXByZXNlbnQgZml4dXBzIHRoYXQgY2FuIG5vdCBiZSBkZXNjcmliZWQgYXMKK3JlbG9jYXRpb25zLgorCitUaGUgQGNvZGV7Zml4U30gc3RydWN0dXJlIGhhcyBhIG51bWJlciBvZiBmaWVsZHMsIHNldmVyYWwgb2Ygd2hpY2ggYXJlIG9ic29sZXRlCitvciBhcmUgb25seSB1c2VkIGJ5IGEgcGFydGljdWxhciB0YXJnZXQuICBUaGUgaW1wb3J0YW50IGZpZWxkcyBhcmU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZnhfZnJhZworVGhlIGZyYWcgKEBweHJlZntGcmFnc30pIHRoaXMgZml4dXAgaXMgaW4uCisKK0BpdGVtIGZ4X3doZXJlCitUaGUgbG9jYXRpb24gd2l0aGluIHRoZSBmcmFnIHdoZXJlIHRoZSBmaXh1cCBvY2N1cnMuCisKK0BpdGVtIGZ4X2FkZHN5CitUaGUgc3ltYm9sIHRoaXMgZml4dXAgaXMgYWdhaW5zdC4gIFR5cGljYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIGFkZGVkCitpbnRvIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIG1heSBiZSBOVUxMLgorCitAaXRlbSBmeF9zdWJzeQorVGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGlzIHN1YnRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0IGNvbnRlbnRzLiAgVGhpcyBpcworbm9ybWFsbHkgTlVMTC4KKworQGl0ZW0gZnhfb2Zmc2V0CitBIG51bWJlciB3aGljaCBpcyBhZGRlZCBpbnRvIHRoZSBmaXh1cC4KKworQGl0ZW0gZnhfYWRkbnVtYmVyCitTb21lIENQVSBiYWNrZW5kcyB1c2UgdGhpcyBmaWVsZCB0byBjb252ZXkgaW5mb3JtYXRpb24gYmV0d2VlbgorQGNvZGV7bWRfYXBwbHlfZml4fSBhbmQgQGNvZGV7dGNfZ2VuX3JlbG9jfS4gIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgZG9lcworbm90IHVzZSBpdC4KKworQGl0ZW0gZnhfbmV4dAorVGhlIG5leHQgZml4dXAgaW4gdGhlIHNlY3Rpb24uCisKK0BpdGVtIGZ4X3JfdHlwZQorVGhlIHR5cGUgb2YgdGhlIGZpeHVwLiAgVGhpcyBmaWVsZCBpcyBvbmx5IGRlZmluZWQgaWYgQGNvZGV7QkZEX0FTU0VNQkxFUn0sIG9yCitpZiB0aGUgdGFyZ2V0IGRlZmluZXMgQGNvZGV7TkVFRF9GWF9SX1RZUEV9LgorCitAaXRlbSBmeF9zaXplCitUaGUgc2l6ZSBvZiB0aGUgZml4dXAuICBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBlcnJvciBjaGVja2luZy4KKworQGl0ZW0gZnhfcGNyZWwKK1doZXRoZXIgdGhlIGZpeHVwIGlzIFBDIHJlbGF0aXZlLgorCitAaXRlbSBmeF9kb25lCitOb24temVybyBpZiB0aGUgZml4dXAgaGFzIGJlZW4gYXBwbGllZCwgYW5kIG5vIHJlbG9jYXRpb24gZW50cnkgbmVlZHMgdG8gYmUKK2dlbmVyYXRlZC4KKworQGl0ZW0gZnhfZmlsZQorQGl0ZW14IGZ4X2xpbmUKK1RoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoZSBmaXh1cCB3YXMgY3JlYXRlZC4KKworQGl0ZW0gdGNfZml4X2RhdGEKK1RoaXMgaGFzIHRoZSB0eXBlIEBjb2Rle1RDX0ZJWF9UWVBFfSwgYW5kIGlzIG9ubHkgZGVmaW5lZCBpZiB0aGUgdGFyZ2V0IGRlZmluZXMKK3RoYXQgbWFjcm8uCitAZW5kIHRhYmxlCisKK0Bub2RlIEZyYWdzCitAc3Vic2VjdGlvbiBGcmFncworQGNpbmRleCBpbnRlcm5hbHMsIGZyYWdzCitAY2luZGV4IGZyYWdzCitAY2luZGV4IGZyYWdTIHN0cnVjdHVyZS4KKworVGhlIEBjb2Rle2ZyYWdTfSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBAZmlsZXthcy5ofS4gIEVhY2ggZnJhZyByZXByZXNlbnRzIGEKK3BvcnRpb24gb2YgdGhlIGZpbmFsIG9iamVjdCBmaWxlLiAgQXMgR0FTIHJlYWRzIHRoZSBzb3VyY2UgZmlsZSwgaXQgY3JlYXRlcworZnJhZ3MgdG8gaG9sZCB0aGUgZGF0YSB0aGF0IGl0IHJlYWRzLiAgQXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgdGhlIGZyYWdzIGFuZAorZml4dXBzIGFyZSBwcm9jZXNzZWQgdG8gcHJvZHVjZSB0aGUgZmluYWwgY29udGVudHMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZnJfYWRkcmVzcworVGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcuICBUaGlzIGlzIG5vdCBzZXQgdW50aWwgdGhlIGFzc2VtYmxlciByZXNjYW5zIHRoZSBsaXN0CitvZiBhbGwgZnJhZ3MgYWZ0ZXIgdGhlIGVudGlyZSBpbnB1dCBmaWxlIGlzIHBhcnNlZC4gIFRoZSBmdW5jdGlvbgorQGNvZGV7cmVsYXhfc2VnbWVudH0gZmlsbHMgaW4gdGhpcyBmaWVsZC4KKworQGl0ZW0gZnJfbmV4dAorUG9pbnRlciB0byB0aGUgbmV4dCBmcmFnIGluIHRoaXMgKHN1YilzZWN0aW9uLgorCitAaXRlbSBmcl9maXgKK0ZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gZW1pdCB0byB0aGUgb3V0cHV0IGZpbGUuICBNYXkKK2JlIHplcm8uCisKK0BpdGVtIGZyX3ZhcgorVmFyaWFibGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgbWF5IG91dHB1dCwgYWZ0ZXIgdGhlIGluaXRpYWwgQGNvZGV7ZnJfZml4fQorY2hhcmFjdGVycy4gIE1heSBiZSB6ZXJvLgorCitAaXRlbSBmcl9vZmZzZXQKK1RoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGZpZWxkIGlzIGNvbnRyb2xsZWQgYnkgQGNvZGV7ZnJfdHlwZX0uICBHZW5lcmFsbHksCitpZiBAY29kZXtmcl92YXJ9IGlzIG5vbi16ZXJvLCB0aGlzIGlzIGEgcmVwZWF0IGNvdW50OiB0aGUgQGNvZGV7ZnJfdmFyfQorY2hhcmFjdGVycyBhcmUgb3V0cHV0IEBjb2Rle2ZyX29mZnNldH0gdGltZXMuCisKK0BpdGVtIGxpbmUKK0hvbGRzIGxpbmUgbnVtYmVyIGluZm8gd2hlbiBhbiBhc3NlbWJsZXIgbGlzdGluZyB3YXMgcmVxdWVzdGVkLgorCitAaXRlbSBmcl90eXBlCitSZWxheGF0aW9uIHN0YXRlLiAgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGludGVycHJldGF0aW9uIG9mIEBjb2Rle2ZyX29mZnNldH0sCitAY29kZXtmcl9zeW1ib2x9IGFuZCB0aGUgdmFyaWFibGUtbGVuZ3RoIHRhaWwgb2YgdGhlIGZyYWcsIGFzIHdlbGwgYXMgdGhlCit0cmVhdG1lbnQgaXQgZ2V0cyBpbiB2YXJpb3VzIHBoYXNlcyBvZiBwcm9jZXNzaW5nLiAgSXQgZG9lcyBub3QgYWZmZWN0IHRoZQoraW5pdGlhbCBAY29kZXtmcl9maXh9IGNoYXJhY3RlcnM7IHRoZXkgYXJlIGFsd2F5cyBzdXBwb3NlZCB0byBiZSBvdXRwdXQKK3ZlcmJhdGltIChmaXh1cHMgYXNpZGUpLiAgU2VlIGJlbG93IGZvciBzcGVjaWZpYyB2YWx1ZXMgdGhpcyBmaWVsZCBjYW4gaGF2ZS4KKworQGl0ZW0gZnJfc3VidHlwZQorUmVsYXhhdGlvbiBzdWJzdGF0ZS4gIElmIHRoZSBtYWNybyBAY29kZXttZF9yZWxheF9mcmFnfSBpc24ndCBkZWZpbmVkLCB0aGlzIGlzCithc3N1bWVkIHRvIGJlIGFuIGluZGV4IGludG8gQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0gZm9yIHRoZSBnZW5lcmljCityZWxheGF0aW9uIGNvZGUgdG8gcHJvY2VzcyAoQHB4cmVme1JlbGF4YXRpb259KS4gIElmIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzCitkZWZpbmVkLCB0aGlzIGZpZWxkIGlzIGF2YWlsYWJsZSBmb3IgYW55IHVzZSBieSB0aGUgQ1BVLXNwZWNpZmljIGNvZGUuCisKK0BpdGVtIGZyX3N5bWJvbAorVGhpcyBub3JtYWxseSBpbmRpY2F0ZXMgdGhlIHN5bWJvbCB0byB1c2Ugd2hlbiByZWxheGluZyB0aGUgZnJhZyBhY2NvcmRpbmcgdG8KK0Bjb2Rle2ZyX3R5cGV9LgorCitAaXRlbSBmcl9vcGNvZGUKK1BvaW50cyB0byB0aGUgbG93ZXN0LWFkZHJlc3NlZCBieXRlIG9mIHRoZSBvcGNvZGUsIGZvciB1c2UgaW4gcmVsYXhhdGlvbi4KKworQGl0ZW0gdGNfZnJhZ19kYXRhCitUYXJnZXQgc3BlY2lmaWMgZnJhZ21lbnQgZGF0YSBvZiB0eXBlIFRDX0ZSQUdfVFlQRS4KK09ubHkgcHJlc2VudCBpZiBAY29kZXtUQ19GUkFHX1RZUEV9IGlzIGRlZmluZWQuCisKK0BpdGVtIGZyX2ZpbGUKK0BpdGVteCBmcl9saW5lCitUaGUgZmlsZSBhbmQgbGluZSB3aGVyZSB0aGlzIGZyYWcgd2FzIGxhc3QgbW9kaWZpZWQuCisKK0BpdGVtIGZyX2xpdGVyYWwKK0RlY2xhcmVkIGFzIGEgb25lLWNoYXJhY3RlciBhcnJheSwgdGhpcyBsYXN0IGZpZWxkIGdyb3dzIGFyYml0cmFyaWx5IGxhcmdlIHRvCitob2xkIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIGZyYWcuCitAZW5kIHRhYmxlCisKK1RoZXNlIGFyZSB0aGUgcG9zc2libGUgcmVsYXhhdGlvbiBzdGF0ZXMsIHByb3ZpZGVkIGluIHRoZSBlbnVtZXJhdGlvbiB0eXBlCitAY29kZXtyZWxheF9zdGF0ZVR9LCBhbmQgdGhlIGludGVycHJldGF0aW9ucyB0aGV5IHJlcHJlc2VudCBmb3IgdGhlIG90aGVyCitmaWVsZHM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gcnNfYWxpZ24KK0BpdGVteCByc19hbGlnbl9jb2RlCitUaGUgc3RhcnQgb2YgdGhlIGZvbGxvd2luZyBmcmFnIHNob3VsZCBiZSBhbGlnbmVkIG9uIHNvbWUgYm91bmRhcnkuICBJbiB0aGlzCitmcmFnLCBAY29kZXtmcl9vZmZzZXR9IGlzIHRoZSBsb2dhcml0aG0gKGJhc2UgMikgb2YgdGhlIGFsaWdubWVudCBpbiBieXRlcy4KKyhGb3IgZXhhbXBsZSwgaWYgYWxpZ25tZW50IG9uIGFuIDgtYnl0ZSBib3VuZGFyeSB3ZXJlIGRlc2lyZWQsIEBjb2Rle2ZyX29mZnNldH0KK3dvdWxkIGhhdmUgYSB2YWx1ZSBvZiAzLikgIFRoZSB2YXJpYWJsZSBjaGFyYWN0ZXJzIGluZGljYXRlIHRoZSBmaWxsIHBhdHRlcm4gdG8KK2JlIHVzZWQuICBUaGUgQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKK3doZW4gZG9pbmcgdGhpcyBhbGlnbm1lbnQuICBJZiBtb3JlIGJ5dGVzIGFyZSBuZWVkZWQsIHRoZSBhbGlnbm1lbnQgaXMgbm90Citkb25lLiAgQW4gQGNvZGV7ZnJfc3VidHlwZX0gdmFsdWUgb2YgMCBtZWFucyBubyBtYXhpbXVtLCB3aGljaCBpcyB0aGUgbm9ybWFsCitjYXNlLiAgVGFyZ2V0IGJhY2tlbmRzIGNhbiB1c2UgQGNvZGV7cnNfYWxpZ25fY29kZX0gdG8gaGFuZGxlIGNlcnRhaW4gdHlwZXMgb2YKK2FsaWdubWVudCBkaWZmZXJlbnRseS4KKworQGl0ZW0gcnNfYnJva2VuX3dvcmQKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYGBicm9rZW4gd29yZCcnIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgKEBweHJlZntCcm9rZW4KK3dvcmRzfSkuICBJZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIG5vdCBuZWNlc3Nhcnkgb24gdGhlIHRhcmdldCBtYWNoaW5lLAordGhpcyBlbnVtZXJhdG9yIHZhbHVlIHdpbGwgbm90IGJlIGRlZmluZWQuCisKK0BpdGVtIHJzX2NmYQorVGhpcyBzdGF0ZSBpcyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gZnJhbWUgb3B0aW1pemF0aW9ucy4gIFRoZQorQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbiBleHByZXNzaW9uIHN5bWJvbCBmb3IgdGhlIHN1YnRyYWN0aW9uIHdoaWNoIG1heSBiZQorcmVsYXhlZC4gIFRoZSBAY29kZXtmcl9vcGNvZGV9IGZpZWxkIGhvbGRzIHRoZSBmcmFnIGZvciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQKK2J5dGUuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBob2xkcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGZyYWcuICBUaGUKK0Bjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIGlzIHVzZWQgZHVyaW5nIHJlbGF4YXRpb24gdG8gaG9sZCB0aGUgY3VycmVudCBzaXplIG9mCit0aGUgZnJhZy4KKworQGl0ZW0gcnNfZmlsbAorVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgYXJlIHRvIGJlIHJlcGVhdGVkIEBjb2Rle2ZyX29mZnNldH0gdGltZXMuICBJZgorQGNvZGV7ZnJfb2Zmc2V0fSBpcyAwLCB0aGlzIGZyYWcgaGFzIGEgbGVuZ3RoIG9mIEBjb2Rle2ZyX2ZpeH0uICBNb3N0IGZyYWdzCitoYXZlIHRoaXMgdHlwZS4KKworQGl0ZW0gcnNfbGViMTI4CitUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBEV0FSRiBgYGxpdHRsZSBlbmRpYW4gYmFzZSAxMjgnJyAKK3ZhcmlhYmxlIGxlbmd0aCBudW1iZXIgZm9ybWF0LiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gaXMgYWx3YXlzIGFuIGV4cHJlc3Npb24KK3N5bWJvbCwgYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYXJlIGVtaXR0ZWQgZGlyZWN0bHkuICBUaGUgQGNvZGV7ZnJfb2Zmc2V0fQorZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBwcmV2aW91cyBzaXplIG9mIHRoZSBudW1iZXIgc28KK3RoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgZnJhZ21lbnQgY2hhbmdlZCBzaXplLgorCitAaXRlbSByc19tYWNoaW5lX2RlcGVuZGVudAorRGlzcGxhY2VtZW50IHJlbGF4YXRpb24gaXMgdG8gYmUgZG9uZSBvbiB0aGlzIGZyYWcuICBUaGUgdGFyZ2V0IGlzIGluZGljYXRlZCBieQorQGNvZGV7ZnJfc3ltYm9sfSBhbmQgQGNvZGV7ZnJfb2Zmc2V0fSwgYW5kIEBjb2Rle2ZyX3N1YnR5cGV9IGluZGljYXRlcyB0aGUKK3BhcnRpY3VsYXIgbWFjaGluZS1zcGVjaWZpYyBhZGRyZXNzaW5nIG1vZGUgZGVzaXJlZC4gIEB4cmVme1JlbGF4YXRpb259LgorCitAaXRlbSByc19vcmcKK1RoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIHB1c2hlZCBiYWNrIHRvIHNvbWUgc3BlY2lmaWMgb2Zmc2V0Cit3aXRoaW4gdGhlIHNlY3Rpb24uICAoU29tZSBhc3NlbWJsZXJzIHVzZSB0aGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgYWRkcmVzczsgR0FTCitkb2VzIG5vdCBoYW5kbGUgZmluYWwgYWJzb2x1dGUgYWRkcmVzc2VzLCBidXQgcmF0aGVyIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmtlcgorc2V0IHRoZW0uKSAgVGhlIG9mZnNldCBpcyBnaXZlbiBieSBAY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9OyBvbmUKK2NoYXJhY3RlciBmcm9tIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBpcyB1c2VkIGFzIHRoZSBmaWxsIGNoYXJhY3Rlci4KK0BlbmQgdGFibGUKKworQGNpbmRleCBmcmNoYWluUyBzdHJ1Y3R1cmUKK0EgY2hhaW4gb2YgZnJhZ3MgaXMgYnVpbHQgdXAgZm9yIGVhY2ggc3Vic2VjdGlvbi4gIFRoZSBkYXRhIHN0cnVjdHVyZQorZGVzY3JpYmluZyBhIGNoYWluIGlzIGNhbGxlZCBhIEBjb2Rle2ZyY2hhaW5TfSwgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKK2ZpZWxkczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBmcmNoX3Jvb3QKK1BvaW50cyB0byB0aGUgZmlyc3QgZnJhZyBpbiB0aGUgY2hhaW4uICBNYXkgYmUgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZnJhZ3MgaW4KK3RoaXMgY2hhaW4uCitAaXRlbSBmcmNoX2xhc3QKK1BvaW50cyB0byB0aGUgbGFzdCBmcmFnIGluIHRoZSBjaGFpbiwgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm9uZS4KK0BpdGVtIGZyY2hfbmV4dAorTmV4dCBpbiB0aGUgbGlzdCBvZiBAY29kZXtmcmNoYWluU30gc3RydWN0dXJlcy4KK0BpdGVtIGZyY2hfc2VnCitJbmRpY2F0ZXMgdGhlIHNlY3Rpb24gdGhpcyBmcmFnIGNoYWluIGJlbG9uZ3MgdG8uCitAaXRlbSBmcmNoX3N1YnNlZworU3Vic2VjdGlvbiAoc3Vic2VnbWVudCkgbnVtYmVyIG9mIHRoaXMgZnJhZyBjaGFpbi4KK0BpdGVtIGZpeF9yb290LCBmaXhfdGFpbAorKERlZmluZWQgb25seSBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkKS4gIFBvaW50IHRvIGZpcnN0IGFuZCBsYXN0CitAY29kZXtmaXhTfSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNlY3Rpb24uCitAaXRlbSBmcmNoX29ic3RhY2sKK05vdCBjdXJyZW50bHkgdXNlZC4gIEludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGZyYWcgYWxsb2NhdGlvbiBmb3IgdGhpcworc3Vic2VjdGlvbi4gIFRoaXMgc2hvdWxkIHJlZHVjZSBmcmFnIGdlbmVyYXRpb24gY2F1c2VkIGJ5IHN3aXRjaGluZyBzZWN0aW9ucy4KK0BpdGVtIGZyY2hfZnJhZ19ub3cKK1RoZSBjdXJyZW50IGZyYWcgZm9yIHRoaXMgc3Vic2VnbWVudC4KK0BlbmQgdGFibGUKKworQSBAY29kZXtmcmNoYWluU30gY29ycmVzcG9uZHMgdG8gYSBzdWJzZWN0aW9uOyBlYWNoIHNlY3Rpb24gaGFzIGEgbGlzdCBvZgorQGNvZGV7ZnJjaGFpblN9IHJlY29yZHMgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSW4gbW9zdCBjYXNlcywgb25seSBvbmUgc3Vic2VjdGlvbgorb2YgZWFjaCBzZWN0aW9uIGlzIHVzZWQsIHNvIHRoZSBsaXN0IHdpbGwgb25seSBiZSBvbmUgZWxlbWVudCBsb25nLCBidXQgYW55Citwcm9jZXNzaW5nIG9mIGZyYWcgY2hhaW5zIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggbXVsdGlwbGUgY2hhaW5zIHBlcgorc2VjdGlvbi4KKworQWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHByb2Nlc3NlZCwgYW5kIG5vIG1vcmUgZnJhZ3MgYXJlIHRvCitiZSBnZW5lcmF0ZWQsIHRoZSBmcmFnIGNoYWlucyBhcmUgam9pbmVkIGludG8gb25lIHBlciBzZWN0aW9uIGZvciBmdXJ0aGVyCitwcm9jZXNzaW5nLiAgQWZ0ZXIgdGhpcyBwb2ludCwgaXQgaXMgc2FmZSB0byBvcGVyYXRlIG9uIG9uZSBjaGFpbiBwZXIgc2VjdGlvbi4KKworVGhlIGFzc2VtYmxlciBhbHdheXMgaGFzIGEgY3VycmVudCBmcmFnLCBuYW1lZCBAY29kZXtmcmFnX25vd30uICBNb3JlIHNwYWNlIGlzCithbGxvY2F0ZWQgZm9yIHRoZSBjdXJyZW50IGZyYWcgdXNpbmcgdGhlIEBjb2Rle2ZyYWdfbW9yZX0gZnVuY3Rpb247IHRoaXMKK3JldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbW91bnQgb2YgcmVxdWVzdGVkIHNwYWNlLiAgUmVsYXhpbmcgaXMgZG9uZSB1c2luZwordmFyaWFudCBmcmFncyBhbGxvY2F0ZWQgYnkgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0KKyhAcHhyZWZ7UmVsYXhhdGlvbn0pLgorCitAbm9kZSBHQVMgcHJvY2Vzc2luZworQHNlY3Rpb24gV2hhdCBHQVMgZG9lcyB3aGVuIGl0IHJ1bnMKK0BjaW5kZXggaW50ZXJuYWxzLCBvdmVydmlldworCitUaGlzIGlzIGEgcXVpY2sgbG9vayBhdCB3aGF0IGFuIGFzc2VtYmxlciBydW4gbG9va3MgbGlrZS4KKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1RoZSBhc3NlbWJsZXIgaW5pdGlhbGl6ZXMgaXRzZWxmIGJ5IGNhbGxpbmcgdmFyaW91cyBpbml0IHJvdXRpbmVzLgorCitAaXRlbQorRm9yIGVhY2ggc291cmNlIGZpbGUsIHRoZSBAY29kZXtyZWFkX2Ffc291cmNlX2ZpbGV9IGZ1bmN0aW9uIHJlYWRzIGluIHRoZSBmaWxlCithbmQgcGFyc2VzIGl0LiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtpbnB1dF9saW5lX3BvaW50ZXJ9IHBvaW50cyB0byB0aGUKK2N1cnJlbnQgdGV4dDsgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUsIGJ1dCBub3QKK2ZhcnRoZXIuCisKK0BpdGVtCitGb3IgZWFjaCBsaW5lLCB0aGUgYXNzZW1ibGVyIHBhc3NlcyBsYWJlbHMgdG8gdGhlIEBjb2Rle2NvbG9ufSBmdW5jdGlvbiwgYW5kCitpc29sYXRlcyB0aGUgZmlyc3Qgd29yZC4gIElmIGl0IGxvb2tzIGxpa2UgYSBwc2V1ZG8tb3AsIHRoZSB3b3JkIGlzIGxvb2tlZCB1cAoraW4gdGhlIHBzZXVkby1vcCBoYXNoIHRhYmxlIEBjb2Rle3BvX2hhc2h9IGFuZCBkaXNwYXRjaGVkIHRvIGEgcHNldWRvLW9wCityb3V0aW5lLiAgT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IGRlcGVuZGVudCBAY29kZXttZF9hc3NlbWJsZX0gcm91dGluZSBpcyBjYWxsZWQKK3RvIHBhcnNlIHRoZSBpbnN0cnVjdGlvbi4KKworQGl0ZW0KK1doZW4gcHNldWRvLW9wcyBvciBpbnN0cnVjdGlvbnMgb3V0cHV0IGRhdGEsIHRoZXkgYWRkIGl0IHRvIGEgZnJhZywgY2FsbGluZworQGNvZGV7ZnJhZ19tb3JlfSB0byBnZXQgc3BhY2UgdG8gc3RvcmUgaXQgaW4uCisKK0BpdGVtCitQc2V1ZG8tb3BzIGFuZCBpbnN0cnVjdGlvbnMgY2FuIGFsc28gb3V0cHV0IGZpeHVwcyBjcmVhdGVkIGJ5IEBjb2Rle2ZpeF9uZXd9IG9yCitAY29kZXtmaXhfbmV3X2V4cH0uCisKK0BpdGVtCitGb3IgY2VydGFpbiB0YXJnZXRzLCBpbnN0cnVjdGlvbnMgY2FuIGNyZWF0ZSB2YXJpYW50IGZyYWdzIHdoaWNoIGFyZSB1c2VkIHRvCitzdG9yZSByZWxheGF0aW9uIGluZm9ybWF0aW9uIChAcHhyZWZ7UmVsYXhhdGlvbn0pLgorCitAaXRlbQorV2hlbiB0aGUgaW5wdXQgZmlsZSBpcyBmaW5pc2hlZCwgdGhlIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSByb3V0aW5lIGlzCitjYWxsZWQuICBJdCBhc3NpZ25zIGFkZHJlc3NlcyB0byBhbGwgdGhlIGZyYWdzIChAY29kZXtyZWxheF9zZWdtZW50fSksIHJlc29sdmVzCithbGwgdGhlIGZpeHVwcyAoQGNvZGV7Zml4dXBfc2VnbWVudH0pLCByZXNvbHZlcyBhbGwgdGhlIHN5bWJvbCB2YWx1ZXMgKHVzaW5nCitAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0pLCBhbmQgZmluYWxseSB3cml0ZXMgb3V0IHRoZSBmaWxlIChpbiB0aGUKK0Bjb2Rle0JGRF9BU1NFTUJMRVJ9IGNhc2UsIHRoaXMgaXMgZG9uZSBieSBzaW1wbHkgY2FsbGluZyBAY29kZXtiZmRfY2xvc2V9KS4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBQb3J0aW5nIEdBUworQHNlY3Rpb24gUG9ydGluZyBHQVMKK0BjaW5kZXggcG9ydGluZworCitFYWNoIEdBUyB0YXJnZXQgc3BlY2lmaWVzIHR3byBtYWluIHRoaW5nczogdGhlIENQVSBmaWxlIGFuZCB0aGUgb2JqZWN0IGZvcm1hdAorZmlsZS4gIFR3byBtYWluIHN3aXRjaGVzIGluIHRoZSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaGFuZGxlIHRoaXMuICBUaGUKK2ZpcnN0IHN3aXRjaGVzIG9uIENQVSB0eXBlIHRvIHNldCB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7Y3B1X3R5cGV9LiAgVGhlCitzZWNvbmQgc3dpdGNoZXMgb24gdGhlIGVudGlyZSB0YXJnZXQgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtmbXR9LgorCitUaGUgY29uZmlndXJlIHNjcmlwdCB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtjcHVfdHlwZX0gdG8gc2VsZWN0IHR3byBmaWxlcyBpbgordGhlIEBmaWxle2NvbmZpZ30gZGlyZWN0b3J5OiBAZmlsZXt0Yy1AdmFye0NQVX0uY30gYW5kIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KK1RoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctY3B1Lmh9IGluIHRoZQorYnVpbGQgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RjLUB2YXJ7Q1BVfS5ofS4KKworVGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxzbyB1c2VzIHRoZSB2YWx1ZSBvZiBAY29kZXtmbXR9IHRvIHNlbGVjdCB0d28gZmlsZXM6CitAZmlsZXtvYmotQHZhcntmbXR9LmN9IGFuZCBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LiAgVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcword2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle29iai1mb3JtYXQuaH0gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aGljaAoraW5jbHVkZXMgQGZpbGV7b2JqLUB2YXJ7Zm10fS5ofS4KKworWW91IGNhbiBhbHNvIHNldCB0aGUgZW11bGF0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGJ5IHNldHRpbmcgdGhlIEBjb2Rle2VtfQordmFyaWFibGUuICBOb3JtYWxseSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtnZW5lcmljfSBpcyBmaW5lLiAgVGhlCitjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle3RhcmctZW52Lmh9IGluIHRoZSBidWlsZAorZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIEBmaWxle3RlLUB2YXJ7ZW19Lmh9LgorCitQb3J0aW5nIEdBUyB0byBhIG5ldyBDUFUgcmVxdWlyZXMgd3JpdGluZyB0aGUgQGZpbGV7dGMtQHZhcntDUFV9fSBmaWxlcy4KK1BvcnRpbmcgR0FTIHRvIGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCByZXF1aXJlcyB3cml0aW5nIHRoZQorQGZpbGV7b2JqLUB2YXJ7Zm10fX0gZmlsZXMuICBUaGVyZSBpcyBzb21ldGltZXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZXNlCit0d28gZmlsZXMsIGJ1dCBpdCBpcyBub3JtYWxseSBtaW5pbWFsLgorCitUaGUgYmVzdCBhcHByb2FjaCBpcywgb2YgY291cnNlLCB0byBjb3B5IGV4aXN0aW5nIGZpbGVzLiAgVGhlIGRvY3VtZW50YXRpb24KK2JlbG93IGFzc3VtZXMgdGhhdCB5b3UgYXJlIGxvb2tpbmcgYXQgZXhpc3RpbmcgZmlsZXMgdG8gc2VlIHVzYWdlIGRldGFpbHMuCisKK1RoZXNlIGludGVyZmFjZXMgaGF2ZSBncm93biBvdmVyIHRpbWUsIGFuZCBoYXZlIG5ldmVyIGJlZW4gY2FyZWZ1bGx5IHRob3VnaHQKK291dCBvciBkZXNpZ25lZC4gIE5vdGhpbmcgYWJvdXQgdGhlIGludGVyZmFjZXMgZGVzY3JpYmVkIGhlcmUgaXMgY2FzdCBpbiBzdG9uZS4KK0l0IGlzIHBvc3NpYmxlIHRoYXQgdGhleSB3aWxsIGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIHRoZSBhc3NlbWJsZXIgdG8gdGhlCituZXh0LiAgQWxzbywgbmV3IG1hY3JvcyBhcmUgYWRkZWQgYWxsIHRoZSB0aW1lIGFzIHRoZXkgYXJlIG5lZWRlZC4KKworQG1lbnUKKyogQ1BVIGJhY2tlbmQ6OiAgICAgICAgICAgICAgICAgV3JpdGluZyBhIENQVSBiYWNrZW5kCisqIE9iamVjdCBmb3JtYXQgYmFja2VuZDo6ICAgICAgIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCisqIEVtdWxhdGlvbnM6OiAgICAgICAgICAgICAgICAgIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCitAZW5kIG1lbnUKKworQG5vZGUgQ1BVIGJhY2tlbmQKK0BzdWJzZWN0aW9uIFdyaXRpbmcgYSBDUFUgYmFja2VuZAorQGNpbmRleCBDUFUgYmFja2VuZAorQGNpbmRleCBAZmlsZXt0Yy1AdmFye0NQVX19CisKK1RoZSBDUFUgYmFja2VuZCBmaWxlcyBhcmUgdGhlIGhlYXJ0IG9mIHRoZSBhc3NlbWJsZXIuICBUaGV5IGFyZSB0aGUgb25seSBwYXJ0cworb2YgdGhlIGFzc2VtYmxlciB3aGljaCBhY3R1YWxseSBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlCitwcm9jZXNzb3IuCisKK1lvdSBtdXN0IGRlZmluZSBhIHJlYXNvbmFibHkgc21hbGwgbGlzdCBvZiBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgQ1BVCitiYWNrZW5kIGZpbGVzLiAgWW91IG1heSBkZWZpbmUgYSBsYXJnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBtYWNyb3MgaW4gdGhlIENQVQorYmFja2VuZCBmaWxlcywgbm90IGFsbCBvZiB3aGljaCBhcmUgZG9jdW1lbnRlZCBoZXJlLiAgWW91IG11c3QsIG9mIGNvdXJzZSwKK2RlZmluZSBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCB3aGljaCBpcyBpbmNsdWRlZCBieSBldmVyeSBhc3NlbWJsZXIKK3NvdXJjZSBmaWxlLiAgWW91IG1heSBkZWZpbmUgdGhlIGZ1bmN0aW9ucyBhcyBtYWNyb3MgaW4gdGhlIEBmaWxley5ofSBmaWxlLCBvcgorYXMgZnVuY3Rpb25zIGluIHRoZSBAZmlsZXsuY30gZmlsZS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBUQ19AdmFye0NQVX0KK0BjaW5kZXggVENfQHZhcntDUFV9CitCeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgorZXhhbXBsZSwgQGZpbGV7dGMtbTY4ay5ofSBkZWZpbmVzIEBjb2Rle1RDX002OEt9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKK2lmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgQ1BVIHNwZWNpZmljIGNvZGUgdG8gdGhlIG9iamVjdCBmb3JtYXQgZmlsZS4KKworQGl0ZW0gVEFSR0VUX0ZPUk1BVAorVGhpcyBtYWNybyBpcyB0aGUgQkZEIHRhcmdldCBuYW1lIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKK3dpbGwgbm9ybWFsbHkgZGVwZW5kIHVwb24gdGhlIEBjb2Rle09CSl9AdmFye0ZNVH19IG1hY3JvLgorCitAaXRlbSBUQVJHRVRfQVJDSAorVGhpcyBtYWNybyBpcyB0aGUgQkZEIGFyY2hpdGVjdHVyZSB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4KKworQGl0ZW0gVEFSR0VUX01BQ0gKK1RoaXMgbWFjcm8gaXMgdGhlIEJGRCBtYWNoaW5lIG51bWJlciB0byBwYXNzIHRvIEBjb2Rle2JmZF9zZXRfYXJjaF9tYWNofS4gIElmCitpdCBpcyBub3QgZGVmaW5lZCwgR0FTIHdpbGwgdXNlIDAuCisKK0BpdGVtIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCitZb3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIHRvIGJlIG5vbi16ZXJvIGlmIHRoZSB0YXJnZXQgaXMgYmlnIGVuZGlhbiwgYW5kCit6ZXJvIGlmIHRoZSB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbi4KKworQGl0ZW0gbWRfc2hvcnRvcHRzCitAaXRlbXggbWRfbG9uZ29wdHMKK0BpdGVteCBtZF9sb25nb3B0c19zaXplCitAaXRlbXggbWRfcGFyc2Vfb3B0aW9uCitAaXRlbXggbWRfc2hvd191c2FnZQorQGNpbmRleCBtZF9zaG9ydG9wdHMKK0BjaW5kZXggbWRfbG9uZ29wdHMKK0BjaW5kZXggbWRfbG9uZ29wdHNfc2l6ZQorQGNpbmRleCBtZF9wYXJzZV9vcHRpb24KK0BjaW5kZXggbWRfc2hvd191c2FnZQorR0FTIHVzZXMgdGhlc2UgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZHVyaW5nIG9wdGlvbiBwcm9jZXNzaW5nLgorQGNvZGV7bWRfc2hvcnRvcHRzfSBpcyBhIEBjb2Rle2NvbnN0IGNoYXIgKn0gd2hpY2ggR0FTIGFkZHMgdG8gdGhlIG1hY2hpbmUKK2luZGVwZW5kZW50IHN0cmluZyBwYXNzZWQgdG8gQGNvZGV7Z2V0b3B0fS4gIEBjb2Rle21kX2xvbmdvcHRzfSBpcyBhCitAY29kZXtzdHJ1Y3Qgb3B0aW9uIFtdfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBsb25nIG9wdGlvbnMKK3Bhc3NlZCB0byBAY29kZXtnZXRvcHR9OyB5b3UgbWF5IHVzZSBAY29kZXtPUFRJT05fTURfQkFTRX0sIGRlZmluZWQgaW4KK0BmaWxle2FzLmh9LCBhcyB0aGUgc3RhcnQgb2YgYSBzZXQgb2YgbG9uZyBvcHRpb24gaW5kaWNlcywgaWYgbmVjZXNzYXJ5LgorQGNvZGV7bWRfbG9uZ29wdHNfc2l6ZX0gaXMgYSBAY29kZXtzaXplX3R9IGhvbGRpbmcgdGhlIHNpemUgQGNvZGV7bWRfbG9uZ29wdHN9LgorR0FTIHdpbGwgY2FsbCBAY29kZXttZF9wYXJzZV9vcHRpb259IHdoZW5ldmVyIEBjb2Rle2dldG9wdH0gcmV0dXJucyBhbgordW5yZWNvZ25pemVkIGNvZGUsIHByZXN1bWFibHkgaW5kaWNhdGluZyBhIHNwZWNpYWwgY29kZSB2YWx1ZSB3aGljaCBhcHBlYXJzIGluCitAY29kZXttZF9sb25nb3B0c30uICBHQVMgd2lsbCBjYWxsIEBjb2Rle21kX3Nob3dfdXNhZ2V9IHdoZW4gYSB1c2FnZSBtZXNzYWdlIGlzCitwcmludGVkOyBpdCBzaG91bGQgcHJpbnQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zLgorCitAaXRlbSBtZF9iZWdpbgorQGNpbmRleCBtZF9iZWdpbgorR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgYXNzZW1ibHksIGFmdGVyIHRoZSBjb21tYW5kCitsaW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb25zCitoYXZlIGJlZW4gY29tcGxldGVkLgorCitAaXRlbSBtZF9jbGVhbnVwCitAY2luZGV4IG1kX2NsZWFudXAKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIGVhY2ggaW5wdXQgZmlsZS4KKworQGl0ZW0gbWRfYXNzZW1ibGUKK0BjaW5kZXggbWRfYXNzZW1ibGUKK0dBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBpbnB1dCBsaW5lIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYQorcHNldWRvLW9wLiAgVGhlIGFyZ3VtZW50IGlzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSBmdW5jdGlvbiBzaG91bGQKK2Fzc2VtYmxlIHRoZSBzdHJpbmcgYXMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBvcGVyYW5kcy4gIE5vcm1hbGx5CitAY29kZXttZF9hc3NlbWJsZX0gd2lsbCBkbyB0aGlzIGJ5IGNhbGxpbmcgQGNvZGV7ZnJhZ19tb3JlfSBhbmQgd3JpdGluZyBvdXQKK3NvbWUgYnl0ZXMgKEBweHJlZntGcmFnc30pLiAgQGNvZGV7bWRfYXNzZW1ibGV9IHdpbGwgY2FsbCBAY29kZXtmaXhfbmV3fSB0bworY3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQgKEBweHJlZntGaXh1cHN9KS4gIFRhcmdldHMgd2hpY2ggbmVlZCB0byBkbyBzcGVjaWFsCitwdXJwb3NlIHJlbGF4YXRpb24gd2lsbCBjYWxsIEBjb2Rle2ZyYWdfdmFyfS4KKworQGl0ZW0gbWRfcHNldWRvX3RhYmxlCitAY2luZGV4IG1kX3BzZXVkb190YWJsZQorVGhpcyBpcyBhIGNvbnN0IGFycmF5IG9mIHR5cGUgQGNvZGV7cHNldWRvX3R5cGVTfS4gIEl0IGlzIGEgbWFwcGluZyBmcm9tCitwc2V1ZG8tb3AgbmFtZXMgdG8gZnVuY3Rpb25zLiAgWW91IHNob3VsZCB1c2UgdGhpcyB0YWJsZSB0byBpbXBsZW1lbnQKK3BzZXVkby1vcHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBDUFUuCisKK0BpdGVtIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCitAY2luZGV4IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCitJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIGNhbGwgaXQgd2l0aCBhIEBjb2Rle3BzZXVkb190eXBlU30gYXJndW1lbnQuCitJdCBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBwc2V1ZG8tb3AgaXMgYSBjb25kaXRpb25hbCB3aGljaCBjb250cm9scword2hldGhlciBjb2RlIGlzIGFzc2VtYmxlZCwgc3VjaCBhcyBAc2FtcHsuaWZ9LiAgR0FTIGtub3dzIGFib3V0IHRoZSBub3JtYWwKK2NvbmRpdGlvbmFsIHBzZXVkby1vcHMsYW5kIHlvdSBzaG91bGQgbm9ybWFsbHkgbm90IGhhdmUgdG8gZGVmaW5lIHRoaXMgbWFjcm8uCisKK0BpdGVtIGNvbW1lbnRfY2hhcnMKK0BjaW5kZXggY29tbWVudF9jaGFycworVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEKK2NvbW1lbnQuCisKK0BpdGVtIHRjX2NvbW1lbnRfY2hhcnMKK0BjaW5kZXggdGNfY29tbWVudF9jaGFycworSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiBAY29kZXtjb21tZW50X2NoYXJzfS4KKworQGl0ZW0gdGNfc3ltYm9sX2NoYXJzCitAY2luZGV4IHRjX3N5bWJvbF9jaGFycworSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgbGlzdCBvZgorY2hhcmFjdGVycyB3aGljaCBtYXkgYXBwZWFyIGluIGFuIG9wZXJhbmQuICBHQVMgYWxyZWFkeSBhc3N1bWVzIHRoYXQgYWxsCithbHBoYW51bWJlcmljIGNoYXJhY3RlcnMsIGFuZCBAc2FtcHskfSwgQHNhbXB7Ln0sIGFuZCBAc2FtcHtffSBtYXkgYXBwZWFyIGluIGFuCitvcGVyYW5kIChzZWUgQHNhbXB7c3ltYm9sX2NoYXJzfSBpbiBAZmlsZXthcHAuY30pLiAgVGhpcyBtYWNybyBtYXkgYmUgZGVmaW5lZAordG8gdHJlYXQgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFzIGFwcGVhcmluZyBpbiBhbiBvcGVyYW5kLiAgVGhpcyBhZmZlY3RzIHRoZQord2F5IGluIHdoaWNoIEdBUyByZW1vdmVzIHdoaXRlc3BhY2UgYmVmb3JlIHBhc3NpbmcgdGhlIHN0cmluZyB0bworQHNhbXB7bWRfYXNzZW1ibGV9LgorCitAaXRlbSBsaW5lX2NvbW1lbnRfY2hhcnMKK0BjaW5kZXggbGluZV9jb21tZW50X2NoYXJzCitUaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQorY29tbWVudCB3aGVuIHRoZXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKK0BpdGVtIGxpbmVfc2VwYXJhdG9yX2NoYXJzCitAY2luZGV4IGxpbmVfc2VwYXJhdG9yX2NoYXJzCitUaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc2VwYXJhdGUKK2xpbmVzIChzZW1pY29sb24gYW5kIG5ld2xpbmUgYXJlIHN1Y2ggY2hhcmFjdGVycyBieSBkZWZhdWx0LCBhbmQgbmVlZCBub3QgYmUKK2xpc3RlZCBpbiB0aGlzIGFycmF5KS4KKworQGl0ZW0gRVhQX0NIQVJTCitAY2luZGV4IEVYUF9DSEFSUworVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZQordXNlZCBhcyB0aGUgZXhwb25lbnQgY2hhcmFjdGVyIGluIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgVGhpcyBpcyBub3JtYWxseQorQGNvZGV7ImVFIn0uCisKK0BpdGVtIEZMVF9DSEFSUworQGNpbmRleCBGTFRfQ0hBUlMKK1RoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBtYXkgYmUKK3VzZWQgdG8gaW5kaWNhdGUgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gIEEgemVybyBmb2xsb3dlZCBieSBvbmUgb2YgdGhlc2UKK2NoYXJhY3RlcnMgaXMgYXNzdW1lZCB0byBiZSBmb2xsb3dlZCBieSBhIGZsb2F0aW5nIHBvaW50IG51bWJlcjsgdGh1cyB0aGV5CitvcGVyYXRlIHRoZSB3YXkgdGhhdCBAY29kZXsweH0gaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50LgorVXN1YWxseSB0aGlzIGluY2x1ZGVzIEBzYW1we3J9IGFuZCBAc2FtcHtmfS4KKworQGl0ZW0gTEVYX0FUCitAY2luZGV4IExFWF9BVAorWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jke0B9fSBjaGFyYWN0ZXIuICBUaGUKK2RlZmF1bHQgaXMgemVyby4KKworTGV4aWNhbCB0eXBlcyBhcmUgYSBjb21iaW5hdGlvbiBvZiBAY29kZXtMRVhfTkFNRX0gYW5kIEBjb2Rle0xFWF9CRUdJTl9OQU1FfSwKK2JvdGggZGVmaW5lZCBpbiBAZmlsZXtyZWFkLmh9LiAgQGNvZGV7TEVYX05BTUV9IGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXIKK21heSBhcHBlYXIgaW4gYSBuYW1lLiAgQGNvZGV7TEVYX0JFR0lOX05BTUV9IGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXIgbWF5CithcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5lbS4KKworQGl0ZW0gTEVYX0JSCitAY2luZGV4IExFWF9CUgorWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBicmFjZSBjaGFyYWN0ZXJzIEBrYmR7QHt9LAorQGtiZHtAfX0sIEBrYmR7W30sIGFuZCBAa2Jke119LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgemVyby4KKworQGl0ZW0gTEVYX1BDVAorQGNpbmRleCBMRVhfUENUCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7JX0gY2hhcmFjdGVyLiAgVGhlCitkZWZhdWx0IHZhbHVlIGlzIHplcm8uCisKK0BpdGVtIExFWF9RTQorQGNpbmRleCBMRVhfUU0KK1lvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHs/fSBjaGFyYWN0ZXIuICBUaGUKK2RlZmF1bHQgdmFsdWUgaXQgemVyby4KKworQGl0ZW0gTEVYX0RPTExBUgorQGNpbmRleCBMRVhfRE9MTEFSCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7JH0gY2hhcmFjdGVyLiAgVGhlCitkZWZhdWx0IHZhbHVlIGlzIEBjb2Rle0xFWF9OQU1FIHwgTEVYX0JFR0lOX05BTUV9LgorCitAaXRlbSBTSU5HTEVfUVVPVEVfU1RSSU5HUworQGNpbmRleCBTSU5HTEVfUVVPVEVfU1RSSU5HUworSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCB0cmVhdCBzaW5nbGUgcXVvdGVzIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgorTm9ybWFsbHkgb25seSBkb3VibGUgcXVvdGVzIGFyZSBhY2NlcHRlZCBhcyBzdHJpbmcgZGVsaW1pdGVycy4KKworQGl0ZW0gTk9fU1RSSU5HX0VTQ0FQRVMKK0BjaW5kZXggTk9fU1RSSU5HX0VTQ0FQRVMKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgbm90IHBlcm1pdCBlc2NhcGUgc2VxdWVuY2VzIGluIGEgc3RyaW5nLgorCitAaXRlbSBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKK0BjaW5kZXggT05MWV9TVEFOREFSRF9FU0NBUEVTCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHdhcm4gYWJvdXQgdGhlIHVzZSBvZiBub25zdGFuZGFyZCBlc2NhcGUKK3NlcXVlbmNlcyBpbiBhIHN0cmluZy4KKworQGl0ZW0gbWRfc3RhcnRfbGluZV9ob29rCitAY2luZGV4IG1kX3N0YXJ0X2xpbmVfaG9vaworSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCisKK0BpdGVtIExBQkVMU19XSVRIT1VUX0NPTE9OUworQGNpbmRleCBMQUJFTFNfV0lUSE9VVF9DT0xPTlMKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgYXNzdW1lIHRoYXQgYW55IHRleHQgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZQoraXMgYSBsYWJlbCwgZXZlbiBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgY29sb24uCisKK0BpdGVtIFRDX1NUQVJUX0xBQkVMCitAY2luZGV4IFRDX1NUQVJUX0xBQkVMCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGNvbnRyb2wgd2hhdCBHQVMgY29uc2lkZXJzIHRvIGJlIGEgbGFiZWwuICBUaGUKK2RlZmF1bHQgZGVmaW5pdGlvbiBpcyB0byBhY2NlcHQgYW55IG5hbWUgZm9sbG93ZWQgYnkgYSBjb2xvbiBjaGFyYWN0ZXIuCisKK0BpdGVtIE5PX1BTRVVET19ET1QKK0BjaW5kZXggTk9fUFNFVURPX0RPVAorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBub3QgcmVxdWlyZSBwc2V1ZG8tb3BzIHRvIHN0YXJ0IHdpdGggYQorQGtiZHsufSBjaGFyYWN0ZXIuCisKK0BpdGVtIFRDX0VRVUFMX0lOX0lOU04KK0BjaW5kZXggVENfRVFVQUxfSU5fSU5TTgorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIG5vbnplcm8gaWYgdGhlIGluc3RydWN0aW9uIGlzCitwZXJtaXR0ZWQgdG8gY29udGFpbiBhbiBAa2Jkez19IGNoYXJhY3Rlci4gIEdBUyB3aWxsIHVzZSB0aGlzIHRvIGRlY2lkZSBpZiBhCitAa2Jkez19IGlzIGFuIGFzc2lnbm1lbnQgb3IgYW4gaW5zdHJ1Y3Rpb24uCisKK0BpdGVtIFRDX0VPTF9JTl9JTlNOCitAY2luZGV4IFRDX0VPTF9JTl9JTlNOCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gbm9uemVybyBpZiB0aGUgY3VycmVudCBpbnB1dCBsaW5lCitwb2ludGVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSBlbmQgb2YgYSBsaW5lLgorCitAaXRlbSBtZF9wYXJzZV9uYW1lCitAY2luZGV4IG1kX3BhcnNlX25hbWUKK0lmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCBpdCBmb3IgYW55IHN5bWJvbCBmb3VuZCBpbiBhbgorZXhwcmVzc2lvbi4gIFlvdSBjYW4gZGVmaW5lIHRoaXMgdG8gaGFuZGxlIHNwZWNpYWwgc3ltYm9scyBpbiBhIHNwZWNpYWwgd2F5LgorSWYgYSBzeW1ib2wgYWx3YXlzIGhhcyBhIGNlcnRhaW4gdmFsdWUsIHlvdSBzaG91bGQgbm9ybWFsbHkgZW50ZXIgaXQgaW4gdGhlCitzeW1ib2wgdGFibGUsIHBlcmhhcHMgdXNpbmcgQGNvZGV7cmVnX3NlY3Rpb259LgorCitAaXRlbSBtZF91bmRlZmluZWRfc3ltYm9sCitAY2luZGV4IG1kX3VuZGVmaW5lZF9zeW1ib2wKK0dBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgc3ltYm9sIHRhYmxlIGxvb2t1cCBmYWlscywgYmVmb3JlIGl0CitjcmVhdGVzIGEgbmV3IHN5bWJvbC4gIFR5cGljYWxseSB0aGlzIHdvdWxkIGJlIHVzZWQgdG8gc3VwcGx5IHN5bWJvbHMgd2hvc2UKK25hbWUgb3IgdmFsdWUgY2hhbmdlcyBkeW5hbWljYWxseSwgcG9zc2libHkgaW4gYSBjb250ZXh0IHNlbnNpdGl2ZSB3YXkuCitQcmVkZWZpbmVkIHN5bWJvbHMgd2l0aCBmaXhlZCB2YWx1ZXMsIHN1Y2ggYXMgcmVnaXN0ZXIgbmFtZXMgb3IgY29uZGl0aW9uCitjb2RlcywgYXJlIHR5cGljYWxseSBlbnRlcmVkIGRpcmVjdGx5IGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aGVuIEBjb2Rle21kX2JlZ2lufQoraXMgY2FsbGVkLgorCitAaXRlbSBtZF9vcGVyYW5kCitAY2luZGV4IG1kX29wZXJhbmQKK0dBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYW55IGV4cHJlc3Npb24gdGhhdCBjYW4gbm90IGJlIHJlY29nbml6ZWQuCitXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0gd2lsbCBwb2ludCB0byB0aGUgc3RhcnQKK29mIHRoZSBleHByZXNzaW9uLgorCitAaXRlbSB0Y191bnJlY29nbml6ZWRfbGluZQorQGNpbmRleCB0Y191bnJlY29nbml6ZWRfbGluZQorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IHdoZW4gaXQgZmluZHMgYSBsaW5lIHRoYXQgaXQgY2FuIG5vdAorcGFyc2UuCisKK0BpdGVtIG1kX2RvX2FsaWduCitAY2luZGV4IG1kX2RvX2FsaWduCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGhhbmRsZSBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLiAgR0FTIHdpbGwgY2FsbCBpdAord2hlbiB0aGUgZGlyZWN0aXZlIGlzIHNlZW4gaW4gdGhlIGlucHV0IGZpbGUuICBGb3IgZXhhbXBsZSwgdGhlIGkzODYgYmFja2VuZAordXNlcyB0aGlzIHRvIGdlbmVyYXRlIGVmZmljaWVudCBub3AgaW5zdHJ1Y3Rpb25zIG9mIHZhcnlpbmcgbGVuZ3RocywgZGVwZW5kaW5nCit1cG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgYWxpZ25tZW50IHdpbGwgc2tpcC4KKworQGl0ZW0gSEFORExFX0FMSUdOCitAY2luZGV4IEhBTkRMRV9BTElHTgorWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBkbyBzcGVjaWFsIGhhbmRsaW5nIGZvciBhbiBhbGlnbm1lbnQgZGlyZWN0aXZlLgorR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4KKworQGl0ZW0gbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKK0BjaW5kZXggbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgaXQgc2tpcHMgYW55IHNwYWNlIGJlY2F1c2Ugb2YgYQorc3BhY2UgZmlsbGluZyBvciBhbGlnbm1lbnQgb3IgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KKworQGl0ZW0gVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCitAY2luZGV4IFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgorWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBwYXJzZSBhbiBleHByZXNzaW9uIHVzZWQgaW4gYSBkYXRhIGFsbG9jYXRpb24KK3BzZXVkby1vcCBzdWNoIGFzIEBjb2Rley53b3JkfS4gIFlvdSBjYW4gdXNlIHRoaXMgdG8gcmVjb2duaXplIHJlbG9jYXRpb24KK2RpcmVjdGl2ZXMgdGhhdCBtYXkgYXBwZWFyIGluIHN1Y2ggZGlyZWN0aXZlcy4KKworQGl0ZW0gQklURklFTERfQ09OU19FWFBSRVNTSU9OCitAY2luZGV4IEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTgorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCByZWNvZ25pemUgYml0ZmllbGQgaW5zdHJ1Y3Rpb25zIGluIGRhdGEKK2FsbG9jYXRpb24gcHNldWRvLW9wcywgYXMgdXNlZCBvbiB0aGUgaTk2MC4KKworQGl0ZW0gUkVQRUFUX0NPTlNfRVhQUkVTU0lPTgorQGNpbmRleCBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSByZXBlYXQgY291bnRzIGluIGRhdGEgYWxsb2NhdGlvbgorcHNldWRvLW9wcywgYXMgdXNlZCBvbiB0aGUgTUlQUy4KKworQGl0ZW0gbWRfY29uc19hbGlnbgorQGNpbmRleCBtZF9jb25zX2FsaWduCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIGFueSBzcGVjaWFsIGFsaWdubWVudCBiZWZvcmUgYSBkYXRhIGFsbG9jYXRpb24KK3BzZXVkby1vcC4KKworQGl0ZW0gVENfQ09OU19GSVhfTkVXCitAY2luZGV4IFRDX0NPTlNfRklYX05FVworWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciBhIGRhdGEgYWxsb2NhdGlvbiBwc2V1ZG8tb3AuCisKK0BpdGVtIFRDX0lOSVRfRklYX0RBVEEgKEB2YXJ7Zml4cH0pCitAY2luZGV4IFRDX0lOSVRfRklYX0RBVEEKK0EgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmaXh1cCBAdmFye2ZpeHB9LgorVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZJWF9UWVBFfSBtYWNyby4KKworQGl0ZW0gVENfRklYX0RBVEFfUFJJTlQgKEB2YXJ7c3RyZWFtfSwgQHZhcntmaXhwfSkKK0BjaW5kZXggVENfRklYX0RBVEFfUFJJTlQKK0EgQyBzdGF0ZW1lbnQgdG8gb3V0cHV0IHRhcmdldCBzcGVjaWZpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yCitmaXh1cCBAdmFye2ZpeHB9IHRvIEB2YXJ7c3RyZWFtfS4gIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJ5IEBjb2Rle3ByaW50X2ZpeHVwfS4KKworQGl0ZW0gVENfRlJBR19JTklUIChAdmFye2ZyYWdwfSkKK0BjaW5kZXggVENfRlJBR19JTklUCitBIEMgc3RhdGVtZW50IHRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBzcGVjaWZpYyBmaWVsZHMgb2YgZnJhZyBAdmFye2ZyYWdwfS4KK1RoZXNlIGZpZWxkcyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBAY29kZXtUQ19GUkFHX1RZUEV9IG1hY3JvLgorCitAaXRlbSBtZF9udW1iZXJfdG9fY2hhcnMKK0BjaW5kZXggbWRfbnVtYmVyX3RvX2NoYXJzCitUaGlzIHNob3VsZCBqdXN0IGNhbGwgZWl0aGVyIEBjb2Rle251bWJlcl90b19jaGFyc19iaWdlbmRpYW59IG9yCitAY29kZXtudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFufSwgd2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlLiAgT24gdGFyZ2V0cyBsaWtlCit0aGUgTUlQUyB3aGljaCBzdXBwb3J0IG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBlbmRpYW5uZXNzLCB3aGljaCBmdW5jdGlvbiB0byBjYWxsCitpcyBhIHJ1bnRpbWUgZGVjaXNpb24uICBPbiBvdGhlciB0YXJnZXRzLCBAY29kZXttZF9udW1iZXJfdG9fY2hhcnN9IGNhbiBiZSBhCitzaW1wbGUgbWFjcm8uCisKK0BpdGVtIG1kX3JlbG9jX3NpemUKK0BjaW5kZXggbWRfcmVsb2Nfc2l6ZQorVGhpcyB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgZ2FzIChub3QKK0Bjb2Rle0JGRF9BU1NFTUJMRVJ9IGFuZCBub3QgQGNvZGV7TUFOWV9TRUdNRU5UU30pLiAgSXQgaG9sZHMgdGhlIHNpemUgb2YgYQorcmVsb2NhdGlvbiBlbnRyeS4KKworQGl0ZW0gV09SS0lOR19ET1RfV09SRAorQGl0ZW14IG1kX3Nob3J0X2p1bXBfc2l6ZQorQGl0ZW14IG1kX2xvbmdfanVtcF9zaXplCitAaXRlbXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKK0BpdGVteCBtZF9jcmVhdGVfbG9uZ19qdW1wCitAY2luZGV4IFdPUktJTkdfRE9UX1dPUkQKK0BjaW5kZXggbWRfc2hvcnRfanVtcF9zaXplCitAY2luZGV4IG1kX2xvbmdfanVtcF9zaXplCitAY2luZGV4IG1kX2NyZWF0ZV9zaG9ydF9qdW1wCitAY2luZGV4IG1kX2NyZWF0ZV9sb25nX2p1bXAKK0lmIEBjb2Rle1dPUktJTkdfRE9UX1dPUkR9IGlzIGRlZmluZWQsIEdBUyB3aWxsIG5vdCBkbyBicm9rZW4gd29yZCBwcm9jZXNzaW5nCisoQHB4cmVme0Jyb2tlbiB3b3Jkc30pLiAgT3RoZXJ3aXNlLCB5b3Ugc2hvdWxkIHNldCBAY29kZXttZF9zaG9ydF9qdW1wX3NpemV9IHRvCit0aGUgc2l6ZSBvZiBhIHNob3J0IGp1bXAgKGEganVtcCB0aGF0IGlzIGp1c3QgbG9uZyBlbm91Z2ggdG8ganVtcCBhcm91bmQgYSBsb25nCitqbXApIGFuZCBAY29kZXttZF9sb25nX2p1bXBfc2l6ZX0gdG8gdGhlIHNpemUgb2YgYSBsb25nIGp1bXAgKGEganVtcCB0aGF0IGNhbgorZ28gYW55d2hlcmUgaW4gdGhlIGZ1bmN0aW9uKSwgWW91IHNob3VsZCBkZWZpbmUgQGNvZGV7bWRfY3JlYXRlX3Nob3J0X2p1bXB9IHRvCitjcmVhdGUgYSBzaG9ydCBqdW1wIGFyb3VuZCBhIGxvbmcganVtcCwgYW5kIGRlZmluZSBAY29kZXttZF9jcmVhdGVfbG9uZ19qdW1wfQordG8gY3JlYXRlIGEgbG9uZyBqdW1wLgorCitAaXRlbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAorQGNpbmRleCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAorVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBzaXplIG9mIGEgQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9CitmcmFnIGJlZm9yZSBhbnkgcmVsYXhpbmcgaXMgZG9uZS4gIEl0IG1heSBhbHNvIGNyZWF0ZSBhbnkgbmVjZXNzYXJ5CityZWxvY2F0aW9ucy4KKworQGl0ZW0gbWRfcmVsYXhfZnJhZworQGNpbmRleCBtZF9yZWxheF9mcmFnCitUaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkIHRvIHJlbGF4IGEgZnJhZy4gIEdBUyB3aWxsIGNhbGwgdGhpcyB3aXRoIHRoZSBmcmFnCithbmQgdGhlIGNoYW5nZSBpbiBzaXplIG9mIGFsbCBwcmV2aW91cyBmcmFnczsgQGNvZGV7bWRfcmVsYXhfZnJhZ30gc2hvdWxkCityZXR1cm4gdGhlIGNoYW5nZSBpbiBzaXplIG9mIHRoZSBmcmFnLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCisKK0BpdGVtIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKK0BjaW5kZXggVENfR0VORVJJQ19SRUxBWF9UQUJMRQorSWYgeW91IGRvIG5vdCBkZWZpbmUgQGNvZGV7bWRfcmVsYXhfZnJhZ30sIHlvdSBtYXkgZGVmaW5lCitAY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSBhcyBhIHRhYmxlIG9mIEBjb2Rle3JlbGF4X3R5cGVTfSBzdHJ1Y3R1cmVzLiAgVGhlCittYWNoaW5lIGluZGVwZW5kZW50IGNvZGUga25vd3MgaG93IHRvIHVzZSBzdWNoIGEgdGFibGUgdG8gcmVsYXggUEMgcmVsYXRpdmUKK3JlZmVyZW5jZXMuICBTZWUgQGZpbGV7dGMtbTY4ay5jfSBmb3IgYW4gZXhhbXBsZS4gIEB4cmVme1JlbGF4YXRpb259LgorCitAaXRlbSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KK0BjaW5kZXggbWRfcHJlcGFyZV9yZWxheF9zY2FuCitJZiBkZWZpbmVkLCBpdCBpcyBhIEMgc3RhdGVtZW50IHRoYXQgaXMgaW52b2tlZCBwcmlvciB0byBzY2FubmluZwordGhlIHJlbGF4IHRhYmxlLgorCitAaXRlbSBMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZCitAY2luZGV4IExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgQHNhbXB7bGlua3JlbGF4fSBpcyBzZXQKKyhiZWNhdXNlIG9mIGEgY29tbWFuZCBsaW5lIG9wdGlvbiwgb3IgdW5jb25kaXRpb25hbGx5IGluIEBjb2Rle21kX2JlZ2lufSksIGEKK0BzYW1wey5hbGlnbn0gZGlyZWN0aXZlIHdpbGwgY2F1c2UgZXh0cmEgc3BhY2UgdG8gYmUgYWxsb2NhdGVkLiAgVGhlIGxpbmtlciBjYW4KK3RoZW4gZGlzY2FyZCB0aGlzIHNwYWNlIHdoZW4gcmVsYXhpbmcgdGhlIHNlY3Rpb24uCisKK0BpdGVtIG1kX2NvbnZlcnRfZnJhZworQGNpbmRleCBtZF9jb252ZXJ0X2ZyYWcKK0dBUyB3aWxsIGNhbGwgdGhpcyBmb3IgZWFjaCByc19tYWNoaW5lX2RlcGVuZGVudCBmcmFnbWVudC4KK1RoZSBpbnN0cnVjdGlvbiBpcyBjb21wbGV0ZWQgdXNpbmcgdGhlIGRhdGEgZnJvbSB0aGUgcmVsYXhhdGlvbiBwYXNzLgorSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkgcmVsb2NhdGlvbnMuCitAeHJlZntSZWxheGF0aW9ufS4KKworQGl0ZW0gbWRfYXBwbHlfZml4CitAY2luZGV4IG1kX2FwcGx5X2ZpeAorR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIGZpeHVwLiAgSXQgc2hvdWxkIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZQorb2JqZWN0IGZpbGUuCisKK0BpdGVtIFRDX0hBTkRMRVNfRlhfRE9ORQorQGNpbmRleCBUQ19IQU5ETEVTX0ZYX0RPTkUKK0lmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgaXQgbWVhbnMgdGhhdCBAY29kZXttZF9hcHBseV9maXh9IGNvcnJlY3RseSBzZXRzIHRoZQorQGNvZGV7ZnhfZG9uZX0gZmllbGQgaW4gdGhlIGZpeHVwLgorCitAaXRlbSB0Y19nZW5fcmVsb2MKK0BjaW5kZXggdGNfZ2VuX3JlbG9jCitBIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IEdBUyB3aWxsIGNhbGwgdGhpcyB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgR0FTIHdpbGwgcGFzcwordGhlIHJlc3VsdGluZyByZWxvYyB0byBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4gIFRoaXMgY3VycmVudGx5IHdvcmtzCitwb29ybHksIGFzIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259IG9mdGVuIGRvZXMgdGhlIHdyb25nIHRoaW5nLCBhbmQKK2luc3RhbmNlcyBvZiBAY29kZXt0Y19nZW5fcmVsb2N9IGhhdmUgYmVlbiB3cml0dGVuIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtcywKK3doaWNoIGluIHR1cm5zIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBmaXggQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0uCisKK0BpdGVtIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQorQGNpbmRleCBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgbWVhbnMgdGhhdCBAY29kZXt0Y19nZW5fcmVsb2N9IG1heSByZXR1cm4gbXVsdGlwbGUKK3JlbG9jYXRpb24gZW50cmllcyBmb3IgYSBzaW5nbGUgZml4dXAuICBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgb2YKK0Bjb2Rle3RjX2dlbl9yZWxvY30gaXMgYSBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5LgorCitAaXRlbSBNQVhfUkVMT0NfRVhQQU5TSU9OCitAY2luZGV4IE1BWF9SRUxPQ19FWFBBTlNJT04KK1lvdSBtdXN0IGRlZmluZSB0aGlzIGlmIEBjb2Rle1JFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRX0gaXMgZGVmaW5lZDsgaXQKK2luZGljYXRlcyB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgcmVsb2NzIHdoaWNoIEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBmb3IKK2Egc2luZ2xlIGZpeHVwLgorCitAaXRlbSB0Y19maXhfYWRqdXN0YWJsZQorQGNpbmRleCB0Y19maXhfYWRqdXN0YWJsZQorWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgZml4dXAgYWdhaW5zdCBhIGxvY2FsbHkgZGVmaW5lZAorc3ltYm9sIHNob3VsZCBiZSBhZGp1c3RlZCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4gIEl0IHNob3VsZCByZXR1cm4gYQorbm9uLXplcm8gdmFsdWUgaWYgdGhlIGFkanVzdG1lbnQgaXMgYWNjZXB0YWJsZS4KKworQGl0ZW0gTURfUENSRUxfRlJPTV9TRUNUSU9OCitAY2luZGV4IE1EX1BDUkVMX0ZST01fU0VDVElPTgorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBzaG91bGQgcmV0dXJuIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiBhCitQQyByZWxhdGl2ZSBmaXh1cCBhbmQgdGhlIHBvc2l0aW9uIGZyb20gd2hpY2ggdGhlIFBDIHJlbGF0aXZlIGFkanVzdG1lbnQgc2hvdWxkCitiZSBtYWRlLiAgT24gbWFueSBwcm9jZXNzb3JzLCB0aGUgYmFzZSBvZiBhIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIGlzIHRoZSBuZXh0CitpbnN0cnVjdGlvbiwgc28gdGhpcyBtYWNybyB3b3VsZCByZXR1cm4gdGhlIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4KKworQGl0ZW0gbWRfcGNyZWxfZnJvbQorQGNpbmRleCBtZF9wY3JlbF9mcm9tCitUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle01EX1BDUkVMX0ZST01fU0VDVElPTn0uICBUaGUgZGlmZmVyZW5jZSBpcwordGhhdCBAY29kZXttZF9wY3JlbF9mcm9tfSBkb2VzIG5vdCB0YWtlIGEgc2VjdGlvbiBhcmd1bWVudC4KKworQGl0ZW0gdGNfZnJvYl9sYWJlbAorQGNpbmRleCB0Y19mcm9iX2xhYmVsCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZWFjaCB0aW1lIGEgbGFiZWwgaXMgZGVmaW5lZC4KKworQGl0ZW0gbWRfc2VjdGlvbl9hbGlnbgorQGNpbmRleCBtZF9zZWN0aW9uX2FsaWduCitHQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGVhY2ggc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSwgdG8KK3Blcm1pdCB0aGUgQ1BVIGJhY2tlbmQgdG8gYWRqdXN0IHRoZSBhbGlnbm1lbnQgb2YgYSBzZWN0aW9uLgorCitAaXRlbSB0Y19mcm9iX3NlY3Rpb24KK0BjaW5kZXggdGNfZnJvYl9zZWN0aW9uCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaAorc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseS4KKworQGl0ZW0gdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKK0BjaW5kZXggdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgc3ltYm9sIHZhbHVlcyBhcmUKK3Jlc29sdmVkLCBidXQgYmVmb3JlIHRoZSBmaXh1cHMgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIHNlY3Rpb24KK3N5bWJvbHMuCisKK0BpdGVtIHRjX2Zyb2Jfc3ltYm9sCitAY2luZGV4IHRjX2Zyb2Jfc3ltYm9sCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc3ltYm9sLiAgWW91IGNhbiBpbmRpY2F0ZQordGhhdCB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCBmaWxlIGJ5IGRlZmluaW5pbmcgdGhpcworbWFjcm8gdG8gc2V0IGl0cyBzZWNvbmQgYXJndW1lbnQgdG8gYSBub24temVybyB2YWx1ZS4KKworQGl0ZW0gdGNfZnJvYl9maWxlCitAY2luZGV4IHRjX2Zyb2JfZmlsZQorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4KK2NvbXBsZXRlZCwgYnV0IGJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KKworQGl0ZW0gdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcworSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuCitnZW5lcmF0ZWQuCisKK0BpdGVtIExJU1RJTkdfSEVBREVSCitBIHN0cmluZyB0byB1c2Ugb24gdGhlIGhlYWRlciBsaW5lIG9mIGEgbGlzdGluZy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNpbXBseQorQGNvZGV7IkdBUyBMSVNUSU5HIn0uCisKK0BpdGVtIExJU1RJTkdfV09SRF9TSVpFCitUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHB1dCBpbnRvIGEgd29yZCBpbiBhIGxpc3RpbmcuICBUaGlzIGFmZmVjdHMgdGhlIHdheSB0aGUKK2J5dGVzIGFyZSBjbHVtcGVkIHRvZ2V0aGVyIGluIHRoZSBsaXN0aW5nLiAgRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMiBtaWdodAorcHJpbnQgQHNhbXB7MTIzNCA1Njc4fSB3aGVyZSBhIHZhbHVlIG9mIDEgd291bGQgcHJpbnQgQHNhbXB7MTIgMzQgNTYgNzh9LiAgVGhlCitkZWZhdWx0IHZhbHVlIGlzIDQuCisKK0BpdGVtIExJU1RJTkdfTEhTX1dJRFRICitUaGUgbnVtYmVyIG9mIHdvcmRzIG9mIGRhdGEgdG8gcHJpbnQgb24gdGhlIGZpcnN0IGxpbmUgb2YgYSBsaXN0aW5nIGZvciBhCitwYXJ0aWN1bGFyIHNvdXJjZSBsaW5lLCB3aGVyZSBlYWNoIHdvcmQgaXMgQGNvZGV7TElTVElOR19XT1JEX1NJWkV9IGJ5dGVzLiAgVGhlCitkZWZhdWx0IHZhbHVlIGlzIDEuCisKK0BpdGVtIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORAorTGlrZSBAY29kZXtMSVNUSU5HX0xIU19XSURUSH0sIGJ1dCBhcHBseWluZyB0byB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxpbmUKK29mIHRoZSBkYXRhIHByaW50ZWQgZm9yIGEgcGFydGljdWxhciBzb3VyY2UgbGluZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuCisKK0BpdGVtIExJU1RJTkdfTEhTX0NPTlRfTElORVMKK1RoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aW51YXRpb24gbGluZXMgdG8gcHJpbnQgaW4gYSBsaXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKK3NvdXJjZSBsaW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4KKworQGl0ZW0gTElTVElOR19SSFNfV0lEVEgKK1RoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50IGZyb20gb25lIGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGUKK2RlZmF1bHQgdmFsdWUgaXMgMTAwLgorQGVuZCB0YWJsZQorCitAbm9kZSBPYmplY3QgZm9ybWF0IGJhY2tlbmQKK0BzdWJzZWN0aW9uIFdyaXRpbmcgYW4gb2JqZWN0IGZvcm1hdCBiYWNrZW5kCitAY2luZGV4IG9iamVjdCBmb3JtYXQgYmFja2VuZAorQGNpbmRleCBAZmlsZXtvYmotQHZhcntmbXR9fQorCitBcyB3aXRoIHRoZSBDUFUgYmFja2VuZCwgdGhlIG9iamVjdCBmb3JtYXQgYmFja2VuZCBtdXN0IGRlZmluZSBhIGZldyB0aGluZ3MsCithbmQgbWF5IGRlZmluZSBzb21lIG90aGVyIHRoaW5ncy4gIFRoZSBpbnRlcmZhY2UgdG8gdGhlIG9iamVjdCBmb3JtYXQgYmFja2VuZAoraXMgZ2VuZXJhbGx5IHNpbXBsZXI7IG1vc3Qgb2YgdGhlIHN1cHBvcnQgZm9yIGFuIG9iamVjdCBmaWxlIGZvcm1hdCBjb25zaXN0cyBvZgorZGVmaW5pbmcgYSBudW1iZXIgb2YgcHNldWRvLW9wcy4KKworVGhlIG9iamVjdCBmb3JtYXQgQGZpbGV7Lmh9IGZpbGUgbXVzdCBpbmNsdWRlIEBmaWxle3RhcmctY3B1Lmh9LgorCitUaGlzIHNlY3Rpb24gd2lsbCBvbmx5IGRlZmluZSB0aGUgQGNvZGV7QkZEX0FTU0VNQkxFUn0gdmVyc2lvbiBvZiBHQVMuICBJdCBpcworaW1wb3NzaWJsZSB0byBzdXBwb3J0IGEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCB1c2luZyBhbnkgb3RoZXIgdmVyc2lvbiBhbnlob3csCithcyB0aGUgb3JpZ2luYWwgR0FTIHZlcnNpb24gb25seSBzdXBwb3J0cyBhLm91dCwgYW5kIHRoZSBAY29kZXtNQU5ZX1NFR01FTlRTfQorR0FTIHZlcnNpb24gb25seSBzdXBwb3J0cyBDT0ZGLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIE9CSl9AdmFye2Zvcm1hdH0KK0BjaW5kZXggT0JKX0B2YXJ7Zm9ybWF0fQorQnkgY29udmVudGlvbiwgeW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUuICBGb3IKK2V4YW1wbGUsIEBmaWxle29iai1lbGYuaH0gZGVmaW5lcyBAY29kZXtPQkpfRUxGfS4gIFlvdSBtaWdodCBoYXZlIHRvIHVzZSB0aGlzCitpZiBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYyBjb2RlIHRvIHRoZSBDUFUgZmlsZS4KKworQGl0ZW0gb2JqX2JlZ2luCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSwgYWZ0ZXIKK3RoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudAoraW5pdGlhbGl6YXRpb25zIGhhdmUgYmVlbiBjb21wbGV0ZWQuCisKK0BpdGVtIG9ial9hcHBfZmlsZQorQGNpbmRleCBvYmpfYXBwX2ZpbGUKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgaW52b2tlIGl0IHdoZW4gaXQgc2VlcyBhIEBjb2Rley5maWxlfQorcHNldWRvLW9wIG9yIGEgQHNhbXB7I30gbGluZSBhcyB1c2VkIGJ5IHRoZSBDIHByZXByb2Nlc3Nvci4KKworQGl0ZW0gT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKK0BjaW5kZXggT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMKK1lvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gY29weSBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20KK29uZSBzeW1ib2wgdG8gYW5vdGhlci4gIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBvbmUgc3ltYm9sIGlzIGVxdWF0ZWQgdG8KK2Fub3RoZXIuCisKK0BpdGVtIG9ial9maXhfYWRqdXN0YWJsZQorQGNpbmRleCBvYmpfZml4X2FkanVzdGFibGUKK1lvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgd2hldGhlciBhIGZpeHVwIGFnYWluc3QgYSBsb2NhbGx5IGRlZmluZWQKK3N5bWJvbCBzaG91bGQgYmUgYWRqdXN0ZWQgdG8gYmUgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wuICBJdCBzaG91bGQgcmV0dXJuIGEKK25vbi16ZXJvIHZhbHVlIGlmIHRoZSBhZGp1c3RtZW50IGlzIGFjY2VwdGFibGUuCisKK0BpdGVtIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYworQGNpbmRleCBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKK1lvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byB1c2UgYSBzZWN0aW9uIHN5bWJvbCBpbgorYSByZWxvY2F0ZWlvbiBlbnRyeS4gIElmIGl0IGlzIG5vdCwgR0FTIHdpbGwgZGVmaW5lIGEgbmV3IHN5bWJvbCBhdCB0aGUgc3RhcnQKK29mIGEgc2VjdGlvbi4KKworQGl0ZW0gRU1JVF9TRUNUSU9OX1NZTUJPTFMKK0BjaW5kZXggRU1JVF9TRUNUSU9OX1NZTUJPTFMKK1lvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gd2l0aCBhIHplcm8gdmFsdWUgaWYgeW91IGRvIG5vdCB3YW50IHRvIGluY2x1ZGUKK3NlY3Rpb24gc3ltYm9scyBpbiB0aGUgb3V0cHV0IHN5bWJvbCB0YWJsZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIG1hY3JvCitpcyBvbmUuCisKK0BpdGVtIG9ial9hZGp1c3Rfc3ltdGFiCitAY2luZGV4IG9ial9hZGp1c3Rfc3ltdGFiCitJZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGludm9rZSBpdCBqdXN0IGJlZm9yZSBzZXR0aW5nIHRoZSBzeW1ib2wKK3RhYmxlIG9mIHRoZSBvdXRwdXQgQkZELiAgRm9yIGV4YW1wbGUsIHRoZSBDT0ZGIHN1cHBvcnQgdXNlcyB0aGlzIG1hY3JvIHRvCitnZW5lcmF0ZSBhIEBjb2Rley5maWxlfSBzeW1ib2wgaWYgbm9uZSB3YXMgZ2VuZXJhdGVkIHByZXZpb3VzbHkuCisKK0BpdGVtIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMKK0BjaW5kZXggU0VQQVJBVEVfU1RBQl9TRUNUSU9OUworWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IHN0YWJzIHNob3VsZCBiZSBwbGFjZWQgaW4gc2VwYXJhdGUKK3NlY3Rpb25zLCBhcyBpbiBFTEYuCisKK0BpdGVtIElOSVRfU1RBQl9TRUNUSU9OCitAY2luZGV4IElOSVRfU1RBQl9TRUNUSU9OCitZb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgdGhlIHN0YWJzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgorCitAaXRlbSBPQkpfUFJPQ0VTU19TVEFCCitAY2luZGV4IE9CSl9QUk9DRVNTX1NUQUIKK1lvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiBhIHN0YWJzIGVudHJ5LgorCitAaXRlbSBvYmpfZnJvYl9zZWN0aW9uCitAY2luZGV4IG9ial9mcm9iX3NlY3Rpb24KK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCithc3NlbWJseS4KKworQGl0ZW0gb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0CitAY2luZGV4IG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdmFsdWVzIGFyZQorcmVzb2x2ZWQsIGJ1dCBiZWZvcmUgdGhlIGZpeHVwcyBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gc2VjdGlvbgorc3ltYm9scy4KKworQGl0ZW0gb2JqX2Zyb2Jfc3ltYm9sCitAY2luZGV4IG9ial9mcm9iX3N5bWJvbAorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHN5bWJvbC4gIFlvdSBjYW4gaW5kaWNhdGUKK3RoYXQgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvYmplY3QgZmlsZSBieSBkZWZpbmluaW5nIHRoaXMKK21hY3JvIHRvIHNldCBpdHMgc2Vjb25kIGFyZ3VtZW50IHRvIGEgbm9uLXplcm8gdmFsdWUuCisKK0BpdGVtIG9ial9mcm9iX2ZpbGUKK0BjaW5kZXggb2JqX2Zyb2JfZmlsZQorSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4KK2NvbXBsZXRlZCwgYnV0IGJlZm9yZSB0aGUgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KKworQGl0ZW0gb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKK0lmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhZnRlciB0aGUgcmVsb2NzIGhhdmUgYmVlbgorZ2VuZXJhdGVkLgorQGVuZCB0YWJsZQorCitAbm9kZSBFbXVsYXRpb25zCitAc3Vic2VjdGlvbiBXcml0aW5nIGVtdWxhdGlvbiBmaWxlcworCitOb3JtYWxseSB5b3UgZG8gbm90IGhhdmUgdG8gd3JpdGUgYW4gZW11bGF0aW9uIGZpbGUuICBZb3UgY2FuIGp1c3QgdXNlCitAZmlsZXt0ZS1nZW5lcmljLmh9LgorCitJZiB5b3UgZG8gd3JpdGUgeW91ciBvd24gZW11bGF0aW9uIGZpbGUsIGl0IG11c3QgaW5jbHVkZSBAZmlsZXtvYmotZm9ybWF0Lmh9LgorCitBbiBlbXVsYXRpb24gZmlsZSB3aWxsIG9mdGVuIGRlZmluZSBAY29kZXtURV9AdmFye0VNfX07IHRoaXMgbWF5IHRoZW4gYmUgdXNlZAoraW4gb3RoZXIgZmlsZXMgdG8gY2hhbmdlIHRoZSBvdXRwdXQuCisKK0Bub2RlIFJlbGF4YXRpb24KK0BzZWN0aW9uIFJlbGF4YXRpb24KK0BjaW5kZXggcmVsYXhhdGlvbgorCitAZGZue1JlbGF4YXRpb259IGlzIGEgZ2VuZXJpYyB0ZXJtIHVzZWQgd2hlbiB0aGUgc2l6ZSBvZiBzb21lIGluc3RydWN0aW9uIG9yCitkYXRhIGRlcGVuZHMgdXBvbiB0aGUgdmFsdWUgb2Ygc29tZSBzeW1ib2wgb3Igb3RoZXIgZGF0YS4KKworR0FTIGtub3dzIHRvIHJlbGF4IGEgcGFydGljdWxhciB0eXBlIG9mIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gdXNpbmcgYSB0YWJsZS4KK1lvdSBjYW4gYWxzbyBkZWZpbmUgYXJiaXRyYXJpbHkgY29tcGxleCBmb3JtcyBvZiByZWxheGF0aW9uIHlvdXJzZWxmLgorCitAbWVudQorKiBSZWxheGluZyB3aXRoIGEgdGFibGU6OiAgICAgICBSZWxheGluZyB3aXRoIGEgdGFibGUKKyogR2VuZXJhbCByZWxheGluZzo6ICAgICAgICAgICAgR2VuZXJhbCByZWxheGluZworQGVuZCBtZW51CisKK0Bub2RlIFJlbGF4aW5nIHdpdGggYSB0YWJsZQorQHN1YnNlY3Rpb24gUmVsYXhpbmcgd2l0aCBhIHRhYmxlCisKK0lmIHlvdSBkbyBub3QgZGVmaW5lIEBjb2Rle21kX3JlbGF4X2ZyYWd9LCBhbmQgeW91IGRvIGRlZmluZQorQGNvZGV7VENfR0VORVJJQ19SRUxBWF9UQUJMRX0sIEdBUyB3aWxsIHJlbGF4IEBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFncworYmFzZWQgb24gdGhlIGZyYWcgc3VidHlwZSBhbmQgdGhlIGRpc3BsYWNlbWVudCB0byBzb21lIHNwZWNpZmllZCB0YXJnZXQKK2FkZHJlc3MuICBUaGUgYmFzaWMgaWRlYSBpcyB0aGF0IHNldmVyYWwgbWFjaGluZXMgaGF2ZSBkaWZmZXJlbnQgYWRkcmVzc2luZworbW9kZXMgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNhbiBzcGVjaWZ5IGRpZmZlcmVudCByYW5nZXMgb2YgdmFsdWVzLCB3aXRoCitzdWNjZXNzaXZlIG1vZGVzIGFibGUgdG8gYWNjZXNzIHdpZGVyIHJhbmdlcywgaW5jbHVkaW5nIHRoZSBlbnRpcmV0eSBvZiB0aGUKK3ByZXZpb3VzIHJhbmdlLiAgU21hbGxlciByYW5nZXMgYXJlIGFzc3VtZWQgdG8gYmUgbW9yZSBkZXNpcmFibGUgKHBlcmhhcHMgdGhlCitpbnN0cnVjdGlvbiByZXF1aXJlcyBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3byBvciB0aHJlZSk7IGlmIHRoaXMgaXMgbm90IHRoZQorY2FzZSwgZG9uJ3QgZGVzY3JpYmUgdGhlIHNtYWxsZXItcmFuZ2UsIGluZmVyaW9yIG1vZGUuCisKK1RoZSBAY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBvZiBhIGZyYWcgaXMgYW4gaW5kZXggaW50byBhIENQVS1zcGVjaWZpYworcmVsYXhhdGlvbiB0YWJsZS4gIFRoYXQgdGFibGUgZW50cnkgaW5kaWNhdGVzIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUKK3N0b3JlZCwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdpbGwgaGF2ZSB0byBiZSBhZGRlZCB0byB0aGUgZnJhZyB0bworYWNjb21vZGF0ZSB0aGUgYWRkcmVzc2luZyBtb2RlLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IHRvIGV4YW1pbmUgaWYKK3RoZSB2YWx1ZSB0byBiZSBzdG9yZWQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgYWNjZXNzaWJsZSBieSB0aGUgY3VycmVudAorYWRkcmVzc2luZyBtb2RlLiAgVGhlIEBjb2Rle2ZyX3N5bWJvbH0gZmllbGQgb2YgdGhlIGZyYWcgaW5kaWNhdGVzIHdoYXQgc3ltYm9sCitpcyB0byBiZSBhY2Nlc3NlZDsgdGhlIEBjb2Rle2ZyX29mZnNldH0gZmllbGQgaXMgYWRkZWQgaW4uCisKK0lmIHRoZSBAY29kZXtUQ19QQ1JFTF9BREpVU1R9IG1hY3JvIGlzIGRlZmluZWQsIHdoaWNoIGN1cnJlbnRseSBzaG91bGQgb25seSBoYXBwZW4KK2ZvciB0aGUgTlMzMmsgZmFtaWx5LCB0aGUgQGNvZGV7VENfUENSRUxfQURKVVNUfSBtYWNybyBpcyBjYWxsZWQgb24gdGhlIGZyYWcgdG8KK2NvbXB1dGUgYW4gYWRqdXN0bWVudCB0byBiZSBtYWRlIHRvIHRoZSBkaXNwbGFjZW1lbnQuCisKK1RoZSB2YWx1ZSBmaXR0ZWQgYnkgdGhlIHJlbGF4YXRpb24gY29kZSBpcyBhbHdheXMgYXNzdW1lZCB0byBiZSBhIGRpc3BsYWNlbWVudAorZnJvbSB0aGUgY3VycmVudCBmcmFnLiAgKE1vcmUgc3BlY2lmaWNhbGx5LCBmcm9tIEBjb2Rle2ZyX2ZpeH0gYnl0ZXMgaW50byB0aGUKK2ZyYWcuKQorQGlnbm9yZQorVGhpcyBzZWVtcyBraW5kYSBzaWxseS4gIFdoYXQgYWJvdXQgZml0dGluZyBzbWFsbCBhYnNvbHV0ZSB2YWx1ZXM/ICBJIHN1cHBvc2UKK0Bjb2Rle21kX2Fzc2VtYmxlfSBpcyBzdXBwb3NlZCB0byB0YWtlIGNhcmUgb2YgdGhhdCwgYnV0IGlmIHRoZSBvcGVyYW5kIGlzIGEKK2RpZmZlcmVuY2UgYmV0d2VlbiBzeW1ib2xzLCBpdCBtaWdodCBub3QgYmUgYWJsZSB0bywgaWYgdGhlIGRpZmZlcmVuY2Ugd2FzIG5vdAorY29tcHV0YWJsZSB5ZXQuCitAZW5kIGlnbm9yZQorCitUaGUgZW5kIG9mIHRoZSByZWxheGF0aW9uIHNlcXVlbmNlIGlzIGluZGljYXRlZCBieSBhIGBgbmV4dCcnIHZhbHVlIG9mIDAuICBUaGlzCittZWFucyB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgY2FuJ3QgYmUgdXNlZC4KKworRm9yIHNvbWUgY29uZmlndXJhdGlvbnMsIHRoZSBsaW5rZXIgY2FuIGRvIHJlbGF4aW5nIHdpdGhpbiBhIHNlY3Rpb24gb2YgYW4KK29iamVjdCBmaWxlLiAgSWYgY2FsbCBpbnN0cnVjdGlvbnMgb2YgdmFyaW91cyBzaXplcyBleGlzdCwgdGhlIGxpbmtlciBjYW4KK2RldGVybWluZSB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBlYWNoIGluc3RhbmNlLCB3aGVuIGEgc3ltYm9sJ3MgdmFsdWUgaXMKK3Jlc29sdmVkLiAgSW4gb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gYXZvaWQgd2FzdGluZyBzcGFjZSBhbmQgaGF2aW5nIHRvIGluc2VydAorbm8tb3AgaW5zdHJ1Y3Rpb25zLCBpdCBtdXN0IGJlIGFibGUgdG8gZXhwYW5kIG9yIHNocmluayB0aGUgc2VjdGlvbiBjb250ZW50cword2hpbGUgc3RpbGwgcHJlc2VydmluZyBpbnRyYS1zZWN0aW9uIHJlZmVyZW5jZXMgYW5kIG1lZXRpbmcgYWxpZ25tZW50CityZXF1aXJlbWVudHMuCisKK0ZvciB0aGUgaTk2MCB1c2luZyBiLm91dCBmb3JtYXQsIG5vIGV4cGFuc2lvbiBpcyBkb25lOyBpbnN0ZWFkLCBlYWNoCitAc2FtcHsuYWxpZ259IGRpcmVjdGl2ZSBjYXVzZXMgZXh0cmEgc3BhY2UgdG8gYmUgYWxsb2NhdGVkLCBlbm91Z2ggdGhhdCB3aGVuCit0aGUgbGlua2VyIGlzIHJlbGF4aW5nIGEgc2VjdGlvbiBhbmQgcmVtb3ZpbmcgdW5uZWVkZWQgc3BhY2UsIGl0IGNhbiBkaXNjYXJkCitzb21lIG9yIGFsbCBvZiB0aGlzIGV4dHJhIHBhZGRpbmcgYW5kIGNhdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSB0byBiZSBjb3JyZWN0bHkKK2FsaWduZWQuCisKK0ZvciB0aGUgSDgvMzAwLCBJIHRoaW5rIHRoZSBsaW5rZXIgZXhwYW5kcyBjYWxscyB0aGF0IGNhbid0IHJlYWNoLCBhbmQgZG9lc24ndAord29ycnkgYWJvdXQgYWxpZ25tZW50IGlzc3VlczsgdGhlIGNwdSBwcm9iYWJseSBuZXZlciBuZWVkcyBhbnkgc2lnbmlmaWNhbnQKK2FsaWdubWVudCBiZXlvbmQgdGhlIGluc3RydWN0aW9uIHNpemUuCisKK1RoZSByZWxheGF0aW9uIHRhYmxlIHR5cGUgY29udGFpbnMgdGhlc2UgZmllbGRzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGxvbmcgcmx4X2ZvcndhcmQKK0ZvcndhcmQgcmVhY2gsIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgorQGl0ZW0gbG9uZyBybHhfYmFja3dhcmQKK0JhY2t3YXJkIHJlYWNoLCBtdXN0IGJlIHplcm8gb3IgbmVnYXRpdmUuCitAaXRlbSBybHhfbGVuZ3RoCitMZW5ndGggaW4gYnl0ZXMgb2YgdGhpcyBhZGRyZXNzaW5nIG1vZGUuCitAaXRlbSBybHhfbW9yZQorSW5kZXggb2YgdGhlIG5leHQtbG9uZ2VyIHJlbGF4IHN0YXRlLCBvciB6ZXJvIGlmIHRoZXJlIGlzIG5vIG5leHQgcmVsYXggc3RhdGUuCitAZW5kIHRhYmxlCisKK1RoZSByZWxheGF0aW9uIGlzIGRvbmUgaW4gQGNvZGV7cmVsYXhfc2VnbWVudH0gaW4gQGZpbGV7d3JpdGUuY30uICBUaGUKK2RpZmZlcmVuY2UgaW4gdGhlIGxlbmd0aCBmaWVsZHMgYmV0d2VlbiB0aGUgb3JpZ2luYWwgbW9kZSBhbmQgdGhlIG9uZSBmaW5hbGx5CitjaG9zZW4gYnkgdGhlIHJlbGF4aW5nIGNvZGUgaXMgdGFrZW4gYXMgdGhlIHNpemUgYnkgd2hpY2ggdGhlIGN1cnJlbnQgZnJhZyB3aWxsCitiZSBpbmNyZWFzZWQgaW4gc2l6ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgaW5pdGlhbCByZWxheGluZyBtb2RlIGhhcyBhIGxlbmd0aAorb2YgMiBieXRlcywgYW5kIGJlY2F1c2Ugb2YgdGhlIHNpemUgb2YgdGhlIGRpc3BsYWNlbWVudCwgaXQgZ2V0cyB1cGdyYWRlZCB0byBhCittb2RlIHdpdGggYSBzaXplIG9mIDYgYnl0ZXMsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhZyB3aWxsIGdyb3cgYnkgNCBieXRlcy4KKyhUaGUgaW5pdGlhbCB0d28gYnl0ZXMgc2hvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBmaXhlZCBwb3J0aW9uIG9mIHRoZSBmcmFnLAorc2luY2UgaXQgaXMgYWxyZWFkeSBrbm93biB0aGF0IHRoZXkgd2lsbCBiZSBvdXRwdXQuKSAgVGhpcyBncm93dGggbXVzdCBiZQorZWZmZWN0ZWQgYnkgQGNvZGV7bWRfY29udmVydF9mcmFnfTsgaXQgc2hvdWxkIGluY3JlYXNlIHRoZSBAY29kZXtmcl9maXh9IGZpZWxkCitieSB0aGUgYXBwcm9wcmlhdGUgc2l6ZSwgYW5kIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIG9mIHRoZSBmcmFnLgorKEVub3VnaCBzcGFjZSBmb3IgdGhlIG1heGltdW0gZ3Jvd3RoIHNob3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIHRoZSBjYWxsIHRvCitmcmFnX3ZhciBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LikKKworSWYgcmVsb2NhdGlvbiByZWNvcmRzIGFyZSBuZWVkZWQsIHRoZXkgc2hvdWxkIGJlIGVtaXR0ZWQgYnkKK0Bjb2Rle21kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4fS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGV4YW1pbmUgdGhlIHRhcmdldAorc3ltYm9sIG9mIHRoZSBzdXBwbGllZCBmcmFnIGFuZCBjb3JyZWN0IHRoZSBAY29kZXtmcl9zdWJ0eXBlfSBvZiB0aGUgZnJhZyBpZgorbmVlZGVkLiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaWYgdGhlIHN5bWJvbCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsCitpdCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZCBsYXRlcjsgaG93ZXZlciwgaXRzIHZhbHVlIG1heSBzdGlsbCBjaGFuZ2UgaWYgdGhlCitzZWN0aW9uIGl0IGlzIGluIGdldHMgcmVsYXhlZC4KKworVXN1YWxseSwgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSBmcmFnIChnaXZlbiBieSB0aGUKK0B2YXJ7c2VjfSBhcmd1bWVudCksIHRoZSBuYXJyb3dlc3QgbGlrZWx5IHJlbGF4YXRpb24gbW9kZSBpcyBzdG9yZWQgaW4KK0Bjb2Rle2ZyX3N1YnR5cGV9LCBhbmQgdGhhdCdzIHRoYXQuCisKK0lmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBvciBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIChhbmQgdGhlcmVmb3JlIG1vdmVhYmxlCit0byBhbiBhcmJpdHJhcmlseSBsYXJnZSBkaXN0YW5jZSksIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSByZWxheGF0aW9uIG1vZGUgaXMKK3NwZWNpZmllZCwgQGNvZGV7Zml4X25ld30gaXMgY2FsbGVkIHRvIHByb2R1Y2UgdGhlIHJlbG9jYXRpb24gcmVjb3JkLAorQGNvZGV7ZnJfZml4fSBpcyBpbmNyZWFzZWQgdG8gaW5jbHVkZSB0aGUgcmVsb2NhdGVkIGZpZWxkIChyZW1lbWJlciwgdGhpcworc3RvcmFnZSB3YXMgYWxsb2NhdGVkIHdoZW4gQGNvZGV7ZnJhZ192YXJ9IHdhcyBjYWxsZWQpLCBhbmQgQGNvZGV7ZnJhZ193YW5lfSBpcworY2FsbGVkIHRvIGNvbnZlcnQgdGhlIGZyYWcgdG8gYW4gQGNvZGV7cnNfZmlsbH0gZnJhZyB3aXRoIG5vIHZhcmlhbnQgcGFydC4KK1NvbWV0aW1lcyBjaGFuZ2luZyBhZGRyZXNzaW5nIG1vZGVzIG1heSBhbHNvIHJlcXVpcmUgcmV3cml0aW5nIHRoZSBpbnN0cnVjdGlvbi4KK0l0IGNhbiBiZSBhY2Nlc3NlZCB2aWEgQGNvZGV7ZnJfb3Bjb2RlfSBvciBAY29kZXtmcl9maXh9LgorCitTb21ldGltZXMgQGNvZGV7ZnJfdmFyfSBpcyBpbmNyZWFzZWQgaW5zdGVhZCwgYW5kIEBjb2Rle2ZyYWdfd2FuZX0gaXMgbm90CitjYWxsZWQuICBJJ20gbm90IHN1cmUsIGJ1dCBJIHRoaW5rIHRoaXMgaXMgdG8ga2VlcCBAY29kZXtmcl9maXh9IHJlZmVycmluZyB0bworYW4gZWFybGllciBieXRlLCBhbmQgQGNvZGV7ZnJfc3VidHlwZX0gc2V0IHRvIEBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBzbwordGhhdCBAY29kZXttZF9jb252ZXJ0X2ZyYWd9IHdpbGwgZ2V0IGNhbGxlZC4KKworQG5vZGUgR2VuZXJhbCByZWxheGluZworQHN1YnNlY3Rpb24gR2VuZXJhbCByZWxheGluZworCitJZiB1c2luZyBhIHNpbXBsZSB0YWJsZSBpcyBub3Qgc3VpdGFibGUsIHlvdSBtYXkgaW1wbGVtZW50IGFyYml0cmFyaWx5IGNvbXBsZXgKK3JlbGF4YXRpb24gc2VtYW50aWNzIHlvdXJzZWxmLiAgRm9yIGV4YW1wbGUsIHRoZSBNSVBTIGJhY2tlbmQgdXNlcyB0aGlzIHRvIGVtaXQKK2RpZmZlcmVudCBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMgZGVwZW5kaW5nIHVwb24gdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBiZWluZworYWNjZXNzZWQuCisKK1doZW4geW91IGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHRoYXQgbWF5IG5lZWQgcmVsYXhhdGlvbiwgeW91IHNob3VsZCBhbGxvY2F0ZQorYSBmcmFnIHVzaW5nIEBjb2Rle2ZyYWdfdmFyfSBvciBAY29kZXtmcmFnX3ZhcmlhbnR9IHdpdGggYSB0eXBlIG9mCitAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0uICBZb3Ugc2hvdWxkIHN0b3JlIHNvbWUgc29ydCBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKK0Bjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIHNvIHRoYXQgeW91IGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGUgZnJhZworbGF0ZXIuCisKK1doZW4gR0FTIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgaXQgd2lsbCBsb29rIHRocm91Z2ggdGhlIGZyYWdzIGFuZAord29yayBvdXQgdGhlaXIgZmluYWwgc2l6ZXMuCisKK0dBUyB3aWxsIGZpcnN0IGNhbGwgQGNvZGV7bWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXh9IG9uIGVhY2gKK0Bjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fSBmcmFnLiAgVGhpcyBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiBlc3RpbWF0ZWQgc2l6ZQorZm9yIHRoZSBmcmFnLgorCitHQVMgd2lsbCB0aGVuIGxvb3Agb3ZlciB0aGUgZnJhZ3MsIGNhbGxpbmcgQGNvZGV7bWRfcmVsYXhfZnJhZ30gb24gZWFjaAorQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWcuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGNoYW5nZSBpbgorc2l6ZSBvZiB0aGUgZnJhZy4gIEdBUyB3aWxsIGtlZXAgbG9vcGluZyBvdmVyIHRoZSBmcmFncyB1bnRpbCBub25lIG9mIHRoZSBmcmFncworY2hhbmdlcyBzaXplLgorCitAbm9kZSBCcm9rZW4gd29yZHMKK0BzZWN0aW9uIEJyb2tlbiB3b3JkcworQGNpbmRleCBpbnRlcm5hbHMsIGJyb2tlbiB3b3JkcworQGNpbmRleCBicm9rZW4gd29yZHMKKworU29tZSBjb21waWxlcnMsIGluY2x1ZGluZyBHQ0MsIHdpbGwgc29tZXRpbWVzIGVtaXQgc3dpdGNoIHRhYmxlcyBzcGVjaWZ5aW5nCisxNi1iaXQgQGNvZGV7LndvcmR9IGRpc3BsYWNlbWVudHMgdG8gYnJhbmNoIHRhcmdldHMsIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zCit0aGF0IGxvYWQgZW50cmllcyBmcm9tIHRoYXQgdGFibGUgdG8gY29tcHV0ZSB0aGUgdGFyZ2V0IGFkZHJlc3MuICBJZiB0aGlzIGlzCitkb25lIG9uIGEgMzItYml0IG1hY2hpbmUsIHRoZXJlIGlzIGEgY2hhbmNlIChhdCBsZWFzdCB3aXRoIHJlYWxseSBsYXJnZQorZnVuY3Rpb25zKSB0aGF0IHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDE2IGJpdHMuICBUaGUgYXNzZW1ibGVyCitoYW5kbGVzIHRoaXMgdXNpbmcgYSBjb25jZXB0IGNhbGxlZCBAZGZue2Jyb2tlbiB3b3Jkc30uICBUaGlzIGlkZWEgaXMgd2VsbAorbmFtZWQsIHNpbmNlIHRoZXJlIGlzIGFuIGltcGxpZWQgcHJvbWlzZSB0aGF0IHRoZSAxNi1iaXQgZmllbGQgd2lsbCBpbiBmYWN0Citob2xkIHRoZSBzcGVjaWZpZWQgZGlzcGxhY2VtZW50LgorCitJZiBicm9rZW4gd29yZCBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIGFuZCBhIHNpdHVhdGlvbiBsaWtlIHRoaXMgaXMgZW5jb3VudGVyZWQsCit0aGUgYXNzZW1ibGVyIHdpbGwgaW5zZXJ0IGEganVtcCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0sIGNsb3NlCitlbm91Z2ggdG8gYmUgcmVhY2hlZCB3aXRoIHRoZSAxNi1iaXQgZGlzcGxhY2VtZW50LiAgVGhpcyBqdW1wIGluc3RydWN0aW9uIHdpbGwKK3RyYW5zZmVyIHRvIHRoZSByZWFsIGRlc2lyZWQgdGFyZ2V0IGFkZHJlc3MuICBUaHVzLCBhcyBsb25nIGFzIHRoZSBAY29kZXsud29yZH0KK3ZhbHVlIHJlYWxseSBpcyB1c2VkIGFzIGEgZGlzcGxhY2VtZW50IHRvIGNvbXB1dGUgYW4gYWRkcmVzcyB0byBqdW1wIHRvLCB0aGUKK25ldCBlZmZlY3Qgd2lsbCBiZSBjb3JyZWN0IChtaW51cyBhIHZlcnkgc21hbGwgZWZmaWNpZW5jeSBjb3N0KS4gIElmCitAY29kZXsud29yZH0gZGlyZWN0aXZlcyB3aXRoIGxhYmVsIGRpZmZlcmVuY2VzIGZvciB2YWx1ZXMgYXJlIHVzZWQgZm9yIG90aGVyCitwdXJwb3NlcywgaG93ZXZlciwgdGhpbmdzIG1heSBub3Qgd29yayBwcm9wZXJseS4gIEZvciB0YXJnZXRzIHdoaWNoIHVzZSBicm9rZW4KK3dvcmRzLCB0aGUgQHNhbXB7LUt9IG9wdGlvbiB3aWxsIHdhcm4gd2hlbiBhIGJyb2tlbiB3b3JkIGlzIGRpc2NvdmVyZWQuCisKK1RoZSBicm9rZW4gd29yZCBjb2RlIGlzIHR1cm5lZCBvZmYgYnkgdGhlIEBjb2Rle1dPUktJTkdfRE9UX1dPUkR9IG1hY3JvLiAgSXQKK2lzbid0IG5lZWRlZCBpZiBAY29kZXsud29yZH0gZW1pdHMgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbiBhZGRyZXNzCisob3IsIG1vcmUgY29ycmVjdGx5LCBhbnkgcG9zc2libGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhZGRyZXNzZXMpLgorCitAbm9kZSBJbnRlcm5hbCBmdW5jdGlvbnMKK0BzZWN0aW9uIEludGVybmFsIGZ1bmN0aW9ucworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGJhc2ljIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGJ5IEdBUy4KKworQG1lbnUKKyogV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXM6OiAgV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKKyogSGFzaCB0YWJsZXM6OiAgICAgICAgICAgICAgICAgSGFzaCB0YWJsZXMKK0BlbmQgbWVudQorCitAbm9kZSBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcworQHN1YnNlY3Rpb24gV2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMKKworQGRlZnR5cGVmdW4gIEB7QH0gaW50IGhhZF93YXJuaW5ncyAodm9pZCkKK0BkZWZ0eXBlZnVueCBAe0B9IGludCBoYWRfZXJyb3JzICh2b2lkKQorUmV0dXJucyBub24temVybyBpZiBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzLCByZXNwZWN0aXZlbHksIGhhdmUgYmVlbiBwcmludGVkCitkdXJpbmcgdGhpcyBpbnZvY2F0aW9uLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIEB7QH0gdm9pZCBhc19wZXJyb3IgKGNvbnN0IGNoYXIgKkB2YXJ7Z3JpcGV9LCBjb25zdCBjaGFyICpAdmFye2ZpbGVuYW1lfSkKK0Rpc3BsYXlzIGEgQkZEIG9yIHN5c3RlbSBlcnJvciwgdGhlbiBjbGVhcnMgdGhlIGVycm9yIHN0YXR1cy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biAgQHtAfSB2b2lkIGFzX3Rza3RzayAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCitAZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX3dhcm4gKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQorQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19iYWQgKGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQorQGRlZnR5cGVmdW54IEB7QH0gdm9pZCBhc19mYXRhbCAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCitUaGVzZSBmdW5jdGlvbnMgZGlzcGxheSBtZXNzYWdlcyBhYm91dCBzb21ldGhpbmcgYW1pc3Mgd2l0aCB0aGUgaW5wdXQgZmlsZSwgb3IKK2ludGVybmFsIHByb2JsZW1zIGluIHRoZSBhc3NlbWJsZXIgaXRzZWxmLiAgVGhlIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lCitudW1iZXIgYXJlIHByaW50ZWQsIGZvbGxvd2VkIGJ5IHRoZSBzdXBwbGllZCBtZXNzYWdlLCBmb3JtYXR0ZWQgdXNpbmcKK0Bjb2Rle3ZmcHJpbnRmfSwgYW5kIGEgZmluYWwgbmV3bGluZS4KKworQW4gZXJyb3IgaW5kaWNhdGVkIGJ5IEBjb2Rle2FzX2JhZH0gd2lsbCByZXN1bHQgaW4gYSBub24temVybyBleGl0IHN0YXR1cyB3aGVuCit0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZC4gIENhbGxpbmcgQGNvZGV7YXNfZmF0YWx9IHdpbGwgcmVzdWx0IGluIGltbWVkaWF0ZQordGVybWluYXRpb24gb2YgdGhlIGFzc2VtYmxlciBwcm9jZXNzLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIEB7QH0gdm9pZCBhc193YXJuX3doZXJlIChjaGFyICpAdmFye2ZpbGV9LCB1bnNpZ25lZCBpbnQgQHZhcntsaW5lfSwgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCitAZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2JhZF93aGVyZSAoY2hhciAqQHZhcntmaWxlfSwgdW5zaWduZWQgaW50IEB2YXJ7bGluZX0sIGNvbnN0IGNoYXIgKkB2YXJ7Zm9ybWF0fSwgLi4uKQorVGhlc2UgdmFyaWFudHMgcGVybWl0IHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCBhcmUKK3VzZWQgd2hlbiBwcm9ibGVtcyBhcmUgZGV0ZWN0ZWQgd2hlbiByZXByb2Nlc3NpbmcgaW5mb3JtYXRpb24gc2F2ZWQgYXdheSB3aGVuCitwcm9jZXNzaW5nIHNvbWUgZWFybGllciBwYXJ0IG9mIHRoZSBmaWxlLiAgRm9yIGV4YW1wbGUsIGZpeHVwcyBhcmUgcHJvY2Vzc2VkCithZnRlciBhbGwgaW5wdXQgaGFzIGJlZW4gcmVhZCwgYnV0IG1lc3NhZ2VzIGFib3V0IGZpeHVwcyBzaG91bGQgcmVmZXIgdG8gdGhlCitvcmlnaW5hbCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIgdGhhdCB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIEB7QH0gdm9pZCBmcHJpbnRfdmFsdWUgKEZJTEUgKkB2YXJ7ZmlsZX0sIHZhbHVlVCBAdmFye3ZhbH0pCitAZGVmdHlwZWZ1bnggQHtAfSB2b2lkIHNwcmludF92YWx1ZSAoY2hhciAqQHZhcntidWZ9LCB2YWx1ZVQgQHZhcnt2YWx9KQorVGhlc2UgZnVuY3Rpb25zIGFyZSBoZWxwZnVsIGZvciBjb252ZXJ0aW5nIGEgQGNvZGV7dmFsdWVUfSB2YWx1ZSBpbnRvIHByaW50YWJsZQorZm9ybWF0LCBpbiBjYXNlIGl0J3Mgd2lkZXIgdGhhbiBtb2RlcyB0aGF0IEBjb2RleypwcmludGZ9IGNhbiBoYW5kbGUuICBJZiB0aGUKK3R5cGUgaXMgbmFycm93IGVub3VnaCwgYSBkZWNpbWFsIG51bWJlciB3aWxsIGJlIHByb2R1Y2VkOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUKK2luIGhleGFkZWNpbWFsLiAgVGhlIHZhbHVlIGl0c2VsZiBpcyBub3QgZXhhbWluZWQgdG8gbWFrZSB0aGlzIGRldGVybWluYXRpb24uCitAZW5kIGRlZnR5cGVmdW4KKworQG5vZGUgSGFzaCB0YWJsZXMKK0BzdWJzZWN0aW9uIEhhc2ggdGFibGVzCitAY2luZGV4IGhhc2ggdGFibGVzCisKK0BkZWZ0eXBlZnVuIEB7QH0gQHtzdHJ1Y3QgaGFzaF9jb250cm9sICpAfSBoYXNoX25ldyAodm9pZCkKK0NyZWF0ZXMgdGhlIGhhc2ggdGFibGUgY29udHJvbCBzdHJ1Y3R1cmUuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGhhc2hfZGllIChzdHJ1Y3QgaGFzaF9jb250cm9sICopCitEZXN0cm95IGEgaGFzaCB0YWJsZS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBAe0B9IFBUUiBoYXNoX2RlbGV0ZSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICopCitEZWxldGVzIGVudHJ5IGZyb20gdGhlIGhhc2ggdGFibGUsIHJldHVybnMgdGhlIHZhbHVlIGl0IGhhZC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBAe0B9IFBUUiBoYXNoX3JlcGxhY2UgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCitVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgYW4gZW50cnkgYWxyZWFkeSBpbiB0aGUgdGFibGUsIHJldHVybmluZyB0aGUgb2xkIHZhbHVlLgorSWYgbm8gZW50cnkgd2FzIGZvdW5kLCBqdXN0IHJldHVybnMgTlVMTC4KK0BlbmQgZGVmdHlwZWZ1bgorCitAZGVmdHlwZWZ1biBAe0B9IEB7Y29uc3QgY2hhciAqQH0gaGFzaF9pbnNlcnQgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqLCBQVFIpCitJbnNlcnRpbmcgYSB2YWx1ZSBhbHJlYWR5IGluIHRoZSB0YWJsZSBpcyBhbiBlcnJvci4KK1JldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIEB7QH0gQHtjb25zdCBjaGFyICpAfSBoYXNoX2phbSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKK0luc2VydHMgaWYgdGhlIHZhbHVlIGlzbid0IGFscmVhZHkgcHJlc2VudCwgdXBkYXRlcyBpdCBpZiBpdCBpcy4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBUZXN0IHN1aXRlCitAc2VjdGlvbiBUZXN0IHN1aXRlCitAY2luZGV4IHRlc3Qgc3VpdGUKKworVGhlIHRlc3Qgc3VpdGUgaXMga2luZCBvZiBsYW1lIGZvciBtb3N0IHByb2Nlc3NvcnMuICBPZnRlbiBpdCBvbmx5IGNoZWNrcyB0bworc2VlIGlmIGEgY291cGxlIG9mIGZpbGVzIGNhbiBiZSBhc3NlbWJsZWQgd2l0aG91dCB0aGUgYXNzZW1ibGVyIHJlcG9ydGluZyBhbnkKK2Vycm9ycy4gIEZvciBtb3JlIGNvbXBsZXRlIHRlc3RpbmcsIHdyaXRlIGEgdGVzdCB3aGljaCBlaXRoZXIgZXhhbWluZXMgdGhlCithc3NlbWJsZXIgbGlzdGluZywgb3IgcnVucyBAY29kZXtvYmpkdW1wfSBhbmQgZXhhbWluZXMgaXRzIG91dHB1dC4gIEZvciB0aGUKK2xhdHRlciwgdGhlIFRDTCBwcm9jZWR1cmUgQGNvZGV7cnVuX2R1bXBfdGVzdH0gbWF5IGNvbWUgaW4gaGFuZHkuICBJdCB0YWtlcyB0aGUKK2Jhc2UgbmFtZSBvZiBhIGZpbGUsIGFuZCBsb29rcyBmb3IgQGZpbGV7QHZhcntmaWxlfS5kfS4gIFRoaXMgZmlsZSBzaG91bGQKK2NvbnRhaW4gYXMgaXRzIGluaXRpYWwgbGluZXMgYSBzZXQgb2YgdmFyaWFibGUgc2V0dGluZ3MgaW4gQHNhbXB7I30gY29tbWVudHMsCitpbiB0aGUgZm9ybToKKworQGV4YW1wbGUKKyAgICAgICAgI0B2YXJ7dmFybmFtZX06IEB2YXJ7dmFsdWV9CitAZW5kIGV4YW1wbGUKKworVGhlIEB2YXJ7dmFybmFtZX0gbWF5IGJlIEBjb2Rle29iamR1bXB9LCBAY29kZXtubX0sIG9yIEBjb2Rle2FzfSwgaW4gd2hpY2ggY2FzZQoraXQgc3BlY2lmaWVzIHRoZSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUgc3BlY2lmaWVkIHByb2dyYW1zLiAgRXhhY3RseSBvbmUKK29mIEBjb2Rle29iamR1bXB9IG9yIEBjb2Rle25tfSBtdXN0IGJlIHNwZWNpZmllZCwgYXMgdGhhdCBhbHNvIHNwZWNpZmllcyB3aGljaAorcHJvZ3JhbSB0byBydW4gYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQuICBJZiBAdmFye3Zhcm5hbWV9IGlzCitAY29kZXtzb3VyY2V9LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlOyBvdGhlcndpc2UsCitAZmlsZXtAdmFye2ZpbGV9LnN9IGlzIHVzZWQuICBJZiBAdmFye3Zhcm5hbWV9IGlzIEBjb2Rle25hbWV9LCBpdCBzcGVjaWZpZXMgdGhlCituYW1lIG9mIHRoZSB0ZXN0IHRvIGJlIHVzZWQgaW4gdGhlIEBjb2Rle3Bhc3N9IG9yIEBjb2Rle2ZhaWx9IG1lc3NhZ2VzLgorCitUaGUgbm9uLWNvbW1lbnRlZCBwYXJ0cyBvZiB0aGUgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgYXMgcmVndWxhciBleHByZXNzaW9ucywgb25lCitwZXIgbGluZS4gIEJsYW5rIGxpbmVzIGluIHRoZSBAY29kZXtvYmpkdW1wfSBvciBAY29kZXtubX0gb3V0cHV0IGFyZSBza2lwcGVkLAorYXMgYXJlIGJsYW5rIGxpbmVzIGluIHRoZSBAY29kZXsuZH0gZmlsZTsgdGhlIG90aGVyIGxpbmVzIGFyZSB0ZXN0ZWQgdG8gc2VlIGlmCit0aGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHByb2dyYW0gb3V0cHV0LiAgSWYgaXQgZG9lcyBub3QsIHRoZSB0ZXN0CitmYWlscy4KKworTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhlIHRlc3RzIG11c3QgYmUgbW9kaWZpZWQgaWYgdGhlIEBjb2Rle29iamR1bXB9IG91dHB1dAorc3R5bGUgaXMgY2hhbmdlZC4KKworQGJ5ZQorQGMgTG9jYWwgVmFyaWFibGVzOgorQGMgZmlsbC1jb2x1bW46IDc5CitAYyBFbmQ6CmRpZmYgLS1naXQgYS9nYXMvZWNvZmYuYyBiL2dhcy9lY29mZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzkzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZWNvZmYuYwpAQCAtMCwwICsxLDUzMDggQEAKKy8qIEVDT0ZGIGRlYnVnZ2luZyBzdXBwb3J0LgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKyAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gIEEKKyAgIGdvb2QgZGVhbCBvZiBpdCBjb21lcyBkaXJlY3RseSBmcm9tIG1pcHMtdGZpbGUuYywgYnkgTWljaGFlbAorICAgTWVpc3NuZXIgPG1laXNzbmVyQG9zZi5vcmc+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhcy5oIgorCisvKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgY29uZGl0aW9uYWxseSBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCB1c2UKKyAgIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoZS5nLiwgTUlQUyBFQ09GRiwgTUlQUyBFTEYsIEFscGhhCisgICBFQ09GRikuICAqLworCisjaWZkZWYgRUNPRkZfREVCVUdHSU5HCisKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgorI2luY2x1ZGUgImVjb2ZmLmgiCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogV2h5IGlzbid0IHRoaXMgaW4gY29mZi9zeW0uaD8gICovCisjZGVmaW5lIFNUX1JGREVTQ0FQRSAweGZmZgorCisvKiBUaGlzIGZpbGUgY29uc3RydWN0cyB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nCisgICBmb3JtYXQuICBJdCBqdXN0IGJ1aWxkcyBhIGxhcmdlIGJsb2NrIG9mIGRhdGEuCisKKyAgIFdlIHN1cHBvcnQgYm90aCBFQ09GRiBzdHlsZSBkZWJ1Z2dpbmcgYW5kIHN0YWJzIGRlYnVnZ2luZyAodGhlCisgICBzdGFicyBzeW1ib2xzIGFyZSBlbmNhcHN1bGF0ZWQgaW4gRUNPRkYgc3ltYm9scykuICBUaGlzIHNob3VsZCBsZXQKKyAgIHVzIGhhbmRsZSBhbnl0aGluZyB0aGUgY29tcGlsZXIgbWlnaHQgdGhyb3cgYXQgdXMuICAqLworCisvKiBIZXJlIGlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIE1JUFMgRUNPRkYgc3ltYm9sIHRhYmxlLCBieQorICAgTWljaGFlbCBNZWlzc25lci4gIFRoZSBNSVBTIHN5bWJvbCB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBwaWVjZXM6CisKKwlTeW1ib2xpYyBIZWFkZXIKKwkgICAgfAorCSAgICArLS0JQXV4aWxpYXJ5IFN5bWJvbHMKKwkgICAgfAorCSAgICArLS0JRGVuc2UgbnVtYmVyIHRhYmxlCisJICAgIHwKKwkgICAgKy0tCU9wdGltaXplciBTeW1ib2xzCisJICAgIHwKKwkgICAgKy0tCUV4dGVybmFsIFN0cmluZ3MKKwkgICAgfAorCSAgICArLS0JRXh0ZXJuYWwgU3ltYm9scworCSAgICB8CisJICAgICstLQlSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzCisJICAgIHwKKwkgICAgKy0tCUZpbGUgdGFibGUKKwkJICAgIHwKKwkJICAgICstLQlQcm9jZWR1cmUgdGFibGUKKwkJICAgIHwKKwkJICAgICstLQlMaW5lIG51bWJlciB0YWJsZQorCQkgICAgfAorCQkgICAgKy0tCUxvY2FsIFN0cmluZ3MKKwkJICAgIHwKKwkJICAgICstLQlMb2NhbCBTeW1ib2xzCisKKyAgIFRoZSBzeW1ib2xpYyBoZWFkZXIgcG9pbnRzIHRvIGVhY2ggb2YgdGhlIG90aGVyIHRhYmxlcywgYW5kIGFsc28KKyAgIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIEl0IGFsc28gY29udGFpbnMgYSBtYWdpYyBudW1iZXIKKyAgIGFuZCBNSVBTIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIDIuMC4KKworICAgVGhlIGF1eGlsaWFyeSB0YWJsZSBpcyBhIHNlcmllcyBvZiAzMiBiaXQgaW50ZWdlcnMsIHRoYXQgYXJlCisgICByZWZlcmVuY2VkIGFzIG5lZWRlZCBmcm9tIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUuICBVbmxpa2Ugc3RhbmRhcmQKKyAgIENPRkYsIHRoZSBhdXguICBpbmZvcm1hdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIHN5bWJvbCB0aGF0IHVzZXMKKyAgIGl0LCBidXQgcmF0aGVyIGlzIGEgc2VwYXJhdGUgdGFibGUuICBJbiB0aGVvcnksIHRoaXMgd291bGQgYWxsb3cKKyAgIHRoZSBNSVBTIGNvbXBpbGVycyB0byBjb2xsYXBzZSBkdXBsaWNhdGUgYXV4LiBlbnRyaWVzLCBidXQgSSd2ZSBub3QKKyAgIG5vdGljZWQgdGhpcyBoYXBwZW5pbmcgd2l0aCB0aGUgMS4zMSBjb21waWxlciBzdWl0ZS4gIFRoZSBkaWZmZXJlbnQKKyAgIHR5cGVzIG9mIGF1eC4gZW50cmllcyBhcmU6CisKKyAgICAxKQlkbkxvdzogTG93IGJvdW5kIG9uIGFycmF5IGRpbWVuc2lvbi4KKworICAgIDIpCWRuSGlnaDogSGlnaCBib3VuZCBvbiBhcnJheSBkaW1lbnNpb24uCisKKyAgICAzKQlpc3ltOiBJbmRleCB0byB0aGUgbG9jYWwgc3ltYm9sIHdoaWNoIGlzIHRoZSBzdGFydCBvZiB0aGUKKwlmdW5jdGlvbiBmb3IgdGhlIGVuZCBvZiBmdW5jdGlvbiBmaXJzdCBhdXguIGVudHJ5LgorCisgICAgNCkJd2lkdGg6IFdpZHRoIG9mIHN0cnVjdHVyZXMgYW5kIGJpdGZpZWxkcy4KKworICAgIDUpCWNvdW50OiBDb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgcGFydC4KKworICAgIDYpCXJuZHg6IEEgcmVsYXRpdmUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIHJlbGF0aXZlCisJaW5kZXggZmllbGQgaGFzIHR3byBwYXJ0czogcmZkIHdoaWNoIGlzIGEgcG9pbnRlciBpbnRvIHRoZQorCXJlbGF0aXZlIGZpbGUgaW5kZXggdGFibGUgb3IgU1RfUkZERVNDQVBFIHdoaWNoIHNheXMgdGhlIG5leHQKKwlhdXguIGVudHJ5IGlzIHRoZSBmaWxlIG51bWJlciwgYW5kIGluZGV4OiB3aGljaCBpcyB0aGUgcG9pbnRlcgorCWludG8gdGhlIGxvY2FsIHN5bWJvbCB3aXRoaW4gYSBnaXZlbiBmaWxlIHRhYmxlLiAgVGhpcyBpcyBmb3IKKwl0aGluZ3MgbGlrZSByZWZlcmVuY2VzIHRvIHR5cGVzIGRlZmluZWQgaW4gYW5vdGhlciBmaWxlLgorCisgICAgNykJVHlwZSBpbmZvcm1hdGlvbjogVGhpcyBpcyBsaWtlIHRoZSBDT0ZGIHR5cGUgYml0cywgZXhjZXB0IGl0CisJaXMgMzIgYml0cyBpbnN0ZWFkIG9mIDE2OyB0aGV5IHN0aWxsIGhhdmUgcm9vbSB0byBhZGQgbmV3CisJYmFzaWMgdHlwZXM7IGFuZCB0aGV5IGNhbiBoYW5kbGUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5LAorCXBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuICBFYWNoIHR5cGUgaW5mb3JtYXRpb24gZmllbGQgY29udGFpbnMKKwl0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzOgorCisJICAgIGEpCWZCaXRmaWVsZDogYSBiaXQgdGhhdCBzYXlzIHRoaXMgaXMgYSBiaXRmaWVsZCwgYW5kIHRoZQorCQlzaXplIGluIGJpdHMgZm9sbG93cyBhcyB0aGUgbmV4dCBhdXguIGVudHJ5LgorCisJICAgIGIpCWNvbnRpbnVlZDogYSBiaXQgdGhhdCBzYXlzIHRoZSBuZXh0IGF1eC4gZW50cnkgaXMgYQorCQljb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAoaW4gY2FzZQorCQl0aGVyZSBhcmUgbW9yZSB0aGFuIDYgbGV2ZWxzIG9mIGFycmF5L3B0ci9mdW5jdGlvbikuCisKKwkgICAgYykJYnQ6IGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgYmFzZSB0eXBlIGJlZm9yZSBhZGRpbmcKKwkJYXJyYXksIHBvaW50ZXIsIGZ1bmN0aW9uLCBldGMuIHF1YWxpZmllcnMuICBUaGUKKwkJY3VycmVudCBiYXNlIHR5cGVzIHRoYXQgSSBoYXZlIGRvY3VtZW50YXRpb24gZm9yIGFyZToKKworCQkJYnROaWwJCS0tIHVuZGVmaW5lZAorCQkJYnRBZHIJCS0tIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwdHIKKwkJCWJ0Q2hhcgkJLS0gY2hhcmFjdGVyCisJCQlidFVDaGFyCQktLSB1bnNpZ25lZCBjaGFyYWN0ZXIKKwkJCWJ0U2hvcnQJCS0tIHNob3J0CisJCQlidFVTaG9ydAktLSB1bnNpZ25lZCBzaG9ydAorCQkJYnRJbnQJCS0tIGludAorCQkJYnRVSW50CQktLSB1bnNpZ25lZCBpbnQKKwkJCWJ0TG9uZwkJLS0gbG9uZworCQkJYnRVTG9uZwkJLS0gdW5zaWduZWQgbG9uZworCQkJYnRGbG9hdAkJLS0gZmxvYXQgKHJlYWwpCisJCQlidERvdWJsZQktLSBEb3VibGUgKHJlYWwpCisJCQlidFN0cnVjdAktLSBTdHJ1Y3R1cmUgKFJlY29yZCkKKwkJCWJ0VW5pb24JCS0tIFVuaW9uICh2YXJpYW50KQorCQkJYnRFbnVtCQktLSBFbnVtZXJhdGVkCisJCQlidFR5cGVkZWYJLS0gZGVmaW5lZCB2aWEgYSB0eXBlZGVmIGlzeW1SZWYKKwkJCWJ0UmFuZ2UJCS0tIHN1YnJhbmdlIG9mIGludAorCQkJYnRTZXQJCS0tIHBhc2NhbCBzZXRzCisJCQlidENvbXBsZXgJLS0gZm9ydHJhbiBjb21wbGV4CisJCQlidERDb21wbGV4CS0tIGZvcnRyYW4gZG91YmxlIGNvbXBsZXgKKwkJCWJ0SW5kaXJlY3QJLS0gZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYKKwkJCWJ0Rml4ZWREZWMJLS0gRml4ZWQgRGVjaW1hbAorCQkJYnRGbG9hdERlYwktLSBGbG9hdCBEZWNpbWFsCisJCQlidFN0cmluZwktLSBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nCisJCQlidEJpdAkJLS0gQWxpZ25lZCBCaXQgU3RyaW5nCisJCQlidFBpY3R1cmUJLS0gUGljdHVyZQorCQkJYnRWb2lkCQktLSBWb2lkIChNSVBTIGNjIHJldmlzaW9uID49IDIuMDApCisKKwkgICAgZCkJdHEwIC0gdHE1OiB0eXBlIHF1YWxpZmllciBmaWVsZHMgYXMgbmVlZGVkLiAgVGhlCisJCWN1cnJlbnQgdHlwZSBxdWFsaWZpZXIgZmllbGRzIEkgaGF2ZSBkb2N1bWVudGF0aW9uIGZvcgorCQlhcmU6CisKKwkJCXRxTmlsCQktLSBubyBtb3JlIHF1YWxpZmllcnMKKwkJCXRxUHRyCQktLSBwb2ludGVyCisJCQl0cVByb2MJCS0tIHByb2NlZHVyZQorCQkJdHFBcnJheQkJLS0gYXJyYXkKKwkJCXRxRmFyCQktLSA4MDg2IGZhciBwb2ludGVycworCQkJdHFWb2wJCS0tIHZvbGF0aWxlCisKKworICAgVGhlIGRlbnNlIG51bWJlciB0YWJsZSBpcyB1c2VkIGluIHRoZSBmcm9udCBlbmRzLCBhbmQgZGlzYXBwZWFycyBieQorICAgdGhlIHRpbWUgdGhlIC5vIGlzIGNyZWF0ZWQuCisKKyAgIFdpdGggdGhlIDEuMzEgY29tcGlsZXIgc3VpdGUsIHRoZSBvcHRpbWl6YXRpb24gc3ltYm9scyBkb24ndCBzZWVtCisgICB0byBiZSB1c2VkIGFzIGZhciBhcyBJIGNhbiB0ZWxsLgorCisgICBUaGUgbGlua2VyIGlzIHRoZSBmaXJzdCBlbnRpdHkgdGhhdCBjcmVhdGVzIHRoZSByZWxhdGl2ZSBmaWxlCisgICBkZXNjcmlwdG9yIHRhYmxlLCBhbmQgSSBiZWxpZXZlIGl0IGlzIHVzZWQgc28gdGhhdCB0aGUgaW5kaXZpZHVhbAorICAgZmlsZSB0YWJsZSBwb2ludGVycyBkb24ndCBoYXZlIHRvIGJlIHJld3JpdHRlbiB3aGVuIHRoZSBvYmplY3RzIGFyZQorICAgbWVyZ2VkIHRvZ2V0aGVyIGludG8gdGhlIHByb2dyYW0gZmlsZS4KKworICAgVW5saWtlIENPRkYsIHRoZSBiYXNpYyBzeW1ib2wgJiBzdHJpbmcgdGFibGVzIGFyZSBzcGxpdCBpbnRvCisgICBleHRlcm5hbCBhbmQgbG9jYWwgc3ltYm9scy9zdHJpbmdzLiAgVGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24KKyAgIG9ubHkgZ29lcyBvZmYgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZSwgYW5kIHRoZSBkZWJ1ZworICAgaW5mb3JtYXRpb24gb25seSBnb2VzIG9mZiBvZiB0aGUgaW50ZXJuYWwgc3ltYm9sIHRhYmxlLiAgVGhlCisgICBleHRlcm5hbCBzeW1ib2xzIGNhbiBoYXZlIGxpbmtzIHRvIGFuIGFwcHJvcHJpYXRlIGZpbGUgaW5kZXggYW5kCisgICBzeW1ib2wgd2l0aGluIHRoZSBmaWxlIHRvIGdpdmUgaXQgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW5mb3JtYXRpb24uCisgICBCZWNhdXNlIG9mIHRoaXMsIHRoZSBleHRlcm5hbCBzeW1ib2xzIGFyZSBhY3R1YWxseSBsYXJnZXIgdGhhbiB0aGUKKyAgIGludGVybmFsIHN5bWJvbHMgKHRvIGNvbnRhaW4gdGhlIGxpbmsgaW5mb3JtYXRpb24pLCBhbmQgY29udGFpbiB0aGUKKyAgIGxvY2FsIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgYSBtZW1iZXIsIHRob3VnaCB0aGlzIG1lbWJlciBpcyBub3QgdGhlCisgICBmaXJzdCBtZW1iZXIgb2YgdGhlIGV4dGVybmFsIHN5bWJvbCBzdHJ1Y3R1cmUgKCEpLiAgSSBzdXNwZWN0IHRoaXMKKyAgIHNwbGl0IGlzIHRvIG1ha2Ugc3RyaXAgZWFzaWVyIHRvIGRlYWwgd2l0aC4KKworICAgRWFjaCBmaWxlIHRhYmxlIGhhcyBvZmZzZXRzIGZvciB3aGVyZSB0aGUgbGluZSBudW1iZXJzLCBsb2NhbAorICAgc3RyaW5ncywgbG9jYWwgc3ltYm9scywgYW5kIHByb2NlZHVyZSB0YWJsZSBzdGFydHMgZnJvbSB3aXRoaW4gdGhlCisgICBnbG9iYWwgdGFibGVzLCBhbmQgdGhlIGluZGV4cyBhcmUgcmVzZXQgdG8gMCBmb3IgZWFjaCBvZiB0aG9zZQorICAgdGFibGVzIGZvciB0aGUgZmlsZS4KKworICAgVGhlIHByb2NlZHVyZSB0YWJsZSBjb250YWlucyB0aGUgYmluYXJ5IGVxdWl2YWxlbnRzIG9mIHRoZSAuZW50CisgICAoc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGFkZHJlc3MpLCAuZnJhbWUgKHdoYXQgcmVnaXN0ZXIgaXMgdGhlCisgICB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIsIGNvbnN0YW50IG9mZnNldCBmcm9tIHRoZSByZWdpc3RlciB0byBvYnRhaW4KKyAgIHRoZSBWRlAsIGFuZCB3aGF0IHJlZ2lzdGVyIGhvbGRzIHRoZSByZXR1cm4gYWRkcmVzcyksIC5tYXNrLy5mbWFzaworICAgKGJpdG1hc2sgb2Ygc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgd2hlcmUgdGhlIGZpcnN0IHJlZ2lzdGVyIGlzIHN0b3JlZAorICAgcmVsYXRpdmUgdG8gdGhlIFZGUCkgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuICBJdCBhbHNvIGNvbnRhaW5zIHRoZQorICAgbG93IGFuZCBoaWdoIGJvdW5kcyBvZiB0aGUgbGluZSBudW1iZXJzIGlmIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCisKKyAgIFRoZSBsaW5lIG51bWJlciB0YWJsZSBpcyBhIGNvbXByZXNzZWQgZm9ybSBvZiB0aGUgbm9ybWFsIENPRkYgbGluZQorICAgdGFibGUuICBFYWNoIGxpbmUgbnVtYmVyIGVudHJ5IGlzIGVpdGhlciAxIG9yIDMgYnl0ZXMgbG9uZywgYW5kCisgICBjb250YWlucyBhIHNpZ25lZCBkZWx0YSBmcm9tIHRoZSBwcmV2aW91cyBsaW5lLCBhbmQgYW4gdW5zaWduZWQKKyAgIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoaXMgc3RhdGVtZW50IHRha2VzLgorCisgICBUaGUgbG9jYWwgc3ltYm9sIHRhYmxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorCisgICAgMSkJaXNzOiBpbmRleCB0byB0aGUgbG9jYWwgc3RyaW5nIHRhYmxlIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUKKwlzeW1ib2wuCisKKyAgICAyKQl2YWx1ZTogdmFsdWUgb2YgdGhlIHN5bWJvbCAoYWRkcmVzcywgcmVnaXN0ZXIgbnVtYmVyLCBldGMuKS4KKworICAgIDMpCXN0OiBzeW1ib2wgdHlwZS4gIFRoZSBjdXJyZW50IHN5bWJvbCB0eXBlcyBhcmU6CisKKwkgICAgc3ROaWwJICAtLSBOdXRoaW4nIHNwZWNpYWwKKwkgICAgc3RHbG9iYWwJICAtLSBleHRlcm5hbCBzeW1ib2wKKwkgICAgc3RTdGF0aWMJICAtLSBzdGF0aWMKKwkgICAgc3RQYXJhbQkgIC0tIHByb2NlZHVyZSBhcmd1bWVudAorCSAgICBzdExvY2FsCSAgLS0gbG9jYWwgdmFyaWFibGUKKwkgICAgc3RMYWJlbAkgIC0tIGxhYmVsCisJICAgIHN0UHJvYwkgIC0tIEV4dGVybmFsIFByb2NlZHVyZQorCSAgICBzdEJsb2NrCSAgLS0gYmVnaW5uaW5nIG9mIGJsb2NrCisJICAgIHN0RW5kCSAgLS0gZW5kIChvZiBhbnl0aGluZykKKwkgICAgc3RNZW1iZXIJICAtLSBtZW1iZXIgKG9mIGFueXRoaW5nKQorCSAgICBzdFR5cGVkZWYJICAtLSB0eXBlIGRlZmluaXRpb24KKwkgICAgc3RGaWxlCSAgLS0gZmlsZSBuYW1lCisJICAgIHN0UmVnUmVsb2MJICAtLSByZWdpc3RlciByZWxvY2F0aW9uCisJICAgIHN0Rm9yd2FyZAkgIC0tIGZvcndhcmRpbmcgYWRkcmVzcworCSAgICBzdFN0YXRpY1Byb2MgIC0tIFN0YXRpYyBwcm9jZWR1cmUKKwkgICAgc3RDb25zdGFudAkgIC0tIGNvbnN0CisKKyAgICA0KQlzYzogc3RvcmFnZSBjbGFzcy4gIFRoZSBjdXJyZW50IHN0b3JhZ2UgY2xhc3NlcyBhcmU6CisKKwkgICAgc2NUZXh0CSAgLS0gdGV4dCBzeW1ib2wKKwkgICAgc2NEYXRhCSAgLS0gaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wKKwkgICAgc2NCc3MJICAtLSB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbAorCSAgICBzY1JlZ2lzdGVyCSAgLS0gdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlcgorCSAgICBzY0FicwkgIC0tIHZhbHVlIG9mIHN5bWJvbCBpcyBhYnNvbHV0ZQorCSAgICBzY1VuZGVmaW5lZCAgIC0tIHdobyBrbm93cz8KKwkgICAgc2NDZGJMb2NhbAkgIC0tIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gc2UtPnZhLj8/CisJICAgIHNjQml0cwkgIC0tIHRoaXMgaXMgYSBiaXQgZmllbGQKKwkgICAgc2NDZGJTeXN0ZW0JICAtLSB2YWx1ZSBpcyBJTiBkZWJ1Z2dlcidzIGFkZHJlc3Mgc3BhY2UKKwkgICAgc2NSZWdJbWFnZQkgIC0tIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrCisJICAgIHNjSW5mbwkgIC0tIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbgorCSAgICBzY1VzZXJTdHJ1Y3QgIC0tIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcworCSAgICBzY1NEYXRhCSAgLS0gbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YQorCSAgICBzY1NCc3MJICAtLSBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24KKwkgICAgc2NSRGF0YQkgIC0tIGxvYWQgdGltZSBvbmx5IHJlYWQgb25seSBkYXRhCisJICAgIHNjVmFyCSAgLS0gVmFyIHBhcmFtZXRlciAoZm9ydHJhbnBhc2NhbCkKKwkgICAgc2NDb21tb24JICAtLSBjb21tb24gdmFyaWFibGUKKwkgICAgc2NTQ29tbW9uCSAgLS0gc21hbGwgY29tbW9uCisJICAgIHNjVmFyUmVnaXN0ZXIgLS0gVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyCisJICAgIHNjVmFyaWFudAkgIC0tIFZhcmlhbnQgcmVjb3JkCisJICAgIHNjU1VuZGVmaW5lZCAgLS0gc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhCisJICAgIHNjSW5pdAkgIC0tIC5pbml0IHNlY3Rpb24gc3ltYm9sCisKKyAgICA1KQlpbmRleDogcG9pbnRlciB0byBhIGxvY2FsIHN5bWJvbCBvciBhdXguIGVudHJ5LgorCisKKworICAgRm9yIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKKworCSNpbmNsdWRlIDxzdGRpby5oPgorCisJbWFpbigpeworCQlwcmludGYoIkhlbGxvIFdvcmxkIVxuIik7CisJCXJldHVybiAwOworCX0KKworICAgTWlwcy10ZHVtcCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorCisgICBHbG9iYWwgZmlsZSBoZWFkZXI6CisgICAgICAgbWFnaWMgbnVtYmVyICAgICAgICAgICAgIDB4MTYyCisgICAgICAgIyBzZWN0aW9ucyAgICAgICAgICAgICAgIDIKKyAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgNjQ1MzExNzk5LCBXZWQgSnVuIDEzIDE3OjE2OjM5IDE5OTAKKyAgICAgICBzeW1ib2xpYyBoZWFkZXIgb2Zmc2V0ICAgMjg0CisgICAgICAgc3ltYm9saWMgaGVhZGVyIHNpemUgICAgIDk2CisgICAgICAgb3B0aW9uYWwgaGVhZGVyICAgICAgICAgIDU2CisgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgIDB4MAorCisgICBTeW1ib2xpYyBoZWFkZXIsIG1hZ2ljIG51bWJlciA9IDB4NzAwOSwgdnN0YW1wID0gMS4zMToKKworICAgICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgTnVtYmVyICAgICAgIEJ5dGVzCisgICAgICAgPT09PSAgICAgICAgICAgICAgICAgICAgICA9PT09PT0gICAgICA9PT09PT0gICAgICA9PT09PQorCisgICAgICAgTGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAzODAgICAgICAgICAgIDQgICAgICAgICAgIDQgWzEzXQorICAgICAgIERlbnNlIG51bWJlcnMgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCisgICAgICAgUHJvY2VkdXJlcyBUYWJsZXMgICAgICAgICAgICAzODQgICAgICAgICAgIDEgICAgICAgICAgNTIKKyAgICAgICBMb2NhbCBTeW1ib2xzICAgICAgICAgICAgICAgIDQzNiAgICAgICAgICAxNiAgICAgICAgIDE5MgorICAgICAgIE9wdGltaXphdGlvbiBTeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCisgICAgICAgQXV4aWxpYXJ5IFN5bWJvbHMgICAgICAgICAgICA2MjggICAgICAgICAgMzkgICAgICAgICAxNTYKKyAgICAgICBMb2NhbCBTdHJpbmdzICAgICAgICAgICAgICAgIDc4NCAgICAgICAgICA4MCAgICAgICAgICA4MAorICAgICAgIEV4dGVybmFsIFN0cmluZ3MgICAgICAgICAgICAgODY0ICAgICAgICAgMTQ0ICAgICAgICAgMTQ0CisgICAgICAgRmlsZSBUYWJsZXMgICAgICAgICAgICAgICAgIDEwMDggICAgICAgICAgIDIgICAgICAgICAxNDQKKyAgICAgICBSZWxhdGl2ZSBGaWxlcyAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMAorICAgICAgIEV4dGVybmFsIFN5bWJvbHMgICAgICAgICAgICAxMTUyICAgICAgICAgIDIwICAgICAgICAgMzIwCisKKyAgIEZpbGUgIzAsICJoZWxsbzIuYyIKKworICAgICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCisgICAgICAgTWVyZ2UgICAgICAgPSBObyAgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCisgICAgICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQworICAgICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAorCisgICAgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKKyAgICAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQorICAgICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgICAwICAgICAgICAgIDE1ICAgICAgICAgIDE1ICAgICAgICAgNzg0CisgICAgICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDYgICAgICAgICAgNzIgICAgICAgICA0MzYKKyAgICAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAxMyAgICAgICAgICAxMyAgICAgICAgIDM4MAorICAgICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCisgICAgICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgNTIgICAgICAgICAzODQKKyAgICAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAgMCAgICAgICAgICAxNCAgICAgICAgICA1NiAgICAgICAgIDYyOAorICAgICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCisKKyAgICBUaGVyZSBhcmUgNiBsb2NhbCBzeW1ib2xzLCBzdGFydGluZyBhdCA0MzYKKworCVN5bWJvbCMgMDogImhlbGxvMi5jIgorCSAgICBFbmQrMSBzeW1ib2wgID0gNgorCSAgICBTdHJpbmcgaW5kZXggID0gMQorCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gNgorCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxOiAibWFpbiIKKwkgICAgRW5kKzEgc3ltYm9sICA9IDUKKwkgICAgVHlwZSAgICAgICAgICA9IGludAorCSAgICBTdHJpbmcgaW5kZXggID0gMTAKKwkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEyCisJICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCisKKwlTeW1ib2wjIDI6ICIiCisJICAgIEVuZCsxIHN5bWJvbCAgPSA0CisJICAgIFN0cmluZyBpbmRleCAgPSAwCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSA0CisJICAgIFN5bWJvbCB0eXBlICAgPSBCbG9jayAgICAgICBWYWx1ZSAgPSA4CisKKwlTeW1ib2wjIDM6ICIiCisJICAgIEZpcnN0IHN5bWJvbCAgPSAyCisJICAgIFN0cmluZyBpbmRleCAgPSAwCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAyCisJICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAyOAorCisJU3ltYm9sIyA0OiAibWFpbiIKKwkgICAgRmlyc3Qgc3ltYm9sICA9IDEKKwkgICAgU3RyaW5nIGluZGV4ICA9IDEwCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxCisJICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSA1MgorCisJU3ltYm9sIyA1OiAiaGVsbG8yLmMiCisJICAgIEZpcnN0IHN5bWJvbCAgPSAwCisJICAgIFN0cmluZyBpbmRleCAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCisJICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCisKKyAgICBUaGVyZSBhcmUgMTQgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDYyOC4KKworCSogIzAgICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KKwkqICMxICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCisJKiAjMiAgICAgICAgICAgICAgIDgsIFsgICA4LyAgICAgIDBdLCBbIDIgMDowIDA6MDowOjA6MDowXQorCSogIzMgICAgICAgICAgICAgIDE2LCBbICAxNi8gICAgICAwXSwgWyA0IDA6MCAwOjA6MDowOjA6MF0KKwkqICM0ICAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCisJKiAjNSAgICAgICAgICAgICAgMzIsIFsgIDMyLyAgICAgIDBdLCBbIDggMDowIDA6MDowOjA6MDowXQorCSogIzYgICAgICAgICAgICAgIDQwLCBbICA0MC8gICAgICAwXSwgWzEwIDA6MCAwOjA6MDowOjA6MF0KKwkqICM3ICAgICAgICAgICAgICA0NCwgWyAgNDQvICAgICAgMF0sIFsxMSAwOjAgMDowOjA6MDowOjBdCisJKiAjOCAgICAgICAgICAgICAgMTIsIFsgIDEyLyAgICAgIDBdLCBbIDMgMDowIDA6MDowOjA6MDowXQorCSogIzkgICAgICAgICAgICAgIDIwLCBbICAyMC8gICAgICAwXSwgWyA1IDA6MCAwOjA6MDowOjA6MF0KKwkqICMxMCAgICAgICAgICAgICAyOCwgWyAgMjgvICAgICAgMF0sIFsgNyAwOjAgMDowOjA6MDowOjBdCisJKiAjMTEgICAgICAgICAgICAgMzYsIFsgIDM2LyAgICAgIDBdLCBbIDkgMDowIDA6MDowOjA6MDowXQorCSAgIzEyICAgICAgICAgICAgICA1LCBbICAgNS8gICAgICAwXSwgWyAxIDE6MCAwOjA6MDowOjA6MF0KKwkgICMxMyAgICAgICAgICAgICAyNCwgWyAgMjQvICAgICAgMF0sIFsgNiAwOjAgMDowOjA6MDowOjBdCisKKyAgICBUaGVyZSBhcmUgMSBwcm9jZWR1cmUgZGVzY3JpcHRvciBlbnRyaWVzLCBzdGFydGluZyBhdCAwLgorCisJUHJvY2VkdXJlIGRlc2NyaXB0b3IgMDoKKwkgICAgTmFtZSBpbmRleCAgID0gMTAgICAgICAgICAgTmFtZSAgICAgICAgICA9ICJtYWluIgorCSAgICAubWFzayAweDgwMDAwMDAwLC00ICAgICAgICAuZm1hc2sgMHgwMDAwMDAwMCwwCisJICAgIC5mcmFtZSAkMjksMjQsJDMxCisJICAgIE9wdC4gc3RhcnQgICA9IC0xICAgICAgICAgIFN5bWJvbHMgc3RhcnQgPSAxCisJICAgIEZpcnN0IGxpbmUgIyA9IDMgICAgICAgICAgIExhc3QgbGluZSAjICAgPSA2CisJICAgIExpbmUgT2Zmc2V0ICA9IDAgICAgICAgICAgIEFkZHJlc3MgICAgICAgPSAweDAwMDAwMDAwCisKKwlUaGVyZSBhcmUgNCBieXRlcyBob2xkaW5nIGxpbmUgbnVtYmVycywgc3RhcnRpbmcgYXQgMzgwLgorCSAgICBMaW5lICAgICAgICAgICAzLCAgIGRlbHRhICAgICAwLCAgIGNvdW50ICAyCisJICAgIExpbmUgICAgICAgICAgIDQsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDMKKwkgICAgTGluZSAgICAgICAgICAgNSwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgMgorCSAgICBMaW5lICAgICAgICAgICA2LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICA2CisKKyAgIEZpbGUgIzEsICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKKworICAgIE5hbWUgaW5kZXggID0gMSAgICAgICAgICBSZWFkaW4gICAgICA9IE5vCisgICAgTWVyZ2UgICAgICAgPSBZZXMgICAgICAgIEVuZGlhbiAgICAgID0gTElUVExFCisgICAgRGVidWcgbGV2ZWwgPSBHMiAgICAgICAgIExhbmd1YWdlICAgID0gQworICAgIEFkciAgICAgICAgID0gMHgwMDAwMDAwMAorCisgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgICAgICBOdW1iZXIgICAgICAgIFNpemUgICAgICBPZmZzZXQKKyAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgICA9PT09PSAgICAgID09PT09PSAgICAgICAgPT09PSAgICAgID09PT09PQorICAgIExvY2FsIHN0cmluZ3MgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgIDY1ICAgICAgICAgIDY1ICAgICAgICAgNzk5CisgICAgTG9jYWwgc3ltYm9scyAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgMTAgICAgICAgICAxMjAgICAgICAgICA1MDgKKyAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgIDM4MAorICAgIE9wdGltaXphdGlvbiBzeW1ib2xzICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCisgICAgUHJvY2VkdXJlcyAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICA0MzYKKyAgICBBdXhpbGlhcnkgc3ltYm9scyAgICAgICAgICAgICAxNCAgICAgICAgICAyNSAgICAgICAgIDEwMCAgICAgICAgIDY4NAorICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCisKKyAgICBUaGVyZSBhcmUgMTAgbG9jYWwgc3ltYm9scywgc3RhcnRpbmcgYXQgNDQyCisKKwlTeW1ib2wjIDA6ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKKwkgICAgRW5kKzEgc3ltYm9sICA9IDEwCisJICAgIFN0cmluZyBpbmRleCAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxMAorCSAgICBTeW1ib2wgdHlwZSAgID0gRmlsZSAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxOiAiX2lvYnVmIgorCSAgICBFbmQrMSBzeW1ib2wgID0gOQorCSAgICBTdHJpbmcgaW5kZXggID0gMjIKKwkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDkKKwkgICAgU3ltYm9sIHR5cGUgICA9IEJsb2NrICAgICAgIFZhbHVlICA9IDIwCisKKwlTeW1ib2wjIDI6ICJfY250IgorCSAgICBUeXBlICAgICAgICAgID0gaW50CisJICAgIFN0cmluZyBpbmRleCAgPSAyOQorCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAorCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAzOiAiX3B0ciIKKwkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCisJICAgIFN0cmluZyBpbmRleCAgPSAzNAorCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTUKKwkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDMyCisKKwlTeW1ib2wjIDQ6ICJfYmFzZSIKKwkgICAgVHlwZSAgICAgICAgICA9IHB0ciB0byBjaGFyCisJICAgIFN0cmluZyBpbmRleCAgPSAzOQorCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMTYKKwkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDY0CisKKwlTeW1ib2wjIDU6ICJfYnVmc2l6IgorCSAgICBUeXBlICAgICAgICAgID0gaW50CisJICAgIFN0cmluZyBpbmRleCAgPSA0NQorCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gNAorCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gOTYKKworCVN5bWJvbCMgNjogIl9mbGFnIgorCSAgICBUeXBlICAgICAgICAgID0gc2hvcnQKKwkgICAgU3RyaW5nIGluZGV4ICA9IDUzCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAzCisJICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAxMjgKKworCVN5bWJvbCMgNzogIl9maWxlIgorCSAgICBUeXBlICAgICAgICAgID0gY2hhcgorCSAgICBTdHJpbmcgaW5kZXggID0gNTkKKwkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDIKKwkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDE0NAorCisJU3ltYm9sIyA4OiAiIgorCSAgICBGaXJzdCBzeW1ib2wgID0gMQorCSAgICBTdHJpbmcgaW5kZXggID0gMAorCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMQorCSAgICBTeW1ib2wgdHlwZSAgID0gRW5kICAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyA5OiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiCisJICAgIEZpcnN0IHN5bWJvbCAgPSAwCisJICAgIFN0cmluZyBpbmRleCAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAwCisJICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCisKKyAgICBUaGVyZSBhcmUgMjUgYXV4aWxpYXJ5IHRhYmxlIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDY0Mi4KKworCSogIzE0ICAgICAgICAgICAgIC0xLCBbNDA5NS8xMDQ4NTc1XSwgWzYzIDE6MSBmOmY6ZjpmOmY6Zl0KKwkgICMxNSAgICAgICAgICA2NTU0NCwgWyAgIDgvICAgICAxNl0sIFsgMiAwOjAgMTowOjA6MDowOjBdCisJICAjMTYgICAgICAgICAgNjU1NDQsIFsgICA4LyAgICAgMTZdLCBbIDIgMDowIDE6MDowOjA6MDowXQorCSogIzE3ICAgICAgICAgMTk2NjU2LCBbICA0OC8gICAgIDQ4XSwgWzEyIDA6MCAzOjA6MDowOjA6MF0KKwkqICMxOCAgICAgICAgICAgODE5MSwgWzQwOTUvICAgICAgMV0sIFs2MyAxOjEgMDowOjA6MDpmOjFdCisJKiAjMTkgICAgICAgICAgICAgIDEsIFsgICAxLyAgICAgIDBdLCBbIDAgMTowIDA6MDowOjA6MDowXQorCSogIzIwICAgICAgICAgIDIwNDc5LCBbNDA5NS8gICAgICA0XSwgWzYzIDE6MSAwOjA6MDowOmY6NF0KKwkqICMyMSAgICAgICAgICAgICAgMSwgWyAgIDEvICAgICAgMF0sIFsgMCAxOjAgMDowOjA6MDowOjBdCisJKiAjMjIgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQorCSogIzIzICAgICAgICAgICAgICAyLCBbICAgMi8gICAgICAwXSwgWyAwIDA6MSAwOjA6MDowOjA6MF0KKwkqICMyNCAgICAgICAgICAgIDE2MCwgWyAxNjAvICAgICAgMF0sIFs0MCAwOjAgMDowOjA6MDowOjBdCisJKiAjMjUgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQorCSogIzI2ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KKwkqICMyNyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCisJKiAjMjggICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQorCSogIzI5ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KKwkqICMzMCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCisJKiAjMzEgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQorCSogIzMyICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KKwkqICMzMyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCisJKiAjMzQgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQorCSogIzM1ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KKwkqICMzNiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCisJKiAjMzcgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQorCSogIzM4ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KKworICAgIFRoZXJlIGFyZSAwIHByb2NlZHVyZSBkZXNjcmlwdG9yIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDEuCisKKyAgIFRoZXJlIGFyZSAyMCBleHRlcm5hbCBzeW1ib2xzLCBzdGFydGluZyBhdCAxMTUyCisKKwlTeW1ib2wjIDA6ICJfaW9iIgorCSAgICBUeXBlICAgICAgICAgID0gYXJyYXkgWzMgezE2MH1dIG9mIHN0cnVjdCBfaW9idWYgeyBpZmQgPSAxLCBpbmRleCA9IDEgfQorCSAgICBTdHJpbmcgaW5kZXggID0gMCAgICAgICAgICAgSWZkICAgID0gMQorCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTcKKwkgICAgU3ltYm9sIHR5cGUgICA9IEdsb2JhbCAgICAgIFZhbHVlICA9IDYwCisKKwlTeW1ib2wjIDE6ICJmb3BlbiIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDUgICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgMjogImZkb3BlbiIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDExICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgMzogImZyZW9wZW4iCisJICAgIFN0cmluZyBpbmRleCAgPSAxOCAgICAgICAgICBJZmQgICAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1CisJICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCisKKwlTeW1ib2wjIDQ6ICJwb3BlbiIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDI2ICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgNTogInRtcGZpbGUiCisJICAgIFN0cmluZyBpbmRleCAgPSAzMiAgICAgICAgICBJZmQgICAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1CisJICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCisKKwlTeW1ib2wjIDY6ICJmdGVsbCIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDQwICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgNzogInJld2luZCIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDQ2ICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgODogInNldGJ1ZiIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDUzICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgOTogInNldGJ1ZmZlciIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDYwICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgMTA6ICJzZXRsaW5lYnVmIgorCSAgICBTdHJpbmcgaW5kZXggID0gNzAgICAgICAgICAgSWZkICAgID0gMQorCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQorCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxMTogImZnZXRzIgorCSAgICBTdHJpbmcgaW5kZXggID0gODEgICAgICAgICAgSWZkICAgID0gMQorCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQorCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxMjogImdldHMiCisJICAgIFN0cmluZyBpbmRleCAgPSA4NyAgICAgICAgICBJZmQgICAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1CisJICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCisKKwlTeW1ib2wjIDEzOiAiY3Rlcm1pZCIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDkyICAgICAgICAgIElmZCAgICA9IDEKKwkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworCVN5bWJvbCMgMTQ6ICJjdXNlcmlkIgorCSAgICBTdHJpbmcgaW5kZXggID0gMTAwICAgICAgICAgSWZkICAgID0gMQorCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQorCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxNTogInRlbXBuYW0iCisJICAgIFN0cmluZyBpbmRleCAgPSAxMDggICAgICAgICBJZmQgICAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1CisJICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCisKKwlTeW1ib2wjIDE2OiAidG1wbmFtIgorCSAgICBTdHJpbmcgaW5kZXggID0gMTE2ICAgICAgICAgSWZkICAgID0gMQorCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQorCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxNzogInNwcmludGYiCisJICAgIFN0cmluZyBpbmRleCAgPSAxMjMgICAgICAgICBJZmQgICAgPSAxCisJICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1CisJICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCisKKwlTeW1ib2wjIDE4OiAibWFpbiIKKwkgICAgVHlwZSAgICAgICAgICA9IGludAorCSAgICBTdHJpbmcgaW5kZXggID0gMTMxICAgICAgICAgSWZkICAgID0gMAorCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMQorCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAorCisJU3ltYm9sIyAxOTogInByaW50ZiIKKwkgICAgU3RyaW5nIGluZGV4ICA9IDEzNiAgICAgICAgIElmZCAgICA9IDAKKwkgICAgU3RvcmFnZSBjbGFzcyA9IFVuZGVmaW5lZCAgIEluZGV4ICA9IDEwNDg1NzUKKwkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKKworICAgVGhlIGZvbGxvd2luZyBhdXhpbGlhcnkgdGFibGUgZW50cmllcyB3ZXJlIHVudXNlZDoKKworICAgICMwICAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAorICAgICMyICAgICAgICAgICAgICAgOCAgMHgwMDAwMDAwOCAgY2hhcgorICAgICMzICAgICAgICAgICAgICAxNiAgMHgwMDAwMDAxMCAgc2hvcnQKKyAgICAjNCAgICAgICAgICAgICAgMjQgIDB4MDAwMDAwMTggIGludAorICAgICM1ICAgICAgICAgICAgICAzMiAgMHgwMDAwMDAyMCAgbG9uZworICAgICM2ICAgICAgICAgICAgICA0MCAgMHgwMDAwMDAyOCAgZmxvYXQKKyAgICAjNyAgICAgICAgICAgICAgNDQgIDB4MDAwMDAwMmMgIGRvdWJsZQorICAgICM4ICAgICAgICAgICAgICAxMiAgMHgwMDAwMDAwYyAgdW5zaWduZWQgY2hhcgorICAgICM5ICAgICAgICAgICAgICAyMCAgMHgwMDAwMDAxNCAgdW5zaWduZWQgc2hvcnQKKyAgICAjMTAgICAgICAgICAgICAgMjggIDB4MDAwMDAwMWMgIHVuc2lnbmVkIGludAorICAgICMxMSAgICAgICAgICAgICAzNiAgMHgwMDAwMDAyNCAgdW5zaWduZWQgbG9uZworICAgICMxNCAgICAgICAgICAgICAgMCAgMHgwMDAwMDAwMCAgdm9pZAorICAgICMxNSAgICAgICAgICAgICAyNCAgMHgwMDAwMDAxOCAgaW50CisgICAgIzE5ICAgICAgICAgICAgIDMyICAweDAwMDAwMDIwICBsb25nCisgICAgIzIwICAgICAgICAgICAgIDQwICAweDAwMDAwMDI4ICBmbG9hdAorICAgICMyMSAgICAgICAgICAgICA0NCAgMHgwMDAwMDAyYyAgZG91YmxlCisgICAgIzIyICAgICAgICAgICAgIDEyICAweDAwMDAwMDBjICB1bnNpZ25lZCBjaGFyCisgICAgIzIzICAgICAgICAgICAgIDIwICAweDAwMDAwMDE0ICB1bnNpZ25lZCBzaG9ydAorICAgICMyNCAgICAgICAgICAgICAyOCAgMHgwMDAwMDAxYyAgdW5zaWduZWQgaW50CisgICAgIzI1ICAgICAgICAgICAgIDM2ICAweDAwMDAwMDI0ICB1bnNpZ25lZCBsb25nCisgICAgIzI2ICAgICAgICAgICAgIDQ4ICAweDAwMDAwMDMwICBzdHJ1Y3Qgbm8gbmFtZSB7IGlmZCA9IC0xLCBpbmRleCA9IDEwNDg1NzUgfQorKi8KKwwKKy8qIFJlZGVmaW5pdGlvbiBvZiBvZiBzdG9yYWdlIGNsYXNzZXMgYXMgYW4gZW51bWVyYXRpb24gZm9yIGJldHRlcgorICAgZGVidWdnaW5nLiAgKi8KKwordHlwZWRlZiBlbnVtIHNjIHsKKyAgc2NfTmlsCSA9IHNjTmlsLAkgIC8qIG5vIHN0b3JhZ2UgY2xhc3MgKi8KKyAgc2NfVGV4dAkgPSBzY1RleHQsCSAgLyogdGV4dCBzeW1ib2wgKi8KKyAgc2NfRGF0YQkgPSBzY0RhdGEsCSAgLyogaW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KKyAgc2NfQnNzCSA9IHNjQnNzLAkgIC8qIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sICovCisgIHNjX1JlZ2lzdGVyCSA9IHNjUmVnaXN0ZXIsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLworICBzY19BYnMJID0gc2NBYnMsCSAgLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCisgIHNjX1VuZGVmaW5lZAkgPSBzY1VuZGVmaW5lZCwJICAvKiB3aG8ga25vd3M/ICovCisgIHNjX0NkYkxvY2FsCSA9IHNjQ2RiTG9jYWwsCSAgLyogdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8gKi8KKyAgc2NfQml0cwkgPSBzY0JpdHMsCSAgLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLworICBzY19DZGJTeXN0ZW0JID0gc2NDZGJTeXN0ZW0sCSAgLyogdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLworICBzY19SZWdJbWFnZQkgPSBzY1JlZ0ltYWdlLAkgIC8qIHJlZ2lzdGVyIHZhbHVlIHNhdmVkIG9uIHN0YWNrICovCisgIHNjX0luZm8JID0gc2NJbmZvLAkgIC8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLworICBzY19Vc2VyU3RydWN0CSA9IHNjVXNlclN0cnVjdCwgIC8qIGFkZHIgaW4gc3RydWN0IHVzZXIgZm9yIGN1cnJlbnQgcHJvY2VzcyAqLworICBzY19TRGF0YQkgPSBzY1NEYXRhLAkgIC8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KKyAgc2NfU0JzcwkgPSBzY1NCc3MsCSAgLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgY29tbW9uICovCisgIHNjX1JEYXRhCSA9IHNjUkRhdGEsCSAgLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KKyAgc2NfVmFyCSA9IHNjVmFyLAkgIC8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLworICBzY19Db21tb24JID0gc2NDb21tb24sCSAgLyogY29tbW9uIHZhcmlhYmxlICovCisgIHNjX1NDb21tb24JID0gc2NTQ29tbW9uLAkgIC8qIHNtYWxsIGNvbW1vbiAqLworICBzY19WYXJSZWdpc3RlciA9IHNjVmFyUmVnaXN0ZXIsIC8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLworICBzY19WYXJpYW50CSA9IHNjVmFyaWFudCwJICAvKiBWYXJpYW50IHJlY29yZCAqLworICBzY19TVW5kZWZpbmVkCSA9IHNjU1VuZGVmaW5lZCwgIC8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLworICBzY19Jbml0CSA9IHNjSW5pdCwJICAvKiAuaW5pdCBzZWN0aW9uIHN5bWJvbCAqLworICBzY19NYXgJID0gc2NNYXgJICAvKiBNYXggc3RvcmFnZSBjbGFzcysxICovCit9IHNjX3Q7CisKKy8qIFJlZGVmaW5pdGlvbiBvZiBzeW1ib2wgdHlwZS4gICovCisKK3R5cGVkZWYgZW51bSBzdCB7CisgIHN0X05pbAk9IHN0TmlsLAkvKiBOdXRoaW4nIHNwZWNpYWwgKi8KKyAgc3RfR2xvYmFsCT0gc3RHbG9iYWwsCS8qIGV4dGVybmFsIHN5bWJvbCAqLworICBzdF9TdGF0aWMJPSBzdFN0YXRpYywJLyogc3RhdGljICovCisgIHN0X1BhcmFtCT0gc3RQYXJhbSwJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCisgIHN0X0xvY2FsCT0gc3RMb2NhbCwJLyogbG9jYWwgdmFyaWFibGUgKi8KKyAgc3RfTGFiZWwJPSBzdExhYmVsLAkvKiBsYWJlbCAqLworICBzdF9Qcm9jCT0gc3RQcm9jLAkvKiAgICAgIiAgICAgICIJIFByb2NlZHVyZSAqLworICBzdF9CbG9jawk9IHN0QmxvY2ssCS8qIGJlZ2lubmluZyBvZiBibG9jayAqLworICBzdF9FbmQJPSBzdEVuZCwJLyogZW5kIChvZiBhbnl0aGluZykgKi8KKyAgc3RfTWVtYmVyCT0gc3RNZW1iZXIsCS8qIG1lbWJlciAob2YgYW55dGhpbmcJLSBzdHJ1Y3QvdW5pb24vZW51bSAqLworICBzdF9UeXBlZGVmCT0gc3RUeXBlZGVmLAkvKiB0eXBlIGRlZmluaXRpb24gKi8KKyAgc3RfRmlsZQk9IHN0RmlsZSwJLyogZmlsZSBuYW1lICovCisgIHN0X1JlZ1JlbG9jCT0gc3RSZWdSZWxvYywJLyogcmVnaXN0ZXIgcmVsb2NhdGlvbiAqLworICBzdF9Gb3J3YXJkCT0gc3RGb3J3YXJkLAkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KKyAgc3RfU3RhdGljUHJvYwk9IHN0U3RhdGljUHJvYywJLyogbG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCisgIHN0X0NvbnN0YW50CT0gc3RDb25zdGFudCwJLyogY29uc3QgKi8KKyAgc3RfU3RyCT0gc3RTdHIsCS8qIHN0cmluZyAqLworICBzdF9OdW1iZXIJPSBzdE51bWJlciwJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCisgIHN0X0V4cHIJPSBzdEV4cHIsCS8qIDIrMiB2cy4gNCAqLworICBzdF9UeXBlCT0gc3RUeXBlLAkvKiBwb3N0LWNvZXJjaW9uIFNFUiAqLworICBzdF9NYXgJPSBzdE1heAkJLyogbWF4IHR5cGUrMSAqLworfSBzdF90OworCisvKiBSZWRlZmluaXRpb24gb2YgdHlwZSBxdWFsaWZpZXJzLiAgKi8KKwordHlwZWRlZiBlbnVtIHRxIHsKKyAgdHFfTmlsCT0gdHFOaWwsCS8qIGJ0IGlzIHdoYXQgeW91IHNlZSAqLworICB0cV9QdHIJPSB0cVB0ciwJLyogcG9pbnRlciAqLworICB0cV9Qcm9jCT0gdHFQcm9jLAkvKiBwcm9jZWR1cmUgKi8KKyAgdHFfQXJyYXkJPSB0cUFycmF5LAkvKiBkdWggKi8KKyAgdHFfRmFyCT0gdHFGYXIsCS8qIGxvbmdlciBhZGRyZXNzaW5nIC0gODA4Ni84IGxhbmQgKi8KKyAgdHFfVm9sCT0gdHFWb2wsCS8qIHZvbGF0aWxlICovCisgIHRxX01heAk9IHRxTWF4CQkvKiBNYXggdHlwZSBxdWFsaWZpZXIrMSAqLworfSB0cV90OworCisvKiBSZWRlZmluaXRpb24gb2YgYmFzaWMgdHlwZXMuICAqLworCit0eXBlZGVmIGVudW0gYnQgeworICBidF9OaWwJPSBidE5pbCwJLyogdW5kZWZpbmVkICovCisgIGJ0X0Fkcgk9IGJ0QWRyLAkvKiBhZGRyZXNzIC0gaW50ZWdlciBzYW1lIHNpemUgYXMgcG9pbnRlciAqLworICBidF9DaGFyCT0gYnRDaGFyLAkvKiBjaGFyYWN0ZXIgKi8KKyAgYnRfVUNoYXIJPSBidFVDaGFyLAkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KKyAgYnRfU2hvcnQJPSBidFNob3J0LAkvKiBzaG9ydCAqLworICBidF9VU2hvcnQJPSBidFVTaG9ydCwJLyogdW5zaWduZWQgc2hvcnQgKi8KKyAgYnRfSW50CT0gYnRJbnQsCS8qIGludCAqLworICBidF9VSW50CT0gYnRVSW50LAkvKiB1bnNpZ25lZCBpbnQgKi8KKyAgYnRfTG9uZwk9IGJ0TG9uZywJLyogbG9uZyAqLworICBidF9VTG9uZwk9IGJ0VUxvbmcsCS8qIHVuc2lnbmVkIGxvbmcgKi8KKyAgYnRfRmxvYXQJPSBidEZsb2F0LAkvKiBmbG9hdCAocmVhbCkgKi8KKyAgYnRfRG91YmxlCT0gYnREb3VibGUsCS8qIERvdWJsZSAocmVhbCkgKi8KKyAgYnRfU3RydWN0CT0gYnRTdHJ1Y3QsCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLworICBidF9Vbmlvbgk9IGJ0VW5pb24sCS8qIFVuaW9uICh2YXJpYW50KSAqLworICBidF9FbnVtCT0gYnRFbnVtLAkvKiBFbnVtZXJhdGVkICovCisgIGJ0X1R5cGVkZWYJPSBidFR5cGVkZWYsCS8qIGRlZmluZWQgdmlhIGEgdHlwZWRlZiwgaXN5bVJlZiBwb2ludHMgKi8KKyAgYnRfUmFuZ2UJPSBidFJhbmdlLAkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KKyAgYnRfU2V0CT0gYnRTZXQsCS8qIHBhc2NhbCBzZXRzICovCisgIGJ0X0NvbXBsZXgJPSBidENvbXBsZXgsCS8qIGZvcnRyYW4gY29tcGxleCAqLworICBidF9EQ29tcGxleAk9IGJ0RENvbXBsZXgsCS8qIGZvcnRyYW4gZG91YmxlIGNvbXBsZXggKi8KKyAgYnRfSW5kaXJlY3QJPSBidEluZGlyZWN0LAkvKiBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZiAqLworICBidF9GaXhlZERlYwk9IGJ0Rml4ZWREZWMsCS8qIEZpeGVkIERlY2ltYWwgKi8KKyAgYnRfRmxvYXREZWMJPSBidEZsb2F0RGVjLAkvKiBGbG9hdCBEZWNpbWFsICovCisgIGJ0X1N0cmluZwk9IGJ0U3RyaW5nLAkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCisgIGJ0X0JpdAk9IGJ0Qml0LAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KKyAgYnRfUGljdHVyZQk9IGJ0UGljdHVyZSwJLyogUGljdHVyZSAqLworICBidF9Wb2lkCT0gYnRWb2lkLAkvKiBWb2lkICovCisgIGJ0X01heAk9IGJ0TWF4CQkvKiBNYXggYmFzaWMgdHlwZSsxICovCit9IGJ0X3Q7CisKKyNkZWZpbmUgTl9UUSBpdHFNYXgKKworLyogU3RhdGVzIGZvciB3aGV0aGVyIHRvIGhhc2ggdHlwZSBvciBub3QuICAqLwordHlwZWRlZiBlbnVtIGhhc2hfc3RhdGUgeworICBoYXNoX25vCT0gMCwJCS8qIGRvbid0IGhhc2ggdHlwZSAqLworICBoYXNoX3llcwk9IDEsCQkvKiBvayB0byBoYXNoIHR5cGUsIG9yIHVzZSBwcmV2aW91cyBoYXNoICovCisgIGhhc2hfcmVjb3JkCT0gMgkJLyogb2sgdG8gcmVjb3JkIGhhc2gsIGJ1dCBkb24ndCB1c2UgcHJldi4gKi8KK30gaGFzaF9zdGF0ZV90OworCisvKiBUeXBlcyBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCitlbnVtIGFsbG9jX3R5cGUgeworICBhbGxvY190eXBlX25vbmUsCQkvKiBkdW1teSB2YWx1ZSAqLworICBhbGxvY190eXBlX3Njb3BlLAkJLyogbmVzdGVkIHNjb3BlcyBsaW5rZWQgbGlzdCAqLworICBhbGxvY190eXBlX3ZsaW5rcywJCS8qIGdsdWUgbGlua2luZyBwYWdlcyBpbiB2YXJyYXkgKi8KKyAgYWxsb2NfdHlwZV9zaGFzaCwJCS8qIHN0cmluZyBoYXNoIGVsZW1lbnQgKi8KKyAgYWxsb2NfdHlwZV90aGFzaCwJCS8qIHR5cGUgaGFzaCBlbGVtZW50ICovCisgIGFsbG9jX3R5cGVfdGFnLAkJLyogc3RydWN0L3VuaW9uL3RhZyBlbGVtZW50ICovCisgIGFsbG9jX3R5cGVfZm9yd2FyZCwJCS8qIGVsZW1lbnQgdG8gaG9sZCB1bmtub3duIHRhZyAqLworICBhbGxvY190eXBlX3RoZWFkLAkJLyogaGVhZCBvZiB0eXBlIGhhc2ggbGlzdCAqLworICBhbGxvY190eXBlX3ZhcnJheSwJCS8qIGdlbmVyYWwgdmFycmF5IGFsbG9jYXRpb24gKi8KKyAgYWxsb2NfdHlwZV9saW5lbm8sCQkvKiBsaW5lIG51bWJlciBsaXN0ICovCisgIGFsbG9jX3R5cGVfbGFzdAkJLyogbGFzdCsxIGVsZW1lbnQgZm9yIGFycmF5IGJvdW5kcyAqLworfTsKKworLyogVHlwZXMgb2YgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24uICAqLworZW51bSBhdXhfdHlwZSB7CisgIGF1eF90aXIsCQkJLyogVElSIHR5cGUgaW5mb3JtYXRpb24gKi8KKyAgYXV4X3JuZHgsCQkJLyogcmVsYXRpdmUgaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KKyAgYXV4X2RuTG93LAkJCS8qIGxvdyBkaW1lbnNpb24gKi8KKyAgYXV4X2RuSGlnaCwJCQkvKiBoaWdoIGRpbWVuc2lvbiAqLworICBhdXhfaXN5bSwJCQkvKiBzeW1ib2wgdGFibGUgaW5kZXggKGVuZCBvZiBwcm9jKSAqLworICBhdXhfaXNzLAkJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KKyAgYXV4X3dpZHRoLAkJCS8qIHdpZHRoIGZvciBub24tZGVmYXVsdCBzaXplZCBzdHJ1YyBmaWVsZHMgKi8KKyAgYXV4X2NvdW50CQkJLyogY291bnQgb2YgcmFuZ2VzIGZvciB2YXJpYW50IGFybSAqLworfTsKKwwKKy8qIFN0cnVjdHVyZXMgdG8gcHJvdmlkZSBuLW51bWJlciBvZiB2aXJ0dWFsIGFycmF5cywgZWFjaCBvZiB3aGljaCBjYW4KKyAgIGdyb3cgbGluZWFybHksIGFuZCB3aGljaCBhcmUgd3JpdHRlbiBpbiB0aGUgb2JqZWN0IGZpbGUgYXMKKyAgIHNlcXVlbnRpYWwgcGFnZXMuICBPbiBzeXN0ZW1zIHdpdGggYSBCU0QgbWFsbG9jLCB0aGUKKyAgIE1BWF9DTFVTVEVSX1BBR0VTIHNob3VsZCBiZSAxIGxlc3MgdGhhbiBhIHBvd2VyIG9mIHR3bywgc2luY2UKKyAgIG1hbGxvYyBhZGRzIGl0J3Mgb3ZlcmhlYWQsIGFuZCByb3VuZHMgdXAgdG8gdGhlIG5leHQgcG93ZXIgb2YgMi4KKyAgIFBhZ2VzIGFyZSBsaW5rZWQgdG9nZXRoZXIgdmlhIGEgbGlua2VkIGxpc3QuCisKKyAgIElmIFBBR0VfU0laRSBpcyA+IDQwOTYsIHRoZSBzdHJpbmcgbGVuZ3RoIGluIHRoZSBzaGFzaF90IHN0cnVjdHVyZQorICAgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgKGFzc3VtaW5nIHRoZXJlIGFyZSBzdHJpbmdzID4gNDA5NiBieXRlcykuICAqLworCisvKiBGSVhNRTogWWVzLCB0aGVyZSBjYW4gYmUgc3VjaCBzdHJpbmdzIHdoaWxlIGVtaXR0aW5nIEMrKyBjbGFzcyBkZWJ1ZworICAgaW5mby4gIFRlbXBsYXRlcyBhcmUgdGhlIG9mZmVuZGVyIGhlcmUsIHRoZSB0ZXN0IGNhc2UgaW4gcXVlc3Rpb24gCisgICBoYXZpbmcgYSBtYW5nbGVkIGNsYXNzIG5hbWUgb2YKKworICAgICB0N3JiX3RyZWU0WjR4a2V5WnQ0cGFpcjJaQzR4a2V5WnQ3eHNvY2tldDFaNFVzZXJadDlzZWxlY3Qxc3QyWnQ0cGFpclwKKyAgICAgMlpDNHhrZXladDd4c29ja2V0MVo0VXNlclo0eGtleVp0NGxlc3MxWjR4a2V5CisKKyAgIFJlcGVhdCB0aGF0IGEgY291cGxlIGRvemVuIHRpbWVzIHdoaWxlIGxpc3RpbmcgdGhlIGNsYXNzIG1lbWJlcnMgYW5kCisgICB5b3UndmUgZ290IHN0cmluZ3Mgb3ZlciA0ay4gIEhhY2sgYXJvdW5kIHRoaXMgZm9yIG5vdyBieSBpbmNyZWFzaW5nCisgICB0aGUgcGFnZSBzaXplLiAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgYWJhbmRvbiB0aGlzIHN0cnVjdHVyZSBzY2hlbWUKKyAgIGNlcnRhaW5seSBmb3IgdmVyeSBsYXJnZSBzdHJpbmdzLCBhbmQgcG9zc2libHkgZW50aXJlbHkuICAqLworCisjaWZuZGVmIFBBR0VfU0laRQorI2RlZmluZSBQQUdFX1NJWkUgKDgqMTAyNCkJLyogc2l6ZSBvZiB2YXJyYXkgcGFnZXMgKi8KKyNlbmRpZgorCisjZGVmaW5lIFBBR0VfVVNJWkUgKCh1bnNpZ25lZCBsb25nKSBQQUdFX1NJWkUpCisKKyNpZm5kZWYgTUFYX0NMVVNURVJfUEFHRVMJLyogIyBwYWdlcyB0byBnZXQgZnJvbSBzeXN0ZW0gKi8KKyNkZWZpbmUgTUFYX0NMVVNURVJfUEFHRVMgNjMKKyNlbmRpZgorCisvKiBMaW5rZWQgbGlzdCBjb25uZWN0aW5nIHNlcGFyYXRlIHBhZ2UgYWxsb2NhdGlvbnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgdmxpbmtzIHsKKyAgc3RydWN0IHZsaW5rcwkqcHJldjsJCS8qIHByZXZpb3VzIHNldCBvZiBwYWdlcyAqLworICBzdHJ1Y3QgdmxpbmtzICpuZXh0OwkJLyogbmV4dCBzZXQgb2YgcGFnZXMgKi8KKyAgdW5pb24gIHBhZ2UgICAqZGF0dW07CQkvKiBzdGFydCBvZiBwYWdlICovCisgIHVuc2lnbmVkIGxvbmcJIHN0YXJ0X2luZGV4OwkvKiBzdGFydGluZyBpbmRleCAjIG9mIHBhZ2UgKi8KK30gdmxpbmtzX3Q7CisKKworLyogVmlydHVhbCBhcnJheSBoZWFkZXIuICAqLwordHlwZWRlZiBzdHJ1Y3QgdmFycmF5IHsKKyAgdmxpbmtzX3QJKmZpcnN0OwkJCS8qIGZpcnN0IHBhZ2UgbGluayAqLworICB2bGlua3NfdAkqbGFzdDsJCQkvKiBsYXN0IHBhZ2UgbGluayAqLworICB1bnNpZ25lZCBsb25nCSBudW1fYWxsb2NhdGVkOwkJLyogIyBvYmplY3RzIGFsbG9jYXRlZCAqLworICB1bnNpZ25lZCBzaG9ydCBvYmplY3Rfc2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBvYmplY3QgKi8KKyAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19wZXJfcGFnZTsJLyogIyBvYmplY3RzIHRoYXQgY2FuIGZpdCBvbiBhIHBhZ2UgKi8KKyAgdW5zaWduZWQgc2hvcnQgb2JqZWN0c19sYXN0X3BhZ2U7CS8qICMgb2JqZWN0cyBhbGxvY2F0ZWQgb24gbGFzdCBwYWdlICovCit9IHZhcnJheV90OworCisjaWZuZGVmIE1BTExPQ19DSEVDSworI2RlZmluZSBPQkpFQ1RTX1BFUl9QQUdFKHR5cGUpIChQQUdFX1NJWkUgLyBzaXplb2YgKHR5cGUpKQorI2Vsc2UKKyNkZWZpbmUgT0JKRUNUU19QRVJfUEFHRSh0eXBlKSAoKHNpemVvZiAodHlwZSkgPiAxKSA/IDEgOiBQQUdFX1NJWkUpCisjZW5kaWYKKworI2RlZmluZSBJTklUX1ZBUlJBWSh0eXBlKSB7CS8qIG1hY3JvIHRvIGluaXRpYWxpemUgYSB2YXJyYXkgKi8JXAorICAodmxpbmtzX3QgKikwLAkJLyogZmlyc3QgKi8JCQkJXAorICAodmxpbmtzX3QgKikwLAkJLyogbGFzdCAqLwkJCQlcCisgIDAsCQkJCS8qIG51bV9hbGxvY2F0ZWQgKi8JCQlcCisgIHNpemVvZiAodHlwZSksCQkvKiBvYmplY3Rfc2l6ZSAqLwkJCVwKKyAgT0JKRUNUU19QRVJfUEFHRSAodHlwZSksCS8qIG9iamVjdHNfcGVyX3BhZ2UgKi8JCQlcCisgIE9CSkVDVFNfUEVSX1BBR0UgKHR5cGUpLAkvKiBvYmplY3RzX2xhc3RfcGFnZSAqLwkJCVwKK30KKworCisvKiBNYXN0ZXIgdHlwZSBmb3IgaW5kZXhlcyB3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZS4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbnRfdDsKKworCisvKiBMaW5rZWQgbGlzdCBzdXBwb3J0IGZvciBuZXN0ZWQgc2NvcGVzIChmaWxlLCBibG9jaywgc3RydWN0dXJlLCBldGMuKS4gICovCit0eXBlZGVmIHN0cnVjdCBzY29wZSB7CisgIHN0cnVjdCBzY29wZQkqcHJldjsJCS8qIHByZXZpb3VzIHNjb3BlIGxldmVsICovCisgIHN0cnVjdCBzY29wZQkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCisgIHN0cnVjdCBsb2NhbHN5bSAqbHN5bTsJLyogcG9pbnRlciB0byBsb2NhbCBzeW1ib2wgbm9kZSAqLworICBzdF90CQkgdHlwZTsJCS8qIHR5cGUgb2YgdGhlIG5vZGUgKi8KK30gc2NvcGVfdDsKKworCisvKiBGb3IgYSBsb2NhbCBzeW1ib2wgd2Ugc3RvcmUgYSBnYXMgc3ltYm9sIGFzIHdlbGwgYXMgdGhlIGRlYnVnZ2luZworICAgaW5mb3JtYXRpb24gd2UgZ2VuZXJhdGUuICBUaGUgZ2FzIHN5bWJvbCB3aWxsIGJlIE5VTEwgaWYgdGhpcyBpcworICAgb25seSBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwordHlwZWRlZiBzdHJ1Y3QgbG9jYWxzeW0geworICBjb25zdCBjaGFyICpuYW1lOwkJLyogc3ltYm9sIG5hbWUgKi8KKyAgc3ltYm9sUyAqYXNfc3ltOwkJLyogc3ltYm9sIGFzIHNlZW4gYnkgZ2FzICovCisgIGJmZF92bWEgYWRkZW5kOwkJLyogYWRkZW5kIHRvIGFzX3N5bSB2YWx1ZSAqLworICBzdHJ1Y3QgZWZkciAqZmlsZV9wdHI7CS8qIGZpbGUgcG9pbnRlciAqLworICBzdHJ1Y3QgZWNvZmZfcHJvYyAqcHJvY19wdHI7CS8qIHByb2MgcG9pbnRlciAqLworICBzdHJ1Y3QgbG9jYWxzeW0gKmJlZ2luX3B0cjsJLyogc3ltYm9sIGF0IHN0YXJ0IG9mIGJsb2NrICovCisgIHN0cnVjdCBlY29mZl9hdXggKmluZGV4X3B0cjsJLyogaW5kZXggdmFsdWUgdG8gYmUgZmlsbGVkIGluICovCisgIHN0cnVjdCBmb3J3YXJkICpmb3J3YXJkX3JlZjsJLyogZm9yd2FyZCByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sICovCisgIGxvbmcgc3ltX2luZGV4OwkJLyogZmluYWwgc3ltYm9sIGluZGV4ICovCisgIEVYVFIgZWNvZmZfc3ltOwkJLyogRUNPRkYgZGVidWdnaW5nIHN5bWJvbCAqLworfSBsb2NhbHN5bV90OworCisKKy8qIEZvciBhdXggaW5mb3JtYXRpb24gd2Uga2VlcCB0aGUgdHlwZSBhbmQgdGhlIGRhdGEuICAqLwordHlwZWRlZiBzdHJ1Y3QgZWNvZmZfYXV4IHsKKyAgZW51bSBhdXhfdHlwZSB0eXBlOwkJLyogYXV4IHR5cGUgKi8KKyAgQVVYVSBkYXRhOwkJCS8qIGF1eCBkYXRhICovCit9IGF1eF90OworCisvKiBGb3IgYSBwcm9jZWR1cmUgd2Ugc3RvcmUgdGhlIGdhcyBzeW1ib2wgYXMgd2VsbCBhcyB0aGUgUERSCisgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QgZWNvZmZfcHJvYyB7CisgIGxvY2Fsc3ltX3QgKnN5bTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sICovCisgIFBEUiBwZHI7CQkJLyogRUNPRkYgZGVidWdnaW5nIGluZm8gKi8KK30gcHJvY190OworCisvKiBOdW1iZXIgb2YgcHJvY190IHN0cnVjdHVyZXMgYWxsb2NhdGVkLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHByb2NfY250OworCisKKy8qIEZvcndhcmQgcmVmZXJlbmNlIGxpc3QgZm9yIHRhZ3MgcmVmZXJlbmNlZCwgYnV0IG5vdCB5ZXQgZGVmaW5lZC4gICovCit0eXBlZGVmIHN0cnVjdCBmb3J3YXJkIHsKKyAgc3RydWN0IGZvcndhcmQgKm5leHQ7CQkvKiBuZXh0IGZvcndhcmQgcmVmZXJlbmNlICovCisgIHN0cnVjdCBmb3J3YXJkICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KKyAgYXV4X3QJCSAqaWZkX3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBmaWxlIGluZGV4ICovCisgIGF1eF90CQkgKmluZGV4X3B0cjsJLyogcG9pbnRlciB0byBzdG9yZSBzeW1ib2wgaW5kZXggKi8KK30gZm9yd2FyZF90OworCisKKy8qIExpbmtlZCBsaXN0IHN1cHBvcnQgZm9yIHRhZ3MuICBUaGUgZmlyc3QgdGFnIGluIHRoZSBsaXN0IGlzIGFsd2F5cworICAgdGhlIGN1cnJlbnQgdGFnIGZvciB0aGF0IGJsb2NrLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRhZyB7CisgIHN0cnVjdCB0YWcJICpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KKyAgc3RydWN0IHNoYXNoCSAqaGFzaF9wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIGhhc2ggdGFibGUgaGVhZCAqLworICBzdHJ1Y3QgdGFnCSAqc2FtZV9uYW1lOwkvKiB0YWcgd2l0aCBzYW1lIG5hbWUgaW4gb3V0ZXIgc2NvcGUgKi8KKyAgc3RydWN0IHRhZwkgKnNhbWVfYmxvY2s7CS8qIG5leHQgdGFnIGRlZmluZWQgaW4gdGhlIHNhbWUgYmxvY2suICAqLworICBzdHJ1Y3QgZm9yd2FyZCAqZm9yd2FyZF9yZWY7CS8qIGxpc3Qgb2YgZm9yd2FyZCByZWZlcmVuY2VzICovCisgIGJ0X3QJCSAgYmFzaWNfdHlwZTsJLyogYnRfU3RydWN0LCBidF9Vbmlvbiwgb3IgYnRfRW51bSAqLworICBzeW1pbnRfdAkgIGlmZDsJCS8qIGZpbGUgIyB0YWcgZGVmaW5lZCBpbiAqLworICBsb2NhbHN5bV90CSAqc3ltOwkJLyogZmlsZSdzIGxvY2FsIHN5bWJvbHMgKi8KK30gdGFnX3Q7CisKKworLyogSGVhZCBvZiBhIGJsb2NrJ3MgbGlua2VkIGxpc3Qgb2YgdGFncy4gICovCit0eXBlZGVmIHN0cnVjdCB0aGVhZCB7CisgIHN0cnVjdCB0aGVhZAkqcHJldjsJCS8qIHByZXZpb3VzIGJsb2NrICovCisgIHN0cnVjdCB0aGVhZAkqZnJlZTsJCS8qIGZyZWUgbGlzdCBwb2ludGVyICovCisgIHN0cnVjdCB0YWcJKmZpcnN0X3RhZzsJLyogZmlyc3QgdGFnIGluIGJsb2NrIGRlZmluZWQgKi8KK30gdGhlYWRfdDsKKworCisvKiBVbmlvbiBjb250YWluaW5nIHBvaW50ZXJzIHRvIGVhY2ggdGhlIHNtYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIGZyZWVkIHVwLiAgKi8KK3R5cGVkZWYgdW5pb24gc21hbGxfZnJlZSB7CisgIHNjb3BlX3QJKmZfc2NvcGU7CS8qIHNjb3BlIHN0cnVjdHVyZSAqLworICB0aGVhZF90CSpmX3RoZWFkOwkvKiB0YWcgaGVhZCBzdHJ1Y3R1cmUgKi8KKyAgdGFnX3QJCSpmX3RhZzsJCS8qIHRhZyBlbGVtZW50IHN0cnVjdHVyZSAqLworICBmb3J3YXJkX3QJKmZfZm9yd2FyZDsJLyogZm9yd2FyZCB0YWcgcmVmZXJlbmNlICovCit9IHNtYWxsX2ZyZWVfdDsKKworCisvKiBTdHJpbmcgaGFzaCB0YWJsZSBlbnRyeS4gICovCisKK3R5cGVkZWYgc3RydWN0IHNoYXNoIHsKKyAgY2hhcgkJKnN0cmluZzsJLyogc3RyaW5nIHdlIGFyZSBoYXNoaW5nICovCisgIHN5bWludF90CSBpbmR4OwkJLyogaW5kZXggd2l0aGluIHN0cmluZyB0YWJsZSAqLworICBFWFRSCQkqZXN5bV9wdHI7CS8qIGdsb2JhbCBzeW1ib2wgcG9pbnRlciAqLworICBsb2NhbHN5bV90CSpzeW1fcHRyOwkvKiBsb2NhbCBzeW1ib2wgcG9pbnRlciAqLworICBsb2NhbHN5bV90CSplbmRfcHRyOwkvKiBzeW1ib2wgcG9pbnRlciB0byBlbmQgYmxvY2sgKi8KKyAgdGFnX3QJCSp0YWdfcHRyOwkvKiB0YWcgcG9pbnRlciAqLworICBwcm9jX3QJKnByb2NfcHRyOwkvKiBwcm9jZWR1cmUgZGVzY3JpcHRvciBwb2ludGVyICovCit9IHNoYXNoX3Q7CisKKworLyogVHlwZSBoYXNoIHRhYmxlIHN1cHBvcnQuICBUaGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGZpdAorICAgd2l0aGluIGEgcGFnZSB3aXRoIHRoZSBvdGhlciBleHRlbmRlZCBmaWxlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24uCisgICBCZWNhdXNlIHVuaXF1ZSB0eXBlcyB3aGljaCBhcmUgaGFzaGVkIGFyZSBmZXdlciBpbiBudW1iZXIgdGhhbgorICAgc3RyaW5ncywgd2UgdXNlIGEgc21hbGxlciBoYXNoIHZhbHVlLiAgKi8KKworI2RlZmluZSBIQVNIQklUUyAzMAorCisjaWZuZGVmIFRIQVNIX1NJWkUKKyNkZWZpbmUgVEhBU0hfU0laRSAxMTMKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB0aGFzaCB7CisgIHN0cnVjdCB0aGFzaAkqbmV4dDsJCS8qIG5leHQgaGFzaCB2YWx1ZSAqLworICBBVVhVCQkgdHlwZTsJCS8qIHR5cGUgd2UgYXJlIGhhc2hpbmcgKi8KKyAgc3ltaW50X3QJIGluZHg7CQkvKiBpbmRleCB3aXRoaW4gc3RyaW5nIHRhYmxlICovCit9IHRoYXNoX3Q7CisKKworLyogRXh0ZW5kZWQgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBzdXBwb3J0IG5lY2Vzc2FyeQorICAgdG8gYWRkIHRoaW5ncyB0byBlYWNoIGZpbGUgc2VwYXJhdGVseS4gICovCit0eXBlZGVmIHN0cnVjdCBlZmRyIHsKKyAgRkRSCQkgZmRyOwkJLyogRmlsZSBoZWFkZXIgdG8gYmUgd3JpdHRlbiBvdXQgKi8KKyAgRkRSCQkqb3JpZ19mZHI7CS8qIG9yaWdpbmFsIGZpbGUgaGVhZGVyICovCisgIGNoYXIJCSpuYW1lOwkJLyogZmlsZW5hbWUgKi8KKyAgaW50CQkgZmFrZTsJCS8qIHdoZXRoZXIgdGhpcyBpcyBmYWtlZCAuZmlsZSAqLworICBzeW1pbnRfdAkgdm9pZF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ3ZvaWQnIHR5cGUgKi8KKyAgc3ltaW50X3QJIGludF90eXBlOwkvKiBhdXguIHBvaW50ZXIgdG8gJ2ludCcgdHlwZSAqLworICBzY29wZV90CSpjdXJfc2NvcGU7CS8qIGN1cnJlbnQgbmVzdGVkIHNjb3BlcyAqLworICBzeW1pbnRfdAkgZmlsZV9pbmRleDsJLyogY3VycmVudCBmaWxlIG51bWJlciAqLworICBpbnQJCSBuZXN0ZWRfc2NvcGVzOwkvKiAjIG5lc3RlZCBzY29wZXMgKi8KKyAgdmFycmF5X3QJIHN0cmluZ3M7CS8qIGxvY2FsIHN0cmluZ3MgKi8KKyAgdmFycmF5X3QJIHN5bWJvbHM7CS8qIGxvY2FsIHN5bWJvbHMgKi8KKyAgdmFycmF5X3QJIHByb2NzOwkJLyogcHJvY2VkdXJlcyAqLworICB2YXJyYXlfdAkgYXV4X3N5bXM7CS8qIGF1eGlsaWFyeSBzeW1ib2xzICovCisgIHN0cnVjdCBlZmRyCSpuZXh0X2ZpbGU7CS8qIG5leHQgZmlsZSBkZXNjcmlwdG9yICovCisJCQkJLyogc3RyaW5nL3R5cGUgaGFzaCB0YWJsZXMgKi8KKyAgc3RydWN0IGhhc2hfY29udHJvbCAqc3RyX2hhc2g7CS8qIHN0cmluZyBoYXNoIHRhYmxlICovCisgIHRoYXNoX3QJKnRoYXNoX2hlYWRbVEhBU0hfU0laRV07Cit9IGVmZHJfdDsKKworLyogUHJlLWluaXRpYWxpemVkIGV4dGVuZGVkIGZpbGUgc3RydWN0dXJlLiAgKi8KK3N0YXRpYyBjb25zdCBlZmRyX3QgaW5pdF9maWxlID0KK3sKKyAgewkJCS8qIEZEUiBzdHJ1Y3R1cmUgKi8KKyAgICAwLAkJCS8qIGFkcjoJCW1lbW9yeSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBmaWxlICovCisgICAgMCwJCQkvKiByc3M6CQlmaWxlIG5hbWUgKG9mIHNvdXJjZSwgaWYga25vd24pICovCisgICAgMCwJCQkvKiBpc3NCYXNlOglmaWxlJ3Mgc3RyaW5nIHNwYWNlICovCisgICAgMCwJCQkvKiBjYlNzOgludW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNzICovCisgICAgMCwJCQkvKiBpc3ltQmFzZToJYmVnaW5uaW5nIG9mIHN5bWJvbHMgKi8KKyAgICAwLAkJCS8qIGNzeW06CWNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCisgICAgMCwJCQkvKiBpbGluZUJhc2U6CWZpbGUncyBsaW5lIHN5bWJvbHMgKi8KKyAgICAwLAkJCS8qIGNsaW5lOgljb3VudCBvZiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCisgICAgMCwJCQkvKiBpb3B0QmFzZToJZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCisgICAgMCwJCQkvKiBjb3B0Ogljb3VudCBvZiBmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KKyAgICAwLAkJCS8qIGlwZEZpcnN0OglzdGFydCBvZiBwcm9jZWR1cmVzIGZvciB0aGlzIGZpbGUgKi8KKyAgICAwLAkJCS8qIGNwZDoJCWNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLworICAgIDAsCQkJLyogaWF1eEJhc2U6CWZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLworICAgIDAsCQkJLyogY2F1eDoJY291bnQgb2YgZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCisgICAgMCwJCQkvKiByZmRCYXNlOglpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCisgICAgMCwJCQkvKiBjcmZkOgljb3VudCBmaWxlIGluZGlyZWN0IGVudHJpZXMgKi8KKyAgICBsYW5nQywJCS8qIGxhbmc6CWxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KKyAgICAxLAkJCS8qIGZNZXJnZToJd2hldGhlciB0aGlzIGZpbGUgY2FuIGJlIG1lcmdlZCAqLworICAgIDAsCQkJLyogZlJlYWRpbjoJdHJ1ZSBpZiByZWFkIGluIChub3QganVzdCBjcmVhdGVkKSAqLworICAgIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAgLyogZkJpZ2VuZGlhbjoJaWYgMSwgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCisgICAgR0xFVkVMXzIsCQkvKiBnbGV2ZWw6CWxldmVsIHRoaXMgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAqLworICAgIDAsCQkJLyogcmVzZXJ2ZWQ6CXJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisgICAgMCwJCQkvKiBjYkxpbmVPZmZzZXQ6IGJ5dGUgb2Zmc2V0IGZyb20gaGVhZGVyIGZvciB0aGlzIGZpbGUgbG4ncyAqLworICAgIDAsCQkJLyogY2JMaW5lOglzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KKyAgfSwKKworICAoRkRSICopMCwJCS8qIG9yaWdfZmRyOglvcmlnaW5hbCBmaWxlIGhlYWRlciBwb2ludGVyICovCisgIChjaGFyICopMCwJCS8qIG5hbWU6CXBvaW50ZXIgdG8gZmlsZW5hbWUgKi8KKyAgMCwJCQkvKiBmYWtlOgl3aGV0aGVyIHRoaXMgaXMgYSBmYWtlZCAuZmlsZSAqLworICAwLAkJCS8qIHZvaWRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciB2b2lkIHR5cGUgKi8KKyAgMCwJCQkvKiBpbnRfdHlwZToJcHRyIHRvIGF1eCBub2RlIGZvciBpbnQgdHlwZSAqLworICAoc2NvcGVfdCAqKTAsCQkvKiBjdXJfc2NvcGU6CWN1cnJlbnQgc2NvcGUgYmVpbmcgcHJvY2Vzc2VkICovCisgIDAsCQkJLyogZmlsZV9pbmRleDoJY3VycmVudCBmaWxlICMgKi8KKyAgMCwJCQkvKiBuZXN0ZWRfc2NvcGVzOiAjIG5lc3RlZCBzY29wZXMgKi8KKyAgSU5JVF9WQVJSQVkgKGNoYXIpLAkvKiBzdHJpbmdzOglsb2NhbCBzdHJpbmcgdmFycmF5ICovCisgIElOSVRfVkFSUkFZIChsb2NhbHN5bV90KSwJLyogc3ltYm9sczoJbG9jYWwgc3ltYm9scyB2YXJyYXkgKi8KKyAgSU5JVF9WQVJSQVkgKHByb2NfdCksCS8qIHByb2NzOglwcm9jZWR1cmUgdmFycmF5ICovCisgIElOSVRfVkFSUkFZIChhdXhfdCksCS8qIGF1eF9zeW1zOglhdXhpbGlhcnkgc3ltYm9scyB2YXJyYXkgKi8KKworICAoc3RydWN0IGVmZHIgKikwLAkvKiBuZXh0X2ZpbGU6CW5leHQgZmlsZSBzdHJ1Y3R1cmUgKi8KKworICAoc3RydWN0IGhhc2hfY29udHJvbCAqKTAsCS8qIHN0cl9oYXNoOglzdHJpbmcgaGFzaCB0YWJsZSAqLworICB7IDAgfSwJCS8qIHRoYXNoX2hlYWQ6CXR5cGUgaGFzaCB0YWJsZSAqLworfTsKKworCitzdGF0aWMgZWZkcl90ICpmaXJzdF9maWxlOwkJCS8qIGZpcnN0IGZpbGUgZGVzY3JpcHRvciAqLworc3RhdGljIGVmZHJfdCAqKmxhc3RfZmlsZV9wdHIgPSAmZmlyc3RfZmlsZTsJLyogZmlsZSBkZXNjcmlwdG9yIHRhaWwgKi8KKworCisvKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcyBrZXB0IGluIGEgbGlzdCB1bnRpbCB0aGUgYXNzZW1ibHkgaXMKKyAgIGZpbmlzaGVkLiAgKi8KK3R5cGVkZWYgc3RydWN0IGxpbmVub19saXN0IHsKKyAgc3RydWN0IGxpbmVub19saXN0ICpuZXh0OwkvKiBuZXh0IGVsZW1lbnQgaW4gbGlzdCAqLworICBlZmRyX3QgKmZpbGU7CQkJLyogZmlsZSB0aGlzIGxpbmUgaXMgaW4gKi8KKyAgcHJvY190ICpwcm9jOwkJCS8qIHByb2NlZHVyZSB0aGlzIGxpbmUgaXMgaW4gKi8KKyAgZnJhZ1MgKmZyYWc7CQkJLyogZnJhZ21lbnQgdGhpcyBsaW5lIG51bWJlciBpcyBpbiAqLworICB1bnNpZ25lZCBsb25nIHBhZGRyOwkJLyogb2Zmc2V0IHdpdGhpbiBmcmFnbWVudCAqLworICBsb25nIGxpbmVubzsJCQkvKiBhY3R1YWwgbGluZSBudW1iZXIgKi8KK30gbGluZW5vX2xpc3RfdDsKKworc3RhdGljIGxpbmVub19saXN0X3QgKmZpcnN0X2xpbmVubzsKK3N0YXRpYyBsaW5lbm9fbGlzdF90ICpsYXN0X2xpbmVubzsKK3N0YXRpYyBsaW5lbm9fbGlzdF90ICoqbGFzdF9saW5lbm9fcHRyID0gJmZpcnN0X2xpbmVubzsKKworLyogU29tZXRpbWVzIHRoZXJlIHdpbGwgYmUgc29tZSAubG9jIHN0YXRlbWVudHMgYmVmb3JlIGEgLmVudC4gIFdlCisgICBrZWVwIHRoZW0gaW4gdGhpcyBsaXN0IHNvIHRoYXQgd2UgY2FuIGZpbGwgaW4gdGhlIHByb2NlZHVyZSBwb2ludGVyCisgICBhZnRlciB3ZSBzZWUgdGhlIC5lbnQuICAqLworc3RhdGljIGxpbmVub19saXN0X3QgKm5vcHJvY19saW5lbm87CisKKy8qIFVuaW9uIG9mIHZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIGhlbGQgaW4gcGFnZXMuICAqLwordHlwZWRlZiB1bmlvbiBwYWdlIHsKKyAgY2hhcgkJYnl0ZQlbIFBBR0VfU0laRSBdOworICB1bnNpZ25lZCBjaGFyCXVieXRlCVsgUEFHRV9TSVpFIF07CisgIGVmZHJfdAlmaWxlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChlZmRyX3QpCSAgICAgXTsKKyAgRkRSCQlvZmlsZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoRkRSKQkgICAgIF07CisgIHByb2NfdAlwcm9jCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChwcm9jX3QpCSAgICAgXTsKKyAgbG9jYWxzeW1fdAlzeW0JWyBQQUdFX1NJWkUgLyBzaXplb2YgKGxvY2Fsc3ltX3QpICAgIF07CisgIGF1eF90CQlhdXgJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGF1eF90KQkgICAgIF07CisgIEROUgkJZGVuc2UJWyBQQUdFX1NJWkUgLyBzaXplb2YgKEROUikJICAgICBdOworICBzY29wZV90CXNjb3BlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChzY29wZV90KQkgICAgIF07CisgIHZsaW5rc190CXZsaW5rcwlbIFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpCSAgICAgXTsKKyAgc2hhc2hfdAlzaGFzaAlbIFBBR0VfU0laRSAvIHNpemVvZiAoc2hhc2hfdCkJICAgICBdOworICB0aGFzaF90CXRoYXNoCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KQkgICAgIF07CisgIHRhZ190CQl0YWcJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRhZ190KQkgICAgIF07CisgIGZvcndhcmRfdAlmb3J3YXJkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChmb3J3YXJkX3QpICAgICBdOworICB0aGVhZF90CXRoZWFkCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KQkgICAgIF07CisgIGxpbmVub19saXN0X3QJbGluZW5vCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChsaW5lbm9fbGlzdF90KSBdOworfSBwYWdlX3R5cGU7CisKKworLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc21hbGwgc2l6ZWQgc3RydWN0dXJlcy4gICovCit0eXBlZGVmIHN0cnVjdCBhbGxvY19pbmZvIHsKKyAgY2hhcgkJKmFsbG9jX25hbWU7CS8qIG5hbWUgb2YgdGhpcyBhbGxvY2F0aW9uIHR5cGUgKG11c3QgYmUgZmlyc3QpICovCisgIHBhZ2VfdHlwZQkqY3VyX3BhZ2U7CS8qIGN1cnJlbnQgcGFnZSBiZWluZyBhbGxvY2F0ZWQgZnJvbSAqLworICBzbWFsbF9mcmVlX3QJIGZyZWVfbGlzdDsJLyogY3VycmVudCBmcmVlIGxpc3QgaWYgYW55ICovCisgIGludAkJIHVuYWxsb2NhdGVkOwkvKiBudW1iZXIgb2YgZWxlbWVudHMgdW5hbGxvY2F0ZWQgb24gcGFnZSAqLworICBpbnQJCSB0b3RhbF9hbGxvYzsJLyogdG90YWwgbnVtYmVyIG9mIGFsbG9jYXRpb25zICovCisgIGludAkJIHRvdGFsX2ZyZWU7CS8qIHRvdGFsIG51bWJlciBvZiBmcmVlcyAqLworICBpbnQJCSB0b3RhbF9wYWdlczsJLyogdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFsbG9jYXRlZCAqLworfSBhbGxvY19pbmZvX3Q7CisKKworLyogVHlwZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgdG9nZXRoZXIuICAqLwordHlwZWRlZiBzdHJ1Y3QgdHlwZV9pbmZvIHsKKyAgYnRfdAkgICAgICBiYXNpY190eXBlOwkJLyogYmFzaWMgdHlwZSAqLworICBpbnQJICAgICAgb3JpZ190eXBlOwkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCisgIGludAkgICAgICBudW1fdHE7CQkJLyogIyB0eXBlIHF1YWxpZmllcnMgKi8KKyAgaW50CSAgICAgIG51bV9kaW1zOwkJCS8qICMgZGltZW5zaW9ucyAqLworICBpbnQJICAgICAgbnVtX3NpemVzOwkJLyogIyBzaXplcyAqLworICBpbnQJICAgICAgZXh0cmFfc2l6ZXM7CQkvKiAjIGV4dHJhIHNpemVzIG5vdCB0aWVkIHdpdGggZGltcyAqLworICB0YWdfdCAqICAgICB0YWdfcHRyOwkJCS8qIHRhZyBwb2ludGVyICovCisgIGludAkgICAgICBiaXRmaWVsZDsJCQkvKiBzeW1ib2wgaXMgYSBiaXRmaWVsZCAqLworICB0cV90CSAgICAgIHR5cGVfcXVhbGlmaWVyc1tOX1RRXTsJLyogdHlwZSBxdWFsaWZpZXJzIChwdHIsIGZ1bmMsIGFycmF5KSovCisgIHN5bWludF90ICAgIGRpbWVuc2lvbnMgICAgIFtOX1RRXTsJLyogZGltZW5zaW9ucyBmb3IgZWFjaCBhcnJheSAqLworICBzeW1pbnRfdCAgICBzaXplcwkgICAgIFtOX1RRKzJdOwkvKiBzaXplcyBvZiBlYWNoIGFycmF5IHNsaWNlICsgc2l6ZSBvZgorCQkJCQkgICBzdHJ1Y3QvdW5pb24vZW51bSArIGJpdGZpZWxkIHNpemUgKi8KK30gdHlwZV9pbmZvX3Q7CisKKy8qIFByZS1pbml0aWFsaXplZCB0eXBlX2luZm8gc3RydWN0LiAgKi8KK3N0YXRpYyBjb25zdCB0eXBlX2luZm9fdCB0eXBlX2luZm9faW5pdCA9IHsKKyAgYnRfTmlsLAkJCQkvKiBiYXNpYyB0eXBlICovCisgIFRfTlVMTCwJCQkJLyogb3JpZ2luYWwgQ09GRi1iYXNlZCB0eXBlICovCisgIDAsCQkJCQkvKiAjIHR5cGUgcXVhbGlmaWVycyAqLworICAwLAkJCQkJLyogIyBkaW1lbnNpb25zICovCisgIDAsCQkJCQkvKiAjIHNpemVzICovCisgIDAsCQkJCQkvKiBzaXplcyBub3QgdGllZCB3aXRoIGRpbXMgKi8KKyAgTlVMTCwJCQkJCS8qIHB0ciB0byB0YWcgKi8KKyAgMCwJCQkJCS8qIGJpdGZpZWxkICovCisgIHsJCQkJCS8qIHR5cGUgcXVhbGlmaWVycyAqLworICAgIHRxX05pbCwKKyAgICB0cV9OaWwsCisgICAgdHFfTmlsLAorICAgIHRxX05pbCwKKyAgICB0cV9OaWwsCisgICAgdHFfTmlsLAorICB9LAorICB7CQkJCQkvKiBkaW1lbnNpb25zICovCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAKKyAgfSwKKyAgewkJCQkJLyogc2l6ZXMgKi8KKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgIH0sCit9OworCisvKiBHbG9iYWwgaGFzaCB0YWJsZSBmb3IgdGhlIHRhZ3MgdGFibGUgYW5kIGdsb2JhbCB0YWJsZSBmb3IgZmlsZQorICAgZGVzY3JpcHRvcnMuICAqLworCitzdGF0aWMgdmFycmF5X3QgZmlsZV9kZXNjCT0gSU5JVF9WQVJSQVkgKGVmZHJfdCk7CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKKworLyogU3RhdGljIHR5cGVzIGZvciBpbnQgYW5kIHZvaWQuICBBbHNvLCByZW1lbWJlciB0aGUgbGFzdCBmdW5jdGlvbidzCisgICB0eXBlICh3aGljaCBpcyBzZXQgdXAgd2hlbiB3ZSBlbmNvdW50ZXIgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUKKyAgIGZ1bmN0aW9uLCBhbmQgdXNlZCB3aGVuIHRoZSBlbmQgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBlbWl0dGVkLiAgKi8KKworc3RhdGljIHR5cGVfaW5mb190IGludF90eXBlX2luZm87CitzdGF0aWMgdHlwZV9pbmZvX3Qgdm9pZF90eXBlX2luZm87CitzdGF0aWMgdHlwZV9pbmZvX3QgbGFzdF9mdW5jX3R5cGVfaW5mbzsKK3N0YXRpYyBzeW1ib2xTICpsYXN0X2Z1bmNfc3ltX3ZhbHVlOworCisKKy8qIENvbnZlcnQgQ09GRiBiYXNpYyB0eXBlIHRvIEVDT0ZGIGJhc2ljIHR5cGUuICBUaGUgVF9OVUxMIHR5cGUKKyAgIHJlYWxseSBzaG91bGQgdXNlIGJ0X1ZvaWQsIGJ1dCB0aGlzIGNhdXNlcyB0aGUgY3VycmVudCBlY29mZiBHREIgdG8KKyAgIGlzc3VlIHVuc3VwcG9ydGVkIHR5cGUgbWVzc2FnZXMsIGFuZCB0aGUgVWx0cml4IDQuMDAgZGJ4IChha2EgTUlQUworICAgMi4wKSBkb2Vzbid0IHVuZGVyc3RhbmQgaXQsIGV2ZW4gdGhvdWdoIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgaXQuCisgICBNYXliZSB0aGlzIHdpbGwgYmUgZml4ZWQgaW4gMi4xMCBvciAyLjIwIG9mIHRoZSBNSVBTIGNvbXBpbGVyCisgICBzdWl0ZSwgYnV0IGZvciBub3cgZ28gd2l0aCB3aGF0IHdvcmtzLgorCisgICBJdCB3b3VsZCBtYWtlIHNlbnNlIGZvciB0aGUgLnR5cGUgYW5kIC5zY2wgZGlyZWN0aXZlcyB0byB1c2UgdGhlCisgICBFQ09GRiBudW1iZXJzIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyB0aGUgQ09GRiBudW1iZXJzIGFuZAorICAgbWFwcGluZyB0aGVtLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBoaXN0b3JpY2FsbHkgd2hhdCBtaXBzLXRmaWxlCisgICBleHBlY3RzLCBhbmQgY2hhbmdpbmcgZ2NjIG5vdyB3b3VsZCBiZSBhIGNvbnNpZGVyYWJsZSBwYWluICh0aGUKKyAgIG5hdGl2ZSBjb21waWxlciBnZW5lcmF0ZXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludGVybmFsbHksIHJhdGhlcgorICAgdGhhbiB2aWEgdGhlIGFzc2VtYmxlciwgc28gaXQgd2lsbCBuZXZlciB1c2UgLnR5cGUgb3IgLnNjbCkuICAqLworCitzdGF0aWMgY29uc3QgYnRfdCBtYXBfY29mZl90eXBlc1tdID0geworICBidF9OaWwsCQkJLyogVF9OVUxMICovCisgIGJ0X05pbCwJCQkvKiBUX0FSRyAqLworICBidF9DaGFyLAkJCS8qIFRfQ0hBUiAqLworICBidF9TaG9ydCwJCQkvKiBUX1NIT1JUICovCisgIGJ0X0ludCwJCQkvKiBUX0lOVCAqLworICBidF9Mb25nLAkJCS8qIFRfTE9ORyAqLworICBidF9GbG9hdCwJCQkvKiBUX0ZMT0FUICovCisgIGJ0X0RvdWJsZSwJCQkvKiBUX0RPVUJMRSAqLworICBidF9TdHJ1Y3QsCQkJLyogVF9TVFJVQ1QgKi8KKyAgYnRfVW5pb24sCQkJLyogVF9VTklPTiAqLworICBidF9FbnVtLAkJCS8qIFRfRU5VTSAqLworICBidF9FbnVtLAkJCS8qIFRfTU9FICovCisgIGJ0X1VDaGFyLAkJCS8qIFRfVUNIQVIgKi8KKyAgYnRfVVNob3J0LAkJCS8qIFRfVVNIT1JUICovCisgIGJ0X1VJbnQsCQkJLyogVF9VSU5UICovCisgIGJ0X1VMb25nCQkJLyogVF9VTE9ORyAqLworfTsKKworLyogQ29udmVydCBDT0ZGIHN0b3JhZ2UgY2xhc3MgdG8gRUNPRkYgc3RvcmFnZSBjbGFzcy4gICovCitzdGF0aWMgY29uc3Qgc2NfdCBtYXBfY29mZl9zdG9yYWdlW10gPSB7CisgIHNjX05pbCwJCQkvKiAgIDA6IENfTlVMTCAqLworICBzY19BYnMsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLworICBzY19VbmRlZmluZWQsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCisgIHNjX0RhdGEsCQkJLyogICAzOiBDX1NUQVQJICBzdGF0aWMgKi8KKyAgc2NfUmVnaXN0ZXIsCQkJLyogICA0OiBDX1JFRwkgIHJlZ2lzdGVyICovCisgIHNjX1VuZGVmaW5lZCwJCQkvKiAgIDU6IENfRVhUREVGICA/Pz8gKi8KKyAgc2NfVGV4dCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLworICBzY19UZXh0LAkJCS8qICAgNzogQ19VTEFCRUwgIHVzZXIgbGFiZWwgKi8KKyAgc2NfSW5mbywJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLworICBzY19BYnMsCQkJLyogICA5OiBDX0FSRwkgIGFyZ3VtZW50ICovCisgIHNjX0luZm8sCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLworICBzY19JbmZvLAkJCS8qICAxMTogQ19NT1UJICBtZW1iZXIgb2YgdW5pb24gKi8KKyAgc2NfSW5mbywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KKyAgc2NfSW5mbywJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCisgIHNjX0RhdGEsCQkJLyogIDE0OiBDX1VTVEFUSUMgPz8/ICovCisgIHNjX0luZm8sCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KKyAgc2NfSW5mbywJCQkvKiAgMTY6IENfTU9FCSAgbWVtYmVyIG9mIGVudW0gKi8KKyAgc2NfUmVnaXN0ZXIsCQkJLyogIDE3OiBDX1JFR1BBUk0gcmVnaXN0ZXIgcGFyYW1ldGVyICovCisgIHNjX0JpdHMsCQkJLyogIDE4OyBDX0ZJRUxECSAgYml0ZmllbGQgKi8KKyAgc2NfTmlsLAkJCS8qICAxOSAqLworICBzY19OaWwsCQkJLyogIDIwICovCisgIHNjX05pbCwJCQkvKiAgMjEgKi8KKyAgc2NfTmlsLAkJCS8qICAyMiAqLworICBzY19OaWwsCQkJLyogIDIzICovCisgIHNjX05pbCwJCQkvKiAgMjQgKi8KKyAgc2NfTmlsLAkJCS8qICAyNSAqLworICBzY19OaWwsCQkJLyogIDI2ICovCisgIHNjX05pbCwJCQkvKiAgMjcgKi8KKyAgc2NfTmlsLAkJCS8qICAyOCAqLworICBzY19OaWwsCQkJLyogIDI5ICovCisgIHNjX05pbCwJCQkvKiAgMzAgKi8KKyAgc2NfTmlsLAkJCS8qICAzMSAqLworICBzY19OaWwsCQkJLyogIDMyICovCisgIHNjX05pbCwJCQkvKiAgMzMgKi8KKyAgc2NfTmlsLAkJCS8qICAzNCAqLworICBzY19OaWwsCQkJLyogIDM1ICovCisgIHNjX05pbCwJCQkvKiAgMzYgKi8KKyAgc2NfTmlsLAkJCS8qICAzNyAqLworICBzY19OaWwsCQkJLyogIDM4ICovCisgIHNjX05pbCwJCQkvKiAgMzkgKi8KKyAgc2NfTmlsLAkJCS8qICA0MCAqLworICBzY19OaWwsCQkJLyogIDQxICovCisgIHNjX05pbCwJCQkvKiAgNDIgKi8KKyAgc2NfTmlsLAkJCS8qICA0MyAqLworICBzY19OaWwsCQkJLyogIDQ0ICovCisgIHNjX05pbCwJCQkvKiAgNDUgKi8KKyAgc2NfTmlsLAkJCS8qICA0NiAqLworICBzY19OaWwsCQkJLyogIDQ3ICovCisgIHNjX05pbCwJCQkvKiAgNDggKi8KKyAgc2NfTmlsLAkJCS8qICA0OSAqLworICBzY19OaWwsCQkJLyogIDUwICovCisgIHNjX05pbCwJCQkvKiAgNTEgKi8KKyAgc2NfTmlsLAkJCS8qICA1MiAqLworICBzY19OaWwsCQkJLyogIDUzICovCisgIHNjX05pbCwJCQkvKiAgNTQgKi8KKyAgc2NfTmlsLAkJCS8qICA1NSAqLworICBzY19OaWwsCQkJLyogIDU2ICovCisgIHNjX05pbCwJCQkvKiAgNTcgKi8KKyAgc2NfTmlsLAkJCS8qICA1OCAqLworICBzY19OaWwsCQkJLyogIDU5ICovCisgIHNjX05pbCwJCQkvKiAgNjAgKi8KKyAgc2NfTmlsLAkJCS8qICA2MSAqLworICBzY19OaWwsCQkJLyogIDYyICovCisgIHNjX05pbCwJCQkvKiAgNjMgKi8KKyAgc2NfTmlsLAkJCS8qICA2NCAqLworICBzY19OaWwsCQkJLyogIDY1ICovCisgIHNjX05pbCwJCQkvKiAgNjYgKi8KKyAgc2NfTmlsLAkJCS8qICA2NyAqLworICBzY19OaWwsCQkJLyogIDY4ICovCisgIHNjX05pbCwJCQkvKiAgNjkgKi8KKyAgc2NfTmlsLAkJCS8qICA3MCAqLworICBzY19OaWwsCQkJLyogIDcxICovCisgIHNjX05pbCwJCQkvKiAgNzIgKi8KKyAgc2NfTmlsLAkJCS8qICA3MyAqLworICBzY19OaWwsCQkJLyogIDc0ICovCisgIHNjX05pbCwJCQkvKiAgNzUgKi8KKyAgc2NfTmlsLAkJCS8qICA3NiAqLworICBzY19OaWwsCQkJLyogIDc3ICovCisgIHNjX05pbCwJCQkvKiAgNzggKi8KKyAgc2NfTmlsLAkJCS8qICA3OSAqLworICBzY19OaWwsCQkJLyogIDgwICovCisgIHNjX05pbCwJCQkvKiAgODEgKi8KKyAgc2NfTmlsLAkJCS8qICA4MiAqLworICBzY19OaWwsCQkJLyogIDgzICovCisgIHNjX05pbCwJCQkvKiAgODQgKi8KKyAgc2NfTmlsLAkJCS8qICA4NSAqLworICBzY19OaWwsCQkJLyogIDg2ICovCisgIHNjX05pbCwJCQkvKiAgODcgKi8KKyAgc2NfTmlsLAkJCS8qICA4OCAqLworICBzY19OaWwsCQkJLyogIDg5ICovCisgIHNjX05pbCwJCQkvKiAgOTAgKi8KKyAgc2NfTmlsLAkJCS8qICA5MSAqLworICBzY19OaWwsCQkJLyogIDkyICovCisgIHNjX05pbCwJCQkvKiAgOTMgKi8KKyAgc2NfTmlsLAkJCS8qICA5NCAqLworICBzY19OaWwsCQkJLyogIDk1ICovCisgIHNjX05pbCwJCQkvKiAgOTYgKi8KKyAgc2NfTmlsLAkJCS8qICA5NyAqLworICBzY19OaWwsCQkJLyogIDk4ICovCisgIHNjX05pbCwJCQkvKiAgOTkgKi8KKyAgc2NfVGV4dCwJCQkvKiAxMDA6IENfQkxPQ0sgIGJsb2NrIHN0YXJ0L2VuZCAqLworICBzY19UZXh0LAkJCS8qIDEwMTogQ19GQ04JIGZ1bmN0aW9uIHN0YXJ0L2VuZCAqLworICBzY19JbmZvLAkJCS8qIDEwMjogQ19FT1MJIGVuZCBvZiBzdHJ1Y3QvdW5pb24vZW51bSAqLworICBzY19OaWwsCQkJLyogMTAzOiBDX0ZJTEUJIGZpbGUgc3RhcnQgKi8KKyAgc2NfTmlsLAkJCS8qIDEwNDogQ19MSU5FCSBsaW5lIG51bWJlciAqLworICBzY19OaWwsCQkJLyogMTA1OiBDX0FMSUFTCSBjb21iaW5lZCB0eXBlIGluZm8gKi8KKyAgc2NfTmlsLAkJCS8qIDEwNjogQ19ISURERU4gPz8/ICovCit9OworCisvKiBDb252ZXJ0IENPRkYgc3RvcmFnZSBjbGFzcyB0byBFQ09GRiBzeW1ib2wgdHlwZS4gICovCitzdGF0aWMgY29uc3Qgc3RfdCBtYXBfY29mZl9zeW1fdHlwZVtdID0geworICBzdF9OaWwsCQkJLyogICAwOiBDX05VTEwgKi8KKyAgc3RfTG9jYWwsCQkJLyogICAxOiBDX0FVVE8JICBhdXRvIHZhciAqLworICBzdF9HbG9iYWwsCQkJLyogICAyOiBDX0VYVAkgIGV4dGVybmFsICovCisgIHN0X1N0YXRpYywJCQkvKiAgIDM6IENfU1RBVAkgIHN0YXRpYyAqLworICBzdF9Mb2NhbCwJCQkvKiAgIDQ6IENfUkVHCSAgcmVnaXN0ZXIgKi8KKyAgc3RfR2xvYmFsLAkJCS8qICAgNTogQ19FWFRERUYgID8/PyAqLworICBzdF9MYWJlbCwJCQkvKiAgIDY6IENfTEFCRUwJICBsYWJlbCAqLworICBzdF9MYWJlbCwJCQkvKiAgIDc6IENfVUxBQkVMICB1c2VyIGxhYmVsICovCisgIHN0X01lbWJlciwJCQkvKiAgIDg6IENfTU9TCSAgbWVtYmVyIG9mIHN0cnVjdCAqLworICBzdF9QYXJhbSwJCQkvKiAgIDk6IENfQVJHCSAgYXJndW1lbnQgKi8KKyAgc3RfQmxvY2ssCQkJLyogIDEwOiBDX1NUUlRBRyAgc3RydWN0IHRhZyAqLworICBzdF9NZW1iZXIsCQkJLyogIDExOiBDX01PVQkgIG1lbWJlciBvZiB1bmlvbiAqLworICBzdF9CbG9jaywJCQkvKiAgMTI6IENfVU5UQUcgICB1bmlvbiB0YWcgKi8KKyAgc3RfVHlwZWRlZiwJCQkvKiAgMTM6IENfVFBERUYJICB0eXBlZGVmICovCisgIHN0X1N0YXRpYywJCQkvKiAgMTQ6IENfVVNUQVRJQyA/Pz8gKi8KKyAgc3RfQmxvY2ssCQkJLyogIDE1OiBDX0VOVEFHCSAgZW51bSB0YWcgKi8KKyAgc3RfTWVtYmVyLAkJCS8qICAxNjogQ19NT0UJICBtZW1iZXIgb2YgZW51bSAqLworICBzdF9QYXJhbSwJCQkvKiAgMTc6IENfUkVHUEFSTSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KKyAgc3RfTWVtYmVyLAkJCS8qICAxODsgQ19GSUVMRAkgIGJpdGZpZWxkICovCisgIHN0X05pbCwJCQkvKiAgMTkgKi8KKyAgc3RfTmlsLAkJCS8qICAyMCAqLworICBzdF9OaWwsCQkJLyogIDIxICovCisgIHN0X05pbCwJCQkvKiAgMjIgKi8KKyAgc3RfTmlsLAkJCS8qICAyMyAqLworICBzdF9OaWwsCQkJLyogIDI0ICovCisgIHN0X05pbCwJCQkvKiAgMjUgKi8KKyAgc3RfTmlsLAkJCS8qICAyNiAqLworICBzdF9OaWwsCQkJLyogIDI3ICovCisgIHN0X05pbCwJCQkvKiAgMjggKi8KKyAgc3RfTmlsLAkJCS8qICAyOSAqLworICBzdF9OaWwsCQkJLyogIDMwICovCisgIHN0X05pbCwJCQkvKiAgMzEgKi8KKyAgc3RfTmlsLAkJCS8qICAzMiAqLworICBzdF9OaWwsCQkJLyogIDMzICovCisgIHN0X05pbCwJCQkvKiAgMzQgKi8KKyAgc3RfTmlsLAkJCS8qICAzNSAqLworICBzdF9OaWwsCQkJLyogIDM2ICovCisgIHN0X05pbCwJCQkvKiAgMzcgKi8KKyAgc3RfTmlsLAkJCS8qICAzOCAqLworICBzdF9OaWwsCQkJLyogIDM5ICovCisgIHN0X05pbCwJCQkvKiAgNDAgKi8KKyAgc3RfTmlsLAkJCS8qICA0MSAqLworICBzdF9OaWwsCQkJLyogIDQyICovCisgIHN0X05pbCwJCQkvKiAgNDMgKi8KKyAgc3RfTmlsLAkJCS8qICA0NCAqLworICBzdF9OaWwsCQkJLyogIDQ1ICovCisgIHN0X05pbCwJCQkvKiAgNDYgKi8KKyAgc3RfTmlsLAkJCS8qICA0NyAqLworICBzdF9OaWwsCQkJLyogIDQ4ICovCisgIHN0X05pbCwJCQkvKiAgNDkgKi8KKyAgc3RfTmlsLAkJCS8qICA1MCAqLworICBzdF9OaWwsCQkJLyogIDUxICovCisgIHN0X05pbCwJCQkvKiAgNTIgKi8KKyAgc3RfTmlsLAkJCS8qICA1MyAqLworICBzdF9OaWwsCQkJLyogIDU0ICovCisgIHN0X05pbCwJCQkvKiAgNTUgKi8KKyAgc3RfTmlsLAkJCS8qICA1NiAqLworICBzdF9OaWwsCQkJLyogIDU3ICovCisgIHN0X05pbCwJCQkvKiAgNTggKi8KKyAgc3RfTmlsLAkJCS8qICA1OSAqLworICBzdF9OaWwsCQkJLyogIDYwICovCisgIHN0X05pbCwJCQkvKiAgNjEgKi8KKyAgc3RfTmlsLAkJCS8qICA2MiAqLworICBzdF9OaWwsCQkJLyogIDYzICovCisgIHN0X05pbCwJCQkvKiAgNjQgKi8KKyAgc3RfTmlsLAkJCS8qICA2NSAqLworICBzdF9OaWwsCQkJLyogIDY2ICovCisgIHN0X05pbCwJCQkvKiAgNjcgKi8KKyAgc3RfTmlsLAkJCS8qICA2OCAqLworICBzdF9OaWwsCQkJLyogIDY5ICovCisgIHN0X05pbCwJCQkvKiAgNzAgKi8KKyAgc3RfTmlsLAkJCS8qICA3MSAqLworICBzdF9OaWwsCQkJLyogIDcyICovCisgIHN0X05pbCwJCQkvKiAgNzMgKi8KKyAgc3RfTmlsLAkJCS8qICA3NCAqLworICBzdF9OaWwsCQkJLyogIDc1ICovCisgIHN0X05pbCwJCQkvKiAgNzYgKi8KKyAgc3RfTmlsLAkJCS8qICA3NyAqLworICBzdF9OaWwsCQkJLyogIDc4ICovCisgIHN0X05pbCwJCQkvKiAgNzkgKi8KKyAgc3RfTmlsLAkJCS8qICA4MCAqLworICBzdF9OaWwsCQkJLyogIDgxICovCisgIHN0X05pbCwJCQkvKiAgODIgKi8KKyAgc3RfTmlsLAkJCS8qICA4MyAqLworICBzdF9OaWwsCQkJLyogIDg0ICovCisgIHN0X05pbCwJCQkvKiAgODUgKi8KKyAgc3RfTmlsLAkJCS8qICA4NiAqLworICBzdF9OaWwsCQkJLyogIDg3ICovCisgIHN0X05pbCwJCQkvKiAgODggKi8KKyAgc3RfTmlsLAkJCS8qICA4OSAqLworICBzdF9OaWwsCQkJLyogIDkwICovCisgIHN0X05pbCwJCQkvKiAgOTEgKi8KKyAgc3RfTmlsLAkJCS8qICA5MiAqLworICBzdF9OaWwsCQkJLyogIDkzICovCisgIHN0X05pbCwJCQkvKiAgOTQgKi8KKyAgc3RfTmlsLAkJCS8qICA5NSAqLworICBzdF9OaWwsCQkJLyogIDk2ICovCisgIHN0X05pbCwJCQkvKiAgOTcgKi8KKyAgc3RfTmlsLAkJCS8qICA5OCAqLworICBzdF9OaWwsCQkJLyogIDk5ICovCisgIHN0X0Jsb2NrLAkJCS8qIDEwMDogQ19CTE9DSyAgYmxvY2sgc3RhcnQvZW5kICovCisgIHN0X1Byb2MsCQkJLyogMTAxOiBDX0ZDTgkgZnVuY3Rpb24gc3RhcnQvZW5kICovCisgIHN0X0VuZCwJCQkvKiAxMDI6IENfRU9TCSBlbmQgb2Ygc3RydWN0L3VuaW9uL2VudW0gKi8KKyAgc3RfRmlsZSwJCQkvKiAxMDM6IENfRklMRQkgZmlsZSBzdGFydCAqLworICBzdF9OaWwsCQkJLyogMTA0OiBDX0xJTkUJIGxpbmUgbnVtYmVyICovCisgIHN0X05pbCwJCQkvKiAxMDU6IENfQUxJQVMJIGNvbWJpbmVkIHR5cGUgaW5mbyAqLworICBzdF9OaWwsCQkJLyogMTA2OiBDX0hJRERFTiA/Pz8gKi8KK307CisKKworLyogS2VlcCB0cmFjayBvZiBkaWZmZXJlbnQgc2l6ZWQgYWxsb2NhdGlvbiByZXF1ZXN0cy4gICovCitzdGF0aWMgYWxsb2NfaW5mb190IGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX2xhc3QgXTsKKwwKKy8qIFJlY29yZCB3aGV0aGVyIHdlIGhhdmUgc2VlbiBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KK2ludCBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDA7CisKKy8qIFZhcmlvdXMgc3RhdGljcy4gICovCitzdGF0aWMgZWZkcl90ICAqY3VyX2ZpbGVfcHRyCT0gKGVmZHJfdCAqKSAwOwkvKiBjdXJyZW50IGZpbGUgZGVzYy4gaGVhZGVyICovCitzdGF0aWMgcHJvY190ICAqY3VyX3Byb2NfcHRyCT0gKHByb2NfdCAqKSAwOwkvKiBjdXJyZW50IHByb2NlZHVyZSBoZWFkZXIgKi8KK3N0YXRpYyBwcm9jX3QgICpmaXJzdF9wcm9jX3B0ciAgPSAocHJvY190ICopIDA7IC8qIGZpcnN0IHByb2NlZHVyZSBoZWFkZXIgKi8KK3N0YXRpYyB0aGVhZF90ICp0b3BfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiB0b3AgbGV2ZWwgdGFnIGhlYWQgKi8KK3N0YXRpYyB0aGVhZF90ICpjdXJfdGFnX2hlYWQJPSAodGhlYWRfdCAqKSAwOyAvKiBjdXJyZW50IHRhZyBoZWFkICovCisjaWZkZWYgRUNPRkZfREVCVUcKK3N0YXRpYyBpbnQJZGVidWcJCT0gMDsgCQkvKiB0cmFjZSBmdW5jdGlvbnMgKi8KKyNlbmRpZgorc3RhdGljIGludAlzdGFic19zZWVuCT0gMDsJCS8qICE9IDAgaWYgc3RhYnMgaGF2ZSBiZWVuIHNlZW4gKi8KKworc3RhdGljIGludCBjdXJyZW50X2ZpbGVfaWR4Oworc3RhdGljIGNvbnN0IGNoYXIgKmN1cnJlbnRfc3RhYnNfZmlsZW5hbWU7CisKKy8qIFBzZXVkbyBzeW1ib2wgdG8gdXNlIHdoZW4gcHV0dGluZyBzdGFicyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLworI2lmbmRlZiBTVEFCU19TWU1CT0wKKyNkZWZpbmUgU1RBQlNfU1lNQk9MICJAc3RhYnMiCisjZW5kaWYKKworc3RhdGljIGNoYXIgc3RhYnNfc3ltYm9sW10gPSBTVEFCU19TWU1CT0w7CisMCisvKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAqLworCitzdGF0aWMgdm9pZCBhZGRfdmFycmF5X3BhZ2UgUEFSQU1TICgodmFycmF5X3QgKnZwKSk7CitzdGF0aWMgc3ltaW50X3QgYWRkX3N0cmluZyBQQVJBTVMgKCh2YXJyYXlfdCAqdnAsCisJCQkJICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfdGJsLAorCQkJCSAgICBjb25zdCBjaGFyICpzdHIsCisJCQkJICAgIHNoYXNoX3QgKipyZXRfaGFzaCkpOworc3RhdGljIGxvY2Fsc3ltX3QgKmFkZF9lY29mZl9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqc3RyLCBzdF90IHR5cGUsCisJCQkJCSAgICAgc2NfdCBzdG9yYWdlLCBzeW1ib2xTICpzeW0sCisJCQkJCSAgICAgYmZkX3ZtYSBhZGRlbmQsIHN5bWludF90IHZhbHVlLAorCQkJCQkgICAgIHN5bWludF90IGluZHgpKTsKK3N0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9zeW1pbnQgUEFSQU1TICgoc3ltaW50X3QgYXV4X3dvcmQpKTsKK3N0YXRpYyBzeW1pbnRfdCBhZGRfYXV4X3N5bV9ybmR4IFBBUkFNUyAoKGludCBmaWxlX2luZGV4LAorCQkJCQkgIHN5bWludF90IHN5bV9pbmRleCkpOworc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3RpciBQQVJBTVMgKCh0eXBlX2luZm9fdCAqdCwKKwkJCQkJIGhhc2hfc3RhdGVfdCBzdGF0ZSwKKwkJCQkJIHRoYXNoX3QgKipoYXNoX3RibCkpOworc3RhdGljIHRhZ190ICpnZXRfdGFnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnRhZywgbG9jYWxzeW1fdCAqc3ltLAorCQkJICAgICAgIGJ0X3QgYmFzaWNfdHlwZSkpOworc3RhdGljIHZvaWQgYWRkX3Vua25vd25fdGFnIFBBUkFNUyAoKHRhZ190ICpwdGFnKSk7CitzdGF0aWMgdm9pZCBhZGRfcHJvY2VkdXJlIFBBUkFNUyAoKGNoYXIgKmZ1bmMpKTsKK3N0YXRpYyB2b2lkIGFkZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgaW50IGluZHgsIGludCBmYWtlKSk7CisjaWZkZWYgRUNPRkZfREVCVUcKK3N0YXRpYyBjaGFyICpzY190b19zdHJpbmcgUEFSQU1TICgoc2NfdCBzdG9yYWdlX2NsYXNzKSk7CitzdGF0aWMgY2hhciAqc3RfdG9fc3RyaW5nIFBBUkFNUyAoKHN0X3Qgc3ltYm9sX3R5cGUpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWFya19zdGFicyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBjaGFyICplY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKKwkJCQkgICAgICBjaGFyICpidWZwdHIsIHVuc2lnbmVkIGxvbmcgbmVlZCkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfcGFkZGluZ19hZGp1c3QKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCisJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGNoYXIgKipidWZwdHJwdHIpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2xpbmVubworICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKKwkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgbG9uZyAqbGluZWNudHB0cikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3ltYm9scworICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKKwkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfcHJvY3MKKyAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCisJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2F1eAorICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKKwkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAorCQkJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJCSAgdmFycmF5X3QgKnZwKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zcworICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKKwkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfZmRyCisgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAorCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7CitzdGF0aWMgdm9pZCBlY29mZl9zZXR1cF9leHQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfY2x1c3RlciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIG5wYWdlcykpOworc3RhdGljIHBhZ2VfdHlwZSAqYWxsb2NhdGVfcGFnZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgc2NvcGVfdCAqYWxsb2NhdGVfc2NvcGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZnJlZV9zY29wZSBQQVJBTVMgKChzY29wZV90ICpwdHIpKTsKK3N0YXRpYyB2bGlua3NfdCAqYWxsb2NhdGVfdmxpbmtzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBzaGFzaF90ICphbGxvY2F0ZV9zaGFzaCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdGhhc2hfdCAqYWxsb2NhdGVfdGhhc2ggUEFSQU1TICgodm9pZCkpOworc3RhdGljIHRhZ190ICphbGxvY2F0ZV90YWcgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZnJlZV90YWcgUEFSQU1TICgodGFnX3QgKnB0cikpOworc3RhdGljIGZvcndhcmRfdCAqYWxsb2NhdGVfZm9yd2FyZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdGhlYWRfdCAqYWxsb2NhdGVfdGhlYWQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZnJlZV90aGVhZCBQQVJBTVMgKCh0aGVhZF90ICpwdHIpKTsKK3N0YXRpYyBsaW5lbm9fbGlzdF90ICphbGxvY2F0ZV9saW5lbm9fbGlzdCBQQVJBTVMgKCh2b2lkKSk7CisMCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gICovCisKK3ZvaWQKK2Vjb2ZmX3JlYWRfYmVnaW5faG9vayAoKQoreworICB0YWdfaGFzaCA9IGhhc2hfbmV3ICgpOworICB0b3BfdGFnX2hlYWQgPSBhbGxvY2F0ZV90aGVhZCAoKTsKKyAgdG9wX3RhZ19oZWFkLT5maXJzdF90YWcgPSAodGFnX3QgKikgTlVMTDsKKyAgdG9wX3RhZ19oZWFkLT5mcmVlID0gKHRoZWFkX3QgKikgTlVMTDsKKyAgdG9wX3RhZ19oZWFkLT5wcmV2ID0gY3VyX3RhZ19oZWFkOworICBjdXJfdGFnX2hlYWQgPSB0b3BfdGFnX2hlYWQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgc3ltYm9sIGlzIGNyZWF0ZWQuICAqLworCit2b2lkCitlY29mZl9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7Cit7CisgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBmaWxlIHBvaW50ZXIsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgc2VlbiBhCisgICAgIGZpbGUuICBJZiB3ZSBoYXZlbid0IHNlZW4gYSBmaWxlLCB0aGVuIHRoaXMgaXMgYSBwcm9iYWJseSBzcGVjaWFsCisgICAgIHN5bWJvbCBjcmVhdGVkIGJ5IG1kX2JlZ2luIHdoaWNoIG1heSByZXF1aXJlZCBzcGVjaWFsIGhhbmRsaW5nIGF0CisgICAgIHNvbWUgcG9pbnQuICBDcmVhdGluZyBhIGR1bW15IGZpbGUgd2l0aCBhIGR1bW15IG5hbWUgaXMgY2VydGFpbmx5CisgICAgIHdyb25nLiAgKi8KKyAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwKKyAgICAgICYmIHNlZW5fYXRfbGVhc3RfMV9maWxlICgpKQorICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKKyAgc3ltYm9sUC0+ZWNvZmZfZmlsZSA9IGN1cl9maWxlX3B0cjsKKyAgc3ltYm9sUC0+ZWNvZmZfc3ltYm9sID0gTlVMTDsKKyAgc3ltYm9sUC0+ZWNvZmZfZXh0ZXJuX3NpemUgPSAwOworfQorDAorLyogQWRkIGEgcGFnZSB0byBhIHZhcnJheSBvYmplY3QuICAqLworCitzdGF0aWMgdm9pZAorYWRkX3ZhcnJheV9wYWdlICh2cCkKKyAgICAgdmFycmF5X3QgKnZwOwkJCQkvKiB2YXJyYXkgdG8gYWRkIHBhZ2UgdG8gKi8KK3sKKyAgdmxpbmtzX3QgKm5ld19saW5rcyA9IGFsbG9jYXRlX3ZsaW5rcyAoKTsKKworI2lmZGVmIE1BTExPQ19DSEVDSworICBpZiAodnAtPm9iamVjdF9zaXplID4gMSkKKyAgICBuZXdfbGlua3MtPmRhdHVtID0gKHBhZ2VfdHlwZSAqKSB4Y2FsbG9jICgxLCB2cC0+b2JqZWN0X3NpemUpOworICBlbHNlCisjZW5kaWYKKyAgICBuZXdfbGlua3MtPmRhdHVtID0gYWxsb2NhdGVfcGFnZSAoKTsKKworICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZhcnJheV0udG90YWxfYWxsb2MrKzsKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92YXJyYXldLnRvdGFsX3BhZ2VzKys7CisKKyAgbmV3X2xpbmtzLT5zdGFydF9pbmRleCA9IHZwLT5udW1fYWxsb2NhdGVkOworICB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPSAwOworCisgIGlmICh2cC0+Zmlyc3QgPT0gKHZsaW5rc190ICopIE5VTEwpCQkvKiBmaXJzdCBhbGxvY2F0aW9uPyAqLworICAgIHZwLT5maXJzdCA9IHZwLT5sYXN0ID0gbmV3X2xpbmtzOworICBlbHNlCisgICAgewkJCQkJCS8qIDJuZCBvciBncmVhdGVyIGFsbG9jYXRpb24gKi8KKyAgICAgIG5ld19saW5rcy0+cHJldiA9IHZwLT5sYXN0OworICAgICAgdnAtPmxhc3QtPm5leHQgPSBuZXdfbGlua3M7CisgICAgICB2cC0+bGFzdCA9IG5ld19saW5rczsKKyAgICB9Cit9CisMCisvKiBBZGQgYSBzdHJpbmcgKGFuZCBudWxsIHBhZCkgdG8gb25lIG9mIHRoZSBzdHJpbmcgdGFibGVzLiAgKi8KKworc3RhdGljIHN5bWludF90CithZGRfc3RyaW5nICh2cCwgaGFzaF90YmwsIHN0ciwgcmV0X2hhc2gpCisgICAgIHZhcnJheV90ICp2cDsJCQkvKiBzdHJpbmcgb2JzdGFjayAqLworICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYXNoX3RibDsJLyogcHRyIHRvIGhhc2ggdGFibGUgKi8KKyAgICAgY29uc3QgY2hhciAqc3RyOwkJCS8qIHN0cmluZyAqLworICAgICBzaGFzaF90ICoqcmV0X2hhc2g7CQkvKiByZXR1cm4gaGFzaCBwb2ludGVyICovCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdHIpOworICByZWdpc3RlciBzaGFzaF90ICpoYXNoX3B0cjsKKworICBpZiAobGVuID49IFBBR0VfVVNJWkUpCisgICAgYXNfZmF0YWwgKF8oIlN0cmluZyB0b28gYmlnICglbHUgYnl0ZXMpIiksIGxlbik7CisKKyAgaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBoYXNoX2ZpbmQgKGhhc2hfdGJsLCBzdHIpOworICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBjb25zdCBjaGFyICplcnI7CisKKyAgICAgIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgKyBsZW4gPj0gUEFHRV9VU0laRSkKKyAgICAgICAgeworICAgICAgICAgIHZwLT5udW1fYWxsb2NhdGVkID0KKyAgICAgICAgICAgICgodnAtPm51bV9hbGxvY2F0ZWQgKyBQQUdFX1VTSVpFIC0gMSkgLyBQQUdFX1VTSVpFKSAqIFBBR0VfVVNJWkU7CisgICAgICAgICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7CisgICAgICAgIH0KKworICAgICAgaGFzaF9wdHIgPSBhbGxvY2F0ZV9zaGFzaCAoKTsKKyAgICAgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7CisKKyAgICAgIGhhc2hfcHRyLT5zdHJpbmcgPSAmdnAtPmxhc3QtPmRhdHVtLT5ieXRlW3ZwLT5vYmplY3RzX2xhc3RfcGFnZV07CisKKyAgICAgIHZwLT5vYmplY3RzX2xhc3RfcGFnZSArPSBsZW4gKyAxOworICAgICAgdnAtPm51bV9hbGxvY2F0ZWQgKz0gbGVuICsgMTsKKworICAgICAgc3RyY3B5IChoYXNoX3B0ci0+c3RyaW5nLCBzdHIpOworCisgICAgICBlcnIgPSBoYXNoX2luc2VydCAoaGFzaF90YmwsIHN0ciwgKGNoYXIgKikgaGFzaF9wdHIpOworICAgICAgaWYgKGVycikKKwlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cmluZyBoYXNoIHRhYmxlOiAlcyIpLAorCQkgIHN0ciwgZXJyKTsKKyAgICB9CisKKyAgaWYgKHJldF9oYXNoICE9IChzaGFzaF90ICoqKSBOVUxMKQorICAgICpyZXRfaGFzaCA9IGhhc2hfcHRyOworCisgIHJldHVybiBoYXNoX3B0ci0+aW5keDsKK30KKwwKKy8qIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KKworc3RhdGljIGxvY2Fsc3ltX3QgKgorYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyLCB0eXBlLCBzdG9yYWdlLCBzeW1fdmFsdWUsIGFkZGVuZCwgdmFsdWUsIGluZHgpCisgICAgIGNvbnN0IGNoYXIgKnN0cjsJCQkvKiBzeW1ib2wgbmFtZSAqLworICAgICBzdF90IHR5cGU7CQkJCS8qIHN5bWJvbCB0eXBlICovCisgICAgIHNjX3Qgc3RvcmFnZTsJCQkvKiBzdG9yYWdlIGNsYXNzICovCisgICAgIHN5bWJvbFMgKnN5bV92YWx1ZTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sLiAgKi8KKyAgICAgYmZkX3ZtYSBhZGRlbmQ7CQkJLyogYWRkZW5kIHRvIHN5bV92YWx1ZS4gICovCisgICAgIHN5bWludF90IHZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLworICAgICBzeW1pbnRfdCBpbmR4OwkJCS8qIGluZGV4IHRvIGxvY2FsL2F1eC4gc3ltcyAqLworeworICBsb2NhbHN5bV90ICpwc3ltOworICByZWdpc3RlciBzY29wZV90ICpwc2NvcGU7CisgIHJlZ2lzdGVyIHRoZWFkX3QgKnB0YWdfaGVhZDsKKyAgcmVnaXN0ZXIgdGFnX3QgKnB0YWc7CisgIHJlZ2lzdGVyIHRhZ190ICpwdGFnX25leHQ7CisgIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKKyAgcmVnaXN0ZXIgaW50IHNjb3BlX2RlbHRhID0gMDsKKyAgc2hhc2hfdCAqaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBOVUxMOworCisgIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKKworICB2cCA9ICZjdXJfZmlsZV9wdHItPnN5bWJvbHM7CisKKyBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQorICAgIGFkZF92YXJyYXlfcGFnZSAodnApOworCisgIHBzeW0gPSAmdnAtPmxhc3QtPmRhdHVtLT5zeW1bIHZwLT5vYmplY3RzX2xhc3RfcGFnZSsrIF07CisKKyAgaWYgKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMICYmIHN5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIHBzeW0tPm5hbWUgPSBTX0dFVF9OQU1FIChzeW1fdmFsdWUpOworICBlbHNlCisgICAgcHN5bS0+bmFtZSA9IHN0cjsKKyAgcHN5bS0+YXNfc3ltID0gc3ltX3ZhbHVlOworICBpZiAoc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCisgICAgc3ltX3ZhbHVlLT5lY29mZl9zeW1ib2wgPSBwc3ltOworICBwc3ltLT5hZGRlbmQgPSBhZGRlbmQ7CisgIHBzeW0tPmZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOworICBwc3ltLT5wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKKyAgcHN5bS0+YmVnaW5fcHRyID0gKGxvY2Fsc3ltX3QgKikgTlVMTDsKKyAgcHN5bS0+aW5kZXhfcHRyID0gKGF1eF90ICopIE5VTEw7CisgIHBzeW0tPmZvcndhcmRfcmVmID0gKGZvcndhcmRfdCAqKSBOVUxMOworICBwc3ltLT5zeW1faW5kZXggPSAtMTsKKyAgbWVtc2V0ICgmcHN5bS0+ZWNvZmZfc3ltLCAwLCBzaXplb2YgKEVYVFIpKTsKKyAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPSB2YWx1ZTsKKyAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAodW5zaWduZWQpIHR5cGU7CisgIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLnNjID0gKHVuc2lnbmVkKSBzdG9yYWdlOworICBwc3ltLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGluZHg7CisKKyAgLyogSWYgdGhlcmUgaXMgYW4gYXNzb2NpYXRlZCBzeW1ib2wsIHdlIHdhaXQgdW50aWwgdGhlIGVuZCBvZiB0aGUKKyAgICAgYXNzZW1ibHkgYmVmb3JlIGRlY2lkaW5nIHdoZXJlIHRvIHB1dCB0aGUgbmFtZSAoaXQgbWF5IGJlIGp1c3QgYW4KKyAgICAgZXh0ZXJuYWwgc3ltYm9sKS4gIE90aGVyd2lzZSwgdGhpcyBpcyBqdXN0IGEgZGVidWdnaW5nIHN5bWJvbCBhbmQKKyAgICAgdGhlIG5hbWUgc2hvdWxkIGdvIHdpdGggdGhlIGN1cnJlbnQgZmlsZS4gICovCisgIGlmIChzeW1fdmFsdWUgPT0gKHN5bWJvbFMgKikgTlVMTCkKKyAgICBwc3ltLT5lY29mZl9zeW0uYXN5bS5pc3MgPSAoKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQorCQkJCT8gMAorCQkJCTogYWRkX3N0cmluZyAoJmN1cl9maWxlX3B0ci0+c3RyaW5ncywKKwkJCQkJICAgICAgY3VyX2ZpbGVfcHRyLT5zdHJfaGFzaCwKKwkJCQkJICAgICAgc3RyLAorCQkJCQkgICAgICAmaGFzaF9wdHIpKTsKKworICArK3ZwLT5udW1fYWxsb2NhdGVkOworCisgIGlmIChFQ09GRl9JU19TVEFCICgmcHN5bS0+ZWNvZmZfc3ltLmFzeW0pKQorICAgIHJldHVybiBwc3ltOworCisgIC8qIFNhdmUgdGhlIHN5bWJvbCB3aXRoaW4gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhIHN0YXRpYworICAgICBpdGVtLCBhbmQgaXQgaGFzIGEgbmFtZS4gICovCisgIGlmIChoYXNoX3B0ciAhPSAoc2hhc2hfdCAqKSBOVUxMCisgICAgICAmJiAodHlwZSA9PSBzdF9HbG9iYWwgfHwgdHlwZSA9PSBzdF9TdGF0aWMgfHwgdHlwZSA9PSBzdF9MYWJlbAorCSAgfHwgdHlwZSA9PSBzdF9Qcm9jIHx8IHR5cGUgPT0gc3RfU3RhdGljUHJvYykpCisgICAgaGFzaF9wdHItPnN5bV9wdHIgPSBwc3ltOworCisgIC8qIHB1c2ggb3IgcG9wIGEgc2NvcGUgaWYgYXBwcm9wcmlhdGUuICAqLworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3RfRmlsZToJCQkvKiBiZWdpbm5pbmcgb2YgZmlsZSAqLworICAgIGNhc2Ugc3RfUHJvYzoJCQkvKiBwcm9jZWR1cmUgKi8KKyAgICBjYXNlIHN0X1N0YXRpY1Byb2M6CQkJLyogc3RhdGljIHByb2NlZHVyZSAqLworICAgIGNhc2Ugc3RfQmxvY2s6CQkJLyogYmVnaW4gc2NvcGUgKi8KKyAgICAgIHBzY29wZSA9IGFsbG9jYXRlX3Njb3BlICgpOworICAgICAgcHNjb3BlLT5wcmV2ID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGU7CisgICAgICBwc2NvcGUtPmxzeW0gPSBwc3ltOworICAgICAgcHNjb3BlLT50eXBlID0gdHlwZTsKKyAgICAgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gcHNjb3BlOworCisgICAgICBpZiAodHlwZSAhPSBzdF9GaWxlKQorCXNjb3BlX2RlbHRhID0gMTsKKworICAgICAgLyogRm9yIGV2ZXJ5IGJsb2NrIHR5cGUgZXhjZXB0IGZpbGUsIHN0cnVjdCwgdW5pb24sIG9yCisJIGVudW1lcmF0aW9uIGJsb2NrcywgcHVzaCBhIGxldmVsIG9uIHRoZSB0YWcgc3RhY2suICBXZSBvbWl0CisJIGZpbGUgdHlwZXMsIHNvIHRoYXQgdGFncyBjYW4gc3BhbiBmaWxlIGJvdW5kYXJpZXMuICAqLworICAgICAgaWYgKHR5cGUgIT0gc3RfRmlsZSAmJiBzdG9yYWdlICE9IHNjX0luZm8pCisJeworCSAgcHRhZ19oZWFkID0gYWxsb2NhdGVfdGhlYWQgKCk7CisJICBwdGFnX2hlYWQtPmZpcnN0X3RhZyA9IDA7CisJICBwdGFnX2hlYWQtPnByZXYgPSBjdXJfdGFnX2hlYWQ7CisJICBjdXJfdGFnX2hlYWQgPSBwdGFnX2hlYWQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN0X0VuZDoKKyAgICAgIHBzY29wZSA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlOworICAgICAgaWYgKHBzY29wZSA9PSAoc2NvcGVfdCAqKSBOVUxMKQorCWFzX2ZhdGFsIChfKCJ0b28gbWFueSBzdF9FbmQncyIpKTsKKyAgICAgIGVsc2UKKwl7CisJICBzdF90IGJlZ2luX3R5cGUgPSAoc3RfdCkgcHNjb3BlLT5sc3ltLT5lY29mZl9zeW0uYXN5bS5zdDsKKworCSAgcHN5bS0+YmVnaW5fcHRyID0gcHNjb3BlLT5sc3ltOworCisJICBpZiAoYmVnaW5fdHlwZSAhPSBzdF9GaWxlKQorCSAgICBzY29wZV9kZWx0YSA9IC0xOworCisJICAvKiBFeGNlcHQgZm9yIGZpbGUsIHN0cnVjdHVyZSwgdW5pb24sIG9yIGVudW1lcmF0aW9uIGVuZAorCSAgICAgYmxvY2tzIHJlbW92ZSBhbGwgdGFncyBjcmVhdGVkIHdpdGhpbiB0aGlzIHNjb3BlLiAgKi8KKwkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUgJiYgc3RvcmFnZSAhPSBzY19JbmZvKQorCSAgICB7CisJICAgICAgcHRhZ19oZWFkID0gY3VyX3RhZ19oZWFkOworCSAgICAgIGN1cl90YWdfaGVhZCA9IHB0YWdfaGVhZC0+cHJldjsKKworCSAgICAgIGZvciAocHRhZyA9IHB0YWdfaGVhZC0+Zmlyc3RfdGFnOworCQkgICBwdGFnICE9ICh0YWdfdCAqKSBOVUxMOworCQkgICBwdGFnID0gcHRhZ19uZXh0KQorCQl7CisJCSAgaWYgKHB0YWctPmZvcndhcmRfcmVmICE9IChmb3J3YXJkX3QgKikgTlVMTCkKKwkJICAgIGFkZF91bmtub3duX3RhZyAocHRhZyk7CisKKwkJICBwdGFnX25leHQgPSBwdGFnLT5zYW1lX2Jsb2NrOworCQkgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOworCQkgIGZyZWVfdGFnIChwdGFnKTsKKwkJfQorCisJICAgICAgZnJlZV90aGVhZCAocHRhZ19oZWFkKTsKKwkgICAgfQorCisJICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IHBzY29wZS0+cHJldjsKKworCSAgLyogYmxvY2sgYmVnaW4gZ2V0cyBuZXh0IHN5bSAjLiAgVGhpcyBpcyBzZXQgd2hlbiB3ZSBrbm93CisJICAgICB0aGUgc3ltYm9sIGluZGV4IHZhbHVlLiAgKi8KKworCSAgLyogRnVuY3Rpb25zIHB1c2ggdHdvIG9yIG1vcmUgYXV4IHdvcmRzIGFzIGZvbGxvd3M6CisJICAgICAxc3Qgd29yZDogaW5kZXgrMSBvZiB0aGUgZW5kIHN5bWJvbCAoZmlsbGVkIGluIGxhdGVyKS4KKwkgICAgIDJuZCB3b3JkOiB0eXBlIG9mIHRoZSBmdW5jdGlvbiAocGx1cyBhbnkgYXV4IHdvcmRzIG5lZWRlZCkuCisJICAgICBBbHNvLCB0aWUgdGhlIGV4dGVybmFsIHBvaW50ZXIgYmFjayB0byB0aGUgZnVuY3Rpb24gYmVnaW4gc3ltYm9sLiAgKi8KKwkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUgJiYgYmVnaW5fdHlwZSAhPSBzdF9CbG9jaykKKwkgICAgeworCSAgICAgIHN5bWludF90IHR5OworCSAgICAgIHZhcnJheV90ICpzdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKKworCSAgICAgIHBzY29wZS0+bHN5bS0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBhZGRfYXV4X3N5bV9zeW1pbnQgKDApOworCSAgICAgIHBzY29wZS0+bHN5bS0+aW5kZXhfcHRyID0KKwkJJnN2cC0+bGFzdC0+ZGF0dW0tPmF1eFtzdnAtPm9iamVjdHNfbGFzdF9wYWdlIC0gMV07CisJICAgICAgdHkgPSBhZGRfYXV4X3N5bV90aXIgKCZsYXN0X2Z1bmNfdHlwZV9pbmZvLAorCQkJCSAgICBoYXNoX25vLAorCQkJCSAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKKworLyogVGhpcyBzZWVtcyB0byBiZSB1bm5lY2Vzc2FyeS4gIEknbSBub3QgZXZlbiBzdXJlIHdoYXQgaXQgaXMKKyAqIGludGVuZGVkIHRvIGRvLiAgSXQncyBmcm9tIG1pcHMtdGZpbGUuCisgKgkgICAgICBpZiAobGFzdF9mdW5jX3N5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorICoJCXsKKyAqCQkgIGxhc3RfZnVuY19zeW1fdmFsdWUtPmlmZCA9IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleDsKKyAqCQkgIGxhc3RfZnVuY19zeW1fdmFsdWUtPmluZGV4ID0gdHk7CisgKgkJfQorICovCisJICAgIH0KKworCSAgZnJlZV9zY29wZSAocHNjb3BlKTsKKwl9CisgICAgfQorCisgIGN1cl9maWxlX3B0ci0+bmVzdGVkX3Njb3BlcyArPSBzY29wZV9kZWx0YTsKKworI2lmZGVmIEVDT0ZGX0RFQlVHCisgIGlmIChkZWJ1ZyAmJiB0eXBlICE9IHN0X0ZpbGUKKyAgICAgICYmIChkZWJ1ZyA+IDIgfHwgdHlwZSA9PSBzdF9CbG9jayB8fCB0eXBlID09IHN0X0VuZAorCSAgfHwgdHlwZSA9PSBzdF9Qcm9jIHx8IHR5cGUgPT0gc3RfU3RhdGljUHJvYykpCisgICAgeworICAgICAgY2hhciAqc2Nfc3RyID0gc2NfdG9fc3RyaW5nIChzdG9yYWdlKTsKKyAgICAgIGNoYXIgKnN0X3N0ciA9IHN0X3RvX3N0cmluZyAodHlwZSk7CisgICAgICBpbnQgZGVwdGggPSBjdXJfZmlsZV9wdHItPm5lc3RlZF9zY29wZXMgKyAoc2NvcGVfZGVsdGEgPCAwKTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAiXHRsc3ltXHR2PSAlMTBsZCwgZGVwdGg9ICUyZCwgc2M9ICUtMTJzIiwKKwkgICAgICAgdmFsdWUsIGRlcHRoLCBzY19zdHIpOworCisgICAgICBpZiAoc3RyX3N0YXJ0ICYmIHN0cl9lbmRfcDEgLSBzdHJfc3RhcnQgPiAwKQorCWZwcmludGYgKHN0ZGVyciwgIiBzdD0gJS0xMXMgbmFtZT0gJS4qc1xuIiwgc3Rfc3RyLCBzdHJfZW5kX3AxIC0gc3RyX3N0YXJ0LCBzdHJfc3RhcnQpOworICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdF9zdHIpOworCSAgZnByaW50ZiAoc3RkZXJyLCAiIHN0PSAlLipzXG4iLCBsZW4tMSwgc3Rfc3RyKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIHBzeW07Cit9CisMCisvKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyBhIHN5bWludCkuICBUaGlzIGlzIGFjdHVhbGx5IHVzZWQKKyAgIGZvciBpbnRlZ3JhbCBhdXggdHlwZXMsIG5vdCBqdXN0IHN5bWludHMuICAqLworCitzdGF0aWMgc3ltaW50X3QKK2FkZF9hdXhfc3ltX3N5bWludCAoYXV4X3dvcmQpCisgICAgIHN5bWludF90IGF1eF93b3JkOwkJLyogYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHdvcmQgKi8KK3sKKyAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOworICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKKworICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKKyAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7CisKKyAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKKworICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQorICAgIGFkZF92YXJyYXlfcGFnZSAodnApOworCisgIGF1eF9wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbdnAtPm9iamVjdHNfbGFzdF9wYWdlKytdOworICBhdXhfcHRyLT50eXBlID0gYXV4X2lzeW07CisgIGF1eF9wdHItPmRhdGEuaXN5bSA9IGF1eF93b3JkOworCisgIHJldHVybiB2cC0+bnVtX2FsbG9jYXRlZCsrOworfQorCisKKy8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIGEgZmlsZS9zeW1ib2wgaW5kZXggY29tYm8pLiAgKi8KKworc3RhdGljIHN5bWludF90CithZGRfYXV4X3N5bV9ybmR4IChmaWxlX2luZGV4LCBzeW1faW5kZXgpCisgICAgIGludCBmaWxlX2luZGV4OworICAgICBzeW1pbnRfdCBzeW1faW5kZXg7Cit7CisgIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKKyAgcmVnaXN0ZXIgYXV4X3QgKmF1eF9wdHI7CisKKyAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCisgICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOworCisgIHZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7CisKKyAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKKyAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKKworICBhdXhfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4W3ZwLT5vYmplY3RzX2xhc3RfcGFnZSsrXTsKKyAgYXV4X3B0ci0+dHlwZSA9IGF1eF9ybmR4OworICBhdXhfcHRyLT5kYXRhLnJuZHgucmZkICAgPSBmaWxlX2luZGV4OworICBhdXhfcHRyLT5kYXRhLnJuZHguaW5kZXggPSBzeW1faW5kZXg7CisKKyAgcmV0dXJuIHZwLT5udW1fYWxsb2NhdGVkKys7Cit9CisMCisvKiBBZGQgYW4gYXV4aWxpYXJ5IHN5bWJvbCAocGFzc2luZyB0aGUgYmFzaWMgdHlwZSBhbmQgcG9zc2libHkKKyAgIHR5cGUgcXVhbGlmaWVycykuICAqLworCitzdGF0aWMgc3ltaW50X3QKK2FkZF9hdXhfc3ltX3RpciAodCwgc3RhdGUsIGhhc2hfdGJsKQorICAgICB0eXBlX2luZm9fdCAqdDsJCS8qIGN1cnJlbnQgdHlwZSBpbmZvcm1hdGlvbiAqLworICAgICBoYXNoX3N0YXRlX3Qgc3RhdGU7CS8qIHdoZXRoZXIgdG8gaGFzaCB0eXBlIG9yIG5vdCAqLworICAgICB0aGFzaF90ICoqaGFzaF90Ymw7CS8qIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSB0byB1c2UgKi8KK3sKKyAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOworICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKKyAgc3RhdGljIEFVWFUgaW5pdF9hdXg7CisgIHN5bWludF90IHJldDsKKyAgaW50IGk7CisgIEFVWFUgYXV4OworCisgIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKKworICB2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOworCisgIGF1eCA9IGluaXRfYXV4OworICBhdXgudGkuYnQgPSAoaW50KSB0LT5iYXNpY190eXBlOworICBhdXgudGkuY29udGludWVkID0gMDsKKyAgYXV4LnRpLmZCaXRmaWVsZCA9IHQtPmJpdGZpZWxkOworCisgIGF1eC50aS50cTAgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMF07CisgIGF1eC50aS50cTEgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMV07CisgIGF1eC50aS50cTIgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbMl07CisgIGF1eC50aS50cTMgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbM107CisgIGF1eC50aS50cTQgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbNF07CisgIGF1eC50aS50cTUgPSAoaW50KSB0LT50eXBlX3F1YWxpZmllcnNbNV07CisKKworICAvKiBGb3IgYW55dGhpbmcgdGhhdCBhZGRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHdlIG11c3Qgbm90IGhhc2gsCisgICAgIHNvIGNoZWNrIGhlcmUsIGFuZCByZXNldCBvdXIgc3RhdGUuICovCisKKyAgaWYgKHN0YXRlICE9IGhhc2hfbm8KKyAgICAgICYmICh0LT50eXBlX3F1YWxpZmllcnNbMF0gPT0gdHFfQXJyYXkKKwkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1sxXSA9PSB0cV9BcnJheQorCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzJdID09IHRxX0FycmF5CisJICB8fCB0LT50eXBlX3F1YWxpZmllcnNbM10gPT0gdHFfQXJyYXkKKwkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1s0XSA9PSB0cV9BcnJheQorCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzVdID09IHRxX0FycmF5CisJICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1N0cnVjdAorCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9VbmlvbgorCSAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9FbnVtCisJICB8fCB0LT5iaXRmaWVsZAorCSAgfHwgdC0+bnVtX2RpbXMgPiAwKSkKKyAgICBzdGF0ZSA9IGhhc2hfbm87CisKKyAgLyogU2VlIGlmIHdlIGNhbiBoYXNoIHRoaXMgdHlwZSwgYW5kIHNhdmUgc29tZSBzcGFjZSwgYnV0IHNvbWUgdHlwZXMKKyAgICAgY2FuJ3QgYmUgaGFzaGVkIChiZWNhdXNlIHRoZXkgY29udGFpbiBhcnJheXMgb3IgY29udGludWF0aW9ucyksCisgICAgIGFuZCBvdGhlcnMgY2FuIGJlIHB1dCBpbnRvIHRoZSBoYXNoIGxpc3QsIGJ1dCBjYW5ub3QgdXNlIGV4aXN0aW5nCisgICAgIHR5cGVzIGJlY2F1c2Ugb3RoZXIgYXV4IGVudHJpZXMgcHJlY2VkZSB0aGlzIG9uZS4gICovCisKKyAgaWYgKHN0YXRlICE9IGhhc2hfbm8pCisgICAgeworICAgICAgcmVnaXN0ZXIgdGhhc2hfdCAqaGFzaF9wdHI7CisgICAgICByZWdpc3RlciBzeW1pbnRfdCBoaTsKKworICAgICAgaGkgPSBhdXguaXN5bSAmICgoMSA8PCBIQVNIQklUUykgLSAxKTsKKyAgICAgIGhpICU9IFRIQVNIX1NJWkU7CisKKyAgICAgIGZvciAoaGFzaF9wdHIgPSBoYXNoX3RibFtoaV07CisJICAgaGFzaF9wdHIgIT0gKHRoYXNoX3QgKikwOworCSAgIGhhc2hfcHRyID0gaGFzaF9wdHItPm5leHQpCisJeworCSAgaWYgKGF1eC5pc3ltID09IGhhc2hfcHRyLT50eXBlLmlzeW0pCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKGhhc2hfcHRyICE9ICh0aGFzaF90ICopIE5VTEwgJiYgc3RhdGUgPT0gaGFzaF95ZXMpCisJcmV0dXJuIGhhc2hfcHRyLT5pbmR4OworCisgICAgICBpZiAoaGFzaF9wdHIgPT0gKHRoYXNoX3QgKikgTlVMTCkKKwl7CisJICBoYXNoX3B0ciA9IGFsbG9jYXRlX3RoYXNoICgpOworCSAgaGFzaF9wdHItPm5leHQgPSBoYXNoX3RibFtoaV07CisJICBoYXNoX3B0ci0+dHlwZSA9IGF1eDsKKwkgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7CisJICBoYXNoX3RibFtoaV0gPSBoYXNoX3B0cjsKKwl9CisgICAgfQorCisgIC8qIEV2ZXJ5dGhpbmcgaXMgc2V0IHVwLCBhZGQgdGhlIGF1eCBzeW1ib2wuICovCisgIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCisgICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7CisKKyAgYXV4X3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFsgdnAtPm9iamVjdHNfbGFzdF9wYWdlKysgXTsKKyAgYXV4X3B0ci0+dHlwZSA9IGF1eF90aXI7CisgIGF1eF9wdHItPmRhdGEgPSBhdXg7CisKKyAgcmV0ID0gdnAtPm51bV9hbGxvY2F0ZWQrKzsKKworICAvKiBBZGQgYml0ZmllbGQgbGVuZ3RoIGlmIGl0IGV4aXN0cy4KKworICAgICBOT1RFOiAgTWlwcyBkb2N1bWVudGF0aW9uIGNsYWltcyBiaXRmaWVsZCBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgIEFVWCByZWNvcmQsIGJ1dCB0aGUgREVDc3RhdGlvbiBjb21waWxlciBlbWl0cyBpdCBoZXJlLgorICAgICAoVGhpcyB3b3VsZCBvbmx5IG1ha2UgYSBkaWZmZXJlbmNlIGZvciBlbnVtIGJpdGZpZWxkcy4pCisKKyAgICAgQWxzbyBub3RlOiAgV2UgdXNlIHRoZSBsYXN0IHNpemUgZ2l2ZW4gc2luY2UgZ2NjIG1heSBlbWl0IDIKKyAgICAgZm9yIGFuIGVudW0gYml0ZmllbGQuICAqLworCisgIGlmICh0LT5iaXRmaWVsZCkKKyAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgoc3ltaW50X3QpdC0+c2l6ZXNbdC0+bnVtX3NpemVzLTFdKTsKKworCisgIC8qIEFkZCB0YWcgaW5mb3JtYXRpb24gaWYgbmVlZGVkLiAgU3RydWN0dXJlLCB1bmlvbiwgYW5kIGVudW0KKyAgICAgcmVmZXJlbmNlcyBhZGQgMiBhdXggc3ltYm9sczogYSBbZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4XQorICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdHlwZSwgYW5kIHRoZSBjdXJyZW50IGZpbGUgaW5kZXguICAqLworCisgIGlmICh0LT5iYXNpY190eXBlID09IGJ0X1N0cnVjdAorICAgICAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9VbmlvbgorICAgICAgfHwgdC0+YmFzaWNfdHlwZSA9PSBidF9FbnVtKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHN5bWludF90IGZpbGVfaW5kZXggPSB0LT50YWdfcHRyLT5pZmQ7CisgICAgICByZWdpc3RlciBsb2NhbHN5bV90ICpzeW0gID0gdC0+dGFnX3B0ci0+c3ltOworICAgICAgcmVnaXN0ZXIgZm9yd2FyZF90ICpmb3J3YXJkX3JlZiA9IGFsbG9jYXRlX2ZvcndhcmQgKCk7CisKKyAgICAgIGlmIChzeW0gIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKKwl7CisJICBmb3J3YXJkX3JlZi0+bmV4dCA9IHN5bS0+Zm9yd2FyZF9yZWY7CisJICBzeW0tPmZvcndhcmRfcmVmID0gZm9yd2FyZF9yZWY7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZvcndhcmRfcmVmLT5uZXh0ID0gdC0+dGFnX3B0ci0+Zm9yd2FyZF9yZWY7CisJICB0LT50YWdfcHRyLT5mb3J3YXJkX3JlZiA9IGZvcndhcmRfcmVmOworCX0KKworICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3JuZHggKFNUX1JGREVTQ0FQRSwgaW5kZXhOaWwpOworICAgICAgZm9yd2FyZF9yZWYtPmluZGV4X3B0cgorCT0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKKworICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoZmlsZV9pbmRleCk7CisgICAgICBmb3J3YXJkX3JlZi0+aWZkX3B0cgorCT0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKKyAgICB9CisKKyAgLyogQWRkIGluZm9ybWF0aW9uIGFib3V0IGFycmF5IGJvdW5kcyBpZiB0aGV5IGV4aXN0LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHQtPm51bV9kaW1zOyBpKyspCisgICAgeworICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3JuZHggKFNUX1JGREVTQ0FQRSwKKwkJCSAgICAgICBjdXJfZmlsZV9wdHItPmludF90eXBlKTsKKworICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAoY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4KTsJLyogZmlsZSBpbmRleCovCisgICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgoc3ltaW50X3QpIDApOwkJCS8qIGxvdyBib3VuZCAqLworICAgICAgKHZvaWQpIGFkZF9hdXhfc3ltX3N5bWludCAodC0+ZGltZW5zaW9uc1tpXSAtIDEpOwkJLyogaGlnaCBib3VuZCovCisgICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICgodC0+ZGltZW5zaW9uc1tpXSA9PSAwKQkvKiBzdHJpZGUgKi8KKwkJCQkgPyAwCisJCQkJIDogKHQtPnNpemVzW2ldICogOCkgLyB0LT5kaW1lbnNpb25zW2ldKTsKKyAgICB9OworCisgIC8qIE5PVEU6ICBNaXBzIGRvY3VtZW50YXRpb24gY2xhaW1zIHRoYXQgdGhlIGJpdGZpZWxkIHdpZHRoIGdvZXMgaGVyZS4KKyAgICAgQnV0IGl0IG5lZWRzIHRvIGJlIGVtaXR0ZWQgZWFybGllci4gKi8KKworICByZXR1cm4gcmV0OworfQorDAorLyogQWRkIGEgdGFnIHRvIHRoZSB0YWcgdGFibGUgKHVubGVzcyBpdCBhbHJlYWR5IGV4aXN0cykuICAqLworCitzdGF0aWMgdGFnX3QgKgorZ2V0X3RhZyAodGFnLCBzeW0sIGJhc2ljX3R5cGUpCisgICAgIGNvbnN0IGNoYXIgKnRhZzsJCQkvKiB0YWcgbmFtZSAqLworICAgICBsb2NhbHN5bV90ICpzeW07CQkJLyogdGFnIHN0YXJ0IGJsb2NrICovCisgICAgIGJ0X3QgYmFzaWNfdHlwZTsJCQkvKiBidF9TdHJ1Y3QsIGJ0X1VuaW9uLCBvciBidF9FbnVtICovCit7CisgIHNoYXNoX3QgKmhhc2hfcHRyOworICBjb25zdCBjaGFyICplcnI7CisgIHRhZ190ICp0YWdfcHRyOworCisgIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKKworICBoYXNoX3B0ciA9IChzaGFzaF90ICopIGhhc2hfZmluZCAodGFnX2hhc2gsIHRhZyk7CisKKyAgaWYgKGhhc2hfcHRyICE9IChzaGFzaF90ICopIE5VTEwKKyAgICAgICYmIGhhc2hfcHRyLT50YWdfcHRyICE9ICh0YWdfdCAqKSBOVUxMKQorICB7CisgICAgdGFnX3B0ciA9IGhhc2hfcHRyLT50YWdfcHRyOworICAgIGlmIChzeW0gIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKKyAgICAgIHsKKwl0YWdfcHRyLT5iYXNpY190eXBlID0gYmFzaWNfdHlwZTsKKwl0YWdfcHRyLT5pZmQJICAgID0gY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4OworCXRhZ19wdHItPnN5bQkgICAgPSBzeW07CisgICAgICB9CisgICAgcmV0dXJuIHRhZ19wdHI7CisgIH0KKworICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpwZXJtOworCisgICAgICBwZXJtID0geG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKHRhZykgKyAxKSk7CisgICAgICBzdHJjcHkgKHBlcm0sIHRhZyk7CisgICAgICBoYXNoX3B0ciA9IGFsbG9jYXRlX3NoYXNoICgpOworICAgICAgZXJyID0gaGFzaF9pbnNlcnQgKHRhZ19oYXNoLCBwZXJtLCAoY2hhciAqKSBoYXNoX3B0cik7CisgICAgICBpZiAoZXJyKQorCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gdGFnIGhhc2ggdGFibGU6ICVzIiksCisJCSAgdGFnLCBlcnIpOworICAgICAgaGFzaF9wdHItPnN0cmluZyA9IHBlcm07CisgICAgfQorCisgIHRhZ19wdHIgPSBhbGxvY2F0ZV90YWcgKCk7CisgIHRhZ19wdHItPmZvcndhcmRfcmVmCT0gKGZvcndhcmRfdCAqKSBOVUxMOworICB0YWdfcHRyLT5oYXNoX3B0cgk9IGhhc2hfcHRyOworICB0YWdfcHRyLT5zYW1lX25hbWUJPSBoYXNoX3B0ci0+dGFnX3B0cjsKKyAgdGFnX3B0ci0+YmFzaWNfdHlwZQk9IGJhc2ljX3R5cGU7CisgIHRhZ19wdHItPnN5bQkJPSBzeW07CisgIHRhZ19wdHItPmlmZAkJPSAoKHN5bSA9PSAobG9jYWxzeW1fdCAqKSBOVUxMKQorCQkJICAgPyAoc3ltaW50X3QpIC0xCisJCQkgICA6IGN1cl9maWxlX3B0ci0+ZmlsZV9pbmRleCk7CisgIHRhZ19wdHItPnNhbWVfYmxvY2sJPSBjdXJfdGFnX2hlYWQtPmZpcnN0X3RhZzsKKworICBjdXJfdGFnX2hlYWQtPmZpcnN0X3RhZyA9IHRhZ19wdHI7CisgIGhhc2hfcHRyLT50YWdfcHRyCSAgPSB0YWdfcHRyOworCisgIHJldHVybiB0YWdfcHRyOworfQorDAorLyogQWRkIGFuIHVua25vd24ge3N0cnVjdCwgdW5pb24sIGVudW19IHRhZy4gICovCisKK3N0YXRpYyB2b2lkCithZGRfdW5rbm93bl90YWcgKHB0YWcpCisgICAgIHRhZ190CSpwdGFnOwkJLyogcG9pbnRlciB0byB0YWcgaW5mb3JtYXRpb24gKi8KK3sKKyAgc2hhc2hfdCAqaGFzaF9wdHIJPSBwdGFnLT5oYXNoX3B0cjsKKyAgY2hhciAqbmFtZQkJPSBoYXNoX3B0ci0+c3RyaW5nOworICBsb2NhbHN5bV90ICpzeW07CisgIGZvcndhcmRfdCAqKnBmOworCisjaWZkZWYgRUNPRkZfREVCVUcKKyAgaWYgKGRlYnVnID4gMSkKKyAgICB7CisgICAgICBjaGFyICphZ2dfdHlwZQk9ICJ7dW5rbm93biBhZ2dyZWdhdGUgdHlwZX0iOworICAgICAgc3dpdGNoIChwdGFnLT5iYXNpY190eXBlKQorCXsKKwljYXNlIGJ0X1N0cnVjdDoJYWdnX3R5cGUgPSAic3RydWN0IjsJYnJlYWs7CisJY2FzZSBidF9VbmlvbjoJYWdnX3R5cGUgPSAidW5pb24iOwlicmVhazsKKwljYXNlIGJ0X0VudW06CWFnZ190eXBlID0gImVudW0iOwlicmVhazsKKwlkZWZhdWx0OgkJCQlicmVhazsKKwl9CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInVua25vd24gJXMgJS4qcyBmb3VuZFxuIiwgYWdnX3R5cGUsCisJICAgICAgIGhhc2hfcHRyLT5sZW4sIG5hbWVfc3RhcnQpOworICAgIH0KKyNlbmRpZgorCisgIHN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCisJCQkgIHN0X0Jsb2NrLAorCQkJICBzY19JbmZvLAorCQkJICAoc3ltYm9sUyAqKSBOVUxMLAorCQkJICAoYmZkX3ZtYSkgMCwKKwkJCSAgKHN5bWludF90KSAwLAorCQkJICAoc3ltaW50X3QpIDApOworCisgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChuYW1lLAorCQkJICAgc3RfRW5kLAorCQkJICAgc2NfSW5mbywKKwkJCSAgIChzeW1ib2xTICopIE5VTEwsCisJCQkgICAoYmZkX3ZtYSkgMCwKKwkJCSAgIChzeW1pbnRfdCkgMCwKKwkJCSAgIChzeW1pbnRfdCkgMCk7CisKKyAgZm9yIChwZiA9ICZzeW0tPmZvcndhcmRfcmVmOyAqcGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOyBwZiA9ICYoKnBmKS0+bmV4dCkKKyAgICA7CisgICpwZiA9IHB0YWctPmZvcndhcmRfcmVmOworfQorDAorLyogQWRkIGEgcHJvY2VkdXJlIHRvIHRoZSBjdXJyZW50IGZpbGUncyBsaXN0IG9mIHByb2NlZHVyZXMsIGFuZCByZWNvcmQKKyAgIHRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF9wcm9jZWR1cmUgKGZ1bmMpCisgICAgIGNoYXIgKmZ1bmM7CQkJLyogZnVuYyBuYW1lICovCit7CisgIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKKyAgcmVnaXN0ZXIgcHJvY190ICpuZXdfcHJvY19wdHI7CisgIHN5bWJvbFMgKnN5bTsKKworI2lmZGVmIEVDT0ZGX0RFQlVHCisgIGlmIChkZWJ1ZykKKyAgICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKKyNlbmRpZgorCisgIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKKworICB2cCA9ICZjdXJfZmlsZV9wdHItPnByb2NzOworCisgIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCisgICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7CisKKyAgY3VyX3Byb2NfcHRyID0gbmV3X3Byb2NfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+cHJvY1t2cC0+b2JqZWN0c19sYXN0X3BhZ2UrK107CisKKyAgaWYgKGZpcnN0X3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKKyAgICBmaXJzdF9wcm9jX3B0ciA9IG5ld19wcm9jX3B0cjsKKworICB2cC0+bnVtX2FsbG9jYXRlZCsrOworCisgIG5ld19wcm9jX3B0ci0+cGRyLmlzeW0gPSAtMTsKKyAgbmV3X3Byb2NfcHRyLT5wZHIuaWxpbmUgPSAtMTsKKyAgbmV3X3Byb2NfcHRyLT5wZHIubG5Mb3cgPSAtMTsKKyAgbmV3X3Byb2NfcHRyLT5wZHIubG5IaWdoID0gLTE7CisKKyAgLyogU2V0IHRoZSBCU0ZfRlVOQ1RJT04gZmxhZyBmb3IgdGhlIHN5bWJvbC4gICovCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKGZ1bmMpOworICBzeW0tPmJzeW0tPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKKworICAvKiBQdXNoIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLworICBuZXdfcHJvY19wdHItPnN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X1Byb2MsIHNjX1RleHQsCisJCQkJCXN5bSwgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwKKwkJCQkJKHN5bWludF90KSAwKTsKKworICArK3Byb2NfY250OworCisgIC8qIEZpbGwgaW4gdGhlIGxpbmVub3MgcHJlY2VkaW5nIHRoZSAuZW50LCBpZiBhbnkuICAqLworICBpZiAobm9wcm9jX2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmVub19saXN0X3QgKmw7CisKKyAgICAgIGZvciAobCA9IG5vcHJvY19saW5lbm87IGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTDsgbCA9IGwtPm5leHQpCisJbC0+cHJvYyA9IG5ld19wcm9jX3B0cjsKKyAgICAgICpsYXN0X2xpbmVub19wdHIgPSBub3Byb2NfbGluZW5vOworICAgICAgd2hpbGUgKCpsYXN0X2xpbmVub19wdHIgIT0gTlVMTCkKKwl7CisJICBsYXN0X2xpbmVubyA9ICpsYXN0X2xpbmVub19wdHI7CisJICBsYXN0X2xpbmVub19wdHIgPSAmbGFzdF9saW5lbm8tPm5leHQ7CisJfQorICAgICAgbm9wcm9jX2xpbmVubyA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7CisgICAgfQorfQorCitzeW1ib2xTICoKK2Vjb2ZmX2dldF9jdXJfcHJvY19zeW0gKCkKK3sKKyAgcmV0dXJuIChjdXJfcHJvY19wdHIgPyBjdXJfcHJvY19wdHItPnN5bS0+YXNfc3ltIDogTlVMTCk7Cit9CisMCisvKiBBZGQgYSBuZXcgZmlsZW5hbWUsIGFuZCBzZXQgdXAgYWxsIG9mIHRoZSBmaWxlIHJlbGF0aXZlCisgICB2aXJ0dWFsIGFycmF5cyAoc3RyaW5ncywgc3ltYm9scywgYXV4IHN5bXMsIGV0Yy4pLiAgUmVjb3JkCisgICB3aGVyZSB0aGUgY3VycmVudCBmaWxlIHN0cnVjdHVyZSBsaXZlcy4gICovCisKK3N0YXRpYyB2b2lkCithZGRfZmlsZSAoZmlsZV9uYW1lLCBpbmR4LCBmYWtlKQorICAgICBjb25zdCBjaGFyICpmaWxlX25hbWU7CQkvKiBmaWxlIG5hbWUgKi8KKyAgICAgaW50IGluZHg7CisgICAgIGludCBmYWtlOworeworICByZWdpc3RlciBpbnQgZmlyc3RfY2g7CisgIHJlZ2lzdGVyIGVmZHJfdCAqZmlsX3B0cjsKKworI2lmZGVmIEVDT0ZGX0RFQlVHCisgIGlmIChkZWJ1ZykKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcdGZpbGVcdCUuKnNcbiIsIGxlbiwgZmlsZV9zdGFydCk7CisjZW5kaWYKKworICAvKiBJZiB0aGUgZmlsZSBuYW1lIGlzIE5VTEwsIHRoZW4gbm8gLmZpbGUgc3ltYm9sIGFwcGVhcmVkLCBhbmQgd2UKKyAgICAgd2FudCB0byB1c2UgdGhlIGFjdHVhbCBmaWxlIG5hbWUuICAqLworICBpZiAoZmlsZV9uYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCisgICAgeworICAgICAgY2hhciAqZmlsZTsKKworICAgICAgaWYgKGZpcnN0X2ZpbGUgIT0gKGVmZHJfdCAqKSBOVUxMKQorCWFzX2ZhdGFsIChfKCJmYWtlIC5maWxlIGFmdGVyIHJlYWwgb25lIikpOworICAgICAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOworICAgICAgZmlsZV9uYW1lID0gKGNvbnN0IGNoYXIgKikgZmlsZTsKKworICAgICAgLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHNpbmNlIEkKKyAgICAgICAgIHRoaW5rIHRoYXQncyB3aGF0IG90aGVyIEVDT0ZGIGFzc2VtYmxlcnMgZG8uICBXZSBkb24ndCBkbworICAgICAgICAgdGhpcyBpZiB3ZSBzZWUgYSAuZmlsZSBkaXJlY3RpdmUgd2l0aCBhIHN0cmluZywgc2luY2UgdGhhdAorICAgICAgICAgaW1wbGllcyB0aGF0IHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcKKyAgICAgICAgIHByb3ZpZGVkLiAgKi8KKyAgICAgIGlmICghIHN5bWJvbF90YWJsZV9mcm96ZW4gJiYgZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQorCWRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKKyAgICB9CisKKyNpZm5kZWYgTk9fTElTVElORworICBpZiAobGlzdGluZykKKyAgICBsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlX25hbWUpOworI2VuZGlmCisKKyAgY3VycmVudF9zdGFic19maWxlbmFtZSA9IGZpbGVfbmFtZTsKKworICAvKiBJZiB3ZSdyZSBjcmVhdGluZyBzdGFicywgdGhlbiB3ZSBkb24ndCBhY3R1YWxseSBtYWtlIGEgbmV3IEZEUi4KKyAgICAgSW5zdGVhZCwgd2UganVzdCBjcmVhdGUgYSBzdGFicyBzeW1ib2wuICAqLworICBpZiAoc3RhYnNfc2VlbikKKyAgICB7CisgICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoZmlsZV9uYW1lLCBzdF9OaWwsIHNjX05pbCwKKwkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKKwkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAorCQkJCQkgICBmcmFnX25vdyksCisJCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIEVDT0ZGX01BUktfU1RBQiAoTl9TT0wpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZmlyc3RfY2ggPSAqZmlsZV9uYW1lOworCisgIC8qIEZJWE1FOiBXZSBjYW4ndCBzYWZlbHkgbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcgorICAgICBpbmZvcm1hdGlvbiAoZk1lcmdlIHdpbGwgYmUgemVybyBpbiB0aGlzIGNhc2UpLiAgT3RoZXJ3aXNlLCB3ZQorICAgICBnZXQgaW5jb3JyZWN0IGxpbmUgbnVtYmVyIGRlYnVnZ2luZyBpbmZvLiAgU2VlIGZvciBpbnN0YW5jZQorICAgICBlY29mZl9idWlsZF9saW5lbm8sIHdoaWNoIHdpbGwgZW5kIHVwIHNldHRpbmcgYWxsIGZpbGUtPmZkci4qCisgICAgIGZpZWxkcyBtdWx0aXBsZSB0aW1lcywgcmVzdWx0aW5nIGluIGluY29ycmVjdCBkZWJ1ZyBpbmZvLiAgSW4KKyAgICAgb3JkZXIgdG8gbWFrZSB0aGlzIHdvcmsgcmlnaHQsIGFsbCBsaW5lIG51bWJlciBhbmQgc3ltYm9sIGluZm8KKyAgICAgZm9yIHRoZSBzYW1lIHNvdXJjZSBmaWxlIGhhcyB0byBiZSBhZGphY2VudCBpbiB0aGUgb2JqZWN0IGZpbGUsCisgICAgIHNvIHRoYXQgYSBzaW5nbGUgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZW0uCisgICAgIFRoaXMgd291bGQgcmVxdWlyZSBtYWludGFpbmluZyBmaWxlIHNwZWNpZmljIGxpc3RzIG9mIGxpbmUKKyAgICAgbnVtYmVycyBhbmQgc3ltYm9scyBmb3IgZWFjaCBmaWxlLCBzbyB0aGF0IHRoZXkgY2FuIGJlIG1lcmdlZAorICAgICB0b2dldGhlciAob3Igb3V0cHV0IHRvZ2V0aGVyKSB3aGVuIHR3byAuZmlsZSBwc2V1ZG8tb3BzIGFyZQorICAgICBtZXJnZWQgaW50byBvbmUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKworICAvKiBTZWUgaWYgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLiAgKi8KKyAgZm9yIChmaWxfcHRyID0gZmlyc3RfZmlsZTsKKyAgICAgICBmaWxfcHRyICE9IChlZmRyX3QgKikgTlVMTDsKKyAgICAgICBmaWxfcHRyID0gZmlsX3B0ci0+bmV4dF9maWxlKQorICAgIHsKKyAgICAgIGlmIChmaXJzdF9jaCA9PSBmaWxfcHRyLT5uYW1lWzBdCisJICAmJiBzdHJjbXAgKGZpbGVfbmFtZSwgZmlsX3B0ci0+bmFtZSkgPT0gMAorCSAgJiYgZmlsX3B0ci0+ZmRyLmZNZXJnZSkKKwl7CisJICBjdXJfZmlsZV9wdHIgPSBmaWxfcHRyOworCSAgaWYgKCEgZmFrZSkKKwkgICAgY3VyX2ZpbGVfcHRyLT5mYWtlID0gMDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogSWYgdGhpcyBpcyBhIG5ldyBmaWxlLCBjcmVhdGUgaXQuICovCisgIGlmIChmaWxfcHRyID09IChlZmRyX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBpZiAoZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlID09IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlKQorCWFkZF92YXJyYXlfcGFnZSAoJmZpbGVfZGVzYyk7CisKKyAgICAgIGZpbF9wdHIgPSBjdXJfZmlsZV9wdHIgPQorCSZmaWxlX2Rlc2MubGFzdC0+ZGF0dW0tPmZpbGVbZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlKytdOworICAgICAgKmZpbF9wdHIgPSBpbml0X2ZpbGU7CisKKyAgICAgIGZpbF9wdHItPmZpbGVfaW5kZXggPSBjdXJyZW50X2ZpbGVfaWR4Kys7CisgICAgICArK2ZpbGVfZGVzYy5udW1fYWxsb2NhdGVkOworCisgICAgICBmaWxfcHRyLT5mYWtlID0gZmFrZTsKKworICAgICAgLyogQWxsb2NhdGUgdGhlIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KKyAgICAgIGZpbF9wdHItPnN0cl9oYXNoID0gaGFzaF9uZXcgKCk7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSAwIGJ5dGUgaW4gc3RyaW5nIHRhYmxlIGlzIG51bGwgICovCisgICAgICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKKwkJICBmaWxfcHRyLT5zdHJfaGFzaCwKKwkJICAiIiwKKwkJICAoc2hhc2hfdCAqKikwKTsKKworICAgICAgaWYgKHN0cmxlbiAoZmlsZV9uYW1lKSA+IFBBR0VfVVNJWkUgLSAyKQorCWFzX2ZhdGFsIChfKCJGaWxlbmFtZSBnb2VzIG92ZXIgb25lIHBhZ2UgYm91bmRhcnkuIikpOworCisgICAgICAvKiBQdXNoIHRoZSBzdGFydCBvZiB0aGUgZmlsZW5hbWUuIFdlIGFzc3VtZSB0aGF0IHRoZSBmaWxlbmFtZQorICAgICAgICAgd2lsbCBiZSBzdG9yZWQgYXQgc3RyaW5nIG9mZnNldCAxLiAgKi8KKyAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChmaWxlX25hbWUsIHN0X0ZpbGUsIHNjX1RleHQsCisJCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwgKGJmZF92bWEpIDAsCisJCQkgICAgICAgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOworICAgICAgZmlsX3B0ci0+ZmRyLnJzcyA9IDE7CisgICAgICBmaWxfcHRyLT5uYW1lID0gJmZpbF9wdHItPnN0cmluZ3MubGFzdC0+ZGF0dW0tPmJ5dGVbMV07CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgbGlua2VkIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycy4gICovCisgICAgICAqbGFzdF9maWxlX3B0ciA9IGZpbF9wdHI7CisgICAgICBsYXN0X2ZpbGVfcHRyID0gJmZpbF9wdHItPm5leHRfZmlsZTsKKworICAgICAgLyogQWRkIHZvaWQgJiBpbnQgdHlwZXMgdG8gdGhlIGZpbGUgKHZvaWQgc2hvdWxkIGJlIGZpcnN0IHRvIGNhdGNoCisJIGVycmFudCAwJ3Mgd2l0aGluIHRoZSBpbmRleCBmaWVsZHMpLiAgKi8KKyAgICAgIGZpbF9wdHItPnZvaWRfdHlwZSA9IGFkZF9hdXhfc3ltX3RpciAoJnZvaWRfdHlwZV9pbmZvLAorCQkJCQkgICAgaGFzaF95ZXMsCisJCQkJCSAgICAmY3VyX2ZpbGVfcHRyLT50aGFzaF9oZWFkWzBdKTsKKworICAgICAgZmlsX3B0ci0+aW50X3R5cGUgPSBhZGRfYXV4X3N5bV90aXIgKCZpbnRfdHlwZV9pbmZvLAorCQkJCQkgICBoYXNoX3llcywKKwkJCQkJICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgbm90aWNlcyBhIHByZXByb2Nlc3NvcgorICAgZGlyZWN0aXZlIHN3aXRjaGluZyB0byBhIG5ldyBmaWxlLiAgVGhpcyB3aWxsIG5vdCBoYXBwZW4gaW4KKyAgIGNvbXBpbGVyIG91dHB1dCwgb25seSBpbiBoYW5kIGNvZGVkIGFzc2VtYmxlci4gICovCisKK3ZvaWQKK2Vjb2ZmX25ld19maWxlIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpZiAoY3VyX2ZpbGVfcHRyICE9IE5VTEwgJiYgc3RyY21wIChjdXJfZmlsZV9wdHItPm5hbWUsIG5hbWUpID09IDApCisgICAgcmV0dXJuOworICBhZGRfZmlsZSAobmFtZSwgMCwgMCk7CisKKyAgLyogVGhpcyBpcyBhIGhhbmQgY29kZWQgYXNzZW1ibGVyIGZpbGUsIHNvIGF1dG9tYXRpY2FsbHkgdHVybiBvbgorICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19OT05FKQorICAgIGRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKK30KKwwKKyNpZmRlZiBFQ09GRl9ERUJVRworCisvKiBDb252ZXJ0IHN0b3JhZ2UgY2xhc3MgdG8gc3RyaW5nLiAgKi8KKworc3RhdGljIGNoYXIgKgorc2NfdG9fc3RyaW5nKHN0b3JhZ2VfY2xhc3MpCisgICAgIHNjX3Qgc3RvcmFnZV9jbGFzczsKK3sKKyAgc3dpdGNoKHN0b3JhZ2VfY2xhc3MpCisgICAgeworICAgIGNhc2Ugc2NfTmlsOgkgcmV0dXJuICJOaWwsIjsKKyAgICBjYXNlIHNjX1RleHQ6CSByZXR1cm4gIlRleHQsIjsKKyAgICBjYXNlIHNjX0RhdGE6CSByZXR1cm4gIkRhdGEsIjsKKyAgICBjYXNlIHNjX0JzczoJIHJldHVybiAiQnNzLCI7CisgICAgY2FzZSBzY19SZWdpc3RlcjoJIHJldHVybiAiUmVnaXN0ZXIsIjsKKyAgICBjYXNlIHNjX0FiczoJIHJldHVybiAiQWJzLCI7CisgICAgY2FzZSBzY19VbmRlZmluZWQ6CSByZXR1cm4gIlVuZGVmaW5lZCwiOworICAgIGNhc2Ugc2NfQ2RiTG9jYWw6CSByZXR1cm4gIkNkYkxvY2FsLCI7CisgICAgY2FzZSBzY19CaXRzOgkgcmV0dXJuICJCaXRzLCI7CisgICAgY2FzZSBzY19DZGJTeXN0ZW06CSByZXR1cm4gIkNkYlN5c3RlbSwiOworICAgIGNhc2Ugc2NfUmVnSW1hZ2U6CSByZXR1cm4gIlJlZ0ltYWdlLCI7CisgICAgY2FzZSBzY19JbmZvOgkgcmV0dXJuICJJbmZvLCI7CisgICAgY2FzZSBzY19Vc2VyU3RydWN0OgkgcmV0dXJuICJVc2VyU3RydWN0LCI7CisgICAgY2FzZSBzY19TRGF0YToJIHJldHVybiAiU0RhdGEsIjsKKyAgICBjYXNlIHNjX1NCc3M6CSByZXR1cm4gIlNCc3MsIjsKKyAgICBjYXNlIHNjX1JEYXRhOgkgcmV0dXJuICJSRGF0YSwiOworICAgIGNhc2Ugc2NfVmFyOgkgcmV0dXJuICJWYXIsIjsKKyAgICBjYXNlIHNjX0NvbW1vbjoJIHJldHVybiAiQ29tbW9uLCI7CisgICAgY2FzZSBzY19TQ29tbW9uOgkgcmV0dXJuICJTQ29tbW9uLCI7CisgICAgY2FzZSBzY19WYXJSZWdpc3RlcjogcmV0dXJuICJWYXJSZWdpc3RlciwiOworICAgIGNhc2Ugc2NfVmFyaWFudDoJIHJldHVybiAiVmFyaWFudCwiOworICAgIGNhc2Ugc2NfU1VuZGVmaW5lZDoJIHJldHVybiAiU1VuZGVmaW5lZCwiOworICAgIGNhc2Ugc2NfSW5pdDoJIHJldHVybiAiSW5pdCwiOworICAgIGNhc2Ugc2NfTWF4OgkgcmV0dXJuICJNYXgsIjsKKyAgICB9CisKKyAgcmV0dXJuICI/Pz8sIjsKK30KKworI2VuZGlmIC8qIERFQlVHICovCisMCisjaWZkZWYgRUNPRkZfREVCVUcKKworLyogQ29udmVydCBzeW1ib2wgdHlwZSB0byBzdHJpbmcuICAqLworCitzdGF0aWMgY2hhciAqCitzdF90b19zdHJpbmcoc3ltYm9sX3R5cGUpCisgICAgIHN0X3Qgc3ltYm9sX3R5cGU7Cit7CisgIHN3aXRjaChzeW1ib2xfdHlwZSkKKyAgICB7CisgICAgY2FzZSBzdF9OaWw6CXJldHVybiAiTmlsLCI7CisgICAgY2FzZSBzdF9HbG9iYWw6CXJldHVybiAiR2xvYmFsLCI7CisgICAgY2FzZSBzdF9TdGF0aWM6CXJldHVybiAiU3RhdGljLCI7CisgICAgY2FzZSBzdF9QYXJhbToJcmV0dXJuICJQYXJhbSwiOworICAgIGNhc2Ugc3RfTG9jYWw6CXJldHVybiAiTG9jYWwsIjsKKyAgICBjYXNlIHN0X0xhYmVsOglyZXR1cm4gIkxhYmVsLCI7CisgICAgY2FzZSBzdF9Qcm9jOglyZXR1cm4gIlByb2MsIjsKKyAgICBjYXNlIHN0X0Jsb2NrOglyZXR1cm4gIkJsb2NrLCI7CisgICAgY2FzZSBzdF9FbmQ6CXJldHVybiAiRW5kLCI7CisgICAgY2FzZSBzdF9NZW1iZXI6CXJldHVybiAiTWVtYmVyLCI7CisgICAgY2FzZSBzdF9UeXBlZGVmOglyZXR1cm4gIlR5cGVkZWYsIjsKKyAgICBjYXNlIHN0X0ZpbGU6CXJldHVybiAiRmlsZSwiOworICAgIGNhc2Ugc3RfUmVnUmVsb2M6CXJldHVybiAiUmVnUmVsb2MsIjsKKyAgICBjYXNlIHN0X0ZvcndhcmQ6CXJldHVybiAiRm9yd2FyZCwiOworICAgIGNhc2Ugc3RfU3RhdGljUHJvYzoJcmV0dXJuICJTdGF0aWNQcm9jLCI7CisgICAgY2FzZSBzdF9Db25zdGFudDoJcmV0dXJuICJDb25zdGFudCwiOworICAgIGNhc2Ugc3RfU3RyOglyZXR1cm4gIlN0cmluZywiOworICAgIGNhc2Ugc3RfTnVtYmVyOglyZXR1cm4gIk51bWJlciwiOworICAgIGNhc2Ugc3RfRXhwcjoJcmV0dXJuICJFeHByLCI7CisgICAgY2FzZSBzdF9UeXBlOglyZXR1cm4gIlR5cGUsIjsKKyAgICBjYXNlIHN0X01heDoJcmV0dXJuICJNYXgsIjsKKyAgICB9CisKKyAgcmV0dXJuICI/Pz8sIjsKK30KKworI2VuZGlmIC8qIERFQlVHICovCisMCisvKiBQYXJzZSAuYmVnaW4gZGlyZWN0aXZlcyB3aGljaCBoYXZlIGEgbGFiZWwgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CisgICB3aGljaCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBibG9jay4gICovCisKK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV9iZWdpbiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyIG5hbWVfZW5kOworCisgIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9CbG9jaywgc2NfVGV4dCwKKwkJCSAgIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpLAorCQkJICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisKKyAgLyogVGhlIGxpbmUgbnVtYmVyIGZvbGxvd3MsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICAqLworICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisMCisvKiBQYXJzZSAuYmVuZCBkaXJlY3RpdmVzIHdoaWNoIGhhdmUgYSBsYWJlbCBhcyB0aGUgZmlyc3QgYXJndW1lbnQKKyAgIHdoaWNoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBibG9jay4gICovCisKK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV9iZW5kIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgbmFtZV9lbmQ7CisgIHN5bWJvbFMgKmVuZHN5bTsKKworICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgLyogVGhlIHZhbHVlIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSAuYmVuZCBkaXJlY3RpdmUgYW5kIHRoZQorICAgICBjb3JyZXNwb25kaW5nIHN5bWJvbC4gIFdlIGZpbGwgaW4gdGhlIG9mZnNldCB3aGVuIHdlIHdyaXRlIG91dAorICAgICB0aGUgc3ltYm9sLiAgKi8KKyAgZW5kc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworICBpZiAoZW5kc3ltID09IChzeW1ib2xTICopIE5VTEwpCisgICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIikpOworICBlbHNlCisgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0VuZCwgc2NfVGV4dCwgZW5kc3ltLAorCQkJICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAwLCAoc3ltaW50X3QpIDApOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKworICAvKiBUaGUgbGluZSBudW1iZXIgZm9sbG93cywgYnV0IHdlIGRvbid0IHVzZSBpdC4gICovCisgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwwKKy8qIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGFzIGEgc2VyaWVzIG9mIGRpcmVjdGl2ZXMKKyAgICguZGVmLCAuc2NsLCBldGMuKS4gIFdlIGJ1aWxkIHVwIGluZm9ybWF0aW9uIGFzIHdlIHJlYWQgdGhlCisgICBkaXJlY3RpdmVzIGluIHRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlcywgYW5kIGZpbGUgaXQgYXdheSB3aGVuCisgICB3ZSByZWFjaCB0aGUgLmVuZGVmIGRpcmVjdGl2ZS4gICovCitzdGF0aWMgY2hhciAqY29mZl9zeW1fbmFtZTsKK3N0YXRpYyB0eXBlX2luZm9fdCBjb2ZmX3R5cGU7CitzdGF0aWMgc2NfdCBjb2ZmX3N0b3JhZ2VfY2xhc3M7CitzdGF0aWMgc3RfdCBjb2ZmX3N5bWJvbF90eXA7CitzdGF0aWMgaW50IGNvZmZfaXNfZnVuY3Rpb247CitzdGF0aWMgY2hhciAqY29mZl90YWc7CitzdGF0aWMgdmFsdWVUIGNvZmZfdmFsdWU7CitzdGF0aWMgc3ltYm9sUyAqY29mZl9zeW1fdmFsdWU7CitzdGF0aWMgYmZkX3ZtYSBjb2ZmX3N5bV9hZGRlbmQ7CitzdGF0aWMgaW50IGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uOworCisvKiBIYW5kbGUgYSAuZGVmIGRpcmVjdGl2ZTogc3RhcnQgZGVmaW5pbmcgYSBzeW1ib2wuICAqLworCit2b2lkCitlY29mZl9kaXJlY3RpdmVfZGVmIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgbmFtZV9lbmQ7CisKKyAgZWNvZmZfZGVidWdnaW5nX3NlZW4gPSAxOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGlmIChjb2ZmX3N5bV9uYW1lICE9IChjaGFyICopIE5VTEwpCisgICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7CisgIGVsc2UgaWYgKCpuYW1lID09ICdcMCcpCisgICAgYXNfd2FybiAoXygiRW1wdHkgc3ltYm9sIG5hbWUgaW4gLmRlZjsgaWdub3JlZCIpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChjb2ZmX3N5bV9uYW1lICE9IChjaGFyICopIE5VTEwpCisJZnJlZSAoY29mZl9zeW1fbmFtZSk7CisgICAgICBpZiAoY29mZl90YWcgIT0gKGNoYXIgKikgTlVMTCkKKwlmcmVlIChjb2ZmX3RhZyk7CisgICAgICBjb2ZmX3N5bV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKG5hbWUpICsgMSkpOworICAgICAgc3RyY3B5IChjb2ZmX3N5bV9uYW1lLCBuYW1lKTsKKyAgICAgIGNvZmZfdHlwZSA9IHR5cGVfaW5mb19pbml0OworICAgICAgY29mZl9zdG9yYWdlX2NsYXNzID0gc2NfTmlsOworICAgICAgY29mZl9zeW1ib2xfdHlwID0gc3RfTmlsOworICAgICAgY29mZl9pc19mdW5jdGlvbiA9IDA7CisgICAgICBjb2ZmX3RhZyA9IChjaGFyICopIE5VTEw7CisgICAgICBjb2ZmX3ZhbHVlID0gMDsKKyAgICAgIGNvZmZfc3ltX3ZhbHVlID0gKHN5bWJvbFMgKikgTlVMTDsKKyAgICAgIGNvZmZfc3ltX2FkZGVuZCA9IDA7CisgICAgfQorCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgYSAuZGltIGRpcmVjdGl2ZSwgdXNlZCB0byBnaXZlIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LiAgVGhlCisgICBhcmd1bWVudHMgYXJlIGNvbW1hIHNlcGFyYXRlZCBudW1iZXJzLiAgbWlwcy10ZmlsZSBhc3N1bWVzIHRoYXQKKyAgIHRoZXJlIHdpbGwgbm90IGJlIG1vcmUgdGhhbiA2IGRpbWVuc2lvbnMsIGFuZCBnZGIgd29uJ3QgcmVhZCBhbnkKKyAgIG1vcmUgdGhhbiB0aGF0IGFueWhvdywgc28gSSB3aWxsIGFsc28gbWFrZSB0aGF0IGFzc3VtcHRpb24uICAqLworCit2b2lkCitlY29mZl9kaXJlY3RpdmVfZGltIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGludCBkaW1lbnNbTl9UUV07CisgIGludCBpOworCisgIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IE5fVFE7IGkrKykKKyAgICB7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBkaW1lbnNbaV0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nCisJICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOycpCisJICAgIGFzX3dhcm4gKF8oIkJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSIpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGkgPT0gTl9UUSkKKyAgICAtLWk7CisKKyAgLyogVGhlIGRpbWVuc2lvbnMgYXJlIHN0b3JlZCBhd2F5IGluIHJldmVyc2Ugb3JkZXIuICAqLworICBmb3IgKDsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgaWYgKGNvZmZfdHlwZS5udW1fZGltcyA+PSBOX1RRKQorCXsKKwkgIGFzX3dhcm4gKF8oIlRvbyBtYW55IC5kaW0gZW50cmllcyIpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGNvZmZfdHlwZS5kaW1lbnNpb25zW2NvZmZfdHlwZS5udW1fZGltc10gPSBkaW1lbnNbaV07CisgICAgICArK2NvZmZfdHlwZS5udW1fZGltczsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIGEgLnNjbCBkaXJlY3RpdmUsIHdoaWNoIHNldHMgdGhlIENPRkYgc3RvcmFnZSBjbGFzcyBvZiB0aGUKKyAgIHN5bWJvbC4gICovCisKK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV9zY2wgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgbG9uZyB2YWw7CisKKyAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBjb2ZmX3N5bWJvbF90eXAgPSBtYXBfY29mZl9zeW1fdHlwZVt2YWxdOworICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBtYXBfY29mZl9zdG9yYWdlW3ZhbF07CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIGEgLnNpemUgZGlyZWN0aXZlLiAgRm9yIHNvbWUgcmVhc29uIG1pcHMtdGZpbGUuYyB0aGlua3MgdGhhdAorICAgLnNpemUgY2FuIGhhdmUgbXVsdGlwbGUgYXJndW1lbnRzLiAgV2UgaHVtb3IgaXQsIGFsdGhvdWdoIGdjYyB3aWxsCisgICBuZXZlciBnZW5lcmF0ZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX3NpemUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IHNpemVzW05fVFFdOworICBpbnQgaTsKKworICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTl9UUTsgaSsrKQorICAgIHsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIHNpemVzW2ldID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBlbHNlCisJeworCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJworCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzsnKQorCSAgICBhc193YXJuIChfKCJCYWRseSBmb3JtZWQgLnNpemUgZGlyZWN0aXZlIikpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoaSA9PSBOX1RRKQorICAgIC0taTsKKworICAvKiBUaGUgc2l6ZXMgYXJlIHN0b3JlZCBhd2F5IGluIHJldmVyc2Ugb3JkZXIuICAqLworICBmb3IgKDsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgaWYgKGNvZmZfdHlwZS5udW1fc2l6ZXMgPj0gTl9UUSkKKwl7CisJICBhc193YXJuIChfKCJUb28gbWFueSAuc2l6ZSBlbnRyaWVzIikpOworCSAgYnJlYWs7CisJfQorICAgICAgY29mZl90eXBlLnNpemVzW2NvZmZfdHlwZS5udW1fc2l6ZXNdID0gc2l6ZXNbaV07CisgICAgICArK2NvZmZfdHlwZS5udW1fc2l6ZXM7CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLnR5cGUgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgQ09GRiB0eXBlIG9mIHRoZQorICAgc3ltYm9sLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX3R5cGUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgbG9uZyB2YWw7CisgIHRxX3QgKnRxX3B0cjsKKyAgdHFfdCAqdHFfc2hmdDsKKworICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBjb2ZmX3R5cGUub3JpZ190eXBlID0gQlRZUEUgKHZhbCk7CisgIGNvZmZfdHlwZS5iYXNpY190eXBlID0gbWFwX2NvZmZfdHlwZXNbY29mZl90eXBlLm9yaWdfdHlwZV07CisKKyAgdHFfcHRyID0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV07CisgIHdoaWxlICh2YWwgJn4gTl9CVE1BU0spCisgICAgeworICAgICAgaWYgKHRxX3B0ciA9PSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXSkKKwl7CisJICAvKiBGSVhNRTogV2UgY291bGQgaGFuZGxlIHRoaXMgYnkgc2V0dGluZyB0aGUgY29udGludWVkIGJpdC4KKyAgICAgICAgICAgICBUaGVyZSB3b3VsZCBzdGlsbCBiZSBhIGxpbWl0OiB0aGUgLnR5cGUgYXJndW1lbnQgY2FuIG5vdAorICAgICAgICAgICAgIGJlIGluZmluaXRlLiAgKi8KKwkgIGFzX3dhcm4gKF8oIlRoZSB0eXBlIG9mICVzIGlzIHRvbyBjb21wbGV4OyBpdCB3aWxsIGJlIHNpbXBsaWZpZWQiKSwKKwkJICAgY29mZl9zeW1fbmFtZSk7CisJICBicmVhazsKKwl9CisgICAgICBpZiAoSVNQVFIgKHZhbCkpCisJKi0tdHFfcHRyID0gdHFfUHRyOworICAgICAgZWxzZSBpZiAoSVNGQ04gKHZhbCkpCisJKi0tdHFfcHRyID0gdHFfUHJvYzsKKyAgICAgIGVsc2UgaWYgKElTQVJZICh2YWwpKQorCSotLXRxX3B0ciA9IHRxX0FycmF5OworICAgICAgZWxzZQorCWFzX2ZhdGFsIChfKCJVbnJlY29nbml6ZWQgLnR5cGUgYXJndW1lbnQiKSk7CisKKyAgICAgIHZhbCA9IERFQ1JFRiAodmFsKTsKKyAgICB9CisKKyAgdHFfc2hmdCA9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdOworICB3aGlsZSAodHFfcHRyICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdKQorICAgICp0cV9zaGZ0KysgPSAqdHFfcHRyKys7CisKKyAgaWYgKHRxX3NoZnQgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF0gJiYgdHFfc2hmdFstMV0gPT0gdHFfUHJvYykKKyAgICB7CisgICAgICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIGlnbm9yZSBpdCwgc28gdGhhdCB3ZSBkb24ndCBnZXQgdHdvCisJIGVudHJpZXMgKG9uZSBmcm9tIHRoZSAuZW50LCBhbmQgb25lIGZvciB0aGUgLmRlZiB0aGF0CisJIHByZWNlZGVzIGl0KS4gIFNhdmUgdGhlIHR5cGUgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgZW5kCisJIGJsb2NrIGNhbiBwcm9wZXJseSBhZGQgaXQgYWZ0ZXIgdGhlIGJlZ2luIGJsb2NrIGluZGV4LiAgRm9yCisJIE1JUFMga25vd3Mgd2hhdCByZWFzb24sIHdlIG11c3Qgc3RyaXAgb2ZmIHRoZSBmdW5jdGlvbiB0eXBlCisJIGF0IHRoaXMgcG9pbnQuICAqLworICAgICAgY29mZl9pc19mdW5jdGlvbiA9IDE7CisgICAgICB0cV9zaGZ0Wy0xXSA9IHRxX05pbDsKKyAgICB9CisKKyAgd2hpbGUgKHRxX3NoZnQgIT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbTl9UUV0pCisgICAgKnRxX3NoZnQrKyA9IHRxX05pbDsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIC50YWcgZGlyZWN0aXZlLCB3aGljaCBnaXZlcyB0aGUgbmFtZSBvZiBhIHN0cnVjdHVyZSwKKyAgIHVuaW9uIG9yIGVudW0uICAqLworCit2b2lkCitlY29mZl9kaXJlY3RpdmVfdGFnIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgbmFtZV9lbmQ7CisKKyAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGNvZmZfdGFnID0gKGNoYXIgKikgeG1hbGxvYyAoKHVuc2lnbmVkIGxvbmcpIChzdHJsZW4gKG5hbWUpICsgMSkpOworICBzdHJjcHkgKGNvZmZfdGFnLCBuYW1lKTsKKworICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAudmFsIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJdAorICAgbWF5IGJlIHRoZSBuYW1lIG9mIGEgc3RhdGljIG9yIGdsb2JhbCBzeW1ib2wuICAqLworCit2b2lkCitlY29mZl9kaXJlY3RpdmVfdmFsIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGV4cHJlc3Npb25TIGV4cDsKKworICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGV4cHJlc3Npb24gKCZleHApOworICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCAmJiBleHAuWF9vcCAhPSBPX3N5bWJvbCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIi52YWwgZXhwcmVzc2lvbiBpcyB0b28gY29wbWxleCIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQorICAgIGNvZmZfdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOworICBlbHNlCisgICAgeworICAgICAgY29mZl9zeW1fdmFsdWUgPSBleHAuWF9hZGRfc3ltYm9sOworICAgICAgY29mZl9zeW1fYWRkZW5kID0gZXhwLlhfYWRkX251bWJlcjsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAuZW5kZWYgZGlyZWN0aXZlLCB3aGljaCB0ZXJtaW5hdGVzIHByb2Nlc3Npbmcgb2YgQ09GRgorICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCisKK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV9lbmRlZiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBzeW1pbnRfdCBpbmR4OworICBsb2NhbHN5bV90ICpzeW07CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBiZWZvcmUgLmRlZjsgaWdub3JlZCIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbmFtZSA9IGNvZmZfc3ltX25hbWU7CisgIGNvZmZfc3ltX25hbWUgPSAoY2hhciAqKSBOVUxMOworCisgIC8qIElmIHRoZSBzeW1ib2wgaXMgYSBzdGF0aWMgb3IgZXh0ZXJuYWwsIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gdGhlCisgICAgIGFwcHJvcHJpYXRlIHR5cGUgYW5kIGNsYXNzLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcnJpZGUgdGhvc2UKKyAgICAgdmFsdWVzLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgc29tZSB0eXBlIGFuZCBjbGFzc2VzCisgICAgIHRoYXQgYXJlIG5vdCBpbiBDT0ZGLCBzdWNoIGFzIHNob3J0IGRhdGEsIGV0Yy4gICovCisgIGlmIChjb2ZmX3N5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIHsKKyAgICAgIGNvZmZfc3ltYm9sX3R5cCA9IHN0X05pbDsKKyAgICAgIGNvZmZfc3RvcmFnZV9jbGFzcyA9IHNjX05pbDsKKyAgICB9CisKKyAgY29mZl90eXBlLmV4dHJhX3NpemVzID0gY29mZl90YWcgIT0gKGNoYXIgKikgTlVMTDsKKyAgaWYgKGNvZmZfdHlwZS5udW1fZGltcyA+IDApCisgICAgeworICAgICAgaW50IGRpZmYgPSBjb2ZmX3R5cGUubnVtX2RpbXMgLSBjb2ZmX3R5cGUubnVtX3NpemVzOworICAgICAgaW50IGkgPSBjb2ZmX3R5cGUubnVtX2RpbXMgLSAxOworICAgICAgaW50IGo7CisKKyAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzICE9IDEgfHwgZGlmZiA8IDApCisJeworCSAgYXNfd2FybiAoXygiQmFkIENPRkYgZGVidWdnaW5nIGluZm8iKSk7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIGFycmF5LCBtYWtlIHN1cmUgdGhlIHNhbWUgbnVtYmVyIG9mIGRpbWVuc2lvbnMKKwkgYW5kIHNpemVzIHdlcmUgcGFzc2VkLCBjcmVhdGluZyBleHRyYSBzaXplcyBmb3IgbXVsdGlwbHkKKwkgZGltZW5zaW9uZWQgYXJyYXlzIGlmIG5vdCBwYXNzZWQuICAqLworICAgICAgY29mZl90eXBlLmV4dHJhX3NpemVzID0gMDsKKyAgICAgIGlmIChkaWZmKQorCXsKKwkgIGogPSAoc2l6ZW9mIChjb2ZmX3R5cGUuc2l6ZXMpIC8gc2l6ZW9mIChjb2ZmX3R5cGUuc2l6ZXNbMF0pKSAtIDE7CisJICB3aGlsZSAoaiA+PSAwKQorCSAgICB7CisJICAgICAgY29mZl90eXBlLnNpemVzW2pdID0gKCgoaiAtIGRpZmYpID49IDApCisJCQkJICAgID8gY29mZl90eXBlLnNpemVzW2ogLSBkaWZmXQorCQkJCSAgICA6IDApOworCSAgICAgIGotLTsKKwkgICAgfQorCisJICBjb2ZmX3R5cGUubnVtX3NpemVzID0gaSArIDE7CisJICBmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJICAgIGNvZmZfdHlwZS5zaXplc1tpXSA9IChjb2ZmX3R5cGUuZGltZW5zaW9uc1tpICsgMV0gPT0gMAorCQkJCSAgPyAwCisJCQkJICA6IChjb2ZmX3R5cGUuc2l6ZXNbaSArIDFdCisJCQkJICAgICAvIGNvZmZfdHlwZS5kaW1lbnNpb25zW2kgKyAxXSkpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9NZW1iZXIKKwkgICAmJiBjb2ZmX3R5cGUubnVtX3NpemVzIC0gY29mZl90eXBlLmV4dHJhX3NpemVzID09IDEpCisgICAgeworICAgICAgLyogSXMgdGhpcyBhIGJpdGZpZWxkPyAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgYSBzdHJ1Y3R1cmUgbWVtZWJlcgorCSBoYXZpbmcgYSBzaXplIGZpZWxkIHRoYXQgaXNuJ3QgYW4gYXJyYXkuICAqLworICAgICAgY29mZl90eXBlLmJpdGZpZWxkID0gMTsKKyAgICB9CisKKyAgLyogRXhjZXB0IGZvciBlbnVtZXJhdGlvbiBtZW1iZXJzICYgYmVnaW4vZW5kaW5nIG9mIHNjb3BlcywgcHV0IHRoZQorICAgICB0eXBlIHdvcmQgaW4gdGhlIGF1eC4gc3ltYm9sIHRhYmxlLiAgKi8KKyAgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9CbG9jayB8fCBjb2ZmX3N5bWJvbF90eXAgPT0gc3RfRW5kKQorICAgIGluZHggPSAwOworICBlbHNlIGlmIChjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbikKKyAgICBpbmR4ID0gY3VyX2ZpbGVfcHRyLT52b2lkX3R5cGU7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0CisJICB8fCBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9PSBidF9VbmlvbgorCSAgfHwgY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfRW51bSkKKwl7CisJICBpZiAoY29mZl90YWcgPT0gKGNoYXIgKikgTlVMTCkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oIk5vIHRhZyBzcGVjaWZpZWQgZm9yICVzIiksIG5hbWUpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBjb2ZmX3R5cGUudGFnX3B0ciA9IGdldF90YWcgKGNvZmZfdGFnLCAobG9jYWxzeW1fdCAqKSBOVUxMLAorCQkJCSAgICAgICBjb2ZmX3R5cGUuYmFzaWNfdHlwZSk7CisJfQorCisgICAgICBpZiAoY29mZl9pc19mdW5jdGlvbikKKwl7CisJICBsYXN0X2Z1bmNfdHlwZV9pbmZvID0gY29mZl90eXBlOworCSAgbGFzdF9mdW5jX3N5bV92YWx1ZSA9IGNvZmZfc3ltX3ZhbHVlOworCSAgcmV0dXJuOworCX0KKworICAgICAgaW5keCA9IGFkZF9hdXhfc3ltX3RpciAoJmNvZmZfdHlwZSwKKwkJCSAgICAgIGhhc2hfeWVzLAorCQkJICAgICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7CisgICAgfQorCisgIC8qIERvIGFueSBsYXN0IG1pbnV0ZSBhZGp1c3RtZW50cyB0aGF0IGFyZSBuZWNlc3NhcnkuICAqLworICBzd2l0Y2ggKGNvZmZfc3ltYm9sX3R5cCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBGb3IgdGhlIGJlZ2lubmluZyBvZiBzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBlbnVtZXJhdGlvbnMsIHRoZQorCSBzaXplIGluZm8gbmVlZHMgdG8gYmUgcGFzc2VkIGluIHRoZSB2YWx1ZSBmaWVsZC4gICovCisgICAgY2FzZSBzdF9CbG9jazoKKyAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzIC0gY29mZl90eXBlLm51bV9kaW1zIC0gY29mZl90eXBlLmV4dHJhX3NpemVzCisJICAhPSAxKQorCXsKKwkgIGFzX3dhcm4gKF8oIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJY29mZl92YWx1ZSA9IGNvZmZfdHlwZS5zaXplc1swXTsKKworICAgICAgY29mZl9pbnNpZGVfZW51bWVyYXRpb24gPSAoY29mZl90eXBlLm9yaWdfdHlwZSA9PSBUX0VOVU0pOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEZvciB0aGUgZW5kIG9mIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucywgb21pdCB0aGUKKwkgbmFtZSB3aGljaCBpcyBhbHdheXMgIi5lb3MiLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGxhc3QsIHNvCisJIHRoYXQgYW55IGVycm9yIHJlcG9ydGluZyBhYm92ZSBnaXZlcyB0aGUgY29ycmVjdCBuYW1lLiAgKi8KKyAgICBjYXNlIHN0X0VuZDoKKyAgICAgIGZyZWUgKG5hbWUpOworICAgICAgbmFtZSA9IChjaGFyICopIE5VTEw7CisgICAgICBjb2ZmX3ZhbHVlID0gMDsKKyAgICAgIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBNZW1iZXJzIG9mIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyB0aGF0IGFyZW4ndCBiaXRmaWVsZHMsIG5lZWQKKwkgdG8gYWRqdXN0IHRoZSB2YWx1ZSBmcm9tIGEgYnl0ZSBvZmZzZXQgdG8gYSBiaXQgb2Zmc2V0LgorCSBNZW1iZXJzIG9mIGVudW1lcmF0aW9ucyBkbyBub3QgaGF2ZSB0aGUgdmFsdWUgYWRqdXN0ZWQsIGFuZAorCSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBieSBpbmR4ID09IGluZGV4TmlsLiAgRm9yIGVudW1lcmF0aW9ucywKKwkgdXBkYXRlIHRoZSBtYXhpbXVtIGVudW1lcmF0aW9uIHZhbHVlLiAgKi8KKyAgICBjYXNlIHN0X01lbWJlcjoKKyAgICAgIGlmICghIGNvZmZfdHlwZS5iaXRmaWVsZCAmJiAhIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uKQorCWNvZmZfdmFsdWUgKj0gODsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIEFkZCB0aGUgc3ltYm9sLiAgKi8KKyAgc3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAobmFtZSwKKwkJCSAgY29mZl9zeW1ib2xfdHlwLAorCQkJICBjb2ZmX3N0b3JhZ2VfY2xhc3MsCisJCQkgIGNvZmZfc3ltX3ZhbHVlLAorCQkJICBjb2ZmX3N5bV9hZGRlbmQsCisJCQkgIChzeW1pbnRfdCkgY29mZl92YWx1ZSwKKwkJCSAgaW5keCk7CisKKyAgLyogZGVhbCB3aXRoIHN0cnVjdCwgdW5pb24sIGFuZCBlbnVtIHRhZ3MuICAqLworICBpZiAoY29mZl9zeW1ib2xfdHlwID09IHN0X0Jsb2NrKQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSBvciB1cGRhdGUgdGhlIHRhZyBpbmZvcm1hdGlvbi4gICovCisgICAgICB0YWdfdCAqdGFnX3B0ciA9IGdldF90YWcgKG5hbWUsCisJCQkJc3ltLAorCQkJCWNvZmZfdHlwZS5iYXNpY190eXBlKTsKKyAgICAgIGZvcndhcmRfdCAqKnBmOworCisgICAgICAvKiBSZW1lbWJlciBhbnkgZm9yd2FyZCByZWZlcmVuY2VzLiAgKi8KKyAgICAgIGZvciAocGYgPSAmc3ltLT5mb3J3YXJkX3JlZjsKKwkgICAqcGYgIT0gKGZvcndhcmRfdCAqKSBOVUxMOworCSAgIHBmID0gJigqcGYpLT5uZXh0KQorCTsKKyAgICAgICpwZiA9IHRhZ19wdHItPmZvcndhcmRfcmVmOworICAgICAgdGFnX3B0ci0+Zm9yd2FyZF9yZWYgPSAoZm9yd2FyZF90ICopIE5VTEw7CisgICAgfQorfQorDAorLyogUGFyc2UgLmVuZCBkaXJlY3RpdmVzLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX2VuZCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyIG5hbWVfZW5kOworICByZWdpc3RlciBpbnQgY2g7CisgIHN5bWJvbFMgKmVudDsKKworICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5maWxlIGRpcmVjdGl2ZSIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGNoID0gKm5hbWU7CisgIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKGNoKSkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoZSB2YWx1ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgLmVuZCBkaXJlY3RpdmUgYW5kIHRoZQorICAgICBjb3JyZXNwb25kaW5nIHN5bWJvbC4gIFdlIGNyZWF0ZSBhIGZha2Ugc3ltYm9sIHRvIGhvbGQgdGhlCisgICAgIGN1cnJlbnQgbG9jYXRpb24sIGFuZCBwdXQgaW4gdGhlIG9mZnNldCB3aGVuIHdlIHdyaXRlIG91dCB0aGUKKyAgICAgc3ltYm9sLiAgKi8KKyAgZW50ID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworICBpZiAoZW50ID09IChzeW1ib2xTICopIE5VTEwpCisgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgbmFtZXMgdW5rbm93biBzeW1ib2wiKSk7CisgIGVsc2UKKyAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfRW5kLCBzY19UZXh0LAorCQkJICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKKwkJCQkJICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKKwkJCQkJIGZyYWdfbm93KSwKKwkJCSAgICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKKworICBjdXJfcHJvY19wdHIgPSAocHJvY190ICopIE5VTEw7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorDAorLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX2VudCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyIG5hbWVfZW5kOworICByZWdpc3RlciBpbnQgY2g7CisKKyAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCisgICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOworCisgIGlmIChjdXJfcHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oInNlY29uZCAuZW50IGRpcmVjdGl2ZSBmb3VuZCBiZWZvcmUgLmVuZCBkaXJlY3RpdmUiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOworCisgIGNoID0gKm5hbWU7CisgIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKGNoKSkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gbmFtZSIpKTsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGFkZF9wcm9jZWR1cmUgKG5hbWUpOworCisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKKworICAvKiBUaGUgLmVudCBkaXJlY3RpdmUgaXMgc29tZXRpbWVzIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiAgSSdtIG5vdAorICAgICByZWFsbHkgc3VyZSB3aGF0IHRoZSBudW1iZXIgbWVhbnMuICBJIGRvbid0IHNlZSBhbnkgd2F5IHRvIHN0b3JlCisgICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUERSLiAgVGhlIElyaXggNCBhc3NlbWJsZXIgc2VlbXMgdG8gaWdub3JlCisgICAgIHRoZSBpbmZvcm1hdGlvbi4gICovCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgIH0KKyAgaWYgKGlzZGlnaXQgKCppbnB1dF9saW5lX3BvaW50ZXIpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQorICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorDAorLyogUGFyc2UgLmV4dGVybiBkaXJlY3RpdmVzLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX2V4dGVybiAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgYzsKKyAgc3ltYm9sUyAqc3ltYm9scDsKKyAgdmFsdWVUIHNpemU7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBzeW1ib2xwID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xwKTsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBzeW1ib2xwLT5lY29mZl9leHRlcm5fc2l6ZSA9IHNpemU7Cit9CisMCisvKiBQYXJzZSAuZmlsZSBkaXJlY3RpdmVzLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX2ZpbGUgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IGluZHg7CisgIGNoYXIgKm5hbWU7CisgIGludCBsZW47CisKKyAgaWYgKGN1cl9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiTm8gd2F5IHRvIGhhbmRsZSAuZmlsZSB3aXRoaW4gLmVudC8uZW5kIHNlY3Rpb24iKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbmR4ID0gKGludCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisKKyAgLyogRklYTUU6IHdlIGRvbid0IGhhdmUgdG8gc2F2ZSB0aGUgbmFtZSBoZXJlLiAgKi8KKyAgbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKKworICBhZGRfZmlsZSAobmFtZSwgaW5keCAtIDEsIDApOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisMCisvKiBQYXJzZSAuZm1hc2sgZGlyZWN0aXZlcy4gICovCisKK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBsb25nIHZhbDsKKworICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuZm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCisgICAgeworICAgICAgYXNfd2FybiAoXygiQmFkIC5mbWFzayBkaXJlY3RpdmUiKSk7CisgICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGN1cl9wcm9jX3B0ci0+cGRyLmZyZWdtYXNrID0gdmFsOworICBjdXJfcHJvY19wdHItPnBkci5mcmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwwKKy8qIFBhcnNlIC5mcmFtZSBkaXJlY3RpdmVzLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX2ZyYW1lIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGxvbmcgdmFsOworCisgIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiKSk7CisgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBjdXJfcHJvY19wdHItPnBkci5mcmFtZXJlZyA9IHRjX2dldF9yZWdpc3RlciAoMSk7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJworICAgICAgfHwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKKyAgICB7CisgICAgICBhc193YXJuIChfKCJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIpKTsKKyAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY3VyX3Byb2NfcHRyLT5wZHIuZnJhbWVvZmZzZXQgPSB2YWw7CisKKyAgY3VyX3Byb2NfcHRyLT5wZHIucGNyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOworCisjaWYgMCAvKiBBbHBoYS1PU0YxIGFkZHMgInRoZSBvZmZzZXQgb2Ygc2F2ZWQgJGEwIGZyb20gJHNwIiwgYWNjb3JkaW5nCisJIHRvIFNhbmRyby4gIEkgZG9uJ3QgeWV0IGtub3cgd2hlcmUgdGhpcyB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkLCBpZgorCSBhbnl3aGVyZS4gICovCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisjZWxzZQorICBzX2lnbm9yZSAoNDIpOworI2VuZGlmCit9CisMCisvKiBQYXJzZSAubWFzayBkaXJlY3RpdmVzLiAgKi8KKwordm9pZAorZWNvZmZfZGlyZWN0aXZlX21hc2sgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgbG9uZyB2YWw7CisKKyAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiLm1hc2sgb3V0c2lkZSBvZiAuZW50IikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCisgICAgeworICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrIGRpcmVjdGl2ZSIpKTsKKyAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY3VyX3Byb2NfcHRyLT5wZHIucmVnbWFzayA9IHZhbDsKKyAgY3VyX3Byb2NfcHRyLT5wZHIucmVnb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwwKKy8qIFBhcnNlIC5sb2MgZGlyZWN0aXZlcy4gICovCisKK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV9sb2MgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgbGluZW5vX2xpc3RfdCAqbGlzdDsKKyAgc3ltaW50X3QgbGluZW5vOworCisgIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5sb2MgYmVmb3JlIC5maWxlIikpOworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG5vd19zZWcgIT0gdGV4dF9zZWN0aW9uKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIpKTsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNraXAgdGhlIGZpbGUgbnVtYmVyLiAgKi8KKyAgU0tJUF9XSElURVNQQUNFICgpOworICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIGxpbmVubyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisjaWZuZGVmIE5PX0xJU1RJTkcKKyAgaWYgKGxpc3RpbmcpCisgICAgbGlzdGluZ19zb3VyY2VfbGluZSAobGluZW5vKTsKKyNlbmRpZgorCisgIC8qIElmIHdlJ3JlIGJ1aWxkaW5nIHN0YWJzLCB0aGVuIG91dHB1dCBhIHNwZWNpYWwgbGFiZWwgcmF0aGVyIHRoYW4KKyAgICAgRUNPRkYgbGluZSBudW1iZXIgaW5mby4gICovCisgIGlmIChzdGFic19zZWVuKQorICAgIHsKKyAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY2hhciAqKSBOVUxMLCBzdF9MYWJlbCwgc2NfVGV4dCwKKwkJCSAgICAgICBzeW1ib2xfbmV3ICgiTDBcMDAxIiwgbm93X3NlZywKKwkJCQkJICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAorCQkJCQkgICBmcmFnX25vdyksCisJCQkgICAgICAgKGJmZF92bWEpIDAsIDAsIGxpbmVubyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKKworICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKKyAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKKyAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKKyAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OworICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKKyAgbGlzdC0+bGluZW5vID0gbGluZW5vOworCisgIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLworICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOworCisgIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAorICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KKyAgICAgcGF0Y2ggdGhpcyB1cC4gICovCisgIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmVub19saXN0X3QgKipwbDsKKworICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKKyAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKKwlwbCA9ICYoKnBsKS0+bmV4dDsKKyAgICAgICpwbCA9IGxpc3Q7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGFzdF9saW5lbm8gPSBsaXN0OworICAgICAgKmxhc3RfbGluZW5vX3B0ciA9IGxpc3Q7CisgICAgICBsYXN0X2xpbmVub19wdHIgPSAmbGlzdC0+bmV4dDsKKyAgICB9Cit9CisKKy8qIFRoZSBNSVBTIGFzc2VtYmxlciBzb21ldGltZXMgaW5zZXJ0cyBub3AgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgV2hlbiB0aGlzIGhhcHBlbnMsIHdlIG11c3QgcGF0Y2ggdXAgdGhlIC5sb2MKKyAgIGluZm9ybWF0aW9uIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbm9wLiAgKi8KKwordm9pZAorZWNvZmZfZml4X2xvYyAob2xkX2ZyYWcsIG9sZF9mcmFnX29mZnNldCkKKyAgICAgZnJhZ1MgKm9sZF9mcmFnOworICAgICB1bnNpZ25lZCBsb25nIG9sZF9mcmFnX29mZnNldDsKK3sKKyAgaWYgKGxhc3RfbGluZW5vICE9IE5VTEwKKyAgICAgICYmIGxhc3RfbGluZW5vLT5mcmFnID09IG9sZF9mcmFnCisgICAgICAmJiBsYXN0X2xpbmVuby0+cGFkZHIgPT0gb2xkX2ZyYWdfb2Zmc2V0KQorICAgIHsKKyAgICAgIGxhc3RfbGluZW5vLT5mcmFnID0gZnJhZ19ub3c7CisgICAgICBsYXN0X2xpbmVuby0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7CisgICAgfQorfQorDAorLyogTWFrZSBzdXJlIHRoZSBAc3RhYnMgc3ltYm9sIGlzIGVtaXR0ZWQuICAqLworCitzdGF0aWMgdm9pZAorbWFya19zdGFicyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoISBzdGFic19zZWVuKQorICAgIHsKKyAgICAgIC8qIEFkZCBhIGR1bW15IEBzdGFicyBkeW1ib2wuICovCisgICAgICBzdGFic19zZWVuID0gMTsKKyAgICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sIChzdGFic19zeW1ib2wsIHN0TmlsLCBzY0luZm8sCisJCQkgICAgICAgKHN5bWJvbFMgKikgTlVMTCwKKwkJCSAgICAgICAoYmZkX3ZtYSkgMCwgKHN5bWludF90KSAtMSwKKwkJCSAgICAgICBFQ09GRl9NQVJLX1NUQUIgKDApKTsKKyAgICB9Cit9CisMCisvKiBQYXJzZSAud2Vha2V4dCBkaXJlY3RpdmVzLiAgKi8KKyNpZm5kZWYgVENfTUlQUworLyogRm9yIFRDX01JUFMgdXNlIHRoZSB2ZXJzaW9uIGluIHRjLW1pcHMuYy4gKi8KK3ZvaWQKK2Vjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCBjOworICBzeW1ib2xTICpzeW1ib2xQOworICBleHByZXNzaW9uUyBleHA7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCisJeworCSAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAorCQkgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorCisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwl7CisJICBleHByZXNzaW9uICgmZXhwKTsKKwkgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIpKTsKKwkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lKCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBzeW1ib2xQLT5zeV92YWx1ZSA9IGV4cDsKKwl9CisgICAgfQorCisgIFNfU0VUX1dFQUsgKHN5bWJvbFApOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisjZW5kaWYgLyogbm90IFRDX01JUFMgKi8KKwwKKy8qIEhhbmRsZSAuc3RhYnMgZGlyZWN0aXZlcy4gIFRoZSBhY3R1YWwgcGFyc2luZyByb3V0aW5lIGlzIGRvbmUgYnkgYQorICAgZ2VuZXJpYyByb3V0aW5lLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB2aWEgT0JKX1BST0NFU1NfU1RBQi4KKyAgIFdoZW4gdGhpcyBpcyBjYWxsZWQsIGlucHV0X2xpbmVfcG9pbnRlciB3aWxsIGJlIHBvaW50aW5nIGF0IHRoZQorICAgdmFsdWUgZmllbGQgb2YgdGhlIHN0YWIuCisKKyAgIC5zdGFicyBkaXJlY3RpdmVzIGhhdmUgZml2ZSBmaWVsZHM6CisJInN0cmluZyIJYSBzdHJpbmcsIGVuY29kaW5nIHRoZSB0eXBlIGluZm9ybWF0aW9uLgorCWNvZGUJCWEgbnVtZXJpYyBjb2RlLCBkZWZpbmVkIGluIDxzdGFiLmg+CisJMAkJYSB6ZXJvCisJZGVzYwkJYSB6ZXJvIG9yIGxpbmUgbnVtYmVyCisJdmFsdWUJCWEgbnVtZXJpYyB2YWx1ZSBvciBhbiBhZGRyZXNzLgorCisgICAgSWYgdGhlIHZhbHVlIGlzIHJlbG9jYXRhYmxlLCB3ZSB0cmFuc2Zvcm0gdGhpcyBpbnRvOgorCWlzcwkJcG9pbnRzIGFzIGFuIGluZGV4IGludG8gc3RyaW5nIHNwYWNlCisJdmFsdWUJCXZhbHVlIGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCisJc3QJCXN0IGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCisJc2MJCXNjIGZyb20gbG9va3VwIG9mIHRoZSBuYW1lCisJaW5kZXgJCWNvZGV8Q09ERV9NQVNLCisKKyAgICBJZiB0aGUgdmFsdWUgaXMgbm90IHJlbG9jYXRhYmxlLCB3ZSB0cmFuc2Zvcm0gdGhpcyBpbnRvOgorCWlzcwkJcG9pbnRzIGFzIGFuIGluZGV4IGludG8gc3RyaW5nIHNwYWNlCisJdmFsdWUJCXZhbHVlCisJc3QJCXN0X05pbAorCXNjCQlzY19OaWwKKwlpbmRleAkJY29kZXxDT0RFX01BU0sKKworICAgIC5zdGFibiBkaXJlY3RpdmVzIGhhdmUgZm91ciBmaWVsZHMgKHN0cmluZyBpcyBudWxsKToKKwljb2RlCQlhIG51bWVyaWMgY29kZSwgZGVmaW5lZCBpbiA8c3RhYi5oPgorCTAJCWEgemVybworCWRlc2MJCWEgemVybyBvciBhIGxpbmUgbnVtYmVyCisJdmFsdWUJCWEgbnVtZXJpYyB2YWx1ZSBvciBhbiBhZGRyZXNzLiAgKi8KKwordm9pZAorZWNvZmZfc3RhYiAoc2VjLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKQorICAgICBzZWdUIHNlYzsKKyAgICAgaW50IHdoYXQ7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgaW50IHR5cGU7CisgICAgIGludCBvdGhlcjsKKyAgICAgaW50IGRlc2M7Cit7CisgIGVmZHJfdCAqc2F2ZV9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKKyAgc3ltYm9sUyAqc3ltOworICBzeW1pbnRfdCB2YWx1ZTsKKyAgYmZkX3ZtYSBhZGRlbmQ7CisgIHN0X3Qgc3Q7CisgIHNjX3Qgc2M7CisgIHN5bWludF90IGluZHg7CisgIGxvY2Fsc3ltX3QgKmhvbGQgPSBOVUxMOworCisgIGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMTsKKworICAvKiBXZSBkb24ndCBoYW5kbGUgLnN0YWJkLiAgKi8KKyAgaWYgKHdoYXQgIT0gJ3MnICYmIHdoYXQgIT0gJ24nKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiLnN0YWIlYyBpcyBub3Qgc3VwcG9ydGVkIiksIHdoYXQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBBIC5zdGFibiB1c2VzIGEgbnVsbCBuYW1lLCBub3QgYW4gZW1wdHkgc3RyaW5nLiAgKi8KKyAgaWYgKHdoYXQgPT0gJ24nKQorICAgIHN0cmluZyA9IE5VTEw7CisKKyAgLyogV2UgaWdub3JlIHRoZSBvdGhlciBmaWVsZC4gICovCisgIGlmIChvdGhlciAhPSAwKQorICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IGlnbm9yaW5nIG5vbi16ZXJvIG90aGVyIGZpZWxkIiksIHdoYXQpOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgY3VycmVudCBmaWxlLiAgKi8KKyAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCisgICAgeworICAgICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOworICAgICAgc2F2ZV9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKKyAgICB9CisKKyAgLyogRm9yIHN0YWJzIGluIEVDT0ZGLCB0aGUgZmlyc3Qgc3ltYm9sIG11c3QgYmUgQHN0YWJzLiAgVGhpcyBpcyBhCisgICAgIHNpZ25hbCB0byBnZGIuICAqLworICBpZiAoc3RhYnNfc2VlbiA9PSAwKQorICAgIG1hcmtfc3RhYnMgKDApOworCisgIC8qIExpbmUgbnVtYmVyIHN0YWJzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBzaW5jZSB0aGV5IGhhdmUgdHdvCisgICAgIHZhbHVlcywgdGhlIGxpbmUgbnVtYmVyIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFiZWwuICBXZSB1c2UgdGhlCisgICAgIGluZGV4IGZpZWxkIChha2EgZGVzYykgdG8gaG9sZCB0aGUgbGluZSBudW1iZXIsIGFuZCB0aGUgdmFsdWUKKyAgICAgZmllbGQgdG8gaG9sZCB0aGUgYWRkcmVzcy4gIFRoZSBzeW1ib2wgdHlwZSBpcyBzdF9MYWJlbCwgd2hpY2gKKyAgICAgc2hvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBzdGFicywgc28gdGhhdCBnZGIgY2FuCisgICAgIHJlY29nbml6ZSBpdC4gICovCisgIGlmICh0eXBlID09IE5fU0xJTkUpCisgICAgeworICAgICAgU1lNUiBkdW1teV9zeW1yOworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIGNoYXIgbmFtZV9lbmQ7CisKKyNpZm5kZWYgTk9fTElTVElORworICAgICAgaWYgKGxpc3RpbmcpCisJbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgZGVzYyk7CisjZW5kaWYKKworICAgICAgZHVtbXlfc3ltci5pbmRleCA9IGRlc2M7CisgICAgICBpZiAoZHVtbXlfc3ltci5pbmRleCAhPSBkZXNjKQorCXsKKwkgIGFzX3dhcm4gKF8oIkxpbmUgbnVtYmVyICglZCkgZm9yIC5zdGFiJWMgZGlyZWN0aXZlIGNhbm5vdCBmaXQgaW4gaW5kZXggZmllbGQgKDIwIGJpdHMpIiksCisJCSAgIGRlc2MsIHdoYXQpOworCSAgcmV0dXJuOworCX0KKworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKyAgICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOworCisgICAgICB2YWx1ZSA9IDA7CisgICAgICBhZGRlbmQgPSAwOworICAgICAgc3QgPSBzdF9MYWJlbDsKKyAgICAgIHNjID0gc2NfVGV4dDsKKyAgICAgIGluZHggPSBkZXNjOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZm5kZWYgTk9fTElTVElORworICAgICAgaWYgKGxpc3RpbmcgJiYgKHR5cGUgPT0gTl9TTyB8fCB0eXBlID09IE5fU09MKSkKKwlsaXN0aW5nX3NvdXJjZV9maWxlIChzdHJpbmcpOworI2VuZGlmCisKKyAgICAgIGlmIChpc2RpZ2l0ICgqaW5wdXRfbGluZV9wb2ludGVyKQorCSAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScKKwkgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJysnKQorCXsKKwkgIHN0ID0gc3RfTmlsOworCSAgc2MgPSBzY19OaWw7CisJICBzeW0gPSAoc3ltYm9sUyAqKSBOVUxMOworCSAgdmFsdWUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKwkgIGFkZGVuZCA9IDA7CisJfQorICAgICAgZWxzZSBpZiAoISBpc19uYW1lX2JlZ2lubmVyICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCisJeworCSAgYXNfd2FybiAoXygiSWxsZWdhbCAuc3RhYiVjIGRpcmVjdGl2ZSwgYmFkIGNoYXJhY3RlciIpLCB3aGF0KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXhwcmVzc2lvblMgZXhwOworCisJICBzYyA9IHNjX05pbDsKKwkgIHN0ID0gc3RfTmlsOworCisJICBleHByZXNzaW9uICgmZXhwKTsKKwkgIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgc3ltID0gTlVMTDsKKwkgICAgICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7CisJICAgICAgYWRkZW5kID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wpCisJICAgIHsKKwkgICAgICBzeW0gPSBleHAuWF9hZGRfc3ltYm9sOworCSAgICAgIHZhbHVlID0gMDsKKwkgICAgICBhZGRlbmQgPSBleHAuWF9hZGRfbnVtYmVyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmZXhwKTsKKwkgICAgICB2YWx1ZSA9IDA7CisJICAgICAgYWRkZW5kID0gMDsKKwkgICAgfQorCX0KKworICAgICAgaW5keCA9IEVDT0ZGX01BUktfU1RBQiAodHlwZSk7CisgICAgfQorCisgIC8qIERvbid0IHN0b3JlIHRoZSBzdGFicyBzeW1ib2wgd2UgYXJlIGNyZWF0aW5nIGFzIHRoZSB0eXBlIG9mIHRoZQorICAgICBFQ09GRiBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHR5cGUgb2YgdGhlIEVDT0ZGIHN5bWJvbAorICAgICBpbmRlcGVuZGVudGx5LiAgKi8KKyAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIGhvbGQgPSBzeW0tPmVjb2ZmX3N5bWJvbDsKKworICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyaW5nLCBzdCwgc2MsIHN5bSwgYWRkZW5kLCB2YWx1ZSwgaW5keCk7CisKKyAgaWYgKHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorICAgIHN5bS0+ZWNvZmZfc3ltYm9sID0gaG9sZDsKKworICAvKiBSZXN0b3JlIG5vcm1hbCBmaWxlIHR5cGUuICAqLworICBjdXJfZmlsZV9wdHIgPSBzYXZlX2ZpbGVfcHRyOworfQorDAorLyogRnJvYiBhbiBFQ09GRiBzeW1ib2wuICBTbWFsbCBjb21tb24gc3ltYm9scyBnbyBpbnRvIGEgc3BlY2lhbAorICAgLnNjb21tb24gc2VjdGlvbiByYXRoZXIgdGhhbiBiZmRfY29tX3NlY3Rpb24uICAqLworCit2b2lkCitlY29mZl9mcm9iX3N5bWJvbCAoc3ltKQorICAgICBzeW1ib2xTICpzeW07Cit7CisgIGlmIChTX0lTX0NPTU1PTiAoc3ltKQorICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPiAwCisgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCisgICAgeworICAgICAgc3RhdGljIGFzZWN0aW9uIHNjb21fc2VjdGlvbjsKKyAgICAgIHN0YXRpYyBhc3ltYm9sIHNjb21fc3ltYm9sOworCisgICAgICAvKiBXZSBtdXN0IGNvbnN0cnVjdCBhIGZha2Ugc2VjdGlvbiBzaW1pbGFyIHRvIGJmZF9jb21fc2VjdGlvbgorCSBidXQgd2l0aCB0aGUgbmFtZSAuc2NvbW1vbi4gICovCisgICAgICBpZiAoc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKKwl7CisJICBzY29tX3NlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb247CisJICBzY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7CisJICBzY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmc2NvbV9zZWN0aW9uOworCSAgc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZzY29tX3N5bWJvbDsKKwkgIHNjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZzY29tX3NlY3Rpb24uc3ltYm9sOworCSAgc2NvbV9zeW1ib2wgPSAqYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKKwkgIHNjb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOworCSAgc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZzY29tX3NlY3Rpb247CisJfQorICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCAmc2NvbV9zZWN0aW9uKTsKKyAgICB9CisKKyAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCisgIGlmIChzeW0tPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspCisgICAgeworICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQorCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAorCQlTX0dFVF9OQU1FIChzeW0pKTsKKyAgICB9Cit9CisMCisvKiBBZGQgYnl0ZXMgdG8gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGJ1ZmZlci4gICovCisKK3N0YXRpYyBjaGFyICoKK2Vjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgbmVlZCkKKyAgICAgY2hhciAqKmJ1ZjsKKyAgICAgY2hhciAqKmJ1ZmVuZDsKKyAgICAgY2hhciAqYnVmcHRyOworICAgICB1bnNpZ25lZCBsb25nIG5lZWQ7Cit7CisgIHVuc2lnbmVkIGxvbmcgYXQ7CisgIHVuc2lnbmVkIGxvbmcgd2FudDsKKworICBhdCA9IGJ1ZnB0ciAtICpidWY7CisgIG5lZWQgLT0gKmJ1ZmVuZCAtIGJ1ZnB0cjsKKyAgaWYgKG5lZWQgPCBQQUdFX1NJWkUpCisgICAgbmVlZCA9IFBBR0VfU0laRTsKKyAgd2FudCA9ICgqYnVmZW5kIC0gKmJ1ZikgKyBuZWVkOworICAqYnVmID0geHJlYWxsb2MgKCpidWYsIHdhbnQpOworICAqYnVmZW5kID0gKmJ1ZiArIHdhbnQ7CisgIHJldHVybiAqYnVmICsgYXQ7Cit9CisKKy8qIEFkanVzdCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYnVmZmVyIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAgIGZvciB0aGUgRUNPRkYgdGFyZ2V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgYnVmcHRycHRyKQorICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKKyAgICAgY2hhciAqKmJ1ZjsKKyAgICAgY2hhciAqKmJ1ZmVuZDsKKyAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgIGNoYXIgKipidWZwdHJwdHI7Cit7CisgIGJmZF9zaXplX3R5cGUgYWxpZ247CisKKyAgYWxpZ24gPSBiYWNrZW5kLT5kZWJ1Z19hbGlnbjsKKyAgaWYgKChvZmZzZXQgJiAoYWxpZ24gLSAxKSkgIT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGFkZDsKKworICAgICAgYWRkID0gYWxpZ24gLSAob2Zmc2V0ICYgKGFsaWduIC0gMSkpOworICAgICAgaWYgKCpidWZlbmQgLSAoKmJ1ZiArIG9mZnNldCkgPCBhZGQpCisJKHZvaWQpIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsICpidWYgKyBvZmZzZXQsIGFkZCk7CisgICAgICBtZW1zZXQgKCpidWYgKyBvZmZzZXQsIDAsIGFkZCk7CisgICAgICBvZmZzZXQgKz0gYWRkOworICAgICAgaWYgKGJ1ZnB0cnB0ciAhPSAoY2hhciAqKikgTlVMTCkKKwkqYnVmcHRycHRyID0gKmJ1ZiArIG9mZnNldDsKKyAgICB9CisKKyAgcmV0dXJuIG9mZnNldDsKK30KKworLyogQnVpbGQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2Vjb2ZmX2J1aWxkX2xpbmVubyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgbGluZWNudHB0cikKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7CisgICAgIGNoYXIgKipidWY7CisgICAgIGNoYXIgKipidWZlbmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgICBsb25nICpsaW5lY250cHRyOworeworICBjaGFyICpidWZwdHI7CisgIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKmw7CisgIGxpbmVub19saXN0X3QgKmxhc3Q7CisgIGVmZHJfdCAqZmlsZTsKKyAgcHJvY190ICpwcm9jOworICB1bnNpZ25lZCBsb25nIGM7CisgIGxvbmcgaWxpbmU7CisgIGxvbmcgdG90Y291bnQ7CisgIGxpbmVub19saXN0X3QgZmlyc3Q7CisgIGxpbmVub19saXN0X3QgKmxvY2FsX2ZpcnN0X2xpbmVubyA9IGZpcnN0X2xpbmVubzsKKworICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQorICAgICpsaW5lY250cHRyID0gMDsKKworICBidWZwdHIgPSAqYnVmICsgb2Zmc2V0OworCisgIGZpbGUgPSAoZWZkcl90ICopIE5VTEw7CisgIHByb2MgPSAocHJvY190ICopIE5VTEw7CisgIGxhc3QgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOworICBjID0gb2Zmc2V0OworICBpbGluZSA9IDA7CisgIHRvdGNvdW50ID0gMDsKKworICAvKiBGb3Igc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyBpZ25vcmVkCisgICAgIHdoZW4gcmVhZGluZyBsaW5lIG51bWJlcnMuICBUaGlzIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBhZGRyZXNzIG9mCisgICAgIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgMCwgYnV0IHdoZW4gZ2NjIGlzIGdlbmVyYXRpbmcgTUlQUworICAgICBlbWJlZGRlZCBQSUMgY29kZSwgaXQgd2lsbCBwdXQgc3RyaW5ncyBpbiB0aGUgLnRleHQgc2VjdGlvbgorICAgICBiZWZvcmUgdGhlIGZpcnN0IHByb2NlZHVyZS4gIFdlIGNvcGUgYnkgaW5zZXJ0aW5nIGEgZHVtbXkgbGluZSBpZgorICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIG5vdCAwLiAgSG9wZWZ1bGx5IHRoaXMKKyAgICAgd29uJ3Qgc2NyZXcgdGhpbmdzIHVwIHRvbyBiYWRseS4gIAorCisgICAgIERvbid0IGRvIHRoaXMgZm9yIEVDT0ZGIGFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlcnMuICBUaGV5IHdvcmsKKyAgICAgd2l0aG91dCB0aGlzIGV4dHJhIGF0dGVudGlvbi4gICovCisgIGlmIChkZWJ1Z190eXBlICE9IERFQlVHX0VDT0ZGCisgICAgICAmJiBmaXJzdF9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwKKyAgICAgICYmIGxvY2FsX2ZpcnN0X2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMCisgICAgICAmJiAoKFNfR0VUX1ZBTFVFIChmaXJzdF9wcm9jX3B0ci0+c3ltLT5hc19zeW0pCisJICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsCisJCQkJICBTX0dFVF9TRUdNRU5UIChmaXJzdF9wcm9jX3B0ci0+c3ltLT5hc19zeW0pKSkKKwkgICE9IDApKQorICAgIHsKKyAgICAgIGZpcnN0LmZpbGUgPSBsb2NhbF9maXJzdF9saW5lbm8tPmZpbGU7CisgICAgICBmaXJzdC5wcm9jID0gbG9jYWxfZmlyc3RfbGluZW5vLT5wcm9jOworICAgICAgZmlyc3QuZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKKyAgICAgIGZpcnN0LnBhZGRyID0gMDsKKyAgICAgIGZpcnN0LmxpbmVubyA9IDA7CisKKyAgICAgIGZpcnN0Lm5leHQgPSBsb2NhbF9maXJzdF9saW5lbm87CisgICAgICBsb2NhbF9maXJzdF9saW5lbm8gPSAmZmlyc3Q7CisgICAgfQorCisgIGZvciAobCA9IGxvY2FsX2ZpcnN0X2xpbmVubzsgbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBsb25nIGNvdW50OworICAgICAgbG9uZyBkZWx0YTsKKworICAgICAgLyogR2V0IHRoZSBvZmZzZXQgdG8gdGhlIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBuZXh0IGxpbmUgbnVtYmVyCisJIChpbiB3b3JkcykuICBEbyB0aGlzIGZpcnN0LCBzbyB0aGF0IHdlIGNhbiBza2lwIGFoZWFkIHRvIHRoZQorCSBuZXh0IHVzZWZ1bCBsaW5lIG51bWJlciBlbnRyeS4gICovCisgICAgICBpZiAobC0+bmV4dCA9PSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQorCXsKKwkgIC8qIFdlIHdhbnQgYSBjb3VudCBvZiB6ZXJvLCBidXQgaXQgd2lsbCBiZSBkZWNyZW1lbnRlZAorCSAgICAgYmVmb3JlIGl0IGlzIHVzZWQuICAqLworCSAgY291bnQgPSAxOworCX0KKyAgICAgIGVsc2UgaWYgKGwtPm5leHQtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5uZXh0LT5wYWRkcgorCSAgICAgICA+IGwtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5wYWRkcikKKwl7CisJICBjb3VudCA9ICgobC0+bmV4dC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPm5leHQtPnBhZGRyCisJCSAgICAtIChsLT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+cGFkZHIpKQorCQkgICA+PiAyKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRG9uJ3QgY2hhbmdlIGxhc3QsIHNvIHdlIHN0aWxsIGdldCB0aGUgcmlnaHQgZGVsdGEuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAobC0+ZmlsZSAhPSBmaWxlIHx8IGwtPnByb2MgIT0gcHJvYykKKwl7CisJICBpZiAobC0+cHJvYyAhPSBwcm9jICYmIHByb2MgIT0gKHByb2NfdCAqKSBOVUxMKQorCSAgICBwcm9jLT5wZHIubG5IaWdoID0gbGFzdC0+bGluZW5vOworCSAgaWYgKGwtPmZpbGUgIT0gZmlsZSAmJiBmaWxlICE9IChlZmRyX3QgKikgTlVMTCkKKwkgICAgeworCSAgICAgIGZpbGUtPmZkci5jYkxpbmUgPSBjIC0gZmlsZS0+ZmRyLmNiTGluZU9mZnNldDsKKwkgICAgICBmaWxlLT5mZHIuY2xpbmUgPSB0b3Rjb3VudCArIGNvdW50OworCSAgICAgIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCisJCSpsaW5lY250cHRyICs9IHRvdGNvdW50ICsgY291bnQ7CisJICAgICAgdG90Y291bnQgPSAwOworCSAgICB9CisKKwkgIGlmIChsLT5maWxlICE9IGZpbGUpCisJICAgIHsKKwkgICAgICBlZmRyX3QgKmxhc3RfZmlsZSA9IGZpbGU7CisKKwkgICAgICBmaWxlID0gbC0+ZmlsZTsKKwkgICAgICBpZiAobGFzdF9maWxlICE9IChlZmRyX3QgKikgTlVMTCkKKwkJZmlsZS0+ZmRyLmlsaW5lQmFzZQorCQkgID0gbGFzdF9maWxlLT5mZHIuaWxpbmVCYXNlICsgbGFzdF9maWxlLT5mZHIuY2xpbmU7CisJICAgICAgZWxzZQorCQlmaWxlLT5mZHIuaWxpbmVCYXNlID0gMDsKKwkgICAgICBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0ID0gYzsKKwkgICAgfQorCSAgaWYgKGwtPnByb2MgIT0gcHJvYykKKwkgICAgeworCSAgICAgIHByb2MgPSBsLT5wcm9jOworCSAgICAgIGlmIChwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKKwkJeworCQkgIHByb2MtPnBkci5sbkxvdyA9IGwtPmxpbmVubzsKKwkJICBwcm9jLT5wZHIuY2JMaW5lT2Zmc2V0ID0gYyAtIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQ7CisJCSAgcHJvYy0+cGRyLmlsaW5lID0gdG90Y291bnQ7CisJCX0KKwkgICAgfQorCisJICBsYXN0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKKwl9CisKKyAgICAgIHRvdGNvdW50ICs9IGNvdW50OworCisgICAgICAvKiBHZXQgdGhlIG9mZnNldCB0byB0aGlzIGxpbmUgbnVtYmVyLiAgKi8KKyAgICAgIGlmIChsYXN0ID09IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCisJZGVsdGEgPSAwOworICAgICAgZWxzZQorCWRlbHRhID0gbC0+bGluZW5vIC0gbGFzdC0+bGluZW5vOworCisgICAgICAvKiBQdXQgaW4gdGhlIG9mZnNldCB0byB0aGlzIGxpbmUgbnVtYmVyLiAgKi8KKyAgICAgIHdoaWxlIChkZWx0YSAhPSAwKQorCXsKKwkgIGludCBzZXRjb3VudDsKKworCSAgLyogMSBpcyBhZGRlZCB0byBlYWNoIGNvdW50IHJlYWQuICAqLworCSAgLS1jb3VudDsKKwkgIC8qIFdlIGNhbiBvbmx5IGFkanVzdCB0aGUgd29yZCBjb3VudCBieSB1cCB0byAxNSB3b3JkcyBhdCBhCisJICAgICB0aW1lLiAgKi8KKwkgIGlmIChjb3VudCA8PSAweDBmKQorCSAgICB7CisJICAgICAgc2V0Y291bnQgPSBjb3VudDsKKwkgICAgICBjb3VudCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNldGNvdW50ID0gMHgwZjsKKwkgICAgICBjb3VudCAtPSAweDBmOworCSAgICB9CisJICBpZiAoZGVsdGEgPj0gLTcgJiYgZGVsdGEgPD0gNykKKwkgICAgeworCSAgICAgIGlmIChidWZwdHIgPj0gKmJ1ZmVuZCkKKwkJYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMSk7CisJICAgICAgKmJ1ZnB0cisrID0gc2V0Y291bnQgKyAoZGVsdGEgPDwgNCk7CisJICAgICAgZGVsdGEgPSAwOworCSAgICAgICsrYzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaW50IHNldDsKKworCSAgICAgIGlmICgqYnVmZW5kIC0gYnVmcHRyIDwgMykKKwkJYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMyk7CisJICAgICAgKmJ1ZnB0cisrID0gc2V0Y291bnQgKyAoOCA8PCA0KTsKKwkgICAgICBpZiAoZGVsdGEgPCAtMHg4MDAwKQorCQl7CisJCSAgc2V0ID0gLTB4ODAwMDsKKwkJICBkZWx0YSArPSAweDgwMDA7CisJCX0KKwkgICAgICBlbHNlIGlmIChkZWx0YSA+IDB4N2ZmZikKKwkJeworCQkgIHNldCA9IDB4N2ZmZjsKKwkJICBkZWx0YSAtPSAweDdmZmY7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzZXQgPSBkZWx0YTsKKwkJICBkZWx0YSA9IDA7CisJCX0KKwkgICAgICAqYnVmcHRyKysgPSBzZXQgPj4gODsKKwkgICAgICAqYnVmcHRyKysgPSBzZXQgJiAweGZmZmY7CisJICAgICAgYyArPSAzOworCSAgICB9CisJfQorCisgICAgICAvKiBGaW5pc2ggYWRqdXN0aW5nIHRoZSBjb3VudC4gICovCisgICAgICB3aGlsZSAoY291bnQgPiAwKQorCXsKKwkgIGlmIChidWZwdHIgPj0gKmJ1ZmVuZCkKKwkgICAgYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMSk7CisJICAvKiAxIGlzIGFkZGVkIHRvIGVhY2ggY291bnQgcmVhZC4gICovCisJICAtLWNvdW50OworCSAgaWYgKGNvdW50ID4gMHgwZikKKwkgICAgeworCSAgICAgICpidWZwdHIrKyA9IDB4MGY7CisJICAgICAgY291bnQgLT0gMHgwZjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKmJ1ZnB0cisrID0gY291bnQ7CisJICAgICAgY291bnQgPSAwOworCSAgICB9CisJICArK2M7CisJfQorCisgICAgICArK2lsaW5lOworICAgICAgbGFzdCA9IGw7CisgICAgfQorCisgIGlmIChwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKKyAgICBwcm9jLT5wZHIubG5IaWdoID0gbGFzdC0+bGluZW5vOworICBpZiAoZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCisgICAgeworICAgICAgZmlsZS0+ZmRyLmNiTGluZSA9IGMgLSBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0OworICAgICAgZmlsZS0+ZmRyLmNsaW5lID0gdG90Y291bnQ7CisgICAgfQorCisgIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCisgICAgKmxpbmVjbnRwdHIgKz0gdG90Y291bnQ7CisKKyAgYyA9IGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgYywgJmJ1ZnB0cik7CisKKyAgcmV0dXJuIGM7Cit9CisKKy8qIEJ1aWxkIGFuZCBzd2FwIG91dCB0aGUgc3ltYm9scy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitlY29mZl9idWlsZF9zeW1ib2xzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQorICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKKyAgICAgY2hhciAqKmJ1ZjsKKyAgICAgY2hhciAqKmJ1ZmVuZDsKKyAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9zeW1fc2l6ZTsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCisgICAgPSBiYWNrZW5kLT5zd2FwX3N5bV9vdXQ7CisgIGNoYXIgKnN5bV9vdXQ7CisgIGxvbmcgaXN5bTsKKyAgdmxpbmtzX3QgKmZpbGVfbGluazsKKworICBzeW1fb3V0ID0gKmJ1ZiArIG9mZnNldDsKKworICBpc3ltID0gMDsKKworICAvKiBUaGUgc3ltYm9scyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLworICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKKyAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7CisgICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBpZmlsZXN5bTsKKyAgICAgIGludCBmaWxfY250OworICAgICAgZWZkcl90ICpmaWxfcHRyOworICAgICAgZWZkcl90ICpmaWxfZW5kOworCisgICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQorCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7CisgICAgICBlbHNlCisJZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOworICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7CisgICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7CisgICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKKwl7CisJICB2bGlua3NfdCAqc3ltX2xpbms7CisKKwkgIGZpbF9wdHItPmZkci5pc3ltQmFzZSA9IGlzeW07CisJICBpZmlsZXN5bSA9IGlzeW07CisJICBmb3IgKHN5bV9saW5rID0gZmlsX3B0ci0+c3ltYm9scy5maXJzdDsKKwkgICAgICAgc3ltX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7CisJICAgICAgIHN5bV9saW5rID0gc3ltX2xpbmstPm5leHQpCisJICAgIHsKKwkgICAgICBpbnQgc3ltX2NudDsKKwkgICAgICBsb2NhbHN5bV90ICpzeW1fcHRyOworCSAgICAgIGxvY2Fsc3ltX3QgKnN5bV9lbmQ7CisKKwkgICAgICBpZiAoc3ltX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCisJCXN5bV9jbnQgPSBmaWxfcHRyLT5zeW1ib2xzLm9iamVjdHNfbGFzdF9wYWdlOworCSAgICAgIGVsc2UKKwkJc3ltX2NudCA9IGZpbF9wdHItPnN5bWJvbHMub2JqZWN0c19wZXJfcGFnZTsKKwkgICAgICBzeW1fcHRyID0gc3ltX2xpbmstPmRhdHVtLT5zeW07CisJICAgICAgc3ltX2VuZCA9IHN5bV9wdHIgKyBzeW1fY250OworCSAgICAgIGZvciAoOyBzeW1fcHRyIDwgc3ltX2VuZDsgc3ltX3B0cisrKQorCQl7CisJCSAgaW50IGxvY2FsOworCQkgIHN5bWJvbFMgKmFzX3N5bTsKKwkJICBmb3J3YXJkX3QgKmY7CisKKwkJICBrbm93IChzeW1fcHRyLT5maWxlX3B0ciA9PSBmaWxfcHRyKTsKKworCQkgIC8qIElmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgZ2FzIHN5bWJvbCwgdGhlbiB0aGlzCisJCSAgICAgaXMgYSBwdXJlIGRlYnVnZ2luZyBzeW1ib2wuICBXZSBoYXZlIGFscmVhZHkKKwkJICAgICBhZGRlZCB0aGUgbmFtZSAoaWYgYW55KSB0byBmaWxfcHRyLT5zdHJpbmdzLgorCQkgICAgIE90aGVyd2lzZSB3ZSBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoaXMgaXMgYW4KKwkJICAgICBleHRlcm5hbCBvciBhIGxvY2FsIHN5bWJvbCAoYWN0dWFsbHksIGl0IG1heSBiZQorCQkgICAgIGJvdGggaWYgdGhlIGxvY2FsIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGVidWdnaW5nCisJCSAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBleHRlcm5hbCkuICAqLworCQkgIGxvY2FsID0gMTsKKwkJICBhc19zeW0gPSBzeW1fcHRyLT5hc19zeW07CisJCSAgaWYgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQorCQkgICAgeworCQkgICAgICBzeW1pbnRfdCBpbmR4OworCisJCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIGJsb2NrIHN0YXJ0IHN5bWJvbCBpcyB0aGUKKwkJCSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHByb2NlZHVyZS4gIEZvcgorCQkJIG90aGVyIHN5bWJvbHMgd2UganVzdCB1c2UgdGhlIGdhcyB2YWx1ZSAoYnV0CisJCQkgd2UgbXVzdCBvZmZzZXQgaXQgYnkgdGhlIHZtYSBvZiB0aGUgc2VjdGlvbiwKKwkJCSBqdXN0IGFzIEJGRCBkb2VzLCBiZWNhdXNlIEJGRCB3aWxsIG5vdCBzZWUKKwkJCSB0aGlzIHZhbHVlKS4gICovCisJCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSAoaW50KSBzdF9CbG9jaworCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9PSAoaW50KSBzY19UZXh0KQorCQkJeworCQkJICBzeW1ib2xTICpiZWdpbl9zeW07CisKKwkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKKwkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOworCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQorCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKKwkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOworCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9CisJCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQorCQkJICAoU19HRVRfVkFMVUUgKGFzX3N5bSkKKwkJCSAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAorCQkJCQkJICBTX0dFVF9TRUdNRU5UIChhc19zeW0pKQorCQkJICAgKyBzeW1fcHRyLT5hZGRlbmQpOworCisJCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS53ZWFrZXh0ID0gU19JU19XRUFLIChhc19zeW0pOworCisJCSAgICAgIC8qIFNldCBzdF9Qcm9jIHRvIHN0X1N0YXRpY1Byb2MgZm9yIGxvY2FsCisJCQkgZnVuY3Rpb25zLiAgKi8KKwkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1Byb2MKKwkJCSAgJiYgU19JU19ERUZJTkVEIChhc19zeW0pCisJCQkgICYmICEgU19JU19FWFRFUk5BTCAoYXNfc3ltKQorCQkJICAmJiAhIFNfSVNfV0VBSyAoYXNfc3ltKSkKKwkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID0gc3RfU3RhdGljUHJvYzsKKworCQkgICAgICAvKiBHZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MgYmFzZWQgb24gd2hlcmUKKwkJCSB0aGUgc3ltYm9sIGFjdHVhbGx5IHdvdW5kIHVwLiAgVHJhZGl0aW9uYWxseSwKKwkJCSBOX0xCUkFDIGFuZCBOX1JCUkFDIGFyZSAqbm90KiByZWxvY2F0ZWQuICovCisJCSAgICAgIGluZHggPSBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleDsKKwkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X05pbAorCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9PSBzY19OaWwKKwkJCSAgJiYgKCEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKQorCQkJICAgICAgfHwgKChFQ09GRl9VTk1BUktfU1RBQiAoaW5keCkgIT0gTl9MQlJBQykKKwkJCQkgICYmIChFQ09GRl9VTk1BUktfU1RBQiAoaW5keCkgIT0gTl9SQlJBQykpKSkKKwkJCXsKKwkJCSAgc2VnVCBzZWc7CisJCQkgIGNvbnN0IGNoYXIgKnNlZ25hbWU7CisJCQkgIHN0X3Qgc3Q7CisJCQkgIHNjX3Qgc2M7CisKKwkJCSAgc2VnID0gU19HRVRfU0VHTUVOVCAoYXNfc3ltKTsKKwkJCSAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAoc2VnKTsKKworCQkJICBpZiAoISBFQ09GRl9JU19TVEFCICgmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0pCisJCQkgICAgICAmJiAoU19JU19FWFRFUk5BTCAoYXNfc3ltKQorCQkJCSAgfHwgU19JU19XRUFLIChhc19zeW0pCisJCQkJICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkpCisJCQkgICAgeworCQkJICAgICAgaWYgKChhc19zeW0tPmJzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQorCQkJCXN0ID0gc3RfUHJvYzsKKwkJCSAgICAgIGVsc2UKKwkJCQlzdCA9IHN0X0dsb2JhbDsKKwkJCSAgICB9CisJCQkgIGVsc2UgaWYgKHNlZyA9PSB0ZXh0X3NlY3Rpb24pCisJCQkgICAgc3QgPSBzdF9MYWJlbDsKKwkJCSAgZWxzZQorCQkJICAgIHN0ID0gc3RfU3RhdGljOworCisJCQkgIGlmICghIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKKwkJCSAgICB7CisJCQkgICAgICBpZiAoYXNfc3ltLT5lY29mZl9leHRlcm5fc2l6ZSA9PSAwCisJCQkJICB8fCAoYXNfc3ltLT5lY29mZl9leHRlcm5fc2l6ZQorCQkJCSAgICAgID4gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKSkKKwkJCQlzYyA9IHNjX1VuZGVmaW5lZDsKKwkJCSAgICAgIGVsc2UKKwkJCQl7CisJCQkJICBzYyA9IHNjX1NVbmRlZmluZWQ7CisJCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9CisJCQkJICAgIGFzX3N5bS0+ZWNvZmZfZXh0ZXJuX3NpemU7CisJCQkJfQorI2lmZGVmIFNfU0VUX1NJWkUKKwkJCSAgICAgIFNfU0VUX1NJWkUgKGFzX3N5bSwgYXNfc3ltLT5lY29mZl9leHRlcm5fc2l6ZSk7CisjZW5kaWYKKwkJCSAgICB9CisJCQkgIGVsc2UgaWYgKFNfSVNfQ09NTU9OIChhc19zeW0pKQorCQkJICAgIHsKKwkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoYXNfc3ltKSA+IDAKKwkJCQkgICYmIChTX0dFVF9WQUxVRSAoYXNfc3ltKQorCQkJCSAgICAgIDw9IGJmZF9nZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0KSkpCisJCQkJc2MgPSBzY19TQ29tbW9uOworCQkJICAgICAgZWxzZQorCQkJCXNjID0gc2NfQ29tbW9uOworCQkJICAgIH0KKwkJCSAgZWxzZSBpZiAoc2VnID09IHRleHRfc2VjdGlvbikKKwkJCSAgICBzYyA9IHNjX1RleHQ7CisJCQkgIGVsc2UgaWYgKHNlZyA9PSBkYXRhX3NlY3Rpb24pCisJCQkgICAgc2MgPSBzY19EYXRhOworCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIucmRhdGEiKSA9PSAwCisJCQkJICAgfHwgc3RyY21wIChzZWduYW1lLCAiLnJvZGF0YSIpID09IDApCisJCQkgICAgc2MgPSBzY19SRGF0YTsKKwkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnNkYXRhIikgPT0gMCkKKwkJCSAgICBzYyA9IHNjX1NEYXRhOworCQkJICBlbHNlIGlmIChzZWcgPT0gYnNzX3NlY3Rpb24pCisJCQkgICAgc2MgPSBzY19Cc3M7CisJCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5zYnNzIikgPT0gMCkKKwkJCSAgICBzYyA9IHNjX1NCc3M7CisJCQkgIGVsc2UgaWYgKHNlZyA9PSAmYmZkX2Fic19zZWN0aW9uKQorCQkJICAgIHNjID0gc2NfQWJzOworCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgLyogVGhpcyBtdXN0IGJlIGEgdXNlciBuYW1lZCBzZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBub3QgcG9zc2libGUgaW4gRUNPRkYsIGJ1dCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gRUxGLiAgKi8KKwkJCSAgICAgIHNjID0gc2NfRGF0YTsKKwkJCSAgICB9CisKKwkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdDsKKwkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzYzsKKwkJCX0KKworCQkgICAgICAvKiBUaGlzIGlzIGp1c3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGlzCisJCQkgb3V0c2lkZSBhIHByb2NlZHVyZSBhbmQgaXQgaGFzIGEgdHlwZS4KKwkJCSBGSVhNRTogZysrIHdpbGwgZ2VuZXJhdGUgc3ltYm9scyB3aGljaCBoYXZlCisJCQkgZGlmZmVyZW50IG5hbWVzIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKwkJCSB0aGFuIHRoZSBhY3R1YWwgc3ltYm9sLiAgU2hvdWxkIHdlIGhhbmRsZQorCQkJIHRoZW0gaGVyZT8gICovCisJCSAgICAgIGlmICgoU19JU19FWFRFUk5BTCAoYXNfc3ltKQorCQkJICAgfHwgU19JU19XRUFLIChhc19zeW0pCisJCQkgICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkKKwkJCSAgJiYgc3ltX3B0ci0+cHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMCisJCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ICE9IChpbnQpIHN0X05pbAorCQkJICAmJiAhIEVDT0ZGX0lTX1NUQUIgKCZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSkpCisJCQlsb2NhbCA9IDA7CisKKwkJICAgICAgLyogVGhpcyBpcyBqdXN0IGFuIGV4dGVybmFsIHN5bWJvbCBpZiBpdCBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uIHN5bWJvbC4gICovCisJCSAgICAgIGlmIChTX0lTX0NPTU1PTiAoYXNfc3ltKSkKKwkJCWxvY2FsID0gMDsKKworCQkgICAgICAvKiBJZiBhbiBzdF9lbmQgc3ltYm9sIGhhcyBhbiBhc3NvY2lhdGVkIGdhcworCQkJIHN5bWJvbCwgdGhlbiBpdCBpcyBhIGxvY2FsIGxhYmVsIGNyZWF0ZWQgZm9yCisJCQkgYSAuYmVuZCBvciAuZW5kIGRpcmVjdGl2ZS4gIFN0YWJzIGxpbmUKKwkJCSBudW1iZXJzIHdpbGwgaGF2ZSBcMDAxIGluIHRoZSBuYW1lcy4gICovCisJCSAgICAgIGlmIChsb2NhbAorCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCAhPSBzdF9FbmQKKwkJCSAgJiYgc3RyY2hyIChzeW1fcHRyLT5uYW1lLCAnXDAwMScpID09IDApCisJCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQorCQkJICBhZGRfc3RyaW5nICgmZmlsX3B0ci0+c3RyaW5ncywKKwkJCQkgICAgICBmaWxfcHRyLT5zdHJfaGFzaCwKKwkJCQkgICAgICBzeW1fcHRyLT5uYW1lLAorCQkJCSAgICAgIChzaGFzaF90ICoqKSBOVUxMKTsKKwkJICAgIH0KKworCQkgIC8qIFdlIG5vdyBrbm93IHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbDsgZmlsbCBpbgorCQkgICAgIGxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB3YWl0aW5nIGZvciB0aGF0CisJCSAgICAgaW5mb3JtYXRpb24uICAqLworCQkgIGlmIChzeW1fcHRyLT5iZWdpbl9wdHIgIT0gKGxvY2Fsc3ltX3QgKikgTlVMTCkKKwkJICAgIHsKKwkJICAgICAgbG9jYWxzeW1fdCAqYmVnaW5fcHRyOworCQkgICAgICBzdF90IGJlZ2luX3R5cGU7CisKKwkJICAgICAga25vdyAobG9jYWwpOworCQkgICAgICBiZWdpbl9wdHIgPSBzeW1fcHRyLT5iZWdpbl9wdHI7CisJCSAgICAgIGtub3cgKGJlZ2luX3B0ci0+c3ltX2luZGV4ICE9IC0xKTsKKwkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBiZWdpbl9wdHItPnN5bV9pbmRleDsKKwkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnNjICE9IChpbnQpIHNjX0luZm8pCisJCQlzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pc3MgPQorCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzczsKKworCQkgICAgICBiZWdpbl90eXBlID0gYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bS5zdDsKKwkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfRmlsZQorCQkJICB8fCBiZWdpbl90eXBlID09IHN0X0Jsb2NrKQorCQkJeworCQkJICBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0KKwkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOworCQkJICAoKnN3YXBfc3ltX291dCkgKHN0ZG91dHB1dCwKKwkJCQkJICAgJmJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCisJCQkJCSAgICgqYnVmCisJCQkJCSAgICArIG9mZnNldAorCQkJCQkgICAgKyAoYmVnaW5fcHRyLT5zeW1faW5kZXgKKwkJCQkJICAgICAgICogZXh0ZXJuYWxfc3ltX3NpemUpKSk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAga25vdyAoYmVnaW5fcHRyLT5pbmRleF9wdHIgIT0gKGF1eF90ICopIE5VTEwpOworCQkJICBiZWdpbl9wdHItPmluZGV4X3B0ci0+ZGF0YS5pc3ltID0KKwkJCSAgICBpc3ltIC0gaWZpbGVzeW0gKyAxOworCQkJfQorCisJCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCisJCQkgcHJvY2VkdXJlIGlzIHRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUuICBUaGUKKwkJCSB2YWx1ZSBvZiB0aGUgc3ltYm9sIG1hcmtpbmcgdGhlIGVuZCBvZiBhCisJCQkgYmxvY2sgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKwkJCSBwcm9jZWR1cmUgdG8gdGhlIGJsb2NrLiAgKi8KKwkJICAgICAgaWYgKGJlZ2luX3R5cGUgPT0gc3RfUHJvYworCQkJICB8fCBiZWdpbl90eXBlID09IHN0X1N0YXRpY1Byb2MpCisJCQl7CisJCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKKwkJCSAga25vdyAoYmVnaW5fcHRyLT5hc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTCk7CisJCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCisJCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9wdHItPmFzX3N5bSkpCisJCQkgICAgYXNfd2FybiAoXygiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKKwkJCSAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQorCQkJICAgIChTX0dFVF9WQUxVRSAoYXNfc3ltKQorCQkJICAgICAtIFNfR0VUX1ZBTFVFIChiZWdpbl9wdHItPmFzX3N5bSkpOworCisJCQkgIC8qIElmIHRoZSBzaXplIGlzIG9kZCwgdGhpcyBpcyBwcm9iYWJseSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHMxNiBmdW5jdGlvbjsgZm9yY2UgaXQgdG8gYmUgZXZlbi4gICovCisJCQkgIGlmICgoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgJiAxKSAhPSAwKQorCQkJICAgICsrc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWU7CisKKyNpZmRlZiBTX1NFVF9TSVpFCisJCQkgIFNfU0VUX1NJWkUgKGJlZ2luX3B0ci0+YXNfc3ltLAorCQkJCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlKTsKKyNlbmRpZgorCQkJfQorCQkgICAgICBlbHNlIGlmIChiZWdpbl90eXBlID09IHN0X0Jsb2NrCisJCQkgICAgICAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgIT0gKGludCkgc2NfSW5mbykKKwkJCXsKKwkJCSAgc3ltYm9sUyAqYmVnaW5fc3ltOworCisJCQkgIGtub3cgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKKwkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKKwkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOworCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQorCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKKwkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOworCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9CisJCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKKwkJCX0KKwkJICAgIH0KKworCQkgIGZvciAoZiA9IHN5bV9wdHItPmZvcndhcmRfcmVmOworCQkgICAgICAgZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7CisJCSAgICAgICBmID0gZi0+bmV4dCkKKwkJICAgIHsKKwkJICAgICAga25vdyAobG9jYWwpOworCQkgICAgICBmLT5pZmRfcHRyLT5kYXRhLmlzeW0gPSBmaWxfcHRyLT5maWxlX2luZGV4OworCQkgICAgICBmLT5pbmRleF9wdHItPmRhdGEucm5keC5pbmRleCA9IGlzeW0gLSBpZmlsZXN5bTsKKwkJICAgIH0KKworCQkgIGlmIChsb2NhbCkKKwkJICAgIHsKKwkJICAgICAgaWYgKCpidWZlbmQgLSBzeW1fb3V0IDwgZXh0ZXJuYWxfc3ltX3NpemUpCisJCQlzeW1fb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwKKwkJCQkJCSAgIHN5bV9vdXQsCisJCQkJCQkgICBleHRlcm5hbF9zeW1fc2l6ZSk7CisJCSAgICAgICgqc3dhcF9zeW1fb3V0KSAoc3Rkb3V0cHV0LCAmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0sCisJCQkJICAgICAgIHN5bV9vdXQpOworCQkgICAgICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOworCisJCSAgICAgIHN5bV9wdHItPnN5bV9pbmRleCA9IGlzeW07CisKKwkJICAgICAgaWYgKHN5bV9wdHItPnByb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTAorCQkJICAmJiBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltID09IHN5bV9wdHIpCisJCQlzeW1fcHRyLT5wcm9jX3B0ci0+cGRyLmlzeW0gPSBpc3ltIC0gaWZpbGVzeW07CisKKwkJICAgICAgKytpc3ltOworCQkgICAgfQorCisJCSAgLyogUmVjb3JkIHRoZSBsb2NhbCBzeW1ib2wgaW5kZXggYW5kIGZpbGUgbnVtYmVyIGluCisJCSAgICAgY2FzZSB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gIE5vdGUgdGhhdCB0aGlzCisJCSAgICAgZGVzdHJveXMgdGhlIGFzeW0uaW5kZXggZmllbGQuICAqLworCQkgIGlmIChhc19zeW0gIT0gKHN5bWJvbFMgKikgTlVMTAorCQkgICAgICAmJiBhc19zeW0tPmVjb2ZmX3N5bWJvbCA9PSBzeW1fcHRyKQorCQkgICAgeworCQkgICAgICBpZiAoKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1Byb2MKKwkJCSAgIHx8IHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1N0YXRpY1Byb2MpCisJCQkgICYmIGxvY2FsKQorCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpc3ltIC0gaWZpbGVzeW0gLSAxOworCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0uaWZkID0gZmlsX3B0ci0+ZmlsZV9pbmRleDsKKworCQkgICAgICAvKiBEb24ndCB0cnkgdG8gbWVyZ2UgYW4gRkRSIHdoaWNoIGhhcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHN5bWJvbCBhdHRhY2hlZCB0byBpdC4gICovCisJCSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChhc19zeW0pIHx8IFNfSVNfV0VBSyAoYXNfc3ltKSkKKwkJCWZpbF9wdHItPmZkci5mTWVyZ2UgPSAwOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGZpbF9wdHItPmZkci5jc3ltID0gaXN5bSAtIGZpbF9wdHItPmZkci5pc3ltQmFzZTsKKwl9CisgICAgfQorCisgIHJldHVybiBvZmZzZXQgKyBpc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Cit9CisKKy8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworZWNvZmZfYnVpbGRfcHJvY3MgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOworICAgICBjaGFyICoqYnVmOworICAgICBjaGFyICoqYnVmZW5kOworICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKK3sKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOworICB2b2lkICgqIGNvbnN0IHN3YXBfcGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKQorICAgID0gYmFja2VuZC0+c3dhcF9wZHJfb3V0OworICBjaGFyICpwZHJfb3V0OworICBsb25nIGlwcm9jOworICB2bGlua3NfdCAqZmlsZV9saW5rOworCisgIHBkcl9vdXQgPSAqYnVmICsgb2Zmc2V0OworCisgIGlwcm9jID0gMDsKKworICAvKiBUaGUgcHJvY2VkdXJlcyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLworICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKKyAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7CisgICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBmaWxfY250OworICAgICAgZWZkcl90ICpmaWxfcHRyOworICAgICAgZWZkcl90ICpmaWxfZW5kOworCisgICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQorCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7CisgICAgICBlbHNlCisJZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOworICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7CisgICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7CisgICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKKwl7CisJICB2bGlua3NfdCAqcHJvY19saW5rOworCSAgaW50IGZpcnN0OworCisJICBmaWxfcHRyLT5mZHIuaXBkRmlyc3QgPSBpcHJvYzsKKwkgIGZpcnN0ID0gMTsKKwkgIGZvciAocHJvY19saW5rID0gZmlsX3B0ci0+cHJvY3MuZmlyc3Q7CisJICAgICAgIHByb2NfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKKwkgICAgICAgcHJvY19saW5rID0gcHJvY19saW5rLT5uZXh0KQorCSAgICB7CisJICAgICAgaW50IHByY19jbnQ7CisJICAgICAgcHJvY190ICpwcm9jX3B0cjsKKwkgICAgICBwcm9jX3QgKnByb2NfZW5kOworCisJICAgICAgaWYgKHByb2NfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKKwkJcHJjX2NudCA9IGZpbF9wdHItPnByb2NzLm9iamVjdHNfbGFzdF9wYWdlOworCSAgICAgIGVsc2UKKwkJcHJjX2NudCA9IGZpbF9wdHItPnByb2NzLm9iamVjdHNfcGVyX3BhZ2U7CisJICAgICAgcHJvY19wdHIgPSBwcm9jX2xpbmstPmRhdHVtLT5wcm9jOworCSAgICAgIHByb2NfZW5kID0gcHJvY19wdHIgKyBwcmNfY250OworCSAgICAgIGZvciAoOyBwcm9jX3B0ciA8IHByb2NfZW5kOyBwcm9jX3B0cisrKQorCQl7CisJCSAgc3ltYm9sUyAqYWRyX3N5bTsKKwkJICB1bnNpZ25lZCBsb25nIGFkcjsKKworCQkgIGFkcl9zeW0gPSBwcm9jX3B0ci0+c3ltLT5hc19zeW07CisJCSAgYWRyID0gKFNfR0VUX1ZBTFVFIChhZHJfc3ltKQorCQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAorCQkJCQkJU19HRVRfU0VHTUVOVCAoYWRyX3N5bSkpKTsKKwkJICBpZiAoZmlyc3QpCisJCSAgICB7CisJCSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGZvcmNlIHRoZSBhZHIgb2YgdGhlIHZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBmZHIgdG8gYmUgMC4gIEhvd2V2ZXIsIHRoZSBuYXRpdmUgdG9vbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBkbyB0aGF0LCBhbmQgSSBjYW4ndCByZW1lbWJlciB3aHkgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHdvcmsgdGhhdCB3YXksIHNvIEkgdG9vayBpdCBvdXQuICAqLworCQkgICAgICBmaWxfcHRyLT5mZHIuYWRyID0gYWRyOworCQkgICAgICBmaXJzdCA9IDA7CisJCSAgICB9CisJCSAgcHJvY19wdHItPnBkci5hZHIgPSBhZHIgLSBmaWxfcHRyLT5mZHIuYWRyOworCQkgIGlmICgqYnVmZW5kIC0gcGRyX291dCA8IGV4dGVybmFsX3Bkcl9zaXplKQorCQkgICAgcGRyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCisJCQkJCSAgICAgICBwZHJfb3V0LAorCQkJCQkgICAgICAgZXh0ZXJuYWxfcGRyX3NpemUpOworCQkgICgqc3dhcF9wZHJfb3V0KSAoc3Rkb3V0cHV0LCAmcHJvY19wdHItPnBkciwgcGRyX291dCk7CisJCSAgcGRyX291dCArPSBleHRlcm5hbF9wZHJfc2l6ZTsKKwkJICArK2lwcm9jOworCQl9CisJICAgIH0KKwkgIGZpbF9wdHItPmZkci5jcGQgPSBpcHJvYyAtIGZpbF9wdHItPmZkci5pcGRGaXJzdDsKKwl9CisgICAgfQorCisgIHJldHVybiBvZmZzZXQgKyBpcHJvYyAqIGV4dGVybmFsX3Bkcl9zaXplOworfQorCisvKiBTd2FwIG91dCB0aGUgYXV4IGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2Vjb2ZmX2J1aWxkX2F1eCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7CisgICAgIGNoYXIgKipidWY7CisgICAgIGNoYXIgKipidWZlbmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworeworICBpbnQgYmlnZW5kaWFuOworICB1bmlvbiBhdXhfZXh0ICphdXhfb3V0OworICBsb25nIGlhdXg7CisgIHZsaW5rc190ICpmaWxlX2xpbms7CisKKyAgYmlnZW5kaWFuID0gYmZkX2JpZ19lbmRpYW4gKHN0ZG91dHB1dCk7CisKKyAgYXV4X291dCA9ICh1bmlvbiBhdXhfZXh0ICopICgqYnVmICsgb2Zmc2V0KTsKKworICBpYXV4ID0gMDsKKworICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KKyAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7CisgICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOworICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgZmlsX2NudDsKKyAgICAgIGVmZHJfdCAqZmlsX3B0cjsKKyAgICAgIGVmZHJfdCAqZmlsX2VuZDsKKworICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKKwlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOworICAgICAgZWxzZQorCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKKyAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOworICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OworICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCisJeworCSAgdmxpbmtzX3QgKmF1eF9saW5rOworCisJICBmaWxfcHRyLT5mZHIuZkJpZ2VuZGlhbiA9IGJpZ2VuZGlhbjsKKwkgIGZpbF9wdHItPmZkci5pYXV4QmFzZSA9IGlhdXg7CisJICBmb3IgKGF1eF9saW5rID0gZmlsX3B0ci0+YXV4X3N5bXMuZmlyc3Q7CisJICAgICAgIGF1eF9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOworCSAgICAgICBhdXhfbGluayA9IGF1eF9saW5rLT5uZXh0KQorCSAgICB7CisJICAgICAgaW50IGF1eF9jbnQ7CisJICAgICAgYXV4X3QgKmF1eF9wdHI7CisJICAgICAgYXV4X3QgKmF1eF9lbmQ7CisKKwkgICAgICBpZiAoYXV4X2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCisJCWF1eF9jbnQgPSBmaWxfcHRyLT5hdXhfc3ltcy5vYmplY3RzX2xhc3RfcGFnZTsKKwkgICAgICBlbHNlCisJCWF1eF9jbnQgPSBmaWxfcHRyLT5hdXhfc3ltcy5vYmplY3RzX3Blcl9wYWdlOworCSAgICAgIGF1eF9wdHIgPSBhdXhfbGluay0+ZGF0dW0tPmF1eDsKKwkgICAgICBhdXhfZW5kID0gYXV4X3B0ciArIGF1eF9jbnQ7CisJICAgICAgZm9yICg7IGF1eF9wdHIgPCBhdXhfZW5kOyBhdXhfcHRyKyspCisJCXsKKwkJICBpZiAoKmJ1ZmVuZCAtIChjaGFyICopIGF1eF9vdXQgPCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKQorCQkgICAgYXV4X291dCA9ICgodW5pb24gYXV4X2V4dCAqKQorCQkJICAgICAgIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsCisJCQkJCQkoY2hhciAqKSBhdXhfb3V0LAorCQkJCQkJc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSkpOworCQkgIHN3aXRjaCAoYXV4X3B0ci0+dHlwZSkKKwkJICAgIHsKKwkJICAgIGNhc2UgYXV4X3RpcjoKKwkJICAgICAgKCpiYWNrZW5kLT5zd2FwX3Rpcl9vdXQpIChiaWdlbmRpYW4sCisJCQkJCQkmYXV4X3B0ci0+ZGF0YS50aSwKKwkJCQkJCSZhdXhfb3V0LT5hX3RpKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIGF1eF9ybmR4OgorCQkgICAgICAoKmJhY2tlbmQtPnN3YXBfcm5keF9vdXQpIChiaWdlbmRpYW4sCisJCQkJCQkgJmF1eF9wdHItPmRhdGEucm5keCwKKwkJCQkJCSAmYXV4X291dC0+YV9ybmR4KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIGF1eF9kbkxvdzoKKwkJICAgICAgQVVYX1BVVF9ETkxPVyAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmRuTG93LAorCQkJCSAgICAgYXV4X291dCk7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBhdXhfZG5IaWdoOgorCQkgICAgICBBVVhfUFVUX0ROSElHSCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmRuSGlnaCwKKwkJCQkgICAgICBhdXhfb3V0KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIGF1eF9pc3ltOgorCQkgICAgICBBVVhfUFVUX0lTWU0gKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5pc3ltLAorCQkJCSAgICBhdXhfb3V0KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIGF1eF9pc3M6CisJCSAgICAgIEFVWF9QVVRfSVNTIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuaXNzLAorCQkJCSAgIGF1eF9vdXQpOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgYXV4X3dpZHRoOgorCQkgICAgICBBVVhfUFVUX1dJRFRIIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEud2lkdGgsCisJCQkJICAgICBhdXhfb3V0KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIGF1eF9jb3VudDoKKwkJICAgICAgQVVYX1BVVF9DT1VOVCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmNvdW50LAorCQkJCSAgICAgYXV4X291dCk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCisJCSAgKythdXhfb3V0OworCQkgICsraWF1eDsKKwkJfQorCSAgICB9CisJICBmaWxfcHRyLT5mZHIuY2F1eCA9IGlhdXggLSBmaWxfcHRyLT5mZHIuaWF1eEJhc2U7CisJfQorICAgIH0KKworICByZXR1cm4gZWNvZmZfcGFkZGluZ19hZGp1c3QgKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLAorCQkJICAgICAgIG9mZnNldCArIGlhdXggKiBzaXplb2YgKHVuaW9uIGF1eF9leHQpLAorCQkJICAgICAgIChjaGFyICoqKSBOVUxMKTsKK30KKworLyogQ29weSBvdXQgdGhlIHN0cmluZ3MgZnJvbSBhIHZhcnJheV90LiAgVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIGJ5dGVzIGNvcGllZCwgcmF0aGVyIHRoYW4gdGhlIG5ldyBvZmZzZXQuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworZWNvZmZfYnVpbGRfc3RyaW5ncyAoYnVmLCBidWZlbmQsIG9mZnNldCwgdnApCisgICAgIGNoYXIgKipidWY7CisgICAgIGNoYXIgKipidWZlbmQ7CisgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgICB2YXJyYXlfdCAqdnA7Cit7CisgIHVuc2lnbmVkIGxvbmcgaXN0cjsKKyAgY2hhciAqc3RyX291dDsKKyAgdmxpbmtzX3QgKnN0cl9saW5rOworCisgIHN0cl9vdXQgPSAqYnVmICsgb2Zmc2V0OworCisgIGlzdHIgPSAwOworCisgIGZvciAoc3RyX2xpbmsgPSB2cC0+Zmlyc3Q7CisgICAgICAgc3RyX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7CisgICAgICAgc3RyX2xpbmsgPSBzdHJfbGluay0+bmV4dCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHN0cl9jbnQ7CisKKyAgICAgIGlmIChzdHJfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKKwlzdHJfY250ID0gdnAtPm9iamVjdHNfbGFzdF9wYWdlOworICAgICAgZWxzZQorCXN0cl9jbnQgPSB2cC0+b2JqZWN0c19wZXJfcGFnZTsKKworICAgICAgaWYgKCpidWZlbmQgLSBzdHJfb3V0IDwgc3RyX2NudCkKKwlzdHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgc3RyX291dCwgc3RyX2NudCk7CisKKyAgICAgIG1lbWNweSAoc3RyX291dCwgc3RyX2xpbmstPmRhdHVtLT5ieXRlLCBzdHJfY250KTsKKyAgICAgIHN0cl9vdXQgKz0gc3RyX2NudDsKKyAgICAgIGlzdHIgKz0gc3RyX2NudDsKKyAgICB9CisKKyAgcmV0dXJuIGlzdHI7Cit9CisKKy8qIER1bXAgb3V0IHRoZSBsb2NhbCBzdHJpbmdzLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2Vjb2ZmX2J1aWxkX3NzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQorICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKKyAgICAgY2hhciAqKmJ1ZjsKKyAgICAgY2hhciAqKmJ1ZmVuZDsKKyAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit7CisgIGxvbmcgaXNzOworICB2bGlua3NfdCAqZmlsZV9saW5rOworCisgIGlzcyA9IDA7CisKKyAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7CisgICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOworICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgZmlsX2NudDsKKyAgICAgIGVmZHJfdCAqZmlsX3B0cjsKKyAgICAgIGVmZHJfdCAqZmlsX2VuZDsKKworICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKKwlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOworICAgICAgZWxzZQorCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKKyAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOworICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OworICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCisJeworCSAgbG9uZyBzc19jbnQ7CisKKwkgIGZpbF9wdHItPmZkci5pc3NCYXNlID0gaXNzOworCSAgc3NfY250ID0gZWNvZmZfYnVpbGRfc3RyaW5ncyAoYnVmLCBidWZlbmQsIG9mZnNldCArIGlzcywKKwkJCQkJJmZpbF9wdHItPnN0cmluZ3MpOworCSAgZmlsX3B0ci0+ZmRyLmNiU3MgPSBzc19jbnQ7CisJICBpc3MgKz0gc3NfY250OworCX0KKyAgICB9CisKKyAgcmV0dXJuIGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0ICsgaXNzLAorCQkJICAgICAgIChjaGFyICoqKSBOVUxMKTsKK30KKworLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvcnMuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworZWNvZmZfYnVpbGRfZmRyIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQorICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKKyAgICAgY2hhciAqKmJ1ZjsKKyAgICAgY2hhciAqKmJ1ZmVuZDsKKyAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9mZHJfc2l6ZTsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX2Zkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBGRFIgKiwgUFRSKSkKKyAgICA9IGJhY2tlbmQtPnN3YXBfZmRyX291dDsKKyAgbG9uZyBpZmlsZTsKKyAgY2hhciAqZmRyX291dDsKKyAgdmxpbmtzX3QgKmZpbGVfbGluazsKKworICBpZmlsZSA9IDA7CisKKyAgZmRyX291dCA9ICpidWYgKyBvZmZzZXQ7CisKKyAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7CisgICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOworICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgZmlsX2NudDsKKyAgICAgIGVmZHJfdCAqZmlsX3B0cjsKKyAgICAgIGVmZHJfdCAqZmlsX2VuZDsKKworICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKKwlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOworICAgICAgZWxzZQorCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKKyAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOworICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OworICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCisJeworCSAgaWYgKCpidWZlbmQgLSBmZHJfb3V0IDwgZXh0ZXJuYWxfZmRyX3NpemUpCisJICAgIGZkcl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBmZHJfb3V0LAorCQkJCSAgICAgICBleHRlcm5hbF9mZHJfc2l6ZSk7CisJICAoKnN3YXBfZmRyX291dCkgKHN0ZG91dHB1dCwgJmZpbF9wdHItPmZkciwgZmRyX291dCk7CisJICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOworCSAgKytpZmlsZTsKKwl9CisgICAgfQorCisgIHJldHVybiBvZmZzZXQgKyBpZmlsZSAqIGV4dGVybmFsX2Zkcl9zaXplOworfQorCisvKiBTZXQgdXAgdGhlIGV4dGVybmFsIHN5bWJvbHMuICBUaGVzZSBhcmUgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBieQorICAgdGhlIGJhY2tlbmQuICBUaGlzIHJvdXRpbmUganVzdCBnZXRzIHRoZSByaWdodCBpbmZvcm1hdGlvbiBhbmQKKyAgIGNhbGxzIGEgYmFja2VuZCBmdW5jdGlvbiB0byBkZWFsIHdpdGggaXQuICAqLworCitzdGF0aWMgdm9pZAorZWNvZmZfc2V0dXBfZXh0ICgpCit7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bTsKKworICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQorICAgIHsKKyAgICAgIGlmIChzeW0tPmVjb2ZmX3N5bWJvbCA9PSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB0aGVuIGZvcmNlIHRoZSBmaWVsZHMgdG8gemVyby4gICovCisgICAgICBpZiAoISBTX0lTX0VYVEVSTkFMIChzeW0pCisJICAmJiAhIFNfSVNfV0VBSyAoc3ltKQorCSAgJiYgU19JU19ERUZJTkVEIChzeW0pKQorCXsKKwkgIHN5bS0+ZWNvZmZfc3ltYm9sLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IDA7CisJICBzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltLmFzeW0uc3QgPSAoaW50KSBzdF9OaWw7CisJICBzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAoaW50KSBzY19OaWw7CisJICBzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKKwl9CisKKyAgICAgIG9ial9lY29mZl9zZXRfZXh0IChzeW0sICZzeW0tPmVjb2ZmX3N5bWJvbC0+ZWNvZmZfc3ltKTsKKyAgICB9Cit9CisKKy8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLworCit1bnNpZ25lZCBsb25nCitlY29mZl9idWlsZF9kZWJ1ZyAoaGRyLCBidWZwLCBiYWNrZW5kKQorICAgICBIRFJSICpoZHI7CisgICAgIGNoYXIgKipidWZwOworICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKK3sKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3Bkcl9zaXplOworICB0YWdfdCAqcHRhZzsKKyAgdGFnX3QgKnB0YWdfbmV4dDsKKyAgZWZkcl90ICpmaWxfcHRyOworICBpbnQgZW5kX3dhcm5pbmc7CisgIGVmZHJfdCAqaG9sZF9maWxlX3B0cjsKKyAgcHJvY190ICogaG9sZF9wcm9jX3B0cjsKKyAgc3ltYm9sUyAqc3ltOworICBjaGFyICpidWY7CisgIGNoYXIgKmJ1ZmVuZDsKKyAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKyAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBmaWxlLiAgKi8KKyAgaWYgKGZpcnN0X2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMKQorICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKKworICAvKiBIYW5kbGUgYW55IHRvcCBsZXZlbCB0YWdzLiAgKi8KKyAgZm9yIChwdGFnID0gdG9wX3RhZ19oZWFkLT5maXJzdF90YWc7CisgICAgICAgcHRhZyAhPSAodGFnX3QgKikgTlVMTDsKKyAgICAgICBwdGFnID0gcHRhZ19uZXh0KQorICAgIHsKKyAgICAgIGlmIChwdGFnLT5mb3J3YXJkX3JlZiAhPSAoZm9yd2FyZF90ICopIE5VTEwpCisJYWRkX3Vua25vd25fdGFnIChwdGFnKTsKKworICAgICAgcHRhZ19uZXh0ID0gcHRhZy0+c2FtZV9ibG9jazsKKyAgICAgIHB0YWctPmhhc2hfcHRyLT50YWdfcHRyID0gcHRhZy0+c2FtZV9uYW1lOworICAgICAgZnJlZV90YWcgKHB0YWcpOworICAgIH0KKworICBmcmVlX3RoZWFkICh0b3BfdGFnX2hlYWQpOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scy4gIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2gKKyAgICAgc3ltYm9sIHRoYXQgaGFzIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGl0LiAgKi8KKyAgaG9sZF9maWxlX3B0ciA9IGN1cl9maWxlX3B0cjsKKyAgaG9sZF9wcm9jX3B0ciA9IGN1cl9wcm9jX3B0cjsKKyAgY3VyX3Byb2NfcHRyID0gKHByb2NfdCAqKSBOVUxMOworICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IChzeW1ib2xTICopIE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQorICAgIHsKKyAgICAgIGlmIChzeW0tPmVjb2ZmX3N5bWJvbCAhPSBOVUxMCisJICB8fCBzeW0tPmVjb2ZmX2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMCisJICB8fCAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKKwljb250aW51ZTsKKworICAgICAgY3VyX2ZpbGVfcHRyID0gc3ltLT5lY29mZl9maWxlOworICAgICAgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfTmlsLCBzY19OaWwsIHN5bSwKKwkJCShiZmRfdm1hKSAwLCBTX0dFVF9WQUxVRSAoc3ltKSwgaW5kZXhOaWwpOworICAgIH0KKyAgY3VyX3Byb2NfcHRyID0gaG9sZF9wcm9jX3B0cjsKKyAgY3VyX2ZpbGVfcHRyID0gaG9sZF9maWxlX3B0cjsKKworICAvKiBPdXRwdXQgYW4gZW5kaW5nIHN5bWJvbCBmb3IgYWxsIHRoZSBmaWxlcy4gIFdlIGhhdmUgdG8gZG8gdGhpcworICAgICBoZXJlIGZvciB0aGUgbGFzdCBmaWxlLCBzbyB3ZSBtYXkgYXMgd2VsbCBkbyBpdCBmb3IgYWxsIG9mIHRoZQorICAgICBmaWxlcy4gICovCisgIGVuZF93YXJuaW5nID0gMDsKKyAgZm9yIChmaWxfcHRyID0gZmlyc3RfZmlsZTsKKyAgICAgICBmaWxfcHRyICE9IChlZmRyX3QgKikgTlVMTDsKKyAgICAgICBmaWxfcHRyID0gZmlsX3B0ci0+bmV4dF9maWxlKQorICAgIHsKKyAgICAgIGN1cl9maWxlX3B0ciA9IGZpbF9wdHI7CisgICAgICB3aGlsZSAoY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgIT0gKHNjb3BlX3QgKikgTlVMTAorCSAgICAgJiYgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUtPnByZXYgIT0gKHNjb3BlX3QgKikgTlVMTCkKKwl7CisJICBjdXJfZmlsZV9wdHItPmN1cl9zY29wZSA9IGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlLT5wcmV2OworCSAgaWYgKCEgZW5kX3dhcm5pbmcgJiYgISBjdXJfZmlsZV9wdHItPmZha2UpCisJICAgIHsKKwkgICAgICBhc193YXJuIChfKCJNaXNzaW5nIC5lbmQgb3IgLmJlbmQgYXQgZW5kIG9mIGZpbGUiKSk7CisJICAgICAgZW5kX3dhcm5pbmcgPSAxOworCSAgICB9CisJfQorICAgICAgaWYgKGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlICE9IChzY29wZV90ICopIE5VTEwpCisJKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJIHN0X0VuZCwgc2NfVGV4dCwKKwkJCQkgKHN5bWJvbFMgKikgTlVMTCwKKwkJCQkgKGJmZF92bWEpIDAsCisJCQkJIChzeW1pbnRfdCkgMCwKKwkJCQkgKHN5bWludF90KSAwKTsKKyAgICB9CisKKyAgLyogQnVpbGQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KKyAgb2Zmc2V0ID0gMDsKKyAgYnVmID0geG1hbGxvYyAoUEFHRV9TSVpFKTsKKyAgYnVmZW5kID0gYnVmICsgUEFHRV9TSVpFOworCisgIC8qIEJ1aWxkIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gICovCisgIGhkci0+Y2JMaW5lT2Zmc2V0ID0gb2Zmc2V0OworICBvZmZzZXQgPSBlY29mZl9idWlsZF9saW5lbm8gKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCwKKwkJCSAgICAgICAmaGRyLT5pbGluZU1heCk7CisgIGhkci0+Y2JMaW5lID0gb2Zmc2V0IC0gaGRyLT5jYkxpbmVPZmZzZXQ7CisKKyAgLyogV2UgZG9uJ3QgdXNlIGRlbnNlIG51bWJlcnMgYXQgYWxsLiAgKi8KKyAgaGRyLT5pZG5NYXggPSAwOworICBoZHItPmNiRG5PZmZzZXQgPSAwOworCisgIC8qIFdlIGNhbid0IGJ1aWxkIHRoZSBQRFIgdGFibGUgdW50aWwgd2UgaGF2ZSBidWlsdCB0aGUgc3ltYm9scywKKyAgICAgYmVjYXVzZSBhIFBEUiBjb250YWlucyBhIHN5bWJvbCBpbmRleC4gIEhvd2V2ZXIsIHdlIHNldCBhc2lkZQorICAgICBzcGFjZSBhdCB0aGlzIHBvaW50LiAgKi8KKyAgaGRyLT5pcGRNYXggPSBwcm9jX2NudDsKKyAgaGRyLT5jYlBkT2Zmc2V0ID0gb2Zmc2V0OworICBpZiAoYnVmZW5kIC0gKGJ1ZiArIG9mZnNldCkgPCBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplKQorICAgICh2b2lkKSBlY29mZl9hZGRfYnl0ZXMgKCZidWYsICZidWZlbmQsIGJ1ZiArIG9mZnNldCwKKwkJCSAgICBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplKTsKKyAgb2Zmc2V0ICs9IHByb2NfY250ICogZXh0ZXJuYWxfcGRyX3NpemU7CisKKyAgLyogQnVpbGQgdGhlIGxvY2FsIHN5bWJvbHMuICAqLworICBoZHItPmNiU3ltT2Zmc2V0ID0gb2Zmc2V0OworICBvZmZzZXQgPSBlY29mZl9idWlsZF9zeW1ib2xzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOworICBoZHItPmlzeW1NYXggPSAob2Zmc2V0IC0gaGRyLT5jYlN5bU9mZnNldCkgLyBiYWNrZW5kLT5leHRlcm5hbF9zeW1fc2l6ZTsKKworICAvKiBCdWlsZGluZyB0aGUgc3ltYm9scyBpbml0aWFsaXplcyB0aGUgc3ltYm9sIGluZGV4IGluIHRoZSBQRFIncy4KKyAgICAgTm93IHdlIGNhbiBzd2FwIG91dCB0aGUgUERSJ3MuICAqLworICAodm9pZCkgZWNvZmZfYnVpbGRfcHJvY3MgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIGhkci0+Y2JQZE9mZnNldCk7CisKKyAgLyogV2UgZG9uJ3QgdXNlIG9wdGltaXphdGlvbiBzeW1ib2xzLiAgKi8KKyAgaGRyLT5pb3B0TWF4ID0gMDsKKyAgaGRyLT5jYk9wdE9mZnNldCA9IDA7CisKKyAgLyogU3dhcCBvdXQgdGhlIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KKyAgaGRyLT5jYkF1eE9mZnNldCA9IG9mZnNldDsKKyAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfYXV4IChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOworICBoZHItPmlhdXhNYXggPSAob2Zmc2V0IC0gaGRyLT5jYkF1eE9mZnNldCkgLyBzaXplb2YgKHVuaW9uIGF1eF9leHQpOworCisgIC8qIENvcHkgb3V0IHRoZSBsb2NhbCBzdHJpbmdzLiAgKi8KKyAgaGRyLT5jYlNzT2Zmc2V0ID0gb2Zmc2V0OworICBvZmZzZXQgPSBlY29mZl9idWlsZF9zcyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKKyAgaGRyLT5pc3NNYXggPSBvZmZzZXQgLSBoZHItPmNiU3NPZmZzZXQ7CisKKyAgLyogV2UgZG9uJ3QgdXNlIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuICAqLworICBoZHItPmNyZmQgPSAwOworICBoZHItPmNiUmZkT2Zmc2V0ID0gMDsKKworICAvKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9ycy4gICovCisgIGhkci0+Y2JGZE9mZnNldCA9IG9mZnNldDsKKyAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfZmRyIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQpOworICBoZHItPmlmZE1heCA9IChvZmZzZXQgLSBoZHItPmNiRmRPZmZzZXQpIC8gYmFja2VuZC0+ZXh0ZXJuYWxfZmRyX3NpemU7CisKKyAgLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLCB3aGljaCBhcmUgaGFuZGxlZCBieSB0aGUgQkZEIGJhY2sKKyAgICAgZW5kLiAgKi8KKyAgaGRyLT5pc3NFeHRNYXggPSAwOworICBoZHItPmNiU3NFeHRPZmZzZXQgPSAwOworICBoZHItPmlleHRNYXggPSAwOworICBoZHItPmNiRXh0T2Zmc2V0ID0gMDsKKyAgZWNvZmZfc2V0dXBfZXh0ICgpOworCisgIGtub3cgKChvZmZzZXQgJiAoYmFja2VuZC0+ZGVidWdfYWxpZ24gLSAxKSkgPT0gMCk7CisKKyAgLyogRklYTUU6IFRoaXMgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWQgZnJvbSB0aGUgLnZlcnN0YW1wIGRpcmVjdGl2ZSwKKyAgICAgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGluIGNvbmZpZyBmaWxlcy4gICovCisjaWZkZWYgVENfQUxQSEEKKyAgaGRyLT52c3RhbXAgPSAweDAzMGI7CisjZWxzZQorICBoZHItPnZzdGFtcCA9IDB4MDIwYjsKKyNlbmRpZgorCisgICpidWZwID0gYnVmOworICByZXR1cm4gb2Zmc2V0OworfQorDAorLyogQWxsb2NhdGUgYSBjbHVzdGVyIG9mIHBhZ2VzLiAgKi8KKworI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKKworc3RhdGljIHBhZ2VfdHlwZSAqCithbGxvY2F0ZV9jbHVzdGVyIChucGFnZXMpCisgICAgIHVuc2lnbmVkIGxvbmcgbnBhZ2VzOworeworICByZWdpc3RlciBwYWdlX3R5cGUgKnZhbHVlID0gKHBhZ2VfdHlwZSAqKSB4bWFsbG9jIChucGFnZXMgKiBQQUdFX1VTSVpFKTsKKworI2lmZGVmIEVDT0ZGX0RFQlVHCisgIGlmIChkZWJ1ZyA+IDMpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiXHRhbGxvY1x0bnBhZ2VzID0gJWQsIHZhbHVlID0gMHglLjh4XG4iLCBucGFnZXMsIHZhbHVlKTsKKyNlbmRpZgorCisgIG1lbXNldCAodmFsdWUsIDAsIG5wYWdlcyAqIFBBR0VfVVNJWkUpOworCisgIHJldHVybiB2YWx1ZTsKK30KKworCitzdGF0aWMgcGFnZV90eXBlICpjbHVzdGVyX3B0ciA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlc19sZWZ0ID0gMDsKKworI2VuZGlmIC8qIE1BTExPQ19DSEVDSyAqLworCisvKiBBbGxvY2F0ZSBvbmUgcGFnZSAod2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gMCkuICAqLworCitzdGF0aWMgcGFnZV90eXBlICoKK2FsbG9jYXRlX3BhZ2UgKCkKK3sKKyNpZm5kZWYgTUFMTE9DX0NIRUNLCisKKyAgaWYgKHBhZ2VzX2xlZnQgPT0gMCkKKyAgICB7CisgICAgICBwYWdlc19sZWZ0ID0gTUFYX0NMVVNURVJfUEFHRVM7CisgICAgICBjbHVzdGVyX3B0ciA9IGFsbG9jYXRlX2NsdXN0ZXIgKHBhZ2VzX2xlZnQpOworICAgIH0KKworICBwYWdlc19sZWZ0LS07CisgIHJldHVybiBjbHVzdGVyX3B0cisrOworCisjZWxzZQkvKiBNQUxMT0NfQ0hFQ0sgKi8KKworICBwYWdlX3R5cGUgKnB0cjsKKworICBwdHIgPSB4bWFsbG9jIChQQUdFX1VTSVpFKTsKKyAgbWVtc2V0IChwdHIsIDAsIFBBR0VfVVNJWkUpOworICByZXR1cm4gcHRyOworCisjZW5kaWYJLyogTUFMTE9DX0NIRUNLICovCit9CisMCisvKiBBbGxvY2F0ZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIHNjb3BlX3QgKgorYWxsb2NhdGVfc2NvcGUgKCkKK3sKKyAgcmVnaXN0ZXIgc2NvcGVfdCAqcHRyOworICBzdGF0aWMgc2NvcGVfdCBpbml0aWFsX3Njb3BlOworCisjaWZuZGVmIE1BTExPQ19DSEVDSworCisgIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlOworICBpZiAocHRyICE9IChzY29wZV90ICopIE5VTEwpCisgICAgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfc2NvcGUgXS5mcmVlX2xpc3QuZl9zY29wZSA9IHB0ci0+ZnJlZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZAk9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnVuYWxsb2NhdGVkOworICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZQk9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmN1cl9wYWdlOworCisgICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKKwl7CisJICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoc2NvcGVfdCk7CisJICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKKwkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX3BhZ2VzKys7CisJfQorCisgICAgICBwdHIgPSAmY3VyX3BhZ2UtPnNjb3BlWy0tdW5hbGxvY2F0ZWRdOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKKyAgICB9CisKKyNlbHNlCisKKyAgcHRyID0gKHNjb3BlX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzY29wZV90KSk7CisKKyNlbmRpZgorCisgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX2FsbG9jKys7CisgICpwdHIgPSBpbml0aWFsX3Njb3BlOworICByZXR1cm4gcHRyOworfQorCisvKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgdm9pZAorZnJlZV9zY29wZSAocHRyKQorICAgICBzY29wZV90ICpwdHI7Cit7CisgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnRvdGFsX2ZyZWUrKzsKKworI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKKyAgcHRyLT5mcmVlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uZnJlZV9saXN0LmZfc2NvcGU7CisgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlID0gcHRyOworI2Vsc2UKKyAgZnJlZSAoKFBUUikgcHRyKTsKKyNlbmRpZgorfQorDAorLyogQWxsb2NhdGUgbGlua3MgZm9yIHBhZ2VzIGluIGEgdmlydHVhbCBhcnJheS4gICovCisKK3N0YXRpYyB2bGlua3NfdCAqCithbGxvY2F0ZV92bGlua3MgKCkKK3sKKyAgcmVnaXN0ZXIgdmxpbmtzX3QgKnB0cjsKKyAgc3RhdGljIHZsaW5rc190IGluaXRpYWxfdmxpbmtzOworCisjaWZuZGVmIE1BTExPQ19DSEVDSworCisgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS51bmFsbG9jYXRlZDsKKyAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS5jdXJfcGFnZTsKKworICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKKyAgICB7CisgICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodmxpbmtzX3QpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnRvdGFsX3BhZ2VzKys7CisgICAgfQorCisgIHB0ciA9ICZjdXJfcGFnZS0+dmxpbmtzWy0tdW5hbGxvY2F0ZWRdOworICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKKworI2Vsc2UKKworICBwdHIgPSAodmxpbmtzX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh2bGlua3NfdCkpOworCisjZW5kaWYKKworICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udG90YWxfYWxsb2MrKzsKKyAgKnB0ciA9IGluaXRpYWxfdmxpbmtzOworICByZXR1cm4gcHRyOworfQorDAorLyogQWxsb2NhdGUgc3RyaW5nIGhhc2ggYnVja2V0cy4gICovCisKK3N0YXRpYyBzaGFzaF90ICoKK2FsbG9jYXRlX3NoYXNoICgpCit7CisgIHJlZ2lzdGVyIHNoYXNoX3QgKnB0cjsKKyAgc3RhdGljIHNoYXNoX3QgaW5pdGlhbF9zaGFzaDsKKworI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKKworICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS51bmFsbG9jYXRlZDsKKyAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLmN1cl9wYWdlOworCisgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQorICAgIHsKKyAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChzaGFzaF90KTsKKyAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udG90YWxfcGFnZXMrKzsKKyAgICB9CisKKyAgcHRyID0gJmN1cl9wYWdlLT5zaGFzaFstLXVuYWxsb2NhdGVkXTsKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKKworI2Vsc2UKKworICBwdHIgPSAoc2hhc2hfdCAqKSB4bWFsbG9jIChzaXplb2YgKHNoYXNoX3QpKTsKKworI2VuZGlmCisKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udG90YWxfYWxsb2MrKzsKKyAgKnB0ciA9IGluaXRpYWxfc2hhc2g7CisgIHJldHVybiBwdHI7Cit9CisMCisvKiBBbGxvY2F0ZSB0eXBlIGhhc2ggYnVja2V0cy4gICovCisKK3N0YXRpYyB0aGFzaF90ICoKK2FsbG9jYXRlX3RoYXNoICgpCit7CisgIHJlZ2lzdGVyIHRoYXNoX3QgKnB0cjsKKyAgc3RhdGljIHRoYXNoX3QgaW5pdGlhbF90aGFzaDsKKworI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKKworICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS51bmFsbG9jYXRlZDsKKyAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLmN1cl9wYWdlOworCisgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQorICAgIHsKKyAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGFzaF90KTsKKyAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udG90YWxfcGFnZXMrKzsKKyAgICB9CisKKyAgcHRyID0gJmN1cl9wYWdlLT50aGFzaFstLXVuYWxsb2NhdGVkXTsKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKKworI2Vsc2UKKworICBwdHIgPSAodGhhc2hfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRoYXNoX3QpKTsKKworI2VuZGlmCisKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udG90YWxfYWxsb2MrKzsKKyAgKnB0ciA9IGluaXRpYWxfdGhhc2g7CisgIHJldHVybiBwdHI7Cit9CisMCisvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUsIHVuaW9uLCBvciBlbnVtIHRhZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyB0YWdfdCAqCithbGxvY2F0ZV90YWcgKCkKK3sKKyAgcmVnaXN0ZXIgdGFnX3QgKnB0cjsKKyAgc3RhdGljIHRhZ190IGluaXRpYWxfdGFnOworCisjaWZuZGVmIE1BTExPQ19DSEVDSworCisgIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWc7CisgIGlmIChwdHIgIT0gKHRhZ190ICopIE5VTEwpCisgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZyA9IHB0ci0+ZnJlZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS51bmFsbG9jYXRlZDsKKyAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uY3VyX3BhZ2U7CisKKyAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQorCXsKKwkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0YWdfdCk7CisJICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7CisJICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfcGFnZXMrKzsKKwl9CisKKyAgICAgIHB0ciA9ICZjdXJfcGFnZS0+dGFnWy0tdW5hbGxvY2F0ZWRdOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7CisgICAgfQorCisjZWxzZQorCisgIHB0ciA9ICh0YWdfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRhZ190KSk7CisKKyNlbmRpZgorCisgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS50b3RhbF9hbGxvYysrOworICAqcHRyID0gaW5pdGlhbF90YWc7CisgIHJldHVybiBwdHI7Cit9CisKKy8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitmcmVlX3RhZyAocHRyKQorICAgICB0YWdfdCAqcHRyOworeworICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfZnJlZSsrOworCisjaWZuZGVmIE1BTExPQ19DSEVDSworICBwdHItPmZyZWUgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnOworICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnID0gcHRyOworI2Vsc2UKKyAgZnJlZSAoKFBUUl9UKSBwdHIpOworI2VuZGlmCit9CisMCisvKiBBbGxvY2F0ZSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhIHlldCB1bmtub3duIHRhZy4gICovCisKK3N0YXRpYyBmb3J3YXJkX3QgKgorYWxsb2NhdGVfZm9yd2FyZCAoKQoreworICByZWdpc3RlciBmb3J3YXJkX3QgKnB0cjsKKyAgc3RhdGljIGZvcndhcmRfdCBpbml0aWFsX2ZvcndhcmQ7CisKKyNpZm5kZWYgTUFMTE9DX0NIRUNLCisKKyAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS51bmFsbG9jYXRlZDsKKyAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0uY3VyX3BhZ2U7CisKKyAgaWYgKHVuYWxsb2NhdGVkID09IDApCisgICAgeworICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKGZvcndhcmRfdCk7CisgICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS50b3RhbF9wYWdlcysrOworICAgIH0KKworICBwdHIgPSAmY3VyX3BhZ2UtPmZvcndhcmRbLS11bmFsbG9jYXRlZF07CisgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKKworI2Vsc2UKKworICBwdHIgPSAoZm9yd2FyZF90ICopIHhtYWxsb2MgKHNpemVvZiAoZm9yd2FyZF90KSk7CisKKyNlbmRpZgorCisgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udG90YWxfYWxsb2MrKzsKKyAgKnB0ciA9IGluaXRpYWxfZm9yd2FyZDsKKyAgcmV0dXJuIHB0cjsKK30KKwwKKy8qIEFsbG9jYXRlIGhlYWQgb2YgdHlwZSBoYXNoIGxpc3QuICAqLworCitzdGF0aWMgdGhlYWRfdCAqCithbGxvY2F0ZV90aGVhZCAoKQoreworICByZWdpc3RlciB0aGVhZF90ICpwdHI7CisgIHN0YXRpYyB0aGVhZF90IGluaXRpYWxfdGhlYWQ7CisKKyNpZm5kZWYgTUFMTE9DX0NIRUNLCisKKyAgcHRyID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQ7CisgIGlmIChwdHIgIT0gKHRoZWFkX3QgKikgTlVMTCkKKyAgICBhbGxvY19jb3VudHNbIChpbnQpYWxsb2NfdHlwZV90aGVhZCBdLmZyZWVfbGlzdC5mX3RoZWFkID0gcHRyLT5mcmVlOworICBlbHNlCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udW5hbGxvY2F0ZWQ7CisgICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uY3VyX3BhZ2U7CisKKyAgICAgIGlmICh1bmFsbG9jYXRlZCA9PSAwKQorCXsKKwkgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mICh0aGVhZF90KTsKKwkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOworCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfcGFnZXMrKzsKKwl9CisKKyAgICAgIHB0ciA9ICZjdXJfcGFnZS0+dGhlYWRbLS11bmFsbG9jYXRlZF07CisgICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOworICAgIH0KKworI2Vsc2UKKworICBwdHIgPSAodGhlYWRfdCAqKSB4bWFsbG9jIChzaXplb2YgKHRoZWFkX3QpKTsKKworI2VuZGlmCisKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfYWxsb2MrKzsKKyAgKnB0ciA9IGluaXRpYWxfdGhlYWQ7CisgIHJldHVybiBwdHI7Cit9CisKKy8qIEZyZWUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitmcmVlX3RoZWFkIChwdHIpCisgICAgIHRoZWFkX3QgKnB0cjsKK3sKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udG90YWxfZnJlZSsrOworCisjaWZuZGVmIE1BTExPQ19DSEVDSworICBwdHItPmZyZWUgPSAodGhlYWRfdCAqKSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5mcmVlX2xpc3QuZl90aGVhZDsKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQgPSBwdHI7CisjZWxzZQorICBmcmVlICgoUFRSX1QpIHB0cik7CisjZW5kaWYKK30KKwwKK3N0YXRpYyBsaW5lbm9fbGlzdF90ICoKK2FsbG9jYXRlX2xpbmVub19saXN0ICgpCit7CisgIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKnB0cjsKKyAgc3RhdGljIGxpbmVub19saXN0X3QgaW5pdGlhbF9saW5lbm9fbGlzdDsKKworI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKKworICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udW5hbGxvY2F0ZWQ7CisgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10uY3VyX3BhZ2U7CisKKyAgaWYgKHVuYWxsb2NhdGVkID09IDApCisgICAgeworICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKGxpbmVub19saXN0X3QpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOworICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnRvdGFsX3BhZ2VzKys7CisgICAgfQorCisgIHB0ciA9ICZjdXJfcGFnZS0+bGluZW5vWy0tdW5hbGxvY2F0ZWRdOworICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2xpbmVub10udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKKworI2Vsc2UKKworICBwdHIgPSAobGluZW5vX2xpc3RfdCAqKSB4bWFsbG9jIChzaXplb2YgKGxpbmVub19saXN0X3QpKTsKKworI2VuZGlmCisKKyAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnRvdGFsX2FsbG9jKys7CisgICpwdHIgPSBpbml0aWFsX2xpbmVub19saXN0OworICByZXR1cm4gcHRyOworfQorCit2b2lkCitlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgKHN6KQorICAgICBpbnQgc3o7Cit7CisgIGlmIChjdXJfcHJvY19wdHIgPT0gMCkKKyAgICByZXR1cm47CisKKyAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgPSBzejsKKyAgaWYgKGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlICE9IHN6KQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIkdQIHByb2xvZ3VlIHNpemUgZXhjZWVkcyBmaWVsZCBzaXplLCB1c2luZyAwIGluc3RlYWQiKSk7CisgICAgICBjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSA9IDA7CisgICAgfQorCisgIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3VzZWQgPSAxOworfQorCitpbnQgCitlY29mZl9ub19jdXJyZW50X2ZpbGUgKCkKK3sKKyAgcmV0dXJuIGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEw7Cit9CisKK3ZvaWQKK2Vjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKK3sKKyAgdW5zaWduZWQgaW50IGxpbmVubzsKKyAgY2hhciAqZmlsZW5hbWU7CisgIGxpbmVub19saXN0X3QgKmxpc3Q7CisKKyAgYXNfd2hlcmUgKCZmaWxlbmFtZSwgJmxpbmVubyk7CisKKyAgaWYgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUgPT0gKGNoYXIgKilOVUxMCisgICAgICB8fCBzdHJjbXAgKGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUsIGZpbGVuYW1lKSkKKyAgICBhZGRfZmlsZSAoZmlsZW5hbWUsIDAsIDEpOworCisgIGxpc3QgPSBhbGxvY2F0ZV9saW5lbm9fbGlzdCAoKTsKKworICBsaXN0LT5uZXh0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKKyAgbGlzdC0+ZmlsZSA9IGN1cl9maWxlX3B0cjsKKyAgbGlzdC0+cHJvYyA9IGN1cl9wcm9jX3B0cjsKKyAgbGlzdC0+ZnJhZyA9IGZyYWdfbm93OworICBsaXN0LT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKKyAgbGlzdC0+bGluZW5vID0gbGluZW5vOworCisgIC8qIFdlIGRvbid0IHdhbnQgdG8gbWVyZ2UgZmlsZXMgd2hpY2ggaGF2ZSBsaW5lIG51bWJlcnMuICAqLworICBjdXJfZmlsZV9wdHItPmZkci5mTWVyZ2UgPSAwOworCisgIC8qIEEgLmxvYyBkaXJlY3RpdmUgd2lsbCBzb21ldGltZXMgYXBwZWFyIGJlZm9yZSBhIC5lbnQgZGlyZWN0aXZlLAorICAgICB3aGljaCBtZWFucyB0aGF0IGN1cl9wcm9jX3B0ciB3aWxsIGJlIE5VTEwgaGVyZS4gIEFycmFuZ2UgdG8KKyAgICAgcGF0Y2ggdGhpcyB1cC4gICovCisgIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmVub19saXN0X3QgKipwbDsKKworICAgICAgcGwgPSAmbm9wcm9jX2xpbmVubzsKKyAgICAgIHdoaWxlICgqcGwgIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKKyAgICAgICAgcGwgPSAmKCpwbCktPm5leHQ7CisgICAgICAqcGwgPSBsaXN0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxhc3RfbGluZW5vID0gbGlzdDsKKyAgICAgICpsYXN0X2xpbmVub19wdHIgPSBsaXN0OworICAgICAgbGFzdF9saW5lbm9fcHRyID0gJmxpc3QtPm5leHQ7CisgICAgfQorfQorCisjZWxzZQorCit2b2lkCitlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpCit7Cit9CisKKyNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KZGlmZiAtLWdpdCBhL2dhcy9lY29mZi5oIGIvZ2FzL2Vjb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5YjZmYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9lY29mZi5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBlY29mZi5oIC0tIGhlYWRlciBmaWxlIGZvciBFQ09GRiBkZWJ1Z2dpbmcgc3VwcG9ydAorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisgICBQdXQgdG9nZXRoZXIgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIEdBU19FQ09GRl9ICisjZGVmaW5lIEdBU19FQ09GRl9ICisKKyNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKKworI2luY2x1ZGUgImNvZmYvc3ltLmgiCisjaW5jbHVkZSAiY29mZi9lY29mZi5oIgorCisvKiBXaGV0aGVyIHdlIGhhdmUgc2VlbiBhbnkgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KK2V4dGVybiBpbnQgZWNvZmZfZGVidWdnaW5nX3NlZW47CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYXNzZW1ibHksIGJ5CisgICBvYmpfcmVhZF9iZWdpbl9ob29rLiAgKi8KK2V4dGVybiB2b2lkIGVjb2ZmX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3dpdGNoZXMgdG8gYSBuZXcKKyAgIGZpbGUuICAqLworZXh0ZXJuIHZvaWQgZWNvZmZfbmV3X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHN5bWJvbCBpcyBjcmVhdGVkLCBieQorICAgb2JqX3N5bWJvbF9uZXdfaG9vay4gICovCitleHRlcm4gdm9pZCBlY29mZl9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgb2JqX2Zyb2Jfc3ltYm9sIGhvb2suICAqLworZXh0ZXJuIHZvaWQgZWNvZmZfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqKSk7CisKKy8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkKKyAgIG9ial9mcm9iX2ZpbGUuICBUaGlzIGZpbGxzIGluIHRoZSBjb3VudHMgaW4gKkhEUjsgdGhlIG9mZnNldHMgYXJlCisgICBmaWxsZWQgaW4gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSAqQlVGUC4gIEl0IHNldHMgKkJVRlAgdG8gYQorICAgYmxvY2sgb2YgbWVtb3J5IGhvbGRpbmcgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEl0IHJldHVybnMgdGhlCisgICBsZW5ndGggb2YgKkJVRlAuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfZGVidWcKKyAgUEFSQU1TICgoSERSUiAqaGRyLCBjaGFyICoqYnVmcCwgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKikpOworCisvKiBGdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gICovCitleHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfYmVnaW4gUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfYmVuZCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9lbmQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW50IFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2ZtYXNrIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2ZyYW1lIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2xvYyBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrIFBBUkFNUyAoKGludCkpOworCisvKiBPdGhlciBFQ09GRiBkaXJlY3RpdmVzLiAgKi8KK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4gUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCBQQVJBTVMgKChpbnQpKTsKKworLyogRnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgQ09GRiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gICovCitleHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZGVmIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2RpbSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9maWxlIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3NjbCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9zaXplIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3RhZyBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV90eXBlIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3ZhbCBQQVJBTVMgKChpbnQpKTsKKworLyogSGFuZGxlIHN0YWJzLiAgKi8KK2V4dGVybiB2b2lkIGVjb2ZmX3N0YWIgUEFSQU1TICgoc2VnVCBzZWMsIGludCB3aGF0LCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkJaW50IHR5cGUsIGludCBvdGhlciwgaW50IGRlc2MpKTsKKworLyogU2V0IHRoZSBHUCBwcm9sb2d1ZSBzaXplLiAgKi8KK2V4dGVybiB2b2lkIGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSBQQVJBTVMgKChpbnQgc3opKTsKKworLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBFQ09GRiBjb2RlIHRvIHNldCB0aGUgZXh0ZXJuYWwKKyAgIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCisjaWZuZGVmIG9ial9lY29mZl9zZXRfZXh0CitleHRlcm4gdm9pZCBvYmpfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIEVYVFIgKikpOworI2VuZGlmCisKKy8qIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBhdGNoIHVwIGEgbGluZSBudW1iZXIgZGlyZWN0aXZlIHdoZW4KKyAgIGluc3RydWN0aW9ucyBhcmUgbW92ZWQgYXJvdW5kLiAgKi8KK2V4dGVybiB2b2lkIGVjb2ZmX2ZpeF9sb2MgUEFSQU1TICgoZnJhZ1MgKiwgdW5zaWduZWQgbG9uZykpOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHJlYWQuYyB0byBwZWVrIGF0IGN1cl9maWxlX3B0ci4gICovCitleHRlcm4gaW50IGVjb2ZmX25vX2N1cnJlbnRfZmlsZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBwcm9jLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICplY29mZl9nZXRfY3VyX3Byb2Nfc3ltIFBBUkFNUyAoKHZvaWQpKTsKKworI2VuZGlmIC8qIEVDT0ZGX0RFQlVHR0lORyAqLworCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gcmVhZC5jIHRvIGdlbmVyYXRlIGxpbmUgbnVtYmVyIGZvciAucyBmaWxlLiAgKi8KK2V4dGVybiB2b2lkIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gUEFSQU1TICgodm9pZCkpOworCisjZW5kaWYgLyogISBHQVNfRUNPRkZfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2Vob3B0LmMgYi9nYXMvZWhvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE1ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2Vob3B0LmMKQEAgLTAsMCArMSw0NjkgQEAKKy8qIGVob3B0LmMtLW9wdGltaXplIGdjYyBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisKKy8qIFdlIGluY2x1ZGUgdGhpcyBFTEYgZmlsZSwgZXZlbiB0aG91Z2ggd2UgbWF5IG5vdCBiZSBhc3NlbWJsaW5nIGZvcgorICAgRUxGLCBzaW5jZSB0aGUgZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uIGlzIGFsd2F5cyBpbiBhIGZvcm1hdAorICAgZGVyaXZlZCBmcm9tIERXQVJGLiAgKi8KKworI2luY2x1ZGUgImVsZi9kd2FyZjIuaCIKKworLyogVHJ5IHRvIG9wdGltaXplIGdjYyAyLjggZXhjZXB0aW9uIGZyYW1lIGluZm9ybWF0aW9uLgorCisgICBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gaXMgZW1pdHRlZCBmb3IgZXZlcnkgZnVuY3Rpb24gaW4gdGhlCisgICAuZWhfZnJhbWUgc2VjdGlvbi4gIFNpbXBsZSBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbiB3aXRoIG5vCisgICBleGNlcHRpb25zIGxvb2tzIGxpa2UgdGhpczoKKworX19GUkFNRV9CRUdJTl9fOgorCS40Ynl0ZQkuTExDSUUxCS8gTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeQorLkxTQ0lFMToKKwkuNGJ5dGUJMHgwCS8gQ0lFIElkZW50aWZpZXIgVGFnCisJLmJ5dGUJMHgxCS8gQ0lFIFZlcnNpb24KKwkuYnl0ZQkweDAJLyBDSUUgQXVnbWVudGF0aW9uIChub25lKQorCS5ieXRlCTB4MQkvIFVMRUIxMjggMHgxIChDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yKQorCS5ieXRlCTB4N2MJLyBTTEVCMTI4IC00IChDSUUgRGF0YSBBbGlnbm1lbnQgRmFjdG9yKQorCS5ieXRlCTB4OAkvIENJRSBSQSBDb2x1bW4KKwkuYnl0ZQkweGMJLyBEV19DRkFfZGVmX2NmYQorCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0CisJLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKKwkuYnl0ZQkweDg4CS8gRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OAorCS5ieXRlCTB4MQkvIFVMRUIxMjggMHgxCisJLmFsaWduIDQKKy5MRUNJRTE6CisJLnNldAkuTExDSUUxLC5MRUNJRTEtLkxTQ0lFMQkvIENJRSBMZW5ndGggU3ltYm9sCisJLjRieXRlCS5MTEZERTEJLyBGREUgTGVuZ3RoCisuTFNGREUxOgorCS40Ynl0ZQkuTFNGREUxLV9fRlJBTUVfQkVHSU5fXwkvIEZERSBDSUUgb2Zmc2V0CisJLjRieXRlCS5MRkIxCS8gRkRFIGluaXRpYWwgbG9jYXRpb24KKwkuNGJ5dGUJLkxGRTEtLkxGQjEJLyBGREUgYWRkcmVzcyByYW5nZQorCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkwLS5MRkIxCisJLmJ5dGUJMHhlCS8gRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0CisJLmJ5dGUJMHg4CS8gVUxFQjEyOCAweDgKKwkuYnl0ZQkweDg1CS8gRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NQorCS5ieXRlCTB4MgkvIFVMRUIxMjggMHgyCisJLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkuTENGSTEtLkxDRkkwCisJLmJ5dGUJMHhkCS8gRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIKKwkuYnl0ZQkweDUJLyBVTEVCMTI4IDB4NQorCS5ieXRlCTB4NAkvIERXX0NGQV9hZHZhbmNlX2xvYzQKKwkuNGJ5dGUJLkxDRkkyLS5MQ0ZJMQorCS5ieXRlCTB4MmUJLyBEV19DRkFfR05VX2FyZ3Nfc2l6ZQorCS5ieXRlCTB4NAkvIFVMRUIxMjggMHg0CisJLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAorCS40Ynl0ZQkuTENGSTMtLkxDRkkyCisJLmJ5dGUJMHgyZQkvIERXX0NGQV9HTlVfYXJnc19zaXplCisJLmJ5dGUJMHgwCS8gVUxFQjEyOCAweDAKKwkuYWxpZ24gNAorLkxFRkRFMToKKwkuc2V0CS5MTEZERTEsLkxFRkRFMS0uTFNGREUxCS8gRkRFIExlbmd0aCBTeW1ib2wKKworICAgVGhlIGltbWVkaWF0ZSBpc3N1ZSB3ZSBjYW4gYWRkcmVzcyBpbiB0aGUgYXNzZW1ibGVyIGlzIHRoZQorICAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSB2YWx1ZS4gIFRoZSB2YWx1ZSBpcworICAgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGFkZHJlc3NlcyBpbiB0aGUgZnVuY3Rpb24uICBTaW5jZSBnY2MgZG9lcworICAgbm90IGtub3cgdGhpcyB2YWx1ZSwgaXQgYWx3YXlzIHVzZXMgZm91ciBieXRlcy4gIFdlIHdpbGwga25vdyB0aGUKKyAgIHZhbHVlIGF0IHRoZSBlbmQgb2YgYXNzZW1ibHksIHNvIHdlIGNhbiBkbyBiZXR0ZXIuICAqLworCitzdGF0aWMgaW50IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50IFBBUkFNUyAoKHZvaWQpKTsKKworLyogR2V0IHRoZSBjb2RlIGFsaWdubWVudCBmYWN0b3IgZnJvbSB0aGUgQ0lFLiAgKi8KKworc3RhdGljIGludAorZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCkKK3sKKyAgc3RhdGljIGludCBjb2RlX2FsaWdubWVudDsKKyAgc2VnVCBjdXJyZW50X3NlZzsKKyAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZzsKKyAgZnJhZ1MgKmY7CisgIGZpeFMgKmZpeDsKKyAgaW50IG9mZnNldDsKKyAgY2hhciBhdWdtZW50YXRpb25bMTBdOworICBpbnQgaWF1ZzsKKworICBpZiAoY29kZV9hbGlnbm1lbnQgIT0gMCkKKyAgICByZXR1cm4gY29kZV9hbGlnbm1lbnQ7CisKKyAgLyogV2Ugc2hvdWxkIGZpbmQgdGhlIENJRSBhdCB0aGUgc3RhcnQgb2YgdGhlIC5laF9mcmFtZSBzZWN0aW9uLiAgKi8KKworICBjdXJyZW50X3NlZyA9IG5vd19zZWc7CisgIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKKyAgc3Vic2VnX25ldyAoIi5laF9mcmFtZSIsIDApOworI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8IGRlZmluZWQgKE1BTllfU0VHTUVOVFMpCisgIGYgPSBzZWdfaW5mbyAobm93X3NlZyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7CisjZWxzZQorICBmID0gZnJjaGFpbl9ub3ctPmZyY2hfcm9vdDsKKyNlbmRpZgorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgZml4ID0gc2VnX2luZm8gKG5vd19zZWcpLT5mcmNoYWluUC0+Zml4X3Jvb3Q7CisjZWxzZQorICBmaXggPSAqc2VnX2ZpeF9yb290UDsKKyNlbmRpZgorICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgZnJhZ3Mgb2YgdGhlIHNlY3Rpb24gdG8gZmluZCB0aGUgY29kZSBhbGlnbm1lbnQuICAqLworCisgIC8qIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBDSUUgSWRlbnRpZmllciBUYWcgaXMgMC4gICovCisKKyAgb2Zmc2V0ID0gNDsKKyAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQorICAgIHsKKyAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7CisgICAgICBmID0gZi0+ZnJfbmV4dDsKKyAgICB9CisgIGlmIChmID09IE5VTEwKKyAgICAgIHx8IGYtPmZyX2ZpeCAtIG9mZnNldCA8IDQKKyAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAwCisgICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldCArIDFdICE9IDAKKyAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMl0gIT0gMAorICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSAhPSAwKQorICAgIHsKKyAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIE5leHQgbWFrZSBzdXJlIHRoZSBDSUUgdmVyc2lvbiBudW1iZXIgaXMgMS4gICovCisKKyAgb2Zmc2V0ICs9IDQ7CisgIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKKyAgICB7CisgICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OworICAgICAgZiA9IGYtPmZyX25leHQ7CisgICAgfQorICBpZiAoZiA9PSBOVUxMCisgICAgICB8fCBmLT5mcl9maXggLSBvZmZzZXQgPCAxCisgICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gMSkKKyAgICB7CisgICAgICBjb2RlX2FsaWdubWVudCA9IC0xOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBTa2lwIHRoZSBhdWdtZW50YXRpb24gKGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZykuICAqLworCisgIGlhdWcgPSAwOworICArK29mZnNldDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQorCXsKKwkgIG9mZnNldCAtPSBmLT5mcl9maXg7CisJICBmID0gZi0+ZnJfbmV4dDsKKwl9CisgICAgICBpZiAoZiA9PSBOVUxMKQorCXsKKwkgIGNvZGVfYWxpZ25tZW50ID0gLTE7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgd2hpbGUgKG9mZnNldCA8IGYtPmZyX2ZpeCAmJiBmLT5mcl9saXRlcmFsW29mZnNldF0gIT0gJ1wwJykKKwl7CisJICBpZiAoKHNpemVfdCkgaWF1ZyA8IChzaXplb2YgYXVnbWVudGF0aW9uKSAtIDEpCisJICAgIHsKKwkgICAgICBhdWdtZW50YXRpb25baWF1Z10gPSBmLT5mcl9saXRlcmFsW29mZnNldF07CisJICAgICAgKytpYXVnOworCSAgICB9CisJICArK29mZnNldDsKKwl9CisgICAgICBpZiAob2Zmc2V0IDwgZi0+ZnJfZml4KQorCWJyZWFrOworICAgIH0KKyAgKytvZmZzZXQ7CisgIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKKyAgICB7CisgICAgICBvZmZzZXQgLT0gZi0+ZnJfZml4OworICAgICAgZiA9IGYtPmZyX25leHQ7CisgICAgfQorICBpZiAoZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGF1Z21lbnRhdGlvbltpYXVnXSA9ICdcMCc7CisgIGlmIChhdWdtZW50YXRpb25bMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBObyBhdWdtZW50YXRpb24uICAqLworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChhdWdtZW50YXRpb24sICJlaCIpID09IDApCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBza2lwIGEgcG9pbnRlci4gIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGtub3cgaG93CisJIGxhcmdlIGl0IGlzLiAgV2UgZmluZCBvdXQgYnkgbG9va2luZyBmb3IgYSBtYXRjaGluZyBmaXh1cC4gICovCisgICAgICB3aGlsZSAoZml4ICE9IE5VTEwKKwkgICAgICYmIChmaXgtPmZ4X2ZyYWcgIT0gZiB8fCBmaXgtPmZ4X3doZXJlICE9IG9mZnNldCkpCisJZml4ID0gZml4LT5meF9uZXh0OworICAgICAgaWYgKGZpeCA9PSBOVUxMKQorCW9mZnNldCArPSA0OworICAgICAgZWxzZQorCW9mZnNldCArPSBmaXgtPmZ4X3NpemU7CisgICAgICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCisJeworCSAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKKwkgIGYgPSBmLT5mcl9uZXh0OworCX0KKyAgICAgIGlmIChmID09IE5VTEwpCisJeworCSAgY29kZV9hbGlnbm1lbnQgPSAtMTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogV2UncmUgbm93IGF0IHRoZSBjb2RlIGFsaWdubWVudCBmYWN0b3IsIHdoaWNoIGlzIGEgVUxFQjEyOC4gIElmCisgICAgIGl0IGlzbid0IGEgc2luZ2xlIGJ5dGUsIGZvcmdldCBpdC4gICovCisKKyAgY29kZV9hbGlnbm1lbnQgPSBmLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOworICBpZiAoKGNvZGVfYWxpZ25tZW50ICYgMHg4MCkgIT0gMCB8fCBjb2RlX2FsaWdubWVudCA9PSAwKQorICAgIHsKKyAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBjb2RlX2FsaWdubWVudDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBlbWl0X2V4cHIuICBJdCBsb29rcyBmb3IgY2FzZXMgd2hpY2gKKyAgIHdlIGNhbiBvcHRpbWl6ZS4KKworICAgUmF0aGVyIHRoYW4gdHJ5IHRvIHBhcnNlIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFzIHdlIHJlYWQgaXQsIHdlCisgICBsb29rIGZvciBhIHNpbmdsZSBieXRlIERXX0NGQV9hZHZhbmNlX2xvYzQgZm9sbG93ZWQgYnkgYSA0IGJ5dGUKKyAgIGRpZmZlcmVuY2UuICBXZSB0dXJuIHRoYXQgaW50byBhIHJzX2NmYV9hZHZhbmNlIGZyYWcsIGFuZCBoYW5kbGUKKyAgIHRob3NlIGZyYWdzIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LiAgSWYgdGhlIGdjYyBvdXRwdXQgY2hhbmdlcworICAgc29tZXdoYXQsIHRoaXMgb3B0aW1pemF0aW9uIG1heSBzdG9wIHdvcmtpbmcuCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiBpdCBoYW5kbGVkIHRoZSBleHByZXNzaW9uIGFuZAorICAgZW1pdF9leHByIHNob3VsZCBub3QgZG8gYW55dGhpbmcsIG9yIHplcm8gb3RoZXJ3aXNlLiAgSXQgY2FuIGFsc28KKyAgIGNoYW5nZSAqRVhQIGFuZCAqUE5CWVRFUy4gICovCisKK2ludAorY2hlY2tfZWhfZnJhbWUgKGV4cCwgcG5ieXRlcykKKyAgICAgZXhwcmVzc2lvblMgKmV4cDsKKyAgICAgdW5zaWduZWQgaW50ICpwbmJ5dGVzOworeworICBzdGF0aWMgaW50IHNhd19zaXplOworICBzdGF0aWMgc3ltYm9sUyAqc2l6ZV9lbmRfc3ltOworICBzdGF0aWMgaW50IHNhd19hZHZhbmNlX2xvYzQ7CisgIHN0YXRpYyBmcmFnUyAqbG9jNF9mcmFnOworICBzdGF0aWMgaW50IGxvYzRfZml4OworCisgIGlmIChzYXdfc2l6ZQorICAgICAgJiYgU19JU19ERUZJTkVEIChzaXplX2VuZF9zeW0pKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgY29tZSB0byB0aGUgZW5kIG9mIHRoZSBDSUUgb3IgRkRFLiAgU2VlIGJlbG93IHdoZXJlCisgICAgICAgICB3ZSBzZXQgc2F3X3NpemUuICBXZSBtdXN0IGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZSB3ZSBtYXkgbm93CisgICAgICAgICBiZSBsb29raW5nIGF0IHRoZSBuZXh0IHNpemUuICAqLworICAgICAgc2F3X3NpemUgPSAwOworICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7CisgICAgfQorCisgIGlmIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCkKKyAgICB7CisgICAgICAvKiBEb24ndCBvcHRpbWl6ZS4gICovCisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZWhfZnJhbWUiKSAhPSAwKQorICAgIHsKKyAgICAgIHNhd19zaXplID0gMDsKKyAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOworICAgIH0KKyAgZWxzZSBpZiAoISBzYXdfc2l6ZQorCSAgICYmICpwbmJ5dGVzID09IDQpCisgICAgeworICAgICAgLyogVGhpcyBtaWdodCBiZSB0aGUgc2l6ZSBvZiB0aGUgQ0lFIG9yIEZERS4gIFdlIHdhbnQgdG8ga25vdworICAgICAgICAgdGhlIHNpemUgc28gdGhhdCB3ZSBkb24ndCBhY2NpZGVudGFsbHkgb3B0aW1pemUgYWNyb3NzIGFuIEZERQorICAgICAgICAgYm91bmRhcnkuICBXZSByZWNvZ25pemUgdGhlIHNpemUgaW4gb25lIG9mIHR3byBmb3JtczogYQorICAgICAgICAgc3ltYm9sIHdoaWNoIHdpbGwgbGF0ZXIgYmUgZGVmaW5lZCBhcyBhIGRpZmZlcmVuY2UsIG9yIGEKKyAgICAgICAgIHN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzLiAgRWl0aGVyIHdheSwgd2UgY2FuIHRlbGwgd2hlbiB3ZQorICAgICAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIEZERSBiZWNhdXNlIHRoZSBzeW1ib2wgYmVjb21lcyBkZWZpbmVkCisgICAgICAgICAoaW4gdGhlIGNhc2Ugb2YgYSBzdWJ0cmFjdGlvbiwgdGhlIGVuZCBzeW1ib2wsIGZyb20gd2hpY2ggdGhlCisgICAgICAgICBzdGFydCBzeW1ib2wgaXMgYmVpbmcgc3VidHJhY3RlZCkuICBPdGhlciB3YXlzIG9mIGRlc2NyaWJpbmcKKyAgICAgICAgIHRoZSBzaXplIHdpbGwgbm90IGJlIG9wdGltaXplZC4gICovCisgICAgICBpZiAoKGV4cC0+WF9vcCA9PSBPX3N5bWJvbCB8fCBleHAtPlhfb3AgPT0gT19zdWJ0cmFjdCkKKwkgICYmICEgU19JU19ERUZJTkVEIChleHAtPlhfYWRkX3N5bWJvbCkpCisJeworCSAgc2F3X3NpemUgPSAxOworCSAgc2l6ZV9lbmRfc3ltID0gZXhwLT5YX2FkZF9zeW1ib2w7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoc2F3X3NpemUKKwkgICAmJiAqcG5ieXRlcyA9PSAxCisJICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKKwkgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSBEV19DRkFfYWR2YW5jZV9sb2M0KQorICAgIHsKKyAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBEV19DRkFfYWR2YW5jZV9sb2M0LiAgUmVjb3JkIHRoZSBmcmFnIGFuZCB0aGUKKyAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiB0aGUgZnJhZywgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IGxhdGVyLiAgKi8KKyAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAxOworICAgICAgZnJhZ19ncm93ICgxKTsKKyAgICAgIGxvYzRfZnJhZyA9IGZyYWdfbm93OworICAgICAgbG9jNF9maXggPSBmcmFnX25vd19maXggKCk7CisgICAgfQorICBlbHNlIGlmIChzYXdfYWR2YW5jZV9sb2M0CisJICAgJiYgKnBuYnl0ZXMgPT0gNAorCSAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIGludCBjYTsKKworICAgICAgLyogVGhpcyBpcyBhIGNhc2Ugd2hpY2ggd2UgY2FuIG9wdGltaXplLiAgVGhlIHR3byBzeW1ib2xzIGJlaW5nCisgICAgICAgICBzdWJ0cmFjdGVkIHdlcmUgaW4gdGhlIHNhbWUgZnJhZyBhbmQgdGhlIGV4cHJlc3Npb24gd2FzCisgICAgICAgICByZWR1Y2VkIHRvIGEgY29uc3RhbnQuICBXZSBjYW4gZG8gdGhlIG9wdGltaXphdGlvbiBlbnRpcmVseQorICAgICAgICAgaW4gdGhpcyBmdW5jdGlvbi4gICovCisKKyAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOworCisgICAgICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOworICAgICAgaWYgKGNhIDwgMCkKKwl7CisJICAvKiBEb24ndCBvcHRpbWl6ZS4gICovCisJfQorICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9udW1iZXIgJSBjYSA9PSAwCisJICAgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyIC8gY2EgPCAweDQwKQorCXsKKwkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0KKwkgICAgPSBEV19DRkFfYWR2YW5jZV9sb2MgfCAoZXhwLT5YX2FkZF9udW1iZXIgLyBjYSk7CisJICAvKiBObyBtb3JlIGJ5dGVzIG5lZWRlZC4gICovCisJICByZXR1cm4gMTsKKwl9CisgICAgICBlbHNlIGlmIChleHAtPlhfYWRkX251bWJlciA8IDB4MTAwKQorCXsKKwkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MxOworCSAgKnBuYnl0ZXMgPSAxOworCX0KKyAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKKwl7CisJICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMjsKKwkgICpwbmJ5dGVzID0gMjsKKwl9CisgICAgfQorICBlbHNlIGlmIChzYXdfYWR2YW5jZV9sb2M0CisJICAgJiYgKnBuYnl0ZXMgPT0gNAorCSAgICYmIGV4cC0+WF9vcCA9PSBPX3N1YnRyYWN0KQorICAgIHsKKworICAgICAgLyogVGhpcyBpcyBhIGNhc2Ugd2UgY2FuIG9wdGltaXplLiAgVGhlIGV4cHJlc3Npb24gd2FzIG5vdAorICAgICAgICAgcmVkdWNlZCwgc28gd2UgY2FuIG5vdCBmaW5pc2ggdGhlIG9wdGltaXphdGlvbiB1bnRpbCB0aGUgZW5kCisgICAgICAgICBvZiB0aGUgYXNzZW1ibHkuICBXZSBzZXQgdXAgYSB2YXJpYW50IGZyYWcgd2hpY2ggd2UgaGFuZGxlCisgICAgICAgICBsYXRlci4gICovCisKKyAgICAgIHNhd19hZHZhbmNlX2xvYzQgPSAwOworCisgICAgICBmcmFnX3ZhciAocnNfY2ZhLCA0LCAwLCAwLCBtYWtlX2V4cHJfc3ltYm9sIChleHApLAorCQlsb2M0X2ZpeCwgKGNoYXIgKikgbG9jNF9mcmFnKTsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIHNpemUgb2YgYSByc19jZmEgdmFyaWFudCBmcmFnIGJhc2VkIG9uCisgICB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHN5bWJvbHMuICBJdCBpcyBjYWxsZWQgYmVmb3JlIHRoZQorICAgcmVsYXhhdGlvbiBsb29wLiAgV2Ugc2V0IGZyX3N1YnR5cGUgdG8gdGhlIGV4cGVjdGVkIGxlbmd0aC4gICovCisKK2ludAorZWhfZnJhbWVfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWcpCisgICAgIGZyYWdTICpmcmFnOworeworICBpbnQgY2E7CisgIG9mZnNldFQgZGlmZjsKKyAgaW50IHJldDsKKworICBjYSA9IGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50ICgpOworICBkaWZmID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWctPmZyX3N5bWJvbCwgMCk7CisKKyAgaWYgKGNhIDwgMCkKKyAgICByZXQgPSA0OworICBlbHNlIGlmIChkaWZmICUgY2EgPT0gMCAmJiBkaWZmIC8gY2EgPCAweDQwKQorICAgIHJldCA9IDA7CisgIGVsc2UgaWYgKGRpZmYgPCAweDEwMCkKKyAgICByZXQgPSAxOworICBlbHNlIGlmIChkaWZmIDwgMHgxMDAwMCkKKyAgICByZXQgPSAyOworICBlbHNlCisgICAgcmV0ID0gNDsKKworICBmcmFnLT5mcl9zdWJ0eXBlID0gcmV0OworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVsYXhlcyBhIHJzX2NmYSB2YXJpYW50IGZyYWcgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgIHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gIGZyX3N1YnR5cGUgaXMgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZQorICAgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgY2hhbmdlIGluIGZyYWcgbGVuZ3RoLiAgKi8KKworaW50CitlaF9mcmFtZV9yZWxheF9mcmFnIChmcmFnKQorICAgICBmcmFnUyAqZnJhZzsKK3sKKyAgaW50IG9sZHNpemUsIG5ld3NpemU7CisKKyAgb2xkc2l6ZSA9IGZyYWctPmZyX3N1YnR5cGU7CisgIG5ld3NpemUgPSBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZyk7CisgIHJldHVybiBuZXdzaXplIC0gb2xkc2l6ZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHJzX2NmYSB2YXJpYW50IGZyYWcgaW50byBhIG5vcm1hbCBmaWxsCisgICBmcmFnLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHJlbGF4YXRpb24gaGFzIGJlZW4gZG9uZS4KKyAgIGZyX3N1YnR5cGUgd2lsbCBiZSB0aGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIGZyYWcuICAqLworCit2b2lkCitlaF9mcmFtZV9jb252ZXJ0X2ZyYWcgKGZyYWcpCisgICAgIGZyYWdTICpmcmFnOworeworICBvZmZzZXRUIGRpZmY7CisgIGZyYWdTICpsb2M0X2ZyYWc7CisgIGludCBsb2M0X2ZpeDsKKworICBsb2M0X2ZyYWcgPSAoZnJhZ1MgKikgZnJhZy0+ZnJfb3Bjb2RlOworICBsb2M0X2ZpeCA9IChpbnQpIGZyYWctPmZyX29mZnNldDsKKworICBkaWZmID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWctPmZyX3N5bWJvbCwgMSk7CisKKyAgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMCkKKyAgICB7CisgICAgICBpbnQgY2E7CisKKyAgICAgIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7CisgICAgICBhc3NlcnQgKGNhID4gMCAmJiBkaWZmICUgY2EgPT0gMCAmJiBkaWZmIC8gY2EgPCAweDQwKTsKKyAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MgfCAoZGlmZiAvIGNhKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMSkKKyAgICB7CisgICAgICBhc3NlcnQgKGRpZmYgPCAweDEwMCk7CisgICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMTsKKyAgICAgIGZyYWctPmZyX2xpdGVyYWxbZnJhZy0+ZnJfZml4XSA9IGRpZmY7CisgICAgfQorICBlbHNlIGlmIChmcmFnLT5mcl9zdWJ0eXBlID09IDIpCisgICAgeworICAgICAgYXNzZXJ0IChkaWZmIDwgMHgxMDAwMCk7CisgICAgICBsb2M0X2ZyYWctPmZyX2xpdGVyYWxbbG9jNF9maXhdID0gRFdfQ0ZBX2FkdmFuY2VfbG9jMjsKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZy0+ZnJfbGl0ZXJhbCArIGZyYWctPmZyX2ZpeCwgZGlmZiwgMik7CisgICAgfQorICBlbHNlCisgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LCBkaWZmLCA0KTsKKworICBmcmFnLT5mcl9maXggKz0gZnJhZy0+ZnJfc3VidHlwZTsKKyAgZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7CisgIGZyYWctPmZyX29mZnNldCA9IDA7Cit9CmRpZmYgLS1naXQgYS9nYXMvZW11bC10YXJnZXQuaCBiL2dhcy9lbXVsLXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDQwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZW11bC10YXJnZXQuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIGVtdWxfaW5pdAorI2RlZmluZSBlbXVsX2luaXQJCQljb21tb25fZW11bF9pbml0CisjZW5kaWYKKworI2lmbmRlZiBlbXVsX2JmZF9uYW1lCisjZGVmaW5lIGVtdWxfYmZkX25hbWUJCQlkZWZhdWx0X2VtdWxfYmZkX25hbWUKKyNlbmRpZgorCisjaWZuZGVmIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCisjZGVmaW5lIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCQkwCisjZW5kaWYKKworI2lmbmRlZiBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIKKyNkZWZpbmUgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyCTAKKyNlbmRpZgorCisjaWZuZGVmIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCisjZGVmaW5lIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCQkyCisjZW5kaWYKKworI2lmbmRlZiBlbXVsX3N0cmlwX3VuZGVyc2NvcmUKKyNkZWZpbmUgZW11bF9zdHJpcF91bmRlcnNjb3JlCQkwCisjZW5kaWYKKworI2lmbmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCisjZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4JCTIKKyNlbmRpZgorCisjaWZuZGVmIGVtdWxfZmFrZV9sYWJlbF9uYW1lCisjZGVmaW5lIGVtdWxfZmFrZV9sYWJlbF9uYW1lCQkwCisjZW5kaWYKKworc3RydWN0IGVtdWxhdGlvbiBlbXVsX3N0cnVjdF9uYW1lID0geworICAwLAorICBlbXVsX25hbWUsCisgIGVtdWxfaW5pdCwKKyAgZW11bF9iZmRfbmFtZSwKKyAgZW11bF9sb2NhbF9sYWJlbHNfZmIsIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhciwKKyAgZW11bF9sZWFkaW5nX3VuZGVyc2NvcmUsIGVtdWxfc3RyaXBfdW5kZXJzY29yZSwKKyAgZW11bF9kZWZhdWx0X2VuZGlhbiwKKyAgZW11bF9mYWtlX2xhYmVsX25hbWUsCisgIGVtdWxfZm9ybWF0LAorfTsKZGlmZiAtLWdpdCBhL2dhcy9lbXVsLmggYi9nYXMvZW11bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZW11bC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgRU1VTF9ERUZTCisjZGVmaW5lIEVNVUxfREVGUworCitzdHJ1Y3QgZW11bGF0aW9uIHsKKyAgdm9pZCAoKm1hdGNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAoKmluaXQpIFBBUkFNUyAoKHZvaWQpKTsKKyAgY29uc3QgY2hhciAqKCpiZmRfbmFtZSkgUEFSQU1TICgodm9pZCkpOworICB1bnNpZ25lZCBsb2NhbF9sYWJlbHNfZmIgOiAxOworICB1bnNpZ25lZCBsb2NhbF9sYWJlbHNfZG9sbGFyIDogMTsKKyAgdW5zaWduZWQgbGVhZGluZ191bmRlcnNjb3JlIDogMjsKKyAgdW5zaWduZWQgc3RyaXBfdW5kZXJzY29yZSA6IDE7CisgIHVuc2lnbmVkIGRlZmF1bHRfZW5kaWFuIDogMjsKKyAgY29uc3QgY2hhciAqZmFrZV9sYWJlbF9uYW1lOworICBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyAqZm9ybWF0OworfTsKKworQ09NTU9OIHN0cnVjdCBlbXVsYXRpb24gKnRoaXNfZW11bGF0aW9uOworCitleHRlcm4gY29uc3QgY2hhciAqZGVmYXVsdF9lbXVsX2JmZF9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGNvbW1vbl9lbXVsX2luaXQgUEFSQU1TICgodm9pZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9leHByLmMgYi9nYXMvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDU1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZXhwci5jCkBAIC0wLDAgKzEsMTg1OSBAQAorLyogZXhwci5jIC1vcGVyYW5kcywgZXhwcmVzc2lvbnMtCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworLyoKKyAqIFRoaXMgaXMgcmVhbGx5IGEgYnJhbmNoIG9mZmljZSBvZiBhcy1yZWFkLmMuIEkgc3BsaXQgaXQgb3V0IHRvIGNsZWFybHkKKyAqIGRpc3Rpbmd1aXNoIHRoZSB3b3JsZCBvZiBleHByZXNzaW9ucyBmcm9tIHRoZSB3b3JsZCBvZiBzdGF0ZW1lbnRzLgorICogKEl0IGFsc28gZ2l2ZXMgc21hbGxlciBmaWxlcyB0byByZS1jb21waWxlLikKKyAqIEhlcmUsICJvcGVyYW5kInMgYXJlIG9mIGV4cHJlc3Npb25zLCBub3QgaW5zdHJ1Y3Rpb25zLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBtaW4oYSwgYikgICAgICAgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorCitzdGF0aWMgdm9pZCBmbG9hdGluZ19jb25zdGFudCBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7CitzdGF0aWMgdm9pZCBpbnRlZ2VyX2NvbnN0YW50IFBBUkFNUyAoKGludCByYWRpeCwgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOworc3RhdGljIHZvaWQgbXJpX2NoYXJfY29uc3RhbnQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOworc3RhdGljIHZvaWQgY3VycmVudF9sb2NhdGlvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7CitzdGF0aWMgdm9pZCBjbGVhbl91cF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKK3N0YXRpYyBzZWdUIG9wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOworc3RhdGljIG9wZXJhdG9yVCBvcGVyYXRvciBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBjb25zdCBjaGFyIEVYUF9DSEFSU1tdLCBGTFRfQ0hBUlNbXTsKKworLyogV2Uga2VlcCBhIG1hcHBpbmcgb2YgZXhwcmVzc2lvbiBzeW1ib2xzIHRvIGZpbGUgcG9zaXRpb25zLCBzbyB0aGF0CisgICB3ZSBjYW4gcHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuICAqLworCitzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZQoreworICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbmV4dDsKKyAgc3ltYm9sUyAqc3ltOworICBjaGFyICpmaWxlOworICB1bnNpZ25lZCBpbnQgbGluZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqZXhwcl9zeW1ib2xfbGluZXM7CisMCisvKiBCdWlsZCBhIGR1bW15IHN5bWJvbCB0byBob2xkIGEgY29tcGxleCBleHByZXNzaW9uLiAgVGhpcyBpcyBob3cgd2UKKyAgIGJ1aWxkIGV4cHJlc3Npb25zIHVwIG91dCBvZiBvdGhlciBleHByZXNzaW9ucy4gIFRoZSBzeW1ib2wgaXMgcHV0CisgICBpbnRvIHRoZSBmYWtlIHNlY3Rpb24gZXhwcl9zZWN0aW9uLiAgKi8KKworc3ltYm9sUyAqCittYWtlX2V4cHJfc3ltYm9sIChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworICBleHByZXNzaW9uUyB6ZXJvOworICBjb25zdCBjaGFyICpmYWtlOworICBzeW1ib2xTICpzeW1ib2xQOworICBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbjsKKworICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKKyAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMCkKKyAgICByZXR1cm4gZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbDsKKworICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19iaWcpCisgICAgeworICAgICAgLyogVGhpcyB3b24ndCB3b3JrLCBiZWNhdXNlIHRoZSBhY3R1YWwgdmFsdWUgaXMgc3RvcmVkIGluCisgICAgICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciBvciBnZW5lcmljX2JpZ251bSwgYW5kIHdlIGFyZQorICAgICAgICAgZ29pbmcgdG8gbG9zZSBpdCBpZiB3ZSBoYXZlbid0IGFscmVhZHkuICAqLworICAgICAgaWYgKGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPiAwKQorCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKKyAgICAgIGVsc2UKKwlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7CisgICAgICB6ZXJvLlhfb3AgPSBPX2NvbnN0YW50OworICAgICAgemVyby5YX2FkZF9udW1iZXIgPSAwOworICAgICAgemVyby5YX3Vuc2lnbmVkID0gMDsKKyAgICAgIGNsZWFuX3VwX2V4cHJlc3Npb24gKCZ6ZXJvKTsKKyAgICAgIGV4cHJlc3Npb25QID0gJnplcm87CisgICAgfQorCisgIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7CisKKyAgLyogUHV0dGluZyBjb25zdGFudCBzeW1ib2xzIGluIGFic29sdXRlX3NlY3Rpb24gcmF0aGVyIHRoYW4KKyAgICAgZXhwcl9zZWN0aW9uIGlzIGNvbnZlbmllbnQgZm9yIHRoZSBvbGQgYS5vdXQgY29kZSwgZm9yIHdoaWNoCisgICAgIFNfR0VUX1NFR01FTlQgZG9lcyBub3QgYWx3YXlzIHJldHJpZXZlIHRoZSB2YWx1ZSBwdXQgaW4gYnkKKyAgICAgU19TRVRfU0VHTUVOVC4gICovCisgIHN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChmYWtlLAorCQkJICAgKGV4cHJlc3Npb25QLT5YX29wID09IE9fY29uc3RhbnQKKwkJCSAgICA/IGFic29sdXRlX3NlY3Rpb24KKwkJCSAgICA6IGV4cHJfc2VjdGlvbiksCisJCQkgICAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOworICBzeW1ib2xQLT5zeV92YWx1ZSA9ICpleHByZXNzaW9uUDsKKworICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudCkKKyAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7CisKKyAgbiA9IChzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOworICBuLT5zeW0gPSBzeW1ib2xQOworICBhc193aGVyZSAoJm4tPmZpbGUsICZuLT5saW5lKTsKKyAgbi0+bmV4dCA9IGV4cHJfc3ltYm9sX2xpbmVzOworICBleHByX3N5bWJvbF9saW5lcyA9IG47CisKKyAgcmV0dXJuIHN5bWJvbFA7Cit9CisKKy8qIFJldHVybiB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZm9yIGFuIGV4cHIgc3ltYm9sLiAgUmV0dXJuCisgICBub24temVybyBpZiBzb21ldGhpbmcgd2FzIGZvdW5kLCAwIGlmIG5vIGluZm9ybWF0aW9uIGlzIGtub3duIGZvcgorICAgdGhlIHN5bWJvbC4gICovCisKK2ludAorZXhwcl9zeW1ib2xfd2hlcmUgKHN5bSwgcGZpbGUsIHBsaW5lKQorICAgICBzeW1ib2xTICpzeW07CisgICAgIGNoYXIgKipwZmlsZTsKKyAgICAgdW5zaWduZWQgaW50ICpwbGluZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGV4cHJfc3ltYm9sX2xpbmUgKmw7CisKKyAgZm9yIChsID0gZXhwcl9zeW1ib2xfbGluZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgaWYgKGwtPnN5bSA9PSBzeW0pCisJeworCSAgKnBmaWxlID0gbC0+ZmlsZTsKKwkgICpwbGluZSA9IGwtPmxpbmU7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorDAorLyogVXRpbGl0aWVzIGZvciBidWlsZGluZyBleHByZXNzaW9ucy4KKyAgIFNpbmNlIGNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIHJlY29yZGVkIGFzIHN5bWJvbHMgZm9yIHVzZSBpbiBvdGhlcgorICAgZXhwcmVzc2lvbnMgdGhlc2UgcmV0dXJuIGEgc3ltYm9sUyAqIGFuZCBub3QgYW4gZXhwcmVzc2lvblMgKi4KKyAgIFRoZXNlIGV4cGxpY2l0bHkgZG8gbm90IHRha2UgYW4gImFkZF9udW1iZXIiIGFyZ3VtZW50LiAgKi8KKy8qID8/PyBGb3IgY29tcGxldGVuZXNzJyBzYWtlIG9uZSBtaWdodCB3YW50IGV4cHJfYnVpbGRfc3ltYm9sLgorICAgSXQgd291bGQganVzdCByZXR1cm4gaXRzIGFyZ3VtZW50LiAgKi8KKworLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgYW4gdW5zaWduZWQgY29uc3RhbnQuCisgICBUaGUgY29ycmVzcG9uZGluZyBvbmUgZm9yIHNpZ25lZCBjb25zdGFudHMgaXMgbWlzc2luZyBiZWNhdXNlCisgICB0aGVyZSdzIGN1cnJlbnRseSBubyBuZWVkIGZvciBpdC4gIE9uZSBjb3VsZCBhZGQgYW4gdW5zaWduZWRfcCBmbGFnCisgICBidXQgdGhhdCBzZWVtcyBtb3JlIGNsdW1zeS4gICovCisKK3N5bWJvbFMgKgorZXhwcl9idWlsZF91Y29uc3RhbnQgKHZhbHVlKQorICAgICBvZmZzZXRUIHZhbHVlOworeworICBleHByZXNzaW9uUyBlOworCisgIGUuWF9vcCA9IE9fY29uc3RhbnQ7CisgIGUuWF9hZGRfbnVtYmVyID0gdmFsdWU7CisgIGUuWF91bnNpZ25lZCA9IDE7CisgIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Cit9CisKKy8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIE9QIHMxLiAgKi8KKworc3ltYm9sUyAqCitleHByX2J1aWxkX3VuYXJ5IChvcCwgczEpCisgICAgIG9wZXJhdG9yVCBvcDsKKyAgICAgc3ltYm9sUyAqczE7Cit7CisgIGV4cHJlc3Npb25TIGU7CisKKyAgZS5YX29wID0gb3A7CisgIGUuWF9hZGRfc3ltYm9sID0gczE7CisgIGUuWF9hZGRfbnVtYmVyID0gMDsKKyAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKK30KKworLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgczEgT1AgczIuICAqLworCitzeW1ib2xTICoKK2V4cHJfYnVpbGRfYmluYXJ5IChvcCwgczEsIHMyKQorICAgICBvcGVyYXRvclQgb3A7CisgICAgIHN5bWJvbFMgKnMxOworICAgICBzeW1ib2xTICpzMjsKK3sKKyAgZXhwcmVzc2lvblMgZTsKKworICBlLlhfb3AgPSBvcDsKKyAgZS5YX2FkZF9zeW1ib2wgPSBzMTsKKyAgZS5YX29wX3N5bWJvbCA9IHMyOworICBlLlhfYWRkX251bWJlciA9IDA7CisgIHJldHVybiBtYWtlX2V4cHJfc3ltYm9sICgmZSk7Cit9CisKKy8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uICgnLicpLiAgKi8KKworc3ltYm9sUyAqCitleHByX2J1aWxkX2RvdCAoKQoreworICBleHByZXNzaW9uUyBlOworCisgIGN1cnJlbnRfbG9jYXRpb24gKCZlKTsKKyAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKK30KKwwKKy8qCisgKiBCdWlsZCBhbnkgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbCBoZXJlLgorICogQWxzbyBidWlsZCBhbnkgYmlnbnVtIGxpdGVyYWwgaGVyZS4KKyAqLworCisvKiBTZWVtcyBhdG9mX21hY2hpbmUgY2FuIGJhY2tzY2FuIHRocm91Z2ggZ2VuZXJpY19iaWdudW0gYW5kIGhpdCB3aGF0ZXZlcgorICAgaGFwcGVucyB0byBiZSBsb2FkZWQgYmVmb3JlIGl0IGluIG1lbW9yeS4gIEFuZCBpdHMgd2F5IHRvbyBjb21wbGljYXRlZAorICAgZm9yIG1lIHRvIGZpeCByaWdodC4gIFRodXMgYSBoYWNrLiAgSkY6ICBKdXN0IG1ha2UgZ2VuZXJpY19iaWdudW0gYmlnZ2VyLAorICAgYW5kIG5ldmVyIHdyaXRlIGludG8gdGhlIGVhcmx5IHdvcmRzLCB0aHVzIHRoZXknbGwgYWx3YXlzIGJlIHplcm8uCisgICBJIGhhdGUgRGVhbidzIGZsb2F0aW5nLXBvaW50IGNvZGUuICBCbGVoLiAgKi8KK0xJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW1NJWkVfT0ZfTEFSR0VfTlVNQkVSICsgNl07CitGTE9OVU1fVFlQRSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlciA9Cit7CisgICZnZW5lcmljX2JpZ251bVs2XSwJCS8qIGxvdyAoSkY6IFdhcyAwKSAqLworICAmZ2VuZXJpY19iaWdudW1bU0laRV9PRl9MQVJHRV9OVU1CRVIgKyA2IC0gMV0sIC8qIGhpZ2ggSkY6IChhZGRlZCArNikgKi8KKyAgMCwJCQkJLyogbGVhZGVyICovCisgIDAsCQkJCS8qIGV4cG9uZW50ICovCisgIDAJCQkJLyogc2lnbiAqLworfTsKKy8qIElmIG5vbnplcm8sIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgbmFuLCAraW5mIG9yIC1pbmYgKi8KK2ludCBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X21hZ2ljOworDAorc3RhdGljIHZvaWQKK2Zsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOworeworICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPiovCisgIC8qIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50LiAqLworICBpbnQgZXJyb3JfY29kZTsKKworICBlcnJvcl9jb2RlID0gYXRvZl9nZW5lcmljICgmaW5wdXRfbGluZV9wb2ludGVyLCAiLiIsIEVYUF9DSEFSUywKKwkJCSAgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKKworICBpZiAoZXJyb3JfY29kZSkKKyAgICB7CisgICAgICBpZiAoZXJyb3JfY29kZSA9PSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVykKKwl7CisJICBhc19iYWQgKF8oImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogZXhwb25lbnQgb3ZlcmZsb3csIHByb2JhYmx5IGFzc2VtYmxpbmcganVuayIpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXNfYmFkIChfKCJiYWQgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQ6IHVua25vd24gZXJyb3IgY29kZT0lZC4iKSwgZXJyb3JfY29kZSk7CisJfQorICAgIH0KKyAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKKyAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5qdXN0IGFmdGVyIGNvbnN0YW50LCAqLworICAvKiB3aGljaCBtYXkgcG9pbnQgdG8gd2hpdGVzcGFjZS4gKi8KKyAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IC0xOworfQorCitzdGF0aWMgdmFsdWVUIAorZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCkgCit7CisgIHZhbHVlVCBudW1iZXIgPQorCSAgICgoZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQorCSAgIHwgKGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spOworICBudW1iZXIgJj0gMHhmZmZmZmZmZjsKKyAgcmV0dXJuIG51bWJlcjsKK30KKworI2lmZGVmIEJGRDY0CitzdGF0aWMgdmFsdWVUIAorZ2VuZXJpY19iaWdudW1fdG9faW50NjQgKCkgCit7CisgIHZhbHVlVCBudW1iZXIgPSAKKwkgICAoKCgoKCgoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bM10gJiBMSVRUTEVOVU1fTUFTSykKKwkJIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKKwkgICAgICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzJdICYgTElUVExFTlVNX01BU0spKQorCSAgICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCisJICAgICAgfCAoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykpCisJICAgICA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCisJICAgIHwgKCh2YWx1ZVQpIGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spKTsKKyAgcmV0dXJuIG51bWJlcjsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAoraW50ZWdlcl9jb25zdGFudCAocmFkaXgsIGV4cHJlc3Npb25QKQorICAgICBpbnQgcmFkaXg7CisgICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKK3sKKyAgY2hhciAqc3RhcnQ7CQkvKiBzdGFydCBvZiBudW1iZXIuICovCisgIGNoYXIgKnN1ZmZpeCA9IE5VTEw7CisgIGNoYXIgYzsKKyAgdmFsdWVUIG51bWJlcjsJLyogb2Zmc2V0IG9yIChhYnNvbHV0ZSkgdmFsdWUgKi8KKyAgc2hvcnQgaW50IGRpZ2l0OwkvKiB2YWx1ZSBvZiBuZXh0IGRpZ2l0IGluIGN1cnJlbnQgcmFkaXggKi8KKyAgc2hvcnQgaW50IG1heGRpZyA9IDA7LyogaGlnaGVzdCBwZXJtaXR0ZWQgZGlnaXQgdmFsdWUuICovCisgIGludCB0b29fbWFueV9kaWdpdHMgPSAwOwkvKiBpZiB3ZSBzZWUgPj0gdGhpcyBudW1iZXIgb2YgKi8KKyAgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLworICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCisKKyAgaW50IHNtYWxsOwkJCS8qIHRydWUgaWYgZml0cyBpbiAzMiBiaXRzLiAqLworCisgIC8qIE1heSBiZSBiaWdudW0sIG9yIG1heSBmaXQgaW4gMzIgYml0cy4gKi8KKyAgLyogTW9zdCBudW1iZXJzIGZpdCBpbnRvIDMyIGJpdHMsIGFuZCB3ZSB3YW50IHRoaXMgY2FzZSB0byBiZSBmYXN0LgorICAgICBzbyB3ZSBwcmV0ZW5kIGl0IHdpbGwgZml0IGludG8gMzIgYml0cy4gIElmLCBhZnRlciBtYWtpbmcgdXAgYSAzMgorICAgICBiaXQgbnVtYmVyLCB3ZSByZWFsaXNlIHRoYXQgd2UgaGF2ZSBzY2FubmVkIG1vcmUgZGlnaXRzIHRoYW4KKyAgICAgY29tZm9ydGFibHkgZml0IGludG8gMzIgYml0cywgd2UgcmUtc2NhbiB0aGUgZGlnaXRzIGNvZGluZyB0aGVtCisgICAgIGludG8gYSBiaWdudW0uICBGb3IgZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycyB3ZSBhcmUKKyAgICAgY29uc2VydmF0aXZlOiBTb21lIG51bWJlcnMgbWF5IGJlIGFzc3VtZWQgYmlnbnVtcyB3aGVuIGluIGZhY3QKKyAgICAgdGhleSBkbyBmaXQgaW50byAzMiBiaXRzLiAgTnVtYmVycyBvZiBhbnkgcmFkaXggY2FuIGhhdmUgZXhjZXNzCisgICAgIGxlYWRpbmcgemVyb3M6IFdlIHN0cml2ZSB0byByZWNvZ25pc2UgdGhpcyBhbmQgY2FzdCB0aGVtIGJhY2sKKyAgICAgaW50byAzMiBiaXRzLiAgV2UgbXVzdCBjaGVjayB0aGF0IHRoZSBiaWdudW0gcmVhbGx5IGlzIG1vcmUgdGhhbgorICAgICAzMiBiaXRzLCBhbmQgY2hhbmdlIGl0IGJhY2sgdG8gYSAzMi1iaXQgbnVtYmVyIGlmIGl0IGZpdHMuICBUaGUKKyAgICAgbnVtYmVyIHdlIGFyZSBsb29raW5nIGZvciBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSwgYnV0IGlmIGl0CisgICAgIGZpdHMgaW50byAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIG51bWJlciwgd2UgbGV0IGl0IGJlIGEgMzItYml0CisgICAgIG51bWJlci4gIFRoZSBjYXZhbGllciBhcHByb2FjaCBpcyBmb3Igc3BlZWQgaW4gb3JkaW5hcnkgY2FzZXMuICovCisgIC8qIFRoaXMgaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIDY0IGJpdHMuICBXZSBibGluZGx5IGFzc3VtZSB0aGF0IGlmCisgICAgIHlvdSdyZSBjb21waWxpbmcgaW4gNjQtYml0IG1vZGUsIHRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgbWFjaGluZS4KKyAgICAgVGhpcyBzaG91bGQgYmUgY2xlYW5lZCB1cC4gICovCisKKyNpZmRlZiBCRkQ2NAorI2RlZmluZSB2YWx1ZXNpemUgNjQKKyNlbHNlIC8qIGluY2x1ZGVzIG5vbi1iZmQgY2FzZSwgbW9zdGx5ICovCisjZGVmaW5lIHZhbHVlc2l6ZSAzMgorI2VuZGlmCisKKyAgaWYgKGZsYWdfbTY4a19tcmkgJiYgcmFkaXggPT0gMCkKKyAgICB7CisgICAgICBpbnQgZmx0ID0gMDsKKworICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBudW1iZXIgbWF5IGhhdmUgYSBzdWZmaXggaW5kaWNhdGluZyB0aGUKKyAgICAgICAgIHJhZGl4LiAgRm9yIHRoYXQgbWF0dGVyLCBpdCBtaWdodCBhY3R1YWxseSBiZSBhIGZsb2F0aW5nCisgICAgICAgICBwb2ludCBjb25zdGFudC4gICovCisgICAgICBmb3IgKHN1ZmZpeCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnN1ZmZpeCk7CisJICAgc3VmZml4KyspCisJeworCSAgaWYgKCpzdWZmaXggPT0gJ2UnIHx8ICpzdWZmaXggPT0gJ0UnKQorCSAgICBmbHQgPSAxOworCX0KKworICAgICAgaWYgKHN1ZmZpeCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCisJeworCSAgcmFkaXggPSAxMDsKKwkgIHN1ZmZpeCA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGMgPSAqLS1zdWZmaXg7CisJICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGMpKQorCSAgICBjID0gdG91cHBlciAoYyk7CisJICBpZiAoYyA9PSAnQicpCisJICAgIHJhZGl4ID0gMjsKKwkgIGVsc2UgaWYgKGMgPT0gJ0QnKQorCSAgICByYWRpeCA9IDEwOworCSAgZWxzZSBpZiAoYyA9PSAnTycgfHwgYyA9PSAnUScpCisJICAgIHJhZGl4ID0gODsKKwkgIGVsc2UgaWYgKGMgPT0gJ0gnKQorCSAgICByYWRpeCA9IDE2OworCSAgZWxzZSBpZiAoc3VmZml4WzFdID09ICcuJyB8fCBjID09ICdFJyB8fCBmbHQpCisJICAgIHsKKwkgICAgICBmbG9hdGluZ19jb25zdGFudCAoZXhwcmVzc2lvblApOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmFkaXggPSAxMDsKKwkgICAgICBzdWZmaXggPSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKworICBzd2l0Y2ggKHJhZGl4KQorICAgIHsKKyAgICBjYXNlIDI6CisgICAgICBtYXhkaWcgPSAyOworICAgICAgdG9vX21hbnlfZGlnaXRzID0gdmFsdWVzaXplICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIG1heGRpZyA9IHJhZGl4ID0gODsKKyAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAyKSAvIDMgKyAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIG1heGRpZyA9IHJhZGl4ID0gMTY7CisgICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMykgLyA0ICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBtYXhkaWcgPSByYWRpeCA9IDEwOworICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDEyKSAvIDQ7IC8qIHZlcnkgcm91Z2ggKi8KKyAgICB9CisjdW5kZWYgdmFsdWVzaXplCisgIHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOworICBmb3IgKG51bWJlciA9IDA7CisgICAgICAgKGRpZ2l0ID0gaGV4X3ZhbHVlIChjKSkgPCBtYXhkaWc7CisgICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKKyAgICB7CisgICAgICBudW1iZXIgPSBudW1iZXIgKiByYWRpeCArIGRpZ2l0OworICAgIH0KKyAgLyogYyBjb250YWlucyBjaGFyYWN0ZXIgYWZ0ZXIgbnVtYmVyLiAqLworICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmNoYXIgYWZ0ZXIgYy4gKi8KKyAgc21hbGwgPSAoaW5wdXRfbGluZV9wb2ludGVyIC0gc3RhcnQgLSAxKSA8IHRvb19tYW55X2RpZ2l0czsKKworICBpZiAocmFkaXggPT0gMTYgJiYgYyA9PSAnXycpIAorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgbGl0ZXJhbCBvZiB0aGUgZm9ybSAweDMzM18wXzEyMzQ1Njc4XzEuCisgICAgICAgICBUaGlzIGV4YW1wbGUgaXMgZXF1aXZhbGVudCB0byAweDAwMDAwMzMzMDAwMDAwMDAxMjM0NTY3ODAwMDAwMDAxLiAgKi8KKworICAgICAgaW50IG51bV9saXR0bGVfZGlnaXRzID0gMDsKKyAgICAgIGludCBpOworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7CS8qLT4xc3QgZGlnaXQuICovCisKKyAgICAgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7CisKKyAgICAgIGZvciAoYyA9ICdfJzsgYyA9PSAnXyc7IG51bV9saXR0bGVfZGlnaXRzKz0yKQorCXsKKworCSAgLyogQ29udmVydCBvbmUgNjQtYml0IHdvcmQuICovCisJICBpbnQgbmRpZ2l0ID0gMDsgCisJICBudW1iZXIgPSAwOworCSAgZm9yIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgICAgICAoZGlnaXQgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKKwkgICAgICAgYyA9ICooaW5wdXRfbGluZV9wb2ludGVyKyspKQorCSAgICB7CisJICAgICAgbnVtYmVyID0gbnVtYmVyICogcmFkaXggKyBkaWdpdDsKKwkgICAgICBuZGlnaXQrKzsKKwkgICAgfQorCisJICAvKiBDaGVjayBmb3IgOCBkaWdpdCBwZXIgd29yZCBtYXguICAqLworCSAgaWYgKG5kaWdpdCA+IDgpIAorCSAgICBhc19iYWQgKF8oIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbWF5IG5vdCBoYXZlIG1vcmUgdGhhbiA4IGhleCBkaWdpdHMgaW4gYW55IHdvcmQuIikpOworCisJICAvKiBBZGQgdGhpcyBjaHVuayB0byB0aGUgYmlnbnVtLiAgU2hpZnQgdGhpbmdzIGRvd24gMiBsaXR0bGUgZGlnaXRzLiovCisJICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOworCSAgZm9yIChpID0gbWluIChudW1fbGl0dGxlX2RpZ2l0cyArIDEsIFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSk7IGkgPj0gMjsgaS0tKQorCSAgICBnZW5lcmljX2JpZ251bVtpXSA9IGdlbmVyaWNfYmlnbnVtW2ktMl07CisKKwkgIC8qIEFkZCB0aGUgbmV3IGRpZ2l0cyBhcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbmV3IG9uZXMuICovCisJICBnZW5lcmljX2JpZ251bVswXSA9IG51bWJlciAmIDB4ZmZmZmZmZmY7CisJICBnZW5lcmljX2JpZ251bVsxXSA9IG51bWJlciA+PiAxNjsKKwl9CisKKyAgICAgIC8qIEFnYWluLCBjIGlzIGNoYXIgYWZ0ZXIgbnVtYmVyLCBpbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyIGMuICovCisKKyAgICAgIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA+IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSkKKwludW1fbGl0dGxlX2RpZ2l0cyA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsKKworICAgICAgYXNzZXJ0IChudW1fbGl0dGxlX2RpZ2l0cyA+PSA0KTsKKworICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzICE9IDgpCisJYXNfYmFkIChfKCJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG11c3QgaGF2ZSBleGFjdGx5IDQgd29yZHMuIikpOworCisgICAgICAvKiBXZSBtaWdodCBoYXZlIHNvbWUgbGVhZGluZyB6ZXJvcy4gIFRoZXNlIGNhbiBiZSB0cmltbWVkIHRvIGdpdmUKKyAgICAgICAqIHVzIGEgY2hhbmdlIHRvIGZpdCB0aGlzIGNvbnN0YW50IGludG8gYSBzbWFsbCBudW1iZXIuCisgICAgICAgKi8KKyAgICAgIHdoaWxlIChnZW5lcmljX2JpZ251bVtudW1fbGl0dGxlX2RpZ2l0cy0xXSA9PSAwICYmIG51bV9saXR0bGVfZGlnaXRzID4gMSkKKwludW1fbGl0dGxlX2RpZ2l0cy0tOworCQorICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzIDw9IDIpCisJeworCSAgLyogd2lsbCBmaXQgaW50byAzMiBiaXRzLiAqLworCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCk7CisJICBzbWFsbCA9IDE7CisJfQorI2lmZGVmIEJGRDY0CisgICAgICBlbHNlIGlmIChudW1fbGl0dGxlX2RpZ2l0cyA8PSA0KQorCXsKKwkgIC8qIFdpbGwgZml0IGludG8gNjQgYml0cy4gICovCisJICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKTsKKwkgIHNtYWxsID0gMTsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBzbWFsbCA9IDA7CisJICBudW1iZXIgPSBudW1fbGl0dGxlX2RpZ2l0czsgLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgaW4gdGhlIGJpZ251bS4gKi8KKwl9CisgICAgfQorICBlbHNlIGlmICghc21hbGwpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIHdlIHNhdyBhIGxvdCBvZiBkaWdpdHMuIG1hbnVmYWN0dXJlIGEgYmlnbnVtIHRoZSBoYXJkIHdheS4KKyAgICAgICAqLworICAgICAgTElUVExFTlVNX1RZUEUgKmxlYWRlcjsJLyotPmhpZ2ggb3JkZXIgbGl0dGxlbnVtIG9mIHRoZSBiaWdudW0uICovCisgICAgICBMSVRUTEVOVU1fVFlQRSAqcG9pbnRlcjsJLyotPmxpdHRsZW51bSB3ZSBhcmUgZnJvYmJpbmcgbm93LiAqLworICAgICAgbG9uZyBjYXJyeTsKKworICAgICAgbGVhZGVyID0gZ2VuZXJpY19iaWdudW07CisgICAgICBnZW5lcmljX2JpZ251bVswXSA9IDA7CisgICAgICBnZW5lcmljX2JpZ251bVsxXSA9IDA7CisgICAgICBnZW5lcmljX2JpZ251bVsyXSA9IDA7CisgICAgICBnZW5lcmljX2JpZ251bVszXSA9IDA7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsJLyotPjFzdCBkaWdpdC4gKi8KKyAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICBmb3IgKDsKKwkgICAoY2FycnkgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKKwkgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKQorCXsKKwkgIGZvciAocG9pbnRlciA9IGdlbmVyaWNfYmlnbnVtOworCSAgICAgICBwb2ludGVyIDw9IGxlYWRlcjsKKwkgICAgICAgcG9pbnRlcisrKQorCSAgICB7CisJICAgICAgbG9uZyB3b3JrOworCisJICAgICAgd29yayA9IGNhcnJ5ICsgcmFkaXggKiAqcG9pbnRlcjsKKwkgICAgICAqcG9pbnRlciA9IHdvcmsgJiBMSVRUTEVOVU1fTUFTSzsKKwkgICAgICBjYXJyeSA9IHdvcmsgPj4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOworCSAgICB9CisJICBpZiAoY2FycnkpCisJICAgIHsKKwkgICAgICBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCisJCXsKKwkJICAvKiByb29tIHRvIGdyb3cgYSBsb25nZXIgYmlnbnVtLiAqLworCQkgICorK2xlYWRlciA9IGNhcnJ5OworCQl9CisJICAgIH0KKwl9CisgICAgICAvKiBhZ2FpbiwgYyBpcyBjaGFyIGFmdGVyIG51bWJlciwgKi8KKyAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgYy4gKi8KKyAgICAgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7CisgICAgICBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyAyKQorCXsKKwkgIC8qIHdpbGwgZml0IGludG8gMzIgYml0cy4gKi8KKwkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyICgpOworCSAgc21hbGwgPSAxOworCX0KKyNpZmRlZiBCRkQ2NAorICAgICAgZWxzZSBpZiAobGVhZGVyIDwgZ2VuZXJpY19iaWdudW0gKyA0KQorCXsKKwkgIC8qIFdpbGwgZml0IGludG8gNjQgYml0cy4gICovCisJICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKTsKKwkgIHNtYWxsID0gMTsKKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBudW1iZXIgPSBsZWFkZXIgLSBnZW5lcmljX2JpZ251bSArIDE7CS8qIG51bWJlciBvZiBsaXR0bGVudW1zIGluIHRoZSBiaWdudW0uICovCisJfQorICAgIH0KKworICBpZiAoZmxhZ19tNjhrX21yaSAmJiBzdWZmaXggIT0gTlVMTCAmJiBpbnB1dF9saW5lX3BvaW50ZXIgLSAxID09IHN1ZmZpeCkKKyAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOworCisgIGlmIChzbWFsbCkKKyAgICB7CisgICAgICAvKgorICAgICAgICogaGVyZSB3aXRoIG51bWJlciwgaW4gY29ycmVjdCByYWRpeC4gYyBpcyB0aGUgbmV4dCBjaGFyLgorICAgICAgICogbm90ZSB0aGF0IHVubGlrZSB1bip4LCB3ZSBhbGxvdyAiMDExZiIgIjB4OWYiIHRvCisgICAgICAgKiBib3RoIG1lYW4gdGhlIHNhbWUgYXMgdGhlIChjb252ZW50aW9uYWwpICI5ZiIuIHRoaXMgaXMgc2ltcGx5IGVhc2llcgorICAgICAgICogdGhhbiBjaGVja2luZyBmb3Igc3RyaWN0IGNhbm9uaWNhbCBmb3JtLiBzeW50YXggc3V4IQorICAgICAgICovCisKKyAgICAgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnYicpCisJeworCSAgLyoKKwkgICAqIGJhY2t3YXJkIHJlZiB0byBsb2NhbCBsYWJlbC4KKwkgICAqIGJlY2F1c2UgaXQgaXMgYmFja3dhcmQsIGV4cGVjdCBpdCB0byBiZSBkZWZpbmVkLgorCSAgICovCisJICAvKiBDb25zdHJ1Y3QgYSBsb2NhbCBsYWJlbC4gICovCisJICBuYW1lID0gZmJfbGFiZWxfbmFtZSAoKGludCkgbnVtYmVyLCAwKTsKKworCSAgLyogc2VlbiBiZWZvcmUsIG9yIHN5bWJvbCBpcyBkZWZpbmVkOiBvayAqLworCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKTsKKwkgIGlmICgoc3ltYm9sUCAhPSBOVUxMKSAmJiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkpCisJICAgIHsKKwkgICAgICAvKiBsb2NhbCBsYWJlbHMgYXJlIG5ldmVyIGFic29sdXRlLiBkb24ndCB3YXN0ZSB0aW1lCisJCSBjaGVja2luZyBhYnNvbHV0ZW5lc3MuICovCisJICAgICAga25vdyAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkpKTsKKworCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7CisJICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIGVpdGhlciBub3Qgc2VlbiBvciBub3QgZGVmaW5lZC4gKi8KKwkgICAgICAvKiBAQCBTaG91bGQgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBzdHJpbmcgaW5zdGVhZCBvZgorCQkgdGhlIHBhcnNlZCBudW1iZXIuICAqLworCSAgICAgIGFzX2JhZCAoXygiYmFja3cuIHJlZiB0byB1bmtub3duIGxhYmVsIFwiJWQ6XCIsIDAgYXNzdW1lZC4iKSwKKwkJICAgICAgKGludCkgbnVtYmVyKTsKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICAgIH0KKworCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7CisJfQkJCS8qIGNhc2UgJ2InICovCisgICAgICBlbHNlIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgYyA9PSAnZicpCisJeworCSAgLyoKKwkgICAqIGZvcndhcmQgcmVmZXJlbmNlLiBleHBlY3Qgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZCBvcgorCSAgICogdW5rbm93bi4gdW5kZWZpbmVkOiBzZWVuIGl0IGJlZm9yZS4gdW5rbm93bjogbmV2ZXIgc2VlbgorCSAgICogaXQgYmVmb3JlLgorCSAgICogY29uc3RydWN0IGEgbG9jYWwgbGFiZWwgbmFtZSwgdGhlbiBhbiB1bmRlZmluZWQgc3ltYm9sLgorCSAgICogZG9uJ3QgY3JlYXRlIGEgeHNlZyBmcmFnIGZvciBpdDogY2FsbGVyIG1heSBkbyB0aGF0LgorCSAgICoganVzdCByZXR1cm4gaXQgYXMgbmV2ZXIgc2VlbiBiZWZvcmUuCisJICAgKi8KKwkgIG5hbWUgPSBmYl9sYWJlbF9uYW1lICgoaW50KSBudW1iZXIsIDEpOworCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCSAgLyogd2UgaGF2ZSBubyBuZWVkIHRvIGNoZWNrIHN5bWJvbCBwcm9wZXJ0aWVzLiAqLworI2lmbmRlZiBtYW55X3NlZ21lbnRzCisJICAvKiBzaW5jZSAia25vdyIgcHV0cyBpdHMgYXJnIGludG8gYSAic3RyaW5nIiwgd2UKKwkgICAgIGNhbid0IGhhdmUgbmV3bGluZXMgaW4gdGhlIGFyZ3VtZW50LiAgKi8KKwkgIGtub3cgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHRleHRfc2VjdGlvbiB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBkYXRhX3NlY3Rpb24pOworI2VuZGlmCisJICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOworCSAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbFA7CisJICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKKwl9CQkJLyogY2FzZSAnZicgKi8KKyAgICAgIGVsc2UgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIgJiYgYyA9PSAnJCcpCisJeworCSAgLyogSWYgdGhlIGRvbGxhciBsYWJlbCBpcyAqY3VycmVudGx5KiBkZWZpbmVkLCB0aGVuIHRoaXMgaXMganVzdAorCSAgICAgYW5vdGhlciByZWZlcmVuY2UgdG8gaXQuICBJZiBpdCBpcyBub3QgKmN1cnJlbnRseSogZGVmaW5lZCwKKwkgICAgIHRoZW4gdGhpcyBpcyBhIGZyZXNoIGluc3RhbnRpYXRpb24gb2YgdGhhdCBudW1iZXIsIHNvIGNyZWF0ZQorCSAgICAgaXQuICAqLworCisJICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKChsb25nKSBudW1iZXIpKQorCSAgICB7CisJICAgICAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lICgobG9uZykgbnVtYmVyLCAwKTsKKwkgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworCSAgICAgIGtub3cgKHN5bWJvbFAgIT0gTlVMTCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAoKGxvbmcpIG51bWJlciwgMSk7CisJICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCSAgICB9CisKKwkgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7CisJICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKKwkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOworCX0JCQkvKiBjYXNlICckJyAqLworICAgICAgZWxzZQorCXsKKwkgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKKyNpZmRlZiBUQVJHRVRfV09SRF9TSVpFCisJICAvKiBTaWduIGV4dGVuZCBOVU1CRVIuICAqLworCSAgbnVtYmVyIHw9ICgtKG51bWJlciA+PiAoVEFSR0VUX1dPUkRfU0laRSAtIDEpKSkgPDwgKFRBUkdFVF9XT1JEX1NJWkUgLSAxKTsKKyNlbmRpZgorCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKiByZXN0b3JlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICovCisJfQkJCS8qIHJlYWxseSBqdXN0IGEgbnVtYmVyICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogbm90IGEgc21hbGwgbnVtYmVyICovCisgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYmlnOworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IG51bWJlcjsJLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgKi8KKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkvKi0+Y2hhciBmb2xsb3dpbmcgbnVtYmVyLiAqLworICAgIH0KK30KKworLyogUGFyc2UgYW4gTVJJIG11bHRpIGNoYXJhY3RlciBjb25zdGFudC4gICovCisKK3N0YXRpYyB2b2lkCittcmlfY2hhcl9jb25zdGFudCAoZXhwcmVzc2lvblApCisgICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKK3sKKyAgaW50IGk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJworICAgICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCisgICAgeworICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OworICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBieXRlIG9yZGVyaW5nLCB3ZSBtdXN0IGJ1aWxkIHRoZQorICAgICBudW1iZXIgaW4gcmV2ZXJzZS4gICovCisgIGZvciAoaSA9IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgaW50IGo7CisKKyAgICAgIGdlbmVyaWNfYmlnbnVtW2ldID0gMDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBDSEFSU19QRVJfTElUVExFTlVNOyBqKyspCisJeworCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKKwkgICAgeworCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKKwkJYnJlYWs7CisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgIH0KKwkgIGdlbmVyaWNfYmlnbnVtW2ldIDw8PSA4OworCSAgZ2VuZXJpY19iaWdudW1baV0gKz0gKmlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICsraW5wdXRfbGluZV9wb2ludGVyOworCX0KKworICAgICAgaWYgKGkgPCBTSVpFX09GX0xBUkdFX05VTUJFUiAtIDEpCisJeworCSAgLyogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBsaXR0bGVudW0sIGxlZnQganVzdGlmeSB0aGUKKyAgICAgICAgICAgICBsYXN0IG9uZSB0byBtYWtlIGl0IG1hdGNoIHRoZSBlYXJsaWVyIG9uZXMuICBJZiB0aGVyZSBpcworICAgICAgICAgICAgIG9ubHkgb25lLCB3ZSBjYW4ganVzdCB1c2UgdGhlIHZhbHVlIGRpcmVjdGx5LiAgKi8KKwkgIGZvciAoOyBqIDwgQ0hBUlNfUEVSX0xJVFRMRU5VTTsgaisrKQorCSAgICBnZW5lcmljX2JpZ251bVtpXSA8PD0gODsKKwl9CisKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKKwkgICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQorCWJyZWFrOworICAgIH0KKworICBpZiAoaSA8IDApCisgICAgeworICAgICAgYXNfYmFkIChfKCJDaGFyYWN0ZXIgY29uc3RhbnQgdG9vIGxhcmdlIikpOworICAgICAgaSA9IDA7CisgICAgfQorCisgIGlmIChpID4gMCkKKyAgICB7CisgICAgICBpbnQgYzsKKyAgICAgIGludCBqOworCisgICAgICBjID0gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSBpOworICAgICAgZm9yIChqID0gMDsgaiA8IGM7IGorKykKKwlnZW5lcmljX2JpZ251bVtqXSA9IGdlbmVyaWNfYmlnbnVtW2kgKyBqXTsKKyAgICAgIGkgPSBjOworICAgIH0KKworICBrbm93IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgPT0gMTYpOworICBpZiAoaSA+IDIpCisgICAgeworICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpZzsKKyAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKKyAgICAgIGlmIChpIDwgMikKKwlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSzsKKyAgICAgIGVsc2UKKwlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KKwkgICgoKGdlbmVyaWNfYmlnbnVtWzFdICYgTElUVExFTlVNX01BU0spCisJICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKKwkgICB8IChnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLKSk7CisgICAgfQorCisgIC8qIFNraXAgdGhlIGZpbmFsIGNsb3NpbmcgcXVvdGUuICAqLworICArK2lucHV0X2xpbmVfcG9pbnRlcjsKK30KKworLyogUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgVGhpcworICAgaGFuZGxlcyB0aGUgbWFnaWMgc3ltYm9sIGAuJy4gICovCisKK3N0YXRpYyB2b2lkCitjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9ucCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25wOworeworICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHsKKyAgICAgIGV4cHJlc3Npb25wLT5YX29wID0gT19jb25zdGFudDsKKyAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9udW1iZXIgPSBhYnNfc2VjdGlvbl9vZmZzZXQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3ltYm9sUyAqc3ltYm9scDsKKworICAgICAgc3ltYm9scCA9IHN5bWJvbF9uZXcgKEZBS0VfTEFCRUxfTkFNRSwgbm93X3NlZywKKwkJCSAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCisJCQkgICAgZnJhZ19ub3cpOworICAgICAgZXhwcmVzc2lvbnAtPlhfb3AgPSBPX3N5bWJvbDsKKyAgICAgIGV4cHJlc3Npb25wLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xwOworICAgICAgZXhwcmVzc2lvbnAtPlhfYWRkX251bWJlciA9IDA7CisgICAgfQorfQorCisvKgorICogU3VtbWFyeSBvZiBvcGVyYW5kKCkuCisgKgorICogaW46CUlucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZCwgd2hpY2ggbWF5CisgKgliZSBhIHNwYWNlLgorICoKKyAqIG91dDoJQSBleHByZXNzaW9uUy4KKyAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gZW1wdHk6IGluIHRoaXMgY2FzZSBYX29wID09IE9fYWJzZW50LgorICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZC4KKyAqLworCitzdGF0aWMgc2VnVAorb3BlcmFuZCAoZXhwcmVzc2lvblApCisgICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKK3sKKyAgY2hhciBjOworICBzeW1ib2xTICpzeW1ib2xQOwkvKiBwb2ludHMgdG8gc3ltYm9sICovCisgIGNoYXIgKm5hbWU7CQkvKiBwb2ludHMgdG8gbmFtZSBvZiBzeW1ib2wgKi8KKyAgc2VnVCBzZWdtZW50OworCisgIC8qIEFsbCBpbnRlZ2VycyBhcmUgcmVnYXJkZWQgYXMgdW5zaWduZWQgdW5sZXNzIHRoZXkgYXJlIG5lZ2F0ZWQuCisgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSB0aGluZyB3aGljaCBjYXJlcyB3aGV0aGVyIGEgbnVtYmVyIGlzCisgICAgIHVuc2lnbmVkIGlzIHRoZSBjb2RlIGluIGVtaXRfZXhwciB3aGljaCBleHRlbmRzIGNvbnN0YW50cyBpbnRvCisgICAgIGJpZ251bXMuICBJdCBzaG91bGQgb25seSBzaWduIGV4dGVuZCBuZWdhdGl2ZSBudW1iZXJzLCBzbyB0aGF0CisgICAgIHNvbWV0aGluZyBsaWtlIGBgLnF1YWQgMHg4MDAwMDAwMCcnIGlzIG5vdCBzaWduIGV4dGVuZGVkIGV2ZW4KKyAgICAgdGhvdWdoIGl0IGFwcGVhcnMgbmVnYXRpdmUgaWYgdmFsdWVUIGlzIDMyIGJpdHMuICAqLworICBleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDE7CisKKyAgLyogZGlnaXRzLCBhc3N1bWUgaXQgaXMgYSBiaWdudW0uICovCisKKyAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogbGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KKyAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KKworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJzEnOgorICAgIGNhc2UgJzInOgorICAgIGNhc2UgJzMnOgorICAgIGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOgorICAgIGNhc2UgJzYnOgorICAgIGNhc2UgJzcnOgorICAgIGNhc2UgJzgnOgorICAgIGNhc2UgJzknOgorICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07CisKKyAgICAgIGludGVnZXJfY29uc3RhbnQgKGZsYWdfbTY4a19tcmkgPyAwIDogMTAsIGV4cHJlc3Npb25QKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnMCc6CisgICAgICAvKiBub24tZGVjaW1hbCByYWRpeCAqLworCisgICAgICBpZiAoZmxhZ19tNjhrX21yaSkKKwl7CisJICBjaGFyICpzOworCisJICAvKiBDaGVjayBmb3IgYSBoZXggY29uc3RhbnQuICAqLworCSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyBoZXhfcCAoKnMpOyBzKyspCisJICAgIDsKKwkgIGlmICgqcyA9PSAnaCcgfHwgKnMgPT0gJ0gnKQorCSAgICB7CisJICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnbyc6CisJY2FzZSAnTyc6CisJY2FzZSAncSc6CisJY2FzZSAnUSc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJICBpZiAoZmxhZ19tNjhrX21yaSkKKwkgICAgeworCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDAsIGV4cHJlc3Npb25QKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKwlkZWZhdWx0OgorCWRlZmF1bHRfY2FzZToKKwkgIGlmIChjICYmIHN0cmNociAoRkxUX0NIQVJTLCBjKSkKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgICAgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7CisJICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9CisJCS0gKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSA/IHRvbG93ZXIgKGMpIDogYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoZSBzdHJpbmcgd2FzIG9ubHkgemVybyAqLworCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKKwkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKKwkgICAgfQorCisJICBicmVhazsKKworCWNhc2UgJ3gnOgorCWNhc2UgJ1gnOgorCSAgaWYgKGZsYWdfbTY4a19tcmkpCisJICAgIGdvdG8gZGVmYXVsdF9jYXNlOworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOworCSAgYnJlYWs7CisKKwljYXNlICdiJzoKKwkgIGlmIChMT0NBTF9MQUJFTFNfRkIgJiYgISBmbGFnX202OGtfbXJpKQorCSAgICB7CisJICAgICAgLyogVGhpcyBjb2RlIHVzZWQgdG8gY2hlY2sgZm9yICcrJyBhbmQgJy0nIGhlcmUsIGFuZCwgaW4KKwkJIHNvbWUgY29uZGl0aW9ucywgZmFsbCB0aHJvdWdoIHRvIGNhbGwKKwkJIGludGVnZXJfY29uc3RhbnQuICBIb3dldmVyLCB0aGF0IGRpZG4ndCBtYWtlIHNlbnNlLAorCQkgYXMgaW50ZWdlcl9jb25zdGFudCBvbmx5IGFjY2VwdHMgZGlnaXRzLiAgKi8KKwkgICAgICAvKiBTb21lIG9mIG91ciBjb2RlIGVsc2V3aGVyZSBkb2VzIHBlcm1pdCBkaWdpdHMgZ3JlYXRlcgorCQkgdGhhbiB0aGUgZXhwZWN0ZWQgYmFzZTsgZm9yIGNvbnNpc3RlbmN5LCBkbyB0aGUgc2FtZQorCQkgaGVyZS4gICovCisJICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA8ICcwJworCQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA+ICc5JykKKwkJeworCQkgIC8qIFBhcnNlIHRoaXMgYXMgYSBiYWNrIHJlZmVyZW5jZSB0byBsYWJlbCAwLiAgKi8KKwkJICBpbnB1dF9saW5lX3BvaW50ZXItLTsKKwkJICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOworCQkgIGJyZWFrOworCQl9CisJICAgICAgLyogT3RoZXJ3aXNlLCBwYXJzZSB0aGlzIGFzIGEgYmluYXJ5IG51bWJlci4gICovCisJICAgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSAnQic6CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIGlmIChmbGFnX202OGtfbXJpKQorCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKKwkgIGludGVnZXJfY29uc3RhbnQgKDIsIGV4cHJlc3Npb25QKTsKKwkgIGJyZWFrOworCisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJICBpbnRlZ2VyX2NvbnN0YW50IChmbGFnX202OGtfbXJpID8gMCA6IDgsIGV4cHJlc3Npb25QKTsKKwkgIGJyZWFrOworCisJY2FzZSAnZic6CisJICBpZiAoTE9DQUxfTEFCRUxTX0ZCKQorCSAgICB7CisJICAgICAgLyogSWYgaXQgc2F5cyAiMGYiIGFuZCBpdCBjb3VsZCBwb3NzaWJseSBiZSBhIGZsb2F0aW5nIHBvaW50CisJCSBudW1iZXIsIG1ha2UgaXQgb25lLiAgT3RoZXJ3aXNlLCBtYWtlIGl0IGEgbG9jYWwgbGFiZWwsCisJCSBhbmQgdHJ5IHRvIGRlYWwgd2l0aCBwYXJzaW5nIHRoZSByZXN0IGxhdGVyLiAgKi8KKwkgICAgICBpZiAoIWlucHV0X2xpbmVfcG9pbnRlclsxXQorCQkgIHx8IChpc19lbmRfb2ZfbGluZVsweGZmICYgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkpCisJCWdvdG8gaXNfMGZfbGFiZWw7CisJICAgICAgeworCQljaGFyICpjcCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7CisJCWludCByID0gYXRvZl9nZW5lcmljICgmY3AsICIuIiwgRVhQX0NIQVJTLAorCQkJCSAgICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcik7CisJCXN3aXRjaCAocikKKwkJICB7CisJCSAgY2FzZSAwOgorCQkgIGNhc2UgRVJST1JfRVhQT05FTlRfT1ZFUkZMT1c6CisJCSAgICBpZiAoKmNwID09ICdmJyB8fCAqY3AgPT0gJ2InKQorCQkgICAgICAvKiBsb29rcyBsaWtlIGEgZGlmZmVyZW5jZSBleHByZXNzaW9uICovCisJCSAgICAgIGdvdG8gaXNfMGZfbGFiZWw7CisJCSAgICBlbHNlIGlmIChjcCA9PSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKQorCQkgICAgICAvKiBObyBjaGFyYWN0ZXJzIGhhcyBiZWVuIGFjY2VwdGVkIC0tIGxvb2tzIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgb2Ygb3BlcmFuZC4gKi8KKwkJICAgICAgZ290byBpc18wZl9sYWJlbDsKKwkJICAgIGVsc2UKKwkJICAgICAgZ290byBpc18wZl9mbG9hdDsKKwkJICBkZWZhdWx0OgorCQkgICAgYXNfZmF0YWwgKF8oImV4cHIuYyhvcGVyYW5kKTogYmFkIGF0b2ZfZ2VuZXJpYyByZXR1cm4gdmFsICVkIiksCisJCQkgICAgICByKTsKKwkJICB9CisJICAgICAgfQorCisJICAgICAgLyogT2theSwgbm93IHdlJ3ZlIHNvcnRlZCBpdCBvdXQuICBXZSByZXN1bWUgYXQgb25lIG9mIHRoZXNlCisJCSB0d28gbGFiZWxzLCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBkZWNpZGVkIHdlJ3JlIHByb2JhYmx5CisJCSBsb29raW5nIGF0LiAgKi8KKwkgICAgaXNfMGZfbGFiZWw6CisJICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07CisJICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTAsIGV4cHJlc3Npb25QKTsKKwkgICAgICBicmVhazsKKworCSAgICBpc18wZl9mbG9hdDoKKwkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKwkgICAgICA7CisJICAgIH0KKworCWNhc2UgJ2QnOgorCWNhc2UgJ0QnOgorCSAgaWYgKGZsYWdfbTY4a19tcmkpCisJICAgIHsKKwkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSAnRic6CisJY2FzZSAncic6CisJY2FzZSAnZSc6CisJY2FzZSAnRSc6CisJY2FzZSAnZyc6CisJY2FzZSAnRyc6CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7CisJICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KKwkgICAgLSAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gdG9sb3dlciAoYykgOiBjKTsKKwkgIGJyZWFrOworCisJY2FzZSAnJCc6CisJICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUikKKwkgICAgeworCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZ290byBkZWZhdWx0X2Nhc2U7CisJfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgJygnOgorICAgIGNhc2UgJ1snOgorICAgICAgLyogZGlkbid0IGJlZ2luIHdpdGggZGlnaXQgJiBub3QgYSBuYW1lICovCisgICAgICBzZWdtZW50ID0gZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOworICAgICAgLyogRXhwcmVzc2lvbigpIHdpbGwgcGFzcyB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisgICAgICBpZiAoKGMgPT0gJygnICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnKScpCisJICB8fCAoYyA9PSAnWycgJiYgKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICddJykpCisJeworCSAgYXNfYmFkIChfKCJNaXNzaW5nICcpJyBhc3N1bWVkIikpOworCSAgaW5wdXRfbGluZV9wb2ludGVyLS07CisJfQorICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgLyogaGVyZSB3aXRoIGlucHV0X2xpbmVfcG9pbnRlci0+Y2hhciBhZnRlciAiKC4uLikiICovCisgICAgICByZXR1cm4gc2VnbWVudDsKKworICAgIGNhc2UgJ0UnOgorICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCisJZ290byBkZV9mYXVsdDsKKyAgICAgIGFzX2JhZCAoXygiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSAnQSc6CisgICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJykKKwlnb3RvIGRlX2ZhdWx0OworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgJ1wnJzoKKyAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCisJeworCSAgLyogV2FybmluZzogdG8gY29uZm9ybSB0byBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzIE5PCisJICAgICBFU0NBUEVNRU5UIGlzIHBlcm1pdHRlZCBmb3IgYSBzaW5nbGUgcXVvdGUuIFRoZSBuZXh0CisJICAgICBjaGFyYWN0ZXIsIHBhcml0eSBlcnJvcnMgYW5kIGFsbCwgaXMgdGFrZW4gYXMgdGhlIHZhbHVlCisJICAgICBvZiB0aGUgb3BlcmFuZC4gVkVSWSBLSU5LWS4gICovCisJICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgYnJlYWs7CisJfQorCisgICAgICBtcmlfY2hhcl9jb25zdGFudCAoZXhwcmVzc2lvblApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcrJzoKKyAgICAgICh2b2lkKSBvcGVyYW5kIChleHByZXNzaW9uUCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyInOgorICAgICAgLyogRG91YmxlIHF1b3RlIGlzIHRoZSBiaXR3aXNlIG5vdCBvcGVyYXRvciBpbiBNUkkgbW9kZS4gICovCisgICAgICBpZiAoISBmbGFnX202OGtfbXJpKQorCWdvdG8gZGVfZmF1bHQ7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgJ34nOgorICAgICAgLyogfiBpcyBwZXJtaXR0ZWQgdG8gc3RhcnQgYSBsYWJlbCBvbiB0aGUgRGVsdGEuICAqLworICAgICAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQorCWdvdG8gaXNuYW1lOworICAgIGNhc2UgJyEnOgorICAgIGNhc2UgJy0nOgorICAgICAgeworCW9wZXJhbmQgKGV4cHJlc3Npb25QKTsKKwlpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudCkKKwkgIHsKKwkgICAgLyogaW5wdXRfbGluZV9wb2ludGVyIC0+IGNoYXIgYWZ0ZXIgb3BlcmFuZCAqLworCSAgICBpZiAoYyA9PSAnLScpCisJICAgICAgeworCQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gLSBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyOworCQkvKiBOb3RpY2U6ICctJyBtYXkgb3ZlcmZsb3c6IG5vIHdhcm5pbmcgaXMgZ2l2ZW4uIFRoaXMgaXMKKwkJICAgY29tcGF0aWJsZSB3aXRoIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuIFNpZ2guICAqLworCQlleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDA7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChjID09ICd+JyB8fCBjID09ICciJykKKwkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gfiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyOworCSAgICBlbHNlCisJICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9ICEgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKKwkgIH0KKwllbHNlIGlmIChleHByZXNzaW9uUC0+WF9vcCAhPSBPX2lsbGVnYWwKKwkJICYmIGV4cHJlc3Npb25QLT5YX29wICE9IE9fYWJzZW50KQorCSAgeworCSAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApOworCSAgICBpZiAoYyA9PSAnLScpCisJICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3VtaW51czsKKwkgICAgZWxzZSBpZiAoYyA9PSAnficgfHwgYyA9PSAnIicpCisJICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpdF9ub3Q7CisJICAgIGVsc2UKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fbG9naWNhbF9ub3Q7CisJICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOworCSAgfQorCWVsc2UKKwkgIGFzX3dhcm4gKF8oIlVuYXJ5IG9wZXJhdG9yICVjIGlnbm9yZWQgYmVjYXVzZSBiYWQgb3BlcmFuZCBmb2xsb3dzIiksCisJCSAgIGMpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICckJzoKKyAgICAgIC8qICQgaXMgdGhlIHByb2dyYW0gY291bnRlciB3aGVuIGluIE1SSSBtb2RlLCBvciB3aGVuIERPTExBUl9ET1QKKyAgICAgICAgIGlzIGRlZmluZWQuICAqLworI2lmbmRlZiBET0xMQVJfRE9UCisgICAgICBpZiAoISBmbGFnX202OGtfbXJpKQorCWdvdG8gZGVfZmF1bHQ7CisjZW5kaWYKKyAgICAgIGlmIChmbGFnX202OGtfbXJpICYmIGhleF9wICgqaW5wdXRfbGluZV9wb2ludGVyKSkKKwl7CisJICAvKiBJbiBNUkkgbW9kZSwgJCBpcyBhbHNvIHVzZWQgYXMgdGhlIHByZWZpeCBmb3IgYQorICAgICAgICAgICAgIGhleGFkZWNpbWFsIGNvbnN0YW50LiAgKi8KKwkgIGludGVnZXJfY29uc3RhbnQgKDE2LCBleHByZXNzaW9uUCk7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpKQorCWdvdG8gaXNuYW1lOworCisgICAgICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy4nOgorICAgICAgaWYgKCFpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpKQorCXsKKwkgIGN1cnJlbnRfbG9jYXRpb24gKGV4cHJlc3Npb25QKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3RhcnRvZi4iLCA4KSA9PSAwCisJCSYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbOF0pKQorCSAgICAgICB8fCAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNpemVvZi4iLCA3KSA9PSAwCisJCSAgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbN10pKSkKKwl7CisJICBpbnQgc3RhcnQ7CisKKwkgIHN0YXJ0ID0gKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAndCcKKwkJICAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdUJyk7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RhcnQgPyA4IDogNzsKKwkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKKwkgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIikpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciAqYnVmOworCisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgU0tJUF9XSElURVNQQUNFICgpOworCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisJICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKKwkgICAgICBpZiAoc3RhcnQpCisJCXNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgbmFtZSk7CisJICAgICAgZWxzZQorCQlzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgbmFtZSk7CisJICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChidWYpOworCSAgICAgIGZyZWUgKGJ1Zik7CisKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOworCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOworCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOworCisJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJICAgICAgU0tJUF9XSElURVNQQUNFICgpOworCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKKwkJYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIikpOworCSAgICAgIGVsc2UKKwkJKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBnb3RvIGlzbmFtZTsKKwl9CisgICAgY2FzZSAnLCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1wwJzoKKyAgICBlb2w6CisgICAgICAvKiBjYW4ndCBpbWFnaW5lIGFueSBvdGhlciBraW5kIG9mIG9wZXJhbmQgKi8KKyAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19hYnNlbnQ7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJSc6CisgICAgICBpZiAoISBmbGFnX202OGtfbXJpKQorCWdvdG8gZGVfZmF1bHQ7CisgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgyLCBleHByZXNzaW9uUCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0AnOgorICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKKwlnb3RvIGRlX2ZhdWx0OworICAgICAgaW50ZWdlcl9jb25zdGFudCAoOCwgZXhwcmVzc2lvblApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc6JzoKKyAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCisJZ290byBkZV9mYXVsdDsKKworICAgICAgLyogSW4gTVJJIG1vZGUsIHRoaXMgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCByZXByZXNlbnRlZAorICAgICAgICAgdXNpbmcgaGV4YWRlY2ltYWwgZGlnaXRzLiAgKi8KKworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcqJzoKKyAgICAgIGlmICghIGZsYWdfbTY4a19tcmkgfHwgaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKKwlnb3RvIGRlX2ZhdWx0OworCisgICAgICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgZGVfZmF1bHQ6CisgICAgICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGNdKQorCWdvdG8gZW9sOworICAgICAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQkvKiBoZXJlIGlmIGRpZCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0ICovCisJeworCSAgLyoKKwkgICAqIElkZW50aWZpZXIgYmVnaW5zIGhlcmUuCisJICAgKiBUaGlzIGlzIGtsdWRnZWQgZm9yIHNwZWVkLCBzbyBjb2RlIGlzIHJlcGVhdGVkLgorCSAgICovCisJaXNuYW1lOgorCSAgbmFtZSA9IC0taW5wdXRfbGluZV9wb2ludGVyOworCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisjaWZkZWYgbWRfcGFyc2VfbmFtZQorCSAgLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBiYWNrZW5kIHRvIHBhcnNlIGNlcnRhaW4gbmFtZXMKKyAgICAgICAgICAgICBzcGVjaWFsbHkgaW4gY2VydGFpbiBjb250ZXh0cy4gIElmIGEgbmFtZSBhbHdheXMgaGFzIGEKKyAgICAgICAgICAgICBzcGVjaWZpYyB2YWx1ZSwgaXQgY2FuIG9mdGVuIGJlIGhhbmRsZWQgYnkgc2ltcGx5CisgICAgICAgICAgICAgZW50ZXJpbmcgaXQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisJICBpZiAobWRfcGFyc2VfbmFtZSAobmFtZSwgZXhwcmVzc2lvblApKQorCSAgICB7CisJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJICAgICAgYnJlYWs7CisJICAgIH0KKyNlbmRpZgorCisjaWZkZWYgVENfSTk2MAorCSAgLyogVGhlIE1SSSBpOTYwIGFzc2VtYmxlciBwZXJtaXRzCisJICAgICAgICAgbGRhIHNpemVvZiBjb2RlLGcxMworCSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIHVzZSBtZF9wYXJzZV9uYW1lLiAgKi8KKwkgIGlmIChmbGFnX21yaQorCSAgICAgICYmIChzdHJjYXNlY21wIChuYW1lLCAic2l6ZW9mIikgPT0gMAorCQkgIHx8IHN0cmNhc2VjbXAgKG5hbWUsICJzdGFydG9mIikgPT0gMCkpCisJICAgIHsKKwkgICAgICBpbnQgc3RhcnQ7CisJICAgICAgY2hhciAqYnVmOworCisJICAgICAgc3RhcnQgPSAobmFtZVsxXSA9PSAndCcKKwkJICAgICAgIHx8IG5hbWVbMV0gPT0gJ1QnKTsKKworCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworCisJICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKKwkgICAgICBpZiAoc3RhcnQpCisJCXNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgbmFtZSk7CisJICAgICAgZWxzZQorCQlzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgbmFtZSk7CisJICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChidWYpOworCSAgICAgIGZyZWUgKGJ1Zik7CisKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOworCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOworCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOworCisJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJICAgICAgU0tJUF9XSElURVNQQUNFICgpOworCisJICAgICAgYnJlYWs7CisJICAgIH0JICAgICAgCisjZW5kaWYKKworCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworCisJICAvKiBJZiB3ZSBoYXZlIGFuIGFic29sdXRlIHN5bWJvbCBvciBhIHJlZywgdGhlbiB3ZSBrbm93IGl0cworCSAgICAgdmFsdWUgbm93LiAgKi8KKwkgIHNlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKTsKKwkgIGlmIChzZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCisJICAgIHsKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc2VnbWVudCA9PSByZWdfc2VjdGlvbikKKwkgICAgeworCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKKwkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOworCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOworCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOworCSAgICB9CisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTGV0IHRoZSB0YXJnZXQgdHJ5IHRvIHBhcnNlIGl0LiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgY2hhbmdpbmcKKwkgICAgIHRoZSBYX29wIGZpZWxkIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIE9fYWJzZW50IGFuZCBwb2ludGluZworCSAgICAgaW5wdXRfbGluZV9wb2ludGVyIHBhc3NlZCB0aGUgZXhwcmVzc2lvbi4gIElmIGl0IGNhbid0IHBhcnNlIHRoZQorCSAgICAgZXhwcmVzc2lvbiwgWF9vcCBhbmQgaW5wdXRfbGluZV9wb2ludGVyIHNob3VsZCBiZSB1bmNoYW5nZWQuICAqLworCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2Fic2VudDsKKwkgIC0taW5wdXRfbGluZV9wb2ludGVyOworCSAgbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApOworCSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fYWJzZW50KQorCSAgICB7CisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgYXNfYmFkIChfKCJCYWQgZXhwcmVzc2lvbiIpKTsKKwkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyoKKyAgICogSXQgaXMgbW9yZSAnZWZmaWNpZW50JyB0byBjbGVhbiB1cCB0aGUgZXhwcmVzc2lvblMgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgorICAgKiBEb2luZyBpdCBoZXJlIHNhdmVzIGxpbmVzIG9mIGNvZGUuCisgICAqLworICBjbGVhbl91cF9leHByZXNzaW9uIChleHByZXNzaW9uUCk7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qLT4xc3QgY2hhciBhZnRlciBvcGVyYW5kLiAqLworICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7CisKKyAgLyogVGhlIFBBIHBvcnQgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbi4gICovCisgIGlmIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKQorICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wtPnN5X3VzZWQgPSAxOworCisgIHN3aXRjaCAoZXhwcmVzc2lvblAtPlhfb3ApCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYWJzb2x1dGVfc2VjdGlvbjsKKyAgICBjYXNlIE9fc3ltYm9sOgorICAgICAgcmV0dXJuIFNfR0VUX1NFR01FTlQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpOworICAgIGNhc2UgT19yZWdpc3RlcjoKKyAgICAgIHJldHVybiByZWdfc2VjdGlvbjsKKyAgICB9Cit9CQkJCS8qIG9wZXJhbmQoKSAqLworDAorLyogSW50ZXJuYWwuIFNpbXBsaWZ5IGEgc3RydWN0IGV4cHJlc3Npb24gZm9yIHVzZSBieSBleHByKCkgKi8KKworLyoKKyAqIEluOglhZGRyZXNzIG9mIGEgZXhwcmVzc2lvblMuCisgKglUaGUgWF9vcCBmaWVsZCBvZiB0aGUgZXhwcmVzc2lvblMgbWF5IG9ubHkgdGFrZSBjZXJ0YWluIHZhbHVlcy4KKyAqCUVsc2V3aXNlIHdlIHdhc3RlIHRpbWUgc3BlY2lhbC1jYXNlIHRlc3RpbmcuIFNpZ2guIERpdHRvIFNFR19BQlNFTlQuCisgKiBPdXQ6CWV4cHJlc3Npb25TIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQ6CisgKgknZm9vLWZvbycgc3ltYm9sIHJlZmVyZW5jZXMgY2FuY2VsbGVkIHRvIDAsCisgKgkJd2hpY2ggY2hhbmdlcyBYX29wIGZyb20gT19zdWJ0cmFjdCB0byBPX2NvbnN0YW50LgorICoJVW51c2VkIGZpZWxkcyB6ZXJvZWQgdG8gaGVscCBleHByKCkuCisgKi8KKworc3RhdGljIHZvaWQKK2NsZWFuX3VwX2V4cHJlc3Npb24gKGV4cHJlc3Npb25QKQorICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Cit7CisgIHN3aXRjaCAoZXhwcmVzc2lvblAtPlhfb3ApCisgICAgeworICAgIGNhc2UgT19pbGxlZ2FsOgorICAgIGNhc2UgT19hYnNlbnQ6CisgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSBPX2JpZzoKKyAgICBjYXNlIE9fY29uc3RhbnQ6CisgICAgY2FzZSBPX3JlZ2lzdGVyOgorICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgT19zeW1ib2w6CisgICAgY2FzZSBPX3VtaW51czoKKyAgICBjYXNlIE9fYml0X25vdDoKKyAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fc3VidHJhY3Q6CisgICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID09IGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wKKwkgIHx8ICgoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sLT5zeV9mcmFnCisJICAgICAgID09IGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wtPnN5X2ZyYWcpCisJICAgICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkpCisJICAgICAgJiYgKFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpCisJCSAgPT0gU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKSkpCisJeworCSAgYWRkcmVzc1QgZGlmZiA9IChTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkKKwkJCSAgIC0gU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCkpOworCisJICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKKwkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7CisJICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyICs9IGRpZmY7CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KK30KKwwKKy8qIEV4cHJlc3Npb24gcGFyc2VyLiAqLworCisvKgorICogV2UgYWxsb3cgYW4gZW1wdHkgZXhwcmVzc2lvbiwgYW5kIGp1c3QgYXNzdW1lIChhYnNvbHV0ZSwwKSBzaWxlbnRseS4KKyAqIFVuYXJ5IG9wZXJhdG9ycyBhbmQgcGFyZW50aGV0aWNhbCBleHByZXNzaW9ucyBhcmUgdHJlYXRlZCBhcyBvcGVyYW5kcy4KKyAqIEFzIHVzdWFsLCBRPT1xdWFudGl0eT09b3BlcmFuZCwgTz09b3BlcmF0b3IsIFg9PWV4cHJlc3Npb24gbW5lbW9uaWNzLgorICoKKyAqIFdlIHVzZWQgdG8gZG8gYSBhaG8vdWxsbWFuIHNoaWZ0LXJlZHVjZSBwYXJzZXIsIGJ1dCB0aGUgbG9naWMgZ290IHNvCisgKiB3YXJwZWQgdGhhdCBJIGZsdXNoZWQgaXQgYW5kIHdyb3RlIGEgcmVjdXJzaXZlLWRlc2NlbnQgcGFyc2VyIGluc3RlYWQuCisgKiBOb3cgdGhpbmdzIGFyZSBzdGFibGUsIHdvdWxkIGFueWJvZHkgbGlrZSB0byB3cml0ZSBhIGZhc3QgcGFyc2VyPworICogTW9zdCBleHByZXNzaW9ucyBhcmUgZWl0aGVyIHJlZ2lzdGVyICh3aGljaCBkb2VzIG5vdCBldmVuIHJlYWNoIGhlcmUpCisgKiBvciAxIHN5bWJvbC4gVGhlbiAic3ltYm9sK2NvbnN0YW50IiBhbmQgInN5bWJvbC1zeW1ib2wiIGFyZSBjb21tb24uCisgKiBTbyBJIGd1ZXNzIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBob3cgaW5lZmZpY2llbnQgbW9yZSBjb21wbGV4IGV4cHJlc3Npb25zCisgKiBhcmUgcGFyc2VkLgorICoKKyAqIEFmdGVyIGV4cHIoUkFOSyxyZXN1bHRQKSBpbnB1dF9saW5lX3BvaW50ZXItPm9wZXJhdG9yIG9mIHJhbmsgPD0gUkFOSy4KKyAqIEFsc28sIHdlIGhhdmUgY29uc3VtZWQgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIChvcGVyYW5kIGRvZXMgdGhhdCkKKyAqIGFuZCBkb25lIGFsbCBpbnRlcnZlbmluZyBvcGVyYXRvcnMuCisgKgorICogVGhpcyByZXR1cm5zIHRoZSBzZWdtZW50IG9mIHRoZSByZXN1bHQsIHdoaWNoIHdpbGwgYmUKKyAqIGFic29sdXRlX3NlY3Rpb24gb3IgdGhlIHNlZ21lbnQgb2YgYSBzeW1ib2wuCisgKi8KKworI3VuZGVmIF9fCisjZGVmaW5lIF9fIE9faWxsZWdhbAorCitzdGF0aWMgY29uc3Qgb3BlcmF0b3JUIG9wX2VuY29kaW5nWzI1Nl0gPQorewkJCQkvKiBtYXBzIEFTQ0lJLT5vcGVyYXRvcnMgKi8KKworICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKKyAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisKKyAgX18sIE9fYml0X29yX25vdCwgX18sIF9fLCBfXywgT19tb2R1bHVzLCBPX2JpdF9hbmQsIF9fLAorICBfXywgX18sIE9fbXVsdGlwbHksIE9fYWRkLCBfXywgT19zdWJ0cmFjdCwgX18sIE9fZGl2aWRlLAorICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisgIF9fLCBfXywgX18sIF9fLCBPX2x0LCBfXywgT19ndCwgX18sCisgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKKyAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAorICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIE9fYml0X2V4Y2x1c2l2ZV9vciwgX18sCisgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKKyAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAorICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisgIF9fLCBfXywgX18sIF9fLCBPX2JpdF9pbmNsdXNpdmVfb3IsIF9fLCBfXywgX18sCisKKyAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAorICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKKyAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAorICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKKyAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCisgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fCit9OworCisKKy8qCisgKglSYW5rCUV4YW1wbGVzCisgKgkwCW9wZXJhbmQsIChleHByZXNzaW9uKQorICoJMQl8fAorICoJMgkmJgorICoJMwk9IDw+IDwgPD0gPj0gPgorICoJNAkrIC0KKyAqCTUJdXNlZCBmb3IgKiAvICUgaW4gTVJJIG1vZGUKKyAqCTYJJiBeICEgfAorICoJNwkqIC8gJSA8PCA+PgorICoJOAl1bmFyeSAtIHVuYXJ5IH4KKyAqLworc3RhdGljIG9wZXJhdG9yX3JhbmtUIG9wX3JhbmtbXSA9Cit7CisgIDAsCS8qIE9faWxsZWdhbCAqLworICAwLAkvKiBPX2Fic2VudCAqLworICAwLAkvKiBPX2NvbnN0YW50ICovCisgIDAsCS8qIE9fc3ltYm9sICovCisgIDAsCS8qIE9fc3ltYm9sX3J2YSAqLworICAwLAkvKiBPX3JlZ2lzdGVyICovCisgIDAsCS8qIE9fYml0ICovCisgIDgsCS8qIE9fdW1pbnVzICovCisgIDgsCS8qIE9fYml0X25vdCAqLworICA4LAkvKiBPX2xvZ2ljYWxfbm90ICovCisgIDcsCS8qIE9fbXVsdGlwbHkgKi8KKyAgNywJLyogT19kaXZpZGUgKi8KKyAgNywJLyogT19tb2R1bHVzICovCisgIDcsCS8qIE9fbGVmdF9zaGlmdCAqLworICA3LAkvKiBPX3JpZ2h0X3NoaWZ0ICovCisgIDYsCS8qIE9fYml0X2luY2x1c2l2ZV9vciAqLworICA2LAkvKiBPX2JpdF9vcl9ub3QgKi8KKyAgNiwJLyogT19iaXRfZXhjbHVzaXZlX29yICovCisgIDYsCS8qIE9fYml0X2FuZCAqLworICA0LAkvKiBPX2FkZCAqLworICA0LAkvKiBPX3N1YnRyYWN0ICovCisgIDMsCS8qIE9fZXEgKi8KKyAgMywJLyogT19uZSAqLworICAzLAkvKiBPX2x0ICovCisgIDMsCS8qIE9fbGUgKi8KKyAgMywJLyogT19nZSAqLworICAzLAkvKiBPX2d0ICovCisgIDIsCS8qIE9fbG9naWNhbF9hbmQgKi8KKyAgMQkvKiBPX2xvZ2ljYWxfb3IgKi8KK307CisKKy8qIFVuZm9ydHVuYXRlbHksIGluIE1SSSBtb2RlIGZvciB0aGUgbTY4aywgbXVsdGlwbGljYXRpb24gYW5kCisgICBkaXZpc2lvbiBoYXZlIGxvd2VyIHByZWNlZGVuY2UgdGhhbiB0aGUgYml0IHdpc2Ugb3BlcmF0b3JzLiAgVGhpcworICAgZnVuY3Rpb24gc2V0cyB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgY29ycmVjdGx5IGZvciB0aGUgY3VycmVudAorICAgbW9kZS4gIEFsc28sIE1SSSB1c2VzIGEgZGlmZmVyZW50IGJpdF9ub3Qgb3BlcmF0b3IsIGFuZCB0aGlzIGZpeGVzCisgICB0aGF0IGFzIHdlbGwuICAqLworCisjZGVmaW5lIFNUQU5EQVJEX01VTF9QUkVDRURFTkNFICg3KQorI2RlZmluZSBNUklfTVVMX1BSRUNFREVOQ0UgKDUpCisKK3ZvaWQKK2V4cHJfc2V0X3ByZWNlZGVuY2UgKCkKK3sKKyAgaWYgKGZsYWdfbTY4a19tcmkpCisgICAgeworICAgICAgb3BfcmFua1tPX211bHRpcGx5XSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKKyAgICAgIG9wX3JhbmtbT19kaXZpZGVdID0gTVJJX01VTF9QUkVDRURFTkNFOworICAgICAgb3BfcmFua1tPX21vZHVsdXNdID0gTVJJX01VTF9QUkVDRURFTkNFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG9wX3JhbmtbT19tdWx0aXBseV0gPSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRTsKKyAgICAgIG9wX3JhbmtbT19kaXZpZGVdID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7CisgICAgICBvcF9yYW5rW09fbW9kdWx1c10gPSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRTsKKyAgICB9Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGV4cHJlc3Npb24gcGFyc2VyLiAgKi8KKwordm9pZAorZXhwcl9iZWdpbiAoKQoreworICBleHByX3NldF9wcmVjZWRlbmNlICgpOworCisgIC8qIFZlcmlmeSB0aGF0IFhfb3AgZmllbGQgaXMgd2lkZSBlbm91Z2guICAqLworICB7CisgICAgZXhwcmVzc2lvblMgZTsKKyAgICBlLlhfb3AgPSBPX21heDsKKyAgICBhc3NlcnQgKGUuWF9vcCA9PSBPX21heCk7CisgIH0KK30KKwwKKy8qIFJldHVybiB0aGUgZW5jb2RpbmcgZm9yIHRoZSBvcGVyYXRvciBhdCBJTlBVVF9MSU5FX1BPSU5URVIuCisgICBBZHZhbmNlIElOUFVUX0xJTkVfUE9JTlRFUiB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIG9wZXJhdG9yCisgICAoaS5lLiwgZG9uJ3QgY2hhbmdlIGl0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgb3BlcmF0b3IpLiAgKi8KKworc3RhdGljIGlubGluZSBvcGVyYXRvclQKK29wZXJhdG9yICgpCit7CisgIGludCBjOworICBvcGVyYXRvclQgcmV0OworCisgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyICYgMHhmZjsKKworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gb3BfZW5jb2RpbmdbY107CisKKyAgICBjYXNlICc8JzoKKyAgICAgIHN3aXRjaCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKQorCXsKKwlkZWZhdWx0OgorCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOworCWNhc2UgJzwnOgorCSAgcmV0ID0gT19sZWZ0X3NoaWZ0OworCSAgYnJlYWs7CisJY2FzZSAnPic6CisJICByZXQgPSBPX25lOworCSAgYnJlYWs7CisJY2FzZSAnPSc6CisJICByZXQgPSBPX2xlOworCSAgYnJlYWs7CisJfQorICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICByZXR1cm4gcmV0OworCisgICAgY2FzZSAnPSc6CisgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICc9JykKKwlyZXR1cm4gb3BfZW5jb2RpbmdbY107CisKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgcmV0dXJuIE9fZXE7CisKKyAgICBjYXNlICc+JzoKKyAgICAgIHN3aXRjaCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKQorCXsKKwlkZWZhdWx0OgorCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOworCWNhc2UgJz4nOgorCSAgcmV0ID0gT19yaWdodF9zaGlmdDsKKwkgIGJyZWFrOworCWNhc2UgJz0nOgorCSAgcmV0ID0gT19nZTsKKwkgIGJyZWFrOworCX0KKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgcmV0dXJuIHJldDsKKworICAgIGNhc2UgJyEnOgorICAgICAgLyogV2UgYWNjZXB0ICEhIGFzIGVxdWl2YWxlbnQgdG8gXiBmb3IgTVJJIGNvbXBhdGliaWxpdHkuICAqLworICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnIScpCisJeworCSAgaWYgKGZsYWdfbTY4a19tcmkpCisJICAgIHJldHVybiBPX2JpdF9pbmNsdXNpdmVfb3I7CisJICByZXR1cm4gb3BfZW5jb2RpbmdbY107CisJfQorICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICByZXR1cm4gT19iaXRfZXhjbHVzaXZlX29yOworCisgICAgY2FzZSAnfCc6CisgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICd8JykKKwlyZXR1cm4gb3BfZW5jb2RpbmdbY107CisKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgcmV0dXJuIE9fbG9naWNhbF9vcjsKKworICAgIGNhc2UgJyYnOgorICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnJicpCisJcmV0dXJuIG9wX2VuY29kaW5nW2NdOworCisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIHJldHVybiBPX2xvZ2ljYWxfYW5kOworICAgIH0KKworICAvKk5PVFJFQUNIRUQqLworfQorCisvKiBQYXJzZSBhbiBleHByZXNzaW9uLiAgKi8KKworc2VnVAorZXhwciAocmFuaywgcmVzdWx0UCkKKyAgICAgb3BlcmF0b3JfcmFua1QgcmFuazsJLyogTGFyZ2VyICMgaXMgaGlnaGVyIHJhbmsuICovCisgICAgIGV4cHJlc3Npb25TICpyZXN1bHRQOwkvKiBEZWxpdmVyIHJlc3VsdCBoZXJlLiAqLworeworICBzZWdUIHJldHZhbDsKKyAgZXhwcmVzc2lvblMgcmlnaHQ7CisgIG9wZXJhdG9yVCBvcF9sZWZ0OworICBvcGVyYXRvclQgb3BfcmlnaHQ7CisKKyAga25vdyAocmFuayA+PSAwKTsKKworICByZXR2YWwgPSBvcGVyYW5kIChyZXN1bHRQKTsKKworICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7CS8qIE9wZXJhbmQoKSBnb2JibGVzIHNwYWNlcy4gKi8KKworICBvcF9sZWZ0ID0gb3BlcmF0b3IgKCk7CisgIHdoaWxlIChvcF9sZWZ0ICE9IE9faWxsZWdhbCAmJiBvcF9yYW5rWyhpbnQpIG9wX2xlZnRdID4gcmFuaykKKyAgICB7CisgICAgICBzZWdUIHJpZ2h0c2VnOworCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJLyotPmFmdGVyIDFzdCBjaGFyYWN0ZXIgb2Ygb3BlcmF0b3IuICovCisKKyAgICAgIHJpZ2h0c2VnID0gZXhwciAob3BfcmFua1soaW50KSBvcF9sZWZ0XSwgJnJpZ2h0KTsKKyAgICAgIGlmIChyaWdodC5YX29wID09IE9fYWJzZW50KQorCXsKKwkgIGFzX3dhcm4gKF8oIm1pc3Npbmcgb3BlcmFuZDsgemVybyBhc3N1bWVkIikpOworCSAgcmlnaHQuWF9vcCA9IE9fY29uc3RhbnQ7CisJICByaWdodC5YX2FkZF9udW1iZXIgPSAwOworCSAgcmlnaHQuWF9hZGRfc3ltYm9sID0gTlVMTDsKKwkgIHJpZ2h0Llhfb3Bfc3ltYm9sID0gTlVMTDsKKwl9CisKKyAgICAgIGtub3cgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnKTsKKworICAgICAgaWYgKHJldHZhbCA9PSB1bmRlZmluZWRfc2VjdGlvbikKKwl7CisJICBpZiAoU0VHX05PUk1BTCAocmlnaHRzZWcpKQorCSAgICByZXR2YWwgPSByaWdodHNlZzsKKwl9CisgICAgICBlbHNlIGlmICghIFNFR19OT1JNQUwgKHJldHZhbCkpCisJcmV0dmFsID0gcmlnaHRzZWc7CisgICAgICBlbHNlIGlmIChTRUdfTk9STUFMIChyaWdodHNlZykKKwkgICAgICAgJiYgcmV0dmFsICE9IHJpZ2h0c2VnCisjaWZkZWYgRElGRl9FWFBSX09LCisJICAgICAgICYmIG9wX2xlZnQgIT0gT19zdWJ0cmFjdAorI2VuZGlmCisJICAgICAgICkKKwlhc19iYWQgKF8oIm9wZXJhdGlvbiBjb21iaW5lcyBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKKworICAgICAgb3BfcmlnaHQgPSBvcGVyYXRvciAoKTsKKworICAgICAga25vdyAob3BfcmlnaHQgPT0gT19pbGxlZ2FsIHx8IG9wX3JhbmtbKGludCkgb3BfcmlnaHRdIDw9IG9wX3JhbmtbKGludCkgb3BfbGVmdF0pOworICAgICAga25vdyAoKGludCkgb3BfbGVmdCA+PSAoaW50KSBPX211bHRpcGx5CisJICAgICYmIChpbnQpIG9wX2xlZnQgPD0gKGludCkgT19sb2dpY2FsX29yKTsKKworICAgICAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciByaWdodC1oYW5kIHF1YW50aXR5LiAqLworICAgICAgLyogbGVmdC1oYW5kIHF1YW50aXR5IGluIHJlc3VsdFAgKi8KKyAgICAgIC8qIHJpZ2h0LWhhbmQgcXVhbnRpdHkgaW4gcmlnaHQuICovCisgICAgICAvKiBvcGVyYXRvciBpbiBvcF9sZWZ0LiAqLworCisgICAgICBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX2JpZykKKwl7CisJICBpZiAocmVzdWx0UC0+WF9hZGRfbnVtYmVyID4gMCkKKwkgICAgYXNfd2FybiAoXygibGVmdCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKKwkgIGVsc2UKKwkgICAgYXNfd2FybiAoXygibGVmdCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIikpOworCSAgcmVzdWx0UC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSAwOworCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKKwkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKKwl9CisgICAgICBpZiAocmlnaHQuWF9vcCA9PSBPX2JpZykKKwl7CisJICBpZiAocmlnaHQuWF9hZGRfbnVtYmVyID4gMCkKKwkgICAgYXNfd2FybiAoXygicmlnaHQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiKSk7CisJICBlbHNlCisJICAgIGFzX3dhcm4gKF8oInJpZ2h0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiKSk7CisJICByaWdodC5YX29wID0gT19jb25zdGFudDsKKwkgIHJpZ2h0LlhfYWRkX251bWJlciA9IDA7CisJICByaWdodC5YX2FkZF9zeW1ib2wgPSBOVUxMOworCSAgcmlnaHQuWF9vcF9zeW1ib2wgPSBOVUxMOworCX0KKworICAgICAgLyogT3B0aW1pemUgY29tbW9uIGNhc2VzLiAgKi8KKyAgICAgIGlmIChvcF9sZWZ0ID09IE9fYWRkICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKKwl7CisJICAvKiBYICsgY29uc3RhbnQuICAqLworCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKKwl9CisgICAgICAvKiBUaGlzIGNhc2UgY29tZXMgdXAgaW4gUElDIGNvZGUuICAqLworICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0CisJICAgICAgICYmIHJpZ2h0Llhfb3AgPT0gT19zeW1ib2wKKwkgICAgICAgJiYgcmVzdWx0UC0+WF9vcCA9PSBPX3N5bWJvbAorCSAgICAgICAmJiAocmlnaHQuWF9hZGRfc3ltYm9sLT5zeV9mcmFnCisJCSAgID09IHJlc3VsdFAtPlhfYWRkX3N5bWJvbC0+c3lfZnJhZykKKwkgICAgICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocmlnaHQuWF9hZGRfc3ltYm9sKSkpCisKKwl7CisJICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOworCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IChTX0dFVF9WQUxVRSAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKQorCQkJCSAgICAtIFNfR0VUX1ZBTFVFIChyaWdodC5YX2FkZF9zeW1ib2wpKTsKKwkgIHJlc3VsdFAtPlhfb3AgPSBPX2NvbnN0YW50OworCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QgJiYgcmlnaHQuWF9vcCA9PSBPX2NvbnN0YW50KQorCXsKKwkgIC8qIFggLSBjb25zdGFudC4gICovCisJICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOworCX0KKyAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19hZGQgJiYgcmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50KQorCXsKKwkgIC8qIENvbnN0YW50ICsgWC4gICovCisJICByZXN1bHRQLT5YX29wID0gcmlnaHQuWF9vcDsKKwkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IHJpZ2h0LlhfYWRkX3N5bWJvbDsKKwkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gcmlnaHQuWF9vcF9zeW1ib2w7CisJICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOworCSAgcmV0dmFsID0gcmlnaHRzZWc7CisJfQorICAgICAgZWxzZSBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKKwl7CisJICAvKiBDb25zdGFudCBPUCBjb25zdGFudC4gICovCisJICBvZmZzZXRUIHYgPSByaWdodC5YX2FkZF9udW1iZXI7CisJICBpZiAodiA9PSAwICYmIChvcF9sZWZ0ID09IE9fZGl2aWRlIHx8IG9wX2xlZnQgPT0gT19tb2R1bHVzKSkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oImRpdmlzaW9uIGJ5IHplcm8iKSk7CisJICAgICAgdiA9IDE7CisJICAgIH0KKwkgIHN3aXRjaCAob3BfbGVmdCkKKwkgICAgeworCSAgICBkZWZhdWx0OgkJCWFib3J0ICgpOworCSAgICBjYXNlIE9fbXVsdGlwbHk6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgKj0gdjsgYnJlYWs7CisJICAgIGNhc2UgT19kaXZpZGU6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgLz0gdjsgYnJlYWs7CisJICAgIGNhc2UgT19tb2R1bHVzOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICU9IHY7IGJyZWFrOworCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciA8PD0gdjsgYnJlYWs7CisJICAgIGNhc2UgT19yaWdodF9zaGlmdDoKKwkgICAgICAvKiBXZSBhbHdheXMgdXNlIHVuc2lnbmVkIHNoaWZ0cywgdG8gYXZvaWQgcmVseWluZyBvbgorICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSBnYXMuICAqLworCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9CisJCShvZmZzZXRUKSAoKHZhbHVlVCkgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID4+ICh2YWx1ZVQpIHYpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIHw9IHY7IGJyZWFrOworCSAgICBjYXNlIE9fYml0X29yX25vdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciB8PSB+djsgYnJlYWs7CisJICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOglyZXN1bHRQLT5YX2FkZF9udW1iZXIgXj0gdjsgYnJlYWs7CisJICAgIGNhc2UgT19iaXRfYW5kOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICY9IHY7IGJyZWFrOworCSAgICBjYXNlIE9fYWRkOgkJCXJlc3VsdFAtPlhfYWRkX251bWJlciArPSB2OyBicmVhazsKKwkgICAgY2FzZSBPX3N1YnRyYWN0OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHY7IGJyZWFrOworCSAgICBjYXNlIE9fZXE6CisJICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KKwkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID09IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBPX25lOgorCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9CisJCXJlc3VsdFAtPlhfYWRkX251bWJlciAhPSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT19sdDoKKwkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQorCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPCAgdiA/IH4gKG9mZnNldFQpIDAgOiAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE9fbGU6CisJICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KKwkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDw9IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBPX2dlOgorCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9CisJCXJlc3VsdFAtPlhfYWRkX251bWJlciA+PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT19ndDoKKwkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQorCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPiAgdiA/IH4gKG9mZnNldFQpIDAgOiAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6CisJICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0UC0+WF9hZGRfbnVtYmVyICYmIHY7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgT19sb2dpY2FsX29yOgorCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IHJlc3VsdFAtPlhfYWRkX251bWJlciB8fCB2OworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX3N5bWJvbAorCSAgICAgICAmJiByaWdodC5YX29wID09IE9fc3ltYm9sCisJICAgICAgICYmIChvcF9sZWZ0ID09IE9fYWRkCisJCSAgIHx8IG9wX2xlZnQgPT0gT19zdWJ0cmFjdAorCQkgICB8fCAocmVzdWx0UC0+WF9hZGRfbnVtYmVyID09IDAKKwkJICAgICAgICYmIHJpZ2h0LlhfYWRkX251bWJlciA9PSAwKSkpCisJeworCSAgLyogU3ltYm9sIE9QIHN5bWJvbC4gICovCisJICByZXN1bHRQLT5YX29wID0gb3BfbGVmdDsKKwkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gcmlnaHQuWF9hZGRfc3ltYm9sOworCSAgaWYgKG9wX2xlZnQgPT0gT19hZGQpCisJICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7CisJICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QpCisJICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciAtPSByaWdodC5YX2FkZF9udW1iZXI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoZSBnZW5lcmFsIGNhc2UuICAqLworCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAocmVzdWx0UCk7CisJICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyaWdodCk7CisJICByZXN1bHRQLT5YX29wID0gb3BfbGVmdDsKKwkgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IDA7CisJICByZXN1bHRQLT5YX3Vuc2lnbmVkID0gMTsKKwl9CisKKyAgICAgIG9wX2xlZnQgPSBvcF9yaWdodDsKKyAgICB9CQkJCS8qIFdoaWxlIG5leHQgb3BlcmF0b3IgaXMgPj0gdGhpcyByYW5rLiAqLworCisgIC8qIFRoZSBQQSBwb3J0IG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uICAqLworICBpZiAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKQorICAgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbC0+c3lfdXNlZCA9IDE7CisKKyAgcmV0dXJuIHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCA/IGFic29sdXRlX3NlY3Rpb24gOiByZXR2YWw7Cit9CisMCisvKgorICoJCQlnZXRfc3ltYm9sX2VuZCgpCisgKgorICogVGhpcyBsaXZlcyBoZXJlIGJlY2F1c2UgaXQgYmVsb25ncyBlcXVhbGx5IGluIGV4cHIuYyAmIHJlYWQuYy4KKyAqIEV4cHIuYyBpcyBqdXN0IGEgYnJhbmNoIG9mZmljZSByZWFkLmMgYW55d2F5LCBhbmQgcHV0dGluZyBpdAorICogaGVyZSBsZXNzZW5zIHRoZSBjcm93ZCBhdCByZWFkLmMuCisgKgorICogQXNzdW1lIGlucHV0X2xpbmVfcG9pbnRlciBpcyBhdCBzdGFydCBvZiBzeW1ib2wgbmFtZS4KKyAqIEFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHBhc3Qgc3ltYm9sIG5hbWUuCisgKiBUdXJuIHRoYXQgY2hhcmFjdGVyIGludG8gYSAnXDAnLCByZXR1cm5pbmcgaXRzIGZvcm1lciB2YWx1ZS4KKyAqIFRoaXMgYWxsb3dzIGEgc3RyaW5nIGNvbXBhcmUgKFJNUyB3YW50cyBzeW1ib2wgbmFtZXMgdG8gYmUgc3RyaW5ncykKKyAqIG9mIHRoZSBzeW1ib2wgbmFtZS4KKyAqIFRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgY2hhciBmb2xsb3dpbmcgc3ltYm9sIG5hbWUsIGJlY2F1c2UgYWxsIGdvb2QKKyAqIGxpbmVzIGVuZCBpbiBlbmQtb2YtbGluZS4KKyAqLworY2hhcgorZ2V0X3N5bWJvbF9lbmQgKCkKK3sKKyAgY2hhciBjOworCisgIC8qIFdlIGFjY2VwdCBcMDAxIGluIGEgbmFtZSBpbiBjYXNlIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggYQorICAgICBjb25zdHJ1Y3RlZCBzdHJpbmcuICAqLworICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykgfHwgYyA9PSAnXDAwMScpCisgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKKwkgICB8fCBjID09ICdcMDAxJykKKyAgICAgIDsKKyAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKKyAgcmV0dXJuIChjKTsKK30KKworCit1bnNpZ25lZCBpbnQKK2dldF9zaW5nbGVfbnVtYmVyICgpCit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgb3BlcmFuZCAoJmV4cCk7CisgIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOworCit9CisKKy8qIGVuZCBvZiBleHByLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9leHByLmggYi9nYXMvZXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTA3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZXhwci5oCkBAIC0wLDAgKzEsMTYyIEBACisvKiBleHByLmggLT4gaGVhZGVyIGZpbGUgZm9yIGV4cHIuYworICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5Mi05NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIEJ5IHBvcHVsYXIgZGVtYW5kLCB3ZSBkZWZpbmUgYSBzdHJ1Y3QgdG8gcmVwcmVzZW50IGFuIGV4cHJlc3Npb24uCisgKiBUaGlzIHdpbGwgbm8gZG91YnQgbXV0YXRlIGFzIGV4cHJlc3Npb25zIGJlY29tZSBiYXJvcXVlLgorICoKKyAqIEN1cnJlbnRseSwgd2Ugc3VwcG9ydCBleHByZXNzaW9ucyBsaWtlICJmb28gT1AgYmFyICsgNDIiLiAgSW4gb3RoZXIKKyAqIHdvcmRzIHdlIHBlcm1pdCBhIChwb3NzaWJseSB1bmRlZmluZWQpIHN5bWJvbCwgYSAocG9zc2libHkKKyAqIHVuZGVmaW5lZCkgc3ltYm9sIGFuZCB0aGUgb3BlcmF0aW9uIHVzZWQgdG8gY29tYmluZSB0aGUgc3ltYm9scywKKyAqIGFuZCBhbiAoYWJzb2x1dGUpIGF1Z2VuZC4gIFJNUyBzYXlzIHRoaXMgaXMgc28gd2UgY2FuIGhhdmUgMS1wYXNzCisgKiBhc3NlbWJseSBmb3IgYW55IGNvbXBpbGVyIGVtaXNzaW9ucywgYW5kIGEgJ2Nhc2UnIHN0YXRlbWVudCBtaWdodAorICogZW1pdCAndW5kZWZpbmVkMSAtIHVuZGVmaW5lZDInLgorICoKKyAqIFRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24gdXNlZCB0byBiZSBzdG9yZWQgYXMgYSBzZWdtZW50LiAgVGhhdCBnb3QKKyAqIGNvbmZ1c2luZyBiZWNhdXNlIGl0IG92ZXJsb2FkZWQgdGhlIGNvbmNlcHQgb2YgYSBzZWdtZW50LiAgSSBhZGRlZAorICogYW4gb3BlcmF0b3IgZmllbGQsIGluc3RlYWQuCisgKi8KKworLyogVGhpcyBpcyB0aGUgdHlwZSBvZiBhbiBleHByZXNzaW9uLiAgVGhlIG9wZXJhdG9yIHR5cGVzIGFyZSBhbHNvCisgICB1c2VkIHdoaWxlIHBhcnNpbmcgYW4gZXhwcmVzc2lvbi4KKworICAgTk9URTogVGhpcyBlbnVtZXJhdGlvbiBtdXN0IG1hdGNoIHRoZSBvcF9yYW5rIGFycmF5IGluIGV4cHIuYy4gICovCisKK3R5cGVkZWYgZW51bQoreworICAvKiBBbiBpbGxlZ2FsIGV4cHJlc3Npb24uICAqLworICBPX2lsbGVnYWwsCisgIC8qIEEgbm9uZXhpc3RlbnQgZXhwcmVzc2lvbi4gICovCisgIE9fYWJzZW50LAorICAvKiBYX2FkZF9udW1iZXIgKGEgY29uc3RhbnQgZXhwcmVzc2lvbikuICAqLworICBPX2NvbnN0YW50LAorICAvKiBYX2FkZF9zeW1ib2wgKyBYX2FkZF9udW1iZXIuICAqLworICBPX3N5bWJvbCwKKyAgLyogWF9hZGRfc3ltYm9sICsgWF9hZGRfbnVtYmVyIC0gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgaW1hZ2UuICAqLworICBPX3N5bWJvbF9ydmEsCisgIC8qIEEgcmVnaXN0ZXIgKFhfYWRkX251bWJlciBpcyByZWdpc3RlciBudW1iZXIpLiAgKi8KKyAgT19yZWdpc3RlciwKKyAgLyogQSBiaWcgdmFsdWUuICBJZiBYX2FkZF9udW1iZXIgaXMgbmVnYXRpdmUgb3IgMCwgdGhlIHZhbHVlIGlzIGluCisgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLiAgT3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBpbgorICAgICBnZW5lcmljX2JpZ251bSwgYW5kIFhfYWRkX251bWJlciBpcyB0aGUgbnVtYmVyIG9mIExJVFRMRU5VTXMgaW4KKyAgICAgdGhlIHZhbHVlLiAgKi8KKyAgT19iaWcsCisgIC8qICgtIFhfYWRkX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLworICBPX3VtaW51cywKKyAgLyogKH4gWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fYml0X25vdCwKKyAgLyogKCEgWF9hZGRfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fbG9naWNhbF9ub3QsCisgIC8qIChYX2FkZF9zeW1ib2wgKiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLworICBPX211bHRpcGx5LAorICAvKiAoWF9hZGRfc3ltYm9sIC8gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KKyAgT19kaXZpZGUsCisgIC8qIFhfYWRkX3N5bWJvbCAlIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fbW9kdWx1cywKKyAgLyogWF9hZGRfc3ltYm9sIDw8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fbGVmdF9zaGlmdCwKKyAgLyogWF9hZGRfc3ltYm9sID4+IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fcmlnaHRfc2hpZnQsCisgIC8qIFhfYWRkX3N5bWJvbCB8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fYml0X2luY2x1c2l2ZV9vciwKKyAgLyogWF9hZGRfc3ltYm9sIHx+IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fYml0X29yX25vdCwKKyAgLyogWF9hZGRfc3ltYm9sIF4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KKyAgT19iaXRfZXhjbHVzaXZlX29yLAorICAvKiBYX2FkZF9zeW1ib2wgJiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLworICBPX2JpdF9hbmQsCisgIC8qIFhfYWRkX3N5bWJvbCArIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fYWRkLAorICAvKiBYX2FkZF9zeW1ib2wgLSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLworICBPX3N1YnRyYWN0LAorICAvKiAoWF9hZGRfc3ltYm9sID09IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fZXEsCisgIC8qIChYX2FkZF9zeW1ib2wgIT0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KKyAgT19uZSwKKyAgLyogKFhfYWRkX3N5bWJvbCA8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fbHQsCisgIC8qIChYX2FkZF9zeW1ib2wgPD0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KKyAgT19sZSwKKyAgLyogKFhfYWRkX3N5bWJvbCA+PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLworICBPX2dlLAorICAvKiAoWF9hZGRfc3ltYm9sID4gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KKyAgT19ndCwKKyAgLyogKFhfYWRkX3N5bWJvbCAmJiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLworICBPX2xvZ2ljYWxfYW5kLAorICAvKiAoWF9hZGRfc3ltYm9sIHx8IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCisgIE9fbG9naWNhbF9vciwKKyAgLyogdGhpcyBtdXN0IGJlIHRoZSBsYXJnZXN0IHZhbHVlICovCisgIE9fbWF4Cit9IG9wZXJhdG9yVDsKKwordHlwZWRlZiBzdHJ1Y3QgZXhwcmVzc2lvblMKK3sKKyAgLyogVGhlIG1haW4gc3ltYm9sLiAgKi8KKyAgc3RydWN0IHN5bWJvbCAqWF9hZGRfc3ltYm9sOworICAvKiBUaGUgc2Vjb25kIHN5bWJvbCwgaWYgbmVlZGVkLiAgKi8KKyAgc3RydWN0IHN5bWJvbCAqWF9vcF9zeW1ib2w7CisgIC8qIEEgbnVtYmVyIHRvIGFkZC4gICovCisgIG9mZnNldFQgWF9hZGRfbnVtYmVyOworICAvKiBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4gIFdlIGNhbid0IGFzc3VtZSB0aGF0IGFuIGFyYml0cmFyeQorICAgICBjb21waWxlciBjYW4gaGFuZGxlIGEgYml0ZmllbGQgb2YgZW51bSB0eXBlLiAgRklYTUU6IFdlIGNvdWxkCisgICAgIGNoZWNrIHRoaXMgdXNpbmcgYXV0b2NvbmYuICAqLworI2lmZGVmIF9fR05VQ19fCisgIG9wZXJhdG9yVCBYX29wIDogNTsKKyNlbHNlCisgIHVuc2lnbmVkIFhfb3AgOiA1OworI2VuZGlmCisgIC8qIE5vbi16ZXJvIGlmIFhfYWRkX251bWJlciBzaG91bGQgYmUgcmVnYXJkZWQgYXMgdW5zaWduZWQuICBUaGlzIGlzCisgICAgIG9ubHkgdmFsaWQgZm9yIE9fY29uc3RhbnQgZXhwcmVzc2lvbnMuICBJdCBpcyBvbmx5IHVzZWQgd2hlbiBhbgorICAgICBPX2NvbnN0YW50IG11c3QgYmUgZXh0ZW5kZWQgaW50byBhIGJpZ251bSAoaS5lLiwgaXQgaXMgbm90IHVzZWQKKyAgICAgd2hlbiBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24gdGhlc2UgdmFsdWVzKS4KKyAgICAgRklYTUU6IFRoaXMgZmllbGQgaXMgbm90IHNldCB2ZXJ5IHJlbGlhYmx5LiAgKi8KKyAgdW5zaWduZWQgaW50IFhfdW5zaWduZWQgOiAxOworfSBleHByZXNzaW9uUzsKKworLyogInJlc3VsdCIgc2hvdWxkIGJlIHR5cGUgKGV4cHJlc3Npb25TICopLiAqLworI2RlZmluZSBleHByZXNzaW9uKHJlc3VsdCkgZXhwciAoMCwgcmVzdWx0KQorCisvKiBJZiBhbiBleHByZXNzaW9uIGlzIE9fYmlnLCBsb29rIGhlcmUgZm9yIGl0cyB2YWx1ZS4gVGhlc2UgY29tbW9uCisgICBkYXRhIG1heSBiZSBjbG9iYmVyZWQgd2hlbmV2ZXIgZXhwcigpIGlzIGNhbGxlZC4gKi8KKy8qIEZsb251bXMgcmV0dXJuZWQgaGVyZS4gIEJpZyBlbm91Z2ggdG8gaG9sZCBtb3N0IHByZWNpc2UgZmxvbnVtLiAqLworZXh0ZXJuIEZMT05VTV9UWVBFIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOworLyogQmlnbnVtcyByZXR1cm5lZCBoZXJlLiAqLworZXh0ZXJuIExJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW107CisvKiBOdW1iZXIgb2YgbGl0dGxlbnVtcyBpbiBhYm92ZS4gKi8KKyNkZWZpbmUgU0laRV9PRl9MQVJHRV9OVU1CRVIgKDIwKQorCit0eXBlZGVmIGNoYXIgb3BlcmF0b3JfcmFua1Q7CisKK2V4dGVybiBjaGFyIGdldF9zeW1ib2xfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGV4cHJfYmVnaW4gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgZXhwcl9zZXRfcHJlY2VkZW5jZSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gc2VnVCBleHByIFBBUkFNUyAoKGludCByYW5rLCBleHByZXNzaW9uUyAqIHJlc3VsdFApKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X3NpbmdsZV9udW1iZXIgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKm1ha2VfZXhwcl9zeW1ib2wgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOworZXh0ZXJuIGludCBleHByX3N5bWJvbF93aGVyZQorICBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICogZXhwcl9idWlsZF91Y29uc3RhbnQgUEFSQU1TICgob2Zmc2V0VCkpOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKiBleHByX2J1aWxkX3VuYXJ5IFBBUkFNUyAoKG9wZXJhdG9yVCwgc3RydWN0IHN5bWJvbCAqKSk7CitleHRlcm4gc3RydWN0IHN5bWJvbCAqIGV4cHJfYnVpbGRfYmluYXJ5CisgIFBBUkFNUyAoKG9wZXJhdG9yVCwgc3RydWN0IHN5bWJvbCAqLCBzdHJ1Y3Qgc3ltYm9sICopKTsKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICogZXhwcl9idWlsZF9kb3QgUEFSQU1TICgodm9pZCkpOworCisvKiBlbmQgb2YgZXhwci5oICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLWNvcHkuYyBiL2dhcy9mbG9udW0tY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2M1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZmxvbnVtLWNvcHkuYwpAQCAtMCwwICsxLDczIEBACisvKiBmbG9udW1fY29weS5jIC0gY29weSBhIGZsb251bQorICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhcy5oIgorCit2b2lkCitmbG9udW1fY29weSAoaW4sIG91dCkKKyAgICAgRkxPTlVNX1RZUEUgKmluOworICAgICBGTE9OVU1fVFlQRSAqb3V0OworeworICB1bnNpZ25lZCBpbnQgaW5fbGVuZ3RoOwkJLyogMCBvcmlnaW4gKi8KKyAgdW5zaWduZWQgaW50IG91dF9sZW5ndGg7CQkvKiAwIG9yaWdpbiAqLworCisgIG91dC0+c2lnbiA9IGluLT5zaWduOworICBpbl9sZW5ndGggPSBpbi0+bGVhZGVyIC0gaW4tPmxvdzsKKworICBpZiAoaW4tPmxlYWRlciA8IGluLT5sb3cpCisgICAgeworICAgICAgb3V0LT5sZWFkZXIgPSBvdXQtPmxvdyAtIDE7CS8qIDAuMCBjYXNlICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb3V0X2xlbmd0aCA9IG91dC0+aGlnaCAtIG91dC0+bG93OworICAgICAgLyoKKyAgICAgICAqIEFzc3VtZSBubyBHQVBTIGluIHBhY2tpbmcgb2YgbGl0dGxlbnVtcy4KKyAgICAgICAqIEkuZS4gc2l6ZW9mKGFycmF5KSA9PSBzaXplb2YoZWxlbWVudCkgKiBudW1iZXJfb2ZfZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGlmIChpbl9sZW5ndGggPD0gb3V0X2xlbmd0aCkKKwl7CisJICB7CisJICAgIC8qCisJICAgICAqIEZvciBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcsIHplcm8gYW55IGhpZ2gtb3JkZXIgbGl0dGxlbnVtcyB3ZSBkb24ndCBuZWVkLgorCSAgICAgKiBUaGlzIGlzIGRlc3Ryb3lpbmcgZXZpZGVuY2UgYW5kIHdhc3RpbmcgdGltZSwgc28gd2h5IGJvdGhlcj8/PworCSAgICAgKi8KKwkgICAgaWYgKGluX2xlbmd0aCA8IG91dF9sZW5ndGgpCisJICAgICAgeworCQltZW1zZXQgKChjaGFyICopIChvdXQtPmxvdyArIGluX2xlbmd0aCArIDEpLCAnXDAnLCBvdXRfbGVuZ3RoIC0gaW5fbGVuZ3RoKTsKKwkgICAgICB9CisJICB9CisJICBtZW1jcHkgKCh2b2lkICopIChvdXQtPmxvdyksICh2b2lkICopIChpbi0+bG93KSwgKChpbl9sZW5ndGggKyAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSk7CisJICBvdXQtPmV4cG9uZW50ID0gaW4tPmV4cG9uZW50OworCSAgb3V0LT5sZWFkZXIgPSBpbi0+bGVhZGVyIC0gaW4tPmxvdyArIG91dC0+bG93OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgc2hvcnRlbjsJCS8qIDEtb3JpZ2luLiBOdW1iZXIgb2YgbGl0dGxlbnVtcyB3ZSBkcm9wLiAqLworCisJICBzaG9ydGVuID0gaW5fbGVuZ3RoIC0gb3V0X2xlbmd0aDsKKwkgIC8qIEFzc3VtZSBvdXRfbGVuZ3RoID49IDAgISAqLworCSAgbWVtY3B5ICgodm9pZCAqKSAob3V0LT5sb3cpLCAodm9pZCAqKSAoaW4tPmxvdyArIHNob3J0ZW4pLCAoKG91dF9sZW5ndGggKyAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSk7CisJICBvdXQtPmxlYWRlciA9IG91dC0+aGlnaDsKKwkgIG91dC0+ZXhwb25lbnQgPSBpbi0+ZXhwb25lbnQgKyBzaG9ydGVuOworCX0KKyAgICB9CQkJCS8qIGlmIGFueSBzaWduaWZpY2FudCBiaXRzICovCit9CQkJCS8qIGZsb251bV9jb3B5KCkgKi8KKworLyogZW5kIG9mIGZsb251bV9jb3B5LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0ta29uc3QuYyBiL2dhcy9mbG9udW0ta29uc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJiYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2Zsb251bS1rb25zdC5jCkBAIC0wLDAgKzEsMjA5IEBACisvKiBmbG9udW1fY29uc3QuYyAtIFVzZWZ1bCBGbG9udW0gY29uc3RhbnRzCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJmbG9udW0uaCIKKy8qIEpGOiAgSSBhZGRlZCB0aGUgbGFzdCBlbnRyeSB0byB0aGlzIHRhYmxlLCBhbmQgSSdtIG5vdAorICAgc3VyZSBpZiBpdHMgcmlnaHQgb3Igbm90LiAgQ291bGQgZ28gZWl0aGVyIHdheS4gIEkgd2lzaAorICAgSSByZWFsbHkgdW5kZXJzdG9vZCB0aGlzIHN0dWZmLiAqLworCisKK2NvbnN0IGludCB0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuID0gMTM7CisKK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSB6ZXJvW10gPQorezF9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgkJCQkJCQkJCSoKKyAqCVdhcm5pbmc6IHRoZSBsb3cgb3JkZXIgYml0cyBtYXkgYmUgV1JPTkcgaGVyZS4JCQkqCisgKglJIHRvb2sgdGhpcyBmcm9tIGEgc3VzcGVjdCBiYygxKSBzY3JpcHQuCQkJKgorICoJIm1pbnVzX1giW10gaXMgc3VwcG9zZWQgdG8gYmUgMTBeKDJeLVgpIGV4cHJlc3NlZCBpbiBiYXNlIDJeMTYuCSoKKyAqCVRoZSByYWRpeCBwb2ludCBpcyBqdXN0IEFGVEVSIHRoZSBoaWdoZXN0IGVsZW1lbnQgb2YgdGhlIFtdCSoKKyAqCQkJCQkJCQkJKgorICoJQmVjYXVzZSBiYyByb3VuZHMgRE9XTiBmb3IgcHJpbnRpbmcgKEkgdGhpbmspLCB0aGUgbG93ZXN0CSoKKyAqCXNpZ25pZmljYW5jZSBsaXR0bGVudW1zIHNob3VsZCBwcm9iYWJseSBoYXZlIDEgYWRkZWQgdG8gdGhlbS4JKgorICoJCQkJCQkJCQkqCisgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBKRjogIElmIHRoaXMgZXF1YWxzIDY1NTMvKDJeMTYpKzM5MzIxLygyXjMyKSsuLi4gIGl0IGFwcHJvYWNoZXMgLjEgKi8KK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xW10gPQoreworICAzOTMyMiwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwKKyAgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgNjU1M307CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xW10gPQorezEwfTsKKworLyogSkY6ICBJZiB0aGlzIGVxdWFscyA2NTUvKDJeMTYpICsgMjM1OTIvKDJeMzIpICsgLi4uIGl0IGFwcHJvYWNoZXMgLjAxICovCitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMltdID0KK3sKKyAgMTA0ODYsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDQ5ODA3LCAxMDQ4NSwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNDk4MDcsCisgIDEwNDg1LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA0OTgwNywgMTA0ODUsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDY1NX07CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18yW10gPQorezEwMH07CisKKy8qIFRoaXMgYXBwcm9hY2hlcyAuMDAwMSAqLworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzNbXSA9Cit7CisgIDUyNTM0LCAyMDAyNywgMzczMjksIDY1MTE2LCA2NDA2NywgNjAzOTcsIDE0Nzg0LCAxODk3OSwgMzM2NTksIDE5NTAzLAorICAyNzI2LCA5NTQyLCA2MjksIDIyMDIsIDQwNDc1LCAxMDU5MCwgNDI5OSwgNDc4MTUsIDM2MjgwLCA2fTsKK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzNbXSA9Cit7MTAwMDB9OworCisvKiBKRjogdGhpcyBhcHByb2FjaGVzIDFlLTggKi8KK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c180W10gPQoreworICAyMjUxNywgNDk1MDEsIDU0MjkzLCAxOTQyNCwgNjA2OTksIDY3MTYsIDI0MzQ4LCAyMjYxOCwgMjM5MDQsIDIxMzI3LAorICAzOTE5LCA0NDcwMywgMTkxNDksIDI4ODAzLCA0ODk1OSwgNjI1OSwgNTAyNzMsIDYyMjM3LCA0Mn07CisvKiBUaGlzIGVxdWFscyAxNTI1ICogMl4xNiArIDU3NjAwICovCitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c180W10gPQorezU3NjAwLCAxNTI1fTsKKworLyogVGhpcyBhcHByb2FjaGVzIDFlLTE2ICovCitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfNVtdID0KK3sKKyAgMjIxOTksIDQ1OTU3LCAxNzAwNSwgMjYyNjYsIDEwNTI2LCAxNjI2MCwgNTUwMTcsIDM1NjgwLCA0MDQ0MywgMTk3ODksCisgIDE3MzU2LCAzMDE5NSwgNTU5MDUsIDI4NDI2LCA2MzAxMCwgNDQxOTcsIDE4NDR9Oworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfNVtdID0KK3syODYwOSwgMzQ1NDYsIDM1fTsKKworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzZbXSA9Cit7CisgIDMwOTI2LCAyNjUxOCwgMTMxMTAsIDQzMDE4LCA1NDk4MiwgNDgyNTgsIDI0NjU4LCAxNTIwOSwgNjMzNjYsIDExOTI5LAorICAyMDA2OSwgNDM4NTcsIDYwNDg3LCA1MX07CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c182W10gPQorezYxMzEzLCAzNDIyMCwgMTY3MzEsIDExNjI5LCAxMjYyfTsKKworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzdbXSA9Cit7CisgIDI5ODE5LCAxNDczMywgMjE0OTAsIDQwNjAyLCAzMTMxNSwgNjUxODYsIDI2OTV9Oworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfN1tdID0KK3sKKyAgNzkzNywgNDkwMDIsIDYwNzcyLCAyODIxNiwgMzg4OTMsIDU1OTc1LCA2Mzk4OCwgNTk3MTEsIDIwMjI3LCAyNH07CisKK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c184W10gPQoreworICAyNzU3OSwgNjQ4MDcsIDEyNTQzLCA3OTQsIDEzOTA3LCA2MTI5NywgMTIwMTMsIDY0MzYwLCAxNTk2MSwgMjA1NjYsCisgIDI0MTc4LCAxNTkyMiwgNTk0MjcsIDExMH07CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c184W10gPQoreworICAxNTg3MywgMTE5MjUsIDM5MTc3LCA5OTEsIDE0NTg5LCAzODYxLCA1ODQxNSwgOTA3NiwgNjI5NTYsIDU0MjIzLAorICA1NjMyOCwgNTAxODAsIDQ1Mjc0LCA0ODMzMywgMzI1MzcsIDQyNTQ3LCA5NzMxLCA1OTY3OSwgNTkwfTsKKworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzlbXSA9Cit7CisgIDExMDQyLCA4NDY0LCA1ODk3MSwgNjM0MjksIDYwMjIsIDYzNDg1LCA1NTAwLCA1MzQ2NCwgNDc1NDUsIDUwMDY4LAorICA1Njk4OCwgMjI4MTksIDQ5NzA4LCA1NDQ5MywgOTkyMCwgNDc2NjcsIDQwNDA5LCAzNTc2NCwgMTAzODMsIDU0NDY2LAorICAzMjcwMiwgMTc0OTMsIDMyNDIwLCAzNDM4MiwgMjI3NTAsIDIwNjgxLCAxMjMwMH07CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c185W10gPQoreworICAyMDY3OCwgMjc2MTQsIDI4MjcyLCA1MzA2NiwgNTUzMTEsIDU0Njc3LCAyOTAzOCwgOTkwNiwgMjYyODgsIDQ0NDg2LAorICAxMzg2MCwgNzQ0NSwgNTQxMDYsIDE1NDI2LCAyMTUxOCwgMjU1OTksIDI5NjMyLCA1MjMwOSwgNjEyMDcsIDI2MTA1LAorICAxMDQ4MiwgMjE5NDgsIDUxMTkxLCAzMjk4OCwgNjA4OTIsIDYyNTc0LCA2MTM5MCwgMjQ1NDAsIDIxNDk1LCA1fTsKKworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzEwW10gPQoreworICA2MjE0LCA0ODc3MSwgMjM0NzEsIDMwMTYzLCAzMTc2MywgMzgwMTMsIDU3MDAxLCAxMTc3MCwgMTgyNjMsIDM2MzY2LAorICAyMDc0MiwgNDUwODYsIDU2OTY5LCA1MzIzMSwgMzc4NTYsIDU1ODE0LCAzODA1NywgMTU2OTIsIDQ2NzYxLCA4NzEzLAorICA2MTAyLCAyMDA4MywgODI2OSwgMTE4MzksIDExNTcxLCA1MDk2MywgMTU2NDksIDExNjk4LCA0MDY3NSwgMjMwOH07CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xMFtdID0KK3sKKyAgNjM4MzksIDM2NTc2LCA0NTcxMiwgNDQ1MTYsIDM3ODAzLCAyOTQ4MiwgNDk2NiwgMzA1NTYsIDM3OTYxLCAyMzMxMCwKKyAgMjcwNzAsIDQ0OTcyLCAyOTUwNywgNDgyNTcsIDQ1MjA5LCA3NDk0LCAxNzgzMSwgMzg3MjgsIDQxNTc3LCAyOTQ0MywKKyAgMzYwMTYsIDc5NTUsIDM1MzM5LCAzNTQ3OSwgMzYwMTEsIDE0NTUzLCA0OTYxOCwgNTU4OCwgMjUzOTYsIDI4fTsKKworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzExW10gPQoreworICAxNjY2MywgNTY4ODIsIDYxOTgzLCA3ODA0LCAzNjU1NSwgMzIwNjAsIDM0NTAyLCAxMDAwLCAxNDM1NiwgMjE2ODEsCisgIDY2MDUsIDM0NzY3LCA1MTQxMSwgNTkwNDgsIDUzNjE0LCAzOTg1MCwgMzAwNzksIDY0OTYsIDY4NDYsIDI2ODQxLAorICA0MDc3OCwgMTk1NzgsIDU5ODk5LCA0NDA4NSwgNTQwMTYsIDI0MjU5LCAxMTIzMiwgMjEyMjksIDIxMzEzLCA4MX07CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xMVtdID0KK3sKKyAgOTIsIDkwNTQsIDYyNzA3LCAxNzk5MywgNzgyMSwgNTY4MzgsIDEzOTkyLCAyMTMyMSwgMjk2MzcsIDQ4NDI2LAorICA0Mjk4MiwgMzg2NjgsIDQ5NTc0LCAyODgyMCwgMTgyMDAsIDE4OTI3LCA1Mzk3OSwgMTYyMTksIDM3NDg0LCAyNTE2LAorICA0NDY0MiwgMTQ2NjUsIDExNTg3LCA0MTkyNiwgMTM1NTYsIDIzOTU2LCA1NDMyMCwgNjY2MSwgNTU3NjYsIDgwNX07CisKK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xMltdID0KK3sKKyAgMzMyMDIsIDQ1OTY5LCA1ODgwNCwgNTY3MzQsIDE2NDgyLCAyNjAwNywgNDQ5ODQsIDQ5MzM0LCAzMTAwNywgMzI5NDQsCisgIDQ0NTE3LCA2MzMyOSwgNDcxMzEsIDE1MjkxLCA1OTQ2NSwgMjI2NCwgMjMyMTgsIDExODI5LCA1OTc3MSwgMzg3OTgsCisgIDMxMDUxLCAyODc0OCwgMjMxMjksIDQwNTQxLCA0MTU2MiwgMzUxMDgsIDUwNjIwLCA1OTAxNCwgNTE4MTcsIDY2MTN9Oworc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTJbXSA9Cit7CisgIDEwMDk4LCAzNzkyMiwgNTgwNzAsIDc0MzIsIDEwNDcwLCA2MzQ2NSwgMjM3MTgsIDYyMTkwLCA0NzQyMCwgNzAwOSwKKyAgMzg0NDMsIDQ1ODcsIDQ1NTk2LCAzODQ3MiwgNTIxMjksIDUyNzc5LCAyOTAxMiwgMTM1NTksIDQ4Njg4LCAzMTY3OCwKKyAgNDE3NTMsIDU4NjYyLCAxMDY2OCwgMzYwNjcsIDI5OTA2LCA1NjkwNiwgMjE0NjEsIDQ2NTU2LCA1OTU3MSwgOX07CisKK3N0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xM1tdID0KK3sKKyAgNDUzMDksIDI3NTkyLCAzNzE0NCwgMzQ2MzcsIDM0MzI4LCA0MTY3MSwgMzQ2MjAsIDI0MTM1LCA1MzQwMSwgMjIxMTIsCisgIDIxNTc2LCA0NTE0NywgMzkzMTAsIDQ0MDUxLCA0ODU3MiwgMzY3NiwgNDY1NDQsIDU5NzY4LCAzMzM1MCwgMjMyMywKKyAgNDk1MjQsIDYxNTY4LCAzOTAzLCAzNjQ4NywgMzYzNTYsIDMwOTAzLCAxNDk3NSwgOTAzNSwgMjk3MTUsIDY2N307CitzdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18xM1tdID0KK3sKKyAgMTg3ODgsIDE2OTYwLCA2MzE4LCA0NTY4NSwgNTU0MDAsIDQ2MjMwLCAzNTc5NCwgMjU1ODgsIDcyNTMsIDU1NTQxLAorICA0OTcxNiwgNTk3NjAsIDYzNTkyLCA4MTkxLCA2Mzc2NSwgNTg1MzAsIDQ0NjY3LCAxMzI5NCwgMTAwMDEsIDU1NTg2LAorICA0Nzg4NywgMTg3MzgsIDk1MDksIDQwODk2LCA0MjUwNiwgNTI1ODAsIDQxNzEsIDMyNSwgMTIzMjksIDk4fTsKKworLyogU2h1dCB1cCBjb21wbGFpbnRzIGFib3V0IGRpZmZlcmluZyBwb2ludGVyIHR5cGVzLiAgVGhleSBvbmx5IGRpZmZlcgorICAgaW4gdGhlIGNvbnN0IGF0dHJpYnV0ZSwgYnV0IHRoZXJlIGlzbid0IGFueSBlYXN5IHdheSB0byBkbyB0aGlzCisgICAqLworI2RlZmluZSBYIChMSVRUTEVOVU1fVFlQRSAqKQorCitjb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fbmVnYXRpdmVfcG93ZXJzX29mX3RlbltdID0KK3sKKyAge1ggemVybywgWCB6ZXJvLCBYIHplcm8sIDAsICcrJ30sCisgIHtYIG1pbnVzXzEsIFggbWludXNfMSArIDE5LCBYIG1pbnVzXzEgKyAxOSwgLTIwLCAnKyd9LAorICB7WCBtaW51c18yLCBYIG1pbnVzXzIgKyAxOSwgWCBtaW51c18yICsgMTksIC0yMCwgJysnfSwKKyAge1ggbWludXNfMywgWCBtaW51c18zICsgMTksIFggbWludXNfMyArIDE5LCAtMjAsICcrJ30sCisgIHtYIG1pbnVzXzQsIFggbWludXNfNCArIDE4LCBYIG1pbnVzXzQgKyAxOCwgLTIwLCAnKyd9LAorICB7WCBtaW51c181LCBYIG1pbnVzXzUgKyAxNiwgWCBtaW51c181ICsgMTYsIC0yMCwgJysnfSwKKyAge1ggbWludXNfNiwgWCBtaW51c182ICsgMTMsIFggbWludXNfNiArIDEzLCAtMjAsICcrJ30sCisgIHtYIG1pbnVzXzcsIFggbWludXNfNyArIDYsIFggbWludXNfNyArIDYsIC0yMCwgJysnfSwKKyAge1ggbWludXNfOCwgWCBtaW51c184ICsgMTMsIFggbWludXNfOCArIDEzLCAtNDAsICcrJ30sCisgIHtYIG1pbnVzXzksIFggbWludXNfOSArIDI2LCBYIG1pbnVzXzkgKyAyNiwgLTgwLCAnKyd9LAorICB7WCBtaW51c18xMCwgWCBtaW51c18xMCArIDI5LCBYIG1pbnVzXzEwICsgMjksIC0xMzYsICcrJ30sCisgIHtYIG1pbnVzXzExLCBYIG1pbnVzXzExICsgMjksIFggbWludXNfMTEgKyAyOSwgLTI0MiwgJysnfSwKKyAge1ggbWludXNfMTIsIFggbWludXNfMTIgKyAyOSwgWCBtaW51c18xMiArIDI5LCAtNDU1LCAnKyd9LAorICB7WCBtaW51c18xMywgWCBtaW51c18xMyArIDI5LCBYIG1pbnVzXzEzICsgMjksIC04ODAsICcrJ30sCit9OworCitjb25zdCBGTE9OVU1fVFlQRSBmbG9udW1fcG9zaXRpdmVfcG93ZXJzX29mX3RlbltdID0KK3sKKyAge1ggemVybywgWCB6ZXJvLCBYIHplcm8sIDAsICcrJ30sCisgIHtYIHBsdXNfMSwgWCBwbHVzXzEgKyAwLCBYIHBsdXNfMSArIDAsIDAsICcrJ30sCisgIHtYIHBsdXNfMiwgWCBwbHVzXzIgKyAwLCBYIHBsdXNfMiArIDAsIDAsICcrJ30sCisgIHtYIHBsdXNfMywgWCBwbHVzXzMgKyAwLCBYIHBsdXNfMyArIDAsIDAsICcrJ30sCisgIHtYIHBsdXNfNCwgWCBwbHVzXzQgKyAxLCBYIHBsdXNfNCArIDEsIDAsICcrJ30sCisgIHtYIHBsdXNfNSwgWCBwbHVzXzUgKyAyLCBYIHBsdXNfNSArIDIsIDEsICcrJ30sCisgIHtYIHBsdXNfNiwgWCBwbHVzXzYgKyA0LCBYIHBsdXNfNiArIDQsIDIsICcrJ30sCisgIHtYIHBsdXNfNywgWCBwbHVzXzcgKyA5LCBYIHBsdXNfNyArIDksIDQsICcrJ30sCisgIHtYIHBsdXNfOCwgWCBwbHVzXzggKyAxOCwgWCBwbHVzXzggKyAxOCwgOCwgJysnfSwKKyAge1ggcGx1c185LCBYIHBsdXNfOSArIDI5LCBYIHBsdXNfOSArIDI5LCAyNCwgJysnfSwKKyAge1ggcGx1c18xMCwgWCBwbHVzXzEwICsgMjksIFggcGx1c18xMCArIDI5LCA3NywgJysnfSwKKyAge1ggcGx1c18xMSwgWCBwbHVzXzExICsgMjksIFggcGx1c18xMSArIDI5LCAxODMsICcrJ30sCisgIHtYIHBsdXNfMTIsIFggcGx1c18xMiArIDI5LCBYIHBsdXNfMTIgKyAyOSwgMzk2LCAnKyd9LAorICB7WCBwbHVzXzEzLCBYIHBsdXNfMTMgKyAyOSwgWCBwbHVzXzEzICsgMjksIDgyMSwgJysnfSwKK307CisKKyNpZmRlZiBWTVMKK3ZvaWQgZHVtbXkxICgpIHsgfQorI2VuZGlmCisvKiBlbmQgb2YgZmxvbnVtX2NvbnN0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0tbXVsdC5jIGIvZ2FzL2Zsb251bS1tdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0YTczYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9mbG9udW0tbXVsdC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKiBmbG9udW1fbXVsdC5jIC0gbXVsdGlwbHkgdHdvIGZsb251bXMKKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgorICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKKyAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKKyAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCisgICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgorCisgICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKKyAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCisgICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCisgICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKKyAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQorICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKKyAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI2luY2x1ZGUgImZsb251bS5oIgorCisvKglwbGFuIGZvciBhIC4gYiA9PiBwKHJvZHVjdCkKKwkKKwkKKwkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKworCXwgYQl8IGEJfCAgLi4uCXwgYQl8IGEJfAorCXwgIEEJfCAgQS0xCXwJfCAgMQl8ICAwCXwKKwkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKworCQorCQorCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCisJfCBiCXwgYgl8ICAuLi4JfCBiCXwgYgl8CisJfCAgQgl8ICBCLTEJfAl8ICAxCXwgIDAJfAorCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCisJCisJCisJKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCisJfCBwCXwgcAl8ICAuLi4JfCBwCXwgIC4uLgl8IHAJfCBwCXwKKwl8ICBBK0IrMXwgIEErQgl8CXwgIE4JfAl8ICAxCXwgIDAJfAorCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLS0tLS0tKworCQorCS9eXAorCShjYXJyeSkgYSAuYgkgICAuLi4JICAgIHwJICAgLi4uCSBhIC5iCSBhIC5iCisJQSAgQiAJCSAgICB8CQkgIDAgIDEJICAwICAwCisJfAorCS4uLgkgICAgfAkgICAuLi4JIGEgLmIKKwl8CQkgIDEgIDAKKwl8CisJfAkgICAuLi4KKwl8CisJfAorCXwKKwl8CQkgIF9fXworCXwJCSAgXAorCSstLS0tLSAgUCAgPSAgID4gIGEgLmIKKwlOCSAgL19fICBpICBqCisJCisJTiA9IDAgLi4uIEErQgorCQorCWZvciBhbGwgaSxqIHdoZXJlIGkraj1OCisJW2ksaiBpbnRlZ2VycyA+IDBdCisJCisJYVtdLCBiW10sIHBbXSBtYXkgbm90IGludGVyc2VjdC4KKwlaZXJvIGxlbmd0aCBmYWN0b3JzIHNpZ25pZnkgMCBzaWduaWZpY2FudCBiaXRzOiB0cmVhdCBhcyAwLjAuCisJMC4wIGZhY3RvcnMgZG8gdGhlIHJpZ2h0IHRoaW5nLgorCVplcm8gbGVuZ3RoIHByb2R1Y3QgT0suCisJCisJSSBjaG9zZSB0aGUgRm9yVHJhbiBhY2NlbnQgImZvb1tiYXJdIiBpbnN0ZWFkIG9mIHRoZSBDIGFjY2VudCAiKmdhcnBseSIKKwliZWNhdXNlIEkgZmVsdCB0aGUgRm9yVHJhbiB3YXkgd2FzIG1vcmUgaW50dWl0aXZlLiBUaGUgQyB3YXkgd291bGQKKwlwcm9iYWJseSB5aWVsZCBiZXR0ZXIgY29kZSBvbiBtb3N0IEMgY29tcGlsZXJzLiBEZWFuIEVsc25lci4KKwkoQyBzdHlsZSBhbHNvIGdpdmVzIGRlZXBlciBpbnNpZ2h0IFt0byBtZV0gLi4uIG9oIHdlbGwgLi4uKQorCSovCisMCit2b2lkIAorZmxvbnVtX211bHRpcCAoYSwgYiwgcHJvZHVjdCkKKyAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmE7CisgICAgIGNvbnN0IEZMT05VTV9UWVBFICpiOworICAgICBGTE9OVU1fVFlQRSAqcHJvZHVjdDsKK3sKKyAgaW50IHNpemVfb2ZfYTsJCS8qIDAgb3JpZ2luICovCisgIGludCBzaXplX29mX2I7CQkvKiAwIG9yaWdpbiAqLworICBpbnQgc2l6ZV9vZl9wcm9kdWN0OwkJLyogMCBvcmlnaW4gKi8KKyAgaW50IHNpemVfb2Zfc3VtOwkJLyogMCBvcmlnaW4gKi8KKyAgaW50IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiAxIG9yaWdpbiAqLworICB1bnNpZ25lZCBsb25nIHdvcms7CisgIHVuc2lnbmVkIGxvbmcgY2Fycnk7CisgIGxvbmcgZXhwb25lbnQ7CisgIExJVFRMRU5VTV9UWVBFICpxOworICBsb25nIHNpZ25pZmljYW50OwkJLyogVFJVRSB3aGVuIHdlIGVtaXQgYSBub24tMCBsaXR0bGVudW0gICovCisgIC8qIEZvclRyYW4gYWNjZW50IGZvbGxvd3MuICovCisgIGludCBQOwkJCS8qIFNjYW4gcHJvZHVjdCBsb3ctb3JkZXIgLT4gaGlnaC4gKi8KKyAgaW50IE47CQkJLyogQXMgaW4gc3VtIGFib3ZlLiAgKi8KKyAgaW50IEE7CQkJLyogV2hpY2ggW10gb2YgYT8gKi8KKyAgaW50IEI7CQkJLyogV2hpY2ggW10gb2YgYj8gKi8KKworICBpZiAoKGEtPnNpZ24gIT0gJy0nICYmIGEtPnNpZ24gIT0gJysnKSB8fCAoYi0+c2lnbiAhPSAnLScgJiYgYi0+c2lnbiAhPSAnKycpKQorICAgIHsKKyAgICAgIC8qIC4uLgorCQkgICBHb3QgdG8gZmFpbCBzb21laG93LiAgQW55IHN1Z2dlc3Rpb25zPyAqLworICAgICAgcHJvZHVjdC0+c2lnbiA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICBwcm9kdWN0LT5zaWduID0gKGEtPnNpZ24gPT0gYi0+c2lnbikgPyAnKycgOiAnLSc7CisgIHNpemVfb2ZfYSA9IGEtPmxlYWRlciAtIGEtPmxvdzsKKyAgc2l6ZV9vZl9iID0gYi0+bGVhZGVyIC0gYi0+bG93OworICBleHBvbmVudCA9IGEtPmV4cG9uZW50ICsgYi0+ZXhwb25lbnQ7CisgIHNpemVfb2ZfcHJvZHVjdCA9IHByb2R1Y3QtPmhpZ2ggLSBwcm9kdWN0LT5sb3c7CisgIHNpemVfb2Zfc3VtID0gc2l6ZV9vZl9hICsgc2l6ZV9vZl9iOworICBleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA9IHNpemVfb2ZfcHJvZHVjdCAtIHNpemVfb2Zfc3VtOworICBpZiAoZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPCAwKQorICAgIHsKKyAgICAgIFAgPSBleHRyYV9wcm9kdWN0X3Bvc2l0aW9uczsJLyogUCA8IDAgKi8KKyAgICAgIGV4cG9uZW50IC09IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiBJbmNyZWFzZXMgZXhwb25lbnQuICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUCA9IDA7CisgICAgfQorICBjYXJyeSA9IDA7CisgIHNpZ25pZmljYW50ID0gMDsKKyAgZm9yIChOID0gMDsgTiA8PSBzaXplX29mX3N1bTsgTisrKQorICAgIHsKKyAgICAgIHdvcmsgPSBjYXJyeTsKKyAgICAgIGNhcnJ5ID0gMDsKKyAgICAgIGZvciAoQSA9IDA7IEEgPD0gTjsgQSsrKQorCXsKKwkgIEIgPSBOIC0gQTsKKwkgIGlmIChBIDw9IHNpemVfb2ZfYSAmJiBCIDw9IHNpemVfb2ZfYiAmJiBCID49IDApCisJICAgIHsKKyNpZmRlZiBUUkFDRQorCSAgICAgIHByaW50ZiAoImE6bG93WyVkLl09JTA0eCBiOmxvd1slZC5dPSUwNHggd29ya19iZWZvcmU9JTA4eFxuIiwgQSwgYS0+bG93W0FdLCBCLCBiLT5sb3dbQl0sIHdvcmspOworI2VuZGlmCisJICAgICAgLyogV2F0Y2ggb3V0IGZvciBzaWduIGV4dGVuc2lvbiEgIFdpdGhvdXQgdGhlIGNhc3RzLCBvbgorCQkgdGhlIERFQyBBbHBoYSwgdGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpcyAqc2lnbmVkKgorCQkgaW50LCB3aGljaCBnZXRzIHNpZ24tZXh0ZW5kZWQgdG8gY29udmVydCB0byB0aGUKKwkJIHVuc2lnbmVkIGxvbmchICAqLworCSAgICAgIHdvcmsgKz0gKHVuc2lnbmVkIGxvbmcpIGEtPmxvd1tBXSAqICh1bnNpZ25lZCBsb25nKSBiLT5sb3dbQl07CisJICAgICAgY2FycnkgKz0gd29yayA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7CisJICAgICAgd29yayAmPSBMSVRUTEVOVU1fTUFTSzsKKyNpZmRlZiBUUkFDRQorCSAgICAgIHByaW50ZiAoIndvcms9JTA4eCBjYXJyeT0lMDR4XG4iLCB3b3JrLCBjYXJyeSk7CisjZW5kaWYKKwkgICAgfQorCX0KKyAgICAgIHNpZ25pZmljYW50IHw9IHdvcms7CisgICAgICBpZiAoc2lnbmlmaWNhbnQgfHwgUCA8IDApCisJeworCSAgaWYgKFAgPj0gMCkKKwkgICAgeworCSAgICAgIHByb2R1Y3QtPmxvd1tQXSA9IHdvcms7CisjaWZkZWYgVFJBQ0UKKwkgICAgICBwcmludGYgKCJQPSVkLiB3b3JrW3BdOj0lMDR4XG4iLCBQLCB3b3JrKTsKKyNlbmRpZgorCSAgICB9CisJICBQKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zKys7CisJICBleHBvbmVudCsrOworCX0KKyAgICB9CisgIC8qCisgICAqIFtQXS0+IHBvc2l0aW9uICMgc2l6ZV9vZl9zdW0gKyAxLgorICAgKiBUaGlzIGlzIHdoZXJlICdjYXJyeScgc2hvdWxkIGdvLgorICAgKi8KKyNpZmRlZiBUUkFDRQorICBwcmludGYgKCJmaW5hbCBjYXJyeSA9JTA0eFxuIiwgY2FycnkpOworI2VuZGlmCisgIGlmIChjYXJyeSkKKyAgICB7CisgICAgICBpZiAoZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMgPiAwKQorCXsKKwkgIHByb2R1Y3QtPmxvd1tQXSA9IGNhcnJ5OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBObyByb29tIGF0IGhpZ2ggb3JkZXIgZm9yIGNhcnJ5IGxpdHRsZW51bS4gKi8KKwkgIC8qIFNoaWZ0IHJpZ2h0IDEgdG8gbWFrZSByb29tIGZvciBtb3N0IHNpZ25pZmljYW50IGxpdHRsZW51bS4gKi8KKwkgIGV4cG9uZW50Kys7CisJICBQLS07CisJICBmb3IgKHEgPSBwcm9kdWN0LT5sb3cgKyBQOyBxID49IHByb2R1Y3QtPmxvdzsgcS0tKQorCSAgICB7CisJICAgICAgd29yayA9ICpxOworCSAgICAgICpxID0gY2Fycnk7CisJICAgICAgY2FycnkgPSB3b3JrOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFAtLTsKKyAgICB9CisgIHByb2R1Y3QtPmxlYWRlciA9IHByb2R1Y3QtPmxvdyArIFA7CisgIHByb2R1Y3QtPmV4cG9uZW50ID0gZXhwb25lbnQ7Cit9CisKKy8qIGVuZCBvZiBmbG9udW1fbXVsdC5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLmggYi9nYXMvZmxvbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4NGY0OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9mbG9udW0uaApAQCAtMCwwICsxLDExMCBAQAorLyogZmxvbnVtLmggLSBGbG9hdGluZyBwb2ludCBwYWNrYWdlCisKKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgkJCQkJCQkJCSoKKyAqCUFyYml0cmFyeS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4JCQkqCisgKgkJCQkJCQkJCSoKKyAqCQkJCQkJCQkJKgorICoJTm90YXRpb246IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGlzIGV4cHJlc3NlZCBhcwkJKgorICoJTUFOVElTU0EgKiAoMiAqKiBFWFBPTkVOVCkuCQkJCQkqCisgKgkJCQkJCQkJCSoKKyAqCUlmIHRoaXMgb2ZmZW5kcyBtb3JlIHRyYWRpdGlvbmFsIG1hdGhlbWF0aWNpYW5zLCB0aGVuCQkqCisgKglwbGVhc2UgdGVsbCBtZSB5b3VyIG5vbWVuY2xhdHVyZSBmb3IgZmxvbnVtcyEJCQkqCisgKgkJCQkJCQkJCSoKKyBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaWdudW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoJCQkJCQkJCQkqCisgKglWYXJpYWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4JCQkqCisgKgkJCQkJCQkJCSoKKyAqCUV4cG9uZW50IGlzIHRoZSBwbGFjZSB2YWx1ZSBvZiB0aGUgbG93IGxpdHRsZW51bS4gRS5nLjoJCSoKKyAqCUlmICAwOiAgbG93IHBvaW50cyB0byB0aGUgdW5pdHMgICAgICAgICAgICAgbGl0dGxlbnVtLgkJKgorICoJSWYgIDE6ICBsb3cgcG9pbnRzIHRvIHRoZSBMSVRUTEVOVU1fUkFESVggICBsaXR0bGVudW0uCQkqCisgKglJZiAtMTogIGxvdyBwb2ludHMgdG8gdGhlIDEvTElUVExFTlVNX1JBRElYIGxpdHRsZW51bS4JCSoKKyAqCQkJCQkJCQkJKgorIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSkY6ICBBIHNpZ24gdmFsdWUgb2YgMCBtZWFucyB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgTmFOCisgICBBIHNpZ24gdmFsdWUgb2YgJ1AnIG1lYW5zIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgK0luZgorICAgQSBzaWduIHZhbHVlIG9mICdOJyBtZWFucyB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIC1JbmYKKyAgICovCitzdHJ1Y3QgRkxPTlVNX1NUUlVDVAoreworICBMSVRUTEVOVU1fVFlQRSAqbG93OwkJLyogbG93IG9yZGVyIGxpdHRsZW51bSBvZiBhIGJpZ251bSAqLworICBMSVRUTEVOVU1fVFlQRSAqaGlnaDsJCS8qIGhpZ2ggb3JkZXIgbGl0dGxlbnVtIG9mIGEgYmlnbnVtICovCisgIExJVFRMRU5VTV9UWVBFICpsZWFkZXI7CS8qIC0+IDFzdCBub24temVybyBsaXR0bGVudW0gKi8KKyAgLyogSWYgZmxvbnVtIGlzIDAuMCwgbGVhZGVyPT1sb3ctMSAqLworICBsb25nIGV4cG9uZW50OwkJLyogYmFzZSBMSVRUTEVOVU1fUkFESVggKi8KKyAgY2hhciBzaWduOwkJCS8qICcrJyBvciAnLScgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IEZMT05VTV9TVFJVQ1QgRkxPTlVNX1RZUEU7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoJCQkJCQkJCQkqCisgKglTaW5jZSB3ZSBjYW4gKCYgZG8pIG1lZXQgd2l0aCBleHBvbmVudHMgbGlrZSAxMF41MDAwLCBpdAkqCisgKglpcyBzaWxseSB0byBtYWtlIGEgdGFibGUgb2YgfiAxMCwwMDAgZW50cmllcywgb25lIGZvciBlYWNoCSoKKyAqCXBvd2VyIG9mIDEwLiBXZSBrZWVwIGEgdGFibGUgd2hlcmUgaXRlbSBbbl0gaXMgYSBzdHJ1Y3QJCSoKKyAqCUZMT05VTV9GTE9BVElOR19QT0lOVCByZXByZXNlbnRpbmcgMTBeKDJebikuIFdlIHRoZW4JCSoKKyAqCW11bHRpcGx5IGFwcHJvcHJpYXRlIGVudHJpZXMgZnJvbSB0aGlzIHRhYmxlIHRvIGdldCBhbnkJCSoKKyAqCXBhcnRpY3VsYXIgcG93ZXIgb2YgMTAuIEZvciB0aGUgZXhhbXBsZSBvZiAxMF41MDAwLCBhIHRhYmxlCSoKKyAqCW9mIGp1c3QgMjUgZW50cmllcyBzdWZmaWNlczogMTBeKDJeLTEyKS4uLjEwXigyXisxMikuCQkqCisgKgkJCQkJCQkJCSoKKyBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworZXh0ZXJuIGNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9wb3NpdGl2ZV9wb3dlcnNfb2ZfdGVuW107CitleHRlcm4gY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW5bXTsKK2V4dGVybiBjb25zdCBpbnQgdGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbjsKKy8qIEZsb251bV9YWFhfcG93ZXJzX29mX3RlbltdIHRhYmxlIGhhcyAqLworLyogbGVnYWwgaW5kaWNlcyBmcm9tIDAgdG8gKi8KKy8qICsgdGhpcyBudW1iZXIgaW5jbHVzaXZlLiAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoJCQkJCQkJCQkqCisgKglEZWNsYXJlIHdvcmtlciBmdW5jdGlvbnMuCQkJCQkqCisgKgkJCQkJCQkJCSoKKyBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBhdG9mX2dlbmVyaWMgUEFSQU1TICgoY2hhciAqKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIsCisJCQkgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX21hcmtzLAorCQkJICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKKwkJCSAgRkxPTlVNX1RZUEUgKiBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKSk7CisKK3ZvaWQgZmxvbnVtX2NvcHkgUEFSQU1TICgoRkxPTlVNX1RZUEUgKiBpbiwgRkxPTlVNX1RZUEUgKiBvdXQpKTsKK3ZvaWQgZmxvbnVtX211bHRpcCBQQVJBTVMgKChjb25zdCBGTE9OVU1fVFlQRSAqIGEsIGNvbnN0IEZMT05VTV9UWVBFICogYiwKKwkJCSAgICBGTE9OVU1fVFlQRSAqIHByb2R1Y3QpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoJCQkJCQkJCQkqCisgKglEZWNsYXJlIGVycm9yIGNvZGVzLgkJCQkJCSoKKyAqCQkJCQkJCQkJKgorIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVyAoMikKKworLyogZW5kIG9mIGZsb251bS5oICovCmRpZmYgLS1naXQgYS9nYXMvZnJhZ3MuYyBiL2dhcy9mcmFncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGIyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZnJhZ3MuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogZnJhZ3MuYyAtIG1hbmFnZSBmcmFncyAtCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgInN1YnNlZ3MuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisKK2V4dGVybiBmcmFnUyB6ZXJvX2FkZHJlc3NfZnJhZzsKK2V4dGVybiBmcmFnUyBic3NfYWRkcmVzc19mcmFnOworDAorLyogSW5pdGlhbGl6YXRpb24gZm9yIGZyYWcgcm91dGluZXMuICAqLwordm9pZAorZnJhZ19pbml0ICgpCit7CisgIHplcm9fYWRkcmVzc19mcmFnLmZyX3R5cGUgPSByc19maWxsOworICBic3NfYWRkcmVzc19mcmFnLmZyX3R5cGUgPSByc19maWxsOworfQorDAorLyogQWxsb2NhdGUgYSBmcmFnIG9uIHRoZSBzcGVjaWZpZWQgb2JzdGFjay4KKyAgIENhbGwgdGhpcyByb3V0aW5lIGZyb20gZXZlcnl3aGVyZSBlbHNlLCBzbyB0aGF0IGFsbCB0aGUgd2VpcmQgYWxpZ25tZW50CisgICBoYWNrZXJ5IGNhbiBiZSBkb25lIGluIGp1c3Qgb25lIHBsYWNlLiAgKi8KK2ZyYWdTICoKK2ZyYWdfYWxsb2MgKG9iKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2I7Cit7CisgIGZyYWdTICpwdHI7CisgIGludCBvYWxpZ247CisKKyAgKHZvaWQpIG9ic3RhY2tfYWxsb2MgKG9iLCAwKTsKKyAgb2FsaWduID0gb2JzdGFja19hbGlnbm1lbnRfbWFzayAob2IpOworICBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChvYikgPSAwOworICBwdHIgPSAoZnJhZ1MgKikgb2JzdGFja19hbGxvYyAob2IsIFNJWkVPRl9TVFJVQ1RfRlJBRyk7CisgIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKG9iKSA9IG9hbGlnbjsKKyAgbWVtc2V0IChwdHIsIDAsIFNJWkVPRl9TVFJVQ1RfRlJBRyk7CisgIHJldHVybiBwdHI7Cit9CisMCisvKgorICoJCQlmcmFnX2dyb3coKQorICoKKyAqIFRyeSB0byBhdWdtZW50IGN1cnJlbnQgZnJhZyBieSBuY2hhcnMgY2hhcnMuCisgKiBJZiB0aGVyZSBpcyBubyByb29tLCBjbG9zZSBvZiB0aGUgY3VycmVudCBmcmFnIHdpdGggYSAiLmZpbGwgMCIKKyAqIGFuZCBiZWdpbiBhIG5ldyBmcmFnLiBVbmxlc3MgdGhlIG5ldyBmcmFnIGhhcyBuY2hhcnMgY2hhcnMgYXZhaWxhYmxlCisgKiBkbyBub3QgcmV0dXJuLiBEbyBub3Qgc2V0IHVwIGFueSBmaWVsZHMgb2YgKm5vd19mcmFnLgorICovCit2b2lkIAorZnJhZ19ncm93IChuY2hhcnMpCisgICAgIHVuc2lnbmVkIGludCBuY2hhcnM7Cit7CisgIGlmIChvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSA8IG5jaGFycykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgIGxvbmcgb2xkYzsKKworICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7CisgICAgICBmcmFnX25ldyAoMCk7CisgICAgICBvbGRjID0gZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjay5jaHVua19zaXplOworICAgICAgZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjay5jaHVua19zaXplID0gMiAqIG5jaGFycyArIFNJWkVPRl9TVFJVQ1RfRlJBRzsKKyAgICAgIHdoaWxlICgobiA9IG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spKSA8IG5jaGFycykKKwl7CisJICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKKwkgIGZyYWdfbmV3ICgwKTsKKwl9CisgICAgICBmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLmNodW5rX3NpemUgPSBvbGRjOworICAgIH0KKyAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDwgbmNoYXJzKQorICAgIGFzX2ZhdGFsIChfKCJDYW4ndCBleHRlbmQgZnJhZyAlZC4gY2hhcnMiKSwgbmNoYXJzKTsKK30KKwwKKy8qCisgKgkJCWZyYWdfbmV3KCkKKyAqCisgKiBDYWxsIHRoaXMgdG8gY2xvc2Ugb2ZmIGEgY29tcGxldGVkIGZyYWcsIGFuZCBzdGFydCB1cCBhIG5ldyAoZW1wdHkpCisgKiBmcmFnLCBpbiB0aGUgc2FtZSBzdWJzZWdtZW50IGFzIHRoZSBvbGQgZnJhZy4KKyAqIFtmcmNoYWluX25vdyByZW1haW5zIHRoZSBzYW1lIGJ1dCBmcmFnX25vdyBpcyB1cGRhdGVkLl0KKyAqIEJlY2F1c2UgdGhpcyBjYWxjdWxhdGVzIHRoZSBjb3JyZWN0IHZhbHVlIG9mIGZyX2ZpeCBieQorICogbG9va2luZyBhdCB0aGUgb2JzdGFjayAnZnJhZ3MnLCBpdCBuZWVkcyB0byBrbm93IGhvdyBtYW55CisgKiBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgdGhlIG9sZCBmcmFnIGJlbG9uZyB0byAodGhlIG1heGltYWwpCisgKiBmcl92YXI6IHRoZSByZXN0IG11c3QgYmVsb25nIHRvIGZyX2ZpeC4KKyAqIEl0IGRvZXNuJ3QgYWN0dWFsbHkgc2V0IHVwIHRoZSBvbGQgZnJhZydzIGZyX3ZhcjogeW91IG1heSBoYXZlCisgKiBzZXQgZnJfdmFyID09IDEsIGJ1dCBhbGxvY2F0ZWQgMTAgY2hhcnMgdG8gdGhlIGVuZCBvZiB0aGUgZnJhZzoKKyAqIGluIHRoaXMgY2FzZSB5b3UgcGFzcyBvbGRfZnJhZ3NfdmFyX21heF9zaXplID09IDEwLgorICoKKyAqIE1ha2UgYSBuZXcgZnJhZywgaW5pdGlhbGlzaW5nIHNvbWUgY29tcG9uZW50cy4gTGluayBuZXcgZnJhZyBhdCBlbmQKKyAqIG9mIGZyY2hhaW5fbm93LgorICovCit2b2lkIAorZnJhZ19uZXcgKG9sZF9mcmFnc192YXJfbWF4X3NpemUpCisgICAgIC8qIE51bWJlciBvZiBjaGFycyAoYWxyZWFkeSBhbGxvY2F0ZWQgb24gb2JzdGFjayBmcmFncykgaW4KKwl2YXJpYWJsZV9sZW5ndGggcGFydCBvZiBmcmFnLiAqLworICAgICBpbnQgb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZTsKK3sKKyAgZnJhZ1MgKmZvcm1lcl9sYXN0X2ZyYWdQOworICBmcmNoYWluUyAqZnJjaFA7CisKKyAgYXNzZXJ0IChmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKKworICAvKiBGaXggdXAgb2xkIGZyYWcncyBmcl9maXguICAqLworICBmcmFnX25vdy0+ZnJfZml4ID0gZnJhZ19ub3dfZml4ICgpIC0gb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZTsKKyAgLyogTWFrZSBzdXJlIGl0cyB0eXBlIGlzIHZhbGlkLiAgKi8KKyAgYXNzZXJ0IChmcmFnX25vdy0+ZnJfdHlwZSAhPSAwKTsKKworICAvKiBUaGlzIHdpbGwgYWxpZ24gdGhlIG9ic3RhY2sgc28gdGhlIG5leHQgc3RydWN0IHdlIGFsbG9jYXRlIG9uIGl0CisgICAgIHdpbGwgYmVnaW4gYXQgYSBjb3JyZWN0IGJvdW5kYXJ5LiAqLworICBvYnN0YWNrX2ZpbmlzaCAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOworICBmcmNoUCA9IGZyY2hhaW5fbm93OworICBrbm93IChmcmNoUCk7CisgIGZvcm1lcl9sYXN0X2ZyYWdQID0gZnJjaFAtPmZyY2hfbGFzdDsKKyAgYXNzZXJ0IChmb3JtZXJfbGFzdF9mcmFnUCAhPSAwKTsKKyAgYXNzZXJ0IChmb3JtZXJfbGFzdF9mcmFnUCA9PSBmcmFnX25vdyk7CisgIGZyYWdfbm93ID0gZnJhZ19hbGxvYyAoJmZyY2hQLT5mcmNoX29ic3RhY2spOworCisgIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7CisKKyAgLyogR2VuZXJhbGx5LCBmcmFnX25vdy0+cG9pbnRzIHRvIGFuIGFkZHJlc3Mgcm91bmRlZCB1cCB0byBuZXh0CisgICAgIGFsaWdubWVudC4gIEhvd2V2ZXIsIGNoYXJhY3RlcnMgd2lsbCBhZGQgdG8gb2JzdGFjayBmcmFncworICAgICBJTU1FRElBVEVMWSBhZnRlciB0aGUgc3RydWN0IGZyYWcsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHN0YXJ0aW5nCisgICAgIGF0IGFuIGFsaWdubWVudCBhZGRyZXNzLiAqLworICBmb3JtZXJfbGFzdF9mcmFnUC0+ZnJfbmV4dCA9IGZyYWdfbm93OworICBmcmNoUC0+ZnJjaF9sYXN0ID0gZnJhZ19ub3c7CisKKyNpZm5kZWYgTk9fTElTVElORworICB7CisgICAgZXh0ZXJuIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICpsaXN0aW5nX3RhaWw7CisgICAgZnJhZ19ub3ctPmxpbmUgPSBsaXN0aW5nX3RhaWw7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7CisKKyAgZnJhZ19ub3ctPmZyX25leHQgPSBOVUxMOworfQkJCQkvKiBmcmFnX25ldygpICovCisMCisvKgorICoJCQlmcmFnX21vcmUoKQorICoKKyAqIFN0YXJ0IGEgbmV3IGZyYWcgdW5sZXNzIHdlIGhhdmUgbiBtb3JlIGNoYXJzIG9mIHJvb20gaW4gdGhlIGN1cnJlbnQgZnJhZy4KKyAqIENsb3NlIG9mZiB0aGUgb2xkIGZyYWcgd2l0aCBhIC5maWxsIDAuCisgKgorICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSAxc3QgY2hhciB0byB3cml0ZSBpbnRvLiBBZHZhbmNlCisgKiBmcmFnX25vd19ncm93dGggcGFzdCB0aGUgbmV3IGNoYXJzLgorICovCisKK2NoYXIgKgorZnJhZ19tb3JlIChuY2hhcnMpCisgICAgIGludCBuY2hhcnM7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnJldHZhbDsKKworICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGFic29sdXRlIHNlY3Rpb24iKSk7CisgICAgICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOworICAgIH0KKworICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBjb21tb24gc2VjdGlvbiIpKTsKKyAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKKyAgICB9CisKKyAgZnJhZ19ncm93IChuY2hhcnMpOworICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOworICBvYnN0YWNrX2JsYW5rX2Zhc3QgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBuY2hhcnMpOworICByZXR1cm4gKHJldHZhbCk7Cit9CQkJCS8qIGZyYWdfbW9yZSgpICovCisMCisvKgorICoJCQlmcmFnX3ZhcigpCisgKgorICogU3RhcnQgYSBuZXcgZnJhZyB1bmxlc3Mgd2UgaGF2ZSBtYXhfY2hhcnMgbW9yZSBjaGFycyBvZiByb29tIGluIHRoZSBjdXJyZW50IGZyYWcuCisgKiBDbG9zZSBvZmYgdGhlIG9sZCBmcmFnIHdpdGggYSAuZmlsbCAwLgorICoKKyAqIFNldCB1cCBhIG1hY2hpbmVfZGVwZW5kZW50IHJlbGF4YWJsZSBmcmFnLCB0aGVuIHN0YXJ0IGEgbmV3IGZyYWcuCisgKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIDFzdCBjaGFyIG9mIHRoZSB2YXIgcGFydCBvZiB0aGUgb2xkIGZyYWcKKyAqIHRvIHdyaXRlIGludG8uCisgKi8KKworY2hhciAqCitmcmFnX3ZhciAodHlwZSwgbWF4X2NoYXJzLCB2YXIsIHN1YnR5cGUsIHN5bWJvbCwgb2Zmc2V0LCBvcGNvZGUpCisgICAgIHJlbGF4X3N0YXRlVCB0eXBlOworICAgICBpbnQgbWF4X2NoYXJzOworICAgICBpbnQgdmFyOworICAgICByZWxheF9zdWJzdGF0ZVQgc3VidHlwZTsKKyAgICAgc3ltYm9sUyAqc3ltYm9sOworICAgICBvZmZzZXRUIG9mZnNldDsKKyAgICAgY2hhciAqb3Bjb2RlOworeworICByZWdpc3RlciBjaGFyICpyZXR2YWw7CisKKyAgZnJhZ19ncm93IChtYXhfY2hhcnMpOworICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOworICBvYnN0YWNrX2JsYW5rX2Zhc3QgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBtYXhfY2hhcnMpOworICBmcmFnX25vdy0+ZnJfdmFyID0gdmFyOworICBmcmFnX25vdy0+ZnJfdHlwZSA9IHR5cGU7CisgIGZyYWdfbm93LT5mcl9zdWJ0eXBlID0gc3VidHlwZTsKKyAgZnJhZ19ub3ctPmZyX3N5bWJvbCA9IHN5bWJvbDsKKyAgZnJhZ19ub3ctPmZyX29mZnNldCA9IG9mZnNldDsKKyAgZnJhZ19ub3ctPmZyX29wY29kZSA9IG9wY29kZTsKKyNpZmRlZiBVU0lOR19DR0VOCisgIGZyYWdfbm93LT5mcl9jZ2VuLmluc24gPSAwOworICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZGV4ID0gMDsKKyAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmZvID0gMDsKKyNlbmRpZgorI2lmZGVmIFRDX0ZSQUdfSU5JVAorICBUQ19GUkFHX0lOSVQgKGZyYWdfbm93KTsKKyNlbmRpZgorICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOworICBmcmFnX25ldyAobWF4X2NoYXJzKTsKKyAgcmV0dXJuIChyZXR2YWwpOworfQorDAorLyoKKyAqCQkJZnJhZ192YXJpYW50KCkKKyAqCisgKiBPVkU6IFRoaXMgdmFyaWFudCBvZiBmcmFnX3ZhciBhc3N1bWVzIHRoYXQgc3BhY2UgZm9yIHRoZSB0YWlsIGhhcyBiZWVuCisgKiAgICAgIGFsbG9jYXRlZCBieSBjYWxsZXIuCisgKiAgICAgIE5vIGNhbGwgdG8gZnJhZ19ncm93IGlzIGRvbmUuCisgKi8KKworY2hhciAqCitmcmFnX3ZhcmlhbnQgKHR5cGUsIG1heF9jaGFycywgdmFyLCBzdWJ0eXBlLCBzeW1ib2wsIG9mZnNldCwgb3Bjb2RlKQorICAgICByZWxheF9zdGF0ZVQgdHlwZTsKKyAgICAgaW50IG1heF9jaGFyczsKKyAgICAgaW50IHZhcjsKKyAgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGU7CisgICAgIHN5bWJvbFMgKnN5bWJvbDsKKyAgICAgb2Zmc2V0VCBvZmZzZXQ7CisgICAgIGNoYXIgKm9wY29kZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsOworCisgIHJldHZhbCA9IG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayk7CisgIGZyYWdfbm93LT5mcl92YXIgPSB2YXI7CisgIGZyYWdfbm93LT5mcl90eXBlID0gdHlwZTsKKyAgZnJhZ19ub3ctPmZyX3N1YnR5cGUgPSBzdWJ0eXBlOworICBmcmFnX25vdy0+ZnJfc3ltYm9sID0gc3ltYm9sOworICBmcmFnX25vdy0+ZnJfb2Zmc2V0ID0gb2Zmc2V0OworICBmcmFnX25vdy0+ZnJfb3Bjb2RlID0gb3Bjb2RlOworI2lmZGVmIFVTSU5HX0NHRU4KKyAgZnJhZ19ub3ctPmZyX2NnZW4uaW5zbiA9IDA7CisgIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5kZXggPSAwOworICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZm8gPSAwOworI2VuZGlmCisjaWZkZWYgVENfRlJBR19JTklUCisgIFRDX0ZSQUdfSU5JVCAoZnJhZ19ub3cpOworI2VuZGlmCisgIGFzX3doZXJlICgmZnJhZ19ub3ctPmZyX2ZpbGUsICZmcmFnX25vdy0+ZnJfbGluZSk7CisgIGZyYWdfbmV3IChtYXhfY2hhcnMpOworICByZXR1cm4gKHJldHZhbCk7Cit9CQkJCS8qIGZyYWdfdmFyaWFudCgpICovCisMCisvKgorICoJCQlmcmFnX3dhbmUoKQorICoKKyAqIFJlZHVjZSB0aGUgdmFyaWFibGUgZW5kIG9mIGEgZnJhZyB0byBhIGhhcm1sZXNzIHN0YXRlLgorICovCit2b2lkIAorZnJhZ193YW5lIChmcmFnUCkKKyAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOworeworICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7CisgIGZyYWdQLT5mcl9vZmZzZXQgPSAwOworICBmcmFnUC0+ZnJfdmFyID0gMDsKK30KKwwKKy8qIE1ha2UgYW4gYWxpZ25tZW50IGZyYWcuICBUaGUgc2l6ZSBvZiB0aGlzIGZyYWcgd2lsbCBiZSBhZGp1c3RlZCB0bworICAgZm9yY2UgdGhlIG5leHQgZnJhZyB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhbGlnbm1lbnQuICBBTElHTk1FTlQKKyAgIGlzIHRoZSBwb3dlciBvZiB0d28gdG8gd2hpY2ggdG8gYWxpZ24uICBGSUxMX0NIQVJBQ1RFUiBpcyB0aGUKKyAgIGNoYXJhY3RlciB0byB1c2UgdG8gZmlsbCBpbiBhbnkgYnl0ZXMgd2hpY2ggYXJlIHNraXBwZWQuICBNQVggaXMKKyAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAorICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KKwordm9pZCAKK2ZyYWdfYWxpZ24gKGFsaWdubWVudCwgZmlsbF9jaGFyYWN0ZXIsIG1heCkKKyAgICAgaW50IGFsaWdubWVudDsKKyAgICAgaW50IGZpbGxfY2hhcmFjdGVyOworICAgICBpbnQgbWF4OworeworICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHsKKyAgICAgIGFkZHJlc3NUIG5ld19vZmY7CisKKyAgICAgIG5ld19vZmYgPSAoKGFic19zZWN0aW9uX29mZnNldCArIGFsaWdubWVudCAtIDEpCisJCSAmfiAoKDEgPDwgYWxpZ25tZW50KSAtIDEpKTsKKyAgICAgIGlmIChtYXggPT0gMCB8fCBuZXdfb2ZmIC0gYWJzX3NlY3Rpb25fb2Zmc2V0IDw9IChhZGRyZXNzVCkgbWF4KQorCWFic19zZWN0aW9uX29mZnNldCA9IG5ld19vZmY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqcDsKKworICAgICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbiwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAorCQkgICAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIGFsaWdubWVudCwgKGNoYXIgKikgMCk7CisgICAgICAqcCA9IGZpbGxfY2hhcmFjdGVyOworICAgIH0KK30KKworLyogTWFrZSBhbiBhbGlnbm1lbnQgZnJhZyBsaWtlIGZyYWdfYWxpZ24sIGJ1dCBmaWxsIHdpdGggYSByZXBlYXRpbmcKKyAgIHBhdHRlcm4gcmF0aGVyIHRoYW4gYSBzaW5nbGUgYnl0ZS4gIEFMSUdOTUVOVCBpcyB0aGUgcG93ZXIgb2YgdHdvCisgICB0byB3aGljaCB0byBhbGlnbi4gIEZJTExfUEFUVEVSTiBpcyB0aGUgZmlsbCBwYXR0ZXJuIHRvIHJlcGVhdCBpbgorICAgdGhlIGJ5dGVzIHdoaWNoIGFyZSBza2lwcGVkLiAgTl9GSUxMIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KKyAgIEZJTExfUEFUVEVSTi4gIE1BWCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwIHdoZW4KKyAgIGRvaW5nIHRoZSBhbGlnbm1lbnQsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCisKK3ZvaWQgCitmcmFnX2FsaWduX3BhdHRlcm4gKGFsaWdubWVudCwgZmlsbF9wYXR0ZXJuLCBuX2ZpbGwsIG1heCkKKyAgICAgaW50IGFsaWdubWVudDsKKyAgICAgY29uc3QgY2hhciAqZmlsbF9wYXR0ZXJuOworICAgICBpbnQgbl9maWxsOworICAgICBpbnQgbWF4OworeworICBjaGFyICpwOworCisgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ24sIG5fZmlsbCwgbl9maWxsLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCisJCShzeW1ib2xTICopIDAsIChvZmZzZXRUKSBhbGlnbm1lbnQsIChjaGFyICopIDApOworICBtZW1jcHkgKHAsIGZpbGxfcGF0dGVybiwgbl9maWxsKTsKK30KKworYWRkcmVzc1QKK2ZyYWdfbm93X2ZpeCAoKQoreworICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHJldHVybiBhYnNfc2VjdGlvbl9vZmZzZXQ7CisgIHJldHVybiAoYWRkcmVzc1QpICgoY2hhciopIG9ic3RhY2tfbmV4dF9mcmVlICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykKKwkJICAgICAtIGZyYWdfbm93LT5mcl9saXRlcmFsKTsKK30KKwordm9pZAorZnJhZ19hcHBlbmRfMV9jaGFyIChkYXR1bSkKKyAgICAgaW50IGRhdHVtOworeworICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPD0gMSkKKyAgICB7CisgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKKyAgICAgIGZyYWdfbmV3ICgwKTsKKyAgICB9CisgIG9ic3RhY2tfMWdyb3cgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrLCBkYXR1bSk7Cit9CisKKy8qIGVuZCBvZiBmcmFncy5jICovCmRpZmYgLS1naXQgYS9nYXMvZnJhZ3MuaCBiL2dhcy9mcmFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTAyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvZnJhZ3MuaApAQCAtMCwwICsxLDE1OCBAQAorLyogZnJhZ3MuaCAtIEhlYWRlciBmaWxlIGZvciB0aGUgZnJhZyBjb25jZXB0LgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIEZSQUdTX0gKKyNkZWZpbmUgRlJBR1NfSAorCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3Qgb2JzdGFjazsKKyNlbmRpZgorCisvKgorICogQSBjb2RlIGZyYWdtZW50IChmcmFnKSBpcyBzb21lIGtub3duIG51bWJlciBvZiBjaGFycywgZm9sbG93ZWQgYnkgc29tZQorICogdW5rbm93biBudW1iZXIgb2YgY2hhcnMuIFR5cGljYWxseSB0aGUgdW5rbm93biBudW1iZXIgb2YgY2hhcnMgaXMgYW4KKyAqIGluc3RydWN0aW9uIGFkZHJlc3Mgd2hvc2Ugc2l6ZSBpcyB5ZXQgdW5rbm93bi4gV2UgYWx3YXlzIGtub3cgdGhlIGdyZWF0ZXN0CisgKiBwb3NzaWJsZSBzaXplIHRoZSB1bmtub3duIG51bWJlciBvZiBjaGFycyBtYXkgYmVjb21lLCBhbmQgcmVzZXJ2ZSB0aGF0CisgKiBtdWNoIHJvb20gYXQgdGhlIGVuZCBvZiB0aGUgZnJhZy4KKyAqIE9uY2UgY3JlYXRlZCwgZnJhZ3MgZG8gbm90IGNoYW5nZSBhZGRyZXNzIGR1cmluZyBhc3NlbWJseS4KKyAqIFdlIGNoYWluIHRoZSBmcmFncyBpbiAoYSkgZm9yd2FyZC1saW5rZWQgbGlzdChzKS4gVGhlIG9iamVjdC1maWxlIGFkZHJlc3MKKyAqIG9mIHRoZSAxc3QgY2hhciBvZiBhIGZyYWcgaXMgZ2VuZXJhbGx5IG5vdCBrbm93biB1bnRpbCBhZnRlciByZWxheCgpLgorICogTWFueSB0aGluZ3MgYXQgYXNzZW1ibHkgdGltZSBkZXNjcmliZSBhbiBhZGRyZXNzIGJ5IHtvYmplY3QtZmlsZS1hZGRyZXNzCisgKiBvZiBhIHBhcnRpY3VsYXIgZnJhZ30rb2Zmc2V0LgorCisgQlVHOiBpdCBtYXkgYmUgc21hcnRlciB0byBoYXZlIGEgc2luZ2xlIHBvaW50ZXIgb2ZmIHRvIHZhcmlvdXMgZGlmZmVyZW50Cisgbm90ZXMgZm9yIGRpZmZlcmVudCBmcmFnIGtpbmRzLiBTZWUgaG93IGNvZGUgcGFucworICovCisKK3N0cnVjdCBmcmFnCit7CisgIC8qIE9iamVjdCBmaWxlIGFkZHJlc3MuICovCisgIGFkZHJlc3NUIGZyX2FkZHJlc3M7CisgIC8qIENoYWluIGZvcndhcmQ7IGFzY2VuZGluZyBhZGRyZXNzIG9yZGVyLiAgUm9vdGVkIGluIGZyY2hfcm9vdC4gKi8KKyAgc3RydWN0IGZyYWcgKmZyX25leHQ7CisKKyAgLyogKEZpeGVkKSBudW1iZXIgb2YgY2hhcnMgd2Uga25vdyB3ZSBoYXZlLiAgTWF5IGJlIDAuICovCisgIG9mZnNldFQgZnJfZml4OworICAvKiAoVmFyaWFibGUpIG51bWJlciBvZiBjaGFycyBhZnRlciBhYm92ZS4gIE1heSBiZSAwLiAqLworICBvZmZzZXRUIGZyX3ZhcjsKKyAgLyogRm9yIHZhcmlhYmxlLWxlbmd0aCB0YWlsLiAqLworICBzdHJ1Y3Qgc3ltYm9sICpmcl9zeW1ib2w7CisgIC8qIEZvciB2YXJpYWJsZS1sZW5ndGggdGFpbC4gKi8KKyAgb2Zmc2V0VCBmcl9vZmZzZXQ7CisgIC8qIFBvaW50cyB0byBvcGNvZGUgbG93IGFkZHIgYnl0ZSwgZm9yIHJlbGF4YXRpb24uICAqLworICBjaGFyICpmcl9vcGNvZGU7CisKKyNpZm5kZWYgTk9fTElTVElORworICBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGluZTsKKyNlbmRpZgorCisgIC8qIFdoYXQgc3RhdGUgaXMgbXkgdGFpbCBpbj8gKi8KKyAgcmVsYXhfc3RhdGVUIGZyX3R5cGU7CisgIHJlbGF4X3N1YnN0YXRlVCBmcl9zdWJ0eXBlOworCisjaWZkZWYgVVNJTkdfQ0dFTgorICAvKiBEb24ndCBpbmNsdWRlIHRoaXMgdW5sZXNzIHVzaW5nIENHRU4gdG8ga2VlcCBmcmFnIHNpemUgZG93bi4gICovCisgIHN0cnVjdCB7CisgICAgLyogQ0dFTl9JTlNOIGVudHJ5IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KKyAgICBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICppbnNuOworICAgIC8qIEluZGV4IGludG8gb3BlcmFuZCB0YWJsZS4gICovCisgICAgaW50IG9waW5kZXg7CisgICAgLyogVGFyZ2V0IHNwZWNpZmljIGRhdGEsIHVzdWFsbHkgcmVsb2MgbnVtYmVyLiAgKi8KKyAgICBpbnQgb3BpbmZvOworICB9IGZyX2NnZW47CisjZW5kaWYKKworI2lmZGVmIFRDX0ZSQUdfVFlQRQorICBUQ19GUkFHX1RZUEUgdGNfZnJhZ19kYXRhOworI2VuZGlmCisKKyAgLyogV2hlcmUgdGhlIGZyYWcgd2FzIGNyZWF0ZWQsIG9yIHdoZXJlIGl0IGJlY2FtZSBhIHZhcmlhbnQgZnJhZy4gICovCisgIGNoYXIgKmZyX2ZpbGU7CisgIHVuc2lnbmVkIGludCBmcl9saW5lOworCisgIC8qIERhdGEgYmVnaW5zIGhlcmUuICAqLworICBjaGFyIGZyX2xpdGVyYWxbMV07Cit9OworCisjZGVmaW5lIFNJWkVPRl9TVFJVQ1RfRlJBRyBcCisoKGNoYXIgKil6ZXJvX2FkZHJlc3NfZnJhZy5mcl9saXRlcmFsLShjaGFyICopJnplcm9fYWRkcmVzc19mcmFnKQorLyogV2Ugd2FudCB0byBzYXkgZnJfbGl0ZXJhbFswXSBhYm92ZS4gKi8KKworLyogQ3VycmVudCBmcmFnIHdlIGFyZSBidWlsZGluZy4gIFRoaXMgZnJhZyBpcyBpbmNvbXBsZXRlLiAgSXQgaXMsCisgICBob3dldmVyLCBpbmNsdWRlZCBpbiBmcmNoYWluX25vdy4gIFRoZSBmcl9maXggZmllbGQgaXMgYm9ndXM7CisgICBpbnN0ZWFkLCB1c2UgZnJhZ19ub3dfZml4ICgpLiAgKi8KK0NPTU1PTiBmcmFnUyAqZnJhZ19ub3c7CitleHRlcm4gYWRkcmVzc1QgZnJhZ19ub3dfZml4IFBBUkFNUyAoKHZvaWQpKTsKKworLyogRm9yIGZvcmVpZ24tc2VnbWVudCBzeW1ib2wgZml4dXBzLiAqLworQ09NTU9OIGZyYWdTIHplcm9fYWRkcmVzc19mcmFnOworLyogRm9yIGxvY2FsIGNvbW1vbiAoTl9CU1Mgc2VnbWVudCkgZml4dXBzLiAqLworQ09NTU9OIGZyYWdTIGJzc19hZGRyZXNzX2ZyYWc7CisKKyNpZiAwCisvKgorICogQSBtYWNybyB0byBzcGVlZCB1cCBhcHBlbmRpbmcgZXhhY3RseSAxIGNoYXIKKyAqIHRvIGN1cnJlbnQgZnJhZy4KKyAqLworLyogSkYgY2hhbmdlZCA8IDEgdG8gPD0gMSB0byBhdm9pZCBhIHJhY2UgY29uZGl0b24gKi8KKyNkZWZpbmUgRlJBR19BUFBFTkRfMV9DSEFSKGRhdHVtKQlcCit7CQkJCQlcCisgIGlmIChvYnN0YWNrX3Jvb20oICZmcmFncyApIDw9IDEpIHtcCisgICAgZnJhZ193YW5lIChmcmFnX25vdyk7CVwKKyAgICBmcmFnX25ldyAoMCk7CQlcCisgIH0JCQkJXAorICBvYnN0YWNrXzFncm93KCAmZnJhZ3MsIGRhdHVtICk7CVwKK30KKyNlbHNlCitleHRlcm4gdm9pZCBmcmFnX2FwcGVuZF8xX2NoYXIgUEFSQU1TICgoaW50KSk7CisjZGVmaW5lIEZSQUdfQVBQRU5EXzFfQ0hBUihYKSBmcmFnX2FwcGVuZF8xX2NoYXIgKFgpCisjZW5kaWYKKworCit2b2lkIGZyYWdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7CitmcmFnUyAqZnJhZ19hbGxvYyBQQVJBTVMgKChzdHJ1Y3Qgb2JzdGFjayAqKSk7Cit2b2lkIGZyYWdfZ3JvdyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgbmNoYXJzKSk7CitjaGFyICpmcmFnX21vcmUgUEFSQU1TICgoaW50IG5jaGFycykpOwordm9pZCBmcmFnX2FsaWduIFBBUkFNUyAoKGludCBhbGlnbm1lbnQsIGludCBmaWxsX2NoYXJhY3RlciwgaW50IG1heCkpOwordm9pZCBmcmFnX2FsaWduX3BhdHRlcm4gUEFSQU1TICgoaW50IGFsaWdubWVudCwKKwkJCQkgY29uc3QgY2hhciAqZmlsbF9wYXR0ZXJuLAorCQkJCSBpbnQgbl9maWxsLAorCQkJCSBpbnQgbWF4KSk7Cit2b2lkIGZyYWdfbmV3IFBBUkFNUyAoKGludCBvbGRfZnJhZ3NfdmFyX21heF9zaXplKSk7Cit2b2lkIGZyYWdfd2FuZSBQQVJBTVMgKChmcmFnUyAqIGZyYWdQKSk7CisKK2NoYXIgKmZyYWdfdmFyaWFudCBQQVJBTVMgKChyZWxheF9zdGF0ZVQgdHlwZSwKKwkJCSAgICBpbnQgbWF4X2NoYXJzLAorCQkJICAgIGludCB2YXIsCisJCQkgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGUsCisJCQkgICAgc3ltYm9sUyAqIHN5bWJvbCwKKwkJCSAgICBvZmZzZXRUIG9mZnNldCwKKwkJCSAgICBjaGFyICpvcGNvZGUpKTsKKworY2hhciAqZnJhZ192YXIgUEFSQU1TICgocmVsYXhfc3RhdGVUIHR5cGUsCisJCQlpbnQgbWF4X2NoYXJzLAorCQkJaW50IHZhciwKKwkJCXJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlLAorCQkJc3ltYm9sUyAqIHN5bWJvbCwKKwkJCW9mZnNldFQgb2Zmc2V0LAorCQkJY2hhciAqb3Bjb2RlKSk7CisKKyNlbmRpZiAvKiBGUkFHU19IICovCmRpZmYgLS1naXQgYS9nYXMvZ2FzcC5jIGIvZ2FzL2dhc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI2NWUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2dhc3AuYwpAQCAtMCwwICsxLDM3NDUgQEAKKy8qIGdhc3AuYyAtIEdudSBhc3NlbWJsZXIgcHJlcHJvY2Vzc29yIG1haW4gcHJvZ3JhbS4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCisgICAgICBzYWNAY3lnbnVzLmNvbQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVNQLCB0aGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IuCisKKyAgIEdBU1AgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVNQIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTUDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworLyoKKworVGhpcyBwcm9ncmFtIHRyYW5zbGF0ZXMgdGhlIGlucHV0IG1hY3JvcyBhbmQgc3R1ZmYgaW50byBhIGZvcm0KK3N1aXRhYmxlIGZvciBnYXMgdG8gY29uc3VtZS4KKworCisgIGdhc3AgWy1zZGhhdV0gWy1jIGNoYXJdIFstbyA8b3V0ZmlsZT5dIDxpbmZpbGU+KgorCisgIC1zIGNvcHkgc291cmNlIHRvIG91dHB1dAorICAtYyA8Y2hhcj4gY29tbWVudHMgYXJlIHN0YXJ0ZWQgd2l0aCA8Y2hhcj4gaW5zdGVhZCBvZiAhCisgIC11IGFsbG93IHVucmVhc29uYWJsZSBzdHVmZgorICAtcCBwcmludCBsaW5lIG51bWJlcnMKKyAgLWQgcHJpbnQgZGVidWdnaW5nIHN0YXRzCisgIC1zIHNlbWkgY29sb25zIHN0YXJ0IGNvbW1lbnRzCisgIC1hIHVzZSBhbHRlcm5hdGUgc3ludGF4CisgICAgIFBzZXVkbyBvcHMgY2FuIHN0YXJ0IHdpdGggb3Igd2l0aG91dCBhIC4KKyAgICAgTGFiZWxzIGhhdmUgdG8gYmUgaW4gZmlyc3QgY29sdW1uLgorICAtSSBzcGVjaWZ5IGluY2x1ZGUgZGlyCisgICAgTWFjcm8gYXJnIHBhcmFtZXRlcnMgc3Vic2l0dXRlZCBieSBuYW1lLCBkb24ndCBuZWVkIHRoZSAmLgorICAgICBTdHJpbmcgY2FuIHN0YXJ0IHdpdGggJyB0b28uCisgICAgIFN0cmluZ3MgY2FuIGJlIHN1cnJvdW5kZWQgYnkgPC4uPgorICAgICBBICU8ZXhwPiBpbiBhIHN0cmluZyBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gCisgICAgIExpdGVyYWwgY2hhciBpbiBhIHN0cmluZyB3aXRoICEKKworCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIE5FRURfTUFMTE9DX0RFQ0xBUkFUSU9OCitleHRlcm4gY2hhciAqbWFsbG9jICgpOworI2VuZGlmCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgInNiLmgiCisjaW5jbHVkZSAibWFjcm8uaCIKKyNpbmNsdWRlICJhc2ludGwuaCIKKworY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjEuMiI7CisKKy8qIFRoaXMgaXMgbm9ybWFsbHkgZGVjbGFyZWQgaW4gYXMuaCwgYnV0IHdlIGRvbid0IGluY2x1ZGUgdGhhdC4gIFdlCisgICBuZWVkIHRoZSBmdW5jdGlvbiBiZWNhdXNlIG90aGVyIGZpbGVzIGxpbmtlZCB3aXRoIGdhc3AuYyBtaWdodCBjYWxsCisgICBpdC4gICovCitleHRlcm4gdm9pZCBhc19hYm9ydCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7CisKKyNkZWZpbmUgTUFYX0lOQ0xVREVTIDMwCQkvKiBNYXhpbXVtIGluY2x1ZGUgZGVwdGggKi8KKyNkZWZpbmUgTUFYX1JFQVNPTkFCTEUgMTAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiBleHBhbnNpb25zICovCisKK2ludCB1bnJlYXNvbmFibGU7CQkvKiAtdSBvbiBjb21tYW5kIGxpbmUgKi8KK2ludCBzdGF0czsJCQkvKiAtZCBvbiBjb21tYW5kIGxpbmUgKi8KK2ludCBwcmludF9saW5lX251bWJlcjsJCS8qIC1wIGZsYWcgb24gY29tbWFuZCBsaW5lICovCitpbnQgY29weXNvdXJjZTsJCQkvKiAtYyBmbGFnIG9uIGNvbW1hbmQgbGluZSAqLworaW50IHdhcm5pbmdzOwkJCS8qIE51bWJlciBvZiBXQVJOSU5HcyBnZW5lcmF0ZWQgc28gZmFyLiAqLworaW50IGVycm9yczsJCQkvKiBOdW1iZXIgb2YgRVJST1JzIGdlbmVyYXRlZCBzbyBmYXIuICovCitpbnQgZmF0YWxzOwkJCS8qIE51bWJlciBvZiBmYXRhbCBFUlJPUnMgZ2VuZXJhdGVkIHNvIGZhciAoZWl0aGVyIDAgb3IgMSkuICovCitpbnQgYWx0ZXJuYXRlID0gMDsgICAgICAgICAgICAgIC8qIC1hIG9uIGNvbW1hbmQgbGluZSAqLworaW50IG1yaSA9IDA7CQkJLyogLU0gb24gY29tbWFuZCBsaW5lICovCitjaGFyIGNvbW1lbnRfY2hhciA9ICchJzsKK2ludCByYWRpeCA9IDEwOwkJCS8qIERlZmF1bHQgcmFkaXggKi8KKworaW50IGhhZF9lbmQ7IC8qIFNlZW4gLkVORCAqLworCisvKiBUaGUgb3V0cHV0IHN0cmVhbSAqLworRklMRSAqb3V0ZmlsZTsKKworLyogdGhlIGF0dHJpYnV0ZXMgb2YgZWFjaCBjaGFyYWN0ZXIgYXJlIHN0b3JlZCBhcyBhIGJpdCBwYXR0ZXJuCisgICBjaGFydHlwZSwgd2hpY2ggZ2l2ZXMgdXMgcXVpY2sgdGVzdHMuICovCisKKworI2RlZmluZSBGSVJTVEJJVCAxCisjZGVmaW5lIE5FWFRCSVQgIDIKKyNkZWZpbmUgU0VQQklUICAgNAorI2RlZmluZSBXSElURUJJVCA4CisjZGVmaW5lIENPTU1FTlRCSVQgMTYKKyNkZWZpbmUgQkFTRUJJVCAgMzIKKyNkZWZpbmUgSVNDT01NRU5UQ0hBUih4KSAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIENPTU1FTlRCSVQpCisjZGVmaW5lIElTRklSU1RDSEFSKHgpICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIEZJUlNUQklUKQorI2RlZmluZSBJU05FWFRDSEFSKHgpICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBORVhUQklUKQorI2RlZmluZSBJU1NFUCh4KSAgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBTRVBCSVQpCisjZGVmaW5lIElTV0hJVEUoeCkgICAgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIFdISVRFQklUKQorI2RlZmluZSBJU0JBU0UoeCkgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBCQVNFQklUKQorc3RhdGljIGNoYXIgY2hhcnR5cGVbMjU2XTsKKworCisvKiBDb25kaXRpb25hbCBhc3NlbWJseSB1c2VzIHRoZSBgaWZzdGFjaycuICBFYWNoIGFpZiBwdXNoZXMgYW5vdGhlcgorICAgZW50cnkgb250byB0aGUgc3RhY2ssIGFuZCBzZXRzIHRoZSBvbiBmbGFnIGlmIGl0IHNob3VsZC4gIFRoZSBhZWxzZQorICAgc2V0cyBoYWRlbHNlLCBhbmQgdG9nZ2xlcyBvbi4gIEFuIGFlbmQgcG9wcyBhIGxldmVsLiAgV2UgbGltaXQgdG8KKyAgIDEwMCBsZXZlbHMgb2YgbmVzdGluZywgbm90IGJlY2F1c2Ugd2UncmUgZmFjaXN0cyBwaWdzIHdpdGggcmVhZAorICAgb25seSBtaW5kcywgYnV0IGJlY2F1c2UgbW9yZSB0aGFuIDEwMCBsZXZlbHMgb2YgbmVzdGluZyBpcyBwcm9iYWJseQorICAgYSBidWcgaW4gdGhlIHVzZXIncyBtYWNybyBzdHJ1Y3R1cmUuICAqLworCisjZGVmaW5lIElGTkVTVElORyAxMDAKK3N0cnVjdAorICB7CisgICAgaW50IG9uOwkJCS8qIGlzIHRoZSBsZXZlbCBiZWluZyBvdXRwdXQgKi8KKyAgICBpbnQgaGFkZWxzZTsJCS8qIGhhcyBhbiBhZWxzZSBiZWVuIHNlZW4gKi8KKyAgfQoraWZzdGFja1tJRk5FU1RJTkddOworaW50IGlmaTsKKworLyogVGhlIGZpbmFsIGFuZCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGtlcHQgaW4KKyAgIGV4cF90J3MuICBOb3RlIHRoYXQgYSBzeW1ib2wgaXMgbm90IGFuIHNiLCBidXQgYSBwb2ludGVyIGludG8gdGhlIGlucHV0CisgICBsaW5lLiAgSXQgbXVzdCBiZSBjb3BlZCBzb21ld2hlcmUgc2FmZSBiZWZvcmUgdGhlIG5leHQgbGluZSBpcyByZWFkIGluLiAqLworCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgbGVuOworICB9CitzeW1ib2w7CisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBpbnQgdmFsdWU7CQkJLyogY29uc3RhbnQgcGFydCAqLworICAgIHN5bWJvbCBhZGRfc3ltYm9sOwkJLyogbmFtZSBwYXJ0ICovCisgICAgc3ltYm9sIHN1Yl9zeW1ib2w7CQkvKiBuYW1lIHBhcnQgKi8KKyAgfQorZXhwX3Q7CisKKworLyogSGFzaGluZyBpcyBkb25lIGluIGEgcHJldHR5IHN0YW5kYXJkIHdheS4gIEEgaGFzaF90YWJsZSBoYXMgYQorICAgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0byBoYXNoX2VudHJ5cywgYW5kIHRoZSBzaXplIG9mIHRoZQorICAgdmVjdG9yLiAgQSBoYXNoX2VudHJ5IGNvbnRhaW5zIGEgdW5pb24gb2YgYWxsIHRoZSBpbmZvIHdlIGxpa2UgdG8KKyAgIHN0b3JlIGluIGhhc2ggdGFibGUuICBJZiB0aGVyZSBpcyBhIGhhc2ggY29sbGlzaW9uLCBoYXNoX2VudHJpZXMKKyAgIHdpdGggdGhlIHNhbWUgaGFzaCBhcmUga2VwdCBpbiBhIGNoYWluLiAqLworCisvKiBXaGF0IHRoZSBkYXRhIGluIGEgaGFzaF9lbnRyeSBtZWFucyAqLwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBoYXNoX2ludGVnZXIsCQkvKiBuYW1lLT5pbnRlZ2VyIG1hcHBpbmcgKi8KKyAgICBoYXNoX3N0cmluZywJCS8qIG5hbWUtPnN0cmluZyBtYXBwaW5nICovCisgICAgaGFzaF9tYWNybywJCQkvKiBuYW1lIGlzIGEgbWFjcm8gKi8KKyAgICBoYXNoX2Zvcm1hbAkJCS8qIG5hbWUgaXMgYSBmb3JtYWwgYXJndW1lbnQgKi8KKyAgfSBoYXNoX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IGhzCisgIHsKKyAgICBzYiBrZXk7CQkJLyogc3ltYm9sIG5hbWUgKi8KKyAgICBoYXNoX3R5cGUgdHlwZTsJCS8qIHN5bWJvbCBtZWFuaW5nICovCisgICAgdW5pb24KKyAgICAgIHsKKwlzYiBzOworCWludCBpOworCXN0cnVjdCBtYWNyb19zdHJ1Y3QgKm07CisJc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKmY7CisgICAgICB9IHZhbHVlOworICAgIHN0cnVjdCBocyAqbmV4dDsJCS8qIG5leHQgaGFzaF9lbnRyeSB3aXRoIHNhbWUgaGFzaCBrZXkgKi8KKyAgfSBoYXNoX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgaGFzaF9lbnRyeSAqKnRhYmxlOworICAgIGludCBzaXplOworICB9IGhhc2hfdGFibGU7CisKKworLyogU3RydWN0dXJlcyB1c2VkIHRvIHN0b3JlIG1hY3Jvcy4gCisKKyAgIEVhY2ggbWFjcm8ga25vd3MgaXRzIG5hbWUgYW5kIGluY2x1ZGVkIHRleHQuICBJdCBnZXRzIGJ1aWx0IHdpdGggYQorICAgbGlzdCBvZiBmb3JtYWwgYXJndW1lbnRzLCBhbmQgYWxzbyBrZWVwcyBhIGhhc2ggdGFibGUgd2hpY2ggcG9pbnRzCisgICBpbnRvIHRoZSBsaXN0IHRvIHNwZWVkIHVwIGZvcm1hbCBzZWFyY2guICBFYWNoIGZvcm1hbCBrbm93cyBpdHMKKyAgIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLiAgRWFjaCB0aW1lIHRoZSBtYWNybyBpcyBleHBhbmRlZCwgdGhlCisgICBmb3JtYWxzIGdldCB0aGUgYWN0dWFsIHZhbHVlcyBhdHRhdGNoZWQgdG8gdGhlbS4gKi8KKworLyogZGVzY3JpYmUgdGhlIGZvcm1hbCBhcmd1bWVudHMgdG8gYSBtYWNybyAqLworCit0eXBlZGVmIHN0cnVjdCBmb3JtYWxfc3RydWN0CisgIHsKKyAgICBzdHJ1Y3QgZm9ybWFsX3N0cnVjdCAqbmV4dDsJLyogbmV4dCBmb3JtYWwgaW4gbGlzdCAqLworICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiB0aGUgZm9ybWFsICovCisgICAgc2IgZGVmOwkJCS8qIHRoZSBkZWZhdWx0IHZhbHVlICovCisgICAgc2IgYWN0dWFsOwkJCS8qIHRoZSBhY3R1YWwgYXJndW1lbnQgKGNoYW5nZWQgb24gZWFjaCBleHBhbnNpb24pICovCisgICAgaW50IGluZGV4OwkJCS8qIHRoZSBpbmRleCBvZiB0aGUgZm9ybWFsIDAuLmZvcm1hbF9jb3VudC0xICovCisgIH0KK2Zvcm1hbF9lbnRyeTsKKworLyogZGVzY3JpYmUgdGhlIG1hY3JvLiAqLworCit0eXBlZGVmIHN0cnVjdCBtYWNyb19zdHJ1Y3QKKyAgeworICAgIHNiIHN1YjsJCQkvKiBzdWJzdGl0dXRpb24gdGV4dC4gKi8KKyAgICBpbnQgZm9ybWFsX2NvdW50OwkJLyogbnVtYmVyIG9mIGZvcm1hbCBhcmdzLiAqLworICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsJLyogcG9pbnRlciB0byBsaXN0IG9mIGZvcm1hbF9zdHJ1Y3RzICovCisgICAgaGFzaF90YWJsZSBmb3JtYWxfaGFzaDsJLyogaGFzaCB0YWJsZSBvZiBmb3JtYWxzLiAqLworICB9CittYWNyb19lbnRyeTsKKworLyogaG93IHdlIG5lc3QgZmlsZXMgYW5kIGV4cGFuZCBtYWNyb3MgZXRjLgorCisgICB3ZSBrZWVwIGEgc3RhY2sgb2Ygb2YgaW5jbHVkZV9zdGFjayBzdHJ1Y3RzLiAgZWFjaCBpbmNsdWRlIGZpbGUKKyAgIHB1c2hlcyBhIG5ldyBsZXZlbCBvbnRvIHRoZSBzdGFjay4gIHdlIGtlZXAgYW4gc2Igd2l0aCBhIHB1c2hiYWNrCisgICB0b28uICB1bmdldCBjaGFycyBhcmUgcHVzaGVkIG9udG8gdGhlIHB1c2hiYWNrIHNiLCBnZXRjaGFycyBmaXJzdAorICAgY2hlY2tzIHRoZSBwdXNoYmFjayBzYiBiZWZvcmUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCisKKyAgIHNtYWxsIHRoaW5ncyBhcmUgZXhwYW5kZWQgYnkgYWRkaW5nIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIG9udG8gdGhlCisgICBwdXNoYmFjayBzYi4gIGxhcmdlciBpdGVtcyBhcmUgZ3Jvd24gYnkgcHVzaGluZyBhIG5ldyBsZXZlbCBhbmQKKyAgIGFsbG9jYXRpbmcgdGhlIGVudGlyZSBwdXNoYmFjayBidWYgZm9yIHRoZSBpdGVtLiAgZWFjaCB0aW1lCisgICBzb21ldGhpbmcgbGlrZSBhIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUgc3RhY2sgaW5kZXggaXMgY2hhbmdlZC4gd2UKKyAgIGNhbiB0aGVuIHBlcmZvcm0gYW4gZXhpdG0gYnkgcG9wcGluZyBhbGwgZW50cmllcyBvZmYgdGhlIHN0YWNrIHdpdGgKKyAgIHRoZSBzYW1lIHN0YWNrIGluZGV4LiAgaWYgd2UncmUgYmVpbmcgcmVhc29uYWJsZSwgd2UgY2FuIGRldGVjdAorICAgcmVjdXNpdmUgZXhwYW5zaW9uIGJ5IGNoZWNraW5nIHRoZSBpbmRleCBpcyByZWFzb25hYmx5IHNtYWxsLgorICovCisKK3R5cGVkZWYgZW51bQorICB7CisgICAgaW5jbHVkZV9maWxlLCBpbmNsdWRlX3JlcGVhdCwgaW5jbHVkZV93aGlsZSwgaW5jbHVkZV9tYWNybworICB9IGluY2x1ZGVfdHlwZTsKKworc3RydWN0IGluY2x1ZGVfc3RhY2sKKyAgeworICAgIHNiIHB1c2hiYWNrOwkJLyogY3VycmVudCBwdXNoYmFjayBzdHJlYW0gKi8KKyAgICBpbnQgcHVzaGJhY2tfaW5kZXg7CQkvKiBuZXh0IGNoYXIgdG8gcmVhZCBmcm9tIHN0cmVhbSAqLworICAgIEZJTEUgKmhhbmRsZTsJCS8qIG9wZW4gZmlsZSAqLworICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiBmaWxlICovCisgICAgaW50IGxpbmVjb3VudDsJCS8qIG51bWJlciBvZiBsaW5lcyByZWFkIHNvIGZhciAqLworICAgIGluY2x1ZGVfdHlwZSB0eXBlOworICAgIGludCBpbmRleDsJCQkvKiBpbmRleCBvZiB0aGlzIGxheWVyICovCisgIH0KK2luY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVTXTsKKworc3RydWN0IGluY2x1ZGVfc3RhY2sgKnNwOworI2RlZmluZSBpc3AgKHNwIC0gaW5jbHVkZV9zdGFjaykKKworLyogSW5jbHVkZSBmaWxlIGxpc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaW5jbHVkZV9wYXRoIAoreworICBzdHJ1Y3QgaW5jbHVkZV9wYXRoICpuZXh0OworICBzYiBwYXRoOworfSAgaW5jbHVkZV9wYXRoOworCitpbmNsdWRlX3BhdGggKnBhdGhzX2hlYWQ7CitpbmNsdWRlX3BhdGggKnBhdGhzX3RhaWw7CisKKworc3RhdGljIHZvaWQgcXVpdCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBoYXNoX25ld190YWJsZSBQQVJBTVMgKChpbnQsIGhhc2hfdGFibGUgKikpOworc3RhdGljIGludCBoYXNoIFBBUkFNUyAoKHNiICopKTsKK3N0YXRpYyBoYXNoX2VudHJ5ICpoYXNoX2NyZWF0ZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICopKTsKK3N0YXRpYyB2b2lkIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICosIHNiICosIGludCkpOworc3RhdGljIHZvaWQgaGFzaF9hZGRfdG9faW50X3RhYmxlIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKiwgaW50KSk7CitzdGF0aWMgaGFzaF9lbnRyeSAqaGFzaF9sb29rdXAgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqKSk7CitzdGF0aWMgdm9pZCBjaGVja2NvbnN0IFBBUkFNUyAoKGludCwgZXhwX3QgKikpOworc3RhdGljIGludCBzYl9zdHJ0b2wgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQsIGludCAqKSk7CitzdGF0aWMgaW50IGxldmVsXzAgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7CitzdGF0aWMgaW50IGxldmVsXzEgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7CitzdGF0aWMgaW50IGxldmVsXzIgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7CitzdGF0aWMgaW50IGxldmVsXzMgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7CitzdGF0aWMgaW50IGxldmVsXzQgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7CitzdGF0aWMgaW50IGxldmVsXzUgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7CitzdGF0aWMgaW50IGV4cF9wYXJzZSBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKK3N0YXRpYyB2b2lkIGV4cF9zdHJpbmcgUEFSQU1TICgoZXhwX3QgKiwgc2IgKikpOworc3RhdGljIGludCBleHBfZ2V0X2FicyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKKyNpZiAwCitzdGF0aWMgdm9pZCBzdHJpcF9jb21tZW50cyBQQVJBTVMgKChzYiAqKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHVuZ2V0IFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgaW5jbHVkZV9idWYgUEFSQU1TICgoc2IgKiwgc2IgKiwgaW5jbHVkZV90eXBlLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSBQQVJBTVMgKChGSUxFICopKTsKK3N0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfbGluZSBQQVJBTVMgKChGSUxFICopKTsKK3N0YXRpYyBpbnQgZ2V0X2xpbmUgUEFSQU1TICgoc2IgKikpOworc3RhdGljIGludCBncmFiX2xhYmVsIFBBUkFNUyAoKHNiICosIHNiICopKTsKK3N0YXRpYyB2b2lkIGNoYW5nZV9iYXNlIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOworc3RhdGljIHZvaWQgZG9fZW5kIFBBUkFNUyAoKHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX2Fzc2lnbiBQQVJBTVMgKChpbnQsIGludCwgc2IgKikpOworc3RhdGljIHZvaWQgZG9fcmFkaXggUEFSQU1TICgoc2IgKikpOworc3RhdGljIGludCBnZXRfb3BzaXplIFBBUkFNUyAoKGludCwgc2IgKiwgaW50ICopKTsKK3N0YXRpYyBpbnQgZW9sIFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIHZvaWQgZG9fZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOworc3RhdGljIHZvaWQgZG9fZGF0YWIgUEFSQU1TICgoaW50LCBzYiAqKSk7CitzdGF0aWMgdm9pZCBkb19hbGlnbiBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX3JlcyBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOworc3RhdGljIHZvaWQgZG9fZXhwb3J0IFBBUkFNUyAoKHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX3ByaW50IFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIHZvaWQgZG9faGVhZGluZyBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX3BhZ2UgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZG9fZm9ybSBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyBpbnQgZ2V0X2FueV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQsIGludCkpOworc3RhdGljIGludCBza2lwX29wZW5wIFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIGludCBza2lwX2Nsb3NlcCBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyBpbnQgZG9sZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7CitzdGF0aWMgaW50IGRvaW5zdHIgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7CitzdGF0aWMgaW50IGRvc3Vic3RyIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOworc3RhdGljIHZvaWQgcHJvY2Vzc19hc3NpZ25zIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOworc3RhdGljIGludCBnZXRfYW5kX3Byb2Nlc3MgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZnJlZV9vbGRfZW50cnkgUEFSQU1TICgoaGFzaF9lbnRyeSAqKSk7CitzdGF0aWMgdm9pZCBkb19hc3NpZ25hIFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIHZvaWQgZG9fYXNzaWduYyBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX3JlZyBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyBpbnQgY29uZGFzc19sb29rdXBfbmFtZSBQQVJBTVMgKChzYiAqLCBpbnQsIHNiICosIGludCkpOworc3RhdGljIGludCB3aGF0Y29uZCBQQVJBTVMgKChpbnQsIHNiICosIGludCAqKSk7CitzdGF0aWMgaW50IGlzdHJ1ZSBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX2FpZiBQQVJBTVMgKChpbnQsIHNiICopKTsKK3N0YXRpYyB2b2lkIGRvX2FlbHNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGRvX2FlbmRpIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgY29uZGFzc19vbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBkb19pZiBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOworc3RhdGljIGludCBnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOworc3RhdGljIHZvaWQgZG9faWZjIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBkb19hZW5kciBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBkb19hd2hpbGUgUEFSQU1TICgoaW50LCBzYiAqKSk7CitzdGF0aWMgdm9pZCBkb19hZW5kdyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBkb19leGl0bSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBkb19hcmVwZWF0IFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIHZvaWQgZG9fZW5kbSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBkb19pcnAgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGRvX2xvY2FsIFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIHZvaWQgZG9fbWFjcm8gUEFSQU1TICgoaW50LCBzYiAqKSk7CitzdGF0aWMgaW50IG1hY3JvX29wIFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIGludCBnZXRzdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7CitzdGF0aWMgdm9pZCBkb19zZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOworc3RhdGljIHZvaWQgZG9fc2RhdGFiIFBBUkFNUyAoKGludCwgc2IgKikpOworc3RhdGljIGludCBuZXdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIGRvX2luY2x1ZGUgUEFSQU1TICgoaW50LCBzYiAqKSk7CitzdGF0aWMgdm9pZCBpbmNsdWRlX3BvcCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IGdldCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IGxpbmVjb3VudCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IGluY2x1ZGVfbmV4dF9pbmRleCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBjaGFydHlwZV9pbml0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19wc2V1ZG9fb3AgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7CitzdGF0aWMgdm9pZCBhZGRfa2V5d29yZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgcHJvY2Vzc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGRvX2RlZmluZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgRkFUQUwoeCkgXAorICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4IDsgZmF0YWxzKys7IHF1aXQoKTsgfSB3aGlsZSgwKSAKKyNkZWZpbmUgRVJST1IoeCkgXAorICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4OyBlcnJvcnMrKzsgfSB3aGlsZSgwKQorI2RlZmluZSBXQVJOSU5HKHgpIFwKKyAgZG8geyBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKHN0ZGVycik7IGZwcmludGYgeDsgd2FybmluZ3MrKzt9IHdoaWxlKDApIAorCisKKworLyogZXhpdCB0aGUgcHJvZ3JhbSBhbmQgcmV0dXJuIHRoZSByaWdodCBFUlJPUiBjb2RlLiAqLworc3RhdGljIHZvaWQKK3F1aXQgKCkKK3sKKyAgaW50IGV4aXRjb2RlOworICBpZiAoZmF0YWxzICsgZXJyb3JzKQorICAgIGV4aXRjb2RlID0gMTsKKyAgZWxzZQorICAgIGV4aXRjb2RlID0gMDsKKworICBpZiAoc3RhdHMpIAorICAgIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNiX21heF9wb3dlcl90d287IGkrKykgCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAic3RyaW5ncyBzaXplICU4ZCA6ICVkXG4iLCAxPDxpLCBzdHJpbmdfY291bnRbaV0pOworCX0KKyAgICB9CisgIGV4aXQgKGV4aXRjb2RlKTsKK30KKworLyogaGFzaCB0YWJsZSBtYWludGVuYW5jZS4gKi8KKworLyogYnVpbGQgYSBuZXcgaGFzaCB0YWJsZSB3aXRoIHNpemUgYnVja2V0cywgYW5kIGZpbGwgaW4gdGhlIGluZm8gYXQgcHRyLiAqLworCitzdGF0aWMgdm9pZAoraGFzaF9uZXdfdGFibGUgKHNpemUsIHB0cikKKyAgICAgaW50IHNpemU7CisgICAgIGhhc2hfdGFibGUgKnB0cjsKK3sKKyAgaW50IGk7CisgIHB0ci0+c2l6ZSA9IHNpemU7CisgIHB0ci0+dGFibGUgPSAoaGFzaF9lbnRyeSAqKikgeG1hbGxvYyAoc2l6ZSAqIChzaXplb2YgKGhhc2hfZW50cnkgKikpKTsKKyAgLyogRmlsbCB3aXRoIG51bGwtcG9pbnRlciwgbm90IHplcm8tYml0LXBhdHRlcm4uICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHB0ci0+dGFibGVbaV0gPSAwOworfQorCisvKiBjYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgc2IgYXQga2V5LiAqLworCitzdGF0aWMgaW50CitoYXNoIChrZXkpCisgICAgIHNiICprZXk7Cit7CisgIGludCBrID0gMHgxMjM0OworICBpbnQgaTsKKyAgY2hhciAqcCA9IGtleS0+cHRyOworICBmb3IgKGkgPSAwOyBpIDwga2V5LT5sZW47IGkrKykKKyAgICB7CisgICAgICBrIF49IChrIDw8IDIpIF4gKnA7CisgICAgICBwKys7CisgICAgfQorICByZXR1cm4gayAmIDB4ZjBmZmY7Cit9CisKKy8qIGxvb2t1cCBrZXkgaW4gaGFzaF90YWJsZSB0YWIsIGlmIHByZXNlbnQsIHRoZW4gcmV0dXJuIGl0LCBvdGhlcndpc2UKKyAgIGJ1aWxkIGEgbmV3IG9uZSBhbmQgZmlsbCBpdCB3aXRoIGhhc2hfaW50ZWdlci4gKi8KKworc3RhdGljCitoYXNoX2VudHJ5ICoKK2hhc2hfY3JlYXRlICh0YWIsIGtleSkKKyAgICAgaGFzaF90YWJsZSAqdGFiOworICAgICBzYiAqa2V5OworeworICBpbnQgayA9IGhhc2ggKGtleSkgJSB0YWItPnNpemU7CisgIGhhc2hfZW50cnkgKnA7CisgIGhhc2hfZW50cnkgKip0YWJsZSA9IHRhYi0+dGFibGU7CisKKyAgcCA9IHRhYmxlW2tdOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmICghcCkKKwl7CisJICBoYXNoX2VudHJ5ICpuID0gKGhhc2hfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChoYXNoX2VudHJ5KSk7CisJICBuLT5uZXh0ID0gdGFibGVba107CisJICBzYl9uZXcgKCZuLT5rZXkpOworCSAgc2JfYWRkX3NiICgmbi0+a2V5LCBrZXkpOworCSAgdGFibGVba10gPSBuOworCSAgbi0+dHlwZSA9IGhhc2hfaW50ZWdlcjsKKwkgIHJldHVybiBuOworCX0KKyAgICAgIGlmIChzdHJuY21wICh0YWJsZVtrXS0+a2V5LnB0ciwga2V5LT5wdHIsIGtleS0+bGVuKSA9PSAwKQorCXsKKwkgIHJldHVybiBwOworCX0KKyAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KK30KKworLyogYWRkIHNiIG5hbWUgd2l0aCBrZXkgaW50byBoYXNoX3RhYmxlIHRhYi4gIGlmIHJlcGxhY2luZyBvbGQgdmFsdWUKKyAgIGFuZCBhZ2FpbiwgdGhlbiBFUlJPUi4gKi8KKworc3RhdGljCit2b2lkCitoYXNoX2FkZF90b19zdHJpbmdfdGFibGUgKHRhYiwga2V5LCBuYW1lLCBhZ2FpbikKKyAgICAgaGFzaF90YWJsZSAqdGFiOworICAgICBzYiAqa2V5OworICAgICBzYiAqbmFtZTsKKyAgICAgaW50IGFnYWluOworeworICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAodGFiLCBrZXkpOworICBpZiAocHRyLT50eXBlID09IGhhc2hfaW50ZWdlcikKKyAgICB7CisgICAgICBzYl9uZXcgKCZwdHItPnZhbHVlLnMpOworICAgIH0KKyAgaWYgKHB0ci0+dmFsdWUucy5sZW4pCisgICAgeworICAgICAgaWYgKCFhZ2FpbikKKwlFUlJPUiAoKHN0ZGVyciwgXygicmVkZWZpbml0aW9uIG5vdCBhbGxvd2VkXG4iKSkpOworICAgIH0KKworICBwdHItPnR5cGUgPSBoYXNoX3N0cmluZzsKKyAgc2JfcmVzZXQgKCZwdHItPnZhbHVlLnMpOworICAKKyAgc2JfYWRkX3NiICgmcHRyLT52YWx1ZS5zLCBuYW1lKTsKK30KKworLyogYWRkIGludGVnZXIgbmFtZSB0byBoYXNoX3RhYmxlIHRhYiB3aXRoIHNiIGtleS4gKi8KKworc3RhdGljCit2b2lkCitoYXNoX2FkZF90b19pbnRfdGFibGUgKHRhYiwga2V5LCBuYW1lKQorICAgICBoYXNoX3RhYmxlICp0YWI7CisgICAgIHNiICprZXk7CisgICAgIGludCBuYW1lOworeworICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAodGFiLCBrZXkpOworICBwdHItPnZhbHVlLmkgPSBuYW1lOworfQorCisvKiBsb29rdXAgc2Iga2V5IGluIGhhc2hfdGFibGUgdGFiLiAgaWYgZm91bmQgcmV0dXJuIGhhc2hfZW50cnkgcmVzdWx0LAorICAgZWxzZSAwLiAqLworICAgCitzdGF0aWMKK2hhc2hfZW50cnkgKgoraGFzaF9sb29rdXAgKHRhYiwga2V5KQorICAgICBoYXNoX3RhYmxlICp0YWI7CisgICAgIHNiICprZXk7Cit7CisgIGludCBrID0gaGFzaCAoa2V5KSAlIHRhYi0+c2l6ZTsKKyAgaGFzaF9lbnRyeSAqKnRhYmxlID0gdGFiLT50YWJsZTsKKyAgaGFzaF9lbnRyeSAqcCA9IHRhYmxlW2tdOworICB3aGlsZSAocCkKKyAgICB7CisgICAgICBpZiAocC0+a2V5LmxlbiA9PSBrZXktPmxlbgorCSAgJiYgc3RybmNtcCAocC0+a2V5LnB0ciwga2V5LT5wdHIsIGtleS0+bGVuKSA9PSAwKQorCXJldHVybiBwOworICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBleHByZXNzaW9ucworCisgICBhcmUgaGFuZGxlZCBpbiBhIHJlYWxseSBzaW1wbGUgcmVjdXJzaXZlIGRlY2VudCB3YXkuIGVhY2ggYml0IG9mCisgICB0aGUgbWFjaGluZSB0YWtlcyBhbiBpbmRleCBpbnRvIGFuIHNiIGFuZCBhIHBvaW50ZXIgdG8gYW4gZXhwX3QsCisgICBtb2RpZmllcyB0aGUgKmV4cF90IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICBwYXN0IHRoZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uIHBhcnNlZC4KKworIGV4cHJlc3Npb24gcHJlY2VkZW5jZToKKyAgKCApCisgdW5hcnkgKyAtIH4KKyAgKiAvCisgICsgLQorICAmCisgIHwgfgorCisqLworCisKKy8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHBfdCBhdCB0ZXJtIGlzIGNvbnN0YW50LCBpZiBub3QgdGhlIGdpdmUgdGhlIG9wIEVSUk9SLiAqLworCitzdGF0aWMKK3ZvaWQKK2NoZWNrY29uc3QgKG9wLCB0ZXJtKQorICAgICBpbnQgb3A7CisgICAgIGV4cF90ICp0ZXJtOworeworICBpZiAodGVybS0+YWRkX3N5bWJvbC5sZW4KKyAgICAgIHx8IHRlcm0tPnN1Yl9zeW1ib2wubGVuKQorICAgIHsKKyAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJ0aGUgJWMgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy5cbiIpLCBvcCkpOworICAgIH0KK30KKworLyogdHVybiB0aGUgbnVtYmVyIGluIHN0cmluZyBhdCBpZHggaW50byBhIG51bWJlciBvZiBiYXNlLAorICAgZmlsbCBpbiBwdHIgYW5kIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBub3QgaW4gdGhlCisgICBudW1iZXIuICovCisKK3N0YXRpYworaW50CitzYl9zdHJ0b2wgKGlkeCwgc3RyaW5nLCBiYXNlLCBwdHIpCisgICAgIGludCBpZHg7CisgICAgIHNiICpzdHJpbmc7CisgICAgIGludCBiYXNlOworICAgICBpbnQgKnB0cjsKK3sKKyAgaW50IHZhbHVlID0gMDsKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOworCisgIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbikKKyAgICB7CisgICAgICBpbnQgY2ggPSBzdHJpbmctPnB0cltpZHhdOworICAgICAgaW50IGRpZyA9IDA7CisgICAgICBpZiAoaXNkaWdpdCAoY2gpKQorCWRpZyA9IGNoIC0gJzAnOworICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwlkaWcgPSBjaCAtICdhJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKKwlkaWcgPSBjaCAtICdBJyArIDEwOworICAgICAgZWxzZQorCWJyZWFrOworCisgICAgICBpZiAoZGlnID49IGJhc2UpCisJYnJlYWs7CisKKyAgICAgIHZhbHVlID0gdmFsdWUgKiBiYXNlICsgZGlnOworICAgICAgaWR4Kys7CisgICAgfQorICAqcHRyID0gdmFsdWU7CisgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQKK2xldmVsXzAgKGlkeCwgc3RyaW5nLCBsaHMpCisgICAgIGludCBpZHg7CisgICAgIHNiICpzdHJpbmc7CisgICAgIGV4cF90ICpsaHM7Cit7CisgIGxocy0+YWRkX3N5bWJvbC5sZW4gPSAwOworICBsaHMtPmFkZF9zeW1ib2wubmFtZSA9IDA7CisKKyAgbGhzLT5zdWJfc3ltYm9sLmxlbiA9IDA7CisgIGxocy0+c3ViX3N5bWJvbC5uYW1lID0gMDsKKworICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7CisKKyAgbGhzLT52YWx1ZSA9IDA7CisKKyAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzdHJpbmctPnB0cltpZHhdKSkKKyAgICB7CisgICAgICBpZHggPSBzYl9zdHJ0b2wgKGlkeCwgc3RyaW5nLCAxMCwgJmxocy0+dmFsdWUpOworICAgIH0KKyAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKHN0cmluZy0+cHRyW2lkeF0pKQorICAgIHsKKyAgICAgIGludCBsZW4gPSAwOworICAgICAgbGhzLT5hZGRfc3ltYm9sLm5hbWUgPSBzdHJpbmctPnB0ciArIGlkeDsKKyAgICAgIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbiAmJiBJU05FWFRDSEFSIChzdHJpbmctPnB0cltpZHhdKSkKKwl7CisJICBpZHgrKzsKKwkgIGxlbisrOworCX0KKyAgICAgIGxocy0+YWRkX3N5bWJvbC5sZW4gPSBsZW47CisgICAgfQorICBlbHNlIGlmIChzdHJpbmctPnB0cltpZHhdID09ICciJykKKyAgICB7CisgICAgICBzYiBhY2M7CisgICAgICBzYl9uZXcgKCZhY2MpOworICAgICAgRVJST1IgKChzdGRlcnIsIF8oInN0cmluZyB3aGVyZSBleHByZXNzaW9uIGV4cGVjdGVkLlxuIikpKTsKKyAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBzdHJpbmcsICZhY2MpOworICAgICAgc2Jfa2lsbCAoJmFjYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRVJST1IgKChzdGRlcnIsIF8oImNhbid0IGZpbmQgcHJpbWFyeSBpbiBleHByZXNzaW9uLlxuIikpKTsKKyAgICAgIGlkeCsrOworICAgIH0KKyAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKK30KKworCisKK3N0YXRpYyBpbnQKK2xldmVsXzEgKGlkeCwgc3RyaW5nLCBsaHMpCisgICAgIGludCBpZHg7CisgICAgIHNiICpzdHJpbmc7CisgICAgIGV4cF90ICpsaHM7Cit7CisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKKworICBzd2l0Y2ggKHN0cmluZy0+cHRyW2lkeF0pCisgICAgeworICAgIGNhc2UgJysnOgorICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4ICsgMSwgc3RyaW5nLCBsaHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnfic6CisgICAgICBpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7CisgICAgICBjaGVja2NvbnN0ICgnficsIGxocyk7CisgICAgICBsaHMtPnZhbHVlID0gfmxocy0+dmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICctJzoKKyAgICAgIHsKKwlzeW1ib2wgdDsKKwlpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7CisJbGhzLT52YWx1ZSA9IC1saHMtPnZhbHVlOworCXQgPSBsaHMtPmFkZF9zeW1ib2w7CisJbGhzLT5hZGRfc3ltYm9sID0gbGhzLT5zdWJfc3ltYm9sOworCWxocy0+c3ViX3N5bWJvbCA9IHQ7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAnKCc6CisgICAgICBpZHgrKzsKKyAgICAgIGlkeCA9IGxldmVsXzUgKHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKSwgc3RyaW5nLCBsaHMpOworICAgICAgaWYgKHN0cmluZy0+cHRyW2lkeF0gIT0gJyknKQorCUVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgY2xvc2luZyBwYXJlbnMuXG4iKSkpOworICAgICAgZWxzZQorCWlkeCsrOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlkeCA9IGxldmVsXzAgKGlkeCwgc3RyaW5nLCBsaHMpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOworfQorCitzdGF0aWMgaW50CitsZXZlbF8yIChpZHgsIHN0cmluZywgbGhzKQorICAgICBpbnQgaWR4OworICAgICBzYiAqc3RyaW5nOworICAgICBleHBfdCAqbGhzOworeworICBleHBfdCByaHM7CisKKyAgaWR4ID0gbGV2ZWxfMSAoaWR4LCBzdHJpbmcsIGxocyk7CisKKyAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmIChzdHJpbmctPnB0cltpZHhdID09ICcqJworCQkJICAgICAgIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJy8nKSkKKyAgICB7CisgICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOworICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4LCBzdHJpbmcsICZyaHMpOworICAgICAgc3dpdGNoIChvcCkKKwl7CisJY2FzZSAnKic6CisJICBjaGVja2NvbnN0ICgnKicsIGxocyk7CisJICBjaGVja2NvbnN0ICgnKicsICZyaHMpOworCSAgbGhzLT52YWx1ZSAqPSByaHMudmFsdWU7CisJICBicmVhazsKKwljYXNlICcvJzoKKwkgIGNoZWNrY29uc3QgKCcvJywgbGhzKTsKKwkgIGNoZWNrY29uc3QgKCcvJywgJnJocyk7CisJICBpZiAocmhzLnZhbHVlID09IDApCisJICAgIEVSUk9SICgoc3RkZXJyLCBfKCJhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvLlxuIikpKTsKKwkgIGVsc2UKKwkgICAgbGhzLT52YWx1ZSAvPSByaHMudmFsdWU7CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOworfQorCisKK3N0YXRpYyBpbnQKK2xldmVsXzMgKGlkeCwgc3RyaW5nLCBsaHMpCisgICAgIGludCBpZHg7CisgICAgIHNiICpzdHJpbmc7CisgICAgIGV4cF90ICpsaHM7Cit7CisgIGV4cF90IHJoczsKKworICBpZHggPSBsZXZlbF8yIChpZHgsIHN0cmluZywgbGhzKTsKKworICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4KKwkgJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJysnCisJICAgICB8fCBzdHJpbmctPnB0cltpZHhdID09ICctJykpCisgICAgeworICAgICAgY2hhciBvcCA9IHN0cmluZy0+cHRyW2lkeCsrXTsKKyAgICAgIGlkeCA9IGxldmVsXzIgKGlkeCwgc3RyaW5nLCAmcmhzKTsKKyAgICAgIHN3aXRjaCAob3ApCisJeworCWNhc2UgJysnOgorCSAgbGhzLT52YWx1ZSArPSByaHMudmFsdWU7CisJICBpZiAobGhzLT5hZGRfc3ltYm9sLm5hbWUgJiYgcmhzLmFkZF9zeW1ib2wubmFtZSkKKwkgICAgeworCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJjYW4ndCBhZGQgdHdvIHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zXG4iKSkpOworCSAgICB9CisJICAvKiBjaGFuZ2Ugbm4rc3ltYm9sIHRvIHN5bWJvbCArIG5uICovCisJICBpZiAocmhzLmFkZF9zeW1ib2wubmFtZSkKKwkgICAgeworCSAgICAgIGxocy0+YWRkX3N5bWJvbCA9IHJocy5hZGRfc3ltYm9sOworCSAgICB9CisJICBicmVhazsKKwljYXNlICctJzoKKwkgIGxocy0+dmFsdWUgLT0gcmhzLnZhbHVlOworCSAgbGhzLT5zdWJfc3ltYm9sID0gcmhzLmFkZF9zeW1ib2w7CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOworfQorCitzdGF0aWMgaW50CitsZXZlbF80IChpZHgsIHN0cmluZywgbGhzKQorICAgICBpbnQgaWR4OworICAgICBzYiAqc3RyaW5nOworICAgICBleHBfdCAqbGhzOworeworICBleHBfdCByaHM7CisKKyAgaWR4ID0gbGV2ZWxfMyAoaWR4LCBzdHJpbmcsIGxocyk7CisKKyAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmCisJIHN0cmluZy0+cHRyW2lkeF0gPT0gJyYnKQorICAgIHsKKyAgICAgIGNoYXIgb3AgPSBzdHJpbmctPnB0cltpZHgrK107CisgICAgICBpZHggPSBsZXZlbF8zIChpZHgsIHN0cmluZywgJnJocyk7CisgICAgICBzd2l0Y2ggKG9wKQorCXsKKwljYXNlICcmJzoKKwkgIGNoZWNrY29uc3QgKCcmJywgbGhzKTsKKwkgIGNoZWNrY29uc3QgKCcmJywgJnJocyk7CisJICBsaHMtPnZhbHVlICY9IHJocy52YWx1ZTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Cit9CisKK3N0YXRpYyBpbnQKK2xldmVsXzUgKGlkeCwgc3RyaW5nLCBsaHMpCisgICAgIGludCBpZHg7CisgICAgIHNiICpzdHJpbmc7CisgICAgIGV4cF90ICpsaHM7Cit7CisgIGV4cF90IHJoczsKKworICBpZHggPSBsZXZlbF80IChpZHgsIHN0cmluZywgbGhzKTsKKworICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4KKwkgJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJ3wnIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJ34nKSkKKyAgICB7CisgICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOworICAgICAgaWR4ID0gbGV2ZWxfNCAoaWR4LCBzdHJpbmcsICZyaHMpOworICAgICAgc3dpdGNoIChvcCkKKwl7CisJY2FzZSAnfCc6CisJICBjaGVja2NvbnN0ICgnfCcsIGxocyk7CisJICBjaGVja2NvbnN0ICgnfCcsICZyaHMpOworCSAgbGhzLT52YWx1ZSB8PSByaHMudmFsdWU7CisJICBicmVhazsKKwljYXNlICd+JzoKKwkgIGNoZWNrY29uc3QgKCd+JywgbGhzKTsKKwkgIGNoZWNrY29uc3QgKCd+JywgJnJocyk7CisJICBsaHMtPnZhbHVlIF49IHJocy52YWx1ZTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Cit9CisKKworLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHN0cmluZywgZmlsbCB1cCByZXMgd2l0aAorICAgdGhlIHJlc3VsdC4gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhciBwYXN0IHRoZSBleHByZXNzaW9uLgorICAgKi8KKworc3RhdGljIGludAorZXhwX3BhcnNlIChpZHgsIHN0cmluZywgcmVzKQorICAgICBpbnQgaWR4OworICAgICBzYiAqc3RyaW5nOworICAgICBleHBfdCAqcmVzOworeworICByZXR1cm4gbGV2ZWxfNSAoc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpLCBzdHJpbmcsIHJlcyk7Cit9CisKKworLyogdHVybiB0aGUgZXhwcmVzc2lvbiBhdCBleHAgaW50byB0ZXh0IGFuZCBnbHVlIGl0IG9udG8gdGhlIGVuZCBvZgorICAgc3RyaW5nLiAqLworCitzdGF0aWMgdm9pZAorZXhwX3N0cmluZyAoZXhwLCBzdHJpbmcpCisgICAgIGV4cF90ICpleHA7CisgICAgIHNiICpzdHJpbmc7Cit7CisgIGludCBucCA9IDA7CisgIGludCBhZCA9IDA7CisgIHNiX3Jlc2V0IChzdHJpbmcpOworCisgIGlmIChleHAtPmFkZF9zeW1ib2wubGVuKQorICAgIHsKKyAgICAgIHNiX2FkZF9idWZmZXIgKHN0cmluZywgZXhwLT5hZGRfc3ltYm9sLm5hbWUsIGV4cC0+YWRkX3N5bWJvbC5sZW4pOworICAgICAgbnAgPSAxOworICAgICAgYWQgPSAxOworICAgIH0KKyAgaWYgKGV4cC0+dmFsdWUpCisgICAgeworICAgICAgY2hhciBidWZbMjBdOworICAgICAgaWYgKG5wKQorCXNiX2FkZF9jaGFyIChzdHJpbmcsICcrJyk7CisgICAgICBzcHJpbnRmIChidWYsICIlZCIsIGV4cC0+dmFsdWUpOworICAgICAgc2JfYWRkX3N0cmluZyAoc3RyaW5nLCBidWYpOworICAgICAgbnAgPSAxOworICAgICAgYWQgPSAxOworICAgIH0KKyAgaWYgKGV4cC0+c3ViX3N5bWJvbC5sZW4pCisgICAgeworICAgICAgc2JfYWRkX2NoYXIgKHN0cmluZywgJy0nKTsKKyAgICAgIHNiX2FkZF9idWZmZXIgKHN0cmluZywgZXhwLT5hZGRfc3ltYm9sLm5hbWUsIGV4cC0+YWRkX3N5bWJvbC5sZW4pOworICAgICAgbnAgPSAwOworICAgICAgYWQgPSAxOworICAgIH0KKworICBpZiAoIWFkKQorICAgIHNiX2FkZF9jaGFyIChzdHJpbmcsICcwJyk7Cit9CisKKworLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHNiIGluLCByZXR1cm4gdGhlIHZhbHVlIGluIHZhbC4gIAorICAgaWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50LCBnaXZlIEVSUk9SIGVtc2cuICByZXR1cm5zIHRoZSBpbmRleAorICAgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBwYXN0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24uICovCisKK3N0YXRpYyBpbnQKK2V4cF9nZXRfYWJzIChlbXNnLCBpZHgsIGluLCB2YWwpCisgICAgIGNvbnN0IGNoYXIgKmVtc2c7CisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgaW50ICp2YWw7Cit7CisgIGV4cF90IHJlczsKKyAgaWR4ID0gZXhwX3BhcnNlIChpZHgsIGluLCAmcmVzKTsKKyAgaWYgKHJlcy5hZGRfc3ltYm9sLmxlbiB8fCByZXMuc3ViX3N5bWJvbC5sZW4pCisgICAgRVJST1IgKChzdGRlcnIsIGVtc2cpKTsKKyAgKnZhbCA9IHJlcy52YWx1ZTsKKyAgcmV0dXJuIGlkeDsKK30KKworCitzYiBsYWJlbDsgLyogY3VycmVudCBsYWJlbCBwYXJzZWQgZnJvbSBsaW5lICovCitoYXNoX3RhYmxlIGFzc2lnbl9oYXNoX3RhYmxlOyAgIC8qIGhhc2ggdGFibGUgZm9yIGFsbCBhc3NpZ25lZCB2YXJpYWJsZXMgKi8KK2hhc2hfdGFibGUga2V5d29yZF9oYXNoX3RhYmxlOyAgLyogaGFzaCB0YWJsZSBmb3Iga2V5d29yZCAqLworaGFzaF90YWJsZSB2YXJzOyAgLyogaGFzaCB0YWJsZSBmb3IgIGVxIHZhcmlhYmxlcyAqLworCisjZGVmaW5lIGluX2NvbW1lbnQgJzsnCisKKyNpZiAwCitzdGF0aWMgdm9pZAorc3RyaXBfY29tbWVudHMgKG91dCkKKyAgICAgc2IgKm91dDsKK3sKKyAgY2hhciAqcyA9IG91dC0+cHRyOworICBpbnQgaSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBvdXQtPmxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChJU0NPTU1FTlRDSEFSKHNbaV0pKQorCXsKKwkgIG91dC0+bGVuID0gaTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorfQorI2VuZGlmCisKKy8qIHB1c2ggYmFjayBjaGFyYWN0ZXIgY2ggc28gdGhhdCBpdCBjYW4gYmUgcmVhZCBhZ2Fpbi4gKi8KKworc3RhdGljIHZvaWQKK3VuZ2V0IChjaCkKKyAgICAgaW50IGNoOworeworICBpZiAoY2ggPT0gJ1xuJykKKyAgICB7CisgICAgICBzcC0+bGluZWNvdW50LS07CisgICAgfQorICBpZiAoc3AtPnB1c2hiYWNrX2luZGV4KQorICAgIHNwLT5wdXNoYmFja19pbmRleC0tOworICBlbHNlCisgICAgc2JfYWRkX2NoYXIgKCZzcC0+cHVzaGJhY2ssIGNoKTsKK30KKworLyogcHVzaCB0aGUgc2IgcHRyIG9udG8gdGhlIGluY2x1ZGUgc3RhY2ssIHdpdGggdGhlIGdpdmVuIG5hbWUsIHR5cGUgYW5kIGluZGV4LiAqLworCitzdGF0aWMKK3ZvaWQKK2luY2x1ZGVfYnVmIChuYW1lLCBwdHIsIHR5cGUsIGluZGV4KQorICAgICBzYiAqbmFtZTsKKyAgICAgc2IgKnB0cjsKKyAgICAgaW5jbHVkZV90eXBlIHR5cGU7CisgICAgIGludCBpbmRleDsKK3sKKyAgc3ArKzsKKyAgaWYgKHNwIC0gaW5jbHVkZV9zdGFjayA+PSBNQVhfSU5DTFVERVMpCisgICAgRkFUQUwgKChzdGRlcnIsIF8oInVucmVhc29uYWJsZSBuZXN0aW5nLlxuIikpKTsKKyAgc2JfbmV3ICgmc3AtPm5hbWUpOworICBzYl9hZGRfc2IgKCZzcC0+bmFtZSwgbmFtZSk7CisgIHNwLT5oYW5kbGUgPSAwOworICBzcC0+bGluZWNvdW50ID0gMTsKKyAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKKyAgc3AtPnR5cGUgPSB0eXBlOworICBzcC0+aW5kZXggPSBpbmRleDsKKyAgc2JfbmV3ICgmc3AtPnB1c2hiYWNrKTsKKyAgc2JfYWRkX3NiICgmc3AtPnB1c2hiYWNrLCBwdHIpOworfQorCisKKy8qIHVzZWQgaW4gRVJST1IgbWVzc2FnZXMsIHByaW50IGluZm8gb24gd2hlcmUgdGhlIGluY2x1ZGUgc3RhY2sgaXMgb250byBmaWxlLiAqLworc3RhdGljIAordm9pZAoraW5jbHVkZV9wcmludF93aGVyZV9saW5lIChmaWxlKQorICAgICBGSUxFICpmaWxlOworeworICBzdHJ1Y3QgaW5jbHVkZV9zdGFjayAqcCA9IGluY2x1ZGVfc3RhY2sgKyAxOworCisgIHdoaWxlIChwIDw9IHNwKQorICAgIHsKKyAgICAgIGZwcmludGYgKGZpbGUsICIlczolZCAiLCBzYl9uYW1lICgmcC0+bmFtZSksIHAtPmxpbmVjb3VudCAtIDEpOworICAgICAgcCsrOworICAgIH0KK30KKworLyogdXNlZCBpbiBsaXN0aW5ncywgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIG9udG8gZmlsZS4gKi8KK3N0YXRpYyB2b2lkCitpbmNsdWRlX3ByaW50X2xpbmUgKGZpbGUpCisgICAgIEZJTEUgKmZpbGU7Cit7CisgIGludCBuOworICBzdHJ1Y3QgaW5jbHVkZV9zdGFjayAqcCA9IGluY2x1ZGVfc3RhY2sgKyAxOworCisgIG4gPSBmcHJpbnRmIChmaWxlLCAiJTRkIiwgcC0+bGluZWNvdW50KTsKKyAgcCsrOworICB3aGlsZSAocCA8PSBzcCkKKyAgICB7CisgICAgICBuICs9IGZwcmludGYgKGZpbGUsICIuJWQiLCBwLT5saW5lY291bnQpOworICAgICAgcCsrOworICAgIH0KKyAgd2hpbGUgKG4gPCA4ICogMykKKyAgICB7CisgICAgICBmcHJpbnRmIChmaWxlLCAiICIpOworICAgICAgbisrOworICAgIH0KK30KKworCisvKiByZWFkIGEgbGluZSBmcm9tIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgaW50byBzYiBpbi4gKi8KKworc3RhdGljIGludAorZ2V0X2xpbmUgKGluKQorICAgICBzYiAqaW47Cit7CisgIGludCBvbmxpbmUgPSAwOworICBpbnQgbW9yZSA9IDE7CisKKyAgaWYgKGNvcHlzb3VyY2UpCisgICAgeworICAgICAgcHV0YyAoY29tbWVudF9jaGFyLCBvdXRmaWxlKTsKKyAgICAgIGlmIChwcmludF9saW5lX251bWJlcikKKwlpbmNsdWRlX3ByaW50X2xpbmUgKG91dGZpbGUpOworICAgIH0KKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgY2ggPSBnZXQgKCk7CisKKyAgICAgIHdoaWxlIChjaCA9PSAnXHInKQorCWNoID0gZ2V0ICgpOworCisgICAgICBpZiAoY2ggPT0gRU9GKQorCXsKKwkgIGlmIChvbmxpbmUpCisJICAgIHsKKwkgICAgICBXQVJOSU5HICgoc3RkZXJyLCBfKCJFbmQgb2YgZmlsZSBub3QgYXQgc3RhcnQgb2YgbGluZS5cbiIpKSk7CisJICAgICAgaWYgKGNvcHlzb3VyY2UpCisJCXB1dGMgKCdcbicsIG91dGZpbGUpOworCSAgICAgIGNoID0gJ1xuJzsKKwkgICAgfQorCSAgZWxzZQorCSAgICBtb3JlID0gMDsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKGNvcHlzb3VyY2UpCisJeworCSAgcHV0YyAoY2gsIG91dGZpbGUpOworCX0KKworICAgICAgaWYgKGNoID09ICdcbicpCisJeworCSAgY2ggPSBnZXQgKCk7CisJICBvbmxpbmUgPSAwOworCSAgaWYgKGNoID09ICcrJykKKwkgICAgeworCSAgICAgIC8qIGNvbnRpbnVlZCBsaW5lICovCisJICAgICAgaWYgKGNvcHlzb3VyY2UpCisJCXsKKwkJICBwdXRjIChjb21tZW50X2NoYXIsIG91dGZpbGUpOworCQkgIHB1dGMgKCcrJywgb3V0ZmlsZSk7CisJCX0KKwkgICAgICBjaCA9IGdldCAoKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGNoICE9IEVPRikKKwkJdW5nZXQgKGNoKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBzYl9hZGRfY2hhciAoaW4sIGNoKTsKKwl9CisgICAgICBvbmxpbmUrKzsKKyAgICB9CisKKyAgcmV0dXJuIG1vcmU7Cit9CisKKy8qIGZpbmQgYSBsYWJlbCBmcm9tIHNiIGluIGFuZCBwdXQgaXQgaW4gb3V0LiAqLworCitzdGF0aWMgaW50CitncmFiX2xhYmVsIChpbiwgb3V0KQorICAgICBzYiAqaW47CisgICAgIHNiICpvdXQ7Cit7CisgIGludCBpID0gMDsKKyAgc2JfcmVzZXQgKG91dCk7CisgIGlmIChJU0ZJUlNUQ0hBUiAoaW4tPnB0cltpXSkgfHwgaW4tPnB0cltpXSA9PSAnXFwnKQorICAgIHsKKyAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaV0pOworICAgICAgaSsrOworICAgICAgd2hpbGUgKChJU05FWFRDSEFSIChpbi0+cHRyW2ldKSAKKwkgICAgICB8fCBpbi0+cHRyW2ldID09ICdcXCcKKwkgICAgICB8fCBpbi0+cHRyW2ldID09ICcmJykgCisJICAgICAmJiBpIDwgaW4tPmxlbikKKwl7CisJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2ldKTsKKwkgIGkrKzsKKwl9CisgICAgfQorICByZXR1cm4gaTsKK30KKworLyogZmluZCBhbGwgc3RyYW5nZSBiYXNlIHN0dWZmIGFuZCB0dXJuIGludG8gZGVjaW1hbC4gYWxzbworICAgZmluZCBhbGwgdGhlIG90aGVyIG51bWJlcnMgYW5kIGNvbnZlcnQgdGhlbSBmcm9tIHRoZSBkZWZhdWx0IHJhZGl4ICovCisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfYmFzZSAoaWR4LCBpbiwgb3V0KQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIHNiICpvdXQ7Cit7CisgIGNoYXIgYnVmZmVyWzIwXTsKKworICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKKyAgICB7CisgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKKwkgICYmIGlkeCArIDEgPCBpbi0+bGVuCisJICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKKwl7CisJICBpZHggKz0gMjsKKwkgIHdoaWxlIChpZHggPCBpbi0+bGVuCisJCSAmJiBpbi0+cHRyW2lkeF0gIT0gJyknKQorCSAgICB7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKKwkgICAgICBpZHgrKzsKKwkgICAgfQorCSAgaWYgKGlkeCA8IGluLT5sZW4pCisJICAgIGlkeCsrOworCX0KKyAgICAgIGVsc2UgaWYgKGlkeCA8IGluLT5sZW4gLSAxICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJ1wnJyAmJiAhIG1yaSkKKwl7CisJICBpbnQgYmFzZTsKKwkgIGludCB2YWx1ZTsKKwkgIHN3aXRjaCAoaW4tPnB0cltpZHhdKQorCSAgICB7CisJICAgIGNhc2UgJ2InOgorCSAgICBjYXNlICdCJzoKKwkgICAgICBiYXNlID0gMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAncSc6CisJICAgIGNhc2UgJ1EnOgorCSAgICAgIGJhc2UgPSA4OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdoJzoKKwkgICAgY2FzZSAnSCc6CisJICAgICAgYmFzZSA9IDE2OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdkJzoKKwkgICAgY2FzZSAnRCc6CisJICAgICAgYmFzZSA9IDEwOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJJbGxlZ2FsIGJhc2UgY2hhcmFjdGVyICVjLlxuIiksIGluLT5wdHJbaWR4XSkpOworCSAgICAgIGJhc2UgPSAxMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBpZHggPSBzYl9zdHJ0b2wgKGlkeCArIDIsIGluLCBiYXNlLCAmdmFsdWUpOworCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCB2YWx1ZSk7CisJICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7CisJfQorICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCisJeworCSAgLyogY29weSBlbnRpcmUgbmFtZXMgdGhyb3VnaCBxdWlja2x5ICovCisJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOworCSAgaWR4Kys7CisJICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBJU05FWFRDSEFSIChpbi0+cHRyW2lkeF0pKQorCSAgICB7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKKwkgICAgICBpZHgrKzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQorCXsKKwkgIGludCB2YWx1ZTsKKwkgIC8qIGFsbCBudW1iZXJzIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LCBsZXQncyBjaGV3IGl0IGFuZAorCSAgICAgc3BpdCBvdXQgZGVjaW1hbCAqLworCSAgaWR4ID0gc2Jfc3RydG9sIChpZHgsIGluLCByYWRpeCwgJnZhbHVlKTsKKwkgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgdmFsdWUpOworCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOworCisJICAvKiBza2lwIGFsbCB1bmRpZ3Nlc3RlZCBsZXR0ZXJzICovCisJICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBJU05FWFRDSEFSIChpbi0+cHRyW2lkeF0pKQorCSAgICB7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKKwkgICAgICBpZHgrKzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCisJeworCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKKwkgIC8qIGNvcHkgZW50aXJlIG5hbWVzIHRocm91Z2ggcXVpY2tseSAqLworCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKKwkgIGlkeCsrOworCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IHRjaGFyKQorCSAgICB7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKKwkgICAgICBpZHgrKzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBub3RoaW5nIHNwZWNpYWwsIGp1c3QgcGFzcyBpdCB0aHJvdWdoICovCisJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOworCSAgaWR4Kys7CisJfQorICAgIH0KKworfQorCisvKiAuZW5kICovCitzdGF0aWMgdm9pZAorZG9fZW5kIChpbikKKyAgICAgc2IgKmluOworeworICBoYWRfZW5kID0gMTsKKyAgaWYgKG1yaSkKKyAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKGluKSk7Cit9CisKKy8qIC5hc3NpZ24gKi8KKworc3RhdGljIHZvaWQKK2RvX2Fzc2lnbiAoYWdhaW4sIGlkeCwgaW4pCisgICAgIGludCBhZ2FpbjsKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworeworICAvKiBzdGljayBsYWJlbCBpbiBzeW1ib2wgdGFibGUgd2l0aCBmb2xsb3dpbmcgdmFsdWUgKi8KKyAgZXhwX3QgZTsKKyAgc2IgYWNjOworCisgIHNiX25ldyAoJmFjYyk7CisgIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOworICBleHBfc3RyaW5nICgmZSwgJmFjYyk7CisgIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmbGFiZWwsICZhY2MsIGFnYWluKTsKKyAgc2Jfa2lsbCAoJmFjYyk7Cit9CisKKworLyogLnJhZGl4IFtifHF8ZHxoXSAqLworCitzdGF0aWMKK3ZvaWQKK2RvX3JhZGl4IChwdHIpCisgICAgIHNiICpwdHI7Cit7CisgIGludCBpZHggPSBzYl9za2lwX3doaXRlICgwLCBwdHIpOworICBzd2l0Y2ggKHB0ci0+cHRyW2lkeF0pCisgICAgeworICAgIGNhc2UgJ0InOgorICAgIGNhc2UgJ2InOgorICAgICAgcmFkaXggPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncSc6CisgICAgY2FzZSAnUSc6CisgICAgICByYWRpeCA9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICdEJzoKKyAgICAgIHJhZGl4ID0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICBjYXNlICdIJzoKKyAgICAgIHJhZGl4ID0gMTY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJST1IgKChzdGRlcnIsIF8oInJhZGl4IGlzICVjIG11c3QgYmUgb25lIG9mIGIsIHEsIGQgb3IgaCIpLCByYWRpeCkpOworICAgIH0KK30KKworCisvKiBQYXJzZSBvZmYgYSAuYiwgLncgb3IgLmwgKi8KKworc3RhdGljIGludAorZ2V0X29wc2l6ZSAoaWR4LCBpbiwgc2l6ZSkKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBpbnQgKnNpemU7Cit7CisgICpzaXplID0gNDsKKyAgaWYgKGluLT5wdHJbaWR4XSA9PSAnLicpCisgICAgeworICAgICAgaWR4Kys7CisgICAgfQorICBzd2l0Y2ggKGluLT5wdHJbaWR4XSkKKyAgICB7CisgICAgY2FzZSAnYic6CisgICAgY2FzZSAnQic6CisgICAgICAqc2l6ZSA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICBjYXNlICdXJzoKKyAgICAgICpzaXplID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgJ0wnOgorICAgICAgKnNpemUgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnXHQnOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJzaXplIG11c3QgYmUgb25lIG9mIGIsIHcgb3IgbCwgaXMgJWMuXG4iKSwgaW4tPnB0cltpZHhdKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIGlkeCsrOworCisgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyAKK2ludCBlb2woaWR4LCBsaW5lKQorICAgICBpbnQgaWR4OworICAgICBzYiAqbGluZTsKK3sKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBsaW5lKTsKKyAgaWYgKGlkeCA8IGxpbmUtPmxlbiAKKyAgICAgICYmIElTQ09NTUVOVENIQVIobGluZS0+cHRyW2lkeF0pKQorICAgIHJldHVybiAxOworICBpZiAoaWR4ID49IGxpbmUtPmxlbikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIC5kYXRhIFsuYnwud3wubF0gPGRhdGE+KiAKKyAgICBvciBkW2J3bF0gPGRhdGE+KiAqLworCitzdGF0aWMgdm9pZAorZG9fZGF0YSAoaWR4LCBpbiwgc2l6ZSkKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IG9wc2l6ZSA9IDQ7CisgIGNoYXIgKm9wbmFtZSA9ICIueWlrZXMhIjsKKyAgc2IgYWNjOworICBzYl9uZXcgKCZhY2MpOworCisgIGlmICghc2l6ZSkgCisgICAgeworICAgICAgaWR4ID0gZ2V0X29wc2l6ZSAoaWR4LCBpbiwgJm9wc2l6ZSk7CisgICAgfQorICBlbHNlIHsKKyAgICBvcHNpemUgPSBzaXplOworICB9CisgIHN3aXRjaCAob3BzaXplKQorICAgIHsKKyAgICBjYXNlIDQ6CisgICAgICBvcG5hbWUgPSAiLmxvbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgb3BuYW1lID0gIi5zaG9ydCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBvcG5hbWUgPSAiLmJ5dGUiOworICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgZnByaW50ZiAob3V0ZmlsZSwgIiVzXHQiLCBvcG5hbWUpOworCisgIGlkeCA9ICAgc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisKKyAgaWYgKGFsdGVybmF0ZSAKKyAgICAgICYmIGlkeCA8IGluLT5sZW4gCisgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJyInKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCisJeworCSAgaWYgKGkpCisJICAgIGZwcmludGYob3V0ZmlsZSwiLCIpOworCSAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7CisJfQorICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCisJeworCSAgZXhwX3QgZTsKKwkgIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOworCSAgZXhwX3N0cmluZyAoJmUsICZhY2MpOworCSAgc2JfYWRkX2NoYXIgKCZhY2MsIDApOworCSAgZnByaW50ZiAob3V0ZmlsZSwgYWNjLnB0cik7CisJICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJywnKQorCSAgICB7CisJICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKKwkgICAgICBpZHgrKzsKKwkgICAgfQorCX0KKyAgICB9CisgIHNiX2tpbGwgKCZhY2MpOworICBzYl9wcmludF9hdCAob3V0ZmlsZSwgaWR4LCBpbik7CisgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOworfQorCisvKiAuZGF0YWIgWy5ifC53fC5sXSA8cmVwZWF0Piw8ZmlsbD4gKi8KKworc3RhdGljIHZvaWQKK2RvX2RhdGFiIChpZHgsIGluKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47Cit7CisgIGludCBvcHNpemU7CisgIGludCByZXBlYXQ7CisgIGludCBmaWxsOworCisgIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZvcHNpemUpOworCisgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiByZXBlYXQgbXVzdCBiZSBjb25zdGFudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKKyAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7CisgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiBkYXRhIG11c3QgYmUgYWJzb2x1dGUuXG4iKSwgaWR4LCBpbiwgJmZpbGwpOworCisgIGZwcmludGYgKG91dGZpbGUsICIuZmlsbFx0JWQsJWQsJWRcbiIsIHJlcGVhdCwgb3BzaXplLCBmaWxsKTsKK30KKworLyogLmFsaWduIDxzaXplPiAqLworCitzdGF0aWMgdm9pZAorZG9fYWxpZ24gKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgaW50IGFsLCBoYXZlX2ZpbGwsIGZpbGw7CisKKyAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImFsaWduIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwgaWR4LCBpbiwgJmFsKTsKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisgIGhhdmVfZmlsbCA9IDA7CisgIGZpbGwgPSAwOworICBpZiAoISBlb2wgKGlkeCwgaW4pKQorICAgIHsKKyAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOworICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIi5hbGlnbiBuZWVkcyBhYnNvbHV0ZSBmaWxsIHZhbHVlLlxuIiksIGlkeCwgaW4sCisJCQkgJmZpbGwpOworICAgICAgaGF2ZV9maWxsID0gMTsKKyAgICB9CisKKyAgaWYgKGFsICE9IDEKKyAgICAgICYmIGFsICE9IDIKKyAgICAgICYmIGFsICE9IDQpCisgICAgV0FSTklORyAoKHN0ZGVyciwgXygiYWxpZ25tZW50IG11c3QgYmUgb25lIG9mIDEsIDIgb3IgNC5cbiIpKSk7CisKKyAgZnByaW50ZiAob3V0ZmlsZSwgIi5hbGlnbgklZCIsIGFsKTsKKyAgaWYgKGhhdmVfZmlsbCkKKyAgICBmcHJpbnRmIChvdXRmaWxlLCAiLCVkIiwgZmlsbCk7CisgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOworfQorCisvKiAucmVzWy5ifC53fC5sXSA8c2l6ZT4gKi8KKworc3RhdGljIHZvaWQKK2RvX3JlcyAoaWR4LCBpbiwgdHlwZSkKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBpbnQgdHlwZTsKK3sKKyAgaW50IHNpemUgPSA0OworICBpbnQgY291bnQgPSAwOworCisgIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZzaXplKTsKKyAgd2hpbGUgKCFlb2woaWR4LCBpbikpCisgICAgeworICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICcsJykKKwlpZHgrKzsKKyAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJyZXMgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiBmb3IgZmlsbCBjb3VudC5cbiIpLCBpZHgsIGluLCAmY291bnQpOworCisgICAgICBpZiAodHlwZSA9PSAnYycgfHwgdHlwZSA9PSAneicpCisJY291bnQrKzsKKworICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5zcGFjZQklZFxuIiwgY291bnQgKiBzaXplKTsKKyAgICB9Cit9CisKKworLyogLmV4cG9ydCAqLworCitzdGF0aWMgdm9pZAorZG9fZXhwb3J0IChpbikKKyAgICAgc2IgKmluOworeworICBmcHJpbnRmIChvdXRmaWxlLCAiLmdsb2JhbAklc1xuIiwgc2JfbmFtZSAoaW4pKTsKK30KKworLyogLnByaW50IFtsaXN0XSBbbm9saXN0XSAqLworCitzdGF0aWMgdm9pZAorZG9fcHJpbnQgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisgIHdoaWxlIChpZHggPCBpbi0+bGVuKQorICAgIHsKKyAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIkxJU1QiLCA0KSA9PSAwKQorCXsKKwkgIGZwcmludGYgKG91dGZpbGUsICIubGlzdFxuIik7CisJICBpZHggKz0gNDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIk5PTElTVCIsIDYpID09IDApCisJeworCSAgZnByaW50ZiAob3V0ZmlsZSwgIi5ub2xpc3RcbiIpOworCSAgaWR4ICs9IDY7CisJfQorICAgICAgaWR4Kys7CisgICAgfQorfQorCisvKiAuaGVhZCAqLworc3RhdGljIHZvaWQKK2RvX2hlYWRpbmcgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgc2IgaGVhZDsKKyAgc2JfbmV3ICgmaGVhZCk7CisgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmhlYWQpOworICBmcHJpbnRmIChvdXRmaWxlLCAiLnRpdGxlCVwiJXNcIlxuIiwgc2JfbmFtZSAoJmhlYWQpKTsKKyAgc2Jfa2lsbCAoJmhlYWQpOworfQorCisvKiAucGFnZSAqLworCitzdGF0aWMgdm9pZAorZG9fcGFnZSAoKQoreworICBmcHJpbnRmIChvdXRmaWxlLCAiLmVqZWN0XG4iKTsKK30KKworLyogLmZvcm0gW2xpbj08dmFsdWU+XSBbY29sPTx2YWx1ZT5dICovCitzdGF0aWMgdm9pZAorZG9fZm9ybSAoaWR4LCBpbikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworeworICBpbnQgbGluZXMgPSA2MDsKKyAgaW50IGNvbHVtbnMgPSAxMzI7CisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworCisgIHdoaWxlIChpZHggPCBpbi0+bGVuKQorICAgIHsKKworICAgICAgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCAiTElOPSIsIDQpID09IDApCisJeworCSAgaWR4ICs9IDQ7CisJICBpZHggPSBleHBfZ2V0X2FicyAoXygiZm9ybSBMSU49IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIiksIGlkeCwgaW4sICZsaW5lcyk7CisJfQorCisgICAgICBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsIF8oIkNPTD0iKSwgNCkgPT0gMCkKKwl7CisJICBpZHggKz0gNDsKKwkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJmb3JtIENPTD0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iKSwgaWR4LCBpbiwgJmNvbHVtbnMpOworCX0KKworICAgICAgaWR4Kys7CisgICAgfQorICBmcHJpbnRmIChvdXRmaWxlLCAiLnBzaXplICVkLCVkXG4iLCBsaW5lcywgY29sdW1ucyk7CisKK30KKworCisvKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAorICAgcnVsZXM6CisgICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCisgICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKKyAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCisgICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6CisqLworc3RhdGljIGludAorZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sIG91dCwgZXhwYW5kLCBwcmV0ZW5kX3F1b3RlZCkKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBzYiAqb3V0OworICAgICBpbnQgZXhwYW5kOworICAgICBpbnQgcHJldGVuZF9xdW90ZWQ7Cit7CisgIHNiX3Jlc2V0IChvdXQpOworICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKworICBpZiAoaWR4IDwgaW4tPmxlbikKKyAgICB7CisgICAgICBpZiAoaW4tPmxlbiA+IDIgJiYgaW4tPnB0cltpZHgrMV0gPT0gJ1wnJyAmJiBJU0JBU0UgKGluLT5wdHJbaWR4XSkpCisJeworCSAgd2hpbGUgKCFJU1NFUCAoaW4tPnB0cltpZHhdKSkKKwkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOworCX0KKyAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnJScKKwkgICAgICAgJiYgYWx0ZXJuYXRlCisJICAgICAgICYmIGV4cGFuZCkKKwl7CisJICBpbnQgdmFsOworCSAgY2hhciBidWZbMjBdOworCSAgLyogVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nICovCisJICBpZHggPSBleHBfZ2V0X2FicyAoXygiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksCisJCQkgICAgIGlkeCArIDEsCisJCQkgICAgIGluLAorCQkJICAgICAmdmFsKTsKKwkgIHNwcmludGYoYnVmLCAiJWQiLCB2YWwpOworCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWYpOworCX0KKyAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicKKwkgICAgICAgfHwgaW4tPnB0cltpZHhdID09ICc8JworCSAgICAgICB8fCAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKSkKKwl7CisJICBpZiAoYWx0ZXJuYXRlICYmIGV4cGFuZCkKKwkgICAgeworCSAgICAgIC8qIEtlZXAgdGhlIHF1b3RlcyAqLworCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKKwkJICAgIAorCSAgICAgIGlkeCA9ICBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOworCisJICAgIH0KKwkgIGVsc2UgeworCSAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7CisJICB9CisJfQorICAgICAgZWxzZSAKKwl7CisJICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAKKwkJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInCisJCSAgICAgfHwgaW4tPnB0cltpZHhdID09ICdcJycKKwkJICAgICB8fCBwcmV0ZW5kX3F1b3RlZCAKKwkJICAgICB8fCAhSVNTRVAgKGluLT5wdHJbaWR4XSkpKQorCSAgICB7CisJICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgCisJCSAgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCisJCXsKKwkJICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOworCQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKKwkJICB3aGlsZSAoaWR4IDwgaW4tPmxlbgorCQkJICYmIGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKKwkJICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsJCSAgICAKKwkJICBpZiAoaWR4ID09IGluLT5sZW4pCisJCSAgICByZXR1cm4gaWR4OwkgICAgICAKKwkJfQorCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIGlkeDsKK30KKworCisvKiBza2lwIGFsb25nIHNiIGluIHN0YXJ0aW5nIGF0IGlkeCwgc3VjayBvZmYgd2hpdGVzcGFjZSBhICggYW5kIG1vcmUKKyAgIHdoaXRlc3BhY2UuICByZXR1cm4gdGhlIGlkeCBvZiB0aGUgbmV4dCBjaGFyICovCisKK3N0YXRpYyBpbnQKK3NraXBfb3BlbnAgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisgIGlmIChpbi0+cHRyW2lkeF0gIT0gJygnKQorICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKCAuXG4iKSkpOworICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7CisgIHJldHVybiBpZHg7Cit9CisKKy8qIHNraXAgYWxvbmcgc2IgaW4gc3RhcnRpbmcgYXQgaWR4LCBzdWNrIG9mZiB3aGl0ZXNwYWNlIGEgKSBhbmQgbW9yZQorICAgd2hpdGVzcGFjZS4gIHJldHVybiB0aGUgaWR4IG9mIHRoZSBuZXh0IGNoYXIgKi8KKworc3RhdGljIGludAorc2tpcF9jbG9zZXAgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisgIGlmIChpbi0+cHRyW2lkeF0gIT0gJyknKQorICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKS5cbiIpKSk7CisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKKyAgcmV0dXJuIGlkeDsKK30KKworLyogLmxlbiAqLworCitzdGF0aWMgaW50Citkb2xlbiAoaWR4LCBpbiwgb3V0KQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIHNiICpvdXQ7Cit7CisKKyAgc2Igc3RyaW5nb3V0OworICBjaGFyIGJ1ZmZlclsxMF07CisKKyAgc2JfbmV3ICgmc3RyaW5nb3V0KTsKKyAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7CisgIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZ291dCk7CisgIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKKyAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBzdHJpbmdvdXQubGVuKTsKKyAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOworCisgIHNiX2tpbGwgKCZzdHJpbmdvdXQpOworICByZXR1cm4gaWR4OworfQorCisKKy8qIC5pbnN0ciAqLworCitzdGF0aWMKK2ludAorZG9pbnN0ciAoaWR4LCBpbiwgb3V0KQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIHNiICpvdXQ7Cit7CisgIHNiIHN0cmluZzsKKyAgc2Igc2VhcmNoOworICBpbnQgaTsKKyAgaW50IHN0YXJ0OworICBpbnQgcmVzOworICBjaGFyIGJ1ZmZlclsxMF07CisKKyAgc2JfbmV3ICgmc3RyaW5nKTsKKyAgc2JfbmV3ICgmc2VhcmNoKTsKKyAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7CisgIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZyk7CisgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOworICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzZWFyY2gpOworICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKKyAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQorICAgIHsKKyAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIuaW5zdHIgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc29uLlxuIiksIGlkeCwgaW4sICZzdGFydCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgaWR4ID0gc2tpcF9jbG9zZXAgKGlkeCwgaW4pOworICByZXMgPSAtMTsKKyAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdHJpbmcubGVuOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKHN0cmluZy5wdHIgKyBpLCBzZWFyY2gucHRyLCBzZWFyY2gubGVuKSA9PSAwKQorCXsKKwkgIHJlcyA9IGk7CisJICBicmVhazsKKwl9CisgICAgfQorICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHJlcyk7CisgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKKyAgc2Jfa2lsbCAoJnN0cmluZyk7CisgIHNiX2tpbGwgKCZzZWFyY2gpOworICByZXR1cm4gaWR4OworfQorCisKK3N0YXRpYyBpbnQKK2Rvc3Vic3RyIChpZHgsIGluLCBvdXQpCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgc2IgKm91dDsKK3sKKyAgc2Igc3RyaW5nOworICBpbnQgcG9zOworICBpbnQgbGVuOworICBzYl9uZXcgKCZzdHJpbmcpOworCisgIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOworICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzdHJpbmcpOworICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKKyAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIm5lZWQgYWJzb2x1dGUgcG9zaXRpb24uXG4iKSwgaWR4LCBpbiwgJnBvcyk7CisgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOworICBpZHggPSBleHBfZ2V0X2FicyAoXygibmVlZCBhYnNvbHV0ZSBsZW5ndGguXG4iKSwgaWR4LCBpbiwgJmxlbik7CisgIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKKworCisgIGlmIChsZW4gPCAwIHx8IHBvcyA8IDAgfHwKKyAgICAgIHBvcyA+IHN0cmluZy5sZW4KKyAgICAgIHx8IHBvcyArIGxlbiA+IHN0cmluZy5sZW4pCisgICAgeworICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCAiICIpOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBzYl9hZGRfY2hhciAob3V0LCAnIicpOworICAgICAgd2hpbGUgKGxlbiA+IDApCisJeworCSAgc2JfYWRkX2NoYXIgKG91dCwgc3RyaW5nLnB0cltwb3MrK10pOworCSAgbGVuLS07CisJfQorICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyInKTsKKyAgICB9CisgIHNiX2tpbGwoJnN0cmluZyk7CisgIHJldHVybiBpZHg7Cit9CisKKy8qIHNjYW4gbGluZSwgY2hhbmdlIHRva2VucyBpbiB0aGUgaGFzaCB0YWJsZSB0byB0aGVpciByZXBsYWNlbWVudHMgKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sIGJ1ZikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBzYiAqYnVmOworeworICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKKyAgICB7CisgICAgICBoYXNoX2VudHJ5ICpwdHI7CisgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKKwkgICYmIGlkeCArIDEgPCBpbi0+bGVuCisJICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKKwl7CisJICBkbworCSAgICB7CisJICAgICAgc2JfYWRkX2NoYXIgKGJ1ZiwgaW4tPnB0cltpZHhdKTsKKwkgICAgICBpZHgrKzsKKwkgICAgfQorCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHggLSAxXSAhPSAnKScpOworCX0KKyAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCisJICAmJiBpZHggKyAxIDwgaW4tPmxlbgorCSAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJicpCisJeworCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMSk7CisJfQorICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKKwkgICAgICAgJiYgaWR4ICsgMSA8IGluLT5sZW4KKwkgICAgICAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJCcpCisJeworCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMCk7CisJfQorICAgICAgZWxzZSBpZiAoaWR4ICsgMyA8IGluLT5sZW4KKwkgICAgICAgJiYgaW4tPnB0cltpZHhdID09ICcuJworCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAxXSkgPT0gJ0wnCisJICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDJdKSA9PSAnRScKKwkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgM10pID09ICdOJykKKwlpZHggPSBkb2xlbiAoaWR4ICsgNCwgaW4sIGJ1Zik7CisgICAgICBlbHNlIGlmIChpZHggKyA2IDwgaW4tPmxlbgorCSAgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nCisJICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDFdKSA9PSAnSScKKwkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMl0pID09ICdOJworCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAzXSkgPT0gJ1MnCisJICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDRdKSA9PSAnVCcKKwkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNV0pID09ICdSJykKKwlpZHggPSBkb2luc3RyIChpZHggKyA2LCBpbiwgYnVmKTsKKyAgICAgIGVsc2UgaWYgKGlkeCArIDcgPCBpbi0+bGVuCisJICAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnLicKKwkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMV0pID09ICdTJworCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAyXSkgPT0gJ1UnCisJICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDNdKSA9PSAnQicKKwkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNF0pID09ICdTJworCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA1XSkgPT0gJ1QnCisJICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDZdKSA9PSAnUicpCisJaWR4ID0gZG9zdWJzdHIgKGlkeCArIDcsIGluLCBidWYpOworICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCisJeworCSAgLyogbWF5IGJlIGEgc2ltcGxlIG5hbWUgc3Vic2l0dXRpb24sIHNlZSBpZiB3ZSBoYXZlIGEgd29yZCAqLworCSAgc2IgYWNjOworCSAgaW50IGN1ciA9IGlkeCArIDE7CisJICB3aGlsZSAoY3VyIDwgaW4tPmxlbgorCQkgJiYgKElTTkVYVENIQVIgKGluLT5wdHJbY3VyXSkpKQorCSAgICBjdXIrKzsKKworCSAgc2JfbmV3ICgmYWNjKTsKKwkgIHNiX2FkZF9idWZmZXIgKCZhY2MsIGluLT5wdHIgKyBpZHgsIGN1ciAtIGlkeCk7CisJICBwdHIgPSBoYXNoX2xvb2t1cCAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmYWNjKTsKKwkgIGlmIChwdHIpCisJICAgIHsKKwkgICAgICAvKiBGb3VuZCBhIGRlZmluaXRpb24gZm9yIGl0ICovCisJICAgICAgc2JfYWRkX3NiIChidWYsICZwdHItPnZhbHVlLnMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBObyBkZWZpbml0aW9uLCBqdXN0IGNvcHkgdGhlIHdvcmQgKi8KKwkgICAgICBzYl9hZGRfc2IgKGJ1ZiwgJmFjYyk7CisJICAgIH0KKwkgIHNiX2tpbGwgKCZhY2MpOworCSAgaWR4ID0gY3VyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzYl9hZGRfY2hhciAoYnVmLCBpbi0+cHRyW2lkeCsrXSk7CisJfQorICAgIH0KK30KKworc3RhdGljIGludAorZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCBvdXQpCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgc2IgKm91dDsKK3sKKyAgc2IgdDsKKyAgc2JfbmV3ICgmdCk7CisgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmdCwgMSwgMCk7CisgIHByb2Nlc3NfYXNzaWducyAoMCwgJnQsIG91dCk7CisgIHNiX2tpbGwgKCZ0KTsKKyAgcmV0dXJuIGlkeDsKK30KKworc3RhdGljCit2b2lkCitwcm9jZXNzX2ZpbGUgKCkKK3sKKyAgc2IgbGluZTsKKyAgc2IgdDEsIHQyOworICBzYiBhY2M7CisgIHNiIGxhYmVsX2luOworICBpbnQgbW9yZTsKKworICBzYl9uZXcgKCZsaW5lKTsKKyAgc2JfbmV3ICgmdDEpOworICBzYl9uZXcgKCZ0Mik7CisgIHNiX25ldygmYWNjKTsKKyAgc2JfbmV3ICgmbGFiZWxfaW4pOworICBzYl9yZXNldCAoJmxpbmUpOworICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKKyAgd2hpbGUgKG1vcmUpCisgICAgeworICAgICAgLyogRmluZCBhbnkgbGFiZWwgYW5kIHBzZXVkbyBvcCB0aGF0IHdlJ3JlIGludGVzdGVkIGluICovCisgICAgICBpbnQgbDsKKyAgICAgIGlmIChsaW5lLmxlbiA9PSAwKQorCXsKKwkgIGlmIChjb25kYXNzX29uICgpKQorCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKKwl9CisgICAgICBlbHNlIGlmIChtcmkKKwkgICAgICAgJiYgKGxpbmUucHRyWzBdID09ICcqJworCQkgICB8fCBsaW5lLnB0clswXSA9PSAnIScpKQorCXsKKwkgIC8qIE1SSSBsaW5lIGNvbW1lbnQuICAqLworCSAgZnByaW50ZiAob3V0ZmlsZSwgc2JfbmFtZSAoJmxpbmUpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbCA9IGdyYWJfbGFiZWwgKCZsaW5lLCAmbGFiZWxfaW4pOworCSAgc2JfcmVzZXQgKCZsYWJlbCk7CSAgCSAgCisKKwkgIGlmIChsaW5lLnB0cltsXSA9PSAnOicpCisJICAgIGwrKzsKKwkgIHdoaWxlIChJU1dISVRFIChsaW5lLnB0cltsXSkgJiYgbCA8IGxpbmUubGVuKQorCSAgICBsKys7CisKKwkgIGlmIChsYWJlbF9pbi5sZW4pCisJICAgIHsKKwkgICAgICBpbnQgZG9fYXNzaWduczsKKworCSAgICAgIC8qIE11bmdlIHRoZSBsYWJlbCwgdW5sZXNzIHRoaXMgaXMgRVFVIG9yIEFTU0lHTi4gICovCisJICAgICAgZG9fYXNzaWducyA9IDE7CisJICAgICAgaWYgKGwgPCBsaW5lLmxlbgorCQkgICYmIChsaW5lLnB0cltsXSA9PSAnLicgfHwgYWx0ZXJuYXRlIHx8IG1yaSkpCisJCXsKKwkJICBpbnQgbHggPSBsOworCisJCSAgaWYgKGxpbmUucHRyW2x4XSA9PSAnLicpCisJCSAgICArK2x4OworCQkgIGlmIChseCArIDMgPD0gbGluZS5sZW4KKwkJICAgICAgJiYgc3RybmNhc2VjbXAgKCJFUVUiLCBsaW5lLnB0ciArIGx4LCAzKSA9PSAwCisJCSAgICAgICYmIChseCArIDMgPT0gbGluZS5sZW4KKwkJCSAgfHwgISBJU0ZJUlNUQ0hBUiAobGluZS5wdHJbbHggKyAzXSkpKQorCQkgICAgZG9fYXNzaWducyA9IDA7CisJCSAgZWxzZSBpZiAobHggKyA2IDw9IGxpbmUubGVuCisJCQkgICAmJiBzdHJuY2FzZWNtcCAoIkFTU0lHTiIsIGxpbmUucHRyICsgbHgsIDYpID09IDAKKwkJCSAgICYmIChseCArIDYgPT0gbGluZS5sZW4KKwkJCSAgICAgICB8fCAhIElTRklSU1RDSEFSIChsaW5lLnB0cltseCArIDZdKSkpCisJCSAgICBkb19hc3NpZ25zID0gMDsKKwkJfQorCisJICAgICAgaWYgKGRvX2Fzc2lnbnMpCisJCXByb2Nlc3NfYXNzaWducyAoMCwgJmxhYmVsX2luLCAmbGFiZWwpOworCSAgICAgIGVsc2UKKwkJc2JfYWRkX3NiICgmbGFiZWwsICZsYWJlbF9pbik7CisJICAgIH0KKworCSAgaWYgKGwgPCBsaW5lLmxlbikKKwkgICAgeworCSAgICAgIGlmIChwcm9jZXNzX3BzZXVkb19vcCAobCwgJmxpbmUsICZhY2MpKQorCQl7CisKKworCisJCX0KKwkgICAgICBlbHNlIGlmIChjb25kYXNzX29uICgpKQorCQl7CisJCSAgaWYgKG1hY3JvX29wIChsLCAmbGluZSkpCisJCSAgICB7CisKKworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgeworCQkJaWYgKGxhYmVsLmxlbikKKwkJCSAgeworCQkJICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOworCQkJICB9CisJCQllbHNlCisJCQkgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOworCQkJc2JfcmVzZXQoJnQxKTsKKwkJCXByb2Nlc3NfYXNzaWducyAobCwgJmxpbmUsICZ0MSk7CisJCQlzYl9yZXNldCAoJnQyKTsKKwkJCWNoYW5nZV9iYXNlICgwLCAmdDEsICZ0Mik7CisJCQlmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKCZ0MikpOworCQkgICAgICB9CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZSB7CisJICAgIC8qIE9ubHkgYSBsYWJlbCBvbiB0aGlzIGxpbmUgKi8KKwkgICAgaWYgKGxhYmVsLmxlbiAmJiBjb25kYXNzX29uKCkpCisJICAgICAgeworCQlmcHJpbnRmIChvdXRmaWxlLCAiJXM6XG4iLCBzYl9uYW1lICgmbGFiZWwpKTsKKwkgICAgICB9CisJICB9CisJfQorCisgICAgICBpZiAoaGFkX2VuZCkKKwlicmVhazsKKyAgICAgIHNiX3Jlc2V0ICgmbGluZSk7CisgICAgICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKKyAgICB9CisKKyAgaWYgKCFoYWRfZW5kICYmICFtcmkpCisgICAgV0FSTklORyAoKHN0ZGVyciwgXygiRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS5cbiIpKSk7Cit9CisKKworCisKKworc3RhdGljIHZvaWQKK2ZyZWVfb2xkX2VudHJ5IChwdHIpCisgICAgIGhhc2hfZW50cnkgKnB0cjsKK3sKKyAgaWYgKHB0cikKKyAgICB7CisgICAgICBpZiAocHRyLT50eXBlID09IGhhc2hfc3RyaW5nKQorCXNiX2tpbGwoJnB0ci0+dmFsdWUucyk7CisgICAgfQorfQorCisvKiBuYW1lOiAuQVNTSUdOQSA8dmFsdWU+ICovCisKK3N0YXRpYyB2b2lkCitkb19hc3NpZ25hIChpZHgsIGluKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47Cit7CisgIHNiIHRtcDsKKyAgaW50IHZhbDsKKyAgc2JfbmV3ICgmdG1wKTsKKworICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sICZ0bXApOworICBpZHggPSBleHBfZ2V0X2FicyAoXygiLkFTU0lHTkEgbmVlZHMgY29uc3RhbnQgZXhwcmVzc2lvbiBhcmd1bWVudC5cbiIpLCAwLCAmdG1wLCAmdmFsKTsKKworICBpZiAoIWxhYmVsLmxlbikKKyAgICB7CisgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiLkFTU0lHTkEgd2l0aG91dCBsYWJlbC5cbiIpKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOworICAgICAgZnJlZV9vbGRfZW50cnkgKHB0cik7CisgICAgICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7CisgICAgICBwdHItPnZhbHVlLmkgPSB2YWw7CisgICAgfQorICBzYl9raWxsICgmdG1wKTsKK30KKworLyogbmFtZTogLkFTU0lHTkMgPHN0cmluZz4gKi8KKworc3RhdGljIHZvaWQKK2RvX2Fzc2lnbmMgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgc2IgYWNjOworICBzYl9uZXcgKCZhY2MpOworICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOworCisgIGlmICghbGFiZWwubGVuKQorICAgIHsKKyAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCIuQVNTSUdOUyB3aXRob3V0IGxhYmVsLlxuIikpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7CisgICAgICBmcmVlX29sZF9lbnRyeSAocHRyKTsKKyAgICAgIHB0ci0+dHlwZSA9IGhhc2hfc3RyaW5nOworICAgICAgc2JfbmV3ICgmcHRyLT52YWx1ZS5zKTsKKyAgICAgIHNiX2FkZF9zYiAoJnB0ci0+dmFsdWUucywgJmFjYyk7CisgICAgfQorICBzYl9raWxsICgmYWNjKTsKK30KKworCisvKiBuYW1lOiAuUkVHIChyZWcpICovCisKK3N0YXRpYyB2b2lkCitkb19yZWcgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgLyogcmVtb3ZlIHJlZyBzdHVmZiBmcm9tIGluc2lkZSBwYXJlbnMgKi8KKyAgc2Igd2hhdDsKKyAgaWYgKCFtcmkpCisgICAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7CisgIGVsc2UKKyAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKyAgc2JfbmV3ICgmd2hhdCk7CisgIHdoaWxlIChpZHggPCBpbi0+bGVuCisJICYmIChtcmkKKwkgICAgID8gISBlb2wgKGlkeCwgaW4pCisJICAgICA6IGluLT5wdHJbaWR4XSAhPSAnKScpKQorICAgIHsKKyAgICAgIHNiX2FkZF9jaGFyICgmd2hhdCwgaW4tPnB0cltpZHhdKTsKKyAgICAgIGlkeCsrOworICAgIH0KKyAgaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlICgmYXNzaWduX2hhc2hfdGFibGUsICZsYWJlbCwgJndoYXQsIDEpOworICBzYl9raWxsICgmd2hhdCk7Cit9CisKKworc3RhdGljIGludAorY29uZGFzc19sb29rdXBfbmFtZSAoaW5idWYsIGlkeCwgb3V0LCB3YXJuKQorICAgICBzYiAqaW5idWY7CisgICAgIGludCBpZHg7CisgICAgIHNiICpvdXQ7CisgICAgIGludCB3YXJuOworeworICBoYXNoX2VudHJ5ICpwdHI7CisgIHNiIGNvbmRhc3NfYWNjOworICBzYl9uZXcgKCZjb25kYXNzX2FjYyk7CisKKyAgd2hpbGUgKGlkeCA8IGluYnVmLT5sZW4KKwkgJiYgSVNORVhUQ0hBUiAoaW5idWYtPnB0cltpZHhdKSkKKyAgICB7CisgICAgICBzYl9hZGRfY2hhciAoJmNvbmRhc3NfYWNjLCBpbmJ1Zi0+cHRyW2lkeCsrXSk7CisgICAgfQorCisgIGlmIChpbmJ1Zi0+cHRyW2lkeF0gPT0gJ1wnJykKKyAgICBpZHgrKzsKKyAgcHRyID0gaGFzaF9sb29rdXAgKCZ2YXJzLCAmY29uZGFzc19hY2MpOworCisKKyAgaWYgKCFwdHIpCisgICAgeworICAgICAgaWYgKHdhcm4pIAorCXsKKwkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIkNhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlICVzLlxuIiksIHNiX25hbWUgKCZjb25kYXNzX2FjYykpKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIHNiX2FkZF9zdHJpbmcgKG91dCwgIjAiKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHB0ci0+dHlwZSA9PSBoYXNoX2ludGVnZXIpCisJeworCSAgY2hhciBidWZmZXJbMzBdOworCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBwdHItPnZhbHVlLmkpOworCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+dmFsdWUucyk7CisJfQorICAgIH0KKyAgc2Jfa2lsbCAoJmNvbmRhc3NfYWNjKTsKKyAgcmV0dXJuIGlkeDsKK30KKworI2RlZmluZSBFUSAxCisjZGVmaW5lIE5FIDIKKyNkZWZpbmUgR0UgMworI2RlZmluZSBMVCA0CisjZGVmaW5lIExFIDUKKyNkZWZpbmUgR1QgNgorI2RlZmluZSBORVZFUiA3CisKK3N0YXRpYyBpbnQKK3doYXRjb25kIChpZHgsIGluLCB2YWwpCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgaW50ICp2YWw7Cit7CisgIGludCBjb25kOworCisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworICBjb25kID0gTkVWRVI7CisgIGlmIChpZHggKyAxIDwgaW4tPmxlbikKKyAgICB7CisgICAgICBjaGFyICpwOworICAgICAgY2hhciBhLCBiOworCisgICAgICBwID0gaW4tPnB0ciArIGlkeDsKKyAgICAgIGEgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgcFswXSk7CisgICAgICBiID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIHBbMV0pOworICAgICAgaWYgKGEgPT0gJ0UnICYmIGIgPT0gJ1EnKQorCWNvbmQgPSBFUTsKKyAgICAgIGVsc2UgaWYgKGEgPT0gJ04nICYmIGIgPT0gJ0UnKQorCWNvbmQgPSBORTsKKyAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ1QnKQorCWNvbmQgPSBMVDsKKyAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ0UnKQorCWNvbmQgPSBMRTsKKyAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ1QnKQorCWNvbmQgPSBHVDsKKyAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ0UnKQorCWNvbmQgPSBHRTsKKyAgICB9CisgIGlmIChjb25kID09IE5FVkVSKQorICAgIHsKKyAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIG11c3QgYmUgb25lIG9mIEVRLCBORSwgTFQsIExFLCBHVCBvciBHRS5cbiIpKSk7CisgICAgICBjb25kID0gTkVWRVI7CisgICAgfQorICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAyLCBpbik7CisgICp2YWwgPSBjb25kOworICByZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50Citpc3RydWUgKGlkeCwgaW4pCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgaW50IHJlczsKKyAgc2IgYWNjX2E7CisgIHNiIGNvbmQ7CisgIHNiIGFjY19iOworICBzYl9uZXcgKCZhY2NfYSk7CisgIHNiX25ldyAoJmNvbmQpOworICBzYl9uZXcgKCZhY2NfYik7CisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworCisgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQorICAgIHsKKyAgICAgIGludCBjb25kOworICAgICAgaW50IHNhbWU7CisgICAgICAvKiBUaGlzIGlzIGEgc3RyaW5nIGNvbXBhcmlzaW9uICovCisgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2NfYSk7CisgICAgICBpZHggPSB3aGF0Y29uZCAoaWR4LCBpbiwgJmNvbmQpOworICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjX2IpOworICAgICAgc2FtZSA9IGFjY19hLmxlbiA9PSBhY2NfYi5sZW4gJiYgKHN0cm5jbXAgKGFjY19hLnB0ciwgYWNjX2IucHRyLCBhY2NfYS5sZW4pID09IDApOworCisgICAgICBpZiAoY29uZCAhPSBFUSAmJiBjb25kICE9IE5FKQorCXsKKwkgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIGZvciBzdHJpbmdzIG11c3QgYmUgRVEgb3IgTkVcbiIpKSk7CisJICByZXMgPSAwOworCX0KKyAgICAgIGVsc2UKKwlyZXMgPSAoY29uZCAhPSBFUSkgXiBzYW1lOworICAgIH0KKyAgZWxzZQorICAgIC8qIFRoaXMgaXMgYSBudW1lcmljIGV4cHJlc3Npb24gKi8KKyAgICB7CisgICAgICBpbnQgdmFsYTsKKyAgICAgIGludCB2YWxiOworICAgICAgaW50IGNvbmQ7CisgICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksIGlkeCwgaW4sICZ2YWxhKTsKKyAgICAgIGlkeCA9IHdoYXRjb25kIChpZHgsIGluLCAmY29uZCk7CisgICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKyAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQorCXsKKwkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlN0cmluZyBjb21wYXJlZCBhZ2FpbnN0IGV4cHJlc3Npb24uXG4iKSkpOworCSAgcmVzID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIpLCBpZHgsIGluLCAmdmFsYik7CisJICBzd2l0Y2ggKGNvbmQpCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICByZXMgPSA0MjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBFUToKKwkgICAgICByZXMgPSB2YWxhID09IHZhbGI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTkU6CisJICAgICAgcmVzID0gdmFsYSAhPSB2YWxiOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIExUOgorCSAgICAgIHJlcyA9IHZhbGEgPCB2YWxiOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIExFOgorCSAgICAgIHJlcyA9IHZhbGEgPD0gdmFsYjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBHVDoKKwkgICAgICByZXMgPSB2YWxhID4gdmFsYjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBHRToKKwkgICAgICByZXMgPSB2YWxhID49IHZhbGI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTkVWRVI6CisJICAgICAgcmVzID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgc2Jfa2lsbCAoJmFjY19hKTsKKyAgc2Jfa2lsbCAoJmNvbmQpOworICBzYl9raWxsICgmYWNjX2IpOworICByZXR1cm4gcmVzOworfQorCisvKiAuQUlGICovCitzdGF0aWMgdm9pZAorZG9fYWlmIChpZHgsIGluKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47Cit7CisgIGlmIChpZmkgPj0gSUZORVNUSU5HKQorICAgIHsKKyAgICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOworICAgIH0KKyAgaWZpKys7CisgIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gaXN0cnVlIChpZHgsIGluKSA6IDA7CisgIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMDsKK30KKworCisvKiAuQUVMU0UgKi8KK3N0YXRpYyB2b2lkCitkb19hZWxzZSAoKQoreworICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/ICFpZnN0YWNrW2lmaV0ub24gOiAwOworICBpZiAoaWZzdGFja1tpZmldLmhhZGVsc2UpCisgICAgeworICAgICAgRVJST1IgKChzdGRlcnIsIF8oIk11bHRpcGxlIEFFTFNFcyBpbiBBSUYuXG4iKSkpOworICAgIH0KKyAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAxOworfQorCisKKy8qIC5BRU5ESSAqLworc3RhdGljIHZvaWQKK2RvX2FlbmRpICgpCit7CisgIGlmIChpZmkgIT0gMCkKKyAgICB7CisgICAgICBpZmktLTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQUVOREkgd2l0aG91dCBBSUYuXG4iKSkpOworICAgIH0KK30KKworc3RhdGljIGludAorY29uZGFzc19vbiAoKQoreworICByZXR1cm4gaWZzdGFja1tpZmldLm9uOworfQorCisvKiBNUkkgSUZFUSwgSUZORSwgSUZMVCwgSUZMRSwgSUZHRSwgSUZHVC4gICovCisKK3N0YXRpYyB2b2lkCitkb19pZiAoaWR4LCBpbiwgY29uZCkKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBpbnQgY29uZDsKK3sKKyAgaW50IHZhbDsKKyAgaW50IHJlczsKKworICBpZiAoaWZpID49IElGTkVTVElORykKKyAgICB7CisgICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOworICAgIH0KKworICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksCisJCSAgICAgaWR4LCBpbiwgJnZhbCk7CisgIHN3aXRjaCAoY29uZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIEVROiByZXMgPSB2YWwgPT0gMDsgYnJlYWs7CisgICAgY2FzZSBORTogcmVzID0gdmFsICE9IDA7IGJyZWFrOworICAgIGNhc2UgTFQ6IHJlcyA9IHZhbCA8ICAwOyBicmVhazsKKyAgICBjYXNlIExFOiByZXMgPSB2YWwgPD0gMDsgYnJlYWs7CisgICAgY2FzZSBHRTogcmVzID0gdmFsID49IDA7IGJyZWFrOworICAgIGNhc2UgR1Q6IHJlcyA9IHZhbCA+ICAwOyBicmVhazsKKyAgICB9CisKKyAgaWZpKys7CisgIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gcmVzOiAwOworICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Cit9CisKKy8qIEdldCBhIHN0cmluZyBmb3IgdGhlIE1SSSBJRkMgb3IgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KKworc3RhdGljIGludAorZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sIHZhbCwgdGVybWluYXRvcikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBzYiAqdmFsOworICAgICBpbnQgdGVybWluYXRvcjsKK3sKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisKKyAgaWYgKGlkeCA8IGluLT5sZW4KKyAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKQorICAgIHsKKyAgICAgIHNiX2FkZF9jaGFyICh2YWwsICdcJycpOworICAgICAgZm9yICgrK2lkeDsgaWR4IDwgaW4tPmxlbjsgKytpZHgpCisJeworCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKKwkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1wnJykKKwkgICAgeworCSAgICAgICsraWR4OworCSAgICAgIGlmIChpZHggPj0gaW4tPmxlbgorCQkgIHx8IGluLT5wdHJbaWR4XSAhPSAnXCcnKQorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbgorCSAgICAgJiYgaW4tPnB0cltpZHhdICE9IHRlcm1pbmF0b3IpCisJeworCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKKwkgICsraWR4OworCX0KKyAgICAgIGkgPSB2YWwtPmxlbiAtIDE7CisgICAgICB3aGlsZSAoaSA+PSAwICYmIElTV0hJVEUgKHZhbC0+cHRyW2ldKSkKKwktLWk7CisgICAgICB2YWwtPmxlbiA9IGkgKyAxOworICAgIH0KKworICByZXR1cm4gaWR4OworfQorCisvKiBNUkkgSUZDLCBJRk5DLiAgKi8KKworc3RhdGljIHZvaWQKK2RvX2lmYyAoaWR4LCBpbiwgaWZuYykKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBpbnQgaWZuYzsKK3sKKyAgc2IgZmlyc3Q7CisgIHNiIHNlY29uZDsKKyAgaW50IHJlczsKKworICBpZiAoaWZpID49IElGTkVTVElORykKKyAgICB7CisgICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOworICAgIH0KKworICBzYl9uZXcgKCZmaXJzdCk7CisgIHNiX25ldyAoJnNlY29uZCk7CisKKyAgaWR4ID0gZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sICZmaXJzdCwgJywnKTsKKworICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9ICcsJykKKyAgICB7CisgICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQmFkIGZvcm1hdCBmb3IgSUYgb3IgSUZOQy5cbiIpKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlkeCA9IGdldF9tcmlfc3RyaW5nIChpZHggKyAxLCBpbiwgJnNlY29uZCwgJzsnKTsKKworICByZXMgPSAoZmlyc3QubGVuID09IHNlY29uZC5sZW4KKwkgJiYgc3RybmNtcCAoZmlyc3QucHRyLCBzZWNvbmQucHRyLCBmaXJzdC5sZW4pID09IDApOworICByZXMgXj0gaWZuYzsKKworICBpZmkrKzsKKyAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyByZXMgOiAwOworICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Cit9CisKKy8qIC5FTkRSICovCitzdGF0aWMgdm9pZAorZG9fYWVuZHIgKCkKK3sKKyAgaWYgKCFtcmkpCisgICAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULlxuIikpKTsKKyAgZWxzZQorICAgIEVSUk9SICgoc3RkZXJyLCBfKCJFTkRSIHdpdGhvdXQgYSBSRVBULlxuIikpKTsKK30KKworLyogLkFXSElMRSAqLworCitzdGF0aWMKK3ZvaWQKK2RvX2F3aGlsZSAoaWR4LCBpbikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworeworICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKKyAgc2IgZXhwOworICBzYiBzdWI7CisgIGludCBkb2l0OworCisgIHNiX25ldyAoJnN1Yik7CisgIHNiX25ldyAoJmV4cCk7CisKKyAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKKyAgZG9pdCA9IGlzdHJ1ZSAoMCwgJmV4cCk7CisKKyAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiQVdISUxFIiwgIkFFTkRXIiwgJnN1YiwgZ2V0X2xpbmUpKQorICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBV0hJTEUgd2l0aG91dCBhIEFFTkRXIGF0ICVkLlxuIiksIGxpbmUgLSAxKSk7CisKKyAgLyogVHVybgorICAgICAJLkFXSElMRSBleHAKKwkgICAgIGZvbworCS5BRU5EVworICAgICBpbnRvCisgICAgICAgIGZvbworCS5BV0hJTEUgZXhwCisJZm9vCisJLkVORFcKKyAgICovCisKKyAgaWYgKGRvaXQpCisgICAgeworICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOworCisgICAgICBzYiBjb3B5OworICAgICAgc2JfbmV3ICgmY29weSk7CisgICAgICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKKyAgICAgIHNiX2FkZF9zYiAoJmNvcHksIGluKTsKKyAgICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiXG4iKTsKKyAgICAgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOworICAgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICJcdC5BRU5EV1xuIik7CisgICAgICAvKiBQdXNoIGFub3RoZXIgV0hJTEUgKi8KKyAgICAgIGluY2x1ZGVfYnVmICgmZXhwLCAmY29weSwgaW5jbHVkZV93aGlsZSwgaW5kZXgpOworICAgICAgc2Jfa2lsbCAoJmNvcHkpOworICAgIH0KKyAgc2Jfa2lsbCAoJmV4cCk7CisgIHNiX2tpbGwgKCZzdWIpOworfQorCisKKy8qIC5BRU5EVyAqLworCitzdGF0aWMgdm9pZAorZG9fYWVuZHcgKCkKK3sKKyAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRXIHdpdGhvdXQgYSBBRU5EVy5cbiIpKSk7Cit9CisKKworLyogLkVYSVRNCisgICAKKyAgIFBvcCB0aGluZ3Mgb2ZmIHRoZSBpbmNsdWRlIHN0YWNrIHVudGlsIHRoZSB0eXBlIGFuZCBpbmRleCBjaGFuZ2VzICovCisKK3N0YXRpYyB2b2lkCitkb19leGl0bSAoKQoreworICBpbmNsdWRlX3R5cGUgdHlwZSA9IHNwLT50eXBlOworICBpZiAodHlwZSA9PSBpbmNsdWRlX3JlcGVhdAorICAgICAgfHwgdHlwZSA9PSBpbmNsdWRlX3doaWxlCisgICAgICB8fCB0eXBlID09IGluY2x1ZGVfbWFjcm8pCisgICAgeworICAgICAgaW50IGluZGV4ID0gc3AtPmluZGV4OworICAgICAgaW5jbHVkZV9wb3AgKCk7CisgICAgICB3aGlsZSAoc3AtPmluZGV4ID09IGluZGV4CisJICAgICAmJiBzcC0+dHlwZSA9PSB0eXBlKQorCXsKKwkgIGluY2x1ZGVfcG9wICgpOworCX0KKyAgICB9Cit9CisKKy8qIC5BUkVQRUFUICovCisKK3N0YXRpYyB2b2lkCitkb19hcmVwZWF0IChpZHgsIGluKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47Cit7CisgIGludCBsaW5lID0gbGluZWNvdW50ICgpOworICBzYiBleHA7CQkJLyogYnVmZmVyIHdpdGggZXhwcmVzc2lvbiBpbiBpdCAqLworICBzYiBjb3B5OwkJCS8qIGV4cGFuZGVkIHJlcGVhdCBibG9jayAqLworICBzYiBzdWI7CQkJLyogY29udGVudHMgb2YgQVJFUEVBVCAqLworICBpbnQgcmM7CisgIGludCByZXQ7CisgIGNoYXIgYnVmZmVyWzMwXTsKKworICBzYl9uZXcgKCZleHApOworICBzYl9uZXcgKCZjb3B5KTsKKyAgc2JfbmV3ICgmc3ViKTsKKyAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKKyAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iKSwgMCwgJmV4cCwgJnJjKTsKKyAgaWYgKCFtcmkpCisgICAgcmV0ID0gYnVmZmVyX2FuZF9uZXN0ICgiQVJFUEVBVCIsICJBRU5EUiIsICZzdWIsIGdldF9saW5lKTsKKyAgZWxzZQorICAgIHJldCA9IGJ1ZmZlcl9hbmRfbmVzdCAoIlJFUFQiLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKTsKKyAgaWYgKCEgcmV0KQorICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBUkVQRUFUIHdpdGhvdXQgYSBBRU5EUiBhdCAlZC5cbiIpLCBsaW5lIC0gMSkpOworICBpZiAocmMgPiAwKQorICAgIHsKKyAgICAgIC8qIFB1c2ggYmFjayB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIHJlcGVhdCwgYW5kIGFub3RoZXIgcmVwZWF0IGJsb2NrCisJIHNvCisJIC5BUkVQRUFUIDIwCisJIGZvbworCSAuQUVORFIKKwkgZ2V0cyB0dXJuZWQgaW50bworCSBmb28KKwkgLkFSRVBFQVQgMTkKKwkgZm9vCisJIC5BRU5EUgorCSAqLworICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOworICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7CisgICAgICBpZiAocmMgPiAxKQorCXsKKwkgIGlmICghbXJpKQorCSAgICBzcHJpbnRmIChidWZmZXIsICJcdC5BUkVQRUFUCSVkXG4iLCByYyAtIDEpOworCSAgZWxzZQorCSAgICBzcHJpbnRmIChidWZmZXIsICJcdFJFUFQJJWRcbiIsIHJjIC0gMSk7CisJICBzYl9hZGRfc3RyaW5nICgmY29weSwgYnVmZmVyKTsKKwkgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOworCSAgaWYgKCFtcmkpCisJICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCS5BRU5EUlxuIik7CisJICBlbHNlCisJICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCUVORFJcbiIpOworCX0KKworICAgICAgaW5jbHVkZV9idWYgKCZleHAsICZjb3B5LCBpbmNsdWRlX3JlcGVhdCwgaW5kZXgpOworICAgIH0KKyAgc2Jfa2lsbCAoJmV4cCk7CisgIHNiX2tpbGwgKCZzdWIpOworICBzYl9raWxsICgmY29weSk7Cit9CisKKy8qIC5FTkRNICovCisKK3N0YXRpYyB2b2lkCitkb19lbmRtICgpCit7CisgIEVSUk9SICgoc3RkZXJyLCBfKCIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIikpKTsKK30KKworLyogTVJJIElSUCBwc2V1ZG8tb3AuICAqLworCitzdGF0aWMgdm9pZAorZG9faXJwIChpZHgsIGluLCBpcnBjKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIGludCBpcnBjOworeworICBjb25zdCBjaGFyICplcnI7CisgIHNiIG91dDsKKworICBzYl9uZXcgKCZvdXQpOworCisgIGVyciA9IGV4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sICZvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpOworICBpZiAoZXJyICE9IE5VTEwpCisgICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7CisKKyAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgc2JfdGVybWluYXRlICgmb3V0KSk7CisKKyAgc2Jfa2lsbCAoJm91dCk7Cit9CisKKy8qIE1BQ1JPIFBST0NFU1NJTkcgKi8KKworLyogUGFyc2Ugb2ZmIExPQ0FMIG4xLCBuMiwuLi4gSW52ZW50IGEgbGFiZWwgbmFtZSBmb3IgaXQgKi8KK3N0YXRpYwordm9pZCAKK2RvX2xvY2FsIChpZHgsIGxpbmUpCisgICAgIGludCBpZHg7CisgICAgIHNiICpsaW5lOworeworICBFUlJPUiAoKHN0ZGVyciwgXygiTE9DQUwgb3V0c2lkZSBvZiBNQUNSTyIpKSk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19tYWNybyAoaWR4LCBpbikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworeworICBjb25zdCBjaGFyICplcnI7CisgIGludCBsaW5lID0gbGluZWNvdW50ICgpOworCisgIGVyciA9IGRlZmluZV9tYWNybyAoaWR4LCBpbiwgJmxhYmVsLCBnZXRfbGluZSwgKGNvbnN0IGNoYXIgKiopIE5VTEwpOworICBpZiAoZXJyICE9IE5VTEwpCisgICAgRVJST1IgKChzdGRlcnIsIF8oIm1hY3JvIGF0IGxpbmUgJWQ6ICVzXG4iKSwgbGluZSAtIDEsIGVycikpOworfQorCitzdGF0aWMgaW50CittYWNyb19vcCAoaWR4LCBpbikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworeworICBjb25zdCBjaGFyICplcnI7CisgIHNiIG91dDsKKyAgc2IgbmFtZTsKKworICBpZiAoISBtYWNyb19kZWZpbmVkKQorICAgIHJldHVybiAwOworCisgIHNiX3Rlcm1pbmF0ZSAoaW4pOworICBpZiAoISBjaGVja19tYWNybyAoaW4tPnB0ciArIGlkeCwgJm91dCwgY29tbWVudF9jaGFyLCAmZXJyKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoZXJyICE9IE5VTEwpCisgICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7CisKKyAgc2JfbmV3ICgmbmFtZSk7CisgIHNiX2FkZF9zdHJpbmcgKCZuYW1lLCBfKCJtYWNybyBleHBhbnNpb24iKSk7CisKKyAgaW5jbHVkZV9idWYgKCZuYW1lLCAmb3V0LCBpbmNsdWRlX21hY3JvLCBpbmNsdWRlX25leHRfaW5kZXggKCkpOworCisgIHNiX2tpbGwgKCZuYW1lKTsKKyAgc2Jfa2lsbCAoJm91dCk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFNUUklORyBIQU5ETElORyAqLworCitzdGF0aWMgaW50CitnZXRzdHJpbmcgKGlkeCwgaW4sIGFjYykKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBzYiAqYWNjOworeworICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKworICB3aGlsZSAoaWR4IDwgaW4tPmxlbgorCSAmJiAoaW4tPnB0cltpZHhdID09ICciJyAKKwkgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnPCcgCisJICAgICB8fCAoaW4tPnB0cltpZHhdID09ICdcJycgJiYgYWx0ZXJuYXRlKSkpCisgICAgeworICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCisJeworCSAgaWYgKGFsdGVybmF0ZSB8fCBtcmkpCisJICAgIHsKKwkgICAgICBpbnQgbmVzdCA9IDA7CisJICAgICAgaWR4Kys7CisJICAgICAgd2hpbGUgKChpbi0+cHRyW2lkeF0gIT0gJz4nIHx8IG5lc3QpCisJCSAgICAgJiYgaWR4IDwgaW4tPmxlbikKKwkJeworCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyEnKQorCQkgICAgeworCQkgICAgICBpZHgrKyAgOworCQkgICAgICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7CisJCSAgICB9CisJCSAgZWxzZSB7CisJCSAgICBpZiAoaW4tPnB0cltpZHhdID09ICc+JykKKwkJICAgICAgbmVzdC0tOworCQkgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCisJCSAgICAgIG5lc3QrKzsKKwkJICAgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKKwkJICB9CisJCX0KKwkgICAgICBpZHgrKzsKKwkgICAgfQorCSAgZWxzZSB7CisJICAgIGludCBjb2RlOworCSAgICBpZHgrKzsKKwkgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwKKwkJCSAgICAgICBpZHgsIGluLCAmY29kZSk7CisJICAgIHNiX2FkZF9jaGFyIChhY2MsIGNvZGUpOworCisJICAgIGlmIChpbi0+cHRyW2lkeF0gIT0gJz4nKQorCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLlxuIikpKTsKKwkgICAgaWR4Kys7CisJICB9CisJfQorICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJyB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKKwl7CisJICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOworCSAgaWR4Kys7CisJICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKKwkgICAgeworCSAgICAgIGlmIChhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICchJykKKwkJeworCQkgIGlkeCsrICA7CisJCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOworCQl9CisJICAgICAgZWxzZSB7CisJCWlmIChpbi0+cHRyW2lkeF0gPT0gdGNoYXIpCisJCSAgeworCQkgICAgaWR4Kys7CisJCSAgICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9IHRjaGFyKQorCQkgICAgICBicmVhazsKKwkJICB9CisJCXNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4XSk7CisJCWlkeCsrOworCSAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisgIAorICByZXR1cm4gaWR4OworfQorCisvKiAuU0RBVEFbQ3xaXSA8c3RyaW5nPiAqLworCitzdGF0aWMKK3ZvaWQKK2RvX3NkYXRhIChpZHgsIGluLCB0eXBlKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIGludCB0eXBlOworeworICBpbnQgbmMgPSAwOworICBpbnQgcGlkeCA9IC0xOworICBzYiBhY2M7CisgIHNiX25ldyAoJmFjYyk7CisgIGZwcmludGYgKG91dGZpbGUsICIuYnl0ZVx0Iik7CisKKyAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgc2JfcmVzZXQgKCZhY2MpOworICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisgICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCisJeworCSAgcGlkeCA9IGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmYWNjLCAwLCAxKTsKKwkgIGlmICh0eXBlID09ICdjJykKKwkgICAgeworCSAgICAgIGlmIChhY2MubGVuID4gMjU1KQorCQl7CisJCSAgRVJST1IgKChzdGRlcnIsIF8oInN0cmluZyBmb3IgU0RBVEFDIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzICglZCkuXG4iKSwgYWNjLmxlbikpOworCQl9CisJICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLmxlbik7CisJICAgICAgbmMgPSAxOworCSAgICB9CisKKwkgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCisJICAgIHsKKwkgICAgICBpZiAobmMpCisJCXsKKwkJICBmcHJpbnRmIChvdXRmaWxlLCAiLCIpOworCQl9CisJICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7CisJICAgICAgbmMgPSAxOworCSAgICB9CisKKwkgIGlmICh0eXBlID09ICd6JykKKwkgICAgeworCSAgICAgIGlmIChuYykKKwkJZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKKwkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiMCIpOworCSAgICB9CisJICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKKwkgIGlmIChpZHggPT0gcGlkeCkgYnJlYWs7CisJfQorICAgICAgaWYgKCFhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdICE9ICcsJyAmJiBpZHggIT0gaW4tPmxlbikKKwl7CisJICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKKwkgIEVSUk9SICgoc3RkZXJyLCBfKCJpbGxlZ2FsIGNoYXJhY3RlciBpbiBTREFUQSBsaW5lICgweCV4KS5cbiIpLCBpbi0+cHRyW2lkeF0pKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlkeCsrOworICAgIH0KKyAgc2Jfa2lsbCAoJmFjYyk7CisgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOworfQorCisvKiAuU0RBVEFCIDxjb3VudD4gPHN0cmluZz4gKi8KKworc3RhdGljIHZvaWQKK2RvX3NkYXRhYiAoaWR4LCBpbikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworeworICBpbnQgcmVwZWF0OworICBpbnQgaTsKKyAgc2IgYWNjOworICBzYl9uZXcgKCZhY2MpOworCisgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJNdXN0IGhhdmUgYWJzb2x1dGUgU0RBVEFCIHJlcGVhdCBjb3VudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKKyAgaWYgKHJlcGVhdCA8PSAwKQorICAgIHsKKyAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNdXN0IGhhdmUgcG9zaXRpdmUgU0RBVEFCIHJlcGVhdCBjb3VudCAoJWQpLlxuIiksIHJlcGVhdCkpOworICAgICAgcmVwZWF0ID0gMTsKKyAgICB9CisKKyAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7CisgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjYyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChpKQorCWZwcmludGYgKG91dGZpbGUsICJcdCIpOworICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5ieXRlXHQiKTsKKyAgICAgIHNiX3ByaW50IChvdXRmaWxlLCAmYWNjKTsKKyAgICAgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOworICAgIH0KKyAgc2Jfa2lsbCAoJmFjYyk7CisKK30KKworc3RhdGljIGludAorbmV3X2ZpbGUgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIEZJTEUgKm5ld29uZSA9IGZvcGVuIChuYW1lLCAiciIpOworICBpZiAoIW5ld29uZSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoaXNwID09IE1BWF9JTkNMVURFUykKKyAgICBGQVRBTCAoKHN0ZGVyciwgXygiVW5yZWFzb25hYmxlIGluY2x1ZGUgZGVwdGggKCVsZCkuXG4iKSwgKGxvbmcpIGlzcCkpOworCisgIHNwKys7CisgIHNwLT5oYW5kbGUgPSBuZXdvbmU7CisKKyAgc2JfbmV3ICgmc3AtPm5hbWUpOworICBzYl9hZGRfc3RyaW5nICgmc3AtPm5hbWUsIG5hbWUpOworCisgIHNwLT5saW5lY291bnQgPSAxOworICBzcC0+cHVzaGJhY2tfaW5kZXggPSAwOworICBzcC0+dHlwZSA9IGluY2x1ZGVfZmlsZTsKKyAgc3AtPmluZGV4ID0gMDsKKyAgc2JfbmV3ICgmc3AtPnB1c2hiYWNrKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitkb19pbmNsdWRlIChpZHgsIGluKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47Cit7CisgIHNiIHQ7CisgIHNiIGNhdDsKKyAgaW5jbHVkZV9wYXRoICppbmNsdWRlczsKKworICBzYl9uZXcgKCZ0KTsKKyAgc2JfbmV3ICgmY2F0KTsKKworICBpZiAoISBtcmkpCisgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmdCk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKyAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmICEgSVNXSElURSAoaW4tPnB0cltpZHhdKSkKKwl7CisJICBzYl9hZGRfY2hhciAoJnQsIGluLT5wdHJbaWR4XSk7CisJICArK2lkeDsKKwl9CisgICAgfQorCisgIGZvciAoaW5jbHVkZXMgPSBwYXRoc19oZWFkOyBpbmNsdWRlczsgaW5jbHVkZXMgPSBpbmNsdWRlcy0+bmV4dCkKKyAgICB7CisgICAgICBzYl9yZXNldCAoJmNhdCk7CisgICAgICBzYl9hZGRfc2IgKCZjYXQsICZpbmNsdWRlcy0+cGF0aCk7CisgICAgICBzYl9hZGRfY2hhciAoJmNhdCwgJy8nKTsKKyAgICAgIHNiX2FkZF9zYiAoJmNhdCwgJnQpOworICAgICAgaWYgKG5ld19maWxlIChzYl9uYW1lICgmY2F0KSkpCisJeworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKCFpbmNsdWRlcykKKyAgICB7CisgICAgICBpZiAoISBuZXdfZmlsZSAoc2JfbmFtZSAoJnQpKSkKKwlGQVRBTCAoKHN0ZGVyciwgXygiQ2FuJ3Qgb3BlbiBpbmNsdWRlIGZpbGUgYCVzJy5cbiIpLCBzYl9uYW1lICgmdCkpKTsKKyAgICB9CisgIHNiX2tpbGwgKCZjYXQpOworICBzYl9raWxsICgmdCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbmNsdWRlX3BvcCAoKQoreworICBpZiAoc3AgIT0gaW5jbHVkZV9zdGFjaykKKyAgICB7CisgICAgICBpZiAoc3AtPmhhbmRsZSkKKwlmY2xvc2UgKHNwLT5oYW5kbGUpOworICAgICAgc3AtLTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5jbHVkZSBzdGFjay4gIElmIHRoZXJlJ3MgYW55dGhpbmcKKyAgIGluIHRoZSBwdXNoYmFjayBidWZmZXIsIHRha2UgdGhhdCBmaXJzdC4gIElmIHdlJ3JlIGF0IGVvZiwgcG9wIGZyb20KKyAgIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLiAgS2VlcCB0aGUgbGluZWNvdW50IHVwIHRvIGRhdGUuICovCisKK3N0YXRpYyBpbnQKK2dldCAoKQoreworICBpbnQgcjsKKworICBpZiAoc3AtPnB1c2hiYWNrLmxlbiAhPSBzcC0+cHVzaGJhY2tfaW5kZXgpCisgICAgeworICAgICAgciA9IChjaGFyKSAoc3AtPnB1c2hiYWNrLnB0cltzcC0+cHVzaGJhY2tfaW5kZXgrK10pOworICAgICAgLyogV2hlbiB0aGV5J3ZlIGFsbCBnb25lLCByZXNldCB0aGUgcG9pbnRlciAqLworICAgICAgaWYgKHNwLT5wdXNoYmFja19pbmRleCA9PSBzcC0+cHVzaGJhY2subGVuKQorCXsKKwkgIHNwLT5wdXNoYmFjay5sZW4gPSAwOworCSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKKwl9CisgICAgfQorICBlbHNlIGlmIChzcC0+aGFuZGxlKQorICAgIHsKKyAgICAgIHIgPSBnZXRjIChzcC0+aGFuZGxlKTsKKyAgICB9CisgIGVsc2UKKyAgICByID0gRU9GOworCisgIGlmIChyID09IEVPRiAmJiBpc3ApCisgICAgeworICAgICAgaW5jbHVkZV9wb3AgKCk7CisgICAgICByID0gZ2V0ICgpOworICAgICAgd2hpbGUgKHIgPT0gRU9GICYmIGlzcCkKKwl7CisJICBpbmNsdWRlX3BvcCAoKTsKKwkgIHIgPSBnZXQgKCk7CisJfQorICAgICAgcmV0dXJuIHI7CisgICAgfQorICBpZiAociA9PSAnXG4nKQorICAgIHsKKyAgICAgIHNwLT5saW5lY291bnQrKzsKKyAgICB9CisKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK2xpbmVjb3VudCAoKQoreworICByZXR1cm4gc3AtPmxpbmVjb3VudDsKK30KKworc3RhdGljIGludAoraW5jbHVkZV9uZXh0X2luZGV4ICgpCit7CisgIHN0YXRpYyBpbnQgaW5kZXg7CisgIGlmICghdW5yZWFzb25hYmxlCisgICAgICAmJiBpbmRleCA+IE1BWF9SRUFTT05BQkxFKQorICAgIEZBVEFMICgoc3RkZXJyLCBfKCJVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLlxuIikpKTsKKyAgcmV0dXJuICsraW5kZXg7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgY2hhcnR5cGUgdmVjdG9yLiAqLworCitzdGF0aWMgdm9pZAorY2hhcnR5cGVfaW5pdCAoKQoreworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKQorICAgIHsKKyAgICAgIGlmIChpc2FscGhhICh4KSB8fCB4ID09ICdfJyB8fCB4ID09ICckJykKKwljaGFydHlwZVt4XSB8PSBGSVJTVEJJVDsKKworICAgICAgaWYgKG1yaSAmJiB4ID09ICcuJykKKwljaGFydHlwZVt4XSB8PSBGSVJTVEJJVDsKKworICAgICAgaWYgKGlzZGlnaXQgKHgpIHx8IGlzYWxwaGEgKHgpIHx8IHggPT0gJ18nIHx8IHggPT0gJyQnKQorCWNoYXJ0eXBlW3hdIHw9IE5FWFRCSVQ7CisKKyAgICAgIGlmICh4ID09ICcgJyB8fCB4ID09ICdcdCcgfHwgeCA9PSAnLCcgfHwgeCA9PSAnIicgfHwgeCA9PSAnOycKKwkgIHx8IHggPT0gJyInIHx8IHggPT0gJzwnIHx8IHggPT0gJz4nIHx8IHggPT0gJyknIHx8IHggPT0gJygnKQorCWNoYXJ0eXBlW3hdIHw9IFNFUEJJVDsKKworICAgICAgaWYgKHggPT0gJ2InIHx8IHggPT0gJ0InCisJICB8fCB4ID09ICdxJyB8fCB4ID09ICdRJworCSAgfHwgeCA9PSAnaCcgfHwgeCA9PSAnSCcKKwkgIHx8IHggPT0gJ2QnIHx8IHggPT0gJ0QnKQorCWNoYXJ0eXBlIFt4XSB8PSBCQVNFQklUOworCSAgCisgICAgICBpZiAoeCA9PSAnICcgfHwgeCA9PSAnXHQnKQorCWNoYXJ0eXBlW3hdIHw9IFdISVRFQklUOworCisgICAgICBpZiAoeCA9PSBjb21tZW50X2NoYXIpCisJY2hhcnR5cGVbeF0gfD0gQ09NTUVOVEJJVDsKKyAgICB9Cit9CisKKworCisvKiBXaGF0IHRvIGRvIHdpdGggYWxsIHRoZSBrZXl3b3JkcyAqLworI2RlZmluZSBQUk9DRVNTIAkweDEwMDAgIC8qIFJ1biBzdWJzdGl0dXRpb24gb3ZlciB0aGUgbGluZSAqLworI2RlZmluZSBMQUIJCTB4MjAwMCAgLyogU3BpdCBvdXQgdGhlIGxhYmVsICovCisKKyNkZWZpbmUgS19FUVUgCQkoUFJPQ0VTU3wxKQorI2RlZmluZSBLX0FTU0lHTiAJKFBST0NFU1N8MikKKyNkZWZpbmUgS19SRUcgCQkoUFJPQ0VTU3wzKQorI2RlZmluZSBLX09SRyAJCShQUk9DRVNTfDQpCisjZGVmaW5lIEtfUkFESVggCShQUk9DRVNTfDUpCisjZGVmaW5lIEtfREFUQSAJCShMQUJ8UFJPQ0VTU3w2KQorI2RlZmluZSBLX0RBVEFCIAkoTEFCfFBST0NFU1N8NykKKyNkZWZpbmUgS19TREFUQSAJKExBQnxQUk9DRVNTfDgpCisjZGVmaW5lIEtfU0RBVEFCIAkoTEFCfFBST0NFU1N8OSkKKyNkZWZpbmUgS19TREFUQUMgCShMQUJ8UFJPQ0VTU3wxMCkKKyNkZWZpbmUgS19TREFUQVoJKExBQnxQUk9DRVNTfDExKQorI2RlZmluZSBLX1JFUyAJCShMQUJ8UFJPQ0VTU3wxMikKKyNkZWZpbmUgS19TUkVTIAkJKExBQnxQUk9DRVNTfDEzKQorI2RlZmluZSBLX1NSRVNDIAkoTEFCfFBST0NFU1N8MTQpCisjZGVmaW5lIEtfU1JFU1ogCShMQUJ8UFJPQ0VTU3wxNSkKKyNkZWZpbmUgS19FWFBPUlQgCShMQUJ8UFJPQ0VTU3wxNikKKyNkZWZpbmUgS19HTE9CQUwgCShMQUJ8UFJPQ0VTU3wxNykKKyNkZWZpbmUgS19QUklOVCAJKExBQnxQUk9DRVNTfDE5KQorI2RlZmluZSBLX0ZPUk0gCQkoTEFCfFBST0NFU1N8MjApCisjZGVmaW5lIEtfSEVBRElORwkoTEFCfFBST0NFU1N8MjEpCisjZGVmaW5lIEtfUEFHRQkJKExBQnxQUk9DRVNTfDIyKQorI2RlZmluZSBLX0lNUE9SVAkoTEFCfFBST0NFU1N8MjMpCisjZGVmaW5lIEtfUFJPR1JBTQkoTEFCfFBST0NFU1N8MjQpCisjZGVmaW5lIEtfRU5ECQkoUFJPQ0VTU3wyNSkKKyNkZWZpbmUgS19JTkNMVURFCShQUk9DRVNTfDI2KQorI2RlZmluZSBLX0lHTk9SRUQJKFBST0NFU1N8MjcpCisjZGVmaW5lIEtfQVNTSUdOQQkoUFJPQ0VTU3wyOCkKKyNkZWZpbmUgS19BU1NJR05DCSgyOSkKKyNkZWZpbmUgS19BSUYJCShQUk9DRVNTfDMwKQorI2RlZmluZSBLX0FFTFNFCQkoUFJPQ0VTU3wzMSkKKyNkZWZpbmUgS19BRU5ESQkJKFBST0NFU1N8MzIpCisjZGVmaW5lIEtfQVJFUEVBVAkoUFJPQ0VTU3wzMykKKyNkZWZpbmUgS19BRU5EUgkJKFBST0NFU1N8MzQpCisjZGVmaW5lIEtfQVdISUxFCSgzNSkKKyNkZWZpbmUgS19BRU5EVwkJKFBST0NFU1N8MzYpCisjZGVmaW5lIEtfRVhJVE0JCSgzNykKKyNkZWZpbmUgS19NQUNSTwkJKFBST0NFU1N8MzgpCisjZGVmaW5lIEtfRU5ETQkJKDM5KQorI2RlZmluZSBLX0FMSUdOCQkoUFJPQ0VTU3xMQUJ8NDApCisjZGVmaW5lIEtfQUxURVJOQVRFICAgICAoNDEpCisjZGVmaW5lIEtfREIJCShMQUJ8UFJPQ0VTU3w0MikKKyNkZWZpbmUgS19EVwkJKExBQnxQUk9DRVNTfDQzKQorI2RlZmluZSBLX0RMCQkoTEFCfFBST0NFU1N8NDQpCisjZGVmaW5lIEtfTE9DQUwJCSg0NSkKKyNkZWZpbmUgS19JRkVRCQkoUFJPQ0VTU3w0NikKKyNkZWZpbmUgS19JRk5FCQkoUFJPQ0VTU3w0NykKKyNkZWZpbmUgS19JRkxUCQkoUFJPQ0VTU3w0OCkKKyNkZWZpbmUgS19JRkxFCQkoUFJPQ0VTU3w0OSkKKyNkZWZpbmUgS19JRkdFCQkoUFJPQ0VTU3w1MCkKKyNkZWZpbmUgS19JRkdUCQkoUFJPQ0VTU3w1MSkKKyNkZWZpbmUgS19JRkMJCShQUk9DRVNTfDUyKQorI2RlZmluZSBLX0lGTkMJCShQUk9DRVNTfDUzKQorI2RlZmluZSBLX0lSUAkJKFBST0NFU1N8NTQpCisjZGVmaW5lIEtfSVJQQwkJKFBST0NFU1N8NTUpCisKKworc3RydWN0IGtleXdvcmQKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50IGNvZGU7CisgIGludCBleHRyYTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5d29yZCBraW5mb1tdID0KK3sKKyAgeyAiRVFVIiwgS19FUVUsIDAgfSwKKyAgeyAiQUxURVJOQVRFIiwgS19BTFRFUk5BVEUsIDAgfSwKKyAgeyAiQVNTSUdOIiwgS19BU1NJR04sIDAgfSwKKyAgeyAiUkVHIiwgS19SRUcsIDAgfSwKKyAgeyAiT1JHIiwgS19PUkcsIDAgfSwKKyAgeyAiUkFESVgiLCBLX1JBRElYLCAwIH0sCisgIHsgIkRBVEEiLCBLX0RBVEEsIDAgfSwKKyAgeyAiREIiLCBLX0RCLCAwIH0sCisgIHsgIkRXIiwgS19EVywgMCB9LAorICB7ICJETCIsIEtfREwsIDAgfSwKKyAgeyAiREFUQUIiLCBLX0RBVEFCLCAwIH0sCisgIHsgIlNEQVRBIiwgS19TREFUQSwgMCB9LAorICB7ICJTREFUQUIiLCBLX1NEQVRBQiwgMCB9LAorICB7ICJTREFUQVoiLCBLX1NEQVRBWiwgMCB9LAorICB7ICJTREFUQUMiLCBLX1NEQVRBQywgMCB9LAorICB7ICJSRVMiLCBLX1JFUywgMCB9LAorICB7ICJTUkVTIiwgS19TUkVTLCAwIH0sCisgIHsgIlNSRVNDIiwgS19TUkVTQywgMCB9LAorICB7ICJTUkVTWiIsIEtfU1JFU1osIDAgfSwKKyAgeyAiRVhQT1JUIiwgS19FWFBPUlQsIDAgfSwKKyAgeyAiR0xPQkFMIiwgS19HTE9CQUwsIDAgfSwKKyAgeyAiUFJJTlQiLCBLX1BSSU5ULCAwIH0sCisgIHsgIkZPUk0iLCBLX0ZPUk0sIDAgfSwKKyAgeyAiSEVBRElORyIsIEtfSEVBRElORywgMCB9LAorICB7ICJQQUdFIiwgS19QQUdFLCAwIH0sCisgIHsgIlBST0dSQU0iLCBLX0lHTk9SRUQsIDAgfSwKKyAgeyAiRU5EIiwgS19FTkQsIDAgfSwKKyAgeyAiSU5DTFVERSIsIEtfSU5DTFVERSwgMCB9LAorICB7ICJBU1NJR05BIiwgS19BU1NJR05BLCAwIH0sCisgIHsgIkFTU0lHTkMiLCBLX0FTU0lHTkMsIDAgfSwKKyAgeyAiQUlGIiwgS19BSUYsIDAgfSwKKyAgeyAiQUVMU0UiLCBLX0FFTFNFLCAwIH0sCisgIHsgIkFFTkRJIiwgS19BRU5ESSwgMCB9LAorICB7ICJBUkVQRUFUIiwgS19BUkVQRUFULCAwIH0sCisgIHsgIkFFTkRSIiwgS19BRU5EUiwgMCB9LAorICB7ICJFWElUTSIsIEtfRVhJVE0sIDAgfSwKKyAgeyAiTUFDUk8iLCBLX01BQ1JPLCAwIH0sCisgIHsgIkVORE0iLCBLX0VORE0sIDAgfSwKKyAgeyAiQVdISUxFIiwgS19BV0hJTEUsIDAgfSwKKyAgeyAiQUxJR04iLCBLX0FMSUdOLCAwIH0sCisgIHsgIkFFTkRXIiwgS19BRU5EVywgMCB9LAorICB7ICJBTFRFUk5BVEUiLCBLX0FMVEVSTkFURSwgMCB9LAorICB7ICJMT0NBTCIsIEtfTE9DQUwsIDAgfSwKKyAgeyBOVUxMLCAwLCAwIH0KK307CisKKy8qIEFsdGhvdWdoIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYXJlIGhhbmRsZWQgYnkgZ2FzLCB3ZSBuZWVkIHRvCisgICBoYW5kbGUgdGhlbSBoZXJlIGFzIHdlbGwsIGluIGNhc2UgdGhleSBhcmUgdXNlZCBpbiBhIHJlY3Vyc2l2ZQorICAgbWFjcm8gdG8gZW5kIHRoZSByZWN1cnNpb24uICAqLworCitzdGF0aWMgc3RydWN0IGtleXdvcmQgbXJpa2luZm9bXSA9Cit7CisgIHsgIklGRVEiLCBLX0lGRVEsIDAgfSwKKyAgeyAiSUZORSIsIEtfSUZORSwgMCB9LAorICB7ICJJRkxUIiwgS19JRkxULCAwIH0sCisgIHsgIklGTEUiLCBLX0lGTEUsIDAgfSwKKyAgeyAiSUZHRSIsIEtfSUZHRSwgMCB9LAorICB7ICJJRkdUIiwgS19JRkdULCAwIH0sCisgIHsgIklGQyIsIEtfSUZDLCAwIH0sCisgIHsgIklGTkMiLCBLX0lGTkMsIDAgfSwKKyAgeyAiRUxTRUMiLCBLX0FFTFNFLCAwIH0sCisgIHsgIkVOREMiLCBLX0FFTkRJLCAwIH0sCisgIHsgIk1FWElUIiwgS19FWElUTSwgMCB9LAorICB7ICJSRVBUIiwgS19BUkVQRUFULCAwIH0sCisgIHsgIklSUCIsIEtfSVJQLCAwIH0sCisgIHsgIklSUEMiLCBLX0lSUEMsIDAgfSwKKyAgeyAiRU5EUiIsIEtfQUVORFIsIDAgfSwKKyAgeyBOVUxMLCAwLCAwIH0KK307CisKKy8qIExvb2sgZm9yIGEgcHNldWRvIG9wIG9uIHRoZSBsaW5lLiBJZiBvbmUncyB0aGVyZSB0aGVuIGNhbGwKKyAgIGl0cyBoYW5kbGVyLiAqLworCitzdGF0aWMgaW50Citwcm9jZXNzX3BzZXVkb19vcCAoaWR4LCBsaW5lLCBhY2MpCisgICAgIGludCBpZHg7CisgICAgIHNiICpsaW5lOworICAgICBzYiAqYWNjOworeworICBpbnQgb2lkeCA9IGlkeDsKKworICBpZiAobGluZS0+cHRyW2lkeF0gPT0gJy4nIHx8IGFsdGVybmF0ZSB8fCBtcmkpCisgICAgeworICAgICAgLyogU2NhbiBmb3J3YXJkIGFuZCBmaW5kIHBzZXVkbyBuYW1lICovCisgICAgICBjaGFyICppbjsKKyAgICAgIGhhc2hfZW50cnkgKnB0cjsKKworICAgICAgY2hhciAqczsKKyAgICAgIGNoYXIgKmU7CisgICAgICBpZiAobGluZS0+cHRyW2lkeF0gPT0gJy4nKQorCWlkeCsrOworICAgICAgaW4gPSBsaW5lLT5wdHIgKyBpZHg7CisgICAgICBzID0gaW47CisgICAgICBlID0gczsKKyAgICAgIHNiX3Jlc2V0IChhY2MpOworCisgICAgICB3aGlsZSAoaWR4IDwgbGluZS0+bGVuICYmICplICYmIElTRklSU1RDSEFSICgqZSkpCisJeworCSAgc2JfYWRkX2NoYXIgKGFjYywgKmUpOworCSAgZSsrOworCSAgaWR4Kys7CisJfQorCisgICAgICBwdHIgPSBoYXNoX2xvb2t1cCAoJmtleXdvcmRfaGFzaF90YWJsZSwgYWNjKTsKKworICAgICAgaWYgKCFwdHIpCisJeworI2lmIDAKKwkgIC8qIFRoaXMgb25lIGNhdXNlcyBsb3RzIG9mIHBhaW4gd2hlbiB0cnlpbmcgdG8gcHJlcHJvY2VzcworCSAgICAgb3JkaW5hcnkgY29kZSAqLworCSAgV0FSTklORyAoKHN0ZGVyciwgXygiVW5yZWNvZ25pc2VkIHBzZXVkbyBvcCBgJXMnLlxuIiksIHNiX25hbWUgKGFjYykpKTsKKyNlbmRpZgorCSAgcmV0dXJuIDA7CisJfQorICAgICAgaWYgKHB0ci0+dmFsdWUuaSAmIExBQikKKwl7CQkJLyogb3V0cHV0IHRoZSBsYWJlbCAqLworCSAgaWYgKGxhYmVsLmxlbikKKwkgICAgeworCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOworCSAgICB9CisJICBlbHNlCisJICAgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOworCX0KKworICAgICAgaWYgKG1yaSAmJiBwdHItPnZhbHVlLmkgPT0gS19FTkQpCisJeworCSAgc2IgdDsKKworCSAgc2JfbmV3ICgmdCk7CisJICBzYl9hZGRfYnVmZmVyICgmdCwgbGluZS0+cHRyICsgb2lkeCwgaWR4IC0gb2lkeCk7CisJICBmcHJpbnRmIChvdXRmaWxlLCAiXHQlcyIsIHNiX25hbWUgKCZ0KSk7CisJICBzYl9raWxsICgmdCk7CisJfQorCisgICAgICBpZiAocHRyLT52YWx1ZS5pICYgUFJPQ0VTUykKKwl7CisJICAvKiBQb2xpc2ggdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYmVmb3JlIGhhbmRsaW5nIHRoZSBwc2V1ZG8gb3AgKi8KKyNpZiAwCisJICBzdHJpcF9jb21tZW50cyhsaW5lKTsKKyNlbmRpZgorCSAgc2JfcmVzZXQgKGFjYyk7CisJICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgbGluZSwgYWNjKTsKKwkgIHNiX3Jlc2V0KGxpbmUpOworCSAgY2hhbmdlX2Jhc2UgKDAsIGFjYywgbGluZSk7CisJICBpZHggPSAwOworCX0KKyAgICAgIGlmICghY29uZGFzc19vbiAoKSkKKwl7CisJICBzd2l0Y2ggKHB0ci0+dmFsdWUuaSkKKwkgICAgeworCSAgICBjYXNlIEtfQUlGOgorCSAgICAgIGRvX2FpZiAoaWR4LCBsaW5lKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBLX0FFTFNFOgorCSAgICAgIGRvX2FlbHNlICgpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEtfQUVOREk6CisJICAgICAgZG9fYWVuZGkgKCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzd2l0Y2ggKHB0ci0+dmFsdWUuaSkKKwkgICAgeworCSAgICBjYXNlIEtfQUxURVJOQVRFOgorCSAgICAgIGFsdGVybmF0ZSA9IDE7CisJICAgICAgbWFjcm9faW5pdCAoMSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19BRUxTRToKKwkgICAgICBkb19hZWxzZSAoKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0FFTkRJOgorCSAgICAgIGRvX2FlbmRpICgpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfT1JHOgorCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJPUkcgY29tbWFuZCBub3QgYWxsb3dlZC5cbiIpKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgS19SQURJWDoKKwkgICAgICBkb19yYWRpeCAobGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19EQjoKKwkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDEpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfRFc6CisJICAgICAgZG9fZGF0YSAoaWR4LCBsaW5lLCAyKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0RMOgorCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgNCk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19EQVRBOgorCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgMCk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19EQVRBQjoKKwkgICAgICBkb19kYXRhYiAoaWR4LCBsaW5lKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX1NEQVRBOgorCSAgICAgIGRvX3NkYXRhIChpZHgsIGxpbmUsIDApOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfU0RBVEFCOgorCSAgICAgIGRvX3NkYXRhYiAoaWR4LCBsaW5lKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX1NEQVRBQzoKKwkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAnYycpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfU0RBVEFaOgorCSAgICAgIGRvX3NkYXRhIChpZHgsIGxpbmUsICd6Jyk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19BU1NJR046CisJICAgICAgZG9fYXNzaWduICgwLCAwLCBsaW5lKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0FJRjoKKwkgICAgICBkb19haWYgKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19BUkVQRUFUOgorCSAgICAgIGRvX2FyZXBlYXQgKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19BRU5EVzoKKwkgICAgICBkb19hZW5kdyAoKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0FXSElMRToKKwkgICAgICBkb19hd2hpbGUgKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19BRU5EUjoKKwkgICAgICBkb19hZW5kciAoKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0VRVToKKwkgICAgICBkb19hc3NpZ24gKDEsIGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19BTElHTjoKKwkgICAgICBkb19hbGlnbiAoaWR4LCBsaW5lKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX1JFUzoKKwkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgMCk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19TUkVTOgorCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAncycpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfSU5DTFVERToKKwkgICAgICBkb19pbmNsdWRlIChpZHgsIGxpbmUpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfTE9DQUw6CisJICAgICAgZG9fbG9jYWwgKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19NQUNSTzoKKwkgICAgICBkb19tYWNybyAoaWR4LCBsaW5lKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0VORE06CisJICAgICAgZG9fZW5kbSAoKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX1NSRVNDOgorCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAnYycpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfUFJJTlQ6CisJICAgICAgZG9fcHJpbnQgKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19GT1JNOgorCSAgICAgIGRvX2Zvcm0gKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19IRUFESU5HOgorCSAgICAgIGRvX2hlYWRpbmcgKGlkeCwgbGluZSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19QQUdFOgorCSAgICAgIGRvX3BhZ2UgKCk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19HTE9CQUw6CisJICAgIGNhc2UgS19FWFBPUlQ6CisJICAgICAgZG9fZXhwb3J0IChsaW5lKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0lNUE9SVDoKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX1NSRVNaOgorCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAneicpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfSUdOT1JFRDoKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0VORDoKKwkgICAgICBkb19lbmQgKGxpbmUpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfQVNTSUdOQToKKwkgICAgICBkb19hc3NpZ25hIChpZHgsIGxpbmUpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfQVNTSUdOQzoKKwkgICAgICBkb19hc3NpZ25jIChpZHgsIGxpbmUpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfRVhJVE06CisJICAgICAgZG9fZXhpdG0gKCk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19SRUc6CisJICAgICAgZG9fcmVnIChpZHgsIGxpbmUpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfSUZFUToKKwkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBFUSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19JRk5FOgorCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIE5FKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0lGTFQ6CisJICAgICAgZG9faWYgKGlkeCwgbGluZSwgTFQpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfSUZMRToKKwkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBMRSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgS19JRkdFOgorCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIEdFKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0lGR1Q6CisJICAgICAgZG9faWYgKGlkeCwgbGluZSwgR1QpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfSUZDOgorCSAgICAgIGRvX2lmYyAoaWR4LCBsaW5lLCAwKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0lGTkM6CisJICAgICAgZG9faWZjIChpZHgsIGxpbmUsIDEpOworCSAgICAgIHJldHVybiAxOworCSAgICBjYXNlIEtfSVJQOgorCSAgICAgIGRvX2lycCAoaWR4LCBsaW5lLCAwKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBLX0lSUEM6CisJICAgICAgZG9faXJwIChpZHgsIGxpbmUsIDEpOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworCisvKiBBZGQgYSBrZXl3b3JkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF9rZXl3b3JkIChuYW1lLCBjb2RlKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgY29kZTsKK3sKKyAgc2IgbGFiZWw7CisgIGludCBqOworCisgIHNiX25ldyAoJmxhYmVsKTsKKyAgc2JfYWRkX3N0cmluZyAoJmxhYmVsLCBuYW1lKTsKKworICBoYXNoX2FkZF90b19pbnRfdGFibGUgKCZrZXl3b3JkX2hhc2hfdGFibGUsICZsYWJlbCwgY29kZSk7CisKKyAgc2JfcmVzZXQgKCZsYWJlbCk7CisgIGZvciAoaiA9IDA7IG5hbWVbal07IGorKykKKyAgICBzYl9hZGRfY2hhciAoJmxhYmVsLCBuYW1lW2pdIC0gJ0EnICsgJ2EnKTsKKyAgaGFzaF9hZGRfdG9faW50X3RhYmxlICgma2V5d29yZF9oYXNoX3RhYmxlLCAmbGFiZWwsIGNvZGUpOworCisgIHNiX2tpbGwgKCZsYWJlbCk7Cit9ICAKKworLyogQnVpbGQgdGhlIGtleXdvcmQgaGFzaCB0YWJsZSAtIHB1dCBlYWNoIGtleXdvcmQgaW4gdGhlIHRhYmxlIHR3aWNlLAorICAgb25jZSB1cHBlciBhbmQgb25jZSBsb3dlciBjYXNlLiovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2luaXQgKCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsga2luZm9baV0ubmFtZTsgaSsrKQorICAgIGFkZF9rZXl3b3JkIChraW5mb1tpXS5uYW1lLCBraW5mb1tpXS5jb2RlKTsKKworICBpZiAobXJpKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IG1yaWtpbmZvW2ldLm5hbWU7IGkrKykKKwlhZGRfa2V5d29yZCAobXJpa2luZm9baV0ubmFtZSwgbXJpa2luZm9baV0uY29kZSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitkb19kZWZpbmUgKHN0cmluZykKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzYiBsYWJlbDsKKyAgaW50IHJlcyA9IDE7CisgIGhhc2hfZW50cnkgKnB0cjsKKyAgc2JfbmV3ICgmbGFiZWwpOworCisKKyAgd2hpbGUgKCpzdHJpbmcpCisgICAgeworICAgICAgaWYgKCpzdHJpbmcgPT0gJz0nKSAKKwl7CisJICBzYiB2YWx1ZTsKKwkgIHNiX25ldyAoJnZhbHVlKTsKKwkgIHN0cmluZysrOworCSAgd2hpbGUgKCpzdHJpbmcpCisJICAgIHsKKwkgICAgICBzYl9hZGRfY2hhciAoJnZhbHVlLCAqc3RyaW5nKTsKKwkgICAgICBzdHJpbmcrKzsKKwkgICAgfQorCSAgZXhwX2dldF9hYnMgKF8oIkludmFsaWQgZXhwcmVzc2lvbiBvbiBjb21tYW5kIGxpbmUuXG4iKSwgMCwgJnZhbHVlLCAmcmVzKTsKKwkgIHNiX2tpbGwgKCZ2YWx1ZSk7CisJICBicmVhazsKKwl9CisgICAgICBzYl9hZGRfY2hhciAoJmxhYmVsLCAqc3RyaW5nKTsKKworICAgICAgc3RyaW5nICsrOworICAgIH0KKworICBwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7CisgIGZyZWVfb2xkX2VudHJ5IChwdHIpOworICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7CisgIHB0ci0+dmFsdWUuaSA9IHJlczsKKyAgc2Jfa2lsbCAoJmxhYmVsKTsKK30KK2NoYXIgKnByb2dyYW1fbmFtZTsKKworLyogVGhlIGxpc3Qgb2YgbG9uZyBvcHRpb25zLiAgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KK3sKKyAgeyAiYWx0ZXJuYXRlIiwgbm9fYXJndW1lbnQsIDAsICdhJyB9LAorICB7ICJpbmNsdWRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAorICB7ICJjb21tZW50Y2hhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYycgfSwKKyAgeyAiY29weXNvdXJjZSIsIG5vX2FyZ3VtZW50LCAwLCAncycgfSwKKyAgeyAiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnIH0sCisgIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCisgIHsgIm1yaSIsIG5vX2FyZ3VtZW50LCAwLCAnTScgfSwKKyAgeyAib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdvJyB9LAorICB7ICJwcmludCIsIG5vX2FyZ3VtZW50LCAwLCAncCcgfSwKKyAgeyAidW5yZWFzb25hYmxlIiwgbm9fYXJndW1lbnQsIDAsICd1JyB9LAorICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2JyB9LAorICB7ICJkZWZpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2QnIH0sCisgIHsgTlVMTCwgbm9fYXJndW1lbnQsIDAsIDAgfQorfTsKKworLyogU2hvdyBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLworc3RhdGljIHZvaWQKK3Nob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKKyAgICAgRklMRSAqZmlsZTsKKyAgICAgaW50IHN0YXR1czsKK3sKKyAgZnByaW50ZiAoZmlsZSwgXygiXAorVXNhZ2U6ICVzIFxuXAorICBbLWFdICAgICAgWy0tYWx0ZXJuYXRlXSAgICAgICAgIGVudGVyIGFsdGVybmF0ZSBtYWNybyBtb2RlXG5cCisgIFstYyBjaGFyXSBbLS1jb21tZW50Y2hhciBjaGFyXSAgY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBmcm9tICFcblwKKyAgWy1kXSAgICAgIFstLWRlYnVnXSAgICAgICAgICAgICBwcmludCBzb21lIGRlYnVnZ2luZyBpbmZvXG5cCisgIFstaF0gICAgICBbLS1oZWxwXSAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlXG5cCisgIFstTV0gICAgICBbLS1tcmldICAgICAgICAgICAgICAgZW50ZXIgTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuXAorICBbLW8gb3V0XSAgWy0tb3V0cHV0IG91dF0gICAgICAgIHNldCB0aGUgb3V0cHV0IGZpbGVcblwKKyAgWy1wXSAgICAgIFstLXByaW50XSAgICAgICAgICAgICBwcmludCBsaW5lIG51bWJlcnNcbiIpLCBwcm9ncmFtX25hbWUpOworICBmcHJpbnRmIChmaWxlLCBfKCJcCisgIFstc10gICAgICBbLS1jb3B5c291cmNlXSAgICAgICAgY29weSBzb3VyY2UgdGhyb3VnaCBhcyBjb21tZW50cyBcblwKKyAgWy11XSAgICAgIFstLXVucmVhc29uYWJsZV0gICAgICBhbGxvdyB1bnJlYXNvbmFibGUgbmVzdGluZ1xuXAorICBbLXZdICAgICAgWy0tdmVyc2lvbl0gICAgICAgICAgIHByaW50IHRoZSBwcm9ncmFtIHZlcnNpb25cblwKKyAgWy1EbmFtZT12YWx1ZV0gICAgICAgICAgICAgICAgICBjcmVhdGUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGNhbGxlZCBuYW1lLCB3aXRoIHZhbHVlXG5cCisgIFstSXBhdGhdICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRvIGluY2x1ZGUgcGF0aCBsaXN0XG5cCisgIFtpbi1maWxlXVxuIikpOworICBpZiAoc3RhdHVzID09IDApCisgICAgcHJpbnRmIChfKCJcblJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOworICBleGl0IChzdGF0dXMpOworfQorCisvKiBEaXNwbGF5IGEgaGVscCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KK3N0YXRpYyB2b2lkCitzaG93X2hlbHAgKCkKK3sKKyAgcHJpbnRmIChfKCIlczogR251IEFzc2VtYmxlciBNYWNybyBQcmVwcm9jZXNzb3JcbiIpLAorCSAgcHJvZ3JhbV9uYW1lKTsKKyAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKK30KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBvcHQ7CisgIGNoYXIgKm91dF9uYW1lID0gMDsKKyAgc3AgPSBpbmNsdWRlX3N0YWNrOworCisgIGlmc3RhY2tbMF0ub24gPSAxOworICBpZmkgPSAwOworCisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIGhhc2hfbmV3X3RhYmxlICgxMDEsICZrZXl3b3JkX2hhc2hfdGFibGUpOworICBoYXNoX25ld190YWJsZSAoMTAxLCAmYXNzaWduX2hhc2hfdGFibGUpOworICBoYXNoX25ld190YWJsZSAoMTAxLCAmdmFycyk7CisKKyAgc2JfbmV3ICgmbGFiZWwpOworCisgIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJJOnNkaGF2Yzp1cG86RDpNIiwgbG9uZ19vcHRpb25zLAorCQkJICAgICAoaW50ICopIE5VTEwpKQorCSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChvcHQpCisJeworCWNhc2UgJ28nOgorCSAgb3V0X25hbWUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICd1JzoKKwkgIHVucmVhc29uYWJsZSA9IDE7CisJICBicmVhazsKKwljYXNlICdJJzoKKwkgIHsKKwkgICAgaW5jbHVkZV9wYXRoICpwID0gKGluY2x1ZGVfcGF0aCAqKSB4bWFsbG9jIChzaXplb2YgKGluY2x1ZGVfcGF0aCkpOworCSAgICBwLT5uZXh0ID0gTlVMTDsKKwkgICAgc2JfbmV3ICgmcC0+cGF0aCk7CisJICAgIHNiX2FkZF9zdHJpbmcgKCZwLT5wYXRoLCBvcHRhcmcpOworCSAgICBpZiAocGF0aHNfdGFpbCkKKwkgICAgICBwYXRoc190YWlsLT5uZXh0ID0gcDsKKwkgICAgZWxzZQorCSAgICAgIHBhdGhzX2hlYWQgPSBwOworCSAgICBwYXRoc190YWlsID0gcDsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgcHJpbnRfbGluZV9udW1iZXIgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnYyc6CisJICBjb21tZW50X2NoYXIgPSBvcHRhcmdbMF07CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIGFsdGVybmF0ZSA9IDE7CisJICBicmVhazsKKwljYXNlICdzJzoKKwkgIGNvcHlzb3VyY2UgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBzdGF0cyA9IDE7CisJICBicmVhazsKKwljYXNlICdEJzoKKwkgIGRvX2RlZmluZSAob3B0YXJnKTsKKwkgIGJyZWFrOworCWNhc2UgJ00nOgorCSAgbXJpID0gMTsKKwkgIGNvbW1lbnRfY2hhciA9ICc7JzsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgc2hvd19oZWxwICgpOworCSAgLypOT1RSRUFDSEVEKi8KKwljYXNlICd2JzoKKwkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCisJICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgcHJlLXByb2Nlc3NvciAlc1xuIiksIHByb2dyYW1fdmVyc2lvbik7CisJICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOworCSAgcHJpbnRmIChfKCJcCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7CisJICBleGl0ICgwKTsKKwkgIC8qTk9UUkVBQ0hFRCovCisJY2FzZSAwOgorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7CisJICAvKk5PVFJFQUNIRUQqLworCX0KKyAgICB9CisKKyAgcHJvY2Vzc19pbml0ICgpOworCisgIG1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7CisKKyAgaWYgKG91dF9uYW1lKSB7CisgICAgb3V0ZmlsZSA9IGZvcGVuIChvdXRfbmFtZSwgInciKTsKKyAgICBpZiAoIW91dGZpbGUpCisgICAgICB7CisJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnLlxuIiksCisJCSBwcm9ncmFtX25hbWUsIG91dF9uYW1lKTsKKwlleGl0ICgxKTsKKyAgICAgIH0KKyAgfQorICBlbHNlICB7CisgICAgb3V0ZmlsZSA9IHN0ZG91dDsKKyAgfQorCisgIGNoYXJ0eXBlX2luaXQgKCk7CisgIGlmICghb3V0ZmlsZSkKKyAgICBvdXRmaWxlID0gc3Rkb3V0OworCisgIC8qIFByb2Nlc3MgYWxsIHRoZSBpbnB1dCBmaWxlcyAqLworCisgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQorICAgIHsKKyAgICAgIGlmIChuZXdfZmlsZSAoYXJndltvcHRpbmRdKSkKKwl7CisJICBwcm9jZXNzX2ZpbGUgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gaW5wdXQgZmlsZSBgJXMnLlxuIiksCisJCSAgIHByb2dyYW1fbmFtZSwgYXJndltvcHRpbmRdKTsKKwkgIGV4aXQgKDEpOworCX0KKyAgICAgIG9wdGluZCsrOworICAgIH0KKworICBxdWl0ICgpOworICByZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgYW4gYWJvcnQgaW4gc29tZSBvZiB0aGUgb3RoZXIgZmlsZXMKKyAgIG1heSBiZSBjb21waWxlZCBpbnRvIGFzX2Fib3J0IGJlY2F1c2UgdGhleSBpbmNsdWRlIGFzLmguICAqLworCit2b2lkCithc19hYm9ydCAoZmlsZSwgbGluZSwgZm4pCisgICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKKyAgICAgaW50IGxpbmU7Cit7CisgIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQiKSwgZmlsZSwgbGluZSk7CisgIGlmIChmbikKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgaW4gJXMiLCBmbik7CisgIGZwcmludGYgKHN0ZGVyciwgXygiXG5QbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOworICBleGl0ICgxKTsKK30KZGlmZiAtLWdpdCBhL2dhcy9nZGJpbml0LmluIGIvZ2FzL2dkYmluaXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0NjcyNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9nZGJpbml0LmluCkBAIC0wLDAgKzEsMzkgQEAKK2RpciBAc3JjZGlyQAorZGlyIC4KKworYnJlYWsgYXNfd2FybgorYnJlYWsgYXNfd2Fybl93aGVyZQorYnJlYWsgYXNfYmFkCiticmVhayBhc19iYWRfd2hlcmUKK2JyZWFrIGFzX2ZhdGFsCiticmVhayBhc19wZXJyb3IKK2JyZWFrIGFzX2Fzc2VydAorYnJlYWsgYXNfYWJvcnQKKworZGVmaW5lIHBlCitjYWxsIHByaW50X2V4cHIgKCQpCitlbmQKKworZG9jdW1lbnQgcGUKK1ByaW50ICokIGFzIGFuIGV4cHJlc3Npb25TLCBleHBhbmRpbmcgcGFyYW1ldGVycy4KK2VuZAorCitkZWZpbmUgcHMKK2NhbGwgcHJpbnRfc3ltYm9sX3ZhbHVlICgkKQorZW5kCisKK2RvY3VtZW50IHBzCitQcmludCAqJCBhcyBhIHN5bWJvbFMsIGluY2x1ZGluZyBleHByZXNzaW9uIHZhbHVlLgorZW5kCisKK2RlZmluZSBwZgorY2FsbCBwcmludF9maXh1cCAoJCkKK2VuZAorCitkb2N1bWVudCBwZgorUHJpbnQgKiQgYXMgYSBmaXhTLCBpbmNsdWRpbmcgc3ltYm9sIHZhbHVlLgorZW5kCisKKyMgUHV0IHRoaXMgbGFzdCwgaW4gY2FzZSBpdCBmYWlscy4KKworYnJlYWsgYWJvcnQKZGlmZiAtLWdpdCBhL2dhcy9oYXNoLmMgYi9nYXMvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjY2Q2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvaGFzaC5jCkBAIC0wLDAgKzEsMTAyOCBAQAorLyogaGFzaC5jIC0gaGFzaCB0YWJsZSBsb29rdXAgc3RyaW5ncyAtCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogQlVHUywgR1JJUEVTLCBBUE9MT0dJQSBldGMuCisgKgorICogQSB0eXBpY2FsIHVzZXIgZG9lc24ndCBuZWVkIEFMTCB0aGlzOiBJIGludGVuZCB0byBtYWtlIGEgbGlicmFyeSBvdXQKKyAqIG9mIGl0IG9uZSBkYXkgLSBEZWFuIEVsc25lci4KKyAqIEFsc28sIEkgd2FudCB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgdG8gKGFkZHJlc3MsbGVuZ3RoKQorICogc28gSSBjYW4gcHV0IGFyYml0cmFyeSBiaW5hcnkgaW4gdGhlIG5hbWVzIHN0b3JlZC4gW3NlZSBoc2guYyBmb3IgdGhhdF0KKyAqCisgKiBUaGlzIHNsaW1lIGlzIGNvbW1vbiBjb3VwbGVkIGluc2lkZSB0aGUgbW9kdWxlLiBDb20tY291cGxpbmcgKGFuZCBvdGhlcgorICogdmFuZGFsaXNtKSB3YXMgZG9uZSB0byBzcGVlZCBydW5uaW5nIHRpbWUuIFRoZSBpbnRlcmZhY2VzIGF0IHRoZQorICogbW9kdWxlJ3MgZWRnZXMgYXJlIGFkZXF1YXRlbHkgY2xlYW4uCisgKgorICogVGhlcmUgaXMgbm8gd2F5IHRvIChhKSBydW4gYSB0ZXN0IHNjcmlwdCB0aHJvdWdoIHRoaXMgaGVhcCBhbmQgKGIpCisgKiBjb21wYXJlIHJlc3VsdHMgd2l0aCBwcmV2aW91cyBzY3JpcHRzLCB0byBzZWUgaWYgd2UgaGF2ZSBicm9rZW4gYW55CisgKiBjb2RlLiBVc2UgR05VIChmKXV0aWxpdGllcyB0byBkbyB0aGlzLiBBIGZldyBjb21tYW5kcyBhc3Npc3QgdGVzdC4KKyAqIFRoZSB0ZXN0aW5nIGlzIGF3a3dhcmQ6IGl0IHRyaWVzIHRvIGJlIGJvdGggYmF0Y2ggJiBpbnRlcmFjdGl2ZS4KKyAqIEZvciBub3csIGludGVyYWN0aXZlIHJ1bGVzIQorICovCisMCisvKgorICogIFRoZSBpZGVhIGlzIHRvIGltcGxlbWVudCBhIHN5bWJvbCB0YWJsZS4gQSB0ZXN0IGppZyBpcyBoZXJlLgorICogIFN5bWJvbHMgYXJlIGFyYml0cmFyeSBzdHJpbmdzOyB0aGV5IGNhbid0IGNvbnRhaW4gJ1wwJy4KKyAqCVtTZWUgaHNoLmMgZm9yIGEgbW9yZSBnZW5lcmFsIHN5bWJvbCBmbGF2b3VyLl0KKyAqICBFYWNoIHN5bWJvbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBjaGFyKiwgd2hpY2ggY2FuIHBvaW50IHRvIGFueXRoaW5nCisgKiAgeW91IHdhbnQsIGFsbG93aW5nIGFuIGFyYml0cmFyeSBwcm9wZXJ0eSBsaXN0IGZvciBlYWNoIHN5bWJvbC4KKyAqCisgKiAgVGhlIGJhc2ljIG9wZXJhdGlvbnMgYXJlOgorICoKKyAqICAgIG5ldyAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgc3ltYm9sIHRhYmxlLCByZXR1cm5zIGhhbmRsZQorICogICAgZmluZCAoc3ltYm9sKSAgICAgICAgICAgcmV0dXJucyBjaGFyKgorICogICAgaW5zZXJ0IChzeW1ib2wsY2hhciopICAgZXJyb3IgaWYgc3ltYm9sIGFscmVhZHkgaW4gdGFibGUKKyAqICAgIGRlbGV0ZSAoc3ltYm9sKSAgICAgICAgIHJldHVybnMgY2hhciogaWYgc3ltYm9sIHdhcyBpbiB0YWJsZQorICogICAgYXBwbHkgICAgICAgICAgICAgICAgICAgc28geW91IGNhbiBkZWxldGUgYWxsIHN5bWJvbHMgYmVmb3JlIGRpZSgpCisgKiAgICBkaWUgICAgICAgICAgICAgICAgICAgICBkZXN0cm95IHN5bWJvbCB0YWJsZSAoZnJlZSB1cCBtZW1vcnkpCisgKgorICogIFN1cHBsZW1lbnRhcnkgZnVuY3Rpb25zIGluY2x1ZGU6CisgKgorICogICAgc2F5ICAgICAgICAgICAgICAgICAgICAgaG93IGJpZz8gd2hhdCAlIGZ1bGw/CisgKiAgICByZXBsYWNlIChzeW1ib2wsbmV3dmFsKSByZXBvcnQgcHJldmlvdXMgdmFsdWUKKyAqICAgIGphbSAoc3ltYm9sLHZhbHVlKSAgICAgIGFzc2VydCBzeW1ib2w6PXZhbHVlCisgKgorICogIFlvdSwgdGhlIGNhbGxlciwgaGF2ZSBjb250cm9sIG92ZXIgZXJyb3JzOiB0aGlzIGp1c3QgcmVwb3J0cyB0aGVtLgorICoKKyAqICBUaGlzIHBhY2thZ2UgcmVxdWlyZXMgbWFsbG9jKCksIGZyZWUoKS4KKyAqICBNYWxsb2Moc2l6ZSkgcmV0dXJucyBOVUxMIG9yIGFkZHJlc3Mgb2YgY2hhcltzaXplXS4KKyAqICBGcmVlKGFkZHJlc3MpIGZyZWVzIHNhbWUuCisgKi8KKwwKKy8qCisgKiAgVGhlIGNvZGUgYW5kIGl0cyBzdHJ1Y3R1cmVzIGFyZSByZS1lbnRlcmVudC4KKyAqCisgKiAgQmVmb3JlIHlvdSBkbyBhbnl0aGluZyBlbHNlLCB5b3UgbXVzdCBjYWxsIGhhc2hfbmV3KCkgd2hpY2ggd2lsbAorICogIHJldHVybiB0aGUgYWRkcmVzcyBvZiBhIGhhc2gtdGFibGUtY29udHJvbC1ibG9jay4gIFlvdSB0aGVuIHVzZQorICogIHRoaXMgYWRkcmVzcyBhcyBhIGhhbmRsZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGJ5IHBhc3NpbmcgaXQgdG8gYWxsCisgKiAgdGhlIG90aGVyIGhhc2hfLi4uKCkgZnVuY3Rpb25zLiAgVGhlIG9ubHkgYXBwcm92ZWQgd2F5IHRvIHJlY292ZXIKKyAqICB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIHN5bWJvbCB0YWJsZSBpcyB0byBjYWxsIGhhc2hfZGllKCkgd2l0aCB0aGUKKyAqICBoYW5kbGUgb2YgdGhlIHN5bWJvbCB0YWJsZS4KKyAqCisgKiAgQmVmb3JlIHlvdSBjYWxsIGhhc2hfZGllKCkgeW91IG5vcm1hbGx5IGRlbGV0ZSBhbnl0aGluZyBwb2ludGVkIHRvCisgKiAgYnkgaW5kaXZpZHVhbCBzeW1ib2xzLiBBZnRlciBoYXNoX2RpZSgpIHlvdSBjYW4ndCB1c2UgdGhhdCBzeW1ib2wKKyAqICB0YWJsZSBhZ2Fpbi4KKyAqCisgKiAgVGhlIGNoYXIqIHlvdSBhc3NvY2lhdGUgd2l0aCBhIHN5bWJvbCBtYXkgbm90IGJlIE5VTEwgKDApIGJlY2F1c2UKKyAqICBOVUxMIGlzIHJldHVybmVkIHdoZW5ldmVyIGEgc3ltYm9sIGlzIG5vdCBpbiB0aGUgdGFibGUuIEFueSBvdGhlcgorICogIHZhbHVlIGlzIE9LLCBleGNlcHQgREVMRVRFRCwgI2RlZmluZWQgYmVsb3cuCisgKgorICogIFdoZW4geW91IHN1cHBseSBhIHN5bWJvbCBzdHJpbmcgZm9yIGluc2VydGlvbiwgWU9VIE1VU1QgUFJFU0VSVkUgVEhFCisgKiAgU1RSSU5HIHVudGlsIHRoYXQgc3ltYm9sIGlzIGRlbGV0ZWQgZnJvbSB0aGUgdGFibGUuIFRoZSByZWFzb24gaXMgdGhhdAorICogIG9ubHkgdGhlIGFkZHJlc3MgeW91IHN1cHBseSwgTk9UIHRoZSBzeW1ib2wgc3RyaW5nIGl0c2VsZiwgaXMgc3RvcmVkCisgKiAgaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyAqCisgKiAgWW91IG1heSBkZWxldGUgYW5kIGFkZCBzeW1ib2xzIGFyYml0cmFyaWx5LgorICogIEFueSBvciBhbGwgc3ltYm9scyBtYXkgaGF2ZSB0aGUgc2FtZSAndmFsdWUnIChjaGFyICopLiBJbiBmYWN0LCB0aGVzZQorICogIHJvdXRpbmVzIGRvbid0IGRvIGFueXRoaW5nIHdpdGggeW91ciBzeW1ib2wgdmFsdWVzLgorICoKKyAqICBZb3UgaGF2ZSBubyByaWdodCB0byBrbm93IHdoZXJlIHRoZSBzeW1ib2w6Y2hhciogbWFwcGluZyBpcyBzdG9yZWQsCisgKiAgYmVjYXVzZSBpdCBtb3ZlcyBhcm91bmQgaW4gbWVtb3J5OyBhbHNvIGJlY2F1c2Ugd2UgbWF5IGNoYW5nZSBob3cgaXQKKyAqICB3b3JrcyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBicmVhayB5b3VyIGNvZGUgZG8gd2U/IEhvd2V2ZXIgdGhlIGhhbmRsZQorICogIChhZGRyZXNzIG9mIHN0cnVjdCBoYXNoX2NvbnRyb2wpIGlzIG5ldmVyIGNoYW5nZWQgaW4KKyAqICB0aGUgbGlmZSBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICoKKyAqICBXaGF0IHlvdSBDQU4gZmluZCBvdXQgYWJvdXQgYSBzeW1ib2wgdGFibGUgaXM6CisgKiAgICBob3cgbWFueSBzbG90cyBhcmUgaW4gdGhlIGhhc2ggdGFibGU/CisgKiAgICBob3cgbWFueSBzbG90cyBhcmUgZmlsbGVkIHdpdGggc3ltYm9scz8KKyAqICAgICh0b3RhbCBoYXNoZXMsY29sbGlzaW9ucykgZm9yIChyZWFkcyx3cml0ZXMpICgqKQorICogIEFsbCBvZiB0aGUgYWJvdmUgdmFsdWVzIHZhcnkgaW4gdGltZS4KKyAqICAoKikgc29tZSBvZiB0aGVzZSBudW1iZXJzIHdpbGwgbm90IGJlIG1lYW5pbmdmdWwgaWYgd2UgY2hhbmdlIHRoZQorICogIGludGVybmFscy4gKi8KKwwKKy8qCisgKiAgSSBOIFQgRSBSIE4gQSBMCisgKgorICogIEhhc2ggdGFibGUgaXMgYW4gYXJyYXkgb2YgaGFzaF9lbnRyaWVzOyBlYWNoIGVudHJ5IGlzIGEgcG9pbnRlciB0byBhCisgKiAgYSBzdHJpbmcgYW5kIGEgdXNlci1zdXBwbGllZCB2YWx1ZSAxIGNoYXIqIHdpZGUuCisgKgorICogIFRoZSBhcnJheSBhbHdheXMgaGFzIDIgKiogbiBlbGVtZW50cywgbj4wLCBuIGludGVnZXIuCisgKiAgVGhlcmUgaXMgYWxzbyBhICd3YWxsJyBlbnRyeSBhZnRlciB0aGUgYXJyYXksIHdoaWNoIGlzIGFsd2F5cyBlbXB0eQorICogIGFuZCBhY3RzIGFzIGEgc2VudGluZWwgdG8gc3RvcCBydW5uaW5nIG9mZiB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAqICBXaGVuIHRoZSBhcnJheSBnZXRzIHRvbyBmdWxsLCB3ZSBjcmVhdGUgYSBuZXcgYXJyYXkgdHdpY2UgYXMgbGFyZ2UKKyAqICBhbmQgcmUtaGFzaCB0aGUgc3ltYm9scyBpbnRvIHRoZSBuZXcgYXJyYXksIHRoZW4gZm9yZ2V0IHRoZSBvbGQgYXJyYXkuCisgKiAgKE9mIGNvdXJzZSwgd2UgY29weSB0aGUgdmFsdWVzIGludG8gdGhlIG5ldyBhcnJheSBiZWZvcmUgd2UganVuayB0aGUKKyAqICBvbGQgYXJyYXkhKQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRQkoMCkKKyNkZWZpbmUgVFJVRQkoIUZBTFNFKQorI2VuZGlmIC8qIG5vIEZBTFNFIHlldCAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgbWluKGEsIGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKKyNpbmNsdWRlICJhcy5oIgorCisjZGVmaW5lIGVycm9yCWFzX2ZhdGFsCisKK3N0YXRpYyBjaGFyIF9kZWxldGVkX1sxXTsKKyNkZWZpbmUgREVMRVRFRCAgICAgKChQVFIpX2RlbGV0ZWRfKQkvKiBndWFyZW50ZWVkIHVuaXF1ZSBhZGRyZXNzICovCisjZGVmaW5lIFNUQVJUX1BPV0VSICAgICgxMCkJLyogcG93ZXIgb2YgdHdvOiBzaXplIG9mIG5ldyBoYXNoIHRhYmxlICovCisKKy8qIFRSVUUgaWYgYSBzeW1ib2wgaXMgaW4gZW50cnkgQCBwdHIuICAqLworI2RlZmluZSBpc2xpdmUocHRyKSAocHRyLT5oYXNoX3N0cmluZyAmJiBwdHItPmhhc2hfc3RyaW5nIT1ERUxFVEVEKQorCitlbnVtIHN0YXRfZW51bSB7CisgIC8qIE51bWJlciBvZiBzbG90cyBpbiBoYXNoIHRhYmxlLiAgVGhlIHdhbGwgZG9lcyBub3QgY291bnQgaGVyZS4KKyAgICAgV2UgZXhwZWN0IHRoaXMgaXMgYWx3YXlzIGEgcG93ZXIgb2YgMi4gICovCisgIFNUQVRfU0laRSA9IDAsCisgIC8qIE51bWJlciBvZiBoYXNoX2FzayBjYWxscy4gICovCisgIFNUQVRfQUNDRVNTLAorICBTVEFUX0FDQ0VTU193LAorICAvKiBOdW1iZXIgb2YgY29sbGlzaW9ucyAodG90YWwpLiAgVGhpcyBtYXkgZXhjZWVkIFNUQVRfQUNDRVNTIGlmIHdlCisgICAgIGhhdmUgbG90cyBvZiBjb2xsaXNpb25zL2FjY2Vzcy4gICovCisgIFNUQVRfQ09MTElERSwKKyAgU1RBVF9DT0xMSURFX3csCisgIC8qIFNsb3RzIHVzZWQgcmlnaHQgbm93LiAgKi8KKyAgU1RBVF9VU0VELAorICAvKiBIb3cgbWFueSBzdHJpbmcgY29tcGFyZXM/ICAqLworICBTVEFUX1NUUkNNUCwKKyAgU1RBVF9TVFJDTVBfdywKKyAgLyogU2l6ZSBvZiBzdGF0aXN0aWNzIGJsb2NrLi4uIHRoaXMgbXVzdCBiZSBsYXN0LiAgKi8KKyAgU1RBVExFTkdUSAorfTsKKyNkZWZpbmUgU1RBVF9fUkVBRCAgICAgKDApCS8qIHJlYWRpbmcgKi8KKyNkZWZpbmUgU1RBVF9fV1JJVEUgICAgKDEpCS8qIHdyaXRpbmcgKi8KKworLyogV2hlbiB3ZSBncm93IGEgaGFzaCB0YWJsZSwgYnkgd2hhdCBwb3dlciBvZiB0d28gZG8gd2UgaW5jcmVhc2UgaXQ/ICAqLworI2RlZmluZSBHUk9XX0ZBQ1RPUiAxCisvKiBXaGVuIHNob3VsZCB3ZSBncm93IGl0PyAgKi8KKyNkZWZpbmUgRlVMTF9WQUxVRShOKQkoKE4pIC8gMikKKworLyogI2RlZmluZSBTVVNQRUNUIHRvIGRvIHJ1bnRpbWUgY2hlY2tzICovCisvKiAjZGVmaW5lIFRFU1QgdG8gYmUgYSB0ZXN0IGppZyBmb3IgaGFzaC4uLigpICovCisKKyNpZmRlZiBURVNUCisvKiBURVNUOiB1c2Ugc21hbGxlciBoYXNoIHRhYmxlICovCisjdW5kZWYgIFNUQVJUX1BPV0VSCisjZGVmaW5lIFNUQVJUX1BPV0VSICgzKQorI3VuZGVmICBTVEFSVF9TSVpFCisjZGVmaW5lIFNUQVJUX1NJWkUgICg4KQorI3VuZGVmICBTVEFSVF9GVUxMCisjZGVmaW5lIFNUQVJUX0ZVTEwgICg0KQorI2VuZGlmCisMCitzdHJ1Y3QgaGFzaF9lbnRyeQoreworICBjb25zdCBjaGFyICpoYXNoX3N0cmluZzsJLyogcG9pbnRzIHRvIHdoZXJlIHRoZSBzeW1ib2wgc3RyaW5nIGlzICovCisgIC8qIE5VTEwgbWVhbnMgc2xvdCBpcyBub3QgdXNlZCAqLworICAvKiBERUxFVEVEIG1lYW5zIHNsb3Qgd2FzIGRlbGV0ZWQgKi8KKyAgUFRSIGhhc2hfdmFsdWU7CQkvKiB1c2VyJ3MgZGF0dW0sIGFzc29jaWF0ZWQgd2l0aCBzeW1ib2wgKi8KKyAgdW5zaWduZWQgbG9uZyBoOworfTsKKworc3RydWN0IGhhc2hfY29udHJvbCB7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpoYXNoX3doZXJlOy8qIGFkZHJlc3Mgb2YgaGFzaCB0YWJsZSAqLworICBpbnQgaGFzaF9zaXplbG9nOwkJLyogTG9nIG9mICggaGFzaF9tYXNrICsgMSApICovCisgIGludCBoYXNoX21hc2s7CQkvKiBtYXNrcyBhIGhhc2ggaW50byBpbmRleCBpbnRvIHRhYmxlICovCisgIGludCBoYXNoX2Z1bGw7CQkvKiB3aGVuIGhhc2hfc3RhdFtTVEFUX1VTRURdIGV4Y2VlZHMgdGhpcywgKi8KKyAgLyogZ3JvdyB0YWJsZSAqLworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaGFzaF93YWxsOwkvKiBwb2ludCBqdXN0IGFmdGVyIGxhc3QgKHVzYWJsZSkgZW50cnkgKi8KKyAgLyogaGVyZSB3ZSBoYXZlIHNvbWUgc3RhdGlzdGljcyAqLworICBpbnQgaGFzaF9zdGF0W1NUQVRMRU5HVEhdOwkvKiBsaWVzICYgc3RhdGlzdGljcyAqLworfTsKKwwKKy8qLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpID0gaW50ZXJuYWwKKworICBzdHJ1Y3QgaGFzaF9jb250cm9sICogYzsKKyAgc3RydWN0IGhhc2hfZW50cnkgICAqIGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKKyAgaW50ICAgICAgICAgICAgICAgICAgIGJbel07ICAgICBidWZmZXIgZm9yIHN0YXRpc3RpY3MKKyAgeiAgICAgICAgIHNpemUgb2YgYgorICBjaGFyICAgICAgICAgICAgICAgICogczsgICAgICAgIHN5bWJvbCBzdHJpbmcgKGFkZHJlc3MpIFsga2V5IF0KKyAgY2hhciAgICAgICAgICAgICAgICAqIHY7ICAgICAgICB2YWx1ZSBzdHJpbmcgKGFkZHJlc3MpICBbZGF0dW1dCisgIGJvb2xlYW4gICAgICAgICAgICAgICBmOyAgICAgICAgVFJVRSBpZiB3ZSBmb3VuZCBzIGluIGhhc2ggdGFibGUgICAgICAgICAgICBpCisgIGNoYXIgICAgICAgICAgICAgICAgKiB0OyAgICAgICAgZXJyb3Igc3RyaW5nOyAwIG1lYW5zIE9LCisgIGludCAgICAgICAgICAgICAgICAgICBhOyAgICAgICAgYWNjZXNzIHR5cGUgWzAuLi5uKSAgICAgICAgICAgICAgICAgICAgICAgICBpCisKKyAgYz1oYXNoX25ldyAgICAgICAoKSAgICAgICAgICAgICBjcmVhdGUgbmV3IGhhc2hfY29udHJvbAorCisgIGhhc2hfZGllICAgICAgICAgKGMpICAgICAgICAgICAgZGVzdHJveSBoYXNoX2NvbnRyb2wgKGFuZCBoYXNoIHRhYmxlKQorICB0YWJsZSBzaG91bGQgYmUgZW1wdHkuCisgIGRvZXNuJ3QgY2hlY2sgaWYgdGFibGUgaXMgZW1wdHkuCisgIGMgaGFzIG5vIG1lYW5pbmcgYWZ0ZXIgdGhpcy4KKworICBoYXNoX3NheSAgICAgICAgIChjLGIseikgICAgICAgIHJlcG9ydCBzdGF0aXN0aWNzIG9mIGhhc2hfY29udHJvbC4KKyAgYWxzbyByZXBvcnQgbnVtYmVyIG9mIGF2YWlsYWJsZSBzdGF0aXN0aWNzLgorCisgIHY9aGFzaF9kZWxldGUgICAgKGMscykgICAgICAgICAgZGVsZXRlIHN5bWJvbCwgcmV0dXJuIG9sZCB2YWx1ZSBpZiBhbnkuCisgIGFzaygpICAgICAgICAgICAgICAgICAgICAgICBOVUxMIG1lYW5zIG5vIG9sZCB2YWx1ZS4KKyAgZgorCisgIHY9aGFzaF9yZXBsYWNlICAgKGMscyx2KSAgICAgICAgcmVwbGFjZSBvbGQgdmFsdWUgb2YgcyB3aXRoIHYuCisgIGFzaygpICAgICAgICAgICAgICAgICAgICAgICBOVUxMIG1lYW5zIG5vIG9sZCB2YWx1ZTogbm8gdGFibGUgY2hhbmdlLgorICBmCisKKyAgdD1oYXNoX2luc2VydCAgICAoYyxzLHYpICAgICAgICBpbnNlcnQgKHMsdikgaW4gYy4KKyAgYXNrKCkgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBzdHJpbmcuCisgIGYgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBhbiBlcnJvciB0byBpbnNlcnQgaWYgcyBpcyBhbHJlYWR5CisgIGluIHRhYmxlLgorICBpZiBhbnkgZXJyb3IsIGMgaXMgdW5jaGFuZ2VkLgorCisgIHQ9aGFzaF9qYW0gICAgICAgKGMscyx2KSAgICAgICAgYXNzZXJ0IHRoYXQgbmV3IHZhbHVlIG9mIHMgd2lsbCBiZSB2LiAgICAgICBpCisgIGFzaygpICAgICAgICAgICAgICAgICAgICAgICBpdCBtYXkgZGVjaWRlIHRvIEdST1cgdGhlIHRhYmxlLiAgICAgICAgICAgIGkKKyAgZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaQorICBncm93KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpCisgIHQ9aGFzaF9ncm93ICAgICAgKGMpICAgICAgICAgICAgZ3JvdyB0aGUgaGFzaCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICBpCisgIGphbSgpICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGludm9rZSBKQU0uICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKKworICA/PWhhc2hfYXBwbHkgICAgIChjLHkpICAgICAgICAgIGFwcGx5IHkoKSB0byBldmVyeSBzeW1ib2wgaW4gYy4KKyAgeSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dHJpZXMgdmlzaXRlZCBpbiAndW5zcGVjaWZpZWQnIG9yZGVyLgorCisgIHY9aGFzaF9maW5kICAgICAgKGMscykgICAgICAgICAgcmV0dXJuIHZhbHVlIG9mIHMsIG9yIE5VTEwgaWYgcyBub3QgaW4gYy4KKyAgYXNrKCkKKyAgZgorCisgIGYsZT1oYXNoX2FzaygpICAgKGMscyxhKSAgICAgICAgcmV0dXJuIHNsb3Qgd2hlcmUgcyBTSE9VTEQgbGl2ZS4gICAgICAgICAgICBpCisgIGNvZGUoKSAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbiBjb2xsaXNpb24gc3RhdHMgaW4gYy4gICAgICAgICAgICAgIGkKKworICAuPWhhc2hfY29kZSAgICAgIChjLHMpICAgICAgICAgIGNvbXB1dGUgaGFzaC1jb2RlIGZvciBzLCAgICAgICAgICAgICAgICAgICAgaQorICBmcm9tIHBhcmFtZXRlcnMgb2YgYy4gICAgICAgICAgICAgICAgICAgICAgIGkKKworICAqLworDAorLyogUmV0dXJuZWQgYnkgaGFzaF9hc2soKSB0byBzdG9wIGV4dHJhIHRlc3RpbmcuIGhhc2hfYXNrKCkgd2FudHMgdG8KKyAgIHJldHVybiBib3RoIGEgc2xvdCBhbmQgYSBzdGF0dXMuIFRoaXMgaXMgdGhlIHN0YXR1cy4gIFRSVUU6IGZvdW5kCisgICBzeW1ib2wgRkFMU0U6IGFic2VudDogZW1wdHkgb3IgZGVsZXRlZCBzbG90IEFsc28gcmV0dXJuZWQgYnkKKyAgIGhhc2hfamFtKCkuICBUUlVFOiB3ZSByZXBsYWNlZCBhIHZhbHVlIEZBTFNFOiB3ZSBpbnNlcnRlZCBhIHZhbHVlLiAgKi8KK3N0YXRpYyBjaGFyIGhhc2hfZm91bmQ7CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9lbnRyeSAqaGFzaF9hc2sgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLAorCQkJCQkgICAgY29uc3QgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgaGFzaF9jb2RlIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgY29uc3QgY2hhciAqaGFzaF9ncm93IFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikpOworDAorLyogQ3JlYXRlIGEgbmV3IGhhc2ggdGFibGUuICBSZXR1cm4gTlVMTCBpZiBmYWlsZWQ7IG90aGVyd2lzZSByZXR1cm4gaGFuZGxlCisgICAoYWRkcmVzcyBvZiBzdHJ1Y3QgaGFzaCkuICAqLworc3RydWN0IGhhc2hfY29udHJvbCAqCitoYXNoX25ldyAoKQoreworICBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZXR2YWw7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpyb29tOwkvKiBwb2ludHMgdG8gaGFzaCB0YWJsZSAqLworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqd2FsbDsKKyAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OworICBpbnQgKmlwOwkJLyogc2NhbiBzdGF0cyBibG9jayBvZiBzdHJ1Y3QgaGFzaF9jb250cm9sICovCisgIGludCAqbmQ7CQkvKiBsaW1pdCBvZiBzdGF0cyBibG9jayAqLworCisgIHJvb20gPSAoc3RydWN0IGhhc2hfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaGFzaF9lbnRyeSkKKwkJCQkJLyogKzEgZm9yIHRoZSB3YWxsIGVudHJ5ICovCisJCQkJCSogKCgxIDw8IFNUQVJUX1BPV0VSKSArIDEpKTsKKyAgcmV0dmFsID0gKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaGFzaF9jb250cm9sKSk7CisKKyAgbmQgPSByZXR2YWwtPmhhc2hfc3RhdCArIFNUQVRMRU5HVEg7CisgIGZvciAoaXAgPSByZXR2YWwtPmhhc2hfc3RhdDsgaXAgPCBuZDsgaXArKykKKyAgICAqaXAgPSAwOworCisgIHJldHZhbC0+aGFzaF9zdGF0W1NUQVRfU0laRV0gPSAxIDw8IFNUQVJUX1BPV0VSOworICByZXR2YWwtPmhhc2hfbWFzayA9ICgxIDw8IFNUQVJUX1BPV0VSKSAtIDE7CisgIHJldHZhbC0+aGFzaF9zaXplbG9nID0gU1RBUlRfUE9XRVI7CisgIC8qIHdvcmtzIGZvciAxJ3MgY29tcGwgb2sgKi8KKyAgcmV0dmFsLT5oYXNoX3doZXJlID0gcm9vbTsKKyAgcmV0dmFsLT5oYXNoX3dhbGwgPQorICAgIHdhbGwgPSByb29tICsgKDEgPDwgU1RBUlRfUE9XRVIpOworICByZXR2YWwtPmhhc2hfZnVsbCA9IEZVTExfVkFMVUUgKDEgPDwgU1RBUlRfUE9XRVIpOworICBmb3IgKGVudHJ5ID0gcm9vbTsgZW50cnkgPD0gd2FsbDsgZW50cnkrKykKKyAgICBlbnRyeS0+aGFzaF9zdHJpbmcgPSBOVUxMOworICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogICAgICAgICAgIGggYSBzIGggXyBkIGkgZSAoICkKKyAqCisgKiBUYWJsZSBzaG91bGQgYmUgZW1wdHksIGJ1dCB0aGlzIGlzIG5vdCBjaGVja2VkLgorICogVG8gZW1wdHkgdGhlIHRhYmxlLCB0cnkgaGFzaF9hcHBseSgpaW5nIGEgc3ltYm9sIGRlbGV0ZXIuCisgKiBSZXR1cm4gdG8gZnJlZSBtZW1vcnkgYm90aCB0aGUgaGFzaCB0YWJsZSBhbmQgaXQncyBjb250cm9sCisgKiBibG9jay4KKyAqICdoYW5kbGUnIGhhcyBubyBtZWFuaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24uCisgKiBObyBlcnJvcnMgYXJlIHJlY292ZXJhYmxlLgorICovCit2b2lkCitoYXNoX2RpZSAoaGFuZGxlKQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7Cit7CisgIGZyZWUgKChjaGFyICopIGhhbmRsZS0+aGFzaF93aGVyZSk7CisgIGZyZWUgKChjaGFyICopIGhhbmRsZSk7Cit9CisMCisjaWZkZWYgVEVTVAorLyoKKyAqICAgICAgICAgICBoIGEgcyBoIF8gcyBhIHkgKCApCisgKgorICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdGF0aXN0aWNzIHRhYmxlLCBhbmQgYXMgbWFueSBzdGF0aXN0aWNzIGFzCisgKiB3ZSBjYW4gdW50aWwgZWl0aGVyIChhKSB3ZSBoYXZlIHJ1biBvdXQgb2Ygc3RhdGlzdGljcyBvciAoYikgY2FsbGVyCisgKiBoYXMgcnVuIG91dCBvZiBidWZmZXIuCisgKiBOT1RFOiBoYXNoX3NheSB0cmVhdHMgYWxsIHN0YXRpc3RpY3MgYWxpa2UuCisgKiBUaGVzZSBudW1iZXJzIG1heSBjaGFuZ2Ugd2l0aCB0aW1lLCBkdWUgdG8gaW5zZXJ0aW9ucywgZGVsZXRpb25zCisgKiBhbmQgZXhwYW5zaW9ucyBvZiB0aGUgdGFibGUuCisgKiBUaGUgZmlyc3QgInN0YXRpc3RpYyIgcmV0dXJuZWQgaXMgdGhlIGxlbmd0aCBvZiBoYXNoX3N0YXRbXS4KKyAqIFRoZW4gY29udGVudHMgb2YgaGFzaF9zdGF0W10gYXJlIHJlYWQgb3V0IChpbiBhc2NlbmRpbmcgb3JkZXIpCisgKiB1bnRpbCB5b3VyIGJ1ZmZlciBvciBoYXNoX3N0YXRbXSBpcyBleGF1c3RlZC4KKyAqLworc3RhdGljIHZvaWQKK2hhc2hfc2F5IChoYW5kbGUsIGJ1ZmZlciwgYnVmc2l6KQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7CisgICAgIGludCBidWZmZXJbIC8qYnVmc2l6Ki8gXTsKKyAgICAgaW50IGJ1ZnNpejsKK3sKKyAgaW50ICpuZDsJCS8qIGxpbWl0IG9mIHN0YXRpc3RpY3MgYmxvY2sgKi8KKyAgaW50ICppcDsJCS8qIHNjYW4gc3RhdGlzdGljcyAqLworCisgIGlwID0gaGFuZGxlLT5oYXNoX3N0YXQ7CisgIG5kID0gaXAgKyBtaW4gKGJ1ZnNpeiAtIDEsIFNUQVRMRU5HVEgpOworICBpZiAoYnVmc2l6ID4gMCkJCS8qIHRydXN0IG5vdGhpbmchIGJ1ZnNpejw9MCBpcyBkYW5nZXJvdXMgKi8KKyAgICB7CisgICAgICAqYnVmZmVyKysgPSBTVEFUTEVOR1RIOworICAgICAgZm9yICg7IGlwIDwgbmQ7IGlwKyssIGJ1ZmZlcisrKQorCXsKKwkgICpidWZmZXIgPSAqaXA7CisJfQorICAgIH0KK30KKyNlbmRpZgorDAorLyoKKyAqICAgICAgICAgICBoIGEgcyBoIF8gZCBlIGwgZSB0IGUgKCApCisgKgorICogVHJ5IHRvIGRlbGV0ZSBhIHN5bWJvbCBmcm9tIHRoZSB0YWJsZS4KKyAqIElmIGl0IHdhcyB0aGVyZSwgcmV0dXJuIGl0cyB2YWx1ZSAoYW5kIGFkanVzdCBTVEFUX1VTRUQpLgorICogT3RoZXJ3aXNlLCByZXR1cm4gTlVMTC4KKyAqIEFueXdheSwgdGhlIHN5bWJvbCBpcyBub3QgcHJlc2VudCBhZnRlciB0aGlzIGZ1bmN0aW9uLgorICoKKyAqLworUFRSCQkJCS8qIE5VTEwgaWYgc3RyaW5nIG5vdCBpbiB0YWJsZSwgZWxzZSAqLworLyogcmV0dXJucyB2YWx1ZSBvZiBkZWxldGVkIHN5bWJvbCAqLworaGFzaF9kZWxldGUgKGhhbmRsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgUFRSIHJldHZhbDsKKyAgc3RydWN0IGhhc2hfZW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gaGFzaF9hc2sgKGhhbmRsZSwgc3RyaW5nLCBTVEFUX19XUklURSk7CisgIGlmIChoYXNoX2ZvdW5kKQorICAgIHsKKyAgICAgIHJldHZhbCA9IGVudHJ5LT5oYXNoX3ZhbHVlOworICAgICAgZW50cnktPmhhc2hfc3RyaW5nID0gREVMRVRFRDsKKyAgICAgIGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfVVNFRF0gLT0gMTsKKyNpZmRlZiBTVVNQRUNUCisgICAgICBpZiAoaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSA8IDApCisJeworCSAgZXJyb3IgKCJoYXNoX2RlbGV0ZSIpOworCX0KKyNlbmRpZiAvKiBkZWYgU1VTUEVDVCAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgfQorICByZXR1cm4gKHJldHZhbCk7Cit9CisMCisvKgorICogICAgICAgICAgICAgICAgICAgaCBhIHMgaCBfIHIgZSBwIGwgYSBjIGUgKCApCisgKgorICogVHJ5IHRvIHJlcGxhY2UgdGhlIG9sZCB2YWx1ZSBvZiBhIHN5bWJvbCB3aXRoIGEgbmV3IHZhbHVlLgorICogTm9ybWFsbHkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgKiBSZXR1cm4gTlVMTCBhbmQgZG9uJ3QgY2hhbmdlIHRoZSB0YWJsZSBpZiB0aGUgc3ltYm9sIGlzIG5vdCBhbHJlYWR5CisgKiBpbiB0aGUgdGFibGUuCisgKi8KK1BUUgoraGFzaF9yZXBsYWNlIChoYW5kbGUsIHN0cmluZywgdmFsdWUpCisgICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgICBQVFIgdmFsdWU7Cit7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKyAgY2hhciAqcmV0dmFsOworCisgIGVudHJ5ID0gaGFzaF9hc2sgKGhhbmRsZSwgc3RyaW5nLCBTVEFUX19XUklURSk7CisgIGlmIChoYXNoX2ZvdW5kKQorICAgIHsKKyAgICAgIHJldHZhbCA9IGVudHJ5LT5oYXNoX3ZhbHVlOworICAgICAgZW50cnktPmhhc2hfdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR2YWwgPSBOVUxMOworICAgIH0KKyAgOworICByZXR1cm4gcmV0dmFsOworfQorDAorLyoKKyAqICAgICAgICAgICAgICAgICAgIGggYSBzIGggXyBpIG4gcyBlIHIgdCAoICkKKyAqCisgKiBJbnNlcnQgYSAoc3ltYm9sLXN0cmluZywgdmFsdWUpIGludG8gdGhlIGhhc2ggdGFibGUuCisgKiBSZXR1cm4gYW4gZXJyb3Igc3RyaW5nLCAwIG1lYW5zIE9LLgorICogSXQgaXMgYW4gJ2Vycm9yJyB0byBpbnNlcnQgYW4gZXhpc3Rpbmcgc3ltYm9sLgorICovCisKK2NvbnN0IGNoYXIgKgkJCS8qIHJldHVybiBlcnJvciBzdHJpbmcgKi8KK2hhc2hfaW5zZXJ0IChoYW5kbGUsIHN0cmluZywgdmFsdWUpCisgICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgICBQVFIgdmFsdWU7Cit7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKyAgY29uc3QgY2hhciAqcmV0dmFsOworCisgIHJldHZhbCA9IDA7CisgIGlmIChoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1VTRURdID4gaGFuZGxlLT5oYXNoX2Z1bGwpCisgICAgeworICAgICAgcmV0dmFsID0gaGFzaF9ncm93IChoYW5kbGUpOworICAgIH0KKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgZW50cnkgPSBoYXNoX2FzayAoaGFuZGxlLCBzdHJpbmcsIFNUQVRfX1dSSVRFKTsKKyAgICAgIGlmIChoYXNoX2ZvdW5kKQorCXsKKwkgIHJldHZhbCA9ICJleGlzdHMiOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBlbnRyeS0+aGFzaF92YWx1ZSA9IHZhbHVlOworCSAgZW50cnktPmhhc2hfc3RyaW5nID0gc3RyaW5nOworCSAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSArPSAxOworCX0KKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisMCisvKgorICogICAgICAgICAgICAgICBoIGEgcyBoIF8gaiBhIG0gKCApCisgKgorICogUmVnYXJkbGVzcyBvZiB3aGF0IHdhcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGJlZm9yZSwgYWZ0ZXIgaGFzaF9qYW0oKQorICogdGhlIG5hbWVkIHN5bWJvbCBoYXMgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ltYm9sIGlzIGVpdGhlciBpbnNlcnRlZCBvcgorICogKGl0cyB2YWx1ZSBpcykgcmVwbGFjZWQuCisgKiBBbiBlcnJvciBtZXNzYWdlIHN0cmluZyBpcyByZXR1cm5lZCwgMCBtZWFucyBPSy4KKyAqCisgKiBXQVJOSU5HOiB0aGlzIG1heSBkZWNpZGUgdG8gZ3JvdyB0aGUgaGFzaGVkIHN5bWJvbCB0YWJsZS4KKyAqIFRvIGRvIHRoaXMsIHdlIGNhbGwgaGFzaF9ncm93KCksIFdISUNIIFdJTEwgcmVjdXJzaXZlbHkgQ0FMTCBVUy4KKyAqCisgKiBXZSByZXBvcnQgc3RhdHVzIGludGVybmFsbHk6IGhhc2hfZm91bmQgaXMgVFJVRSBpZiB3ZSByZXBsYWNlZCwgYnV0CisgKiBmYWxzZSBpZiB3ZSBpbnNlcnRlZC4KKyAqLworY29uc3QgY2hhciAqCitoYXNoX2phbSAoaGFuZGxlLCBzdHJpbmcsIHZhbHVlKQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgUFRSIHZhbHVlOworeworICBjb25zdCBjaGFyICpyZXR2YWw7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKworICByZXR2YWwgPSAwOworICBpZiAoaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSA+IGhhbmRsZS0+aGFzaF9mdWxsKQorICAgIHsKKyAgICAgIHJldHZhbCA9IGhhc2hfZ3JvdyAoaGFuZGxlKTsKKyAgICB9CisgIGlmICghcmV0dmFsKQorICAgIHsKKyAgICAgIGVudHJ5ID0gaGFzaF9hc2sgKGhhbmRsZSwgc3RyaW5nLCBTVEFUX19XUklURSk7CisgICAgICBpZiAoIWhhc2hfZm91bmQpCisJeworCSAgZW50cnktPmhhc2hfc3RyaW5nID0gc3RyaW5nOworCSAgaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXSArPSAxOworCX0KKyAgICAgIGVudHJ5LT5oYXNoX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogICAgICAgICAgICAgICBoIGEgcyBoIF8gZyByIG8gdyAoICkKKyAqCisgKiBHcm93IGEgbmV3IChiaWdnZXIpIGhhc2ggdGFibGUgZnJvbSB0aGUgb2xkIG9uZS4KKyAqIFdlIGNob29zZSB0byBkb3VibGUgdGhlIGhhc2ggdGFibGUncyBzaXplLgorICogUmV0dXJuIGEgaHVtYW4tc2NydXRpYmxlIGVycm9yIHN0cmluZzogMCBpZiBPSy4KKyAqIFdhcm5pbmchIFRoaXMgdXNlcyBoYXNoX2phbSgpLCB3aGljaCBoYWQgYmV0dGVyIG5vdCByZWN1cnNlCisgKiBiYWNrIGhlcmUhIEhhc2hfamFtKCkgY29uZGl0aW9uYWxseSBjYWxscyB1cywgYnV0IHdlIEFMV0FZUworICogY2FsbCBoYXNoX2phbSgpIQorICogSW50ZXJuYWwuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2hhc2hfZ3JvdyAoaGFuZGxlKQkJLyogbWFrZSBhIGhhc2ggdGFibGUgZ3JvdyAqLworICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7Cit7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpuZXd3YWxsOworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV3d2hlcmU7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpuZXd0cmFjazsKKyAgc3RydWN0IGhhc2hfZW50cnkgKm9sZHRyYWNrOworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqb2xkd2hlcmU7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpvbGR3YWxsOworICBpbnQgdGVtcDsKKyAgaW50IG5ld3NpemU7CisgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgY29uc3QgY2hhciAqcmV0dmFsOworI2lmZGVmIFNVU1BFQ1QKKyAgaW50IG9sZHVzZWQ7CisjZW5kaWYKKworICAvKgorICAgKiBjYXB0dXJlIGluZm8gYWJvdXQgb2xkIGhhc2ggdGFibGUKKyAgICovCisgIG9sZHdoZXJlID0gaGFuZGxlLT5oYXNoX3doZXJlOworICBvbGR3YWxsID0gaGFuZGxlLT5oYXNoX3dhbGw7CisjaWZkZWYgU1VTUEVDVAorICBvbGR1c2VkID0gaGFuZGxlLT5oYXNoX3N0YXRbU1RBVF9VU0VEXTsKKyNlbmRpZgorICAvKgorICAgKiBhdHRlbXB0IHRvIGdldCBlbm91Z2ggcm9vbSBmb3IgYSBoYXNoIHRhYmxlIHR3aWNlIGFzIGJpZworICAgKi8KKyAgdGVtcCA9IGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfU0laRV07CisgIG5ld3doZXJlID0gKChzdHJ1Y3QgaGFzaF9lbnRyeSAqKQorCSAgICAgIHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSAoKHRlbXAgPDwgKEdST1dfRkFDVE9SICsgMSkpCisJCQkJCS8qICsxIGZvciB3YWxsIHNsb3QgKi8KKwkJCQkJKiBzaXplb2YgKHN0cnVjdCBoYXNoX2VudHJ5KSkpKTsKKyAgaWYgKG5ld3doZXJlID09IE5VTEwpCisgICAgcmV0dXJuICJub19yb29tIjsKKworICAvKgorICAgKiBoYXZlIGVub3VnaCByb29tOiBub3cgd2UgZG8gYWxsIHRoZSB3b3JrLgorICAgKiBkb3VibGUgdGhlIHNpemUgb2YgZXZlcnl0aGluZyBpbiBoYW5kbGUuCisgICAqLworICBoYW5kbGUtPmhhc2hfbWFzayA9ICgoaGFuZGxlLT5oYXNoX21hc2sgKyAxKSA8PCBHUk9XX0ZBQ1RPUikgLSAxOworICBoYW5kbGUtPmhhc2hfc3RhdFtTVEFUX1NJWkVdIDw8PSBHUk9XX0ZBQ1RPUjsKKyAgbmV3c2l6ZSA9IGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfU0laRV07CisgIGhhbmRsZS0+aGFzaF93aGVyZSA9IG5ld3doZXJlOworICBoYW5kbGUtPmhhc2hfZnVsbCA8PD0gR1JPV19GQUNUT1I7CisgIGhhbmRsZS0+aGFzaF9zaXplbG9nICs9IEdST1dfRkFDVE9SOworICBoYW5kbGUtPmhhc2hfd2FsbCA9IG5ld3dhbGwgPSBuZXd3aGVyZSArIG5ld3NpemU7CisgIC8qIFNldCBhbGwgdGhvc2UgcGVza3kgbmV3IHNsb3RzIHRvIHZhY2FudC4gICovCisgIGZvciAobmV3dHJhY2sgPSBuZXd3aGVyZTsgbmV3dHJhY2sgPD0gbmV3d2FsbDsgbmV3dHJhY2srKykKKyAgICBuZXd0cmFjay0+aGFzaF9zdHJpbmcgPSBOVUxMOworICAvKiBXZSB3aWxsIGRvIGEgc2NhbiBvZiB0aGUgb2xkIHRhYmxlLCB0aGUgaGFyZCB3YXksIHVzaW5nIHRoZQorICAgKiBuZXcgY29udHJvbCBibG9jayB0byByZS1pbnNlcnQgdGhlIGRhdGEgaW50byBuZXcgaGFzaCB0YWJsZS4gICovCisgIGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfVVNFRF0gPSAwOworICBmb3IgKG9sZHRyYWNrID0gb2xkd2hlcmU7IG9sZHRyYWNrIDwgb2xkd2FsbDsgb2xkdHJhY2srKykKKyAgICBpZiAoKChzdHJpbmcgPSBvbGR0cmFjay0+aGFzaF9zdHJpbmcpICE9IE5VTEwpICYmIHN0cmluZyAhPSBERUxFVEVEKQorICAgICAgaWYgKChyZXR2YWwgPSBoYXNoX2phbSAoaGFuZGxlLCBzdHJpbmcsIG9sZHRyYWNrLT5oYXNoX3ZhbHVlKSkpCisJcmV0dXJuIHJldHZhbDsKKworI2lmZGVmIFNVU1BFQ1QKKyAgaWYgKGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfVVNFRF0gIT0gb2xkdXNlZCkKKyAgICByZXR1cm4gImhhc2hfdXNlZCI7CisjZW5kaWYKKworICAvKiBXZSBoYXZlIGEgY29tcGxldGVseSBmYWtlZCB1cCBjb250cm9sIGJsb2NrLgorICAgICBSZXR1cm4gdGhlIG9sZCBoYXNoIHRhYmxlLiAgKi8KKyAgZnJlZSAoKGNoYXIgKikgb2xkd2hlcmUpOworCisgIHJldHVybiAwOworfQorDAorI2lmZGVmIFRFU1QKKy8qCisgKiAgICAgICAgICBoIGEgcyBoIF8gYSBwIHAgbCB5ICggKQorICoKKyAqIFVzZSB0aGlzIHRvIHNjYW4gZWFjaCBlbnRyeSBpbiBzeW1ib2wgdGFibGUuCisgKiBGb3IgZWFjaCBzeW1ib2wsIHRoaXMgY2FsbHMgKGFwcGx5cykgYSBub21pbmF0ZWQgZnVuY3Rpb24gc3VwcGx5aW5nIHRoZQorICogc3ltYm9sJ3MgdmFsdWUgKGFuZCB0aGUgc3ltYm9sJ3MgbmFtZSkuCisgKiBUaGUgaWRlYSBpcyB5b3UgdXNlIHRoaXMgdG8gZGVzdHJveSB3aGF0ZXZlciBpcyBhc3NvY2l0ZWQgd2l0aAorICogYW55IHZhbHVlcyBpbiB0aGUgdGFibGUgQkVGT1JFIHlvdSBkZXN0cm95IHRoZSB0YWJsZSB3aXRoIGhhc2hfZGllLgorICogT2YgY291cnNlLCB5b3UgY2FuIHVzZSBpdCBmb3Igb3RoZXIgam9iczsgd2hlbmV2ZXIgeW91IG5lZWQgdG8KKyAqIHZpc2l0IGFsbCBleHRhbnQgc3ltYm9scyBpbiB0aGUgdGFibGUuCisgKgorICogV2UgY2hvb3NlIHRvIGhhdmUgYSBjYWxsLXlvdS1iYWNrIGlkZWEgZm9yIHR3byByZWFzb25zOgorICogIGFzdGhldGljOiBpdCBpcyBhIG5lYXRlciBpZGVhIHRvIHVzZSBhcHBseSB0aGFuIGFuIGV4cGxpY2l0IGxvb3AKKyAqICBzZW5zaWJsZTogaWYgd2UgZXZlciBoYWQgdG8gZ3JvdyB0aGUgc3ltYm9sIHRhYmxlIChkdWUgdG8gaW5zZXJ0aW9ucykKKyAqICAgICAgICAgICAgdGhlbiB3ZSB3b3VsZCBsb3NlIG91ciBwbGFjZSBpbiB0aGUgdGFibGUgd2hlbiB3ZSByZS1oYXNoZWQKKyAqICAgICAgICAgICAgc3ltYm9scyBpbnRvIHRoZSBuZXcgdGFibGUgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCisgKgorICogVGhlIG9yZGVyIHN5bWJvbHMgYXJlIHZpc2l0ZWQgZGVwZW5kcyBlbnRpcmVseSBvbiB0aGUgaGFzaGluZyBmdW5jdGlvbi4KKyAqIFdoZW5ldmVyIHlvdSBpbnNlcnQgYSAoc3ltYm9sLCB2YWx1ZSkgeW91IHJpc2sgZXhwYW5kaW5nIHRoZSB0YWJsZS4gSWYKKyAqIHlvdSBkbyBleHBhbmQgdGhlIHRhYmxlLCB0aGVuIHRoZSBoYXNoaW5nIGZ1bmN0aW9uIFdJTEwgY2hhbmdlLCBzbyB5b3UKKyAqIE1JR0hUIGdldCBhIGRpZmZlcmVudCBvcmRlciBvZiBzeW1ib2xzIHZpc2l0ZWQuIEluIG90aGVyIHdvcmRzLCBpZiB5b3UKKyAqIHdhbnQgdGhlIHNhbWUgb3JkZXIgb2YgdmlzaXRpbmcgc3ltYm9scyBhcyB0aGUgbGFzdCB0aW1lIHlvdSB1c2VkCisgKiBoYXNoX2FwcGx5KCkgdGhlbiB5b3UgYmV0dGVyIG5vdCBoYXZlIGRvbmUgYW55IGhhc2hfaW5zZXJ0KClzIG9yCisgKiBoYXNoX2phbSgpcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHlvdSB1c2VkIGhhc2hfYXBwbHkoKS4KKyAqCisgKiBJbiBmdXR1cmUgd2UgbWF5IHVzZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgeW91ciBub21pbmF0ZWQgZnVuY3Rpb24uCisgKiBPbmUgaWRlYSBpcyB0byBhYm9ydCB0aGUgc2NhbiBpZiwgYWZ0ZXIgYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIHRvIGEKKyAqIGNlcnRhaW4gbm9kZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBjZXJ0YWluIGNvZGUuCisgKgorICogVGhlIGZ1bmN0aW9uIHlvdSBzdXBwbHkgc2hvdWxkIGJlIG9mIHRoZSBmb3JtOgorICogICAgICB2b2lkIG15ZnVuY3Qoc3RyaW5nLHZhbHVlKQorICogICAgICAgICAgICAgIGNoYXIgKiBzdHJpbmc7ICAgICAgICB8KiB0aGUgc3ltYm9sJ3MgbmFtZSAqfAorICogICAgICAgICAgICAgIGNoYXIgKiB2YWx1ZTsgICAgICAgICB8KiB0aGUgc3ltYm9sJ3MgdmFsdWUgKnwKKyAqICAgICAgeworICogICAgICAgIHwqIC4uLiAqfAorICogICAgICB9CisgKgorICovCit2b2lkCitoYXNoX2FwcGx5IChoYW5kbGUsIGZ1bmN0aW9uKQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7CisgICAgIHZvaWQgKCpmdW5jdGlvbikgKCk7Cit7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICplbnRyeTsKKyAgc3RydWN0IGhhc2hfZW50cnkgKndhbGw7CisKKyAgd2FsbCA9IGhhbmRsZS0+aGFzaF93YWxsOworICBmb3IgKGVudHJ5ID0gaGFuZGxlLT5oYXNoX3doZXJlOyBlbnRyeSA8IHdhbGw7IGVudHJ5KyspCisgICAgeworICAgICAgaWYgKGlzbGl2ZSAoZW50cnkpKQkvKiBzaWxseSBjb2RlOiB0ZXN0cyBlbnRyeS0+c3RyaW5nIHR3aWNlISAqLworCXsKKwkgICgqZnVuY3Rpb24pIChlbnRyeS0+aGFzaF9zdHJpbmcsIGVudHJ5LT5oYXNoX3ZhbHVlKTsKKwl9CisgICAgfQorfQorI2VuZGlmCisMCisvKgorICogICAgICAgICAgaCBhIHMgaCBfIGYgaSBuIGQgKCApCisgKgorICogR2l2ZW4gc3ltYm9sIHN0cmluZywgZmluZCB2YWx1ZSAoaWYgYW55KS4KKyAqIFJldHVybiBmb3VuZCB2YWx1ZSBvciBOVUxMLgorICovCitQVFIKK2hhc2hfZmluZCAoaGFuZGxlLCBzdHJpbmcpCisgICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmhhbmRsZTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworeworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqZW50cnk7CisKKyAgZW50cnkgPSBoYXNoX2FzayAoaGFuZGxlLCBzdHJpbmcsIFNUQVRfX1JFQUQpOworICBpZiAoaGFzaF9mb3VuZCkKKyAgICByZXR1cm4gZW50cnktPmhhc2hfdmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKwwKKy8qCisgKiAgICAgICAgICBoIGEgcyBoIF8gYSBzIGsgKCApCisgKgorICogU2VhcmNoZXMgZm9yIGdpdmVuIHN5bWJvbCBzdHJpbmcuCisgKiBSZXR1cm4gdGhlIHNsb3Qgd2hlcmUgaXQgT1VHSFQgdG8gbGl2ZS4gSXQgbWF5IGJlIHRoZXJlLgorICogUmV0dXJuIGhhc2hfZm91bmQ6IFRSVUUgb25seSBpZiBzeW1ib2wgaXMgaW4gdGhhdCBzbG90LgorICogQWNjZXNzIGFyZ3VtZW50IGlzIHRvIGhlbHAga2VlcCBzdGF0aXN0aWNzIGluIGNvbnRyb2wgYmxvY2suCisgKiBJbnRlcm5hbC4KKyAqLworc3RhdGljIHN0cnVjdCBoYXNoX2VudHJ5ICoJLyogc3RyaW5nIHNsb3QsIG1heSBiZSBlbXB0eSBvciBkZWxldGVkICovCitoYXNoX2FzayAoaGFuZGxlLCBzdHJpbmcsIGFjY2Vzc190eXBlKQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICAgaW50IGFjY2Vzc190eXBlOworeworICBjb25zdCBjaGFyICpzOworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqc2xvdDsKKyAgaW50IGNvbGxpc2lvbjsJLyogY291bnQgY29sbGlzaW9ucyAqLworICBpbnQgc3RyY21wczsKKyAgaW50IGhjb2RlOworCisgIC8qIHN0YXJ0IGxvb2tpbmcgaGVyZSAqLworICBoY29kZSA9IGhhc2hfY29kZSAoaGFuZGxlLCBzdHJpbmcpOworICBzbG90ID0gaGFuZGxlLT5oYXNoX3doZXJlICsgKGhjb2RlICYgaGFuZGxlLT5oYXNoX21hc2spOworCisgIGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfQUNDRVNTICsgYWNjZXNzX3R5cGVdICs9IDE7CisgIGNvbGxpc2lvbiA9IHN0cmNtcHMgPSAwOworICBoYXNoX2ZvdW5kID0gRkFMU0U7CisgIHdoaWxlICgoKHMgPSBzbG90LT5oYXNoX3N0cmluZykgIT0gTlVMTCkgJiYgcyAhPSBERUxFVEVEKQorICAgIHsKKyAgICAgIGlmIChzdHJpbmcgPT0gcykKKwl7CisJICBoYXNoX2ZvdW5kID0gVFJVRTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChzbG90LT5oID09ICh1bnNpZ25lZCBsb25nKSBoY29kZSkKKwl7CisJICBpZiAoIXN0cmNtcCAoc3RyaW5nLCBzKSkKKwkgICAgeworCSAgICAgIGhhc2hfZm91bmQgPSBUUlVFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBzdHJjbXBzKys7CisJfQorICAgICAgY29sbGlzaW9uKys7CisgICAgICBzbG90Kys7CisgICAgfQorICAvKgorICAgKiBzbG90OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjoKKyAgICogICAgICAgaW4gdXNlOiAgICAgd2UgZm91bmQgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdAorICAgKiAgICAgICBhdCBlbXB0eToKKyAgICogICAgICAgICAgICAgICAgICAgYXQgd2FsbDogICAgICAgIHdlIGZlbGwgb2ZmOiB3cmFwIHJvdW5kICAgPz8/PworICAgKiAgICAgICAgICAgICAgICAgICBpbiB0YWJsZTogICAgICAgZGlnIGhlcmUgICAgICAgICAgICAgICAgICBzbG90CisgICAqICAgICAgIGF0IERFTEVURUQ6IGRpZyBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QKKyAgICovCisgIGlmIChzbG90ID09IGhhbmRsZS0+aGFzaF93YWxsKQorICAgIHsKKyAgICAgIHNsb3QgPSBoYW5kbGUtPmhhc2hfd2hlcmU7Lyogbm93IGxvb2sgYWdhaW4gKi8KKyAgICAgIHdoaWxlICgoKHMgPSBzbG90LT5oYXNoX3N0cmluZykgIT0gTlVMTCkgJiYgcyAhPSBERUxFVEVEKQorCXsKKwkgIGlmIChzdHJpbmcgPT0gcykKKwkgICAgeworCSAgICAgIGhhc2hfZm91bmQgPSBUUlVFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAoc2xvdC0+aCA9PSAodW5zaWduZWQgbG9uZykgaGNvZGUpCisJICAgIHsKKwkgICAgICBpZiAoIXN0cmNtcCAoc3RyaW5nLCBzKSkKKwkJeworCQkgIGhhc2hfZm91bmQgPSBUUlVFOworCQkgIGJyZWFrOworCQl9CisJICAgICAgc3RyY21wcysrOworCSAgICB9CisJICBjb2xsaXNpb24rKzsKKwkgIHNsb3QrKzsKKwl9CisgICAgICAvKgorICAgICAgICogc2xvdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm46CisgICAgICAgKiAgICAgICBpbiB1c2U6IHdlIGZvdW5kIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90CisgICAgICAgKiAgICAgICBlbXB0eTogIHdhbGw6ICAgICAgICAgRVJST1IgSU1QT1NTSUJMRSAgICAgICAgICAgICAhISEhCisgICAgICAgKiAgICAgICAgICAgICAgIGluIHRhYmxlOiAgICAgZGlnIGhlcmUgICAgICAgICAgICAgICAgICAgICBzbG90CisgICAgICAgKiAgICAgICBERUxFVEVEOmRpZyBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90CisgICAgICAgKi8KKyAgICB9CisgIGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfQ09MTElERSArIGFjY2Vzc190eXBlXSArPSBjb2xsaXNpb247CisgIGhhbmRsZS0+aGFzaF9zdGF0W1NUQVRfU1RSQ01QICsgYWNjZXNzX3R5cGVdICs9IHN0cmNtcHM7CisgIGlmICghaGFzaF9mb3VuZCkKKyAgICBzbG90LT5oID0gaGNvZGU7CisgIHJldHVybiBzbG90OwkJCS8qIGFsc28gcmV0dXJuIGhhc2hfZm91bmQgKi8KK30KKwwKKy8qCisgKiAgICAgICAgICAgaCBhIHMgaCBfIGMgbyBkIGUKKyAqCisgKiBEb2VzIGhhc2hpbmcgb2Ygc3ltYm9sIHN0cmluZyB0byBoYXNoIG51bWJlci4KKyAqIEludGVybmFsLgorICovCitzdGF0aWMgaW50CitoYXNoX2NvZGUgKGhhbmRsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYW5kbGU7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyNpZiAxIC8qIFRoZXJlIHNlZW1zIHRvIGJlIHNvbWUgaW50ZXJlc3RpbmcgcHJvcGVydHkgb2YgdGhpcyBmdW5jdGlvbgorCSB0aGF0IHByZXZlbnRzIHRoZSBiZmQgdmVyc2lvbiBiZWxvdyBmcm9tIGJlaW5nIGFuIGFkZXF1YXRlCisJIHN1YnN0aXR1dGUuICBAQCBGaWd1cmUgb3V0IHdoYXQgdGhpcyBwcm9wZXJ0eSBpcyEgICovCisgIGxvbmcgaDsJCS8qIGhhc2ggY29kZSBidWlsdCBoZXJlICovCisgIGxvbmcgYzsJCS8qIGVhY2ggY2hhcmFjdGVyIGxhbmRzIGhlcmUgKi8KKyAgaW50IG47CQkvKiBBbW91bnQgdG8gc2hpZnQgaCBieSAqLworCisgIG4gPSAoaGFuZGxlLT5oYXNoX3NpemVsb2cgLSAzKTsKKyAgaCA9IDA7CisgIHdoaWxlICgoYyA9ICpzdHJpbmcrKykgIT0gMCkKKyAgICB7CisgICAgICBoICs9IGM7CisgICAgICBoID0gKGggPDwgMykgKyAoaCA+PiBuKSArIGM7CisgICAgfQorICByZXR1cm4gaDsKKyNlbHNlCisgIC8qIGZyb20gYmZkICovCisgIHVuc2lnbmVkIGxvbmcgaCA9IDA7CisgIHVuc2lnbmVkIGludCBsZW4gPSAwOworICB1bnNpZ25lZCBpbnQgYzsKKworICB3aGlsZSAoKGMgPSAqc3RyaW5nKyspICE9IDApCisgICAgeworICAgICAgaCArPSBjICsgKGMgPDwgMTcpOworICAgICAgaCBePSBoID4+IDI7CisgICAgICArK2xlbjsKKyAgICB9CisgIGggKz0gbGVuICsgKGxlbiA8PCAxNyk7CisgIGggXj0gaCA+PiAyOworICByZXR1cm4gaDsKKyNlbmRpZgorfQorDAordm9pZAoraGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCBuYW1lLCBoKQorICAgICBGSUxFICpmaWxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoOworeworICB1bnNpZ25lZCBsb25nIHN6LCB1c2VkLCBwY3Q7CisKKyAgaWYgKGggPT0gMCkKKyAgICByZXR1cm47CisKKyAgc3ogPSBoLT5oYXNoX3N0YXRbU1RBVF9TSVpFXTsKKyAgdXNlZCA9IGgtPmhhc2hfc3RhdFtTVEFUX1VTRURdOworICBwY3QgPSAodXNlZCAqIDEwMCArIHN6IC8gMikgLyBzejsKKworICBmcHJpbnRmIChmaWxlLCAiJXMgaGFzaCBzdGF0aXN0aWNzOlxuXHQlbHUvJWx1IHNsb3RzIHVzZWQgKCVsdSUlKVxuIiwKKwkgICBuYW1lLCB1c2VkLCBzeiwgcGN0KTsKKworI2RlZmluZSBQKG5hbWUsIG9mZikJCQkJCQkJXAorICBmcHJpbnRmIChmaWxlLCAiXHQlLTE2cyAlNmRyICsgJTZkdyA9ICU3ZFxuIiwgbmFtZSwJCQlcCisJICAgaC0+aGFzaF9zdGF0W29mZitTVEFUX19SRUFEXSwJCQkJXAorCSAgIGgtPmhhc2hfc3RhdFtvZmYrU1RBVF9fV1JJVEVdLAkJCQlcCisJICAgaC0+aGFzaF9zdGF0W29mZitTVEFUX19SRUFEXSArIGgtPmhhc2hfc3RhdFtvZmYrU1RBVF9fV1JJVEVdKQorCisgIFAgKCJhY2Nlc3NlczoiLCBTVEFUX0FDQ0VTUyk7CisgIFAgKCJjb2xsaXNpb25zOiIsIFNUQVRfQ09MTElERSk7CisgIFAgKCJzdHJpbmcgY29tcGFyZXM6IiwgU1RBVF9TVFJDTVApOworCisjdW5kZWYgUAorfQorDAorLyoKKyAqIEhlcmUgaXMgYSB0ZXN0IHByb2dyYW0gdG8gZXhlcmNpc2UgYWJvdmUuCisgKi8KKyNpZmRlZiBURVNUCisKKyNkZWZpbmUgVEFCTEVTICg2KQkJLyogbnVtYmVyIG9mIGhhc2ggdGFibGVzIHRvIG1haW50YWluICovCisvKiAoYXQgb25jZSkgaW4gYW55IHRlc3RpbmcgKi8KKyNkZWZpbmUgU1RBVEJVRlNJWkUgKDEyKQkvKiB3ZSBjYW4gaGF2ZSAxMiBzdGF0aXN0aWNzICovCisKK2ludCBzdGF0YnVmW1NUQVRCVUZTSVpFXTsJLyogZGlzcGxheSBzdGF0aXN0aWNzIGhlcmUgKi8KK2NoYXIgYW5zd2VyWzEwMF07CQkvKiBodW1hbiBmYXJ0cyBoZXJlICovCitjaGFyICpoYXNodGFibGVbVEFCTEVTXTsJLyogd2UgdGVzdCBtYW55IGhhc2ggdGFibGVzIGF0IG9uY2UgKi8KK2NoYXIgKmg7CQkJLyogcG9pbnRzIHRvIGN1cmVudCBoYXNoX2NvbnRyb2wgKi8KK2NoYXIgKipwcDsKK2NoYXIgKnA7CitjaGFyICpuYW1lOworY2hhciAqdmFsdWU7CitpbnQgc2l6ZTsKK2ludCB1c2VkOworY2hhciBjb21tYW5kOworaW50IG51bWJlcjsJCQkvKiBudW1iZXIgMDpUQUJMRVMtMSBvZiBjdXJyZW50IGhhc2hlZCAqLworLyogc3ltYm9sIHRhYmxlICovCisKK21haW4gKCkKK3sKKyAgdm9pZCBhcHBsaWNhdGVlICgpOworICB2b2lkIGRlc3Ryb3kgKCk7CisgIGNoYXIgKndoYXQgKCk7CisgIGludCAqaXA7CisKKyAgbnVtYmVyID0gMDsKKyAgaCA9IDA7CisgIHByaW50ZiAoInR5cGUgaCA8UkVUVVJOPiBmb3IgaGVscFxuIik7CisgIGZvciAoOzspCisgICAgeworICAgICAgcHJpbnRmICgiaGFzaF90ZXN0IGNvbW1hbmQ6ICIpOworICAgICAgZ2V0cyAoYW5zd2VyKTsKKyAgICAgIGNvbW1hbmQgPSBhbnN3ZXJbMF07CisgICAgICBpZiAoaXN1cHBlciAoY29tbWFuZCkpCisJY29tbWFuZCA9IHRvbG93ZXIgKGNvbW1hbmQpOwkvKiBlY2NoISAqLworICAgICAgc3dpdGNoIChjb21tYW5kKQorCXsKKwljYXNlICcjJzoKKwkgIHByaW50ZiAoIm9sZCBoYXNoIHRhYmxlICM9JWQuXG4iLCBudW1iZXIpOworCSAgd2hhdHRhYmxlICgpOworCSAgYnJlYWs7CisJY2FzZSAnPyc6CisJICBmb3IgKHBwID0gaGFzaHRhYmxlOyBwcCA8IGhhc2h0YWJsZSArIFRBQkxFUzsgcHArKykKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFkZHJlc3Mgb2YgaGFzaCB0YWJsZSAjJWQgY29udHJvbCBibG9jayBpcyAleHhcbiIKKwkJICAgICAgLHBwIC0gaGFzaHRhYmxlLCAqcHApOworCSAgICB9CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIGhhc2hfYXBwbHkgKGgsIGFwcGxpY2F0ZWUpOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBoYXNoX2FwcGx5IChoLCBkZXN0cm95KTsKKwkgIGhhc2hfZGllIChoKTsKKwkgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgcCA9IGhhc2hfZmluZCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7CisJICBwcmludGYgKCJ2YWx1ZSBvZiBcIiVzXCIgaXMgXCIlc1wiXG4iLCBuYW1lLCBwID8gcCA6ICJOT1QtUFJFU0VOVCIpOworCSAgYnJlYWs7CisJY2FzZSAnaCc6CisJICBwcmludGYgKCIjIHNob3cgb2xkLCBzZWxlY3QgbmV3IGRlZmF1bHQgaGFzaCB0YWJsZSBudW1iZXJcbiIpOworCSAgcHJpbnRmICgiPyBkaXNwbGF5IGFsbCBoYXNodGFibGUgY29udHJvbCBibG9jayBhZGRyZXNzZXNcbiIpOworCSAgcHJpbnRmICgiYSBhcHBseSBhIHNpbXBsZSBkaXNwbGF5LWVyIHRvIGVhY2ggc3ltYm9sIGluIHRhYmxlXG4iKTsKKwkgIHByaW50ZiAoImQgZGllOiBkZXN0cm95IGhhc2h0YWJsZVxuIik7CisJICBwcmludGYgKCJmIGZpbmQgdmFsdWUgb2Ygbm9taW5hdGVkIHN5bWJvbFxuIik7CisJICBwcmludGYgKCJoIHRoaXMgaGVscFxuIik7CisJICBwcmludGYgKCJpIGluc2VydCB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7CisJICBwcmludGYgKCJqIGphbSB2YWx1ZSBpbnRvIHN5bWJvbFxuIik7CisJICBwcmludGYgKCJuIG5ldyBoYXNodGFibGVcbiIpOworCSAgcHJpbnRmICgiciByZXBsYWNlIGEgdmFsdWUgd2l0aCBhbm90aGVyXG4iKTsKKwkgIHByaW50ZiAoInMgc2F5IHdoYXQgJSUgb2YgdGFibGUgaXMgdXNlZFxuIik7CisJICBwcmludGYgKCJxIGV4aXQgdGhpcyBwcm9ncmFtXG4iKTsKKwkgIHByaW50ZiAoInggZGVsZXRlIGEgc3ltYm9sIGZyb20gdGFibGUsIHJlcG9ydCBpdHMgdmFsdWVcbiIpOworCSAgYnJlYWs7CisJY2FzZSAnaSc6CisJICBwID0gaGFzaF9pbnNlcnQgKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOworCSAgaWYgKHApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwKKwkJICAgICAgcCk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ2onOgorCSAgcCA9IGhhc2hfamFtIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKKwkgIGlmIChwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgic3ltYm9sPVwiJXNcIiAgdmFsdWU9XCIlc1wiICBlcnJvcj0lc1xuIiwgbmFtZSwgdmFsdWUsIHApOworCSAgICB9CisJICBicmVhazsKKwljYXNlICduJzoKKwkgIGggPSBoYXNodGFibGVbbnVtYmVyXSA9IChjaGFyICopIGhhc2hfbmV3ICgpOworCSAgYnJlYWs7CisJY2FzZSAncSc6CisJICBleGl0IChFWElUX1NVQ0NFU1MpOworCWNhc2UgJ3InOgorCSAgcCA9IGhhc2hfcmVwbGFjZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7CisJICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgaGFzaF9zYXkgKGgsIHN0YXRidWYsIFNUQVRCVUZTSVpFKTsKKwkgIGZvciAoaXAgPSBzdGF0YnVmOyBpcCA8IHN0YXRidWYgKyBTVEFUQlVGU0laRTsgaXArKykKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiVkICIsICppcCk7CisJICAgIH0KKwkgIHByaW50ZiAoIlxuIik7CisJICBicmVhazsKKwljYXNlICd4JzoKKwkgIHAgPSBoYXNoX2RlbGV0ZSAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSk7CisJICBwcmludGYgKCJvbGQgdmFsdWUgd2FzIFwiJXNcIlxuIiwgcCA/IHAgOiAie30iKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGYgKCJJIGNhbid0IHVuZGVyc3RhbmQgY29tbWFuZCBcIiVjXCJcbiIsIGNvbW1hbmQpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworY2hhciAqCit3aGF0IChkZXNjcmlwdGlvbikKKyAgICAgY2hhciAqZGVzY3JpcHRpb247Cit7CisgIGNoYXIgKnJldHZhbDsKKyAgY2hhciAqbWFsbG9jICgpOworCisgIHByaW50ZiAoIiAgICVzIDogIiwgZGVzY3JpcHRpb24pOworICBnZXRzIChhbnN3ZXIpOworICAvKiB3aWxsIG9uZSBkYXkgY2xlYW4gdXAgYW5zd2VyIGhlcmUgKi8KKyAgcmV0dmFsID0gbWFsbG9jIChzdHJsZW4gKGFuc3dlcikgKyAxKTsKKyAgaWYgKCFyZXR2YWwpCisgICAgeworICAgICAgZXJyb3IgKCJyb29tIik7CisgICAgfQorICAodm9pZCkgc3RyY3B5IChyZXR2YWwsIGFuc3dlcik7CisgIHJldHVybiAocmV0dmFsKTsKK30KKwordm9pZAorZGVzdHJveSAoc3RyaW5nLCB2YWx1ZSkKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBjaGFyICp2YWx1ZTsKK3sKKyAgZnJlZSAoc3RyaW5nKTsKKyAgZnJlZSAodmFsdWUpOworfQorCisKK3ZvaWQKK2FwcGxpY2F0ZWUgKHN0cmluZywgdmFsdWUpCisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgY2hhciAqdmFsdWU7Cit7CisgIHByaW50ZiAoIiUuMjBzLSUuMjBzXG4iLCBzdHJpbmcsIHZhbHVlKTsKK30KKword2hhdHRhYmxlICgpCQkJLyogZGV0ZXJtaW5lIG51bWJlcjogd2hhdCBoYXNoIHRhYmxlIHRvIHVzZSAqLworICAgICAvKiBhbHNvIGRldGVybWluZSBoOiBwb2ludHMgdG8gaGFzaF9jb250cm9sICovCit7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBwcmludGYgKCIgICB3aGF0IGhhc2ggdGFibGUgKCVkOiVkKSA/ICAiLCAwLCBUQUJMRVMgLSAxKTsKKyAgICAgIGdldHMgKGFuc3dlcik7CisgICAgICBzc2NhbmYgKGFuc3dlciwgIiVkIiwgJm51bWJlcik7CisgICAgICBpZiAobnVtYmVyID49IDAgJiYgbnVtYmVyIDwgVEFCTEVTKQorCXsKKwkgIGggPSBoYXNodGFibGVbbnVtYmVyXTsKKwkgIGlmICghaCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIndhcm5pbmc6IGN1cnJlbnQgaGFzaC10YWJsZS0jJWQuIGhhcyBubyBoYXNoLWNvbnRyb2xcbiIsIG51bWJlcik7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiaW52YWxpZCBoYXNoIHRhYmxlIG51bWJlcjogJWRcbiIsIG51bWJlcik7CisJfQorICAgIH0KK30KKworCisKKyNlbmRpZiAvKiAjaWZkZWYgVEVTVCAqLworCisvKiBlbmQgb2YgaGFzaC5jICovCmRpZmYgLS1naXQgYS9nYXMvaGFzaC5oIGIvZ2FzL2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIyOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2hhc2guaApAQCAtMCwwICsxLDQ1IEBACisvKiBoYXNoLmggLSBmb3IgaGFzaC5jCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBoYXNoSAorI2RlZmluZSBoYXNoSAorCitzdHJ1Y3QgaGFzaF9jb250cm9sOworCisvKiByZXR1cm5zIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBoYXNoX2NvbnRyb2wgKmhhc2hfbmV3IFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgaGFzaF9kaWUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqKSk7CisvKiByZXR1cm5zIHByZXZpb3VzIHZhbHVlICovCitQVFIgaGFzaF9kZWxldGUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICpzdHIpKTsKKy8qIHJldHVybnMgcHJldmlvdXMgdmFsdWUgKi8KK1BUUiBoYXNoX3JlcGxhY2UgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICpzdHIsIFBUUiB2YWwpKTsKKy8qIHJldHVybnMgZXJyb3Igc3RyaW5nIG9yIG51bGwgKi8KK2NvbnN0IGNoYXIgKmhhc2hfaW5zZXJ0IFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqc3RyLAorCQkJCSBQVFIgdmFsKSk7CisvKiByZXR1cm5zIHZhbHVlICovCitQVFIgaGFzaF9maW5kIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqc3RyKSk7CisvKiByZXR1cm5zIGVycm9yIHRleHQgb3IgbnVsbCAoaW50ZXJuYWwpICovCitjb25zdCBjaGFyICpoYXNoX2phbSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKnN0ciwKKwkJCSAgICAgIFBUUiB2YWwpKTsKKwordm9pZCBoYXNoX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosCisJCQkJICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKikpOworI2VuZGlmIC8qICNpZmRlZiBoYXNoSCAqLworCisvKiBlbmQgb2YgaGFzaC5jICovCmRpZmYgLS1naXQgYS9nYXMvaW5wdXQtZmlsZS5jIGIvZ2FzL2lucHV0LWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNmN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2lucHV0LWZpbGUuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogaW5wdXRfZmlsZS5jIC0gRGVhbCB3aXRoIElucHV0IEZpbGVzIC0KKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MCwgMTk5MSwgMTk5MiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogQ29uZmluZXMgYWxsIGRldGFpbHMgb2YgcmVhZGluZyBzb3VyY2UgYnl0ZXMgdG8gdGhpcyBtb2R1bGUuCisgKiBBbGwgTy9TIHNwZWNpZmljIGNyb2NrcyBzaG91bGQgbGl2ZSBoZXJlLgorICogV2hhdCB3ZSBsb3NlIGluICJlZmZpY2llbmN5IiB3ZSBnYWluIGluIG1vZHVsYXJpdHkuCisgKiBOb3RlIHdlIGRvbid0IG5lZWQgdG8gI2luY2x1ZGUgdGhlICJhcy5oIiBmaWxlLiBObyBjb21tb24gY291cGxpbmchCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKKworc3RhdGljIGludCBpbnB1dF9maWxlX2dldCBQQVJBTVMgKChjaGFyICoqKSk7CisKKy8qIFRoaXMgdmFyaWFibGUgaXMgbm9uLXplcm8gaWYgdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIHJlYWQgc2hvdWxkIGJlCisgICBwcmVwcm9jZXNzZWQgYnkgYXBwLiAgSXQgaXMgemVybyBpZiB0aGUgZmlsZSBjYW4gYmUgcmVhZCBzdHJhaWdodCBpbi4KKyAgICovCitpbnQgcHJlcHJvY2VzcyA9IDA7CisKKy8qCisgKiBUaGlzIGNvZGUgb3BlbnMgYSBmaWxlLCB0aGVuIGRlbGl2ZXJzIEJVRkZFUl9TSVpFIGNoYXJhY3RlcgorICogY2h1bmtzIG9mIHRoZSBmaWxlIG9uIGRlbWFuZC4KKyAqIEJVRkZFUl9TSVpFIGlzIHN1cHBvc2VkIHRvIGJlIGEgbnVtYmVyIGNob3NlbiBmb3Igc3BlZWQuCisgKiBUaGUgY2FsbGVyIG9ubHkgYXNrcyBvbmNlIHdoYXQgQlVGRkVSX1NJWkUgaXMsIGFuZCBhc2tzIGJlZm9yZQorICogdGhlIG5hdHVyZSBvZiB0aGUgaW5wdXQgZmlsZXMgKGlmIGFueSkgaXMga25vd24uCisgKi8KKworI2RlZmluZSBCVUZGRVJfU0laRSAoMzIgKiAxMDI0KQorCisvKgorICogV2UgdXNlIHN0YXRpYyBkYXRhOiB0aGUgZGF0YSBhcmVhIGlzIG5vdCBzaGFyYWJsZS4KKyAqLworCitzdGF0aWMgRklMRSAqZl9pbjsKK3N0YXRpYyBjaGFyICpmaWxlX25hbWU7CisKKy8qIFN0cnVjdCBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIG1vZHVsZSBmb3IgZmlsZSBpbmNsdWRlcy4gICovCitzdHJ1Y3Qgc2F2ZWRfZmlsZQorICB7CisgICAgRklMRSAqZl9pbjsKKyAgICBjaGFyICpmaWxlX25hbWU7CisgICAgaW50IHByZXByb2Nlc3M7CisgICAgY2hhciAqYXBwX3NhdmU7CisgIH07CisMCisvKiBUaGVzZSBob29rcyBhY2NvbW9kYXRlIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuICovCisKK3ZvaWQgCitpbnB1dF9maWxlX2JlZ2luICgpCit7CisgIGZfaW4gPSAoRklMRSAqKSAwOworfQorCit2b2lkIAoraW5wdXRfZmlsZV9lbmQgKCkKK3sKK30KKworLyogUmV0dXJuIEJVRkZFUl9TSVpFLiAqLwordW5zaWduZWQgaW50IAoraW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKQoreworICByZXR1cm4gKEJVRkZFUl9TSVpFKTsKK30KKworaW50IAoraW5wdXRfZmlsZV9pc19vcGVuICgpCit7CisgIHJldHVybiBmX2luICE9IChGSUxFICopIDA7Cit9CisKKy8qIFB1c2ggdGhlIHN0YXRlIG9mIG91ciBpbnB1dCwgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBzYXZlZCBpbmZvIHRoYXQKKyAgIGNhbiBiZSByZXN0b3JlZCB3aXRoIGlucHV0X2ZpbGVfcG9wICgpLiAgKi8KK2NoYXIgKgoraW5wdXRfZmlsZV9wdXNoICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzYXZlZF9maWxlICpzYXZlZDsKKworICBzYXZlZCA9IChzdHJ1Y3Qgc2F2ZWRfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKKworICBzYXZlZC0+Zl9pbiA9IGZfaW47CisgIHNhdmVkLT5maWxlX25hbWUgPSBmaWxlX25hbWU7CisgIHNhdmVkLT5wcmVwcm9jZXNzID0gcHJlcHJvY2VzczsKKyAgaWYgKHByZXByb2Nlc3MpCisgICAgc2F2ZWQtPmFwcF9zYXZlID0gYXBwX3B1c2ggKCk7CisKKyAgaW5wdXRfZmlsZV9iZWdpbiAoKTsJCS8qIEluaXRpYWxpemUgZm9yIG5ldyBmaWxlICovCisKKyAgcmV0dXJuIChjaGFyICopIHNhdmVkOworfQorCit2b2lkCitpbnB1dF9maWxlX3BvcCAoYXJnKQorICAgICBjaGFyICphcmc7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzYXZlZF9maWxlICpzYXZlZCA9IChzdHJ1Y3Qgc2F2ZWRfZmlsZSAqKSBhcmc7CisKKyAgaW5wdXRfZmlsZV9lbmQgKCk7CQkvKiBDbG9zZSBvdXQgb2xkIGZpbGUgKi8KKworICBmX2luID0gc2F2ZWQtPmZfaW47CisgIGZpbGVfbmFtZSA9IHNhdmVkLT5maWxlX25hbWU7CisgIHByZXByb2Nlc3MgPSBzYXZlZC0+cHJlcHJvY2VzczsKKyAgaWYgKHByZXByb2Nlc3MpCisgICAgYXBwX3BvcCAoc2F2ZWQtPmFwcF9zYXZlKTsKKworICBmcmVlIChhcmcpOworfQorDAordm9pZAoraW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgcHJlKQorICAgICBjaGFyICpmaWxlbmFtZTsJCS8qICIiIG1lYW5zIHVzZSBzdGRpbi4gTXVzdCBub3QgYmUgMC4gKi8KKyAgICAgaW50IHByZTsKK3sKKyAgaW50IGM7CisgIGNoYXIgYnVmWzgwXTsKKworICBwcmVwcm9jZXNzID0gcHJlOworCisgIGFzc2VydCAoZmlsZW5hbWUgIT0gMCk7CS8qIEZpbGVuYW1lIG1heSBub3QgYmUgTlVMTC4gKi8KKyAgaWYgKGZpbGVuYW1lWzBdKQorICAgIHsJCQkJLyogV2UgaGF2ZSBhIGZpbGUgbmFtZS4gU3VjayBpdCBhbmQgc2VlLiAqLworICAgICAgZl9pbiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKKyAgICAgIGZpbGVfbmFtZSA9IGZpbGVuYW1lOworICAgIH0KKyAgZWxzZQorICAgIHsJCQkJLyogdXNlIHN0ZGluIGZvciB0aGUgaW5wdXQgZmlsZS4gKi8KKyAgICAgIGZfaW4gPSBzdGRpbjsKKyAgICAgIGZpbGVfbmFtZSA9IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsJLyogRm9yIGVycm9yIG1lc3NhZ2VzLiAqLworICAgIH0KKyAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIkNhbid0IG9wZW4gJXMgZm9yIHJlYWRpbmcuIiksIGZpbGVfbmFtZSk7CisgICAgICBhc19wZXJyb3IgKCIlcyIsIGZpbGVfbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGMgPSBnZXRjIChmX2luKTsKKyAgaWYgKGMgPT0gJyMnKQorICAgIHsJCQkJLyogQmVnaW5zIHdpdGggY29tbWVudCwgbWF5IG5vdCB3YW50IHRvIHByZXByb2Nlc3MgKi8KKyAgICAgIGMgPSBnZXRjIChmX2luKTsKKyAgICAgIGlmIChjID09ICdOJykKKwl7CisJICBmZ2V0cyAoYnVmLCA4MCwgZl9pbik7CisJICBpZiAoIXN0cmNtcCAoYnVmLCAiT19BUFBcbiIpKQorCSAgICBwcmVwcm9jZXNzID0gMDsKKwkgIGlmICghc3RyY2hyIChidWYsICdcbicpKQorCSAgICB1bmdldGMgKCcjJywgZl9pbik7CS8qIEl0IHdhcyBsb25nZXIgKi8KKwkgIGVsc2UKKwkgICAgdW5nZXRjICgnXG4nLCBmX2luKTsKKwl9CisgICAgICBlbHNlIGlmIChjID09ICdcbicpCisJdW5nZXRjICgnXG4nLCBmX2luKTsKKyAgICAgIGVsc2UKKwl1bmdldGMgKCcjJywgZl9pbik7CisgICAgfQorICBlbHNlCisgICAgdW5nZXRjIChjLCBmX2luKTsKK30KKworLyogQ2xvc2UgaW5wdXQgZmlsZS4gICovCit2b2lkIAoraW5wdXRfZmlsZV9jbG9zZSAoKQoreworICBpZiAoZl9pbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZjbG9zZSAoZl9pbik7CisgICAgfQkJCQkvKiBkb24ndCBjbG9zZSBhIG51bGwgZmlsZSBwb2ludGVyICovCisgIGZfaW4gPSAwOworfQkJCQkvKiBpbnB1dF9maWxlX2Nsb3NlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gZG9fc2NydWJfY2hhcnMuICAqLworCitzdGF0aWMgaW50CitpbnB1dF9maWxlX2dldCAoZnJvbSkKKyAgICAgY2hhciAqKmZyb207Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZltCVUZGRVJfU0laRV07CisgIGludCBzaXplOworCisgIHNpemUgPSBmcmVhZCAoYnVmLCBzaXplb2YgKGNoYXIpLCBzaXplb2YgYnVmLCBmX2luKTsKKyAgaWYgKHNpemUgPCAwKQorICAgIHsKKyAgICAgIGFzX3BlcnJvciAoXygiQ2FuJ3QgcmVhZCBmcm9tICVzIiksIGZpbGVfbmFtZSk7CisgICAgICBzaXplID0gMDsKKyAgICB9CisgICpmcm9tID0gYnVmOworICByZXR1cm4gc2l6ZTsKK30KKworLyogUmVhZCBhIGJ1ZmZlciBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgKi8KKworY2hhciAqCitpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKHdoZXJlKQorICAgICBjaGFyICp3aGVyZTsJCS8qIFdoZXJlIHRvIHBsYWNlIDFzdCBjaGFyYWN0ZXIgb2YgbmV3IGJ1ZmZlci4gKi8KK3sKKyAgY2hhciAqcmV0dXJuX3ZhbHVlOwkJLyogLT4gTGFzdCBjaGFyIG9mIHdoYXQgd2UgcmVhZCwgKyAxLiAqLworICByZWdpc3RlciBpbnQgc2l6ZTsKKworICBpZiAoZl9pbiA9PSAoRklMRSAqKSAwKQorICAgIHJldHVybiAwOworICAvKgorICAgKiBmZmx1c2ggKHN0ZGluKTsgY291bGQgYmUgZG9uZSBoZXJlIGlmIHlvdSB3YW50IHRvIHN5bmNocm9uaXNlCisgICAqIHN0ZGluIGFuZCBzdGRvdXQsIGZvciB0aGUgY2FzZSB3aGVyZSBvdXIgaW5wdXQgZmlsZSBpcyBzdGRpbi4KKyAgICogU2luY2UgdGhlIGFzc2VtYmxlciBzaG91bGRuJ3QgZG8gYW55IG91dHB1dCB0byBzdGRvdXQsIHdlCisgICAqIGRvbid0IGJvdGhlciB0byBzeW5jaCBvdXRwdXQgYW5kIGlucHV0LgorICAgKi8KKyAgaWYgKHByZXByb2Nlc3MpCisgICAgc2l6ZSA9IGRvX3NjcnViX2NoYXJzIChpbnB1dF9maWxlX2dldCwgd2hlcmUsIEJVRkZFUl9TSVpFKTsKKyAgZWxzZQorICAgIHNpemUgPSBmcmVhZCAod2hlcmUsIHNpemVvZiAoY2hhciksIEJVRkZFUl9TSVpFLCBmX2luKTsKKyAgaWYgKHNpemUgPCAwKQorICAgIHsKKyAgICAgIGFzX3BlcnJvciAoXygiQ2FuJ3QgcmVhZCBmcm9tICVzIiksIGZpbGVfbmFtZSk7CisgICAgICBzaXplID0gMDsKKyAgICB9CisgIGlmIChzaXplKQorICAgIHJldHVybl92YWx1ZSA9IHdoZXJlICsgc2l6ZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChmY2xvc2UgKGZfaW4pKQorCWFzX3BlcnJvciAoXygiQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZV9uYW1lKTsKKyAgICAgIGZfaW4gPSAoRklMRSAqKSAwOworICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKKyAgICB9CisgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KKworLyogZW5kIG9mIGlucHV0LWZpbGUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2lucHV0LWZpbGUuaCBiL2dhcy9pbnB1dC1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YmYyOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9pbnB1dC1maWxlLmgKQEAgLTAsMCArMSw2OCBAQAorLyogaW5wdXRfZmlsZS5oIGhlYWRlciBmb3IgaW5wdXQtZmlsZS5jCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoiaW5wdXRfZmlsZS5jIjpPcGVyYXRpbmctc3lzdGVtIGRlcGVuZGFudCBmdW5jdGlvbnMgdG8gcmVhZCBzb3VyY2UgZmlsZXMuKi8KKworCisvKgorICogTm8gbWF0dGVyIHdoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIHRoaXMgbW9kdWxlIG11c3QgcHJvdmlkZSB0aGUKKyAqIGZvbGxvd2luZyBzZXJ2aWNlcyB0byBpdHMgY2FsbGVycy4KKyAqCisgKiBpbnB1dF9maWxlX2JlZ2luKCkJCQlDYWxsIG9uY2UgYmVmb3JlIGFueXRoaW5nIGVsc2UuCisgKgorICogaW5wdXRfZmlsZV9lbmQoKQkJCUNhbGwgb25jZSBhZnRlciBldmVyeXRoaW5nIGVsc2UuCisgKgorICogaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSgpCQlDYWxsIGFueXRpbWUuIFJldHVybnMgbGFyZ2VzdCBwb3NzaWJsZQorICoJCQkJCWRlbGl2ZXJ5IGZyb20KKyAqCQkJCQlpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIoKS4KKyAqCisgKiBpbnB1dF9maWxlX29wZW4obmFtZSkJCUNhbGwgb25jZSBmb3IgZWFjaCBpbnB1dCBmaWxlLgorICoKKyAqIGlucHV0X2ZpbGVfZ2l2ZV9uZXh0X2J1ZmZlcih3aGVyZSkJQ2FsbCBvbmNlIHRvIGdldCBlYWNoIG5ldyBidWZmZXIuCisgKgkJCQkJUmV0dXJuIDA6IG5vIG1vcmUgY2hhcnMgbGVmdCBpbiBmaWxlLAorICoJCQkJCSAgIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICoJCQkJCU90aGVyd2lzZTogcmV0dXJuIGEgcG9pbnRlciB0byBqdXN0CisgKgkJCQkJICAgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIHdlIHJlYWQKKyAqCQkJCQkgICBpbnRvIHRoZSBidWZmZXIuCisgKgkJCQkJSWYgd2UgY2FuIG9ubHkgcmVhZCAwIGNoYXJhY3RlcnMsIHRoZW4KKyAqCQkJCQllbmQtb2YtZmlsZSBpcyBmYWtlZC4KKyAqCisgKiBpbnB1dF9maWxlX3B1c2goKQkJCVB1c2ggc3RhdGUsIHdoaWNoIGNhbiBiZSByZXN0b3JlZAorICoJCQkJCWxhdGVyLiAgRG9lcyBpbXBsaWNpdCBpbnB1dF9maWxlX2JlZ2luLgorICoJCQkJCVJldHVybnMgY2hhciAqIHRvIHNhdmVkIHN0YXRlLgorICoKKyAqIGlucHV0X2ZpbGVfcG9wIChhcmcpCQkJUG9wcyBwcmV2aW91c2x5IHNhdmVkIHN0YXRlLgorICoKKyAqIGlucHV0X2ZpbGVfY2xvc2UgKCkJCQlDbG9zZXMgb3BlbmVkIGZpbGUuCisgKgorICogQWxsIGVycm9ycyBhcmUgcmVwb3J0ZWQgKHVzaW5nIGFzX3BlcnJvcikgc28gY2FsbGVyIGRvZXNuJ3QgaGF2ZSB0byB0aGluaworICogYWJvdXQgSS9PIGVycm9ycy4gTm8gSS9PIGVycm9ycyBhcmUgZmF0YWw6IGFuIGVuZC1vZi1maWxlIG1heSBiZSBmYWtlZC4KKyAqLworCitjaGFyICppbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgUEFSQU1TICgoY2hhciAqd2hlcmUpKTsKK2NoYXIgKmlucHV0X2ZpbGVfcHVzaCBQQVJBTVMgKCh2b2lkKSk7Cit1bnNpZ25lZCBpbnQgaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CitpbnQgaW5wdXRfZmlsZV9pc19vcGVuIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgaW5wdXRfZmlsZV9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkIGlucHV0X2ZpbGVfY2xvc2UgUEFSQU1TICgodm9pZCkpOwordm9pZCBpbnB1dF9maWxlX2VuZCBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkIGlucHV0X2ZpbGVfb3BlbiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgaW50IHByZSkpOwordm9pZCBpbnB1dF9maWxlX3BvcCBQQVJBTVMgKChjaGFyICphcmcpKTsKKworLyogZW5kIG9mIGlucHV0X2ZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2lucHV0LXNjcnViLmMgYi9nYXMvaW5wdXQtc2NydWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmEzYmIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2lucHV0LXNjcnViLmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qIGlucHV0X3NjcnViLmMgLSBCcmVhayB1cCBpbnB1dCBidWZmZXJzIGludG8gd2hvbGUgbnVtYmVycyBvZiBsaW5lcy4KKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgkJLyogTmVlZCB0aGlzIHRvIG1ha2UgZXJybm8gZGVjbGFyYXRpb24gcmlnaHQgKi8KKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgImlucHV0LWZpbGUuaCIKKyNpbmNsdWRlICJzYi5oIgorI2luY2x1ZGUgImxpc3RpbmcuaCIKKworLyoKKyAqIE8vUyBpbmRlcGVuZGVudCBtb2R1bGUgdG8gc3VwcGx5IGJ1ZmZlcnMgb2Ygc2FuaXRpc2VkIHNvdXJjZSBjb2RlCisgKiB0byByZXN0IG9mIGFzc2VtYmxlci4gIFdlIGdldCBzYW5pdGlzZWQgaW5wdXQgZGF0YSBvZiBhcmJpdHJhcnkgbGVuZ3RoLgorICogV2UgYnJlYWsgdGhlc2UgYnVmZmVycyBvbiBsaW5lIGJvdW5kYXJpZXMsIHJlY29tYmluZSBwaWVjZXMgdGhhdAorICogd2VyZSBicm9rZW4gYWNyb3NzIGJ1ZmZlcnMsIGFuZCByZXR1cm4gYSBidWZmZXIgb2YgZnVsbCBsaW5lcyB0bworICogdGhlIGNhbGxlci4KKyAqIFRoZSBsYXN0IHBhcnRpYWwgbGluZSBiZWdpbnMgdGhlIG5leHQgYnVmZmVyIHdlIGJ1aWxkIGFuZCByZXR1cm4gdG8gY2FsbGVyLgorICogVGhlIGJ1ZmZlciByZXR1cm5lZCB0byBjYWxsZXIgaXMgcHJlY2VlZGVkIGJ5IEJFRk9SRV9TVFJJTkcgYW5kIGZvbGxvd2VkCisgKiBieSBBRlRFUl9TVFJJTkcsIGFzIHNlbnRpbmVscy4gVGhlIGxhc3QgY2hhcmFjdGVyIGJlZm9yZSBBRlRFUl9TVFJJTkcKKyAqIGlzIGEgbmV3bGluZS4KKyAqIEFsc28gbG9va3MgYWZ0ZXIgbGluZSBudW1iZXJzLCBmb3IgZS5nLiBlcnJvciBtZXNzYWdlcy4KKyAqLworCisvKgorICogV2UgZG9uJ3QgY2FyZSBob3cgZmlsdGh5IG91ciBidWZmZXJzIGFyZSwgYnV0IG91ciBjYWxsZXJzIGFzc3VtZQorICogdGhhdCB0aGUgZm9sbG93aW5nIHNhbml0YXRpb24gaGFzIGFscmVhZHkgYmVlbiBkb25lLgorICoKKyAqIE5vIGNvbW1lbnRzLCByZWR1Y2UgYSBjb21tZW50IHRvIGEgc3BhY2UuCisgKiBSZWR1Y2UgYSB0YWIgdG8gYSBzcGFjZSB1bmxlc3MgaXQgaXMgMXN0IGNoYXIgb2YgbGluZS4KKyAqIEFsbCBtdWx0aXBsZSB0YWJzIGFuZCBzcGFjZXMgY29sbGFwc2VkIGludG8gMSBjaGFyLiBUYWIgb25seQorICogICBsZWdhbCBpZiAxc3QgY2hhciBvZiBsaW5lLgorICogIyBsaW5lIGZpbGUgc3RhdGVtZW50cyBjb252ZXJ0ZWQgdG8gLmxpbmUgeDsuZmlsZSB5OyBzdGF0ZW1lbnRzLgorICogRXNjYXBlZCBuZXdsaW5lcyBhdCBlbmQgb2YgbGluZTogcmVtb3ZlIHRoZW0gYnV0IGFkZCBhcyBtYW55IG5ld2xpbmVzCisgKiAgIHRvIGVuZCBvZiBzdGF0ZW1lbnQgYXMgeW91IHJlbW92ZWQgaW4gdGhlIG1pZGRsZSwgdG8gc3luY2ggbGluZSBudW1iZXJzLgorICovCisMCisjZGVmaW5lIEJFRk9SRV9TVFJJTkcgKCJcbiIpCisjZGVmaW5lIEFGVEVSX1NUUklORyAoIlwwIikJLyogbWVtY3B5IG9mIDAgY2hhcnMgbWlnaHQgY2hva2UuICovCisjZGVmaW5lIEJFRk9SRV9TSVpFICgxKQorI2RlZmluZSBBRlRFUl9TSVpFICAoMSkKKworc3RhdGljIGNoYXIgKmJ1ZmZlcl9zdGFydDsJLyotPjFzdCBjaGFyIG9mIGZ1bGwgYnVmZmVyIGFyZWEuICovCitzdGF0aWMgY2hhciAqcGFydGlhbF93aGVyZTsJLyotPmFmdGVyIGxhc3QgZnVsbCBsaW5lIGluIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgcGFydGlhbF9zaXplOwkvKiA+PTAuIE51bWJlciBvZiBjaGFycyBpbiBwYXJ0aWFsIGxpbmUgaW4gYnVmZmVyLiAqLworc3RhdGljIGNoYXIgc2F2ZV9zb3VyY2VbQUZURVJfU0laRV07CisvKiBCZWNhdXNlIHdlIG5lZWQgQUZURVJfU1RSSU5HIGp1c3QgYWZ0ZXIgbGFzdCAqLworLyogZnVsbCBsaW5lLCBpdCBjbG9iYmVycyAxc3QgcGFydCBvZiBwYXJ0aWFsICovCisvKiBsaW5lLiBTbyB3ZSBwcmVzZXJ2ZSAxc3QgcGFydCBvZiBwYXJ0aWFsICovCisvKiBsaW5lIGhlcmUuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7CS8qIFdoYXQgaXMgdGhlIGxhcmdlc3Qgc2l6ZSBidWZmZXIgdGhhdCAqLworLyogaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkgY291bGQgKi8KKy8qIHJldHVybiB0byB1cz8gKi8KKworLyogVGhlIGluZGV4IGludG8gYW4gc2Igc3RydWN0dXJlIHdlIGFyZSByZWFkaW5nIGZyb20uICAtMSBpZiBub25lLiAgKi8KK3N0YXRpYyBpbnQgc2JfaW5kZXggPSAtMTsKKworLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUsIHRoaXMgaXMgaXQuICAqLworc3RhdGljIHNiIGZyb21fc2I7CisKKy8qIFRoZSBudW1iZXIgb2YgbmVzdGVkIHNiIHN0cnVjdHVyZXMgd2UgaGF2ZSBpbmNsdWRlZC4gICovCitpbnQgbWFjcm9fbmVzdDsKKworLyogV2UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBvcGVuIGF0IG9uY2UsIHRob3VnaCB0aGUgaW5mbyBmb3IgYWxsCisgICBidXQgdGhlIGxhdGVzdCBvbmUgYXJlIHNhdmVkIG9mZiBpbiBhIHN0cnVjdCBpbnB1dF9zYXZlLiAgVGhlc2UgZmlsZXMgcmVtYWluCisgICBvcGVuLCBzbyB3ZSBhcmUgbGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgYWxsb3dlZCBieSB0aGUKKyAgIHVuZGVybHlpbmcgT1MuIFdlIG1heSBhbHNvIHNlcXVlbnRpYWxseSByZWFkIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGUgaW4gYW4KKyAgIGFzc2VtYmx5LiAqLworCisvKiBXZSBtdXN0IHRyYWNrIHRoZSBwaHlzaWNhbCBmaWxlIGFuZCBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMuIFdlIGFsc28KKyAgIHRyYWNrIGEgImxvZ2ljYWwiIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gKEM/KSAgY29tcGlsZXIKKyAgIHNvdXJjZSBsaW5lIG51bWJlcnMuICBXaGVuZXZlciB3ZSBvcGVuIGEgZmlsZSB3ZSBtdXN0IGZpbGwgaW4KKyAgIHBoeXNpY2FsX2lucHV0X2ZpbGUuIFNvIGlmIGl0IGlzIE5VTEwgd2UgaGF2ZSBub3Qgb3BlbmVkIGFueSBmaWxlcyB5ZXQuICovCisKK3N0YXRpYyBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOworc3RhdGljIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXJUOwkvKiAxLW9yaWdpbiBsaW5lIG51bWJlciBpbiBhIHNvdXJjZSBmaWxlLiAqLworLyogQSBsaW5lIGVuZHMgaW4gJ1xuJyBvciBlb2YuICovCisKK3N0YXRpYyBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKK3N0YXRpYyBpbnQgbG9naWNhbF9pbnB1dF9saW5lOworCisvKiBTdHJ1Y3QgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgaGFuZGxlciBkdXJpbmcgaW5jbHVkZSBmaWxlcyAqLworc3RydWN0IGlucHV0X3NhdmUKKyAgeworICAgIGNoYXIgKmJ1ZmZlcl9zdGFydDsKKyAgICBjaGFyICpwYXJ0aWFsX3doZXJlOworICAgIGludCBwYXJ0aWFsX3NpemU7CisgICAgY2hhciBzYXZlX3NvdXJjZVtBRlRFUl9TSVpFXTsKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsKKyAgICBjaGFyICpwaHlzaWNhbF9pbnB1dF9maWxlOworICAgIGNoYXIgKmxvZ2ljYWxfaW5wdXRfZmlsZTsKKyAgICBsaW5lX251bWJlclQgcGh5c2ljYWxfaW5wdXRfbGluZTsKKyAgICBpbnQgbG9naWNhbF9pbnB1dF9saW5lOworICAgIGludCBzYl9pbmRleDsKKyAgICBzYiBmcm9tX3NiOworICAgIHN0cnVjdCBpbnB1dF9zYXZlICpuZXh0X3NhdmVkX2ZpbGU7CS8qIENoYWluIG9mIGlucHV0X3NhdmVzICovCisgICAgY2hhciAqaW5wdXRfZmlsZV9zYXZlOwkvKiBTYXZlZCBzdGF0ZSBvZiBpbnB1dCByb3V0aW5lcyAqLworICAgIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwkvKiBDYWxsZXIncyBzYXZlZCBwb3NpdGlvbiBpbiBidWYgKi8KKyAgfTsKKworc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICppbnB1dF9zY3J1Yl9wdXNoIFBBUkFNUyAoKGNoYXIgKnNhdmVkX3Bvc2l0aW9uKSk7CitzdGF0aWMgY2hhciAqaW5wdXRfc2NydWJfcG9wIFBBUkFNUyAoKHN0cnVjdCBpbnB1dF9zYXZlICphcmcpKTsKK3N0YXRpYyB2b2lkIGFzXzFfY2hhciBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgYywgRklMRSAqIHN0cmVhbSkpOworCisvKiBTYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSB0aGF0IC5pbmNsdWRlJ2QgdGhpcyBvbmUuICBXaGVuIHdlIGhpdCBFT0YsCisgICB3ZSBhdXRvbWF0aWNhbGx5IHBvcCB0byB0aGF0IGZpbGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqbmV4dF9zYXZlZF9maWxlOworCisvKiBQdXNoIHRoZSBzdGF0ZSBvZiBpbnB1dCByZWFkaW5nIGFuZCBzY3J1YmJpbmcgc28gdGhhdCB3ZSBjYW4gI2luY2x1ZGUuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgJ3ZvaWQgKicgKGZ1ZGdlZCBmb3Igb2xkIGNvbXBpbGVycykgdG8gYSBzYXZlCisgICBhcmVhLCB3aGljaCBjYW4gYmUgcmVzdG9yZWQgYnkgcGFzc2luZyBpdCB0byBpbnB1dF9zY3J1Yl9wb3AoKS4gKi8KK3N0YXRpYyBzdHJ1Y3QgaW5wdXRfc2F2ZSAqCitpbnB1dF9zY3J1Yl9wdXNoIChzYXZlZF9wb3NpdGlvbikKKyAgICAgY2hhciAqc2F2ZWRfcG9zaXRpb247Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBpbnB1dF9zYXZlICpzYXZlZDsKKworICBzYXZlZCA9IChzdHJ1Y3QgaW5wdXRfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKKworICBzYXZlZC0+c2F2ZWRfcG9zaXRpb24gPSBzYXZlZF9wb3NpdGlvbjsKKyAgc2F2ZWQtPmJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9zdGFydDsKKyAgc2F2ZWQtPnBhcnRpYWxfd2hlcmUgPSBwYXJ0aWFsX3doZXJlOworICBzYXZlZC0+cGFydGlhbF9zaXplID0gcGFydGlhbF9zaXplOworICBzYXZlZC0+YnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7CisgIHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlID0gcGh5c2ljYWxfaW5wdXRfZmlsZTsKKyAgc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZSA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKKyAgc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmUgPSBwaHlzaWNhbF9pbnB1dF9saW5lOworICBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lID0gbG9naWNhbF9pbnB1dF9saW5lOworICBzYXZlZC0+c2JfaW5kZXggPSBzYl9pbmRleDsKKyAgc2F2ZWQtPmZyb21fc2IgPSBmcm9tX3NiOworICBtZW1jcHkgKHNhdmVkLT5zYXZlX3NvdXJjZSwgc2F2ZV9zb3VyY2UsIHNpemVvZiAoc2F2ZV9zb3VyY2UpKTsKKyAgc2F2ZWQtPm5leHRfc2F2ZWRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZTsKKyAgc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSA9IGlucHV0X2ZpbGVfcHVzaCAoKTsKKworICBpbnB1dF9maWxlX2JlZ2luICgpOwkJLyogUmVpbml0aWFsaXplISAqLworICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKKyAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKKyAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7CisgIHNiX2luZGV4ID0gLTE7CisKKyAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7CisgIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7CisKKyAgcmV0dXJuIHNhdmVkOworfQkJCQkvKiBpbnB1dF9zY3J1Yl9wdXNoKCkgKi8KKworc3RhdGljIGNoYXIgKgoraW5wdXRfc2NydWJfcG9wIChzYXZlZCkKKyAgICAgc3RydWN0IGlucHV0X3NhdmUgKnNhdmVkOworeworICBjaGFyICpzYXZlZF9wb3NpdGlvbjsKKworICBpbnB1dF9zY3J1Yl9lbmQgKCk7CQkvKiBGaW5pc2ggb2ZmIG9sZCBidWZmZXIgKi8KKworICBpbnB1dF9maWxlX3BvcCAoc2F2ZWQtPmlucHV0X2ZpbGVfc2F2ZSk7CisgIHNhdmVkX3Bvc2l0aW9uID0gc2F2ZWQtPnNhdmVkX3Bvc2l0aW9uOworICBidWZmZXJfc3RhcnQgPSBzYXZlZC0+YnVmZmVyX3N0YXJ0OworICBidWZmZXJfbGVuZ3RoID0gc2F2ZWQtPmJ1ZmZlcl9sZW5ndGg7CisgIHBoeXNpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfZmlsZTsKKyAgbG9naWNhbF9pbnB1dF9maWxlID0gc2F2ZWQtPmxvZ2ljYWxfaW5wdXRfZmlsZTsKKyAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9saW5lOworICBsb2dpY2FsX2lucHV0X2xpbmUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9saW5lOworICBzYl9pbmRleCA9IHNhdmVkLT5zYl9pbmRleDsKKyAgZnJvbV9zYiA9IHNhdmVkLT5mcm9tX3NiOworICBwYXJ0aWFsX3doZXJlID0gc2F2ZWQtPnBhcnRpYWxfd2hlcmU7CisgIHBhcnRpYWxfc2l6ZSA9IHNhdmVkLT5wYXJ0aWFsX3NpemU7CisgIG5leHRfc2F2ZWRfZmlsZSA9IHNhdmVkLT5uZXh0X3NhdmVkX2ZpbGU7CisgIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHNhdmVkLT5zYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOworCisgIGZyZWUgKHNhdmVkKTsKKyAgcmV0dXJuIHNhdmVkX3Bvc2l0aW9uOworfQorDAorCit2b2lkCitpbnB1dF9zY3J1Yl9iZWdpbiAoKQoreworICBrbm93IChzdHJsZW4gKEJFRk9SRV9TVFJJTkcpID09IEJFRk9SRV9TSVpFKTsKKyAga25vdyAoc3RybGVuIChBRlRFUl9TVFJJTkcpID09IEFGVEVSX1NJWkUgfHwgKEFGVEVSX1NUUklOR1swXSA9PSAnXDAnICYmIEFGVEVSX1NJWkUgPT0gMSkpOworCisgIGlucHV0X2ZpbGVfYmVnaW4gKCk7CisKKyAgYnVmZmVyX2xlbmd0aCA9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7CisKKyAgYnVmZmVyX3N0YXJ0ID0geG1hbGxvYyAoKEJFRk9SRV9TSVpFICsgYnVmZmVyX2xlbmd0aCArIGJ1ZmZlcl9sZW5ndGggKyBBRlRFUl9TSVpFKSk7CisgIG1lbWNweSAoYnVmZmVyX3N0YXJ0LCBCRUZPUkVfU1RSSU5HLCAoaW50KSBCRUZPUkVfU0laRSk7CisKKyAgLyogTGluZSBudW1iZXIgdGhpbmdzLiAqLworICBsb2dpY2FsX2lucHV0X2xpbmUgPSAtMTsKKyAgbG9naWNhbF9pbnB1dF9maWxlID0gKGNoYXIgKikgTlVMTDsKKyAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IE5VTEw7CS8qIE5vIGZpbGUgcmVhZCB5ZXQuICovCisgIG5leHRfc2F2ZWRfZmlsZSA9IE5VTEw7CS8qIEF0IEVPRiwgZG9uJ3QgcG9wIHRvIGFueSBvdGhlciBmaWxlICovCisgIGRvX3NjcnViX2JlZ2luIChmbGFnX202OGtfbXJpKTsKK30KKwordm9pZAoraW5wdXRfc2NydWJfZW5kICgpCit7CisgIGlmIChidWZmZXJfc3RhcnQpCisgICAgeworICAgICAgZnJlZSAoYnVmZmVyX3N0YXJ0KTsKKyAgICAgIGJ1ZmZlcl9zdGFydCA9IDA7CisgICAgICBpbnB1dF9maWxlX2VuZCAoKTsKKyAgICB9Cit9CisKKy8qIFN0YXJ0IHJlYWRpbmcgaW5wdXQgZnJvbSBhIG5ldyBmaWxlLiAqLworCitjaGFyICoJCQkJLyogUmV0dXJuIHN0YXJ0IG9mIGNhbGxlcidzIHBhcnQgb2YgYnVmZmVyLiAqLworaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKQorICAgICBjaGFyICpmaWxlbmFtZTsKK3sKKyAgaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgIWZsYWdfbm9fY29tbWVudHMpOworICBwaHlzaWNhbF9pbnB1dF9maWxlID0gZmlsZW5hbWVbMF0gPyBmaWxlbmFtZSA6IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsKKyAgcGh5c2ljYWxfaW5wdXRfbGluZSA9IDA7CisKKyAgcGFydGlhbF9zaXplID0gMDsKKyAgcmV0dXJuIChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSk7Cit9CisKKworLyogSW5jbHVkZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCBmaWxlLiAgU2F2ZSBvdXIgc3RhdGUsIGNhdXNlIGl0IHRvCisgICBiZSByZXN0b3JlZCBvbiBFT0YsIGFuZCBiZWdpbiBoYW5kbGluZyBhIG5ldyBmaWxlLiAgU2FtZSByZXN1bHQgYXMKKyAgIGlucHV0X3NjcnViX25ld19maWxlLiAqLworCitjaGFyICoKK2lucHV0X3NjcnViX2luY2x1ZGVfZmlsZSAoZmlsZW5hbWUsIHBvc2l0aW9uKQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgY2hhciAqcG9zaXRpb247Cit7CisgIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKKyAgcmV0dXJuIGlucHV0X3NjcnViX25ld19maWxlIChmaWxlbmFtZSk7Cit9CisKKy8qIFN0YXJ0IGdldHRpbmcgaW5wdXQgZnJvbSBhbiBzYiBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgd2hlbgorICAgZXhwYW5kaW5nIGEgbWFjcm8uICAqLworCit2b2lkCitpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiIChmcm9tLCBwb3NpdGlvbikKKyAgICAgc2IgKmZyb207CisgICAgIGNoYXIgKnBvc2l0aW9uOworeworICBpZiAobWFjcm9fbmVzdCA+IG1heF9tYWNyb19uZXN0KQorICAgIGFzX2ZhdGFsIChfKCJtYWNyb3MgbmVzdGVkIHRvbyBkZWVwbHkiKSk7CisgICsrbWFjcm9fbmVzdDsKKworICBuZXh0X3NhdmVkX2ZpbGUgPSBpbnB1dF9zY3J1Yl9wdXNoIChwb3NpdGlvbik7CisKKyAgc2JfbmV3ICgmZnJvbV9zYik7CisgIGlmIChmcm9tLT5sZW4gPj0gMSAmJiBmcm9tLT5wdHJbMF0gIT0gJ1xuJykKKyAgICB7CisgICAgICAvKiBBZGQgdGhlIHNlbnRpbmVsIHJlcXVpcmVkIGJ5IHJlYWQuYy4gICovCisgICAgICBzYl9hZGRfY2hhciAoJmZyb21fc2IsICdcbicpOworICAgIH0KKyAgc2JfYWRkX3NiICgmZnJvbV9zYiwgZnJvbSk7CisgIHNiX2luZGV4ID0gMTsKKworICAvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlc2V0IGJ5IGlucHV0X3NjcnViX3B1c2guICBSZXN0b3JlIHRoZW0KKyAgICAgc2luY2Ugd2UgYXJlLCBhZnRlciBhbGwsIHN0aWxsIGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBmaWxlLiAgKi8KKyAgbG9naWNhbF9pbnB1dF9saW5lID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2xpbmU7CisgIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IG5leHRfc2F2ZWRfZmlsZS0+bG9naWNhbF9pbnB1dF9maWxlOworfQorCit2b2lkCitpbnB1dF9zY3J1Yl9jbG9zZSAoKQoreworICBpbnB1dF9maWxlX2Nsb3NlICgpOworfQorCitjaGFyICoKK2lucHV0X3NjcnViX25leHRfYnVmZmVyIChidWZwKQorICAgICBjaGFyICoqYnVmcDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqbGltaXQ7CQkvKi0+anVzdCBhZnRlciBsYXN0IGNoYXIgb2YgYnVmZmVyLiAqLworCisgIGlmIChzYl9pbmRleCA+PSAwKQorICAgIHsKKyAgICAgIGlmIChzYl9pbmRleCA+PSBmcm9tX3NiLmxlbikKKwl7CisJICBzYl9raWxsICgmZnJvbV9zYik7CisJICBjb25kX2ZpbmlzaF9jaGVjayAobWFjcm9fbmVzdCk7CisJICAtLW1hY3JvX25lc3Q7CisJICBwYXJ0aWFsX3doZXJlID0gTlVMTDsKKwkgIGlmIChuZXh0X3NhdmVkX2ZpbGUgIT0gTlVMTCkKKwkgICAgKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7CisJICByZXR1cm4gcGFydGlhbF93aGVyZTsKKwl9CisKKyAgICAgIHBhcnRpYWxfd2hlcmUgPSBmcm9tX3NiLnB0ciArIGZyb21fc2IubGVuOworICAgICAgcGFydGlhbF9zaXplID0gMDsKKyAgICAgICpidWZwID0gZnJvbV9zYi5wdHIgKyBzYl9pbmRleDsKKyAgICAgIHNiX2luZGV4ID0gZnJvbV9zYi5sZW47CisgICAgICByZXR1cm4gcGFydGlhbF93aGVyZTsKKyAgICB9CisKKyAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKKworICBpZiAocGFydGlhbF9zaXplKQorICAgIHsKKyAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHBhcnRpYWxfd2hlcmUsCisJICAgICAgKHVuc2lnbmVkIGludCkgcGFydGlhbF9zaXplKTsKKyAgICAgIG1lbWNweSAoYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUsIHNhdmVfc291cmNlLCBBRlRFUl9TSVpFKTsKKyAgICB9CisgIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQKKwkJCQkgICAgICAgKyBCRUZPUkVfU0laRQorCQkJCSAgICAgICArIHBhcnRpYWxfc2l6ZSk7CisgIGlmIChsaW1pdCkKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICpwOwkJLyogRmluZCBsYXN0IG5ld2xpbmUuICovCisKKyAgICAgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQorCTsKKyAgICAgICsrcDsKKworICAgICAgd2hpbGUgKHAgPD0gYnVmZmVyX3N0YXJ0ICsgQkVGT1JFX1NJWkUpCisJeworCSAgaW50IGxpbW9mZjsKKworCSAgbGltb2ZmID0gbGltaXQgLSBidWZmZXJfc3RhcnQ7CisJICBidWZmZXJfbGVuZ3RoICs9IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgKCk7CisJICBidWZmZXJfc3RhcnQgPSB4cmVhbGxvYyAoYnVmZmVyX3N0YXJ0LAorCQkJCSAgIChCRUZPUkVfU0laRQorCQkJCSAgICArIDIgKiBidWZmZXJfbGVuZ3RoCisJCQkJICAgICsgQUZURVJfU0laRSkpOworCSAgKmJ1ZnAgPSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRTsKKwkgIGxpbWl0ID0gaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIChidWZmZXJfc3RhcnQgKyBsaW1vZmYpOworCisJICBpZiAobGltaXQgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oInBhcnRpYWwgbGluZSBhdCBlbmQgb2YgZmlsZSBpZ25vcmVkIikpOworCSAgICAgIHBhcnRpYWxfd2hlcmUgPSBOVUxMOworCSAgICAgIGlmIChuZXh0X3NhdmVkX2ZpbGUpCisJCSpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOworCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisKKwkgIGZvciAocCA9IGxpbWl0IC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQorCSAgICA7CisJICArK3A7CisJfQorCisgICAgICBwYXJ0aWFsX3doZXJlID0gcDsKKyAgICAgIHBhcnRpYWxfc2l6ZSA9IGxpbWl0IC0gcDsKKyAgICAgIG1lbWNweSAoc2F2ZV9zb3VyY2UsIHBhcnRpYWxfd2hlcmUsIChpbnQpIEFGVEVSX1NJWkUpOworICAgICAgbWVtY3B5IChwYXJ0aWFsX3doZXJlLCBBRlRFUl9TVFJJTkcsIChpbnQpIEFGVEVSX1NJWkUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBhcnRpYWxfd2hlcmUgPSAwOworICAgICAgaWYgKHBhcnRpYWxfc2l6ZSA+IDApCisJeworCSAgYXNfd2FybiAoXygiUGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiKSk7CisJfQorCisgICAgICAvKiBUZWxsIHRoZSBsaXN0aW5nIHdlJ3ZlIGZpbmlzaGVkIHRoZSBmaWxlLiAgKi8KKyAgICAgIExJU1RJTkdfRU9GICgpOworCisgICAgICAvKiBJZiB3ZSBzaG91bGQgcG9wIHRvIGFub3RoZXIgZmlsZSBhdCBFT0YsIGRvIGl0LiAqLworICAgICAgaWYgKG5leHRfc2F2ZWRfZmlsZSkKKwl7CisJICAqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsJLyogUG9wIHN0YXRlICovCisJICAvKiBwYXJ0aWFsX3doZXJlIGlzIG5vdyBjb3JyZWN0IHRvIHJldHVybiwgc2luY2Ugd2UgcG9wcGVkIGl0LiAqLworCX0KKyAgICB9CisgIHJldHVybiAocGFydGlhbF93aGVyZSk7Cit9CQkJCS8qIGlucHV0X3NjcnViX25leHRfYnVmZmVyKCkgKi8KKwwKKy8qCisgKiBUaGUgcmVtYWluaW5nIHBhcnQgb2YgdGhpcyBmaWxlIGRlYWxzIHdpdGggbGluZSBudW1iZXJzLCBlcnJvcgorICogbWVzc2FnZXMgYW5kIHNvIG9uLgorICovCisKKworaW50CitzZWVuX2F0X2xlYXN0XzFfZmlsZSAoKQkJLyogVFJVRSBpZiB3ZSBvcGVuZWQgYW55IGZpbGUuICovCit7CisgIHJldHVybiAocGh5c2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMKTsKK30KKwordm9pZAorYnVtcF9saW5lX2NvdW50ZXJzICgpCit7CisgIGlmIChzYl9pbmRleCA8IDApCisgICAgeworICAgICAgKytwaHlzaWNhbF9pbnB1dF9saW5lOworICAgICAgaWYgKGxvZ2ljYWxfaW5wdXRfbGluZSA+PSAwKQorCSsrbG9naWNhbF9pbnB1dF9saW5lOworICAgIH0KK30KKwwKKy8qCisgKgkJCW5ld19sb2dpY2FsX2xpbmUoKQorICoKKyAqIFRlbGxzIHVzIHdoYXQgdGhlIG5ldyBsb2dpY2FsIGxpbmUgbnVtYmVyIGFuZCBmaWxlIGFyZS4KKyAqIElmIHRoZSBsaW5lX251bWJlciBpcyAtMSwgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluZQorICogbnVtYmVyLiAgSWYgaXQgaXMgLTIsIHdlIGRlY3JlbWVudCB0aGUgbG9naWNhbCBsaW5lIG51bWJlciAodGhpcyBpcworICogdG8gc3VwcG9ydCB0aGUgLmFwcGZpbGUgcHNldWRvLW9wIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSBieQorICogZG9fc2NydWJfY2hhcnMpLgorICogSWYgdGhlIGZuYW1lIGlzIE5VTEwsIHdlIGRvbid0IGNoYW5nZSB0aGUgY3VycmVudCBsb2dpY2FsIGZpbGUgbmFtZS4KKyAqIFJldHVybnMgbm9uemVybyBpZiB0aGUgZmlsZW5hbWUgYWN0dWFsbHkgY2hhbmdlcy4KKyAqLworaW50CituZXdfbG9naWNhbF9saW5lIChmbmFtZSwgbGluZV9udW1iZXIpCisgICAgIGNoYXIgKmZuYW1lOwkJLyogRE9OJ1QgZGVzdHJveSBpdCEgV2UgcG9pbnQgdG8gaXQhICovCisgICAgIGludCBsaW5lX251bWJlcjsKK3sKKyAgaWYgKGxpbmVfbnVtYmVyID49IDApCisgICAgbG9naWNhbF9pbnB1dF9saW5lID0gbGluZV9udW1iZXI7CisgIGVsc2UgaWYgKGxpbmVfbnVtYmVyID09IC0yICYmIGxvZ2ljYWxfaW5wdXRfbGluZSA+IDApCisgICAgLS1sb2dpY2FsX2lucHV0X2xpbmU7CisKKyAgaWYgKGZuYW1lCisgICAgICAmJiAobG9naWNhbF9pbnB1dF9maWxlID09IE5VTEwKKwkgIHx8IHN0cmNtcCAobG9naWNhbF9pbnB1dF9maWxlLCBmbmFtZSkpKQorICAgIHsKKyAgICAgIGxvZ2ljYWxfaW5wdXRfZmlsZSA9IGZuYW1lOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CQkJCS8qIG5ld19sb2dpY2FsX2xpbmUoKSAqLworDAorLyoKKyAqCQkJYSBzIF8gdyBoIGUgciBlICgpCisgKgorICogUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCisgKiBuYW1lcCBzaG91bGQgYmUgY2hhciAqIGNvbnN0ICosIGJ1dCB0aGVyZSBhcmUgY29tcGlsZXJzIHdoaWNoIHNjcmV3CisgKiB1cCBkZWNsYXJhdGlvbnMgbGlrZSB0aGF0LCBhbmQgaXQncyBlYXNpZXIgdG8gYXZvaWQgaXQuCisgKi8KK3ZvaWQgCithc193aGVyZSAobmFtZXAsIGxpbmVwKQorICAgICBjaGFyICoqbmFtZXA7CisgICAgIHVuc2lnbmVkIGludCAqbGluZXA7Cit7CisgIGlmIChsb2dpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTAorICAgICAgJiYgKGxpbmVwID09IE5VTEwgfHwgbG9naWNhbF9pbnB1dF9saW5lID49IDApKQorICAgIHsKKyAgICAgICpuYW1lcCA9IGxvZ2ljYWxfaW5wdXRfZmlsZTsKKyAgICAgIGlmIChsaW5lcCAhPSBOVUxMKQorCSpsaW5lcCA9IGxvZ2ljYWxfaW5wdXRfbGluZTsKKyAgICB9CisgIGVsc2UgaWYgKHBoeXNpY2FsX2lucHV0X2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAqbmFtZXAgPSBwaHlzaWNhbF9pbnB1dF9maWxlOworICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCisJKmxpbmVwID0gcGh5c2ljYWxfaW5wdXRfbGluZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqbmFtZXAgPSAwOworICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCisJKmxpbmVwID0gMDsKKyAgICB9Cit9CQkJCS8qIGFzX3doZXJlKCkgKi8KKwwKKworCisKKy8qCisgKgkJCWEgcyBfIGggbyB3IG0gdSBjIGggKCkKKyAqCisgKiBPdXRwdXQgdG8gZ2l2ZW4gc3RyZWFtIGhvdyBtdWNoIG9mIGxpbmUgd2UgaGF2ZSBzY2FubmVkIHNvIGZhci4KKyAqIEFzc3VtZXMgd2UgaGF2ZSBzY2FubmVkIHVwIHRvIGFuZCBpbmNsdWRpbmcgaW5wdXRfbGluZV9wb2ludGVyLgorICogTm8gZnJlZSAnXG4nIGF0IGVuZCBvZiBsaW5lLgorICovCit2b2lkCithc19ob3dtdWNoIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsJCS8qIE9wZW5lZCBmb3Igd3JpdGUgcGxlYXNlLiAqLworeworICByZWdpc3RlciBjaGFyICpwOwkJLyogU2NhbiBpbnB1dCBsaW5lLiAqLworICAvKiByZWdpc3RlciBjaGFyIGM7IEpGIHVudXNlZCAqLworCisgIGZvciAocCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7ICpwICE9ICdcbic7IC0tcCkKKyAgICB7CisgICAgfQorICArK3A7CQkJCS8qIHAtPjFzdCBjaGFyIG9mIGxpbmUuICovCisgIGZvciAoOyBwIDw9IGlucHV0X2xpbmVfcG9pbnRlcjsgcCsrKQorICAgIHsKKyAgICAgIC8qIEFzc3VtZSBBU0NJSS4gRUJDRElDICYgb3RoZXIgbWljcm8tY29tcHV0ZXIgY2hhciBzZXRzIGlnbm9yZWQuICovCisgICAgICBhc18xX2NoYXIgKCh1bnNpZ25lZCBjaGFyKSAqcCwgc3RyZWFtKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIAorYXNfMV9jaGFyIChjLCBzdHJlYW0pCisgICAgIHVuc2lnbmVkIGludCBjOworICAgICBGSUxFICpzdHJlYW07Cit7CisgIGlmIChjID4gMTI3KQorICAgIHsKKyAgICAgICh2b2lkKSBwdXRjICgnJScsIHN0cmVhbSk7CisgICAgICBjIC09IDEyODsKKyAgICB9CisgIGlmIChjIDwgMzIpCisgICAgeworICAgICAgKHZvaWQpIHB1dGMgKCdeJywgc3RyZWFtKTsKKyAgICAgIGMgKz0gJ0AnOworICAgIH0KKyAgKHZvaWQpIHB1dGMgKGMsIHN0cmVhbSk7Cit9CisKKy8qIGVuZCBvZiBpbnB1dF9zY3J1Yi5jICovCmRpZmYgLS1naXQgYS9nYXMvaXRibC1sZXgubCBiL2dhcy9pdGJsLWxleC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDVkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvaXRibC1sZXgubApAQCAtMCwwICsxLDExNCBAQAorLyogaXRibC1sZXgubAorICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyV7CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgIml0YmwtcGFyc2UuaCIKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyh4KSBwcmludGYgeAorI2RlZmluZSBNREJHKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBEQkcoeCkKKyNkZWZpbmUgTURCRyh4KQorI2VuZGlmCisKK2ludCBpbnNudGJsX2xpbmUgPSAxOworJX0KKworQUxOVU0JW0EtWmEtejAtOV9dCitESUdJVAlbMC05XQorQUxQSEEJW0EtWmEtel9dCitIRVgJWzAtOUEtRmEtZl0KKworJSUKKworImNyZWcifCJDUkVHIiB7CisgICAgcmV0dXJuIENSRUc7CisgIH0KKyJkcmVnInwiRFJFRyIgeworICAgIHJldHVybiBEUkVHOworICB9CisiZ3JlZyJ8IkdSRUciIHsKKyAgICByZXR1cm4gR1JFRzsKKyAgfQorImltbWVkInwiSU1NRUQiIHsKKyAgICByZXR1cm4gSU1NRUQ7CisgIH0KKyJhZGRyInwiQUREUiIgeworICAgIHJldHVybiBBRERSOworICB9CisiaW5zbiJ8IklOU04iIHsKKyAgICByZXR1cm4gSU5TTjsKKyAgfQorInAie0RJR0lUfSB7CisgICAgeXl0ZXh0W3l5bGVuZ10gPSAwOworICAgIHl5bHZhbC5wcm9jZXNzb3IgPSBzdHJ0b3VsICh5eXRleHQrMSwgMCwgMCk7CisgICAgcmV0dXJuIFBOVU07CisgIH0KK3tESUdJVH0rIHsKKyAgICB5eXRleHRbeXlsZW5nXSA9IDA7CisgICAgeXlsdmFsLm51bSA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7CisgICAgcmV0dXJuIE5VTTsKKyAgfQorIjB4IntIRVh9KyB7CisgICAgeXl0ZXh0W3l5bGVuZ10gPSAwOworICAgIHl5bHZhbC5udW0gPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOworICAgIHJldHVybiBOVU07CisgIH0KK3tBTFBIQX17QUxOVU19Kgl7CisgICAgeXl0ZXh0W3l5bGVuZ10gPSAwOworICAgIHl5bHZhbC5zdHIgPSBzdHJkdXAgKHl5dGV4dCk7CisgICAgcmV0dXJuIElEOworICB9CisiOyJ8IiMiCXsKKyAgICBpbnQgYzsKKyAgICB3aGlsZSAoKGMgPSBpbnB1dCAoKSkgIT0gIEVPRikgCisgICAgICB7CisgICAgICAgIGlmIChjID09ICAnXG4nKSAKKyAgICAJeworICAgIAkJdW5wdXQgKGMpOworICAgIAkJYnJlYWs7CisgICAgCX0KKyAgICAgIH0KKyAgfQorIlxuIgl7IAorICAgIGluc250YmxfbGluZSsrOyAKKyAgICBNREJHICgoImluIGxleCwgTkwgPSAlZCAoeCV4KVxuIiwgTkwsIE5MKSk7CisgICAgcmV0dXJuIE5MOyAKKyAgfQorIiAifCJcdCIgeyAKKyAgfQorLiB7CisgICAgTURCRyAoKCJjaGFyID0gJXgsICVkXG4iLCB5eXRleHRbMF0sIHl5dGV4dFswXSkpOworICAgIHJldHVybiB5eXRleHRbMF07CisgIH0KKyUlCisKKyNpZm5kZWYgeXl3cmFwCitpbnQgCit5eXdyYXAgKCkgCisgIHsgCisgICAgcmV0dXJuIDE7IAorICB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9pdGJsLW9wcy5jIGIvZ2FzL2l0Ymwtb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwOGRjYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9pdGJsLW9wcy5jCkBAIC0wLDAgKzEsOTIxIEBACisvKiBpdGJsLW9wcy5jCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoKKyAqIEhlcmVpbiBsaWVzIHRoZSBzdXBwb3J0IGZvciBkeW5hbWljIHNwZWNpZmljYXRpb24gb2YgcHJvY2Vzc29yCisgKiBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycy4gIE1uZW1vbmljcywgdmFsdWVzLCBhbmQgZm9ybWF0cyBmb3IgZWFjaAorICogaW5zdHJ1Y3Rpb24gYW5kIHJlZ2lzdGVyIGFyZSBzcGVjaWZpZWQgaW4gYW4gYXNjaWkgZmlsZSBjb25zaXN0aW5nIG9mCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIGdyYW1tYXIgZm9yIHRoZSB0YWJsZSBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudAorICogIlByb2Nlc3NvciBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIi4KKyAqCisgKiBJbnN0cnVjdGlvbnMgdXNlIHRoZSBnbnUgYXNzZW1ibGVyIHN5bnRheCwgd2l0aCB0aGUgYWRkaXRpb24gb2YKKyAqIGFsbG93aW5nIG1uZW1vbmljcyBmb3IgcmVnaXN0ZXIuCisgKiBFZy4gImZ1bmMgJDIscmVnMywweDEwMCxzeW1ib2wgOyBjb21tZW50IgorICogCWZ1bmMgLSBvcGNvZGUgbmFtZQorICogCSRuIC0gcmVnaXN0ZXIgbgorICogCXJlZzMgLSBtbmVtb25pYyBmb3IgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgZGVmaW5lZCBpbiB0YWJsZQorICogCTB4ZGRkLi5kIC0gaW1tZWRpYXRlIHZhbHVlCisgKiAJc3ltYm9sIC0gYWRkcmVzcyBvZiBsYWJlbCBvciBleHRlcm5hbCBzeW1ib2wKKyAqCisgKiBGaXJzdCwgaXRibF9wYXJzZSByZWFkcyBpbiB0aGUgdGFibGUgb2YgcmVnaXN0ZXIgYW5kIGluc3RydWN0aW9uCisgKiBuYW1lcyBhbmQgZm9ybWF0cywgYW5kIGJ1aWxkcyBhIGxpc3Qgb2YgZW50cmllcyBmb3IgZWFjaAorICogcHJvY2Vzc29yL3R5cGUgY29tYmluYXRpb24uICBsZXggYW5kIHlhY2MgYXJlIHVzZWQgdG8gcGFyc2UKKyAqIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBhbmQgY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIHRvCisgKiBhZGQgZWFjaCBlbnRyeSB0byBvdXIgbGlzdC4KKyAqCisgKiBUaGVuLCB3aGVuIGFzc2VtYmxpbmcgb3IgZGlzYXNzZW1ibGluZywgdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8KKyAqIDEpIGdldCBpbmZvcm1hdGlvbiBvbiBhIHByb2Nlc3NvcidzIHJlZ2lzdGVycyBhbmQKKyAqIDIpIGFzc2VtYmxlL2Rpc2Fzc2VtYmxlIGFuIGluc3RydWN0aW9uLgorICogVG8gYXNzZW1ibGUoZGlzYXNzZW1ibGUpIGFuIGluc3RydWN0aW9uLCB0aGUgZnVuY3Rpb24KKyAqIGl0YmxfYXNzZW1ibGUoaXRibF9kaXNhc3NlbWJsZSkgaXMgY2FsbGVkIHRvIHNlYXJjaCB0aGUgbGlzdCBvZgorICogaW5zdHJ1Y3Rpb24gZW50cmllcywgYW5kIGlmIGEgbWF0Y2ggaXMgZm91bmQsIHVzZXMgdGhlIGZvcm1hdAorICogZGVzY3JpYmVkIGluIHRoZSBpbnN0cnVjdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgdG8gY29tcGxldGUgdGhlIGFjdGlvbi4KKyAqCisgKiBFZy4gU3VwcG9zZSB3ZSBoYXZlIGEgTWlwcyBjb3Byb2Nlc3NvciAiY29wMyIgd2l0aCBkYXRhIHJlZ2lzdGVyICJkMiIKKyAqIGFuZCB3ZSB3YW50IHRvIGRlZmluZSBmdW5jdGlvbiAicGlnIiB3aGljaCB0YWtlcyB0d28gb3BlcmFuZHMuCisgKgorICogR2l2ZW4gdGhlIHRhYmxlIGVudHJpZXM6CisgKiAJInAzIGluc24gcGlnIDB4MToyNC0yMSBkcmVnOjIwLTE2IGltbWVkOjE1LTAiCisgKiAJInAzIGRyZWcgZDIgMHgyIgorICogYW5kIHRoYXQgdGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGZvciBjb3Byb2Nlc3NvciBweiBoYXMgZW5jb2Rpbmc6CisgKiAJI2RlZmluZSBNSVBTX0VOQ09ERV9DT1BfTlVNKHopICgoMHgyMXwoejw8MSkpPDwyNSkKKyAqIAkjZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQorICoKKyAqIGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlOgorICogICAgICBzdHJ1Y3QgaXRibF9lbnRyeSA9IHsKKyAqICAgICAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yID0gZV9wMworICogICAgICBlX3R5cGUgdHlwZSA9IGVfaW5zbgorICogICAgICBjaGFyICpuYW1lID0gInBpZyIKKyAqICAgICAgdWludCB2YWx1ZSA9IDB4MQorICogICAgICB1aW50IGZsYWdzID0gMAorICogICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDI0LTIxCisgKiAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpmaWVsZCA9IHsKKyAqICAgICAgICAgICAgICBlX3R5cGUgdHlwZSA9IGVfZHJlZworICogICAgICAgICAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMjAtMTYKKyAqICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dCA9IHsKKyAqICAgICAgICAgICAgICAgICAgICAgIGVfdHlwZSB0eXBlID0gZV9pbW1lZAorICogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAxNS0wCisgKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dCA9IDAKKyAqICAgICAgICAgICAgICAgICAgICAgIH07CisgKiAgICAgICAgICAgICAgfTsKKyAqICAgICAgc3RydWN0IGl0YmxfZW50cnkgKm5leHQgPSAwCisgKiAgICAgIH07CisgKgorICogQW5kIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zOgorICogCSJwaWcgZDIsMHgxMDAiCisgKiAJInBpZyAkMiwweDEwMCIKKyAqCisgKiB3b3VsZCBib3RoIGFzc2VtYmxlIHRvIHRoZSBoZXggdmFsdWU6CisgKiAJIjB4NGUyMjAxMDAiCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIml0Ymwtb3BzLmgiCisjaW5jbHVkZSAiaXRibC1wYXJzZS5oIgorCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzc2VydC5oPgorI2RlZmluZSBBU1NFUlQoeCkgYXNzZXJ0KHgpCisjZGVmaW5lIERCRyh4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKHgpCisjZGVmaW5lIERCRyh4KQorI2VuZGlmCisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpIChhPGI/YTpiKQorI2VuZGlmCisKK2ludCBpdGJsX2hhdmVfZW50cmllcyA9IDA7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBzdHJ1Y3R1cmVzIGZvciBrZWVwaW5nIGl0YmwgZm9ybWF0IGVudHJpZXMgKi8KKworc3RydWN0IGl0YmxfcmFuZ2UKKyAgeworICAgIGludCBzYml0OwkJCS8qIG1hc2sgc3RhcnRpbmcgYml0IHBvc2l0aW9uICovCisgICAgaW50IGViaXQ7CQkJLyogbWFzayBlbmRpbmcgYml0IHBvc2l0aW9uICovCisgIH07CisKK3N0cnVjdCBpdGJsX2ZpZWxkCisgIHsKKyAgICBlX3R5cGUgdHlwZTsJCS8qIGRyZWcvY3JlZy9ncmVnL2ltbWVkL3N5bWIgKi8KKyAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZTsJLyogZmllbGQncyBiaXRmaWVsZCByYW5nZSB3aXRoaW4gaW5zdHJ1Y3Rpb24gKi8KKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBmaWVsZCBmbGFncyAqLworICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0OwkvKiBuZXh0IGZpZWxkIGluIGxpc3QgKi8KKyAgfTsKKworCisvKiBUaGVzZSBzdHJ1Y3R1cmVzIGRlZmluZSB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMgZm9yIGEgcHJvY2Vzc29yLgorICogSWYgdGhlIHR5cGUgaXMgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIGFuCisgKiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgZmllbGRzIGFyZSB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KKyAqIFRoZSBmbGFncyBmaWVsZCBiZWxvdyB1c2VzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aG9zZSBkZWZpbmVkIGluIHRoZQorICogZ251IGFzc2VtYmxlciBhbmQgYXJlIG1hY2hpbmUgc3BlY2lmaWMuICovCitzdHJ1Y3QgaXRibF9lbnRyeQorICB7CisgICAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yOwkvKiBwcm9jZXNzb3IgbnVtYmVyICovCisgICAgZV90eXBlIHR5cGU7CQkvKiBkcmVnL2NyZWcvZ3JlZy9pbnNuICovCisgICAgY2hhciAqbmFtZTsJCQkvKiBtbmVtaW9uaWMgbmFtZSBmb3IgaW5zbi9yZWdpc3RlciAqLworICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CS8qIG9wY29kZS9pbnN0cnVjdGlvbiBtYXNrL3JlZ2lzdGVyIG51bWJlciAqLworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGVmZmVjdHMgb2YgdGhlIGluc3RydWN0aW9uICovCisgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2U7CS8qIGJpdCByYW5nZSB3aXRoaW4gaW5zdHJ1Y3Rpb24gZm9yIHZhbHVlICovCisgICAgc3RydWN0IGl0YmxfZmllbGQgKmZpZWxkczsJLyogbGlzdCBvZiBvcGVyYW5kIGRlZmluaXRpb25zIChpZiBhbnkpICovCisgICAgc3RydWN0IGl0YmxfZW50cnkgKm5leHQ7CS8qIG5leHQgZW50cnkgKi8KKyAgfTsKKworCisvKiBsb2NhbCBkYXRhIGFuZCBzdHJ1Y3R1cmVzICovCisKK3N0YXRpYyBpbnQgaXRibF9udW1fb3Bjb2RlcyA9IDA7CisvKiBBcnJheSBvZiBlbnRyaWVzIGZvciBlYWNoIHByb2Nlc3NvciBhbmQgZW50cnkgdHlwZSAqLworc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICplbnRyaWVzW2VfbnByb2NzXVtlX250eXBlc10gPQoreworICB7MCwgMCwgMCwgMCwgMCwgMH0sCisgIHswLCAwLCAwLCAwLCAwLCAwfSwKKyAgezAsIDAsIDAsIDAsIDAsIDB9LAorICB7MCwgMCwgMCwgMCwgMCwgMH0KK307CisKKy8qIGxvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkpOworc3RhdGljIGVfdHlwZSBnZXRfdHlwZSBQQVJBTVMgKChpbnQgeXl0eXBlKSk7CitzdGF0aWMgZV9wcm9jZXNzb3IgZ2V0X3Byb2Nlc3NvciBQQVJBTVMgKChpbnQgeXlwcm9jKSk7CitzdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKipnZXRfZW50cmllcyBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAorCQkJCQkJZV90eXBlIHR5cGUpKTsKK3N0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZmluZF9lbnRyeV9ieW5hbWUgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKKwkJCQkJZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUpKTsKK3N0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZmluZF9lbnRyeV9ieXZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAorCQkJZV90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSAqcikpOworc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICphbGxvY19lbnRyeSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAorCQllX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBwbHlfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyB2YWx1ZSwgCisJCQkJCQlzdHJ1Y3QgaXRibF9yYW5nZSByKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHRyYWN0X3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdmFsdWUsIAorCQkJCQkJc3RydWN0IGl0YmxfcmFuZ2UgcikpOworc3RhdGljIHN0cnVjdCBpdGJsX2ZpZWxkICphbGxvY19maWVsZCBQQVJBTVMgKChlX3R5cGUgdHlwZSwgaW50IHNiaXQsIAorCQkJCQlpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBJbnRlcmZhY2VzIHRvIHRoZSBwYXJzZXIgKi8KKworCisvKiBPcGVuIHRoZSB0YWJsZSBhbmQgdXNlIGxleCBhbmQgeWFjYyB0byBwYXJzZSB0aGUgZW50cmllcy4KKyAqIFJldHVybiAxIGZvciBmYWlsdXJlOyAwIGZvciBzdWNjZXNzLiAgKi8KKworaW50IAoraXRibF9wYXJzZSAoY2hhciAqaW5zbnRibCkKK3sKKyAgZXh0ZXJuIEZJTEUgKnl5aW47CisgIGV4dGVybiBpbnQgeXlwYXJzZSAodm9pZCk7CisgIHl5aW4gPSBmb3BlbiAoaW5zbnRibCwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJDYW4ndCBvcGVuIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzcGVjaWZpY2F0aW9uIGZpbGUgXCIlc1wiXG4iLAorCSAgICAgIGluc250YmwpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKHl5cGFyc2UgKCkpOworICAgIH0KKyAgZmNsb3NlICh5eWluKTsKKyAgaXRibF9oYXZlX2VudHJpZXMgPSAxOworICByZXR1cm4gMDsKK30KKworLyogQWRkIGEgcmVnaXN0ZXIgZW50cnkgKi8KKworc3RydWN0IGl0YmxfZW50cnkgKgoraXRibF9hZGRfcmVnIChpbnQgeXlwcm9jZXNzb3IsIGludCB5eXR5cGUsIGNoYXIgKnJlZ25hbWUsCisJICAgICAgaW50IHJlZ251bSkKK3sKKyNpZiAwCQkJCQorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3ltYm9scy5oIgorICAvKiBTaW5jZSByZWdpc3RlciBuYW1lcyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCisgICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcworICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcworICAgICByZWdudW0uICAqLworICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KKyAgICAgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCisgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKHJlZ25hbWUsIHJlZ19zZWN0aW9uLAorCQkJCSAgICAgIHJlZ251bSwgJnplcm9fYWRkcmVzc19mcmFnKSk7CisjZW5kaWYKKyAgcmV0dXJuIGFsbG9jX2VudHJ5IChnZXRfcHJvY2Vzc29yICh5eXByb2Nlc3NvciksIGdldF90eXBlICh5eXR5cGUpLCByZWduYW1lLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgcmVnbnVtKTsKK30KKworLyogQWRkIGFuIGluc3RydWN0aW9uIGVudHJ5ICovCisKK3N0cnVjdCBpdGJsX2VudHJ5ICoKK2l0YmxfYWRkX2luc24gKGludCB5eXByb2Nlc3NvciwgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwkgICAgICAgaW50IHNiaXQsIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKKyAgZSA9IGFsbG9jX2VudHJ5IChnZXRfcHJvY2Vzc29yICh5eXByb2Nlc3NvciksIGVfaW5zbiwgbmFtZSwgdmFsdWUpOworICBpZiAoZSkKKyAgICB7CisgICAgICBlLT5yYW5nZS5zYml0ID0gc2JpdDsKKyAgICAgIGUtPnJhbmdlLmViaXQgPSBlYml0OworICAgICAgZS0+ZmxhZ3MgPSBmbGFnczsKKyAgICAgIGl0YmxfbnVtX29wY29kZXMrKzsKKyAgICB9CisgIHJldHVybiBlOworfQorCisvKiBBZGQgYW4gb3BlcmFuZCB0byBhbiBpbnN0cnVjdGlvbiBlbnRyeSAqLworCitzdHJ1Y3QgaXRibF9maWVsZCAqCitpdGJsX2FkZF9vcGVyYW5kIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgaW50IHl5dHlwZSwgaW50IHNiaXQsCisJCSAgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisgIHN0cnVjdCBpdGJsX2ZpZWxkICpmLCAqKmxhc3RfZjsKKyAgaWYgKCFlKQorICAgIHJldHVybiAwOworICAvKiBBZGQgdG8gZW5kIG9mIGZpZWxkcycgbGlzdC4gKi8KKyAgZiA9IGFsbG9jX2ZpZWxkIChnZXRfdHlwZSAoeXl0eXBlKSwgc2JpdCwgZWJpdCwgZmxhZ3MpOworICBpZiAoZikKKyAgICB7CisgICAgICBsYXN0X2YgPSAmZS0+ZmllbGRzOworICAgICAgd2hpbGUgKCpsYXN0X2YpCisJbGFzdF9mID0gJigqbGFzdF9mKS0+bmV4dDsKKyAgICAgICpsYXN0X2YgPSBmOworICAgICAgZi0+bmV4dCA9IDA7CisgICAgfQorICByZXR1cm4gZjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogSW50ZXJmYWNlcyBmb3IgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgKi8KKworI2lmbmRlZiBTVEFORF9BTE9ORQorI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3ltYm9scy5oIgorc3RhdGljIHZvaWQgYXBwZW5kX2luc25zX2FzX21hY3JvcyAodm9pZCk7CisKKy8qIGluaXRpYWxpemUgZm9yIGdhcyAqLwordm9pZCAKK2l0YmxfaW5pdCAodm9pZCkKK3sKKyAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7CisgIGVfcHJvY2Vzc29yIHByb2NuOworICBlX3R5cGUgdHlwZTsKKworICBpZiAoIWl0YmxfaGF2ZV9lbnRyaWVzKQorCXJldHVybjsKKworICAvKiBTaW5jZSByZWdpc3RlciBuYW1lcyBkb24ndCBoYXZlIGEgcHJlZml4LCBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCisgICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBzaW1wbGlmaWVzIGFyZ3VtZW50IHBhcnNpbmcgYXMKKyAgICAgd2UgY2FuIGxldCBnYXMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4gKi8KKyAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bworICAgICBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KKworICBmb3IgKHR5cGUgPSBlX3JlZ3R5cGUwOyB0eXBlIDwgZV9ucmVndHlwZXM7IHR5cGUrKykKKyAgICBmb3IgKHByb2NuID0gZV9wMDsgcHJvY24gPCBlX25wcm9jczsgcHJvY24rKykKKyAgICAgIHsKKwllcyA9IGdldF9lbnRyaWVzIChwcm9jbiwgdHlwZSk7CisJZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkKKwkgIHsKKwkgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAoZS0+bmFtZSwgcmVnX3NlY3Rpb24sCisJCQkJCSAgICAgZS0+dmFsdWUsICZ6ZXJvX2FkZHJlc3NfZnJhZykpOworCSAgfQorICAgICAgfQorICBhcHBlbmRfaW5zbnNfYXNfbWFjcm9zICgpOworfQorCisKKy8qIEFwcGVuZCBpbnNucyB0byBvcGNvZGVzIHRhYmxlIGFuZCBpbmNyZWFzZSBudW1iZXIgb2Ygb3Bjb2RlcyAKKyAqIFN0cnVjdHVyZSBvZiBvcGNvZGVzIHRhYmxlOiAKKyAqIHN0cnVjdCBpdGJsX29wY29kZQorICogeworICogICBjb25zdCBjaGFyICpuYW1lOworICogICBjb25zdCBjaGFyICphcmdzOyAJCS0gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cy4gIAorICogICB1bnNpZ25lZCBsb25nIG1hdGNoOyAJLSBvcGNvZGUsIG9yIElTQSBsZXZlbCBpZiBwaW5mbz1JTlNOX01BQ1JPIAorICogICB1bnNpZ25lZCBsb25nIG1hc2s7IAktIG9wY29kZSBtYXNrLCBvciBtYWNybyBpZCBpZiBwaW5mbz1JTlNOX01BQ1JPIAorICogICB1bnNpZ25lZCBsb25nIHBpbmZvOyAJLSBpbnNuIGZsYWdzLCBvciBJTlNOX01BQ1JPIAorICogfTsKKyAqIGV4YW1wbGVzOgorICoJeyJsaSIsICAgICAgInQsaSIsICAweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90ICAgIH0sCisgKgl7ImxpIiwgICAgICAidCxJIiwgIDAsICAgIChpbnQpIE1fTEksICAgSU5TTl9NQUNSTyAgfSwKKyAqLworCitzdGF0aWMgY2hhciAqZm9ybV9hcmdzIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSk7CitzdGF0aWMgdm9pZCAKK2FwcGVuZF9pbnNuc19hc19tYWNyb3MgKHZvaWQpCit7CisgIHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QgKm5ld19vcGNvZGVzLCAqbzsKKyAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7CisgIGludCBuLCBpZCwgc2l6ZSwgbmV3X3NpemUsIG5ld19udW1fb3Bjb2RlczsKKworICBpZiAoIWl0YmxfaGF2ZV9lbnRyaWVzKQorCXJldHVybjsKKworICBpZiAoIWl0YmxfbnVtX29wY29kZXMpCS8qIG5vIG5ldyBpbnN0cnVjdGlvbnMgdG8gYWRkISAqLworICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIERCRyAoKCJwcmV2aW91cyBudW1fb3Bjb2Rlcz0lZFxuIiwgSVRCTF9OVU1fT1BDT0RFUykpOworCisgIG5ld19udW1fb3Bjb2RlcyA9IElUQkxfTlVNX09QQ09ERVMgKyBpdGJsX251bV9vcGNvZGVzOworICBBU1NFUlQgKG5ld19udW1fb3Bjb2RlcyA+PSBpdGJsX251bV9vcGNvZGVzKTsKKworICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUKSAqIElUQkxfTlVNX09QQ09ERVM7CisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgREJHICgoIkkgZ2V0PSVkXG4iLCBzaXplIC8gc2l6ZW9mIChJVEJMX09QQ09ERVNbMF0pKSk7CisKKyAgbmV3X3NpemUgPSBzaXplb2YgKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QpICogbmV3X251bV9vcGNvZGVzOworICBBU1NFUlQgKG5ld19zaXplID4gc2l6ZSk7CisKKyAgLyogRklYTUUgc2luY2UgSVRCTF9PUENPREVTIGN1bGQgYmUgYSBzdGF0aWMgdGFibGUsCisJCXdlIGNhbid0IHJlYWxsb2Mgb3IgZGVsZXRlIHRoZSBvbGQgbWVtb3J5LiAqLworICBuZXdfb3Bjb2RlcyA9IChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUICopIG1hbGxvYyAobmV3X3NpemUpOworICBpZiAoIW5ld19vcGNvZGVzKQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGluc3RydWN0aW9uc1xuIikpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKHNpemUpCQkJLyogY29weSBwcmV4aXN0aW5nIG9wY29kZXMgdGFibGUgKi8KKyAgICBtZW1jcHkgKG5ld19vcGNvZGVzLCBJVEJMX09QQ09ERVMsIHNpemUpOworCisgIC8qIEZJWE1FISBzb21lIE5VTU9QQ09ERVMgYXJlIGNhbGN1bGF0ZWQgZXhwcmVzc2lvbnMuCisJCVRoZXNlIG5lZWQgdG8gYmUgY2hhbmdlZCBiZWZvcmUgaXRibHMgY2FuIGJlIHN1cHBvcnRlZC4gKi8KKworICBpZCA9IElUQkxfTlVNX01BQ1JPUzsJCS8qIGJlZ2luIHRoZSBuZXh0IG1hY3JvIGlkIGFmdGVyIHRoZSBsYXN0ICovCisgIG8gPSAmbmV3X29wY29kZXNbSVRCTF9OVU1fT1BDT0RFU107CS8qIGFwcGVuZCBtYWNybyB0byBvcGNvZGVzIGxpc3QgKi8KKyAgZm9yIChuID0gZV9wMDsgbiA8IGVfbnByb2NzOyBuKyspCisgICAgeworICAgICAgZXMgPSBnZXRfZW50cmllcyAobiwgZV9pbnNuKTsKKyAgICAgIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCisJeworCSAgLyogbmFtZSwgICAgYXJncywgICBtYXNrLCAgICAgICBtYXRjaCwgIHBpbmZvCisJCSAqIHsibGkiLCAgICAgICJ0LGkiLCAgMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCAgICB9LAorCQkgKiB7ImxpIiwgICAgICAidCxJIiwgIDAsICAgIChpbnQpIE1fTEksICAgSU5TTl9NQUNSTyAgfSwKKwkJICogQ29uc3RydWN0IGFyZ3MgZnJvbSBpdGJsX2ZpZWxkcy4KKwkJKi8KKwkgIG8tPm5hbWUgPSBlLT5uYW1lOworCSAgby0+YXJncyA9IHN0cmR1cCAoZm9ybV9hcmdzIChlKSk7CisJICBvLT5tYXNrID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7CisJICAvKiBGSVhNRSBob3cgdG8gY2F0Y2ggZHVycmluZyBhc3NlbWJseT8gKi8KKwkgIC8qIG1hc2sgdG8gaWRlbnRpZnkgdGhpcyBpbnNuICovCisJICBvLT5tYXRjaCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOworCSAgby0+cGluZm8gPSAwOworCisjaWZkZWYgVVNFX01BQ1JPUworCSAgby0+bWFzayA9IGlkKys7CS8qIEZJWE1FIGhvdyB0byBjYXRjaCBkdXJyaW5nIGFzc2VtYmx5PyAqLworCSAgby0+bWF0Y2ggPSAwOwkJLyogZm9yIG1hY3JvcywgdGhlIGluc25faXNhIG51bWJlciAqLworCSAgby0+cGluZm8gPSBJTlNOX01BQ1JPOworI2VuZGlmCisKKwkgIC8qIERvbid0IGFkZCBpbnN0cnVjdGlvbnMgd2hpY2ggY2F1c2VkIGFuIGVycm9yICovCisJICBpZiAoby0+YXJncykKKwkgICAgbysrOworCSAgZWxzZQorCSAgICBuZXdfbnVtX29wY29kZXMtLTsKKwl9CisgICAgfQorICBJVEJMX09QQ09ERVMgPSBuZXdfb3Bjb2RlczsKKyAgSVRCTF9OVU1fT1BDT0RFUyA9IG5ld19udW1fb3Bjb2RlczsKKworICAvKiBGSVhNRQorCQlBdCB0aGlzIHBvaW50LCB3ZSBjYW4gZnJlZSB0aGUgZW50cmllcywgYXMgdGhleSBzaG91bGQgaGF2ZQorCQliZWVuIGFkZGVkIHRvIHRoZSBhc3NlbWJsZXIncyB0YWJsZXMuCisJCURvbid0IGZyZWUgbmFtZSB0aG91Z2gsIHNpbmNlIG5hbWUgaXMgYmVpbmcgdXNlZCBieSB0aGUgbmV3CisJCW9wY29kZXMgdGFibGUuCisKKwkJRXZlbnR1YWxseSwgd2Ugc2hvdWxkIGFsc28gZnJlZSB0aGUgbmV3IG9wY29kZXMgdGFibGUgaXRzZWxmIAorCQlvbiBleGl0LgorCSovCit9CisKK3N0YXRpYyBjaGFyICoKK2Zvcm1fYXJncyAoc3RydWN0IGl0YmxfZW50cnkgKmUpCit7CisgIHN0YXRpYyBjaGFyIHNbMzFdOworICBjaGFyIGMgPSAwLCAqcCA9IHM7CisgIHN0cnVjdCBpdGJsX2ZpZWxkICpmOworCisgIEFTU0VSVCAoZSk7CisgIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCisgICAgeworICAgICAgc3dpdGNoIChmLT50eXBlKQorCXsKKwljYXNlIGVfZHJlZzoKKwkgIGMgPSAnZCc7CisJICBicmVhazsKKwljYXNlIGVfY3JlZzoKKwkgIGMgPSAndCc7CisJICBicmVhazsKKwljYXNlIGVfZ3JlZzoKKwkgIGMgPSAncyc7CisJICBicmVhazsKKwljYXNlIGVfaW1tZWQ6CisJICBjID0gJ2knOworCSAgYnJlYWs7CisJY2FzZSBlX2FkZHI6CisJICBjID0gJ2EnOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGMgPSAwOwkJLyogaWdub3JlOyB1bmtub3duIGZpZWxkIHR5cGUgKi8KKwl9CisgICAgICBpZiAoYykKKwl7CisJICBpZiAocCAhPSBzKQorCSAgICAqcCsrID0gJywnOworCSAgKnArKyA9IGM7CisJfQorICAgIH0KKyAgKnAgPSAwOworICByZXR1cm4gczsKK30KKyNlbmRpZiAvKiAhU1RBTkRfQUxPTkUgKi8KKworCisvKiBHZXQgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgbmFtZSBmcm9tIHZhbCAqLworCit1bnNpZ25lZCBsb25nIAoraXRibF9nZXRfcmVnX3ZhbCAoY2hhciAqbmFtZSkKK3sKKyAgZV90eXBlIHQ7CisgIGVfcHJvY2Vzc29yIHA7CisgIGludCByID0gMDsKKyAgZm9yIChwID0gZV9wMDsgcCA8IGVfbnByb2NzOyBwKyspCisgICAgZm9yICh0ID0gZV9yZWd0eXBlMDsgdCA8IGVfbnJlZ3R5cGVzOyB0KyspCisgICAgICB7CisJaWYgKHIgPSBpdGJsX2dldF92YWwgKHAsIHQsIG5hbWUpLCByKQorCSAgcmV0dXJuIHI7CisgICAgICB9CisgIHJldHVybiAwOworfQorCitjaGFyICoKK2l0YmxfZ2V0X25hbWUgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKKyAgLyogdHlwZSBkZXBlbmRzIG9uIGluc3RydWN0aW9uIHBhc3NlZCAqLworICByID0gZmluZF9lbnRyeV9ieXZhbCAocHJvY2Vzc29yLCB0eXBlLCB2YWwsIDApOworICBpZiAocikKKyAgICByZXR1cm4gci0+bmFtZTsKKyAgZWxzZQorICAgIHJldHVybiAwOwkJCS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KK30KKworLyogR2V0IHByb2Nlc3NvcidzIHJlZ2lzdGVyIHZhbHVlIGZyb20gbmFtZSAqLworCit1bnNpZ25lZCBsb25nIAoraXRibF9nZXRfdmFsIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lKQoreworICBzdHJ1Y3QgaXRibF9lbnRyeSAqcjsKKyAgLyogdHlwZSBkZXBlbmRzIG9uIGluc3RydWN0aW9uIHBhc3NlZCAqLworICByID0gZmluZF9lbnRyeV9ieW5hbWUgKHByb2Nlc3NvciwgdHlwZSwgbmFtZSk7CisgIGlmIChyKQorICAgIHJldHVybiByLT52YWx1ZTsKKyAgZWxzZQorICAgIHJldHVybiAwOwkJCS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KK30KKworCisvKiBBc3NlbWJsZSBpbnN0cnVjdGlvbiAibmFtZSIgd2l0aCBvcGVyYW5kcyAicyIuCisgKiBuYW1lIC0gbmFtZSBvZiBpbnN0cnVjdGlvbgorICogcyAtIG9wZXJhbmRzCisgKiByZXR1cm5zIC0gbG9uZyB3b3JkIGZvciBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gKi8KKwordW5zaWduZWQgbG9uZyAKK2l0YmxfYXNzZW1ibGUgKGNoYXIgKm5hbWUsIGNoYXIgKnMpCit7CisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKKyAgc3RydWN0IGl0YmxfZmllbGQgKmY7CisgIGNoYXIgKm47CisgIGludCBwcm9jZXNzb3I7CisKKyAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKKyAgICByZXR1cm4gMDsJCQkvKiBlcnJvciEgIG11c3QgaGF2ZSBhIG9wY29kZSBuYW1lL2V4cHIgKi8KKworICAvKiBmaW5kIGVudHJ5IGluIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGZvciBhbGwgcHJvY2Vzc29ycyAqLworICBmb3IgKHByb2Nlc3NvciA9IDA7IHByb2Nlc3NvciA8IGVfbnByb2NzOyBwcm9jZXNzb3IrKykKKyAgICB7CisgICAgICBlID0gZmluZF9lbnRyeV9ieW5hbWUgKHByb2Nlc3NvciwgZV9pbnNuLCBuYW1lKTsKKyAgICAgIGlmIChlKQorCWJyZWFrOworICAgIH0KKyAgaWYgKCFlKQorICAgIHJldHVybiAwOwkJCS8qIG9wY29kZSBub3QgaW4gdGFibGU7IGludmFsaWQgaW5zdHJ1c3Rpb24gKi8KKyAgb3Bjb2RlID0gYnVpbGRfb3Bjb2RlIChlKTsKKworICAvKiBwYXJzZSBvcGNvZGUncyBhcmdzIChpZiBhbnkpICovCisgIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCS8qIGZvciBlYWNoIGFyZywgLi4uICovCisgICAgeworICAgICAgc3RydWN0IGl0YmxfZW50cnkgKnI7CisgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgICAgaWYgKCFzIHx8ICEqcykKKwlyZXR1cm4gMDsJCS8qIGVycm9yIC0gbm90IGVub3VnaCBvcGVyYW5kcyAqLworICAgICAgbiA9IGl0YmxfZ2V0X2ZpZWxkICgmcyk7CisgICAgICAvKiBuIHNob3VsZCBiZSBpbiBmb3JtICRuIG9yIDB4aGhoIChhcmUgc3ltYm9sIG5hbWVzIHZhbGlkPz8gKi8KKyAgICAgIHN3aXRjaCAoZi0+dHlwZSkKKwl7CisJY2FzZSBlX2RyZWc6CisJY2FzZSBlX2NyZWc6CisJY2FzZSBlX2dyZWc6CisJICAvKiBBY2NlcHQgZWl0aGVyIGEgc3RyaW5nIG5hbWUKKwkJCSAqIG9yICckJyBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCisJICBpZiAoKm4gPT0gJyQnKQorCSAgICB7CisJICAgICAgbisrOworCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxMCk7CisJICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjBsIi4uLiB0aGVuIHdoYXQ/PyAqLworCSAgICAgIGlmICh2YWx1ZSA9PSAwICYmICpuICE9ICcwJykKKwkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgciA9IGZpbmRfZW50cnlfYnluYW1lIChlLT5wcm9jZXNzb3IsIGYtPnR5cGUsIG4pOworCSAgICAgIGlmIChyKQorCQl2YWx1ZSA9IHItPnZhbHVlOworCSAgICAgIGVsc2UKKwkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBlX2FkZHI6CisJICAvKiB1c2UgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlIHRvIGZpbmQgc3ltYm9sICovCisJICAvKiBGSVhNRSEhIERvIHdlIG5lZWQgdGhpcz8KKwkJCQlpZiBzbywgd2hhdCBhYm91dCByZWxvY3M/PworCQkJCW15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7CisJCQkJcmV0dXJuIDA7CS8tKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICotLworCQkJCWJyZWFrOworCQkJKi8KKwkgIC8qIElmIG5vdCBhIHN5bWJvbCwgZmFsbCB0aHJ1IHRvIElNTUVEICovCisJY2FzZSBlX2ltbWVkOgorCSAgaWYgKCpuID09ICcwJyAmJiAqKG4gKyAxKSA9PSAneCcpCS8qIGhleCBiZWdpbnMgMHguLi4gKi8KKwkgICAgeworCSAgICAgIG4gKz0gMjsKKwkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTYpOworCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIweGwiLi4uIHRoZW4gd2hhdD8/ICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxMCk7CisJICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjBsIi4uLiB0aGVuIHdoYXQ/PyAqLworCSAgICAgIGlmICh2YWx1ZSA9PSAwICYmICpuICE9ICcwJykKKwkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHJldHVybiAwOwkJLyogZXJyb3I7IGludmFsaWQgZmllbGQgc3BlYyAqLworCX0KKyAgICAgIG9wY29kZSB8PSBhcHBseV9yYW5nZSAodmFsdWUsIGYtPnJhbmdlKTsKKyAgICB9CisgIGlmIChzICYmICpzKQorICAgIHJldHVybiAwOwkJCS8qIGVycm9yIC0gdG9vIG1hbnkgb3BlcmFuZHMgKi8KKyAgcmV0dXJuIG9wY29kZTsJCS8qIGRvbmUhICovCit9CisKKy8qIERpc2Fzc2VtYmxlIGluc3RydWN0aW9uICJpbnNuIi4KKyAqIGluc24gLSBpbnN0cnVjdGlvbgorICogcyAtIGJ1ZmZlciB0byBob2xkIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbgorICogcmV0dXJucyAtIDEgaWYgc3VjY2VlZGVkOyAwIGlmIGZhaWxlZAorICovCisKK2ludCAKK2l0YmxfZGlzYXNzZW1ibGUgKGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgaW5zbikKK3sKKyAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yOworICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKKyAgc3RydWN0IGl0YmxfZmllbGQgKmY7CisKKyAgaWYgKCFJVEJMX0lTX0lOU04gKGluc24pKQorICAgIHJldHVybiAwOwkJCS8qIGVycm9yKi8KKyAgcHJvY2Vzc29yID0gZ2V0X3Byb2Nlc3NvciAoSVRCTF9ERUNPREVfUE5VTSAoaW5zbikpOworCisgIC8qIGZpbmQgZW50cnkgaW4gbGlzdCAqLworICBlID0gZmluZF9lbnRyeV9ieXZhbCAocHJvY2Vzc29yLCBlX2luc24sIGluc24sIDApOworICBpZiAoIWUpCisgICAgcmV0dXJuIDA7CQkJLyogb3Bjb2RlIG5vdCBpbiB0YWJsZTsgaW52YWxpZCBpbnN0cnVzdGlvbiAqLworICBzdHJjcHkgKHMsIGUtPm5hbWUpOworCisgIC8qIHBhcnNlIGluc24ncyBhcmdzIChpZiBhbnkpICovCisgIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCS8qIGZvciBlYWNoIGFyZywgLi4uICovCisgICAgeworICAgICAgc3RydWN0IGl0YmxfZW50cnkgKnI7CisgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisgICAgICBpZiAoZiA9PSBlLT5maWVsZHMpCS8qIGZpcnN0IG9wZXJhbmQgaXMgcHJlY2VlZGVkIGJ5IHRhYiAqLworCXN0cmNhdCAocywgIlx0Iik7CisgICAgICBlbHNlCQkJLyogJywncyBzZXBhcmF0ZSBmb2xsb3dpbmcgb3BlcmFuZHMgKi8KKwlzdHJjYXQgKHMsICIsIik7CisgICAgICB2YWx1ZSA9IGV4dHJhY3RfcmFuZ2UgKGluc24sIGYtPnJhbmdlKTsKKyAgICAgIC8qIG4gc2hvdWxkIGJlIGluIGZvcm0gJG4gb3IgMHhoaGggKGFyZSBzeW1ib2wgbmFtZXMgdmFsaWQ/PyAqLworICAgICAgc3dpdGNoIChmLT50eXBlKQorCXsKKwljYXNlIGVfZHJlZzoKKwljYXNlIGVfY3JlZzoKKwljYXNlIGVfZ3JlZzoKKwkgIC8qIEFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgbmFtZQorCQkJICogb3IgJyQnIGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlciBudW1iZXIgKi8KKwkgIHIgPSBmaW5kX2VudHJ5X2J5dmFsIChlLT5wcm9jZXNzb3IsIGYtPnR5cGUsIHZhbHVlLCAmZi0+cmFuZ2UpOworCSAgaWYgKHIpCisJICAgIHN0cmNhdCAocywgci0+bmFtZSk7CisJICBlbHNlCisJICAgIHNwcmludGYgKHMsICIlcyQlZCIsIHMsIHZhbHVlKTsKKwkgIGJyZWFrOworCWNhc2UgZV9hZGRyOgorCSAgLyogdXNlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZSB0byBmaW5kIHN5bWJvbCAqLworCSAgLyogRklYTUUhISBEbyB3ZSBuZWVkIHRoaXM/CisJCQkgKiAgIGlmIHNvLCB3aGF0IGFib3V0IHJlbG9jcz8/CisJCQkqLworCSAgLyogSWYgbm90IGEgc3ltYm9sLCBmYWxsIHRocnUgdG8gSU1NRUQgKi8KKwljYXNlIGVfaW1tZWQ6CisJICBzcHJpbnRmIChzLCAiJXMweCV4IiwgcywgdmFsdWUpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHJldHVybiAwOwkJLyogZXJyb3I7IGludmFsaWQgZmllbGQgc3BlYyAqLworCX0KKyAgICB9CisgIHJldHVybiAxOwkJCS8qIGRvbmUhICovCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgorICogTG9jYWwgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgcHJpdmF0ZSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcKKyAqIHRoZSBuYW1lcyBhbmQgZm9ybWF0IGZvciB0aGUgbmV3IGluc3RydWN0aW9ucyBhbmQgcmVnaXN0ZXJzCisgKiBmb3IgZWFjaCBwcm9jZXNzb3IuCisgKi8KKworLyogQ2FsY3VsYXRlIGluc3RydWN0aW9uJ3Mgb3Bjb2RlIGFuZCBmdW5jdGlvbiB2YWx1ZXMgZnJvbSBlbnRyeSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyAKK2J1aWxkX29wY29kZSAoc3RydWN0IGl0YmxfZW50cnkgKmUpCit7CisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworCisgIG9wY29kZSA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOworICBvcGNvZGUgfD0gSVRCTF9FTkNPREVfUE5VTSAoZS0+cHJvY2Vzc29yKTsKKyAgcmV0dXJuIG9wY29kZTsKK30KKworLyogQ2FsY3VsYXRlIGFic29sdXRlIHZhbHVlIGdpdmVuIHRoZSByZWxhdGl2ZSB2YWx1ZSBhbmQgYml0IHBvc2l0aW9uIHJhbmdlCisgKiB3aXRoaW4gdGhlIGluc3RydWN0aW9uLgorICogVGhlIHJhbmdlIGlzIGluY2x1c2l2ZSB3aGVyZSAwIGlzIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KKyAqIEEgcmFuZ2Ugb2YgeyAyNCwgMjAgfSB3aWxsIGhhdmUgYSBtYXNrIG9mCisgKiBiaXQgICAzICAgICAgICAgICAyICAgICAgICAgICAgMQorICogcG9zOiAxMDk4IDc2NTQgMzIxMCA5ODc2IDU0MzIgMTA5OCA3NjU0IDMyMTAKKyAqIGJpbjogMDAwMCAwMDAxIDExMTEgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwCisgKiBoZXg6ICAgIDAgICAgMSAgICBmICAgIDAgICAgMCAgICAwICAgIDAgICAgMAorICogbWFzazogMHgwMWYwMDAwMC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyAKK2FwcGx5X3JhbmdlICh1bnNpZ25lZCBsb25nIHJ2YWwsIHN0cnVjdCBpdGJsX3JhbmdlIHIpCit7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgdW5zaWduZWQgbG9uZyBhdmFsOworICBpbnQgbGVuID0gTUFYX0JJVFBPUyAtIHIuc2JpdDsKKworICBBU1NFUlQgKHIuc2JpdCA+PSByLmViaXQpOworICBBU1NFUlQgKE1BWF9CSVRQT1MgPj0gci5zYml0KTsKKyAgQVNTRVJUIChyLmViaXQgPj0gMCk7CisKKyAgLyogY3JlYXRlIG1hc2sgYnkgdHJ1bmNhdGluZyAxcyBieSBzaGlmdGluZyAqLworICBtYXNrID0gMHhmZmZmZmZmZiA8PCBsZW47CisgIG1hc2sgPSBtYXNrID4+IGxlbjsKKyAgbWFzayA9IG1hc2sgPj4gci5lYml0OworICBtYXNrID0gbWFzayA8PCByLmViaXQ7CisKKyAgYXZhbCA9IChydmFsIDw8IHIuZWJpdCkgJiBtYXNrOworICByZXR1cm4gYXZhbDsKK30KKworLyogQ2FsY3VsYXRlIHJlbGF0aXZlIHZhbHVlIGdpdmVuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhbmQgYml0IHBvc2l0aW9uIHJhbmdlCisgKiB3aXRoaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgCitleHRyYWN0X3JhbmdlICh1bnNpZ25lZCBsb25nIGF2YWwsIHN0cnVjdCBpdGJsX3JhbmdlIHIpCit7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgdW5zaWduZWQgbG9uZyBydmFsOworICBpbnQgbGVuID0gTUFYX0JJVFBPUyAtIHIuc2JpdDsKKworICAvKiBjcmVhdGUgbWFzayBieSB0cnVuY2F0aW5nIDFzIGJ5IHNoaWZ0aW5nICovCisgIG1hc2sgPSAweGZmZmZmZmZmIDw8IGxlbjsKKyAgbWFzayA9IG1hc2sgPj4gbGVuOworICBtYXNrID0gbWFzayA+PiByLmViaXQ7CisgIG1hc2sgPSBtYXNrIDw8IHIuZWJpdDsKKworICBydmFsID0gKGF2YWwgJiBtYXNrKSA+PiByLmViaXQ7CisgIHJldHVybiBydmFsOworfQorCisvKiBFeHRyYWN0IHByb2Nlc3NvcidzIGFzc2VtYmx5IGluc3RydWN0aW9uIGZpZWxkIG5hbWUgZnJvbSBzOworICogZm9ybXMgYXJlICJuIGFyZ3MiICJuLGFyZ3MiIG9yICJuIiAqLworLyogUmV0dXJuIG5leHQgYXJndW1lbnQgZnJvbSBzdHJpbmcgcG9pbnRlciAicyIgYW5kIGFkdmFuY2Ugcy4KKyAqIGRlbGltaXRlcnMgYXJlICIgLFwwIiAqLworCitjaGFyICoKK2l0YmxfZ2V0X2ZpZWxkIChjaGFyICoqUykKK3sKKyAgc3RhdGljIGNoYXIgblsxMjhdOworICBjaGFyICpwLCAqcHMsICpzOworICBpbnQgbGVuOworCisgIHMgPSAqUzsKKyAgaWYgKCFzIHx8ICEqcykKKyAgICByZXR1cm4gMDsKKyAgcCA9IHMgKyBzdHJsZW4gKHMpOworICBpZiAocHMgPSBzdHJjaHIgKHMsICcsJyksIHBzKQorICAgIHAgPSBwczsKKyAgaWYgKHBzID0gc3RyY2hyIChzLCAnICcpLCBwcykKKyAgICBwID0gbWluIChwLCBwcyk7CisgIGlmIChwcyA9IHN0cmNociAocywgJ1wwJyksIHBzKQorICAgIHAgPSBtaW4gKHAsIHBzKTsKKyAgaWYgKHAgPT0gMCkKKyAgICByZXR1cm4gMDsJCQkvKiBlcnJvciEgKi8KKyAgbGVuID0gcCAtIHM7CisgIEFTU0VSVCAoMTI4ID4gbGVuICsgMSk7CisgIHN0cm5jcHkgKG4sIHMsIGxlbik7CisgIG5bbGVuXSA9IDA7CisgIGlmIChzW2xlbl0gPT0gJ1wwJykKKyAgICBzID0gMDsJCQkvKiBubyBtb3JlIGFyZ3MgKi8KKyAgZWxzZQorICAgIHMgKz0gbGVuICsgMTsJCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmcgKi8KKworICAqUyA9IHM7CisgIHJldHVybiBuOworfQorCisvKiBTZWFyY2ggZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUKKyAqIHRvIGZpbmQgb25lIG1hdGNoaW5nIHRoZSBuYW1lICJuIi4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5ICovCisKK3N0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqCitmaW5kX2VudHJ5X2J5bmFtZSAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLAorCQkgICBlX3R5cGUgdHlwZSwgY2hhciAqbikKK3sKKyAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7CisKKyAgZXMgPSBnZXRfZW50cmllcyAocHJvY2Vzc29yLCB0eXBlKTsKKyAgZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkJLyogZm9yIGVhY2ggZW50cnksIC4uLiAqLworICAgIHsKKyAgICAgIGlmICghc3RyY21wIChlLT5uYW1lLCBuKSkKKwlyZXR1cm4gZTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBTZWFyY2ggZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUKKyAqIHRvIGZpbmQgb25lIG1hdGNoaW5nIHRoZSB2YWx1ZSAidmFsIiBmb3IgdGhlIHJhbmdlICJyIi4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5LgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBkaXNhc3NlbWJsaW5nIGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbi4KKyAqLworCitzdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgorZmluZF9lbnRyeV9ieXZhbCAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwKKwkJICB1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgKnIpCit7CisgIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOworICB1bnNpZ25lZCBsb25nIGV2YWw7CisKKyAgZXMgPSBnZXRfZW50cmllcyAocHJvY2Vzc29yLCB0eXBlKTsKKyAgZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkJLyogZm9yIGVhY2ggZW50cnksIC4uLiAqLworICAgIHsKKyAgICAgIGlmIChwcm9jZXNzb3IgIT0gZS0+cHJvY2Vzc29yKQorCWNvbnRpbnVlOworICAgICAgLyogRm9yIGluc25zLCB3ZSBtaWdodCBub3Qga25vdyB0aGUgcmFuZ2Ugb2YgdGhlIG9wY29kZSwKKwkgKiBzbyBhIHJhbmdlIG9mIDAgd2lsbCBhbGxvdyB0aGlzIHJvdXRpbmUgdG8gbWF0Y2ggYWdhaW5zdAorCSAqIHRoZSByYW5nZSBvZiB0aGUgZW50cnkgdG8gYmUgY29tcGFyZWQgd2l0aC4KKwkgKiBUaGlzIGNvdWxkIGNhdXNlIGFtYmlndWl0aWVzLgorCSAqIEZvciBvcGVyYW5kcywgd2UgZ2V0IGFuIGV4dHJhY3RlZCB2YWx1ZSBhbmQgYSByYW5nZS4KKwkgKi8KKyAgICAgIC8qIGlmIHJhbmdlIGlzIDAsIG1hc2sgdmFsIGFnYWluc3QgdGhlIHJhbmdlIG9mIHRoZSBjb21wYXJlZCBlbnRyeS4gKi8KKyAgICAgIGlmIChyID09IDApCQkvKiBpZiBubyByYW5nZSBwYXNzZWQsIG11c3QgYmUgd2hvbGUgMzItYml0cworCQkJICogc28gY3JlYXRlIDMyLWJpdCB2YWx1ZSBmcm9tIGVudHJ5J3MgcmFuZ2UgKi8KKwl7CisJICBldmFsID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7CisJICB2YWwgJj0gYXBwbHlfcmFuZ2UgKDB4ZmZmZmZmZmYsIGUtPnJhbmdlKTsKKwl9CisgICAgICBlbHNlIGlmIChyLT5zYml0ID09IGUtPnJhbmdlLnNiaXQgJiYgci0+ZWJpdCA9PSBlLT5yYW5nZS5lYml0CisJICAgICAgIHx8IGUtPnJhbmdlLnNiaXQgPT0gMCAmJiBlLT5yYW5nZS5lYml0ID09IDApCisJeworCSAgZXZhbCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgKnIpOworCSAgdmFsID0gYXBwbHlfcmFuZ2UgKHZhbCwgKnIpOworCX0KKyAgICAgIGVsc2UKKwljb250aW51ZTsKKyAgICAgIGlmICh2YWwgPT0gZXZhbCkKKwlyZXR1cm4gZTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsaXN0IG9mIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlLiAqLworCitzdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKioKK2dldF9lbnRyaWVzIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlKQoreworICByZXR1cm4gJmVudHJpZXNbcHJvY2Vzc29yXVt0eXBlXTsKK30KKworLyogUmV0dXJuIGFuIGludGVncmFsIHZhbHVlIGZvciB0aGUgcHJvY2Vzc29yIHBhc3NlZCBmcm9tIHl5cGFyc2UuICovCisKK3N0YXRpYyBlX3Byb2Nlc3NvciAKK2dldF9wcm9jZXNzb3IgKGludCB5eXByb2MpCit7CisgIC8qIHRyYW5zbGF0ZSBmcm9tIHlhY2MncyBwcm9jZXNzb3IgdG8gZW51bSAqLworICBpZiAoeXlwcm9jID49IGVfcDAgJiYgeXlwcm9jIDwgZV9ucHJvY3MpCisgICAgcmV0dXJuIChlX3Byb2Nlc3NvcikgeXlwcm9jOworICByZXR1cm4gZV9pbnZwcm9jOwkJLyogZXJyb3I7IGludmFsaWQgcHJvY2Vzc29yICovCit9CisKKy8qIFJldHVybiBhbiBpbnRlZ3JhbCB2YWx1ZSBmb3IgdGhlIGVudHJ5IHR5cGUgcGFzc2VkIGZyb20geXlwYXJzZS4gKi8KKworc3RhdGljIGVfdHlwZSAKK2dldF90eXBlIChpbnQgeXl0eXBlKQoreworICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisgICAgICAvKiB0cmFuc2xhdGUgZnJvbSB5YWNjJ3MgdHlwZSB0byBlbnVtICovCisgICAgY2FzZSBJTlNOOgorICAgICAgcmV0dXJuIGVfaW5zbjsKKyAgICBjYXNlIERSRUc6CisgICAgICByZXR1cm4gZV9kcmVnOworICAgIGNhc2UgQ1JFRzoKKyAgICAgIHJldHVybiBlX2NyZWc7CisgICAgY2FzZSBHUkVHOgorICAgICAgcmV0dXJuIGVfZ3JlZzsKKyAgICBjYXNlIEFERFI6CisgICAgICByZXR1cm4gZV9hZGRyOworICAgIGNhc2UgSU1NRUQ6CisgICAgICByZXR1cm4gZV9pbW1lZDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGVfaW52dHlwZTsJCS8qIGVycm9yOyBpbnZhbGlkIHR5cGUgKi8KKyAgICB9Cit9CisKKworLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZW50cnkgKi8KKworc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKK2FsbG9jX2VudHJ5IChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAorCSAgICAgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKyAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7CisgIGlmICghbmFtZSkKKyAgICByZXR1cm4gMDsKKyAgZSA9IChzdHJ1Y3QgaXRibF9lbnRyeSAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGl0YmxfZW50cnkpKTsKKyAgaWYgKGUpCisgICAgeworICAgICAgbWVtc2V0IChlLCAwLCBzaXplb2YgKHN0cnVjdCBpdGJsX2VudHJ5KSk7CisgICAgICBlLT5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKHN0cmxlbiAobmFtZSkpICsgMSk7CisgICAgICBpZiAoZS0+bmFtZSkKKwlzdHJjcHkgKGUtPm5hbWUsIG5hbWUpOworICAgICAgZS0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgICAgZS0+dHlwZSA9IHR5cGU7CisgICAgICBlLT52YWx1ZSA9IHZhbHVlOworICAgICAgZXMgPSBnZXRfZW50cmllcyAoZS0+cHJvY2Vzc29yLCBlLT50eXBlKTsKKyAgICAgIGUtPm5leHQgPSAqZXM7CisgICAgICAqZXMgPSBlOworICAgIH0KKyAgcmV0dXJuIGU7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGVudHJ5J3MgZmllbGQgKi8KKworc3RhdGljIHN0cnVjdCBpdGJsX2ZpZWxkICoKK2FsbG9jX2ZpZWxkIChlX3R5cGUgdHlwZSwgaW50IHNiaXQsIGludCBlYml0LAorCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKyAgc3RydWN0IGl0YmxfZmllbGQgKmY7CisgIGYgPSAoc3RydWN0IGl0YmxfZmllbGQgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBpdGJsX2ZpZWxkKSk7CisgIGlmIChmKQorICAgIHsKKyAgICAgIG1lbXNldCAoZiwgMCwgc2l6ZW9mIChzdHJ1Y3QgaXRibF9maWVsZCkpOworICAgICAgZi0+dHlwZSA9IHR5cGU7CisgICAgICBmLT5yYW5nZS5zYml0ID0gc2JpdDsKKyAgICAgIGYtPnJhbmdlLmViaXQgPSBlYml0OworICAgICAgZi0+ZmxhZ3MgPSBmbGFnczsKKyAgICB9CisgIHJldHVybiBmOworfQpkaWZmIC0tZ2l0IGEvZ2FzL2l0Ymwtb3BzLmggYi9nYXMvaXRibC1vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ2ZWZmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL2l0Ymwtb3BzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIGl0Ymwtb3BzLmgKKyAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEV4dGVybmFsIGZ1bmN0aW9ucywgY29uc3RhbnRzIGFuZCBkZWZpbmVzIGZvciBpdGJsIHN1cHBvcnQgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKy8qIEluY2x1ZGUgZmlsZSBub3RlczogImV4cHIuaCIgbmVlZGVkIGJlZm9yZSB0YXJnLSouaCwKKyAqICJ0YXJnLWVudi5oIiBpbmNsdWRlcyB0aGUgY2hhaW4gb2YgdGFyZ2V0IGRlcGVuZGFudCBoZWFkZXJzLAorICogInRhcmctY3B1LmgiIGhhcyB0aGUgSEFWRV9JVEJMX0NQVSBkZWZpbmUsIGFuZAorICogYXMuaCBpbmNsdWRlcyB0aGVtIGFsbCAqLworI2luY2x1ZGUgImFzLmgiCisKKyNpZmRlZiBIQVZFX0lUQkxfQ1BVCisjaW5jbHVkZSAiaXRibC1jcHUuaCIKKyNlbmRpZgorCisvKiBEZWZhdWx0cyBmb3IgZGVmaW5pdGlvbnMgcmVxdWlyZWQgYnkgZ2VuZXJpYyBjb2RlICovCisjaWZuZGVmIElUQkxfTlVNQkVSX09GX1BST0NFU1NPUlMKKyNkZWZpbmUgSVRCTF9OVU1CRVJfT0ZfUFJPQ0VTU09SUyAxCisjZW5kaWYKKworI2lmbmRlZiBJVEJMX01BWF9CSVRQT1MKKyNkZWZpbmUgSVRCTF9NQVhfQklUUE9TIDMxCisjZW5kaWYKKworI2lmbmRlZiBJVEJMX1RZUEUKKyNkZWZpbmUgSVRCTF9UWVBFIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIElUQkxfSVNfSU5TTgorI2RlZmluZSBJVEJMX0lTX0lOU04oaW5zbikgMQorI2VuZGlmCisKKyNpZm5kZWYgSVRCTF9ERUNPREVfUE5VTQorI2RlZmluZSBJVEJMX0RFQ09ERV9QTlVNKGluc24pIDAKKyNlbmRpZgorCisjaWZuZGVmIElUQkxfRU5DT0RFX1BOVU0KKyNkZWZpbmUgSVRCTF9FTkNPREVfUE5VTShwbnVtKSAwCisjZW5kaWYKKwordHlwZWRlZiBJVEJMX1RZUEUgdF9pbnNuOworCisvKiB0eXBlcyBvZiBlbnRyaWVzICovCit0eXBlZGVmIGVudW0KKyAgeworICAgIGVfaW5zbiwKKyAgICBlX2RyZWcsCisgICAgZV9yZWd0eXBlMCA9IGVfZHJlZywKKyAgICBlX2NyZWcsCisgICAgZV9ncmVnLAorICAgIGVfYWRkciwKKyAgICBlX25yZWd0eXBlcyA9IGVfZ3JlZyArIDEsCisgICAgZV9pbW1lZCwKKyAgICBlX250eXBlcywKKyAgICBlX2ludnR5cGUJCQkvKiBpbnZhbGlkIHR5cGUgKi8KKyAgfSBlX3R5cGU7CisKK3R5cGVkZWYgZW51bQorICB7CisgICAgZV9wMCwKKyAgICBlX25wcm9jcyA9IE5VTUJFUl9PRl9QUk9DRVNTT1JTLAorICAgIGVfaW52cHJvYwkJCS8qIGludmFsaWQgcHJvY2Vzc29yICovCisgIH0gZV9wcm9jZXNzb3I7CisKKy8qIDAgbWVhbnMgYW4gaW5zdHJ1Y3Rpb24gdGFibGUgd2FzIG5vdCBzcGVjaWZpZWQuICovCitleHRlcm4gaW50IGl0YmxfaGF2ZV9lbnRyaWVzOworCisvKiBUaGVzZSByb3V0aW5lcyBhcmUgdmlzaWJsZSB0byB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgKi8KKworaW50IGl0YmxfcGFyc2UgUEFSQU1TICgoY2hhciAqaW5zbnRibCkpOwordm9pZCBpdGJsX2luaXQgUEFSQU1TICgodm9pZCkpOworY2hhciAqaXRibF9nZXRfZmllbGQgUEFSQU1TICgoY2hhciAqKnMpKTsKK3Vuc2lnbmVkIGxvbmcgaXRibF9hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjaGFyICpvcGVyYW5kcykpOworaW50IGl0YmxfZGlzYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGluc24pKTsKK2ludCBpdGJsX3BhcnNlIFBBUkFNUyAoKGNoYXIgKnRibCkpOwkvKiBwYXJzZXMgaW5zbiB0YmwgKi8KK3Vuc2lnbmVkIGxvbmcgaXRibF9nZXRfcmVnX3ZhbCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Cit1bnNpZ25lZCBsb25nIGl0YmxfZ2V0X3ZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLAorCQkJCSAgICBjaGFyICpuYW1lKSk7CitjaGFyICppdGJsX2dldF9uYW1lIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKSk7CisKKy8qIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgYnkgdGhlIHRhYmxlIHBhcnNlciB1c2VkIHRvIGJ1aWxkIHRoZQorICAgZHluYW1pYyBsaXN0IG9mIG5ldyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMuICovCisKK3N0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9yZWcgUEFSQU1TICgoaW50IHl5cHJvYywgaW50IHl5dHlwZSwKKwkJCQkJIGNoYXIgKnJlZ25hbWUsIGludCByZWdudW0pKTsKK3N0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9pbnNuIFBBUkFNUyAoKGludCB5eXByb2MsIGNoYXIgKm5hbWUsCisJICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKK3N0cnVjdCBpdGJsX2ZpZWxkICppdGJsX2FkZF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBpdGJsX2VudHJ5ICogZSwgaW50IHl5dHlwZSwKKwkJCQkgIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwpkaWZmIC0tZ2l0IGEvZ2FzL2l0YmwtcGFyc2UueSBiL2dhcy9pdGJsLXBhcnNlLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2NmVlOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9pdGJsLXBhcnNlLnkKQEAgLTAsMCArMSw0NTkgQEAKKy8qIGl0YmwtcGFyc2UueQorICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworJXsKKworLyogCisKK1lhY2MgZ3JhbW1hciBmb3IgaW5zdHJ1Y3Rpb24gdGFibGUgZW50cmllcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK09yaWdpbmFsIEluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gZG9jdW1lbnQ6CisKKwkgICAgTUlQUyBDb3Byb2Nlc3NvciBUYWJsZSBTcGVjaWZpY2F0aW9uCisJICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBNSVBTIGNvcHJvY2Vzc29yIHRhYmxlLiAgVGhlCit0YWJsZSBzcGVjaWZpZXMgYSBsaXN0IG9mIHZhbGlkIGZ1bmN0aW9ucywgZGF0YSByZWdpc3RlcnMgYW5kIGNvbnRyb2wKK3JlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIGluIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4gIFRoaXMgbGlzdCwKK3RvZ2V0aGVyIHdpdGggdGhlIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNsYXNzZXMgbGlzdGVkIGJlbG93LAorc3BlY2lmaWVzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB0aGF0IHdpbGwKK2JlIHJlY29nbml6ZWQgYW5kIGFzc2VtYmxlZCBieSB0aGUgR05VIGFzc2VtYmxlci4gIEluIGVmZmVjdCwKK3RoaXMgbWFrZXMgdGhlIEdOVSBhc3NlbWJsZXIgdGFibGUtZHJpdmVuLCB3aGVyZSB0aGUgdGFibGUgaXMKK3NwZWNpZmllZCBieSB0aGUgcHJvZ3JhbW1lci4KKworVGhlIHRhYmxlIGlzIGFuIG9yZGluYXJ5IHRleHQgZmlsZSB0aGF0IHRoZSBHTlUgYXNzZW1ibGVyIHJlYWRzIHdoZW4KK2l0IHN0YXJ0cy4gIFVzaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGFibGUsIHRoZSBhc3NlbWJsZXIKK2dlbmVyYXRlcyBhbiBpbnRlcm5hbCBsaXN0IG9mIHZhbGlkIGNvcHJvY2Vzc29yIHJlZ2lzdGVycyBhbmQKK2Z1bmN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgdXNlcyB0aGlzIGludGVybmFsIGxpc3QgaW4gYWRkaXRpb24gdG8gdGhlCitzdGFuZGFyZCBNSVBTIHJlZ2lzdGVycyBhbmQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSBidWlsdC1pbiB0byB0aGUgCithc3NlbWJsZXIgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KKworVG8gc3BlY2lmeSB0aGUgY29wcm9jZXNzb3IgdGFibGUgd2hlbiBpbnZva2luZyB0aGUgR05VIGFzc2VtYmxlciwgdXNlCit0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLS1pdGJsIGZpbGUiLCB3aGVyZSBmaWxlIGlzIHRoZQorY29tcGxldGUgbmFtZSBvZiB0aGUgdGFibGUsIGluY2x1ZGluZyBwYXRoIGFuZCBleHRlbnNpb24uCisKK0V4YW1wbGVzOgorCisJICAgIGdhcyAtdCBjb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KKwkgICAgZ2FzIC10IC91c3IvbG9jYWwvbGliL2NvcC50YmwgdGVzdC5zIC1vIHRlc3QubworCSAgICBnYXMgLS1pdGJsIGQ6XGdudVxkYXRhXGNvcC50YmwgdGVzdC5zIC1vIHRlc3QubworCitPbmx5IG9uZSB0YWJsZSBtYXkgYmUgc3VwcGxpZWQgZHVyaW5nIGEgc2luZ2xlIGludm9jYXRpb24gb2YKK3RoZSBhc3NlbWJsZXIuCisKKworSW5zdHJ1Y3Rpb24gY2xhc3NlcworPT09PT09PT09PT09PT09PT09PQorCitCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHZhbGlkIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIGNsYXNzZXMgZm9yCithbnkgZ2l2ZW4gY29wcm9jZXNzb3IgInoiLiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBhbHJlYWR5IHJlY29nbml6ZWQKK2J5IHRoZSBhc3NlbWJsZXIsIGFuZCBhcmUgbGlzdGVkIGhlcmUgb25seSBmb3IgcmVmZXJlbmNlLgorCitDbGFzcyAgIGZvcm1hdAkgICAgCSAgICAJICAgICAgaW5zdHJ1Y3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDbGFzczE6CisJb3AgYmFzZSBydCBvZmZzZXQKKwkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTFdDeiBydCxvZmZzZXQgKGJhc2UpCisJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIFNXQ3ogcnQsb2Zmc2V0IChiYXNlKQorQ2xhc3MyOgorCUNPUHogc3ViIHJ0IHJkIDAKKwkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTVRDeiBydCxyZAorCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBNRkN6IHJ0LHJkCisJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENUQ3ogcnQscmQKKwkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQ0ZDeiBydCxyZAorQ2xhc3MzOgorCUNPUHogQ08gY29mdW4KKwkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQ09QeiBjb2Z1bgorQ2xhc3M0OgorCUNPUHogQkMgYnIgb2Zmc2V0CisJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDelQgb2Zmc2V0CisJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDekYgb2Zmc2V0CitDbGFzczU6CisJQ09QeiBzdWIgcnQgcmQgMAorCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBETUZDeiBydCxyZAorCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBETVRDeiBydCxyZAorQ2xhc3M2OgorCW9wIGJhc2UgcnQgb2Zmc2V0CisJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIExEQ3ogcnQsb2Zmc2V0IChiYXNlKQorCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBTREN6IHJ0LG9mZnNldCAoYmFzZSkKK0NsYXNzNzoKKwlDT1B6IEJDIGJyIG9mZnNldAorCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pUTCBvZmZzZXQKKwkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6Rkwgb2Zmc2V0CisKK1RoZSBjb3Byb2Nlc3NvciB0YWJsZSBkZWZpbmVzIGNvcHJvY2Vzc29yLXNwZWNpZmljIHJlZ2lzdGVycyB0aGF0IGNhbgorYmUgdXNlZCB3aXRoIGFsbCBvZiB0aGUgYWJvdmUgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMsIHdoZXJlCithcHByb3ByaWF0ZS4gIEl0IGFsc28gZGVmaW5lcyBhZGRpdGlvbmFsIGNvcHJvY2Vzc29yLXNwZWNpZmljCitmdW5jdGlvbnMgZm9yIENsYXNzMyAoQ09QeiBjb2Z1bikgaW5zdHJ1Y3Rpb25zLCBUaHVzLCB0aGUgdGFibGUgYWxsb3dzCit0aGUgcHJvZ3JhbW1lciB0byB1c2UgY29udmVuaWVudCBtbmVtb25pY3MgYW5kIG9wZXJhbmRzIGZvciB0aGVzZQorZnVuY3Rpb25zLCBpbnN0ZWFkIG9mIHRoZSBDT1B6IG1tZW5tb25pYyBhbmQgY29mdW4gb3BlcmFuZC4KKworVGhlIG5hbWVzIG9mIHRoZSBNSVBTIGdlbmVyYWwgcmVnaXN0ZXJzIGFuZCB0aGVpciBhbGlhc2VzIGFyZSBkZWZpbmVkCitieSB0aGUgYXNzZW1ibGVyIGFuZCB3aWxsIGJlIHJlY29nbml6ZWQgYXMgdmFsaWQgcmVnaXN0ZXIgbmFtZXMgYnkgdGhlCithc3NlbWJsZXIgd2hlbiB1c2VkICh3aGVyZSBhbGxvd2VkKSBpbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuCitIb3dldmVyLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiBhbGwgY29wcm9jZXNzb3IgZGF0YSBhbmQgY29udHJvbAorcmVnaXN0ZXIgbW5lbW9uaWNzIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBjb3Byb2Nlc3NvciB0YWJsZS4KKworCitUYWJsZSBHcmFtbWFyCis9PT09PT09PT09PT09CisKK0hlcmUgaXMgdGhlIGdyYW1tYXIgZm9yIHRoZSBjb3Byb2Nlc3NvciB0YWJsZToKKworCSAgICB0YWJsZSAtPiBlbnRyeSoKKworCSAgICBlbnRyeSAtPiBbeiBlbnRyeWRlZl0gW2NvbW1lbnRdICdcbicKKworCSAgICBlbnRyeWRlZiAtPiB0eXBlIG5hbWUgdmFsCisJICAgIGVudHJ5ZGVmIC0+ICdpbnNuJyBuYW1lIHZhbCBmdW5jZGVmIDsgdHlwZSBvZiBlbnRyeSAoaW5zdHJ1Y3Rpb24pCisKKwkgICAgeiAtPiAncCdbJzAnLi4nMyddCSAgICAJICAgICA7IHByb2Nlc3NvciBudW1iZXIgCisJICAgIHR5cGUgLT4gWydkcmVnJyB8ICdjcmVnJyB8ICdncmVnJyBdCSAgICAgOyB0eXBlIG9mIGVudHJ5IChyZWdpc3RlcikKKwk7ICdkcmVnJywgJ2NyZWcnIG9yICdncmVnJyBzcGVjaWZpZXMgYSBkYXRhLCBjb250cm9sLCBvciBnZW5lcmFsCisJOwkgICAgcmVnaXN0ZXIgbW5lbW9uaWMsIHJlc3BlY3RpdmVseQorCSAgICBuYW1lIC0+IFtsdHJ8ZGVjXSoJICAgIAkgICAgIDsgbW5lbW9uaWMgb2YgcmVnaXN0ZXIvZnVuY3Rpb24KKwkgICAgdmFsIC0+IFtkZWN8aGV4XQkgICAgCSAgICAgOyByZWdpc3Rlci9mdW5jdGlvbiBudW1iZXIgKGludGVnZXIgY29uc3RhbnQpCisKKwkgICAgZnVuY2RlZiAtPiBmcmFuZ2UgZmxhZ3MgZmllbGRzCisJICAgIAkgICAgCSAgICAJOyBiaXRmaWVsZCByYW5nZSBmb3Igb3Bjb2RlCisJICAgIAkgICAgCSAgICAJOyBsaXN0IG9mIGZpZWxkcycgZm9ybWF0cworCSAgICBmaWVsZHMgLT4gZmllbGQqCisJICAgIGZpZWxkIC0+IFsnLCddIGZ0eXBlIGZyYW5nZSBmbGFncworCSAgICBmbGFncyAtPiBbJyonIGZsYWdleHByXQorCSAgICBmbGFnZXhwciAtPiAnWycgZmxhZ2V4cHIgJ10nCisJICAgIGZsYWdleHByIC0+IHZhbCAnfCcgZmxhZ2V4cHIgCisJICAgIGZ0eXBlIC0+IFsgdHlwZSB8ICdpbW1lZCcgfCAnYWRkcicgXQorCTsgJ2ltbWVkJyBzcGVjaWZpZXMgYW4gaW1tZWRpYXRlIHZhbHVlOyBzZWUgZ3JhbW1hciBmb3IgInZhbCIgYWJvdmUKKwkgICAgCTsgJ2FkZHInIHNwZWNpZmllcyBhIEMgaWRlbnRpZmllcjsgbmFtZSBvZiBzeW1ib2wgdG8gYmUgcmVzb2x2ZWQgYXQgCisJOwkgICAgbGluayB0aW1lCisJICAgIGZyYW5nZSAtPiAnOicgdmFsICctJyB2YWwJOyBzdGFydGluZyB0byBlbmRpbmcgYml0IHBvc2l0aW9ucywgd2hlcmUKKwkgICAgCSAgICAJICAgIAk7IHdoZXJlIDAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQgYml0CisJICAgIGZyYW5nZSAtPiAobnVsbCkJICAgIAk7IGRlZmF1bHQgcmFuZ2Ugb2YgMzEtMCB3aWxsIGJlIGFzc3VtZWQKKworCSAgICBjb21tZW50IC0+IFsnOyd8JyMnXSBbY2hhcl0qCisJICAgIGNoYXIgLT4gYW55IHByaW50YWJsZSBjaGFyYWN0ZXIKKwkgICAgbHRyIC0+IFsnYScuLid6J3wnQScuLidaJ10gCisJICAgIGRlYyAtPiBbJzAnLi4nOSddKgkgICAgCSAgICAJICAgIAkgICAgCSAgICAgOyB2YWx1ZSBpbiBkZWNpbWFsCisJICAgIGhleCAtPiAnMHgnWycwJy4uJzknIHwgJ2EnLi4nZicgfCAnQScuLidGJ10qCTsgdmFsdWUgaW4gaGV4aWRlY2ltYWwgCisKKworRXhhbXBsZXMKKz09PT09PT09CisKK0V4YW1wbGUgMToKKworVGhlIHRhYmxlOgorCisJICAgIHAxIGRyZWcgZDEgMQkgICAgIDsgZGF0YSByZWdpc3RlciAiZDEiIGZvciBDT1AxIGhhcyB2YWx1ZSAxCisJICAgIHAxIGNyZWcgYzMgMwkgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCisJICAgIHAzIGZ1bmMgZmlsbCAweDFmOjI0LTIwCSAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMSBhbmQgCisJICAgIAkgICAgCTsgbm8gZmllbGRzCisKK3dpbGwgYWxsb3cgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQgdGhlIGZvbGxvd2luZyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnM6CisKKwkgICAgTFdDMSBkMSwweDEwMCAoJDIpCisJICAgIGZpbGwKKworSGVyZSwgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAiJDIiLCBhbmQgaW5zdHJ1Y3Rpb24gIkxXQzEiLCBhcmUgc3RhbmRhcmQgCittbmVtb25pY3MgYnVpbHQtaW4gdG8gdGhlIE1JUFMgYXNzZW1ibGVyLiAgCisKKworRXhhbXBsZSAyOgorCitUaGUgdGFibGU6CisKKwkgICAgcDMgZHJlZyBkMyAzCSAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKKwkgICAgcDMgY3JlZyBjMiAyMgkgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgorCSAgICBwMyBmdW5jIGZlZSAweDFmOjI0LTIwIGRyZWc6MTctMTMgY3JlZzoxMi04IGltbWVkOjctMCAKKwkgICAgCTsgZnVuY3Rpb24gImZlZSIgZm9yIENPUDMgaGFzIHZhbHVlIDMxLCBhbmQgMyBmaWVsZHMgCisJICAgIAk7IGNvbnNpc3Rpbmcgb2YgYSBkYXRhIHJlZ2lzdGVyLCBhIGNvbnRyb2wgcmVnaXN0ZXIsIAorCSAgICAJOyBhbmQgYW4gaW1tZWRpYXRlIHZhbHVlLgorCit3aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb246CisKKwkgICAgZmVlIGQzLGMyLDB4MQorCithbmQgd2lsbCBlbWl0IHRoZSBvYmplY3QgY29kZToKKworCSAgICAzMS0yNiAgMjUgMjQtMjAgMTktMTggIDE3LTEzIDEyLTggIDctMAorCSAgICBDT1B6ICAgQ08gZnVuCSAgICAJICAgICAgZHJlZyAgY3JlZyAgaW1tZWQKKwkgICAgMDEwMDExIDEgIDExMTExIDAwCSAgICAgMDAwMTEgMTAxMTAgMDAwMDAwMDEgCisKKwkgICAgMHg0ZmYwNzYwMQorCisKK0V4YW1wbGUgMzoKKworVGhlIHRhYmxlOgorCisJICAgIHAzIGRyZWcgZDMgMwkgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCisJICAgIHAzIGNyZWcgYzIgMjIJICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKKwkgICAgcDMgZnVuYyBmdXUgMHgwMWYwMDAwMSBkcmVnOjE3LTEzIGNyZWc6MTItOAorCit3aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IKK2luc3RydWN0aW9uOgorCisJICAgIGZ1dSBkMyxjMgorCithbmQgd2lsbCBlbWl0IHRoZSBvYmplY3QgY29kZToKKworCSAgICAzMS0yNiAgMjUgMjQtMjAgMTktMTggIDE3LTEzIDEyLTggIDctMAorCSAgICBDT1B6ICAgQ08gZnVuCSAgICAJICAgICAgZHJlZyAgY3JlZyAgCisJICAgIDAxMDAxMSAxICAxMTExMSAwMAkgICAgIDAwMDExIDEwMTEwIDAwMDAwMDAxIAorCisJICAgIDB4NGZmMDc2MDEKKworSW4gdGhpcyB3YXksIHRoZSBwcm9ncmFtbWVyIGNhbiBmb3JjZSBhcmJpdHJhcnkgYml0cyBvZiBhbiBpbnN0cnVjdGlvbgordG8gaGF2ZSBwcmVkZWZpbmVkIHZhbHVlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FkZGl0aW9uYWwgbm90ZXM6CisKK0VuY29kaW5nIG9mIHJhbmdlczoKK1RvIGhhbmRsZSBtb3JlIHRoYW4gb25lIGJpdCBwb3NpdGlvbiByYW5nZSB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24sCit1c2UgMHMgdG8gbWFzayBvdXQgdGhlIHJhbmdlcyB3aGljaCBkb24ndCBhcHBseS4KK01heSBkZWNpZGUgdG8gbW9kaWZ5IHRoZSBzeW50YXggdG8gYWxsb3cgY29tbWFzIHNlcGFyYXRlIG11bHRpcGxlIAorcmFuZ2VzIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiAocmFuZ2UnLCdyYW5nZSkuCisKK0NoYW5nZXMgaW4gZ3JhbW1hcjoKKwlUaGUgbnVtYmVyIG9mIHBhcm1zIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbiBlbnRyeQord2FzIGRlbGV0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZm9ybWF0IHN1Y2ggdGhhdCB3ZSBub3cgY291bnQgdGhlIGZpZWxkcy4KKworLS0tLQorRklYTUUhIHNob3VsZCByZWFsbHkgY2hhbmdlIGxleGljYWwgYW5hbHl6ZXIgCit0byByZWNvZ25pemUgJ2RyZWcnIGV0Yy4gaW4gY29udGV4dCBzZW5zYXRpdmUgd2F5LgorQ3VycmVudGx5IGZ1bmN0aW9uIG5hbWVzIG9yIG1uZW1vbmljcyBtYXkgYmUgaW5jb3JyZWN0bHkgcGFyc2VkIGFzIGtleXdvcmRzCisKK0ZJWE1FISBoZXggaXMgYW1iaWd1b3VzIHdpdGggYW55IGRpZ2l0CisKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIml0Ymwtb3BzLmgiCisKKy8qICNkZWZpbmUgREVCVUcgKi8KKworI2lmZGVmIERFQlVHCisjaWZuZGVmIERCR19MVkwKKyNkZWZpbmUgREJHX0xWTCAxCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIERCR19MVkwgMAorI2VuZGlmCisKKyNpZiBEQkdfTFZMID49IDEKKyNkZWZpbmUgREJHKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBEQkcoeCkgCisjZW5kaWYKKworI2lmIERCR19MVkwgPj0gMgorI2RlZmluZSBEQkdMMih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgREJHTDIoeCkgCisjZW5kaWYKKworc3RhdGljIGludCBzYml0LCBlYml0Oworc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICppbnNuPTA7CitleHRlcm4gaW50IGluc250YmxfbGluZTsKK2ludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK2ludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IHl5ZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKyV9CisKKyV1bmlvbiAKKyAgeworICAgIGNoYXIgKnN0cjsKKyAgICBpbnQgbnVtOworICAgIGludCBwcm9jZXNzb3I7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgIH0KKworJXRva2VuCSAgICBEUkVHIENSRUcgR1JFRyBJTU1FRCBBRERSIElOU04gTlVNIElEIE5MIFBOVU0KKyV0eXBlCSAgICA8dmFsPiB2YWx1ZSBmbGFncyBmbGFnZXhwcgorJXR5cGUJICAgIDxudW0+IG51bWJlciBOVU0gZnR5cGUgcmVndHlwZSBwbnVtIFBOVU0KKyV0eXBlCSAgICA8c3RyPiBJRCBuYW1lCisKKyVzdGFydCBpbnNudGJsCisKKyUlCisKK2luc250Ymw6CisJZW50cnlzCisJOworCitlbnRyeXM6CisJZW50cnkgZW50cnlzCisJfAorCTsKKworZW50cnk6CisJcG51bSByZWd0eXBlIG5hbWUgdmFsdWUgTkwKKwkgIHsKKwkgICAgREJHICgoImxpbmUgJWQ6IGVudHJ5IHBudW09JWQgdHlwZT0lZCBuYW1lPSVzIHZhbHVlPXgleFxuIiwgCisJICAgIAkgICAgaW5zbnRibF9saW5lLCAkMSwgJDIsICQzLCAkNCkpOworCSAgICBpdGJsX2FkZF9yZWcgKCQxLCAkMiwgJDMsICQ0KTsKKwkgIH0KKwl8IHBudW0gSU5TTiBuYW1lIHZhbHVlIHJhbmdlIGZsYWdzCisJICB7CisJICAgIERCRyAoKCJsaW5lICVkOiBlbnRyeSBwbnVtPSVkIHR5cGU9SU5TTiBuYW1lPSVzIHZhbHVlPXgleCIsCisJICAgIAkgICAgaW5zbnRibF9saW5lLCAkMSwgJDMsICQ0KSk7CisJICAgIERCRyAoKCIgc2JpdD0lZCBlYml0PSVkIGZsYWdzPTB4JXhcbiIsIHNiaXQsIGViaXQsICQ2KSk7CisJICAgIGluc249aXRibF9hZGRfaW5zbiAoJDEsICQzLCAkNCwgc2JpdCwgZWJpdCwgJDYpOworCSAgfQorCWZpZWxkc3BlY3MgTkwKKwl8IE5MCisJfCBlcnJvciBOTAorCTsKKworZmllbGRzcGVjczoKKwknLCcgZmllbGRzcGVjIGZpZWxkc3BlY3MKKwl8IGZpZWxkc3BlYyBmaWVsZHNwZWNzCisJfAorCTsKKworZnR5cGU6CisJcmVndHlwZSAKKwkgIHsKKwkgICAgREJHTDIgKCgiZnR5cGVcbiIpKTsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwl8IEFERFIgCisJICB7CisJICAgIERCR0wyICgoImFkZHJcbiIpKTsKKwkgICAgJCQgPSBBRERSOworCSAgfQorCXwgSU1NRUQKKwkgIHsKKwkgICAgREJHTDIgKCgiaW1tZWRcbiIpKTsKKwkgICAgJCQgPSBJTU1FRDsKKwkgIH0KKwk7CisKK2ZpZWxkc3BlYzoKKwlmdHlwZSByYW5nZSBmbGFncworCSAgeworCSAgICBEQkcgKCgibGluZSAlZDogZmllbGQgdHlwZT0lZCBzYml0PSVkIGViaXQ9JWQsIGZsYWdzPTB4JXhcbiIsIAorCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsIHNiaXQsIGViaXQsICQzKSk7CisJICAgIGl0YmxfYWRkX29wZXJhbmQgKGluc24sICQxLCBzYml0LCBlYml0LCAkMyk7CisJICB9CisJOworCitmbGFnZXhwcjoKKwlOVU0gJ3wnIGZsYWdleHByCisJICB7CisJICAgICQkID0gJDEgfCAkMzsKKwkgIH0KKwl8ICdbJyBmbGFnZXhwciAnXScKKwkgIHsKKwkgICAgJCQgPSAkMjsKKwkgIH0KKwl8IE5VTQorCSAgeworCSAgICAkJCA9ICQxOworCSAgfQorCTsKKworZmxhZ3M6CisJJyonIGZsYWdleHByCisJICB7CisJICAgIERCR0wyICgoImZsYWdzPSVkXG4iLCAkMikpOworCSAgICAkJCA9ICQyOworCSAgfQorCXwgCisJICB7CisJICAgICQkID0gMDsKKwkgIH0KKwk7CisKK3JhbmdlOgorCSc6JyBOVU0gJy0nIE5VTQorCSAgeworCSAgICBEQkdMMiAoKCJyYW5nZSAlZCAlZFxuIiwgJDIsICQ0KSk7CisJICAgIHNiaXQgPSAkMjsKKwkgICAgZWJpdCA9ICQ0OworCSAgfQorCXwKKwkgIHsKKwkgICAgc2JpdCA9IDMxOworCSAgICBlYml0ID0gMDsKKwkgIH0KKwk7CisJICAgIAorcG51bToKKwlQTlVNCisJICB7CisJICAgIERCR0wyICgoInBudW09JWRcbiIsJDEpKTsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwk7CisKK3JlZ3R5cGU6CisJICAgICBEUkVHCisJICB7CisJICAgIERCR0wyICgoImRyZWdcbiIpKTsKKwkgICAgJCQgPSBEUkVHOworCSAgfQorCXwgQ1JFRworCSAgeworCSAgICBEQkdMMiAoKCJjcmVnXG4iKSk7CisJICAgICQkID0gQ1JFRzsKKwkgIH0KKwl8IEdSRUcKKwkgIHsKKwkgICAgREJHTDIgKCgiZ3JlZ1xuIikpOworCSAgICAkJCA9IEdSRUc7CisJICB9CisJOworCituYW1lOgorCUlECisJICB7CisJICAgIERCR0wyICgoIm5hbWU9JXNcbiIsJDEpKTsKKwkgICAgJCQgPSAkMTsgCisJICB9CisJOworCitudW1iZXI6CisJTlVNCisJICB7CisJICAgIERCR0wyICgoIm51bT0lZFxuIiwkMSkpOworCSAgICAkJCA9ICQxOworCSAgfQorCTsKKwordmFsdWU6CisJTlVNCisJICB7CisJICAgIERCR0wyICgoInZhbD14JXhcbiIsJDEpKTsKKwkgICAgJCQgPSAkMTsKKwkgIH0KKwk7CislJQorCitzdGF0aWMgaW50Cit5eWVycm9yIChtc2cpCisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgcHJpbnRmICgibGluZSAlZDogJXNcbiIsIGluc250YmxfbGluZSwgbXNnKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nYXMvbGluay5jbWQgYi9nYXMvbGluay5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzNWNhOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9saW5rLmNtZApAQCAtMCwwICsxLDEwIEBACitBTElHTj0xMDI0CitSRVNOVU0gMHgwMDAwLCAweDgwMDAKKzsgUHV0dGluZyBpbiAubGl0MSBnaXZlcyBlcnJvcnMuCitPUkRFUiAuZGF0YT0weDgwMDAyMDAwLCAuZGF0YTEsIC5saXQsIC5ic3MKKzsgTGV0J3MgcHV0IHRoaXMgb24gdGhlIGNvbW1hbmQgbGluZSBzbyBpdCBnb2VzIGZpcnN0LCB3aGljaCBpcyB3aGF0Cis7IEdEQiBleHBlY3RzLgorOyBMT0FEIC9zMi9hbWQvMjlrL2xpYi9jcnQwLm8KK0xPQUQgL3MyL2FtZC8yOWsvbGliL2xpYnFjYjBoLmxpYgorTE9BRCAvczIvYW1kLzI5ay9saWIvbGlic2NiMGgubGliCitMT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJhY2IwaC5saWIKZGlmZiAtLWdpdCBhL2dhcy9saXN0aW5nLmMgYi9nYXMvbGlzdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjE3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvbGlzdGluZy5jCkBAIC0wLDAgKzEsMTQyMCBAQAorLyogbGlzdGluZy5jIC0gbWFpbnRpbmcgYXNzZW1ibHkgbGlzdGluZ3MKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCitHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICovCisKKy8qCisgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAJCXNhY0BjeWdudXMuY29tCisKKworIEEgbGlzdGluZyBwYWdlIGxvb2tzIGxpa2U6CisKKyBMSVNUSU5HX0hFQURFUiAgc291cmNlZmlsZW5hbWUgcGFnZW51bWJlcgorIFRJVExFIExJTkUKKyBTVUJUSVRMRSBMSU5FCisgbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQorIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKKyBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCisgbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQorCisgSWYgbm90IG92ZXJyaWRkZW4sIHRoZSBsaXN0aW5nIGNvbW1hbmRzIGFyZToKKworIC50aXRsZSAgInN0dWZmIgorIAlQdXQgInN0dWZmIiBvbnRvIHRoZSB0aXRsZSBsaW5lCisgLnNidHRsICAic3R1ZmYiCisgICAgICAgIFB1dCBzdHVmZiBvbnRvIHRoZSBzdWJ0aXRsZSBsaW5lCisKKyAgSWYgdGhlc2UgY29tbWFuZHMgY29tZSB3aXRoaW4gMTAgbGluZXMgb2YgdGhlIHRvcCBvZiB0aGUgcGFnZSwgdGhleQorICB3aWxsIGFmZmVjdCB0aGUgcGFnZSB0aGV5IGFyZSBvbiwgYXMgd2VsbCBhcyBhbnkgc3Vic2VxdWVudCBwYWdlCisKKyAuZWplY3QKKyAJVGhvdyBhIHBhZ2UKKyAubGlzdAorIAlJbmNyZW1lbnQgdGhlIGVuYWJsZSBsaXN0aW5nIGNvdW50ZXIKKyAubm9saXN0CisgCURlY3JlbWVudCB0aGUgZW5hYmxlIGxpc3RpbmcgY291bnRlcgorCisgLnBzaXplIFlbLFhdCisgCVNldCB0aGUgcGFwZXIgc2l6ZSB0byBYIHdpZGUgYW5kIFkgaGlnaC4gU2V0dGluZyBhIHBzaXplIFkgb2YKKwl6ZXJvIHdpbGwgc3VwcHJlc3MgZm9ybSBmZWVkcyBleGNlcHQgd2hlcmUgZGVtYW5kZWQgYnkgLmVqZWN0CisKKyBJZiB0aGUgY291bnRlciBnb2VzIGJlbG93IHplcm8sIGxpc3RpbmcgaXMgc3VwcHJlc3NlZC4KKworCisgTGlzdGluZ3MgYXJlIGEgbWFpbnRhaW5lZCBieSByZWFkIGNhbGxpbmcgdmFyaW91cyBsaXN0aW5nXzxmb28+CisgZnVuY3Rpb25zLiAgV2hhdCBoYXBwZW5zIG1vc3QgaXMgdGhhdCB0aGUgbWFjcm8gTk9fTElTVElORyBpcyBub3QKKyBkZWZpbmVkIChmcm9tIHRoZSBNYWtlZmlsZSksIHRoZW4gdGhlIG1hY3JvIExJU1RJTkdfTkVXTElORSBleHBhbmRzCisgaW50byBhIGNhbGwgdG8gbGlzdGluZ19uZXdsaW5lLiAgVGhlIGNhbGwgaXMgZG9uZSBmcm9tIHJlYWQuYywgZXZlcnkKKyB0aW1lIGl0IHNlZXMgYSBuZXdsaW5lLCBhbmQgLWwgaXMgb24gdGhlIGNvbW1hbmQgbGluZS4KKworIFRoZSBmdW5jdGlvbiBsaXN0aW5nX25ld2xpbmUgcmVtZW1iZXJzIHRoZSBmcmFnIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyBuZXdsaW5lLCBhbmQgY3JlYXRlcyBhIG5ldyBmcmFnIC0gbm90ZSB0aGF0IHRoaXMgaXMgd2FzdGVmdWwsIGJ1dCBub3QKKyBhIGJpZyBkZWFsLCBzaW5jZSBsaXN0aW5nIHNsb3dzIHRoaW5ncyBkb3duIGEgbG90IGFueXdheS4gIFRoZQorIGZ1bmN0aW9uIGFsc28gcmVtZW1lYmVycyB3aGVuIHRoZSBmaWxlbmFtZSBjaGFuZ2VzLgorCisgV2hlbiBhbGwgdGhlIGlucHV0IGhhcyBmaW5pc2hlZCwgYW5kIGdhcyBoYXMgaGFkIGEgY2hhbmNlIHRvIHNldHRsZQorIGRvd24sIHRoZSBsaXN0aW5nIGlzIG91dHB1dC4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgZG93biB0aGUgbGlzdCBvZgorIGZyYWcvc291cmNlIGZpbGUgcmVjb3JkcywgYW5kIG9wZW5pbmcgdGhlIGZpbGVzIGFzIG5lZWRlZCBhbmQgcHJpbnRpbmcKKyBvdXQgdGhlIGJ5dGVzIGFuZCBjaGFycyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKworIFRoZSBvbmx5IHRoaW5ncyB3aGljaCB0aGUgYXJjaGl0ZWN0dXJlIGNhbiBjaGFuZ2UgYWJvdXQgdGhlIGxpc3RpbmcKKyBhcmUgZGVmaW5lZCBpbiB0aGVzZSBtYWNyb3M6CisKKyBMSVNUSU5HX0hFQURFUgkJVGhlIG5hbWUgb2YgdGhlIGFyY2hpdGVjdHVyZQorIExJU1RJTkdfV09SRF9TSVpFICAgICAgVGhlIG1ha2Ugb2YgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHdvcmQsIHRoaXMgZGV0ZXJtaW5lcworIAkJCXRoZSBjbHVtcGluZyBvZiB0aGUgb3V0cHV0IGRhdGEuIGVnIGEgdmFsdWUgb2YKKwkJCTIgbWFrZXMgd29yZHMgbG9vayBsaWtlIDEyMzQgNTY3OCwgd2hpbHN0IDEKKwkJCXdvdWxkIG1ha2UgdGhlIHNhbWUgdmFsdWUgbG9vayBsaWtlIDEyIDM0IDU2CisJCQk3OAorIExJU1RJTkdfTEhTX1dJRFRIICAgICAgTnVtYmVyIG9mIHdvcmRzIG9mIGFib3ZlIHNpemUgZm9yIHRoZSBsaHMKKworIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAgIE51bWJlciBvZiB3b3JkcyBmb3IgdGhlIGRhdGEgb24gdGhlIGxocworIAkJCWZvciB0aGUgc2Vjb25kIGxpbmUKKworIExJU1RJTkdfTEhTX0NPTlRfTElORVMJTWF4IG51bWJlciBvZiBsaW5lcyB0byB1c2UgdXAgZm9yIGEgY29udGludXRhdGlvbgorIExJU1RJTkdfUkhTX1dJRFRIICAgICAgTnVtYmVyIG9mIGNoYXJzIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gcHJpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgbGluZQorKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJhcy5oIgorI2luY2x1ZGUgPG9ic3RhY2suaD4KKyNpbmNsdWRlICJpbnB1dC1maWxlLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorCisjaWZuZGVmIE5PX0xJU1RJTkcKKworI2lmbmRlZiBMSVNUSU5HX0hFQURFUgorI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiR0FTIExJU1RJTkciCisjZW5kaWYKKyNpZm5kZWYgTElTVElOR19XT1JEX1NJWkUKKyNkZWZpbmUgTElTVElOR19XT1JEX1NJWkUgNAorI2VuZGlmCisjaWZuZGVmIExJU1RJTkdfTEhTX1dJRFRICisjZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDEKKyNlbmRpZgorI2lmbmRlZiBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQKKyNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDEKKyNlbmRpZgorI2lmbmRlZiBMSVNUSU5HX1JIU19XSURUSAorI2RlZmluZSBMSVNUSU5HX1JIU19XSURUSCAxMDAKKyNlbmRpZgorI2lmbmRlZiBMSVNUSU5HX0xIU19DT05UX0xJTkVTCisjZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNAorI2VuZGlmCisKKy8qIFRoaXMgc3RydWN0dXJlIHJlbWVtYmVycyB3aGljaCAucyB3ZXJlIHVzZWQgKi8KK3R5cGVkZWYgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QKK3sKKyAgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QgKiBuZXh0OworICBjaGFyICogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOworICBsb25nICAgICAgICAgICAgICAgICAgICAgIHBvczsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsaW5lbnVtOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGF0X2VuZDsKK30KK2ZpbGVfaW5mb190eXBlOworCisvKiBUaGlzIHN0cnVjdHVyZSByZW1lbWVicnMgd2hpY2ggbGluZSBmcm9tIHdoaWNoIGZpbGUgZ29lcyBpbnRvIHdoaWNoCisgICBmcmFnICovCitzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdAoreworICAvKiBGcmFnIHdoaWNoIHRoaXMgbGluZSBvZiBzb3VyY2UgaXMgbmVhcmVzdCB0byAqLworICBmcmFnUyAqIGZyYWc7CisKKyAgLyogVGhlIGFjdHVhbCBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSAqLworICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGZpbGUgd2hpY2ggdGhpcyBsaW5lCisgICAgIGJlbG9uZ3MgdG8gKi8KKyAgZmlsZV9pbmZvX3R5cGUgKiBmaWxlOworCisgIC8qIFRoZSBleHBhbmRlZCB0ZXh0IG9mIGFueSBtYWNybyB0aGF0IG1heSBoYXZlIGJlZW4gZXhlY3V0aW5nLiAgKi8KKyAgY2hhciAqIGxpbmVfY29udGVudHM7CisKKyAgLyogTmV4dCBpbiBsaXN0ICovCisgIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbmV4dDsKKworICAvKiBQb2ludGVyIHRvIHRoZSBmaWxlIGluZm8gc3RydWN0IGZvciB0aGUgaGlnaCBsZXZlbCBsYW5ndWFnZQorICAgICBzb3VyY2UgbGluZSB0aGF0IGJlbG9uZ3MgaGVyZSAqLworICBmaWxlX2luZm9fdHlwZSAqIGhsbF9maWxlOworICAvKiBIaWdoIGxldmVsIGxhbmd1YWdlIHNvdXJjZSBsaW5lICovCisgIHVuc2lnbmVkIGludCBobGxfbGluZTsKKworICAvKiBQb2ludGVyIHRvIGFueSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpbmUgKi8KKyAgY2hhciAqIG1lc3NhZ2U7CisKKyAgZW51bQorICAgIHsKKyAgICAgIEVESUNUX05PTkUsCisgICAgICBFRElDVF9TQlRUTCwKKyAgICAgIEVESUNUX1RJVExFLAorICAgICAgRURJQ1RfTk9MSVNULAorICAgICAgRURJQ1RfTElTVCwKKyAgICAgIEVESUNUX05PTElTVF9ORVhULAorICAgICAgRURJQ1RfRUpFQ1QKKyAgICB9IGVkaWN0OworICBjaGFyICogZWRpY3RfYXJnOworCisgIC8qIE5vbnplcm8gaWYgdGhpcyBsaW5lIGlzIHRvIGJlIG9taXR0ZWQgYmVjYXVzZSBpdCBjb250YWlucworICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBiZWNvbWUgYSBmbGFncyBmaWVsZCBpZiB3ZSBjb21lCisgICAgIHVwIHdpdGggbW9yZSBpbmZvcm1hdGlvbiB0byBzdG9yZSBoZXJlLiAgKi8KKyAgaW50IGRlYnVnZ2luZzsKK307CisKK3R5cGVkZWYgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgbGlzdF9pbmZvX3R5cGU7CisKKworaW50IGxpc3RpbmdfbGhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfTEhTX1dJRFRIOworaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORDsKK2ludCBsaXN0aW5nX2xoc19jb250X2xpbmVzICAgPSBMSVNUSU5HX0xIU19DT05UX0xJTkVTOworaW50IGxpc3RpbmdfcmhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfUkhTX1dJRFRIOworCitzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqICAgICAgICBsaXN0aW5nX3RhaWw7CisKK3N0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGZpbGVfaW5mb19oZWFkOworc3RhdGljIGZpbGVfaW5mb190eXBlICogICAgICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbzsKK3N0YXRpYyBGSUxFICogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3Blbl9maWxlOworc3RhdGljIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogaGVhZDsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX3dpZHRoID0gMjAwOworc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFwZXJfaGVpZ2h0ID0gNjA7CisKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmc7CisKKy8qIEZpbGUgdG8gb3V0cHV0IGxpc3RpbmdzIHRvLiAgKi8KK3N0YXRpYyBGSUxFICogbGlzdF9maWxlOworCisvKiBUaGlzIHN0YXRpYyBhcnJheSBpcyB1c2VkIHRvIGtlZXAgdGhlIHRleHQgb2YgZGF0YSB0byBiZSBwcmludGVkCisgICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgKi8KKworI2RlZmluZSBNQVhfQllURVMJCQkJCQkJXAorICAoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aAkJCVwKKyAgICsgKCgoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCkJXAorICAgICAgKiBsaXN0aW5nX2xoc19jb250X2xpbmVzKQkJCQkJCVwKKyAgICsgMjApCisKK3N0YXRpYyBjaGFyICogZGF0YV9idWZmZXI7CisKKy8qIFByb3RvdHlwZXMuICAqLworc3RhdGljIHZvaWQgbGlzdGluZ19tZXNzYWdlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKK3N0YXRpYyBmaWxlX2luZm9fdHlwZSAqIGZpbGVfaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlX25hbWUpKTsKK3N0YXRpYyB2b2lkIG5ld19mcmFnIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBjaGFyICogYnVmZmVyX2xpbmUgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmZpbGUsCisJCQkJICBjaGFyICpsaW5lLCB1bnNpZ25lZCBpbnQgc2l6ZSkpOworc3RhdGljIHZvaWQgbGlzdGluZ19wYWdlIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfaGV4IFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7CitzdGF0aWMgdm9pZCBwcmludF9saW5lcyBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqLCB1bnNpZ25lZCBpbnQsCisJCQkJIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgdm9pZCBsaXN0X3N5bWJvbF90YWJsZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwcmludF9zb3VyY2UgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZSwKKwkJCQkgIGxpc3RfaW5mb190eXBlICpsaXN0LAorCQkJCSAgY2hhciAqYnVmZmVyLAorCQkJCSAgdW5zaWduZWQgaW50IHdpZHRoKSk7CitzdGF0aWMgaW50IGRlYnVnZ2luZ19wc2V1ZG8gUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBsaXN0aW5nX2xpc3RpbmcgUEFSQU1TICgoY2hhciAqbmFtZSkpOworCisKK3N0YXRpYyB2b2lkCitsaXN0aW5nX21lc3NhZ2UgKG5hbWUsIG1lc3NhZ2UpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Cit7CisgIHVuc2lnbmVkIGludCBsID0gc3RybGVuIChuYW1lKSArIHN0cmxlbiAobWVzc2FnZSkgKyAxOworICBjaGFyICpuID0gKGNoYXIgKikgeG1hbGxvYyAobCk7CisgIHN0cmNweSAobiwgbmFtZSk7CisgIHN0cmNhdCAobiwgbWVzc2FnZSk7CisgIGlmIChsaXN0aW5nX3RhaWwgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwpCisgICAgeworICAgICAgbGlzdGluZ190YWlsLT5tZXNzYWdlID0gbjsKKyAgICB9Cit9CisKK3ZvaWQKK2xpc3Rpbmdfd2FybmluZyAobWVzc2FnZSkKKyAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKK3sKKyAgbGlzdGluZ19tZXNzYWdlIChfKCJXYXJuaW5nOiIpLCBtZXNzYWdlKTsKK30KKwordm9pZAorbGlzdGluZ19lcnJvciAobWVzc2FnZSkKKyAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKK3sKKyAgbGlzdGluZ19tZXNzYWdlIChfKCJFcnJvcjoiKSwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyBmaWxlX2luZm9fdHlwZSAqCitmaWxlX2luZm8gKGZpbGVfbmFtZSkKKyAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOworeworICAvKiBGaW5kIGFuIGVudHJ5IHdpdGggdGhpcyBmaWxlIG5hbWUgKi8KKyAgZmlsZV9pbmZvX3R5cGUgKnAgPSBmaWxlX2luZm9faGVhZDsKKworICB3aGlsZSAocCAhPSAoZmlsZV9pbmZvX3R5cGUgKikgTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKSA9PSAwKQorCXJldHVybiBwOworICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorCisgIC8qIE1ha2UgbmV3IGVudHJ5ICovCisKKyAgcCA9IChmaWxlX2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGZpbGVfaW5mb190eXBlKSk7CisgIHAtPm5leHQgPSBmaWxlX2luZm9faGVhZDsKKyAgZmlsZV9pbmZvX2hlYWQgPSBwOworICBwLT5maWxlbmFtZSA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBzdHJsZW4gKGZpbGVfbmFtZSkgKyAxKTsKKyAgc3RyY3B5IChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKTsKKyAgcC0+cG9zID0gMDsKKyAgcC0+bGluZW51bSA9IDA7CisgIHAtPmF0X2VuZCA9IDA7CisKKyAgcmV0dXJuIHA7Cit9CisKKworc3RhdGljIHZvaWQKK25ld19mcmFnICgpCit7CisKKyAgZnJhZ193YW5lIChmcmFnX25vdyk7CisgIGZyYWdfbmV3ICgwKTsKKworfQorCit2b2lkCitsaXN0aW5nX25ld2xpbmUgKHBzKQorICAgICBjaGFyICpwczsKK3sKKyAgY2hhciAqZmlsZTsKKyAgdW5zaWduZWQgaW50IGxpbmU7CisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9saW5lID0gMHhmZmZmOworICBzdGF0aWMgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKKyAgbGlzdF9pbmZvX3R5cGUgKm5ldyA9IE5VTEw7CisKKyAgaWYgKGxpc3RpbmcgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKyAgICByZXR1cm47CisKKyNpZmRlZiBPQkpfRUxGCisgIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcworICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5jbHVkZXMgdGhlCisgICAgIHN0YXRlbWVudCB3aGljaCBzd2l0Y2hlcyB1cyBpbnRvIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbiwgd2hpY2ggd2UKKyAgICAgY2FuIG9ubHkgc2V0IGFmdGVyIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCisgIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMAorICAgICAgJiYgbGlzdGluZ190YWlsICE9IE5VTEwKKyAgICAgICYmICEgbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc2VnbmFtZTsKKworICAgICAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAobm93X3NlZyk7CisgICAgICBpZiAoc3RybmNtcCAoc2VnbmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKKwkgIHx8IHN0cm5jbXAgKHNlZ25hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMCkKKwlsaXN0aW5nX3RhaWwtPmRlYnVnZ2luZyA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7CisgIGlmIChwcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChsaW5lID09IGxhc3RfbGluZSAmJiAhKGxhc3RfZmlsZSAmJiBmaWxlICYmIHN0cmNtcCAoZmlsZSwgbGFzdF9maWxlKSkpCisJcmV0dXJuOworCisgICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOworCisgICAgICAvKiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKKwkgbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgorCisJIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCisJIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJ5IGlucHV0X3NjcnViX25ld19maWxlKCksIGlmIHRoYXQgaXMKKwkgbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCisKKwkgSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCisJIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAorCSBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3RpbmcgdGhhdCBpcyBwcm9kdWNlZCBhdCB0aGUgZW5kCisJIG9mIHRoZSBhc3NlbWJseS4gICovCisgICAgICBpZiAoc3RyY21wIChmaWxlLCBfKCJ7c3RhbmRhcmQgaW5wdXR9IikpID09IDAKKwkgICYmIGlucHV0X2xpbmVfcG9pbnRlciAhPSBOVUxMKQorCXsKKwkgIGNoYXIgKiBjb3B5OworCSAgaW50IGxlbjsKKwkgIGludCBzZWVuX3F1b3RlID0gMDsKKworCSAgZm9yIChjb3B5ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsKKwkgICAgICAgKiBjb3B5ICYmIChzZWVuX3F1b3RlCisJCQkgIHx8ICghIGlzX2VuZF9vZl9saW5lIFsodW5zaWduZWQgY2hhcikgKiBjb3B5XSkpOworCSAgICAgICBjb3B5ICsrKQorCSAgICBpZiAoKiBjb3B5ID09ICciJyAmJiBjb3B5Wy0xXSAhPSAnXFwnKQorCSAgICAgIHNlZW5fcXVvdGUgPSAhIHNlZW5fcXVvdGU7CisKKwkgIGxlbiA9IChjb3B5IC0gaW5wdXRfbGluZV9wb2ludGVyKSArIDI7CisKKwkgIGNvcHkgPSB4bWFsbG9jIChsZW4pOworCisJICBpZiAoY29weSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqIHNyYyA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7CisJICAgICAgY2hhciAqIGRlc3QgPSBjb3B5OworCSAgICAgIAorCSAgICAgIHdoaWxlICgtLWxlbikKKwkJeworCQkgIGNoYXIgYyA9ICogc3JjICsrOworCisJCSAgLyogT21pdCBjb250cm9sIGNoYXJhY3RlcnMgaW4gdGhlIGxpc3RpbmcuICAqLworCQkgIGlmIChpc2FzY2lpIChjKSAmJiAhIGlzY250cmwgKGMpKQorCQkgICAgKiBkZXN0ICsrID0gYzsKKwkJfQorCSAgICAgIAorCSAgICAgICpkZXN0ID0gMDsKKwkgICAgfQorCSAgCisJICBuZXctPmxpbmVfY29udGVudHMgPSBjb3B5OworCX0KKyAgICAgIGVsc2UKKwluZXctPmxpbmVfY29udGVudHMgPSBOVUxMOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5ldyA9IChsaXN0X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGxpc3RfaW5mb190eXBlKSk7CisgICAgICBuZXctPmxpbmVfY29udGVudHMgPSBwczsKKyAgICB9CisKKyAgbGFzdF9saW5lID0gbGluZTsKKyAgbGFzdF9maWxlID0gZmlsZTsKKyAgCisgIG5ld19mcmFnICgpOworCisgIGlmIChsaXN0aW5nX3RhaWwpCisgICAgbGlzdGluZ190YWlsLT5uZXh0ID0gbmV3OworICBlbHNlCisgICAgaGVhZCA9IG5ldzsKKyAgCisgIGxpc3RpbmdfdGFpbCA9IG5ldzsKKworICBuZXctPmZyYWcgPSBmcmFnX25vdzsKKyAgbmV3LT5saW5lID0gbGluZTsKKyAgbmV3LT5maWxlID0gZmlsZV9pbmZvIChmaWxlKTsKKyAgbmV3LT5uZXh0ID0gKGxpc3RfaW5mb190eXBlICopIE5VTEw7CisgIG5ldy0+bWVzc2FnZSA9IChjaGFyICopIE5VTEw7CisgIG5ldy0+ZWRpY3QgPSBFRElDVF9OT05FOworICBuZXctPmhsbF9maWxlID0gKGZpbGVfaW5mb190eXBlICopIE5VTEw7CisgIG5ldy0+aGxsX2xpbmUgPSAwOworICBuZXctPmRlYnVnZ2luZyA9IDA7CisgIAorICBuZXdfZnJhZyAoKTsKKworI2lmZGVmIE9CSl9FTEYKKyAgLyogSW4gRUxGLCBhbnl0aGluZyBpbiBhIHNlY3Rpb24gYmVnaW5uaW5nIHdpdGggLmRlYnVnIG9yIC5saW5lIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKSAhPSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7CisKKyAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOworICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCisJICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCisJbmV3LT5kZWJ1Z2dpbmcgPSAxOworICAgIH0KKyNlbmRpZgorfQorCisvKiBBdHRhY2ggYWxsIGN1cnJlbnQgZnJhZ3MgdG8gdGhlIHByZXZpb3VzIGxpbmUgaW5zdGVhZCBvZiB0aGUKKyAgIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNSVBTIGJhY2tlbmQgd2hlbiBpdCBkaXNjb3ZlcnMKKyAgIHRoYXQgaXQgbmVlZHMgdG8gYWRkIHNvbWUgTk9QIGluc3RydWN0aW9uczsgdGhlIGFkZGVkIE5PUAorICAgaW5zdHJ1Y3Rpb25zIHNob3VsZCBnbyB3aXRoIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGhhcyB0aGUgZGVsYXksIG5vdAorICAgd2l0aCB0aGUgbmV3IGluc3RydWN0aW9uLiAgKi8KKwordm9pZAorbGlzdGluZ19wcmV2X2xpbmUgKCkKK3sKKyAgbGlzdF9pbmZvX3R5cGUgKmw7CisgIGZyYWdTICpmOworCisgIGlmIChoZWFkID09IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMCisgICAgICB8fCBoZWFkID09IGxpc3RpbmdfdGFpbCkKKyAgICByZXR1cm47CisKKyAgbmV3X2ZyYWcgKCk7CisKKyAgZm9yIChsID0gaGVhZDsgbC0+bmV4dCAhPSBsaXN0aW5nX3RhaWw7IGwgPSBsLT5uZXh0KQorICAgIDsKKworICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmICE9IChmcmFnUyAqKSBOVUxMOyBmID0gZi0+ZnJfbmV4dCkKKyAgICBpZiAoZi0+bGluZSA9PSBsaXN0aW5nX3RhaWwpCisgICAgICBmLT5saW5lID0gbDsKKworICBsaXN0aW5nX3RhaWwtPmZyYWcgPSBmcmFnX25vdzsKKyAgbmV3X2ZyYWcgKCk7Cit9CisKKy8qCisgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXh0IHNvdXJjZSBsaW5lIGZyb20gdGhlIGZpbGUgc3VwcGxpZWQsCisgdHJ1bmNhdGVkIHRvIHNpemUuICBJdCBhcHBlbmRzIGEgZmFrZSBsaW5lIHRvIHRoZSBlbmQgb2YgZWFjaCBpbnB1dAorIGZpbGUgdG8gbWFrZQorKi8KKworc3RhdGljIGNoYXIgKgorYnVmZmVyX2xpbmUgKGZpbGUsIGxpbmUsIHNpemUpCisgICAgIGZpbGVfaW5mb190eXBlICogZmlsZTsKKyAgICAgY2hhciAqbGluZTsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIHVuc2lnbmVkIGludCBjb3VudCA9IDA7CisgIGludCBjOworCisgIGNoYXIgKnAgPSBsaW5lOworCisgIC8qIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIGZpbGUsIHJldHVybiBhbiBlbXB0eSBsaW5lICovCisgIGlmIChmaWxlLT5hdF9lbmQpCisgICAgcmV0dXJuICIiOworCisgIC8qIENoZWNrIHRoZSBjYWNoZSBhbmQgc2VlIGlmIHdlIGxhc3QgdXNlZCB0aGlzIGZpbGUuICAqLworICBpZiAoIWxhc3Rfb3Blbl9maWxlX2luZm8gfHwgZmlsZSAhPSBsYXN0X29wZW5fZmlsZV9pbmZvKQorICAgIHsKKyAgICAgIGlmIChsYXN0X29wZW5fZmlsZSkKKwl7CisJICBsYXN0X29wZW5fZmlsZV9pbmZvLT5wb3MgPSBmdGVsbCAobGFzdF9vcGVuX2ZpbGUpOworCSAgZmNsb3NlIChsYXN0X29wZW5fZmlsZSk7CisJfQorCisgICAgICBsYXN0X29wZW5fZmlsZV9pbmZvID0gZmlsZTsKKyAgICAgIGxhc3Rfb3Blbl9maWxlID0gZm9wZW4gKGZpbGUtPmZpbGVuYW1lLCAiciIpOworICAgICAgaWYgKGxhc3Rfb3Blbl9maWxlID09IE5VTEwpCisJeworCSAgZmlsZS0+YXRfZW5kID0gMTsKKwkgIHJldHVybiAiIjsKKwl9CisgICAgICAKKyAgICAgIC8qIFNlZWsgdG8gd2hlcmUgd2Ugd2VyZSBsYXN0IHRpbWUgdGhpcyBmaWxlIHdhcyBvcGVuLiAgKi8KKyAgICAgIGlmIChmaWxlLT5wb3MpCisJZnNlZWsobGFzdF9vcGVuX2ZpbGUsIGZpbGUtPnBvcywgU0VFS19TRVQpOworICAgIH0KKworICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKKworICBzaXplIC09IDE7CQkJLyogbGVhdmUgcm9vbSBmb3IgbnVsbCAqLworCisgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgeworICAgICAgaWYgKGNvdW50IDwgc2l6ZSkKKwkqcCsrID0gYzsKKyAgICAgIGNvdW50Kys7CisKKyAgICAgIGMgPSBmZ2V0YyAobGFzdF9vcGVuX2ZpbGUpOworCisgICAgfQorICBpZiAoYyA9PSBFT0YpCisgICAgeworICAgICAgZmlsZS0+YXRfZW5kID0gMTsKKyAgICAgICpwKysgPSAnLic7CisgICAgICAqcCsrID0gJy4nOworICAgICAgKnArKyA9ICcuJzsKKyAgICB9CisgIGZpbGUtPmxpbmVudW0rKzsKKyAgKnArKyA9IDA7CisgIHJldHVybiBsaW5lOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpmbjsKKworc3RhdGljIHVuc2lnbmVkIGludCBlamVjdDsJLyogRWplY3QgcGVuZGluZyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwYWdlOwkvKiBDdXJyZW50IHBhZ2UgbnVtYmVyICovCitzdGF0aWMgY2hhciAqdGl0bGU7CQkvKiBjdXJyZW50IHRpdGxlICovCitzdGF0aWMgY2hhciAqc3VidGl0bGU7CQkvKiBjdXJyZW50IHN1YnRpdGxlICovCitzdGF0aWMgdW5zaWduZWQgaW50IG9uX3BhZ2U7CS8qIG51bWJlciBvZiBsaW5lcyBwcmludGVkIG9uIGN1cnJlbnQgcGFnZSAqLworCisKK3N0YXRpYyB2b2lkCitsaXN0aW5nX3BhZ2UgKGxpc3QpCisgICAgIGxpc3RfaW5mb190eXBlICpsaXN0OworeworICAvKiBHcm9wZSBhcm91bmQsIHNlZSBpZiB3ZSBjYW4gc2VlIGEgdGl0bGUgb3Igc3VidGl0bGUgZWRpY3QgY29taW5nIHVwCisgICAgIHNvb24gICh3ZSBsb29rIGRvd24gMTAgbGluZXMgb2YgdGhlIHBhZ2UgYW5kIHNlZSBpZiBpdCdzIHRoZXJlKSovCisgIGlmICgoZWplY3QgfHwgKG9uX3BhZ2UgPj0gKHVuc2lnbmVkIGludCkgcGFwZXJfaGVpZ2h0KSkgJiYgcGFwZXJfaGVpZ2h0ICE9IDApCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGMgPSAxMDsKKyAgICAgIGludCBoYWRfdGl0bGUgPSAwOworICAgICAgaW50IGhhZF9zdWJ0aXRsZSA9IDA7CisKKyAgICAgIHBhZ2UrKzsKKworICAgICAgd2hpbGUgKGMgIT0gMCAmJiBsaXN0KQorCXsKKwkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9TQlRUTCAmJiAhaGFkX3N1YnRpdGxlKQorCSAgICB7CisJICAgICAgaGFkX3N1YnRpdGxlID0gMTsKKwkgICAgICBzdWJ0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKKwkgICAgfQorCSAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX1RJVExFICYmICFoYWRfdGl0bGUpCisJICAgIHsKKwkgICAgICBoYWRfdGl0bGUgPSAxOworCSAgICAgIHRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOworCSAgICB9CisJICBsaXN0ID0gbGlzdC0+bmV4dDsKKwkgIGMtLTsKKwl9CisKKworICAgICAgaWYgKHBhZ2UgPiAxKQorCXsKKwkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxmIik7CisJfQorCisgICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlcyAlcyBcdFx0XHRwYWdlICVkXG4iLCBMSVNUSU5HX0hFQURFUiwgZm4sIHBhZ2UpOworICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIHRpdGxlKTsKKyAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBzdWJ0aXRsZSk7CisgICAgICBvbl9wYWdlID0gMzsKKyAgICAgIGVqZWN0ID0gMDsKKyAgICB9Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludAorY2FsY19oZXggKGxpc3QpCisgICAgIGxpc3RfaW5mb190eXBlICogbGlzdDsKK3sKKyAgaW50IGRhdGFfYnVmZmVyX3NpemU7CisgIGxpc3RfaW5mb190eXBlICpmaXJzdCA9IGxpc3Q7CisgIHVuc2lnbmVkIGludCBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOworICBmcmFnUyAqZnJhZzsKKyAgZnJhZ1MgKmZyYWdfcHRyOworICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl9mcmFnOworCisgIC8qIEZpbmQgZmlyc3QgZnJhZyB3aGljaCBzYXlzIGl0IGJlbG9uZ3MgdG8gdGhpcyBsaW5lICovCisgIGZyYWcgPSBsaXN0LT5mcmFnOworICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5saW5lICE9IGxpc3QpCisgICAgZnJhZyA9IGZyYWctPmZyX25leHQ7CisKKyAgZnJhZ19wdHIgPSBmcmFnOworCisgIGRhdGFfYnVmZmVyX3NpemUgPSAwOworCisgIC8qIER1bXAgYWxsIHRoZSBmcmFncyB3aGljaCBiZWxvbmcgdG8gdGhpcyBsaW5lICovCisgIHdoaWxlIChmcmFnX3B0ciAhPSAoZnJhZ1MgKikgTlVMTCAmJiBmcmFnX3B0ci0+bGluZSA9PSBmaXJzdCkKKyAgICB7CisgICAgICAvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIGZpeGVkIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KKyAgICAgIGJ5dGVfaW5fZnJhZyA9IDA7CisgICAgICB3aGlsZSAoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZyA8IGZyYWdfcHRyLT5mcl9maXgKKwkgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQorCXsKKwkgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKKwkgICAgeworCSAgICAgIGFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKKwkgICAgfQorCisJICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCisJCSAgICIlMDJYIiwKKwkJICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW2J5dGVfaW5fZnJhZ10pICYgMHhmZik7CisJICBkYXRhX2J1ZmZlcl9zaXplICs9IDI7CisJICBieXRlX2luX2ZyYWcrKzsKKwl9CisgICAgICB7CisJdW5zaWduZWQgaW50IHZhcl9yZXBfbWF4ID0gYnl0ZV9pbl9mcmFnOworCXVuc2lnbmVkIGludCB2YXJfcmVwX2lkeCA9IGJ5dGVfaW5fZnJhZzsKKworCS8qIFByaW50IGFzIG1hbnkgYnl0ZXMgZnJvbSB0aGUgdmFyaWFibGUgcGFydCBhcyBpcyBzZW5zaWJsZSAqLworCXdoaWxlICgoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZworCQk8IGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyICogZnJhZ19wdHItPmZyX29mZnNldCkKKwkgICAgICAgJiYgZGF0YV9idWZmZXJfc2l6ZSA8IE1BWF9CWVRFUyAtIDMpCisJICB7CisJICAgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKKwkgICAgICB7CisJCWFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKKwkgICAgICB9CisJICAgIHNwcmludGYgKGRhdGFfYnVmZmVyICsgZGF0YV9idWZmZXJfc2l6ZSwKKwkJICAgICAiJTAyWCIsCisJCSAgICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW3Zhcl9yZXBfaWR4XSkgJiAweGZmKTsKKyNpZiAwCisJICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7CisJICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7CisjZW5kaWYKKwkgICAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOworCisJICAgIHZhcl9yZXBfaWR4Kys7CisJICAgIGJ5dGVfaW5fZnJhZysrOworCisJICAgIGlmICgob2Zmc2V0VCkgdmFyX3JlcF9pZHggPj0gZnJhZ19wdHItPmZyX2ZpeCArIGZyYWdfcHRyLT5mcl92YXIpCisJICAgICAgdmFyX3JlcF9pZHggPSB2YXJfcmVwX21heDsKKwkgIH0KKyAgICAgIH0KKworICAgICAgZnJhZ19wdHIgPSBmcmFnX3B0ci0+ZnJfbmV4dDsKKyAgICB9CisgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemVdID0gJ1wwJzsKKyAgcmV0dXJuIGFkZHJlc3M7Cit9CisKKworCisKKworCitzdGF0aWMgdm9pZAorcHJpbnRfbGluZXMgKGxpc3QsIGxpbmVubywgc3RyaW5nLCBhZGRyZXNzKQorICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKKyAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKKyAgICAgY2hhciAqc3RyaW5nOworICAgICB1bnNpZ25lZCBpbnQgYWRkcmVzczsKK3sKKyAgdW5zaWduZWQgaW50IGlkeDsKKyAgdW5zaWduZWQgaW50IG5jaGFyczsKKyAgdW5zaWduZWQgaW50IGxpbmVzOworICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl93b3JkID0gMDsKKyAgY2hhciAqc3JjID0gZGF0YV9idWZmZXI7CisKKyAgLyogUHJpbnQgdGhlIHN0dWZmIG9uIHRoZSBmaXJzdCBsaW5lICovCisgIGxpc3RpbmdfcGFnZSAobGlzdCk7CisgIG5jaGFycyA9IChMSVNUSU5HX1dPUkRfU0laRSAqIDIgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoOworICAKKyAgLyogUHJpbnQgdGhlIGhleCBmb3IgdGhlIGZpcnN0IGxpbmUgKi8KKyAgaWYgKGFkZHJlc3MgPT0gfiAodW5zaWduZWQgaW50KSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICIsIGxpbmVubyk7CisgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5jaGFyczsgaWR4KyspCisJZnByaW50ZiAobGlzdF9maWxlLCAiICIpOworCisgICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7CisgICAgICAKKyAgICAgIG9uX3BhZ2UgKys7CisgICAgICAKKyAgICAgIGxpc3RpbmdfcGFnZSAoMCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGhhZF9lcnJvcnMgKCkpCisgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCA/Pz8/ICIsIGxpbmVubyk7CisgIGVsc2UKKyAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICUwNHggIiwgbGluZW5vLCBhZGRyZXNzKTsKKworICAvKiBBbmQgdGhlIGRhdGEgdG8gZ28gYWxvbmcgd2l0aCBpdCAqLworICBpZHggPSAwOworICAKKyAgd2hpbGUgKCpzcmMgJiYgaWR4IDwgbmNoYXJzKQorICAgIHsKKyAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVjJWMiLCBzcmNbMF0sIHNyY1sxXSk7CisgICAgICBzcmMgKz0gMjsKKyAgICAgIGJ5dGVfaW5fd29yZCsrOworICAgICAgCisgICAgICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQorCXsKKwkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKKwkgIGlkeCsrOworCSAgYnl0ZV9pbl93b3JkID0gMDsKKwl9CisgICAgICAKKyAgICAgIGlkeCArPSAyOworICAgIH0KKyAgCisgIGZvciAoOyBpZHggPCBuY2hhcnM7IGlkeCsrKQorICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKKyAgCisgIGZwcmludGYgKGxpc3RfZmlsZSwgIlx0JXNcbiIsIHN0cmluZyA/IHN0cmluZyA6ICIiKTsKKyAgb25fcGFnZSsrOworICBsaXN0aW5nX3BhZ2UgKGxpc3QpOworICAKKyAgaWYgKGxpc3QtPm1lc3NhZ2UpCisgICAgeworICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiKioqKiAgJXNcbiIsIGxpc3QtPm1lc3NhZ2UpOworICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKKyAgICAgIG9uX3BhZ2UrKzsKKyAgICB9CisgIAorICBmb3IgKGxpbmVzID0gMDsKKyAgICAgICBsaW5lcyA8ICh1bnNpZ25lZCBpbnQpIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMKKwkgJiYgKnNyYzsKKyAgICAgICBsaW5lcyArKykKKyAgICB7CisgICAgICBuY2hhcnMgPSAoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKQorCSogbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIC0gMTsKKyAgICAgIGlkeCA9IDA7CisgICAgICAKKyAgICAgIC8qIFByaW50IGFueSBtb3JlIGxpbmVzIG9mIGRhdGEsIGJ1dCBtb3JlIGNvbXBhY3RseSAqLworICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCAgICAgICIsIGxpbmVubyk7CisgICAgICAKKyAgICAgIHdoaWxlICgqc3JjICYmIGlkeCA8IG5jaGFycykKKwl7CisJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjWzBdLCBzcmNbMV0pOworCSAgc3JjICs9IDI7CisJICBpZHggKz0gMjsKKwkgIGJ5dGVfaW5fd29yZCsrOworCSAgCisJICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQorCSAgICB7CisJICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiICIpOworCSAgICAgIGlkeCsrOworCSAgICAgIGJ5dGVfaW5fd29yZCA9IDA7CisJICAgIH0KKwl9CisgICAgICAKKyAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7CisgICAgICBvbl9wYWdlICsrOworICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2xpc3Rfc3ltYm9sX3RhYmxlICgpCit7CisgIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7CisgIGludCBnb3Rfc29tZSA9IDA7CisKKyAgc3ltYm9sUyAqcHRyOworICBlamVjdCA9IDE7CisgIGxpc3RpbmdfcGFnZSAoMCk7CisKKyAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKKyAgICB7CisgICAgICBpZiAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocHRyKSkKKwkgIHx8IFNfR0VUX1NFR01FTlQgKHB0cikgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwl7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCSAgLyogRG9uJ3QgcmVwb3J0IHNlY3Rpb24gc3ltYm9scy4gIFRoZXkgYXJlIG5vdCBpbnRlcmVzdGluZy4gICovCisJICBpZiAocHRyLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKKwkgICAgY29udGludWU7CisjZW5kaWYKKwkgIGlmIChTX0dFVF9OQU1FIChwdHIpKQorCSAgICB7CisJICAgICAgY2hhciBidWZbMzBdLCBmbXRbOF07CisJICAgICAgdmFsdWVUIHZhbCA9IFNfR0VUX1ZBTFVFIChwdHIpOworCisJICAgICAgLyogQEAgTm90ZSB0aGF0IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBjb21waWxhdGlvbiBvcHRpb25zLAorCQkgbm90IHNvbGVseSBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlcmlzdGljcy4gICovCisJICAgICAgaWYgKHNpemVvZiAodmFsKSA9PSA0ICYmIHNpemVvZiAoaW50KSA9PSA0KQorCQlzcHJpbnRmIChidWYsICIlMDhseCIsICh1bnNpZ25lZCBsb25nKSB2YWwpOworCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQorCQl7CisJCSAgc3ByaW50ZiAoZm10LCAiJSUwJWx1bHgiLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKHZhbCkgKiAyKSk7CisJCSAgc3ByaW50ZiAoYnVmLCBmbXQsICh1bnNpZ25lZCBsb25nKSB2YWwpOworCQl9CisjaWYgZGVmaW5lZCAoQkZENjQpCisJICAgICAgZWxzZSBpZiAoc2l6ZW9mICh2YWwpID4gNCkKKwkJc3ByaW50Zl92bWEgKGJ1ZiwgdmFsKTsKKyNlbmRpZgorCSAgICAgIGVsc2UKKwkJYWJvcnQgKCk7CisKKwkgICAgICBpZiAoIWdvdF9zb21lKQorCQl7CisJCSAgZnByaW50ZiAobGlzdF9maWxlLCAiREVGSU5FRCBTWU1CT0xTXG4iKTsKKwkJICBvbl9wYWdlKys7CisJCSAgZ290X3NvbWUgPSAxOworCQl9CisKKwkgICAgICBpZiAocHRyLT5zeV9mcmFnICYmIHB0ci0+c3lfZnJhZy0+bGluZSkKKwkJeworCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUyMHM6JS01ZCAgJXM6JXMgJXNcbiIsCisJCQkgICBwdHItPnN5X2ZyYWctPmxpbmUtPmZpbGUtPmZpbGVuYW1lLAorCQkJICAgcHRyLT5zeV9mcmFnLT5saW5lLT5saW5lLAorCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKKwkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMzNzOiVzICVzXG4iLAorCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKKwkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7CisJCX0KKworCSAgICAgIG9uX3BhZ2UgKys7CisJICAgICAgbGlzdGluZ19wYWdlICgwKTsKKwkgICAgfQorCX0KKworICAgIH0KKyAgaWYgKCFnb3Rfc29tZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBERUZJTkVEIFNZTUJPTFNcbiIpOworICAgICAgb25fcGFnZSsrOworICAgIH0KKyAgZnByaW50ZiAobGlzdF9maWxlLCAiXG4iKTsKKyAgb25fcGFnZSsrOworICBsaXN0aW5nX3BhZ2UgKDApOworCisgIGdvdF9zb21lID0gMDsKKworICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsgcHRyICE9IChzeW1ib2xTICopIE5VTEw7IHB0ciA9IHN5bWJvbF9uZXh0IChwdHIpKQorICAgIHsKKyAgICAgIGlmIChTX0dFVF9OQU1FIChwdHIpICYmIHN0cmxlbiAoU19HRVRfTkFNRSAocHRyKSkgIT0gMCkKKwl7CisJICBpZiAoU19HRVRfU0VHTUVOVCAocHRyKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKKwkgICAgeworCSAgICAgIGlmICghZ290X3NvbWUpCisJCXsKKwkJICBnb3Rfc29tZSA9IDE7CisJCSAgZnByaW50ZiAobGlzdF9maWxlLCAiVU5ERUZJTkVEIFNZTUJPTFNcbiIpOworCQkgIG9uX3BhZ2UrKzsKKwkJICBsaXN0aW5nX3BhZ2UgKDApOworCQl9CisJICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIFNfR0VUX05BTUUgKHB0cikpOworCSAgICAgIG9uX3BhZ2UrKzsKKwkgICAgICBsaXN0aW5nX3BhZ2UgKDApOworCSAgICB9CisJfQorICAgIH0KKyAgaWYgKCFnb3Rfc29tZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBVTkRFRklORUQgU1lNQk9MU1xuIik7CisgICAgICBvbl9wYWdlKys7CisgICAgICBsaXN0aW5nX3BhZ2UgKDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X3NvdXJjZSAoY3VycmVudF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKQorICAgICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9maWxlOworICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKKyAgICAgY2hhciAqYnVmZmVyOworICAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Cit7CisgIGlmICghY3VycmVudF9maWxlLT5hdF9lbmQpCisgICAgeworICAgICAgd2hpbGUgKGN1cnJlbnRfZmlsZS0+bGluZW51bSA8IGxpc3QtPmhsbF9saW5lCisJICAgICAmJiAhY3VycmVudF9maWxlLT5hdF9lbmQpCisJeworCSAgY2hhciAqcCA9IGJ1ZmZlcl9saW5lIChjdXJyZW50X2ZpbGUsIGJ1ZmZlciwgd2lkdGgpOworCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTR1OiUtMTNzICoqKiogJXNcbiIsIGN1cnJlbnRfZmlsZS0+bGluZW51bSwKKwkJICAgY3VycmVudF9maWxlLT5maWxlbmFtZSwgcCk7CisJICBvbl9wYWdlKys7CisJICBsaXN0aW5nX3BhZ2UgKGxpc3QpOworCX0KKyAgICB9Cit9CisKKy8qIFNvbWV0aW1lcyB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gYmUgYm90aGVyZWQgYnkgdGhlIGRlYnVnZ2luZworICAgcmVjb3JkcyBpbnNlcnRlZCBieSB0aGUgY29tcGlsZXIsIHNlZSBpZiB0aGUgbGluZSBpcyBzdXNwaWNpb3VzLiAgKi8KKworc3RhdGljIGludAorZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGluZSkKKyAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7CisgICAgIGNvbnN0IGNoYXIgKmxpbmU7Cit7CisgIHN0YXRpYyBpbnQgaW5fZGVidWc7CisgIGludCB3YXNfZGVidWc7CisKKyAgaWYgKGxpc3QtPmRlYnVnZ2luZykKKyAgICB7CisgICAgICBpbl9kZWJ1ZyA9IDE7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgd2FzX2RlYnVnID0gaW5fZGVidWc7CisgIGluX2RlYnVnID0gMDsKKworICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpsaW5lKSkKKyAgICBsaW5lKys7CisKKyAgaWYgKCpsaW5lICE9ICcuJykKKyAgICB7CisjaWZkZWYgT0JKX0VMRgorICAgICAgLyogVGhlIEVMRiBjb21waWxlciBzb21ldGltZXMgZW1pdHMgYmxhbmsgbGluZXMgYWZ0ZXIgc3dpdGNoaW5nCisgICAgICAgICBvdXQgb2YgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gIElmIHRoZSBuZXh0IGxpbmUgZHJvcHMgdXMgYmFjaworICAgICAgICAgaW50byBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZW4gZG9uJ3QgcHJpbnQgdGhlIGJsYW5rIGxpbmUuCisgICAgICAgICBUaGlzIGlzIGEgaGFjayBmb3IgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIGJlaGF2aW91ciwgbm90IGEKKyAgICAgICAgIGdlbmVyYWwgY2FzZS4gICovCisgICAgICBpZiAod2FzX2RlYnVnCisJICAmJiAqbGluZSA9PSAnXDAnCisJICAmJiBsaXN0LT5uZXh0ICE9IE5VTEwKKwkgICYmIGxpc3QtPm5leHQtPmRlYnVnZ2luZykKKwl7CisJICBpbl9kZWJ1ZyA9IDE7CisJICByZXR1cm4gMTsKKwl9CisjZW5kaWYKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGxpbmUrKzsKKworICBpZiAoc3RybmNtcCAobGluZSwgImRlZiIsIDMpID09IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChzdHJuY21wIChsaW5lLCAidmFsIiwgMykgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHN0cm5jbXAgKGxpbmUsICJzY2wiLCAzKSA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAoc3RybmNtcCAobGluZSwgImxpbmUiLCA0KSA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAoc3RybmNtcCAobGluZSwgImVuZGVmIiwgNSkgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHN0cm5jbXAgKGxpbmUsICJsbiIsIDIpID09IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChzdHJuY21wIChsaW5lLCAidHlwZSIsIDQpID09IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChzdHJuY21wIChsaW5lLCAic2l6ZSIsIDQpID09IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChzdHJuY21wIChsaW5lLCAiZGltIiwgMykgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHN0cm5jbXAgKGxpbmUsICJ0YWciLCAzKSA9PSAwKQorICAgIHJldHVybiAxOworCisgIGlmIChzdHJuY21wIChsaW5lLCAic3RhYnMiLCA1KSA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJuIiwgNSkgPT0gMCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2xpc3RpbmdfbGlzdGluZyAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgbGlzdF9pbmZvX3R5cGUgKmxpc3QgPSBoZWFkOworICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOworICBjaGFyICptZXNzYWdlOworICBjaGFyICpidWZmZXI7CisgIGNoYXIgKnA7CisgIGludCBzaG93X2xpc3RpbmcgPSAxOworICB1bnNpZ25lZCBpbnQgd2lkdGg7CisKKyAgYnVmZmVyID0geG1hbGxvYyAobGlzdGluZ19yaHNfd2lkdGgpOworICBkYXRhX2J1ZmZlciA9IHhtYWxsb2MgKE1BWF9CWVRFUyk7CisgIGVqZWN0ID0gMTsKKyAgbGlzdCA9IGhlYWQ7CisKKyAgd2hpbGUgKGxpc3QgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwgJiYgMCkKKyAgICB7CisgICAgICBpZiAobGlzdC0+bmV4dCkKKwlsaXN0LT5mcmFnID0gbGlzdC0+bmV4dC0+ZnJhZzsKKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworCisgICAgfQorCisgIGxpc3QgPSBoZWFkLT5uZXh0OworCisKKyAgd2hpbGUgKGxpc3QpCisgICAgeworICAgICAgaW50IGxpc3RfbGluZTsKKworICAgICAgd2lkdGggPSBsaXN0aW5nX3Joc193aWR0aCA+IHBhcGVyX3dpZHRoID8gcGFwZXJfd2lkdGggOgorCWxpc3RpbmdfcmhzX3dpZHRoOworCisgICAgICBsaXN0X2xpbmUgPSBsaXN0LT5saW5lOworICAgICAgc3dpdGNoIChsaXN0LT5lZGljdCkKKwl7CisJY2FzZSBFRElDVF9MSVNUOgorCSAgLyogU2tpcCBhbGwgbGluZXMgdXAgdG8gdGhlIGN1cnJlbnQuICAqLworCSAgbGlzdF9saW5lLS07CisJICBicmVhazsKKwljYXNlIEVESUNUX05PTElTVDoKKwkgIHNob3dfbGlzdGluZy0tOworCSAgYnJlYWs7CisJY2FzZSBFRElDVF9OT0xJU1RfTkVYVDoKKwkgIGJyZWFrOworCWNhc2UgRURJQ1RfRUpFQ1Q6CisJICBicmVhazsKKwljYXNlIEVESUNUX05PTkU6CisJICBicmVhazsKKwljYXNlIEVESUNUX1RJVExFOgorCSAgdGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7CisJICBicmVhazsKKwljYXNlIEVESUNUX1NCVFRMOgorCSAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBpZiAoc2hvd19saXN0aW5nIDw9IDApCisJeworCSAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKKwkJICYmICFsaXN0LT5maWxlLT5hdF9lbmQpCisJICAgIHAgPSBidWZmZXJfbGluZSAobGlzdC0+ZmlsZSwgYnVmZmVyLCB3aWR0aCk7CisJfQorCisgICAgICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKKwl7CisJICAvKiBFbmFibGUgbGlzdGluZyBmb3IgdGhlIHNpbmdsZSBsaW5lIHRoYXQgY2F1c2VkIHRoZSBlbmFibGUuICAqLworCSAgbGlzdF9saW5lKys7CisJICBzaG93X2xpc3RpbmcrKzsKKwl9CisKKyAgICAgIGlmIChzaG93X2xpc3RpbmcgPiAwKQorCXsKKwkgIC8qIFNjYW4gZG93biB0aGUgbGlzdCBhbmQgcHJpbnQgYWxsIHRoZSBzdHVmZiB3aGljaCBjYW4gYmUgZG9uZQorCSAgICAgd2l0aCB0aGlzIGxpbmUgKG9yIGxpbmVzKS4gICovCisJICBtZXNzYWdlID0gMDsKKworCSAgaWYgKGxpc3QtPmhsbF9maWxlKQorCSAgICB7CisJICAgICAgY3VycmVudF9obGxfZmlsZSA9IGxpc3QtPmhsbF9maWxlOworCSAgICB9CisKKwkgIGlmIChjdXJyZW50X2hsbF9maWxlICYmIGxpc3QtPmhsbF9saW5lICYmIChsaXN0aW5nICYgTElTVElOR19ITEwpKQorCSAgICB7CisJICAgICAgcHJpbnRfc291cmNlIChjdXJyZW50X2hsbF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKTsKKwkgICAgfQorCisJICBpZiAobGlzdC0+bGluZV9jb250ZW50cykKKwkgICAgeworCSAgICAgIGlmICghKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKQorCQkgICAgJiYgZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGlzdC0+bGluZV9jb250ZW50cykpKQorCQl7CisgCQkgIHByaW50X2xpbmVzIChsaXN0LAorCQkJICAgICAgIGxpc3QtPmZpbGUtPmxpbmVudW0gPT0gMCA/IGxpc3QtPmxpbmUgOiBsaXN0LT5maWxlLT5saW5lbnVtLAorCQkJICAgICAgIGxpc3QtPmxpbmVfY29udGVudHMsIGNhbGNfaGV4IChsaXN0KSk7CisJCX0KKwkgICAgICBmcmVlIChsaXN0LT5saW5lX2NvbnRlbnRzKTsKKwkgICAgICBsaXN0LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKKwkJICAgICAmJiAhbGlzdC0+ZmlsZS0+YXRfZW5kKQorCQl7CisJCSAgdW5zaWduZWQgaW50IGFkZHJlc3M7CisKKwkJICBwID0gYnVmZmVyX2xpbmUgKGxpc3QtPmZpbGUsIGJ1ZmZlciwgd2lkdGgpOworCisJCSAgaWYgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUpCisJCSAgICBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOworCQkgIGVsc2UKKwkJICAgIGFkZHJlc3MgPSBjYWxjX2hleCAobGlzdCk7CisKKwkJICBpZiAoISgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykKKwkJCSYmIGRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIHApKSkKKwkJICAgIHByaW50X2xpbmVzIChsaXN0LCBsaXN0LT5maWxlLT5saW5lbnVtLCBwLCBhZGRyZXNzKTsKKwkJfQorCSAgICB9CisKKwkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9FSkVDVCkKKwkgICAgeworCSAgICAgIGVqZWN0ID0gMTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQorCS0tc2hvd19saXN0aW5nOworCisgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9CisKKyAgZnJlZSAoYnVmZmVyKTsKKyAgZnJlZSAoZGF0YV9idWZmZXIpOworICBkYXRhX2J1ZmZlciA9IE5VTEw7Cit9CisKK3ZvaWQKK2xpc3RpbmdfcHJpbnQgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGludCB1c2luZ19zdGRvdXQ7CisgIAorICB0aXRsZSA9ICIiOworICBzdWJ0aXRsZSA9ICIiOworCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgeworICAgICAgbGlzdF9maWxlID0gc3Rkb3V0OworICAgICAgdXNpbmdfc3Rkb3V0ID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsaXN0X2ZpbGUgPSBmb3BlbiAobmFtZSwgInciKTsKKyAgICAgIGlmIChsaXN0X2ZpbGUgIT0gTlVMTCkKKwl1c2luZ19zdGRvdXQgPSAwOworICAgICAgZWxzZQorCXsKKwkgIGFzX3BlcnJvciAoXygiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIiksIG5hbWUpOworCSAgbGlzdF9maWxlID0gc3Rkb3V0OworCSAgdXNpbmdfc3Rkb3V0ID0gMTsKKwl9CisgICAgfQorCisgIGlmIChsaXN0aW5nICYgTElTVElOR19OT0ZPUk0pCisgICAgeworICAgICAgcGFwZXJfaGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX0xJU1RJTkcpCisgICAgeworICAgICAgbGlzdGluZ19saXN0aW5nIChuYW1lKTsKKyAgICB9CisKKyAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCisgICAgeworICAgICAgbGlzdF9zeW1ib2xfdGFibGUgKCk7CisgICAgfQorCisgIGlmICghIHVzaW5nX3N0ZG91dCkKKyAgICB7CisgICAgICBpZiAoZmNsb3NlIChsaXN0X2ZpbGUpID09IEVPRikKKwlhc19wZXJyb3IgKF8oImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIpLCBuYW1lKTsKKyAgICB9CisKKyAgaWYgKGxhc3Rfb3Blbl9maWxlKQorICAgIHsKKyAgICAgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOworICAgIH0KK30KKworCit2b2lkCitsaXN0aW5nX2ZpbGUgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGZuID0gbmFtZTsKK30KKwordm9pZAorbGlzdGluZ19lamVjdCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAobGlzdGluZykKKyAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfRUpFQ1Q7Cit9CisKK3ZvaWQKK2xpc3RpbmdfZmxhZ3MgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgd2hpbGUgKCgqaW5wdXRfbGluZV9wb2ludGVyKyspICYmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicpKQorICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCit9CisKKy8qIFR1cm4gbGlzdGluZyBvbiBvciBvZmYuICBBbiBhcmd1bWVudCBvZiAwIG1lYW5zIHRvIHR1cm4gb2ZmCisgICBsaXN0aW5nLiAgQW4gYXJndW1lbnQgb2YgMSBtZWFucyB0byB0dXJuIG9uIGxpc3RpbmcuICBBbiBhcmd1bWVudAorICAgb2YgMiBtZWFucyB0byB0dXJuIG9mZiBsaXN0aW5nLCBidXQgYXMgb2YgdGhlIG5leHQgbGluZTsgdGhhdCBpcywKKyAgIHRoZSBjdXJyZW50IGxpbmUgc2hvdWxkIGJlIGxpc3RlZCwgYnV0IHRoZSBuZXh0IGxpbmUgc2hvdWxkIG5vdC4gICovCisKK3ZvaWQKK2xpc3RpbmdfbGlzdCAob24pCisgICAgIGludCBvbjsKK3sKKyAgaWYgKGxpc3RpbmcpCisgICAgeworICAgICAgc3dpdGNoIChvbikKKwl7CisJY2FzZSAwOgorCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKKwkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7CisJICBlbHNlCisJICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT0xJU1Q7CisJICBicmVhazsKKwljYXNlIDE6CisJICBpZiAobGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1QKKwkgICAgICB8fCBsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQorCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9ORTsKKwkgIGVsc2UKKwkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX0xJU1Q7CisJICBicmVhazsKKwljYXNlIDI6CisJICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUX05FWFQ7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgIH0KK30KKworCit2b2lkCitsaXN0aW5nX3BzaXplICh3aWR0aF9vbmx5KQorICAgICBpbnQgd2lkdGhfb25seTsKK3sKKyAgaWYgKCEgd2lkdGhfb25seSkKKyAgICB7CisgICAgICBwYXBlcl9oZWlnaHQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICAgICAgaWYgKHBhcGVyX2hlaWdodCA8IDAgfHwgcGFwZXJfaGVpZ2h0ID4gMTAwMCkKKwl7CisJICBwYXBlcl9oZWlnaHQgPSAwOworCSAgYXNfd2FybiAoXygic3RyYW5nZSBwYXBlciBoZWlnaHQsIHNldCB0byBubyBmb3JtIikpOworCX0KKworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorCXsKKwkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorCisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisKKyAgcGFwZXJfd2lkdGggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkCitsaXN0aW5nX25vcGFnZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBwYXBlcl9oZWlnaHQgPSAwOworfQorCit2b2lkCitsaXN0aW5nX3RpdGxlIChkZXB0aCkKKyAgICAgaW50IGRlcHRoOworeworICBpbnQgcXVvdGVkOworICBjaGFyICpzdGFydDsKKyAgY2hhciAqdHRsOworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKKyAgICBxdW90ZWQgPSAwOworICBlbHNlCisgICAgeworICAgICAgcXVvdGVkID0gMTsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKworICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKKyAgICB7CisgICAgICBpZiAocXVvdGVkCisJICA/ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJworCSAgOiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJeworCSAgaWYgKGxpc3RpbmcpCisJICAgIHsKKwkgICAgICBsZW5ndGggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBzdGFydDsKKwkgICAgICB0dGwgPSB4bWFsbG9jIChsZW5ndGggKyAxKTsKKwkgICAgICBtZW1jcHkgKHR0bCwgc3RhcnQsIGxlbmd0aCk7CisJICAgICAgdHRsW2xlbmd0aF0gPSAwOworCSAgICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBkZXB0aCA/IEVESUNUX1NCVFRMIDogRURJQ1RfVElUTEU7CisJICAgICAgbGlzdGluZ190YWlsLT5lZGljdF9hcmcgPSB0dGw7CisJICAgIH0KKwkgIGlmIChxdW90ZWQpCisJICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCisJeworCSAgYXNfYmFkIChfKCJOZXcgbGluZSBpbiB0aXRsZSIpKTsKKwkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCX0KKyAgICB9Cit9CisKKworCit2b2lkCitsaXN0aW5nX3NvdXJjZV9saW5lIChsaW5lKQorICAgICB1bnNpZ25lZCBpbnQgbGluZTsKK3sKKyAgaWYgKGxpc3RpbmcpCisgICAgeworICAgICAgbmV3X2ZyYWcgKCk7CisgICAgICBsaXN0aW5nX3RhaWwtPmhsbF9saW5lID0gbGluZTsKKyAgICAgIG5ld19mcmFnICgpOworICAgIH0KK30KKwordm9pZAorbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZSkKKyAgICAgY29uc3QgY2hhciAqZmlsZTsKK3sKKyAgaWYgKGxpc3RpbmcpCisgICAgbGlzdGluZ190YWlsLT5obGxfZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Cit9CisKKworCisjZWxzZQorCisKKy8qIER1bW15IGZ1bmN0aW9ucyBmb3Igd2hlbiBjb21waWxlZCB3aXRob3V0IGxpc3RpbmcgZW5hYmxlZCAqLworCit2b2lkCitsaXN0aW5nX2ZsYWdzIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHNfaWdub3JlICgwKTsKK30KKwordm9pZCAKK2xpc3RpbmdfbGlzdCAob24pCisgICAgIGludCBvbjsKK3sKKyAgc19pZ25vcmUgKDApOworfQorCit2b2lkIAorbGlzdGluZ19lamVjdCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzX2lnbm9yZSAoMCk7Cit9CisKK3ZvaWQgCitsaXN0aW5nX3BzaXplIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHNfaWdub3JlICgwKTsKK30KKwordm9pZAorbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgc19pZ25vcmUgKDApOworfQorCit2b2lkIAorbGlzdGluZ190aXRsZSAoZGVwdGgpCisgICAgIGludCBkZXB0aDsKK3sKKyAgc19pZ25vcmUgKDApOworfQorCit2b2lkCitsaXN0aW5nX2ZpbGUgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisKK30KKwordm9pZCAKK2xpc3RpbmdfbmV3bGluZSAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKworfQorCit2b2lkIAorbGlzdGluZ19zb3VyY2VfbGluZSAobikKKyAgICAgdW5zaWduZWQgaW50IG47Cit7CisKK30KK3ZvaWQgCitsaXN0aW5nX3NvdXJjZV9maWxlIChuKQorICAgICBjb25zdCBjaGFyICpuOworeworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuaCBiL2dhcy9saXN0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNWMzNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9saXN0aW5nLmgKQEAgLTAsMCArMSw2NyBAQAorLyogVGhpcyBmaWxlIGlzIGxpc3RpbmcuaAorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9fbGlzdGluZ19oX18KKyNkZWZpbmUgX19saXN0aW5nX2hfXworCisjZGVmaW5lIExJU1RJTkdfTElTVElORyAgICAxCisjZGVmaW5lIExJU1RJTkdfU1lNQk9MUyAgICAyCisjZGVmaW5lIExJU1RJTkdfTk9GT1JNICAgICA0CisjZGVmaW5lIExJU1RJTkdfSExMICAgICAgICA4CisjZGVmaW5lIExJU1RJTkdfTk9ERUJVRyAgIDE2CisjZGVmaW5lIExJU1RJTkdfTk9DT05ECSAgMzIKKyNkZWZpbmUgTElTVElOR19NQUNFWFAJICA2NAorCisjZGVmaW5lIExJU1RJTkdfREVGQVVMVCAgICAoTElTVElOR19MSVNUSU5HIHwgTElTVElOR19ITEwgfCBMSVNUSU5HX1NZTUJPTFMpCisKKyNpZm5kZWYgTk9fTElTVElORworI2RlZmluZSBMSVNUSU5HX05FV0xJTkUoKSB7IGlmIChsaXN0aW5nKSBsaXN0aW5nX25ld2xpbmUoTlVMTCk7IH0KKyNlbHNlCisjZGVmaW5lIExJU1RJTkdfTkVXTElORSgpIHs7fQorI2VuZGlmCisjZGVmaW5lIExJU1RJTkdfRU9GKCkgICAgIExJU1RJTkdfTkVXTElORSgpCisKKyNkZWZpbmUgTElTVElOR19TS0lQX0NPTkQoKSAoKGxpc3RpbmcgJiBMSVNUSU5HX05PQ09ORCkgIT0gMCkKKwordm9pZCBsaXN0aW5nX2VqZWN0IFBBUkFNUyAoKGludCkpOwordm9pZCBsaXN0aW5nX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKK3ZvaWQgbGlzdGluZ19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKK3ZvaWQgbGlzdGluZ19mbGFncyBQQVJBTVMgKChpbnQpKTsKK3ZvaWQgbGlzdGluZ19saXN0IFBBUkFNUyAoKGludCBvbikpOwordm9pZCBsaXN0aW5nX25ld2xpbmUgUEFSQU1TICgoY2hhciAqcHMpKTsKK3ZvaWQgbGlzdGluZ19wcmV2X2xpbmUgUEFSQU1TICgodm9pZCkpOwordm9pZCBsaXN0aW5nX3ByaW50IFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKK3ZvaWQgbGlzdGluZ19wc2l6ZSBQQVJBTVMgKChpbnQpKTsKK3ZvaWQgbGlzdGluZ19ub3BhZ2UgUEFSQU1TICgoaW50KSk7Cit2b2lkIGxpc3Rpbmdfc291cmNlX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Cit2b2lkIGxpc3Rpbmdfc291cmNlX2xpbmUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Cit2b2lkIGxpc3RpbmdfdGl0bGUgUEFSQU1TICgoaW50IGRlcHRoKSk7Cit2b2lkIGxpc3Rpbmdfd2FybmluZyBQQVJBTVMgKChjb25zdCBjaGFyICptZXNzYWdlKSk7Cit2b2lkIGxpc3Rpbmdfd2lkdGggUEFSQU1TICgodW5zaWduZWQgaW50IHgpKTsKKworZXh0ZXJuIGludCBsaXN0aW5nX2xoc193aWR0aDsKK2V4dGVybiBpbnQgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kOworZXh0ZXJuIGludCBsaXN0aW5nX2xoc19jb250X2xpbmVzOworZXh0ZXJuIGludCBsaXN0aW5nX3Joc193aWR0aDsKKworI2VuZGlmIC8qIF9fbGlzdGluZ19oX18gKi8KKworLyogZW5kIG9mIGxpc3RpbmcuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2xpdGVyYWwuYyBiL2dhcy9saXRlcmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmOGZjNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9saXRlcmFsLmMKQEAgLTAsMCArMSw5NSBAQAorLyogYXMuYyAtIEdBUyBsaXRlcmFsIHBvb2wgbWFuYWdlbWVudC4KKyAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4gKHJhZWJ1cm5AY3lnbnVzLmNvbSkuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKiBUaGlzIGlzbid0IHF1aXRlIGEgImNvbnN0YW50IiBwb29sLiAgU29tZSBvZiB0aGUgdmFsdWVzIG1heSBnZXQKKyAgIGFkanVzdGVkIGF0IHJ1biB0aW1lLCBlLmcuLCBmb3Igc3ltYm9saWMgcmVsb2NhdGlvbnMgd2hlbiBzaGFyZWQKKyAgIGxpYnJhcmllcyBhcmUgaW4gdXNlLiAgSXQncyBtb3JlIG9mIGEgImxpdGVyYWwiIHBvb2wuCisKKyAgIE9uIHRoZSBBbHBoYSwgdGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgLmxpdGEgYW5kIC5saXQ4LiAgKElzIHRoZXJlCisgICBldmVyIGEgLmxpdDQ/KSAgT24gdGhlIE1JUFMsIGl0IGNvdWxkIGJlIHVzZWQgZm9yIC5saXQ0IGFzIHdlbGwuCisKKyAgIFRoZSBleHByZXNzaW9ucyBwYXNzZWQgaGVyZSBzaG91bGQgY29udGFpbiBlaXRoZXIgY29uc3RhbnRzIG9yIHN5bWJvbHMsCisgICBub3QgYSBjb21iaW5hdGlvbiBvZiBib3RoLiAgVHlwaWNhbGx5LCB0aGUgY29uc3RhbnQgcG9vbCBpcyBhY2Nlc3NlZAorICAgd2l0aCBzb21lIHNvcnQgb2YgR1AgcmVnaXN0ZXIsIHNvIHRoZSBzaXplIG9mIHRoZSBwb29sIG11c3QgYmUga2VwdCBkb3duCisgICBpZiBwb3NzaWJsZS4gIFRoZSBleGNlcHRpb24gaXMgc2VjdGlvbiBvZmZzZXRzIC0tIGlmIHlvdSdyZSBzdG9yaW5nIGEKKyAgIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIC5kYXRhLCBmb3IgZXhhbXBsZSwgYW5kIHlvdXIgbWFjaGluZSBwcm92aWRlcworICAgZm9yIDE2LWJpdCBzaWduZWQgYWRkZW5kcywgeW91IG1pZ2h0IHdhbnQgdG8gc3RvcmUgLmRhdGErMzJLLCBzbyB0aGF0CisgICB5b3UgY2FuIGFjY2VzcyBhbGwgb2YgdGhlIGZpcnN0IDY0SyBvZiAuZGF0YSB3aXRoIHRoZSBvbmUgcG9pbnRlci4KKworICAgVGhpcyBpc24ndCBhIHJlcXVpcmVtZW50LCBqdXN0IGEgZ3VpZGVsaW5lIHRoYXQgY2FuIGhlbHAga2VlcCAubyBmaWxlCisgICBzaXplIGRvd24uICAqLworCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisKKyNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiBkZWZpbmVkIChORUVEX0xJVEVSQUxfUE9PTCkKKwordmFsdWVUCithZGRfdG9fbGl0ZXJhbF9wb29sIChzeW0sIGFkZGVuZCwgc2VjLCBzaXplKQorICAgICBzeW1ib2xTICpzeW07CisgICAgIHZhbHVlVCBhZGRlbmQ7CisgICAgIHNlZ1Qgc2VjOworICAgICBpbnQgc2l6ZTsKK3sKKyAgc2VnVCBjdXJyZW50X3NlY3Rpb24gPSBub3dfc2VnOworICBpbnQgY3VycmVudF9zdWJzZWMgPSBub3dfc3Vic2VnOworICB2YWx1ZVQgb2Zmc2V0OworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2NfdHlwZTsKKyAgY2hhciAqcDsKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKKyAgZml4UyAqZml4cDsKKworICBvZmZzZXQgPSAwOworICAvKiBAQCBUaGlzIGFzc3VtZXMgYWxsIGVudHJpZXMgaW4gYSBnaXZlbiBzZWN0aW9uIHdpbGwgYmUgb2YgdGhlIHNhbWUKKyAgICAgc2l6ZS4uLiAgUHJvYmFibHkgY29ycmVjdCwgYnV0IHVud2lzZSB0byByZWx5IG9uLiAgKi8KKyAgLyogVGhpcyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBzdWJzZWdtZW50LiAgKi8KKyAgaWYgKHNlZ2luZm8tPmZyY2hhaW5QKQorICAgIGZvciAoZml4cCA9IHNlZ2luZm8tPmZyY2hhaW5QLT5maXhfcm9vdDsKKwkgZml4cCAhPSAoZml4UyAqKSBOVUxMOworCSBmaXhwID0gZml4cC0+ZnhfbmV4dCwgb2Zmc2V0ICs9IHNpemUpCisgICAgICB7CisJaWYgKGZpeHAtPmZ4X2FkZHN5ID09IHN5bSAmJiBmaXhwLT5meF9vZmZzZXQgPT0gYWRkZW5kKQorCSAgcmV0dXJuIG9mZnNldDsKKyAgICAgIH0KKworICBzdWJzZWdfc2V0IChzZWMsIDApOworICBwID0gZnJhZ19tb3JlIChzaXplKTsKKyAgbWVtc2V0IChwLCAwLCBzaXplKTsKKworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgNDoKKyAgICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICByZWxvY190eXBlID0gQkZEX1JFTE9DXzY0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwgc3ltLCBhZGRlbmQsIDAsCisJICAgcmVsb2NfdHlwZSk7CisKKyAgc3Vic2VnX3NldCAoY3VycmVudF9zZWN0aW9uLCBjdXJyZW50X3N1YnNlYyk7CisgIG9mZnNldCA9IHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplOworICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSBzaXplOworICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KZGlmZiAtLWdpdCBhL2dhcy9tYWMtYXMuciBiL2dhcy9tYWMtYXMucgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzZjMDMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL21hYy1hcy5yCkBAIC0wLDAgKzEsNDIgQEAKKy8qIFJlc291cmNlcyBmb3IgR05VIEFTLiAqLworCisjaW5jbHVkZSAiU3lzVHlwZXMuciIKKworLyogVmVyc2lvbiByZXNvdXJjZXMuICovCisKK3Jlc291cmNlICd2ZXJzJyAoMSkgIHsKKwkwLAorCTAsCisJMCwKKwkwLAorCXZlclVzLAorCVZFUlNJT05fU1RSSU5HLAorCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKK307CisKK3Jlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgeworCTAsCisJMCwKKwkwLAorCTAsCisJdmVyVXMsCisJVkVSU0lPTl9TVFJJTkcsCisJIkdBUyAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKK307CisKKyNpZmRlZiBXQU5UX0NGUkcKKworI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCisKK3Jlc291cmNlICdjZnJnJyAoMCkgeworCXsKKwkJa1Bvd2VyUEMsCisJCWtGdWxsTGliLAorCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAorCQkwLDAsCisJCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAorCQlQUk9HX05BTUUKKwl9Cit9OworCisjZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uYyBiL2dhcy9tYWNyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvbWFjcm8uYwpAQCAtMCwwICsxLDEyNTkgQEAKKy8qIG1hY3JvLmMgLSBtYWNybyBzdXBwb3J0IGZvciBnYXMgYW5kIGdhc3AKKyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKKyAgICAgIHNhY0BjeWdudXMuY29tCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLworI2lmZGVmIF9fR05VQ19fCisjIGlmbmRlZiBhbGxvY2EKKyMgIGlmZGVmIF9fU1REQ19fCitleHRlcm4gdm9pZCAqYWxsb2NhICgpOworIyAgZWxzZQorZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBpZiBIQVZFX0FMTE9DQV9ICisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgZWxzZQorIyAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICBlbHNlCisjICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KKyMgICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQorZXh0ZXJuIGNoYXIgKmFsbG9jYSAoKTsKKyMgICAgZWxzZQorZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYgLyogX19TVERDX18sIF9faHB1eCAqLworIyAgIGVuZGlmIC8qIGFsbG9jYSAqLworIyAgZW5kaWYgLyogX0FJWCAqLworIyBlbmRpZiAvKiBIQVZFX0FMTE9DQV9IICovCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgInNiLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgIm1hY3JvLmgiCisKKyNpbmNsdWRlICJhc2ludGwuaCIKKworLyogVGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBoYW5kbGUgbWFjcm8gZGVmaW5pdGlvbiBhbmQgZXhwYW5zaW9uLgorICAgVGhleSBhcmUgY2FsbGVkIGJ5IGJvdGggZ2FzcCBhbmQgZ2FzLiAgKi8KKworLyogU3RydWN0dXJlcyB1c2VkIHRvIHN0b3JlIG1hY3Jvcy4gCisKKyAgIEVhY2ggbWFjcm8ga25vd3MgaXRzIG5hbWUgYW5kIGluY2x1ZGVkIHRleHQuICBJdCBnZXRzIGJ1aWx0IHdpdGggYQorICAgbGlzdCBvZiBmb3JtYWwgYXJndW1lbnRzLCBhbmQgYWxzbyBrZWVwcyBhIGhhc2ggdGFibGUgd2hpY2ggcG9pbnRzCisgICBpbnRvIHRoZSBsaXN0IHRvIHNwZWVkIHVwIGZvcm1hbCBzZWFyY2guICBFYWNoIGZvcm1hbCBrbm93cyBpdHMKKyAgIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLiAgRWFjaCB0aW1lIHRoZSBtYWNybyBpcyBleHBhbmRlZCwgdGhlCisgICBmb3JtYWxzIGdldCB0aGUgYWN0dWFsIHZhbHVlcyBhdHRhdGNoZWQgdG8gdGhlbS4gKi8KKworLyogZGVzY3JpYmUgdGhlIGZvcm1hbCBhcmd1bWVudHMgdG8gYSBtYWNybyAqLworCit0eXBlZGVmIHN0cnVjdCBmb3JtYWxfc3RydWN0CisgIHsKKyAgICBzdHJ1Y3QgZm9ybWFsX3N0cnVjdCAqbmV4dDsJLyogbmV4dCBmb3JtYWwgaW4gbGlzdCAqLworICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiB0aGUgZm9ybWFsICovCisgICAgc2IgZGVmOwkJCS8qIHRoZSBkZWZhdWx0IHZhbHVlICovCisgICAgc2IgYWN0dWFsOwkJCS8qIHRoZSBhY3R1YWwgYXJndW1lbnQgKGNoYW5nZWQgb24gZWFjaCBleHBhbnNpb24pICovCisgICAgaW50IGluZGV4OwkJCS8qIHRoZSBpbmRleCBvZiB0aGUgZm9ybWFsIDAuLmZvcm1hbF9jb3VudC0xICovCisgIH0KK2Zvcm1hbF9lbnRyeTsKKworLyogT3RoZXIgdmFsdWVzIGZvdW5kIGluIHRoZSBpbmRleCBmaWVsZCBvZiBhIGZvcm1hbF9lbnRyeS4gICovCisjZGVmaW5lIFFVQUxfSU5ERVggKC0xKQorI2RlZmluZSBOQVJHX0lOREVYICgtMikKKyNkZWZpbmUgTE9DQUxfSU5ERVggKC0zKQorCisvKiBkZXNjcmliZSB0aGUgbWFjcm8uICovCisKK3R5cGVkZWYgc3RydWN0IG1hY3JvX3N0cnVjdAorICB7CisgICAgc2Igc3ViOwkJCS8qIHN1YnN0aXR1dGlvbiB0ZXh0LiAqLworICAgIGludCBmb3JtYWxfY291bnQ7CQkvKiBudW1iZXIgb2YgZm9ybWFsIGFyZ3MuICovCisgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWxzOwkvKiBwb2ludGVyIHRvIGxpc3Qgb2YgZm9ybWFsX3N0cnVjdHMgKi8KKyAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpmb3JtYWxfaGFzaDsgLyogaGFzaCB0YWJsZSBvZiBmb3JtYWxzLiAqLworICB9CittYWNyb19lbnRyeTsKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGludCBnZXRfdG9rZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7CitzdGF0aWMgaW50IGdldHN0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKK3N0YXRpYyBpbnQgZ2V0X2FueV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQsIGludCkpOworc3RhdGljIGludCBkb19mb3JtYWxzIFBBUkFNUyAoKG1hY3JvX2VudHJ5ICosIGludCwgc2IgKikpOworc3RhdGljIGludCBnZXRfYXBvc3RfdG9rZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgc3ViX2FjdHVhbAorICBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgaW50LCBzYiAqLCBpbnQpKTsKK3N0YXRpYyBjb25zdCBjaGFyICptYWNyb19leHBhbmRfYm9keQorICBQQVJBTVMgKChzYiAqLCBzYiAqLCBmb3JtYWxfZW50cnkgKiwgc3RydWN0IGhhc2hfY29udHJvbCAqLCBpbnQsIGludCkpOworc3RhdGljIGNvbnN0IGNoYXIgKm1hY3JvX2V4cGFuZCBQQVJBTVMgKChpbnQsIHNiICosIG1hY3JvX2VudHJ5ICosIHNiICosIGludCkpOworCisjZGVmaW5lIElTV0hJVEUoeCkgKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcpCisKKyNkZWZpbmUgSVNTRVAoeCkgXAorICgoeCkgPT0gJyAnIHx8ICh4KSA9PSAnXHQnIHx8ICh4KSA9PSAnLCcgfHwgKHgpID09ICciJyB8fCAoeCkgPT0gJzsnIFwKKyAgfHwgKHgpID09ICcpJyB8fCAoeCkgPT0gJygnIFwKKyAgfHwgKChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSAmJiAoKHgpID09ICc8JyB8fCAoeCkgPT0gJz4nKSkpCisKKyNkZWZpbmUgSVNCQVNFKHgpIFwKKyAgKCh4KSA9PSAnYicgfHwgKHgpID09ICdCJyBcCisgICB8fCAoeCkgPT0gJ3EnIHx8ICh4KSA9PSAnUScgXAorICAgfHwgKHgpID09ICdoJyB8fCAoeCkgPT0gJ0gnIFwKKyAgIHx8ICh4KSA9PSAnZCcgfHwgKHgpID09ICdEJykKKworLyogVGhlIG1hY3JvIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbWFjcm9faGFzaDsKKworLyogV2hldGhlciBhbnkgbWFjcm9zIGhhdmUgYmVlbiBkZWZpbmVkLiAgKi8KKworaW50IG1hY3JvX2RlZmluZWQ7CisKKy8qIFdoZXRoZXIgd2UgYXJlIGluIEdBU1AgYWx0ZXJuYXRlIG1vZGUuICAqLworCitzdGF0aWMgaW50IG1hY3JvX2FsdGVybmF0ZTsKKworLyogV2hldGhlciB3ZSBhcmUgaW4gTVJJIG1vZGUuICAqLworCitzdGF0aWMgaW50IG1hY3JvX21yaTsKKworLyogV2hldGhlciB3ZSBzaG91bGQgc3RyaXAgJ0AnIGNoYXJhY3RlcnMuICAqLworCitzdGF0aWMgaW50IG1hY3JvX3N0cmlwX2F0OworCisvKiBGdW5jdGlvbiB0byB1c2UgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCisKK3N0YXRpYyBpbnQgKCptYWNyb19leHByKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKKworLyogTnVtYmVyIG9mIG1hY3JvIGV4cGFuc2lvbnMgdGhhdCBoYXZlIGJlZW4gZG9uZS4gICovCisKK3N0YXRpYyBpbnQgbWFjcm9fbnVtYmVyOworCisvKiBJbml0aWFsaXplIG1hY3JvIHByb2Nlc3NpbmcuICAqLworCit2b2lkCittYWNyb19pbml0IChhbHRlcm5hdGUsIG1yaSwgc3RyaXBfYXQsIGV4cHIpCisgICAgIGludCBhbHRlcm5hdGU7CisgICAgIGludCBtcmk7CisgICAgIGludCBzdHJpcF9hdDsKKyAgICAgaW50ICgqZXhwcikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSk7Cit7CisgIG1hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKKyAgbWFjcm9fZGVmaW5lZCA9IDA7CisgIG1hY3JvX2FsdGVybmF0ZSA9IGFsdGVybmF0ZTsKKyAgbWFjcm9fbXJpID0gbXJpOworICBtYWNyb19zdHJpcF9hdCA9IHN0cmlwX2F0OworICBtYWNyb19leHByID0gZXhwcjsKK30KKworLyogU3dpdGNoIGluIGFuZCBvdXQgb2YgTVJJIG1vZGUgb24gdGhlIGZseS4gICovCisKK3ZvaWQKK21hY3JvX21yaV9tb2RlIChtcmkpCisgICAgIGludCBtcmk7Cit7CisgIG1hY3JvX21yaSA9IG1yaTsKK30KKworLyogUmVhZCBpbnB1dCBsaW5lcyB0aWxsIHdlIGdldCB0byBhIFRPIHN0cmluZy4KKyAgIEluY3JlYXNlIG5lc3RpbmcgZGVwdGggaWYgd2UgZ2V0IGEgRlJPTSBzdHJpbmcuCisgICBQdXQgdGhlIHJlc3VsdHMgaW50byBzYiBhdCBQVFIuCisgICBBZGQgYSBuZXcgaW5wdXQgbGluZSB0byBhbiBzYiB1c2luZyBHRVRfTElORS4KKyAgIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gdW5leHBlY3RlZCBFT0YuICAqLworCitpbnQKK2J1ZmZlcl9hbmRfbmVzdCAoZnJvbSwgdG8sIHB0ciwgZ2V0X2xpbmUpCisgICAgIGNvbnN0IGNoYXIgKmZyb207CisgICAgIGNvbnN0IGNoYXIgKnRvOworICAgICBzYiAqcHRyOworICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOworeworICBpbnQgZnJvbV9sZW4gPSBzdHJsZW4gKGZyb20pOworICBpbnQgdG9fbGVuID0gc3RybGVuICh0byk7CisgIGludCBkZXB0aCA9IDE7CisgIGludCBsaW5lX3N0YXJ0ID0gcHRyLT5sZW47CisKKyAgaW50IG1vcmUgPSBnZXRfbGluZSAocHRyKTsKKworICB3aGlsZSAobW9yZSkKKyAgICB7CisgICAgICAvKiBUcnkgYW5kIGZpbmQgdGhlIGZpcnN0IHBzZXVkbyBvcCBvbiB0aGUgbGluZSAqLworICAgICAgaW50IGkgPSBsaW5lX3N0YXJ0OworCisgICAgICBpZiAoISBtYWNyb19hbHRlcm5hdGUgJiYgISBtYWNyb19tcmkpCisJeworCSAgLyogV2l0aCBub3JtYWwgc3ludGF4IHdlIGNhbiBzdWNrIHdoYXQgd2Ugd2FudCB0aWxsIHdlIGdldAorCSAgICAgdG8gdGhlIGRvdC4gIFdpdGggdGhlIGFsdGVybmF0ZSwgbGFiZWxzIGhhdmUgdG8gc3RhcnQgaW4KKwkgICAgIHRoZSBmaXJzdCBjb2x1bW4sIHNpbmNlIHdlIGNhbnQgdGVsbCB3aGF0J3MgYSBsYWJlbCBhbmQKKwkgICAgIHdoYXRzIGEgcHNldWRvb3AgKi8KKworCSAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKwkgIHdoaWxlIChpIDwgcHRyLT5sZW4gJiYgSVNXSElURSAocHRyLT5wdHJbaV0pKQorCSAgICBpKys7CisKKwkgIC8qIFNraXAgb3ZlciBhIGxhYmVsICovCisJICB3aGlsZSAoaSA8IHB0ci0+bGVuCisJCSAmJiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHB0ci0+cHRyW2ldKQorCQkgICAgIHx8IHB0ci0+cHRyW2ldID09ICdfJworCQkgICAgIHx8IHB0ci0+cHRyW2ldID09ICckJykpCisJICAgIGkrKzsKKworCSAgLyogQW5kIGEgY29sb24gKi8KKwkgIGlmIChpIDwgcHRyLT5sZW4KKwkgICAgICAmJiBwdHItPnB0cltpXSA9PSAnOicpCisJICAgIGkrKzsKKworCX0KKyAgICAgIC8qIFNraXAgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworICAgICAgd2hpbGUgKGkgPCBwdHItPmxlbiAmJiBJU1dISVRFIChwdHItPnB0cltpXSkpCisJaSsrOworCisgICAgICBpZiAoaSA8IHB0ci0+bGVuICYmIChwdHItPnB0cltpXSA9PSAnLicKKwkJCSAgIHx8IG1hY3JvX2FsdGVybmF0ZQorCQkJICAgfHwgbWFjcm9fbXJpKSkKKwl7CisJICBpZiAocHRyLT5wdHJbaV0gPT0gJy4nKQorCSAgICAgIGkrKzsKKwkgIGlmIChzdHJuY2FzZWNtcCAocHRyLT5wdHIgKyBpLCBmcm9tLCBmcm9tX2xlbikgPT0gMCkKKwkgICAgZGVwdGgrKzsKKwkgIGlmIChzdHJuY2FzZWNtcCAocHRyLT5wdHIgKyBpLCB0bywgdG9fbGVuKSA9PSAwKQorCSAgICB7CisJICAgICAgZGVwdGgtLTsKKwkgICAgICBpZiAoZGVwdGggPT0gMCkKKwkJeworCQkgIC8qIFJlc2V0IHRoZSBzdHJpbmcgdG8gbm90IGluY2x1ZGUgdGhlIGVuZGluZyBydW5lICovCisJCSAgcHRyLT5sZW4gPSBsaW5lX3N0YXJ0OworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEFkZCBhIENSIHRvIHRoZSBlbmQgYW5kIGtlZXAgcnVubmluZyAqLworICAgICAgc2JfYWRkX2NoYXIgKHB0ciwgJ1xuJyk7CisgICAgICBsaW5lX3N0YXJ0ID0gcHRyLT5sZW47CisgICAgICBtb3JlID0gZ2V0X2xpbmUgKHB0cik7CisgICAgfQorCisgIC8qIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gdW5leHBlY3RlZCBFT0YuICAqLworICByZXR1cm4gZGVwdGggPT0gMDsKK30KKworLyogUGljayB1cCBhIHRva2VuLiAgKi8KKworc3RhdGljIGludAorZ2V0X3Rva2VuIChpZHgsIGluLCBuYW1lKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIHNiICpuYW1lOworeworICBpZiAoaWR4IDwgaW4tPmxlbgorICAgICAgJiYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pCisJICB8fCBpbi0+cHRyW2lkeF0gPT0gJ18nCisJICB8fCBpbi0+cHRyW2lkeF0gPT0gJyQnKSkKKyAgICB7CisgICAgICBzYl9hZGRfY2hhciAobmFtZSwgaW4tPnB0cltpZHgrK10pOworICAgICAgd2hpbGUgKGlkeCA8IGluLT5sZW4KKwkgICAgICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHhdKQorCQkgfHwgaW4tPnB0cltpZHhdID09ICdfJworCQkgfHwgaW4tPnB0cltpZHhdID09ICckJykpCisJeworCSAgc2JfYWRkX2NoYXIgKG5hbWUsIGluLT5wdHJbaWR4KytdKTsKKwl9CisgICAgfQorICAvKiBJZ25vcmUgdHJhaWxpbmcgJiAqLworICBpZiAobWFjcm9fYWx0ZXJuYXRlICYmIGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcmJykKKyAgICBpZHgrKzsKKyAgcmV0dXJuIGlkeDsKK30KKworLyogUGljayB1cCBhIHN0cmluZy4gICovCisKK3N0YXRpYyBpbnQKK2dldHN0cmluZyAoaWR4LCBpbiwgYWNjKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIHNiICphY2M7Cit7CisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworCisgIHdoaWxlIChpZHggPCBpbi0+bGVuCisJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInIAorCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnPCcgJiYgKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpKQorCSAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnXCcnICYmIG1hY3JvX2FsdGVybmF0ZSkpKQorICAgIHsKKyAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQorCXsKKwkgIGludCBuZXN0ID0gMDsKKwkgIGlkeCsrOworCSAgd2hpbGUgKChpbi0+cHRyW2lkeF0gIT0gJz4nIHx8IG5lc3QpCisJCSAmJiBpZHggPCBpbi0+bGVuKQorCSAgICB7CisJICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIScpCisJCXsKKwkJICBpZHgrKyAgOworCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJz4nKQorCQkgICAgbmVzdC0tOworCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJzwnKQorCQkgICAgbmVzdCsrOworCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKKwkJfQorCSAgICB9CisJICBpZHgrKzsKKwl9CisgICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQorCXsKKwkgIGNoYXIgdGNoYXIgPSBpbi0+cHRyW2lkeF07CisJICBpZHgrKzsKKwkgIHdoaWxlIChpZHggPCBpbi0+bGVuKQorCSAgICB7CisJICAgICAgaWYgKG1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJyEnKQorCQl7CisJCSAgaWR4KysgIDsKKwkJICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoaW4tPnB0cltpZHhdID09IHRjaGFyKQorCQkgICAgeworCQkgICAgICBpZHgrKzsKKwkJICAgICAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKKwkJCWJyZWFrOworCQkgICAgfQorCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4XSk7CisJCSAgaWR4Kys7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIAorICByZXR1cm4gaWR4OworfQorCisvKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAorICAgcnVsZXM6CisgICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCisgICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKKyAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCisgICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6CisqLworCitzdGF0aWMgaW50CitnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgb3V0LCBleHBhbmQsIHByZXRlbmRfcXVvdGVkKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIHNiICpvdXQ7CisgICAgIGludCBleHBhbmQ7CisgICAgIGludCBwcmV0ZW5kX3F1b3RlZDsKK3sKKyAgc2JfcmVzZXQgKG91dCk7CisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworCisgIGlmIChpZHggPCBpbi0+bGVuKQorICAgIHsKKyAgICAgIGlmIChpbi0+bGVuID4gMiAmJiBpbi0+cHRyW2lkeCsxXSA9PSAnXCcnICYmIElTQkFTRSAoaW4tPnB0cltpZHhdKSkKKwl7CisJICB3aGlsZSAoIUlTU0VQIChpbi0+cHRyW2lkeF0pKQorCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CisJfQorICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICclJworCSAgICAgICAmJiBtYWNyb19hbHRlcm5hdGUKKwkgICAgICAgJiYgZXhwYW5kKQorCXsKKwkgIGludCB2YWw7CisJICBjaGFyIGJ1ZlsyMF07CisJICAvKiBUdXJucyB0aGUgbmV4dCBleHByZXNzaW9uIGludG8gYSBzdHJpbmcgKi8KKwkgIGlkeCA9ICgqbWFjcm9fZXhwcikgKF8oIiUgb3BlcmF0b3IgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiIpLAorCQkJICAgICAgIGlkeCArIDEsCisJCQkgICAgICAgaW4sCisJCQkgICAgICAgJnZhbCk7CisJICBzcHJpbnRmKGJ1ZiwgIiVkIiwgdmFsKTsKKwkgIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmKTsKKwl9CisgICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInCisJICAgICAgIHx8IChpbi0+cHRyW2lkeF0gPT0gJzwnICYmIChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKSkKKwkgICAgICAgfHwgKG1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW2lkeF0gPT0gJ1wnJykpCisJeworCSAgaWYgKG1hY3JvX2FsdGVybmF0ZQorCSAgICAgICYmICEgbWFjcm9fc3RyaXBfYXQKKwkgICAgICAmJiBleHBhbmQpCisJICAgIHsKKwkgICAgICAvKiBLZWVwIHRoZSBxdW90ZXMgKi8KKwkgICAgICBzYl9hZGRfY2hhciAob3V0LCAgJ1wiJyk7CisKKwkgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIAorCXsKKwkgIHdoaWxlIChpZHggPCBpbi0+bGVuIAorCQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicKKwkJICAgICB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJworCQkgICAgIHx8IHByZXRlbmRfcXVvdGVkIAorCQkgICAgIHx8IChpbi0+cHRyW2lkeF0gIT0gJyAnCisJCQkgJiYgaW4tPnB0cltpZHhdICE9ICdcdCcKKwkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gJywnCisJCQkgJiYgKGluLT5wdHJbaWR4XSAhPSAnPCcKKwkJCSAgICAgfHwgKCEgbWFjcm9fYWx0ZXJuYXRlICYmICEgbWFjcm9fbXJpKSkpKSkKKwkgICAgeworCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInIAorCQkgIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnKQorCQl7CisJCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKKwkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CisJCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KKwkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gdGNoYXIpCisJCSAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CQkgICAgCisJCSAgaWYgKGlkeCA9PSBpbi0+bGVuKQorCQkgICAgcmV0dXJuIGlkeDsJICAgICAgCisJCX0KKwkgICAgICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeCsrXSk7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBpZHg7Cit9CisKKy8qIFBpY2sgdXAgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgbWFjcm8gZGVmaW5pdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK2RvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKQorICAgICBtYWNyb19lbnRyeSAqbWFjcm87CisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKK3sKKyAgZm9ybWFsX2VudHJ5ICoqcCA9ICZtYWNyby0+Zm9ybWFsczsKKworICBtYWNyby0+Zm9ybWFsX2NvdW50ID0gMDsKKyAgbWFjcm8tPmZvcm1hbF9oYXNoID0gaGFzaF9uZXcgKCk7CisgIHdoaWxlIChpZHggPCBpbi0+bGVuKQorICAgIHsKKyAgICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsOworCisgICAgICBmb3JtYWwgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7CisKKyAgICAgIHNiX25ldyAoJmZvcm1hbC0+bmFtZSk7CisgICAgICBzYl9uZXcgKCZmb3JtYWwtPmRlZik7CisgICAgICBzYl9uZXcgKCZmb3JtYWwtPmFjdHVhbCk7CisKKyAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworICAgICAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmZm9ybWFsLT5uYW1lKTsKKyAgICAgIGlmIChmb3JtYWwtPm5hbWUubGVuID09IDApCisJYnJlYWs7CisgICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKyAgICAgIGlmIChmb3JtYWwtPm5hbWUubGVuKQorCXsKKwkgIC8qIFRoaXMgaXMgYSBmb3JtYWwgKi8KKwkgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnPScpCisJICAgIHsKKwkgICAgICAvKiBHb3QgYSBkZWZhdWx0ICovCisJICAgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmZm9ybWFsLT5kZWYsIDEsIDApOworCSAgICB9CisJfQorCisgICAgICAvKiBBZGQgdG8gbWFjcm8ncyBoYXNoIHRhYmxlICovCisgICAgICBoYXNoX2phbSAobWFjcm8tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZmb3JtYWwtPm5hbWUpLCBmb3JtYWwpOworCisgICAgICBmb3JtYWwtPmluZGV4ID0gbWFjcm8tPmZvcm1hbF9jb3VudDsKKyAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOworICAgICAgbWFjcm8tPmZvcm1hbF9jb3VudCsrOworICAgICAgKnAgPSBmb3JtYWw7CisgICAgICBwID0gJmZvcm1hbC0+bmV4dDsKKyAgICAgICpwID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKG1hY3JvX21yaSkKKyAgICB7CisgICAgICBmb3JtYWxfZW50cnkgKmZvcm1hbDsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgIC8qIEFkZCBhIHNwZWNpYWwgTkFSRyBmb3JtYWwsIHdoaWNoIG1hY3JvX2V4cGFuZCB3aWxsIHNldCB0byB0aGUKKyAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICAqLworICAgICAgZm9ybWFsID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOworCisgICAgICBzYl9uZXcgKCZmb3JtYWwtPm5hbWUpOworICAgICAgc2JfbmV3ICgmZm9ybWFsLT5kZWYpOworICAgICAgc2JfbmV3ICgmZm9ybWFsLT5hY3R1YWwpOworCisgICAgICAvKiBUaGUgc2FtZSBNUkkgYXNzZW1ibGVycyB3aGljaCB0cmVhdCAnQCcgY2hhcmFjdGVycyBhbHNvIHVzZQorICAgICAgICAgdGhlIG5hbWUgJE5BUkcuICBBdCBsZWFzdCB1bnRpbCB3ZSBmaW5kIGFuIGV4Y2VwdGlvbi4gICovCisgICAgICBpZiAobWFjcm9fc3RyaXBfYXQpCisJbmFtZSA9ICIkTkFSRyI7CisgICAgICBlbHNlCisJbmFtZSA9ICJOQVJHIjsKKworICAgICAgc2JfYWRkX3N0cmluZyAoJmZvcm1hbC0+bmFtZSwgbmFtZSk7CisKKyAgICAgIC8qIEFkZCB0byBtYWNybydzIGhhc2ggdGFibGUgKi8KKyAgICAgIGhhc2hfamFtIChtYWNyby0+Zm9ybWFsX2hhc2gsIG5hbWUsIGZvcm1hbCk7CisKKyAgICAgIGZvcm1hbC0+aW5kZXggPSBOQVJHX0lOREVYOworICAgICAgKnAgPSBmb3JtYWw7CisgICAgICBmb3JtYWwtPm5leHQgPSBOVUxMOworICAgIH0KKworICByZXR1cm4gaWR4OworfQorCisvKiBEZWZpbmUgYSBuZXcgbWFjcm8uICBSZXR1cm5zIE5VTEwgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIHJldHVybnMgYW4KKyAgIGVycm9yIG1lc3NhZ2UuICBJZiBOQU1FUCBpcyBub3QgTlVMTCwgKk5BTUVQIGlzIHNldCB0byB0aGUgbmFtZSBvZgorICAgdGhlIG1hY3JvIHdoaWNoIHdhcyBkZWZpbmVkLiAgKi8KKworY29uc3QgY2hhciAqCitkZWZpbmVfbWFjcm8gKGlkeCwgaW4sIGxhYmVsLCBnZXRfbGluZSwgbmFtZXApCisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgc2IgKmxhYmVsOworICAgICBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpOworICAgICBjb25zdCBjaGFyICoqbmFtZXA7Cit7CisgIG1hY3JvX2VudHJ5ICptYWNybzsKKyAgc2IgbmFtZTsKKyAgY29uc3QgY2hhciAqbmFtZXN0cjsKKworICBtYWNybyA9IChtYWNyb19lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKG1hY3JvX2VudHJ5KSk7CisgIHNiX25ldyAoJm1hY3JvLT5zdWIpOworICBzYl9uZXcgKCZuYW1lKTsKKworICBtYWNyby0+Zm9ybWFsX2NvdW50ID0gMDsKKyAgbWFjcm8tPmZvcm1hbHMgPSAwOworCisgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOworICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJNQUNSTyIsICJFTkRNIiwgJm1hY3JvLT5zdWIsIGdldF9saW5lKSkKKyAgICByZXR1cm4gXygidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtYWNybyBkZWZpbml0aW9uIik7CisgIGlmIChsYWJlbCAhPSBOVUxMICYmIGxhYmVsLT5sZW4gIT0gMCkKKyAgICB7CisgICAgICBzYl9hZGRfc2IgKCZuYW1lLCBsYWJlbCk7CisgICAgICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJygnKQorCXsKKwkgIC8qIEl0J3MgdGhlIGxhYmVsOiBNQUNSTyAoZm9ybWFscywuLi4pICBzb3J0ICovCisJICBpZHggPSBkb19mb3JtYWxzIChtYWNybywgaWR4ICsgMSwgaW4pOworCSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnKScpCisJICAgIHJldHVybiBfKCJtaXNzaW5nICkgYWZ0ZXIgZm9ybWFscyIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBJdCdzIHRoZSBsYWJlbDogTUFDUk8gZm9ybWFscywuLi4gIHNvcnQgKi8KKwkgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCAmbmFtZSk7CisgICAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKKyAgICAgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHgsIGluKTsKKyAgICB9CisKKyAgLyogYW5kIHN0aWNrIGl0IGluIHRoZSBtYWNybyBoYXNoIHRhYmxlICovCisgIGZvciAoaWR4ID0gMDsgaWR4IDwgbmFtZS5sZW47IGlkeCsrKQorICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgbmFtZS5wdHJbaWR4XSkpCisgICAgICBuYW1lLnB0cltpZHhdID0gdG9sb3dlciAobmFtZS5wdHJbaWR4XSk7CisgIG5hbWVzdHIgPSBzYl90ZXJtaW5hdGUgKCZuYW1lKTsKKyAgaGFzaF9qYW0gKG1hY3JvX2hhc2gsIG5hbWVzdHIsIChQVFIpIG1hY3JvKTsKKworICBtYWNyb19kZWZpbmVkID0gMTsKKworICBpZiAobmFtZXAgIT0gTlVMTCkKKyAgICAqbmFtZXAgPSBuYW1lc3RyOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBTY2FuIGEgdG9rZW4sIGFuZCB0aGVuIHNraXAgS0lORC4gICovCisKK3N0YXRpYyBpbnQKK2dldF9hcG9zdF90b2tlbiAoaWR4LCBpbiwgbmFtZSwga2luZCkKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKmluOworICAgICBzYiAqbmFtZTsKKyAgICAgaW50IGtpbmQ7Cit7CisgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgbmFtZSk7CisgIGlmIChpZHggPCBpbi0+bGVuCisgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0ga2luZAorICAgICAgJiYgKCEgbWFjcm9fbXJpIHx8IG1hY3JvX3N0cmlwX2F0KQorICAgICAgJiYgKCEgbWFjcm9fc3RyaXBfYXQgfHwga2luZCA9PSAnQCcpKQorICAgIGlkeCsrOworICByZXR1cm4gaWR4OworfQorCisvKiBTdWJzdGl0dXRlIHRoZSBhY3R1YWwgdmFsdWUgZm9yIGEgZm9ybWFsIHBhcmFtZXRlci4gICovCisKK3N0YXRpYyBpbnQKK3N1Yl9hY3R1YWwgKHN0YXJ0LCBpbiwgdCwgZm9ybWFsX2hhc2gsIGtpbmQsIG91dCwgY29weWlmbm90dGhlcmUpCisgICAgIGludCBzdGFydDsKKyAgICAgc2IgKmluOworICAgICBzYiAqdDsKKyAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqZm9ybWFsX2hhc2g7CisgICAgIGludCBraW5kOworICAgICBzYiAqb3V0OworICAgICBpbnQgY29weWlmbm90dGhlcmU7Cit7CisgIGludCBzcmM7CisgIGZvcm1hbF9lbnRyeSAqcHRyOworCisgIHNyYyA9IGdldF9hcG9zdF90b2tlbiAoc3RhcnQsIGluLCB0LCBraW5kKTsKKyAgLyogU2VlIGlmIGl0J3MgaW4gdGhlIG1hY3JvJ3MgaGFzaCB0YWJsZSwgdW5sZXNzIHRoaXMgaXMKKyAgICAgbWFjcm9fc3RyaXBfYXQgYW5kIGtpbmQgaXMgJ0AnIGFuZCB0aGUgdG9rZW4gZGlkIG5vdCBlbmQgaW4gJ0AnLiAgKi8KKyAgaWYgKG1hY3JvX3N0cmlwX2F0CisgICAgICAmJiBraW5kID09ICdAJworICAgICAgJiYgKHNyYyA9PSBzdGFydCB8fCBpbi0+cHRyW3NyYyAtIDFdICE9ICdAJykpCisgICAgcHRyID0gTlVMTDsKKyAgZWxzZQorICAgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICh0KSk7CisgIGlmIChwdHIpCisgICAgeworICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbikKKwl7CisJICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+YWN0dWFsKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc2JfYWRkX3NiIChvdXQsICZwdHItPmRlZik7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoa2luZCA9PSAnJicpCisgICAgeworICAgICAgLyogRG9pbmcgdGhpcyBwZXJtaXRzIHBlb3BsZSB0byB1c2UgJiBpbiBtYWNybyBib2RpZXMuICAqLworICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyYnKTsKKyAgICB9CisgIGVsc2UgaWYgKGNvcHlpZm5vdHRoZXJlKQorICAgIHsKKyAgICAgIHNiX2FkZF9zYiAob3V0LCB0KTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ1xcJyk7CisgICAgICBzYl9hZGRfc2IgKG91dCwgdCk7CisgICAgfQorICByZXR1cm4gc3JjOworfQorCisvKiBFeHBhbmQgdGhlIGJvZHkgb2YgYSBtYWNyby4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK21hY3JvX2V4cGFuZF9ib2R5IChpbiwgb3V0LCBmb3JtYWxzLCBmb3JtYWxfaGFzaCwgY29tbWVudF9jaGFyLCBsb2NhbHMpCisgICAgIHNiICppbjsKKyAgICAgc2IgKm91dDsKKyAgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWxzOworICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpmb3JtYWxfaGFzaDsKKyAgICAgaW50IGNvbW1lbnRfY2hhcjsKKyAgICAgaW50IGxvY2FsczsKK3sKKyAgc2IgdDsKKyAgaW50IHNyYyA9IDA7CisgIGludCBpbnF1b3RlID0gMDsKKyAgZm9ybWFsX2VudHJ5ICpsb2NsaXN0ID0gTlVMTDsKKworICBzYl9uZXcgKCZ0KTsKKworICB3aGlsZSAoc3JjIDwgaW4tPmxlbikKKyAgICB7CisgICAgICBpZiAoaW4tPnB0cltzcmNdID09ICcmJykKKwl7CisJICBzYl9yZXNldCAoJnQpOworCSAgaWYgKG1hY3JvX21yaSkKKwkgICAgeworCSAgICAgIGlmIChzcmMgKyAxIDwgaW4tPmxlbiAmJiBpbi0+cHRyW3NyYyArIDFdID09ICcmJykKKwkJc3JjID0gc3ViX2FjdHVhbCAoc3JjICsgMiwgaW4sICZ0LCBmb3JtYWxfaGFzaCwgJ1wnJywgb3V0LCAxKTsKKwkgICAgICBlbHNlCisJCXNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRklYTUU6IFdoeSBkbyB3ZSBkbyB0aGlzPyAgKi8KKwkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMgKyAxLCBpbiwgJnQsIGZvcm1hbF9oYXNoLCAnJicsIG91dCwgMCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJ1xcJykKKwl7CisJICBzcmMrKzsKKwkgIGlmIChpbi0+cHRyW3NyY10gPT0gY29tbWVudF9jaGFyICYmIGNvbW1lbnRfY2hhciAhPSAnXDAnKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIGNvbW1lbnQsIGp1c3QgZHJvcCB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLworCSAgICAgIHdoaWxlIChzcmMgPCBpbi0+bGVuCisJCSAgICAgJiYgaW4tPnB0cltzcmNdICE9ICdcbicpCisJCXNyYysrOworCSAgICB9CisJICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJygnKQorCSAgICB7CisJICAgICAgLyogU3ViIGluIHRpbGwgdGhlIG5leHQgJyknIGxpdGVyYWxseSAqLworCSAgICAgIHNyYysrOworCSAgICAgIHdoaWxlIChzcmMgPCBpbi0+bGVuICYmIGluLT5wdHJbc3JjXSAhPSAnKScpCisJCXsKKwkJICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7CisJCX0KKwkgICAgICBpZiAoaW4tPnB0cltzcmNdID09ICcpJykKKwkJc3JjKys7CisJICAgICAgZWxzZQorCQlyZXR1cm4gXygibWlzc3BsYWNlZCApIik7CisJICAgIH0KKwkgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnQCcpCisJICAgIHsKKwkgICAgICAvKiBTdWIgaW4gdGhlIG1hY3JvIGludm9jYXRpb24gbnVtYmVyICovCisKKwkgICAgICBjaGFyIGJ1ZmZlclsxMF07CisJICAgICAgc3JjKys7CisJICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJTA1ZCIsIG1hY3JvX251bWJlcik7CisJICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOworCSAgICB9CisJICBlbHNlIGlmIChpbi0+cHRyW3NyY10gPT0gJyYnKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIHByZXByb2Nlc3NvciB2YXJpYWJsZSBuYW1lLCB3ZSBkb24ndCBkbyB0aGVtCisJCSBoZXJlICovCisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJ1xcJyk7CisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyYnKTsKKwkgICAgICBzcmMrKzsKKwkgICAgfQorCSAgZWxzZSBpZiAobWFjcm9fbXJpCisJCSAgICYmIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pKQorCSAgICB7CisJICAgICAgaW50IGluZDsKKwkgICAgICBmb3JtYWxfZW50cnkgKmY7CisKKwkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkpCisJCWluZCA9IGluLT5wdHJbc3JjXSAtICcwJzsKKwkgICAgICBlbHNlIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKSkKKwkJaW5kID0gaW4tPnB0cltzcmNdIC0gJ0EnICsgMTA7CisJICAgICAgZWxzZQorCQlpbmQgPSBpbi0+cHRyW3NyY10gLSAnYScgKyAxMDsKKwkgICAgICArK3NyYzsKKwkgICAgICBmb3IgKGYgPSBmb3JtYWxzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorCQl7CisJCSAgaWYgKGYtPmluZGV4ID09IGluZCAtIDEpCisJCSAgICB7CisJCSAgICAgIGlmIChmLT5hY3R1YWwubGVuICE9IDApCisJCQlzYl9hZGRfc2IgKG91dCwgJmYtPmFjdHVhbCk7CisJCSAgICAgIGVsc2UKKwkJCXNiX2FkZF9zYiAob3V0LCAmZi0+ZGVmKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc2JfcmVzZXQgKCZ0KTsKKwkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMsIGluLCAmdCwgZm9ybWFsX2hhc2gsICdcJycsIG91dCwgMCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkKKwkgICAgICAgJiYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pCisJCSAgIHx8IGluLT5wdHJbc3JjXSA9PSAnXycKKwkJICAgfHwgaW4tPnB0cltzcmNdID09ICckJykKKwkgICAgICAgJiYgKCEgaW5xdW90ZQorCQkgICB8fCAhIG1hY3JvX3N0cmlwX2F0CisJCSAgIHx8IChzcmMgPiAwICYmIGluLT5wdHJbc3JjIC0gMV0gPT0gJ0AnKSkpCisJeworCSAgaWYgKCEgbG9jYWxzCisJICAgICAgfHwgc3JjICsgNSA+PSBpbi0+bGVuCisJICAgICAgfHwgc3RybmNhc2VjbXAgKGluLT5wdHIgKyBzcmMsICJMT0NBTCIsIDUpICE9IDAKKwkgICAgICB8fCAhIElTV0hJVEUgKGluLT5wdHJbc3JjICsgNV0pKQorCSAgICB7CisJICAgICAgc2JfcmVzZXQgKCZ0KTsKKwkgICAgICBzcmMgPSBzdWJfYWN0dWFsIChzcmMsIGluLCAmdCwgZm9ybWFsX2hhc2gsCisJCQkJKG1hY3JvX3N0cmlwX2F0ICYmIGlucXVvdGUpID8gJ0AnIDogJ1wnJywKKwkJCQlvdXQsIDEpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmb3JtYWxfZW50cnkgKmY7CisKKwkgICAgICBzcmMgPSBzYl9za2lwX3doaXRlIChzcmMgKyA1LCBpbik7CisJICAgICAgd2hpbGUgKGluLT5wdHJbc3JjXSAhPSAnXG4nICYmIGluLT5wdHJbc3JjXSAhPSBjb21tZW50X2NoYXIpCisJCXsKKwkJICBzdGF0aWMgaW50IGxvY2NudDsKKwkJICBjaGFyIGJ1ZlsyMF07CisJCSAgY29uc3QgY2hhciAqZXJyOworCisJCSAgZiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKKwkJICBzYl9uZXcgKCZmLT5uYW1lKTsKKwkJICBzYl9uZXcgKCZmLT5kZWYpOworCQkgIHNiX25ldyAoJmYtPmFjdHVhbCk7CisJCSAgZi0+aW5kZXggPSBMT0NBTF9JTkRFWDsKKwkJICBmLT5uZXh0ID0gbG9jbGlzdDsKKwkJICBsb2NsaXN0ID0gZjsKKworCQkgIHNyYyA9IGdldF90b2tlbiAoc3JjLCBpbiwgJmYtPm5hbWUpOworCQkgICsrbG9jY250OworCQkgIHNwcmludGYgKGJ1ZiwgIkxMJTA0eCIsIGxvY2NudCk7CisJCSAgc2JfYWRkX3N0cmluZyAoJmYtPmFjdHVhbCwgYnVmKTsKKworCQkgIGVyciA9IGhhc2hfamFtIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmZi0+bmFtZSksIGYpOworCQkgIGlmIChlcnIgIT0gTlVMTCkKKwkJICAgIHJldHVybiBlcnI7CisKKwkJICBzcmMgPSBzYl9za2lwX2NvbW1hIChzcmMsIGluKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoY29tbWVudF9jaGFyICE9ICdcMCcKKwkgICAgICAgJiYgaW4tPnB0cltzcmNdID09IGNvbW1lbnRfY2hhcgorCSAgICAgICAmJiBzcmMgKyAxIDwgaW4tPmxlbgorCSAgICAgICAmJiBpbi0+cHRyW3NyYyArIDFdID09IGNvbW1lbnRfY2hhcgorCSAgICAgICAmJiAhaW5xdW90ZSkKKwl7CisJICAvKiBUd28gY29tbWVudCBjaGFycyBpbiBhIHJvdyBjYXVzZSB0aGUgcmVzdCBvZiB0aGUgbGluZSB0bworICAgICAgICAgICAgIGJlIGRyb3BwZWQuICAqLworCSAgd2hpbGUgKHNyYyA8IGluLT5sZW4gJiYgaW4tPnB0cltzcmNdICE9ICdcbicpCisJICAgIHNyYysrOworCX0KKyAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnIicKKwkgICAgICAgfHwgKG1hY3JvX21yaSAmJiBpbi0+cHRyW3NyY10gPT0gJ1wnJykpCisJeworCSAgaW5xdW90ZSA9ICFpbnF1b3RlOworCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOworCX0KKyAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnQCcgJiYgbWFjcm9fc3RyaXBfYXQpCisJeworCSAgKytzcmM7CisJICBpZiAoc3JjIDwgaW4tPmxlbgorCSAgICAgICYmIGluLT5wdHJbc3JjXSA9PSAnQCcpCisJICAgIHsKKwkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnQCcpOworCSAgICAgICsrc3JjOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAobWFjcm9fbXJpCisJICAgICAgICYmIGluLT5wdHJbc3JjXSA9PSAnPScKKwkgICAgICAgJiYgc3JjICsgMSA8IGluLT5sZW4KKwkgICAgICAgJiYgaW4tPnB0cltzcmMgKyAxXSA9PSAnPScpCisJeworCSAgZm9ybWFsX2VudHJ5ICpwdHI7CisKKwkgIHNiX3Jlc2V0ICgmdCk7CisJICBzcmMgPSBnZXRfdG9rZW4gKHNyYyArIDIsIGluLCAmdCk7CisJICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKKwkgIGlmIChwdHIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHJldHVybiBhIHdhcm5pbmcgc3RyaW5nIGhlcmUsCisgICAgICAgICAgICAgICAgIGJ1dCB3ZSBjYW4ndCwgYmVjYXVzZSB0aGUgPT0gbWlnaHQgYmUgaW4gdGhlIE1SSQorICAgICAgICAgICAgICAgICBjb21tZW50IGZpZWxkLCBhbmQsIHNpbmNlIHRoZSBuYXR1cmUgb2YgdGhlIE1SSQorICAgICAgICAgICAgICAgICBjb21tZW50IGZpZWxkIGRlcGVuZHMgdXBvbiB0aGUgZXhhY3QgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgYmVpbmcgdXNlZCwgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gaGVyZSB0bworICAgICAgICAgICAgICAgICBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgaXMgb3Igbm90LiAgSW5zdGVhZCwgd2UgbGVhdmUKKyAgICAgICAgICAgICAgICAgdGhlID09IGluIHBsYWNlLCB3aGljaCBzaG91bGQgY2F1c2UgYSBzeW50YXggZXJyb3IgaWYKKyAgICAgICAgICAgICAgICAgaXQgaXMgbm90IGluIGEgY29tbWVudC4gICovCisJICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJz0nKTsKKwkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnPScpOworCSAgICAgIHNiX2FkZF9zYiAob3V0LCAmdCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4pCisJCXsKKwkJICBzYl9hZGRfc3RyaW5nIChvdXQsICItMSIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc2JfYWRkX2NoYXIgKG91dCwgJzAnKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKKwl9CisgICAgfQorCisgIHNiX2tpbGwgKCZ0KTsKKworICB3aGlsZSAobG9jbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvcm1hbF9lbnRyeSAqZjsKKworICAgICAgZiA9IGxvY2xpc3QtPm5leHQ7CisgICAgICBoYXNoX2RlbGV0ZSAoZm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJmxvY2xpc3QtPm5hbWUpKTsKKyAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5uYW1lKTsKKyAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5kZWYpOworICAgICAgc2Jfa2lsbCAoJmxvY2xpc3QtPmFjdHVhbCk7CisgICAgICBmcmVlIChsb2NsaXN0KTsKKyAgICAgIGxvY2xpc3QgPSBmOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogQXNzaWduIHZhbHVlcyB0byB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBtYWNybywgYW5kIGV4cGFuZCB0aGUKKyAgIGJvZHkuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCittYWNyb19leHBhbmQgKGlkeCwgaW4sIG0sIG91dCwgY29tbWVudF9jaGFyKQorICAgICBpbnQgaWR4OworICAgICBzYiAqaW47CisgICAgIG1hY3JvX2VudHJ5ICptOworICAgICBzYiAqb3V0OworICAgICBpbnQgY29tbWVudF9jaGFyOworeworICBzYiB0OworICBmb3JtYWxfZW50cnkgKnB0cjsKKyAgZm9ybWFsX2VudHJ5ICpmOworICBpbnQgaXNfcG9zaXRpb25hbCA9IDA7CisgIGludCBpc19rZXl3b3JkID0gMDsKKyAgaW50IG5hcmcgPSAwOworICBjb25zdCBjaGFyICplcnI7CisKKyAgc2JfbmV3ICgmdCk7CisgIAorICAvKiBSZXNldCBhbnkgb2xkIHZhbHVlIHRoZSBhY3R1YWxzIG1heSBoYXZlICovCisgIGZvciAoZiA9IG0tPmZvcm1hbHM7IGY7IGYgPSBmLT5uZXh0KQorICAgICAgc2JfcmVzZXQgKCZmLT5hY3R1YWwpOworICBmID0gbS0+Zm9ybWFsczsKKyAgd2hpbGUgKGYgIT0gTlVMTCAmJiBmLT5pbmRleCA8IDApCisgICAgZiA9IGYtPm5leHQ7CisKKyAgaWYgKG1hY3JvX21yaSkKKyAgICB7CisgICAgICAvKiBUaGUgbWFjcm8gbWF5IGJlIGNhbGxlZCB3aXRoIGFuIG9wdGlvbmFsIHF1YWxpZmllciwgd2hpY2ggbWF5CisgICAgICAgICBiZSByZWZlcnJlZCB0byBpbiB0aGUgbWFjcm8gYm9keSBhcyBcMC4gICovCisgICAgICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nKQorCXsKKwkgIGZvcm1hbF9lbnRyeSAqbjsKKworCSAgbiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKKwkgIHNiX25ldyAoJm4tPm5hbWUpOworCSAgc2JfbmV3ICgmbi0+ZGVmKTsKKwkgIHNiX25ldyAoJm4tPmFjdHVhbCk7CisJICBuLT5pbmRleCA9IFFVQUxfSU5ERVg7CisKKwkgIG4tPm5leHQgPSBtLT5mb3JtYWxzOworCSAgbS0+Zm9ybWFscyA9IG47CisKKwkgIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHggKyAxLCBpbiwgJm4tPmFjdHVhbCwgMSwgMCk7CisJfQorICAgIH0KKworICAvKiBQZWVsIG9mZiB0aGUgYWN0dWFscyBhbmQgc3RvcmUgdGhlbSBhd2F5IGluIHRoZSBoYXNoIHRhYmxlcycgYWN0dWFscyAqLworICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKKyAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IGNvbW1lbnRfY2hhcikKKyAgICB7CisgICAgICBpbnQgc2NhbjsKKworICAgICAgLyogTG9vayBhbmQgc2VlIGlmIGl0J3MgYSBwb3NpdGlvbmFsIG9yIGtleXdvcmQgYXJnICovCisgICAgICBzY2FuID0gaWR4OworICAgICAgd2hpbGUgKHNjYW4gPCBpbi0+bGVuCisJICAgICAmJiAhSVNTRVAgKGluLT5wdHJbc2Nhbl0pCisJICAgICAmJiAhKG1hY3JvX21yaSAmJiBpbi0+cHRyW3NjYW5dID09ICdcJycpCisJICAgICAmJiAoIW1hY3JvX2FsdGVybmF0ZSAmJiBpbi0+cHRyW3NjYW5dICE9ICc9JykpCisJc2NhbisrOworICAgICAgaWYgKHNjYW4gPCBpbi0+bGVuICYmICFtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltzY2FuXSA9PSAnPScpCisJeworCSAgaXNfa2V5d29yZCA9IDE7CisKKwkgIC8qIEl0J3MgT0sgdG8gZ28gZnJvbSBwb3NpdGlvbmFsIHRvIGtleXdvcmQuICAqLworCisJICAvKiBUaGlzIGlzIGEga2V5d29yZCBhcmcsIGZldGNoIHRoZSBmb3JtYWwgbmFtZSBhbmQKKwkgICAgIHRoZW4gdGhlIGFjdHVhbCBzdHVmZiAqLworCSAgc2JfcmVzZXQgKCZ0KTsKKwkgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJnQpOworCSAgaWYgKGluLT5wdHJbaWR4XSAhPSAnPScpCisJICAgIHJldHVybiBfKCJjb25mdXNpb24gaW4gZm9ybWFsIHBhcmFtZXRlcnMiKTsKKworCSAgLyogTG9va3VwIHRoZSBmb3JtYWwgaW4gdGhlIG1hY3JvJ3MgbGlzdCAqLworCSAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKG0tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7CisJICBpZiAoIXB0cikKKwkgICAgcmV0dXJuIF8oIm1hY3JvIGZvcm1hbCBhcmd1bWVudCBkb2VzIG5vdCBleGlzdCIpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogSW5zZXJ0IHRoaXMgdmFsdWUgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KKwkgICAgICBzYl9yZXNldCAoJnB0ci0+YWN0dWFsKTsKKwkgICAgICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4ICsgMSwgaW4sICZwdHItPmFjdHVhbCwgMCwgMCk7CisJICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbiA+IDApCisJCSsrbmFyZzsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIGEgcG9zaXRpb25hbCBhcmcgKi8KKwkgIGlzX3Bvc2l0aW9uYWwgPSAxOworCSAgaWYgKGlzX2tleXdvcmQpCisJICAgIHJldHVybiBfKCJjYW4ndCBtaXggcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMiKTsKKworCSAgaWYgKCFmKQorCSAgICB7CisJICAgICAgZm9ybWFsX2VudHJ5ICoqcGY7CisJICAgICAgaW50IGM7CisKKwkgICAgICBpZiAoIW1hY3JvX21yaSkKKwkJcmV0dXJuIF8oInRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIik7CisKKwkgICAgICBmID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOworCSAgICAgIHNiX25ldyAoJmYtPm5hbWUpOworCSAgICAgIHNiX25ldyAoJmYtPmRlZik7CisJICAgICAgc2JfbmV3ICgmZi0+YWN0dWFsKTsKKwkgICAgICBmLT5uZXh0ID0gTlVMTDsKKworCSAgICAgIGMgPSAtMTsKKwkgICAgICBmb3IgKHBmID0gJm0tPmZvcm1hbHM7ICpwZiAhPSBOVUxMOyBwZiA9ICYoKnBmKS0+bmV4dCkKKwkJaWYgKCgqcGYpLT5pbmRleCA+PSBjKQorCQkgIGMgPSAoKnBmKS0+aW5kZXggKyAxOworCSAgICAgIGlmIChjID09IC0xKQorCQljID0gMDsKKwkgICAgICAqcGYgPSBmOworCSAgICAgIGYtPmluZGV4ID0gYzsKKwkgICAgfQorCisJICBzYl9yZXNldCAoJmYtPmFjdHVhbCk7CisJICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmYtPmFjdHVhbCwgMSwgMCk7CisJICBpZiAoZi0+YWN0dWFsLmxlbiA+IDApCisJICAgICsrbmFyZzsKKwkgIGRvCisJICAgIHsKKwkgICAgICBmID0gZi0+bmV4dDsKKwkgICAgfQorCSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBmLT5pbmRleCA8IDApOworCX0KKworICAgICAgaWYgKCEgbWFjcm9fbXJpKQorCWlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOworICAgICAgZWxzZQorCXsKKwkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJywnKQorCSAgICArK2lkeDsKKwkgIGlmIChJU1dISVRFIChpbi0+cHRyW2lkeF0pKQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChtYWNyb19tcmkpCisgICAgeworICAgICAgY2hhciBidWZmZXJbMjBdOworCisgICAgICBzYl9yZXNldCAoJnQpOworICAgICAgc2JfYWRkX3N0cmluZyAoJnQsIG1hY3JvX3N0cmlwX2F0ID8gIiROQVJHIiA6ICJOQVJHIik7CisgICAgICBwdHIgPSAoZm9ybWFsX2VudHJ5ICopIGhhc2hfZmluZCAobS0+Zm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJnQpKTsKKyAgICAgIHNiX3Jlc2V0ICgmcHRyLT5hY3R1YWwpOworICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBuYXJnKTsKKyAgICAgIHNiX2FkZF9zdHJpbmcgKCZwdHItPmFjdHVhbCwgYnVmZmVyKTsKKyAgICB9CisKKyAgZXJyID0gbWFjcm9fZXhwYW5kX2JvZHkgKCZtLT5zdWIsIG91dCwgbS0+Zm9ybWFscywgbS0+Zm9ybWFsX2hhc2gsCisJCQkgICBjb21tZW50X2NoYXIsIDEpOworICBpZiAoZXJyICE9IE5VTEwpCisgICAgcmV0dXJuIGVycjsKKworICAvKiBEaXNjYXJkIGFueSB1bm5hbWVkIGZvcm1hbCBhcmd1bWVudHMuICAqLworICBpZiAobWFjcm9fbXJpKQorICAgIHsKKyAgICAgIGZvcm1hbF9lbnRyeSAqKnBmOworCisgICAgICBwZiA9ICZtLT5mb3JtYWxzOworICAgICAgd2hpbGUgKCpwZiAhPSBOVUxMKQorCXsKKwkgIGlmICgoKnBmKS0+bmFtZS5sZW4gIT0gMCkKKwkgICAgcGYgPSAmKCpwZiktPm5leHQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzYl9raWxsICgmKCpwZiktPm5hbWUpOworCSAgICAgIHNiX2tpbGwgKCYoKnBmKS0+ZGVmKTsKKwkgICAgICBzYl9raWxsICgmKCpwZiktPmFjdHVhbCk7CisJICAgICAgZiA9ICgqcGYpLT5uZXh0OworCSAgICAgIGZyZWUgKCpwZik7CisJICAgICAgKnBmID0gZjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgc2Jfa2lsbCAoJnQpOworICBtYWNyb19udW1iZXIrKzsKKworICByZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgZm9yIGEgbWFjcm8uICBJZiBvbmUgaXMgZm91bmQsIHB1dCB0aGUgZXhwYW5zaW9uIGludG8KKyAgICpFWFBBTkQuICBDT01NRU5UX0NIQVIgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLS10aGlzIGlzIHVzZWQgYnkKKyAgIGdhc3AuICBSZXR1cm4gMSBpZiBhIG1hY3JvIGlzIGZvdW5kLCAwIG90aGVyd2lzZS4gICovCisKK2ludAorY2hlY2tfbWFjcm8gKGxpbmUsIGV4cGFuZCwgY29tbWVudF9jaGFyLCBlcnJvcikKKyAgICAgY29uc3QgY2hhciAqbGluZTsKKyAgICAgc2IgKmV4cGFuZDsKKyAgICAgaW50IGNvbW1lbnRfY2hhcjsKKyAgICAgY29uc3QgY2hhciAqKmVycm9yOworeworICBjb25zdCBjaGFyICpzOworICBjaGFyICpjb3B5LCAqY3M7CisgIG1hY3JvX2VudHJ5ICptYWNybzsKKyAgc2IgbGluZV9zYjsKKworICBpZiAoISBpc2FscGhhICgodW5zaWduZWQgY2hhcikgKmxpbmUpCisgICAgICAmJiAqbGluZSAhPSAnXycKKyAgICAgICYmICpsaW5lICE9ICckJworICAgICAgJiYgKCEgbWFjcm9fbXJpIHx8ICpsaW5lICE9ICcuJykpCisgICAgcmV0dXJuIDA7CisKKyAgcyA9IGxpbmUgKyAxOworICB3aGlsZSAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzKQorCSB8fCAqcyA9PSAnXycKKwkgfHwgKnMgPT0gJyQnKQorICAgICsrczsKKworICBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChzIC0gbGluZSArIDEpOworICBtZW1jcHkgKGNvcHksIGxpbmUsIHMgLSBsaW5lKTsKKyAgY29weVtzIC0gbGluZV0gPSAnXDAnOworICBmb3IgKGNzID0gY29weTsgKmNzICE9ICdcMCc7IGNzKyspCisgICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqY3MpKQorICAgICAgKmNzID0gdG9sb3dlciAoKmNzKTsKKworICBtYWNybyA9IChtYWNyb19lbnRyeSAqKSBoYXNoX2ZpbmQgKG1hY3JvX2hhc2gsIGNvcHkpOworCisgIGlmIChtYWNybyA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIC8qIFdyYXAgdGhlIGxpbmUgdXAgaW4gYW4gc2IuICAqLworICBzYl9uZXcgKCZsaW5lX3NiKTsKKyAgd2hpbGUgKCpzICE9ICdcMCcgJiYgKnMgIT0gJ1xuJyAmJiAqcyAhPSAnXHInKQorICAgIHNiX2FkZF9jaGFyICgmbGluZV9zYiwgKnMrKyk7CisKKyAgc2JfbmV3IChleHBhbmQpOworICAqZXJyb3IgPSBtYWNyb19leHBhbmQgKDAsICZsaW5lX3NiLCBtYWNybywgZXhwYW5kLCBjb21tZW50X2NoYXIpOworCisgIHNiX2tpbGwgKCZsaW5lX3NiKTsKKworICByZXR1cm4gMTsKK30KKworLyogRGVsZXRlIGEgbWFjcm8uICAqLworCit2b2lkCitkZWxldGVfbWFjcm8gKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGhhc2hfZGVsZXRlIChtYWNyb19oYXNoLCBuYW1lKTsKK30KKworLyogSGFuZGxlIHRoZSBNUkkgSVJQIGFuZCBJUlBDIHBzZXVkby1vcHMuICBUaGVzZSBhcmUgaGFuZGxlZCBhcyBhCisgICBjb21iaW5lZCBtYWNybyBkZWZpbml0aW9uIGFuZCBleGVjdXRpb24uICBUaGlzIHJldHVybnMgTlVMTCBvbgorICAgc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuICAqLworCitjb25zdCBjaGFyICoKK2V4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sIG91dCwgZ2V0X2xpbmUsIGNvbW1lbnRfY2hhcikKKyAgICAgaW50IGlycGM7CisgICAgIGludCBpZHg7CisgICAgIHNiICppbjsKKyAgICAgc2IgKm91dDsKKyAgICAgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKTsKKyAgICAgaW50IGNvbW1lbnRfY2hhcjsKK3sKKyAgY29uc3QgY2hhciAqbW47CisgIHNiIHN1YjsKKyAgZm9ybWFsX2VudHJ5IGY7CisgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmg7CisgIGNvbnN0IGNoYXIgKmVycjsKKworICBpZiAoaXJwYykKKyAgICBtbiA9ICJJUlBDIjsKKyAgZWxzZQorICAgIG1uID0gIklSUCI7CisKKyAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisKKyAgc2JfbmV3ICgmc3ViKTsKKyAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0IChtbiwgIkVORFIiLCAmc3ViLCBnZXRfbGluZSkpCisgICAgcmV0dXJuIF8oInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gaXJwIG9yIGlycGMiKTsKKyAgCisgIHNiX25ldyAoJmYubmFtZSk7CisgIHNiX25ldyAoJmYuZGVmKTsKKyAgc2JfbmV3ICgmZi5hY3R1YWwpOworCisgIGlkeCA9IGdldF90b2tlbiAoaWR4LCBpbiwgJmYubmFtZSk7CisgIGlmIChmLm5hbWUubGVuID09IDApCisgICAgcmV0dXJuIF8oIm1pc3NpbmcgbW9kZWwgcGFyYW1ldGVyIik7CisKKyAgaCA9IGhhc2hfbmV3ICgpOworICBlcnIgPSBoYXNoX2phbSAoaCwgc2JfdGVybWluYXRlICgmZi5uYW1lKSwgJmYpOworICBpZiAoZXJyICE9IE5VTEwpCisgICAgcmV0dXJuIGVycjsKKworICBmLmluZGV4ID0gMTsKKyAgZi5uZXh0ID0gTlVMTDsKKworICBzYl9yZXNldCAob3V0KTsKKworICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKKyAgaWYgKGlkeCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbaWR4XSA9PSBjb21tZW50X2NoYXIpCisgICAgeworICAgICAgLyogRXhwYW5kIG9uY2Ugd2l0aCBhIG51bGwgc3RyaW5nLiAgKi8KKyAgICAgIGVyciA9IG1hY3JvX2V4cGFuZF9ib2R5ICgmc3ViLCBvdXQsICZmLCBoLCBjb21tZW50X2NoYXIsIDApOworICAgICAgaWYgKGVyciAhPSBOVUxMKQorCXJldHVybiBlcnI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGlycGMgJiYgaW4tPnB0cltpZHhdID09ICciJykKKwkrK2lkeDsKKyAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSAhPSBjb21tZW50X2NoYXIpCisJeworCSAgaWYgKCFpcnBjKQorCSAgICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4LCBpbiwgJmYuYWN0dWFsLCAxLCAwKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQorCQl7CisJCSAgaW50IG54dDsKKworCQkgIG54dCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKKwkJICBpZiAobnh0ID49IGluLT5sZW4gfHwgaW4tPnB0cltueHRdID09IGNvbW1lbnRfY2hhcikKKwkJICAgIHsKKwkJICAgICAgaWR4ID0gbnh0OworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICAgIHNiX3Jlc2V0ICgmZi5hY3R1YWwpOworCSAgICAgIHNiX2FkZF9jaGFyICgmZi5hY3R1YWwsIGluLT5wdHJbaWR4XSk7CisJICAgICAgKytpZHg7CisJICAgIH0KKwkgIGVyciA9IG1hY3JvX2V4cGFuZF9ib2R5ICgmc3ViLCBvdXQsICZmLCBoLCBjb21tZW50X2NoYXIsIDApOworCSAgaWYgKGVyciAhPSBOVUxMKQorCSAgICByZXR1cm4gZXJyOworCSAgaWYgKCFpcnBjKQorCSAgICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKKwkgIGVsc2UKKwkgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7CisJfQorICAgIH0KKworICBoYXNoX2RpZSAoaCk7CisgIHNiX2tpbGwgKCZzdWIpOworCisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ2FzL21hY3JvLmggYi9nYXMvbWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGVlYTRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL21hY3JvLmgKQEAgLTAsMCArMSw1MyBAQAorLyogbWFjcm8uaCAtIGhlYWRlciBmaWxlIGZvciBtYWNybyBzdXBwb3J0IGZvciBnYXMgYW5kIGdhc3AKKyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBTdGV2ZSBhbmQgSnVkeSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCwKKyAgICAgIHNhY0BjeWdudXMuY29tCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2lmbmRlZiBNQUNST19ICisKKyNkZWZpbmUgTUFDUk9fSAorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJzYi5oIgorCisvKiBXaGV0aGVyIGFueSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQuICAqLworCitleHRlcm4gaW50IG1hY3JvX2RlZmluZWQ7CisKKy8qIFRoZSBtYWNybyBuZXN0aW5nIGxldmVsLiAgKi8KKworZXh0ZXJuIGludCBtYWNyb19uZXN0OworCitleHRlcm4gaW50IGJ1ZmZlcl9hbmRfbmVzdAorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc2IgKiwgaW50ICgqKSBQQVJBTVMgKChzYiAqKSkpKTsKK2V4dGVybiB2b2lkIG1hY3JvX2luaXQKKyAgUEFSQU1TICgoaW50IGFsdGVybmF0ZSwgaW50IG1yaSwgaW50IHN0cmlwX2F0LAorCSAgIGludCAoKikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHNiICosIGludCAqKSkpKTsKK2V4dGVybiB2b2lkIG1hY3JvX21yaV9tb2RlIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmluZV9tYWNybworICBQQVJBTVMgKChpbnQgaWR4LCBzYiAqaW4sIHNiICpsYWJlbCwgaW50ICgqZ2V0X2xpbmUpIFBBUkFNUyAoKHNiICopKSwKKwkgICBjb25zdCBjaGFyICoqbmFtZXApKTsKK2V4dGVybiBpbnQgY2hlY2tfbWFjcm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzYiAqLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKK2V4dGVybiB2b2lkIGRlbGV0ZV9tYWNybyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK2V4dGVybiBjb25zdCBjaGFyICpleHBhbmRfaXJwCisgIFBBUkFNUyAoKGludCwgaW50LCBzYiAqLCBzYiAqLCBpbnQgKCopIFBBUkFNUyAoKHNiICopKSwgaW50KSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL21ha2VmaWxlLnZtcyBiL2dhcy9tYWtlZmlsZS52bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjMzBkNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9tYWtlZmlsZS52bXMKQEAgLTAsMCArMSwxMjQgQEAKKyMKKyMgbWFrZWZpbGUgZm9yIGdhcworIworIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKKyMKK0NDPWdjYworaWZlcSAoJChBUkNIKSxBTFBIQSkKK2lmZXEgKCQoQ0MpLGdjYykKK0RFRlM9CitDRkxBR1M9L2luY2x1ZGU9KFtdLFstLmJmZF0sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpCitMRkxBR1M9CitMSUJTPSxHTlVfQ0NfTElCUkFSWTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsR05VX0NDX0xJQlJBUlk6Y3J0MC5vYmoKK2Vsc2UKK0RFRlM9L2RlZmluZT0oInRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iPSJ0YWJzaXpfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iLFwKKyJfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ij0iX2JmZF9nZW5lcmljX2dldF93aW5fc2VjdGlvbl9jb250IixcCisiX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24iPSJfYmZkX2VsZl9zZWNfZnJvbV9iZmRfc2VjIiwiY29uc3Q9IikKK0NGTEFHUz0vbm9vcHQvbm9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5iZmRdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKVwKKy93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxwdHJtaXNtYXRjaCx1bmRlZmVzY2FwLGxvbmdleHRlcm4sZHVwdHlwZXNwZWMpCitMRkxBR1M9CitMSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCitlbmRpZgorCitlbHNlCSMgQVJDSCBub3QgQUxQSEEKKworaWZlcSAoJChDQyksZ2NjKQorREVGUz0KK0NGTEFHUz0vaW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpCitMRkxBR1M9CitMSUJTPSxHTlVfQ0NfTElCUkFSWTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsR05VX0NDX0xJQlJBUlk6Y3J0YmVnaW4ub2JqLEdOVV9DQ19MSUJSQVJZOmNydGVuZC5vYmoKKyNMSUJTPSxnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCitlbHNlCitlcnJvciBERUNDIGlzIGJyb2tlbiBvbiBWQVgKK0RFRlM9L2RlZmluZT0oInRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iPSJ0YWJzaXpfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iLCJjb25zdD0iKQorQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUylcCisvd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMscHRybWlzbWF0Y2gsdW5kZWZlc2NhcCxsb25nZXh0ZXJuLGR1cHR5cGVzcGVjKQorTEZMQUdTPQorTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgorZW5kaWYKK2VuZGlmCisKKworT0JKUz10YXJnLWNwdS5vYmosb2JqLWZvcm1hdC5vYmosYXRvZi10YXJnLm9iaixhcHAub2JqLGFzLm9iaixhdG9mLWdlbmVyaWMub2JqLFwKKyAgYmlnbnVtLWNvcHkub2JqLGNvbmQub2JqLGRlcGVuZC5vYmosZXhwci5vYmosZmxvbnVtLWtvbnN0Lm9iaixmbG9udW0tY29weS5vYmosXAorICBmbG9udW0tbXVsdC5vYmosZnJhZ3Mub2JqLGhhc2gub2JqLGlucHV0LWZpbGUub2JqLGlucHV0LXNjcnViLm9iaixcCisgIGxpdGVyYWwub2JqLG1lc3NhZ2VzLm9iaixvdXRwdXQtZmlsZS5vYmoscmVhZC5vYmosc3Vic2Vncy5vYmosc3ltYm9scy5vYmosXAorICB3cml0ZS5vYmosbGlzdGluZy5vYmosZWNvZmYub2JqLHN0YWJzLm9iaixzYi5vYmosbWFjcm8ub2JqLGVob3B0Lm9iagorCitHQVNQT0JKUyA9IGdhc3Aub2JqLG1hY3JvLm9iaixzYi5vYmosaGFzaC5vYmoKKworTElCSUJFUlRZID0gWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGIKKworaWZlcSAoJChBUkNIKSxBTFBIQSkKK0xJQkJGRCA9IFstLmJmZF1saWJiZmQub2xiCitMSUJPUENPREVTID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYgorQkZEREVQID0gWy0uYmZkXWJmZC5oCitlbHNlCitMSUJCRkQgPQorTElCT1BDT0RFUyA9CitCRkRERVAgPQorZW5kaWYKKworYWxsOiBjb25maWcuc3RhdHVzICQoQkZEREVQKSBhcy5leGUgZ2FzcC5leGUKKworYXMuZXhlOiAkKE9CSlMpICQoTElCT1BDT0RFUykgJChMSUJCRkQpICQoTElCSUJFUlRZKQoraWZlcSAoJChBUkNIKSxBTFBIQSkKKwlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKE9CSlMpLCQoTElCT1BDT0RFUykvbGliLCQoTElCQkZEKS9saWIsJChMSUJJQkVSVFkpL2xpYiQoTElCUykKK2Vsc2UKKwlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKE9CSlMpLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCitlbmRpZgorCitnYXNwLmV4ZTogJChHQVNQT0JKUykgJChMSUJCRkQpICQoTElCSUJFUlRZKQoraWZlcSAoJChBUkNIKSxBTFBIQSkKKwlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKEdBU1BPQkpTKSwkKExJQkJGRCkvbGliLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCitlbHNlCisJbGluayQoTEZMQUdTKS9leGU9JEAgJChHQVNQT0JKUyksJChMSUJJQkVSVFkpL2xpYiQoTElCUykKK2VuZGlmCisKK2NvbmZpZy5zdGF0dXM6CisJJCQgQGNvbmZpZy1nYXMKKworaWZlcSAoJChBUkNIKSxBTFBIQSkKK0NQVT1hbHBoYQorT0JKRk9STUFUPWV2YXgKK0ZMVEZPUk1BVD1pZWVlCitlbHNlCitDUFU9dmF4CitPQkpGT1JNQVQ9dm1zCitGTFRGT1JNQVQ9dmF4CitlbmRpZgorCit0YXJnLWNwdS5jOiBbLmNvbmZpZ110Yy0kKENQVSkuYworCWNvcHkgJDwgJEAKK3RhcmctY3B1Lmg6IFsuY29uZmlnXXRjLSQoQ1BVKS5oCisJY29weSAkPCAkQAordGFyZy1lbnYuaDogWy5jb25maWdddGUtZ2VuZXJpYy5oCisJY29weSAkPCAkQAorb2JqLWZvcm1hdC5oOiBbLmNvbmZpZ11vYmotJChPQkpGT1JNQVQpLmgKKwljb3B5ICQ8ICRACitvYmotZm9ybWF0LmM6IFsuY29uZmlnXW9iai0kKE9CSkZPUk1BVCkuYworCWNvcHkgJDwgJEAKK2F0b2YtdGFyZy5jOiBbLmNvbmZpZ11hdG9mLSQoRkxURk9STUFUKS5jCisJY29weSAkPCAkQAorCit0YXJnLWNwdS5vYmo6IHRhcmctY3B1LmMgdGFyZy1jcHUuaCBbLmNvbmZpZ11hdG9mLXZheC5jCisKK1stLmJmZF1iZmQuaDoKKwkkKENEKSBbLS5iZmRdCisJZ21ha2UgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKKwkkKENEKSBbLS5nYXNdCisKK2luc3RhbGw6IGFzLmV4ZSBnYXNwLmV4ZQorCSQoQ1ApICReIEdOVV9ST09UXDpbQklOXQorCitjbGVhbjoKKwkkJCBwdXJnZQorCSQoUk0pICoub2JqOworCSQoUk0pICouZXhlOworCSQoUk0pIGF0b2YtdGFyZy5jOworCSQoUk0pIG9iai1mb3JtYXQuYzsKKwkkKFJNKSBvYmotZm9ybWF0Lmg7CisJJChSTSkgdGFyZy1lbnYuaDsKKwkkKFJNKSB0YXJnLWNwdS5oOworCSQoUk0pIHRhcmctY3B1LmM7CisJJChSTSkgY29uZmlnLnN0YXR1czsKZGlmZiAtLWdpdCBhL2dhcy9tZXNzYWdlcy5jIGIvZ2FzL21lc3NhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiN2FkMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9tZXNzYWdlcy5jCkBAIC0wLDAgKzEsNTQxIEBACisvKiBtZXNzYWdlcy5jIC0gZXJyb3IgcmVwb3J0ZXIgLQorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlICJhcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpZmRlZiBVU0VfU1REQVJHCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZW5kaWYKKworI2lmZGVmIFVTRV9WQVJBUkdTCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgIWRlZmluZWQgKFVTRV9WQVJBUkdTKQorLyogUm9sbCBvdXIgb3duLiAgKi8KKyNkZWZpbmUgdmFfYWxpc3QgUkVTVAorI2RlZmluZSB2YV9kY2wKK3R5cGVkZWYgaW50ICogdmFfbGlzdDsKKyNkZWZpbmUgdmFfc3RhcnQoQVJHUykJQVJHUyA9ICZSRVNUCisjZGVmaW5lIHZhX2VuZChBUkdTKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlkZW50aWZ5IFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHZvaWQgYXNfc2hvd193aGVyZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBhc193YXJuX2ludGVybmFsIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIGFzX2JhZF9pbnRlcm5hbCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgY2hhciAqKSk7CisKKy8qCisgKiBEZXNwaXRlIHRoZSByZXN0IG9mIHRoZSBjb21tZW50cyBpbiB0aGlzIGZpbGUsIChGSVhNRS1TT09OKSwKKyAqIGhlcmUgaXMgdGhlIGN1cnJlbnQgc2NoZW1lIGZvciBlcnJvciBtZXNzYWdlcyBldGM6CisgKgorICogYXNfZmF0YWwoKSBpcyB1c2VkIHdoZW4gZ2FzIGlzIHF1aXRlIGNvbmZ1c2VkIGFuZAorICogY29udGludWluZyB0aGUgYXNzZW1ibHkgaXMgcG9pbnRsZXNzLiAgSW4gdGhpcyBjYXNlIHdlCisgKiBleGl0IGltbWVkaWF0ZWx5IHdpdGggZXJyb3Igc3RhdHVzLgorICoKKyAqIGFzX2JhZCgpIGlzIHVzZWQgdG8gbWFyayBlcnJvcnMgdGhhdCByZXN1bHQgaW4gd2hhdCB3ZQorICogcHJlc3VtZSB0byBiZSBhIHVzZWxlc3Mgb2JqZWN0IGZpbGUuICBTYXksIHdlIGlnbm9yZWQKKyAqIHNvbWV0aGluZyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiB2aXRhbC4gIElmIHdlIHNlZSBhbnkgb2YKKyAqIHRoZXNlLCBhc3NlbWJseSB3aWxsIGNvbnRpbnVlIHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSwKKyAqIG5vIG9iamVjdCBmaWxlIHdpbGwgYmUgcHJvZHVjZWQsIGFuZCB3ZSB3aWxsIHRlcm1pbmF0ZQorICogd2l0aCBlcnJvciBzdGF0dXMuICBUaGUgbmV3IG9wdGlvbiwgLVosIHRlbGxzIHVzIHRvCisgKiBwcm9kdWNlIGFuIG9iamVjdCBmaWxlIGFueXdheSBidXQgd2Ugc3RpbGwgZXhpdCB3aXRoCisgKiBlcnJvciBzdGF0dXMuICBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgeW91IGRvbid0IHdhbnQKKyAqIHRoaXMgb2JqZWN0IGZpbGUgYnV0IHdlIGNvdWxkIGJlIHdyb25nLgorICoKKyAqIGFzX3dhcm4oKSBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBhbiBlcnJvciBmcm9tIHdoaWNoIHdlCisgKiBoYXZlIGEgcGxhdXNpYmxlIGVycm9yIHJlY292ZXJ5LiAgZWcsIG1hc2tpbmcgdGhlIHRvcAorICogYml0cyBvZiBhIGNvbnN0YW50IHRoYXQgaXMgbG9uZ2VyIHRoYW4gd2lsbCBmaXQgaW4gdGhlCisgKiBkZXN0aW5hdGlvbi4gIEluIHRoaXMgY2FzZSB3ZSB3aWxsIGNvbnRpbnVlIHRvIGFzc2VtYmxlCisgKiB0aGUgc291cmNlLCBhbHRob3VnaCB3ZSBtYXkgaGF2ZSBtYWRlIGEgYmFkIGFzc3VtcHRpb24sCisgKiBhbmQgd2Ugd2lsbCBwcm9kdWNlIGFuIG9iamVjdCBmaWxlIGFuZCByZXR1cm4gbm9ybWFsIGV4aXQKKyAqIHN0YXR1cyAoaWUsIG5vIGVycm9yKS4gIFRoZSBuZXcgb3B0aW9uIC1YIHRlbGxzIHVzIHRvCisgKiB0cmVhdCBhbGwgYXNfd2FybigpIGVycm9ycyBhcyBhc19iYWQoKSBlcnJvcnMuICBUaGF0IGlzLAorICogbm8gb2JqZWN0IGZpbGUgd2lsbCBiZSBwcm9kdWNlZCBhbmQgd2Ugd2lsbCBleGl0IHdpdGgKKyAqIGVycm9yIHN0YXR1cy4gIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCB3ZSBkb24ndCBraWxsIGFuCisgKiBlbnRpcmUgbWFrZSBiZWNhdXNlIG9mIGFuIGVycm9yIHRoYXQgd2Uga25ldyBob3cgdG8KKyAqIGNvcnJlY3QuICBPbiB0aGUgb3RoZXIgaGFuZCwgc29tZXRpbWVzIHlvdSBtaWdodCB3YW50IHRvCisgKiBzdG9wIHRoZSBtYWtlIGF0IHRoZXNlIHBvaW50cy4KKyAqCisgKiBhc190c2t0c2soKSBpcyB1c2VkIHdoZW4gd2Ugc2VlIGEgbWlub3IgZXJyb3IgZm9yIHdoaWNoCisgKiBvdXIgZXJyb3IgcmVjb3ZlcnkgYWN0aW9uIGlzIGFsbW9zdCBjZXJ0YWlubHkgY29ycmVjdC4KKyAqIEluIHRoaXMgY2FzZSwgd2UgcHJpbnQgYSBtZXNzYWdlIGFuZCB0aGVuIGFzc2VtYmx5CisgKiBjb250aW51ZXMgYXMgdGhvdWdoIG5vIGVycm9yIG9jY3VycmVkLgorICovCisKK3N0YXRpYyB2b2lkCitpZGVudGlmeSAoZmlsZSkKKyAgICAgY2hhciAqZmlsZTsKK3sKKyAgc3RhdGljIGludCBpZGVudGlmaWVkOworICBpZiAoaWRlbnRpZmllZCkKKyAgICByZXR1cm47CisgIGlkZW50aWZpZWQrKzsKKworICBpZiAoIWZpbGUpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHg7CisgICAgICBhc193aGVyZSAoJmZpbGUsICZ4KTsKKyAgICB9CisKKyAgaWYgKGZpbGUpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIGZpbGUpOworICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VtYmxlciBtZXNzYWdlczpcbiIpKTsKK30KKworc3RhdGljIGludCB3YXJuaW5nX2NvdW50OwkvKiBDb3VudCBvZiBudW1iZXIgb2Ygd2FybmluZ3MgaXNzdWVkICovCisKK2ludCAKK2hhZF93YXJuaW5ncyAoKQoreworICByZXR1cm4gKHdhcm5pbmdfY291bnQpOworfQorCisvKiBOb256ZXJvIGlmIHdlJ3ZlIGhpdCBhICdiYWQgZXJyb3InLCBhbmQgc2hvdWxkIG5vdCB3cml0ZSBhbiBvYmogZmlsZSwKKyAgIGFuZCBleGl0IHdpdGggYSBub256ZXJvIGVycm9yIGNvZGUgKi8KKworc3RhdGljIGludCBlcnJvcl9jb3VudDsKKworaW50IAoraGFkX2Vycm9ycyAoKQoreworICByZXR1cm4gKGVycm9yX2NvdW50KTsKK30KKworCisvKiBQcmludCB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBzdGRlcnIuICAqLworCitzdGF0aWMgdm9pZAorYXNfc2hvd193aGVyZSAoKQoreworICBjaGFyICpmaWxlOworICB1bnNpZ25lZCBpbnQgbGluZTsKKworICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKKyAgaWRlbnRpZnkgKGZpbGUpOworICBpZiAoZmlsZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7Cit9CisKKy8qCisgKgkJCWEgcyBfIHAgZSByIHIgbyByCisgKgorICogTGlrZSBwZXJyb3IoMyksIGJ1dCB3aXRoIG1vcmUgaW5mby4KKyAqLworCit2b2lkIAorYXNfcGVycm9yIChncmlwZSwgZmlsZW5hbWUpCisgICAgIGNvbnN0IGNoYXIgKmdyaXBlOwkJLyogVW5wdW5jdHVhdGVkIGVycm9yIHRoZW1lLiAqLworICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKK3sKKyAgY29uc3QgY2hhciAqZXJydHh0OworCisgIGFzX3Nob3dfd2hlcmUgKCk7CisgIGZwcmludGYgKHN0ZGVyciwgZ3JpcGUsIGZpbGVuYW1lKTsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIGVycnR4dCA9IGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpOworI2Vsc2UKKyAgZXJydHh0ID0geHN0cmVycm9yIChlcnJubyk7CisjZW5kaWYKKyAgZnByaW50ZiAoc3RkZXJyLCAiOiAlc1xuIiwgZXJydHh0KTsKKyAgZXJybm8gPSAwOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKKyNlbmRpZgorfQorCisvKgorICoJCQlhIHMgXyB0IHMgayB0IHMgayAoKQorICoKKyAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nCisgKiBpbiBpbnB1dCBmaWxlKHMpLgorICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KKyAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCisgKi8KKworI2lmZGVmIFVTRV9TVERBUkcKK3ZvaWQgCithc190c2t0c2sgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICBhc19zaG93X3doZXJlICgpOworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Cit9CQkJCS8qIGFzX3Rza3RzaygpICovCisjZWxzZQordm9pZCAKK2FzX3Rza3RzayAoZm9ybWF0LCB2YV9hbGlzdCkKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9kY2wKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIGFzX3Nob3dfd2hlcmUgKCk7CisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7Cit9CQkJCS8qIGFzX3Rza3RzaygpICovCisjZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLworCisvKiBUaGUgY29tbW9uIHBvcnRpb24gb2YgYXNfd2FybiBhbmQgYXNfd2Fybl93aGVyZS4gICovCisKK3N0YXRpYyB2b2lkCithc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpCisgICAgIGNoYXIgKmZpbGU7CisgICAgIHVuc2lnbmVkIGludCBsaW5lOworICAgICBjaGFyICpidWZmZXI7Cit7CisgICsrd2FybmluZ19jb3VudDsKKworICBpZiAoZmlsZSA9PSBOVUxMKQorICAgIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOworCisgIGlkZW50aWZ5IChmaWxlKTsKKyAgaWYgKGZpbGUpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOworICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6ICIpKTsKKyAgZnB1dHMgKGJ1ZmZlciwgc3RkZXJyKTsKKyAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7CisjaWZuZGVmIE5PX0xJU1RJTkcKKyAgbGlzdGluZ193YXJuaW5nIChidWZmZXIpOworI2VuZGlmCit9CisKKy8qCisgKgkJCWEgcyBfIHcgYSByIG4gKCkKKyAqCisgKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZworICogaW4gaW5wdXQgZmlsZShzKS4KKyAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCisgKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgorICovCisKKyNpZmRlZiBVU0VfU1REQVJHCit2b2lkIAorYXNfd2FybiAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIGJ1ZmZlclsyMDAwXTsKKworICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCisgICAgeworICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICAgIGFzX3dhcm5faW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7CisgICAgfQorfQkJCQkvKiBhc193YXJuKCkgKi8KKyNlbHNlCisvKlZBUkFSR1MxICovCit2b2lkIAorYXNfd2FybiAoZm9ybWF0LCB2YV9hbGlzdCkKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9kY2wKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIGJ1ZmZlclsyMDAwXTsKKworICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCisgICAgeworICAgICAgdmFfc3RhcnQgKGFyZ3MpOworICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIHZhX2VuZCAoYXJncyk7CisgICAgICBhc193YXJuX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOworICAgIH0KK30JCQkJLyogYXNfd2FybigpICovCisjZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLworCisvKiBhc193YXJuX3doZXJlLCBsaWtlIGFzX2JhZCBidXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCisgICBwYXNzZWQgaW4uICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgZnVuY3Rpb24gaW4gb3JkZXIKKyAgIHRvIGhhbmRsZSB0aGUgdmFyYXJncyBjb3JyZWN0bHkgYW5kIHBvcnRhYmx5LiAgKi8KKworI2lmZGVmIFVTRV9TVERBUkcKK3ZvaWQgCithc193YXJuX3doZXJlIChjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIGJ1ZmZlclsyMDAwXTsKKworICBpZiAoIWZsYWdfbm9fd2FybmluZ3MpCisgICAgeworICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICAgIGFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7CisgICAgfQorfQkJCQkvKiBhc193YXJuKCkgKi8KKyNlbHNlCisvKlZBUkFSR1MxICovCit2b2lkIAorYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZm9ybWF0LCB2YV9hbGlzdCkKKyAgICAgY2hhciAqZmlsZTsKKyAgICAgdW5zaWduZWQgaW50IGxpbmU7CisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfZGNsCit7CisgIHZhX2xpc3QgYXJnczsKKyAgY2hhciBidWZmZXJbMjAwMF07CisKKyAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQorICAgIHsKKyAgICAgIHZhX3N0YXJ0IChhcmdzKTsKKyAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKKyAgICB9Cit9CQkJCS8qIGFzX3dhcm4oKSAqLworI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KKworLyogVGhlIGNvbW1vbiBwb3J0aW9uIG9mIGFzX2JhZCBhbmQgYXNfYmFkX3doZXJlLiAgKi8KKworc3RhdGljIHZvaWQKK2FzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKQorICAgICBjaGFyICpmaWxlOworICAgICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgICAgY2hhciAqYnVmZmVyOworeworICArK2Vycm9yX2NvdW50OworCisgIGlmIChmaWxlID09IE5VTEwpCisgICAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7CisKKyAgaWRlbnRpZnkgKGZpbGUpOworICBpZiAoZmlsZSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlczoldTogIiwgZmlsZSwgbGluZSk7CisgIGZwcmludGYgKHN0ZGVyciwgXygiRXJyb3I6ICIpKTsKKyAgZnB1dHMgKGJ1ZmZlciwgc3RkZXJyKTsKKyAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7CisjaWZuZGVmIE5PX0xJU1RJTkcKKyAgbGlzdGluZ19lcnJvciAoYnVmZmVyKTsKKyNlbmRpZgorfQorCisvKgorICoJCQlhIHMgXyBiIGEgZCAoKQorICoKKyAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgd2FybmluZywgYW5kIGxvY2F0ZSB3YXJuaW5nIGluIGlucHV0IGZpbGUocykuCisgKiBQbGVhc2UgdXMgd2hlbiB0aGVyZSBpcyBubyByZWNvdmVyeSwgYnV0IHdlIHdhbnQgdG8gY29udGludWUgcHJvY2Vzc2luZworICogYnV0IG5vdCBwcm9kdWNlIGFuIG9iamVjdCBmaWxlLgorICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KKyAqLworCisjaWZkZWYgVVNFX1NUREFSRwordm9pZCAKK2FzX2JhZCAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIGJ1ZmZlclsyMDAwXTsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICBhc19iYWRfaW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Cit9CisKKyNlbHNlCisvKlZBUkFSR1MxICovCit2b2lkIAorYXNfYmFkIChmb3JtYXQsIHZhX2FsaXN0KQorICAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgIHZhX2RjbAoreworICB2YV9saXN0IGFyZ3M7CisgIGNoYXIgYnVmZmVyWzIwMDBdOworCisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICBhc19iYWRfaW50ZXJuYWwgKChjaGFyICopIE5VTEwsIDAsIGJ1ZmZlcik7Cit9CisjZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLworCisvKiBhc19iYWRfd2hlcmUsIGxpa2UgYXNfYmFkIGJ1dCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKKyAgIHBhc3NlZCBpbi4gIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gcmVwZWF0IHRoZSBmdW5jdGlvbiBpbiBvcmRlcgorICAgdG8gaGFuZGxlIHRoZSB2YXJhcmdzIGNvcnJlY3RseSBhbmQgcG9ydGFibHkuICAqLworCisjaWZkZWYgVVNFX1NUREFSRwordm9pZCAKK2FzX2JhZF93aGVyZSAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgY2hhciBidWZmZXJbMjAwMF07CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisKKyAgYXNfYmFkX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOworfQorCisjZWxzZQorLypWQVJBUkdTMSAqLwordm9pZCAKK2FzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgZm9ybWF0LCB2YV9hbGlzdCkKKyAgICAgY2hhciAqZmlsZTsKKyAgICAgdW5zaWduZWQgaW50IGxpbmU7CisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfZGNsCit7CisgIHZhX2xpc3QgYXJnczsKKyAgY2hhciBidWZmZXJbMjAwMF07CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIGFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKK30KKyNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCisKKy8qCisgKgkJCWEgcyBfIGYgYSB0IGEgbCAoKQorICoKKyAqIFNlbmQgdG8gc3RkZXJyIGEgc3RyaW5nIGFzIGEgZmF0YWwgbWVzc2FnZSwgYW5kIHByaW50IGxvY2F0aW9uIG9mIGVycm9yIGluCisgKiBpbnB1dCBmaWxlKHMpLgorICogUGxlYXNlIG9ubHkgdXNlIHRoaXMgZm9yIHdoZW4gd2UgRE9OJ1QgaGF2ZSBzb21lIHJlY292ZXJ5IGFjdGlvbi4KKyAqIEl0IHhleGl0KClzIHdpdGggYSB3YXJuaW5nIHN0YXR1cy4KKyAqLworCisjaWZkZWYgVVNFX1NUREFSRwordm9pZCAKK2FzX2ZhdGFsIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgYXNfc2hvd193aGVyZSAoKTsKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIGZwcmludGYgKHN0ZGVyciwgXygiRmF0YWwgZXJyb3I6ICIpKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7CisgIHZhX2VuZCAoYXJncyk7CisgIHhleGl0IChFWElUX0ZBSUxVUkUpOworfQkJCQkvKiBhc19mYXRhbCgpICovCisjZWxzZQorLypWQVJBUkdTMSovCit2b2lkIAorYXNfZmF0YWwgKGZvcm1hdCwgdmFfYWxpc3QpCisgICAgIGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfZGNsCit7CisgIHZhX2xpc3QgYXJnczsKKworICBhc19zaG93X3doZXJlICgpOworICB2YV9zdGFydCAoYXJncyk7CisgIGZwcmludGYgKHN0ZGVyciwgXygiRmF0YWwgZXJyb3I6ICIpKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgKHZvaWQpIHB1dGMgKCdcbicsIHN0ZGVycik7CisgIHZhX2VuZCAoYXJncyk7CisgIHhleGl0IChFWElUX0ZBSUxVUkUpOworfQkJCQkvKiBhc19mYXRhbCgpICovCisjZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLworCisvKgorICogYXNfYXNzZXJ0OiBJbmRpY2F0ZSBhc3NlcnRpb24gZmFpbHVyZS4KKyAqIEFyZ3VtZW50czogRmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBvcHRpb25hbCBmdW5jdGlvbiBuYW1lLgorICovCisKK3ZvaWQKK2FzX2Fzc2VydCAoZmlsZSwgbGluZSwgZm4pCisgICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKKyAgICAgaW50IGxpbmU7Cit7CisgIGFzX3Nob3dfd2hlcmUgKCk7CisgIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IhXG4iKSk7CisgIGlmIChmbikKKyAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VydGlvbiBmYWlsdXJlIGluICVzIGF0ICVzIGxpbmUgJWQuXG4iKSwKKwkgICAgIGZuLCBmaWxlLCBsaW5lKTsKKyAgZWxzZQorICAgIGZwcmludGYgKHN0ZGVyciwgXygiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMgbGluZSAlZC5cbiIpLCBmaWxlLCBsaW5lKTsKKyAgZnByaW50ZiAoc3RkZXJyLCBfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOworICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKK30KKworLyogYXNfYWJvcnQ6IFByaW50IGEgZnJpZW5kbHkgbWVzc2FnZSBzYXlpbmcgaG93IHRvdGFsbHkgaG9zZWQgd2UgYXJlLAorICAgYW5kIGV4aXQgd2l0aG91dCBwcm9kdWNpbmcgYSBjb3JlIGZpbGUuICAqLwordm9pZAorYXNfYWJvcnQgKGZpbGUsIGxpbmUsIGZuKQorICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47CisgICAgIGludCBsaW5lOworeworICBhc19zaG93X3doZXJlICgpOworICBpZiAoZm4pCisgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIiksCisJICAgICBmaWxlLCBsaW5lLCBmbik7CisgIGVsc2UKKyAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iKSwKKwkgICAgIGZpbGUsIGxpbmUpOworICBmcHJpbnRmIChzdGRlcnIsIF8oIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iKSk7CisgIHhleGl0IChFWElUX0ZBSUxVUkUpOworfQorCisvKiBTdXBwb3J0IHJvdXRpbmVzLiAgKi8KKwordm9pZAorZnByaW50X3ZhbHVlIChmaWxlLCB2YWwpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIHZhbHVlVCB2YWw7Cit7CisgIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChsb25nKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChmaWxlLCAiJWxkIiwgKGxvbmcpIHZhbCk7CisgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGJmZF92bWEpKQorICAgIHsKKyAgICAgIGZwcmludGZfdm1hIChmaWxlLCB2YWwpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICBhYm9ydCAoKTsKK30KKwordm9pZAorc3ByaW50X3ZhbHVlIChidWYsIHZhbCkKKyAgICAgY2hhciAqYnVmOworICAgICB2YWx1ZVQgdmFsOworeworICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAobG9uZykpCisgICAgeworICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZhbCk7CisgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGJmZF92bWEpKQorICAgIHsKKyAgICAgIHNwcmludGZfdm1hIChidWYsIHZhbCk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgIGFib3J0ICgpOworfQorCisvKiBlbmQgb2YgbWVzc2FnZXMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21wdy1jb25maWcuaW4gYi9nYXMvbXB3LWNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI5YjFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL21wdy1jb25maWcuaW4KQEAgLTAsMCArMSwxMTUgQEAKKyMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgR0FTLgorCitTZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKKworSWYgInt0YXJnZXRfYXJjaH0iID1+IC9wb3dlcnBjLworCVNldCBzaG9ydF9hcmNoX25hbWUgInBwYyIKKwlTZXQgdGFyZ2V0X2NwdSAicG93ZXJwYyIKK0Vsc2UKKwlTZXQgc2hvcnRfYXJjaF9uYW1lICJ7dGFyZ2V0X2FyY2h9IgorRW5kIElmCisKKyMgVGhlIGZvbGxvd2luZyB3b3JrcyBmb3IgbWFueSBjb25maWd1cmF0aW9ucywgdGhvdWdoIG5vdCBhbGwuCisKK1NldCBvYmpfZm9ybWF0IGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8uKi0uKi0vLydgCitTZXQgdGFyZ2V0X29zIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8uKi0uKi0vLydgCisKK1NldCBiZmRfZ2FzIG5vCisKK1NldCBUREVGSU5FUyAiIgorCitTZXQgRVhUUkFfT0JKRUNUUyAiIgorCisjIERlZmF1bHQgZW11bGF0aW9uLgorCitTZXQgZW0gZ2VuZXJpYworCitJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KKwlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKKwlTZXQgVERFRklORVMgJy1kIE02OEtDT0ZGJworCVNldCBFWFRSQV9PQkpFQ1RTICcie299Im02OGstcGFyc2UuYy5vJworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLworCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgorCVNldCBiZmRfZ2FzIHllcworCVNldCBlbSBtYWNvcworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9pMzg2LVxPcHRpb24teC1nbzMyLworCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgorCVNldCBUREVGSU5FUyAnLWQgSTM4NkNPRkYnCisKK0Vsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL202OGstXE9wdGlvbi14LWNvZmYvCisJU2V0IFRERUZJTkVTICctZCBNNjhLQ09GRicKKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1pZHQtZWNvZmYvCisJU2V0IGJmZF9nYXMgeWVzCisJU2V0IFRERUZJTkVTICctZCBUQVJHRVRfQllURVNfQklHX0VORElBTj0xJworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCisJIyBBc3N1bWUgb3RoZXIgT1NlcyBldGMgdXNlIEVMRgorCVNldCBvYmpfZm9ybWF0ICJlbGYiCisJU2V0IGJmZF9nYXMgeWVzCisJU2V0IFRERUZJTkVTICctZCBUQVJHRVRfQllURVNfQklHX0VORElBTj0xJworCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImJmZDplbGYtYmZkLmggJ2JmZC9lbGYtYmZkLmgnCisKK0Vsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3NoLVxPcHRpb24teC1obXMvCisJU2V0IG9ial9mb3JtYXQgImNvZmYiCisJZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0ib3Bjb2RlczpzaC1vcGMuaCAnb3Bjb2Rlcy9zaC1vcGMuaCcKK0VuZCBJZgorCitmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzp0Yy17c2hvcnRfYXJjaF9uYW1lfS5jIHRhcmctY3B1LmMKK2ZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRjLXtzaG9ydF9hcmNoX25hbWV9LmggdGFyZy1jcHUuaAorCitmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzpvYmote29ial9mb3JtYXR9LmMgb2JqLWZvcm1hdC5jCitmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzpvYmote29ial9mb3JtYXR9Lmggb2JqLWZvcm1hdC5oCisKK2ZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRlLXtlbX0uaCB0YXJnLWVudi5oCisKKyMgU3BlY2lhbCBjYXNlcyBmb3IgZmxvYXQgaGFuZGxpbmcuCisKK0lmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbnMzMmsvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi1uczMyay5jIGF0b2YtdGFyZy5jCitFbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvdGFob2UvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi10YWhvZS5jIGF0b2YtdGFyZy5jCitFbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvdmF4LworCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOmF0b2YtdmF4LmMgYXRvZi10YXJnLmMKK0Vsc2UKKwkjIFVzZSBJRUVFIGJ5IGRlZmF1bHQuCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi1pZWVlLmMgYXRvZi10YXJnLmMKK0VuZCBJZgorCitFY2hvICcjIEZyb20gbXB3LWNvbmZpZy5pbicgICAgIAkJID4gIntvfSJtay50bXAKK0VjaG8gIlRERUZJTkVTID0gIiB7VERFRklORVN9CQkJPj4gIntvfSJtay50bXAKK0VjaG8gIkVYVFJBX09CSkVDVFMgPSAiIHtFWFRSQV9PQkpFQ1RTfQkJPj4gIntvfSJtay50bXAKKyMgKFdlIHVzZSB0aGUgLW4gb3B0aW9uIGhlcmUgc28gYXMgbm90IHRvIGdldCBleHRyYSBzcGFjZXMgaW5zZXJ0ZWQpCitFY2hvIC1uICdUQVJHX0NQVV9ERVAgPSB7VEFSR19DUFVfREVQXycJCT4+ICJ7b30ibWsudG1wCitFY2hvIC1uIHtzaG9ydF9hcmNoX25hbWV9CQkJPj4gIntvfSJtay50bXAKK0VjaG8gLW4gJ30nCQkJCQk+PiAie299Im1rLnRtcAorRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCT4+ICJ7b30ibWsudG1wCisKK0VjaG8gJy8qIGNvbmYuICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJyA+ICJ7b30iY29uZi5uZXcKK0VjaG8gLW4gJyNkZWZpbmUgVEFSR0VUX0NQVSAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldworRWNobyAtbiAie3RhcmdldF9jcHV9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3CitFY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldworRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfT1MgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKK0VjaG8gLW4gInt0YXJnZXRfb3N9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3CitFY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldworRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQUxJQVMgICAgICAgIicgICAgICAgCT4+ICJ7b30iY29uZi5uZXcKK0VjaG8gLW4gInt0YXJnZXRfYWxpYXN9IiAgICAgICAJCQk+PiAie299ImNvbmYubmV3CitFY2hvICAgICciJyAgICAgICAJCQkJPj4gIntvfSJjb25mLm5ldworRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMICAgICAgICInICAgICAJPj4gIntvfSJjb25mLm5ldworRWNobyAtbiAie3RhcmdldF9jYW5vbmljYWx9IgkJCT4+ICJ7b30iY29uZi5uZXcKK0VjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3CitFY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJCQk+PiAie299ImNvbmYubmV3CitJZiAie2JmZF9nYXN9IiA9fiAveWVzLworCUVjaG8gIiNkZWZpbmUgQkZEX0FTU0VNQkxFUiIJCT4+ICJ7b30iY29uZi5uZXcKK0Vsc2UKKwlFY2hvICIjZGVmaW5lIE1BTllfU0VHTUVOVFMiCQk+PiAie299ImNvbmYubmV3CitFbmQgSWYKK0VjaG8gJyNkZWZpbmUgQ1JfRU9MJwkJCQk+PiAie299ImNvbmYubmV3CitFY2hvICcjZGVmaW5lIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QJwkJPj4gIntvfSJjb25mLm5ldworRWNobyAnI2RlZmluZSBMT1NJTkdfQ09NUElMRVInCQkJPj4gIntvfSJjb25mLm5ldworCitNb3ZlSWZDaGFuZ2UgIntvfSJjb25mLm5ldyAie299ImNvbmYKKworc2VkIC1lICJzL0BzcmNkaXJAL3tzcmNkaXJ9LyIgIntzcmNkaXJ9ImdkYmluaXQuaW4gPiAie299Il9nZGJpbml0CmRpZmYgLS1naXQgYS9nYXMvbXB3LW1ha2Uuc2VkIGIvZ2FzL21wdy1tYWtlLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYxMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL21wdy1tYWtlLnNlZApAQCAtMCwwICsxLDEwMCBAQAorIyBTZWQgY29tbWFuZHMgdGhhdCBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIEdBUyBVbml4IE1ha2VmaWxlIHRvIE1QVyBzeW50YXguCisKKy9eIyBAdGFyZ2V0X2ZyYWdAL2FcCitcCitIREVGSU5FUyA9IFwKK0xPQ0FMX0xPQURMSUJFUyA9IFwKKworL15zcmNyb290ID0gL3MvXi8jLworL150YXJnZXRfYWxpYXMgPSAvcy9eLyMvCisKKy9JTkNMVURFUy9zLy1pICJ7c3JjZGlyfSI6XChbYS16XSpcKS8taSAie3RvcHNyY2Rpcn0iXDEvCisvSU5DTFVERVMvcy8taSAie3NyY2Rpcn0iXC5cLi8taSAie3RvcHNyY2Rpcn0iLworCisvXklOQ0xVREVTID0gLiokL3MvJC8gLWkgInt0b3BzcmNkaXJ9ImluY2x1ZGU6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LworCisvJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApL3MvJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApL3tUQVJHX0NQVV9ERVB9LworCisvQE9QQ09ERVNfTElCQC9zL0BPUENPREVTX0xJQkAvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KKy9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLworCisjIFBvaW50IGF0IHRoZSBsaWJyYXJpZXMgZGlyZWN0bHkuCisvQE9QQ09ERVNfREVQQC9zL0BPUENPREVTX0RFUEAvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KKy9AQkZEREVQQC9zL0BCRkRERVBALzo6YmZkOmxpYmJmZC5vLworCisjIERvbid0IG5lZWQgdGhpcy4KKy9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCisKKy9leHRyYV9vYmplY3RzQC9zL2V4dHJhX29iamVjdHNAL3tFWFRSQV9PQkpFQ1RTfS8KKworL0xPQURMSUJFUy9zL3tMT0FETElCRVN9L3tFWFRSQUxJQlN9LworCisvQEFMTF9PQkpfREVQU0Avcy9AQUxMX09CSl9ERVBTQC86OmJmZDpiZmQuaC8KKworIyBUaGlzIGNhdXNlcyBwcm9ibGVtcyAtIG5vdCBzdXJlIHdoeS4KKy9edGFncyBUQUdTLywvZXRhZ3MgL2QKKworL15tYWtlLWdhcy5jb20vcy9eLyMvCisKKy90cnVlL3MvIDsgQHRydWUkLy8KKworIyBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25mLmluLCB3ZSBkb24ndCBuZWVkIHRoZW0uCisvY29uZlwuaW4vcy9jb25mXC5pbi8vZworCisjIFVzZSBfZ2RiaW5pdCBldmVyeXdoZXJlIGluc3RlYWQgb2YgLmdkYmluaXQuCisvZ2RiaW5pdC9zL1wuZ2RiaW5pdC9fZ2RiaW5pdC9nCisKKy9hdG9mLXRhcmcvcy8ie3N9ImF0b2YtdGFyZ1wuYy8ie299ImF0b2YtdGFyZy5jL2cKKy9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKKy9jb25maWcvcy9eY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvCisvb2JqLWZvcm1hdC9zLyJ7c30ib2JqLWZvcm1hdFwuYy8ie299Im9iai1mb3JtYXQuYy9nCisvb2JqLWZvcm1hdC9zLyJ7c30ib2JqLWZvcm1hdFwuaC8ie299Im9iai1mb3JtYXQuaC9nCisvdGFyZy1jcHUvcy8ie3N9InRhcmctY3B1XC5jLyJ7b30idGFyZy1jcHUuYy9nCisvdGFyZy1jcHUvcy8ie3N9InRhcmctY3B1XC5oLyJ7b30idGFyZy1jcHUuaC9nCisvdGFyZy1lbnYvcy8ie3N9InRhcmctZW52XC5oLyJ7b30idGFyZy1lbnYuaC9nCisKKy9tNjhrLXBhcnNlLmMvcy8ie3N9Im02OGstcGFyc2VcLmMvIntvfSJtNjhrLXBhcnNlLmMvZworL202OGstcGFyc2UuYy9zL15tNjhrLXBhcnNlXC5jLyJ7b30ibTY4ay1wYXJzZS5jLworCisjIFdoYWNrIG91dCB0aGUgY29uZmlnLmggZGVwZW5kZW5jeSwgaXQgb25seSBjYXVzZXMgZXhjZXNzIHJlYnVpbGRzLgorL3tPQkpTfS9zL3tPQkpTfSBcXE9wdGlvbi1mICJ7b30iY29uZmlnLmgve09CSlN9IFxcT3B0aW9uLWYvCisvZ2FzcC5jL3MvZ2FzcFwuYyAie299ImNvbmZpZy5oL2dhc3AuYy8KKworIyBBTExfQ0ZMQUdTIGluY2x1ZGVzIFRERUZJTkVTLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlIGF0IGxpbmsgdGltZS4KKy9DQ19MRC9zL0FMTF9DRkxBR1MvQ0ZMQUdTL2cKKworIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWFzLnIuCisvYXMubmV3LnIvcy9hc1wubmV3XC5yL21hYy1hcy5yLworL2dhc3AubmV3LnIvcy9nYXNwXC5uZXdcLnIvbWFjLWFzLnIvCisKKyMgLi4uYW5kIHRoZSBQUk9HX05BTUUgZG9lc24ndCBoYXZlIGEgLm5ldyBpbiBpdC4KKy9QUk9HX05BTUUvcy9QUk9HX05BTUU9JyInYXMubmV3JyInL1BST0dfTkFNRT0nIidhcyciJy8KKy9QUk9HX05BTUUvcy9QUk9HX05BTUU9JyInZ2FzcC5uZXcnIicvUFJPR19OQU1FPSciJ2dhc3AnIicvCisKKyMgV2hhY2sgb3V0IHJlY3Vyc2l2ZSBtYWtlcywgdGhleSB3b24ndCB3b3JrLgorL15bIAldWyAJXSpzcmNyb290PS8sL15bIAldWyAJXSooY2QgL2QKKworIyBXb3JrIGFyb3VuZCBxdW90aW5nIHByb2JsZW1zIGJ5IHVzaW5nIG11bHRpcGxlIGVjaG8gY29tbWFuZHMuCisvJyNkZWZpbmUgR0FTX1ZFUlNJT04gIntWRVJTSU9OfSInL2NcCisJRWNobyAtbiAnI2RlZmluZSBHQVNfVkVSU0lPTiAiJyA+PiAie299ImNvbmZpZy5uZXdcCisJRWNobyAtbiAie1ZFUlNJT059IiA+PiAie299ImNvbmZpZy5uZXdcCisJRWNobyAtbiAnIicgPj4gIntvfSJjb25maWcubmV3CisKKyMgQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgorJGFcCitzdGFtcHMgXFxPcHRpb24tZiBjb25maWctc3RhbXBcCisKKy9eaW5zdGFsbCBcXE9wdGlvbi1mLywvXiQvY1wKK2luc3RhbGwgXFxPcHRpb24tZiBhbGwgaW5zdGFsbC1vbmx5XAorXAoraW5zdGFsbC1vbmx5IFxcT3B0aW9uLWZcCisJTmV3Rm9sZGVyUmVjdXJzaXZlICJ7YmluZGlyfSJcCisJRHVwbGljYXRlIC15IDphcy5uZXcgIntiaW5kaXJ9ImFzXAorCUR1cGxpY2F0ZSAteSA6Z2FzcC5uZXcgIntiaW5kaXJ9Imdhc3BcCisKKworIyBXaGFjayBvdXQgY29uZmlnLXJlYnVpbGRpbmcgdGFyZ2V0cywgdGhleSB3b24ndCB3b3JrLgorL15NYWtlZmlsZSBcXE9wdGlvbi1mLywvXiQvZAorL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCisKKy9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mL3MvXi8jLwpkaWZmIC0tZ2l0IGEvZ2FzL29iai5oIGIvZ2FzL29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWU3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvb2JqLmgKQEAgLTAsMCArMSw4MSBAQAorLyogb2JqLmggLSBkZWZpbmVzIHRoZSBvYmplY3QgZGVwZW5kZW50IGhvb2tzIGZvciBhbGwgb2JqZWN0CisgICBmb3JtYXQgYmFja2VuZHMuCisKKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCitjaGFyICpvYmpfZGVmYXVsdF9vdXRwdXRfZmlsZV9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgb2JqX2VtaXRfcmVsb2NhdGlvbnMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBmaXhTICogZml4UCwKKwkJCQkgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkpOwordm9pZCBvYmpfZW1pdF9zdHJpbmdzIFBBUkFNUyAoKGNoYXIgKip3aGVyZSkpOwordm9pZCBvYmpfZW1pdF9zeW1ib2xzIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgc3ltYm9sUyAqIHN5bWJvbHMpKTsKKyNpZm5kZWYgb2JqX3JlYWRfYmVnaW5faG9vawordm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorI2lmbmRlZiBCRkRfQVNTRU1CTEVSCit2b2lkIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4gUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Cit2b2lkIG9ial9oZWFkZXJfYXBwZW5kIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7CisjaWZuZGVmIG9ial9wcmVfd3JpdGVfaG9vawordm9pZCBvYmpfcHJlX3dyaXRlX2hvb2sgUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIG9ial9zeW1ib2xfbmV3X2hvb2sKK3ZvaWQgb2JqX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOworI2VuZGlmCisKK3ZvaWQgb2JqX3N5bWJvbF90b19jaGFycyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIHN5bWJvbFMgKiBzeW1ib2xQKSk7CisKK2V4dGVybiBjb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorc3RydWN0IGZvcm1hdF9vcHMgeworICBpbnQgZmxhdm9yOworICB1bnNpZ25lZCBkZmxfbGVhZGluZ191bmRlcnNjb3JlIDogMTsKKyAgdW5zaWduZWQgZW1pdF9zZWN0aW9uX3N5bWJvbHMgOiAxOworICB2b2lkICgqZnJvYl9zeW1ib2wpIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50ICopKTsKKyAgdm9pZCAoKmZyb2JfZmlsZSkgUEFSQU1TICgodm9pZCkpOworICB2b2lkICgqZnJvYl9maWxlX2FmdGVyX3JlbG9jcykgUEFSQU1TICgodm9pZCkpOworICBiZmRfdm1hICgqc19nZXRfc2l6ZSkgUEFSQU1TICgoc3ltYm9sUyAqKSk7CisgIHZvaWQgKCpzX3NldF9zaXplKSBQQVJBTVMgKChzeW1ib2xTICosIGJmZF92bWEpKTsKKyAgYmZkX3ZtYSAoKnNfZ2V0X2FsaWduKSBQQVJBTVMgKChzeW1ib2xTICopKTsKKyAgdm9pZCAoKnNfc2V0X2FsaWduKSBQQVJBTVMgKChzeW1ib2xTICosIGJmZF92bWEpKTsKKyAgdm9pZCAoKmNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7CisgIHZvaWQgKCpnZW5lcmF0ZV9hc21fbGluZW5vKSBQQVJBTVMgKCh2b2lkKSk7CisgIHZvaWQgKCpwcm9jZXNzX3N0YWIpIFBBUkFNUyAoKHNlZ1QsIGludCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50KSk7CisgIGludCAoKnNlY19zeW1fb2tfZm9yX3JlbG9jKSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7CisgIHZvaWQgKCpwb3BfaW5zZXJ0KSBQQVJBTVMgKCh2b2lkKSk7CisgIC8qIEZvciBjb25maWd1cmF0aW9ucyB1c2luZyBFQ09GRl9ERUJVR0dJTkcsIHRoaXMgY2FsbGJhY2sgaXMgdXNlZC4gICovCisgIHZvaWQgKCplY29mZl9zZXRfZXh0KSBQQVJBTVMgKChzeW1ib2xTICosIHN0cnVjdCBlY29mZl9leHRyICopKTsKKworICB2b2lkICgqcmVhZF9iZWdpbl9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisgIHZvaWQgKCpzeW1ib2xfbmV3X2hvb2spIFBBUkFNUyAoKHN5bWJvbFMgKikpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVsZl9mb3JtYXRfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGVjb2ZmX2Zvcm1hdF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgY29mZl9mb3JtYXRfb3BzOworCisjaWZuZGVmIHRoaXNfZm9ybWF0CitDT01NT04gY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgKnRoaXNfZm9ybWF0OworI2VuZGlmCisjZW5kaWYKKworLyogZW5kIG9mIG9iai5oICovCmRpZmYgLS1naXQgYS9nYXMvb3V0cHV0LWZpbGUuYyBiL2dhcy9vdXRwdXQtZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWFmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvb3V0cHV0LWZpbGUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyogb3V0cHV0LWZpbGUuYyAtICBEZWFsIHdpdGggdGhlIG91dHB1dCBmaWxlCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTMsIDkyLCA5NCwgOTUsIDk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFzLmgiCisKKyNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgorCisjaWZkZWYgQkZEX0hFQURFUlMKKyNkZWZpbmUgVVNFX0JGRAorI2VuZGlmCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjZGVmaW5lIFVTRV9CRkQKKyNpZm5kZWYgVEFSR0VUX01BQ0gKKyNkZWZpbmUgVEFSR0VUX01BQ0ggMAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFVTRV9CRkQKKyNpbmNsdWRlICJiZmQuaCIKK2JmZCAqc3Rkb3V0cHV0OworCit2b2lkCitvdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCisgICAgeworICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IG9wZW4gYSBiZmQgb24gc3Rkb3V0ICVzICIpLCBuYW1lKTsKKyAgICB9CisgIGVsc2UgaWYgKCEoc3Rkb3V0cHV0ID0gYmZkX29wZW53IChuYW1lLCBUQVJHRVRfRk9STUFUKSkpCisgICAgeworICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIiksIG5hbWUpOworICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIGJmZF9zZXRfZm9ybWF0IChzdGRvdXRwdXQsIGJmZF9vYmplY3QpOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIFRBUkdFVF9NQUNIKTsKKyNlbmRpZgorICBpZiAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpCisgICAgc3Rkb3V0cHV0LT5mbGFncyB8PSBCRkRfVFJBRElUSU9OQUxfRk9STUFUOworfQorCit2b2lkCitvdXRwdXRfZmlsZV9jbG9zZSAoZmlsZW5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworeworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgLyogQ2xvc2UgdGhlIGJmZC4gICovCisgIGlmIChiZmRfY2xvc2UgKHN0ZG91dHB1dCkgPT0gMCkKKyAgICB7CisgICAgICBiZmRfcGVycm9yIChmaWxlbmFtZSk7CisgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlc1xuIiksIGZpbGVuYW1lKTsKKyAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisgICAgfQorI2Vsc2UKKyAgLyogQ2xvc2UgdGhlIGJmZCB3aXRob3V0IGdldHRpbmcgYmZkIHRvIHdyaXRlIG91dCBhbnl0aGluZyBieSBpdHNlbGYgKi8KKyAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoc3Rkb3V0cHV0KSA9PSAwKQorICAgIHsKKyAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iKSwgZmlsZW5hbWUpOworICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisjZW5kaWYKKyAgc3Rkb3V0cHV0ID0gTlVMTDsJCS8qIFRydXN0IG5vYm9keSEgKi8KK30KKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCit2b2lkCitvdXRwdXRfZmlsZV9hcHBlbmQgKHdoZXJlLCBsZW5ndGgsIGZpbGVuYW1lKQorICAgICBjaGFyICp3aGVyZTsKKyAgICAgbG9uZyBsZW5ndGg7CisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBhYm9ydCAoKTsKK30KKyNlbmRpZgorCisjZWxzZQorCitzdGF0aWMgRklMRSAqc3Rkb3V0cHV0OworCit2b2lkCitvdXRwdXRfZmlsZV9jcmVhdGUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGlmIChuYW1lWzBdID09ICctJyAmJiBuYW1lWzFdID09ICdcMCcpCisgICAgeworICAgICAgc3Rkb3V0cHV0ID0gc3Rkb3V0OworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdGRvdXRwdXQgPSBmb3BlbiAobmFtZSwgIndiIik7CisKKyAgLyogU29tZSBzeXN0ZW1zIGRvbid0IGdyb2sgImIiIGluIGZvcGVuIG1vZGVzLiAgKi8KKyAgaWYgKHN0ZG91dHB1dCA9PSBOVUxMKQorICAgIHN0ZG91dHB1dCA9IGZvcGVuIChuYW1lLCAidyIpOworCisgIGlmIChzdGRvdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgbmFtZSk7CisgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOworICAgIH0KK30KKwordm9pZAorb3V0cHV0X2ZpbGVfY2xvc2UgKGZpbGVuYW1lKQorICAgICBjaGFyICpmaWxlbmFtZTsKK3sKKyAgaWYgKEVPRiA9PSBmY2xvc2UgKHN0ZG91dHB1dCkpCisgICAgeworICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZW5hbWUpOworICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIHN0ZG91dHB1dCA9IE5VTEw7CQkvKiBUcnVzdCBub2JvZHkhICovCit9CisKK3ZvaWQKK291dHB1dF9maWxlX2FwcGVuZCAod2hlcmUsIGxlbmd0aCwgZmlsZW5hbWUpCisgICAgIGNoYXIgKndoZXJlOworICAgICBsb25nIGxlbmd0aDsKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGZvciAoOyBsZW5ndGg7IGxlbmd0aC0tLCB3aGVyZSsrKQorICAgIHsKKyAgICAgICh2b2lkKSBwdXRjICgqd2hlcmUsIHN0ZG91dHB1dCk7CisgICAgICBpZiAoZmVycm9yIChzdGRvdXRwdXQpKQorCS8qIGlmICggRU9GID09IChwdXRjKCAqd2hlcmUsIHN0ZG91dHB1dCApKSApICovCisJeworCSAgYXNfcGVycm9yIChfKCJGYWlsZWQgdG8gZW1pdCBhbiBvYmplY3QgYnl0ZSIpLCBmaWxlbmFtZSk7CisJICBhc19mYXRhbCAoXygiQ2FuJ3QgY29udGludWUiKSk7CisJfQorICAgIH0KK30KKworI2VuZGlmCisKKy8qIGVuZCBvZiBvdXRwdXQtZmlsZS5jICovCmRpZmYgLS1naXQgYS9nYXMvb3V0cHV0LWZpbGUuaCBiL2dhcy9vdXRwdXQtZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmYxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvb3V0cHV0LWZpbGUuaApAQCAtMCwwICsxLDI1IEBACisvKiBUaGlzIGZpbGUgaXMgb3V0cHV0LWZpbGUuaAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCit2b2lkIG91dHB1dF9maWxlX2FwcGVuZCBQQVJBTVMgKChjaGFyICp3aGVyZSwgbG9uZyBsZW5ndGgsIGNoYXIgKmZpbGVuYW1lKSk7Cit2b2lkIG91dHB1dF9maWxlX2Nsb3NlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Cit2b2lkIG91dHB1dF9maWxlX2NyZWF0ZSBQQVJBTVMgKChjaGFyICpuYW1lKSk7CisKKy8qIGVuZCBvZiBvdXRwdXQtZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvcG8vTWFrZS1pbiBiL2dhcy9wby9NYWtlLWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTJkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvcG8vTWFrZS1pbgpAQCAtMCwwICsxLDI1MSBAQAorIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworUEFDS0FHRSA9IEBQQUNLQUdFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitTSEVMTCA9IC9iaW4vc2gKK0BTRVRfTUFLRUAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQorZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCitzdWJkaXIgPSBwbworCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorCitDQyA9IEBDQ0AKK0dFTkNBVCA9IEBHRU5DQVRACitHTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAorTVNHRk1UID0gQE1TR0ZNVEAKK1hHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKK01TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCisKK0RFRlMgPSBAREVGU0AKK0NGTEFHUyA9IEBDRkxBR1NACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKKworSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCisKK0NPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCisKK1NPVVJDRVMgPSBjYXQtaWQtdGJsLmMKK1BPRklMRVMgPSBAUE9GSUxFU0AKK0dNT0ZJTEVTID0gQEdNT0ZJTEVTQAorRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKK3N0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKKworUE9URklMRVMgPSBcCisKK0NBVEFMT0dTID0gQENBVEFMT0dTQAorQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKK0lOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKKworLmMubzoKKwkkKENPTVBJTEUpICQ8CisKKy5wby5wb3g6CisJJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAorCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKKworLnBvLm1vOgorCSQoTVNHRk1UKSAtbyAkQCAkPAorCisucG8uZ21vOgorCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKKwkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAorCisucG8uY2F0OgorCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCisJICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCisKKworYWxsOiBhbGwtQFVTRV9OTFNACisKK2FsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKK2FsbC1ubzoKKworJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQorCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKKwkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCisJICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCisJcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90CisJbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKKworJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgorJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKKwlybSAtZiBjYXQtaWQtdGJsLnRtcAorCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKKwkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKKwlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCisJICBybSBjYXQtaWQtdGJsLnRtcDsgXAorCWVsc2UgXAorCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAorCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAorCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAorCWZpCisJY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAorCisKK2luc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKK2luc3RhbGwtZXhlYzoKK2luc3RhbGwtaW5mbzoKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAoraW5zdGFsbC1kYXRhLW5vOiBhbGwKK2luc3RhbGwtZGF0YS15ZXM6IGFsbAorCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCisJICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKKwllbHNlIFwKKwkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCisJZmkKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGNhc2UgIiQkY2F0IiBpbiBcCisJICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKKwkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAorCSAgZXNhYzsgXAorCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCisJICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKKwkgIGVsc2UgXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCisJCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKKwkgIGVsc2UgXAorCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKKwkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCisJCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICB0cnVlOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWRvbmUKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCisJICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgIGVsc2UgXAorCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAorCSAgZmk7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAorCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOgorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJZG9uZQorCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KKworY2hlY2s6IGFsbAorCitjYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCisKK2R2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKKworbW9zdGx5Y2xlYW46CisJcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAorCXJtIC1mciAqLm8KKworY2xlYW46IG1vc3RseWNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KKworbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJcm0gLWYgJChHTU9GSUxFUykKKworZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQorCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCWRvbmUKKwordXBkYXRlLXBvOiBNYWtlZmlsZQorCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKKwlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKKwljZCAkKHNyY2Rpcik7IFwKKwljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAorCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCisJICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAorCSAgZWNobyAiJCRsYW5nOiI7IFwKKwkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKKwkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAorCSAgICBybSAtZiAkJGxhbmcucG87IFwKKwkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKKwkgIGZpOyBcCisJZG9uZQorCitQT1RGSUxFUzogUE9URklMRVMuaW4KKwkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAorCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCisJICBlbHNlIFwKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKKwkgIGZpOyBcCisJICBybSAtZiAkQC10ICRAIFwKKwkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAorCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCisJCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKKwkgICAgJiYgY2htb2QgYS13ICRALXQgXAorCSAgICAmJiBtdiAkQC10ICRAICkKKworUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKKwljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCisKK01ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKKwljZCAuLiBcCisJICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKKwkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL3BvL1BPVEZJTEVTLmluIGIvZ2FzL3BvL1BPVEZJTEVTLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjNiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvcG8vUE9URklMRVMuaW4KQEAgLTAsMCArMSwxOTMgQEAKK2NvbmZpZy90Yy1ocHBhLmMKK2NvbmZpZy90Yy1tMzJyLmMKK2NvbmZpZy9hb3V0X2dudS5oCitjb25maWcvYXRvZi1pZWVlLmMKK2NvbmZpZy9hdG9mLXRhaG9lLmMKK2NvbmZpZy9hdG9mLXZheC5jCitjb25maWcvZS1pMzg2Y29mZi5jCitjb25maWcvZS1pMzg2ZWxmLmMKK2NvbmZpZy9lLW1pcHNlY29mZi5jCitjb25maWcvZS1taXBzZWxmLmMKK2NvbmZpZy9pdGJsLW1pcHMuaAorY29uZmlnL202OGstcGFyc2UuaAorY29uZmlnL204OGstb3Bjb2RlLmgKK2NvbmZpZy9vYmotYW91dC5jCitjb25maWcvb2JqLWFvdXQuaAorY29uZmlnL29iai1ib3V0LmMKK2NvbmZpZy9vYmotYm91dC5oCitjb25maWcvb2JqLWNvZmYuYworY29uZmlnL29iai1jb2ZmLmgKK2NvbmZpZy9vYmotZWNvZmYuYworY29uZmlnL29iai1lY29mZi5oCitjb25maWcvb2JqLWVsZi5jCitjb25maWcvb2JqLWVsZi5oCitjb25maWcvb2JqLWV2YXguYworY29uZmlnL29iai1ldmF4LmgKK2NvbmZpZy9vYmotZ2VuZXJpYy5jCitjb25maWcvb2JqLWdlbmVyaWMuaAorY29uZmlnL29iai1ocDMwMC5jCitjb25maWcvb2JqLWhwMzAwLmgKK2NvbmZpZy9vYmotaWVlZS5jCitjb25maWcvb2JqLWllZWUuaAorY29uZmlnL29iai1tdWx0aS5jCitjb25maWcvb2JqLW11bHRpLmgKK2NvbmZpZy9vYmotc29tLmMKK2NvbmZpZy9vYmotc29tLmgKK2NvbmZpZy9vYmotdm1zLmMKK2NvbmZpZy9vYmotdm1zLmgKK2NvbmZpZy90Yy1hMjlrLmMKK2NvbmZpZy90Yy1hMjlrLmgKK2NvbmZpZy90Yy1hbHBoYS5jCitjb25maWcvdGMtYWxwaGEuaAorY29uZmlnL3RjLWFyYy5jCitjb25maWcvdGMtYXJjLmgKK2NvbmZpZy90Yy1hcm0uYworY29uZmlnL3RjLWFybS5oCitjb25maWcvdGMtZDEwdi5jCitjb25maWcvdGMtZDEwdi5oCitjb25maWcvdGMtZDMwdi5jCitjb25maWcvdGMtZDMwdi5oCitjb25maWcvdGMtbWNvcmUuYworY29uZmlnL3RjLWZyMzAuYworY29uZmlnL3RjLWZyMzAuaAorY29uZmlnL3RjLWdlbmVyaWMuYworY29uZmlnL3RjLWdlbmVyaWMuaAorY29uZmlnL3RjLWg4MzAwLmMKK2NvbmZpZy90Yy1oODMwMC5oCitjb25maWcvdGMtaDg1MDAuYworY29uZmlnL3RjLWg4NTAwLmgKK2NvbmZpZy90Yy1taXBzLmMKK2NvbmZpZy90Yy1ocHBhLmgKK2NvbmZpZy90Yy1pMzg2LmMKK2NvbmZpZy90Yy1pMzg2LmgKK2NvbmZpZy90Yy1pODYwLmMKK2NvbmZpZy90Yy1pODYwLmgKK2NvbmZpZy90Yy1pOTYwLmMKK2NvbmZpZy90Yy1pOTYwLmgKK2NvbmZpZy90Yy1tbjEwMzAwLmMKK2NvbmZpZy90Yy1tMzJyLmgKK2NvbmZpZy90Yy1tNjg4NTEuaAorY29uZmlnL3RjLW02OGsuYworY29uZmlnL3RjLW02OGsuaAorY29uZmlnL3RjLW04OGsuYworY29uZmlnL3RjLW04OGsuaAorY29uZmlnL3RjLW1jb3JlLmgKK2NvbmZpZy90Yy1taXBzLmgKK2NvbmZpZy90Yy1tbjEwMjAwLmMKK2NvbmZpZy90Yy1tbjEwMjAwLmgKK2NvbmZpZy90Yy1tbjEwMzAwLmgKK2NvbmZpZy90Yy1uczMyay5jCitjb25maWcvdGMtbnMzMmsuaAorY29uZmlnL3RjLXBwYy5jCitjb25maWcvdGMtcHBjLmgKK2NvbmZpZy90Yy1zaC5jCitjb25maWcvdGMtc2guaAorY29uZmlnL3RjLXNwYXJjLmMKK2NvbmZpZy90Yy1zcGFyYy5oCitjb25maWcvdGMtdGFob2UuYworY29uZmlnL3RjLXRhaG9lLmgKK2NvbmZpZy90Yy10aWMzMC5jCitjb25maWcvdGMtdGljMzAuaAorY29uZmlnL3RjLXRpYzgwLmMKK2NvbmZpZy90Yy10aWM4MC5oCitjb25maWcvdGMtdjg1MC5jCitjb25maWcvdGMtdjg1MC5oCitjb25maWcvdGMtdmF4LmMKK2NvbmZpZy90Yy12YXguaAorY29uZmlnL3RjLXc2NS5jCitjb25maWcvdGMtdzY1LmgKK2NvbmZpZy90Yy16OGsuYworY29uZmlnL3RjLXo4ay5oCitjb25maWcvdGUtMzg2YnNkLmgKK2NvbmZpZy90ZS1hdXguaAorY29uZmlnL3RlLWRlbHQ4OC5oCitjb25maWcvdGUtZGVsdGEuaAorY29uZmlnL3RlLWRweDIuaAorY29uZmlnL3RlLWR5bml4LmgKK2NvbmZpZy90ZS1lcG9jLXBlLmgKK2NvbmZpZy90ZS1nZW5lcmljLmgKK2NvbmZpZy90ZS1nbzMyLmgKK2NvbmZpZy90ZS1ocDMwMC5oCitjb25maWcvdGUtaHBwYS5oCitjb25maWcvdGUtaTM4NmFpeC5oCitjb25maWcvdGUtaWM5NjAuaAorY29uZmlnL3RlLWxpbnV4LmgKK2NvbmZpZy90ZS1sbmV3cy5oCitjb25maWcvdGUtbHlueC5oCitjb25maWcvdGUtbWFjaC5oCitjb25maWcvdGUtbWFjb3MuaAorY29uZmlnL3RlLW11bHRpLmgKK2NvbmZpZy90ZS1uYnNkLmgKK2NvbmZpZy90ZS1uYnNkNTMyLmgKK2NvbmZpZy90ZS1wYzUzMm1hY2guaAorY29uZmlnL3RlLXBlLmgKK2NvbmZpZy90ZS1wcGNudy5oCitjb25maWcvdGUtcHNvcy5oCitjb25maWcvdGUtcmlzY2l4LmgKK2NvbmZpZy90ZS1zcGFyY2FvdXQuaAorY29uZmlnL3RlLXN1bjMuaAorY29uZmlnL3RlLXN2cjQuaAorY29uZmlnL3RlLXN5c3YzMi5oCitjb25maWcvdmF4LWluc3QuaAorY29uZmlnL3Ztcy1hLWNvbmYuaAorY29uZmlnL3Ztcy1jb25mLmgKK2FwcC5jCithcy5jCithcy5oCithc2ludGwuaAorYXRvZi1nZW5lcmljLmMKK2JpZ251bS1jb3B5LmMKK2JpZ251bS5oCitiaXRfZml4LmgKK2NnZW4uYworY2dlbi5oCitjb25kLmMKK2RlYnVnLmMKK2RlcGVuZC5jCitlY29mZi5jCitlY29mZi5oCitlaG9wdC5jCitlbXVsLXRhcmdldC5oCitlbXVsLmgKK2V4cHIuYworZXhwci5oCitmbG9udW0tY29weS5jCitmbG9udW0ta29uc3QuYworZmxvbnVtLW11bHQuYworZmxvbnVtLmgKK2ZyYWdzLmMKK2ZyYWdzLmgKK2dhc3AuYworaGFzaC5jCitoYXNoLmgKK2lucHV0LWZpbGUuYworaW5wdXQtZmlsZS5oCitpbnB1dC1zY3J1Yi5jCitpdGJsLW9wcy5jCitpdGJsLW9wcy5oCitsaXN0aW5nLmMKK2xpc3RpbmcuaAorbGl0ZXJhbC5jCittYWNyby5jCittYWNyby5oCittZXNzYWdlcy5jCitvYmouaAorb3V0cHV0LWZpbGUuYworb3V0cHV0LWZpbGUuaAorcmVhZC5jCityZWFkLmgKK3NiLmMKK3NiLmgKK3N0YWJzLmMKK3N0cnVjLXN5bWJvbC5oCitzdWJzZWdzLmMKK3N1YnNlZ3MuaAorc3ltYm9scy5jCitzeW1ib2xzLmgKK3RjLmgKK3dyaXRlLmMKK3dyaXRlLmgKK3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCit0ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYwordGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmMKK3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jCmRpZmYgLS1naXQgYS9nYXMvcG8vZ2FzLnBvdCBiL2dhcy9wby9nYXMucG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOWFiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvcG8vZ2FzLnBvdApAQCAtMCwwICsxLDM4NTMgQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA0LTE4IDE4OjMxLTA0MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgorCisjOiBhcHAuYzo0MzUgYXBwLmM6NDQ5Cittc2dpZCAiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIKK21zZ3N0ciAiIgorCisjOiBhcHAuYzo1MjgKK21zZ2lkICJlbmQgb2YgZmlsZSBpbiBzdHJpbmc6IGluc2VydGVkICdcIiciCittc2dzdHIgIiIKKworIzogYXBwLmM6NTk0CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gZXNjYXBlICdcXCVjJyBpbiBzdHJpbmc6IElnbm9yZWQiCittc2dzdHIgIiIKKworIzogYXBwLmM6NjAzCittc2dpZCAiRW5kIG9mIGZpbGUgaW4gc3RyaW5nOiAnXCInIGluc2VydGVkIgorbXNnc3RyICIiCisKKyM6IGFwcC5jOjcyMworbXNnaWQgImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIgorbXNnc3RyICIiCisKKyM6IGFwcC5jOjg2OQorbXNnaWQgImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IgorbXNnc3RyICIiCisKKyM6IGFwcC5jOjkxOAorbXNnaWQgImVuZCBvZiBmaWxlIGFmdGVyIGEgb25lLWNoYXJhY3RlciBxdW90ZTsgXFwwIGluc2VydGVkIgorbXNnc3RyICIiCisKKyM6IGFwcC5jOjkyNgorbXNnaWQgImVuZCBvZiBmaWxlIGluIGVzY2FwZSBjaGFyYWN0ZXIiCittc2dzdHIgIiIKKworIzogYXBwLmM6OTM4Cittc2dpZCAiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIgorbXNnc3RyICIiCisKKyM6IGFwcC5jOjk5NyBhcHAuYzoxMDUxIGFwcC5jOjExMjAKK21zZ2lkICJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIgorbXNnc3RyICIiCisKKyM6IGFwcC5jOjEwNjEKK21zZ2lkICJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIKK21zZ3N0ciAiIgorCisjOiBhcy5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIKK21zZ3N0ciAiIgorCisjOiBhcy5jOjEyNAorIywgYy1mb3JtYXQKK21zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIKK21zZ3N0ciAiIgorCisjOiBhcy5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iCittc2dzdHIgIiIKKworIzogYXMuYzoxMzUKK21zZ2lkICIiCisiT3B0aW9uczpcbiIKKyIgIC1hW3N1Yi1vcHRpb24uLi5dXHR0dXJuIG9uIGxpc3RpbmdzXG4iCisiICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG4iCisiICAgIGMgICBvbWl0IGZhbHNlIGNvbmRpdGlvbmFsc1xuIgorIiAgICBkICAgb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlc1xuIgorIiAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuIgorIiAgICBsICAgaW5jbHVkZSBhc3NlbWJseVxuIgorIiAgICBtICAgaW5jbHVkZSBtYWNybyBleHBhbnNpb25zXG4iCisiICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcbiIKKyIgICAgcyAgIGluY2x1ZGUgc3ltYm9sc1xuIgorIiAgICA9ZmlsZSBzZXQgbGlzdGluZyBmaWxlIG5hbWUgKG11c3QgYmUgbGFzdCBzdWItb3B0aW9uKVxuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6MTQ4Cittc2dpZCAiIgorIiAgLURcdFx0ICAgICAgICAgIHByb2R1Y2UgYXNzZW1ibGVyIGRlYnVnZ2luZyBtZXNzYWdlc1xuIgorIiAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcbiIKKyIgIC1mXHRcdCAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuIgorIiAgLS1nc3RhYnNcdCAgICAgICAgICBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIKKyIgIC0taGVscFx0XHQgIHNob3cgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG4iCisiICAtSSBESVJcdFx0ICBhZGQgRElSIHRvIHNlYXJjaCBsaXN0IGZvciAuaW5jbHVkZSBkaXJlY3RpdmVzXG4iCisiICAtSlx0XHQgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBzaWduZWQgb3ZlcmZsb3dcbiIKKyIgIC1LXHRcdCAgICAgICAgICB3YXJuIHdoZW4gZGlmZmVyZW5jZXMgYWx0ZXJlZCBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzXG4iCisiICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iCittc2dzdHIgIiIKKworIzogYXMuYzoxNTkKK21zZ2lkICIiCisiICAtTSwtLW1yaVx0ICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcbiIKKyIgIC0tTUQgRklMRVx0ICAgICAgICAgIHdyaXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4gRklMRSAoZGVmYXVsdCBub25lKVxuIgorIiAgLW5vY3BwXHRcdCAgaWdub3JlZFxuIgorIiAgLW8gT0JKRklMRVx0ICAgICAgICAgIG5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBPQkpGSUxFIChkZWZhdWx0IGEub3V0KVxuIgorIiAgLVJcdFx0ICAgICAgICAgIGZvbGQgZGF0YSBzZWN0aW9uIGludG8gdGV4dCBzZWN0aW9uXG4iCisiICAtLXN0YXRpc3RpY3NcdCAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cbiIKKyIgIC0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgIHN0cmlwIGxvY2FsIGFic29sdXRlIHN5bWJvbHNcbiIKKyIgIC0tdHJhZGl0aW9uYWwtZm9ybWF0XHQgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcbiIKKyIgIC0tdmVyc2lvblx0XHQgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgorIiAgLVdcdFx0XHQgIHN1cHByZXNzIHdhcm5pbmdzXG4iCisiICAtLWl0YmwgSU5TVFRCTFx0ICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG4iCisiXHRcdFx0ICBtYXRjaGluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZGVmaW5lZCBpbiBmaWxlIElOU1RUQkxcbiIKKyIgIC13XHRcdFx0ICBpZ25vcmVkXG4iCisiICAtWFx0XHRcdCAgaWdub3JlZFxuIgorIiAgLVpcdFx0XHQgIGdlbmVyYXRlIG9iamVjdCBmaWxlIGV2ZW4gYWZ0ZXIgZXJyb3JzXG4iCittc2dzdHIgIiIKKworIzogYXMuYzoxNzYKK21zZ2lkICIiCisiICAtLWxpc3RpbmctbGhzLXdpZHRoXHQgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiAiCisib2ZcbiIKKyJcdFx0XHQgIHRoZSBsaXN0aW5nXG4iCisiICAtLWxpc3RpbmctbGhzLXdpZHRoMlx0ICBzZXQgdGhlIHdpZHRoIGluIHdvcmRzIG9mIHRoZSBjb250aW51YXRpb24gbGluZXNcbiIKKyJcdFx0XHQgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG4iCisiXHRcdFx0ICB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGxpbmVcbiIKKyIgIC0tbGlzdGluZy1yaHMtd2lkdGhcdCAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuIgorIlx0XHRcdCAgdGhlIHNvdXJjZSBmaWxlXG4iCisiICAtLWxpc3RpbmctY29udC1saW5lc1x0ICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG4iCisiXHRcdFx0ICBmb3IgdGhlIG91dHB1dCBkYXRhIGNvbHVtbiBvZiB0aGUgbGlzdGluZ1xuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6MTg5IGdhc3AuYzozNTgzCittc2dpZCAiIgorIlxuIgorIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6MjI2Cittc2dpZCAibWlzc2luZyBlbXVsYXRpb24gbW9kZSBuYW1lIgorbXNnc3RyICIiCisKKyM6IGFzLmM6MjQxCisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIgorbXNnc3RyICIiCisKKyMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KKyM6IGFzLmM6NDU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkdOVSBhc3NlbWJsZXIgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBhcy5jOjQ2MAorbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6NDYxIGdhc3AuYzozNjc3Cittc2dpZCAiIgorIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcbiIKKyJ0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCittc2dzdHIgIiIKKworIzogYXMuYzo0NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iCittc2dzdHIgIiIKKworIzogYXMuYzo0NzEKK21zZ2lkICJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIgorbXNnc3RyICIiCisKKyM6IGFzLmM6NDczCittc2dpZCAiZW11bGF0aW9ucyBub3QgaGFuZGxlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iCittc2dzdHIgIiIKKworIzogYXMuYzo0NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiYWxpYXMgPSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6NDc5CisjLCBjLWZvcm1hdAorbXNnaWQgImNhbm9uaWNhbCA9ICVzXG4iCittc2dzdHIgIiIKKworIzogYXMuYzo0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1LXR5cGUgPSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6NDgyCisjLCBjLWZvcm1hdAorbXNnaWQgImZvcm1hdCA9ICVzXG4iCittc2dzdHIgIiIKKworIzogYXMuYzo0ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmZkLXRhcmdldCA9ICVzXG4iCittc2dzdHIgIiIKKworIzogYXMuYzo0OTgKK21zZ2lkICJiYWQgZGVmc3ltOyBmb3JtYXQgaXMgLS1kZWZzeW0gbmFtZT12YWx1ZSIKK21zZ3N0ciAiIgorCisjOiBhcy5jOjUxOAorbXNnaWQgIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogYXMuYzo1MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBhcy5jOjYzNAorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGxpc3Rpbmcgb3B0aW9uIGAlYyciCittc2dzdHIgIiIKKworIzogYXMuYzo4NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHRvdGFsIHRpbWUgaW4gYXNzZW1ibHk6ICVsZC4lMDZsZFxuIgorbXNnc3RyICIiCisKKyM6IGFzLmM6ODU5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCittc2dzdHIgIiIKKworIy4KKyMuICogV2UgaGF2ZSBhIEdST1NTIGludGVybmFsIGVycm9yLgorIy4gKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisjLgorIzogYXRvZi1nZW5lcmljLmM6NDM4IGNvbmZpZy90Yy1hMjlrLmM6NTQ0IGNvbmZpZy90Yy1pODYwLmM6MzM1CisjOiBjb25maWcvdGMtaTg2MC5jOjcwOCBjb25maWcvdGMtbTY4ay5jOjMwNDUgY29uZmlnL3RjLW02OGsuYzozMDc0CisjOiBjb25maWcvdGMtc3BhcmMuYzoyMTU3Cittc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjay4iCittc2dzdHIgIiIKKworIzogY29uZC5jOjc1Cittc2dpZCAiaW52YWxpZCBpZGVudGlmaWVyIGZvciBcIi5pZmRlZlwiIgorbXNnc3RyICIiCisKKyM6IGNvbmQuYzoxMjgKK21zZ2lkICJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIKK21zZ3N0ciAiIgorCisjOiBjb25kLmM6MjI0Cittc2dpZCAiYmFkIGZvcm1hdCBmb3IgaWZjIG9yIGlmbmMiCittc2dzdHIgIiIKKworIzogY29uZC5jOjI1NworbXNnaWQgIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIgorbXNnc3RyICIiCisKKyM6IGNvbmQuYzoyODcKK21zZ2lkICIuZWxzZSB3aXRob3V0IG1hdGNoaW5nIC5pZiAtIGlnbm9yZWQiCittc2dzdHIgIiIKKworIzogY29uZC5jOjI5MgorbXNnaWQgImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiCittc2dzdHIgIiIKKworIzogY29uZC5jOjI5NQorbXNnaWQgImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiZWxzZVwiIgorbXNnc3RyICIiCisKKyM6IGNvbmQuYzoyOTgKK21zZ2lkICJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImlmXCIiCittc2dzdHIgIiIKKworIzogY29uZC5jOjM0MworbXNnaWQgIi5pZmVxcyBzeW50YXggZXJyb3IiCittc2dzdHIgIiIKKworIzogY29uZC5jOjQzMAorbXNnaWQgImVuZCBvZiBtYWNybyBpbnNpZGUgY29uZGl0aW9uYWwiCittc2dzdHIgIiIKKworIzogY29uZC5jOjQzMgorbXNnaWQgImVuZCBvZiBmaWxlIGluc2lkZSBjb25kaXRpb25hbCIKK21zZ3N0ciAiIgorCisjOiBjb25kLmM6NDM1Cittc2dpZCAiaGVyZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKK21zZ3N0ciAiIgorCisjOiBjb25kLmM6NDM5Cittc2dpZCAiaGVyZSBpcyB0aGUgXCJlbHNlXCIgb2YgdGhlIHVudGVybWluYXRlZCBjb25kaXRpb25hbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWFvdXQuYzoxNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXR0ZW1wdCB0byBwdXQgYSBjb21tb24gc3ltYm9sIGludG8gc2V0ICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotYW91dC5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICJBdHRlbXB0IHRvIHB1dCBhbiB1bmRlZmluZWQgc3ltYm9sIGludG8gc2V0ICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotYW91dC5jOjE5MiBjb25maWcvb2JqLWVsZi5jOjE1MjcgZWNvZmYuYzozNjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1hb3V0LmM6MjUwIGNvbmZpZy9vYmotY29mZi5jOjE3NjYKK21zZ2lkICJ1bnJlc29sdmVkIHJlbG9jYXRpb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1hb3V0LmM6MjUyIGNvbmZpZy9vYmotY29mZi5jOjE3NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1hb3V0LmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1hb3V0LmM6NDUzIGNvbmZpZy9vYmotY29mZi5jOjI3MDAgd3JpdGUuYzoxNzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWFvdXQuYzo1MjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotYW91dC5jOjYwOAorbXNnaWQgInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1ib3V0LmM6MzEyIGNvbmZpZy9vYmotdm1zLmM6NTY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjEzMworIywgYy1mb3JtYXQKK21zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RydWN0dXJlIHRhYmxlIGZhaWxlZDogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NDUyIGNvbmZpZy9vYmotY29mZi5jOjIxMTMKK21zZ2lkICIubG4gcHNldWRvLW9wIGluc2lkZSAuZGVmLy5lbmRlZjogaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NTEyIGNvbmZpZy9vYmotY29mZi5jOjIxNzAKK21zZ2lkICIuZGVmIHBzZXVkby1vcCB1c2VkIGluc2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NTU4IGNvbmZpZy9vYmotY29mZi5jOjIyMjMKK21zZ2lkICIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NTkyCisjLCBjLWZvcm1hdAorbXNnaWQgImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjYzNCBjb25maWcvb2JqLWNvZmYuYzoyMjk4CisjLCBjLWZvcm1hdAorbXNnaWQgInVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyAlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzo3MzYgY29uZmlnL29iai1jb2ZmLmM6MjQwNQorbXNnaWQgIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NzU2IGNvbmZpZy9vYmotY29mZi5jOjI0MjUKK21zZ2lkICJiYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUgaWdub3JlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzo4MDcgY29uZmlnL29iai1jb2ZmLmM6MjQ4OAorbXNnaWQgIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6ODIzIGNvbmZpZy9vYmotY29mZi5jOjI1MDQKK21zZ2lkICIuc2NsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6ODQxIGNvbmZpZy9vYmotY29mZi5jOjI1MjIKK21zZ2lkICIudGFnIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6ODYwIGNvbmZpZy9vYmotY29mZi5jOjI1NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzo4NzUgY29uZmlnL29iai1jb2ZmLmM6MjU1NQorbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6ODk3IGNvbmZpZy9vYmotY29mZi5jOjI1NzcKK21zZ2lkICIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6MTAyNiBjb25maWcvb2JqLWNvZmYuYzoyNzczCittc2dpZCAibWlzbWF0Y2hlZCAuZWIiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6MTA0NCBjb25maWcvb2JqLWNvZmYuYzoyODEzCittc2dpZCAiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiCittc2dzdHIgIiIKKworIy4gU1RZUF9JTkZPCisjLiBTVFlQX0xJQgorIy4gU1RZUF9PVkVSCisjOiBjb25maWcvb2JqLWNvZmYuYzoxMjUzCisjLCBjLWZvcm1hdAorbXNnaWQgInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6MTI1OCBjb25maWcvb2JqLWNvZmYuYzozNTE2IGNvbmZpZy90Yy1wcGMuYzozNzc4CisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzoxMjgwIGNvbmZpZy90Yy1wcGMuYzozNzk2IHJlYWQuYzoyNDc4CisjLCBjLWZvcm1hdAorbXNnaWQgImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6MTM5OQorIywgYy1mb3JtYXQKK21zZ2lkICIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjE1OTMgY29uZmlnL29iai1pZWVlLmM6NjkKK21zZ2lkICJPdXQgb2Ygc3RlcFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjIwMjgKK21zZ2lkICJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjIyNTUKK21zZ2lkICJgLmJmJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb25cbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzozMjE2IGNvbmZpZy9vYmotaWVlZS5jOjUyMiBvdXRwdXQtZmlsZS5jOjUyCisjOiBvdXRwdXQtZmlsZS5jOjExOQorIywgYy1mb3JtYXQKK21zZ2lkICJGQVRBTDogQ2FuJ3QgY3JlYXRlICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjMzOTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgY2xvc2UgJXM6ICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjM0MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVG9vIG1hbnkgbmV3IHNlY3Rpb25zOyBjYW4ndCBhZGQgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjM4MzQgY29uZmlnL3RjLW04OGsuYzoxMjYwIGNvbmZpZy90Yy1zcGFyYy5jOjMwMTUKK21zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjM4NDAgcmVhZC5jOjE5MzQKK21zZ2lkICJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzozODQ2CisjLCBjLWZvcm1hdAorbXNnaWQgImxjb21tIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6Mzg3NCByZWFkLmM6MjE2MAorIywgYy1mb3JtYXQKK21zZ2lkICJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjM5NjggY29uZmlnL3RjLWk5NjAuYzozMjAxCisjLCBjLWZvcm1hdAorbXNnaWQgIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzo0MDQ3IHdyaXRlLmM6MjUwMQorIywgYy1mb3JtYXQKK21zZ2lkICJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotY29mZi5jOjQwNjggd3JpdGUuYzoyNTE1Cittc2dpZCAiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NDExNAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBlbWl0IHJlbG9jIHstICVzLXNlZyBzeW1ib2wgXCIlc1wifSBAIGZpbGUgYWRkcmVzcyAlbGQuIgorbXNnc3RyICIiCisKKyMuIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYSAxMy1iaXQKKyMuIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6CisjLiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZSByZWxvY2F0aW9uLgorIzogY29uZmlnL29iai1jb2ZmLmM6NDIwNCBjb25maWcvdGMtaTk2MC5jOjMyMjEgd3JpdGUuYzoyNjU5Cittc2dpZCAiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1jb2ZmLmM6NDI3OAorIywgYy1mb3JtYXQKK21zZ2lkICJWYWx1ZSBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAweCVseCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWNvZmYuYzo0MjkyIHdyaXRlLmM6Mjc0NworIywgYy1mb3JtYXQKK21zZ2lkICJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lY29mZi5jOjIzOQorbXNnaWQgIkNhbid0IHNldCBHUCB2YWx1ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVjb2ZmLmM6MjQ2Cittc2dpZCAiQ2FuJ3Qgc2V0IHJlZ2lzdGVyIG1hc2tzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6Mjc0IGNvbmZpZy90Yy1zcGFyYy5jOjMxNTYgY29uZmlnL3RjLXY4NTAuYzoyNjMKK21zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjI4MSBjb25maWcvdGMtYXJjLmM6Nzc4IGNvbmZpZy90Yy1zcGFyYy5jOjMxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6MjkxIGNvbmZpZy90Yy1hbHBoYS5jOjM0MjkgY29uZmlnL3RjLXNwYXJjLmM6MzE3MworIzogY29uZmlnL3RjLXY4NTAuYzoyODUKK21zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzoyOTkgY29uZmlnL3RjLWFyYy5jOjc5NiBjb25maWcvdGMtc3BhcmMuYzozMTgxCisjOiBjb25maWcvdGMtdjg1MC5jOjI5NQorIywgYy1mb3JtYXQKK21zZ2lkICJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzozMjIgY29uZmlnL3RjLWFyYy5jOjgxNSBjb25maWcvdGMtdjg1MC5jOjMyMgorbXNnaWQgIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjM0MSBjb25maWcvdGMtbTMyci5jOjEyOTggY29uZmlnL3RjLXBwYy5jOjEzODkKKyM6IGNvbmZpZy90Yy12ODUwLmM6Mzg1Cittc2dpZCAiQ29tbW9uIGFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6NDA0IGNvbmZpZy90Yy1hcmMuYzo4NzUgY29uZmlnL3RjLXNwYXJjLmM6MzMwNQorIzogY29uZmlnL3RjLXY4NTAuYzo1NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIC5jb21tb24gc2VnbWVudCAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjU4OQorbXNnaWQgIk1pc3Npbmcgc2VjdGlvbiBuYW1lIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6NjU0Cittc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZTogd2FudCBhLHcseCBpbiBzdHJpbmciCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzo3MDMKK21zZ2lkICJVbnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6NzE3Cittc2dpZCAiQmFkIC5zZWN0aW9uIGRpcmVjdGl2ZSAtIGNoYXJhY3RlciBmb2xsb3dpbmcgbmFtZSBpcyBub3QgJyMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6NzQ5Cittc2dpZCAiVW5yZWNvZ25pemVkIHNlY3Rpb24gYXR0cmlidXRlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6NzcwCisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gdHlwZSBmb3IgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzo3ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBpbmNvcnJlY3Qgc2VjdGlvbiBhdHRyaWJ1dGVzIGZvciAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjkwNQorbXNnaWQgIi5wcmV2aW91cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgLnNlY3Rpb247IGlnbm9yZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzo5NTQKKyMsIGMtZm9ybWF0Cittc2dpZCAibXVsdGlwbGUgLnN5bXZlciBkaXJlY3RpdmVzIGZvciBzeW1ib2wgYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjk2MworbXNnaWQgImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnN5bXZlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjk4NAorIywgYy1mb3JtYXQKK21zZ2lkICJtaXNzaW5nIHZlcnNpb24gbmFtZSBpbiBgJXMnIGZvciBzeW1ib2wgYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjExODcgY29uZmlnL29iai1zb20uYzoxNDggY29uZmlnL29iai1zb20uYzoxOTMKK21zZ2lkICJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6MTIwOAorIywgYy1mb3JtYXQKK21zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIGAlcycgaW4gLnNpemUgZGlyZWN0aXZlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6MTIxNworbXNnaWQgIm1pc3NpbmcgZXhwcmVzc2lvbiBpbiAuc2l6ZSBkaXJlY3RpdmUiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzoxMjgzCisjLCBjLWZvcm1hdAorbXNnaWQgImlnbm9yaW5nIHVucmVjb2duaXplZCBzeW1ib2wgdHlwZSBcIiVzXCIiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzoxNDUzCittc2dpZCAiLnNpemUgZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQgdG8gZml4IHVwIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6MTQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiaW52YWxpZCBhdHRlbXB0IHRvIGRlY2xhcmUgZXh0ZXJuYWwgdmVyc2lvbiBuYW1lIGFzIGRlZmF1bHQgaW4gc3ltYm9sIGAlcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1lbGYuYzoxNjEwCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdXAgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWVsZi5jOjE2MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3Qgc3RhcnQgd3JpdGluZyAubWRlYnVnIHNlY3Rpb246ICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotZWxmLmM6MTYzNAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgd3JpdGUgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLWllZWUuYzo0NjAKK21zZ2lkICJ0b28gbWFueSBzZWN0aW9ucyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXNvbS5jOjEzMQorbXNnaWQgIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai1zb20uYzoxNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXNvbS5jOjE3NgorbXNnaWQgIk9ubHkgb25lIC5jb3B5cmlnaHQgcHNldWRvLW9wIHBlciBmaWxlISIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXNvbS5jOjIwMgorIywgYy1mb3JtYXQKK21zZ2lkICJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0NjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29tcGlsZXIgZW1pdHRlZCB6ZXJvLXNpemUgY29tbW9uIHN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjQ3NAorIywgYy1mb3JtYXQKK21zZ2lkICJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjU5NworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjcmVhdGUgVk1TIG9iamVjdCBmaWxlIFwiJXNcIiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjYyMworbXNnaWQgIkkvTyBlcnJvciB3cml0aW5nIFZNUyBvYmplY3QgZmlsZSAobGVuZ3RoIHByZWZpeCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo2MzcKK21zZ2lkICJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzoxMjQwCittc2dpZCAiQ291bGRuJ3QgZmluZCBzb3VyY2UgZmlsZSBcIiVzXCIsIHN0YXR1cz0lJVgleCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjE3NDkgY29uZmlnL29iai12bXMuYzoyOTM3CisjLCBjLWZvcm1hdAorbXNnaWQgImRlYnVnZ2VyIGZvcndhcmQgcmVmZXJlbmNlIGVycm9yLCBkYnggdHlwZSAlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjE4MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjIxNDQKK21zZ2lkICIiCisiKioqV2FybmluZyAtIHRoZSBhc3NlbWJseSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgaGFzIHBsYWNlZCBcbiIKKyIgZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuIgorIiBvdGhlciBtb2R1bGVzLCBzaW5jZSB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMuIFlvdSBcbiIKKyIgaGF2ZSB0d28gb3B0aW9uczogMSkgZ2V0IGEgcGF0Y2hlZCBjb21waWxlciB0aGF0IGRvZXMgbm90IHB1dCBnbG9iYWwgXG4iCisiIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcbiIKKyIgZGVmaW5pdGlvbnMgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbiB5b3VyIHNvdXJjZSBtb2R1bGUocykuICBEb24ndCBzYXkgXG4iCisiIEkgZGlkbid0IHdhcm4geW91ISBcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjI0NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiZGVidWdnaW5lciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdW50eXBlZCB2YXJpYWJsZS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzoyNjgxCisjLCBjLWZvcm1hdAorbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzoyNzkyCisjLCBjLWZvcm1hdAorbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB0eXBlIG9mIHZhcmlhYmxlLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjI5MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjMxMzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9kdWxlIG5hbWUgdHJ1bmNhdGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotdm1zLmM6MzQxMAorIywgYy1mb3JtYXQKK21zZ2lkICJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIKK21zZ3N0ciAiIgorCisjLiBpbXBvc3NpYmxlCisjOiBjb25maWcvb2JqLXZtcy5jOjM2OTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biBWTVMgcHNlY3QgdHlwZSAoJWxkKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjM3MzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiR2xvYmFsc3ltYm9sIGF0dHJpYnV0ZSBmb3Igc3ltYm9sICVzIHdhcyB1bmV4cGVjdGVkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjM4ODUKK21zZ2lkICJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZ2xvYmFsdmFsdWUiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzozODk3CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgZ2xvYmFsdmFsdWUgb2YgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0MjQ3Cittc2dpZCAiQ291bGRuJ3QgZmluZCBmaXh1cCBmcmFnbWVudCB3aGVuIGNoZWNraW5nIGZvciBpbmRpcmVjdCByZWZlcmVuY2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0NTkxIGNvbmZpZy9vYmotdm1zLmM6NDczMworbXNnaWQgIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjQ1OTUgY29uZmlnL29iai12bXMuYzo0NzM3Cittc2dpZCAiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy9vYmotdm1zLmM6NDU5OCBjb25maWcvb2JqLXZtcy5jOjQ3NDAKK21zZ2lkICJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvb2JqLXZtcy5jOjQ2MTQgY29uZmlnL29iai12bXMuYzo0NzU5Cittc2dpZCAiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0NjE4IGNvbmZpZy9vYmotdm1zLmM6NDc2MworbXNnaWQgIkZpeHVwIGRhdHVtIGlzIG5vdCBcImZpeFAtPmZ4X2FkZHN5XCIiCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0ODM0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJnKysgd3JvdGUgYW4gZXh0ZXJuIHJlZmVyZW5jZSB0byBgJXMnIGFzIGEgcm91dGluZS5cbiIKKyJJIHdpbGwgZml4IGl0LCBidXQgSSBob3BlIHRoYXQgaXQgd2FzIG5vdGUgcmVhbGx5IGEgcm91dGluZS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0OTY2Cittc2dpZCAiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL29iai12bXMuYzo0OTY5CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gJXMiCittc2dzdHIgIiIKKworIy4KKyMuICoJRXJyb3Igb3RoZXJ3aXNlLgorIy4KKyM6IGNvbmZpZy9vYmotdm1zLmM6NTA1NAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmhhbmRsZWQgc3RhYiB0eXBlICVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hMjlrLmM6MTYwIGNvbmZpZy90Yy1zcGFyYy5jOjMzNTcKK21zZ2lkICJVbmtub3duIHNlZ21lbnQgdHlwZSIKK21zZ3N0ciAiIgorCisjLiBQcm9iYWJseSBhIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0/ICBHaXZlIHVwIG5vdy4KKyM6IGNvbmZpZy90Yy1hMjlrLmM6MzMwIGNvbmZpZy90Yy1ocHBhLmM6MTM1NCBjb25maWcvdGMtaTg2MC5jOjIwMgorIzogY29uZmlnL3RjLW1pcHMuYzoxMTAyIGNvbmZpZy90Yy1taXBzLmM6MTE0NCBjb25maWcvdGMtc3BhcmMuYzo3MTUKK21zZ2lkICJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYTI5ay5jOjM3NSBjb25maWcvdGMtYXJjLmM6NTM0IGNvbmZpZy90Yy1kMTB2LmM6NDgxCisjOiBjb25maWcvdGMtZDMwdi5jOjU0MCBjb25maWcvdGMtaDgzMDAuYzozMDUgY29uZmlnL3RjLWg4NTAwLmM6Mjk3CisjOiBjb25maWcvdGMtbWNvcmUuYzozODAgY29uZmlnL3RjLW1uMTAyMDAuYzo5MzYgY29uZmlnL3RjLW1uMTAzMDAuYzoxMzA3CisjOiBjb25maWcvdGMtcHBjLmM6MTg0NCBjb25maWcvdGMtc2guYzo0NzggY29uZmlnL3RjLXRpYzgwLmM6MjkxCisjOiBjb25maWcvdGMtdjg1MC5jOjIwMzMgY29uZmlnL3RjLXc2NS5jOjI1NyBjb25maWcvdGMtejhrLmM6MzQxCittc2dpZCAibWlzc2luZyBvcGVyYW5kIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hMjlrLmM6NDE1IGNvbmZpZy90Yy1ocHBhLmM6MTQ3MSBjb25maWcvdGMtaTg2MC5jOjQwNworIzogY29uZmlnL3RjLWk4NjAuYzo0MjMgY29uZmlnL3RjLXNwYXJjLmM6MTE5MSBjb25maWcvdGMtc3BhcmMuYzoxMTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gb3Bjb2RlOiBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hMjlrLmM6NDIwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVua25vd24gb3Bjb2RlIGAlcycuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hMjlrLmM6NDUyCisjLCBjLWZvcm1hdAorbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYTI5ay5jOjQ3NCBjb25maWcvdGMtYTI5ay5jOjUwNQorIywgYy1mb3JtYXQKK21zZ2lkICJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYTI5ay5jOjg5MiBjb25maWcvdGMtaTg2MC5jOjk0MAorIywgYy1mb3JtYXQKK21zZ2lkICJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWEyOWsuYzo5MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAibmVlZCAlbzNcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYTI5ay5jOjkzMgorbXNnaWQgImEyOWtfY29udmVydF9mcmFnXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWEyOWsuYzo5NDEKK21zZ2lkICJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWEyOWsuYzoxMDkyCisjLCBjLWZvcm1hdAorbXNnaWQgImxhYmVsIFwiJCVkXCIgcmVkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hMjlrLmM6MTE2NQorbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBhZnRlciAlJSUlXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWEyOWsuYzoxMTc2Cittc2dpZCAiSW52YWxpZCByZWdpc3RlciBpbiAmIGV4cHJlc3Npb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6NzIyCisjLCBjLWZvcm1hdAorbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG9wY29kZSBgJXMnOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo3NTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggbWFjcm8gYCVzJzogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6ODMyIGNvbmZpZy90Yy1pOTYwLmM6MjcxMQorbXNnaWQgInN5bnRheCBlcnJvciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo5MDUgY29uZmlnL3RjLWFybS5jOjQ5ODIgY29uZmlnL3RjLWg4MzAwLmM6MTQxMworIzogY29uZmlnL3RjLWg4NTAwLmM6MTIyMiBjb25maWcvdGMtaHBwYS5jOjM2NTEgY29uZmlnL3RjLWk4NjAuYzo4MTMKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDAwMyBjb25maWcvdGMtbTg4ay5jOjExMDYgY29uZmlnL3RjLW5zMzJrLmM6MTU4OAorIzogY29uZmlnL3RjLXNwYXJjLmM6MjQzMyBjb25maWcvdGMtejhrLmM6MTM1NQorbXNnaWQgIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo5NTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5rbm93biBDUFUgaWRlbnRpZmllciBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjk5OQorbXNnaWQgIiIKKyJBbHBoYSBvcHRpb25zOlxuIgorIi0zMmFkZHJcdFx0XHR0cmVhdCBhZGRyZXNzZXMgYXMgMzItYml0IHZhbHVlc1xuIgorIi1GXHRcdFx0bGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuIgorIi1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuIgorIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBBbHBoYSBhcmNoaXRlY3R1cmVcbiIKKyItbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcbiIKKyJcdFx0XHR0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjEwMDkKK21zZ2lkICIiCisiVk1TIG9wdGlvbnM6XG4iCisiLStcdFx0XHRoYXNoIGVuY29kZSAoZG9uJ3QgdHJ1bmNhdGUpIG5hbWVzIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnNcbiIKKyItSFx0XHRcdHNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzoxMTY1CisjLCBjLWZvcm1hdAorbXNnaWQgInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MTE3OAorbXNnaWQgIm5vbi1hYnNvbHV0ZSBleHByZXNzaW9uIGluIGNvbnN0YW50IGZpZWxkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjExOTIKKyMsIGMtZm9ybWF0Cittc2dpZCAidHlwZSAlZCByZWxvYyBkb25lP1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjEyNDMgY29uZmlnL3RjLWFscGhhLmM6MTI1MCBjb25maWcvdGMtbWlwcy5jOjc3NzcKK21zZ2lkICJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MTQwNworIywgYy1mb3JtYXQKK21zZ2lkICJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzoxNDE0CisjLCBjLWZvcm1hdAorbXNnaWQgImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjE0NjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjE3OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVkIGFuZCAlZCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MTg5MCBjb25maWcvdGMtYXJjLmM6NTQ3IGNvbmZpZy90Yy1kMTB2LmM6NTcwCisjOiBjb25maWcvdGMtZDMwdi5jOjYyMyBjb25maWcvdGMtbW4xMDIwMC5jOjk5MSBjb25maWcvdGMtbW4xMDMwMC5jOjEzODIKKyM6IGNvbmZpZy90Yy1wcGMuYzoxODEwIGNvbmZpZy90Yy1wcGMuYzoxOTE3IGNvbmZpZy90Yy1wcGMuYzoxOTI5CisjOiBjb25maWcvdGMtdjg1MC5jOjE4MTkgY29uZmlnL3RjLXY4NTAuYzoxODQyIGNvbmZpZy90Yy12ODUwLmM6MjA1NQorbXNnaWQgInRvbyBtYW55IGZpeHVwcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzoyMDE1IGNvbmZpZy90Yy1hbHBoYS5jOjIwNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjIwMTcgY29uZmlnL3RjLWFscGhhLmM6MjA3NQorIywgYy1mb3JtYXQKK21zZ2lkICJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MjAyMSBjb25maWcvdGMtYWxwaGEuYzoyMDc4CisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd24gb3Bjb2RlIGAlcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MjEzMAorbXNnaWQgImNhbiBub3QgcmVzb2x2ZSBleHByZXNzaW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNjggY29uZmlnL3RjLWFscGhhLmM6MjQ0NQorbXNnaWQgIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzoyMjc1IGNvbmZpZy90Yy1hbHBoYS5jOjIyOTcgY29uZmlnL3RjLWFscGhhLmM6MjQ1OAorIzogY29uZmlnL3RjLWFscGhhLmM6MjY4MCBjb25maWcvdGMtYWxwaGEuYzoyNzI3IGNvbmZpZy90Yy1hbHBoYS5jOjI3NzUKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjI4NjQgY29uZmlnL3RjLWFscGhhLmM6MzA2NSBjb25maWcvdGMtYWxwaGEuYzozMTY2Cittc2dpZCAibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNzcgY29uZmlnL3RjLWFscGhhLmM6MjI5OSBjb25maWcvdGMtYWxwaGEuYzoyNDYwCittc2dpZCAibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MjQwNyBleHByLmM6ODIgcmVhZC5jOjMxMDEKK21zZ2lkICJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0MDkgZXhwci5jOjg0IHJlYWQuYzozMTAzIHJlYWQuYzozNDMyIHJlYWQuYzo0MzI4Cittc2dpZCAiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzoyNDE0Cittc2dpZCAiY2FuJ3QgaGFuZGxlIGV4cHJlc3Npb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MjQ1MQorbXNnaWQgIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzozNDAwIGNvbmZpZy90Yy1wcGMuYzoxMzM4IGNvbmZpZy90Yy1wcGMuYzozNTQyCisjOiByZWFkLmM6MTM1OAorIywgYy1mb3JtYXQKK21zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM0MzggY29uZmlnL3RjLWFscGhhLmM6MzQ0NyBjb25maWcvdGMtcHBjLmM6MzU3OQorIzogcmVhZC5jOjEzNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzozNTQ5IGVjb2ZmLmM6MzEwNQorbXNnaWQgIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1NTcKK21zZ2lkICJuZXN0ZWQgLmVudCBkaXJlY3RpdmVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1OTMgZWNvZmYuYzozMDUzCittc2dpZCAiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MzYwMgorbXNnaWQgIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM2NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBhcmd1bWVudCAlZCB0byAucHJvbG9ndWUuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3MDQKK21zZ2lkICJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3MjUKK21zZ2lkICJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3NjIKK21zZ2lkICIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3OTAKK21zZ2lkICJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAxLi8yLiBwYXJhbSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzozODAyCittc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMy4vNC4gcGFyYW0iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6MzgyNworbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4MzUKK21zZ2lkICIucGRlc2MgaGFzIG5vIG1hdGNoaW5nIC5lbnQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6Mzg0NQorbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzozODU3Cittc2dpZCAiTm8gY29tbWEgYWZ0ZXIgLnBkZXNjIDxlbnRyeW5hbWU+IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4ODAKK21zZ2lkICJ1bmtub3duIHByb2NlZHVyZSBraW5kIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM5NzUKK21zZ2lkICIubmFtZSBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjM5ODMKK21zZ2lkICIubmFtZSBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo0MDE4Cittc2dpZCAiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjQwNDcKK21zZ2lkICJObyBzeW1ib2wgYWZ0ZXIgLmNvZGVfYWRkcmVzcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo0MDgyIGVjb2ZmLmM6MzI2OQorbXNnaWQgIkJhZCAubWFzayBkaXJlY3RpdmUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6NDEwNCBlY29mZi5jOjMyMDAKK21zZ2lkICJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo0Mjc1IHJlYWQuYzoyMTIzIHJlYWQuYzoyNjc1IHN0YWJzLmM6NDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIgorbXNnc3RyICIiCisKKyMuIHN5bWJvbFAtPnN5X290aGVyID0gKHNpZ25lZCBjaGFyKSB0ZW1wOworIzogY29uZmlnL3RjLWFscGhhLmM6NDI4NgorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmhhbmRsZWQ6IC5wcm9jICVzLCVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIgorbXNnc3RyICIiCisKKyMuIG5vdCBmYXRhbCwgYnV0IGl0IG1pZ2h0IG5vdCB3b3JrIGluIHRoZSBlbmQKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzMzgKK21zZ2lkICJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6NDM1NQorIywgYy1mb3JtYXQKK21zZ2lkICJCYWQgYmFzZSByZWdpc3RlciwgdXNpbmcgJCVkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYWxwaGEuYzo0Mzc3CisjLCBjLWZvcm1hdAorbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzODEgY29uZmlnL3RjLWQzMHYuYzoyMTYzCittc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFscGhhLmM6NDY5NAorIywgYy1mb3JtYXQKK21zZ2lkICJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6MTM2Cittc2dpZCAiIgorIkFSQyBvcHRpb25zOlxuIgorIi1FQlx0XHRcdGdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG4iCisiLUVMXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6MTU0IGNvbmZpZy90Yy1hcmMuYzoxNzcgY29uZmlnL3RjLWFyYy5jOjkyMQorIzogY29uZmlnL3RjLWhwcGEuYzoxMzE2IGNvbmZpZy90Yy1ocHBhLmM6NjQxMCBjb25maWcvdGMtaHBwYS5jOjY0MTYKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NjQyMiBjb25maWcvdGMtbW4xMDMwMC5jOjg5MCBjb25maWcvdGMtbW4xMDMwMC5jOjIwMjMKK21zZ2lkICJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6MTc0Cittc2dpZCAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzoyNTMgY29uZmlnL3RjLW1uMTAyMDAuYzoxMzU0IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTkzMAorIzogY29uZmlnL3RjLXBwYy5jOjEwOTUgY29uZmlnL3RjLXY4NTAuYzoxNjE4CisjLCBjLWZvcm1hdAorbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjM4OAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIHN5bnRheCBmb3JtYXQgY2hhcmFjdGVyIGAlYyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjQ4NworbXNnaWQgInRvbyBtYW55IHN1ZmZpeGVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzo1MzIgY29uZmlnL3RjLWQxMHYuYzo0NzkgY29uZmlnL3RjLWQzMHYuYzo1MzgKKyM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6OTMzIGNvbmZpZy90Yy1tbjEwMzAwLmM6MTMwNCBjb25maWcvdGMtcHBjLmM6MTg0MgorIzogY29uZmlnL3RjLXRpYzgwLmM6Mjg3IGNvbmZpZy90Yy12ODUwLmM6MjAzMAorbXNnaWQgImlsbGVnYWwgb3BlcmFuZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6NjE5IGNvbmZpZy90Yy1tbjEwMjAwLmM6MTAzMiBjb25maWcvdGMtbW4xMDMwMC5jOjE0NTIKKyM6IGNvbmZpZy90Yy1wcGMuYzoxOTY2IGNvbmZpZy90Yy12ODUwLmM6MjEwOAorIywgYy1mb3JtYXQKK21zZ2lkICJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzo2NTkKK21zZ2lkICI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6NjYxCittc2dpZCAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzo2NjkKK21zZ2lkICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjc0OCBjb25maWcvdGMtYXJtLmM6NjA0MQorIywgYy1mb3JtYXQKK21zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6NzcxCittc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjc4OAorbXNnaWQgImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6ODAzCittc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6ODk2Cittc2dpZCAiLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzo5MTUKK21zZ2lkICIuY3B1IGNvbmZsaWN0cyB3aXRoIHByZXZpb3VzIHZhbHVlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzo5MjYKK21zZ2lkICJiYWQgLmNwdSBvcCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6OTUwIGNvbmZpZy90Yy1wcGMuYzoyNjE1Cittc2dpZCAibWlzc2luZyByZW5hbWUgc3RyaW5nIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzo5NjIKK21zZ2lkICJpbnZhbGlkIHN5bWJvbCB0byByZW5hbWUgdG8iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjEwMDkgY29uZmlnL3RjLWQxMHYuYzoyNzQgY29uZmlnL3RjLWQzMHYuYzozNTMKKyM6IGNvbmZpZy90Yy1taXBzLmM6OTMxNyBjb25maWcvdGMtbW4xMDIwMC5jOjM1NiBjb25maWcvdGMtcHBjLmM6NDM2MworIzogY29uZmlnL3RjLXNoLmM6MTE4NyBjb25maWcvdGMtdjg1MC5jOjEyNzYKK21zZ2lkICJiYWQgY2FsbCB0byBtZF9hdG9mIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzoxMDk2CisjLCBjLWZvcm1hdAorbXNnaWQgIm1pc3NpbmcgJyknIGluICUtb3AiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjExMzAKK21zZ2lkICJleHByZXNzaW9uIHRvbyBjb21wbGV4IGZvciAlJXN0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcmMuYzoxMzI0IGNvbmZpZy90Yy1hcm0uYzoyOTM3IGNvbmZpZy90Yy1kMTB2LmM6MTQ0OAorIzogY29uZmlnL3RjLWQzMHYuYzoxODEwIGNvbmZpZy90Yy1taXBzLmM6MzM2MSBjb25maWcvdGMtbWlwcy5jOjQzMTcKKyM6IGNvbmZpZy90Yy1taXBzLmM6NTEwMiBjb25maWcvdGMtbWlwcy5jOjU2NDggY29uZmlnL3RjLXBwYy5jOjQ2OTgKKyM6IGNvbmZpZy90Yy12ODUwLmM6MjMzOQorbXNnaWQgImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFyYy5jOjEzOTAgY29uZmlnL3RjLXBwYy5jOjQ4MDEgY29uZmlnL3RjLXY4NTAuYzoyMzgzCittc2dpZCAidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJjLmM6MTQ1NCBjb25maWcvdGMtc3BhcmMuYzoyODgwCisjLCBjLWZvcm1hdAorbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjk4MworbXNnaWQgIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTEwMworbXNnaWQgIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjExMzkKK21zZ2lkICJOb3RoaW5nIHRvIHB1dCBpbiB0aGUgcG9vbFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxMTUxCittc2dpZCAiSW5zZXJ0aW5nIGltcGxpY2l0IHBvb2wgYXQgY2hhbmdlIG9mIHNlY3Rpb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjExODMgY29uZmlnL3RjLW1pcHMuYzoxMDYwMyByZWFkLmM6MjAxNworIywgYy1mb3JtYXQKK21zZ2lkICJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjExODYgcmVhZC5jOjIwMjIKK21zZ2lkICJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjEyNTEKK21zZ2lkICJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBUSFVNQiBvcGNvZGVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxMjYzCittc2dpZCAic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgQVJNIG9wY29kZXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjEyNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBpbnN0cnVjdGlvbiBzaXplIHNlbGVjdGVkICglZCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjEzMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBvcGVyYW5kIHRvIC5jb2RlIGRpcmVjdGl2ZSAoJWQpIChleHBlY3RpbmcgMTYgb3IgMzIpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxMzE5Cittc2dpZCAiR2FyYmFnZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24iCittc2dzdHIgIiIKKworIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQorIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgorIzogY29uZmlnL3RjLWFybS5jOjEzNjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVnaXN0ZXIgZXhwZWN0ZWQsIG5vdCAnJS4xMDBzJyIKK21zZ3N0ciAiIgorCisjLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCisjLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCisjOiBjb25maWcvdGMtYXJtLmM6MTM5MworbXNnaWQgIjxwc3IoZik+IGV4cGVjdGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxNDI0Cittc2dpZCAiSWxsZWdhbCBjby1wcm9jZXNzb3IgbnVtYmVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxNDMxCittc2dpZCAiQmFkIG9yIG1pc3NpbmcgY28tcHJvY2Vzc29yIG51bWJlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTQ1NgorbXNnaWQgImJhZCBvciBtaXNzaW5nIGV4cHJlc3Npb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjE0NjIKK21zZ2lkICJpbW1lZGlhdGUgY28tcHJvY2Vzc29yIGV4cHJlc3Npb24gdG9vIGxhcmdlIgorbXNnc3RyICIiCisKKyMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKKyMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KKyM6IGNvbmZpZy90Yy1hcm0uYzoxNDg3Cittc2dpZCAiQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGV4cGVjdGVkIgorbXNnc3RyICIiCisKKyMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKKyMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KKyM6IGNvbmZpZy90Yy1hcm0uYzoxNTExCittc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZXhwZWN0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjE1MjkKK21zZ2lkICJpbW1lZGlhdGUgZXhwcmVzc2lvbiBleHBlY3RlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTU0NAorbXNnaWQgImNvLXByb2Nlc3NvciBhZGRyZXNzIG11c3QgYmUgd29yZCBhbGlnbmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxNTUwCittc2dpZCAib2Zmc2V0IHRvbyBsYXJnZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTYwMAorbXNnaWQgInBjIG1heSBub3QgYmUgdXNlZCBpbiBwb3N0LWluY3JlbWVudCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTYxNiBjb25maWcvdGMtYXJtLmM6MjcyNworbXNnaWQgInByZS1pbmRleGVkIGV4cHJlc3Npb24gZXhwZWN0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjE2MzAgY29uZmlnL3RjLWFybS5jOjI3NDAgY29uZmlnL3RjLWFybS5jOjMwODkKK21zZ2lkICJtaXNzaW5nIF0iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjE2NDEKK21zZ2lkICJwYyBtYXkgbm90IGJlIHVzZWQgd2l0aCB3cml0ZS1iYWNrIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxNjk2Cittc2dpZCAiPHBzcj4gZXhwZWN0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjE3NTggY29uZmlnL3RjLWFybS5jOjIzNzgKK21zZ2lkICJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoxNzcyIGNvbmZpZy90Yy1hcm0uYzoyMDkwIGNvbmZpZy90Yy1hcm0uYzoyMzQ1CisjOiBjb25maWcvdGMtYXJtLmM6MjM2NQorbXNnaWQgIkludmFsaWQgY29uc3RhbnQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjE3ODMKK21zZ2lkICJFcnJvcjogdW5yZWNvZ25pc2VkIHN5bnRheCBmb3Igc2Vjb25kIGFyZ3VtZW50IHRvIG1zciBpbnN0cnVjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTgzMworbXNnaWQgInJkaGksIHJkbG8gYW5kIHJtIG11c3QgYWxsIGJlIGRpZmZlcmVudCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTg5MAorbXNnaWQgInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG11bCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MTk0NworbXNnaWQgInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG1sYSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MjA3NAorbXNnaWQgImJhZF9zZWdtZW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoyMTIxIGNvbmZpZy90Yy1hcm0uYzoyMTk5Cittc2dpZCAiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MjE2MworbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIHNoaWZ0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoyMTkyCittc2dpZCAic2hpZnQgcmVxdWlyZXMgcmVnaXN0ZXIgb3IgI2V4cHJlc3Npb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjIxOTMKK21zZ2lkICJzaGlmdCByZXF1aXJlcyAjZXhwcmVzc2lvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MjMzNiBjb25maWcvdGMtYXJtLmM6Mjc3MAorbXNnaWQgIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI0MzIKK21zZ2lkICJJbnZhbGlkIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBleHByZXNzaW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoyNDM1Cittc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlIGV4cHJlc3Npb24gZXhwZWN0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI1NzQKK21zZ2lkICJhZGRyZXNzIG9mZnNldCB0b28gbGFyZ2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI2NDUKK21zZ2lkICJQcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBoYWxmd29yZHMgb3Igc2lnbmVkIGJ5dGVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoyNjY3Cittc2dpZCAiQWRkcmVzcyBleHBlY3RlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MjY5OCBjb25maWcvdGMtYXJtLmM6MjcxMiBjb25maWcvdGMtYXJtLmM6Mjc1MAorbXNnaWQgImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI3OTAKK21zZ2lkICJsaXRlcmFsIHBvb2wgaW5zZXJ0aW9uIGZhaWxlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MjgyNgorbXNnaWQgIlByZS1pbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0cmFuc2xhdGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI4NjgKK21zZ2lkICJCYWQgcmFuZ2UgaW4gcmVnaXN0ZXIgbGlzdCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6Mjg3NiBjb25maWcvdGMtYXJtLmM6Mjg4NSBjb25maWcvdGMtYXJtLmM6MjkyNworIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI4ODgKK21zZ2lkICJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzoyOTAwCittc2dpZCAiTWlzc2luZyBgfSciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI5MTYKK21zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG1hc2siCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjI5NzcKK21zZ2lkICJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MzA0NyBjb25maWcvdGMtYXJtLmM6MzA2MQorbXNnaWQgInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzozMTU4Cittc2dpZCAiVXNlIG9mIHIxNSBpbiBieCBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MzQxNyBjb25maWcvdGMtdjg1MC5jOjE5MjEgY29uZmlnL3RjLXY4NTAuYzoxOTQyCittc2dpZCAiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MzQyMworbXNnaWQgIkNvbnN0YW50IHZhbHVlIHJlcXVpcmVkIGZvciBudW1iZXIgb2YgcmVnaXN0ZXJzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzozNDMxCittc2dpZCAibnVtYmVyIG9mIHJlZ2lzdGVycyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMTo0XSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6MzQ5MworbXNnaWQgIlIxNSBub3QgYWxsb3dlZCBhcyBiYXNlIHJlZ2lzdGVyIHdpdGggd3JpdGUtYmFjayIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6Mzc0NQorbXNnaWQgImxvIHJlZ2lzdGVyIHJlcXVpcmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzozNzUzCittc2dpZCAiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjM4MjMKK21zZ2lkICJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjM4MzAKK21zZ2lkICJzdWJ0cmFjdCB2YWxpZCBvbmx5IG9uIGxvIHJlZ3MiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjM4NTQKK21zZ2lkICJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzozODgxIGNvbmZpZy90Yy1hcm0uYzozOTE0IGNvbmZpZy90Yy1hcm0uYzozOTI0Cittc2dpZCAiaW1tZWRpYXRlIHZhbHVlIG91dCBvZiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6Mzg5MgorbXNnaWQgImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjM5MDMKK21zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6Mzk5MAorbXNnaWQgInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0MDI1Cittc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHNoaWZ0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0MTA0Cittc2dpZCAib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjQxMjMKK21zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NDE3OAorbXNnaWQgImV4cGVjdGVkICddJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NDI0NQorbXNnaWQgImJ5dGUgb3IgaGFsZndvcmQgbm90IHZhbGlkIGZvciBiYXNlIHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0MjUwCittc2dpZCAiUjE1IGJhc2VkIHN0b3JlIG5vdCBhbGxvd2VkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0MjU1Cittc2dpZCAiSW52YWxpZCBiYXNlIHJlZ2lzdGVyIGZvciByZWdpc3RlciBvZmZzZXQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjQyNzMKK21zZ2lkICJpbnZhbGlkIG9mZnNldCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NDI4NAorbXNnaWQgImludmFsaWQgYmFzZSByZWdpc3RlciBpbiBsb2FkL3N0b3JlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0MzA4IGNvbmZpZy90Yy1hcm0uYzo1NDcxIGNvbmZpZy90Yy1hcm0uYzo1NDgwCisjOiBjb25maWcvdGMtYXJtLmM6NTQ4NyBjb25maWcvdGMtYXJtLmM6NTQ5NCBjb25maWcvdGMtYXJtLmM6NTUwMQorbXNnaWQgIkludmFsaWQgb2Zmc2V0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0Mzg2Cittc2dpZCAiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NDM5NAorbXNnaWQgIlJzIGFuZCBSZCBtdXN0IGJlIGRpZmZlcmVudCBpbiBNVUwiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjQ1MzkKK21zZ2lkICIiCisiSW5zZXJ0ZWQgbWlzc2luZyAnISc6IGxvYWQvc3RvcmUgbXVsdGlwbGUgYWx3YXlzIHdyaXRlcyBiYWNrIGJhc2UgcmVnaXN0ZXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjQ1NTUgY29uZmlnL3RjLWFybS5jOjQ2NTcKK21zZ2lkICJFeHByZXNzaW9uIHRvbyBjb21wbGV4IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0NTYxCittc2dpZCAib25seSBsby1yZWdzIHZhbGlkIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjQ2MDgKK21zZ2lkICJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0NjczCittc2dpZCAiaW52YWxpZCByZWdpc3RlciBsaXN0IHRvIHB1c2gvcG9wIGluc3RydWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo0ODExCittc2dpZCAiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1MjAzCisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgY29uc3RhbnQgKCV4KSBhZnRlciBmaXh1cFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1MjE1IGNvbmZpZy90Yy1hcm0uYzo1MjM2CisjLCBjLWZvcm1hdAorbXNnaWQgImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIG9mZnNldCAoJWQpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1MjM0IGNvbmZpZy90Yy1hcm0uYzo1MjU3Cittc2dpZCAiaW52YWxpZCBsaXRlcmFsIGNvbnN0YW50OiBwb29sIG5lZWRzIHRvIGJlIGNsb3NlclxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1Mjc0Cittc2dpZCAic2hpZnQgZXhwcmVzc2lvbiBpcyB0b28gbGFyZ2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjUyOTIgY29uZmlnL3RjLWFybS5jOjUzMDEKK21zZ2lkICJJbnZhbGlkIHN3aSBleHByZXNzaW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1MzExCittc2dpZCAiSW52YWxpZCBleHByZXNzaW9uIGluIGxvYWQvc3RvcmUgbXVsdGlwbGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjUzNDEgY29uZmlnL3RjLWFybS5jOjUzNTcgY29uZmlnL3RjLW1pcHMuYzoxMDQzMAorbXNnaWQgIkJyYW5jaCBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjUzNzYKK21zZ2lkICJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NTQ0MworbXNnaWQgIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU0NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1NTM3Cittc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHN0YWNrIGFkZHJlc3MgY2FsY3VsYXRpb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU1NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKHZhbHVlID0gMHglMDhYKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NTU1NQorbXNnaWQgIkludmFsaWQgOGJpdCBpbW1lZGlhdGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU1NjMKK21zZ2lkICJJbnZhbGlkIDNiaXQgaW1tZWRpYXRlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1NTc5CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlOiAlZCBpcyB0b28gbGFyZ2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU1OTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWxsZWdhbCBUaHVtYiBzaGlmdCB2YWx1ZTogJWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU2MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQmFkIHJlbG9jYXRpb24gZml4dXAgdHlwZSAoJWQpXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU2NzYKK21zZ2lkICJMaXRlcmFsIHJlZmVyZW5jZWQgYWNyb3NzIHNlY3Rpb24gYm91bmRyeSAoSW1wbGljaXQgZHVtcD8pIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1Njk1CisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoSU1NRURJQVRFKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NTcwMQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKE9GRlNFVF9JTU0pIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1NzI0CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgKCVkKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NTc0MiBjb25maWcvdGMtbWlwcy5jOjExOTA5IGNvbmZpZy90Yy1zaC5jOjIyNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NTc1NQorbXNnaWQgIm1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjU4MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NTg3NSBjb25maWcvdGMtYXJtLmM6NTkyNworIywgYy1mb3JtYXQKK21zZ2lkICJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo1OTAwCittc2dpZCAiV2FybmluZzogVXNlIG9mIHRoZSAnbnYnIGNvbmRpdGlvbmFsIGlzIGRlcHJlY2F0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjAxOQorIywgYy1mb3JtYXQKK21zZ2lkICJyZWdpc3RlciAnJXMnIGRvZXMgbm90IGV4aXN0XG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjYwMjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjYwMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIHRvIG5vbi1leGlzdGFudCByZWdpc3RlciAnJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo2MDM0Cittc2dpZCAiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbmlzZWQgQVBDUyBzd2l0Y2ggLW0lcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjMzNiBjb25maWcvdGMtYXJtLmM6NjM0NyBjb25maWcvdGMtYXJtLmM6NjM1OAorIzogY29uZmlnL3RjLWFybS5jOjYzNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo2MzcwCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgcHJvY2Vzc29yIHZhcmlhbnQgLW0lcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjM5MgorbXNnaWQgIiIKKyIgQVJNIFNwZWNpZmljIEFzc2VtYmxlciBPcHRpb25zOlxuIgorIiAgLW1bYXJtXVs8cHJvY2Vzc29yIG5hbWU+XSBzZWxlY3QgcHJvY2Vzc29yIHZhcmlhbnRcbiIKKyIgIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0XSAgc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG4iCisiICAtbXRodW1iICAgICAgICAgICAgICAgICAgIG9ubHkgYWxsb3cgVGh1bWIgaW5zdHJ1Y3Rpb25zXG4iCisiICAtbXRodW1iLWludGVyd29yayAgICAgICAgIG1hcmsgdGhlIGFzc2VtYmxlZCBjb2RlIGFzIHN1cHBvcnRpbmcgIgorImludGVyd29ya2luZ1xuIgorIiAgLW1hbGwgICAgICAgICAgICAgICAgICAgICBhbGxvdyBhbnkgaW5zdHJ1Y3Rpb25cbiIKKyIgIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgICAgc2VsZWN0IGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZVxuIgorIiAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSAiCisiaW5zdHJ1Y3Rpb25zXG4iCisiICAtbW5vLWZwdSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGFueSBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMuXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjY0MDMKK21zZ2lkICIgIC1rICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgUElDIGNvZGUuXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWFybS5jOjY0MDcKK21zZ2lkICIiCisiICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvICIKKyJ1c2VcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjQxMAorbXNnaWQgIiAgLW1hcGNzLWZsb2F0ICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBhcmdzIGFyZSBwYXNzZWQgaW4gRlAgcmVnc1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo2NDEzCittc2dpZCAiIgorIiAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgICB0aGUgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudC9yZWVudHJhbnRcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjQxOAorbXNnaWQgIiAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1hcm0uYzo2NDIzCittc2dpZCAiIgorIiAgLUVCICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gY3B1XG4iCisiICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtYXJtLmM6NjU5NgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogdW5leHBlY3RlZCBmdW5jdGlvbiB0eXBlOiAlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjIxOAorbXNnaWQgIiIKKyJEMTBWIG9wdGlvbnM6XG4iCisiLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjUyMSBjb25maWcvdGMtZDEwdi5jOjYwMyBjb25maWcvdGMtZDMwdi5jOjYzOQorIywgYy1mb3JtYXQKK21zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzo2NjQKK21zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGggYW5vdGhlciBpbnN0cnVjdGlvbi4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzo3MTYKK21zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMTB2LmM6NzE5Cittc2dpZCAiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzo3NTkKK21zZ2lkICJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMTB2LmM6NzY0IGNvbmZpZy90Yy1kMzB2LmM6ODQzCittc2dpZCAiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMTB2LmM6NzY2IGNvbmZpZy90Yy1kMTB2LmM6Nzc0IGNvbmZpZy90Yy1kMTB2LmM6Nzg5CisjOiBjb25maWcvdGMtZDEwdi5jOjgwMiBjb25maWcvdGMtZDMwdi5jOjg0NCBjb25maWcvdGMtZDMwdi5jOjg1MworbXNnaWQgIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMTB2LmM6NzcyIGNvbmZpZy90Yy1kMzB2LmM6ODUwCittc2dpZCAiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMTB2LmM6NzkzIGNvbmZpZy90Yy1kMzB2LmM6ODY5Cittc2dpZCAiSVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgbGVmdCBjb250YWluZXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzo4MDYgY29uZmlnL3RjLWQzMHYuYzo4ODIKK21zZ2lkICJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzo4MTAgY29uZmlnL3RjLWQzMHYuYzo4OTAKK21zZ2lkICJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzoxMDIzIGNvbmZpZy90Yy1kMTB2LmM6MTAzNyBjb25maWcvdGMtaDgzMDAuYzoxMjc5CisjOiBjb25maWcvdGMtaDg1MDAuYzoxMTIyIGNvbmZpZy90Yy1tY29yZS5jOjcwOSBjb25maWcvdGMtc2guYzoxMDQwCisjOiBjb25maWcvdGMtejhrLmM6MTIyMworbXNnaWQgImNhbid0IGZpbmQgb3Bjb2RlICIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjEwNTAgY29uZmlnL3RjLWQxMHYuYzoxMDY4IGNvbmZpZy90Yy1kMzB2LmM6MTM2OAorbXNnaWQgIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjExMTYgY29uZmlnL3RjLWQzMHYuYzoxNTAzCisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd24gb3Bjb2RlOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjExOTcgY29uZmlnL3RjLWQxMHYuYzoxMzQzIGNvbmZpZy90Yy10aWM4MC5jOjUzNworbXNnaWQgImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzoxMjQ2IGNvbmZpZy90Yy1tNjhrLmM6NDExMAorbXNnaWQgInZhbHVlIG91dCBvZiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjEzMTgKK21zZ2lkICJpbGxlZ2FsIG9wZXJhbmQgLSByZWdpc3RlciBuYW1lIGZvdW5kIHdoZXJlIG5vbmUgZXhwZWN0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzoxMzU0IGNvbmZpZy90Yy10aWM4MC5jOjU0OAorbXNnaWQgIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzoxMzg1IGNvbmZpZy90Yy1kMzB2LmM6MTc1NCBjb25maWcvdGMtbW4xMDIwMC5jOjEyMzQKKyM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTc4NiBjb25maWcvdGMtcHBjLmM6NDk5NyBjb25maWcvdGMtdjg1MC5jOjIyNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQxMHYuYzoxNDk4CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWQ6IHJlcCBvciByZXBpIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA0IGluc3RydWN0aW9ucyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDEwdi5jOjE1MTcgY29uZmlnL3RjLWQzMHYuYzoxOTM1CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIlJlZ2lzdGVyIG5hbWUgJXMgY29uZmxpY3RzIHdpdGggc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoyNzYKK21zZ2lkICIiCisiXG4iCisiRDMwViBvcHRpb25zOlxuIgorIi1PICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYWRqYWNlbnQgc2hvcnQgaW5zdHJ1Y3Rpb25zIHBhcmFsbGVsIGlmICIKKyJwb3NzaWJsZS5cbiIKKyItbiAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IGFsbCBOT1BzIGluc2VydGVkIGJ5IHRoZSBhc3NlbWJsZXIuXG4iCisiLU5cdFx0XHRXYXJuIGFib3V0IE5PUHMgaW5zZXJ0ZWQgYWZ0ZXIgd29yZCBtdWx0aXBsaWVzLlxuIgorIi1jICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgc3ltYm9scyB3aG9lcyBuYW1lcyBtYXRjaCByZWdpc3RlciAiCisibmFtZXMuXG4iCisiLUMgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGUgb2YgLUMuICAtYyBpcyB0aGUgZGVmYXVsdC5cbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDMwdi5jOjQ1MAorbXNnaWQgInVuZXhwZWN0ZWQgMTItYml0IHJlbG9jIHR5cGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzo0NTcKK21zZ2lkICJ1bmV4cGVjdGVkIDE4LWJpdCByZWxvYyB0eXBlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6NzAxCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIE5PUCBpbnNlcnRlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDMwdi5jOjcwMgorbXNnaWQgInNlcXVlbnRpYWwiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzo3MDIKK21zZ2lkICJwYXJhbGxlbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDMwdi5jOjgzOQorbXNnaWQgIkluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6ODUyIGNvbmZpZy90Yy1kMzB2LmM6ODU5IGNvbmZpZy90Yy1kMzB2LmM6ODc1CisjOiBjb25maWcvdGMtZDMwdi5jOjg4NAorIywgYy1mb3JtYXQKK21zZ2lkICJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6ODcxCisjLCBjLWZvcm1hdAorbXNnaWQgInNwZWNpYWwgbGVmdCBpbnN0cnVjdGlvbiBgJXMnIGtpbGxzIGluc3RydWN0aW9uIGAlcycgaW4gcmlnaHQgY29udGFpbmVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTI1MCBjb25maWcvdGMtZDMwdi5jOjEyNjcKK21zZ2lkICJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoxMjUyCittc2dpZCAiRmlyc3Qgb3Bjb2RlIGlzIGxvbmcuICBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTMyMAorbXNnaWQgIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIGxvYWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoxMzIyCittc2dpZCAid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgMTYtYml0IG11bHRpcGx5IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTM1MgorbXNnaWQgIkluc3RydWN0aW9uIHVzZXMgbG9uZyB2ZXJzaW9uLCBzbyBpdCBjYW5ub3QgYmUgbWl4ZWQgYXMgc3BlY2lmaWVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTQzNiBjb25maWcvdGMtZDMwdi5jOjE0NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoxNDY2CisjLCBjLWZvcm1hdAorbXNnaWQgImNtcHUgZG9lc24ndCBzdXBwb3J0IGNvbmRpdGlvbiBjb2RlICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTUxNAorIywgYy1mb3JtYXQKK21zZ2lkICJvcGVyYW5kcyBmb3Igb3Bjb2RlIGAlcycgZG8gbm90IG1hdGNoIGFueSB2YWxpZCBmb3JtYXQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoxNzI3Cittc2dpZCAiT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTgyNAorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgYnl0ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtZDMwdi5jOjE4MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBieXRlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MTgzNQorIywgYy1mb3JtYXQKK21zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgc2hvcnQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoxODM4CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgc2hvcnQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoxODQ2CisjLCBjLWZvcm1hdAorbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBxdWFkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1kMzB2LmM6MjAxNgorIywgYy1mb3JtYXQKK21zZ2lkICJ2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluICVkIGJpdHMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWQzMHYuYzoyMTU5CisjLCBjLWZvcm1hdAorbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkIGFzc3VtZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MjU0IGNvbmZpZy90Yy1oODMwMC5jOjI2MgorbXNnaWQgIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDgzMDAuYzo0MjMgY29uZmlnL3RjLWg4MzAwLmM6NDI2IGNvbmZpZy90Yy1oODMwMC5jOjQyOQorIzogY29uZmlnL3RjLWg4MzAwLmM6NDMzCittc2dpZCAiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6NDkwIGNvbmZpZy90Yy1oODMwMC5jOjU1MyBjb25maWcvdGMtaDgzMDAuYzo1NjAKK21zZ2lkICJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6NTE4IGNvbmZpZy90Yy1oODMwMC5jOjUyNyBjb25maWcvdGMtaDgzMDAuYzo1MzcKK21zZ2lkICJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjYxNworbXNnaWQgImV4cGVjdCA6OCBvciA6MTYgaGVyZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDgzMDAuYzo4MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAib3BlcmFuZCAlczB4JWx4IG91dCBvZiByYW5nZS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6OTEwCittc2dpZCAiQ2FuJ3Qgd29yayBvdXQgc2l6ZSBvZiBvcGVyYW5kLlxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjk2NAorIywgYy1mb3JtYXQKK21zZ2lkICJPcGNvZGUgYCVzJyB3aXRoIHRoZXNlIG9wZXJhbmQgdHlwZXMgbm90IGF2YWlsYWJsZSBpbiBIOC8zMDAgbW9kZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDgzMDAuYzoxMDE2IGNvbmZpZy90Yy1oODMwMC5jOjEwMzYKK21zZ2lkICJOZWVkICMxIG9yICMyIGhlcmUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MTAzMQorbXNnaWQgIiM0IG5vdCB2YWxpZCBvbiBIOC8zMDAuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjExMTIgY29uZmlnL3RjLWg4MzAwLmM6MTE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjExOTEKK21zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTYgYml0IHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMDEKK21zZ2lkICJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMDkKK21zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDgzMDAuYzoxMjE2Cittc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMjUKK21zZ2lkICJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MTIzMworbXNnaWQgImludmFsaWQgb3BlcmFuZHMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MTI5MCBjb25maWcvdGMtaDg1MDAuYzoxMTI5IGNvbmZpZy90Yy1taXBzLmM6ODUxMworIzogY29uZmlnL3RjLXNoLmM6MTA0NyBjb25maWcvdGMtdzY1LmM6NzU5IGNvbmZpZy90Yy16OGsuYzoxMjM1Cittc2dpZCAidW5rbm93biBvcGNvZGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MTMzNgorbXNnaWQgIm1pc21hdGNoIGJldHdlZW4gb3Bjb2RlIHNpemUgYW5kIG9wZXJhbmQgc2l6ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDgzMDAuYzoxMzQ4IGNvbmZpZy90Yy1oODUwMC5jOjExNTcgY29uZmlnL3RjLXNoLmM6MTE0NAorIzogY29uZmlnL3RjLXc2NS5jOjc5MSBjb25maWcvdGMtejhrLmM6MTI5MAorbXNnaWQgImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODMwMC5jOjEzNjIgY29uZmlnL3RjLWg4NTAwLmM6MTE3MSBjb25maWcvdGMtc2guYzoxMTUxCisjOiBjb25maWcvdGMtdzY1LmM6ODA1IGNvbmZpZy90Yy16OGsuYzoxMzA0Cittc2dpZCAiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MTQ1MSBjb25maWcvdGMtaDg1MDAuYzoxMjYwIGNvbmZpZy90Yy16OGsuYzoxNDE1Cittc2dpZCAiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDgzMDAuYzoxNDYxIGNvbmZpZy90Yy16OGsuYzoxNDI1Cittc2dpZCAiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4MzAwLmM6MTUwNiBjb25maWcvdGMtejhrLmM6MTUwMAorbXNnaWQgImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDg1MDAuYzozMzcKK21zZ2lkICI6MjQgbm90IHZhbGlkIGZvciB0aGlzIG9wY29kZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDg1MDAuYzozNDQKK21zZ2lkICJleHBlY3QgOjgsOjE2IG9yIDoyNCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDg1MDAuYzo0MDEKK21zZ2lkICJzeW50YXggZXJyb3IgaW4gcmVnIGxpc3QiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4NTAwLmM6NDE5Cittc2dpZCAibWlzc2luZyBmaW5hbCByZWdpc3RlciBpbiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaDg1MDAuYzo1MDYgY29uZmlnL3RjLWg4NTAwLmM6NTEzIGNvbmZpZy90Yy1oODUwMC5jOjUxOQorbXNnaWQgImV4cGVjdGVkIEAoZXhwLCBSbikiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4NTAwLmM6NTM1Cittc2dpZCAiQFJuKyBuZWVkcyB3b3JkIHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODUwMC5jOjU0NQorbXNnaWQgIkBSbiBuZWVkcyB3b3JkIHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODUwMC5jOjg0NSBjb25maWcvdGMtc2guYzo4NDQKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5oYW5kbGVkICVkXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWg4NTAwLmM6ODczIGNvbmZpZy90Yy1zaC5jOjg2NQorIywgYy1mb3JtYXQKK21zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODUwMC5jOjk2MyBjb25maWcvdGMtc2guYzo5ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiZmFpbGVkIGZvciAlZFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1oODUwMC5jOjExNDUgY29uZmlnL3RjLXNoLmM6MTA4MiBjb25maWcvdGMtdzY1LmM6Nzc5Cittc2dpZCAiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTExNAorbXNnaWQgIk1pc3NpbmcgLmV4aXRcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjExMTcKK21zZ2lkICJNaXNzaW5nIC5wcm9jZW5kXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoxMTI2Cittc2dpZCAiTm90IGluIGEgc3BhY2UuXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoxMTI5Cittc2dpZCAiTm90IGluIGEgc3Vic3BhY2UuXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoxMjkxCittc2dpZCAiSW52YWxpZCBmaWVsZCBzZWxlY3Rvci4gIEFzc3VtaW5nIEYlJS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoxMzIyCittc2dpZCAiLVIgb3B0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTMzNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTM0NCBjb25maWcvdGMtaTg2MC5jOjE5MSBjb25maWcvdGMtc3BhcmMuYzo3MDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoxNDA2IGNvbmZpZy90Yy1ocHBhLmM6NjUzOSBjb25maWcvdGMtaHBwYS5jOjY1OTEKK21zZ2lkICJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTQwOSBjb25maWcvdGMtaHBwYS5jOjY1OTQKK21zZ2lkICJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTUxOCBjb25maWcvdGMtaHBwYS5jOjQ0MzAKK21zZ2lkICJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjE3MTQKK21zZ2lkICJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTcyMworbXNnaWQgIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlciBTeW50YXguIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTc1NgorbXNnaWQgIkludmFsaWQgU2hvcnQgTG9hZC9TdG9yZSBDb21wbGV0ZXIuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTgwNyBjb25maWcvdGMtaHBwYS5jOjE4MTIKK21zZ2lkICJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjE4MjIgY29uZmlnL3RjLWhwcGEuYzoxODY2CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb246ICVjIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTg0MCBjb25maWcvdGMtaHBwYS5jOjIzNzUKK21zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjE4ODEKK21zZ2lkICJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MTk3MCBjb25maWcvdGMtaHBwYS5jOjIwNjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBBZGQgQ29uZGl0aW9uOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjIxMzIgY29uZmlnL3RjLWhwcGEuYzoyMjQ1Cittc2dpZCAiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoyMzAxCittc2dpZCAiSW52YWxpZCBTaGlmdC9FeHRyYWN0L0RlcG9zaXQgQ29uZGl0aW9uLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjIzMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoyNzc2IGNvbmZpZy90Yy1ocHBhLmM6Mjc5MQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIENCaXQgU3BlY2lmaWNhdGlvbjogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzoyOTc3IGNvbmZpZy90Yy1ocHBhLmM6MzAxMCBjb25maWcvdGMtaHBwYS5jOjMwNDcKK21zZ2lkICJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzozMTQ3Cittc2dpZCAiSW52YWxpZCBTRlUgaWRlbnRpZmllciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjMyMDcKK21zZ2lkICJJbnZhbGlkIENPUFIgaWRlbnRpZmllciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjM0NDcgY29uZmlnL3RjLWhwcGEuYzozNDczIGNvbmZpZy90Yy1ocHBhLmM6MzQ5OAorIzogY29uZmlnL3RjLWhwcGEuYzozNTIzIGNvbmZpZy90Yy1ocHBhLmM6MzU0OAorbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MzU3MgorbXNnaWQgIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6MzU5NQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIG9wZXJhbmRzICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NDEzMAorbXNnaWQgIlVua25vd24gcmVsb2NhdGlvbiBlbmNvdW50ZXJlZCBpbiBtZF9hcHBseV9maXguIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NDE0MAorIywgYy1mb3JtYXQKK21zZ2lkICJubyBocHBhX2ZpeHVwIGVudHJ5IGZvciB0aGlzIGZpeHVwIChmaXhQID0gMHgleCwgdHlwZSA9IDB4JXgpXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo0MjgyIGNvbmZpZy90Yy1ocHBhLmM6NDMwNworIywgYy1mb3JtYXQKK21zZ2lkICJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NDM0NQorIywgYy1mb3JtYXQKK21zZ2lkICJOb24tYWJzb2x1dGUgc3ltYm9sOiAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjQzNjAKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5kZWZpbmVkIGFic29sdXRlIGNvbnN0YW50OiAnJXMnLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjQ0NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW52YWxpZCBGUCBDb21wYXJlIENvbmRpdGlvbjogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo0NTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgRlRFU1QgY29tcGxldGVyOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjQ1OTMgY29uZmlnL3RjLWhwcGEuYzo0NjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgRlAgT3BlcmFuZCBGb3JtYXQ6ICUzcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjQ3MTMKK21zZ2lkICJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjQ3NzIKK21zZ2lkICJCYWQgc2VnbWVudCAoc2hvdWxkIGJlIGFic29sdXRlKS4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo0ODcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgbG9jYXRpb246ICVzXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo0OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgYXJndW1lbnQgZGVzY3JpcHRpb246ICVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NDkyNQorIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIE51bGxpZmljYXRpb246ICglYykiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo1NjU3CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgLkNBTEwgYXJndW1lbnQ6ICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NTc3NgorbXNnaWQgIi5jYWxsaW5mbyBpcyBub3Qgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo1Nzk2CisjLCBjLWZvcm1hdAorbXNnaWQgIkZSQU1FIHBhcmFtZXRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODogJWRcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjU4MTUKK21zZ2lkICJWYWx1ZSBmb3IgRU5UUllfR1IgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMy4uMThcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjU4MjcKK21zZ2lkICJWYWx1ZSBmb3IgRU5UUllfRlIgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMTIuLjIxXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo1ODM3Cittc2dpZCAiVmFsdWUgZm9yIEVOVFJZX1NSIG11c3QgYmUgM1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NTg5MworIywgYy1mb3JtYXQKK21zZ2lkICJJbnZhbGlkIC5DQUxMSU5GTyBhcmd1bWVudDogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo1OTgzCittc2dpZCAiVGhlIC5FTlRFUiBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjU5OTcKK21zZ2lkICJNaXNwbGFjZWQgLmVudHJ5LiBJZ25vcmVkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjYwMDEKK21zZ2lkICJNaXNzaW5nIC5jYWxsaW5mby4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2MDQ5Cittc2dpZCAiLlJFRyBtdXN0IHVzZSBhIGxhYmVsIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NjA1MQorbXNnaWQgIi5FUVUgbXVzdCB1c2UgYSBsYWJlbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjYxMDIKK21zZ2lkICIuRVhJVCBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2MTA2Cittc2dpZCAiTWlzc2luZyAuY2FsbGluZm8iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2MTEwCittc2dpZCAiTm8gLkVOVFJZIGZvciB0aGlzIC5FWElUIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NjEzNworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgZGVmaW5lIGV4cG9ydCBzeW1ib2w6ICVzXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2MTkwCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzaW5nIEVOVFJZIHJhdGhlciB0aGFuIENPREUgaW4gZXhwb3J0IGRpcmVjdGl2ZSBmb3IgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2MjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVuZGVmaW5lZCAuRVhQT1JULy5JTVBPUlQgYXJndW1lbnQgKGlnbm9yZWQpOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjYzNzMKK21zZ2lkICJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NjM3OAorbXNnaWQgImV4dHJhIC5MQUJFTCBhcmd1bWVudHMgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2MzkzCittc2dpZCAiVGhlIC5MRUFWRSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjY0MjYKK21zZ2lkICJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2NDYwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBkZWZpbmUgc3RhdGljIHN5bWJvbDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjY0OTMKK21zZ2lkICJOZXN0ZWQgcHJvY2VkdXJlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjY1MDMKK21zZ2lkICJDYW5ub3QgYWxsb2NhdGUgdW53aW5kIGRlc2NyaXB0b3JcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjY1OTgKK21zZ2lkICJtaXNwbGFjZWQgLnByb2NlbmQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2NjAxCittc2dpZCAiTWlzc2luZyAuY2FsbGluZm8gZm9yIHRoaXMgcHJvY2VkdXJlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NjYwNAorbXNnaWQgIk1pc3NpbmcgLkVYSVQgZm9yIGEgLkVOVFJZIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NjcwNAorbXNnaWQgIkludmFsaWQgLlNQQUNFIGFyZ3VtZW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6Njc1MgorbXNnaWQgIkNhbid0IGNoYW5nZSBzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2ODc5CisjLCBjLWZvcm1hdAorbXNnaWQgIlVuZGVmaW5lZCBzcGFjZTogJyVzJyBBc3N1bWluZyBzcGFjZSBudW1iZXIgPSAwLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjY5MjEKK21zZ2lkICJNdXN0IGJlIGluIGEgc3BhY2UgYmVmb3JlIGNoYW5naW5nIG9yIGRlY2xhcmluZyBzdWJzcGFjZXMuXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo2OTI1Cittc2dpZCAiQ2FuJ3QgY2hhbmdlIHN1YnNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjY5NjEKK21zZ2lkICJQYXJhbWV0ZXJzIG9mIGFuIGV4aXN0aW5nIHN1YnNwYWNlIGNhbid0IGJlIG1vZGlmaWVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NzAxNAorbXNnaWQgIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjcwNTYKK21zZ2lkICJGSVJTVCBub3Qgc3VwcG9ydGVkIGFzIGEgLlNVQlNQQUNFIGFyZ3VtZW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NzA1OAorbXNnaWQgIkludmFsaWQgLlNVQlNQQUNFIGFyZ3VtZW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1ocHBhLmM6NzA5OAorbXNnaWQgIklnbm9yaW5nIHN1YnNwYWNlIGRlY2wgZHVlIHRvIEVMRiBCRkQgYnVncy4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo3MjYxCisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZmluZCBjb250YWluaW5nIHNwYWNlIGZvciAlcy4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo3MzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo3Mzg4CisjLCBjLWZvcm1hdAorbXNnaWQgIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3Vic3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWhwcGEuYzo4MDQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5bWJvbCAnJXMnIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaHBwYS5jOjgwNDgKK21zZ2lkICJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjUwMgorbXNnaWQgInNhbWUgdHlwZSBvZiBwcmVmaXggdXNlZCB0d2ljZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjUzNgorbXNnaWQgIkJhZCBhcmd1bWVudCB0byBzeW50YXggZGlyZWN0aXZlLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjYxOSBjb25maWcvdGMtbTY4ay5jOjM2MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZXJuYWwgRXJyb3I6ICBDYW4ndCBoYXNoICVzOiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjg1MAorbXNnaWQgIlVua25vd24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzo4OTggY29uZmlnL3RjLWkzODYuYzo0MzYwIGNvbmZpZy90Yy1tNjhrLmM6NzYyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6OTA4IGNvbmZpZy90Yy1pMzg2LmM6NDM2MyBjb25maWcvdGMtbTY4ay5jOjc2OQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjEwMDkgY29uZmlnL3RjLWkzODYuYzoxMDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vIHN1Y2ggMzg2IGluc3RydWN0aW9uOiBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTAxOAorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBtbmVtb25pYyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjEwMjUKK21zZ2lkICJleHBlY3RpbmcgcHJlZml4OyBnb3Qgbm90aGluZyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjEwMjcKK21zZ2lkICJleHBlY3RpbmcgbW5lbW9uaWM7IGdvdCBub3RoaW5nIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTA0NQorIywgYy1mb3JtYXQKK21zZ2lkICJyZWR1bmRhbnQgJXMgcHJlZml4IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTEwNAorIywgYy1mb3JtYXQKK21zZ2lkICJleHBlY3Rpbmcgc3RyaW5nIGluc3RydWN0aW9uIGFmdGVyIGAlcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoxMTI3CisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSBvcGVyYW5kICVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0MQorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIGluIG9wZXJhbmQgJWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTE0NAorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmJhbGFuY2VkIGJyYWNrZXRzIGluIG9wZXJhbmQgJWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTE1MworIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGNoYXJhY3RlciAlcyBpbiBvcGVyYW5kICVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTE4MAorIywgYy1mb3JtYXQKK21zZ2lkICJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoxMjAxCittc2dpZCAiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjEyMDYKK21zZ2lkICJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIKK21zZ3N0ciAiIgorCisjLiB3ZSBmb3VuZCBubyBtYXRjaAorIzogY29uZmlnL3RjLWkzODYuYzoxNDMzCisjLCBjLWZvcm1hdAorbXNnaWQgInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIgorbXNnc3RyICIiCisKKyMuIFdhcm4gdGhlbSB0aGF0IGEgZGF0YSBvciBhZGRyZXNzIHNpemUgcHJlZml4IGRvZXNuJ3QgYWZmZWN0CisjLiBhc3NlbWJseSBvZiB0aGUgbmV4dCBsaW5lIG9mIGNvZGUuCisjOiBjb25maWcvdGMtaTM4Ni5jOjE0NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoxNDY2IGNvbmZpZy90Yy1pMzg2LmM6MTQ4MQorbXNnaWQgImAlcycgb3BlcmFuZCAlZCBtdXN0IHVzZSBgJSVlcycgc2VnbWVudCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjE1NDcgY29uZmlnL3RjLWkzODYuYzoxNTg2IGNvbmZpZy90Yy1pMzg2LmM6MTYxMworbXNnaWQgInVzaW5nIGAlJSVzJyBpbnN0ZWFkIG9mIGAlJSVzJyBkdWUgdG8gYCVjJyBzdWZmaXgiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoxNTU4IGNvbmZpZy90Yy1pMzg2LmM6MTU3NSBjb25maWcvdGMtaTM4Ni5jOjE2MDIKK21zZ2lkICJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoxNjQyIGNvbmZpZy90Yy1pMzg2LmM6MTY2MgorbXNnaWQgIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MTY4NworbXNnaWQgIiIKKyJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplICIKKyJpbnN0cnVjdGlvbiIKK21zZ3N0ciAiIgorCisjLiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuCisjOiBjb25maWcvdGMtaTM4Ni5jOjE4MDAKK21zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIKK21zZ3N0ciAiIgorCisjLiBleHRyYW5lb3VzIGBsJyBzdWZmaXggb24gZnAgaW5zbgorIzogY29uZmlnL3RjLWkzODYuYzoxODA3Cittc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzICUlJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MjAzMworbXNnaWQgInlvdSBjYW4ndCBgcG9wICUlY3MnIgorbXNnc3RyICIiCisKKyMuIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0YworIzogY29uZmlnL3RjLWkzODYuYzoyMDY0CisjLCBjLWZvcm1hdAorbXNnaWQgInRyYW5zbGF0aW5nIHRvIGAlc3AnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MjA5NSBjb25maWcvdGMtaTM4Ni5jOjIxOTggY29uZmlnL3RjLWkzODYuYzoyMjU4Cittc2dpZCAic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjIxMTUgY29uZmlnL3RjLWkzODYuYzoyMjIyIGNvbmZpZy90Yy1pMzg2LmM6MjI3MQorbXNnaWQgIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjIyMTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiYCVzJyBvbmx5IHRha2VzIGJ5dGUgZGlzcGxhY2VtZW50OyAlbGQgc2hvcnRlbmVkIHRvICVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MjI4MAorIywgYy1mb3JtYXQKK21zZ2lkICJjYW4ndCBoYW5kbGUgbm9uIGFic29sdXRlIHNlZ21lbnQgaW4gYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjI1MzcKK21zZ2lkICJPbmx5IDEgb3IgMiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIGFsbG93ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoyNTY4IGNvbmZpZy90Yy1pMzg2LmM6Mjc5NworbXNnaWQgIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MjU4OSBjb25maWcvdGMtaTM4Ni5jOjI4MTgKK21zZ2lkICJCYWQgcmVsb2Mgc3BlY2lmaWVyIGluIGV4cHJlc3Npb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoyNjA2IGNvbmZpZy90Yy1pMzg2LmM6Mjg1MQorIywgYy1mb3JtYXQKK21zZ2lkICJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIKK21zZ3N0ciAiIgorCisjLiBtaXNzaW5nIG9yIGJhZCBleHByIGJlY29tZXMgYWJzb2x1dGUgMAorIzogY29uZmlnL3RjLWkzODYuYzoyNjEzCisjLCBjLWZvcm1hdAorbXNnaWQgIk1pc3Npbmcgb3IgaW52YWxpZCBpbW1lZGlhdGUgZXhwcmVzc2lvbiBgJXMnIHRha2VuIGFzIDAiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzoyNjQ4IGNvbmZpZy90Yy1pMzg2LmM6Mjg3MAorIywgYy1mb3JtYXQKK21zZ2lkICJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MjY5MQorIywgYy1mb3JtYXQKK21zZ2lkICJleHBlY3Rpbmcgc2NhbGUgZmFjdG9yIG9mIDEsIDIsIDQsIG9yIDg6IGdvdCBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MjY5NworIywgYy1mb3JtYXQKK21zZ2lkICJzY2FsZSBmYWN0b3Igb2YgJWQgd2l0aG91dCBhbiBpbmRleCByZWdpc3RlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjMwNDUgY29uZmlnL3RjLWkzODYuYzozMDUxIGNvbmZpZy90Yy1pMzg2LmM6MzA2MAorIywgYy1mb3JtYXQKK21zZ2lkICJiYWQgc2VnbWVudCBuYW1lIGAlcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzozMjI2IGNvbmZpZy90Yy1pMzg2LmM6MzQ4MQorIywgYy1mb3JtYXQKK21zZ2lkICJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjMzMzcgY29uZmlnL3RjLWkzODYuYzozMzUwIGNvbmZpZy90Yy1pMzg2LmM6MzY2MgorIzogY29uZmlnL3RjLWkzODYuYzozNjc1CisjLCBjLWZvcm1hdAorbXNnaWQgImAlcycgaXMgbm90IGEgdmFsaWQgJXMgYml0IGJhc2UvaW5kZXggZXhwcmVzc2lvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjM0MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIG1lbW9yeSBvcGVyYW5kIGAlcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWkzODYuYzozNDQ5CisjLCBjLWZvcm1hdAorbXNnaWQgIkp1bmsgYCVzJyBhZnRlciByZWdpc3RlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjM1OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXhwZWN0aW5nIGAsJyBvciBgKScgYWZ0ZXIgaW5kZXggcmVnaXN0ZXIgaW4gYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjM2MDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXhwZWN0aW5nIGApJyBhZnRlciBzY2FsZSBmYWN0b3IgaW4gYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjM2MTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiZXhwZWN0aW5nIGluZGV4IHJlZ2lzdGVyIG9yIHNjYWxlIGZhY3RvciBhZnRlciBgLCc7IGdvdCAnJWMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MzYyMQorIywgYy1mb3JtYXQKK21zZ2lkICJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBiYXNlIHJlZ2lzdGVyIGluIGAlcyciCittc2dzdHIgIiIKKworIy4gaXQncyBub3QgYSBtZW1vcnkgb3BlcmFuZDsgYXJnaCEKKyM6IGNvbmZpZy90Yy1pMzg2LmM6MzY4NAorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGNoYXIgJXMgYmVnaW5uaW5nIG9wZXJhbmQgJWQgYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjQwODcKK21zZ2lkICJCYWQgY2FsbCB0byBtZF9hdG9mICgpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6NDE0OCBjb25maWcvdGMtaTM4Ni5jOjQxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIHJlZ2lzdGVyIG5hbWUgYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjQyMTUKK21zZ2lkICItbVx0XHRcdGRvIGxvbmcganVtcFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pMzg2LmM6NDI1NQorbXNnaWQgIkdPVCBhbHJlYWR5IGluIHN5bWJvbCB0YWJsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTM4Ni5jOjQzOTUgY29uZmlnL3RjLW1jb3JlLmM6MjAxNyBjb25maWcvdGMtc2guYzoyNDE1CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZXByZXNlbnQgcmVsb2NhdGlvbiB0eXBlICVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pODYwLmM6MTU3IGNvbmZpZy90Yy1pODYwLmM6MTYxCittc2dpZCAiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pODYwLmM6MTgzIGNvbmZpZy90Yy1taXBzLmM6MTA5OSBjb25maWcvdGMtc3BhcmMuYzo2OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjM0MQorIywgYy1mb3JtYXQKK21zZ2lkICJFeHBhbmRlZCBvcGNvZGUgYWZ0ZXIgZGVsYXllZCBicmFuY2g6IGAlcyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk4NjAuYzozNDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhwYW5kZWQgb3Bjb2RlIGluIGR1YWwgbW9kZTogYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjU4MAorbXNnaWQgIkZzcjEgZXF1YWxzIGZkZXN0IHdpdGggUGlwZWxpbmluZyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjYzMQorbXNnaWQgIjUtYml0IGltbWVkaWF0ZSB0b28gbGFyZ2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk4NjAuYzo3MjUKK21zZ2lkICJJbGxlZ2FsIG9wZXJhbmRzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pODYwLmM6NzQ5IGNvbmZpZy90Yy1zcGFyYy5jOjIzMzgKK21zZ2lkICJiYWQgc2VnbWVudCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjg3OAorIywgYy1mb3JtYXQKK21zZ2lkICIyNi1iaXQgYnJhbmNoIHcvbyBwYyByZWxhdGl2ZSBzZXQ6IDB4JTA4eCIKK21zZ3N0ciAiIgorCisjLiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwKKyMuIGNoZWNrIGZvciBvdmVyZmxvdworIzogY29uZmlnL3RjLWk4NjAuYzo4ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiMjYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjg5MSBjb25maWcvdGMtaTg2MC5jOjkyMgorIywgYy1mb3JtYXQKK21zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjg5NiBjb25maWcvdGMtaTg2MC5jOjkyNworIywgYy1mb3JtYXQKK21zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjkwNAorIywgYy1mb3JtYXQKK21zZ2lkICIxNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pODYwLmM6OTEyCisjLCBjLWZvcm1hdAorbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgMTYtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjkxNworIywgYy1mb3JtYXQKK21zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIDgtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjkzMworIywgYy1mb3JtYXQKK21zZ2lkICIxNi1iaXQgaW1tZWRpYXRlIG92ZXJmbG93OiAweCUwOHgiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk4NjAuYzo5NTEKK21zZ2lkICJtZF9udW1iZXJfdG9fZGlzcFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pODYwLmM6OTYxCittc2dpZCAiaTg2MF9udW1iZXJfdG9fZmllbGRcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTg2MC5jOjEwMDEKK21zZ2lkICJpODYwX2NvbnZlcnRfZnJhZ1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pODYwLmM6MTAxMAorbXNnaWQgImk4NjBfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjU0NAorIywgYy1mb3JtYXQKK21zZ2lkICJIYXNoaW5nIHJldHVybmVkIFwiJXNcIi4iCittc2dzdHIgIiIKKworIy4gT2Zmc2V0IG9mIGxhc3QgY2hhcmFjdGVyIGluIG9wY29kZSBtbmVtb25pYworIzogY29uZmlnL3RjLWk5NjAuYzo1NzgKK21zZ2lkICJicmFuY2ggcHJlZGljdGlvbiBpbnZhbGlkIG9uIHRoaXMgb3Bjb2RlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6NjIxCisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgb3Bjb2RlLCBcIiVzXCIuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6NjI2CisjLCBjLWZvcm1hdAorbXNnaWQgImltcHJvcGVyIG51bWJlciBvZiBvcGVyYW5kcy4gIGV4cGVjdGluZyAlZCwgZ290ICVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6NzcxIGNvbmZpZy90Yy1tMzJyLmM6MTg3MworbXNnaWQgIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjg2MQorIywgYy1mb3JtYXQKK21zZ2lkICJGaXh1cCBvZiAlbGQgdG9vIGxhcmdlIGZvciBmaWVsZCB3aWR0aCBvZiAlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjk3OQorIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjk5OQorbXNnaWQgIkk5NjAgb3B0aW9uczpcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjEwMDIKK21zZ2lkICIiCisiXG4iCisiXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIDk2MCBhcmNoaXRlY3R1cmVcbiIKKyItYlx0XHRcdGFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlblxuIgorIi1saW5rLXJlbGF4XHRcdHByZXNlcnZlIGluZGl2aWR1YWwgYWxpZ25tZW50IGRpcmVjdGl2ZXMgc28gbGlua2VyXG4iCisiXHRcdFx0Y2FuIGRvIHJlbGF4aW5nIChiLm91dCBmb3JtYXQgb25seSlcbiIKKyItbm8tcmVsYXhcdFx0ZG9uJ3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3JcbiIKKyJcdFx0XHRsb25nIGRpc3BsYWNlbWVudHNcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjE0MDAKK21zZ2lkICJ0b28gbWFueSBvcGVyYW5kcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjE0NjAgY29uZmlnL3RjLWk5NjAuYzoxNjkwCittc2dpZCAiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk5NjAuYzoxNDk4Cittc2dpZCAiYXR0ZW1wdCB0byBicmFuY2ggaW50byBkaWZmZXJlbnQgc2VnbWVudCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjE1MDIKKyMsIGMtZm9ybWF0Cittc2dpZCAidGFyZ2V0IG9mICVzIGluc3RydWN0aW9uIG11c3QgYmUgYSBsYWJlbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjE1NDIKK21zZ2lkICJ1bm1hdGNoZWQgJ1snIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MTU1MworbXNnaWQgImdhcmJhZ2UgYWZ0ZXIgaW5kZXggc3BlYyBpZ25vcmVkIgorbXNnc3RyICIiCisKKyMuIFdlIG5ldmVyIG1vdmVkOiB0aGVyZSB3YXMgbm8gb3Bjb2RlIGVpdGhlciEKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MTYyMAorbXNnaWQgIm1pc3Npbmcgb3Bjb2RlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MTkyOAorbXNnaWQgImludmFsaWQgY29uc3RhbnQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk5NjAuYzoyMDQxCittc2dpZCAiaW52YWxpZCBpbmRleCByZWdpc3RlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjIwNjQKK21zZ2lkICJpbnZhbGlkIHNjYWxlIGZhY3RvciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjIyNDcKK21zZ2lkICJ1bmFsaWduZWQgcmVnaXN0ZXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk5NjAuYzoyMjcwCittc2dpZCAibm8gc3VjaCBzZnIgaW4gdGhpcyBhcmNoaXRlY3R1cmUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk5NjAuYzoyMzA4Cittc2dpZCAiaWxsZWdhbCBsaXRlcmFsIgorbXNnc3RyICIiCisKKyMuIFNob3VsZCBub3QgaGFwcGVuOiBzZWUgYmxvY2sgY29tbWVudCBhYm92ZQorIzogY29uZmlnL3RjLWk5NjAuYzoyNTQxCisjLCBjLWZvcm1hdAorbXNnaWQgIlRyeWluZyB0byAnYmFsJyB0byAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjI1NTIKK21zZ2lkICJMb29rcyBsaWtlIGEgcHJvYywgYnV0IGNhbid0IHRlbGwgd2hhdCBraW5kLlxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MjU4NAorbXNnaWQgInNob3VsZCBoYXZlIDEgb3IgMiBvcGVyYW5kcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjI1OTMgY29uZmlnL3RjLWk5NjAuYzoyNjEyCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk5NjAuYzoyNjQyCittc2dpZCAic2hvdWxkIGhhdmUgdHdvIG9wZXJhbmRzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MjY1MgorbXNnaWQgIidlbnRyeV9udW0nIG11c3QgYmUgYWJzb2x1dGUgbnVtYmVyIGluIFswLDMxXSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjI2NjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVkZWZpbmluZyBlbnRyeW51bSBmb3Igc3lzcHJvYyAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjI3NzIKK21zZ2lkICJhcmNoaXRlY3R1cmUgb2Ygb3Bjb2RlIGNvbmZsaWN0cyB3aXRoIHRoYXQgb2YgZWFybGllciBpbnN0cnVjdGlvbihzKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjI3OTMKK21zZ2lkICJiaWcgZW5kaWFuIG1vZGUgaXMgbm90IHN1cHBvcnRlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtaTk2MC5jOjI3OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiaWdub3JpbmcgdW5yZWNvZ25pemVkIC5lbmRpYW4gdHlwZSBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MzA1MgorIywgYy1mb3JtYXQKK21zZ2lkICJsZWFmcHJvYyBzeW1ib2wgJyVzJyB1bmRlZmluZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLWk5NjAuYzozMDYyCisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmc6IG1ha2luZyBsZWFmcHJvYyBlbnRyaWVzICVzIGFuZCAlcyBib3RoIGdsb2JhbFxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MzE2OQorbXNnaWQgIm9wdGlvbiAtLWxpbmstcmVsYXggaXMgb25seSBzdXBwb3J0ZWQgaW4gYi5vdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1pOTYwLmM6MzIxMgorbXNnaWQgImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMiCittc2dzdHIgIiIKKworIy4gUHJldGVuZCB0aGF0IHdlIGRvIG5vdCByZWNvZ25pc2UgdGhpcyBvcHRpb24uCisjOiBjb25maWcvdGMtbTMyci5jOjIzMgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogdW5yZWNvZ25pc2VkIG9wdGlvbjogLWhpZGRlblxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6MjY1Cittc2dpZCAiIE0zMlIgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW0zMnIuYzoyODcKK21zZ2lkICIiCisiICAtd2Fybi11bm1hdGNoZWQtaGlnaCAgICB3YXJuIHdoZW4gYW4gKHMpaGlnaCByZWxvYyBoYXMgbm8gbWF0Y2hpbmcgbG93ICIKKyJyZWxvY1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6Mjg5Cittc2dpZCAiICAtbm8td2Fybi11bm1hdGNoZWQtaGlnaCBkbyBub3Qgd2FybiBhYm91dCBtaXNzaW5nIGxvdyByZWxvY3NcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjI5MQorbXNnaWQgIiAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjI5MworbXNnaWQgIiAgLVdudWggICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLW5vLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjI5NworbXNnaWQgIiAgLXJlbGF4ICAgICAgICAgICAgICAgICBjcmVhdGUgbGlua2VyIHJlbGF4YWJsZSBjb2RlXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW0zMnIuYzoyOTkKK21zZ2lkICIgIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW0zMnIuYzo0MjkgcmVhZC5jOjI3MzQgcmVhZC5jOjQ3OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6NzAwCittc2dpZCAiSW5zdHJ1Y3Rpb25zIHdyaXRlIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjcwOAorbXNnaWQgIkluc3RydWN0aW9ucyBkbyBub3QgdXNlIHBhcmFsbGVsIGV4ZWN1dGlvbiBwaXBlbGluZXMuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6NzE1Cittc2dpZCAiSW5zdHJ1Y3Rpb25zIHNoYXJlIHRoZSBzYW1lIGV4ZWN1dGlvbiBwaXBlbGluZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjc4NCBjb25maWcvdGMtbTMyci5jOjg3MAorIywgYy1mb3JtYXQKK21zZ2lkICJub3QgYSAxNiBiaXQgaW5zdHJ1Y3Rpb24gJyVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjc5MSBjb25maWcvdGMtbTMyci5jOjg3NyBjb25maWcvdGMtbTMyci5jOjEwMzgKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5rbm93biBpbnN0cnVjdGlvbiAnJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6Nzk5IGNvbmZpZy90Yy1tMzJyLmM6ODg0IGNvbmZpZy90Yy1tMzJyLmM6MTA0NQorIywgYy1mb3JtYXQKK21zZ2lkICJpbnN0cnVjdGlvbiAnJXMnIGlzIGZvciB0aGUgTTMyUlggb25seSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjgwNyBjb25maWcvdGMtbTMyci5jOjg5MgorIywgYy1mb3JtYXQKK21zZ2lkICJpbnN0cnVjdGlvbiAnJXMnIGNhbm5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW0zMnIuYzo4NTQgY29uZmlnL3RjLW0zMnIuYzo5MTcgY29uZmlnL3RjLW0zMnIuYzoxMDk4Cittc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGxvb2t1cC9nZXQgb3BlcmFuZHMgZmFpbGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6OTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcyc6IG9ubHkgdGhlIE5PUCBpbnN0cnVjdGlvbiBjYW4gYmUgaXNzdWVkIGluIHBhcmFsbGVsIG9uIHRoZSBtMzJyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6OTMxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIlczogb3V0cHV0IG9mIDFzdCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAybmQgaW5zdHJ1Y3Rpb24gLSAiCisiaXMgdGhpcyBpbnRlbnRpb25hbCA/IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6OTM1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIlczogb3V0cHV0IG9mIDJuZCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbiBpbnB1dCB0byAxc3QgaW5zdHJ1Y3Rpb24gLSAiCisiaXMgdGhpcyBpbnRlbnRpb25hbCA/IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6MTI2NCBjb25maWcvdGMtcHBjLmM6MTMzMCBjb25maWcvdGMtcHBjLmM6MzUzNCByZWFkLmM6MTM0OQorbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lOiByZXN0IG9mIGxpbmUgaWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW0zMnIuYzoxMjczCisjLCBjLWZvcm1hdAorbXNnaWQgIi5TQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6MTI4NyBjb25maWcvdGMtcHBjLmM6MTM1MiBjb25maWcvdGMtcHBjLmM6MjI2MQorIzogY29uZmlnL3RjLXBwYy5jOjM1NTgKK21zZ2lkICJpZ25vcmluZyBiYWQgYWxpZ25tZW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6MTMxMyBjb25maWcvdGMtcHBjLmM6MTM2MyBjb25maWcvdGMtcHBjLmM6MzU3MCByZWFkLmM6MTM2OQorIzogcmVhZC5jOjIwODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6MTMyMgorIywgYy1mb3JtYXQKK21zZ2lkICJMZW5ndGggb2YgLnNjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTMyci5jOjE1NjYKK21zZ2lkICJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tMzJyLmM6MTc5NQorbXNnaWQgIlVubWF0Y2hlZCBoaWdoL3NoaWdoIHJlbG9jIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjM2Cittc2dpZCAiVW5rbm93biBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjc2NAorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGMtcmVsYXRpdmUgcGljIHJlbG9jYXRpb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo3NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBpYyByZWxvY2F0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6ODc1IGNvbmZpZy90Yy1taXBzLmM6MTE4OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IG1ha2UgJXMgcmVsb2NhdGlvbiBQQyByZWxhdGl2ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjk4NyBjb25maWcvdGMtdGFob2UuYzoxNTA1IGNvbmZpZy90Yy12YXguYzoxNzczCittc2dpZCAiTm8gb3BlcmF0b3IiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoxMDE3IGNvbmZpZy90Yy10YWhvZS5jOjE1MjIgY29uZmlnL3RjLXZheC5jOjE3OTAKK21zZ2lkICJVbmtub3duIG9wZXJhdG9yIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MTc2NAorbXNnaWQgImludmFsaWQgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyAiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoxNzY5Cittc2dpZCAiZnB1ICg2ODA0MCwgNjgwNjAgb3IgNjg4ODEvNjg4ODIpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MTc3MgorbXNnaWQgIm1tdSAoNjgwMzAgb3IgNjg4NTEpIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MTc3NQorbXNnaWQgIjY4MDIwIG9yIGhpZ2hlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjE3NzgKK21zZ2lkICI2ODAwMCBvciBoaWdoZXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoxNzgxCittc2dpZCAiNjgwMTAgb3IgaGlnaGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MTgwOQorbXNnaWQgIm9wZXJhbmRzIG1pc21hdGNoIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MTg2NiBjb25maWcvdGMtbTY4ay5jOjE4NzIgY29uZmlnL3RjLW02OGsuYzoxODc4Cittc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoxOTM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkJpZ251bSB0b28gYmlnIGZvciAlYyBmb3JtYXQ7IHRydW5jYXRlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjIwMDMKK21zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjExMworbXNnaWQgIiIKKyJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjE2NworbXNnaWQgIkZvcmNpbmcgYnl0ZSBkaXNwbGFjZW1lbnQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoyMTY5Cittc2dpZCAiYnl0ZSBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjIxNiBjb25maWcvdGMtbTY4ay5jOjIyNTQKK21zZ2lkICJpbnZhbGlkIG9wZXJhbmQgbW9kZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzIDY4MDIwIG9yIGhpZ2hlciIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjIyNDAgY29uZmlnL3RjLW02OGsuYzoyMjc0Cittc2dpZCAiOmIgbm90IHBlcm1pdHRlZDsgZGVmYXVsdGluZyB0byA6dyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjIzNTYKK21zZ2lkICJ1bnN1cHBvcnRlZCBieXRlIHZhbHVlOyB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjM3MAorbXNnaWQgInVua25vd24vaW5jb3JyZWN0IG9wZXJhbmQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoyNDAzIGNvbmZpZy90Yy1tNjhrLmM6MjQxMSBjb25maWcvdGMtbTY4ay5jOjI0MTgKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjQyNQorbXNnaWQgIm91dCBvZiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjI0NzUKK21zZ2lkICJDYW4ndCB1c2UgbG9uZyBicmFuY2hlcyBvbiA2ODAwMC82ODAxMC81MjAwIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjU2MworbXNnaWQgIkV4cHJlc3Npb24gb3V0IG9mIHJhbmdlLCB1c2luZyAwIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjY2OCBjb25maWcvdGMtbTY4ay5jOjI2ODQKK21zZ2lkICJGbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiByZWdpc3RlciBsaXN0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MjY3NAorbXNnaWQgIldyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoyNjkwCittc2dpZCAiaW5jb3JyZWN0IHJlZ2lzdGVyIGluIHJlZ2xpc3QiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzoyNjk2Cittc2dpZCAid3JvbmcgcmVnaXN0ZXIgaW4gZmxvYXRpbmctcG9pbnQgcmVnbGlzdCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjI3NzIKK21zZ2lkICJmYWlsZWQgc2FuaXR5IGNoZWNrIgorbXNnc3RyICIiCisKKyMuIEVSUk9SCisjOiBjb25maWcvdGMtbTY4ay5jOjMxMDgKK21zZ2lkICJFeHRyYSApIgorbXNnc3RyICIiCisKKyMuIEVSUk9SCisjOiBjb25maWcvdGMtbTY4ay5jOjMxMTkKK21zZ2lkICJNaXNzaW5nICkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzozMTM2Cittc2dpZCAiTWlzc2luZyBvcGVyYW5kIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MzQyNworIywgYy1mb3JtYXQKK21zZ2lkICIlcyAtLSBzdGF0ZW1lbnQgYCVzJyBpZ25vcmVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6MzQ3MQorIywgYy1mb3JtYXQKK21zZ2lkICJEb24ndCBrbm93IGhvdyB0byBmaWd1cmUgd2lkdGggb2YgJWMgaW4gbWRfYXNzZW1ibGUoKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjM2MzkgY29uZmlnL3RjLW02OGsuYzozNjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIEVycm9yOiBDYW4ndCBmaW5kICVzIGluIGhhc2ggdGFibGUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzozNjQyIGNvbmZpZy90Yy1tNjhrLmM6MzY3OAorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgaGFzaCAlczogJXMiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzozODA0CisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXplZCBkZWZhdWx0IGNwdSBgJXMnID8/PyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjM4MTYKK21zZ2lkICI2ODA0MCBhbmQgNjg4NTEgc3BlY2lmaWVkOyBtbXUgaW5zdHJ1Y3Rpb25zIG1heSBhc3NlbWJsZSBpbmNvcnJlY3RseSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjM4MzYKK21zZ2lkICJvcHRpb25zIGZvciA2ODg4MSBhbmQgbm8tNjg4ODEgYm90aCBnaXZlbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjM4MzgKK21zZ2lkICJvcHRpb25zIGZvciA2ODg1MSBhbmQgbm8tNjg4NTEgYm90aCBnaXZlbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjM5MDkKKyMsIGMtZm9ybWF0Cittc2dpZCAidGV4dCBsYWJlbCBgJXMnIGFsaWduZWQgdG8gb2RkIGJvdW5kYXJ5IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDEyNgorbXNnaWQgImludmFsaWQgYnl0ZSBicmFuY2ggb2Zmc2V0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDE4MworbXNnaWQgInNob3J0IGJyYW5jaCB3aXRoIHplcm8gb2Zmc2V0OiB1c2UgOnciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo0MjI5Cittc2dpZCAiTG9uZyBicmFuY2ggb2Zmc2V0IG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDI5MAorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlcm5hbCBlcnJvciAobG9uZyBQQy1yZWxhdGl2ZSBvcGVyYW5kKSBmb3IgaW5zbiAweCUwNHggYXQgMHglbHgiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo0MzIxCittc2dpZCAiZGlzcGxhY2VtZW50IGRvZXNuJ3QgZml0IGluIG9uZSBieXRlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDQzNAorbXNnaWQgIkxvbmcgYnJhbmNoIG9mZnNldCB0byBleHRlcm4gc3ltYm9sIG5vdCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDc4MyBjb25maWcvdGMtbTY4ay5jOjQ3OTQKK21zZ2lkICJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAxIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDgyNgorbXNnaWQgImV4cHJlc3Npb24gb3V0IG9mIHJhbmdlOiBkZWZhdWx0aW5nIHRvIDAiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo0ODU5IGNvbmZpZy90Yy1tNjhrLmM6NDg3MQorIywgYy1mb3JtYXQKK21zZ2lkICJDYW4ndCBkZWFsIHdpdGggZXhwcmVzc2lvbjsgZGVmYXVsdGluZyB0byAlbGQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo0ODg1Cittc2dpZCAiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBCWVRFIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NDg4OQorbXNnaWQgImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gV09SRCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjQ5ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVucmVjb2duaXplZCBwcm9jZXNzb3IgbmFtZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjUwNDcKK21zZ2lkICJiYWQgY29wcm9jZXNzb3IgaWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo1MDUzCittc2dpZCAidW5yZWNvZ25pemVkIGZvcHQgb3B0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NTE4NworIywgYy1mb3JtYXQKK21zZ2lkICJvcHRpb24gYCVzJyBtYXkgbm90IGJlIG5lZ2F0ZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo1MTk4CisjLCBjLWZvcm1hdAorbXNnaWQgIm9wdGlvbiBgJXMnIG5vdCByZWNvZ25pemVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NTIzMQorbXNnaWQgImJhZCBmb3JtYXQgb2YgT1BUIE5FU1Q9ZGVwdGgiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo1Mjk0Cittc2dpZCAibWlzc2luZyBsYWJlbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjUzMTggY29uZmlnL3RjLW02OGsuYzo1MzQ3Cittc2dpZCAiYmFkIHJlZ2lzdGVyIGxpc3QiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo1MzIwCisjLCBjLWZvcm1hdAorbXNnaWQgImJhZCByZWdpc3RlciBsaXN0OiAlcyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjU0MTgKK21zZ2lkICJyZXN0b3JlIHdpdGhvdXQgc2F2ZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjU1OTUgY29uZmlnL3RjLW02OGsuYzo1OTQ0Cittc2dpZCAic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo1NjQ2Cittc2dpZCAibWlzc2luZyBjb25kaXRpb24gY29kZSBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NTk3OAorbXNnaWQgIm1pc3NpbmcgdGhlbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjYwNjAKK21zZ2lkICJlbHNlIHdpdGhvdXQgbWF0Y2hpbmcgaWYiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo2MDk0Cittc2dpZCAiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjEzNQorbXNnaWQgImJyZWFrIG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjE3NAorbXNnaWQgIm5leHQgb3V0c2lkZSBvZiBzdHJ1Y3R1cmVkIGxvb3AiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW02OGsuYzo2MjI2Cittc2dpZCAibWlzc2luZyA9IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjI2NAorbXNnaWQgIm1pc3NpbmcgdG8gb3IgZG93bnRvIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjMwMCBjb25maWcvdGMtbTY4ay5jOjYzMzQgY29uZmlnL3RjLW02OGsuYzo2NTQ0Cittc2dpZCAibWlzc2luZyBkbyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjY0MzcKK21zZ2lkICJlbmRmIHdpdGhvdXQgZm9yIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjQ5MworbXNnaWQgInVudGlsIHdpdGhvdXQgcmVwZWF0IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjU4MAorbXNnaWQgImVuZHcgd2l0aG91dCB3aGlsZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjY2OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5yZWNvZ25pemVkIG9wdGlvbiBgJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6Njc0MQorIywgYy1mb3JtYXQKK21zZ2lkICJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjY4MTEKK21zZ2lkICIiCisiNjgwWDAgb3B0aW9uczpcbiIKKyItbFx0XHRcdHVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cbiIKKyItbTY4MDAwIHwgLW02ODAwOCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLW02ODAzMCB8IC1tNjgwNDAgfCAtbTY4MDYwXG4iCisiIHwgLW02ODMwMiB8IC1tNjgzMzEgfCAtbTY4MzMyIHwgLW02ODMzMyB8IC1tNjgzNDAgfCAtbTY4MzYwXG4iCisiIHwgLW1jcHUzMiB8IC1tNTIwMFxuIgorIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiA2ODBYMCBhcmNoaXRlY3R1cmUgW2RlZmF1bHQgNjgwMjBdXG4iCisiLW02ODg4MSB8IC1tNjg4ODIgfCAtbW5vLTY4ODgxIHwgLW1uby02ODg4MlxuIgorIlx0XHRcdHRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcbiIKKyJcdFx0XHRbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwLCA2ODAzMCwgYW5kIGNwdTMyXVxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6NjgyMQorbXNnaWQgIiIKKyItbTY4ODUxIHwgLW1uby02ODg1MVxuIgorIlx0XHRcdHRhcmdldCBoYXMvbGFja3MgbWVtb3J5LW1hbmFnZW1lbnQgdW5pdCBjb3Byb2Nlc3NvclxuIgorIlx0XHRcdFtkZWZhdWx0IHllcyBmb3IgNjgwMjAgYW5kIHVwXVxuIgorIi1waWMsIC1rXHRcdGdlbmVyYXRlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKKyItU1x0XHRcdHR1cm4gamJzciBpbnRvIGpzclxuIgorIi0tcmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsXG4iCisiXHRcdFx0cmVjb2duaXplIHJlZ2lzdGVyIG5hbWVzIHdpdGhvdXQgcHJlZml4IGNoYXJhY3RlclxuIgorIi0tYml0d2lzZS1vclx0XHRkbyBub3QgdHJlYXQgYHwnIGFzIGEgY29tbWVudCBjaGFyYWN0ZXJcbiIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTY4ay5jOjY4MzAKK21zZ2lkICIiCisiLS1iYXNlLXNpemUtZGVmYXVsdC0xNlx0YmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDE2IGJpdHNcbiIKKyItLWJhc2Utc2l6ZS1kZWZhdWx0LTMyXHRiYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIKKyItLWRpc3Atc2l6ZS1kZWZhdWx0LTE2XHRkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMTYgYml0c1xuIgorIi0tZGlzcC1zaXplLWRlZmF1bHQtMzJcdGRpc3BsYWNlbWVudCB3aXRoIHVua25vd24gc2l6ZSBpcyAzMiBiaXRzIChkZWZhdWx0KVxuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6Njg2NQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciAlcyBpbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tNjhrLmM6Njg2OQorIywgYy1mb3JtYXQKK21zZ2lkICJPcGNvZGUoJWQuJXMpOiAiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW04OGsuYzoyMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2FuJ3QgaGFzaCBpbnN0cnVjdGlvbiAnJXMnOiVzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tODhrLmM6MjU4CisjLCBjLWZvcm1hdAorbXNnaWQgIkludmFsaWQgbW5lbW9uaWMgJyVzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTg4ay5jOjI3OAorbXNnaWQgIlBhcmFtZXRlciBzeW50YXggZXJyb3IiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW04OGsuYzozMzMKK21zZ2lkICJVbmtub3duIHJlbG9jYXRpb24gdHlwZSIKK21zZ3N0ciAiIgorCisjLiBIYXZpbmcgdGhpcyBoZXJlIHJlcGVhdHMgdGhlIHdhcm5pbmcgc29tdGltZXMuCisjLiBCdXQgY2FuJ3Qgd2Ugc3RhbmQgdGhhdD8KKyM6IGNvbmZpZy90Yy1tODhrLmM6NDQ2Cittc2dpZCAiVXNlIG9mIG9ic29sZXRlIGluc3RydWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tODhrLmM6NTYzCittc2dpZCAiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gMTYgYml0cyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTg4ay5jOjYyOSBjb25maWcvdGMtbTg4ay5jOjY1MQorbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDUgYml0cyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTg4ay5jOjg3MworbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDkgYml0cyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTg4ay5jOjg5NQorbXNnaWQgIlJlbW92ZWQgbG93ZXIgMiBiaXRzIG9mIGV4cHJlc3Npb24iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW04OGsuYzoxMDM0Cittc2dpZCAiQmFkIHJlbG9jYXRpb24gdHlwZSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTg4ay5jOjEwNDcKK21zZ2lkICJtZF9udW1iZXJfdG9fZGlzcCBub3QgZGVmaW5lZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbTg4ay5jOjEwNTcKK21zZ2lkICJtZF9udW1iZXJfdG9fZmllbGQgbm90IGRlZmluZWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW04OGsuYzoxMTcwCittc2dpZCAiUmVsYXhhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW04OGsuYzoxMjY3IGNvbmZpZy90Yy1zcGFyYy5jOjMwMjQgcmVhZC5jOjE5NDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW04OGsuYzoxMzExCisjLCBjLWZvcm1hdAorbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCAlcy4iCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6MjczCisjLCBjLWZvcm1hdAorbXNnaWQgInJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzozNTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY29udHJvbCByZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6NTEzCittc2dpZCAibW9yZSB0aGFuIDY1SyBsaXRlcmFsIHBvb2xzIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjU2NworbXNnaWQgIm1pc3NpbmcgJ10nIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjYwNworbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjYwOQorIywgYy1mb3JtYXQKK21zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkLCBub3QgJWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6NjQ2Cittc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzo2NTMKK21zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjY2NyBjb25maWcvdGMtbWNvcmUuYzoxMTc3IGNvbmZpZy90Yy1tY29yZS5jOjEyMzEKK21zZ2lkICJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjcxNgorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duIG9wY29kZSBcIiVzXCIiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6NzU5Cittc2dpZCAiaW52YWxpZCByZWdpc3RlcjogcjE1IGlsbGVnYWwiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6ODA4Cittc2dpZCAiTTM0MCBzcGVjaWZpYyBvcGNvZGUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgZm9yIE0yMTAiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6ODI3IGNvbmZpZy90Yy1tY29yZS5jOjg2NiBjb25maWcvdGMtbWNvcmUuYzo4ODUKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjkwNCBjb25maWcvdGMtbWNvcmUuYzo5MzEgY29uZmlnL3RjLW1jb3JlLmM6OTYwCisjOiBjb25maWcvdGMtbWNvcmUuYzo5OTcgY29uZmlnL3RjLW1jb3JlLmM6MTAzMiBjb25maWcvdGMtbWNvcmUuYzoxMDUxCisjOiBjb25maWcvdGMtbWNvcmUuYzoxMDcwIGNvbmZpZy90Yy1tY29yZS5jOjExMDIgY29uZmlnL3RjLW1jb3JlLmM6MTEyNAorIzogY29uZmlnL3RjLW1jb3JlLmM6MTE4MCBjb25maWcvdGMtbWNvcmUuYzoxMjM0IGNvbmZpZy90Yy1tY29yZS5jOjEyNjkKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMjMgY29uZmlnL3RjLW1jb3JlLmM6MTM0NSBjb25maWcvdGMtbWNvcmUuYzoxMzY4Cittc2dpZCAic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzo4NDIKK21zZ2lkICJkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIHIxIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjg2MworbXNnaWQgInNvdXJjZSByZWdpc3RlciBtdXN0IGJlIHIxIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjkyNiBjb25maWcvdGMtbWNvcmUuYzo5ODMKK21zZ2lkICJpbW1lZGlhdGUgaXMgbm90IGEgcG93ZXIgb2YgdHdvIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjk1NAorbXNnaWQgInRyYW5zbGF0aW5nIGJnZW5pIHRvIG1vdmkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6OTkxCittc2dpZCAidHJhbnNsYXRpbmcgbWdlbmkgdG8gbW92aSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzoxMDIzCittc2dpZCAidHJhbnNsYXRpbmcgYm1hc2tpIHRvIG1vdmkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6MTA5NworIywgYy1mb3JtYXQKK21zZ2lkICJkaXNwbGFjZW1lbnQgdG9vIGxhcmdlICglZCkiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6MTExMQorbXNnaWQgIkludmFsaWQgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaWxsZWdhbCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzoxMTM4Cittc2dpZCAiYmFkIHN0YXJ0aW5nIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGludmFsaWQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6MTE1MQorbXNnaWQgImVuZGluZyByZWdpc3RlciBtdXN0IGJlIHIxNSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzoxMTcxCittc2dpZCAiYmFkIGJhc2UgcmVnaXN0ZXI6IG11c3QgYmUgcjAiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6MTE4OQorbXNnaWQgImZpcnN0IHJlZ2lzdGVyIG11c3QgYmUgcjQiCittc2dzdHIgIiIKKworIzogY29uZmlnL3RjLW1jb3JlLmM6MTIwMAorbXNnaWQgImxhc3QgcmVnaXN0ZXIgbXVzdCBiZSByNyIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzoxMjM3Cittc2dpZCAicmVnLXJlZyBleHBlY3RlZCIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzoxMzQyCittc2dpZCAic2Vjb25kIG9wZXJhbmQgbXVzdCBiZSAxIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNjMKK21zZ2lkICJ6ZXJvIHVzZWQgYXMgaW1tZWRpYXRlIHZhbHVlIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjEzNzQKKyMsIGMtZm9ybWF0Cittc2dpZCAidW5pbXBsZW1lbnRlZCBvcGNvZGUgXCIlc1wiIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjE0NDQgY29uZmlnL3RjLXc2NS5jOjg1NgorbXNnaWQgIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIKK21zZ3N0ciAiIgorCisjOiBjb25maWcvdGMtbWNvcmUuYzoxNTEzCisjLCBjLWZvcm1hdAorbXNnaWQgInVucmVjb2duaXNlZCBjcHUgdHlwZSAnJXMnIgorbXNnc3RyICIiCisKKyM6IGNvbmZpZy90Yy1tY29yZS5jOjE1MzUKK21zZ2lkICIiCisiTUNPUkUgc3BlY2lmaWMgb3B0aW9uczpcbiIKKyIgIC17bm8tfWpzcmkyYnNyXHQgIGRpc2FibGUvZW5hYmxlIGpzcmkgdG8gYnNyIHRyYW5zZm9ybWF0aW9uIChkZWY6IG9uKVxuIgorIiAgLXtuby19c2lmaWx0ZXJcdCAgZGlzYWJsZS9lbmFibGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3IgKGRlZjogb2ZmKVxuIgorIiAgLXJlbGF4XHRcdCAgYWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuIgorbXNnc3RyICIiCisKZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmMgYi9nYXMvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWUyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvcmVhZC5jCkBAIC0wLDAgKzEsNTA1NCBAQAorLyogcmVhZC5jIC0gcmVhZCBhIHNvdXJjZSBmaWxlIC0KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCitHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICovCisKKyNpZiAwCisjZGVmaW5lIE1BU0tfQ0hBUiAoMHhGRikJLyogSWYgeW91ciBjaGFycyBhcmVuJ3QgOCBiaXRzLCB5b3Ugd2lsbAorCQkJCSAgIGNoYW5nZSB0aGlzIGEgYml0LiAgQnV0IHRoZW4sIEdOVSBpc24ndAorCQkJCSAgIHNwb3plZCB0byBydW4gb24geW91ciBtYWNoaW5lIGFueXdheS4KKwkJCQkgICAoUk1TIGlzIHNvIHNob3J0c2lnaHRlZCBzb21ldGltZXMuKQorCQkJCSAgICovCisjZWxzZQorI2RlZmluZSBNQVNLX0NIQVIgKChpbnQpKHVuc2lnbmVkIGNoYXIpLTEpCisjZW5kaWYKKworCisvKiBUaGlzIGlzIHRoZSBsYXJnZXN0IGtub3duIGZsb2F0aW5nIHBvaW50IGZvcm1hdCAoZm9yIG5vdykuIEl0IHdpbGwKKyAgIGdyb3cgd2hlbiB3ZSBkbyA0MzYxIHN0eWxlIGZsb251bXMuICovCisKKyNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUICgxNikKKworLyogUm91dGluZXMgdGhhdCByZWFkIGFzc2VtYmxlciBzb3VyY2UgdGV4dCB0byBidWlsZCBzcGFnZXR0aSBpbiBtZW1vcnkuCisgICBBbm90aGVyIGdyb3VwIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBpbiB0aGUgZXhwci5jIG1vZHVsZS4gICovCisKKy8qIGZvciBpc2RpZ2l0KCkgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjaW5jbHVkZSAic2IuaCIKKyNpbmNsdWRlICJtYWNyby5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJsaXN0aW5nLmgiCisjaW5jbHVkZSAiZWNvZmYuaCIKKworI2lmbmRlZiBUQ19TVEFSVF9MQUJFTAorI2RlZmluZSBUQ19TVEFSVF9MQUJFTCh4LHkpICh4PT0nOicpCisjZW5kaWYKKworLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4KKyAqIGZpbGwgaXQgYSBub3AgaW5zdHJ1Y3Rpb24gc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIGRvZXMgbm90IGNob2tlCisgKiBvbiBpdAorICovCisjaWZuZGVmIE5PUF9PUENPREUKKyNkZWZpbmUgTk9QX09QQ09ERSAweDAwCisjZW5kaWYKKworY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwkvKi0+bmV4dCBjaGFyIG9mIHNvdXJjZSBmaWxlIHRvIHBhcnNlLiAqLworCisjaWYgQklUU19QRVJfQ0hBUiAhPSA4CisvKiAgVGhlIGZvbGxvd2luZyB0YWJsZSBpcyBpbmRleGVkIGJ5WyhjaGFyKV0gYW5kIHdpbGwgYnJlYWsgaWYKKyAgICBhIGNoYXIgZG9lcyBub3QgaGF2ZSBleGFjdGx5IDI1NiBzdGF0ZXMgKGhvcGVmdWxseSAwOjI1NSEpISAgKi8KK2RpZSBob3JyaWJseTsKKyNlbmRpZgorCisjaWZuZGVmIExFWF9BVAorLyogVGhlIG04OGsgdW5mb3J0dW5hdGVseSB1c2VzIEAgYXMgYSBsYWJlbCBiZWdpbm5lci4gICovCisjZGVmaW5lIExFWF9BVCAwCisjZW5kaWYKKworI2lmbmRlZiBMRVhfQlIKKy8qIFRoZSBSUy82MDAwIGFzc2VtYmxlciB1c2VzIHssfSxbLF0gYXMgcGFydHMgb2Ygc3ltYm9sIG5hbWVzLiAgKi8KKyNkZWZpbmUgTEVYX0JSIDAKKyNlbmRpZgorCisjaWZuZGVmIExFWF9QQ1QKKy8qIFRoZSBEZWx0YSA2OGsgYXNzZW1ibGVyIHBlcm1pdHMgJSBpbnNpZGUgbGFiZWwgbmFtZXMuICAqLworI2RlZmluZSBMRVhfUENUIDAKKyNlbmRpZgorCisjaWZuZGVmIExFWF9RTQorLyogVGhlIFBvd2VyUEMgV2luZG93cyBOVCBhc3NlbWJsZXJzIHBlcm1pdHMgPyBpbnNpZGUgbGFiZWwgbmFtZXMuICAqLworI2RlZmluZSBMRVhfUU0gMAorI2VuZGlmCisKKyNpZm5kZWYgTEVYX0RPTExBUgorLyogVGhlIGEyOWsgYXNzZW1ibGVyIGRvZXMgbm90IHBlcm1pdHMgbGFiZWxzIHRvIHN0YXJ0IHdpdGggJC4gICovCisjZGVmaW5lIExFWF9ET0xMQVIgMworI2VuZGlmCisKKyNpZm5kZWYgTEVYX1RJTERFCisvKiBUaGUgRGVsdGEgNjhrIGFzc2VtYmxlciBwZXJtaXRzIH4gYXQgc3RhcnQgb2YgbGFiZWwgbmFtZXMuICAqLworI2RlZmluZSBMRVhfVElMREUgMAorI2VuZGlmCisKKy8qIHVzZWQgYnkgaXNfLi4uIG1hY3Jvcy4gb3VyIGN0eXBlW10gKi8KK2NoYXIgbGV4X3R5cGVbMjU2XSA9Cit7CisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIEBBQkNERUZHSElKS0xNTk8gKi8KKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogUFFSU1RVVldYWVpbXF1eXyAqLworICAwLCAwLCAwLCAwLCBMRVhfRE9MTEFSLCBMRVhfUENULCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwLCAvKiBfISIjJCUmJygpKissLS4vICovCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIExFWF9RTSwJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLworICBMRVhfQVQsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIEBBQkNERUZHSElKS0xNTk8gKi8KKyAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgTEVYX0JSLCAwLCBMRVhfQlIsIDAsIDMsIC8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KKyAgMCwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywJLyogYGFiY2RlZmdoaWprbG1ubyAqLworICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCBMRVhfQlIsIDAsIExFWF9CUiwgTEVYX1RJTERFLCAwLCAvKiBwcXJzdHV2d3h5ent8fX4uICovCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMKK307CisKKworLyoKKyAqIEluOiBhIGNoYXJhY3Rlci4KKyAqIE91dDogMSBpZiB0aGlzIGNoYXJhY3RlciBlbmRzIGEgbGluZS4KKyAqLworI2RlZmluZSBaXyAoMCkKK2NoYXIgaXNfZW5kX29mX2xpbmVbMjU2XSA9Cit7CisjaWZkZWYgQ1JfRU9MCisgIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCA5OSwgWl8sIFpfLCA5OSwgWl8sIFpfLAkvKiBAYWJjZGVmZ2hpamtsbW5vICovCisjZWxzZQorICA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgWl8sIFpfLCBaXywJLyogQGFiY2RlZmdoaWprbG1ubyAqLworI2VuZGlmCisgIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLworI2lmZGVmIFRDX0hQUEEKKyAgWl8sOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogXyEiIyQlJicoKSorLC0uLyAqLworICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLworI2Vsc2UKKyAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCisgIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgWl8sIFpfLAkvKiAwMTIzNDU2Nzg5Ojs8PT4/ICovCisjZW5kaWYKKyAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCisgIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLworICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KKyAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCisgIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLworICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KKyAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCisgIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLworICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KK307CisjdW5kZWYgWl8KKworLyogRnVuY3Rpb25zIHByaXZhdGUgdG8gdGhpcyBmaWxlLiAqLworCitzdGF0aWMgY2hhciAqYnVmZmVyOwkvKiAxc3QgY2hhciBvZiBlYWNoIGJ1ZmZlciBvZiBsaW5lcyBpcyBoZXJlLiAqLworc3RhdGljIGNoYXIgKmJ1ZmZlcl9saW1pdDsJLyotPjEgKyBsYXN0IGNoYXIgaW4gYnVmZmVyLiAqLworCisvKiBUQVJHRVRfQllURVNfQklHX0VORElBTiBpcyByZXF1aXJlZCB0byBiZSBkZWZpbmVkIHRvIGVpdGhlciAwIG9yIDEgaW4gdGhlCisgICB0Yy08Q1BVPi5oIGZpbGUuICBTZWUgdGhlICJQb3J0aW5nIEdBUyIgc2VjdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG1hbnVhbC4gKi8KK2ludCB0YXJnZXRfYmlnX2VuZGlhbiA9IFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOOworCitzdGF0aWMgY2hhciAqb2xkX2J1ZmZlcjsJLyogSkYgYSBoYWNrICovCitzdGF0aWMgY2hhciAqb2xkX2lucHV0Oworc3RhdGljIGNoYXIgKm9sZF9saW1pdDsKKworLyogVmFyaWFibGVzIGZvciBoYW5kbGluZyBpbmNsdWRlIGZpbGUgZGlyZWN0b3J5IHRhYmxlLiAqLworCitjaGFyICoqaW5jbHVkZV9kaXJzOwkvKiBUYWJsZSBvZiBwb2ludGVycyB0byBkaXJlY3RvcmllcyB0bworCQkJICAgc2VhcmNoIGZvciAuaW5jbHVkZSdzICovCitpbnQgaW5jbHVkZV9kaXJfY291bnQ7CS8qIEhvdyBtYW55IGFyZSBpbiB0aGUgdGFibGUgKi8KK2ludCBpbmNsdWRlX2Rpcl9tYXhsZW4gPSAxOy8qIExlbmd0aCBvZiBsb25nZXN0IGluIHRhYmxlICovCisKKyNpZm5kZWYgV09SS0lOR19ET1RfV09SRAorc3RydWN0IGJyb2tlbl93b3JkICpicm9rZW5fd29yZHM7CitpbnQgbmV3X2Jyb2tlbl93b3JkczsKKyNlbmRpZgorCisvKiBUaGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gIFdlIGRvbid0IHRyeSB0bworICAgYnVpbGQgZnJhZ3MgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIHNpbmNlIG5vIGRhdGEgY2FuIGJlIHN0b3JlZAorICAgdGhlcmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgKi8KK2FkZHJlc3NUIGFic19zZWN0aW9uX29mZnNldDsKKworLyogSWYgdGhpcyBsaW5lIGhhZCBhbiBNUkkgc3R5bGUgbGFiZWwsIGl0IGlzIHN0b3JlZCBpbiB0aGlzIHZhcmlhYmxlLgorICAgVGhpcyBpcyB1c2VkIGJ5IHNvbWUgb2YgdGhlIE1SSSBwc2V1ZG8tb3BzLiAgKi8KK3N5bWJvbFMgKmxpbmVfbGFiZWw7CisKKy8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3VwcG9ydCBNUkkgY29tbW9uIHNlY3Rpb25zLiAgV2UKKyAgIHRyYW5zbGF0ZSBzdWNoIHNlY3Rpb25zIGludG8gYSBjb21tb24gc3ltYm9sLiAgVGhpcyB2YXJpYWJsZSBpcworICAgbm9uLU5VTEwgd2hlbiB3ZSBhcmUgaW4gYW4gTVJJIGNvbW1vbiBzZWN0aW9uLiAgKi8KK3N5bWJvbFMgKm1yaV9jb21tb25fc3ltYm9sOworCisvKiBJbiBNUkkgbW9kZSwgYWZ0ZXIgYSBkYy5iIHBzZXVkby1vcCB3aXRoIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlCisgICBuZWVkIHRvIGFsaWduIHRvIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeSB1bmxlc3MgdGhlIG5leHQgcHNldWRvLW9wIGlzCisgICBkYy5iLCBkcy5iLCBvciBkY2IuYi4gIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDEgaWYgYW4gYWxpZ25tZW50CisgICBtYXkgYmUgbmVlZGVkLiAgKi8KK3N0YXRpYyBpbnQgbXJpX3BlbmRpbmdfYWxpZ247CisKKyNpZm5kZWYgTk9fTElTVElORworI2lmZGVmIE9CSl9FTEYKKy8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIGJlIG5vbi16ZXJvIGlmIHRoZSBuZXh0IHN0cmluZyB3ZSBzZWUgbWlnaHQKKyAgIGJlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZWUKKyAgIHRoZSBjb21tZW50IGluIGVtaXRfZXhwciBmb3IgdGhlIGZvcm1hdCB3ZSBsb29rIGZvci4gICovCitzdGF0aWMgaW50IGR3YXJmX2ZpbGVfc3RyaW5nOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHZvaWQgY29uc193b3JrZXIgUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyBpbnQgc2NydWJfZnJvbV9zdHJpbmcgUEFSQU1TICgoY2hhciAqKikpOworc3RhdGljIHZvaWQgZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgaW50IGhleF9mbG9hdCBQQVJBTVMgKChpbnQsIGNoYXIgKikpOworc3RhdGljIHZvaWQgZG9fb3JnIFBBUkFNUyAoKHNlZ1QsIGV4cHJlc3Npb25TICosIGludCkpOworY2hhciAqZGVtYW5kX2NvcHlfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuUCkpOworc3RhdGljIHNlZ1QgZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHBQKSk7CitzdGF0aWMgc2VnVCBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHBQKSk7CitzdGF0aWMgdm9pZCBwb2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgZ2V0X2xpbmVfc2IgUEFSQU1TICgoc2IgKikpOworc3RhdGljIHZvaWQgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7CisMCisKK3ZvaWQKK3JlYWRfYmVnaW4gKCkKK3sKKyAgY29uc3QgY2hhciAqcDsKKworICBwb2JlZ2luICgpOworICBvYmpfcmVhZF9iZWdpbl9ob29rICgpOworCisgIC8qIFNvbWV0aGluZyBjbG9zZSAtLSBidXQgbm90IHRvbyBjbG9zZSAtLSB0byBhIG11bHRpcGxlIG9mIDEwMjQuCisgICAgIFRoZSBkZWJ1Z2dpbmcgbWFsbG9jIEknbSB1c2luZyBoYXMgMjQgYnl0ZXMgb2Ygb3ZlcmhlYWQuICAqLworICBvYnN0YWNrX2JlZ2luICgmbm90ZXMsIGNodW5rc2l6ZSk7CisgIG9ic3RhY2tfYmVnaW4gKCZjb25kX29ic3RhY2ssIGNodW5rc2l6ZSk7CisKKyAgLyogVXNlIG1hY2hpbmUgZGVwZW5kZW50IHN5bnRheCAqLworICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKKyAgICBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnBdID0gMTsKKyAgLyogVXNlIG1vcmUuICBGSVhNRS1TT01FREFZLiAqLworCisgIGlmIChmbGFnX21yaSkKKyAgICBsZXhfdHlwZVsnPyddID0gMzsKK30KKwwKKy8qIHNldCB1cCBwc2V1ZG8tb3AgdGFibGVzICovCisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwb19oYXNoOworCitzdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIHBvdGFibGVbXSA9Cit7CisgIHsiYWJvcnQiLCBzX2Fib3J0LCAwfSwKKyAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCisgIHsiYXNjaWkiLCBzdHJpbmdlciwgMH0sCisgIHsiYXNjaXoiLCBzdHJpbmdlciwgMX0sCisgIHsiYmFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCisgIHsiYmFsaWdudyIsIHNfYWxpZ25fYnl0ZXMsIC0yfSwKKyAgeyJiYWxpZ25sIiwgc19hbGlnbl9ieXRlcywgLTR9LAorLyogYmxvY2sgKi8KKyAgeyJieXRlIiwgY29ucywgMX0sCisgIHsiY29tbSIsIHNfY29tbSwgMH0sCisgIHsiY29tbW9uIiwgc19tcmlfY29tbW9uLCAwfSwKKyAgeyJjb21tb24ucyIsIHNfbXJpX2NvbW1vbiwgMX0sCisgIHsiZGF0YSIsIHNfZGF0YSwgMH0sCisgIHsiZGMiLCBjb25zLCAyfSwKKyAgeyJkYy5iIiwgY29ucywgMX0sCisgIHsiZGMuZCIsIGZsb2F0X2NvbnMsICdkJ30sCisgIHsiZGMubCIsIGNvbnMsIDR9LAorICB7ImRjLnMiLCBmbG9hdF9jb25zLCAnZid9LAorICB7ImRjLnciLCBjb25zLCAyfSwKKyAgeyJkYy54IiwgZmxvYXRfY29ucywgJ3gnfSwKKyAgeyJkY2IiLCBzX3NwYWNlLCAyfSwKKyAgeyJkY2IuYiIsIHNfc3BhY2UsIDF9LAorICB7ImRjYi5kIiwgc19mbG9hdF9zcGFjZSwgJ2QnfSwKKyAgeyJkY2IubCIsIHNfc3BhY2UsIDR9LAorICB7ImRjYi5zIiwgc19mbG9hdF9zcGFjZSwgJ2YnfSwKKyAgeyJkY2IudyIsIHNfc3BhY2UsIDJ9LAorICB7ImRjYi54Iiwgc19mbG9hdF9zcGFjZSwgJ3gnfSwKKyAgeyJkcyIsIHNfc3BhY2UsIDJ9LAorICB7ImRzLmIiLCBzX3NwYWNlLCAxfSwKKyAgeyJkcy5kIiwgc19zcGFjZSwgOH0sCisgIHsiZHMubCIsIHNfc3BhY2UsIDR9LAorICB7ImRzLnAiLCBzX3NwYWNlLCAxMn0sCisgIHsiZHMucyIsIHNfc3BhY2UsIDR9LAorICB7ImRzLnciLCBzX3NwYWNlLCAyfSwKKyAgeyJkcy54Iiwgc19zcGFjZSwgMTJ9LAorICB7ImRlYnVnIiwgc19pZ25vcmUsIDB9LAorI2lmZGVmIFNfU0VUX0RFU0MKKyAgeyJkZXNjIiwgc19kZXNjLCAwfSwKKyNlbmRpZgorLyogZGltICovCisgIHsiZG91YmxlIiwgZmxvYXRfY29ucywgJ2QnfSwKKy8qIGRzZWN0ICovCisgIHsiZWplY3QiLCBsaXN0aW5nX2VqZWN0LCAwfSwJLyogRm9ybWZlZWQgbGlzdGluZyAqLworICB7ImVsc2UiLCBzX2Vsc2UsIDB9LAorICB7ImVsc2VjIiwgc19lbHNlLCAwfSwKKyAgeyJlbmQiLCBzX2VuZCwgMH0sCisgIHsiZW5kYyIsIHNfZW5kaWYsIDB9LAorICB7ImVuZGZ1bmMiLCBzX2Z1bmMsIDF9LAorICB7ImVuZGlmIiwgc19lbmRpZiwgMH0sCisvKiBlbmRlZiAqLworICB7ImVxdSIsIHNfc2V0LCAwfSwKKyAgeyJlcXVpdiIsIHNfc2V0LCAxfSwKKyAgeyJlcnIiLCBzX2VyciwgMH0sCisgIHsiZXhpdG0iLCBzX21leGl0LCAwfSwKKy8qIGV4dGVuZCAqLworICB7ImV4dGVybiIsIHNfaWdub3JlLCAwfSwJLyogV2UgdHJlYXQgYWxsIHVuZGVmIGFzIGV4dCAqLworICB7ImFwcGZpbGUiLCBzX2FwcF9maWxlLCAxfSwKKyAgeyJhcHBsaW5lIiwgc19hcHBfbGluZSwgMH0sCisgIHsiZmFpbCIsIHNfZmFpbCwgMH0sCisgIHsiZmlsZSIsIHNfYXBwX2ZpbGUsIDB9LAorICB7ImZpbGwiLCBzX2ZpbGwsIDB9LAorICB7ImZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKKyAgeyJmb3JtYXQiLCBzX2lnbm9yZSwgMH0sCisgIHsiZnVuYyIsIHNfZnVuYywgMH0sCisgIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCisgIHsiZ2xvYmwiLCBzX2dsb2JsLCAwfSwKKyAgeyJod29yZCIsIGNvbnMsIDJ9LAorICB7ImlmIiwgc19pZiwgKGludCkgT19uZX0sCisgIHsiaWZjIiwgc19pZmMsIDB9LAorICB7ImlmZGVmIiwgc19pZmRlZiwgMH0sCisgIHsiaWZlcSIsIHNfaWYsIChpbnQpIE9fZXF9LAorICB7ImlmZXFzIiwgc19pZmVxcywgMH0sCisgIHsiaWZnZSIsIHNfaWYsIChpbnQpIE9fZ2V9LAorICB7ImlmZ3QiLCBzX2lmLCAoaW50KSBPX2d0fSwKKyAgeyJpZmxlIiwgc19pZiwgKGludCkgT19sZX0sCisgIHsiaWZsdCIsIHNfaWYsIChpbnQpIE9fbHR9LAorICB7ImlmbmMiLCBzX2lmYywgMX0sCisgIHsiaWZuZGVmIiwgc19pZmRlZiwgMX0sCisgIHsiaWZuZSIsIHNfaWYsIChpbnQpIE9fbmV9LAorICB7ImlmbmVzIiwgc19pZmVxcywgMX0sCisgIHsiaWZub3RkZWYiLCBzX2lmZGVmLCAxfSwKKyAgeyJpbmNsdWRlIiwgc19pbmNsdWRlLCAwfSwKKyAgeyJpbnQiLCBjb25zLCA0fSwKKyAgeyJpcnAiLCBzX2lycCwgMH0sCisgIHsiaXJlcCIsIHNfaXJwLCAwfSwKKyAgeyJpcnBjIiwgc19pcnAsIDF9LAorICB7ImlyZXBjIiwgc19pcnAsIDF9LAorICB7Imxjb21tIiwgc19sY29tbSwgMH0sCisgIHsibGZsYWdzIiwgbGlzdGluZ19mbGFncywgMH0sCS8qIExpc3RpbmcgZmxhZ3MgKi8KKyAgeyJsaW5rb25jZSIsIHNfbGlua29uY2UsIDB9LAorICB7Imxpc3QiLCBsaXN0aW5nX2xpc3QsIDF9LAkvKiBUdXJuIGxpc3Rpbmcgb24gKi8KKyAgeyJsbGVuIiwgbGlzdGluZ19wc2l6ZSwgMX0sCisgIHsibG9uZyIsIGNvbnMsIDR9LAorICB7ImxzeW0iLCBzX2xzeW0sIDB9LAorICB7Im1hY3JvIiwgc19tYWNybywgMH0sCisgIHsibWV4aXQiLCBzX21leGl0LCAwfSwKKyAgeyJtcmkiLCBzX21yaSwgMH0sCisgIHsiLm1yaSIsIHNfbXJpLCAwfSwJLyogU3BlY2lhbCBjYXNlIHNvIC5tcmkgd29ya3MgaW4gTVJJIG1vZGUuICAqLworICB7Im5hbWUiLCBzX2lnbm9yZSwgMH0sCisgIHsibm9mb3JtYXQiLCBzX2lnbm9yZSwgMH0sCisgIHsibm9saXN0IiwgbGlzdGluZ19saXN0LCAwfSwJLyogVHVybiBsaXN0aW5nIG9mZiAqLworICB7Im5vcGFnZSIsIGxpc3Rpbmdfbm9wYWdlLCAwfSwKKyAgeyJvY3RhIiwgY29ucywgMTZ9LAorICB7Im9mZnNldCIsIHNfc3RydWN0LCAwfSwKKyAgeyJvcmciLCBzX29yZywgMH0sCisgIHsicDJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCisgIHsicDJhbGlnbnciLCBzX2FsaWduX3B0d28sIC0yfSwKKyAgeyJwMmFsaWdubCIsIHNfYWxpZ25fcHR3bywgLTR9LAorICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKKyAgeyJwbGVuIiwgbGlzdGluZ19wc2l6ZSwgMH0sCisgIHsicHJpbnQiLCBzX3ByaW50LCAwfSwKKyAgeyJwc2l6ZSIsIGxpc3RpbmdfcHNpemUsIDB9LAkvKiBzZXQgcGFwZXIgc2l6ZSAqLworICB7InB1cmdlbSIsIHNfcHVyZ2VtLCAwfSwKKyAgeyJxdWFkIiwgY29ucywgOH0sCisgIHsicmVwIiwgc19yZXB0LCAwfSwKKyAgeyJyZXB0Iiwgc19yZXB0LCAwfSwKKyAgeyJydmEiLCBzX3J2YSwgNH0sCisgIHsic2J0dGwiLCBsaXN0aW5nX3RpdGxlLCAxfSwJLyogU3VidGl0bGUgb2YgbGlzdGluZyAqLworLyogc2NsICovCisvKiBzZWN0ICovCisgIHsic2V0Iiwgc19zZXQsIDB9LAorICB7InNob3J0IiwgY29ucywgMn0sCisgIHsic2luZ2xlIiwgZmxvYXRfY29ucywgJ2YnfSwKKy8qIHNpemUgKi8KKyAgeyJzcGFjZSIsIHNfc3BhY2UsIDB9LAorICB7InNraXAiLCBzX3NwYWNlLCAwfSwKKyAgeyJzbGViMTI4Iiwgc19sZWIxMjgsIDF9LAorICB7InNwYyIsIHNfaWdub3JlLCAwfSwKKyAgeyJzdGFiZCIsIHNfc3RhYiwgJ2QnfSwKKyAgeyJzdGFibiIsIHNfc3RhYiwgJ24nfSwKKyAgeyJzdGFicyIsIHNfc3RhYiwgJ3MnfSwKKyAgeyJzdHJpbmciLCBzdHJpbmdlciwgMX0sCisgIHsic3RydWN0Iiwgc19zdHJ1Y3QsIDB9LAorLyogdGFnICovCisgIHsidGV4dCIsIHNfdGV4dCwgMH0sCisKKyAgLyogVGhpcyBpcyBmb3IgZ2NjIHRvIHVzZS4gIEl0J3Mgb25seSBqdXN0IGJlZW4gYWRkZWQgKDIvOTQpLCBzbyBnY2MKKyAgICAgd29uJ3QgYmUgYWJsZSB0byB1c2UgaXQgZm9yIGEgd2hpbGUgLS0gcHJvYmFibHkgYSB5ZWFyIG9yIG1vcmUuCisgICAgIEJ1dCBvbmNlIHRoaXMgaGFzIGJlZW4gcmVsZWFzZWQsIGNoZWNrIHdpdGggZ2NjIG1haW50YWluZXJzCisgICAgIGJlZm9yZSBkZWxldGluZyBpdCBvciBldmVuIGNoYW5naW5nIHRoZSBzcGVsbGluZy4gICovCisgIHsidGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCBzX2lnbm9yZSwgMH0sCisgIC8qIElmIHdlJ3JlIGZvbGRpbmcgY2FzZSAtLSBkb25lIGZvciBzb21lIHRhcmdldHMsIG5vdCBuZWNlc3NhcmlseQorICAgICBhbGwgLS0gdGhlIGFib3ZlIHN0cmluZyBpbiBhbiBpbnB1dCBmaWxlIHdpbGwgYmUgY29udmVydGVkIHRvCisgICAgIHRoaXMgb25lLiAgTWF0Y2ggaXQgZWl0aGVyIHdheS4uLiAgKi8KKyAgeyJ0aGlzX2djY19yZXF1aXJlc190aGVfZ251X2Fzc2VtYmxlciIsIHNfaWdub3JlLCAwfSwKKworICB7InRpdGxlIiwgbGlzdGluZ190aXRsZSwgMH0sCS8qIExpc3RpbmcgdGl0bGUgKi8KKyAgeyJ0dGwiLCBsaXN0aW5nX3RpdGxlLCAwfSwKKy8qIHR5cGUgKi8KKyAgeyJ1bGViMTI4Iiwgc19sZWIxMjgsIDB9LAorLyogdXNlICovCisvKiB2YWwgKi8KKyAgeyJ4Y29tIiwgc19jb21tLCAwfSwKKyAgeyJ4ZGVmIiwgc19nbG9ibCwgMH0sCisgIHsieHJlZiIsIHNfaWdub3JlLCAwfSwKKyAgeyJ4c3RhYnMiLCBzX3hzdGFiLCAncyd9LAorICB7IndvcmQiLCBjb25zLCAyfSwKKyAgeyJ6ZXJvIiwgc19zcGFjZSwgMH0sCisgIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLworfTsKKworc3RhdGljIGludCBwb3Bfb3ZlcnJpZGVfb2sgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKnBvcF90YWJsZV9uYW1lOworCit2b2lkCitwb3BfaW5zZXJ0ICh0YWJsZSkKKyAgICAgY29uc3QgcHNldWRvX3R5cGVTICp0YWJsZTsKK3sKKyAgY29uc3QgY2hhciAqZXJydHh0OworICBjb25zdCBwc2V1ZG9fdHlwZVMgKnBvcDsKKyAgZm9yIChwb3AgPSB0YWJsZTsgcG9wLT5wb2NfbmFtZTsgcG9wKyspCisgICAgeworICAgICAgZXJydHh0ID0gaGFzaF9pbnNlcnQgKHBvX2hhc2gsIHBvcC0+cG9jX25hbWUsIChjaGFyICopIHBvcCk7CisgICAgICBpZiAoZXJydHh0ICYmICghcG9wX292ZXJyaWRlX29rIHx8IHN0cmNtcCAoZXJydHh0LCAiZXhpc3RzIikpKQorCWFzX2ZhdGFsIChfKCJlcnJvciBjb25zdHJ1Y3RpbmcgJXMgcHNldWRvLW9wIHRhYmxlOiAlcyIpLCBwb3BfdGFibGVfbmFtZSwKKwkJICBlcnJ0eHQpOworICAgIH0KK30KKworI2lmbmRlZiBtZF9wb3BfaW5zZXJ0CisjZGVmaW5lIG1kX3BvcF9pbnNlcnQoKQkJcG9wX2luc2VydChtZF9wc2V1ZG9fdGFibGUpCisjZW5kaWYKKworI2lmbmRlZiBvYmpfcG9wX2luc2VydAorI2RlZmluZSBvYmpfcG9wX2luc2VydCgpCXBvcF9pbnNlcnQob2JqX3BzZXVkb190YWJsZSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCAKK3BvYmVnaW4gKCkKK3sKKyAgcG9faGFzaCA9IGhhc2hfbmV3ICgpOworCisgIC8qIERvIHRoZSB0YXJnZXQtc3BlY2lmaWMgcHNldWRvIG9wcy4gKi8KKyAgcG9wX3RhYmxlX25hbWUgPSAibWQiOworICBtZF9wb3BfaW5zZXJ0ICgpOworCisgIC8qIE5vdyBvYmplY3Qgc3BlY2lmaWMuICBTa2lwIGFueSB0aGF0IHdlcmUgaW4gdGhlIHRhcmdldCB0YWJsZS4gKi8KKyAgcG9wX3RhYmxlX25hbWUgPSAib2JqIjsKKyAgcG9wX292ZXJyaWRlX29rID0gMTsKKyAgb2JqX3BvcF9pbnNlcnQgKCk7CisKKyAgLyogTm93IHBvcnRhYmxlIG9uZXMuICBTa2lwIGFueSB0aGF0IHdlJ3ZlIHNlZW4gYWxyZWFkeS4gKi8KKyAgcG9wX3RhYmxlX25hbWUgPSAic3RhbmRhcmQiOworICBwb3BfaW5zZXJ0IChwb3RhYmxlKTsKK30KKwwKKyNkZWZpbmUgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZKCkJCQkJCVwKKyAgaWYgKGlnbm9yZV9pbnB1dCAoKSkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcisrXSkJXAorCWlmIChpbnB1dF9saW5lX3BvaW50ZXIgPT0gYnVmZmVyX2xpbWl0KQkJCQlcCisJICBicmVhazsJCQkJCQkJXAorICAgICAgY29udGludWU7CQkJCQkJCQlcCisgICAgfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHNjcnViYmluZyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuICNBUFAKKyAgIGFuZCAjTk9fQVBQLiAgKi8KKworc3RhdGljIGNoYXIgKnNjcnViX3N0cmluZzsKK3N0YXRpYyBjaGFyICpzY3J1Yl9zdHJpbmdfZW5kOworCitzdGF0aWMgaW50CitzY3J1Yl9mcm9tX3N0cmluZyAoZnJvbSkKKyAgICAgY2hhciAqKmZyb207Cit7CisgIGludCBzaXplOworCisgICpmcm9tID0gc2NydWJfc3RyaW5nOworICBzaXplID0gc2NydWJfc3RyaW5nX2VuZCAtIHNjcnViX3N0cmluZzsKKyAgc2NydWJfc3RyaW5nID0gc2NydWJfc3RyaW5nX2VuZDsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qCXJlYWRfYV9zb3VyY2VfZmlsZSgpCisgKgorICogV2UgcmVhZCB0aGUgZmlsZSwgcHV0dGluZyB0aGluZ3MgaW50byBhIHdlYiB0aGF0CisgKiByZXByZXNlbnRzIHdoYXQgd2UgaGF2ZSBiZWVuIHJlYWRpbmcuCisgKi8KK3ZvaWQgCityZWFkX2Ffc291cmNlX2ZpbGUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHJlZ2lzdGVyIGNoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsJCS8qIHN0cmluZyBvZiBzeW1ib2wsICdcMCcgYXBwZW5kZWQgKi8KKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIHBzZXVkb190eXBlUyAqcG9wOworCisgIGJ1ZmZlciA9IGlucHV0X3NjcnViX25ld19maWxlIChuYW1lKTsKKworICBsaXN0aW5nX2ZpbGUgKG5hbWUpOworICBsaXN0aW5nX25ld2xpbmUgKE5VTEwpOworICByZWdpc3Rlcl9kZXBlbmRlbmN5IChuYW1lKTsKKworICAvKiBHZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmVmb3JlIHdlJ3ZlIHJlYWQgYW55dGhpbmcgaW4gdG8gZGVub3RlCisgICAgIHRoaXMgZmlsZSBhcyB0aGUgIm1haW4iIHNvdXJjZSBmaWxlIGFuZCBub3QgYSBzdWJvcmRpbmF0ZSBvbmUKKyAgICAgKGUuZy4gTl9TTyB2cyBOX1NPTCBpbiBzdGFicykuICAqLworICBnZW5lcmF0ZV9maWxlX2RlYnVnICgpOworCisgIHdoaWxlICgoYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpKSAhPSAwKQorICAgIHsJCQkJLyogV2UgaGF2ZSBhbm90aGVyIGxpbmUgdG8gcGFyc2UuICovCisgICAgICBrbm93IChidWZmZXJfbGltaXRbLTFdID09ICdcbicpOwkvKiBNdXN0IGhhdmUgYSBzZW50aW5lbC4gKi8KKyAgICBjb250aW46CQkJLyogSkYgdGhpcyBnb3RvIGlzIG15IGZhdWx0IEkgYWRtaXQgaXQuCisJCQkJICAgU29tZW9uZSBicmF2ZSBwbGVhc2UgcmUtd3JpdGUgdGhlIHdob2xlCisJCQkJICAgaW5wdXQgc2VjdGlvbiBoZXJlPyAgUGxlZXplPz8/ICAqLworICAgICAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdCkKKwl7CisJICAvKiBXZSBoYXZlIG1vcmUgb2YgdGhpcyBidWZmZXIgdG8gcGFyc2UuICovCisKKwkgIC8qCisJICAgKiBXZSBub3cgaGF2ZSBpbnB1dF9saW5lX3BvaW50ZXItPjFzdCBjaGFyIG9mIG5leHQgbGluZS4KKwkgICAqIElmIGlucHV0X2xpbmVfcG9pbnRlciBbLTFdID09ICdcbicgdGhlbiB3ZSBqdXN0CisJICAgKiBzY2FubmVkIGFub3RoZXIgbGluZTogc28gYnVtcCBsaW5lIGNvdW50ZXJzLgorCSAgICovCisJICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKQorCSAgICB7CisjaWZkZWYgbWRfc3RhcnRfbGluZV9ob29rCisJICAgICAgbWRfc3RhcnRfbGluZV9ob29rICgpOworI2VuZGlmCisKKwkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXG4nKQorCQlidW1wX2xpbmVfY291bnRlcnMgKCk7CisKKwkgICAgICBsaW5lX2xhYmVsID0gTlVMTDsKKworCSAgICAgIGlmIChmbGFnX202OGtfbXJpCisjaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCisJCSAgfHwgMQorI2VuZGlmCisJCSAgKQorCQl7CisJCSAgLyogVGV4dCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG11c3QgYmUgYSBsYWJlbCwgd2UKKwkJICAgICBydW4gZG93biBhbmQgc3RpY2sgYSBjb2xvbiBpbi4gICovCisJCSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQorCQkgICAgeworCQkgICAgICBjaGFyICpsaW5lX3N0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCQkgICAgICBjaGFyIGM7CisJCSAgICAgIGludCBtcmlfbGluZV9tYWNybzsKKworCQkgICAgICBMSVNUSU5HX05FV0xJTkUgKCk7CisJCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKKworCQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisKKwkJICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBFUVUgYW5kIE1BQ1JPIHBzZXVkb29wcyBtdXN0CisJCQkgYmUgaGFuZGxlZCBzcGVjaWFsbHkuICAqLworCQkgICAgICBtcmlfbGluZV9tYWNybyA9IDA7CisJCSAgICAgIGlmIChmbGFnX202OGtfbXJpKQorCQkJeworCQkJICBjaGFyICpyZXN0ID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKKworCQkJICBpZiAoKnJlc3QgPT0gJzonKQorCQkJICAgICsrcmVzdDsKKwkJCSAgaWYgKCpyZXN0ID09ICcgJyB8fCAqcmVzdCA9PSAnXHQnKQorCQkJICAgICsrcmVzdDsKKwkJCSAgaWYgKChzdHJuY2FzZWNtcCAocmVzdCwgIkVRVSIsIDMpID09IDAKKwkJCSAgICAgICB8fCBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApCisJCQkgICAgICAmJiAocmVzdFszXSA9PSAnICcgfHwgcmVzdFszXSA9PSAnXHQnKSkKKwkJCSAgICB7CisJCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSByZXN0ICsgMzsKKwkJCSAgICAgIGVxdWFscyAobGluZV9zdGFydCwKKwkJCQkgICAgICBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApOworCQkJICAgICAgY29udGludWU7CisJCQkgICAgfQorCQkJICBpZiAoc3RybmNhc2VjbXAgKHJlc3QsICJNQUNSTyIsIDUpID09IDAKKwkJCSAgICAgICYmIChyZXN0WzVdID09ICcgJworCQkJCSAgfHwgcmVzdFs1XSA9PSAnXHQnCisJCQkJICB8fCBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgcmVzdFs1XV0pKQorCQkJICAgIG1yaV9saW5lX21hY3JvID0gMTsKKwkJCX0KKworCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIE1BQ1JPCisgICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvLW9wIHNwZWNpYWxseTogd2UgZG9uJ3Qgd2FudCB0byBwdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworCQkgICAgICBpZiAoISBtcmlfbGluZV9tYWNybykKKwkJCWxpbmVfbGFiZWwgPSBjb2xvbiAobGluZV9zdGFydCk7CisJCSAgICAgIGVsc2UKKwkJCWxpbmVfbGFiZWwgPSBzeW1ib2xfY3JlYXRlIChsaW5lX3N0YXJ0LAorCQkJCQkJICAgIGFic29sdXRlX3NlY3Rpb24sCisJCQkJCQkgICAgKHZhbHVlVCkgMCwKKwkJCQkJCSAgICAmemVyb19hZGRyZXNzX2ZyYWcpOworCisJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCQkgICAgICBpZiAoYyA9PSAnOicpCisJCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIC8qCisJICAgKiBXZSBhcmUgYXQgdGhlIGJlZ2luaW5nIG9mIGEgbGluZSwgb3Igc2ltaWxhciBwbGFjZS4KKwkgICAqIFdlIGV4cGVjdCBhIHdlbGwtZm9ybWVkIGFzc2VtYmxlciBzdGF0ZW1lbnQuCisJICAgKiBBICJzeW1ib2wtbmFtZToiIGlzIGEgc3RhdGVtZW50LgorCSAgICoKKwkgICAqIERlcGVuZGluZyBvbiB3aGF0IGNvbXBpbGVyIGlzIHVzZWQsIHRoZSBvcmRlciBvZiB0aGVzZSB0ZXN0cworCSAgICogbWF5IHZhcnkgdG8gY2F0Y2ggbW9zdCBjb21tb24gY2FzZSAxc3QuCisJICAgKiBFYWNoIHRlc3QgaXMgaW5kZXBlbmRlbnQgb2YgYWxsIG90aGVyIHRlc3RzIGF0IHRoZSAodG9wKSBsZXZlbC4KKwkgICAqIFBMRUFTRSBtYWtlIGEgY29tcGlsZXIgdGhhdCBkb2Vzbid0IHVzZSB0aGlzIGFzc2VtYmxlci4KKwkgICAqIEl0IGlzIGNydWZ0eSB0byB3YXN0ZSBhIGNvbXBpbGVyJ3MgdGltZSBlbmNvZGluZyB0aGluZ3MgZm9yIHRoaXMKKwkgICAqIGFzc2VtYmxlciwgd2hpY2ggdGhlbiB3YXN0ZXMgbW9yZSB0aW1lIGRlY29kaW5nIGl0LgorCSAgICogKEFuZCBjb21tdW5pY2F0aW5nIHZpYSAobGluZWFyKSBmaWxlcyBpcyBzaWxseSEKKwkgICAqIElmIHlvdSBtdXN0IHBhc3Mgc3R1ZmYsIHBsZWFzZSBwYXNzIGEgdHJlZSEpCisJICAgKi8KKwkgIGlmICgoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykgPT0gJ1x0JworCSAgICAgIHx8IGMgPT0gJyAnCisJICAgICAgfHwgYyA9PSAnXGYnCisJICAgICAgfHwgYyA9PSAwKQorCSAgICB7CisJICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgICAgfQorCSAga25vdyAoYyAhPSAnICcpOwkvKiBObyBmdXJ0aGVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KKworI2lmbmRlZiBOT19MSVNUSU5HCisJICAvKiBJZiBsaXN0aW5nIGlzIG9uLCBhbmQgd2UgYXJlIGV4cGFuZGluZyBhIG1hY3JvLCB0aGVuIGdpdmUKKwkgICAgIHRoZSBsaXN0aW5nIGNvZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHBhbmRlZCBsaW5lLiAgKi8KKwkgIGlmIChsaXN0aW5nKQorCSAgICB7CisJICAgICAgaWYgKChsaXN0aW5nICYgTElTVElOR19NQUNFWFApICYmIG1hY3JvX25lc3QgPiAwKQorCQl7CisJCSAgY2hhciAqY29weTsKKwkJICBpbnQgbGVuOworCisJCSAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGV4cGFuZGVkIG1hY3JvIGxpbmUuICAqLworCQkgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlci0xOyAqcyA7ICsrcykKKwkJICAgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdKQorCQkgICAgICBicmVhazsKKworCQkgIC8qIENvcHkgaXQgZm9yIHNhZmUga2VlcGluZy4gIEFsc28gZ2l2ZSBhbiBpbmRpY2F0aW9uIG9mCisJCSAgICAgaG93IG11Y2ggbWFjcm8gbmVzdGluZyBpcyBpbnZvbHZlZCBhdCB0aGlzIHBvaW50LiAgKi8KKwkJICBsZW4gPSBzIC0gKGlucHV0X2xpbmVfcG9pbnRlci0xKTsKKwkJICBjb3B5ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgbWFjcm9fbmVzdCArIDIpOworCQkgIG1lbXNldCAoY29weSwgJz4nLCBtYWNyb19uZXN0KTsKKwkJICBjb3B5W21hY3JvX25lc3RdID0gJyAnOworCQkgIG1lbWNweSAoY29weSArIG1hY3JvX25lc3QgKyAxLCBpbnB1dF9saW5lX3BvaW50ZXItMSwgbGVuKTsKKwkJICBjb3B5W21hY3JvX25lc3QrMStsZW5dID0gJ1wwJzsKKworCQkgIC8qIEluc3RhbGwgdGhlIGxpbmUgd2l0aCB0aGUgbGlzdGluZyBmYWNpbGl0eS4gICovCisJCSAgbGlzdGluZ19uZXdsaW5lIChjb3B5KTsKKwkJfQorCSAgICAgIGVsc2UKKwkJbGlzdGluZ19uZXdsaW5lIChOVUxMKTsKKwkgICAgfQorI2VuZGlmCisKKwkgIC8qCisJICAgKiBDIGlzIHRoZSAxc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyLgorCSAgICogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyBhZnRlciB0aGF0IGNoYXJhY3Rlci4KKwkgICAqLworCSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQorCSAgICB7CisJICAgICAgLyogd2FudCB1c2VyLWRlZmluZWQgbGFiZWwgb3IgcHNldWRvL29wY29kZSAqLworCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKKworCSAgICAgIHMgPSAtLWlucHV0X2xpbmVfcG9pbnRlcjsKKwkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CS8qIG5hbWUncyBkZWxpbWl0ZXIgKi8KKwkgICAgICAvKgorCSAgICAgICAqIEMgaXMgY2hhcmFjdGVyIGFmdGVyIHN5bWJvbC4KKwkgICAgICAgKiBUaGF0IGNoYXJhY3RlcidzIHBsYWNlIGluIHRoZSBpbnB1dCBsaW5lIGlzIG5vdyAnXDAnLgorCSAgICAgICAqIFMgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bWJvbC4KKwkgICAgICAgKiAgIFtJbiBjYXNlIG9mIHBzZXVkby1vcCwgcy0+Jy4nLl0KKwkgICAgICAgKiBJbnB1dF9saW5lX3BvaW50ZXItPidcMCcgd2hlcmUgYyB3YXMuCisJICAgICAgICovCisJICAgICAgaWYgKFRDX1NUQVJUX0xBQkVMKGMsIGlucHV0X2xpbmVfcG9pbnRlcikpCisJCXsKKwkJICBpZiAoZmxhZ19tNjhrX21yaSkKKwkJICAgIHsKKwkJICAgICAgY2hhciAqcmVzdCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7CisKKwkJICAgICAgLyogSW4gTVJJIG1vZGUsIFx0c3ltOiBzZXQgMCBpcyBwZXJtaXR0ZWQuICAqLworCisJCSAgICAgIGlmICgqcmVzdCA9PSAnOicpCisJCQkrK3Jlc3Q7CisJCSAgICAgIGlmICgqcmVzdCA9PSAnICcgfHwgKnJlc3QgPT0gJ1x0JykKKwkJCSsrcmVzdDsKKwkJICAgICAgaWYgKChzdHJuY2FzZWNtcCAocmVzdCwgIkVRVSIsIDMpID09IDAKKwkJCSAgIHx8IHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCkKKwkJCSAgJiYgKHJlc3RbM10gPT0gJyAnIHx8IHJlc3RbM10gPT0gJ1x0JykpCisJCQl7CisJCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHJlc3QgKyAzOworCQkJICBlcXVhbHMgKHMsIDEpOworCQkJICBjb250aW51ZTsKKwkJCX0KKwkJICAgIH0KKworCQkgIGxpbmVfbGFiZWwgPSBjb2xvbiAocyk7CS8qIHVzZXItZGVmaW5lZCBsYWJlbCAqLworCQkgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9ICc6JzsJLyogUHV0ICc6JyBiYWNrIGZvciBlcnJvciBtZXNzYWdlcycgc2FrZS4gKi8KKwkJICAvKiBJbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyICc6Jy4gKi8KKwkJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKworCQl9CisJICAgICAgZWxzZSBpZiAoYyA9PSAnPScKKwkJICAgICAgIHx8ICgoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQkJICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICc9JworI2lmZGVmIFRDX0VRVUFMX0lOX0lOU04KKwkJCSAgICYmICEgVENfRVFVQUxfSU5fSU5TTiAoYywgaW5wdXRfbGluZV9wb2ludGVyKQorI2VuZGlmCisJCQkgICApKQorCQl7CisJCSAgZXF1YWxzIChzLCAxKTsKKwkJICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCQl9CisJICAgICAgZWxzZQorCQl7CQkvKiBleHBlY3QgcHNldWRvLW9wIG9yIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KKwkJICBwb3AgPSBOVUxMOworCisjZGVmaW5lIElHTk9SRV9PUENPREVfQ0FTRQorI2lmZGVmIElHTk9SRV9PUENPREVfQ0FTRQorCQkgIHsKKwkJICAgIGNoYXIgKnMyID0gczsKKwkJICAgIHdoaWxlICgqczIpCisJCSAgICAgIHsKKwkJCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMyKSkKKwkJCSAgKnMyID0gdG9sb3dlciAoKnMyKTsKKwkJCXMyKys7CisJCSAgICAgIH0KKwkJICB9CisjZW5kaWYKKworCQkgIGlmIChmbGFnX202OGtfbXJpCisjaWZkZWYgTk9fUFNFVURPX0RPVAorCQkgICAgICB8fCAxCisjZW5kaWYKKwkJICAgICAgKQorCQkgICAgeworCQkgICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBhbmQgdGhlIG04OGsgdXNlIHBzZXVkby1vcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGEgcGVyaW9kLiAgKi8KKwkJICAgICAgcG9wID0gKHBzZXVkb190eXBlUyAqKSBoYXNoX2ZpbmQgKHBvX2hhc2gsIHMpOworCQkgICAgICBpZiAocG9wICE9IE5VTEwgJiYgcG9wLT5wb2NfaGFuZGxlciA9PSBOVUxMKQorCQkJcG9wID0gTlVMTDsKKwkJICAgIH0KKworCQkgIGlmIChwb3AgIT0gTlVMTAorCQkgICAgICB8fCAoISBmbGFnX202OGtfbXJpICYmICpzID09ICcuJykpCisJCSAgICB7CisJCSAgICAgIC8qCisJCSAgICAgICAqIFBTRVVETyAtIE9QLgorCQkgICAgICAgKgorCQkgICAgICAgKiBXQVJOSU5HOiBjIGhhcyBuZXh0IGNoYXIsIHdoaWNoIG1heSBiZSBlbmQtb2YtbGluZS4KKwkJICAgICAgICogV2UgbG9va3VwIHRoZSBwc2V1ZG8tb3AgdGFibGUgd2l0aCBzKzEgYmVjYXVzZSB3ZQorCQkgICAgICAgKiBhbHJlYWR5IGtub3cgdGhhdCB0aGUgcHNldWRvLW9wIGJlZ2lucyB3aXRoIGEgJy4nLgorCQkgICAgICAgKi8KKworCQkgICAgICBpZiAocG9wID09IE5VTEwpCisJCQlwb3AgPSAocHNldWRvX3R5cGVTICopIGhhc2hfZmluZCAocG9faGFzaCwgcyArIDEpOworCisJCSAgICAgIC8qIEluIE1SSSBtb2RlLCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgYWxpZ25tZW50IGRpcmVjdGl2ZS4gIFdoYXQgYSBoYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcy4gICovCisJCSAgICAgIGlmIChtcmlfcGVuZGluZ19hbGlnbgorCQkJICAmJiAocG9wID09IE5VTEwKKwkJCSAgICAgIHx8ICEgKChwb3AtPnBvY19oYW5kbGVyID09IGNvbnMKKwkJCQkgICAgICYmIHBvcC0+cG9jX3ZhbCA9PSAxKQorCQkJCSAgICB8fCAocG9wLT5wb2NfaGFuZGxlciA9PSBzX3NwYWNlCisJCQkJCSYmIHBvcC0+cG9jX3ZhbCA9PSAxKQorI2lmZGVmIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCisJCQkJICAgIHx8IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCisjZW5kaWYKKwkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmCisJCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmRlZgorCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZjCisJCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmVxcworCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZWxzZQorCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZW5kaWYKKwkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2dsb2JsCisJCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZ25vcmUpKSkKKwkJCXsKKwkJCSAgZG9fYWxpZ24gKDEsIChjaGFyICopIE5VTEwsIDAsIDApOworCQkJICBtcmlfcGVuZGluZ19hbGlnbiA9IDA7CisJCQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCisJCQkgICAgeworCQkJICAgICAgbGluZV9sYWJlbC0+c3lfZnJhZyA9IGZyYWdfbm93OworCQkJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7CisJCQkgICAgfQorCQkJfQorCisJCSAgICAgIC8qIFByaW50IHRoZSBlcnJvciBtc2cgbm93LCB3aGlsZSB3ZSBzdGlsbCBjYW4gKi8KKwkJICAgICAgaWYgKHBvcCA9PSBOVUxMKQorCQkJeworCQkJICBhc19iYWQgKF8oIlVua25vd24gcHNldWRvLW9wOiAgYCVzJyIpLCBzKTsKKwkJCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCQkgIHNfaWdub3JlICgwKTsKKwkJCSAgY29udGludWU7CisJCQl9CisKKwkJICAgICAgLyogUHV0IGl0IGJhY2sgZm9yIGVycm9yIG1lc3NhZ2VzIGV0Yy4gKi8KKwkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgc2tpcCBvZiB3aGl0ZXNwYWNlIGlzIGNvbXB1bHNvcnkuCisJCQkgQSB3ZWxsIHNoYXBlZCBzcGFjZSBpcyBzb21ldGltZXMgYWxsIHRoYXQgc2VwYXJhdGVzCisJCQkga2V5d29yZCBmcm9tIG9wZXJhbmRzLiAqLworCQkgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQkJaW5wdXRfbGluZV9wb2ludGVyKys7CisJCSAgICAgIC8qCisJCSAgICAgICAqIElucHV0X2xpbmUgaXMgcmVzdG9yZWQuCisJCSAgICAgICAqIElucHV0X2xpbmVfcG9pbnRlci0+MXN0IG5vbi1ibGFuayBjaGFyCisJCSAgICAgICAqIGFmdGVyIHBzZXVkby1vcGVyYXRpb24uCisJCSAgICAgICAqLworCQkgICAgICAoKnBvcC0+cG9jX2hhbmRsZXIpIChwb3AtPnBvY192YWwpOworCisJCSAgICAgIC8qIElmIHRoYXQgd2FzIC5lbmQsIGp1c3QgZ2V0IG91dCBub3cuICAqLworCQkgICAgICBpZiAocG9wLT5wb2NfaGFuZGxlciA9PSBzX2VuZCkKKwkJCWdvdG8gcXVpdDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGludCBpbnF1b3RlID0gMDsKKworCQkgICAgICAvKiBXQVJOSU5HOiBjIGhhcyBjaGFyLCB3aGljaCBtYXkgYmUgZW5kLW9mLWxpbmUuICovCisJCSAgICAgIC8qIEFsc286IGlucHV0X2xpbmVfcG9pbnRlci0+YFwwYCB3aGVyZSBjIHdhcy4gKi8KKwkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJCSAgICAgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCisJCQkgICAgIHx8IGlucXVvdGUKKyNpZmRlZiBUQ19FT0xfSU5fSU5TTgorCQkJICAgICB8fCBUQ19FT0xfSU5fSU5TTiAoaW5wdXRfbGluZV9wb2ludGVyKQorI2VuZGlmCisJCQkgICAgICkKKwkJCXsKKwkJCSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQorCQkJICAgIGlucXVvdGUgPSAhIGlucXVvdGU7CisJCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCQkJfQorCisJCSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOworCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKKworCQkgICAgICBnZW5lcmF0ZV9saW5lbm9fZGVidWcgKCk7CisKKwkJICAgICAgaWYgKG1hY3JvX2RlZmluZWQpCisJCQl7CisJCQkgIHNiIG91dDsKKwkJCSAgY29uc3QgY2hhciAqZXJyOworCisJCQkgIGlmIChjaGVja19tYWNybyAocywgJm91dCwgJ1wwJywgJmVycikpCisJCQkgICAgeworCQkJICAgICAgaWYgKGVyciAhPSBOVUxMKQorCQkJCWFzX2JhZCAoZXJyKTsKKwkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7CisJCQkgICAgICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LAorCQkJCQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyKTsKKwkJCSAgICAgIHNiX2tpbGwgKCZvdXQpOworCQkJICAgICAgYnVmZmVyX2xpbWl0ID0KKwkJCQlpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7CisJCQkgICAgICBjb250aW51ZTsKKwkJCSAgICB9CisJCQl9CisKKwkJICAgICAgaWYgKG1yaV9wZW5kaW5nX2FsaWduKQorCQkJeworCQkJICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7CisJCQkgIG1yaV9wZW5kaW5nX2FsaWduID0gMDsKKwkJCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKKwkJCSAgICB7CisJCQkgICAgICBsaW5lX2xhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7CisJCQkgICAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgZnJhZ19ub3dfZml4ICgpKTsKKwkJCSAgICB9CisJCQl9CisKKwkJICAgICAgbWRfYXNzZW1ibGUgKHMpOwkvKiBBc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLworCisJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7CisKKwkJICAgICAgLyogV2UgcmVzdW1lIGxvb3AgQUZURVIgdGhlIGVuZC1vZi1saW5lIGZyb20KKwkJCSB0aGlzIGluc3RydWN0aW9uLiAqLworCQkgICAgfQkJLyogaWYgKCpzPT0nLicpICovCisJCX0JCS8qIGlmIGM9PSc6JyAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CQkJLyogaWYgKGlzX25hbWVfYmVnaW5uZXIoYykgKi8KKworCisJICAvKiBFbXB0eSBzdGF0ZW1lbnQ/ICAqLworCSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBjXSkKKwkgICAgY29udGludWU7CisKKwkgIGlmICgoTE9DQUxfTEFCRUxTX0RPTExBUiB8fCBMT0NBTF9MQUJFTFNfRkIpCisJICAgICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQorCSAgICB7CisJICAgICAgLyogbG9jYWwgbGFiZWwgICgiNDoiKSAqLworCSAgICAgIGNoYXIgKmJhY2t1cCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKworCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKKworCSAgICAgIHRlbXAgPSBjIC0gJzAnOworCisJICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKKwkJeworCQkgIHRlbXAgPSAodGVtcCAqIDEwKSArICppbnB1dF9saW5lX3BvaW50ZXIgLSAnMCc7CisJCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJCX0JCS8qIHJlYWQgdGhlIHdob2xlIG51bWJlciAqLworCisJICAgICAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIKKwkJICAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICckJworCQkgICYmICooaW5wdXRfbGluZV9wb2ludGVyICsgMSkgPT0gJzonKQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisKKwkJICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKHRlbXApKQorCQkgICAgeworCQkgICAgICBhc19mYXRhbCAoXygibGFiZWwgXCIlZCRcIiByZWRlZmluZWQiKSwgdGVtcCk7CisJCSAgICB9CisKKwkJICBkZWZpbmVfZG9sbGFyX2xhYmVsICh0ZW1wKTsKKwkJICBjb2xvbiAoZG9sbGFyX2xhYmVsX25hbWUgKHRlbXAsIDApKTsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgICAgaWYgKExPQ0FMX0xBQkVMU19GQgorCQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnOicpCisJCXsKKwkJICBmYl9sYWJlbF9pbnN0YW5jZV9pbmMgKHRlbXApOworCQkgIGNvbG9uIChmYl9sYWJlbF9uYW1lICh0ZW1wLCAwKSk7CisJCSAgY29udGludWU7CisJCX0KKworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJhY2t1cDsKKwkgICAgfQkJCS8qIGxvY2FsIGxhYmVsICAoIjQ6IikgKi8KKworCSAgaWYgKGMgJiYgc3RyY2hyIChsaW5lX2NvbW1lbnRfY2hhcnMsIGMpKQorCSAgICB7CQkJLyogSXRzIGEgY29tbWVudC4gIEJldHRlciBzYXkgQVBQIG9yIE5PX0FQUCAqLworCSAgICAgIGNoYXIgKmVuZHM7CisJICAgICAgY2hhciAqbmV3X2J1ZjsKKwkgICAgICBjaGFyICpuZXdfdG1wOworCSAgICAgIHVuc2lnbmVkIGludCBuZXdfbGVuZ3RoOworCSAgICAgIGNoYXIgKnRtcF9idWYgPSAwOworCisJICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOworCSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgaWYgKHN0cm5jbXAgKHMsICJBUFBcbiIsIDQpKQorCQljb250aW51ZTsJLyogV2UgaWdub3JlIGl0ICovCisJICAgICAgcyArPSA0OworCisJICAgICAgZW5kcyA9IHN0cnN0ciAocywgIiNOT19BUFBcbiIpOworCisJICAgICAgaWYgKCFlbmRzKQorCQl7CisJCSAgdW5zaWduZWQgaW50IHRtcF9sZW47CisJCSAgdW5zaWduZWQgaW50IG51bTsKKworCQkgIC8qIFRoZSBlbmQgb2YgdGhlICNBUFAgd2Fzbid0IGluIHRoaXMgYnVmZmVyLiAgV2UKKwkJICAgICBrZWVwIHJlYWRpbmcgaW4gYnVmZmVycyB1bnRpbCB3ZSBmaW5kIHRoZSAjTk9fQVBQCisJCSAgICAgdGhhdCBnb2VzIHdpdGggdGhpcyAjQVBQICBUaGVyZSBpcyBvbmUuICBUaGUgc3BlY3MKKwkJICAgICBndWFyZW50ZWUgaXQuIC4gLiAqLworCQkgIHRtcF9sZW4gPSBidWZmZXJfbGltaXQgLSBzOworCQkgIHRtcF9idWYgPSB4bWFsbG9jICh0bXBfbGVuICsgMSk7CisJCSAgbWVtY3B5ICh0bXBfYnVmLCBzLCB0bXBfbGVuKTsKKwkJICBkbworCQkgICAgeworCQkgICAgICBuZXdfdG1wID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZidWZmZXIpOworCQkgICAgICBpZiAoIW5ld190bXApCisJCQlicmVhazsKKwkJICAgICAgZWxzZQorCQkJYnVmZmVyX2xpbWl0ID0gbmV3X3RtcDsKKwkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmZmVyOworCQkgICAgICBlbmRzID0gc3Ryc3RyIChidWZmZXIsICIjTk9fQVBQXG4iKTsKKwkJICAgICAgaWYgKGVuZHMpCisJCQludW0gPSBlbmRzIC0gYnVmZmVyOworCQkgICAgICBlbHNlCisJCQludW0gPSBidWZmZXJfbGltaXQgLSBidWZmZXI7CisKKwkJICAgICAgdG1wX2J1ZiA9IHhyZWFsbG9jICh0bXBfYnVmLCB0bXBfbGVuICsgbnVtKTsKKwkJICAgICAgbWVtY3B5ICh0bXBfYnVmICsgdG1wX2xlbiwgYnVmZmVyLCBudW0pOworCQkgICAgICB0bXBfbGVuICs9IG51bTsKKwkJICAgIH0KKwkJICB3aGlsZSAoIWVuZHMpOworCisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kcyA/IGVuZHMgKyA4IDogTlVMTDsKKworCQkgIHMgPSB0bXBfYnVmOworCQkgIGVuZHMgPSBzICsgdG1wX2xlbjsKKworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kcyArIDg7CisJCX0KKworCSAgICAgIHNjcnViX3N0cmluZyA9IHM7CisJICAgICAgc2NydWJfc3RyaW5nX2VuZCA9IGVuZHM7CisKKwkgICAgICBuZXdfbGVuZ3RoID0gZW5kcyAtIHM7CisJICAgICAgbmV3X2J1ZiA9IChjaGFyICopIHhtYWxsb2MgKG5ld19sZW5ndGgpOworCSAgICAgIG5ld190bXAgPSBuZXdfYnVmOworCSAgICAgIGZvciAoOzspCisJCXsKKwkJICBpbnQgc3BhY2U7CisJCSAgaW50IHNpemU7CisKKwkJICBzcGFjZSA9IChuZXdfYnVmICsgbmV3X2xlbmd0aCkgLSBuZXdfdG1wOworCQkgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoc2NydWJfZnJvbV9zdHJpbmcsIG5ld190bXAsIHNwYWNlKTsKKworCQkgIGlmIChzaXplIDwgc3BhY2UpCisJCSAgICB7CisJCSAgICAgIG5ld190bXAgKz0gc2l6ZTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisKKwkJICBuZXdfYnVmID0geHJlYWxsb2MgKG5ld19idWYsIG5ld19sZW5ndGggKyAxMDApOworCQkgIG5ld190bXAgPSBuZXdfYnVmICsgbmV3X2xlbmd0aDsKKwkJICBuZXdfbGVuZ3RoICs9IDEwMDsKKwkJfQorCisJICAgICAgaWYgKHRtcF9idWYpCisJCWZyZWUgKHRtcF9idWYpOworCSAgICAgIG9sZF9idWZmZXIgPSBidWZmZXI7CisJICAgICAgb2xkX2lucHV0ID0gaW5wdXRfbGluZV9wb2ludGVyOworCSAgICAgIG9sZF9saW1pdCA9IGJ1ZmZlcl9saW1pdDsKKwkgICAgICBidWZmZXIgPSBuZXdfYnVmOworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG5ld19idWY7CisJICAgICAgYnVmZmVyX2xpbWl0ID0gbmV3X3RtcDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7CisKKyNpZmRlZiB0Y191bnJlY29nbml6ZWRfbGluZQorCSAgaWYgKHRjX3VucmVjb2duaXplZF9saW5lIChjKSkKKwkgICAgY29udGludWU7CisjZW5kaWYKKworCSAgLyogYXNfd2FybigiSnVuayBjaGFyYWN0ZXIgJWQuIixjKTsgIE5vdyBkb25lIGJ5IGlnbm9yZV9yZXN0ICovCisJICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyogUmVwb3J0IHVua25vd24gY2hhciBhcyBpZ25vcmVkLiAqLworCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwl9CQkJLyogd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlcjxidWZmZXJfbGltaXQpICovCisKKyNpZmRlZiBtZF9hZnRlcl9wYXNzX2hvb2sKKyAgICAgIG1kX2FmdGVyX3Bhc3NfaG9vayAoKTsKKyNlbmRpZgorCisgICAgICBpZiAob2xkX2J1ZmZlcikKKwl7CisJICBmcmVlIChidWZmZXIpOworCSAgYnVtcF9saW5lX2NvdW50ZXJzICgpOworCSAgaWYgKG9sZF9pbnB1dCAhPSAwKQorCSAgICB7CisJICAgICAgYnVmZmVyID0gb2xkX2J1ZmZlcjsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXQ7CisJICAgICAgYnVmZmVyX2xpbWl0ID0gb2xkX2xpbWl0OworCSAgICAgIG9sZF9idWZmZXIgPSAwOworCSAgICAgIGdvdG8gY29udGluOworCSAgICB9CisJfQorICAgIH0JCQkJLyogd2hpbGUgKG1vcmUgYnVmZmVycyB0byBzY2FuKSAqLworCisgcXVpdDoKKworI2lmZGVmIG1kX2NsZWFudXAKKyAgbWRfY2xlYW51cCgpOworI2VuZGlmCisgIGlucHV0X3NjcnViX2Nsb3NlICgpOwkJLyogQ2xvc2UgdGhlIGlucHV0IGZpbGUgKi8KK30KKworLyogRm9yIG1vc3QgTVJJIHBzZXVkby1vcHMsIHRoZSBsaW5lIGFjdHVhbGx5IGVuZHMgYXQgdGhlIGZpcnN0CisgICBub25xdW90ZWQgc3BhY2UuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciB0aGF0IHBvaW50LCBzdHVmZnMgYSBudWxsCisgICBpbiwgYW5kIHNldHMgKlNUT1BDUCB0byB0aGUgY2hhcmFjdGVyIHRoYXQgdXNlZCB0byBiZSB0aGVyZSwgYW5kCisgICByZXR1cm5zIHRoZSBsb2NhdGlvbi4KKworICAgVW50aWwgSSBoZWFyIG90aGVyd2lzZSwgSSBhbSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIG9ubHkgdHJ1ZQorICAgZm9yIHRoZSBtNjhrIE1SSSBhc3NlbWJsZXIuICAqLworCitjaGFyICoKK21yaV9jb21tZW50X2ZpZWxkIChzdG9wY3ApCisgICAgIGNoYXIgKnN0b3BjcDsKK3sKKyNpZmRlZiBUQ19NNjhLCisKKyAgY2hhciAqczsKKyAgaW50IGlucXVvdGUgPSAwOworCisgIGtub3cgKGZsYWdfbTY4a19tcmkpOworCisgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICAoKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXSAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKKwl8fCBpbnF1b3RlKTsKKyAgICAgICBzKyspCisgICAgeworICAgICAgaWYgKCpzID09ICdcJycpCisJaW5xdW90ZSA9ICEgaW5xdW90ZTsKKyAgICB9CisgICpzdG9wY3AgPSAqczsKKyAgKnMgPSAnXDAnOworICByZXR1cm4gczsKKworI2Vsc2UKKworICBjaGFyICpzOworCisgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdOyBzKyspCisgICAgOworICAqc3RvcGNwID0gKnM7CisgICpzID0gJ1wwJzsKKyAgcmV0dXJuIHM7CisKKyNlbmRpZgorCit9CisKKy8qIFNraXAgdG8gdGhlIGVuZCBvZiBhbiBNUkkgY29tbWVudCBmaWVsZC4gICovCisKK3ZvaWQKK21yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpCisgICAgIGNoYXIgKnN0b3A7CisgICAgIGludCBzdG9wYzsKK3sKKyAga25vdyAoZmxhZ19tcmkpOworCisgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0b3A7CisgICpzdG9wID0gc3RvcGM7CisgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKK30KKwordm9pZCAKK3NfYWJvcnQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgYXNfZmF0YWwgKF8oIi5hYm9ydCBkZXRlY3RlZC4gIEFiYW5kb25pbmcgc2hpcC4iKSk7Cit9CisKKy8qIEd1dHMgb2YgLmFsaWduIGRpcmVjdGl2ZS4gIE4gaXMgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCB0byBhbGlnbi4KKyAgIEZJTEwgbWF5IGJlIE5VTEwsIG9yIGl0IG1heSBwb2ludCB0byB0aGUgYnl0ZXMgb2YgdGhlIGZpbGwgcGF0dGVybi4KKyAgIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHdoYXRldmVyIEZJTEwgcG9pbnRzIHRvLCBpZiBhbnl0aGluZy4gIE1BWCBpcworICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCisgICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLworCitzdGF0aWMgdm9pZCAKK2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKKyAgICAgaW50IG47CisgICAgIGNoYXIgKmZpbGw7CisgICAgIGludCBsZW47CisgICAgIGludCBtYXg7Cit7CisgIGNoYXIgZGVmYXVsdF9maWxsOworCisjaWZkZWYgbWRfZG9fYWxpZ24KKyAgbWRfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4LCBqdXN0X3JlY29yZF9hbGlnbm1lbnQpOworI2VuZGlmCisKKyAgaWYgKGZpbGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgbWF5YmVfdGV4dDsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5vd19zZWcpICYgU0VDX0NPREUpICE9IDApCisJbWF5YmVfdGV4dCA9IDE7CisgICAgICBlbHNlCisJbWF5YmVfdGV4dCA9IDA7CisjZWxzZQorICAgICAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCisJbWF5YmVfdGV4dCA9IDE7CisgICAgICBlbHNlCisJbWF5YmVfdGV4dCA9IDA7CisjZW5kaWYKKworICAgICAgaWYgKG1heWJlX3RleHQpCisJZGVmYXVsdF9maWxsID0gTk9QX09QQ09ERTsKKyAgICAgIGVsc2UKKwlkZWZhdWx0X2ZpbGwgPSAwOworICAgICAgZmlsbCA9ICZkZWZhdWx0X2ZpbGw7CisgICAgICBsZW4gPSAxOworICAgIH0KKworICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLworICBpZiAobiAhPSAwICYmICFuZWVkX3Bhc3NfMikKKyAgICB7CisgICAgICBpZiAobGVuIDw9IDEpCisJZnJhZ19hbGlnbiAobiwgKmZpbGwsIG1heCk7CisgICAgICBlbHNlCisJZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBmaWxsLCBsZW4sIG1heCk7CisgICAgfQorCisjaWZkZWYgbWRfZG9fYWxpZ24KKyBqdXN0X3JlY29yZF9hbGlnbm1lbnQ6CisjZW5kaWYKKworICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKK30KKworLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgQSBwb3NpdGl2ZSBBUkcgaXMgYSBkZWZhdWx0IGFsaWdubWVudAorICAgKGluIGJ5dGVzKS4gIEEgbmVnYXRpdmUgQVJHIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZQorICAgZmlsbCBwYXR0ZXJuLiAgQllURVNfUCBpcyBub24temVybyBpZiB0aGUgYWxpZ25tZW50IHZhbHVlIHNob3VsZCBiZQorICAgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksIHJhdGhlciB0aGFuIHRoZSBwb3dlciBvZiAyLiAgKi8KKworc3RhdGljIHZvaWQKK3NfYWxpZ24gKGFyZywgYnl0ZXNfcCkKKyAgICAgaW50IGFyZzsKKyAgICAgaW50IGJ5dGVzX3A7Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBhbGlnbjsKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisgIG9mZnNldFQgZmlsbCA9IDA7CisgIGludCBtYXg7CisgIGludCBmaWxsX3A7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKworICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQorICAgIHsKKyAgICAgIGlmIChhcmcgPCAwKQorCWFsaWduID0gMDsKKyAgICAgIGVsc2UKKwlhbGlnbiA9IGFyZzsJLyogRGVmYXVsdCB2YWx1ZSBmcm9tIHBzZXVkby1vcCB0YWJsZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgfQorCisgIGlmIChieXRlc19wKQorICAgIHsKKyAgICAgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KKyAgICAgIGlmIChhbGlnbiAhPSAwKQorCXsKKwkgIHVuc2lnbmVkIGludCBpOworCisJICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQorCSAgICA7CisJICBpZiAoYWxpZ24gIT0gMSkKKwkgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKKwkgIGFsaWduID0gaTsKKwl9CisgICAgfQorCisgIGlmIChhbGlnbiA+IDE1KQorICAgIHsKKyAgICAgIGFsaWduID0gMTU7CisgICAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICV1IGFzc3VtZWQiKSwgYWxpZ24pOworICAgIH0KKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgZmlsbF9wID0gMDsKKyAgICAgIG1heCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisJZmlsbF9wID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICBmaWxsX3AgPSAxOworCX0KKworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorCW1heCA9IDA7CisgICAgICBlbHNlCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICBtYXggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKwl9CisgICAgfQorCisgIGlmICghIGZpbGxfcCkKKyAgICB7CisgICAgICBpZiAoYXJnIDwgMCkKKwlhc193YXJuIChfKCJleHBlY3RlZCBmaWxsIHBhdHRlcm4gbWlzc2luZyIpKTsKKyAgICAgIGRvX2FsaWduIChhbGlnbiwgKGNoYXIgKikgTlVMTCwgMCwgbWF4KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgZmlsbF9sZW47CisKKyAgICAgIGlmIChhcmcgPj0gMCkKKwlmaWxsX2xlbiA9IDE7CisgICAgICBlbHNlCisJZmlsbF9sZW4gPSAtIGFyZzsKKyAgICAgIGlmIChmaWxsX2xlbiA8PSAxKQorCXsKKwkgIGNoYXIgZmlsbF9jaGFyOworCisJICBmaWxsX2NoYXIgPSBmaWxsOworCSAgZG9fYWxpZ24gKGFsaWduLCAmZmlsbF9jaGFyLCBmaWxsX2xlbiwgbWF4KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY2hhciBhYlsxNl07CisKKwkgIGlmICgoc2l6ZV90KSBmaWxsX2xlbiA+IHNpemVvZiBhYikKKwkgICAgYWJvcnQgKCk7CisJICBtZF9udW1iZXJfdG9fY2hhcnMgKGFiLCBmaWxsLCBmaWxsX2xlbik7CisJICBkb19hbGlnbiAoYWxpZ24sIGFiLCBmaWxsX2xlbiwgbWF4KTsKKwl9CisgICAgfQorCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOworfQorCisvKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucworICAgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkuICAqLworCit2b2lkIAorc19hbGlnbl9ieXRlcyAoYXJnKQorICAgICBpbnQgYXJnOworeworICBzX2FsaWduIChhcmcsIDEpOworfQorCisvKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucyBhbGlnbgorICAgdG8gYSAyKio0IGJvdW5kYXJ5LiAgKi8KKwordm9pZCAKK3NfYWxpZ25fcHR3byAoYXJnKQorICAgICBpbnQgYXJnOworeworICBzX2FsaWduIChhcmcsIDApOworfQorCit2b2lkIAorc19jb21tIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKm5hbWU7CisgIHJlZ2lzdGVyIGNoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgb2Zmc2V0VCB0ZW1wOworICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOworICBjaGFyICpzdG9wID0gTlVMTDsKKyAgY2hhciBzdG9wYzsKKworICBpZiAoZmxhZ19tcmkpCisgICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCisgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICpwID0gYzsKKyAgU0tJUF9XSElURVNQQUNFICgpOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCisgICAgeworICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIGlmIChmbGFnX21yaSkKKwltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KKyAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICBpZiAoZmxhZ19tcmkpCisJbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisgICAgICByZXR1cm47CisgICAgfQorICAqcCA9IDA7CisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgKnAgPSBjOworICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAorCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICBpZiAoZmxhZ19tcmkpCisJbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQorICAgIHsKKyAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKKwlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKKwkJU19HRVRfTkFNRSAoc3ltYm9sUCksCisJCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCisJCShsb25nKSB0ZW1wKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7CisgICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisgICAgfQorI2lmZGVmIE9CSl9WTVMKKyAgeworICAgIGV4dGVybiBpbnQgZmxhZ19vbmU7CisgICAgaWYgKCAoIXRlbXApIHx8ICFmbGFnX29uZSkKKyAgICAgIFNfR0VUX09USEVSKHN5bWJvbFApID0gY29uc3RfZmxhZzsKKyAgfQorI2VuZGlmIC8qIG5vdCBPQkpfVk1TICovCisgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisgIGlmIChmbGFnX21yaSkKKyAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKK30JCQkJLyogc19jb21tKCkgKi8KKworLyogVGhlIE1SSSBDT01NT04gcHNldWRvLW9wLiAgV2UgaGFuZGxlIHRoaXMgYnkgY3JlYXRpbmcgYSBjb21tb24KKyAgIHN5bWJvbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lLiAgV2UgbWFrZSBzX3NwYWNlIGRvIHRoZSByaWdodAorICAgdGhpbmcgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZS4gICovCisKK3ZvaWQKK3NfbXJpX2NvbW1vbiAoc21hbGwpCisgICAgIGludCBzbWFsbDsKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBjOworICBjaGFyICphbGMgPSBOVUxMOworICBzeW1ib2xTICpzeW07CisgIG9mZnNldFQgYWxpZ247CisgIGNoYXIgKnN0b3AgPSBOVUxMOworICBjaGFyIHN0b3BjOworCisgIGlmICghIGZsYWdfbXJpKQorICAgIHsKKyAgICAgIHNfY29tbSAoMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKKyAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICBkbworCXsKKwkgICsraW5wdXRfbGluZV9wb2ludGVyOworCX0KKyAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpOworICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKKworICAgICAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKKwl7CisJICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKQorCQkJCSAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gbmFtZSkKKwkJCQkgICsgMSk7CisJICBzcHJpbnRmIChhbGMsICIlcyVzIiwgbmFtZSwgU19HRVRfTkFNRSAobGluZV9sYWJlbCkpOworCSAgbmFtZSA9IGFsYzsKKwl9CisgICAgfQorCisgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgaWYgKGFsYyAhPSBOVUxMKQorICAgIGZyZWUgKGFsYyk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIGFsaWduID0gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICB9CisKKyAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSAmJiAhIFNfSVNfQ09NTU9OIChzeW0pKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcyciKSwgU19HRVRfTkFNRSAoc3ltKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFNfU0VUX0VYVEVSTkFMIChzeW0pOworICBtcmlfY29tbW9uX3N5bWJvbCA9IHN5bTsKKworI2lmZGVmIFNfU0VUX0FMSUdOCisgIGlmIChhbGlnbiAhPSAwKQorICAgIFNfU0VUX0FMSUdOIChzeW0sIGFsaWduKTsKKyNlbmRpZgorCisgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCisgICAgeworICAgICAgbGluZV9sYWJlbC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOworICAgICAgbGluZV9sYWJlbC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID0gc3ltOworICAgICAgbGluZV9sYWJlbC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gU19HRVRfVkFMVUUgKHN5bSk7CisgICAgICBsaW5lX2xhYmVsLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworICAgICAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgZXhwcl9zZWN0aW9uKTsKKyAgICB9CisKKyAgLyogRklYTUU6IFdlIGp1c3QgaWdub3JlIHRoZSBzbWFsbCBhcmd1bWVudCwgd2hpY2ggZGlzdGluZ3Vpc2hlcworICAgICBDT01NT04gYW5kIENPTU1PTi5TLiAgSSBkb24ndCBrbm93IHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0LiAgKi8KKworICAvKiBJZ25vcmUgdGhlIHR5cGUgYW5kIGhwdHlwZS4gICovCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Cit9CisKK3ZvaWQKK3NfZGF0YSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzZWdUIHNlY3Rpb247CisgIHJlZ2lzdGVyIGludCB0ZW1wOworCisgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQorICAgIHsKKyAgICAgIHNlY3Rpb24gPSB0ZXh0X3NlY3Rpb247CisgICAgICB0ZW1wICs9IDEwMDA7CisgICAgfQorICBlbHNlCisgICAgc2VjdGlvbiA9IGRhdGFfc2VjdGlvbjsKKworICBzdWJzZWdfc2V0IChzZWN0aW9uLCAoc3Vic2VnVCkgdGVtcCk7CisKKyNpZmRlZiBPQkpfVk1TCisgIGNvbnN0X2ZsYWcgPSAwOworI2VuZGlmCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLmFwcGZpbGUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQorICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuIHdpdGggYQorICAgZmlsZSBuYW1lLiAgVGhpcyBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdAorICAgb3IgQ1BVIHNwZWNpZmljIHBzZXVkby1vcHMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdGhlIGRlZmF1bHQKKyAgIGRlZmluaXRpb24gZm9yIC5maWxlOyB0aGUgQVBQRklMRSBhcmd1bWVudCBpcyAxIGZvciAuYXBwZmlsZSwgMCBmb3IKKyAgIC5maWxlLiAgKi8KKwordm9pZCAKK3NfYXBwX2ZpbGUgKGFwcGZpbGUpCisgICAgIGludCBhcHBmaWxlOworeworICByZWdpc3RlciBjaGFyICpzOworICBpbnQgbGVuZ3RoOworCisgIC8qIFNvbWUgYXNzZW1ibGVycyB0b2xlcmF0ZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgJyInICovCisgIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpICE9IDApCisgICAgeworICAgICAgLyogSWYgdGhpcyBpcyBhIGZha2UgLmFwcGZpbGUsIGEgZmFrZSBuZXdsaW5lIHdhcyBpbnNlcnRlZCBpbnRvCisJIHRoZSBidWZmZXIuICBQYXNzaW5nIC0yIHRvIG5ld19sb2dpY2FsX2xpbmUgdGVsbHMgaXQgdG8KKwkgYWNjb3VudCBmb3IgaXQuICAqLworICAgICAgaW50IG1heV9vbWl0CisJPSAoISBuZXdfbG9naWNhbF9saW5lIChzLCBhcHBmaWxlID8gLTIgOiAtMSkgJiYgYXBwZmlsZSk7CisKKyAgICAgIC8qIEluIE1SSSBtb2RlLCB0aGUgcHJlcHJvY2Vzc29yIG1heSBoYXZlIGluc2VydGVkIGFuIGV4dHJhbmVvdXMKKyAgICAgICAgIGJhY2txdW90ZS4gICovCisgICAgICBpZiAoZmxhZ19tNjhrX21yaQorCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCisJICAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIGlmICghIG1heV9vbWl0KQorCXsKKyNpZmRlZiBMSVNUSU5HCisJICBpZiAobGlzdGluZykKKwkgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAocyk7CisjZW5kaWYKKwkgIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHMpOworI2lmZGVmIG9ial9hcHBfZmlsZQorCSAgb2JqX2FwcF9maWxlIChzKTsKKyNlbmRpZgorCX0KKyAgICB9Cit9CisKKy8qIEhhbmRsZSB0aGUgLmFwcGxpbmUgcHNldWRvLW9wLiAgVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQorICAgZG9fc2NydWJfY2hhcnMgd2hlbiBhIHByZXByb2Nlc3NvciAjIGxpbmUgY29tbWVudCBpcyBzZWVuLiAgVGhpcworICAgZGVmYXVsdCBkZWZpbml0aW9uIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBvYmplY3Qgb3IgQ1BVIHNwZWNpZmljCisgICBwc2V1ZG8tb3BzLiAgKi8KKwordm9pZAorc19hcHBfbGluZSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpbnQgbDsKKworICAvKiBUaGUgZ2l2ZW4gbnVtYmVyIGlzIHRoYXQgb2YgdGhlIG5leHQgbGluZS4gICovCisgIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSAtIDE7CisgIGlmIChsIDwgMCkKKyAgICAvKiBTb21lIG9mIHRoZSBiYWNrIGVuZHMgY2FuJ3QgZGVhbCB3aXRoIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCisgICAgICAgQmVzaWRlcywgaXQncyBzaWxseS4gICovCisgICAgYXNfd2FybiAoXygiTGluZSBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmU7IGxpbmUgbnVtYmVyICVkIHJlamVjdGVkLiIpLCBsKzEpOworICBlbHNlCisgICAgeworICAgICAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgbCk7CisjaWZkZWYgTElTVElORworICAgICAgaWYgKGxpc3RpbmcpCisJbGlzdGluZ19zb3VyY2VfbGluZSAobCk7CisjZW5kaWYKKyAgICB9CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLmVuZCBwc2V1ZG8tb3AuICBBY3R1YWxseSwgdGhlIHJlYWwgd29yayBpcyBkb25lIGluCisgICByZWFkX2Ffc291cmNlX2ZpbGUuICAqLworCit2b2lkCitzX2VuZCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBpZiAoZmxhZ19tcmkpCisgICAgeworICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgcGVybWl0cyB0aGUgc3RhcnQgc3ltYm9sIHRvIGZvbGxvdyAuZW5kLAorICAgICAgICAgYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhhdC4gICovCisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KKwkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyonCisJICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICchJykKKwlhc193YXJuIChfKCJzdGFydCBhZGRyZXNzIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgfQorfQorCisvKiBIYW5kbGUgdGhlIC5lcnIgcHNldWRvLW9wLiAgKi8KKwordm9pZAorc19lcnIgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgYXNfYmFkIChfKCIuZXJyIGVuY291bnRlcmVkIikpOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCisvKiBIYW5kbGUgdGhlIE1SSSBmYWlsIHBzZXVkby1vcC4gICovCisKK3ZvaWQKK3NfZmFpbCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBvZmZzZXRUIHRlbXA7CisgIGNoYXIgKnN0b3AgPSBOVUxMOworICBjaGFyIHN0b3BjOworCisgIGlmIChmbGFnX21yaSkKKyAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7CisKKyAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBpZiAodGVtcCA+PSA1MDApCisgICAgYXNfd2FybiAoXygiLmZhaWwgJWxkIGVuY291bnRlcmVkIiksIChsb25nKSB0ZW1wKTsKKyAgZWxzZQorICAgIGFzX2JhZCAoXygiLmZhaWwgJWxkIGVuY291bnRlcmVkIiksIChsb25nKSB0ZW1wKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisgIGlmIChmbGFnX21yaSkKKyAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKK30KKwordm9pZCAKK3NfZmlsbCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBleHByZXNzaW9uUyByZXBfZXhwOworICBsb25nIHNpemUgPSAxOworICByZWdpc3RlciBsb25nIGZpbGwgPSAwOworICBjaGFyICpwOworCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKCZyZXBfZXhwKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorCXsKKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCX0KKyAgICB9CisKKyAgLyogVGhpcyBpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBBUywgbm90IGZvciBhbnkgcmF0aW9uYWwgcmVhc29uLiAgKi8KKyNkZWZpbmUgQlNEX0ZJTExfU0laRV9DUk9DS184ICg4KQorICBpZiAoc2l6ZSA+IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCIuZmlsbCBzaXplIGNsYW1wZWQgdG8gJWQuIiksIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfOCk7CisgICAgICBzaXplID0gQlNEX0ZJTExfU0laRV9DUk9DS184OworICAgIH0KKyAgaWYgKHNpemUgPCAwKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIlNpemUgbmVnYXRpdmU6IC5maWxsIGlnbm9yZWQuIikpOworICAgICAgc2l6ZSA9IDA7CisgICAgfQorICBlbHNlIGlmIChyZXBfZXhwLlhfb3AgPT0gT19jb25zdGFudCAmJiByZXBfZXhwLlhfYWRkX251bWJlciA8PSAwKQorICAgIHsKKyAgICAgIGlmIChyZXBfZXhwLlhfYWRkX251bWJlciA8IDApCisJYXNfd2FybiAoXygiUmVwZWF0IDwgMCwgLmZpbGwgaWdub3JlZCIpKTsKKyAgICAgIHNpemUgPSAwOworICAgIH0KKworICBpZiAoc2l6ZSAmJiAhbmVlZF9wYXNzXzIpCisgICAgeworICAgICAgaWYgKHJlcF9leHAuWF9vcCA9PSBPX2NvbnN0YW50KQorCXsKKwkgIHAgPSBmcmFnX3ZhciAocnNfZmlsbCwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwKKwkJCShyZWxheF9zdWJzdGF0ZVQpIDAsIChzeW1ib2xTICopIDAsCisJCQkob2Zmc2V0VCkgcmVwX2V4cC5YX2FkZF9udW1iZXIsCisJCQkoY2hhciAqKSAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHJlcGVhdCBjb3VudCwgc28gd2UgY2FuJ3QgdXNlCisJICAgICByc19maWxsLiAgV2UgY2FuIGdldCB0aGUgc2FtZSByZXN1bHRzIG91dCBvZiByc19zcGFjZSwKKwkgICAgIGJ1dCBpdHMgYXJndW1lbnQgaXMgaW4gYnl0ZXMsIHNvIHdlIG11c3QgbXVsdGlwbHkgdGhlCisJICAgICByZXBlYXQgY291bnQgYnkgc2l6ZS4gICovCisKKwkgIHN5bWJvbFMgKnJlcF9zeW07CisJICByZXBfc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJnJlcF9leHApOworCSAgaWYgKHNpemUgIT0gMSkKKwkgICAgeworCSAgICAgIGV4cHJlc3Npb25TIHNpemVfZXhwOworCSAgICAgIHNpemVfZXhwLlhfb3AgPSBPX2NvbnN0YW50OworCSAgICAgIHNpemVfZXhwLlhfYWRkX251bWJlciA9IHNpemU7CisKKwkgICAgICByZXBfZXhwLlhfb3AgPSBPX211bHRpcGx5OworCSAgICAgIHJlcF9leHAuWF9hZGRfc3ltYm9sID0gcmVwX3N5bTsKKwkgICAgICByZXBfZXhwLlhfb3Bfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoJnNpemVfZXhwKTsKKwkgICAgICByZXBfZXhwLlhfYWRkX251bWJlciA9IDA7CisJICAgICAgcmVwX3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyZXBfZXhwKTsKKwkgICAgfQorCisJICBwID0gZnJhZ192YXIgKHJzX3NwYWNlLCAoaW50KSBzaXplLCAoaW50KSBzaXplLAorCQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgcmVwX3N5bSwgKG9mZnNldFQpIDAsIChjaGFyICopIDApOworCX0KKyAgICAgIG1lbXNldCAocCwgMCwgKHVuc2lnbmVkIGludCkgc2l6ZSk7CisgICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCBpcyBmcm9tIEJTRCA0LjIgVkFYCisgICAgICAgKiBmbGF2b3VyZWQgQVMuICBUaGUgZm9sbG93aW5nIGJpenphcmUgYmVoYXZpb3VyIGlzIHRvIGJlCisgICAgICAgKiBjb21wYXRpYmxlIHdpdGggYWJvdmUuICBJIGd1ZXNzIHRoZXkgdHJpZWQgdG8gdGFrZSB1cCB0byA4CisgICAgICAgKiBieXRlcyBmcm9tIGEgNC1ieXRlIGV4cHJlc3Npb24gYW5kIHRoZXkgZm9yZ290IHRvIHNpZ24KKyAgICAgICAqIGV4dGVuZC4gVW4qeCBTdXguICovCisjZGVmaW5lIEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNCAoNCkKKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgZmlsbCwKKwkJCSAgKHNpemUgPiBCU0RfRklMTF9TSVpFX0NST0NLXzQKKwkJCSAgID8gQlNEX0ZJTExfU0laRV9DUk9DS180CisJCQkgICA6IChpbnQpIHNpemUpKTsKKyAgICAgIC8qIE5vdGU6IC5maWxsICgpLDAgZW1pdHMgbm8gZnJhZyAoc2luY2Ugd2UgYXJlIGFza2VkIHRvIC5maWxsIDAgYnl0ZXMpCisgICAgICAgKiBidXQgZW1pdHMgbm8gZXJyb3IgbWVzc2FnZSBiZWNhdXNlIGl0IHNlZW1zIGEgbGVnYWwgdGhpbmcgdG8gZG8uCisgICAgICAgKiBJdCBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiAuZmlsbCBidXQgY291bGQgYmUgZW1pdHRlZCBieSBhIGNvbXBpbGVyLgorICAgICAgICovCisgICAgfQorICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQorCit2b2lkIAorc19nbG9ibCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBpbnQgYzsKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKworICBkbworICAgIHsKKyAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CisgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKKyAgICAgIGlmIChjID09ICcsJykKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCisJICAgIGMgPSAnXG4nOworCX0KKyAgICB9CisgIHdoaWxlIChjID09ICcsJyk7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworICBpZiAoZmxhZ19tcmkpCisgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Cit9CisKKy8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgKi8KKwordm9pZAorc19pcnAgKGlycGMpCisgICAgIGludCBpcnBjOworeworICBjaGFyICpmaWxlOworICB1bnNpZ25lZCBpbnQgbGluZTsKKyAgc2IgczsKKyAgY29uc3QgY2hhciAqZXJyOworICBzYiBvdXQ7CisKKyAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7CisKKyAgc2JfbmV3ICgmcyk7CisgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICBzYl9hZGRfY2hhciAoJnMsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7CisKKyAgc2JfbmV3ICgmb3V0KTsKKworICBlcnIgPSBleHBhbmRfaXJwIChpcnBjLCAwLCAmcywgJm91dCwgZ2V0X2xpbmVfc2IsICdcMCcpOworICBpZiAoZXJyICE9IE5VTEwpCisgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCAiJXMiLCBlcnIpOworCisgIHNiX2tpbGwgKCZzKTsKKworICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LCBpbnB1dF9saW5lX3BvaW50ZXIpOworICBzYl9raWxsICgmb3V0KTsKKyAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOworfQorCisvKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gbWFyaworICAgdGhlIHNlY3Rpb24gdG8gb25seSBiZSBsaW5rZWQgb25jZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHN1cHBvcnRlZAorICAgYnkgbW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhpcyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCwKKyAgIHdoaWNoIGlzIHdoYXQgdG8gZG8gYWJvdXQgZHVwbGljYXRlcy4gICovCisKK3ZvaWQKK3NfbGlua29uY2UgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIHR5cGUgPSBMSU5LT05DRV9ESVNDQVJEOworCisgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICBjaGFyICpzOworICAgICAgY2hhciBjOworCisgICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAgICAgaWYgKHN0cmNhc2VjbXAgKHMsICJkaXNjYXJkIikgPT0gMCkKKwl0eXBlID0gTElOS09OQ0VfRElTQ0FSRDsKKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJvbmVfb25seSIpID09IDApCisJdHlwZSA9IExJTktPTkNFX09ORV9PTkxZOworICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInNhbWVfc2l6ZSIpID09IDApCisJdHlwZSA9IExJTktPTkNFX1NBTUVfU0laRTsKKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzYW1lX2NvbnRlbnRzIikgPT0gMCkKKwl0eXBlID0gTElOS09OQ0VfU0FNRV9DT05URU5UUzsKKyAgICAgIGVsc2UKKwlhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIpLCBzKTsKKworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgICAgfQorCisjaWZkZWYgb2JqX2hhbmRsZV9saW5rX29uY2UKKyAgb2JqX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpOworI2Vsc2UgLyogISBkZWZpbmVkIChvYmpfaGFuZGxlX2xpbmtfb25jZSkgKi8KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIHsKKyAgICBmbGFnd29yZCBmbGFnczsKKworICAgIGlmICgoYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KSAmIFNFQ19MSU5LX09OQ0UpID09IDApCisgICAgICBhc193YXJuIChfKCIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7CisKKyAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKTsKKyAgICBmbGFncyB8PSBTRUNfTElOS19PTkNFOworICAgIHN3aXRjaCAodHlwZSkKKyAgICAgIHsKKyAgICAgIGRlZmF1bHQ6CisJYWJvcnQgKCk7CisgICAgICBjYXNlIExJTktPTkNFX0RJU0NBUkQ6CisJZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOworCWJyZWFrOworICAgICAgY2FzZSBMSU5LT05DRV9PTkVfT05MWToKKwlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOworCWJyZWFrOworICAgICAgY2FzZSBMSU5LT05DRV9TQU1FX1NJWkU6CisJZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7CisJYnJlYWs7CisgICAgICBjYXNlIExJTktPTkNFX1NBTUVfQ09OVEVOVFM6CisJZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOworCWJyZWFrOworICAgICAgfQorICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnLCBmbGFncykpCisgICAgICBhc19iYWQgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiKSwKKwkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgIH0KKyNlbHNlIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KKyAgYXNfd2FybiAoXygiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOworI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKG9ial9oYW5kbGVfbGlua19vbmNlKSAqLworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CisKK3N0YXRpYyB2b2lkIAorc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIGJ5dGVzX3ApCisgICAgIC8qIDEgaWYgdGhpcyB3YXMgYSAiLmJzcyIgZGlyZWN0aXZlLCB3aGljaCBtYXkgcmVxdWlyZSBhIDNyZCBhcmd1bWVudAorCShhbGlnbm1lbnQpOyAwIGlmIGl0IHdhcyBhbiAiLmxjb21tIiAoMiBhcmdzIG9ubHkpICAqLworICAgICBpbnQgbmVlZHNfYWxpZ247CisgICAgIC8qIDEgaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksCisJcmF0aGVyIHRoYW4gdGhlIHBvd2VyIG9mIDIuICovCisgICAgIGludCBieXRlc19wOworeworICByZWdpc3RlciBjaGFyICpuYW1lOworICByZWdpc3RlciBjaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOworICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKKyAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7CisgIGNvbnN0IGludCBtYXhfYWxpZ25tZW50ID0gMTU7CisgIGludCBhbGlnbiA9IDA7CisgIHNlZ1QgYnNzX3NlZyA9IGJzc19zZWN0aW9uOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKnAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgLyogQWNjZXB0IGFuIG9wdGlvbmFsIGNvbW1hIGFmdGVyIHRoZSBuYW1lLiAgVGhlIGNvbW1hIHVzZWQgdG8gYmUKKyAgICAgcmVxdWlyZWQsIGJ1dCBJcml4IDUgY2MgZG9lcyBub3QgZ2VuZXJhdGUgaXQuICAqLworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgfQorCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCisgICAgeworICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKKyAgICB7CisgICAgICBhc193YXJuIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZCAoVENfTUlQUykgfHwgZGVmaW5lZCAoVENfQUxQSEEpCisgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgorICAgICAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHsKKyAgICAgIC8qIEZvciBNSVBTIGFuZCBBbHBoYSBFQ09GRiBvciBFTEYsIHNtYWxsIG9iamVjdHMgYXJlIHB1dCBpbiAuc2Jzcy4gICovCisgICAgICBpZiAodGVtcCA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCisJeworCSAgYnNzX3NlZyA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDEpOworCSAgc2VnX2luZm8gKGJzc19zZWcpLT5ic3MgPSAxOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKwkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VnLCBTRUNfQUxMT0MpKQorCSAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIi5zYnNzXCI6ICVzIiksCisJCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworI2VuZGlmCisJfQorICAgIH0KKyNlbmRpZgorICAgaWYgKCFuZWVkc19hbGlnbikKKyAgICAgeworICAgICAgIC8qIEZJWE1FLiBUaGlzIG5lZWRzIHRvIGJlIG1hY2hpbmUgaW5kZXBlbmRlbnQuICovCisgICAgICAgaWYgKHRlbXAgPj0gOCkKKwkgYWxpZ24gPSAzOworICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gNCkKKwkgYWxpZ24gPSAyOworICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gMikKKwkgYWxpZ24gPSAxOworICAgICAgIGVsc2UKKwkgYWxpZ24gPSAwOworCisjaWZkZWYgT0JKX0VWQVgKKyAgICAgICAvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIGEgbW9yZSBnZW5lcmFsIGZhc2hpb24uICAqLworICAgICAgIGFsaWduID0gMzsKKyNlbmRpZgorCisgICAgICAgcmVjb3JkX2FsaWdubWVudChic3Nfc2VnLCBhbGlnbik7CisgICAgIH0KKworICBpZiAobmVlZHNfYWxpZ24pCisgICAgeworICAgICAgYWxpZ24gPSAwOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorCXsKKwkgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc2l6ZSIpKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQorCXsKKwkgIGFzX2JhZCAoXygiTWlzc2luZyBhbGlnbm1lbnQiKSk7CisJICByZXR1cm47CisJfQorICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgIGlmIChieXRlc19wKQorCXsKKwkgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KKwkgIGlmIChhbGlnbiAhPSAwKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IGk7CisKKwkgICAgICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQorCQk7CisJICAgICAgaWYgKGFsaWduICE9IDEpCisJCWFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7CisJICAgICAgYWxpZ24gPSBpOworCSAgICB9CisJfQorICAgICAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKKwl7CisJICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7CisJICBhc193YXJuIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgYWxpZ24pOworCX0KKyAgICAgIGVsc2UgaWYgKGFsaWduIDwgMCkKKwl7CisJICBhbGlnbiA9IDA7CisJICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iKSk7CisJfQorICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlZywgYWxpZ24pOworICAgIH0JCQkJLyogaWYgbmVlZHMgYWxpZ24gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFzc3VtZSBzb21lIG9iamVjdHMgbWF5IHJlcXVpcmUgYWxpZ25tZW50IG9uIHNvbWUgc3lzdGVtcy4gICovCisjaWYgZGVmaW5lZCAoVENfQUxQSEEpICYmICEgZGVmaW5lZCAoVk1TKQorICAgICAgaWYgKHRlbXAgPiAxKQorCXsKKwkgIGFsaWduID0gZmZzICh0ZW1wKSAtIDE7CisJICBpZiAodGVtcCAlICgxIDw8IGFsaWduKSkKKwkgICAgYWJvcnQgKCk7CisJfQorI2VuZGlmCisgICAgfQorCisgICpwID0gMDsKKyAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOworICAqcCA9IGM7CisKKyAgaWYgKAorI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKKyAgICAgICBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMCAmJgorICAgICAgIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAgJiYKKyNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLworICAgICAgIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VnCisJfHwgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKSkpCisgICAgeworICAgICAgY2hhciAqcGZyYWc7CisKKyAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWcsIDEpOworCisgICAgICBpZiAoYWxpZ24pCisJZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOworCQkJCQkvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZwkqLworICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWcpCisJc3ltYm9sUC0+c3lfZnJhZy0+ZnJfc3ltYm9sID0gTlVMTDsKKworICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OworICAgICAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKTAsIHN5bWJvbFAsCisJCQkob2Zmc2V0VCkgdGVtcCwgKGNoYXIgKikgMCk7CisgICAgICAqcGZyYWcgPSAwOworCisgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VnKTsKKworI2lmZGVmIE9CSl9DT0ZGCisgICAgICAvKiBUaGUgc3ltYm9sIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBwcmVjZWRpbmcKKyAgICAgICAgICIuZ2xvYmwiIGRpcmVjdGl2ZSAtLSBiZSBjYXJlZnVsIG5vdCB0byBzdGVwIG9uIHN0b3JhZ2UgY2xhc3MKKyAgICAgICAgIGluIHRoYXQgY2FzZS4gIE90aGVyd2lzZSwgc2V0IGl0IHRvIHN0YXRpYy4gKi8KKyAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSAhPSBDX0VYVCkKKwl7CisJICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOworCX0KKyNlbmRpZiAvKiBPQkpfQ09GRiAqLworCisjaWZkZWYgU19TRVRfU0laRQorICAgICAgU19TRVRfU0laRSAoc3ltYm9sUCwgdGVtcCk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAorCSAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisKKyAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBzX2xjb21tX2ludGVybmFsKCkgKi8KKwordm9pZAorc19sY29tbSAobmVlZHNfYWxpZ24pCisgICAgIGludCBuZWVkc19hbGlnbjsKK3sKKyAgc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIDApOworfQorCit2b2lkIHNfbGNvbW1fYnl0ZXMgKG5lZWRzX2FsaWduKQorICAgICBpbnQgbmVlZHNfYWxpZ247Cit7CisgIHNfbGNvbW1faW50ZXJuYWwgKG5lZWRzX2FsaWduLCAxKTsKK30KKwordm9pZCAKK3NfbHN5bSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICByZWdpc3RlciBjaGFyICpuYW1lOworICByZWdpc3RlciBjaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGV4cHJlc3Npb25TIGV4cDsKKyAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKKworICAvKiB3ZSBwZXJtaXQgQU5ZIGRlZmluZWQgZXhwcmVzc2lvbjogQlNENC4yIGRlbWFuZHMgY29uc3RhbnRzICovCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKnAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICAqcCA9IDA7CisgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOworICAgICAgKnAgPSBjOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBleHByZXNzaW9uICgmZXhwKTsKKyAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQKKyAgICAgICYmIGV4cC5YX29wICE9IE9fcmVnaXN0ZXIpCisgICAgeworICAgICAgYXNfYmFkIChfKCJiYWQgZXhwcmVzc2lvbiIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAqcCA9IDA7CisgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKworICAvKiBGSVhNRS1TT09OIEkgcHVsbGVkIGEgKCYmIHN5bWJvbFAtPnN5X290aGVyID09IDAgJiYKKyAgICAgc3ltYm9sUC0+c3lfZGVzYyA9PSAwKSBvdXQgb2YgdGhpcyB0ZXN0IGJlY2F1c2UgY29mZiBkb2Vzbid0IGhhdmUKKyAgICAgdGhvc2UgZmllbGRzLCBhbmQgSSBjYW4ndCBzZWUgd2hlbiB0aGV5J2QgZXZlciBiZSB0cmlwcGVkLiAgSQorICAgICBkb24ndCB0aGluayBJIHVuZGVyc3RhbmQgd2h5IHRoZXkgd2VyZSBoZXJlIHNvIEkgbWF5IGhhdmUKKyAgICAgaW50cm9kdWNlZCBhIGJ1Zy4gQXMgcmVjZW50bHkgYXMgMS4zNyBkaWRuJ3QgaGF2ZSB0aGlzIHRlc3QKKyAgICAgYW55d2F5LiAgeG94b3JpY2guICovCisKKyAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHVuZGVmaW5lZF9zZWN0aW9uCisgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaGUgbmFtZSBtaWdodCBiZSBhbiB1bmRlZmluZWQgLmdsb2JhbCBzeW1ib2w7IGJlIHN1cmUgdG8KKwkga2VlcCB0aGUgImV4dGVybmFsIiBiaXQuICovCisgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLAorCQkgICAgIChleHAuWF9vcCA9PSBPX2NvbnN0YW50CisJCSAgICAgID8gYWJzb2x1dGVfc2VjdGlvbgorCQkgICAgICA6IHJlZ19zZWN0aW9uKSk7CisgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfYmFkIChfKCJTeW1ib2wgJXMgYWxyZWFkeSBkZWZpbmVkIiksIG5hbWUpOworICAgIH0KKyAgKnAgPSBjOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBzX2xzeW0oKSAqLworCisvKiBSZWFkIGEgbGluZSBpbnRvIGFuIHNiLiAgKi8KKworc3RhdGljIGludAorZ2V0X2xpbmVfc2IgKGxpbmUpCisgICAgIHNiICpsaW5lOworeworICBjaGFyIHF1b3RlMSwgcXVvdGUyLCBpbnF1b3RlOworCisgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcbicpCisgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOworCisgIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgPj0gYnVmZmVyX2xpbWl0KQorICAgIHsKKyAgICAgIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKKyAgICAgIGlmIChidWZmZXJfbGltaXQgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgLyogSWYgYXBwLmMgc2V0cyBhbnkgb3RoZXIgY2hhcmFjdGVycyB0byBMRVhfSVNfU1RSSU5HUVVPVEUsIHRoaXMKKyAgICAgY29kZSBuZWVkcyB0byBiZSBjaGFuZ2VkLiAgKi8KKyAgaWYgKCEgZmxhZ19tNjhrX21yaSkKKyAgICBxdW90ZTEgPSAnIic7CisgIGVsc2UKKyAgICBxdW90ZTEgPSAnXDAnOworCisgIHF1b3RlMiA9ICdcMCc7CisgIGlmIChmbGFnX202OGtfbXJpKQorICAgIHF1b3RlMiA9ICdcJyc7CisjaWZkZWYgTEVYX0lTX1NUUklOR1FVT1RFCisgIHF1b3RlMiA9ICdcJyc7CisjZW5kaWYKKworICBpbnF1b3RlID0gJ1wwJzsKKyAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCisJIHx8IChpbnF1b3RlICE9ICdcMCcgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXG4nKSkKKyAgICB7CisgICAgICBpZiAoaW5xdW90ZSA9PSAqaW5wdXRfbGluZV9wb2ludGVyKQorCWlucXVvdGUgPSAnXDAnOworICAgICAgZWxzZSBpZiAoaW5xdW90ZSA9PSAnXDAnKQorCXsKKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09IHF1b3RlMSkKKwkgICAgaW5xdW90ZSA9IHF1b3RlMTsKKwkgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gcXVvdGUyKQorCSAgICBpbnF1b3RlID0gcXVvdGUyOworCX0KKyAgICAgIHNiX2FkZF9jaGFyIChsaW5lLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOworICAgIH0KKyAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAorCSAmJiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisgICAgeworICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKKwlidW1wX2xpbmVfY291bnRlcnMgKCk7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBEZWZpbmUgYSBtYWNyby4gIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvIG1hY3JvLmMsIHdoaWNoIGlzIHNoYXJlZAorICAgYmV0d2VlbiBnYXMgYW5kIGdhc3AuICAqLworCit2b2lkCitzX21hY3JvIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGNoYXIgKmZpbGU7CisgIHVuc2lnbmVkIGludCBsaW5lOworICBzYiBzOworICBzYiBsYWJlbDsKKyAgY29uc3QgY2hhciAqZXJyOworICBjb25zdCBjaGFyICpuYW1lOworCisgIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOworCisgIHNiX25ldyAoJnMpOworICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisgICAgc2JfYWRkX2NoYXIgKCZzLCAqaW5wdXRfbGluZV9wb2ludGVyKyspOworCisgIHNiX25ldyAoJmxhYmVsKTsKKyAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKKyAgICBzYl9hZGRfc3RyaW5nICgmbGFiZWwsIFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKTsKKworICBlcnIgPSBkZWZpbmVfbWFjcm8gKDAsICZzLCAmbGFiZWwsIGdldF9saW5lX3NiLCAmbmFtZSk7CisgIGlmIChlcnIgIT0gTlVMTCkKKyAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsICIlcyIsIGVycik7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQorCXsKKwkgIFNfU0VUX1NFR01FTlQgKGxpbmVfbGFiZWwsIHVuZGVmaW5lZF9zZWN0aW9uKTsKKwkgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCAwKTsKKwkgIGxpbmVfbGFiZWwtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7CisJfQorCisgICAgICBpZiAoKChmbGFnX202OGtfbXJpCisjaWZkZWYgTk9fUFNFVURPX0RPVAorCSAgICB8fCAxCisjZW5kaWYKKwkgICAgKQorCSAgICYmIGhhc2hfZmluZCAocG9faGFzaCwgbmFtZSkgIT0gTlVMTCkKKwkgIHx8ICghIGZsYWdfbTY4a19tcmkKKwkgICAgICAmJiAqbmFtZSA9PSAnLicKKwkgICAgICAmJiBoYXNoX2ZpbmQgKHBvX2hhc2gsIG5hbWUgKyAxKSAhPSBOVUxMKSkKKwlhc193YXJuIChfKCJhdHRlbXB0IHRvIHJlZGVmaW5lIHBzZXVkby1vcCBgJXMnIGlnbm9yZWQiKSwKKwkJIG5hbWUpOworICAgIH0KKworICBzYl9raWxsICgmcyk7Cit9CisKKy8qIEhhbmRsZSB0aGUgLm1leGl0IHBzZXVkby1vcCwgd2hpY2ggaW1tZWRpYXRlbHkgZXhpdHMgYSBtYWNybworICAgZXhwYW5zaW9uLiAgKi8KKwordm9pZAorc19tZXhpdCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjb25kX2V4aXRfbWFjcm8gKG1hY3JvX25lc3QpOworICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Cit9CisKKy8qIFN3aXRjaCBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgKi8KKwordm9pZAorc19tcmkgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IG9uLCBvbGRfZmxhZzsKKworICBvbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICBvbGRfZmxhZyA9IGZsYWdfbXJpOworICBpZiAob24gIT0gMCkKKyAgICB7CisgICAgICBmbGFnX21yaSA9IDE7CisjaWZkZWYgVENfTTY4SworICAgICAgZmxhZ19tNjhrX21yaSA9IDE7CisjZW5kaWYKKyAgICAgIG1hY3JvX21yaV9tb2RlICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmbGFnX21yaSA9IDA7CisgICAgICBmbGFnX202OGtfbXJpID0gMDsKKyAgICAgIG1hY3JvX21yaV9tb2RlICgwKTsKKyAgICB9CisKKyAgLyogT3BlcmF0b3IgcHJlY2VkZW5jZSBjaGFuZ2VzIGluIG02OGsgTVJJIG1vZGUsIHNvIHdlIG5lZWQgdG8KKyAgICAgdXBkYXRlIHRoZSBvcGVyYXRvciByYW5raW5ncy4gICovCisgIGV4cHJfc2V0X3ByZWNlZGVuY2UgKCk7CisKKyNpZmRlZiBNUklfTU9ERV9DSEFOR0UKKyAgaWYgKG9uICE9IG9sZF9mbGFnKQorICAgIE1SSV9NT0RFX0NIQU5HRSAob24pOworI2VuZGlmCisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIGNoYW5naW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgKi8KKworc3RhdGljIHZvaWQKK2RvX29yZyAoc2VnbWVudCwgZXhwLCBmaWxsKQorICAgICBzZWdUIHNlZ21lbnQ7CisgICAgIGV4cHJlc3Npb25TICpleHA7CisgICAgIGludCBmaWxsOworeworICBpZiAoc2VnbWVudCAhPSBub3dfc2VnICYmIHNlZ21lbnQgIT0gYWJzb2x1dGVfc2VjdGlvbikKKyAgICBhc19iYWQgKF8oImludmFsaWQgc2VnbWVudCBcIiVzXCI7IHNlZ21lbnQgXCIlc1wiIGFzc3VtZWQiKSwKKwkgICAgc2VnbWVudF9uYW1lIChzZWdtZW50KSwgc2VnbWVudF9uYW1lIChub3dfc2VnKSk7CisKKyAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKyAgICB7CisgICAgICBpZiAoZmlsbCAhPSAwKQorCWFzX3dhcm4gKF8oImlnbm9yaW5nIGZpbGwgdmFsdWUgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKKyAgICAgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKKwl7CisJICBhc19iYWQgKF8oIm9ubHkgY29uc3RhbnQgb2Zmc2V0cyBzdXBwb3J0ZWQgaW4gYWJzb2x1dGUgc2VjdGlvbiIpKTsKKwkgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKKwl9CisgICAgICBhYnNfc2VjdGlvbl9vZmZzZXQgPSBleHAtPlhfYWRkX251bWJlcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpwOworCisgICAgICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgZXhwLT5YX2FkZF9zeW1ib2wsCisJCSAgICBleHAtPlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCk7CisgICAgICAqcCA9IGZpbGw7CisgICAgfQorfQorCit2b2lkIAorc19vcmcgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OworICBleHByZXNzaW9uUyBleHA7CisgIHJlZ2lzdGVyIGxvbmcgdGVtcF9maWxsOworCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICAvKiBUaGUgbTY4ayBNUkkgYXNzZW1ibGVyIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGZvciAub3JnLiAgSXQKKyAgICAgbWVhbnMgdG8gY3JlYXRlIGFuIGFic29sdXRlIHNlY3Rpb24gYXQgYSBnaXZlbiBhZGRyZXNzLiAgV2UgY2FuJ3QKKyAgICAgc3VwcG9ydCB0aGF0LS11c2UgYSBsaW5rZXIgc2NyaXB0IGluc3RlYWQuICAqLworICBpZiAoZmxhZ19tNjhrX21yaSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oIk1SSSBzdHlsZSBPUkcgcHNldWRvLW9wIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBEb24ndCBiZWxpZXZlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEJTRCA0LjIgQVMuICBUaGVyZSBpcyBubyBzdWNoCisgICAgIHRoaW5nIGFzIGEgc3ViLXNlZ21lbnQtcmVsYXRpdmUgb3JpZ2luLiAgQW55IGFic29sdXRlIG9yaWdpbiBpcworICAgICBnaXZlbiBhIHdhcm5pbmcsIHRoZW4gYXNzdW1lZCB0byBiZSBzZWdtZW50LXJlbGF0aXZlLiAgQW55CisgICAgIHNlZ21lbnRlZCBvcmlnaW4gZXhwcmVzc2lvbiAoImZvbys0MiIpIGhhZCBiZXR0ZXIgYmUgaW4gdGhlIHJpZ2h0CisgICAgIHNlZ21lbnQgb3IgdGhlIC5vcmcgaXMgaWdub3JlZC4KKworICAgICBCU0QgNC4yIEFTIHdhcm5zIGlmIHlvdSB0cnkgdG8gLm9yZyBiYWNrd2FyZHMuIFdlIGNhbm5vdCBiZWNhdXNlCisgICAgIHdlIG5ldmVyIGtub3cgc3ViLXNlZ21lbnQgc2l6ZXMgd2hlbiB3ZSBhcmUgcmVhZGluZyBjb2RlLiAgQlNECisgICAgIHdpbGwgY3Jhc2ggdHJ5aW5nIHRvIGVtaXQgbmVnYXRpdmUgbnVtYmVycyBvZiBmaWxsZXIgYnl0ZXMgaW4KKyAgICAgY2VydGFpbiAub3Jncy4gV2UgZG9uJ3QgY3Jhc2gsIGJ1dCBzZWUgYXMtd3JpdGUgZm9yIHRoYXQgY29kZS4KKworICAgICBEb24ndCBtYWtlIGZyYWcgaWYgbmVlZF9wYXNzXzI9PTEuICAqLworICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICAgICAgdGVtcF9maWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgICAgfQorICBlbHNlCisgICAgdGVtcF9maWxsID0gMDsKKworICBpZiAoIW5lZWRfcGFzc18yKQorICAgIGRvX29yZyAoc2VnbWVudCwgJmV4cCwgdGVtcF9maWxsKTsKKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBzX29yZygpICovCisKKy8qIEhhbmRsZSBwYXJzaW5nIGZvciB0aGUgTVJJIFNFQ1QvU0VDVElPTiBwc2V1ZG8tb3AuICBUaGlzIHNob3VsZCBiZQorICAgY2FsbGVkIGJ5IHRoZSBvYmotZm9ybWF0IHJvdXRpbmUgd2hpY2ggaGFuZGxlcyBzZWN0aW9uIGNoYW5naW5nCisgICB3aGVuIGluIE1SSSBtb2RlLiAgSXQgd2lsbCBjcmVhdGUgYSBuZXcgc2VjdGlvbiwgYW5kIHJldHVybiBpdC4gIEl0CisgICB3aWxsIHNldCAqVFlQRSB0byB0aGUgc2VjdGlvbiB0eXBlOiBvbmUgb2YgJ0MnIChjb2RlKSwgJ0QnIChkYXRhKSwKKyAgICdNJyAobWl4ZWQpLCBvciAnUicgKHJvbWFibGUpLiAgSWYgQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLCB0aGUKKyAgIGZsYWdzIHdpbGwgYmUgc2V0IGluIHRoZSBzZWN0aW9uLiAgKi8KKwordm9pZAorc19tcmlfc2VjdCAodHlwZSkKKyAgICAgY2hhciAqdHlwZTsKK3sKKyNpZmRlZiBUQ19NNjhLCisKKyAgY2hhciAqbmFtZTsKKyAgY2hhciBjOworICBzZWdUIHNlZzsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIAorICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOworICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKm5hbWUpKQorICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRvCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJfQorICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSk7CisgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOworICAgIH0KKworICBuYW1lID0geHN0cmR1cCAobmFtZSk7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQorICAgIHsKKyAgICAgIGludCBhbGlnbjsKKworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbik7CisgICAgfQorCisgICp0eXBlID0gJ0MnOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgeworICAgICAgYyA9ICorK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgYyk7CisgICAgICBpZiAoYyA9PSAnQycgfHwgYyA9PSAnRCcgfHwgYyA9PSAnTScgfHwgYyA9PSAnUicpCisJKnR5cGUgPSBjOworICAgICAgZWxzZQorCWFzX2JhZCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIpKTsKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgeworCWZsYWd3b3JkIGZsYWdzOworCisJZmxhZ3MgPSBTRUNfTk9fRkxBR1M7CisJaWYgKCp0eXBlID09ICdDJykKKwkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERTsKKwllbHNlIGlmICgqdHlwZSA9PSAnRCcgfHwgKnR5cGUgPT0gJ00nKQorCSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBOworCWVsc2UgaWYgKCp0eXBlID09ICdSJykKKwkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19SRUFET05MWSB8IFNFQ19ST007CisJaWYgKGZsYWdzICE9IFNFQ19OT19GTEFHUykKKwkgIHsKKwkgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywgZmxhZ3MpKQorCSAgICAgIGFzX3dhcm4gKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKKwkJICAgICAgIGJmZF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgc2VnKSwKKwkJICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAvKiBJZ25vcmUgdGhlIEhQIHR5cGUuICAqLworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKworI2Vsc2UgLyogISBUQ19NNjhLICovCisjaWZkZWYgVENfSTk2MAorCisgIGNoYXIgKm5hbWU7CisgIGNoYXIgYzsKKyAgc2VnVCBzZWc7CisKKyAgU0tJUF9XSElURVNQQUNFICgpOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKworICBuYW1lID0geHN0cmR1cCAobmFtZSk7CisKKyAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisKKyAgc2VnID0gc3Vic2VnX25ldyAobmFtZSwgMCk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgICp0eXBlID0gJ0MnOworICBlbHNlCisgICAgeworICAgICAgY2hhciAqc2VjdHlwZTsKKworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBzZWN0eXBlID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAgICAgaWYgKCpzZWN0eXBlID09ICdcMCcpCisJKnR5cGUgPSAnQyc7CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAidGV4dCIpID09IDApCisJKnR5cGUgPSAnQyc7CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAiZGF0YSIpID09IDApCisJKnR5cGUgPSAnRCc7CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWN0eXBlLCAicm9tZGF0YSIpID09IDApCisJKnR5cGUgPSAnUic7CisgICAgICBlbHNlCisJYXNfd2FybiAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSBgJXMnIiksIHNlY3R5cGUpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisgICAgfQorCisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICBjaGFyICpzZWNjbWQ7CisKKyAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgc2VjY21kID0gaW5wdXRfbGluZV9wb2ludGVyOworICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOworICAgICAgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFic29sdXRlIikgPT0gMCkKKwl7CisJICBhc19iYWQgKF8oImFic29sdXRlIHNlY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIikpOworCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHNlY2NtZCwgImFsaWduIikgPT0gMCkKKwl7CisJICBpbnQgYWxpZ247CisKKwkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKwkgIHJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgc2VjdGlvbiBjb21tYW5kIGAlcyciKSwgc2VjY21kKTsKKwkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOworCX0KKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsJICAKKworI2Vsc2UgLyogISBUQ19JOTYwICovCisgIC8qIFRoZSBNUkkgYXNzZW1ibGVyIHNlZW1zIHRvIHVzZSBkaWZmZXJlbnQgZm9ybXMgb2YgLnNlY3QgZm9yCisgICAgIGRpZmZlcmVudCB0YXJnZXRzLiAgKi8KKyAgYXNfYmFkICgiTVJJIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKKyAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyNlbmRpZiAvKiAhIFRDX0k5NjAgKi8KKyNlbmRpZiAvKiAhIFRDX002OEsgKi8KK30KKworLyogSGFuZGxlIHRoZSAucHJpbnQgcHNldWRvLW9wLiAgKi8KKwordm9pZAorc19wcmludCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpzOworICBpbnQgbGVuOworCisgIHMgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7CisgIHByaW50ZiAoIiVzXG4iLCBzKTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAucHVyZ2VtIHBzZXVkby1vcC4gICovCisKK3ZvaWQKK3NfcHVyZ2VtIChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQorICAgIHsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGRvCisgICAgeworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIGNoYXIgYzsKKworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgICAgIGRlbGV0ZV9tYWNybyAobmFtZSk7CisgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICB9CisgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKKworICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogSGFuZGxlIHRoZSAucmVwdCBwc2V1ZG8tb3AuICAqLworCit2b2lkCitzX3JlcHQgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgaW50IGNvdW50OworICBzYiBvbmU7CisgIHNiIG1hbnk7CisKKyAgY291bnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKworICBzYl9uZXcgKCZvbmUpOworICBpZiAoISBidWZmZXJfYW5kX25lc3QgKCJSRVBUIiwgIkVORFIiLCAmb25lLCBnZXRfbGluZV9zYikpCisgICAgeworICAgICAgYXNfYmFkIChfKCJyZXB0IHdpdGhvdXQgZW5kciIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc2JfbmV3ICgmbWFueSk7CisgIHdoaWxlIChjb3VudC0tID4gMCkKKyAgICBzYl9hZGRfc2IgKCZtYW55LCAmb25lKTsKKworICBzYl9raWxsICgmb25lKTsKKworICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmbWFueSwgaW5wdXRfbGluZV9wb2ludGVyKTsKKyAgc2Jfa2lsbCAoJm1hbnkpOworICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Cit9CisKKy8qIEhhbmRsZSB0aGUgLmVxdSwgLmVxdWl2IGFuZCAuc2V0IGRpcmVjdGl2ZXMuICBJZiBFUVVJViBpcyAxLCB0aGVuCisgICB0aGlzIGlzIC5lcXVpdiwgYW5kIGl0IGlzIGFuIGVycm9yIGlmIHRoZSBzeW1ib2wgaXMgYWxyZWFkeQorICAgZGVmaW5lZC4gICovCisKK3ZvaWQgCitzX3NldCAoZXF1aXYpCisgICAgIGludCBlcXVpdjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKKyAgcmVnaXN0ZXIgY2hhciBkZWxpbTsKKyAgcmVnaXN0ZXIgY2hhciAqZW5kX25hbWU7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgLyoKKyAgICogRXNwZWNpYWwgYXBvbG9naWVzIGZvciB0aGUgcmFuZG9tIGxvZ2ljOgorICAgKiB0aGlzIGp1c3QgZ3JldywgYW5kIGNvdWxkIGJlIHBhcnNlZCBtdWNoIG1vcmUgc2ltcGx5IQorICAgKiBEZWFuIGluIGhhc3RlLgorICAgKi8KKyAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgZGVsaW0gPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgZW5kX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgICplbmRfbmFtZSA9IGRlbGltOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgICplbmRfbmFtZSA9IDA7CisgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOworICAgICAgKmVuZF9uYW1lID0gZGVsaW07CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgKmVuZF9uYW1lID0gMDsKKworICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIC8qIFR1cm4gJy4gPSBtdW1ibGUnIGludG8gYSAub3JnIG11bWJsZSAqLworICAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OworICAgICAgZXhwcmVzc2lvblMgZXhwOworCisgICAgICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKKworICAgICAgaWYgKCFuZWVkX3Bhc3NfMikKKwlkb19vcmcgKHNlZ21lbnQsICZleHAsIDApOworCisgICAgICAqZW5kX25hbWUgPSBkZWxpbTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCisgICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQorICAgIHsKKyNpZm5kZWYgTk9fTElTVElORworICAgICAgLyogV2hlbiBkb2luZyBzeW1ib2wgbGlzdGluZ3MsIHBsYXkgZ2FtZXMgd2l0aCBkdW1teSBmcmFnbWVudHMgbGl2aW5nCisJIG91dHNpZGUgdGhlIG5vcm1hbCBmcmFnbWVudCBjaGFpbiB0byByZWNvcmQgdGhlIGZpbGUgYW5kIGxpbmUgaW5mbworICAgICAgICAgZm9yIHRoaXMgc3ltYm9sLiAgKi8KKyAgICAgIGlmIChsaXN0aW5nICYgTElTVElOR19TWU1CT0xTKQorCXsKKwkgIGV4dGVybiBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGlzdGluZ190YWlsOworCSAgZnJhZ1MgKmR1bW15X2ZyYWcgPSAoZnJhZ1MgKikgeG1hbGxvYyAoc2l6ZW9mKGZyYWdTKSk7CisJICBtZW1zZXQgKGR1bW15X2ZyYWcsIDAsIHNpemVvZihmcmFnUykpOworCSAgZHVtbXlfZnJhZy0+ZnJfdHlwZSA9IHJzX2ZpbGw7CisJICBkdW1teV9mcmFnLT5saW5lID0gbGlzdGluZ190YWlsOworCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCBkdW1teV9mcmFnKTsKKwkgIGR1bW15X2ZyYWctPmZyX3N5bWJvbCA9IHN5bWJvbFA7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKKwkJCSAgICAKKyNpZmRlZiBPQkpfQ09GRgorICAgICAgLyogInNldCIgc3ltYm9scyBhcmUgbG9jYWwgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuICovCisgICAgICBTRl9TRVRfTE9DQUwgKHN5bWJvbFApOworI2VuZGlmIC8qIE9CSl9DT0ZGICovCisKKyAgICB9CQkJCS8qIG1ha2UgYSBuZXcgc3ltYm9sICovCisKKyAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7CisKKyAgKmVuZF9uYW1lID0gZGVsaW07CisKKyAgaWYgKGVxdWl2CisgICAgICAmJiBTX0lTX0RFRklORUQgKHN5bWJvbFApCisgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSAhPSByZWdfc2VjdGlvbikKKyAgICBhc19iYWQgKF8oInN5bWJvbCBgJXMnIGFscmVhZHkgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisKKyAgcHNldWRvX3NldCAoc3ltYm9sUCk7CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Cit9CQkJCS8qIHNfc2V0KCkgKi8KKwordm9pZCAKK3Nfc3BhY2UgKG11bHQpCisgICAgIGludCBtdWx0OworeworICBleHByZXNzaW9uUyBleHA7CisgIGV4cHJlc3Npb25TIHZhbDsKKyAgY2hhciAqcCA9IDA7CisgIGNoYXIgKnN0b3AgPSBOVUxMOworICBjaGFyIHN0b3BjOworICBpbnQgYnl0ZXM7CisKKyNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAorICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKKyNlbmRpZgorCisgIGlmIChmbGFnX21yaSkKKyAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7CisKKyAgLyogSW4gbTY4ayBNUkkgbW9kZSwgd2UgbmVlZCB0byBhbGlnbiB0byBhIHdvcmQgYm91bmRhcnksIHVubGVzcworICAgICB0aGlzIGlzIGRzLmIuICAqLworICBpZiAoZmxhZ19tNjhrX21yaSAmJiBtdWx0ID4gMSkKKyAgICB7CisgICAgICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorCXsKKwkgIGFic19zZWN0aW9uX29mZnNldCArPSBhYnNfc2VjdGlvbl9vZmZzZXQgJiAxOworCSAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKKwkgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGFic19zZWN0aW9uX29mZnNldCk7CisJfQorICAgICAgZWxzZSBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKKwl7CisJICB2YWx1ZVQgdmFsOworCisJICB2YWwgPSBTX0dFVF9WQUxVRSAobXJpX2NvbW1vbl9zeW1ib2wpOworCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQorCSAgICB7CisJICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLCB2YWwgKyAxKTsKKwkgICAgICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQorCQl7CisJCSAga25vdyAobGluZV9sYWJlbC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbCk7CisJCSAga25vdyAobGluZV9sYWJlbC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sID09IG1yaV9jb21tb25fc3ltYm9sKTsKKwkJICBsaW5lX2xhYmVsLT5zeV92YWx1ZS5YX2FkZF9udW1iZXIgKz0gMTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRvX2FsaWduICgxLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKKwkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBsaW5lX2xhYmVsLT5zeV9mcmFnID0gZnJhZ19ub3c7CisJICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7CisJICAgIH0KKwl9CisgICAgfQorCisgIGJ5dGVzID0gbXVsdDsKKworICBleHByZXNzaW9uICgmZXhwKTsKKworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGV4cHJlc3Npb24gKCZ2YWwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHZhbC5YX29wID0gT19jb25zdGFudDsKKyAgICAgIHZhbC5YX2FkZF9udW1iZXIgPSAwOworICAgIH0KKworICBpZiAodmFsLlhfb3AgIT0gT19jb25zdGFudAorICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA8IC0gMHg4MAorICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA+IDB4ZmYKKyAgICAgIHx8IChtdWx0ICE9IDAgJiYgbXVsdCAhPSAxICYmIHZhbC5YX2FkZF9udW1iZXIgIT0gMCkpCisgICAgeworICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCisJYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB2YXJpYWJsZSBzaXplIG9yIGZpbGwgdmFsdWUiKSk7CisgICAgICBlbHNlCisJeworCSAgb2Zmc2V0VCBpOworCisJICBpZiAobXVsdCA9PSAwKQorCSAgICBtdWx0ID0gMTsKKwkgIGJ5dGVzID0gbXVsdCAqIGV4cC5YX2FkZF9udW1iZXI7CisJICBmb3IgKGkgPSAwOyBpIDwgZXhwLlhfYWRkX251bWJlcjsgaSsrKQorCSAgICBlbWl0X2V4cHIgKCZ2YWwsIG11bHQpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKKwl7CisJICBsb25nIHJlcGVhdDsKKworCSAgcmVwZWF0ID0gZXhwLlhfYWRkX251bWJlcjsKKwkgIGlmIChtdWx0KQorCSAgICByZXBlYXQgKj0gbXVsdDsKKwkgIGJ5dGVzID0gcmVwZWF0OworCSAgaWYgKHJlcGVhdCA8PSAwKQorCSAgICB7CisJICAgICAgaWYgKCEgZmxhZ19tcmkpCisJCWFzX3dhcm4gKF8oIi5zcGFjZSByZXBlYXQgY291bnQgaXMgemVybywgaWdub3JlZCIpKTsKKwkgICAgICBlbHNlIGlmIChyZXBlYXQgPCAwKQorCQlhc193YXJuIChfKCIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLCBpZ25vcmVkIikpOworCSAgICAgIGdvdG8gZ2V0b3V0OworCSAgICB9CisKKwkgIC8qIElmIHdlIGFyZSBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwganVzdCBidW1wIHRoZSBvZmZzZXQuICAqLworCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwkgICAgeworCSAgICAgIGFic19zZWN0aW9uX29mZnNldCArPSByZXBlYXQ7CisJICAgICAgZ290byBnZXRvdXQ7CisJICAgIH0KKworCSAgLyogSWYgd2UgYXJlIHNlY3JldGx5IGluIGFuIE1SSSBjb21tb24gc2VjdGlvbiwgdGhlbgorCSAgICAgY3JlYXRpbmcgc3BhY2UganVzdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGNvbW1vbgorCSAgICAgc3ltYm9sLiAgKi8KKwkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLAorCQkJICAgU19HRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sKSArIHJlcGVhdCk7CisJICAgICAgZ290byBnZXRvdXQ7CisJICAgIH0KKworCSAgaWYgKCFuZWVkX3Bhc3NfMikKKwkgICAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLAorCQkJICAob2Zmc2V0VCkgcmVwZWF0LCAoY2hhciAqKSAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOworCSAgICAgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7CisJICAgIH0KKwkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYXNfYmFkIChfKCJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGNvbW1vbiBzZWN0aW9uIikpOworCSAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKKwkgICAgfQorCSAgaWYgKCFuZWVkX3Bhc3NfMikKKwkgICAgcCA9IGZyYWdfdmFyIChyc19zcGFjZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKKwkJCSAgbWFrZV9leHByX3N5bWJvbCAoJmV4cCksIChvZmZzZXRUKSAwLCAoY2hhciAqKSAwKTsKKwl9CisKKyAgICAgIGlmIChwKQorCSpwID0gdmFsLlhfYWRkX251bWJlcjsKKyAgICB9CisKKyBnZXRvdXQ6CisKKyAgLyogSW4gTVJJIG1vZGUsIGFmdGVyIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlIG11c3QgYWxpZ24gdG8gYW4KKyAgICAgZXZlbiB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBkYy5iLCBkcy5iCisgICAgIG9yIGRjYi5iLiAgKi8KKyAgaWYgKGZsYWdfbXJpICYmIChieXRlcyAmIDEpICE9IDApCisgICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOworCisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOworfQorCisvKiBUaGlzIGlzIGxpa2Ugc19zcGFjZSwgYnV0IHRoZSB2YWx1ZSBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoCisgICB0aGUgZ2l2ZW4gcHJlY2lzaW9uLiAgVGhpcyBpcyBmb3IgdGhlIE1SSSBkY2IucyBwc2V1ZG8tb3AgYW5kCisgICBmcmllbmRzLiAgKi8KKwordm9pZAorc19mbG9hdF9zcGFjZSAoZmxvYXRfdHlwZSkKKyAgICAgaW50IGZsb2F0X3R5cGU7Cit7CisgIG9mZnNldFQgY291bnQ7CisgIGludCBmbGVuOworICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKworICBjb3VudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKKyAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisgICAgICBpZiAoZmxhZ19tcmkpCisJbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICsraW5wdXRfbGluZV9wb2ludGVyOworCisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKworICAvKiBTa2lwIGFueSAwe2xldHRlcn0gdGhhdCBtYXkgYmUgcHJlc2VudC4gIERvbid0IGV2ZW4gY2hlY2sgaWYgdGhlCisgICAqIGxldHRlciBpcyBsZWdhbC4gICovCisgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCisgICAgICAmJiBpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKKworICAvKiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMsIGZvciBhIGZsb2F0aW5nIHBvaW50CisgICAgIHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLworICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICc6JykKKyAgICB7CisgICAgICBmbGVuID0gaGV4X2Zsb2F0IChmbG9hdF90eXBlLCB0ZW1wKTsKKyAgICAgIGlmIChmbGVuIDwgMCkKKwl7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgaWYgKGZsYWdfbXJpKQorCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqZXJyOworCisgICAgICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmZmxlbik7CisgICAgICBrbm93IChmbGVuIDw9IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCk7CisgICAgICBrbm93IChmbGVuID4gMCk7CisgICAgICBpZiAoZXJyKQorCXsKKwkgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIiksIGVycik7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgaWYgKGZsYWdfbXJpKQorCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIHdoaWxlICgtLWNvdW50ID49IDApCisgICAgeworICAgICAgY2hhciAqcDsKKworICAgICAgcCA9IGZyYWdfbW9yZSAoZmxlbik7CisgICAgICBtZW1jcHkgKHAsIHRlbXAsICh1bnNpZ25lZCBpbnQpIGZsZW4pOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisgIGlmIChmbGFnX21yaSkKKyAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKK30KKworLyogSGFuZGxlIHRoZSAuc3RydWN0IHBzZXVkby1vcCwgYXMgZm91bmQgaW4gTUlQUyBhc3NlbWJsZXJzLiAgKi8KKwordm9pZAorc19zdHJ1Y3QgKGlnbm9yZSkKKyAgICAgaW50IGlnbm9yZTsKK3sKKyAgY2hhciAqc3RvcCA9IE5VTEw7CisgIGNoYXIgc3RvcGM7CisKKyAgaWYgKGZsYWdfbXJpKQorICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKKyAgYWJzX3NlY3Rpb25fb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHN1YnNlZ19zZXQgKGFic29sdXRlX3NlY3Rpb24sIDApOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworICBpZiAoZmxhZ19tcmkpCisgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Cit9CisKK3ZvaWQKK3NfdGV4dCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICByZWdpc3RlciBpbnQgdGVtcDsKKworICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworI2lmZGVmIE9CSl9WTVMKKyAgY29uc3RfZmxhZyAmPSB+SU5fREVGQVVMVF9TRUNUSU9OOworI2VuZGlmCit9CQkJCS8qIHNfdGV4dCgpICovCisMCisKK3ZvaWQgCitkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpCit7CisgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgIH0KKyAgLyogUmV0dXJuIGhhdmluZyBhbHJlYWR5IHN3YWxsb3dlZCBlbmQtb2YtbGluZS4gKi8KK30JCQkJLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCisKK3ZvaWQKK2lnbm9yZV9yZXN0X29mX2xpbmUgKCkJCS8qIEZvciBzdXNwZWN0IGxpbmVzOiBnaXZlcyB3YXJuaW5nLiAqLworeworICBpZiAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICBpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQorCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIGlzIGAlYycuIiksCisJCSppbnB1dF9saW5lX3BvaW50ZXIpOworICAgICAgZWxzZQorCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIHZhbHVlZCAweCV4LiIpLAorCQkqaW5wdXRfbGluZV9wb2ludGVyKTsKKyAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKKwkgICAgICYmICFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJfQorICAgIH0KKyAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KKyAga25vdyAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKTsKK30KKwordm9pZAorZGlzY2FyZF9yZXN0X29mX2xpbmUgKCkKK3sKKyAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAorICAgICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICB9CisgIGlucHV0X2xpbmVfcG9pbnRlcisrOyAgICAgICAgIC8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLworICBrbm93IChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWy0xXV0pOworfQorCisvKgorICoJCQlwc2V1ZG9fc2V0KCkKKyAqCisgKiBJbjoJUG9pbnRlciB0byBhIHN5bWJvbC4KKyAqCUlucHV0X2xpbmVfcG9pbnRlci0+ZXhwcmVzc2lvbi4KKyAqCisgKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+anVzdCBhZnRlciBhbnkgd2hpdGVzcGFjZSBhZnRlciBleHByZXNzaW9uLgorICoJVHJpZWQgdG8gc2V0IHN5bWJvbCB0byB2YWx1ZSBvZiBleHByZXNzaW9uLgorICoJV2lsbCBjaGFuZ2Ugc3ltYm9scyB0eXBlLCB2YWx1ZSwgYW5kIGZyYWc7CisgKi8KK3ZvaWQKK3BzZXVkb19zZXQgKHN5bWJvbFApCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7Cit7CisgIGV4cHJlc3Npb25TIGV4cDsKKyNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQorICBpbnQgZXh0OworI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCisKKyAga25vdyAoc3ltYm9sUCk7CQkvKiBOVUxMIHBvaW50ZXIgaXMgbG9naWMgZXJyb3IuICovCisjaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKKyAgZXh0ID0gU19JU19FWFRFUk5BTCAoc3ltYm9sUCk7CisjZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KKworICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7CisKKyAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKKyAgICBhc19iYWQgKF8oImlsbGVnYWwgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOworICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKKyAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOworICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2JpZykKKyAgICB7CisgICAgICBpZiAoZXhwLlhfYWRkX251bWJlciA+IDApCisJYXNfYmFkIChfKCJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIikpOworICAgICAgZWxzZQorCWFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKKyAgICB9CisgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fc3VidHJhY3QKKwkgICAmJiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkKKwkgICAgICAgPT0gU19HRVRfU0VHTUVOVCAoZXhwLlhfb3Bfc3ltYm9sKSkKKwkgICAmJiBTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSkKKwkgICAmJiBleHAuWF9hZGRfc3ltYm9sLT5zeV9mcmFnID09IGV4cC5YX29wX3N5bWJvbC0+c3lfZnJhZykKKyAgICB7CisgICAgICBleHAuWF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBleHAuWF9hZGRfbnVtYmVyID0gKFNfR0VUX1ZBTFVFIChleHAuWF9hZGRfc3ltYm9sKQorCQkJICAtIFNfR0VUX1ZBTFVFIChleHAuWF9vcF9zeW1ib2wpKTsKKyAgICB9CisKKyAgc3dpdGNoIChleHAuWF9vcCkKKyAgICB7CisgICAgY2FzZSBPX2lsbGVnYWw6CisgICAgY2FzZSBPX2Fic2VudDoKKyAgICBjYXNlIE9fYmlnOgorICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgT19jb25zdGFudDoKKyAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGFic29sdXRlX3NlY3Rpb24pOworI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCisgICAgICBpZiAoZXh0KQorCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKKyAgICAgIGVsc2UKKwlTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKKyNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLworICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOworICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCisgICAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT19yZWdpc3RlcjoKKyAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHJlZ19zZWN0aW9uKTsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBleHAuWF9hZGRfbnVtYmVyKTsKKyAgICAgIHN5bWJvbFAtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT19zeW1ib2w6CisgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KKwkgIHx8IGV4cC5YX2FkZF9udW1iZXIgIT0gMCkKKwlzeW1ib2xQLT5zeV92YWx1ZSA9IGV4cDsKKyAgICAgIGVsc2UKKwl7CisJICBzeW1ib2xTICpzID0gZXhwLlhfYWRkX3N5bWJvbDsKKworCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU19HRVRfU0VHTUVOVCAocykpOworI2lmIChkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCisJICBpZiAoZXh0KQorCSAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7CisJICBlbHNlCisJICAgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOworI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCisJICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwKKwkJICAgICAgIGV4cC5YX2FkZF9udW1iZXIgKyBTX0dFVF9WQUxVRSAocykpOworCSAgc3ltYm9sUC0+c3lfZnJhZyA9IHMtPnN5X2ZyYWc7CisJICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1ib2xQLCBzKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBUaGUgdmFsdWUgaXMgc29tZSBjb21wbGV4IGV4cHJlc3Npb24uCisJIEZJWE1FOiBTaG91bGQgd2Ugc2V0IHRoZSBzZWdtZW50IHRvIGFueXRoaW5nPyAgKi8KKyAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlID0gZXhwOworICAgICAgYnJlYWs7CisgICAgfQorfQorDAorLyoKKyAqCQkJY29ucygpCisgKgorICogQ09OU3RydWN0IG1vcmUgZnJhZyBvZiAuYnl0ZXMsIG9yIC53b3JkcyBldGMuCisgKiBTaG91bGQgbmVlZF9wYXNzXzIgYmUgMSB0aGVuIGVtaXQgbm8gZnJhZyhzKS4KKyAqIFRoaXMgdW5kZXJzdGFuZHMgRVhQUkVTU0lPTlMuCisgKgorICogQnVnICg/KQorICoKKyAqIFRoaXMgaGFzIGEgc3BsaXQgcGVyc29uYWxpdHkuIFdlIHVzZSBleHByZXNzaW9uKCkgdG8gcmVhZCB0aGUKKyAqIHZhbHVlLiBXZSBjYW4gZGV0ZWN0IGlmIHRoZSB2YWx1ZSB3b24ndCBmaXQgaW4gYSBieXRlIG9yIHdvcmQuCisgKiBCdXQgd2UgY2FuJ3QgZGV0ZWN0IGlmIGV4cHJlc3Npb24oKSBkaXNjYXJkZWQgc2lnbmlmaWNhbnQgZGlnaXRzCisgKiBpbiB0aGUgY2FzZSBvZiBhIGxvbmcuIE5vdCB3b3J0aCB0aGUgY3JvY2tzIHJlcXVpcmVkIHRvIGZpeCBpdC4KKyAqLworCisvKiBTZWxlY3QgYSBwYXJzZXIgZm9yIGNvbnMgZXhwcmVzc2lvbnMuICAqLworCisvKiBTb21lIHRhcmdldHMgbmVlZCB0byBwYXJzZSB0aGUgZXhwcmVzc2lvbiBpbiB2YXJpb3VzIGZhbmN5IHdheXMuCisgICBZb3UgY2FuIGRlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gdG8gZG8gd2hhdGV2ZXIgeW91IGxpa2UKKyAgIChmb3IgZXhhbXBsZSwgdGhlIEhQUEEgZG9lcyB0aGlzKS4gIE90aGVyd2lzZSwgeW91IGNhbiBkZWZpbmUKKyAgIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgdG8gcGVybWl0IGJpdGZpZWxkcyB0byBiZSBzcGVjaWZpZWQsIG9yCisgICBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyB0byBwZXJtaXQgcmVwZWF0IGNvdW50cy4gIElmIG5vbmUgb2YgdGhlc2UKKyAgIGFyZSBkZWZpbmVkLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZW4gb25seSBzaW1wbGUgZXhwcmVzc2lvbnMKKyAgIGFyZSBwZXJtaXR0ZWQuICAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfbXJpX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOworCisjaWZuZGVmIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgorI2lmZGVmIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKKyNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9iaXRmaWVsZF9jb25zIChFWFAsIE5CWVRFUykKK3N0YXRpYyB2b2lkIAorcGFyc2VfYml0ZmllbGRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7CisjZW5kaWYKKyNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUworI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX3JlcGVhdF9jb25zIChFWFAsIE5CWVRFUykKK3N0YXRpYyB2b2lkCitwYXJzZV9yZXBlYXRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7CisjZW5kaWYKKworLyogSWYgd2UgaGF2ZW4ndCBnb3R0ZW4gb25lIHlldCwganVzdCBjYWxsIGV4cHJlc3Npb24uICAqLworI2lmbmRlZiBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KKyNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBleHByZXNzaW9uIChFWFApCisjZW5kaWYKKyNlbmRpZgorCisvKiB3b3JrZXIgdG8gZG8gLmJ5dGUgZXRjIHN0YXRlbWVudHMgKi8KKy8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzICovCisvKiBlbmQtb2YtbGluZS4gKi8KK3N0YXRpYyB2b2lkIAorY29uc193b3JrZXIgKG5ieXRlcywgcnZhKQorICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCisgICAgIGludCBydmE7Cit7CisgIGludCBjOworICBleHByZXNzaW9uUyBleHA7CisgIGNoYXIgKnN0b3AgPSBOVUxMOworICBjaGFyIHN0b3BjOworCisjaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKKyAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICBpZiAoZmxhZ19tcmkpCisgICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOworCisgIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQorICAgIHsKKyAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgICAgICBpZiAoZmxhZ19tcmkpCisJbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgbWRfY29uc19hbGlnbgorICBtZF9jb25zX2FsaWduIChuYnl0ZXMpOworI2VuZGlmCisKKyAgYyA9IDA7CisgIGRvCisgICAgeworICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCisJcGFyc2VfbXJpX2NvbnMgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7CisgICAgICBlbHNlCisJVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOworCisgICAgICBpZiAocnZhKQorCXsKKwkgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbCkKKwkgICAgZXhwLlhfb3AgPSBPX3N5bWJvbF9ydmE7CisJICBlbHNlCisJICAgIGFzX2ZhdGFsIChfKCJydmEgd2l0aG91dCBzeW1ib2wiKSk7CisJfQorICAgICAgZW1pdF9leHByICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOworICAgICAgKytjOworICAgIH0KKyAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOworCisgIC8qIEluIE1SSSBtb2RlLCBhZnRlciBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZSBtdXN0IGFsaWduIHRvIGFuCisgICAgIGV2ZW4gd29yZCBib3VuZGFyeSwgdW5sZXNzIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgZGMuYiwgZHMuYgorICAgICBvciBkY2IuYi4gICovCisgIGlmIChmbGFnX21yaSAmJiBuYnl0ZXMgPT0gMSAmJiAoYyAmIDEpICE9IDApCisgICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOworCisgIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCisgIGlmIChmbGFnX21yaSkKKyAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKK30KKworCit2b2lkCitjb25zIChzaXplKQorICAgICBpbnQgc2l6ZTsKK3sKKyAgY29uc193b3JrZXIgKHNpemUsIDApOworfQorCit2b2lkIAorc19ydmEgKHNpemUpCisgICAgIGludCBzaXplOworeworICBjb25zX3dvcmtlciAoc2l6ZSwgMSk7Cit9CisKKy8qIFB1dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbiBFWFAgaW50byB0aGUgb2JqZWN0IGZpbGUgdXNpbmcKKyAgIE5CWVRFUyBieXRlcy4gIElmIG5lZWRfcGFzc18yIGlzIDEsIHRoaXMgZG9lcyBub3RoaW5nLiAgKi8KKwordm9pZAorZW1pdF9leHByIChleHAsIG5ieXRlcykKKyAgICAgZXhwcmVzc2lvblMgKmV4cDsKKyAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKK3sKKyAgb3BlcmF0b3JUIG9wOworICByZWdpc3RlciBjaGFyICpwOworICB2YWx1ZVQgZXh0cmFfZGlnaXQgPSAwOworCisgIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFub3RoZXIgcGFzcy4gICovCisgIGlmIChuZWVkX3Bhc3NfMikKKyAgICByZXR1cm47CisKKyNpZm5kZWYgTk9fTElTVElORworI2lmZGVmIE9CSl9FTEYKKyAgLyogV2hlbiBnY2MgZW1pdHMgRFdBUkYgMSBkZWJ1Z2dpbmcgcHNldWRvLW9wcywgYSBsaW5lIG51bWJlciB3aWxsCisgICAgIGFwcGVhciBhcyBhIGZvdXIgYnl0ZSBwb3NpdGl2ZSBjb25zdGFudCBpbiB0aGUgLmxpbmUgc2VjdGlvbiwKKyAgICAgZm9sbG93ZWQgYnkgYSAyIGJ5dGUgMHhmZmZmLiAgTG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLworICB7CisgICAgc3RhdGljIGludCBkd2FyZl9saW5lID0gLTE7CisKKyAgICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmxpbmUiKSAhPSAwKQorICAgICAgZHdhcmZfbGluZSA9IC0xOworICAgIGVsc2UgaWYgKGR3YXJmX2xpbmUgPj0gMAorCSAgICAgJiYgbmJ5dGVzID09IDIKKwkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50CisJICAgICAmJiAoZXhwLT5YX2FkZF9udW1iZXIgPT0gLTEgfHwgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHhmZmZmKSkKKyAgICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGR3YXJmX2xpbmUpOworICAgIGVsc2UgaWYgKG5ieXRlcyA9PSA0CisJICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAorCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPj0gMCkKKyAgICAgIGR3YXJmX2xpbmUgPSBleHAtPlhfYWRkX251bWJlcjsKKyAgICBlbHNlCisgICAgICBkd2FyZl9saW5lID0gLTE7CisgIH0KKworICAvKiBXaGVuIGdjYyBlbWl0cyBEV0FSRiAxIGRlYnVnZ2luZyBwc2V1ZG8tb3BzLCBhIGZpbGUgbmFtZSB3aWxsCisgICAgIGFwcGVhciBhcyBhIDIgYnl0ZSBUQUdfY29tcGlsZV91bml0ICgweDExKSBmb2xsb3dlZCBieSBhIDIgYnl0ZQorICAgICBBVF9zaWJsaW5nICgweDEyKSBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSBhZGRyZXNzIG9mIHRoZSBzaWJsaW5nCisgICAgIGZvbGxvd2VkIGJ5IGEgMiBieXRlIEFUX25hbWUgKDB4MzgpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZQorICAgICBmaWxlLiAgV2UgbG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLworICB7CisgICAgc3RhdGljIGludCBkd2FyZl9maWxlID0gMDsKKworICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQorICAgICAgZHdhcmZfZmlsZSA9IDA7CisgICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAwCisJICAgICAmJiBuYnl0ZXMgPT0gMgorCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKKwkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MTEpCisgICAgICBkd2FyZl9maWxlID0gMTsKKyAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDEKKwkgICAgICYmIG5ieXRlcyA9PSAyCisJICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAorCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgxMikKKyAgICAgIGR3YXJmX2ZpbGUgPSAyOworICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMgorCSAgICAgJiYgbmJ5dGVzID09IDQpCisgICAgICBkd2FyZl9maWxlID0gMzsKKyAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDMKKwkgICAgICYmIG5ieXRlcyA9PSAyCisJICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAorCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgzOCkKKyAgICAgIGR3YXJmX2ZpbGUgPSA0OworICAgIGVsc2UKKyAgICAgIGR3YXJmX2ZpbGUgPSAwOworCisgICAgLyogVGhlIHZhcmlhYmxlIGR3YXJmX2ZpbGVfc3RyaW5nIHRlbGxzIHN0cmluZ2VyIHRoYXQgdGhlIHN0cmluZworICAgICAgIG1heSBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLworICAgIGlmIChkd2FyZl9maWxlID09IDQpCisgICAgICBkd2FyZl9maWxlX3N0cmluZyA9IDE7CisgICAgZWxzZQorICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAwOworICB9CisjZW5kaWYKKyNlbmRpZgorCisgIGlmIChjaGVja19laF9mcmFtZSAoZXhwLCAmbmJ5dGVzKSkKKyAgICByZXR1cm47CisKKyAgb3AgPSBleHAtPlhfb3A7CisKKyAgLyogQWxsb3cgYC53b3JkIDAnIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KKyAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKyAgICB7CisgICAgICBpZiAob3AgIT0gT19jb25zdGFudCB8fCBleHAtPlhfYWRkX251bWJlciAhPSAwKQorCWFzX2JhZCAoXygiYXR0ZW1wdCB0byBzdG9yZSB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOworICAgICAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IG5ieXRlczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSGFuZGxlIGEgbmVnYXRpdmUgYmlnbnVtLiAgKi8KKyAgaWYgKG9wID09IE9fdW1pbnVzCisgICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAwCisgICAgICAmJiBleHAtPlhfYWRkX3N5bWJvbC0+c3lfdmFsdWUuWF9vcCA9PSBPX2JpZworICAgICAgJiYgZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA+IDApCisgICAgeworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OworCisgICAgICBleHAgPSAmZXhwLT5YX2FkZF9zeW1ib2wtPnN5X3ZhbHVlOworCisgICAgICAvKiBOZWdhdGUgdGhlIGJpZ251bTogb25lJ3MgY29tcGxlbWVudCBlYWNoIGRpZ2l0IGFuZCBhZGQgMS4gICovCisgICAgICBjYXJyeSA9IDE7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwLT5YX2FkZF9udW1iZXI7IGkrKykKKwl7CisJICB1bnNpZ25lZCBsb25nIG5leHQ7CisKKwkgIG5leHQgPSAoKCh+IChnZW5lcmljX2JpZ251bVtpXSAmIExJVFRMRU5VTV9NQVNLKSkKKwkJICAgJiBMSVRUTEVOVU1fTUFTSykKKwkJICArIGNhcnJ5KTsKKwkgIGdlbmVyaWNfYmlnbnVtW2ldID0gbmV4dCAmIExJVFRMRU5VTV9NQVNLOworCSAgY2FycnkgPSBuZXh0ID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKKwl9CisKKyAgICAgIC8qIFdlIGNhbiBpZ25vcmUgYW55IGNhcnJ5IG91dCwgYmVjYXVzZSBpdCB3aWxsIGJlIGhhbmRsZWQgYnkKKwkgZXh0cmFfZGlnaXQgaWYgaXQgaXMgbmVlZGVkLiAgKi8KKworICAgICAgZXh0cmFfZGlnaXQgPSAodmFsdWVUKSAtMTsKKyAgICAgIG9wID0gT19iaWc7CisgICAgfQorCisgIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7CisgICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7CisgICAgICBvcCA9IE9fY29uc3RhbnQ7CisgICAgfQorICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKKyAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIG9wID0gT19jb25zdGFudDsKKyAgICB9CisgIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCisgICAgeworICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOworICAgICAgb3AgPSBPX2NvbnN0YW50OworICAgIH0KKworICBwID0gZnJhZ19tb3JlICgoaW50KSBuYnl0ZXMpOworCisjaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKKyAgLyogSWYgd2UgaGF2ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiBhIHdvcmQsIHNhdmUgaXQgb24KKyAgICAgdGhlIGJyb2tlbl93b3JkcyBsaXN0LiAgU2VlIHRoZSBjb2RlIGluIHdyaXRlLmMuICAqLworICBpZiAob3AgPT0gT19zdWJ0cmFjdCAmJiBuYnl0ZXMgPT0gMikKKyAgICB7CisgICAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKng7CisKKyAgICAgIHggPSAoc3RydWN0IGJyb2tlbl93b3JkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJyb2tlbl93b3JkKSk7CisgICAgICB4LT5uZXh0X2Jyb2tlbl93b3JkID0gYnJva2VuX3dvcmRzOworICAgICAgYnJva2VuX3dvcmRzID0geDsKKyAgICAgIHgtPnNlZyA9IG5vd19zZWc7CisgICAgICB4LT5zdWJzZWcgPSBub3dfc3Vic2VnOworICAgICAgeC0+ZnJhZyA9IGZyYWdfbm93OworICAgICAgeC0+d29yZF9nb2VzX2hlcmUgPSBwOworICAgICAgeC0+ZGlzcGZyYWcgPSAwOworICAgICAgeC0+YWRkID0gZXhwLT5YX2FkZF9zeW1ib2w7CisgICAgICB4LT5zdWIgPSBleHAtPlhfb3Bfc3ltYm9sOworICAgICAgeC0+YWRkbnVtID0gZXhwLT5YX2FkZF9udW1iZXI7CisgICAgICB4LT5hZGRlZCA9IDA7CisgICAgICBuZXdfYnJva2VuX3dvcmRzKys7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgLyogSWYgd2UgaGF2ZSBhbiBpbnRlZ2VyLCBidXQgdGhlIG51bWJlciBvZiBieXRlcyBpcyB0b28gbGFyZ2UgdG8KKyAgICAgcGFzcyB0byBtZF9udW1iZXJfdG9fY2hhcnMsIGhhbmRsZSBpdCBhcyBhIGJpZ251bS4gICovCisgIGlmIChvcCA9PSBPX2NvbnN0YW50ICYmIG5ieXRlcyA+IHNpemVvZiAodmFsdWVUKSkKKyAgICB7CisgICAgICB2YWx1ZVQgdmFsOworICAgICAgaW50IGdlbmNudDsKKworICAgICAgaWYgKCEgZXhwLT5YX3Vuc2lnbmVkICYmIGV4cC0+WF9hZGRfbnVtYmVyIDwgMCkKKwlleHRyYV9kaWdpdCA9ICh2YWx1ZVQpIC0xOworICAgICAgdmFsID0gKHZhbHVlVCkgZXhwLT5YX2FkZF9udW1iZXI7CisgICAgICBnZW5jbnQgPSAwOworICAgICAgZG8KKwl7CisJICBnZW5lcmljX2JpZ251bVtnZW5jbnRdID0gdmFsICYgTElUVExFTlVNX01BU0s7CisJICB2YWwgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKKwkgICsrZ2VuY250OworCX0KKyAgICAgIHdoaWxlICh2YWwgIT0gMCk7CisgICAgICBvcCA9IGV4cC0+WF9vcCA9IE9fYmlnOworICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSBnZW5jbnQ7CisgICAgfQorCisgIGlmIChvcCA9PSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHZhbHVlVCBnZXQ7CisgICAgICByZWdpc3RlciB2YWx1ZVQgdXNlOworICAgICAgcmVnaXN0ZXIgdmFsdWVUIG1hc2s7CisgICAgICB2YWx1ZVQgaGliaXQ7CisgICAgICByZWdpc3RlciB2YWx1ZVQgdW5tYXNrOworCisgICAgICAvKiBKRiA8PCBvZiA+PSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb2JqZWN0IGlzIHVuZGVmaW5lZC4gIEluCisJIHBhcnRpY3VsYXIgU1BBUkMgKFN1biA0KSBoYXMgcHJvYmxlbXMgKi8KKyAgICAgIGlmIChuYnl0ZXMgPj0gc2l6ZW9mICh2YWx1ZVQpKQorCXsKKwkgIG1hc2sgPSAwOworCSAgaWYgKG5ieXRlcyA+IHNpemVvZiAodmFsdWVUKSkKKwkgICAgaGliaXQgPSAwOworCSAgZWxzZQorCSAgICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKG5ieXRlcyAqIEJJVFNfUEVSX0NIQVIgLSAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRG9uJ3Qgc3RvcmUgdGhlc2UgYml0cy4gKi8KKwkgIG1hc2sgPSB+KHZhbHVlVCkgMCA8PCAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcyk7CisJICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKG5ieXRlcyAqIEJJVFNfUEVSX0NIQVIgLSAxKTsKKwl9CisKKyAgICAgIHVubWFzayA9IH5tYXNrOwkJLyogRG8gc3RvcmUgdGhlc2UgYml0cy4gKi8KKworI2lmZGVmIE5FVkVSCisgICAgICAiRG8gdGhpcyBtb2QgaWYgeW91IHdhbnQgZXZlcnkgb3ZlcmZsb3cgY2hlY2sgdG8gYXNzdW1lIFNJR05FRCAyJ3MgY29tcGxlbWVudCBkYXRhLiI7CisgICAgICBtYXNrID0gfih1bm1hc2sgPj4gMSk7CS8qIEluY2x1ZGVzIHNpZ24gYml0IG5vdy4gKi8KKyNlbmRpZgorCisgICAgICBnZXQgPSBleHAtPlhfYWRkX251bWJlcjsKKyAgICAgIHVzZSA9IGdldCAmIHVubWFzazsKKyAgICAgIGlmICgoZ2V0ICYgbWFzaykgIT0gMAorCSAgJiYgKChnZXQgJiBtYXNrKSAhPSBtYXNrCisJICAgICAgfHwgKGdldCAmIGhpYml0KSA9PSAwKSkKKwl7CQkvKiBMZWFkaW5nIGJpdHMgY29udGFpbiBib3RoIDBzICYgMXMuICovCisJICBhc193YXJuIChfKCJWYWx1ZSAweCVseCB0cnVuY2F0ZWQgdG8gMHglbHguIiksCisJCSAgICh1bnNpZ25lZCBsb25nKSBnZXQsICh1bnNpZ25lZCBsb25nKSB1c2UpOworCX0KKyAgICAgIC8qIHB1dCBieXRlcyBpbiByaWdodCBvcmRlci4gKi8KKyAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdXNlLCAoaW50KSBuYnl0ZXMpOworICAgIH0KKyAgZWxzZSBpZiAob3AgPT0gT19iaWcpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgICBMSVRUTEVOVU1fVFlQRSAqbnVtczsKKworICAgICAga25vdyAobmJ5dGVzICUgQ0hBUlNfUEVSX0xJVFRMRU5VTSA9PSAwKTsKKworICAgICAgc2l6ZSA9IGV4cC0+WF9hZGRfbnVtYmVyICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKyAgICAgIGlmIChuYnl0ZXMgPCBzaXplKQorCXsKKwkgIGFzX3dhcm4gKF8oIkJpZ251bSB0cnVuY2F0ZWQgdG8gJWQgYnl0ZXMiKSwgbmJ5dGVzKTsKKwkgIHNpemUgPSBuYnl0ZXM7CisJfQorCisgICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCisJeworCSAgd2hpbGUgKG5ieXRlcyA+IHNpemUpCisJICAgIHsKKwkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGV4dHJhX2RpZ2l0LCBDSEFSU19QRVJfTElUVExFTlVNKTsKKwkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKwkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07CisJICAgIH0KKworCSAgbnVtcyA9IGdlbmVyaWNfYmlnbnVtICsgc2l6ZSAvIENIQVJTX1BFUl9MSVRUTEVOVU07CisJICB3aGlsZSAoc2l6ZSA+IDApCisJICAgIHsKKwkgICAgICAtLW51bXM7CisJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqbnVtcywgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7CisJICAgICAgc2l6ZSAtPSBDSEFSU19QRVJfTElUVExFTlVNOworCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBudW1zID0gZ2VuZXJpY19iaWdudW07CisJICB3aGlsZSAoc2l6ZSA+IDApCisJICAgIHsKKwkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpICpudW1zLCBDSEFSU19QRVJfTElUVExFTlVNKTsKKwkgICAgICArK251bXM7CisJICAgICAgc2l6ZSAtPSBDSEFSU19QRVJfTElUVExFTlVNOworCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKwkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKwkgICAgfQorCisJICB3aGlsZSAobmJ5dGVzID4gMCkKKwkgICAgeworCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgZXh0cmFfZGlnaXQsIENIQVJTX1BFUl9MSVRUTEVOVU0pOworCSAgICAgIG5ieXRlcyAtPSBDSEFSU19QRVJfTElUVExFTlVNOworCSAgICAgIHAgKz0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtZW1zZXQgKHAsIDAsIG5ieXRlcyk7CisKKyAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4UyB0byByZWNvcmQgdGhlIHN5bWJvbCB2YWx1ZS4KKwkgVGhpcyBpcyBlYXN5IGZvciBCRkQuICBGb3Igb3RoZXIgdGFyZ2V0cyBpdCBjYW4gYmUgbW9yZQorCSBjb21wbGV4LiAgRm9yIHZlcnkgY29tcGxleCBjYXNlcyAoY3VycmVudGx5LCB0aGUgSFBQQSBhbmQKKwkgTlMzMkspLCB5b3UgY2FuIGRlZmluZSBUQ19DT05TX0ZJWF9ORVcgdG8gZG8gd2hhdGV2ZXIgeW91CisJIHdhbnQuICBGb3Igc2ltcGxlciBjYXNlcywgeW91IGNhbiBkZWZpbmUgVENfQ09OU19SRUxPQyB0byBiZQorCSB0aGUgbmFtZSBvZiB0aGUgcmVsb2MgY29kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGZpeFMuCisJIElmIG5laXRoZXIgaXMgZGVmaW5lZCwgdGhlIGNvZGUgdXNlcyBOT19SRUxPQyBpZiBpdCBpcworCSBkZWZpbmVkLCBhbmQgb3RoZXJ3aXNlIHVzZXMgMC4gICovCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisjaWZkZWYgVENfQ09OU19GSVhfTkVXCisgICAgICBUQ19DT05TX0ZJWF9ORVcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIG5ieXRlcywgZXhwKTsKKyNlbHNlCisgICAgICB7CisJYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHI7CisKKwlzd2l0Y2ggKG5ieXRlcykKKwkgIHsKKwkgIGNhc2UgMToKKwkgICAgciA9IEJGRF9SRUxPQ184OworCSAgICBicmVhazsKKwkgIGNhc2UgMjoKKwkgICAgciA9IEJGRF9SRUxPQ18xNjsKKwkgICAgYnJlYWs7CisJICBjYXNlIDQ6CisJICAgIHIgPSBCRkRfUkVMT0NfMzI7CisJICAgIGJyZWFrOworCSAgY2FzZSA4OgorCSAgICByID0gQkZEX1JFTE9DXzY0OworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGFzX2JhZCAoXygidW5zdXBwb3J0ZWQgQkZEIHJlbG9jYXRpb24gc2l6ZSAldSIpLCBuYnl0ZXMpOworCSAgICByID0gQkZEX1JFTE9DXzMyOworCSAgICBicmVhazsKKwkgIH0KKwlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgKGludCkgbmJ5dGVzLCBleHAsCisJCSAgICAgMCwgcik7CisgICAgICB9CisjZW5kaWYKKyNlbHNlCisjaWZkZWYgVENfQ09OU19GSVhfTkVXCisgICAgICBUQ19DT05TX0ZJWF9ORVcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIG5ieXRlcywgZXhwKTsKKyNlbHNlCisgICAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIHJlbG9jIG51bWJlciB0byB1c2UuICBVc2UgVENfQ09OU19SRUxPQyBpZgorCSBpdCBpcyBkZWZpbmVkLCBvdGhlcndpc2UgdXNlIE5PX1JFTE9DIGlmIGl0IGlzIGRlZmluZWQsCisJIG90aGVyd2lzZSB1c2UgMC4gICovCisjaWZuZGVmIFRDX0NPTlNfUkVMT0MKKyNpZmRlZiBOT19SRUxPQworI2RlZmluZSBUQ19DT05TX1JFTE9DIE5PX1JFTE9DCisjZWxzZQorI2RlZmluZSBUQ19DT05TX1JFTE9DIDAKKyNlbmRpZgorI2VuZGlmCisgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgKGludCkgbmJ5dGVzLCBleHAsIDAsCisJCSAgIFRDX0NPTlNfUkVMT0MpOworI2VuZGlmIC8qIFRDX0NPTlNfRklYX05FVyAqLworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KKyAgICB9Cit9CisMCisjaWZkZWYgQklURklFTERfQ09OU19FWFBSRVNTSU9OUworCisvKiBpOTYwIGFzc2VtYmxlcnMsIChlZywgYXNtOTYwKSwgYWxsb3cgYml0ZmllbGRzIGFmdGVyICIuYnl0ZSIgYXMKKyAgIHc6eCx5OnosIHdoZXJlIHcgYW5kIHkgYXJlIGJpdHdpZHRocyBhbmQgeCBhbmQgeSBhcmUgdmFsdWVzLiAgVGhleQorICAgdGhlbiBwYWNrIHRoZW0gYWxsIHRvZ2V0aGVyLiBXZSBkbyBhIGxpdHRsZSBiZXR0ZXIgaW4gdGhhdCB3ZSBhbGxvdworICAgdGhlbSBpbiB3b3JkcywgbG9uZ3MsIGV0Yy4gYW5kIHdlJ2xsIHBhY2sgdGhlbSBpbiB0YXJnZXQgYnl0ZSBvcmRlcgorICAgZm9yIHlvdS4KKworICAgVGhlIHJ1bGVzIGFyZTogcGFjayBsZWFzdCBzaWduaWZpY2F0IGJpdCBmaXJzdCwgaWYgYSBmaWVsZCBkb2Vzbid0CisgICBlbnRpcmVseSBmaXQsIHB1dCBpdCBpbiB0aGUgbmV4dCB1bml0LiAgT3ZlcmZsb3dpbmcgdGhlIGJpdGZpZWxkIGlzCisgICBleHBsaWNpdGx5ICpub3QqIGV2ZW4gYSB3YXJuaW5nLiAgVGhlIGJpdHdpZHRoIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICBhICJtYXNrIi4KKworICAgVG8gdXNlIHRoaXMgZnVuY3Rpb24gdGhlIHRjLVhYWC5oIGZpbGUgc2hvdWxkIGRlZmluZQorICAgQklURklFTERfQ09OU19FWFBSRVNTSU9OUy4gICovCisKK3N0YXRpYyB2b2lkIAorcGFyc2VfYml0ZmllbGRfY29ucyAoZXhwLCBuYnl0ZXMpCisgICAgIGV4cHJlc3Npb25TICpleHA7CisgICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Cit7CisgIHVuc2lnbmVkIGludCBiaXRzX2F2YWlsYWJsZSA9IEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXM7CisgIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cCk7CisKKyAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzonKQorICAgIHsJCQkvKiBiaXRmaWVsZHMgKi8KKyAgICAgIGxvbmcgdmFsdWUgPSAwOworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgd2lkdGg7CisKKwkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc6JykKKwkgICAgeworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgYnJlYWs7CisJICAgIH0JCQkvKiBuZXh0IHBpZWNlIGlzIG5vdCBhIGJpdGZpZWxkICovCisKKwkgIC8qIEluIHRoZSBnZW5lcmFsIGNhc2UsIHdlIGNhbid0IGFsbG93CisJICAgICBmdWxsIGV4cHJlc3Npb25zIHdpdGggc3ltYm9sCisJICAgICBkaWZmZXJlbmNlcyBhbmQgc3VjaC4gIFRoZSByZWxvY2F0aW9uCisJICAgICBlbnRyaWVzIGZvciBzeW1ib2xzIG5vdCBkZWZpbmVkIGluIHRoaXMKKwkgICAgIGFzc2VtYmx5IHdvdWxkIHJlcXVpcmUgYXJiaXRyYXJ5IGZpZWxkCisJICAgICB3aWR0aHMsIHBvc2l0aW9ucywgYW5kIG1hc2tzIHdoaWNoIG1vc3QKKwkgICAgIG9mIG91ciBjdXJyZW50IG9iamVjdCBmb3JtYXRzIGRvbid0CisJICAgICBzdXBwb3J0LgorCisJICAgICBJbiB0aGUgc3BlY2lmaWMgY2FzZSB3aGVyZSBhIHN5bWJvbAorCSAgICAgKmlzKiBkZWZpbmVkIGluIHRoaXMgYXNzZW1ibHksIHdlCisJICAgICAqY291bGQqIGJ1aWxkIGZpeHVwcyBhbmQgdHJhY2sgaXQsIGJ1dAorCSAgICAgdGhpcyBjb3VsZCBsZWFkIHRvIGNvbmZ1c2lvbiBmb3IgdGhlCisJICAgICBiYWNrZW5kcy4gIEknbSBsYXp5LiBJJ2xsIHRha2UgYW55CisJICAgICBTRUdfQUJTT0xVVEUuIEkgdGhpbmsgdGhhdCBtZWFucyB0aGF0CisJICAgICB5b3UgY2FuIHVzZSBhIHByZXZpb3VzIC5zZXQgb3IKKwkgICAgIC5lcXUgdHlwZSBzeW1ib2wuICB4b3hvcmljaC4gKi8KKworCSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCkKKwkgICAgeworCSAgICAgIGFzX3dhcm4gKF8oInVzaW5nIGEgYml0IGZpZWxkIHdpZHRoIG9mIHplcm8iKSk7CisJICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOworCSAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7CisJICAgIH0JCQkvKiBpbXBsaWVkIHplcm8gd2lkdGggYml0ZmllbGQgKi8KKworCSAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7CisJICAgICAgYXNfYmFkIChfKCJmaWVsZCB3aWR0aCBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiKSwgaG9sZCk7CisJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICc6JzsKKwkgICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworCSAgICAgIHJldHVybjsKKwkgICAgfQkJCS8qIHRvbyBjb21wbGV4ICovCisKKwkgIGlmICgod2lkdGggPSBleHAtPlhfYWRkX251bWJlcikgPiAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykpCisJICAgIHsKKwkgICAgICBhc193YXJuIChfKCJmaWVsZCB3aWR0aCAlbHUgdG9vIGJpZyB0byBmaXQgaW4gJWQgYnl0ZXM6IHRydW5jYXRlZCB0byAlZCBiaXRzIiksCisJCSAgICAgICB3aWR0aCwgbmJ5dGVzLCAoQklUU19QRVJfQ0hBUiAqIG5ieXRlcykpOworCSAgICAgIHdpZHRoID0gQklUU19QRVJfQ0hBUiAqIG5ieXRlczsKKwkgICAgfQkJCS8qIHRvbyBiaWcgKi8KKworCSAgaWYgKHdpZHRoID4gYml0c19hdmFpbGFibGUpCisJICAgIHsKKwkgICAgICAvKiBGSVhNRS1TT01FREFZOiBiYWNraW5nIHVwIGFuZCByZXBhcnNpbmcgaXMgd2FzdGVmdWwuICAqLworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7CisJICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKKwkgICAgICBicmVhazsKKwkgICAgfQkJCS8qIHdvbid0IGZpdCAqLworCisJICBob2xkID0gKytpbnB1dF9saW5lX3BvaW50ZXI7IC8qIHNraXAgJzonICovCisKKwkgICh2b2lkKSBleHByZXNzaW9uIChleHApOworCSAgaWYgKGV4cC0+WF9vcCAhPSBPX2NvbnN0YW50KQorCSAgICB7CisJICAgICAgY2hhciBjYWNoZSA9ICppbnB1dF9saW5lX3BvaW50ZXI7CisKKwkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKKwkgICAgICBhc19iYWQgKF8oImZpZWxkIHZhbHVlIFwiJXNcIiB0b28gY29tcGxleCBmb3IgYSBiaXRmaWVsZCIpLCBob2xkKTsKKwkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gY2FjaGU7CisJICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0JCQkvKiB0b28gY29tcGxleCAqLworCisJICB2YWx1ZSB8PSAoKH4oLTEgPDwgd2lkdGgpICYgZXhwLT5YX2FkZF9udW1iZXIpCisJCSAgICA8PCAoKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpIC0gYml0c19hdmFpbGFibGUpKTsKKworCSAgaWYgKChiaXRzX2F2YWlsYWJsZSAtPSB3aWR0aCkgPT0gMAorCSAgICAgIHx8IGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKKwkgICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CQkJLyogYWxsIHRoZSBiaXRmaWVsZHMgd2UncmUgZ29ubmEgZ2V0ICovCisKKwkgIGhvbGQgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgICh2b2lkKSBleHByZXNzaW9uIChleHApOworCX0JCQkvKiBmb3JldmVyIGxvb3AgKi8KKworICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKKyAgICAgIGV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBleHAtPlhfdW5zaWduZWQgPSAxOworICAgIH0JCQkJLyogaWYgbG9va3MgbGlrZSBhIGJpdGZpZWxkICovCit9CQkJCS8qIHBhcnNlX2JpdGZpZWxkX2NvbnMoKSAqLworCisjZW5kaWYgLyogQklURklFTERfQ09OU19FWFBSRVNTSU9OUyAqLworDAorLyogSGFuZGxlIGFuIE1SSSBzdHlsZSBzdHJpbmcgZXhwcmVzc2lvbi4gICovCisKK3N0YXRpYyB2b2lkCitwYXJzZV9tcmlfY29ucyAoZXhwLCBuYnl0ZXMpCisgICAgIGV4cHJlc3Npb25TICpleHA7CisgICAgIHVuc2lnbmVkIGludCBuYnl0ZXM7Cit7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycKKyAgICAgICYmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJworCSAgfHwgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ0EnCisJICAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnRScpKSkKKyAgICBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gKGV4cCwgbmJ5dGVzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBzY2FuOworICAgICAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgIC8qIEFuIE1SSSBzdHlsZSBzdHJpbmcuICBDdXQgaW50byBhcyBtYW55IGJ5dGVzIGFzIHdpbGwgZml0IGludG8KKwkgYSBuYnl0ZSBjaHVuaywgbGVmdCBqdXN0aWZ5IGlmIG5lY2Vzc2FyeSwgYW5kIHNlcGFyYXRlIHdpdGgKKwkgY29tbWFzIHNvIHdlIGNhbiB0cnkgYWdhaW4gbGF0ZXIuICAqLworICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0EnKQorCSsraW5wdXRfbGluZV9wb2ludGVyOworICAgICAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnRScpCisJeworCSAgYXNfYmFkIChfKCJFQkNESUMgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkIikpOworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJfQorCisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIGZvciAoc2NhbiA9IDA7IHNjYW4gPCBuYnl0ZXM7IHNjYW4rKykKKwl7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQorCSAgICB7CisJICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXCcnKQorCQl7CisJCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisJICByZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgKCppbnB1dF9saW5lX3BvaW50ZXIrKyk7CisJfQorCisgICAgICAvKiBMZWZ0IGp1c3RpZnkgKi8KKyAgICAgIHdoaWxlIChzY2FuIDwgbmJ5dGVzKQorCXsKKwkgIHJlc3VsdCA8PD0gODsKKwkgIHNjYW4rKzsKKwl9CisgICAgICAvKiBDcmVhdGUgY29ycmVjdCBleHByZXNzaW9uICovCisgICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OworICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSByZXN1bHQ7CisgICAgICAvKiBGYWtlIGl0IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIG5leHQgY2hhciB0b28gKi8KKyAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gIT0gJ1wnJyB8fAorCSAgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnXCcnICYmIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXCcnKSkKKwl7CisJICBpbnB1dF9saW5lX3BvaW50ZXIgLT0gMjsKKwkgIGlucHV0X2xpbmVfcG9pbnRlclswXSA9ICcsJzsKKwkgIGlucHV0X2xpbmVfcG9pbnRlclsxXSA9ICdcJyc7CisJfQorICAgICAgZWxzZQorCWlucHV0X2xpbmVfcG9pbnRlcisrOworICAgIH0KK30KKwwKKyNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUworCisvKiBQYXJzZSBhIHJlcGVhdCBleHByZXNzaW9uIGZvciBjb25zLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBNSVBTCisgICBhc3NlbWJsZXIuICBUaGUgZm9ybWF0IGlzIE5VTUJFUjpDT1VOVDsgTlVNQkVSIGFwcGVhcnMgaW4gdGhlCisgICBvYmplY3QgZmlsZSBDT1VOVCB0aW1lcy4KKworICAgVG8gdXNlIHRoaXMgZm9yIGEgdGFyZ2V0LCBkZWZpbmUgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMuICAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfcmVwZWF0X2NvbnMgKGV4cCwgbmJ5dGVzKQorICAgICBleHByZXNzaW9uUyAqZXhwOworICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOworeworICBleHByZXNzaW9uUyBjb3VudDsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgZXhwcmVzc2lvbiAoZXhwKTsKKworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOicpCisgICAgeworICAgICAgLyogTm8gcmVwZWF0IGNvdW50LiAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgIGV4cHJlc3Npb24gKCZjb3VudCk7CisgIGlmIChjb3VudC5YX29wICE9IE9fY29uc3RhbnQKKyAgICAgIHx8IGNvdW50LlhfYWRkX251bWJlciA8PSAwKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIlVucmVzb2x2YWJsZSBvciBub25wb3NpdGl2ZSByZXBlYXQgY291bnQ7IHVzaW5nIDEiKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoZSBjb25zIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIG91dHB1dCB0aGlzIGV4cHJlc3Npb24gb25jZS4gIFNvIHdlCisgICAgIG91dHB1dCBpdCBjb3VudCAtIDEgdGltZXMuICAqLworICBmb3IgKGkgPSBjb3VudC5YX2FkZF9udW1iZXIgLSAxOyBpID4gMDsgaS0tKQorICAgIGVtaXRfZXhwciAoZXhwLCBuYnl0ZXMpOworfQorCisjZW5kaWYgLyogUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMgKi8KKwwKKy8qIFBhcnNlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudGVkIGFzIGEgaGV4IGNvbnN0YW50LiAgVGhpcworICAgcGVybWl0cyB1c2VycyB0byBzcGVjaWZ5IHRoZSBleGFjdCBiaXRzIHRoZXkgd2FudCBpbiB0aGUgZmxvYXRpbmcKKyAgIHBvaW50IG51bWJlci4gICovCisKK3N0YXRpYyBpbnQKK2hleF9mbG9hdCAoZmxvYXRfdHlwZSwgYnl0ZXMpCisgICAgIGludCBmbG9hdF90eXBlOworICAgICBjaGFyICpieXRlczsKK3sKKyAgaW50IGxlbmd0aDsKKyAgaW50IGk7CisKKyAgc3dpdGNoIChmbG9hdF90eXBlKQorICAgIHsKKyAgICBjYXNlICdmJzoKKyAgICBjYXNlICdGJzoKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdTJzoKKyAgICAgIGxlbmd0aCA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ3InOgorICAgIGNhc2UgJ1InOgorICAgICAgbGVuZ3RoID0gODsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICBsZW5ndGggPSAxMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgY2FzZSAnUCc6CisgICAgICBsZW5ndGggPSAxMjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFzX2JhZCAoXygiVW5rbm93biBmbG9hdGluZyB0eXBlIHR5cGUgJyVjJyIpLCBmbG9hdF90eXBlKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBnbyB0aHJvdWdoIGV4cHJlc3Npb24gdG8gcGFyc2UgdGhlCisgICAgIGhleCBjb25zdGFudCwgYnV0IGlmIHdlIGdldCBhIGJpZ251bSBpdCdzIGEgcGFpbiB0byBzb3J0IGl0IGludG8KKyAgICAgdGhlIGJ1ZmZlciBjb3JyZWN0bHkuICAqLworICBpID0gMDsKKyAgd2hpbGUgKGhleF9wICgqaW5wdXRfbGluZV9wb2ludGVyKSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKKyAgICB7CisgICAgICBpbnQgZDsKKworICAgICAgLyogVGhlIE1SSSBhc3NlbWJsZXIgYWNjZXB0cyBhcmJpdHJhcnkgdW5kZXJzY29yZXMgc3RyZXduIGFib3V0CisJIHRocm91Z2ggdGhlIGhleCBjb25zdGFudCwgc28gd2UgaWdub3JlIHRoZW0gYXMgd2VsbC4gKi8KKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdfJykKKwl7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKGkgPj0gbGVuZ3RoKQorCXsKKwkgIGFzX3dhcm4gKF8oIkZsb2F0aW5nIHBvaW50IGNvbnN0YW50IHRvbyBsYXJnZSIpKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBkID0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKSA8PCA0OworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXycpCisJKytpbnB1dF9saW5lX3BvaW50ZXI7CisgICAgICBpZiAoaGV4X3AgKCppbnB1dF9saW5lX3BvaW50ZXIpKQorCXsKKwkgIGQgKz0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKTsKKwkgICsraW5wdXRfbGluZV9wb2ludGVyOworCX0KKyAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKKwlieXRlc1tpXSA9IGQ7CisgICAgICBlbHNlCisJYnl0ZXNbbGVuZ3RoIC0gaSAtIDFdID0gZDsKKyAgICAgICsraTsKKyAgICB9CisKKyAgaWYgKGkgPCBsZW5ndGgpCisgICAgeworICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQorCW1lbXNldCAoYnl0ZXMgKyBpLCAwLCBsZW5ndGggLSBpKTsKKyAgICAgIGVsc2UKKwltZW1zZXQgKGJ5dGVzLCAwLCBsZW5ndGggLSBpKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyoKKyAqCQkJZmxvYXRfY29ucygpCisgKgorICogQ09OU3RydWN0IHNvbWUgbW9yZSBmcmFnIGNoYXJzIG9mIC5mbG9hdHMgLmZmbG9hdHMgZXRjLgorICogTWFrZXMgMCBvciBtb3JlIG5ldyBmcmFncy4KKyAqIElmIG5lZWRfcGFzc18yID09IDEsIG5vIGZyYWdzIGFyZSBlbWl0dGVkLgorICogVGhpcyB1bmRlcnN0YW5kcyBvbmx5IGZsb2F0aW5nIGxpdGVyYWxzLCBub3QgZXhwcmVzc2lvbnMuIFNvcnJ5LgorICoKKyAqIEEgZmxvYXRpbmcgY29uc3RhbnQgaXMgZGVmaW5lZCBieSBhdG9mX2dlbmVyaWMoKSwgZXhjZXB0IGl0IGlzIHByZWNlZGVkCisgKiBieSAwZCAwZiAwZyBvciAwaC4gQWZ0ZXIgb2JzZXJ2aW5nIHRoZSBTVFJBTkdFIHdheSBteSBCU0QgQVMgZG9lcyBpdHMKKyAqIHJlYWRpbmcsIEkgZGVjaWRlZCB0byBiZSBpbmNvbXBhdGlibGUuIFRoaXMgYWx3YXlzIHRyaWVzIHRvIGdpdmUgeW91CisgKiByb3VuZGVkIGJpdHMgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgcHNldWRvLW9wLiBGb3JtZXIgQVMgZGlkIHByZW1hdHVyZQorICogdHJ1bmNhdGF0aW9uLCByZXN0b3JlZCBub2lzeSBiaXRzIGluc3RlYWQgb2YgdHJhaWxpbmcgMHMgQU5EIGdhdmUgeW91CisgKiBhIGNob2ljZSBvZiAyIGZsYXZvdXJzIG9mIG5vaXNlIGFjY29yZGluZyB0byB3aGljaCBvZiAyIGZsb2F0aW5nLXBvaW50CisgKiBzY2FubmVycyB5b3UgZGlyZWN0ZWQgQVMgdG8gdXNlLgorICoKKyAqIEluOglpbnB1dF9saW5lX3BvaW50ZXItPndoaXRlc3BhY2UgYmVmb3JlLCBvciAnMCcgb2YgZmxvbnVtLgorICoKKyAqLworCit2b2lkCitmbG9hdF9jb25zIChmbG9hdF90eXBlKQorICAgICAvKiBDbG9iYmVycyBpbnB1dF9saW5lLXBvaW50ZXIsIGNoZWNrcyBlbmQtb2YtbGluZS4gKi8KKyAgICAgcmVnaXN0ZXIgaW50IGZsb2F0X3R5cGU7CS8qICdmJzouZmZsb2F0IC4uLiAnRic6LmZsb2F0IC4uLiAqLworeworICByZWdpc3RlciBjaGFyICpwOworICBpbnQgbGVuZ3RoOwkJCS8qIE51bWJlciBvZiBjaGFycyBpbiBhbiBvYmplY3QuICovCisgIHJlZ2lzdGVyIGNoYXIgKmVycjsJCS8qIEVycm9yIGZyb20gc2Nhbm5pbmcgZmxvYXRpbmcgbGl0ZXJhbC4gKi8KKyAgY2hhciB0ZW1wW01BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVF07CisKKyAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisgICAgeworICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAorICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKKyNlbmRpZgorCisgIGRvCisgICAgeworICAgICAgLyogaW5wdXRfbGluZV9wb2ludGVyLT4xc3QgY2hhciBvZiBhIGZsb251bSAod2UgaG9wZSEpLiAqLworICAgICAgU0tJUF9XSElURVNQQUNFICgpOworCisgICAgICAvKiBTa2lwIGFueSAwe2xldHRlcn0gdGhhdCBtYXkgYmUgcHJlc2VudC4gRG9uJ3QgZXZlbiBjaGVjayBpZiB0aGUKKyAgICAgICAqIGxldHRlciBpcyBsZWdhbC4gU29tZW9uZSBtYXkgaW52ZW50IGEgInoiIGZvcm1hdCBhbmQgdGhpcyByb3V0aW5lCisgICAgICAgKiBoYXMgbm8gdXNlIGZvciBzdWNoIGluZm9ybWF0aW9uLiBMdXNlcnMgYmV3YXJlOiB5b3UgZ2V0CisgICAgICAgKiBkaWFnbm9zdGljcyBpZiB5b3VyIGlucHV0IGlzIGlsbC1jb25kaXRpb25lZC4KKyAgICAgICAqLworICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnMCcKKwkgICYmIGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV0pKQorCWlucHV0X2xpbmVfcG9pbnRlciArPSAyOworCisgICAgICAvKiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMsIGZvciBhIGZsb2F0aW5nCisgICAgICAgICBwb2ludCB3aXRoIHRoZSBleGFjdCBkaWdpdHMgc3BlY2lmaWVkLiAgKi8KKyAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzonKQorCXsKKwkgICsraW5wdXRfbGluZV9wb2ludGVyOworCSAgbGVuZ3RoID0gaGV4X2Zsb2F0IChmbG9hdF90eXBlLCB0ZW1wKTsKKwkgIGlmIChsZW5ndGggPCAwKQorCSAgICB7CisJICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgZXJyID0gbWRfYXRvZiAoZmxvYXRfdHlwZSwgdGVtcCwgJmxlbmd0aCk7CisJICBrbm93IChsZW5ndGggPD0gTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUKTsKKwkgIGtub3cgKGxlbmd0aCA+IDApOworCSAgaWYgKGVycikKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIiksIGVycik7CisJICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisKKyAgICAgIGlmICghbmVlZF9wYXNzXzIpCisJeworCSAgaW50IGNvdW50OworCisJICBjb3VudCA9IDE7CisKKyNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUworCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzonKQorCSAgICB7CisJICAgICAgZXhwcmVzc2lvblMgY291bnRfZXhwOworCisJICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICAgICAgZXhwcmVzc2lvbiAoJmNvdW50X2V4cCk7CisJICAgICAgaWYgKGNvdW50X2V4cC5YX29wICE9IE9fY29uc3RhbnQKKwkJICB8fCBjb3VudF9leHAuWF9hZGRfbnVtYmVyIDw9IDApCisJCXsKKwkJICBhc193YXJuIChfKCJ1bnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIikpOworCQl9CisJICAgICAgZWxzZQorCQljb3VudCA9IGNvdW50X2V4cC5YX2FkZF9udW1iZXI7CisJICAgIH0KKyNlbmRpZgorCisJICB3aGlsZSAoLS1jb3VudCA+PSAwKQorCSAgICB7CisJICAgICAgcCA9IGZyYWdfbW9yZSAobGVuZ3RoKTsKKwkgICAgICBtZW1jcHkgKHAsIHRlbXAsICh1bnNpZ25lZCBpbnQpIGxlbmd0aCk7CisJICAgIH0KKwl9CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgfQorICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7CisKKyAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAgKi8KKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30JCQkJLyogZmxvYXRfY29ucygpICovCisMCisvKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBMRUIxMjggdmFsdWUgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3NpemVvZl9zbGViMTI4ICh2YWx1ZSkKKyAgICAgb2Zmc2V0VCB2YWx1ZTsKK3sKKyAgcmVnaXN0ZXIgaW50IHNpemUgPSAwOworICByZWdpc3RlciB1bnNpZ25lZCBieXRlOworCisgIGRvCisgICAgeworICAgICAgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOworICAgICAgLyogU2FkbHksIHdlIGNhbm5vdCByZWx5IG9uIHR5cGljYWwgYXJpdGhtZXRpYyByaWdodCBzaGlmdCBiZWhhdmlvdXIuCisJIEZvcnR1bmF0ZWx5LCB3ZSBjYW4gc3RydWN0dXJlIHRoaW5ncyBzbyB0aGF0IHRoZSBleHRyYSB3b3JrIHJlZHVjZXMKKwkgdG8gYSBub29wIG9uIHN5c3RlbXMgdGhhdCBkbyB0aGluZ3MgInByb3Blcmx5Ii4gICovCisgICAgICB2YWx1ZSA9ICh2YWx1ZSA+PiA3KSB8IH4oLShvZmZzZXRUKTEgPj4gNyk7CisgICAgICBzaXplICs9IDE7CisgICAgfQorICB3aGlsZSAoISgoKHZhbHVlID09IDApICYmICgoYnl0ZSAmIDB4NDApID09IDApKQorCSAgIHx8ICgodmFsdWUgPT0gLTEpICYmICgoYnl0ZSAmIDB4NDApICE9IDApKSkpOworCisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2l6ZW9mX3VsZWIxMjggKHZhbHVlKQorICAgICB2YWx1ZVQgdmFsdWU7Cit7CisgIHJlZ2lzdGVyIGludCBzaXplID0gMDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgYnl0ZTsKKworICBkbworICAgIHsKKyAgICAgIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKKyAgICAgIHZhbHVlID4+PSA3OworICAgICAgc2l6ZSArPSAxOworICAgIH0KKyAgd2hpbGUgKHZhbHVlICE9IDApOworCisgIHJldHVybiBzaXplOworfQorCitpbnQKK3NpemVvZl9sZWIxMjggKHZhbHVlLCBzaWduKQorICAgICB2YWx1ZVQgdmFsdWU7CisgICAgIGludCBzaWduOworeworICBpZiAoc2lnbikKKyAgICByZXR1cm4gc2l6ZW9mX3NsZWIxMjggKChvZmZzZXRUKSB2YWx1ZSk7CisgIGVsc2UKKyAgICByZXR1cm4gc2l6ZW9mX3VsZWIxMjggKHZhbHVlKTsKK30KKworLyogT3V0cHV0IGEgTEVCMTI4IHZhbHVlLiAgKi8KKworc3RhdGljIGlubGluZSBpbnQKK291dHB1dF9zbGViMTI4IChwLCB2YWx1ZSkKKyAgICAgY2hhciAqcDsKKyAgICAgb2Zmc2V0VCB2YWx1ZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqb3JpZyA9IHA7CisgIHJlZ2lzdGVyIGludCBtb3JlOworCisgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOworCisgICAgICAvKiBTYWRseSwgd2UgY2Fubm90IHJlbHkgb24gdHlwaWNhbCBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGJlaGF2aW91ci4KKwkgRm9ydHVuYXRlbHksIHdlIGNhbiBzdHJ1Y3R1cmUgdGhpbmdzIHNvIHRoYXQgdGhlIGV4dHJhIHdvcmsgcmVkdWNlcworCSB0byBhIG5vb3Agb24gc3lzdGVtcyB0aGF0IGRvIHRoaW5ncyAicHJvcGVybHkiLiAgKi8KKyAgICAgIHZhbHVlID0gKHZhbHVlID4+IDcpIHwgfigtKG9mZnNldFQpMSA+PiA3KTsKKworICAgICAgbW9yZSA9ICEoKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCisJCXx8ICgodmFsdWUgPT0gLTEpICYmICgoYnl0ZSAmIDB4NDApICE9IDApKSkpOworICAgICAgaWYgKG1vcmUpCisJYnl0ZSB8PSAweDgwOworCisgICAgICAqcCsrID0gYnl0ZTsKKyAgICB9CisgIHdoaWxlIChtb3JlKTsKKworICByZXR1cm4gcCAtIG9yaWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitvdXRwdXRfdWxlYjEyOCAocCwgdmFsdWUpCisgICAgIGNoYXIgKnA7CisgICAgIHZhbHVlVCB2YWx1ZTsKK3sKKyAgY2hhciAqb3JpZyA9IHA7CisKKyAgZG8KKyAgICB7CisgICAgICB1bnNpZ25lZCBieXRlID0gKHZhbHVlICYgMHg3Zik7CisgICAgICB2YWx1ZSA+Pj0gNzsKKyAgICAgIGlmICh2YWx1ZSAhPSAwKQorCS8qIE1vcmUgYnl0ZXMgdG8gZm9sbG93LiAgKi8KKwlieXRlIHw9IDB4ODA7CisKKyAgICAgICpwKysgPSBieXRlOworICAgIH0KKyAgd2hpbGUgKHZhbHVlICE9IDApOworCisgIHJldHVybiBwIC0gb3JpZzsKK30KKworaW50CitvdXRwdXRfbGViMTI4IChwLCB2YWx1ZSwgc2lnbikKKyAgICAgY2hhciAqcDsKKyAgICAgdmFsdWVUIHZhbHVlOworICAgICBpbnQgc2lnbjsKK3sKKyAgaWYgKHNpZ24pCisgICAgcmV0dXJuIG91dHB1dF9zbGViMTI4IChwLCAob2Zmc2V0VCkgdmFsdWUpOworICBlbHNlCisgICAgcmV0dXJuIG91dHB1dF91bGViMTI4IChwLCB2YWx1ZSk7Cit9CisKKy8qIERvIHRoZSBzYW1lIGZvciBiaWdudW1zLiAgV2UgY29tYmluZSBzaXplb2Ygd2l0aCBvdXRwdXQgaGVyZSBpbiB0aGF0CisgICB3ZSBkb24ndCBvdXRwdXQgZm9yIE5VTEwgdmFsdWVzIG9mIFAuICBJdCBpc24ndCByZWFsbHkgYXMgY3JpdGljYWwgYXMKKyAgIGZvciAibm9ybWFsIiB2YWx1ZXMgdGhhdCB0aGlzIGJlIHN0cmVhbWxpbmVkLiAgKi8KKworc3RhdGljIGludAorb3V0cHV0X2JpZ19zbGViMTI4IChwLCBiaWdudW0sIHNpemUpCisgICAgIGNoYXIgKnA7CisgICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07CisgICAgIGludCBzaXplOworeworICBjaGFyICpvcmlnID0gcDsKKyAgdmFsdWVUIHZhbCA9IDA7CisgIGludCBsb2FkZWQgPSAwOworICB1bnNpZ25lZCBieXRlOworCisgIC8qIFN0cmlwIGxlYWRpbmcgc2lnbiBleHRlbnNpb25zIG9mZiB0aGUgYmlnbnVtLiAgKi8KKyAgd2hpbGUgKHNpemUgPiAwICYmIGJpZ251bVtzaXplLTFdID09IChMSVRUTEVOVU1fVFlQRSktMSkKKyAgICBzaXplLS07CisKKyAgZG8KKyAgICB7CisgICAgICBpZiAobG9hZGVkIDwgNyAmJiBzaXplID4gMCkKKwl7CisJICB2YWwgfD0gKCpiaWdudW0gPDwgbG9hZGVkKTsKKwkgIGxvYWRlZCArPSA4ICogQ0hBUlNfUEVSX0xJVFRMRU5VTTsKKwkgIHNpemUtLTsKKwkgIGJpZ251bSsrOworCX0KKworICAgICAgYnl0ZSA9IHZhbCAmIDB4N2Y7CisgICAgICBsb2FkZWQgLT0gNzsKKyAgICAgIHZhbCA+Pj0gNzsKKworICAgICAgaWYgKHNpemUgPT0gMCkKKwl7CisJICBpZiAoKHZhbCA9PSAwICYmIChieXRlICYgMHg0MCkgPT0gMCkKKwkgICAgICB8fCAofih2YWwgfCB+KCgodmFsdWVUKTEgPDwgbG9hZGVkKSAtIDEpKSA9PSAwCisJCSAgJiYgKGJ5dGUgJiAweDQwKSAhPSAwKSkKKwkgICAgYnl0ZSB8PSAweDgwOworCX0KKworICAgICAgaWYgKG9yaWcpCisJKnAgPSBieXRlOworICAgICAgcCsrOworICAgIH0KKyAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKKworICByZXR1cm4gcCAtIG9yaWc7Cit9CisKK3N0YXRpYyBpbnQKK291dHB1dF9iaWdfdWxlYjEyOCAocCwgYmlnbnVtLCBzaXplKQorICAgICBjaGFyICpwOworICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOworICAgICBpbnQgc2l6ZTsKK3sKKyAgY2hhciAqb3JpZyA9IHA7CisgIHZhbHVlVCB2YWwgPSAwOworICBpbnQgbG9hZGVkID0gMDsKKyAgdW5zaWduZWQgYnl0ZTsKKworICAvKiBTdHJpcCBsZWFkaW5nIHplcm9zIG9mZiB0aGUgYmlnbnVtLiAgKi8KKyAgLyogWFhYOiBJcyB0aGlzIG5lZWRlZD8gICovCisgIHdoaWxlIChzaXplID4gMCAmJiBiaWdudW1bc2l6ZS0xXSA9PSAwKQorICAgIHNpemUtLTsKKworICBkbworICAgIHsKKyAgICAgIGlmIChsb2FkZWQgPCA3ICYmIHNpemUgPiAwKQorCXsKKwkgIHZhbCB8PSAoKmJpZ251bSA8PCBsb2FkZWQpOworCSAgbG9hZGVkICs9IDggKiBDSEFSU19QRVJfTElUVExFTlVNOworCSAgc2l6ZS0tOworCSAgYmlnbnVtKys7CisJfQorCisgICAgICBieXRlID0gdmFsICYgMHg3ZjsKKyAgICAgIGxvYWRlZCAtPSA3OworICAgICAgdmFsID4+PSA3OworCisgICAgICBpZiAoc2l6ZSA+IDAgfHwgdmFsKQorCWJ5dGUgfD0gMHg4MDsKKworICAgICAgaWYgKG9yaWcpCisJKnAgPSBieXRlOworICAgICAgcCsrOworICAgIH0KKyAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKKworICByZXR1cm4gcCAtIG9yaWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitvdXRwdXRfYmlnX2xlYjEyOCAocCwgYmlnbnVtLCBzaXplLCBzaWduKQorICAgICBjaGFyICpwOworICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOworICAgICBpbnQgc2l6ZSwgc2lnbjsKK3sKKyAgaWYgKHNpZ24pCisgICAgcmV0dXJuIG91dHB1dF9iaWdfc2xlYjEyOCAocCwgYmlnbnVtLCBzaXplKTsKKyAgZWxzZQorICAgIHJldHVybiBvdXRwdXRfYmlnX3VsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSk7Cit9CisKKy8qIEdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBmcmFnbWVudHMgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbiB0byBlbWl0IGEKKyAgIGxlYjEyOCB2YWx1ZS4gICovCisKK3ZvaWQKK2VtaXRfbGViMTI4X2V4cHIoZXhwLCBzaWduKQorICAgICBleHByZXNzaW9uUyAqZXhwOworICAgICBpbnQgc2lnbjsKK3sKKyAgb3BlcmF0b3JUIG9wID0gZXhwLT5YX29wOworCisgIGlmIChvcCA9PSBPX2Fic2VudCB8fCBvcCA9PSBPX2lsbGVnYWwpCisgICAgeworICAgICAgYXNfd2FybiAoXygiemVybyBhc3N1bWVkIGZvciBtaXNzaW5nIGV4cHJlc3Npb24iKSk7CisgICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7CisgICAgICBvcCA9IE9fY29uc3RhbnQ7CisgICAgfQorICBlbHNlIGlmIChvcCA9PSBPX2JpZyAmJiBleHAtPlhfYWRkX251bWJlciA8PSAwKQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKKyAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKKyAgICAgIG9wID0gT19jb25zdGFudDsKKyAgICB9CisgIGVsc2UgaWYgKG9wID09IE9fcmVnaXN0ZXIpCisgICAgeworICAgICAgYXNfd2FybiAoXygicmVnaXN0ZXIgdmFsdWUgdXNlZCBhcyBleHByZXNzaW9uIikpOworICAgICAgb3AgPSBPX2NvbnN0YW50OworICAgIH0KKworICBpZiAob3AgPT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBjb25zdGFudCwgZW1pdCB0aGUgdGhpbmcgZGlyZWN0bHkgcmlnaHQgbm93LiAgKi8KKworICAgICAgdmFsdWVUIHZhbHVlID0gZXhwLT5YX2FkZF9udW1iZXI7CisgICAgICBpbnQgc2l6ZTsKKyAgICAgIGNoYXIgKnA7CisKKyAgICAgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgc2lnbik7CisgICAgICBwID0gZnJhZ19tb3JlIChzaXplKTsKKyAgICAgIG91dHB1dF9sZWIxMjggKHAsIHZhbHVlLCBzaWduKTsKKyAgICB9CisgIGVsc2UgaWYgKG9wID09IE9fYmlnKQorICAgIHsKKyAgICAgIC8qIE9fYmlnIGlzIGEgZGlmZmVyZW50IHNvcnQgb2YgY29uc3RhbnQuICAqLworCisgICAgICBpbnQgc2l6ZTsKKyAgICAgIGNoYXIgKnA7CisKKyAgICAgIHNpemUgPSBvdXRwdXRfYmlnX2xlYjEyOCAoTlVMTCwgZ2VuZXJpY19iaWdudW0sIGV4cC0+WF9hZGRfbnVtYmVyLCBzaWduKTsKKyAgICAgIHAgPSBmcmFnX21vcmUgKHNpemUpOworICAgICAgb3V0cHV0X2JpZ19sZWIxMjggKHAsIGdlbmVyaWNfYmlnbnVtLCBleHAtPlhfYWRkX251bWJlciwgc2lnbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIHZhcmlhYmxlIHNpemVkIGZyYWdtZW50IGFuZCAKKwkgcmVzb2x2ZSB0aGluZ3MgbGF0ZXIuICAqLworCisgICAgICBmcmFnX3ZhciAocnNfbGViMTI4LCBzaXplb2ZfdWxlYjEyOCAofih2YWx1ZVQpMCksIDAsIHNpZ24sCisJCW1ha2VfZXhwcl9zeW1ib2wgKGV4cCksIDAsIChjaGFyICopIE5VTEwpOworICAgIH0KK30KKworLyogUGFyc2UgdGhlIC5zbGViMTI4IGFuZCAudWxlYjEyOCBwc2V1ZG9zLiAgKi8KKwordm9pZAorc19sZWIxMjggKHNpZ24pCisgICAgIGludCBzaWduOworeworICBleHByZXNzaW9uUyBleHA7CisKKyAgZG8geworICAgIGV4cHJlc3Npb24gKCZleHApOworICAgIGVtaXRfbGViMTI4X2V4cHIgKCZleHAsIHNpZ24pOworICB9IHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKKworICBpbnB1dF9saW5lX3BvaW50ZXItLTsKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwwKKy8qCisgKgkJCXN0cmluZ2VyKCkKKyAqCisgKiBXZSByZWFkIDAgb3IgbW9yZSAnLCcgc2VwZXJhdGVkLCBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCisgKgorICogQ2FsbGVyIHNob3VsZCBoYXZlIGNoZWNrZWQgbmVlZF9wYXNzXzIgaXMgRkFMU0UgYmVjYXVzZSB3ZSBkb24ndCBjaGVjayBpdC4KKyAqLworCisKK3ZvaWQgCitzdHJpbmdlciAoYXBwZW5kX3plcm8pCQkvKiBXb3JrZXIgdG8gZG8gLmFzY2lpIGV0YyBzdGF0ZW1lbnRzLiAqLworICAgICAvKiBDaGVja3MgZW5kLW9mLWxpbmUuICovCisgICAgIHJlZ2lzdGVyIGludCBhcHBlbmRfemVybzsJLyogMDogZG9uJ3QgYXBwZW5kICdcMCcsIGVsc2UgMSAqLworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKKyAgY2hhciAqc3RhcnQ7CisKKyNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAorICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKKyNlbmRpZgorCisgIC8qCisgICAqIFRoZSBmb2xsb3dpbmcgYXdrd2FyZCBsb2dpYyBpcyB0byBwYXJzZSBaRVJPIG9yIG1vcmUgc3RyaW5ncywKKyAgICogY29tbWEgc2VwYXJhdGVkLiBSZWNhbGwgYSBzdHJpbmcgZXhwcmVzc2lvbiBpbmNsdWRlcyBzcGFjZXMKKyAgICogYmVmb3JlIHRoZSBvcGVuaW5nICdcIicgYW5kIHNwYWNlcyBhZnRlciB0aGUgY2xvc2luZyAnXCInLgorICAgKiBXZSBmYWtlIGEgbGVhZGluZyAnLCcgaWYgdGhlcmUgaXMgKHN1cHBvc2VkIHRvIGJlKQorICAgKiBhIDFzdCwgZXhwcmVzc2lvbi4gV2Uga2VlcCBkZW1hbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGVhY2gKKyAgICogJywnLgorICAgKi8KKyAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCisgICAgeworICAgICAgYyA9IDA7CQkJLyogU2tpcCBsb29wLiAqLworICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qIENvbXBlbnNhdGUgZm9yIGVuZCBvZiBsb29wLiAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGMgPSAnLCc7CQkJLyogRG8gbG9vcC4gKi8KKyAgICB9CisgIHdoaWxlIChjID09ICcsJyB8fCBjID09ICc8JyB8fCBjID09ICciJykKKyAgICB7CisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBzd2l0Y2ggKCppbnB1dF9saW5lX3BvaW50ZXIpCisJeworCWNhc2UgJ1wiJzoKKwkgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKi0+MXN0IGNoYXIgb2Ygc3RyaW5nLiAqLworCSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisJICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCisJICAgIHsKKwkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOworCSAgICB9CisJICBpZiAoYXBwZW5kX3plcm8pCisJICAgIHsKKwkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKDApOworCSAgICB9CisJICBrbm93IChpbnB1dF9saW5lX3BvaW50ZXJbLTFdID09ICdcIicpOworCisjaWZuZGVmIE5PX0xJU1RJTkcKKyNpZmRlZiBPQkpfRUxGCisJICAvKiBJbiBFTEYsIHdoZW4gZ2NjIGlzIGVtaXR0aW5nIERXQVJGIDEgZGVidWdnaW5nIG91dHB1dCwgaXQKKyAgICAgICAgICAgICB3aWxsIGVtaXQgLnN0cmluZyB3aXRoIGEgZmlsZW5hbWUgaW4gdGhlIC5kZWJ1ZyBzZWN0aW9uCisgICAgICAgICAgICAgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnQgaW4KKyAgICAgICAgICAgICBlbWl0X2V4cHIgZm9yIHRoZSBzZXF1ZW5jZS4gIGVtaXRfZXhwciB3aWxsIHNldAorICAgICAgICAgICAgIGR3YXJmX2ZpbGVfc3RyaW5nIHRvIG5vbi16ZXJvIGlmIHRoaXMgc3RyaW5nIG1pZ2h0IGJlIGEKKyAgICAgICAgICAgICBzb3VyY2UgZmlsZSBuYW1lLiAgKi8KKwkgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQorCSAgICBkd2FyZl9maWxlX3N0cmluZyA9IDA7CisJICBlbHNlIGlmIChkd2FyZl9maWxlX3N0cmluZykKKwkgICAgeworCSAgICAgIGMgPSBpbnB1dF9saW5lX3BvaW50ZXJbLTFdOworCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlclstMV0gPSAnXDAnOworCSAgICAgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0YXJ0KTsKKwkgICAgICBpbnB1dF9saW5lX3BvaW50ZXJbLTFdID0gYzsKKwkgICAgfQorI2VuZGlmCisjZW5kaWYKKworCSAgYnJlYWs7CisJY2FzZSAnPCc6CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIGMgPSBnZXRfc2luZ2xlX251bWJlciAoKTsKKwkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7CisJICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnPicpCisJICAgIHsKKwkgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIDxubj4iKSk7CisJICAgIH0KKwkgIGlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgYnJlYWs7CisJY2FzZSAnLCc6CisJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOworICAgIH0KKworICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOworfQkJCQkvKiBzdHJpbmdlcigpICovCisMCisvKiBGSVhNRS1TT01FREFZOiBJIGhhZCB0cm91YmxlIGhlcmUgb24gY2hhcmFjdGVycyB3aXRoIHRoZQorICAgIGhpZ2ggYml0cyBzZXQuICBXZSdsbCBwcm9iYWJseSBhbHNvIGhhdmUgdHJvdWJsZSB3aXRoCisgICAgbXVsdGlieXRlIGNoYXJzLCB3aWRlIGNoYXJzLCBldGMuICBBbHNvIGJlIGNhcmVmdWwgYWJvdXQKKyAgICByZXR1cm5pbmcgdmFsdWVzIGJpZ2dlciB0aGFuIDEgYnl0ZS4gIHhveG9yaWNoLiAqLworCit1bnNpZ25lZCBpbnQgCituZXh0X2NoYXJfb2Zfc3RyaW5nICgpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOworCisgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKysgJiBDSEFSX01BU0s7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAnXCInOgorICAgICAgYyA9IE5PVF9BX0NIQVI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1xuJzoKKyAgICAgIGFzX3dhcm4gKF8oIlVudGVybWluYXRlZCBzdHJpbmc6IE5ld2xpbmUgaW5zZXJ0ZWQuIikpOworICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOworICAgICAgYnJlYWs7CisKKyNpZm5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKKyAgICBjYXNlICdcXCc6CisgICAgICBzd2l0Y2ggKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCisJeworCWNhc2UgJ2InOgorCSAgYyA9ICdcYic7CisJICBicmVhazsKKworCWNhc2UgJ2YnOgorCSAgYyA9ICdcZic7CisJICBicmVhazsKKworCWNhc2UgJ24nOgorCSAgYyA9ICdcbic7CisJICBicmVhazsKKworCWNhc2UgJ3InOgorCSAgYyA9ICdccic7CisJICBicmVhazsKKworCWNhc2UgJ3QnOgorCSAgYyA9ICdcdCc7CisJICBicmVhazsKKworCWNhc2UgJ3YnOgorCSAgYyA9ICdcMDEzJzsKKwkgIGJyZWFrOworCisJY2FzZSAnXFwnOgorCWNhc2UgJyInOgorCSAgYnJlYWs7CQkvKiBBcyBpdHNlbGYuICovCisKKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwljYXNlICc4JzoKKwljYXNlICc5JzoKKwkgIHsKKwkgICAgbG9uZyBudW1iZXI7CisJICAgIGludCBpOworCisJICAgIGZvciAoaSA9IDAsIG51bWJlciA9IDA7IGlzZGlnaXQgKGMpICYmIGkgPCAzOyBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrLCBpKyspCisJICAgICAgeworCQludW1iZXIgPSBudW1iZXIgKiA4ICsgYyAtICcwJzsKKwkgICAgICB9CisJICAgIGMgPSBudW1iZXIgJiAweGZmOworCSAgfQorCSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7CisJICBicmVhazsKKworCWNhc2UgJ3gnOgorCWNhc2UgJ1gnOgorCSAgeworCSAgICBsb25nIG51bWJlcjsKKworCSAgICBudW1iZXIgPSAwOworCSAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOworCSAgICB3aGlsZSAoaXN4ZGlnaXQgKGMpKQorCSAgICAgIHsKKwkJaWYgKGlzZGlnaXQgKGMpKQorCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICcwJzsKKwkJZWxzZSBpZiAoaXN1cHBlciAoYykpCisJCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJ0EnICsgMTA7CisJCWVsc2UKKwkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnYScgKyAxMDsKKwkJYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKKwkgICAgICB9CisJICAgIGMgPSBudW1iZXIgJiAweGZmOworCSAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnXG4nOgorCSAgLyogVG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgYXM6IGdpdmUgdGhlIGx1c2VyIGEgbGluZWZlZWQhISAqLworCSAgYXNfd2FybiAoXygiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iKSk7CisJICBjID0gJ1xuJzsKKwkgIGJ1bXBfbGluZV9jb3VudGVycyAoKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKworI2lmZGVmIE9OTFlfU1RBTkRBUkRfRVNDQVBFUworCSAgYXNfYmFkIChfKCJCYWQgZXNjYXBlZCBjaGFyYWN0ZXIgaW4gc3RyaW5nLCAnPycgYXNzdW1lZCIpKTsKKwkgIGMgPSAnPyc7CisjZW5kaWYgLyogT05MWV9TVEFOREFSRF9FU0NBUEVTICovCisKKwkgIGJyZWFrOworCX0JCQkvKiBzd2l0Y2ggb24gZXNjYXBlZCBjaGFyICovCisgICAgICBicmVhazsKKyNlbmRpZiAvKiAhIGRlZmluZWQgKE5PX1NUUklOR19FU0NBUEVTKSAqLworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0JCQkJLyogc3dpdGNoIG9uIGNoYXIgKi8KKyAgcmV0dXJuIChjKTsKK30JCQkJLyogbmV4dF9jaGFyX29mX3N0cmluZygpICovCisMCitzdGF0aWMgc2VnVAorZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQorICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKK3sKKyAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7CisKKyAgcmV0dmFsID0gZXhwcmVzc2lvbiAoZXhwUCk7CisgIGlmIChleHBQLT5YX29wID09IE9faWxsZWdhbAorICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2Fic2VudAorICAgICAgfHwgZXhwUC0+WF9vcCA9PSBPX2JpZykKKyAgICB7CisgICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGFkZHJlc3MgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOworICAgICAgZXhwUC0+WF9vcCA9IE9fY29uc3RhbnQ7CisgICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOworICAgICAgcmV0dmFsID0gYWJzb2x1dGVfc2VjdGlvbjsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzZWdUIAorZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uIChleHBQKQorICAgICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwUDsKK3sKKyAgcmVnaXN0ZXIgc2VnVCByZXR2YWw7CisKKyAgaWYgKChyZXR2YWwgPSBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKKyAgICB7CisgICAgICAvKiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBleHRyYWN0IHRoZSB1bmRlZmluZWQgc3ltYm9sIGZyb20gdGhlCisJIGV4cHJlc3Npb24uICAqLworICAgICAgaWYgKGV4cFAtPlhfYWRkX3N5bWJvbCAhPSBOVUxMCisJICAmJiBTX0dFVF9TRUdNRU5UIChleHBQLT5YX2FkZF9zeW1ib2wpICE9IGV4cHJfc2VjdGlvbikKKwlhc193YXJuIChfKCJzeW1ib2wgXCIlc1wiIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIiksCisJCSBTX0dFVF9OQU1FIChleHBQLT5YX2FkZF9zeW1ib2wpKTsKKyAgICAgIGVsc2UKKwlhc193YXJuIChfKCJzb21lIHN5bWJvbCB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIpKTsKKyAgICAgIHJldHZhbCA9IGFic29sdXRlX3NlY3Rpb247CisgICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKKyAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7CisgICAgfQorICBrbm93IChyZXR2YWwgPT0gYWJzb2x1dGVfc2VjdGlvbiB8fCBTRUdfTk9STUFMIChyZXR2YWwpKTsKKyAgcmV0dXJuIChyZXR2YWwpOworfQkJCQkvKiBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24oKSAqLworCitvZmZzZXRUCitnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKQoreworICBleHByZXNzaW9uUyBleHA7CisKKyAgZXhwcmVzc2lvbiAoJmV4cCk7CisgIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQorICAgIHsKKyAgICAgIGlmIChleHAuWF9vcCAhPSBPX2Fic2VudCkKKwlhc19iYWQgKF8oImJhZCBvciBpcnJlZHVjaWJsZSBhYnNvbHV0ZSBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7CisgICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKKyAgICB9CisgIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOworfQorCitjaGFyCQkJCS8qIHJldHVybiB0ZXJtaW5hdG9yICovCitnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAodmFsX3BvaW50ZXIpCisgICAgIGxvbmcgKnZhbF9wb2ludGVyOwkJLyogcmV0dXJuIHZhbHVlIG9mIGV4cHJlc3Npb24gKi8KK3sKKyAgLyogRklYTUU6IHZhbF9wb2ludGVyIHNob3VsZCBwcm9iYWJseSBiZSBvZmZzZXRUICouICAqLworICAqdmFsX3BvaW50ZXIgPSAobG9uZykgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7CisgIHJldHVybiAoKmlucHV0X2xpbmVfcG9pbnRlcisrKTsKK30KKwwKKy8qCisgKgkJCWRlbWFuZF9jb3B5X0Nfc3RyaW5nKCkKKyAqCisgKiBMaWtlIGRlbWFuZF9jb3B5X3N0cmluZywgYnV0IHJldHVybiBOVUxMIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW55ICdcMCdzLgorICogR2l2ZSBhIHdhcm5pbmcgaWYgdGhhdCBoYXBwZW5zLgorICovCitjaGFyICoKK2RlbWFuZF9jb3B5X0Nfc3RyaW5nIChsZW5fcG9pbnRlcikKKyAgICAgaW50ICpsZW5fcG9pbnRlcjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqczsKKworICBpZiAoKHMgPSBkZW1hbmRfY29weV9zdHJpbmcgKGxlbl9wb2ludGVyKSkgIT0gMCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgbGVuOworCisgICAgICBmb3IgKGxlbiA9ICpsZW5fcG9pbnRlcjsgbGVuID4gMDsgbGVuLS0pCisJeworCSAgaWYgKCpzID09IDApCisJICAgIHsKKwkgICAgICBzID0gMDsKKwkgICAgICBsZW4gPSAxOworCSAgICAgICpsZW5fcG9pbnRlciA9IDA7CisJICAgICAgYXNfYmFkIChfKCJUaGlzIHN0cmluZyBtYXkgbm90IGNvbnRhaW4gXCdcXDBcJyIpKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiBzOworfQorDAorLyoKKyAqCQkJZGVtYW5kX2NvcHlfc3RyaW5nKCkKKyAqCisgKiBEZW1hbmQgc3RyaW5nLCBidXQgcmV0dXJuIGEgc2FmZSAoPXByaXZhdGUpIGNvcHkgb2YgdGhlIHN0cmluZy4KKyAqIFJldHVybiBOVUxMIGlmIHdlIGNhbid0IHJlYWQgYSBzdHJpbmcgaGVyZS4KKyAqLworY2hhciAqCitkZW1hbmRfY29weV9zdHJpbmcgKGxlblApCisgICAgIGludCAqbGVuUDsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7CisgIHJlZ2lzdGVyIGludCBsZW47CisgIGNoYXIgKnJldHZhbDsKKworICBsZW4gPSAwOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qIFNraXAgb3BlbmluZyBxdW90ZS4gKi8KKworICAgICAgd2hpbGUgKGlzX2FfY2hhciAoYyA9IG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQorCXsKKwkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgYyk7CisJICBsZW4rKzsKKwl9CisgICAgICAvKiBKRiB0aGlzIG5leHQgbGluZSBpcyBzbyBkZW1hbmRfY29weV9DX3N0cmluZyB3aWxsIHJldHVybiBhCisJIG51bGwgdGVybWluYXRlZCBzdHJpbmcuICovCisgICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOworICAgICAgcmV0dmFsID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBzdHJpbmciKSk7CisgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CisgICpsZW5QID0gbGVuOworICByZXR1cm4gKHJldHZhbCk7Cit9CQkJCS8qIGRlbWFuZF9jb3B5X3N0cmluZygpICovCisMCisvKgorICoJCWlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKQorICoKKyAqIEluOglJbnB1dF9saW5lX3BvaW50ZXItPm5leHQgY2hhcmFjdGVyLgorICoKKyAqIERvOglTa2lwIGlucHV0X2xpbmVfcG9pbnRlciBvdmVyIGFsbCB3aGl0ZXNwYWNlLgorICoKKyAqIE91dDoJMSBpZiBpbnB1dF9saW5lX3BvaW50ZXItPmVuZC1vZi1saW5lLgorKi8KK2ludCAKK2lzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkKK3sKKyAgU0tJUF9XSElURVNQQUNFICgpOworICByZXR1cm4gKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSk7Cit9CQkJCS8qIGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQoKSAqLworCit2b2lkIAorZXF1YWxzIChzeW1fbmFtZSwgcmVhc3NpZ24pCisgICAgIGNoYXIgKnN5bV9uYW1lOworICAgICBpbnQgcmVhc3NpZ247Cit7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHN5bWJvbCB3ZSBhcmUgd29ya2luZyB3aXRoICovCisgIGNoYXIgKnN0b3AgPSBOVUxMOworICBjaGFyIHN0b3BjOworCisgIGlucHV0X2xpbmVfcG9pbnRlcisrOworICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPScpCisgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CisKKyAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyAnIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKworICBpZiAoZmxhZ19tcmkpCisgICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOworCisgIGlmIChzeW1fbmFtZVswXSA9PSAnLicgJiYgc3ltX25hbWVbMV0gPT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBUdXJuICcuID0gbXVtYmxlJyBpbnRvIGEgLm9yZyBtdW1ibGUgKi8KKyAgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKKyAgICAgIGV4cHJlc3Npb25TIGV4cDsKKworICAgICAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7CisgICAgICBpZiAoIW5lZWRfcGFzc18yKQorCWRvX29yZyAoc2VnbWVudCwgJmV4cCwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKHN5bV9uYW1lKTsKKyAgICAgIC8qIFBlcm1pdCByZWdpc3RlciBuYW1lcyB0byBiZSByZWRlZmluZWQuICAqLworICAgICAgaWYgKCEgcmVhc3NpZ24KKwkgICYmIFNfSVNfREVGSU5FRCAoc3ltYm9sUCkKKwkgICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQorCWFzX2JhZCAoXygic3ltYm9sIGAlcycgYWxyZWFkeSBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKKyAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOworICAgIH0KKworICBpZiAoZmxhZ19tcmkpCisgICAgIHsKKyAgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOyAvKiBjaGVjayBnYXJiYWdlIGFmdGVyIHRoZSBleHByZXNzaW9uICovCisgICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7CisgICAgIH0KK30JCQkJLyogZXF1YWxzKCkgKi8KKworLyogLmluY2x1ZGUgLS0gaW5jbHVkZSBhIGZpbGUgYXQgdGhpcyBwb2ludC4gKi8KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQgCitzX2luY2x1ZGUgKGFyZykKKyAgICAgaW50IGFyZzsKK3sKKyAgY2hhciAqbmV3YnVmOworICBjaGFyICpmaWxlbmFtZTsKKyAgaW50IGk7CisgIEZJTEUgKnRyeTsKKyAgY2hhciAqcGF0aDsKKworICBpZiAoISBmbGFnX202OGtfbXJpKQorICAgIHsKKyAgICAgIGZpbGVuYW1lID0gZGVtYW5kX2NvcHlfc3RyaW5nICgmaSk7CisgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKwl7CisJICAvKiBkZW1hbmRfY29weV9zdHJpbmcgaGFzIGFscmVhZHkgcHJpbnRlZCBhbiBlcnJvciBhbmQKKyAgICAgICAgICAgICBjYWxsZWQgaWdub3JlX3Jlc3Rfb2ZfbGluZS4gICovCisJICByZXR1cm47CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCisJICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJworCSAgICAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXHQnKQorCXsKKwkgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgKmlucHV0X2xpbmVfcG9pbnRlcik7CisJICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKwkgICsraTsKKwl9CisgICAgICBvYnN0YWNrXzFncm93ICgmbm90ZXMsICdcMCcpOworICAgICAgZmlsZW5hbWUgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKKyAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKwkrK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CisgIHBhdGggPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgaSArIGluY2x1ZGVfZGlyX21heGxlbiArIDUgLyogc2xvcCAqLyApOworICBmb3IgKGkgPSAwOyBpIDwgaW5jbHVkZV9kaXJfY291bnQ7IGkrKykKKyAgICB7CisgICAgICBzdHJjcHkgKHBhdGgsIGluY2x1ZGVfZGlyc1tpXSk7CisgICAgICBzdHJjYXQgKHBhdGgsICIvIik7CisgICAgICBzdHJjYXQgKHBhdGgsIGZpbGVuYW1lKTsKKyAgICAgIGlmICgwICE9ICh0cnkgPSBmb3BlbiAocGF0aCwgInIiKSkpCisJeworCSAgZmNsb3NlICh0cnkpOworCSAgZ290byBnb3RpdDsKKwl9CisgICAgfQorICBmcmVlIChwYXRoKTsKKyAgcGF0aCA9IGZpbGVuYW1lOworZ290aXQ6CisgIC8qIG1hbGxvYyBTdG9yYWdlIGxlYWsgd2hlbiBmaWxlIGlzIGZvdW5kIG9uIHBhdGguICBGSVhNRS1TT01FREFZLiAqLworICByZWdpc3Rlcl9kZXBlbmRlbmN5IChwYXRoKTsKKyAgbmV3YnVmID0gaW5wdXRfc2NydWJfaW5jbHVkZV9maWxlIChwYXRoLCBpbnB1dF9saW5lX3BvaW50ZXIpOworICBidWZmZXJfbGltaXQgPSBpbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciAoJmlucHV0X2xpbmVfcG9pbnRlcik7Cit9CQkJCS8qIHNfaW5jbHVkZSgpICovCisKK3ZvaWQgCithZGRfaW5jbHVkZV9kaXIgKHBhdGgpCisgICAgIGNoYXIgKnBhdGg7Cit7CisgIGludCBpOworCisgIGlmIChpbmNsdWRlX2Rpcl9jb3VudCA9PSAwKQorICAgIHsKKyAgICAgIGluY2x1ZGVfZGlycyA9IChjaGFyICoqKSB4bWFsbG9jICgyICogc2l6ZW9mICgqaW5jbHVkZV9kaXJzKSk7CisgICAgICBpbmNsdWRlX2RpcnNbMF0gPSAiLiI7CS8qIEN1cnJlbnQgZGlyICovCisgICAgICBpbmNsdWRlX2Rpcl9jb3VudCA9IDI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5jbHVkZV9kaXJfY291bnQrKzsKKyAgICAgIGluY2x1ZGVfZGlycyA9IChjaGFyICoqKSByZWFsbG9jIChpbmNsdWRlX2RpcnMsCisJCQkJaW5jbHVkZV9kaXJfY291bnQgKiBzaXplb2YgKCppbmNsdWRlX2RpcnMpKTsKKyAgICB9CisKKyAgaW5jbHVkZV9kaXJzW2luY2x1ZGVfZGlyX2NvdW50IC0gMV0gPSBwYXRoOwkvKiBOZXcgb25lICovCisKKyAgaSA9IHN0cmxlbiAocGF0aCk7CisgIGlmIChpID4gaW5jbHVkZV9kaXJfbWF4bGVuKQorICAgIGluY2x1ZGVfZGlyX21heGxlbiA9IGk7Cit9CQkJCS8qIGFkZF9pbmNsdWRlX2RpcigpICovCisMCisvKiBPdXRwdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgc291cmNlIGZpbGUuICAqLworCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfZmlsZV9kZWJ1ZyAoKQoreworICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19TVEFCUykKKyAgICBzdGFic19nZW5lcmF0ZV9hc21fZmlsZSAoKTsKK30KKworLyogT3V0cHV0IGxpbmUgbnVtYmVyIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgc291cmNlIGxpbmUuICAqLworCit2b2lkCitnZW5lcmF0ZV9saW5lbm9fZGVidWcgKCkKK3sKKyNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKKyAgLyogRUNPRkYgYXNzZW1ibGVycyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gCisgICAgIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBoYW5kbGVkIGVsc2V3aGVyZS4gICovCisgIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1VOU1BFQ0lGSUVEKQorICAgIHsKKyAgICAgIGlmIChFQ09GRl9ERUJVR0dJTkcgJiYgZWNvZmZfbm9fY3VycmVudF9maWxlICgpKQorICAgICAgICBkZWJ1Z190eXBlID0gREVCVUdfRUNPRkY7CisgICAgICBlbHNlCisJZGVidWdfdHlwZSA9IERFQlVHX05PTkU7CisgICAgfQorI2VuZGlmCisKKyAgc3dpdGNoIChkZWJ1Z190eXBlKQorICAgIHsKKyAgICBjYXNlIERFQlVHX1VOU1BFQ0lGSUVEOgorICAgIGNhc2UgREVCVUdfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVCVUdfU1RBQlM6CisgICAgICBzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBERUJVR19FQ09GRjoKKyAgICAgIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8gKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERFQlVHX0RXQVJGOgorICAgIGNhc2UgREVCVUdfRFdBUkYyOgorICAgICAgLyogRklYTUUuICAqLworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBPdXRwdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIG1hcmsgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCBvciBlbmQgcG9pbnQuCisgICBFTkRfUCBpcyB6ZXJvIGZvciAuZnVuYywgYW5kIG5vbi16ZXJvIGZvciAuZW5kZnVuYy4gICovCisKK3ZvaWQKK3NfZnVuYyAoZW5kX3ApCisgICAgIGludCBlbmRfcDsKK3sKKyAgZG9fc19mdW5jIChlbmRfcCwgTlVMTCk7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2Ygc19mdW5jIHNvIHRhcmdldHMgY2FuIGNob29zZSBhIGRpZmZlcmVudCBkZWZhdWx0IHByZWZpeC4KKyAgIElmIERFRkFVTFRfUFJFRklYIGlzIE5VTEwsIHVzZSB0aGUgdGFyZ2V0J3MgImxlYWRpbmcgY2hhciIuICAqLworCit2b2lkCitkb19zX2Z1bmMgKGVuZF9wLCBkZWZhdWx0X3ByZWZpeCkKKyAgICAgaW50IGVuZF9wOworICAgICBjb25zdCBjaGFyICpkZWZhdWx0X3ByZWZpeDsKK3sKKyAgLyogUmVjb3JkIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIGlzc3VlIGFuIGVycm9yIG1lc3NhZ2UgZm9yCisgICAgIG1pc3BsYWNlZCAuZnVuYywuZW5kZnVuYywgYW5kIGFsc28gc28gdGhhdCAuZW5kZnVuYyBuZWVkcyBubworICAgICBhcmd1bWVudHMuICAqLworICBzdGF0aWMgY2hhciAqY3VycmVudF9uYW1lOworICBzdGF0aWMgY2hhciAqY3VycmVudF9sYWJlbDsKKworICBpZiAoZW5kX3ApCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfbmFtZSA9PSBOVUxMKQorCXsKKwkgIGFzX2JhZCAoXygibWlzc2luZyAuZnVuYyIpKTsKKwkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19TVEFCUykKKwlzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyAoY3VycmVudF9uYW1lLCBjdXJyZW50X2xhYmVsKTsKKworICAgICAgY3VycmVudF9uYW1lID0gY3VycmVudF9sYWJlbCA9IE5VTEw7CisgICAgfQorICBlbHNlIC8qICEgZW5kX3AgKi8KKyAgICB7CisgICAgICBjaGFyICpuYW1lLCpsYWJlbDsKKyAgICAgIGNoYXIgZGVsaW0xLGRlbGltMjsKKworICAgICAgaWYgKGN1cnJlbnRfbmFtZSAhPSBOVUxMKQorCXsKKwkgIGFzX2JhZCAoXygiLmVuZGZ1bmMgbWlzc2luZyBmb3IgcHJldmlvdXMgLmZ1bmMiKSk7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKworICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgICAgIGRlbGltMSA9IGdldF9zeW1ib2xfZW5kICgpOworICAgICAgbmFtZSA9IHhzdHJkdXAgKG5hbWUpOworICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGRlbGltMTsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKwl7CisJICBpZiAoZGVmYXVsdF9wcmVmaXgpCisJICAgIGFzcHJpbnRmICgmbGFiZWwsICIlcyVzIiwgZGVmYXVsdF9wcmVmaXgsIG5hbWUpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciBsZWFkaW5nX2NoYXIgPSAwOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKwkgICAgICBsZWFkaW5nX2NoYXIgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKHN0ZG91dHB1dCk7CisjZW5kaWYKKwkgICAgICAvKiBNaXNzaW5nIGVudHJ5IHBvaW50LCB1c2UgZnVuY3Rpb24ncyBuYW1lIHdpdGggdGhlIGxlYWRpbmcKKwkJIGNoYXIgcHJlcGVuZGVkLiAgKi8KKwkgICAgICBpZiAobGVhZGluZ19jaGFyKQorCQlhc3ByaW50ZiAoJmxhYmVsLCAiJWMlcyIsIGxlYWRpbmdfY2hhciwgbmFtZSk7CisJICAgICAgZWxzZQorCQlsYWJlbCA9IG5hbWU7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CisJICBTS0lQX1dISVRFU1BBQ0UgKCk7CisJICBsYWJlbCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKwkgIGRlbGltMiA9IGdldF9zeW1ib2xfZW5kICgpOworCSAgbGFiZWwgPSB4c3RyZHVwIChsYWJlbCk7CisJICAqaW5wdXRfbGluZV9wb2ludGVyID0gZGVsaW0yOworCX0KKworICAgICAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfU1RBQlMpCisJc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMgKG5hbWUsIGxhYmVsKTsKKworICAgICAgY3VycmVudF9uYW1lID0gbmFtZTsKKyAgICAgIGN1cnJlbnRfbGFiZWwgPSBsYWJlbDsKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKwwKK3ZvaWQgCitzX2lnbm9yZSAoYXJnKQorICAgICBpbnQgYXJnOworeworICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKKyAgICB7CisgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKKyAgICB9CisgICsraW5wdXRfbGluZV9wb2ludGVyOworfQorCisKK3ZvaWQKK3JlYWRfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKKyAgICAgRklMRSAqZmlsZTsKK3sKKyAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAicHNldWRvLW9wIHRhYmxlIiwgcG9faGFzaCk7Cit9CisKKy8qIGVuZCBvZiByZWFkLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9yZWFkLmggYi9nYXMvcmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTIwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvcmVhZC5oCkBAIC0wLDAgKzEsMTY2IEBACisvKiByZWFkLmggLSBvZiByZWFkLmMKKyAgIENvcHlyaWdodCAoQykgMTk4NiwgOTAsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsvKiAtPiBjaGFyIHdlIGFyZSBwYXJzaW5nIG5vdy4gKi8KKworI2RlZmluZSBQRVJNSVRfV0hJVEVTUEFDRQkvKiBEZWZpbmUgdG8gbWFrZSB3aGl0ZXNwYWNlIGJlIGFsbG93ZWQgaW4gKi8KKy8qIG1hbnkgc3ludGFjdGljYWxseSB1bm5lY2Vzc2FyeSBwbGFjZXMuICovCisvKiBOb3JtYWxseSB1bmRlZmluZWQuIEZvciBjb21wYXRpYmlsaXR5ICovCisvKiB3aXRoIGFuY2llbnQgR05VIGNjLiAqLworLyogI3VuZGVmIFBFUk1JVF9XSElURVNQQUNFICovCisKKyNpZmRlZiBQRVJNSVRfV0hJVEVTUEFDRQorI2RlZmluZSBTS0lQX1dISVRFU1BBQ0UoKSB7aWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykgKysgaW5wdXRfbGluZV9wb2ludGVyO30KKyNlbHNlCisjZGVmaW5lIFNLSVBfV0hJVEVTUEFDRSgpIGtub3coKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcgKQorI2VuZGlmCisKKworI2RlZmluZQlMRVhfTkFNRQkoMSkJLyogbWF5IGNvbnRpbnVlIGEgbmFtZSAqLworI2RlZmluZSBMRVhfQkVHSU5fTkFNRQkoMikJLyogbWF5IGJlZ2luIGEgbmFtZSAqLworCisjZGVmaW5lIGlzX25hbWVfYmVnaW5uZXIoYykgXAorICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX0JFR0lOX05BTUUgKQorI2RlZmluZSBpc19wYXJ0X29mX25hbWUoYykgXAorICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX05BTUUgICAgICAgKQorCisjaWZuZGVmIGlzX2FfY2hhcgorI2RlZmluZSBDSEFSX01BU0sJKDB4ZmYpCisjZGVmaW5lIE5PVF9BX0NIQVIJKENIQVJfTUFTSysxKQorI2RlZmluZSBpc19hX2NoYXIoYykJKCgodW5zaWduZWQpKGMpKSA8PSBDSEFSX01BU0spCisjZW5kaWYgLyogaXNfYV9jaGFyKCkgKi8KKworZXh0ZXJuIGNoYXIgbGV4X3R5cGVbXTsKK2V4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107CisKK2V4dGVybiBpbnQgaXNfaXRfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47CisKKy8qIFRoZXNlIGFyZSBpbml0aWFsaXplZCBieSB0aGUgQ1BVIHNwZWNpZmljIHRhcmdldCBmaWxlcyAodGMtKi5jKS4gICovCitleHRlcm4gY29uc3QgY2hhciBjb21tZW50X2NoYXJzW107CitleHRlcm4gY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXTsKK2V4dGVybiBjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW107CisKKy8qIFRhYmxlIG9mIC1JIGRpcmVjdG9yaWVzLiAgKi8KK2V4dGVybiBjaGFyICoqaW5jbHVkZV9kaXJzOworZXh0ZXJuIGludCBpbmNsdWRlX2Rpcl9jb3VudDsKK2V4dGVybiBpbnQgaW5jbHVkZV9kaXJfbWF4bGVuOworCisvKiBUaGUgb2Zmc2V0IGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KK2V4dGVybiBhZGRyZXNzVCBhYnNfc2VjdGlvbl9vZmZzZXQ7CisKKy8qIFRoZSBsYWJlbCBvbiBhIGxpbmUsIHVzZWQgYnkgc29tZSBvZiB0aGUgcHNldWRvLW9wcy4gICovCitleHRlcm4gc3ltYm9sUyAqbGluZV9sYWJlbDsKKworLyogVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgTVJJIGNvbW1vbiBzZWN0aW9ucy4gICovCitleHRlcm4gc3ltYm9sUyAqbXJpX2NvbW1vbl9zeW1ib2w7CisKKy8qIFBvc3NpYmxlIGFyZ3VtZW50cyB0byAubGlua29uY2UuICAqLworZW51bSBsaW5rb25jZV90eXBlCit7CisgIExJTktPTkNFX1VOU0VUID0gMCwKKyAgTElOS09OQ0VfRElTQ0FSRCwKKyAgTElOS09OQ0VfT05FX09OTFksCisgIExJTktPTkNFX1NBTUVfU0laRSwKKyAgTElOS09OQ0VfU0FNRV9DT05URU5UUworfTsKKworZXh0ZXJuIHZvaWQgcG9wX2luc2VydCBQQVJBTVMgKChjb25zdCBwc2V1ZG9fdHlwZVMgKikpOworZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0CisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqc3RhYnN0cl9zZWNuYW1lKSk7CitleHRlcm4gY2hhciAqZGVtYW5kX2NvcHlfQ19zdHJpbmcgUEFSQU1TICgoaW50ICpsZW5fcG9pbnRlcikpOworZXh0ZXJuIGNoYXIgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IKKyAgUEFSQU1TICgobG9uZyAqdmFsX3BvaW50ZXIpKTsKK2V4dGVybiBvZmZzZXRUIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbmV4dF9jaGFyX29mX3N0cmluZyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBzX21yaV9zZWN0IFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIGNoYXIgKm1yaV9jb21tZW50X2ZpZWxkIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIHZvaWQgbXJpX2NvbW1lbnRfZW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitleHRlcm4gdm9pZCBhZGRfaW5jbHVkZV9kaXIgUEFSQU1TICgoY2hhciAqcGF0aCkpOworZXh0ZXJuIHZvaWQgY29ucyBQQVJBTVMgKChpbnQgbmJ5dGVzKSk7CitleHRlcm4gdm9pZCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGVtaXRfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7CitleHRlcm4gdm9pZCBlbWl0X2xlYjEyOF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICosIGludCkpOworZXh0ZXJuIHZvaWQgZXF1YWxzIFBBUkFNUyAoKGNoYXIgKnN5bV9uYW1lLCBpbnQgcmVhc3NpZ24pKTsKK2V4dGVybiB2b2lkIGZsb2F0X2NvbnMgUEFSQU1TICgoaW50IGZsb2F0X3R5cGUpKTsKK2V4dGVybiB2b2lkIGlnbm9yZV9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgZGlzY2FyZF9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCBvdXRwdXRfbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQgc2lnbikpOworZXh0ZXJuIHZvaWQgcHNldWRvX3NldCBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOworZXh0ZXJuIHZvaWQgcmVhZF9hX3NvdXJjZV9maWxlIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKK2V4dGVybiB2b2lkIHJlYWRfYmVnaW4gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgcmVhZF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOworZXh0ZXJuIGludCBzaXplb2ZfbGViMTI4IFBBUkFNUyAoKHZhbHVlVCwgaW50IHNpZ24pKTsKK2V4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2xpbmVub19kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHNfYWJvcnQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX2FsaWduX2J5dGVzIFBBUkFNUyAoKGludCBhcmcpKTsKK2V4dGVybiB2b2lkIHNfYWxpZ25fcHR3byBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIHNfYXBwX2ZpbGUgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX2FwcF9saW5lIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19jb21tIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19kYXRhIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19kZXNjIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19lbHNlIFBBUkFNUyAoKGludCBhcmcpKTsKK2V4dGVybiB2b2lkIHNfZW5kIFBBUkFNUyAoKGludCBhcmcpKTsKK2V4dGVybiB2b2lkIHNfZW5kaWYgUEFSQU1TICgoaW50IGFyZykpOworZXh0ZXJuIHZvaWQgc19lcnIgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX2ZhaWwgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX2ZpbGwgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX2Zsb2F0X3NwYWNlIFBBUkFNUyAoKGludCBtdWx0KSk7CitleHRlcm4gdm9pZCBzX2Z1bmMgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBkb19zX2Z1bmMgUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIHNfZ2xvYmwgUEFSQU1TICgoaW50IGFyZykpOworZXh0ZXJuIHZvaWQgc19pZiBQQVJBTVMgKChpbnQgYXJnKSk7CitleHRlcm4gdm9pZCBzX2lmYyBQQVJBTVMgKChpbnQgYXJnKSk7CitleHRlcm4gdm9pZCBzX2lmZGVmIFBBUkFNUyAoKGludCBhcmcpKTsKK2V4dGVybiB2b2lkIHNfaWZlcXMgUEFSQU1TICgoaW50IGFyZykpOworZXh0ZXJuIHZvaWQgc19pZ25vcmUgUEFSQU1TICgoaW50IGFyZykpOworZXh0ZXJuIHZvaWQgc19pbmNsdWRlIFBBUkFNUyAoKGludCBhcmcpKTsKK2V4dGVybiB2b2lkIHNfaXJwIFBBUkFNUyAoKGludCBhcmcpKTsKK2V4dGVybiB2b2lkIHNfbGNvbW0gUEFSQU1TICgoaW50IG5lZWRzX2FsaWduKSk7CitleHRlcm4gdm9pZCBzX2xjb21tX2J5dGVzIFBBUkFNUyAoKGludCBuZWVkc19hbGlnbikpOworZXh0ZXJuIHZvaWQgc19sZWIxMjggUEFSQU1TICgoaW50IHNpZ24pKTsKK2V4dGVybiB2b2lkIHNfbGlua29uY2UgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX2xzeW0gUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX21hY3JvIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19tZXhpdCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIHNfbXJpIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19tcmlfY29tbW9uIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19vcmcgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX3ByaW50IFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgc19wdXJnZW0gUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX3JlcHQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX3NldCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIHNfc3BhY2UgUEFSQU1TICgoaW50IG11bHQpKTsKK2V4dGVybiB2b2lkIHNfc3RhYiBQQVJBTVMgKChpbnQgd2hhdCkpOworZXh0ZXJuIHZvaWQgc19zdHJ1Y3QgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzX3RleHQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBzdHJpbmdlciBQQVJBTVMgKChpbnQgYXBwZW5kX3plcm8pKTsKK2V4dGVybiB2b2lkIHNfeHN0YWIgUEFSQU1TICgoaW50IHdoYXQpKTsKK2V4dGVybiB2b2lkIHNfcnZhIFBBUkFNUyAoKGludCkpOworCisvKiBlbmQgb2YgcmVhZC5oICovCmRpZmYgLS1naXQgYS9nYXMvc2IuYyBiL2dhcy9zYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvc2IuYwpAQCAtMCwwICsxLDI4OSBAQAorLyogc2IuYyAtIHN0cmluZyBidWZmZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCisgICAgICBzYWNAY3lnbnVzLmNvbQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAic2IuaCIKKworLyogVGhlc2Ugcm91dGluZXMgYXJlIGFib3V0IG1hbmlwdWxhdGluZyBzdHJpbmdzLgorCisgICBUaGV5IGFyZSBtYW5hZ2VkIGluIHRoaW5ncyBjYWxsZWQgYHNiJ3Mgd2hpY2ggaXMgYW4gYWJicmV2aWF0aW9uCisgICBmb3Igc3RyaW5nIGJ1ZmZlcnMuICBBbiBzYiBoYXMgdG8gYmUgY3JlYXRlZCwgdGhpbmdzIGNhbiBiZSBnbHVlZAorICAgb24gdG8gaXQsIGFuZCBhdCB0aGUgZW5kIG9mIGl0J3MgbGlmZSBpdCBzaG91bGQgYmUgZnJlZWQuICBUaGUKKyAgIGNvbnRlbnRzIHNob3VsZCBuZXZlciBiZSBwb2ludGVkIGF0IHdoaWxzdCBpdCBpcyBzdGlsbCBncm93aW5nLAorICAgc2luY2UgaXQgY291bGQgYmUgbW92ZWQgYXQgYW55IHRpbWUKKworICAgZWc6CisgICBzYl9uZXcgKCZmb28pOworICAgc2JfZ3Jvdy4uLiAoJmZvbywuLi4pOworICAgdXNlIGZvby0+cHRyWypdOworICAgc2Jfa2lsbCAoJmZvbyk7CisKKyovCisKKyNkZWZpbmUgZHNpemUgNQorCitzdGF0aWMgdm9pZCBzYl9jaGVjayBQQVJBTVMgKChzYiAqLCBpbnQpKTsKKworLyogU3RhdGlzdGljcyBvZiBzYiBzdHJ1Y3R1cmVzLiAgKi8KKworaW50IHN0cmluZ19jb3VudFtzYl9tYXhfcG93ZXJfdHdvXTsKKworLyogRnJlZSBsaXN0IG9mIHNiIHN0cnVjdHVyZXMuICAqLworCitzdGF0aWMgc2JfbGlzdF92ZWN0b3IgZnJlZV9saXN0OworCisvKiBpbml0aWFsaXplcyBhbiBzYi4gKi8KKwordm9pZAorc2JfYnVpbGQgKHB0ciwgc2l6ZSkKKyAgICAgc2IgKnB0cjsKKyAgICAgaW50IHNpemU7Cit7CisgIC8qIHNlZSBpZiB3ZSBjYW4gZmluZCBvbmUgdG8gYWxsb2NhdGUgKi8KKyAgc2JfZWxlbWVudCAqZTsKKworICBpZiAoc2l6ZSA+IHNiX21heF9wb3dlcl90d28pCisgICAgYWJvcnQgKCk7CisKKyAgZSA9IGZyZWVfbGlzdC5zaXplW3NpemVdOworICBpZiAoIWUpCisgICAgeworICAgICAgLyogbm90aGluZyB0aGVyZSwgYWxsb2NhdGUgb25lIGFuZCBzdGljayBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KKyAgICAgIGUgPSAoc2JfZWxlbWVudCAqKSB4bWFsbG9jIChzaXplb2YgKHNiX2VsZW1lbnQpICsgKDEgPDwgc2l6ZSkpOworICAgICAgZS0+bmV4dCA9IGZyZWVfbGlzdC5zaXplW3NpemVdOworICAgICAgZS0+c2l6ZSA9IDEgPDwgc2l6ZTsKKyAgICAgIGZyZWVfbGlzdC5zaXplW3NpemVdID0gZTsKKyAgICAgIHN0cmluZ19jb3VudFtzaXplXSsrOworICAgIH0KKworICAvKiByZW1vdmUgZnJvbSBmcmVlIGxpc3QgKi8KKworICBmcmVlX2xpc3Quc2l6ZVtzaXplXSA9IGUtPm5leHQ7CisKKyAgLyogY29weSBpbnRvIGNhbGxlcnMgd29ybGQgKi8KKyAgcHRyLT5wdHIgPSBlLT5kYXRhOworICBwdHItPnBvdCA9IHNpemU7CisgIHB0ci0+bGVuID0gMDsKKyAgcHRyLT5pdGVtID0gZTsKK30KKworCit2b2lkCitzYl9uZXcgKHB0cikKKyAgICAgc2IgKnB0cjsKK3sKKyAgc2JfYnVpbGQgKHB0ciwgZHNpemUpOworfQorCisvKiBkZWFsbG9jYXRlIHRoZSBzYiBhdCBwdHIgKi8KKwordm9pZAorc2Jfa2lsbCAocHRyKQorICAgICBzYiAqcHRyOworeworICAvKiByZXR1cm4gaXRlbSB0byBmcmVlIGxpc3QgKi8KKyAgcHRyLT5pdGVtLT5uZXh0ID0gZnJlZV9saXN0LnNpemVbcHRyLT5wb3RdOworICBmcmVlX2xpc3Quc2l6ZVtwdHItPnBvdF0gPSBwdHItPml0ZW07Cit9CisKKy8qIGFkZCB0aGUgc2IgYXQgcyB0byB0aGUgZW5kIG9mIHRoZSBzYiBhdCBwdHIgKi8KKwordm9pZAorc2JfYWRkX3NiIChwdHIsIHMpCisgICAgIHNiICpwdHI7CisgICAgIHNiICpzOworeworICBzYl9jaGVjayAocHRyLCBzLT5sZW4pOworICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMtPnB0ciwgcy0+bGVuKTsKKyAgcHRyLT5sZW4gKz0gcy0+bGVuOworfQorCisvKiBtYWtlIHN1cmUgdGhhdCB0aGUgc2IgYXQgcHRyIGhhcyByb29tIGZvciBhbm90aGVyIGxlbiBjaGFyYWN0ZXJzLAorICAgYW5kIGdyb3cgaXQgaWYgaXQgZG9lc24ndC4gKi8KKworc3RhdGljIHZvaWQKK3NiX2NoZWNrIChwdHIsIGxlbikKKyAgICAgc2IgKnB0cjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaWYgKHB0ci0+bGVuICsgbGVuID49IDEgPDwgcHRyLT5wb3QpCisgICAgeworICAgICAgc2IgdG1wOworICAgICAgaW50IHBvdCA9IHB0ci0+cG90OworICAgICAgd2hpbGUgKHB0ci0+bGVuICsgbGVuID49IDEgPDwgcG90KQorCXBvdCsrOworICAgICAgc2JfYnVpbGQgKCZ0bXAsIHBvdCk7CisgICAgICBzYl9hZGRfc2IgKCZ0bXAsIHB0cik7CisgICAgICBzYl9raWxsIChwdHIpOworICAgICAgKnB0ciA9IHRtcDsKKyAgICB9Cit9CisKKy8qIG1ha2UgdGhlIHNiIGF0IHB0ciBwb2ludCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLworCit2b2lkCitzYl9yZXNldCAocHRyKQorICAgICBzYiAqcHRyOworeworICBwdHItPmxlbiA9IDA7Cit9CisKKy8qIGFkZCBjaGFyYWN0ZXIgYyB0byB0aGUgZW5kIG9mIHRoZSBzYiBhdCBwdHIuICovCisKK3ZvaWQKK3NiX2FkZF9jaGFyIChwdHIsIGMpCisgICAgIHNiICpwdHI7CisgICAgIGludCBjOworeworICBzYl9jaGVjayAocHRyLCAxKTsKKyAgcHRyLT5wdHJbcHRyLT5sZW4rK10gPSBjOworfQorCisvKiBhZGQgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzIHRvIHRoZSBlbmQgb2Ygc2IgYXQgcHRyLiAqLworCit2b2lkCitzYl9hZGRfc3RyaW5nIChwdHIsIHMpCisgICAgIHNiICpwdHI7CisgICAgIGNvbnN0IGNoYXIgKnM7Cit7CisgIGludCBsZW4gPSBzdHJsZW4gKHMpOworICBzYl9jaGVjayAocHRyLCBsZW4pOworICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMsIGxlbik7CisgIHB0ci0+bGVuICs9IGxlbjsKK30KKworLyogYWRkIHN0cmluZyBhdCBzIG9mIGxlbmd0aCBsZW4gdG8gc2IgYXQgcHRyICovCisKK3ZvaWQKK3NiX2FkZF9idWZmZXIgKHB0ciwgcywgbGVuKQorICAgICBzYiAqcHRyOworICAgICBjb25zdCBjaGFyICpzOworICAgICBpbnQgbGVuOworeworICBzYl9jaGVjayAocHRyLCBsZW4pOworICBtZW1jcHkgKHB0ci0+cHRyICsgcHRyLT5sZW4sIHMsIGxlbik7CisgIHB0ci0+bGVuICs9IGxlbjsKK30KKworLyogcHJpbnQgdGhlIHNiIGF0IHB0ciB0byB0aGUgb3V0cHV0IGZpbGUgKi8KKwordm9pZAorc2JfcHJpbnQgKG91dGZpbGUsIHB0cikKKyAgICAgRklMRSAqb3V0ZmlsZTsKKyAgICAgc2IgKnB0cjsKK3sKKyAgaW50IGk7CisgIGludCBuYyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHB0ci0+bGVuOyBpKyspCisgICAgeworICAgICAgaWYgKG5jKQorCXsKKwkgIGZwcmludGYgKG91dGZpbGUsICIsIik7CisJfQorICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgcHRyLT5wdHJbaV0pOworICAgICAgbmMgPSAxOworICAgIH0KK30KKwordm9pZCAKK3NiX3ByaW50X2F0IChvdXRmaWxlLCBpZHgsIHB0cikKKyAgICAgRklMRSAqb3V0ZmlsZTsKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKnB0cjsKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IGlkeDsgaSA8IHB0ci0+bGVuOyBpKyspCisgICAgcHV0YyAocHRyLT5wdHJbaV0sIG91dGZpbGUpOworfQorCisvKiBwdXQgYSBudWxsIGF0IHRoZSBlbmQgb2YgdGhlIHNiIGF0IGluIGFuZCByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZQorICAgc3RyaW5nLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGFuIGFyZyB0byBwcmludGYgJXMuICovCisKK2NoYXIgKgorc2JfbmFtZSAoaW4pCisgICAgIHNiICppbjsKK3sKKyAgLyogc3RpY2sgYSBudWxsIG9uIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworICBzYl9hZGRfY2hhciAoaW4sIDApOworICByZXR1cm4gaW4tPnB0cjsKK30KKworLyogbGlrZSBzYl9uYW1lLCBidXQgZG9uJ3QgaW5jbHVkZSB0aGUgbnVsbCBieXRlIGluIHRoZSBzdHJpbmcuICAqLworCitjaGFyICoKK3NiX3Rlcm1pbmF0ZSAoaW4pCisgICAgIHNiICppbjsKK3sKKyAgc2JfYWRkX2NoYXIgKGluLCAwKTsKKyAgLS1pbi0+bGVuOworICByZXR1cm4gaW4tPnB0cjsKK30KKworLyogc3RhcnQgYXQgdGhlIGluZGV4IGlkeCBpbnRvIHRoZSBzdHJpbmcgaW4gc2IgYXQgcHRyIGFuZCBza2lwCisgICB3aGl0ZXNwYWNlLiByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgKi8KKworaW50CitzYl9za2lwX3doaXRlIChpZHgsIHB0cikKKyAgICAgaW50IGlkeDsKKyAgICAgc2IgKnB0cjsKK3sKKyAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCisJICYmIChwdHItPnB0cltpZHhdID09ICcgJworCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKKyAgICBpZHgrKzsKKyAgcmV0dXJuIGlkeDsKK30KKworLyogc3RhcnQgYXQgdGhlIGluZGV4IGlkeCBpbnRvIHRoZSBzYiBhdCBwdHIuIHNraXBzIHdoaXRlc3BhY2UsCisgICBhIGNvbW1hIGFuZCBhbnkgZm9sbG93aW5nIHdoaXRlc3BhY2UuIHJldHVybmVzIHRoZSBpbmRleCBvZiB0aGUKKyAgIG5leHQgY2hhcmFjdGVyLiAqLworCitpbnQKK3NiX3NraXBfY29tbWEgKGlkeCwgcHRyKQorICAgICBpbnQgaWR4OworICAgICBzYiAqcHRyOworeworICB3aGlsZSAoaWR4IDwgcHRyLT5sZW4KKwkgJiYgKHB0ci0+cHRyW2lkeF0gPT0gJyAnCisJICAgICB8fCBwdHItPnB0cltpZHhdID09ICdcdCcpKQorICAgIGlkeCsrOworCisgIGlmIChpZHggPCBwdHItPmxlbgorICAgICAgJiYgcHRyLT5wdHJbaWR4XSA9PSAnLCcpCisgICAgaWR4Kys7CisKKyAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCisJICYmIChwdHItPnB0cltpZHhdID09ICcgJworCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKKyAgICBpZHgrKzsKKworICByZXR1cm4gaWR4OworfQpkaWZmIC0tZ2l0IGEvZ2FzL3NiLmggYi9nYXMvc2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTZkYWYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3NiLmgKQEAgLTAsMCArMSw5OSBAQAorLyogc2IuaCAtIGhlYWRlciBmaWxlIGZvciBzdHJpbmcgYnVmZmVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcworICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAorICAgICAgc2FjQGN5Z251cy5jb20KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaWZuZGVmIFNCX0gKKworI2RlZmluZSBTQl9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKy8qIHN0cmluZyBibG9ja3MKKworICAgSSBoYWQgYSBjb3VwbGUgb2YgY2hvaWNlcyB3aGVuIGRlY2lkaW5nIHVwb24gdGhpcyBkYXRhIHN0cnVjdHVyZS4KKyAgIGdhcyB1c2VzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIGZvciBhbGwgaXRzIGludGVybmFsIHdvcmsuICBUaGlzCisgICBvZnRlbiBtZWFucyB0aGF0IHBhcnRzIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2FudCB0byBleGFtaW5lCisgICBzdWJzdHJpbmdzIGhhdmUgdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSBpbiB0aGUgc3RyaW5nIHRvIGRvIHRoZQorICAgcmlnaHQgdGhpbmcgKGEgY29tbW9uIG9wZXJhdGlvbiBpcyB0byBzaW5nbGUgb3V0IGEgYml0IG9mIHRleHQgYnkKKyAgIHNhdmluZyBhd2F5IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQsIG51bGxpbmcgaXQgb3V0LCBvcGVyYXRpbmcgb24KKyAgIHRoZSBzdWJzdHJpbmcgYW5kIHRoZW4gcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVuZGVyIHRoZQorICAgbnVsbCkuICBUaGlzIGlzIGEgcGFpbiBhbmQgSSByZW1lbWJlciBhIGxvYWQgb2YgcHJvYmxlbXMgdGhhdCBJIGhhZCB3aXRoCisgICBjb2RlIGluIGdhcyB3aGljaCBhbG1vc3QgZ290IHRoaXMgcmlnaHQuICBBbHNvLCBpdCdzIGhhcmRlciB0byBncm93IGFuZAorICAgYWxsb2NhdGUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgZWZmaWNpZW50bHkuCisKKyAgIE9ic3RhY2tzIHByb3ZpZGUgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCwgYnV0IGFyZSB0b28KKyAgIGNvbXBsaWNhdGVkLCBoZW5jZSB0aGUgc2IuCisKKyAgIEFuIHNiIGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLCBhbmQgaXMgaW5pdGlhbHplZCB0byBwb2ludCB0byBhbgorICAgc2JfZWxlbWVudC4gIHNiX2VsZW1lbnRzIGFyZSBrZXB0IG9uIGEgZnJlZSBsaXN0cywgYW5kIHVzZWQgd2hlbgorICAgbmVlZGVkLCByZXBsYWNlZCBvbnRvIHRoZSBmcmVlIGxpc3Qgd2hlbiB1bnVzZWQuCisgKi8KKworI2RlZmluZSBzYl9tYXhfcG93ZXJfdHdvICAgIDMwCS8qIGRvbid0IGFsbG93IHN0cmluZ3MgbW9yZSB0aGFuCisJCQkgICAgICAgICAgIDJec2JfbWF4X3Bvd2VyX3R3byBsb25nICovCisvKiBzdHJ1Y3R1cmUgb2YgYW4gc2IgKi8KK3R5cGVkZWYgc3RydWN0IHNiCisgIHsKKyAgICBjaGFyICpwdHI7CQkJLyogcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAqLworICAgIGludCBsZW47CQkJLyogaG93IG11Y2ggaXMgdXNlZC4gKi8KKyAgICBpbnQgcG90OwkJCS8qIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyAxPDxwb3QgKi8KKyAgICBzdHJ1Y3QgbGUgKml0ZW07CisgIH0KK3NiOworCisvKiBTdHJ1Y3R1cmUgb2YgdGhlIGZyZWUgbGlzdCBvYmplY3Qgb2YgYW4gc2IgKi8KK3R5cGVkZWYgc3RydWN0IGxlCisgIHsKKyAgICBzdHJ1Y3QgbGUgKm5leHQ7CisgICAgaW50IHNpemU7CisgICAgY2hhciBkYXRhWzFdOworICB9CitzYl9lbGVtZW50OworCisvKiBUaGUgZnJlZSBsaXN0ICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgc2JfZWxlbWVudCAqc2l6ZVtzYl9tYXhfcG93ZXJfdHdvXTsKKyAgfSBzYl9saXN0X3ZlY3RvcjsKKworZXh0ZXJuIGludCBzdHJpbmdfY291bnRbc2JfbWF4X3Bvd2VyX3R3b107CisKK2V4dGVybiB2b2lkIHNiX2J1aWxkIFBBUkFNUyAoKHNiICosIGludCkpOworZXh0ZXJuIHZvaWQgc2JfbmV3IFBBUkFNUyAoKHNiICopKTsKK2V4dGVybiB2b2lkIHNiX2tpbGwgUEFSQU1TICgoc2IgKikpOworZXh0ZXJuIHZvaWQgc2JfYWRkX3NiIFBBUkFNUyAoKHNiICosIHNiICopKTsKK2V4dGVybiB2b2lkIHNiX3Jlc2V0IFBBUkFNUyAoKHNiICopKTsKK2V4dGVybiB2b2lkIHNiX2FkZF9jaGFyIFBBUkFNUyAoKHNiICosIGludCkpOworZXh0ZXJuIHZvaWQgc2JfYWRkX3N0cmluZyBQQVJBTVMgKChzYiAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIHNiX2FkZF9idWZmZXIgUEFSQU1TICgoc2IgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIHNiX3ByaW50IFBBUkFNUyAoKEZJTEUgKiwgc2IgKikpOworZXh0ZXJuIHZvaWQgc2JfcHJpbnRfYXQgUEFSQU1TICgoRklMRSAqLCBpbnQsIHNiICopKTsKK2V4dGVybiBjaGFyICpzYl9uYW1lIFBBUkFNUyAoKHNiICopKTsKK2V4dGVybiBjaGFyICpzYl90ZXJtaW5hdGUgUEFSQU1TICgoc2IgKikpOworZXh0ZXJuIGludCBzYl9za2lwX3doaXRlIFBBUkFNUyAoKGludCwgc2IgKikpOworZXh0ZXJuIGludCBzYl9za2lwX2NvbW1hIFBBUkFNUyAoKGludCwgc2IgKikpOworCisvKiBBY3R1YWxseSBpbiBpbnB1dC1zY3J1Yi5jLiAgKi8KK2V4dGVybiB2b2lkIGlucHV0X3NjcnViX2luY2x1ZGVfc2IgUEFSQU1TICgoc2IgKiwgY2hhciAqKSk7CisKKyNlbmRpZiAvKiBTQl9IICovCmRpZmYgLS1naXQgYS9nYXMvc3RhYnMuYyBiL2dhcy9zdGFicy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2UxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvc3RhYnMuYwpAQCAtMCwwICsxLDYzMiBAQAorLyogR2VuZXJpYyBzdGFicyBwYXJzaW5nIGZvciBnYXMuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSAiYXMuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorI2luY2x1ZGUgImVjb2ZmLmgiCisKKy8qIFdlIG5lZWQgdGhpcywgZGVzcGl0ZSB0aGUgYXBwYXJlbnQgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbmN5LCBzaW5jZQorICAgaXQgZGVmaW5lcyBzdGFiIHR5cGVzLCB3aGljaCBhbGwgb2JqZWN0IGZvcm1hdHMgY2FuIHVzZSBub3cuICovCisKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCisKK3N0YXRpYyB2b2lkIHNfc3RhYl9nZW5lcmljIFBBUkFNUyAoKGludCwgY2hhciAqLCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX2FzbV9maWxlIFBBUkFNUyAoKGludCwgY2hhciAqKSk7CisKKy8qIEFsbG93IGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZSBuYW1lcyB1c2VkIGZvciB0aGUgc3RhYiBzZWN0aW9ucy4gICovCisjaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCisjZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKKyNlbmRpZgorCisjaWZuZGVmIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRQorI2RlZmluZSBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUgIi5zdGFic3RyIgorI2VuZGlmCisKKy8qIE5vbi16ZXJvIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAuZnVuYyBmdW5jdGlvbiwgaW4gd2hpY2ggY2FzZQorICAgc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyBlbWl0cyBmdW5jdGlvbiByZWxhdGl2ZSBsaW5lIG51bWJlciBzdGFicy4KKyAgIE90aGVyd2lzZSBpdCBlbWl0cyBsaW5lIG51bWJlciBzdGFicyB3aXRoIGFic29sdXRlIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdAorICAgYm90aCBjYXNlcyBvbmx5IGFwcGx5IHRvIGFzc2VtYmxlciBjb2RlIGFzc2VtYmxlZCB3aXRoIC1nc3RhYnMuICAqLworc3RhdGljIGludCBpbl9kb3RfZnVuY19wOworCisvKiBMYWJlbCBhdCBzdGFydCBvZiBjdXJyZW50IGZ1bmN0aW9uIGlmIGluX2RvdF9mdW5jX3AgIT0gMC4gICovCitzdGF0aWMgY29uc3QgY2hhciAqY3VycmVudF9mdW5jdGlvbl9sYWJlbDsKKworLyoKKyAqIEhhbmRsZSAuc3RhYlggZGlyZWN0aXZlcywgd2hpY2ggdXNlZCB0byBiZSBvcGVuLWNvZGVkLgorICogU28gbXVjaCBjcmVlcGluZyBmZWF0dXJpc20gb3ZlcmxvYWRlZCB0aGUgc2VtYW50aWNzIHRoYXQgd2UgZGVjaWRlZAorICogdG8gcHV0IGFsbCAuc3RhYlggdGhpbmtpbmcgaW4gb25lIHBsYWNlLiBIZXJlLgorICoKKyAqIFdlIHRyeSB0byBtYWtlIGFueSAuc3RhYlggZGlyZWN0aXZlIGxlZ2FsLiBPdGhlciBwZW9wbGUncyBBUyB3aWxsIG9mdGVuCisgKiBkbyBhc3NlbWJseS10aW1lIGNvbnNpc3RlbmN5IGNoZWNrczogZWcgYXNzaWduaW5nIG1lYW5pbmcgdG8gbl90eXBlIGJpdHMKKyAqIGFuZCAicHJvdGVjdGluZyIgeW91IGZyb20gc2V0dGluZyB0aGVtIHRvIGNlcnRhaW4gdmFsdWVzLiAoVGhleSBhbHNvIHplcm8KKyAqIGNlcnRhaW4gYml0cyBiZWZvcmUgZW1pdHRpbmcgc3ltYm9scy4gVHV0IHR1dC4pCisgKgorICogSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgYWJzb2x1dGUgd2UgZWl0aGVyIGdyaXBlIG9yIHVzZSB0aGUgcmVsb2NhdGlvbgorICogaW5mb3JtYXRpb24uIE90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMgc2lsZW50bHkgZm9yZ2V0IGluZm9ybWF0aW9uIHRoZXkKKyAqIGRvbid0IG5lZWQgYW5kIGludmVudCBpbmZvcm1hdGlvbiB0aGV5IG5lZWQgdGhhdCB5b3UgZGlkbid0IHN1cHBseS4KKyAqLworCisvKgorICogQnVpbGQgYSBzdHJpbmcgZGljdGlvbmFyeSBlbnRyeSBmb3IgYSAuc3RhYlggc3ltYm9sLgorICogVGhlIHN5bWJvbCBpcyBhZGRlZCB0byB0aGUgLjxzZWNuYW1lPnN0ciBzZWN0aW9uLgorICovCisKKyNpZm5kZWYgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUworI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDAKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQKK2dldF9zdGFiX3N0cmluZ19vZmZzZXQgKHN0cmluZywgc3RhYnN0cl9zZWNuYW1lKQorICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGNvbnN0IGNoYXIgKnN0YWJzdHJfc2VjbmFtZTsKK3sKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IHJldHZhbDsKKyAgc2VnVCBzYXZlX3NlZzsKKyAgc3Vic2VnVCBzYXZlX3N1YnNlZzsKKyAgc2VnVCBzZWc7CisgIGNoYXIgKnA7CisKKyAgaWYgKCEgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUykKKyAgICBhYm9ydCAoKTsKKworICBsZW5ndGggPSBzdHJsZW4gKHN0cmluZyk7CisKKyAgc2F2ZV9zZWcgPSBub3dfc2VnOworICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7CisKKyAgLyogQ3JlYXRlIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uLiAgKi8KKyAgc2VnID0gc3Vic2VnX25ldyAoc3RhYnN0cl9zZWNuYW1lLCAwKTsKKworICByZXR2YWwgPSBzZWdfaW5mbyAoc2VnKS0+c3RhYnUuc3RhYl9zdHJpbmdfc2l6ZTsKKyAgaWYgKHJldHZhbCA8PSAwKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZmlyc3Qgc3RyaW5nIGlzIGVtcHR5LiAgKi8KKyAgICAgIHAgPSBmcmFnX21vcmUgKDEpOworICAgICAgKnAgPSAwOworICAgICAgcmV0dmFsID0gc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemUgPSAxOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsIFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkcpOworICAgICAgaWYgKHNlZy0+bmFtZSA9PSBzdGFic3RyX3NlY25hbWUpCisJc2VnLT5uYW1lID0geHN0cmR1cCAoc3RhYnN0cl9zZWNuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICBpZiAobGVuZ3RoID4gMCkKKyAgICB7CQkJCS8qIE9yZGluYXJ5IGNhc2UuICovCisgICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKKyAgICAgIHN0cmNweSAocCwgc3RyaW5nKTsKKworICAgICAgc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemUgKz0gbGVuZ3RoICsgMTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR2YWwgPSAwOworCisgIHN1YnNlZ19zZXQgKHNhdmVfc2VnLCBzYXZlX3N1YnNlZyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIEFPVVRfU1RBQlMKKyNpZm5kZWYgT0JKX1BST0NFU1NfU1RBQgorI2RlZmluZSBPQkpfUFJPQ0VTU19TVEFCKFNFRyxXLFMsVCxPLEQpCWFvdXRfcHJvY2Vzc19zdGFiKFcsUyxULE8sRCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhb3V0X3Byb2Nlc3Nfc3RhYiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCkpOworCitzdGF0aWMgdm9pZAorYW91dF9wcm9jZXNzX3N0YWIgKHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCisgICAgIGludCB3aGF0OworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGludCB0eXBlLCBvdGhlciwgZGVzYzsKK3sKKyAgLyogUHV0IHRoZSBzdGFiIGluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworICBzeW1ib2xTICpzeW1ib2w7CisKKyAgLyogQ3JlYXRlIHRoZSBzeW1ib2wgbm93LCBidXQgb25seSBpbnNlcnQgaXQgaW50byB0aGUgc3ltYm9sIGNoYWluCisgICAgIGFmdGVyIGFueSBzeW1ib2xzIG1lbnRpb25lZCBpbiB0aGUgdmFsdWUgZXhwcmVzc2lvbiBnZXQgaW50byB0aGUKKyAgICAgc3ltYm9sIGNoYWluLiAgVGhpcyBpcyB0byBhdm9pZCAiY29udGludWF0aW9uIHN5bWJvbHMiICh3aGVyZSBvbmUKKyAgICAgZW5kcyBpbiAiXCIgYW5kIHRoZSBkZWJ1ZyBpbmZvIGlzIGNvbnRpbnVlZCBpbiB0aGUgbmV4dCAuc3RhYnMKKyAgICAgZGlyZWN0aXZlKSBmcm9tIGJlaW5nIHNlcGFyYXRlZCBieSBvdGhlciByYW5kb20gc3ltYm9scy4gICovCisgIHN5bWJvbCA9IHN5bWJvbF9jcmVhdGUgKHN0cmluZywgdW5kZWZpbmVkX3NlY3Rpb24sIDAsCisJCQkgIChzdHJ1Y3QgZnJhZyAqKSBOVUxMKTsKKyAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQorICAgIHsKKyAgICAgIC8qIFBpY2sgdXAgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0IGxpbmUuICAqLworICAgICAgc3ltYm9sLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworICAgICAgcHNldWRvX3NldCAoc3ltYm9sKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAuc3RhYmQgc2V0cyB0aGUgbmFtZSB0byBOVUxMLiAgV2h5PyAgKi8KKyAgICAgIFNfU0VUX05BTUUgKHN5bWJvbCwgTlVMTCk7CisgICAgICBzeW1ib2wtPnN5X2ZyYWcgPSBmcmFnX25vdzsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2wsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisgICAgfQorCisgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKworICBTX1NFVF9UWVBFIChzeW1ib2wsIHR5cGUpOworICBTX1NFVF9PVEhFUiAoc3ltYm9sLCBvdGhlcik7CisgIFNfU0VUX0RFU0MgKHN5bWJvbCwgZGVzYyk7Cit9CisjZW5kaWYKKworLyogVGhpcyBjYW4gaGFuZGxlIGRpZmZlcmVudCBraW5kcyBvZiBzdGFicyAocyxuLGQpIGFuZCBkaWZmZXJlbnQKKyAgIGtpbmRzIG9mIHN0YWIgc2VjdGlvbnMuICovCisKK3N0YXRpYyB2b2lkIAorc19zdGFiX2dlbmVyaWMgKHdoYXQsIHN0YWJfc2VjbmFtZSwgc3RhYnN0cl9zZWNuYW1lKQorICAgICBpbnQgd2hhdDsKKyAgICAgY2hhciAqc3RhYl9zZWNuYW1lOworICAgICBjaGFyICpzdGFic3RyX3NlY25hbWU7Cit7CisgIGxvbmcgbG9uZ2ludDsKKyAgY2hhciAqc3RyaW5nOworICBpbnQgdHlwZTsKKyAgaW50IG90aGVyOworICBpbnQgZGVzYzsKKworICAvKiBUaGUgZ2VuZXJhbCBmb3JtYXQgaXM6CisgICAgIC5zdGFicyAiU1RSSU5HIixUWVBFLE9USEVSLERFU0MsVkFMVUUKKyAgICAgLnN0YWJuIFRZUEUsT1RIRVIsREVTQyxWQUxVRQorICAgICAuc3RhYmQgVFlQRSxPVEhFUixERVNDCisgICAgIEF0IHRoaXMgcG9pbnQgaW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyBhZnRlciB0aGUgcHNldWRvLW9wIGFuZAorICAgICBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIFRoZSBhcmd1bWVudCB3aGF0IGlzIG9uZSBvZiAncycsICduJyBvcgorICAgICAnZCcgaW5kaWNhdGluZyB3aGljaCB0eXBlIG9mIC5zdGFiIHRoaXMgaXMuICAqLworCisgIGlmICh3aGF0ICE9ICdzJykKKyAgICBzdHJpbmcgPSAiIjsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBsZW5ndGg7CisKKyAgICAgIHN0cmluZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuZ3RoKTsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKwlpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIGVsc2UKKwl7CisJICBhc193YXJuIChfKCIuc3RhYnM6IE1pc3NpbmcgY29tbWEiKSk7CisJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbG9uZ2ludCkgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgdHlwZSA9IGxvbmdpbnQ7CisKKyAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmbG9uZ2ludCkgIT0gJywnKQorICAgIHsKKyAgICAgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7CisgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgb3RoZXIgPSBsb25naW50OworCisgIGRlc2MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQorICAgIHsKKyAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKwl7CisJICBhc193YXJuIChfKCIuc3RhYiVjOiBNaXNzaW5nIGNvbW1hIiksIHdoYXQpOworCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKKyAgICB9CisKKyNpZmRlZiBUQ19QUEMKKyNpZmRlZiBPQkpfRUxGCisgIC8qIFNvbGFyaXMgb24gUG93ZXJQQyBoYXMgZGVjaWRlZCB0aGF0IC5zdGFiZCBjYW4gdGFrZSA0IGFyZ3VtZW50cywgc28gaWYgd2Ugd2VyZQorICAgICBnaXZlbiA0IGFyZ3VtZW50cywgbWFrZSBpdCBhIC5zdGFibiAqLworICBlbHNlIGlmICh3aGF0ID09ICdkJykKKyAgICB7CisgICAgICBjaGFyICpzYXZlX2xvY2F0aW9uID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCisJeworCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CisJICB3aGF0ID0gJ24nOworCX0KKyAgICAgIGVsc2UKKwlpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2xvY2F0aW9uOworICAgIH0KKyNlbmRpZiAvKiBPQkpfRUxGICovCisjZW5kaWYgLyogVENfUFBDICovCisKKyNpZm5kZWYgTk9fTElTVElORworICBpZiAobGlzdGluZykKKyAgICB7CisgICAgICBzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgTl9TTElORToKKwkgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGRlc2MpOworCSAgYnJlYWs7CisJY2FzZSBOX1NPOgorCWNhc2UgTl9TT0w6CisJICBsaXN0aW5nX3NvdXJjZV9maWxlIChzdHJpbmcpOworCSAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZiAvKiAhIE5PX0xJU1RJTkcgKi8KKworICAvKiBXZSBoYXZlIG5vdyBnYXRoZXJlZCB0aGUgdHlwZSwgb3RoZXIsIGFuZCBkZXNjIGluZm9ybWF0aW9uLiAgRm9yCisgICAgIC5zdGFicyBvciAuc3RhYm4sIGlucHV0X2xpbmVfcG9pbnRlciBpcyBub3cgcG9pbnRpbmcgYXQgdGhlCisgICAgIHZhbHVlLiAgKi8KKworICBpZiAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUykKKyAgICAvKiBPdXRwdXQgdGhlIHN0YWIgaW5mb3JtYXRpb24gaW4gYSBzZXBhcmF0ZSBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkCisgICAgICAgYXQgbGVhc3QgZm9yIENPRkYgYW5kIEVMRi4gICovCisgICAgeworICAgICAgc2VnVCBzYXZlZF9zZWcgPSBub3dfc2VnOworICAgICAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOworICAgICAgZnJhZ1MgKnNhdmVkX2ZyYWcgPSBmcmFnX25vdzsKKyAgICAgIHZhbHVlVCBkb3Q7CisgICAgICBzZWdUIHNlZzsKKyAgICAgIHVuc2lnbmVkIGludCBzdHJvZmY7CisgICAgICBjaGFyICpwOworCisgICAgICBzdGF0aWMgc2VnVCBjYWNoZWRfc2VjOworICAgICAgc3RhdGljIGNoYXIgKmNhY2hlZF9zZWNuYW1lOworCisgICAgICBkb3QgPSBmcmFnX25vd19maXggKCk7CisKKyNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAorICAgICAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7CisjZW5kaWYKKworICAgICAgaWYgKGNhY2hlZF9zZWNuYW1lICYmICFzdHJjbXAgKGNhY2hlZF9zZWNuYW1lLCBzdGFiX3NlY25hbWUpKQorCXsKKwkgIHNlZyA9IGNhY2hlZF9zZWM7CisJICBzdWJzZWdfc2V0IChzZWcsIDApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzZWcgPSBzdWJzZWdfbmV3IChzdGFiX3NlY25hbWUsIDApOworCSAgaWYgKGNhY2hlZF9zZWNuYW1lKQorCSAgICBmcmVlIChjYWNoZWRfc2VjbmFtZSk7CisJICBjYWNoZWRfc2VjbmFtZSA9IHhzdHJkdXAgKHN0YWJfc2VjbmFtZSk7CisJICBjYWNoZWRfc2VjID0gc2VnOworCX0KKworICAgICAgaWYgKCEgc2VnX2luZm8gKHNlZyktPmhhZG9uZSkKKwl7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKKwkJCQkgU0VDX1JFQURPTkxZIHwgU0VDX1JFTE9DIHwgU0VDX0RFQlVHR0lORyk7CisjZW5kaWYKKyNpZmRlZiBJTklUX1NUQUJfU0VDVElPTgorCSAgSU5JVF9TVEFCX1NFQ1RJT04gKHNlZyk7CisjZW5kaWYKKwkgIHNlZ19pbmZvIChzZWcpLT5oYWRvbmUgPSAxOworCX0KKworICAgICAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoc3RyaW5nLCBzdGFic3RyX3NlY25hbWUpOworICAgICAgaWYgKHdoYXQgPT0gJ3MnKQorCXsKKwkgIC8qIHJlbGVhc2UgdGhlIHN0cmluZyAqLworCSAgb2JzdGFja19mcmVlICgmbm90ZXMsIHN0cmluZyk7CisJfQorCisgICAgICAvKiBBdCBsZWFzdCBmb3Igbm93LCBzdGFicyBpbiBhIHNwZWNpYWwgc3RhYiBzZWN0aW9uIGFyZSBhbHdheXMKKwkgb3V0cHV0IGFzIDEyIGJ5dGUgYmxvY2tzIG9mIGluZm9ybWF0aW9uLiAgKi8KKyAgICAgIHAgPSBmcmFnX21vcmUgKDgpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBzdHJvZmYsIDQpOworICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgNCwgKHZhbHVlVCkgdHlwZSwgMSk7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA1LCAodmFsdWVUKSBvdGhlciwgMSk7CisgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA2LCAodmFsdWVUKSBkZXNjLCAyKTsKKworICAgICAgaWYgKHdoYXQgPT0gJ3MnIHx8IHdoYXQgPT0gJ24nKQorCXsKKwkgIC8qIFBpY2sgdXAgdGhlIHZhbHVlIGZyb20gdGhlIGlucHV0IGxpbmUuICAqLworCSAgY29ucyAoNCk7CisJICBpbnB1dF9saW5lX3BvaW50ZXItLTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3QgY2hhciAqZmFrZTsKKwkgIHN5bWJvbFMgKnN5bWJvbDsKKwkgIGV4cHJlc3Npb25TIGV4cDsKKworCSAgLyogQXJyYW5nZSBmb3IgYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbG9jYXRpb24uICAqLworCSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKKwkgIHN5bWJvbCA9IHN5bWJvbF9uZXcgKGZha2UsIHNhdmVkX3NlZywgZG90LCBzYXZlZF9mcmFnKTsKKworCSAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKKwkgIGV4cC5YX2FkZF9zeW1ib2wgPSBzeW1ib2w7CisJICBleHAuWF9hZGRfbnVtYmVyID0gMDsKKworCSAgZW1pdF9leHByICgmZXhwLCA0KTsKKwl9CisKKyNpZmRlZiBPQkpfUFJPQ0VTU19TVEFCCisgICAgICBPQkpfUFJPQ0VTU19TVEFCIChzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpOworI2VuZGlmCisKKyAgICAgIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgT0JKX1BST0NFU1NfU1RBQgorICAgICAgT0JKX1BST0NFU1NfU1RBQiAoMCwgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYyk7CisjZWxzZQorICAgICAgYWJvcnQgKCk7CisjZW5kaWYKKyAgICB9CisKKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30KKworLyogUmVndWxhciBzdGFiIGRpcmVjdGl2ZS4gKi8KKwordm9pZAorc19zdGFiICh3aGF0KQorICAgICBpbnQgd2hhdDsKK3sKKyAgc19zdGFiX2dlbmVyaWMgKHdoYXQsIFNUQUJfU0VDVElPTl9OQU1FLCBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUpOworfQorCisvKiAiRXh0ZW5kZWQgc3RhYnMiLCB1c2VkIGluIFNvbGFyaXMgb25seSBub3cuICovCisKK3ZvaWQKK3NfeHN0YWIgKHdoYXQpCisgICAgIGludCB3aGF0OworeworICBpbnQgbGVuZ3RoOworICBjaGFyICpzdGFiX3NlY25hbWUsICpzdGFic3RyX3NlY25hbWU7CisgIHN0YXRpYyBjaGFyICpzYXZlZF9zZWNuYW1lLCAqc2F2ZWRfc3Ryc2VjbmFtZTsKKworICAvKiBAQCBNRU1PUlkgTEVBSzogVGhpcyBhbGxvY2F0ZXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcsIGJ1dCBpbiBtb3N0CisgICAgIGNhc2VzIGl0IHdpbGwgYmUgdGhlIHNhbWUgc3RyaW5nLCBzbyB3ZSBjb3VsZCByZWxlYXNlIHRoZSBzdG9yYWdlCisgICAgIGJhY2sgdG8gdGhlIG9ic3RhY2sgaXQgY2FtZSBmcm9tLiAgKi8KKyAgc3RhYl9zZWNuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW5ndGgpOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKKyAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgZWxzZQorICAgIHsKKyAgICAgIGFzX2JhZCAoXygiY29tbWEgbWlzc2luZyBpbiAueHN0YWJzIikpOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogVG8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uLCBzaW1wbHkgYWRkICJzdHIiIHRvCisgICAgIHRoZSBzdGFiIHNlY3Rpb24gbmFtZS4gICovCisgIGlmIChzYXZlZF9zZWNuYW1lID09IDAgfHwgc3RyY21wIChzYXZlZF9zZWNuYW1lLCBzdGFiX3NlY25hbWUpKQorICAgIHsKKyAgICAgIHN0YWJzdHJfc2VjbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RhYl9zZWNuYW1lKSArIDQpOworICAgICAgc3RyY3B5IChzdGFic3RyX3NlY25hbWUsIHN0YWJfc2VjbmFtZSk7CisgICAgICBzdHJjYXQgKHN0YWJzdHJfc2VjbmFtZSwgInN0ciIpOworICAgICAgaWYgKHNhdmVkX3NlY25hbWUpCisJeworCSAgZnJlZSAoc2F2ZWRfc2VjbmFtZSk7CisJICBmcmVlIChzYXZlZF9zdHJzZWNuYW1lKTsKKwl9CisgICAgICBzYXZlZF9zZWNuYW1lID0gc3RhYl9zZWNuYW1lOworICAgICAgc2F2ZWRfc3Ryc2VjbmFtZSA9IHN0YWJzdHJfc2VjbmFtZTsKKyAgICB9CisgIHNfc3RhYl9nZW5lcmljICh3aGF0LCBzYXZlZF9zZWNuYW1lLCBzYXZlZF9zdHJzZWNuYW1lKTsKK30KKworI2lmZGVmIFNfU0VUX0RFU0MKKworLyogRnJvYiBpbnZlbnRlZCBhdCBSTVMnIHJlcXVlc3QuIFNldCB0aGUgbl9kZXNjIG9mIGEgc3ltYm9sLiAgKi8KKwordm9pZCAKK3NfZGVzYyAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBjaGFyICpuYW1lOworICBjaGFyIGM7CisgIGNoYXIgKnA7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisgIGludCB0ZW1wOworCisgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKKyAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKKyAgKnAgPSBjOworICBTS0lQX1dISVRFU1BBQ0UgKCk7CisgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKKyAgICB7CisgICAgICAqcCA9IDA7CisgICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIiksIG5hbWUpOworICAgICAgKnAgPSBjOworICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKKyAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKKyAgICAgICpwID0gMDsKKyAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKKyAgICAgICpwID0gYzsKKyAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIHRlbXApOworICAgIH0KKyAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKK30JCQkJLyogc19kZXNjKCkgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgKFNfU0VUX0RFU0MpICovCisKKy8qIEdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgdGhlIG1haW4gc291cmNlIGZpbGUuICAqLworCit2b2lkCitzdGFic19nZW5lcmF0ZV9hc21fZmlsZSAoKQoreworICBjaGFyICpmaWxlOworICB1bnNpZ25lZCBpbnQgbGluZW5vOworCisgIGFzX3doZXJlICgmZmlsZSwgJmxpbmVubyk7CisgIGdlbmVyYXRlX2FzbV9maWxlIChOX1NPLCBmaWxlKTsKK30KKworLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgc291cmNlIGZpbGUuCisgICBUWVBFIGlzIG9uZSBvZiBOX1NPLCBOX1NPTC4gICovCisKK3N0YXRpYyB2b2lkCitnZW5lcmF0ZV9hc21fZmlsZSAodHlwZSwgZmlsZSkKKyAgICAgaW50IHR5cGU7CisgICAgIGNoYXIgKmZpbGU7Cit7CisgIHN0YXRpYyBjaGFyICpsYXN0X2ZpbGU7CisgIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7CisgIGNoYXIgKmhvbGQ7CisgIGNoYXIgYnVmWzEwMF07CisgIGNoYXIgc3ltWzMwXTsKKworICAvKiBSYXRoZXIgdGhhbiB0cnkgdG8gZG8gdGhpcyBpbiBzb21lIGVmZmljaWVudCBmYXNoaW9uLCB3ZSBqdXN0CisgICAgIGdlbmVyYXRlIGEgc3RyaW5nIGFuZCB0aGVuIHBhcnNlIGl0IGFnYWluLiAgVGhhdCBsZXRzIHVzIHVzZSB0aGUKKyAgICAgZXhpc3Rpbmcgc3RhYnMgaG9vaywgd2hpY2ggZXhwZWN0IHRvIHNlZSBhIHN0cmluZywgcmF0aGVyIHRoYW4KKyAgICAgaW52ZW50aW5nIG5ldyBvbmVzLiAgKi8KKworICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworCisgIGlmIChsYXN0X2ZpbGUgPT0gTlVMTAorICAgICAgfHwgc3RyY21wIChsYXN0X2ZpbGUsIGZpbGUpICE9IDApCisgICAgeworICAgICAgc3ByaW50ZiAoc3ltLCAiJXNGJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKKyAgICAgICsrbGFiZWxfY291bnQ7CisKKyAgICAgIHNwcmludGYgKGJ1ZiwgIlwiJXNcIiwlZCwwLDAsJXNcbiIsIGZpbGUsIHR5cGUsIHN5bSk7CisgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7CisgICAgICBzX3N0YWIgKCdzJyk7CisgICAgICBjb2xvbiAoc3ltKTsKKworICAgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQorCWZyZWUgKGxhc3RfZmlsZSk7CisgICAgICBsYXN0X2ZpbGUgPSB4c3RyZHVwIChmaWxlKTsKKyAgICB9CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKK30KKworLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBsaW5lLiAgVGhpcyBpcworICAgdXNlZCB0byBwcm9kdWNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibGVyIGZpbGUuICAqLworCit2b2lkCitzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vICgpCit7CisgIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7CisgIGNoYXIgKmhvbGQ7CisgIGNoYXIgKmZpbGU7CisgIHVuc2lnbmVkIGludCBsaW5lbm87CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciBzeW1bMzBdOworCisgIC8qIFJhdGhlciB0aGFuIHRyeSB0byBkbyB0aGlzIGluIHNvbWUgZWZmaWNpZW50IGZhc2hpb24sIHdlIGp1c3QKKyAgICAgZ2VuZXJhdGUgYSBzdHJpbmcgYW5kIHRoZW4gcGFyc2UgaXQgYWdhaW4uICBUaGF0IGxldHMgdXMgdXNlIHRoZQorICAgICBleGlzdGluZyBzdGFicyBob29rLCB3aGljaCBleHBlY3QgdG8gc2VlIGEgc3RyaW5nLCByYXRoZXIgdGhhbgorICAgICBpbnZlbnRpbmcgbmV3IG9uZXMuICAqLworCisgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisKKyAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKKworICBnZW5lcmF0ZV9hc21fZmlsZSAoTl9TT0wsIGZpbGUpOworCisgIHNwcmludGYgKHN5bSwgIiVzTCVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7CisgICsrbGFiZWxfY291bnQ7CisKKyAgaWYgKGluX2RvdF9mdW5jX3ApCisgICAgeworICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhICgxMDAgKyBzdHJsZW4gKGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpKTsKKyAgICAgIHNwcmludGYgKGJ1ZiwgIiVkLDAsJWQsJXMtJXNcbiIsIE5fU0xJTkUsIGxpbmVubywKKwkgICAgICAgc3ltLCBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKDEwMCk7CisgICAgICBzcHJpbnRmIChidWYsICIlZCwwLCVkLCVzXG4iLCBOX1NMSU5FLCBsaW5lbm8sIHN5bSk7CisgICAgfQorICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7CisgIHNfc3RhYiAoJ24nKTsKKyAgY29sb24gKHN5bSk7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKK30KKworLyogRW1pdCBhIGZ1bmN0aW9uIHN0YWIuCisgICBBbGwgYXNzZW1ibGVyIGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byBoYXZlIHJldHVybiB0eXBlIGB2b2lkJy4gICovCisKK3ZvaWQKK3N0YWJzX2dlbmVyYXRlX2FzbV9mdW5jIChmdW5jbmFtZSwgc3RhcnRsYWJuYW1lKQorICAgICBjb25zdCBjaGFyICpmdW5jbmFtZTsKKyAgICAgY29uc3QgY2hhciAqc3RhcnRsYWJuYW1lOworeworICBzdGF0aWMgaW50IHZvaWRfZW1pdHRlZF9wOworICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOworICBjaGFyICpidWY7CisgIGNoYXIgKmZpbGU7CisgIHVuc2lnbmVkIGludCBsaW5lbm87CisKKyAgaWYgKCEgdm9pZF9lbWl0dGVkX3ApCisgICAgeworICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gIlwidm9pZDp0MT0xXCIsMTI4LDAsMCwwIjsKKyAgICAgIHNfc3RhYiAoJ3MnKTsKKyAgICAgIHZvaWRfZW1pdHRlZF9wID0gMTsKKyAgICB9CisKKyAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKKyAgYXNwcmludGYgKCZidWYsICJcIiVzOkYxXCIsJWQsMCwlZCwlcyIsCisJICAgIGZ1bmNuYW1lLCBOX0ZVTiwgbGluZW5vICsgMSwgc3RhcnRsYWJuYW1lKTsKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmOworICBzX3N0YWIgKCdzJyk7CisgIGZyZWUgKGJ1Zik7CisKKyAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKKyAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IHhzdHJkdXAgKHN0YXJ0bGFibmFtZSk7CisgIGluX2RvdF9mdW5jX3AgPSAxOworfQorCisvKiBFbWl0IGEgc3RhYiB0byByZWNvcmQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgKi8KKwordm9pZAorc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMgKGZ1bmNuYW1lLCBzdGFydGxhYm5hbWUpCisgICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOworICAgICBjb25zdCBjaGFyICpzdGFydGxhYm5hbWU7Cit7CisgIHN0YXRpYyBpbnQgbGFiZWxfY291bnQ7CisgIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7CisgIGNoYXIgKmJ1ZjsKKyAgY2hhciBzeW1bMzBdOworCisgIHNwcmludGYgKHN5bSwgIiVzZW5kZnVuYyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCk7CisgICsrbGFiZWxfY291bnQ7CisgIGNvbG9uIChzeW0pOworCisgIGFzcHJpbnRmICgmYnVmLCAiXCJcIiwlZCwwLDAsJXMtJXMiLCBOX0ZVTiwgc3ltLCBzdGFydGxhYm5hbWUpOworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7CisgIHNfc3RhYiAoJ3MnKTsKKyAgZnJlZSAoYnVmKTsKKworICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOworICBpbl9kb3RfZnVuY19wID0gMDsKKyAgY3VycmVudF9mdW5jdGlvbl9sYWJlbCA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9nYXMvc3RhbXAtaC5pbiBiL2dhcy9zdGFtcC1oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODhmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvc3RhbXAtaC5pbgpAQCAtMCwwICsxIEBACit0aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2dhcy9zdHJ1Yy1zeW1ib2wuaCBiL2dhcy9zdHJ1Yy1zeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWIwNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3N0cnVjLXN5bWJvbC5oCkBAIC0wLDAgKzEsMTY2IEBACisvKiBzdHJ1Y3Rfc3ltYm9sLmggLSBJbnRlcm5hbCBzeW1ib2wgc3RydWN0dXJlCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9fc3RydWNfc3ltYm9sX2hfXworI2RlZmluZSBfX3N0cnVjX3N5bWJvbF9oX18KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKy8qIFRoZSBCRkQgY29kZSB3YW50cyB0byB3YWxrIHRoZSBsaXN0IGluIGJvdGggZGlyZWN0aW9ucy4gICovCisjdW5kZWYgIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKKyNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUworI2VuZGlmCisKKy8qIG91ciB2ZXJzaW9uIG9mIGFuIG5saXN0IG5vZGUgKi8KK3N0cnVjdCBzeW1ib2wKK3sKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICAvKiBUaGUgKDQtb3JpZ2luKSBwb3NpdGlvbiBvZiBzeV9uYW1lIGluIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIG9iamVjdAorICAgICBmaWxlLiAgVGhpcyB3aWxsIGJlIDAgZm9yIChuYW1lbGVzcykgLnN0YWJkIHN5bWJvbHMuCisKKyAgICAgTm90IHVzZWQgdW50aWwgd3JpdGVfb2JqZWN0X2ZpbGUoKSB0aW1lLiAqLworICB1bnNpZ25lZCBsb25nIHN5X25hbWVfb2Zmc2V0OworCisgIC8qIFdoYXQgd2Ugd3JpdGUgaW4gLm8gZmlsZSAoaWYgcGVybWl0dGVkKS4gICovCisgIG9ial9zeW1ib2xfdHlwZSBzeV9zeW1ib2w7CisKKyAgLyogVGhlIDI0IGJpdCBzeW1ib2wgbnVtYmVyLiAgU3ltYm9sIG51bWJlcnMgc3RhcnQgYXQgMCBhbmQgYXJlIHVuc2lnbmVkLiAqLworICBsb25nIHN5X251bWJlcjsKKyNlbHNlCisgIC8qIEJGRCBzeW1ib2wgKi8KKyAgYXN5bWJvbCAqYnN5bTsKKyNlbmRpZgorCisgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KKyAgZXhwcmVzc2lvblMgc3lfdmFsdWU7CisKKyAgLyogRm9yd2FyZHMgYW5kIChvcHRpb25hbGx5KSBiYWNrd2FyZHMgY2hhaW4gcG9pbnRlcnMuICAqLworICBzdHJ1Y3Qgc3ltYm9sICpzeV9uZXh0OworI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKKyAgc3RydWN0IHN5bWJvbCAqc3lfcHJldmlvdXM7CisjZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLworCisgIC8qIFBvaW50ZXIgdG8gdGhlIGZyYWcgdGhpcyBzeW1ib2wgaXMgYXR0YWNoZWQgdG8sIGlmIGFueS4KKyAgICAgT3RoZXJ3aXNlLCBOVUxMLiAgKi8KKyAgc3RydWN0IGZyYWcgKnN5X2ZyYWc7CisKKyAgdW5zaWduZWQgaW50IHdyaXR0ZW4gOiAxOworICAvKiBXaGV0aGVyIHN5bWJvbCB2YWx1ZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlc29sdmVkICh1c2VkIGR1cmluZworICAgICBmaW5hbCBwYXNzIG92ZXIgc3ltYm9sIHRhYmxlKS4gICovCisgIHVuc2lnbmVkIGludCBzeV9yZXNvbHZlZCA6IDE7CisgIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCB2YWx1ZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVzb2x2ZWQgKHVzZWQgdG8KKyAgICAgZGV0ZWN0IGxvb3BzIGluIHN5bWJvbCBkZXBlbmRlbmNpZXMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHN5X3Jlc29sdmluZyA6IDE7CisgIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCB2YWx1ZSBpcyB1c2VkIGluIGEgcmVsb2MuICBUaGlzIGlzIHVzZWQgdG8KKyAgICAgZW5zdXJlIHRoYXQgc3ltYm9scyB1c2VkIGluIHJlbG9jcyBhcmUgd3JpdHRlbiBvdXQsIGV2ZW4gaWYgdGhleQorICAgICBhcmUgbG9jYWwgYW5kIHdvdWxkIG90aGVyd2lzZSBub3QgYmUuICAqLworICB1bnNpZ25lZCBpbnQgc3lfdXNlZF9pbl9yZWxvYyA6IDE7CisKKyAgLyogV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgCisgICAgIE5PVEU6ICBOb3QgYWxsIHRoZSBiYWNrZW5kcyBrZWVwIHRoaXMgaW5mb3JtYXRpb24gYWNjdXJhdGU7CisgICAgIGJhY2tlbmRzIHdoaWNoIHVzZSB0aGlzIGJpdCBhcmUgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbgorICAgICBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuICAqLworICB1bnNpZ25lZCBpbnQgc3lfdXNlZCA6IDE7CisKKyAgLyogVGhpcyBpcyBzZXQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIGFuIE1SSSBjb21tb24gc2VjdGlvbi4KKyAgICAgV2UgaGFuZGxlIHN1Y2ggc2VjdGlvbnMgYXMgc2luZ2xlIGNvbW1vbiBzeW1ib2xzLCBzbyBzeW1ib2xzCisgICAgIGRlZmluZWQgd2l0aGluIHRoZW0gbXVzdCBiZSB0cmVhdGVkIHNwZWNpYWxseSBieSB0aGUgcmVsb2NhdGlvbgorICAgICByb3V0aW5lcy4gICovCisgIHVuc2lnbmVkIGludCBzeV9tcmlfY29tbW9uIDogMTsKKworI2lmZGVmIE9CSl9TWU1GSUVMRF9UWVBFCisgIE9CSl9TWU1GSUVMRF9UWVBFIHN5X29iajsKKyNlbmRpZgorCisjaWZkZWYgVENfU1lNRklFTERfVFlQRQorICBUQ19TWU1GSUVMRF9UWVBFIHN5X3RjOworI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfU1lNQk9MX0ZJRUxEUworICBUQVJHRVRfU1lNQk9MX0ZJRUxEUworI2VuZGlmCit9OworCit0eXBlZGVmIHN0cnVjdCBzeW1ib2wgc3ltYm9sUzsKKworI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECitzdHJ1Y3QgYnJva2VuX3dvcmQKKyAgeworICAgIC8qIExpbmtlZCBsaXN0IC0tIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIHBlciAiLndvcmQgeC15K0MiCisgICAgICAgZXhwcmVzc2lvbi4gICovCisgICAgc3RydWN0IGJyb2tlbl93b3JkICpuZXh0X2Jyb2tlbl93b3JkOworICAgIC8qIFNlZ21lbnQgYW5kIHN1YnNlZ21lbnQgZm9yIGJyb2tlbiB3b3JkLiAgKi8KKyAgICBzZWdUIHNlZzsKKyAgICBzdWJzZWdUIHN1YnNlZzsKKyAgICAvKiBXaGljaCBmcmFnIGlzIHRoaXMgYnJva2VuIHdvcmQgaW4/ICAqLworICAgIGZyYWdTICpmcmFnOworICAgIC8qIFdoZXJlIGluIHRoZSBmcmFnIGlzIGl0PyAgKi8KKyAgICBjaGFyICp3b3JkX2dvZXNfaGVyZTsKKyAgICAvKiBXaGVyZSB0byBhZGQgdGhlIGJyZWFrLiAgKi8KKyAgICBmcmFnUyAqZGlzcGZyYWc7CQkvKiB3aGVyZSB0byBhZGQgdGhlIGJyZWFrICovCisgICAgLyogT3BlcmFuZHMgb2YgZXhwcmVzc2lvbi4gICovCisgICAgc3ltYm9sUyAqYWRkOworICAgIHN5bWJvbFMgKnN1YjsKKyAgICBvZmZzZXRUIGFkZG51bTsKKworICAgIGludCBhZGRlZDsJCQkvKiBuYXN0eSB0aGluZyBoYXBwZW5kIHlldD8gKi8KKyAgICAvKiAxOiBhZGRlZCBhbmQgaGFzIGEgbG9uZy1qdW1wICovCisgICAgLyogMjogYWRkZWQgYnV0IHVzZXMgc29tZW9uZSBlbHNlcyBsb25nLWp1bXAgKi8KKworICAgIC8qIFBvaW50ZXIgdG8gYnJva2VuX3dvcmQgd2l0aCBhIHNpbWlsYXIgbG9uZy1qdW1wLiAgKi8KKyAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKnVzZV9qdW1wOworICB9OworZXh0ZXJuIHN0cnVjdCBicm9rZW5fd29yZCAqYnJva2VuX3dvcmRzOworI2VuZGlmIC8qIG5kZWYgV09SS0lOR19ET1RfV09SRCAqLworCisvKgorICogQ3VycmVudCBtZWFucyBmb3IgZ2V0dGluZyBmcm9tIHN5bWJvbHMgdG8gc2VnbWVudHMgYW5kIHZpY2UgdmVyc2UuCisgKiBUaGlzIHdpbGwgY2hhbmdlIGZvciBpbmZpbml0ZS1zZWdtZW50cyBzdXBwb3J0IChlLmcuIENPRkYpLgorICovCitleHRlcm4gY29uc3Qgc2VnVCBOX1RZUEVfc2VnW107CS8qIHN1YnNlZy5jICovCisKKyNkZWZpbmUJU0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpICAoIHNlZ19OX1RZUEUgWyhpbnQpIChzZWcpXSApCitleHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOy8qIHN1YnNlZy5jICovCisKKyNkZWZpbmUJTl9SRUdJU1RFUgkzMAkvKiBGYWtlIE5fVFlQRSB2YWx1ZSBmb3IgU0VHX1JFR0lTVEVSICovCisKK3ZvaWQgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKKworI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKKwordm9pZCBzeW1ib2xfaW5zZXJ0IFBBUkFNUyAoKHN5bWJvbFMgKiBhZGRtZSwgc3ltYm9sUyAqIHRhcmdldCwKKwkJCSAgICBzeW1ib2xTICoqIHJvb3RQLCBzeW1ib2xTICoqIGxhc3RQKSk7Cit2b2lkIHN5bWJvbF9yZW1vdmUgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFAsIHN5bWJvbFMgKiogcm9vdFAsCisJCQkgICAgc3ltYm9sUyAqKiBsYXN0UCkpOworCisjZGVmaW5lIHN5bWJvbF9wcmV2aW91cyhzKSAoKHMpLT5zeV9wcmV2aW91cykKKworI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KKwordm9pZCB2ZXJpZnlfc3ltYm9sX2NoYWluIFBBUkFNUyAoKHN5bWJvbFMgKiByb290UCwgc3ltYm9sUyAqIGxhc3RQKSk7Cit2b2lkIHZlcmlmeV9zeW1ib2xfY2hhaW5fMiBQQVJBTVMgKChzeW1ib2xTICogc3ltUCkpOworCit2b2lkIHN5bWJvbF9hcHBlbmQgUEFSQU1TICgoc3ltYm9sUyAqIGFkZG1lLCBzeW1ib2xTICogdGFyZ2V0LAorCQkJICAgIHN5bWJvbFMgKiogcm9vdFAsIHN5bWJvbFMgKiogbGFzdFApKTsKKworI2RlZmluZSBzeW1ib2xfbmV4dChzKQkoKHMpLT5zeV9uZXh0KQorCisjZW5kaWYgLyogX19zdHJ1Y19zeW1ib2xfaF9fICovCisKKy8qIGVuZCBvZiBzdHJ1Yy1zeW1ib2wuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N1YnNlZ3MuYyBiL2dhcy9zdWJzZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmMjg2OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9zdWJzZWdzLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qIHN1YnNlZ3MuYyAtIHN1YnNlZ21lbnRzIC0KKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogU2VnbWVudHMgJiBzdWItc2VnbWVudHMuCisgKi8KKworI2luY2x1ZGUgImFzLmgiCisKKyNpbmNsdWRlICJzdWJzZWdzLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorCitmcmNoYWluUyAqZnJjaGFpbl9yb290LCAqZnJjaGFpbl9ub3c7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBmcmNoYWluczsKKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisjaWZkZWYgTUFOWV9TRUdNRU5UUworc2VnbWVudF9pbmZvX3R5cGUgc2VnbWVudF9pbmZvW1NFR19NQVhJTVVNX09SRElOQUxdOworCisjZWxzZQorLyogQ29tbWVudGVkIGluICJzdWJzZWdzLmgiLiAqLworZnJjaGFpblMgKmRhdGEwX2ZyY2hhaW5QLCAqYnNzMF9mcmNoYWluUDsKKworI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KK2NoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW10gPQoreworICAiYWJzb2x1dGUiLAorI2lmZGVmIE1BTllfU0VHTUVOVFMKKyAgImUwIiwgImUxIiwgImUyIiwgImUzIiwgImU0IiwgImU1IiwgImU2IiwgImU3IiwgImU4IiwgImU5IiwKKyAgImUxMCIsICJlMTEiLCAiZTEyIiwgImUxMyIsICJlMTQiLCAiZTE1IiwgImUxNiIsICJlMTciLCAiZTE4IiwgImUxOSIsCisgICJlMjAiLCAiZTIxIiwgImUyMiIsICJlMjMiLCAiZTI0IiwgImUyNSIsICJlMjYiLCAiZTI3IiwgImUyOCIsICJlMjkiLAorICAiZTMwIiwgImUzMSIsICJlMzIiLCAiZTMzIiwgImUzNCIsICJlMzUiLCAiZTM2IiwgImUzNyIsICJlMzgiLCAiZTM5IiwKKyNlbHNlCisgICJ0ZXh0IiwKKyAgImRhdGEiLAorICAiYnNzIiwKKyNlbmRpZiAvKiBNQU5ZX1NFR01FTlRTICovCisgICJ1bmtub3duIiwKKyAgIkFTU0VNQkxFUi1JTlRFUk5BTC1MT0dJQy1FUlJPUiEiLAorICAiZXhwciIsCisgICJkZWJ1ZyIsCisgICJ0cmFuc2ZlcnQgdmVjdG9yIHByZWxvYWQiLAorICAidHJhbnNmZXJ0IHZlY3RvciBwb3N0bG9hZCIsCisgICJyZWdpc3RlciIsCisgICIiLAorfTsJCQkJLyogVXNlZCBieSBlcnJvciByZXBvcnRlcnMsIGR1bXBlcnMgZXRjLiAqLworI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLworCisvKiBHYXMgc2VnbWVudCBpbmZvcm1hdGlvbiBmb3IgYmZkX2Fic19zZWN0aW9uX3B0ciBhbmQKKyAgIGJmZF91bmRfc2VjdGlvbl9wdHIuICAqLworc3RhdGljIHNlZ21lbnRfaW5mb190eXBlICphYnNfc2VnX2luZm87CitzdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKnVuZF9zZWdfaW5mbzsKKworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KKworc3RhdGljIHZvaWQgc3Vic2VnX3NldF9yZXN0IFBBUkFNUyAoKHNlZ1QsIHN1YnNlZ1QpKTsKKworc3RhdGljIGZyYWdTIGR1bW15X2ZyYWc7CisKK3N0YXRpYyBmcmNoYWluUyBhYnNvbHV0ZV9mcmNoYWluOworDAordm9pZAorc3Vic2Vnc19iZWdpbiAoKQoreworICAvKiBDaGVjayB0YWJsZShzKSBzZWdfbmFtZVtdLCBzZWdfTl9UWVBFW10gaXMgaW4gY29ycmVjdCBvcmRlciAqLworI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKKyAga25vdyAoU0VHX0FCU09MVVRFID09IDApOworICBrbm93IChTRUdfVEVYVCA9PSAxKTsKKyAga25vdyAoU0VHX0RBVEEgPT0gMik7CisgIGtub3cgKFNFR19CU1MgPT0gMyk7CisgIGtub3cgKFNFR19VTktOT1dOID09IDQpOworICBrbm93IChTRUdfR09PRiA9PSA1KTsKKyAga25vdyAoU0VHX0VYUFIgPT0gNik7CisgIGtub3cgKFNFR19ERUJVRyA9PSA3KTsKKyAga25vdyAoU0VHX05UViA9PSA4KTsKKyAga25vdyAoU0VHX1BUViA9PSA5KTsKKyAga25vdyAoU0VHX1JFR0lTVEVSID09IDEwKTsKKyAga25vdyAoU0VHX01BWElNVU1fT1JESU5BTCA9PSBTRUdfUkVHSVNURVIpOworI2VuZGlmCisKKyAgb2JzdGFja19iZWdpbiAoJmZyY2hhaW5zLCBjaHVua3NpemUpOworI2lmIF9fR05VQ19fID49IDIKKyAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJmZyY2hhaW5zKSA9IF9fYWxpZ25vZl9fIChmcmNoYWluUykgLSAxOworI2VuZGlmCisKKyAgZnJjaGFpbl9yb290ID0gTlVMTDsKKyAgZnJjaGFpbl9ub3cgPSBOVUxMOwkJLyogV2FybiBuZXdfc3Vic2VnKCkgdGhhdCB3ZSBhcmUgYm9vdGluZy4gKi8KKworICBmcmFnX25vdyA9ICZkdW1teV9mcmFnOworCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyAgbm93X3N1YnNlZyA9IDQyOwkJLyogTGllIGZvciAxc3QgY2FsbCB0byBzdWJzZWdfbmV3LiAqLworI2lmZGVmIE1BTllfU0VHTUVOVFMKKyAgeworICAgIGludCBpOworICAgIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCisgICAgICB7CisJc3Vic2VnX3NldCAoaSwgMCk7CisJc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7CisgICAgICB9CisgIH0KKyNlbHNlCisgIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAwKTsJLyogLmRhdGEgMCAqLworICBkYXRhMF9mcmNoYWluUCA9IGZyY2hhaW5fbm93OworCisgIHN1YnNlZ19zZXQgKFNFR19CU1MsIDApOworICBic3MwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7CisKKyNlbmRpZiAvKiAhIE1BTllfU0VHTUVOVFMgKi8KKyNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KKworICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKKyAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX3N1YnNlZyA9IDA7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBhYnNvbHV0ZV9mcmNoYWluLmZpeF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5maXhfdGFpbCA9IDA7CisjZW5kaWYKKyAgYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2ZyYWdfbm93ID0gJnplcm9fYWRkcmVzc19mcmFnOworICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfcm9vdCA9IGFic29sdXRlX2ZyY2hhaW4uZnJjaF9sYXN0ID0gJnplcm9fYWRkcmVzc19mcmFnOworfQorDAorLyoKKyAqCQkJc3Vic2VnX2NoYW5nZSgpCisgKgorICogQ2hhbmdlIHRoZSBzdWJzZWdtZW50IHdlIGFyZSBpbiwgQlVUIERPIE5PVCBNQUtFIEEgTkVXIEZSQUcgZm9yIHRoZQorICogc3Vic2VnbWVudC4gSWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgc3Vic2VnbWVudCwgY2hhbmdlIG5vdGhpbmcuCisgKiBUaGlzIGlzIHVzZWQgZWcgYXMgYSB3b3JrZXIgZm9yIHN1YnNlZ19zZXQgW3doaWNoIGRvZXMgbWFrZSBhIG5ldyBmcmFnX25vd10KKyAqIGFuZCBmb3IgY2hhbmdpbmcgc2VnbWVudHMgYWZ0ZXIgd2UgaGF2ZSByZWFkIHRoZSBzb3VyY2UuIFdlIGNvbnN0cnVjdCBlZworICogZml4U3MgZXZlbiBhZnRlciB0aGUgc291cmNlIGZpbGUgaXMgcmVhZCwgc28gd2UgZG8gaGF2ZSB0byBrZWVwIHRoZQorICogc2VnbWVudCBjb250ZXh0IGNvcnJlY3QuCisgKi8KK3ZvaWQKK3N1YnNlZ19jaGFuZ2UgKHNlZywgc3Vic2VnKQorICAgICByZWdpc3RlciBzZWdUIHNlZzsKKyAgICAgcmVnaXN0ZXIgaW50IHN1YnNlZzsKK3sKKyAgbm93X3NlZyA9IHNlZzsKKyAgbm93X3N1YnNlZyA9IHN1YnNlZzsKKworICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHJldHVybjsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgeworICAgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOworICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZyk7CisgICAgaWYgKCEgc2VnaW5mbykKKyAgICAgIHsKKwlzZWdpbmZvID0gKHNlZ21lbnRfaW5mb190eXBlICopIHhtYWxsb2MgKHNpemVvZiAoKnNlZ2luZm8pKTsKKwltZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKKwlzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7CisJc2VnaW5mby0+Zml4X3RhaWwgPSBOVUxMOworCXNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VnOworCXNlZ2luZm8tPnN5bSA9IDA7CisJaWYgKHNlZyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQorCSAgYWJzX3NlZ19pbmZvID0gc2VnaW5mbzsKKwllbHNlIGlmIChzZWcgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKKwkgIHVuZF9zZWdfaW5mbyA9IHNlZ2luZm87CisJZWxzZQorCSAgYmZkX3NldF9zZWN0aW9uX3VzZXJkYXRhIChzdGRvdXRwdXQsIHNlZywgKFBUUikgc2VnaW5mbyk7CisgICAgICB9CisgIH0KKyNlbHNlCisjaWZkZWYgTUFOWV9TRUdNRU5UUworICBzZWdfZml4X3Jvb3RQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF9yb290OworICBzZWdfZml4X3RhaWxQID0gJnNlZ21lbnRfaW5mb1tzZWddLmZpeF90YWlsOworI2Vsc2UKKyAgaWYgKHNlZyA9PSBTRUdfREFUQSkKKyAgICB7CisgICAgICBzZWdfZml4X3Jvb3RQID0gJmRhdGFfZml4X3Jvb3Q7CisgICAgICBzZWdfZml4X3RhaWxQID0gJmRhdGFfZml4X3RhaWw7CisgICAgfQorICBlbHNlIGlmIChzZWcgPT0gU0VHX1RFWFQpCisgICAgeworICAgICAgc2VnX2ZpeF9yb290UCA9ICZ0ZXh0X2ZpeF9yb290OworICAgICAgc2VnX2ZpeF90YWlsUCA9ICZ0ZXh0X2ZpeF90YWlsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGtub3cgKHNlZyA9PSBTRUdfQlNTKTsKKyAgICAgIHNlZ19maXhfcm9vdFAgPSAmYnNzX2ZpeF9yb290OworICAgICAgc2VnX2ZpeF90YWlsUCA9ICZic3NfZml4X3RhaWw7CisgICAgfQorCisjZW5kaWYKKyNlbmRpZgorfQorDAorc3RhdGljIHZvaWQKK3N1YnNlZ19zZXRfcmVzdCAoc2VnLCBzdWJzZWcpCisgICAgIHNlZ1Qgc2VnOworICAgICBzdWJzZWdUIHN1YnNlZzsKK3sKKyAgcmVnaXN0ZXIgZnJjaGFpblMgKmZyY1A7CS8qIGNyYXdsIGZyY2hhaW4gY2hhaW4gKi8KKyAgcmVnaXN0ZXIgZnJjaGFpblMgKipsYXN0UFA7CS8qIGFkZHJlc3Mgb2YgbGFzdCBwb2ludGVyICovCisgIGZyY2hhaW5TICpuZXdQOwkJLyogYWRkcmVzcyBvZiBuZXcgZnJjaGFpbiAqLworCisgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKKworICBpZiAoZnJhZ19ub3cgJiYgZnJjaGFpbl9ub3cpCisgICAgZnJjaGFpbl9ub3ctPmZyY2hfZnJhZ19ub3cgPSBmcmFnX25vdzsKKworICBhc3NlcnQgKGZyY2hhaW5fbm93ID09IDAKKwkgIHx8IG5vd19zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KKwkgIHx8IG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbgorCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7CisKKyAgc3Vic2VnX2NoYW5nZSAoc2VnLCAoaW50KSBzdWJzZWcpOworCisgIGlmIChzZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKKyAgICB7CisgICAgICBmcmNoYWluX25vdyA9ICZhYnNvbHV0ZV9mcmNoYWluOworICAgICAgZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAorCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgorCSAgfHwgZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7CisKKyAgLyoKKyAgICogQXR0ZW1wdCB0byBmaW5kIG9yIG1ha2UgYSBmcmNoYWluIGZvciB0aGF0IHN1YiBzZWcuCisgICAqIENyYXdsIGFsb25nIGNoYWluIG9mIGZyY2hhaW5TcywgYmVnaW5zIEAgZnJjaGFpbl9yb290LgorICAgKiBJZiB3ZSBuZWVkIHRvIG1ha2UgYSBmcmNoYWluUywgbGluayBpdCBpbnRvIGNvcnJlY3QKKyAgICogcG9zaXRpb24gb2YgY2hhaW4gcm9vdGVkIGluIGZyY2hhaW5fcm9vdC4KKyAgICovCisgIGZvciAoZnJjUCA9ICoobGFzdFBQID0gJmZyY2hhaW5fcm9vdCk7CisgICAgICAgZnJjUCAmJiBmcmNQLT5mcmNoX3NlZyA8PSBzZWc7CisgICAgICAgZnJjUCA9ICoobGFzdFBQID0gJmZyY1AtPmZyY2hfbmV4dCkpCisgICAgeworICAgICAgaWYgKGZyY1AtPmZyY2hfc2VnID09IHNlZworCSAgJiYgZnJjUC0+ZnJjaF9zdWJzZWcgPj0gc3Vic2VnKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIC8qCisgICAqIGZyY1A6CQlBZGRyZXNzIG9mIHRoZSAxc3QgZnJjaGFpblMgaW4gY29ycmVjdCBzZWdtZW50IHdpdGgKKyAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZy4KKyAgICoJCVdlIHdhbnQgdG8gZWl0aGVyIHVzZSB0aGlzIGZyY2hhaW5TLCBvciB3ZSB3YW50CisgICAqCQl0byBpbnNlcnQgYSBuZXcgZnJjaGFpblMganVzdCBiZWZvcmUgaXQuCisgICAqCisgICAqCQlJZiBmcmNQPT1OVUxMLCB0aGVuIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbgorICAgKgkJb2YgZnJjaGFpblMtcy4gQSBOVUxMIGZyY1AgbWVhbnMgd2UgZmVsbCBvZmYgdGhlIGVuZAorICAgKgkJb2YgdGhlIGNoYWluIGxvb2tpbmcgZm9yIGEKKyAgICoJCWZyY2hfc3Vic2VnID49IHN1YnNlZywgc28gd2UKKyAgICoJCW11c3QgbWFrZSBhIG5ldyBmcmNoYWluUy4KKyAgICoKKyAgICoJCUlmIHdlIGV2ZXIgbWFpbnRhaW4gYSBwb2ludGVyIHRvCisgICAqCQl0aGUgbGFzdCBmcmNoYWluUyBpbiB0aGUgY2hhaW4sIHdlIGNoYW5nZSB0aGF0IHBvaW50ZXIKKyAgICoJCU9OTFkgd2hlbiBmcmNQPT1OVUxMLgorICAgKgorICAgKiBsYXN0UFA6CUFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgd2l0aCB2YWx1ZSBmcmNQOworICAgKgkJTmV2ZXIgTlVMTC4KKyAgICoJCU1heSBwb2ludCB0byBmcmNoYWluX3Jvb3QuCisgICAqCisgICAqLworICBpZiAoIWZyY1AKKyAgICAgIHx8IChmcmNQLT5mcmNoX3NlZyA+IHNlZworCSAgfHwgZnJjUC0+ZnJjaF9zdWJzZWcgPiBzdWJzZWcpKQkvKiBLaW5reSBsb2dpYyBvbmx5IHdvcmtzIHdpdGggMiBzZWdtZW50cy4gKi8KKyAgICB7CisgICAgICAvKgorICAgICAgICogVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgY29kZSB0aGF0IGNyZWF0ZXMgYSBmcmNoYWluUy4KKyAgICAgICAqLworICAgICAgbmV3UCA9IChmcmNoYWluUyAqKSBvYnN0YWNrX2FsbG9jICgmZnJjaGFpbnMsIHNpemVvZiAoZnJjaGFpblMpKTsKKyAgICAgIG5ld1AtPmZyY2hfc3Vic2VnID0gc3Vic2VnOworICAgICAgbmV3UC0+ZnJjaF9zZWcgPSBzZWc7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgbmV3UC0+Zml4X3Jvb3QgPSBOVUxMOworICAgICAgbmV3UC0+Zml4X3RhaWwgPSBOVUxMOworI2VuZGlmCisgICAgICBvYnN0YWNrX2JlZ2luICgmbmV3UC0+ZnJjaF9vYnN0YWNrLCBjaHVua3NpemUpOworI2lmIF9fR05VQ19fID49IDIKKyAgICAgIG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKCZuZXdQLT5mcmNoX29ic3RhY2spID0gX19hbGlnbm9mX18gKGZyYWdTKSAtIDE7CisjZW5kaWYKKyAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3cgPSBmcmFnX2FsbG9jICgmbmV3UC0+ZnJjaF9vYnN0YWNrKTsKKyAgICAgIG5ld1AtPmZyY2hfZnJhZ19ub3ctPmZyX3R5cGUgPSByc19maWxsOworCisgICAgICBuZXdQLT5mcmNoX3Jvb3QgPSBuZXdQLT5mcmNoX2xhc3QgPSBuZXdQLT5mcmNoX2ZyYWdfbm93OworCisgICAgICAqbGFzdFBQID0gbmV3UDsKKyAgICAgIG5ld1AtPmZyY2hfbmV4dCA9IGZyY1A7CS8qIHBlcmhhcHMgTlVMTCAqLworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgeworCXNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOworCXNlZ2luZm8gPSBzZWdfaW5mbyAoc2VnKTsKKwlpZiAoc2VnaW5mbyAmJiBzZWdpbmZvLT5mcmNoYWluUCA9PSBmcmNQKQorCSAgc2VnaW5mby0+ZnJjaGFpblAgPSBuZXdQOworICAgICAgfQorI2VuZGlmCisgICAgICAKKyAgICAgIGZyY1AgPSBuZXdQOworICAgIH0KKyAgLyoKKyAgICogSGVyZSB3aXRoIGZyY1AgcG9pbnRpbmcgdG8gdGhlIGZyY2hhaW5TIGZvciBzdWJzZWcuCisgICAqLworICBmcmNoYWluX25vdyA9IGZyY1A7CisgIGZyYWdfbm93ID0gZnJjUC0+ZnJjaF9mcmFnX25vdzsKKworICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOworfQorCisvKgorICoJCQlzdWJzZWdfc2V0KHNlZ1QsIHN1YnNlZ1QpCisgKgorICogSWYgeW91IGF0dGVtcHQgdG8gY2hhbmdlIHRvIHRoZSBjdXJyZW50IHN1YnNlZ21lbnQsIG5vdGhpbmcgaGFwcGVucy4KKyAqCisgKiBJbjoJc2VnVCwgc3Vic2VnVCBjb2RlIGZvciBuZXcgc3Vic2VnbWVudC4KKyAqCWZyYWdfbm93IC0+IGluY29tcGxldGUgZnJhZyBmb3IgY3VycmVudCBzdWJzZWdtZW50LgorICoJSWYgZnJhZ19ub3c9PU5VTEwsIHRoZW4gdGhlcmUgaXMgbm8gb2xkLCBpbmNvbXBsZXRlIGZyYWcsIHNvCisgKgl0aGUgb2xkIGZyYWcgaXMgbm90IGNsb3NlZCBvZmYuCisgKgorICogT3V0Oglub3dfc3Vic2VnLCBub3dfc2VnIHVwZGF0ZWQuCisgKglGcmNoYWluX25vdyBwb2ludHMgdG8gdGhlIChwb3NzaWJseSBuZXcpIHN0cnVjdCBmcmNoYWluIGZvciB0aGlzCisgKglzdWItc2VnbWVudC4KKyAqCUZyY2hhaW5fcm9vdCB1cGRhdGVkIGlmIG5lZWRlZC4KKyAqLworCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKworc2VnVAorc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQorICAgICBjb25zdCBjaGFyICpzZWduYW1lOworICAgICBzdWJzZWdUIHN1YnNlZzsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpIFNFR19NQVhJTVVNX09SRElOQUw7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworCisgICAgICBzID0gc2VnbWVudF9uYW1lICgoc2VnVCkgaSk7CisgICAgICBpZiAoc3RyY21wIChzZWduYW1lLCBzKSA9PSAwCisJICB8fCAoc2VnbmFtZVswXSA9PSAnLicKKwkgICAgICAmJiBzdHJjbXAgKHNlZ25hbWUgKyAxLCBzKSA9PSAwKSkKKwl7CisJICBzdWJzZWdfc2V0ICgoc2VnVCkgaSwgc3Vic2VnKTsKKwkgIHJldHVybiAoc2VnVCkgaTsKKwl9CisjaWZkZWYgb2JqX3NlZ21lbnRfbmFtZQorICAgICAgcyA9IG9ial9zZWdtZW50X25hbWUgKChzZWdUKSBpKTsKKyAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKKwkgIHx8IChzZWduYW1lWzBdID09ICcuJworCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQorCXsKKwkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOworCSAgcmV0dXJuIChzZWdUKSBpOworCX0KKyNlbmRpZgorICAgIH0KKworI2lmZGVmIG9ial9hZGRfc2VnbWVudAorICB7CisgICAgc2VnVCBuZXdfc2VnOworICAgIG5ld19zZWcgPSBvYmpfYWRkX3NlZ21lbnQgKHNlZ25hbWUpOworICAgIHN1YnNlZ19zZXQgKG5ld19zZWcsIHN1YnNlZyk7CisgICAgcmV0dXJuIG5ld19zZWc7CisgIH0KKyNlbHNlCisgIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBzd2l0Y2ggdG8gbm9uZXhpc3RlbnQgc2VnbWVudCBcIiVzXCIiKSwgc2VnbmFtZSk7CisgIHJldHVybiBub3dfc2VnOworI2VuZGlmCit9CisKK3ZvaWQKK3N1YnNlZ19zZXQgKHNlZywgc3Vic2VnKQkvKiBiZWdpbiBhc3NlbWJseSBmb3IgYSBuZXcgc3ViLXNlZ21lbnQgKi8KKyAgICAgcmVnaXN0ZXIgc2VnVCBzZWc7CQkvKiBTRUdfREFUQSBvciBTRUdfVEVYVCAqLworICAgICByZWdpc3RlciBzdWJzZWdUIHN1YnNlZzsKK3sKKyNpZm5kZWYgTUFOWV9TRUdNRU5UUworICBrbm93IChzZWcgPT0gU0VHX0RBVEEKKwl8fCBzZWcgPT0gU0VHX1RFWFQKKwl8fCBzZWcgPT0gU0VHX0JTUworCXx8IHNlZyA9PSBTRUdfQUJTT0xVVEUpOworI2VuZGlmCisKKyAgaWYgKHNlZyAhPSBub3dfc2VnIHx8IHN1YnNlZyAhPSBub3dfc3Vic2VnKQorICAgIHsJCQkJLyogd2UganVzdCBjaGFuZ2VkIHN1Yi1zZWdtZW50cyAqLworICAgICAgc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZyk7CisgICAgfQorICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Cit9CisKKyNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KKworc2VnVAorc3Vic2VnX2dldCAoc2VnbmFtZSwgZm9yY2VfbmV3KQorICAgICBjb25zdCBjaGFyICpzZWduYW1lOworICAgICBpbnQgZm9yY2VfbmV3OworeworICBzZWdUIHNlY3B0cjsKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87CisgIGNvbnN0IGNoYXIgKm5vd19zZWdfbmFtZSA9IChub3dfc2VnCisJCQkgICAgICA/IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIG5vd19zZWcpCisJCQkgICAgICA6IDApOworCisgIGlmICghZm9yY2VfbmV3CisgICAgICAmJiBub3dfc2VnX25hbWUKKyAgICAgICYmIChub3dfc2VnX25hbWUgPT0gc2VnbmFtZQorCSAgfHwgIXN0cmNtcCAobm93X3NlZ19uYW1lLCBzZWduYW1lKSkpCisgICAgcmV0dXJuIG5vd19zZWc7CisKKyAgaWYgKCFmb3JjZV9uZXcpCisgICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIHNlZ25hbWUpOworICBlbHNlCisgICAgc2VjcHRyID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7CisKKyAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOworICBpZiAoISBzZWdpbmZvKQorICAgIHsKKyAgICAgIC8qIENoZWNrIHdoZXRoZXIgb3V0cHV0X3NlY3Rpb24gaXMgc2V0IGZpcnN0IGJlY2F1c2Ugc2VjcHRyIG1heQorICAgICAgICAgYmUgYmZkX2Fic19zZWN0aW9uX3B0ci4gICovCisgICAgICBpZiAoc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiAhPSBzZWNwdHIpCisJc2VjcHRyLT5vdXRwdXRfc2VjdGlvbiA9IHNlY3B0cjsKKyAgICAgIHNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOworICAgICAgbWVtc2V0ICgoUFRSKSBzZWdpbmZvLCAwLCBzaXplb2YgKCpzZWdpbmZvKSk7CisgICAgICBzZWdpbmZvLT5maXhfcm9vdCA9IE5VTEw7CisgICAgICBzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7CisgICAgICBzZWdpbmZvLT5iZmRfc2VjdGlvbiA9IHNlY3B0cjsKKyAgICAgIGlmIChzZWNwdHIgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKKwlhYnNfc2VnX2luZm8gPSBzZWdpbmZvOworICAgICAgZWxzZSBpZiAoc2VjcHRyID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCisJdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKKyAgICAgIGVsc2UKKwliZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjcHRyLCAoUFRSKSBzZWdpbmZvKTsKKyAgICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gTlVMTDsKKyAgICAgIHNlZ2luZm8tPmxpbmVub19saXN0X2hlYWQgPSBzZWdpbmZvLT5saW5lbm9fbGlzdF90YWlsID0gTlVMTDsKKyAgICAgIHNlZ2luZm8tPnN5bSA9IE5VTEw7CisgICAgICBzZWdpbmZvLT5kb3QgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIHNlY3B0cjsKK30KKworc2VnVAorc3Vic2VnX25ldyAoc2VnbmFtZSwgc3Vic2VnKQorICAgICBjb25zdCBjaGFyICpzZWduYW1lOworICAgICBzdWJzZWdUIHN1YnNlZzsKK3sKKyAgc2VnVCBzZWNwdHI7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOworCisgIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDApOworICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKKyAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOworICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKKyAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OworICByZXR1cm4gc2VjcHRyOworfQorCisvKiBMaWtlIHN1YnNlZ19uZXcsIGV4Y2VwdCBhIG5ldyBzZWN0aW9uIGlzIGFsd2F5cyBjcmVhdGVkLCBldmVuIGlmCisgICBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMuICAqLworc2VnVAorc3Vic2VnX2ZvcmNlX25ldyAoc2VnbmFtZSwgc3Vic2VnKQorICAgICBjb25zdCBjaGFyICpzZWduYW1lOworICAgICBzdWJzZWdUIHN1YnNlZzsKK3sKKyAgc2VnVCBzZWNwdHI7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOworCisgIHNlY3B0ciA9IHN1YnNlZ19nZXQgKHNlZ25hbWUsIDEpOworICBzdWJzZWdfc2V0X3Jlc3QgKHNlY3B0ciwgc3Vic2VnKTsKKyAgc2VnaW5mbyA9IHNlZ19pbmZvIChzZWNwdHIpOworICBpZiAoISBzZWdpbmZvLT5mcmNoYWluUCkKKyAgICBzZWdpbmZvLT5mcmNoYWluUCA9IGZyY2hhaW5fbm93OworICByZXR1cm4gc2VjcHRyOworfQorCit2b2lkCitzdWJzZWdfc2V0IChzZWNwdHIsIHN1YnNlZykKKyAgICAgc2VnVCBzZWNwdHI7CisgICAgIHN1YnNlZ1Qgc3Vic2VnOworeworICBpZiAoISAoc2VjcHRyID09IG5vd19zZWcgJiYgc3Vic2VnID09IG5vd19zdWJzZWcpKQorICAgIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOworICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Cit9CisKKyNpZm5kZWYgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCisjZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCTAKKyNlbmRpZgorCisvKiBHZXQgdGhlIGdhcyBpbmZvcm1hdGlvbiB3ZSBhcmUgc3RvcmluZyBmb3IgYSBzZWN0aW9uLiAgKi8KKworc2VnbWVudF9pbmZvX3R5cGUgKgorc2VnX2luZm8gKHNlYykKKyAgICAgc2VnVCBzZWM7Cit7CisgIGlmIChzZWMgPT0gYmZkX2Fic19zZWN0aW9uX3B0cikKKyAgICByZXR1cm4gYWJzX3NlZ19pbmZvOworICBlbHNlIGlmIChzZWMgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKKyAgICByZXR1cm4gdW5kX3NlZ19pbmZvOworICBlbHNlCisgICAgcmV0dXJuIChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VjKTsKK30KKworc3ltYm9sUyAqCitzZWN0aW9uX3N5bWJvbCAoc2VjKQorICAgICBzZWdUIHNlYzsKK3sKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKKyAgc3ltYm9sUyAqczsKKworICBpZiAoc2VnaW5mbyA9PSAwKQorICAgIGFib3J0ICgpOworICBpZiAoc2VnaW5mby0+c3ltKQorICAgIHJldHVybiBzZWdpbmZvLT5zeW07CisKKyNpZm5kZWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMKKyNkZWZpbmUgRU1JVF9TRUNUSU9OX1NZTUJPTFMgMQorI2VuZGlmCisKKyAgaWYgKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgICB8fCBzeW1ib2xfdGFibGVfZnJvemVuCisjZW5kaWYKKyAgICAgICkKKyAgICB7CisgICAgICAvKiBIZXJlIHdlIGtub3cgaXQgd29uJ3QgYmUgZ29pbmcgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KKyAgICAgIHMgPSBzeW1ib2xfY3JlYXRlIChzZWMtPm5hbWUsIHNlYywgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzID0gc3ltYm9sX2ZpbmRfYmFzZSAoc2VjLT5uYW1lLCAwKTsKKyAgICAgIGlmIChzID09IE5VTEwpCisJcyA9IHN5bWJvbF9uZXcgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOworICAgICAgZWxzZQorCXsKKwkgIGlmIChTX0dFVF9TRUdNRU5UIChzKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKKwkgICAgeworCSAgICAgIFNfU0VUX1NFR01FTlQgKHMsIHNlYyk7CisJICAgICAgcy0+c3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgU19DTEVBUl9FWFRFUk5BTCAocyk7CisKKyAgLyogVXNlIHRoZSBCRkQgc2VjdGlvbiBzeW1ib2wsIGlmIHBvc3NpYmxlLiAgKi8KKyAgaWYgKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyAoc2VjKSkKKyAgICBzLT5ic3ltID0gc2VjLT5zeW1ib2w7CisKKyAgc2VnaW5mby0+c3ltID0gczsKKyAgcmV0dXJuIHM7Cit9CisKKyNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCisKK3ZvaWQKK3N1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKKyAgICAgRklMRSAqZmlsZTsKK3sKKyAgZnJjaGFpblMgKmZyY2hwOworICBmcHJpbnRmIChmaWxlLCAiZnJhZyBjaGFpbnM6XG4iKTsKKyAgZm9yIChmcmNocCA9IGZyY2hhaW5fcm9vdDsgZnJjaHA7IGZyY2hwID0gZnJjaHAtPmZyY2hfbmV4dCkKKyAgICB7CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgZnJhZ1MgKmZyYWdwOworCisgICAgICAvKiBJZiBmcmNoX3N1YnNlZyBpcyBub24temVybywgaXQncyBwcm9iYWJseSBiZWVuIGNoYWluZWQgb250bworCSB0aGUgZW5kIG9mIGEgcHJldmlvdXMgc3Vic2VjdGlvbi4gIERvbid0IGNvdW50IGl0IGFnYWluLiAgKi8KKyAgICAgIGlmIChmcmNocC0+ZnJjaF9zdWJzZWcgIT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogU2tpcCBnYXMtaW50ZXJuYWwgc2VjdGlvbnMuICAqLworICAgICAgaWYgKHNlZ21lbnRfbmFtZSAoZnJjaHAtPmZyY2hfc2VnKVswXSA9PSAnKicpCisJY29udGludWU7CisKKyAgICAgIGZvciAoZnJhZ3AgPSBmcmNocC0+ZnJjaF9yb290OyBmcmFncDsgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKKwl7CisjaWYgMAorCSAgc3dpdGNoIChmcmFncC0+ZnJfdHlwZSkKKwkgICAgeworCSAgICBjYXNlIHJzX2ZpbGw6CisJICAgICAgZnByaW50ZiAoZmlsZSwgImYiKTsgYnJlYWs7CisJICAgIGNhc2UgcnNfYWxpZ246CisJICAgICAgZnByaW50ZiAoZmlsZSwgImEiKTsgYnJlYWs7CisJICAgIGNhc2UgcnNfYWxpZ25fY29kZToKKwkgICAgICBmcHJpbnRmIChmaWxlLCAiYyIpOyBicmVhazsKKwkgICAgY2FzZSByc19vcmc6CisJICAgICAgZnByaW50ZiAoZmlsZSwgIm8iKTsgYnJlYWs7CisJICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6CisJICAgICAgZnByaW50ZiAoZmlsZSwgIm0iKTsgYnJlYWs7CisJICAgIGNhc2UgcnNfc3BhY2U6CisJICAgICAgZnByaW50ZiAoZmlsZSwgInMiKTsgYnJlYWs7CisJICAgIGNhc2UgMDoKKwkgICAgICBmcHJpbnRmIChmaWxlLCAiMCIpOyBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBmcHJpbnRmIChmaWxlLCAiPyIpOyBicmVhazsKKwkgICAgfQorI2VuZGlmCisJICBjb3VudCsrOworCX0KKyAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOworICAgICAgZnByaW50ZiAoZmlsZSwgIlx0JXAgJS0xMHNcdCUxMGQgZnJhZ3NcbiIsIGZyY2hwLAorCSAgICAgICBzZWdtZW50X25hbWUgKGZyY2hwLT5mcmNoX3NlZyksIGNvdW50KTsKKyAgICB9Cit9CisKKy8qIGVuZCBvZiBzdWJzZWdzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9zdWJzZWdzLmggYi9nYXMvc3Vic2Vncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDBkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvc3Vic2Vncy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBzdWJzZWdzLmggLT4gc3Vic2Vncy5jCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIEZvciBldmVyeSBzdWItc2VnbWVudCB0aGUgdXNlciBtZW50aW9ucyBpbiB0aGUgQVNzZW1ibGVyIHByb2dyYW0sCisgKiB3ZSBtYWtlIG9uZSBzdHJ1Y3QgZnJjaGFpbi4gRWFjaCBzdWItc2VnbWVudCBoYXMgZXhhY3RseSBvbmUgc3RydWN0IGZyY2hhaW4KKyAqIGFuZCB2aWNlIHZlcnNhLgorICoKKyAqIFN0cnVjdCBmcmNoYWluJ3MgYXJlIGZvcndhcmQgY2hhaW5lZCAoaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHN1Yi1zZWdtZW50CisgKiBjb2RlIG51bWJlcikuIFRoZSBjaGFpbiBydW5zIHRocm91Z2ggZnJjaF9uZXh0IG9mIGVhY2ggc3Vic2VnbWVudC4KKyAqIFRoaXMgbWFrZXMgaXQgaGFyZCB0byBmaW5kIGEgc3Vic2VnbWVudCdzIGZyYWdzCisgKiBpZiBwcm9ncmFtbWVyIHVzZXMgYSBsb3Qgb2YgdGhlbS4gTW9zdCBwcm9ncmFtcyBvbmx5IHVzZSB0ZXh0MCBhbmQKKyAqIGRhdGEwLCBzbyB0aGV5IGRvbid0IHN1ZmZlci4gQXQgbGVhc3QgdGhpcyB3YXk6CisgKiAoMSkJVGhlcmUgYXJlIG5vICJhcmJpdHJhcnkiIHJlc3RyaWN0aW9ucyBvbiBob3cgbWFueSBzdWJzZWdtZW50cworICoJY2FuIGJlIHByb2dyYW1tZWQ7CisgKiAoMikJU3Vic2VnbWVudHMnIGZyY2hhaW4tcyBhcmUgKGxhdGVyKSBjaGFpbmVkIHRvZ2V0aGVyIGluIHRoZSBvcmRlciBpbgorICoJd2hpY2ggdGhleSBhcmUgZW1pdHRlZCBmb3Igb2JqZWN0IGZpbGUgdml6IHRleHQgdGhlbiBkYXRhLgorICoKKyAqIEZyb20gZWFjaCBzdHJ1Y3QgZnJjaGFpbiBkYW5nbGVzIGEgY2hhaW4gb2Ygc3RydWN0IGZyYWdzLiBUaGUgZnJhZ3MKKyAqIHJlcHJlc2VudCBjb2RlIGZyYWdtZW50cywgZm9yIHRoYXQgc3ViLXNlZ21lbnQsIGZvcndhcmQgY2hhaW5lZC4KKyAqLworCisjaW5jbHVkZSAib2JzdGFjay5oIgorCitzdHJ1Y3QgZnJjaGFpbgkJCS8qIGNvbnRyb2wgYnVpbGRpbmcgb2YgYSBmcmFnIGNoYWluICovCit7CQkJCS8qIEZSQ0ggPSBGUmFnbWVudCBDSGFpbiBjb250cm9sICovCisgIHN0cnVjdCBmcmFnICpmcmNoX3Jvb3Q7CS8qIDFzdCBzdHJ1Y3QgZnJhZyBpbiBjaGFpbiwgb3IgTlVMTCAqLworICBzdHJ1Y3QgZnJhZyAqZnJjaF9sYXN0OwkvKiBsYXN0IHN0cnVjdCBmcmFnIGluIGNoYWluLCBvciBOVUxMICovCisgIHN0cnVjdCBmcmNoYWluICpmcmNoX25leHQ7CS8qIG5leHQgaW4gY2hhaW4gb2Ygc3RydWN0IGZyY2hhaW4tcyAqLworICBzZWdUIGZyY2hfc2VnOwkJLyogU0VHX1RFWFQgb3IgU0VHX0RBVEEuICovCisgIHN1YnNlZ1QgZnJjaF9zdWJzZWc7CQkvKiBzdWJzZWdtZW50IG51bWJlciBvZiB0aGlzIGNoYWluICovCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBmaXhTICpmaXhfcm9vdDsJCS8qIFJvb3Qgb2YgZml4dXBzIGZvciB0aGlzIHN1YnNlZ21lbnQuICAqLworICBmaXhTICpmaXhfdGFpbDsJCS8qIExhc3QgZml4dXAgZm9yIHRoaXMgc3Vic2VnbWVudC4gICovCisjZW5kaWYKKyAgc3RydWN0IG9ic3RhY2sgZnJjaF9vYnN0YWNrOwkvKiBmb3Igb2JqZWN0cyBpbiB0aGlzIGZyYWcgY2hhaW4gKi8KKyAgZnJhZ1MgKmZyY2hfZnJhZ19ub3c7CQkvKiBmcmFnX25vdyBmb3IgdGhpcyBzdWJzZWdtZW50ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBmcmNoYWluIGZyY2hhaW5TOworCisvKiBBbGwgc3Vic2VnbWVudHMnIGNoYWlucyBoYW5nIG9mZiBoZXJlLiAgTlVMTCBtZWFucyBubyBmcmNoYWlucyB5ZXQuICAqLworZXh0ZXJuIGZyY2hhaW5TICpmcmNoYWluX3Jvb3Q7CisKKy8qIEZyY2hhaW4gd2UgYXJlIGFzc2VtYmxpbmcgaW50byBub3cuICBUaGF0IGlzLCB0aGUgY3VycmVudCBzZWdtZW50J3MKKyAgIGZyYWcgY2hhaW4sIGV2ZW4gaWYgaXQgY29udGFpbnMgbm8gKGNvbXBsZXRlKSBmcmFncy4gKi8KK2V4dGVybiBmcmNoYWluUyAqZnJjaGFpbl9ub3c7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc2VnbWVudF9pbmZvX3N0cnVjdAoreworICBmcmNoYWluUyAqZnJjaGFpblA7CisgIHVuc2lnbmVkIGludCBoYWRvbmUgOiAxOworCisgIC8qIFRoaXMgZmllbGQgaXMgc2V0IGlmIHRoaXMgaXMgYSAuYnNzIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgcmVhbGx5CisgICAgIGhhdmUgYW55IGNvbnRlbnRzLiAgT25jZSB1cG9uIGEgdGltZSBhIC5ic3Mgc2VjdGlvbiBkaWQgbm90IGhhdmUKKyAgICAgYW55IGZyYWdzLCBidXQgdGhhdCBpcyBubyBsb25nZXIgdHJ1ZS4gIFRoaXMgZmllbGQgcHJldmVudCB0aGUKKyAgICAgU0VDX0hBU19DT05URU5UUyBmbGFnIGZyb20gYmVpbmcgc2V0IGZvciB0aGUgc2VjdGlvbiBldmVuIGlmCisgICAgIHRoZXJlIGFyZSBmcmFncy4gICovCisgIHVuc2lnbmVkIGludCBic3MgOiAxOworCisgIGludCB1c2VyX3N0dWZmOworCisgIC8qIEZpeHVwcyBmb3IgdGhpcyBzZWdtZW50LiAgSWYgQkZEX0FTU0VNQkxFUiwgdGhpcyBpcyBvbmx5IHZhbGlkCisgICAgIGFmdGVyIHRoZSBmcmNoYWlucyBhcmUgcnVuIHRvZ2V0aGVyLiAgKi8KKyAgZml4UyAqZml4X3Jvb3Q7CisgIGZpeFMgKmZpeF90YWlsOworCisjaWYgZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCisgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2NuaGRyOworICBlbnVtIGxpbmtvbmNlX3R5cGUgbGlua29uY2U7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisjZW5kaWYKKworICBzeW1ib2xTICpkb3Q7CisKKyAgc3RydWN0IGxpbmVub19saXN0ICpsaW5lbm9fbGlzdF9oZWFkOworICBzdHJ1Y3QgbGluZW5vX2xpc3QgKmxpbmVub19saXN0X3RhaWw7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIC8qIFdoaWNoIEJGRCBzZWN0aW9uIGRvZXMgdGhpcyBnYXMgc2VnbWVudCBjb3JyZXNwb25kIHRvPyAgKi8KKyAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworCisgIC8qIE5VTEwsIG9yIHBvaW50ZXIgdG8gdGhlIGdhcyBzeW1ib2wgdGhhdCBpcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yCisgICAgIHRoaXMgc2VjdGlvbi4gIHN5bS0+YnN5bSBhbmQgYmZkX3NlY3Rpb24tPnN5bWJvbCBzaG91bGQgYmUgdGhlIHNhbWUuICAqLworICBzeW1ib2xTICpzeW07CisjZW5kaWYKKworICB1bmlvbgorICAgIHsKKyAgICAgIC8qIEN1cnJlbnQgc2l6ZSBvZiBzZWN0aW9uIGhvbGRpbmcgc3RhYnMgc3RyaW5ncy4gICovCisgICAgICB1bnNpZ25lZCBsb25nIHN0YWJfc3RyaW5nX3NpemU7CisgICAgICAvKiBJbml0aWFsIGZyYWcgZm9yIEVMRi4gICovCisgICAgICBjaGFyICpwOworICAgIH0KKyAgc3RhYnU7CisKKyNpZmRlZiBORUVEX0xJVEVSQUxfUE9PTAorICB1bnNpZ25lZCBsb25nIGxpdGVyYWxfcG9vbF9zaXplOworI2VuZGlmCisKKyNpZmRlZiBUQ19TRUdNRU5UX0lORk9fVFlQRQorICBUQ19TRUdNRU5UX0lORk9fVFlQRSB0Y19zZWdtZW50X2luZm9fZGF0YTsKKyNlbmRpZgorfSBzZWdtZW50X2luZm9fdHlwZTsKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKworZXh0ZXJuIHNlZ21lbnRfaW5mb190eXBlICpzZWdfaW5mbyBQQVJBTVMgKChzZWdUKSk7CitleHRlcm4gc3ltYm9sUyAqc2VjdGlvbl9zeW1ib2wgUEFSQU1TICgoc2VnVCkpOworCisjZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KKworI2lmZGVmIE1BTllfU0VHTUVOVFMKKworZXh0ZXJuIHNlZ21lbnRfaW5mb190eXBlIHNlZ21lbnRfaW5mb1tdOworCisjZGVmaW5lIHNlZ19pbmZvKFNFQykJKCZzZWdtZW50X2luZm9bU0VDXSkKKworI2Vsc2UKKworLyogU2VudGluZWwgZm9yIGZyY2hhaW4gY3Jhd2xpbmcuICBQb2ludHMgdG8gdGhlIDFzdCBkYXRhLXNlZ21lbnQKKyAgIGZyY2hhaW4uICAoV2hpY2ggaXMgcG9pbnRlZCB0byBieSB0aGUgbGFzdCB0ZXh0LXNlZ21lbnQgZnJjaGFpbi4pICovCitleHRlcm4gZnJjaGFpblMgKmRhdGEwX2ZyY2hhaW5QOworZXh0ZXJuIGZyY2hhaW5TICpic3MwX2ZyY2hhaW5QOworCisvKiBEdW1teSBzbyBzdHVmZiBjYW4gY29tcGlsZS4gIFNob3VsZCBuZXZlciBiZSB1c2VkLiAgKi8KK3N0cnVjdCBzZWdfaW5mb190cmFzaCB7CisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgc3RhYl9zdHJpbmdfc2l6ZSA6IDE7CisgIH0gc3RhYnU7CisgIHVuc2lnbmVkIGhhZG9uZSA6IDE7Cit9OworI2RlZmluZSBzZWdfaW5mbyhTKQkoYWJvcnQgKCksIChzdHJ1Y3Qgc2VnX2luZm9fdHJhc2ggKikgMCkKKworI2VuZGlmCisKKyNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KKworZXh0ZXJuIHZvaWQgc3Vic2Vnc19wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOworCisvKiBlbmQgb2Ygc3Vic2Vncy5oICovCmRpZmYgLS1naXQgYS9nYXMvc3ltYm9scy5jIGIvZ2FzL3N5bWJvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNkZTZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3N5bWJvbHMuYwpAQCAtMCwwICsxLDE3ODUgQEAKKy8qIHN5bWJvbHMuYyAtc3ltYm9sIHRhYmxlLQorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiAjZGVmaW5lIERFQlVHX1NZTVMgLyAqIHRvIGRlYnVnIHN5bWJvbCBsaXN0IG1haW50ZW5hbmNlICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiYXMuaCIKKworI2luY2x1ZGUgIm9ic3RhY2suaCIJCS8qIEZvciAic3ltYm9scy5oIiAqLworI2luY2x1ZGUgInN1YnNlZ3MuaCIKKworLyogVGhpcyBpcyBub24temVybyBpZiBzeW1ib2xzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgd2hpY2ggaXMgdGhlCisgICBkZWZhdWx0LiAgKi8KK2ludCBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gMTsKKworI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECitleHRlcm4gaW50IG5ld19icm9rZW5fd29yZHM7CisjZW5kaWYKKworLyogc3ltYm9sLW5hbWUgPT4gc3RydWN0IHN5bWJvbCBwb2ludGVyICovCitzdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqc3lfaGFzaDsKKworLyogQmVsb3cgYXJlIGNvbW1lbnRlZCBpbiAic3ltYm9scy5oIi4gKi8KK3N5bWJvbFMgKnN5bWJvbF9yb290UDsKK3N5bWJvbFMgKnN5bWJvbF9sYXN0UDsKK3N5bWJvbFMgYWJzX3N5bWJvbDsKKworI2lmZGVmIERFQlVHX1NZTVMKKyNkZWZpbmUgZGVidWdfdmVyaWZ5X3N5bWNoYWluIHZlcmlmeV9zeW1ib2xfY2hhaW4KKyNlbHNlCisjZGVmaW5lIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbihyb290LCBsYXN0KSAoKHZvaWQpIDApCisjZW5kaWYKKworc3RydWN0IG9ic3RhY2sgbm90ZXM7CisKK3N0YXRpYyB2b2lkIGZiX2xhYmVsX2luaXQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGxvbmcgZG9sbGFyX2xhYmVsX2luc3RhbmNlIFBBUkFNUyAoKGxvbmcpKTsKK3N0YXRpYyBsb25nIGZiX2xhYmVsX2luc3RhbmNlIFBBUkFNUyAoKGxvbmcpKTsKKworc3RhdGljIHZvaWQgcHJpbnRfYmluYXJ5IFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCBleHByZXNzaW9uUyAqKSk7CisKKy8qIHN5bWJvbF9uZXcoKQorICAKKyAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXcgc3ltYm9sLiAgRGllIGlmIHdlIGNhbid0IG1ha2UgYSBuZXcKKyAgIHN5bWJvbC4gIEZpbGwgaW4gdGhlIHN5bWJvbCdzIHZhbHVlcy4gIEFkZCBzeW1ib2wgdG8gZW5kIG9mIHN5bWJvbAorICAgY2hhaW4uCisgCisgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBjcmVhdGluZyBhCisgICBzeW1ib2wuICBIb3dldmVyLCBpZiB0aGUgb3V0cHV0IGZpbGUgc3ltYm9sIHRhYmxlIGhhcyBhbHJlYWR5IGJlZW4KKyAgIHNldCwgYW5kIHlvdSBhcmUgY2VydGFpbiB0aGF0IHRoaXMgc3ltYm9sIHdvbid0IGJlIHdhbnRlZCBpbiB0aGUKKyAgIG91dHB1dCBmaWxlLCB5b3UgY2FuIGNhbGwgc3ltYm9sX2NyZWF0ZS4gICovCisKK3N5bWJvbFMgKgorc3ltYm9sX25ldyAobmFtZSwgc2VnbWVudCwgdmFsdSwgZnJhZykKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgc2VnVCBzZWdtZW50OworICAgICB2YWx1ZVQgdmFsdTsKKyAgICAgZnJhZ1MgKmZyYWc7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFAgPSBzeW1ib2xfY3JlYXRlIChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKTsKKworICAvKgorICAgKiBMaW5rIHRvIGVuZCBvZiBzeW1ib2wgY2hhaW4uCisgICAqLworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgeworICAgIGV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKKyAgICBpZiAoc3ltYm9sX3RhYmxlX2Zyb3plbikKKyAgICAgIGFib3J0ICgpOworICB9CisjZW5kaWYKKyAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKworICByZXR1cm4gc3ltYm9sUDsKK30KKworc3ltYm9sUyAqCitzeW1ib2xfY3JlYXRlIChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQorICAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogSXQgaXMgY29waWVkLCB0aGUgY2FsbGVyIGNhbiBkZXN0cm95L21vZGlmeSAqLworICAgICBzZWdUIHNlZ21lbnQ7CQkvKiBTZWdtZW50IGlkZW50aWZpZXIgKFNFR188c29tZXRoaW5nPikgKi8KKyAgICAgdmFsdWVUIHZhbHU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KKyAgICAgZnJhZ1MgKmZyYWc7CQkvKiBBc3NvY2lhdGVkIGZyYWdtZW50ICovCit7CisgIHVuc2lnbmVkIGludCBuYW1lX2xlbmd0aDsKKyAgY2hhciAqcHJlc2VydmVkX2NvcHlfb2ZfbmFtZTsKKyAgc3ltYm9sUyAqc3ltYm9sUDsKKworICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSkgKyAxOwkvKiArMSBmb3IgXDAgKi8KKyAgb2JzdGFja19ncm93ICgmbm90ZXMsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKKyAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOworI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKKyAgaWYgKHByZXNlcnZlZF9jb3B5X29mX25hbWVbMF0gPT0gJ18nKQorICAgIHByZXNlcnZlZF9jb3B5X29mX25hbWUrKzsKKyNlbmRpZgorCisjaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCisgIHByZXNlcnZlZF9jb3B5X29mX25hbWUgPQorICAgIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAocHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7CisjZW5kaWYKKworICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnM7CisKKyAgICAgIGZvciAocyA9ICh1bnNpZ25lZCBjaGFyICopIHByZXNlcnZlZF9jb3B5X29mX25hbWU7ICpzICE9ICdcMCc7IHMrKykKKwlpZiAoaXNsb3dlciAoKnMpKQorCSAgKnMgPSB0b3VwcGVyICgqcyk7CisgICAgfQorCisgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3ltYm9sUykpOworCisgIC8qIHN5bWJvbCBtdXN0IGJlIGJvcm4gaW4gc29tZSBmaXhlZCBzdGF0ZS4gIFRoaXMgc2VlbXMgYXMgZ29vZCBhcyBhbnkuICovCisgIG1lbXNldCAoc3ltYm9sUCwgMCwgc2l6ZW9mIChzeW1ib2xTKSk7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIHN5bWJvbFAtPmJzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKHN0ZG91dHB1dCk7CisgIGlmIChzeW1ib2xQLT5ic3ltID09IE5VTEwpCisgICAgYXNfcGVycm9yICgiJXMiLCAiYmZkX21ha2VfZW1wdHlfc3ltYm9sIik7CisgIHN5bWJvbFAtPmJzeW0tPnVkYXRhLnAgPSAoUFRSKSBzeW1ib2xQOworI2VuZGlmCisgIFNfU0VUX05BTUUgKHN5bWJvbFAsIHByZXNlcnZlZF9jb3B5X29mX25hbWUpOworCisgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNlZ21lbnQpOworICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsdSk7CisgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKKworICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZzsKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorICBzeW1ib2xQLT5zeV9udW1iZXIgPSB+MDsKKyAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSB+MDsKKyNlbmRpZgorCisgIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOworCisjaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCisgIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7CisjZW5kaWYKKworICByZXR1cm4gc3ltYm9sUDsKK30KKwwKKworLyoKKyAqCQkJY29sb24oKQorICoKKyAqIFdlIGhhdmUganVzdCBzZWVuICI8bmFtZT46Ii4KKyAqIENyZWF0ZXMgYSBzdHJ1Y3Qgc3ltYm9sIHVubGVzcyBpdCBhbHJlYWR5IGV4aXN0cy4KKyAqCisgKiBHcmlwZXMgaWYgd2UgYXJlIHJlZGVmaW5pbmcgYSBzeW1ib2wgaW5jb21wYXRpYmx5IChhbmQgaWdub3JlcyBpdCkuCisgKgorICovCitzeW1ib2xTICoKK2NvbG9uIChzeW1fbmFtZSkJCS8qIGp1c3Qgc2VlbiAieDoiIC0gcmF0dGxlIHN5bWJvbHMgJiBmcmFncyAqLworICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsJLyogc3ltYm9sIG5hbWUsIGFzIGEgY2Fubm9uaWNhbCBzdHJpbmcgKi8KKyAgICAgLyogV2UgY29weSB0aGlzIHN0cmluZzogT0sgdG8gYWx0ZXIgbGF0ZXIuICovCit7CisgIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHN5bWJvbCB3ZSBhcmUgd29ya2luZyB3aXRoICovCisKKyAgLyogU3VuIGxvY2FsIGxhYmVscyBnbyBvdXQgb2Ygc2NvcGUgd2hlbmV2ZXIgYSBub24tbG9jYWwgc3ltYm9sIGlzCisgICAgIGRlZmluZWQuICAqLworICBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUikKKyAgICB7CisgICAgICBpbnQgbG9jYWw7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgICBsb2NhbCA9IGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChzdGRvdXRwdXQsIHN5bV9uYW1lKTsKKyNlbHNlCisgICAgICBsb2NhbCA9IExPQ0FMX0xBQkVMIChzeW1fbmFtZSk7CisjZW5kaWYKKworICAgICAgaWYgKCEgbG9jYWwpCisJZG9sbGFyX2xhYmVsX2NsZWFyICgpOworICAgIH0KKworI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECisgIGlmIChuZXdfYnJva2VuX3dvcmRzKQorICAgIHsKKyAgICAgIHN0cnVjdCBicm9rZW5fd29yZCAqYTsKKyAgICAgIGludCBwb3NzaWJsZV9ieXRlczsKKyAgICAgIGZyYWdTICpmcmFnX3RtcDsKKyAgICAgIGNoYXIgKmZyYWdfb3Bjb2RlOworCisgICAgICBleHRlcm4gY29uc3QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZTsKKyAgICAgIGV4dGVybiBjb25zdCBpbnQgbWRfbG9uZ19qdW1wX3NpemU7CisgICAgICBwb3NzaWJsZV9ieXRlcyA9IChtZF9zaG9ydF9qdW1wX3NpemUKKwkJCSsgbmV3X2Jyb2tlbl93b3JkcyAqIG1kX2xvbmdfanVtcF9zaXplKTsKKworICAgICAgZnJhZ190bXAgPSBmcmFnX25vdzsKKyAgICAgIGZyYWdfb3Bjb2RlID0gZnJhZ192YXIgKHJzX2Jyb2tlbl93b3JkLAorCQkJICAgICAgcG9zc2libGVfYnl0ZXMsCisJCQkgICAgICBwb3NzaWJsZV9ieXRlcywKKwkJCSAgICAgIChyZWxheF9zdWJzdGF0ZVQpIDAsCisJCQkgICAgICAoc3ltYm9sUyAqKSBicm9rZW5fd29yZHMsCisJCQkgICAgICAob2Zmc2V0VCkgMCwKKwkJCSAgICAgIE5VTEwpOworCisgICAgICAvKiBXZSB3YW50IHRvIHN0b3JlIHRoZSBwb2ludGVyIHRvIHdoZXJlIHRvIGluc2VydCB0aGUganVtcCB0YWJsZSBpbiB0aGUKKwkgZnJfb3Bjb2RlIG9mIHRoZSByc19icm9rZW5fd29yZCBmcmFnLiAgVGhpcyByZXF1aXJlcyBhIGxpdHRsZQorCSBoYWNrZXJ5LiAgKi8KKyAgICAgIHdoaWxlIChmcmFnX3RtcAorCSAgICAgJiYgKGZyYWdfdG1wLT5mcl90eXBlICE9IHJzX2Jyb2tlbl93b3JkCisJCSB8fCBmcmFnX3RtcC0+ZnJfb3Bjb2RlKSkKKwlmcmFnX3RtcCA9IGZyYWdfdG1wLT5mcl9uZXh0OworICAgICAga25vdyAoZnJhZ190bXApOworICAgICAgZnJhZ190bXAtPmZyX29wY29kZSA9IGZyYWdfb3Bjb2RlOworICAgICAgbmV3X2Jyb2tlbl93b3JkcyA9IDA7CisKKyAgICAgIGZvciAoYSA9IGJyb2tlbl93b3JkczsgYSAmJiBhLT5kaXNwZnJhZyA9PSAwOyBhID0gYS0+bmV4dF9icm9rZW5fd29yZCkKKwlhLT5kaXNwZnJhZyA9IGZyYWdfdG1wOworICAgIH0KKyNlbmRpZiAvKiBXT1JLSU5HX0RPVF9XT1JEICovCisKKyAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKHN5bV9uYW1lKSkgIT0gMCkKKyAgICB7CisjaWZkZWYgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OCisgICAgICBpZiAoUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OIChzeW1ib2xQKSkKKwlyZXR1cm4gc3ltYm9sUDsKKyNlbmRpZgorICAgICAgLyoKKyAgICAgICAqCU5vdyBjaGVjayBmb3IgdW5kZWZpbmVkIHN5bWJvbHMKKyAgICAgICAqLworICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKKwl7CisJICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCisJICAgIHsKKwkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7CisjaWZkZWYgT0JKX1ZNUworCSAgICAgIFNfU0VUX09USEVSKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOworI2VuZGlmCisJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisJICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgbm93X3NlZyk7CisjaWZkZWYgTl9VTkRGCisJICAgICAga25vdyAoTl9VTkRGID09IDApOworI2VuZGlmIC8qIGlmIHdlIGhhdmUgb25lLCBpdCBiZXR0ZXIgYmUgemVyby4gKi8KKworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqCVRoZXJlIGFyZSBzdGlsbCBzZXZlcmFsIGNhc2VzIHRvIGNoZWNrOgorCSAgICAgICAqCQlBIC5jb21tLy5sY29tbSBzeW1ib2wgYmVpbmcgcmVkZWZpbmVkIGFzCisJICAgICAgICoJCQlpbml0aWFsaXplZCBkYXRhIGlzIE9LCisJICAgICAgICoJCUEgLmNvbW0vLmxjb21tIHN5bWJvbCBiZWluZyByZWRlZmluZWQgd2l0aAorCSAgICAgICAqCQkJYSBsYXJnZXIgc2l6ZSBpcyBhbHNvIE9LCisJICAgICAgICoKKwkgICAgICAgKiBUaGlzIG9ubHkgdXNlZCB0byBiZSBhbGxvd2VkIG9uIFZNUyBnYXMsIGJ1dCBTdW4gY2MKKwkgICAgICAgKiBvbiB0aGUgc3BhcmMgYWxzbyBkZXBlbmRzIG9uIGl0LgorCSAgICAgICAqLworCisJICAgICAgaWYgKCgoIVNfSVNfREVCVUcgKHN5bWJvbFApCisJCSAgICAmJiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKQorCQkgICAgJiYgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkpCisJCSAgIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQorCQkgICYmIChub3dfc2VnID09IGRhdGFfc2VjdGlvbgorCQkgICAgICB8fCBub3dfc2VnID09IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApKSkKKwkJeworCQkgIC8qCisJCSAgICoJU2VsZWN0IHdoaWNoIG9mIHRoZSAyIGNhc2VzIHRoaXMgaXMKKwkJICAgKi8KKwkJICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24pCisJCSAgICB7CisJCSAgICAgIC8qCisJCSAgICAgICAqICAgTmV3IC5jb21tIGZvciBwcmV2IC5jb21tIHN5bWJvbC4KKwkJICAgICAgICoJSWYgdGhlIG5ldyBzaXplIGlzIGxhcmdlciB3ZSBqdXN0CisJCSAgICAgICAqCWNoYW5nZSBpdHMgdmFsdWUuICBJZiB0aGUgbmV3IHNpemUKKwkJICAgICAgICoJaXMgc21hbGxlciwgd2UgaWdub3JlIHRoaXMgc3ltYm9sCisJCSAgICAgICAqLworCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApCisJCQkgIDwgKCh1bnNpZ25lZCkgZnJhZ19ub3dfZml4ICgpKSkKKwkJCXsKKwkJCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBJdCBpcyBhIC5jb21tLy5sY29tbSBiZWluZyBjb252ZXJ0ZWQgdG8gaW5pdGlhbGl6ZWQKKwkJCSBkYXRhLiAgKi8KKwkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OworI2lmZGVmIE9CSl9WTVMKKwkJICAgICAgU19TRVRfT1RIRVIoc3ltYm9sUCwgY29uc3RfZmxhZyk7CisjZW5kaWYKKwkJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7CisJCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5vd19zZWcpOwkvKiBrZWVwIE5fRVhUIGJpdCAqLworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisjaWYgZGVmaW5lZCAoU19HRVRfT1RIRVIpICYmIGRlZmluZWQgKFNfR0VUX0RFU0MpCisJCSAgYXNfZmF0YWwgKF8oIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lZC4lZC4lbGQuIiksCisJCQkgICAgc3ltX25hbWUsCisJCQkgICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSksCisJCQkgICAgU19HRVRfT1RIRVIgKHN5bWJvbFApLCBTX0dFVF9ERVNDIChzeW1ib2xQKSwKKwkJCSAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKKyNlbHNlCisJCSAgYXNfZmF0YWwgKF8oIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lbGQuIiksCisJCQkgICAgc3ltX25hbWUsCisJCQkgICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSksCisJCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7CisjZW5kaWYKKwkJfQorCSAgICB9CQkJLyogaWYgdGhlIHVuZGVmaW5lZCBzeW1ib2wgaGFzIG5vIHZhbHVlICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIERvbid0IGJsb3cgdXAgaWYgdGhlIGRlZmluaXRpb24gaXMgdGhlIHNhbWUgKi8KKwkgIGlmICghKGZyYWdfbm93ID09IHN5bWJvbFAtPnN5X2ZyYWcKKwkJJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IGZyYWdfbm93X2ZpeCAoKQorCQkmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBub3dfc2VnKSkKKwkgICAgYXNfZmF0YWwgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIiksIHN5bV9uYW1lKTsKKwl9CQkJLyogaWYgdGhpcyBzeW1ib2wgaXMgbm90IHlldCBkZWZpbmVkICovCisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAoc3ltX25hbWUsIG5vd19zZWcsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKKwkJCSAgICBmcmFnX25vdyk7CisjaWZkZWYgT0JKX1ZNUworICAgICAgU19TRVRfT1RIRVIgKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOworI2VuZGlmIC8qIE9CSl9WTVMgKi8KKworICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7CisgICAgfQkJCQkvKiBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBzeW1ib2wgYmVmb3JlICovCisKKyAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBzeW1ib2wgaXMgYWN0dWFsbHkgYmVpbmcgZGVmaW5lZCB3aXRoaW4gYW4gTVJJIGNvbW1vbgorICAgICAgICAgc2VjdGlvbi4gIFRoaXMgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4gICovCisgICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7CisgICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBtcmlfY29tbW9uX3N5bWJvbDsKKyAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCk7CisgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgZXhwcl9zZWN0aW9uKTsKKyAgICAgIHN5bWJvbFAtPnN5X21yaV9jb21tb24gPSAxOworICAgIH0KKworI2lmZGVmIHRjX2Zyb2JfbGFiZWwKKyAgdGNfZnJvYl9sYWJlbCAoc3ltYm9sUCk7CisjZW5kaWYKKyNpZmRlZiBvYmpfZnJvYl9sYWJlbAorICBvYmpfZnJvYl9sYWJlbCAoc3ltYm9sUCk7CisjZW5kaWYKKworICByZXR1cm4gc3ltYm9sUDsKK30KKwwKKworLyoKKyAqCQkJc3ltYm9sX3RhYmxlX2luc2VydCgpCisgKgorICogRGllIGlmIHdlIGNhbid0IGluc2VydCB0aGUgc3ltYm9sLgorICoKKyAqLworCit2b2lkIAorc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCkKKyAgICAgc3ltYm9sUyAqc3ltYm9sUDsKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nOworCisgIGtub3cgKHN5bWJvbFApOworICBrbm93IChTX0dFVF9OQU1FIChzeW1ib2xQKSk7CisKKyAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAoc3lfaGFzaCwgU19HRVRfTkFNRSAoc3ltYm9sUCksIChQVFIpIHN5bWJvbFApKSkKKyAgICB7CisgICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIiksCisJCVNfR0VUX05BTUUgKHN5bWJvbFApLCBlcnJvcl9zdHJpbmcpOworICAgIH0JCQkJLyogb24gZXJyb3IgKi8KK30JCQkJLyogc3ltYm9sX3RhYmxlX2luc2VydCgpICovCisMCisvKgorICoJCQlzeW1ib2xfZmluZF9vcl9tYWtlKCkKKyAqCisgKiBJZiBhIHN5bWJvbCBuYW1lIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgYXMgdW5kZWZpbmVkLCBhbmQgaW5zZXJ0CisgKiBpdCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuIFJldHVybiBhIHBvaW50ZXIgdG8gaXQuCisgKi8KK3N5bWJvbFMgKgorc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKKworICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOworCisgIGlmIChzeW1ib2xQID09IE5VTEwpCisgICAgeworICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChuYW1lKTsKKworICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7CisgICAgfQkJCQkvKiBpZiBzeW1ib2wgd2Fzbid0IGZvdW5kICovCisKKyAgcmV0dXJuIChzeW1ib2xQKTsKK30JCQkJLyogc3ltYm9sX2ZpbmRfb3JfbWFrZSgpICovCisKK3N5bWJvbFMgKgorc3ltYm9sX21ha2UgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFA7CisKKyAgLyogTGV0IHRoZSBtYWNoaW5lIGRlc2NyaXB0aW9uIGRlZmF1bHQgaXQsIGUuZy4gZm9yIHJlZ2lzdGVyIG5hbWVzLiAqLworICBzeW1ib2xQID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAoKGNoYXIgKikgbmFtZSk7CisKKyAgaWYgKCFzeW1ib2xQKQorICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgKHZhbHVlVCkgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKKworICByZXR1cm4gKHN5bWJvbFApOworfQkJCQkvKiBzeW1ib2xfbWFrZSgpICovCisKKy8qCisgKgkJCXN5bWJvbF9maW5kKCkKKyAqCisgKiBJbXBsZW1lbnQgc3ltYm9sIHRhYmxlIGxvb2t1cC4KKyAqIEluOglBIHN5bWJvbCdzIG5hbWUgYXMgYSBzdHJpbmc6ICdcMCcgY2FuJ3QgYmUgcGFydCBvZiBhIHN5bWJvbCBuYW1lLgorICogT3V0OglOVUxMIGlmIHRoZSBuYW1lIHdhcyBub3QgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZWxzZSB0aGUgYWRkcmVzcworICoJb2YgYSBzdHJ1Y3Qgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUuCisgKi8KKworc3ltYm9sUyAqCitzeW1ib2xfZmluZCAobmFtZSkKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKK3sKKyNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCisgIHJldHVybiAoc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgMSkpOworI2Vsc2UgLyogU1RSSVBfVU5ERVJTQ09SRSAqLworICByZXR1cm4gKHN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIDApKTsKKyNlbmRpZiAvKiBTVFJJUF9VTkRFUlNDT1JFICovCit9CQkJCS8qIHN5bWJvbF9maW5kKCkgKi8KKworc3ltYm9sUyAqCitzeW1ib2xfZmluZF9iYXNlIChuYW1lLCBzdHJpcF91bmRlcnNjb3JlKQorICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBpbnQgc3RyaXBfdW5kZXJzY29yZTsKK3sKKyAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgKm5hbWUgPT0gJ18nKQorICAgIG5hbWUrKzsKKworI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQorICB7CisgICAgY2hhciAqY29weTsKKworICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyAxKTsKKyAgICBzdHJjcHkgKGNvcHksIG5hbWUpOworICAgIG5hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKGNvcHkpOworICB9CisjZW5kaWYKKworICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmNvcHk7CisKKyAgICAgIGNvcHkgPSAodW5zaWduZWQgY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyAxKTsKKyAgICAgIHN0cmNweSAoY29weSwgbmFtZSk7CisgICAgICBuYW1lID0gKGNvbnN0IGNoYXIgKikgY29weTsKKyAgICAgIGZvciAoOyAqY29weSAhPSAnXDAnOyBjb3B5KyspCisJaWYgKGlzbG93ZXIgKCpjb3B5KSkKKwkgICpjb3B5ID0gdG91cHBlciAoKmNvcHkpOworICAgIH0KKworICByZXR1cm4gKChzeW1ib2xTICopIGhhc2hfZmluZCAoc3lfaGFzaCwgbmFtZSkpOworfQorCisvKgorICogT25jZSB1cG9uIGEgdGltZSwgc3ltYm9scyB3ZXJlIGtlcHQgaW4gYSBzaW5nbHkgbGlua2VkIGxpc3QuICBBdAorICogbGVhc3QgY29mZiBuZWVkcyB0byBiZSBhYmxlIHRvIHJlYXJyYW5nZSB0aGVtIGZyb20gdGltZSB0byB0aW1lLCBmb3IKKyAqIHdoaWNoIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGlzIG11Y2ggbW9yZSBjb252ZW5pZW50LiAgTG9pYyBkaWQgdGhlc2UKKyAqIGFzIG1hY3JvcyB3aGljaCBzZWVtZWQgZGFuZ2Vyb3VzIHRvIG1lIHNvIHRoZXkncmUgbm93IGZ1bmN0aW9ucy4KKyAqIHhveG9yaWNoLgorICovCisKKy8qIExpbmsgc3ltYm9sIEFERE1FIGFmdGVyIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwordm9pZCAKK3N5bWJvbF9hcHBlbmQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQorICAgICBzeW1ib2xTICphZGRtZTsKKyAgICAgc3ltYm9sUyAqdGFyZ2V0OworICAgICBzeW1ib2xTICoqcm9vdFBQOworICAgICBzeW1ib2xTICoqbGFzdFBQOworeworICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgeworICAgICAga25vdyAoKnJvb3RQUCA9PSBOVUxMKTsKKyAgICAgIGtub3cgKCpsYXN0UFAgPT0gTlVMTCk7CisgICAgICBhZGRtZS0+c3lfbmV4dCA9IE5VTEw7CisjaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUworICAgICAgYWRkbWUtPnN5X3ByZXZpb3VzID0gTlVMTDsKKyNlbmRpZgorICAgICAgKnJvb3RQUCA9IGFkZG1lOworICAgICAgKmxhc3RQUCA9IGFkZG1lOworICAgICAgcmV0dXJuOworICAgIH0JCQkJLyogaWYgdGhlIGxpc3QgaXMgZW1wdHkgKi8KKworICBpZiAodGFyZ2V0LT5zeV9uZXh0ICE9IE5VTEwpCisgICAgeworI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKKyAgICAgIHRhcmdldC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPSBhZGRtZTsKKyNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAga25vdyAoKmxhc3RQUCA9PSB0YXJnZXQpOworICAgICAgKmxhc3RQUCA9IGFkZG1lOworICAgIH0JCQkJLyogaWYgd2UgaGF2ZSBhIG5leHQgKi8KKworICBhZGRtZS0+c3lfbmV4dCA9IHRhcmdldC0+c3lfbmV4dDsKKyAgdGFyZ2V0LT5zeV9uZXh0ID0gYWRkbWU7CisKKyNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCisgIGFkZG1lLT5zeV9wcmV2aW91cyA9IHRhcmdldDsKKyNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCisKKyAgZGVidWdfdmVyaWZ5X3N5bWNoYWluIChzeW1ib2xfcm9vdFAsIHN5bWJvbF9sYXN0UCk7Cit9CisKKy8qIFNldCB0aGUgY2hhaW4gcG9pbnRlcnMgb2YgU1lNQk9MIHRvIG51bGwuICovCit2b2lkIAorc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApCisgICAgIHN5bWJvbFMgKnN5bWJvbFA7Cit7CisgIHN5bWJvbFAtPnN5X25leHQgPSBOVUxMOworI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKKyAgc3ltYm9sUC0+c3lfcHJldmlvdXMgPSBOVUxMOworI2VuZGlmCit9CisKKyNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCisvKiBSZW1vdmUgU1lNQk9MUCBmcm9tIHRoZSBsaXN0LiAqLwordm9pZCAKK3N5bWJvbF9yZW1vdmUgKHN5bWJvbFAsIHJvb3RQUCwgbGFzdFBQKQorICAgICBzeW1ib2xTICpzeW1ib2xQOworICAgICBzeW1ib2xTICoqcm9vdFBQOworICAgICBzeW1ib2xTICoqbGFzdFBQOworeworICBpZiAoc3ltYm9sUCA9PSAqcm9vdFBQKQorICAgIHsKKyAgICAgICpyb290UFAgPSBzeW1ib2xQLT5zeV9uZXh0OworICAgIH0JCQkJLyogaWYgaXQgd2FzIHRoZSByb290ICovCisKKyAgaWYgKHN5bWJvbFAgPT0gKmxhc3RQUCkKKyAgICB7CisgICAgICAqbGFzdFBQID0gc3ltYm9sUC0+c3lfcHJldmlvdXM7CisgICAgfQkJCQkvKiBpZiBpdCB3YXMgdGhlIHRhaWwgKi8KKworICBpZiAoc3ltYm9sUC0+c3lfbmV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN5bWJvbFAtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gc3ltYm9sUC0+c3lfcHJldmlvdXM7CisgICAgfQkJCQkvKiBpZiBub3QgbGFzdCAqLworCisgIGlmIChzeW1ib2xQLT5zeV9wcmV2aW91cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN5bWJvbFAtPnN5X3ByZXZpb3VzLT5zeV9uZXh0ID0gc3ltYm9sUC0+c3lfbmV4dDsKKyAgICB9CQkJCS8qIGlmIG5vdCBmaXJzdCAqLworCisgIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoKnJvb3RQUCwgKmxhc3RQUCk7Cit9CisKKy8qIExpbmsgc3ltYm9sIEFERE1FIGJlZm9yZSBzeW1ib2wgVEFSR0VUIGluIHRoZSBjaGFpbi4gKi8KK3ZvaWQgCitzeW1ib2xfaW5zZXJ0IChhZGRtZSwgdGFyZ2V0LCByb290UFAsIGxhc3RQUCkKKyAgICAgc3ltYm9sUyAqYWRkbWU7CisgICAgIHN5bWJvbFMgKnRhcmdldDsKKyAgICAgc3ltYm9sUyAqKnJvb3RQUDsKKyAgICAgc3ltYm9sUyAqKmxhc3RQUDsKK3sKKyAgaWYgKHRhcmdldC0+c3lfcHJldmlvdXMgIT0gTlVMTCkKKyAgICB7CisgICAgICB0YXJnZXQtPnN5X3ByZXZpb3VzLT5zeV9uZXh0ID0gYWRkbWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAga25vdyAoKnJvb3RQUCA9PSB0YXJnZXQpOworICAgICAgKnJvb3RQUCA9IGFkZG1lOworICAgIH0JCQkJLyogaWYgbm90IGZpcnN0ICovCisKKyAgYWRkbWUtPnN5X3ByZXZpb3VzID0gdGFyZ2V0LT5zeV9wcmV2aW91czsKKyAgdGFyZ2V0LT5zeV9wcmV2aW91cyA9IGFkZG1lOworICBhZGRtZS0+c3lfbmV4dCA9IHRhcmdldDsKKworICBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gKCpyb290UFAsICpsYXN0UFApOworfQorCisjZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLworCit2b2lkIAordmVyaWZ5X3N5bWJvbF9jaGFpbiAocm9vdFAsIGxhc3RQKQorICAgICBzeW1ib2xTICpyb290UDsKKyAgICAgc3ltYm9sUyAqbGFzdFA7Cit7CisgIHN5bWJvbFMgKnN5bWJvbFAgPSByb290UDsKKworICBpZiAoc3ltYm9sUCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmb3IgKDsgc3ltYm9sX25leHQgKHN5bWJvbFApICE9IE5VTEw7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCisgICAgeworI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKKyAgICAgIGFzc2VydCAoc3ltYm9sUC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPT0gc3ltYm9sUCk7CisjZWxzZQorICAgICAgLyogV2FsayB0aGUgbGlzdCBhbnl3YXlzLCB0byBtYWtlIHN1cmUgcG9pbnRlcnMgYXJlIHN0aWxsIGdvb2QuICAqLworICAgICAgOworI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KKyAgICB9CisKKyAgYXNzZXJ0IChsYXN0UCA9PSBzeW1ib2xQKTsKK30KKwordm9pZAordmVyaWZ5X3N5bWJvbF9jaGFpbl8yIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgc3ltYm9sUyAqcCA9IHN5bSwgKm4gPSBzeW07CisjaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUworICB3aGlsZSAoc3ltYm9sX3ByZXZpb3VzIChwKSkKKyAgICBwID0gc3ltYm9sX3ByZXZpb3VzIChwKTsKKyNlbmRpZgorICB3aGlsZSAoc3ltYm9sX25leHQgKG4pKQorICAgIG4gPSBzeW1ib2xfbmV4dCAobik7CisgIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHAsIG4pOworfQorCisvKiBSZXNvbHZlIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgZmluYWwKKyAgIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlIHRvIHJlc29sdmUgYW55IHN5bWJvbHMgd2l0aCBjb21wbGV4CisgICB2YWx1ZXMuICAqLworCit2YWx1ZVQKK3Jlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1wLCBmaW5hbGl6ZSkKKyAgICAgc3ltYm9sUyAqc3ltcDsKKyAgICAgaW50IGZpbmFsaXplOworeworICBpbnQgcmVzb2x2ZWQ7CisgIHZhbHVlVCBmaW5hbF92YWw7CisgIHNlZ1QgZmluYWxfc2VnOworCisgIGlmIChzeW1wLT5zeV9yZXNvbHZlZCkKKyAgICB7CisgICAgICBpZiAoc3ltcC0+c3lfdmFsdWUuWF9vcCA9PSBPX2NvbnN0YW50KQorCXJldHVybiAodmFsdWVUKSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorCisgIHJlc29sdmVkID0gMDsKKyAgZmluYWxfc2VnID0gU19HRVRfU0VHTUVOVCAoc3ltcCk7CisKKyAgaWYgKHN5bXAtPnN5X3Jlc29sdmluZykKKyAgICB7CisgICAgICBpZiAoZmluYWxpemUpCisJYXNfYmFkIChfKCJTeW1ib2wgZGVmaW5pdGlvbiBsb29wIGVuY291bnRlcmVkIGF0ICVzIiksIFNfR0VUX05BTUUgKHN5bXApKTsKKyAgICAgIGZpbmFsX3ZhbCA9IDA7CisgICAgICByZXNvbHZlZCA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbCwgKm9wX3N5bWJvbDsKKyAgICAgIG9mZnNldFQgbGVmdCwgcmlnaHQ7CisgICAgICBzZWdUIHNlZ19sZWZ0LCBzZWdfcmlnaHQ7CisgICAgICBvcGVyYXRvclQgb3A7CisKKyAgICAgIHN5bXAtPnN5X3Jlc29sdmluZyA9IDE7CisKKyAgICAgIC8qIEhlbHAgb3V0IHdpdGggQ1NFLiAgKi8KKyAgICAgIGFkZF9zeW1ib2wgPSBzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7CisgICAgICBvcF9zeW1ib2wgPSBzeW1wLT5zeV92YWx1ZS5YX29wX3N5bWJvbDsKKyAgICAgIGZpbmFsX3ZhbCA9IHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKKyAgICAgIG9wID0gc3ltcC0+c3lfdmFsdWUuWF9vcDsKKworICAgICAgc3dpdGNoIChvcCkKKwl7CisJZGVmYXVsdDoKKwkgIEJBRF9DQVNFIChvcCk7CisJICBicmVhazsKKworCWNhc2UgT19hYnNlbnQ6CisJICBmaW5hbF92YWwgPSAwOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKworCWNhc2UgT19jb25zdGFudDoKKwkgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzOworCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24pCisJICAgIGZpbmFsX3NlZyA9IGFic29sdXRlX3NlY3Rpb247CisJICByZXNvbHZlZCA9IDE7CisJICBicmVhazsKKworCWNhc2UgT19zeW1ib2w6CisJY2FzZSBPX3N5bWJvbF9ydmE6CisJICBsZWZ0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2wsIGZpbmFsaXplKTsKKwlkb19zeW1ib2w6CisKKwkgIGlmIChzeW1wLT5zeV9tcmlfY29tbW9uKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIHN5bWJvbCBpbnNpZGUgYW4gTVJJIGNvbW1vbiBzZWN0aW9uLiAgVGhlCisgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gcm91dGluZXMgYXJlIGdvaW5nIHRvIGhhbmRsZSBpdCBzcGVjaWFsbHkuCisgICAgICAgICAgICAgICAgIERvbid0IGNoYW5nZSB0aGUgdmFsdWUuICAqLworCSAgICAgIHJlc29sdmVkID0gYWRkX3N5bWJvbC0+c3lfcmVzb2x2ZWQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKGZpbmFsaXplICYmIGZpbmFsX3ZhbCA9PSAwKQorCSAgICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1wLCBhZGRfc3ltYm9sKTsKKworCSAgLyogSWYgd2UgaGF2ZSBlcXVhdGVkIHRoaXMgc3ltYm9sIHRvIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlCisgICAgICAgICAgICAga2VlcCBYX29wIHNldCB0byBPX3N5bWJvbCwgYW5kIHdlIGRvbid0IGNoYW5nZQorICAgICAgICAgICAgIFhfYWRkX251bWJlci4gIFRoaXMgcGVybWl0cyB0aGUgcm91dGluZSB3aGljaCB3cml0ZXMgb3V0CisgICAgICAgICAgICAgcmVsb2NhdGlvbiB0byBkZXRlY3QgdGhpcyBjYXNlLCBhbmQgY29udmVydCB0aGUKKyAgICAgICAgICAgICByZWxvY2F0aW9uIHRvIGJlIGFnYWluc3QgdGhlIHN5bWJvbCB0byB3aGljaCB0aGlzIHN5bWJvbAorICAgICAgICAgICAgIGlzIGVxdWF0ZWQuICAqLworCSAgaWYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sKSB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbCkpCisJICAgIHsKKwkgICAgICBpZiAoZmluYWxpemUpCisJCXsKKwkJICBTX1NFVF9TRUdNRU5UIChzeW1wLCBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sKSk7CisJCSAgc3ltcC0+c3lfdmFsdWUuWF9vcCA9IE9fc3ltYm9sOworCQkgIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9IGFkZF9zeW1ib2w7CisJCSAgc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyID0gZmluYWxfdmFsOworCQl9CisJICAgICAgZmluYWxfdmFsID0gMDsKKwkgICAgICByZXNvbHZlZCA9IGFkZF9zeW1ib2wtPnN5X3Jlc29sdmVkOworCSAgICAgIGdvdG8gZXhpdF9kb250X3NldF92YWx1ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3MgKyBsZWZ0OworCSAgICAgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uIHx8IGZpbmFsX3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbikKKwkJZmluYWxfc2VnID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCk7CisJICAgIH0KKworCSAgcmVzb2x2ZWQgPSBhZGRfc3ltYm9sLT5zeV9yZXNvbHZlZDsKKwkgIGJyZWFrOworCisJY2FzZSBPX3VtaW51czoKKwljYXNlIE9fYml0X25vdDoKKwljYXNlIE9fbG9naWNhbF9ub3Q6CisJICBsZWZ0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2wsIGZpbmFsaXplKTsKKworCSAgaWYgKG9wID09IE9fdW1pbnVzKQorCSAgICBsZWZ0ID0gLWxlZnQ7CisJICBlbHNlIGlmIChvcCA9PSBPX2xvZ2ljYWxfbm90KQorCSAgICBsZWZ0ID0gIWxlZnQ7CisJICBlbHNlCisJICAgIGxlZnQgPSB+bGVmdDsKKworCSAgZmluYWxfdmFsICs9IGxlZnQgKyBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzOworCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQorCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOworCisJICByZXNvbHZlZCA9IGFkZF9zeW1ib2wtPnN5X3Jlc29sdmVkOworCSAgYnJlYWs7CisKKwljYXNlIE9fbXVsdGlwbHk6CisJY2FzZSBPX2RpdmlkZToKKwljYXNlIE9fbW9kdWx1czoKKwljYXNlIE9fbGVmdF9zaGlmdDoKKwljYXNlIE9fcmlnaHRfc2hpZnQ6CisJY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CisJY2FzZSBPX2JpdF9vcl9ub3Q6CisJY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6CisJY2FzZSBPX2JpdF9hbmQ6CisJY2FzZSBPX2FkZDoKKwljYXNlIE9fc3VidHJhY3Q6CisJY2FzZSBPX2VxOgorCWNhc2UgT19uZToKKwljYXNlIE9fbHQ6CisJY2FzZSBPX2xlOgorCWNhc2UgT19nZToKKwljYXNlIE9fZ3Q6CisJY2FzZSBPX2xvZ2ljYWxfYW5kOgorCWNhc2UgT19sb2dpY2FsX29yOgorCSAgbGVmdCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChhZGRfc3ltYm9sLCBmaW5hbGl6ZSk7CisJICByaWdodCA9IHJlc29sdmVfc3ltYm9sX3ZhbHVlIChvcF9zeW1ib2wsIGZpbmFsaXplKTsKKwkgIHNlZ19sZWZ0ID0gU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCk7CisJICBzZWdfcmlnaHQgPSBTX0dFVF9TRUdNRU5UIChvcF9zeW1ib2wpOworCisJICAvKiBTaW1wbGlmeSBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhIGNvbnN0YW50IGJ5IGZvbGRpbmcgdGhlCisJICAgICBjb25zdGFudCBpbnRvIFhfYWRkX251bWJlci4gICovCisJICBpZiAob3AgPT0gT19hZGQgfHwgb3AgPT0gT19zdWJ0cmFjdCkKKwkgICAgeworCSAgICAgIGlmIChzZWdfcmlnaHQgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwkJeworCQkgIGlmIChvcCA9PSBPX2FkZCkKKwkJICAgIGZpbmFsX3ZhbCArPSByaWdodDsKKwkJICBlbHNlCisJCSAgICBmaW5hbF92YWwgLT0gcmlnaHQ7CisJCSAgb3AgPSBPX3N5bWJvbDsKKwkJICBvcF9zeW1ib2wgPSBOVUxMOworCQkgIGdvdG8gZG9fc3ltYm9sOworCQl9CisJICAgICAgZWxzZSBpZiAoc2VnX2xlZnQgPT0gYWJzb2x1dGVfc2VjdGlvbiAmJiBvcCA9PSBPX2FkZCkKKwkJeworCQkgIG9wID0gT19zeW1ib2w7CisJCSAgZmluYWxfdmFsICs9IGxlZnQ7CisJCSAgYWRkX3N5bWJvbCA9IG9wX3N5bWJvbDsKKwkJICBsZWZ0ID0gcmlnaHQ7CisJCSAgb3Bfc3ltYm9sID0gTlVMTDsKKwkJICBnb3RvIGRvX3N5bWJvbDsKKwkJfQorCSAgICB9CisKKwkgIC8qIFN1YnRyYWN0aW9uIGlzIHBlcm1pdHRlZCBpZiBib3RoIG9wZXJhbmRzIGFyZSBpbiB0aGUgc2FtZQorCSAgICAgc2VjdGlvbi4gIE90aGVyd2lzZSwgYm90aCBvcGVyYW5kcyBtdXN0IGJlIGFic29sdXRlLiAgV2UKKwkgICAgIGFscmVhZHkgaGFuZGxlZCB0aGUgY2FzZSBvZiBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhCisJICAgICBjb25zdGFudCBhYm92ZS4gIFRoaXMgd2lsbCBwcm9iYWJseSBuZWVkIHRvIGJlIGNoYW5nZWQKKwkgICAgIGZvciBhbiBvYmplY3QgZmlsZSBmb3JtYXQgd2hpY2ggc3VwcG9ydHMgYXJiaXRyYXJ5CisJICAgICBleHByZXNzaW9ucywgc3VjaCBhcyBJRUVFLTY5NS4gICovCisJICAvKiBEb24ndCBlbWl0IG1lc3NhZ2VzIHVubGVzcyB3ZSdyZSBmaW5hbGl6aW5nIHRoZSBzeW1ib2wgdmFsdWUsCisJICAgICBvdGhlcndpc2Ugd2UgbWF5IGdldCB0aGUgc2FtZSBtZXNzYWdlIG11bHRpcGxlIHRpbWVzLiAgKi8KKwkgIGlmICgoc2VnX2xlZnQgIT0gYWJzb2x1dGVfc2VjdGlvbiB8fCBzZWdfcmlnaHQgIT0gYWJzb2x1dGVfc2VjdGlvbikKKwkgICAgICAmJiAob3AgIT0gT19zdWJ0cmFjdCB8fCBzZWdfbGVmdCAhPSBzZWdfcmlnaHQpCisJICAgICAgJiYgZmluYWxpemUpCisJICAgIHsKKwkgICAgICBjaGFyICpmaWxlOworCSAgICAgIHVuc2lnbmVkIGludCBsaW5lOworCisJICAgICAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChzeW1wLCAmZmlsZSwgJmxpbmUpKQorCQl7CisJCSAgaWYgKHNlZ19sZWZ0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQorCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLAorCQkJCSAgXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24iKSwKKwkJCQkgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCkpOworCQkgIGlmIChzZWdfcmlnaHQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCisJCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCisJCQkJICBfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiIpLAorCQkJCSAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9vcF9zeW1ib2wpKTsKKwkJICBpZiAoc2VnX2xlZnQgIT0gdW5kZWZpbmVkX3NlY3Rpb24KKwkJICAgICAgJiYgc2VnX3JpZ2h0ICE9IHVuZGVmaW5lZF9zZWN0aW9uKQorCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiIpKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKKwkJICAgIGFzX2JhZCAoXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24gc2V0dGluZyAlcyIpLAorCQkJICAgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCksCisJCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOworCQkgIGlmIChzZWdfcmlnaHQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCisJCSAgICBhc19iYWQgKF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKKwkJCSAgICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX29wX3N5bWJvbCksCisJCQkgICAgU19HRVRfTkFNRSAoc3ltcCkpOworCQkgIGlmIChzZWdfbGVmdCAhPSB1bmRlZmluZWRfc2VjdGlvbgorCQkgICAgICAmJiBzZWdfcmlnaHQgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCisJCSAgICBhc19iYWQgKF8oImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIHNldHRpbmcgJXMiKSwKKwkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7CisJCX0KKwkgICAgfQorCisJICAvKiBDaGVjayBmb3IgZGl2aXNpb24gYnkgemVyby4gICovCisJICBpZiAoKG9wID09IE9fZGl2aWRlIHx8IG9wID09IE9fbW9kdWx1cykgJiYgcmlnaHQgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIElmIHNlZ19yaWdodCBpcyBub3QgYWJzb2x1dGVfc2VjdGlvbiwgdGhlbiB3ZSd2ZQorICAgICAgICAgICAgICAgICBhbHJlYWR5IGlzc3VlZCBhIHdhcm5pbmcgYWJvdXQgdXNpbmcgYSBiYWQgc3ltYm9sLiAgKi8KKwkgICAgICBpZiAoc2VnX3JpZ2h0ID09IGFic29sdXRlX3NlY3Rpb24gJiYgZmluYWxpemUpCisJCXsKKwkJICBjaGFyICpmaWxlOworCQkgIHVuc2lnbmVkIGludCBsaW5lOworCisJCSAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChzeW1wLCAmZmlsZSwgJmxpbmUpKQorCQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBfKCJkaXZpc2lvbiBieSB6ZXJvIikpOworCQkgIGVsc2UKKwkJICAgIGFzX2JhZCAoXygiZGl2aXNpb24gYnkgemVybyB3aGVuIHNldHRpbmcgJXMiKSwKKwkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7CisJCX0KKworCSAgICAgIHJpZ2h0ID0gMTsKKwkgICAgfQorCisJICBzd2l0Y2ggKHN5bXAtPnN5X3ZhbHVlLlhfb3ApCisJICAgIHsKKwkgICAgY2FzZSBPX211bHRpcGx5OgkJbGVmdCAqPSByaWdodDsgYnJlYWs7CisJICAgIGNhc2UgT19kaXZpZGU6CQlsZWZ0IC89IHJpZ2h0OyBicmVhazsKKwkgICAgY2FzZSBPX21vZHVsdXM6CQlsZWZ0ICU9IHJpZ2h0OyBicmVhazsKKwkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6CQlsZWZ0IDw8PSByaWdodDsgYnJlYWs7CisJICAgIGNhc2UgT19yaWdodF9zaGlmdDoJCWxlZnQgPj49IHJpZ2h0OyBicmVhazsKKwkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6CWxlZnQgfD0gcmlnaHQ7IGJyZWFrOworCSAgICBjYXNlIE9fYml0X29yX25vdDoJCWxlZnQgfD0gfnJpZ2h0OyBicmVhazsKKwkgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6CWxlZnQgXj0gcmlnaHQ7IGJyZWFrOworCSAgICBjYXNlIE9fYml0X2FuZDoJCWxlZnQgJj0gcmlnaHQ7IGJyZWFrOworCSAgICBjYXNlIE9fYWRkOgkJCWxlZnQgKz0gcmlnaHQ7IGJyZWFrOworCSAgICBjYXNlIE9fc3VidHJhY3Q6CQlsZWZ0IC09IHJpZ2h0OyBicmVhazsKKwkgICAgY2FzZSBPX2VxOglsZWZ0ID0gbGVmdCA9PSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKKwkgICAgY2FzZSBPX25lOglsZWZ0ID0gbGVmdCAhPSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKKwkgICAgY2FzZSBPX2x0OglsZWZ0ID0gbGVmdCA8ICByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKKwkgICAgY2FzZSBPX2xlOglsZWZ0ID0gbGVmdCA8PSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKKwkgICAgY2FzZSBPX2dlOglsZWZ0ID0gbGVmdCA+PSByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKKwkgICAgY2FzZSBPX2d0OglsZWZ0ID0gbGVmdCA+ICByaWdodCA/IH4gKG9mZnNldFQpIDAgOiAwOyBicmVhazsKKwkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOglsZWZ0ID0gbGVmdCAmJiByaWdodDsgYnJlYWs7CisJICAgIGNhc2UgT19sb2dpY2FsX29yOglsZWZ0ID0gbGVmdCB8fCByaWdodDsgYnJlYWs7CisJICAgIGRlZmF1bHQ6CQlhYm9ydCAoKTsKKwkgICAgfQorCisJICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyArIGxlZnQ7CisJICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbiB8fCBmaW5hbF9zZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCisJICAgIGZpbmFsX3NlZyA9IGFic29sdXRlX3NlY3Rpb247CisJICByZXNvbHZlZCA9IChhZGRfc3ltYm9sLT5zeV9yZXNvbHZlZCAmJiBvcF9zeW1ib2wtPnN5X3Jlc29sdmVkKTsKKyAgIAkgIGJyZWFrOworCisJY2FzZSBPX3JlZ2lzdGVyOgorCWNhc2UgT19iaWc6CisJY2FzZSBPX2lsbGVnYWw6CisJICAvKiBHaXZlIGFuIGVycm9yIChiZWxvdykgaWYgbm90IGluIGV4cHJfc2VjdGlvbi4gIFdlIGRvbid0CisJICAgICB3YW50IHRvIHdvcnJ5IGFib3V0IGV4cHJfc2VjdGlvbiBzeW1ib2xzLCBiZWNhdXNlIHRoZXkKKwkgICAgIGFyZSBmaWN0aW9uYWwgKHRoZXkgYXJlIGNyZWF0ZWQgYXMgcGFydCBvZiBleHByZXNzaW9uCisJICAgICByZXNvbHV0aW9uKSwgYW5kIGFueSBwcm9ibGVtcyBtYXkgbm90IGFjdHVhbGx5IG1lYW4KKwkgICAgIGFueXRoaW5nLiAgKi8KKwkgIGJyZWFrOworCX0KKworICAgICAgc3ltcC0+c3lfcmVzb2x2aW5nID0gMDsKKyAgICB9CisKKyAgaWYgKGZpbmFsaXplKQorICAgIHsKKyAgICAgIFNfU0VUX1ZBTFVFIChzeW1wLCBmaW5hbF92YWwpOworCisjaWYgZGVmaW5lZCAoT0JKX0FPVVQpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKKyAgICAgIC8qIFRoZSBvbGQgYS5vdXQgYmFja2VuZCBkb2VzIG5vdCBoYW5kbGUgU19TRVRfU0VHTUVOVCBjb3JyZWN0bHkKKyAgICAgICAgIGZvciBhIHN0YWIgc3ltYm9sLCBzbyB3ZSB1c2UgdGhpcyBiYWQgaGFjay4gICovCisgICAgICBpZiAoZmluYWxfc2VnICE9IFNfR0VUX1NFR01FTlQgKHN5bXApKQorI2VuZGlmCisJU19TRVRfU0VHTUVOVCAoc3ltcCwgZmluYWxfc2VnKTsKKyAgICB9CisKK2V4aXRfZG9udF9zZXRfdmFsdWU6CisgIC8qIERvbid0IHdvcnJ5IGlmIHdlIGNhbid0IHJlc29sdmUgYW4gZXhwcl9zZWN0aW9uIHN5bWJvbC4gICovCisgIGlmIChmaW5hbGl6ZSkKKyAgICB7CisgICAgICBpZiAocmVzb2x2ZWQpCisJc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOworICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgIT0gZXhwcl9zZWN0aW9uKQorCXsKKwkgIGFzX2JhZCAoXygiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIpLCBTX0dFVF9OQU1FIChzeW1wKSk7CisJICBzeW1wLT5zeV9yZXNvbHZlZCA9IDE7CisJfQorICAgIH0KKworICByZXR1cm4gZmluYWxfdmFsOworfQorCisvKiBEb2xsYXIgbGFiZWxzIGxvb2sgbGlrZSBhIG51bWJlciBmb2xsb3dlZCBieSBhIGRvbGxhciBzaWduLiAgRWcsICI0MiQiLgorICAgVGhleSBhcmUgKnJlYWxseSogbG9jYWwuICBUaGF0IGlzLCB0aGV5IGdvIG91dCBvZiBzY29wZSB3aGVuZXZlciB3ZSBzZWUgYQorICAgbGFiZWwgdGhhdCBpc24ndCBsb2NhbC4gIEFsc28sIGxpa2UgZmIgbGFiZWxzLCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKKyAgIGluc3RhbmNlcyBvZiBhIGRvbGxhciBsYWJlbC4gIFRoZXJlZm9yLCB3ZSBuYW1lIGVuY29kZSBlYWNoIGluc3RhbmNlIHdpdGgKKyAgIHRoZSBpbnN0YW5jZSBudW1iZXIsIGtlZXAgYSBsaXN0IG9mIGRlZmluZWQgc3ltYm9scyBzZXBhcmF0ZSBmcm9tIHRoZSByZWFsCisgICBzeW1ib2wgdGFibGUsIGFuZCB3ZSB0cmVhdCB0aGVzZSBidWdnZXJzIGFzIGEgc3BhcnNlIGFycmF5LiAgKi8KKworc3RhdGljIGxvbmcgKmRvbGxhcl9sYWJlbHM7CitzdGF0aWMgbG9uZyAqZG9sbGFyX2xhYmVsX2luc3RhbmNlczsKK3N0YXRpYyBjaGFyICpkb2xsYXJfbGFiZWxfZGVmaW5lczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvbGxhcl9sYWJlbF9tYXg7CisKK2ludCAKK2RvbGxhcl9sYWJlbF9kZWZpbmVkIChsYWJlbCkKKyAgICAgbG9uZyBsYWJlbDsKK3sKKyAgbG9uZyAqaTsKKworICBrbm93ICgoZG9sbGFyX2xhYmVscyAhPSBOVUxMKSB8fCAoZG9sbGFyX2xhYmVsX2NvdW50ID09IDApKTsKKworICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQorICAgIGlmICgqaSA9PSBsYWJlbCkKKyAgICAgIHJldHVybiBkb2xsYXJfbGFiZWxfZGVmaW5lc1tpIC0gZG9sbGFyX2xhYmVsc107CisKKyAgLyogaWYgd2UgZ2V0IGhlcmUsIGxhYmVsIGlzbid0IGRlZmluZWQgKi8KKyAgcmV0dXJuIDA7Cit9CQkJCS8qIGRvbGxhcl9sYWJlbF9kZWZpbmVkKCkgKi8KKworc3RhdGljIGxvbmcKK2RvbGxhcl9sYWJlbF9pbnN0YW5jZSAobGFiZWwpCisgICAgIGxvbmcgbGFiZWw7Cit7CisgIGxvbmcgKmk7CisKKyAga25vdyAoKGRvbGxhcl9sYWJlbHMgIT0gTlVMTCkgfHwgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSAwKSk7CisKKyAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKKyAgICBpZiAoKmkgPT0gbGFiZWwpCisgICAgICByZXR1cm4gKGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbaSAtIGRvbGxhcl9sYWJlbHNdKTsKKworICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZW4ndCBzZWVuIHRoZSBsYWJlbCBiZWZvcmUsIHRoZXJlZm9yZSBpdHMgaW5zdGFuY2UKKyAgICAgY291bnQgaXMgemVyby4gICovCisgIHJldHVybiAwOworfQorCit2b2lkIAorZG9sbGFyX2xhYmVsX2NsZWFyICgpCit7CisgIG1lbXNldCAoZG9sbGFyX2xhYmVsX2RlZmluZXMsICdcMCcsICh1bnNpZ25lZCBpbnQpIGRvbGxhcl9sYWJlbF9jb3VudCk7Cit9CisKKyNkZWZpbmUgRE9MTEFSX0xBQkVMX0JVTVBfQlkgMTAKKwordm9pZCAKK2RlZmluZV9kb2xsYXJfbGFiZWwgKGxhYmVsKQorICAgICBsb25nIGxhYmVsOworeworICBsb25nICppOworCisgIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCisgICAgaWYgKCppID09IGxhYmVsKQorICAgICAgeworCSsrZG9sbGFyX2xhYmVsX2luc3RhbmNlc1tpIC0gZG9sbGFyX2xhYmVsc107CisJZG9sbGFyX2xhYmVsX2RlZmluZXNbaSAtIGRvbGxhcl9sYWJlbHNdID0gMTsKKwlyZXR1cm47CisgICAgICB9CisKKyAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KKworICBpZiAoZG9sbGFyX2xhYmVscyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGRvbGxhcl9sYWJlbHMgPSAobG9uZyAqKSB4bWFsbG9jIChET0xMQVJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOworICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7CisgICAgICBkb2xsYXJfbGFiZWxfZGVmaW5lcyA9IHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZKTsKKyAgICAgIGRvbGxhcl9sYWJlbF9tYXggPSBET0xMQVJfTEFCRUxfQlVNUF9CWTsKKyAgICAgIGRvbGxhcl9sYWJlbF9jb3VudCA9IDA7CisgICAgfQorICBlbHNlIGlmIChkb2xsYXJfbGFiZWxfY291bnQgPT0gZG9sbGFyX2xhYmVsX21heCkKKyAgICB7CisgICAgICBkb2xsYXJfbGFiZWxfbWF4ICs9IERPTExBUl9MQUJFTF9CVU1QX0JZOworICAgICAgZG9sbGFyX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxzLAorCQkJCQkgZG9sbGFyX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOworICAgICAgZG9sbGFyX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzLAorCQkJCQkgIGRvbGxhcl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKKyAgICAgIGRvbGxhcl9sYWJlbF9kZWZpbmVzID0geHJlYWxsb2MgKGRvbGxhcl9sYWJlbF9kZWZpbmVzLCBkb2xsYXJfbGFiZWxfbWF4KTsKKyAgICB9CQkJCS8qIGlmIHdlIG5lZWRlZCB0byBncm93ICovCisKKyAgZG9sbGFyX2xhYmVsc1tkb2xsYXJfbGFiZWxfY291bnRdID0gbGFiZWw7CisgIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IDE7CisgIGRvbGxhcl9sYWJlbF9kZWZpbmVzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSAxOworICArK2RvbGxhcl9sYWJlbF9jb3VudDsKK30KKworLyoKKyAqCQkJZG9sbGFyX2xhYmVsX25hbWUoKQorICoKKyAqIENhbGxlciBtdXN0IGNvcHkgcmV0dXJuZWQgbmFtZTogd2UgcmUtdXNlIHRoZSBhcmVhIGZvciB0aGUgbmV4dCBuYW1lLgorICoKKyAqIFRoZSBtdGggb2NjdXJlbmNlIG9mIGxhYmVsIG46IGlzIHR1cm5lZCBpbnRvIHRoZSBzeW1ib2wgIkxuXkFtIgorICogd2hlcmUgbiBpcyB0aGUgbGFiZWwgbnVtYmVyIGFuZCBtIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuICJMIiBtYWtlcworICogaXQgYSBsYWJlbCBkaXNjYXJkZWQgdW5sZXNzIGRlYnVnZ2luZyBhbmQgIl5BIignXDEnKSBlbnN1cmVzIG5vCisgKiBvcmRpbmFyeSBzeW1ib2wgU0hPVUxEIGdldCB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwgbGFiZWwKKyAqIHN5bWJvbC4gVGhlIGZpcnN0ICI0OiIgaXMgIkw0XkExIiAtIHRoZSBtIG51bWJlcnMgYmVnaW4gYXQgMS4KKyAqCisgKiBmYiBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkIgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQS4KKyAqLworCitjaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCitkb2xsYXJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQorICAgICByZWdpc3RlciBsb25nIG47CQkvKiB3ZSBqdXN0IHNhdyAibiQ6IiA6IG4gYSBudW1iZXIgKi8KKyAgICAgcmVnaXN0ZXIgaW50IGF1Z2VuZDsJLyogMCBmb3IgY3VycmVudCBpbnN0YW5jZSwgMSBmb3IgbmV3IGluc3RhbmNlICovCit7CisgIGxvbmcgaTsKKyAgLyogUmV0dXJuZWQgdG8gY2FsbGVyLCB0aGVuIGNvcGllZC4gIHVzZWQgZm9yIGNyZWF0ZWQgbmFtZXMgKCI0ZiIpICovCisgIHN0YXRpYyBjaGFyIHN5bWJvbF9uYW1lX2J1aWxkWzI0XTsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgcmVnaXN0ZXIgY2hhciAqcTsKKyAgY2hhciBzeW1ib2xfbmFtZV90ZW1wb3JhcnlbMjBdOwkvKiBidWlsZCB1cCBhIG51bWJlciwgQkFDS1dBUkRTICovCisKKyAga25vdyAobiA+PSAwKTsKKyAga25vdyAoYXVnZW5kID09IDAgfHwgYXVnZW5kID09IDEpOworICBwID0gc3ltYm9sX25hbWVfYnVpbGQ7CisgICpwKysgPSAnTCc7CisKKyAgLyogTmV4dCBjb2RlIGp1c3QgZG9lcyBzcHJpbnRmKCB7fSwgIiVkIiwgbik7ICovCisgIC8qIGxhYmVsIG51bWJlciAqLworICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OworICBmb3IgKCpxKysgPSAwLCBpID0gbjsgaTsgKytxKQorICAgIHsKKyAgICAgICpxID0gaSAlIDEwICsgJzAnOworICAgICAgaSAvPSAxMDsKKyAgICB9CisgIHdoaWxlICgoKnAgPSAqLS1xKSAhPSAnXDAnKQorICAgICsrcDsKKworICAqcCsrID0gMTsJCQkvKiBeQSAqLworCisgIC8qIGluc3RhbmNlIG51bWJlciAqLworICBxID0gc3ltYm9sX25hbWVfdGVtcG9yYXJ5OworICBmb3IgKCpxKysgPSAwLCBpID0gZG9sbGFyX2xhYmVsX2luc3RhbmNlIChuKSArIGF1Z2VuZDsgaTsgKytxKQorICAgIHsKKyAgICAgICpxID0gaSAlIDEwICsgJzAnOworICAgICAgaSAvPSAxMDsKKyAgICB9CisgIHdoaWxlICgoKnArKyA9ICotLXEpICE9ICdcMCcpOzsKKworICAvKiBUaGUgbGFiZWwsIGFzIGEgJ1wwJyBlbmRlZCBzdHJpbmcsIHN0YXJ0cyBhdCBzeW1ib2xfbmFtZV9idWlsZC4gKi8KKyAgcmV0dXJuIHN5bWJvbF9uYW1lX2J1aWxkOworfQorCisvKgorICogU29tYm9keSBlbHNlJ3MgaWRlYSBvZiBsb2NhbCBsYWJlbHMuIFRoZXkgYXJlIG1hZGUgYnkgIm46IiB3aGVyZSBuCisgKiBpcyBhbnkgZGVjaW1hbCBkaWdpdC4gUmVmZXIgdG8gdGhlbSB3aXRoCisgKiAgIm5iIiBmb3IgcHJldmlvdXMgKGJhY2t3YXJkKSBuOgorICogIG9yICJuZiIgZm9yIG5leHQgKGZvcndhcmQpIG46LgorICoKKyAqIFdlIGRvIGEgbGl0dGxlIGJldHRlciBhbmQgbGV0IG4gYmUgYW55IG51bWJlciwgbm90IGp1c3QgYSBzaW5nbGUgZGlnaXQsIGJ1dAorICogc2luY2UgdGhlIG90aGVyIGd1eSdzIGFzc2VtYmxlciBvbmx5IGRvZXMgdGVuLCB3ZSB0cmVhdCB0aGUgZmlyc3QgdGVuCisgKiBzcGVjaWFsbHkuCisgKgorICogTGlrZSBzb21lb25lIGVsc2UncyBhc3NlbWJsZXIsIHdlIGhhdmUgb25lIHNldCBvZiBsb2NhbCBsYWJlbCBjb3VudGVycyBmb3IKKyAqIGVudGlyZSBhc3NlbWJseSwgbm90IG9uZSBzZXQgcGVyIChzdWIpc2VnbWVudCBsaWtlIGluIG1vc3QgYXNzZW1ibGVycy4gVGhpcworICogaW1wbGllcyB0aGF0IG9uZSBjYW4gcmVmZXIgdG8gYSBsYWJlbCBpbiBhbm90aGVyIHNlZ21lbnQsIGFuZCBpbmRlZWQgc29tZQorICogY3J1ZnR5IGNvbXBpbGVycyBoYXZlIGRvbmUganVzdCB0aGF0LgorICoKKyAqIFNpbmNlIHRoZXJlIGNvdWxkIGJlIGEgTE9UIG9mIHRoZXNlIHRoaW5ncywgdHJlYXQgdGhlbSBhcyBhIHNwYXJzZSBhcnJheS4KKyAqLworCisjZGVmaW5lIEZCX0xBQkVMX1NQRUNJQUwgKDEwKQorCitzdGF0aWMgbG9uZyBmYl9sb3dfY291bnRlcltGQl9MQUJFTF9TUEVDSUFMXTsKK3N0YXRpYyBsb25nICpmYl9sYWJlbHM7CitzdGF0aWMgbG9uZyAqZmJfbGFiZWxfaW5zdGFuY2VzOworc3RhdGljIGxvbmcgZmJfbGFiZWxfY291bnQ7CitzdGF0aWMgbG9uZyBmYl9sYWJlbF9tYXg7CisKKy8qIHRoaXMgbXVzdCBiZSBtb3JlIHRoYW4gRkJfTEFCRUxfU1BFQ0lBTCAqLworI2RlZmluZSBGQl9MQUJFTF9CVU1QX0JZIChGQl9MQUJFTF9TUEVDSUFMICsgNikKKworc3RhdGljIHZvaWQgCitmYl9sYWJlbF9pbml0ICgpCit7CisgIG1lbXNldCAoKHZvaWQgKikgZmJfbG93X2NvdW50ZXIsICdcMCcsIHNpemVvZiAoZmJfbG93X2NvdW50ZXIpKTsKK30JCQkJLyogZmJfbGFiZWxfaW5pdCgpICovCisKKy8qIGFkZCBvbmUgdG8gdGhlIGluc3RhbmNlIG51bWJlciBvZiB0aGlzIGZiIGxhYmVsICovCit2b2lkIAorZmJfbGFiZWxfaW5zdGFuY2VfaW5jIChsYWJlbCkKKyAgICAgbG9uZyBsYWJlbDsKK3sKKyAgbG9uZyAqaTsKKworICBpZiAobGFiZWwgPCBGQl9MQUJFTF9TUEVDSUFMKQorICAgIHsKKyAgICAgICsrZmJfbG93X2NvdW50ZXJbbGFiZWxdOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoZmJfbGFiZWxzICE9IE5VTEwpCisgICAgeworICAgICAgZm9yIChpID0gZmJfbGFiZWxzICsgRkJfTEFCRUxfU1BFQ0lBTDsKKwkgICBpIDwgZmJfbGFiZWxzICsgZmJfbGFiZWxfY291bnQ7ICsraSkKKwl7CisJICBpZiAoKmkgPT0gbGFiZWwpCisJICAgIHsKKwkgICAgICArK2ZiX2xhYmVsX2luc3RhbmNlc1tpIC0gZmJfbGFiZWxzXTsKKwkgICAgICByZXR1cm47CisJICAgIH0JCQkvKiBpZiB3ZSBmaW5kIGl0ICovCisJfQkJCS8qIGZvciBlYWNoIGV4aXN0aW5nIGxhYmVsICovCisgICAgfQorCisgIC8qIGlmIHdlIGdldCB0byBoZXJlLCB3ZSBkb24ndCBoYXZlIGxhYmVsIGxpc3RlZCB5ZXQuICovCisKKyAgaWYgKGZiX2xhYmVscyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZiX2xhYmVscyA9IChsb25nICopIHhtYWxsb2MgKEZCX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKKyAgICAgIGZiX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhtYWxsb2MgKEZCX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKKyAgICAgIGZiX2xhYmVsX21heCA9IEZCX0xBQkVMX0JVTVBfQlk7CisgICAgICBmYl9sYWJlbF9jb3VudCA9IEZCX0xBQkVMX1NQRUNJQUw7CisKKyAgICB9CisgIGVsc2UgaWYgKGZiX2xhYmVsX2NvdW50ID09IGZiX2xhYmVsX21heCkKKyAgICB7CisgICAgICBmYl9sYWJlbF9tYXggKz0gRkJfTEFCRUxfQlVNUF9CWTsKKyAgICAgIGZiX2xhYmVscyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBmYl9sYWJlbHMsCisJCQkJICAgICBmYl9sYWJlbF9tYXggKiBzaXplb2YgKGxvbmcpKTsKKyAgICAgIGZiX2xhYmVsX2luc3RhbmNlcyA9IChsb25nICopIHhyZWFsbG9jICgoY2hhciAqKSBmYl9sYWJlbF9pbnN0YW5jZXMsCisJCQkJCSAgICAgIGZiX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOworICAgIH0JCQkJLyogaWYgd2UgbmVlZGVkIHRvIGdyb3cgKi8KKworICBmYl9sYWJlbHNbZmJfbGFiZWxfY291bnRdID0gbGFiZWw7CisgIGZiX2xhYmVsX2luc3RhbmNlc1tmYl9sYWJlbF9jb3VudF0gPSAxOworICArK2ZiX2xhYmVsX2NvdW50OworfQorCitzdGF0aWMgbG9uZyAKK2ZiX2xhYmVsX2luc3RhbmNlIChsYWJlbCkKKyAgICAgbG9uZyBsYWJlbDsKK3sKKyAgbG9uZyAqaTsKKworICBpZiAobGFiZWwgPCBGQl9MQUJFTF9TUEVDSUFMKQorICAgIHsKKyAgICAgIHJldHVybiAoZmJfbG93X2NvdW50ZXJbbGFiZWxdKTsKKyAgICB9CisKKyAgaWYgKGZiX2xhYmVscyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoaSA9IGZiX2xhYmVscyArIEZCX0xBQkVMX1NQRUNJQUw7CisJICAgaSA8IGZiX2xhYmVscyArIGZiX2xhYmVsX2NvdW50OyArK2kpCisJeworCSAgaWYgKCppID09IGxhYmVsKQorCSAgICB7CisJICAgICAgcmV0dXJuIChmYl9sYWJlbF9pbnN0YW5jZXNbaSAtIGZiX2xhYmVsc10pOworCSAgICB9CQkJLyogaWYgd2UgZmluZCBpdCAqLworCX0JCQkvKiBmb3IgZWFjaCBleGlzdGluZyBsYWJlbCAqLworICAgIH0KKworICAvKiBXZSBkaWRuJ3QgZmluZCB0aGUgbGFiZWwsIHNvIHRoaXMgbXVzdCBiZSBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgZmlyc3QgaW5zdGFuY2UuICAqLworICByZXR1cm4gMDsKK30KKworLyoKKyAqCQkJZmJfbGFiZWxfbmFtZSgpCisgKgorICogQ2FsbGVyIG11c3QgY29weSByZXR1cm5lZCBuYW1lOiB3ZSByZS11c2UgdGhlIGFyZWEgZm9yIHRoZSBuZXh0IG5hbWUuCisgKgorICogVGhlIG10aCBvY2N1cmVuY2Ugb2YgbGFiZWwgbjogaXMgdHVybmVkIGludG8gdGhlIHN5bWJvbCAiTG5eQm0iCisgKiB3aGVyZSBuIGlzIHRoZSBsYWJlbCBudW1iZXIgYW5kIG0gaXMgdGhlIGluc3RhbmNlIG51bWJlci4gIkwiIG1ha2VzCisgKiBpdCBhIGxhYmVsIGRpc2NhcmRlZCB1bmxlc3MgZGVidWdnaW5nIGFuZCAiXkIiKCdcMicpIGVuc3VyZXMgbm8KKyAqIG9yZGluYXJ5IHN5bWJvbCBTSE9VTEQgZ2V0IHRoZSBzYW1lIG5hbWUgYXMgYSBsb2NhbCBsYWJlbAorICogc3ltYm9sLiBUaGUgZmlyc3QgIjQ6IiBpcyAiTDReQjEiIC0gdGhlIG0gbnVtYmVycyBiZWdpbiBhdCAxLgorICoKKyAqIGRvbGxhciBsYWJlbHMgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudCwgZXhjZXB0IHRoYXQgXkEgaXMgdXNlZCBpbiBwbGFjZSBvZiBeQi4gKi8KKworY2hhciAqCQkJCS8qIFJldHVybiBsb2NhbCBsYWJlbCBuYW1lLiAqLworZmJfbGFiZWxfbmFtZSAobiwgYXVnZW5kKQorICAgICBsb25nIG47CQkJLyogd2UganVzdCBzYXcgIm46IiwgIm5mIiBvciAibmIiIDogbiBhIG51bWJlciAqLworICAgICBsb25nIGF1Z2VuZDsJCS8qIDAgZm9yIG5iLCAxIGZvciBuOiwgbmYgKi8KK3sKKyAgbG9uZyBpOworICAvKiBSZXR1cm5lZCB0byBjYWxsZXIsIHRoZW4gY29waWVkLiAgdXNlZCBmb3IgY3JlYXRlZCBuYW1lcyAoIjRmIikgKi8KKyAgc3RhdGljIGNoYXIgc3ltYm9sX25hbWVfYnVpbGRbMjRdOworICByZWdpc3RlciBjaGFyICpwOworICByZWdpc3RlciBjaGFyICpxOworICBjaGFyIHN5bWJvbF9uYW1lX3RlbXBvcmFyeVsyMF07CS8qIGJ1aWxkIHVwIGEgbnVtYmVyLCBCQUNLV0FSRFMgKi8KKworICBrbm93IChuID49IDApOworICBrbm93IChhdWdlbmQgPT0gMCB8fCBhdWdlbmQgPT0gMSk7CisgIHAgPSBzeW1ib2xfbmFtZV9idWlsZDsKKyAgKnArKyA9ICdMJzsKKworICAvKiBOZXh0IGNvZGUganVzdCBkb2VzIHNwcmludGYoIHt9LCAiJWQiLCBuKTsgKi8KKyAgLyogbGFiZWwgbnVtYmVyICovCisgIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7CisgIGZvciAoKnErKyA9IDAsIGkgPSBuOyBpOyArK3EpCisgICAgeworICAgICAgKnEgPSBpICUgMTAgKyAnMCc7CisgICAgICBpIC89IDEwOworICAgIH0KKyAgd2hpbGUgKCgqcCA9ICotLXEpICE9ICdcMCcpCisgICAgKytwOworCisgICpwKysgPSAyOwkJCS8qIF5CICovCisKKyAgLyogaW5zdGFuY2UgbnVtYmVyICovCisgIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7CisgIGZvciAoKnErKyA9IDAsIGkgPSBmYl9sYWJlbF9pbnN0YW5jZSAobikgKyBhdWdlbmQ7IGk7ICsrcSkKKyAgICB7CisgICAgICAqcSA9IGkgJSAxMCArICcwJzsKKyAgICAgIGkgLz0gMTA7CisgICAgfQorICB3aGlsZSAoKCpwKysgPSAqLS1xKSAhPSAnXDAnKTs7CisKKyAgLyogVGhlIGxhYmVsLCBhcyBhICdcMCcgZW5kZWQgc3RyaW5nLCBzdGFydHMgYXQgc3ltYm9sX25hbWVfYnVpbGQuICovCisgIHJldHVybiAoc3ltYm9sX25hbWVfYnVpbGQpOworfQkJCQkvKiBmYl9sYWJlbF9uYW1lKCkgKi8KKworLyoKKyAqIGRlY29kZSBuYW1lIHRoYXQgbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgZm9vX2xhYmVsX25hbWUoKSBhYm92ZS4gIElmCisgKiB0aGUgbmFtZSB3YXNuJ3QgZ2VuZXJhdGVkIGJ5IGZvb19sYWJlbF9uYW1lKCksIHRoZW4gcmV0dXJuIGl0IHVuYWx0ZXJlZC4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCisgKi8KKworY2hhciAqCitkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAocykKKyAgICAgY2hhciAqczsKK3sKKyAgY2hhciAqcDsKKyAgY2hhciAqc3ltYm9sX2RlY29kZTsKKyAgaW50IGxhYmVsX251bWJlcjsKKyAgaW50IGluc3RhbmNlX251bWJlcjsKKyAgY2hhciAqdHlwZTsKKyAgY29uc3QgY2hhciAqbWVzc2FnZV9mb3JtYXQgPSBfKCJcIiVkXCIgKGluc3RhbmNlIG51bWJlciAlZCBvZiBhICVzIGxhYmVsKSIpOworCisgIGlmIChzWzBdICE9ICdMJykKKyAgICByZXR1cm4gczsKKworICBmb3IgKGxhYmVsX251bWJlciA9IDAsIHAgPSBzICsgMTsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKTsgKytwKQorICAgIGxhYmVsX251bWJlciA9ICgxMCAqIGxhYmVsX251bWJlcikgKyAqcCAtICcwJzsKKworICBpZiAoKnAgPT0gMSkKKyAgICB0eXBlID0gImRvbGxhciI7CisgIGVsc2UgaWYgKCpwID09IDIpCisgICAgdHlwZSA9ICJmYiI7CisgIGVsc2UKKyAgICByZXR1cm4gczsKKworICBmb3IgKGluc3RhbmNlX251bWJlciA9IDAsIHArKzsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKTsgKytwKQorICAgIGluc3RhbmNlX251bWJlciA9ICgxMCAqIGluc3RhbmNlX251bWJlcikgKyAqcCAtICcwJzsKKworICBzeW1ib2xfZGVjb2RlID0gb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzdHJsZW4gKG1lc3NhZ2VfZm9ybWF0KSArIDMwKTsKKyAgc3ByaW50ZiAoc3ltYm9sX2RlY29kZSwgbWVzc2FnZV9mb3JtYXQsIGxhYmVsX251bWJlciwgaW5zdGFuY2VfbnVtYmVyLCB0eXBlKTsKKworICByZXR1cm4gc3ltYm9sX2RlY29kZTsKK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCisKK3ZhbHVlVAorU19HRVRfVkFMVUUgKHMpCisgICAgIHN5bWJvbFMgKnM7Cit7CisgIGlmICghcy0+c3lfcmVzb2x2ZWQgJiYgcy0+c3lfdmFsdWUuWF9vcCAhPSBPX2NvbnN0YW50KQorICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzLCAxKTsKKyAgaWYgKHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudCkKKyAgICB7CisgICAgICBzdGF0aWMgc3ltYm9sUyAqcmVjdXI7CisKKyAgICAgIC8qIEZJWE1FOiBJbiBub24gQkZEIGFzc2VtYmxlcnMsIFNfSVNfREVGSU5FRCBhbmQgU19JU19DT01NT04KKyAgICAgICAgIG1heSBjYWxsIFNfR0VUX1ZBTFVFLiAgV2UgdXNlIGEgc3RhdGljIHN5bWJvbCB0byBhdm9pZCB0aGUKKyAgICAgICAgIGltbWVkaWF0ZSByZWN1cnNpb24uICAqLworICAgICAgaWYgKHJlY3VyID09IHMpCisJcmV0dXJuICh2YWx1ZVQpIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKKyAgICAgIHJlY3VyID0gczsKKyAgICAgIGlmICghIHMtPnN5X3Jlc29sdmVkCisJICB8fCBzLT5zeV92YWx1ZS5YX29wICE9IE9fc3ltYm9sCisJICB8fCAoU19JU19ERUZJTkVEIChzKSAmJiAhIFNfSVNfQ09NTU9OIChzKSkpCisJYXNfYmFkIChfKCJBdHRlbXB0IHRvIGdldCB2YWx1ZSBvZiB1bnJlc29sdmVkIHN5bWJvbCAlcyIpLAorCQlTX0dFVF9OQU1FIChzKSk7CisgICAgICByZWN1ciA9IE5VTEw7CisgICAgfQorICByZXR1cm4gKHZhbHVlVCkgcy0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOworfQorCisvKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgKi8KKwordm9pZAorU19TRVRfVkFMVUUgKHMsIHZhbCkKKyAgICAgc3ltYm9sUyAqczsKKyAgICAgdmFsdWVUIHZhbDsKK3sKKyAgcy0+c3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7CisgIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IChvZmZzZXRUKSB2YWw7CisgIHMtPnN5X3ZhbHVlLlhfdW5zaWduZWQgPSAwOworfQorCit2b2lkCitjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChkZXN0LCBzcmMpCisgICAgIHN5bWJvbFMgKmRlc3QsICpzcmM7Cit7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAvKiBJbiBhbiBleHByZXNzaW9uLCB0cmFuc2ZlciB0aGUgc2V0dGluZ3Mgb2YgdGhlc2UgZmxhZ3MuCisgICAgIFRoZSB1c2VyIGNhbiBvdmVycmlkZSBsYXRlciwgb2YgY291cnNlLiAgKi8KKyNkZWZpbmUgQ09QSUVEX1NZTUZMQUdTCShCU0ZfRlVOQ1RJT04gfCBCU0ZfT0JKRUNUKQorICBkZXN0LT5ic3ltLT5mbGFncyB8PSBzcmMtPmJzeW0tPmZsYWdzICYgQ09QSUVEX1NZTUZMQUdTOworI2VuZGlmCisKKyNpZmRlZiBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUworICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCitpbnQKK1NfSVNfRlVOQ1RJT04gKHMpCisgICAgIHN5bWJvbFMgKnM7Cit7CisgIGZsYWd3b3JkIGZsYWdzID0gcy0+YnN5bS0+ZmxhZ3M7CisKKyAgcmV0dXJuIChmbGFncyAmIEJTRl9GVU5DVElPTikgIT0gMDsKK30KKworaW50CitTX0lTX0VYVEVSTkFMIChzKQorICAgICBzeW1ib2xTICpzOworeworICBmbGFnd29yZCBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOworCisgIC8qIHNhbml0eSBjaGVjayAqLworICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKKyAgICBhYm9ydCAoKTsKKworICByZXR1cm4gKGZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMDsKK30KKworaW50CitTX0lTX1dFQUsgKHMpCisgICAgIHN5bWJvbFMgKnM7Cit7CisgIHJldHVybiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKK30KKworaW50CitTX0lTX0NPTU1PTiAocykKKyAgICAgc3ltYm9sUyAqczsKK3sKKyAgcmV0dXJuIGJmZF9pc19jb21fc2VjdGlvbiAocy0+YnN5bS0+c2VjdGlvbik7Cit9CisKK2ludAorU19JU19ERUZJTkVEIChzKQorICAgICBzeW1ib2xTICpzOworeworICByZXR1cm4gcy0+YnN5bS0+c2VjdGlvbiAhPSB1bmRlZmluZWRfc2VjdGlvbjsKK30KKworaW50CitTX0lTX0RFQlVHIChzKQorICAgICBzeW1ib2xTICpzOworeworICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50CitTX0lTX0xPQ0FMIChzKQorICAgICBzeW1ib2xTICpzOworeworICBmbGFnd29yZCBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIHNhbml0eSBjaGVjayAqLworICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSByZWdfc2VjdGlvbikKKyAgICByZXR1cm4gMTsKKworICBpZiAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQorICAgICAgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkgPT0gMAorICAgICAgJiYgYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHJldHVybiAxOworCisgIG5hbWUgPSBTX0dFVF9OQU1FIChzKTsKKyAgcmV0dXJuIChuYW1lICE9IE5VTEwKKwkgICYmICEgU19JU19ERUJVRyAocykKKwkgICYmIChzdHJjaHIgKG5hbWUsICdcMDAxJykKKwkgICAgICB8fCBzdHJjaHIgKG5hbWUsICdcMDAyJykKKwkgICAgICB8fCAoISBmbGFnX2tlZXBfbG9jYWxzCisJCSAgJiYgKGJmZF9pc19sb2NhbF9sYWJlbCAoc3Rkb3V0cHV0LCBzLT5ic3ltKQorCQkgICAgICB8fCAoZmxhZ19tcmkKKwkJCSAgJiYgbmFtZVswXSA9PSAnPycKKwkJCSAgJiYgbmFtZVsxXSA9PSAnPycpKSkpKTsKK30KKworaW50CitTX0lTX0VYVEVSTiAocykKKyAgICAgc3ltYm9sUyAqczsKK3sKKyAgcmV0dXJuIFNfSVNfRVhURVJOQUwgKHMpOworfQorCitpbnQKK1NfSVNfU1RBQkQgKHMpCisgICAgIHN5bWJvbFMgKnM7Cit7CisgIHJldHVybiBTX0dFVF9OQU1FIChzKSA9PSAwOworfQorCitDT05TVCBjaGFyICoKK1NfR0VUX05BTUUgKHMpCisgICAgIHN5bWJvbFMgKnM7Cit7CisgIHJldHVybiBzLT5ic3ltLT5uYW1lOworfQorCitzZWdUCitTX0dFVF9TRUdNRU5UIChzKQorICAgICBzeW1ib2xTICpzOworeworICByZXR1cm4gcy0+YnN5bS0+c2VjdGlvbjsKK30KKwordm9pZAorU19TRVRfU0VHTUVOVCAocywgc2VnKQorICAgICBzeW1ib2xTICpzOworICAgICBzZWdUIHNlZzsKK3sKKyAgLyogRG9uJ3QgcmVhc3NpZ24gc2VjdGlvbiBzeW1ib2xzLiAgVGhlIGRpcmVjdCByZWFzb24gaXMgdG8gcHJldmVudCBzZWcKKyAgICAgZmF1bHRzIGFzc2lnbmluZyBiYWNrIHRvIGNvbnN0IGdsb2JhbCBzeW1ib2xzIHN1Y2ggYXMgKkFCUyosIGJ1dCBpdAorICAgICBzaG91bGRuJ3QgaGFwcGVuIGFueXdheS4gICovCisKKyAgaWYgKHMtPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQorICAgIHsKKyAgICAgIGlmIChzLT5ic3ltLT5zZWN0aW9uICE9IHNlZykKKwlhYm9ydCgpOworICAgIH0KKyAgZWxzZQorICAgIHMtPmJzeW0tPnNlY3Rpb24gPSBzZWc7Cit9CisKK3ZvaWQKK1NfU0VUX0VYVEVSTkFMIChzKQorICAgICBzeW1ib2xTICpzOworeworICBpZiAoKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDApCisgICAgeworICAgICAgLyogTGV0IC53ZWFrIG92ZXJyaWRlIC5nbG9iYWwuICAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKKyAgcy0+YnN5bS0+ZmxhZ3MgJj0gfihCU0ZfTE9DQUx8QlNGX1dFQUspOworfQorCit2b2lkCitTX0NMRUFSX0VYVEVSTkFMIChzKQorICAgICBzeW1ib2xTICpzOworeworICBpZiAoKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDApCisgICAgeworICAgICAgLyogTGV0IC53ZWFrIG92ZXJyaWRlLiAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisgIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKKyAgcy0+YnN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMfEJTRl9XRUFLKTsKK30KKwordm9pZAorU19TRVRfV0VBSyAocykKKyAgICAgc3ltYm9sUyAqczsKK3sKKyAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7CisgIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfTE9DQUwpOworfQorCit2b2lkCitTX1NFVF9OQU1FIChzLCBuYW1lKQorICAgICBzeW1ib2xTICpzOworICAgICBjaGFyICpuYW1lOworeworICBzLT5ic3ltLT5uYW1lID0gbmFtZTsKK30KKyNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCisKK3ZvaWQKK3N5bWJvbF9iZWdpbiAoKQoreworICBzeW1ib2xfbGFzdFAgPSBOVUxMOworICBzeW1ib2xfcm9vdFAgPSBOVUxMOwkJLyogSW4gY2FzZSB3ZSBoYXZlIDAgc3ltYm9scyAoISEpICovCisgIHN5X2hhc2ggPSBoYXNoX25ldyAoKTsKKworICBtZW1zZXQgKChjaGFyICopICgmYWJzX3N5bWJvbCksICdcMCcsIHNpemVvZiAoYWJzX3N5bWJvbCkpOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyNpZiBkZWZpbmVkIChFTUlUX1NFQ1RJT05fU1lNQk9MUykgfHwgIWRlZmluZWQgKFJFTE9DX1JFUVVJUkVTX1NZTUJPTCkKKyAgYWJzX3N5bWJvbC5ic3ltID0gYmZkX2Fic19zZWN0aW9uLnN5bWJvbDsKKyNlbmRpZgorI2Vsc2UKKyAgLyogQ2FuJ3QgaW5pdGlhbGlzZSBhIHVuaW9uLiBTaWdoLiAqLworICBTX1NFVF9TRUdNRU5UICgmYWJzX3N5bWJvbCwgYWJzb2x1dGVfc2VjdGlvbik7CisjZW5kaWYKKyAgYWJzX3N5bWJvbC5zeV92YWx1ZS5YX29wID0gT19jb25zdGFudDsKKyAgYWJzX3N5bWJvbC5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOworCisgIGlmIChMT0NBTF9MQUJFTFNfRkIpCisgICAgZmJfbGFiZWxfaW5pdCAoKTsKK30KKworDAoraW50IGluZGVudF9sZXZlbDsKKworLyogTWF4aW11bSBpbmRlbnQgbGV2ZWwuCisgICBBdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbiBpbnNpZGUgYSBnZGIgc2Vzc2lvbi4gICovCitpbnQgbWF4X2luZGVudF9sZXZlbCA9IDg7CisKKyNpZiAwCisKK3N0YXRpYyB2b2lkCitpbmRlbnQgKCkKK3sKKyAgcHJpbnRmICgiJSpzIiwgaW5kZW50X2xldmVsICogNCwgIiIpOworfQorCisjZW5kaWYKKwordm9pZAorcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIHN5bSkKKyAgICAgRklMRSAqZmlsZTsKKyAgICAgc3ltYm9sUyAqc3ltOworeworICBjb25zdCBjaGFyICpuYW1lID0gU19HRVRfTkFNRSAoc3ltKTsKKyAgaWYgKCFuYW1lIHx8ICFuYW1lWzBdKQorICAgIG5hbWUgPSAiKHVubmFtZWQpIjsKKyAgZnByaW50ZiAoZmlsZSwgInN5bSAlbHggJXMiLCAodW5zaWduZWQgbG9uZykgc3ltLCBuYW1lKTsKKyAgaWYgKHN5bS0+c3lfZnJhZyAhPSAmemVyb19hZGRyZXNzX2ZyYWcpCisgICAgZnByaW50ZiAoZmlsZSwgIiBmcmFnICVseCIsIChsb25nKSBzeW0tPnN5X2ZyYWcpOworICBpZiAoc3ltLT53cml0dGVuKQorICAgIGZwcmludGYgKGZpbGUsICIgd3JpdHRlbiIpOworICBpZiAoc3ltLT5zeV9yZXNvbHZlZCkKKyAgICBmcHJpbnRmIChmaWxlLCAiIHJlc29sdmVkIik7CisgIGVsc2UgaWYgKHN5bS0+c3lfcmVzb2x2aW5nKQorICAgIGZwcmludGYgKGZpbGUsICIgcmVzb2x2aW5nIik7CisgIGlmIChzeW0tPnN5X3VzZWRfaW5fcmVsb2MpCisgICAgZnByaW50ZiAoZmlsZSwgIiB1c2VkLWluLXJlbG9jIik7CisgIGlmIChzeW0tPnN5X3VzZWQpCisgICAgZnByaW50ZiAoZmlsZSwgIiB1c2VkIik7CisgIGlmIChTX0lTX0xPQ0FMIChzeW0pKQorICAgIGZwcmludGYgKGZpbGUsICIgbG9jYWwiKTsKKyAgaWYgKFNfSVNfRVhURVJOIChzeW0pKQorICAgIGZwcmludGYgKGZpbGUsICIgZXh0ZXJuIik7CisgIGlmIChTX0lTX0RFQlVHIChzeW0pKQorICAgIGZwcmludGYgKGZpbGUsICIgZGVidWciKTsKKyAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSkKKyAgICBmcHJpbnRmIChmaWxlLCAiIGRlZmluZWQiKTsKKyAgZnByaW50ZiAoZmlsZSwgIiAlcyIsIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSkpOworICBpZiAoc3ltLT5zeV9yZXNvbHZlZCkKKyAgICB7CisgICAgICBzZWdUIHMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOworCisgICAgICBpZiAocyAhPSB1bmRlZmluZWRfc2VjdGlvbgorICAgICAgICAgICYmIHMgIT0gZXhwcl9zZWN0aW9uKQorCWZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW0pKTsKKyAgICB9CisgIGVsc2UgaWYgKGluZGVudF9sZXZlbCA8IG1heF9pbmRlbnRfbGV2ZWwKKwkgICAmJiBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHVuZGVmaW5lZF9zZWN0aW9uKQorICAgIHsKKyAgICAgIGluZGVudF9sZXZlbCsrOworICAgICAgZnByaW50ZiAoZmlsZSwgIlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKKyAgICAgIHByaW50X2V4cHJfMSAoZmlsZSwgJnN5bS0+c3lfdmFsdWUpOworICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKKyAgICAgIGluZGVudF9sZXZlbC0tOworICAgIH0KKyAgZmZsdXNoIChmaWxlKTsKK30KKwordm9pZAorcHJpbnRfc3ltYm9sX3ZhbHVlIChzeW0pCisgICAgIHN5bWJvbFMgKnN5bTsKK3sKKyAgaW5kZW50X2xldmVsID0gMDsKKyAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgc3ltKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2JpbmFyeSAoZmlsZSwgbmFtZSwgZXhwKQorICAgICBGSUxFICpmaWxlOworICAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICAgZXhwcmVzc2lvblMgKmV4cDsKK3sKKyAgaW5kZW50X2xldmVsKys7CisgIGZwcmludGYgKGZpbGUsICIlc1xuJSpzPCIsIG5hbWUsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKKyAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKKyAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7CisgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKKyAgZnByaW50ZiAoZmlsZSwgIj4iKTsKKyAgaW5kZW50X2xldmVsLS07Cit9CisKK3ZvaWQKK3ByaW50X2V4cHJfMSAoZmlsZSwgZXhwKQorICAgICBGSUxFICpmaWxlOworICAgICBleHByZXNzaW9uUyAqZXhwOworeworICBmcHJpbnRmIChmaWxlLCAiZXhwciAlbHggIiwgKGxvbmcpIGV4cCk7CisgIHN3aXRjaCAoZXhwLT5YX29wKQorICAgIHsKKyAgICBjYXNlIE9faWxsZWdhbDoKKyAgICAgIGZwcmludGYgKGZpbGUsICJpbGxlZ2FsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fYWJzZW50OgorICAgICAgZnByaW50ZiAoZmlsZSwgImFic2VudCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX2NvbnN0YW50OgorICAgICAgZnByaW50ZiAoZmlsZSwgImNvbnN0YW50ICVseCIsIChsb25nKSBleHAtPlhfYWRkX251bWJlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fc3ltYm9sOgorICAgICAgaW5kZW50X2xldmVsKys7CisgICAgICBmcHJpbnRmIChmaWxlLCAic3ltYm9sXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOworICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKKyAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7CisgICAgbWF5YmVfcHJpbnRfYWRkbnVtOgorICAgICAgaWYgKGV4cC0+WF9hZGRfbnVtYmVyKQorCWZwcmludGYgKGZpbGUsICJcbiUqcyVseCIsIGluZGVudF9sZXZlbCAqIDQsICIiLAorCQkgKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKKyAgICAgIGluZGVudF9sZXZlbC0tOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX3JlZ2lzdGVyOgorICAgICAgZnByaW50ZiAoZmlsZSwgInJlZ2lzdGVyICMlZCIsIChpbnQpIGV4cC0+WF9hZGRfbnVtYmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19iaWc6CisgICAgICBmcHJpbnRmIChmaWxlLCAiYmlnIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fdW1pbnVzOgorICAgICAgZnByaW50ZiAoZmlsZSwgInVtaW51cyAtPCIpOworICAgICAgaW5kZW50X2xldmVsKys7CisgICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOworICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKKyAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOworICAgIGNhc2UgT19iaXRfbm90OgorICAgICAgZnByaW50ZiAoZmlsZSwgImJpdF9ub3QiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19tdWx0aXBseToKKyAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm11bHRpcGx5IiwgZXhwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19kaXZpZGU6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJkaXZpZGUiLCBleHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX21vZHVsdXM6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJtb2R1bHVzIiwgZXhwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgorICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibHNoaWZ0IiwgZXhwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19yaWdodF9zaGlmdDoKKyAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgInJzaGlmdCIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKKyAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF9pb3IiLCBleHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfeG9yIiwgZXhwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT19iaXRfYW5kOgorICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X2FuZCIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fZXE6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJlcSIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fbmU6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJuZSIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fbHQ6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsdCIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fbGU6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsZSIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fZ2U6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJnZSIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fZ3Q6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJndCIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fbG9naWNhbF9hbmQ6CisgICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsb2dpY2FsX2FuZCIsIGV4cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9fbG9naWNhbF9vcjoKKyAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxvZ2ljYWxfb3IiLCBleHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPX2FkZDoKKyAgICAgIGluZGVudF9sZXZlbCsrOworICAgICAgZnByaW50ZiAoZmlsZSwgImFkZFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKKyAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7CisgICAgICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKKyAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKKyAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7CisgICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKKyAgICBjYXNlIE9fc3VidHJhY3Q6CisgICAgICBpbmRlbnRfbGV2ZWwrKzsKKyAgICAgIGZwcmludGYgKGZpbGUsICJzdWJ0cmFjdFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKKyAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7CisgICAgICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKKyAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKKyAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7CisgICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoZmlsZSwgInt1bmtub3duIG9wY29kZSAlZH0iLCAoaW50KSBleHAtPlhfb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICBmZmx1c2ggKHN0ZG91dCk7Cit9CisKK3ZvaWQKK3ByaW50X2V4cHIgKGV4cCkKKyAgICAgZXhwcmVzc2lvblMgKmV4cDsKK3sKKyAgcHJpbnRfZXhwcl8xIChzdGRlcnIsIGV4cCk7CisgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Cit9CisKK3ZvaWQKK3N5bWJvbF9wcmludF9zdGF0aXN0aWNzIChmaWxlKQorICAgICBGSUxFICpmaWxlOworeworICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJzeW1ib2wgdGFibGUiLCBzeV9oYXNoKTsKK30KKworLyogZW5kIG9mIHN5bWJvbHMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N5bWJvbHMuaCBiL2dhcy9zeW1ib2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlZmJkYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy9zeW1ib2xzLmgKQEAgLTAsMCArMSw5MCBAQAorLyogc3ltYm9scy5oIC0KKyAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCitleHRlcm4gc3RydWN0IG9ic3RhY2sgbm90ZXM7CS8qIGVnIEZpeFMgbGl2ZSBoZXJlLiAqLworCitleHRlcm4gc3RydWN0IG9ic3RhY2sgY29uZF9vYnN0YWNrOwkvKiB0aGlzIGlzIHdoZXJlIHdlIHRyYWNrIC5pZmRlZi8uZW5kaWYKKwkJCQkgICAgICAgKGlmIHdlIGRvIHRoYXQgYXQgYWxsKS4gICovCisKK2V4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7CS8qIGFsbCB0aGUgc3ltYm9sIG5vZGVzICovCitleHRlcm4gc3ltYm9sUyAqc3ltYm9sX2xhc3RQOwkvKiBsYXN0IHN0cnVjdCBzeW1ib2wgd2UgbWFkZSwgb3IgTlVMTCAqLworCitleHRlcm4gc3ltYm9sUyBhYnNfc3ltYm9sOworCitleHRlcm4gaW50IHN5bWJvbF90YWJsZV9mcm96ZW47CisKKy8qIFRoaXMgaXMgbm9uLXplcm8gaWYgc3ltYm9scyBhcmUgY2FzZSBzZW5zaXRpdmUsIHdoaWNoIGlzIHRoZQorICAgZGVmYXVsdC4gICovCitleHRlcm4gaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7CisKK2NoYXIgKmRlY29kZV9sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGNoYXIgKnMpKTsKK3N5bWJvbFMgKnN5bWJvbF9maW5kIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUpKTsKK3N5bWJvbFMgKnN5bWJvbF9maW5kX2Jhc2UgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgaW50IHN0cmlwX3VuZGVyc2NvcmUpKTsKK3N5bWJvbFMgKnN5bWJvbF9maW5kX29yX21ha2UgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOworc3ltYm9sUyAqc3ltYm9sX21ha2UgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSkpOworc3ltYm9sUyAqc3ltYm9sX25ldyBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBzZWdUIHNlZ21lbnQsIHZhbHVlVCB2YWx1ZSwKKwkJCSAgICAgZnJhZ1MgKiBmcmFnKSk7CitzeW1ib2xTICpzeW1ib2xfY3JlYXRlIFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIHNlZ1Qgc2VnbWVudCwgdmFsdWVUIHZhbHVlLAorCQkJCWZyYWdTICogZnJhZykpOworc3ltYm9sUyAqY29sb24gUEFSQU1TICgoY29uc3QgY2hhciAqc3ltX25hbWUpKTsKK3ZvaWQgbG9jYWxfY29sb24gUEFSQU1TICgoaW50IG4pKTsKK3ZvaWQgc3ltYm9sX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgc3ltYm9sX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqKSk7Cit2b2lkIHN5bWJvbF90YWJsZV9pbnNlcnQgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKK3ZhbHVlVCByZXNvbHZlX3N5bWJvbF92YWx1ZSBQQVJBTVMgKChzeW1ib2xTICosIGludCkpOworCit2b2lkIHByaW50X3N5bWJvbF92YWx1ZSBQQVJBTVMgKChzeW1ib2xTICopKTsKK3ZvaWQgcHJpbnRfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Cit2b2lkIHByaW50X2V4cHJfMSBQQVJBTVMgKChGSUxFICosIGV4cHJlc3Npb25TICopKTsKK3ZvaWQgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgUEFSQU1TICgoRklMRSAqLCBzeW1ib2xTICopKTsKKworaW50IGRvbGxhcl9sYWJlbF9kZWZpbmVkIFBBUkFNUyAoKGxvbmcgbCkpOwordm9pZCBkb2xsYXJfbGFiZWxfY2xlYXIgUEFSQU1TICgodm9pZCkpOwordm9pZCBkZWZpbmVfZG9sbGFyX2xhYmVsIFBBUkFNUyAoKGxvbmcgbCkpOworY2hhciAqZG9sbGFyX2xhYmVsX25hbWUgUEFSQU1TICgobG9uZyBsLCBpbnQgYXVnZW5kKSk7CisKK3ZvaWQgZmJfbGFiZWxfaW5zdGFuY2VfaW5jIFBBUkFNUyAoKGxvbmcgbGFiZWwpKTsKK2NoYXIgKmZiX2xhYmVsX25hbWUgUEFSQU1TICgobG9uZyBuLCBsb25nIGF1Z2VuZCkpOworCitleHRlcm4gdm9pZCBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7CisKKy8qIEdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2Ygc3ltYm9scy4gIFRoZXNlIHVzZWQgdG8gYmUgbWFjcm9zLiAgKi8KK2V4dGVybiB2YWx1ZVQgU19HRVRfVkFMVUUgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitleHRlcm4gdm9pZCBTX1NFVF9WQUxVRSBQQVJBTVMgKChzeW1ib2xTICosIHZhbHVlVCkpOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorZXh0ZXJuIGludCBTX0lTX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOworZXh0ZXJuIGludCBTX0lTX1dFQUsgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitleHRlcm4gaW50IFNfSVNfQ09NTU9OIFBBUkFNUyAoKHN5bWJvbFMgKikpOworZXh0ZXJuIGludCBTX0lTX0RFRklORUQgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitleHRlcm4gaW50IFNfSVNfREVCVUcgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitleHRlcm4gaW50IFNfSVNfTE9DQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitleHRlcm4gaW50IFNfSVNfRVhURVJOIFBBUkFNUyAoKHN5bWJvbFMgKikpOworZXh0ZXJuIGludCBTX0lTX1NUQUJEIFBBUkFNUyAoKHN5bWJvbFMgKikpOworZXh0ZXJuIENPTlNUIGNoYXIgKlNfR0VUX05BTUUgUEFSQU1TICgoc3ltYm9sUyAqKSk7CitleHRlcm4gc2VnVCBTX0dFVF9TRUdNRU5UIFBBUkFNUyAoKHN5bWJvbFMgKikpOworZXh0ZXJuIHZvaWQgU19TRVRfU0VHTUVOVCBQQVJBTVMgKChzeW1ib2xTICosIHNlZ1QpKTsKK2V4dGVybiB2b2lkIFNfU0VUX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOworZXh0ZXJuIHZvaWQgU19TRVRfTkFNRSBQQVJBTVMgKChzeW1ib2xTICosIGNoYXIgKikpOworZXh0ZXJuIHZvaWQgU19DTEVBUl9FWFRFUk5BTCBQQVJBTVMgKChzeW1ib2xTICopKTsKK2V4dGVybiB2b2lkIFNfU0VUX1dFQUsgUEFSQU1TICgoc3ltYm9sUyAqKSk7CisjZW5kaWYKKworLyogZW5kIG9mIHN5bWJvbHMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3RjLmggYi9nYXMvdGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQwNDZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3RjLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHRjLmggLSB0YXJnZXQgY3B1IGRlcGVuZGVudAorCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogSW4gdGhlb3J5IChtaW5lLCBhdCBsZWFzdCEpIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIKKyAgIHNob3VsZCBvbmx5IGhhdmUgdG8gaW5jbHVkZSBvbmUgZmlsZS4gIFRoaXMgb25lLiAgLS0gSkYgKi8KKworZXh0ZXJuIGNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXTsKKworLyogSkYgbW92ZWQgdGhpcyBoZXJlIGZyb20gYXMuaCB1bmRlciB0aGUgdGhlb3J5IHRoYXQgbm9ib2R5IGV4Y2VwdCBNQUNISU5FLmMKKyAgIGFuZCB3cml0ZS5jIGNhcmUgYWJvdXQgaXQgYW55d2F5LiAqLworCitzdHJ1Y3QgcmVsYXhfdHlwZQoreworICAvKiBGb3J3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA+IDAuICovCisgIGxvbmcgcmx4X2ZvcndhcmQ7CisgIC8qIEJhY2t3YXJkIHJlYWNoLiBTaWduZWQgbnVtYmVyLiA8IDAuICovCisgIGxvbmcgcmx4X2JhY2t3YXJkOworCisgIC8qIEJ5dGVzIGxlbmd0aCBvZiB0aGlzIGFkZHJlc3MuICovCisgIHVuc2lnbmVkIGNoYXIgcmx4X2xlbmd0aDsKKworICAvKiBOZXh0IGxvbmdlciByZWxheC1zdGF0ZS4gIDAgbWVhbnMgdGhlcmUgaXMgbm8gJ25leHQnIHJlbGF4LXN0YXRlLiAqLworICByZWxheF9zdWJzdGF0ZVQgcmx4X21vcmU7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZWxheF90eXBlIHJlbGF4X3R5cGVTOworCitleHRlcm4gY29uc3QgaW50IG1kX3JlbG9jX3NpemU7CS8qIFNpemUgb2YgYSByZWxvY2F0aW9uIHJlY29yZCAqLworCitjaGFyICptZF9hdG9mIFBBUkFNUyAoKGludCB3aGF0X3N0YXRlbWVudF90eXBlLCBjaGFyICpsaXRlcmFsUCwgaW50ICpzaXplUCkpOworI2lmbmRlZiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheAoraW50IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IFBBUkFNUyAoKGZyYWdTICogZnJhZ1AsIHNlZ1Qgc2VnbWVudCkpOworI2VuZGlmCitpbnQgbWRfcGFyc2Vfb3B0aW9uIFBBUkFNUyAoKGludCBjLCBjaGFyICphcmcpKTsKK3ZvaWQgbWRfc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKK2xvbmcgbWRfcGNyZWxfZnJvbSBQQVJBTVMgKChmaXhTICogZml4UCkpOworc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoZml4UyAqIGZpeFApKTsKK3ZvaWQgbWRfYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyKSk7Cit2b2lkIG1kX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKKyNpZm5kZWYgbWRfY3JlYXRlX2xvbmdfanVtcAordm9pZCBtZF9jcmVhdGVfbG9uZ19qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAorCQkJCSAgYWRkcmVzc1QgdG9fYWRkciwgZnJhZ1MgKiBmcmFnLAorCQkJCSAgc3ltYm9sUyAqIHRvX3N5bWJvbCkpOworI2VuZGlmCisjaWZuZGVmIG1kX2NyZWF0ZV9zaG9ydF9qdW1wCit2b2lkIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIFBBUkFNUyAoKGNoYXIgKnB0ciwgYWRkcmVzc1QgZnJvbV9hZGRyLAorCQkJCSAgIGFkZHJlc3NUIHRvX2FkZHIsIGZyYWdTICogZnJhZywKKwkJCQkgICBzeW1ib2xTICogdG9fc3ltYm9sKSk7CisjZW5kaWYKK3ZvaWQgbWRfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgdmFsdWVUIHZhbCwgaW50IG4pKTsKKworI2lmbmRlZiBtZF9vcGVyYW5kCit2b2lkIG1kX29wZXJhbmQgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOworI2VuZGlmCisKKyNpZmRlZiBNRF9BUFBMWV9GSVgzCitpbnQgbWRfYXBwbHlfZml4MyBQQVJBTVMgKChmaXhTICogZml4UCwgdmFsdWVUICp2YWwsIHNlZ1Qgc2VnKSk7CisjZW5kaWYKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitpbnQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCB2YWx1ZVQgKnZhbCkpOworI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKK3ZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKGJmZCAqIGhlYWRlcnMsIHNlZ1Qgc2VjLCBmcmFnUyAqIGZyYWdQKSk7CisjZW5kaWYKKyNpZm5kZWYgdGNfaGVhZGVyc19ob29rCit2b2lkIHRjX2hlYWRlcnNfaG9vayBQQVJBTVMgKChzZWdUICosIGZpeFMgKikpOworI2VuZGlmCisjaWZuZGVmIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQorZXh0ZXJuIGFyZWxlbnQgKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKKyNlbHNlCitleHRlcm4gYXJlbGVudCAqKnRjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKKyNlbmRpZgorI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KK3ZvaWQgbWRfYXBwbHlfZml4IFBBUkFNUyAoKGZpeFMgKiBmaXhQLCBsb25nIHZhbCkpOworI2lmbmRlZiBtZF9jb252ZXJ0X2ZyYWcKK3ZvaWQgbWRfY29udmVydF9mcmFnIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycywgc2VnVCwgZnJhZ1MgKiBmcmFnUCkpOworI2VuZGlmCisKKyNpZm5kZWYgdGNfY3Jhd2xfc3ltYm9sX2NoYWluCit2b2lkIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKKyNlbmRpZiAvKiB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gKi8KKworI2lmbmRlZiB0Y19oZWFkZXJzX2hvb2sKK3ZvaWQgdGNfaGVhZGVyc19ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOworI2VuZGlmIC8qIHRjX2hlYWRlcnNfaG9vayAqLworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KKworI2lmbmRlZiBtZF9zZWN0aW9uX2FsaWduCit2YWx1ZVQgbWRfc2VjdGlvbl9hbGlnbiBQQVJBTVMgKChzZWdUIHNlZywgdmFsdWVUIHNpemUpKTsKKyNlbmRpZgorCisjaWZuZGVmIG1kX3VuZGVmaW5lZF9zeW1ib2wKK3N5bWJvbFMgKm1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqbmFtZSkpOworI2VuZGlmCisKKy8qIGVuZCBvZiB0Yy5oICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2dhcy90ZXN0c3VpdGUvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjg2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZwpAQCAtMCwwICsxLDIzMzMgQEAKKzE5OTktMDUtMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyCisJb3BlcmF0aW9ucy4gCisKKzE5OTktMDQtMTYgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgorCisJKiBnYXMvaTM4Ni9hbWQuczogQWRkIE5PUHMgdG8gYWxpZ24gZm9yIGNvZmYgdGFyZ2V0cworCSogZ2FzL2kzODYvYW1kLmQ6IGFuZCBjaGVjayBmb3IgdGhlbS4KKworVGh1IEFwciAxNSAxNTowMzo0MyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fY29wcm1lbSk6IE5vIGxvbmdlciBleHBlY3RlZCB0byBmaWxlLgorCitXZWQgQXByIDE0IDEzOjQzOjA2IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnM6IERvIG5vdCB1c2UgaW1tZWRpYXRlIHZhbHVlIHdoZXJlIHdlCisJcmVhbGx5IHdhbnQgYSByZWdpc3Rlci4KKwkqIGdhcy9ocHBhL2Jhc2ljL2NvcHJtZW0uczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS9iYXNpYy9jb3BybWVtLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvYmFzaWMvc3BvcC5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL2Jhc2ljL2ltZW0uczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcuczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL3BhcnNlL2V4cHJidWcuczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS9wYXJzZS9maXh1cDdidWcuczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnM6IExpa2V3aXNlLgorCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTMuczogTGlrZXdpc2UuCisJKiBnYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zOiBMaWtld2lzZS4KKwkqIGdhcy9ocHBhL3Vuc29ydGVkL2xhc2JlbGRpZmZzLnM6IExpa2V3aXNlLgorCisJKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHAgKGRvX2ltZW0pOiBIYW5kbGUgbXVsdGlwbGUgZW5jb2RpbmdzCisJZm9yIGxvYWRzIGFuZCBzdG9yZXMgdXNpbmcgcmVnICsgc21hbGwgZCBhZGRyZXNzZXMuCisJTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlIGZvciBtaXMtcGFyc2Ugb2YgaW1tICVyZWcuCisKKzE5OTktMDQtMTMgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogZ2FzL20zMnIvbTMycnguZCAoY21wdV9fcmFjaCk6IEZpeCBleHBlY3RlZCBvdXRwdXQuCisJKiBnYXMvbTMyci9tMzJyeC5zIChiY19fYWRkLGFkZF9fYmMpOiBFeHBsaWNpdGx5IHNwZWNpZnkgc2hvcnQgYnJhbmNoCisJc28gYnJhbmNoIHJlbGF4YXRpb24gcmVzdHJpY3Rpb25zIHdvbid0IGludGVyZmVyZSB3aXRoIHBhcmFsbGVsaXphdGlvbgorCWF0dGVtcHRzLgorCisxOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvbWNvcmU6IE5ldyBEaXJlY3RvcnkuCisJKiBnYXMvbWNvcmUvYWxsaW5zbi5leHA6IE5ldyBGaWxlOiBFeHBlY3QgZmlsZSBmb3IgTUNvcmUgYXNzZW1ibHkKKwl0ZXN0cy4KKwkqIGdhcy9tY29yZS9hbGxpbnNuLnM6IE5ldyBGaWxlOiBTb3VyY2UgZmlsZSBmb3IgTUNvcmUgYXNzZW1ibHkKKwl0ZXN0cy4KKwkqIGdhcy9tY29yZS9hbGxpbnNuLmQ6IE5ldyBGaWxlOiBFeHBlY3RlZCBvdXRwdXQgZmlsZSBmb3IgTUNvcmUKKwlhc3NlbWJseSB0ZXN0cy4KKworMTk5OS0wMy0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9tMzJyeC5bc2RdOiBGaXggYSBmZXcgbW9yZSB0ZXN0Y2FzZXMuCisKKzE5OTktMDMtMTYgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBnYXMvZDMwdi9kMzAuZXhwIChydW5fbGlzdF90ZXN0KTogQWRkIG5ldyB0ZXN0cywKKyAgICAgICAgbGFiZWwsIGd1YXJkLWRlYnVnLCBzZXJpYWwsIHdhcm5fb2RkcmVnLCBiaXR0ZXN0LCBhbmQgbXVsLgorCisJKiBnYXMvZDMwdi9vcHQuczogRml4IHNvbWUgd2FybmluZ3MgYW5kIGFkZCBhIGZldyBsYWJlbHMKKyAgICAgICAgdG8ga2VlcCB0aGluZ3MgZnJvbSBwYXJhbGxlbGl6aW5nIHdoZXJlIHdlIGRvbid0IHdhbnQgdGhlbSB0by4KKworCSogZ2FzL2QzMHYvcmVsb2MuczogRml4IHdhcm5pbmcuCisgICAgICAgIAorCSogZ2FzL2QzMHYvb3B0LmQsIHJlbG9jLmQsIGluc3QuZDogUmVidWlsZC4KKworCSogZ2FzL2QzMHYvbGFiZWwuczogTmV3IHRlc3QuIENoZWNrIHRoYXQgbGFiZWxzIGFyZSBhbGlnbmVkIAorICAgICAgICBvbiA4LWJ5dGUgYm91bmRhcmllcy4KKworCSogZ2FzL2QzMHYvZ3VhcmQtZGVidWcuczogTmV3IHRlc3QuIFRlc3Qgb3V0cHV0IHdpdGggIi1nIi4KKworCSogZ2FzL2QzMHYvc2VyaWFsLnM6IE5ldyB0ZXN0LiBDaGVjayBmb3Igd2FybmluZ3Mgd2l0aCAKKyAgICAgICAgaWxsZWdhbCBzZXJpYWwgaW5zdHJ1Y3Rpb25zLgorCisJKiBnYXMvZDMwdi93YXJuX29kZHJlZy5zOiBOZXcgdGVzdC4gQ0hlY2sgZm9yIHdhcm5pbmdzIHdoZW4KKyAgICAgICAgb2RkLW51bWJlcmVkIHJlZ2lzdGVycyBhcmUgdXNlZCBmb3Igc29tZSBpbnN0cnVjdGlvbnMuCisKKwkqIGdhcy9kMzB2L2JpdHRlc3QuczogTmV3IHRlc3QuIENoZWNrIGZvciBiaXQgb3BlcmF0aW9uIAorICAgICAgICBpbnN0cnVjdGlvbnMgKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1QpIGluIHRoZSBJVS4KKworCSogZ2FzL2QzMHYvbXVsLnM6IE5ldyB0ZXN0LiBDaGVjayBmb3IgcmVzdHJpY3RlZCBzZXF1ZW5jZXMKKyAgICAgICAgaW4gYSBidW5jaCBvZiBkaWZmZXJlbnQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgorCQorCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwIChydW5fbGlzdF90ZXN0KTogRG9uJ3QKKwlydW4gdGVzdCBvbiBEMzBWLgorCisxOTk5LTAzLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvYWxsL2dhcy5leHA6IEV4cGVjdCBzdHJvbmdhcm0tY29mZiB0YXJnZXQgdG8gZmFpbCBjb2ZmdGFnCisJdGVzdC4gCisKKzE5OTktMDItMTMgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGUgbmV3IHRlc3RzLCBiZWxvdy4KKwkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMS5kLCBnYXMvbWlwcy9lbGZfZV9mbGFnczIuZCwKKwlnYXMvbWlwcy9lbGZfZV9mbGFnczMuZCwgZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQ6IE5ldyBmaWxlcy4KKwkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzLmMsIGdhcy9taXBzL2VsZl9lX2ZsYWdzLnM6IE5ldyBmaWxlcy4KKworCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IERvY3VtZW50LiAgSXQncyBub3QKKyAJcmVhbGx5IHRyaXZpYWwuCisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBDbGVhbiB1cCBsb2dpYyBmb3IgZ3Vlc3NpbmcKKwkkcHJvZ3JhbSAodGhlIGR1bXAgdG9vbCkuCisKKzE5OTktMDItMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBQcmVmaXggYWxsIHwgd2l0aCBcLgorCShwdXNoLHBvcCk6IEZpeCBleHBlY3RlZCBvdXRwdXQuCisJKiBnYXMvbTMyci9yZWxheC0xLmQ6IEVtaXR0ZWQgbm9wcyBhcmUgc2VyaWFsLCBub3QgcGFyYWxsZWwuCisJKiBnYXMvbTMyci9mc2xvdC5kOiBQcmVmaXggYWxsIHwgd2l0aCBcLgorCisxOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvdnRhYmxlL2luaGVyaXQwLnM6IERvIG5vdCB1c2UgJ0AnIHByZWZpeCB0byAudHlwZSBvcGVyYXRvci4KKwlTb21lIHBvcnRzIHVzZSBpdCBhcyBhIGNvbW1lbnQgaW5pdGlhdG9yLgorCisJKiBnYXMvdnRhYmxlL2VudHJ5MS5kOiBEbyBub3QgbG9vayBmb3IgYW4gYWRkZW5kLiAgU29tZSBwb3J0cyB1c2UKKwlSRUwgcmVsb2NhdGlvbnMgYW5kIHNvIGRvIG5vdCBoYXZlIG9uZS4KKworMTk5OC0xMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXggdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBzeW50YXguCisJKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IEZpeCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dAorCisxOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCisKKzE5OTgtMTItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9mcjMwL2FsbGluc24uczogUmVwbGFjZSBpbGxlZ2FsIGluc25zIHdpdGggbGVnYWwgdmVyc2lvbnMuCisKKwkqIGdhcy9mcjMwL2FsbGluc24uZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgorCitUaHUgTm92IDE5IDE1OjU5OjUxIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBSZW9yZGVyIGluc25zIGZvciBiZXR0ZXIgc2ltdWxhdGlvbi4KKworVGh1IE5vdiAxOSAwNzo1MDo0NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvc3luYy5bc2RdOiBOZXcgdGVzdGNhc2UuCisJKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGl0LgorCitXZWQgTm92IDE4IDExOjI3OjU2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZ2FzL2ZyMzAvYWxsaW5zbi5zIChkbW92KTogQ29ycmVjdCBoZXggbGl0ZXJhbHMuCisKK1R1ZSBOb3YgMTcgMTU6MjQ6MjAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBNb3ZlZCBjdXJyZW50bHkgdW4tYXNzZW1ibGlhYmxlIGluc3RydWN0aW9ucworCXRvIGVuZCBvZiBmaWxlLgorCisJKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IEFkZGVkIGRpc2Fzc2VtYmx5IG9mIGN1cnJlbnRseSBhc3NlbWJsaWFibGUKKwlvcGNvZGVzLgorCitNb24gTm92IDE2IDE2OjUwOjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9mcjMwL2FsbGluc24uczogRml4IHN5bnRheCBlcnJvcnMuCisKK01vbiBOb3YgMTYgMTk6Mjc6NTIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeGVkIG1vcmUgdHlwb3MuCisKK0ZyaSBOb3YgMTMgMTM6MTU6MDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXhlZCB0eXBvcyBhbmQgYWRkZWQgc29tZSB0ZXN0cyBvZiB1cHBlcgorCWNhc2UgdnMgbG93ZXIgY2FzZS4KKworVHVlIE5vdiAxMCAxNDo1NDo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvZnIzMC9hbGxpbnNuLnM6IE5ldyBmaWxlLgorCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBOZXcgZmlsZS4KKwkqIGdhcy9mcjMwL2FsbGluc24uZXhwOiBOZXcgZmlsZS4KKwkqIGdhcy9mcjMwL2ZyMzAuZXhwOiBOZXcgZmlsZS4KKworTW9uIE5vdiAgMiAyMDoxNjo1MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9mc2xvdC5bc2RdOiBOZXcgdGVzdGNhc2UuCisJKiBnYXMvbTMyci9tMzJyLmV4cDogUnVuIGl0LgorCitUdWUgT2N0IDIwIDExOjM1OjA2IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogZ2FzL2kzODYvaTM4Ni5leHA6IFJ1biBBTUQgaW5zbiB0ZXN0LgorCSogZ2FzL2kzODYvYW1kLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2kzODYvYW1kLmQ6IE5ldyB0ZXN0IHJlc3VsdHMuCisKK1N1biBTZXAgMjAgMDE6MDA6MDEgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGdhcy92dGFibGUvaW5oZXJpdDEubDogUmVxdWlyZSBvbmx5IHRoZSB3b3JkIEdBUyBzb21ld2VyZSBpbiB0aGUKKwlmaXJzdCBsaW5lIG9mIHRoZSBsaXN0aW5nLgorCitUdWUgU2VwICAxIDEwOjIwOjAzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGdhcy9wcGMvYXN0ZXN0LmQ6IEFkanVzdCByZWdleHBzIHRvIG1hdGNoIGEgNjQtYml0IGhvc3QuCisJKiBnYXMvcHBjL2FzdGVzdDIuZDogTGlrZXdpc2UuCisKK01vbiBBdWcgMzEgMTM6MjU6MDcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZ2FzL3Z0YWJsZS97ZW50cnkwLmQsZW50cnkxLmQsaW5oZXJpdDAuZH06IEZpeCBwYXR0ZXJuIG1hdGNoaW5nCisJb2Ygd2hpdGVzcGFjZSBmb3IgNjQtYml0IGhvc3RzLgorCitNb24gQXVnIDMxIDEyOjQ1OjQ5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGdhcy92dGFibGUvdnRhYmxlLmV4cDogTmV3LgorCSogZ2FzL3Z0YWJsZS97ZW50cnkwLnMsZW50cnkwLmR9OiBOZXcuCisJKiBnYXMvdnRhYmxlL3tlbnRyeTEucyxlbnRyeTEuZH06IE5ldy4KKwkqIGdhcy92dGFibGUve2luaGVyaXQwLnMsaW5oZXJpdDAuZH06IE5ldy4KKwkqIGdhcy92dGFibGUve2luaGVyaXQxLnMsaW5oZXJpdDEubH06IE5ldy4KKworVGh1IEF1ZyAyMCAyMzoxODowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9pMzg2L3doaXRlLmw6IFJldmVydCBwYXRjaCBvZiBBdWd1c3QgMTIuCisKK1dlZCBBdWcgMTIgMTE6NTQ6MzcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvbW4xMDMwMC91ZGYuczogTmV3IHRlc3QuCisJKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFJ1biBpdC4KKworV2VkIEF1ZyAxMiAxMzoyNTozOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGdhcy9pMzg2L2dlbmVyYWwubDogVGVzdCBhbmRiICR+MHg4MCxmb28uCisJKiBnYXMvaTM4Ni9nZW5lcmFsLnM6IFVwZGF0ZS4KKworCSogZ2FzL2kzODYvd2hpdGUubDogRXhwZWN0IHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lIHNzIHByZWZpeC4KKworVHVlIEp1bCAyMSAxMjo0Njo1OSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGdhcy9pMzg2L3doaXRlLnM6IEFkZCBzb21lIG1vcmUgd2hpdGVzcGFjZSB0ZXN0cy4KKwkqIGdhcy9pMzg2L3doaXRlLmw6IFVwZGF0ZSBhY2NvcmRpbmdseS4KKworTW9uIEp1bCAxMyAxODoxNToxMSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGdhcy9pMzg2Lyo6IEFsbCBuZXcgaTM4NiB0ZXN0c3VpdGUuCisKKzE5OTgtMDctMDIgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfaW5pdCk6IENvbXBsYWluIGlmIHRhcmdldCBuYW1lIGlzbid0IGluCisJY2Fub25pY2FsIGZvcm0uCisKK1dlZCBKdWwgIDEgMTU6MzU6MDkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL2FsbC9nYXMuZXhwOiBFeHBlY3QgQVJNIGFuZCBUaHVtYiBjb2ZmdGFnIHRlc3QgdG8gZmFpbC4KKworV2VkIEp1bCAgMSAxNzozMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9wcGMvc2ltcHNoZnQuczogQWRkIGFsaWdubWVudCBzbyB0aGF0IGl0IHdvcmtzIG9uIEFJWC4KKwkqIGdhcy9wcGMvc2ltcHNoZnQuZDogQ2hhbmdlIGFjY29yZGluZ2x5LiAgT25seSBkdW1wIHRoZSAudGV4dAorCXNlY3Rpb24uCisKK1R1ZSBKdW4gMjMgMTU6MTQ6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL3Y4NTAvaGlsbzIuczogVXNlIHIxIGFzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgbW92ZWEKKwlpbnN0cnVjdGlvbiwgc2luY2UgcjAgaXMgcmVhZCBvbmx5LgorCisJKiBnYXMvdjg1MC9iYXNpYy5leHA6IEZpeCBuYW1lcyBvZiBzcGVjaWFsIGFyZWEgcmVsb2NhdGlvbnMuCisJU2V0IC1td2Fybi1zaWduZWQtb3ZlcmZsb3cgZmxhZyB3aGVuIHJ1bm5pbmcgcmFuZ2UucyB0ZXN0LgorCitTdW4gSnVuIDIxIDEyOjQ0OjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9kMzB2L3JlbG9jLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCisKK1dlZCBKdW4gMTcgMTQ6MDI6MTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvZGVsYXkuZDogQWRkIC1tY3B1PU5OTk4gdG8gZ2FzIGZsYWdzIHRvIGxldCB0ZXN0IGNhc2UKKyAJcnVuIG9uIGRpZmZlcmVudGx5IHRhcmdldGVkIGFzc2VtYmxlci4KKwkqIGdhcy9taXBzL3tsZC1pbG9ja3MtYWRkcjMyLGxkLXN2cjRwaWMuZH06IERpdHRvLgorCSogZ2FzL21pcHMve2xkLXhnb3QuZCxsaWYtc3ZyNHBpYy5kLGxpZi14Z290LmR9OiBTYW1lLgorCSogZ2FzL21pcHMve21pcHMxNi5kLG1pcHM0LmQsbm9kZWxheS5kfTogQWdhaW4uCisJKiBnYXMvbWlwcy97dHJ1bmMuZCx1bGQuZCx1bGgteGdvdC5kLHVzZC5kfTogQW5kIHRoZW4gc29tZS4KKwkKKwkqIGdhcy9taXBzL2xkLWlsb2Nrcy5kOiBSZW1vdmVkIGRpc2Fzc2VtYmxlciBmbGFncyB0byBsZXQgdGFyZ2V0CisgCWRlZmF1bHRzIGdvIHVubW9kaWZpZWQuICBSZXBsYWNlZCAkZjQvJGY1IHdpdGggJGZwWzQ1XSwgYXMgdGhlCisJb3JpZ2luYWwgYGxkLmQnIGhhZC4gIEZpbmQgYGxkLnMnLgorCSogZ2FzL21pcHMvbXVsLWlsb2Nrcy5kOiBOZWFybHkgZGl0dG8uCisJCitUaHUgSnVuIDExIDE2OjUwOjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9kMzB2L2luc3QuZDogRXhwZWN0IHJlcGVhdGkgaW5zdHJ1Y2l0b25zIHRvIGJlIGNvbWJpbmVkLgorCisJKiBnYXMvZDMwdi9pbnN0LnM6IEFkZCBub3AgdG8ga2VlcCBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb25zIGF0CisJZXhwZWN0ZWQgYWRkcmVzc2VzLgorCitNb24gSnVuICA4IDE4OjQ3OjExIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9kMzB2L2FycmF5LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciByZXN1bHRzLgorCSogZ2FzL2QzMHYvcmVsb2MuZDogUGFydGlhbGx5IHVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlcgorCXJlc3VsdHMuIAorCitGcmkgSnVuICA1IDE5OjE1OjU5IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBnYXMvbTY4ay9vcGVyYW5kcy5zOiBGb3IgYWxsIHBjIHJlbGF0aXZlIGFkZHJlc3NlcyBjaGFuZ2UgdHN0bAorCXRvIHBlYSBzaW5jZSB0aGUgZm9ybWVyIGRvZXMgbm90IGFsbG93IHBjcmVsIG9uIG02ODAwMC4gIERvIG5vdAorCW1ha2UgbGFiZWwgZm9vIGdsb2JhbCwgc28gdGhhdCByZWZlcmVuY2VzIHRvIGl0IGNhbiBiZSByZWxheGVkIG9uCisJRUxGIHRhcmdldHMuCisJKiBnYXMvbTY4ay9vcGVyYW5kcy5kLCBnYXMvbTY4ay9vcDY4MDAwLmQ6IFVwZGF0ZWQuCisKK1R1ZSBKdW4gIDIgMTU6MDg6MzYgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KKworCSogZ2FzL3BwYy9wcGMuZXhwOiBSdW4gc2ltcHNoZnQgdGVzdC4KKwkqIGdhcy9wcGMvc2ltcHNoZnQuZDogTmV3IGZpbGUuCisJKiBnYXMvcHBjL3NpbXBzaGZ0LnM6IE5ldyBmaWxlLgorCitNb24gSnVuICAxIDE3OjAwOjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21pcHMvZGl2LWlsb2Nrcy5kOiBIYW5kbGUgYm90aCAiYnJlYWsiIGluc3RydWN0aW9uIHZhcmlhbnRzLgorCSogZ2FzL21pcHMve2Rpdi5kLCBtdWwtaWxvY2tzLmQsIG11bC5kfTogTGlrZXdpc2UuCisJCitGcmkgTWF5IDI5IDEyOjA3OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkanVzdCBpbG9ja3MgaW5pdGlhbGl6YXRpb24gdG8gbWF0Y2ggY3VycmVudAorCWFzc2VtYmxlciBkZWZhdWx0cyBtb3JlIGNsb3NlbHkuCisKKwkqIGdhcy9zaC9mcC5zOiBSZW1vdmUgZnRzdC9uYW4uICBUaGUgYXNzZW1ibGVyIG5vIGxvbmdlciBzdXBwb3J0cworCXRoZSBpbnN0cnVjdGlvbi4KKwkqIGdhcy9zaC9iYXNpYy5leHA6IEFkanVzdCBhY2NvcmRpbmdseS4KKworV2VkIE1heSAyNyAxNToyNjo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvZDMwdi9hbGlnbi5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgorCSogZ2FzL2QzMHYvaW5zdC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgorCSogZ2FzL2QzMHYvaW5zdC5zOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgcnVsZXMuCisJKiBnYXMvZDMwdi9vcHQuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KKworRnJpIE1heSAyMiAxNTo1Njo1MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9hbGxpbnNuLmQ6IEhhbmRsZSA2NCBiaXQgYmZkX3ZtYS4KKwkqIGdhcy9tMzJyL3VwcGVyY2FzZS5kOiBMaWtld2lzZS4KKworVGh1IE1heSAyMSAxNTowMzowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvYXJtL3RodW1iLnM6IEFkZCBwZXJpb2QgdG8gc3RhcnQgb2YgbGFiZWxzIHRvIHByZXZlbnQKKwlhc3NlbWJsZXIgdGhpbmtpbmcgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCisKK1R1ZSBNYXkgMTkgMTg6MTc6MTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9taXBzMTYuZDogQ29ycmVjdCB0byByZWZsZWN0IGJ1ZyBmaXggdG8gZGlzYXNzZW1ibGVyLgorCitNb24gTWF5IDE4IDEzOjExOjQ1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL3tkaXYsbGQsbXVsfS5kOiBBZGQgYXNzZW1ibGVyIC1tY3B1PSBmbGFnIHRvIG1hdGNoCisgCWRpc2Fzc2VtYmxlci4KKwkKK0ZyaSBNYXkgMTUgMTQ6NTE6MDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL21pcHMuZXhwOiBEaXN0aW5ndWlzaCBjaGFpbnMgd2l0aCAzMi1iaXQgYWRkcmVzc2VzLgorCSogZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kIDogTmV3LgorCitXZWQgTWF5IDEzIDE1OjA2OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9tMzJyL3VwcGVyY2FzZS5bc2RdOiBUZXN0IGZvciBISUdILFNISUdILExPVyxTREEuCisKK1RodSBNYXkgIDcgMTM6MDU6MjUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvYnJlYWsyMC5bc2RdOiBOZXcgdGVzdHMgZm9yIDIwLWJpdCBvcGVyYW5kIGJyZWFrIGFuZAorIAlzZGRicCBpbnN0cnVjdGlvbnMuIAorCSogZ2FzL21pcHMvdHJhcDIwLltzZF06IE5ldyB0ZXN0cyBmb3IgMjAtYml0IG9wZXJhbmQgdHJhcAorIAlpbnN0cnVjdGlvbnMuIAorCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGVtLgorCitUaHUgQXByIDMwIDExOjU1OjAxIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGdhcy9kMzB2L3tpbnN0LGFycmF5LG9wdCxyZWxvY30uZDogQWNjZXB0IDxzeW1ib2wrb2Zmc2V0PiBsYWJlbHMKKyAJaW4gZGlzYXNzZW1ibHksIHdoZXJlIHRoZSBvZmZzZXQgaXMgaW4gaGV4IGFuZCBoYXMgYSAiMHgiIHByZWZpeC4KKwkKK1R1ZSBBcHIgMjggMTY6Mzg6MzQgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvbGluZW5vLltzZF06IEFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlciB0ZXN0LgorCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZGVkIGxpbmVubyB0ZXN0LgorCitXZWQgQXByICA4IDE4OjQ1OjE3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL3Rlc3RzdWl0ZS9hbGwvZ2FzLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcyBmb3IKKwlkaWZmZXJlbmNlIG9mIHVuZGVmaW5lZCBzeW1ib2xzIG9uIG1uMTB4MDAgdGFyZ2V0cy4KKworTW9uIE1hciAyMyAxMDo0NzozMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBnYXMvYWxsL2FsaWduLnM6IEJhY2sgb3V0ICIuc2VjdGlvbiB0ZXh0IiBjaGFuZ2UgYmVsb3c7CisJdXNlICIudGV4dCIgYWdhaW4uCisJKiBnYXMvbWFjcm9zL3NlbWkuczogRGl0dG8uCisJCitGcmkgTWFyIDIwIDE4OjUxOjQ5IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGdhcy9hbGwvYWxpZ24uczogSWRlbnRpZnkgIi50ZXh0IiBzZWN0aW9uIGV4cGxpY2l0bHkuCisJKiBnYXMvbWFjcm9zL3NlbWkuczogRGl0dG8uCisJCisJCisJCitNb24gTWFyICAyIDEzOjMwOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9hbGxpbnNuLltzZF0gKGxkaThhLGxkaTE2YSk6IERlbGV0ZS4KKwkobGRpMTYpOiBJbXByb3ZlIHRlc3QuCisJKG5vcCk6IEZpeCB0ZXN0LgorCitUaHUgRmViIDEyIDIwOjEyOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzcC9tYWNyby5vdXQ6IEFkanVzdCB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQga2V5d29yZAorCWFyZ3VtZW50cyBhcmUgbm93IHBlcm1pdHRlZCBhZnRlciBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KKworV2VkIEZlYiAgNCAxNToyNzo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KKworV2VkIEZlYiAgNCAxNTo0MDowMCAxOTk4ICBHZW9mZnJleSBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBnYXMvcHBjL3BwYy5leHA6IE5ldyBmaWxlLgorCSogZ2FzL3BwYy9hc3Rlc3QucywgZ2FzL3BwYy9hc3Rlc3QuZDogTmV3IHRlc3QuCisJKiBnYXMvcHBjL2FzdGVzdDIucywgZ2FzL3BwYy9hc3Rlc3QyLmQ6IE5ldyB0ZXN0LgorCitTdW4gRmViICAxIDIxOjQzOjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21pcHMvNDAxMC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KKwkqIGdhcy9taXBzLzQwMTAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCSogZ2FzL21pcHMvNDEwMC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KKwkqIGdhcy9taXBzLzQxMDAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCSogZ2FzL21pcHMvNDY1MC5zOiBQYWQgdGVzdCBjb2RlIG91dCB0byBhIDE2Ynl0ZSBib3VuZGFyeS4KKwkqIGdhcy9taXBzLzQ2NTAuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCitGcmkgSmFuIDMwIDE0OjA5OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS9tb3ZlbWwuZDogQWRkIHRlc3QgY29tbWVudHMsIGZpeCByZWdleHBzLgorCitUaHUgSmFuIDI5IDEzOjM0OjQ5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9tMzJyL3thbGxpbnNuLGhpZ2gtMX0uZDogQWxsb3cgIyBjb25zdGFudCBwcmVmaXggdG8gYmUgbWlzc2luZy4KKworVGh1IEphbiAyOSAwOTo0Mzo1MCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBnYXMvbTY4ay9tcmlfbW92ZW1sLltzZF06IE1vdmVkIHRvIC4uLgorCSogZ2FzL21yaS9tb3ZlbWwuW3NkXTogLi4uIGhlcmUuCisJKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KKworVHVlIEphbiAyNyAyMTo1NTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9taXBzLzQwMTAuczogQWRkIDQwMTAgdGVzdHMuCisJKiBnYXMvbWlwcy80MDEwLmQ6IEV4cGVjdGVkIG91dHB1dC4KKwkqIGdhcy9taXBzLzQxMDAuczogQWRkIDQwMTAgdGVzdHMuCisJKiBnYXMvbWlwcy80MTAwLmQ6IEV4cGVjdGVkIG91dHB1dC4KKwkqIGdhcy9taXBzLzQ2NTAuczogQWRkIDQwMTAgdGVzdHMuCisJKiBnYXMvbWlwcy80NjUwLmQ6IEV4cGVjdGVkIG91dHB1dC4KKwkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gdGhlIG5ldyB0ZXN0cy4KKwkqIGdhcy9taXBzLyouZDogUGFzcyB0aGUgcmlnaHQgcHJvY2Vzc29yIG1vZGVsIHRvIG9iamR1bXAuCisJRml4IG1pbm9yIGNhc2VzIHdoZXJlIGV4cGVjdGVkIG91dHB1dCB3YXMgd3JvbmcgZHVlIHRvIG9wY29kZQorCWNvbmZsaWN0cy4KKworVHVlIEphbiAyNyAwNTozNTowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBnYXMvbTY4ay9tcmlfbW92ZW1sLltzZF06IE5ldyB0ZXN0Y2FzZS4KKworVGh1IEphbiAyMiAxNzoyOTowNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9oaWdoLTEuZDogQWRkIGhhc2ggcHJlZml4IHRvIGNvbnN0YW50cy4KKworCSogZ2FzL20zMnIvYWxsaW5zbi5zOiBBZGQgaGFzaCBwcmVmaXggdG8gc29tZSBjb25zdGFudHMuCisJKiBnYXMvbTMyci9hbGxpbnNuLmQ6IEFkZCBoYXNoIHByZWZpeCB0byBjb25zdGFudHMuCisKK1dlZCBKYW4gMjEgMjE6MjQ6MDggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBnYXMvbTg4ay9pbml0LmQ6IEZpeCBoZXhhZGVjaW1hbCBvZmZzZXRzLgorCitXZWQgSmFuIDE0IDE3OjQ5OjIyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGdhcy9tMzJyL3VwcGVyY2FzZS5kOiBGaXggd2hpdGUgc3BhY2UgbWF0Y2hpbmcuCisJKiBnYXMvbTMyci9yZWxheC0xLmQ6IEZpeCB3aGl0ZSBzcGFjZSBtYXRjaGluZy4KKworV2VkIEphbiAxNCAxNTo0NDozMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9taXBzL2Rpdi5kOiBVcGRhdGUgZm9yIHJlY2VudCBhc3NlbWJsZXIgY2hhbmdlcy4KKwkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogTGlrZXdpc2UuCisKK1dlZCBKYW4gMTQgMTE6MTM6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGdhcy9tMzJyL2FsbGluc24uZCAoY21wdWkpOiBVcGRhdGUgb3V0cHV0IHRvIG5ldyBmb3JtYXQuCisKK1RodSBEZWMgMTggMTE6MTA6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgorCisJKiBnYXMvYXJtL2FybTd0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgorCitUdWUgRGVjIDE2IDIyOjE5OjI1IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9sYi14Z290LmQsIGdhcy9taXBzL3JvbC5kLCBnYXMvbWlwcy9qYWwtc3ZyNHBpYy5kLAorCWdhcy9taXBzL2phbC14Z290LmQ6IEFkZCBhc3NlbWJsZXIgb3B0aW9uIHRvIHNlbGVjdCBhIHNwZWNpZmljCisJdGFyZ2V0IGNoaXAsIHRoZSBSMzAwMC4KKwkqIGdhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQ6IE5ldyB0ZXN0LCBzcGVjaWZpY2FsbHkgc2VsZWN0aW5nCisJUjM5MDAuCisJKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIGl0LgorCisJKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IERvbid0IHJ1biBJRUVFIEZQIHRlc3RzIGZvciBWYXgKKwl0YXJnZXRzLgorCitXZWQgT2N0IDE1IDEwOjQwOjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuczogVHdlYWsgc2xpZ2h0bHkgdG8gd29yayBvbiB0aGUgUEEuCisKKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyCisJY2hhbmdlcy4KKworVGh1IE9jdCAgOSAxODoxMDo0NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMvc2V0NjQuW3NkXTogYHNldCcgZG9lc24ndCB0YWtlIG5lZ2F0aXZlIGFyZ3VtZW50cy4KKworVGh1IE9jdCAgOSAxMjo1OTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCisJKiBnYXMvaDgzMDAvZmZ4eDEuZDogTGlrZXdpc2UuCisKK1dlZCBPY3QgIDggMTY6MjI6NTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2FzL3NwYXJjL3JlbG9jNjQuW3NkXTogQWRkIHRlc3RjYXNlcyBmb3IgJWhpeCwlbG94LgorCitXZWQgT2N0ICA4IDE1OjEyOjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL3NwYXJjL3N5bnRoLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgorCSogZ2FzL3NwYXJjL3N5bnRoNjQuZDogTGlrZXdpc2UuCisKKwkqIGdhcy9taXBzL2JlcS5zOiBBZGQgLnRleHQgdG8gLmdsb2JsIHRvIG1hcmsgdGhlIHN5bWJvbCB0byBhcyBhCisJZnVuY3Rpb24gc3ltYm9sLgorCSogZ2FzL21pcHMvamFsLnM6IExpa2V3aXNlLgorCitUdWUgT2N0ICA3IDEzOjMwOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9zcGFyYy9yZWxvYzY0LltzZF06IE5ldyB0ZXN0Y2FzZS4KKwkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biBpdC4KKworU2F0IE9jdCAgNCAxOToxNDoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cDogQWNjZXB0IG02OGsgbGlzdGluZyBmb3JtYXQuCisKK0ZyaSBPY3QgIDMgMTU6NDY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbDsgaXQgc2hvdWxkIG5vdworCXdvcmsuICBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIGFuZCBmb3IgdGFicyBpbiBpbnB1dCBmaWxlLgorCisJKiBnYXMvYWxwaGEvZnAuZXhwOiBDaGVjayBmb3IgYWxwaGEtKi1vc2YqLCBub3QgYWxwaGEtKi1vc2YxKi4KKwkqIGdhcy9hbHBoYS9mcC5zOiBDaGFuZ2UgY29tbWVudCBjaGFyYWN0ZXJzIGZyb20gISB0byAjLgorCitUaHUgU2VwIDE4IDExOjE3OjUzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9zcGFyYy9zcGxldC5kOiBVcGRhdGUgdG8gbmV3IG9iamR1bXAgb3V0cHV0IGZvcm1hdC4KKwkqIGdhcy9zcGFyYy97YXNpLmQsbWVtYmFyLmQscHJlZmV0Y2guZCxyZHByLmQsd3Jwci5kfTogTGlrZXdpc2UuCisJKiBnYXMvc3BhcmMvc2V0NjQuW2RzXTogTmV3IHRlc3RjYXNlLgorCSogZ2FzL3NwYXJjL3NwbGV0LTIuW2RzXTogTmV3IHRlc3RjYXNlLgorCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIHRoZW0uCisKK1R1ZSBTZXAgMTYgMTU6Mjc6MDggMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6CisKKwkqIGdhcy9kMzB2L2luc3QuczogQWRkIHNvbWUgbmV3IHRlc3RzLiAKKworIAkqIGdhcy9kMzB2L3tpbnN0LCBvcHQsIHJlbG9jfS5kOiBVcGRhdGUgcmVzdWx0cyB3aXRoCisgCW5ldyBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KKworCSogZ2FzL2QzMHYvaW5zdC5bc2RdOiBVcGRhdGUgZXhhbXBsZXMgZm9yIGQqaSBpbnN0cnVjdGlvbnMuIAorCisJKiBnYXMvZDMwdi8qLmQ6IFVwZGF0ZSBhbGwgdGVzdCByZXN1bHRzIGJlY2F1c2UKKyAJb2YgbmV3ICIucyIgYW5kICIubCIgZXh0ZW5zaW9ucy4KKworCSogZ2FzL2QzMHYvaW5zdC5bc2RdOiBDb3JyZWN0IGVudHJ5IGZvciBtdWx4MmguCisJKiBnYXMvZDMwdi9vcHQuW3NkXTogQ29ycmVjdCBzdDJ3IGluc3RydWN0aW9uLiAKKworCSogZ2FzL2QzMHYvYWxpZ24uZDogQ2hhbmdlIGV4cGVjdGVkIG91dHB1dC4KKworCSogZ2FzL2QzMHYvcmVsb2MuW3NkXTogQWRkIHRlc3QgY2FzZS4gCisKKwkqIGdhcy9kMzB2L2FycmF5LltzZF06IE5ldyB0ZXN0IGNhc2UuCisKKwkqIGdhcy9kMzB2L29wdC5bc2RdOiBBZGRlZCBtb3JlIHRlc3QgY2FzZXMuIAorCisJKiBnYXMvZDMwdi9vcHQuczogQWRkIHRlc3QgY2FzZXMuCisJKiBnYXMvZDMwdi9yZWxvYy5zOiBGaXggYSB0ZXN0IGNhc2UuCQorCSogZ2FzL2QzMHYve29wdCxyZWxvY30uZDogUmVnZW5lcmF0ZS4KKworTW9uIFNlcCAgOCAxNDoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9oaWdoLTEuW2RzXTogTmV3IHRlc3RjYXNlLgorCSogZ2FzL20zMnIvbTMyci5leHA6IFJ1biBpdC4KKworTW9uIEF1ZyAyNSAxMTowNDoyNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9yZWxheC0xLltkc106IE5ldyB0ZXN0Y2FzZS4KKwkqIGdhcy9tMzJyL20zMnIuZXhwOiBSdW4gaXQuCisKK1RodSBBdWcgMTQgMjM6NDk6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2FzL2FyYzogTmV3IGRpcmVjdG9yeQorCSogZ2FzL2FyYy97YXJjLmV4cCxhbGlhcy5bc2RdLGJyYW5jaC5bc2RdLGZsYWcuW3NkXSxpbnNuMy5bc2RdLGouW3NkXSwKKwlsZC5bc2RdLG1hdGguW3NkXSxzc2hpZnQuW3NkXSxzdC5bc2RdLHdhcm4ue2V4cCxzfX06IE5ldyBmaWxlcy4KKworV2VkIEF1ZyAgNiAwMDozMzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IEFTIGFuZCBHQVNQIHRvIGFzLW5ldywgbm90IGFzLm5ldy4KKworVHVlIEF1ZyAgNSAxMjozMzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IE5NIHRvIG5tLW5ldywgbm90IG5tLm5ldywgdG8gbWF0Y2gKKwlyZWNlbnQgY2hhbmdlIGluIGJpbnV0aWxzIGJ1aWxkIGRpcmVjdG9yeS4KKworVGh1IEp1bCAzMSAxNToyMTo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy92ODUwL3JhbmdlLnM6IE5ldyB0ZXN0LgorCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gaXQuCisKK1R1ZSBKdWwgMjkgMTQ6MzU6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvdjg1MC9oaWxvMi5zOiBOZXcgdGVzdC4KKwkqIGdhcy92ODUwL2ZlcHN3LnM6IE5ldyB0ZXN0LgorCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KKworVHVlIEp1bCAxNSAxMzowMzoxNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci91cHBlcmNhc2UuW3NkXTogTmV3IHRlc3RjYXNlLgorCSogZ2FzL20zMnIvbTMyci5leHA6IE5ldyBmaWxlLgorCitNb24gSnVuIDE2IDE0OjMyOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL202OGsvcGNyZWwuZDogVXBkYXRlIGZvciBtNjhrIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgorCSogZ2FzL202OGsvb3BlcmFuZHMuZDogTGlrZXdpc2UuCisKK01vbiBKdW4gIDIgMTY6NTA6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2FzL2FybS9hcm0uZXhwOiBBZGRlZCBjaGFuZ2VzIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgorCitNb24gSnVuICAyIDEyOjA5OjAyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9taXBzLmV4cDogVGhlIHIzOTAwIGhhcyBpbnRlcmxvY2tzIGZvciBtdWwsIGJ1dAorCW5vdCBkaXYuCisKK01vbiBKdW4gIDIgMTI6MDM6MzIgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQC5jeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9tdWwue2Qsc306IEVuZCB0aGUgdGVzdHMgd2l0aCBuby1vcHMuIAorCitNb24gSnVuICAyIDExOjQ4OjU4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IEltcHJvdmUgbWVzc2FnZXMgd2hlbiBvbmUKKwlmaWxlIGlzIHNob3J0ZXIgdGhhbiB0aGUgb3RoZXIuCisKK1dlZCBNYXkgIDcgMTY6MTg6MzAgMTk5NyAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBnYXMvbTg4ay9pbml0LntzLGR9OiBOZXcgY2hlY2tzIGZvciBwcm9wZXIgcGFkZGluZyBvZgorCS5pbml0IHNlY3Rpb25zLgorCSogZ2FzL204OGsvbTg4LmV4cDogUnVuIHRoZW0uCisKKwkqIGdhcy9tNjhrL3QyLmQ6IE5ldyBmaWxlIGZvciBjaGVjayBvZiBwcmVzZW5jZSBvZiBzZWN0aW9uCisJc3ltYm9scyBvbiB0aGUgbTY4ay1tb3Rvcm9sYS1zeXN2LgorCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHQyIGlmIFtpc3RhcmdldCBtNjgqLW1vdG9yb2xhLXN5c3ZdLgorCitXZWQgTWF5ICA3IDE2OjEyOjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL2FsbC9nYXMuZXhwOiBEb24ndCBydW4gY29mZnRhZyB0ZXN0IGZvciBtODhrLWNvZmYuCisKKwkqIGdhcy9taXBzL2xpZmxvYXQuczogVXBkYXRlIGZvciByZWNlbnQgY2hhbmdlcyB0byBmbG9hdGluZyBwb2ludAorCWhhbmRsaW5nLgorCSogZ2FzL21pcHMvbGlmLWVtcGljLmQsIGdhcy9taXBzL2xpZi1zdnI0cGljLmQ6IExpa2V3aXNlLgorCSogZ2FzL21pcHMvbGlmLXhnb3QuZCwgZ2FzL21pcHMvbGlmbG9hdC5kOiBMaWtld2lzZS4KKworCSogZ2FzL21pcHMvbWlwcy5leHA6IEhhbmRsZSBJcml4IDYgbGlrZSBJcml4IDUuCisKK1NhdCBBcHIgMTkgMjM6MTY6MzUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BwZXRyYS5hcHBsaS5zZT4KKworCSogZ2FzL21pcHMvbWlwcy5leHA6IEhhbmRsZSBPcGVuQlNEIGxpa2UgTmV0QlNELgorCitXZWQgQXByIDE2IDEyOjIwOjI0IDE5OTcgIE1hcnRpbiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBnYXMvZDMwdi9kMzAuZXhwOiBBZGQgb3B0aW1pemVyIHRlc3QgY2FzZS4KKwkqIGdhcy9kMzB2L29wdC5zOiBBZGQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdGVzdHMuCisJKiBnYXMvZDMwdi9vcHQuZDogUmVidWlsZC4KKworVHVlIEFwciAxNSAxODoxMDowMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMve2RlbGF5LmQsbm9kZWxheS5kfTogYWRkZWQuCisKK01vbiBBcHIgIDcgMTI6NTc6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2FzL20zMnIvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbmV3IG9iamR1bXAgb3V0cHV0IHN0eWxlLgorCitGcmkgQXByICA0IDEzOjE5OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL2FsbC9mbG9hdC5zOiBQdXQgYSB0YWIgYmVmb3JlIC50ZXh0LCB0byBrZWVwIHRoZSBQQSBoYXBweS4KKworCSogZ2FzL2FybS9hcm0uZXhwOiBPbmx5IHJ1biBpbnN0IGFuZCBhcm03dCBvbiB0YXJnZXRzIHdoaWNoIGNhbgorCWhhbmRsZSAtRUwuICBBZGQgc2V0dXBfeGZhaWwgZm9yIHRodW1iLgorCisJKiBnYXMvaDgzMDAvZmZ4eDEuZDogRG9uJ3QgZmFpbCBpZiBCRkQgaXMgNjQgYml0cy4KKworVGh1IEFwciAgMyAxODoyNjo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvbTMyci9hbGxpbnNuLntleHAscy5kfTogTmV3IHRlc3RjYXNlcy4KKworVGh1IE1hciAyNyAwMDo0MjoyOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZ2FzL2QzMHYvZDMwLmV4cDogQWRkIHRlc3QgY2FzZSByZWxvYy4KKwkqIGdhcy9kMzB2L3JlbG9jLltzZF06IE5ldyBmaWxlcyB0byB0ZXN0IHJlbG9jYXRpb25zLgorCitTYXQgTWFyIDE1IDE3OjIxOjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL2FybS9pbnN0LmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCisJKiBnYXMvYXJtL2FybTd0LmQ6IExpa2V3aXNlLgorCitUdWUgTWFyIDExIDEzOjMxOjU2IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGFzc2VtYmxlciBidWcgZml4LgorCitXZWQgTWFyICA1IDEzOjAxOjI0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL2FsbC9nYXMuZXhwOiB4ZmFpbCBhIGNvdXBsZSB0ZXN0cyBmb3IgdGhlIG1uMTAzMDAuCisKK01vbiBNYXIgIDMgMTE6NDE6MDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdhcy90aWM4MC97YWRkLmQsIGZsb2F0LmQsIHJlZ29wczIuZCwgcmVsb2NzMS5kLCByZWxvY3MxYi5kLAorCXJlbG9jczIuZCwgcmVsb2NzMmIuZH06IEFkanVzdCB0byBvYmpkdW1wIGZvcm1hdCB0d2Vha3MuCisKK1RodSBGZWIgMjcgMTU6MjE6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdhcy90aWM4MC97YWxpZ24uZCwgYWxpZ24ubHN0LCBhbGlnbi5zfSBOZXcgdGVzdCBmb3IgdGhlCisJIi5hbGlnbiIgcHNldWRvcC4KKwkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgYWxpZ24gdGVzdC4KKwkKK1dlZCBGZWIgMjYgMjA6MzY6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdhcy90aWM4MC97ZmxvYXQuZCwgZmxvYXQubHN0LCBmbG9hdC5zfTogTmV3IHRlc3RzIGZvcgorCXNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4KKwkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgZmxvYXQgdGVzdC4KKworV2VkIEZlYiAyNiAxNToxNjowNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2FzL3RpYzgwL3tyZWdvcHMyLmQsIHJlZ29wczIubHN0LCByZWdvcHMyLnMsIHJlZ29wczMuZCwKKyAJcmVnb3BzMy5sc3QsIHJlZ29wczMucywgcmVnb3BzNC5kLCByZWdvcHM0LmxzdCwgcmVnb3BzNC5zfToKKwlOZXcgdGVzdHMgZm9yIDptIGFuZCA6cyBvcGVyYW5kIG1vZGlmaWVycy4KKwkqIGdhcy90aWM4MC90aWM4MC5leHA6IFJ1biB0aGUgcmVnb3BzMiwgcmVnb3BzMywgYW5kIHJlZ29wczQgdGVzdHMuCisKK1R1ZSBGZWIgMjUgMTM6NDU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWFjcm9zL3NlbWkuczogRm9yY2UgdGhlIGZpbmFsIGFsaWdubWVudCB0byB1c2UgYSBmaWxsIHZhbHVlCisJb2YgMC4KKworCSogZ2FzL2FsbC9jb25kLnMsIGdhcy9hbGwvY29uZC5kOiBOZXcgdGVzdC4KKwkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgorCitNb24gRmViIDI0IDEwOjUyOjEyIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwKGdhc19pbml0KTogQWRkZWQgbmV3IHBhcmFtZXRlciBmb3Igc2NyaXB0CisJbmFtZS4KKworTW9uIEZlYiAyNCAxMDo0MDoyOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2FzL3RpYzgwL3thZGQuZCwgYml0bnVtLmQsIGNjb2RlLmQsIGNyZWdvcHMuZCwgZW5kbWFzay5kLAorCXJlZ29wcy5kLCByZWxvY3MxLmQsIAorCShyZWxvY3MxLmMpOiBBZGQgZmlsZSBmb3IgcmVmZXJlbmNlLgorCShyZWxvY3MxYi5kKTogU3BsaXQgcmVsb2MgdGFibGUgY29udGVudHMgdGVzdCB0byBkaWZmZXJlbnQgdGVzdCBmaWxlLgorCShyZWxvY3MyLmMpOiBBZGQgdGVzdCB0aGF0IHVzZXMgdmFyaW91cyB0eXBlcyAoY2hhciwgc2hvcnQsIGludCwgLi4uKSBvZgorCXN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIGRhdGEgc2h1ZmZsaW5nIHRvIGdlbmVyYXRlIGxvdHMgb2YgbGQvc3QKKwlpbnN0cnVjdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMuCisJKHJlbG9jczIuZCk6IE5ldyBmaWxlLCBleHBlY3RlZCBjb2RlIGZvciByZWxvY3MyIHRlc3QuCisJKHJlbG9jczIubHN0KTogTmV3IGZpbGUsIFRJIGFzc2VtYmxlciBsaXN0aW5nIGZvciByZWZlcmVuY2UuCisJKHJlbG9jczIucyk6IE5ldyBmaWxlLCBhc3NlbWJseSBzb3VyY2UgZm9yIHJlbG9jczIgdGVzdC4KKwkocmVsb2NzMmIuZCk6IE5ldyBmaWxlLCBleHBlY3RlZCByZWxvYyB0YWJsZSBjb250ZW50cyBmb3IgcmVsb2NzMiB0ZXN0LgorCSh0aWM4MC5leHApOiBSdW4gdGhlIHJlbG9jczFiLCByZWxvY3MyLCBhbmQgcmVsb2NzMmIgdGVzdHMuCisKK1N1biBGZWIgMjMgMTc6NTQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBnYXMvYWxsL2l0YmwtdGVzdC5jKG1haW4pOiBVcGRhdGUgZnVuY3Rpb24gY2FsbHMuCisJUmVtb3ZlIHBhcmFtZXRlcnMgZnJvbSBpdGJsX2dldF9yZWdfdmFsIGFuZAorCWNoYW5nZSBpdGJsX2dldF9pbnNuX25hbWUgdG8gaXRibF9nZXRfZmllbGQuCisKK1N1biBGZWIgMjMgMTc6MjI6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9pdGJsOiBBZGQgY29tbWVudHMuCisJKiBnYXMvbWlwcy9pdGJsLnM6IEFkZCBjb21tZW50cy4gIFByZWZpeCByZWdpc3RlciBuYW1lcyB3aXRoICQuCisJKiBnYXMvYWxsL2l0Ymw6IEdlbmVyaWMgdGFibGUgZm9yIHRlc3RpbmcgZm9yIGl0Ymwgc3VwcG9ydC4KKwkqIGdhcy9hbGwvaXRibC5zOiBHZW5lcmljIGFzc2VtYmx5IGZvciB0ZXN0aW5nIGZvciBpdGJsIHN1cHBvcnQuCisJKiBnYXMvbWlwcy9pdGJsLXRlc3QuYzogTW92ZWQgdG8gZ2FzL2FsbC4KKwkqIGdhcy9hbGwvaXRibC10ZXN0LmM6IE1vdmVkIGZyb20gZ2FzL21pcHMuCisKK1NhdCBGZWIgMjIgMjA6MjQ6MjMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdhcy90aWM4MC97YWRkLmxzdCwgYml0bnVtLmxzdCwgY2NvZGUubHN0LCBjcmVnb3BzLmxzdCwKKyAJZW5kbWFzay5sc3QsIHJlZ29wcy5sc3R9OiBSZW1vdmUgXk0ncyBmcm9tIGVuZCBvZiBsaW5lcy4KKwkqIGdhcy90aWM4MC9iaXRudW0uczogQWRkIGNvbW1lbnQgdG8gZWFjaCBsaW5lIHNob3dpbmcgdmFsdWUKKwl0aGF0IHN5bWJvbGljIEJJVE5VTSBhc3NlbWJsZXMgdG8uICBBZGQgY292ZXJhZ2UgZm9yIHJhdworCW51bWVyaWMgdmFsdWVzIGZvciB0aGUgQklUTlVNIG9wZXJhbmQuCisJKiBnYXMvdGljODAvYml0bnVtLmQ6IFVwZGF0ZSBkdWUgdG8gYml0bnVtLnMgY2hhbmdlcy4KKwkqIGdhcy90aWM4MC9yZWdvcHMuZDogVXBkYXRlIGR1ZSB0byBvcGNvZGUgbGlicmFyeSBhZGRpdGlvbnMKKwlvZiBmbG9hdGluZyBwb2ludCB0ZXN0IEJJVE5VTSB2YWx1ZXMgdGhhdCBhcmUgYW1iaWd1b3VzIHdpdGgKKwl0aGUgaW50ZWdyYWwgb25lcy4KKwkqIGdhcy90aWM4MC9yZWxvY3MxLnM6IE5ldyB0ZXN0IGNhc2UgdGhhdCB0ZXN0cyBzaW1wbGUgcmVsb2NzLgorCSogZ2FzL3RpYzgwL3JlbG9jczEuZDogRXhwZWN0ZWQgb3V0cHV0IGZvciBhYm92ZS4KKwkqIGdhcy90aWM4MC9yZWxvY3MxLmxzdDogVEkgYXNzZW1ibGVyIGxpc3RpbmcgZm9yIGFib3ZlLgorCSogZ2FzL3RpYzgwL3RpYzgwLmV4cDogQWRkIHJlbG9jczEgdGVzdC4KKworRnJpIEZlYiAyMSAxNDoyMzoxNCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZ2FzL2QzMHYve2FsaWduLmQsIGFsaWduLnMsIGQzMC5leHAsIGd1YXJkLmQsIGd1YXJkLnMsCisJaW5zdC5kLCBpbnN0LnMsIG9wdC5kLCBvcHQuc306IFRlc3QgZmlsZXMgZm9yIEQzMFYuCisKK1dlZCBGZWIgMTkgMDA6NTU6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWFjcm9zL3NlbWkucywgZ2FzL21hY3Jvcy9zZW1pLmQ6IE5ldyB0ZXN0LgorCSogZ2FzL21hY3Jvcy9tYWNyb3MuZXhwOiBSdW4gaXQuCisJKiBnYXMvbXJpL3NlbWkucywgZ2FzL21yaS9zZW1pLmQ6IE5ldyB0ZXN0LgorCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCisKK1R1ZSBGZWIgMTggMTM6Mzc6MDYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKGFsaWduNCB0ZXN0cyk6IFR3ZWFrIGV4cGVjdGVkCisJb3V0cHV0LgorCQorRnJpIEZlYiAxNCAxNzo1NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9hbGwvYWxpZ24uZCwgZ2FzL2FsbC9hbGlnbi5zOiBOZXcgdGVzdC4KKwkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgorCitUaHUgRmViIDEzIDE0OjQ0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvbWlwczE2LmQ6IENvcnJlY3QgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCisKK1dlZCBGZWIgMTIgMTI6MzM6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9saWYtc3ZyNHBpYy5kOiBQYXNzIC1FQiB3aGVuIHJ1bm5pbmcgdGhlIGFzc2VtYmxlci4KKwkqIGdhcy9taXBzL2xpZi14Z290LmQ6IExpa2V3aXNlLgorCSogZ2FzL21pcHMvdWxoLXN2cjRwaWMuZDogTGlrZXdpc2UuCisJKiBnYXMvbWlwcy91bGgteGdvdC5kOiBMaWtld2lzZS4KKworCSogZ2FzL21pcHMvbWlwczE2LmQ6IFVwZGF0ZSBmb3IgeWV0IGFub3RoZXIgY2hhbmdlIGluIGRpc2Fzc2VtYmx5CisJb3V0cHV0ICh0aGlzIG9uZSBpcyBzcGFjaW5nIG9ubHkpLgorCitUdWUgRmViIDExIDE0OjQ1OjM5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnYXMvdGljODAve2FkZC5kLCBhZGQubHN0LCBhZGQucywgYml0bnVtLmQsIGJpdG51bS5sc3QsIGJpdG51bS5zLAorIAljY29kZS5kLCBjY29kZS5sc3QsIGNjb2RlLnMsIGNyZWdvcHMuZCwgY3JlZ29wcy5sc3QsIGNyZWdvcHMucywKKwllbmRtYXNrLmQsIGVuZG1hc2subHN0LCBlbmRtYXNrLnMsIHJlZ29wcy5kLCByZWdvcHMubHN0LCByZWdvcHMucywKKwl0aWM4MC5leHB9OiBOZXcgZmlsZXMgZm9yIFRJYzgwIHRlc3QgY2FzZXMuCisKK1R1ZSBGZWIgMTEgMTU6NDY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9taXBzMTYuZDogVXBkYXRlIGZvciBjaGFuZ2UgaW4gZGlzYXNzZW1ibHkgb3V0cHV0LgorCitNb24gRmViIDEwIDIyOjI0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBBZGQgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIGZpeCBpbmRlbnRhdGlvbi4gICAKKworTW9uIEZlYiAxMCAxNzo1NDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBOZXcgZmlsZS4gIFN0YW5kLWFsb25lIGFzc2VtYmxlciBhbmQgCisJZGlzc2Fzc2VtYmxlciBmb3IgaXRibCBzdXBwb3J0LgorCitNb24gRmViIDEwIDE3OjIwOjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvaXRibDogTmV3IGZpbGUuICBJbnN0cnVjdGlvbiBTcGVjIGZvciB0ZXN0aW5nIC0taXRibAorCW9wdGlvbi4KKwkqIGdhcy9taXBzL2l0YmwuczogTmV3IGZpbGUuICBBc3NlbWJseSB3aXRoIG5lMncgaW5zdHJ1Y3Rpb25zCisJc3BlY2lmaWVkIGluIGl0YmwuCisKK0ZyaSBGZWIgIDcgMTY6NDI6NTMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdhc3AvZ2FzcC5leHA6IFVzZSBwcnVuZV93YXJuaW5ncyBpbnN0ZWFkIG9mIHBydW5lX3N5c3RlbV9jcnVkLgorCSogbGliL2dhcy1kZWZzLmV4cDogRGl0dG8uCisKK01vbiBGZWIgIDMgMTU6NDY6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvYXJtL2luc3QuZCwgZ2FzL2FybS9hcm03dC5kOiBQYXNzIC0tcHJlZml4LWFkZHJlc3NlcyB0bworCW9iamR1bXAuICBVcGRhdGUgZm9yIGN1cnJlbnQgcmVsb2NhdGlvbiBwcmludGluZyBzdHlsZS4KKworVGh1IEphbiAzMCAxMTo1NzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL21pcHMxNi5kOiBVcGRhdGUgZm9yIGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgorCitUaHUgSmFuIDIzIDAzOjE1OjA2IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBnYXMvbWlwcy9taXBzLmV4cDogc2V0IGlsb2NrcyBmb3IgYWxsIDQxMDAvNDMwMAorCitUaHUgSmFuICAyIDE2OjQ5OjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvbWlwczE2LnMsIGdhcy9taXBzL21pcHMxNi5kOiBOZXcgdGVzdC4KKwkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbWlwczE2IHRlc3QuCisKKwkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gZGxpIHRlc3QgdW5jb25kaXRpb25hbGx5LgorCSogZ2FzL21pcHMvZGxpLnM6IEFkZCB0ZXh0IHN5bWJvbC4gIEFkZCBub3BzIHRvIHJvdW5kIHRvIDE2IGJ5dGUKKwlib3VuZGFyeS4KKwkqIGdhcy9taXBzL2RsaS5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1R1ZSBEZWMgMzEgMTM6MDM6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMvc3ludGguZDogVXNlIC0tcHJlZml4LWFkZHJlc3NlcyBmb3Igb2JqZHVtcC4KKwkqIGdhcy9zcGFyYy9zeW50aDY0LmQ6IExpa2V3aXNlLgorCitUdWUgRGVjIDI0IDE2OjMwOjU4IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBnYXMvbWlwcy8qLWlsb2Nrcy5kOiBGaXggcmVnZXhwcyB0byByZXNlbWJsZSBkaXNhc3NlbWJsZWQgb3V0cHV0LgorCitGcmkgRGVjIDEzIDEzOjA1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvKi5bc2RdOiBBZGQgZXhwbGljaXQgbm9wcywgc29tZXRpbWVzIGNvbnRyb2xsZWQgYnkKKwkuaWZkZWYsIHRvIGFjY29tb2RhdGUgY2hhbmdlIHRvIGF2b2lkIGRlZmF1bHQgYWxpZ25tZW50IG9uCisJZW1iZWRkZWQgc3lzdGVtcy4KKworV2VkIERlYyAxMSAwOToyNjowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMjAwL2Jhc2ljLmV4cCAoZG9fbW92Yik6IEZpeCBiaXQgcGF0dGVybiBmb3IKKwkibW92YiBkbSwoYW4pIi4KKworVHVlIERlYyAxMCAxMzowMTowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVXBkYXRlIGFmdGVyIGVuZGlhbm5lc3MgY2hhbmdlcyB0bworCXRoZSBhc3NlbWJsZXIuCisKKwkqIGdhcy9tbjEwMjAwL3ttb3YxLnMsbW92Mi5zLG1vdjMucyxtb3Y0LnMsbW92eC5zfTogTmV3IHRlc3RzLgorCSogZ2FzL21uMTAyMDAve21vdmIucywgbW92YnUuc306IExpa2V3aXNlLgorCSogZ2FzL21uMTAyMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KKworTW9uIERlYyAgOSAxNzowODozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMjAwLyouczogTmV3IHRlc3RzIGZvciB0aGUgbW4xMDIwMCBhc3NlbWJsZXIuCisJKiBnYXMvbW4xMDIwMC9iYXNpYy5leHA6IFJ1biB0aGVtLgorCitGcmkgRGVjICA2IDE1OjM1OjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21uMTAzMDAvKi5zOiBSZW1vdmUgJyQnIHJlZ2lzdGVyIHByZWZpeGluZy4KKworTW9uIE5vdiAyNSAxNjozNTozMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwOiBGaXggcGF0dGVybnMsIHlvdSBjYW4ndCBhc3N1bWUKKwlcciB3aWxsIGJlIHByZXNlbnQuCisKK01vbiBOb3YgMjUgMTM6NDU6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbTY4ay8qLmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCisJKiBnYXMvbXJpLyouZDogTGlrZXdpc2UuCisKK01vbiBOb3YgMjUgMTE6Mzg6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvbW4xMDMwMC8qLnM6IFVzZSAnJCcgYXMgcmVnaXN0ZXIgcHJlZml4IGZvcgorCWFsbCByZWdpc3RlciBvcGVyYW5kcy4KKworVGh1IE5vdiAyMSAxMTo1Mjo1NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9hbGwvZ2FzLmV4cDogeGZhaWwgYSBjb3VwbGUgdGVzdHMgZm9yIHRoZSBtbjEwMzAwLgorCitXZWQgTm92IDIwIDExOjMxOjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21uMTAzMDAvb3RoZXIuczogVXBkYXRlIGZvciBjb3JyZWN0IHN5bnRheCBvbiBhCisJZmV3IGluc3RydWN0aW9ucyAodGhvc2Ugd2l0aCByZWdpc3RlciBsaXN0cykuCisJKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworVHVlIE5vdiAxOSAxMzozNjo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMzAwL21vdm0uczogVXBkYXRlIGZvciBjb3JyZWN0IHN5bnRheC4KKwkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVXBkYXRlIGV4cGVjdGVkIG1vdm0gYml0IHBhdHRlcm5zLgorCitGcmkgTm92IDE1IDEzOjU3OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21uMTAzMDAvb3RoZXIuczogUHV0IHBhcmVucyBhcm91bmQgcmVnaXN0ZXIKKwlhcmd1bWVudCBpbiBjYWxscyBhbmQgam1wIGluc3RydWN0aW9ucy4KKworV2VkIE5vdiAxMyAxMzoxNjowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9oODMwMC9mZnh4MS5kOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KKworTW9uIE5vdiAxMSAxNjowMzoyNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUGFzcyAiLS1wcmVmaXgtYWRkcmVzc2VzIiB0byBvYmpkdW1wCisJYXMgbmVlZGVkLgorCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBMaWtld2lzZS4KKworVGh1IE5vdiAgNyAwMDoyNzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgb3Bjb2RlIGluc2VydGlvbiBmb3IKKwlleHRlbmRlZCBpbnN0cnVjdGlvbnMuCisJKiBnYXMvbW4xMDMwMC9leHRlbmQuczogVHdlYWsgY29uc3RhbnRzIGZvciBiZXR0ZXIKKwl0ZXN0c3VpdGUgY292ZXJhZ2UuCisKK1dlZCBOb3YgIDYgMTM6NTA6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIG9wZXJhbmRzCisJaW50byBjYWxsIGFuZCBqbXAgaW5zdHJ1Y3Rpb25zIHdpdGggMzJiaXQgb2Zmc2V0cy4KKwlGaXggdHlwbyBpbiBiaXQgdGVzdCBwYXR0ZXJucy4KKwkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFR3ZWFrIGNvbnN0YW50cyB0byBpbXByb3ZlCisJdGVzdHN1aXRlIGNvdmVyYWdlLgorCisJKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFRlc3QgaW5zZXJ0aW9uIG9mIDMyYml0IG9wZXJhbmQKKwlpbiBjYWxscywgYnRzdCwgYmNsciAmIGJzZXQgaW5zdHJ1Y3Rpb25zLgorCisJKiBnYXMvbW4xMDMwMC8qLnM6IFR3ZWFrIGNvbnN0YW50cyBpbiAzMmJpdCBpbnNucyBmb3IKKwliZXR0ZXIgdGVzdGluZyBjb3ZlcmFnZS4KKwkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVGVzdCBpbnNlcnRpb24gb2YgbW9zdCAzMmJpdAorCW9wZXJhbmRzLgorCitUdWUgTm92ICA1IDEzOjMzOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGluZGV4ZWQgbW92LAorCW1vdmJ1LCBtb3ZodSBpbnN0cnVjdGlvbnMuICBDaGVjayBiaXQgcGF0dGVybnMgZm9yIG1vcmUgYml0CisJb3BlcmF0aW9ucy4gIENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgdmFyaW91cyAxNmJpdCBjYWxsLCByZXRmCisJYW5kIHJldCBpbnN0cnVjdGlvbnMuCisJKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBVcGRhdGUgb3BlcmFuZHMgZm9yIGJldHRlciB0ZXN0IGNvdmVyYWdlLgorCitNb24gTm92ICA0IDEyOjU1OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGEgY291cGxlIG1vcmUKKwltb3YgYW5kIGNtcCBpbnN0cnVjdGlvbnMuCisKK1R1ZSBPY3QgMjkgMTc6MDU6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy8qLmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCisKK1dlZCBPY3QgMTYgMjI6Mzk6NTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvdjg1MC9yZWxvYy5zOiBOZXcgdGVzdHMuCisJKiBnYXMvdjg1MC9iYXNpYy5leHA6IFJ1biB0aGVtLgorCitNb24gT2N0IDE0IDEzOjUyOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHM6IEFkZCBzeW1ib2xzIHRvIHNldmVyYWwgdGVzdHN1aXRlcywgc2luY2UgdGhlIEVMRgorCWFzc2VtYmxlciBub3cgYWx3YXlzIGJ1aWxkcyBhIHN5bWJvbCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdAorCW9iamR1bXAgd2lsbCBubyBsb25nZXIgcmVwb3J0IGBObyBzeW1ib2xzIGluIEZJTEUnLiAgQ2hhbmdlIHRoZQorCWV4cGVjdGVkIG91dHB1dCBhY2NvcmRpbmdseS4KKworVGh1IE9jdCAxMCAxMzoxMTo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBpbnN0cnVjdGlvbnMKKwl3aXRoIGEgc2luZ2xlIDhiaXQgb3IgMTZiaXQgaW1tZWRpYXRlIG9wZXJhbmQuCisKKwkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBtYW55CisJaW5zdHJ1Y3Rpb25zLiAgQWRkIG1pc3NpbmcgdGVzdCBpbiBkb19tb3YxLgorCSogZ2FzL21uMTAzMDAvbW92MS5zOiBBZGQgbWlzc2luZyB0ZXN0LgorCitXZWQgT2N0ICA5IDE0OjE1OjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL21uMTAzMDAve2FkZC5zLCBiY2MucywgYml0LnMsIGNtcC5zLCBleHQuc306IE5ldyB0ZXN0cy4KKwkqIGdhcy9tbjEwMzAwL3tleHRlbmQucyBsb2dpY2FsLnMsIGxvb3AucywgbW92MS5zfTogTGlrZXdpc2UuCisJKiBnYXMvbW4xMDMwMC97bW92Mi5zLCBtb3YzLnMsIG1vdjQucywgbW92YnUuc306IExpa2V3aXNlLgorCSogZ2FzL21uMTAzMDAve21vdmh1LnMsIG1vdm0ucywgbXVsZGl2LnMsIG90aGVyLnN9OiBMaWtld2lzZS4KKwkqIGdhcy9tbjEwMzAwL3tzaGlmdC5zLCBzdWIuc306IExpa2V3aXNlLgorCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBSdW4gdGhlbS4KKworVGh1IE9jdCAgMyAwOTo1NzowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9tbjEwMjAwLCBnYXMvbW4xMDMwMDogTmV3IGRpcmVjdG9yaWVzIGZvciBNYXRzdXNoaXRhCisJbW4xMDIwMCBhbmQgbW4xMDMwMCB0ZXN0cy4KKworVHVlIE9jdCAgMSAxNTozODoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc192ZXJzaW9uKTogRml4IGZvciBjdXJyZW50IHZlcnNpb24KKwlwcmludGluZy4KKworU3VuIFNlcCAyOSAwNzo1NTo1OCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMvc3BsZXQuZDogRml4IHR5cG8gaW4gY3B1c2hhIHJlc3VsdC4KKworTW9uIFNlcCAyMyAxMjozMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tNjhrL2Ztb3ZlbWwucywgZ2FzL202OGsvZm1vdmVtbC5kOiBBZGQgdGVzdHMgZm9yIGZtb3ZlbXguCisKK1dlZCBTZXAgMTggMTI6MTQ6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvYWxsL2NvZmZ0YWcuczogVXNlIC5wMmFsaWduIHJhdGhlciB0aGFuIC5hbGlnbi4KKworRnJpIFNlcCAxMyAxNToyODowNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9oODMwMC9tYWNzLnM6IEFkZCAic3RtYWMiIGluc3RydWN0aW9ucy4KKwkqIGdhcy9oODMwMC9iYXNpYy5leHA6IFRlc3QgdGhlbS4KKworVGh1IFNlcCAxMiAxMDoyODo0NCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdhcy9hcm0vdGh1bWIucyAoYmFjayk6IENoZWNrIGFzc2VtYmx5IG9mIFRodW1iIEJMLgorCitNb24gU2VwICA5IDE0OjM3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvbWlwczQucywgZ2FzL21pcHMvbWlwczQuZDogVXNlICRmY2NOIGZvciBjb25kaXRpb24gY29kZQorCXJlZ2lzdGVycy4KKworRnJpIFNlcCAgNiAxODoyMzo1NCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdhcy9taXBzL2RsaS57cyxkfTogTW9yZSB0ZXN0IGNhc2VzIGFkZGVkLgorCitXZWQgU2VwICA0IDExOjQ3OjI5IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZCBjaGVjayBmb3IgZGxpIG1hY3JvIGluc3RydWN0aW9uLgorCSogZ2FzL21pcHMvZGxpLntzLGR9OiBBZGRlZC4KKworU2F0IEF1ZyAzMSAwMToyNTowMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWVtKTogQ2hlY2sgYml0IHBhdHRlcm5zIGZvciBzaG9ydAorCWxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLiAgUmVtb3ZlIHhmYWlscyBmb3Igc2hvcnQgbG9hZC9zdG9yZQorCWluc3RydWN0aW9ucy4KKwkqIGdhcy92ODUwL21lbS5zOiBPZmZzZXRzIGZvciBzaG9ydCBsb2FkL3N0b3JlIG9wZXJhbmRzCisJYXJlIHVuc2lnbmVkLgorCisJKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2JyYW5jaCk6IENoZWNrIG9mZnNldHMgaW4gYnJhbmNoIGluc25zLgorCShkb19qdW1wcyk6IExpa2V3aXNlLgorCQorRnJpIEF1ZyAzMCAwMDozNzo1NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy92ODUwL21pc2MuczogVHdlYWsgcmVnaXN0ZXIgbnVtYmVycyBmb3IgYmV0dGVyIHRlc3RpbmcuCisJKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21pc2MpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKKwkqIGdhcy92ODUwL2hpbG8uczogTmV3IHRlc3RmaWxlLgorCSogZ2FzL3Y4NTAvYmFzaWMuZXhwOiBSdW4gaGlsbyB0ZXN0cy4KKworVGh1IEF1ZyAyOSAxMTozMjoyMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdhcy9hcm0vYXJtN3QuZDogRXhwbGljaXRseSBmb3JjZSBsaXR0bGUtZW5kaWFuIGFzc2VtYmx5LgorCitGcmkgQXVnIDIzIDExOjAyOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19tb3ZlKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCisJKiBnYXMvdjg1MC9tb3ZlLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCisKKwkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWVtKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCisJeGZhaWwgc3N0IGFuZCBzbGQgdGVzdHMuCisJKGRvX21vdik6IFJlbW92ZSBib2d1cyB4ZmFpbC4KKwkqIGdhcy92ODUwL21lbS5zOiBzc3QgYW5kIHNsZCBpbnN0cnVjdGlvbnMgY2FuIG9ubHkgaW5kZXggZnJvbQorCSJlcCIgcmVnaXN0ZXIuCisKKwkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbG9naWNhbCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgorCVVwZGF0ZSBhZGRyZXNzZXMuCisJKiBnYXMvdjg1MC9sb2dpY2FsLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCisKKwkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fanVtcCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLAorCWJ1dCBub3QgZGlzcGxhY2VtZW50cyAoeWV0KS4KKworCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19jb21wYXJlKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCisKKwkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYnJhbmNoKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMsCisJYnV0IG5vdCBkaXNwbGFjZW1lbnRzICh5ZXQpLgorCQorCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19iaXQpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KKworCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19hcml0aCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgkKKwkqIGdhcy92ODUwL2FyaXRoLnM6IFR3ZWFrIGNvbnN0YW50cyBmb3IgYmV0dGVyIHRlc3RpbmcuCisKKwkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWlzYyk6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMKKwlhc3NlbWJsaW5nICJsZHNyIiBhbmQgInN0c3IiIG9wY29kZXMuCisJKiBnYXMvdjg1MC9taXNjLnM6IFJlLWVuYWJsZSBhc3NlbWJsaW5nIG9mICJsZHNyIiBhbmQgInN0c3IiCisJb3Bjb2Rlcy4KKworCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19taXNjKTogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcworCWFzc2VtYmxpbmcgInRyYXAiIG9wY29kZXMuCisJKiBnYXMvdjg1MC9taXNjLnM6IFJlLWVuYWJsZSBhc3NlbWJsaW5nIG9mICJ0cmFwIiBvcGNvZGVzLgorCisJKiBnYXMvdjg1MDogTmV3IGRpcmVjdG9yeSB3aXRoIHY4NTAgdGVzdHMuCisKK0ZyaSBBdWcgMTYgMDA6MTk6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvaHBwYS9iYXNpYy9wdXJnZS5zOiBVc2UgIiVzcjQiIG9uIHBpdGxiLCBwaXRsYmUKKwlmaWMgYW5kIGZpY2UgaW5zdHJ1Y3Rpb25zIHRvIHRlc3QgM2JpdCBzcGFjZSBpZGVudGlmaWVycy4KKwkqIGdhcy9ocHBhL2Jhc2ljL3N5c3RlbS5zOiBTaW1pbGFybHkgZm9yIGlpdGxiYSBhbmQKKwlpaXRsYnAuCisJKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworVGh1IEF1ZyAxNSAxNjoyNTowNSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdhcy9hcm0vYXJtLmV4cDogQ2hhbmdlIGluc3QucyB0ZXN0IHRvIGNoZWNrIG9iamR1bXAuCisJKiBnYXMvYXJtL2luc3QuZDogQWRkZWQuCisJCitUaHUgQXVnIDE1IDE2OjA2OjAyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogZ2FzL2FybS90aHVtYi5zOiBBZGRlZC4KKwkqIGdhcy9hcm0vaW1tZWQuczogQWRkZWQuCisJKiBnYXMvYXJtL2FyY2g0dC5zOiBBZGRlZC4KKwkqIGdhcy9hcm0vYXJtLmV4cDogVXBkYXRlZCB0byBydW4gdGhlIG5ldyB0ZXN0cy4KKworVHVlIEF1ZyAgNiAxMTowNjoyOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9oODMwMC9taXNjaC5zOiBSZWVuYWJsZSAiZWVwbW92LnciIHRlc3QuCisJKiBnYXMvaDgzMDAvbWlzY3MuczogTGlrZXdpc2UuCisJKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBDaGVjayBmb3IgY29ycmVjdCBhc3NlbWJseSBvZiAiZWVwbW92LnciCisJb24gdGhlIEg4LzMwMEggYW5kIEg4L1MuICBEb24ndCBleHBlY3QgaXQgdG8gZmFpbC4KKworV2VkIEp1bCAzMSAxMDo1Nzo0NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMvYXNpLnM6IFVwZGF0ZSBBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0xJVFRMRS4KKworV2VkIEp1bCAzMSAxNTo1NToxMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdhcy9hcm0vYXJtN3QuczogQWRkZWQuCisJKiBnYXMvYXJtL2FybTd0LmQ6IEFkZGVkLgorCSogZ2FzL2FybS9hcm0uZXhwOiBVcGRhdGVkIHRvIHJ1biB0aGUgbmV3IHRlc3QuCisKK01vbiBKdWwgIDggMTQ6Mjc6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbTY4ay9wY3JlbC5kOiBSZW5hbWUgZnJvbSBzY2h3YWIuZC4KKwkqIGdhcy9tNjhrL3BjcmVsLnM6IFJlbmFtZSBmcm9tIHNjaHdhYi5zLgorCitNb24gSnVsICA4IDE0OjIzOjI2IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBnYXMvbTY4ay9zY2h3YWIuZDogQ29ycmVjdCBmb3IgRUxGIGZvcm1hdC4KKwkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biAic2Nod2FiIiB0ZXN0IGZvciBhbGwgdGFyZ2V0cy4KKworVGh1IEp1bCAgNCAxNDoyMzozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlBdm9pZCBET1MgZmlsZSBuYW1pbmcgcHJvYmxlbXM6CisJKiBnYXMvaDgzMDAvYnJhbmNoLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzLnMuCisJKiBnYXMvaDgzMDAvYnJhbmNoaC5zOiBSZW5hbWUgZnJvbSBicmFuY2hlc2gucy4KKwkqIGdhcy9oODMwMC9icmFuY2hzLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzcy5zLgorCSogZ2FzL2g4MzAwL3JvdHNoLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0LnMuCisJKiBnYXMvaDgzMDAvcm90c2hoLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0aC5zLgorCSogZ2FzL2g4MzAwL3JvdHNocy5zOiBSZW5hbWUgZnJvbSByb3RzaGlmdHMucy4KKwkqIGdhcy9oODMwMC9oODMwMC5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworVGh1IEp1bCAgNCAxNDowMTo0NiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdhcy9taXBzL21pcHMuZXhwOiBBZGQgbmV3IHRlc3RzIGZvciBwcm9jZXNzb3JzIHdpdGggaW50ZXJsb2NrcworIAlvbiBkaXYgYW5kIG11bC4KKwkqIGdhcy9taXBzL2Rpdi1pbG9ja3MuZDogQWRkZWQuCisJKiBnYXMvbWlwcy9tdWwtaWxvY2tzLmQ6IEFkZGVkLgorCQorV2VkIEp1bCAgMyAxNDoyMDowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9hbGwvZ2FzLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlsIGZvciBoODMwMCotKi0qIGZvciB0d28gdGVzdHMKKwl3aGljaCBub3cgcGFzcy4KKwkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCByZWdleHAgb2YgbW92MzJidWcgdGVzdCB0byB3b3JrIG9uIGEgNjQKKwliaXQgaG9zdC4KKworU2F0IEp1biAyOSAxODoyMTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9hbGwvZ2FzLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciB2YXgqLSotdm1zKiBmb3IgOTMwNTA5YQorCXRlc3QuCisJKiBnYXMvdmF4L3F1YWQuZXhwOiBFeHBlY3QgYSBub3AgYWZ0ZXIgdGhlIG1vdnEuCisKK1R1ZSBKdW4gMTggMTI6Mzk6NDkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGdhcy9oODMwMC9jYnJhbmNoaC5zOiBTd2l0Y2ggaW50byBoODMwMGggbW9kZS4KKwkqIGdhcy9oODMwMC9oODMwMC5leHAgKEg4LzMwMEggbWlzYyB0ZXN0cyk6IEZpeCB0ZXN0IG5hbWVzLgorCisJKiBnYXMvaDgzMDAve2FkZHN1YnMucyxiaXRvcHMxcy5zLGJpdG9wczJzLnN9OiBOZXcgdGVzdHMgZm9yIHRoZQorCUg4L1MuCisJKiBnYXMvaDgzMDAve2JpdG9wczMucyxiaXRvcHM0LnMsY2JyYW5jaHMucyxsb2dpY2Fscy5zfTogTGlrZXdpc2UuCisJKiBnYXMvaDgzMDAve2JyYW5jaGVzcy5zLGNvbXBhcmVzLnMsbWFjcy5zLGRlY2ltYWxzLnN9OiBMaWtld2lzZS4KKwkqIGdhcy9oODMwMC97aW5jZGVjcy5zLGRpdm11bHMucyxtaXNjcy5zLG11bHRpcGxlcy5zfTogTGlrZXdpc2UuCisJKiBnYXMvaDgzMDAve21vdmJzLnMsbW92d3Mucyxtb3Zscy5zLHB1c2hwb3BzLnN9OiBMaWtld2lzZS4KKwkqIGdhcy9oODMwMC97cm90c2hpZnRzLnMsZXh0ZW5kcy5zfTogTGlrZXdpc2UuCisJKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gdGhlbS4KKworTW9uIEp1biAxMCAxNDoxNDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9hbGwvY29mZnRhZy5zLCBnYXMvYWxsL2NvZmZ0YWcuZDogTmV3IHRlc3QgZm9yIENPRkYgZW51bSB0YWcKKwl3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBnbG9iYWwgdmFyaWFibGUuCisJKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBjb2ZmdGFnIHRlc3QgZm9yIGFueSBDT0ZGIHRhcmdldC4KKworVGh1IEp1biAgNiAxMjozMDowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tNjhrL2FsbC5leHA6IFBhc3MgLW02ODAyMCB3aGVuIGFzc2VtYmxpbmcgdGhlIGRpc3BlcnIucworCXRlc3QuCisKK0ZyaSBNYXkgMzEgMTA6MTE6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBGaXggYWRkLmwgdGVzdCBmb3IgSDgvMzAwSC4KKworV2VkIE1heSAyOSAxNjozNTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL2phbC14Z290LmQ6IENvcnJlY3QgZm9yIDY0IGJpdCBvdXRwdXQuCisKK1RodSBBcHIgMjUgMTk6MzE6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogT25seSBydW4gc3BhcmNsZXQgdGVzdHMgaWYgc3BhcmNsZXQuCisKK1dlZCBBcHIgMjQgMTc6MDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IEFkZCBzdGF0ZW1lbnRzIG5vdyBjYXVnaHQgYnkgZ2FzLgorCitNb24gQXByIDIyIDE2OjQ1OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9zcGFyYy9zcGxldC5bZHNdOiBOZXcgdGVzdHMgZm9yIHNwYXJjbGV0IGV4dGVuc2lvbnMuCisJKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KKworTW9uIEFwciAxNSAxNzoyNToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL2xhLmQ6IFVwZGF0ZWQgZm9yIEFwcmlsIDUgTUlQUyBhc3NlbWJsZXIgY2hhbmdlcy4KKwkqIGdhcy9taXBzL2xiLmQsIGdhcy9taXBzL2xkLmQsIGdhcy9taXBzL3NiLmQ6IExpa2V3aXNlLgorCSogZ2FzL21pcHMvdWxkLmQsIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZDogTGlrZXdpc2UuCisJKiBnYXMvbWlwcy91c2QuZCwgZ2FzL21pcHMvdXNoLmQsIGdhcy9taXBzL3Vzdy5kOiBMaWtld2lzZS4KKworV2VkIEFwciAxMCAxNDoyNzo1MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9oODMwMC9tb3YzMmJ1Zy5zOiBOZXcgdGVzdC4KKwkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biBpdC4KKworRnJpIEFwciAgNSAxMDoxMzoyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9oODMwMC97YWRkc3ViaC5zLGJpdG9wczFoLnMsYml0b3BzMmguc306IE5ldyBoODMwMGggdGVzdHMuCisJKiBnYXMvaDgzMDAve2JpdG9wczNoLnMsYml0b3BzNGgucyxicmFuY2hlc2guc306IE5ldyBoODMwMGggdGVzdHMuCisJKiBnYXMvaDgzMDAve2NicmFuY2hoLnMsY29tcGFyZWgucyxkZWNpbWFsaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KKwkqIGdhcy9oODMwMC97ZGl2bXVsaC5zLGluY2RlY2gucyxsb2dpY2FsaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KKwkqIGdhcy9oODMwMC97bWlzY2gucyxtb3ZiaC5zLG1vdndoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgorCSogZ2FzL2g4MzAwL3twdXNocG9waC5zLHJvdHNoaWZ0aC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KKwkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biB0aGVtLgorCisJKiBnYXMvaDgzMDAve21vdmIucyxtb3Z3LnN9OiBDb3JyZWN0IHByZWRlY3JlbWVudCBzeW50YXguCisKKwkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCB0eXBvcyBpbiBiaXRvcHM0IGFuZCBtb3ZiIHRlc3RzLgorCisJKiBnYXMvaDgzMDAve2FkZHN1Yi5zLGJpdG9wczEucyxiaXRvcHMyLnN9OiBOZXcgaDgzMDAgdGVzdHMuCisJKiBnYXMvaDgzMDAve2JpdG9wczMucyxiaXRvcHM0LnMsYnJhbmNoZXMuc306IE5ldyBoODMwMCB0ZXN0cy4KKwkqIGdhcy9oODMwMC97Y2JyYW5jaC5zLGNvbXBhcmUucyxkZWNpbWFsLnN9OiBOZXcgaDgzMDAgdGVzdHMuCisJKiBnYXMvaDgzMDAve2Rpdm11bC5zLGluY2RlYy5zLGxvZ2ljYWwuc306IE5ldyBoODMwMCB0ZXN0cy4KKwkqIGdhcy9oODMwMC97bWlzYy5zLG1vdmIucyxtb3Z3LnN9OiBOZXcgaDgzMDAgdGVzdHMuCisJKiBnYXMvaDgzMDAve3B1c2hwb3Aucyxyb3RzaGlmdC5zfTogTmV3IGg4MzAwIHRlc3RzLgorCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIHRoZW0uCisKK0ZyaSBNYXIgMTUgMTc6MTY6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMvc3ludGguZDogRG9uJ3QgcmVxdWlyZSBzcGFyYyBpbiB0aGUgZmlsZSBmb3JtYXQsIHNpbmNlCisJaXQgd29uJ3QgYmUgdGhlcmUgb24gU3VuT1MuCisKK1RodSBNYXIgIDcgMTQ6NTE6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdhcy9zcGFyYy9zeW50aC5bZHNdOiBOZXcgdGVzdGNhc2UuCisJKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gaXQuCisKK0ZyaSBNYXIgIDEgMTI6MDE6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvYWxsL2dhcy5leHA6IHhmYWlsIGRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzCisJYW5kIGRpZmZlcmVuY2Ugb2YgZm9yd2FyZCByZWZlcmVuY2VzIGZvciB0aGUgaDgzMDAuCisKK1RodSBGZWIgMjIgMTY6NDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9sYi14Z290LmQ6IENvcnJlY3QuCisKK01vbiBGZWIgMTkgMDI6NDM6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdhcy9zcGFyYy97YXNpLG1lbWJhcixwcmVmZXRjaCxyZHByLHN5bnRoNjQsd3Jwcn0uZDogUGFzcyAtQXY5CisJdG8gZ2FzLgorCSogZ2FzL3NwYXJjL2FkZGVuZC5leHA6IEV4ZWN1dGUgZm9yIGFueSBzcGFyYyBjcHUuCisJKiBnYXMvc3BhcmMve21pc21hdGNoLmV4cCxtaXNtLTEuc306IE5ldyB0ZXN0LgorCitXZWQgRmViIDE0IDEzOjQ5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvamFsLXhnb3QuZCwgZ2FzL21pcHMvbGEteGdvdC5kOiBOZXcgdGVzdHMuCisJKiBnYXMvbWlwcy9sYi14Z290LmQsIGdhcy9taXBzL2xkLXhnb3QuZDogTmV3IHRlc3RzLgorCSogZ2FzL21pcHMvbGlmLXhnb3QuZCwgZ2FzL21pcHMvdWxoLXhnb3QuZDogTmV3IHRlc3RzLgorCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBuZXcgdGVzdHMgaWYgc3ZyNHBpYy4KKworU2F0IEphbiAyNyAxMzoyNzo0NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dhcy1kZy5leHAgKGdhcy1kZy10ZXN0KTogRGVsZXRlIGRlZmF1bHRfZmxhZ3MgYW5kIGxpYnMgYXJncy4KKworRnJpIEphbiAyNiAxNDoyNDowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogVXBkYXRlIGZvciBvYmpkdW1wIGNoYW5nZXMuCisKK1dlZCBKYW4gMTAgMTI6NDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy8qLmQ6IFVwZGF0ZSBmb3IgY2hhbmdlcyB0byBkaXNhc3NlbWJsZXIuCisKK1dlZCBKYW4gIDMgMjI6NTk6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy91bGgtc3ZyNHBpYy5kOiBVcGRhdGUgZm9yIHRjLW1pcHMuYyBsb2FkX2FkZHJlc3MKKyAJY2hhbmdlLgorCitGcmkgTm92IDE3IDEwOjMyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS9pbW1jb25zdC5kOiBOZXcgdGVzdC4KKwkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgorCSogZ2FzL21yaS9jb25zdGFudHMuczogVGVzdCBpbW1lZGlhdGUgY29uc3RhbnRzLgorCSogZ2FzL21yaS9jb25zdGFudHMuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCisKKwkqIGdhcy9tNjhrL2xpbmsuczogQWRkIG5vcCB0byBwYWQgdG8gZWlnaHQgYnl0ZSBib3VuZGFyeS4KKwkqIGdhcy9tNjhrL2xpbmsuZDogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCisKK1N1biBOb3YgMTIgMjE6Mjg6MTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgorCitTdW4gTm92ICA1IDEyOjQ5OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvYmVxLnM6IERlY2xhcmUgdGV4dF9sYWJlbCBnbG9iYWwuCisJKiBnYXMvbWlwcy9qYWwuczogTGlrZXdpc2UuCisKK0ZyaSBOb3YgIDMgMTI6MzU6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbTY4ay9saW5rLnM6IFVzZSAiJiIgaW5zdGVhZCBvZiAiIyIgZm9yIGltbWVkaWF0ZSB2YWx1ZXMuCisKKwkqIGdhcy9tNjhrL2Ztb3ZlbWwucywgZ2FzL202OGsvZm1vdmVtbC5kOiBOZXcgdGVzdC4KKwkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KKworVGh1IE5vdiAgMiAyMzoxMTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tNjhrL2xpbmsucywgZ2FzL202OGsvbGluay5kOiBOZXcgdGVzdC4KKwkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KKworVHVlIE9jdCAyNCAxMDo1NzoyMCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCBsY2kgYW5kIHN5bmNkbWEgaW5zdHJ1Y3Rpb25zLgorCSogZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworRnJpIE9jdCAgNiAxNzoxMzozNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogZ2FzL202OGsvb3BlcmFuZHMuZDogRG9uJ3QgcmVxdWlyZSBhIGZpeGVkIG51bWJlciBvZiBsZWFkaW5nCisJemVyb3MgaW4gYW55IG51bWJlci4KKworCSogZ2FzL202OGsvb3BlcmFuZHMucywgZ2FzL202OGsvYml0ZmllbGQuczogVXNlICImIiBpbnN0ZWFkIG9mICIjIgorCWZvciBpbW1lZGlhdGUgdmFsdWVzLgorCitGcmkgT2N0ICA2IDEwOjU0OjEzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9hcm0vYXJtLmV4cDogUmVuYW1lZCBmcm9tIGdhcy5leHAuCisJKiBnYXMvYXJtL2xlLWZwY29uc3QuW3NkXTogTmV3IHRlc3RjYXNlLgorCitGcmkgU2VwIDI5IDE1OjEyOjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS9tcmkuZXhwOiBPbmx5IHJ1biB0ZXN0cyBmb3IgbTY4ayB0YXJnZXQuCisKK01vbiBTZXAgMjUgMTI6MzE6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYXJtKi0qLSogZm9yIGNvbnN0YW50cworCXRlc3QuCisKK1RodSBTZXAgMjEgMDE6MjY6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9zaC9mcC5zIChmbWFjKTogVXBkYXRlIGZvciBuZXcgYXNzZW1ibHkgc3ludGF4LgorCitNb24gU2VwIDE4IDE0OjA0OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX3J1bik6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQuCisJKHJ1bl9kdW1wX3Rlc3QsIG9iamR1bXApOiBMaWtld2lzZS4KKworVGh1IFNlcCAxNCAxMzoxMDoxMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMve3dyZHIuW2RzXSxyZHByLltkc119OiBOZXcgdGVzdHMuCisJKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KKworV2VkIFNlcCAxMyAxNjozNTo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFJlbW92ZTsgdGhlIHRlc3RzdWl0ZSBpcyBub3cgcnVuCisJZGlyZWN0bHkgZnJvbSB0aGUgZ2FzIE1ha2VmaWxlLgorCitNb24gU2VwIDExIDExOjQ0OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS9lbXB0eS5zOiBOZXcgZmlsZS4KKwkqIGdhcy9tcmkvbXJpLmV4cDogVGVzdCBhc3NlbWJsaW5nIGVtcHR5LnMuCisJKiBnYXMvbXJpL2NvbW1lbnQuczogQWRkIGEgY291cGxlIG1vcmUgY29tbWVudCB2YXJpYW50cy4KKworCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgeGZhaWwgZm9yIHRoZSBleHByIHRlc3QgZm9yIGFsbCBocHBhCisJdGFyZ2V0cy4KKworV2VkIFNlcCAgNiAyMTozOToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tcmkvY29tbWVudC5zLCBnYXMvbXJpL2NvbW1lbnQuZDogTmV3IHRlc3QuCisJKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KKwkqIGdhcy9tcmkvZXhwci5zOiBSZW1vdmUgd2hpdGVzcGFjZSBpbiBvcGVyYW5kIGZpZWxkLgorCSogZ2FzL21yaS9mb3IuczogQWRkIGNvbW1lbnRzIGZvciBmdXJ0aGVyIHRlc3RpbmcuCisJKiBnYXMvbWFjcm9zL3Rlc3QyLnM6IFB1dCBpbiBhbiB1cHBlciBjYXNlIEVMU0UgdG8gdGVzdCBjYXNlCisJaW5zZW5zaXRpdml0eS4KKworV2VkIEF1ZyAzMCAxNjoxMjowMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnYXMvc3BhcmMve3ByZWZldGNoLltkc10sc3ludGg2NC5bZHNdfTogTmV3IHRlc3RzLgorCitUdWUgQXVnIDI5IDE4OjU5OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IE5ldyBmaWxlLgorCSogZ2FzL3NwYXJjL3thc2kuW2RzXSxtZW1iYXIuW2RzXX06IE5ldyB0ZXN0cy4KKworTW9uIEF1ZyAyMSAxNDozOToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tYWNyb3MvKjogTmV3IHRlc3RzIGZvciBtYWNyb3MuCisKKwkqIGdhcy9tcmkvY29tbW9uLnM6IFVzZSBkYXRhLCBub3QgLmRhdGEuCisKKwkqIGdhc3AvcGwzLm91dDogVXBkYXRlIGZvciBjaGFuZ2VzIGluIGNvbW1lbnRlZCBzb3VyY2Ugb3V0cHV0IHdoZW4KKwlMT0NBTCBpcyB1c2VkLgorCitTYXQgQXVnIDE5IDE3OjM2OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzcC9nYXNwLmV4cCAoZ2FzcF90ZXN0KTogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiB0aGUgb3V0cHV0CisJb2YgZGlmZi4KKwkqIGxpYi9nYXMtZGVmcy5leHA6IERlZmluZSBwcnVuZV9zeXN0ZW1fY3J1ZCBpZiBpdCBpcyBub3QgYWxyZWFkeQorCWRlZmluZWQuCisKK0ZyaSBBdWcgMTggMTE6MDk6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXNwL21yaS8qLm91dDogVXNlIDssIG5vdCAhLCBmb3IgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgorCitXZWQgQXVnIDE2IDEyOjI0OjEyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS9tcmkuZXhwOiBDaGFuZ2UgaHBwYSotKi0qIGV4cGVjdGVkIGZhaWx1cmVzIHRvIG9ubHkKKwlleHBlY3QgZmFpbHVyZSBmb3IgdGFyZ2V0cyB3aGljaCB1c2UgU09NLgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogSWYgdGhlIHByb2dyYW0gdG8gcnVuIGRvZXMgbm90CisgICAgICAgIGV4aXN0LCBtYXJrIHRoZSB0ZXN0IGFzIHVudGVzdGVkLgorCisJKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaTk2MCBiLm91dCB0YXJnZXRzIGZvcgorCWNvbW1vbiB0ZXN0LgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogTmFtZSB0aGUgb3V0cHV0IGZpbGUgZHVtcC5vLAorCXJhdGhlciB0aGFuIHVzaW5nIGFuIGltcGxpY2l0IGEub3V0LgorCisJKiBnYXMvbXJpL2Zvci5zOiBBZGQgbm9wIHRvIHJvdW5kIG91dCB0byBmb3VyIGJ5dGUgYm91bmRhcnkuCisJKiBnYXMvbXJpL3JlcGVhdC5zOiBMaWtld2lzZS4KKwkqIGdhcy9tcmkvd2hpbGUuczogTGlrZXdpc2UuCisJKiBnYXMvbXJpL2Zvci5kOiBFeHBlY3RlZCBhZGRlZCBub3AuCisJKiBnYXMvbXJpL3JlcGVhdC5kOiBMaWtld2lzZS4KKwkqIGdhcy9tcmkvd2hpbGUuZDogTGlrZXdpc2UuCisKKwkqIGdhcy9taXBzLyouZDogQ2hhbmdlIGFsbCB0ZXN0IG5hbWVzIHRvIHNheSBNSVBTLgorCitUdWUgQXVnIDE1IDE1OjQyOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS9mb3IuZCwgZ2FzL21yaS9mb3IuczogTmV3IHRlc3QuCisJKiBnYXMvbXJpL2lmLmQsIGdhcy9tcmkvaWYuczogTmV3IHRlc3QuCisJKiBnYXMvbXJpL3JlcGVhdC5kLCBnYXMvbXJpL3JlcGVhdC5zOiBOZXcgdGVzdC4KKwkqIGdhcy9tcmkvd2hpbGUuZCwgZ2FzL21yaS93aGlsZS5zOiBOZXcgdGVzdC4KKwkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIHRoZSBuZXcgdGVzdHMuCisKK01vbiBBdWcgMTQgMTY6MDM6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbXJpL2V4cHIuZDogUGVybWl0IGxlYWRpbmcgemVyb2VzLCBpbiBjYXNlIHdlJ3JlIHVzaW5nIGEKKyAgICAgICAgNjQtYml0IEJGRC4KKworCSogZ2FzcC9tcmkvKjogTmV3IHRlc3RzLgorCSogZ2FzcC9nYXNwLmV4cDogUnVuIHRoZW0uICBBbHNvLCBjbGVhbiB1cCB0aGUgdGVzdCBuYW1lcyB1c2VkIGluCisJcGFzcyBhbmQgZmFpbC4KKworU3VuIEF1ZyAxMyAwMDozOToyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL3NoL2Jhc2ljLmV4cDogVXBkYXRlIG5vdyB0aGF0IHdlIGtub3cgdGhlIHJpZ2h0CisJYml0IHBhdHRlcnMgZm9yIHRoZSBuZXcgc3RzIGluc3RydWN0aW9ucy4KKworVGh1IEF1ZyAxMCAwMDo0NjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tcmkvY2hhci5kOiBGaXggZm9yIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCisJKiBnYXMvbXJpL2Zsb2F0LmQ6IExpa2V3aXNlLgorCitXZWQgQXVnICA5IDE1OjM0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL2FsbC9zdHJ1Y3QucywgZ2FzL2FsbC9zdHJ1Y3QuZDogTmV3IHRlc3QuCisJKiBnYXMvYWxsL2dhcy5leHA6IFJ1biBpdC4KKworVHVlIEF1ZyAgOCAxNzoxMTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdhcy9tcmkvY29tbW9uLnMsIGdhcy9tcmkvY29tbW9uLmQ6IE5ldyB0ZXN0LgorCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCisKK01vbiBBdWcgIDcgMjI6Mzk6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbXJpL21yaS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgYTI5ayotKi0qIGZvciBjb25zdGFudHMKKwl0ZXN0LgorCisJKiBnYXNwL2NyYXNoMS5vdXQsIGdhc3AvbWFjcm8ub3V0LCBnYXNwL3NmdW5jLm91dDogQ29tcGxldGUKKwl0cnVuY2F0ZWQgZmlsZXMsIHNvIHRoYXQgdGhlIHRlc3RzIHBhc3MuCisKKwkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBocHBhKi0qLSogZm9yIGVxdSwKKwljb25zdGFudHMsIGFuZCBleHByLgorCisJKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gc2Nod2FiIHRlc3Qgb24gaHB1eCosIG5vdCBqdXN0IGhwdXguICBSdW4KKwlvbiB2eHdvcmtzKiwgbm90IGp1c3Qgdnh3b3JrczUuMS4KKworCSogbGliL2dhcy1kZWZzLmV4cCAoZmFpbF9waGFzZSwgcGFzc19waGFzZSk6IFJlbW92ZS4KKwkocnVuX2R1bXBfdGVzdCk6IEp1c3QgY2FsbCBwYXNzIG9yIGZhaWwuCisKKwkqIGdhcy9tNjhrL29wZXJhbmRzLnMsIGdhcy9tNjhrL29wZXJhbmRzLmQ6IE5ldyB0ZXN0LgorCSogZ2FzL202OGsvb3A2ODAwMC5kOiBOZXcgdGVzdC4KKwkqIGdhcy9tNjhrL2Nhcy5zLCBnYXMvbTY4ay9jYXMuZDogTmV3IHRlc3QuCisJKiBnYXMvbTY4ay9iaXRmaWVsZC5zLCBnYXMvbTY4ay9iaXRmaWVsZC5kOiBOZXcgdGVzdC4KKwkqIGdhcy9tNjhrL3NjaHdhYi5kOiBSdW4gb2JqZHVtcCB3aXRoIC1qIC50ZXh0LiAgQWRqdXN0IGZvcgorCWNoYW5nZXMgdG8gZGlzYXNzZW1ibGVyLgorCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIG5ldyB0ZXN0cy4gIFJ1biBzY2h3YWIgdGVzdCBmb3IKKwltNjhrLSotY29mZiouCisKK01vbiBBdWcgIDcgMDM6MDE6MzIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9zaC8qOiBOZXcgdGVzdHMgZm9yIHRoZSBoaXRhY2hpLXNoLgorCitUdWUgQXVnICAxIDE4OjAyOjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2FzL21yaS8qOiBOZXcgdGVzdHMgZm9yIE1SSSBtb2RlLgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogU3VwcG9ydCB1c2luZyBvYmpjb3B5LiAgRHVtcAorCXByb2dyYW0gZXhlY3V0aW9ucyB0byB0aGUgbG9nIGZpbGUgYmVmb3JlIHJ1bm5pbmcgdGhlbS4gIFVzZSB0aGUKKwlzaW1wbGUgcHJvZ3JhbSBuYW1lLCByYXRoZXIgdGhhbiB0aGUgcGF0aCB0byB0aGUgYmluYXJ5IGJlaW5nIHJ1biwKKwlpbiBwYXNzL2ZhaWwgbWVzc2FnZXMuCisJKHJlZ2V4cF9kaWZmKTogSWYgdGhlIHJlZ2V4cCBmaWxlIGhhcyB0aGUgc3BlY2lhbCBjb21tZW50ICNwYXNzLAorCXN0b3AgY2hlY2tpbmcgYXQgdGhhdCBwb2ludC4KKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogU2V0IE5NLCBOTUZMQUdTLCBPQkpDT1BZLCBhbmQgT0JKQ09QWUZMQUdTLAorCWlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHNldC4KKworVHVlIEF1ZyAgMSAxMTo0MTozMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHN1cGVyZmx1b3VzIHJ1bnRlc3QgZ2FzcC4KKworTW9uIEp1bCAzMSAxODoxOToyNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisgCSogZ2FzcC8qOiBOZXcuCisJKiBNYWtlZmlsZS5pbjogVXNlIGdhc3AgdGVzdHMuCisJKiBjb25maWcvZGVmYXVsdC5leHA6IEFkZCBnYXNwIHN0dWZmLgorCitUaHUgSnVsIDIwIDE4OjU2OjQ4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvYWxsL2dhcy5leHA6IERpc2FibGUgdGVzdHMgdGhhdCBhcmUgbm90IGFwcHJvcHJpYXRlIGZvcgorCXRoZSBQQS4KKworVGh1IEp1bCAxMyAxODoyMjo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIHNjaHdhYiB0ZXN0IGZvciBtNjhrIHZ4d29ya3M1LjEuCisKK1dlZCBKdW4gMjEgMjE6Mjg6NTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZ2FzL202OGsvc2Nod2FiLio6IE5ldyB0ZXN0IGJhc2VkIG9uIGEgdGVzdCBjYXNlIGZyb20gQW5kcmVhcworCVNjaHdhYi4KKwkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdCBmb3Igc29tZSBhb3V0IGNvbmZpZ3VyYXRpb25zLgorCitNb24gSnVuIDEyIDIyOjI3OjE4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvcGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCisKK1N1biBNYXkgMjEgMjA6MjY6MTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogRGlzYWJsZSBhbGlnbjQgdGVzdHMgZm9yCisJRUxGIHRhcmdldHMuCisKK1dlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCQorCisJKiBhcm0vYXJtN2RtLnM6IE5ldyBmaWxlIC0tIHRlc3RzIGZvciBBUk03RE0gaW5zdHJ1Y3Rpb25zLgorCSogYXJtL2FybTYuczogQ29ycmVjdCBib2d1cyB0ZXN0cy4KKwkqIGFybS9nYXMuZXhwIChhcm02LnMpOiBJcyBub3cgYSB2YWxpZCB0ZXN0LgorCShhcm03ZG0ucyk6IE5ldyB0ZXN0LgorCSogYXJtL2Zsb2F0LnM6IEFkZCBsb2FkL3N0b3JlIG11bHRpcGxlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIAorCXRlc3RzLgorCitXZWQgTWF5ICAzIDEzOjE0OjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgorCitUdWUgTWF5ICAyIDE2OjM3OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL2xkLmQ6IE1vZGlmaWVkIGZvciBnYXMgZGVsYXktc2xvdCBmaXhlcy4KKworU2F0IEFwciAyOSAyMzozNToxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGxpYi9nYXMtZGcuZXhwOiBOZXcgZmlsZS4KKworVHVlIEFwciAxMSAxMzo1Nzo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9taXBzNC5kOiBBbGxvdyBtb3JlIHRoYW4gZXhhY3RseSA4IHplcm9zIGluIGJjMSoKKwl0YXJnZXRzLgorCitNb24gQXByIDEwIDE1OjM2OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKHBhc3NfcGhhc2UpOiBOZXcgcHJvYy4KKwkocnVuX2R1bXBfdGVzdCk6IE5vdGUgcGFzc2luZyBvciBmYWlsaW5nIG9mIGVhY2ggcGhhc2Ugb2YgdGhpcworCXRlc3QsIGluc3RlYWQgb2YgZmFpbHVyZSBvZiBwaGFzZXMgb3IgcGFzc2luZyBvZiBjb21wbGV0ZSB0ZXN0LgorCUVuc3VyZSB0ZXN0IGZpbGUgbmFtZSBpcyBpbiByZXBvcnRlZCBtZXNzYWdlLgorCitTYXQgQXByICA4IDEyOjQ2OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IEhhbmRsZSBhcmd1bWVudHMgd2l0aCBwYXRocy4KKwlBbHdheXMgcmVzb2x2ZSB0ZXN0Y2FzZSBzdGF0dXMgYmVmb3JlIHJldHVybmluZy4KKwlJZiBgc2x1cnBfb3B0aW9ucycgZmFpbHMsIHJldHVybiBhbmQgZG9uJ3QgZG8gdGVzdC4KKwkoc2x1cnBfb3B0aW9ucyk6IEZpeCAiY2FuJ3Qgb3BlbiIgZXJyb3IgbWVzc2FnZS4KKwlSZXR1cm4gLTEgdG8gaW5kaWNhdGUgZXJyb3IuCisKK01vbiBNYXIgMjAgMjI6NDU6MzAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgorCitGcmkgTWFyIDEwIDE5OjA3OjA5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGdhcy9oODMwMC9mZnh4MS5zOiBBZGQgLndvcmQgMCBhdCB0aGUgZW5kIHRvIGVsaW1pbmF0ZQorCXVuY2VydGFpbnR5IGFzIHRvIHdoZXRoZXIgdGhlcmUgc2hvdWxkIGJlIHRyYWlsaW5nIGJ5dGVzIGluIHRoZQorCW91dHB1dCBmaWxlLgorCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IEFkanVzdCByZWxvYyB2YWx1ZXMgdG8gcGVybWl0IGFuIGFkZGVuZCB2YWx1ZQorCW9mIDB4MDAwMDAwMDBmZmZmZmZmZiBvbiA2NC1iaXQgaG9zdHMuICAoSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMKKwljb3JyZWN0LikgIEVuZCB3aXRoICIuLi4iIHRvIG1hdGNoIHRyYWlsaW5nIHplcm8gYnl0ZXMuCisKK1dlZCBNYXIgIDggMTU6NTA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9taXBzNC5kLCBnYXMvbWlwcy9taXBzNC5zOiBOZXcgZmlsZXMuCisJKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0LgorCitUaHUgRmViIDIzIDE3OjU4OjUwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogQWRkIGluZGV4aW5nIHZhcmlhbnRzLgorCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBUZXN0IHRoZW0uCisKK1dlZCBGZWIgMTUgMTU6NDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy91bGQuZDogTmV3IGZpbGUuCisJKiBnYXMvbWlwcy91bGQuczogTmV3IGZpbGUuCisJKiBnYXMvbWlwcy91c2QuZDogTmV3IGZpbGUuCisJKiBnYXMvbWlwcy91c2QuczogTmV3IGZpbGUuCisJKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0cy4KKworVGh1IEZlYiAgOSAxMDo1NzozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX2FwcGx5YnVnX3Rlc3QpOiBSdW4gaXQuCisKK1RodSBGZWIgIDIgMDA6MzQ6NTUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKyAgICAgICAgKiBnYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fcGljX3JlbG9jYXRpb25fdGVzdCk6IFJ1biBpdC4KKworRnJpIEphbiAyNyAxNDowMjowMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBnYXMvaDgzMDAvZmZ4eDEuZCwgZ2FzL2g4MzAwL2ZmeHgxLnMsIGdhcy9oODMwMC9jbXBzaTIucywKKwlnYXMvaDgzMDAvaDgzMDAuZXhwOiBOZXcgdGVzdHMuCisKK01vbiBKYW4gMjMgMjE6NDQ6MjYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9fc3lzdGVtKTogVXBkYXRlLgorCitXZWQgSmFuIDExIDE3OjIwOjI1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL21pcHMuZXhwOiBEb24ndCBydW4gdGhlIG1lbW9yeS1hY2Nlc3MgdGVzdHMgaWYgdGhlCisJZm9ybWF0IGlzIGEub3V0LCBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0CisJaXMgdXNlZCB3aXRoIG90aGVyIGZvcm1hdHMuCisKK1R1ZSBKYW4gMTAgMTE6NDI6MTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoYWxpZ240LnMpOiBGaXggZ2xpdGNoIGluCisJcmVnZXhwIHRvIGF2b2lkIGxvc2luZyB3aXRob3V0IGEgY29udHJvbGxpbmcgdHR5LgorCitGcmkgRGVjIDMwIDE4OjA4OjIwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGdhcy9pMzg2L3B1c2h3Lmw6IEZpeGVkIHdoaXRlc3BhY2UgdG8gbWF0Y2ggY3VycmVudCBsaXN0aW5nCisJc3R5bGUuCisKKwkqIGdhcy9hbGwvZ2FzLmV4cDogTWFyayB0ZXN0IHAxNDgwLnMgZXhwZWN0ZWQgdG8gcGFzcywgZXZlbiB3aXRoCisJbGlzdGluZ3MgZW5hYmxlZC4KKworVGh1IERlYyAxNSAxODoxNDoyNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQVNfRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VUKTogRG9uJ3Qgc2V0LgorCSh1bmluc3RhbGwpOiBEb24ndCBzZXQgT0JKRFVNUCBhbmQgT0JKRFVNUEZMQUdTIGluIHNpdGUuZXhwLgorCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZhdWx0IE9CSkRVTVAgYW5kIE9CSkRVTVBGTEFHUy4gIFVzZQorCWZpbmRmaWxlIGFuZCB0cmFuc2Zvcm0gcHJvY2VkdXJlcyB0byBkZXRlcm1pbmUgb2JqZHVtcCBwcm9ncmFtCisJbmFtZS4KKworCSogZ2FzL21pcHMvYWJzLnMsIGdhcy9taXBzL2Rpdi5zOiBGb3JjZSBzb21lIHBhZGRpbmcgYXQgdGhlIGVuZCwKKwlpbiBjYXNlIHRoZSBmb3JtYXQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IHJlcXVpcmUgaXQuCisJKiBnYXMvbWlwcy9iZXEuZCwgZ2FzL21pcHMvamFsLmQ6IEhhbmRsZSBNSVBTX0pNUCBhcyBhbiBhbHRlcm5hdGUKKwluYW1lIGZvciB0aGUgcmVsb2MgdHlwZS4KKworCSogbGliL2dhcy1kZWZzLmV4cCAoZmlsZV9jb250ZW50cywgdmVyYm9zZV9ldmFsKTogTmV3IHByb2NzLgorCShydW5fZHVtcF90ZXN0KTogSWYgdmVyYm9zaXR5IGxldmVsIGlzIG92ZXIgMywgcHJpbnQgb3V0IGR1bXAKKwljb21tYW5kIGFuZCBpdHMgb3V0cHV0LgorCitUdWUgRGVjIDEzIDE4OjIxOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvamFsLXN2cjRwaWMuZDogRml4IDAtc3RyaW5ncyB0byB3b3JrIHdpdGggNjQtYml0IGhvc3RlZAorCWRpc2Fzc2VtYmx5LgorCitGcmkgRGVjICA5IDE5OjU0OjA0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGdhcy9hbGwvZ2FzLmV4cCAoY29tbWVudC5zIHRlc3QpOiBNYWtlIHRoZSAiXHIiIG9wdGlvbmFsLCBzaW5jZQorCWl0IGRlcGVuZHMgb24gdHR5IG1vZGVzLgorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfc3RhcnQpOiBUcnkgdXNpbmcgLW5vdHR5Y29weSBpbnN0ZWFkIG9mCisJLW5vdHR5aW5pdC4KKworCSogZ2FzL2FybS9nYXMuZXhwOiBUaGUgYXJtNiB0ZXN0IHNob3VsZCByZXBvcnQgZXJyb3JzLCBmb3Igbm93LgorCitUaHUgRGVjICA4IDIwOjE5OjA5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGxpYi9nYXMtZGVmcy5leHA6IFVzZSAtaSBpbiBleHBlY3RfYWZ0ZXIgY29tbWFuZC4KKworV2VkIERlYyAgNyAxNjo0OToxNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBnYXMvbWlwcy9tdWwuZCxqYWwuZDogRml4IDAtc3RyaW5ncyB0byB3b3JrIHdpdGggNjQtYml0IGhvc3RlZAorCWRpc2Fzc2VtYmx5LgorCisJKiBnYXMvaWVlZS1mcDogUmVuYW1lZCBmcm9tIGllZWUuZnAuCisKKwkqIGxpYi9nYXMtZGVmcy5leHA6IE1ha2Ugc3VyZSB0aW1lb3V0IGlzIGF0IGxlYXN0IDIgbWludXRlcy4KKworV2VkIE5vdiAzMCAxMDo0ODowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcGFyc2U6IFJlbmFtZWQgZnJvbSBnYXMvaHBwYS9tb3JlLnBhcnNlLgorCitNb24gTm92IDI4IDAwOjQwOjI2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cCAobm9zdWJzcGFjZS5zKTogTm8gbG9uZ2VyIGV4cGVjdGVkCisJdG8gZmFpbC4gIEZpeCBjb21tZW50cyBmb3IgdGhlIHRlc3QuICBUd2VhayB0ZXN0IG5hbWUuCisKK1R1ZSBOb3YgMjIgMjM6Mzg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTWlub3IgdHdlYWtzIHRvIG1hdGNoIGN1cnJlbnQgUEEgRUxGCisJb3V0cHV0LiAKKworRnJpIE5vdiAxOCAxNzo1Njo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGdhcy9taXBzL2xkLmQ6IEFkanVzdCB0byB3b3JrIGZvciBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbgorCWNvZGUuCisJKiBnYXMvbWlwcy9sZC5zLCBnYXMvbWlwcy9saWYtZW1waWMuZDogTGlrZXdpc2UuCisJKiBnYXMvbWlwcy9saWZsb2F0LmQsIGdhcy9taXBzL3VsaC1lbXBpYy5kOiBMaWtld2lzZS4KKwkqIGdhcy9taXBzL3VsaC5kLCBnYXMvbWlwcy91bHcuZCwgZ2FzL21pcHMvdXNoLmQ6IExpa2V3aXNlLgorCSogZ2FzL21pcHMvdXN3LmQ6IExpa2V3aXNlLgorCitUdWUgTm92IDE1IDExOjA5OjU3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KKworCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChpbXBvcnRidWcpOiBUd2VhayB0byBtYXRjaAorCWN1cnJlbnQgZXhwZWN0ZWQgUEEgRUxGIG91dHB1dC4KKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fcl9ub19yZWxvYyk6IExpa2V3aXNlLgorCShkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0KTogTGlrZXdpc2UuCisKK1RodSBOb3YgIDMgMTg6MTQ6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZ2FzL2FsbC9wMTQ4MC5zOiBVc2UgbGFyZ2VyIGNvbnN0YW50LCBzbyBleHByZXNzaW9uIGNhbiBoYXZlIGEKKwlwb3NpdGl2ZSB2YWx1ZS4KKwkqIGdhcy9hbGwvZ2FzLmV4cDogRXhwZWN0IHAxNDgwLnMgd2l0aG91dCBsaXN0aW5ncyB0byBwYXNzLgorCitUaHUgTm92ICAzIDE1OjQzOjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogZ2FzL21pcHMvdWxoLmQsIGdhcy9taXBzL3Vsdy5kLCBnYXMvbWlwcy91c2guZCwgZ2FzL21pcHMvdXN3LmQ6CisJQ29ycmVjdCB0ZXN0IGNhc2VzLgorCitUaHUgT2N0IDIwIDAwOjU1OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9ibGVidWczLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCisKK01vbiBPY3QgMTcgMDI6MzM6NTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTMuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KKworU3VuIE9jdCAxNiAyMjoyNTo1NiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyX25vX3JlbG9jKTogVHdlYWsgb3V0cHV0IHRvIG1hdGNoCisJY3VycmVudCByZWFsaXR5LgorCitXZWQgU2VwIDI4IDIxOjIxOjM0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UuczogUmVuYW1lZCBmcm9tIHJlbG9jcmVkdWNlLnMKKwkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZTIuczogUmVuYW1lZCBmcm9tIHJlbG9jcmVkdWNlMi5zCisJKiBnYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnM6IFJlbmFtZWQgZnJvbSByX25vX3JlbG9jYnVnLnMKKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKworV2VkIFNlcCAyOCAxMzoyNToxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGdhcy9taXBzL2JlcS5kLCBnYXMvbWlwcy9iZXEuczogVGVzdCB0aGF0IHVuY29uZGl0aW9uYWwgYnJhbmNoCisJb3ZlcmZsb3dzIGFyZSBjb3JyZWN0bHkgY29udmVydGVkIHRvIGp1bXBzLgorCitNb24gU2VwIDI2IDE3OjQxOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZ2FzL21pcHM6IEFkZCB0ZXN0IGNhc2VzIGZvciBQSUMgY29kZSwgYm90aCBTVlI0IHN0eWxlIGFuZAorCS1tZW1iZWRkZWQtcGljIHN0eWxlLgorCitGcmkgU2VwIDIzIDE0OjQ1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZ2FzL21pcHM6IE5ldyBkaXJlY3Rvcnkgd2l0aCBNSVBTIHNwZWNpZmljIHRlc3QgY2FzZXMuCisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBQZXJtaXQgdGhlIC5kIGZpbGUgdG8gc3BlY2lmeQorCXRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhc3NlbWJsZS4KKwkocmVnZXhwX2RpZmYpOiBQdXQgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSBpbiB0aGUgbG9nIGZpbGUuCisKK1dlZCBTZXAgMjEgMTM6NDQ6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBsaWIvZ2FzLWRlZnMuZXhwOiBEb24ndCB0cnkgdG8gdXNlIHNoZWxsIHJlZGlyZWN0aW9uLCBzaW5jZSBUQ0wKKwlkb2Vzbid0IHN1cHBvcnQgaXQuICBSZWRpcmVjdCBzdGRvdXQgdXNpbmcgPiBpbnN0ZWFkIG9mIDE+LCBhbmQKKwlkb24ndCBib3RoZXIgdG8gcmVkaXJlY3Qgc3RkZXJyIHNpbmNlIFRDTCByZWRpcmVjdHMgaXQgYW55aG93LgorCShydW5fZHVtcF90ZXN0KTogUGFzcyBhcHByb3ByaWF0ZSBhcmd1bWVudHMgdG8gcHJvZ3JhbSwgZGVmYXVsdGluZworCXRvIC1yLgorCitTYXQgU2VwIDE3IDAxOjA0OjU2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGdhcy92YXg6IE5ldyBkaXJlY3RvcnkuCisJKiBnYXMvdmF4L3txdWFkLnMscXVhZC5leHB9OiBOZXcgdGVzdCwgZm9yIGltbWVkaWF0ZSBxdWFkd29yZAorCXZhbHVlcy4KKworTW9uIFNlcCAxMiAyMjoxOToxMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvY2J1Zy5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgorCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKGRvX2Z1bmN0aW9uX3JlbG9jX2J1Zyk6IFVwZGF0ZQorCWV4cGVjdGVkIG91dHB1dC4KKworU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQorCisJKiBnYXMvYXJtLyo6IE5ldyBzdWJ0cmVlLiAgQWRkIEFSTSB0ZXN0cy4KKworTW9uIEF1ZyAgOCAxMjoxMzozMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBBY2NlcHQgYW55IGNoYXJhY3RlcgorCWJldHdlZW4gZm9vJ3MgdHlwZSBhbmQgZm9vIGl0c2VsZi4KKworRnJpIEp1bCAxNSAxOTowOToyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogTmV3IHJvdXRpbmUgZm9yIHJ1bm5pbmcgdGhlCisJYXNzZW1ibGVyLCBydW5uaW5nIG9iamR1bXAgb3Igbm0gKG5vdCBmdWxseSBzdXBwb3J0ZWQpIG9uIHRoZQorCXJlc3VsdGluZyBvYmplY3QgZmlsZSwgYW5kIGNvbXBhcmluZyB0aGUgcmVzdWx0cyBhZ2FpbnN0IGEgZmlsZSBvZgorCXJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gdGhlIHRlc3Qgc3VpdGUsIGFsbCBpbiBvbmUgY29tbWFuZC4KKwlPcHRpb25zIGZvciB0aGUgYXNzZW1ibGVyIGFuZCBvYmpkdW1wIGFyZSByZWFkIGZyb20gY29tbWVudHMgYXQKKwl0aGUgc3RhcnQgb2YgdGhlIC5kIGZpbGUuCisJKGZhaWxfcGhhc2UsIHNsdXJwX29wdGlvbnMpOiBOZXcgYXV4aWxpYXJ5IHJvdXRpbmVzLgorCShyZWdleHBfZGlmZik6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4gIEZpeCBidWdzIGluIGFjdHVhbGx5IGRvaW5nCisJdGhlIHJlZ2V4cCB0ZXN0LgorCisJKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2UgcnVuX2R1bXBfdGVzdC4KKwkqIGdhcy9zdW40L2FkZGVuZC5kOiBGaXggcmVndWxhciBleHByZXNzaW9ucyBzbyB0aGF0IHRoZXkgd29yay4KKworVGh1IEp1bCAgNyAxMTo1NTozMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2NyZWR1Y2UyLnM6IE1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb24gdGVzdHMuCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biB0aGVtLgorCitUaHUgSnVuIDMwIDE4OjQ5OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9vayBmb3IgImFzLm5ldyIgaW4gIiRiYXNlX2Rpci8uLiIsIHdoZXJlCisJaXQgZ290IGNvbXBpbGVkLCBub3QgaW4gIiRiYXNlX2RpciIuCisJKiBjb25maWcvdW5rbm93bi5leHA6IERlbGV0ZWQuCisKK1N1biBKdW4gMjYgMTM6MjM6NTQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9saWIvZ2FzLWRlZnMuZXhwIChnYXNfZmluaXNoKTogQ2FsbCAiY2xvc2UiIGFuZCAid2FpdCIKKwliZWZvcmUgZXhpdGluZy4gIEVuY2xvc2UgYm90aCBjYWxscyBpbnNpZGUgYSAiY2F0Y2giLgorCShvYmpkdW1wX2ZpbmlzaCk6IExpa2V3aXNlLgorCitGcmkgSnVuIDEwIDEwOjIzOjM1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKHJvdW5kbW9kZSB0ZXN0KTogVHdlYWsgZXhwZWN0ZWQgb3V0cHV0CisJZm9yIFNPTSB0byBtYXRjaCBjdXJyZW50IHRlc3RjYXNlLgorCitUaHUgSnVuICAyIDE5OjQ2OjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGdhcy9pMzg2L3twdXNody5zLHB1c2h3Lmx9OiBOZXcgdGVzdC4KKwkqIGdhcy9pMzg2L2FsbC5leHA6IFJ1biBpdC4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlIGNvbmZpZyBmaWxlcyBhbmQgZ2FzLnN1bS4KKworRnJpIE1heSAyNyAxMjoyNDoxOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBnYXMvbTY4ay9kaXNwZXJyLnM6IFVzZSAlIGZvciByZWdpc3RlcnMuCisKKwkqIGdhcy9tNjhrLWNvZmYvZ2FzLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIHAyMzg5YS5zLgorCitUdWUgTWF5IDE3IDE0OjUzOjA4IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogbGliL2dhcy1kZWZzLmV4cDogUmVwbGFjZSBlcnJvciBwcm9jIGNhbGxzIHdpdGggcGVycm9yIGNhbGxzLgorCitNb24gTWF5IDE2IDEzOjE5OjE2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFR3ZWFrIGV4cGVjdGVkIG91dHB1dCB0byBtYXRjaCBuZXcKKwlFTEYgY29kZS4KKwkqIGdhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zOiBBdm9pZCAiUyIgYW5kICJEIiBtb2RlcywgRUxGIGRvZXMKKwlub3Qgc3VwcG9ydCB0aGVtLgorCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBUd2VhayBleHBlY3RlZCBvdXRwdXQgdG8gbWF0Y2gKKwluZXcgRUxGIGNvZGUuCisKK1RodSBNYXkgIDUgMTc6Mjc6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW5hbWVkIGZyb20gdW5peC1nYXMuZXhwLgorCitNb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgorCitNb24gQXByIDExIDA3OjU0OjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxpbmZvYnVnLnM6IEFkZCBtaXNzaW5nIG5hbWUgZm9yCisJcHJvY2VkdXJlLgorCisJKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogUGxhY2UgdGhlIHRyYW1wb2xpbmUgaW4gdGhlCisJJERBVEEkIHJhdGhlciB0aGFuICRMSVQkIHN1YnNwYWNlLgorCitTdW4gTWFyIDI3IDE0OjA1OjMzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KKworVGh1IE1hciAxNyAxMzozODowNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCisKK1dlZCBNYXIgMTYgMTE6NTc6MDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL21vcmUucGFyc2UvcmVncG9wYnVnLnM6IEFkZCB0cml2aWFsIC5lcXUgdGVzdC4KKworCSogZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnM6IE5ldyB0ZXN0IChleHBlY3RlZCB0byBmYWlsKS4KKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxpbmZvYnVnLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvb21yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KKworCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9yZWdwb3BidWcuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgorCitNb24gRmViIDI4IDE0OjEwOjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKG9iamR1bXApOiBOZXcgcHJvYy4KKwkob2JqZHVtcF9zdGFydCk6IERlbGV0ZWQgdW51c2VkIHByb2MuCisJKG9iamR1bXBfc3RhcnRfY29tbW9uKTogTWVyZ2VkIGludG8gb2JqZHVtcF9zdGFydF9ub19zdWJkaXIuCisKKwkqIGdhcy9hbHBoYS9mcC5leHA6IFVzZSBvYmpkdW1wIGluc3RlYWQgb2YKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciwgc2luY2UgdGhlIGZvcm1lciBhY3R1YWxseSB3YWl0cyBmb3IKKwlvYmpkdW1wIHRvIGZpbmlzaC4gIFNwZWNpZnkgLnJkYXRhIHNlY3Rpb24gb25seS4gIE1ha2UgY29tbWVudAorCWluZGljYXRlIEFscGhhIGFyY2hpdGVjdHVyZSByYXRoZXIgdGhhbiBTUEFSQy4KKwkqIGdhcy9hbHBoYS9mcC5kOiBPbWl0IC5yZWdpbmZvIHBhdHRlcm5zLiAgSnVzdCB1c2UgIi4iIHRvIG1hdGNoCisJYWdhaW5zdCBBU0NJSSBjb2RlIDB4MmEgKCIqIiwgc3BlY2lhbCBpbiByZWdleHApLgorCSogZ2FzL3N1bjQvYWRkZW5kLmV4cDogVXNlIG9iamR1bXAgaW5zdGVhZCBvZgorCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyLgorCitUaHUgRmViIDI0IDA3OjExOjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgICAgICogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHAgKG5vIHN1YnNwYWNlIHRlc3QpOiBPbmx5IGV4cGVjdAorCWEgZmFpbHVyZSBpZiBnYXMgaXMgbm90IHByb2R1Y2luZyBhbiBFTEYgb2JqZWN0LgorCitNb24gRmViIDE0IDA5OjI0OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFJ1biBpdC4KKworVGh1IEZlYiAxMCAwMDozNDoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBnYXMvYWxwaGEvZnAuKjogTmV3IGZpbGVzLgorCSogbGliL2dhcy1kZWZzLmV4cCAocmVnZXhwX2RpZmYpOiBSZXBvcnQgbm90ZWQgbWlzbWF0Y2ggYXQKKwl2ZXJib3NpdHkgbGV2ZWwgMyBvciBhYm92ZSBvbmx5LgorCitNb24gRmViICA3IDE1OjUzOjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS8qLyouZXhwOiBDaGFuZ2UgeGZhaWxzIHRvIGNoZWNrIGZvciBQQSBFTEYgcmF0aGVyIHRoYW4KKwlQQSBPU0YxLgorCitGcmkgRmViICA0IDIzOjQyOjE0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3htcHl1YnVnLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KKworRnJpIEZlYiAgNCAxNzoxMzoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IE5ldyBwcm9jZWR1cmUsIHZhZ3VlbHkgYmFzZWQgb24KKwkic2ltcGxlX2RpZmYiIGZyb20gbGlua2VyIHRlc3Qgc3VpdGUuCisJKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2UgaXQuCisJKiBnYXMvc3VuNC9hZGRlbmQuZDogTmV3IGZpbGUuCisKK1N1biBKYW4gMzAgMjM6MzQ6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogZ2FzL2FsbC9nYXMuZXhwOiBBZGp1c3QgcmVnZXhwIGZvciB4OTMwNTA5LnMgZm9yIGN1cnJlbnQgbGlzdGluZworCWZvcm1hdC4KKworVGh1IEphbiAyMCAxNjo0NDo1MSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGdhcy9hbGwvZ2FzLmV4cCwgbGliL2dhcy1kZWZzLmV4cCwgc3VuNC9hZGRlbmQuZXhwLAorCXNwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cDogVHdlYWtlZCB0byBmaXggYSBmZXcgYnVncyBhbmQgdG8gcnVuCisJd2VsbCB1bmRlciBlaXRoZXIgdmVyc2lvbiBvZiBleHBlY3QuCisKK01vbiBKYW4gMTcgMDA6MjU6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL2Jhc2ljL2ZwX21pc2MuczogRGVsZXRlIGNvcHIgaW5zdHJ1Y3Rpb24uICBJdCdzIHRlc3RlZAorCWVsc2V3aGVyZSBub3cuCisJKiBnYXMvaHBwYS9iYXNpYy97Y29wciwgY29wcm1lbSwgc3BvcH0uczogTmV3IHRlc3RzLgorCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBSdW4gdGhlbS4KKworVGh1IEphbiAxMyAxMTo1OToyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2FsbC9nYXMuZXhwOiBObyBsb25nZXIgZXhwZWN0IGRpZmZlcmVuY2Ugb2YgZm9yd2FyZAorCXJlZmVyZW5jZXMgdG8gZmFpbC4KKwkqIGdhcy9hbGwveDkzMDUwOS5zOiBGaXggdGVzdGNhc2UgdG8gbWF0Y2ggaG93IHRoZSBleHBlY3QgY29kZSB3YXMKKwl3cml0dGVuLgorCitXZWQgSmFuIDEyIDEzOjQxOjEwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLiAgTGF0ZXN0IHRlc3QKKwlmb3IgY3Jvc3Mtc3Vic3BhY2UgY2FsbCBidWdzIGlzIG5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3Byb2NidWcuczogQWRkIHRlc3QgZm9yIGFub3RoZXIgYnVnIHJlbGF0aW5nCisJdG8gaGF2aW5nIGEgZnVuY3Rpb24ncyBsYWJlbCBmb2xsb3cgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KKworVHVlIEphbiAxMSAyMTo0Nzo0OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBBZGQgdGVzdCBmb3IgY3Jvc3Mtc3Vic3BhY2UgY2FsbCBidWcKKwlmb3VuZCB3aGlsZSB3b3JraW5nIG9uIG11bHRpcGxlICRDT0RFJCBzdWJzcGFjZSBzdXBwb3J0LgorCitNb24gSmFuIDEwIDA5OjU0OjE1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogcHJvY2J1Zy5zIGlzIG5vIGxvbmdlciBleHBlY3RlZAorCXRvIGZhaWwuCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3Byb2NidWcuczogQWRkIG1pc3NpbmcgLnByb2NlbmQuCisKK01vbiBKYW4gIDMgMTA6MDc6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL21vcmUucGFyc2UvbGFiZWxidWcuczogQWRkIHRlc3RjYXNlIGZvciBidWcgaW4gbGFzdAorCWFwcC5jIGNoYW5nZS4KKworV2VkIERlYyAyOSAxMTozMjozOSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9sYWJlbGJ1Zy5zOiBBZGQgbW9yZSBjb2xvbmxlc3MgbGFiZWwgdGVzdHMuCisKK1dlZCBEZWMgMTUgMDg6MjQ6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoc2l0ZS5leHApOiBEb24ndCBzZXQgQVNGTEFHUy4gIFF1b3RlIHZhbHVlIG9mCisJT0JKRFVNUEZMQUdTIGluIGNhc2UgaXQncyBlbXB0eS4gIFVzZSB0ZW1wb3JhcnkgbmFtZXMgdW50aWwgdGhlCisJZW5kOyBtYWtlIGNyZWF0aW5nIHNpdGUuZXhwIHRoZSBmaW5hbCBzdGVwLgorCShjaGVjayk6IFBhc3MgaW4gQVNGTEFHUy4KKworCSogZ2FzL2FsbC9nYXMuZXhwOiBVc2UgYWxsX29uZXMgcHJvYy4gIENoYW5nZSByZWdleHAgZm9yIG1hdGNoaW5nCisJQyBjb21tZW50cyB0byBhdm9pZCBidWdzIGluIGxhdGVzdCBleHBlY3QgY29kZS4KKworV2VkIERlYyAgOCAxNDozMDoxNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL202OGsvZGlzcGVyci5zOiBOZXcgdGVzdC4KKwkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBpdC4KKworU3VuIERlYyAgNSAxOToyNDo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuICBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KKworV2VkIERlYyAgMSAxMDo0NDoxOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gdGhlIGZpcnN0IGhhbGYgb2YgYm9ndXMgUl9FWElUCisJdGVzdCBmb3IgRUxGLiAgCisKK1R1ZSBOb3YgMzAgMTM6NDM6MjEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBUZXN0IGZvciBlcnJvciBvbiBmb3Igc3Vic3BhY2UKKwlkaXJlY3RpdmUgaXMgYW4gWEZBSUwgZm9yIFNPTSBhc3NtZWJsZXJzLgorCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJlbW92ZSBYRkFJTCBmb3IgcmVsb2NhdGlvbiBvbgorCWNyb3NzLXN1YnNwYWNlIGNhbGwgdGVzdC4KKworU3VuIE5vdiAyOCAxMjoxMjo1MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9hcHBidWcuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgorCisJKiBnYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KKworU2F0IE5vdiAyNyAyMjo1MDowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2FsbC9wMjQyNS5zOiBJbnNlcnQgYSB0YWIgYmVmb3JlIGFzc2VtYmxlciBkaXJlY3RpdmVzIHNvCisJdGhhdCB0aGUgZGlyZWN0aXZlcyBhcmUgbm90IGludGVycHJldGVkIGFzIGxhYmVscy4KKworCSogZ2FzL2hwcGEvYmFzaWMvd2VpcmQuczogU3luYyB3aXRoIEdEQiB2ZXJzaW9uLgorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2xhYmVsYnVnLnM6IE5ldyB0ZXN0LgorCisJKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgorCitXZWQgTm92IDI0IDAxOjI1OjAzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgorCisJKiBnYXMvaHBwYS9yZWxvYy9leGl0YnVnLnM6IE5ldyB0ZXN0LgorCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCisKK1N1biBOb3YgMjEgMjI6MTE6MTAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTWlub3IgZml4ZXMgc28gdGhhdCBTT00gJiBFTEYgY2FuCisJc2hhcmUgdGhlIHNhbWUgdGVzdCBjb2RlLgorCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2NyZWR1Y2UuczogTGlrZXdpc2UuCisKKwkqIGdhcy9ocHBhL2Jhc2ljL2ZtZW0uczogQWRkIHF1YWR3b3JkIEZQIHN0b3JlIGluc3RydWN0aW9ucy4KKwkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogVGVzdCBxdWFkd29yZCBGUCBzdG9yZSBpbnN0cnVjdGlvbnMuCisKK1N1biBOb3YgIDcgMDA6MzE6NDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlIGZvcgorCWZpZWxkIHNlbGVjdG9yIG9uIGJsZSBpbnN0cnVjdGlvbiB0ZXN0LgorCisJKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IE5vIGxvbmdlciBleHBlY3QgZmFpbHVyZXMgZm9yCisJc3lzdGVtIGluc3RydWN0aW9uIHRlc3RzIG5vdyB0aGF0IHByb2JlaSBpcyBmaXhlZC4KKworU2F0IE5vdiAgNiAyMjo0NTowOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcuczogTmV3IHRlc3QuCisJKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KKworVGh1IE5vdiAgNCAxNzowMTozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zOiBOZXcgdGVzdC4KKwkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgorCitUaHUgTm92IDA0IDA5OjA5OjQ5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCisKK1R1ZSBOb3YgIDIgMjI6MTI6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL21vcmUucGFyc2Uve2RlZmJ1Zy5zLCBzdGRyZWcuc306IE5ldyB0ZXN0cy4KKwkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gdGhlbS4KKworTW9uIE5vdiAgMSAyMzozNzo1OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChyZWxvY19yZWR1Y2UpOiBDb3JyZWN0IG9mZnNldHMgYXQKKwl3aGljaCBzcGVjaWZpYyByZWxvY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgZm91bmQuCisJCitTYXQgT2N0IDMwIDE0OjEyOjMxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKHNzX2FsaWduKTogUmVtb3ZlIE9TRiB4ZmFpbC4KKworCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IEFkZCBuZXcgdGVzdC4KKwkqIGdhcy9ocHBhL21vcmUucGFyc2Uvc3NidWcuczogTmV3IHRlc3QgdG8gbWFrZSBzdXJlIG5vbi1kZWZhdWx0CisJc2VjdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgorCisJKiBnYXMvYWxsL2dhcy5leHA6IERpc2FibGUgKGFuZCBmYWlsKSBwMTQ4MC5zIGZvciBhbGwgUEEgdGFyZ2V0cy4KKworRnJpIE9jdCAyOSAxNjoyOTowNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9jYWxsZGF0YWJ1Zy5zOiBDb2xvbml6ZS4KKwkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBGaXggdHlwb3MuCisKK1RodSBPY3QgMjggMjE6NDA6MDYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdhcy9ocHBhL3tiYXNpYywgbW9yZS5wYXJzZSwgcmVsb2MsIHVuc29ydGVkfTogTmV3IGRpcmVjdG9yaWVzLgorCSogZ2FzL2hwcGEvKi8qLmV4cDogTmV3IHRlc3QgZHJpdmVycy4KKwkqIGdhcy9ocHBhLyovKi5zOiBOZXcgdGVzdCBmaWxlcy4KKworTW9uIE9jdCAyNSAwOTo0MDo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogZ2FzL3N1bjQ6IE5ldyBkaXJlY3RvcnkuCisJKiBnYXMvc3VuNC9hZGRlbmQucyxhZGRlbmQuZXhwOiBOZXcgdGVzdCBjYXNlLgorCSogZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMsYWRkZW5kLmV4cDogU29sYXJpcyB2ZXJzaW9uIG9mIHNhbWUKKwl0ZXN0IGNhc2UuCisKKwkqIGdhcy9hbGwvZ2FzLmV4cDogQ2hlY2sgYConIGluIEMgY29tbWVudHMuCisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKGFsbF9vbmVzKTogTmV3IHByb2NlZHVyZSwgZm9yIGEgcHJlZGljYXRlIHRvCisJc2ltcGxpZnkgc29tZSB0ZXN0cy4KKwkod2FudF9ub19vdXRwdXQpOiBSZXR1cm4gemVybyBvciBub256ZXJvLCBkZXBlbmRpbmcgb24gc3VjY2VzcyBvcgorCWZhaWx1cmUuCisJKGdhc190ZXN0X29sZCk6IFJldHVybiB2YWx1ZSBmcm9tIHdhbnRfbm9fb3V0cHV0LgorCShvYmpkdW1wX3N0YXJ0X2NvbW1vbik6IFNwbGl0IG9mZiBmcm9tIG9iamR1bXBfc3RhcnQuCisJKG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyKTogTmV3IHByb2NlZHVyZS4KKworV2VkIE9jdCAyMCAwNzoyNTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogZ2FzL2FsbC9kaWZmMS5zLCBnYXMvbTY4ay9waWMxLnM6IE5ldyB0ZXN0cy4KKwkqIGdhcy9hbGwvZ2FzLmV4cCwgZ2FzL202OGsvYWxsLmV4cDogUnVuIHRoZW0uCisKKwkqIE1ha2VmaWxlLmluIChPQkpEVU1QX0ZPUl9UQVJHRVQpOiBEZWZpbmUgc2ltaWxhciB0bworCUFTX0ZPUl9UQVJHRVQuCisJKGNoZWNrKTogRG9uJ3QgcGFzcyBBU0ZMQUdTIHZhcmlhYmxlLgorCShzaXRlLmV4cCk6IFB1dCBBU0ZMQUdTLCBPQkpEVU1QLCBPQkpEVU1QRkxBR1MgaW50byBzaXRlLmV4cC4KKworCUZyb20gSmVmZiBMYXc6CisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKG9iamR1bXBfc3RhcnQsIG9iamR1bXBfZmluaXNoKTogTmV3IGZ1bmN0aW9ucworCXNvIHRoYXQgdGVzdHMgY2FuIHBhcnNlIHRoZSBvdXRwdXQgb2Ygb2JqZHVtcCBsb29raW5nIGZvciBlcnJvcnMKKwlpbiByZWxvY2F0aW9uIGVudGlyZXMsIGZpbGUgaGVhZGVycyBhbmQgdGhlIGxpa2UuCisKK1RodSBTZXAgMjMgMTY6MjA6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBnYXMvaWVlZS5mcC94OTMwNTA5YS5leHA6IEN1cnJlbnRseSBleHBlY3RlZCB0byBmYWlsIGFsd2F5cy4KKwkqIGdhcy9hbGwvZ2FzLmV4cCAocDE0ODAucywgeDkzMDUwOS5zKTogRGl0dG8uICBCcmVhayB1cCBnYXNfdGVzdAorCWNhbGwgc28gaXQgbm8gbG9uZ2VyIHBlcmZvcm1zIG11bHRpcGxlIHRlc3RzLgorCSogZ2FzL202OGsvYWxsLmV4cCAodDIucyk6IERvbid0IGJvdGhlciB3aXRoIGxpc3RpbmdzLgorCShwMjQxMC5zKTogRG9uJ3QgcGFzcyB1bndhbnRlZCBhcmd1bWVudHMgdG8gZ2FzX3Rlc3RfZXJyb3IuCisKK1dlZCBBdWcgMjUgMTY6NTA6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBsaWIvZG8qOiBSZW1vdmUgUkNTIGlkIHN0cmluZ3MuCisKK01vbiBNYXkgMTcgMTU6MDk6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdhcy9hbGwvZmxvYXQucywgZ2FzL2FsbC9wMTQ4MC5zLCBnYXMvbTY4ay9wMjQxMC5zOiBOZXcgdGVzdHMuCisJKiBnYXMvYWxsL2dhcy5leHAsIGdhcy9tNjhrL2FsbC5leHA6IFJ1biB0aGVtLgorCSogZ2FzL2kzODY6IE5ldyBkaXJlY3RvcnkuCisKK01vbiBNYXkgMTAgMTQ6NTA6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIEFkZGVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHRvIGNhdGVnb3JpemUgdGVzdHMgYnkgdGFyZ2V0cy4KKwkqIEFkZGVkIG5ldyB0ZXN0cyBhbGwveDkzMDUwOS5zLCBpZWVlLmZwL3g5MzA1MDlhLnMsIG02OGsvcDI2NjMucywKKwlhbmQgcmVmaW5lZCBzb21lIHRvIGV4YW1pbmUgdGhlIGFzc2VtYmxlciBsaXN0aW5nIG91dHB1dC4KKwkqIGxpYi9nYXMtZGVmcy5leHA6IFJlbmFtZWQgZ2FzX3N0YXJ0IHRvIGdhc19ydW4uICBBZGRlZCBzb21lCisJZXhwZWN0X2FmdGVyIHBhdHRlcm5zLgorCShnYXNfc3RhcnQsIGdhc19maW5pc2gpOiBOZXcgcHJvY3MsIGZvciB0ZXN0cyB0aGF0IGV4YW1pbmUgcHJvY2VzcworCW91dHB1dC4KKwkqIGNvbmZpZy91bml4LWdhcy5leHA6IEludm9rZSBnYXNfaW5pdCBkaXJlY3RseSwgaW5zdGVhZCBvZgorCXJlcXVpcmluZyB0ZXN0IC5leHAgZmlsZXMgZG8gaXQuCisKK1dlZCBBcHIgMjEgMDE6MjQ6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBnYXMvZ2FzLmV4cDogSGFuZGxlIG5ldyB0ZXN0cywgYW5kIGNoYW5nZXMgdG8gdGVzdGluZyBwcm9jcy4KKworCSogbGliL2dhcy1kZWZzLmV4cCAod2FudF9ub19vdXRwdXQpOiBOZXcgcHJvYzsgc3VjY2VzcyBpZmYgb3V0cHV0CisJaXMgZW1wdHkuCisJKGdhc190ZXN0X29sZCk6IEZ1bmN0aW9uYWxseSBzYW1lIGFzIG9sZCBnYXNfdGVzdC4KKwkoZ2FzX3Rlc3RfaWdub3JlX3N0ZG91dCk6IFJld3JpdHRlbiB0byB1c2Ugd2FudF9ub19vdXRwdXQuCisJKGdhc190ZXN0KTogTmV3IGFyZ3VtZW50IGxpc3RzIHNldCBvZiBvcHRpb25zIHRvIGJlIHRyaWVkIGluCisJY29tYmluYXRpb25zLiAgT3B0aW9uIHdpdGggdHJhaWxpbmcgIj4iIGluZGljYXRlcyBzdGFuZGFyZCBvdXRwdXQKKwlzaG91bGQgYmUgaWdub3JlZC4KKworCSogZ2FzL3AyNDI1YS5zOiBVc2UgJS1mb3JtIGZvciByZWdpc3RlcnMsIHNvIHRoaXMgdGVzdCBjYW4gYmUgcnVuCisJb24gbTY4ay1jb2ZmIHRhcmdldHMgdG9vLgorCisJKiBnYXMvcDI0MzBhLnM6IE5ldyB0ZXN0IGNhc2UsIHdoaXRlc3BhY2UgJmMgbWF0Y2hlcyBjdXN0b21lcgorCXJlcG9ydCBtb3JlIGNsb3NlbHkuICBHZXRzIGRpZmZlcmVudCByZXN1bHRzIGZyb20gcDI0MzAuczsgdGhpcyBpcworCWJhZCwgYW5kIG5vdCB5ZXQgdGVzdGVkIGZvci4KKworTW9uIEFwciAgNSAxMjoyNzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogZ2FzL3AyMzg5YS5zLCBnYXMvcDI0MTEucywgZ2FzL3QyLnM6IE5ldyB0ZXN0IGNhc2VzLgorCSogbGliL3J1bjogTmV3IHNjcmlwdC4KKwkqIGdhcy9nYXMtZGVmcy5leHAgKGdhc19zdGFydCk6IFRha2VzIG5ldyBhcmdzLCBhc3NlbWJsZXIgb3B0aW9ucworCWFuZCByZWRpcmVjdGlvbiBvcHRpb25zLiAgVXNlICJydW4iIHNjcmlwdCBzbyByZWRpcmVjdGlvbiB3b3Jrcy4KKwkoZ2FzX3Rlc3QpOiBOb3cgdGFrZXMgYXNzZW1ibGVyIG9wdGlvbnMgYXMgc2VwYXJhdGUgYXJnIGZyb20gaW5wdXQKKwlmaWxlIG5hbWUuCisJKGdhc190ZXN0X2lnbm9yZV9zdGRvdXQpOiBOZXcgcHJvYy4gIERpc2NhcmRzIG91dHB1dC4KKwkoZ2FzX3Rlc3RfZXJyb3IpOiBOZXcgcHJvYy4gIEV4cGVjdHMgYXNzZW1ibGVyIHRvIGdlbmVyYXRlIG91dHB1dC4KKwkodGFyZ2V0X2NwdV9mYW1pbHkgc2V0dGluZyk6IEhhbmRsZSBpNDg2LT5pMzg2IGFsc28uCisKKwkqIGxpYi9kbyo6IFNjcmlwdHMgbW92ZWQgaGVyZSBmcm9tIGdhcy90ZXN0c2NyaXB0cy4gIE1heSBiZSB1c2VmdWwKKwlzb21lZGF5IGZvciB3cml0aW5nIG1vcmUgdGVzdCBjYXNlczsgbm90IGN1cnJlbnRseSB1c2VkLgorCitUdWUgTWFyIDMwIDExOjQ1OjI3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZ2FzL3NvbC1nY2MucywgZ2FzL3NvbC1jYy5zLCBnYXMvcDI0MjVhLnMsIGdhcy9wMjM4OS5zOiBOZXcgdGVzdAorCWNhc2VzLgorCSogZ2FzL2dhcy5leHA6IEVuYWJsZSB0aGVtIGZvciBhcHByb3ByaWF0ZSB0YXJnZXRzLiAgUmVtb3ZlZCBzb21lCisJdXNlbGVzcyBjb21tZW50cyAmYy4gIENoYW5nZWQgbTY4ayB0YXJnZXQgdGVzdCB0byBiZSBtb3JlIGdlbmVyYWwuCisKKwkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19leGl0LCBnYXNfaW5pdCk6IE5ldyBwcm9jcy4KKwkqIGdhcy9nYXMuZXhwOiBDYWxsIGdhc19pbml0LgorCitNb24gTWFyIDI5IDAwOjAwOjAwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBUZXN0IHN1aXRlIGNyZWF0ZWQuCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzNGEwMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCkBAIC0wLDAgKzEsNDYgQEAKK2xvYWRfbGliIGdhcy1kZWZzLmV4cAorCitnbG9iYWwgQVMKK2lmICFbaW5mbyBleGlzdHMgQVNdIHRoZW4geworICAgIHNldCBBUyBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2FzLW5ldyAiLi4vYXMtbmV3IiBbdHJhbnNmb3JtIGFzXV0KK30KKworZ2xvYmFsIEdBU1AKK2lmICFbaW5mbyBleGlzdHMgR0FTUF0gdGhlbiB7CisgICAgc2V0IEdBU1AgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9nYXNwLW5ldyAiLi4vZ2FzcC1uZXciIFt0cmFuc2Zvcm0gZ2FzcF1dCit9CisKK2dsb2JhbCBBU0ZMQUdTCitpZiAhW2luZm8gZXhpc3RzIEFTRkxBR1NdIHRoZW4geworICAgIHNldCBBU0ZMQUdTICIiCit9CisKK2lmICFbaW5mbyBleGlzdHMgT0JKRFVNUF0gdGhlbiB7CisgICAgc2V0IE9CSkRVTVAgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9vYmpkdW1wIFwKKwkJCSAgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamR1bXAgXAorCQkJICBbdHJhbnNmb3JtIG9iamR1bXBdXQorfQorCitpZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBGTEFHU10gdGhlbiB7CisgICAgc2V0IE9CSkRVTVBGTEFHUyB7fQorfQorCitpZiAhW2luZm8gZXhpc3RzIE5NXSB0aGVuIHsKKyAgICBzZXQgTk0gW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9ubS1uZXcgXAorCQkgICAgICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9ubS1uZXcgXAorCQkgICAgIFt0cmFuc2Zvcm0gbm1dXQorfQorCitpZiAhW2luZm8gZXhpc3RzIE5NRkxBR1NdIHRoZW4geworICAgIHNldCBOTUZMQUdTIHt9Cit9CisKK2lmICFbaW5mbyBleGlzdHMgT0JKQ09QWV0gdGhlbiB7CisgICAgc2V0IE9CSkNPUFkgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9vYmpjb3B5XQorfQorCitpZiAhW2luZm8gZXhpc3RzIE9CSkNPUFlGTEFHU10gdGhlbiB7CisgICAgc2V0IE9CSkNPUFlGTEFHUyB7fQorfQorCitnYXNfaW5pdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmVkZTYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQKQEAgLTAsMCArMSwxMiBAQAorI29iamR1bXA6IC1zIC1qIC50ZXh0CisjbmFtZTogYWxpZ24KKworIyBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wLgorCisuKjogLioKKworQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKKyAwMDAwIGZmMDBmZjAxIGZmMDIwMjAyIGZmZmYwMzAzIDA0MDQwNDA0ICAuLi4uLi4uLi4uLi4uLi4uCisgMDAxMCBmZmZmZmZmZiAwNTA1MDUwNSBmZjA5MGEwYSAwYTBhMGEwYSAgLi4uLi4uLi4uLi4uLi4uLgorIDAwMjAgZmYwMGZmMDEgZmYwMjAyMDIgZmZmZjAzMDMgMDQwNDA0MDQgIC4uLi4uLi4uLi4uLi4uLi4KKyAwMDMwIGZmZmZmZmZmIDA1MDUwNTA1IGZmMDkwYTBhIDBhMGEwYTBhICAuLi4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9hbGlnbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2NhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucwpAQCAtMCwwICsxLDYxIEBACisvKiBUZXN0IHRoZSBhbGlnbm1lbnQgcHNldWRvLW9wcy4gICovCisJLnRleHQKKworCS5ieXRlCTB4ZmYKKwkucDJhbGlnbiAxLDAKKworCS5ieXRlCTB4ZmYKKwkucDJhbGlnbiAxLDEKKworCS5ieXRlCTB4ZmYKKwkucDJhbGlnbiAyLDIKKworCS5ieXRlCTB4ZmYKKwkuYnl0ZQkweGZmCisJLnAyYWxpZ253IDIsMHgwMzAzCisKKwkucDJhbGlnbiAzLDQKKwkuYnl0ZQkweGZmCisJLmJ5dGUJMHhmZgorCS5ieXRlCTB4ZmYKKwkuYnl0ZQkweGZmCisJLnAyYWxpZ25sIDMsMHgwNTA1MDUwNQorCisJLnAyYWxpZ24gMSw2CisJLnAyYWxpZ24gMSw3CisKKwkuYnl0ZQkweGZmCisJLnAyYWxpZ24gMyw4LDUKKwkuYnl0ZQk5CisJLnAyYWxpZ24gMywweGEKKworCS5ieXRlCTB4ZmYKKwkuYmFsaWduCTIsMAorCisJLmJ5dGUJMHhmZgorCS5iYWxpZ24JMiwxCisKKwkuYnl0ZQkweGZmCisJLmJhbGlnbgk0LDIKKworCS5ieXRlCTB4ZmYKKwkuYnl0ZQkweGZmCisJLmJhbGlnbncgNCwweDAzMDMKKworCS5iYWxpZ24JOCw0CisJLmJ5dGUJMHhmZgorCS5ieXRlCTB4ZmYKKwkuYnl0ZQkweGZmCisJLmJ5dGUJMHhmZgorCS5iYWxpZ25sIDgsMHgwNTA1MDUwNQorCisJLmJhbGlnbiAyLDYKKwkuYmFsaWduIDIsNworCisJLmJ5dGUJMHhmZgorCS5iYWxpZ24JOCw4LDUKKwkuYnl0ZQk5CisJLmJhbGlnbgk4LDB4YQorCisJLnAyYWxpZ24gNQorCS5iYWxpZ24gMzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODk4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29mZnRhZy5kCkBAIC0wLDAgKzEsMjUgQEAKKyNvYmpkdW1wOiAtdAorI25hbWU6IGNvZmZ0YWcKKworLio6ICAgICBmaWxlIGZvcm1hdCAuKgorCitTWU1CT0wgVEFCTEU6CitcWyAgMFxdXChzZWMgLTJcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsIDEwM1wpIFwobnggMVwpIDB4MCswMDAwIGZvby5jCitGaWxlIAorXFsgIDJcXVwoc2VjICAxXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDZcKSBcKG54IDBcKSAweDArMDAwMCBnY2MyX2NvbXBpbGVkLgorXFsgIDNcXVwoc2VjICAxXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDZcKSBcKG54IDBcKSAweDArMDAwMCBfX19nbnVfY29tcGlsZWRfYworXFsgIDRcXVwoc2VjIC0yXClcKGZsIDB4MDBcKVwodHkgICBhXClcKHNjbCAgMTVcKSBcKG54IDFcKSAweDArMDAwMCBfdG9rZW4KK0FVWCBsbm5vIDAgc2l6ZSAweDQgdGFnbmR4IDAgZW5kbmR4IDEwCitcWyAgNlxdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIGJcKVwoc2NsICAxNlwpIFwobnggMFwpIDB4MCswMDAwIF9vcGVyYXRvcgorXFsgIDdcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICBiXClcKHNjbCAgMTZcKSBcKG54IDBcKSAweDArMDAwMSBfZmxhZ3MKK1xbICA4XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgMTAyXCkgXChueCAxXCkgMHgwKzAwMDQgLmVvcworQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggNAorXFsgMTBcXVwoc2VjICAxXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAudGV4dAorQVVYIHNjbmxlbiAweFswLTlhLWZdKyBucmVsb2MgMCBubG5ubyAwCitcWyAxMlxdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC5kYXRhCitBVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKK1xbIDE0XF1cKHNlYyAgM1wpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLmJzcworQVVYIHNjbmxlbiAweFswLTlhLWZdKyBucmVsb2MgMCBubG5ubyAwCitcWyAxNlxdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIDJcKVwoc2NsICAgMlwpIFwobnggMFwpIDB4MCswMDAwIF90b2tlbgorXFsgMTdcXVwoc2VjICAyXClcKGZsIDB4MDBcKVwodHkgICBhXClcKHNjbCAgIDJcKSBcKG54IDFcKSAweFswLTlhLWZdKyBfd2hhdAorQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NjU5OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMKQEAgLTAsMCArMSw1NyBAQAorLyogVGhpcyBmaWxlIHdhcyBjb21waWxlZCBmcm9tIHRoaXMgQyBzb3VyY2U6CisJY2hhciB0b2tlbiA9MDsKKwllbnVtIHRva2VuIHsKKwkgICAgICAgIG9wZXJhdG9yLAorCSAgICAgICAgZmxhZ3MKKwl9OworCSAKKwllbnVtIHRva2VuIHdoYXQ9IG9wZXJhdG9yOworICovCisKKwkuZmlsZQkiZm9vLmMiCitnY2MyX2NvbXBpbGVkLjoKK19fX2dudV9jb21waWxlZF9jOgorLmdsb2JsIF90b2tlbgorLmRhdGEKK190b2tlbjoKKwkuYnl0ZSAwCisudGV4dAorCS5kZWYJX3Rva2VuCisJLnNjbAkxNQorCS50eXBlCTAxMgorCS5zaXplCTQKKwkuZW5kZWYKKwkuZGVmCV9vcGVyYXRvcgorCS52YWwJMAorCS5zY2wJMTYKKwkudHlwZQkwMTMKKwkuZW5kZWYKKwkuZGVmCV9mbGFncworCS52YWwJMQorCS5zY2wJMTYKKwkudHlwZQkwMTMKKwkuZW5kZWYKKwkuZGVmCS5lb3MKKwkudmFsCTQKKwkuc2NsCTEwMgorCS50YWcJX3Rva2VuCisJLnNpemUJNAorCS5lbmRlZgorLmdsb2JsIF93aGF0CisuZGF0YQorCS5wMmFsaWduIDIKK193aGF0OgorCS5sb25nIDAKKy50ZXh0CisJLmRlZglfdG9rZW4KKwkudmFsCV90b2tlbgorCS5zY2wJMgorCS50eXBlCTAyCisJLmVuZGVmCisJLmRlZglfd2hhdAorCS52YWwJX3doYXQKKwkuc2NsCTIKKwkudGFnCV90b2tlbgorCS5zaXplCTQKKwkudHlwZQkwMTIKKwkuZW5kZWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb21tZW50LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmM2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zCkBAIC0wLDAgKzEsMyBAQAorIyBUaGlzIHRlc3QgZmlsZSBpcyB0byBzZWUgd2hldGhlciBjb21tZW50cyBnZXQgd3JpdHRlbiBpbnRvIGxpc3RpbmdzCisjIGNvcnJlY3RseS4gIFRoZSBmaWxlIGhhcyBubyByZWFsIGNvbnRlbnRzLgorLyogQyBjb21tZW50cyB0b28hICovCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUzOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbmQuZApAQCAtMCwwICsxLDIwIEBACisjIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBvdXRwdXQgb2YgZ2FzIC1hbGMgY29uZC5zLgorCisuKmNvbmQucy4qCisKKworICAgMVsgCV0rLmlmCTAKKyAgIDhbIAldKy5lbHNlCisgICA5WyAJXSsuaWYJMQorICAxMFsgCV0rLmVuZGMKKyAgMTEgMDAwMCAwWzAyXTAwID8wMDBbMDJdWyAJXSsubG9uZ1sgCV0rMgorICAxMlsgCV0rLmlmCTAKKyAgMTRbIAldKy5lbHNlCisgIDE1IDAwMDQgMFswNF0wMCA/MDAwWzA0XVsgCV0rLmxvbmdbIAldKzQKKyAgMTZbIAldKy5lbmRjCisgIDE3WyAJXSsuZW5kYworICAxOCAwMDA4IDAwMDAgPzAwMDBbIAldKy5wMmFsaWduIDUsMAorICAxOFsgCV0rMDAwMCA/MDAwMCAKKyAgMThbIAldKzAwMDAgPzAwMDAgCisgIDE4WyAJXSswMDAwID8wMDAwIAorICAxOFsgCV0rMDAwMCA/MDAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTgzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zCkBAIC0wLDAgKzEsMTggQEAKKwkuaWYJMAorCS5pZgkxCisJLmVuZGMKKwkubG9uZwkwCisJLmlmCTAKKwkubG9uZwkxCisJLmVuZGMKKwkuZWxzZQorCS5pZgkxCisJLmVuZGMKKwkubG9uZwkyCisJLmlmCTAKKwkubG9uZwkzCisJLmVsc2UKKwkubG9uZwk0CisJLmVuZGMKKwkuZW5kYworCS5wMmFsaWduIDUsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZGlmZjEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE4OWZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMKQEAgLTAsMCArMSw1IEBACisjIERpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzLgorIyBUaGUgYXNzZW1ibGVyIHNob3VsZCByZWplY3QgdGhpcy4KKwkudGV4dAorCS5nbG9ibCBfZm9vCitfZm9vOgkubG9uZyBfYSAtIF9iCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOThjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZmxvYXQucwpAQCAtMCwwICsxLDQgQEAKKwkudGV4dAorZm9vOgkuc2luZ2xlCTByMS4yMzQ1ZSswNgorCS5zaW5nbGUgMGYzLjE0MTU5CisJLmRvdWJsZSAwcjIuNzE4MjgyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDQ1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cApAQCAtMCwwICsxLDE0NSBAQAorIworIyBUaGVzZSB0ZXN0cyBzaG91bGQgYmUgdmFsaWQgb24gYWxsIHRhcmdldHMuCisjCisKKyMgSSB0aGluayBjdXJyZW50bHkgYWxsIHRhcmdldHMgZmFpbCB0aGlzIG9uZSB3aGVuIGxpc3RpbmdzIGFyZSBlbmFibGVkLgorZ2FzX3Rlc3QgInAyNDI1LnMiICIiICAgIiIgInBjcmVsIHZhbHVlcyBpbiBhc3NpZ25tZW50IgorCisjIHAxNDgwLnMgdXNlcyBhICIuc3BhY2UiIGRpcmVjdGl2ZSB3aGljaCBmb3IgbW9zdCBhc3NlbWJsZXJzIG1lYW5zCisjICJhbGxvY2F0ZSBzb21lIHNwYWNlIi4gIE9uIHRoZSBQQSBpdCBtZWFucyAic3dpdGNoIGludG8gdGhpcyBzcGFjZSIuCisjCisjIFRoZXJlZm9yZSB0aGlzIHRlc3QgKGFzIGl0IGlzIGN1cnJlbnRseSB3cml0dGVuKSBpcyBjb21wbGV0ZWx5IGJvZ3VzCisjIGZvciBhbnkgUEEgdGFyZ2V0LiAgRG8gbm90IGJvdGhlciB0cnlpbmcgdG8gcnVuIGl0IGFuZCBqdXN0IGNsYWltCisjIGl0IGZhaWxzLgoraWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7CisgICAgc2V0dXBfeGZhaWwgKi0qLSoKKyAgICBmYWlsICJzaW1wbGlmaWFibGUgZG91YmxlIHN1YnRyYWN0aW9uIgorfSBlbHNlIHsKKyAgICBnYXNfdGVzdCAicDE0ODAucyIgIiIgIi1hPiIgInNpbXBsaWZpYWJsZSBkb3VibGUgc3VidHJhY3Rpb24iCit9CisKK2dhc190ZXN0ICJmbG9hdC5zIiAiIiAgICIiICJzaW1wbGUgRlAgY29uc3RhbnRzIgorCisjIFRoaXMgdGVzdCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlIFBBOyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkCisjIHN5bWJvbHMgaXMgc29tZXRoaW5nIHRoYXQgaXMgKGFuZCBtdXN0IGJlKSBzdXBwb3J0ZWQgb24gdGhlIFBBLgoraWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4geworICAgIGdhc190ZXN0X2Vycm9yICJkaWZmMS5zIiAiIiAiZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkIHN5bWJvbHMiCit9CisKK3Byb2MgZG9fY29tbWVudCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjb21tZW50LnM6IGNvbW1lbnRzIGluIGxpc3RpbmdzIgorICAgIHNldCB4MSAwCisgICAgc2V0IHgyIDAKKyAgICBzZXQgeDMgMAorICAgIHNldCB3aGl0ZSB7WyBcdF0qfQorICAgIGdhc19zdGFydCAiY29tbWVudC5zIiAiLWFsIgorICAgIHdoaWxlIDEgeworIyBBcHBhcmVudGx5IENSTEYgaXMgcmVjZWl2ZWQgd2hlbiB1c2luZyBwdHlzIGZvciBzdWJwcm9jZXNzZXM7IGhlbmNlIHRoZQorIyBcclxuIGZvciBsaW5lIDMuCisJZXhwZWN0IHsKKwkgICAgLXJlICJeICsxXFsgXHRcXSsjIFRoaXNcW15cblxdKlxuIgkJeyBzZXQgeDEgMSB9CisJICAgIC1yZSAiXiArMlxbIFx0XF0rIyBjb3JyZWN0bHlcW15cblxdKlxuIgl7IHNldCB4MiAxIH0KKwkgICAgLXJlICJeICszXFsgXHRcXSsvLiBDIGNvbW1lbnRzIHRvby4gLi9ccj9cbiIgeyBzZXQgeDMgMSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorICAgIGdhc19maW5pc2gKKyAgICBpZiBbYWxsX29uZXMgJHgxICR4MiAkeDNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK2RvX2NvbW1lbnQKKworIworIyBUZXN0IHg5MzA1MDlhIC0tIGNvcnJlY3QgYXNzZW1ibHkgb2YgZGlmZmVyZW5jZXMgaW52b2x2aW5nIGZvcndhcmQKKyMgcmVmZXJlbmNlcy4KKyMKKworcHJvYyBkb185MzA1MDlhIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImRpZmZlcmVuY2UgYmV0d2VlbiBmb3J3YXJkIHJlZmVyZW5jZXMiCisgICAgc2V0IHggMAorICAgIGdhc19zdGFydCAieDkzMDUwOS5zIiAiLWFsIgorICAgIHdoaWxlIDEgeworIyBXZSBuZWVkIHRvIGFjY29tb2RhdGUgYm90aCBieXRlIG9yZGVycyBoZXJlLgorIyBJZiAiLmxvbmciIG1lYW5zIGFuIDgtYnl0ZSB2YWx1ZSBvbiBzb21lIHRhcmdldCBzb21lZGF5LCB0aGlzIHRlc3Qgd2lsbCBoYXZlCisjIHRvIGJlIGZpeGVkLgorCWV4cGVjdCB7CisJICAgIC1yZSAiXiArMSAuLi4uIDAwMDAgKjAwMDAiIHsgZmFpbCAkdGVzdG5hbWU7IHNldCB4IDEgfQorCSAgICAtcmUgIl4gKzEgLi4uLiAwNDAwICowMDAwIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KKwkgICAgLXJlICJeICsxIC4uLi4gMDAwMCAqMDAwNCIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIgeyB9CisJICAgIHRpbWVvdXQgeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mIHsgYnJlYWsgfQorCX0KKyAgICB9CisgICAgZ2FzX2ZpbmlzaAorICAgIGlmICEkeCB0aGVuIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCisjIFRoaXMgdGVzdCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlIFBBOyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scworIyBtdXN0IG5vdCBiZSByZXNvbHZlZCBieSB0aGUgYXNzZW1ibGVyLgoraWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4geworICAgICMgdGhlIHZheCBmYWlscyBiZWNhdXNlIFZNUyBjYW4gYXBwYXJlbnRseSBhY3R1YWxseSBoYW5kbGUgdGhpcworICAgICMgY2FzZSBpbiByZWxvY3MsIHNvIGdhcyBkb2Vzbid0IGhhbmRsZSBpdCBpdHNlbGYuCisgICAgc2V0dXBfeGZhaWwgInZheCotKi12bXMqIgorICAgIHNldHVwX3hmYWlsICJtbjEwMzAwKi0qLSoiCisgICAgc2V0dXBfeGZhaWwgIm1uMTAyMDAqLSotKiIKKyAgICBkb185MzA1MDlhCit9CisKK2Nhc2UgJHRhcmdldF90cmlwbGV0IGluIHsKKyAgICB7IGhwcGEqLSotKiB9IHsgfQorICAgIGRlZmF1bHQgeworCXJ1bl9kdW1wX3Rlc3Qgc3RydWN0CisJcnVuX2R1bXBfdGVzdCBhbGlnbgorICAgIH0KK30KKworIyBUaGlzIHRlc3QgaXMgZm9yIGFueSBDT0ZGIHRhcmdldC4KKyMgV2Ugb21pdCBtODhrIENPRkYgYmVjYXVzZSBpdCB1c2VzIHdlaXJkIHBzZXVkby1vcCBuYW1lcy4KKyMgV2Ugb21pdCB0aGUgQVJNIHRvb2xjaGFpbnMgYmVjYXVzZSB0aGV5IGRlZmluZSBsb2NhbHMgdG8KKyMgIHN0YXJ0IHdpdGggJy4nLCB3aGljaCBlbGltaW5hdGVzIC5lb3MsIC50ZXh0IGV0YyBmcm9tIHRoZSBvdXRwdXQuCitpZiB7ICAgKFtpc3RhcmdldCAqLSotY29mZipdICYmICFbaXN0YXJnZXQgbTg4Ki0qLSpdICYmICFbaXN0YXJnZXQgKmFybSotKi1jb2ZmXSAmJiAhW2lzdGFyZ2V0IHRodW1iKi0qLWNvZmZdKSBcCisgICAgIHx8KFtpc3RhcmdldCAqLSotcGUqXSAmJiAhW2lzdGFyZ2V0IGFybSotKi1wZSpdICYmICFbaXN0YXJnZXQgdGh1bWIqLSotcGUqXSkgXAorICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXVkaSpdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi1lYm1vbipdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi1zeW0qXSBcCisgICAgIHx8IFtpc3RhcmdldCBhMjlrLSotdnh3b3JrcypdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1haXgqXSBcCisgICAgIHx8IFtpc3RhcmdldCBpKjg2LSotc2NvKl0gXAorICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWlzYypdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1nbzMyKl0gXAorICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLWN5Z3dpbipdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi0qbnRdIFwKKyAgICAgfHwgKFtpc3RhcmdldCBpOTYwLSotdnh3b3JrczUuKl0gJiYgIVtpc3RhcmdldCBpOTYwLSotdnh3b3JrczUuMCpdKSB9IHsKKyAgICBydW5fZHVtcF90ZXN0IGNvZmZ0YWcKK30KKworIyBUZXN0IG9taXR0aW5nIGNvbmRpdGlvbmFscyBmcm9tIGxpc3RpbmdzLgorcHJvYyB0ZXN0X2NvbmQge30geworICAgIGdsb2JhbCBjb21wX291dHB1dAorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisKKyAgICBzZXQgdGVzdG5hbWUgImNvbmRpdGlvbmFsIGxpc3RpbmdzIgorICAgIGdhc19ydW4gY29uZC5zIC1hbGMgIj5kdW1wLm91dCIKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHsKKwlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCisJZmFpbCAkdGVzdG5hbWUKKyAgICB9IGVsc2UgeworCWlmIHsgW3JlZ2V4cF9kaWZmIGR1bXAub3V0ICRzcmNkaXIvJHN1YmRpci9jb25kLmRdIH0geworCSAgICBmYWlsICR0ZXN0bmFtZQorCX0gZWxzZSB7CisJICAgIHBhc3MgJHRlc3RuYW1lCisJfQorICAgIH0KK30KKwordGVzdF9jb25kCisKKyMgRklYTUU6IHRoaXMgaXMgaGVyZSBjYXVzZSBvZiBhIGJ1ZyBpbiBEZWphR251IDEuMS4xLiBXaGVuIGl0IGlzIG5vIGxvbmdlcgorIyAgICAgICAgaW4gdXNlLCB0aGVuIHRoaXMgY2FuIGJlIHJlbW92ZWQuCitpZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKKyAgICB1bnNldCBlcnJvckluZm8KK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2NmRmYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsCkBAIC0wLDAgKzEsMjAgQEAKKworICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KKyAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgorICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCisgICAgOyBUaGUgInA8bj4iIHJlcHJlc2VudCBwcm9jZXNzb3JzIG9mIGEgbXVsdGktcHJvY2Vzc29yIHN5c3RlbS4KKworICAgIHAxIGRyZWcgZDEgMSAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKKyAgICBwMSBjcmVnIGMzIDMgICAgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCisgICAgcDMgaW5zbiBmaWUgMHgxZToyNC0yMCAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMQorICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKKyAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgorICAgIHAzIGluc24gZmVlIDB4MWU6MjQtMjAsZHJlZzoxNy0xMyxjcmVnOjEyLTgsaW1tZWQ6Ny0wCisKKyAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCisgICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKKyAgICBwMyBpbnNuIGZ1bSAweDAxZTAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04CisgICAgcDMgaW5zbiBmb2ggMHhmOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMAorCisgICAgcDMgaW5zbiBwaWcgMHgxOjI0LTIxKlsweDEwMHwweDJdLCBkcmVnOjIwLTE2LCBpbW1lZDoxNS0wKjB4MTAwMDAKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2Y1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKQEAgLTAsMCArMSwxMjkgQEAKKworCisvKiBpdGJsLXRlc3QuYworCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgorCisgICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogU3RhbmQtYWxvbmUgdGVzdCBmb3IgaW5zdHJ1Y3Rpb24gc3BlY2lmaWNhdGlvbiB0YWJsZSBzdXBwb3J0LgorICAgUnVuIHVzaW5nICJpdGJsLXRlc3QgPGl0Ymw+IDxhc20ucz4iCisgICB3aGVyZSA8aXRibD4gaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uIHRhYmxlLAorICAgYW5kIDxhc20ucz4gaXMgdGhlIG5hbWUgb2YgdGhlIGFzc2VtYmxlciBmaWUuICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiaXRibC1vcHMuaCIKKworc3RhdGljIGludCB0ZXN0X3JlZyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKKwkJICAgICB1bnNpZ25lZCBsb25nIHZhbCk7CisKK2ludCAKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgdW5zaWduZWQgaW50IGluc247CisgIEZJTEUgKmZhczsKKyAgaW50IGFsaW5lID0gMDsKKyAgY2hhciBzWzgxXSwgKm5hbWU7CisKKyAgaWYgKGFyZ2MgPCAzKQorICAgIHsKKyAgICAgIHByaW50ZiAoInVzYWdlOiAlcyBpdGJsIGFzbS5zXG4iLCBhcmd2WzBdKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0KKyAgaWYgKGl0YmxfcGFyc2UgKGFyZ3ZbMV0pICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiZmFpbGVkIHRvIHBhcnNlIGl0YmxcbiIpOworICAgICAgZXhpdCAoMCk7CisgICAgfQorCisgIGZhcyA9IGZvcGVuIChhcmd2WzJdLCAiciIpOworICBpZiAoZmFzID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiZmFpbGVkIHRvIG9wZW4gYXNtIGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOworICAgICAgZXhpdCAoMCk7CisgICAgfQorICB3aGlsZSAoZmdldHMgKHMsIDgwLCBmYXMpKQorICAgIHsKKyAgICAgIGNoYXIgKnA7CisgICAgICBhbGluZSsrOworCisgICAgICBpZiAocCA9IHN0cmNociAocywgJzsnKSwgcCkJLyogc3RyaXAgY29tbWVudHMgKi8KKwkqcCA9IDA7CisgICAgICBpZiAocCA9IHN0cmNociAocywgJyMnKSwgcCkJLyogc3RyaXAgY29tbWVudHMgKi8KKwkqcCA9IDA7CisgICAgICBwID0gcyArIHN0cmxlbiAocykgLSAxOworICAgICAgd2hpbGUgKHAgPj0gcyAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykpCS8qIHN0cmlwIHRyYWlsaW5nIHNwYWNlcyAqLworCXAtLTsKKyAgICAgICoocCArIDEpID0gMDsKKyAgICAgIHAgPSBzOworICAgICAgd2hpbGUgKCpwICYmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKSkJLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KKwlwKys7CisgICAgICBpZiAoISpwKQorCWNvbnRpbnVlOworCisgICAgICBuYW1lID0gaXRibF9nZXRfZmllbGQgKCZwKTsKKyAgICAgIGluc24gPSBpdGJsX2Fzc2VtYmxlIChuYW1lLCBwKTsKKyAgICAgIGlmIChpbnNuID09IDApCisJcHJpbnRmICgibGluZSAlZDogSW52YWxpZCBpbnN0cnVjdGlvbiAoJXMpXG4iLCBhbGluZSwgcyk7CisgICAgICBlbHNlCisJeworCSAgY2hhciBidWZbMTI4XTsKKwkgIHByaW50ZiAoImxpbmUgJWQ6IGluc24oJXMpID0gMHgleClcbiIsIGFsaW5lLCBzLCBpbnNuKTsKKwkgIGlmICghaXRibF9kaXNhc3NlbWJsZSAoYnVmLCBpbnNuKSkKKwkgICAgcHJpbnRmICgibGluZSAlZDogQ2FuJ3QgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb24gIgorCQkgICAgIigweCV4KVxuIiwgYWxpbmUsIGluc24pOworCSAgZWxzZQorCSAgICBwcmludGYgKCJsaW5lICVkOiBkaXNhc20oMHgleCkgPSAlcylcbiIsIGFsaW5lLCBpbnNuLCBidWYpOworCX0KKyAgICB9CisKKyAgdGVzdF9yZWcgKDEsIGVfZHJlZywgImQxIiwgMSk7CisgIHRlc3RfcmVnICgzLCBlX2NyZWcsICJjMiIsIDIyKTsKKyAgdGVzdF9yZWcgKDMsIGVfZHJlZywgImQzIiwgMyk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCit0ZXN0X3JlZyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKKwkgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworICBjaGFyICpuOworICB1bnNpZ25lZCBsb25nIHY7CisKKyAgbiA9IGl0YmxfZ2V0X25hbWUgKHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKKyAgaWYgKCFuIHx8IHN0cmNtcCAobiwgbmFtZSkpCisgICAgcHJpbnRmICgiRXJyb3IgLSByZWcgbmFtZSBub3QgZm91bmQgZm9yIHByb2Vzc29yPSVkLCB0eXBlPSVkLCB2YWw9JWRcbiIsCisJICAgIHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIm5hbWU9JXMgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgdmFsPSVkXG4iLAorCSAgICBuLCBwcm9jZXNzb3IsIHR5cGUsIHZhbCk7CisKKyAgLyogV2UgcmVxdWlyZSB0aGF0IG5hbWVzIGJlIHVuaXF1ZSBhbW91bmcgcHJvY2Vzc29ycyBhbmQgdHlwZXMuICovCisgIHYgPSBpdGJsX2dldF9yZWdfdmFsIChuYW1lKTsKKyAgaWYgKCF2IHx8IHYgIT0gdmFsKQorICAgIHByaW50ZiAoIkVycm9yIC0gcmVnIHZhbCBub3QgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKKwkgICAgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKKyAgZWxzZQorICAgIHByaW50ZiAoInZhbD0weCV4IGZvdW5kIGZvciBwcm9jZXNzb3I9JWQsIHR5cGU9JWQsIG5hbWU9JXNcbiIsCisJICAgIHYsIHByb2Nlc3NvciwgdHlwZSwgbmFtZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1MWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLnMKQEAgLTAsMCArMSwxMyBAQAorCisgICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgorICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCisgICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KKworICAgIDsgQXNzZW1ibGUgcHJvY2Vzc29yIGluc3RydWN0aW9ucyBhcyBkZWZpbmVkIGluICJpdGJsIi4KKworICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQorICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAorICAgIGZvaCAkMiwweDEwMAorICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQorICAgIHBpZyAkMiwweDEwMAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGJhODEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucwpAQCAtMCwwICsxLDMgQEAKK3N0YXJ0OgkubG9uZyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3CisJLnNwYWNlIDB4ODAgLSAoLiAtIHN0YXJ0KQorZm9vOgkubG9uZyA0MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDI0MjUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlkYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKQEAgLTAsMCArMSw2IEBACisJLnRleHQKKwkuZ2xvYmwgX2Zyb2JuaXR6CitfZnJvYm5pdHo6CisJLmxvbmcgMSwgMiwgMywgNCwgNSwgNiwgNywgR1JVTVAsIDQyCisJR1JVTVA9Li1fZnJvYm5pdHoKKwlIQUxGR1JVTVA9R1JVTVAvMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzVkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQKQEAgLTAsMCArMSw4IEBACisjbm06IC0tZXh0ZXJuLW9ubHkKKyNuYW1lOiBzdHJ1Y3QKKworIyBUZXN0IHRoZSAuc3RydWN0IHBzZXVkby1vcC4KKworMCswMCBBIHcxCiswKzAyIEEgdzIKKzArMDQgQSB3MwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2ZkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LnMKQEAgLTAsMCArMSwxMCBAQAorCS5nbG9ibAl3MQorCS5nbG9ibAl3MgorCS5nbG9ibAl3MworCS5sb25nCTAKKwkuc3RydWN0CTAKK3cxOgkuc2hvcnQJMAordzI6CS5zaG9ydAkwCit3MzoJLnNob3J0CTAKKwkudGV4dAorCS5sb25nCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC94OTMwNTA5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTk5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zCkBAIC0wLDAgKzEsMyBAQAorCS5sb25nIEwyLUwxCitMMToJLmxvbmcgMHgxMjM0CitMMjoJLmxvbmcgMHg1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZmN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZApAQCAtMCwwICsxLDcgQEAKKworLio6ICAgICBmaWxlIGZvcm1hdCBlY29mZi1saXR0bGVhbHBoYQorCitDb250ZW50cyBvZiBzZWN0aW9uIC5yZGF0YToKKyAwMDAwIDcxYTM3OTA5IDRmOTMwYTQwIDU0NDE3ODlhIGNkNGI4ODFiICBxLnkuTy4uQFRBeC4uSy4uCisgMDAxMCAyYTQwNGY5MyA3OTA5NzFhMyA3ODlhNTQ0MCA1NDQxNzg5YSAgLkBPLnkucS54LlRAVEF4LgorIDAwMjAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVjODgxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAuZXhwCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgQWxwaGEgT1NGLzEgdGVzdHMKKyMKKworaWYgW2lzdGFyZ2V0IGFscGhhLSotb3NmKl0gdGhlbiB7CisgICAgc2V0IHRlc3RuYW1lICJmcCBjb25zdGFudHMgKHBhcnQgMikiCisgICAgaWYgW2dhc190ZXN0X29sZCAiZnAucyIgIiIgImZwIGNvbnN0YW50cyAocGFydCAxKSJdIHRoZW4geworCW9iamR1bXAgIi1zIC1qIC5yZGF0YSA+IGEuZHVtcCIKKwlpZiB7IFtyZWdleHBfZGlmZiAiYS5kdW1wIiAiJHNyY2Rpci8kc3ViZGlyL2ZwLmQiXSA9PSAwIH0gdGhlbiB7CisJICAgIHBhc3MgJHRlc3RuYW1lCisJfSBlbHNlIHsKKwkgICAgZmFpbCAkdGVzdG5hbWUKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxwaGEvZnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlYmJiZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMKQEAgLTAsMCArMSwxNCBAQAorCS5yZGF0YQorIyBUaGVzZSB0aHJlZSBmb3JtYXRzIGFyZSA4IGJ5dGVzIGVhY2guCisJLnRfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCisjCS5ieXRlIDB4NzEsIDB4YTMsIDB4NzksIDB4MDksIDB4NGYsIDB4OTMsIDB4MGEsIDB4NDAKKwkuZF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKKyMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMHhjZCwgMHg0YiwgMHg4OCwgMHgxYgorCS5nX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAorIwkuYnl0ZSAweDJhLCAweDQwLCAweDRmLCAweDkzLCAweDc5LCAweDA5LCAweDcxLCAweGEzCisjIFRoZSBuZXh0IHR3byBhcmUgZm91ciBieXRlcyBlYWNoLgorCS5zX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAorIwkuYnl0ZSAweDc4LCAweDlhLCAweDU0LCAweDQwLCAwLCAwLCAwLCAwCisJLmZfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCisjCS5ieXRlIDB4NTQsIDB4NDEsIDB4NzgsIDB4OWEsIDAsIDAsIDAsIDAKKwkubG9uZyAwLCAwLCAwLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWFjZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMuZApAQCAtMCwwICsxLDY4IEBACisjb2JqZHVtcDogLWRyCisjbmFtZTogQE9DQAorCisjIFRlc3QgdGhlIEBPQ0AgaW5zbi4KKworLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYworCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMDAwMDAwMDAgQElDKzBAMDA4MjAwCUBPQ0AgcjAscjEKKzAwMDAwMDA0IEBJQyszQDZlMzgwMAlAT0NAIGZwLHNwCiswMDAwMDAwOCBASUMrMEAxZmZlMDAJQE9DQCByMCwwCiswMDAwMDAwYyBASUMrMEAzZmZmZmYJQE9DQCByMSwtMQorMDAwMDAwMTAgQElDKzdAZTEwNDAwCUBPQ0AgMCxyMgorMDAwMDAwMTQgQElDKzdAZTE4N2ZmCUBPQ0AgLTEscjMKKzAwMDAwMDE4IEBJQyswQDlmZmVmZglAT0NAIHI0LDI1NQorMDAwMDAwMWMgQElDKzdAZTI4YWZmCUBPQ0AgMjU1LHI1CiswMDAwMDAyMCBASUMrMEBkZmZmMDAJQE9DQCByNiwtMjU2CiswMDAwMDAyNCBASUMrN0BlMzhmMDAJQE9DQCAtMjU2LHI3CiswMDAwMDAyOCBASUMrMUAxZjdjMDAJQE9DQCByOCwyNTYKKzAwMDAwMDMwIEBJQysxQDNmN2MwMAlAT0NAIHI5LC0yNTcKKzAwMDAwMDM4IEBJQys3QGM1MTQwMAlAT0NAIDUxMSxyMTAKKzAwMDAwMDQwIEBJQysxQDdmN2MwMAlAT0NAIHIxMSwxMTExNjM4NTk0CiswMDAwMDA0OCBASUMrN0BjNjE4MDAJQE9DQCAzMDU0MTk4OTYscjEyCiswMDAwMDA1MCBASUMrN0BmZjdjZmYJQE9DQCAyNTUsMjU2CiswMDAwMDA1OCBASUMrN0BkZmZlZmYJQE9DQCAyNTYsMjU1CiswMDAwMDA2MCBASUMrMEAxZjdjMDAJQE9DQCByMCwwCisJCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KKzAwMDAwMDY4IEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCiswMDAwMDA2YyBASUMrMEA2MjA4MDAJQE9DQCByMyxyNAorMDAwMDAwNzAgQElDKzBAYzM4ZTAxCUBPQ0AuZXEgcjYscjcKKzAwMDAwMDc0IEBJQysxQDI1MTQwMQlAT0NALmVxIHI5LHIxMAorMDAwMDAwNzggQElDKzFAODY5YTAyCUBPQ0AubmUgcjEyLHIxMworMDAwMDAwN2MgQElDKzFAZTgyMDAyCUBPQ0AubmUgcjE1LHIxNgorMDAwMDAwODAgQElDKzJANDlhNjAzCUBPQ0AucCByMTgscjE5CiswMDAwMDA4NCBASUMrMkBhYjJjMDMJQE9DQC5wIHIyMSxyMjIKKzAwMDAwMDg4IEBJQyszQDBjYjIwNAlAT0NALm4gcjI0LHIyNQorMDAwMDAwOGMgQElDKzNANmUzODA0CUBPQ0AubiBmcCxzcAorMDAwMDAwOTAgQElDKzNAY2ZiZTA1CUBPQ0AuYyBpbGluazIsYmxpbmsKKzAwMDAwMDk0IEBJQys0QDMxNDQwNQlAT0NALmMgcjMzLHIzNAorMDAwMDAwOTggQElDKzRAOTJjYTA1CUBPQ0AuYyByMzYscjM3CiswMDAwMDA5YyBASUMrNEBmNDUwMDYJQE9DQC5uYyByMzkscjQwCiswMDAwMDBhMCBASUMrNUA1NWQ2MDYJQE9DQC5uYyByNDIscjQzCiswMDAwMDBhNCBASUMrNUBiNzVjMDYJQE9DQC5uYyByNDUscjQ2CiswMDAwMDBhOCBASUMrNkAxOGUyMDcJQE9DQC52IHI0OCxyNDkKKzAwMDAwMGFjIEBJQys2QDdhNjgwNwlAT0NALnYgcjUxLHI1MgorMDAwMDAwYjAgQElDKzZAZGJlZTA4CUBPQ0AubnYgcjU0LHI1NQorMDAwMDAwYjQgQElDKzdAM2Q3NDA4CUBPQ0AubnYgcjU3LHI1OAorMDAwMDAwYjggQElDKzdAOWU3ODA5CUBPQ0AuZ3QgbHBfY291bnQsbHBfY291bnQKKzAwMDAwMGJjIEBJQyswQDFmN2MwYQlAT0NALmdlIHIwLDAKKzAwMDAwMGM0IEBJQys3QGMwODIwYglAT0NALmx0IDEscjEKKzAwMDAwMGNjIEBJQys3QGRmN2MwYwlAT0NALmxlIDIsMgorMDAwMDAwZDQgQElDKzBANjE4NjBkCUBPQ0AuaGkgcjMscjMKKzAwMDAwMGQ4IEBJQyswQDgyMDgwZQlAT0NALmxzIHI0LHI0CiswMDAwMDBkYyBASUMrMEBhMjhhMGYJQE9DQC5wbnogcjUscjUKKzAwMDAwMGUwIEBJQyswQDAwODMwMAlAT0NALmYgcjAscjEKKzAwMDAwMGU0IEBJQyswQDVlZmEwMQlAT0NALmYgcjIsMQorMDAwMDAwZTggQElDKzdAYTE4NjAxCUBPQ0AuZiAxLHIzCiswMDAwMDBlYyBASUMrN0BhMjA4MDAJQE9DQC5mIDAscjQKKzAwMDAwMGYwIEBJQyswQGJmN2QwMAlAT0NALmYgcjUsNTEyCiswMDAwMDBmOCBASUMrN0BjMzBkMDAJQE9DQC5mIDUxMixyNgorMDAwMDAxMDAgQElDKzdAZGY3ZDAwCUBPQ0AuZiA1MTIsNTEyCiswMDAwMDEwOCBASUMrMEAwMDgzMDEJQE9DQC5lcS5mIHIwLHIxCiswMDAwMDEwYyBASUMrMEAzZjdkMDIJQE9DQC5uZS5mIHIxLDAKKzAwMDAwMTE0IEBJQys3QGMxMDUwYglAT0NALmx0LmYgMCxyMgorMDAwMDAxMWMgQElDKzdAYzEwNTA5CUBPQ0AuZ3QuZiAxLHIyCiswMDAwMDEyNCBASUMrMEAxZjdkMGMJQE9DQC5sZS5mIHIwLDUxMgorMDAwMDAxMmMgQElDKzdAYzEwNTBhCUBPQ0AuZ2UuZiA1MTIscjIKKzAwMDAwMTM0IEBJQys3QGRmN2QwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjQ0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucwpAQCAtMCwwICsxLDc2IEBACisjIEBPQ0AgdGVzdAorCisjIHJlZyxyZWcKKwlAT0NAIHIwLHIxCisJQE9DQCBmcCxzcAorCisjIHNoaW1tIHZhbHVlcworCUBPQ0AgcjAsMAorCUBPQ0AgcjEsLTEKKwlAT0NAIDAscjIKKwlAT0NAIC0xLHIzCisJQE9DQCByNCwyNTUKKwlAT0NAIDI1NSxyNQorCUBPQ0AgcjYsLTI1NgorCUBPQ0AgLTI1NixyNworCisjIGxpbW0gdmFsdWVzCisJQE9DQCByOCwyNTYKKwlAT0NAIHI5LC0yNTcKKwlAT0NAIDUxMSxyMTAKKwlAT0NAIHIxMSwweDQyNDI0MjQyCisJQE9DQCAweDEyMzQ1Njc4LHIxMgorCisjIHNoaW1tIGFuZCBsaW1tCisJQE9DQCAyNTUsMjU2CisJQE9DQCAyNTYsMjU1CisKKyMgc3ltYm9scworCUBPQ0AgcjAsZm9vCisKKyMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCisJQE9DQC5hbCByMCxyMQorCUBPQ0AucmEgcjMscjQKKwlAT0NALmVxIHI2LHI3CisJQE9DQC56IHI5LHIxMAorCUBPQ0AubmUgcjEyLHIxMworCUBPQ0AubnogcjE1LHIxNgorCUBPQ0AucGwgcjE4LHIxOQorCUBPQ0AucCByMjEscjIyCisJQE9DQC5taSByMjQscjI1CisJQE9DQC5uIHIyNyxyMjgKKwlAT0NALmNzIHIzMCxyMzEKKwlAT0NALmMgcjMzLHIzNAorCUBPQ0AubG8gcjM2LHIzNworCUBPQ0AuY2MgcjM5LHI0MAorCUBPQ0AubmMgcjQyLHI0MworCUBPQ0AuaHMgcjQ1LHI0NgorCUBPQ0AudnMgcjQ4LHI0OQorCUBPQ0AudiByNTEscjUyCisJQE9DQC52YyByNTQscjU1CisJQE9DQC5udiByNTcscjU4CisJQE9DQC5ndCByNjAscjYwCisJQE9DQC5nZSByMCwwCisJQE9DQC5sdCAxLHIxCisJQE9DQC5sZSAyLDIKKwlAT0NALmhpIHIzLHIzCisJQE9DQC5scyByNCxyNAorCUBPQ0AucG56IHI1LHI1CisKKyMgZmxhZyBzZXR0aW5nCisJQE9DQC5mIHIwLHIxCisJQE9DQC5mIHIyLDEKKwlAT0NALmYgMSxyMworCUBPQ0AuZiAwLHI0CisJQE9DQC5mIHI1LDUxMgorCUBPQ0AuZiA1MTIscjYKKwlAT0NALmYgNTEyLDUxMgorCisjIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZworCUBPQ0AuZXEuZiByMCxyMQorCUBPQ0AubmUuZiByMSwwCisJQE9DQC5sdC5mIDAscjIKKwlAT0NALmd0LmYgMSxyMgorCUBPQ0AubGUuZiByMCw1MTIKKwlAT0NALmdlLmYgNTEyLHIyCisJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYXJjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk4NDUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKQEAgLTAsMCArMSwxMTQgQEAKKyMgQVJDIGdhcyB0ZXN0c3VpdGUKKworIyBUZXN0IGFuIGluc24gZnJvbSBhIHRlbXBsYXRlIC5zLy5kLgorIyBUaGUgYmVzdCB3YXkgdG8gY3JlYXRlIHRoZSAuZCBmaWxlIGlzIHRvIHJ1biB0aGUgdGVzdHMgd2l0aG91dCBpdCwgbGV0CisjIGRlamFnbnUgY3Jhc2gsIHJ1biBhcy5uZXcgb24gdGhlIGp1c3QgYnVpbHQgLnMgZmlsZSwgcnVuIG9iamR1bXAgLWRyIG9uCisjIHRoZSByZXN1bHQgb2YgdGhhdCwgY29weSB0aGUgcmVzdWx0IGludG8gdGhlIC5kIGZpbGUsIGFuZCBlZGl0IGluIHRoZQorIyBuZWNlc3NhcnkgcGF0dGVybnMgKEBPQ0AsIGV0Yy4pLiAgU291bmRzIGNvbXBsaWNhdGVkIGJ1dCBpdCdzIGVhc3kuICBUaGUKKyMgY2F0Y2ggaXMgdGhhdCB3ZSBhc3N1bWUgYSB3b3JraW5nIGFzc2VtYmxlciBpcyB1c2VkIHRvIGJ1aWxkIGl0LiAgVGhhdCdzCisjIG9idmlvdXNseSBub3QgZW50aXJlbHkga29zaGVyLCBidXQgb25jZSB0aGUgLmQgZmlsZSBpcyBjcmVhdGVkIG9uZSBjYW4KKyMgdmVyaWZ5IGl0J3MgY29udGVudHMgb3ZlciB0aW1lLgorIworIyBUZW1wbGF0ZSBwYXR0ZXJuczoKKyMgQE9DQCAtIHBsYWNlaG9sZGVyIGZvciB0aGUgb3Bjb2RlCisjIEBJQys/QCAtIHBsYWNlIGhvbGRlciBmb3IgdGhlIGluc24gY29kZQorIyBASTMrPz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgb3BlcmF0aW9uIGNvZGUgb2YgY29kZSAzIGluc25zLgorCitwcm9jIHRlc3RfdGVtcGxhdGVfaW5zbiB7IGNwdSB0bXBsIG9wY29kZSBpY29kZSB9IHsKKyAgICBnbG9iYWwgc3JjZGlyIHN1YmRpciBvYmpkaXIKKworICAgICMgQ2hhbmdlIEBPQ0AgaW4gdGhlIHRlbXBsYXRlIGZpbGUgdG8gJG9wY29kZQorCisgICAgc2V0IGluX2ZkIFtvcGVuICRzcmNkaXIvJHN1YmRpci8kdG1wbC5zIHJdCisgICAgc2V0IG91dF9mZCBbb3BlbiAkb2JqZGlyLyRvcGNvZGUucyB3XQorICAgICMgRklYTUU6IGNoZWNrIHJldHVybiBjb2RlcworCisgICAgcHV0cyAkb3V0X2ZkICJcdC5jcHUgJGNwdVxuIgorICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7CisJcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKKwlwdXRzICRvdXRfZmQgJGxpbmUKKyAgICB9CisKKyAgICBjbG9zZSAkaW5fZmQKKyAgICBjbG9zZSAkb3V0X2ZkCisKKyAgICAjIENyZWF0ZSBvdXRwdXQgdGVtcGxhdGUuCisKKyAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLmQgcl0KKyAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5kIHddCisgICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCisKKyAgICB3aGlsZSB7IFtnZXRzICRpbl9mZCBsaW5lXSA+PSAwIH0geworCXJlZ3N1YiAiQE9DQCIgJGxpbmUgJG9wY29kZSBsaW5lCisJI3NlbmRfdXNlciAiJGxpbmVcbiIKKwlpZiBbc3RyaW5nIG1hdGNoICIqQElDKz9AKiIgJGxpbmVdIHsKKwkgICAgIyBJbnNlcnQgdGhlIG9wY29kZS4gIEl0IG9jY3VwaWVzIHRoZSB0b3AgNSBiaXRzLgorCSAgICByZWdleHAgIl4oLiopQElDXFwrKC4pQCguKikkIiAkbGluZSBqdW5rIGxlZnRwYXJ0IG4gcmlnaHRwYXJ0CisJICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMykgKyAkbl0KKwkgICAgc2V0IG4gW2Zvcm1hdCAiJTAyeCIgJG5dCisJICAgIHB1dHMgJG91dF9mZCAiJGxlZnRwYXJ0JG4kcmlnaHRwYXJ0IgorCX0gZWxzZWlmIFtzdHJpbmcgbWF0Y2ggIipASTMrPz9AKiIgJGxpbmVdIHsKKwkgICAgIyBJbnNlcnQgaW5zbiAzIGNvZGUgKHJlZ2lzdGVyIEMgZmllbGQpCisJICAgICMgYjE1PTgvMCwgYjg9MS8wICh0aGVpciByZXNwZWN0aXZlIGhleCB2YWx1ZXMgaW4gdGhlIG9iamR1bXApCisJICAgIHJlZ2V4cCAiXiguKilASTNcXCsoLikoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgYjE1IGI4IHJpZ2h0cGFydAorCSAgICBzZXQgbiBbZXhwciAoJGljb2RlIDw8IDEpICsgKCRiMTUgPDwgNCkgKyAoJGI4IDw8IDApXQorCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KKwkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCisJfSBlbHNlIHsKKwkgICAgcHV0cyAkb3V0X2ZkICRsaW5lCisJfQorICAgIH0KKworICAgIGNsb3NlICRpbl9mZAorICAgIGNsb3NlICRvdXRfZmQKKworICAgICMgRmluYWxseSwgcnVuIHRoZSB0ZXN0LgorCisgICAgcnVuX2R1bXBfdGVzdCAkb2JqZGlyLyRvcGNvZGUKKworICAgICMgIm1ha2UgY2xlYW4iIHdvbid0IGRlbGV0ZSB0aGVzZSwgc28gZm9yIG5vdyB3ZSBtdXN0LgorICAgIGNhdGNoICJleGVjIHJtIC1mICRvYmpkaXIvJG9wY29kZS5zICRvYmpkaXIvJG9wY29kZS5kIgorfQorCisjIFJ1biB0aGUgdGVzdHMuCisKK2lmIFtpc3RhcmdldCBhcmMqLSotKl0gdGhlbiB7CisKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkYyA5CisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhZGQgOAorICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYW5kIDEyCisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBiaWMgMTQKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIG9yIDEzCisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBzYmMgMTEKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHN1YiAxMAorICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggeG9yIDE1CisKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBtb3YgMTIKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBhbGlhcyBybGMgOQorICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGFzbCA4CisjIGBsc2wnIGdldHMgZHVtcGVkIGFzIGBhc2wnIHNvIHRoaXMgbXVzdCBiZSB0ZXN0ZWQgZWxzZXdoZXJlLgorIyAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIGxzbCA4CisKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgYXNyIDEKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgbHNyIDIKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcm9yIDMKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBzc2hpZnQgcnJjIDQKKworICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBiIDQKKyAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBicmFuY2ggYmwgNQorICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBscCA2CisKKyAgICBydW5fZHVtcF90ZXN0ICJqIgorCisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4YiA1CisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgc2V4dyA2CisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0YiA3CisgICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgaW5zbjMgZXh0dyA4CisKKyAgICBydW5fZHVtcF90ZXN0ICJmbGFnIgorIyAgICBydW5fZHVtcF90ZXN0ICJub3AiCisKKyAgICBydW5fZHVtcF90ZXN0ICJsZCIKKyAgICBydW5fZHVtcF90ZXN0ICJzdCIKKworfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQKQEAgLTAsMCArMSw0NSBAQAorI29iamR1bXA6IC1kcgorI25hbWU6IEBPQ0AKKworIyBUZXN0IHRoZSBAT0NAIGluc24uCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzAwMDAwMDAwIDx0ZXh0X2xhYmVsPiBASUMrN0BmZmZmODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDA0IDx0ZXh0X2xhYmVsXCs0PiBASUMrN0BmZmZmMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDA4IDx0ZXh0X2xhYmVsXCs4PiBASUMrN0BmZmZlODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiBASUMrN0BmZmZlMDEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwMTAgPHRleHRfbGFiZWxcKzEwPiBASUMrN0BmZmZkODEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiBASUMrN0BmZmZkMDIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwMTggPHRleHRfbGFiZWxcKzE4PiBASUMrN0BmZmZjODIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiBASUMrN0BmZmZjMDMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IEBJQys3QGZmZmI4MwlAT0NAcCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDI0IDx0ZXh0X2xhYmVsXCsyND4gQElDKzdAZmZmYjA0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwMjggPHRleHRfbGFiZWxcKzI4PiBASUMrN0BmZmZhODQJQE9DQG4gMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDAyYyA8dGV4dF9sYWJlbFwrMmM+IEBJQys3QGZmZmEwNQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gQElDKzdAZmZmOTg1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwMzQgPHRleHRfbGFiZWxcKzM0PiBASUMrN0BmZmY5MDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IEBJQys3QGZmZjg4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDAzYyA8dGV4dF9sYWJlbFwrM2M+IEBJQys3QGZmZjgwNglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDA0MCA8dGV4dF9sYWJlbFwrNDA+IEBJQys3QGZmZjc4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDA0NCA8dGV4dF9sYWJlbFwrNDQ+IEBJQys3QGZmZjcwNwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gQElDKzdAZmZmNjg3CUBPQ0B2IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNGMgPHRleHRfbGFiZWxcKzRjPiBASUMrN0BmZmY2MDgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiBASUMrN0BmZmY1ODgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNTQgPHRleHRfbGFiZWxcKzU0PiBASUMrN0BmZmY1MDkJQE9DQGd0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiBASUMrN0BmZmY0OGEJQE9DQGdlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNWMgPHRleHRfbGFiZWxcKzVjPiBASUMrN0BmZmY0MGIJQE9DQGx0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiBASUMrN0BmZmYzOGMJQE9DQGxlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNjQgPHRleHRfbGFiZWxcKzY0PiBASUMrN0BmZmYzMGQJQE9DQGhpIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiBASUMrN0BmZmYyOGUJQE9DQGxzIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwNmMgPHRleHRfbGFiZWxcKzZjPiBASUMrN0BmZmYyMGYJQE9DQHBueiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPgorCQlSRUxPQzogMDAwMDAwNzAgUl9BUkNfQjIyX1BDUkVMIGV4dGVybmFsX3RleHRfbGFiZWwKKzAwMDAwMDc0IDx0ZXh0X2xhYmVsXCs3ND4gQElDKzBAMDAwMDAwCUBPQ0AgMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PgorMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiBASUMrN0BmZmYwYTAJQE9DQC5kIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgorMDAwMDAwN2MgPHRleHRfbGFiZWxcKzdjPiBASUMrN0BmZmYwMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gQElDKzdAZmZlZmMwCUBPQ0AuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+CiswMDAwMDA4NCA8dGV4dF9sYWJlbFwrODQ+IEBJQys3QGZmZWYyMQlAT0NAZXEuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gQElDKzdAZmZlZTgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KKzAwMDAwMDhjIDx0ZXh0X2xhYmVsXCs4Yz4gQElDKzdAZmZlZTQ2CUBPQ0BuYy5qZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmYxNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5zCkBAIC0wLDAgKzEsNDcgQEAKKyMgQE9DQCB0ZXN0CisJCit0ZXh0X2xhYmVsOgorCisjIENvbmRpdGlvbiB0ZXN0cworCUBPQ0AJdGV4dF9sYWJlbAorCUBPQ0BhbAl0ZXh0X2xhYmVsCisJQE9DQHJhCXRleHRfbGFiZWwKKwlAT0NAZXEJdGV4dF9sYWJlbAorCUBPQ0B6CXRleHRfbGFiZWwKKwlAT0NAbmUJdGV4dF9sYWJlbAorCUBPQ0Buegl0ZXh0X2xhYmVsCisJQE9DQHBsCXRleHRfbGFiZWwKKwlAT0NAcAl0ZXh0X2xhYmVsCisJQE9DQG1pCXRleHRfbGFiZWwKKwlAT0NAbgl0ZXh0X2xhYmVsCisJQE9DQGNzCXRleHRfbGFiZWwKKwlAT0NAYwl0ZXh0X2xhYmVsCisJQE9DQGxvCXRleHRfbGFiZWwKKwlAT0NAY2MJdGV4dF9sYWJlbAorCUBPQ0BuYwl0ZXh0X2xhYmVsCisJQE9DQGhzCXRleHRfbGFiZWwKKwlAT0NAdnMJdGV4dF9sYWJlbAorCUBPQ0B2CXRleHRfbGFiZWwKKwlAT0NAdmMJdGV4dF9sYWJlbAorCUBPQ0Budgl0ZXh0X2xhYmVsCisJQE9DQGd0CXRleHRfbGFiZWwKKwlAT0NAZ2UJdGV4dF9sYWJlbAorCUBPQ0BsdAl0ZXh0X2xhYmVsCisJQE9DQGxlCXRleHRfbGFiZWwKKwlAT0NAaGkJdGV4dF9sYWJlbAorCUBPQ0Bscwl0ZXh0X2xhYmVsCisJQE9DQHBuegl0ZXh0X2xhYmVsCisKKwlAT0NACWV4dGVybmFsX3RleHRfbGFiZWwKKworCUBPQ0AJMAorCisjIERlbGF5IHNsb3RzCisJQE9DQC5kCXRleHRfbGFiZWwKKwlAT0NALm5kCXRleHRfbGFiZWwKKwlAT0NALmpkCXRleHRfbGFiZWwKKworIyBDb25kaXRpb24gdGVzdHMgYW5kIGRlbGF5IHNsb3RzCisJQE9DQGVxLmQJdGV4dF9sYWJlbAorCUBPQ0BuZS5uZAl0ZXh0X2xhYmVsCisJQE9DQGNjLmpkCXRleHRfbGFiZWwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjM2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kCkBAIC0wLDAgKzEsMjkgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBmbGFnCisKKyMgVGVzdCB0aGUgZmxhZyBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYworCitObyBzeW1ib2xzIGluICJhLm91dCIuCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMDAwMDAwMDAgMWZhMDAwMDAJZmxhZyByMAorMDAwMDAwMDQgMWZiZjgwMDEJZmxhZyAxCiswMDAwMDAwOCAxZmJmODAwMglmbGFnIDIKKzAwMDAwMDBjIDFmYmY4MDA0CWZsYWcgNAorMDAwMDAwMTAgMWZiZjgwMDgJZmxhZyA4CiswMDAwMDAxNCAxZmJmODAxMAlmbGFnIDE2CiswMDAwMDAxOCAxZmJmODAyMAlmbGFnIDMyCiswMDAwMDAxYyAxZmJmODA0MAlmbGFnIDY0CiswMDAwMDAyMCAxZmJmODA4MAlmbGFnIDEyOAorMDAwMDAwMjQgMWZiZjAwMDAJZmxhZyAtMjE0NzQ4MzY0NworMDAwMDAwMmMgMWZhMDAwMGIJZmxhZy5sdCByMAorMDAwMDAwMzAgMWZiZjAwMDkJZmxhZy5ndCAxCiswMDAwMDAzOCAxZmJmMDAwOQlmbGFnLmd0IDIKKzAwMDAwMDQwIDFmYmYwMDA5CWZsYWcuZ3QgNAorMDAwMDAwNDggMWZiZjAwMDkJZmxhZy5ndCA4CiswMDAwMDA1MCAxZmJmMDAwOQlmbGFnLmd0IDE2CiswMDAwMDA1OCAxZmJmMDAwOQlmbGFnLmd0IDMyCiswMDAwMDA2MCAxZmJmMDAwOQlmbGFnLmd0IDY0CiswMDAwMDA2OCAxZmJmMDAwOQlmbGFnLmd0IDEyOAorMDAwMDAwNzAgMWZiZjAwMGEJZmxhZy5nZSAtMjE0NzQ4MzY0NwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2N2FhNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9mbGFnLnMKQEAgLTAsMCArMSwyNyBAQAorIyBmbGFnIHRlc3QKKworCWZsYWcJcjAKKworCWZsYWcJMQorCWZsYWcJMgorCWZsYWcJNAorCWZsYWcJOAorCWZsYWcJMTYKKwlmbGFnCTMyCisJZmxhZwk2NAorCWZsYWcJMTI4CisKKwlmbGFnCTB4ODAwMDAwMDEKKworCWZsYWcubHQJcjAKKworCWZsYWcuZ3QJMQorCWZsYWcuZ3QJMgorCWZsYWcuZ3QJNAorCWZsYWcuZ3QJOAorCWZsYWcuZ3QJMTYKKwlmbGFnLmd0CTMyCisJZmxhZy5ndAk2NAorCWZsYWcuZ3QJMTI4CisKKwlmbGFnLmdlCTB4ODAwMDAwMDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyMDdhNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kCkBAIC0wLDAgKzEsNDQgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBAT0NACisKKyMgVGVzdCB0aGUgQE9DQCBpbnNuLgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswMDAwMDAwMCAxODAwQEkzKzgwQDAwCUBPQ0AgcjAscjEKKzAwMDAwMDA0IDFiNmVASTMrMDBAMDAJQE9DQCBmcCxzcAorMDAwMDAwMDggMTgxZkBJMys4MEAwMAlAT0NAIHIwLDAKKzAwMDAwMDBjIDE4M2ZASTMrODFAZmYJQE9DQCByMSwtMQorMDAwMDAwMTAgMWZlMUBJMyswMEAwMAlAT0NAIDAscjIKKzAwMDAwMDE0IDFmZTFASTMrODFAZmYJQE9DQCAtMSxyMworMDAwMDAwMTggMTg5ZkBJMys4MEBmZglAT0NAIHI0LDI1NQorMDAwMDAwMWMgMWZlMkBJMys4MEBmZglAT0NAIDI1NSxyNQorMDAwMDAwMjAgMThkZkBJMys4MUAwMAlAT0NAIHI2LC0yNTYKKzAwMDAwMDI0IDFmZTNASTMrODFAMDAJQE9DQCAtMjU2LHI3CiswMDAwMDAyOCAxOTFmQEkzKzAwQDAwCUBPQ0AgcjgsMjU2CiswMDAwMDAzMCAxOTNmQEkzKzAwQDAwCUBPQ0AgcjksLTI1NworMDAwMDAwMzggMWZjNUBJMyswMEAwMAlAT0NAIDUxMSxyMTAKKzAwMDAwMDQwIDE5N2ZASTMrMDBAMDAJQE9DQCByMTEsMTExMTYzODU5NAorMDAwMDAwNDggMWZjNkBJMyswMEAwMAlAT0NAIDMwNTQxOTg5NixyMTIKKzAwMDAwMDUwIDFmZmZASTMrMDBAZmYJQE9DQCAyNTUsMjU2CiswMDAwMDA1OCAxZmRmQEkzKzgwQGZmCUBPQ0AgMjU2LDI1NQorMDAwMDAwNjAgMTgxZkBJMyswMEAwMAlAT0NAIHIwLDAKKwkJUkVMT0M6IDAwMDAwMDY0IFJfQVJDXzMyIGZvbworMDAwMDAwNjggMTk0NUBJMys4MEAwMQlAT0NALmVxIHIxMCxyMTEKKzAwMDAwMDZjIDE5ODZASTMrODBAMDIJQE9DQC5uZSByMTIscjEzCiswMDAwMDA3MCAxOWRmQEkzKzAwQDBiCUBPQ0AubHQgcjE0LDAKKzAwMDAwMDc4IDE5ZmZASTMrMDBAMDkJQE9DQC5ndCByMTUsNTEyCiswMDAwMDA4MCAxODAwQEkzKzgxQDAwCUBPQ0AuZiByMCxyMQorMDAwMDAwODQgMTg1ZUBJMys4MEAwMQlAT0NALmYgcjIsMQorMDAwMDAwODggMWZhMkBJMyswMEAwMAlAT0NALmYgMCxyNAorMDAwMDAwOGMgMThiZkBJMyswMUAwMAlAT0NALmYgcjUsNTEyCiswMDAwMDA5NCAxZmMzQEkzKzAxQDAwCUBPQ0AuZiA1MTIscjYKKzAwMDAwMDljIDFmZGZASTMrMDFAMDAJQE9DQC5mIDUxMiw1MTIKKzAwMDAwMGE0IDE4MDBASTMrODFAMDEJQE9DQC5lcS5mIHIwLHIxCiswMDAwMDBhOCAxODNmQEkzKzAxQDAyCUBPQ0AubmUuZiByMSwwCiswMDAwMDBiMCAxZmMxQEkzKzAxQDBiCUBPQ0AubHQuZiAwLHIyCiswMDAwMDBiOCAxZmMxQEkzKzAxQDA5CUBPQ0AuZ3QuZiAxLHIyCiswMDAwMDBjMCAxODFmQEkzKzAxQDBjCUBPQ0AubGUuZiByMCw1MTIKKzAwMDAwMGM4IDFmYzFASTMrMDFAMGEJQE9DQC5nZS5mIDUxMixyMgorMDAwMDAwZDAgMWZkZkBJMyswMUAwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmZiODgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucwpAQCAtMCwwICsxLDUyIEBACisjIEluc24gMyBAT0NAIHRlc3QKKworIyByZWcscmVnCisJQE9DQCByMCxyMQorCUBPQ0AgZnAsc3AKKworIyBzaGltbSB2YWx1ZXMKKwlAT0NAIHIwLDAKKwlAT0NAIHIxLC0xCisJQE9DQCAwLHIyCisJQE9DQCAtMSxyMworCUBPQ0AgcjQsMjU1CisJQE9DQCAyNTUscjUKKwlAT0NAIHI2LC0yNTYKKwlAT0NAIC0yNTYscjcKKworIyBsaW1tIHZhbHVlcworCUBPQ0AgcjgsMjU2CisJQE9DQCByOSwtMjU3CisJQE9DQCA1MTEscjEwCisJQE9DQCByMTEsMHg0MjQyNDI0MgorCUBPQ0AgMHgxMjM0NTY3OCxyMTIKKworIyBzaGltbSBhbmQgbGltbQorCUBPQ0AgMjU1LDI1NgorCUBPQ0AgMjU2LDI1NQorCisjIHN5bWJvbHMKKwlAT0NAIHIwLGZvbworCisjIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgorCUBPQ0AuZXEgcjEwLHIxMQorCUBPQ0AubmUgcjEyLHIxMworCUBPQ0AubHQgcjE0LDAKKwlAT0NALmd0IHIxNSw1MTIKKworIyBmbGFnIHNldHRpbmcKKwlAT0NALmYgcjAscjEKKwlAT0NALmYgcjIsMQorCUBPQ0AuZiAwLHI0CisJQE9DQC5mIHI1LDUxMgorCUBPQ0AuZiA1MTIscjYKKwlAT0NALmYgNTEyLDUxMgorCisjIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZworCUBPQ0AuZXEuZiByMCxyMQorCUBPQ0AubmUuZiByMSwwCisJQE9DQC5sdC5mIDAscjIKKwlAT0NALmd0LmYgMSxyMgorCUBPQ0AubGUuZiByMCw1MTIKKwlAT0NALmdlLmYgNTEyLHIyCisJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxMDNmMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9qLmQKQEAgLTAsMCArMSw3NSBAQAorI29iamR1bXA6IC1kcgorI25hbWU6IGoKKworIyBUZXN0IHRoZSBqIGluc24uCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzAwMDAwMDAwIDx0ZXh0X2xhYmVsPiAzODAwMDAwMAlqIHIwCiswMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gMzgwMDAwMjAJai5kIHIwCiswMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gMzgwMDAwNDAJai5qZCByMAorMDAwMDAwMGMgPHRleHRfbGFiZWxcK2M+IDM4MDAwMDAwCWogcjAKKzAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gMzgwMDgwMDAJaiByMQorMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiAzODAwODAyMAlqLmQgcjEKKzAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gMzgwMDgwNDAJai5qZCByMQorMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiAzODAwODAwMAlqIHIxCiswMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IDM4MWYwMDAwCWogMAorCQlSRUxPQzogMDAwMDAwMjQgUl9BUkNfMzIgLnRleHQKKzAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gMzgxZjAwMDAJaiAwCisJCVJFTE9DOiAwMDAwMDAyYyBSX0FSQ18zMiAudGV4dAorMDAwMDAwMzAgPHRleHRfbGFiZWxcKzMwPiAzODFmMDAwMAlqIDAKKwkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIC50ZXh0CiswMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IDM4MWYwMDAxCWplcSAwCisJCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiAudGV4dAorMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiAzODFmMDAwMQlqZXEgMAorCQlSRUxPQzogMDAwMDAwNDQgUl9BUkNfMzIgLnRleHQKKzAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gMzgxZjAwMDIJam5lIDAKKwkJUkVMT0M6IDAwMDAwMDRjIFJfQVJDXzMyIC50ZXh0CiswMDAwMDA1MCA8dGV4dF9sYWJlbFwrNTA+IDM4MWYwMDAyCWpuZSAwCisJCVJFTE9DOiAwMDAwMDA1NCBSX0FSQ18zMiAudGV4dAorMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiAzODFmMDAwMwlqcCAwCisJCVJFTE9DOiAwMDAwMDA1YyBSX0FSQ18zMiAudGV4dAorMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiAzODFmMDAwMwlqcCAwCisJCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiAudGV4dAorMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiAzODFmMDAwNAlqbiAwCisJCVJFTE9DOiAwMDAwMDA2YyBSX0FSQ18zMiAudGV4dAorMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPiAzODFmMDAwNAlqbiAwCisJCVJFTE9DOiAwMDAwMDA3NCBSX0FSQ18zMiAudGV4dAorMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiAzODFmMDAwNQlqYyAwCisJCVJFTE9DOiAwMDAwMDA3YyBSX0FSQ18zMiAudGV4dAorMDAwMDAwODAgPHRleHRfbGFiZWxcKzgwPiAzODFmMDAwNQlqYyAwCisJCVJFTE9DOiAwMDAwMDA4NCBSX0FSQ18zMiAudGV4dAorMDAwMDAwODggPHRleHRfbGFiZWxcKzg4PiAzODFmMDAwNQlqYyAwCisJCVJFTE9DOiAwMDAwMDA4YyBSX0FSQ18zMiAudGV4dAorMDAwMDAwOTAgPHRleHRfbGFiZWxcKzkwPiAzODFmMDAwNglqbmMgMAorCQlSRUxPQzogMDAwMDAwOTQgUl9BUkNfMzIgLnRleHQKKzAwMDAwMDk4IDx0ZXh0X2xhYmVsXCs5OD4gMzgxZjAwMDYJam5jIDAKKwkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIC50ZXh0CiswMDAwMDBhMCA8dGV4dF9sYWJlbFwrYTA+IDM4MWYwMDA2CWpuYyAwCisJCVJFTE9DOiAwMDAwMDBhNCBSX0FSQ18zMiAudGV4dAorMDAwMDAwYTggPHRleHRfbGFiZWxcK2E4PiAzODFmMDAwNwlqdiAwCisJCVJFTE9DOiAwMDAwMDBhYyBSX0FSQ18zMiAudGV4dAorMDAwMDAwYjAgPHRleHRfbGFiZWxcK2IwPiAzODFmMDAwNwlqdiAwCisJCVJFTE9DOiAwMDAwMDBiNCBSX0FSQ18zMiAudGV4dAorMDAwMDAwYjggPHRleHRfbGFiZWxcK2I4PiAzODFmMDAwOAlqbnYgMAorCQlSRUxPQzogMDAwMDAwYmMgUl9BUkNfMzIgLnRleHQKKzAwMDAwMGMwIDx0ZXh0X2xhYmVsXCtjMD4gMzgxZjAwMDgJam52IDAKKwkJUkVMT0M6IDAwMDAwMGM0IFJfQVJDXzMyIC50ZXh0CiswMDAwMDBjOCA8dGV4dF9sYWJlbFwrYzg+IDM4MWYwMDA5CWpndCAwCisJCVJFTE9DOiAwMDAwMDBjYyBSX0FSQ18zMiAudGV4dAorMDAwMDAwZDAgPHRleHRfbGFiZWxcK2QwPiAzODFmMDAwYQlqZ2UgMAorCQlSRUxPQzogMDAwMDAwZDQgUl9BUkNfMzIgLnRleHQKKzAwMDAwMGQ4IDx0ZXh0X2xhYmVsXCtkOD4gMzgxZjAwMGIJamx0IDAKKwkJUkVMT0M6IDAwMDAwMGRjIFJfQVJDXzMyIC50ZXh0CiswMDAwMDBlMCA8dGV4dF9sYWJlbFwrZTA+IDM4MWYwMDBjCWpsZSAwCisJCVJFTE9DOiAwMDAwMDBlNCBSX0FSQ18zMiAudGV4dAorMDAwMDAwZTggPHRleHRfbGFiZWxcK2U4PiAzODFmMDAwZAlqaGkgMAorCQlSRUxPQzogMDAwMDAwZWMgUl9BUkNfMzIgLnRleHQKKzAwMDAwMGYwIDx0ZXh0X2xhYmVsXCtmMD4gMzgxZjAwMGUJamxzIDAKKwkJUkVMT0M6IDAwMDAwMGY0IFJfQVJDXzMyIC50ZXh0CiswMDAwMDBmOCA8dGV4dF9sYWJlbFwrZjg+IDM4MWYwMDBmCWpwbnogMAorCQlSRUxPQzogMDAwMDAwZmMgUl9BUkNfMzIgLnRleHQKKzAwMDAwMTAwIDx0ZXh0X2xhYmVsXCsxMDA+IDM4MWYwMDAwCWogMAorCQlSRUxPQzogMDAwMDAxMDQgUl9BUkNfMzIgZXh0ZXJuYWxfdGV4dF9sYWJlbAorMDAwMDAxMDggPHRleHRfbGFiZWxcKzEwOD4gMzgxZjAwMDAJaiAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTYxYWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucwpAQCAtMCwwICsxLDQ1IEBACisjIGogdGVzdAorCQordGV4dF9sYWJlbDoJCisJaglyMAorCWouZAlyMAorCWouamQJcjAKKwlqLm5kCXIwCisKKwlqLmYJW3IxXQorCWouZC5mCVtyMV0KKwlqLmpkLmYJW3IxXQorCWoubmQuZglbcjFdCisKKwlqCXRleHRfbGFiZWwKKwlqYWwJdGV4dF9sYWJlbAorCWpyYQl0ZXh0X2xhYmVsCisJamVxCXRleHRfbGFiZWwKKwlqegl0ZXh0X2xhYmVsCisJam5lCXRleHRfbGFiZWwKKwlqbnoJdGV4dF9sYWJlbAorCWpwbAl0ZXh0X2xhYmVsCisJanAJdGV4dF9sYWJlbAorCWptaQl0ZXh0X2xhYmVsCisJam4JdGV4dF9sYWJlbAorCWpjcwl0ZXh0X2xhYmVsCisJamMJdGV4dF9sYWJlbAorCWpsbwl0ZXh0X2xhYmVsCisJamNjCXRleHRfbGFiZWwKKwlqbmMJdGV4dF9sYWJlbAorCWpocwl0ZXh0X2xhYmVsCisJanZzCXRleHRfbGFiZWwKKwlqdgl0ZXh0X2xhYmVsCisJanZjCXRleHRfbGFiZWwKKwlqbnYJdGV4dF9sYWJlbAorCWpndAl0ZXh0X2xhYmVsCisJamdlCXRleHRfbGFiZWwKKwlqbHQJdGV4dF9sYWJlbAorCWpsZQl0ZXh0X2xhYmVsCisJamhpCXRleHRfbGFiZWwKKwlqbHMJdGV4dF9sYWJlbAorCWpwbnoJdGV4dF9sYWJlbAorCisJaglleHRlcm5hbF90ZXh0X2xhYmVsCisKKwlqCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZDBhMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCkBAIC0wLDAgKzEsMzAgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBsZC9scgorCisjIFRlc3QgdGhlIGxkL2xyIGluc24uCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzAwMDAwMDAwIDA4MDA4MDAwCWxkIHIwLFxbcjFcXQorMDAwMDAwMDQgMDA0MTg4MDAJbGQgcjIsXFtyMyxyNFxdCiswMDAwMDAwOCAwOGEzMDAwMQlsZCByNSxcW3I2LDFcXQorMDAwMDAwMGMgMDhlNDAxZmYJbGQgcjcsXFtyOCwtMVxdCiswMDAwMDAxMCAwOTI1MDBmZglsZCByOSxcW3IxMCwyNTVcXQorMDAwMDAwMTQgMDk2NjAxMDAJbGQgcjExLFxbcjEyLC0yNTZcXQorMDAwMDAwMTggMDFhNzdjMDAJbGQgcjEzLFxbcjE0LDI1NlxdCiswMDAwMDAyMCAwMWU4N2MwMAlsZCByMTUsXFtyMTYsLTI1N1xdCiswMDAwMDAyOCAwMjNmMzgwMAlsZCByMTcsXFszMDU0MTk4OTYsc3BcXQorMDAwMDAwMzAgMGE3ZjAwMDAJbGQgcjE5LFxbMFxdCisJCVJFTE9DOiAwMDAwMDAzNCBSX0FSQ18zMiBmb28KKzAwMDAwMDM4IDBhOWYwMDAwCWxkIHIyMCxcWzRcXQorCQlSRUxPQzogMDAwMDAwM2MgUl9BUkNfMzIgZm9vCiswMDAwMDA0MCAwODFmODQwMAlsZGIgcjAsXFswXF0KKzAwMDAwMDQ0IDA4MWY4ODAwCWxkdyByMCxcWzBcXQorMDAwMDAwNDggMDgxZjgyMDAJbGQueCByMCxcWzBcXQorMDAwMDAwNGMgMDgxZjkwMDAJbGQuYSByMCxcWzBcXQorMDAwMDAwNTAgMDgxZmMwMDAJbGQuZGkgcjAsXFswXF0KKzAwMDAwMDU0IDA4MDA1NjAwCWxkYi54LmEuZGkgcjAsXFtyMFxdCiswMDAwMDA1OCAwODAwYTAwMAlsciByMCxcW3IxXF0KKzAwMDAwMDVjIDA4NWZhMDAwCWxyIHIyLFxbc3RhdHVzXF0KKzAwMDAwMDYwIDA4N2YyMDAwCWxyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyNjcxOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5zCkBAIC0wLDAgKzEsMjQgQEAKKyMgbGQvbHIgdGVzdAorCQorCWxkCXIwLFtyMV0KKwlsZAlyMixbcjMscjRdCisJbGQJcjUsW3I2LDFdCisJbGQJcjcsW3I4LC0xXQorCWxkCXI5LFtyMTAsMjU1XQorCWxkCXIxMSxbcjEyLC0yNTZdCisJbGQJcjEzLFtyMTQsMjU2XQorCWxkCXIxNSxbcjE2LC0yNTddCisJbGQJcjE3LFsweDEyMzQ1Njc4LHIyOF0KKwlsZAlyMTksW2Zvb10KKwlsZAlyMjAsW2Zvbys0XQorCisJbGRiCXIwLFswXQorCWxkdwlyMCxbMF0KKwlsZC54CXIwLFswXQorCWxkLmEJcjAsWzBdCisJbGQuZGkJcjAsWzBdCisJbGRiLnguYS5kaSByMCxbcjBdCisKKwlscglyMCxbcjFdCisJbHIJcjIsW3N0YXR1c10KKwlscglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjc5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCkBAIC0wLDAgKzEsNzggQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBAT0NACisKKyMgVGVzdCB0aGUgQE9DQCBpbnNuLgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswMDAwMDAwMCBASUMrMEAwMDg0MDAJQE9DQCByMCxyMSxyMgorMDAwMDAwMDQgQElDKzNANGRiODAwCUBPQ0AgcjI2LGZwLHNwCiswMDAwMDAwOCBASUMrM0BhZjNlMDAJQE9DQCBpbGluazEsaWxpbmsyLGJsaW5rCiswMDAwMDAwYyBASUMrN0A1ZGY4MDAJQE9DQCByNTgscjU5LGxwX2NvdW50CiswMDAwMDAxMCBASUMrMEAwMGZlMDAJQE9DQCByMCxyMSwwCiswMDAwMDAxNCBASUMrMEAxZjg0MDAJQE9DQCByMCwwLHIyCiswMDAwMDAxOCBASUMrN0BlMDg0MDAJQE9DQCAwLHIxLHIyCiswMDAwMDAxYyBASUMrMEAwMGZmZmYJQE9DQCByMCxyMSwtMQorMDAwMDAwMjAgQElDKzBAMWY4NWZmCUBPQ0AgcjAsLTEscjIKKzAwMDAwMDI0IEBJQys3QGUwODVmZglAT0NAIC0xLHIxLHIyCiswMDAwMDAyOCBASUMrMEAwMGZlZmYJQE9DQCByMCxyMSwyNTUKKzAwMDAwMDJjIEBJQyswQDFmODRmZglAT0NAIHIwLDI1NSxyMgorMDAwMDAwMzAgQElDKzdAZTA4NGZmCUBPQ0AgMjU1LHIxLHIyCiswMDAwMDAzNCBASUMrMEAwMGZmMDAJQE9DQCByMCxyMSwtMjU2CiswMDAwMDAzOCBASUMrMEAxZjg1MDAJQE9DQCByMCwtMjU2LHIyCiswMDAwMDAzYyBASUMrN0BlMDg1MDAJQE9DQCAtMjU2LHIxLHIyCiswMDAwMDA0MCBASUMrMEAwMGZjMDAJQE9DQCByMCxyMSwyNTYKKzAwMDAwMDQ4IEBJQyswQDFmMDQwMAlAT0NAIHIwLC0yNTcscjIKKzAwMDAwMDUwIEBJQys3QGMwODQwMAlAT0NAIDUxMSxyMSxyMgorMDAwMDAwNTggQElDKzBAMWYwNDAwCUBPQ0AgcjAsMTExMTYzODU5NCxyMgorMDAwMDAwNjAgQElDKzdAYzBmYzAwCUBPQ0AgMzA1NDE5ODk2LHIxLDMwNTQxOTg5NgorMDAwMDAwNjggQElDKzBAMWZmY2ZmCUBPQ0AgcjAsMjU1LDI1NgorMDAwMDAwNzAgQElDKzBAMWY3ZWZmCUBPQ0AgcjAsMjU2LDI1NQorMDAwMDAwNzggQElDKzdAZTBmY2ZmCUBPQ0AgMjU1LHIxLDI1NgorMDAwMDAwODAgQElDKzdAZmYwNGZmCUBPQ0AgMjU1LDI1NixyMgorMDAwMDAwODggQElDKzdAYzBmZWZmCUBPQ0AgMjU2LHIxLDI1NQorMDAwMDAwOTAgQElDKzdAZGY4NGZmCUBPQ0AgMjU2LDI1NSxyMgorMDAwMDAwOTggQElDKzBAMDBmYzAwCUBPQ0AgcjAscjEsMAorCQlSRUxPQzogMDAwMDAwOWMgUl9BUkNfMzIgZm9vCiswMDAwMDBhMCBASUMrMEAwMDg0MDAJQE9DQCByMCxyMSxyMgorMDAwMDAwYTQgQElDKzBANjIwYTAwCUBPQ0AgcjMscjQscjUKKzAwMDAwMGE4IEBJQyswQGMzOTAwMQlAT0NALmVxIHI2LHI3LHI4CiswMDAwMDBhYyBASUMrMUAyNTE2MDEJQE9DQC5lcSByOSxyMTAscjExCiswMDAwMDBiMCBASUMrMUA4NjljMDIJQE9DQC5uZSByMTIscjEzLHIxNAorMDAwMDAwYjQgQElDKzFAZTgyMjAyCUBPQ0AubmUgcjE1LHIxNixyMTcKKzAwMDAwMGI4IEBJQysyQDQ5YTgwMwlAT0NALnAgcjE4LHIxOSxyMjAKKzAwMDAwMGJjIEBJQysyQGFiMmUwMwlAT0NALnAgcjIxLHIyMixyMjMKKzAwMDAwMGMwIEBJQyszQDBjYjQwNAlAT0NALm4gcjI0LHIyNSxyMjYKKzAwMDAwMGM0IEBJQyszQDZlM2EwNAlAT0NALm4gZnAsc3AsaWxpbmsxCiswMDAwMDBjOCBASUMrM0BjZmMwMDUJQE9DQC5jIGlsaW5rMixibGluayxyMzIKKzAwMDAwMGNjIEBJQys0QDMxNDYwNQlAT0NALmMgcjMzLHIzNCxyMzUKKzAwMDAwMGQwIEBJQys0QDkyY2MwNQlAT0NALmMgcjM2LHIzNyxyMzgKKzAwMDAwMGQ0IEBJQys0QGY0NTIwNglAT0NALm5jIHIzOSxyNDAscjQxCiswMDAwMDBkOCBASUMrNUA1NWQ4MDYJQE9DQC5uYyByNDIscjQzLHI0NAorMDAwMDAwZGMgQElDKzVAYjc1ZTA2CUBPQ0AubmMgcjQ1LHI0NixyNDcKKzAwMDAwMGUwIEBJQys2QDE4ZTQwNwlAT0NALnYgcjQ4LHI0OSxyNTAKKzAwMDAwMGU0IEBJQys2QDdhNmEwNwlAT0NALnYgcjUxLHI1MixyNTMKKzAwMDAwMGU4IEBJQys2QGRiZjAwOAlAT0NALm52IHI1NCxyNTUscjU2CiswMDAwMDBlYyBASUMrN0AzZDc2MDgJQE9DQC5udiByNTcscjU4LHI1OQorMDAwMDAwZjAgQElDKzdAOWUwMDA5CUBPQ0AuZ3QgbHBfY291bnQsbHBfY291bnQscjAKKzAwMDAwMGY0IEBJQyswQDAwN2MwYQlAT0NALmdlIHIwLHIwLDAKKzAwMDAwMGZjIEBJQyswQDNmMDIwYglAT0NALmx0IHIxLDEscjEKKzAwMDAwMTA0IEBJQys3QGMwODQwYwlAT0NALmxlIDIscjEscjIKKzAwMDAwMTBjIEBJQyswQDdmMDYwZAlAT0NALmhpIHIzLDMscjMKKzAwMDAwMTE0IEBJQys3QGRmMDgwZQlAT0NALmxzIDQsNCxyNAorMDAwMDAxMWMgQElDKzdAYzJmYzBmCUBPQ0AucG56IDUscjUsNQorMDAwMDAxMjQgQElDKzBAMDA4NTAwCUBPQ0AuZiByMCxyMSxyMgorMDAwMDAxMjggQElDKzBAMDBmYTAxCUBPQ0AuZiByMCxyMSwxCiswMDAwMDEyYyBASUMrMEAxZTg0MDEJQE9DQC5mIHIwLDEscjIKKzAwMDAwMTMwIEBJQys3QGEwODQwMAlAT0NALmYgMCxyMSxyMgorMDAwMDAxMzQgQElDKzBAMDBmZDAwCUBPQ0AuZiByMCxyMSw1MTIKKzAwMDAwMTNjIEBJQyswQDFmMDUwMAlAT0NALmYgcjAsNTEyLHIyCiswMDAwMDE0NCBASUMrN0BjMDg1MDAJQE9DQC5mIDUxMixyMSxyMgorMDAwMDAxNGMgQElDKzBAMDA4NTAxCUBPQ0AuZXEuZiByMCxyMSxyMgorMDAwMDAxNTAgQElDKzBAMDBmZDAyCUBPQ0AubmUuZiByMCxyMSwwCiswMDAwMDE1OCBASUMrMEAxZjA1MGIJQE9DQC5sdC5mIHIwLDAscjIKKzAwMDAwMTYwIEBJQys3QGMwODUwOQlAT0NALmd0LmYgMCxyMSxyMgorMDAwMDAxNjggQElDKzBAMDBmZDBjCUBPQ0AubGUuZiByMCxyMSw1MTIKKzAwMDAwMTcwIEBJQyswQDFmMDUwYQlAT0NALmdlLmYgcjAsNTEyLHIyCiswMDAwMDE3OCBASUMrN0BjMDg1MDQJQE9DQC5uLmYgNTEyLHIxLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzUxNjlhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucwpAQCAtMCwwICsxLDg5IEBACisjIEBPQ0AgdGVzdAorCisjIFN0YXkgYXdheSBmcm9tIG9wZXJhbmRzIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50cyAoZWc6CWFkZCByMCxyMSxyMSkuCisjIFRoZXkgd2lsbCBiZSBkaXNhc3NlbWJsZWQgYXMgdGhleSdyZSBtYWNybyBjb3VudGVycGFydHMgKGVnOiBhc2wgcjAscjEpLgorCisjIHJlZyxyZWcscmVnCisJQE9DQCByMCxyMSxyMgorCUBPQ0AgcjI2LGZwLHNwCisJQE9DQCBpbGluazEsaWxpbmsyLGJsaW5rCisJQE9DQCByNTgscjU5LGxwX2NvdW50CisKKyMgc2hpbW0gdmFsdWVzCisJQE9DQCByMCxyMSwwCisJQE9DQCByMCwwLHIyCisJQE9DQCAwLHIxLHIyCisJQE9DQCByMCxyMSwtMQorCUBPQ0AgcjAsLTEscjIKKwlAT0NAIC0xLHIxLHIyCisJQE9DQCByMCxyMSwyNTUKKwlAT0NAIHIwLDI1NSxyMgorCUBPQ0AgMjU1LHIxLHIyCisJQE9DQCByMCxyMSwtMjU2CisJQE9DQCByMCwtMjU2LHIyCisJQE9DQCAtMjU2LHIxLHIyCisKKyMgbGltbSB2YWx1ZXMKKwlAT0NAIHIwLHIxLDI1NgorCUBPQ0AgcjAsLTI1NyxyMgorCUBPQ0AgNTExLHIxLHIyCisJQE9DQCByMCwweDQyNDI0MjQyLHIyCisJQE9DQCAweDEyMzQ1Njc4LHIxLDB4MTIzNDU2NzgKKworIyBzaGltbSBhbmQgbGltbQorCUBPQ0AgcjAsMjU1LDI1NgorCUBPQ0AgcjAsMjU2LDI1NQorCUBPQ0AgMjU1LHIxLDI1NgorCUBPQ0AgMjU1LDI1NixyMgorCUBPQ0AgMjU2LHIxLDI1NQorCUBPQ0AgMjU2LDI1NSxyMgorCisjIHN5bWJvbHMKKwlAT0NAIHIwLHIxLGZvbworCisjIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgorCUBPQ0AuYWwgcjAscjEscjIKKwlAT0NALnJhIHIzLHI0LHI1CisJQE9DQC5lcSByNixyNyxyOAorCUBPQ0AueiByOSxyMTAscjExCisJQE9DQC5uZSByMTIscjEzLHIxNAorCUBPQ0AubnogcjE1LHIxNixyMTcKKwlAT0NALnBsIHIxOCxyMTkscjIwCisJQE9DQC5wIHIyMSxyMjIscjIzCisJQE9DQC5taSByMjQscjI1LHIyNgorCUBPQ0AubiByMjcscjI4LHIyOQorCUBPQ0AuY3MgcjMwLHIzMSxyMzIKKwlAT0NALmMgcjMzLHIzNCxyMzUKKwlAT0NALmxvIHIzNixyMzcscjM4CisJQE9DQC5jYyByMzkscjQwLHI0MQorCUBPQ0AubmMgcjQyLHI0MyxyNDQKKwlAT0NALmhzIHI0NSxyNDYscjQ3CisJQE9DQC52cyByNDgscjQ5LHI1MAorCUBPQ0AudiByNTEscjUyLHI1MworCUBPQ0AudmMgcjU0LHI1NSxyNTYKKwlAT0NALm52IHI1NyxyNTgscjU5CisJQE9DQC5ndCByNjAscjYwLHIwCisJQE9DQC5nZSByMCxyMCwwCisJQE9DQC5sdCByMSwxLHIxCisJQE9DQC5sZSAyLHIxLHIyCisJQE9DQC5oaSByMywzLHIzCisJQE9DQC5scyA0LDQscjQKKwlAT0NALnBueiA1LHI1LDUKKworIyBmbGFnIHNldHRpbmcKKwlAT0NALmYgcjAscjEscjIKKwlAT0NALmYgcjAscjEsMQorCUBPQ0AuZiByMCwxLHIyCisJQE9DQC5mIDAscjEscjIKKwlAT0NALmYgcjAscjEsNTEyCisJQE9DQC5mIHIwLDUxMixyMgorCUBPQ0AuZiA1MTIscjEscjIKKworIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKKwlAT0NALmVxLmYgcjAscjEscjIKKwlAT0NALm5lLmYgcjAscjEsMAorCUBPQ0AubHQuZiByMCwwLHIyCisJQE9DQC5ndC5mIDAscjEscjIKKwlAT0NALmxlLmYgcjAscjEsNTEyCisJQE9DQC5nZS5mIHIwLDUxMixyMgorCUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjA3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQKQEAgLTAsMCArMSw0NCBAQAorI29iamR1bXA6IC1kcgorI25hbWU6IEBPQ0AKKworIyBUZXN0IHRoZSBAT0NAIGluc24uCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQorMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCiswMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAorMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCiswMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgorMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCiswMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1CiswMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1CiswMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgorMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKKzAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKKzAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3CiswMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAorMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0CiswMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgorMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKKzAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1CiswMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAorCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCiswMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQorMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKKzAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAorMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKKzAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCiswMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCiswMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0CiswMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKKzAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgorMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgorMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKKzAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKKzAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKKzAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKKzAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgorMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCiswMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmZhNjYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5zCkBAIC0wLDAgKzEsNTIgQEAKKyMgU2luZ2xlIHNoaWZ0IEBPQ0AgdGVzdAorCisjIHJlZyxyZWcKKwlAT0NAIHIwLHIxCisJQE9DQCBmcCxzcAorCisjIHNoaW1tIHZhbHVlcworCUBPQ0AgcjAsMAorCUBPQ0AgcjEsLTEKKwlAT0NAIDAscjIKKwlAT0NAIC0xLHIzCisJQE9DQCByNCwyNTUKKwlAT0NAIDI1NSxyNQorCUBPQ0AgcjYsLTI1NgorCUBPQ0AgLTI1NixyNworCisjIGxpbW0gdmFsdWVzCisJQE9DQCByOCwyNTYKKwlAT0NAIHI5LC0yNTcKKwlAT0NAIDUxMSxyMTAKKwlAT0NAIHIxMSwweDQyNDI0MjQyCisJQE9DQCAweDEyMzQ1Njc4LHIxMgorCisjIHNoaW1tIGFuZCBsaW1tCisJQE9DQCAyNTUsMjU2CisJQE9DQCAyNTYsMjU1CisKKyMgc3ltYm9scworCUBPQ0AgcjAsZm9vCisKKyMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCisJQE9DQC5lcSByMTAscjExCisJQE9DQC5uZSByMTIscjEzCisJQE9DQC5sdCByMTQsMAorCUBPQ0AuZ3QgcjE1LDUxMgorCisjIGZsYWcgc2V0dGluZworCUBPQ0AuZiByMCxyMQorCUBPQ0AuZiByMiwxCisJQE9DQC5mIDAscjQKKwlAT0NALmYgcjUsNTEyCisJQE9DQC5mIDUxMixyNgorCUBPQ0AuZiA1MTIsNTEyCisKKyMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCisJQE9DQC5lcS5mIHIwLHIxCisJQE9DQC5uZS5mIHIxLDAKKwlAT0NALmx0LmYgMCxyMgorCUBPQ0AuZ3QuZiAxLHIyCisJQE9DQC5sZS5mIHIwLDUxMgorCUBPQ0AuZ2UuZiA1MTIscjIKKwlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTk5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZApAQCAtMCwwICsxLDI1IEBACisjb2JqZHVtcDogLWRyCisjbmFtZTogc3Qvc3IKKworIyBUZXN0IHRoZSBzdC9zciBpbnNuLgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswMDAwMDAwMCAxMDAwODAwMAlzdCByMCxcW3IxXF0KKzAwMDAwMDA0IDEwMDMwYTAxCXN0IHI1LFxbcjYsMVxdCiswMDAwMDAwOCAxMDA0MGZmZglzdCByNyxcW3I4LC0xXF0KKzAwMDAwMDBjIDEwMDUxMmZmCXN0IHI5LFxbcjEwLDI1NVxdCiswMDAwMDAxMCAxMDA2MTcwMAlzdCByMTEsXFtyMTIsLTI1NlxdCiswMDAwMDAxNCAxMDFmMjYwMAlzdCByMTksXFswXF0KKwkJUkVMT0M6IDAwMDAwMDE4IFJfQVJDXzMyIGZvbworMDAwMDAwMWMgMTAxZjI4MDAJc3QgcjIwLFxbNFxdCisJCVJFTE9DOiAwMDAwMDAyMCBSX0FSQ18zMiBmb28KKzAwMDAwMDI0IDEwNWYwMDAwCXN0YiByMCxcWzBcXQorMDAwMDAwMmMgMTA5ZjAwMDAJc3R3IHIwLFxbMFxdCiswMDAwMDAzNCAxMTFmMDAwMAlzdC5hIHIwLFxbMFxdCiswMDAwMDAzYyAxNDFmMDAwMAlzdC5kaSByMCxcWzBcXQorMDAwMDAwNDQgMTU0MDAwMDAJc3RiLmEuZGkgcjAsXFtyMFxdCiswMDAwMDA0OCAxMjAwODAwMAlzciByMCxcW3IxXF0KKzAwMDAwMDRjIDEyMWY4NDAwCXNyIHIyLFxbc3RhdHVzXF0KKzAwMDAwMDUwIDEyMWYwNjAwCXNyIHIzLFxbMzA1NDE5ODk2XF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhZjE5OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zdC5zCkBAIC0wLDAgKzEsMTkgQEAKKyMgc3Qvc3IgdGVzdAorCQorCXN0CXIwLFtyMV0KKwlzdAlyNSxbcjYsMV0KKwlzdAlyNyxbcjgsLTFdCisJc3QJcjksW3IxMCwyNTVdCisJc3QJcjExLFtyMTIsLTI1Nl0KKwlzdAlyMTksW2Zvb10KKwlzdAlyMjAsW2Zvbys0XQorCisJc3RiCXIwLFswXQorCXN0dwlyMCxbMF0KKwlzdC5hCXIwLFswXQorCXN0LmRpCXIwLFswXQorCXN0Yi5hLmRpIHIwLFtyMF0KKworCXNyCXIwLFtyMV0KKwlzcglyMixbc3RhdHVzXQorCXNyCXIzLFsweDEyMzQ1Njc4XQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmYxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5leHAKQEAgLTAsMCArMSwxMyBAQAorIyBUZXN0IGFzc2VtYmxlciB3YXJuaW5ncy4KKworaWYgW2lzdGFyZ2V0IGFyYyotKi0qXSB7CisKKyAgICBsb2FkX2xpYiBnYXMtZGcuZXhwCisKKyAgICBkZy1pbml0CisKKyAgICBkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvd2Fybiouc11dICIiICIiCisKKyAgICBkZy1maW5pc2gKKworfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYjQzNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMKQEAgLTAsMCArMSwxNCBAQAorOyBUZXN0IEFSQyBzcGVjaWZpYyBhc3NlbWJsZXIgd2FybmluZ3MKKzsKKzsgeyBkZy1kbyBhc3NlbWJsZSB7IHRhcmdldCBhcmMtKi0qIH0gfQorCisJYi5kIGZvbworCW1vdiByMCwyNTYJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IiAiOCBieXRlIGluc24gaW4gZGVsYXkgc2xvdCIgfQorCisJai5kIGZvbwkJOyB7IGRnLXdhcm5pbmcgIjggYnl0ZSBqdW1wIGluc3RydWN0aW9uIHdpdGggZGVsYXkgc2xvdCIgIjggYnl0ZSBqdW1wIHdpdGggZGVsYXkgc2xvdCIgfQorCW1vdiByMCxyMQorCisJc3ViLmYgMCxyMCxyMgorCWJlcSBmb28JCTsgeyBkZy13YXJuaW5nICJjb25kaXRpb25hbCBicmFuY2ggZm9sbG93cyBzZXQgb2YgZmxhZ3MiICJjYyBzZXQvYnJhbmNoIG5vcCB0ZXN0IiB9CisKK2ZvbzoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDI4ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zCkBAIC0wLDAgKzEsMjEgQEAKKy50ZXh0CisuYWxpZ24gMAorCQorCWJ4CXIwCisJYnhlcQlyMQorCitmb286CQorCWxkcmgJcjMsIGZvbworCWxkcnNoCXI0LCBbcjVdCisJbGRyc2IJcjQsIFtyMSwgcjNdCisJbGRyc2gJcjEsIFtyNCwgcjRdIQorCWxkcmVxc2IJcjEsIFtyNSwgLXIzXQorCWxkcm5laAlyMiwgW3I2XSwgcjcKKwlsZHJjY3NoIHIyLCBbcjddLCArcjgKKwlsZHJzYglyMiwgW3IzLCAjMjU1XQorCWxkcnNoCXIxLCBbcjQsICMtMjUwXQorCWxkcnNiCXIxLCBbcjUsICMrMjQwXQorCisJc3RyaAlyMiwgYmFyCisJc3RybmVoCXIzLCBbcjNdCitiYXI6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMWM1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cApAQCAtMCwwICsxLDM0IEBACisjCisjIFNvbWUgQVJNIHRlc3RzCisjCitpZiBbaXN0YXJnZXQgYXJtLSotKl0gdGhlbiB7CisgICAgcnVuX2R1bXBfdGVzdCAiaW5zdCIKKworICAgIGdhc190ZXN0ICJhcm0zLnMiICIiICRzdGRvcHRsaXN0ICJBcm0gMyBpbnN0cnVjdGlvbnMiCisKKyAgICBnYXNfdGVzdCAiYXJtNi5zIiAiIiAkc3Rkb3B0bGlzdCAiQXJtIDYgaW5zdHJ1Y3Rpb25zIgorCisgICAgZ2FzX3Rlc3QgImFybTdkbS5zIiAiIiAkc3Rkb3B0bGlzdCAiQXJtIDdETSBpbnN0cnVjdGlvbnMiCisKKyAgICBydW5fZHVtcF90ZXN0ICJhcm03dCIKKworICAgIGdhc190ZXN0ICJ0aHVtYi5zIiAiIiAkc3Rkb3B0bGlzdCAiVGh1bWIgaW5zdHJ1Y3Rpb25zIgorCisgICAgZ2FzX3Rlc3QgImFyY2g0dC5zIiAiIiAkc3Rkb3B0bGlzdCAiQXJtIGFyY2hpdGVjdHVyZSA0dCBpbnN0cnVjdGlvbnMiCisKKyAgICBnYXNfdGVzdCAiY29wcm8ucyIgIiIgJHN0ZG9wdGxpc3QgIkNvIHByb2Nlc3NvciBpbnN0cnVjdGlvbnMiCisKKyAgICBnYXNfdGVzdCAiaW1tZWQucyIgIiIgJHN0ZG9wdGxpc3QgImltbWVkaWF0ZSBleHByZXNzaW9ucyIKKworICAgIGdhc190ZXN0ICJmbG9hdC5zIiAiIiAkc3Rkb3B0bGlzdCAiQ29yZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMiCit9CisKKyMgTm90IGFsbCBhcm0gdGFyZ2V0cyBhcmUgYmktZW5kaWFuLCBzbyBvbmx5IHJ1biB0aGlzIHRlc3Qgb24gb25lcworIyB3ZSBrbm93IHRoYXQgYXJlLiAgRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSBhbHNvIGtleSBvZmYgYXJtZWIvYXJtZWwuCisKK2lmIFtpc3RhcmdldCBhcm0tKi1wZV0geworICAgIHJ1bl9kdW1wX3Rlc3QgImxlLWZwY29uc3QiCisKKyAgICAjIFNpbmNlIGJpZy1lbmRpYW4gbnVtYmVycyBoYXZlIHRoZSBub3JtYWwgZm9ybWF0LCB0aGlzIGRvZXNuJ3QgZXhpc3QuCisgICAgI3J1bl9kdW1wX3Rlc3QgImJlLWZwY29uc3QiCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNmOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucwpAQCAtMCwwICsxLDYgQEAKKy50ZXh0CisuYWxpZ24gMAorCXN3cAlyMCwgcjEsIFtyOF0KKwlzd3BiCXIyLCByMywgW3IzXQorCXN3cGdlYglyNCwgcjEsIFtyNF0KKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm02LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1MTcxMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm02LnMKQEAgLTAsMCArMSwxMiBAQAorLnRleHQKKy5hbGlnbiAwCisJCisJbXJzCXI4LCBjcHNyCisJbXJzZXEJcjksIGNwc3JfYWxsCisJbXJzCXIyLCBzcHNyCisKKwltc3IJY3BzciwgcjEKKwltc3JuZQljcHNyX2ZsZywgIzB4ZjAwMDAwMDAKKwltc3IJc3Bzcl9mbGcsIHI4CisJbXNyCXNwc3JfYWxsLCByOQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5NmM3MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03ZG0ucwpAQCAtMCwwICsxLDEyIEBACisudGV4dAorLmFsaWduIDAKKwkKKwlzbXVsbAlyMCwgcjEsIHIyLCByMworCXVtdWxsCXIwLCByMSwgcjIsIHIzCisJc21sYWwJcjAsIHIxLCByMiwgcjMKKwl1bWxhbAlyMCwgcjEsIHI0LCByMworCisJc211bGxuZQlyMCwgcjEsIHIzLCByNAorCXNtdWxscwlyMSwgcjAsIHI5LCByMTEKKwl1bWxhbGVxcyByMiwgcjksIHI0LCByOQorCXNtbGFsZ2UgcjE0LCByMTAsIHI4LCByMTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzYTE2MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCkBAIC0wLDAgKzEsNjggQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgorI25hbWU6IEFSTSBhcm03dAorI2FzOiAtbWFybTd0IC1FTAorCisjIFRlc3QgdGhlIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5kIG1lbW9yeSB0cmFuc2ZlcnM6CisKKy4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMDAwMDAwMDAgPFtePl0qPiBlMWQxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXQorMDAwMDAwMDQgPFtePl0qPiBlMWYxMDBiMCA/CWxkcmgJcjAsIFxbcjFcXSEKKzAwMDAwMDA4IDxbXj5dKj4gZTE5MTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdCiswMDAwMDAwYyA8W14+XSo+IGUxYjEwMGIyID8JbGRyaAlyMCwgXFtyMSwgcjJcXSEKKzAwMDAwMDEwIDxbXj5dKj4gZTFkMTAwYmMgPwlsZHJoCXIwLCBcW3IxLCAjMTJcXQorMDAwMDAwMTQgPFtePl0qPiBlMWYxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdIQorMDAwMDAwMTggPFtePl0qPiBlMTUxMDBiYyA/CWxkcmgJcjAsIFxbcjEsIC0jMTJcXQorMDAwMDAwMWMgPFtePl0qPiBlMDkxMDBiMiA/CWxkcmgJcjAsIFxbcjFcXSwgcjIKKzAwMDAwMDIwIDxbXj5dKj4gZTNhMDBjZmYgPwltb3YJcjAsICM2NTI4MAorMDAwMDAwMjQgPFtePl0qPiBlMWRmMGJiNCA/CWxkcmgJcjAsIDAwMDAwMGUwIDxcJFwkbGl0XwIxPgorMDAwMDAwMjggPFtePl0qPiBlMWRmMGFiYyA/CWxkcmgJcjAsIDAwMDAwMGRjIDwuTDI+CiswMDAwMDAyYyA8W14+XSo+IGUxYzEwMGIwID8Jc3RyaAlyMCwgXFtyMVxdCiswMDAwMDAzMCA8W14+XSo+IGUxZTEwMGIwID8Jc3RyaAlyMCwgXFtyMVxdIQorMDAwMDAwMzQgPFtePl0qPiBlMTgxMDBiMiA/CXN0cmgJcjAsIFxbcjEsIHIyXF0KKzAwMDAwMDM4IDxbXj5dKj4gZTFhMTAwYjIgPwlzdHJoCXIwLCBcW3IxLCByMlxdIQorMDAwMDAwM2MgPFtePl0qPiBlMWMxMDBiYyA/CXN0cmgJcjAsIFxbcjEsICMxMlxdCiswMDAwMDA0MCA8W14+XSo+IGUxZTEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgIzEyXF0hCiswMDAwMDA0NCA8W14+XSo+IGUxNDEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgLSMxMlxdCiswMDAwMDA0OCA8W14+XSo+IGUwODEwMGIyID8Jc3RyaAlyMCwgXFtyMVxdLCByMgorMDAwMDAwNGMgPFtePl0qPiBlMWNmMDhiOCA/CXN0cmgJcjAsIDAwMDAwMGRjIDwuTDI+CiswMDAwMDA1MCA8W14+XSo+IGUxZDEwMGQwID8JbGRyc2IJcjAsIFxbcjFcXQorMDAwMDAwNTQgPFtePl0qPiBlMWYxMDBkMCA/CWxkcnNiCXIwLCBcW3IxXF0hCiswMDAwMDA1OCA8W14+XSo+IGUxOTEwMGQyID8JbGRyc2IJcjAsIFxbcjEsIHIyXF0KKzAwMDAwMDVjIDxbXj5dKj4gZTFiMTAwZDIgPwlsZHJzYglyMCwgXFtyMSwgcjJcXSEKKzAwMDAwMDYwIDxbXj5dKj4gZTFkMTAwZGMgPwlsZHJzYglyMCwgXFtyMSwgIzEyXF0KKzAwMDAwMDY0IDxbXj5dKj4gZTFmMTAwZGMgPwlsZHJzYglyMCwgXFtyMSwgIzEyXF0hCiswMDAwMDA2OCA8W14+XSo+IGUxNTEwMGRjID8JbGRyc2IJcjAsIFxbcjEsIC0jMTJcXQorMDAwMDAwNmMgPFtePl0qPiBlMDkxMDBkMiA/CWxkcnNiCXIwLCBcW3IxXF0sIHIyCiswMDAwMDA3MCA8W14+XSo+IGUzYTAwMGRlID8JbW92CXIwLCAjMjIyCiswMDAwMDA3NCA8W14+XSo+IGUxZGYwNmQwID8JbGRyc2IJcjAsIDAwMDAwMGRjIDwuTDI+CiswMDAwMDA3OCA8W14+XSo+IGUxZDEwMGYwID8JbGRyc2gJcjAsIFxbcjFcXQorMDAwMDAwN2MgPFtePl0qPiBlMWYxMDBmMCA/CWxkcnNoCXIwLCBcW3IxXF0hCiswMDAwMDA4MCA8W14+XSo+IGUxOTEwMGYyID8JbGRyc2gJcjAsIFxbcjEsIHIyXF0KKzAwMDAwMDg0IDxbXj5dKj4gZTFiMTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXSEKKzAwMDAwMDg4IDxbXj5dKj4gZTFkMTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgIzEyXF0KKzAwMDAwMDhjIDxbXj5dKj4gZTFmMTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgIzEyXF0hCiswMDAwMDA5MCA8W14+XSo+IGUxNTEwMGZjID8JbGRyc2gJcjAsIFxbcjEsIC0jMTJcXQorMDAwMDAwOTQgPFtePl0qPiBlMDkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxXF0sIHIyCiswMDAwMDA5OCA8W14+XSo+IGUzYTAwY2ZmID8JbW92CXIwLCAjNjUyODAKKzAwMDAwMDljIDxbXj5dKj4gZTFkZjAzZmMgPwlsZHJzaAlyMCwgMDAwMDAwZTAgPFwkXCRsaXRfAjE+CiswMDAwMDBhMCA8W14+XSo+IGUxZGYwM2Y0ID8JbGRyc2gJcjAsIDAwMDAwMGRjIDwuTDI+CiswMDAwMDBhNCA8W14+XSo+IGUxOTEwMGIyID8JbGRyaAlyMCwgXFtyMSwgcjJcXQorMDAwMDAwYTggPFtePl0qPiAxMTkxMDBiMiA/CWxkcm5laAlyMCwgXFtyMSwgcjJcXQorMDAwMDAwYWMgPFtePl0qPiA4MTkxMDBiMiA/CWxkcmhpaAlyMCwgXFtyMSwgcjJcXQorMDAwMDAwYjAgPFtePl0qPiBiMTkxMDBiMiA/CWxkcmx0aAlyMCwgXFtyMSwgcjJcXQorMDAwMDAwYjQgPFtePl0qPiBlMTkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxLCByMlxdCiswMDAwMDBiOCA8W14+XSo+IDExOTEwMGYyID8JbGRybmVzaAlyMCwgXFtyMSwgcjJcXQorMDAwMDAwYmMgPFtePl0qPiA4MTkxMDBmMiA/CWxkcmhpc2gJcjAsIFxbcjEsIHIyXF0KKzAwMDAwMGMwIDxbXj5dKj4gYjE5MTAwZjIgPwlsZHJsdHNoCXIwLCBcW3IxLCByMlxdCiswMDAwMDBjNCA8W14+XSo+IGUxOTEwMGQyID8JbGRyc2IJcjAsIFxbcjEsIHIyXF0KKzAwMDAwMGM4IDxbXj5dKj4gMTE5MTAwZDIgPwlsZHJuZXNiCXIwLCBcW3IxLCByMlxdCiswMDAwMDBjYyA8W14+XSo+IDgxOTEwMGQyID8JbGRyaGlzYglyMCwgXFtyMSwgcjJcXQorMDAwMDAwZDAgPFtePl0qPiBiMTkxMDBkMiA/CWxkcmx0c2IJcjAsIFxbcjEsIHIyXF0KKzAwMDAwMGQ0IDxbXj5dKj4gZTFkZjAwZjQgPwlsZHJzaAlyMCwgMDAwMDAwZTAgPFwkXCRsaXRfAjE+CiswMDAwMDBkOCA8W14+XSo+IGUxZGYwMGY0ID8JbGRyc2gJcjAsIDAwMDAwMGU0IDxcJFwkbGl0XwIxXCsweDQ+CiswMDAwMDBkYyA8W14+XSo+IDAwMDAwMDAwID8JYW5kZXEJcjAsIHIwLCByMAorWwkJXSpkYzouKi5MQzAKKzAwMDAwMGUwIDxbXj5dKj4gMDAwMGMwZGUgPwkuKgorMDAwMDAwZTQgPFtePl0qPiAwMDAwZGVhZCA/CS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmU5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucwpAQCAtMCwwICsxLDc5IEBACisJLnNlY3Rpb24JLnJkYXRhCisJLmFsaWduCTAKKy5MQzA6CisJLmFzY2lpCSJzb21lIGRhdGFcMDAwIgorCisJLnRleHQKKwkuYWxpZ24JMAorCitsb2FkaGFsZndvcmRzOgorCWxkcmgJcjAsIFtyMV0KKwlsZHJoCXIwLCBbcjFdIQorCWxkcmgJcjAsIFtyMSwgcjJdCisJbGRyaAlyMCwgW3IxLCByMl0hCisJbGRyaAlyMCwgW3IxLCMweDBDXQorCWxkcmgJcjAsIFtyMSwjMHgwQ10hCisJbGRyaAlyMCwgW3IxLCMtMHgwQ10KKwlsZHJoCXIwLCBbcjFdLCByMgorCWxkcmgJcjAsID0weEZGMDAKKwlsZHJoCXIwLCA9MHhDMERFCisJbGRyaAlyMCwgLkwyCisKK3N0b3JlaGFsZndvcmRzOgorCXN0cmgJcjAsIFtyMV0KKwlzdHJoCXIwLCBbcjFdIQorCXN0cmgJcjAsIFtyMSwgcjJdCisJc3RyaAlyMCwgW3IxLCByMl0hCisJc3RyaAlyMCwgW3IxLCMweDBDXQorCXN0cmgJcjAsIFtyMSwjMHgwQ10hCisJc3RyaAlyMCwgW3IxLCMtMHgwQ10KKwlzdHJoCXIwLCBbcjFdLCByMgorCXN0cmgJcjAsIC5MMgorCitsb2Fkc2lnbmVkYnl0ZXM6CisJbGRyc2IJcjAsIFtyMV0KKwlsZHJzYglyMCwgW3IxXSEKKwlsZHJzYglyMCwgW3IxLCByMl0KKwlsZHJzYglyMCwgW3IxLCByMl0hCisJbGRyc2IJcjAsIFtyMSwjMHgwQ10KKwlsZHJzYglyMCwgW3IxLCMweDBDXSEKKwlsZHJzYglyMCwgW3IxLCMtMHgwQ10KKwlsZHJzYglyMCwgW3IxXSwgcjIKKwlsZHJzYglyMCwgPTB4REUKKwlsZHJzYglyMCwgLkwyCisKK2xvYWRzaWduZWRoYWxmd29yZHM6CisJbGRyc2gJcjAsIFtyMV0KKwlsZHJzaAlyMCwgW3IxXSEKKwlsZHJzaAlyMCwgW3IxLCByMl0KKwlsZHJzaAlyMCwgW3IxLCByMl0hCisJbGRyc2gJcjAsIFtyMSwgIzB4MENdCisJbGRyc2gJcjAsIFtyMSwgIzB4MENdIQorCWxkcnNoCXIwLCBbcjEsICMtMHgwQ10KKwlsZHJzaAlyMCwgW3IxXSwgcjIKKwlsZHJzaAlyMCwgPTB4RkYwMAorCWxkcnNoCXIwLCA9MHhDMERFCisJbGRyc2gJcjAsIC5MMgorCQorbWlzYzoKKwlsZHJhbGgJcjAsIFtyMSwgcjJdCisJbGRybmVoCXIwLCBbcjEsIHIyXQorCWxkcmhpaAlyMCwgW3IxLCByMl0KKwlsZHJsdGgJcjAsIFtyMSwgcjJdCisKKwlsZHJhbHNoCXIwLCBbcjEsIHIyXQorCWxkcm5lc2gJcjAsIFtyMSwgcjJdCisJbGRyaGlzaAlyMCwgW3IxLCByMl0KKwlsZHJsdHNoCXIwLCBbcjEsIHIyXQorCisJbGRyYWxzYglyMCwgW3IxLCByMl0KKwlsZHJuZXNiCXIwLCBbcjEsIHIyXQorCWxkcmhpc2IJcjAsIFtyMSwgcjJdCisJbGRybHRzYglyMCwgW3IxLCByMl0KKworCWxkcnNoCXIwLCA9MHhDMERFCisJbGRyc2gJcjAsID0weERFQUQKKworCS5hbGlnbgorLkwyOgorCS53b3JkCS5MQzAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9jb3Byby5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjOWI5MgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9jb3Byby5zCkBAIC0wLDAgKzEsMjQgQEAKKy50ZXh0CisuYWxpZ24gMAorCWNkcAlwMSwgNCwgY3IxLCBjcjIsIGNyMworCWNkcGVxCTQsIDMsIGMxLCBjNCwgY3I1LCA1CisKKwlsZGMJNSwgY3I5LCBbcjNdCisJbGRjbAkxLCBjcjE0LCBbcjEsICMzMl0KKwlsZGNtaQkwLCBjcjAsIFtyMiwgIzEwMjBdIQorCWxkY3BsbAlwNywgYzEsIFtyM10sICM2NAorCWxkYwlwMCwgYzgsIGZvbworZm9vOgorCisJc3RjCTUsIGNyMCwgW3IzXQorCXN0Y2wJMywgY3IxNSwgW3IwLCAjOF0KKwlzdGNlcQlwNCwgY3IxMiwgW3IyLCAjMTAwXSEKKwlzdGNjYwlwNiwgYzgsIFtyNF0sICM0OAorCXN0YwlwMSwgYzcsIGJhcgorYmFyOgorCisJbXJjCTIsIDMsIHI1LCBjMSwgYzIKKwltcmNnZQlwNCwgNSwgcjE1LCBjcjEsIGNyMiwgNworCisJbWNyCXA3LCAxLCByMTUsIGNyMSwgY3IxCisJbWNybHQJNSwgMSwgcjgsIGNyMiwgY3I5LCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWVlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucwpAQCAtMCwwICsxLDE2MiBAQAorLnRleHQKKy5hbGlnbiAwCisJbXZmZQlmMCwgZjEKKwltdmZlcWUJZjMsIGY1CisJbXZmZXFkCWY0LCAjMS4wCisJbXZmcwlmNCwgZjcKKwltdmZzcAlmMCwgZjEKKwltdmZkbQlmMywgZjQKKwltdmZleglmNywgZjcKKworCWFkZmUJZjAsIGYxLCAjMi4wCisJYWRmZXFlCWYxLCBmMiwgIzAuNQorCWFkZnNtCWYzLCBmNCwgZjUKKwkKKwlzdWZkCWYwLCBmMCwgIzIuMAorCXN1ZnMJZjEsIGYyLCAjMTAuMAorCXN1Zm5lZXogZjMsIGY0LCBmNQorCisJcnNmcwlmMSwgZjEsICMwLjAKKwlyc2ZkcAlmMywgZjAsICM1LjAKKwlyc2ZsZWQJZjcsIGY2LCBmMAorCisJbXVmZAlmMCwgZjAsIGYwCisJbXVmZXoJZjEsIGYyLCAjMy4wCisJbXVmYWxzCWYwLCBmMCwgIzQuMAorCisJZHZmZAlmMCwgZjAsICMxLjAwMDAKKwlkdmZleglmMCwgZjEsICMxMGUwCisJZHZmbWlzbSBmMywgZjQsIGY1CisKKwlyZGZlCWYwLCBmMSwgIzEuMGUxCisJcmRmcwlmMywgZjcsICMwZjEKKwlyZGZjY2RwCWY0LCBmNCwgZjMKKworCXBvd2QJZjAsIGYyLCBmMworCXBvd3MJZjEsIGYzLCAjMGUxZTEKKwlwb3djc2V6CWY0LCBmNywgIzEKKworCXJwd3MJZjcsIGY2LCBmNworCXJwd2VxZAlmMCwgZjEsIGYyCisJcnB3ZW0JZjIsIGYyLCBmMworCisJcm1mZAlmMSwgZjIsICMzCisJcm1mdnNzCWYzLCBmNCwgZjQKKwlybWZlcAlmNCwgZjcsIGYwCisKKwlmbWxzCWYwLCBmMSwgZjIKKwlmbWxlcXMJZjEsIGYzLCBmNQorCWZtbHBsc3oJZjQsIGY2LCBmMAorCisJZmR2cwlmMSwgZjMsICMxMAorCWZkdnNwCWYwLCBmMSwgZjIKKwlmZHZoc3NtCWY0LCBmNCwgZjQKKworCWZyZHMJZjEsIGYxLCAjMS4wCisJZnJkZ3RzCWYyLCBmMSwgZjAKKwlmcmRndHN6CWY0LCBmNCwgZjUKKworCXBvbGQJZjAsIGYxLCBmMgorCXBvbHN6CWY0LCBmNiwgIzMuMAorCXBvbGVxZQlmNSwgZjYsIGY3CisKKwltbmZzCWYwLCBmMQorCW1uZmQJZjAsICMzLjAKKwltbmZleglmMCwgIzQuMAorCW1uZmVxZXogZjAsIGY1CisJbW5mc3AJZjAsIGY0CisJbW5mZG0JZjEsIGY3CisKKwlhYnNkCWYwLCBmMQorCWFic3NwCWYxLCAjMy4wCisJYWJzZXFlCWY0LCBmNQorCisJcm5kcwlmMSwgZjIKKwlybmRkCWYzLCBmNAorCXJuZGVxZXoJZjYsICM0LjAKKworCXNxdHMJZjUsIGY1CisJc3F0ZHAJZjYsIGY2CisJc3F0cGxleiBmNywgZjYKKworCWxvZ3MJZjAsICMxMAorCWxvZ2UJZjAsICMwZjEwCisJbG9nbmVkeglmMCwgZjEKKworCWxnbmUJZjEsIGYyCisJbGduZHoJZjEsIGYzCisJbGdudmNzCWYzLCBmNAorCisJZXhwcwlmMSwgZjMKKwlleHBlbQlmMywgIzEwLjAKKwlleHBwbGQJZjYsIGY3CisKKwlzaW5kCWYwLCBmMQorCXNpbnNtCWYxLCBmMgorCXNpbmd0ZQlmNCwgIzUKKworCWNvc2QJZjEsIGYzCisJY29zZW0JZjQsIGY1CisJY29zbmVkcAlmNiwgZjEKKworCXRhbmUJZjEsIGY1CisJdGFuc3oJZjQsIGY3CisJdGFuZ2VkeglmMSwgIzQuMAorCisJYXNuZQlmNCwgZjUKKwlhc25zcAlmNiwgIzVlLTEKKwlhc25taWR6CWY1LCBmNQorCisJYWNzcwlmNSwgZjYKKwlhY3NkCWY2LCBmMAorCWFjc2hzZW0JZjEsICMwLjA1ZTEKKworCWF0bmUJZjAsIGY1CisJYXRuc3oJZjEsICM1CisJYXRubHRkCWYzLCBmMgorCisJdXJkZQlmNSwgZjQKKwlucm1lCWY2LCBmNQorCW5ybXBsZHoJZjcsIGY1CisKKwlmbHRzcAlmMCwgcjgKKwlmbHRlCWYxLCByMAorCWZsdGVxZHoJZjUsIHI3CisKKwlmaXgJcjAsIGYxCisJZml4eglyMSwgZjcKKwlmaXhjc20JcjUsIGY1CisKKwl3ZmMJcjAKKwl3ZnMJcjEKKwlyZnNlcQlyMgorCXJmYwlyNAorCisJY21mCWYwLCAjMQorCWNtZglmMSwgZjIKKwljbWZlcQlmMCwgZjEKKworCWNuZglmMCwgIzMKKwljbmYJZjEsICMwLjUKKwljbmZ2cwlmMywgZjQKKworCWNtZmUJZjAsIGYxCisJY21mZWVxCWYxLCBmMgorCWNtZmVxZQlmMywgIzUuMAorCisJY25mZQlmMSwgZjMKKwljbmZlZXEJZjMsIGY0CisJY25mZXFlCWY0LCBmNworCWNuZmFsZQlmNCwgIzUuMAorCisJbGZtCWYwLCA0LCBbcjBdCisJbGZtCWYwLCA0LCBbcjAsICMwXQorCWxmbQlmMSwgNCwgW3IxLCAjNjRdCisJc2ZtCWYyLCA0LCBbcjE0LCAjMTAyMF0hCisJc2ZtZXEJZjcsIDMsIFtyOF0sICMtMTAyMAorCisJbGZtZmQJZjYsIDIsIFtyMTVdCisJc2ZtZWEJZjcsIDEsIFtyOF0hCisJbGZtZXFlYQlmNSwgNCwgW3I2XQorCXNmbW5lZmQJZjQsIDMsIFtyMl0KKwlzZm1uZWZkCWY0LCAzLCBbcjJdIQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW1tZWQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDIwOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKQEAgLTAsMCArMSwxMSBAQAorQAlUZXN0cyBmb3IgY29tcGxleCBpbW1lZGlhdGUgZXhwcmVzc2lvbnMgLSBub25lIG9mIHRoZXNlIG5lZWQgCitACXJlbG9jYXRpb25zCisJLnRleHQKK2JhcjoKKwltb3YJcjAsICMwCisJbW92CXIwLCAjKC4gLSBiYXIgLSA4KQorCWxkcglyMCwgYmFyCisJbGRyCXIwLCBbcGMsICMgKGJhciAtIC4gLTgpXQorCS5zcGFjZSA0MDk2CisJbW92CXIwLCAjKC4gLSBiYXIgLSA4KSAmIDB4ZmYKKwlsZHIJcjAsIFtwYywgIyAoYmFyIC0gLiAtOCkgJiAweGZmXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjYjhmMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LmQKQEAgLTAsMCArMSwxNjggQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgorI25hbWU6IEFSTSBiYXNpYyBpbnN0cnVjdGlvbnMKKyNhczogLW1hcm0yIC1FTAorCisjIFRlc3QgdGhlIHN0YW5kYXJkIEFSTSBpbnN0cnVjdGlvbnM6CisKKy4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMDAwMDAwMDAgPFtePl0qPiBlM2EwMDAwMCA/CW1vdglyMCwgIzAKKzAwMDAwMDA0IDxbXj5dKj4gZTFhMDEwMDIgPwltb3YJcjEsIHIyCiswMDAwMDAwOCA8W14+XSo+IGUxYTAzMTg0ID8JbW92CXIzLCByNCwgbHNsICMzCiswMDAwMDAwYyA8W14+XSo+IGUxYTA1NzM2ID8JbW92CXI1LCByNiwgbHNyIHI3CiswMDAwMDAxMCA8W14+XSo+IGUxYTA4YTU5ID8JbW92CXI4LCByOSwgYXNyIHNsCiswMDAwMDAxNCA8W14+XSo+IGUxYTBiZDFjID8JbW92CWZwLCBpcCwgbHNsIHNwCiswMDAwMDAxOCA8W14+XSo+IGUxYTBlMDZmID8JbW92CWxyLCBwYywgcnJ4CiswMDAwMDAxYyA8W14+XSo+IGUxYTAxMDAyID8JbW92CXIxLCByMgorMDAwMDAwMjAgPFtePl0qPiAwMWEwMjAwMyA/CW1vdmVxCXIyLCByMworMDAwMDAwMjQgPFtePl0qPiAxMWEwNDAwNSA/CW1vdm5lCXI0LCByNQorMDAwMDAwMjggPFtePl0qPiBiMWEwNjAwNyA/CW1vdmx0CXI2LCByNworMDAwMDAwMmMgPFtePl0qPiBhMWEwODAwOSA/CW1vdmdlCXI4LCByOQorMDAwMDAwMzAgPFtePl0qPiBkMWEwYTAwYiA/CW1vdmxlCXNsLCBmcAorMDAwMDAwMzQgPFtePl0qPiBjMWEwYzAwZCA/CW1vdmd0CWlwLCBzcAorMDAwMDAwMzggPFtePl0qPiAzMWEwMTAwMiA/CW1vdmNjCXIxLCByMgorMDAwMDAwM2MgPFtePl0qPiAyMWEwMTAwMyA/CW1vdmNzCXIxLCByMworMDAwMDAwNDAgPFtePl0qPiA0MWEwMzAwNiA/CW1vdm1pCXIzLCByNgorMDAwMDAwNDQgPFtePl0qPiA1MWEwNzAwOSA/CW1vdnBsCXI3LCByOQorMDAwMDAwNDggPFtePl0qPiA2MWEwMTAwOCA/CW1vdnZzCXIxLCByOAorMDAwMDAwNGMgPFtePl0qPiA3MWEwOWZhMSA/CW1vdnZjCXI5LCByMSwgbHNyICMzMQorMDAwMDAwNTAgPFtePl0qPiA4MWEwODAwZiA/CW1vdmhpCXI4LCBwYworMDAwMDAwNTQgPFtePl0qPiA5MWEwZjAwZSA/CW1vdmxzCXBjLCBscgorMDAwMDAwNTggPFtePl0qPiAyMWEwOTAwOCA/CW1vdmNzCXI5LCByOAorMDAwMDAwNWMgPFtePl0qPiAzMWEwMTAwMyA/CW1vdmNjCXIxLCByMworMDAwMDAwNjAgPFtePl0qPiBlMWIwMDAwOCA/CW1vdnMJcjAsIHI4CiswMDAwMDA2NCA8W14+XSo+IDMxYjAwMDA3ID8JbW92Y2NzCXIwLCByNworMDAwMDAwNjggPFtePl0qPiBlMjgxMDAwYSA/CWFkZAlyMCwgcjEsICMxMAorMDAwMDAwNmMgPFtePl0qPiBlMDgzMjAwNCA/CWFkZAlyMiwgcjMsIHI0CiswMDAwMDA3MCA8W14+XSo+IGUwODY1Mjg3ID8JYWRkCXI1LCByNiwgcjcsIGxzbCAjNQorMDAwMDAwNzQgPFtePl0qPiBlMDgyMTExMyA/CWFkZAlyMSwgcjIsIHIzLCBsc2wgcjEKKzAwMDAwMDc4IDxbXj5dKj4gZTIwMTAwMGEgPwlhbmQJcjAsIHIxLCAjMTAKKzAwMDAwMDdjIDxbXj5dKj4gZTAwMzIwMDQgPwlhbmQJcjIsIHIzLCByNAorMDAwMDAwODAgPFtePl0qPiBlMDA2NTI4NyA/CWFuZAlyNSwgcjYsIHI3LCBsc2wgIzUKKzAwMDAwMDg0IDxbXj5dKj4gZTAwMjExMTMgPwlhbmQJcjEsIHIyLCByMywgbHNsIHIxCiswMDAwMDA4OCA8W14+XSo+IGUyMjEwMDBhID8JZW9yCXIwLCByMSwgIzEwCiswMDAwMDA4YyA8W14+XSo+IGUwMjMyMDA0ID8JZW9yCXIyLCByMywgcjQKKzAwMDAwMDkwIDxbXj5dKj4gZTAyNjUyODcgPwllb3IJcjUsIHI2LCByNywgbHNsICM1CiswMDAwMDA5NCA8W14+XSo+IGUwMjIxMTEzID8JZW9yCXIxLCByMiwgcjMsIGxzbCByMQorMDAwMDAwOTggPFtePl0qPiBlMjQxMDAwYSA/CXN1YglyMCwgcjEsICMxMAorMDAwMDAwOWMgPFtePl0qPiBlMDQzMjAwNCA/CXN1YglyMiwgcjMsIHI0CiswMDAwMDBhMCA8W14+XSo+IGUwNDY1Mjg3ID8Jc3ViCXI1LCByNiwgcjcsIGxzbCAjNQorMDAwMDAwYTQgPFtePl0qPiBlMDQyMTExMyA/CXN1YglyMSwgcjIsIHIzLCBsc2wgcjEKKzAwMDAwMGE4IDxbXj5dKj4gZTJhMTAwMGEgPwlhZGMJcjAsIHIxLCAjMTAKKzAwMDAwMGFjIDxbXj5dKj4gZTBhMzIwMDQgPwlhZGMJcjIsIHIzLCByNAorMDAwMDAwYjAgPFtePl0qPiBlMGE2NTI4NyA/CWFkYwlyNSwgcjYsIHI3LCBsc2wgIzUKKzAwMDAwMGI0IDxbXj5dKj4gZTBhMjExMTMgPwlhZGMJcjEsIHIyLCByMywgbHNsIHIxCiswMDAwMDBiOCA8W14+XSo+IGUyYzEwMDBhID8Jc2JjCXIwLCByMSwgIzEwCiswMDAwMDBiYyA8W14+XSo+IGUwYzMyMDA0ID8Jc2JjCXIyLCByMywgcjQKKzAwMDAwMGMwIDxbXj5dKj4gZTBjNjUyODcgPwlzYmMJcjUsIHI2LCByNywgbHNsICM1CiswMDAwMDBjNCA8W14+XSo+IGUwYzIxMTEzID8Jc2JjCXIxLCByMiwgcjMsIGxzbCByMQorMDAwMDAwYzggPFtePl0qPiBlMjYxMDAwYSA/CXJzYglyMCwgcjEsICMxMAorMDAwMDAwY2MgPFtePl0qPiBlMDYzMjAwNCA/CXJzYglyMiwgcjMsIHI0CiswMDAwMDBkMCA8W14+XSo+IGUwNjY1Mjg3ID8JcnNiCXI1LCByNiwgcjcsIGxzbCAjNQorMDAwMDAwZDQgPFtePl0qPiBlMDYyMTExMyA/CXJzYglyMSwgcjIsIHIzLCBsc2wgcjEKKzAwMDAwMGQ4IDxbXj5dKj4gZTJlMTAwMGEgPwlyc2MJcjAsIHIxLCAjMTAKKzAwMDAwMGRjIDxbXj5dKj4gZTBlMzIwMDQgPwlyc2MJcjIsIHIzLCByNAorMDAwMDAwZTAgPFtePl0qPiBlMGU2NTI4NyA/CXJzYwlyNSwgcjYsIHI3LCBsc2wgIzUKKzAwMDAwMGU0IDxbXj5dKj4gZTBlMjExMTMgPwlyc2MJcjEsIHIyLCByMywgbHNsIHIxCiswMDAwMDBlOCA8W14+XSo+IGUzODEwMDBhID8Jb3JyCXIwLCByMSwgIzEwCiswMDAwMDBlYyA8W14+XSo+IGUxODMyMDA0ID8Jb3JyCXIyLCByMywgcjQKKzAwMDAwMGYwIDxbXj5dKj4gZTE4NjUyODcgPwlvcnIJcjUsIHI2LCByNywgbHNsICM1CiswMDAwMDBmNCA8W14+XSo+IGUxODIxMTEzID8Jb3JyCXIxLCByMiwgcjMsIGxzbCByMQorMDAwMDAwZjggPFtePl0qPiBlM2MxMDAwYSA/CWJpYwlyMCwgcjEsICMxMAorMDAwMDAwZmMgPFtePl0qPiBlMWMzMjAwNCA/CWJpYwlyMiwgcjMsIHI0CiswMDAwMDEwMCA8W14+XSo+IGUxYzY1Mjg3ID8JYmljCXI1LCByNiwgcjcsIGxzbCAjNQorMDAwMDAxMDQgPFtePl0qPiBlMWMyMTExMyA/CWJpYwlyMSwgcjIsIHIzLCBsc2wgcjEKKzAwMDAwMTA4IDxbXj5dKj4gZTNlMDAwMGEgPwltdm4JcjAsICMxMAorMDAwMDAxMGMgPFtePl0qPiBlMWUwMjAwNCA/CW12bglyMiwgcjQKKzAwMDAwMTEwIDxbXj5dKj4gZTFlMDUyODcgPwltdm4JcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTE0IDxbXj5dKj4gZTFlMDExMTMgPwltdm4JcjEsIHIzLCBsc2wgcjEKKzAwMDAwMTE4IDxbXj5dKj4gZTMxMDAwMGEgPwl0c3QJcjAsICMxMAorMDAwMDAxMWMgPFtePl0qPiBlMTEyMDAwNCA/CXRzdAlyMiwgcjQKKzAwMDAwMTIwIDxbXj5dKj4gZTExNTAyODcgPwl0c3QJcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTI0IDxbXj5dKj4gZTExMTAxMTMgPwl0c3QJcjEsIHIzLCBsc2wgcjEKKzAwMDAwMTI4IDxbXj5dKj4gZTMzMDAwMGEgPwl0ZXEJcjAsICMxMAorMDAwMDAxMmMgPFtePl0qPiBlMTMyMDAwNCA/CXRlcQlyMiwgcjQKKzAwMDAwMTMwIDxbXj5dKj4gZTEzNTAyODcgPwl0ZXEJcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTM0IDxbXj5dKj4gZTEzMTAxMTMgPwl0ZXEJcjEsIHIzLCBsc2wgcjEKKzAwMDAwMTM4IDxbXj5dKj4gZTM1MDAwMGEgPwljbXAJcjAsICMxMAorMDAwMDAxM2MgPFtePl0qPiBlMTUyMDAwNCA/CWNtcAlyMiwgcjQKKzAwMDAwMTQwIDxbXj5dKj4gZTE1NTAyODcgPwljbXAJcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTQ0IDxbXj5dKj4gZTE1MTAxMTMgPwljbXAJcjEsIHIzLCBsc2wgcjEKKzAwMDAwMTQ4IDxbXj5dKj4gZTM3MDAwMGEgPwljbW4JcjAsICMxMAorMDAwMDAxNGMgPFtePl0qPiBlMTcyMDAwNCA/CWNtbglyMiwgcjQKKzAwMDAwMTUwIDxbXj5dKj4gZTE3NTAyODcgPwljbW4JcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTU0IDxbXj5dKj4gZTE3MTAxMTMgPwljbW4JcjEsIHIzLCBsc2wgcjEKKzAwMDAwMTU4IDxbXj5dKj4gZTMzMGYwMGEgPwl0ZXFwCXIwLCAjMTAKKzAwMDAwMTVjIDxbXj5dKj4gZTEzMmYwMDQgPwl0ZXFwCXIyLCByNAorMDAwMDAxNjAgPFtePl0qPiBlMTM1ZjI4NyA/CXRlcXAJcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTY0IDxbXj5dKj4gZTEzMWYxMTMgPwl0ZXFwCXIxLCByMywgbHNsIHIxCiswMDAwMDE2OCA8W14+XSo+IGUzNzBmMDBhID8JY21ucAlyMCwgIzEwCiswMDAwMDE2YyA8W14+XSo+IGUxNzJmMDA0ID8JY21ucAlyMiwgcjQKKzAwMDAwMTcwIDxbXj5dKj4gZTE3NWYyODcgPwljbW5wCXI1LCByNywgbHNsICM1CiswMDAwMDE3NCA8W14+XSo+IGUxNzFmMTEzID8JY21ucAlyMSwgcjMsIGxzbCByMQorMDAwMDAxNzggPFtePl0qPiBlMzUwZjAwYSA/CWNtcHAJcjAsICMxMAorMDAwMDAxN2MgPFtePl0qPiBlMTUyZjAwNCA/CWNtcHAJcjIsIHI0CiswMDAwMDE4MCA8W14+XSo+IGUxNTVmMjg3ID8JY21wcAlyNSwgcjcsIGxzbCAjNQorMDAwMDAxODQgPFtePl0qPiBlMTUxZjExMyA/CWNtcHAJcjEsIHIzLCBsc2wgcjEKKzAwMDAwMTg4IDxbXj5dKj4gZTMxMGYwMGEgPwl0c3RwCXIwLCAjMTAKKzAwMDAwMThjIDxbXj5dKj4gZTExMmYwMDQgPwl0c3RwCXIyLCByNAorMDAwMDAxOTAgPFtePl0qPiBlMTE1ZjI4NyA/CXRzdHAJcjUsIHI3LCBsc2wgIzUKKzAwMDAwMTk0IDxbXj5dKj4gZTExMWYxMTMgPwl0c3RwCXIxLCByMywgbHNsIHIxCiswMDAwMDE5OCA8W14+XSo+IGUwMDAwMjkxID8JbXVsCXIwLCByMSwgcjIKKzAwMDAwMTljIDxbXj5dKj4gZTAxMTAzOTIgPwltdWxzCXIxLCByMiwgcjMKKzAwMDAwMWEwIDxbXj5dKj4gMTAwMDAwOTEgPwltdWxuZQlyMCwgcjEsIHIwCiswMDAwMDFhNCA8W14+XSo+IDkwMTkwNzk4ID8JbXVsbHNzCXI5LCByOCwgcjcKKzAwMDAwMWE4IDxbXj5dKj4gZTAyMWJhOTkgPwltbGEJcjEsIHI5LCBzbCwgZnAKKzAwMDAwMWFjIDxbXj5dKj4gZTAzM2M5OTQgPwltbGFzCXIzLCByNCwgcjksIGlwCiswMDAwMDFiMCA8W14+XSo+IGIwMjlkNzk4ID8JbWxhbHQJcjksIHI4LCByNywgc3AKKzAwMDAwMWI0IDxbXj5dKj4gYTAzNGUzOTEgPwltbGFnZXMJcjQsIHIxLCByMywgbHIKKzAwMDAwMWI4IDxbXj5dKj4gZTU5MTAwMDAgPwlsZHIJcjAsIFxbcjFcXQorMDAwMDAxYmMgPFtePl0qPiBlNzkxMTAwMiA/CWxkcglyMSwgXFtyMSwgcjJcXQorMDAwMDAxYzAgPFtePl0qPiBlN2IzMjAwNCA/CWxkcglyMiwgXFtyMywgcjRcXSEKKzAwMDAwMWM0IDxbXj5dKj4gZTU5MjIwMjAgPwlsZHIJcjIsIFxbcjIsICMzMlxdCiswMDAwMDFjOCA8W14+XSo+IGU3OTMyNDI0ID8JbGRyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KKzAwMDAwMWNjIDxbXj5dKj4gMDdiNTQ0ODQgPwlsZHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQorMDAwMDAxZDAgPFtePl0qPiAxNDk1NDAwNiA/CWxkcm5lCXI0LCBcW3I1XF0sICM2CiswMDAwMDFkNCA8W14+XSo+IGU2YjIxMDAzID8JbGRydAlyMSwgXFtyMlxdLCByMworMDAwMDAxZDggPFtePl0qPiBlNjk0MjQyNSA/CWxkcglyMiwgXFtyNFxdLCByNSwgbHNyICM4CiswMDAwMDFkYyA8W14+XSo+IGU1MWYwMDA4ID8JbGRyCXIwLCAwMDAwMDFkYyA8W14+XSo+CiswMDAwMDFlMCA8W14+XSo+IGU1ZDQzMDAwID8JbGRyYglyMywgXFtyNFxdCiswMDAwMDFlNCA8W14+XSo+IDE0Zjg1MDAwID8JbGRybmVidAlyNSwgXFtyOFxdCiswMDAwMDFlOCA8W14+XSo+IGU1ODEwMDAwID8Jc3RyCXIwLCBcW3IxXF0KKzAwMDAwMWVjIDxbXj5dKj4gZTc4MTEwMDIgPwlzdHIJcjEsIFxbcjEsIHIyXF0KKzAwMDAwMWYwIDxbXj5dKj4gZTdhMzMwMDQgPwlzdHIJcjMsIFxbcjMsIHI0XF0hCiswMDAwMDFmNCA8W14+XSo+IGU1ODIyMDIwID8Jc3RyCXIyLCBcW3IyLCAjMzJcXQorMDAwMDAxZjggPFtePl0qPiBlNzgzMjQyNCA/CXN0cglyMiwgXFtyMywgcjQsIGxzciAjOFxdCiswMDAwMDFmYyA8W14+XSo+IDA3YTU0NDg0ID8Jc3RyZXEJcjQsIFxbcjUsIHI0LCBsc2wgIzlcXSEKKzAwMDAwMjAwIDxbXj5dKj4gMTQ4NTQwMDYgPwlzdHJuZQlyNCwgXFtyNVxdLCAjNgorMDAwMDAyMDQgPFtePl0qPiBlNjgyMTAwMyA/CXN0cglyMSwgXFtyMlxdLCByMworMDAwMDAyMDggPFtePl0qPiBlNmE0MjQyNSA/CXN0cnQJcjIsIFxbcjRcXSwgcjUsIGxzciAjOAorMDAwMDAyMGMgPFtePl0qPiBlNTBmMTAwNCA/CXN0cglyMSwgMDAwMDAyMTAgPFtePl0qPgorMDAwMDAyMTAgPFtePl0qPiBlNWM3MTAwMCA/CXN0cmIJcjEsIFxbcjdcXQorMDAwMDAyMTQgPFtePl0qPiBlNGUwMjAwMCA/CXN0cmJ0CXIyLCBcW3IwXF0KKzAwMDAwMjE4IDxbXj5dKj4gZTg5MDAwMDIgPwlsZG1pYQlyMCwge3IxfQorMDAwMDAyMWMgPFtePl0qPiAwOTkyMDAzOCA/CWxkbWVxaWIJcjIsIHtyMywgcjQsIHI1fQorMDAwMDAyMjAgPFtePl0qPiBlODUzZmZmZiA/CWxkbWRhCXIzLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHNsLCBmcCwgaXAsIHNwLCBsciwgcGN9XF4KKzAwMDAwMjI0IDxbXj5dKj4gZTkzYjA1ZmYgPwlsZG1kYglmcCEsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCBzbH0KKzAwMDAwMjI4IDxbXj5dKj4gZTk5MTAwZjcgPwlsZG1pYglyMSwge3IwLCByMSwgcjIsIHI0LCByNSwgcjYsIHI3fQorMDAwMDAyMmMgPFtePl0qPiBlODkyMDFmOCA/CWxkbWlhCXIyLCB7cjMsIHI0LCByNSwgcjYsIHI3LCByOH0KKzAwMDAwMjMwIDxbXj5dKj4gZTkxMzAwMDMgPwlsZG1kYglyMywge3IwLCByMX0KKzAwMDAwMjM0IDxbXj5dKj4gZTg3NDAzMDAgPwlsZG1kYQlyNCEsIHtyOCwgcjl9XF4KKzAwMDAwMjM4IDxbXj5dKj4gZTg4MDAwMDIgPwlzdG1pYQlyMCwge3IxfQorMDAwMDAyM2MgPFtePl0qPiAwOTgyMDAzOCA/CXN0bWVxaWIJcjIsIHtyMywgcjQsIHI1fQorMDAwMDAyNDAgPFtePl0qPiBlODQzZmZmZiA/CXN0bWRhCXIzLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHNsLCBmcCwgaXAsIHNwLCBsciwgcGN9XF4KKzAwMDAwMjQ0IDxbXj5dKj4gZTkyYTA1ZmYgPwlzdG1kYglzbCEsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCBzbH0KKzAwMDAwMjQ4IDxbXj5dKj4gZTgwMTAwMDcgPwlzdG1kYQlyMSwge3IwLCByMSwgcjJ9CiswMDAwMDI0YyA8W14+XSo+IGU5MDIwMDE4ID8Jc3RtZGIJcjIsIHtyMywgcjR9CiswMDAwMDI1MCA8W14+XSo+IGU4ODMwMDAzID8Jc3RtaWEJcjMsIHtyMCwgcjF9CiswMDAwMDI1NCA8W14+XSo+IGU5ZTQwMzAwID8Jc3RtaWIJcjQhLCB7cjgsIHI5fVxeCiswMDAwMDI1OCA8W14+XSo+IGVmMTIzNDU2ID8Jc3dpCTB4MDAxMjM0NTYKKzAwMDAwMjVjIDxbXj5dKj4gMmYwMDAwMzMgPwlzd2ljcwkweDAwMDAwMDMzCiswMDAwMDI2MCA8W14+XSo+IGViZmZmZmZlID8JYmwJMDAwMDAyNjAgPFtePl0qPgorWwkJXSoyNjA6Lipfd29tYmF0LioKKzAwMDAwMjY0IDxbXj5dKj4gNWJmZmZmZTkgPwlibHBsCTAwMDAwMjEwIDxiYXI+CiswMDAwMDI2OCA8W14+XSo+IGVhZmZmZmZlID8JYgkwMDAwMDI2OCA8W14+XSo+CitbCQldKjI2ODouKl93aWJibGUuKgorMDAwMDAyNmMgPFtePl0qPiBkYWZmZmZmZSA/CWJsZQkwMDAwMDI2YyA8W14+XSo+CitbCQldKjI2YzouKnRlc3RlcmZ1bmMuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwOTJjOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKQEAgLTAsMCArMSwxODkgQEAKK0AJVGVzdCBmaWxlIGZvciBBUk0vR0FTIC0tIGJhc2ljIGluc3RydWN0aW9ucworCisudGV4dAorLmFsaWduCisJbW92CXIwLCAjMAorCW1vdglyMSwgcjIKKwltb3YJcjMsIHI0LCBsc2wgIzMKKwltb3YJcjUsIHI2LCBsc3IgcjcKKwltb3YJcjgsIHI5LCBhc3IgcjEwCisJbW92CXIxMSwgcjEyLCBhc2wgcjEzCisJbW92CXIxNCwgcjE1LCBycngKKwltb3ZhbAlyMSwgcjIKKwltb3ZlcQlyMiwgcjMKKwltb3ZuZQlyNCwgcjUKKwltb3ZsdAlyNiwgcjcKKwltb3ZnZQlyOCwgcjkKKwltb3ZsZQlyMTAsIHIxMQorCW1vdmd0CXIxMiwgcjEzCisJbW92Y2MJcjEsIHIyCisJbW92Y3MJcjEsIHIzCisJbW92bWkJcjMsIHI2CisJbW92cGwJcjcsIHI5CisJbW92dnMJcjEsIHI4CisJbW92dmMJcjksIHIxLCBsc3IgIzMxCisJbW92aGkJcjgsIHIxNQorCW1vdmxzCXIxNSwgcjE0CisJbW92aHMJcjksIHI4CisJbW92dWwJcjEsIHIzCisJbW92cwlyMCwgcjgKKwltb3Z1bHMJcjAsIHI3CisJCisJYWRkCXIwLCByMSwgIzEwCisJYWRkCXIyLCByMywgcjQKKwlhZGQJcjUsIHI2LCByNywgYXNsICM1CisJYWRkCXIxLCByMiwgcjMsIGxzbCByMQorCisJYW5kCXIwLCByMSwgIzEwCisJYW5kCXIyLCByMywgcjQKKwlhbmQJcjUsIHI2LCByNywgYXNsICM1CisJYW5kCXIxLCByMiwgcjMsIGxzbCByMQorCisJZW9yCXIwLCByMSwgIzEwCisJZW9yCXIyLCByMywgcjQKKwllb3IJcjUsIHI2LCByNywgYXNsICM1CisJZW9yCXIxLCByMiwgcjMsIGxzbCByMQorCisJc3ViCXIwLCByMSwgIzEwCisJc3ViCXIyLCByMywgcjQKKwlzdWIJcjUsIHI2LCByNywgYXNsICM1CisJc3ViCXIxLCByMiwgcjMsIGxzbCByMQorCisJYWRjCXIwLCByMSwgIzEwCisJYWRjCXIyLCByMywgcjQKKwlhZGMJcjUsIHI2LCByNywgYXNsICM1CisJYWRjCXIxLCByMiwgcjMsIGxzbCByMQorCisJc2JjCXIwLCByMSwgIzEwCisJc2JjCXIyLCByMywgcjQKKwlzYmMJcjUsIHI2LCByNywgYXNsICM1CisJc2JjCXIxLCByMiwgcjMsIGxzbCByMQorCisJcnNiCXIwLCByMSwgIzEwCisJcnNiCXIyLCByMywgcjQKKwlyc2IJcjUsIHI2LCByNywgYXNsICM1CisJcnNiCXIxLCByMiwgcjMsIGxzbCByMQorCisJcnNjCXIwLCByMSwgIzEwCisJcnNjCXIyLCByMywgcjQKKwlyc2MJcjUsIHI2LCByNywgYXNsICM1CisJcnNjCXIxLCByMiwgcjMsIGxzbCByMQorCisJb3JyCXIwLCByMSwgIzEwCisJb3JyCXIyLCByMywgcjQKKwlvcnIJcjUsIHI2LCByNywgYXNsICM1CisJb3JyCXIxLCByMiwgcjMsIGxzbCByMQorCisJYmljCXIwLCByMSwgIzEwCisJYmljCXIyLCByMywgcjQKKwliaWMJcjUsIHI2LCByNywgYXNsICM1CisJYmljCXIxLCByMiwgcjMsIGxzbCByMQorCisJbXZuCXIwLCAjMTAKKwltdm4JcjIsIHI0CisJbXZuCXI1LCByNywgYXNsICM1CisJbXZuCXIxLCByMywgbHNsIHIxCisKKwl0c3QJcjAsICMxMAorCXRzdAlyMiwgcjQKKwl0c3QJcjUsIHI3LCBhc2wgIzUKKwl0c3QJcjEsIHIzLCBsc2wgcjEKKworCXRlcQlyMCwgIzEwCisJdGVxCXIyLCByNAorCXRlcQlyNSwgcjcsIGFzbCAjNQorCXRlcQlyMSwgcjMsIGxzbCByMQorCisJY21wCXIwLCAjMTAKKwljbXAJcjIsIHI0CisJY21wCXI1LCByNywgYXNsICM1CisJY21wCXIxLCByMywgbHNsIHIxCisKKwljbW4JcjAsICMxMAorCWNtbglyMiwgcjQKKwljbW4JcjUsIHI3LCBhc2wgIzUKKwljbW4JcjEsIHIzLCBsc2wgcjEKKworCXRlcXAJcjAsICMxMAorCXRlcXAJcjIsIHI0CisJdGVxcAlyNSwgcjcsIGFzbCAjNQorCXRlcXAJcjEsIHIzLCBsc2wgcjEKKworCWNtbnAJcjAsICMxMAorCWNtbnAJcjIsIHI0CisJY21ucAlyNSwgcjcsIGFzbCAjNQorCWNtbnAJcjEsIHIzLCBsc2wgcjEKKworCWNtcHAJcjAsICMxMAorCWNtcHAJcjIsIHI0CisJY21wcAlyNSwgcjcsIGFzbCAjNQorCWNtcHAJcjEsIHIzLCBsc2wgcjEKKworCXRzdHAJcjAsICMxMAorCXRzdHAJcjIsIHI0CisJdHN0cAlyNSwgcjcsIGFzbCAjNQorCXRzdHAJcjEsIHIzLCBsc2wgcjEKKworCW11bAlyMCwgcjEsIHIyCisJbXVscwlyMSwgcjIsIHIzCisJbXVsbmUJcjAsIHIxLCByMAorCW11bGxzcwlyOSwgcjgsIHI3CisKKwltbGEJcjEsIHI5LCByMTAsIHIxMQorCW1sYXMJcjMsIHI0LCByOSwgcjEyCisJbWxhbHQJcjksIHI4LCByNywgcjEzCisJbWxhZ2VzCXI0LCByMSwgcjMsIHIxNAorCisJbGRyCXIwLCBbcjFdCisJbGRyCXIxLCBbcjEsIHIyXQorCWxkcglyMiwgW3IzLCByNF0hCisJbGRyCXIyLCBbcjIsICMzMl0KKwlsZHIJcjIsIFtyMywgcjQsIGxzciAjOF0KKwlsZHJlcQlyNCwgW3I1LCByNCwgYXNsICM5XSEKKwlsZHJuZQlyNCwgW3I1XSwgIzYKKwlsZHJ0CXIxLCBbcjJdLCByMworCWxkcglyMiwgW3I0XSwgcjUsIGxzciAjOAorZm9vOgorCWxkcglyMCwgZm9vCisJbGRyYglyMywgW3I0XQorCWxkcm5lYnQJcjUsIFtyOF0KKwkKKwlzdHIJcjAsIFtyMV0KKwlzdHIJcjEsIFtyMSwgcjJdCisJc3RyCXIzLCBbcjMsIHI0XSEKKwlzdHIJcjIsIFtyMiwgIzMyXQorCXN0cglyMiwgW3IzLCByNCwgbHNyICM4XQorCXN0cmVxCXI0LCBbcjUsIHI0LCBhc2wgIzldIQorCXN0cm5lCXI0LCBbcjVdLCAjNgorCXN0cglyMSwgW3IyXSwgcjMKKwlzdHJ0CXIyLCBbcjRdLCByNSwgbHNyICM4CisJc3RyCXIxLCBiYXIKK2JhcjoKKwlzdHJhbGIJcjEsIFtyN10KKwlzdHJidAlyMiwgW3IwXQorCisJbGRtaWEJcjAsIHtyMX0KKwlsZG1lcWliCXIyLCB7cjMsIHI0LCByNX0KKwlsZG1hbGRhCXIzLCB7cjAtcjE1fV4KKwlsZG1kYglyMTEhLCB7cjAtcjgsIHIxMH0KKwlsZG1lZAlyMSwge3IwLCByMSwgcjJ9fDB4ZjAKKwlsZG1mZAlyMiwge3IzLCByNH0re3I1LCByNiwgcjcsIHI4fQorCWxkbWVhCXIzLCAzCisJbGRtZmEJcjQhLCB7cjgsIHI5fV4KKwkKKwlzdG1pYQlyMCwge3IxfQorCXN0bWVxaWIJcjIsIHtyMywgcjQsIHI1fQorCXN0bWFsZGEJcjMsIHtyMC1yMTV9XgorCXN0bWRiCXIxMCEsIHtyMC1yOCwgcjEwfQorCXN0bWVkCXIxLCB7cjAsIHIxLCByMn0KKwlzdG1mZAlyMiwge3IzLCByNH0KKwlzdG1lYQlyMywgMworCXN0bWZhCXI0ISwge3I4LCByOX1eCisKKwlzd2kJMHgxMjM0NTYKKwlzd2locwkweDMzCisKKwlibAlfd29tYmF0CisJYmxwbAliYXIKKwliCV93aWJibGUKKwlibGUJdGVzdGVyZnVuYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZTBlMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQKQEAgLTAsMCArMSw4IEBACisjb2JqZHVtcDogLXMKKyNhczogLUVMCisjbmFtZTogYXJtIGxpdHRsZS1lbmRpYW4gZnBjb25zdAorCisuKjogK2ZpbGUgZm9ybWF0IC4qYXJtLioKKworQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKKyAwMDAwIGNkY2M4YzNmIDAwMDAwMDAwIDk5OTlmMTNmIDlhOTk5OTk5IC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNjM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2xlLWZwY29uc3QucwpAQCAtMCwwICsxLDggQEAKKyMgVGVzdCBmcCBjb25zdGFudHMuCisjIFRoZXNlIG5lZWQgQVJNIHNwZWNpZmljIHN1cHBvcnQgYmVjYXVzZSA4IGJ5dGUgZnAgY29uc3RhbnRzIGluIGxpdHRsZQorIyBlbmRpYW4gbW9kZSBhcmUgcmVwcmVzZW50ZWQgYWJub3JtYWxseS4KKwkKKwkudGV4dAorCS5mbG9hdCAxLjEKKwkuZmxvYXQgMAorCS5kb3VibGUgMS4xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS90aHVtYi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNGI4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucwpAQCAtMCwwICsxLDE5MyBAQAorCS50ZXh0CisJLmNvZGUgMTYKKy5mb286CQorCWxzbAlyMiwgcjEsICMzCisJbHNyCXIzLCByNCwgIzMxCit3aWJibGUvZGF0YToJCisJYXNyCXI3LCByMCwgIzUKKworCWxzbAlyMSwgcjIsICMwCisJbHNyCXIzLCByNCwgIzAKKwlhc3IJcjQsIHI1LCAjMAorCisJbHNyCXI2LCByNywgIzMyCisJYXNyCXIwLCByMSwgIzMyCisKKwlhZGQJcjEsIHIyLCByMworCWFkZAlyMiwgcjQsICMyCisJc3ViCXIzLCByNSwgcjcKKwlzdWIJcjIsIHI0LCAjNworCisJbW92CXI0LCAjMjU1CisJY21wCXIzLCAjMjUwCisJYWRkCXI2LCAjMTIzCisJc3ViCXI1LCAjMTI4CisKKwlhbmQJcjMsIHI1CisJZW9yCXI0LCByNgorCWxzbAlyMSwgcjAKKwlsc3IJcjIsIHIzCisJYXNyCXI0LCByNgorCWFkYwlyNSwgcjcKKwlzYmMJcjAsIHI0CisJcm9yCXIxLCByNAorCXRzdAlyMiwgcjUKKwluZWcJcjEsIHIxCisJY21wCXIyLCByMworCWNtbglyMSwgcjQKKwlvcnIJcjAsIHIzCisJbXVsCXI0LCByNQorCWJpYwlyNSwgcjcKKwltdm4JcjUsIHI1CisKKwlhZGQJcjEsIHIxMworCWFkZAlyMTIsIHIyCisJYWRkCXI5LCByOQorCWNtcAlyMSwgcjE0CisJY21wCXI4LCByMAorCWNtcAlyMTIsIHIxNAorCW1vdglyMCwgcjkKKwltb3YJcjksIHI0CisJbW92CXI4LCByOAorCWJ4CXI3CisJYngJcjgKKwkuYWxpZ24gMAorCWJ4CXBjCisKKwlsZHIJcjMsIFtwYywgIzEyOF0KKwlsZHIJcjQsIGJhcgorCisJc3RyCXIwLCBbcjEsIHIyXQorCXN0cmIJcjEsIFtyMiwgcjRdCisJbGRyCXI1LCBbcjYsIHI3XQorCWxkcmIJcjIsIFtyNCwgcjVdCisJCisJLmFsaWduIDAKK2JhcjoJCisJc3RyaAlyMSwgW3IyLCByM10KKwlsZHJoCXIzLCBbcjQsIHIwXQorCWxkc2IJcjEsIFtyNiwgcjddCisJbGRzaAlyMiwgW3IwLCByNV0KKworCXN0cglyMywgW3IzLCAjMTI0XQorCWxkcglyMSwgW3I0LCAjMTI0XQorCWxkcglyNSwgW3I1XQorCXN0cmIJcjEsIFtyNSwgIzMxXQorCXN0cmIJcjEsIFtyNCwgIzVdCisJc3RyYglyMiwgW3I2XQorCisJc3RyaAlyNCwgW3I1LCAjNjJdCisJbGRyaAlyNSwgW3IwLCAjNF0KKwlsZHJoCXIzLCBbcjJdCisKKwlzdHIJcjMsIFtyMTMsICMxMDIwXQorCWxkcglyMSwgW3IxMywgIzQ0XQorCWxkcglyMiwgW3IxM10KKworCWFkZAlyNywgcjE1LCAjMTAyMAorCWFkZAlyNCwgcjEzLCAjNTEyCisKKwlhZGQJcjEzLCAjMjY4CisJYWRkCXIxMywgIy0xMDQKKwlzdWIJcjEzLCAjMjY4CisJc3ViCXIxMywgIy0xMDgKKworCXB1c2gJe3IwLCByMSwgcjIsIHI0fQorCXB1c2gJe3IwLCByMy1yNywgbHJ9CisJcG9wCXtyMywgcjQsIHI3fQorCXBvcAl7cjAtcjcsIHIxNX0KKworCXN0bWlhCXIzISwge3IwLCByMSwgcjQtcjd9CisJbGRtaWEJcjAhLCB7cjEtcjd9CisKKwliZXEJYmFyCisJYm5lCWJhcgorCWJjcwliYXIKKwliY2MJYmFyCisJYm1pCWJhcgorCWJwbAliYXIKKwlidnMJYmFyCisJYnZjCWJhcgorCWJoaQliYXIKKwlibHMJYmFyCisJYmdlCWJhcgorCWJndAliYXIKKwlibHQJYmFyCisJYmd0CWJhcgorCWJsZQliYXIKKwliaGkJYmFyCisJYmxvCWJhcgorCWJ1bAliYXIKKworY2xvc2U6CisJbHNsCXI0LCByNSwgI25lYXIgLSBjbG9zZQorbmVhcjoKKwlhZGQJcjIsIHIzLCAjbmVhciAtIGNsb3NlCisKKwlhZGQJc3AsIHNwLCAjMTI3IDw8IDIKKwlzdWIJc3AsIHNwLCAjMTI3IDw8IDIKKwlhZGQJcjAsIHNwLCAjMjU1IDw8IDIKKwlhZGQJcjAsIHBjLCAjMjU1IDw8IDIKKworCWFkZAlzcCwgc3AsICNiYXIgLSAuZm9vCisJc3ViCXNwLCBzcCwgI2JhciAtIC5mb28KKwlhZGQJcjAsIHNwLCAjYmFyIC0gLmZvbworCWFkZAlyMCwgcGMsICNiYXIgLSAuZm9vCisKKwlhZGQJcjEsICNiYXIgLSAuZm9vCisJbW92CXI2LCAjYmFyIC0gLmZvbworCWNtcAlyNywgI2JhciAtIC5mb28KKworCW5vcAorCW5vcAorCisJLmFybQorLmxvY2FsYmFyOgorCWIJLmxvY2FsYmFyCisJYgkud29tYmF0CisJYmwJLmxvY2FsYmFyCisJYmwJLndvbWJhdAorCisJYngJcjAKKwlzd2kJMHgxMjM0NTYKKworCS50aHVtYgorCUAgVGhlIGZvbGxvd2luZyB3aWxsIGJlIGRpc2Fzc2VtYmxlZCBpbmNvcnJlY3RseSBpZiB3ZSBkbyBub3QKKwlAIGhhdmUgYSBUaHVtYiBzeW1ib2wgZGVmaW5lZCBiZWZvcmUgdGhlIGZpcnN0IFRodW1iIGluc3RydWN0aW9uOgorbW9yZXRodW1iOgorCWFkcglyMCwgZm9yd2FyZG9ubHkKKworCWIJLmZvbworCWIJLndvbWJhdAorCWJsCS5mb28KKwlibAkud29tYmF0CisKKwlieAlyMAorCisJc3dpCTB4ZmYKKwkuYWxpZ24JMAorZm9yd2FyZG9ubHk6CisJYmVxCS53b21iYXQKKwlibmUJLndvbWJhdAorCWJjcwkud29tYmF0CisJYmNjCS53b21iYXQKKwlibWkJLndvbWJhdAorCWJwbAkud29tYmF0CisJYnZzCS53b21iYXQKKwlidmMJLndvbWJhdAorCWJoaQkud29tYmF0CisJYmxzCS53b21iYXQKKwliZ2UJLndvbWJhdAorCWJndAkud29tYmF0CisJYmx0CS53b21iYXQKKwliZ3QJLndvbWJhdAorCWJsZQkud29tYmF0CisJYmhpCS53b21iYXQKKwlibG8JLndvbWJhdAorCWJ1bAkud29tYmF0CisKKy5iYWNrOgorCWJsCS5sb2NhbAorCS5zcGFjZQkoMSA8PCAxMSkJQCBsZWF2ZSBzcGFjZSB0byBmb3JjZSBsb25nIG9mZnNldHMKKy5sb2NhbDoKKwlibAkuYmFjawpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hbGlnbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Njc2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKQEAgLTAsMCArMSwxNyBAQAorI29iamR1bXA6IC1kcgorI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKKyNhczoKKworLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2CisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArMDAwMCA8c3RhcnQ+OgorICAgMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCisgICA4OgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKKyAgMTA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQorICAxODoJMDBmMDAwMDAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCisgIDIwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKKyAgMjg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQorICAzMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMDM5YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucwpAQCAtMCwwICsxLDI4IEBACisjIHRlc3RzIHByb3BlciBoYW5kbGluZyBvZiBhbGlnbnMgb24gRDMwVgorCisJLnRleHQKKwkuYWxpZ24gMworc3RhcnQ6CisJYWJzCXIyMSxyNDIKKwkuYWxpZ24gMworCWFicwlyMjEscjQyCisJLmFsaWduIDQKKwlhYnMJcjIxLHI0MgorCS5hbGlnbiA0CisJYWJzCXIyMSxyNDIKKwkKKwkuZGF0YQorCS5sb25nCTB4ZGVhZGJlZWYKKwkKKwkudGV4dAorCWFicwlyMjEscjQyCisKKwkuZGF0YQorCS5hbGlnbiA0CisJLmxvbmcJMHhkZWFkYmVlZgorCQorCS50ZXh0CisJLmFsaWduIDMKKwlhYnMJcjIxLHI0MgorCS5lbmQKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWJjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LmQKQEAgLTAsMCArMSwzMSBAQAorI29iamR1bXA6IC1kcgorI25hbWU6IEQzMFYgYXJyYXkgdGVzdAorI2FzOgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCswMDAwIDxfX2Zvby0weDQ4PjoKKyAgIDA6CTg4MDgyMGMwIDgwMDAwMDQ4IAlhZGQubAlyMiwgcjMsIDB4NDgKKwkJCTA6IFJfRDMwVl8zMgkudGV4dAorICAgODoJODgwODIwYzAgODAwMDAwNDkgCWFkZC5sCXIyLCByMywgMHg0OQorCQkJODogUl9EMzBWXzMyCS50ZXh0CisgIDEwOgk4ODA4MjBjMCA4MDAwMDA0YSAJYWRkLmwJcjIsIHIzLCAweDRhCisJCQkxMDogUl9EMzBWXzMyCS50ZXh0CisgIDE4Ogk4ODA4MjBjMCA4MDAwMDA0YiAJYWRkLmwJcjIsIHIzLCAweDRiCisJCQkxODogUl9EMzBWXzMyCS50ZXh0CisgIDIwOgk4ODA4MjBjMCA4MDAwMDA0YyAJYWRkLmwJcjIsIHIzLCAweDRjCisJCQkyMDogUl9EMzBWXzMyCS50ZXh0CisgIDI4Ogk4ODA4MjBjMCA4MDAwMDA0ZCAJYWRkLmwJcjIsIHIzLCAweDRkCisJCQkyODogUl9EMzBWXzMyCS50ZXh0CisgIDMwOgk4ODA4MjBjMCA4MDAwMDA0ZSAJYWRkLmwJcjIsIHIzLCAweDRlCisJCQkzMDogUl9EMzBWXzMyCS50ZXh0CisgIDM4Ogk4ODA4MjBjMCA4MDAwMDA0ZiAJYWRkLmwJcjIsIHIzLCAweDRmCisJCQkzODogUl9EMzBWXzMyCS50ZXh0CisgIDQwOgk4ODA4MjBjMCA4MDAwMDA1MCAJYWRkLmwJcjIsIHIzLCAweDUwCisJCQk0MDogUl9EMzBWXzMyCS50ZXh0CisKKzArMDA0OCA8X19mb28+OgorICA0ODoJMTIzNDU2NzggMTIzNDU2NzggCS5sb25nCTB4MTIzNDU2NzgJfHwJLmxvbmcJMHgxMjM0NTY3OAorICA1MDoJMTIzNDU2NzggMDAwMDAwMDAgICAgICAJLmxvbmcJMHgxMjM0NTY3OAl8fAlicmEucwlyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTg3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKQEAgLTAsMCArMSwxNSBAQAorIyBEMzBWIGFycmF5IHRlc3QKKwkudGV4dAorCWFkZCByMiwgcjMgLCBfX2ZvbworCWFkZCByMiwgcjMgLCBfX2ZvbysxCisJYWRkIHIyLCByMyAsIF9fZm9vKzIKKwlhZGQgcjIsIHIzICwgX19mb28rMworCWFkZCByMiwgcjMgLCBfX2Zvbys0CisJYWRkIHIyLCByMyAsIF9fZm9vKzUKKwlhZGQgcjIsIHIzICwgX19mb28rNgorCWFkZCByMiwgcjMgLCBfX2Zvbys3CisJYWRkIHIyLCByMyAsIF9fZm9vKzgKK19fZm9vOgorCS5pbnQgMHgxMjM0NTY3OAorICAgICAgICAuaW50IDB4MTIzNDU2NzgKKyAgICAgICAgLmludCAweDEyMzQ1Njc4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QuZApAQCAtMCwwICsxLDIwIEBACisjb2JqZHVtcDogLWRyCisjbmFtZTogRDMwViBiaXR0ZXN0IG9wdAorI2FzOiAtV08KKworLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2CisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzAwMDAwMDAwIDwudGV4dD46CisgICAwOgkwMGYwMDAwMCA4NDQwMTA4MyAJbm9wCQktPglsZHcucwlyMSwgQFwocjIsIHIzXCkKKyAgIDg6CTA0NDA2MTQ0IDAwZjAwMDAwIAlsZHcucwlyNiwgQFwocjUsIHI0XCkJfHwJbm9wCQorICAxMDoJMDBmMDAwMDAgODIyMDEwODMgCW5vcAkJLT4JYnNldAlyMSwgcjIsIHIzCisgIDE4Ogk4MGYwMDAwMCAwMjAwMTA4MyAJbm9wCQk8LQlidHN0CWYxLCByMiwgcjMKKyAgMjA6CTAwZjAwMDAwIDAyMzAxMDgzIAlub3AJCXx8CWJjbHIJcjEsIHIyLCByMworICAyODoJMDBmMDAwMDAgODIxMDEwODMgCW5vcAkJLT4JYm5vdAlyMSwgcjIsIHIzCisgIDMwOgkwMjEwMTA4MyA4MGYwMDAwMCAJYm5vdAlyMSwgcjIsIHIzCS0+CW5vcAkKKyAgMzg6CTA0N2MwMTA1IDAyMjAxMDgzIAltb2RkZWMJcjQsIDB4NQl8fAlic2V0CXIxLCByMiwgcjMKKyAgNDA6CTAyMjAxMDgzIDg0N2MwMTA1IAlic2V0CXIxLCByMiwgcjMJLT4JbW9kZGVjCXI0LCAweDUKKyAgNDg6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgorICA1MDoJMDIyMDEwODMgMDhjMDQxNDYgCWJzZXQJcjEsIHIyLCByMwl8fAlqb2lubGwucwlyNCwgcjUsIHI2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQxYjdlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwKQEAgLTAsMCArMSw1NiBAQAorLio6IEFzc2VtYmxlciBtZXNzYWdlczoKKy4qOiBXYXJuaW5nOiBTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlcgorLio6IFdhcm5pbmc6IEV4ZWN1dGluZyBic2V0IGluIElVIG1heSBub3Qgd29yaworLio6IFdhcm5pbmc6IEV4ZWN1dGluZyBidHN0IGluIElVIG1heSBub3Qgd29yaworLio6IFdhcm5pbmc6IEV4ZWN1dGluZyBiY2xyIGluIElVIG1heSBub3Qgd29yaworLio6IFdhcm5pbmc6IEV4ZWN1dGluZyBibm90IGluIElVIG1heSBub3Qgd29yaworLio6IFdhcm5pbmc6IEV4ZWN1dGluZyBic2V0IGluIElVIG1heSBub3Qgd29yaworLio6IFdhcm5pbmc6IFN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyCitHQVMgTElTVElORyAuKgorCisKKyAgIDEgICAgICAgICAgICAgIAkjIGJpdHRlc3QucworICAgMiAgICAgICAgICAgICAgCSMKKyAgIDMgICAgICAgICAgICAgIAkjIEJpdCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zIFwoQkNMUiwgQk5PVCwgQlNFVCwgQlRTVFwpIHNob3VsZCBub3QgYmUgcGxhY2VkIGluIElVLgorICAgNCAgICAgICAgICAgICAgCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGluZGljYXRlcyB0aGV5IHNob3VsZCBiZSBpbiB0aGUgSVUsIEdBUyB3aWxsCisgICA1ICAgICAgICAgICAgICAJIyBnZW5lcmF0ZSB3YXJuaW5ncy4gVGhlIHJlYXNvbiB3aHkgdGhpcyBpcyBub3QgYW4gZXJyb3IgaXMgdGhhdCB0aG9zZSBpbnN0cnVjdGlvbnMgCisgICA2ICAgICAgICAgICAgICAJIyB3aWxsIGZhaWwgaW4gSVUgb25seSBvY2Nhc2lvbmFsbHkuIFRodXMgR0FTIHNob3VsZCBwYWNrIHRoZW0gaW4gTVUgZm9yCisgICA3ICAgICAgICAgICAgICAJIyBzYWZldHksIGFuZCBpdCBqdXN0IG5lZWRzIHRvIGRyYXcgYXR0ZW50aW9uIHdoZW4gYSB2aW9sYXRpb24gaXMgZ2l2ZW4uIAorICAgOCAgICAgICAgICAgICAgCQorICAgOSAgICAgICAgICAgICAgCQkKKyAgMTAgMDAwMCAwMEYwMDAwMCAJCW5vcCAtPiBsZHcgUjEsIEBcKFIyLFIzXCkKKyAgMTAgICAgICA4NDQwMTA4MyAKKyAgMTEgMDAwOCAwNDQwNjE0NCAJICAgICAgICBub3AgfHwgbGR3IFI2LCBAXChSNSxSNFwpCisuKiAgV2FybmluZzpTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlcgorICAxMSAgICAgIDAwRjAwMDAwIAorICAxMiAgICAgICAgICAgICAgCSAgICAgICAgCisgIDEzIDAwMTAgMDBGMDAwMDAgCSAgICAgICAgbm9wIC0+IEJTRVQgUjEsIFIyLCBSMyAKKy4qICBXYXJuaW5nOkV4ZWN1dGluZyBic2V0IGluIElVIG1heSBub3Qgd29yaworICAxMyAgICAgIDgyMjAxMDgzIAorICAxNCAwMDE4IDgwRjAwMDAwIAkgICAgICAgIG5vcCA8LSBCVFNUIEYxLCBSMiwgUjMgCisuKiAgV2FybmluZzpFeGVjdXRpbmcgYnRzdCBpbiBJVSBtYXkgbm90IHdvcmsKKyAgMTQgICAgICAwMjAwMTA4MyAKKyAgMTUgMDAyMCAwMEYwMDAwMCAJICAgICAgICBub3AgfHwgQkNMUiBSMSwgUjIsIFIzCisuKiAgV2FybmluZzpFeGVjdXRpbmcgYmNsciBpbiBJVSBtYXkgbm90IHdvcmsKKyAgMTUgICAgICAwMjMwMTA4MyAKKyAgMTYgMDAyOCAwMEYwMDAwMCAJICAgICAgICBub3AgLT4gQk5PVCBSMSwgUjIsIFIzCisuKiAgV2FybmluZzpFeGVjdXRpbmcgYm5vdCBpbiBJVSBtYXkgbm90IHdvcmsKKyAgMTYgICAgICA4MjEwMTA4MyAKKyAgMTcgMDAzMCAwMjEwMTA4MyAJICAgICAgICBCTk9UIHIxLCByMiwgcjMgLT4gbm9wCisgIDE3ICAgICAgODBGMDAwMDAgCisgIDE4ICAgICAgICAgICAgICAJICAgICAgICAKKyAgMTkgMDAzOCAwNDdDMDEwNSAJICAgICAgICBic2V0IHIxLCByMiwgcjMgfHwgbW9kZGVjIHI0LCA1CisuKiAgV2FybmluZzpTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlcgorICAxOSAgICAgIDAyMjAxMDgzIAorICAyMCAgICAgICAgICAgICAgCQorICAyMSAgICAgICAgICAgICAgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCisgIDIyIDAwNDAgMDIyMDEwODMgCSAgICAgICAgbW9kZGVjIHI0LCA1CisgIDIyICAgICAgODQ3QzAxMDUgCisgIDIzICAgICAgICAgICAgICAJCisgIDI0ICAgICAgICAgICAgICAJICAgICAgICBic2V0IHIxLCByMiwgcjMKKyAgMjUgMDA0OCAwMjIwMTA4MyAJICAgICAgICBqb2lubGwgcjQsIHI1LCByNgorICAyNSAgICAgIDg4QzA0MTQ2IAorICAyNiAgICAgICAgICAgICAgCQorICAyNyAgICAgICAgICAgICAgCSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKKyAgMjggMDA1MCA4MjIwMTA4MyAJICAgICAgICBic2V0IHIxLCByMiwgcjMKKyAgMjggICAgICAwOEMwNDE0NiAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5YTU2YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCkBAIC0wLDAgKzEsMjggQEAKKyMgYml0dGVzdC5zCisjCisjIEJpdCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zIChCQ0xSLCBCTk9ULCBCU0VULCBCVFNUKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KKyMgSWYgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGluZGljYXRlcyB0aGV5IHNob3VsZCBiZSBpbiB0aGUgSVUsIEdBUyB3aWxsCisjIGdlbmVyYXRlIHdhcm5pbmdzLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIG5vdCBhbiBlcnJvciBpcyB0aGF0IHRob3NlIGluc3RydWN0aW9ucyAKKyMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgorIyBzYWZldHksIGFuZCBpdCBqdXN0IG5lZWRzIHRvIGRyYXcgYXR0ZW50aW9uIHdoZW4gYSB2aW9sYXRpb24gaXMgZ2l2ZW4uIAorCisJCisJbm9wIC0+IGxkdyBSMSwgQChSMixSMykKKyAgICAgICAgbm9wIHx8IGxkdyBSNiwgQChSNSxSNCkKKyAgICAgICAgCisgICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCisgICAgICAgIG5vcCA8LSBCVFNUIEYxLCBSMiwgUjMgCisgICAgICAgIG5vcCB8fCBCQ0xSIFIxLCBSMiwgUjMKKyAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMworICAgICAgICBCTk9UIHIxLCByMiwgcjMgLT4gbm9wCisgICAgICAgIAorICAgICAgICBic2V0IHIxLCByMiwgcjMgfHwgbW9kZGVjIHI0LCA1CisKKyAgICAgICAgYnNldCByMSwgcjIsIHIzCisgICAgICAgIG1vZGRlYyByNCwgNQorCisgICAgICAgIGJzZXQgcjEsIHIyLCByMworICAgICAgICBqb2lubGwgcjQsIHI1LCByNgorCisgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2CisgICAgICAgIGJzZXQgcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWIwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAKQEAgLTAsMCArMSwzNSBAQAorIworIyBEMzBWIGFzc2VtYmxlciB0ZXN0cworIworCitwcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7CisgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCisgIHNldCB0ZXN0bmFtZSAiRDMwViAkbmFtZSIKKyAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCisgIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgorICBpZiB7W3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0geworICAgIGZhaWwgJHRlc3RuYW1lCisgICAgdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCisgICAgcmV0dXJuCisgIH0KKyAgcGFzcyAkdGVzdG5hbWUKK30KKworaWYge1tpc3RhcmdldCBkMzB2LSotKl19IHsKKyAgcnVuX2R1bXBfdGVzdCAiaW5zdCIKKyAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCisgIHJ1bl9kdW1wX3Rlc3QgImd1YXJkIgorICBydW5fZHVtcF90ZXN0ICJndWFyZC1kZWJ1ZyIKKyAgcnVuX2R1bXBfdGVzdCAicmVsb2MiCisgIHJ1bl9kdW1wX3Rlc3QgIm9wdCIKKyAgcnVuX2R1bXBfdGVzdCAiYXJyYXkiCisgIHJ1bl9kdW1wX3Rlc3QgImxhYmVsIgorICBydW5fbGlzdF90ZXN0ICJ3YXJuX29kZHJlZyIgIi1hbCIKKyAgcnVuX2xpc3RfdGVzdCAiYml0dGVzdCIgIi1hbCIKKyAgcnVuX2R1bXBfdGVzdCAiYml0dGVzdCIKKyAgcnVuX2xpc3RfdGVzdCAic2VyaWFsIiAiLWFsIgorICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyIiAiLWFsIgorICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyTyIgIi1hbCAtTyIKKyAgcnVuX2R1bXBfdGVzdCAibXVsIgorfQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhMTU0YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcuZApAQCAtMCwwICsxLDI1IEBACisjb2JqZHVtcDogLWxkcgorI25hbWU6IEQzMFYgZGVidWcgKC1nKSB0ZXN0CisjYXM6IC1nCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8LnRleHQ+OgorLio6WzAtOV0rCisgICAwOgkwODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMJcjEsIHIyLCByMwl8fAlub3AJCisuKjpbMC05XSsKKyAgIDg6CTA4MDAxMDgzIDAwZjAwMDAwIAlhZGQucwlyMSwgcjIsIHIzCXx8CW5vcAkKKy4qOlswLTldKworICAxMDoJMTgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3R4CXIxLCByMiwgcjMJfHwJbm9wCQorLio6WzAtOV0rCisgIDE4OgkyODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvZngJcjEsIHIyLCByMwl8fAlub3AJCisuKjpbMC05XSsKKyAgMjA6CTM4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy94dAlyMSwgcjIsIHIzCXx8CW5vcAkKKy4qOlswLTldKworICAyODoJNDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3hmCXIxLCByMiwgcjMJfHwJbm9wCQorLio6WzAtOV0rCisgIDMwOgk1ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdHQJcjEsIHIyLCByMwl8fAlub3AJCisuKjpbMC05XSsKKyAgMzg6CTY4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90ZglyMSwgcjIsIHIzCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQtZGVidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIwZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCkBAIC0wLDAgKzEsMTcgQEAKKyMgU2FtZSBhcyBndWFyZC5zIGJ1dCBoZXJlIHdlIGFyZSB0ZXN0aW5nIGRlYnVnICgtZykgYXNzZW1ibHkKKyMgT24gdGhlIEQzMFYsIGFzc2VtYmxpbmcgd2l0aCAtZyBzaG91bGQgZGlzYWJsZSB0aGUgVkxJVyBwYWNraW5nCisjIGFuZCBwdXQgb25seSBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUuCQorCisJLnRleHQKKworCWFkZAlyMSxyMixyMworCWFkZC9hbAlyMSxyMixyMworCWFkZC90eAlyMSxyMixyMworCWFkZC9meAlyMSxyMixyMworCWFkZC94dAlyMSxyMixyMworCWFkZC94ZglyMSxyMixyMworCWFkZC90dAlyMSxyMixyMworCWFkZC90ZglyMSxyMixyMworCisJCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZhMmRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kCkBAIC0wLDAgKzEsMTcgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBEMzBWIGd1YXJkZWQgZXhlY3V0aW9uIHRlc3QKKyNhczoKKworLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2CisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArMDAwMCA8LnRleHQ+OgorICAgMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMworICAgODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMworICAxMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMworICAxODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMworICAyMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMworICAyODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMworICAzMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMworICAzODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWNkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLnMKQEAgLTAsMCArMSwyNCBAQAorIyBEMzBWIGd1YXJkZWQgZXhlY3V0aW9uIGFzc2VtYmx5IHRlc3QKKworCS50ZXh0CisKKwlhZGQJcjEscjIscjMKKwlhZGQvYWwJcjEscjIscjMKKwlhZGQvdHgJcjEscjIscjMKKwlhZGQvZngJcjEscjIscjMKKwlhZGQveHQJcjEscjIscjMKKwlhZGQveGYJcjEscjIscjMKKwlhZGQvdHQJcjEscjIscjMKKwlhZGQvdGYJcjEscjIscjMKKworIyBjaGVjayBjYXNlIHNlbnNpdGl2aXR5IHRvbworCUFERAlyMSxyMixyMworCUFERC9BTAlyMSxyMixyMworCUFERC90eAlyMSxyMixyMworCWFkZC9GWAlyMSxyMixyMworCUFERC9YVAlyMSxyMixyMworCUFERC9YRglyMSxyMixyMworCWFkZC9UVAlyMSxyMixyMworCUFERC90ZglyMSxyMixyMworCQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjFjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZApAQCAtMCwwICsxLDI1NiBAQAorI29iamR1bXA6IC1kcgorI25hbWU6IEQzMFYgYmFzaWMgaW5zdHJ1Y3Rpb24gdGVzdAorI2FzOgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPHN0YXJ0PjoKKyAgIDA6CTA4ODE1YTgwIDg4MDAxMDgzIAlhYnMJcjIxLCByNDIJLT4JYWRkLnMJcjEsIHIyLCByMworICAgODoJMDgwYjJjZGEgMDBmMDAwMDAgCWFkZC5zCXI1MCwgcjUxLCAweDFhCXx8CW5vcAkKKyAgMTA6CTg4MGIyY2Y3IDhhYjFiZWVmIAlhZGQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICAxODoJMDgxMDEwODMgODgxYjJjZGEgCWFkZDJoLnMJcjEsIHIyLCByMwktPglhZGQyaC5zCXI1MCwgcjUxLCAweDFhCisgIDIwOgk4ODFiMmNmNyA4YWIxYmVlZiAJYWRkMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICAyODoJMDg0MDEwODMgODg0YjJjZGEgCWFkZGMucwlyMSwgcjIsIHIzCS0+CWFkZGMucwlyNTAsIHI1MSwgMHgxYQorICAzMDoJODg0YjJjZjcgOGFiMWJlZWYgCWFkZGMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICAzODoJMDkwMDEwODMgODkwYjJjZGEgCWFkZGhsbGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGwucwlyNTAsIHI1MSwgMHgxYQorICA0MDoJODkwYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICA0ODoJMDkxMDEwODMgODkxYjJjZGEgCWFkZGhsbGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsbGgucwlyNTAsIHI1MSwgMHgxYQorICA1MDoJODkxYjJjZjcgOGFiMWJlZWYgCWFkZGhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICA1ODoJMDkyMDEwODMgODkyYjJjZGEgCWFkZGhsaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGwucwlyNTAsIHI1MSwgMHgxYQorICA2MDoJODkyYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICA2ODoJMDkzMDEwODMgODkzYjJjZGEgCWFkZGhsaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhsaGgucwlyNTAsIHI1MSwgMHgxYQorICA3MDoJODkzYjJjZjcgOGFiMWJlZWYgCWFkZGhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICA3ODoJMDk0MDEwODMgODk0YjJjZGEgCWFkZGhobGwucwlyMSwgcjIsIHIzCS0+CWFkZGhobGwucwlyNTAsIHI1MSwgMHgxYQorICA4MDoJODk0YjJjZjcgOGFiMWJlZWYgCWFkZGhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICA4ODoJMDk1MDEwODMgODk1YjJjZGEgCWFkZGhobGgucwlyMSwgcjIsIHIzCS0+CWFkZGhobGgucwlyNTAsIHI1MSwgMHgxYQorICA5MDoJODk1YjJjZjcgOGFiMWJlZWYgCWFkZGhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICA5ODoJMDk2MDEwODMgODk2YjJjZGEgCWFkZGhoaGwucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGwucwlyNTAsIHI1MSwgMHgxYQorICBhMDoJODk2YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICBhODoJMDk3MDEwODMgODk3YjJjZGEgCWFkZGhoaGgucwlyMSwgcjIsIHIzCS0+CWFkZGhoaGgucwlyNTAsIHI1MSwgMHgxYQorICBiMDoJODk3YjJjZjcgOGFiMWJlZWYgCWFkZGhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICBiODoJMDg2MDEwODMgODg2YjJjZGEgCWFkZHMucwlyMSwgcjIsIHIzCS0+CWFkZHMucwlyNTAsIHI1MSwgMHgxYQorICBjMDoJODg2YjJjZjcgOGFiMWJlZWYgCWFkZHMubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICBjODoJMDg3MDEwODMgODg3YjJjZGEgCWFkZHMyaC5zCXIxLCByMiwgcjMJLT4JYWRkczJoLnMJcjUwLCByNTEsIDB4MWEKKyAgZDA6CTg4N2IyY2Y3IDhhYjFiZWVmIAlhZGRzMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICBkODoJMDM4MDEwODMgODM4YjJjZGEgCWFuZC5zCXIxLCByMiwgcjMJLT4JYW5kLnMJcjUwLCByNTEsIDB4MWEKKyAgZTA6CTgzOGIyY2Y3IDhhYjFiZWVmIAlhbmQubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorICBlODoJMDI4MDAwNDIgODI4ODMxMDUgCWFuZGZnCWYwLCBmMSwgZjIJLT4JYW5kZmcJZjMsIHMsIDB4NQorICBmMDoJMDhhMDEwODMgODhhODQxNDYgCWF2Zy5zCXIxLCByMiwgcjMJLT4JYXZnLnMJcjQsIHI1LCAweDYKKyAgZjg6CTg4YWIyY2Y3IDhhYjFiZWVmIAlhdmcubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDEwMDoJMDhiMDEwODMgODhiODQxNDYgCWF2ZzJoLnMJcjEsIHIyLCByMwktPglhdmcyaC5zCXI0LCByNSwgMHg2CisgMTA4Ogk4OGJiMmNmNyA4YWIxYmVlZiAJYXZnMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDExMDoJMDIzMDEwODMgODIzODQxNDYgCWJjbHIJcjEsIHIyLCByMwktPgliY2xyCXI0LCByNSwgMHg2CisgMTE4OgkwMjEwMTA4MyA4MjE4NWNjNiAJYm5vdAlyMSwgcjIsIHIzCS0+CWJub3QJcjUsIHI1MSwgMHg2CisgMTIwOgkwMDAwMDAyOSAwMGYwMDAwMCAJYnJhLnMJcjQxCXx8CW5vcAkKKyAxMjg6CTAwMDgwMDA4IDAwZjAwMDAwIAlicmEucwk0MAlcKDE2OCA8c3RhcnRcKzB4MTY4PlwpCXx8CW5vcAkKKyAxMzA6CTAwMDgxZTAxIDAwZjAwMDAwIAlicmEucwlmMDA4CVwoZjEzOCA8c3RhcnRcKzB4ZjEzOD5cKQl8fAlub3AJCisgMTM4OgkwMDQ2OTAyYSAwMGYwMDAwMCAJYnJhdG56LnMJcjQxLCByNDIJfHwJbm9wCQorIDE0MDoJODA0YzEwMDAgODAwMGYwMGQgCWJyYXRuei5sCXIxLCBmMDBkCVwoZjE0ZCA8c3RhcnRcKzB4ZjE0ZD5cKQorIDE0ODoJODA0YzEwMzcgOGFiMWYwMGQgCWJyYXRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjE1NSA8c3RhcnRcKzB4ZGVhZGYxNTU+XCkKKyAxNTA6CTAwNDI5MDJhIDAwZjAwMDAwIAlicmF0enIucwlyNDEsIHI0Mgl8fAlub3AJCisgMTU4Ogk4MDQ4MTAwMCA4MDAwZjAwZCAJYnJhdHpyLmwJcjEsIGYwMGQJXChmMTY1IDxzdGFydFwrMHhmMTY1PlwpCisgMTYwOgk4MDQ4MTAzNyA4YWIxZjAwZCAJYnJhdHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTZkIDxzdGFydFwrMHhkZWFkZjE2ZD5cKQorIDE2ODoJMDIyMDEwODMgODIyODVjYzYgCWJzZXQJcjEsIHIyLCByMwktPglic2V0CXI1LCByNTEsIDB4NgorIDE3MDoJMDAyMDAwMjkgMDBmMDAwMDAgCWJzci5zCXI0MQl8fAlub3AJCisgMTc4OgkwMDI4MWUwMSAwMGYwMDAwMCAJYnNyLnMJZjAwOAlcKGYxODAgPHN0YXJ0XCsweGYxODA+XCkJfHwJbm9wCQorIDE4MDoJODAyODAwMzcgOGFiMWYwMGQgCWJzci5sCS0yMTUyMGZmMwlcKGRlYWRmMThkIDxzdGFydFwrMHhkZWFkZjE4ZD5cKQorIDE4ODoJMDA2NjkwMmEgMDBmMDAwMDAgCWJzcnRuei5zCXI0MSwgcjQyCXx8CW5vcAkKKyAxOTA6CTgwNmMxMDAwIDgwMDBmMDBkIAlic3J0bnoubAlyMSwgZjAwZAlcKGYxOWQgPHN0YXJ0XCsweGYxOWQ+XCkKKyAxOTg6CTgwNmMxMDM3IDhhYjFmMDBkIAlic3J0bnoubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxYTUgPHN0YXJ0XCsweGRlYWRmMWE1PlwpCisgMWEwOgkwMDYyOTAyYSAwMGYwMDAwMCAJYnNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQorIDFhODoJODA2ODEwMDAgODAwMGYwMGQgCWJzcnR6ci5sCXIxLCBmMDBkCVwoZjFiNSA8c3RhcnRcKzB4ZjFiNT5cKQorIDFiMDoJODA2ODEwMzcgOGFiMWYwMGQgCWJzcnR6ci5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFiZCA8c3RhcnRcKzB4ZGVhZGYxYmQ+XCkKKyAxYjg6CTAyMDAxMDgzIDgyMDg1Y2M2IAlidHN0CWYxLCByMiwgcjMJLT4JYnRzdAl2LCByNTEsIDB4NgorIDFjMDoJMDJjMDAwYzEgODJjMDk1MTUgCWNtcGVxLnMJZjAsIHIzLCByMQktPgljbXBuZS5zCWYxLCByMjAsIHIyMQorIDFjODoJMDJjMTI3ZTAgODJjMWIwYzQgCWNtcGd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcGdlLnMJZjMsIHIzLCByNAorIDFkMDoJMDJjMjQwYzQgODJjMmQwYzQgCWNtcGx0LnMJcywgcjMsIHI0CS0+CWNtcGxlLnMJdiwgcjMsIHI0CisgMWQ4OgkwMmMzNjBjNCA4MmMzZjBjNCAJY21wcHMucwl2YSwgcjMsIHI0CS0+CWNtcG5nLnMJYywgcjMsIHI0CisgMWUwOgkwMmQxMjdlMCA4MmQxYjBjNCAJY21wdWd0LnMJZjIsIHIzMSwgcjMyCS0+CWNtcHVnZS5zCWYzLCByMywgcjQKKyAxZTg6CTAyZDI0MGM0IDgyZDJkMGM0IAljbXB1bHQucwlzLCByMywgcjQJLT4JY21wdWxlLnMJdiwgcjMsIHI0CisgMWYwOgkwMTAwMTAwOCA4MTA4MTAyMCAJZGJyYS5zCXIxLCByOAktPglkYnJhLnMJcjEsIDEwMAlcKDJmMCA8c3RhcnRcKzB4MmYwPlwpCisgMWY4Ogk4MTA4MTAzNyA4YWIxZjAwZCAJZGJyYS5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjIwNSA8c3RhcnRcKzB4ZGVhZGYyMDU+XCkKKyAyMDA6CTAxNDAyMDFmIDgxNDgyMDIwIAlkYnJhaS5zCTEwLCByMzEJLT4JZGJyYWkucwkxMCwgMTAwCVwoMzAwIDxzdGFydFwrMHgzMDA+XCkKKyAyMDg6CTgxNDgyMDM3IDhhYjFmMDBkIAlkYnJhaS5sCTEwLCAtMjE1MjBmZjMJXChkZWFkZjIxNSA8c3RhcnRcKzB4ZGVhZGYyMTU+XCkKKyAyMTA6CTAxMjAxMDA4IDAwZjAwMDAwIAlkYnNyLnMJcjEsIHI4CXx8CW5vcAkKKyAyMTg6CTAxMjgxMDIwIDAwZjAwMDAwIAlkYnNyLnMJcjEsIDEwMAlcKDMxOCA8c3RhcnRcKzB4MzE4PlwpCXx8CW5vcAkKKyAyMjA6CTgxMjgxMDM3IDhhYjFmMDBkIAlkYnNyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjJkIDxzdGFydFwrMHhkZWFkZjIyZD5cKQorIDIyODoJMDE2MDQwMWYgMDBmMDAwMDAgCWRic3JpLnMJMjAsIHIzMQl8fAlub3AJCisgMjMwOgkwMTY4NDAyMCAwMGYwMDAwMCAJZGJzcmkucwkyMCwgMTAwCVwoMzMwIDxzdGFydFwrMHgzMzA+XCkJfHwJbm9wCQorIDIzODoJODE2ODQwMzcgOGFiMWYwMGQgCWRic3JpLmwJMjAsIC0yMTUyMGZmMwlcKGRlYWRmMjQ1IDxzdGFydFwrMHhkZWFkZjI0NT5cKQorIDI0MDoJMDExMDEwMjAgMDBmMDAwMDAgCWRqbXAucwlyMSwgcjMyCXx8CW5vcAkKKyAyNDg6CTgxMTgxMDAwIDgwMDBmMDBkIAlkam1wLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+CisgMjUwOgk4MTE4MTAzNyA4YWIxZjAwZCAJZGptcC5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+CisgMjU4OgkwMTUwNjAyMCAwMGYwMDAwMCAJZGptcGkucwkzMCwgcjMyCXx8CW5vcAkKKyAyNjA6CTgxNTg2MDAwIDgwMDBmMDBkIAlkam1waS5sCTMwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgorIDI2ODoJODE1ODYwMzcgOGFiMWYwMGQgCWRqbXBpLmwJMzAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KKyAyNzA6CTAxMzAxMDIwIDAwZjAwMDAwIAlkanNyLnMJcjEsIHIzMgl8fAlub3AJCisgMjc4Ogk4MTM4MTAwMCA4MDAwZjAwZCAJZGpzci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgorIDI4MDoJODEzODEwMzcgOGFiMWYwMGQgCWRqc3IubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgorIDI4ODoJMDE3MDIwMjAgMDBmMDAwMDAgCWRqc3JpLnMJMTAsIHIzMgl8fAlub3AJCisgMjkwOgk4MTc4NDAwMCA4MDAwZjAwZCAJZGpzcmkubAkyMCwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KKyAyOTg6CTgxNzg4MDM3IDhhYjFmMDBkIAlkanNyaS5sCTQwLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+CisgMmEwOgkwMDEwMDAyOSAwMGYwMDAwMCAJam1wLnMJcjQxCXx8CW5vcAkKKyAyYTg6CTAwMTgxZTAxIDAwZjAwMDAwIAlqbXAucwlmMDA4IDxzdGFydFwrMHhmMDA4Pgl8fAlub3AJCisgMmIwOgk4MDE4MDAzNyA4YWIxZjAwZCAJam1wLmwJZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgorIDJiODoJMDA1NjkwMmEgMDBmMDAwMDAgCWptcHRuei5zCXI0MSwgcjQyCXx8CW5vcAkKKyAyYzA6CTgwNWMxMDAwIDgwMDBmMDBkIAlqbXB0bnoubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KKyAyYzg6CTgwNWMxMDM3IDhhYjFmMDBkIAlqbXB0bnoubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgorIDJkMDoJMDA1MjkwMmEgMDBmMDAwMDAgCWptcHR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKKyAyZDg6CTgwNTgxMDAwIDgwMDBmMDBkIAlqbXB0enIubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KKyAyZTA6CTgwNTgxMDM3IDhhYjFmMDBkIAlqbXB0enIubAlyMSwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgorIDJlODoJMDhjMDEwODQgODhjODEwOGYgCWpvaW5sbC5zCXIxLCByMiwgcjQJLT4Jam9pbmxsLnMJcjEsIHIyLCAweGYKKyAyZjA6CTg4YzgxMGI3IDhhYjFmMDBkIAlqb2lubGwubAlyMSwgcjIsIDB4ZGVhZGYwMGQKKyAyZjg6CTA4ZDAxMDg0IDg4ZDgxMDhmIAlqb2lubGgucwlyMSwgcjIsIHI0CS0+CWpvaW5saC5zCXIxLCByMiwgMHhmCisgMzAwOgk4OGQ4MTBiNyA4YWIxZjAwZCAJam9pbmxoLmwJcjEsIHIyLCAweGRlYWRmMDBkCisgMzA4OgkwOGUwMTA4NCA4OGU4MTA4ZiAJam9pbmhsLnMJcjEsIHIyLCByNAktPglqb2luaGwucwlyMSwgcjIsIDB4ZgorIDMxMDoJODhlODEwYjcgOGFiMWYwMGQgCWpvaW5obC5sCXIxLCByMiwgMHhkZWFkZjAwZAorIDMxODoJMDhmMDEwODQgODhmODEwOGYgCWpvaW5oaC5zCXIxLCByMiwgcjQJLT4Jam9pbmhoLnMJcjEsIHIyLCAweGYKKyAzMjA6CTg4ZjgxMGI3IDhhYjFmMDBkIAlqb2luaGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKKyAzMjg6CTAwMzAwMDI5IDAwZjAwMDAwIAlqc3IucwlyNDEJfHwJbm9wCQorIDMzMDoJMDAzODFlMDEgMDBmMDAwMDAgCWpzci5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKKyAzMzg6CTgwMzgwMDM3IDhhYjFmMDBkIAlqc3IubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+CisgMzQwOgkwMDc2OTAyYSAwMGYwMDAwMCAJanNydG56LnMJcjQxLCByNDIJfHwJbm9wCQorIDM0ODoJODA3YzEwMDAgODAwMGYwMGQgCWpzcnRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgorIDM1MDoJODA3YzEwMzcgOGFiMWYwMGQgCWpzcnRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+CisgMzU4OgkwMDcyOTAyYSAwMGYwMDAwMCAJanNydHpyLnMJcjQxLCByNDIJfHwJbm9wCQorIDM2MDoJODA3ODEwMDAgODAwMGYwMGQgCWpzcnR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgorIDM2ODoJODA3ODEwMzcgOGFiMWYwMGQgCWpzcnR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+CisgMzcwOgkwNDMwNjFjOCA4NDM0NjFjOCAJbGQyaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKKyAzNzg6CTA0M2M2MWM4IDg0Mzg2MWRhIAlsZDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKKyAzODA6CTg0Mzg2MWMwIDgwMDAxMjM0IAlsZDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDM4ODoJMDQ2MDYxYzggODQ2NDYxYzggCWxkMncucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyN1wrLCByOFwpCisgMzkwOgkwNDZjNjFjOCA4NDY4NjFkYSAJbGQydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQydy5zCXI2LCBAXChyNywgMHgxYVwpCisgMzk4Ogk4NDY4NjFjMCA4MDAwMTIzNCAJbGQydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKKyAzYTA6CTA0NTA2MWM4IDg0NTQ2MWM4IAlsZDRiaC5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaC5zCXI2LCBAXChyN1wrLCByOFwpCisgM2E4OgkwNDVjNjFjOCA4NDU4NjFkYSAJbGQ0YmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3LCAweDFhXCkKKyAzYjA6CTg0NTg2MWMwIDgwMDAxMjM0IAlsZDRiaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKKyAzYjg6CTA0ZDA2MWM4IDg0ZDQ2MWM4IAlsZDRiaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3XCssIHI4XCkKKyAzYzA6CTA0ZGM2MWM4IDg0ZDg2MWRhIAlsZDRiaHUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkNGJodS5zCXI2LCBAXChyNywgMHgxYVwpCisgM2M4Ogk4NGQ4NjFjMCA4MDAwMTIzNCAJbGQ0Ymh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDNkMDoJMDQwMDYxYzggODQwNDYxYzggCWxkYi5zCXI2LCBAXChyNywgcjhcKQktPglsZGIucwlyNiwgQFwocjdcKywgcjhcKQorIDNkODoJMDQwYzYxYzggODQwODYxZGEgCWxkYi5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRiLnMJcjYsIEBcKHI3LCAweDFhXCkKKyAzZTA6CTg0MDg2MWMwIDgwMDAxMjM0IAlsZGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCisgM2U4OgkwNDkwNjFjOCA4NDk0NjFjOCAJbGRidS5zCXI2LCBAXChyNywgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3XCssIHI4XCkKKyAzZjA6CTA0OWM2MWM4IDg0OTg2MWRhIAlsZGJ1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGJ1LnMJcjYsIEBcKHI3LCAweDFhXCkKKyAzZjg6CTg0OTg2MWMwIDgwMDAxMjM0IAlsZGJ1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDQwMDoJMDQyMDYxYzggODQyNDYxYzggCWxkaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGgucwlyNiwgQFwocjdcKywgcjhcKQorIDQwODoJMDQyYzYxYzggODQyODYxZGEgCWxkaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRoLnMJcjYsIEBcKHI3LCAweDFhXCkKKyA0MTA6CTg0Mjg2MWMwIDgwMDAxMjM0IAlsZGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCisgNDE4OgkwNDEwNjFjOCA4NDE0NjFjOCAJbGRoaC5zCXI2LCBAXChyNywgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKKyA0MjA6CTA0MWM2MWM4IDg0MTg2MWRhIAlsZGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKKyA0Mjg6CTg0MTg2MWMwIDgwMDAxMjM0IAlsZGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDQzMDoJMDRhMDYxYzggODRhNDYxYzggCWxkaHUucwlyNiwgQFwocjcsIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyN1wrLCByOFwpCisgNDM4OgkwNGFjNjFjOCA4NGE4NjFkYSAJbGRodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGRodS5zCXI2LCBAXChyNywgMHgxYVwpCisgNDQwOgk4NGE4NjFjMCA4MDAwMTIzNCAJbGRodS5sCXI2LCBAXChyNywgMHgxMjM0XCkKKyA0NDg6CTA0NDA2MWM4IDg0NDQ2MWM4IAlsZHcucwlyNiwgQFwocjcsIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3XCssIHI4XCkKKyA0NTA6CTA0NGM2MWM4IDg0NDg2MWRhIAlsZHcucwlyNiwgQFwocjctLCByOFwpCS0+CWxkdy5zCXI2LCBAXChyNywgMHgxYVwpCisgNDU4Ogk4NDQ4NjFjMCA4MDAwMTIzNCAJbGR3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDQ2MDoJOGI0ODEwOWYgMGI0MDEwODQgCW1hYzAJcjEsIHIyLCAweDFmCTwtCW1hYzAJcjEsIHIyLCByNAorIDQ2ODoJOGI0YzEwOWYgMGI0NDEwODQgCW1hYzEJcjEsIHIyLCAweDFmCTwtCW1hYzEJcjEsIHIyLCByNAorIDQ3MDoJOGI1ODEwOWYgMGI1MDEwODQgCW1hY3MwCXIxLCByMiwgMHgxZgk8LQltYWNzMAlyMSwgcjIsIHI0CisgNDc4Ogk4YjVjMTA5ZiAwYjU0MTA4NCAJbWFjczEJcjEsIHIyLCAweDFmCTwtCW1hY3MxCXIxLCByMiwgcjQKKyA0ODA6CTA0N2MwMDRhIDg0NzQwMDRhIAltb2RkZWMJcjEsIDB4YQktPgltb2RpbmMJcjEsIDB4YQorIDQ4ODoJOGI2ODEwOWYgMGI2MDEwODQgCW1zdWIwCXIxLCByMiwgMHgxZgk8LQltc3ViMAlyMSwgcjIsIHI0CisgNDkwOgk4YjZjMTA5ZiAwYjY0MTA4NCAJbXN1YjEJcjEsIHIyLCAweDFmCTwtCW1zdWIxCXIxLCByMiwgcjQKKyA0OTg6CThiMDgxMDhhIDBiMDAxMDg0IAltdWwJcjEsIHIyLCAweGEJPC0JbXVsCXIxLCByMiwgcjQKKyA0YTA6CThiNzgxMDlmIDBiNzAxMDg0IAltc3ViczAJcjEsIHIyLCAweDFmCTwtCW1zdWJzMAlyMSwgcjIsIHI0CisgNGE4Ogk4YjdjMTA5ZiAwYjc0MTA4NCAJbXN1YnMxCXIxLCByMiwgMHgxZgk8LQltc3ViczEJcjEsIHIyLCByNAorIDRiMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQorIDRiODoJOGEwODEwOGEgMGEwMDEwODQgCW11bDJoCXIxLCByMiwgMHhhCTwtCW11bDJoCXIxLCByMiwgcjQKKyA0YzA6CThhNDgxMDhhIDBhNDAxMDg0IAltdWxoeGxsCXIxLCByMiwgMHhhCTwtCW11bGh4bGwJcjEsIHIyLCByNAorIDRjODoJOGE1ODEwOGEgMGE1MDEwODQgCW11bGh4bGgJcjEsIHIyLCAweGEJPC0JbXVsaHhsaAlyMSwgcjIsIHI0CisgNGQwOgk4YTY4MTA4YSAwYTYwMTA4NCAJbXVsaHhobAlyMSwgcjIsIDB4YQk8LQltdWxoeGhsCXIxLCByMiwgcjQKKyA0ZDg6CThhNzgxMDhhIDBhNzAxMDg0IAltdWxoeGhoCXIxLCByMiwgMHhhCTwtCW11bGh4aGgJcjEsIHIyLCByNAorIDRlMDoJOGI5MDAwNDQgMGExMDgwODQgCW11bHhzCWEwLCByMSwgcjQJPC0JbXVseDJoCXI4LCByMiwgcjQKKyA0ZTg6CThiODgxMDhhIDBiODAwMDQ0IAltdWx4CWExLCByMiwgMHhhCTwtCW11bHgJYTAsIHIxLCByNAorIDRmMDoJOGJmODIwNGEgMGJmMDEwMDQgCW12ZmFjYwlyMiwgYTEsIDB4YQk8LQltdmZhY2MJcjEsIGEwLCByNAorIDRmODoJOGI5ODEwOGEgMGExODgwOGEgCW11bHhzCWExLCByMiwgMHhhCTwtCW11bHgyaAlyOCwgcjIsIDB4YQorIDUwMDoJMDFlMGEwODAgODFlMGExYzAgCW12ZnN5cwlyMTAsIHBjCS0+CW12ZnN5cwlyMTAsIHJwdF9jCisgNTA4OgkwMWUwYTAwMCA4MWUwYTAwMiAJbXZmc3lzCXIxMCwgcHN3CS0+CW12ZnN5cwlyMTAsIHBzd2gKKyA1MTA6CTAxZTBhMDAxIDgxZTBhMDAzIAltdmZzeXMJcjEwLCBwc3dsCS0+CW12ZnN5cwlyMTAsIGYwCisgNTE4OgkwMWUwYTEwMyA4YWYwMTA4NCAJbXZmc3lzCXIxMCwgcwktPgltdnRhY2MJYTEsIHIyLCByNAorIDUyMDoJMDBlMDcyODAgODBlMDAyODAgCW12dHN5cwlycHRfYywgcjEwCS0+CW12dHN5cwlwc3csIHIxMAorIDUyODoJMDBlMDAyODIgODBlMDAyODEgCW12dHN5cwlwc3doLCByMTAJLT4JbXZ0c3lzCXBzd2wsIHIxMAorIDUzMDoJMDBlMDAyODMgODBlMDMyODMgCW12dHN5cwlmMCwgcjEwCS0+CW12dHN5cwlmMywgcjEwCisgNTM4OgkwMGUwNDI4MyA4MGUwNTI4MyAJbXZ0c3lzCXMsIHIxMAktPgltdnRzeXMJdiwgcjEwCisgNTQwOgkwMGUwNjI4MyA4MGUwNzI4MyAJbXZ0c3lzCXZhLCByMTAJLT4JbXZ0c3lzCWMsIHIxMAorIDU0ODoJMDBmMDAwMDAgODM5MDEwODAgCW5vcAkJLT4Jbm90CXIxLCByMgorIDU1MDoJMDI5MDEwODAgODNhMDEwODQgCW5vdGZnCWYxLCBmMgktPglvci5zCXIxLCByMiwgcjQKKyA1NTg6CTAzYTgxMDlhIDAwZjAwMDAwIAlvci5zCXIxLCByMiwgMHgxYQl8fAlub3AJCisgNTYwOgk4M2E4MTBiNyA4YWIxZjAwZCAJb3IubAlyMSwgcjIsIDB4ZGVhZGYwMGQKKyA1Njg6CTAyYTAxMDg0IDgyYTg0MDgxIAlvcmZnCWYxLCBmMiwgcwktPglvcmZnCXMsIGYyLCAweDEKKyA1NzA6CTAwODAwMDAwIDAwZjAwMDAwIAlyZWl0CQl8fAlub3AJCisgNTc4OgkwMTgwMTAwMiAwMGYwMDAwMCAJcmVwZWF0LnMJcjEsIHIyCXx8CW5vcAkKKyA1ODA6CTgxODg0MDAwIDgwMDBkZWFkIAlyZXBlYXQubAlyNCwgZGVhZAlcKGU0MmQgPHN0YXJ0XCsweGU0MmQ+XCkKKyA1ODg6CTgxODg0MDM3IDhhYjFmMDBkIAlyZXBlYXQubAlyNCwgLTIxNTIwZmYzCVwoZGVhZGY1OTUgPHN0YXJ0XCsweGRlYWRmNTk1PlwpCisgNTkwOgkwMWEwYTAwMSA4MWE4YTIwMCAJcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgcjEJLT4JcmVwZWF0aS5zCWEJXCg1OWEgPHN0YXJ0XCsweDU5YT5cKSwgMTAwMAlcKDE1OTAgPHN0YXJ0XCsweDE1OTA+XCkKKyA1OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKKyA1YTA6CTAzNDAxMDg0IDgzNDgxMDhhIAlyb3QJcjEsIHIyLCByNAktPglyb3QJcjEsIHIyLCAweGEKKyA1YTg6CTAzNTAxMDg0IDgzNTgxMDhhIAlyb3QyaAlyMSwgcjIsIHI0CS0+CXJvdDJoCXIxLCByMiwgMHhhCisgNWIwOgk4YTg4MTA4YSAwYTgwMTA4NCAJc2F0CXIxLCByMiwgMHhhCTwtCXNhdAlyMSwgcjIsIHI0CisgNWI4Ogk4YTk4MTA4YSAwYTkwMTA4NCAJc2F0MmgJcjEsIHIyLCAweGEJPC0Jc2F0MmgJcjEsIHIyLCByNAorIDVjMDoJOGJjODEwOGEgMGJjMDEwODQgCXNhdGhsCXIxLCByMiwgMHhhCTwtCXNhdGhsCXIxLCByMiwgcjQKKyA1Yzg6CThiZDgxMDhhIDBiZDAxMDg0IAlzYXRoaAlyMSwgcjIsIDB4YQk8LQlzYXRoaAlyMSwgcjIsIHI0CisgNWQwOgk4YWE4MTA4YSAwYWEwMTA4NCAJc2F0eglyMSwgcjIsIDB4YQk8LQlzYXR6CXIxLCByMiwgcjQKKyA1ZDg6CThhYjgxMDhhIDBhYjAxMDg0IAlzYXR6MmgJcjEsIHIyLCAweGEJPC0Jc2F0ejJoCXIxLCByMiwgcjQKKyA1ZTA6CTAzMDAxMDg0IDgzMDgxMDhhIAlzcmEJcjEsIHIyLCByNAktPglzcmEJcjEsIHIyLCAweGEKKyA1ZTg6CTAzMTAxMDg0IDgzMTgxMDhhIAlzcmEyaAlyMSwgcjIsIHI0CS0+CXNyYTJoCXIxLCByMiwgMHhhCisgNWYwOgkwMzYwMTA4NCA4MzY4MTA4YSAJc3JjCXIxLCByMiwgcjQJLT4Jc3JjCXIxLCByMiwgMHhhCisgNWY4OgkwMzIwMTA4NCA4MzI4MTA4YSAJc3JsCXIxLCByMiwgcjQJLT4Jc3JsCXIxLCByMiwgMHhhCisgNjAwOgkwMzMwMTA4NCA4MzM4MTA4YSAJc3JsMmgJcjEsIHIyLCByNAktPglzcmwyaAlyMSwgcjIsIDB4YQorIDYwODoJMDUzMDYxYzggODUzNDYxYzggCXN0MmgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyN1wrLCByOFwpCisgNjEwOgkwNTNjNjFjOCA4NTM4NjFkYSAJc3QyaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3QyaC5zCXI2LCBAXChyNywgMHgxYVwpCisgNjE4Ogk4NTM4NjFjMCA4MDAwMTIzNCAJc3QyaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKKyA2MjA6CTA1NjA2MWM4IDg1NjQ2MWM4IAlzdDJ3LnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0MncucwlyNiwgQFwocjdcKywgcjhcKQorIDYyODoJMDU2YzYxYzggODU2ODYxZGEgCXN0MncucwlyNiwgQFwocjctLCByOFwpCS0+CXN0MncucwlyNiwgQFwocjcsIDB4MWFcKQorIDYzMDoJODU2ODYxYzAgODAwMDEyMzQgCXN0MncubAlyNiwgQFwocjcsIDB4MTIzNFwpCisgNjM4OgkwNTUwNjFjOCA4NTU0NjFjOCAJc3Q0aGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Q0aGIucwlyNiwgQFwocjdcKywgcjhcKQorIDY0MDoJMDU1YzYxYzggODU1ODYxZGEgCXN0NGhiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyNywgMHgxYVwpCisgNjQ4Ogk4NTU4NjFjMCA4MDAwMTIzNCAJc3Q0aGIubAlyNiwgQFwocjcsIDB4MTIzNFwpCisgNjUwOgkwNTAwNjFjOCA4NTA0NjFjOCAJc3RiLnMJcjYsIEBcKHI3LCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyN1wrLCByOFwpCisgNjU4OgkwNTBjNjFjOCA4NTA4NjFkYSAJc3RiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGIucwlyNiwgQFwocjcsIDB4MWFcKQorIDY2MDoJODUwODYxYzAgODAwMDEyMzQgCXN0Yi5sCXI2LCBAXChyNywgMHgxMjM0XCkKKyA2Njg6CTA1MjA2MWM4IDg1MjQ2MWM4IAlzdGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3XCssIHI4XCkKKyA2NzA6CTA1MmM2MWM4IDg1Mjg2MWRhIAlzdGgucwlyNiwgQFwocjctLCByOFwpCS0+CXN0aC5zCXI2LCBAXChyNywgMHgxYVwpCisgNjc4Ogk4NTI4NjFjMCA4MDAwMTIzNCAJc3RoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDY4MDoJMDUxMDYxYzggODUxNDYxYzggCXN0aGgucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyN1wrLCByOFwpCisgNjg4OgkwNTFjNjFjOCA4NTE4NjFkYSAJc3RoaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoaC5zCXI2LCBAXChyNywgMHgxYVwpCisgNjkwOgk4NTE4NjFjMCA4MDAwMTIzNCAJc3RoaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKKyA2OTg6CTA1NDA2MWM4IDg1NDQ2MWM4IAlzdHcucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3XCssIHI4XCkKKyA2YTA6CTA1NGM2MWM4IDg1NDg2MWRhIAlzdHcucwlyNiwgQFwocjctLCByOFwpCS0+CXN0dy5zCXI2LCBAXChyNywgMHgxYVwpCisgNmE4Ogk4NTQ4NjFjMCA4MDAwMTIzNCAJc3R3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQorIDZiMDoJMDgyMDEwODMgODgyYjJjZGEgCXN1Yi5zCXIxLCByMiwgcjMJLT4Jc3ViLnMJcjUwLCByNTEsIDB4MWEKKyA2Yjg6CTg4MmIyY2Y3IDhhYjFiZWVmIAlzdWIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDZjMDoJMDgzMDEwODMgODgzYjJjZGEgCXN1YjJoLnMJcjEsIHIyLCByMwktPglzdWIyaC5zCXI1MCwgcjUxLCAweDFhCisgNmM4Ogk4ODNiMmNmNyA4YWIxYmVlZiAJc3ViMmgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDZkMDoJMDg1MDEwODMgODg1YjJjZGEgCXN1YmIucwlyMSwgcjIsIHIzCS0+CXN1YmIucwlyNTAsIHI1MSwgMHgxYQorIDZkODoJODg1YjJjZjcgOGFiMWJlZWYgCXN1YmIubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDZlMDoJMDk4MDEwODMgODk4YjJjZGEgCXN1YmhsbGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGwucwlyNTAsIHI1MSwgMHgxYQorIDZlODoJODk4YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDZmMDoJMDk5MDEwODMgODk5YjJjZGEgCXN1YmhsbGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsbGgucwlyNTAsIHI1MSwgMHgxYQorIDZmODoJODk5YjJjZjcgOGFiMWJlZWYgCXN1YmhsbGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDcwMDoJMDlhMDEwODMgODlhYjJjZGEgCXN1YmhsaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGwucwlyNTAsIHI1MSwgMHgxYQorIDcwODoJODlhYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDcxMDoJMDliMDEwODMgODliYjJjZGEgCXN1YmhsaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhsaGgucwlyNTAsIHI1MSwgMHgxYQorIDcxODoJODliYjJjZjcgOGFiMWJlZWYgCXN1YmhsaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDcyMDoJMDljMDEwODMgODljYjJjZGEgCXN1YmhobGwucwlyMSwgcjIsIHIzCS0+CXN1YmhobGwucwlyNTAsIHI1MSwgMHgxYQorIDcyODoJODljYjJjZjcgOGFiMWJlZWYgCXN1YmhobGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDczMDoJMDlkMDEwODMgODlkYjJjZGEgCXN1YmhobGgucwlyMSwgcjIsIHIzCS0+CXN1YmhobGgucwlyNTAsIHI1MSwgMHgxYQorIDczODoJODlkYjJjZjcgOGFiMWJlZWYgCXN1YmhobGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDc0MDoJMDllMDEwODMgODllYjJjZGEgCXN1YmhoaGwucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGwucwlyNTAsIHI1MSwgMHgxYQorIDc0ODoJODllYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGwubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDc1MDoJMDlmMDEwODMgODlmYjJjZGEgCXN1YmhoaGgucwlyMSwgcjIsIHIzCS0+CXN1YmhoaGgucwlyNTAsIHI1MSwgMHgxYQorIDc1ODoJODlmYjJjZjcgOGFiMWJlZWYgCXN1YmhoaGgubAlyNTAsIHI1MSwgMHhkZWFkYmVlZgorIDc2MDoJMDA5MDAwMDEgMDBmMDAwMDAgCXRyYXAucwlyMQl8fAlub3AJCisgNzY4OgkwMDk4MDAwYSAwMGYwMDAwMCAJdHJhcC5zCTB4YQl8fAlub3AJCisgNzcwOgkwM2IwMTA4NCA4M2I4MTA4YSAJeG9yLnMJcjEsIHIyLCByNAktPgl4b3IucwlyMSwgcjIsIDB4YQorIDc3ODoJODNiODEwYjcgOGFiMWYwMGQgCXhvci5sCXIxLCByMiwgMHhkZWFkZjAwZAorIDc4MDoJMDJiMDEwODQgODJiODExMGEgCXhvcmZnCWYxLCBmMiwgcwktPgl4b3JmZwlmMSwgcywgMHhhCisgNzg4OgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCisgNzkwOgkwMGYwMDAwMCA4MGYwMDAwMCAJbm9wCQktPglub3AJCisgNzk4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCisgN2EwOgk4MGYwMDAwMCAwMGYwMDAwMCAJbm9wCQk8LQlub3AJCisgN2E4OgkwMzkwMTA4MCAwMGYwMDAwMCAJbm90CXIxLCByMgl8fAlub3AJCisgN2IwOgkwMzkwMjBjMCA4MGYwMDAwMCAJbm90CXIyLCByMwktPglub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QucwpAQCAtMCwwICsxLDUwNCBAQAorIyB0ZXN0IGFsbCBpbnN0cnVjdGlvbnMKKworc3RhcnQ6CisJYWJzCXIyMSxyNDIKKworCWFkZAlyMSxyMixyMworCWFkZAlyNTAscjUxLDB4MWEKKwlhZGQJcjUwLHI1MSwweGRlYWRiZWVmCisKKwlhZGQyaAlyMSxyMixyMworCWFkZDJoCXI1MCxyNTEsMHgxYQorCWFkZDJoCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJYWRkYwlyMSxyMixyMworCWFkZGMJcjUwLHI1MSwweDFhCisJYWRkYwlyNTAscjUxLDB4ZGVhZGJlZWYKKworCWFkZGhsbGwJcjEscjIscjMKKwlhZGRobGxsCXI1MCxyNTEsMHgxYQorCWFkZGhsbGwJcjUwLHI1MSwweGRlYWRiZWVmCisKKwlhZGRobGxoCXIxLHIyLHIzCisJYWRkaGxsaAlyNTAscjUxLDB4MWEKKwlhZGRobGxoCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJYWRkaGxobAlyMSxyMixyMworCWFkZGhsaGwJcjUwLHI1MSwweDFhCisJYWRkaGxobAlyNTAscjUxLDB4ZGVhZGJlZWYKKworCWFkZGhsaGgJcjEscjIscjMKKwlhZGRobGhoCXI1MCxyNTEsMHgxYQorCWFkZGhsaGgJcjUwLHI1MSwweGRlYWRiZWVmCisJCQorCWFkZGhobGwJcjEscjIscjMKKwlhZGRoaGxsCXI1MCxyNTEsMHgxYQorCWFkZGhobGwJcjUwLHI1MSwweGRlYWRiZWVmCisKKwlhZGRoaGxoCXIxLHIyLHIzCisJYWRkaGhsaAlyNTAscjUxLDB4MWEKKwlhZGRoaGxoCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJYWRkaGhobAlyMSxyMixyMworCWFkZGhoaGwJcjUwLHI1MSwweDFhCisJYWRkaGhobAlyNTAscjUxLDB4ZGVhZGJlZWYKKworCWFkZGhoaGgJcjEscjIscjMKKwlhZGRoaGhoCXI1MCxyNTEsMHgxYQorCWFkZGhoaGgJcjUwLHI1MSwweGRlYWRiZWVmCisJCisJYWRkcwlyMSxyMixyMworCWFkZHMJcjUwLHI1MSwweDFhCisJYWRkcwlyNTAscjUxLDB4ZGVhZGJlZWYKKwkJCisJYWRkczJoCXIxLHIyLHIzCisJYWRkczJoCXI1MCxyNTEsMHgxYQorCWFkZHMyaAlyNTAscjUxLDB4ZGVhZGJlZWYKKwkJCisJYW5kCXIxLHIyLHIzCisJYW5kCXI1MCxyNTEsMHgxYQorCWFuZAlyNTAscjUxLDB4ZGVhZGJlZWYKKworCWFuZGZnCWYwLGYxLGYyCisJYW5kZmcJZjMsZjQsNQorCQorCWF2ZwlyMSxyMixyMworCWF2ZwlyNCxyNSw2CisJYXZnCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJYXZnMmgJcjEscjIscjMKKwlhdmcyaAlyNCxyNSw2CisJYXZnMmgJcjUwLHI1MSwweGRlYWRiZWVmCisKKwliY2xyCXIxLHIyLHIzCisJYmNscglyNCxyNSw2CisJCisJYm5vdAlyMSxyMixyMworCWJub3QJcjUscjUxLDYKKwkJCQorCWJyYQlyNDEKKwlicmEJMHg0MAorCWJyYQkweGYwMGQKKworCWJyYXRueglyNDEscjQyCisJYnJhdG56CXIxLDB4ZjAwZAorCWJyYXRueglyMSwweGRlYWRmMDBkCisKKwlicmF0enIJcjQxLHI0MgorCWJyYXR6cglyMSwweGYwMGQKKwlicmF0enIJcjEsMHhkZWFkZjAwZAorCisJYnNldAlyMSxyMixyMworCWJzZXQJcjUscjUxLDYKKworCWJzcglyNDEKKwlic3IJMHhmMDBkCisJYnNyCTB4ZGVhZGYwMGQKKworCWJzcnRueglyNDEscjQyCisJYnNydG56CXIxLDB4ZjAwZAorCWJzcnRueglyMSwweGRlYWRmMDBkCisKKwlic3J0enIJcjQxLHI0MgorCWJzcnR6cglyMSwweGYwMGQKKwlic3J0enIJcjEsMHhkZWFkZjAwZAorCisJYnRzdAlmMSxyMixyMworCWJ0c3QJZjUscjUxLDYKKwkJCQkJCQorCWNtcGVxCWYwLHIzLHIxCisJY21wbmUJZjEscjIwLHIyMQorCWNtcGd0CWYyLHIzMSxyMzIKKwljbXBnZQlmMyxyMyxyNAorCWNtcGx0CWY0LHIzLHI0CisJY21wbGUJZjUscjMscjQKKwljbXBwcwlmNixyMyxyNAorCWNtcG5nCWY3LHIzLHI0CQkJCQorCisJY21wdWd0CWYyLHIzMSxyMzIKKwljbXB1Z2UJZjMscjMscjQKKwljbXB1bHQJZjQscjMscjQKKwljbXB1bGUJZjUscjMscjQKKwkJCisJZGJyYQlyMSxyOCAKKwlkYnJhCXIxLDB4MTAwCisJZGJyYQlyMSwweGRlYWRmMDBkCisKKwlkYnJhaQkweDEwLHIzMQorCWRicmFpCTB4MTAsMHgxMDAKKwlkYnJhaQkweDEwLDB4ZGVhZGYwMGQKKworCWRic3IJcjEscjggfHwgbm9wCisJZGJzcglyMSwweDEwMCB8fCBub3AKKwlkYnNyCXIxLDB4ZGVhZGYwMGQKKworCWRic3JpCTB4MjAscjMxIHx8IG5vcAorCWRic3JpCTB4MjAsMHgxMDAgfHwgbm9wCisJZGJzcmkJMHgyMCwweGRlYWRmMDBkCisKKwlkam1wCXIxLHIzMgorCWRqbXAJcjEsMHhmMDBkCisJZGptcAlyMSwweGRlYWRmMDBkCisKKwlkam1waQkweDMwLHIzMgorCWRqbXBpCTB4MzAsMHhmMDBkCisJZGptcGkJMHgzMCwweGRlYWRmMDBkCisKKwlkanNyCXIxLHIzMgorCWRqc3IJcjEsMHhmMDBkCisJZGpzcglyMSwweGRlYWRmMDBkCisKKwlkanNyaQkweDEwLHIzMgorCWRqc3JpCTB4MjAsMHhmMDBkCisJZGpzcmkJMHg0MCwweGRlYWRmMDBkCisJCisJam1wCXI0MQorCWptcAkweGYwMGQKKwlqbXAJMHhkZWFkZjAwZAorCisJam1wdG56CXI0MSxyNDIKKwlqbXB0bnoJcjEsMHhmMDBkCisJam1wdG56CXIxLDB4ZGVhZGYwMGQKKworCWptcHR6cglyNDEscjQyCisJam1wdHpyCXIxLDB4ZjAwZAorCWptcHR6cglyMSwweGRlYWRmMDBkCisKKwlqb2lubGwJcjEscjIscjQKKwlqb2lubGwJcjEscjIsMHhmCisJam9pbmxsCXIxLHIyLDB4ZGVhZGYwMGQJCisKKwlqb2lubGgJcjEscjIscjQKKwlqb2lubGgJcjEscjIsMHhmCisJam9pbmxoCXIxLHIyLDB4ZGVhZGYwMGQJCisKKwlqb2luaGwJcjEscjIscjQKKwlqb2luaGwJcjEscjIsMHhmCisJam9pbmhsCXIxLHIyLDB4ZGVhZGYwMGQJCisKKwlqb2luaGgJcjEscjIscjQKKwlqb2luaGgJcjEscjIsMHhmCisJam9pbmhoCXIxLHIyLDB4ZGVhZGYwMGQJCisKKwlqc3IJcjQxCisJanNyCTB4ZjAwZAorCWpzcgkweGRlYWRmMDBkCisKKwlqc3J0bnoJcjQxLHI0MgorCWpzcnRueglyMSwweGYwMGQKKwlqc3J0bnoJcjEsMHhkZWFkZjAwZAorCisJanNydHpyCXI0MSxyNDIKKwlqc3J0enIJcjEsMHhmMDBkCisJanNydHpyCXIxLDB4ZGVhZGYwMGQKKwkJCQkJCisJbGQyaAlyNixAKHI3LHI4KQorCWxkMmgJcjYsQChyNysscjgpCisJbGQyaAlyNixAKHI3LSxyOCkKKwlsZDJoCXI2LEAocjcsMHgxYSkKKwlsZDJoCXI2LEAocjcsMHgxMjM0KQorCQorCWxkMncJcjYsQChyNyxyOCkKKwlsZDJ3CXI2LEAocjcrLHI4KQorCWxkMncJcjYsQChyNy0scjgpCisJbGQydwlyNixAKHI3LDB4MWEpCisJbGQydwlyNixAKHI3LDB4MTIzNCkKKwkKKwlsZDRiaAlyNixAKHI3LHI4KQorCWxkNGJoCXI2LEAocjcrLHI4KQorCWxkNGJoCXI2LEAocjctLHI4KQorCWxkNGJoCXI2LEAocjcsMHgxYSkKKwlsZDRiaAlyNixAKHI3LDB4MTIzNCkKKworCWxkNGJodQlyNixAKHI3LHI4KQorCWxkNGJodQlyNixAKHI3KyxyOCkKKwlsZDRiaHUJcjYsQChyNy0scjgpCisJbGQ0Ymh1CXI2LEAocjcsMHgxYSkKKwlsZDRiaHUJcjYsQChyNywweDEyMzQpCisKKwlsZGIJcjYsQChyNyxyOCkKKwlsZGIJcjYsQChyNysscjgpCisJbGRiCXI2LEAocjctLHI4KQorCWxkYglyNixAKHI3LDB4MWEpCisJbGRiCXI2LEAocjcsMHgxMjM0KQorCisJbGRidQlyNixAKHI3LHI4KQorCWxkYnUJcjYsQChyNysscjgpCisJbGRidQlyNixAKHI3LSxyOCkKKwlsZGJ1CXI2LEAocjcsMHgxYSkKKwlsZGJ1CXI2LEAocjcsMHgxMjM0KQorCisJbGRoCXI2LEAocjcscjgpCisJbGRoCXI2LEAocjcrLHI4KQorCWxkaAlyNixAKHI3LSxyOCkKKwlsZGgJcjYsQChyNywweDFhKQorCWxkaAlyNixAKHI3LDB4MTIzNCkKKworCWxkaGgJcjYsQChyNyxyOCkKKwlsZGhoCXI2LEAocjcrLHI4KQorCWxkaGgJcjYsQChyNy0scjgpCisJbGRoaAlyNixAKHI3LDB4MWEpCisJbGRoaAlyNixAKHI3LDB4MTIzNCkKKworCWxkaHUJcjYsQChyNyxyOCkKKwlsZGh1CXI2LEAocjcrLHI4KQorCWxkaHUJcjYsQChyNy0scjgpCisJbGRodQlyNixAKHI3LDB4MWEpCisJbGRodQlyNixAKHI3LDB4MTIzNCkKKworCWxkdwlyNixAKHI3LHI4KQorCWxkdwlyNixAKHI3KyxyOCkKKwlsZHcJcjYsQChyNy0scjgpCisJbGR3CXI2LEAocjcsMHgxYSkKKwlsZHcJcjYsQChyNywweDEyMzQpCisJCQkJCQkJCisJbWFjMAlyMSxyMixyNAorCW1hYzAJcjEscjIsMHgxZgorCW1hYzEJcjEscjIscjQKKwltYWMxCXIxLHIyLDB4MWYKKworCW1hY3MwCXIxLHIyLHI0CisJbWFjczAJcjEscjIsMHgxZgorCW1hY3MxCXIxLHIyLHI0CisJbWFjczEJcjEscjIsMHgxZgorCisJbW9kZGVjCXIxLDB4YQorCisJbW9kaW5jCXIxLDB4YQorCisJbXN1YjAJcjEscjIscjQKKwltc3ViMAlyMSxyMiwweDFmCisJbXN1YjEJcjEscjIscjQKKwltc3ViMQlyMSxyMiwweDFmCisKKwltdWwJcjEscjIscjQKKwltdWwJcjEscjIsMHhhCisKKwltc3ViczAJcjEscjIscjQKKwltc3ViczAJcjEscjIsMHgxZgorCW1zdWJzMQlyMSxyMixyNAorCW1zdWJzMQlyMSxyMiwweDFmCisKKwltdWwyaAlyMSxyMixyNAorCW11bDJoCXIxLHIyLDB4YQorCQorCW11bGh4bGwJcjEscjIscjQKKwltdWxoeGxsCXIxLHIyLDB4YQorCisJbXVsaHhsaAlyMSxyMixyNAorCW11bGh4bGgJcjEscjIsMHhhCisKKwltdWxoeGhsCXIxLHIyLHI0CisJbXVsaHhobAlyMSxyMiwweGEKKworCW11bGh4aGgJcjEscjIscjQKKwltdWxoeGhoCXIxLHIyLDB4YQorCisJbXVseDJoCXI4LHIyLHI0CisJbXVseHMJYTAscjEscjQKKwkKKwltdWx4CWEwLHIxLHI0CisJbXVseAlhMSxyMiwweGEKKworCW12ZmFjYwlyMSxhMCxyNAorCW12ZmFjYwlyMixhMSwweGEKKworCW11bHgyaAlyOCxyMiwweGEKKwltdWx4cwlhMSxyMiwweGEKKwkJCisJbXZmc3lzCXIxMCxwYworCW12ZnN5cwlyMTAscnB0X2MKKwltdmZzeXMJcjEwLHBzdworCW12ZnN5cwlyMTAscHN3aAorCW12ZnN5cwlyMTAscHN3bAorCW12ZnN5cwlyMTAsZjAKKwltdmZzeXMJcjEwLFMKKworCW12dGFjYwlhMSxyMixyNAorCisJbXZ0c3lzCXJwdF9jLCByMTAKKwltdnRzeXMJcHN3LCByMTAKKwltdnRzeXMJcHN3aCwgcjEwCisJbXZ0c3lzCXBzd2wsIHIxMAorCW12dHN5cwlmMCwgcjEwCisJbXZ0c3lzCWYzLCByMTAKKwltdnRzeXMJUywgcjEwCisJbXZ0c3lzCVYsIHIxMAorCW12dHN5cwlWQSwgcjEwCisJbXZ0c3lzCUMsIHIxMAorCisJbm9wCisKKwlub3QJcjEscjIKKworCW5vdGZnCWYxLGYyCisKKwlvcglyMSxyMixyNAorCW9yCXIxLHIyLDB4MWEKKwlvcglyMSxyMiwweGRlYWRmMDBkCisKKwlvcmZnCWYxLGYyLGY0CisJb3JmZwlmNCxmMiwweDEKKwkKKwlyZWl0CisKKwlyZXBlYXQJcjEscjIKKwlyZXBlYXQJcjQsMHhkZWFkCisJcmVwZWF0CXI0LDB4ZGVhZGYwMGQKKworCXJlcGVhdGkJMHhhLHIxCisJcmVwZWF0aQkweGEsMHgxMDAxCisKKwlub3AgfHwgbm9wCisJCisJcm90CXIxLHIyLHI0CisJcm90CXIxLHIyLDB4YQorCisJcm90MmgJcjEscjIscjQKKwlyb3QyaAlyMSxyMiwweGEKKworCXNhdAlyMSxyMixyNAorCXNhdAlyMSxyMiwweGEKKworCXNhdDJoCXIxLHIyLHI0CisJc2F0MmgJcjEscjIsMHhhCisKKwlzYXRobAlyMSxyMixyNAorCXNhdGhsCXIxLHIyLDB4YQorCisJc2F0aGgJcjEscjIscjQKKwlzYXRoaAlyMSxyMiwweGEKKwkJCisJc2F0eglyMSxyMixyNAorCXNhdHoJcjEscjIsMHhhCisKKwlzYXR6MmgJcjEscjIscjQKKwlzYXR6MmgJcjEscjIsMHhhCisJCQkKKwlzcmEJcjEscjIscjQKKwlzcmEJcjEscjIsMHhhCisKKwlzcmEyaAlyMSxyMixyNAorCXNyYTJoCXIxLHIyLDB4YQorCisJc3JjCXIxLHIyLHI0CisJc3JjCXIxLHIyLDB4YQorCQorCXNybAlyMSxyMixyNAorCXNybAlyMSxyMiwweGEKKworCXNybDJoCXIxLHIyLHI0CisJc3JsMmgJcjEscjIsMHhhCisKKwkKKwlzdDJoCXI2LEAocjcscjgpCisJc3QyaAlyNixAKHI3KyxyOCkKKwlzdDJoCXI2LEAocjctLHI4KQorCXN0MmgJcjYsQChyNywweDFhKQorCXN0MmgJcjYsQChyNywweDEyMzQpCisJCQorCXN0MncJcjYsQChyNyxyOCkKKwlzdDJ3CXI2LEAocjcrLHI4KQorCXN0MncJcjYsQChyNy0scjgpCisJc3QydwlyNixAKHI3LDB4MWEpCisJc3QydwlyNixAKHI3LDB4MTIzNCkKKworCXN0NGhiCXI2LEAocjcscjgpCisJc3Q0aGIJcjYsQChyNysscjgpCisJc3Q0aGIJcjYsQChyNy0scjgpCisJc3Q0aGIJcjYsQChyNywweDFhKQorCXN0NGhiCXI2LEAocjcsMHgxMjM0KQorCisJc3RiCXI2LEAocjcscjgpCisJc3RiCXI2LEAocjcrLHI4KQorCXN0YglyNixAKHI3LSxyOCkKKwlzdGIJcjYsQChyNywweDFhKQorCXN0YglyNixAKHI3LDB4MTIzNCkKKworCXN0aAlyNixAKHI3LHI4KQorCXN0aAlyNixAKHI3KyxyOCkKKwlzdGgJcjYsQChyNy0scjgpCisJc3RoCXI2LEAocjcsMHgxYSkKKwlzdGgJcjYsQChyNywweDEyMzQpCisKKwlzdGhoCXI2LEAocjcscjgpCisJc3RoaAlyNixAKHI3KyxyOCkKKwlzdGhoCXI2LEAocjctLHI4KQorCXN0aGgJcjYsQChyNywweDFhKQorCXN0aGgJcjYsQChyNywweDEyMzQpCisKKwlzdHcJcjYsQChyNyxyOCkKKwlzdHcJcjYsQChyNysscjgpCisJc3R3CXI2LEAocjctLHI4KQorCXN0dwlyNixAKHI3LDB4MWEpCisJc3R3CXI2LEAocjcsMHgxMjM0KQorCQkJCQkJCQkKKwlzdWIJcjEscjIscjMKKwlzdWIJcjUwLHI1MSwweDFhCisJc3ViCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJc3ViMmgJcjEscjIscjMKKwlzdWIyaAlyNTAscjUxLDB4MWEKKwlzdWIyaAlyNTAscjUxLDB4ZGVhZGJlZWYKKworCXN1YmIJcjEscjIscjMKKwlzdWJiCXI1MCxyNTEsMHgxYQorCXN1YmIJcjUwLHI1MSwweGRlYWRiZWVmCisKKwlzdWJobGxsCXIxLHIyLHIzCisJc3ViaGxsbAlyNTAscjUxLDB4MWEKKwlzdWJobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJc3ViaGxsaAlyMSxyMixyMworCXN1YmhsbGgJcjUwLHI1MSwweDFhCisJc3ViaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKKworCXN1YmhsaGwJcjEscjIscjMKKwlzdWJobGhsCXI1MCxyNTEsMHgxYQorCXN1YmhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCisKKwlzdWJobGhoCXIxLHIyLHIzCisJc3ViaGxoaAlyNTAscjUxLDB4MWEKKwlzdWJobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgorCQkKKwlzdWJoaGxsCXIxLHIyLHIzCisJc3ViaGhsbAlyNTAscjUxLDB4MWEKKwlzdWJoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgorCisJc3ViaGhsaAlyMSxyMixyMworCXN1YmhobGgJcjUwLHI1MSwweDFhCisJc3ViaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKKworCXN1YmhoaGwJcjEscjIscjMKKwlzdWJoaGhsCXI1MCxyNTEsMHgxYQorCXN1YmhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCisKKwlzdWJoaGhoCXIxLHIyLHIzCisJc3ViaGhoaAlyNTAscjUxLDB4MWEKKwlzdWJoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgorCQorCXRyYXAJcjEKKwl0cmFwCTB4YQorCisJeG9yCXIxLHIyLHI0CisJeG9yCXIxLHIyLDB4YQorCXhvcglyMSxyMiwweGRlYWRmMDBkCisKKwl4b3JmZwlmMSxmMixmNAorCXhvcmZnCWYxLGY0LDB4YQorCisjIFZMSVcgc3ludGF4IHRlc3QKKwlub3AKKwlub3AKKwlub3AJLT4Jbm9wCisJbm9wCXx8CW5vcAorCW5vcAk8LQlub3AKKworIyB0cnkgY2hhbmdpbmcgc2VjdGlvbnMKKwlub3QJcjEscjIKKwkuc2VjdGlvbiAuZm9vCisJYWRkCXIxMCxyMTIsNgorCS50ZXh0CisJbm90CXIyLHIzCisJbm9wCisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjlmODEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLmQKQEAgLTAsMCArMSwyNCBAQAorI29iamR1bXA6IC1sZHIKKyNuYW1lOiBEMzBWIGRlYnVnICgtZykgdGVzdAorI2FzOiAtZworCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPF9hYmMtMHgxOD46CisuKmxhYmVsLWRlYnVnLnM6NAorICAgMDoJMTAwODAwMDMgMDBmMDAwMDAgCWJyYS5zXC90eAkxOAlcKDE4IDxfYWJjPlwpCVx8XHwJbm9wCQorLipsYWJlbC1kZWJ1Zy5zOjUKKyAgIDg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKKyAgMTA6CTBlMDAwMDA0IDAwZjAwMDAwIAkubG9uZwkweGUwMDAwMDQJfHwJbm9wCQorCiswMDAwMDAxOCA8X2FiYz46CisuKmxhYmVsLWRlYnVnLnM6OAorICAxODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQorLipsYWJlbC1kZWJ1Zy5zOjkKKyAgMjA6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKKy4qbGFiZWwtZGVidWcuczoxMAorICAyODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQorLipsYWJlbC1kZWJ1Zy5zOjExCisgIDMwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLWRlYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MGFhNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucwpAQCAtMCwwICsxLDExIEBACisjIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCisJCisJLnRleHQKKwlicmEucy90eCBfYWJjICAgfHwgbm9wIAorCW5vcCAgICAgfHwgbm9wIAorCS53b3JkIDB4MGUwMDAwMDQKK19hYmM6CisJbm9wCisJbm9wCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjZmNkYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZApAQCAtMCwwICsxLDE2IEBACisjb2JqZHVtcDogLWRyCisjbmFtZTogRDMwViBsYWJlbCBhbGlnbm1lbnQgdGVzdAorI2FzOgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPF9hYmMtMHgxOD46CisgICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnMvdHgJMTgJKDE4IDxfYWJjPikJfHwJbm9wCQorICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQorICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCisKKzAwMDAwMDE4IDxfYWJjPjoKKyAgMTg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKKyAgMjA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQwYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC5zCkBAIC0wLDAgKzEsMTEgQEAKKyMgbGFiZWxzIHNob3VsZCBiZSBhbGlnbmVkIG9uIDgtYnl0ZSBib3VuZHJpZXMKKwkKKwkudGV4dAorCWJyYS5zL3R4IF9hYmMgICB8fCBub3AgCisJbm9wICAgICB8fCBub3AgCisJLndvcmQgMHgwZTAwMDAwNAorX2FiYzoKKwlub3AKKwlub3AKKwlub3AKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTBhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kCkBAIC0wLDAgKzEsMjAgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBEMzBWIGFsaWdubWVudCB0ZXN0CisjYXM6IC1XTworCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPC50ZXh0PjoKKyAgIDA6CThhMTA1MTg3IDBhMTAyMGM0IAltdWx4MmgJcjUsIHI2LCByNwk8LQltdWx4MmgJcjIsIHIzLCByNAorICAgODoJMDBmMDAwMDAgMGExMDgyNGEgCW5vcAkJfHwJbXVseDJoCXI4LCByOSwgcjEwCisgIDEwOgkwMGYwMDAwMCAwYTEwYjMwZCAJbm9wCQl8fAltdWx4MmgJcjExLCByMTIsIHIxMworICAxODoJOGExMTE0OTMgMGExMGUzZDAgCW11bHgyaAlyMTcsIHIxOCwgcjE5CTwtCW11bHgyaAlyMTQsIHIxNSwgcjE2CisgIDIwOgk4YTExNzYxOSAwYTExNDU1NiAJbXVseDJoCXIyMywgcjI0LCByMjUJPC0JbXVseDJoCXIyMCwgcjIxLCByMjIKKyAgMjg6CThiMDFkNzlmIDBhMTFhNmRjIAltdWwJcjI5LCByMzAsIHIzMQk8LQltdWx4MmgJcjI2LCByMjcsIHIyOAorICAzMDoJOGIwMDUxODcgMGIwMDIwYzQgCW11bAlyNSwgcjYsIHI3CTwtCW11bAlyMiwgcjMsIHI0CisgIDM4Ogk4YTEwYjMwZCAwYTEwODI0YSAJbXVseDJoCXIxMSwgcjEyLCByMTMJPC0JbXVseDJoCXI4LCByOSwgcjEwCisgIDQwOgk4MGYwMDAwMCAwYjAwZTNkMCAJbm9wCQk8LQltdWwJcjE0LCByMTUsIHIxNgorICA0ODoJMDBmMDAwMDAgMGExMTE0OTMgCW5vcAkJfHwJbXVseDJoCXIxNywgcjE4LCByMTkKKyAgNTA6CThiMDE3NjE5IDBhMTE0NTU2IAltdWwJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2Nzg1OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbXVsLnMKQEAgLTAsMCArMSwxOSBAQAorIyAgT25lIG9mIHRoZSBydWxlIG9uIHJlc3RyaWN0ZWQgc2VxdWVuY2UgaXMgY29uc2VjdXRpdmUgSVUgaW5zdHJ1Y3Rpb24gCisjICAgICAgIElVOiBNVUwsIE1BQywgTUFDUywgTVNVQiwgTVNVQlMgIChhKSAgICAKKyMgICAgICAgSVU6IE1VTEhYcHAsIE1VTFgySCwgTVVMMkggICAgICAoYikKKyMgVGhpcyBtZWFucyB0aGF0IGluc3RydWN0aW9ucyBpbiBncm91cCAoYSkgYW5kIGluIChiKSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCisjIGluIElVIGluIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiB0aGUgb3JkZXIgKGEpLT4oYikuIEl0IGRvZXMgbmVpdGhlciBwcm9oaWJpdAorIyBleGVjdXRpb25zIGluIHRoZSByZXZlcnNlIG9yZGVyIChiKS0+IChhKSBub3IgY29uc2VjdXRpdmUgZXhlY3V0aW9uIG9mCisjIGdyb3VwIChhKS0+KGEpIG9yIChiKS0+KGIpCisKKwltdWx4MmggcjUscjYscjcJCTwtCW11bHgyaCByMixyMyxyNAorCW5vcAl8fAltdWx4MmggcjgscjkscjEwCisJbm9wCXx8CW11bHgyaCByMTEscjEyLHIxMyAgICAgICAKKwltdWx4MmggcjE0LHIxNSxyMTYKKwltdWx4MmggcjE3LHIxOCxyMTkgICAgICAKKwltdWx4MmggcjIzLHIyNCxyMjUgICAgIDwtCW11bHgyaCByMjAscjIxLHIyMgorCW11bCAgICByMjkscjMwLHIzMSAgICAgPC0JbXVseDJoIHIyNixyMjcscjI4CisJbXVsICAgIHI1LCByNiwgcjcgICAgICA8LQltdWwgcjIsIHIzLCByNAorCW11bHgyaCByMTEsIHIxMiwgcjEzICAgPC0JbXVseDJoIHI4LCByOSwgcjEwCisJbXVseDJoIHIxNywgcjE4LCByMTkgICA8LQltdWwgcjE0LCByMTUsIHIxNgorCW11bCAgICByMjMsIHIyNCwgcjI1ICAgPC0JbXVseDJoIHIyMCwgcjIxLCByMjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmZhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCkBAIC0wLDAgKzEsODkgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBEMzBWIG9wdGltaXphdGlvbiB0ZXN0CisjYXM6IC1PCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8c3RhcnQ+OgorICAgMDoJMDg4MDEwODAgMDg4MDMxMDAgCWFicwlyMSwgcjIJfHwJYWJzCXIzLCByNAorICAgODoJMDI5MDAxMDAgMDI5MDEwODAgCW5vdGZnCWYwLCBzCXx8CW5vdGZnCWYxLCBmMgorICAxMDoJMDg4MDEwODAgMDI5MDEwODAgCWFicwlyMSwgcjIJfHwJbm90ZmcJZjEsIGYyCisgIDE4OgkwODAwMTA4MyA4MjkwNzAwMCAJYWRkLnMJcjEsIHIyLCByMwktPglub3RmZwljLCBmMAorICAyMDoJMDgwMDEwODMgODI5MDAxYzAgCWFkZC5zCXIxLCByMiwgcjMJLT4Jbm90ZmcJZjAsIGMKKyAgMjg6CTAwMDgwMDAwIDAwZjAwMDAwIAlicmEucwkwCVwoMjggPHN0YXJ0XCsweDI4PlwpCXx8CW5vcAkKKyAgMzA6CTA4ODAxMDgwIDg4ODAxMDgwIAlhYnMJcjEsIHIyCS0+CWFicwlyMSwgcjIKKyAgMzg6CTAwMDgwMDAwIDAwZjAwMDAwIAlicmEucwkwCVwoMzggPHN0YXJ0XCsweDM4PlwpCXx8CW5vcAkKKyAgNDA6CTAwMmJmZmZmIDAwZjAwMDAwIAlic3IucwktOAlcKDM4IDxzdGFydFwrMHgzOD5cKQl8fAlub3AJCisgIDQ4OgkwODgwMTA4MCA4ODgwMTA4MCAJYWJzCXIxLCByMgktPglhYnMJcjEsIHIyCisgIDUwOgkwMDI4MDAwMCAwODgwMTA4MCAJYnNyLnMJMAlcKDUwIDxzdGFydFwrMHg1MD5cKQl8fAlhYnMJcjEsIHIyCisgIDU4OgkwNDAwMTA4MyA4NTAwNzIwOSAJbGRiLnMJcjEsIEBcKHIyLCByM1wpCS0+CXN0Yi5zCXI3LCBAXChyOCwgcjlcKQorICA2MDoJMDUwMDcyMDkgODQwMDEwODMgCXN0Yi5zCXI3LCBAXChyOCwgcjlcKQktPglsZGIucwlyMSwgQFwocjIsIHIzXCkKKyAgNjg6CTA0MDA3MjA5IDg0MDAxMDgzIAlsZGIucwlyNywgQFwocjgsIHI5XCkJLT4JbGRiLnMJcjEsIEBcKHIyLCByM1wpCisgIDcwOgkwNTAwNzIwOSA4NTAwMTA4MyAJc3RiLnMJcjcsIEBcKHI4LCByOVwpCS0+CXN0Yi5zCXIxLCBAXChyMiwgcjNcKQorICA3ODoJMDgwMDMwYzYgODU0ODIwYzAgCWFkZC5zCXIzLCByMywgcjYJLT4Jc3R3LnMJcjIsIEBcKHIzLCAweDBcKQorICA4MDoJMDJjMjgxMDUgOTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90eAkwIDxzdGFydD4KKyAgODg6CTAyYzI4MTA1IGEwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvZngJMCA8c3RhcnQ+CisgIDkwOgkzMDE4MDAwMCAwMmMyODEwNSAJam1wLnMveHQJMCA8c3RhcnQ+CXx8CWNtcGxlLnMJZjAsIHI0LCByNQorICA5ODoJNDAxODAwMDAgMDJjMjgxMDUgCWptcC5zL3hmCTAgPHN0YXJ0Pgl8fAljbXBsZS5zCWYwLCByNCwgcjUKKyAgYTA6CTAyYzI4MTA1IGQwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdHQJMCA8c3RhcnQ+CisgIGE4OgkwMmMyODEwNSBlMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3RmCTAgPHN0YXJ0PgorICBiMDoJMTAxODAwMDAgMDJjMjkxMDUgCWptcC5zL3R4CTAgPHN0YXJ0Pgl8fAljbXBsZS5zCWYxLCByNCwgcjUKKyAgYjg6CTAyYzI5MTA1IGIwMTgwMDAwIAljbXBsZS5zCWYxLCByNCwgcjUJLT4Jam1wLnMveHQJMCA8c3RhcnQ+CisgIGMwOgkwODA4NDAwMSA4MmMyODEwNSAJYWRkLnMJcjQsIHIwLCAweDEJLT4JY21wbGUucwlmMCwgcjQsIHI1CisgIGM4OgkwODA4NDAwMSAwMmMyODBjNSAJYWRkLnMJcjQsIHIwLCAweDEJfHwJY21wbGUucwlmMCwgcjMsIHI1CisgIGQwOgkwNDYwNDAwNiA4ODYwNTRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQktPglhZGRzLnMJcjUsIHIxOSwgcjIwCisgIGQ4OgkwNDYwNDAwNiA4ODYwMzE1NCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQktPglhZGRzLnMJcjMsIHI1LCByMjAKKyAgZTA6CTA0NjA0MDA2IDA4NjA2NGQ0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNiwgcjE5LCByMjAKKyAgZTg6CTA0NjA0MDA2IDA4NjA3NGQ0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjE5LCByMjAKKyAgZjA6CTA0NjA0MDA2IDA4NjA3MDE0IAlsZDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNywgcjAsIHIyMAorICBmODoJMDU2MDQwMDYgMDg2MDU0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI1LCByMTksIHIyMAorIDEwMDoJMDU2MDQwMDYgMDg2MDMxNTQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXIzLCByNSwgcjIwCisgMTA4OgkwNTYwNDAwNiAwODYwNjRkNCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjYsIHIxOSwgcjIwCisgMTEwOgkwNTYwNDAwNiAwODYwNzRkNCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIxOSwgcjIwCisgMTE4OgkwNTYwNDAwNiAwODYwNzAxNCAJc3Qydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIwLCByMjAKKyAxMjA6CTA1NjBhMGM0IDg1NjI4YWVjIAlzdDJ3LnMJcjEwLCBAXChyMywgcjRcKQktPglzdDJ3LnMJcjQwLCBAXChyNDMsIHI0NFwpCisgMTI4OgkwNTQwMTA4MyA4NDQyOWFhYiAJc3R3LnMJcjEsIEBcKHIyLCByM1wpCS0+CWxkdy5zCXI0MSwgQFwocjQyLCByNDNcKQorIDEzMDoJMDQ0MDEwODMgODQwMjlhYWIgCWxkdy5zCXIxLCBAXChyMiwgcjNcKQktPglsZGIucwlyNDEsIEBcKHI0MiwgcjQzXCkKKyAxMzg6CTA0NDQ0MThiIDg4Njg5MTgyIAlsZHcucwlyNCwgQFwocjZcKywgcjExXCkJLT4JYWRkcy5zCXI5LCByNiwgMHgyCisgMTQwOgkwNDRjNDE4YiAwODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2LSwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCisgMTQ4OgkwNTRjNDE4YiA4ODY4OTE4MiAJc3R3LnMJcjQsIEBcKHI2LSwgcjExXCkJLT4JYWRkcy5zCXI5LCByNiwgMHgyCisgMTUwOgkwNDQwNDE4YiAwODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2LCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKKyAxNTg6CTA0NDA0MThiIDA4Njg5MTgyIAlsZHcucwlyNCwgQFwocjYsIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgorIDE2MDoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCisgMTY4OgkwMDM4MDAwMCAwODgwMTA4MCAJanNyLnMJMCA8c3RhcnQ+CXx8CWFicwlyMSwgcjIKKyAxNzA6CTA4ODAxMDgwIDAwZjAwMDAwIAlhYnMJcjEsIHIyCXx8CW5vcAkKKyAxNzg6CTAwMDgwMDAwIDAwZjAwMDAwIAlicmEucwkwCVwoMTc4IDxzdGFydFwrMHgxNzg+XCkJfHwJbm9wCQorIDE4MDoJMDAyODAwMDAgMDg4MDEwODAgCWJzci5zCTAJXCgxODAgPHN0YXJ0XCsweDE4MD5cKQl8fAlhYnMJcjEsIHIyCisgMTg4OgkwODgwMTA4MCAwMGYwMDAwMCAJYWJzCXIxLCByMgl8fAlub3AJCisKKzAwMDAwMTkwIDxsYWJlbDE+OgorIDE5MDoJMDU2MDIwODMgODkwMDQxNDYgCXN0MncucwlyMiwgQFwocjIsIHIzXCkJLT4JYWRkaGxsbC5zCXI0LCByNSwgcjYKKworMDAwMDAxOTggPGxhYmVsMj46CisgMTk4OgkwNTUwODIwOSA4OTkwYTJjYyAJc3Q0aGIucwlyOCwgQFwocjgsIHI5XCkJLT4Jc3ViaGxsaC5zCXIxMCwgcjExLCByMTIKKworMDAwMDAxYTAgPGxhYmVsMz46CisgMWEwOgkwNDYwZTM4ZiA4YTYxMDQ1MiAJbGQydy5zCXIxNCwgQFwocjE0LCByMTVcKQktPgltdWxoeGhsCXIxNiwgcjE3LCByMTgKKworMDAwMDAxYTggPGxhYmVsND46CisgMWE4OgkwNDQxMzUxNSA4YTExNjVkOCAJbGR3LnMJcjE5LCBAXChyMjAsIHIyMVwpCS0+CW11bHgyaAlyMjIsIHIyMywgcjI0CisKKzAwMDAwMWIwIDxsYWJlbDU+OgorIDFiMDoJMDQyMTk2OWIgOGEwMWM3NWUgCWxkaC5zCXIyNSwgQFwocjI2LCByMjdcKQktPgltdWwyaAlyMjgsIHIyOSwgcjMwCisKKzAwMDAwMWI4IDxsYWJlbDY+OgorIDFiODoJODBmMDAwMDAgMGIwMDEwODMgCW5vcAkJPC0JbXVsCXIxLCByMiwgcjMKKyAxYzA6CTA4MDA3MjA5IDBhNDA0MTQ2IAlhZGQucwlyNywgcjgsIHI5CXx8CW11bGh4bGwJcjQsIHI1LCByNgorCiswMDAwMDFjOCA8bGFiZWw3PjoKKyAxYzg6CTA0NDA1MTgwIDBiMDAyMGM0IAlsZHcucwlyNSwgQFwocjYsIHIwXCkJfHwJbXVsCXIyLCByMywgcjQKKyAxZDA6CTgwZjAwMDAwIDBiMDA3MjA5IAlub3AJCTwtCW11bAlyNywgcjgsIHI5CisgMWQ4OgkwNDQwYTJjMCAwMGYwMDAwMCAJbGR3LnMJcjEwLCBAXChyMTEsIHIwXCkJfHwJbm9wCQorIDFlMDoJODBmMDAwMDAgMGIwMGMzNGUgCW5vcAkJPC0JbXVsCXIxMiwgcjEzLCByMTQKKyAxZTg6CTA0NDBmNDAwIDBiNDQyMGM0IAlsZHcucwlyMTUsIEBcKHIxNiwgcjBcKQl8fAltYWMxCXIyLCByMywgcjQKKyAxZjA6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKKyAxZjg6CTA0NDA1MTgwIDAwZjAwMDAwIAlsZHcucwlyNSwgQFwocjYsIHIwXCkJfHwJbm9wCQorIDIwMDoJODBmMDAwMDAgMGI0MDcyMDkgCW5vcAkJPC0JbWFjMAlyNywgcjgsIHI5CisgMjA4OgkwNDQwYTJjMCA4NDQwYTJjMCAJbGR3LnMJcjEwLCBAXChyMTEsIHIwXCkJLT4JbGR3LnMJcjEwLCBAXChyMTEsIHIwXCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzMzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zCkBAIC0wLDAgKzEsMjE2IEBACisjIEQzMFYgcGFyYWxsZWwgb3B0aW1pemF0aW9uIHRlc3QKKyMgYXNzZW1ibGUgd2l0aCAiLU8iCisJCisJLnRleHQKK3N0YXJ0OgkKKwlhYnMJcjEscjIKKwlhYnMJcjMscjQKKworCW5vdGZnCWYwLGY0CisJbm90ZmcJZjEsZjIKKwkJCisJYWJzCXIxLHIyCisJbm90ZmcJZjEsZjIKKworIyBib3RoIGNoYW5nZSBDIGZsYWcKKwlhZGQJcjEscjIscjMKKwlub3RmZwlDLGYwCisKKyMgb25lIHVzZXMgYW5kIG9uZSBjaGFuZ2VzIEMgZmxhZwkKKwlhZGQJcjEscjIscjMKKwlub3RmZwlmMCxDCisKKwlicmEJLgorCWFicwlyMSxyMgorCisJYWJzCXIxLHIyCQorCWJyYQkuCisKKwlic3IJLgorCWFicwlyMSxyMgorCQorCWFicwlyMSxyMgkKKwlhYnMJcjEscjIJCisJYnNyCS4KKwkKKwlsZGIJcjEsQChyMixyMykKKwlzdGIJcjcsQChyOCxyOSkKKworCXN0YglyNyxAKHI4LHI5KQkKKwlsZGIJcjEsQChyMixyMykKKworCWxkYglyNyxAKHI4LHI5KQkKKwlsZGIJcjEsQChyMixyMykKKworCXN0YglyNyxAKHI4LHI5KQkKKwlzdGIJcjEsQChyMixyMykKKworCWFkZCAgICAgcjMsIHIzLCByNgorCXN0dyAgICAgcjIsIEAocjMsIDApCisJCQkKKyMgc2hvdWxkIGJlIHNlcmlhbCBiZWNhdXNlIG9mIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgorICAgICAgICBjbXBsZSAgIGYwLHI0LHI1CisgICAgICAgIGptcC90eCAgMHgwCisKKyAgICAgICAgY21wbGUgICBmMCxyNCxyNQorICAgICAgICBqbXAvZnggIDB4MAorCisgICAgICAgIGNtcGxlICAgZjAscjQscjUKKyAgICAgICAgam1wL3h0ICAweDAKKworICAgICAgICBjbXBsZSAgIGYwLHI0LHI1CisgICAgICAgIGptcC94ZiAgMHgwCisKKyAgICAgICAgY21wbGUgICBmMCxyNCxyNQorICAgICAgICBqbXAvdHQgIDB4MAorCisgICAgICAgIGNtcGxlICAgZjAscjQscjUKKyAgICAgICAgam1wL3RmICAweDAKKwkJCQkJCisgICAgICAgIGNtcGxlICAgZjEscjQscjUKKyAgICAgICAgam1wL3R4ICAweDAKKworICAgICAgICBjbXBsZSAgIGYxLHI0LHI1CisgICAgICAgIGptcC94dCAgMHgwCisKKwkjIHNlcmlhbCBiZWNhdXNlIG9mIHRoZSByNCBkZXBlbmRlbmN5CisJYWRkCXI0LCByMCwgMQorCWNtcGxlCWYwLCByNCwgcjUKKworCSMgcGFyYWxsZWwKKwlhZGQJcjQsIHIwLCAxCisJY21wbGUJZjAsIHIzLCByNQorCisJIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1CisJbGQydwlyNCxAKHIwLHI2KQorCWFkZHMJcjUscjE5LHIyMAorCisJIyBzZXJpYWwgYmVjYXVzZSBsZDJ3IGxvYWRzIHI1CisJbGQydwlyNCxAKHIwLHI2KQorCWFkZHMJcjMscjUscjIwCisKKwkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIGxkMncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0CisJbGQydwlyNCxAKHIwLHI2KQorCWFkZHMJcjYscjE5LHIyMAorCisJIyBwYXJhbGxlbAorCWxkMncJcjQsQChyMCxyNikKKwlhZGRzCXI3LHIxOSxyMjAKKworCSMgcGFyYWxsZWwKKwlsZDJ3CXI0LEAocjAscjYpCisJYWRkcwlyNyxyMCxyMjAKKworCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggc3QydyB1c2VzIHI1IGFuZCBhZGRzIG1vZGlmaWVzIGl0CisJc3QydwlyNCxAKHIwLHI2KQorCWFkZHMJcjUscjE5LHIyMAorCisJIyBwYXJhbGxlbCwgYm90aCB1c2UgYnV0IGRvbid0IG1vZGlmeSByNQorCXN0MncJcjQsQChyMCxyNikKKwlhZGRzCXIzLHI1LHIyMAorCisJIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjYgYW5kIGFkZHMgY2hhbmdlcyBpdAorCXN0MncJcjQsQChyMCxyNikKKwlhZGRzCXI2LHIxOSxyMjAKKworCSMgcGFyYWxsZWwKKwlzdDJ3CXI0LEAocjAscjYpCisJYWRkcwlyNyxyMTkscjIwCisKKwkjIHBhcmFsbGVsCisJc3QydwlyNCxAKHIwLHI2KQorCWFkZHMJcjcscjAscjIwCisJCQkJCQkKKyMgdGVzdCBtZW1vcnkgZGVwZW5kZW5jaWVzCisKKwkjIGFsd2F5cyBzZXJpYWwgYmVjYXVzZSBvbmUgY291bGQgb3ZlcndyaXRlIHRoZSBvdGhlcgorCXN0MncJcjEwLEAocjMscjQpCisJc3QydwlyNDAsQChyNDMscjQ0KQorCisJIyBhbHdheXMgc2VyaWFsCisJc3R3CXIxLEAocjIscjMpCisJbGR3CXI0MSxAKHI0MixyNDMpCQkJCisKKwkjIHJlYWRzIGNhbiBoYXBwZW4gaW4gcGFyYWxsZWwgYnV0IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSAKKwkjIGRvZXNuJ3Qgc3VwcG9ydCBpdAorCWxkdwlyMSxAKHIyLHIzKQorCWxkYglyNDEsQChyNDIscjQzKQkJCQorCisjIHRlc3QgcG9zdCBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBkZXBlbmRlbmNpZXMKKworCSMgc2VyaWFsCisJbGR3CXI0LEAocjYrLHIxMSkKKwlhZGRzCXI5LHI2LDIKKworCSMgcGFyYWxsZWwsIG1vZGlmaWNhdGlvbiB0byByNiBoYXBwZW5zIGxhc3QKKwlhZGRzCXI5LHI2LDIJCisJbGR3CXI0LEAocjYtLHIxMSkKKworCSMgc2VyaWFsCisJc3R3CXI0LEAocjYtLHIxMSkKKwlhZGRzCXI5LHI2LDIKKwkKKwkjIHBhcmFsbGVsCisJbGR3CXI0LEAocjYscjExKQorCWFkZHMJcjkscjYsMgorCisJIyBwYXJhbGxlbAorCWFkZHMJcjkscjYsMgkKKwlsZHcJcjQsQChyNixyMTEpCisJCisjIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBhIGptcCwgZG9uJ3QgcGFyYWxsZWxpemUKKwlqbXAJMAorCWFicwlyMSxyMgkKKworCWpzcgkwCisJYWJzCXIxLHIyCQorCisJLmFsaWduCTMKKwkKKwlicmEJMAorCWFicwlyMSxyMgkKKwkKKwlic3IJMAorCWFicwlyMSxyMgkKKworIyBFeHBsaWNpdGx5IHByb2hpYml0ZWQgZnJvbSBwYXJhbGxlbCBleGVjdXRpb24uCisjIFRoZSBsYWJlbHMgYXJlIGhlcmUgdG8gcHJldmVudCBpbnN0cnVjdGlvbiBwYWlycworIyAgZnJvbSBiZWluZyBtZXJnZWQgd2l0aCBmb2xsb3dpbmcgcGFpcnMuCisJCitsYWJlbDE6CQorCXN0MncgICAgIHIyLCBAKHIyLCByMykKKwlhZGRobGxsICByNCwgcjUsIHI2CitsYWJlbDI6CisJc3Q0aGIgICAgcjgsIEAocjgsIHI5KQorCXN1YmhsbGggIHIxMCwgcjExLCByMTIKK2xhYmVsMzoKKwlsZDJ3ICAgICByMTQsIEAocjE0LCByMTUpCisJbXVsaHhobCAgcjE2LCByMTcsIHIxOAorbGFiZWw0OgorCWxkdyAgICAgIHIxOSwgQChyMjAsIHIyMSkKKwltdWx4MmggICByMjIsIHIyMywgcjI0CitsYWJlbDU6CisJbGRoICAgICAgcjI1LCBAKHIyNiwgcjI3KQorCW11bDJoICAgIHIyOCwgcjI5LCByMzAKKworIyBJbnNlcnRpb24gb2YgTk9QcyByZXF1aXJlZCB0byBwcmV2ZW50IHBpcGVsaW5lIGNsYXNoZXMuCisKK2xhYmVsNjoKKwltdWwgcjEscjIscjMKKwltdWxoeGxsIHI0LHI1LHI2CisgICAgICAgIGFkZCByNywgcjgsIHI5CitsYWJlbDc6CisJCisgICAgICAgIG11bCAgcjIscjMscjQKKyAgICAgICAgbGR3ICByNSwgQChyNixyMCkKKyAKKyAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbXVsIHI3LHI4LHI5CisJCisgICAgICAgIG11bCAgcjEyLHIxMyxyMTQgLT4gbGR3IHIxNSwgQChyMTYsIHIwKQorCisgICAgICAgIG1hYzEgcjIscjMscjQKKyAgICAgICAgbGR3ICByNSwgQChyNixyMCkKKyAKKyAgICAgICAgbGR3ICByMTAsIEAocjExLCByMCkgPC0gbWFjMCByNyxyOCxyOQorICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSAKKwkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGUyNzgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kCkBAIC0wLDAgKzEsOTMgQEAKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBEMzBWIHJlbG9jYXRpb24gdGVzdAorI2FzOgorCisuKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPHN0YXJ0PjoKKyAgICAgICAwOgk4ODA4MjAwMCA4MDAwMDAyOCAJYWRkLmwJcjIsIHIwLCAweDI4CisJCQkwOiBSX0QzMFZfMzIJLnRleHQKKyAgICAgICA4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKKwkJCTg6IFJfRDMwVl8zMgkuZGF0YQorICAgICAgMTA6CTg4MDg0MDAwIDgwMDAwMDA2IAlhZGQubAlyNCwgcjAsIDB4NgorCQkJMTA6IFJfRDMwVl8zMgkuZGF0YQorICAgICAgMTg6CTg4MDg0MDAwIDgwMDAwMDAwIAlhZGQubAlyNCwgcjAsIDB4MAorCQkJMTg6IFJfRDMwVl8zMgl1bmsKKyAgICAgIDIwOgk4MDA4MDAwMCA4MDAwMDAxOCAJYnJhLmwJMTgJXCgzOCA8Y29udD5cKQorCiswMDAwMDAyOCA8aGVsbG8+OgorICAgICAgMjg6CTQ4NjU2YzZjIDZmMjA1NzZmIAkubG9uZwkweDQ4NjU2YzZjCXx8CS5sb25nCTB4NmYyMDU3NmYKKyAgICAgIDMwOgk3MjZjNjQwYSAwMGYwMDAwMCAJLmxvbmcJMHg3MjZjNjQwYQl8fAlub3AJCisKKzAwMDAwMDM4IDxjb250PjoKKyAgICAgIDM4Ogk4MDE4MDAwMCA4MDAwMDA0OCAJam1wLmwJNDggPGNvbnQyPgorCQkJMzg6IFJfRDMwVl8zMgkudGV4dAorICAgICAgNDA6CTA4ODAyMGMwIDAwZjAwMDAwIAlhYnMJcjIsIHIzCXx8CW5vcAkKKworMDAwMDAwNDggPGNvbnQyPjoKKyAgICAgIDQ4OgkwMDBiZmZmNyAwMGYwMDAwMCAJYnJhLnMJLTQ4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQorICAgICAgNTA6CTAwMDgwMjA1IDAwZjAwMDAwIAlicmEucwkxMDI4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCisgICAgICA1ODoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCisgICAgICA2MDoJMDA2YzFmZmIgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMjgJXCgzOCA8Y29udD5cKQl8fAlub3AJCisgICAgICA2ODoJMDA2YzFmZmEgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMzAJXCgzOCA8Y29udD5cKQl8fAlub3AJCisgICAgICA3MDoJMDA0YzFmZjkgMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtMzgJXCgzOCA8Y29udD5cKQl8fAlub3AJCisgICAgICA3ODoJMDA0YzFmZjggMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtNDAJXCgzOCA8Y29udD5cKQl8fAlub3AJCisgICAgICA4MDoJMDA1YzEwMDcgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAzOCA8Y29udD4JfHwJbm9wCQorCQkJODA6IFJfRDMwVl8xNQkudGV4dAorICAgICAgODg6CTAwNmMxMWYxIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgZjg4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKKyAgICAgIDkwOgkwMDVjMTAwMCAwMGYwMDAwMCAJam1wdG56LnMJcjEsIDAgPHN0YXJ0Pgl8fAlub3AJCisJCQk5MDogUl9EMzBWXzE1CXVuaworICAgICAgOTg6CTAwNmMxMDAwIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgMAlcKDk4IDxjb250MlwrMHg1MD5cKQl8fAlub3AJCisJCQk5ODogUl9EMzBWXzE1X1BDUkVMCXVuaworICAgICAgYTA6CTgwNWMxMDAwIDgwMDAwMDAwIAlqbXB0bnoubAlyMSwgMCA8c3RhcnQ+CisJCQlhMDogUl9EMzBWXzMyCXVuaworICAgICAgYTg6CTgwNmMxMDAwIDgwMDAwMDAwIAlic3J0bnoubAlyMSwgMAlcKGE4IDxjb250MlwrMHg2MD5cKQorCQkJYTg6IFJfRDMwVl8zMl9QQ1JFTAl1bmsKKyAgICAgIGIwOgkwMDA4MDFlYyAwMGYwMDAwMCAJYnJhLnMJZjYwCVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKKyAgICAgIGI4Ogk4MDA4MDAwMCA4MDAwMGY1OCAJYnJhLmwJZjU4CVwoMTAxMCA8Zm9vPlwpCisgICAgICBjMDoJMDAwYmZmZTggMDBmMDAwMDAgCWJyYS5zCS1jMAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKKyAgICAgIGM4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+CisJCQljODogUl9EMzBWXzMyCS50ZXh0CisgICAgICBkMDoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgorCQkJZDA6IFJfRDMwVl8zMgkudGV4dAorICAgICAgZDg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQorCQkJZDg6IFJfRDMwVl8yMQkudGV4dAorICAgICAgZTA6CTAwMTgwMjAyIDAwZjAwMDAwIAlqbXAucwkxMDEwIDxmb28+CXx8CW5vcAkKKwkJCWUwOiBSX0QzMFZfMjEJLnRleHQKKyAgICAgIGU4OgkwMDBiZmZlMyAwMGYwMDAwMCAJYnJhLnMJLWU4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQorICAgICAgZjA6CTgwMDgwMDAwIDgwMDAwMDAwIAlicmEubAkwCVwoZjAgPGNvbnQyXCsweGE4PlwpCisJCQlmMDogUl9EMzBWXzMyX1BDUkVMCXVua25vd24KKyAgICAgIGY4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+CisJCQlmODogUl9EMzBWXzMyCXVua25vd24KKyAgICAgMTAwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKKwkJCTEwMDogUl9EMzBWXzIxCXVua25vd24KKyAgICAgMTA4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDEwOCA8Y29udDJcKzB4YzA+XCkJfHwJbm9wCQorCQkJMTA4OiBSX0QzMFZfMjFfUENSRUwJdW5rbm93bgorCS4uLgorCiswMDAwMTAxMCA8Zm9vPjoKKyAgICAxMDEwOgkwODAwMTAwMCAwMGYwMDAwMCAJYWRkLnMJcjEsIHIwLCByMAl8fAlub3AJCisgICAgMTAxODoJODQ2YmMwMDAgODAwMDEwNzAgCWxkMncubAlyNjAsIEBcKHIwLCAweDEwNzBcKQorCQkJMTAxODogUl9EMzBWXzMyCS50ZXh0CisgICAgMTAyMDoJMDgwM2UwMDAgODAyODAwMGIgCWFkZC5zCXI2MiwgcjAsIHIwCS0+CWJzci5zCTU4CVwoMTA3OCA8ZXhpdD5cKQorICAgIDEwMjg6CTAwMmJmZmZkIDAwZjAwMDAwIAlic3IucwktMTgJXCgxMDEwIDxmb28+XCkJfHwJbm9wCQorICAgIDEwMzA6CTAwMGJmZTAzIDAwZjAwMDAwIAlicmEucwktZmU4CVwoNDggPGNvbnQyPlwpCXx8CW5vcAkKKyAgICAxMDM4OgkwMDBiZmUwMiAwMGYwMDAwMCAJYnJhLnMJLWZmMAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCisgICAgMTA0MDoJMDAyODAwMDcgMDBmMDAwMDAgCWJzci5zCTM4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCisgICAgMTA0ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKKwkJCTEwNDg6IFJfRDMwVl8yMQkudGV4dAorICAgIDEwNTA6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCisJCQkxMDUwOiBSX0QzMFZfMjEJLnRleHQKKyAgICAxMDU4OgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQorCQkJMTA1ODogUl9EMzBWXzIxCS50ZXh0CisgICAgMTA2MDoJODAyODAwMDAgODAwMDAwMTggCWJzci5sCTE4CVwoMTA3OCA8ZXhpdD5cKQorICAgIDEwNjg6CTgwMTgwMDAwIDgwMDAxMDc4IAlqbXAubAkxMDc4IDxleGl0PgorCQkJMTA2ODogUl9EMzBWXzMyCS50ZXh0CisKKzAwMDAxMDcwIDxsb25nemVybz46CisJLi4uCisKKzAwMDAxMDc4IDxleGl0PjoKKyAgICAxMDc4OgkwMDEwMDAzZSAwMGYwMDAwMCAJam1wLnMJcjYyCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTk5YmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5zCkBAIC0wLDAgKzEsNjggQEAKKyMgRDMwViByZWxvY2F0aW9uIHRlc3QKKwkKKwkudGV4dAorc3RhcnQ6CisJYWRkCXIyLCByMCwgaGVsbG8KKwlhZGQJcjQsIHIwLCBiYXIKKwlhZGQJcjQsIHIwLCBiYXIyCisJYWRkCXI0LCByMCwgdW5rCQorCWJyYQljb250CitoZWxsbzoJLmFzY2lpICJIZWxsbyBXb3JsZFxuIgorCS5hbGlnbiAzCitjb250OglqbXAJY29udDIKKwlhYnMJcjIscjMKK2NvbnQyOgorCWJyYQlzdGFydAl8fAlub3AKKwlicmEucwlleGl0CisJam1wCTAJfHwJbm9wCisJYnNydG56LnMJcjEsY29udAorCWJzcnRueglyMSxjb250CQorCWJyYXRuei5zCXIxLGNvbnQKKwlicmF0bnoJcjEsY29udAorCWptcHRuei5zCXIxLGNvbnQJCQorCWJzcnRuei5zCXIxLCBmb28KKwlqbXB0bnoucwlyMSwgdW5rCQorCWJzcnRuei5zCXIxLCB1bmsKKwlqbXB0bnoJcjEsIHVuawkKKwlic3J0bnoJcjEsIHVuaworCWJyYS5zCWZvbworCWJyYQlmb28JCisJYnJhCXN0YXJ0CisJam1wCXN0YXJ0CisJam1wCXN0YXJ0CisJam1wLnMJc3RhcnQKKwlqbXAucwlmb28KKwlicmEJc3RhcnQKKwlicmEJdW5rbm93bgorCWptcAl1bmtub3duCisJam1wLnMJdW5rbm93bgkKKwlicmEucwl1bmtub3duCisJCisJLmRhdGEKK2JhcjoJLmFzY2l6CSJYWVpaWSIKK2JhcjI6CS5sb25nCTB4ZGVhZGJlZWYKKwkKKwkudGV4dAorCS5zcGFjZSAweEYwMCwwCisKK2ZvbzoKKwlhZGQJcjEscjAscjAKKwlsZDJ3CXI2MCwgQChyMCxsb25nemVybykKKwlhZGQJcjYyLHIwLHIwCisJYnNyLnMJZXhpdAorCWJzci5zCWZvbworCWJyYS5zCWNvbnQyCisJYnJhLnMJY29udDIJCQkJCisJYnNyLnMJZXhpdAkKKwlqbXAucwlleGl0CisJam1wLnMJZXhpdAorCWptcC5zCWV4aXQJCQorCWJzcglleGl0CisJam1wCWV4aXQKKworbG9uZ3plcm86CisJLnF1YWQJMAorCisJLnRleHQKK2V4aXQ6CQorCWptcAlyNjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTVhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sCkBAIC0wLDAgKzEsNDYgQEAKKy4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6CisuKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjo3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjo4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjo5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCitHQVMgTElTVElORyAuKgorCisKKyAgIDEgICAgICAgICAgICAgIAkjIHNlcmlhbC5zCisgICAyICAgICAgICAgICAgICAJIworICAgMyAgICAgICAgICAgICAgCSMgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgdGhlIHJpZ2h0LXN1Ymluc3RydWN0aW9ucworICAgNCAgICAgICAgICAgICAgCSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCisgICA1ICAgICAgICAgICAgICAJCQorICAgNiBcP1w/XD9cPyAwMDAwMDBGMCAJCXRyYXAgcjIxIC0+IGFkZCByMiwgcjAsIHIwIDsgcmlnaHQgaW5zdHJ1Y3Rpb24gd2lsbCBuZXZlciBiZSBleGVjdXRlZC4KK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgIDYgICAgICAwMDAwMDBGMCAKKyAgIDYgICAgICAwMDAwMDBGMCAKKyAgIDYgICAgICAwMDAwMDA5MCAKKyAgIDYgICAgICAwMDE1MDBGMCAKKyAgIDcgXD9cP1w/XD8gMDgwMDIwMDAgCQlkYnQgICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bworXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAgNyAgICAgIDAwRjAwMDAwIAorICAgNyAgICAgIDAwQjAwMDAwIAorICAgNyAgICAgIDAwRjAwMDAwIAorICAgOCBcP1w/XD9cPyAwODAwMjAwMCAJCXJ0ZCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgICA4ICAgICAgMDBGMDAwMDAgCisgICA4ICAgICAgMDBBMDAwMDAgCisgICA4ICAgICAgMDBGMDAwMDAgCisgICA5IFw/XD9cP1w/IDA4MDAyMDAwIAkJcmVpdCAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgIDkgICAgICAwMEYwMDAwMCAKKyAgIDkgICAgICAwMDgwMDAwMCAKKyAgIDkgICAgICAwMEYwMDAwMCAKKyAgMTAgXD9cP1w/XD8gMDgwMDIwMDAgCQltdnRzeXMgcHN3LCAgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSworICAxMCAgICAgIDAwRjAwMDAwIAorICAxMCAgICAgIDAwRTAwMDQwIAorICAxMCAgICAgIDg4MDAyMDAwIAorICAxMSBcP1w/XD9cPyAwMEUwMDA0MiAJCW12dHN5cyBwc3doLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCisgIDExICAgICAgODgwMDIwMDAgCisgIDEyIFw/XD9cP1w/IDAwRTAwMDQxIAkJbXZ0c3lzIHBzd2wsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKKyAgMTIgICAgICA4ODAwMjAwMCAKKyAgMTMgXD9cP1w/XD8gMDBFMDAwNDMgCQltdnRzeXMgZjAsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgOyBPSworICAxMyAgICAgIDg4MDAyMDAwIAorICAxNCBcP1w/XD9cPyAwMEUwQTA0MCAJCW12dHN5cyBtb2RfcywgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICA7IE9LCisgIDE0ICAgICAgODgwMDIwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTk1ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwucwpAQCAtMCwwICsxLDE0IEBACisjIHNlcmlhbC5zCisjCisjIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHRoZSByaWdodC1zdWJpbnN0cnVjdGlvbnMKKyMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCisJCisJdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgorCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCisJcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KKwlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bworCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCisJbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKKwltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSworCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCisJbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlMDRkYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sCkBAIC0wLDAgKzEsMTM4IEBACisuKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgorLio6NTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6NjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6ODogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6OTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MTE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjEyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoxMzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MTQ6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjE2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoxNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MTg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjE5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoyMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MjI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjIzOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoyNDogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjI3OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoyODogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6Mjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKK0dBUyBMSVNUSU5HIC4qCisKKworICAgMSAgICAgICAgICAgICAgCSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKKyAgIDIgICAgICAgICAgICAgIAkJCisgICAzICAgICAgICAgICAgICAJCS50ZXh0CisgICA0ICAgICAgICAgICAgICAJCQorICAgNSBcP1w/XD9cPyAwMDAwMDBGMCAJCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgIDUgICAgICAwMDAwMDBGMCAKKyAgIDUgICAgICAwMDAwMDBGMCAKKyAgIDUgICAgICAwMDAwMDAwQiAKKyAgIDUgICAgICBGRkZGMDBGMCAKKyAgIDYgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgICA2ICAgICAgMDBGMDAwMDAgCisgICA2ICAgICAgMDAyQkZGRkYgCisgICA2ICAgICAgMDBGMDAwMDAgCisgICA3ICAgICAgICAgICAgICAJCisgICA4IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgIDggICAgICAwMEYwMDAwMCAKKyAgIDggICAgICAxMDBCRkZGRiAKKyAgIDggICAgICAwMEYwMDAwMCAKKyAgIDkgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAgOSAgICAgIDAwRjAwMDAwIAorICAgOSAgICAgIDEwMkJGRkZGIAorICAgOSAgICAgIDAwRjAwMDAwIAorICAxMCAgICAgICAgICAgICAgCQorICAxMSBcP1w/XD9cPyAwODA4MzAwMCAJCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxMSAgICAgIDAwRjAwMDAwIAorICAxMSAgICAgIDAwMkJGRkZGIAorICAxMSAgICAgIDAwRjAwMDAwIAorICAxMiBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxMiAgICAgIDAwRjAwMDAwIAorICAxMiAgICAgIDAwMkJGRkZGIAorICAxMiAgICAgIDAwRjAwMDAwIAorICAxMyBcP1w/XD9cPyAzMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMTMgICAgICAwMEYwMDAwMCAKKyAgMTMgICAgICAxMDJCRkZGRiAKKyAgMTMgICAgICAwMEYwMDAwMCAKKyAgMTQgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDE0ICAgICAgMDBGMDAwMDAgCisgIDE0ICAgICAgMTAyQkZGRkYgCisgIDE0ICAgICAgMDBGMDAwMDAgCisgIDE1ICAgICAgICAgICAgICAJCisgIDE2IFw/XD9cP1w/IDIwMkJGRkZFIAkJYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMTYgICAgICAwMEYwMDAwMCAKKyAgMTYgICAgICAwMDBCRkZGRiAKKyAgMTYgICAgICAwMEYwMDAwMCAKKyAgMTcgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxNyAgICAgIDAwRjAwMDAwIAorICAxNyAgICAgIDAwMEJGRkZGIAorDEdBUyBMSVNUSU5HIC4qCisKKworICAxNyAgICAgIDAwRjAwMDAwIAorICAxOCBcP1w/XD9cPyAxMDA4MDAwMSAJCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxOCAgICAgIDAwRjAwMDAwIAorICAxOCAgICAgIDEwMEJGRkZGIAorICAxOCAgICAgIDAwRjAwMDAwIAorICAxOSBcP1w/XD9cPyAwMDA4MDAwMSAJCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxOSAgICAgIDAwRjAwMDAwIAorICAxOSAgICAgIDEwMEJGRkZGIAorICAxOSAgICAgIDAwRjAwMDAwIAorICAyMCAgICAgICAgICAgICAgCQorICAyMSBcP1w/XD9cPyAyMDA4MDAwMSAJCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDIxICAgICAgMDBGMDAwMDAgCisgIDIxICAgICAgMDAyQkZGRkYgCisgIDIxICAgICAgMDBGMDAwMDAgCisgIDIyIFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMjIgICAgICAwMEYwMDAwMCAKKyAgMjIgICAgICAwMDJCRkZGRiAKKyAgMjIgICAgICAwMEYwMDAwMCAKKyAgMjMgXD9cP1w/XD8gMTAwODAwMDEgCQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMjMgICAgICAwMEYwMDAwMCAKKyAgMjMgICAgICAxMDJCRkZGRiAKKyAgMjMgICAgICAwMEYwMDAwMCAKKyAgMjQgXD9cP1w/XD8gMDAwODAwMDEgCQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMjQgICAgICAwMEYwMDAwMCAKKyAgMjQgICAgICAxMDJCRkZGRiAKKyAgMjQgICAgICAwMEYwMDAwMCAKKyAgMjUgICAgICAgICAgICAgIAkKKyAgMjYgXD9cP1w/XD8gMjAwODAwMDEgCQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAyNiAgICAgIDAwRjAwMDAwIAorICAyNiAgICAgIDAwMEJGRkZGIAorICAyNiAgICAgIDAwRjAwMDAwIAorICAyNyBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDI3ICAgICAgMDBGMDAwMDAgCisgIDI3ICAgICAgMDAwQkZGRkYgCisgIDI3ICAgICAgMDBGMDAwMDAgCisgIDI4IFw/XD9cP1w/IDEwMjgwMDAxIAkJYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDI4ICAgICAgMDBGMDAwMDAgCisgIDI4ICAgICAgMTAwQkZGRkYgCisgIDI4ICAgICAgMDBGMDAwMDAgCisgIDI5IFw/XD9cP1w/IDAwMjgwMDAxIAkJYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDI5ICAgICAgMDBGMDAwMDAgCisgIDI5ICAgICAgMTAwQkZGRkYgCisgIDI5ICAgICAgMDBGMDAwMDAgCisgIDI5ICAgICAgMjAyODAwMDEgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTMxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucwpAQCAtMCwwICsxLDI5IEBACisjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0CisJCisJLnRleHQKKwkKKwlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCisJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAorCisJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKKwlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAorCisJYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCisJYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCisJYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAorCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKKworCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCisJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKKwlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKKworCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCisJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKKwlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKKworCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCisJYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKKwlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWViMDVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sCkBAIC0wLDAgKzEsOTkgQEAKKy4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6CisuKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjE2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoxNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKy4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisuKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKK0dBUyBMSVNUSU5HIC4qCisKKworICAgMSAgICAgICAgICAgICAgCSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKKyAgIDIgICAgICAgICAgICAgIAkJCisgICAzICAgICAgICAgICAgICAJCS50ZXh0CisgICA0ICAgICAgICAgICAgICAJCQorICAgNSBcP1w/XD9cPyAwMDAwMDBGMCAJCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgIDUgICAgICAwMDAwMDBGMCAKKyAgIDUgICAgICAwMDAwMDBGMCAKKyAgIDUgICAgICAwMDAwMDAwQiAKKyAgIDUgICAgICBGRkZGMDBGMCAKKyAgIDYgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgICA2ICAgICAgMDBGMDAwMDAgCisgICA2ICAgICAgMDAyQkZGRkYgCisgICA2ICAgICAgMDBGMDAwMDAgCisgICA3ICAgICAgICAgICAgICAJCisgICA4IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKKyAgIDggICAgICAwMEYwMDAwMCAKKyAgIDggICAgICAxMDBCRkZGRiAKKyAgIDggICAgICA4ODA4MzAwMCAKKyAgIDkgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAorICAgOSAgICAgIDg4MDgzMDAwIAorICAxMCAgICAgICAgICAgICAgCQorICAxMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxMSAgICAgIDAwRjAwMDAwIAorICAxMiBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxMiAgICAgIDAwRjAwMDAwIAorICAxMiAgICAgIDAwMkJGRkZGIAorICAxMiAgICAgIDAwRjAwMDAwIAorICAxMyBcP1w/XD9cPyAzMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKKyAgMTMgICAgICAwMEYwMDAwMCAKKyAgMTMgICAgICAxMDJCRkZGRiAKKyAgMTMgICAgICA4MDJCRkZGRSAKKyAgMTQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCisgIDE0ICAgICAgQTAyQkZGRkUgCisgIDE1ICAgICAgICAgICAgICAJCisgIDE2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMTYgICAgICAwMEYwMDAwMCAKKyAgMTcgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAxNyAgICAgIDAwRjAwMDAwIAorICAxNyAgICAgIDAwMEJGRkZGIAorICAxNyAgICAgIDAwRjAwMDAwIAorICAxOCBcP1w/XD9cPyAxMDA4MDAwMSAJCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAorICAxOCAgICAgIDAwRjAwMDAwIAorICAxOCAgICAgIDEwMEJGRkZGIAorICAxOCAgICAgIDgwMDgwMDAxIAorICAxOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAorICAxOSAgICAgIEEwMDgwMDAxIAorICAyMCAgICAgICAgICAgICAgCQorICAyMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDIxICAgICAgMDBGMDAwMDAgCisgIDIyIFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwxHQVMgTElTVElORyAuKgorCisKK1wqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKKyAgMjIgICAgICAwMEYwMDAwMCAKKyAgMjIgICAgICAwMDJCRkZGRiAKKyAgMjIgICAgICAwMEYwMDAwMCAKKyAgMjMgXD9cP1w/XD8gMTAwODAwMDEgCQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKKyAgMjMgICAgICAwMEYwMDAwMCAKKyAgMjMgICAgICAxMDJCRkZGRiAKKyAgMjMgICAgICA4MDA4MDAwMSAKKyAgMjQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKKyAgMjQgICAgICBBMDA4MDAwMSAKKyAgMjUgICAgICAgICAgICAgIAkKKyAgMjYgXD9cP1w/XD8gMDAwQkZGRkYgCQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAorXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAorICAyNiAgICAgIDAwRjAwMDAwIAorICAyNyBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCitcKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCisgIDI3ICAgICAgMDBGMDAwMDAgCisgIDI3ICAgICAgMDAwQkZGRkYgCisgIDI3ICAgICAgMDBGMDAwMDAgCisgIDI4IFw/XD9cP1w/IDEwMjgwMDAxIAkJYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCisgIDI4ICAgICAgMDBGMDAwMDAgCisgIDI4ICAgICAgMTAwQkZGRkYgCisgIDI4ICAgICAgODAyODAwMDEgCisgIDI5IFw/XD9cP1w/IDEwMEJGRkZGIAkJYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCisgIDI5ICAgICAgQTAyODAwMDEgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1MzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ucwpAQCAtMCwwICsxLDI5IEBACisjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0CisJCisJLnRleHQKKwkKKwlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCisJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAorCisJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKKwlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAorCisJYnNyIC0zIC0+IGJzciAtMTAJOyAgICAgICBJbnZhbGlkCisJYnNyIC0zIC0+IGJzci94dCAtMTAgICAgOyAgICAgICBJbnZhbGlkCisJYnNyL3R4IC0zIC0+IGJzciAtMTAgICAgOyAgICAgICBWYWxpZAorCWJzci90eCAtMyAtPiBic3IvZnggLTEwIDsgICAgICAgVmFsaWQKKworCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCisJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKKwlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKKworCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCisJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKKwlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKKworCWJyYSAtMyAtPiBic3IgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCisJYnJhIC0zIC0+IGJzci90eCAxMCAgICAgOyAgICAgIEludmFsaWQKKwlicmEvdHggLTMgLT4gYnNyIDEwICAgICA7ICAgICAgVmFsaWQKKwlicmEvdHggLTMgLT4gYnNyL2Z4IDEwICA7ICAgICAgVmFsaWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWZiNDNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCkBAIC0wLDAgKzEsNDAgQEAKKy4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6CisuKjo1OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KKy4qOjY6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorLio6NzogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCisuKjo4OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KKy4qOjk6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorLio6MTA6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorLio6MTE6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorLio6MTI6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorR0FTIExJU1RJTkcgLioKKworCisgICAxICAgICAgICAgICAgICAJIyBHQVMgc2hvdWxkIHByaW50IGEgd2FybmluZyAgd2hlbiBhbiBvZGQgcmVnaXN0ZXIgaXMgdXNlZCBhcyBhIHRhcmdldCAKKyAgIDIgICAgICAgICAgICAgIAkjIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCisgICAzICAgICAgICAgICAgICAJIyBhbmQgbXVseDJoCisgICA0ICAgICAgICAgICAgICAJCisgICA1IDAwMDAgMDU2ODEwMDAgCXN0MncgcjEsIEAocjAsIDApCXx8CW5vcCAKKy4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorICAgNSAgICAgIDAwRjAwMDAwIAorICAgNiAwMDA4IDA0NjgxMDAwIAlsZDJ3IHIxLCBAKHIwLCAwKQl8fAlub3AgCisuKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KKyAgIDYgICAgICAwMEYwMDAwMCAKKyAgIDcgMDAxMCAwNDU4MTAwMCAJbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKKy4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorICAgNyAgICAgIDAwRjAwMDAwIAorICAgOCAwMDE4IDA0RDgxMDAwIAlsZDRiaHUgcjEsIEAocjAsIDApCXx8CW5vcCAKKy4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorICAgOCAgICAgIDAwRjAwMDAwIAorICAgOSAwMDIwIDA0MzgxMDAwIAlsZDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCisuKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KKyAgIDkgICAgICAwMEYwMDAwMCAKKyAgMTAgMDAyOCAwNTU4MTAwMCAJc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKKy4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgorICAxMCAgICAgIDAwRjAwMDAwIAorICAxMSAwMDMwIDA1MzgxMDAwIAlzdDJoIHIxLCBAKHIwLCAwKQl8fAlub3AgCisuKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KKyAgMTEgICAgICAwMEYwMDAwMCAKKyAgMTIgMDAzOCAwMEYwMDAwMCAJbm9wCXx8CW11bHgyaCByMSwgcjUsIHI2ICAgCisuKiAgV2FybmluZzpPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KKyAgMTIgICAgICAwQTEwMTE0NiAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDlmNzUwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zCkBAIC0wLDAgKzEsMTIgQEAKKyMgR0FTIHNob3VsZCBwcmludCBhIHdhcm5pbmcgIHdoZW4gYW4gb2RkIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYSB0YXJnZXQgCisjIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCisjIGFuZCBtdWx4MmgKKworc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAorbGQydyByMSwgQChyMCwgMCkJfHwJbm9wIAorbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKK2xkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAorbGQyaCByMSwgQChyMCwgMCkJfHwJbm9wIAorc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKK3N0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKK25vcAl8fAltdWx4MmggcjEsIHI1LCByNiAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmFjNzYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQKQEAgLTAsMCArMSw0NDAgQEAKKyNhczoKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBhbGxpbnNuCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCswMDAwIDxhZGQ+OgorICAgMDoJYTYgMDEgICAgICAgCWFkZCByMCxyMQorICAgMjoJYTQgMDIgICAgICAgCWFkZCAweDAscjIKKworMCswMDA0IDxhZGQyPjoKKyAgIDQ6CWE1IGYzICAgICAgIAlhZGQyIC0xLHIzCisKKzArMDAwNiA8YWRkYz46CisgICA2OglhNyA0NSAgICAgICAJYWRkYyByNCxyNQorCiswKzAwMDggPGFkZG4+OgorICAgODoJYTIgNjcgICAgICAgCWFkZG4gcjYscjcKKyAgIGE6CWEwIGY4ICAgICAgIAlhZGRuIDB4ZixyOAorCiswKzAwMGMgPGFkZG4yPjoKKyAgIGM6CWExIDA5ICAgICAgIAlhZGRuMiAtMTYscjkKKworMCswMDBlIDxzdWI+OgorICAgZToJYWMgYWIgICAgICAgCXN1YiByMTAscjExCisKKzArMDAxMCA8c3ViYz46CisgIDEwOglhZCBjZCAgICAgICAJc3ViYyByMTIscjEzCisKKzArMDAxMiA8c3Vibj46CisgIDEyOglhZSBlZiAgICAgICAJc3VibiByMTQscjE1CisKKzArMDAxNCA8Y21wPjoKKyAgMTQ6CWFhIGRlICAgICAgIAljbXAgcjEzLHIxNAorICAxNjoJYTggMWYgICAgICAgCWNtcCAweDEscjE1CisKKzArMDAxOCA8Y21wMj46CisgIDE4OglhOSAxMCAgICAgICAJY21wMiAtMTUscjAKKworMCswMDFhIDxhbmQ+OgorICAxYToJODIgMTIgICAgICAgCWFuZCByMSxyMgorICAxYzoJODQgMzQgICAgICAgCWFuZCByMyxAcjQKKworMCswMDFlIDxhbmRoPjoKKyAgMWU6CTg1IDU2ICAgICAgIAlhbmRoIHI1LEByNgorCiswKzAwMjAgPGFuZGI+OgorICAyMDoJODYgNzggICAgICAgCWFuZGIgcjcsQHI4CisKKzArMDAyMiA8b3I+OgorICAyMjoJOTIgOWEgICAgICAgCW9yIHI5LHIxMAorICAyNDoJOTQgYmMgICAgICAgCW9yIHIxMSxAcjEyCisKKzArMDAyNiA8b3JoPjoKKyAgMjY6CTk1IGRlICAgICAgIAlvcmggcjEzLEByMTQKKworMCswMDI4IDxvcmI+OgorICAyODoJOTYgZmQgICAgICAgCW9yYiByMTUsQHIxMworCiswKzAwMmEgPGVvcj46CisgIDJhOgk5YSBlZiAgICAgICAJZW9yIHIxNCxyMTUKKyAgMmM6CTljIDAxICAgICAgIAllb3IgcjAsQHIxCisKKzArMDAyZSA8ZW9yaD46CisgIDJlOgk5ZCAyMyAgICAgICAJZW9yaCByMixAcjMKKworMCswMDMwIDxlb3JiPjoKKyAgMzA6CTllIDQ1ICAgICAgIAllb3JiIHI0LEByNQorCiswKzAwMzIgPGJhbmRsPjoKKyAgMzI6CTgwIGY2ICAgICAgIAliYW5kbCAweGYsQHI2CisKKzArMDAzNCA8bmFkaD46CisgIDM0Ogk4MSA3NyAgICAgICAJYmFuZGggMHg3LEByNworCiswKzAwMzYgPGJvcmw+OgorICAzNjoJOTAgMzggICAgICAgCWJvcmwgMHgzLEByOAorCiswKzAwMzggPGJvcmg+OgorICAzODoJOTEgZDkgICAgICAgCWJvcmggMHhkLEByOQorCiswKzAwM2EgPGJlb3JsPjoKKyAgM2E6CTk4IGZhICAgICAgIAliZW9ybCAweGYsQHIxMAorCiswKzAwM2MgPGJlb3JoPjoKKyAgM2M6CTk5IDFiICAgICAgIAliZW9yaCAweDEsQHIxMQorCiswKzAwM2UgPGJ0c3RsPjoKKyAgM2U6CTg4IDBjICAgICAgIAlidHN0bCAweDAsQHIxMgorCiswKzAwNDAgPGJ0c3RoPjoKKyAgNDA6CTg5IDhkICAgICAgIAlidHN0aCAweDgsQHIxMworCiswKzAwNDIgPG11bD46CisgIDQyOglhZiBlZiAgICAgICAJbXVsIHIxNCxyMTUKKworMCswMDQ0IDxtdWx1PjoKKyAgNDQ6CWFiIGRlICAgICAgIAltdWx1IHIxMyxyMTQKKworMCswMDQ2IDxtdWx1aD46CisgIDQ2OgliYiBmMCAgICAgICAJbXVsdWggcjE1LHIwCisKKzArMDA0OCA8bXVsaD46CisgIDQ4OgliZiAxMiAgICAgICAJbXVsaCByMSxyMgorCiswKzAwNGEgPGRpdjBzPjoKKyAgNGE6CTk3IDQzICAgICAgIAlkaXYwcyByMworCiswKzAwNGMgPGRpdjB1PjoKKyAgNGM6CTk3IDU0ICAgICAgIAlkaXYwdSByNAorCiswKzAwNGUgPGRpdjE+OgorICA0ZToJOTcgNjUgICAgICAgCWRpdjEgcjUKKworMCswMDUwIDxkaXYyPjoKKyAgNTA6CTk3IDc2ICAgICAgIAlkaXYyIHI2CisKKzArMDA1MiA8ZGl2Mz46CisgIDUyOgk5ZiA2MCAgICAgICAJZGl2MworCiswKzAwNTQgPGRpdjRzPjoKKyAgNTQ6CTlmIDcwICAgICAgIAlkaXY0cworCiswKzAwNTYgPGxzbD46CisgIDU2OgliNiA3OCAgICAgICAJbHNsIHI3LHI4CisgIDU4OgliNCAzOSAgICAgICAJbHNsIDB4MyxyOQorCiswKzAwNWEgPGxzbDI+OgorICA1YToJYjUgMGEgICAgICAgCWxzbDIgMHgwLHIxMAorCiswKzAwNWMgPGxzcj46CisgIDVjOgliMiBiYyAgICAgICAJbHNyIHIxMSxyMTIKKyAgNWU6CWIwIGZkICAgICAgIAlsc3IgMHhmLHIxMworCiswKzAwNjAgPGxzcjI+OgorICA2MDoJYjEgZmUgICAgICAgCWxzcjIgMHhmLHIxNAorCiswKzAwNjIgPGFzcj46CisgIDYyOgliYSBmZCAgICAgICAJYXNyIHIxNSxyMTMKKyAgNjQ6CWI4IDZlICAgICAgIAlhc3IgMHg2LHIxNAorCiswKzAwNjYgPGFzcjI+OgorICA2NjoJYjkgN2YgICAgICAgCWFzcjIgMHg3LHIxNQorCiswKzAwNjggPGxkaV84PjoKKyAgNjg6CWNmIGYyICAgICAgIAlsZGk6OCAweGZmLHIyCisKKzArMDA2YSA8bGQ+OgorICA2YToJMDQgMzQgICAgICAgCWxkIEByMyxyNAorICA2YzoJMDAgNTYgICAgICAgCWxkIEBcKHIxMyxyNVwpLHI2CisgIDZlOgkyNyBmNyAgICAgICAJbGQgQFwocjE0LDUwOFwpLHI3CisgIDcwOgkwMyBmOCAgICAgICAJbGQgQFwocjE1LDB4M2NcKSxyOAorICA3MjoJMDcgMDkgICAgICAgCWxkIEByMTVcKyxyOQorICA3NDoJMDcgOTAgICAgICAgCWxkIEByMTVcKyxwcworICA3NjoJMDcgODAgICAgICAgCWxkIEByMTVcKyx0YnIKKyAgNzg6CTA3IDgxICAgICAgIAlsZCBAcjE1XCsscnAKKyAgN2E6CTA3IDgyICAgICAgIAlsZCBAcjE1XCssc3NwCisKKzArMDA3YyA8bGR1aD46CisgIDdjOgkwNSBhYiAgICAgICAJbGR1aCBAcjEwLHIxMQorICA3ZToJMDEgY2QgICAgICAgCWxkdWggQFwocjEzLHIxMlwpLHIxMworICA4MDoJNDggMGYgICAgICAgCWxkdWggQFwocjE0LC0yNTZcKSxyMTUKKworMCswMDgyIDxsZHViPjoKKyAgODI6CTA2IGRlICAgICAgIAlsZHViIEByMTMscjE0CisgIDg0OgkwMiBmMCAgICAgICAJbGR1YiBAXChyMTMscjE1XCkscjAKKyAgODY6CTY4IDAxICAgICAgIAlsZHViIEBcKHIxNCwtMTI4XCkscjEKKworMCswMDg4IDxzdD46CisgIDg4OgkxNCAzMiAgICAgICAJc3QgcjIsQHIzCisgIDhhOgkxMCA1NCAgICAgICAJc3QgcjQsQFwocjEzLHI1XCkKKyAgOGM6CTM4IDA2ICAgICAgIAlzdCByNixAXChyMTQsLTUxMlwpCisgIDhlOgkxMyBmNyAgICAgICAJc3QgcjcsQFwocjE1LDB4M2NcKQorICA5MDoJMTcgMDggICAgICAgCXN0IHI4LEAtcjE1CisgIDkyOgkxNyA4NCAgICAgICAJc3QgbWRoLEAtcjE1CisgIDk0OgkxNyA5MCAgICAgICAJc3QgcHMsQC1yMTUKKworMCswMDk2IDxzdGg+OgorICA5NjoJMTUgYTkgICAgICAgCXN0aCByOSxAcjEwCisgIDk4OgkxMSBjYiAgICAgICAJc3RoIHIxMSxAXChyMTMscjEyXCkKKyAgOWE6CTU0IDBkICAgICAgIAlzdGggcjEzLEBcKHIxNCwxMjhcKQorCiswKzAwOWMgPHN0Yj46CisgIDljOgkxNiBmZSAgICAgICAJc3RiIHIxNCxAcjE1CisgIDllOgkxMiAxMCAgICAgICAJc3RiIHIwLEBcKHIxMyxyMVwpCisgIGEwOgk3OCAwMiAgICAgICAJc3RiIHIyLEBcKHIxNCwtMTI4XCkKKworMCswMGEyIDxtb3Y+OgorICBhMjoJOGIgMzQgICAgICAgCW1vdiByMyxyNAorICBhNDoJYjcgNTUgICAgICAgCW1vdiBtZGwscjUKKyAgYTY6CTE3IDE2ICAgICAgIAltb3YgcHMscjYKKyAgYTg6CWIzIDM3ICAgICAgIAltb3YgcjcsdXNwCisgIGFhOgkwNyAxOCAgICAgICAJbW92IHI4LHBzCisKKzArMDBhYyA8am1wPjoKKyAgYWM6CTk3IDA5ICAgICAgIAlqbXAgQHI5CisKKzArMDBhZSA8cmV0PjoKKyAgYWU6CTk3IDIwICAgICAgIAlyZXQKKworMCswMGIwIDxicmE+OgorICBiMDoJZTAgYTcgICAgICAgCWJyYSAwIFw8YWRkXD4KKworMCswMGIyIDxibm8+OgorICBiMjoJZTEgYTYgICAgICAgCWJubyAwIFw8YWRkXD4KKworMCswMGI0IDxiZXE+OgorICBiNDoJZTIgYTUgICAgICAgCWJlcSAwIFw8YWRkXD4KKworMCswMGI2IDxibmU+OgorICBiNjoJZTMgYTQgICAgICAgCWJuZSAwIFw8YWRkXD4KKworMCswMGI4IDxiYz46CisgIGI4OgllNCBhMyAgICAgICAJYmMgMCBcPGFkZFw+CisKKzArMDBiYSA8Ym5jPjoKKyAgYmE6CWU1IGEyICAgICAgIAlibmMgMCBcPGFkZFw+CisKKzArMDBiYyA8Ym4+OgorICBiYzoJZTYgYTEgICAgICAgCWJuIDAgXDxhZGRcPgorCiswKzAwYmUgPGJwPjoKKyAgYmU6CWU3IGEwICAgICAgIAlicCAwIFw8YWRkXD4KKworMCswMGMwIDxidj46CisgIGMwOgllOCA5ZiAgICAgICAJYnYgMCBcPGFkZFw+CisKKzArMDBjMiA8Ym52PjoKKyAgYzI6CWU5IDllICAgICAgIAlibnYgMCBcPGFkZFw+CisKKzArMDBjNCA8Ymx0PjoKKyAgYzQ6CWVhIDlkICAgICAgIAlibHQgMCBcPGFkZFw+CisKKzArMDBjNiA8YmdlPjoKKyAgYzY6CWViIDljICAgICAgIAliZ2UgMCBcPGFkZFw+CisKKzArMDBjOCA8YmxlPjoKKyAgYzg6CWVjIDliICAgICAgIAlibGUgMCBcPGFkZFw+CisKKzArMDBjYSA8Ymd0PjoKKyAgY2E6CWVkIDlhICAgICAgIAliZ3QgMCBcPGFkZFw+CisKKzArMDBjYyA8YmxzPjoKKyAgY2M6CWVlIDk5ICAgICAgIAlibHMgMCBcPGFkZFw+CisKKzArMDBjZSA8YmhpPjoKKyAgY2U6CWVmIDk4ICAgICAgIAliaGkgMCBcPGFkZFw+CisKKzArMDBkMCA8am1wX2Q+OgorICBkMDoJOWYgMGIgICAgICAgCWptcDpkIEByMTEKKyAgZDI6CTlmIGEwICAgICAgIAlub3AKKworMCswMGQ0IDxyZXRfZD46CisgIGQ0Ogk5ZiAyMCAgICAgICAJcmV0OmQKKyAgZDY6CTlmIGEwICAgICAgIAlub3AKKworMCswMGQ4IDxicmFfZD46CisgIGQ4OglmMCBmYiAgICAgICAJYnJhOmQgZDAgXDxqbXBfZFw+CisgIGRhOgk5ZiBhMCAgICAgICAJbm9wCisKKzArMDBkYyA8Ym5vX2Q+OgorICBkYzoJZjEgZjkgICAgICAgCWJubzpkIGQwIFw8am1wX2RcPgorICBkZToJOWYgYTAgICAgICAgCW5vcAorCiswKzAwZTAgPGJlcV9kPjoKKyAgZTA6CWYyIGY3ICAgICAgIAliZXE6ZCBkMCBcPGptcF9kXD4KKyAgZTI6CTlmIGEwICAgICAgIAlub3AKKworMCswMGU0IDxibmVfZD46CisgIGU0OglmMyBmNSAgICAgICAJYm5lOmQgZDAgXDxqbXBfZFw+CisgIGU2Ogk5ZiBhMCAgICAgICAJbm9wCisKKzArMDBlOCA8YmNfZD46CisgIGU4OglmNCBmMyAgICAgICAJYmM6ZCBkMCBcPGptcF9kXD4KKyAgZWE6CTlmIGEwICAgICAgIAlub3AKKworMCswMGVjIDxibmNfZD46CisgIGVjOglmNSBmMSAgICAgICAJYm5jOmQgZDAgXDxqbXBfZFw+CisgIGVlOgk5ZiBhMCAgICAgICAJbm9wCisKKzArMDBmMCA8Ym5fZD46CisgIGYwOglmNiBlZiAgICAgICAJYm46ZCBkMCBcPGptcF9kXD4KKyAgZjI6CTlmIGEwICAgICAgIAlub3AKKworMCswMGY0IDxicF9kPjoKKyAgZjQ6CWY3IGVkICAgICAgIAlicDpkIGQwIFw8am1wX2RcPgorICBmNjoJOWYgYTAgICAgICAgCW5vcAorCiswKzAwZjggPGJ2X2Q+OgorICBmODoJZjggZWIgICAgICAgCWJ2OmQgZDAgXDxqbXBfZFw+CisgIGZhOgk5ZiBhMCAgICAgICAJbm9wCisKKzArMDBmYyA8Ym52X2Q+OgorICBmYzoJZjkgZTkgICAgICAgCWJudjpkIGQwIFw8am1wX2RcPgorICBmZToJOWYgYTAgICAgICAgCW5vcAorCiswKzAxMDAgPGJsdF9kPjoKKyAxMDA6CWZhIGU3ICAgICAgIAlibHQ6ZCBkMCBcPGptcF9kXD4KKyAxMDI6CTlmIGEwICAgICAgIAlub3AKKworMCswMTA0IDxiZ2VfZD46CisgMTA0OglmYiBlNSAgICAgICAJYmdlOmQgZDAgXDxqbXBfZFw+CisgMTA2Ogk5ZiBhMCAgICAgICAJbm9wCisKKzArMDEwOCA8YmxlX2Q+OgorIDEwODoJZmMgZTMgICAgICAgCWJsZTpkIGQwIFw8am1wX2RcPgorIDEwYToJOWYgYTAgICAgICAgCW5vcAorCiswKzAxMGMgPGJndF9kPjoKKyAxMGM6CWZkIGUxICAgICAgIAliZ3Q6ZCBkMCBcPGptcF9kXD4KKyAxMGU6CTlmIGEwICAgICAgIAlub3AKKworMCswMTEwIDxibHNfZD46CisgMTEwOglmZSBkZiAgICAgICAJYmxzOmQgZDAgXDxqbXBfZFw+CisgMTEyOgk5ZiBhMCAgICAgICAJbm9wCisKKzArMDExNCA8YmhpX2Q+OgorIDExNDoJZmYgZGQgICAgICAgCWJoaTpkIGQwIFw8am1wX2RcPgorIDExNjoJOWYgYTAgICAgICAgCW5vcAorCiswKzAxMTggPGxkcmVzPjoKKyAxMTg6CWJjIDgyICAgICAgIAlsZHJlcyBAcjJcKywweDgKKworMCswMTFhIDxzdHJlcz46CisgMTFhOgliZCBmMyAgICAgICAJc3RyZXMgMHhmLEByM1wrCisKKzArMDExYyA8bm9wPjoKKyAxMWM6CTlmIGEwICAgICAgIAlub3AKKworMCswMTFlIDxhbmRjY3I+OgorIDExZToJODMgZmYgICAgICAgCWFuZGNjciAweGZmCisKKzArMDEyMCA8b3JjY3I+OgorIDEyMDoJOTMgN2QgICAgICAgCW9yY2NyIDB4N2QKKworMCswMTIyIDxzdGlsbT46CisgMTIyOgk4NyA2MSAgICAgICAJc3RpbG0gMHg2MQorCiswKzAxMjQgPGFkZHNwPjoKKyAxMjQ6CWEzIDgwICAgICAgIAlhZGRzcCAtNTEyCisKKzArMDEyNiA8ZXh0c2I+OgorIDEyNjoJOTcgODkgICAgICAgCWV4dHNiIHI5CisKKzArMDEyOCA8ZXh0dWI+OgorIDEyODoJOTcgOWEgICAgICAgCWV4dHViIHIxMAorCiswKzAxMmEgPGV4dHNoPjoKKyAxMmE6CTk3IGFiICAgICAgIAlleHRzaCByMTEKKworMCswMTJjIDxleHR1aD46CisgMTJjOgk5NyBiYyAgICAgICAJZXh0dWggcjEyCisKKzArMDEyZSA8ZW50ZXI+OgorIDEyZToJMGYgZmYgICAgICAgCWVudGVyIDB4M2ZjCisKKzArMDEzMCA8bGVhdmU+OgorIDEzMDoJOWYgOTAgICAgICAgCWxlYXZlCisKKzArMDEzMiA8eGNoYj46CisgMTMyOgk4YSBlZiAgICAgICAJeGNoYiBAcjE0LHIxNQorCiswKzAxMzQgPGxkaV8zMj46CisgMTM0Ogk5ZiA4MCAxMiAzNCAJbGRpOjMyIDB4MTIzNDU2NzgscjAKKyAxMzg6CTU2IDc4IAorCiswKzAxM2EgPGNvcG9wPjoKKyAxM2E6CTlmIGNmIDAxIDM0IAljb3BvcCAweGYsMHgxLGNyMyxjcjQKKyAxM2U6CTlmIGNmIDA0IDU2IAljb3BvcCAweGYsMHg0LGNyNSxjcjYKKyAxNDI6CTlmIGNmIGZmIDcwIAljb3BvcCAweGYsMHhmZixjcjcsY3IwCisKKzArMDE0NiA8Y29wbGQ+OgorIDE0NjoJOWYgZDAgMDAgNDAgCWNvcGxkIDB4MCwweDAscjQsY3IwCisKKzArMDE0YSA8Y29wc3Q+OgorIDE0YToJOWYgZTcgMDIgMTUgCWNvcHN0IDB4NywweDIsY3IxLHI1CisKKzArMDE0ZSA8Y29wc3Y+OgorIDE0ZToJOWYgZjggMDMgMjYgCWNvcHN2IDB4OCwweDMsY3IyLHI2CisKKzArMDE1MiA8bGRtMD46CisgMTUyOgk4YyA4ZCAgICAgICAJbGRtMCBcKHIwLHIyLHIzLHI3XCkKKworMCswMTU0IDxsZG0xPjoKKyAxNTQ6CThkIDg5ICAgICAgIAlsZG0xIFwocjgscjExLHIxNVwpCisKKzArMDE1NiA8c3RtMD46CisgMTU2Ogk4ZSAzMCAgICAgICAJc3RtMCBcKHIyLHIzXCkKKworMCswMTU4IDxzdG0xPjoKKyAxNTg6CThmIDA2ICAgICAgIAlzdG0xIFwocjEzLHIxNFwpCisKKzArMDE1YSA8Y2FsbD46CisgMTVhOglkNyA1MiAgICAgICAJY2FsbCAwIFw8YWRkXD4KKyAxNWM6CTk3IDFhICAgICAgIAljYWxsIEByMTAKKworMCswMTVlIDxjYWxsX2Q+OgorIDE1ZToJZGYgNTAgICAgICAgCWNhbGw6ZCAwIFw8YWRkXD4KKyAxNjA6CTlmIGEwICAgICAgIAlub3AKKyAxNjI6CTlmIDFjICAgICAgIAljYWxsOmQgQHIxMgorIDE2NDoJOWYgYTAgICAgICAgCW5vcAorCiswKzAxNjYgPGRtb3Y+OgorIDE2NjoJMDggMjIgICAgICAgCWRtb3YgQDB4ODgscjEzCisgMTY4OgkxOCAxNSAgICAgICAJZG1vdiByMTMsQDB4NTQKKyAxNmE6CTBjIDExICAgICAgIAlkbW92IEAweDQ0LEByMTNcKworIDE2YzoJMWMgMDAgICAgICAgCWRtb3YgQHIxM1wrLEAweDAKKyAxNmU6CTBiIDBiICAgICAgIAlkbW92IEAweDJjLEAtcjE1CisgMTcwOgkxYiAwOSAgICAgICAJZG1vdiBAcjE1XCssQDB4MjQKKworMCswMTcyIDxkbW92aD46CisgMTcyOgkwOSA0NCAgICAgICAJZG1vdmggQDB4ODgscjEzCisgMTc0OgkxOSAyOSAgICAgICAJZG1vdmggcjEzLEAweDUyCisgMTc2OgkwZCAxYSAgICAgICAJZG1vdmggQDB4MzQsQHIxM1wrCisgMTc4OgkxZCAyOSAgICAgICAJZG1vdmggQHIxM1wrLEAweDUyCisKKzArMDE3YSA8ZG1vdmI+OgorIDE3YToJMGEgOTEgICAgICAgCWRtb3ZiIEAweDkxLHIxMworIDE3YzoJMWEgNTMgICAgICAgCWRtb3ZiIHIxMyxAMHg1MworIDE3ZToJMGUgNDcgICAgICAgCWRtb3ZiIEAweDQ3LEByMTNcKworIDE4MDoJMWUgMDAgICAgICAgCWRtb3ZiIEByMTNcKyxAMHgwCisKKzArMDE4MiA8bGRpXzIwPjoKKyAxODI6CTliIGYxIGZmIGZmIAlsZGk6MjAgMHhmZmZmZixyMQorCiswKzAxODYgPGZpbmlzaD46CisgMTg2Ogk5ZiA4MCAwMCAwMCAJbGRpOjMyIDB4ODAwMCxyMAorIDE4YToJODAgMDAgCisgMThjOgliMyAyMCAgICAgICAJbW92IHIwLHNzcAorIDE4ZToJOWYgODAgMDAgMDAgCWxkaTozMiAweDEscjAKKyAxOTI6CTAwIDAxIAorIDE5NDoJMWYgMGEgICAgICAgCWludCAweGEKKworMCswMTk2IDxpbnRlPjoKKyAxOTY6CTlmIDMwICAgICAgIAlpbnRlCisKKzArMDE5OCA8cmV0aT46CisgMTk4Ogk5NyAzMCAgICAgICAJcmV0aQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZmUxOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5leHAKQEAgLTAsMCArMSw1IEBACisjIEZSMzAgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KKworaWYgW2lzdGFyZ2V0IGZyMzAqLSotKl0geworICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2QyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24ucwpAQCAtMCwwICsxLDQzNCBAQAorIC5kYXRhCitmb29kYXRhOiAud29yZCA0MgorCSAudGV4dAorZm9vdGV4dDoKKwkuZ2xvYmFsIGFkZAorYWRkOgorCWFkZCByMCwgcjEKKwlhZGQgIzAsIHIyCisJLmdsb2JhbCBhZGQyCithZGQyOgorCWFkZDIgIy0xLCByMworCS5nbG9iYWwgYWRkYworYWRkYzoKKwlhZGRjIHI0LCByNQorCS5nbG9iYWwgYWRkbgorYWRkbjoKKwlhZGRuIHI2LCByNworCWFkZG4gIzE1LCByOAorCS5nbG9iYWwgYWRkbjIKK2FkZG4yOgorCWFkZG4yICMtMTYsIHI5CisJLmdsb2JhbCBzdWIKK3N1YjoKKwlzdWIgcjEwLCByMTEKKwkuZ2xvYmFsIHN1YmMKK3N1YmM6CisJc3ViYyByMTIsIHIxMworCS5nbG9iYWwgc3Vibgorc3VibjoKKwlzdWJuIHIxNCwgcjE1CisJLmdsb2JhbCBjbXAKK2NtcDoKKwljbXAgYWMsIGZwCisJY21wICMxLCBzcAorCS5nbG9iYWwgY21wMgorY21wMjoKKwljbXAyICMtMTUsIHIwCisJLmdsb2JhbCBhbmQKK2FuZDoKKwlhbmQgcjEsIHIyCisJYW5kIHIzLCBAcjQKKwkuZ2xvYmFsIGFuZGgKK2FuZGg6CisJYW5kaCByNSwgQHI2CisJLmdsb2JhbCBhbmRiCithbmRiOgorCWFuZGIgcjcsIEByOAorCS5nbG9iYWwgb3IKK29yOgorCW9yIHI5LCByMTAKKwlvciByMTEsIEByMTIKKwkuZ2xvYmFsIG9yaAorb3JoOgorCW9yaCByMTMsIEByMTQKKwkuZ2xvYmFsIG9yYgorb3JiOgorCW9yYiByMTUsIEBhYworCS5nbG9iYWwgZW9yCitlb3I6CisJZW9yIGZwLCBzcAorCWVvciByMCwgQHIxCisJLmdsb2JhbCBlb3JoCitlb3JoOgorCWVvcmggcjIsIEByMworCS5nbG9iYWwgZW9yYgorZW9yYjoKKwllb3JiIHI0LCBAcjUKKwkuZ2xvYmFsIGJhbmRsCitiYW5kbDoKKwliYW5kbCAjMTUsIEByNgorCS5nbG9iYWwgYmFuZGgKK25hZGg6CisJYmFuZGggIzcsIEByNworCS5nbG9iYWwgYm9ybAorYm9ybDoKKwlib3JsICMzLCBAcjgKKwkuZ2xvYmFsIGJvcmgKK2Jvcmg6CisJYm9yaCAjMTMsIEByOQorCS5nbG9iYWwgYmVvcmwKK2Jlb3JsOgorCWJlb3JsICMxNSwgQHIxMAorCS5nbG9iYWwgYmVvcmgKK2Jlb3JoOgorCWJlb3JoICMxLCBAcjExCisJLmdsb2JhbCBidHN0bAorYnRzdGw6CisJYnRzdGwgIzAsIEByMTIKKwkuZ2xvYmFsIGJ0c3RoCitidHN0aDoKKwlidHN0aCAjOCwgQHIxMworCS5nbG9iYWwgbXVsCittdWw6CisJbXVsIHIxNCwgcjE1CisJLmdsb2JhbCBtdWx1CittdWx1OgorCW11bHUgYWMsIGZwCisJLmdsb2JhbCBtdWx1aAorbXVsdWg6CQorCW11bHVoIHNwLCByMAorCS5nbG9iYWwgbXVsaAorbXVsaDoJCisJbXVsaCByMSwgcjIKKwkuZ2xvYmFsIGRpdjBzCitkaXYwczoKKwlkaXYwcyByMworCS5nbG9iYWwgZGl2MHUKK2RpdjB1OgorCWRpdjB1IHI0CisJLmdsb2JhbCBkaXYxCitkaXYxOgorCWRpdjEgcjUKKwkuZ2xvYmFsIGRpdjIKK2RpdjI6CisJZGl2MiByNgorCS5nbG9iYWwgZGl2MworZGl2MzoKKwlkaXYzCisJLmdsb2JhbCBkaXY0cworZGl2NHM6CisJZGl2NHMKKwkuZ2xvYmFsIGxzbAorbHNsOgorCWxzbCByNywgcjgKKwlsc2wgIzMsIHI5CisJLmdsb2JhbCBsc2wyCitsc2wyOgorCWxzbDIgIzAsIHIxMAorCS5nbG9iYWwgbHNyCitsc3I6CisJbHNyIHIxMSwgcjEyCisJbHNyICMxNSwgcjEzCisJLmdsb2JhbCBsc3IyCitsc3IyOgorCWxzcjIgIzE1LCByMTQKKwkuZ2xvYmFsIGFzcgorYXNyOgorCWFzciByMTUsIGFjCisJYXNyICM2LCBmcAorCS5nbG9iYWwgYXNyMgorYXNyMjoKKwlhc3IyICM3LCBzcAorCS5nbG9iYWwgbGRpXzgKK2xkaV84OgorCWxkaTo4ICMweGZmLCByMgorCS5nbG9iYWwgbGQKK2xkOgorCWxkIEByMywgcjQKKwlsZCBAKFIxMywgcjUpLCByNgorCWxkIEAoUjE0LCAweDFmYyksIHI3CisJbGQgQChSMTUsIDB4M2MpLCByOAorCWxkIEByMTUrLCByOQorCWxkIEByMTUrLCBwcworCWxkIEBSMTUrLCB0YnIKKwlsZCBAcjE1KywgcnAKKwlsZCBAUjE1Kywgc3NwCisJLmdsb2JhbCBsZHVoCitsZHVoOgorCWxkdWggQHIxMCwgcjExCisJbGR1aCBAKHIxMywgcjEyKSwgcjEzCisJbGR1aCBAKHIxNCwgIy0yNTYpLCByMTUKKwkuZ2xvYmFsIGxkdWIKK2xkdWI6CisJbGR1YiBAYWMsIGZwCisJbGR1YiBAKHIxMywgc3ApLCByMAorCWxkdWIgQChyMTQsIC0xMjgpLCByMQorCS5nbG9iYWwgc3QKK3N0OgorCXN0IHIyLCBAcjMKKwlzdCByNCwgQChyMTMsIHI1KQorCXN0IHI2LCBAKHIxNCwgLTUxMikKKwlzdCByNywgQChyMTUsIDB4M2MpCisJc3QgcjgsIEAgLSByMTUKKwlzdCBNREgsIEAtcjE1CisJc3QgUFMsIEAgLSByMTUKKwkuZ2xvYmFsIGxzdGgKK3N0aDoKKwlzdGggcjksIEByMTAKKwlzdGggcjExLCBAKHIxMywgcjEyKQorCXN0aCByMTMsIEAocjE0LCAxMjgpCisJLmdsb2JhbCBzdGIKK3N0YjoKKwlTVEIgcjE0LCBAcjE1CisJc3RiIHIwLCBAKHIxMywgcjEpCisJU1RCIHIyLCBAKHIxNCwgLTEyOCkKKwkuZ2xvYmFsIG1vdgorbW92OgorCW1vdiByMywgcjQKKwlNT1YgbWRsLCByNQorCW1vdiBwcywgcjYKKwltb3YgcjcsIHVzcAorCW1vdiByOCwgcHMKKwkuZ2xvYmFsIGptcAoram1wOgorCWptcCBAcjkKKwkuZ2xvYmFsIHJldAorcmV0OgorCXJldAorCS5nbG9iYWwgYnJhCiticmE6CisJYnJhIGZvb3RleHQKKwkuZ2xvYmFsIGJubworYm5vOgorCWJubyBmb290ZXh0CisJLmdsb2JhbCBiZXEKK2JlcToKKwliZXEgZm9vdGV4dAorCS5nbG9iYWwgYm5lCitibmU6CisJYm5lIGZvb3RleHQKKwkuZ2xvYmFsIGJjCitiYzoKKwliYyBmb290ZXh0CisJLmdsb2JhbCBibmMKK2JuYzoKKwlibmMgZm9vdGV4dAorCS5nbG9iYWwgYm4KK2JuOgorCWJuIGZvb3RleHQKKwkuZ2xvYmFsIGJwCiticDoKKwlicCBmb290ZXh0CisJLmdsb2JhbCBidgorYnY6CisJYnYgZm9vdGV4dAorCS5nbG9iYWwgYm52CitibnY6CisJYm52IGZvb3RleHQKKwkuZ2xvYmFsIGJsdAorYmx0OgorCWJsdCBmb290ZXh0CisJLmdsb2JhbCBiZ2UKK2JnZToKKwliZ2UgZm9vdGV4dAorCS5nbG9iYWwgYmxlCitibGU6CisJYmxlIGZvb3RleHQKKwkuZ2xvYmFsIGJndAorYmd0OgorCWJndCBmb290ZXh0CisJLmdsb2JhbCBibHMKK2JsczoKKwlibHMgZm9vdGV4dAorCS5nbG9iYWwgYmhpCitiaGk6CisJYmhpIGZvb3RleHQKK2RlbGF5X2Zvb3RleHQ6CQkKKwkuZ2xvYmFsIGptcF9kCitqbXBfZDoKKwlqbXA6ZCBAcjExCisJbm9wCisJLmdsb2JhbCByZXRfZAorcmV0X2Q6CisJcmV0OmQKKwlub3AKKwkuZ2xvYmFsIGJyYV9kCiticmFfZDoKKwlicmE6RCBkZWxheV9mb290ZXh0CisJbm9wCisJLmdsb2JhbCBibm9fZAorYm5vX2Q6CisJYm5vOmQgZGVsYXlfZm9vdGV4dAorCW5vcAorCS5nbG9iYWwgYmVxX2QKK2JlcV9kOgorCWJlcTpEIGRlbGF5X2Zvb3RleHQKKwlub3AKKwkuZ2xvYmFsIGJuZV9kCitibmVfZDoKKwlibmU6ZCBkZWxheV9mb290ZXh0CisJbm9wCisJLmdsb2JhbCBiY19kCitiY19kOgorCWJjOmQgZGVsYXlfZm9vdGV4dAorCW5vcAorCS5nbG9iYWwgYm5jX2QKK2JuY19kOgorCWJuYzpkIGRlbGF5X2Zvb3RleHQKKwlub3AKKwkuZ2xvYmFsIGJuX2QKK2JuX2Q6CisJYm46ZCBkZWxheV9mb290ZXh0CisJbm9wCisJLmdsb2JhbCBicF9kCiticF9kOgorCWJwOmQgZGVsYXlfZm9vdGV4dAorCW5vcAorCS5nbG9iYWwgYnZfZAorYnZfZDoKKwlidjpkIGRlbGF5X2Zvb3RleHQKKwlub3AKKwkuZ2xvYmFsIGJudl9kCitibnZfZDoKKwlibnY6ZCBkZWxheV9mb290ZXh0CisJbm9wCisJLmdsb2JhbCBibHRfZAorYmx0X2Q6CisJYmx0OmQgZGVsYXlfZm9vdGV4dAorCW5vcAorCS5nbG9iYWwgYmdlX2QKK2JnZV9kOgorCWJnZTpkIGRlbGF5X2Zvb3RleHQKKwlub3AKKwkuZ2xvYmFsIGJsZV9kCitibGVfZDoKKwlibGU6ZCBkZWxheV9mb290ZXh0CisJbm9wCisJLmdsb2JhbCBiZ3RfZAorYmd0X2Q6CisJYmd0OmQgZGVsYXlfZm9vdGV4dAorCW5vcAorCS5nbG9iYWwgYmxzX2QKK2Jsc19kOgorCWJsczpkIGRlbGF5X2Zvb3RleHQKKwlub3AKKwkuZ2xvYmFsIGJoaV9kCitiaGlfZDoKKwliaGk6ZCBkZWxheV9mb290ZXh0CisJbm9wCisJLmdsb2JhbCBsZHJlcworbGRyZXM6CisJbGRyZXMgQHIyKywgIzgKKwkuZ2xvYmFsIHN0cmVzCitzdHJlczoKKwlzdHJlcyAjMTUsIEByMysKKwkuZ2xvYmFsIG5vcAorbm9wOgorCW5vcAorCS5nbG9iYWwgYW5kY2NyCithbmRjY3I6CisJYW5kY2NyICMyNTUKKwkuZ2xvYmFsIG9yY2NyCitvcmNjcjoKKwlvcmNjciAjMTI1CisJLmdsb2JhbCBzdGlsbQorc3RpbG06CisJc3RpbG0gIzk3CisJLmdsb2JhbCBhZGRzcAorYWRkc3A6CisJYWRkc3AgIy01MTIKKwkuZ2xvYmFsIGV4dHNiCitleHRzYjoKKwlleHRzYiByOQorCS5nbG9iYWwgZXh0dWIKK2V4dHViOgorCWV4dHViIHIxMAorCS5nbG9iYWwgZXh0c2gKK2V4dHNoOgorCWV4dHNoIHIxMQorCS5nbG9iYWwgZXh0dWgKK2V4dHVoOgorCWV4dHVoIHIxMgorCS5nbG9iYWwgZW50ZXIKK2VudGVyOgorCWVudGVyICMxMDIwCisJLmdsb2JhbCBsZWF2ZQorbGVhdmU6CisJbGVhdmUgCisJLmdsb2JhbCB4Y2hiCit4Y2hiOgorCXhjaGIgQHIxNCwgcjE1CisJLmdsb2JhbCBsZGlfMzIKK2xkaV8zMjoKKwlsZGk6MzIgIzB4MTIzNDU2NzgsIHIwCisJLmdsb2JhbCBjb3BvcAorY29wb3A6CisJY29wb3AgIzE1LCAjMSwgY3IzLCBjcjQKKwljb3BvcCAjMTUsICM0LCBjcjUsIGNyNgorCWNvcG9wICMxNSwgIzI1NSwgY3I3LCBjcjAKKwkuZ2xvYmFsIGNvcGxkCitjb3BsZDoKKwljb3BsZCAjMCwgIzAsIHI0LCBjcjAKKwkuZ2xvYmFsIGNvcHN0Citjb3BzdDoKKwljb3BzdCAjNywgIzIsIGNyMSwgcjUKKwkuZ2xvYmFsIGNvcHN2Citjb3BzdjoKKwljb3BzdiAjOCwgIzMsIGNyMiwgcjYKKwkuZ2xvYmFsIGxkbTAKK2xkbTA6CisJbGRtMCAocjAsIHIyLCByMywgcjcpCisJLmdsb2JhbCBsZG0xCitsZG0xOgorCWxkbTEgKHI4LCByMTEsIHIxNSkKKwkuZ2xvYmFsIHN0bTAKK3N0bTA6CisJc3RtMCAocjIsIHIzKQorCS5nbG9iYWwgc3RtMQorc3RtMToKKwlzdG0xIChyMTMsIHIxNCkKKwkuZ2xvYmFsIGNhbGwKK2NhbGw6CisJY2FsbCBmb290ZXh0CisJY2FsbCBAcjEwCisJLmdsb2JhbCBjYWxsX2QKK2NhbGxfZDoKKwljYWxsOkQgZm9vdGV4dAorCW5vcAorCWNhbGw6ZCBAcjEyCisJbm9wCisJLmdsb2JhbCBkbW92CitkbW92OgorCWRtb3YgQDB4ODgsIHIxMworCWRtb3YgcjEzLCBAMHg1NAorCWRtb3YgQDB4NDQsIEByMTMrCisJZG1vdiBAUjEzKywgQDB4MgorCWRtb3YgQDB4MmMsIEAtcjE1CisJZG1vdiBAcjE1KywgQDM4CisJLmdsb2JhbCBkbW92aAorZG1vdmg6CisJZG1vdmggQDB4ODgsIHIxMworCWRtb3ZoIHIxMywgQDB4NTIKKwlkbW92aCBAMHgzNCwgQHIxMyArCisJZG1vdmggQHIxMyssIEAweDUyCisJLmdsb2JhbCBkbW92YgorZG1vdmI6CisJZG1vdmIgQDB4OTEsIHIxMworCWRtb3ZiIHIxMywgQDB4NTMKKwlkbW92YiBANzEsIEByMTMrCisJZG1vdmIgQHIxMyssIEAweDAKKwkuZ2xvYmFsIGxkaV8yMAorbGRpXzIwOgorIAlsZGk6MjAgIzB4MDAwZmZmZmYsIHIxCitmaW5pc2g6CQorICAgICAgICBsZGk6MzIgIzB4ODAwMCxyMAorCW1vdiAgICByMCxzc3AKKyAgICAgICAgbGRpOjMyICMxLHIwCisJaW50ICAgICMxMAorCS5nbG9iYWwgaW50ZQoraW50ZToKKwlpbnRlCisJLmdsb2JhbCByZXRpCityZXRpOgorCXJldGkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvZnIzMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Mjg2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwCkBAIC0wLDAgKzEsNSBAQAorIyBGUjMwIHRlc3RjYXNlcworCitpZiBbaXN0YXJnZXQgZnIzMCotKi0qXSB7CisjICAgIHJ1bl9kdW1wX3Rlc3QgImhpZ2gtMSIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3ViLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyYjBkNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1Yi5zCkBAIC0wLDAgKzEsMTYgQEAKKwkudGV4dAoraDgzMDBfYWRkX3N1YjoKKwlhZGQuYiAjMTYscjFsCisJYWRkLmIgcjFoLHIxbAorCWFkZC53IHIxLHIyCisJYWRkcyAjMSxyNAorCWFkZHMgIzIscjUKKwlhZGR4IHIwbCxyMWwKKwlhZGR4ICMxNixyMmgKKwlzdWIuYiByMGwscjFsCisJc3ViLncgcjAscjEKKwlzdWJzICMxLHI0CisJc3VicyAjMixyNQorCXN1YnggcjBsLHIxbAorCXN1YnggIzE2LHIyaAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4ODVkMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YmgucwpAQCAtMCwwICsxLDI1IEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfYWRkX3N1YjoKKwlhZGQuYiAjMTYscjFsCisJYWRkLmIgcjFoLHIxbAorCWFkZC53ICMzMixyMQorCWFkZC53IHIxLHIyCisJYWRkLmwgIzY0LGVyMQorCWFkZC5sIGVyMSxlcjIKKwlhZGRzICMxLGVyNAorCWFkZHMgIzIsZXI1CisJYWRkcyAjNCxlcjYKKwlhZGR4IHIwbCxyMWwKKwlhZGR4ICMxNixyMmgKKwlzdWIuYiByMGwscjFsCisJc3ViLncgIzE2LHIxCisJc3ViLncgcjAscjEKKwlzdWIubCAjNjQsZXIxCisJc3ViLmwgZXIxLGVyMgorCXN1YnMgIzEsZXI0CisJc3VicyAjMixlcjUKKwlzdWJzICM0LGVyNgorCXN1YnggcjBsLHIxbAorCXN1YnggIzE2LHIyaAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiMzY5OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YnMucwpAQCAtMCwwICsxLDI1IEBACisJLmg4MzAwcworCS50ZXh0CitoODMwMHNfYWRkX3N1YjoKKwlhZGQuYiAjMTYscjFsCisJYWRkLmIgcjFoLHIxbAorCWFkZC53ICMzMixyMQorCWFkZC53IHIxLHIyCisJYWRkLmwgIzY0LGVyMQorCWFkZC5sIGVyMSxlcjIKKwlhZGRzICMxLGVyNAorCWFkZHMgIzIsZXI1CisJYWRkcyAjNCxlcjYKKwlhZGR4IHIwbCxyMWwKKwlhZGR4ICMxNixyMmgKKwlzdWIuYiByMGwscjFsCisJc3ViLncgIzE2LHIxCisJc3ViLncgcjAscjEKKwlzdWIubCAjNjQsZXIxCisJc3ViLmwgZXIxLGVyMgorCXN1YnMgIzEsZXI0CisJc3VicyAjMixlcjUKKwlzdWJzICM0LGVyNgorCXN1YnggcjBsLHIxbAorCXN1YnggIzE2LHIyaAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxMDdhMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczEucwpAQCAtMCwwICsxLDE4IEBACisJLnRleHQKK2g4MzAwX2JpdF9vcHNfMToKKwliYW5kICMwLHIwbAorCWJhbmQgIzAsQHIwCisJYmFuZCAjMCxANjQ6OAorCWJjbHIgIzAscjBsCisJYmNsciAjMCxAcjAKKwliY2xyICMwLEA2NDo4CisJYmNsciByMWwscjBsCisJYmNsciByMWwsQHIwCisJYmNsciByMWwsQDY0OjgKKwliaWFuZCAjMCxyMGwKKwliaWFuZCAjMCxAcjAKKwliaWFuZCAjMCxANjQ6OAorCWJpbGQgIzAscjBsCisJYmlsZCAjMCxAcjAKKwliaWxkICMwLEA2NDo4CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzlhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxaC5zCkBAIC0wLDAgKzEsMTkgQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9iaXRfb3BzXzE6CisJYmFuZCAjMCxyMGwKKwliYW5kICMwLEBlcjAKKwliYW5kICMwLEA2NDo4CisJYmNsciAjMCxyMGwKKwliY2xyICMwLEBlcjAKKwliY2xyICMwLEA2NDo4CisJYmNsciByMWwscjBsCisJYmNsciByMWwsQGVyMAorCWJjbHIgcjFsLEA2NDo4CisJYmlhbmQgIzAscjBsCisJYmlhbmQgIzAsQGVyMAorCWJpYW5kICMwLEA2NDo4CisJYmlsZCAjMCxyMGwKKwliaWxkICMwLEBlcjAKKwliaWxkICMwLEA2NDo4CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTk5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zCkBAIC0wLDAgKzEsMjkgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19iaXRfb3BzXzE6CisJYmFuZCAjMCxyMGwKKwliYW5kICMwLEBlcjAKKwliYW5kICMwLEA2NDo4CisJYmFuZCAjMCxAMTI4OjE2CisJYmFuZCAjMCxANjU1MzY6MzIKKwliY2xyICMwLHIwbAorCWJjbHIgIzAsQGVyMAorCWJjbHIgIzAsQDY0OjgKKwliY2xyICMwLEAxMjg6MTYKKwliY2xyICMwLEA2NTUzNjozMgorCWJjbHIgcjFsLHIwbAorCWJjbHIgcjFsLEBlcjAKKwliY2xyIHIxbCxANjQ6OAorCWJjbHIgcjFsLEAxMjg6MTYKKwliY2xyIHIxbCxANjU1MzY6MzIKKwliaWFuZCAjMCxyMGwKKwliaWFuZCAjMCxAZXIwCisJYmlhbmQgIzAsQDY0OjgKKwliaWFuZCAjMCxAMTI4OjE2CisJYmlhbmQgIzAsQDY1NTM2OjMyCisJYmlsZCAjMCxyMGwKKwliaWxkICMwLEBlcjAKKwliaWxkICMwLEA2NDo4CisJYmlsZCAjMCxAMTI4OjE2CisJYmlsZCAjMCxANjU1MzY6MzIKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyLnMKQEAgLTAsMCArMSwxNSBAQAorCS50ZXh0CitoODMwMF9iaXRfb3BzXzI6CisJYmlvciAjMCxyMGwKKwliaW9yICMwLEByMAorCWJpb3IgIzAsQDY0OjgKKwliaXN0ICMwLHIwbAorCWJpc3QgIzAsQHIwCisJYmlzdCAjMCxANjQ6OAorCWJpeG9yICMwLHIwbAorCWJpeG9yICMwLEByMAorCWJpeG9yICMwLEA2NDo4CisJYmxkICMwLHIwbAorCWJsZCAjMCxAcjAKKwlibGQgIzAsQDY0OjgKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMmgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiZTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJoLnMKQEAgLTAsMCArMSwxNiBAQAorCS5oODMwMGgKKwkudGV4dAoraDgzMDBoX2JpdF9vcHNfMjoKKwliaW9yICMwLHIwbAorCWJpb3IgIzAsQGVyMAorCWJpb3IgIzAsQDY0OjgKKwliaXN0ICMwLHIwbAorCWJpc3QgIzAsQGVyMAorCWJpc3QgIzAsQDY0OjgKKwliaXhvciAjMCxyMGwKKwliaXhvciAjMCxAZXIwCisJYml4b3IgIzAsQDY0OjgKKwlibGQgIzAscjBsCisJYmxkICMwLEBlcjAKKwlibGQgIzAsQDY0OjgKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3MDUyMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMKQEAgLTAsMCArMSwyMyBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX2JpdF9vcHNfMjoKKwliaW9yICMwLHIwbAorCWJpb3IgIzAsQGVyMAorCWJpb3IgIzAsQDY0OjgKKwliaW9yICMwLEAxMjg6MTYKKwliaW9yICMwLEA2NTUzNjozMgorCWJpc3QgIzAscjBsCisJYmlzdCAjMCxAZXIwCisJYmlzdCAjMCxANjQ6OAorCWJpc3QgIzAsQDEyODoxNgorCWJpc3QgIzAsQDY1NTM2OjMyCisJYml4b3IgIzAscjBsCisJYml4b3IgIzAsQGVyMAorCWJpeG9yICMwLEA2NDo4CisJYml4b3IgIzAsQDEyODoxNgorCWJpeG9yICMwLEA2NTUzNjozMgorCWJsZCAjMCxyMGwKKwlibGQgIzAsQGVyMAorCWJsZCAjMCxANjQ6OAorCWJsZCAjMCxAMTI4OjE2CisJYmxkICMwLEA2NTUzNjozMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzliZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzLnMKQEAgLTAsMCArMSwxNSBAQAorCS50ZXh0CitoODMwMF9iaXRfb3BzXzM6CisJYm5vdCAjMCxyMGwKKwlibm90ICMwLEByMAorCWJub3QgIzAsQDY0OjgKKwlibm90IHIxbCxyMGwKKwlibm90IHIxbCxAcjAKKwlibm90IHIxbCxANjQ6OAorCWJzZXQgIzAscjBsCisJYnNldCAjMCxAcjAKKwlic2V0ICMwLEA2NDo4CisJYnNldCByMWwscjBsCisJYnNldCByMWwsQHIwCisJYnNldCByMWwsQDY0OjgKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlZGE2MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNoLnMKQEAgLTAsMCArMSwxNiBAQAorCS5oODMwMGgKKwkudGV4dAoraDgzMDBoX2JpdF9vcHNfMzoKKwlibm90ICMwLHIwbAorCWJub3QgIzAsQGVyMAorCWJub3QgIzAsQDY0OjgKKwlibm90IHIxbCxyMGwKKwlibm90IHIxbCxAZXIwCisJYm5vdCByMWwsQDY0OjgKKwlic2V0ICMwLHIwbAorCWJzZXQgIzAsQGVyMAorCWJzZXQgIzAsQDY0OjgKKwlic2V0IHIxbCxyMGwKKwlic2V0IHIxbCxAZXIwCisJYnNldCByMWwsQDY0OjgKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2NGUwNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMKQEAgLTAsMCArMSwyNCBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX2JpdF9vcHNfMzoKKwlibm90ICMwLHIwbAorCWJub3QgIzAsQGVyMAorCWJub3QgIzAsQDY0OjgKKwlibm90ICMwLEAxMjg6MTYKKwlibm90ICMwLEA2NTUzNjozMgorCWJub3QgcjFsLHIwbAorCWJub3QgcjFsLEBlcjAKKwlibm90IHIxbCxANjQ6OAorCWJub3QgcjFsLEAxMjg6MTYKKwlibm90IHIxbCxANjU1MzY6MzIKKwlic2V0ICMwLHIwbAorCWJzZXQgIzAsQGVyMAorCWJzZXQgIzAsQDY0OjgKKwlic2V0ICMwLEAxMjg6MTYKKwlic2V0ICMwLEA2NTUzNjozMgorCWJzZXQgcjFsLHIwbAorCWJzZXQgcjFsLEBlcjAKKwlic2V0IHIxbCxANjQ6OAorCWJzZXQgcjFsLEAxMjg6MTYKKwlic2V0IHIxbCxANjU1MzY6MzIKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0LnMKQEAgLTAsMCArMSwxOCBAQAorCS50ZXh0CitoODMwMF9iaXRfb3BzXzQ6CisJYm9yICMwLHIwbAorCWJvciAjMCxAcjAKKwlib3IgIzAsQDY0OjgKKwlic3QgIzAscjBsCisJYnN0ICMwLEByMAorCWJzdCAjMCxANjQ6OAorCWJ0c3QgIzAscjBsCisJYnRzdCAjMCxAcjAKKwlidHN0ICMwLEA2NDo4CisJYnRzdCByMWwscjBsCisJYnRzdCByMWwsQHIwCisJYnRzdCByMWwsQDY0OjgKKwlieG9yICMwLHIwbAorCWJ4b3IgIzAsQHIwCisJYnhvciAjMCxANjQ6OAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0aC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM1ZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNGgucwpAQCAtMCwwICsxLDE5IEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfYml0X29wc180OgorCWJvciAjMCxyMGwKKwlib3IgIzAsQGVyMAorCWJvciAjMCxANjQ6OAorCWJzdCAjMCxyMGwKKwlic3QgIzAsQGVyMAorCWJzdCAjMCxANjQ6OAorCWJ0c3QgIzAscjBsCisJYnRzdCAjMCxAZXIwCisJYnRzdCAjMCxANjQ6OAorCWJ0c3QgcjFsLHIwbAorCWJ0c3QgcjFsLEBlcjAKKwlidHN0IHIxbCxANjQ6OAorCWJ4b3IgIzAscjBsCisJYnhvciAjMCxAZXIwCisJYnhvciAjMCxANjQ6OAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0cy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY0N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucwpAQCAtMCwwICsxLDI5IEBACisJLmg4MzAwcworCS50ZXh0CitoODMwMHNfYml0X29wc180OgorCWJvciAjMCxyMGwKKwlib3IgIzAsQGVyMAorCWJvciAjMCxANjQ6OAorCWJvciAjMCxAMTI4OjE2CisJYm9yICMwLEA2NTUzNjozMgorCWJzdCAjMCxyMGwKKwlic3QgIzAsQGVyMAorCWJzdCAjMCxANjQ6OAorCWJzdCAjMCxAMTI4OjE2CisJYnN0ICMwLEA2NTUzNjozMgorCWJ0c3QgIzAscjBsCisJYnRzdCAjMCxAZXIwCisJYnRzdCAjMCxANjQ6OAorCWJ0c3QgIzAsQDEyODoxNgorCWJ0c3QgIzAsQDY1NTM2OjMyCisJYnRzdCByMWwscjBsCisJYnRzdCByMWwsQGVyMAorCWJ0c3QgcjFsLEA2NDo4CisJYnRzdCByMWwsQDEyODoxNgorCWJ0c3QgcjFsLEA2NTUzNjozMgorCWJ4b3IgIzAscjBsCisJYnhvciAjMCxAZXIwCisJYnhvciAjMCxANjQ6OAorCWJ4b3IgIzAsQDEyODoxNgorCWJ4b3IgIzAsQDY1NTM2OjMyCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4MDYxNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaC5zCkBAIC0wLDAgKzEsMTAgQEAKKwkudGV4dAoraDgzMDBfYnJhbmNoZXM6CisJYnNyIGg4MzAwX2JyYW5jaGVzCisJam1wIGg4MzAwX2JyYW5jaGVzCisJam1wIEByMAorCWptcCBAQDE2OjgKKwlqc3IgaDgzMDBfYnJhbmNoZXMKKwlqc3IgQHIwCisJanNyIEBAMTY6OAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiYzYyZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaGgucwpAQCAtMCwwICsxLDEyIEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfYnJhbmNoZXM6CisJYnNyIGg4MzAwaF9icmFuY2hlczo4CisJYnNyIGg4MzAwaF9icmFuY2hlczoxNgorCWptcCBoODMwMGhfYnJhbmNoZXMKKwlqbXAgQGVyMAorCWptcCBAQDE2OjgKKwlqc3IgaDgzMDBoX2JyYW5jaGVzCisJanNyIEBlcjAKKwlqc3IgQEAxNjo4CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjMzZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYnJhbmNocy5zCkBAIC0wLDAgKzEsMTIgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19icmFuY2hlczoKKwlic3IgaDgzMDBzX2JyYW5jaGVzOjgKKwlic3IgaDgzMDBzX2JyYW5jaGVzOjE2CisJam1wIGg4MzAwc19icmFuY2hlcworCWptcCBAZXIwCisJam1wIEBAMTY6OAorCWpzciBoODMwMHNfYnJhbmNoZXMKKwlqc3IgQGVyMAorCWpzciBAQDE2OjgKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2Q1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoLnMKQEAgLTAsMCArMSwyMyBAQAorCS50ZXh0CitoODMwMF9jYnJhbmNoOgorCWJyYSBoODMwMF9jYnJhbmNoCisJYnQgaDgzMDBfY2JyYW5jaAorCWJybiBoODMwMF9jYnJhbmNoCisJYmYgaDgzMDBfY2JyYW5jaAorCWJoaSBoODMwMF9jYnJhbmNoCisJYmxzIGg4MzAwX2NicmFuY2gKKwliY2MgaDgzMDBfY2JyYW5jaAorCWJocyBoODMwMF9jYnJhbmNoCisJYmNzIGg4MzAwX2NicmFuY2gKKwlibG8gaDgzMDBfY2JyYW5jaAorCWJuZSBoODMwMF9jYnJhbmNoCisJYmVxIGg4MzAwX2NicmFuY2gKKwlidmMgaDgzMDBfY2JyYW5jaAorCWJ2cyBoODMwMF9jYnJhbmNoCisJYnBsIGg4MzAwX2NicmFuY2gKKwlibWkgaDgzMDBfY2JyYW5jaAorCWJnZSBoODMwMF9jYnJhbmNoCisJYmx0IGg4MzAwX2NicmFuY2gKKwliZ3QgaDgzMDBfY2JyYW5jaAorCWJsZSBoODMwMF9jYnJhbmNoCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGUxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoaC5zCkBAIC0wLDAgKzEsNDQgQEAKKwkudGV4dAorCS5oODMwMGgKK2g4MzAwaF9jYnJhbmNoOgorCWJyYSBoODMwMGhfY2JyYW5jaDo4CisJYnQgaDgzMDBoX2NicmFuY2g6OAorCWJybiBoODMwMGhfY2JyYW5jaDo4CisJYmYgaDgzMDBoX2NicmFuY2g6OAorCWJoaSBoODMwMGhfY2JyYW5jaDo4CisJYmxzIGg4MzAwaF9jYnJhbmNoOjgKKwliY2MgaDgzMDBoX2NicmFuY2g6OAorCWJocyBoODMwMGhfY2JyYW5jaDo4CisJYmNzIGg4MzAwaF9jYnJhbmNoOjgKKwlibG8gaDgzMDBoX2NicmFuY2g6OAorCWJuZSBoODMwMGhfY2JyYW5jaDo4CisJYmVxIGg4MzAwaF9jYnJhbmNoOjgKKwlidmMgaDgzMDBoX2NicmFuY2g6OAorCWJ2cyBoODMwMGhfY2JyYW5jaDo4CisJYnBsIGg4MzAwaF9jYnJhbmNoOjgKKwlibWkgaDgzMDBoX2NicmFuY2g6OAorCWJnZSBoODMwMGhfY2JyYW5jaDo4CisJYmx0IGg4MzAwaF9jYnJhbmNoOjgKKwliZ3QgaDgzMDBoX2NicmFuY2g6OAorCWJsZSBoODMwMGhfY2JyYW5jaDo4CisJYnJhIGg4MzAwaF9jYnJhbmNoOjE2CisJYnQgaDgzMDBoX2NicmFuY2g6MTYKKwlicm4gaDgzMDBoX2NicmFuY2g6MTYKKwliZiBoODMwMGhfY2JyYW5jaDoxNgorCWJoaSBoODMwMGhfY2JyYW5jaDoxNgorCWJscyBoODMwMGhfY2JyYW5jaDoxNgorCWJjYyBoODMwMGhfY2JyYW5jaDoxNgorCWJocyBoODMwMGhfY2JyYW5jaDoxNgorCWJjcyBoODMwMGhfY2JyYW5jaDoxNgorCWJsbyBoODMwMGhfY2JyYW5jaDoxNgorCWJuZSBoODMwMGhfY2JyYW5jaDoxNgorCWJlcSBoODMwMGhfY2JyYW5jaDoxNgorCWJ2YyBoODMwMGhfY2JyYW5jaDoxNgorCWJ2cyBoODMwMGhfY2JyYW5jaDoxNgorCWJwbCBoODMwMGhfY2JyYW5jaDoxNgorCWJtaSBoODMwMGhfY2JyYW5jaDoxNgorCWJnZSBoODMwMGhfY2JyYW5jaDoxNgorCWJsdCBoODMwMGhfY2JyYW5jaDoxNgorCWJndCBoODMwMGhfY2JyYW5jaDoxNgorCWJsZSBoODMwMGhfY2JyYW5jaDoxNgorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDIyMmVhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucwpAQCAtMCwwICsxLDQ0IEBACisJLnRleHQKKwkuaDgzMDBzCitoODMwMHNfY2JyYW5jaDoKKwlicmEgaDgzMDBzX2NicmFuY2g6OAorCWJ0IGg4MzAwc19jYnJhbmNoOjgKKwlicm4gaDgzMDBzX2NicmFuY2g6OAorCWJmIGg4MzAwc19jYnJhbmNoOjgKKwliaGkgaDgzMDBzX2NicmFuY2g6OAorCWJscyBoODMwMHNfY2JyYW5jaDo4CisJYmNjIGg4MzAwc19jYnJhbmNoOjgKKwliaHMgaDgzMDBzX2NicmFuY2g6OAorCWJjcyBoODMwMHNfY2JyYW5jaDo4CisJYmxvIGg4MzAwc19jYnJhbmNoOjgKKwlibmUgaDgzMDBzX2NicmFuY2g6OAorCWJlcSBoODMwMHNfY2JyYW5jaDo4CisJYnZjIGg4MzAwc19jYnJhbmNoOjgKKwlidnMgaDgzMDBzX2NicmFuY2g6OAorCWJwbCBoODMwMHNfY2JyYW5jaDo4CisJYm1pIGg4MzAwc19jYnJhbmNoOjgKKwliZ2UgaDgzMDBzX2NicmFuY2g6OAorCWJsdCBoODMwMHNfY2JyYW5jaDo4CisJYmd0IGg4MzAwc19jYnJhbmNoOjgKKwlibGUgaDgzMDBzX2NicmFuY2g6OAorCWJyYSBoODMwMHNfY2JyYW5jaDoxNgorCWJ0IGg4MzAwc19jYnJhbmNoOjE2CisJYnJuIGg4MzAwc19jYnJhbmNoOjE2CisJYmYgaDgzMDBzX2NicmFuY2g6MTYKKwliaGkgaDgzMDBzX2NicmFuY2g6MTYKKwlibHMgaDgzMDBzX2NicmFuY2g6MTYKKwliY2MgaDgzMDBzX2NicmFuY2g6MTYKKwliaHMgaDgzMDBzX2NicmFuY2g6MTYKKwliY3MgaDgzMDBzX2NicmFuY2g6MTYKKwlibG8gaDgzMDBzX2NicmFuY2g6MTYKKwlibmUgaDgzMDBzX2NicmFuY2g6MTYKKwliZXEgaDgzMDBzX2NicmFuY2g6MTYKKwlidmMgaDgzMDBzX2NicmFuY2g6MTYKKwlidnMgaDgzMDBzX2NicmFuY2g6MTYKKwlicGwgaDgzMDBzX2NicmFuY2g6MTYKKwlibWkgaDgzMDBzX2NicmFuY2g6MTYKKwliZ2UgaDgzMDBzX2NicmFuY2g6MTYKKwlibHQgaDgzMDBzX2NicmFuY2g6MTYKKwliZ3QgaDgzMDBzX2NicmFuY2g6MTYKKwlibGUgaDgzMDBzX2NicmFuY2g6MTYKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY21wc2kyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jbXBzaTIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdmMDNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY21wc2kyLnMKQEAgLTAsMCArMSwyOCBAQAorIyAxICJsaWJnY2MxLlMiCis7OyBsaWJnY2MxIHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaSBoOC8zMDAgY3B1LgorOzsgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4uCis7OyBzYWNAY3lnbnVzLmNvbQorCS5zZWN0aW9uIC50ZXh0CisJLmFsaWduIDIKKwkuZ2xvYmFsIF9fX2NtcHNpMgorX19fY21wc2kyOgorCWNtcC53CXIyICxyMCAKKwlibmUJLkwyCisJY21wLncJcjMgLHIxIAorCWJuZQkuTDIKKwltb3YudwkjMSxyMCAKKwlydHMKKy5MMjoKKwljbXAudwlyMCAscjIgCisJYmd0CS5MNAorCWJuZQkuTDMKKwljbXAudwlyMSAscjMgCisJYmxzCS5MMworLkw0OgorCXN1Yi53CXIwICxyMCAKKwlydHMKKy5MMzoKKwltb3YudwkjMixyMCAKKy5MNToKKwlydHMKKwkuZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmUucwpAQCAtMCwwICsxLDYgQEAKKwkudGV4dAoraDgzMDBfY21wOgorCWNtcC5iICMwLHIwbAorCWNtcC5iIHIwaCxyMGwKKwljbXAudyByMCxyMQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODFlODhlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucwpAQCAtMCwwICsxLDEwIEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfY21wOgorCWNtcC5iICMwLHIwbAorCWNtcC5iIHIwaCxyMGwKKwljbXAudyAjMzIscjAKKwljbXAudyByMCxyMQorCWNtcC5sICM2NCxlcjAKKwljbXAubCBlcjAsZXIxCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmVzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyM2YzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlcy5zCkBAIC0wLDAgKzEsMTAgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19jbXA6CisJY21wLmIgIzAscjBsCisJY21wLmIgcjBoLHIwbAorCWNtcC53ICMzMixyMAorCWNtcC53IHIwLHIxCisJY21wLmwgIzY0LGVyMAorCWNtcC5sIGVyMCxlcjEKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNGMwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsLnMKQEAgLTAsMCArMSw1IEBACisJLnRleHQKK2g4MzAwX2RlY2ltYWw6CisJZGFhIHIwbAorCWRhcyByMGwKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MjQwNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMKQEAgLTAsMCArMSw2IEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfZGVjaW1hbDoKKwlkYWEgcjBsCisJZGFzIHIwbAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzgwMmZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbHMucwpAQCAtMCwwICsxLDYgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19kZWNpbWFsOgorCWRhYSByMGwKKwlkYXMgcjBsCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNzJjZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bC5zCkBAIC0wLDAgKzEsNSBAQAorCS50ZXh0CitoODMwMF9kaXZfbXVsOgorCWRpdnh1IHIwbCxyMQorCW11bHh1IHIwbCxyMQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2MGY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bGgucwpAQCAtMCwwICsxLDEyIEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfZGl2X211bDoKKwlkaXZ4dS5iIHIwbCxyMQorCWRpdnh1LncgcjAsZXIxCisJZGl2eHMuYiByMGwscjEKKwlkaXZ4cy53IHIwLGVyMQorCW11bHh1LmIgcjBsLHIxCisJbXVseHUudyByMCxlcjEKKwltdWx4cy5iIHIwbCxyMQorCW11bHhzLncgcjAsZXIxCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2Rpdm11bHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjYwZjhmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVscy5zCkBAIC0wLDAgKzEsMTIgQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9kaXZfbXVsOgorCWRpdnh1LmIgcjBsLHIxCisJZGl2eHUudyByMCxlcjEKKwlkaXZ4cy5iIHIwbCxyMQorCWRpdnhzLncgcjAsZXIxCisJbXVseHUuYiByMGwscjEKKwltdWx4dS53IHIwLGVyMQorCW11bHhzLmIgcjBsLHIxCisJbXVseHMudyByMCxlcjEKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzRjODMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRoLnMKQEAgLTAsMCArMSw4IEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfZXh0ZW5kOgorCWV4dHMudyByMAorCWV4dHMubCBlcjAKKwlleHR1LncgcjAKKwlleHR1LmwgZXIwCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZlOWJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kcy5zCkBAIC0wLDAgKzEsOCBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX2V4dGVuZDoKKwlleHRzLncgcjAKKwlleHRzLmwgZXIwCisJZXh0dS53IHIwCisJZXh0dS5sIGVyMAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ1NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEuZApAQCAtMCwwICsxLDIzIEBACisjb2JqZHVtcDogLS1wcmVmaXgtYWRkcmVzc2VzIC1kcgorI25hbWU6IEZGeHgxCisKKyMgVGVzdCBmb3IgRkZ4eDo4IGFkZHJlc3NpbmcuCisKKy4qOiAgICAgZmlsZSBmb3JtYXQgLipoODMwMC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisJLi4uCisJCQkwOiAxNgltYWluCiswKzA0MDAgPG1haW4+IGY4IDdmICAgICAgICAgICAgIG1vdi5iCSMweDdmLHIwbAorMCswNDAyIDxtYWluWytdKDB4fCkyPiAyOCBiYiAgICAgICAgICAgICBtb3YuYglAMHhiYjo4LHIwbAorMCswNDA0IDxtYWluWytdKDB4fCk0PiA2YSA4OCBmZiBiOSAgICAgICBtb3YuYglyMGwsQDB4ZmZiOToxNgorMCswNDA4IDxtYWluWytdKDB4fCk4PiBmOCAwMSAgICAgICAgICAgICBtb3YuYgkjMHgxLHIwbAorMCswNDBhIDxsb29wPiA2YSA4OCBmZiBiYiAgICAgICBtb3YuYglyMGwsQDB4ZmZiYjoxNgorMCswNDBlIDxkZWxheT4gNzkgMDEgMDAgMDAgICAgICAgbW92LncJIzB4MCxyMQorMCswNDEyIDxkZWxvb3A+IDBiIDAxICAgICAgICAgICAgIGFkZHMJIzB4MSxlcjEKKzArMDQxNCA8ZGVsb29wWytdKDB4fCkyPiA0NiAwMCAgICAgICAgICAgICBibmUJLjAgXCg0MTZcKQorCQkJNDE1OiBESVNQOAlkZWxvb3BbK10weGZmZmZmZmZmCiswKzA0MTYgPGRlbG9vcFsrXSgweHwpND4gMTIgODggICAgICAgICAgICAgcm90bAlyMGwKKzArMDQxOCA8ZGVsb29wWytdKDB4fCk2PiA0MCAwMCAgICAgICAgICAgICBicmEJLjAgXCg0MWFcKQorCQkJNDE5OiBESVNQOAlsb29wWytdMHhmZmZmZmZmZgorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmYzg0MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLnMKQEAgLTAsMCArMSwyMCBAQAorCS5lcXUgICAgcDZkZHIsICAweGZmYjkgICAgICAgICAgOzB4N2YgZm9yIG91dHB1dCAKKwkuZXF1ICAgIHA2ZHIsICAgIDB4ZmZiYgorCS5lcXUgICAgc2VlZCwgICAgMHgwMQorCS50ZXh0CisJLm9yZyAgICAwCityZXNldDogIC53b3JkICAgbWFpbiAgICAgICAgICAgIDtyZXNldCB2ZWN0b3IgCis7CisJLm9yZyAgICAweDQwMAorbWFpbjogICBtb3YuYiAgICMweDdmLHIwbCAgICAgICA7cG9ydCA2IGRkciA9IDdGIAorCW1vdi5iICAgQDB4ZmZiYjo4LHIwbCAgIDsqKip0ZXN0KioqCisJbW92LmIgICByMGwsQHA2ZGRyOjE2Cis7CisJbW92LmIgICAjc2VlZCxyMGwgICAgICAgO3N0YXJ0IHdpdGggMDAwMDAwMQorbG9vcDogICBtb3YuYiAgIHIwbCxAcDZkcjoxNiAgICA7b3V0cHV0IHRvIHBvcnQgNiAKK2RlbGF5OiAgbW92LncgICAjMHgwMDAwLHIxCitkZWxvb3A6IGFkZHMudyAgIzEscjEKKwlibmUgICAgIGRlbG9vcDo4ICAgICAgICA7bm90ID0gMAorCXJvdGwgICAgcjBsCisgICAgICAgIGJyYSAgICAgbG9vcDo4CisJLndvcmQJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaDgzMDAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaDgzMDAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2Q0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9oODMwMC5leHAKQEAgLTAsMCArMSwyMTgzIEBACisjCisjIFNvbWUgSDgvMzAwIHRlc3RzCisjCitwcm9jIGRvX2g4MzAwX2FkZF9zdWIge30geworICAgIHNldCB0ZXN0bmFtZSAiYWRkc3ViLnM6IGg4MzAwIGFkZC9zdWIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJhZGRzdWIucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDBCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMTkwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMUU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IEIyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMF9sb2dpY2FsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogaDgzMDAgbG9naWNhbCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBfY2JyYW5jaCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjYnJhbmNoLnM6IGg4MzAwIGNvbmRpdGlvbmFsIGJyYW5jaCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImNicmFuY2gucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBfYml0b3BzMSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxLnM6IGg4MzAwIGJpdG9wcyB0ZXN0cyAjMSIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImJpdG9wczEucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2Mjk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMF9iaXRvcHMyIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczIuczogaDgzMDAgYml0b3BzIHRlc3RzICMyIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0b3BzMi5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMF9iaXRvcHMzIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczMuczogaDgzMDAgYml0b3BzIHRlc3RzICMzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0b3BzMy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdEMDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0Y0MDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2MTk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjA5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdEMDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0Y0MDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMF9iaXRvcHM0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczQuczogaDgzMDAgYml0b3BzIHRlc3RzICM0IgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0b3BzNC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDczMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3NTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwX2JyYW5jaCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogaDgzMDAgYnJhbmNoIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUEwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNUIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDVFMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDVGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSA3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwX2NvbXBhcmUge30geworICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZS5zOiBoODMwMCBjb21wYXJlIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiY29tcGFyZS5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMF9kZWNpbWFsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImRlY2ltYWwuczogaDgzMDAgZGVjaW1hbCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImRlY2ltYWwucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBfaW5jZGVjIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImluY2RlYy5zOiBoODMwMCBpbmNkZWMgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJpbmNkZWMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBfZGl2bXVsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImRpdm11bC5zOiBoODMwMCBkaXZtdWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJkaXZtdWwucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDUxODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBfbWlzYyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtaXNjLnM6IGg4MzAwIG1pc2MgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDA3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU2NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1NDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMDE4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKworICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgorICAgIGZhaWwgImg4MzAwIG1vdmZwZS9tb3Z0cGUgdGVzdHMiCit9CisKK3Byb2MgZG9faDgzMDBfbW92YiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3ZiLnM6IGg4MzAwIG1vdmIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3ZiLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZDMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAyODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNkEwODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2Qzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDZBODgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwX21vdncge30geworICAgIHNldCB0ZXN0bmFtZSAibW92dy5zOiBoODMwMCBtb3Z3IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92dy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwX3B1c2hwb3Age30geworICAgIHNldCB0ZXN0bmFtZSAicHVzaHBvcC5zOiBoODMwMCBwdXNocG9wIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAicHVzaHBvcC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMF9yb3RhdGVfc2hpZnQge30geworICAgIHNldCB0ZXN0bmFtZSAicm90c2guczogaDgzMDAgcm90YXRlIGFuZCBzaGlmdCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgInJvdHNoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTM4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTA4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDExODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9hZGRfc3ViIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImFkZHN1YmguczogaDgzMDBoIGFkZC9zdWIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJhZGRzdWJoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA4OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDgxOVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDBCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzkzMTAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiAxOTAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0EzMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDFBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMUI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDFCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAxRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgQjIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDIxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9sb2dpY2FsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWxoLnM6IGg4MzAwaCBsb2dpY2FsIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibG9naWNhbGgucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzk2MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0E2MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxRjA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IEM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxNDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNzk0MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0E0MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxRjA2NDExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzk1MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0E1MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxRjA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDE3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCAxNzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMTdCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDE3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSAxNzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMTczMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDI3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9jYnJhbmNoIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImNicmFuY2hoLnM6IGg4MzAwaCBjb25kaXRpb25hbCBicmFuY2ggdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJjYnJhbmNoaC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDQyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA0MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDQ2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA0NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNDgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDQ5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA0QTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNEIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDRDMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA0RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgNEUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDRGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDU4MjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgNTgzMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDU4NjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgNTg3MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA1ODgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDVjIDU4OTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNThBMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCA1OEIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDU4QzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNmMgNThEMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA1OEUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDc0IDU4RjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gNDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9Citwcm9jIGRvX2g4MzAwaF9iaXRvcHMxIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczFoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzEiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiaXRvcHMxaC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3MjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzY4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9iaXRvcHMyIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczJoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzIiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiaXRvcHMyaC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDc1ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMGhfYml0b3BzMyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzaC5zOiBoODMwMGggYml0b3BzIHRlc3RzICMzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0b3BzM2gucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjE5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX2JpdG9wczQge30geworICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzNGguczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjNCIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImJpdG9wczRoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDY3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2Mzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc1MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX2JyYW5jaCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJicmFuY2hoLnM6IGg4MzAwaCBicmFuY2ggdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJicmFuY2hoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUMwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX2NvbXBhcmUge30geworICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZWguczogaDgzMDBoIGNvbXBhcmUgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJjb21wYXJlaC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTIwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMUY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX2RlY2ltYWwge30geworICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbGguczogaDgzMDBoIGRlY2ltYWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJkZWNpbWFsaC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMGhfaW5jZGVjIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImluY2RlY2guczogaDgzMDBoIGluY2RlYyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImluY2RlY2gucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDFCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDBCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX2Rpdm11bCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJkaXZtdWxoLnM6IGg4MzAwaCBkaXZtdWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJkaXZtdWxoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxRDA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDFEMDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxQzA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDFDMDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMGhfbWlzYyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtaXNjaC5zOiBoODMwMGggbWlzYyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1pc2NoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDdCRDQ1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTQwNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxNDA2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDE0MDZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAwMTQwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDE0MDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxNDA2OTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgMDE0MDZGODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDAxNDA3ODAwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAwMTQwNkQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDAxNDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YSAwMTQwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAyMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKworICAgIHNldHVwX3hmYWlsICJoODMwMCotKi0qIgorICAgIGZhaWwgImg4MzAwaCBtb3ZmcGUvbW92dHBlIHRlc3RzIgorfQorCitwcm9jIGRvX2g4MzAwaF9tb3ZiIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdmJoLnM6IGg4MzAwaCBtb3ZiIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92YmgucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBDODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiBGODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNjgxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZFMTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzgxMDZBMjhcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA2QzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZBMDgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkEyODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY4OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RTk4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QUE4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA2QTg4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDZBQTgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX21vdncge30geworICAgIHNldCB0ZXN0bmFtZSAibW92d2guczogaDgzMDBoIG1vdncgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3Z3aC5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDc5MDAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNjkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDZGMTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNzgxMDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkIwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjk5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZGOTAwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNkI4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCA2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9tb3ZsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdmxoLnM6IGg4MzAwaCBtb3ZsIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92bGgucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QTAwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTAwNkYxMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDEwMDc4MTBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxMDA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDEwMDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxMDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDEwMDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMTAwNkY5MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDEwMDc4OTBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxMDA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDEwMDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxMDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9wdXNocG9wIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3BoLnM6IGg4MzAwaCBwdXNocG9wIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAicHVzaHBvcGgucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMTAwNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9yb3RhdGVfc2hpZnQge30geworICAgIHNldCB0ZXN0bmFtZSAicm90c2hoLnM6IGg4MzAwaCByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAicm90c2hoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDEzQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDEyMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTMxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDEzMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMTA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDEwQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMTE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDExQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMTAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDEwMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMTExMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDExMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBoX2V4dGVuZCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJleHRlbmRoLnM6IGg4MzAwaCBleHRlbmQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJleHRlbmRoLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxN0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTdGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDE3NTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxNzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2FkZF9zdWIge30geworICAgIHNldCB0ZXN0bmFtZSAiYWRkc3Vicy5zOiBoODMwMHMgYWRkL3N1YiB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImFkZHN1YnMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDg5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwODE5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkxMTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwOTEyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0ExMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMEI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDBCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAwRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgOTIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDE4ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3OTMxMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDE5MDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3QTMxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMUE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDFCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMUI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDFFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCBCMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMjFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2xvZ2ljYWwge30geworICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbHMuczogaDgzMDBzIGxvZ2ljYWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJsb2dpY2Fscy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgRTkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE2OTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTYxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTYxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDFGMDY2MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMDE0MTA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSBDODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTQ5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc5NDEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdBNDEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMUYwNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDA0MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAwMTQxMDQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgRDgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDE1ODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA3OTUxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzZSA3QTUxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMDFGMDY1MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMDE0MTA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSAxNzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMTc5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDE3QjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMTcxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDE3MzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAzMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMHNfY2JyYW5jaCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjYnJhbmNocy5zOiBoODMwMHMgY29uZGl0aW9uYWwgYnJhbmNoIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiY2JyYW5jaHMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA1ODIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDU4MzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCA1ODYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDU4NzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNTg4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YyA1ODkwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDU4QTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNjQgNThCMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA2OCA1OEMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDZjIDU4RDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNThFMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCA1OEYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDQwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorcHJvYyBkb19oODMwMHNfYml0b3BzMSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxcy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMxIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0b3BzMXMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzYwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc2MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDcyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzIwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcyMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDYyOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3RDAwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdGNDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjI5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYyOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzY4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc2ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDc3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MiA3QzAwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDY2IDdFNDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNmEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDI1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwc19iaXRvcHMyIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczJzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzIiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiaXRvcHMycy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQ4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NDgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzQ4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKworCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3NTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0MwMDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RTQwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc1ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NTgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA3NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0MwMDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RTQwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAyMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMHNfYml0b3BzMyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzcy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0b3BzM3MucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzEwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcxMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDYxOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjE5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYxOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDcwMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3RDAwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdGNDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzAwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDcwMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjA5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYwOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwc19iaXRvcHM0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdG9wczRzLnM6IGg4MzAwcyBiaXRvcHMgdGVzdHMgIzQiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiaXRvcHM0cy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzQwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNjcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdEMDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgN0Y0MDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2QTE4MDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA2QTM4MDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdDMDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0U0MDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3MzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzMwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs2MzkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNjM5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNzUwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDdDMDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgN0U0MDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA3MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzUwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMjVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2JyYW5jaCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJicmFuY2hzLnM6IGg4MzAwcyBicmFuY2ggdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJicmFuY2hzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNUMwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA1QTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDU5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNUUwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA1RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNUYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2NvbXBhcmUge30geworICAgIHNldCB0ZXN0bmFtZSAiY29tcGFyZXMuczogaDgzMDBzIGNvbXBhcmUgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJjb21wYXJlcy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgQTgwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFDMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTIwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDFEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMUY4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2RlY2ltYWwge30geworICAgIHNldCB0ZXN0bmFtZSAiZGVjaW1hbHMuczogaDgzMDBzIGRlY2ltYWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJkZWNpbWFscy5zIiAiLWFsIgorCisgICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKKyAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDFGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMHNfaW5jZGVjIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImluY2RlY3MuczogaDgzMDBzIGluY2RlYyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImluY2RlY3MucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDFBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDFCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDBCNTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSAwQkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEI3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2Rpdm11bCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJkaXZtdWxzLnM6IGg4MzAwcyBkaXZtdWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJkaXZtdWxzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTMwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxRDA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDFEMDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNTIwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxQzA1MDgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDFDMDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19oODMwMHNfbWlzYyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtaXNjcy5zOiBoODMwMHMgbWlzYyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1pc2NzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3QjVDNTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDdCRDQ1OThGXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAzMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTQxMDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAzMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwMTQwNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDAxNDA2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMDE0MDZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAwMTQwNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMDE0MDZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCAwMTQxNjkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDAxNDE2RjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAwMTQxNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QjIwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgMDE0MTZEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCAwMTQxNkIwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMDE0MTZCMjBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1ZSAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNjAgNTY3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDYyIDU0NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NCAwMTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNjYgMDIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDY4IDAyMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YSAwMTQwNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDZlIDAxNDA2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwN2UgMDE0MDZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA4MiAwMTQwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwODggMDE0MDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA5MCAwMTQxNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDk0IDAxNDE2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA5YSAwMTQxNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwYTQgMDE0MTZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDBhOCAwMTQxNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwYWUgMDE0MTZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gMzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisKKyAgICBzZXR1cF94ZmFpbCAiaDgzMDAqLSotKiIKKyAgICBmYWlsICJoODMwMHMgbW92ZnBlL21vdnRwZSB0ZXN0cyIKK30KKworcHJvYyBkb19oODMwMHNfbW92YiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3Zicy5zOiBoODMwMHMgbW92YiB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdmJzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDc4MTA2QTI4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNkMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDI4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QTA4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZBMjgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkFBOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZDOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAzODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgNkE4ODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA2QUE4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwc19tb3Z3IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdndzLnM6IGg4MzAwcyBtb3Z3IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92d3MucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3OTAwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2RjEwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDc4MTA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RjkwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworCitwcm9jIGRvX2g4MzAwc19tb3ZsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdmxzLnM6IGg4MzAwcyBtb3ZsIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92bHMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QTAwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTAwNkYxMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDEwMDc4MTBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDAxMDA2RDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMDEwMDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxMDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMDEwMDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAwMTAwNkY5MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDEwMDc4OTBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQyIDAxMDA2RDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDYgMDEwMDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxMDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwc19wdXNocG9wIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3BzLnM6IGg4MzAwcyBwdXNocG9wIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAicHVzaHBvcHMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAwMTAwNkQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTAwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwc19yb3RhdGVfc2hpZnQge30geworICAgIHNldCB0ZXN0bmFtZSAicm90c2hzLnM6IGg4MzAwcyByb3RhdGUgYW5kIHNoaWZ0IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAicm90c2hzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxMjg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTJDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDEyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxMkQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTJCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDEyRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAxMzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTNDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDEzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxM0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTNCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDEzRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgMTI0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDEyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSAxMjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgMTIzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDEyNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCAxMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgMTM0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDEzMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxMzUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMTMzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDEzNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAxMDg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMTBDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDEwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiAxMEQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMTBCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDEwRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwM2UgMTFDOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDExOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAxMUQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMTFCMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDExRjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAxMDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMTA0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDEwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSAxMDUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMTAzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDEwNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAxMTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNTYgMTE0OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDExMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YSAxMTUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwNWMgMTEzMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDVlIDExNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHggPT0gNDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX2V4dGVuZCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJleHRlbmRzLnM6IGg4MzAwcyBleHRlbmQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJleHRlbmRzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxN0QwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTdGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDE3NTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxNzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX21hYyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtYWNzLnM6IGg4MzAwcyBtYWMgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtYWNzLnMiICItYWwiCisKKyAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAorICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwMUEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDMyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAzMzFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwMTYwNkQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDAyMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMjMxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4ID09IDZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faDgzMDBzX211bHRpcGxlIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm11bHRpcGxlcy5zOiBoODMwMHMgbXVsdGlwbGUgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtdWx0aXBsZXMucyIgIi1hbCIKKworICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290CisgICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDAxMTA2RDcxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMDEyMDZENzJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAwMTMwNkQ3M1xbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDAxMTA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMDEyMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwMTMwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2g4MzAwaF9tb3YzMmJ1ZyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3YzMmJ1Zy5zOiBoODMwMGggbW92MzJidWcgdGVzdCIKKyAgICBzZXQgeCAwCisKKyAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJtb3YzMmJ1Zy5zIiAiIiAiUHJvcGVyIHJlbG9jYXRpb24gZm9yIG1vdi5sIChwYXJ0IDEpIl0gdGhlbiB7CisgICAgICAgIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgorCisJd2hpbGUgMSB7CisJICAgIGV4cGVjdCB7CisJCS1yZSAiMDAwMDAwMDJcW15cblxdKjMyXFteXG5cXSpfYS4weDAqODhjYTZjMDBcW15cblxdKlxuIgorCQkJCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJCXRpbWVvdXQgCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQorCQllb2YJCQkJeyBicmVhayB9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgb2JqZHVtcF9maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeCA9PSAxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitpZiBbaXN0YXJnZXQgaDgzMDAqLSotKl0gdGhlbiB7CisgICAgIyBUZXN0IHRoZSBiYXNpYyBoODMwMCBpbnN0cnVjdGlvbiBwYXJzZXIKKyAgICBkb19oODMwMF9hZGRfc3ViCisgICAgZG9faDgzMDBfbG9naWNhbAorICAgIGRvX2g4MzAwX2NicmFuY2gKKyAgICBkb19oODMwMF9iaXRvcHMxCisgICAgZG9faDgzMDBfYml0b3BzMgorICAgIGRvX2g4MzAwX2JpdG9wczMKKyAgICBkb19oODMwMF9iaXRvcHM0CisgICAgZG9faDgzMDBfYnJhbmNoCisgICAgZG9faDgzMDBfY29tcGFyZQorICAgIGRvX2g4MzAwX2RlY2ltYWwKKyAgICBkb19oODMwMF9pbmNkZWMKKyAgICBkb19oODMwMF9kaXZtdWwKKyAgICBkb19oODMwMF9taXNjCisgICAgZG9faDgzMDBfbW92YgorICAgIGRvX2g4MzAwX21vdncKKyAgICBkb19oODMwMF9wdXNocG9wCisgICAgZG9faDgzMDBfcm90YXRlX3NoaWZ0CisKKyAgICAjIE5vdyB0ZXN0IHRoZSBoODMwMGggaW5zdHJ1Y3Rpb24gcGFyc2VyCisgICAgZG9faDgzMDBoX2FkZF9zdWIKKyAgICBkb19oODMwMGhfbG9naWNhbAorICAgIGRvX2g4MzAwaF9jYnJhbmNoCisgICAgZG9faDgzMDBoX2JpdG9wczEKKyAgICBkb19oODMwMGhfYml0b3BzMgorICAgIGRvX2g4MzAwaF9iaXRvcHMzCisgICAgZG9faDgzMDBoX2JpdG9wczQKKyAgICBkb19oODMwMGhfYnJhbmNoCisgICAgZG9faDgzMDBoX2NvbXBhcmUKKyAgICBkb19oODMwMGhfZGVjaW1hbAorICAgIGRvX2g4MzAwaF9pbmNkZWMKKyAgICBkb19oODMwMGhfZGl2bXVsCisgICAgZG9faDgzMDBoX21pc2MKKyAgICBkb19oODMwMGhfbW92YgorICAgIGRvX2g4MzAwaF9tb3Z3CisgICAgZG9faDgzMDBoX21vdmwKKyAgICBkb19oODMwMF9wdXNocG9wCisgICAgZG9faDgzMDBoX3JvdGF0ZV9zaGlmdAorICAgIGRvX2g4MzAwaF9leHRlbmQKKworICAgICMgTm93IHRlc3QgdGhlIGg4MzAwcyBpbnN0cnVjdGlvbiBwYXJzZXIKKyAgICBkb19oODMwMHNfYWRkX3N1YgorICAgIGRvX2g4MzAwc19sb2dpY2FsCisgICAgZG9faDgzMDBzX2NicmFuY2gKKyAgICBkb19oODMwMHNfYml0b3BzMQorICAgIGRvX2g4MzAwc19iaXRvcHMyCisgICAgZG9faDgzMDBzX2JpdG9wczMKKyAgICBkb19oODMwMHNfYml0b3BzNAorICAgIGRvX2g4MzAwc19icmFuY2gKKyAgICBkb19oODMwMHNfY29tcGFyZQorICAgIGRvX2g4MzAwc19kZWNpbWFsCisgICAgZG9faDgzMDBzX2luY2RlYworICAgIGRvX2g4MzAwc19kaXZtdWwKKyAgICBkb19oODMwMHNfbWlzYworICAgIGRvX2g4MzAwc19tb3ZiCisgICAgZG9faDgzMDBzX21vdncKKyAgICBkb19oODMwMHNfbW92bAorICAgIGRvX2g4MzAwX3B1c2hwb3AKKyAgICBkb19oODMwMHNfcm90YXRlX3NoaWZ0CisgICAgZG9faDgzMDBzX2V4dGVuZAorICAgIGRvX2g4MzAwc19tYWMKKyAgICBkb19oODMwMHNfbXVsdGlwbGUKKworICAgIGRvX2g4MzAwaF9tb3YzMmJ1ZworCisgICAgIyBOb3cgc29tZSByYW5kb20gdGVzdHMKKyAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSBdCisgICAgc2V0IGVtcGljIFtleHByIFtpc3RhcmdldCAqLSotZWNvZmYqXSB8fCBbaXN0YXJnZXQgKi0qLXVsdHJpeCpdIHx8IFtpc3RhcmdldCAqLSotaXJpeFxbMS00XF0qXSBdCisgICAgc2V0IGFvdXQgW2V4cHIgW2lzdGFyZ2V0ICotKi1ic2QqXSB8fCBbaXN0YXJnZXQgKi0qLW5ldGJzZCpdXQorCisgICAgcnVuX2R1bXBfdGVzdCAiZmZ4eDEiCisgICAgZ2FzX3Rlc3QgImNtcHNpMi5zIiAiIiAiIiAiY21wc2kyLnMiCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlYy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTg4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucwpAQCAtMCwwICsxLDUgQEAKKwkudGV4dAoraDgzMDBfaW5jZGVjOgorCWRlYyByMGwKKwlpbmMgcjBsCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjkzZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zCkBAIC0wLDAgKzEsMTQgQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9pbmNkZWM6CisJZGVjLmIgcjBsCisJZGVjLncgIzEscjAKKwlkZWMudyAjMixyMAorCWRlYy5sICMxLGVyMAorCWRlYy5sICMyLGVyMAorCWluYy5iIHIwbAorCWluYy53ICMxLHIwCisJaW5jLncgIzIscjAKKwlpbmMubCAjMSxlcjAKKwlpbmMubCAjMixlcjAKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDU3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWNzLnMKQEAgLTAsMCArMSwxNCBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX2luY2RlYzoKKwlkZWMuYiByMGwKKwlkZWMudyAjMSxyMAorCWRlYy53ICMyLHIwCisJZGVjLmwgIzEsZXIwCisJZGVjLmwgIzIsZXIwCisJaW5jLmIgcjBsCisJaW5jLncgIzEscjAKKwlpbmMudyAjMixyMAorCWluYy5sICMxLGVyMAorCWluYy5sICMyLGVyMAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3ZTNiNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucwpAQCAtMCwwICsxLDE0IEBACisJLnRleHQKK2g4MzAwX2xvZ2ljYWw6CisJYW5kICMxNixyMWwKKwlhbmQgcjFsLHIxaAorCWFuZGMgIzE2LGNjcgorCW9yICMxNixyMGwKKwlvciByMWwscjBsCisJb3JjICMxNixjY3IKKwl4b3IgIzE2LHIwbAorCXhvciByMGwscjFsCisJeG9yYyAjMTYsY2NyCisJbmVnIHIwbAorCW5vdCByMGwKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5NWYxMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxoLnMKQEAgLTAsMCArMSwzMSBAQAorCS5oODMwMGgKKwkudGV4dAoraDgzMDBoX2xvZ2ljYWw6CisJYW5kLmIgIzE2LHIxbAorCWFuZC5iIHIxbCxyMWgKKwlhbmQudyAjMzIscjEKKwlhbmQudyByMSxyMQorCWFuZC5sICM2NCxlcjEKKwlhbmQubCBlcjEsZXIxCisJYW5kYyAjMTYsY2NyCisJb3IuYiAjMTYscjBsCisJb3IuYiByMWwscjBsCisJb3IudyAjMzIscjEKKwlvci53IHIxLHIxCisJb3IubCAjNjQsZXIxCisJb3IubCBlcjEsZXIxCisJb3JjICMxNixjY3IKKwl4b3IuYiAjMTYscjBsCisJeG9yLmIgcjBsLHIxbAorCXhvci53ICMzMixyMQorCXhvci53IHIxLHIxCisJeG9yLmwgIzY0LGVyMQorCXhvci5sIGVyMSxlcjEKKwl4b3JjICMxNixjY3IKKwluZWcuYiByMGwKKwluZWcudyByMAorCW5lZy5sIGVyMAorCW5vdC5iIHIwbAorCW5vdC53IHIwCisJbm90LmwgZXIwCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzRjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zCkBAIC0wLDAgKzEsMzQgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19sb2dpY2FsOgorCWFuZC5iICMxNixyMWwKKwlhbmQuYiByMWwscjFoCisJYW5kLncgIzMyLHIxCisJYW5kLncgcjEscjEKKwlhbmQubCAjNjQsZXIxCisJYW5kLmwgZXIxLGVyMQorCWFuZGMgIzE2LGNjcgorCWFuZGMgIzE2LGV4cgorCW9yLmIgIzE2LHIwbAorCW9yLmIgcjFsLHIwbAorCW9yLncgIzMyLHIxCisJb3IudyByMSxyMQorCW9yLmwgIzY0LGVyMQorCW9yLmwgZXIxLGVyMQorCW9yYyAjMTYsY2NyCisJb3JjICMxNixleHIKKwl4b3IuYiAjMTYscjBsCisJeG9yLmIgcjBsLHIxbAorCXhvci53ICMzMixyMQorCXhvci53IHIxLHIxCisJeG9yLmwgIzY0LGVyMQorCXhvci5sIGVyMSxlcjEKKwl4b3JjICMxNixjY3IKKwl4b3JjICMxNixleHIKKwluZWcuYiByMGwKKwluZWcudyByMAorCW5lZy5sIGVyMAorCW5vdC5iIHIwbAorCW5vdC53IHIwCisJbm90LmwgZXIwCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21hY3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRmNmRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zCkBAIC0wLDAgKzEsMTEgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19tYWM6CisJY2xybWFjCisJbGRtYWMgZXIwLG1hY2gKKwlsZG1hYyBlcjEsbWFjbAorCW1hYyBAZXIwKyxAZXIxKworCXN0bWFjIG1hY2gsZXIwCisJc3RtYWMgbWFjbCxlcjEKKwkKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmY4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMKQEAgLTAsMCArMSwxMyBAQAorCS50ZXh0CitoODMwMF9taXNjOgorCWVlcG1vdgorCWxkYyAjMCxjY3IKKwlsZGMgcjBsLGNjcgorOwltb3ZmcGUgMTY6MTYscjBsCis7CW1vdnRwZSByMGwsMTY6MTYKKwlub3AKKwlydGUKKwlydHMKKwlzbGVlcAorCXN0YyBjY3IscjBsCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWNiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zCkBAIC0wLDAgKzEsMjcgQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9taXNjOgorCWVlcG1vdi5iCisgCWVlcG1vdi53CisJbGRjLmIgIzAsY2NyCisJbGRjLmIgcjBsLGNjcgorCWxkYy53IEBlcjAsY2NyCisJbGRjLncgQCgxNjoxNixlcjApLGNjcgorCWxkYy53IEAoMzI6MjQsZXIwKSxjY3IKKwlsZGMudyBAZXIwKyxjY3IKKwlsZGMudyBAaDgzMDBoX21pc2M6MTYsY2NyCisJbGRjLncgQGg4MzAwaF9taXNjOjI0LGNjcgorOwltb3ZmcGUgMTY6MTYscjBsCis7CW1vdnRwZSByMGwsMTY6MTYKKwlub3AKKwlydGUKKwlydHMKKwlzbGVlcAorCXN0Yy5iIGNjcixyMGwKKwlzdGMudyBjY3IsQGVyMAorCXN0Yy53IGNjcixAKDE2OjE2LGVyMCkKKwlzdGMudyBjY3IsQCgzMjoyNCxlcjApCisJc3RjLncgY2NyLEAtZXIwCisJc3RjLncgY2NyLEBoODMwMGhfbWlzYzoxNgorCXN0Yy53IGNjcixAaDgzMDBoX21pc2M6MjQKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzY3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3YTE3NwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMKQEAgLTAsMCArMSw0MSBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX21pc2M6CisJZWVwbW92LmIKKyAJZWVwbW92LncKKwlsZGMuYiAjMCxjY3IKKwlsZGMuYiByMGwsY2NyCisJbGRjLmIgIzAsZXhyCisJbGRjLmIgcjBsLGV4cgorCWxkYy53IEBlcjAsY2NyCisJbGRjLncgQCgxNjoxNixlcjApLGNjcgorCWxkYy53IEAoMzI6MzIsZXIwKSxjY3IKKwlsZGMudyBAZXIwKyxjY3IKKwlsZGMudyBAaDgzMDBzX21pc2M6MTYsY2NyCisJbGRjLncgQGg4MzAwc19taXNjOjMyLGNjcgorCWxkYy53IEBlcjAsZXhyCisJbGRjLncgQCgxNjoxNixlcjApLGV4cgorCWxkYy53IEAoMzI6MzIsZXIwKSxleHIKKwlsZGMudyBAZXIwKyxleHIKKwlsZGMudyBAaDgzMDBzX21pc2M6MTYsZXhyCisJbGRjLncgQGg4MzAwc19taXNjOjMyLGV4cgorOwltb3ZmcGUgMTY6MTYscjBsCis7CW1vdnRwZSByMGwsMTY6MTYKKwlub3AKKwlydGUKKwlydHMKKwlzbGVlcAorCXN0Yy5iIGNjcixyMGwKKwlzdGMuYiBleHIscjBsCisJc3RjLncgY2NyLEBlcjAKKwlzdGMudyBjY3IsQCgxNjoxNixlcjApCisJc3RjLncgY2NyLEAoMzI6MzIsZXIwKQorCXN0Yy53IGNjcixALWVyMAorCXN0Yy53IGNjcixAaDgzMDBzX21pc2M6MTYKKwlzdGMudyBjY3IsQGg4MzAwc19taXNjOjMyCisJc3RjLncgZXhyLEBlcjAKKwlzdGMudyBleHIsQCgxNjoxNixlcjApCisJc3RjLncgZXhyLEAoMzI6MzIsZXIwKQorCXN0Yy53IGV4cixALWVyMAorCXN0Yy53IGV4cixAaDgzMDBzX21pc2M6MTYKKwlzdGMudyBleHIsQGg4MzAwc19taXNjOjMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM5M2UzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92MzJidWcucwpAQCAtMCwwICsxLDQgQEAKKwkuaDgzMDBoCisJLmdsb2JhbCBfYQorYmxhaDoKKwltb3YubCAgICNfYS0yMDAwMDAwMDAwLGVyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDQwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiLnMKQEAgLTAsMCArMSwxNSBAQAorCS50ZXh0CitoODMwMF9tb3ZiOgorCW1vdi5iIHIwbCxyMWwKKwltb3YuYiAjMTYscjBsCisJbW92LmIgQHIxLHIwbAorCW1vdi5iIEAoMTY6MTYscjEpLHIwbAorCW1vdi5iIEByMSsscjBsCisJbW92LmIgQDE2OjgscjBsCisJbW92LmIgQGg4MzAwX21vdmI6MTYscjBsCisJbW92LmIgcjBsLEByMQorCW1vdi5iIHIwbCxAKDE2OjE2LHIxKQorCW1vdi5iIHIwbCxALXIxCisJbW92LmIgcjBsLEAxNjo4CisJbW92LmIgcjBsLEBoODMwMF9tb3ZiOjE2CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNzExZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zCkBAIC0wLDAgKzEsMjAgQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9tb3ZiOgorCW1vdi5iIHIwbCxyMWwKKwltb3YuYiAjMTYscjBsCisJbW92LmIgQGVyMSxyMGwKKwltb3YuYiBAKDE2OjE2LGVyMSkscjBsCisJbW92LmIgQCgzMjoyNCxlcjEpLHIwbAorCW1vdi5iIEBlcjErLHIwbAorCW1vdi5iIEAxNjo4LHIwbAorCW1vdi5iIEBoODMwMGhfbW92YjoxNixyMGwKKwltb3YuYiBAaDgzMDBoX21vdmI6MjQscjBsCisJbW92LmIgcjBsLEBlcjEKKwltb3YuYiByMGwsQCgxNjoxNixlcjEpCisJbW92LmIgcjBsLEAoMzI6MjQsZXIxKQorCW1vdi5iIHIwbCxALWVyMQorCW1vdi5iIHIwbCxAMTY6OAorCW1vdi5iIHIwbCxAaDgzMDBoX21vdmI6MTYKKwltb3YuYiByMGwsQGg4MzAwaF9tb3ZiOjI0CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTAwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zicy5zCkBAIC0wLDAgKzEsMjAgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19tb3ZiOgorCW1vdi5iIHIwbCxyMWwKKwltb3YuYiAjMTYscjBsCisJbW92LmIgQGVyMSxyMGwKKwltb3YuYiBAKDE2OjE2LGVyMSkscjBsCisJbW92LmIgQCgzMjozMixlcjEpLHIwbAorCW1vdi5iIEBlcjErLHIwbAorCW1vdi5iIEAxNjo4LHIwbAorCW1vdi5iIEBoODMwMHNfbW92YjoxNixyMGwKKwltb3YuYiBAaDgzMDBzX21vdmI6MzIscjBsCisJbW92LmIgcjBsLEBlcjEKKwltb3YuYiByMGwsQCgxNjoxNixlcjEpCisJbW92LmIgcjBsLEAoMzI6MzIsZXIxKQorCW1vdi5iIHIwbCxALWVyMQorCW1vdi5iIHIwbCxAMTY6OAorCW1vdi5iIHIwbCxAaDgzMDBzX21vdmI6MTYKKwltb3YuYiByMGwsQGg4MzAwc19tb3ZiOjMyCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzc4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zCkBAIC0wLDAgKzEsMTggQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9tb3ZsOgorCW1vdi5sIGVyMCxlcjEKKwltb3YubCAjNjQsZXIwCisJbW92LmwgQGVyMSxlcjAKKwltb3YubCBAKDE2OjE2LGVyMSksZXIwCisJbW92LmwgQCgzMjoyNCxlcjEpLGVyMAorCW1vdi5sIEBlcjErLGVyMAorCW1vdi5sIEBoODMwMGhfbW92bDoxNixlcjAKKwltb3YubCBAaDgzMDBoX21vdmw6MjQsZXIwCisJbW92LmwgZXIwLEBlcjEKKwltb3YubCBlcjAsQCgxNjoxNixlcjEpCisJbW92LmwgZXIwLEAoMzI6MjQsZXIxKQorCW1vdi5sIGVyMCxALWVyMQorCW1vdi5sIGVyMCxAaDgzMDBoX21vdmw6MTYKKwltb3YubCBlcjAsQGg4MzAwaF9tb3ZsOjI0CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDM3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zCkBAIC0wLDAgKzEsMTggQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19tb3ZsOgorCW1vdi5sIGVyMCxlcjEKKwltb3YubCAjNjQsZXIwCisJbW92LmwgQGVyMSxlcjAKKwltb3YubCBAKDE2OjE2LGVyMSksZXIwCisJbW92LmwgQCgzMjozMixlcjEpLGVyMAorCW1vdi5sIEBlcjErLGVyMAorCW1vdi5sIEBoODMwMHNfbW92bDoxNixlcjAKKwltb3YubCBAaDgzMDBzX21vdmw6MzIsZXIwCisJbW92LmwgZXIwLEBlcjEKKwltb3YubCBlcjAsQCgxNjoxNixlcjEpCisJbW92LmwgZXIwLEAoMzI6MzIsZXIxKQorCW1vdi5sIGVyMCxALWVyMQorCW1vdi5sIGVyMCxAaDgzMDBzX21vdmw6MTYKKwltb3YubCBlcjAsQGg4MzAwc19tb3ZsOjMyCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M2NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zCkBAIC0wLDAgKzEsMTMgQEAKKwkudGV4dAoraDgzMDBfbW92dzoKKwltb3YudyByMCxyMQorCW1vdi53ICMxNixyMAorCW1vdi53IEByMSxyMAorCW1vdi53IEAoMTY6MTYscjEpLHIwCisJbW92LncgQHIxKyxyMAorCW1vdi53IEBoODMwMF9tb3Z3OjE2LHIwCisJbW92LncgcjAsQHIxCisJbW92LncgcjAsQCgxNjoxNixyMSkKKwltb3YudyByMCxALXIxCisJbW92LncgcjAsQGg4MzAwX21vdnc6MTYKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MDU3YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMKQEAgLTAsMCArMSwxOCBAQAorCS5oODMwMGgKKwkudGV4dAoraDgzMDBoX21vdnc6CisJbW92LncgcjAscjEKKwltb3YudyAjMTYscjAKKwltb3YudyBAZXIxLHIwCisJbW92LncgQCgxNjoxNixlcjEpLHIwCisJbW92LncgQCgzMjoyNCxlcjEpLHIwCisJbW92LncgQGVyMSsscjAKKwltb3YudyBAaDgzMDBoX21vdnc6MTYscjAKKwltb3YudyBAaDgzMDBoX21vdnc6MjQscjAKKwltb3YudyByMCxAZXIxCisJbW92LncgcjAsQCgxNjoxNixlcjEpCisJbW92LncgcjAsQCgzMjoyNCxlcjEpCisJbW92LncgcjAsQC1lcjEKKwltb3YudyByMCxAaDgzMDBoX21vdnc6MTYKKwltb3YudyByMCxAaDgzMDBoX21vdnc6MjQKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmMjFkZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMKQEAgLTAsMCArMSwxOCBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX21vdnc6CisJbW92LncgcjAscjEKKwltb3YudyAjMTYscjAKKwltb3YudyBAZXIxLHIwCisJbW92LncgQCgxNjoxNixlcjEpLHIwCisJbW92LncgQCgzMjozMixlcjEpLHIwCisJbW92LncgQGVyMSsscjAKKwltb3YudyBAaDgzMDBzX21vdnc6MTYscjAKKwltb3YudyBAaDgzMDBzX21vdnc6MzIscjAKKwltb3YudyByMCxAZXIxCisJbW92LncgcjAsQCgxNjoxNixlcjEpCisJbW92LncgcjAsQCgzMjozMixlcjEpCisJbW92LncgcjAsQC1lcjEKKwltb3YudyByMCxAaDgzMDBzX21vdnc6MTYKKwltb3YudyByMCxAaDgzMDBzX21vdnc6MzIKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjA3OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbXVsdGlwbGVzLnMKQEAgLTAsMCArMSwxMCBAQAorCS5oODMwMHMKKwkudGV4dAoraDgzMDBzX211bHRpcGxlOgorCWxkbS5sIEBzcCssZXIwLWVyMQorCWxkbS5sIEBzcCssZXIwLWVyMgorCWxkbS5sIEBzcCssZXIwLWVyMworCXN0bS5sIGVyMC1lcjEsQC1zcAorCXN0bS5sIGVyMC1lcjIsQC1zcAorCXN0bS5sIGVyMC1lcjMsQC1zcAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxYjczNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3AucwpAQCAtMCwwICsxLDUgQEAKKwkudGV4dAoraDgzMDBfcHVzaF9wb3A6CisJcG9wIHIwCisJcHVzaCByMAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9waC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ5NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucwpAQCAtMCwwICsxLDggQEAKKwkuaDgzMDBoCisJLnRleHQKK2g4MzAwaF9wdXNoX3BvcDoKKwlwb3AudyByMAorCXBvcC5sIGVyMAorCXB1c2gudyByMAorCXB1c2gubCBlcjAKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BzLnMKQEAgLTAsMCArMSw4IEBACisJLmg4MzAwcworCS50ZXh0CitoODMwMHNfcHVzaF9wb3A6CisJcG9wLncgcjAKKwlwb3AubCBlcjAKKwlwdXNoLncgcjAKKwlwdXNoLmwgZXIwCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YWE4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zCkBAIC0wLDAgKzEsMTEgQEAKKwkudGV4dAoraDgzMDBfcm90YXRlX3NoaWZ0OgorCXJvdGwgcjBsCisJcm90ciByMGwKKwlyb3R4bCByMGwKKwlyb3R4ciByMGwKKwlzaGFsIHIwbAorCXNoYXIgcjBsCisJc2hsbCByMGwKKwlzaGxyIHIwbAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWJlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucwpAQCAtMCwwICsxLDI3IEBACisJLmg4MzAwaAorCS50ZXh0CitoODMwMGhfcm90YXRlX3NoaWZ0OgorCXJvdGwuYiByMGwKKwlyb3RsLncgcjAKKwlyb3RsLmwgZXIwCisJcm90ci5iIHIwbAorCXJvdHIudyByMAorCXJvdHIubCBlcjAKKwlyb3R4bC5iIHIwbAorCXJvdHhsLncgcjAKKwlyb3R4bC5sIGVyMAorCXJvdHhyLmIgcjBsCisJcm90eHIudyByMAorCXJvdHhyLmwgZXIwCisJc2hhbC5iIHIwbAorCXNoYWwudyByMAorCXNoYWwubCBlcjAKKwlzaGFyLmIgcjBsCisJc2hhci53IHIwCisJc2hhci5sIGVyMAorCXNobGwuYiByMGwKKwlzaGxsLncgcjAKKwlzaGxsLmwgZXIwCisJc2hsci5iIHIwbAorCXNobHIudyByMAorCXNobHIubCBlcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjNDFjYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNocy5zCkBAIC0wLDAgKzEsNTEgQEAKKwkuaDgzMDBzCisJLnRleHQKK2g4MzAwc19yb3RhdGVfc2hpZnQ6CisJcm90bC5iIHIwbAorCXJvdGwuYiAjMixyMGwKKwlyb3RsLncgcjAKKwlyb3RsLncgIzIscjAKKwlyb3RsLmwgZXIwCisJcm90bC5sICMyLGVyMAorCXJvdHIuYiByMGwKKwlyb3RyLmIgIzIscjBsCisJcm90ci53IHIwCisJcm90ci53ICMyLHIwCisJcm90ci5sIGVyMAorCXJvdHIubCAjMixlcjAKKwlyb3R4bC5iIHIwbAorCXJvdHhsLmIgIzIscjBsCisJcm90eGwudyByMAorCXJvdHhsLncgIzIscjAKKwlyb3R4bC5sIGVyMAorCXJvdHhsLmwgIzIsZXIwCisJcm90eHIuYiByMGwKKwlyb3R4ci5iICMyLHIwbAorCXJvdHhyLncgcjAKKwlyb3R4ci53ICMyLHIwCisJcm90eHIubCBlcjAKKwlyb3R4ci5sICMyLGVyMAorCXNoYWwuYiByMGwKKwlzaGFsLmIgIzIscjBsCisJc2hhbC53IHIwCisJc2hhbC53ICMyLHIwCisJc2hhbC5sIGVyMAorCXNoYWwubCAjMixlcjAKKwlzaGFyLmIgcjBsCisJc2hhci5iICMyLHIwbAorCXNoYXIudyByMAorCXNoYXIudyAjMixyMAorCXNoYXIubCBlcjAKKwlzaGFyLmwgIzIsZXIwCisJc2hsbC5iIHIwbAorCXNobGwuYiAjMixyMGwKKwlzaGxsLncgcjAKKwlzaGxsLncgIzIscjAKKwlzaGxsLmwgZXIwCisJc2hsbC5sICMyLGVyMAorCXNobHIuYiByMGwKKwlzaGxyLmIgIzIscjBsCisJc2hsci53IHIwCisJc2hsci53ICMyLHIwCisJc2hsci5sIGVyMAorCXNobHIubCAjMixlcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMTc0YQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FCkBAIC0wLDAgKzEsMzQgQEAKK05vdGVzIG9uIGhvdyB0aGUgSFBQQSB0ZXN0c3VpdGUgaXMgb3JnYW5pemVkOgorCitiYXNpYy5wYXJzZSAtLSB0aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2luZwordGVzdHMgYW5kIGEgc2ltcGxlIC5zdGFiIHBhcnNpbmcgdGVzdC4gIFRoaXMgd291bGQgYmUgd2hlcmUgeW91J2QKK2FkZCBjb2RlIHRvIG1ha2Ugc3VyZSBuZXcgaW5zdHJ1Y3Rpb25zIGFyZSBwYXJzZWQgY29ycmVjdGx5LCBuZXcKK2NvbXBsZXRlcnMgKHN1Y2ggYXMgY2FjaGUgaGl0cykgYXJlIHBhcnNlZCBjb3JyZWN0bHksIGV0Yy4KKworSXQncyBhbHNvIGEgcmVhc29uYWJsZSBwbGFjZSB0byBtYWtlIHN1cmUgcGFyc2luZyBvZiB0aGUgdmFyaW91cworYXNzZW1ibGVyIGRpcmVjdGl2ZXMgaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBJZiB5b3UncmUgZ29pbmcgdG8gYWRkCitzdWNoIGNvZGUsIHRyeSB0byBiZSByZWFzb25hYmx5IGNvbXBsZXRlLiAgQWRkIHRlc3QgY29kZSBmb3IgZWFjaAorYmFzaWMgZGlyZWN0aXZlIGFuZCB0ZXN0IGFsbCAob3IgYSBub3Rld29ydGh5KSBzdWJzZXQgb2YgYXJndW1lbnRzLgorCitJdCBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgdG8gaGF2ZSBhbiBhc3NlbWJsZXIgdG8gcnVuIHRoZXNlIHRlc3RzOworY2FsbGluZyBvYmpkdW1wX3N0YXJ0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHNob3VsZCBub3QgYmUgZG9uZSBmcm9tCit0aGlzIGRpcmVjdG9yeS4KKworCittb3JlLnBhcnNlIC0tIHRoaXMgaXMgd2hlcmUgeW91IHNob3VsZCBwdXQgYWRkaXRpb25hbCBwYXJzaW5nIHRlc3RzLCBzdWNoCithcyB0ZXN0cyB0byBjaGVjayBtb2RlIHNlbGVjdG9yIHBhcnNpbmcsIHN0cmluZyBwYXJzaW5nLCBleHByZXNzaW9uIHBhcnNpbmcsCitldGMuICBJdCdzIGFsc28gYSByZWFzb25hYmxlIHBsYWNlIHRvIHB1dCBwYXJzaW5nIHRlc3RzIHdoaWNoIGFyZSBub3QgY29tcGxldGUKK2Vub3VnaCAod2hhdGV2ZXIgdGhhdCBtZWFucykgZm9yIGJhc2ljLnBhcnNlLiAgCisKK0l0IHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSB0byBoYXZlIGFuIGFzc2VtYmxlciB0byBydW4gdGhlc2UgdGVzdHM7CitjYWxsaW5nIG9iamR1bXBfc3RhcnQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc2hvdWxkIG5vdCBiZSBkb25lIGZyb20KK3RoaXMgZGlyZWN0b3J5LgorCisKK3JlbG9jIC0tIHRoaXMgaXMgd2hlcmUgeW91IHRlc3RzIHdoaWNoIGV4YW1pbmUgcmVsb2NhdGlvbnMgcHJvZHVjZWQKK2J5IEdBUyBiZWxvbmcuICBUbyBydW4gdGhlc2UgdGVzdHMgeW91IG11c3QgaGF2ZSBhIGZ1bmN0aW9uaW5nIG9iamR1bXAuCisKKwordW5zb3J0ZWQgLS0gdGhpcyBpcyB3aGVyZSBldmVyeXRoaW5nIGVsc2UgZ29lcy4gIEFzIGdyb3VwcyBvZiByZWxhdGVkIHRlc3RzCitlbmQgdXAgaW4gdGhpcyBkaXJlY3RvcnksIHRoZXkgc2hvdWxkIGJlIGJyb2tlbiBvdXQgaW50byBhIG5ldyBjbGFzcyBvZgordGVzdHMuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFkNGNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucwpAQCAtMCwwICsxLDEwMCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGFkZC9zaD9hZGQgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorCWFkZCAgJXI0LCVyNSwlcjYKKwlhZGQsPSAgJXI0LCVyNSwlcjYKKwlhZGQsPCAgJXI0LCVyNSwlcjYKKwlhZGQsPD0gICVyNCwlcjUsJXI2CisJYWRkLG51diAgJXI0LCVyNSwlcjYKKwlhZGQsem52ICAlcjQsJXI1LCVyNgorCWFkZCxzdiAgJXI0LCVyNSwlcjYKKwlhZGQsb2QgICVyNCwlcjUsJXI2CisJYWRkLHRyICAlcjQsJXI1LCVyNgorCWFkZCw8PiAgJXI0LCVyNSwlcjYKKwlhZGQsPj0gICVyNCwlcjUsJXI2CisJYWRkLD4gICVyNCwlcjUsJXI2CisJYWRkLHV2ICAlcjQsJXI1LCVyNgorCWFkZCx2bnogICVyNCwlcjUsJXI2CisJYWRkLG5zdiAgJXI0LCVyNSwlcjYKKwlhZGQsZXYgICVyNCwlcjUsJXI2CisKKwlhZGRsICAlcjQsJXI1LCVyNgorCWFkZGwsPSAgJXI0LCVyNSwlcjYKKwlhZGRsLDwgICVyNCwlcjUsJXI2CisJYWRkbCw8PSAgJXI0LCVyNSwlcjYKKwlhZGRsLG51diAgJXI0LCVyNSwlcjYKKwlhZGRsLHpudiAgJXI0LCVyNSwlcjYKKwlhZGRsLHN2ICAlcjQsJXI1LCVyNgorCWFkZGwsb2QgICVyNCwlcjUsJXI2CisJYWRkbCx0ciAgJXI0LCVyNSwlcjYKKwlhZGRsLDw+ICAlcjQsJXI1LCVyNgorCWFkZGwsPj0gICVyNCwlcjUsJXI2CisJYWRkbCw+ICAlcjQsJXI1LCVyNgorCWFkZGwsdXYgICVyNCwlcjUsJXI2CisJYWRkbCx2bnogICVyNCwlcjUsJXI2CisJYWRkbCxuc3YgICVyNCwlcjUsJXI2CisJYWRkbCxldiAgJXI0LCVyNSwlcjYKKworCWFkZG8gICVyNCwlcjUsJXI2CisJYWRkbyw9ICAlcjQsJXI1LCVyNgorCWFkZG8sPCAgJXI0LCVyNSwlcjYKKwlhZGRvLDw9ICAlcjQsJXI1LCVyNgorCWFkZG8sbnV2ICAlcjQsJXI1LCVyNgorCWFkZG8sem52ICAlcjQsJXI1LCVyNgorCWFkZG8sc3YgICVyNCwlcjUsJXI2CisJYWRkbyxvZCAgJXI0LCVyNSwlcjYKKwlhZGRvLHRyICAlcjQsJXI1LCVyNgorCWFkZG8sPD4gICVyNCwlcjUsJXI2CisJYWRkbyw+PSAgJXI0LCVyNSwlcjYKKwlhZGRvLD4gICVyNCwlcjUsJXI2CisJYWRkbyx1diAgJXI0LCVyNSwlcjYKKwlhZGRvLHZueiAgJXI0LCVyNSwlcjYKKwlhZGRvLG5zdiAgJXI0LCVyNSwlcjYKKwlhZGRvLGV2ICAlcjQsJXI1LCVyNgorCisJYWRkYyAgJXI0LCVyNSwlcjYKKwlhZGRjLD0gICVyNCwlcjUsJXI2CisJYWRkYyw8ICAlcjQsJXI1LCVyNgorCWFkZGMsPD0gICVyNCwlcjUsJXI2CisJYWRkYyxudXYgICVyNCwlcjUsJXI2CisJYWRkYyx6bnYgICVyNCwlcjUsJXI2CisJYWRkYyxzdiAgJXI0LCVyNSwlcjYKKwlhZGRjLG9kICAlcjQsJXI1LCVyNgorCWFkZGMsdHIgICVyNCwlcjUsJXI2CisJYWRkYyw8PiAgJXI0LCVyNSwlcjYKKwlhZGRjLD49ICAlcjQsJXI1LCVyNgorCWFkZGMsPiAgJXI0LCVyNSwlcjYKKwlhZGRjLHV2ICAlcjQsJXI1LCVyNgorCWFkZGMsdm56ICAlcjQsJXI1LCVyNgorCWFkZGMsbnN2ICAlcjQsJXI1LCVyNgorCWFkZGMsZXYgICVyNCwlcjUsJXI2CisKKwlhZGRjbyAgJXI0LCVyNSwlcjYKKwlhZGRjbyw9ICAlcjQsJXI1LCVyNgorCWFkZGNvLDwgICVyNCwlcjUsJXI2CisJYWRkY28sPD0gICVyNCwlcjUsJXI2CisJYWRkY28sbnV2ICAlcjQsJXI1LCVyNgorCWFkZGNvLHpudiAgJXI0LCVyNSwlcjYKKwlhZGRjbyxzdiAgJXI0LCVyNSwlcjYKKwlhZGRjbyxvZCAgJXI0LCVyNSwlcjYKKwlhZGRjbyx0ciAgJXI0LCVyNSwlcjYKKwlhZGRjbyw8PiAgJXI0LCVyNSwlcjYKKwlhZGRjbyw+PSAgJXI0LCVyNSwlcjYKKwlhZGRjbyw+ICAlcjQsJXI1LCVyNgorCWFkZGNvLHV2ICAlcjQsJXI1LCVyNgorCWFkZGNvLHZueiAgJXI0LCVyNSwlcjYKKwlhZGRjbyxuc3YgICVyNCwlcjUsJXI2CisJYWRkY28sZXYgICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzZiODAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2FkZGkucwpAQCAtMCwwICsxLDgzIEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKwlhZGRpICAxMjMsJXI1LCVyNgorCWFkZGksPSAgMTIzLCVyNSwlcjYKKwlhZGRpLDwgIDEyMywlcjUsJXI2CisJYWRkaSw8PSAgMTIzLCVyNSwlcjYKKwlhZGRpLG51diAgMTIzLCVyNSwlcjYKKwlhZGRpLHpudiAgMTIzLCVyNSwlcjYKKwlhZGRpLHN2ICAxMjMsJXI1LCVyNgorCWFkZGksb2QgIDEyMywlcjUsJXI2CisJYWRkaSx0ciAgMTIzLCVyNSwlcjYKKwlhZGRpLDw+ICAxMjMsJXI1LCVyNgorCWFkZGksPj0gIDEyMywlcjUsJXI2CisJYWRkaSw+ICAxMjMsJXI1LCVyNgorCWFkZGksdXYgIDEyMywlcjUsJXI2CisJYWRkaSx2bnogIDEyMywlcjUsJXI2CisJYWRkaSxuc3YgIDEyMywlcjUsJXI2CisJYWRkaSxldiAgMTIzLCVyNSwlcjYKKworCWFkZGlvICAxMjMsJXI1LCVyNgorCWFkZGlvLD0gIDEyMywlcjUsJXI2CisJYWRkaW8sPCAgMTIzLCVyNSwlcjYKKwlhZGRpbyw8PSAgMTIzLCVyNSwlcjYKKwlhZGRpbyxudXYgIDEyMywlcjUsJXI2CisJYWRkaW8sem52ICAxMjMsJXI1LCVyNgorCWFkZGlvLHN2ICAxMjMsJXI1LCVyNgorCWFkZGlvLG9kICAxMjMsJXI1LCVyNgorCWFkZGlvLHRyICAxMjMsJXI1LCVyNgorCWFkZGlvLDw+ICAxMjMsJXI1LCVyNgorCWFkZGlvLD49ICAxMjMsJXI1LCVyNgorCWFkZGlvLD4gIDEyMywlcjUsJXI2CisJYWRkaW8sdXYgIDEyMywlcjUsJXI2CisJYWRkaW8sdm56ICAxMjMsJXI1LCVyNgorCWFkZGlvLG5zdiAgMTIzLCVyNSwlcjYKKwlhZGRpbyxldiAgMTIzLCVyNSwlcjYKKworCWFkZGl0ICAxMjMsJXI1LCVyNgorCWFkZGl0LD0gIDEyMywlcjUsJXI2CisJYWRkaXQsPCAgMTIzLCVyNSwlcjYKKwlhZGRpdCw8PSAgMTIzLCVyNSwlcjYKKwlhZGRpdCxudXYgIDEyMywlcjUsJXI2CisJYWRkaXQsem52ICAxMjMsJXI1LCVyNgorCWFkZGl0LHN2ICAxMjMsJXI1LCVyNgorCWFkZGl0LG9kICAxMjMsJXI1LCVyNgorCWFkZGl0LHRyICAxMjMsJXI1LCVyNgorCWFkZGl0LDw+ICAxMjMsJXI1LCVyNgorCWFkZGl0LD49ICAxMjMsJXI1LCVyNgorCWFkZGl0LD4gIDEyMywlcjUsJXI2CisJYWRkaXQsdXYgIDEyMywlcjUsJXI2CisJYWRkaXQsdm56ICAxMjMsJXI1LCVyNgorCWFkZGl0LG5zdiAgMTIzLCVyNSwlcjYKKwlhZGRpdCxldiAgMTIzLCVyNSwlcjYKKworCWFkZGl0byAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sPSAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sPCAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sPD0gIDEyMywlcjUsJXI2CisJYWRkaXRvLG51diAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sem52ICAxMjMsJXI1LCVyNgorCWFkZGl0byxzdiAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sb2QgIDEyMywlcjUsJXI2CisJYWRkaXRvLHRyICAxMjMsJXI1LCVyNgorCWFkZGl0byw8PiAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sPj0gIDEyMywlcjUsJXI2CisJYWRkaXRvLD4gIDEyMywlcjUsJXI2CisJYWRkaXRvLHV2ICAxMjMsJXI1LCVyNgorCWFkZGl0byx2bnogIDEyMywlcjUsJXI2CisJYWRkaXRvLG5zdiAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sZXYgIDEyMywlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YmE1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cApAQCAtMCwwICsxLDIyNjIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBEZWphR251QGN5Z251cy5jb20KKworIyBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcmlzdHkgb2YgVXRhaAorIyBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK3Byb2MgZG9faW1lbSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJpbWVtLnM6IGludGVnZXIgbWVtb3J5IGxvYWRzIGFuZCBzdG9yZXMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJpbWVtLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNDg5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDBDODAxMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA0NDlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMEM4MDEwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQwOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwQzgwMTAxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgNjg5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDBDOUExMjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA2NDlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMEM5QTEyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDYwOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwQzlBMTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggNEM5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDZDOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwQzg1MDA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMEM4NTIwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDBDODUwMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwQzg1MjBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMEM4NTAwNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDBDODUyMDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwQzg1MDA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMEM4NTIwN0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDBDODUwMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwQzg1MjAxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMEM4NTAwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDBDODUyMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwQzg1MDE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMEM4NTIxOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDBDODUwMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwQzg1MjFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMEM4NTAxREFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDBDODUyMURBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwQzg1MDFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMEM4NTIxRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDBDODAxMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwQzgwMzBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMEM4MDEwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDBDODAxMDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwQzgwMzA3QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMEM4MDEwN0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDBDODAxMDFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwQzgwMzAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMEM4MDEwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDBDODAxMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwQzgwMzFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMEM4MDExQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDBDODAxMURBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwQzgwMzFGQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMEM4MDExRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDBDOUExMjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwQzlBMzJBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMEM5QTEyQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDBDOUExMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwQzlBMzI2MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMEM5QTEyNjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDBDOUExMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwQzlBMzIyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMEM5QTEyMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDBDOUExMzgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwQzlBMzNBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMEM5QTEzQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDBDOUExMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwQzlBMTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMEM5QTMzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDBDOUExMzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwQzlBMzMyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9faW1tZWQge30geworICAgIHNldCB0ZXN0bmFtZSAiaW1tZWQuczogaW1tZWRpYXRlIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiaW1tZWQucyIgIi1hbCIKKworICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgorICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCisgICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCisgICAgIworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzNzVBMDAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjM0REZCRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI4QURGQkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0IAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19icmFuY2gge30geworICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGJyYW5jaCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImJyYW5jaC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU4NUYxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFODVGMUZFRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTgxRjFGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEU4MUYxRkRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFODVGM0ZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTg1RjNGQ0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEU4NDQ0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBFODQ0NDAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRTgwNDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEU4MDQ0MDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBFODQwQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRTg0MEMwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEUwNDA0NDZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFMDQwNDQ2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRTQ0MDQ0NkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU0NDA0NDZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBDQjQ0MUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgQ0I0NDNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IENCNDQ1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBDQjQ0N0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgQ0I0NDlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IENCNDRCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBDQjQ0REZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgQ0I0NEZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIENCNDQxRkI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBDQjQ0M0ZBRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggQ0I0NDVGQTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIENCNDQ3RjlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBDQjQ0OUY5N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgQ0I0NEJGOEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IENCNDRERjg3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBDQjQ0RkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgQ0Y0QTFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IENGNEEzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBDRjRBNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgQ0Y0QTdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIENGNEE5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBDRjRBQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggQ0Y0QURGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIENGNEFGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBDRjRBMUZCN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgQ0Y0QTNGQUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IENGNEE1RkE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBDRjRBN0Y5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgQ0Y0QTlGOTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IENGNEFCRjhGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBDRjRBREY4N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgQ0Y0QUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDgwODAxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCA4MDgwM0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggODA4MDVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDgwODA3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCA4MDgwOUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgODA4MEJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDgwODBERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyA4MDgwRkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgODg4MDFGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDg4ODAzRkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCA4ODgwNUZBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgODg4MDdGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDg4ODA5Rjk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCA4ODgwQkY4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggODg4MERGODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDg4ODBGRjdEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCA4MDgwMUY3N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgODA4MDNGNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDgwODA1RjY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyA4MDgwN0Y1RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgODA4MDlGNTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDgwODBCRjRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCA4MDgwREY0N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgODA4MEZGM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDg4ODAxRjM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCA4ODgwM0YyRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggODg4MDVGMjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDg4ODA3RjFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCA4ODgwOUYxN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgODg4MEJGMEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDg4ODBERjA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyA4ODgwRkVGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgODQ4MDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDg0ODA1RkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCA4NDgwN0ZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgODQ4MDlGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDg0ODBCRkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCA4NDgwREZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggODQ4MEZGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDhDODAxRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCA4QzgwM0ZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgOEM4MDVGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDhDODA3RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyA4QzgwOUY5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgOEM4MEJGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDhDODBERjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCA4QzgwRkU4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgODQ4MDFGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIDg0ODAzRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE4NCA4NDgwNUY2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODggODQ4MDdGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMThjIDg0ODA5RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MCA4NDgwQkY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTQgODQ4MERGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IDg0ODBGRjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE5YyA4QzgwMUYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTAgOEM4MDNGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IDhDODA1RjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFhOCA4QzgwN0YyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWMgOEM4MDlGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWIwIDhDODBCRjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNCA4QzgwREYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjggOEM4MEZGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEEwODExRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMCBBMDgxM0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzQgQTA4MTVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IEEwODE3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFjYyBBMDgxOUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDAgQTA4MUJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQ0IEEwODFERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFkOCBBMDgxRkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZGMgQTg4MTFGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWUwIEE4ODEzRkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFlNCBBODgxNUZBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTggQTg4MTdGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWVjIEE4ODE5Rjk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFmMCBBODgxQkY4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjQgQTg4MURGODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY4IEE4ODFGRjdEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFmYyBBMDgxMUY3N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDAgQTA4MTNGNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjA0IEEwODE1RjY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDIwOCBBMDgxN0Y1RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMGMgQTA4MTlGNTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjEwIEEwODFCRjRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDIxNCBBMDgxREY0N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTggQTA4MUZGM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjFjIEE4ODExRjM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDIyMCBBODgxM0YyRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjQgQTg4MTVGMjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI4IEE4ODE3RjFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDIyYyBBODgxOUYxN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzAgQTg4MUJGMEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjM0IEE4ODFERjA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDIzOCBBODgxRkVGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyM2MgQTQ5RjFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQwIEE0OUYzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI0NCBBNDlGNUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDggQTQ5RjdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjRjIEE0OUY5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI1MCBBNDlGQkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTQgQTQ5RkRGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjU4IEE0OUZGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI1YyBBQzlGMUZCNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjAgQUM5RjNGQURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjY0IEFDOUY1RkE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI2OCBBQzlGN0Y5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNmMgQUM5RjlGOTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjcwIEFDOUZCRjhEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI3NCBBQzlGREY4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzggQUM5RkZDODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjdjIEE0OUYxRjc3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI4MCBBNDlGM0Y2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODQgQTQ5RjVGNjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjg4IEE0OUY3RjVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI4YyBBNDlGOUY1N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTAgQTQ5RkJGNEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMjk0IEE0OUZERjQ3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDI5OCBBNDlGRkYzRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOWMgQUM5RjFGMzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMmEwIEFDOUYzRjJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDJhNCBBQzlGNUYyN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTggQUM5RjdGMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMmFjIEFDOUY5RjE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDJiMCBBQzlGQkYwRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjQgQUM5RkRGMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMmI4IEFDOUZGRUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDJiYyBDMDA0NUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzAgQzAwNERGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMmM0IEMwMDQ1RkU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDJjOCBDMDA0REZERlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyY2MgQzRBNDVGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQwIEM0QTRERkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDJkNCBDNEE0NUZDN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDggQzRBNERGQkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE4M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19hZGQge30geworICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IGFkZCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0UwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDA4QTQwNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwOEE0MjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMDhBNDQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDA4QTQ2NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwOEE0ODcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMDhBNEE3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDA4QTRDNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwOEE0RTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMDhBNDE3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDA4QTQzNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwOEE0NTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMDhBNDc3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDA4QTQ5NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAwOEE0QjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMDhBNEQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDA4QTRGNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAwOEE0MEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMDhBNDJGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDA4QTQ0RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAwOEE0NkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMDhBNDhGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDA4QTRBRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAwOEE0Q0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMDhBNEVGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDA4QTQxRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEyNCAwOEE0M0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMDhBNDVGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDA4QTQ3RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMCAwOEE0OUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMDhBNEJGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDA4QTRERjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYyAwOEE0RkYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09ODBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc2gxYWRkIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInNoMWFkZC5zOiBzaDFhZGQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzaDFhZGQucyIgIi1hbCIKKworICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgorICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCisgICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCisgICAgIworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0E0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19zaDJhZGQge30geworICAgIHNldCB0ZXN0bmFtZSAic2gyYWRkLnM6IHNoMmFkZCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgInNoMmFkZC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0U4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX3NoM2FkZCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJzaDNhZGQuczogc2gzYWRkIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAic2gzYWRkLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc3ViIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKKworICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgorICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCisgICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCisgICAgIworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0MwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDQ1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0ODUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEE1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDE1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDc1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNEQ1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDJEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDhEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0Q0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEVEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0M0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDVEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEJEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRERDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RkQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDA0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDY0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNEM0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDM0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0NzRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDk0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0RDRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEY0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDA4QTQwQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCAwOEE0MkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMDhBNDRDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDA4QTQ2Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCAwOEE0OENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMDhBNEFDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDA4QTRDQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyAwOEE0RUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMDhBNDFDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDA4QTQzQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCAwOEE0NUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMDhBNDdDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDA4QTQ5Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCAwOEE0QkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMDhBNERDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDA4QTRGQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT05Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19kcyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJkcy5zOiBkcyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImRzLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2NvbWNsciB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjb21jbHIuczogY29tY2xyIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiY29tY2xyLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0Nzg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDkwQTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCA5MEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggOTBBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDkwQTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCA5MEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgOTBBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDkwQTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyA5MEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgOTBBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDkwQTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCA5MEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgOTBBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDkwQTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCA5MEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggOTBBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDkwQTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19sb2dpY2FsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKKworICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgorICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCisgICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCisgICAgIworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDIyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNEUyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTQxMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0MzI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNDUyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQ3MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0RjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDAyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQyMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0NDI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNDYyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRFMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0MTI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDMyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQ1Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NzI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNEYyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNDQyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTQ2MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0RTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQzMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0NTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDcyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRGMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQ0MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0NjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNEUwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0MzAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNDUwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTQ3MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NDBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fdW5pdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJ1bml0LnM6IHVuaXQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJ1bml0LnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDAzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDQzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDYzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDgzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNEMzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEUzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNDEzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNDUzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDczODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDkzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNEQzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNEYzODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDA5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNDQ5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNDY5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNDg5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNEM5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNEU5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDE5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDU5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDc5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNDk5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNEQ5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEY5ODZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDA5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDQ5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDY5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDg5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNEM5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEU5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNDE5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNDU5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDc5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDk5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNEQ5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNEY5QzZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MzZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZGNvciB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJkY29yLnM6IGRjb3IgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJkY29yLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDg4MDBCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDg4MDRCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDg4MDZCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDg4MDhCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDg4MENCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDg4MEVCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDg4MDFCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDg4MDVCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDg4MDdCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDg4MDlCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDg4MERCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDg4MEZCODVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDg4MDBCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDg4MDRCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDg4MDZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDg4MDhCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDg4MENCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDg4MEVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDg4MDFCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDg4MDVCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDg4MDdCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDg4MDlCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDg4MERCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDg4MEZCQzVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MjRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fYWRkaSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJhZGRpLnM6IGFkZGkgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJhZGRpLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQjRBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEI0QTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBCNEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQjRBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEI0QTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBCNEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQjRBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEI0QTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBCNEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgQjRBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEI0QTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBCNEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgQjRBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEI0QTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBCNEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgQjRBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEI0QTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBCNEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggQjRBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEI0QTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBCNEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgQjRBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEI0QTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBCNEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgQjRBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEI0QTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBCNEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgQjRBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEI0QTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBCNEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggQjRBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEI0QTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBCMEE2MDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgQjBBNjIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEIwQTY0MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBCMEE2NjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgQjBBNjgwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEIwQTZBMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBCMEE2QzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgQjBBNkUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEIwQTYxMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBCMEE2MzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggQjBBNjUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEIwQTY3MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBCMEE2OTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgQjBBNkIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEIwQTZEMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBCMEE2RjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgQjBBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEIwQTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBCMEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgQjBBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEIwQTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBCMEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggQjBBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEIwQTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBCMEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgQjBBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEIwQTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBCMEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgQjBBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEIwQTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBCMEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgQjBBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTY0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX3N1Ymkge30geworICAgIHNldCB0ZXN0bmFtZSAic3ViaS5zOiBzdWJpIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAic3ViaS5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDk0QTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA5NEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggOTRBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDk0QTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA5NEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgOTRBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDk0QTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyA5NEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgOTRBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDk0QTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCA5NEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgOTRBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDk0QTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCA5NEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggOTRBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDk0QTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCA5NEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgOTRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDk0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyA5NEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgOTRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDk0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCA5NEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgOTRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDk0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCA5NEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggOTRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDk0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCA5NEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgOTRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDk0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyA5NEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc2hpZnQge30geworICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwQTQwMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwQTQyMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwQTQ0MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwQTQ2MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwQTQ4MDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwQTRBMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwQTRDMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwQTRFMDA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwQTQwQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwQTQyQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwQTQ0QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwQTQ2QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwQTQ4QjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwQTRBQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwQTRDQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwQTRFQjQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2V4dHJhY3Qge30geworICAgIHNldCB0ZXN0bmFtZSAiZXh0cmFjdC5zOiBleHRyYWN0IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiZXh0cmFjdC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQwODYxOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQwODYzOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQwODY1OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQwODY3OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQwODY5OEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQwODZCOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQwODZEOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQwODZGOEI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQwODYxQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQwODYzQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQwODY1Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQwODY3Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQwODY5Q0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQwODZCQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQwODZEQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQwODZGQ0I2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQwODYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQwODYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQwODY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQwODY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQwODY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQwODZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQwODZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQwODZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQwODYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQwODYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQwODY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQwODY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQwODY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQwODZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQwODZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQwODZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2RlcG9zaXQge30geworICAgIHNldCB0ZXN0bmFtZSAiZGVwb3NpdC5zOiBkZXBvc2l0IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiZGVwb3NpdC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ0QzQwQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQ0QzQyQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ0QzQ0QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEQ0QzQ2QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEQ0QzQ4QjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEQ0QzRBQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEQ0QzRDQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEQ0QzRFQjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEQ0QzQwRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEQ0QzQyRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEQ0QzQ0RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEQ0QzQ2RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEQ0QzQ4RjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEQ0QzRBRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEQ0QzRDRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEQ0QzRFRjU2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEQ0QzQwMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IEQ0QzQyMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEQ0QzQ0MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEQ0QzQ2MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIEQ0QzQ4MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEQ0QzRBMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEQ0QzRDMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIEQ0QzRFMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEQ0QzQwNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IEQ0QzQyNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IEQ0QzQ0NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEQ0QzQ2NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEQ0QzQ4NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IEQ0QzRBNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEQ0QzRDNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEQ0QzRFNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIEQ0REYxNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEQ0REYzNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEQ0REY1NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIEQ0REY3NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEQ0REY5NDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEQ0REZCNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IEQ0REZENDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEQ0REZGNDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEQ0REYxMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IEQ0REYzMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEQ0REY1MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEQ0REY3MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIEQ0REY5MDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEQ0REZCMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IEQ0REZEMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEQ0REZGMDFCXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEQ0REYxRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IEQ0REYzRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEQ0REY1Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEQ0REY3Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIEQ0REY5Rjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IEQ0REZCRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEQ0REZERjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIEQ0REZGRjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEQ0REYxQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEQ0REYzQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IEQ0REY1Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEQ0REY3Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEQ0REY5Qjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IEQ0REZCQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IEQ0REZEQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEQ0REZGQjc2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTY0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX3N5c3RlbSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJzeXN0ZW0uczogc3lzdGVtIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAic3lzdGVtLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMTgwMDVcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDAwMDBDMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDAwMDBDQTBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDAwNTBENjRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDAwNTBFNjRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDAwNDE4NjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDBBMDEwQTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDAwNDE4MjBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDE0NDE4NDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDAwMDA0QTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDE0MDA4QTRcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDAwMDA0MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDAxMDA0MDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMTQwMDA0RDJcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDRBNjExODdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDRBMTMxODdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDRBNjExQzdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDRBMTMxQzdcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDRBNDEzNDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDRBNDEzNjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDRBNDEzMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDRBNDEzMjZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDRBNDEzMDZcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDRBNDEwNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDRBNDIwNDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDRBNDEwMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDRBNDIwMDBcW15cbl0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MjddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fcHVyZ2Uge30geworICAgIHNldCB0ZXN0bmFtZSAicHVyZ2UuczogcHVyZ2UgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJwdXJnZS5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA0QTQxMjAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA0QTQxMjIwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA0QTQyMjAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA0QTQyMjIwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA0QTQxMjQwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA0QTQxMjYwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA0QTQyMjQwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA0QTQyMjYwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA0QTQxMzgwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA0QTQxM0EwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA0QTQxMjgwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA0QTQxMkEwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA0QTQyMjgwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA0QTQyMkEwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA0QTQxMkMwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA0QTQxMkUwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA0QTQyMkMwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA0QTQyMkUwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKworCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZnBfbWlzYyB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmcF9taXNjLnM6IGZwX21pc2MgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJmcF9taXNjLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzAwMDI0MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZm1lbSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmbWVtLnM6IGZtZW0gdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJmbWVtLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjRBNDAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI0QTQyMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNEE0MDAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMjRBNDIwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDJDQTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAyQ0E0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMkNBNDAwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDJDQTQyMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAyNEE0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMjRBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDI0QTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAyNEE0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMkNBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDJDQTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAyQ0E0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMkNBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDNDQTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzQ0E0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggM0NBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDNDQTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAyNEEwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMjRBMDMwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDI0QTAxMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAyQ0EwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMkNBMDMwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDJDQTAxMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAyNEEwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMjRBMDMyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDI0QTAxMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAyQ0EwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMkNBMDMyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDJDQTAxMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzQ0EwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgM0NBMDMyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDNDQTAxMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0zNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19mcF9jb21wIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImZwX2NvbXAuczogZnBfY29tcCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImZwX2NvbXAucyIgIi1hbCIKKworICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgorICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCisgICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCisgICAgIworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMEEwNDAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzBBMDQ4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwQTA1ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMjgwNDAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzI4MDQ4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDMwQTA2MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAzMEEwNjgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzBBMDc4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDMyODA2MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAzMjgwNjgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzBBMDgwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDMwQTA4ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAzMEEwOTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzI4MDgwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMyODA4ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAzMEEwQTAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzBBMEE4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMwQTBCODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAzMjgwQTAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzI4MEE4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDMwODgwNjBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAzMDg4MEUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzA4ODFFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDMyOTgwNjFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAzMjk4MEUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzI5ODFFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDMwODgyNjBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAzMDg4MkUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzA4ODNFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDMyOTgyNjFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAzMjk4MkUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzI5ODNFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDMwODg0NjBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAzMDg4NEUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzA4ODVFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDMyOTg0NjFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAzMjk4NEUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzI5ODVFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDMwODg2NjBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAzMDg4NkUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzA4ODdFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDMyOTg2NjFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAzMjk4NkUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzI5ODdFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDMwODg4NjBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAzMDg4OEUwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzA4ODlFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDMyOTg4NjFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAzMjk4OEUxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzI5ODlFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDE4MDEyMEUyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAxQTExQTREMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgOTgwMTIwRTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDlBMTFBNEQyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAzODg1NDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZnBfY29udiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmcF9jb252LnM6IGZwX2NvbnYgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJmcF9jb252LnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzBBMDAyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwQTAyMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMEEwNjIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzBBMDBBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDMwQTAyQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMEEwNkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzBBMDFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDMwQTAzQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMEEwN0EwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzI4MDAyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMyODAyMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMjgwNjIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzI4MDBBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDMyODAyQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMjgwNkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzI4MDFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDMyODAzQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMjgwN0ExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzBBMDgyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDMwQTBBMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMEEwRTIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzBBMDhBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDMwQTBBQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMEEwRUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzBBMDlBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDMwQTBCQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMEEwRkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzI4MDgyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDMyODBBMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMjgwRTIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzI4MDhBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDMyODBBQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMjgwRUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzI4MDlBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDMyODBCQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMjgwRkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzBBMTAyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDMwQTEyMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMEExNjIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzBBMTBBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDMwQTEyQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMEExNkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzBBMTFBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDMwQTEzQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMEExN0EwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzI4MTAyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDMyODEyMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMjgxNjIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzI4MTBBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDMyODEyQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAzMjgxNkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMzI4MTFBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDMyODEzQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAzMjgxN0ExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzBBMTgyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDMwQTFBMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAzMEExRTIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMzBBMThBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDMwQTFBQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAzMEExRUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMzBBMTlBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDMwQTFCQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAzMEExRkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMzI4MTgyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDMyODFBMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAzMjgxRTIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMzI4MThBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDMyODFBQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAzMjgxRUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMzI4MTlBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDMyODFCQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAzMjgxRkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZnBfZmNtcCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmcF9mY21wLnM6IGZwX2ZjbXAgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJmcF9mY21wLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzA4NTA0MDBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzA4NTA0MDFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzA4NTA0MDJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzA4NTA0MDNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMzA4NTA0MDRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMzA4NTA0MDVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzA4NTA0MDZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMzA4NTA0MDdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMzA4NTA0MDhcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzA4NTA0MDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMzA4NTA0MEFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMzA4NTA0MEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzA4NTA0MENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMzA4NTA0MERcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMzA4NTA0MEVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzA4NTA0MEZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMzA4NTA0MTBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMzA4NTA0MTFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzA4NTA0MTJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMzA4NTA0MTNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMzA4NTA0MTRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzA4NTA0MTVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMzA4NTA0MTZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMzA4NTA0MTdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzA4NTA0MThcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMzA4NTA0MTlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMzA4NTA0MUFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzA4NTA0MUJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMzA4NTA0MUNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMzA4NTA0MURcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzA4NTA0MUVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMzA4NTA0MUZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMzA4NTBDMDBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzA4NTBDMDFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMzA4NTBDMDJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMzA4NTBDMDNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzA4NTBDMDRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMzA4NTBDMDVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMzA4NTBDMDZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzA4NTBDMDdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMzA4NTBDMDhcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMzA4NTBDMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzA4NTBDMEFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMzA4NTBDMEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMzA4NTBDMENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzA4NTBDMERcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMzA4NTBDMEVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMzA4NTBDMEZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzA4NTBDMTBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMzA4NTBDMTFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMzA4NTBDMTJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMzA4NTBDMTNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMzA4NTBDMTRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMzA4NTBDMTVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzA4NTBDMTZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMzA4NTBDMTdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMzA4NTBDMThcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMzA4NTBDMTlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMzA4NTBDMUFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMzA4NTBDMUJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMzA4NTBDMUNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMzA4NTBDMURcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMzA4NTBDMUVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMzA4NTBDMUZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMzA4NTFDMDBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMzA4NTFDMDFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMzA4NTFDMDJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMzA4NTFDMDNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMzA4NTFDMDRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMzA4NTFDMDVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMzA4NTFDMDZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMzA4NTFDMDdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMzA4NTFDMDhcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMzA4NTFDMDlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggMzA4NTFDMEFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMzA4NTFDMEJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMzA4NTFDMENcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzQgMzA4NTFDMERcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMzA4NTFDMEVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMzA4NTFDMEZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgMzA4NTFDMTBcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgMzA4NTFDMTFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggMzA4NTFDMTJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgMzA4NTFDMTNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgMzA4NTFDMTRcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgMzA4NTFDMTVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggMzA4NTFDMTZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgMzA4NTFDMTdcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgMzA4NTFDMThcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgMzA4NTFDMTlcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggMzA4NTFDMUFcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgMzA4NTFDMUJcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgMzA4NTFDMUNcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgMzA4NTFDMURcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggMzA4NTFDMUVcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgMzA4NTFDMUZcW15cblxdKlxuIgl7c2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09OTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc3BlY2lhbCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJzcGVjaWFsLnM6IHNwZWNpYWwgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzcGVjaWFsLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDRBNDE2ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA0QTQxNkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNEE0MUE4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDRBNDFBQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc3BvcCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJzcG9wLnM6IHNwb3AgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgIyBUaGlzIHRpY2tsZXMgYSBidWcgaW4gdGhlIGV4cHJlc3Npb24gcGFyc2VyLgorICAgIGdhc19zdGFydCAic3BvcC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDEwMDAwMTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAxMDAwMTkxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMTAwMDAxMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDEwMDAxOTMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAxMDAwMkIwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMTAwMzlCMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDEwMDAyQjI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAxMDAzOUIyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMTBBMDA1MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDEwQTAxRDEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAxMEEwMDUyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMTBBMDFEMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDEwQzUwNzA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAxMEM1MUYxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMTBDNTA3MjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDEwQzUxRjMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19jb3ByIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImNvcHIuczogY29wciB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImNvcHIucyIgIi1hbCIKKworICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgorICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCisgICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCisgICAgIworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAzMDAwMDEwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMzAwMDA3MTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwMDAwMTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAzMDAwMDczM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19jb3BybWVtIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImNvcHJtZW0uczogY29wciBtZW1vcnkgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJjb3BybWVtLnMiICItYWwiCisKKyAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKKyAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcworICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgorICAgICMKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjQ4NTAxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI0ODUyMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNDg1MDEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMjQ4NTIxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDJDODUwMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAyQzg1MjExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMkM4NTAxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDJDODUyMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAyNDg1MDMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMjQ4NTIzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDI0ODUwMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAyNDg1MjMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMkM4NTAzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDJDODUyMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAyQzg1MDMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMkM4NTIzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDI0ODAxMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAyNDgwMzEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMjQ4MDExM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDJDODAxMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAyQzgwMzEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMkM4MDExM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDI0ODAxMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAyNDgwMzMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMjQ4MDEzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDJDODAxMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAyQzgwMzMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMkM4MDEzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTI4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2ZtZW1fTFJfdGVzdHMge30geworICAgIHNldCB0ZXN0bmFtZSAiZm1lbUxSYnVnLnM6IExSIHJlZ2lzdGVyIHNlbGVjdGlvbiBvbiBmcCBtZW0gaW5zdHJ1Y3Rpb25zIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiZm1lbUxSYnVnLnMiICItYWwiCisKKyAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI3NDAxMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNzQ4MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjc1MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDJGNDAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyRjQ4MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkY1MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDI3NDAxMDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyNzQ4MTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjc1MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDJGNDAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyRjQ4MTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMkY1MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDI3NDAxMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyNzQ4MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMjc1MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJGNDAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAyRjQ4MTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMkY1MDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDI3NDAxMDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAyNzQ4MTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMjc1MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDJGNDAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyRjQ4MTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMkY1MDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDI3NTkwMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDI3NTkwMDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDI3NTkwMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAyNzU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDI3NTkwMDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAyNzU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEU4NDBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK2lmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4geworICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgorICAgIGRvX2ltZW0KKyAgICBkb19pbW1lZAorICAgIGRvX2JyYW5jaAorICAgIGRvX2FkZAorICAgIGRvX3NoMWFkZAorICAgIGRvX3NoMmFkZAorICAgIGRvX3NoM2FkZAorICAgIGRvX3N1YgorICAgIGRvX2RzCisgICAgZG9fY29tY2xyCisgICAgZG9fbG9naWNhbAorICAgIGRvX3VuaXQKKyAgICBkb19kY29yCisgICAgZG9fYWRkaQorICAgIGRvX3N1YmkKKyAgICBkb19zaGlmdAorICAgIGRvX2V4dHJhY3QKKyAgICBkb19kZXBvc2l0CisgICAgZG9fc3lzdGVtCisgICAgZG9fcHVyZ2UKKyAgICBkb19mcF9taXNjCisgICAgZG9fZm1lbQorICAgIGRvX2ZwX2NvbXAKKyAgICBkb19mcF9jb252CisgICAgZG9fZnBfZmNtcAorICAgIGRvX3NwZWNpYWwKKyAgICBkb19zcG9wCisgICAgZG9fY29wcgorICAgIGRvX2NvcHJtZW0KKworICAgICMgVGhlICJ3ZWlyZC5zIiBmaWxlIGZyb20gdGhlIGdkYiB0ZXN0c3VpdGUuICBTaW1wbHkgdmVyaWZ5IGl0CisgICAgIyBhc3NlbWJsZXMuCisgICAgZ2FzX3Rlc3QgIndlaXJkLnMiICIiICIiICJzdGFicyBwYXJzaW5nIgorCisgICAgIyBUZXN0IHRoYXQgd2UgY29ycmVjdGx5IGFzc2VtYmxlIHNvbWUgRlAgbWVtb3J5IHRlc3RzIHdoaWNoCisgICAgIyBML1IgcmVnaXN0ZXIgc2VsZWN0cy4gIChSZWdyZXNzaW9uIHRlc3QgZm9yIGEgYnVnIFRlZ2UgZm91bmQpLgorICAgIGRvX2ZtZW1fTFJfdGVzdHMKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjgzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zCkBAIC0wLDAgKzEsMjI3IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgTW9yZSBicmFuY2hpbmcgaW5zdHJ1Y3Rpb25zIHRoYW4geW91IGV2ZXIga25ldyB3aGF0IHRvIGRvIHdpdGguCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KK2JyYW5jaF90ZXN0czogCisJYmwgYnJhbmNoX3Rlc3RzLCVyMgorCWJsLG4gYnJhbmNoX3Rlc3RzLCVyMgorCWIgYnJhbmNoX3Rlc3RzCisJYixuIGJyYW5jaF90ZXN0cworCWdhdGUgYnJhbmNoX3Rlc3RzLCVyMgorCWdhdGUsbiBicmFuY2hfdGVzdHMsJXIyCisJYmxyICVyNCwlcjIKKwlibHIsbiAlcjQsJXIyCisJYmxyICVyNCwlcjAKKwlibHIsbiAlcjQsJXIwCisJYnYgJXIwKCVyMikKKwlidixuICVyMCglcjIpCisJYmUgMHgxMjM0KCVzcjEsJXIyKQorCWJlLG4gMHgxMjM0KCVzcjEsJXIyKQorCWJsZSAweDEyMzQoJXNyMSwlcjIpCisJYmxlLG4gMHgxMjM0KCVzcjEsJXIyKQorCittb3ZiX3Rlc3RzOiAKKwltb3ZiICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLD0gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsPCAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92YixvZCAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yix0ciAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yiw8PiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yiw+PSAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92YixldiAlcjQsJXIyNixtb3ZiX3Rlc3RzCittb3ZiX251bGxpZmllZF90ZXN0czogCisJbW92YixuICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLD0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yiw8LG4gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsb2QsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yix0cixuICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLDw+LG4gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsPj0sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92YixldixuICVyNCwlcjI2LG1vdmJfdGVzdHMKKworbW92aWJfdGVzdHM6IAorCW1vdmliIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLD0gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsPCA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYixvZCA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYix0ciA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw8PiA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw+PSA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYixldiA1LCVyMjYsbW92aWJfdGVzdHMKK21vdmliX251bGxpZmllZF90ZXN0czogCisJbW92aWIsbiA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw9LG4gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsPCxuIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLG9kLG4gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsdHIsbiA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw8PixuIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLD49LG4gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsZXYsbiA1LCVyMjYsbW92aWJfdGVzdHMKKworY29tYl90ZXN0czogCisJY29tYiAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLD0gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw8ICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsPD0gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw8PCAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLDw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLHN2ICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsb2QgJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYix0ciAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLDw+ICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsPj0gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw+ICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsPj49ICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsPj4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYixuc3YgJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYixldiAlcjAsJXI0LGNvbWJfdGVzdHMKK2NvbWJfbnVsbGlmaWVkX3Rlc3RzOiAKKwljb21iLG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw8LG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw8PSxuICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsPDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLDw8PSxuICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLG9kLG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYix0cixuICVyMCwlcjQsY29tYl90ZXN0cworCWNvbWIsPD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLD49LG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYiw+Pj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLD4+LG4gJXIwLCVyNCxjb21iX3Rlc3RzCisJY29tYixuc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHMKKwljb21iLGV2LG4gJXIwLCVyNCxjb21iX3Rlc3RzCisKK2NvbWliX3Rlc3RzOiAKKwljb21pYiAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLDwgMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw8PSAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLDw8IDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPDw9IDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsc3YgMCwlcjQsY29taWJfdGVzdHMKKwljb21pYixvZCAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLHRyIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPD4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw+PSAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLD4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw+Pj0gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw+PiAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLG5zdiAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLGV2IDAsJXI0LGNvbWJfdGVzdHMKKworY29taWJfbnVsbGlmaWVkX3Rlc3RzOiAKKwljb21pYixuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPSxuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPCxuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPD0sbiAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLDw8LG4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw8PD0sbiAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLHN2LG4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYixvZCxuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsdHIsbiAwLCVyNCxjb21pYl90ZXN0cworCWNvbWliLDw+LG4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw+PSxuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPixuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsPj49LG4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYiw+PixuIDAsJXI0LGNvbWliX3Rlc3RzCisJY29taWIsbnN2LG4gMCwlcjQsY29taWJfdGVzdHMKKwljb21pYixldixuIDAsJXI0LGNvbWliX3Rlc3RzCisKKworCithZGRiX3Rlc3RzOiAKKwlhZGRiICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsPSAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLDwgJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYiw8PSAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLG51diAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLHpudiAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLHN2ICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsb2QgJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYix0ciAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLDw+ICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsPj0gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYiw+ICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsdXYgJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYix2bnogJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYixuc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYixldiAlcjEsJXI0LGFkZGJfdGVzdHMKK2FkZGJfbnVsbGlmaWVkX3Rlc3RzOiAKKwlhZGRiLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYiw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYiw8LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYiw8PSxuICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsbnV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYix6bnYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLHN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYixvZCxuICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsdHIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLDw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYiw+PSxuICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsPixuICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsdXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKKwlhZGRiLHZueixuICVyMSwlcjQsYWRkYl90ZXN0cworCWFkZGIsbnN2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCisJYWRkYixldixuICVyMSwlcjQsYWRkYl90ZXN0cworCithZGRpYl90ZXN0czogCisJYWRkaWIgLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsPSAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYiw8IC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLDw9IC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLG51diAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYix6bnYgLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsc3YgLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsb2QgLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsdHIgLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsPD4gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsPj0gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsPiAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYix1diAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYix2bnogLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsbnN2IC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLGV2IC0xLCVyNCxjb21iX3Rlc3RzCisKK2FkZGliX251bGxpZmllZF90ZXN0czogCisJYWRkaWIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYiw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsPCxuIC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLDw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsbnV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsem52LG4gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsc3YsbiAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYixvZCxuIC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLHRyLG4gLTEsJXI0LGFkZGliX3Rlc3RzCisJYWRkaWIsPD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYiw+PSxuIC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLD4sbiAtMSwlcjQsYWRkaWJfdGVzdHMKKwlhZGRpYix1dixuIC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLHZueixuIC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLG5zdixuIC0xLCVyNCxhZGRpYl90ZXN0cworCWFkZGliLGV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCisKKworOyBOZWVkcyB0byBjaGVjayBsb3RzIG9mIHN0dWZmIChsaWtlIGNvcm5lciBiaXQgY2FzZXMpCitiYl90ZXN0czogCisJYnZiLDwgJXI0LGJiX3Rlc3RzCisJYnZiLD49ICVyNCxiYl90ZXN0cworCWJ2Yiw8LG4gJXI0LGJiX3Rlc3RzCisJYnZiLD49LG4gJXI0LGJiX3Rlc3RzCisJYmIsPCAlcjQsNSxiYl90ZXN0cworCWJiLD49ICVyNCw1LGJiX3Rlc3RzCisJYmIsPCxuICVyNCw1LGJiX3Rlc3RzCisJYmIsPj0sbiAlcjQsNSxiYl90ZXN0cworCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29tY2xyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNWFhNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29tY2xyLnMKQEAgLTAsMCArMSw1MCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJY29tY2xyICVyNCwlcjUsJXI2CisJY29tY2xyLD0gJXI0LCVyNSwlcjYKKwljb21jbHIsPCAlcjQsJXI1LCVyNgorCWNvbWNsciw8PSAlcjQsJXI1LCVyNgorCWNvbWNsciw8PCAlcjQsJXI1LCVyNgorCWNvbWNsciw8PD0gJXI0LCVyNSwlcjYKKwljb21jbHIsc3YgJXI0LCVyNSwlcjYKKwljb21jbHIsb2QgJXI0LCVyNSwlcjYKKwljb21jbHIsdHIgJXI0LCVyNSwlcjYKKwljb21jbHIsPD4gJXI0LCVyNSwlcjYKKwljb21jbHIsPj0gJXI0LCVyNSwlcjYKKwljb21jbHIsPiAlcjQsJXI1LCVyNgorCWNvbWNsciw+Pj0gJXI0LCVyNSwlcjYKKwljb21jbHIsPj4gJXI0LCVyNSwlcjYKKwljb21jbHIsbnN2ICVyNCwlcjUsJXI2CisJY29tY2xyLGV2ICVyNCwlcjUsJXI2CisKKwljb21pY2xyIDEyMywlcjUsJXI2CisJY29taWNsciw9IDEyMywlcjUsJXI2CisJY29taWNsciw8IDEyMywlcjUsJXI2CisJY29taWNsciw8PSAxMjMsJXI1LCVyNgorCWNvbWljbHIsPDwgMTIzLCVyNSwlcjYKKwljb21pY2xyLDw8PSAxMjMsJXI1LCVyNgorCWNvbWljbHIsc3YgMTIzLCVyNSwlcjYKKwljb21pY2xyLG9kIDEyMywlcjUsJXI2CisJY29taWNscix0ciAxMjMsJXI1LCVyNgorCWNvbWljbHIsPD4gMTIzLCVyNSwlcjYKKwljb21pY2xyLD49IDEyMywlcjUsJXI2CisJY29taWNsciw+IDEyMywlcjUsJXI2CisJY29taWNsciw+Pj0gMTIzLCVyNSwlcjYKKwljb21pY2xyLD4+IDEyMywlcjUsJXI2CisJY29taWNscixuc3YgMTIzLCVyNSwlcjYKKwljb21pY2xyLGV2IDEyMywlcjUsJXI2CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjYjZhMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zCkBAIC0wLDAgKzEsMTkgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCitjb3ByX3Rlc3RzOiAKKwljb3ByLDQsNQorCWNvcHIsNCwxMTUKKwljb3ByLDQsNSxuCisJY29wciw0LDExNSxuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHJtZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZmYxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHJtZW0ucwpAQCAtMCwwICsxLDU1IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgY29wciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAorOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCis7IAorY29wcl9pbmRleGluZ19sb2FkIAorCisJY2xkd3gsNCAlcjUoJXNyMCwlcjQpLCVyMjYKKwljbGR3eCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2CisJY2xkd3gsNCxtICVyNSglc3IwLCVyNCksJXIyNgorCWNsZHd4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2CisJY2xkZHgsNCAlcjUoJXNyMCwlcjQpLCVyMjYKKwljbGRkeCw0LHMgJXI1KCVzcjAsJXI0KSwlcjI2CisJY2xkZHgsNCxtICVyNSglc3IwLCVyNCksJXIyNgorCWNsZGR4LDQsc20gJXI1KCVzcjAsJXI0KSwlcjI2CisKK2NvcHJfaW5kZXhpbmdfc3RvcmUgCisJY3N0d3gsNCAlcjI2LCVyNSglc3IwLCVyNCkKKwljc3R3eCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCisJY3N0d3gsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQorCWNzdHd4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCisJY3N0ZHgsNCAlcjI2LCVyNSglc3IwLCVyNCkKKwljc3RkeCw0LHMgJXIyNiwlcjUoJXNyMCwlcjQpCisJY3N0ZHgsNCxtICVyMjYsJXI1KCVzcjAsJXI0KQorCWNzdGR4LDQsc20gJXIyNiwlcjUoJXNyMCwlcjQpCisKK2NvcHJfc2hvcnRfbWVtb3J5IAorCWNsZHdzLDQgMCglc3IwLCVyNCksJXIyNgorCWNsZHdzLDQsbWIgMCglc3IwLCVyNCksJXIyNgorCWNsZHdzLDQsbWEgMCglc3IwLCVyNCksJXIyNgorCWNsZGRzLDQgMCglc3IwLCVyNCksJXIyNgorCWNsZGRzLDQsbWIgMCglc3IwLCVyNCksJXIyNgorCWNsZGRzLDQsbWEgMCglc3IwLCVyNCksJXIyNgorCWNzdHdzLDQgJXIyNiwwKCVzcjAsJXI0KQorCWNzdHdzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQorCWNzdHdzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQorCWNzdGRzLDQgJXIyNiwwKCVzcjAsJXI0KQorCWNzdGRzLDQsbWIgJXIyNiwwKCVzcjAsJXI0KQorCWNzdGRzLDQsbWEgJXIyNiwwKCVzcjAsJXI0KQorCis7IGdhcyBmdWNrcyB0aGlzIHVwIHRoaW5rcyBpdCBnZXRzIHRoZSBleHByZXNzaW9uIDQgbW9kdWxvIDUKKzsJY2xkd3gsNCAlcjUoMCwlcjQpLCVyJXIyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kY29yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc0NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kY29yLnMKQEAgLTAsMCArMSw0MSBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJZGNvciAlcjQsJXI1CisJZGNvcixzYnogJXI0LCVyNQorCWRjb3Isc2h6ICVyNCwlcjUKKwlkY29yLHNkYyAlcjQsJXI1CisJZGNvcixzYmMgJXI0LCVyNQorCWRjb3Isc2hjICVyNCwlcjUKKwlkY29yLHRyICVyNCwlcjUKKwlkY29yLG5ieiAlcjQsJXI1CisJZGNvcixuaHogJXI0LCVyNQorCWRjb3IsbmRjICVyNCwlcjUKKwlkY29yLG5iYyAlcjQsJXI1CisJZGNvcixuaGMgJXI0LCVyNQorCisJaWRjb3IgJXI0LCVyNQorCWlkY29yLHNieiAlcjQsJXI1CisJaWRjb3Isc2h6ICVyNCwlcjUKKwlpZGNvcixzZGMgJXI0LCVyNQorCWlkY29yLHNiYyAlcjQsJXI1CisJaWRjb3Isc2hjICVyNCwlcjUKKwlpZGNvcix0ciAlcjQsJXI1CisJaWRjb3IsbmJ6ICVyNCwlcjUKKwlpZGNvcixuaHogJXI0LCVyNQorCWlkY29yLG5kYyAlcjQsJXI1CisJaWRjb3IsbmJjICVyNCwlcjUKKwlpZGNvcixuaGMgJXI0LCVyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg1M2IzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMKQEAgLTAsMCArMSw4OCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJemRlcCAlcjQsNSwxMCwlcjYKKwl6ZGVwLD0gJXI0LDUsMTAsJXI2CisJemRlcCw8ICVyNCw1LDEwLCVyNgorCXpkZXAsb2QgJXI0LDUsMTAsJXI2CisJemRlcCx0ciAlcjQsNSwxMCwlcjYKKwl6ZGVwLDw+ICVyNCw1LDEwLCVyNgorCXpkZXAsPj0gJXI0LDUsMTAsJXI2CisJemRlcCxldiAlcjQsNSwxMCwlcjYKKworCWRlcCAlcjQsNSwxMCwlcjYKKwlkZXAsPSAlcjQsNSwxMCwlcjYKKwlkZXAsPCAlcjQsNSwxMCwlcjYKKwlkZXAsb2QgJXI0LDUsMTAsJXI2CisJZGVwLHRyICVyNCw1LDEwLCVyNgorCWRlcCw8PiAlcjQsNSwxMCwlcjYKKwlkZXAsPj0gJXI0LDUsMTAsJXI2CisJZGVwLGV2ICVyNCw1LDEwLCVyNgorCisJenZkZXAgJXI0LDUsJXI2CisJenZkZXAsPSAlcjQsNSwlcjYKKwl6dmRlcCw8ICVyNCw1LCVyNgorCXp2ZGVwLG9kICVyNCw1LCVyNgorCXp2ZGVwLHRyICVyNCw1LCVyNgorCXp2ZGVwLDw+ICVyNCw1LCVyNgorCXp2ZGVwLD49ICVyNCw1LCVyNgorCXp2ZGVwLGV2ICVyNCw1LCVyNgorCisJdmRlcCAlcjQsNSwlcjYKKwl2ZGVwLD0gJXI0LDUsJXI2CisJdmRlcCw8ICVyNCw1LCVyNgorCXZkZXAsb2QgJXI0LDUsJXI2CisJdmRlcCx0ciAlcjQsNSwlcjYKKwl2ZGVwLDw+ICVyNCw1LCVyNgorCXZkZXAsPj0gJXI0LDUsJXI2CisJdmRlcCxldiAlcjQsNSwlcjYKKworCXZkZXBpIC0xLDUsJXI2CisJdmRlcGksPSAtMSw1LCVyNgorCXZkZXBpLDwgLTEsNSwlcjYKKwl2ZGVwaSxvZCAtMSw1LCVyNgorCXZkZXBpLHRyIC0xLDUsJXI2CisJdmRlcGksPD4gLTEsNSwlcjYKKwl2ZGVwaSw+PSAtMSw1LCVyNgorCXZkZXBpLGV2IC0xLDUsJXI2CisKKwl6dmRlcGkgLTEsNSwlcjYKKwl6dmRlcGksPSAtMSw1LCVyNgorCXp2ZGVwaSw8IC0xLDUsJXI2CisJenZkZXBpLG9kIC0xLDUsJXI2CisJenZkZXBpLHRyIC0xLDUsJXI2CisJenZkZXBpLDw+IC0xLDUsJXI2CisJenZkZXBpLD49IC0xLDUsJXI2CisJenZkZXBpLGV2IC0xLDUsJXI2CisKKwlkZXBpIC0xLDQsMTAsJXI2CisJZGVwaSw9IC0xLDQsMTAsJXI2CisJZGVwaSw8IC0xLDQsMTAsJXI2CisJZGVwaSxvZCAtMSw0LDEwLCVyNgorCWRlcGksdHIgLTEsNCwxMCwlcjYKKwlkZXBpLDw+IC0xLDQsMTAsJXI2CisJZGVwaSw+PSAtMSw0LDEwLCVyNgorCWRlcGksZXYgLTEsNCwxMCwlcjYKKworCXpkZXBpIC0xLDQsMTAsJXI2CisJemRlcGksPSAtMSw0LDEwLCVyNgorCXpkZXBpLDwgLTEsNCwxMCwlcjYKKwl6ZGVwaSxvZCAtMSw0LDEwLCVyNgorCXpkZXBpLHRyIC0xLDQsMTAsJXI2CisJemRlcGksPD4gLTEsNCwxMCwlcjYKKwl6ZGVwaSw+PSAtMSw0LDEwLCVyNgorCXpkZXBpLGV2IC0xLDQsMTAsJXI2CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMxZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zCkBAIC0wLDAgKzEsMzIgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorCWRzICVyNCwlcjUsJXI2CisJZHMsPSAlcjQsJXI1LCVyNgorCWRzLDwgJXI0LCVyNSwlcjYKKwlkcyw8PSAlcjQsJXI1LCVyNgorCWRzLDw8ICVyNCwlcjUsJXI2CisJZHMsPDw9ICVyNCwlcjUsJXI2CisJZHMsc3YgJXI0LCVyNSwlcjYKKwlkcyxvZCAlcjQsJXI1LCVyNgorCWRzLHRyICVyNCwlcjUsJXI2CisJZHMsPD4gJXI0LCVyNSwlcjYKKwlkcyw+PSAlcjQsJXI1LCVyNgorCWRzLD4gJXI0LCVyNSwlcjYKKwlkcyw+Pj0gJXI0LCVyNSwlcjYKKwlkcyw+PiAlcjQsJXI1LCVyNgorCWRzLG5zdiAlcjQsJXI1LCVyNgorCWRzLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDMwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2V4dHJhY3QucwpAQCAtMCwwICsxLDUxIEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKwlleHRydSAlcjQsNSwxMCwlcjYKKwlleHRydSw9ICVyNCw1LDEwLCVyNgorCWV4dHJ1LDwgJXI0LDUsMTAsJXI2CisJZXh0cnUsb2QgJXI0LDUsMTAsJXI2CisJZXh0cnUsdHIgJXI0LDUsMTAsJXI2CisJZXh0cnUsPD4gJXI0LDUsMTAsJXI2CisJZXh0cnUsPj0gJXI0LDUsMTAsJXI2CisJZXh0cnUsZXYgJXI0LDUsMTAsJXI2CisKKwlleHRycyAlcjQsNSwxMCwlcjYKKwlleHRycyw9ICVyNCw1LDEwLCVyNgorCWV4dHJzLDwgJXI0LDUsMTAsJXI2CisJZXh0cnMsb2QgJXI0LDUsMTAsJXI2CisJZXh0cnMsdHIgJXI0LDUsMTAsJXI2CisJZXh0cnMsPD4gJXI0LDUsMTAsJXI2CisJZXh0cnMsPj0gJXI0LDUsMTAsJXI2CisJZXh0cnMsZXYgJXI0LDUsMTAsJXI2CisKKwl2ZXh0cnUgJXI0LDUsJXI2CisJdmV4dHJ1LD0gJXI0LDUsJXI2CisJdmV4dHJ1LDwgJXI0LDUsJXI2CisJdmV4dHJ1LG9kICVyNCw1LCVyNgorCXZleHRydSx0ciAlcjQsNSwlcjYKKwl2ZXh0cnUsPD4gJXI0LDUsJXI2CisJdmV4dHJ1LD49ICVyNCw1LCVyNgorCXZleHRydSxldiAlcjQsNSwlcjYKKworCXZleHRycyAlcjQsNSwlcjYKKwl2ZXh0cnMsPSAlcjQsNSwlcjYKKwl2ZXh0cnMsPCAlcjQsNSwlcjYKKwl2ZXh0cnMsb2QgJXI0LDUsJXI2CisJdmV4dHJzLHRyICVyNCw1LCVyNgorCXZleHRycyw8PiAlcjQsNSwlcjYKKwl2ZXh0cnMsPj0gJXI0LDUsJXI2CisJdmV4dHJzLGV2ICVyNCw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW0ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzMwYjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMKQEAgLTAsMCArMSw1MiBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJZmxkd3ggJXI0KCVzcjAsJXI1KSwlZnI2CisJZmxkd3gscyAlcjQoJXNyMCwlcjUpLCVmcjYKKwlmbGR3eCxtICVyNCglc3IwLCVyNSksJWZyNgorCWZsZHd4LHNtICVyNCglc3IwLCVyNSksJWZyNgorCWZsZGR4ICVyNCglc3IwLCVyNSksJWZyNgorCWZsZGR4LHMgJXI0KCVzcjAsJXI1KSwlZnI2CisJZmxkZHgsbSAlcjQoJXNyMCwlcjUpLCVmcjYKKwlmbGRkeCxzbSAlcjQoJXNyMCwlcjUpLCVmcjYKKwlmc3R3eCAlZnI2LCVyNCglc3IwLCVyNSkKKwlmc3R3eCxzICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdHd4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0d3gsc20gJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0ZHggJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0ZHgscyAlZnI2LCVyNCglc3IwLCVyNSkKKwlmc3RkeCxtICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdGR4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdHF4ICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdHF4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0cXgsbSAlZnI2LCVyNCglc3IwLCVyNSkKKwlmc3RxeCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKKworCWZsZHdzIDAoJXNyMCwlcjUpLCVmcjYKKwlmbGR3cyxtYiAwKCVzcjAsJXI1KSwlZnI2CisJZmxkd3MsbWEgMCglc3IwLCVyNSksJWZyNgorCWZsZGRzIDAoJXNyMCwlcjUpLCVmcjYKKwlmbGRkcyxtYiAwKCVzcjAsJXI1KSwlZnI2CisJZmxkZHMsbWEgMCglc3IwLCVyNSksJWZyNgorCWZzdHdzICVmcjYsMCglc3IwLCVyNSkKKwlmc3R3cyxtYiAlZnI2LDAoJXNyMCwlcjUpCisJZnN0d3MsbWEgJWZyNiwwKCVzcjAsJXI1KQorCWZzdGRzICVmcjYsMCglc3IwLCVyNSkKKwlmc3RkcyxtYiAlZnI2LDAoJXNyMCwlcjUpCisJZnN0ZHMsbWEgJWZyNiwwKCVzcjAsJXI1KQorCWZzdHFzICVmcjYsMCglc3IwLCVyNSkKKwlmc3RxcyxtYiAlZnI2LDAoJXNyMCwlcjUpCisJZnN0cXMsbWEgJWZyNiwwKCVzcjAsJXI1KQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtTFJidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMzBiYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMKQEAgLTAsMCArMSw3NiBAQAorCS5jb2RlCisJLmV4cG9ydAkJZgorZgorCS5wcm9jCisJLmNhbGxpbmZvCWZyYW1lPTAsbm9fY2FsbHMKKwkuZW50cnkKKworCWZzdHdzCQklZnI2UiwwKCVyMjYpCisJZnN0d3MJCSVmcjZMLDQoJXIyNikKKwlmc3R3cwkJJWZyNiw4KCVyMjYpCisKKwlmc3RkcwkJJWZyNlIsMCglcjI2KQorCWZzdGRzCQklZnI2TCw0KCVyMjYpCisJZnN0ZHMJCSVmcjYsOCglcjI2KQorCisJZmxkd3MJCTAoJXIyNiksJWZyNlIKKwlmbGR3cwkJNCglcjI2KSwlZnI2TAorCWZsZHdzCQk4KCVyMjYpLCVmcjYKKworCWZsZGRzCQkwKCVyMjYpLCVmcjZSCisJZmxkZHMJCTQoJXIyNiksJWZyNkwKKwlmbGRkcwkJOCglcjI2KSwlZnI2CisKKwlmc3R3cwkJJWZyNlIsMCglc3IwLCVyMjYpCisJZnN0d3MJCSVmcjZMLDQoJXNyMCwlcjI2KQorCWZzdHdzCQklZnI2LDgoJXNyMCwlcjI2KQorCisJZnN0ZHMJCSVmcjZSLDAoJXNyMCwlcjI2KQorCWZzdGRzCQklZnI2TCw0KCVzcjAsJXIyNikKKwlmc3RkcwkJJWZyNiw4KCVzcjAsJXIyNikKKworCWZsZHdzCQkwKCVzcjAsJXIyNiksJWZyNlIKKwlmbGR3cwkJNCglc3IwLCVyMjYpLCVmcjZMCisJZmxkd3MJCTgoJXNyMCwlcjI2KSwlZnI2CisKKwlmbGRkcwkJMCglc3IwLCVyMjYpLCVmcjZSCisJZmxkZHMJCTQoJXNyMCwlcjI2KSwlZnI2TAorCWZsZGRzCQk4KCVzcjAsJXIyNiksJWZyNgorCisJZnN0d3gJCSVmcjZSLCVyMjUoJXIyNikKKwlmc3R3eAkJJWZyNkwsJXIyNSglcjI2KQorCWZzdHd4CQklZnI2LCVyMjUoJXIyNikKKworCWZzdGR4CQklZnI2UiwlcjI1KCVyMjYpCisJZnN0ZHgJCSVmcjZMLCVyMjUoJXIyNikKKwlmc3RkeAkJJWZyNiwlcjI1KCVyMjYpCisKKwlmbGR3eAkJJXIyNSglcjI2KSwlZnI2UgorCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZMCisJZmxkd3gJCSVyMjUoJXIyNiksJWZyNgorCisJZmxkZHgJCSVyMjUoJXIyNiksJWZyNlIKKwlmbGRkeAkJJXIyNSglcjI2KSwlZnI2TAorCWZsZGR4CQklcjI1KCVyMjYpLCVmcjYKKworCWZzdHd4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKKwlmc3R3eAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCisJZnN0d3gJCSVmcjYsJXIyNSglc3IwLCVyMjYpCisKKwlmc3RkeAkJJWZyNlIsJXIyNSglc3IwLCVyMjYpCisJZnN0ZHgJCSVmcjZMLCVyMjUoJXNyMCwlcjI2KQorCWZzdGR4CQklZnI2LCVyMjUoJXNyMCwlcjI2KQorCisJZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgorCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKKwlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKKworCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNlIKKwlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjZMCisJZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2CisKKwlidgkJJXIwKCVyMikKKwlub3AKKworCS5leGl0CisJLnByb2NlbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29tcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwMTdmNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfY29tcC5zCkBAIC0wLDAgKzEsODEgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorCWZjcHksc2dsICVmcjUsJWZyMTAKKwlmY3B5LGRibCAlZnI1LCVmcjEwCisJZmNweSxxdWFkICVmcjUsJWZyMTAKKwlmY3B5LHNnbCAlZnIyMCwlZnIyNAorCWZjcHksZGJsICVmcjIwLCVmcjI0CisKKwlmYWJzLHNnbCAlZnI1LCVmcjEwCisJZmFicyxkYmwgJWZyNSwlZnIxMAorCWZhYnMscXVhZCAlZnI1LCVmcjEwCisJZmFicyxzZ2wgJWZyMjAsJWZyMjQKKwlmYWJzLGRibCAlZnIyMCwlZnIyNAorCisJZnNxcnQsc2dsICVmcjUsJWZyMTAKKwlmc3FydCxkYmwgJWZyNSwlZnIxMAorCWZzcXJ0LHF1YWQgJWZyNSwlZnIxMAorCWZzcXJ0LHNnbCAlZnIyMCwlZnIyNAorCWZzcXJ0LGRibCAlZnIyMCwlZnIyNAorCisJZnJuZCxzZ2wgJWZyNSwlZnIxMAorCWZybmQsZGJsICVmcjUsJWZyMTAKKwlmcm5kLHF1YWQgJWZyNSwlZnIxMAorCWZybmQsc2dsICVmcjIwLCVmcjI0CisJZnJuZCxkYmwgJWZyMjAsJWZyMjQKKwkKKwlmYWRkLHNnbCAlZnI0LCVmcjgsJWZyMTIKKwlmYWRkLGRibCAlZnI0LCVmcjgsJWZyMTIKKwlmYWRkLHF1YWQgJWZyNCwlZnI4LCVmcjEyCisJZmFkZCxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKKwlmYWRkLGRibCAlZnIyMCwlZnIyNCwlZnIyOAorCWZhZGQscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAorCisJZnN1YixzZ2wgJWZyNCwlZnI4LCVmcjEyCisJZnN1YixkYmwgJWZyNCwlZnI4LCVmcjEyCisJZnN1YixxdWFkICVmcjQsJWZyOCwlZnIxMgorCWZzdWIsc2dsICVmcjIwLCVmcjI0LCVmcjI4CisJZnN1YixkYmwgJWZyMjAsJWZyMjQsJWZyMjgKKwlmc3ViLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKKworCWZtcHksc2dsICVmcjQsJWZyOCwlZnIxMgorCWZtcHksZGJsICVmcjQsJWZyOCwlZnIxMgorCWZtcHkscXVhZCAlZnI0LCVmcjgsJWZyMTIKKwlmbXB5LHNnbCAlZnIyMCwlZnIyNCwlZnIyOAorCWZtcHksZGJsICVmcjIwLCVmcjI0LCVmcjI4CisJZm1weSxxdWFkICVmcjIwLCVmcjI0LCVmcjI4CisKKwlmZGl2LHNnbCAlZnI0LCVmcjgsJWZyMTIKKwlmZGl2LGRibCAlZnI0LCVmcjgsJWZyMTIKKwlmZGl2LHF1YWQgJWZyNCwlZnI4LCVmcjEyCisJZmRpdixzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKKwlmZGl2LGRibCAlZnIyMCwlZnIyNCwlZnIyOAorCWZkaXYscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAorCisJZnJlbSxzZ2wgJWZyNCwlZnI4LCVmcjEyCisJZnJlbSxkYmwgJWZyNCwlZnI4LCVmcjEyCisJZnJlbSxxdWFkICVmcjQsJWZyOCwlZnIxMgorCWZyZW0sc2dsICVmcjIwLCVmcjI0LCVmcjI4CisJZnJlbSxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKKwlmcmVtLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKKworCWZtcHlhZGQsc2dsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCisJZm1weWFkZCxkYmwgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKKwlmbXB5c3ViLHNnbCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAorCWZtcHlzdWIsZGJsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCisKKwl4bXB5dSAlZnI0LCVmcjUsJWZyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQ0Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMKQEAgLTAsMCArMSw5MiBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJZmNudmZmLHNnbCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZmZixzZ2wsZGJsICVmcjUsJWZyMTAKKwlmY252ZmYsc2dsLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZmZixkYmwsc2dsICVmcjUsJWZyMTAKKwlmY252ZmYsZGJsLGRibCAlZnI1LCVmcjEwCisJZmNudmZmLGRibCxxdWFkICVmcjUsJWZyMTAKKwlmY252ZmYscXVhZCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZmZixxdWFkLGRibCAlZnI1LCVmcjEwCisJZmNudmZmLHF1YWQscXVhZCAlZnI1LCVmcjEwCisJZmNudmZmLHNnbCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252ZmYsc2dsLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmZixzZ2wscXVhZCAlZnIyMCwlZnIyNAorCWZjbnZmZixkYmwsc2dsICVmcjIwLCVmcjI0CisJZmNudmZmLGRibCxkYmwgJWZyMjAsJWZyMjQKKwlmY252ZmYsZGJsLHF1YWQgJWZyMjAsJWZyMjQKKwlmY252ZmYscXVhZCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252ZmYscXVhZCxkYmwgJWZyMjAsJWZyMjQKKwlmY252ZmYscXVhZCxxdWFkICVmcjIwLCVmcjI0CisKKwlmY252eGYsc2dsLHNnbCAlZnI1LCVmcjEwCisJZmNudnhmLHNnbCxkYmwgJWZyNSwlZnIxMAorCWZjbnZ4ZixzZ2wscXVhZCAlZnI1LCVmcjEwCisJZmNudnhmLGRibCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZ4ZixkYmwsZGJsICVmcjUsJWZyMTAKKwlmY252eGYsZGJsLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZ4ZixxdWFkLHNnbCAlZnI1LCVmcjEwCisJZmNudnhmLHF1YWQsZGJsICVmcjUsJWZyMTAKKwlmY252eGYscXVhZCxxdWFkICVmcjUsJWZyMTAKKwlmY252eGYsc2dsLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZ4ZixzZ2wsZGJsICVmcjIwLCVmcjI0CisJZmNudnhmLHNnbCxxdWFkICVmcjIwLCVmcjI0CisJZmNudnhmLGRibCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252eGYsZGJsLGRibCAlZnIyMCwlZnIyNAorCWZjbnZ4ZixkYmwscXVhZCAlZnIyMCwlZnIyNAorCWZjbnZ4ZixxdWFkLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZ4ZixxdWFkLGRibCAlZnIyMCwlZnIyNAorCWZjbnZ4ZixxdWFkLHF1YWQgJWZyMjAsJWZyMjQKKworCWZjbnZmeCxzZ2wsc2dsICVmcjUsJWZyMTAKKwlmY252Zngsc2dsLGRibCAlZnI1LCVmcjEwCisJZmNudmZ4LHNnbCxxdWFkICVmcjUsJWZyMTAKKwlmY252ZngsZGJsLHNnbCAlZnI1LCVmcjEwCisJZmNudmZ4LGRibCxkYmwgJWZyNSwlZnIxMAorCWZjbnZmeCxkYmwscXVhZCAlZnI1LCVmcjEwCisJZmNudmZ4LHF1YWQsc2dsICVmcjUsJWZyMTAKKwlmY252ZngscXVhZCxkYmwgJWZyNSwlZnIxMAorCWZjbnZmeCxxdWFkLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZmeCxzZ2wsc2dsICVmcjIwLCVmcjI0CisJZmNudmZ4LHNnbCxkYmwgJWZyMjAsJWZyMjQKKwlmY252Zngsc2dsLHF1YWQgJWZyMjAsJWZyMjQKKwlmY252ZngsZGJsLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZmeCxkYmwsZGJsICVmcjIwLCVmcjI0CisJZmNudmZ4LGRibCxxdWFkICVmcjIwLCVmcjI0CisJZmNudmZ4LHF1YWQsc2dsICVmcjIwLCVmcjI0CisJZmNudmZ4LHF1YWQsZGJsICVmcjIwLCVmcjI0CisJZmNudmZ4LHF1YWQscXVhZCAlZnIyMCwlZnIyNAorCisJZmNudmZ4dCxzZ2wsc2dsICVmcjUsJWZyMTAKKwlmY252Znh0LHNnbCxkYmwgJWZyNSwlZnIxMAorCWZjbnZmeHQsc2dsLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZmeHQsZGJsLHNnbCAlZnI1LCVmcjEwCisJZmNudmZ4dCxkYmwsZGJsICVmcjUsJWZyMTAKKwlmY252Znh0LGRibCxxdWFkICVmcjUsJWZyMTAKKwlmY252Znh0LHF1YWQsc2dsICVmcjUsJWZyMTAKKwlmY252Znh0LHF1YWQsZGJsICVmcjUsJWZyMTAKKwlmY252Znh0LHF1YWQscXVhZCAlZnI1LCVmcjEwCisJZmNudmZ4dCxzZ2wsc2dsICVmcjIwLCVmcjI0CisJZmNudmZ4dCxzZ2wsZGJsICVmcjIwLCVmcjI0CisJZmNudmZ4dCxzZ2wscXVhZCAlZnIyMCwlZnIyNAorCWZjbnZmeHQsZGJsLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZmeHQsZGJsLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmeHQsZGJsLHF1YWQgJWZyMjAsJWZyMjQKKwlmY252Znh0LHF1YWQsc2dsICVmcjIwLCVmcjI0CisJZmNudmZ4dCxxdWFkLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmeHQscXVhZCxxdWFkICVmcjIwLCVmcjI0CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfZmNtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9mY21wLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMDkyYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfZmNtcC5zCkBAIC0wLDAgKzEsMTE0IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKwlmY21wLHNnbCxmYWxzZT8gJWZyNCwlZnI1CisJZmNtcCxzZ2wsZmFsc2UgJWZyNCwlZnI1CisJZmNtcCxzZ2wsPyAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPD0+ICVmcjQsJWZyNQorCWZjbXAsc2dsLD0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsPVQgJWZyNCwlZnI1CisJZmNtcCxzZ2wsPz0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsITw+ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE/Pj0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsPCAlZnI0LCVmcjUKKwlmY21wLHNnbCw/PCAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPj0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsIT8+ICVmcjQsJWZyNQorCWZjbXAsc2dsLDw9ICVmcjQsJWZyNQorCWZjbXAsc2dsLD88PSAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPiAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPzw9ICVmcjQsJWZyNQorCWZjbXAsc2dsLD4gJWZyNCwlZnI1CisJZmNtcCxzZ2wsPz4gJWZyNCwlZnI1CisJZmNtcCxzZ2wsITw9ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE/PCAlZnI0LCVmcjUKKwlmY21wLHNnbCw+PSAlZnI0LCVmcjUKKwlmY21wLHNnbCw/Pj0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsITwgJWZyNCwlZnI1CisJZmNtcCxzZ2wsIT89ICVmcjQsJWZyNQorCWZjbXAsc2dsLDw+ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE9ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE9VCAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPyAlZnI0LCVmcjUKKwlmY21wLHNnbCw8PT4gJWZyNCwlZnI1CisJZmNtcCxzZ2wsdHJ1ZT8gJWZyNCwlZnI1CisJZmNtcCxzZ2wsdHJ1ZSAlZnI0LCVmcjUKKworCWZjbXAsZGJsLGZhbHNlPyAlZnI0LCVmcjUKKwlmY21wLGRibCxmYWxzZSAlZnI0LCVmcjUKKwlmY21wLGRibCw/ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE8PT4gJWZyNCwlZnI1CisJZmNtcCxkYmwsPSAlZnI0LCVmcjUKKwlmY21wLGRibCw9VCAlZnI0LCVmcjUKKwlmY21wLGRibCw/PSAlZnI0LCVmcjUKKwlmY21wLGRibCwhPD4gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT8+PSAlZnI0LCVmcjUKKwlmY21wLGRibCw8ICVmcjQsJWZyNQorCWZjbXAsZGJsLD88ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE+PSAlZnI0LCVmcjUKKwlmY21wLGRibCwhPz4gJWZyNCwlZnI1CisJZmNtcCxkYmwsPD0gJWZyNCwlZnI1CisJZmNtcCxkYmwsPzw9ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE+ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE/PD0gJWZyNCwlZnI1CisJZmNtcCxkYmwsPiAlZnI0LCVmcjUKKwlmY21wLGRibCw/PiAlZnI0LCVmcjUKKwlmY21wLGRibCwhPD0gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT88ICVmcjQsJWZyNQorCWZjbXAsZGJsLD49ICVmcjQsJWZyNQorCWZjbXAsZGJsLD8+PSAlZnI0LCVmcjUKKwlmY21wLGRibCwhPCAlZnI0LCVmcjUKKwlmY21wLGRibCwhPz0gJWZyNCwlZnI1CisJZmNtcCxkYmwsPD4gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT0gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT1UICVmcjQsJWZyNQorCWZjbXAsZGJsLCE/ICVmcjQsJWZyNQorCWZjbXAsZGJsLDw9PiAlZnI0LCVmcjUKKwlmY21wLGRibCx0cnVlPyAlZnI0LCVmcjUKKwlmY21wLGRibCx0cnVlICVmcjQsJWZyNQorCisJZmNtcCxxdWFkLGZhbHNlPyAlZnI0LCVmcjUKKwlmY21wLHF1YWQsZmFsc2UgJWZyNCwlZnI1CisJZmNtcCxxdWFkLD8gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE8PT4gJWZyNCwlZnI1CisJZmNtcCxxdWFkLD0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLD1UICVmcjQsJWZyNQorCWZjbXAscXVhZCw/PSAlZnI0LCVmcjUKKwlmY21wLHF1YWQsITw+ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPz49ICVmcjQsJWZyNQorCWZjbXAscXVhZCw8ICVmcjQsJWZyNQorCWZjbXAscXVhZCw/PCAlZnI0LCVmcjUKKwlmY21wLHF1YWQsIT49ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPz4gJWZyNCwlZnI1CisJZmNtcCxxdWFkLDw9ICVmcjQsJWZyNQorCWZjbXAscXVhZCw/PD0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE+ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPzw9ICVmcjQsJWZyNQorCWZjbXAscXVhZCw+ICVmcjQsJWZyNQorCWZjbXAscXVhZCw/PiAlZnI0LCVmcjUKKwlmY21wLHF1YWQsITw9ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPzwgJWZyNCwlZnI1CisJZmNtcCxxdWFkLD49ICVmcjQsJWZyNQorCWZjbXAscXVhZCw/Pj0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE8ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPz0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLDw+ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPSAlZnI0LCVmcjUKKwlmY21wLHF1YWQsIT1UICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPyAlZnI0LCVmcjUKKwlmY21wLHF1YWQsPD0+ICVmcjQsJWZyNQorCWZjbXAscXVhZCx0cnVlPyAlZnI0LCVmcjUKKwlmY21wLHF1YWQsdHJ1ZSAlZnI0LCVmcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2YWMwNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfbWlzYy5zCkBAIC0wLDAgKzEsMTggQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorZnB1X21pc2NfdGVzdHM6IAorCWZ0ZXN0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1lbS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDljMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucwpAQCAtMCwwICsxLDkzIEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuRVhQT1JUIGludGVnZXJfbWVtb3J5X3Rlc3RzLENPREUKKwkuRVhQT1JUIGludGVnZXJfaW5kZXhpbmdfbG9hZCxDT0RFCisJLkVYUE9SVCBpbnRlZ2VyX2xvYWRfc2hvcnRfbWVtb3J5LENPREUKKwkuRVhQT1JUIGludGVnZXJfc3RvcmVfc2hvcnRfbWVtb3J5LENPREUKKwkuRVhQT1JUIG1haW4sQ09ERQorCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgorOyBCYXNpYyBpbnRlZ2VyIG1lbW9yeSB0ZXN0cyB3aGljaCBhbHNvIHRlc3QgdGhlIHZhcmlvdXMgCis7IGFkZHJlc3NpbmcgbW9kZXMgYW5kIGNvbXBsZXRlcnMuCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKzsgCitpbnRlZ2VyX21lbW9yeV90ZXN0czogCisJbGR3IDAoJXNyMCwlcjQpLCVyMjYKKwlsZGggMCglc3IwLCVyNCksJXIyNgorCWxkYiAwKCVzcjAsJXI0KSwlcjI2CisJc3R3ICVyMjYsMCglc3IwLCVyNCkKKwlzdGggJXIyNiwwKCVzcjAsJXI0KQorCXN0YiAlcjI2LDAoJXNyMCwlcjQpCisKKzsgU2hvdWxkIG1ha2Ugc3VyZSBwcmUvcG9zdCBtb2RlcyBhcmUgcmVjb2duaXplZCBjb3JyZWN0bHkuCisJbGR3bSAwKCVzcjAsJXI0KSwlcjI2CisJc3R3bSAlcjI2LDAoJXNyMCwlcjQpCisKK2ludGVnZXJfaW5kZXhpbmdfbG9hZDogCisJbGR3eCAlcjUoJXNyMCwlcjQpLCVyMjYKKwlsZHd4LHMgJXI1KCVzcjAsJXI0KSwlcjI2CisJbGR3eCxtICVyNSglc3IwLCVyNCksJXIyNgorCWxkd3gsc20gJXI1KCVzcjAsJXI0KSwlcjI2CisJbGRoeCAlcjUoJXNyMCwlcjQpLCVyMjYKKwlsZGh4LHMgJXI1KCVzcjAsJXI0KSwlcjI2CisJbGRoeCxtICVyNSglc3IwLCVyNCksJXIyNgorCWxkaHgsc20gJXI1KCVzcjAsJXI0KSwlcjI2CisJbGRieCAlcjUoJXNyMCwlcjQpLCVyMjYKKwlsZGJ4LHMgJXI1KCVzcjAsJXI0KSwlcjI2CisJbGRieCxtICVyNSglc3IwLCVyNCksJXIyNgorCWxkYngsc20gJXI1KCVzcjAsJXI0KSwlcjI2CisJbGR3YXggJXI1KCVyNCksJXIyNgorCWxkd2F4LHMgJXI1KCVyNCksJXIyNgorCWxkd2F4LG0gJXI1KCVyNCksJXIyNgorCWxkd2F4LHNtICVyNSglcjQpLCVyMjYKKwlsZGN3eCAlcjUoJXNyMCwlcjQpLCVyMjYKKwlsZGN3eCxzICVyNSglc3IwLCVyNCksJXIyNgorCWxkY3d4LG0gJXI1KCVzcjAsJXI0KSwlcjI2CisJbGRjd3gsc20gJXI1KCVzcjAsJXI0KSwlcjI2CisKK2ludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnk6IAorCWxkd3MgMCglc3IwLCVyNCksJXIyNgorCWxkd3MsbWIgMCglc3IwLCVyNCksJXIyNgorCWxkd3MsbWEgMCglc3IwLCVyNCksJXIyNgorCWxkaHMgMCglc3IwLCVyNCksJXIyNgorCWxkaHMsbWIgMCglc3IwLCVyNCksJXIyNgorCWxkaHMsbWEgMCglc3IwLCVyNCksJXIyNgorCWxkYnMgMCglc3IwLCVyNCksJXIyNgorCWxkYnMsbWIgMCglc3IwLCVyNCksJXIyNgorCWxkYnMsbWEgMCglc3IwLCVyNCksJXIyNgorCWxkd2FzIDAoJXI0KSwlcjI2CisJbGR3YXMsbWIgMCglcjQpLCVyMjYKKwlsZHdhcyxtYSAwKCVyNCksJXIyNgorCWxkY3dzIDAoJXNyMCwlcjQpLCVyMjYKKwlsZGN3cyxtYiAwKCVzcjAsJXI0KSwlcjI2CisJbGRjd3MsbWEgMCglc3IwLCVyNCksJXIyNgorCitpbnRlZ2VyX3N0b3JlX3Nob3J0X21lbW9yeTogCisJc3R3cyAlcjI2LDAoJXNyMCwlcjQpCisJc3R3cyxtYiAlcjI2LDAoJXNyMCwlcjQpCisJc3R3cyxtYSAlcjI2LDAoJXNyMCwlcjQpCisJc3RocyAlcjI2LDAoJXNyMCwlcjQpCisJc3RocyxtYiAlcjI2LDAoJXNyMCwlcjQpCisJc3RocyxtYSAlcjI2LDAoJXNyMCwlcjQpCisJc3RicyAlcjI2LDAoJXNyMCwlcjQpCisJc3RicyxtYiAlcjI2LDAoJXNyMCwlcjQpCisJc3RicyxtYSAlcjI2LDAoJXNyMCwlcjQpCisJc3R3YXMgJXIyNiwwKCVyNCkKKwlzdHdhcyxtYiAlcjI2LDAoJXI0KQorCXN0d2FzLG1hICVyMjYsMCglcjQpCisJc3RieXMgJXIyNiwwKCVzcjAsJXI0KQorCXN0YnlzLGIgJXIyNiwwKCVzcjAsJXI0KQorCXN0YnlzLGUgJXIyNiwwKCVzcjAsJXI0KQorCXN0YnlzLGIsbSAlcjI2LDAoJXNyMCwlcjQpCisJc3RieXMsZSxtICVyMjYsMCglc3IwLCVyNCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1tZWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1tZWQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI3ZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCkBAIC0wLDAgKzEsMjEgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgoraW1tZWRpYXRlX3Rlc3RzOiAKKwlsZG8gNSglcjI2KSwlcjI2CisJbGRpbCBMJTB4ZGVhZGJlZWYsJXIyNgorCWFkZGlsIEwlMHhkZWFkYmVlZiwlcjUKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzEwNTllCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9sb2dpY2FsLnMKQEAgLTAsMCArMSw2MCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJb3IgJXI0LCVyNSwlcjYKKwlvciw9ICVyNCwlcjUsJXI2CisJb3IsPCAlcjQsJXI1LCVyNgorCW9yLDw9ICVyNCwlcjUsJXI2CisJb3Isb2QgJXI0LCVyNSwlcjYKKwlvcix0ciAlcjQsJXI1LCVyNgorCW9yLDw+ICVyNCwlcjUsJXI2CisJb3IsPj0gJXI0LCVyNSwlcjYKKwlvciw+ICVyNCwlcjUsJXI2CisJb3IsZXYgJXI0LCVyNSwlcjYKKworCXhvciAlcjQsJXI1LCVyNgorCXhvciw9ICVyNCwlcjUsJXI2CisJeG9yLDwgJXI0LCVyNSwlcjYKKwl4b3IsPD0gJXI0LCVyNSwlcjYKKwl4b3Isb2QgJXI0LCVyNSwlcjYKKwl4b3IsdHIgJXI0LCVyNSwlcjYKKwl4b3IsPD4gJXI0LCVyNSwlcjYKKwl4b3IsPj0gJXI0LCVyNSwlcjYKKwl4b3IsPiAlcjQsJXI1LCVyNgorCXhvcixldiAlcjQsJXI1LCVyNgorCisJYW5kICVyNCwlcjUsJXI2CisJYW5kLD0gJXI0LCVyNSwlcjYKKwlhbmQsPCAlcjQsJXI1LCVyNgorCWFuZCw8PSAlcjQsJXI1LCVyNgorCWFuZCxvZCAlcjQsJXI1LCVyNgorCWFuZCx0ciAlcjQsJXI1LCVyNgorCWFuZCw8PiAlcjQsJXI1LCVyNgorCWFuZCw+PSAlcjQsJXI1LCVyNgorCWFuZCw+ICVyNCwlcjUsJXI2CisJYW5kLGV2ICVyNCwlcjUsJXI2CisKKwlhbmRjbSAlcjQsJXI1LCVyNgorCWFuZGNtLD0gJXI0LCVyNSwlcjYKKwlhbmRjbSw8ICVyNCwlcjUsJXI2CisJYW5kY20sPD0gJXI0LCVyNSwlcjYKKwlhbmRjbSxvZCAlcjQsJXI1LCVyNgorCWFuZGNtLHRyICVyNCwlcjUsJXI2CisJYW5kY20sPD4gJXI0LCVyNSwlcjYKKwlhbmRjbSw+PSAlcjQsJXI1LCVyNgorCWFuZGNtLD4gJXI0LCVyNSwlcjYKKwlhbmRjbSxldiAlcjQsJXI1LCVyNgorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxOWY5MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvcHVyZ2UucwpAQCAtMCwwICsxLDM1IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKwlwZHRsYiAlcjQoJXNyMCwlcjUpCisJcGR0bGIsbSAlcjQoJXNyMCwlcjUpCisJcGl0bGIgJXI0KCVzcjQsJXI1KQorCXBpdGxiLG0gJXI0KCVzcjQsJXI1KQorCXBkdGxiZSAlcjQoJXNyMCwlcjUpCisJcGR0bGJlLG0gJXI0KCVzcjAsJXI1KQorCXBpdGxiZSAlcjQoJXNyNCwlcjUpCisJcGl0bGJlLG0gJXI0KCVzcjQsJXI1KQorCXBkYyAlcjQoJXNyMCwlcjUpCisJcGRjLG0gJXI0KCVzcjAsJXI1KQorCWZkYyAlcjQoJXNyMCwlcjUpCisJZmRjLG0gJXI0KCVzcjAsJXI1KQorCWZpYyAlcjQoJXNyNCwlcjUpCisJZmljLG0gJXI0KCVzcjQsJXI1KQorCWZkY2UgJXI0KCVzcjAsJXI1KQorCWZkY2UsbSAlcjQoJXNyMCwlcjUpCisJZmljZSAlcjQoJXNyNCwlcjUpCisJZmljZSxtICVyNCglc3I0LCVyNSkKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDFhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1ZDZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMKQEAgLTAsMCArMSw2NyBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJc2gxYWRkICAlcjQsJXI1LCVyNgorCXNoMWFkZCw9ICAlcjQsJXI1LCVyNgorCXNoMWFkZCw8ICAlcjQsJXI1LCVyNgorCXNoMWFkZCw8PSAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsbnV2ICAlcjQsJXI1LCVyNgorCXNoMWFkZCx6bnYgICVyNCwlcjUsJXI2CisJc2gxYWRkLHN2ICAlcjQsJXI1LCVyNgorCXNoMWFkZCxvZCAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsdHIgICVyNCwlcjUsJXI2CisJc2gxYWRkLDw+ICAlcjQsJXI1LCVyNgorCXNoMWFkZCw+PSAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsPiAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsdXYgICVyNCwlcjUsJXI2CisJc2gxYWRkLHZueiAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsbnN2ICAlcjQsJXI1LCVyNgorCXNoMWFkZCxldiAgJXI0LCVyNSwlcjYKKworCXNoMWFkZGwgICVyNCwlcjUsJXI2CisJc2gxYWRkbCw9ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsPCAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLDw9ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsbnV2ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsem52ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsc3YgICVyNCwlcjUsJXI2CisJc2gxYWRkbCxvZCAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLHRyICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsPD4gICVyNCwlcjUsJXI2CisJc2gxYWRkbCw+PSAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLD4gICVyNCwlcjUsJXI2CisJc2gxYWRkbCx1diAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLHZueiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLG5zdiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLGV2ICAlcjQsJXI1LCVyNgorCisJc2gxYWRkbyAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLD0gICVyNCwlcjUsJXI2CisJc2gxYWRkbyw8ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sPD0gICVyNCwlcjUsJXI2CisJc2gxYWRkbyxudXYgICVyNCwlcjUsJXI2CisJc2gxYWRkbyx6bnYgICVyNCwlcjUsJXI2CisJc2gxYWRkbyxzdiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLG9kICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sdHIgICVyNCwlcjUsJXI2CisJc2gxYWRkbyw8PiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLD49ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sPiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLHV2ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sdm56ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sbnN2ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sZXYgICVyNCwlcjUsJXI2CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOWM5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMmFkZC5zCkBAIC0wLDAgKzEsNjcgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorCXNoMmFkZCAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsPSAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsPCAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsPD0gICVyNCwlcjUsJXI2CisJc2gyYWRkLG51diAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsem52ICAlcjQsJXI1LCVyNgorCXNoMmFkZCxzdiAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsb2QgICVyNCwlcjUsJXI2CisJc2gyYWRkLHRyICAlcjQsJXI1LCVyNgorCXNoMmFkZCw8PiAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsPj0gICVyNCwlcjUsJXI2CisJc2gyYWRkLD4gICVyNCwlcjUsJXI2CisJc2gyYWRkLHV2ICAlcjQsJXI1LCVyNgorCXNoMmFkZCx2bnogICVyNCwlcjUsJXI2CisJc2gyYWRkLG5zdiAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsZXYgICVyNCwlcjUsJXI2CisKKwlzaDJhZGRsICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsPSAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLDwgICVyNCwlcjUsJXI2CisJc2gyYWRkbCw8PSAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLG51diAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLHpudiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLHN2ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsb2QgICVyNCwlcjUsJXI2CisJc2gyYWRkbCx0ciAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLDw+ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsPj0gICVyNCwlcjUsJXI2CisJc2gyYWRkbCw+ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsdXYgICVyNCwlcjUsJXI2CisJc2gyYWRkbCx2bnogICVyNCwlcjUsJXI2CisJc2gyYWRkbCxuc3YgICVyNCwlcjUsJXI2CisJc2gyYWRkbCxldiAgJXI0LCVyNSwlcjYKKworCXNoMmFkZG8gICVyNCwlcjUsJXI2CisJc2gyYWRkbyw9ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sPCAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLDw9ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sbnV2ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sem52ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sc3YgICVyNCwlcjUsJXI2CisJc2gyYWRkbyxvZCAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLHRyICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sPD4gICVyNCwlcjUsJXI2CisJc2gyYWRkbyw+PSAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLD4gICVyNCwlcjUsJXI2CisJc2gyYWRkbyx1diAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLHZueiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLG5zdiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLGV2ICAlcjQsJXI1LCVyNgorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFlNmUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucwpAQCAtMCwwICsxLDY3IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKwlzaDNhZGQgICVyNCwlcjUsJXI2CisJc2gzYWRkLD0gICVyNCwlcjUsJXI2CisJc2gzYWRkLDwgICVyNCwlcjUsJXI2CisJc2gzYWRkLDw9ICAlcjQsJXI1LCVyNgorCXNoM2FkZCxudXYgICVyNCwlcjUsJXI2CisJc2gzYWRkLHpudiAgJXI0LCVyNSwlcjYKKwlzaDNhZGQsc3YgICVyNCwlcjUsJXI2CisJc2gzYWRkLG9kICAlcjQsJXI1LCVyNgorCXNoM2FkZCx0ciAgJXI0LCVyNSwlcjYKKwlzaDNhZGQsPD4gICVyNCwlcjUsJXI2CisJc2gzYWRkLD49ICAlcjQsJXI1LCVyNgorCXNoM2FkZCw+ICAlcjQsJXI1LCVyNgorCXNoM2FkZCx1diAgJXI0LCVyNSwlcjYKKwlzaDNhZGQsdm56ICAlcjQsJXI1LCVyNgorCXNoM2FkZCxuc3YgICVyNCwlcjUsJXI2CisJc2gzYWRkLGV2ICAlcjQsJXI1LCVyNgorCisJc2gzYWRkbCAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLD0gICVyNCwlcjUsJXI2CisJc2gzYWRkbCw8ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsPD0gICVyNCwlcjUsJXI2CisJc2gzYWRkbCxudXYgICVyNCwlcjUsJXI2CisJc2gzYWRkbCx6bnYgICVyNCwlcjUsJXI2CisJc2gzYWRkbCxzdiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLG9kICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsdHIgICVyNCwlcjUsJXI2CisJc2gzYWRkbCw8PiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLD49ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsPiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLHV2ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsdm56ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsbnN2ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsZXYgICVyNCwlcjUsJXI2CisKKwlzaDNhZGRvICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sPSAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLDwgICVyNCwlcjUsJXI2CisJc2gzYWRkbyw8PSAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLG51diAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLHpudiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLHN2ICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sb2QgICVyNCwlcjUsJXI2CisJc2gzYWRkbyx0ciAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLDw+ICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sPj0gICVyNCwlcjUsJXI2CisJc2gzYWRkbyw+ICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sdXYgICVyNCwlcjUsJXI2CisJc2gzYWRkbyx2bnogICVyNCwlcjUsJXI2CisJc2gzYWRkbyxuc3YgICVyNCwlcjUsJXI2CisJc2gzYWRkbyxldiAgJXI0LCVyNSwlcjYKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaGlmdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzYyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMKQEAgLTAsMCArMSwzNCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJdnNoZCAlcjQsJXI1LCVyNgorCXZzaGQsPSAlcjQsJXI1LCVyNgorCXZzaGQsPCAlcjQsJXI1LCVyNgorCXZzaGQsb2QgJXI0LCVyNSwlcjYKKwl2c2hkLHRyICVyNCwlcjUsJXI2CisJdnNoZCw8PiAlcjQsJXI1LCVyNgorCXZzaGQsPj0gJXI0LCVyNSwlcjYKKwl2c2hkLGV2ICVyNCwlcjUsJXI2CisKKwlzaGQgJXI0LCVyNSw1LCVyNgorCXNoZCw9ICVyNCwlcjUsNSwlcjYKKwlzaGQsPCAlcjQsJXI1LDUsJXI2CisJc2hkLG9kICVyNCwlcjUsNSwlcjYKKwlzaGQsdHIgJXI0LCVyNSw1LCVyNgorCXNoZCw8PiAlcjQsJXI1LDUsJXI2CisJc2hkLD49ICVyNCwlcjUsNSwlcjYKKwlzaGQsZXYgJXI0LCVyNSw1LCVyNgorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDE2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NwZWNpYWwucwpAQCAtMCwwICsxLDE1IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwlnZncgJXI0KCVzcjAsJXI1KQorCWdmdyxtICVyNCglc3IwLCVyNSkKKwlnZnIgJXI0KCVzcjAsJXI1KQorCWdmcixtICVyNCglc3IwLCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3NmE5NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zCkBAIC0wLDAgKzEsMzQgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCitzcG9wX3Rlc3RzOiAKKwlzcG9wMCw0LDUKKwlzcG9wMCw0LDExNQorCXNwb3AwLDQsNSxuCisJc3BvcDAsNCwxMTUsbgorCXNwb3AxLDQsNSAlcjUKKwlzcG9wMSw0LDExNSAlcjUKKwlzcG9wMSw0LDUsbiAlcjUKKwlzcG9wMSw0LDExNSxuICVyNQorCXNwb3AyLDQsNSAlcjUKKwlzcG9wMiw0LDExNSAlcjUKKwlzcG9wMiw0LDUsbiAlcjUKKwlzcG9wMiw0LDExNSxuICVyNQorCXNwb3AzLDQsNSAlcjUsJXI2CisJc3BvcDMsNCwxMTUgJXI1LCVyNgorCXNwb3AzLDQsNSxuICVyNSwlcjYKKwlzcG9wMyw0LDExNSxuICVyNSwlcjYKKworOyBHYXMgZnVja3MgdGhpcyB1cC4uLiAgVGhpbmtzIGl0IGhhcyB0aGUgZXhwcmVzc2lvbiA1IG1vZCByNS4KKzsJc3BvcDEsNCw1ICVyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmZjBkZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViLnMKQEAgLTAsMCArMSwxMTcgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorCXN1YiAlcjQsJXI1LCVyNgorCXN1Yiw9ICVyNCwlcjUsJXI2CisJc3ViLDwgJXI0LCVyNSwlcjYKKwlzdWIsPD0gJXI0LCVyNSwlcjYKKwlzdWIsPDwgJXI0LCVyNSwlcjYKKwlzdWIsPDw9ICVyNCwlcjUsJXI2CisJc3ViLHN2ICVyNCwlcjUsJXI2CisJc3ViLG9kICVyNCwlcjUsJXI2CisJc3ViLHRyICVyNCwlcjUsJXI2CisJc3ViLDw+ICVyNCwlcjUsJXI2CisJc3ViLD49ICVyNCwlcjUsJXI2CisJc3ViLD4gJXI0LCVyNSwlcjYKKwlzdWIsPj49ICVyNCwlcjUsJXI2CisJc3ViLD4+ICVyNCwlcjUsJXI2CisJc3ViLG5zdiAlcjQsJXI1LCVyNgorCXN1YixldiAlcjQsJXI1LCVyNgorCisJc3VibyAlcjQsJXI1LCVyNgorCXN1Ym8sPSAlcjQsJXI1LCVyNgorCXN1Ym8sPCAlcjQsJXI1LCVyNgorCXN1Ym8sPD0gJXI0LCVyNSwlcjYKKwlzdWJvLDw8ICVyNCwlcjUsJXI2CisJc3Vibyw8PD0gJXI0LCVyNSwlcjYKKwlzdWJvLHN2ICVyNCwlcjUsJXI2CisJc3VibyxvZCAlcjQsJXI1LCVyNgorCXN1Ym8sdHIgJXI0LCVyNSwlcjYKKwlzdWJvLDw+ICVyNCwlcjUsJXI2CisJc3Vibyw+PSAlcjQsJXI1LCVyNgorCXN1Ym8sPiAlcjQsJXI1LCVyNgorCXN1Ym8sPj49ICVyNCwlcjUsJXI2CisJc3Vibyw+PiAlcjQsJXI1LCVyNgorCXN1Ym8sbnN2ICVyNCwlcjUsJXI2CisJc3VibyxldiAlcjQsJXI1LCVyNgorCisJc3ViYiAlcjQsJXI1LCVyNgorCXN1YmIsPSAlcjQsJXI1LCVyNgorCXN1YmIsPCAlcjQsJXI1LCVyNgorCXN1YmIsPD0gJXI0LCVyNSwlcjYKKwlzdWJiLDw8ICVyNCwlcjUsJXI2CisJc3ViYiw8PD0gJXI0LCVyNSwlcjYKKwlzdWJiLHN2ICVyNCwlcjUsJXI2CisJc3ViYixvZCAlcjQsJXI1LCVyNgorCXN1YmIsdHIgJXI0LCVyNSwlcjYKKwlzdWJiLDw+ICVyNCwlcjUsJXI2CisJc3ViYiw+PSAlcjQsJXI1LCVyNgorCXN1YmIsPiAlcjQsJXI1LCVyNgorCXN1YmIsPj49ICVyNCwlcjUsJXI2CisJc3ViYiw+PiAlcjQsJXI1LCVyNgorCXN1YmIsbnN2ICVyNCwlcjUsJXI2CisJc3ViYixldiAlcjQsJXI1LCVyNgorCisJc3ViYm8gJXI0LCVyNSwlcjYKKwlzdWJibyw9ICVyNCwlcjUsJXI2CisJc3ViYm8sPCAlcjQsJXI1LCVyNgorCXN1YmJvLDw9ICVyNCwlcjUsJXI2CisJc3ViYm8sPDwgJXI0LCVyNSwlcjYKKwlzdWJibyw8PD0gJXI0LCVyNSwlcjYKKwlzdWJibyxzdiAlcjQsJXI1LCVyNgorCXN1YmJvLG9kICVyNCwlcjUsJXI2CisJc3ViYm8sdHIgJXI0LCVyNSwlcjYKKwlzdWJibyw8PiAlcjQsJXI1LCVyNgorCXN1YmJvLD49ICVyNCwlcjUsJXI2CisJc3ViYm8sPiAlcjQsJXI1LCVyNgorCXN1YmJvLD4+PSAlcjQsJXI1LCVyNgorCXN1YmJvLD4+ICVyNCwlcjUsJXI2CisJc3ViYm8sbnN2ICVyNCwlcjUsJXI2CisJc3ViYm8sZXYgJXI0LCVyNSwlcjYKKworCXN1YnQgJXI0LCVyNSwlcjYKKwlzdWJ0LD0gJXI0LCVyNSwlcjYKKwlzdWJ0LDwgJXI0LCVyNSwlcjYKKwlzdWJ0LDw9ICVyNCwlcjUsJXI2CisJc3VidCw8PCAlcjQsJXI1LCVyNgorCXN1YnQsPDw9ICVyNCwlcjUsJXI2CisJc3VidCxzdiAlcjQsJXI1LCVyNgorCXN1YnQsb2QgJXI0LCVyNSwlcjYKKwlzdWJ0LHRyICVyNCwlcjUsJXI2CisJc3VidCw8PiAlcjQsJXI1LCVyNgorCXN1YnQsPj0gJXI0LCVyNSwlcjYKKwlzdWJ0LD4gJXI0LCVyNSwlcjYKKwlzdWJ0LD4+PSAlcjQsJXI1LCVyNgorCXN1YnQsPj4gJXI0LCVyNSwlcjYKKwlzdWJ0LG5zdiAlcjQsJXI1LCVyNgorCXN1YnQsZXYgJXI0LCVyNSwlcjYKKworCXN1YnRvICVyNCwlcjUsJXI2CisJc3VidG8sPSAlcjQsJXI1LCVyNgorCXN1YnRvLDwgJXI0LCVyNSwlcjYKKwlzdWJ0byw8PSAlcjQsJXI1LCVyNgorCXN1YnRvLDw8ICVyNCwlcjUsJXI2CisJc3VidG8sPDw9ICVyNCwlcjUsJXI2CisJc3VidG8sc3YgJXI0LCVyNSwlcjYKKwlzdWJ0byxvZCAlcjQsJXI1LCVyNgorCXN1YnRvLHRyICVyNCwlcjUsJXI2CisJc3VidG8sPD4gJXI0LCVyNSwlcjYKKwlzdWJ0byw+PSAlcjQsJXI1LCVyNgorCXN1YnRvLD4gJXI0LCVyNSwlcjYKKwlzdWJ0byw+Pj0gJXI0LCVyNSwlcjYKKwlzdWJ0byw+PiAlcjQsJXI1LCVyNgorCXN1YnRvLG5zdiAlcjQsJXI1LCVyNgorCXN1YnRvLGV2ICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzI2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1YmkucwpAQCAtMCwwICsxLDQ5IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCis7Cis7IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAorOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCis7IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KKwlzdWJpIDEyMywlcjUsJXI2CisJc3ViaSw9IDEyMywlcjUsJXI2CisJc3ViaSw8IDEyMywlcjUsJXI2CisJc3ViaSw8PSAxMjMsJXI1LCVyNgorCXN1YmksPDwgMTIzLCVyNSwlcjYKKwlzdWJpLDw8PSAxMjMsJXI1LCVyNgorCXN1Ymksc3YgMTIzLCVyNSwlcjYKKwlzdWJpLG9kIDEyMywlcjUsJXI2CisJc3ViaSx0ciAxMjMsJXI1LCVyNgorCXN1YmksPD4gMTIzLCVyNSwlcjYKKwlzdWJpLD49IDEyMywlcjUsJXI2CisJc3ViaSw+IDEyMywlcjUsJXI2CisJc3ViaSw+Pj0gMTIzLCVyNSwlcjYKKwlzdWJpLD4+IDEyMywlcjUsJXI2CisJc3ViaSxuc3YgMTIzLCVyNSwlcjYKKwlzdWJpLGV2IDEyMywlcjUsJXI2CisKKwlzdWJpbyAxMjMsJXI1LCVyNgorCXN1YmlvLD0gMTIzLCVyNSwlcjYKKwlzdWJpbyw8IDEyMywlcjUsJXI2CisJc3ViaW8sPD0gMTIzLCVyNSwlcjYKKwlzdWJpbyw8PCAxMjMsJXI1LCVyNgorCXN1YmlvLDw8PSAxMjMsJXI1LCVyNgorCXN1YmlvLHN2IDEyMywlcjUsJXI2CisJc3ViaW8sb2QgMTIzLCVyNSwlcjYKKwlzdWJpbyx0ciAxMjMsJXI1LCVyNgorCXN1YmlvLDw+IDEyMywlcjUsJXI2CisJc3ViaW8sPj0gMTIzLCVyNSwlcjYKKwlzdWJpbyw+IDEyMywlcjUsJXI2CisJc3ViaW8sPj49IDEyMywlcjUsJXI2CisJc3ViaW8sPj4gMTIzLCVyNSwlcjYKKwlzdWJpbyxuc3YgMTIzLCVyNSwlcjYKKwlzdWJpbyxldiAxMjMsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zeXN0ZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyZTdiZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKQEAgLTAsMCArMSw0NiBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisJYnJlYWsgNSwxMgorCXJmaQorCXJmaXIKKwlzc20gNSwlcjQKKwlyc20gNSwlcjQKKwltdHNtICVyNAorCWxkc2lkICglc3IwLCVyNSksJXI0CisJbXRzcCAlcjQsJXNyMAorCW10Y3RsICVyNCwlY3IxMAorCW1mc3AgJXNyMCwlcjQKKwltZmN0bCAlY3IxMCwlcjQKKwlzeW5jCisJc3luY2RtYQorCWRpYWcgMTIzNAorCisJcHJvYmVyICglc3IwLCVyNSksJXI2LCVyNworCXByb2JlcmkgKCVzcjAsJXI1KSwxLCVyNworCXByb2JldyAoJXNyMCwlcjUpLCVyNiwlcjcKKwlwcm9iZXdpICglc3IwLCVyNSksMSwlcjcKKwkKKwlscGEgJXI0KCVzcjAsJXI1KSwlcjYKKwlscGEsbSAlcjQoJXNyMCwlcjUpLCVyNgorCWxoYSAlcjQoJXNyMCwlcjUpLCVyNgorCWxoYSxtICVyNCglc3IwLCVyNSksJXI2CisJbGNpICVyNCglc3IwLCVyNSksJXI2CisKKwlpZHRsYmEgJXI0LCglc3IwLCVyNSkKKwlpaXRsYmEgJXI0LCglc3I0LCVyNSkKKwlpZHRsYnAgJXI0LCglc3IwLCVyNSkKKwlpaXRsYnAgJXI0LCglc3I0LCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy91bml0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5YjEwZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdC5zCkBAIC0wLDAgKzEsNTUgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKKzsKKzsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCis7IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKKzsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgorCisJdXhvciAlcjQsJXI1LCVyNgorCXV4b3Isc2J6ICVyNCwlcjUsJXI2CisJdXhvcixzaHogJXI0LCVyNSwlcjYKKwl1eG9yLHNkYyAlcjQsJXI1LCVyNgorCXV4b3Isc2JjICVyNCwlcjUsJXI2CisJdXhvcixzaGMgJXI0LCVyNSwlcjYKKwl1eG9yLHRyICVyNCwlcjUsJXI2CisJdXhvcixuYnogJXI0LCVyNSwlcjYKKwl1eG9yLG5oeiAlcjQsJXI1LCVyNgorCXV4b3IsbmRjICVyNCwlcjUsJXI2CisJdXhvcixuYmMgJXI0LCVyNSwlcjYKKwl1eG9yLG5oYyAlcjQsJXI1LCVyNgorCisJdWFkZGNtICVyNCwlcjUsJXI2CisJdWFkZGNtLHNieiAlcjQsJXI1LCVyNgorCXVhZGRjbSxzaHogJXI0LCVyNSwlcjYKKwl1YWRkY20sc2RjICVyNCwlcjUsJXI2CisJdWFkZGNtLHNiYyAlcjQsJXI1LCVyNgorCXVhZGRjbSxzaGMgJXI0LCVyNSwlcjYKKwl1YWRkY20sdHIgJXI0LCVyNSwlcjYKKwl1YWRkY20sbmJ6ICVyNCwlcjUsJXI2CisJdWFkZGNtLG5oeiAlcjQsJXI1LCVyNgorCXVhZGRjbSxuZGMgJXI0LCVyNSwlcjYKKwl1YWRkY20sbmJjICVyNCwlcjUsJXI2CisJdWFkZGNtLG5oYyAlcjQsJXI1LCVyNgorCisJdWFkZGNtdCAlcjQsJXI1LCVyNgorCXVhZGRjbXQsc2J6ICVyNCwlcjUsJXI2CisJdWFkZGNtdCxzaHogJXI0LCVyNSwlcjYKKwl1YWRkY210LHNkYyAlcjQsJXI1LCVyNgorCXVhZGRjbXQsc2JjICVyNCwlcjUsJXI2CisJdWFkZGNtdCxzaGMgJXI0LCVyNSwlcjYKKwl1YWRkY210LHRyICVyNCwlcjUsJXI2CisJdWFkZGNtdCxuYnogJXI0LCVyNSwlcjYKKwl1YWRkY210LG5oeiAlcjQsJXI1LCVyNgorCXVhZGRjbXQsbmRjICVyNCwlcjUsJXI2CisJdWFkZGNtdCxuYmMgJXI0LCVyNSwlcjYKKwl1YWRkY210LG5oYyAlcjQsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjRlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMKQEAgLTAsMCArMSw4NzAgQEAKKwkuc3RhYnMgIndlaXJkLmMiLDB4NjQsMCwwLExhYmVsMAorTGFiZWwwOgorCS5zdGFicyAiaW50dHlwZTp0MT1idTQ7MDszMjsiLDB4ODAsMCwwLDAKKworCisJLnN0YWJzICJzeW0zMjogICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisKKwkuc3RhYnMgInR5cGUzMjp0MzI9ICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCisKKwkuc3RhYnMgImF0dHIxMDQ6RzQwND1AaCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTA1Okc0MDU9QGkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCisJLnN0YWJzICJ2YXIwOkczMDA9QGE4OzEiLDB4MjAsMCwwLCAwCisJLmV4cG9ydCB2YXIwCisJLmRhdGEKKwkuYWxpZ24gNAordmFyMDoKKwkubG9uZyA0MgorCisJLnN0YWJzICJzeW0zMzohICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0zNTojICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0zNjokICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0zNzolICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0zODomICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0zOTonICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW00MDooICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW00MTopICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW00MjoqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW00MzorICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW00NDosICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW00NTotICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisKKwkuZXhwb3J0IGF0dHIxMjIKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTIyOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTIzCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjEyMzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjEyNAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMjQ6CisJLmxvbmcgNDIKKworCS5zdGFicyAic3ltNDY6LiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltNDc6LyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltNDg6MCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltNDk6MSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltNTA6MiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCisJLnN0YWJzICJhdHRyOTY6RzM5Nj1AYCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyOTc6RzM5Nz1AYSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyOTg6RzM5OD1AYiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyOTk6RzM5OT1AYyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisKKwkuc3RhYnMgInN5bTUxOjMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTUyOjQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTUzOjUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTU0OjYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTU1OjcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTU2OjggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTU3OjkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTU4OjogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTU5OjsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTYwOjwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTYxOj0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTYyOj4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTYzOj8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTY0OkAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTY1OkEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTY2OkIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTY3OkMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTY4OkQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTY5OkUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTcwOkYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTcxOkcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTcyOkggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTczOkkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTc0OkogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTc1OksgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTc2OkwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTc3Ok0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTc4Ok4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTc5Ok8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTgwOlAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTgxOlEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTgyOlIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTgzOlMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTg0OlQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTg1OlUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTg2OlYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTg3OlcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTg4OlggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTg5OlkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTkwOlogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTkxOlsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKworCS5zdGFicyAic3ltOTM6XSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltOTQ6XiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltOTU6XyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltOTY6YCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltOTc6YSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltOTg6YiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltOTk6YyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTAwOmQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTEwMTplICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMDI6ZiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTAzOmcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTEwNDpoICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMDU6aSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTA2OmogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTEwNzprICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMDg6bCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTA5Om0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTExMDpuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMTE6byAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTEyOnAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTExMzpxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMTQ6ciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTE1OnMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTExNjp0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMTc6dSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTE4OnYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTExOTp3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMjA6eCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTIxOnkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTEyMjp6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMjM6eyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAic3ltMTI0OnwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInN5bTEyNTp9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJzeW0xMjY6fiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCisJLnN0YWJzICJ0eXBlMzM6dDMzPSEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUzNTp0MzU9IyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTM2OnQzNj0kICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMzc6dDM3PSUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUzODp0Mzg9JiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTM5OnQzOT0nICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNDA6dDQwPSggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU0MTp0NDE9KSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTQyOnQ0Mj0qICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNDM6dDQzPSsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU0NDp0NDQ9LCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTQ1OnQ0NT0tICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNDY6dDQ2PS4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU0Nzp0NDc9LyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTQ4OnQ0OD0wICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNDk6dDQ5PTEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU1MDp0NTA9MiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTUxOnQ1MT0zICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNTI6dDUyPTQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU1Mzp0NTM9NSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTU0OnQ1ND02ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNTU6dDU1PTcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU1Njp0NTY9OCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTU3OnQ1Nz05ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNTg6dDU4PTogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU1OTp0NTk9OyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTYwOnQ2MD08ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNjE6dDYxPT0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU2Mjp0NjI9PiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTYzOnQ2Mz0/ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNjQ6dDY0PUAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU2NTp0NjU9QSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTY2OnQ2Nj1CICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNjc6dDY3PUMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKworCS5leHBvcnQgYXR0cjY2CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjY2OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNjcKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNjc6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI2OAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI2ODoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjY5CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjY5OgorCS5sb25nIDQyCisKKwkuc3RhYnMgInR5cGU2ODp0Njg9RCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTY5OnQ2OT1FICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNzA6dDcwPUYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU3MTp0NzE9RyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTcyOnQ3Mj1IICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNzM6dDczPUkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU3NDp0NzQ9SiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTc1OnQ3NT1LICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNzY6dDc2PUwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU3Nzp0Nzc9TSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTc4OnQ3OD1OICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlNzk6dDc5PU8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU4MDp0ODA9UCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTgxOnQ4MT1RICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlODI6dDgyPVIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU4Mzp0ODM9UyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTg0OnQ4ND1UICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlODU6dDg1PVUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU4Njp0ODY9ViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTg3OnQ4Nz1XICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisKKwkuc3RhYnMgImF0dHI2OTpHMzY5PUBFICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3MDpHMzcwPUBGICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3MTpHMzcxPUBHICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKworCS5zdGFicyAidHlwZTg4OnQ4OD1YICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlODk6dDg5PVkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU5MDp0OTA9WiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTkxOnQ5MT1bICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisKKwkuc3RhYnMgInR5cGU5Mzp0OTM9XSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTk0OnQ5ND1eICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlOTU6dDk1PV8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU5Njp0OTY9YCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTk3OnQ5Nz1hICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlOTg6dDk4PWIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGU5OTp0OTk9YyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTEwMDp0MTAwPWQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMDE6dDEwMT1lICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTAyOnQxMDI9ZiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTEwMzp0MTAzPWcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMDQ6dDEwND1oICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTA1OnQxMDU9aSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTEwNjp0MTA2PWogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMDc6dDEwNz1rICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTA4OnQxMDg9bCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTEwOTp0MTA5PW0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMTA6dDExMD1uICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTExOnQxMTE9byAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTExMjp0MTEyPXAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMTM6dDExMz1xICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTE0OnQxMTQ9ciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTExNTp0MTE1PXMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMTY6dDExNj10ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTE3OnQxMTc9dSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTExODp0MTE4PXYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMTk6dDExOT13ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTIwOnQxMjA9eCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTEyMTp0MTIxPXkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMjI6dDEyMj16ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTIzOnQxMjM9eyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTEyNDp0MTI0PXwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKKwkuc3RhYnMgInR5cGUxMjU6dDEyNT19ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCisJLnN0YWJzICJ0eXBlMTI2OnQxMjY9fiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCisJLnN0YWJzICJhdHRyMzI6RzMzMj1AICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMzM6RzMzMz1AISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMzU6RzMzND1AIyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisKKwkuc3RhYnMgInByaW1hcnk6RzIwMD1lcmVkOjAsZ3JlZW46MSxibHVlOjIsOyIsIDB4MjAsMCwwLCAwCisKKwkuc3RhYnMgImF0dHIzNjpHMzM1PUAkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKworCS5leHBvcnQgcHJpbWFyeQorCS5kYXRhCisJLmFsaWduIDQKK3ByaW1hcnk6CisJLmxvbmcgNDIKKworCS5zdGFicyAiYXR0cjM3OkczMzc9QCUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCisJLnN0YWJzICJjb25zdDY5OmM9ZTEsNjkiLCAweDgwLDAsMCwgMAorCisJLnN0YWJzICJjb25zdDcwOmM9ZTE5MD1iczI7MDsxNjssNzAiLCAweDgwLDAsMCwgMAorCisJLnN0YWJzICJhdHRyMzg6RzMzOD1AJiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisKKwkuc3RhYnMgImJhZF9uZWcwdHlwZTp0MjAxPXM4ZmllbGQwOjEsMCwzMjtmaWVsZDI6LTUzNCwzMiw2NDtmaWVsZDM6LTEsOTYsMzI7OyIsIDB4ODAsMCwwLCAwCisKKwkuc3RhYnMgImJhZF9uZWcwOkcyMDEiLCAweDIwLDAsMCwgMAorCisJLmV4cG9ydCBiYWRfbmVnMAorCS5kYXRhCisJLmFsaWduIDQKK2JhZF9uZWcwOgorCS5sb25nIDQyCisJLmxvbmcgNDMsIDQ0LCA0NQorCisJLnN0YWJzICJhdHRyMzk6RzMzOT1AJyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNDE6RzM0MT1AKSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNDI6RzM0Mj1AKiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNDM6RzM0Mz1AKyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNDQ6RzM0ND1ALCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNDY6RzM0Nj1ALiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNDc6RzM0Nz1ALyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyNTg6RzM1OD1AOiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisKKwkuc3RhYnMgImF0dHI1OTpHMzU5PUA7QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisKKwkuc3RhYnMgImF0dHI2MDpHMzYwPUA8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2MTpHMzYxPUA9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2MjpHMzYyPUA+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2MzpHMzYzPUA/ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2NDpHMzY0PUBAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2NTpHMzY1PUBBICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2NjpHMzY2PUBCICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2NzpHMzY3PUBDICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI2ODpHMzY4PUBEICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3MjpHMzcyPUBIICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3MzpHMzczPUBJICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3NDpHMzc0PUBKICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3NTpHMzc1PUBLICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3NjpHMzc2PUBMICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3NzpHMzc3PUBNICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3ODpHMzc4PUBOICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI3OTpHMzc5PUBPICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4MDpHMzgwPUBQICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4MTpHMzgxPUBRICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4MjpHMzgyPUBSICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4MzpHMzgzPUBTICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4NDpHMzg0PUBUICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4NTpHMzg1PUBVICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4NjpHMzg2PUBWICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4NzpHMzg3PUBXICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4ODpHMzg4PUBYICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI4OTpHMzg5PUBZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI5MDpHMzkwPUBaICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHI5MTpHMzkxPUBbICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKworCS5zdGFicyAiYXR0cjkzOkczOTM9QF0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCisKKwkuZXhwb3J0IF9jb21tb24wCisJLmRhdGEKKwkuYWxpZ24gNAorX2NvbW1vbjA6CisJLmxvbmcgNDIKKwkubG9uZyAyNAorCS5sb25nIDIyCisJLmV4cG9ydCBjb21tb24wCisJLmRhdGEKKwkuYWxpZ24gNAorY29tbW9uMDoKKwkubG9uZyA0MgorCS5sb25nIDI0CisJLmxvbmcgMjIKKwkuc3RhYnMgICJjb21tb24wIiwweGUyLDAsMCwwCisJLnN0YWJzICJjb21tb24wdmFyMDpTMSIsIDB4MjAsMCwwLCAwCisJLnN0YWJzICJjb21tb24wdmFyMTpTMSIsIDB4MjAsMCwwLCA0CisJLnN0YWJzICJjb21tb24wdmFyMjpTMSIsIDB4MjAsMCwwLCA4CisJLnN0YWJzICAiY29tbW9uMCIsMHhlNCwwLDAsMAorCisJLnN0YWJzICJhdHRyOTQ6RzM5ND1AXiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyOTU6RzM5NT1AXyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTAwOkc0MDA9QGQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjEwMTpHNDAxPUBlICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMDI6RzQwMj1AZiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTAzOkc0MDM9QGcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjEwNjpHNDA2PUBqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMDc6RzQwNz1AayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTA4Okc0MDg9QGwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjEwOTpHNDA5PUBtICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMTA6RzQxMD1AbiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTExOkc0MTE9QG8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjExMjpHNDEyPUBwICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMTM6RzQxMz1AcSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTE0Okc0MTQ9QHIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjExNTpHNDE1PUBzICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMTY6RzQxNj1AdCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTE3Okc0MTc9QHUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjExODpHNDE4PUB2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMTk6RzQxOT1AdyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTIwOkc0MjA9QHggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjEyMTpHNDIxPUB5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMjI6RzQyMj1AeiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTIzOkc0MjM9QHsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCS5zdGFicyAiYXR0cjEyNDpHNDI0PUB8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKKwkuc3RhYnMgImF0dHIxMjU6RzQyNT1AfSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCisJLnN0YWJzICJhdHRyMTI2Okc0MjY9QH4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAorCisJLmV4cG9ydCBhdHRyMzIKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMzI6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIzMworCS5kYXRhCisJLmFsaWduIDQKK2F0dHIzMzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjM1CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjM1OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMzYKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMzY6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIzNworCS5kYXRhCisJLmFsaWduIDQKK2F0dHIzNzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjM4CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjM4OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMzkKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMzk6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI0MQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI0MToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjQyCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjQyOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNDMKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNDM6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI0NAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI0NDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjQ2CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjQ2OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNDcKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNDc6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI1OAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI1ODoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjU5CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjU5OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNjAKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNjA6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI2MQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI2MToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjYyCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjYyOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNjMKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNjM6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI2NAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI2NDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjY1CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjY1OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNzAKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNzA6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI3MQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI3MToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjcyCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjcyOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNzMKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNzM6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI3NAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI3NDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjc1CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjc1OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNzYKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNzY6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI3NworCS5kYXRhCisJLmFsaWduIDQKK2F0dHI3NzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjc4CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjc4OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyNzkKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyNzk6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI4MAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI4MDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjgxCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjgxOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyODIKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyODI6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI4MworCS5kYXRhCisJLmFsaWduIDQKK2F0dHI4MzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjg0CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjg0OgorCS5sb25nIDQyCisKKwkuc3RhYnMgImZsb2F0NzJ0eXBlOnQyMDI9Ujg3Ozk7IiwgMHg4MCwwLDAsIDAKKworCS5zdGFicyAiaW50MjU2dmFyOkcyMDM9YnUzMjswOzI1NjsiLCAweDIwLDAsMCwgMAorCS5leHBvcnQgaW50MjU2dmFyCisJLmRhdGEKKwkuYWxpZ24gNAoraW50MjU2dmFyOgorCS5sb25nIDQyCisJLmxvbmcgMHgyYiwgMHgyYywgMHgyZCwgMHgyZCwgMHgyYywgMHgyYiwgMHgyYQorCisKKwkuc3RhYnMgImNvbnN0aDpjPWUxLDQyOTQ5NjcyOTYiLCAweDgwLDAsMCwgMAorCisJLnN0YWJzICJjb25zdGgyOmM9ZTEsLTczNDcyMzk4NTczMjY0Mjc1ODkyODQ3NTY3ODk4NzIzNDU2MzI4NDkzNzQ1NiIsIDB4ODAsMCwwLCAwCisKKwkuc3RhYnMgImJhZF9uZWcwY29uc3Q6Yz1TMjAxLDEyOCwxMjgsMTEyMjIyMTEzNDM0MzQzNDU2NTY1NjU2Nzc4ODg4NzciLCAweDgwLDAsMCwgMAorCisJLnN0YWJzICJiYWRfdHlwZTA6dCgtMyw3KSIsIDB4ODAsMCwwLCAwCisJLnN0YWJzICJiYWRfdHlwZTE6dCg0Miw2KSIsIDB4ODAsMCwwLCAwCisKKwkuc3RhYnMgImFycmF5X2luZGV4MDp0MjA1PXIxOzA7NTsiLCAweDgwLDAsMCwgMAorCS5zdGFicyAiYXJyYXkwOkcyMDY9YTIwNTsxIiwgMHgyMCwwLDAsIDAKKwkuZXhwb3J0IGFycmF5MAorCS5kYXRhCisJLmFsaWduIDQKK2FycmF5MDoKKwkubG9uZyA0MgorCS5sb25nIDQzLCA0NCwgNDUsIDQ2LCA0NworCisJLnN0YWJzICJhcnJheV9pbmRleDE6dDIwNz0iLCAweDgwLDAsMCwgMAorCS5zdGFicyAiYXJyYXkxOkcyMDg9YWVhaTFfcmVkOjAsYWkxX2dyZWVuOjEsYWkxX2JsdWU6Miw7OzEiLCAweDIwLDAsMCwgMAorCS5leHBvcnQgYXJyYXkxCisJLmRhdGEKKwkuYWxpZ24gNAorYXJyYXkxOgorCS5sb25nIDQyCisJLmxvbmcgNDMsIDQ0CisKKwkuc3RhYnMgImludHR5cGVfb25lOnQyMDk9MSIsIDB4ODAsMCwwLCAwCisJLnN0YWJzICJpbnR0eXBlX3R3bzp0MjEwPTEiLCAweDgwLDAsMCwgMAorCS5zdGFicyAib25lX3ZhcjpHMjA5IiwgMHgyMCwwLDAsIDAKKwkuZXhwb3J0IG9uZV92YXIKKwkuZGF0YQorCS5hbGlnbiA0CitvbmVfdmFyOgorCS5sb25nIDQyCisJLnN0YWJzICJ0d29fdmFyOkcyMTAiLCAweDIwLDAsMCwgMAorCS5leHBvcnQgdHdvX3ZhcgorCS5kYXRhCisJLmFsaWduIDQKK3R3b192YXI6CisJLmxvbmcgNDIKKworCS5zdGFicyAiaW50cDp0MjExPSoxIiwgMHg4MCwwLDAsIDAKKwkuc3RhYnMgInBvaW50ZXJfdG9faW50X3ZhcjpHMjEyPSoxIiwgMHg4MCwwLDAsIDAKKwkuc3RhYnMgImludHBfdmFyOkcyMTEiLCAweDIwLDAsMCwgMAorCS5leHBvcnQgaW50cF92YXIKKwkuZGF0YQorCS5hbGlnbiA0CitpbnRwX3ZhcjoKKwkubG9uZyA0MgorCisJLnN0YWJzICJ1bnJlY29nX2NvbnN0OmM9eGprc2RmbHNrZDMzLDQ7NDczOyIsIDB4ODAsMCwwLCAwCisKKwkuZXhwb3J0IGF0dHI4NQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI4NToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjg2CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjg2OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyODcKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyODc6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI4OAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI4ODoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjg5CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjg5OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyOTAKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyOTA6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI5MQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI5MToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjkyCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjkyOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyOTMKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyOTM6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI5NAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHI5NDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjk1CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjk1OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyOTYKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyOTY6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHI5NworCS5kYXRhCisJLmFsaWduIDQKK2F0dHI5NzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjk4CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjk4OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyOTkKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyOTk6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMDAKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTAwOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTAxCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjEwMToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjEwMgorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMDI6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMDMKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTAzOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTA0CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjEwNDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjEwNQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMDU6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMDYKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTA2OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTA3CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjEwNzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjEwOAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMDg6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMDkKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTA5OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTEwCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjExMDoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjExMQorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMTE6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMTIKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTEyOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTEzCisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjExMzoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjExNAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMTQ6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMTUKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTE1OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTE2CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjExNjoKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjExNworCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMTc6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMTgKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTE4OgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTE5CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjExOToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjEyMAorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMjA6CisJLmxvbmcgNDIKKwkuZXhwb3J0IGF0dHIxMjEKKwkuZGF0YQorCS5hbGlnbiA0CithdHRyMTIxOgorCS5sb25nIDQyCisJLmV4cG9ydCBhdHRyMTI1CisJLmRhdGEKKwkuYWxpZ24gNAorYXR0cjEyNToKKwkubG9uZyA0MgorCS5leHBvcnQgYXR0cjEyNgorCS5kYXRhCisJLmFsaWduIDQKK2F0dHIxMjY6CisJLmxvbmcgNDIKKworCS5zdGFicyAidmFyMTpHMzAxPUBzMzI7MSIsMHgyMCwwLDAsIDAKKwkuZXhwb3J0IHZhcjEKKwkuZGF0YQorCS5hbGlnbiA0Cit2YXIxOgorCS5sb25nIDQyCisJLnN0YWJzICJ2YXIyOkczMDI9QHA0MjsxIiwweDIwLDAsMCwgMAorCS5leHBvcnQgdmFyMgorCS5kYXRhCisJLmFsaWduIDQKK3ZhcjI6CisJLmxvbmcgNDIKKwkuc3RhYnMgInZhcjM6RzMwMz1AUDsxIiwweDIwLDAsMCwgMAorCS5leHBvcnQgdmFyMworCS5kYXRhCisJLmFsaWduIDQKK3ZhcjM6CisJLmxvbmcgNDIKKworCisKKworCisKKworCisKKworCisKKwkuc3RhYnMgInZfY29tYjpHNDQ4PXMyNCEyLDAyMCw0NDU9czEyITEsMTIwLDQ0ND1zNHg6MSwwLDMyOzs7JHZiNDQ0OjQ0Nj0qNDQ0LDA7YTovMDEsMzIsMzI7OzswMjY0LDQ0Nz1zMTIhMSwxMjAsNDQ0OyR2YjQ0NDo0NDYsMDtiOi8wMSwzMiwzMjs7O2NvbWI6LzAxLDEyOCwzMjs7IiwgMHgyMCwwLDAsIDAKKworCS5leHBvcnQgdl9jb21iCisJLmFsaWduIDEKK3ZfY29tYjoKKwkubG9uZyB2X2NvbWJfc2hhcmVkIAorCS5sb25nIDQzIAorCS5sb25nIHZfY29tYl9zaGFyZWQgCisJLmxvbmcgNDQgCisJLmxvbmcgNDUgCit2X2NvbWJfc2hhcmVkOgorCS5sb25nIDQyIAorCisJLnN0YWJzICJzeW05MjpcXCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAidHlwZTkyOnQ5Mj1cXCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAorCS5zdGFicyAiYXR0cjkyOkczOTI9QFxcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODFlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zCkBAIC0wLDAgKzEsNDEgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gMQorCS5hbGlnbiA4CisJbm9wCis7ICI4IiBhc3N1bWVkIGlmIG5vIGFsaWdubWVudCBnaXZlbi4KKwkuYWxpZ24KKwlub3AKKwkuYWxpZ24gNDA5NgorCW5vcAorCisKKyAgICAgICAgLlNQQUNFICAkUFJJVkFURSQKKyAgICAgICAgLlNVQlNQQSAkQlNTJAorCisgICAgICAgIC5BTElHTiAgOAorJEwwMEJTUzoKK2hvbWVfYnVmZjoKKyAgICAgICAgLkJMT0NLICAxMDI0CisgICAgICAgIC5BTElHTiAgOAorY3VycmVudF9idWZmOgorICAgICAgICAuQkxPQ0sgIDEwMjQKKyAgICAgICAgLkFMSUdOICA0Citsb2NrX2ZpbGU6CisgICAgICAgIC5CTE9DSyAgNAorICAgICAgICAuQUxJR04gIDgKK0wzMzIubmFtZToKKyAgICAgICAgLkJMT0NLICAzMAorICAgICAgICAuQUxJR04gIDQKK0wzNTIubGFzdF9jYXNlX3dhOgorICAgICAgICAuQkxPQ0sgIDQKKworCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjczNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjIucwpAQCAtMCwwICsxLDE1IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDMKKworCQorCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzdmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FwcGJ1Zy5zCkBAIC0wLDAgKzEgQEAKKyMgMSAiY3J0MC5zIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDFjMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMKQEAgLTAsMCArMSwzMyBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgZm9vYmFyLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9RlIsQVJHVzE9RlUsQVJHVzI9RlIsQVJHVzM9RlUsUlROVkFMPUZSCitmb29iYXIKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCisJLkVOVFJZCisJbGRvIC02NCglcjMwKSwlcjIwCisJYWRkaWwgTFIneC0kZ2xvYmFsJCwlcjI3CisJZmxkZHMgOCglcjIwKSwlZnI0CisJZmxkZHMgMCglcjIwKSwlZnIyMgorCWxkbyBSUid4LSRnbG9iYWwkKCVyMSksJXIxOQorCWZtcHlzdWIsc2dsICVmcjVMLCVmcjdMLCVmcjVMLCVmcjIyTCwlZnI0TAorCWJ2ICVyMCglcjIpCisJZnN0ZHMgJWZyNSwwKCVyMTkpCisJLkVYSVQKKwkuUFJPQ0VORAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICRCU1MkCisKK3gJLmNvbW0gOAoreQkuY29tbSA4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc2OTlmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucwpAQCAtMCwwICsxLDE4IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICREQVRBJAorCitmb286CisJLmJsb2NrCitiYXI6CisJLmJsb2NrIDB4N2ZmZmZmZmYKK2NvbToKKworCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2I1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2Jsb2NrMi5zCkBAIC0wLDAgKzEsMTUgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJERBVEEkCisKK2ZvbzoKKwkuYmxvY2sgLTEKKworCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgwY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsZGF0YWJ1Zy5zCkBAIC0wLDAgKzEsMTg5IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKwkuSU1QT1JUICRnbG9iYWwkLERBVEEKKwkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKKzsgZ2NjX2NvbXBpbGVkLjoKKwkuSU1QT1JUIHByaW50ZixDT0RFCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorTEMkMDAwMDoKKwkuU1RSSU5HICIlZCAlbGYgJWRceDBhXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgZXJyb3JfXzNBQUFpaWRpCisJLkVYUE9SVCBlcnJvcl9fM0FBQWlpZGksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1GUixBUkdXND1GVSxSVE5WQUw9R1IKK2Vycm9yX18zQUFBaWlkaToKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjksOCglcjQpCisJc3R3ICVyOCwxMiglcjQpCisJc3R3ICVyNywxNiglcjQpCisJc3R3ICVyNiwyMCglcjQpCisJc3R3ICVyNSwyNCglcjQpCisJY29weSAlcjI2LCVyNQorCWxkbyAtOCglcjApLCVyNgorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI2LCVyNworCXN0dyAlcjI1LDAoJXI3KQorCWxkbyAtMTIoJXIwKSwlcjgKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyOCwlcjkKKwlzdHcgJXIyNCwwKCVyOSkKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTI0KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGRvIC0yOCglcjApLCVyMjEKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjEsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjIKKwlzdHcgJXIyMiwtNTIoJXIzMCkKKwlsZGlsIEwnTEMkMDAwMCwlcjI2CisJbGRvIFInTEMkMDAwMCglcjI2KSwlcjI2CisJbGR3IDAoJXIxOSksJXIyNQorCWZsZGRzIDAoJXIyMCksJWZyNworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCisJYmwgcHJpbnRmLCVyMgorCW5vcAorCWJsLG4gTCQwMDAyLCVyMAorCWJsLG4gTCQwMDAxLCVyMAorTCQwMDAyOgorTCQwMDAxOgorCWxkdyA4KCVyNCksJXI5CisJbGR3IDEyKCVyNCksJXI4CisJbGR3IDE2KCVyNCksJXI3CisJbGR3IDIwKCVyNCksJXI2CisJbGR3IDI0KCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CisJLkVYUE9SVCBva19fM0FBQWlkaQorCS5FWFBPUlQgb2tfXzNBQUFpZGksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVSxSVE5WQUw9R1IKK29rX18zQUFBaWRpOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyOSw4KCVyNCkKKwlzdHcgJXI4LDEyKCVyNCkKKwlzdHcgJXI3LDE2KCVyNCkKKwlzdHcgJXI2LDIwKCVyNCkKKwlzdHcgJXI1LDI0KCVyNCkKKwljb3B5ICVyMjYsJXI1CisJbGRvIC04KCVyMCksJXI2CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjYsJXI3CisJc3R3ICVyMjUsMCglcjcpCisJbGRvIC0xNiglcjApLCVyOAorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI4LCVyOQorCWZzdGRzICVmcjcsMCglcjkpCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC0xNiglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkbyAtMjAoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIxLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIyCisJc3R3ICVyMjIsLTUyKCVyMzApCisJbGRpbCBMJ0xDJDAwMDAsJXIyNgorCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgorCWxkdyAwKCVyMTkpLCVyMjUKKwlmbGRkcyAwKCVyMjApLCVmcjcKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQorCWJsIHByaW50ZiwlcjIKKwlub3AKKwlibCxuIEwkMDAwNCwlcjAKKwlibCxuIEwkMDAwMywlcjAKK0wkMDAwNDoKK0wkMDAwMzoKKwlsZHcgOCglcjQpLCVyOQorCWxkdyAxMiglcjQpLCVyOAorCWxkdyAxNiglcjQpLCVyNworCWxkdyAyMCglcjQpLCVyNgorCWxkdyAyNCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuSU1QT1JUIF9fbWFpbixDT0RFCisJLmFsaWduIDgKK0xDJDAwMDE6CisJOyAuZG91YmxlIDUuNTAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwCisJLndvcmQgMTA3NTE4MzYxNiA7ID0gMHg0MDE2MDAwMAorCS53b3JkIDAgOyA9IDB4MAorCS5hbGlnbiA0CisJLkVYUE9SVCBtYWluCisJLkVYUE9SVCBtYWluLFBSSVZfTEVWPTMsUlROVkFMPUdSCittYWluOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJLkNBTEwgCisJYmwgX19tYWluLCVyMgorCW5vcAorCWxkbyAtMjQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjMwKSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRpbCBMJ0xDJDAwMDEsJXIyMAorCWxkbyBSJ0xDJDAwMDEoJXIyMCksJXIyMQorCWxkdyAwKCVyMjEpLCVyMjIKKwlsZHcgNCglcjIxKSwlcjIzCisJc3R3ICVyMjIsMCglcjE5KQorCXN0dyAlcjIzLDQoJXIxOSkKKwlsZG8gMyglcjApLCVyMTkKKwlzdHcgJXIxOSwtNjAoJXIzMCkKKwlsZG8gOCglcjQpLCVyMjYKKwlsZG8gMSglcjApLCVyMjUKKwlsZG8gNCglcjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIGVycm9yX18zQUFBaWlkaSwlcjIKKwlub3AKKwlsZG8gMyglcjApLCVyMTkKKwlzdHcgJXIxOSwtNTIoJXIzMCkKKwlsZG8gOCglcjQpLCVyMjYKKwlsZG8gMSglcjApLCVyMjUKKwlsZGlsIEwnTEMkMDAwMSwlcjE5CisJbGRvIFInTEMkMDAwMSglcjE5KSwlcjIwCisJZmxkZHMgMCglcjIwKSwlZnI3CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKKwlibCBva19fM0FBQWlkaSwlcjIKKwlub3AKKwljb3B5ICVyMCwlcjI4CisJYmwsbiBMJDAwMDUsJXIwCisJYmwsbiBMJDAwMDUsJXIwCitMJDAwMDU6CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxpbmZvYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxpbmZvYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4Yzc3MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucwpAQCAtMCwwICsxLDggQEAKKwkuc3BhY2UgJFRFWFQkCisJLnN1YnNwYSAkQ09ERSQKKwkuYWxpZ24gNAorCS5leHBvcnQgZGl2dSxtaWxsaWNvZGUKKwkucHJvYworCS5jYWxsaW5mbyBtaWxsaWNvZGUKK2RpdnUKKwkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0Y2FmNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZGVmYnVnLnMKQEAgLTAsMCArMSwxOCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLmltcG9ydAlfc2V0ZXJybm8KKyAJLmV4cG9ydCAgIHZmb3JrICAhCS5sYWJlbCAgIHZmb3JrICAhCS5wcm9jIQkuY2FsbGluZm8gbm9fY2FsbHMhCS5lbnRyeSAhCSAJLmxhYmVsCV9fdmZvcmsgICEJbXRzcAklcjAsJXNyMCEJbGRpbAlMJTB4YzAwMDAwMDQsJXIxIQlibGUJUiUweGMwMDAwMDA0KCVzcjAsJXIxKSEJbGRpCTY2ICAgLCVyMjIgIQliLG4JeXl5IQliLG4JX192Zm9yayAhCWIJX3NldGVycm5vIQljb3B5CSVyMjgsJXIyNiEJLmxhYmVsCXl5eSAKKwlhZGQsPQklcjAsJXIyOSwlcjAJCSAKKwljb3B5CSVyMCwlcjI4CQkgCisJYnYsbgkoJXIyKQorCS5leGl0CisgCS5wcm9jZW5kIAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZlN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9lbnRyeWJ1Zy5zCkBAIC0wLDAgKzEsMjQgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCS5JTVBPUlQgJGdsb2JhbCQsREFUQQorCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQorOyBnY2NfY29tcGlsZWQuOgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuUEFSQU0gZm9vLFJUTlZBTD1HUgorZm9vOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxOT19DQUxMUyxFTlRSWV9HUj0xLEVOVFJZX0ZSPTExCisJLkVOVFJZCisJYnYsbiAlcjAoJXIyKQorCS5FWElUCisJLlBST0NFTkQKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cG9ydGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHBvcnRidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY2NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHBvcnRidWcucwpAQCAtMCwwICsxLDE0IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKyAgICAgICAgLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCisKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JhZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHByYnVnLnMKQEAgLTAsMCArMSwzOSBAQAorICAgICAgICAuc3BhY2UJJFRFWFQkCisgICAgICAgIC5zdWJzcGEJJENPREUkCisKKwkuYWxpZ24JOAorCS5leHBvcnQJaWNvZGUsZGF0YQoraWNvZGU6CisJLnByb2MKKwkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscworCS5lbnRyeQorCWJ2LG4JJXIwKCVyMikKKwkuZXhpdAorCW5vcAorCS5wcm9jZW5kCisKKwk7CisJOyBGSVJTVCwgYXJndiBhcnJheSBvZiBwb2ludGVycyB0byBhcmdzLCAxc3QgaXMgc2FtZSBhcyBwYXRoLgorCTsKKwkuYWxpZ24JOAoraWNfYXJndjoKKwkud29yZAlpY19hcmd2MS1pY29kZQk7IHNlY29uZCwgcG9pbnRlciB0byAxc3QgYXJndW1lbnQKKwkud29yZAlpY19wYXRoLWljb2RlCQk7IGZpcnN0LCAgcG9pbnRlciB0byBpbml0IHBhdGgKKwkud29yZAkwCQkJOyBmb3VydGgsIE5VTEwgYXJndiB0ZXJtaW5hdG9yIChwYWQpCisJLndvcmQJMAkJCTsgdGhpcmQsICBOVUxMIGFyZ3YgdGVybWluYXRvcgorCitpY19wYXRoOgorCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCisJLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCisJLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgorCitpY19hcmd2MToKKwkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcworCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAorCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKKworCS5leHBvcnQJc3ppY29kZSxkYXRhCitzemljb2RlOgorCS53b3JkCXN6aWNvZGUtaWNvZGUKKwkud29yZAkwCQkJOyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpbGxlciBhdCBlbmQKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjODc0MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMKQEAgLTAsMCArMSw2MTkyIEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKwkuSU1QT1JUICRnbG9iYWwkLERBVEEKKwkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKKzsgZ2NjX2NvbXBpbGVkLjoKKwkuSU1QT1JUIHhtYWxsb2MsQ09ERQorCS5JTVBPUlQgX29ic3RhY2tfbmV3Y2h1bmssQ09ERQorCS5JTVBPUlQgbWVtc2V0LENPREUKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLkVYUE9SVCBhbGxvY190eXBlLENPREUKKwkuRVhQT1JUIGFsbG9jX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKK2FsbG9jX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTkyKCVyMzApCisJc3R3ICVyNywzMiglcjQpCisJc3R3ICVyNiwzNiglcjQpCisJc3R3ICVyNSw0MCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPSAwLCVyMjAsJXIwCisJYmwgTCQwMDAyLCVyMAorCW5vcAorCWxkbyA1MiglcjApLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHhtYWxsb2MsJXIyCisJbm9wCisJY29weSAlcjI4LCVyNworCWJsLG4gTCQwMDAzLCVyMAorTCQwMDAyOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIDEyMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJbGR3IDgoJXI0KSwlcjE5CisJc3R3ICVyMTksMTIoJXI0KQorCWxkbyA1MiglcjApLCVyMTkKKwlzdHcgJXIxOSwxNiglcjQpCisJbGR3IDEyKCVyNCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjAKKwlsZHcgMTYoJXIxOSksJXIxOQorCWxkdyAxMiglcjIwKSwlcjIwCisJc3ViICVyMTksJXIyMCwlcjE5CisJbGR3IDE2KCVyNCksJXIyMAorCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKKwlibCBMJDAwMDQsJXIwCisJbm9wCisJbGR3IDEyKCVyNCksJXIyNgorCWxkdyAxNiglcjQpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgorCW5vcAorCWNvcHkgJXIwLCVyMTkKKwlibCxuIEwkMDAwNSwlcjAKK0wkMDAwNDogCisJY29weSAlcjAsJXIxOQorTCQwMDA1OiAKKwlsZHcgMTIoJXI0KSwlcjE5CisJbGR3IDEyKCVyNCksJXIyMAorCWxkdyAxMiglcjIwKSwlcjIxCisJbGR3IDE2KCVyNCksJXIyMgorCWFkZCAlcjIxLCVyMjIsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgOCglcjQpLCVyMTkKKwlzdHcgJXIxOSwyMCglcjQpCisJbGR3IDIwKCVyNCksJXIxOQorCWxkdyA4KCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwyNCglcjQpCisJbGR3IDIwKCVyNCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjIwCisJbGR3IDI0KCVyNCksJXIxOQorCWNvbWNsciw9ICVyMjAsJXIxOSwlcjAKKwlibCBMJDAwMDYsJXIwCisJbm9wCisJbGR3IDIwKCVyNCksJXIxOQorCWxkdyA0MCglcjE5KSwlcjIwCisJY29weSAlcjIwLCVyMjEKKwlkZXBpIC0xLDEsMSwlcjIxCisJc3R3ICVyMjEsNDAoJXIxOSkKK0wkMDAwNjogCisJbGR3IDIwKCVyNCksJXIxOQorCWxkdyAyMCglcjQpLCVyMjAKKwlsZHcgMjAoJXI0KSwlcjIxCisJbGR3IDEyKCVyMjApLCVyMjAKKwlsZHcgMjQoJXIyMSksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAyMCglcjQpLCVyMjEKKwlsZHcgMjQoJXIyMSksJXIyMgorCXVhZGRjbSAlcjAsJXIyMiwlcjIxCisJYW5kICVyMjAsJXIyMSwlcjIwCisJY29weSAlcjIwLCVyMjEKKwlzdHcgJXIyMSwxMiglcjE5KQorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJbGR3IDEyKCVyMTkpLCVyMTkKKwlsZHcgNCglcjIwKSwlcjIwCisJc3ViICVyMTksJXIyMCwlcjE5CisJbGR3IDIwKCVyNCksJXIyMAorCWxkdyAyMCglcjQpLCVyMjEKKwlsZHcgMTYoJXIyMCksJXIyMAorCWxkdyA0KCVyMjEpLCVyMjEKKwlzdWIgJXIyMCwlcjIxLCVyMjAKKwljb21jbHIsPiAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMDA3LCVyMAorCW5vcAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJbGR3IDE2KCVyMjApLCVyMjEKKwlzdHcgJXIyMSwxMiglcjE5KQorCWNvcHkgJXIyMSwlcjE5CisJYmwsbiBMJDAwMDgsJXIwCitMJDAwMDc6IAorCWNvcHkgJXIwLCVyMTkKK0wkMDAwODogCisJbGR3IDIwKCVyNCksJXIxOQorCWxkdyAyMCglcjQpLCVyMjAKKwlsZHcgMTIoJXIyMCksJXIyMQorCXN0dyAlcjIxLDgoJXIxOSkKKwlsZHcgMjQoJXI0KSwlcjcKK0wkMDAwMzogCisJY29weSAlcjcsJXIyNgorCWNvcHkgJXIwLCVyMjUKKwlsZG8gNTIoJXIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBtZW1zZXQsJXIyCisJbm9wCisJc3R3ICVyMCwwKCVyNykKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMTIoJXI3KQorCWxkbyAtMSglcjApLCVyMTkKKwlzdHcgJXIxOSw0NCglcjcpCisJY29weSAlcjcsJXIyOAorCWJsLG4gTCQwMDAxLCVyMAorTCQwMDAxOiAKKwlsZHcgMzIoJXI0KSwlcjcKKwlsZHcgMzYoJXI0KSwlcjYKKwlsZHcgNDAoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKKwkuRVhQT1JUIG1ha2VfcG9pbnRlcl90eXBlLENPREUKKwkuRVhQT1JUIG1ha2VfcG9pbnRlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCittYWtlX3BvaW50ZXJfdHlwZTogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxOTIoJXIzMCkKKwlzdHcgJXI5LDE2KCVyNCkKKwlzdHcgJXI4LDIwKCVyNCkKKwlzdHcgJXI3LDI0KCVyNCkKKwlzdHcgJXI2LDI4KCVyNCkKKwlzdHcgJXI1LDMyKCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTgoJXIwKSwlcjcKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNywlcjgKKwlzdHcgJXIyNSwwKCVyOCkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDIwKCVyMTkpLCVyOQorCWNvbWljbHIsPD4gMCwlcjksJXIwCisJYmwgTCQwMDEwLCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLD0gMCwlcjIwLCVyMAorCWJsIEwkMDAxMSwlcjAKKwlub3AKKwljb3B5ICVyOSwlcjI4CisJYmwsbiBMJDAwMDksJXIwCisJYmwsbiBMJDAwMTIsJXIwCitMJDAwMTE6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw9IDAsJXIyMCwlcjAKKwlibCBMJDAwMTMsJXIwCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCXN0dyAlcjksMCglcjE5KQorCWNvcHkgJXI5LCVyMjgKKwlibCxuIEwkMDAwOSwlcjAKK0wkMDAxMzogCitMJDAwMTI6IAorTCQwMDEwOiAKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMDE1LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw9IDAsJXIyMCwlcjAKKwlibCBMJDAwMTQsJXIwCisJbm9wCisJYmwsbiBMJDAwMTUsJXIwCitMJDAwMTU6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgYWxsb2NfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDAxNiwlcjAKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJc3R3ICVyOSwwKCVyMTkpCitMJDAwMTY6IAorCWJsLG4gTCQwMDE3LCVyMAorTCQwMDE0OiAKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDAoJXIxOSksJXI5CisJbGR3IDEyKCVyOSksJXIxOQorCXN0dyAlcjE5LDgoJXI0KQorCWNvcHkgJXI5LCVyMjYKKwljb3B5ICVyMCwlcjI1CisJbGRvIDUyKCVyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgbWVtc2V0LCVyMgorCW5vcAorCWxkdyA4KCVyNCksJXIxOQorCXN0dyAlcjE5LDEyKCVyOSkKK0wkMDAxNzogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLDE2KCVyOSkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJc3R3ICVyOSwyMCglcjE5KQorCWxkbyA0KCVyMCksJXIxOQorCXN0dyAlcjE5LDgoJXI5KQorCWxkbyAxKCVyMCksJXIxOQorCXN0dyAlcjE5LDAoJXI5KQorCWxkaCAzMiglcjkpLCVyMTkKKwljb3B5ICVyMTksJXIyMAorCWRlcGkgLTEsMzEsMSwlcjIwCisJc3RoICVyMjAsMzIoJXI5KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMjAoJXIxOSksJXIyMAorCWNvbWljbHIsPSAwLCVyMjAsJXIwCisJYmwgTCQwMDE4LCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlzdHcgJXI5LDIwKCVyMTkpCitMJDAwMTg6IAorCWNvcHkgJXI5LCVyMjgKKwlibCxuIEwkMDAwOSwlcjAKK0wkMDAwOTogCisJbGR3IDE2KCVyNCksJXI5CisJbGR3IDIwKCVyNCksJXI4CisJbGR3IDI0KCVyNCksJXI3CisJbGR3IDI4KCVyNCksJXI2CisJbGR3IDMyKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CisJLkVYUE9SVCBsb29rdXBfcG9pbnRlcl90eXBlLENPREUKKwkuRVhQT1JUIGxvb2t1cF9wb2ludGVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKK2xvb2t1cF9wb2ludGVyX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyNiw4KCVyNCkKKwlzdHcgJXI1LDEyKCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjI2CisJY29weSAlcjAsJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgbWFrZV9wb2ludGVyX3R5cGUsJXIyCisJbm9wCisJYmwsbiBMJDAwMTksJXIwCitMJDAwMTk6IAorCWxkdyA4KCVyNCksJXI2CisJbGR3IDEyKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CisJLkVYUE9SVCBtYWtlX3JlZmVyZW5jZV90eXBlLENPREUKKwkuRVhQT1JUIG1ha2VfcmVmZXJlbmNlX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKK21ha2VfcmVmZXJlbmNlX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTkyKCVyMzApCisJc3R3ICVyOSwxNiglcjQpCisJc3R3ICVyOCwyMCglcjQpCisJc3R3ICVyNywyNCglcjQpCisJc3R3ICVyNiwyOCglcjQpCisJc3R3ICVyNSwzMiglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAyNCglcjE5KSwlcjkKKwljb21pY2xyLDw+IDAsJXI5LCVyMAorCWJsIEwkMDAyMSwlcjAKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw9IDAsJXIyMCwlcjAKKwlibCBMJDAwMjIsJXIwCisJbm9wCisJY29weSAlcjksJXIyOAorCWJsLG4gTCQwMDIwLCVyMAorCWJsLG4gTCQwMDIzLCVyMAorTCQwMDIyOiAKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPSAwLCVyMjAsJXIwCisJYmwgTCQwMDI0LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlzdHcgJXI5LDAoJXIxOSkKKwljb3B5ICVyOSwlcjI4CisJYmwsbiBMJDAwMjAsJXIwCitMJDAwMjQ6IAorTCQwMDIzOiAKK0wkMDAyMTogCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDAyNiwlcjAKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPSAwLCVyMjAsJXIwCisJYmwgTCQwMDI1LCVyMAorCW5vcAorCWJsLG4gTCQwMDI2LCVyMAorTCQwMDI2OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDEyKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGFsbG9jX3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAwMjcsJXIwCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCXN0dyAlcjksMCglcjE5KQorTCQwMDI3OiAKKwlibCxuIEwkMDAyOCwlcjAKK0wkMDAyNTogCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyOQorCWxkdyAxMiglcjkpLCVyMTkKKwlzdHcgJXIxOSw4KCVyNCkKKwljb3B5ICVyOSwlcjI2CisJY29weSAlcjAsJXIyNQorCWxkbyA1MiglcjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIG1lbXNldCwlcjIKKwlub3AKKwlsZHcgOCglcjQpLCVyMTkKKwlzdHcgJXIxOSwxMiglcjkpCitMJDAwMjg6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwxNiglcjkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCXN0dyAlcjksMjQoJXIxOSkKKwlsZG8gNCglcjApLCVyMTkKKwlzdHcgJXIxOSw4KCVyOSkKKwlsZG8gMTYoJXIwKSwlcjE5CisJc3R3ICVyMTksMCglcjkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAyNCglcjE5KSwlcjIwCisJY29taWNsciw9IDAsJXIyMCwlcjAKKwlibCBMJDAwMjksJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCXN0dyAlcjksMjQoJXIxOSkKK0wkMDAyOTogCisJY29weSAlcjksJXIyOAorCWJsLG4gTCQwMDIwLCVyMAorTCQwMDIwOiAKKwlsZHcgMTYoJXI0KSwlcjkKKwlsZHcgMjAoJXI0KSwlcjgKKwlsZHcgMjQoJXI0KSwlcjcKKwlsZHcgMjgoJXI0KSwlcjYKKwlsZHcgMzIoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKKwkuRVhQT1JUIGxvb2t1cF9yZWZlcmVuY2VfdHlwZSxDT0RFCisJLkVYUE9SVCBsb29rdXBfcmVmZXJlbmNlX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKK2xvb2t1cF9yZWZlcmVuY2VfdHlwZTogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxMjgoJXIzMCkKKwlzdHcgJXI2LDgoJXI0KQorCXN0dyAlcjUsMTIoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBtYWtlX3JlZmVyZW5jZV90eXBlLCVyMgorCW5vcAorCWJsLG4gTCQwMDMwLCVyMAorTCQwMDMwOiAKKwlsZHcgOCglcjQpLCVyNgorCWxkdyAxMiglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuYWxpZ24gNAorCS5FWFBPUlQgbWFrZV9mdW5jdGlvbl90eXBlLENPREUKKwkuRVhQT1JUIG1ha2VfZnVuY3Rpb25fdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgorbWFrZV9mdW5jdGlvbl90eXBlOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDE5MiglcjMwKQorCXN0dyAlcjksMTYoJXI0KQorCXN0dyAlcjgsMjAoJXI0KQorCXN0dyAlcjcsMjQoJXI0KQorCXN0dyAlcjYsMjgoJXI0KQorCXN0dyAlcjUsMzIoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtOCglcjApLCVyNworCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI3LCVyOAorCXN0dyAlcjI1LDAoJXI4KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMjgoJXIxOSksJXI5CisJY29taWNsciw8PiAwLCVyOSwlcjAKKwlibCBMJDAwMzIsJXIwCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPSAwLCVyMjAsJXIwCisJYmwgTCQwMDMzLCVyMAorCW5vcAorCWNvcHkgJXI5LCVyMjgKKwlibCxuIEwkMDAzMSwlcjAKKwlibCxuIEwkMDAzNCwlcjAKK0wkMDAzMzogCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLD0gMCwlcjIwLCVyMAorCWJsIEwkMDAzNSwlcjAKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJc3R3ICVyOSwwKCVyMTkpCisJY29weSAlcjksJXIyOAorCWJsLG4gTCQwMDMxLCVyMAorTCQwMDM1OiAKK0wkMDAzNDogCitMJDAwMzI6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAwMzcsJXIwCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLD0gMCwlcjIwLCVyMAorCWJsIEwkMDAzNiwlcjAKKwlub3AKKwlibCxuIEwkMDAzNywlcjAKK0wkMDAzNzogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBhbGxvY190eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMDM4LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlzdHcgJXI5LDAoJXIxOSkKK0wkMDAzODogCisJYmwsbiBMJDAwMzksJXIwCitMJDAwMzY6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMCglcjE5KSwlcjkKKwlsZHcgMTIoJXI5KSwlcjE5CisJc3R3ICVyMTksOCglcjQpCisJY29weSAlcjksJXIyNgorCWNvcHkgJXIwLCVyMjUKKwlsZG8gNTIoJXIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBtZW1zZXQsJXIyCisJbm9wCisJbGR3IDgoJXI0KSwlcjE5CisJc3R3ICVyMTksMTIoJXI5KQorTCQwMDM5OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMTYoJXI5KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlzdHcgJXI5LDI4KCVyMTkpCisJbGRvIDEoJXIwKSwlcjE5CisJc3R3ICVyMTksOCglcjkpCisJbGRvIDYoJXIwKSwlcjE5CisJc3R3ICVyMTksMCglcjkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAyOCglcjE5KSwlcjIwCisJY29taWNsciw9IDAsJXIyMCwlcjAKKwlibCBMJDAwNDAsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCXN0dyAlcjksMjgoJXIxOSkKK0wkMDA0MDogCisJY29weSAlcjksJXIyOAorCWJsLG4gTCQwMDMxLCVyMAorTCQwMDMxOiAKKwlsZHcgMTYoJXI0KSwlcjkKKwlsZHcgMjAoJXI0KSwlcjgKKwlsZHcgMjQoJXI0KSwlcjcKKwlsZHcgMjgoJXI0KSwlcjYKKwlsZHcgMzIoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKKwkuRVhQT1JUIGxvb2t1cF9mdW5jdGlvbl90eXBlLENPREUKKwkuRVhQT1JUIGxvb2t1cF9mdW5jdGlvbl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCitsb29rdXBfZnVuY3Rpb25fdHlwZTogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxMjgoJXIzMCkKKwlzdHcgJXI2LDgoJXI0KQorCXN0dyAlcjUsMTIoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBtYWtlX2Z1bmN0aW9uX3R5cGUsJXIyCisJbm9wCisJYmwsbiBMJDAwNDEsJXIwCitMJDAwNDE6IAorCWxkdyA4KCVyNCksJXI2CisJbGR3IDEyKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5JTVBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsQ09ERQorCS5hbGlnbiA0CisJLkVYUE9SVCBsb29rdXBfbWVtYmVyX3R5cGUsQ09ERQorCS5FWFBPUlQgbG9va3VwX21lbWJlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCitsb29rdXBfbWVtYmVyX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyOCw4KCVyNCkKKwlzdHcgJXI3LDEyKCVyNCkKKwlzdHcgJXI2LDE2KCVyNCkKKwlzdHcgJXI1LDIwKCVyNCkKKwlsZG8gMjQoJXI0KSwlcjEKKwlmc3RkcyxtYSAlZnIxMiw4KCVyMSkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTgoJXIwKSwlcjcKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNywlcjgKKwlzdHcgJXIyNSwwKCVyOCkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDEyKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGFsbG9jX3R5cGUsJXIyCisJbm9wCisJc3R3ICVyMjgsLTE2KCVyMzApCisJZmxkd3MgLTE2KCVyMzApLCVmcjEyCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJZnN0d3MgJWZyMTIsLTE2KCVyMzApCisJbGR3IC0xNiglcjMwKSwlcjI2CisJbGR3IDAoJXIxOSksJXIyNQorCWxkdyAwKCVyMjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHNtYXNoX3RvX21lbWJlcl90eXBlLCVyMgorCW5vcAorCWZzdHdzICVmcjEyLC0xNiglcjMwKQorCWxkdyAtMTYoJXIzMCksJXIyOAorCWJsLG4gTCQwMDQyLCVyMAorTCQwMDQyOiAKKwlsZHcgOCglcjQpLCVyOAorCWxkdyAxMiglcjQpLCVyNworCWxkdyAxNiglcjQpLCVyNgorCWxkdyAyMCglcjQpLCVyNQorCWxkbyAyNCglcjQpLCVyMQorCWZsZGRzLG1hIDgoJXIxKSwlZnIxMgorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuYWxpZ24gNAorCS5FWFBPUlQgYWxsb2NhdGVfc3R1Yl9tZXRob2QsQ09ERQorCS5FWFBPUlQgYWxsb2NhdGVfc3R1Yl9tZXRob2QsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKK2FsbG9jYXRlX3N0dWJfbWV0aG9kOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjYsMTYoJXI0KQorCXN0dyAlcjUsMjAoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgYWxsb2NfdHlwZSwlcjIKKwlub3AKKwlzdHcgJXIyOCw4KCVyNCkKKwlsZHcgOCglcjQpLCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTYoJXIxOSkKKwlsZHcgOCglcjQpLCVyMTkKKwlsZG8gNCglcjApLCVyMjAKKwlzdGggJXIyMCwzMiglcjE5KQorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAxNSglcjApLCVyMjAKKwlzdHcgJXIyMCwwKCVyMTkpCisJbGR3IDgoJXI0KSwlcjE5CisJbGRvIDEoJXIwKSwlcjIwCisJc3R3ICVyMjAsOCglcjE5KQorCWxkdyA4KCVyNCksJXIyOAorCWJsLG4gTCQwMDQzLCVyMAorTCQwMDQzOiAKKwlsZHcgMTYoJXI0KSwlcjYKKwlsZHcgMjAoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLklNUE9SVCBidWlsdGluX3R5cGVfaW50LERBVEEKKwkuYWxpZ24gNAorCS5FWFBPUlQgY3JlYXRlX2FycmF5X3R5cGUsQ09ERQorCS5FWFBPUlQgY3JlYXRlX2FycmF5X3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKK2NyZWF0ZV9hcnJheV90eXBlOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDE5MiglcjMwKQorCXN0dyAlcjEwLDU2KCVyNCkKKwlzdHcgJXI5LDYwKCVyNCkKKwlzdHcgJXI4LDY0KCVyNCkKKwlzdHcgJXI3LDY4KCVyNCkKKwlzdHcgJXI2LDcyKCVyNCkKKwlzdHcgJXI1LDc2KCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTgoJXIwKSwlcjcKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNywlcjgKKwlzdHcgJXIyNSwwKCVyOCkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDEyKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGFsbG9jX3R5cGUsJXIyCisJbm9wCisJc3R3ICVyMjgsOCglcjQpCisJbGR3IDgoJXI0KSwlcjE5CisJbGRvIDIoJXIwKSwlcjIwCisJc3R3ICVyMjAsMCglcjE5KQorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlzdHcgJXIyMSwxNiglcjE5KQorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkbyAtNCglcjApLCVyMjEKKwlsZG8gLTMyKCVyNCksJXIyMworCWFkZCAlcjIzLCVyMjEsJXIyMgorCWxkdyAwKCVyMjIpLCVyMjEKKwlsZHcgMCglcjIwKSwlcjIwCisJbGR3IDgoJXIyMSksJXIyMQorCXN0dyAlcjIwLC0xNiglcjMwKQorCWZsZHdzIC0xNiglcjMwKSwlZnI1CisJc3R3ICVyMjEsLTE2KCVyMzApCisJZmxkd3MgLTE2KCVyMzApLCVmcjVSCisJeG1weXUgJWZyNSwlZnI1UiwlZnI0CisJZnN0d3MgJWZyNFIsLTE2KCVyMzApCisJbGR3IC0xNiglcjMwKSwlcjI0CisJc3R3ICVyMjQsOCglcjE5KQorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAxKCVyMCksJXIyMAorCXN0aCAlcjIwLDM0KCVyMTkpCisJbGR3IDgoJXI0KSwlcjkKKwlsZHcgOCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDA1MCwlcjAKKwlub3AKKwlsZHcgOCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkbyAxMjAoJXIyMCksJXIxOQorCXN0dyAlcjE5LDE2KCVyNCkKKwlsZHcgMTYoJXI0KSwlcjE5CisJc3R3ICVyMTksMjAoJXI0KQorCWxkbyAxNiglcjApLCVyMTkKKwlzdHcgJXIxOSwyNCglcjQpCisJbGR3IDIwKCVyNCksJXIxOQorCWxkdyAyMCglcjQpLCVyMjAKKwlsZHcgMTYoJXIxOSksJXIxOQorCWxkdyAxMiglcjIwKSwlcjIwCisJc3ViICVyMTksJXIyMCwlcjE5CisJbGR3IDI0KCVyNCksJXIyMAorCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKKwlibCBMJDAwNDUsJXIwCisJbm9wCisJbGR3IDIwKCVyNCksJXIyNgorCWxkdyAyNCglcjQpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgorCW5vcAorCWNvcHkgJXIwLCVyMTkKKwlibCxuIEwkMDA0NiwlcjAKK0wkMDA0NTogCisJY29weSAlcjAsJXIxOQorTCQwMDQ2OiAKKwlsZHcgMjAoJXI0KSwlcjE5CisJbGR3IDIwKCVyNCksJXIyMAorCWxkdyAxMiglcjIwKSwlcjIxCisJbGR3IDI0KCVyNCksJXIyMgorCWFkZCAlcjIxLCVyMjIsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgMTYoJXI0KSwlcjE5CisJc3R3ICVyMTksMjgoJXI0KQorCWxkdyAyOCglcjQpLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMzIoJXI0KQorCWxkdyAyOCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkdyAzMiglcjQpLCVyMTkKKwljb21jbHIsPSAlcjIwLCVyMTksJXIwCisJYmwgTCQwMDQ3LCVyMAorCW5vcAorCWxkdyAyOCglcjQpLCVyMTkKKwlsZHcgNDAoJXIxOSksJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJZGVwaSAtMSwxLDEsJXIyMQorCXN0dyAlcjIxLDQwKCVyMTkpCitMJDAwNDc6IAorCWxkdyAyOCglcjQpLCVyMTkKKwlsZHcgMjgoJXI0KSwlcjIwCisJbGR3IDI4KCVyNCksJXIyMQorCWxkdyAxMiglcjIwKSwlcjIwCisJbGR3IDI0KCVyMjEpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwlsZHcgMjgoJXI0KSwlcjIxCisJbGR3IDI0KCVyMjEpLCVyMjIKKwl1YWRkY20gJXIwLCVyMjIsJXIyMQorCWFuZCAlcjIwLCVyMjEsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgMjgoJXI0KSwlcjE5CisJbGR3IDI4KCVyNCksJXIyMAorCWxkdyAxMiglcjE5KSwlcjE5CisJbGR3IDQoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyAyOCglcjQpLCVyMjAKKwlsZHcgMjgoJXI0KSwlcjIxCisJbGR3IDE2KCVyMjApLCVyMjAKKwlsZHcgNCglcjIxKSwlcjIxCisJc3ViICVyMjAsJXIyMSwlcjIwCisJY29tY2xyLD4gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDA0OCwlcjAKKwlub3AKKwlsZHcgMjgoJXI0KSwlcjE5CisJbGR3IDI4KCVyNCksJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwljb3B5ICVyMjEsJXIxOQorCWJsLG4gTCQwMDQ5LCVyMAorTCQwMDQ4OiAKKwljb3B5ICVyMCwlcjE5CitMJDAwNDk6IAorCWxkdyAyOCglcjQpLCVyMTkKKwlsZHcgMjgoJXI0KSwlcjIwCisJbGR3IDEyKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw4KCVyMTkpCisJbGR3IDMyKCVyNCksJXIxMAorCWJsLG4gTCQwMDUxLCVyMAorTCQwMDUwOiAKKwlsZG8gMTYoJXIwKSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCB4bWFsbG9jLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjEwCitMJDAwNTE6IAorCXN0dyAlcjEwLDM2KCVyOSkKKwlsZHcgOCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgYWxsb2NfdHlwZSwlcjIKKwlub3AKKwlzdHcgJXIyOCwxMiglcjQpCisJbGR3IDEyKCVyNCksJXIxOQorCWxkbyAxMSglcjApLCVyMjAKKwlzdHcgJXIyMCwwKCVyMTkpCisJbGR3IDEyKCVyNCksJXIxOQorCWFkZGlsIEwnYnVpbHRpbl90eXBlX2ludC0kZ2xvYmFsJCwlcjI3CisJbGR3IFInYnVpbHRpbl90eXBlX2ludC0kZ2xvYmFsJCglcjEpLCVyMjAKKwlzdHcgJXIyMCwxNiglcjE5KQorCWxkdyAxMiglcjQpLCVyMTkKKwlsZG8gNCglcjApLCVyMjAKKwlzdHcgJXIyMCw4KCVyMTkpCisJbGR3IDEyKCVyNCksJXIxOQorCWxkbyAyKCVyMCksJXIyMAorCXN0aCAlcjIwLDM0KCVyMTkpCisJbGR3IDEyKCVyNCksJXI5CisJbGR3IDEyKCVyNCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMDU3LCVyMAorCW5vcAorCWxkdyAxMiglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkbyAxMjAoJXIyMCksJXIxOQorCXN0dyAlcjE5LDM2KCVyNCkKKwlsZHcgMzYoJXI0KSwlcjE5CisJc3R3ICVyMTksNDAoJXI0KQorCWxkbyAzMiglcjApLCVyMTkKKwlzdHcgJXIxOSw0NCglcjQpCisJbGR3IDQwKCVyNCksJXIxOQorCWxkdyA0MCglcjQpLCVyMjAKKwlsZHcgMTYoJXIxOSksJXIxOQorCWxkdyAxMiglcjIwKSwlcjIwCisJc3ViICVyMTksJXIyMCwlcjE5CisJbGR3IDQ0KCVyNCksJXIyMAorCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKKwlibCBMJDAwNTIsJXIwCisJbm9wCisJbGR3IDQwKCVyNCksJXIyNgorCWxkdyA0NCglcjQpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgorCW5vcAorCWNvcHkgJXIwLCVyMTkKKwlibCxuIEwkMDA1MywlcjAKK0wkMDA1MjogCisJY29weSAlcjAsJXIxOQorTCQwMDUzOiAKKwlsZHcgNDAoJXI0KSwlcjE5CisJbGR3IDQwKCVyNCksJXIyMAorCWxkdyAxMiglcjIwKSwlcjIxCisJbGR3IDQ0KCVyNCksJXIyMgorCWFkZCAlcjIxLCVyMjIsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgMzYoJXI0KSwlcjE5CisJc3R3ICVyMTksNDgoJXI0KQorCWxkdyA0OCglcjQpLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJc3R3ICVyMjAsNTIoJXI0KQorCWxkdyA0OCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkdyA1MiglcjQpLCVyMTkKKwljb21jbHIsPSAlcjIwLCVyMTksJXIwCisJYmwgTCQwMDU0LCVyMAorCW5vcAorCWxkdyA0OCglcjQpLCVyMTkKKwlsZHcgNDAoJXIxOSksJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJZGVwaSAtMSwxLDEsJXIyMQorCXN0dyAlcjIxLDQwKCVyMTkpCitMJDAwNTQ6IAorCWxkdyA0OCglcjQpLCVyMTkKKwlsZHcgNDgoJXI0KSwlcjIwCisJbGR3IDQ4KCVyNCksJXIyMQorCWxkdyAxMiglcjIwKSwlcjIwCisJbGR3IDI0KCVyMjEpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwlsZHcgNDgoJXI0KSwlcjIxCisJbGR3IDI0KCVyMjEpLCVyMjIKKwl1YWRkY20gJXIwLCVyMjIsJXIyMQorCWFuZCAlcjIwLCVyMjEsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgNDgoJXI0KSwlcjE5CisJbGR3IDQ4KCVyNCksJXIyMAorCWxkdyAxMiglcjE5KSwlcjE5CisJbGR3IDQoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyA0OCglcjQpLCVyMjAKKwlsZHcgNDgoJXI0KSwlcjIxCisJbGR3IDE2KCVyMjApLCVyMjAKKwlsZHcgNCglcjIxKSwlcjIxCisJc3ViICVyMjAsJXIyMSwlcjIwCisJY29tY2xyLD4gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDA1NSwlcjAKKwlub3AKKwlsZHcgNDgoJXI0KSwlcjE5CisJbGR3IDQ4KCVyNCksJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwljb3B5ICVyMjEsJXIxOQorCWJsLG4gTCQwMDU2LCVyMAorTCQwMDU1OiAKKwljb3B5ICVyMCwlcjE5CitMJDAwNTY6IAorCWxkdyA0OCglcjQpLCVyMTkKKwlsZHcgNDgoJXI0KSwlcjIwCisJbGR3IDEyKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw4KCVyMTkpCisJbGR3IDUyKCVyNCksJXIxMAorCWJsLG4gTCQwMDU4LCVyMAorTCQwMDU3OiAKKwlsZG8gMzIoJXIwKSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCB4bWFsbG9jLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjEwCitMJDAwNTg6IAorCXN0dyAlcjEwLDM2KCVyOSkKKwlsZHcgMTIoJXI0KSwlcjE5CisJbGR3IDM2KCVyMTkpLCVyMjAKKwlzdHcgJXIwLDAoJXIyMCkKKwlsZHcgMTIoJXI0KSwlcjE5CisJbGRvIDE2KCVyMCksJXIyMAorCWxkdyAzNiglcjE5KSwlcjIxCisJYWRkICVyMjAsJXIyMSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkbyAtMSglcjIwKSwlcjIxCisJc3R3ICVyMjEsMCglcjE5KQorCWxkdyAxMiglcjQpLCVyMjAKKwlsZHcgMzYoJXIyMCksJXIxOQorCWFkZGlsIEwnYnVpbHRpbl90eXBlX2ludC0kZ2xvYmFsJCwlcjI3CisJbGR3IFInYnVpbHRpbl90eXBlX2ludC0kZ2xvYmFsJCglcjEpLCVyMjAKKwlzdHcgJXIyMCw4KCVyMTkpCisJbGR3IDEyKCVyNCksJXIxOQorCWxkbyAxNiglcjApLCVyMjAKKwlsZHcgMzYoJXIxOSksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIxOQorCWFkZGlsIEwnYnVpbHRpbl90eXBlX2ludC0kZ2xvYmFsJCwlcjI3CisJbGR3IFInYnVpbHRpbl90eXBlX2ludC0kZ2xvYmFsJCglcjEpLCVyMjAKKwlzdHcgJXIyMCw4KCVyMTkpCisJbGR3IDgoJXI0KSwlcjE5CisJbGR3IDM2KCVyMTkpLCVyMjAKKwlsZHcgMTIoJXI0KSwlcjE5CisJc3R3ICVyMTksOCglcjIwKQorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAtMSglcjApLCVyMjAKKwlzdHcgJXIyMCw0NCglcjE5KQorCWxkdyA4KCVyNCksJXIyOAorCWJsLG4gTCQwMDQ0LCVyMAorTCQwMDQ0OiAKKwlsZHcgNTYoJXI0KSwlcjEwCisJbGR3IDYwKCVyNCksJXI5CisJbGR3IDY0KCVyNCksJXI4CisJbGR3IDY4KCVyNCksJXI3CisJbGR3IDcyKCVyNCksJXI2CisJbGR3IDc2KCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CisJLkVYUE9SVCBzbWFzaF90b19tZW1iZXJfdHlwZSxDT0RFCisJLkVYUE9SVCBzbWFzaF90b19tZW1iZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCitzbWFzaF90b19tZW1iZXJfdHlwZTogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxOTIoJXIzMCkKKwlzdHcgJXIxMCwxNiglcjQpCisJc3R3ICVyOSwyMCglcjQpCisJc3R3ICVyOCwyNCglcjQpCisJc3R3ICVyNywyOCglcjQpCisJc3R3ICVyNiwzMiglcjQpCisJc3R3ICVyNSwzNiglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC0xMiglcjApLCVyOQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI5LCVyMTAKKwlzdHcgJXIyNCwwKCVyMTApCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyNgorCWNvcHkgJXIwLCVyMjUKKwlsZG8gNTIoJXIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBtZW1zZXQsJXIyCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCXN0dyAlcjIwLDEyKCVyMTkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAtMTIoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTYoJXIxOSkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIyMCksJXIyMQorCXN0dyAlcjIxLDQwKCVyMTkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAxKCVyMCksJXIyMAorCXN0dyAlcjIwLDgoJXIxOSkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIDE0KCVyMCksJXIyMAorCXN0dyAlcjIwLDAoJXIxOSkKK0wkMDA1OTogCisJbGR3IDE2KCVyNCksJXIxMAorCWxkdyAyMCglcjQpLCVyOQorCWxkdyAyNCglcjQpLCVyOAorCWxkdyAyOCglcjQpLCVyNworCWxkdyAzMiglcjQpLCVyNgorCWxkdyAzNiglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuYWxpZ24gNAorCS5FWFBPUlQgc21hc2hfdG9fbWV0aG9kX3R5cGUsQ09ERQorCS5FWFBPUlQgc21hc2hfdG9fbWV0aG9kX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorc21hc2hfdG9fbWV0aG9kX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTkyKCVyMzApCisJc3R3ICVyMTIsMTYoJXI0KQorCXN0dyAlcjExLDIwKCVyNCkKKwlzdHcgJXIxMCwyNCglcjQpCisJc3R3ICVyOSwyOCglcjQpCisJc3R3ICVyOCwzMiglcjQpCisJc3R3ICVyNywzNiglcjQpCisJc3R3ICVyNiw0MCglcjQpCisJc3R3ICVyNSw0NCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC0xMiglcjApLCVyOQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI5LCVyMTAKKwlzdHcgJXIyNCwwKCVyMTApCisJbGRvIC0xNiglcjApLCVyMTEKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyMTEsJXIxMgorCXN0dyAlcjIzLDAoJXIxMikKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDEyKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw4KCVyNCkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjI2CisJY29weSAlcjAsJXIyNQorCWxkbyA1MiglcjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIG1lbXNldCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDgoJXI0KSwlcjIwCisJc3R3ICVyMjAsMTIoJXIxOSkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIC0xMiglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlzdHcgJXIyMSwxNiglcjE5KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZG8gLTgoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjIwKSwlcjIxCisJc3R3ICVyMjEsNDAoJXIxOSkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIC0xNiglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw0OCglcjE5KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZG8gMSglcjApLCVyMjAKKwlzdHcgJXIyMCw4KCVyMTkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAxNSglcjApLCVyMjAKKwlzdHcgJXIyMCwwKCVyMTkpCitMJDAwNjA6IAorCWxkdyAxNiglcjQpLCVyMTIKKwlsZHcgMjAoJXI0KSwlcjExCisJbGR3IDI0KCVyNCksJXIxMAorCWxkdyAyOCglcjQpLCVyOQorCWxkdyAzMiglcjQpLCVyOAorCWxkdyAzNiglcjQpLCVyNworCWxkdyA0MCglcjQpLCVyNgorCWxkdyA0NCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuSU1QT1JUIHN0cm5jbXAsQ09ERQorCS5hbGlnbiA0CitMQyQwMDAwOiAKKwkuU1RSSU5HICJzdHJ1Y3QgXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAwMTogCisJLlNUUklORyAidW5pb24gXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAwMjogCisJLlNUUklORyAiZW51bSBceDAwIgorCS5hbGlnbiA0CisJLkVYUE9SVCB0eXBlX25hbWVfbm9fdGFnLENPREUKKwkuRVhQT1JUIHR5cGVfbmFtZV9ub190YWcsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKK3R5cGVfbmFtZV9ub190YWc6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyNiw4KCVyNCkKKwlzdHcgJXI1LDEyKCVyNCkKKwljb3B5ICVyMjYsJXI1CisJbGR3IDQoJXI1KSwlcjYKKwljb21pY2xyLDw+IDAsJXI2LCVyMAorCWJsIEwkMDA2MiwlcjAKKwlub3AKKwlsZHcgMCglcjUpLCVyMTkKKwljb21pY2xyLDw+IDQsJXIxOSwlcjAKKwlibCBMJDAwNjYsJXIwCisJbm9wCisJY29taWNsciw+PSA0LCVyMTksJXIwCisJYmwgTCQwMDcyLCVyMAorCW5vcAorCWNvbWljbHIsPD4gMywlcjE5LCVyMAorCWJsIEwkMDA2NCwlcjAKKwlub3AKKwlibCxuIEwkMDA3MCwlcjAKK0wkMDA3MjogCisJY29taWNsciw8PiA1LCVyMTksJXIwCisJYmwgTCQwMDY4LCVyMAorCW5vcAorCWJsLG4gTCQwMDcwLCVyMAorTCQwMDY0OiAKKwljb3B5ICVyNiwlcjI2CisJbGRpbCBMJ0xDJDAwMDAsJXIyNQorCWxkbyBSJ0xDJDAwMDAoJXIyNSksJXIyNQorCWxkbyA3KCVyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RybmNtcCwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWNvbWljbHIsPSAwLCVyMTksJXIwCisJYmwgTCQwMDY1LCVyMAorCW5vcAorCWxkbyA3KCVyNiksJXI2CitMJDAwNjU6IAorCWJsLG4gTCQwMDYzLCVyMAorTCQwMDY2OiAKKwljb3B5ICVyNiwlcjI2CisJbGRpbCBMJ0xDJDAwMDEsJXIyNQorCWxkbyBSJ0xDJDAwMDEoJXIyNSksJXIyNQorCWxkbyA2KCVyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RybmNtcCwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWNvbWljbHIsPSAwLCVyMTksJXIwCisJYmwgTCQwMDY3LCVyMAorCW5vcAorCWxkbyA2KCVyNiksJXI2CitMJDAwNjc6IAorCWJsLG4gTCQwMDYzLCVyMAorTCQwMDY4OiAKKwljb3B5ICVyNiwlcjI2CisJbGRpbCBMJ0xDJDAwMDIsJXIyNQorCWxkbyBSJ0xDJDAwMDIoJXIyNSksJXIyNQorCWxkbyA1KCVyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RybmNtcCwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWNvbWljbHIsPSAwLCVyMTksJXIwCisJYmwgTCQwMDY5LCVyMAorCW5vcAorCWxkbyA1KCVyNiksJXI2CitMJDAwNjk6IAorCWJsLG4gTCQwMDYzLCVyMAorTCQwMDcwOiAKKwlibCxuIEwkMDA2MywlcjAKK0wkMDA2MzogCitMJDAwNjI6IAorCWNvcHkgJXI2LCVyMjgKKwlibCxuIEwkMDA2MSwlcjAKK0wkMDA2MTogCisJbGR3IDgoJXI0KSwlcjYKKwlsZHcgMTIoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLklNUE9SVCBjdXJyZW50X2xhbmd1YWdlLERBVEEKKwkuSU1QT1JUIHN0cmNtcCxDT0RFCisJLmFsaWduIDQKKwkuRVhQT1JUIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsQ09ERQorCS5FWFBPUlQgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgorbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZTogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxMjgoJXIzMCkKKwlzdHcgJXI2LDE2KCVyNCkKKwlzdHcgJXI1LDIwKCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlhZGRpbCBMJ2N1cnJlbnRfbGFuZ3VhZ2UtJGdsb2JhbCQsJXIyNworCWxkdyBSJ2N1cnJlbnRfbGFuZ3VhZ2UtJGdsb2JhbCQoJXIxKSwlcjE5CisJbGR3IDgoJXIxOSksJXIyMAorCXN0dyAlcjIwLDgoJXI0KQorTCQwMDc0OiAKKwlsZHcgOCglcjQpLCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMDc1LCVyMAorCW5vcAorCWxkdyA4KCVyNCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDQoJXIxOSksJXIyNgorCWxkdyAwKCVyMjApLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWNvbWljbHIsPSAwLCVyMTksJXIwCisJYmwgTCQwMDc3LCVyMAorCW5vcAorCWxkdyA4KCVyNCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZHcgMCglcjIwKSwlcjI4CisJYmwsbiBMJDAwNzMsJXIwCitMJDAwNzc6IAorTCQwMDc2OiAKKwlsZHcgOCglcjQpLCVyMTkKKwlsZG8gNCglcjE5KSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJYmwsbiBMJDAwNzQsJXIwCitMJDAwNzU6IAorCWNvcHkgJXIwLCVyMjgKKwlibCxuIEwkMDA3MywlcjAKK0wkMDA3MzogCisJbGR3IDE2KCVyNCksJXI2CisJbGR3IDIwKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5JTVBPUlQgbG9va3VwX3N5bWJvbCxDT0RFCisJLklNUE9SVCBlcnJvcixDT0RFCisJLmFsaWduIDQKK0xDJDAwMDM6IAorCS5TVFJJTkcgIk5vIHR5cGUgbmFtZWQgJXMuXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgbG9va3VwX3R5cGVuYW1lLENPREUKKwkuRVhQT1JUIGxvb2t1cF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgorbG9va3VwX3R5cGVuYW1lOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDE5MiglcjMwKQorCXN0dyAlcjEyLDgoJXI0KQorCXN0dyAlcjExLDEyKCVyNCkKKwlzdHcgJXIxMCwxNiglcjQpCisJc3R3ICVyOSwyMCglcjQpCisJc3R3ICVyOCwyNCglcjQpCisJc3R3ICVyNywyOCglcjQpCisJc3R3ICVyNiwzMiglcjQpCisJc3R3ICVyNSwzNiglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC0xMiglcjApLCVyOQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI5LCVyMTAKKwlzdHcgJXIyNCwwKCVyMTApCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJc3R3ICVyMCwtNTIoJXIzMCkKKwlsZHcgMCglcjE5KSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCWxkbyAxKCVyMCksJXIyNAorCWNvcHkgJXIwLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGxvb2t1cF9zeW1ib2wsJXIyCisJbm9wCisJY29weSAlcjI4LCVyMTEKKwljb21pY2xyLDw+IDAsJXIxMSwlcjAKKwlibCBMJDAwODAsJXIwCisJbm9wCisJbGR3IDgoJXIxMSksJXIxOQorCWNvbWljbHIsPSA4LCVyMTksJXIwCisJYmwgTCQwMDgwLCVyMAorCW5vcAorCWJsLG4gTCQwMDc5LCVyMAorTCQwMDgwOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjEyCisJY29taWNsciw8PiAwLCVyMTIsJXIwCisJYmwgTCQwMDgxLCVyMAorCW5vcAorCWNvcHkgJXIxMiwlcjI4CisJYmwsbiBMJDAwNzgsJXIwCisJYmwsbiBMJDAwODIsJXIwCitMJDAwODE6IAorCWNvbWljbHIsPSAwLCVyMTIsJXIwCisJYmwgTCQwMDgzLCVyMAorCW5vcAorCWxkbyAtMTIoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMDgzLCVyMAorCW5vcAorCWNvcHkgJXIwLCVyMjgKKwlibCxuIEwkMDA3OCwlcjAKKwlibCxuIEwkMDA4NCwlcjAKK0wkMDA4MzogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRpbCBMJ0xDJDAwMDMsJXIyNgorCWxkbyBSJ0xDJDAwMDMoJXIyNiksJXIyNgorCWxkdyAwKCVyMTkpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGVycm9yLCVyMgorCW5vcAorTCQwMDg0OiAKK0wkMDA4MjogCitMJDAwNzk6IAorCWxkdyAxMiglcjExKSwlcjI4CisJYmwsbiBMJDAwNzgsJXIwCitMJDAwNzg6IAorCWxkdyA4KCVyNCksJXIxMgorCWxkdyAxMiglcjQpLCVyMTEKKwlsZHcgMTYoJXI0KSwlcjEwCisJbGR3IDIwKCVyNCksJXI5CisJbGR3IDI0KCVyNCksJXI4CisJbGR3IDI4KCVyNCksJXI3CisJbGR3IDMyKCVyNCksJXI2CisJbGR3IDM2KCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5JTVBPUlQgYWxsb2NhLENPREUKKwkuSU1QT1JUIHN0cmxlbixDT0RFCisJLklNUE9SVCBzdHJjcHksQ09ERQorCS5hbGlnbiA0CitMQyQwMDA0OiAKKwkuU1RSSU5HICJ1bnNpZ25lZCBceDAwIgorCS5hbGlnbiA0CisJLkVYUE9SVCBsb29rdXBfdW5zaWduZWRfdHlwZW5hbWUsQ09ERQorCS5FWFBPUlQgbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCitsb29rdXBfdW5zaWduZWRfdHlwZW5hbWU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyNiwxNiglcjQpCisJc3R3ICVyNSwyMCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgc3RybGVuLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjE5CisJbGRvIDEwKCVyMTkpLCVyMjAKKwlsZG8gNyglcjIwKSwlcjIxCisJY29weSAlcjIxLCVyMTkKKwlsZG8gNjMoJXIxOSksJXIyMAorCWV4dHJ1ICVyMjAsMjUsMjYsJXIxOQorCXpkZXAgJXIxOSwyNSwyNiwlcjIwCisJbGRvIC05NiglcjMwKSwlcjE5CisJYWRkICVyMzAsJXIyMCwlcjMwCisJbGRvIDcoJXIxOSksJXIyMAorCWV4dHJ1ICVyMjAsMjgsMjksJXIxOQorCXpkZXAgJXIxOSwyOCwyOSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJbGR3IDgoJXI0KSwlcjI2CisJbGRpbCBMJ0xDJDAwMDQsJXIyNQorCWxkbyBSJ0xDJDAwMDQoJXIyNSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY3B5LCVyMgorCW5vcAorCWxkdyA4KCVyNCksJXIyMAorCWxkbyA5KCVyMjApLCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkdyAwKCVyMjApLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNweSwlcjIKKwlub3AKKwlsZHcgOCglcjQpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJY29weSAlcjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgbG9va3VwX3R5cGVuYW1lLCVyMgorCW5vcAorCWJsLG4gTCQwMDg1LCVyMAorTCQwMDg1OiAKKwlsZHcgMTYoJXI0KSwlcjYKKwlsZHcgMjAoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKK0xDJDAwMDU6IAorCS5TVFJJTkcgInNpZ25lZCBceDAwIgorCS5hbGlnbiA0CisJLkVYUE9SVCBsb29rdXBfc2lnbmVkX3R5cGVuYW1lLENPREUKKwkuRVhQT1JUIGxvb2t1cF9zaWduZWRfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKK2xvb2t1cF9zaWduZWRfdHlwZW5hbWU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyNiwxNiglcjQpCisJc3R3ICVyNSwyMCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgc3RybGVuLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjE5CisJbGRvIDgoJXIxOSksJXIyMAorCWxkbyA3KCVyMjApLCVyMjEKKwljb3B5ICVyMjEsJXIxOQorCWxkbyA2MyglcjE5KSwlcjIwCisJZXh0cnUgJXIyMCwyNSwyNiwlcjE5CisJemRlcCAlcjE5LDI1LDI2LCVyMjAKKwlsZG8gLTk2KCVyMzApLCVyMTkKKwlhZGQgJXIzMCwlcjIwLCVyMzAKKwlsZG8gNyglcjE5KSwlcjIwCisJZXh0cnUgJXIyMCwyOCwyOSwlcjE5CisJemRlcCAlcjE5LDI4LDI5LCVyMjAKKwlzdHcgJXIyMCwxMiglcjQpCisJbGR3IDEyKCVyNCksJXIyNgorCWxkaWwgTCdMQyQwMDA1LCVyMjUKKwlsZG8gUidMQyQwMDA1KCVyMjUpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNweSwlcjIKKwlub3AKKwlsZHcgMTIoJXI0KSwlcjIwCisJbGRvIDcoJXIyMCksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWNvcHkgJXIxOSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY3B5LCVyMgorCW5vcAorCWxkdyAxMiglcjQpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJbGRvIDEoJXIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBsb29rdXBfdHlwZW5hbWUsJXIyCisJbm9wCisJc3R3ICVyMjgsOCglcjQpCisJbGR3IDgoJXI0KSwlcjE5CisJY29taWNsciw8PiAwLCVyMTksJXIwCisJYmwgTCQwMDg3LCVyMAorCW5vcAorCWxkdyA4KCVyNCksJXIyOAorCWJsLG4gTCQwMDg2LCVyMAorTCQwMDg3OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjI2CisJY29weSAlcjAsJXIyNQorCWNvcHkgJXIwLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKKwlub3AKKwlibCxuIEwkMDA4NiwlcjAKK0wkMDA4NjogCisJbGR3IDE2KCVyNCksJXI2CisJbGR3IDIwKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CitMQyQwMDA2OiAKKwkuU1RSSU5HICJObyBzdHJ1Y3QgdHlwZSBuYW1lZCAlcy5ceDAwIgorCS5hbGlnbiA0CitMQyQwMDA3OiAKKwkuU1RSSU5HICJUaGlzIGNvbnRleHQgaGFzIGNsYXNzLCB1bmlvbiBvciBlbnVtICVzLCBub3QgYSBzdHJ1Y3QuXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgbG9va3VwX3N0cnVjdCxDT0RFCisJLkVYUE9SVCBsb29rdXBfc3RydWN0LEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCitsb29rdXBfc3RydWN0OiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjksOCglcjQpCisJc3R3ICVyOCwxMiglcjQpCisJc3R3ICVyNywxNiglcjQpCisJc3R3ICVyNiwyMCglcjQpCisJc3R3ICVyNSwyNCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJc3R3ICVyMCwtNTIoJXIzMCkKKwlsZHcgMCglcjE5KSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCWxkbyAyKCVyMCksJXIyNAorCWNvcHkgJXIwLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGxvb2t1cF9zeW1ib2wsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWNvbWljbHIsPSAwLCVyOSwlcjAKKwlibCBMJDAwODksJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRpbCBMJ0xDJDAwMDYsJXIyNgorCWxkbyBSJ0xDJDAwMDYoJXIyNiksJXIyNgorCWxkdyAwKCVyMTkpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGVycm9yLCVyMgorCW5vcAorTCQwMDg5OiAKKwlsZHcgMTIoJXI5KSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMywlcjIwLCVyMAorCWJsIEwkMDA5MCwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZGlsIEwnTEMkMDAwNywlcjI2CisJbGRvIFInTEMkMDAwNyglcjI2KSwlcjI2CisJbGR3IDAoJXIxOSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgZXJyb3IsJXIyCisJbm9wCitMJDAwOTA6IAorCWxkdyAxMiglcjkpLCVyMjgKKwlibCxuIEwkMDA4OCwlcjAKK0wkMDA4ODogCisJbGR3IDgoJXI0KSwlcjkKKwlsZHcgMTIoJXI0KSwlcjgKKwlsZHcgMTYoJXI0KSwlcjcKKwlsZHcgMjAoJXI0KSwlcjYKKwlsZHcgMjQoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKK0xDJDAwMDg6IAorCS5TVFJJTkcgIk5vIHVuaW9uIHR5cGUgbmFtZWQgJXMuXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAwOTogCisJLlNUUklORyAiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgc3RydWN0IG9yIGVudW0gJXMsIG5vdCBhIHVuaW9uLlx4MDAiCisJLmFsaWduIDQKKwkuRVhQT1JUIGxvb2t1cF91bmlvbixDT0RFCisJLkVYUE9SVCBsb29rdXBfdW5pb24sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKK2xvb2t1cF91bmlvbjogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxMjgoJXIzMCkKKwlzdHcgJXI5LDgoJXI0KQorCXN0dyAlcjgsMTIoJXI0KQorCXN0dyAlcjcsMTYoJXI0KQorCXN0dyAlcjYsMjAoJXI0KQorCXN0dyAlcjUsMjQoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtOCglcjApLCVyNworCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI3LCVyOAorCXN0dyAlcjI1LDAoJXI4KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCXN0dyAlcjAsLTUyKCVyMzApCisJbGR3IDAoJXIxOSksJXIyNgorCWxkdyAwKCVyMjApLCVyMjUKKwlsZG8gMiglcjApLCVyMjQKKwljb3B5ICVyMCwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBsb29rdXBfc3ltYm9sLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwljb21pY2xyLD0gMCwlcjksJXIwCisJYmwgTCQwMDkyLCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkaWwgTCdMQyQwMDA4LCVyMjYKKwlsZG8gUidMQyQwMDA4KCVyMjYpLCVyMjYKKwlsZHcgMCglcjE5KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBlcnJvciwlcjIKKwlub3AKK0wkMDA5MjogCisJbGR3IDEyKCVyOSksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDQsJXIyMCwlcjAKKwlibCBMJDAwOTMsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRpbCBMJ0xDJDAwMDksJXIyNgorCWxkbyBSJ0xDJDAwMDkoJXIyNiksJXIyNgorCWxkdyAwKCVyMTkpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGVycm9yLCVyMgorCW5vcAorTCQwMDkzOiAKKwlsZHcgMTIoJXI5KSwlcjI4CisJYmwsbiBMJDAwOTEsJXIwCitMJDAwOTE6IAorCWxkdyA4KCVyNCksJXI5CisJbGR3IDEyKCVyNCksJXI4CisJbGR3IDE2KCVyNCksJXI3CisJbGR3IDIwKCVyNCksJXI2CisJbGR3IDI0KCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CitMQyQwMDEwOiAKKwkuU1RSSU5HICJObyBlbnVtIHR5cGUgbmFtZWQgJXMuXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAxMTogCisJLlNUUklORyAiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgc3RydWN0IG9yIHVuaW9uICVzLCBub3QgYW4gZW51bS5ceDAwIgorCS5hbGlnbiA0CisJLkVYUE9SVCBsb29rdXBfZW51bSxDT0RFCisJLkVYUE9SVCBsb29rdXBfZW51bSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgorbG9va3VwX2VudW06IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyOSw4KCVyNCkKKwlzdHcgJXI4LDEyKCVyNCkKKwlzdHcgJXI3LDE2KCVyNCkKKwlzdHcgJXI2LDIwKCVyNCkKKwlzdHcgJXI1LDI0KCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTgoJXIwKSwlcjcKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNywlcjgKKwlzdHcgJXIyNSwwKCVyOCkKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTgoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlzdHcgJXIwLC01MiglcjMwKQorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZHcgMCglcjIwKSwlcjI1CisJbGRvIDIoJXIwKSwlcjI0CisJY29weSAlcjAsJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgbG9va3VwX3N5bWJvbCwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJY29taWNsciw9IDAsJXI5LCVyMAorCWJsIEwkMDA5NSwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZGlsIEwnTEMkMDAxMCwlcjI2CisJbGRvIFInTEMkMDAxMCglcjI2KSwlcjI2CisJbGR3IDAoJXIxOSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgZXJyb3IsJXIyCisJbm9wCitMJDAwOTU6IAorCWxkdyAxMiglcjkpLCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw8PiA1LCVyMjAsJXIwCisJYmwgTCQwMDk2LCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkaWwgTCdMQyQwMDExLCVyMjYKKwlsZG8gUidMQyQwMDExKCVyMjYpLCVyMjYKKwlsZHcgMCglcjE5KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBlcnJvciwlcjIKKwlub3AKK0wkMDA5NjogCisJbGR3IDEyKCVyOSksJXIyOAorCWJsLG4gTCQwMDk0LCVyMAorTCQwMDk0OiAKKwlsZHcgOCglcjQpLCVyOQorCWxkdyAxMiglcjQpLCVyOAorCWxkdyAxNiglcjQpLCVyNworCWxkdyAyMCglcjQpLCVyNgorCWxkdyAyNCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuSU1QT1JUIHN0cmNhdCxDT0RFCisJLmFsaWduIDQKK0xDJDAwMTI6IAorCS5TVFJJTkcgIjxceDAwIgorCS5hbGlnbiA0CitMQyQwMDEzOiAKKwkuU1RSSU5HICIgPlx4MDAiCisJLmFsaWduIDQKK0xDJDAwMTQ6IAorCS5TVFJJTkcgIk5vIHRlbXBsYXRlIHR5cGUgbmFtZWQgJXMuXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgbG9va3VwX3RlbXBsYXRlX3R5cGUsQ09ERQorCS5FWFBPUlQgbG9va3VwX3RlbXBsYXRlX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKK2xvb2t1cF90ZW1wbGF0ZV90eXBlOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDE5MiglcjMwKQorCXN0dyAlcjExLDE2KCVyNCkKKwlzdHcgJXIxMCwyMCglcjQpCisJc3R3ICVyOSwyNCglcjQpCisJc3R3ICVyOCwyOCglcjQpCisJc3R3ICVyNywzMiglcjQpCisJc3R3ICVyNiwzNiglcjQpCisJc3R3ICVyNSw0MCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC0xMiglcjApLCVyOQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI5LCVyMTAKKwlzdHcgJXIyNCwwKCVyMTApCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgc3RybGVuLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjExCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyA0KCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHN0cmxlbiwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWFkZCAlcjExLCVyMTksJXIyMAorCWxkbyA0KCVyMjApLCVyMTkKKwlsZG8gNyglcjE5KSwlcjIwCisJY29weSAlcjIwLCVyMTkKKwlsZG8gNjMoJXIxOSksJXIyMAorCWV4dHJ1ICVyMjAsMjUsMjYsJXIxOQorCXpkZXAgJXIxOSwyNSwyNiwlcjIwCisJbGRvIC05NiglcjMwKSwlcjE5CisJYWRkICVyMzAsJXIyMCwlcjMwCisJbGRvIDcoJXIxOSksJXIyMAorCWV4dHJ1ICVyMjAsMjgsMjksJXIxOQorCXpkZXAgJXIxOSwyOCwyOSwlcjIwCisJc3R3ICVyMjAsMTIoJXI0KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAxMiglcjQpLCVyMjYKKwlsZHcgMCglcjE5KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjcHksJXIyCisJbm9wCisJbGR3IDEyKCVyNCksJXIyNgorCWxkaWwgTCdMQyQwMDEyLCVyMjUKKwlsZG8gUidMQyQwMDEyKCVyMjUpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNhdCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDEyKCVyNCksJXIyNgorCWxkdyA0KCVyMTkpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNhdCwlcjIKKwlub3AKKwlsZHcgMTIoJXI0KSwlcjI2CisJbGRpbCBMJ0xDJDAwMTMsJXIyNQorCWxkbyBSJ0xDJDAwMTMoJXIyNSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY2F0LCVyMgorCW5vcAorCWxkbyAtMTIoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlzdHcgJXIwLC01MiglcjMwKQorCWxkdyAxMiglcjQpLCVyMjYKKwlsZHcgMCglcjE5KSwlcjI1CisJbGRvIDEoJXIwKSwlcjI0CisJY29weSAlcjAsJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgbG9va3VwX3N5bWJvbCwlcjIKKwlub3AKKwlzdHcgJXIyOCw4KCVyNCkKKwlsZHcgOCglcjQpLCVyMTkKKwljb21pY2xyLD0gMCwlcjE5LCVyMAorCWJsIEwkMDA5OCwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZGlsIEwnTEMkMDAxNCwlcjI2CisJbGRvIFInTEMkMDAxNCglcjI2KSwlcjI2CisJbGR3IDAoJXIxOSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgZXJyb3IsJXIyCisJbm9wCitMJDAwOTg6IAorCWxkdyA4KCVyNCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWNvbWljbHIsPD4gMywlcjE5LCVyMAorCWJsIEwkMDA5OSwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZGlsIEwnTEMkMDAwNywlcjI2CisJbGRvIFInTEMkMDAwNyglcjI2KSwlcjI2CisJbGR3IDAoJXIxOSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgZXJyb3IsJXIyCisJbm9wCitMJDAwOTk6IAorCWxkdyA4KCVyNCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjI4CisJYmwsbiBMJDAwOTcsJXIwCitMJDAwOTc6IAorCWxkdyAxNiglcjQpLCVyMTEKKwlsZHcgMjAoJXI0KSwlcjEwCisJbGR3IDI0KCVyNCksJXI5CisJbGR3IDI4KCVyNCksJXI4CisJbGR3IDMyKCVyNCksJXI3CisJbGR3IDM2KCVyNCksJXI2CisJbGR3IDQwKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5JTVBPUlQgY3VycmVudF90YXJnZXQsREFUQQorCS5JTVBPUlQgZmZsdXNoLENPREUKKwkuSU1QT1JUIF9faW9iLERBVEEKKwkuSU1QT1JUIGZwcmludGYsQ09ERQorCS5hbGlnbiA0CitMQyQwMDE1OiAKKwkuU1RSSU5HICJUeXBlIFx4MDAiCisJLklNUE9SVCB0eXBlX3ByaW50LENPREUKKwkuYWxpZ24gNAorTEMkMDAxNjogCisJLlNUUklORyAiXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAxNzogCisJLlNUUklORyAiIGlzIG5vdCBhIHN0cnVjdHVyZSBvciB1bmlvbiB0eXBlLlx4MDAiCisJLklNUE9SVCBjaGVja19zdHViX3R5cGUsQ09ERQorCS5hbGlnbiA0CitMQyQwMDE4OiAKKwkuU1RSSU5HICIgaGFzIG5vIGNvbXBvbmVudCBuYW1lZCBceDAwIgorCS5JTVBPUlQgZnB1dHNfZmlsdGVyZWQsQ09ERQorCS5hbGlnbiA0CitMQyQwMDE5OiAKKwkuU1RSSU5HICIuXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSxDT0RFCisJLkVYUE9SVCBsb29rdXBfc3RydWN0X2VsdF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCitsb29rdXBfc3RydWN0X2VsdF90eXBlOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDE5MiglcjMwKQorCXN0dyAlcjExLDI0KCVyNCkKKwlzdHcgJXIxMCwyOCglcjQpCisJc3R3ICVyOSwzMiglcjQpCisJc3R3ICVyOCwzNiglcjQpCisJc3R3ICVyNyw0MCglcjQpCisJc3R3ICVyNiw0NCglcjQpCisJc3R3ICVyNSw0OCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC0xMiglcjApLCVyOQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI5LCVyMTAKKwlzdHcgJXIyNCwwKCVyMTApCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDEsJXIyMCwlcjAKKwlibCBMJDAxMDIsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZG8gMTYoJXIwKSwlcjE5CisJY29tY2xyLDw+ICVyMjAsJXIxOSwlcjAKKwlibCBMJDAxMDIsJXIwCisJbm9wCisJYmwsbiBMJDAxMDEsJXIwCitMJDAxMDI6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZHcgMTYoJXIyMCksJXIyMQorCXN0dyAlcjIxLDAoJXIxOSkKK0wkMDEwMTogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDMsJXIyMCwlcjAKKwlibCBMJDAxMDMsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDQsJXIyMCwlcjAKKwlibCBMJDAxMDMsJXIwCisJbm9wCisJYWRkaWwgTCdjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCwlcjI3CisJbGR3IFInY3VycmVudF90YXJnZXQtJGdsb2JhbCQoJXIxKSwlcjE5CisJbGR3IDc2KCVyMTkpLCVyMTEKKwljb3B5ICVyMTEsJXIyMgorCS5DQUxMCUFSR1cwPUdSCisJYmwgJCRkeW5jYWxsLCVyMzEKKwljb3B5ICVyMzEsJXIyCisJYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCsxNiwlcjI3CisJbGRvIFInX19pb2ItJGdsb2JhbCQrMTYoJXIxKSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBmZmx1c2gsJXIyCisJbm9wCisJYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3CisJbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2CisJbGRpbCBMJ0xDJDAwMTUsJXIyNQorCWxkbyBSJ0xDJDAwMTUoJXIyNSksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgZnByaW50ZiwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjI2CisJbGRpbCBMJ0xDJDAwMTYsJXIyNQorCWxkbyBSJ0xDJDAwMTYoJXIyNSksJXIyNQorCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNworCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNAorCWxkbyAtMSglcjApLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIHR5cGVfcHJpbnQsJXIyCisJbm9wCisJbGRpbCBMJ0xDJDAwMTcsJXIyNgorCWxkbyBSJ0xDJDAwMTcoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgZXJyb3IsJXIyCisJbm9wCitMJDAxMDM6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGNoZWNrX3N0dWJfdHlwZSwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRoIDM0KCVyMTkpLCVyMjAKKwlleHRycyAlcjIwLDMxLDE2LCVyMTkKKwlsZG8gLTEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDgoJXI0KQorTCQwMTA0OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDQ4KCVyMTkpLCVyMjAKKwlsZGggMCglcjIwKSwlcjIxCisJZXh0cnMgJXIyMSwzMSwxNiwlcjE5CisJbGR3IDgoJXI0KSwlcjIwCisJY29tY2xyLD49ICVyMjAsJXIxOSwlcjAKKwlibCBMJDAxMDUsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCXpkZXAgJXIyMCwyNywyOCwlcjIxCisJbGR3IDM2KCVyMTkpLCVyMjAKKwlhZGQgJXIyMSwlcjIwLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCXN0dyAlcjIwLDEyKCVyNCkKKwlsZHcgMTIoJXI0KSwlcjE5CisJY29taWNsciw8PiAwLCVyMTksJXIwCisJYmwgTCQwMTA3LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAxMiglcjQpLCVyMjYKKwlsZHcgMCglcjE5KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyCisJbm9wCisJY29weSAlcjI4LCVyMTkKKwljb21pY2xyLD0gMCwlcjE5LCVyMAorCWJsIEwkMDEwNywlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDgoJXI0KSwlcjIwCisJemRlcCAlcjIwLDI3LDI4LCVyMjEKKwlsZHcgMzYoJXIxOSksJXIyMAorCWFkZCAlcjIxLCVyMjAsJXIxOQorCWxkdyA4KCVyMTkpLCVyMjgKKwlibCxuIEwkMDEwMCwlcjAKK0wkMDEwNzogCitMJDAxMDY6IAorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAtMSglcjE5KSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJYmwsbiBMJDAxMDQsJXIwCitMJDAxMDU6IAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgNDgoJXIxOSksJXIyMAorCWxkaCAwKCVyMjApLCVyMjEKKwlleHRycyAlcjIxLDMxLDE2LCVyMTkKKwlsZG8gLTEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDgoJXI0KQorTCQwMTA4OiAKKwlsZHcgOCglcjQpLCVyMTkKKwljb21pY2xyLDw9IDAsJXIxOSwlcjAKKwlibCBMJDAxMDksJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCXpkZXAgJXIyMCwyNywyOCwlcjIxCisJbGR3IDM2KCVyMTkpLCVyMjAKKwlhZGQgJXIyMSwlcjIwLCVyMTkKKwlsZG8gLTgoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgOCglcjE5KSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsJXIyCisJbm9wCisJc3R3ICVyMjgsMTYoJXI0KQorCWxkdyAxNiglcjQpLCVyMTkKKwljb21pY2xyLDw+IDAsJXIxOSwlcjAKKwlibCBMJDAxMTEsJXIwCisJbm9wCisJbGR3IDE2KCVyNCksJXIyOAorCWJsLG4gTCQwMTAwLCVyMAorTCQwMTExOiAKK0wkMDExMDogCisJbGR3IDgoJXI0KSwlcjE5CisJbGRvIC0xKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw4KCVyNCkKKwlibCxuIEwkMDEwOCwlcjAKK0wkMDEwOTogCisJbGRvIC0xMiglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAxMTIsJXIwCisJbm9wCisJY29weSAlcjAsJXIyOAorCWJsLG4gTCQwMTAwLCVyMAorTCQwMTEyOiAKKwlhZGRpbCBMJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkLCVyMjcKKwlsZHcgUidjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCglcjEpLCVyMTkKKwlsZHcgNzYoJXIxOSksJXIxMQorCWNvcHkgJXIxMSwlcjIyCisJLkNBTEwJQVJHVzA9R1IKKwlibCAkJGR5bmNhbGwsJXIzMQorCWNvcHkgJXIzMSwlcjIKKwlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzE2LCVyMjcKKwlsZG8gUidfX2lvYi0kZ2xvYmFsJCsxNiglcjEpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGZmbHVzaCwlcjIKKwlub3AKKwlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKKwlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjYKKwlsZGlsIEwnTEMkMDAxNSwlcjI1CisJbGRvIFInTEMkMDAxNSglcjI1KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBmcHJpbnRmLCVyMgorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDAxNiwlcjI1CisJbGRvIFInTEMkMDAxNiglcjI1KSwlcjI1CisJYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3CisJbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI0CisJbGRvIC0xKCVyMCksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgdHlwZV9wcmludCwlcjIKKwlub3AKKwlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKKwlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjYKKwlsZGlsIEwnTEMkMDAxOCwlcjI1CisJbGRvIFInTEMkMDAxOCglcjI1KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBmcHJpbnRmLCVyMgorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKKwlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGZwdXRzX2ZpbHRlcmVkLCVyMgorCW5vcAorCWxkaWwgTCdMQyQwMDE5LCVyMjYKKwlsZG8gUidMQyQwMDE5KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGVycm9yLCVyMgorCW5vcAorCWxkbyAtMSglcjApLCVyMjgKKwlibCxuIEwkMDEwMCwlcjAKK0wkMDEwMDogCisJbGR3IDI0KCVyNCksJXIxMQorCWxkdyAyOCglcjQpLCVyMTAKKwlsZHcgMzIoJXI0KSwlcjkKKwlsZHcgMzYoJXI0KSwlcjgKKwlsZHcgNDAoJXI0KSwlcjcKKwlsZHcgNDQoJXI0KSwlcjYKKwlsZHcgNDgoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKKwkuRVhQT1JUIGZpbGxfaW5fdnB0cl9maWVsZG5vLENPREUKKwkuRVhQT1JUIGZpbGxfaW5fdnB0cl9maWVsZG5vLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKK2ZpbGxfaW5fdnB0cl9maWVsZG5vOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjYsMTYoJXI0KQorCXN0dyAlcjUsMjAoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgNDQoJXIxOSksJXIyMAorCWNvbWljbHIsPiAwLCVyMjAsJXIwCisJYmwgTCQwMTE0LCVyMAorCW5vcAorCWxkbyAxKCVyMCksJXIxOQorCXN0dyAlcjE5LDgoJXI0KQorTCQwMTE1OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDQ4KCVyMTkpLCVyMjAKKwlsZGggMCglcjIwKSwlcjIxCisJZXh0cnMgJXIyMSwzMSwxNiwlcjE5CisJbGR3IDgoJXI0KSwlcjIwCisJY29tY2xyLDwgJXIyMCwlcjE5LCVyMAorCWJsIEwkMDExNiwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDgoJXI0KSwlcjIwCisJemRlcCAlcjIwLDI3LDI4LCVyMjEKKwlsZHcgMzYoJXIxOSksJXIyMAorCWFkZCAlcjIxLCVyMjAsJXIxOQorCWxkdyA4KCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGZpbGxfaW5fdnB0cl9maWVsZG5vLCVyMgorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgOCglcjQpLCVyMjAKKwl6ZGVwICVyMjAsMjcsMjgsJXIyMQorCWxkdyAzNiglcjE5KSwlcjIwCisJYWRkICVyMjEsJXIyMCwlcjE5CisJbGR3IDgoJXIxOSksJXIyMAorCWxkdyA0NCglcjIwKSwlcjE5CisJY29taWNsciw8PSAwLCVyMTksJXIwCisJYmwgTCQwMTE4LCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDgoJXI0KSwlcjIxCisJemRlcCAlcjIxLDI3LDI4LCVyMjIKKwlsZHcgMzYoJXIyMCksJXIyMQorCWFkZCAlcjIyLCVyMjEsJXIyMAorCWxkdyA4KCVyMjApLCVyMjEKKwlsZHcgNDQoJXIyMSksJXIyMAorCXN0dyAlcjIwLDQ0KCVyMTkpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZHcgOCglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjcsMjgsJXIyMgorCWxkdyAzNiglcjIwKSwlcjIxCisJYWRkICVyMjIsJXIyMSwlcjIwCisJbGR3IDgoJXIyMCksJXIyMQorCWxkdyA0MCglcjIxKSwlcjIwCisJc3R3ICVyMjAsNDAoJXIxOSkKKwlibCxuIEwkMDExNiwlcjAKK0wkMDExODogCitMJDAxMTc6IAorCWxkdyA4KCVyNCksJXIxOQorCWxkbyAxKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw4KCVyNCkKKwlibCxuIEwkMDExNSwlcjAKK0wkMDExNjogCitMJDAxMTQ6IAorTCQwMTEzOiAKKwlsZHcgMTYoJXI0KSwlcjYKKwlsZHcgMjAoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLkVYUE9SVCBzdHViX25vbmFtZV9jb21wbGFpbnQsREFUQQorCS5hbGlnbiA0CitMQyQwMDIwOiAKKwkuU1RSSU5HICJzdHViIHR5cGUgaGFzIE5VTEwgbmFtZVx4MDAiCisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gNAorc3R1Yl9ub25hbWVfY29tcGxhaW50OiAKKwkud29yZCBMQyQwMDIwCisJLndvcmQgMAorCS53b3JkIDAKKwkuSU1QT1JUIGNvbXBsYWluLENPREUKKwkuSU1QT1JUIG1lbWNweSxDT0RFCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgY2hlY2tfc3R1Yl90eXBlLENPREUKKwkuRVhQT1JUIGNoZWNrX3N0dWJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSCitjaGVja19zdHViX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyNiwxNiglcjQpCisJc3R3ICVyNSwyMCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkaCAzMiglcjE5KSwlcjIwCisJbGRvIDQoJXIwKSwlcjIxCisJYW5kICVyMjAsJXIyMSwlcjE5CisJZXh0cnMgJXIxOSwzMSwxNiwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMTIwLCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHR5cGVfbmFtZV9ub190YWcsJXIyCisJbm9wCisJc3R3ICVyMjgsOCglcjQpCisJbGR3IDgoJXI0KSwlcjE5CisJY29taWNsciw9IDAsJXIxOSwlcjAKKwlibCBMJDAxMjEsJXIwCisJbm9wCisJYWRkaWwgTCdzdHViX25vbmFtZV9jb21wbGFpbnQtJGdsb2JhbCQsJXIyNworCWxkbyBSJ3N0dWJfbm9uYW1lX2NvbXBsYWludC0kZ2xvYmFsJCglcjEpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBjb21wbGFpbiwlcjIKKwlub3AKKwlibCxuIEwkMDExOSwlcjAKK0wkMDEyMTogCisJc3R3ICVyMCwtNTIoJXIzMCkKKwlsZHcgOCglcjQpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJbGRvIDIoJXIwKSwlcjI0CisJY29weSAlcjAsJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgbG9va3VwX3N5bWJvbCwlcjIKKwlub3AKKwlzdHcgJXIyOCwxMiglcjQpCisJbGR3IDEyKCVyNCksJXIxOQorCWNvbWljbHIsPD4gMCwlcjE5LCVyMAorCWJsIEwkMDEyMiwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkdyAxMiglcjIwKSwlcjI1CisJbGRvIDUyKCVyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgbWVtY3B5LCVyMgorCW5vcAorTCQwMTIyOiAKK0wkMDEyMDogCitMJDAxMTk6IAorCWxkdyAxNiglcjQpLCVyNgorCWxkdyAyMCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuSU1QT1JUIGdkYl9tYW5nbGVfbmFtZSxDT0RFCisJLklNUE9SVCBjcGx1c19kZW1hbmdsZSxDT0RFCisJLmFsaWduIDQKK0xDJDAwMjE6IAorCS5TVFJJTkcgIkludGVybmFsOiBDYW5ub3QgZGVtYW5nbGUgbWFuZ2xlZCBuYW1lIGAlcycuXHgwMCIKKwkuSU1QT1JUIHN0cmNocixDT0RFCisJLklNUE9SVCBwYXJzZV9hbmRfZXZhbF90eXBlLENPREUKKwkuSU1QT1JUIGJ1aWx0aW5fdHlwZV92b2lkLERBVEEKKwkuSU1QT1JUIGZyZWUsQ09ERQorCS5hbGlnbiA0CisJLkVYUE9SVCBjaGVja19zdHViX21ldGhvZCxDT0RFCisJLkVYUE9SVCBjaGVja19zdHViX21ldGhvZCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCitjaGVja19zdHViX21ldGhvZDogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxOTIoJXIzMCkKKwlzdHcgJXIxMSw2NCglcjQpCisJc3R3ICVyMTAsNjgoJXI0KQorCXN0dyAlcjksNzIoJXI0KQorCXN0dyAlcjgsNzYoJXI0KQorCXN0dyAlcjcsODAoJXI0KQorCXN0dyAlcjYsODQoJXI0KQorCXN0dyAlcjUsODgoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtOCglcjApLCVyNworCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI3LCVyOAorCXN0dyAlcjI1LDAoJXI4KQorCWxkbyAtMTIoJXIwKSwlcjkKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyOSwlcjEwCisJc3R3ICVyMjQsMCglcjEwKQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkbyAtMTIoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIxLCVyMjEKKwlsZHcgMCglcjE5KSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCWxkdyAwKCVyMjEpLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIGdkYl9tYW5nbGVfbmFtZSwlcjIKKwlub3AKKwlzdHcgJXIyOCwxMiglcjQpCisJbGR3IDEyKCVyNCksJXIyNgorCWxkbyAzKCVyMCksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgY3BsdXNfZGVtYW5nbGUsJXIyCisJbm9wCisJc3R3ICVyMjgsMTYoJXI0KQorCXN0dyAlcjAsMjgoJXI0KQorCWxkbyAxKCVyMCksJXIxOQorCXN0dyAlcjE5LDMyKCVyNCkKKwlsZHcgMTYoJXI0KSwlcjE5CisJY29taWNsciw9IDAsJXIxOSwlcjAKKwlibCBMJDAxMjQsJXIwCisJbm9wCisJbGRpbCBMJ0xDJDAwMjEsJXIyNgorCWxkbyBSJ0xDJDAwMjEoJXIyNiksJXIyNgorCWxkdyAxMiglcjQpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGVycm9yLCVyMgorCW5vcAorTCQwMTI0OiAKKwlsZHcgMTYoJXI0KSwlcjI2CisJbGRvIDQwKCVyMCksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY2hyLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDIwKCVyNCkKKwlsZHcgMjAoJXI0KSwlcjE5CisJc3R3ICVyMTksMjQoJXI0KQorTCQwMTI1OiAKKwlsZHcgMjQoJXI0KSwlcjE5CisJbGRiIDAoJXIxOSksJXIyMAorCWV4dHJzICVyMjAsMzEsOCwlcjE5CisJY29taWNsciw8PiAwLCVyMTksJXIwCisJYmwgTCQwMTI2LCVyMAorCW5vcAorCWxkdyAyNCglcjQpLCVyMTkKKwlsZGIgMCglcjE5KSwlcjIwCisJZXh0cnMgJXIyMCwzMSw4LCVyMTkKKwlsZG8gNDAoJXIwKSwlcjIwCisJY29tY2xyLD0gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDEyNywlcjAKKwlub3AKKwlsZHcgMjgoJXI0KSwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDI4KCVyNCkKKwlibCxuIEwkMDEyOCwlcjAKK0wkMDEyNzogCisJbGR3IDI0KCVyNCksJXIxOQorCWxkYiAwKCVyMTkpLCVyMjAKKwlleHRycyAlcjIwLDMxLDgsJXIxOQorCWxkbyA0MSglcjApLCVyMjAKKwljb21jbHIsPSAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMTI5LCVyMAorCW5vcAorCWxkdyAyOCglcjQpLCVyMTkKKwlsZG8gLTEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDI4KCVyNCkKKwlibCxuIEwkMDEzMCwlcjAKK0wkMDEyOTogCisJbGR3IDI0KCVyNCksJXIxOQorCWxkYiAwKCVyMTkpLCVyMjAKKwlleHRycyAlcjIwLDMxLDgsJXIxOQorCWxkbyA0NCglcjApLCVyMjAKKwljb21jbHIsPSAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMTMxLCVyMAorCW5vcAorCWxkdyAyOCglcjQpLCVyMTkKKwljb21pY2xyLD0gMCwlcjE5LCVyMAorCWJsIEwkMDEzMSwlcjAKKwlub3AKKwlsZHcgMzIoJXI0KSwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDMyKCVyNCkKK0wkMDEzMTogCitMJDAxMzA6IAorTCQwMTI4OiAKKwlsZHcgMjQoJXI0KSwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDI0KCVyNCkKKwlibCxuIEwkMDEyNSwlcjAKK0wkMDEyNjogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMTM3LCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkbyAxMjAoJXIyMCksJXIxOQorCXN0dyAlcjE5LDQ0KCVyNCkKKwlsZHcgNDQoJXI0KSwlcjE5CisJc3R3ICVyMTksNDgoJXI0KQorCWxkdyAzMiglcjQpLCVyMjAKKwlsZG8gMiglcjIwKSwlcjE5CisJemRlcCAlcjE5LDI5LDMwLCVyMjAKKwlzdHcgJXIyMCw1MiglcjQpCisJbGR3IDQ4KCVyNCksJXIxOQorCWxkdyA0OCglcjQpLCVyMjAKKwlsZHcgMTYoJXIxOSksJXIxOQorCWxkdyAxMiglcjIwKSwlcjIwCisJc3ViICVyMTksJXIyMCwlcjE5CisJbGR3IDUyKCVyNCksJXIyMAorCWNvbWNsciw8ICVyMTksJXIyMCwlcjAKKwlibCBMJDAxMzIsJXIwCisJbm9wCisJbGR3IDQ4KCVyNCksJXIyNgorCWxkdyA1MiglcjQpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIF9vYnN0YWNrX25ld2NodW5rLCVyMgorCW5vcAorCWNvcHkgJXIwLCVyMTkKKwlibCxuIEwkMDEzMywlcjAKK0wkMDEzMjogCisJY29weSAlcjAsJXIxOQorTCQwMTMzOiAKKwlsZHcgNDgoJXI0KSwlcjE5CisJbGR3IDQ4KCVyNCksJXIyMAorCWxkdyAxMiglcjIwKSwlcjIxCisJbGR3IDUyKCVyNCksJXIyMgorCWFkZCAlcjIxLCVyMjIsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgNDQoJXI0KSwlcjE5CisJc3R3ICVyMTksNTYoJXI0KQorCWxkdyA1NiglcjQpLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJc3R3ICVyMjAsNjAoJXI0KQorCWxkdyA1NiglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkdyA2MCglcjQpLCVyMTkKKwljb21jbHIsPSAlcjIwLCVyMTksJXIwCisJYmwgTCQwMTM0LCVyMAorCW5vcAorCWxkdyA1NiglcjQpLCVyMTkKKwlsZHcgNDAoJXIxOSksJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJZGVwaSAtMSwxLDEsJXIyMQorCXN0dyAlcjIxLDQwKCVyMTkpCitMJDAxMzQ6IAorCWxkdyA1NiglcjQpLCVyMTkKKwlsZHcgNTYoJXI0KSwlcjIwCisJbGR3IDU2KCVyNCksJXIyMQorCWxkdyAxMiglcjIwKSwlcjIwCisJbGR3IDI0KCVyMjEpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwlsZHcgNTYoJXI0KSwlcjIxCisJbGR3IDI0KCVyMjEpLCVyMjIKKwl1YWRkY20gJXIwLCVyMjIsJXIyMQorCWFuZCAlcjIwLCVyMjEsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgNTYoJXI0KSwlcjE5CisJbGR3IDU2KCVyNCksJXIyMAorCWxkdyAxMiglcjE5KSwlcjE5CisJbGR3IDQoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyA1NiglcjQpLCVyMjAKKwlsZHcgNTYoJXI0KSwlcjIxCisJbGR3IDE2KCVyMjApLCVyMjAKKwlsZHcgNCglcjIxKSwlcjIxCisJc3ViICVyMjAsJXIyMSwlcjIwCisJY29tY2xyLD4gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDEzNSwlcjAKKwlub3AKKwlsZHcgNTYoJXI0KSwlcjE5CisJbGR3IDU2KCVyNCksJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwljb3B5ICVyMjEsJXIxOQorCWJsLG4gTCQwMTM2LCVyMAorTCQwMTM1OiAKKwljb3B5ICVyMCwlcjE5CitMJDAxMzY6IAorCWxkdyA1NiglcjQpLCVyMTkKKwlsZHcgNTYoJXI0KSwlcjIwCisJbGR3IDEyKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw4KCVyMTkpCisJbGR3IDYwKCVyNCksJXIxMQorCWJsLG4gTCQwMTM4LCVyMAorTCQwMTM3OiAKKwlsZHcgMzIoJXI0KSwlcjIwCisJbGRvIDIoJXIyMCksJXIxOQorCXpkZXAgJXIxOSwyOSwzMCwlcjIwCisJY29weSAlcjIwLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHhtYWxsb2MsJXIyCisJbm9wCisJY29weSAlcjI4LCVyMTEKK0wkMDEzODogCisJc3R3ICVyMTEsMzYoJXI0KQorCWxkdyAyMCglcjQpLCVyMTkKKwlzdHcgJXIxOSwyNCglcjQpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgbG9va3VwX3BvaW50ZXJfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWxkdyAzNiglcjQpLCVyMjAKKwlzdHcgJXIxOSwwKCVyMjApCisJbGRvIDEoJXIwKSwlcjE5CisJc3R3ICVyMTksMzIoJXI0KQorCWxkdyAyNCglcjQpLCVyMTkKKwlsZGIgMCglcjE5KSwlcjIwCisJZXh0cnMgJXIyMCwzMSw4LCVyMTkKKwlsZG8gNDEoJXIwKSwlcjIwCisJY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKKwlibCBMJDAxMzksJXIwCisJbm9wCisJc3R3ICVyMCwyOCglcjQpCitMJDAxNDA6IAorCWxkdyAyNCglcjQpLCVyMTkKKwlsZGIgMCglcjE5KSwlcjIwCisJZXh0cnMgJXIyMCwzMSw4LCVyMTkKKwljb21pY2xyLDw+IDAsJXIxOSwlcjAKKwlibCBMJDAxNDEsJXIwCisJbm9wCisJbGR3IDI4KCVyNCksJXIxOQorCWNvbWljbHIsPj0gMCwlcjE5LCVyMAorCWJsIEwkMDE0MiwlcjAKKwlub3AKKwlsZHcgMjQoJXI0KSwlcjE5CisJbGRiIDAoJXIxOSksJXIyMAorCWV4dHJzICVyMjAsMzEsOCwlcjE5CisJbGRvIDQ0KCVyMCksJXIyMAorCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMTQzLCVyMAorCW5vcAorCWxkdyAyNCglcjQpLCVyMTkKKwlsZGIgMCglcjE5KSwlcjIwCisJZXh0cnMgJXIyMCwzMSw4LCVyMTkKKwlsZG8gNDEoJXIwKSwlcjIwCisJY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKKwlibCBMJDAxNDMsJXIwCisJbm9wCisJYmwsbiBMJDAxNDIsJXIwCitMJDAxNDM6IAorCWxkdyAyNCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJc3ViICVyMTksJXIyMCwlcjE5CisJbGR3IDIwKCVyNCksJXIyNgorCWNvcHkgJXIxOSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBwYXJzZV9hbmRfZXZhbF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjE5CisJbGR3IDMyKCVyNCksJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIxCisJbGR3IDM2KCVyNCksJXIyMgorCWFkZCAlcjIxLCVyMjIsJXIyMAorCXN0dyAlcjE5LDAoJXIyMCkKKwlsZHcgMzIoJXI0KSwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDMyKCVyNCkKKwlsZHcgMjQoJXI0KSwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDIwKCVyNCkKK0wkMDE0MjogCisJbGR3IDI0KCVyNCksJXIxOQorCWxkYiAwKCVyMTkpLCVyMjAKKwlleHRycyAlcjIwLDMxLDgsJXIxOQorCWxkbyA0MCglcjApLCVyMjAKKwljb21jbHIsPSAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMTQ0LCVyMAorCW5vcAorCWxkdyAyOCglcjQpLCVyMTkKKwlsZG8gMSglcjE5KSwlcjIwCisJc3R3ICVyMjAsMjgoJXI0KQorCWJsLG4gTCQwMTQ1LCVyMAorTCQwMTQ0OiAKKwlsZHcgMjQoJXI0KSwlcjE5CisJbGRiIDAoJXIxOSksJXIyMAorCWV4dHJzICVyMjAsMzEsOCwlcjE5CisJbGRvIDQxKCVyMCksJXIyMAorCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKKwlibCBMJDAxNDYsJXIwCisJbm9wCisJbGR3IDI4KCVyNCksJXIxOQorCWxkbyAtMSglcjE5KSwlcjIwCisJc3R3ICVyMjAsMjgoJXI0KQorTCQwMTQ2OiAKK0wkMDE0NTogCisJbGR3IDI0KCVyNCksJXIxOQorCWxkbyAxKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwyNCglcjQpCisJYmwsbiBMJDAxNDAsJXIwCitMJDAxNDE6IAorTCQwMTM5OiAKKwlsZG8gLTIoJXIwKSwlcjE5CisJbGR3IDI0KCVyNCksJXIyMAorCWFkZCAlcjE5LCVyMjAsJXIxOQorCWxkYiAwKCVyMTkpLCVyMjAKKwlleHRycyAlcjIwLDMxLDgsJXIxOQorCWxkbyA0NiglcjApLCVyMjAKKwljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDE0NywlcjAKKwlub3AKKwlsZHcgMzIoJXI0KSwlcjE5CisJemRlcCAlcjE5LDI5LDMwLCVyMjAKKwlsZHcgMzYoJXI0KSwlcjIxCisJYWRkICVyMjAsJXIyMSwlcjE5CisJYWRkaWwgTCdidWlsdGluX3R5cGVfdm9pZC0kZ2xvYmFsJCwlcjI3CisJbGR3IFInYnVpbHRpbl90eXBlX3ZvaWQtJGdsb2JhbCQoJXIxKSwlcjIwCisJc3R3ICVyMjAsMCglcjE5KQorCWJsLG4gTCQwMTQ4LCVyMAorTCQwMTQ3OiAKKwlsZHcgMzIoJXI0KSwlcjE5CisJemRlcCAlcjE5LDI5LDMwLCVyMjAKKwlsZHcgMzYoJXI0KSwlcjIxCisJYWRkICVyMjAsJXIyMSwlcjE5CisJc3R3ICVyMCwwKCVyMTkpCitMJDAxNDg6IAorCWxkdyAxNiglcjQpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGZyZWUsJXIyCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWxkdyA0OCglcjIwKSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIyMCksJXIyMQorCXpkZXAgJXIyMSwzMCwzMSwlcjIwCisJYWRkICVyMjAsJXIyMSwlcjIwCisJemRlcCAlcjIwLDI5LDMwLCVyMjAKKwlsZHcgMjAoJXIxOSksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIxOQorCWxkdyA4KCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw4KCVyNCkKKwlsZG8gLTEyKCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjE5CisJYWRkICVyMTksJXIyMCwlcjE5CisJemRlcCAlcjE5LDI5LDMwLCVyMTkKKwlsZHcgOCglcjQpLCVyMjAKKwlhZGQgJXIxOSwlcjIwLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIwCisJc3R3ICVyMjAsMCglcjE5KQorCWxkbyAtMTIoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJemRlcCAlcjIwLDI5LDMwLCVyMTkKKwlhZGQgJXIxOSwlcjIwLCVyMTkKKwl6ZGVwICVyMTksMjksMzAsJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCWFkZCAlcjE5LCVyMjAsJXIxOQorCWxkdyA0KCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw0MCglcjQpCisJbGR3IDQwKCVyNCksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw0MCglcjE5KQorCWxkdyA0MCglcjQpLCVyMTkKKwlsZHcgMzYoJXI0KSwlcjIwCisJc3R3ICVyMjAsNDgoJXIxOSkKKwlsZHcgNDAoJXI0KSwlcjE5CisJbGR3IDQwKCVyNCksJXIyMAorCWxkaCAzMiglcjIwKSwlcjIxCisJY29weSAlcjIxLCVyMjAKKwlkZXBpIDAsMjksMSwlcjIwCisJc3RoICVyMjAsMzIoJXIxOSkKKwlsZG8gLTEyKCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjE5CisJYWRkICVyMTksJXIyMCwlcjE5CisJemRlcCAlcjE5LDI5LDMwLCVyMTkKKwlsZHcgOCglcjQpLCVyMjAKKwlhZGQgJXIxOSwlcjIwLCVyMTkKKwlsZHcgMTYoJXIxOSksJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJZGVwaSAwLDQsMSwlcjIxCisJc3R3ICVyMjEsMTYoJXIxOSkKK0wkMDEyMzogCisJbGR3IDY0KCVyNCksJXIxMQorCWxkdyA2OCglcjQpLCVyMTAKKwlsZHcgNzIoJXI0KSwlcjkKKwlsZHcgNzYoJXI0KSwlcjgKKwlsZHcgODAoJXI0KSwlcjcKKwlsZHcgODQoJXI0KSwlcjYKKwlsZHcgODgoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKKwkuRVhQT1JUIGFsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlLENPREUKKwkuRVhQT1JUIGFsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IKK2FsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDE5MiglcjMwKQorCXN0dyAlcjgsMzIoJXI0KQorCXN0dyAlcjcsMzYoJXI0KQorCXN0dyAlcjYsNDAoJXI0KQorCXN0dyAlcjUsNDQoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZHcgNDgoJXIyMCksJXIxOQorCWxkaWwgTCdjcGx1c19zdHJ1Y3RfZGVmYXVsdCwlcjIwCisJbGRvIFInY3BsdXNfc3RydWN0X2RlZmF1bHQoJXIyMCksJXIyMAorCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKKwlibCBMJDAxNTAsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXI3CisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAxMiglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMTU2LCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkbyAxMjAoJXIyMCksJXIxOQorCXN0dyAlcjE5LDgoJXI0KQorCWxkdyA4KCVyNCksJXIxOQorCXN0dyAlcjE5LDEyKCVyNCkKKwlsZG8gMjQoJXIwKSwlcjE5CisJc3R3ICVyMTksMTYoJXI0KQorCWxkdyAxMiglcjQpLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIwCisJbGR3IDE2KCVyMTkpLCVyMTkKKwlsZHcgMTIoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyAxNiglcjQpLCVyMjAKKwljb21jbHIsPCAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMTUxLCVyMAorCW5vcAorCWxkdyAxMiglcjQpLCVyMjYKKwlsZHcgMTYoJXI0KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKKwlub3AKKwljb3B5ICVyMCwlcjE5CisJYmwsbiBMJDAxNTIsJXIwCitMJDAxNTE6IAorCWNvcHkgJXIwLCVyMTkKK0wkMDE1MjogCisJbGR3IDEyKCVyNCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjAKKwlsZHcgMTIoJXIyMCksJXIyMQorCWxkdyAxNiglcjQpLCVyMjIKKwlhZGQgJXIyMSwlcjIyLCVyMjAKKwljb3B5ICVyMjAsJXIyMQorCXN0dyAlcjIxLDEyKCVyMTkpCisJbGR3IDgoJXI0KSwlcjE5CisJc3R3ICVyMTksMjAoJXI0KQorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMjQoJXI0KQorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkdyAyNCglcjQpLCVyMTkKKwljb21jbHIsPSAlcjIwLCVyMTksJXIwCisJYmwgTCQwMTUzLCVyMAorCW5vcAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgNDAoJXIxOSksJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJZGVwaSAtMSwxLDEsJXIyMQorCXN0dyAlcjIxLDQwKCVyMTkpCitMJDAxNTM6IAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJbGR3IDIwKCVyNCksJXIyMQorCWxkdyAxMiglcjIwKSwlcjIwCisJbGR3IDI0KCVyMjEpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwlsZHcgMjAoJXI0KSwlcjIxCisJbGR3IDI0KCVyMjEpLCVyMjIKKwl1YWRkY20gJXIwLCVyMjIsJXIyMQorCWFuZCAlcjIwLCVyMjEsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgMjAoJXI0KSwlcjE5CisJbGR3IDIwKCVyNCksJXIyMAorCWxkdyAxMiglcjE5KSwlcjE5CisJbGR3IDQoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyAyMCglcjQpLCVyMjAKKwlsZHcgMjAoJXI0KSwlcjIxCisJbGR3IDE2KCVyMjApLCVyMjAKKwlsZHcgNCglcjIxKSwlcjIxCisJc3ViICVyMjAsJXIyMSwlcjIwCisJY29tY2xyLD4gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDE1NCwlcjAKKwlub3AKKwlsZHcgMjAoJXI0KSwlcjE5CisJbGR3IDIwKCVyNCksJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwljb3B5ICVyMjEsJXIxOQorCWJsLG4gTCQwMTU1LCVyMAorTCQwMTU0OiAKKwljb3B5ICVyMCwlcjE5CitMJDAxNTU6IAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJbGR3IDEyKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw4KCVyMTkpCisJbGR3IDI0KCVyNCksJXI4CisJYmwsbiBMJDAxNTcsJXIwCitMJDAxNTY6IAorCWxkbyAyNCglcjApLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHhtYWxsb2MsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOAorTCQwMTU3OiAKKwlzdHcgJXI4LDQ4KCVyNykKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDQ4KCVyMTkpLCVyMjAKKwlsZGlsIEwnY3BsdXNfc3RydWN0X2RlZmF1bHQsJXIxOQorCWNvcHkgJXIyMCwlcjIxCisJbGRvIFInY3BsdXNfc3RydWN0X2RlZmF1bHQoJXIxOSksJXIyMgorCWxkd3MsbWEgNCglcjIyKSwlcjE5CisJbGR3cyxtYSA0KCVyMjIpLCVyMjAKKwlzdHdzLG1hICVyMTksNCglcjIxKQorCWxkd3MsbWEgNCglcjIyKSwlcjE5CisJc3R3cyxtYSAlcjIwLDQoJXIyMSkKKwlsZHdzLG1hIDQoJXIyMiksJXIyMAorCXN0d3MsbWEgJXIxOSw0KCVyMjEpCisJbGR3cyxtYSA0KCVyMjIpLCVyMTkKKwlzdHdzLG1hICVyMjAsNCglcjIxKQorCWxkd3MsbWEgNCglcjIyKSwlcjIwCisJc3R3cyxtYSAlcjE5LDQoJXIyMSkKKwlzdHcgJXIyMCwwKCVyMjEpCitMJDAxNTA6IAorTCQwMTQ5OiAKKwlsZHcgMzIoJXI0KSwlcjgKKwlsZHcgMzYoJXI0KSwlcjcKKwlsZHcgNDAoJXI0KSwlcjYKKwlsZHcgNDQoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLklNUE9SVCBvYnNhdmVzdHJpbmcsQ09ERQorCS5hbGlnbiA0CisJLkVYUE9SVCBpbml0X3R5cGUsQ09ERQorCS5FWFBPUlQgaW5pdF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IsUlROVkFMPUdSCitpbml0X3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTkyKCVyMzApCisJc3R3ICVyMTQsOCglcjQpCisJc3R3ICVyMTMsMTIoJXI0KQorCXN0dyAlcjEyLDE2KCVyNCkKKwlzdHcgJXIxMSwyMCglcjQpCisJc3R3ICVyMTAsMjQoJXI0KQorCXN0dyAlcjksMjgoJXI0KQorCXN0dyAlcjgsMzIoJXI0KQorCXN0dyAlcjcsMzYoJXI0KQorCXN0dyAlcjYsNDAoJXI0KQorCXN0dyAlcjUsNDQoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtOCglcjApLCVyNworCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI3LCVyOAorCXN0dyAlcjI1LDAoJXI4KQorCWxkbyAtMTIoJXIwKSwlcjkKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyOSwlcjEwCisJc3R3ICVyMjQsMCglcjEwKQorCWxkbyAtMTYoJXIwKSwlcjExCisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjExLCVyMTIKKwlzdHcgJXIyMywwKCVyMTIpCisJbGRvIC0yMCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGFsbG9jX3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyMTMKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMCglcjEzKQorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw4KCVyMTMpCisJbGRvIC0xMiglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkaCAzMiglcjEzKSwlcjIwCisJbGRoIDIoJXIxOSksJXIxOQorCW9yICVyMjAsJXIxOSwlcjIwCisJc3RoICVyMjAsMzIoJXIxMykKKwlsZG8gLTE2KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDE1OSwlcjAKKwlub3AKKwlsZG8gLTIwKCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDE1OSwlcjAKKwlub3AKKwlsZG8gLTE2KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE0CisJbGRvIC0xNiglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHN0cmxlbiwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCWxkbyAtMjAoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjIwKSwlcjIxCisJbGRvIDEyMCglcjIxKSwlcjIwCisJbGR3IDAoJXIxNCksJXIyNgorCWNvcHkgJXIxOSwlcjI1CisJY29weSAlcjIwLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIG9ic2F2ZXN0cmluZywlcjIKKwlub3AKKwljb3B5ICVyMjgsJXIxOQorCXN0dyAlcjE5LDQoJXIxMykKKwlibCxuIEwkMDE2MCwlcjAKK0wkMDE1OTogCisJbGRvIC0xNiglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw0KCVyMTMpCitMJDAxNjA6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDMsJXIyMCwlcjAKKwlibCBMJDAxNjIsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gNCwlcjIwLCVyMAorCWJsIEwkMDE2MiwlcjAKKwlub3AKKwlibCxuIEwkMDE2MSwlcjAKK0wkMDE2MjogCisJbGRpbCBMJ2NwbHVzX3N0cnVjdF9kZWZhdWx0LCVyMTkKKwlsZG8gUidjcGx1c19zdHJ1Y3RfZGVmYXVsdCglcjE5KSwlcjE5CisJc3R3ICVyMTksNDgoJXIxMykKK0wkMDE2MTogCisJY29weSAlcjEzLCVyMjgKKwlibCxuIEwkMDE1OCwlcjAKK0wkMDE1ODogCisJbGR3IDgoJXI0KSwlcjE0CisJbGR3IDEyKCVyNCksJXIxMworCWxkdyAxNiglcjQpLCVyMTIKKwlsZHcgMjAoJXI0KSwlcjExCisJbGR3IDI0KCVyNCksJXIxMAorCWxkdyAyOCglcjQpLCVyOQorCWxkdyAzMiglcjQpLCVyOAorCWxkdyAzNiglcjQpLCVyNworCWxkdyA0MCglcjQpLCVyNgorCWxkdyA0NCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuYWxpZ24gNAorTEMkMDAyMjogCisJLlNUUklORyAiaW50ZXJuYWwgZXJyb3IgLSBpbnZhbGlkIGZ1bmRhbWVudGFsIHR5cGUgaWQgJWRceDAwIgorCS5hbGlnbiA0CitMQyQwMDIzOiAKKwkuU1RSSU5HICJpbnRlcm5hbCBlcnJvcjogdW5oYW5kbGVkIHR5cGUgaWQgJWRceDAwIgorCS5hbGlnbiA0CitMQyQwMDI0OiAKKwkuU1RSSU5HICJ2b2lkXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAyNTogCisJLlNUUklORyAiYm9vbGVhblx4MDAiCisJLmFsaWduIDQKK0xDJDAwMjY6IAorCS5TVFJJTkcgInN0cmluZ1x4MDAiCisJLmFsaWduIDQKK0xDJDAwMjc6IAorCS5TVFJJTkcgImNoYXJceDAwIgorCS5hbGlnbiA0CitMQyQwMDI4OiAKKwkuU1RSSU5HICJzaWduZWQgY2hhclx4MDAiCisJLmFsaWduIDQKK0xDJDAwMjk6IAorCS5TVFJJTkcgInVuc2lnbmVkIGNoYXJceDAwIgorCS5hbGlnbiA0CitMQyQwMDMwOiAKKwkuU1RSSU5HICJzaG9ydFx4MDAiCisJLmFsaWduIDQKK0xDJDAwMzE6IAorCS5TVFJJTkcgInVuc2lnbmVkIHNob3J0XHgwMCIKKwkuYWxpZ24gNAorTEMkMDAzMjogCisJLlNUUklORyAiaW50XHgwMCIKKwkuYWxpZ24gNAorTEMkMDAzMzogCisJLlNUUklORyAidW5zaWduZWQgaW50XHgwMCIKKwkuYWxpZ24gNAorTEMkMDAzNDogCisJLlNUUklORyAiZml4ZWQgZGVjaW1hbFx4MDAiCisJLmFsaWduIDQKK0xDJDAwMzU6IAorCS5TVFJJTkcgImxvbmdceDAwIgorCS5hbGlnbiA0CitMQyQwMDM2OiAKKwkuU1RSSU5HICJ1bnNpZ25lZCBsb25nXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAzNzogCisJLlNUUklORyAibG9uZyBsb25nXHgwMCIKKwkuYWxpZ24gNAorTEMkMDAzODogCisJLlNUUklORyAic2lnbmVkIGxvbmcgbG9uZ1x4MDAiCisJLmFsaWduIDQKK0xDJDAwMzk6IAorCS5TVFJJTkcgInVuc2lnbmVkIGxvbmcgbG9uZ1x4MDAiCisJLmFsaWduIDQKK0xDJDAwNDA6IAorCS5TVFJJTkcgImZsb2F0XHgwMCIKKwkuYWxpZ24gNAorTEMkMDA0MTogCisJLlNUUklORyAiZG91YmxlXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA0MjogCisJLlNUUklORyAiZmxvYXRpbmcgZGVjaW1hbFx4MDAiCisJLmFsaWduIDQKK0xDJDAwNDM6IAorCS5TVFJJTkcgImxvbmcgZG91YmxlXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA0NDogCisJLlNUUklORyAiY29tcGxleFx4MDAiCisJLmFsaWduIDQKK0xDJDAwNDU6IAorCS5TVFJJTkcgImRvdWJsZSBjb21wbGV4XHgwMCIKKwkuYWxpZ24gNAorTEMkMDA0NjogCisJLlNUUklORyAibG9uZyBkb3VibGUgY29tcGxleFx4MDAiCisJLmFsaWduIDQKKwkuRVhQT1JUIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlLENPREUKKwkuRVhQT1JUIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCitsb29rdXBfZnVuZGFtZW50YWxfdHlwZTogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxOTIoJXIzMCkKKwlzdHcgJXIxMiwzMiglcjQpCisJc3R3ICVyMTEsMzYoJXI0KQorCXN0dyAlcjEwLDQwKCVyNCkKKwlzdHcgJXI5LDQ0KCVyNCkKKwlzdHcgJXI4LDQ4KCVyNCkKKwlzdHcgJXI3LDUyKCVyNCkKKwlzdHcgJXI2LDU2KCVyNCkKKwlzdHcgJXI1LDYwKCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTgoJXIwKSwlcjcKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNywlcjgKKwlzdHcgJXIyNSwwKCVyOCkKKwljb3B5ICVyMCwlcjkKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw8PSAwLCVyMjAsJXIwCisJYmwgTCQwMTY1LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZG8gMjUoJXIwKSwlcjE5CisJY29tY2xyLDw9ICVyMjAsJXIxOSwlcjAKKwlibCBMJDAxNjUsJXIwCisJbm9wCisJYmwsbiBMJDAxNjQsJXIwCitMJDAxNjU6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkaWwgTCdMQyQwMDIyLCVyMjYKKwlsZG8gUidMQyQwMDIyKCVyMjYpLCVyMjYKKwlsZHcgMCglcjE5KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBlcnJvciwlcjIKKwlub3AKKwlibCxuIEwkMDE2NiwlcjAKK0wkMDE2NDogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAxOTYoJXIxOSksJXIyMAorCWNvbWljbHIsPSAwLCVyMjAsJXIwCisJYmwgTCQwMTY3LCVyMAorCW5vcAorCWxkbyAxMDQoJXIwKSwlcjExCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIxMgorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZG8gMTIwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCw4KCVyNCkKKwlsZHcgOCglcjQpLCVyMTkKKwlzdHcgJXIxOSwxMiglcjQpCisJc3R3ICVyMTEsMTYoJXI0KQorCWxkdyAxMiglcjQpLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIwCisJbGR3IDE2KCVyMTkpLCVyMTkKKwlsZHcgMTIoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyAxNiglcjQpLCVyMjAKKwljb21jbHIsPCAlcjE5LCVyMjAsJXIwCisJYmwgTCQwMTY4LCVyMAorCW5vcAorCWxkdyAxMiglcjQpLCVyMjYKKwlsZHcgMTYoJXI0KSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKKwlub3AKKwljb3B5ICVyMCwlcjE5CisJYmwsbiBMJDAxNjksJXIwCitMJDAxNjg6IAorCWNvcHkgJXIwLCVyMTkKK0wkMDE2OTogCisJbGR3IDEyKCVyNCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjAKKwlsZHcgMTIoJXIyMCksJXIyMQorCWxkdyAxNiglcjQpLCVyMjIKKwlhZGQgJXIyMSwlcjIyLCVyMjAKKwljb3B5ICVyMjAsJXIyMQorCXN0dyAlcjIxLDEyKCVyMTkpCisJbGR3IDgoJXI0KSwlcjE5CisJc3R3ICVyMTksMjAoJXI0KQorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMjQoJXI0KQorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMTIoJXIxOSksJXIyMAorCWxkdyAyNCglcjQpLCVyMTkKKwljb21jbHIsPSAlcjIwLCVyMTksJXIwCisJYmwgTCQwMTcwLCVyMAorCW5vcAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgNDAoJXIxOSksJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJZGVwaSAtMSwxLDEsJXIyMQorCXN0dyAlcjIxLDQwKCVyMTkpCitMJDAxNzA6IAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJbGR3IDIwKCVyNCksJXIyMQorCWxkdyAxMiglcjIwKSwlcjIwCisJbGR3IDI0KCVyMjEpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwlsZHcgMjAoJXI0KSwlcjIxCisJbGR3IDI0KCVyMjEpLCVyMjIKKwl1YWRkY20gJXIwLCVyMjIsJXIyMQorCWFuZCAlcjIwLCVyMjEsJXIyMAorCWNvcHkgJXIyMCwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwlsZHcgMjAoJXI0KSwlcjE5CisJbGR3IDIwKCVyNCksJXIyMAorCWxkdyAxMiglcjE5KSwlcjE5CisJbGR3IDQoJXIyMCksJXIyMAorCXN1YiAlcjE5LCVyMjAsJXIxOQorCWxkdyAyMCglcjQpLCVyMjAKKwlsZHcgMjAoJXI0KSwlcjIxCisJbGR3IDE2KCVyMjApLCVyMjAKKwlsZHcgNCglcjIxKSwlcjIxCisJc3ViICVyMjAsJXIyMSwlcjIwCisJY29tY2xyLD4gJXIxOSwlcjIwLCVyMAorCWJsIEwkMDE3MSwlcjAKKwlub3AKKwlsZHcgMjAoJXI0KSwlcjE5CisJbGR3IDIwKCVyNCksJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJc3R3ICVyMjEsMTIoJXIxOSkKKwljb3B5ICVyMjEsJXIxOQorCWJsLG4gTCQwMTcyLCVyMAorTCQwMTcxOiAKKwljb3B5ICVyMCwlcjE5CitMJDAxNzI6IAorCWxkdyAyMCglcjQpLCVyMTkKKwlsZHcgMjAoJXI0KSwlcjIwCisJbGR3IDEyKCVyMjApLCVyMjEKKwlzdHcgJXIyMSw4KCVyMTkpCisJbGR3IDI0KCVyNCksJXIxOQorCXN0dyAlcjE5LDE5NiglcjEyKQorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMTk2KCVyMTkpLCVyMjYKKwljb3B5ICVyMCwlcjI1CisJY29weSAlcjExLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIG1lbXNldCwlcjIKKwlub3AKK0wkMDE2NzogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWxkdyAxOTYoJXIxOSksJXIxOQorCWFkZCAlcjIwLCVyMTksJXIxMAorCWxkdyAwKCVyMTApLCVyOQorCWNvbWljbHIsPSAwLCVyOSwlcjAKKwlibCBMJDAxNzMsJXIwCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWFkZGksdXYgLTI2LCVyMjAsJXIwCisJYmxyLG4gJXIyMCwlcjAKKwliLG4gTCQwMTc1CitMJDAyMDI6IAorCWIgTCQwMTc2CisJbm9wCisJYiBMJDAxNzcKKwlub3AKKwliIEwkMDE3OQorCW5vcAorCWIgTCQwMTgwCisJbm9wCisJYiBMJDAxODEKKwlub3AKKwliIEwkMDE4MgorCW5vcAorCWIgTCQwMTgzCisJbm9wCisJYiBMJDAxODQKKwlub3AKKwliIEwkMDE4NQorCW5vcAorCWIgTCQwMTg2CisJbm9wCisJYiBMJDAxODcKKwlub3AKKwliIEwkMDE4OQorCW5vcAorCWIgTCQwMTkwCisJbm9wCisJYiBMJDAxOTEKKwlub3AKKwliIEwkMDE5MgorCW5vcAorCWIgTCQwMTkzCisJbm9wCisJYiBMJDAxOTQKKwlub3AKKwliIEwkMDE5NQorCW5vcAorCWIgTCQwMTk2CisJbm9wCisJYiBMJDAxOTgKKwlub3AKKwliIEwkMDE5OQorCW5vcAorCWIgTCQwMjAwCisJbm9wCisJYiBMJDAyMDEKKwlub3AKKwliIEwkMDE3OAorCW5vcAorCWIgTCQwMTg4CisJbm9wCisJYiBMJDAxOTcKKwlub3AKK0wkMDE3NTogCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRpbCBMJ0xDJDAwMjMsJXIyNgorCWxkbyBSJ0xDJDAwMjMoJXIyNiksJXIyNgorCWxkdyAwKCVyMTkpLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGVycm9yLCVyMgorCW5vcAorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTc2OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDkoJXIwKSwlcjI2CisJbGRvIDEoJXIwKSwlcjI1CisJY29weSAlcjAsJXIyNAorCWxkaWwgTCdMQyQwMDI0LCVyMjMKKwlsZG8gUidMQyQwMDI0KCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxNzc6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gNCglcjApLCVyMjUKKwlsZG8gMSglcjApLCVyMjQKKwlsZGlsIEwnTEMkMDAyNSwlcjIzCisJbGRvIFInTEMkMDAyNSglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTc4OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDEyKCVyMCksJXIyNgorCWxkbyAxKCVyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwlsZGlsIEwnTEMkMDAyNiwlcjIzCisJbGRvIFInTEMkMDAyNiglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTc5OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDcoJXIwKSwlcjI2CisJbGRvIDEoJXIwKSwlcjI1CisJY29weSAlcjAsJXIyNAorCWxkaWwgTCdMQyQwMDI3LCVyMjMKKwlsZG8gUidMQyQwMDI3KCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxODA6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gMSglcjApLCVyMjUKKwlsZG8gMiglcjApLCVyMjQKKwlsZGlsIEwnTEMkMDAyOCwlcjIzCisJbGRvIFInTEMkMDAyOCglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTgxOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDcoJXIwKSwlcjI2CisJbGRvIDEoJXIwKSwlcjI1CisJbGRvIDEoJXIwKSwlcjI0CisJbGRpbCBMJ0xDJDAwMjksJXIyMworCWxkbyBSJ0xDJDAwMjkoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE4MjogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA3KCVyMCksJXIyNgorCWxkbyAyKCVyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwlsZGlsIEwnTEMkMDAzMCwlcjIzCisJbGRvIFInTEMkMDAzMCglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTgzOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDcoJXIwKSwlcjI2CisJbGRvIDIoJXIwKSwlcjI1CisJbGRvIDIoJXIwKSwlcjI0CisJbGRpbCBMJ0xDJDAwMzAsJXIyMworCWxkbyBSJ0xDJDAwMzAoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE4NDogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA3KCVyMCksJXIyNgorCWxkbyAyKCVyMCksJXIyNQorCWxkbyAxKCVyMCksJXIyNAorCWxkaWwgTCdMQyQwMDMxLCVyMjMKKwlsZG8gUidMQyQwMDMxKCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxODU6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gNCglcjApLCVyMjUKKwljb3B5ICVyMCwlcjI0CisJbGRpbCBMJ0xDJDAwMzIsJXIyMworCWxkbyBSJ0xDJDAwMzIoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE4NjogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA3KCVyMCksJXIyNgorCWxkbyA0KCVyMCksJXIyNQorCWxkbyAyKCVyMCksJXIyNAorCWxkaWwgTCdMQyQwMDMyLCVyMjMKKwlsZG8gUidMQyQwMDMyKCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxODc6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gNCglcjApLCVyMjUKKwlsZG8gMSglcjApLCVyMjQKKwlsZGlsIEwnTEMkMDAzMywlcjIzCisJbGRvIFInTEMkMDAzMyglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTg4OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDcoJXIwKSwlcjI2CisJbGRvIDQoJXIwKSwlcjI1CisJY29weSAlcjAsJXIyNAorCWxkaWwgTCdMQyQwMDM0LCVyMjMKKwlsZG8gUidMQyQwMDM0KCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxODk6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gNCglcjApLCVyMjUKKwljb3B5ICVyMCwlcjI0CisJbGRpbCBMJ0xDJDAwMzUsJXIyMworCWxkbyBSJ0xDJDAwMzUoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE5MDogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA3KCVyMCksJXIyNgorCWxkbyA0KCVyMCksJXIyNQorCWxkbyAyKCVyMCksJXIyNAorCWxkaWwgTCdMQyQwMDM1LCVyMjMKKwlsZG8gUidMQyQwMDM1KCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxOTE6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gNCglcjApLCVyMjUKKwlsZG8gMSglcjApLCVyMjQKKwlsZGlsIEwnTEMkMDAzNiwlcjIzCisJbGRvIFInTEMkMDAzNiglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTkyOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDcoJXIwKSwlcjI2CisJbGRvIDgoJXIwKSwlcjI1CisJY29weSAlcjAsJXIyNAorCWxkaWwgTCdMQyQwMDM3LCVyMjMKKwlsZG8gUidMQyQwMDM3KCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxOTM6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gNyglcjApLCVyMjYKKwlsZG8gOCglcjApLCVyMjUKKwlsZG8gMiglcjApLCVyMjQKKwlsZGlsIEwnTEMkMDAzOCwlcjIzCisJbGRvIFInTEMkMDAzOCglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTk0OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDcoJXIwKSwlcjI2CisJbGRvIDgoJXIwKSwlcjI1CisJbGRvIDEoJXIwKSwlcjI0CisJbGRpbCBMJ0xDJDAwMzksJXIyMworCWxkbyBSJ0xDJDAwMzkoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE5NTogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA4KCVyMCksJXIyNgorCWxkbyA0KCVyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwlsZGlsIEwnTEMkMDA0MCwlcjIzCisJbGRvIFInTEMkMDA0MCglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTk2OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDgoJXIwKSwlcjI2CisJbGRvIDgoJXIwKSwlcjI1CisJY29weSAlcjAsJXIyNAorCWxkaWwgTCdMQyQwMDQxLCVyMjMKKwlsZG8gUidMQyQwMDQxKCVyMjMpLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluaXRfdHlwZSwlcjIKKwlub3AKKwljb3B5ICVyMjgsJXI5CisJYmwsbiBMJDAxNzQsJXIwCitMJDAxOTc6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlzdHcgJXIyMCwtNTIoJXIzMCkKKwlsZG8gOCglcjApLCVyMjYKKwlsZG8gOCglcjApLCVyMjUKKwljb3B5ICVyMCwlcjI0CisJbGRpbCBMJ0xDJDAwNDIsJXIyMworCWxkbyBSJ0xDJDAwNDIoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE5ODogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA4KCVyMCksJXIyNgorCWxkbyAxNiglcjApLCVyMjUKKwljb3B5ICVyMCwlcjI0CisJbGRpbCBMJ0xDJDAwNDMsJXIyMworCWxkbyBSJ0xDJDAwNDMoJXIyMyksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5pdF90eXBlLCVyMgorCW5vcAorCWNvcHkgJXIyOCwlcjkKKwlibCxuIEwkMDE3NCwlcjAKK0wkMDE5OTogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCXN0dyAlcjIwLC01MiglcjMwKQorCWxkbyA4KCVyMCksJXIyNgorCWxkbyA4KCVyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwlsZGlsIEwnTEMkMDA0NCwlcjIzCisJbGRvIFInTEMkMDA0NCglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMjAwOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDgoJXIwKSwlcjI2CisJbGRvIDE2KCVyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwlsZGlsIEwnTEMkMDA0NSwlcjIzCisJbGRvIFInTEMkMDA0NSglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMjAxOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJc3R3ICVyMjAsLTUyKCVyMzApCisJbGRvIDgoJXIwKSwlcjI2CisJbGRvIDE2KCVyMCksJXIyNQorCWNvcHkgJXIwLCVyMjQKKwlsZGlsIEwnTEMkMDA0NiwlcjIzCisJbGRvIFInTEMkMDA0NiglcjIzKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBpbml0X3R5cGUsJXIyCisJbm9wCisJY29weSAlcjI4LCVyOQorCWJsLG4gTCQwMTc0LCVyMAorTCQwMTc0OiAKKwlzdHcgJXI5LDAoJXIxMCkKK0wkMDE3MzogCitMJDAxNjY6IAorCWNvcHkgJXI5LCVyMjgKKwlibCxuIEwkMDE2MywlcjAKK0wkMDE2MzogCisJbGR3IDMyKCVyNCksJXIxMgorCWxkdyAzNiglcjQpLCVyMTEKKwlsZHcgNDAoJXI0KSwlcjEwCisJbGR3IDQ0KCVyNCksJXI5CisJbGR3IDQ4KCVyNCksJXI4CisJbGR3IDUyKCVyNCksJXI3CisJbGR3IDU2KCVyNCksJXI2CisJbGR3IDYwKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5JTVBPUlQgcHV0c19maWx0ZXJlZCxDT0RFCisJLmFsaWduIDQKK0xDJDAwNDc6IAorCS5TVFJJTkcgIiBceDAwIgorCS5JTVBPUlQgcHJpbnRmX2ZpbHRlcmVkLENPREUKKwkuYWxpZ24gNAorTEMkMDA0ODogCisJLlNUUklORyAiMVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNDk6IAorCS5TVFJJTkcgIjBceDAwIgorCS5hbGlnbiA0CitwcmludF9iaXRfdmVjdG9yOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjgsMTYoJXI0KQorCXN0dyAlcjcsMjAoJXI0KQorCXN0dyAlcjYsMjQoJXI0KQorCXN0dyAlcjUsMjgoJXI0KQorCWxkbyAtNCglcjApLCVyNQorCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI1LCVyNgorCXN0dyAlcjI2LDAoJXI2KQorCWxkbyAtOCglcjApLCVyNworCWxkbyAtMzIoJXI0KSwlcjE5CisJYWRkICVyMTksJXI3LCVyOAorCXN0dyAlcjI1LDAoJXI4KQorCXN0dyAlcjAsOCglcjQpCitMJDAyMDQ6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCWxkdyAwKCVyMTkpLCVyMTkKKwljb21jbHIsPCAlcjIwLCVyMTksJXIwCisJYmwgTCQwMjA1LCVyMAorCW5vcAorCWxkdyA4KCVyNCksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCWNvbWljbHIsPiAwLCVyMTksJXIwCisJYmwgTCQwMjA4LCVyMAorCW5vcAorCWxkbyA3KCVyMTkpLCVyMTkKK0wkMDIwODogCisJZXh0cnMgJXIxOSwyOCwyOSwlcjE5CisJemRlcCAlcjE5LDI4LDI5LCVyMjEKKwlzdWIgJXIyMCwlcjIxLCVyMTkKKwljb21pY2xyLD0gMCwlcjE5LCVyMAorCWJsIEwkMDIwNywlcjAKKwlub3AKKwlsZGlsIEwnTEMkMDA0NywlcjI2CisJbGRvIFInTEMkMDA0NyglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwdXRzX2ZpbHRlcmVkLCVyMgorCW5vcAorTCQwMjA3OiAKKwlsZHcgOCglcjQpLCVyMjAKKwlleHRycyAlcjIwLDI4LDI5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjIwKSwlcjIxCisJYWRkICVyMTksJXIyMSwlcjIwCisJbGRiIDAoJXIyMCksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCWV4dHJ1ICVyMjAsMzEsMywlcjIxCisJc3ViaSw+Pj0gMzEsJXIyMSwlcjIwCisJY29weSAlcjAsJXIyMAorCW10c2FyICVyMjAKKwl2ZXh0cnMgJXIxOSwzMiwlcjE5CisJZXh0cnUgJXIxOSwzMSwxLCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAyMDksJXIwCisJbm9wCisJbGRpbCBMJ0xDJDAwNDgsJXIyNgorCWxkbyBSJ0xDJDAwNDgoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjEwLCVyMAorTCQwMjA5OiAKKwlsZGlsIEwnTEMkMDA0OSwlcjI2CisJbGRvIFInTEMkMDA0OSglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyMTA6IAorTCQwMjA2OiAKKwlsZHcgOCglcjQpLCVyMTkKKwlsZG8gMSglcjE5KSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJYmwsbiBMJDAyMDQsJXIwCitMJDAyMDU6IAorTCQwMjAzOiAKKwlsZHcgMTYoJXI0KSwlcjgKKwlsZHcgMjAoJXI0KSwlcjcKKwlsZHcgMjQoJXI0KSwlcjYKKwlsZHcgMjgoJXI0KSwlcjUKKwlsZG8gOCglcjQpLCVyMzAKKwlsZHcgLTI4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGR3bSAtOCglcjMwKSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECisJLklNUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLENPREUKKwkuYWxpZ24gNAorcHJpbnRfYXJnX3R5cGVzOiAKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjgsOCglcjQpCisJc3R3ICVyNywxMiglcjQpCisJc3R3ICVyNiwxNiglcjQpCisJc3R3ICVyNSwyMCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDIxMiwlcjAKKwlub3AKK0wkMDIxMzogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAyMTQsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlsZG8gMiglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWNvcHkgJXIyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZG8gNCglcjIwKSwlcjIxCisJc3R3ICVyMjEsMCglcjE5KQorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJY29taWNsciw9IDksJXIyMCwlcjAKKwlibCBMJDAyMTUsJXIwCisJbm9wCisJYmwsbiBMJDAyMTQsJXIwCitMJDAyMTU6IAorCWJsLG4gTCQwMjEzLCVyMAorTCQwMjE0OiAKK0wkMDIxMjogCitMJDAyMTE6IAorCWxkdyA4KCVyNCksJXI4CisJbGR3IDEyKCVyNCksJXI3CisJbGR3IDE2KCVyNCksJXI2CisJbGR3IDIwKCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5JTVBPUlQgcHJpbnRmaV9maWx0ZXJlZCxDT0RFCisJLmFsaWduIDQKK0xDJDAwNTA6IAorCS5TVFJJTkcgImZuX2ZpZWxkbGlzdHMgMHgleFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDUxOiAKKwkuU1RSSU5HICJbJWRdIG5hbWUgJyVzJyAoMHgleCkgbGVuZ3RoICVkXHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNTI6IAorCS5TVFJJTkcgIlslZF0gcGh5c25hbWUgJyVzJyAoMHgleClceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA1MzogCisJLlNUUklORyAidHlwZSAweCV4XHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNTQ6IAorCS5TVFJJTkcgImFyZ3MgMHgleFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDU1OiAKKwkuU1RSSU5HICJmY29udGV4dCAweCV4XHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNTY6IAorCS5TVFJJTkcgImlzX2NvbnN0ICVkXHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNTc6IAorCS5TVFJJTkcgImlzX3ZvbGF0aWxlICVkXHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNTg6IAorCS5TVFJJTkcgImlzX3ByaXZhdGUgJWRceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA1OTogCisJLlNUUklORyAiaXNfcHJvdGVjdGVkICVkXHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNjA6IAorCS5TVFJJTkcgImlzX3N0dWIgJWRceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA2MTogCisJLlNUUklORyAidm9mZnNldCAldVx4MGFceDAwIgorCS5hbGlnbiA0CitkdW1wX2ZuX2ZpZWxkbGlzdHM6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTkyKCVyMzApCisJc3R3ICVyOCwyNCglcjQpCisJc3R3ICVyNywyOCglcjQpCisJc3R3ICVyNiwzMiglcjQpCisJc3R3ICVyNSwzNiglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIyMCksJXIyMQorCWxkdyA0OCglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDUwLCVyMjUKKwlsZG8gUidMQyQwMDUwKCVyMjUpLCVyMjUKKwlsZHcgMjAoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlzdHcgJXIwLDgoJXI0KQorTCQwMjE3OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDQ4KCVyMTkpLCVyMjAKKwlsZGggMiglcjIwKSwlcjIxCisJZXh0cnMgJXIyMSwzMSwxNiwlcjE5CisJbGR3IDgoJXI0KSwlcjIwCisJY29tY2xyLDwgJXIyMCwlcjE5LCVyMAorCWJsIEwkMDIxOCwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMTkKKwlsZHcgOCglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMzAsMzEsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDIwKCVyMTkpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJc3R3ICVyMjAsMTYoJXI0KQorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZG8gMiglcjIwKSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIyMCksJXIyMQorCWxkdyA0OCglcjIxKSwlcjIwCisJbGR3IDgoJXI0KSwlcjIyCisJemRlcCAlcjIyLDMwLDMxLCVyMjEKKwlhZGQgJXIyMSwlcjIyLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMQorCWxkdyAyMCglcjIwKSwlcjIyCisJYWRkICVyMjEsJXIyMiwlcjIwCisJbGRvIC00KCVyMCksJXIyMQorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMSwlcjIxCisJbGR3IDAoJXIyMSksJXIyMgorCWxkdyA0OCglcjIyKSwlcjIxCisJbGR3IDgoJXI0KSwlcjIzCisJemRlcCAlcjIzLDMwLDMxLCVyMjIKKwlhZGQgJXIyMiwlcjIzLCVyMjIKKwl6ZGVwICVyMjIsMjksMzAsJXIyMgorCWxkdyAyMCglcjIxKSwlcjIzCisJYWRkICVyMjIsJXIyMywlcjIxCisJbGR3IDAoJXIyMSksJXIyMgorCXN0dyAlcjIyLC01MiglcjMwKQorCWxkbyAtNCglcjApLCVyMjEKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjEsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjIKKwlsZHcgNDgoJXIyMiksJXIyMQorCWxkdyA4KCVyNCksJXIyMworCXpkZXAgJXIyMywzMCwzMSwlcjIyCisJYWRkICVyMjIsJXIyMywlcjIyCisJemRlcCAlcjIyLDI5LDMwLCVyMjIKKwlsZHcgMjAoJXIyMSksJXIyMworCWFkZCAlcjIyLCVyMjMsJXIyMQorCWxkdyA0KCVyMjEpLCVyMjIKKwlzdHcgJXIyMiwtNTYoJXIzMCkKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDUxLCVyMjUKKwlsZG8gUidMQyQwMDUxKCVyMjUpLCVyMjUKKwlsZHcgOCglcjQpLCVyMjQKKwlsZHcgMCglcjIwKSwlcjIzCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgorCW5vcAorCXN0dyAlcjAsMTIoJXI0KQorTCQwMjIwOiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMTkKKwlsZHcgOCglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMzAsMzEsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDIwKCVyMTkpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIwCisJbGR3IDQoJXIxOSksJXIxOQorCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKKwlibCBMJDAyMjEsJXIwCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWxkbyA0KCVyMjApLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIxCisJemRlcCAlcjIxLDI5LDMwLCVyMjAKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwl6ZGVwICVyMjAsMjksMzAsJXIyMAorCWxkdyAxNiglcjQpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwlsZHcgMTIoJXI0KSwlcjIyCisJemRlcCAlcjIyLDI5LDMwLCVyMjEKKwlhZGQgJXIyMSwlcjIyLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMQorCWxkdyAxNiglcjQpLCVyMjIKKwlhZGQgJXIyMSwlcjIyLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIyCisJc3R3ICVyMjIsLTUyKCVyMzApCisJY29weSAlcjE5LCVyMjYKKwlsZGlsIEwnTEMkMDA1MiwlcjI1CisJbGRvIFInTEMkMDA1MiglcjI1KSwlcjI1CisJbGR3IDEyKCVyNCksJXIyNAorCWxkdyAwKCVyMjApLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWxkbyA4KCVyMjApLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIxCisJemRlcCAlcjIxLDI5LDMwLCVyMjAKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwl6ZGVwICVyMjAsMjksMzAsJXIyMAorCWxkdyAxNiglcjQpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDUzLCVyMjUKKwlsZG8gUidMQyQwMDUzKCVyMjUpLCVyMjUKKwlsZHcgNCglcjIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgorCW5vcAorCWxkdyAxMiglcjQpLCVyMjAKKwl6ZGVwICVyMjAsMjksMzAsJXIxOQorCWFkZCAlcjE5LCVyMjAsJXIxOQorCXpkZXAgJXIxOSwyOSwzMCwlcjE5CisJbGR3IDE2KCVyNCksJXIyMAorCWFkZCAlcjE5LCVyMjAsJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlsZG8gMTAoJXIyMSksJXIyMAorCWxkdyA0KCVyMTkpLCVyMjYKKwljb3B5ICVyMjAsJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMgorCWFkZCAlcjIwLCVyMjIsJXIyMQorCWxkdyA0KCVyMjEpLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDU0LCVyMjUKKwlsZG8gUidMQyQwMDU0KCVyMjUpLCVyMjUKKwlsZHcgNDgoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZHcgMTIoJXI0KSwlcjIwCisJemRlcCAlcjIwLDI5LDMwLCVyMTkKKwlhZGQgJXIxOSwlcjIwLCVyMTkKKwl6ZGVwICVyMTksMjksMzAsJXIxOQorCWxkdyAxNiglcjQpLCVyMjEKKwlhZGQgJXIxOSwlcjIxLCVyMjAKKwlsZHcgNCglcjIwKSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDQ4KCVyMTkpLCVyMjYKKwlsZHcgMCglcjIwKSwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBwcmludF9hcmdfdHlwZXMsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGR3IDAoJXIxOSksJXIyMAorCWxkbyA4KCVyMjApLCVyMTkKKwlsZHcgMTIoJXI0KSwlcjIxCisJemRlcCAlcjIxLDI5LDMwLCVyMjAKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwl6ZGVwICVyMjAsMjksMzAsJXIyMAorCWxkdyAxNiglcjQpLCVyMjEKKwlhZGQgJXIyMCwlcjIxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDU1LCVyMjUKKwlsZG8gUidMQyQwMDU1KCVyMjUpLCVyMjUKKwlsZHcgMTIoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJZXh0cnUgJXIyMSwwKzEtMSwxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDU2LCVyMjUKKwlsZG8gUidMQyQwMDU2KCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJZXh0cnUgJXIyMSwxKzEtMSwxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDU3LCVyMjUKKwlsZG8gUidMQyQwMDU3KCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJZXh0cnUgJXIyMSwyKzEtMSwxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDU4LCVyMjUKKwlsZG8gUidMQyQwMDU4KCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJZXh0cnUgJXIyMSwzKzEtMSwxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDU5LCVyMjUKKwlsZG8gUidMQyQwMDU5KCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJZXh0cnUgJXIyMSw0KzEtMSwxLCVyMjAKKwljb3B5ICVyMTksJXIyNgorCWxkaWwgTCdMQyQwMDYwLCVyMjUKKwlsZG8gUidMQyQwMDYwKCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGRvIDgoJXIyMCksJXIxOQorCWxkdyAxMiglcjQpLCVyMjEKKwl6ZGVwICVyMjEsMjksMzAsJXIyMAorCWFkZCAlcjIwLCVyMjEsJXIyMAorCXpkZXAgJXIyMCwyOSwzMCwlcjIwCisJbGR3IDE2KCVyNCksJXIyMQorCWFkZCAlcjIwLCVyMjEsJXIyMAorCWxkdyAxNiglcjIwKSwlcjIxCisJZXh0cnUgJXIyMSw4KzI0LTEsMjQsJXIyMgorCWxkbyAtMiglcjIyKSwlcjIwCisJY29weSAlcjE5LCVyMjYKKwlsZGlsIEwnTEMkMDA2MSwlcjI1CisJbGRvIFInTEMkMDA2MSglcjI1KSwlcjI1CisJY29weSAlcjIwLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyMjI6IAorCWxkdyAxMiglcjQpLCVyMTkKKwlsZG8gMSglcjE5KSwlcjIwCisJc3R3ICVyMjAsMTIoJXI0KQorCWJsLG4gTCQwMjIwLCVyMAorTCQwMjIxOiAKK0wkMDIxOTogCisJbGR3IDgoJXI0KSwlcjE5CisJbGRvIDEoJXIxOSksJXIyMAorCXN0dyAlcjIwLDgoJXI0KQorCWJsLG4gTCQwMjE3LCVyMAorTCQwMjE4OiAKK0wkMDIxNjogCisJbGR3IDI0KCVyNCksJXI4CisJbGR3IDI4KCVyNCksJXI3CisJbGR3IDMyKCVyNCksJXI2CisJbGR3IDM2KCVyNCksJXI1CisJbGRvIDgoJXI0KSwlcjMwCisJbGR3IC0yOCglcjMwKSwlcjIKKwlidiAlcjAoJXIyKQorCWxkd20gLTgoJXIzMCksJXI0CisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CitMQyQwMDYyOiAKKwkuU1RSSU5HICJuX2Jhc2VjbGFzc2VzICVkXHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNjM6IAorCS5TVFJJTkcgIm5mbl9maWVsZHMgJWRceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA2NDogCisJLlNUUklORyAibmZuX2ZpZWxkc190b3RhbCAlZFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDY1OiAKKwkuU1RSSU5HICJ2aXJ0dWFsX2ZpZWxkX2JpdHMgKCVkIGJpdHMgYXQgKjB4JXgpXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA2NjogCisJLlNUUklORyAiXHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNjc6IAorCS5TVFJJTkcgInByaXZhdGVfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgorCS5hbGlnbiA0CitMQyQwMDY4OiAKKwkuU1RSSU5HICJwcm90ZWN0ZWRfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqMHgleClceDAwIgorCS5hbGlnbiA0CitwcmludF9jcGx1c19zdHVmZjogCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXI0LCVyMQorCWNvcHkgJXIzMCwlcjQKKwlzdHdtICVyMSwxMjgoJXIzMCkKKwlzdHcgJXI4LDE2KCVyNCkKKwlzdHcgJXI3LDIwKCVyNCkKKwlzdHcgJXI2LDI0KCVyNCkKKwlzdHcgJXI1LDI4KCVyNCkKKwlsZG8gLTQoJXIwKSwlcjUKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNSwlcjYKKwlzdHcgJXIyNiwwKCVyNikKKwlsZG8gLTgoJXIwKSwlcjcKKwlsZG8gLTMyKCVyNCksJXIxOQorCWFkZCAlcjE5LCVyNywlcjgKKwlzdHcgJXIyNSwwKCVyOCkKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMjEKKwlsZGggMCglcjIxKSwlcjIyCisJZXh0cnMgJXIyMiwzMSwxNiwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDYyLCVyMjUKKwlsZG8gUidMQyQwMDYyKCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMjEKKwlsZGggMiglcjIxKSwlcjIyCisJZXh0cnMgJXIyMiwzMSwxNiwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDYzLCVyMjUKKwlsZG8gUidMQyQwMDYzKCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjIwKSwlcjIxCisJbGR3IDQ4KCVyMjEpLCVyMjAKKwlsZHcgMCglcjE5KSwlcjI2CisJbGRpbCBMJ0xDJDAwNjQsJXIyNQorCWxkbyBSJ0xDJDAwNjQoJXIyNSksJXIyNQorCWxkdyA0KCVyMjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyA0OCglcjE5KSwlcjIwCisJbGRoIDAoJXIyMCksJXIyMQorCWV4dHJzICVyMjEsMzEsMTYsJXIxOQorCWNvbWljbHIsPCAwLCVyMTksJXIwCisJYmwgTCQwMjI0LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZHcgNDgoJXIyMCksJXIyMQorCWxkaCAwKCVyMjEpLCVyMjIKKwlleHRycyAlcjIyLDMxLDE2LCVyMjAKKwlsZG8gLTQoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIxLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIyCisJbGR3IDQ4KCVyMjIpLCVyMjEKKwlsZHcgMCglcjE5KSwlcjI2CisJbGRpbCBMJ0xDJDAwNjUsJXIyNQorCWxkbyBSJ0xDJDAwNjUoJXIyNSksJXIyNQorCWNvcHkgJXIyMCwlcjI0CisJbGR3IDgoJXIyMSksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMjEKKwlsZGggMCglcjIxKSwlcjIyCisJZXh0cnMgJXIyMiwzMSwxNiwlcjIwCisJbGR3IDgoJXIxOSksJXIyNgorCWNvcHkgJXIyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBwcmludF9iaXRfdmVjdG9yLCVyMgorCW5vcAorCWxkaWwgTCdMQyQwMDY2LCVyMjYKKwlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHB1dHNfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyMjQ6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZGggMzQoJXIxOSksJXIyMAorCWV4dHJzICVyMjAsMzEsMTYsJXIxOQorCWNvbWljbHIsPCAwLCVyMTksJXIwCisJYmwgTCQwMjI1LCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgNDgoJXIxOSksJXIyMAorCWxkdyAxMiglcjIwKSwlcjE5CisJY29taWNsciw8PiAwLCVyMTksJXIwCisJYmwgTCQwMjI2LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZGggMzQoJXIyMCksJXIyMQorCWV4dHJzICVyMjEsMzEsMTYsJXIyMAorCWxkbyAtNCglcjApLCVyMjEKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjEsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjIKKwlsZHcgNDgoJXIyMiksJXIyMQorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDA2NywlcjI1CisJbGRvIFInTEMkMDA2NyglcjI1KSwlcjI1CisJY29weSAlcjIwLCVyMjQKKwlsZHcgMTIoJXIyMSksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGRoIDM0KCVyMjApLCVyMjEKKwlleHRycyAlcjIxLDMxLDE2LCVyMjAKKwlsZHcgMTIoJXIxOSksJXIyNgorCWNvcHkgJXIyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBwcmludF9iaXRfdmVjdG9yLCVyMgorCW5vcAorCWxkaWwgTCdMQyQwMDY2LCVyMjYKKwlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHB1dHNfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyMjY6IAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgNDgoJXIxOSksJXIyMAorCWxkdyAxNiglcjIwKSwlcjE5CisJY29taWNsciw8PiAwLCVyMTksJXIwCisJYmwgTCQwMjI3LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZGggMzQoJXIyMCksJXIyMQorCWV4dHJzICVyMjEsMzEsMTYsJXIyMAorCWxkbyAtNCglcjApLCVyMjEKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjEsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjIKKwlsZHcgNDgoJXIyMiksJXIyMQorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDA2OCwlcjI1CisJbGRvIFInTEMkMDA2OCglcjI1KSwlcjI1CisJY29weSAlcjIwLCVyMjQKKwlsZHcgMTYoJXIyMSksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGR3IDQ4KCVyMjApLCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGRoIDM0KCVyMjApLCVyMjEKKwlleHRycyAlcjIxLDMxLDE2LCVyMjAKKwlsZHcgMTYoJXIxOSksJXIyNgorCWNvcHkgJXIyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBwcmludF9iaXRfdmVjdG9yLCVyMgorCW5vcAorCWxkaWwgTCdMQyQwMDY2LCVyMjYKKwlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHB1dHNfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyMjc6IAorTCQwMjI1OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDQ4KCVyMTkpLCVyMjAKKwlsZGggMiglcjIwKSwlcjIxCisJZXh0cnMgJXIyMSwzMSwxNiwlcjE5CisJY29taWNsciw8IDAsJXIxOSwlcjAKKwlibCBMJDAyMjgsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkdyAwKCVyMjApLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGR1bXBfZm5fZmllbGRsaXN0cywlcjIKKwlub3AKK0wkMDIyODogCitMJDAyMjM6IAorCWxkdyAxNiglcjQpLCVyOAorCWxkdyAyMCglcjQpLCVyNworCWxkdyAyNCglcjQpLCVyNgorCWxkdyAyOCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuYWxpZ24gNAorTEMkMDA2OTogCisJLlNUUklORyAidHlwZSBub2RlIDB4JXhceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA3MDogCisJLlNUUklORyAibmFtZSAnJXMnICgweCV4KVx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDcxOiAKKwkuU1RSSU5HICI8TlVMTD5ceDAwIgorCS5hbGlnbiA0CitMQyQwMDcyOiAKKwkuU1RSSU5HICJjb2RlIDB4JXggXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA3MzogCisJLlNUUklORyAiKFRZUEVfQ09ERV9VTkRFRilceDAwIgorCS5hbGlnbiA0CitMQyQwMDc0OiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX1BUUilceDAwIgorCS5hbGlnbiA0CitMQyQwMDc1OiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX0FSUkFZKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNzY6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfU1RSVUNUKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNzc6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfVU5JT04pXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA3ODogCisJLlNUUklORyAiKFRZUEVfQ09ERV9FTlVNKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwNzk6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfRlVOQylceDAwIgorCS5hbGlnbiA0CitMQyQwMDgwOiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX0lOVClceDAwIgorCS5hbGlnbiA0CitMQyQwMDgxOiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX0ZMVClceDAwIgorCS5hbGlnbiA0CitMQyQwMDgyOiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX1ZPSUQpXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA4MzogCisJLlNUUklORyAiKFRZUEVfQ09ERV9TRVQpXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA4NDogCisJLlNUUklORyAiKFRZUEVfQ09ERV9SQU5HRSlceDAwIgorCS5hbGlnbiA0CitMQyQwMDg1OiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX1BBU0NBTF9BUlJBWSlceDAwIgorCS5hbGlnbiA0CitMQyQwMDg2OiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX0VSUk9SKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwODc6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfTUVNQkVSKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwODg6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfTUVUSE9EKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwODk6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfUkVGKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwOTA6IAorCS5TVFJJTkcgIihUWVBFX0NPREVfQ0hBUilceDAwIgorCS5hbGlnbiA0CitMQyQwMDkxOiAKKwkuU1RSSU5HICIoVFlQRV9DT0RFX0JPT0wpXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA5MjogCisJLlNUUklORyAiKFVOS05PV04gVFlQRSBDT0RFKVx4MDAiCisJLmFsaWduIDQKK0xDJDAwOTM6IAorCS5TVFJJTkcgImxlbmd0aCAlZFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDk0OiAKKwkuU1RSSU5HICJvYmpmaWxlIDB4JXhceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDA5NTogCisJLlNUUklORyAidGFyZ2V0X3R5cGUgMHgleFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDk2OiAKKwkuU1RSSU5HICJwb2ludGVyX3R5cGUgMHgleFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDk3OiAKKwkuU1RSSU5HICJyZWZlcmVuY2VfdHlwZSAweCV4XHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAwOTg6IAorCS5TVFJJTkcgImZ1bmN0aW9uX3R5cGUgMHgleFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMDk5OiAKKwkuU1RSSU5HICJmbGFncyAweCV4XHgwMCIKKwkuYWxpZ24gNAorTEMkMDEwMDogCisJLlNUUklORyAiIFRZUEVfRkxBR19VTlNJR05FRFx4MDAiCisJLmFsaWduIDQKK0xDJDAxMDE6IAorCS5TVFJJTkcgIiBUWVBFX0ZMQUdfU0lHTkVEXHgwMCIKKwkuYWxpZ24gNAorTEMkMDEwMjogCisJLlNUUklORyAiIFRZUEVfRkxBR19TVFVCXHgwMCIKKwkuYWxpZ24gNAorTEMkMDEwMzogCisJLlNUUklORyAibmZpZWxkcyAlZCAweCV4XHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAxMDQ6IAorCS5TVFJJTkcgIlslZF0gYml0cG9zICVkIGJpdHNpemUgJWQgdHlwZSAweCV4IG5hbWUgJyVzJyAoMHgleClceDBhXHgwMCIKKwkuYWxpZ24gNAorTEMkMDEwNTogCisJLlNUUklORyAidnB0cl9iYXNldHlwZSAweCV4XHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAxMDY6IAorCS5TVFJJTkcgInZwdHJfZmllbGRubyAlZFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMTA3OiAKKwkuU1RSSU5HICJhcmdfdHlwZXMgMHgleFx4MGFceDAwIgorCS5hbGlnbiA0CitMQyQwMTA4OiAKKwkuU1RSSU5HICJjcGx1c19zdHVmZiAweCV4XHgwYVx4MDAiCisJLmFsaWduIDQKK0xDJDAxMDk6IAorCS5TVFJJTkcgInR5cGVfc3BlY2lmaWMgMHgleFx4MDAiCisJLmFsaWduIDQKK0xDJDAxMTA6IAorCS5TVFJJTkcgIiAodW5rbm93biBkYXRhIGZvcm0pXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgcmVjdXJzaXZlX2R1bXBfdHlwZSxDT0RFCisJLkVYUE9SVCByZWN1cnNpdmVfZHVtcF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IKK3JlY3Vyc2l2ZV9kdW1wX3R5cGU6IAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwljb3B5ICVyNCwlcjEKKwljb3B5ICVyMzAsJXI0CisJc3R3bSAlcjEsMTI4KCVyMzApCisJc3R3ICVyOCwxNiglcjQpCisJc3R3ICVyNywyMCglcjQpCisJc3R3ICVyNiwyNCglcjQpCisJc3R3ICVyNSwyOCglcjQpCisJbGRvIC00KCVyMCksJXI1CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjUsJXI2CisJc3R3ICVyMjYsMCglcjYpCisJbGRvIC04KCVyMCksJXI3CisJbGRvIC0zMiglcjQpLCVyMTkKKwlhZGQgJXIxOSwlcjcsJXI4CisJc3R3ICVyMjUsMCglcjgpCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDY5LCVyMjUKKwlsZG8gUidMQyQwMDY5KCVyMjUpLCVyMjUKKwlsZHcgMCglcjIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZG8gLTQoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIxLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIyCisJbGR3IDQoJXIyMiksJXIyMQorCWxkbyAtNCglcjApLCVyMjIKKwlsZG8gLTMyKCVyNCksJXIyNAorCWFkZCAlcjI0LCVyMjIsJXIyMworCWxkdyAwKCVyMjMpLCVyMjIKKwlsZHcgNCglcjIyKSwlcjIzCisJY29taWNsciw9IDAsJXIyMywlcjAKKwlibCBMJDAyMzAsJXIwCisJbm9wCisJbGRpbCBMJ0xDJDAwNzEsJXIyMQorCWxkbyBSJ0xDJDAwNzEoJXIyMSksJXIyMQorTCQwMjMwOiAKKwlsZHcgMCglcjE5KSwlcjI2CisJbGRpbCBMJ0xDJDAwNzAsJXIyNQorCWxkbyBSJ0xDJDAwNzAoJXIyNSksJXIyNQorCWxkdyA0KCVyMjApLCVyMjQKKwljb3B5ICVyMjEsJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDcyLCVyMjUKKwlsZG8gUidMQyQwMDcyKCVyMjUpLCVyMjUKKwlsZHcgMCglcjIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJYWRkaSx1diAtMTksJXIyMCwlcjAKKwlibHIsbiAlcjIwLCVyMAorCWIsbiBMJDAyNTEKK0wkMDI1MjogCisJYiBMJDAyMzIKKwlub3AKKwliIEwkMDIzMworCW5vcAorCWIgTCQwMjM0CisJbm9wCisJYiBMJDAyMzUKKwlub3AKKwliIEwkMDIzNgorCW5vcAorCWIgTCQwMjM3CisJbm9wCisJYiBMJDAyMzgKKwlub3AKKwliIEwkMDIzOQorCW5vcAorCWIgTCQwMjQwCisJbm9wCisJYiBMJDAyNDEKKwlub3AKKwliIEwkMDI0MgorCW5vcAorCWIgTCQwMjQzCisJbm9wCisJYiBMJDAyNDQKKwlub3AKKwliIEwkMDI0NQorCW5vcAorCWIgTCQwMjQ2CisJbm9wCisJYiBMJDAyNDcKKwlub3AKKwliIEwkMDI0OAorCW5vcAorCWIgTCQwMjQ5CisJbm9wCisJYiBMJDAyNTAKKwlub3AKK0wkMDIzMjogCisJbGRpbCBMJ0xDJDAwNzMsJXIyNgorCWxkbyBSJ0xDJDAwNzMoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjMzOiAKKwlsZGlsIEwnTEMkMDA3NCwlcjI2CisJbGRvIFInTEMkMDA3NCglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyMzQ6IAorCWxkaWwgTCdMQyQwMDc1LCVyMjYKKwlsZG8gUidMQyQwMDc1KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDIzMSwlcjAKK0wkMDIzNTogCisJbGRpbCBMJ0xDJDAwNzYsJXIyNgorCWxkbyBSJ0xDJDAwNzYoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjM2OiAKKwlsZGlsIEwnTEMkMDA3NywlcjI2CisJbGRvIFInTEMkMDA3NyglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyMzc6IAorCWxkaWwgTCdMQyQwMDc4LCVyMjYKKwlsZG8gUidMQyQwMDc4KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDIzMSwlcjAKK0wkMDIzODogCisJbGRpbCBMJ0xDJDAwNzksJXIyNgorCWxkbyBSJ0xDJDAwNzkoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjM5OiAKKwlsZGlsIEwnTEMkMDA4MCwlcjI2CisJbGRvIFInTEMkMDA4MCglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyNDA6IAorCWxkaWwgTCdMQyQwMDgxLCVyMjYKKwlsZG8gUidMQyQwMDgxKCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDIzMSwlcjAKK0wkMDI0MTogCisJbGRpbCBMJ0xDJDAwODIsJXIyNgorCWxkbyBSJ0xDJDAwODIoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjQyOiAKKwlsZGlsIEwnTEMkMDA4MywlcjI2CisJbGRvIFInTEMkMDA4MyglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyNDM6IAorCWxkaWwgTCdMQyQwMDg0LCVyMjYKKwlsZG8gUidMQyQwMDg0KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDIzMSwlcjAKK0wkMDI0NDogCisJbGRpbCBMJ0xDJDAwODUsJXIyNgorCWxkbyBSJ0xDJDAwODUoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjQ1OiAKKwlsZGlsIEwnTEMkMDA4NiwlcjI2CisJbGRvIFInTEMkMDA4NiglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyNDY6IAorCWxkaWwgTCdMQyQwMDg3LCVyMjYKKwlsZG8gUidMQyQwMDg3KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDIzMSwlcjAKK0wkMDI0NzogCisJbGRpbCBMJ0xDJDAwODgsJXIyNgorCWxkbyBSJ0xDJDAwODgoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjQ4OiAKKwlsZGlsIEwnTEMkMDA4OSwlcjI2CisJbGRvIFInTEMkMDA4OSglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyNDk6IAorCWxkaWwgTCdMQyQwMDkwLCVyMjYKKwlsZG8gUidMQyQwMDkwKCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDIzMSwlcjAKK0wkMDI1MDogCisJbGRpbCBMJ0xDJDAwOTEsJXIyNgorCWxkbyBSJ0xDJDAwOTEoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgorCW5vcAorCWJsLG4gTCQwMjMxLCVyMAorTCQwMjUxOiAKKwlsZGlsIEwnTEMkMDA5MiwlcjI2CisJbGRvIFInTEMkMDA5MiglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCisJYmwsbiBMJDAyMzEsJXIwCitMJDAyMzE6IAorCWxkaWwgTCdMQyQwMDY2LCVyMjYKKwlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHB1dHNfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDA5MywlcjI1CisJbGRvIFInTEMkMDA5MyglcjI1KSwlcjI1CisJbGR3IDgoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDk0LCVyMjUKKwlsZG8gUidMQyQwMDk0KCVyMjUpLCVyMjUKKwlsZHcgMTIoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDk1LCVyMjUKKwlsZG8gUidMQyQwMDk1KCVyMjUpLCVyMjUKKwlsZHcgMTYoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGR3IDE2KCVyMTkpLCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAyNTMsJXIwCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyAwKCVyMjApLCVyMjEKKwlsZG8gMiglcjIxKSwlcjIwCisJbGR3IDE2KCVyMTkpLCVyMjYKKwljb3B5ICVyMjAsJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKKwlub3AKK0wkMDI1MzogCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDA5NiwlcjI1CisJbGRvIFInTEMkMDA5NiglcjI1KSwlcjI1CisJbGR3IDIwKCVyMjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDA5NywlcjI1CisJbGRvIFInTEMkMDA5NyglcjI1KSwlcjI1CisJbGR3IDI0KCVyMjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDA5OCwlcjI1CisJbGRvIFInTEMkMDA5OCglcjI1KSwlcjI1CisJbGR3IDI4KCVyMjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkaCAzMiglcjIwKSwlcjIxCisJZXh0cnMgJXIyMSwzMSwxNiwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMDk5LCVyMjUKKwlsZG8gUidMQyQwMDk5KCVyMjUpLCVyMjUKKwljb3B5ICVyMjAsJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRoIDMyKCVyMTkpLCVyMjAKKwlleHRydSAlcjIwLDMxLDEsJXIxOQorCWV4dHJzICVyMTksMzEsMTYsJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDI1NCwlcjAKKwlub3AKKwlsZGlsIEwnTEMkMDEwMCwlcjI2CisJbGRvIFInTEMkMDEwMCglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwdXRzX2ZpbHRlcmVkLCVyMgorCW5vcAorTCQwMjU0OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRoIDMyKCVyMTkpLCVyMjAKKwlsZG8gMiglcjApLCVyMjEKKwlhbmQgJXIyMCwlcjIxLCVyMTkKKwlleHRycyAlcjE5LDMxLDE2LCVyMjAKKwljb21pY2xyLDw+IDAsJXIyMCwlcjAKKwlibCBMJDAyNTUsJXIwCisJbm9wCisJbGRpbCBMJ0xDJDAxMDEsJXIyNgorCWxkbyBSJ0xDJDAxMDEoJXIyNiksJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHV0c19maWx0ZXJlZCwlcjIKKwlub3AKK0wkMDI1NTogCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkaCAzMiglcjE5KSwlcjIwCisJbGRvIDQoJXIwKSwlcjIxCisJYW5kICVyMjAsJXIyMSwlcjE5CisJZXh0cnMgJXIxOSwzMSwxNiwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMjU2LCVyMAorCW5vcAorCWxkaWwgTCdMQyQwMTAyLCVyMjYKKwlsZG8gUidMQyQwMTAyKCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHB1dHNfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyNTY6IAorCWxkaWwgTCdMQyQwMDY2LCVyMjYKKwlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHB1dHNfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkaCAzNCglcjIwKSwlcjIxCisJZXh0cnMgJXIyMSwzMSwxNiwlcjIwCisJbGRvIC00KCVyMCksJXIyMQorCWxkbyAtMzIoJXI0KSwlcjIzCisJYWRkICVyMjMsJXIyMSwlcjIyCisJbGR3IDAoJXIyMiksJXIyMQorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDEwMywlcjI1CisJbGRvIFInTEMkMDEwMyglcjI1KSwlcjI1CisJY29weSAlcjIwLCVyMjQKKwlsZHcgMzYoJXIyMSksJXIyMworCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlzdHcgJXIwLDgoJXI0KQorTCQwMjU3OiAKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRoIDM0KCVyMTkpLCVyMjAKKwlleHRycyAlcjIwLDMxLDE2LCVyMTkKKwlsZHcgOCglcjQpLCVyMjAKKwljb21jbHIsPCAlcjIwLCVyMTksJXIwCisJYmwgTCQwMjU4LCVyMAorCW5vcAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkdyAwKCVyMTkpLCVyMjAKKwlsZG8gMiglcjIwKSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkdyA4KCVyNCksJXIyMQorCXpkZXAgJXIyMSwyNywyOCwlcjIyCisJbGR3IDM2KCVyMjApLCVyMjEKKwlhZGQgJXIyMiwlcjIxLCVyMjAKKwlsZG8gLTQoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjMKKwlhZGQgJXIyMywlcjIxLCVyMjIKKwlsZHcgMCglcjIyKSwlcjIxCisJbGR3IDgoJXI0KSwlcjIyCisJemRlcCAlcjIyLDI3LDI4LCVyMjMKKwlsZHcgMzYoJXIyMSksJXIyMgorCWFkZCAlcjIzLCVyMjIsJXIyMQorCWxkdyA0KCVyMjEpLCVyMjIKKwlzdHcgJXIyMiwtNTIoJXIzMCkKKwlsZG8gLTQoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjMKKwlhZGQgJXIyMywlcjIxLCVyMjIKKwlsZHcgMCglcjIyKSwlcjIxCisJbGR3IDgoJXI0KSwlcjIyCisJemRlcCAlcjIyLDI3LDI4LCVyMjMKKwlsZHcgMzYoJXIyMSksJXIyMgorCWFkZCAlcjIzLCVyMjIsJXIyMQorCWxkdyA4KCVyMjEpLCVyMjIKKwlzdHcgJXIyMiwtNTYoJXIzMCkKKwlsZG8gLTQoJXIwKSwlcjIxCisJbGRvIC0zMiglcjQpLCVyMjMKKwlhZGQgJXIyMywlcjIxLCVyMjIKKwlsZHcgMCglcjIyKSwlcjIxCisJbGR3IDgoJXI0KSwlcjIyCisJemRlcCAlcjIyLDI3LDI4LCVyMjMKKwlsZHcgMzYoJXIyMSksJXIyMgorCWFkZCAlcjIzLCVyMjIsJXIyMQorCWxkdyAxMiglcjIxKSwlcjIyCisJc3R3ICVyMjIsLTYwKCVyMzApCisJbGRvIC00KCVyMCksJXIyMQorCWxkbyAtMzIoJXI0KSwlcjIzCisJYWRkICVyMjMsJXIyMSwlcjIyCisJbGR3IDAoJXIyMiksJXIyMQorCWxkdyA4KCVyNCksJXIyMgorCXpkZXAgJXIyMiwyNywyOCwlcjIzCisJbGR3IDM2KCVyMjEpLCVyMjIKKwlhZGQgJXIyMywlcjIyLCVyMjEKKwlsZHcgMTIoJXIyMSksJXIyMgorCXN0dyAlcjIyLC02NCglcjMwKQorCWxkbyAtNCglcjApLCVyMjEKKwlsZG8gLTMyKCVyNCksJXIyMworCWFkZCAlcjIzLCVyMjEsJXIyMgorCWxkdyAwKCVyMjIpLCVyMjEKKwlsZHcgOCglcjQpLCVyMjIKKwl6ZGVwICVyMjIsMjcsMjgsJXIyMworCWxkdyAzNiglcjIxKSwlcjIyCisJYWRkICVyMjMsJXIyMiwlcjIxCisJbGR3IDEyKCVyMjEpLCVyMjIKKwljb21pY2xyLD0gMCwlcjIyLCVyMAorCWJsIEwkMDI2MCwlcjAKKwlub3AKKwlsZGlsIEwnTEMkMDA3MSwlcjIxCisJbGRvIFInTEMkMDA3MSglcjIxKSwlcjIxCisJc3R3ICVyMjEsLTY0KCVyMzApCitMJDAyNjA6IAorCWNvcHkgJXIxOSwlcjI2CisJbGRpbCBMJ0xDJDAxMDQsJXIyNQorCWxkbyBSJ0xDJDAxMDQoJXIyNSksJXIyNQorCWxkdyA4KCVyNCksJXIyNAorCWxkdyAwKCVyMjApLCVyMjMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkdyA4KCVyNCksJXIyMAorCXpkZXAgJXIyMCwyNywyOCwlcjIxCisJbGR3IDM2KCVyMTkpLCVyMjAKKwlhZGQgJXIyMSwlcjIwLCVyMTkKKwlsZHcgOCglcjE5KSwlcjIwCisJY29taWNsciw8PiAwLCVyMjAsJXIwCisJYmwgTCQwMjYxLCVyMAorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgOCglcjQpLCVyMjAKKwl6ZGVwICVyMjAsMjcsMjgsJXIyMQorCWxkdyAzNiglcjE5KSwlcjIwCisJYWRkICVyMjEsJXIyMCwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIyMCksJXIyMQorCWxkbyA0KCVyMjEpLCVyMjAKKwlsZHcgOCglcjE5KSwlcjI2CisJY29weSAlcjIwLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCisJbm9wCitMJDAyNjE6IAorTCQwMjU5OiAKKwlsZHcgOCglcjQpLCVyMTkKKwlsZG8gMSglcjE5KSwlcjIwCisJc3R3ICVyMjAsOCglcjQpCisJYmwsbiBMJDAyNTcsJXIwCitMJDAyNTg6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZHcgMCglcjE5KSwlcjI2CisJbGRpbCBMJ0xDJDAxMDUsJXIyNQorCWxkbyBSJ0xDJDAxMDUoJXIyNSksJXIyNQorCWxkdyA0MCglcjIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgNDAoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDI2MiwlcjAKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjE5LCVyMjAKKwlsZHcgMCglcjIwKSwlcjE5CisJbGRvIC04KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIyMCwlcjIwCisJbGR3IDAoJXIyMCksJXIyMQorCWxkbyAyKCVyMjEpLCVyMjAKKwlsZHcgNDAoJXIxOSksJXIyNgorCWNvcHkgJXIyMCwlcjI1CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgorCW5vcAorTCQwMjYyOiAKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMTA2LCVyMjUKKwlsZG8gUidMQyQwMTA2KCVyMjUpLCVyMjUKKwlsZHcgNDQoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZHcgMCglcjE5KSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWNvbWljbHIsPD4gNiwlcjE5LCVyMAorCWJsIEwkMDI2NSwlcjAKKwlub3AKKwljb21pY2xyLD49IDYsJXIxOSwlcjAKKwlibCBMJDAyNzAsJXIwCisJbm9wCisJY29taWNsciw8PiAzLCVyMTksJXIwCisJYmwgTCQwMjY2LCVyMAorCW5vcAorCWJsLG4gTCQwMjY3LCVyMAorTCQwMjcwOiAKKwljb21pY2xyLDw+IDE1LCVyMTksJXIwCisJYmwgTCQwMjY0LCVyMAorCW5vcAorCWJsLG4gTCQwMjY3LCVyMAorTCQwMjY0OiAKK0wkMDI2NTogCisJbGRvIC04KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIwCisJYWRkICVyMjAsJXIxOSwlcjE5CisJbGRvIC00KCVyMCksJXIyMAorCWxkbyAtMzIoJXI0KSwlcjIyCisJYWRkICVyMjIsJXIyMCwlcjIxCisJbGR3IDAoJXIyMSksJXIyMAorCWxkdyAwKCVyMTkpLCVyMjYKKwlsZGlsIEwnTEMkMDEwNywlcjI1CisJbGRvIFInTEMkMDEwNyglcjI1KSwlcjI1CisJbGR3IDQ4KCVyMjApLCVyMjQKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCisJbm9wCisJbGRvIC00KCVyMCksJXIxOQorCWxkbyAtMzIoJXI0KSwlcjIxCisJYWRkICVyMjEsJXIxOSwlcjIwCisJbGR3IDAoJXIyMCksJXIxOQorCWxkbyAtOCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMjAsJXIyMAorCWxkdyA0OCglcjE5KSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcHJpbnRfYXJnX3R5cGVzLCVyMgorCW5vcAorCWJsLG4gTCQwMjYzLCVyMAorTCQwMjY2OiAKKwlsZG8gLTgoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTQoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjIKKwlhZGQgJXIyMiwlcjIwLCVyMjEKKwlsZHcgMCglcjIxKSwlcjIwCisJbGR3IDAoJXIxOSksJXIyNgorCWxkaWwgTCdMQyQwMTA4LCVyMjUKKwlsZG8gUidMQyQwMTA4KCVyMjUpLCVyMjUKKwlsZHcgNDgoJXIyMCksJXIyNAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKKwlub3AKKwlsZG8gLTQoJXIwKSwlcjE5CisJbGRvIC0zMiglcjQpLCVyMjAKKwlhZGQgJXIyMCwlcjE5LCVyMTkKKwlsZG8gLTgoJXIwKSwlcjIwCisJbGRvIC0zMiglcjQpLCVyMjEKKwlhZGQgJXIyMSwlcjIwLCVyMjAKKwlsZHcgMCglcjE5KSwlcjI2CisJbGR3IDAoJXIyMCksJXIyNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcHJpbnRfY3BsdXNfc3R1ZmYsJXIyCisJbm9wCisJYmwsbiBMJDAyNjMsJXIwCitMJDAyNjc6IAorCWxkbyAtOCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMAorCWFkZCAlcjIwLCVyMTksJXIxOQorCWxkbyAtNCglcjApLCVyMjAKKwlsZG8gLTMyKCVyNCksJXIyMgorCWFkZCAlcjIyLCVyMjAsJXIyMQorCWxkdyAwKCVyMjEpLCVyMjAKKwlsZHcgMCglcjE5KSwlcjI2CisJbGRpbCBMJ0xDJDAxMDksJXIyNQorCWxkbyBSJ0xDJDAxMDkoJXIyNSksJXIyNQorCWxkdyA0OCglcjIwKSwlcjI0CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgorCW5vcAorCWxkbyAtNCglcjApLCVyMTkKKwlsZG8gLTMyKCVyNCksJXIyMQorCWFkZCAlcjIxLCVyMTksJXIyMAorCWxkdyAwKCVyMjApLCVyMTkKKwlsZHcgNDgoJXIxOSksJXIyMAorCWNvbWljbHIsPD4gMCwlcjIwLCVyMAorCWJsIEwkMDI2OCwlcjAKKwlub3AKKwlsZGlsIEwnTEMkMDExMCwlcjI2CisJbGRvIFInTEMkMDExMCglcjI2KSwlcjI2CisJLkNBTEwgQVJHVzA9R1IKKwlibCBwcmludGZfZmlsdGVyZWQsJXIyCisJbm9wCitMJDAyNjg6IAorCWxkaWwgTCdMQyQwMDY2LCVyMjYKKwlsZG8gUidMQyQwMDY2KCVyMjYpLCVyMjYKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKKwlub3AKKwlibCxuIEwkMDI2MywlcjAKK0wkMDI2MzogCitMJDAyMjk6IAorCWxkdyAxNiglcjQpLCVyOAorCWxkdyAyMCglcjQpLCVyNworCWxkdyAyNCglcjQpLCVyNgorCWxkdyAyOCglcjQpLCVyNQorCWxkbyA4KCVyNCksJXIzMAorCWxkdyAtMjgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZHdtIC04KCVyMzApLCVyNAorCS5FWElUCisJLlBST0NFTkQKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkQlNTJAorCitjcGx1c19zdHJ1Y3RfZGVmYXVsdDogLmNvbW0gMjQKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9nbG9iYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwYzRhNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMKQEAgLTAsMCArMSwxNSBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKwkuSU1QT1JUIGZvbyxkYXRhCisKKwkuYWxpZ24gNAorOyBPZmZpY2lhbCBnYXMgY29kZSB3aWxsIG5vdCBhY2NlcHQgc3ltLSRnbG9iYWwkLgorCWFkZGlsIEwlZm9vLSRnbG9iYWwkLCVyMjcKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMKQEAgLTAsMCArMSwzNSBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UJJFRFWFQkLCBTT1JUPTgKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKzsgQSBjb21tZW50LiAgVGhpcyBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIGEgbGFiZWwsIGJ1dCBib3RoIG9mIHRoZQorOyBmb2xsb3dpbmcgc3RhdGVtZW50cyBzaG91bGQuCitsYWJlbF93aXRob3V0X2NvbG9uCitsYWJlbF93aXRoX2NvbG9uOgorCis7IEEgcHJvYmxlbSB0ZWdlIGZvdW5kLi4uCis7IElucHV0IHNjcnViYmluZyBpbiBnYXMgbWFrZXMgbGlmZSBhIHJlYWwgbmlnaHRtYXJlIGZvciBhc3NlbWJsZXJzCis7IGluIHdoaWNoIHRoZSAqcG9zaXRpb24qIHdpdGhpbiBhIGxpbmUgZGV0ZXJtaW5lcyBob3cgdG8gaW50ZXJwcmV0Cis7IGEgc3RyZWFtIGEgY2hhcmFjdGVycy4gIFRoZXNlIHRlc3Qgb25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSBnYXMKKzsgaGFkIHRoZSB0ZW5kZW5jeSB0byBkZWxldGUgdGhlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgb3Bjb2RlIGFuZAorOyBvcGVyYW5kcyBpZiBhIGxhYmVsIHdpdGhvdXQgYSBjb2xvbiBiZWdhbiBhIGxpbmUsIGFuZCB0aGUgb3BlcmFuZHMKKzsgc3RhcnRlZCB3aXRoIGEgbm9uLW51bWVyaWMgY2hhcmFjdGVyLgorTCQxCWFkZCAlcjIsJXIyLCVyMgorTCQyOglhZGQgJXIyLCVyMiwlcjIKK0wkMworCWFkZCAlcjIsJXIyLCVyMgorCitMJDQJYWRkICVyMiwlcjIsJXIyCitMJDU6CWFkZCAlcjIsJXIyLCVyMgorTCQ2CisJYWRkICVyMiwlcjIsJXIyCisKKzsgQW4gaW5zdHJ1Y3Rpb24gb3IgcHNldWRvLW9wIG1heSBiZWdpbiBhbnl3aGVyZSBhZnRlciBjb2x1bW4gMC4KKyBiLG4gbGFiZWxfd2l0aG91dF9jb2xvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xpbmVzZXBidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE5YzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMKQEAgLTAsMCArMSwyMCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAorOworOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKKzsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAorOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCisKK2ZvbzoKKwkuV09SRCAwICEuSU1QT1JUICRiYXIkLERBVEEKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xzZWxidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWNkOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMKQEAgLTAsMCArMSwxOCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0Cis7IEluIGdhcy0xLjM2IHRoZSBsZGlsIGluc3RydWN0aW9uIHVzaW5nIHBhcmVudGhlc2lzIGdlbmVyYXRlZAorOyBnYXJiYWdlIGJpdHMgd2hpbGUgdGhlIG9uZSB3aXRob3V0IHBhcmVucyB3b3JrZWQgZmluZS4KKwlsZGlsIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiksJXIyMQorCWxkbyBMJSgweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIpICglcjIxKSwlcjIxCisJbGRpbCBMJTB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMiwlcjIxCisJbGRvIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyICglcjIxKSwlcjIxCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvbm9zdWJzcGFjZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNDYwMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvbm9zdWJzcGFjZS5zCkBAIC0wLDAgKzEsMjEgQEAKKwkuU1BBQ0UgJFRFWFQkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgbXBuX2FkZF9uCisJLkVYUE9SVCBtcG5fYWRkX24sUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKK21wbl9hZGRfbjoKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCisJLkVOVFJZCisKKwlhZGQJJXIwLCVyMCwlcjAJCTsgcmVzZXQgY3kKK0xvb3A6CisJbGR3cyxtYQkgNCgwLCVyMjUpLCVyMjAKKwlsZHdzLG1hCSA0KDAsJXIyNCksJXIxOQorCisJYWRkYwkgJXIxOSwlcjIwLCVyMTkKKwlhZGRpYiw8PiAtMSwlcjIzLExvb3AKKwlzdHdzLG1hCSAlcjE5LDQoMCwlcjI2KQorCisJYnYJMCgyKQorCSBhZGRjCSVyMCwlcjAsJXIyOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTRjMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAKQEAgLTAsMCArMSwyMjIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBEZWphR251QGN5Z251cy5jb20KKworIyBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAorIyBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK3Byb2MgZG9fc3RyaW5nX3Rlc3RzIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInN0cmluZ2VyLnM6IFRlc3QgZW1iZWRkZWQgcXVvdGVzIGFuZCBvY3RhbCBlc2NhcGVzIGluIHN0cmluZ3MiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzdHJpbmdlci5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIzNjk2RTYzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2Qzc1NjQ2NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNkIyRTY0NjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDY2MjIwQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOTMwNzgzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgMzIzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09Nl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19sc2VsX3Rlc3Qge30geworICAgIHNldCB0ZXN0bmFtZSAibHNlbGJ1Z3MuczogbHNlbGJ1ZyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImxzZWxidWcucyIgIi1hbCIKKworICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjJBMDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDM2QjUwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyMkEwNDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzZCNTAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fdmFsaWRfYWxpZ25fdGVzdHMge30geworICAgIHNldCB0ZXN0bmFtZSAiYWxpZ24xLnM6IHZhbGlkIGFsaWdubWVudCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImFsaWduMS5zIiAiLWFsIgorCisgICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAxMDAwIDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjEwMjRcW15cblxdKlxuIgorCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwNDAwXFteXG5cXSpCTE9DS1xbXlxuXF0qMTAyNFxbXlxuXF0qXG4iCisJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDBcW15cblxdKkJMT0NLXFteXG5cXSo0XFteXG5cXSpcbiIKKwkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDgwNFxbXlxuXF0qQUxJR05cW15cblxdKjhcW15cblxdKlxuIgorCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwODA4XFteXG5cXSpCTE9DS1xbXlxuXF0qMzBcW15cblxdKlxuIgorCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwODI2XFteXG5cXSpBTElHTlxbXlxuXF0qNFxbXlxuXF0qXG4iCisJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MjhcW15cblxdKkJMT0NLXFteXG5cXSo0XFteXG5cXSpcbiIKKwkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworaWYgW2lzdGFyZ2V0IGhwcGEqLSotKl0gdGhlbiB7CisgICAgIyBHQVMtMi4wIGRvZXMgbm90IGFsd2F5cyBwYXJzZSAhIGFzIGEgbGluZSBzZXBhcmF0b3Igd2hlbiBpdCBzaG91bGQuCisgICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCisgICAgZ2FzX3Rlc3QgImxpbmVzZXBidWcucyIgIiIgIiIgImxpbmUgc2VwYXJhdG9yIGJ1ZyIKKworICAgICMgTWFrZSBzdXJlIEdBUyBhY2NlcHRzIHN5bnRheCBmb3IgYWNjZXNzaW5nIHN0YXRpYyBkYXRhLgorICAgIGdhc190ZXN0ICJnbG9iYWwucyIgIiIgIiIgImNoZWNrIGZvciBzeW0tXCRnbG9iYWxcJCBhY2NlcHRhbmNlIgorCisgICAgIyBHQVMtMi4wIChhbmQgMS4zNiBmb3IgdGhhdCBtYXR0ZXIpIGNhbiBub3QgaGFuZGxlIGEgLnByb2Mgd2hpY2gKKyAgICAjIGhhcyBubyBsYWJlbCBiZWZvcmUgaXQuCisgICAgZ2FzX3Rlc3QgInByb2NidWcucyIgIiIgIiIgIkxhYmVsIGZvbGxvd2luZyAucHJvYyIKKworICAgICMgT25lIGlzIHJlcXVpcmVkIHRvIGV4cGxpY2l0bHkgSU1QT1JUIGFueSBub24tbG9jYWwgc3ltYm9sIHVzZWQKKyAgICAjIGluIGFuIGFzc2VtYmx5IGZpbGUuICBNYWtlIHN1cmUgd2UgZ2l2ZSBhbiBlcnJvciBpZiB3ZSB1c2UKKyAgICAjIGFuIHVuZGVmaW5lZCBzeW1ib2wuCisgICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCisgICAgZ2FzX3Rlc3RfZXJyb3IgInVuZGVmYnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igd2hlbiB1c2luZyB1bmRlZmluZWQgc3ltYm9sIgorCisgICAgIyBUaGlzIGZpbGUgaGFzIGNvZGUgYW5kIGFzc2VtYmxlciBkaXJlY3RpdmVzIGJlZm9yZSBzd2l0Y2hpbmcgaW50byBhbnkKKyAgICAjIHNwYWNlL3N1YnNwYWNlIHBhaXIuICBUaGlzIHNob3VsZCByZXBvcnQgYW4gZXJyb3IgZm9yIFNPTSAoaXQgaXMgbm90CisgICAgIyBhbiBlcnJvciBmb3IgRUxGLiAgVGhlIGZpbGUgYWxzbyBoYXMgbWlzbWF0Y2hlZCBlbnRyeS9leGl0IGFuZAorICAgICMgcHJvYy9wcm9jZW5kIHBhaXJzIHdoaWNoIGFyZSBlcnJvcnMgZm9yIGJvdGggU09NIGFuZCBFTEYuCisgICAgZ2FzX3Rlc3RfZXJyb3IgIm5vc3Vic3BhY2UucyIgIiIgIkNoZWNrIGZvciBlcnJvcihzKSBpbiBpbnB1dCBmaWxlICIKKworICAgICMgVGhpcyBmaWxlIHNob3VsZCByZXR1cm4gZXJyb3JzIGZvciBib3RoIHRoZSBFTlRSWV9HUiBhbmQgRU5UUllfRlIKKyAgICAjIGRpcmVjdGl2ZXMgKHRoZXkgYXJlIG91dC1vZi1yYW5nZSkKKyAgICBnYXNfdGVzdF9lcnJvciAiZW50cnlidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBlbnRyeV9nciBhbmQgZW50cnlfZnIiCisKKyAgICAjIE1ha2Ugc3VyZSBlbWJlZGRlZCBxdW90ZXMgYW5kIG9jdGFsIGVzY2FwZXMgaW4gc3RyaW5ncyB3b3JrCisgICAgZG9fc3RyaW5nX3Rlc3RzCisKKyAgICAjIE1ha2Ugc3VyZSB3ZSBkbyBub3QgZGllIG9uIGEgLnZlcnNpb24gZGlyZWN0aXZlCisgICAgZ2FzX3Rlc3QgInZlcnNpb25idWcucyIgIiIgIiIgIi52ZXJzaW9uIGRpcmVjdGl2ZSIKKworICAgICMgTWFrZSBzdXJlIHdlIGdpdmUgYW4gZXJyb3Igb24gYSBib2d1cyAuc3BhY2UgZGlyZWN0aXZlLgorICAgICMgcmVjZW50IHZlcnNpb24gb2YgZ2FzMiB3ZW50IGludG8gaW5maW5pdGUgbG9vcHMgcHJpbnRpbmcKKyAgICAjIGVycm9ycyBvbiB0aGlzIHRlc3QuCisgICAgZ2FzX3Rlc3RfZXJyb3IgInNwYWNlYnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgLnNwYWNlIGRpcmVjdGl2ZSIKKworICAgICMgR0FTIHNob3VsZCBnaXZlIGFuIGVycm9yIGZvciB0aGlzIHRlc3QuCisgICAgZ2FzX3Rlc3RfZXJyb3IgImNhbGxkYXRhYnVnLnMiICIiICJDaGVjayBmb3IgaW52YWxpZCBhZ3VtZW50cyBvbiAuY2FsbCIKKworICAgICMgT2xkIHZlcnNpb25zIG9mIGdhcyBpbmNvcnJlY3RseSBnYXZlIGVycm9ycyBvbiBzb21lIHZhbGlkIC5FWFBPUlQgbGluZXMKKyAgICBnYXNfdGVzdCAiZXhwb3J0YnVnLnMiICIiICIiICJzeW50YXggY2hlY2sgZm9yIGFuIG9sZCAuRVhQT1JUIGJ1ZyIKKworICAgICMgT2xkIHZlcnNpb25zIG9mIGdhcyBjaG9rZWQgb24gdGhpcyBmaWxlIGZvciBzb21lIHJlYXNvbgorICAgIGdhc190ZXN0ICJmaXh1cDdidWcucyIgIiIgIiIgImNoZWNrIGZvciBvbGQgXCJmaXh1cDdcIiBnYXMgYnVnIgorCisgICAgIyBUZXN0IGFuIEwlIHNlbGVjdG9yIHBhcnNpbmcgYnVnIHdoaWNoIGV4aXN0ZWQgaW4gZ2FzLTEuMzYgICAKKyAgICBkb19sc2VsX3Rlc3QKKworICAgICMgRmlyc3QgY2hlY2sgaG93IHNvbWUgdmFsaWQgYWxpZ25tZW50cyBhcmUgaGFuZGxlZC4KKyAgICBkb192YWxpZF9hbGlnbl90ZXN0cworCisgICAgIyBOb3cgY2hlY2sgdG8gbWFrZSBzdXJlIGFuIGludmFsaWQgYXJndW1lbnQgaXMgZmxhZ2dlZCBhcyBhbiBlcnJvci4KKyAgICBnYXNfdGVzdF9lcnJvciAiYWxpZ24yLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgYXJndW1lbnQgdG8gLmFsaWduIgorCisgICAgIyBHQVMgY2FuJ3QgaGFuZGxlIHVwcGVyIGJvdW5kIGZvciBhIFBBIC5ibG9ja1t6XSBkaXJlY3RpdmUKKyAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKKyAgICBnYXNfdGVzdCAiYmxvY2sxLnMiICIiICIiICJDaGVjayBtaW4vbWF4IHZhbHVlcyBmb3IgLmJsb2NrIgorCisgICAgIyBOb3cgY2hlY2sgZm9yIGFuIGludmFsaWQgYXJndW1lbnQKKyAgICBnYXNfdGVzdF9lcnJvciAiYmxvY2syLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYm9ndXMgYXJndW1lbnQgdG8gLmJsb2NrIgorCisgICAgIyBHQVMtMS4zNiBjaG9rZWQgb24gdGhpcyBmaWxlLgorICAgICMgRklYTUUuICBTaG91bGQgY2hlY2sgcmVsb2NhdGlvbnMgbWFkZSBmb3IgdGhpcyB0ZXN0IQorICAgIGdhc190ZXN0ICJleHByYnVnLnMiICIiICIiICJDaGVjayBmb3Igc3ltMS1zeW0yIGFjY2VwdGFuY2UiCisKKyAgICAjIEJhZCB0aGluZ3MgaGFwcGVuIGluIHRoZSBQQSBFTEYgYmFja2VuZCAob3RoZXJzIHRvbz8pIGlmIGEgbm9uLWRlZmF1bHQKKyAgICAjIHNlY3Rpb24gaXMgY3JlYXRlZC4uLgorICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKmVsZioKKyAgICBnYXNfdGVzdCAic3NidWcucyIgIiIgIiIgIkNoZWNrIGZvciBhY2NlcHRhbmNlIG9mIG5vbi1kZWZhdWx0IHN1YnNwYWNlcyIKKworICAgICMgVG8gYmUgY29tcGF0YWJsZSB3aXRoIGNlcnRhaW4gImZlYXR1cmVzIiBvZiB0aGUgSFAgY29tcGlsZXIKKyAgICAjIG5vbi1leGlzdGFudCByZWdpc3RlcnMgc2hvdWxkIGRlZmF1bHQgdG8gJXIwLgorICAgIGdhc190ZXN0ICJkZWZidWcucyIgIiIgIiIgIk1pc3NpbmcgcmVnaXN0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gJSVyMCIKKworICAgICMgTWFrZSBzdXJlIEdBUyB1bmRlcnN0YW5kcyBhIHJlYXNvbmFibGUgc2V0IG9mIHN0YW5kYXJkIHByZWRlZmluZWQKKyAgICAjIHJlZ2lzdGVycy4gIGVnICVycCwgJWRwLCAlc3AsIGV0Yy4KKyAgICBnYXNfdGVzdCAic3RkcmVnLnMiICIiICIiICJUZXN0IHN0YW5kYXJkIHByZWRlZmluZWQgcmVnaXN0ZXJzIgorCisgICAgIyBNYWtlIHN1cmUgR0FTIHdpbGwgYWNjZXB0IGEgbGFiZWwgd2l0aG91dCBhIGNvbG9uLgorICAgIGdhc190ZXN0ICJsYWJlbGJ1Zy5zIiAiIiAiIiAiVGVzdCBsYWJlbCB3aXRob3V0IGNvbG9uIgorCisgICAgIyBNYWtlIHN1cmUgd2UgZ3JvayAjIGxpbmUgZGlyZWN0aXZlcy4KKyAgICBnYXNfdGVzdCAiYXBwYnVnLnMiICIiICIiICJUZXN0IGFjY2VwdGFuY2Ugb2YgI2xpbmUgZGlyZWN0aXZlcyIKKworICAgICMgTWFrZSBzdXJlIHdlIGdpdmUgZXJyb3JzIGlmIGEgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IGlzIHNwZWNpZmllZAorICAgICMgZm9yIGFuIHhtcHl1IGluc3RydWN0aW9uIChpbnRlZ2VyIG11bHRpcGxlKQorICAgIGdhc190ZXN0X2Vycm9yICJ4bXB5dWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIHhtcHl1IgorCisgICAgIyBNYWtlIHN1cmUgZ2FzIGhhbmRsZXMgdmFyaW91cyBraW5kcyBvZiAucmVnIHBzZXVkby1vcHMKKyAgICBnYXNfdGVzdCAicmVncG9wYnVnLnMiICIiICIiICJUZXN0IGZvciBidWdzIGluIC5yZWcgcHNldWRvLW9wIgorCisgICAgIyBDaGVjayBzb21lIGJ1Z3MgdGhhdCBoYXZlIGFwcGVhcmVkIGluIHBhcnNpbmcgLmNhbGxpbmZvIGRpcmVjdGl2ZXMKKyAgICBnYXNfdGVzdCAiY2FsbGluZm9idWcucyIgIiIgIiIgIlRlc3QgZm9yIGJ1Z3MgaW4gLmNhbGxpbmZvIGRpcmVjdGl2ZSIKKworICAgICMgQ2hlY2sgZm9yIGJvZ3VzIHJlZ2lzdGVycyBpbiBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQvZm1weXN1YgorICAgICMgaW5zdHJ1Y3Rpb25zCisgICAgZ2FzX3Rlc3RfZXJyb3IgImJhZGZtcHlhZGQucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBiYWQgZm1weWFkZCBpbnNuIgorfQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3Byb2NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcHJvY2J1Zy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTUwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3Byb2NidWcucwpAQCAtMCwwICsxLDE2IEBACisJLnNwYWNlICRURVhUJAorCS5zdWJzcGEgJENPREUkCisJLmFsaWduIDQKKwkuZXhwb3J0IGRpdnUsZW50cnkKKwkucHJvYworCS5jYWxsaW5mbworZGl2dToJc3R3cyxtYQkJJXI0LDQoJXI1KQkJOyBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjaworCS5wcm9jZW5kCisKKwkuZXhwb3J0IGRpdnUyLGVudHJ5CisJLnByb2MKKwkuY2FsbGluZm8KKwkuZW50cnkKK2RpdnUyOglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCisJLmV4aXQKKwkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcmVncG9wYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkYjI2MgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvcmVncG9wYnVnLnMKQEAgLTAsMCArMSwxNyBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworcjAJLnJlZwklcjAKK3NoaWZ0CS5yZWcJJXNhcgorZnByZWcxMAkucmVnCSVmcjEwCitzaGlmdDIJLnJlZwlzaGlmdAorCis7IE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgYm90Y2ggLmVxdS4uLgoreWFiYmEJLmVxdQlyMCArIHNoaWZ0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzYjQwMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3BhY2VidWcucwpAQCAtMCwwICsxLDMgQEAKK3N0YXJ0OgkubG9uZyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3CisJLnNwYWNlIDB4MjAgLSAoLiAtIHN0YXJ0KQorZm9vOgkubG9uZyA0MgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zc2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zc2J1Zy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjBlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKQEAgLTAsMCArMSwxMCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1VCU1BBICRTSE9SVEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MAorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0ZHJlZy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Mjk3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0ZHJlZy5zCkBAIC0wLDAgKzEsMjcgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5leHBvcnQgZm9vCitmb286CisJLnByb2MKKwkuY2FsbGluZm8gbm9fY2FsbHMKKwkuZW50cnkKKwlsZGkgMTUsJXNwCisJbGRpIDE1LCVycAorCWxkaSAxNSwlZHAKKwlsZGkgMTUsJXJldDAKKwlsZGkgMTUsJXJldDEKKwlsZGkgMTUsJWFyZzAKKwlsZGkgMTUsJWFyZzEKKwlsZGkgMTUsJWFyZzIKKwlsZGkgMTUsJWFyZzMKKwkuZXhpdAorIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNWU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RyaW5nZXIucwpAQCAtMCwwICsxLDE5IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJAorCisKKzsgR0FTIHVzZWQgdG8gbWlzLXBhcnNlIHRoZSBlbWJlZGRlZCBxdW90ZXMKKwkuU1RSSU5HICIjaW5jbHVkZSBcImF3ay5kZWZcIlx4MGFceDAwIgorCis7IE9jdGFsIGVzY2FwZXMgdXNlZCB0byBjb25zdW1lID4gMyBjaGFycyB3aGljaCBsZWQgdG8gdGhpcworOyBzdHJpbmcgYmVpbmcgc2NyZXdlZCBpbiBhIGJpZyB3YXkuCisJLlNUUklORyAiXDAxMTB4MTIzIgorCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdW5kZWZidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVkYTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zCkBAIC0wLDAgKzEsMTQgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCWJsIHNvbWV3aGVyZSwlcjIKKwlub3AKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVmMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS92ZXJzaW9uYnVnLnMKQEAgLTAsMCArMSw5IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5WRVJTSU9OICJhYmMxMjMiCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UveG1weXVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UveG1weXVidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU3Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS94bXB5dWJ1Zy5zCkBAIC0wLDAgKzEsMTcgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorOyBObyBmb3JtYXQgc2VsZWN0b3IgZm9yIHhtcHl1IQorCXhtcHl1LHNnbCAlZnI0LCVmcjUsJWZyNgorCXhtcHl1LGRibCAlZnI0LCVmcjUsJWZyNgorCXhtcHl1LHF1YWQgJWZyNCwlZnI1LCVmcjYKKworCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2FwcGx5YnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlZDZlOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucwpAQCAtMCwwICsxLDEzMCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gNAordGFiX19fMgorCS53b3JkIEwkMDAwMgorCS53b3JkIEwkMDAwMworCS53b3JkIEwkMDAwNAorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuRVhQT1JUIGV4ZWN1dGUsQ09ERQorCS5FWFBPUlQgZXhlY3V0ZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgorZXhlY3V0ZQorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKKwkuRU5UUlkKKwlhZGRpbCBMJ2J1Zi0kZ2xvYmFsJCwlcjI3CisJbGRvIFInYnVmLSRnbG9iYWwkKCVyMSksJXIyMAorCWxkaWwgTCdMJDAwMDIsJXIxOQorCW1vdmIsPD4gJXIyNiwlcjI2LEwkMDAwMgorCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjIyCisJY29weSAlcjAsJXIyMQorCWFkZGlsIEwndGFiX19fMi0kZ2xvYmFsJCwlcjI3CisJbGRvIFIndGFiX19fMi0kZ2xvYmFsJCglcjEpLCVyMjMKKwlhZGRpbCBMJ29wdGFiLSRnbG9iYWwkLCVyMjcKKwlsZG8gUidvcHRhYi0kZ2xvYmFsJCglcjEpLCVyMjAKK0wkMDAwOQorCXNoMmFkZCAlcjIxLCVyMjMsJXIxOQorCWxkaCAyKCVyMTkpLCVyMTkKKwlsZG8gMSglcjIxKSwlcjIxCisJc3ViICVyMTksJXIyMiwlcjE5CisJY29taWIsPj0gMiwlcjIxLEwkMDAwOQorCXN0aHMsbWEgJXIxOSwyKCVyMjApCisJYnYsbiAlcjAoJXIyKQorTCQwMDAyCisJbGRpIDEyMCwlcjE5CisJc3RicyxtYSAlcjE5LDEoJXIyMCkKKwlsZGhzLG1hIDIoJXIyNiksJXIxOQorCWFkZCAlcjIyLCVyMTksJXIxOQorCWJ2LG4gJXIwKCVyMTkpCitMJDAwMDMKKwlsZGkgMTIxLCVyMTkKKwlzdGJzLG1hICVyMTksMSglcjIwKQorCWxkaHMsbWEgMiglcjI2KSwlcjE5CisJYWRkICVyMjIsJXIxOSwlcjE5CisJYnYsbiAlcjAoJXIxOSkKK0wkMDAwNAorCWxkaSAxMjIsJXIxOQorCXN0YiAlcjE5LDAoJXIyMCkKKwlidiAlcjAoJXIyKQorCXN0YnMsbWIgJXIwLDEoJXIyMCkKKwkuRVhJVAorCS5QUk9DRU5ECisJLklNUE9SVCBfX21haW4sQ09ERQorCS5JTVBPUlQgc3RyY21wLENPREUKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJAorCisJLmFsaWduIDQKK0wkQzAwMDAKKwkuU1RSSU5HICJ4eXh5elx4MDAiCisJLklNUE9SVCBhYm9ydCxDT0RFCisJLklNUE9SVCBleGl0LENPREUKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLkVYUE9SVCBtYWluLENPREUKKwkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKK21haW4KKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJLkNBTEwgCisJYmwgX19tYWluLCVyMgorCWxkbyAxMjgoJXIzMCksJXIzMAorCS5DQUxMIEFSR1cwPUdSCisJYmwgZXhlY3V0ZSwlcjIKKwljb3B5ICVyMCwlcjI2CisJYWRkaWwgTCdvcHRhYi0kZ2xvYmFsJCwlcjI3CisJY29weSAlcjEsJXIxOQorCWxkbyBSJ29wdGFiLSRnbG9iYWwkKCVyMTkpLCVyMjEKKwlsZGggMiglcjIxKSwlcjIwCisJbGRoIFInb3B0YWItJGdsb2JhbCQoJXIxOSksJXIxOQorCWFkZGlsIEwncC0kZ2xvYmFsJCwlcjI3CisJY29weSAlcjEsJXIyMgorCXN0aCAlcjIwLFIncC0kZ2xvYmFsJCglcjIyKQorCWxkbyBSJ3AtJGdsb2JhbCQoJXIyMiksJXIyNgorCXN0aCAlcjIwLDQoJXIyNikKKwlzdGggJXIxOSwyKCVyMjYpCisJbGRoIDQoJXIyMSksJXIxOQorCS5DQUxMIEFSR1cwPUdSCisJYmwgZXhlY3V0ZSwlcjIKKwlzdGggJXIxOSw2KCVyMjYpCisJYWRkaWwgTCdidWYtJGdsb2JhbCQsJXIyNworCWNvcHkgJXIxLCVyMTkKKwlsZG8gUididWYtJGdsb2JhbCQoJXIxOSksJXIyNgorCWxkaWwgTCdMJEMwMDAwLCVyMjUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIKKwlsZG8gUidMJEMwMDAwKCVyMjUpLCVyMjUKKwljb21pYiw9LG4gMCwlcjI4LEwkMDAxMQorCS5DQUxMIAorCWJsIGFib3J0LCVyMgorCW5vcAorTCQwMDExCisJLkNBTEwgQVJHVzA9R1IKKwlibCBleGl0LCVyMgorCWNvcHkgJXIwLCVyMjYKKwlub3AKKwkuRVhJVAorCS5QUk9DRU5ECisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJEJTUyQKKworb3B0YWIJLmNvbW0gMTAKK2J1ZgkuY29tbSAxMAorcAkuY29tbSAxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzMDc3NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnLnMKQEAgLTAsMCArMSwxNiBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLklNUE9SVAkkJGR5bmNhbGwsTUlMTElDT0RFIDsgQ29kZSBmb3IgZHluYW1pYyBmdW5jdGlvbiBjYWxscy4KKworX3NpZ3RyYW1wOgorCWxkaWwJTCUkJGR5bmNhbGwsJXIyCTsgICB3aG9zZSBhZGRyZXNzIGlzIGluIHIyMi4KKwlibGUJUiUkJGR5bmNhbGwoJXNyNCwlcjIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzdiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucwpAQCAtMCwwICsxLDE0IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKworICAJbGRpbAlMJTB4YzAwMDEwMDQsJXIxCisgIAlibGUJUiUweGMwMDAxMDA0KCVzcjcsJXIxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWU5YjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKQEAgLTAsMCArMSwxNCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLmltcG9ydCB5YWJiYSxjb2RlCisKKyAgCWJsZQlSJXlhYmJhKCVzcjQsJXIwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk4ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9leGl0YnVnLnMKQEAgLTAsMCArMSwxOSBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgZm9vLENPREUKKwkuRVhQT1JUIGZvbyxFTlRSWSxQUklWX0xFVj0zCitmb286CisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MAorCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2ZpeHVwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2ZpeHVwYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1OGQwMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZml4dXBidWcucwpAQCAtMCwwICsxLDE5IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKwkuU1VCU1BBICRNSUxMSUNPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxTT1JUPTgKKworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJYixuCSQkZm9vCisJbm9wCisJbm9wCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTUlMTElDT0RFJAorJCRmb286CisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE0M2JjNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnMKQEAgLTAsMCArMSwxODYgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCS5JTVBPUlQgJGdsb2JhbCQsREFUQQorCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQorOyBnY2NfY29tcGlsZWQuOgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuRVhQT1JUIGcsQ09ERQorCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgorZworCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MworCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjMsJXIxCisJY29weSAlcjMwLCVyMworCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjI2LC0zNiglcjMpCisJc3R3ICVyMjUsLTQwKCVyMykKKwlzdHcgJXIyNCwtNDQoJXIzKQorCWxkdyAtMzYoJXIzKSwlcjI2CisJbGR3IC00MCglcjMpLCVyMjUKKwlsZHcgLTQ0KCVyMyksJXIxOQorCWNvcHkgJXIxOSwlcjIyCisJLkNBTEwJQVJHVzA9R1IKKwlibCAkJGR5bmNhbGwsJXIzMQorCWNvcHkgJXIzMSwlcjIKKwljb3B5ICVyMjgsJXIxOQorCWNvbWljbHIsPD4gMCwlcjE5LCVyMAorCWJsLG4gTCQwMDAyLCVyMAorCWxkdyAtMzYoJXIzKSwlcjI4CisJYmwsbiBMJDAwMDEsJXIwCisJYmwsbiBMJDAwMDMsJXIwCitMJDAwMDIKKwlsZHcgLTQwKCVyMyksJXIyOAorCWJsLG4gTCQwMDAxLCVyMAorTCQwMDAzCitMJDAwMDEKKwlsZHcgLTIwKCVyMyksJXIyCisJbGRvIDY0KCVyMyksJXIzMAorCWxkd20gLTY0KCVyMzApLCVyMworCWJ2LG4gJXIwKCVyMikKKwkuRVhJVAorCS5QUk9DRU5ECisJLmFsaWduIDQKK2YyX19fNAorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MworCS5FTlRSWQorCWNvcHkgJXIzLCVyMQorCWNvcHkgJXIzMCwlcjMKKwlzdHdtICVyMSw2NCglcjMwKQorCXN0dyAlcjI5LDgoJXIzKQorCXN0dyAlcjI2LC0zNiglcjMpCisJc3R3ICVyMjUsLTQwKCVyMykKKwlsZHcgLTM2KCVyMyksJXIxOQorCWxkdyAtNDAoJXIzKSwlcjIwCisJY29tY2xyLD49ICVyMjAsJXIxOSwlcjE5CisJbGRpIDEsJXIxOQorCWNvcHkgJXIxOSwlcjI4CisJYmwsbiBMJDAwMDUsJXIwCitMJDAwMDUKKwlsZG8gNjQoJXIzKSwlcjMwCisJbGR3bSAtNjQoJXIzMCksJXIzCisJYnYsbiAlcjAoJXIyKQorCS5FWElUCisJLlBST0NFTkQKKwkuSU1QT1JUIGFib3J0LENPREUKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQKKworCS5hbGlnbiA0CitMJFRSQU1QMDAwMAorCWxkdwkzNiglcjIyKSwlcjIxCisJYmIsPj0sbgklcjIxLDMwLC4rMTYKKwlkZXBpCTAsMzEsMiwlcjIxCisJbGR3CTQoJXIyMSksJXIxOQorCWxkdwkwKCVyMjEpLCVyMjEKKwlsZHNpZAkoJXIyMSksJXIxCisJbXRzcAklcjEsJXNyMAorCWJlCTAoJXNyMCwlcjIxKQorCWxkdwk0MCglcjIyKSwlcjI5CisJLndvcmQJMAorCS53b3JkCTAKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLkVYUE9SVCBmLENPREUKKwkuRVhQT1JUIGYsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKK2YKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKKwkuRU5UUlkKKwlzdHcgJXIyLC0yMCglcjMwKQorCWNvcHkgJXIzLCVyMQorCWNvcHkgJXIzMCwlcjMKKwlzdHdtICVyMSwxOTIoJXIzMCkKKwlsZG8gMTYoJXIzKSwlcjE5CisJYWRkaWwgTCdMJFRSQU1QMDAwMC0kZ2xvYmFsJCwlcjI3CisJbGRvIFInTCRUUkFNUDAwMDAtJGdsb2JhbCQoJXIxKSwlcjIyCisJbGRvIDQwKCVyMCksJXIyMAorCWxkd3MsbWEgNCglcjIyKSwlcjIxCisJYWRkaWIsPj0gLTQsJXIyMCwuLTQKKwlzdHdzLG1hICVyMjEsNCglcjE5KQorCWxkaWwgTCdmMl9fXzQsJXIyMAorCWxkbyBSJ2YyX19fNCglcjIwKSwlcjE5CisJc3R3ICVyMTksNTIoJXIzKQorCWxkbyA4KCVyMyksJXIxOQorCXN0dyAlcjE5LDU2KCVyMykKKwlsZG8gMTYoJXIzKSwlcjE5CisJbGRvIDQ4KCVyMyksJXIyMAorCWZkYyAlcjAoJXIxOSkKKwlmZGMgJXIwKCVyMjApCisJc3luYworCWxkbyAzMiglcjE5KSwlcjIyCisJbWZzcCAlc3IwLCVyMjEKKwlsZHNpZCAoJXIxOSksJXIyMAorCW10c3AgJXIyMCwlc3IwCisJZmljICVyMCglc3IwLCVyMTkpCisJZmljICVyMCglc3IwLCVyMjIpCisJc3luYworCW10c3AgJXIyMSwlc3IwCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbGRvIDE2KCVyMyksJXIxOQorCWxkaSAxLCVyMjYKKwlsZGkgMiwlcjI1CisJY29weSAlcjE5LCVyMjQKKwkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTworCWJsIGcsJXIyCisJbm9wCisJY29weSAlcjI4LCVyMTkKKwljb21pY2xyLDw+IDIsJXIxOSwlcjAKKwlibCxuIEwkMDAwNiwlcjAKKwkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTworCWJsIGFib3J0LCVyMgorCW5vcAorTCQwMDA2CitMJDAwMDQKKwlsZHcgLTIwKCVyMyksJXIyCisJbGRvIDY0KCVyMyksJXIzMAorCWxkd20gLTY0KCVyMzApLCVyMworCWJ2LG4gJXIwKCVyMikKKwkuRVhJVAorCS5QUk9DRU5ECisJLklNUE9SVCBfX21haW4sQ09ERQorCS5JTVBPUlQgZXhpdCxDT0RFCisJLmFsaWduIDQKKwkuRVhQT1JUIG1haW4sQ09ERQorCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgorbWFpbgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MworCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjMsJXIxCisJY29weSAlcjMwLCVyMworCXN0d20gJXIxLDEyOCglcjMwKQorCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCisJYmwgX19tYWluLCVyMgorCW5vcAorCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCisJYmwgZiwlcjIKKwlub3AKKwljb3B5ICVyMCwlcjI2CisJLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KKwlibCBleGl0LCVyMgorCW5vcAorTCQwMDA3CisJbGR3IC0yMCglcjMpLCVyMgorCWxkbyA2NCglcjMpLCVyMzAKKwlsZHdtIC02NCglcjMwKSwlcjMKKwlidixuICVyMCglcjIpCisJLkVYSVQKKwkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sYWJlbG9wYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RjNDIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sYWJlbG9wYnVnLnMKQEAgLTAsMCArMSwzNyBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorczoKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDEyOCglcjMwKQorCXN0dyAlcjMwLDEyKCVyNCkKKwlsZGlsIEwnTCQwMDA3LCVyMTkKKwlsZG8gUidMJDAwMDcoJXIxOSksJXIxOQorCWNvbWliLD49IDAsJXIyNixMJDAwMDIKKwlzdHcgJXIxOSw4KCVyNCkKK0wkMDAwMzoKK0wkMDAwMjoKKwliIEwkMDAwMQorCWxkbyAxKCVyMCksJXIyOAorTCQwMDA3OgorCWxkaWwgTCdMJDAwMDIsJXIxOQorCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjE5CisJY29tYiw9ICVyMjksJXIxOSxMJDAwMDIKKwlsZG8gLTgoJXI0KSwlcjQKKwkuRVhJVAorCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzOTk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwucwpAQCAtMCwwICsxLDQwIEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKwkuSU1QT1JUICRnbG9iYWwkLERBVEEKKwkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKKzsgZ2NjX2NvbXBpbGVkLjoKKwkuSU1QT1JUIGJhcixDT0RFCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgZm9vLENPREUKKwkuRVhQT1JUIGZvbyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgorZm9vCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9NjQsQ0FMTFMsU0FWRV9SUAorCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJLkNBTEwgCisJYmwgYmFyLCVyMgorCWxkbyA2NCglcjMwKSwlcjMwCisJLmJsb2NreiAyNjIxNDQKKwlsZHcgLTg0KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGRvIC02NCglcjMwKSwlcjMwCisJLkVYSVQKKwkuUFJPQ0VORAorCS5hbGlnbiA0CisJLkVYUE9SVCBiYXIsQ09ERQorCS5FWFBPUlQgYmFyLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCitiYXIKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCisJLkVOVFJZCisJYnYsbiAlcjAoJXIyKQorCS5FWElUCisJLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGljcmVsb2MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlhNDRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zCkBAIC0wLDAgKzEsMTMgQEAKKworCS5TUEFDRQkkVEVYVCQsU09SVD04CisJLlNVQlNQQQkkQ09ERSQsUVVBRD0wLEFMSUdOPTQsQUNDRVNTPTB4MmMsQ09ERV9PTkxZLFNPUlQ9MjQKKwkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKKwkuU1VCU1BBCSREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MHgxZixTT1JUPTE2Citib2dvCisJLkFMSUdOCTgKKwkuV09SRCAgYm9nbys0CTsgPSAweDQKKwkuU1RSSU5HCSJceDAwXHgwMFx4MDB7XHgwMFx4MDBceDAxXHhDOFx4MDBceDAwXHgwM1x4MTUiCisJLlNQQUNFCSRQUklWQVRFJAorCS5TVUJTUEEJJERBVEEkCisJLkVYUE9SVAlib2dvCisJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwNWIzMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcGxhYmVsYnVnLnMKQEAgLTAsMCArMSw0NyBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLklNUE9SVCBhYm9ydCxDT0RFCisJLkVYUE9SVCBmLERBVEEKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQKKworCS5hbGlnbiA0CitmOgorCS53b3JkIFAlYWJvcnQKKwkud29yZCBQJWFib3J0CisJLklNUE9SVCBfX21haW4sQ09ERQorCS5JTVBPUlQgcHJpbnRmLENPREUKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CitMQyQwMDAwOgorCS5TVFJJTkcgImZyb2JceDBhXHgwMCIKKwkuYWxpZ24gNAorCS5FWFBPUlQgbWFpbixDT0RFCisJLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCittYWluOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkKKwlsZG8gMTI4KCVyMzApLCVyMzAKKwkuQ0FMTCAKKwlibCBfX21haW4sJXIyCisJbm9wCisJbGRpbCBMJ0xDJDAwMDAsJXIyNgorCS5DQUxMIEFSR1cwPUdSCisJYmwgcHJpbnRmLCVyMgorCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgorCWxkdyAtMTQ4KCVyMzApLCVyMgorCWJ2ICVyMCglcjIpCisJbGRvIC0xMjgoJXIzMCksJXIzMAorCS5FWElUCisJLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2ZjJkMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zCkBAIC0wLDAgKzEsNDUgQEAKKwkuQ09QWVJJR0hUICJNZXRhV2FyZSBJbmNvcnBvcmF0ZWQsIDE5OTIiCisJLlZFUlNJT04JImhjMi42YSAtTzEgdDMuY1xuIgorCisJLlNQQUNFCSRQUklWQVRFJCxTT1JUPTE2CisJLlNVQlNQQQkkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MHgxRixTT1JUPTgwLFpFUk8KKwkuU1VCU1BBCSREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MHgxRixTT1JUPTE2CisKKwkuU1BBQ0UJJFRFWFQkLFNPUlQ9OAorCS5TVUJTUEEJJENPREUkLFFVQUQ9MCxBTElHTj00LEFDQ0VTUz00NCxDT0RFX09OTFksU09SVD0yNAorCisJLlNQQUNFCSRQUklWQVRFJAorCS5TVUJTUEEJJERBVEEkCisJLkFMSUdOCTgKKyRMMDBEQVRBCisJLkFMSUdOCTgKKwkuRVhQT1JUCXMKK3MKKwkuV09SRAkweDAKKwkuQkxPQ0taCTc4NjQyNQorCS5CTE9DS1oJNworCisJLlNQQUNFCSRURVhUJAorCS5TVUJTUEEJJENPREUkCitMJDAwMS4zCitnCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKKwkuRU5UUlkKKwk7bGRvCTEyMCglcjApLCVyMjggLS0+IHRvIGRlbGF5IHNsb3QKKwlidgklcjAoJXIyKQorCS5FWElUCisJbGRvCTEyMCglcjApLCVyMjgKKwkuUFJPQ0VORAorCisKKwkuU1BBQ0UJJFBSSVZBVEUkCisJLlNVQlNQQQkkREFUQSQKKwkuQUxJR04JNAorCS5FWFBPUlQJbAorbAorCS5XT1JECVAnZworCS5JTVBPUlQJY29tbW9uLERBVEEJOyBjb21tb24gc2VjdGlvbiwgc2l6ZT0wCisJLklNUE9SVAkkZ2xvYmFsJCxEQVRBCisJLkVYUE9SVAlnLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCisJLkVORAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc3NTJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucwpAQCAtMCwwICsxLDQ4IEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKwkuSU1QT1JUICRnbG9iYWwkLERBVEEKKwkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKKzsgZ2NjX2NvbXBpbGVkLjoKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLlBBUkFNIGZvbyxSVE5WQUw9R1IKK2ZvbzoKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCisJLkVOVFJZCisJYnYsbiAlcjAoJXIyKQorCS5FWElUCisJLlBST0NFTkQKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CitMQyQwMDAwOgorCS53b3JkIFAlZm9vCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgYmFyLENPREUKKwkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgorYmFyOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCisJLkVOVFJZCisJbGRpbCBMJ0xDJDAwMDAsJXIxOQorCWxkdyBSJ0xDJDAwMDAoJXIxOSksJXIyNgorCXN0dyAlcjIsLTIwKCVyMzApCisJLkNBTEwgQVJHVzA9R1IKKwlibCBmb28sJXIyCisJbGRvIDEyOCglcjMwKSwlcjMwCisJbGR3IC0xNDgoJXIzMCksJXIyCisJYnYgJXIwKCVyMikKKwlsZG8gLTEyOCglcjMwKSwlcjMwCisJLkVYSVQKKwkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNmYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnMKQEAgLTAsMCArMSw4MCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQKKworCS5hbGlnbiA4CitMJFAwMDAwCisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MAorCisJLmFsaWduIDgKK0wkQzAwMDAKKwkud29yZCAweDNmZjAwMDAwCisJLndvcmQgMHgwCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1GUgorZworCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKKwkuRU5UUlkKKwlzdHcgJXIxOSwtMzIoJXIzMCkKKwlsZHcgVCdMJEMwMDAwKCVyMTkpLCVyMjAKKwlidiAlcjAoJXIyKQorCWZsZGRzIDAoJXIyMCksJWZyNAorCS5FWElUCisJLlBST0NFTkQKKwkuSU1QT1JUIGFib3J0LENPREUKKwkuSU1QT1JUIGV4aXQsQ09ERQorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkCisKKwkuYWxpZ24gOAorTCRDMDAwMQorCS53b3JkIDB4M2ZmMDAwMDAKKwkud29yZCAweDAKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCittYWluCisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsRU5UUllfR1I9MworCS5FTlRSWQorCXN0dyAlcjIsLTIwKCVyMzApCisJbGRvIDEyOCglcjMwKSwlcjMwCisJc3R3ICVyMTksLTMyKCVyMzApCisJc3R3ICVyNCwtMTI4KCVyMzApCisKKwljb3B5ICVyMTksJXI0CisJLkNBTEwgCisJYmwgZywlcjIKKwljb3B5ICVyNCwlcjE5CisJY29weSAlcjQsJXIxOQorCWxkdyBUJ0wkQzAwMDEoJXIxOSksJXIyMAorCWZsZGRzIDAoJXIyMCksJWZyOAorCWZjbXAsZGJsLD0gJWZyNCwlZnI4CisJZnRlc3QKKwlhZGQsdHIgJXIwLCVyMCwlcjAKKwliLG4gTCQwMDAzCisJLkNBTEwgCisJYmwgYWJvcnQsJXIyCisJbm9wCitMJDAwMDMKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGV4aXQsJXIyCisJbGRpIDAsJXIyNgorCW5vcAorCS5FWElUCisJLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MWU3OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zCkBAIC0wLDAgKzEsNTEgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCS5JTVBPUlQgJGdsb2JhbCQsREFUQQorCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQorOyBnY2NfY29tcGlsZWQuOgorCS5FWFBPUlQgYmxhaCxEQVRBCisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gOAorYmxhaAorCTsgLmRvdWJsZSAwZSswMAorCS53b3JkIDAgOyA9IDB4MAorCS53b3JkIDAgOyA9IDB4MAorCS5FWFBPUlQgZm9vLERBVEEKKwkuYWxpZ24gOAorZm9vCisJOyAuZG91YmxlIDBlKzAwCisJLndvcmQgMCA7ID0gMHgwCisJLndvcmQgMCA7ID0gMHgwCisJLkVYUE9SVCB5YWJiYSxEQVRBCisJLmFsaWduIDQKK3lhYmJhCisJLndvcmQgMQorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuRVhQT1JUIGJhcixDT0RFCisJLkVYUE9SVCBiYXIsRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKK2JhcgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MworCS5FTlRSWQorCWNvcHkgJXIzLCVyMQorCWNvcHkgJXIzMCwlcjMKKwlzdHdtICVyMSw2NCglcjMwKQorCWFkZGlsIEwneWFiYmEtJGdsb2JhbCQsJXIyNworCWxkbyBSJ3lhYmJhLSRnbG9iYWwkKCVyMSksJXIxOQorCWxkaSAyLCVyMjAKKwlzdHcgJXIyMCwwKCVyMTkpCitMJDAwMDEKKwlsZG8gNjQoJXIzKSwlcjMwCisJbGR3bSAtNjQoJXIzMCksJXIzCisJYnYsbiAlcjAoJXIyKQorCS5FWElUCisJLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiMjM2YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwCkBAIC0wLDAgKzEsNjc5IEBACisjIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKKyMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKKyMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgorCitwcm9jIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3Qge30geworICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnLnM6IFRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIGZvciBCTEUgKHBhcnQgMikiCisgICAgc2V0IHggMAorCisgICAgaWYgW2dhc190ZXN0X29sZCAiYmxlYnVnLnMiICIiICJQcm9wZXIgcmVsb2NhdGlvbiBmb3IgQkxFIChwYXJ0IDEpIl0gdGhlbiB7CisJb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCisKKyAgICAgICAgaWYgIVtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKKwkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAorCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCisJICAgIHdoaWxlIDEgeworCQlleHBlY3QgeworCQkgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKkFCU19DQUxMXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KKwkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkJICAgIGVvZgkJCQl7IGJyZWFrIH0KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgIyBBdCBvbmUgdGltZSBib3RoIHZlcnNpb25zIG9mIHRoZSBhc3NlbWJsZXIgd291bGQgaW5jb3JyZWN0bHkgdXNlIAorCSAgICAjIGEgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiBmb3IgYSBCTEUgaW5zdHJ1Y3Rpb24uCisJICAgIHdoaWxlIDEgeworCQlleHBlY3QgeworCQkgICAgLXJlICJeMDAwMDAwMDBcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCXsgc2V0IHggMSB9CisJCSAgICAtcmUgIl4wMDAwMDAwNFxbXlxuXF0qRElSMTdSXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KKwkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkJICAgIGVvZgkJCQl7IGJyZWFrIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIG9iamR1bXBfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fcmVsb2NhdGlvbl9yZWR1Y3Rpb25fdGVzdHMge30geworICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlLnM6IFRlc3QgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZS5zIiAiIiAiUmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKKworCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHJlbG9jYXRpb25zIGludm9sdmluZyBwcm9jZWR1cmUgbGFiZWxzIAorCSMgYXJlIG5vdCByZWR1Y2VkIHRvIGEgcmVsb2NhdGlvbiBpbnZvbHZpbmcgc29tZSBvdGhlciBzeW1ib2wuCisJIyBEb2luZyBzbyBtYWtlcyBnZW5lcmF0aW5nIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGltcG9zc2libGUuCisJd2hpbGUgMSB7CisJICAgIGV4cGVjdCB7CisJCS1yZSAiXjAwMDAwMDA0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJeMDAwMDAwMTRcW15cblxdKlBDUkVMXFteXG5cXSpmb29cW15cblxdKlxuIgorCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJCS1yZSAiXFteXG5cXSpcbiIJCXsgfQorCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJCWVvZgkJCQl7IGJyZWFrIH0KKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgb2JqZHVtcF9maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKworICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMi5zOiBNb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9uIHRlc3RzIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTIucyIgIiIgIk1vcmUgcmVsb2NhdG9pbiAgcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7CisJb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCisKKwkjIENoZWNrIHRvIG1ha2Ugc3VyZSBETFQgcmVsYXRpdmUgcmVsb2NzIGFyZSBub3QgcmVkdWNlZCB0byBzeW0rYWRkZW5kCisJIyBEb2luZyBzbyBkb2Vzbid0IHdvcmsgYXMgb25lIG1pZ2h0IGV4cGVjdAorCXdoaWxlIDEgeworCSAgICBleHBlY3QgeworCQktcmUgIl4wMDAwMDAwNFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCQktcmUgIl4wMDAwMDAxY1xbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAwXFteXG5cXSpcbiIKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCQktcmUgIl4wMDAwMDAzMFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCQktcmUgIl4wMDAwMDA0OFxbXlxuXF0qRExUXFteXG5cXSpMLkMwMDAxXFteXG5cXSpcbiIKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCQktcmUgIlxbXlxuXF0qXG4iCQl7IH0KKwkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCQllb2YJCQkJeyBicmVhayB9CisgICAgICAgICAgICB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIG9iamR1bXBfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisKKyAgICBzZXQgdGVzdG5hbWUgInJlZHVjZTMuczogVGVzdCBldmVuIG1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlZHVjZTMucyIgIiIgIkV2ZW4gbW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQxKSJdIHRoZW4geworCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgorCisJIyBDaGVjayB0byBtYWtlIHN1cmUgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHByb2NlZHVyZSBsYWJlbHMgCisJIyBhcmUgbm90IHJlZHVjZWQgdG8gYSByZWxvY2F0aW9uIGludm9sdmluZyBzb21lIG90aGVyIHN5bWJvbC4KKwkjIERvaW5nIHNvIG1ha2VzIGdlbmVyYXRpbmcgcGFyYW1ldGVyIHJlbG9jYXRpb24gc3R1YnMgaW1wb3NzaWJsZS4KKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkJLXJlICJeMDAwMDAwMGNcW15cblxdKnlhYmJhXFteXG5cK1xdKlxuIgorCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJCS1yZSAiXjAwMDAwMDBjXFteXG5cXSp5YWJiYVwrXFteXG5cXSpcbiIKKwkJICAgIHsgc2V0IHggMDsgYnJlYWsgfQorCQktcmUgIl4wMDAwMDAxMFxbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJeMDAwMDAwMTBcW15cblxdKnlhYmJhXCtcW15cblxdKlxuIgorCQkgICAgeyBzZXQgeCAwOyBicmVhayB9CisJCS1yZSAiXFteXG5cXSpcbiIJCXsgfQorCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJCWVvZgkJCQl7IGJyZWFrIH0KKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgb2JqZHVtcF9maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19ibGVfbW9kZV9zZWxlY3Rvcl90ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJsZWJ1ZzIuczogYmxlYnVnMiIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImJsZWJ1ZzIucyIgIi1hbCIKKworICAgICMgR0FTIHVzZXMgdG9vIG1hbnkgYml0cyBvbiB0aGUgQkxFIGluc3RydWN0aW9uLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMDIwMjgwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTQyMEUwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fYmxlX3JlbG9jYXRpb25fdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJibGVidWczLnM6IGJsZWJ1ZzMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJibGVidWczLnMiICItYWwiCisKKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTQwMDIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJwbGFiZWxidWcuczogT2xkIGdhcy0xLjM2IHBsYWJlbCBidWcgKHBhcnQgMikiCisgICAgc2V0IHggMAorCisgICAgaWYgW2dhc190ZXN0X29sZCAicGxhYmVsYnVnLnMiICIiICJPbGQgZ2FzLTEuMzYgcGxhYmVsIGJ1ZyAocGFydCAxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKKworCSMgQ2hlY2sgdGhhdCB3ZSBtYWtlIFBMQUJFTCByZWxvY2F0aW9uIGVudHJpZXMgd2hlbiB0aGV5J3JlIG5lZWRlZC4KKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkJLXJlICJeMDAwMDAwMDBcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJeMDAwMDAwMDRcW15cblxdKlBMQUJFTFxbXlxuXF0qXG4iCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJcW15cblxdKlxuIgkJCXsgfQorCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJCWVvZgkJCQl7IGJyZWFrIH0KKyAgICAJICAgIH0KKwl9CisKKwkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKwkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKwlvYmpkdW1wX2ZpbmlzaAorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorICAgIH0KK30KKworcHJvYyBkb19zZWxlY3Rvcl9zY29wZV90ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInNlbGVjdG9yYnVnLnM6IFRlc3Qgc2NvcGUgb2YgZmllbGQgc2VsZWN0b3IiIAorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInNlbGVjdG9yYnVnLnMiICIiICJUZXN0IHNjb3BlIG9mIGZpZWxkIHNlbGVjdG9yIChwYXJ0IDEpIl0geworCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgorCisJIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHJlbG9jYXRpb24gZW50cnkgYWZ0ZXIgdGhlIHBsYWJlbCBpcyBjb3JyZWN0LgorCSMgSWYgYW4gb2xkIGZpZWxkIHNlbGVjdG9yIHdhcyBpbmNvcnJlY3RseSAiY2FycmllZCIgb3ZlciwgdGhlbiAKKwkjIHRoaXMgdGVzdCB3aWxsIGZhaWwuCisgICAgICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKKwkgICAgd2hpbGUgMSB7CisJCWV4cGVjdCB7CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKkRJUjMyXFteXG5cXSpcbiIKKwkJCXsgc2V0IHggMSB9CisJCSAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qUExBQkVMXFteXG5cXSpmb29cW15cblxdKlxuIgorCQkJeyBzZXQgeCAwIH0KKwkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KKwkgICAgICAgICAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgICAgICAgICBlb2YJCQkJeyBicmVhayB9CisJCX0KKyAgICAgICAgICAgIH0KKwl9IGVsc2UgeworCSAgICB3aGlsZSAxIHsKKwkJZXhwZWN0IHsKKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qREFUQV9PTkVcW15cblxdKlxuIgorCQkJeyBzZXQgeCAxIH0KKwkJICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCisJCQl7IHNldCB4IDAgfQorCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQorCSAgICAgICAgICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICAgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KKwkJfQorICAgICAgICAgICAgfQorCX0KKworCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorCW9iamR1bXBfZmluaXNoCisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisgICAgfQorfQorCitwcm9jIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJsYWJlbG9wYnVnLnM6IFRlc3QgbG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAobm9uLWJyYW5jaGluZykiCisgICAgc2V0IHggMAorCisgICAgaWYgW2dhc190ZXN0X29sZCAibGFiZWxvcGJ1Zy5zIiAiIiAiTG9jYWwgbGFiZWwgYXMgb3BlcmFuZCAocGFydCAxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKKworCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhbmRsZSBkaWZmZXJlbmNlIG9mIGxvY2FsIGxhYmxlcyBhcyBhbiBvcGVyYW5kCisJIyB0byBhIG5vbi1icmFuY2hpbmcgaW5zdHJ1Y3Rpb24gY29ycmVjdGx5LgorCXdoaWxlIDEgeworCSAgICBleHBlY3QgeworCSAgICAgICAgLXJlICJeMDAwMDAwMmNcW15cblxdKjB4MDAwMDAwMjRcW15cblxdKlxuIiAKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgLXJlICJeMDAwMDAwMzBcW15cblxdKjB4MDAwMDAwMjRcW15cblxdKlxuIiAKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9CisJICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgICAgICBlb2YJCQkJeyBicmVhayB9CisgICAgICAgICAgICB9CisJfQorCisJIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisJIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisJb2JqZHVtcF9maW5pc2gKKworCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKwlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKyAgICB9Cit9CisKK3Byb2MgZG9fZXhpdF9yZWxvY2F0aW9uX3Rlc3Qge30geworICAgIHNldCB0ZXN0bmFtZSAiZXhpdGJ1Zy5zOiBUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAyKSIKKyAgICBzZXQgeCAwCisKKyAgICAjIEVsZiAob3NmKSBkb2VzIG5vdCB1c2UgRU5UUlkvRVhJVCByZWxvY2F0aW9ucy4KKyAgICAjIEkgZ3Vlc3Mgd2UgY291bGQgbG9vayBhdCB0aGUgdW53aW5kIHN1YnNwYWNlcyBpdCBidWlsZHMuLi4KKyAgICAjIFVudGlsIHRoZW4sIG1ha2Ugc3VyZSBpdCBzdGlsbCBhc3NlbWJsZXMuCisgICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4geworCWdhc190ZXN0X29sZCAiZXhpdGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMSkiCisJcmV0dXJuOworICAgIH0KKworICAgIGlmIFtnYXNfdGVzdF9vbGQgImV4aXRidWcucyIgIiIgIlRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDEpIl0geworCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgorCisJIyBOb3RlIHRoYXQgYSBtYXRjaCBoZXJlIGlzIHJlYWxseSBhIEZBSUxVUkUhCisJd2hpbGUgMSB7CisJICAgIGV4cGVjdCB7CisJICAgICAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qUl9FWElUXFteXG5cXSpcbiIgCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQorCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQorICAgICAgICAgICAgfQorCX0KKworCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorCW9iamR1bXBfZmluaXNoCisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisgICAgfQorfQorCitwcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMikiCisgICAgc2V0IHggMAorCisgICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCisgICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4geworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmaXh1cGJ1Zy5zIiAiIiAiVGVzdCBjcm9zcyBzcGFjZSBqdW1wL2NhbGwgZml4dXAgYnVnIChwYXJ0IDEpIl0geworCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgorCisJIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGZpeHVwL3JlbG9jYXRpb24gZm9yIHRoZSBjcm9zcy1zcGFjZQorCSMgYnJhbmNoL2NhbGwKKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpQQ1JFTF9DQUxMXFteXG5cXSpcbiIgCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQorCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQorICAgICAgICAgICAgfQorCX0KKworCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorCW9iamR1bXBfZmluaXNoCisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisgICAgfQorfQorCitwcm9jIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmaXh1cGJ1Zy5zOiBUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMykiCisgICAgc2V0IHggMAorCisgICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCisgICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4geworCXJldHVybjsKKyAgICB9CisKKyAgICBnYXNfc3RhcnQgImZpeHVwYnVnLnMiICItYWwiCisKKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTgwMDAwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fcm91bmRfbW9kZV90ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInJvdW5kbW9kZS5zOiBUZXN0IHN3aXRjaGluZyBvZiByb3VuZGluZyBtb2RlcyAocGFydCAyKSIKKyAgICBzZXQgeCAwCisKKyAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJyb3VuZG1vZGUucyIgIiIgIlRlc3Qgc3dpdGNoIG9mIHJvdW5kaW5nIG1vZGVzKHBhcnQgMSkiXSB7CisJb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCisKKwkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGNvcnJlY3QgcmVsb2NhdGlvbnMgdG8gc3dpdGNoIHJvdW5kaW5nIG1vZGVzLgorCSMgQWxzbyBtYWtlIHN1cmUgKGZvciBTT00pIHRoYXQgcmVkdW5kYW50IHJvdW5kaW5nIG1vZGUgcmVsb2NhdGlvbnMKKwkjIHdlcmUgZWxpbWluYXRlZC4KKwlpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7CisJICAgIHdoaWxlIDEgeworCQlleHBlY3QgeworCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMDhcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCisJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwY1xbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCisJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxMFxbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIKKwkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKKwkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE4XFteXG5cXSpESVIyMUxcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMWNcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9CisJICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgICAgICBlb2YJCQkJeyBicmVhayB9CisJCX0KKyAgICAgICAgICAgIH0KKwl9IGVsc2UgeworCSAgICB3aGlsZSAxIHsKKwkJZXhwZWN0IHsKKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMDRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCisJCQl7IGZhaWwgJHRlc3RuYW1lIH0KKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwOFxbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMGNcW15cblxdKlJfTl9NT0RFXFteXG5cXSpcbiIgCisJCQl7IGZhaWwgJHRlc3RuYW1lIH0KKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxMFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKlJfUl9NT0RFXFteXG5cXSpcbiIgCisJCQl7IGZhaWwgJHRlc3RuYW1lIH0KKwkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxY1xbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKKwkJCXsgZmFpbCAkdGVzdG5hbWUgfQorCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQorCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQorCQl9CisJICAgIH0KKwl9CisKKwkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKwkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKwlvYmpkdW1wX2ZpbmlzaAorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKKwkgICAgaWYgW2V4cHIgJHg9PThdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisJfSBlbHNlIHsKKwkgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisJfQorICAgIH0KK30KKworcHJvYyBkb19mdW5jdGlvbl9yZWxvY19idWcge30geworICAgIHNldCB0ZXN0bmFtZSAiZnVuY3JlbG9jYnVnLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAyKSIKKyAgICBzZXQgeCAwCisKKyAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJmdW5jcmVsb2NidWcucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydCAxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKKworCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCisJIyBicmFuY2gvY2FsbAorCXdoaWxlIDEgeworCSAgICBleHBlY3QgeworCSAgICAgICAgLXJlICJeMDAwMDAwY2NcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgLXJlICJeMDAwMDAwZDBcW15cblxdKmYyX19fNFxbXlxuK1xdKlxuIiAgCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQorCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQorICAgICAgICAgICAgfQorCX0KKworCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorCW9iamR1bXBfZmluaXNoCisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisKKwlzZXQgdGVzdG5hbWUgImZ1bmNyZWxvY2J1Zy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gbm9uLXBsYWJlbCBmdW5jdGlvbiByZWZlcmVuY2UgKHBhcnQzKSIKKwlzZXQgeCAwCisKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCisJIyBNYWtlIHN1cmUgd2UgZGlkbid0IHB1dCBhbnl0aGluZyBpbiB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmIQorCXdoaWxlIDEgeworCSAgICBleHBlY3QgeworCSAgICAgICAgLXJlICJeMDAwMDAwY2NcW15cblxdKmxkaWwgMCxyMjBcW15cblxdKlxuIiAKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgLXJlICJeMDAwMDAwZDBcW15cblxdKmxkbyAwXFtcKFxdK3IyMFxbXClcXSsscjE5XFteXG5cXSpcbiIgCisJCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQorCSAgICAgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQorCSAgICB9CisJfQorCisJIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisJIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisJb2JqZHVtcF9maW5pc2gKKworCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKwlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKyAgICB9CisKK30KKworcHJvYyBkb19yX25vX3JlbG9jIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInJfbm9fcmVsb2MuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIDQtYnl0ZSBSX05PX1JFTENPQVRJT04gZml4dXBzIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInJfbm9fcmVsb2MucyIgIiIgIlRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiA0LWJ5dGUgUl9OT19SRUxPQ0FUSU9OIGZpeHVwcyAocGFydCAxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKKworCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgYSBjb3JyZWN0IHJlbG9jYXRpb24gZm9yIHRoZSByZWZlcmVuY2UuCisJd2hpbGUgMSB7CisJICAgIGV4cGVjdCB7CisJICAgICAgICAtcmUgIl4wMDBjMDAwNFxbXlxuXF0qUExBQkVMXFteXG5dKmdcW15cblxdKlxuIiAKKwkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9CisJICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgICAgICBlb2YJCQkJeyBicmVhayB9CisgICAgICAgICAgICB9CisJfQorCisJIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisJIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisJb2JqZHVtcF9maW5pc2gKKworCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKwlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKworICAgIH0KK30KKworcHJvYyBkb19waWNfcmVsb2NhdGlvbl90ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInBpY3JlbG9jLnM6IFRlc3QgZm9yIHByb3BlciBQSUMgcmVsb2NhdGlvbiAocGFydCAyKSIKKyAgICBzZXQgeCAwCisKKyAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KKyAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7CisJcmV0dXJuOworICAgIH0KKworICAgIGdhc19zdGFydCAicGljcmVsb2MucyIgIi1hbCIKKworICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19hcHBseV90ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImFwcGx5YnVnLnM6IFRlc3QgZm9yIHByb3BlciBmaXh1cCBhcHBsaWF0aW9uIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgICMgRUxGIChvc2YpIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSBleHRyYSBzZWN0aW9ucyB0b28gd2VsbC4uLgorICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKKwlyZXR1cm47CisgICAgfQorCisgICAgZ2FzX3N0YXJ0ICJhcHBseWJ1Zy5zIiAiLWFsIgorCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CitpZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKKyAgICAjIE1ha2Ugc3VyZSB3ZSBwdXQgdGhlIHJpZ2h0IHJlbG9jYXRpb24gZW50cnkgb24gYSBCTEUgaW5zdHJ1Y3Rpb24uCisgICAgZG9fYmxlX3JlbG9jYXRpb25fdGVzdAorCisgICAgIyBNYWtlIHN1cmUgcmVsb2NhdGlvbiByZWR1Y3Rpb25zIGFyZSBub3QgdG9vIGFncmVzc2l2ZSBhYm91dAorICAgICMgYWRqdXN0aW5nIHJlbG9jYXRpb25zIGFnYWluc3Qgc29tZSBzeW1ib2xzLgorICAgIGRvX3JlbG9jYXRpb25fcmVkdWN0aW9uX3Rlc3RzCisKKyAgICAjIENoZWNrIHRoYXQgbW9kZSBzZWxlY3RvcnMgb24gYSBibGUgaW5zdHJ1Y3Rpb24gYWN0dWFsbHkgd29yay4KKyAgICBkb19ibGVfbW9kZV9zZWxlY3Rvcl90ZXN0CisKKyAgICAjIENoZWNrIHRoYXQgd2UgdGFrZSB0aGUgLTggYWRqdXN0bWVudCBpbnRvIGFjY291bnQgd2hlbiB6ZXJvaW5nCisgICAgIyBvdXQgdGhlIGRpc3BsYWNlbWVudCBmaWVsZCBpbiBhIGJsZSBpbnN0cnVjdGlvbiB3aXRoIGEgcmVsb2MKKyAgICBkb19ibGVfcmVsb2NhdGlvbl90ZXN0CisKKyAgICAjIDEuMzYgc2ltcGx5IGRpZG4ndCBnZW5lcmF0ZSBhbGwgdGhlIHBsYWJlbHMgaXQgc2hvdWxkIGhhdmUuICBNYWtlCisgICAgIyBzdXJlIGdhcy0yIGRvZXMuCisgICAgZG9fcGxhYmVsX3JlbG9jYXRpb25fdGVzdAorCisgICAgIyBNYWtlIHN1cmUgYSBmaWVsZCBzZWxlY3RvciBvbmx5IGVmZmVjdHMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KKyAgICAjIG9yIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgICAgZG9fc2VsZWN0b3Jfc2NvcGVfdGVzdAorCisgICAgIyBUaGlzIHNob3VsZCByZWFsbHkgZ2VuZXJhdGUgYSByZWxvY2F0aW9uLiAgSXQgd291bGQgbWFrZSBsaWZlIG11Y2gKKyAgICAjIGVhc2llciBvbiB0aGUgb3B0aW1pemluZyBsaW5rZXIuICBVbnRpbCB0aGVuIGp1c3QgbWFrZSBzdXJlIHRoZSAKKyAgICAjIGRpZmZlcmVuY2UgaXMgY29tcHV0ZWQgY29ycmVjdGx5LgorICAgIGRvX2xvY2FsX2xhYmVsX2FzX29wZXJhbmRfdGVzdAorCisgICAgIyBHQVMyIGluY29ycmVjdGx5IGdlbmVyYXRlZCBSX0VYSVQgcmVsb2NhdGlvbnMgd2hlbiAuZXhpdCBkaXJlY3RpdmVzCisgICAgIyB3ZXJlIG5vdCBpbiB0aGUgc291cmNlIGNvZGUuCisgICAgZG9fZXhpdF9yZWxvY2F0aW9uX3Rlc3QKKworICAgICMgR0FTMiBpbmNvcnJlY3RseSB0aG91Z2h0IGl0IGNvdWxkIGFwcGx5IGEgZml4dXAgZm9yIGEgcGMtcmVsYXRpdmUKKyAgICAjIGJyYW5jaC9jYWxsIHdoaWNoIGNyb3NzZWQgZGlmZmVyZW50IHN1YnNwYWNlcy4KKyAgICAjIEFsc28gY2hlY2sgdGhhdCB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGlzIGNvcnJlY3QKKyAgICBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzEKKyAgICBkb19jcm9zc19zcGFjZV9maXh1cF90ZXN0XzIKKworICAgICMgTWFrZSBzdXJlIHdlIHN3aXRjaCByb3VuZGluZyBtb2RlcyBjb3JyZWN0bHkKKyAgICBkb19yb3VuZF9tb2RlX3Rlc3QKKworICAgICMgVGVzdCBmb3IgYSBidWcgZm91bmQgd2hlbiBhIGZ1bmN0aW9uIHdhcyB1c2VkIGluIGEgbm9uLWJyYW5jaGluZworICAgICMgaW5zdHJ1Y3Rpb24gKndpdGhvdXQqIGEgcGxhYmVsIChmb3IgcG9ydGFibGUgcnVudGltZSBtb2RlbCkKKyAgICBkb19mdW5jdGlvbl9yZWxvY19idWcKKworICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LW9uZSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mIDQtYnl0ZSBSX05PX1JFTE9DQVRJT04KKyAgICAjIGZpeHVwcy4KKyAgICBkb19yX25vX3JlbG9jCisKKyAgICAjIFRlc3QgYSByZWxvY2F0aW9uIHByb2JsZW0gd2hpY2ggc2hvd3MgdXAgd2hlbiBidWlsZGluZyBzaGFyZWQKKyAgICAjIGxpYnJhcmllcyBpbiBTT00KKyAgICBkb19waWNfcmVsb2NhdGlvbl90ZXN0CisKKyAgICAjIFRlc3QgYSBwcm9ibGVtIHdpdGggbWRfYXBwbHlfZml4IHRoYXQgd2FzIGludHJvZHVjZWQgd2hlbiBmaXhpbmcKKyAgICAjIHRoZSBwaWMgcmVsb2NhdGlvbiB0ZXN0LgorICAgIGRvX2FwcGx5X3Rlc3QKKworICAgICMgTWFrZSBzdXJlIGdhcyBkb2Vzbid0IHJlc29sdmUgbG9uZy1jYWxscyB3aGljaCBhcmUgdG8gYmUgZml4ZWQKKyAgICAjIGJ5IHRoZSBsaW5rZXIKKyAgICBnYXNfdGVzdCAibG9uZ2NhbGwucyIgIiIgIiIgIkF2b2lkIHJlc29sdmluZyBsb25nLWNhbGxzIgorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4N2U2MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnMKQEAgLTAsMCArMSwyMyBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisJLklNUE9SVCBmb28sZGF0YQorCis7IFN3aXRjaCBpbi9vdXQgb2YgZGlmZmVyZW50IHJvdW5kaW5nIG1vZGVzLgorOyBBbHNvIG1ha2Ugc3VyZSB3ZSAib3B0aW1pemUiIGF3YXkgdXNlbGVzcyByb3VuZGluZyBtb2RlIHJlbG9jYXRpb25zCisJYWRkaWwgICBMUidmb28tMHgxMjM0NSwlcjI3CisJbGRvCVJSJ2Zvby0weDEyMzQ1KCVyMSksJXIxCisJYWRkaWwgICBMJ2Zvby0weDEyMzQ1LCVyMjcKKwlsZG8JUidmb28tMHgxMjM0NSglcjEpLCVyMQorCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNworCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQorCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNworCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjVkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3NlbGVjdG9yYnVnLnMKQEAgLTAsMCArMSwyOCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLkVYUE9SVCBpbnRWZWNfZXJyb3JfaGFuZGxlcixEQVRBCisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKK2ludFZlY19lcnJvcl9oYW5kbGVyOgorCS53b3JkIFAlZGVmYXVsdF9pbnRWZWNfZXJyb3JfaGFuZGxlcl9fRlBDYworCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRDT0RFJAorCisJLmFsaWduIDQKKwkuRVhQT1JUIGZvbyxDT0RFCisJLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MworZm9vOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTAKKwkuRU5UUlkKKwkuc3RhYmQgNjgsMCw0MQorCS5FWElUCisJLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ24zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDI0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zCkBAIC0wLDAgKzEsMjAgQEAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKworCS5ibG9ja3ogNAorCittYWluOgorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJAorCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT0wCisJLkVOVFJZCisJbm9wCisJLkVYSVQKKwkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyZjk5YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYWxpZ240LnMKQEAgLTAsMCArMSw0IEBACisJLnNwYWNlICRURVhUJAorCS5zdWJzcGEgJFlBQkJBJAorCS5zdWJzcGEgJE1JTExJQ09ERSQKKwkuYWxpZ24gNjQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU1YzdlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9icmxlbmJ1Zy5zCkBAIC0wLDAgKzEsMzUwMiBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gNAorZG9uZV9fXzIKKwkud29yZCAwCisJLklNUE9SVCBtZW1zZXQsQ09ERQorCS5FWFBPUlQgcmVfc3ludGF4X29wdGlvbnMsREFUQQorCS5hbGlnbiA0CityZV9zeW50YXhfb3B0aW9ucworCS53b3JkIDAKKwkuU1BBQ0UgJFBSSVZBVEUkCisJLlNVQlNQQSAkREFUQSQKKworCS5hbGlnbiA0CityZV9lcnJvcl9tc2cKKwkud29yZCAwCisJLndvcmQgTCRDMDAwMAorCS53b3JkIEwkQzAwMDEKKwkud29yZCBMJEMwMDAyCisJLndvcmQgTCRDMDAwMworCS53b3JkIEwkQzAwMDQKKwkud29yZCBMJEMwMDA1CisJLndvcmQgTCRDMDAwNgorCS53b3JkIEwkQzAwMDcKKwkud29yZCBMJEMwMDA4CisJLndvcmQgTCRDMDAwOQorCS53b3JkIEwkQzAwMTAKKwkud29yZCBMJEMwMDExCisJLndvcmQgTCRDMDAxMgorCS53b3JkIEwkQzAwMTMKKwkud29yZCBMJEMwMDE0CisJLndvcmQgTCRDMDAxNQorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkCisKKwkuYWxpZ24gNAorTCRDMDAxNQorCS5TVFJJTkcgIlVubWF0Y2hlZCApIG9yIFxcKVx4MDAiCisJLmFsaWduIDQKK0wkQzAwMTQKKwkuU1RSSU5HICJSZWd1bGFyIGV4cHJlc3Npb24gdG9vIGJpZ1x4MDAiCisJLmFsaWduIDQKK0wkQzAwMTMKKwkuU1RSSU5HICJQcmVtYXR1cmUgZW5kIG9mIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCisJLmFsaWduIDQKK0wkQzAwMTIKKwkuU1RSSU5HICJJbnZhbGlkIHByZWNlZGluZyByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgorCS5hbGlnbiA0CitMJEMwMDExCisJLlNUUklORyAiTWVtb3J5IGV4aGF1c3RlZFx4MDAiCisJLmFsaWduIDQKK0wkQzAwMTAKKwkuU1RSSU5HICJJbnZhbGlkIHJhbmdlIGVuZFx4MDAiCisJLmFsaWduIDQKK0wkQzAwMDkKKwkuU1RSSU5HICJJbnZhbGlkIGNvbnRlbnQgb2YgXFx7XFx9XHgwMCIKKwkuYWxpZ24gNAorTCRDMDAwOAorCS5TVFJJTkcgIlVubWF0Y2hlZCBcXHtceDAwIgorCS5hbGlnbiA0CitMJEMwMDA3CisJLlNUUklORyAiVW5tYXRjaGVkICggb3IgXFwoXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAwNgorCS5TVFJJTkcgIlVubWF0Y2hlZCBbIG9yIFteXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAwNQorCS5TVFJJTkcgIkludmFsaWQgYmFjayByZWZlcmVuY2VceDAwIgorCS5hbGlnbiA0CitMJEMwMDA0CisJLlNUUklORyAiVHJhaWxpbmcgYmFja3NsYXNoXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAwMworCS5TVFJJTkcgIkludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWVceDAwIgorCS5hbGlnbiA0CitMJEMwMDAyCisJLlNUUklORyAiSW52YWxpZCBjb2xsYXRpb24gY2hhcmFjdGVyXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAwMQorCS5TVFJJTkcgIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAwMAorCS5TVFJJTkcgIk5vIG1hdGNoXHgwMCIKKwkuRVhQT1JUIHJlX21heF9mYWlsdXJlcyxEQVRBCisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gNAorcmVfbWF4X2ZhaWx1cmVzCisJLndvcmQgMjAwMAorCS5JTVBPUlQgbWFsbG9jLENPREUKKwkuSU1QT1JUIHJlYWxsb2MsQ09ERQorCS5JTVBPUlQgZnJlZSxDT0RFCisJLklNUE9SVCBzdHJjbXAsQ09ERQorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkCisKKwkuYWxpZ24gNAorTCRDMDAxNgorCS5TVFJJTkcgImFsbnVtXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAxNworCS5TVFJJTkcgImFscGhhXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAxOAorCS5TVFJJTkcgImJsYW5rXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAxOQorCS5TVFJJTkcgImNudHJsXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyMAorCS5TVFJJTkcgImRpZ2l0XHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyMQorCS5TVFJJTkcgImdyYXBoXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyMgorCS5TVFJJTkcgImxvd2VyXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyMworCS5TVFJJTkcgInByaW50XHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyNAorCS5TVFJJTkcgInB1bmN0XHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyNQorCS5TVFJJTkcgInNwYWNlXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyNgorCS5TVFJJTkcgInVwcGVyXHgwMCIKKwkuYWxpZ24gNAorTCRDMDAyNworCS5TVFJJTkcgInhkaWdpdFx4MDAiCisJLklNUE9SVCBfX2FsbnVtLERBVEEKKwkuSU1QT1JUIF9fY3R5cGUyLERBVEEKKwkuSU1QT1JUIF9fY3R5cGUsREFUQQorCS5JTVBPUlQgYXRfYmVnbGluZV9sb2NfcCxDT0RFCisJLklNUE9SVCBhdF9lbmRsaW5lX2xvY19wLENPREUKKwkuSU1QT1JUIHN0b3JlX29wMSxDT0RFCisJLklNUE9SVCBpbnNlcnRfb3AxLENPREUKKwkuSU1QT1JUIHN0b3JlX29wMixDT0RFCisJLklNUE9SVCBpbnNlcnRfb3AyLENPREUKKwkuSU1QT1JUIGNvbXBpbGVfcmFuZ2UsQ09ERQorCS5JTVBPUlQgZ3JvdXBfaW5fY29tcGlsZV9zdGFjayxDT0RFCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorcmVnZXhfY29tcGlsZQorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTMyMCxDQUxMUyxTQVZFX1JQLEVOVFJZX0dSPTE4CisJLkVOVFJZCisJc3R3ICVyMiwtMjAoJXIzMCkgOyMgODk4OSByZWxvYWRfb3V0c2krMi82CisJbGRvIDMyMCglcjMwKSwlcjMwIDsjIDg5OTEgYWRkc2kzLzIKKwlzdHcgJXIxOCwtMTY4KCVyMzApIDsjIDg5OTMgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjE3LC0xNjQoJXIzMCkgOyMgODk5NSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMTYsLTE2MCglcjMwKSA7IyA4OTk3IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIxNSwtMTU2KCVyMzApIDsjIDg5OTkgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjE0LC0xNTIoJXIzMCkgOyMgOTAwMSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMTMsLTE0OCglcjMwKSA7IyA5MDAzIHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIxMiwtMTQ0KCVyMzApIDsjIDkwMDUgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjExLC0xNDAoJXIzMCkgOyMgOTAwNyByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMTAsLTEzNiglcjMwKSA7IyA5MDA5IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXI5LC0xMzIoJXIzMCkgOyMgOTAxMSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyOCwtMTI4KCVyMzApIDsjIDkwMTMgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjcsLTEyNCglcjMwKSA7IyA5MDE1IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXI2LC0xMjAoJXIzMCkgOyMgOTAxNyByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyNSwtMTE2KCVyMzApIDsjIDkwMTkgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjQsLTExMiglcjMwKSA7IyA5MDIxIHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIzLC0xMDgoJXIzMCkgOyMgOTAyMyByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMjYsLTI3NiglcjMwKSA7IyA0IHJlbG9hZF9vdXRzaSsyLzYKKwlsZGkgMCwlcjkgOyMgMjUgcmVsb2FkX291dHNpKzIvMgorCWxkaSAwLCVyOCA7IyAyOCByZWxvYWRfb3V0c2krMi8yCisJc3R3ICVyMCwtMjYwKCVyMzApIDsjIDM0IHJlbG9hZF9vdXRzaSsyLzYKKwlsZGkgMCwlcjEwIDsjIDMxIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgNjQwLCVyMjYgOyMgMzcgcmVsb2FkX291dHNpKzIvMgorCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4Nzc0IHJlbG9hZF9vdXRzaSsyLzUKKwljb3B5ICVyMjQsJXIxNSA7IyA4IHJlbG9hZF9vdXRzaSsyLzEKKwlzdHcgJXIxLC0yOTYoJXIzMCkgOyMgMjMyNSByZWxvYWRfb3V0c2krMi82CisJY29weSAlcjIzLCVyNSA7IyAxMCByZWxvYWRfb3V0c2krMi8xCisJYWRkbCAlcjEsJXIyNSwlcjE2IDsjIDE5IGFkZHNpMy8xCisJLkNBTEwgQVJHVzA9R1IKKwlibCBtYWxsb2MsJXIyIDsjIDM5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDIwKCVyNSksJXIxNCA7IyAyMiByZWxvYWRfb3V0c2krMi81CisJY29taWIsPD4gMCwlcjI4LEwkMDAyMSA7IyA0OCBibGV1KzEKKwlzdHcgJXIyOCwtMzEyKCVyMzApIDsjIDQzIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDk1MworCWJsIEwkMDg2NywlcjAgOyMgNTMganVtcAorCWxkaSAxMiwlcjI4IDsjIDUxIHJlbG9hZF9vdXRzaSsyLzIKK0wkMDAyMQorCWxkaSAzMiwlcjE5IDsjIDU4IHJlbG9hZF9vdXRzaSsyLzIKKwlzdHcgJXIxOSwtMzA4KCVyMzApIDsjIDU5IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIwLC0zMDQoJXIzMCkgOyMgNjIgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjE1LDEyKCVyNSkgOyMgNjUgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjAsOCglcjUpIDsjIDg1IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIwLDI0KCVyNSkgOyMgODggcmVsb2FkX291dHNpKzIvNgorCWFkZGlsIExSJ2RvbmVfX18yLSRnbG9iYWwkLCVyMjcgOyMgOTIgcGljMl9sb19zdW0rMQorCWxkdyAyOCglcjUpLCVyMTkgOyMgNjggcmVsb2FkX291dHNpKzIvNQorCWxkdyBSUidkb25lX19fMi0kZ2xvYmFsJCglcjEpLCVyMjAgOyMgOTQgcmVsb2FkX291dHNpKzIvNQorCWRlcGkgMCwzLDEsJXIxOSA7IyA2OSBhbmRzaTMvMgorCWRlcGkgMCw2LDIsJXIxOSA7IyA4MCBhbmRzaTMvMgorCWNvbWliLDw+IDAsJXIyMCxMJDAwMjIgOyMgOTUgYmxldSsxCisJc3R3ICVyMTksMjgoJXI1KSA7IyA4MiByZWxvYWRfb3V0c2krMi82CisJYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgOTkgcGljMl9sb19zdW0rMQorCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjQgOyMgMTAwIG1vdmhpLTIKKwljb3B5ICVyNCwlcjI2IDsjIDEwMSByZWxvYWRfb3V0c2krMi8xCisJbGRpIDAsJXIyNSA7IyAxMDIgcmVsb2FkX291dHNpKzIvMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgbWVtc2V0LCVyMiA7IyAxMDQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZGkgMjU2LCVyMjQgOyMgMTAzIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgMSwlcjIwIDsjIDg3MzIgbW92cWkrMS8yCisJbGRvIDk3KCVyNCksJXIxOSA7IyA4NzM2IGFkZHNpMy8yCisJbGRvIDEyMiglcjQpLCVyNCA7IyA4NzM4IGFkZHNpMy8yCisJc3RicyxtYSAlcjIwLDEoJXIxOSkgOyMgMTE1IG1vdnFpKzEvNgorTCQxMTU1CisJY29tYiw+PSxuICVyNCwlcjE5LEwkMTE1NSA7IyAxMjEgYmxldSsxCisJc3RicyxtYSAlcjIwLDEoJXIxOSkgOyMgMTE1IG1vdnFpKzEvNgorCWxkaSAxLCVyMjEgOyMgODcxNyBtb3ZxaSsxLzIKKwlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyA4NzEyIHBpYzJfbG9fc3VtKzEKKwlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXIxOSA7IyA4NzE1IG1vdmhpLTIKKwlsZG8gNjUoJXIxOSksJXIyMCA7IyA4NzIxIGFkZHNpMy8yCisJbGRvIDkwKCVyMTkpLCVyMTkgOyMgODcyMyBhZGRzaTMvMgorCXN0YnMsbWEgJXIyMSwxKCVyMjApIDsjIDEzOCBtb3ZxaSsxLzYKK0wkMTE1NgorCWNvbWIsPj0sbiAlcjE5LCVyMjAsTCQxMTU2IDsjIDE0NCBibGV1KzEKKwlzdGJzLG1hICVyMjEsMSglcjIwKSA7IyAxMzggbW92cWkrMS82CisJbGRpIDQ4LCVyMjAgOyMgMTUxIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgNTcsJXIyMiA7IyA3OTc2IHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgMSwlcjIxIDsjIDg3MDcgbW92cWkrMS8yCisJYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKzQ4LCVyMjcgOyMgODcwNSBwaWMyX2xvX3N1bSsxCisJbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCs0OCglcjEpLCVyMTkgOyMgODcxMSBtb3ZoaS0yCitMJDAwMzcKKwlsZG8gMSglcjIwKSwlcjIwIDsjIDE2NCBhZGRzaTMvMgorCWNvbWIsPj0gJXIyMiwlcjIwLEwkMDAzNyA7IyAxNjcgYmxldSsxCisJc3RicyxtYSAlcjIxLDEoJXIxOSkgOyMgMTYxIG1vdnFpKzEvNgorCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDE3NCBwaWMyX2xvX3N1bSsxCisJbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyMTkgOyMgMTc1IG1vdmhpLTIKKwlsZGkgMSwlcjIwIDsjIDE3NiBtb3ZxaSsxLzIKKwlzdGIgJXIyMCw5NSglcjE5KSA7IyAxNzcgbW92cWkrMS82CisJYWRkaWwgTFInZG9uZV9fXzItJGdsb2JhbCQsJXIyNyA7IyAxNzggcGljMl9sb19zdW0rMQorCWxkaSAxLCVyMTkgOyMgMTgwIHJlbG9hZF9vdXRzaSsyLzIKKwlzdHcgJXIxOSxSUidkb25lX19fMi0kZ2xvYmFsJCglcjEpIDsjIDE4MSByZWxvYWRfb3V0c2krMi82CitMJDAwMjIKKwlsZHcgNCglcjUpLCVyMTkgOyMgMTg3IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw8PixuIDAsJXIxOSxMJDAwMzkgOyMgMTg5IGJsZXUrMQorCWxkdyAwKCVyNSksJXIyNiA7IyAxOTMgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0sbiAwLCVyMjYsTCQwMDQwIDsjIDE5NSBibGV1KzEKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDIwNSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkaSAzMiwlcjI1IDsjIDIwMyByZWxvYWRfb3V0c2krMi8yCisJYmwgTCQxMTU3LCVyMCA7IyAyMTEganVtcAorCXN0dyAlcjI4LDAoJXI1KSA7IyAyMjMgcmVsb2FkX291dHNpKzIvNgorTCQwMDQwCisJLkNBTEwgQVJHVzA9R1IKKwlibCBtYWxsb2MsJXIyIDsjIDIxOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkaSAzMiwlcjI2IDsjIDIxNyByZWxvYWRfb3V0c2krMi8yCisJc3R3ICVyMjgsMCglcjUpIDsjIDIyMyByZWxvYWRfb3V0c2krMi82CitMJDExNTcKKwlsZHcgMCglcjUpLCVyMTkgOyMgMjI4IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw8PiAwLCVyMTksTCQwMDQyIDsjIDIzMCBibGV1KzEKKwlsZGkgMzIsJXIxOSA7IyAyNDMgcmVsb2FkX291dHNpKzIvMgorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgMjM0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAyMzIgcmVsb2FkX291dHNpKzIvNQorCWJsIEwkMDg2NywlcjAgOyMgMjM4IGp1bXAKKwlsZGkgMTIsJXIyOCA7IyA1MSByZWxvYWRfb3V0c2krMi8yCitMJDAwNDIKKwlzdHcgJXIxOSw0KCVyNSkgOyMgMjQ0IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDAzOQorCWxkdyAwKCVyNSksJXI2IDsjIDI0OSByZWxvYWRfb3V0c2krMi81CisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyA3OTgxIHJlbG9hZF9vdXRzaSsyLzUKKwljb21jbHIsPD4gJXIxNiwlcjE5LCVyMCA7IyA3OTgyIGJsZXUrMQorCWJsIEwkMDA0NCwlcjAKKwljb3B5ICVyNiwlcjEyIDsjIDI1MyByZWxvYWRfb3V0c2krMi8xCisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyMzM0IHJlbG9hZF9vdXRzaSsyLzUKK0wkMTE3OAorCWxkYnMsbWEgMSglcjE5KSwlcjcgOyMgMjc3IHplcm9fZXh0ZW5kcWlzaTIvMgorCWNvbWliLD0gMCwlcjE0LEwkMDA0NyA7IyAyODIgYmxldSsxCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyMzM3IHJlbG9hZF9vdXRzaSsyLzYKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgMjgzIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXI3IDsjIDI4NiB6ZXJvX2V4dGVuZHFpc2kyLzIKK0wkMDA0NworCWxkbyAtMTAoJXI3KSwlcjE5IDsjIDc4OTUgYWRkc2kzLzIKKwlhZGRpLHV2IC0xMTUsJXIxOSwlcjAgOyMgNzg5NiBjYXNlc2kwCisJYmxyLG4gJXIxOSwlcjAKKwliLG4gTCQwMDc2CitMJDA4NjMKKwlibCBMJDAzNzYsJXIwCisJbm9wIDsjIDkwOTIgc3dpdGNoX2p1bXAKK0wkMDk1NAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTA5NSBzd2l0Y2hfanVtcAorTCQwOTU1CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MDk4IHN3aXRjaF9qdW1wCitMJDA5NTYKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxMDEgc3dpdGNoX2p1bXAKK0wkMDk1NworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTEwNCBzd2l0Y2hfanVtcAorTCQwOTU4CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTA3IHN3aXRjaF9qdW1wCitMJDA5NTkKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxMTAgc3dpdGNoX2p1bXAKK0wkMDk2MAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTExMyBzd2l0Y2hfanVtcAorTCQwOTYxCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTE2IHN3aXRjaF9qdW1wCitMJDA5NjIKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxMTkgc3dpdGNoX2p1bXAKK0wkMDk2MworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTEyMiBzd2l0Y2hfanVtcAorTCQwOTY0CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTI1IHN3aXRjaF9qdW1wCitMJDA5NjUKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxMjggc3dpdGNoX2p1bXAKK0wkMDk2NgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTEzMSBzd2l0Y2hfanVtcAorTCQwOTY3CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTM0IHN3aXRjaF9qdW1wCitMJDA5NjgKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxMzcgc3dpdGNoX2p1bXAKK0wkMDk2OQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTE0MCBzd2l0Y2hfanVtcAorTCQwOTcwCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTQzIHN3aXRjaF9qdW1wCitMJDA5NzEKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxNDYgc3dpdGNoX2p1bXAKK0wkMDk3MgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTE0OSBzd2l0Y2hfanVtcAorTCQwOTczCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTUyIHN3aXRjaF9qdW1wCitMJDA5NzQKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxNTUgc3dpdGNoX2p1bXAKK0wkMDk3NQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTE1OCBzd2l0Y2hfanVtcAorTCQwOTc2CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTYxIHN3aXRjaF9qdW1wCitMJDA5NzcKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxNjQgc3dpdGNoX2p1bXAKK0wkMDk3OAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTE2NyBzd2l0Y2hfanVtcAorTCQwOTc5CisJYmwgTCQwMDc3LCVyMCA7IyA5MTcwIHN3aXRjaF9qdW1wCisJbGR3IC0yOTYoJXIzMCksJXIyNiA7IyAyMzQ5IHJlbG9hZF9vdXRzaSsyLzUKK0wkMDk4MAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTE3MyBzd2l0Y2hfanVtcAorTCQwOTgxCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTc2IHN3aXRjaF9qdW1wCitMJDA5ODIKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkxNzkgc3dpdGNoX2p1bXAKK0wkMDk4MworCWJsIEwkMDM2OCwlcjAKKwlub3AgOyMgOTE4MiBzd2l0Y2hfanVtcAorTCQwOTg0CisJYmwgTCQwMzcyLCVyMAorCW5vcCA7IyA5MTg1IHN3aXRjaF9qdW1wCitMJDA5ODUKKwlibCBMJDAxMDQsJXIwCisJbm9wIDsjIDkxODggc3dpdGNoX2p1bXAKK0wkMDk4NgorCWJsIEwkMTE1OCwlcjAgOyMgOTE5MSBzd2l0Y2hfanVtcAorCWxkaSAxMDI2LCVyMTkgOyMgNjYyIHJlbG9hZF9vdXRzaSsyLzIKK0wkMDk4NworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTE5NCBzd2l0Y2hfanVtcAorTCQwOTg4CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MTk3IHN3aXRjaF9qdW1wCitMJDA5ODkKKwlibCBMJDAxOTYsJXIwIDsjIDkyMDAgc3dpdGNoX2p1bXAKKwlsZHcgMCglcjUpLCVyNCA7IyA4MDI3IHJlbG9hZF9vdXRzaSsyLzUKK0wkMDk5MAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTIwMyBzd2l0Y2hfanVtcAorTCQwOTkxCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjA2IHN3aXRjaF9qdW1wCitMJDA5OTIKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyMDkgc3dpdGNoX2p1bXAKK0wkMDk5MworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTIxMiBzd2l0Y2hfanVtcAorTCQwOTk0CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjE1IHN3aXRjaF9qdW1wCitMJDA5OTUKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyMTggc3dpdGNoX2p1bXAKK0wkMDk5NgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTIyMSBzd2l0Y2hfanVtcAorTCQwOTk3CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjI0IHN3aXRjaF9qdW1wCitMJDA5OTgKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyMjcgc3dpdGNoX2p1bXAKK0wkMDk5OQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTIzMCBzd2l0Y2hfanVtcAorTCQxMDAwCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjMzIHN3aXRjaF9qdW1wCitMJDEwMDEKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyMzYgc3dpdGNoX2p1bXAKK0wkMTAwMgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTIzOSBzd2l0Y2hfanVtcAorTCQxMDAzCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjQyIHN3aXRjaF9qdW1wCitMJDEwMDQKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyNDUgc3dpdGNoX2p1bXAKK0wkMTAwNQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTI0OCBzd2l0Y2hfanVtcAorTCQxMDA2CisJYmwgTCQwMTAxLCVyMCA7IyA5MjUxIHN3aXRjaF9qdW1wCisJbGRpIDEwMjYsJXIxOSA7IyA2NjIgcmVsb2FkX291dHNpKzIvMgorTCQxMDA3CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjU0IHN3aXRjaF9qdW1wCitMJDEwMDgKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyNTcgc3dpdGNoX2p1bXAKK0wkMTAwOQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTI2MCBzd2l0Y2hfanVtcAorTCQxMDEwCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjYzIHN3aXRjaF9qdW1wCitMJDEwMTEKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyNjYgc3dpdGNoX2p1bXAKK0wkMTAxMgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTI2OSBzd2l0Y2hfanVtcAorTCQxMDEzCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjcyIHN3aXRjaF9qdW1wCitMJDEwMTQKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyNzUgc3dpdGNoX2p1bXAKK0wkMTAxNQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTI3OCBzd2l0Y2hfanVtcAorTCQxMDE2CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjgxIHN3aXRjaF9qdW1wCitMJDEwMTcKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyODQgc3dpdGNoX2p1bXAKK0wkMTAxOAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTI4NyBzd2l0Y2hfanVtcAorTCQxMDE5CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MjkwIHN3aXRjaF9qdW1wCitMJDEwMjAKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkyOTMgc3dpdGNoX2p1bXAKK0wkMTAyMQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTI5NiBzd2l0Y2hfanVtcAorTCQxMDIyCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5Mjk5IHN3aXRjaF9qdW1wCitMJDEwMjMKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzMDIgc3dpdGNoX2p1bXAKK0wkMTAyNAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTMwNSBzd2l0Y2hfanVtcAorTCQxMDI1CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MzA4IHN3aXRjaF9qdW1wCitMJDEwMjYKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzMTEgc3dpdGNoX2p1bXAKK0wkMTAyNworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTMxNCBzd2l0Y2hfanVtcAorTCQxMDI4CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MzE3IHN3aXRjaF9qdW1wCitMJDEwMjkKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzMjAgc3dpdGNoX2p1bXAKK0wkMTAzMAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTMyMyBzd2l0Y2hfanVtcAorTCQxMDMxCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MzI2IHN3aXRjaF9qdW1wCitMJDEwMzIKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzMjkgc3dpdGNoX2p1bXAKK0wkMTAzMworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTMzMiBzd2l0Y2hfanVtcAorTCQxMDM0CisJYmwgTCQwMjE2LCVyMCA7IyA5MzM1IHN3aXRjaF9qdW1wCisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDE4IHJlbG9hZF9vdXRzaSsyLzUKK0wkMTAzNQorCWJsIEwkMDM4NywlcjAgOyMgOTMzOCBzd2l0Y2hfanVtcAorCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMzc5NyByZWxvYWRfb3V0c2krMi81CitMJDEwMzYKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzNDEgc3dpdGNoX2p1bXAKK0wkMTAzNworCWJsIEwkMDA1MywlcjAgOyMgOTM0NCBzd2l0Y2hfanVtcAorCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4Nzc3IHJlbG9hZF9vdXRzaSsyLzUKK0wkMTAzOAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTM0NyBzd2l0Y2hfanVtcAorTCQxMDM5CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MzUwIHN3aXRjaF9qdW1wCitMJDEwNDAKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzNTMgc3dpdGNoX2p1bXAKK0wkMTA0MQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTM1NiBzd2l0Y2hfanVtcAorTCQxMDQyCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MzU5IHN3aXRjaF9qdW1wCitMJDEwNDMKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzNjIgc3dpdGNoX2p1bXAKK0wkMTA0NAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTM2NSBzd2l0Y2hfanVtcAorTCQxMDQ1CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5MzY4IHN3aXRjaF9qdW1wCitMJDEwNDYKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzNzEgc3dpdGNoX2p1bXAKK0wkMTA0NworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTM3NCBzd2l0Y2hfanVtcAorTCQxMDQ4CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5Mzc3IHN3aXRjaF9qdW1wCitMJDEwNDkKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzODAgc3dpdGNoX2p1bXAKK0wkMTA1MAorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTM4MyBzd2l0Y2hfanVtcAorTCQxMDUxCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5Mzg2IHN3aXRjaF9qdW1wCitMJDEwNTIKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzODkgc3dpdGNoX2p1bXAKK0wkMTA1MworCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTM5MiBzd2l0Y2hfanVtcAorTCQxMDU0CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5Mzk1IHN3aXRjaF9qdW1wCitMJDEwNTUKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDkzOTggc3dpdGNoX2p1bXAKK0wkMTA1NgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTQwMSBzd2l0Y2hfanVtcAorTCQxMDU3CisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5NDA0IHN3aXRjaF9qdW1wCitMJDEwNTgKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDk0MDcgc3dpdGNoX2p1bXAKK0wkMTA1OQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTQxMCBzd2l0Y2hfanVtcAorTCQxMDYwCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5NDEzIHN3aXRjaF9qdW1wCitMJDEwNjEKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDk0MTYgc3dpdGNoX2p1bXAKK0wkMTA2MgorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTQxOSBzd2l0Y2hfanVtcAorTCQxMDYzCisJYmwgTCQwMDc2LCVyMAorCW5vcCA7IyA5NDIyIHN3aXRjaF9qdW1wCitMJDEwNjQKKwlibCBMJDAwNzYsJXIwCisJbm9wIDsjIDk0MjUgc3dpdGNoX2p1bXAKK0wkMTA2NQorCWJsIEwkMDA3NiwlcjAKKwlub3AgOyMgOTQyOCBzd2l0Y2hfanVtcAorTCQxMDY2CisJYmwgTCQwMzgzLCVyMCA7IyA5NDMxIHN3aXRjaF9qdW1wCisJbGRpIDQ2MDgsJXIyMCA7IyAzNzc4IHJlbG9hZF9vdXRzaSsyLzIKK0wkMTA2NworCWJsIEwkMDM4MCwlcjAKKwlub3AgOyMgOTQzNCBzd2l0Y2hfanVtcAorTCQxMDY4CisJYmwsbiBMJDAwNzYsJXIwIDsjIDc4OTkganVtcAorTCQwMDUzCisJbGR3IC0yOTYoJXIzMCksJXIyNSA7IyAyMzQzIHJlbG9hZF9vdXRzaSsyLzUKKwlsZG8gMSglcjEpLCVyMTkgOyMgMzA2IGFkZHNpMy8yCisJY29tYiw9LG4gJXIxOSwlcjI1LEwkMDA1NSA7IyAzMDggYmxldSsxCisJYmIsPCAlcjE1LDI4LEwkMDA1NSA7IyAzMTMgYmxldSszCisJbGR3IC0yNzYoJXIzMCksJXIyNiA7IyAzMTUgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgYXRfYmVnbGluZV9sb2NfcCwlcjIgOyMgMzIxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjE1LCVyMjQgOyMgMzE5IHJlbG9hZF9vdXRzaSsyLzEKKwlleHRycyAlcjI4LDMxLDgsJXIyOCA7IyAzMjQgZXh0ZW5kcWlzaTIKKwljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgMzI2IGJsZXUrMQorCWJsLG4gTCQwMDc2LCVyMAorTCQwMDU1CisJbGR3IDAoJXI1KSwlcjQgOyMgNzk4NiByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDc5ODkgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzk4NyBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzk4OCBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDA2MCA7IyA3OTkwIGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODcwMSByZWxvYWRfb3V0c2krMi8zCitMJDAwNjEKKwljb21jbHIsPD4gJXIzLCVyMjAsJXIwIDsjIDM1NyBibGV1KzEKKwlibCBMJDA5NDQsJXIwCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMzY3IGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDA2NiA7IyAzNzUgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDM2OSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgMzc4IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDA2NgorCWxkdyAwKCVyNSksJXIyNiA7IyAzODUgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgMzg5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDM4NyByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDM5NyBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgMzkzIHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjQsTCQwMDU5IDsjIDQwNyBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDQwOSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MTIgYWRkc2kzLzEKKwlzdWIgJXIxMiwlcjQsJXIxOSA7IyA0MTMgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDAwNjkgOyMgNDE4IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDE2IGFkZHNpMy8xCisJc3ViICVyMTAsJXI0LCVyMTkgOyMgNDE5IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0MjIgYWRkc2kzLzEKK0wkMDA2OQorCWNvbWliLD0gMCwlcjgsTCQwMDcwIDsjIDQyNSBibGV1KzEKKwlzdWIgJXI4LCVyNCwlcjE5IDsjIDQyNiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0MjkgYWRkc2kzLzEKK0wkMDA3MAorCWNvbWliLD0gMCwlcjksTCQwMDU5IDsjIDQzMiBibGV1KzEKKwlzdWIgJXI5LCVyNCwlcjE5IDsjIDQzMyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0MzYgYWRkc2kzLzEKK0wkMDA1OQorCWxkdyAwKCVyNSksJXI0IDsjIDMzNyByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDM0MSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyAzMzggc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDMzOSBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDA2MQorCW5vcCA7IyAzNDMgYmxldSsxCitMJDAwNjAKKwlsZGkgOCwlcjE5IDsjIDQ1OCBtb3ZxaSsxLzIKKwlibCBMJDAwNDMsJXIwIDsjIDQ3OSBqdW1wCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0NTkgbW92cWkrMS82CitMJDAwNzcKKwljb21iLD0sbiAlcjE2LCVyMjYsTCQwMDc5IDsjIDQ4NSBibGV1KzEKKwliYiw8ICVyMTUsMjgsTCQwMDc5IDsjIDQ5MCBibGV1KzMKKwljb3B5ICVyMTYsJXIyNSA7IyA0OTQgcmVsb2FkX291dHNpKzIvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgYXRfZW5kbGluZV9sb2NfcCwlcjIgOyMgNDk4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjE1LCVyMjQgOyMgNDk2IHJlbG9hZF9vdXRzaSsyLzEKKwlleHRycyAlcjI4LDMxLDgsJXIyOCA7IyA1MDEgZXh0ZW5kcWlzaTIKKwljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNTAzIGJsZXUrMQorCWJsLG4gTCQwMDc2LCVyMAorTCQwMDc5CisJbGR3IDAoJXI1KSwlcjQgOyMgNzk5NCByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDc5OTcgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzk5NSBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzk5NiBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDA4NCA7IyA3OTk4IGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY5OSByZWxvYWRfb3V0c2krMi8zCitMJDAwODUKKwljb21jbHIsPD4gJXIzLCVyMjAsJXIwIDsjIDUzNCBibGV1KzEKKwlibCBMJDA5NDQsJXIwCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNTQ0IGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDA5MCA7IyA1NTIgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDU0NiByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNTU1IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDA5MAorCWxkdyAwKCVyNSksJXIyNiA7IyA1NjIgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNTY2IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDU2NCByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU3NCBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNTcwIHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjQsTCQwMDgzIDsjIDU4NCBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDU4NiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA1ODkgYWRkc2kzLzEKKwlzdWIgJXIxMiwlcjQsJXIxOSA7IyA1OTAgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDAwOTMgOyMgNTk1IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNTkzIGFkZHNpMy8xCisJc3ViICVyMTAsJXI0LCVyMTkgOyMgNTk2IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1OTkgYWRkc2kzLzEKK0wkMDA5MworCWNvbWliLD0gMCwlcjgsTCQwMDk0IDsjIDYwMiBibGV1KzEKKwlzdWIgJXI4LCVyNCwlcjE5IDsjIDYwMyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2MDYgYWRkc2kzLzEKK0wkMDA5NAorCWNvbWliLD0gMCwlcjksTCQwMDgzIDsjIDYwOSBibGV1KzEKKwlzdWIgJXI5LCVyNCwlcjE5IDsjIDYxMCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2MTMgYWRkc2kzLzEKK0wkMDA4MworCWxkdyAwKCVyNSksJXI0IDsjIDUxNCByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDUxOCByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA1MTUgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDUxNiBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDA4NQorCW5vcCA7IyA1MjAgYmxldSsxCitMJDAwODQKKwlsZGkgOSwlcjE5IDsjIDYzNSBtb3ZxaSsxLzIKKwlibCBMJDAwNDMsJXIwIDsjIDY1NiBqdW1wCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2MzYgbW92cWkrMS82CitMJDA4NzcKKwlibCBMJDAxMTAsJXIwIDsjIDg5NyBqdW1wCisJc3R3ICVyMjEsLTI5NiglcjMwKSA7IyAyMzkxIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDEwMQorTCQxMTU4CisJYW5kICVyMTUsJXIxOSwlcjE5IDsjIDY2MyBhbmRzaTMvMQorCWNvbWljbHIsPSAwLCVyMTksJXIwIDsjIDY2NSBibGV1KzEKKwlibCxuIEwkMDA3NiwlcjAKK0wkMDEwNAorCWNvbWliLDw+IDAsJXI4LEwkMDEwNSA7IyA2NzQgYmxldSsxCisJbGRpIDAsJXIxMyA7IyA3MTEgcmVsb2FkX291dHNpKzIvMgorCWV4dHJzLD49ICVyMTUsMjYsMSwlcjAgOyMgNjgxIGJsZXUrMworCWV4dHJzLDwgJXIxNSwyNywxLCVyMCA7IyA3MDAgbW92c2ktNAorCW5vcAorCWJsLG4gTCQwMDc2LCVyMAorTCQwMTA1CisJbGRpIDAsJXIxMSA7IyA3MTQgcmVsb2FkX291dHNpKzIvMgorCWxkaSAwLCVyMjIgOyMgNzE2IHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgNDMsJXIyNCA7IyA4Njg4IHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgNjMsJXIyMyA7IyA4NjkwIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgNDIsJXIyOCA7IyA4NjkyIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgMiwlcjE5IDsjIDg2OTQgcmVsb2FkX291dHNpKzIvMgorCWFuZCAlcjE1LCVyMTksJXIyNSA7IyA4Njk1IGFuZHNpMy8xCisJbGRpIDkyLCVyMjYgOyMgODY5NyByZWxvYWRfb3V0c2krMi8yCitMJDAxMDkKKwljb21iLD0gJXIyNCwlcjcsTCQwMTEyIDsjIDcyNyBibGV1KzEKKwljb3B5ICVyMTEsJXIxOSA7IyA4NzgwIHJlbG9hZF9vdXRzaSsyLzEKKwlkZXBpIC0xLDMxLDEsJXIxOSA7IyA3MjkgaW9yc2kzKzEvMgorCWJsIEwkMDExMywlcjAgOyMgNzMxIGp1bXAKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3MzAgZXh0ZW5kcWlzaTIKK0wkMDExMgorCWV4dHJzICVyMTEsMzEsOCwlcjE5IDsjIDczNCBleHRlbmRxaXNpMgorTCQwMTEzCitMJDExNTkKKwljb21iLD0gJXIyMywlcjcsTCQwMTE0IDsjIDc0NCBibGV1KzEKKwljb3B5ICVyMTksJXIxMSA7IyA3MzcgcmVsb2FkX291dHNpKzIvMQorCWNvcHkgJXIyMiwlcjE5IDsjIDg3ODMgcmVsb2FkX291dHNpKzIvMQorCWRlcGkgLTEsMzEsMSwlcjE5IDsjIDc0NiBpb3JzaTMrMS8yCisJYmwgTCQwMTE1LCVyMCA7IyA3NDgganVtcAorCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc0NyBleHRlbmRxaXNpMgorTCQwMTE0CisJZXh0cnMgJXIyMiwzMSw4LCVyMTkgOyMgNzUxIGV4dGVuZHFpc2kyCitMJDAxMTUKKwlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDIzNTUgcmVsb2FkX291dHNpKzIvNQorCWNvbWIsPSAlcjE2LCVyMjEsTCQwMTEwIDsjIDc1NyBibGV1KzEKKwljb3B5ICVyMTksJXIyMiA7IyA3NTQgcmVsb2FkX291dHNpKzIvMQorCWNvcHkgJXIyMSwlcjIwIDsjIDg3NDMgcmVsb2FkX291dHNpKzIvMQorCWxkYnMsbWEgMSglcjIwKSwlcjcgOyMgNzc2IHplcm9fZXh0ZW5kcWlzaTIvMgorCWNvbWliLD0gMCwlcjE0LEwkMDExOCA7IyA3ODEgYmxldSsxCisJc3R3ICVyMjAsLTI5NiglcjMwKSA7IyAyMzY0IHJlbG9hZF9vdXRzaSsyLzYKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNzgyIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXI3IDsjIDc4NSB6ZXJvX2V4dGVuZHFpc2kyLzIKK0wkMDExOAorCWNvbWIsPSAlcjI4LCVyNyxMJDAxMDkKKwlub3AgOyMgODAyIGJsZXUrMQorCWNvbWliLDw+LG4gMCwlcjI1LEwkMDg2OSA7IyA4MDcgYmxldSsxCisJY29tYiw9ICVyMjQsJXI3LEwkMTE1OSA7IyA4MTEgYmxldSsxCisJZXh0cnMgJXIxMSwzMSw4LCVyMTkgOyMgNzM0IGV4dGVuZHFpc2kyCisJY29tYiw9ICVyMjMsJXI3LEwkMDEwOSA7IyA4MTUgYmxldSsxCisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAwIHJlbG9hZF9vdXRzaSsyLzUKKwlibCxuIEwkMTE2MCwlcjAgOyMgODI3IGp1bXAKK0wkMDg2OQorCWNvbWIsPD4gJXIyNiwlcjcsTCQwMTI2IDsjIDgzMSBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MDAgcmVsb2FkX291dHNpKzIvNQorCWNvbWNsciw8PiAlcjE2LCVyMjAsJXIwIDsjIDgzNSBibGV1KzEKKwlibCBMJDA5MDMsJXIwCisJbGRvIDEoJXIyMCksJXIxOSA7IyA4NjMgYWRkc2kzLzIKKwlsZGIgMSglcjIxKSwlcjMgOyMgODYwIHplcm9fZXh0ZW5kcWlzaTIvMgorCWNvbWliLD0gMCwlcjE0LEwkMDEyOSA7IyA4NjUgYmxldSsxCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyMzc5IHJlbG9hZF9vdXRzaSsyLzYKKwlhZGRsICVyMTQsJXIzLCVyMTkgOyMgODY2IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIzIDsjIDg2OSB6ZXJvX2V4dGVuZHFpc2kyLzIKK0wkMDEyOQorCWNvbWIsPSAlcjI0LCVyMyxMJDAxMDkgOyMgODg2IGJsZXUrMQorCWNvcHkgJXIzLCVyNyA7IyA5MDMgcmVsb2FkX291dHNpKzIvMQorCWNvbWIsPD4gJXIyMywlcjMsTCQwODc3CisJbm9wIDsjIDg5MCBibGV1KzEKKwlibCxuIEwkMDEwOSwlcjAgOyMgOTA1IGp1bXAKK0wkMDEyNgorTCQxMTYwCisJbGRvIC0xKCVyMTkpLCVyMTkgOyMgOTEwIGFkZHNpMy8yCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyMzk3IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDExMAorCWNvbWljbHIsPD4gMCwlcjgsJXIwIDsjIDkyNyBibGV1KzEKKwlibCBMJDExNjEsJXIwCisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyMzI4IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9LG4gMCwlcjIyLEwkMDEzNyA7IyA5MzQgYmxldSsxCisJbGR3IDAoJXI1KSwlcjMgOyMgODAwMiByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwMDUgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgODAwMyBzdWJzaTMvMQorCWxkbyAzKCVyMTkpLCVyMTkgOyMgODAwNCBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDEzOSA7IyA4MDA2IGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY4NiByZWxvYWRfb3V0c2krMi8zCitMJDAxNDAKKwljb21jbHIsPD4gJXI0LCVyMjAsJXIwIDsjIDk2MSBibGV1KzEKKwlibCBMJDA5NDQsJXIwCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgOTcxIGFzaGxzaTMrMQorCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE0NSA7IyA5NzkgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDk3MyByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyNCw0KCVyNSkgOyMgOTgyIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDE0NQorCWxkdyAwKCVyNSksJXIyNiA7IyA5ODkgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgOTkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDk5MSByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEwMDEgYmxldSsxCisJc3R3ICVyMjgsMCglcjUpIDsjIDk5NyByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXIzLEwkMDEzOCA7IyAxMDExIGJsZXUrMQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTAxMyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxMDE2IGFkZHNpMy8xCisJc3ViICVyMTIsJXIzLCVyMTkgOyMgMTAxNyBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDE0OCA7IyAxMDIyIGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTAyMCBhZGRzaTMvMQorCXN1YiAlcjEwLCVyMywlcjE5IDsjIDEwMjMgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDEwMjYgYWRkc2kzLzEKK0wkMDE0OAorCWNvbWliLD0gMCwlcjgsTCQwMTQ5IDsjIDEwMjkgYmxldSsxCisJc3ViICVyOCwlcjMsJXIxOSA7IyAxMDMwIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDEwMzMgYWRkc2kzLzEKK0wkMDE0OQorCWNvbWliLD0gMCwlcjksTCQwMTM4IDsjIDEwMzYgYmxldSsxCisJc3ViICVyOSwlcjMsJXIxOSA7IyAxMDM3IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDEwNDAgYWRkc2kzLzEKK0wkMDEzOAorCWxkdyAwKCVyNSksJXIzIDsjIDk0MSByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDk0NSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjMsJXIxOSA7IyA5NDIgc3Vic2kzLzEKKwlsZG8gMyglcjE5KSwlcjE5IDsjIDk0MyBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDE0MAorCW5vcCA7IyA5NDcgYmxldSsxCitMJDAxMzkKKwljb21pYiw9IDAsJXIxNCxMJDAxNTQgOyMgMTA2MyBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MDMgcmVsb2FkX291dHNpKzIvNQorCWxkYiAtMiglcjE5KSwlcjE5IDsjIDEwNjYgemVyb19leHRlbmRxaXNpMi8yCisJYWRkbCAlcjE0LCVyMTksJXIxOSA7IyAxMDY3IGFkZHNpMy8xCisJYmwgTCQwOTQ3LCVyMCA7IyAxMDcxIGp1bXAKKwlsZGIgMCglcjE5KSwlcjE5IDsjIDEwNjkgbW92cWkrMS81CitMJDAxNTQKKwlsZGIgLTIoJXIxOSksJXIxOSA7IyAxMDc1IG1vdnFpKzEvNQorTCQwOTQ3CisJY29taWIsPSAwLCVyMTQsTCQwMTU2IDsjIDEwNzkgYmxldSsxCisJZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgMTA3NiBleHRlbmRxaXNpMgorCWxkYiA0NiglcjE0KSwlcjE5IDsjIDEwODEgbW92cWkrMS81CisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTA4MiBleHRlbmRxaXNpMgorCWNvbWIsPSAlcjE5LCVyMjAsTCQwMTU3IDsjIDEwODQgYmxldSsxCisJbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCisJYmwsbiBMJDExNjIsJXIwIDsjIDEwODUganVtcAorTCQwMTU2CisJbGRpIDQ2LCVyMTkgOyMgMTA4OSByZWxvYWRfb3V0c2krMi8yCisJY29tYiw8PiAlcjE5LCVyMjAsTCQxMTYyIDsjIDEwOTEgYmxldSsxCisJbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCitMJDAxNTcKKwljb21pYiw9IDAsJXIxMSxMJDAxNTMgOyMgMTA5NiBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MDkgcmVsb2FkX291dHNpKzIvNQorCWNvbWIsPDw9ICVyMTYsJXIxOSxMJDExNjIgOyMgMTA5OCBibGV1KzEKKwlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKKwljb21pYiw9LG4gMCwlcjE0LEwkMDE1OCA7IyAxMTAwIGJsZXUrMQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgMTEwMyB6ZXJvX2V4dGVuZHFpc2kyLzIKKwlhZGRsICVyMTQsJXIxOSwlcjE5IDsjIDExMDQgYWRkc2kzLzEKK0wkMDE1OAorCWxkYiAwKCVyMTkpLCVyMTkgOyMgMTExMiBtb3ZxaSsxLzUKKwljb21pYiw9IDAsJXIxNCxMJDAxNjAgOyMgMTExNiBibGV1KzEKKwlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyAxMTEzIGV4dGVuZHFpc2kyCisJbGRiIDEwKCVyMTQpLCVyMTkgOyMgMTExOCBtb3ZxaSsxLzUKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAxMTE5IGV4dGVuZHFpc2kyCisJY29tYiw9ICVyMTksJXIyMCxMJDAxNjEgOyMgMTEyMSBibGV1KzEKKwlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKKwlibCxuIEwkMTE2MiwlcjAgOyMgMTEyMiBqdW1wCitMJDAxNjAKKwljb21pYiw8PiAxMCwlcjIwLEwkMTE2MiA7IyAxMTI2IGJsZXUrMQorCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgorTCQwMTYxCisJYmIsPCAlcjE1LDI1LEwkMTE2MiA7IyAxMTM0IGJsZXUrMworCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgorCWxkaSAxMiwlcjI2IDsjIDExNDAgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXI2LCVyMjUgOyMgMTE0MiByZWxvYWRfb3V0c2krMi8xCisJc3ViICVyOCwlcjYsJXIyNCA7IyAxMTM3IHN1YnNpMy8xCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKKwlibCBzdG9yZV9vcDEsJXIyIDsjIDExNDYgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwlsZG8gLTMoJXIyNCksJXIyNCA7IyAxMTQ0IGFkZHNpMy8yCisJYmwgTCQwMTYyLCVyMCA7IyAxMTUxIGp1bXAKKwlsZGkgMSwlcjEzIDsjIDExNDkgcmVsb2FkX291dHNpKzIvMgorTCQwMTUzCisJbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCitMJDExNjIKKwljb3B5ICVyNiwlcjI1IDsjIDExNjEgcmVsb2FkX291dHNpKzIvMQorCXN1YiAlcjgsJXI2LCVyMjQgOyMgMTE1NiBzdWJzaTMvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RvcmVfb3AxLCVyMiA7IyAxMTY1IGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGRvIC02KCVyMjQpLCVyMjQgOyMgMTE2MyBhZGRzaTMvMgorTCQwMTYyCisJbGRvIDMoJXI2KSwlcjYgOyMgMTE2OCBhZGRzaTMvMgorTCQwMTM3CisJbGR3IDAoJXI1KSwlcjMgOyMgODAxMCByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwMTMgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgODAxMSBzdWJzaTMvMQorCWxkbyAzKCVyMTkpLCVyMTkgOyMgODAxMiBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDE2NCA7IyA4MDE0IGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY4NCByZWxvYWRfb3V0c2krMi8zCitMJDAxNjUKKwljb21jbHIsPD4gJXI0LCVyMjAsJXIwIDsjIDExOTUgYmxldSsxCisJYmwgTCQwOTQ0LCVyMAorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDEyMDUgYXNobHNpMysxCisJY29tYiw+Pj0gJXI0LCVyMTksTCQwMTcwIDsjIDEyMTMgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDEyMDcgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjQsNCglcjUpIDsjIDEyMTYgcmVsb2FkX291dHNpKzIvNgorTCQwMTcwCisJbGR3IDAoJXI1KSwlcjI2IDsjIDEyMjMgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgMTIyNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyAxMjI1IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTIzNSBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgMTIzMSByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXIzLEwkMDE2MyA7IyAxMjQ1IGJsZXUrMQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTI0NyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxMjUwIGFkZHNpMy8xCisJc3ViICVyMTIsJXIzLCVyMTkgOyMgMTI1MSBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDE3MyA7IyAxMjU2IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTI1NCBhZGRzaTMvMQorCXN1YiAlcjEwLCVyMywlcjE5IDsjIDEyNTcgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDEyNjAgYWRkc2kzLzEKK0wkMDE3MworCWNvbWliLD0gMCwlcjgsTCQwMTc0IDsjIDEyNjMgYmxldSsxCisJc3ViICVyOCwlcjMsJXIxOSA7IyAxMjY0IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDEyNjcgYWRkc2kzLzEKK0wkMDE3NAorCWNvbWliLD0gMCwlcjksTCQwMTYzIDsjIDEyNzAgYmxldSsxCisJc3ViICVyOSwlcjMsJXIxOSA7IyAxMjcxIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDEyNzQgYWRkc2kzLzEKK0wkMDE2MworCWxkdyAwKCVyNSksJXIzIDsjIDExNzUgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyAxMTc5IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDExNzYgc3Vic2kzLzEKKwlsZG8gMyglcjE5KSwlcjE5IDsjIDExNzcgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDAxNjUKKwlub3AgOyMgMTE4MSBibGV1KzEKK0wkMDE2NAorCWxkaSAxNCwlcjI2IDsjIDg3ODYgcmVsb2FkX291dHNpKzIvMgorCWNvbWljbHIsPSAwLCVyMTMsJXIwIDsjIDEzMTAgYmVxLTEvMgorCWxkaSAxNSwlcjI2CisJY29weSAlcjgsJXIyNSA7IyAxMzEyIHJlbG9hZF9vdXRzaSsyLzEKKwlzdWIgJXI2LCVyOCwlcjI0IDsjIDEzMTQgc3Vic2kzLzEKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluc2VydF9vcDEsJXIyIDsjIDEzMTggY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyNiwlcjIzIDsjIDEzMTYgcmVsb2FkX291dHNpKzIvMQorCWxkaSAwLCVyOSA7IyAxMzIxIHJlbG9hZF9vdXRzaSsyLzIKKwljb21pYiw8PiAwLCVyMTEsTCQwMDQzIDsjIDEzMjYgYmxldSsxCisJbGRvIDMoJXI2KSwlcjYgOyMgMTMyMyBhZGRzaTMvMgorCWxkdyAwKCVyNSksJXIzIDsjIDgwMTkgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MDIyIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMjAgc3Vic2kzLzEKKwlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMjEgYWRkc2kzLzIKKwljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxODIgOyMgODAyMyBibGV1KzEKKwlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODIgcmVsb2FkX291dHNpKzIvMworTCQwMTgzCisJY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyAxMzUyIGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDEzNjIgYXNobHNpMysxCisJY29tYiw+Pj0gJXI0LCVyMTksTCQwMTg4IDsjIDEzNzAgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDEzNjQgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjQsNCglcjUpIDsjIDEzNzMgcmVsb2FkX291dHNpKzIvNgorTCQwMTg4CisJbGR3IDAoJXI1KSwlcjI2IDsjIDEzODAgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgMTM4NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyAxMzgyIHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMTM5MiBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgMTM4OCByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXIzLEwkMDE4MSA7IyAxNDAyIGJsZXUrMQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTQwNCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAxNDA3IGFkZHNpMy8xCisJc3ViICVyMTIsJXIzLCVyMTkgOyMgMTQwOCBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDE5MSA7IyAxNDEzIGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMTQxMSBhZGRzaTMvMQorCXN1YiAlcjEwLCVyMywlcjE5IDsjIDE0MTQgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDE0MTcgYWRkc2kzLzEKK0wkMDE5MQorCWNvbWliLD0gMCwlcjgsTCQwMTkyIDsjIDE0MjAgYmxldSsxCisJc3ViICVyOCwlcjMsJXIxOSA7IyAxNDIxIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDE0MjQgYWRkc2kzLzEKK0wkMDE5MgorCWNvbWliLD0gMCwlcjksTCQwMTgxIDsjIDE0MjcgYmxldSsxCisJc3ViICVyOSwlcjMsJXIxOSA7IyAxNDI4IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDE0MzEgYWRkc2kzLzEKK0wkMDE4MQorCWxkdyAwKCVyNSksJXIzIDsjIDEzMzIgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyAxMzM2IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDEzMzMgc3Vic2kzLzEKKwlsZG8gMyglcjE5KSwlcjE5IDsjIDEzMzQgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDAxODMKKwlub3AgOyMgMTMzOCBibGV1KzEKK0wkMDE4MgorCWxkaSAxOCwlcjI2IDsjIDE0NTQgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXI4LCVyMjUgOyMgMTQ1NiByZWxvYWRfb3V0c2krMi8xCisJbGRpIDMsJXIyNCA7IyAxNDU4IHJlbG9hZF9vdXRzaSsyLzIKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluc2VydF9vcDEsJXIyIDsjIDE0NjIgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyNiwlcjIzIDsjIDE0NjAgcmVsb2FkX291dHNpKzIvMQorCWJsIEwkMDA0MywlcjAgOyMgMTQ3MCBqdW1wCisJbGRvIDMoJXI2KSwlcjYgOyMgMTQ2NCBhZGRzaTMvMgorTCQwMTk2CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwMzAgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODAyOCBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgODAyOSBhZGRzaTMvMgorCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyMDEgOyMgODAzMSBibGV1KzEKKwljb3B5ICVyNiwlcjggOyMgMTQ3NSByZWxvYWRfb3V0c2krMi8xCisJbGRpbCBMJzY1NTM2LCVyMyA7IyA4NjgwIHJlbG9hZF9vdXRzaSsyLzMKK0wkMDIwMgorCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgMTUwMyBibGV1KzEKKwl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxNTEzIGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDIwNyA7IyAxNTIxIGJsZXUrMQorCXN0dyAlcjE5LDQoJXI1KSA7IyAxNTE1IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIzLDQoJXI1KSA7IyAxNTI0IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDIwNworCWxkdyAwKCVyNSksJXIyNiA7IyAxNTMxIHJlbG9hZF9vdXRzaSsyLzUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDE1MzUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgNCglcjUpLCVyMjUgOyMgMTUzMyByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDE1NDMgYmxldSsxCisJc3R3ICVyMjgsMCglcjUpIDsjIDE1MzkgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDAyMDAgOyMgMTU1MyBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDE1NTUgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTU1OCBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDE1NTkgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDAyMTAgOyMgMTU2NCBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDE1NjIgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyAxNTY1IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxNTY4IGFkZHNpMy8xCitMJDAyMTAKKwljb21pYiw9IDAsJXI4LEwkMDIxMSA7IyAxNTcxIGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgMTU3MiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxNTc1IGFkZHNpMy8xCitMJDAyMTEKKwljb21pYiw9IDAsJXI5LEwkMDIwMCA7IyAxNTc4IGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgMTU3OSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxNTgyIGFkZHNpMy8xCitMJDAyMDAKKwlsZHcgMCglcjUpLCVyNCA7IyAxNDgzIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgMTQ4NyByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyAxNDg0IHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyAxNDg1IGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwMjAyCisJbm9wIDsjIDE0ODkgYmxldSsxCitMJDAyMDEKKwlsZGkgMiwlcjE5IDsjIDE2MDQgbW92cWkrMS8yCisJYmwgTCQwMDQzLCVyMCA7IyAxNjE3IGp1bXAKKwlzdGJzLG1hICVyMTksMSglcjYpIDsjIDE2MDUgbW92cWkrMS82CitMJDAyMTYKKwljb21iLD0gJXIxNiwlcjE5LEwkMDkwMiA7IyAxNjI2IGJsZXUrMQorCWxkaSAwLCVyMTMgOyMgMTYyMyByZWxvYWRfb3V0c2krMi8yCisJbGR3IDAoJXI1KSwlcjMgOyMgODAzNSByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwMzggcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgODAzNiBzdWJzaTMvMQorCWxkbyAzNCglcjE5KSwlcjE5IDsjIDgwMzcgYWRkc2kzLzIKKwljb21iLD4+PSAlcjIwLCVyMTksTCQwMjE5IDsjIDgwMzkgYmxldSsxCisJbGRpbCBMJzY1NTM2LCVyNCA7IyA4Njc4IHJlbG9hZF9vdXRzaSsyLzMKK0wkMDIyMAorCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgMTY2MSBibGV1KzEKKwl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxNjcxIGFzaGxzaTMrMQorCWNvbWIsPj49ICVyNCwlcjE5LEwkMDIyNSA7IyAxNjc5IGJsZXUrMQorCXN0dyAlcjE5LDQoJXI1KSA7IyAxNjczIHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXI0LDQoJXI1KSA7IyAxNjgyIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDIyNQorCWxkdyAwKCVyNSksJXIyNiA7IyAxNjg5IHJlbG9hZF9vdXRzaSsyLzUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDE2OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgNCglcjUpLCVyMjUgOyMgMTY5MSByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDE3MDEgYmxldSsxCisJc3R3ICVyMjgsMCglcjUpIDsjIDE2OTcgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyMyxMJDAyMTggOyMgMTcxMSBibGV1KzEKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDE3MTMgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTcxNiBhZGRzaTMvMQorCXN1YiAlcjEyLCVyMywlcjE5IDsjIDE3MTcgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDAyMjggOyMgMTcyMiBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDE3MjAgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxNzIzIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxNzI2IGFkZHNpMy8xCitMJDAyMjgKKwljb21pYiw9IDAsJXI4LEwkMDIyOSA7IyAxNzI5IGJsZXUrMQorCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTczMCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxNzMzIGFkZHNpMy8xCitMJDAyMjkKKwljb21pYiw9IDAsJXI5LEwkMDIxOCA7IyAxNzM2IGJsZXUrMQorCXN1YiAlcjksJXIzLCVyMTkgOyMgMTczNyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxNzQwIGFkZHNpMy8xCitMJDAyMTgKKwlsZHcgMCglcjUpLCVyMyA7IyAxNjQxIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgMTY0NSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjMsJXIxOSA7IyAxNjQyIHN1YnNpMy8xCisJbGRvIDM0KCVyMTkpLCVyMTkgOyMgMTY0MyBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIyMAorCW5vcCA7IyAxNjQ3IGJsZXUrMQorTCQwMjE5CisJbGR3IDAoJXI1KSwlcjQgOyMgODA0MyByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwNDYgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODA0NCBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgODA0NSBhZGRzaTMvMgorCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyMzcgOyMgODA0NyBibGV1KzEKKwljb3B5ICVyNiwlcjggOyMgMTc2MyByZWxvYWRfb3V0c2krMi8xCisJbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njc2IHJlbG9hZF9vdXRzaSsyLzMKK0wkMDIzOAorCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgMTc5MSBibGV1KzEKKwl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxODAxIGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDI0MyA7IyAxODA5IGJsZXUrMQorCXN0dyAlcjE5LDQoJXI1KSA7IyAxODAzIHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIzLDQoJXI1KSA7IyAxODEyIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDI0MworCWxkdyAwKCVyNSksJXIyNiA7IyAxODE5IHJlbG9hZF9vdXRzaSsyLzUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDE4MjMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgNCglcjUpLCVyMjUgOyMgMTgyMSByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDE4MzEgYmxldSsxCisJc3R3ICVyMjgsMCglcjUpIDsjIDE4MjcgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDAyMzYgOyMgMTg0MSBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDE4NDMgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTg0NiBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDE4NDcgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDAyNDYgOyMgMTg1MiBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDE4NTAgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyAxODUzIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxODU2IGFkZHNpMy8xCitMJDAyNDYKKwljb21pYiw9IDAsJXI4LEwkMDI0NyA7IyAxODU5IGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgMTg2MCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxODYzIGFkZHNpMy8xCitMJDAyNDcKKwljb21pYiw9IDAsJXI5LEwkMDIzNiA7IyAxODY2IGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgMTg2NyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxODcwIGFkZHNpMy8xCitMJDAyMzYKKwlsZHcgMCglcjUpLCVyNCA7IyAxNzcxIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgMTc3NSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyAxNzcyIHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyAxNzczIGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwMjM4CisJbm9wIDsjIDE3NzcgYmxldSsxCitMJDAyMzcKKwljb3B5ICVyNiwlcjIyIDsjIDE5MDkgcmVsb2FkX291dHNpKzIvMQorCWxkbyAxKCVyNiksJXI2IDsjIDE4OTEgYWRkc2kzLzIKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0MjEgcmVsb2FkX291dHNpKzIvNQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgMTg5MyBtb3ZxaSsxLzUKKwlsZGkgOTQsJXIyMSA7IyAxODk2IHJlbG9hZF9vdXRzaSsyLzIKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAxODk0IGV4dGVuZHFpc2kyCisJY29tYiw8PiAlcjIxLCVyMTksTCQwMjUxIDsjIDE4OTggYmxldSsxCisJbGRpIDMsJXIyMCA7IyA4MDUxIG1vdnFpKzEvMgorCWxkaSA0LCVyMjAgOyMgMTkwMCBtb3ZxaSsxLzIKK0wkMDI1MQorCXN0YiAlcjIwLDAoJXIyMikgOyMgMTkxMSBtb3ZxaSsxLzYKKwlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MjQgcmVsb2FkX291dHNpKzIvNQorCWxkYiAwKCVyMjApLCVyMTkgOyMgMTkyMyBtb3ZxaSsxLzUKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAxOTI0IGV4dGVuZHFpc2kyCisJY29tYiw8PiAlcjIxLCVyMTksTCQwMjU0IDsjIDE5MjggYmxldSsxCisJbGRvIDEoJXIyMCksJXIxOSA7IyAxOTMwIGFkZHNpMy8yCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNDI3IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDI1NAorCWxkdyAwKCVyNSksJXI0IDsjIDgwNTIgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MDU1IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTI5NiglcjMwKSwlcjEgOyMgMjQzMyByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA4MDUzIHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA4MDU0IGFkZHNpMy8yCisJY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDI1OSA7IyA4MDU2IGJsZXUrMQorCXN0dyAlcjEsLTI2OCglcjMwKSA7IyA4Nzg5IHJlbG9hZF9vdXRzaSsyLzYKKwlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2NzQgcmVsb2FkX291dHNpKzIvMworTCQwMjYwCisJY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyAxOTYyIGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDE5NzIgYXNobHNpMysxCisJY29tYiw+Pj0gJXIzLCVyMTksTCQwMjY1IDsjIDE5ODAgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDE5NzQgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjMsNCglcjUpIDsjIDE5ODMgcmVsb2FkX291dHNpKzIvNgorTCQwMjY1CisJbGR3IDAoJXI1KSwlcjI2IDsjIDE5OTAgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgMTk5NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyAxOTkyIHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgMjAwMiBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgMTk5OCByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXI0LEwkMDI1OCA7IyAyMDEyIGJsZXUrMQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgMjAxNCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyAyMDE3IGFkZHNpMy8xCisJc3ViICVyMTIsJXI0LCVyMTkgOyMgMjAxOCBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDI2OCA7IyAyMDIzIGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgMjAyMSBhZGRzaTMvMQorCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDIwMjQgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDIwMjcgYWRkc2kzLzEKK0wkMDI2OAorCWNvbWliLD0gMCwlcjgsTCQwMjY5IDsjIDIwMzAgYmxldSsxCisJc3ViICVyOCwlcjQsJXIxOSA7IyAyMDMxIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDIwMzQgYWRkc2kzLzEKK0wkMDI2OQorCWNvbWliLD0gMCwlcjksTCQwMjU4IDsjIDIwMzcgYmxldSsxCisJc3ViICVyOSwlcjQsJXIxOSA7IyAyMDM4IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDIwNDEgYWRkc2kzLzEKK0wkMDI1OAorCWxkdyAwKCVyNSksJXI0IDsjIDE5NDIgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyAxOTQ2IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDE5NDMgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDE5NDQgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDAyNjAKKwlub3AgOyMgMTk0OCBibGV1KzEKK0wkMDI1OQorCWxkaSAzMiwlcjE5IDsjIDIwNjMgbW92cWkrMS8yCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyAyMDY0IG1vdnFpKzEvNgorCWNvcHkgJXI2LCVyMjYgOyMgMjA3NyByZWxvYWRfb3V0c2krMi8xCisJbGRpIDAsJXIyNSA7IyAyMDc5IHJlbG9hZF9vdXRzaSsyLzIKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgorCWJsIG1lbXNldCwlcjIgOyMgMjA4MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkaSAzMiwlcjI0IDsjIDIwODEgcmVsb2FkX291dHNpKzIvMgorCWxkYiAtMiglcjYpLCVyMTkgOyMgMjA4NyB6ZXJvX2V4dGVuZHFpc2kyLzIKKwljb21pYiw8PiA0LCVyMTksTCQwMjc0IDsjIDIwODkgYmxldSsxCisJbGRpIDkzLCVyMTcgOyMgODYyMiByZWxvYWRfb3V0c2krMi8yCisJYmIsPj0sbiAlcjE1LDIzLEwkMDI3NCA7IyAyMDk0IG1vdnNpLTQKKwlsZGIgMSglcjYpLCVyMTkgOyMgMjA5NyBtb3ZxaSsxLzUKKwlkZXBpIC0xLDI5LDEsJXIxOSA7IyAyMDk5IGlvcnNpMysxLzIKKwlzdGIgJXIxOSwxKCVyNikgOyMgMjEwMSBtb3ZxaSsxLzYKK0wkMDI3NAorCWxkaSA0LCVyMTggOyMgODYyOCByZWxvYWRfb3V0c2krMi8yCisJYW5kICVyMTUsJXIxOCwlcjEgOyMgODYyOSBhbmRzaTMvMQorCXN0dyAlcjEsLTI1MiglcjMwKSA7IyA4NzkyIHJlbG9hZF9vdXRzaSsyLzYKKwlsZG8gLTI4OCglcjMwKSwlcjExIDsjIDg2MzIgYWRkc2kzLzIKK0wkMDI3NQorCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQzNiByZWxvYWRfb3V0c2krMi81CitMJDExNjUKKwljb21iLD0gJXIxNiwlcjIwLEwkMDkwMiA7IyAyMTA5IGJsZXUrMQorCWNvcHkgJXIyMCwlcjIxIDsjIDg3NDUgcmVsb2FkX291dHNpKzIvMQorCWxkYnMsbWEgMSglcjIxKSwlcjcgOyMgMjEzNCB6ZXJvX2V4dGVuZHFpc2kyLzIKKwljb21pYiw9IDAsJXIxNCxMJDAyODAgOyMgMjEzOSBibGV1KzEKKwlzdHcgJXIyMSwtMjk2KCVyMzApIDsjIDI0NDUgcmVsb2FkX291dHNpKzIvNgorCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyAyMTQwIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXI3IDsjIDIxNDMgemVyb19leHRlbmRxaXNpMi8yCitMJDAyODAKKwliYiw+PSAlcjE1LDMxLEwkMDI4NSA7IyAyMTU5IG1vdnNpLTQKKwlsZGkgOTIsJXIxOSA7IyAyMTYxIHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLDw+LG4gJXIxOSwlcjcsTCQwMjg1IDsjIDIxNjMgYmxldSsxCisJY29tYiw9ICVyMTYsJXIyMSxMJDA5MDMgOyMgMjE2NyBibGV1KzEKKwlsZG8gMSglcjIxKSwlcjE5IDsjIDIxOTUgYWRkc2kzLzIKKwlsZGIgMSglcjIwKSwlcjMgOyMgMjE5MiB6ZXJvX2V4dGVuZHFpc2kyLzIKKwljb21pYiw9IDAsJXIxNCxMJDAyODggOyMgMjE5NyBibGV1KzEKKwlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI0NjAgcmVsb2FkX291dHNpKzIvNgorCWFkZGwgJXIxNCwlcjMsJXIxOSA7IyAyMTk4IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIzIDsjIDIyMDEgemVyb19leHRlbmRxaXNpMi8yCitMJDAyODgKKwlleHRydSAlcjMsMjgsMjksJXIxOSA7IyAyMjE2IGxzaHJzaTMvMgorCWFkZGwgJXI2LCVyMTksJXIxOSA7IyAyMjE5IGFkZHNpMy8xCisJYmwgTCQwOTQ4LCVyMCA7IyAyMjM1IGp1bXAKKwlleHRydSAlcjMsMzEsMywlcjIwIDsjIDIyMjIgYW5kc2kzLzEKK0wkMDI4NQorCWNvbWIsPD4sbiAlcjE3LCVyNyxMJDAyOTMgOyMgMjI0MyBibGV1KzEKKwlsZHcgLTI2OCglcjMwKSwlcjEgOyMgODc5OCByZWxvYWRfb3V0c2krMi81CisJbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDY2IHJlbG9hZF9vdXRzaSsyLzUKKwlsZG8gMSglcjEpLCVyMTkgOyMgMjI0NCBhZGRzaTMvMgorCWNvbWIsPD4sbiAlcjE5LCVyMjAsTCQwMjc2IDsjIDIyNDYgYmxldSsxCitMJDAyOTMKKwljb21pYiw9IDAsJXIxMyxMJDAyOTQgOyMgMjI1MyBibGV1KzEKKwlsZGkgNDUsJXIxIDsjIDg4MDEgcmVsb2FkX291dHNpKzIvMgorCWNvbWIsPD4gJXIxLCVyNyxMJDExNjMgOyMgMjI1NyBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQ2OSByZWxvYWRfb3V0c2krMi81CisJbGRiIDAoJXIxOSksJXIxOSA7IyAyMjU5IG1vdnFpKzEvNQorCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyNjAgZXh0ZW5kcWlzaTIKKwljb21iLDw+LG4gJXIxNywlcjE5LEwkMDg5NSA7IyAyMjY0IGJsZXUrMQorTCQwMjk0CisJbGRpIDQ1LCVyMSA7IyA4ODA0IHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLDw+ICVyMSwlcjcsTCQxMTYzIDsjIDIyODAgYmxldSsxCisJbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODgwNyByZWxvYWRfb3V0c2krMi81CisJbGRvIC0yKCVyMjApLCVyMTkgOyMgMjI4MSBhZGRzaTMvMgorCWNvbWIsPj4sbiAlcjEsJXIxOSxMJDExNzkgOyMgMjI4MyBibGV1KzEKKwlsZGIgLTIoJXIyMCksJXIxOSA7IyAyMjg1IG1vdnFpKzEvNQorCWxkaSA5MSwlcjEgOyMgODgxMCByZWxvYWRfb3V0c2krMi8yCisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI4NiBleHRlbmRxaXNpMgorCWNvbWIsPSAlcjEsJXIxOSxMJDExNjMgOyMgMjI5MCBibGV1KzEKKwlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODgxMyByZWxvYWRfb3V0c2krMi81CitMJDExNzkKKwlsZG8gLTMoJXIyMCksJXIxOSA7IyAyMjk0IGFkZHNpMy8yCisJY29tYiw+PixuICVyMSwlcjE5LEwkMDI5NyA7IyAyMjk2IGJsZXUrMQorCWxkYiAtMyglcjIwKSwlcjE5IDsjIDIyOTggbW92cWkrMS81CisJbGRpIDkxLCVyMSA7IyA4ODE2IHJlbG9hZF9vdXRzaSsyLzIKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjk5IGV4dGVuZHFpc2kyCisJY29tYiw8PiAlcjEsJXIxOSxMJDExNjQgOyMgMjMwMyBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0ODcgcmVsb2FkX291dHNpKzIvNQorCWxkYiAtMiglcjIwKSwlcjE5IDsjIDIzMDUgbW92cWkrMS81CisJbGRpIDk0LCVyMjAgOyMgMjMwOCByZWxvYWRfb3V0c2krMi8yCisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjMwNiBleHRlbmRxaXNpMgorCWNvbWIsPSAlcjIwLCVyMTksTCQxMTYzIDsjIDIzMTAgYmxldSsxCisJbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKK0wkMDI5NworCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQ4NyByZWxvYWRfb3V0c2krMi81CitMJDExNjQKKwlsZGIgMCglcjE5KSwlcjE5IDsjIDIzMTUgbW92cWkrMS81CisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjMxNiBleHRlbmRxaXNpMgorCWNvbWIsPD4gJXIxNywlcjE5LEwkMDMwMiA7IyAyMzIwIGJsZXUrMQorCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81CitMJDExNjMKKwlsZGIgMCglcjIwKSwlcjE5IDsjIDI1MjYgbW92cWkrMS81CisJbGRpIDQ1LCVyMSA7IyA4ODE5IHJlbG9hZF9vdXRzaSsyLzIKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyNTI3IGV4dGVuZHFpc2kyCisJY29tYiw8PixuICVyMSwlcjE5LEwkMDMwMCA7IyAyNTMxIGJsZXUrMQorCWxkYiAxKCVyMjApLCVyMTkgOyMgMjUzNSBtb3ZxaSsxLzUKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyNTM2IGV4dGVuZHFpc2kyCisJY29tYiw9LG4gJXIxNywlcjE5LEwkMDMwMCA7IyAyNTQwIGJsZXUrMQorCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDI1NTAgYmxldSsxCisJbGRvIDEoJXIyMCksJXIxOSA7IyAyNTU5IGFkZHNpMy8yCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNTYxIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDMwMgorCXN0dyAlcjYsLTUyKCVyMzApIDsjIDI1ODggcmVsb2FkX291dHNpKzIvNgorCWxkbyAtMjk2KCVyMzApLCVyMjYgOyMgMjU5MCBhZGRzaTMvMgorCWNvcHkgJXIxNiwlcjI1IDsjIDI1OTIgcmVsb2FkX291dHNpKzIvMQorCWNvcHkgJXIxNCwlcjI0IDsjIDI1OTQgcmVsb2FkX291dHNpKzIvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgY29tcGlsZV9yYW5nZSwlcjIgOyMgMjU5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWNvcHkgJXIxNSwlcjIzIDsjIDI1OTYgcmVsb2FkX291dHNpKzIvMQorCW1vdmIsPSAlcjI4LCVyNCxMJDExNjUgOyMgMjYwMyBkZWNyZW1lbnRfYW5kX2JyYW5jaF91bnRpbF96ZXJvKzIvMQorCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQzNiByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IKKwlibCBmcmVlLCVyMiA7IyAyNjA3IGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAyNjA1IHJlbG9hZF9vdXRzaSsyLzUKKwlibCBMJDA4NjcsJXIwIDsjIDI2MTEganVtcAorCWNvcHkgJXI0LCVyMjggOyMgMjYwOSByZWxvYWRfb3V0c2krMi8xCitMJDAzMDAKKwlsZHcgLTI1MiglcjMwKSwlcjEgOyMgODgyMiByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMSxMJDAzMDkgOyMgMjYyNCBibGV1KzEKKwlsZGkgOTEsJXIxIDsjIDg4MjUgcmVsb2FkX291dHNpKzIvMgorCWNvbWIsPD4gJXIxLCVyNyxMJDExNjYgOyMgMjYyOCBibGV1KzEKKwlsZGkgMCwlcjEzIDsjIDM2MjQgcmVsb2FkX291dHNpKzIvMgorCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjYzMCByZWxvYWRfb3V0c2krMi81CisJbGRiIDAoJXIyMCksJXIxOSA7IyAyNjMyIG1vdnFpKzEvNQorCWxkaSA1OCwlcjEgOyMgODgyOCByZWxvYWRfb3V0c2krMi8yCisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjYzMyBleHRlbmRxaXNpMgorCWNvbWIsPD4sbiAlcjEsJXIxOSxMJDExNjYgOyMgMjYzNyBibGV1KzEKKwljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyAyNjQ3IGJsZXUrMQorCWxkbyAxKCVyMjApLCVyMTkgOyMgMjY1NiBhZGRzaTMvMgorCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjY1OCByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMjY4OSBibGV1KzEKKwlsZGkgMCwlcjMgOyMgMjY4NCByZWxvYWRfb3V0c2krMi8yCitMJDAzMTcKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI3MDkgcmVsb2FkX291dHNpKzIvNQorCWNvbWIsPSAlcjE2LCVyMTksTCQwOTIyIDsjIDI3MTEgYmxldSsxCisJbGRvIDEoJXIxOSksJXIyMCA7IyAyNzIwIGFkZHNpMy8yCisJc3R3ICVyMjAsLTI5NiglcjMwKSA7IyAyNzIyIHJlbG9hZF9vdXRzaSsyLzYKKwljb21pYiw9IDAsJXIxNCxMJDAzMjEgOyMgMjcyOSBibGV1KzEKKwlsZGIgMCglcjE5KSwlcjcgOyMgMjcyNSB6ZXJvX2V4dGVuZHFpc2kyLzIKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgMjczMCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyNyA7IyAyNzMzIHplcm9fZXh0ZW5kcWlzaTIvMgorTCQwMzIxCisJbGRpIDU4LCVyMSA7IyA4ODMxIHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLD0gJXIxLCVyNyxMJDExNjcgOyMgMjc1MCBibGV1KzEKKwlhZGRsICVyMTEsJXIzLCVyMTkgOyMgMjc4OSBhZGRzaTMvMQorCWNvbWIsPSxuICVyMTcsJXI3LEwkMTE2NyA7IyAyNzU0IGJsZXUrMQorCWNvbWIsPSxuICVyMTYsJXIyMCxMJDExNjcgOyMgMjc1OCBibGV1KzEKKwljb21pYiw9IDYsJXIzLEwkMTE2NyA7IyAyNzYwIGJsZXUrMQorCWNvcHkgJXIzLCVyMjAgOyMgMjc3MCByZWxvYWRfb3V0c2krMi8xCisJbGRvIDEoJXIyMCksJXIxOSA7IyAyNzcxIGFkZHNpMy8yCisJZXh0cnUgJXIxOSwzMSw4LCVyMyA7IyAyNzcyIHplcm9fZXh0ZW5kcWlzaTIvMQorCWFkZGwgJXIxMSwlcjIwLCVyMjAgOyMgMjc3NiBhZGRzaTMvMQorCWJsIEwkMDMxNywlcjAgOyMgMjc4MyBqdW1wCisJc3RiICVyNywwKCVyMjApIDsjIDI3NzggbW92cWkrMS82CitMJDExNjcKKwljb21iLDw+ICVyMSwlcjcsTCQwMzI4IDsjIDI3OTYgYmxldSsxCisJc3RiICVyMCwwKCVyMTkpIDsjIDI3OTEgbW92cWkrMS82CisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNzk4IHJlbG9hZF9vdXRzaSsyLzUKKwlsZGIgMCglcjE5KSwlcjE5IDsjIDI4MDAgbW92cWkrMS81CisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjgwMSBleHRlbmRxaXNpMgorCWNvbWIsPD4gJXIxNywlcjE5LEwkMTE2OCA7IyAyODA1IGJsZXUrMQorCWxkaSAyNTUsJXIxOSA7IyA4MDY5IHJlbG9hZF9vdXRzaSsyLzIKKwljb3B5ICVyMTEsJXIyNiA7IyAyODEzIHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMTYsJXIxIDsjIDg4MzUgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDE2KCVyMSksJXIxIDsjIDg4MzYgbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAyODE3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAyODE1IHJlbG9hZF9vdXRzaSsyLzEKKwljb3B5ICVyMTEsJXIyNiA7IyAyODI5IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMTcsJXIxIDsjIDg4MzcgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDE3KCVyMSksJXIxIDsjIDg4MzggbW92aGktMgorCWNvcHkgJXIxLCVyMjUgOyMgMjgzMSByZWxvYWRfb3V0c2krMi8xCisJY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODIxIHNjYworCWxkaSAxLCVyMjgKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIgOyMgMjgzMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCXN0dyAlcjI4LC0yNDQoJXIzMCkgOyMgODg0MSByZWxvYWRfb3V0c2krMi82CisJY29weSAlcjExLCVyMjYgOyMgMjg0NSByZWxvYWRfb3V0c2krMi8xCisJbGRpbCBMUidMJEMwMDE4LCVyMSA7IyA4ODQyIGFkZF9oaWdoX2NvbnN0KzMKKwlsZG8gUlInTCRDMDAxOCglcjEpLCVyMSA7IyA4ODQzIG1vdmhpLTIKKwljb3B5ICVyMSwlcjI1IDsjIDI4NDcgcmVsb2FkX291dHNpKzIvMQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjgzNyBzY2MKKwlsZGkgMSwlcjI4CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDI4NDkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlzdHcgJXIyOCwtMjM2KCVyMzApIDsjIDg4NDYgcmVsb2FkX291dHNpKzIvNgorCWNvcHkgJXIxMSwlcjI2IDsjIDI4NjEgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTFInTCRDMDAxOSwlcjEgOyMgODg0NyBhZGRfaGlnaF9jb25zdCszCisJbGRvIFJSJ0wkQzAwMTkoJXIxKSwlcjEgOyMgODg0OCBtb3ZoaS0yCisJY29weSAlcjEsJXIyNSA7IyAyODYzIHJlbG9hZF9vdXRzaSsyLzEKKwljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4NTMgc2NjCisJbGRpIDEsJXIyOAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAyODY1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJc3R3ICVyMjgsLTIyOCglcjMwKSA7IyA4ODUxIHJlbG9hZF9vdXRzaSsyLzYKKwljb3B5ICVyMTEsJXIyNiA7IyAyODc3IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjAsJXIxIDsjIDg4NTIgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDIwKCVyMSksJXIxIDsjIDg4NTMgbW92aGktMgorCWNvcHkgJXIxLCVyMjUgOyMgMjg3OSByZWxvYWRfb3V0c2krMi8xCisJY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODY5IHNjYworCWxkaSAxLCVyMjgKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIgOyMgMjg4MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCXN0dyAlcjI4LC0yMjAoJXIzMCkgOyMgODg1NiByZWxvYWRfb3V0c2krMi82CisJY29weSAlcjExLCVyMjYgOyMgMjg5MyByZWxvYWRfb3V0c2krMi8xCisJbGRpbCBMUidMJEMwMDIxLCVyMSA7IyA4ODU3IGFkZF9oaWdoX2NvbnN0KzMKKwlsZG8gUlInTCRDMDAyMSglcjEpLCVyMSA7IyA4ODU4IG1vdmhpLTIKKwljb3B5ICVyMSwlcjI1IDsjIDI4OTUgcmVsb2FkX291dHNpKzIvMQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg4NSBzY2MKKwlsZGkgMSwlcjI4CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDI4OTcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlzdHcgJXIyOCwtMjEyKCVyMzApIDsjIDg4NjEgcmVsb2FkX291dHNpKzIvNgorCWNvcHkgJXIxMSwlcjI2IDsjIDI5MDkgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTFInTCRDMDAyMiwlcjEgOyMgODg2MiBhZGRfaGlnaF9jb25zdCszCisJbGRvIFJSJ0wkQzAwMjIoJXIxKSwlcjEgOyMgODg2MyBtb3ZoaS0yCisJY29weSAlcjEsJXIyNSA7IyAyOTExIHJlbG9hZF9vdXRzaSsyLzEKKwljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MDEgc2NjCisJbGRpIDEsJXIyOAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAyOTEzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJc3R3ICVyMjgsLTIwNCglcjMwKSA7IyA4ODY2IHJlbG9hZF9vdXRzaSsyLzYKKwljb3B5ICVyMTEsJXIyNiA7IyAyOTI1IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjMsJXIxIDsjIDg4NjcgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDIzKCVyMSksJXIxIDsjIDg4NjggbW92aGktMgorCWNvcHkgJXIxLCVyMjUgOyMgMjkyNyByZWxvYWRfb3V0c2krMi8xCisJY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTE3IHNjYworCWxkaSAxLCVyMjgKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIgOyMgMjkyOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCXN0dyAlcjI4LC0xOTYoJXIzMCkgOyMgODg3MSByZWxvYWRfb3V0c2krMi82CisJY29weSAlcjExLCVyMjYgOyMgMjk0MSByZWxvYWRfb3V0c2krMi8xCisJbGRpbCBMUidMJEMwMDI0LCVyMSA7IyA4ODcyIGFkZF9oaWdoX2NvbnN0KzMKKwlsZG8gUlInTCRDMDAyNCglcjEpLCVyMSA7IyA4ODczIG1vdmhpLTIKKwljb3B5ICVyMSwlcjI1IDsjIDI5NDMgcmVsb2FkX291dHNpKzIvMQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkzMyBzY2MKKwlsZGkgMSwlcjI4CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDI5NDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlzdHcgJXIyOCwtMTg4KCVyMzApIDsjIDg4NzYgcmVsb2FkX291dHNpKzIvNgorCWNvcHkgJXIxMSwlcjI2IDsjIDI5NTcgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTFInTCRDMDAyNSwlcjEgOyMgODg3NyBhZGRfaGlnaF9jb25zdCszCisJbGRvIFJSJ0wkQzAwMjUoJXIxKSwlcjEgOyMgODg3OCBtb3ZoaS0yCisJY29weSAlcjEsJXIyNSA7IyAyOTU5IHJlbG9hZF9vdXRzaSsyLzEKKwljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5NDkgc2NjCisJbGRpIDEsJXIyOAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAyOTYxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJc3R3ICVyMjgsLTE4MCglcjMwKSA7IyA4ODgxIHJlbG9hZF9vdXRzaSsyLzYKKwljb3B5ICVyMTEsJXIyNiA7IyAyOTczIHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjYsJXIxOSA7IyAyOTcwIGFkZF9oaWdoX2NvbnN0KzMKKwlsZG8gUlInTCRDMDAyNiglcjE5KSwlcjMgOyMgMjk3MSBtb3ZoaS0yCisJY29weSAlcjMsJXIyNSA7IyAyOTc1IHJlbG9hZF9vdXRzaSsyLzEKKwljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5NjUgc2NjCisJbGRpIDEsJXIyOAorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAyOTc3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJc3R3ICVyMjgsLTE3MiglcjMwKSA7IyA4ODg0IHJlbG9hZF9vdXRzaSsyLzYKKwljb3B5ICVyMTEsJXIyNiA7IyAyOTg5IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjcsJXIxOSA7IyAyOTg2IGFkZF9oaWdoX2NvbnN0KzMKKwlsZG8gUlInTCRDMDAyNyglcjE5KSwlcjQgOyMgMjk4NyBtb3ZoaS0yCisJY29taWNsciw8PiAwLCVyMjgsJXIxMyA7IyAyOTgxIHNjYworCWxkaSAxLCVyMTMKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIgOyMgMjk5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWNvcHkgJXI0LCVyMjUgOyMgMjk5MSByZWxvYWRfb3V0c2krMi8xCisJY29weSAlcjExLCVyMjYgOyMgMzAwNSByZWxvYWRfb3V0c2krMi8xCisJbGRpbCBMUidMJEMwMDE3LCVyMSA7IyA4ODg1IGFkZF9oaWdoX2NvbnN0KzMKKwlsZG8gUlInTCRDMDAxNyglcjEpLCVyMSA7IyA4ODg2IG1vdmhpLTIKKwljb21pY2xyLDw+IDAsJXIyOCwlcjcgOyMgMjk5NyBzY2MKKwlsZGkgMSwlcjcKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHN0cmNtcCwlcjIgOyMgMzAwOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWNvcHkgJXIxLCVyMjUgOyMgMzAwNyByZWxvYWRfb3V0c2krMi8xCisJY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwMTMgYmxldSsxCisJY29weSAlcjExLCVyMjYgOyMgMzAxOCByZWxvYWRfb3V0c2krMi8xCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDMwMjIgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyMywlcjI1IDsjIDMwMjAgcmVsb2FkX291dHNpKzIvMQorCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDI2IGJsZXUrMQorCWNvcHkgJXIxMSwlcjI2IDsjIDMwMzEgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTFInTCRDMDAyMiwlcjEgOyMgODg4NyBhZGRfaGlnaF9jb25zdCszCisJbGRvIFJSJ0wkQzAwMjIoJXIxKSwlcjEgOyMgODg4OCBtb3ZoaS0yCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDMwMzUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyMSwlcjI1IDsjIDMwMzMgcmVsb2FkX291dHNpKzIvMQorCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDM5IGJsZXUrMQorCWNvcHkgJXIxMSwlcjI2IDsjIDMwNDQgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTFInTCRDMDAyMCwlcjEgOyMgODg4OSBhZGRfaGlnaF9jb25zdCszCisJbGRvIFJSJ0wkQzAwMjAoJXIxKSwlcjEgOyMgODg5MCBtb3ZoaS0yCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDMwNDggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyMSwlcjI1IDsjIDMwNDYgcmVsb2FkX291dHNpKzIvMQorCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDUyIGJsZXUrMQorCWNvcHkgJXIxMSwlcjI2IDsjIDMwNTcgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTFInTCRDMDAxNiwlcjEgOyMgODg5MSBhZGRfaGlnaF9jb25zdCszCisJbGRvIFJSJ0wkQzAwMTYoJXIxKSwlcjEgOyMgODg5MiBtb3ZoaS0yCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCBzdHJjbXAsJXIyIDsjIDMwNjEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyMSwlcjI1IDsjIDMwNTkgcmVsb2FkX291dHNpKzIvMQorCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDY1IGJsZXUrMQorCWNvcHkgJXIxMSwlcjI2IDsjIDMwNzAgcmVsb2FkX291dHNpKzIvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMDc0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjQsJXIyNSA7IyAzMDcyIHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA3OCBibGV1KzEKKwljb3B5ICVyMTEsJXIyNiA7IyAzMDgzIHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjUsJXIxIDsjIDg4OTMgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDI1KCVyMSksJXIxIDsjIDg4OTQgbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMDg3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAzMDg1IHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA5MSBibGV1KzEKKwljb3B5ICVyMTEsJXIyNiA7IyAzMDk2IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjMsJXIxIDsjIDg4OTUgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDIzKCVyMSksJXIxIDsjIDg4OTYgbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMTAwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAzMDk4IHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzEwNCBibGV1KzEKKwljb3B5ICVyMTEsJXIyNiA7IyAzMTA5IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjQsJXIxIDsjIDg4OTcgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDI0KCVyMSksJXIxIDsjIDg4OTggbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMTEzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAzMTExIHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzExNyBibGV1KzEKKwljb3B5ICVyMTEsJXIyNiA7IyAzMTIyIHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMjEsJXIxIDsjIDg4OTkgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDIxKCVyMSksJXIxIDsjIDg5MDAgbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMTI2IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAzMTI0IHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzEzMCBibGV1KzEKKwljb3B5ICVyMTEsJXIyNiA7IyAzMTM1IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMTksJXIxIDsjIDg5MDEgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDE5KCVyMSksJXIxIDsjIDg5MDIgbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMTM5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAzMTM3IHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzE0MyBibGV1KzEKKwljb3B5ICVyMTEsJXIyNiA7IyAzMTQ4IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIExSJ0wkQzAwMTgsJXIxIDsjIDg5MDMgYWRkX2hpZ2hfY29uc3QrMworCWxkbyBSUidMJEMwMDE4KCVyMSksJXIxIDsjIDg5MDQgbW92aGktMgorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgc3RyY21wLCVyMiA7IyAzMTUyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJY29weSAlcjEsJXIyNSA7IyAzMTUwIHJlbG9hZF9vdXRzaSsyLzEKKwljb21pYiw8PixuIDAsJXIyOCxMJDA5MDAgOyMgMzE1NiBibGV1KzEKK0wkMDMyOQorCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMzE3MyByZWxvYWRfb3V0c2krMi81CisJY29tYiw9ICVyMTYsJXIxOSxMJDA5MjIgOyMgMzE3NSBibGV1KzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDMxODQgYWRkc2kzLzIKKwljb21iLD0gJXIxNiwlcjE5LEwkMDkwMiA7IyAzMjE0IGJsZXUrMQorCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMzE4NiByZWxvYWRfb3V0c2krMi82CisJbGRpIDAsJXIyMiA7IyAzMjI3IHJlbG9hZF9vdXRzaSsyLzIKKwlhZGRpbCBMUidfX2FsbnVtLSRnbG9iYWwkLCVyMjcgOyMgODU5NiBwaWMyX2xvX3N1bSsxCisJY29weSAlcjEsJXIyIDsjIDg5MDcgcmVsb2FkX291dHNpKzIvMQorCWFkZGlsIExSJ19fY3R5cGUyLSRnbG9iYWwkLCVyMjcgOyMgODU5OCBwaWMyX2xvX3N1bSsxCisJY29weSAlcjEsJXIyMyA7IyA4OTEwIHJlbG9hZF9vdXRzaSsyLzEKKwlhZGRpbCBMUidfX2N0eXBlLSRnbG9iYWwkLCVyMjcgOyMgODYwMCBwaWMyX2xvX3N1bSsxCisJY29weSAlcjEsJXI0IDsjIDg5MTMgcmVsb2FkX291dHNpKzIvMQorCWxkaSAzMiwlcjI1IDsjIDg2MDUgcmVsb2FkX291dHNpKzIvMgorCWxkaSAyLCVyMjQgOyMgODYwNyByZWxvYWRfb3V0c2krMi8yCisJbGRpIDE2LCVyMzEgOyMgODYwOSByZWxvYWRfb3V0c2krMi8yCisJbGRpIDgsJXIyOSA7IyA4NjExIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgMTI4LCVyMjggOyMgODYxMyByZWxvYWRfb3V0c2krMi8yCisJbGRpIDI1NSwlcjI2IDsjIDg2MTUgcmVsb2FkX291dHNpKzIvMgorCWxkdyAtMjQ0KCVyMzApLCVyMSA7IyA4OTE2IHJlbG9hZF9vdXRzaSsyLzUKK0wkMTE3MworCWNvbWliLD0sbiAwLCVyMSxMJDAzNDMgOyMgMzI0MCBibGV1KzEKKwlzdHcgJXIyMixSUidfX2FsbnVtLSRnbG9iYWwkKCVyMikgOyMgMzI0NCByZWxvYWRfb3V0c2krMi82CisJbGR3IFJSJ19fY3R5cGUyLSRnbG9iYWwkKCVyMjMpLCVyMTkgOyMgMzI0OCByZWxvYWRfb3V0c2krMi81CisJbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjIxIDsjIDMyNjAgcmVsb2FkX291dHNpKzIvNQorCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzI1MyBhZGRzaTMvMQorCWFkZGwgJXIyMSwlcjIyLCVyMjEgOyMgMzI2NSBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyMjAgOyMgMzI1NSBtb3ZxaSsxLzUKKwlsZGIgMCglcjIxKSwlcjE5IDsjIDMyNjcgbW92cWkrMS81CisJZXh0cnUgJXIyMCwzMSwxLCVyMjAgOyMgMzI1NiBhbmRzaTMvMQorCWFuZCAlcjE5LCVyMTgsJXIxOSA7IyAzMjcwIGFuZHNpMy8xCisJb3IgJXIyMCwlcjE5LCVyMjAgOyMgMzI3OCB4b3JkaTMtMQorCWNvbWliLDw+IDAsJXIyMCxMJDExNjkgOyMgMzI4MCBibGV1KzEKKwlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQorTCQwMzQzCisJbGR3IC0yMzYoJXIzMCksJXIxIDsjIDg5MTkgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjEsTCQwMzQ0IDsjIDMyODUgYmxldSsxCisJbGR3IFJSJ19fY3R5cGUyLSRnbG9iYWwkKCVyMjMpLCVyMTkgOyMgMzI4OSByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMjkwIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzMjkyIG1vdnFpKzEvNQorCWJiLDwgJXIxOSwzMSxMJDExNjkgOyMgMzI5NiBibGV1KzMKKwlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQorTCQwMzQ0CisJbGR3IC0yMjgoJXIzMCksJXIxIDsjIDg5MjIgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0sbiAwLCVyMSxMJDAzNDUgOyMgMzMwMSBibGV1KzEKKwljb21iLD0gJXIyNSwlcjIyLEwkMTE2OSA7IyAzMzA1IGJsZXUrMQorCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCisJY29taWIsPSA5LCVyMjIsTCQxMTcwIDsjIDMzMDcgYmxldSsxCisJZXh0cnUgJXIxOSwyOCwyOSwlcjIxIDsjIDMzMzIgbHNocnNpMy8yCitMJDAzNDUKKwlsZHcgLTIyMCglcjMwKSwlcjEgOyMgODkyNSByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMSxMJDAzNDEgOyMgMzMxMiBibGV1KzEKKwlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzMxNiByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzE3IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzMzE5IG1vdnFpKzEvNQorCWFuZCAlcjE5LCVyMjUsJXIxOSA7IyAzMzIyIGFuZHNpMy8xCisJY29taWIsPSAwLCVyMTksTCQwMzQxIDsjIDMzMjUgYmxldSsxCisJZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKK0wkMTE2OQorCWV4dHJ1ICVyMTksMjgsMjksJXIyMSA7IyAzMzMyIGxzaHJzaTMvMgorTCQxMTcwCisJYWRkbCAlcjYsJXIyMSwlcjIxIDsjIDMzMzUgYWRkc2kzLzEKKwlleHRydSAlcjE5LDMxLDMsJXIxOSA7IyAzMzM5IGFuZHNpMy8xCisJc3ViaSAzMSwlcjE5LCVyMTkgOyMgMzM0MCBzdWJzaTMvMgorCWxkYiAwKCVyMjEpLCVyMjAgOyMgMzM0MyBtb3ZxaSsxLzUKKwltdHNhciAlcjE5IDsjIDg5MjggcmVsb2FkX291dHNpKzIvNworCXZkZXBpIC0xLDEsJXIyMCA7IyAzMzQ4IHZkZXBpX2lvcgorCXN0YiAlcjIwLDAoJXIyMSkgOyMgMzM1MCBtb3ZxaSsxLzYKK0wkMDM0MQorCWxkdyAtMjEyKCVyMzApLCVyMSA7IyA4OTMxIHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIxLEwkMDM0OCA7IyAzMzU0IGJsZXUrMQorCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzU4IHJlbG9hZF9vdXRzaSsyLzUKKwlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzNTkgYWRkc2kzLzEKKwlsZGIgMCglcjE5KSwlcjE5IDsjIDMzNjEgbW92cWkrMS81CisJYW5kICVyMTksJXIxOCwlcjE5IDsjIDMzNjQgYW5kc2kzLzEKKwljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDMzNjcgYmxldSsxCisJZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKK0wkMDM0OAorCWxkdyAtMjA0KCVyMzApLCVyMSA7IyA4OTM0IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIxLEwkMDM0OSA7IyAzMzcyIGJsZXUrMQorCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMzNzYgcmVsb2FkX291dHNpKzIvNQorCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzM3NyBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzM3OSBtb3ZxaSsxLzUKKwlhbmQgJXIxOSwlcjI0LCVyMTkgOyMgMzM4MiBhbmRzaTMvMQorCWNvbWliLDw+IDAsJXIxOSxMJDExNzEgOyMgMzM4NSBibGV1KzEKKwlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQorTCQwMzQ5CisJbGR3IC0xOTYoJXIzMCksJXIxIDsjIDg5MzcgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjEsTCQwMzUwIDsjIDMzOTAgYmxldSsxCisJbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzOTQgcmVsb2FkX291dHNpKzIvNQorCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzM5NSBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzM5NyBtb3ZxaSsxLzUKKwlhbmQgJXIxOSwlcjI0LCVyMTkgOyMgMzQwMCBhbmRzaTMvMQorCWNvbWliLDw+IDAsJXIxOSxMJDExNzEgOyMgMzQwMyBibGV1KzEKKwlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNDI2IHplcm9fZXh0ZW5kcWlzaTIvMQorTCQwMzUwCisJbGR3IC0xODgoJXIzMCksJXIxIDsjIDg5NDAgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjEsTCQwMzQ2IDsjIDM0MDggYmxldSsxCisJbGR3IFJSJ19fY3R5cGUyLSRnbG9iYWwkKCVyMjMpLCVyMTkgOyMgMzQxMiByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzNDEzIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzNDE1IG1vdnFpKzEvNQorCWFuZCAlcjE5LCVyMTgsJXIxOSA7IyAzNDE4IGFuZHNpMy8xCisJY29taWIsPSAwLCVyMTksTCQwMzQ2IDsjIDM0MjEgYmxldSsxCisJZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKK0wkMTE3MQorCWV4dHJ1ICVyMTksMjgsMjksJXIyMSA7IyAzNDI4IGxzaHJzaTMvMgorCWFkZGwgJXI2LCVyMjEsJXIyMSA7IyAzNDMxIGFkZHNpMy8xCisJZXh0cnUgJXIxOSwzMSwzLCVyMTkgOyMgMzQzNSBhbmRzaTMvMQorCXN1YmkgMzEsJXIxOSwlcjE5IDsjIDM0MzYgc3Vic2kzLzIKKwlsZGIgMCglcjIxKSwlcjIwIDsjIDM0MzkgbW92cWkrMS81CisJbXRzYXIgJXIxOSA7IyA4OTQzIHJlbG9hZF9vdXRzaSsyLzcKKwl2ZGVwaSAtMSwxLCVyMjAgOyMgMzQ0NCB2ZGVwaV9pb3IKKwlzdGIgJXIyMCwwKCVyMjEpIDsjIDM0NDYgbW92cWkrMS82CitMJDAzNDYKKwlsZHcgLTE4MCglcjMwKSwlcjEgOyMgODk0NiByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMSxMJDAzNTMgOyMgMzQ1MCBibGV1KzEKKwlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzQ1NCByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzNDU1IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzNDU3IG1vdnFpKzEvNQorCWFuZCAlcjE5LCVyMzEsJXIxOSA7IyAzNDYwIGFuZHNpMy8xCisJY29taWIsPD4gMCwlcjE5LEwkMTE3MiA7IyAzNDYzIGJsZXUrMQorCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCitMJDAzNTMKKwlsZHcgLTE3MiglcjMwKSwlcjEgOyMgODk0OSByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMSxMJDAzNTQgOyMgMzQ2OCBibGV1KzEKKwlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzQ3MiByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzNDczIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzNDc1IG1vdnFpKzEvNQorCWFuZCAlcjE5LCVyMjksJXIxOSA7IyAzNDc4IGFuZHNpMy8xCisJY29taWIsPD4gMCwlcjE5LEwkMTE3MiA7IyAzNDgxIGJsZXUrMQorCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCitMJDAzNTQKKwljb21pYiw9IDAsJXIxMyxMJDAzNTUgOyMgMzQ4NiBibGV1KzEKKwlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzQ5MCByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzNDkxIGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzNDkzIG1vdnFpKzEvNQorCWJiLDwgJXIxOSwzMSxMJDExNzIgOyMgMzQ5NyBibGV1KzMKKwlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQorTCQwMzU1CisJY29taWIsPSAwLCVyNyxMJDAzMzkgOyMgMzUwMiBibGV1KzEKKwlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzUwNiByZWxvYWRfb3V0c2krMi81CisJYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzNTA3IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyAzNTA5IG1vdnFpKzEvNQorCWFuZCAlcjE5LCVyMjgsJXIxOSA7IyAzNTEyIGFuZHNpMy8xCisJY29taWIsPSAwLCVyMTksTCQwMzM5IDsjIDM1MTUgYmxldSsxCisJZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKK0wkMTE3MgorCWV4dHJ1ICVyMTksMjgsMjksJXIyMSA7IyAzNTIyIGxzaHJzaTMvMgorCWFkZGwgJXI2LCVyMjEsJXIyMSA7IyAzNTI1IGFkZHNpMy8xCisJZXh0cnUgJXIxOSwzMSwzLCVyMTkgOyMgMzUyOSBhbmRzaTMvMQorCXN1YmkgMzEsJXIxOSwlcjE5IDsjIDM1MzAgc3Vic2kzLzIKKwlsZGIgMCglcjIxKSwlcjIwIDsjIDM1MzMgbW92cWkrMS81CisJbXRzYXIgJXIxOSA7IyA4OTUyIHJlbG9hZF9vdXRzaSsyLzcKKwl2ZGVwaSAtMSwxLCVyMjAgOyMgMzUzOCB2ZGVwaV9pb3IKKwlzdGIgJXIyMCwwKCVyMjEpIDsjIDM1NDAgbW92cWkrMS82CitMJDAzMzkKKwlsZG8gMSglcjIyKSwlcjIyIDsjIDM1NDYgYWRkc2kzLzIKKwljb21iLD49LG4gJXIyNiwlcjIyLEwkMTE3MyA7IyAzMjMzIGJsZXUrMQorCWxkdyAtMjQ0KCVyMzApLCVyMSA7IyA4OTE2IHJlbG9hZF9vdXRzaSsyLzUKKwlibCBMJDAyNzUsJXIwIDsjIDM1NTkganVtcAorCWxkaSAxLCVyMTMgOyMgMzU1NiByZWxvYWRfb3V0c2krMi8yCitMJDAzMjgKKwlsZGkgMjU1LCVyMTkgOyMgODA2OSByZWxvYWRfb3V0c2krMi8yCitMJDExNjgKKwljb21iLD0gJXIxOSwlcjMsTCQwMzU5IDsjIDgwNzAgYmxldSsxCisJY29weSAlcjE5LCVyMjEgOyMgODU5NSByZWxvYWRfb3V0c2krMi8xCitMJDAzNjAKKwlsZG8gLTEoJXIzKSwlcjIwIDsjIDM1NzEgYWRkc2kzLzIKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDM1ODMgcmVsb2FkX291dHNpKzIvNQorCWV4dHJ1ICVyMjAsMzEsOCwlcjMgOyMgMzU3MiB6ZXJvX2V4dGVuZHFpc2kyLzEKKwlsZG8gLTEoJXIxOSksJXIxOSA7IyAzNTg0IGFkZHNpMy8yCisJY29tYiw8PiAlcjIxLCVyMyxMJDAzNjAgOyMgMzU3NyBibGV1KzEKKwlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDM1ODggcmVsb2FkX291dHNpKzIvNgorTCQwMzU5CisJbGRiIDExKCVyNiksJXIxOSA7IyAzNTk5IG1vdnFpKzEvNQorCWRlcGkgLTEsMjgsMSwlcjE5IDsjIDM2MDEgaW9yc2kzKzEvMgorCXN0YiAlcjE5LDExKCVyNikgOyMgMzYwMyBtb3ZxaSsxLzYKKwlsZGIgNyglcjYpLCVyMTkgOyMgMzYwNiBtb3ZxaSsxLzUKKwlsZGkgMCwlcjEzIDsjIDM2MTMgcmVsb2FkX291dHNpKzIvMgorCWRlcGkgLTEsMjksMSwlcjE5IDsjIDM2MDggaW9yc2kzKzEvMgorCWJsIEwkMDI3NSwlcjAgOyMgMzYxOCBqdW1wCisJc3RiICVyMTksNyglcjYpIDsjIDM2MTAgbW92cWkrMS82CitMJDAzMDkKKwlsZGkgMCwlcjEzIDsjIDM2MjQgcmVsb2FkX291dHNpKzIvMgorTCQxMTY2CisJZXh0cnUgJXI3LDIxKzgtMSw4LCVyMTkgOyMgMzYyNyBleHR6dgorCWFkZGwgJXI2LCVyMTksJXIxOSA7IyAzNjMwIGFkZHNpMy8xCisJZXh0cnUgJXI3LDMxLDMsJXIyMCA7IyAzNjMzIGFuZHNpMy8xCitMJDA5NDgKKwlzdWJpIDMxLCVyMjAsJXIyMCA7IyAzNjM0IHN1YnNpMy8yCisJbGRiIDAoJXIxOSksJXIyMSA7IyAzNjM3IG1vdnFpKzEvNQorCW10c2FyICVyMjAgOyMgODk1NSByZWxvYWRfb3V0c2krMi83CisJdmRlcGkgLTEsMSwlcjIxIDsjIDM2NDIgdmRlcGlfaW9yCisJYmwgTCQwMjc1LCVyMCA7IyAzNjUzIGp1bXAKKwlzdGIgJXIyMSwwKCVyMTkpIDsjIDM2NDQgbW92cWkrMS82CitMJDAyNzYKKwlsZGIgLTEoJXI2KSwlcjIwIDsjIDgwNzQgbW92cWkrMS81CisJZXh0cnUgJXIyMCwzMSw4LCVyMTkgOyMgODA3NSB6ZXJvX2V4dGVuZHFpc2kyLzEKKwljb21pYiw9IDAsJXIxOSxMJDAzNjQgOyMgODA3NiBibGV1KzEKKwlhZGRsICVyMTksJXI2LCVyMTkgOyMgODA3OSBhZGRzaTMvMQorCWxkYiAtMSglcjE5KSwlcjE5IDsjIDgwODIgemVyb19leHRlbmRxaXNpMi8yCisJY29taWIsPD4gMCwlcjE5LEwkMDM2NCA7IyA4MDgzIGJsZXUrMQorCWxkbyAtMSglcjIwKSwlcjE5IDsjIDgyNDIgYWRkc2kzLzIKKwlibCBMJDExODMsJXIwIDsjIDgyNTMganVtcAorCXN0YiAlcjE5LC0xKCVyNikgOyMgMzY4OCBtb3ZxaSsxLzYKK0wkMDM2NQorCWxkbyAtMSglcjE5KSwlcjE5IDsjIDM2ODYgYWRkc2kzLzIKKwlzdGIgJXIxOSwtMSglcjYpIDsjIDM2ODggbW92cWkrMS82CitMJDExODMKKwlleHRydSAlcjE5LDMxLDgsJXIxOSA7IyAzNjYyIHplcm9fZXh0ZW5kcWlzaTIvMQorCWNvbWliLD0gMCwlcjE5LEwkMDM2NCA7IyAzNjY0IGJsZXUrMQorCWFkZGwgJXIxOSwlcjYsJXIxOSA7IyAzNjY4IGFkZHNpMy8xCisJbGRiIC0xKCVyMTkpLCVyMTkgOyMgMzY3MiB6ZXJvX2V4dGVuZHFpc2kyLzIKKwljb21pYiw9LG4gMCwlcjE5LEwkMDM2NSA7IyAzNjc0IGJsZXUrMQorCWxkYiAtMSglcjYpLCVyMTkgOyMgMzY4MyBtb3ZxaSsxLzUKK0wkMDM2NAorCWxkYiAtMSglcjYpLCVyMTkgOyMgMzcwMCB6ZXJvX2V4dGVuZHFpc2kyLzIKKwlibCBMJDAwNDMsJXIwIDsjIDM3MDUganVtcAorCWFkZGwgJXI2LCVyMTksJXI2IDsjIDM3MDEgYWRkc2kzLzEKK0wkMDM2OAorCWJiLD49LG4gJXIxNSwxOCxMJDAwNzYgOyMgMzcxMyBtb3ZzaS00CisJYmwgTCQxMTgxLCVyMCA7IyAzNzIxIGp1bXAKKwlsZHcgMjQoJXI1KSwlcjE5IDsjIDM4NjEgcmVsb2FkX291dHNpKzIvNQorTCQwMzcyCisJYmIsPj0sbiAlcjE1LDE4LEwkMDA3NiA7IyAzNzMwIG1vdnNpLTQKKwlibCxuIEwkMDM3NCwlcjAgOyMgMzczOCBqdW1wCitMJDAzNzYKKwliYiw+PSxuICVyMTUsMjAsTCQwMDc2IDsjIDM3NDcgbW92c2ktNAorCWJsLG4gTCQwMzc4LCVyMCA7IyAzNzU1IGp1bXAKK0wkMDM4MAorCWJiLD49LG4gJXIxNSwxNixMJDAwNzYgOyMgMzc2NCBtb3ZzaS00CisJYmwsbiBMJDAzNzgsJXIwIDsjIDM3NzIganVtcAorTCQwMzgzCisJYW5kICVyMTUsJXIyMCwlcjE5IDsjIDM3NzkgYW5kc2kzLzEKKwljb21iLD0gJXIyMCwlcjE5LEwkMTE3NCA7IyAzNzgzIGJsZXUrMQorCWxkaSAtMSwlcjQgOyMgNTA3NCByZWxvYWRfb3V0c2krMi8yCisJYmwsbiBMJDAwNzYsJXIwIDsjIDM3OTEganVtcAorTCQwMzg3CisJY29tYiw9LG4gJXIxNiwlcjE5LEwkMDkwMyA7IyAzNzk5IGJsZXUrMQorCWxkYiAwKCVyMTkpLCVyNyA7IyAzODMxIHplcm9fZXh0ZW5kcWlzaTIvMgorCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzgyNiBhZGRzaTMvMgorCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMzgyOCByZWxvYWRfb3V0c2krMi82CisJbGRvIC0zOSglcjcpLCVyMTkgOyMgNzQ0NiBhZGRzaTMvMgorCWFkZGksdXYgLTg2LCVyMTksJXIwIDsjIDc0NDcgY2FzZXNpMAorCWJscixuICVyMTksJXIwCisJYixuIEwkMDM5NworTCQwODE3CisJYmwgTCQwNzU5LCVyMCA7IyA5NDM3IHN3aXRjaF9qdW1wCisJbGR3IDAoJXI1KSwlcjQgOyMgODIwNCByZWxvYWRfb3V0c2krMi81CitMJDEwNjkKKwlibCBMJDAzOTUsJXIwCisJbm9wIDsjIDk0NDAgc3dpdGNoX2p1bXAKK0wkMTA3MAorCWJsIEwkMDQyMiwlcjAKKwlub3AgOyMgOTQ0MyBzd2l0Y2hfanVtcAorTCQxMDcxCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NDQ2IHN3aXRjaF9qdW1wCitMJDEwNzIKKwlibCBMJDA4MTEsJXIwCisJbm9wIDsjIDk0NDkgc3dpdGNoX2p1bXAKK0wkMTA3MworCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTQ1MiBzd2l0Y2hfanVtcAorTCQxMDc0CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NDU1IHN3aXRjaF9qdW1wCitMJDEwNzUKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk0NTggc3dpdGNoX2p1bXAKK0wkMTA3NgorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTQ2MSBzd2l0Y2hfanVtcAorTCQxMDc3CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NDY0IHN3aXRjaF9qdW1wCitMJDEwNzgKKwlibCBMJDA3ODcsJXIwCisJbm9wIDsjIDk0Njcgc3dpdGNoX2p1bXAKK0wkMTA3OQorCWJsIEwkMDc4NywlcjAKKwlub3AgOyMgOTQ3MCBzd2l0Y2hfanVtcAorTCQxMDgwCisJYmwgTCQwNzg3LCVyMAorCW5vcCA7IyA5NDczIHN3aXRjaF9qdW1wCitMJDEwODEKKwlibCBMJDA3ODcsJXIwCisJbm9wIDsjIDk0NzYgc3dpdGNoX2p1bXAKK0wkMTA4MgorCWJsIEwkMDc4NywlcjAKKwlub3AgOyMgOTQ3OSBzd2l0Y2hfanVtcAorTCQxMDgzCisJYmwgTCQwNzg3LCVyMAorCW5vcCA7IyA5NDgyIHN3aXRjaF9qdW1wCitMJDEwODQKKwlibCBMJDA3ODcsJXIwCisJbm9wIDsjIDk0ODUgc3dpdGNoX2p1bXAKK0wkMTA4NQorCWJsIEwkMDc4NywlcjAKKwlub3AgOyMgOTQ4OCBzd2l0Y2hfanVtcAorTCQxMDg2CisJYmwgTCQwNzg3LCVyMAorCW5vcCA7IyA5NDkxIHN3aXRjaF9qdW1wCitMJDEwODcKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk0OTQgc3dpdGNoX2p1bXAKK0wkMTA4OAorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTQ5NyBzd2l0Y2hfanVtcAorTCQxMDg5CisJYmwgTCQwNjU5LCVyMCA7IyA5NTAwIHN3aXRjaF9qdW1wCisJbGR3IDAoJXI1KSwlcjQgOyMgODE2NCByZWxvYWRfb3V0c2krMi81CitMJDEwOTAKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1MDMgc3dpdGNoX2p1bXAKK0wkMTA5MQorCWJsIEwkMDY3OSwlcjAgOyMgOTUwNiBzd2l0Y2hfanVtcAorCWxkdyAwKCVyNSksJXI0IDsjIDgxNzIgcmVsb2FkX291dHNpKzIvNQorTCQxMDkyCisJYmwgTCQwODExLCVyMAorCW5vcCA7IyA5NTA5IHN3aXRjaF9qdW1wCitMJDEwOTMKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1MTIgc3dpdGNoX2p1bXAKK0wkMTA5NAorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTUxNSBzd2l0Y2hfanVtcAorTCQxMDk1CisJYmwgTCQwNzE5LCVyMCA7IyA5NTE4IHN3aXRjaF9qdW1wCisJbGR3IDAoJXI1KSwlcjQgOyMgODE4OCByZWxvYWRfb3V0c2krMi81CitMJDEwOTYKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1MjEgc3dpdGNoX2p1bXAKK0wkMTA5NworCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTUyNCBzd2l0Y2hfanVtcAorTCQxMDk4CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTI3IHN3aXRjaF9qdW1wCitMJDEwOTkKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1MzAgc3dpdGNoX2p1bXAKK0wkMTEwMAorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTUzMyBzd2l0Y2hfanVtcAorTCQxMTAxCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTM2IHN3aXRjaF9qdW1wCitMJDExMDIKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1Mzkgc3dpdGNoX2p1bXAKK0wkMTEwMworCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU0MiBzd2l0Y2hfanVtcAorTCQxMTA0CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTQ1IHN3aXRjaF9qdW1wCitMJDExMDUKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1NDggc3dpdGNoX2p1bXAKK0wkMTEwNgorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU1MSBzd2l0Y2hfanVtcAorTCQxMTA3CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTU0IHN3aXRjaF9qdW1wCitMJDExMDgKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1NTcgc3dpdGNoX2p1bXAKK0wkMTEwOQorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU2MCBzd2l0Y2hfanVtcAorTCQxMTEwCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTYzIHN3aXRjaF9qdW1wCitMJDExMTEKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1NjYgc3dpdGNoX2p1bXAKK0wkMTExMgorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU2OSBzd2l0Y2hfanVtcAorTCQxMTEzCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTcyIHN3aXRjaF9qdW1wCitMJDExMTQKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1NzUgc3dpdGNoX2p1bXAKK0wkMTExNQorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU3OCBzd2l0Y2hfanVtcAorTCQxMTE2CisJYmwgTCQwNjM5LCVyMCA7IyA5NTgxIHN3aXRjaF9qdW1wCisJbGR3IDAoJXI1KSwlcjQgOyMgODE1NiByZWxvYWRfb3V0c2krMi81CitMJDExMTcKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1ODQgc3dpdGNoX2p1bXAKK0wkMTExOAorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU4NyBzd2l0Y2hfanVtcAorTCQxMTE5CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTkwIHN3aXRjaF9qdW1wCitMJDExMjAKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk1OTMgc3dpdGNoX2p1bXAKK0wkMTEyMQorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTU5NiBzd2l0Y2hfanVtcAorTCQxMTIyCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NTk5IHN3aXRjaF9qdW1wCitMJDExMjMKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2MDIgc3dpdGNoX2p1bXAKK0wkMTEyNAorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTYwNSBzd2l0Y2hfanVtcAorTCQxMTI1CisJYmwgTCQwNzM5LCVyMCA7IyA5NjA4IHN3aXRjaF9qdW1wCisJbGR3IDAoJXI1KSwlcjQgOyMgODE5NiByZWxvYWRfb3V0c2krMi81CitMJDExMjYKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2MTEgc3dpdGNoX2p1bXAKK0wkMTEyNworCWJsIEwkMDY5OSwlcjAgOyMgOTYxNCBzd2l0Y2hfanVtcAorCWxkdyAwKCVyNSksJXI0IDsjIDgxODAgcmVsb2FkX291dHNpKzIvNQorTCQxMTI4CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjE3IHN3aXRjaF9qdW1wCitMJDExMjkKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2MjAgc3dpdGNoX2p1bXAKK0wkMTEzMAorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTYyMyBzd2l0Y2hfanVtcAorTCQxMTMxCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjI2IHN3aXRjaF9qdW1wCitMJDExMzIKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2Mjkgc3dpdGNoX2p1bXAKK0wkMTEzMworCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTYzMiBzd2l0Y2hfanVtcAorTCQxMTM0CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjM1IHN3aXRjaF9qdW1wCitMJDExMzUKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2Mzggc3dpdGNoX2p1bXAKK0wkMTEzNgorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTY0MSBzd2l0Y2hfanVtcAorTCQxMTM3CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjQ0IHN3aXRjaF9qdW1wCitMJDExMzgKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2NDcgc3dpdGNoX2p1bXAKK0wkMTEzOQorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTY1MCBzd2l0Y2hfanVtcAorTCQxMTQwCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjUzIHN3aXRjaF9qdW1wCitMJDExNDEKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2NTYgc3dpdGNoX2p1bXAKK0wkMTE0MgorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTY1OSBzd2l0Y2hfanVtcAorTCQxMTQzCisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjYyIHN3aXRjaF9qdW1wCitMJDExNDQKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2NjUgc3dpdGNoX2p1bXAKK0wkMTE0NQorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTY2OCBzd2l0Y2hfanVtcAorTCQxMTQ2CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjcxIHN3aXRjaF9qdW1wCitMJDExNDcKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2NzQgc3dpdGNoX2p1bXAKK0wkMTE0OAorCWJsIEwkMDYxOSwlcjAgOyMgOTY3NyBzd2l0Y2hfanVtcAorCWxkdyAwKCVyNSksJXI0IDsjIDgxNDggcmVsb2FkX291dHNpKzIvNQorTCQxMTQ5CisJYmwgTCQwMzk3LCVyMAorCW5vcCA7IyA5NjgwIHN3aXRjaF9qdW1wCitMJDExNTAKKwlibCBMJDAzOTcsJXIwCisJbm9wIDsjIDk2ODMgc3dpdGNoX2p1bXAKK0wkMTE1MQorCWJsIEwkMDM5NywlcjAKKwlub3AgOyMgOTY4NiBzd2l0Y2hfanVtcAorTCQxMTUyCisJYmwgTCQwNTA2LCVyMAorCW5vcCA7IyA5Njg5IHN3aXRjaF9qdW1wCitMJDExNTMKKwlibCBMJDA0NzIsJXIwIDsjIDk2OTIgc3dpdGNoX2p1bXAKKwlsZGlsIEwnMzM3OTIsJXIxOSA7IyA0NzI0IGFkZF9oaWdoX2NvbnN0KzMKK0wkMTE1NAorCWJsLG4gTCQwMzk3LCVyMCA7IyA3NDUwIGp1bXAKK0wkMDM5NQorCWJiLDwsbiAlcjE1LDE4LEwkMDM5NyA7IyAzODUzIGJsZXUrMworCWxkdyAyNCglcjUpLCVyMTkgOyMgMzg2MSByZWxvYWRfb3V0c2krMi81CitMJDExODEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDM4NjIgYWRkc2kzLzIKKwlzdHcgJXIxOSwyNCglcjUpIDsjIDM4NjYgcmVsb2FkX291dHNpKzIvNgorCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgMzg3MSByZWxvYWRfb3V0c2krMi81CisJbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5NTggcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMzA4KCVyMzApLCVyMTkgOyMgMzg3MyByZWxvYWRfb3V0c2krMi81CisJbGRvIDEoJXIxKSwlcjEgOyMgMzg2OCBhZGRzaTMvMgorCWNvbWIsPD4gJXIxOSwlcjIwLEwkMDM5OCA7IyAzODc1IGJsZXUrMQorCXN0dyAlcjEsLTI2MCglcjMwKSA7IyA4OTYxIHJlbG9hZF9vdXRzaSsyLzYKKwl6ZGVwICVyMjAsMjgsMjksJXIyNSA7IyAzODg1IGFzaGxzaTMrMQorCXNoMWFkZGwgJXIyMCwlcjI1LCVyMjUgOyMgMzg4NiBhc2hsc2kzLTIKKwlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDM4OTAgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgMzg5NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCXpkZXAgJXIyNSwyOSwzMCwlcjI1IDsjIDM4OTIgYXNobHNpMysxCisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDM5MDMgYmxldSsxCisJc3R3ICVyMjgsLTMxMiglcjMwKSA7IyAzODk4IHJlbG9hZF9vdXRzaSsyLzYKKwlsZHcgLTMwOCglcjMwKSwlcjE5IDsjIDM5MTIgcmVsb2FkX291dHNpKzIvNQorCXpkZXAgJXIxOSwzMCwzMSwlcjE5IDsjIDM5MTQgYXNobHNpMysxCisJc3R3ICVyMTksLTMwOCglcjMwKSA7IyAzOTE2IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDM5OAorCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgMzkyMSByZWxvYWRfb3V0c2krMi81CisJbGR3IC0zMTIoJXIzMCksJXIyMSA7IyAzOTIzIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgMCglcjUpLCVyMTkgOyMgMzkzMyByZWxvYWRfb3V0c2krMi81CisJc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyAzOTI4IGFzaGxzaTMtMgorCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgMzkzMSBhc2hsc2kzLTIKKwlzdWIgJXIxMiwlcjE5LCVyMTkgOyMgMzkzNCBzdWJzaTMvMQorCXN0dyAlcjE5LDAoJXIyMSkgOyMgMzkzNiByZWxvYWRfb3V0c2krMi82CisJbGR3IC0zMDQoJXIzMCksJXIxOSA7IyAzOTM5IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDM5NDEgcmVsb2FkX291dHNpKzIvNQorCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgMzk0NiBhc2hsc2kzLTIKKwljb21pYiw9IDAsJXIxMCxMJDA0MDAgOyMgMzk1MSBibGV1KzEKKwlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDM5NDkgYXNobHNpMy0yCisJbGR3IDAoJXI1KSwlcjE5IDsjIDM5NTMgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjEwLCVyMTksJXIxOSA7IyAzOTU0IHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyAzOTU1IGFkZHNpMy8yCisJYmwgTCQwNDAxLCVyMCA7IyAzOTU4IGp1bXAKKwlzdHcgJXIxOSw0KCVyMjApIDsjIDM5NTcgcmVsb2FkX291dHNpKzIvNgorTCQwNDAwCisJc3R3ICVyMCw0KCVyMjApIDsjIDM5NjIgcmVsb2FkX291dHNpKzIvNgorTCQwNDAxCisJbGR3IC0zMDQoJXIzMCksJXIyMCA7IyAzOTY2IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDM5NjggcmVsb2FkX291dHNpKzIvNQorCWxkdyAwKCVyNSksJXIxOSA7IyAzOTc4IHJlbG9hZF9vdXRzaSsyLzUKKwlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDM5NzMgYXNobHNpMy0yCisJc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyAzOTc2IGFzaGxzaTMtMgorCXN1YiAlcjYsJXIxOSwlcjE5IDsjIDM5Nzkgc3Vic2kzLzEKKwlzdHcgJXIxOSwxMiglcjIxKSA7IyAzOTgxIHJlbG9hZF9vdXRzaSsyLzYKKwlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDM5ODQgcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgMzk4NiByZWxvYWRfb3V0c2krMi81CisJbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5NjQgcmVsb2FkX291dHNpKzIvNQorCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgMzk5MSBhc2hsc2kzLTIKKwlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDM5OTQgYXNobHNpMy0yCisJbGRpIDI1NSwlcjE5IDsjIDM5OTkgcmVsb2FkX291dHNpKzIvMgorCWNvbWIsPDwgJXIxOSwlcjEsTCQwNDAyIDsjIDQwMDEgYmxldSsxCisJc3R3ICVyMSwxNiglcjIwKSA7IyAzOTk2IHJlbG9hZF9vdXRzaSsyLzYKKwlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDQwMDUgcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgNDAwNyByZWxvYWRfb3V0c2krMi81CisJbGR3IDAoJXI1KSwlcjE5IDsjIDQwMTcgcmVsb2FkX291dHNpKzIvNQorCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgNDAxMiBhc2hsc2kzLTIKKwlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDQwMTUgYXNobHNpMy0yCisJc3ViICVyNiwlcjE5LCVyMTkgOyMgNDAxOCBzdWJzaTMvMQorCWxkbyAyKCVyMTkpLCVyMTkgOyMgNDAxOSBhZGRzaTMvMgorCXN0dyAlcjE5LDgoJXIyMSkgOyMgNDAyMSByZWxvYWRfb3V0c2krMi82CisJbGR3IDAoJXI1KSwlcjQgOyMgODA4NyByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwOTAgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODA4OCBzdWJzaTMvMQorCWxkbyAzKCVyMTkpLCVyMTkgOyMgODA4OSBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQwNyA7IyA4MDkxIGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU5MyByZWxvYWRfb3V0c2krMi8zCitMJDA0MDgKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDQwNDkgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDA1OSBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA0MTMgOyMgNDA2NyBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNDA2MSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNDA3MCByZWxvYWRfb3V0c2krMi82CitMJDA0MTMKKwlsZHcgMCglcjUpLCVyMjYgOyMgNDA3NyByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA0MDgxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDQwNzkgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0MDg5IGJsZXUrMQorCXN0dyAlcjI4LDAoJXI1KSA7IyA0MDg1IHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjQsTCQwNDA2IDsjIDQwOTkgYmxldSsxCisJc3ViICVyNiwlcjQsJXIxOSA7IyA0MTAxIHN1YnNpMy8xCisJY29taWIsPSAwLCVyMTAsTCQwNDE2IDsjIDQxMTAgYmxldSsxCisJYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQxMDQgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0MTExIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0MTE0IGFkZHNpMy8xCitMJDA0MTYKKwljb21pYiw9IDAsJXI4LEwkMDQxNyA7IyA0MTE3IGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDExOCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0MTIxIGFkZHNpMy8xCitMJDA0MTcKKwljb21pYiw9IDAsJXI5LEwkMDQwNiA7IyA0MTI0IGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgNDEyNSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0MTI4IGFkZHNpMy8xCitMJDA0MDYKKwlsZHcgMCglcjUpLCVyNCA7IyA0MDI5IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNDAzMyByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA0MDMwIHN1YnNpMy8xCisJbGRvIDMoJXIxOSksJXIxOSA7IyA0MDMxIGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNDA4CisJbm9wIDsjIDQwMzUgYmxldSsxCitMJDA0MDcKKwlsZGkgNSwlcjE5IDsjIDQxNTAgbW92cWkrMS8yCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0MTUxIG1vdnFpKzEvNgorCWxkYiAtMjU3KCVyMzApLCVyMSA7IyA0MTU2IG1vdnFpKzEvNQorCXN0YnMsbWEgJXIxLDEoJXI2KSA7IyA4OTY4IG1vdnFpKzEvNgorCXN0YnMsbWEgJXIwLDEoJXI2KSA7IyA0MTU5IG1vdnFpKzEvNgorTCQwNDAyCisJbGRpIDAsJXIxMCA7IyA0MTgyIHJlbG9hZF9vdXRzaSsyLzIKKwlsZGkgMCwlcjggOyMgNDE4NSByZWxvYWRfb3V0c2krMi8yCisJY29weSAlcjYsJXIxMiA7IyA0MTg4IHJlbG9hZF9vdXRzaSsyLzEKKwlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQxNzQgcmVsb2FkX291dHNpKzIvNQorCWxkaSAwLCVyOSA7IyA0MTkxIHJlbG9hZF9vdXRzaSsyLzIKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDQxNzUgYWRkc2kzLzIKKwlibCBMJDAwNDMsJXIwIDsjIDQxOTMganVtcAorCXN0dyAlcjE5LC0zMDQoJXIzMCkgOyMgNDE3OSByZWxvYWRfb3V0c2krMi82CitMJDA0MjIKKwliYiw8ICVyMTUsMTgsTCQwMzk3IDsjIDQyMDEgYmxldSszCisJbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0MjA3IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw8PixuIDAsJXIxOSxMJDAzNzQgOyMgNDIwOSBibGV1KzEKKwliYiw+PSxuICVyMTUsMTQsTCQwOTUwIDsjIDQyMTUgbW92c2ktNAorCWJsLG4gTCQwMzk3LCVyMCA7IyA0MjMwIGp1bXAKK0wkMDM3NAorCWNvbWliLD0sbiAwLCVyMTAsTCQwNDI3IDsjIDQyMzcgYmxldSsxCisJbGR3IDAoJXI1KSwlcjQgOyMgODA5NSByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgwOTggcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODA5NiBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgODA5NyBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQzMiA7IyA4MDk5IGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU5MSByZWxvYWRfb3V0c2krMi8zCitMJDA0MzMKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDQyNjYgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDI3NiBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA0MzggOyMgNDI4NCBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNDI3OCByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNDI4NyByZWxvYWRfb3V0c2krMi82CitMJDA0MzgKKwlsZHcgMCglcjUpLCVyMjYgOyMgNDI5NCByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA0Mjk4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDQyOTYgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0MzA2IGJsZXUrMQorCXN0dyAlcjI4LDAoJXI1KSA7IyA0MzAyIHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjQsTCQwNDMxIDsjIDQzMTYgYmxldSsxCisJc3ViICVyNiwlcjQsJXIxOSA7IyA0MzE4IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQzMjEgYWRkc2kzLzEKKwlzdWIgJXIxMiwlcjQsJXIxOSA7IyA0MzIyIHN1YnNpMy8xCisJY29taWIsPSAwLCVyMTAsTCQwNDQxIDsjIDQzMjcgYmxldSsxCisJYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0MzI1IGFkZHNpMy8xCisJc3ViICVyMTAsJXI0LCVyMTkgOyMgNDMyOCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDMzMSBhZGRzaTMvMQorTCQwNDQxCisJY29taWIsPSAwLCVyOCxMJDA0NDIgOyMgNDMzNCBibGV1KzEKKwlzdWIgJXI4LCVyNCwlcjE5IDsjIDQzMzUgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDMzOCBhZGRzaTMvMQorTCQwNDQyCisJY29taWIsPSAwLCVyOSxMJDA0MzEgOyMgNDM0MSBibGV1KzEKKwlzdWIgJXI5LCVyNCwlcjE5IDsjIDQzNDIgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDM0NSBhZGRzaTMvMQorTCQwNDMxCisJbGR3IDAoJXI1KSwlcjQgOyMgNDI0NiByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDQyNTAgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDI0NyBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgNDI0OCBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQzMworCW5vcCA7IyA0MjUyIGJsZXUrMQorTCQwNDMyCisJbGRpIDE5LCVyMTkgOyMgNDM2NyBtb3ZxaSsxLzIKKwlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQzNjggbW92cWkrMS82CisJdWFkZGNtICVyNiwlcjEwLCVyMjQgOyMgNDM4MSBhZGRkaTMrMQorCWxkaSAxMywlcjI2IDsjIDQzODQgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXIxMCwlcjI1IDsjIDQzODYgcmVsb2FkX291dHNpKzIvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RvcmVfb3AxLCVyMiA7IyA0MzkwIGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGRvIC0zKCVyMjQpLCVyMjQgOyMgNDM4OCBhZGRzaTMvMgorTCQwNDI3CisJbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0Mzk1IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw8PixuIDAsJXIxOSxMJDA0NDcgOyMgNDM5NyBibGV1KzEKKwliYiw8LG4gJXIxNSwxNCxMJDAwNzYgOyMgNDQwMyBibGV1KzMKK0wkMDk1MAorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgNDQxNCBjYWxsX2ludGVybmFsX3N5bXJlZgorCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNDQxMiByZWxvYWRfb3V0c2krMi81CisJYmwgTCQwODY3LCVyMCA7IyA0NDE4IGp1bXAKKwlsZGkgMTYsJXIyOCA7IyA0NDE2IHJlbG9hZF9vdXRzaSsyLzIKK0wkMDQ0NworCWxkbyAtMSglcjE5KSwlcjE5IDsjIDQ0MjcgYWRkc2kzLzIKKwlzdHcgJXIxOSwtMzA0KCVyMzApIDsjIDQ0MzEgcmVsb2FkX291dHNpKzIvNgorCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgNDQzNiByZWxvYWRfb3V0c2krMi81CisJc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyA0NDQxIGFzaGxzaTMtMgorCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgNDQ0NCBhc2hsc2kzLTIKKwlsZHcgMCglcjUpLCVyMjEgOyMgNDQ0NiByZWxvYWRfb3V0c2krMi81CisJbGR3IDAoJXIyMCksJXIxOSA7IyA0NDQ4IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjIwKSwlcjIwIDsjIDQ0NjQgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjIwLEwkMDQ1MCA7IyA0NDY2IGJsZXUrMQorCWFkZGwgJXIyMSwlcjE5LCVyMTIgOyMgNDQ0OSBhZGRzaTMvMQorCWFkZGwgJXIyMSwlcjIwLCVyMTkgOyMgNDQ4MyBhZGRzaTMvMQorCWJsIEwkMDQ1MSwlcjAgOyMgNDQ4NSBqdW1wCisJbGRvIC0xKCVyMTkpLCVyMTAgOyMgNDQ4NCBhZGRzaTMvMgorTCQwNDUwCisJbGRpIDAsJXIxMCA7IyA0NDg5IHJlbG9hZF9vdXRzaSsyLzIKK0wkMDQ1MQorCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDQ5MyByZWxvYWRfb3V0c2krMi81CisJbGR3IC0zMTIoJXIzMCksJXIyMCA7IyA0NDk1IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgMCglcjUpLCVyMjEgOyMgNDUwNSByZWxvYWRfb3V0c2krMi81CisJc2gyYWRkbCAlcjE5LCVyMTksJXIxOSA7IyA0NTAwIGFzaGxzaTMtMgorCXNoMmFkZGwgJXIxOSwlcjIwLCVyMjAgOyMgNDUwMyBhc2hsc2kzLTIKKwlsZHcgMTIoJXIyMCksJXIxOSA7IyA0NTA3IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgMTYoJXIyMCksJXI3IDsjIDQ1MjMgcmVsb2FkX291dHNpKzIvNQorCWFkZGwgJXIyMSwlcjE5LCVyOCA7IyA0NTA4IGFkZHNpMy8xCisJbGRpIDI1NSwlcjE5IDsjIDQ1MjkgcmVsb2FkX291dHNpKzIvMgorCWNvbWIsPDwgJXIxOSwlcjcsTCQwMDQzIDsjIDQ1MzEgYmxldSsxCisJbGRpIDAsJXI5IDsjIDQ1MjYgcmVsb2FkX291dHNpKzIvMgorCWxkdyA4KCVyMjApLCVyMTkgOyMgNDU1MCByZWxvYWRfb3V0c2krMi81CisJbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5NzEgcmVsb2FkX291dHNpKzIvNQorCWFkZGwgJXIyMSwlcjE5LCVyMTkgOyMgNDU1MSBhZGRzaTMvMQorCXN1YiAlcjEsJXI3LCVyMjAgOyMgNDU1NyBzdWJzaTMvMQorCXN0YiAlcjIwLDAoJXIxOSkgOyMgNDU1OSBtb3ZxaSsxLzYKKwlsZHcgMCglcjUpLCVyNCA7IyA4MTAzIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgODEwNiByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA4MTA0IHN1YnNpMy8xCisJbGRvIDMoJXIxOSksJXIxOSA7IyA4MTA1IGFkZHNpMy8yCisJY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDU3IDsjIDgxMDcgYmxldSsxCisJbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTg5IHJlbG9hZF9vdXRzaSsyLzMKK0wkMDQ1OAorCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNDU4NyBibGV1KzEKKwl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0NTk3IGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDQ2MyA7IyA0NjA1IGJsZXUrMQorCXN0dyAlcjE5LDQoJXI1KSA7IyA0NTk5IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIzLDQoJXI1KSA7IyA0NjA4IHJlbG9hZF9vdXRzaSsyLzYKK0wkMDQ2MworCWxkdyAwKCVyNSksJXIyNiA7IyA0NjE1IHJlbG9hZF9vdXRzaSsyLzUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDQ2MTkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgNCglcjUpLCVyMjUgOyMgNDYxNyByZWxvYWRfb3V0c2krMi81CisJY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ2MjcgYmxldSsxCisJc3R3ICVyMjgsMCglcjUpIDsjIDQ2MjMgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDA0NTYgOyMgNDYzNyBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDQ2Mzkgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDY0MiBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDQ2NDMgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDA0NjYgOyMgNDY0OCBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQ2NDYgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyA0NjQ5IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0NjUyIGFkZHNpMy8xCitMJDA0NjYKKwljb21pYiw9IDAsJXI4LEwkMDQ2NyA7IyA0NjU1IGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgNDY1NiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0NjU5IGFkZHNpMy8xCitMJDA0NjcKKwljb21pYiw9IDAsJXI5LEwkMDQ1NiA7IyA0NjYyIGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgNDY2MyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0NjY2IGFkZHNpMy8xCitMJDA0NTYKKwlsZHcgMCglcjUpLCVyNCA7IyA0NTY3IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNDU3MSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA0NTY4IHN1YnNpMy8xCisJbGRvIDMoJXIxOSksJXIxOSA7IyA0NTY5IGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNDU4CisJbm9wIDsjIDQ1NzMgYmxldSsxCitMJDA0NTcKKwlsZGkgNiwlcjE5IDsjIDQ2ODggbW92cWkrMS8yCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0Njg5IG1vdnFpKzEvNgorCXN0YnMsbWEgJXI3LDEoJXI2KSA7IyA0Njk0IG1vdnFpKzEvNgorCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTc0IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXIxLCVyNywlcjE5IDsjIDQ3MDAgc3Vic2kzLzEKKwlibCBMJDAwNDMsJXIwIDsjIDQ3MjAganVtcAorCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDcwMiBtb3ZxaSsxLzYKK0wkMDQ3MgorCWxkbyBSJzMzNzkyKCVyMTkpLCVyMTkgOyMgNDcyNSBtb3ZoaS0yCisJYW5kICVyMTUsJXIxOSwlcjE5IDsjIDQ3MjYgYW5kc2kzLzEKKwljb21pYiw8PixuIDAsJXIxOSxMJDAzOTcgOyMgNDcyOCBibGV1KzEKK0wkMDM3OAorCWJiLDwsbiAlcjE1LDIxLEwkMDA3NiA7IyA0NzM5IGJsZXUrMworCWxkdyAwKCVyNSksJXIzIDsjIDgxMTEgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MTE0IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDgxMTIgc3Vic2kzLzEKKwlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMTMgYWRkc2kzLzIKKwljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0NzYgOyMgODExNSBibGV1KzEKKwlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1ODcgcmVsb2FkX291dHNpKzIvMworTCQwNDc3CisJY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA0NzY4IGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ3NzggYXNobHNpMysxCisJY29tYiw+Pj0gJXI0LCVyMTksTCQwNDgyIDsjIDQ3ODYgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDQ3ODAgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjQsNCglcjUpIDsjIDQ3ODkgcmVsb2FkX291dHNpKzIvNgorTCQwNDgyCisJbGR3IDAoJXI1KSwlcjI2IDsjIDQ3OTYgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNDgwMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyA0Nzk4IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDgwOCBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNDgwNCByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXIzLEwkMDQ3NSA7IyA0ODE4IGJsZXUrMQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDgyMCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0ODIzIGFkZHNpMy8xCisJc3ViICVyMTIsJXIzLCVyMTkgOyMgNDgyNCBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDQ4NSA7IyA0ODI5IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDgyNyBhZGRzaTMvMQorCXN1YiAlcjEwLCVyMywlcjE5IDsjIDQ4MzAgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQ4MzMgYWRkc2kzLzEKK0wkMDQ4NQorCWNvbWliLD0gMCwlcjgsTCQwNDg2IDsjIDQ4MzYgYmxldSsxCisJc3ViICVyOCwlcjMsJXIxOSA7IyA0ODM3IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQ4NDAgYWRkc2kzLzEKK0wkMDQ4NgorCWNvbWliLD0gMCwlcjksTCQwNDc1IDsjIDQ4NDMgYmxldSsxCisJc3ViICVyOSwlcjMsJXIxOSA7IyA0ODQ0IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQ4NDcgYWRkc2kzLzEKK0wkMDQ3NQorCWxkdyAwKCVyNSksJXIzIDsjIDQ3NDggcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA0NzUyIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDQ3NDkgc3Vic2kzLzEKKwlsZG8gMyglcjE5KSwlcjE5IDsjIDQ3NTAgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA0NzcKKwlub3AgOyMgNDc1NCBibGV1KzEKK0wkMDQ3NgorCWxkaSAxNCwlcjI2IDsjIDQ4NzMgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXIxMiwlcjI1IDsjIDQ4NzUgcmVsb2FkX291dHNpKzIvMQorCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDQ4NzAgc3Vic2kzLzEKKwlsZG8gMyglcjI0KSwlcjI0IDsjIDQ4NzcgYWRkc2kzLzIKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluc2VydF9vcDEsJXIyIDsjIDQ4ODEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyNiwlcjIzIDsjIDQ4NzkgcmVsb2FkX291dHNpKzIvMQorCWxkaSAwLCVyOSA7IyA0ODg0IHJlbG9hZF9vdXRzaSsyLzIKKwljb21pYiw9IDAsJXIxMCxMJDA0OTAgOyMgNDg4OSBibGV1KzEKKwlsZG8gMyglcjYpLCVyNiA7IyA0ODg2IGFkZHNpMy8yCisJbGRpIDEzLCVyMjYgOyMgNDg5NCByZWxvYWRfb3V0c2krMi8yCisJY29weSAlcjEwLCVyMjUgOyMgNDg5NiByZWxvYWRfb3V0c2krMi8xCisJc3ViICVyNiwlcjI1LCVyMjQgOyMgNDg5MSBzdWJzaTMvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RvcmVfb3AxLCVyMiA7IyA0OTAwIGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGRvIC0zKCVyMjQpLCVyMjQgOyMgNDg5OCBhZGRzaTMvMgorTCQwNDkwCisJbGR3IDAoJXI1KSwlcjMgOyMgODExOSByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgxMjIgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgODEyMCBzdWJzaTMvMQorCWxkbyAzKCVyMTkpLCVyMTkgOyMgODEyMSBhZGRzaTMvMgorCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA0OTIgOyMgODEyMyBibGV1KzEKKwljb3B5ICVyNiwlcjEwIDsjIDQ5MDQgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTCc2NTUzNiwlcjQgOyMgODU4NSByZWxvYWRfb3V0c2krMi8zCitMJDA0OTMKKwljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDQ5MjkgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDkzOSBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjQsJXIxOSxMJDA0OTggOyMgNDk0NyBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNDk0MSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyNCw0KCVyNSkgOyMgNDk1MCByZWxvYWRfb3V0c2krMi82CitMJDA0OTgKKwlsZHcgMCglcjUpLCVyMjYgOyMgNDk1NyByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA0OTYxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDQ5NTkgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0OTY5IGJsZXUrMQorCXN0dyAlcjI4LDAoJXI1KSA7IyA0OTY1IHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjMsTCQwNDkxIDsjIDQ5NzkgYmxldSsxCisJc3ViICVyNiwlcjMsJXIxOSA7IyA0OTgxIHN1YnNpMy8xCisJY29taWIsPSAwLCVyMTAsTCQwNTAxIDsjIDQ5OTAgYmxldSsxCisJYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ5ODQgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjMsJXIxOSA7IyA0OTkxIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0OTk0IGFkZHNpMy8xCitMJDA1MDEKKwljb21pYiw9IDAsJXI4LEwkMDUwMiA7IyA0OTk3IGJsZXUrMQorCXN1YiAlcjgsJXIzLCVyMTkgOyMgNDk5OCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1MDAxIGFkZHNpMy8xCitMJDA1MDIKKwljb21pYiw9IDAsJXI5LEwkMDQ5MSA7IyA1MDA0IGJsZXUrMQorCXN1YiAlcjksJXIzLCVyMTkgOyMgNTAwNSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1MDA4IGFkZHNpMy8xCitMJDA0OTEKKwlsZHcgMCglcjUpLCVyMyA7IyA0OTA5IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNDkxMyByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjMsJXIxOSA7IyA0OTEwIHN1YnNpMy8xCisJbGRvIDMoJXIxOSksJXIxOSA7IyA0OTExIGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNDkzCisJbm9wIDsjIDQ5MTUgYmxldSsxCitMJDA0OTIKKwlsZG8gMyglcjYpLCVyNiA7IyA1MDMwIGFkZHNpMy8yCisJbGRpIDAsJXI4IDsjIDUwMzMgcmVsb2FkX291dHNpKzIvMgorCWJsIEwkMDA0MywlcjAgOyMgNTAzOCBqdW1wCisJY29weSAlcjYsJXIxMiA7IyA1MDM2IHJlbG9hZF9vdXRzaSsyLzEKK0wkMDUwNgorCWJiLD49ICVyMTUsMjIsTCQwMzk3IDsjIDUwNDYgbW92c2ktNAorCWxkaSA0NjA4LCVyMjAgOyMgNTA0OCByZWxvYWRfb3V0c2krMi8yCisJYW5kICVyMTUsJXIyMCwlcjE5IDsjIDUwNDkgYW5kc2kzLzEKKwljb21iLD0gJXIyMCwlcjE5LEwkMDM5NyA7IyA1MDUzIGJsZXUrMQorCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTA1NSByZWxvYWRfb3V0c2krMi81CisJbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg5NzcgcmVsb2FkX291dHNpKzIvNQorCWxkbyAtMiglcjIwKSwlcjE5IDsjIDUwNTYgYWRkc2kzLzIKKwljb21iLDw+ICVyMSwlcjE5LEwkMTE3NSA7IyA1MDU4IGJsZXUrMQorCWxkaSAtMSwlcjQgOyMgNTA3NCByZWxvYWRfb3V0c2krMi8yCisJY29tYiw9LG4gJXIxNiwlcjIwLEwkMDM5NyA7IyA1MDYyIGJsZXUrMQorTCQxMTc0CisJbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MDc5IHJlbG9hZF9vdXRzaSsyLzUKK0wkMTE3NQorCWNvcHkgJXI0LCVyMTEgOyMgNTA3NiByZWxvYWRfb3V0c2krMi8xCisJY29tYiw8PiAlcjE2LCVyMjAsTCQwNTE3IDsjIDUwODUgYmxldSsxCisJbGRvIC0xKCVyMjApLCVyMjMgOyMgNTA4MCBhZGRzaTMvMgorCWJiLD49LG4gJXIxNSwxOSxMJDA5MTUgOyMgNTA5MiBtb3ZzaS00CisJYmwgTCQxMTgyLCVyMCA7IyA1MTA3IGp1bXAKKwlzdHcgJXIyMywtMjk2KCVyMzApIDsjIDU5NjggcmVsb2FkX291dHNpKzIvNgorTCQwNTE3CisJbGRvIDEoJXIyMCksJXIxOSA7IyA1MTM0IGFkZHNpMy8yCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MTM2IHJlbG9hZF9vdXRzaSsyLzYKKwljb21pYiw9IDAsJXIxNCxMJDA1MTUgOyMgNTE0MyBibGV1KzEKKwlsZGIgMCglcjIwKSwlcjcgOyMgNTEzOSB6ZXJvX2V4dGVuZHFpc2kyLzIKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTE0NCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyNyA7IyA1MTQ3IHplcm9fZXh0ZW5kcWlzaTIvMgorTCQwNTE1CisJYWRkaWwgTFInX19jdHlwZS0kZ2xvYmFsJCwlcjI3IDsjIDgyNTcgcGljMl9sb19zdW0rMQorCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyMSksJXIyMSA7IyA4MjU5IHJlbG9hZF9vdXRzaSsyLzUKKwlhZGRsICVyMjEsJXI3LCVyMTkgOyMgODI2MCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgODI2MSBtb3ZxaSsxLzUKKwliYiw+PSAlcjE5LDI5LEwkMDUxMyA7IyA4MjY1IG1vdnNpLTQKKwlsZGkgNCwlcjIwIDsjIDgyNjMgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXIyMCwlcjIyIDsjIDg1ODMgcmVsb2FkX291dHNpKzIvMQorTCQwNTIyCisJY29taWNsciw8IC0xLCVyMTEsJXIwIDsjIDgxMjggbW92c2ljYysxLzEKKwlsZGkgMCwlcjExCisJc2gyYWRkbCAlcjExLCVyMTEsJXIxOSA7IyA1MTg4IGFzaGxzaTMtMgorCXNoMWFkZGwgJXIxOSwlcjcsJXIxOSA7IyA1MTkxIGFzaGxzaTMtMgorCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTE5NCByZWxvYWRfb3V0c2krMi81CisJY29tYiw9ICVyMTYsJXIyMCxMJDA1MTMgOyMgNTE5NiBibGV1KzEKKwlsZG8gLTQ4KCVyMTkpLCVyMTEgOyMgNTE5MiBhZGRzaTMvMgorCWxkbyAxKCVyMjApLCVyMTkgOyMgNTIxNSBhZGRzaTMvMgorCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTIxNyByZWxvYWRfb3V0c2krMi82CisJY29taWIsPSAwLCVyMTQsTCQwNTIwIDsjIDUyMjQgYmxldSsxCisJbGRiIDAoJXIyMCksJXI3IDsjIDUyMjAgemVyb19leHRlbmRxaXNpMi8yCisJYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUyMjUgYWRkc2kzLzEKKwlsZGIgMCglcjE5KSwlcjcgOyMgNTIyOCB6ZXJvX2V4dGVuZHFpc2kyLzIKK0wkMDUyMAorCWFkZGwgJXIyMSwlcjcsJXIxOSA7IyA1MTY2IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXIxOSA7IyA1MTY4IG1vdnFpKzEvNQorCWFuZCAlcjE5LCVyMjIsJXIxOSA7IyA1MTcyIGFuZHNpMy8xCisJY29taWIsPD4gMCwlcjE5LEwkMDUyMgorCW5vcCA7IyA1MTc0IGJsZXUrMQorTCQwNTEzCisJbGRpIDQ0LCVyMTkgOyMgNTI1MiByZWxvYWRfb3V0c2krMi8yCisJY29tYiw8PiAlcjE5LCVyNyxMJDA1MzIgOyMgNTI1NCBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUyNTkgcmVsb2FkX291dHNpKzIvNQorCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTMzIDsjIDUyNjEgYmxldSsxCisJbGRvIDEoJXIyMCksJXIxOSA7IyA1Mjc4IGFkZHNpMy8yCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MjgwIHJlbG9hZF9vdXRzaSsyLzYKKwljb21pYiw9IDAsJXIxNCxMJDA1MzUgOyMgNTI4NyBibGV1KzEKKwlsZGIgMCglcjIwKSwlcjcgOyMgNTI4MyB6ZXJvX2V4dGVuZHFpc2kyLzIKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTI4OCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyNyA7IyA1MjkxIHplcm9fZXh0ZW5kcWlzaTIvMgorTCQwNTM1CisJYWRkaWwgTFInX19jdHlwZS0kZ2xvYmFsJCwlcjI3IDsjIDgyNjkgcGljMl9sb19zdW0rMQorCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyMSksJXIyMSA7IyA4MjcxIHJlbG9hZF9vdXRzaSsyLzUKKwlhZGRsICVyMjEsJXI3LCVyMTkgOyMgODI3MiBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgODI3MyBtb3ZxaSsxLzUKKwliYiw+PSAlcjE5LDI5LEwkMDUzMyA7IyA4Mjc3IG1vdnNpLTQKKwlsZGkgNCwlcjIwIDsjIDgyNzUgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXIyMCwlcjIyIDsjIDg1NzggcmVsb2FkX291dHNpKzIvMQorTCQwNTQyCisJY29taWNsciw8IC0xLCVyNCwlcjAgOyMgODEzMiBtb3ZzaWNjKzEvMQorCWxkaSAwLCVyNAorCXNoMmFkZGwgJXI0LCVyNCwlcjE5IDsjIDUzMzIgYXNobHNpMy0yCisJc2gxYWRkbCAlcjE5LCVyNywlcjE5IDsjIDUzMzUgYXNobHNpMy0yCisJbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MzM4IHJlbG9hZF9vdXRzaSsyLzUKKwljb21iLD0gJXIxNiwlcjIwLEwkMDUzMyA7IyA1MzQwIGJsZXUrMQorCWxkbyAtNDgoJXIxOSksJXI0IDsjIDUzMzYgYWRkc2kzLzIKKwlsZG8gMSglcjIwKSwlcjE5IDsjIDUzNTkgYWRkc2kzLzIKKwlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUzNjEgcmVsb2FkX291dHNpKzIvNgorCWNvbWliLD0gMCwlcjE0LEwkMDU0MCA7IyA1MzY4IGJsZXUrMQorCWxkYiAwKCVyMjApLCVyNyA7IyA1MzY0IHplcm9fZXh0ZW5kcWlzaTIvMgorCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MzY5IGFkZHNpMy8xCisJbGRiIDAoJXIxOSksJXI3IDsjIDUzNzIgemVyb19leHRlbmRxaXNpMi8yCitMJDA1NDAKKwlhZGRsICVyMjEsJXI3LCVyMTkgOyMgNTMxMCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyMTkgOyMgNTMxMiBtb3ZxaSsxLzUKKwlhbmQgJXIxOSwlcjIyLCVyMTkgOyMgNTMxNiBhbmRzaTMvMQorCWNvbWliLDw+IDAsJXIxOSxMJDA1NDIKKwlub3AgOyMgNTMxOCBibGV1KzEKK0wkMDUzMworCWNvbWljbHIsPCAtMSwlcjQsJXIwIDsjIDgxMzYgYmVxLTEvNAorCXpkZXBpIC0xLDMxLDE1LCVyNAorCWJsLG4gTCQwNTUzLCVyMCA7IyA1NDAxIGp1bXAKK0wkMDUzMgorCWNvcHkgJXIxMSwlcjQgOyMgNTQwNiByZWxvYWRfb3V0c2krMi8xCitMJDA1NTMKKwljb21pYiw+IDAsJXIxMSxMJDA5NTEgOyMgNTQxMCBibGV1KzEKKwl6ZGVwaSAtMSwzMSwxNSwlcjE5IDsjIDU0MTIgcmVsb2FkX291dHNpKzIvNAorCWNvbWIsPCxuICVyMTksJXI0LEwkMDk1MSA7IyA1NDE0IGJsZXUrMQorCWNvbWIsPCxuICVyNCwlcjExLEwkMDk1MSA7IyA1NDE2IGJsZXUrMQorCWJiLDwgJXIxNSwxOSxMJDExNzYgOyMgNTQ1MSBibGV1KzMKKwlsZGkgMTI1LCVyMTkgOyMgNTUxNCByZWxvYWRfb3V0c2krMi8yCisJbGRpIDkyLCVyMTkgOyMgNTQ1NSByZWxvYWRfb3V0c2krMi8yCisJY29tYiw8PiAlcjE5LCVyNyxMJDA5MTUgOyMgNTQ1NyBibGV1KzEKKwlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDU0NzMgcmVsb2FkX291dHNpKzIvNQorCWNvbWIsPSAlcjE2LCVyMjAsTCQwOTIyIDsjIDU0NzUgYmxldSsxCisJbGRvIDEoJXIyMCksJXIxOSA7IyA1NDg0IGFkZHNpMy8yCisJc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1NDg2IHJlbG9hZF9vdXRzaSsyLzYKKwljb21pYiw9IDAsJXIxNCxMJDA1NTggOyMgNTQ5MyBibGV1KzEKKwlsZGIgMCglcjIwKSwlcjcgOyMgNTQ4OSB6ZXJvX2V4dGVuZHFpc2kyLzIKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTQ5NCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyNyA7IyA1NDk3IHplcm9fZXh0ZW5kcWlzaTIvMgorTCQwNTU4CisJbGRpIDEyNSwlcjE5IDsjIDU1MTQgcmVsb2FkX291dHNpKzIvMgorTCQxMTc2CisJY29tYiw9LG4gJXIxOSwlcjcsTCQwNTY2IDsjIDU1MTYgYmxldSsxCitMJDA5NTEKKwliYiw8LG4gJXIxNSwxOSxMJDA1MTEgOyMgNTUyMyBibGV1KzMKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGZyZWUsJXIyIDsjIDU1MzQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU1MzIgcmVsb2FkX291dHNpKzIvNQorCWJsIEwkMDg2NywlcjAgOyMgNTUzOCBqdW1wCisJbGRpIDEwLCVyMjggOyMgNTUzNiByZWxvYWRfb3V0c2krMi8yCitMJDA1NjYKKwljb21pYiw8PixuIDAsJXI4LEwkMDU2OSA7IyA1NTQ1IGJsZXUrMQorCWJiLDwsbiAlcjE1LDI2LEwkMDkxNyA7IyA1NTUyIGJsZXUrMworCWJiLD49LG4gJXIxNSwyNyxMJDA1MTEgOyMgNTU3MSBtb3ZzaS00CisJY29weSAlcjYsJXI4IDsjIDU1NzQgcmVsb2FkX291dHNpKzIvMQorTCQwNTY5CisJY29taWIsPD4gMCwlcjQsTCQwNTc0IDsjIDU1ODcgYmxldSsxCisJbGRpIDEwLCVyMTMgOyMgODk4MCByZWxvYWRfb3V0c2krMi8yCisJbGR3IDAoJXI1KSwlcjMgOyMgODEzOSByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgxNDIgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgODE0MCBzdWJzaTMvMQorCWxkbyAzKCVyMTkpLCVyMTkgOyMgODE0MSBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDU3NiA7IyA4MTQzIGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjQgOyMgODU3MyByZWxvYWRfb3V0c2krMi8zCitMJDA1NzcKKwljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDU2MTMgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNTYyMyBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjQsJXIxOSxMJDA1ODIgOyMgNTYzMSBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNTYyNSByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyNCw0KCVyNSkgOyMgNTYzNCByZWxvYWRfb3V0c2krMi82CitMJDA1ODIKKwlsZHcgMCglcjUpLCVyMjYgOyMgNTY0MSByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA1NjQ1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDU2NDMgcmVsb2FkX291dHNpKzIvNQorCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1NjUzIGJsZXUrMQorCXN0dyAlcjI4LDAoJXI1KSA7IyA1NjQ5IHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjMsTCQwNTc1IDsjIDU2NjMgYmxldSsxCisJc3ViICVyNiwlcjMsJXIxOSA7IyA1NjY1IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI2IDsjIDU2NjggYWRkc2kzLzEKKwlzdWIgJXIxMiwlcjMsJXIxOSA7IyA1NjY5IHN1YnNpMy8xCisJY29taWIsPSAwLCVyMTAsTCQwNTg1IDsjIDU2NzQgYmxldSsxCisJYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA1NjcyIGFkZHNpMy8xCisJc3ViICVyMTAsJXIzLCVyMTkgOyMgNTY3NSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTY3OCBhZGRzaTMvMQorTCQwNTg1CisJY29taWIsPSAwLCVyOCxMJDA1ODYgOyMgNTY4MSBibGV1KzEKKwlzdWIgJXI4LCVyMywlcjE5IDsjIDU2ODIgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTY4NSBhZGRzaTMvMQorTCQwNTg2CisJY29taWIsPSAwLCVyOSxMJDA1NzUgOyMgNTY4OCBibGV1KzEKKwlzdWIgJXI5LCVyMywlcjE5IDsjIDU2ODkgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTY5MiBhZGRzaTMvMQorTCQwNTc1CisJbGR3IDAoJXI1KSwlcjMgOyMgNTU5MyByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDU1OTcgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTU5NCBzdWJzaTMvMQorCWxkbyAzKCVyMTkpLCVyMTkgOyMgNTU5NSBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDU3NworCW5vcCA7IyA1NTk5IGJsZXUrMQorTCQwNTc2CisJbGRpIDEyLCVyMjYgOyMgNTcxOCByZWxvYWRfb3V0c2krMi8yCisJY29weSAlcjgsJXIyNSA7IyA1NzIwIHJlbG9hZF9vdXRzaSsyLzEKKwlzdWIgJXI2LCVyOCwlcjI0IDsjIDU3MjIgc3Vic2kzLzEKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluc2VydF9vcDEsJXIyIDsjIDU3MjYgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyNiwlcjIzIDsjIDU3MjQgcmVsb2FkX291dHNpKzIvMQorCWJsIEwkMDU5MCwlcjAgOyMgNTczMCBqdW1wCisJbGRvIDMoJXI2KSwlcjYgOyMgNTcyOCBhZGRzaTMvMgorTCQwNTc0CisJY29taWNsciw+IDIsJXI0LCVyMCA7IyA4MjgyIGJlcS0xLzIKKwlsZGkgMjAsJXIxMworCWxkdyAwKCVyNSksJXIzIDsjIDgyODUgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA4Mjg4IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDgyODYgc3Vic2kzLzEKKwlhZGRsICVyMTksJXIxMywlcjE5IDsjIDgyODcgYWRkc2kzLzEKKwljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA4NjggOyMgODI4OSBibGV1KzEKKwlsZGlsIEwnNjU1MzYsJXI3IDsjIDg1NzEgcmVsb2FkX291dHNpKzIvMworTCQwNTk1CisJY29tYiw9ICVyNywlcjIwLEwkMDk0NCA7IyA1NzY5IGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU3NzkgYXNobHNpMysxCisJY29tYiw+Pj0gJXI3LCVyMTksTCQwNjAwIDsjIDU3ODcgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDU3ODEgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjcsNCglcjUpIDsjIDU3OTAgcmVsb2FkX291dHNpKzIvNgorTCQwNjAwCisJbGR3IDAoJXI1KSwlcjI2IDsjIDU3OTcgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNTgwMSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyA1Nzk5IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTgwOSBibGV1KzEKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNTgwNSByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXIzLEwkMDU5MyA7IyA1ODE5IGJsZXUrMQorCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTgyMSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA1ODI0IGFkZHNpMy8xCisJc3ViICVyMTIsJXIzLCVyMTkgOyMgNTgyNSBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDYwMyA7IyA1ODMwIGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNTgyOCBhZGRzaTMvMQorCXN1YiAlcjEwLCVyMywlcjE5IDsjIDU4MzEgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU4MzQgYWRkc2kzLzEKK0wkMDYwMworCWNvbWliLD0gMCwlcjgsTCQwNjA0IDsjIDU4MzcgYmxldSsxCisJc3ViICVyOCwlcjMsJXIxOSA7IyA1ODM4IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDU4NDEgYWRkc2kzLzEKK0wkMDYwNAorCWNvbWliLD0gMCwlcjksTCQwNTkzIDsjIDU4NDQgYmxldSsxCisJc3ViICVyOSwlcjMsJXIxOSA7IyA1ODQ1IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDU4NDggYWRkc2kzLzEKK0wkMDU5MworCWxkdyAwKCVyNSksJXIzIDsjIDU3NDkgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA1NzUzIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyMywlcjE5IDsjIDU3NTAgc3Vic2kzLzEKKwlhZGRsICVyMTksJXIxMywlcjE5IDsjIDU3NTEgYWRkc2kzLzEKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA1OTUKKwlub3AgOyMgNTc1NSBibGV1KzEKK0wkMDg2OAorCWNvbWliLD49IDEsJXI0LEwkMDYwOCA7IyA1ODcyIGJsZXUrMQorCWxkbyA1KCVyNiksJXIxOSA7IyA1ODcwIGFkZHNpMy8yCisJc3ViICVyMTksJXI4LCVyMTkgOyMgNTg3NCBzdWJzaTMvMQorCWJsIEwkMDYwOSwlcjAgOyMgNTg3NiBqdW1wCisJbGRvIDIoJXIxOSksJXIyNCA7IyA1ODc1IGFkZHNpMy8yCitMJDA2MDgKKwlzdWIgJXIxOSwlcjgsJXIxOSA7IyA1ODc5IHN1YnNpMy8xCisJbGRvIC0zKCVyMTkpLCVyMjQgOyMgNTg4MCBhZGRzaTMvMgorTCQwNjA5CisJbGRpIDIwLCVyMjYgOyMgNTg4NSByZWxvYWRfb3V0c2krMi8yCisJY29weSAlcjgsJXIyNSA7IyA1ODg3IHJlbG9hZF9vdXRzaSsyLzEKKwljb3B5ICVyMTEsJXIyMyA7IyA1ODkxIHJlbG9hZF9vdXRzaSsyLzEKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgorCWJsIGluc2VydF9vcDIsJXIyIDsjIDU4OTMgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwlzdHcgJXI2LC01MiglcjMwKSA7IyA1ODgzIHJlbG9hZF9vdXRzaSsyLzYKKwlsZG8gNSglcjYpLCVyNiA7IyA1ODk1IGFkZHNpMy8yCisJbGRpIDIyLCVyMjYgOyMgNTkwMCByZWxvYWRfb3V0c2krMi8yCisJY29weSAlcjgsJXIyNSA7IyA1OTAyIHJlbG9hZF9vdXRzaSsyLzEKKwlsZGkgNSwlcjI0IDsjIDU5MDQgcmVsb2FkX291dHNpKzIvMgorCWNvcHkgJXIxMSwlcjIzIDsjIDU5MDYgcmVsb2FkX291dHNpKzIvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5zZXJ0X29wMiwlcjIgOyMgNTkwOCBjYWxsX2ludGVybmFsX3N5bXJlZgorCXN0dyAlcjYsLTUyKCVyMzApIDsjIDU4OTggcmVsb2FkX291dHNpKzIvNgorCWNvbWliLD49IDEsJXI0LEwkMDU5MCA7IyA1OTEzIGJsZXUrMQorCWxkbyA1KCVyNiksJXI2IDsjIDU5MTAgYWRkc2kzLzIKKwlsZGkgMjEsJXIyNiA7IyA1OTIxIHJlbG9hZF9vdXRzaSsyLzIKKwljb3B5ICVyNiwlcjI1IDsjIDU5MjMgcmVsb2FkX291dHNpKzIvMQorCXN1YiAlcjgsJXI2LCVyMjQgOyMgNTkxNyBzdWJzaTMvMQorCWxkbyAyKCVyMjQpLCVyMjQgOyMgNTkyNSBhZGRzaTMvMgorCWxkbyAtMSglcjQpLCVyNCA7IyA1OTE5IGFkZHNpMy8yCisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKKwlibCBzdG9yZV9vcDIsJXIyIDsjIDU5MjkgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyNCwlcjIzIDsjIDU5MjcgcmVsb2FkX291dHNpKzIvMQorCWxkbyA1KCVyNiksJXI2IDsjIDU5MzEgYWRkc2kzLzIKKwlzdHcgJXI2LC01MiglcjMwKSA7IyA1OTM2IHJlbG9hZF9vdXRzaSsyLzYKKwlsZGkgMjIsJXIyNiA7IyA1OTM4IHJlbG9hZF9vdXRzaSsyLzIKKwljb3B5ICVyOCwlcjI1IDsjIDU5NDAgcmVsb2FkX291dHNpKzIvMQorCXN1YiAlcjYsJXI4LCVyMjQgOyMgNTk0MiBzdWJzaTMvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCisJYmwgaW5zZXJ0X29wMiwlcjIgOyMgNTk0NiBjYWxsX2ludGVybmFsX3N5bXJlZgorCWNvcHkgJXI0LCVyMjMgOyMgNTk0NCByZWxvYWRfb3V0c2krMi8xCisJbGRvIDUoJXI2KSwlcjYgOyMgNTk0OCBhZGRzaTMvMgorTCQwNTkwCisJYmwgTCQwMDQzLCVyMCA7IyA1OTYzIGp1bXAKKwlsZGkgMCwlcjkgOyMgNTk1NiByZWxvYWRfb3V0c2krMi8yCitMJDA1MTEKKwlzdHcgJXIyMywtMjk2KCVyMzApIDsjIDU5NjggcmVsb2FkX291dHNpKzIvNgorTCQxMTgyCisJbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1OTc3IHJlbG9hZF9vdXRzaSsyLzUKKwljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyA1OTc5IGJsZXUrMQorCWxkbyAxKCVyMjApLCVyMjEgOyMgNTk4OCBhZGRzaTMvMgorCWxkYiAwKCVyMjApLCVyMjAgOyMgNTk5MiBtb3ZxaSsxLzUKKwlzdHcgJXIyMSwtMjk2KCVyMzApIDsjIDU5OTAgcmVsb2FkX291dHNpKzIvNgorCWNvbWliLD0gMCwlcjE0LEwkMDYxMiA7IyA1OTk3IGJsZXUrMQorCWV4dHJ1ICVyMjAsMzEsOCwlcjcgOyMgNTk5MyB6ZXJvX2V4dGVuZHFpc2kyLzEKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTk5OCBhZGRzaTMvMQorCWxkYiAwKCVyMTkpLCVyNyA7IyA2MDAxIHplcm9fZXh0ZW5kcWlzaTIvMgorTCQwNjEyCisJYmIsPCAlcjE1LDE5LEwkMDA3NiA7IyA2MDE5IGJsZXUrMworCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4OTgzIHJlbG9hZF9vdXRzaSsyLzUKKwljb21iLD4+PSAlcjEsJXIyMSxMJDAwNzYgOyMgNjAyNSBibGV1KzEKKwlleHRycyAlcjIwLDMxLDgsJXIyMCA7IyA2MDMwIGV4dGVuZHFpc2kyCisJbGRpIDkyLCVyMTkgOyMgNjAzMiByZWxvYWRfb3V0c2krMi8yCisJY29tYiw9LG4gJXIxOSwlcjIwLEwkMDM5NyA7IyA2MDM0IGJsZXUrMQorCWJsLG4gTCQwMDc2LCVyMCA7IyA2MDQyIGp1bXAKK0wkMDYxOQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MTUxIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNDkgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNTAgYWRkc2kzLzIKKwljb21iLD4+PSAlcjIwLCVyMTksTCQwNjI0IDsjIDgxNTIgYmxldSsxCisJY29weSAlcjYsJXI4IDsjIDYwNDcgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2OSByZWxvYWRfb3V0c2krMi8zCitMJDA2MjUKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDYwNzUgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjA4NSBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA2MzAgOyMgNjA5MyBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNjA4NyByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNjA5NiByZWxvYWRfb3V0c2krMi82CitMJDA2MzAKKwlsZHcgMCglcjUpLCVyMjYgOyMgNjEwMyByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA2MTA3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDYxMDUgcmVsb2FkX291dHNpKzIvNQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2MTE1IGJsZXUrMQorCWJsIEwkMDk1MywlcjAKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNjExMSByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXI0LEwkMDYyMyA7IyA2MTI1IGJsZXUrMQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjEyNyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2MTMwIGFkZHNpMy8xCisJc3ViICVyMTIsJXI0LCVyMTkgOyMgNjEzMSBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDYzMyA7IyA2MTM2IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjEzNCBhZGRzaTMvMQorCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDYxMzcgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDYxNDAgYWRkc2kzLzEKK0wkMDYzMworCWNvbWliLD0gMCwlcjgsTCQwNjM0IDsjIDYxNDMgYmxldSsxCisJc3ViICVyOCwlcjQsJXIxOSA7IyA2MTQ0IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDYxNDcgYWRkc2kzLzEKK0wkMDYzNAorCWNvbWliLD0gMCwlcjksTCQwNjIzIDsjIDYxNTAgYmxldSsxCisJc3ViICVyOSwlcjQsJXIxOSA7IyA2MTUxIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDYxNTQgYWRkc2kzLzEKK0wkMDYyMworCWxkdyAwKCVyNSksJXI0IDsjIDYwNTUgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA2MDU5IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDYwNTYgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDYwNTcgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA2MjUKKwlub3AgOyMgNjA2MSBibGV1KzEKK0wkMDYyNAorCWxkaSAyMywlcjE5IDsjIDYxNzYgbW92cWkrMS8yCisJYmwgTCQwMDQzLCVyMCA7IyA2MTg5IGp1bXAKKwlzdGJzLG1hICVyMTksMSglcjYpIDsjIDYxNzcgbW92cWkrMS82CitMJDA2MzkKKwlsZHcgNCglcjUpLCVyMjAgOyMgODE1OSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA4MTU3IHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA4MTU4IGFkZHNpMy8yCisJY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDY0NCA7IyA4MTYwIGJsZXUrMQorCWNvcHkgJXI2LCVyOCA7IyA2MTk0IHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjcgcmVsb2FkX291dHNpKzIvMworTCQwNjQ1CisJY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MjIyIGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYyMzIgYXNobHNpMysxCisJY29tYiw+Pj0gJXIzLCVyMTksTCQwNjUwIDsjIDYyNDAgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDYyMzQgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjMsNCglcjUpIDsjIDYyNDMgcmVsb2FkX291dHNpKzIvNgorTCQwNjUwCisJbGR3IDAoJXI1KSwlcjI2IDsjIDYyNTAgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNjI1NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyA2MjUyIHJlbG9hZF9vdXRzaSsyLzUKKwljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjI2MiBibGV1KzEKKwlibCBMJDA5NTMsJXIwCisJc3R3ICVyMjgsMCglcjUpIDsjIDYyNTggcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDA2NDMgOyMgNjI3MiBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDYyNzQgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjI3NyBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDYyNzggc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDA2NTMgOyMgNjI4MyBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDYyODEgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2Mjg0IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2Mjg3IGFkZHNpMy8xCitMJDA2NTMKKwljb21pYiw9IDAsJXI4LEwkMDY1NCA7IyA2MjkwIGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjI5MSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2Mjk0IGFkZHNpMy8xCitMJDA2NTQKKwljb21pYiw9IDAsJXI5LEwkMDY0MyA7IyA2Mjk3IGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgNjI5OCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2MzAxIGFkZHNpMy8xCitMJDA2NDMKKwlsZHcgMCglcjUpLCVyNCA7IyA2MjAyIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNjIwNiByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA2MjAzIHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA2MjA0IGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNjQ1CisJbm9wIDsjIDYyMDggYmxldSsxCitMJDA2NDQKKwlsZGkgMjQsJXIxOSA7IyA2MzIzIG1vdnFpKzEvMgorCWJsIEwkMDA0MywlcjAgOyMgNjMzNiBqdW1wCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2MzI0IG1vdnFpKzEvNgorTCQwNjU5CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgxNjcgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE2NSBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE2NiBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDY2NCA7IyA4MTY4IGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2NSByZWxvYWRfb3V0c2krMi8zCitMJDA2NjUKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDYzNjYgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjM3NiBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA2NzAgOyMgNjM4NCBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNjM3OCByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNjM4NyByZWxvYWRfb3V0c2krMi82CitMJDA2NzAKKwlsZHcgMCglcjUpLCVyMjYgOyMgNjM5NCByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA2Mzk4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDYzOTYgcmVsb2FkX291dHNpKzIvNQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2NDA2IGJsZXUrMQorCWJsIEwkMDk1MywlcjAKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNjQwMiByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXI0LEwkMDY2MyA7IyA2NDE2IGJsZXUrMQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjQxOCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NDIxIGFkZHNpMy8xCisJc3ViICVyMTIsJXI0LCVyMTkgOyMgNjQyMiBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDY3MyA7IyA2NDI3IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjQyNSBhZGRzaTMvMQorCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY0Mjggc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY0MzEgYWRkc2kzLzEKK0wkMDY3MworCWNvbWliLD0gMCwlcjgsTCQwNjc0IDsjIDY0MzQgYmxldSsxCisJc3ViICVyOCwlcjQsJXIxOSA7IyA2NDM1IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY0MzggYWRkc2kzLzEKK0wkMDY3NAorCWNvbWliLD0gMCwlcjksTCQwNjYzIDsjIDY0NDEgYmxldSsxCisJc3ViICVyOSwlcjQsJXIxOSA7IyA2NDQyIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY0NDUgYWRkc2kzLzEKK0wkMDY2MworCWxkdyAwKCVyNSksJXI0IDsjIDYzNDYgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA2MzUwIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDYzNDcgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDYzNDggYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA2NjUKKwlub3AgOyMgNjM1MiBibGV1KzEKK0wkMDY2NAorCWxkaSAyNSwlcjE5IDsjIDY0NjcgbW92cWkrMS8yCisJYmwgTCQwMDQzLCVyMCA7IyA2NDgwIGp1bXAKKwlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY0NjggbW92cWkrMS82CitMJDA2NzkKKwlsZHcgNCglcjUpLCVyMjAgOyMgODE3NSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA4MTczIHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA4MTc0IGFkZHNpMy8yCisJY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNjg0IDsjIDgxNzYgYmxldSsxCisJbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTYzIHJlbG9hZF9vdXRzaSsyLzMKK0wkMDY4NQorCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjUxMCBibGV1KzEKKwl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2NTIwIGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDY5MCA7IyA2NTI4IGJsZXUrMQorCXN0dyAlcjE5LDQoJXI1KSA7IyA2NTIyIHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIzLDQoJXI1KSA7IyA2NTMxIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDY5MAorCWxkdyAwKCVyNSksJXIyNiA7IyA2NTM4IHJlbG9hZF9vdXRzaSsyLzUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDY1NDIgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgNCglcjUpLCVyMjUgOyMgNjU0MCByZWxvYWRfb3V0c2krMi81CisJY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY1NTAgYmxldSsxCisJYmwgTCQwOTUzLCVyMAorCXN0dyAlcjI4LDAoJXI1KSA7IyA2NTQ2IHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjQsTCQwNjgzIDsjIDY1NjAgYmxldSsxCisJc3ViICVyNiwlcjQsJXIxOSA7IyA2NTYyIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY1NjUgYWRkc2kzLzEKKwlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NTY2IHN1YnNpMy8xCisJY29taWIsPSAwLCVyMTAsTCQwNjkzIDsjIDY1NzEgYmxldSsxCisJYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NTY5IGFkZHNpMy8xCisJc3ViICVyMTAsJXI0LCVyMTkgOyMgNjU3MiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjU3NSBhZGRzaTMvMQorTCQwNjkzCisJY29taWIsPSAwLCVyOCxMJDA2OTQgOyMgNjU3OCBibGV1KzEKKwlzdWIgJXI4LCVyNCwlcjE5IDsjIDY1Nzkgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjU4MiBhZGRzaTMvMQorTCQwNjk0CisJY29taWIsPSAwLCVyOSxMJDA2ODMgOyMgNjU4NSBibGV1KzEKKwlzdWIgJXI5LCVyNCwlcjE5IDsjIDY1ODYgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjU4OSBhZGRzaTMvMQorTCQwNjgzCisJbGR3IDAoJXI1KSwlcjQgOyMgNjQ5MCByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDY0OTQgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjQ5MSBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjQ5MiBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY4NQorCW5vcCA7IyA2NDk2IGJsZXUrMQorTCQwNjg0CisJbGRpIDI2LCVyMTkgOyMgNjYxMSBtb3ZxaSsxLzIKKwlibCBMJDAwNDMsJXIwIDsjIDY2MjQganVtcAorCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjYxMiBtb3ZxaSsxLzYKK0wkMDY5OQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MTgzIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxODEgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDgxODIgYWRkc2kzLzIKKwljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3MDQgOyMgODE4NCBibGV1KzEKKwlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjEgcmVsb2FkX291dHNpKzIvMworTCQwNzA1CisJY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2NjU0IGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY2NjQgYXNobHNpMysxCisJY29tYiw+Pj0gJXIzLCVyMTksTCQwNzEwIDsjIDY2NzIgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDY2NjYgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjMsNCglcjUpIDsjIDY2NzUgcmVsb2FkX291dHNpKzIvNgorTCQwNzEwCisJbGR3IDAoJXI1KSwlcjI2IDsjIDY2ODIgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNjY4NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyA2Njg0IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjY5NCBibGV1KzEKKwlibCBMJDA5NTMsJXIwCisJc3R3ICVyMjgsMCglcjUpIDsjIDY2OTAgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDA3MDMgOyMgNjcwNCBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDY3MDYgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjcwOSBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY3MTAgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDA3MTMgOyMgNjcxNSBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY3MTMgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NzE2IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NzE5IGFkZHNpMy8xCitMJDA3MTMKKwljb21pYiw9IDAsJXI4LEwkMDcxNCA7IyA2NzIyIGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjcyMyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NzI2IGFkZHNpMy8xCitMJDA3MTQKKwljb21pYiw9IDAsJXI5LEwkMDcwMyA7IyA2NzI5IGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgNjczMCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NzMzIGFkZHNpMy8xCitMJDA3MDMKKwlsZHcgMCglcjUpLCVyNCA7IyA2NjM0IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNjYzOCByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA2NjM1IHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA2NjM2IGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNzA1CisJbm9wIDsjIDY2NDAgYmxldSsxCitMJDA3MDQKKwlsZGkgMjcsJXIxOSA7IyA2NzU1IG1vdnFpKzEvMgorCWJsIEwkMDA0MywlcjAgOyMgNjc2OCBqdW1wCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NzU2IG1vdnFpKzEvNgorTCQwNzE5CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgxOTEgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE4OSBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE5MCBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDcyNCA7IyA4MTkyIGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1OSByZWxvYWRfb3V0c2krMi8zCitMJDA3MjUKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY3OTggYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjgwOCBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA3MzAgOyMgNjgxNiBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNjgxMCByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNjgxOSByZWxvYWRfb3V0c2krMi82CitMJDA3MzAKKwlsZHcgMCglcjUpLCVyMjYgOyMgNjgyNiByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA2ODMwIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDY4MjggcmVsb2FkX291dHNpKzIvNQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2ODM4IGJsZXUrMQorCWJsIEwkMDk1MywlcjAKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNjgzNCByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXI0LEwkMDcyMyA7IyA2ODQ4IGJsZXUrMQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjg1MCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2ODUzIGFkZHNpMy8xCisJc3ViICVyMTIsJXI0LCVyMTkgOyMgNjg1NCBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDczMyA7IyA2ODU5IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjg1NyBhZGRzaTMvMQorCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY4NjAgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY4NjMgYWRkc2kzLzEKK0wkMDczMworCWNvbWliLD0gMCwlcjgsTCQwNzM0IDsjIDY4NjYgYmxldSsxCisJc3ViICVyOCwlcjQsJXIxOSA7IyA2ODY3IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY4NzAgYWRkc2kzLzEKK0wkMDczNAorCWNvbWliLD0gMCwlcjksTCQwNzIzIDsjIDY4NzMgYmxldSsxCisJc3ViICVyOSwlcjQsJXIxOSA7IyA2ODc0IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY4NzcgYWRkc2kzLzEKK0wkMDcyMworCWxkdyAwKCVyNSksJXI0IDsjIDY3NzggcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA2NzgyIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDY3Nzkgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDY3ODAgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA3MjUKKwlub3AgOyMgNjc4NCBibGV1KzEKK0wkMDcyNAorCWxkaSAyOCwlcjE5IDsjIDY4OTkgbW92cWkrMS8yCisJYmwgTCQwMDQzLCVyMCA7IyA2OTEyIGp1bXAKKwlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY5MDAgbW92cWkrMS82CitMJDA3MzkKKwlsZHcgNCglcjUpLCVyMjAgOyMgODE5OSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA4MTk3IHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA4MTk4IGFkZHNpMy8yCisJY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzQ0IDsjIDgyMDAgYmxldSsxCisJbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU3IHJlbG9hZF9vdXRzaSsyLzMKK0wkMDc0NQorCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjk0MiBibGV1KzEKKwl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2OTUyIGFzaGxzaTMrMQorCWNvbWIsPj49ICVyMywlcjE5LEwkMDc1MCA7IyA2OTYwIGJsZXUrMQorCXN0dyAlcjE5LDQoJXI1KSA7IyA2OTU0IHJlbG9hZF9vdXRzaSsyLzYKKwlzdHcgJXIzLDQoJXI1KSA7IyA2OTYzIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDc1MAorCWxkdyAwKCVyNSksJXIyNiA7IyA2OTcwIHJlbG9hZF9vdXRzaSsyLzUKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIHJlYWxsb2MsJXIyIDsjIDY5NzQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgNCglcjUpLCVyMjUgOyMgNjk3MiByZWxvYWRfb3V0c2krMi81CisJY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY5ODIgYmxldSsxCisJYmwgTCQwOTUzLCVyMAorCXN0dyAlcjI4LDAoJXI1KSA7IyA2OTc4IHJlbG9hZF9vdXRzaSsyLzYKKwljb21iLD0gJXIyOCwlcjQsTCQwNzQzIDsjIDY5OTIgYmxldSsxCisJc3ViICVyNiwlcjQsJXIxOSA7IyA2OTk0IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY5OTcgYWRkc2kzLzEKKwlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2OTk4IHN1YnNpMy8xCisJY29taWIsPSAwLCVyMTAsTCQwNzUzIDsjIDcwMDMgYmxldSsxCisJYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MDAxIGFkZHNpMy8xCisJc3ViICVyMTAsJXI0LCVyMTkgOyMgNzAwNCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzAwNyBhZGRzaTMvMQorTCQwNzUzCisJY29taWIsPSAwLCVyOCxMJDA3NTQgOyMgNzAxMCBibGV1KzEKKwlzdWIgJXI4LCVyNCwlcjE5IDsjIDcwMTEgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzAxNCBhZGRzaTMvMQorTCQwNzU0CisJY29taWIsPSAwLCVyOSxMJDA3NDMgOyMgNzAxNyBibGV1KzEKKwlzdWIgJXI5LCVyNCwlcjE5IDsjIDcwMTggc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzAyMSBhZGRzaTMvMQorTCQwNzQzCisJbGR3IDAoJXI1KSwlcjQgOyMgNjkyMiByZWxvYWRfb3V0c2krMi81CisJbGR3IDQoJXI1KSwlcjIwIDsjIDY5MjYgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjkyMyBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjkyNCBhZGRzaTMvMgorCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc0NQorCW5vcCA7IyA2OTI4IGJsZXUrMQorTCQwNzQ0CisJbGRpIDEwLCVyMTkgOyMgNzA0MyBtb3ZxaSsxLzIKKwlibCBMJDAwNDMsJXIwIDsjIDcwNTYganVtcAorCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzA0NCBtb3ZxaSsxLzYKK0wkMDc1OQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MjA3IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMDUgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDgyMDYgYWRkc2kzLzIKKwljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3NjQgOyMgODIwOCBibGV1KzEKKwlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTUgcmVsb2FkX291dHNpKzIvMworTCQwNzY1CisJY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3MDg2IGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDcwOTYgYXNobHNpMysxCisJY29tYiw+Pj0gJXIzLCVyMTksTCQwNzcwIDsjIDcxMDQgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDcwOTggcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjMsNCglcjUpIDsjIDcxMDcgcmVsb2FkX291dHNpKzIvNgorTCQwNzcwCisJbGR3IDAoJXI1KSwlcjI2IDsjIDcxMTQgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNzExOCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyA3MTE2IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzEyNiBibGV1KzEKKwlibCBMJDA5NTMsJXIwCisJc3R3ICVyMjgsMCglcjUpIDsjIDcxMjIgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDA3NjMgOyMgNzEzNiBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDcxMzggc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzE0MSBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDcxNDIgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDA3NzMgOyMgNzE0NyBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDcxNDUgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3MTQ4IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3MTUxIGFkZHNpMy8xCitMJDA3NzMKKwljb21pYiw9IDAsJXI4LEwkMDc3NCA7IyA3MTU0IGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzE1NSBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3MTU4IGFkZHNpMy8xCitMJDA3NzQKKwljb21pYiw9IDAsJXI5LEwkMDc2MyA7IyA3MTYxIGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgNzE2MiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3MTY1IGFkZHNpMy8xCitMJDA3NjMKKwlsZHcgMCglcjUpLCVyNCA7IyA3MDY2IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNzA3MCByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA3MDY3IHN1YnNpMy8xCisJbGRvIDEoJXIxOSksJXIxOSA7IyA3MDY4IGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNzY1CisJbm9wIDsjIDcwNzIgYmxldSsxCitMJDA3NjQKKwlsZGkgMTEsJXIxOSA7IyA3MTg3IG1vdnFpKzEvMgorCWJsIEwkMDA0MywlcjAgOyMgNzIwMCBqdW1wCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3MTg4IG1vdnFpKzEvNgorTCQwNzg3CisJYmIsPCAlcjE1LDE3LEwkMDA3NiA7IyA3MjE2IGJsZXUrMworCWxkbyAtNDgoJXI3KSwlcjE5IDsjIDcyMjQgYWRkc2kzLzIKKwlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk4NiByZWxvYWRfb3V0c2krMi81CisJZXh0cnUgJXIxOSwzMSw4LCVyMyA7IyA3MjI1IHplcm9fZXh0ZW5kcWlzaTIvMQorCWNvbWIsPDwgJXIxLCVyMyxMJDA5MzkgOyMgNzIzMCBibGV1KzEKKwlsZG8gLTMxMiglcjMwKSwlcjI2IDsjIDcyNDQgYWRkc2kzLzIKKwkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgorCWJsIGdyb3VwX2luX2NvbXBpbGVfc3RhY2ssJXIyIDsjIDcyNDggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKKwljb3B5ICVyMywlcjI1IDsjIDcyNDYgcmVsb2FkX291dHNpKzIvMQorCWV4dHJzICVyMjgsMzEsOCwlcjI4IDsjIDcyNTEgZXh0ZW5kcWlzaTIKKwljb21pYiw8PixuIDAsJXIyOCxMJDAwNzYgOyMgNzI1MyBibGV1KzEKKwlsZHcgMCglcjUpLCVyNCA7IyA4MjEyIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgODIxNSByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA4MjEzIHN1YnNpMy8xCisJbGRvIDIoJXIxOSksJXIxOSA7IyA4MjE0IGFkZHNpMy8yCisJY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDc5NSA7IyA4MjE2IGJsZXUrMQorCWNvcHkgJXI2LCVyOCA7IyA3MjYwIHJlbG9hZF9vdXRzaSsyLzEKKwlsZGlsIEwnNjU1MzYsJXI3IDsjIDg1NTMgcmVsb2FkX291dHNpKzIvMworTCQwNzk2CisJY29tYiw9ICVyNywlcjIwLEwkMDk0NCA7IyA3Mjg4IGJsZXUrMQorCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDcyOTggYXNobHNpMysxCisJY29tYiw+Pj0gJXI3LCVyMTksTCQwODAxIDsjIDczMDYgYmxldSsxCisJc3R3ICVyMTksNCglcjUpIDsjIDczMDAgcmVsb2FkX291dHNpKzIvNgorCXN0dyAlcjcsNCglcjUpIDsjIDczMDkgcmVsb2FkX291dHNpKzIvNgorTCQwODAxCisJbGR3IDAoJXI1KSwlcjI2IDsjIDczMTYgcmVsb2FkX291dHNpKzIvNQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCisJYmwgcmVhbGxvYywlcjIgOyMgNzMyMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgorCWxkdyA0KCVyNSksJXIyNSA7IyA3MzE4IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzMyOCBibGV1KzEKKwlibCBMJDA5NTMsJXIwCisJc3R3ICVyMjgsMCglcjUpIDsjIDczMjQgcmVsb2FkX291dHNpKzIvNgorCWNvbWIsPSAlcjI4LCVyNCxMJDA3OTQgOyMgNzMzOCBibGV1KzEKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDczNDAgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzM0MyBhZGRzaTMvMQorCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDczNDQgc3Vic2kzLzEKKwljb21pYiw9IDAsJXIxMCxMJDA4MDQgOyMgNzM0OSBibGV1KzEKKwlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDczNDcgYWRkc2kzLzEKKwlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3MzUwIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3MzUzIGFkZHNpMy8xCitMJDA4MDQKKwljb21pYiw9IDAsJXI4LEwkMDgwNSA7IyA3MzU2IGJsZXUrMQorCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzM1NyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3MzYwIGFkZHNpMy8xCitMJDA4MDUKKwljb21pYiw9IDAsJXI5LEwkMDc5NCA7IyA3MzYzIGJsZXUrMQorCXN1YiAlcjksJXI0LCVyMTkgOyMgNzM2NCBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3MzY3IGFkZHNpMy8xCitMJDA3OTQKKwlsZHcgMCglcjUpLCVyNCA7IyA3MjY4IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgNCglcjUpLCVyMjAgOyMgNzI3MiByZWxvYWRfb3V0c2krMi81CisJc3ViICVyNiwlcjQsJXIxOSA7IyA3MjY5IHN1YnNpMy8xCisJbGRvIDIoJXIxOSksJXIxOSA7IyA3MjcwIGFkZHNpMy8yCisJY29tYiw8PCAlcjIwLCVyMTksTCQwNzk2CisJbm9wIDsjIDcyNzQgYmxldSsxCitMJDA3OTUKKwlsZGkgNywlcjE5IDsjIDczODkgbW92cWkrMS8yCisJc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3MzkwIG1vdnFpKzEvNgorCWJsIEwkMDA0MywlcjAgOyMgNzQwNSBqdW1wCisJc3RicyxtYSAlcjMsMSglcjYpIDsjIDczOTMgbW92cWkrMS82CitMJDA4MTEKKwliYiw8ICVyMTUsMzAsTCQwMTA0CisJbm9wIDsjIDc0MTQgYmxldSszCitMJDAzOTcKKwljb21pYiw9IDAsJXIxNCxMJDA4MTUgOyMgNzQyOSBibGV1KzEKKwlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNzQzMCBhZGRzaTMvMQorCWJsIEwkMDgxNiwlcjAgOyMgNzQzNCBqdW1wCisJbGRiIDAoJXIxOSksJXIxOSA7IyA3NDMzIHplcm9fZXh0ZW5kcWlzaTIvMgorTCQwODE1CisJY29weSAlcjcsJXIxOSA7IyA3NDM4IHJlbG9hZF9vdXRzaSsyLzEKK0wkMDgxNgorCWNvcHkgJXIxOSwlcjcgOyMgNzQ0MSByZWxvYWRfb3V0c2krMi8xCitMJDAwNzYKKwljb21pYiw9LG4gMCwlcjksTCQwODIwIDsjIDc0NjAgYmxldSsxCisJbGRiIDAoJXI5KSwlcjIwIDsjIDc0NjMgemVyb19leHRlbmRxaXNpMi8yCisJYWRkbCAlcjksJXIyMCwlcjE5IDsjIDc0NjQgYWRkc2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDc0NjUgYWRkc2kzLzIKKwljb21iLDw+ICVyNiwlcjE5LEwkMDgyMCA7IyA3NDY3IGJsZXUrMQorCWxkaSAyNTUsJXIxOSA7IyA3NDcyIHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLD0gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NDc0IGJsZXUrMQorCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgNzQ3NiByZWxvYWRfb3V0c2krMi81CisJbGRiIDAoJXIyMSksJXIxOSA7IyA3NDc4IG1vdnFpKzEvNQorCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDc0NzkgZXh0ZW5kcWlzaTIKKwlsZGkgNDIsJXIxOSA7IyA3NDgxIHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLD0gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NDgzIGJsZXUrMQorCWxkaSA5NCwlcjE5IDsjIDc0OTAgcmVsb2FkX291dHNpKzIvMgorCWNvbWIsPSxuICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ5MiBibGV1KzEKKwliYiw+PSAlcjE1LDMwLEwkMDgyMSA7IyA3NDk3IG1vdnNpLTQKKwlsZGkgOTIsJXIxOSA7IyA3NTA0IHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLDw+LG4gJXIxOSwlcjIwLEwkMDgyMiA7IyA3NTA2IGJsZXUrMQorCWxkYiAxKCVyMjEpLCVyMTkgOyMgNzUxMCBtb3ZxaSsxLzUKKwlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyA3NTExIGV4dGVuZHFpc2kyCitMJDA4MjEKKwlsZGkgNDMsJXIxOSA7IyA3NTM0IHJlbG9hZF9vdXRzaSsyLzIKKwljb21iLD0gJXIxOSwlcjIwLEwkMDgyMCA7IyA3NTM2IGJsZXUrMQorCWxkaSA2MywlcjE5IDsjIDc1NDMgcmVsb2FkX291dHNpKzIvMgorCWNvbWIsPSxuICVyMTksJXIyMCxMJDA4MjAgOyMgNzU0NSBibGV1KzEKK0wkMDgyMgorCWJiLD49LG4gJXIxNSwyMixMJDA4MTkgOyMgNzU1MyBtb3ZzaS00CisJYmIsPj0gJXIxNSwxOSxMJDA4MjMgOyMgNzU1OCBtb3ZzaS00CisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyA3NTYwIHJlbG9hZF9vdXRzaSsyLzUKKwlsZGIgMCglcjE5KSwlcjE5IDsjIDc1NjIgbW92cWkrMS81CisJbGRpIDEyMywlcjIwIDsjIDc1NjUgcmVsb2FkX291dHNpKzIvMgorCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1NjMgZXh0ZW5kcWlzaTIKKwljb21iLD0sbiAlcjIwLCVyMTksTCQwODIwIDsjIDc1NjcgYmxldSsxCisJbGR3IDAoJXI1KSwlcjQgOyMgODIyOCByZWxvYWRfb3V0c2krMi81CisJYmwsbiBMJDExNzcsJXIwIDsjIDc1NjgganVtcAorTCQwODIzCisJbGR3IC0yOTYoJXIzMCksJXIyMSA7IyA3NTcyIHJlbG9hZF9vdXRzaSsyLzUKKwlsZGIgMCglcjIxKSwlcjE5IDsjIDc1NzQgbW92cWkrMS81CisJbGRpIDkyLCVyMjAgOyMgNzU3NyByZWxvYWRfb3V0c2krMi8yCisJZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU3NSBleHRlbmRxaXNpMgorCWNvbWIsPD4sbiAlcjIwLCVyMTksTCQwODE5IDsjIDc1NzkgYmxldSsxCisJbGRiIDEoJXIyMSksJXIxOSA7IyA3NTgzIG1vdnFpKzEvNQorCWxkaSAxMjMsJXIyMCA7IyA3NTg2IHJlbG9hZF9vdXRzaSsyLzIKKwlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTg0IGV4dGVuZHFpc2kyCisJY29tYiw8PixuICVyMjAsJXIxOSxMJDA4MTkgOyMgNzU4OCBibGV1KzEKK0wkMDgyMAorCWxkdyAwKCVyNSksJXI0IDsjIDgyMjAgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA4MjIzIHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMjEgc3Vic2kzLzEKKwlsZG8gMiglcjE5KSwlcjE5IDsjIDgyMjIgYWRkc2kzLzIKKwljb21iLD4+PSAlcjIwLCVyMTksTCQwODI5IDsjIDgyMjQgYmxldSsxCisJY29weSAlcjYsJXI4IDsjIDc1OTYgcmVsb2FkX291dHNpKzIvMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1MSByZWxvYWRfb3V0c2krMi8zCitMJDA4MzAKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDc2MjQgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzYzNCBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA4MzUgOyMgNzY0MiBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNzYzNiByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNzY0NSByZWxvYWRfb3V0c2krMi82CitMJDA4MzUKKwlsZHcgMCglcjUpLCVyMjYgOyMgNzY1MiByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA3NjU2IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDc2NTQgcmVsb2FkX291dHNpKzIvNQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3NjY0IGJsZXUrMQorCWJsIEwkMDk1MywlcjAKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNzY2MCByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXI0LEwkMDgyOCA7IyA3Njc0IGJsZXUrMQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzY3NiBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3Njc5IGFkZHNpMy8xCisJc3ViICVyMTIsJXI0LCVyMTkgOyMgNzY4MCBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDgzOCA7IyA3Njg1IGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzY4MyBhZGRzaTMvMQorCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDc2ODYgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDc2ODkgYWRkc2kzLzEKK0wkMDgzOAorCWNvbWliLD0gMCwlcjgsTCQwODM5IDsjIDc2OTIgYmxldSsxCisJc3ViICVyOCwlcjQsJXIxOSA7IyA3NjkzIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDc2OTYgYWRkc2kzLzEKK0wkMDgzOQorCWNvbWliLD0gMCwlcjksTCQwODI4IDsjIDc2OTkgYmxldSsxCisJc3ViICVyOSwlcjQsJXIxOSA7IyA3NzAwIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDc3MDMgYWRkc2kzLzEKK0wkMDgyOAorCWxkdyAwKCVyNSksJXI0IDsjIDc2MDQgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA3NjA4IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDc2MDUgc3Vic2kzLzEKKwlsZG8gMiglcjE5KSwlcjE5IDsjIDc2MDYgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA4MzAKKwlub3AgOyMgNzYxMCBibGV1KzEKK0wkMDgyOQorCWxkaSAxLCVyMTkgOyMgNzcyNSBtb3ZxaSsxLzIKKwlzdGJzLG1hICVyMTksMSglcjYpIDsjIDc3MjYgbW92cWkrMS82CisJc3RicyxtYSAlcjAsMSglcjYpIDsjIDc3MjkgbW92cWkrMS82CisJbGRvIC0xKCVyNiksJXI5IDsjIDc3NDEgYWRkc2kzLzIKK0wkMDgxOQorCWxkdyAwKCVyNSksJXI0IDsjIDgyMjggcmVsb2FkX291dHNpKzIvNQorTCQxMTc3CisJbGR3IDQoJXI1KSwlcjIwIDsjIDgyMzEgcmVsb2FkX291dHNpKzIvNQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIyOSBzdWJzaTMvMQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgODIzMCBhZGRzaTMvMgorCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDg0OCA7IyA4MjMyIGJsZXUrMQorCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU0OSByZWxvYWRfb3V0c2krMi8zCitMJDA4NDkKKwljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDc3NzEgYmxldSsxCisJemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNzc4MSBhc2hsc2kzKzEKKwljb21iLD4+PSAlcjMsJXIxOSxMJDA4NTQgOyMgNzc4OSBibGV1KzEKKwlzdHcgJXIxOSw0KCVyNSkgOyMgNzc4MyByZWxvYWRfb3V0c2krMi82CisJc3R3ICVyMyw0KCVyNSkgOyMgNzc5MiByZWxvYWRfb3V0c2krMi82CitMJDA4NTQKKwlsZHcgMCglcjUpLCVyMjYgOyMgNzc5OSByZWxvYWRfb3V0c2krMi81CisJLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKKwlibCByZWFsbG9jLCVyMiA7IyA3ODAzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCisJbGR3IDQoJXI1KSwlcjI1IDsjIDc4MDEgcmVsb2FkX291dHNpKzIvNQorCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA3ODExIGJsZXUrMQorCWJsIEwkMDk1MywlcjAKKwlzdHcgJXIyOCwwKCVyNSkgOyMgNzgwNyByZWxvYWRfb3V0c2krMi82CisJY29tYiw9ICVyMjgsJXI0LEwkMDg0NyA7IyA3ODIxIGJsZXUrMQorCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzgyMyBzdWJzaTMvMQorCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA3ODI2IGFkZHNpMy8xCisJc3ViICVyMTIsJXI0LCVyMTkgOyMgNzgyNyBzdWJzaTMvMQorCWNvbWliLD0gMCwlcjEwLEwkMDg1NyA7IyA3ODMyIGJsZXUrMQorCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzgzMCBhZGRzaTMvMQorCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDc4MzMgc3Vic2kzLzEKKwlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDc4MzYgYWRkc2kzLzEKK0wkMDg1NworCWNvbWliLD0gMCwlcjgsTCQwODU4IDsjIDc4MzkgYmxldSsxCisJc3ViICVyOCwlcjQsJXIxOSA7IyA3ODQwIHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI4IDsjIDc4NDMgYWRkc2kzLzEKK0wkMDg1OAorCWNvbWliLD0gMCwlcjksTCQwODQ3IDsjIDc4NDYgYmxldSsxCisJc3ViICVyOSwlcjQsJXIxOSA7IyA3ODQ3IHN1YnNpMy8xCisJYWRkbCAlcjI4LCVyMTksJXI5IDsjIDc4NTAgYWRkc2kzLzEKK0wkMDg0NworCWxkdyAwKCVyNSksJXI0IDsjIDc3NTEgcmVsb2FkX291dHNpKzIvNQorCWxkdyA0KCVyNSksJXIyMCA7IyA3NzU1IHJlbG9hZF9vdXRzaSsyLzUKKwlzdWIgJXI2LCVyNCwlcjE5IDsjIDc3NTIgc3Vic2kzLzEKKwlsZG8gMSglcjE5KSwlcjE5IDsjIDc3NTMgYWRkc2kzLzIKKwljb21iLDw8ICVyMjAsJXIxOSxMJDA4NDkKKwlub3AgOyMgNzc1NyBibGV1KzEKK0wkMDg0OAorCXN0YnMsbWEgJXI3LDEoJXI2KSA7IyA3ODcyIG1vdnFpKzEvNgorCWxkYiAwKCVyOSksJXIxOSA7IyA3ODg1IG1vdnFpKzEvNQorCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzg4OCBhZGRzaTMvMgorCXN0YiAlcjE5LDAoJXI5KSA7IyA3ODkwIG1vdnFpKzEvNgorTCQwMDQzCisJbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyMzI4IHJlbG9hZF9vdXRzaSsyLzUKK0wkMTE2MQorCWNvbWNsciw9ICVyMTYsJXIxOSwlcjAgOyMgMjU4IGJsZXUrMQorCWJsIEwkMTE3OCwlcjAKKwlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDIzMzQgcmVsb2FkX291dHNpKzIvNQorTCQwMDQ0CisJY29taWIsPSAwLCVyMTAsTCQwODY1IDsjIDc5MTMgYmxldSsxCisJbGRpIDEzLCVyMjYgOyMgNzkxOCByZWxvYWRfb3V0c2krMi8yCisJY29weSAlcjEwLCVyMjUgOyMgNzkyMCByZWxvYWRfb3V0c2krMi8xCisJc3ViICVyNiwlcjI1LCVyMjQgOyMgNzkxNSBzdWJzaTMvMQorCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCisJYmwgc3RvcmVfb3AxLCVyMiA7IyA3OTI0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGRvIC0zKCVyMjQpLCVyMjQgOyMgNzkyMiBhZGRzaTMvMgorTCQwODY1CisJbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA3OTI4IHJlbG9hZF9vdXRzaSsyLzUKKwljb21pYiw8PixuIDAsJXIxOSxMJDA4NjYgOyMgNzkzMCBibGV1KzEKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGZyZWUsJXIyIDsjIDc5NDYgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDc5NDQgcmVsb2FkX291dHNpKzIvNQorCWxkdyAwKCVyNSksJXIxOSA7IyA3OTQ5IHJlbG9hZF9vdXRzaSsyLzUKKwlsZGkgMCwlcjI4IDsjIDc5NTUgcmVsb2FkX291dHNpKzIvMgorCXN1YiAlcjYsJXIxOSwlcjE5IDsjIDc5NTAgc3Vic2kzLzEKKwlibCBMJDA4NjcsJXIwIDsjIDc5NTcganVtcAorCXN0dyAlcjE5LDgoJXI1KSA7IyA3OTUyIHJlbG9hZF9vdXRzaSsyLzYKK0wkMDg5NQorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgMjI2OSBjYWxsX2ludGVybmFsX3N5bXJlZgorCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjI2NyByZWxvYWRfb3V0c2krMi81CisJYmwgTCQwODY3LCVyMCA7IyAyMjczIGp1bXAKKwlsZGkgMTEsJXIyOCA7IyAyMjcxIHJlbG9hZF9vdXRzaSsyLzIKK0wkMDkwMAorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgMzE2MSBjYWxsX2ludGVybmFsX3N5bXJlZgorCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzE1OSByZWxvYWRfb3V0c2krMi81CisJYmwgTCQwODY3LCVyMCA7IyAzMTY1IGp1bXAKKwlsZGkgNCwlcjI4IDsjIDMxNjMgcmVsb2FkX291dHNpKzIvMgorTCQwOTAyCisJLkNBTEwgQVJHVzA9R1IKKwlibCBmcmVlLCVyMiA7IyAzMjE4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzMjE2IHJlbG9hZF9vdXRzaSsyLzUKKwlibCBMJDA4NjcsJXIwIDsjIDMyMjIganVtcAorCWxkaSA3LCVyMjggOyMgMzIyMCByZWxvYWRfb3V0c2krMi8yCitMJDA5MDMKKwkuQ0FMTCBBUkdXMD1HUgorCWJsIGZyZWUsJXIyIDsjIDM4MDMgY2FsbF9pbnRlcm5hbF9zeW1yZWYKKwlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDM4MDEgcmVsb2FkX291dHNpKzIvNQorCWJsIEwkMDg2NywlcjAgOyMgMzgwNyBqdW1wCisJbGRpIDUsJXIyOCA7IyAzODA1IHJlbG9hZF9vdXRzaSsyLzIKK0wkMDkxNQorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgNTQ2MSBjYWxsX2ludGVybmFsX3N5bXJlZgorCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTQ1OSByZWxvYWRfb3V0c2krMi81CisJYmwgTCQwODY3LCVyMCA7IyA1NDY1IGp1bXAKKwlsZGkgOSwlcjI4IDsjIDU0NjMgcmVsb2FkX291dHNpKzIvMgorTCQwOTE3CisJLkNBTEwgQVJHVzA9R1IKKwlibCBmcmVlLCVyMiA7IyA1NTU3IGNhbGxfaW50ZXJuYWxfc3ltcmVmCisJbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NTU1IHJlbG9hZF9vdXRzaSsyLzUKKwlibCBMJDA4NjcsJXIwIDsjIDU1NjEganVtcAorCWxkaSAxMywlcjI4IDsjIDU1NTkgcmVsb2FkX291dHNpKzIvMgorTCQwOTIyCisJYmwgTCQwODY3LCVyMCA7IyA1OTgzIGp1bXAKKwlsZGkgMTQsJXIyOCA7IyA1OTgxIHJlbG9hZF9vdXRzaSsyLzIKK0wkMDkzOQorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgNzIzNSBjYWxsX2ludGVybmFsX3N5bXJlZgorCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNzIzMyByZWxvYWRfb3V0c2krMi81CisJYmwgTCQwODY3LCVyMCA7IyA3MjM5IGp1bXAKKwlsZGkgNiwlcjI4IDsjIDcyMzcgcmVsb2FkX291dHNpKzIvMgorTCQwOTQ0CisJYmwgTCQwODY3LCVyMCA7IyA3Nzc1IGp1bXAKKwlsZGkgMTUsJXIyOCA7IyA3NzczIHJlbG9hZF9vdXRzaSsyLzIKK0wkMDg2NgorCS5DQUxMIEFSR1cwPUdSCisJYmwgZnJlZSwlcjIgOyMgNzkzNSBjYWxsX2ludGVybmFsX3N5bXJlZgorCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNzkzMyByZWxvYWRfb3V0c2krMi81CisJbGRpIDgsJXIyOCA7IyA3OTM3IHJlbG9hZF9vdXRzaSsyLzIKK0wkMDg2NworCWxkdyAtMzQwKCVyMzApLCVyMiA7IyA5MDI2IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTE2OCglcjMwKSwlcjE4IDsjIDkwMjggcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMTY0KCVyMzApLCVyMTcgOyMgOTAzMCByZWxvYWRfb3V0c2krMi81CisJbGR3IC0xNjAoJXIzMCksJXIxNiA7IyA5MDMyIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTE1NiglcjMwKSwlcjE1IDsjIDkwMzQgcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMTUyKCVyMzApLCVyMTQgOyMgOTAzNiByZWxvYWRfb3V0c2krMi81CisJbGR3IC0xNDgoJXIzMCksJXIxMyA7IyA5MDM4IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTE0NCglcjMwKSwlcjEyIDsjIDkwNDAgcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMTQwKCVyMzApLCVyMTEgOyMgOTA0MiByZWxvYWRfb3V0c2krMi81CisJbGR3IC0xMzYoJXIzMCksJXIxMCA7IyA5MDQ0IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTEzMiglcjMwKSwlcjkgOyMgOTA0NiByZWxvYWRfb3V0c2krMi81CisJbGR3IC0xMjgoJXIzMCksJXI4IDsjIDkwNDggcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMTI0KCVyMzApLCVyNyA7IyA5MDUwIHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTEyMCglcjMwKSwlcjYgOyMgOTA1MiByZWxvYWRfb3V0c2krMi81CisJbGR3IC0xMTYoJXIzMCksJXI1IDsjIDkwNTQgcmVsb2FkX291dHNpKzIvNQorCWxkdyAtMTEyKCVyMzApLCVyNCA7IyA5MDU2IHJlbG9hZF9vdXRzaSsyLzUKKwlsZHcgLTEwOCglcjMwKSwlcjMgOyMgOTA1OCByZWxvYWRfb3V0c2krMi81CisJYnYgJXIwKCVyMikgOyMgOTA2MSByZXR1cm5faW50ZXJuYWwKKwlsZG8gLTMyMCglcjMwKSwlcjMwIDsjIDkwNjAgYWRkc2kzLzIKKwkuRVhJVAorCS5QUk9DRU5ECisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJEJTUyQKKworCS5hbGlnbiAxCityZV9zeW50YXhfdGFibGUKKwkuYmxvY2sgMjU2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2NvbW1vbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJiMGNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucwpAQCAtMCwwICsxLDggQEAKKwkudGV4dAordGV4dF9zeW1ib2w6CQorCS5sb25nCTEKKwkubG9uZwlleHRlcm5hbF9zeW1ib2wKKwkuZGF0YQorZGF0YV9zeW1ib2w6CisJLmxvbmcJMgorY29tbW9uX3N5bWJvbAkuY29tbQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzQxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ZyYWdidWcucwpAQCAtMCwwICsxLDMgQEAKKwkuU1BBQ0UgJFRFWFQkCQorCS5TVUJTUEEgJENPREUkCQorCW5vcAkJCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmMDVmNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKQEAgLTAsMCArMSwxNiBAQAorCisJLnNwYWNlICRQUklWQVRFJAorCS5zdWJzcGEgJEdMT0JBTCQKKwkuZXhwb3J0ICRnbG9iYWwkCiskZ2xvYmFsJAorCS5zcGFjZSAkVEVYVCQKKwkuc3Vic3BhICRDT0RFJAorCisJLnByb2MKKwkuY2FsbGluZm8KK2l2YWFkZHIKKwlub3AKKwlub3AKKwlhZGRpbCBMJWl2YWFkZHItJGdsb2JhbCQsJWRwCisJbGRvICAgUiVpdmFhZGRyLSRnbG9iYWwkKCVyMSksJXIxOQorCS5wcm9jZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2ltcG9ydGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRhZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucwpAQCAtMCwwICsxLDQyIEBACisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQorCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgorCS5TUEFDRSAkVEVYVCQKKwkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAorCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKKwkuSU1QT1JUICRnbG9iYWwkLERBVEEKKwkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKKzsgZ2NjX2NvbXBpbGVkLjoKKwkuRVhQT1JUIGZvbyxEQVRBCisJLlNQQUNFICRQUklWQVRFJAorCS5TVUJTUEEgJERBVEEkCisKKwkuYWxpZ24gNAorZm9vOgorCS53b3JkIDAKKwkuSU1QT1JUIF9fbWFpbixDT0RFCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgbWFpbixDT0RFCisJLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCittYWluOgorCS5QUk9DCisJLkNBTExJTkZPIEZSQU1FPTY0LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCisJLkVOVFJZCisJLmltcG9ydCBmb28KKwlzdHcgJXIyLC0yMCgwLCVyMzApCisJY29weSAlcjMsJXIxCisJY29weSAlcjMwLCVyMworCXN0d20gJXIxLDY0KCVyMzApCisJLkNBTEwgCisJYmwgX19tYWluLCVyMgorCW5vcAorTCQwMDAxOgorCWxkdyAtMjAoJXIzKSwlcjIKKwlsZG8gNjQoJXIzKSwlcjMwCisJbGR3bSAtNjQoJXIzMCksJXIzCisJYnYsbiAlcjAoJXIyKQorCS5FWElUCisJLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlNjZmOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvbGFiZWxkaWZmcy5zCkBAIC0wLDAgKzEsNDAgQEAKKzsgU2hvdWxkIGNoZWNrIHRvIG1ha2Ugc3VyZSBzb21ldGhpbmcgdXNlZnVsIGdldHMgcHV0IG9uIHRob3NlIC53b3JkCis7IHN0YXRlbWVudHMuCisgICAgICAgIC5zcGFjZQkkVEVYVCQKKyAgICAgICAgLnN1YnNwYQkkQ09ERSQKKworCS5hbGlnbgk4CisJLmV4cG9ydAlpY29kZSxkYXRhCitpY29kZToKKwkucHJvYworCS5jYWxsaW5mbwlmcmFtZT0wLG5vX2NhbGxzCisJLmVudHJ5CisJYnYsbgklcjAoJXIyKQorCS5leGl0CisJbm9wCisJLnByb2NlbmQKKworCTsKKwk7IEZJUlNULCBhcmd2IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFyZ3MsIDFzdCBpcyBzYW1lIGFzIHBhdGguCisJOworCS5hbGlnbgk4CitpY19hcmd2OgorCS53b3JkCWljX2FyZ3YxLWljb2RlCTsgc2Vjb25kLCBwb2ludGVyIHRvIDFzdCBhcmd1bWVudAorCS53b3JkCWljX3BhdGgtaWNvZGUJCTsgZmlyc3QsICBwb2ludGVyIHRvIGluaXQgcGF0aAorCS53b3JkCTAJCQk7IGZvdXJ0aCwgTlVMTCBhcmd2IHRlcm1pbmF0b3IgKHBhZCkKKwkud29yZAkwCQkJOyB0aGlyZCwgIE5VTEwgYXJndiB0ZXJtaW5hdG9yCisKK2ljX3BhdGg6CisJLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKKwkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKKwkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCisKK2ljX2FyZ3YxOgorCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCisJLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCisJLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgorCisJLmV4cG9ydAlzemljb2RlLGRhdGEKK3N6aWNvZGU6CisJLndvcmQJc3ppY29kZS1pY29kZQorCS53b3JkCTAJCQk7IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVyIGF0IGVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDU3MjFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMKQEAgLTAsMCArMSwxNSBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkQ09ERSQKKworCS5hbGlnbiA0CisKK0xhYmVsOgorTCQwMTIzNDoKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9zc19hbGlnbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOThlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMKQEAgLTAsMCArMSwxMiBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049NjQsQUNDRVNTPTMxCisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0CisJLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQorCS5JTVBPUlQgJGdsb2JhbCQsREFUQQorCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQorOyBnY2NfY29tcGlsZWQuOgorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJAorc3ltMToJLldPUkQgMgorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzAwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cApAQCAtMCwwICsxLDI1OCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIERlamFHbnVAY3lnbnVzLmNvbQorCisjIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCisjIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KKworcHJvYyBkb19zdWJzcGFjZV9hbGlnbl90ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInNzX2FsaWduLnM6IFRlc3Qgc3Vic3BhY2UgYWxpZ25tZW50IChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInNzX2FsaWduLnMiICIiICJzdWJzcGFjZSBhbGlnbm1lbnQgKHBhcnQgMSkiXSB0aGVuIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItaCIKKworICAgICMgQ2hlY2sgdGhlIGhlYWRlcnMgZm9yIHRoZSBjb3JyZWN0IGFsaWdubWVudCB2YWx1ZSBmb3IgdGhlCisgICAgIyAuZGF0YSBzZWN0aW9uIChlbGYpIG9yIHRoZSAkREFUQSQgc3Vic3BhY2UgKHNvbSkuCisJaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4geworCSAgICB3aGlsZSAxIHsKKwkJZXhwZWN0IHsKKwkJICAgIC1yZSAiZGF0YVxbXlxuXF0qIDIuLjZcW15cblxdKlxuIgl7IHNldCB4IDEgfQorCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCQkgICAgZW9mCQkJCXsgYnJlYWsgfQorCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICB3aGlsZSAxIHsKKwkJZXhwZWN0ICB7CisJCSAgICAtcmUgIkRBVEFcW15cblxdKiAyLi42XFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KKwkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkJICAgIGVvZgkJCQl7IGJyZWFrIH0KKwkJfQorCSAgICB9CisJfQorCisJIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisJIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisJb2JqZHVtcF9maW5pc2gKKworCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKwlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KKyAgICB9Cit9CisKK3Byb2MgZG9fbG9jYWxfbGFiZWxfdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJsb2NhbGxhYmVsLnM6IEVsaW1pbmF0aW9uIG9mIGxvY2FsIGxhYmVscyAocGFydCAyKSIKKyAgICBzZXQgeCAwCisKKyAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJsb2NhbGxhYmVsLnMiICIiICJFbGltaW5hdGlvbiBvZiBsb2NhbCBsYWJlbHMgKHBhcnQxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItdCIKKworCXdoaWxlIDEgeworCSAgICBleHBlY3QgeworCQktcmUgIl4wMDAwMDAwMFxbXlxuXF0qTGFiZWxcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KKwkJLXJlICJeMDAwMDAwMDBcW15cblxdKkxcJDAxMjM0XFteXG5cXSpcbiIJeyBzZXQgeCAwIH0KKwkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCQllb2YJCQkJeyBicmVhayB9CisJICAgIH0KKwl9CisKKwkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKwkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKwlvYmpkdW1wX2ZpbmlzaAorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorICAgIH0KK30KKworcHJvYyBkb19mcmNoYWluX3Rlc3Qge30geworICAgIHNldCB0ZXN0bmFtZSAiZnJhZ2J1Zy5zOiBUZXN0IGJ1ZyBpbiBmcmFnIGNoYWluaW5nIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgImZyYWdidWcucyIgIiIgIlRlc3QgYnVnIGluIGZyYWcgY2hhaW5pbmcgKHBhcnQxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCisKKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkJLXJlICJeMHgwMDAwMDAwMFxbXlxuXF0qbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9CisJCS1yZSAiXjB4MDAwMDAwMDRcW15cblxdKm5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDAgfQorCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJCWVvZgkJCQl7IGJyZWFrIH0KKwkgICAgfQorCX0KKworCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorCW9iamR1bXBfZmluaXNoCisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisgICAgfQorfQorCitwcm9jIGRvX2FsaWduM190ZXN0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImFsaWduMy5zOiBUZXN0IGZvciBhbGlnbm1lbnQgYnVnIHdoZW4gc3dpdGNoaW5nIHN1YnNwYWNlcyAocGFydDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgImFsaWduMy5zIiAiIiAiVGVzdCBmb3IgYWxpZ25tZW50IGJ1ZyB3aGVuIHN3aXRjaGluZyBzdWJzcGFjZXMgKHBhcnQxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCisKKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkJLXJlICJcW15cblxdKiA8bWFpbj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9CisJCS1yZSAiXFteXG5cXSogPC4qZW5kX21haW4+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQorCQktcmUgIlxbXlxuXF0qIDxtYWluKy4qPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAwIH0KKwkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCQllb2YJCQkJeyBicmVhayB9CisJICAgIH0KKwl9CisKKwkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKwkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKwlvYmpkdW1wX2ZpbmlzaAorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorICAgIH0KK30KKworcHJvYyBkb19hbGlnbjRfdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJhbGlnbjQuczogTW9yZSBzdWJzcGFjZSBhbGlnbm1lbnQgdGVzdHMgKHBhcnQyKSIKKyAgICBzZXQgeCAwCisKKyAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7CisJcmV0dXJuCisgICAgfQorCisgICAgaWYgW2dhc190ZXN0X29sZCAiYWxpZ240LnMiICIiICJNb3JlIHN1YnNwYWNlIGFsaWdubWVudCB0ZXN0cyAocGFydDEpIl0geworCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1oIgorCisJd2hpbGUgMSB7CisJICAgIGV4cGVjdCB7CisJCS1yZSAiXFteXG5cXSpNSUxMSUNPREVcW15cblxdKjIuLjZcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJCS1yZSAiXFteXG5cXSpZQUJCQVxbXlxuXF0qMi4uM1xbXlxuXF0qXG4iCisJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCQllb2YJCQkJeyBicmVhayB9CisJICAgIH0KKwl9CisKKwkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKwkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKwlvYmpkdW1wX2ZpbmlzaAorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorICAgIH0KK30KKworcHJvYyBkb19pbXBvcnRfdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJpbXBvcnRidWcuczogVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MikiCisgICAgc2V0IHggMAorCisgICAgaWYgW2dhc190ZXN0X29sZCAiaW1wb3J0YnVnLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmltcG9ydCBkaXJlY3RpdmUgKHBhcnQxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCisKKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkJLXJlICJcW15cblxdKi5EQVRBLi5mb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KKwkJLXJlICJcW15cblxdKi5kYXRhLipmb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KKwkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCQllb2YJCQkJeyBicmVhayB9CisJICAgIH0KKwl9CisKKwkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKwkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKwlvYmpkdW1wX2ZpbmlzaAorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorICAgIH0KK30KKworcHJvYyBkb19jb21tb25fdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjb21tb24uczogVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MikiCisgICAgc2V0IHggMAorCisgICAgaWYgW2dhc190ZXN0X29sZCAiY29tbW9uLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmNvbW0gaGFuZGxpbmcgKHBhcnQxKSJdIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCisKKwl3aGlsZSAxIHsKKwkgICAgZXhwZWN0IHsKKwkJLXJlICJcW15cblxdKi5DT00uKmNvbW1vbl9zeW1ib2xcW15cblxdKlxuIgl7IHNldCB4IDEgfQorCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJCWVvZgkJCQl7IGJyZWFrIH0KKwkgICAgfQorCX0KKworCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorCW9iamR1bXBfZmluaXNoCisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9CisgICAgfQorfQorCitpZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKKyAgICAjIE1ha2Ugc3VyZSBzdWJzcGFjZSBhbGlnbm1lbnQgcmVxdWVzdHMgZnJvbSB0aGUgc3Vic3BhY2UgZGlyZWN0aXZlcworICAgICMgYXJlIGhvbm9yZWQKKyAgICBkb19zdWJzcGFjZV9hbGlnbl90ZXN0CisKKyAgICAjIE1ha2Ugc3VyZSB0aGUgY29ycmVjdCBsYWJlbHMgZW5kIHVwIGluIHRoZSBzeW1ib2wgdGFibGUKKyAgICBkb19sb2NhbF9sYWJlbF90ZXN0CisKKyAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCisgICAgZ2FzX3Rlc3QgImxhYmVsZGlmZnMucyIgIiIgIiIgIkRpZmZlcmVuY2Ugb2YgbGFiZWxzIgorCisgICAgIyBUZXN0IGEgcmVjZW50IGJ1ZyB3aGVyZSBmcmFnIGNoYWluaW5nIHdhc24ndCB3b3JraW5nIGNvcnJlY3RseS4KKyAgICBkb19mcmNoYWluX3Rlc3QKKworICAgICMgVGVzdCBidWcgd2hlcmUgc3dpdGNoaW5nIGJldHdlZW4gc3Vic3BhY2VzIGNyZWF0ZXMgYm9ndXMgYWxpZ25tZW50cworICAgIGRvX2FsaWduM190ZXN0CisKKyAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKKyAgICBkb19hbGlnbjRfdGVzdAorCisgICAgIyBUZXN0IGEgcHJvYmxlbSB3aGVyZSAkZ2xvYmFsJCBpcyBkZWZpbmVkLCB0aGVuIHVzZWQgd2l0aGluIHRoZQorICAgICMgc2FtZSBzb3VyY2UgZmlsZS4KKyAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKKyAgICBnYXNfdGVzdCAiZ2xvYmFsYnVnLnMiICIiICIiICJVc2UgXCRnbG9iYWxcJCBpbiBmaWxlIHdoaWNoIGRlZmluZXMgaXQiCisKKyAgICAjIFRlc3QgdGhhdCBpbXBvcnRpbmcgYSBkZWZpbmVkIHN5bWJvbCBkb2Vzbid0IHNjcmV3IHVwIHRoZSBzeW1ib2wncworICAgICMgc3BhY2Uvc3Vic3BhY2UuCisgICAgZG9faW1wb3J0X3Rlc3QKKworICAgICMgVGVzdCBmb3IgYSBidWdsZXQgaW4gdGhlIGhhbmRsaW5nIG9mIGNvbW1vbiBzeW1ib2xzCisgICAgZG9fY29tbW9uX3Rlc3QKKworICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LTIgYnVnIGluIHJhbmdlIGNoZWNrIGZvciBjb25kaXRpb25hbCBicmFuY2hlcworICAgIGdhc190ZXN0X2Vycm9yICJicmxlbmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGJyYW5jaCBsZW5ndGgiCisKK30KKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlOGIwZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKQEAgLTAsMCArMSwzNyBAQAorI29iamR1bXA6IC1kdworI25hbWU6IGkzODYgYW1kCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCswMDAgPC50ZXh0PjoKKyAgIDA6CTBmIDBkIDAzIFsgCV0qcHJlZmV0Y2ggXCglZWJ4XCkKKyAgIDM6CTBmIDBkIDBjIDc1IDAwIDEwIDAwIDAwIFsgCV0qcHJlZmV0Y2h3IDB4MTAwMFwoLCVlc2ksMlwpCisgICBiOgkwZiAwZSBbIAldKmZlbW1zICAKKyAgIGQ6CTBmIDBmIDAwIGJmIFsgCV0qcGF2Z3VzYiBcKCVlYXhcKSwlbW0wCisgIDExOgkwZiAwZiA0OCAwMiAxZCBbIAldKnBmMmlkICAweDJcKCVlYXhcKSwlbW0xCisgIDE2OgkwZiAwZiA5MCAwMCAwMSAwMCAwMCBhZSBbIAldKnBmYWNjICAweDEwMFwoJWVheFwpLCVtbTIKKyAgMWU6CTBmIDBmIDFlIDllIFsgCV0qcGZhZGQgIFwoJWVzaVwpLCVtbTMKKyAgMjI6CTBmIDBmIDY2IDAyIGIwIFsgCV0qcGZjbXBlcSAweDJcKCVlc2lcKSwlbW00CisgIDI3OgkwZiAwZiBhZSA5MCA5MCAwMCAwMCA5MCBbIAldKnBmY21wZ2UgMHg5MDkwXCglZXNpXCksJW1tNQorICAyZjoJMGYgMGYgNzQgNzUgMDAgYTAgWyAJXSpwZmNtcGd0IDB4MFwoJWVicCwlZXNpLDJcKSwlbW02CisgIDM1OgkwZiAwZiA3YyA3NSAwMiBhNCBbIAldKnBmbWF4ICAweDJcKCVlYnAsJWVzaSwyXCksJW1tNworICAzYjoJMGYgMGYgODQgNzUgOTAgOTAgOTAgOTAgOTQgWyAJXSpwZm1pbiAgMHg5MDkwOTA5MFwoJWVicCwlZXNpLDJcKSwlbW0wCisgIDQ0OgkwZiAwZiAwZCAwNCAwMCAwMCAwMCBiNCBbIAldKnBmbXVsICAweDQsJW1tMQorICA0YzoJMmUgMGYgMGYgNTQgYzMgMDcgOTYgWyAJXSpwZnJjcCAgJWNzOjB4N1woJWVieCwlZWF4LDhcKSwlbW0yCisgIDUzOgkwZiAwZiBkOCBhNiBbIAldKnBmcmNwaXQxICVtbTAsJW1tMworICA1NzoJMGYgMGYgZTEgYjYgWyAJXSpwZnJjcGl0MiAlbW0xLCVtbTQKKyAgNWI6CTBmIDBmIGVhIGE3IFsgCV0qcGZyc3FpdDEgJW1tMiwlbW01CisgIDVmOgkwZiAwZiBmMyA5NyBbIAldKnBmcnNxcnQgJW1tMywlbW02CisgIDYzOgkwZiAwZiBmYyA5YSBbIAldKnBmc3ViICAlbW00LCVtbTcKKyAgNjc6CTBmIDBmIGM1IGFhIFsgCV0qcGZzdWJyICVtbTUsJW1tMAorICA2YjoJMGYgMGYgY2UgMGQgWyAJXSpwaTJmZCAgJW1tNiwlbW0xCisgIDZmOgkwZiAwZiBkNyBiNyBbIAldKnBmbXVsaHJ3ICVtbTcsJW1tMgorICA3MzoJMmUgMGYgWyAJXSpcKGJhZFwpICAKKyAgNzU6CTBmIDU0IFsgCV0qXChiYWRcKSAgCisgIDc3OgljMyBbIAldKnJldCAgICAKKyAgNzg6CTA3IFsgCV0qcG9wICAgICVlcworICA3OToJYzMgWyAJXSpyZXQgICAgCisgIDdhOgk5MCBbIAldKm5vcCAgICAKKyAgN2I6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0ZDU4MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLnMKQEAgLTAsMCArMSwzMyBAQAorI0FNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zCisKKy50ZXh0CisgcHJlZmV0Y2gJKCVlYngpCisgcHJlZmV0Y2h3CTB4MTAwMCgsJWVzaSwyKQorIGZlbW1zCisgcGF2Z3VzYgkoJWVheCksJW1tMAorIHBmMmlkCQkyKCVlYXgpLCVtbTEKKyBwZmFjYwkJMHgxMDAoJWVheCksJW1tMgorIHBmYWRkCQkoJWVzaSksJW1tMworIHBmY21wZXEJMiglZXNpKSwlbW00CisgcGZjbXBnZQkweDkwOTAoJWVzaSksJW1tNQorIHBmY21wZ3QJKCVlYnAsJWVzaSwyKSwlbW02CisgcGZtYXgJCTIoJWVicCwlZXNpLDIpLCVtbTcKKyBwZm1pbgkJMHg5MDkwOTA5MCglZWJwLCVlc2ksMiksJW1tMAorIHBmbXVsCQk0LCVtbTEKKyBwZnJjcAkJJWNzOjcoJWVieCwlZWF4LDgpLCVtbTIKKyBwZnJjcGl0MQklbW0wLCVtbTMKKyBwZnJjcGl0MgklbW0xLCVtbTQKKyBwZnJzcWl0MQklbW0yLCVtbTUKKyBwZnJzcXJ0CSVtbTMsJW1tNgorIHBmc3ViCQklbW00LCVtbTcKKyBwZnN1YnIJCSVtbTUsJW1tMAorIHBpMmZkCQklbW02LCVtbTEKKyBwbXVsaHJ3CSVtbTcsJW1tMgorCisjIFRoaXMgaXMgYSAzRE5vdyEgaW5zdHJ1Y3Rpb24sIHdpdGggYSBwcmVmaXgsIHRoYXQgaXNuJ3QgcXVpdGUgcmlnaHQKKyMgRXZlcnl0aGluZydzIGdvb2QgYmFyIHRoZSBvcGNvZGUgc3VmZml4CisuYnl0ZSAweDJlLCAweDBmLCAweDBmLCAweDU0LCAweGMzLCAweDA3LCAweGMzCisKKyMgdG8gbWFrZSB1cyBpbnNlbnNpdGl2ZSB0byBhbGlnbm1lbnQKKyBub3AKKyBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDZjYWRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5sCkBAIC0wLDAgKzEsODEgQEAKKy4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6CisuKjozOiBXYXJuaW5nOi4qZmFkZHAuKgorLio6MTQ6IFdhcm5pbmc6Lipmc3VicC4qCisuKjoyNTogV2FybmluZzouKmZzdWJycC4qCisuKjozNjogV2FybmluZzouKmZtdWxwLioKKy4qOjQ3OiBXYXJuaW5nOi4qZmRpdnAuKgorLio6NTg6IFdhcm5pbmc6LipmZGl2cnAuKgorICAgMSBbIAldKi5wc2l6ZSAwCisgICAyIFsgCV0qLnRleHQKKyAgIDMgMDAwMCBERUMxIFsgCV0qZmFkZAorLipXYXJuaW5nOi4qZmFkZHAuKgorICAgNCAwMDAyIEQ4QzMgWyAJXSpmYWRkCSVzdFwoM1wpCisgICA1IDAwMDQgRDhDMyBbIAldKmZhZGQJJXN0XCgzXCksJXN0CisgICA2IDAwMDYgRENDMyBbIAldKmZhZGQJJXN0LCVzdFwoM1wpCisgICA3IDAwMDggRDgwMyBbIAldKmZhZGRzCVwoJWVieFwpCisgICA4IDAwMGEgREMwMyBbIAldKmZhZGRsCVwoJWVieFwpCisgICA5IDAwMGMgREUwMyBbIAldKmZpYWRkcwlcKCVlYnhcKQorICAxMCAwMDBlIERBMDMgWyAJXSpmaWFkZGwJXCglZWJ4XCkKKyAgMTEgMDAxMCBERUMxIFsgCV0qZmFkZHAKKyAgMTIgMDAxMiBERUMzIFsgCV0qZmFkZHAJJXN0XCgzXCkKKyAgMTMgMDAxNCBERUMzIFsgCV0qZmFkZHAJJXN0LCVzdFwoM1wpCisgIDE0IDAwMTYgREVFMSBbIAldKmZzdWIKKy4qV2FybmluZzouKmZzdWJwLioKKyAgMTUgMDAxOCBEOEUzIFsgCV0qZnN1Ygklc3RcKDNcKQorICAxNiAwMDFhIEQ4RTMgWyAJXSpmc3ViCSVzdFwoM1wpLCVzdAorICAxNyAwMDFjIERDRTMgWyAJXSpmc3ViCSVzdCwlc3RcKDNcKQorICAxOCAwMDFlIEQ4MjMgWyAJXSpmc3VicwlcKCVlYnhcKQorICAxOSAwMDIwIERDMjMgWyAJXSpmc3VibAlcKCVlYnhcKQorICAyMCAwMDIyIERFMjMgWyAJXSpmaXN1YnMJXCglZWJ4XCkKKyAgMjEgMDAyNCBEQTIzIFsgCV0qZmlzdWJsCVwoJWVieFwpCisgIDIyIDAwMjYgREVFMSBbIAldKmZzdWJwCisgIDIzIDAwMjggREVFMyBbIAldKmZzdWJwCSVzdFwoM1wpCisgIDI0IDAwMmEgREVFMyBbIAldKmZzdWJwCSVzdCwlc3RcKDNcKQorICAyNSAwMDJjIERFRTkgWyAJXSpmc3VicgorLipXYXJuaW5nOi4qZnN1YnJwLioKKyAgMjYgMDAyZSBEOEVCIFsgCV0qZnN1YnIJJXN0XCgzXCkKKyAgMjcgMDAzMCBEOEVCIFsgCV0qZnN1YnIJJXN0XCgzXCksJXN0CisgIDI4IDAwMzIgRENFQiBbIAldKmZzdWJyCSVzdCwlc3RcKDNcKQorICAyOSAwMDM0IEQ4MkIgWyAJXSpmc3VicnMJXCglZWJ4XCkKKyAgMzAgMDAzNiBEQzJCIFsgCV0qZnN1YnJsCVwoJWVieFwpCisgIDMxIDAwMzggREUyQiBbIAldKmZpc3VicnMJXCglZWJ4XCkKKyAgMzIgMDAzYSBEQTJCIFsgCV0qZmlzdWJybAlcKCVlYnhcKQorICAzMyAwMDNjIERFRTkgWyAJXSpmc3VicnAKKyAgMzQgMDAzZSBERUVCIFsgCV0qZnN1YnJwCSVzdFwoM1wpCisgIDM1IDAwNDAgREVFQiBbIAldKmZzdWJycAklc3QsJXN0XCgzXCkKKyAgMzYgMDA0MiBERUM5IFsgCV0qZm11bAorLipXYXJuaW5nOi4qZm11bHAuKgorICAzNyAwMDQ0IEQ4Q0IgWyAJXSpmbXVsCSVzdFwoM1wpCisgIDM4IDAwNDYgRDhDQiBbIAldKmZtdWwJJXN0XCgzXCksJXN0CisgIDM5IDAwNDggRENDQiBbIAldKmZtdWwJJXN0LCVzdFwoM1wpCisgIDQwIDAwNGEgRDgwQiBbIAldKmZtdWxzCVwoJWVieFwpCisgIDQxIDAwNGMgREMwQiBbIAldKmZtdWxsCVwoJWVieFwpCisgIDQyIDAwNGUgREUwQiBbIAldKmZpbXVscwlcKCVlYnhcKQorICA0MyAwMDUwIERBMEIgWyAJXSpmaW11bGwJXCglZWJ4XCkKKyAgNDQgMDA1MiBERUM5IFsgCV0qZm11bHAKKyAgNDUgMDA1NCBERUNCIFsgCV0qZm11bHAJJXN0XCgzXCkKKyAgNDYgMDA1NiBERUNCIFsgCV0qZm11bHAJJXN0LCVzdFwoM1wpCisgIDQ3IDAwNTggREVGMSBbIAldKmZkaXYKKy4qV2FybmluZzouKmZkaXZwLioKKyAgNDggMDA1YSBEOEYzIFsgCV0qZmRpdgklc3RcKDNcKQorICA0OSAwMDVjIEQ4RjMgWyAJXSpmZGl2CSVzdFwoM1wpLCVzdAorICA1MCAwMDVlIERDRjMgWyAJXSpmZGl2CSVzdCwlc3RcKDNcKQorICA1MSAwMDYwIEQ4MzMgWyAJXSpmZGl2cwlcKCVlYnhcKQorICA1MiAwMDYyIERDMzMgWyAJXSpmZGl2bAlcKCVlYnhcKQorICA1MyAwMDY0IERFMzMgWyAJXSpmaWRpdnMJXCglZWJ4XCkKKyAgNTQgMDA2NiBEQTMzIFsgCV0qZmlkaXZsCVwoJWVieFwpCisgIDU1IDAwNjggREVGMSBbIAldKmZkaXZwCisgIDU2IDAwNmEgREVGMyBbIAldKmZkaXZwCSVzdFwoM1wpCisgIDU3IDAwNmMgREVGMyBbIAldKmZkaXZwCSVzdCwlc3RcKDNcKQorICA1OCAwMDZlIERFRjkgWyAJXSpmZGl2cgorLipXYXJuaW5nOi4qZmRpdnJwLioKKyAgNTkgMDA3MCBEOEZCIFsgCV0qZmRpdnIJJXN0XCgzXCkKKyAgNjAgMDA3MiBEOEZCIFsgCV0qZmRpdnIJJXN0XCgzXCksJXN0CisgIDYxIDAwNzQgRENGQiBbIAldKmZkaXZyCSVzdCwlc3RcKDNcKQorICA2MiAwMDc2IEQ4M0IgWyAJXSpmZGl2cnMJXCglZWJ4XCkKKyAgNjMgMDA3OCBEQzNCIFsgCV0qZmRpdnJsCVwoJWVieFwpCisgIDY0IDAwN2EgREUzQiBbIAldKmZpZGl2cnMJXCglZWJ4XCkKKyAgNjUgMDA3YyBEQTNCIFsgCV0qZmlkaXZybAlcKCVlYnhcKQorICA2NiAwMDdlIERFRjkgWyAJXSpmZGl2cnAKKyAgNjcgMDA4MCBERUZCIFsgCV0qZmRpdnJwCSVzdFwoM1wpCisgIDY4IDAwODIgREVGQiBbIAldKmZkaXZycAklc3QsJXN0XCgzXCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmIwOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5zCkBAIC0wLDAgKzEsNjggQEAKKy5wc2l6ZSAwCisudGV4dAorCWZhZGQKKwlmYWRkCSVzdCgzKQorCWZhZGQJJXN0KDMpLCVzdAorCWZhZGQJJXN0LCVzdCgzKQorCWZhZGRzCSglZWJ4KQorCWZhZGRsCSglZWJ4KQorCWZpYWRkcwkoJWVieCkKKwlmaWFkZGwJKCVlYngpCisJZmFkZHAKKwlmYWRkcAklc3QoMykKKwlmYWRkcAklc3QsJXN0KDMpCisJZnN1YgorCWZzdWIJJXN0KDMpCisJZnN1Ygklc3QoMyksJXN0CisJZnN1Ygklc3QsJXN0KDMpCisJZnN1YnMJKCVlYngpCisJZnN1YmwJKCVlYngpCisJZmlzdWJzCSglZWJ4KQorCWZpc3VibAkoJWVieCkKKwlmc3VicAorCWZzdWJwCSVzdCgzKQorCWZzdWJwCSVzdCwlc3QoMykKKwlmc3VicgorCWZzdWJyCSVzdCgzKQorCWZzdWJyCSVzdCgzKSwlc3QKKwlmc3Vicgklc3QsJXN0KDMpCisJZnN1YnJzCSglZWJ4KQorCWZzdWJybAkoJWVieCkKKwlmaXN1YnJzCSglZWJ4KQorCWZpc3VicmwJKCVlYngpCisJZnN1YnJwCisJZnN1YnJwCSVzdCgzKQorCWZzdWJycAklc3QsJXN0KDMpCisJZm11bAorCWZtdWwJJXN0KDMpCisJZm11bAklc3QoMyksJXN0CisJZm11bAklc3QsJXN0KDMpCisJZm11bHMJKCVlYngpCisJZm11bGwJKCVlYngpCisJZmltdWxzCSglZWJ4KQorCWZpbXVsbAkoJWVieCkKKwlmbXVscAorCWZtdWxwCSVzdCgzKQorCWZtdWxwCSVzdCwlc3QoMykKKwlmZGl2CisJZmRpdgklc3QoMykKKwlmZGl2CSVzdCgzKSwlc3QKKwlmZGl2CSVzdCwlc3QoMykKKwlmZGl2cwkoJWVieCkKKwlmZGl2bAkoJWVieCkKKwlmaWRpdnMJKCVlYngpCisJZmlkaXZsCSglZWJ4KQorCWZkaXZwCisJZmRpdnAJJXN0KDMpCisJZmRpdnAJJXN0LCVzdCgzKQorCWZkaXZyCisJZmRpdnIJJXN0KDMpCisJZmRpdnIJJXN0KDMpLCVzdAorCWZkaXZyCSVzdCwlc3QoMykKKwlmZGl2cnMJKCVlYngpCisJZmRpdnJsCSglZWJ4KQorCWZpZGl2cnMJKCVlYngpCisJZmlkaXZybAkoJWVieCkKKwlmZGl2cnAKKwlmZGl2cnAJJXN0KDMpCisJZmRpdnJwCSVzdCwlc3QoMykKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMzQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5sCkBAIC0wLDAgKzEsMjA1IEBACisuKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgorLio6MTA6IFdhcm5pbmc6LioKKy4qOjEyOiBXYXJuaW5nOi4qCisuKjoxOTogV2FybmluZzouKgorLio6MjI6IFdhcm5pbmc6LioKKy4qOjgxOiBXYXJuaW5nOi4qCisuKjo4MjogV2FybmluZzouKgorLio6ODM6IFdhcm5pbmc6LioKKy4qOjg0OiBXYXJuaW5nOi4qCisuKjo4NTogV2FybmluZzouKgorLio6ODY6IFdhcm5pbmc6LioKKy4qOjg3OiBXYXJuaW5nOi4qCisuKjo4ODogV2FybmluZzouKgorLio6ODk6IFdhcm5pbmc6LioKKy4qOjkwOiBXYXJuaW5nOi4qCisuKjo5MTogV2FybmluZzouKgorLio6OTI6IFdhcm5pbmc6LioKKy4qOjkzOiBXYXJuaW5nOi4qCisuKjo5NDogV2FybmluZzouKgorLio6OTU6IFdhcm5pbmc6LioKKy4qOjk2OiBXYXJuaW5nOi4qCisuKjo5NzogV2FybmluZzouKgorLio6OTg6IFdhcm5pbmc6LioKKy4qOjk5OiBXYXJuaW5nOi4qCisuKjoxMDA6IFdhcm5pbmc6LioKKy4qOjEwMTogV2FybmluZzouKgorLio6MTM1OiBXYXJuaW5nOi4qCisgICAxICAgICAgICAgICAgICAgICAgICAgICAJLnBzaXplIDAKKyAgIDIgICAgICAgICAgICAgICAgICAgICAgIAkudGV4dAorICAgMyAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCB2YXJpb3VzIHNlZ21lbnQgcmVnIGluc25zCisgICA0IDAwMDAgMUUgICAgICAgICAgICAgICAgCQlwdXNoCSVkcworICAgNSAwMDAxIDFFICAgICAgICAgICAgICAgIAkJcHVzaGwJJWRzCisgICA2IDAwMDIgMUYgICAgICAgICAgICAgICAgCQlwb3AJJWRzCisgICA3IDAwMDMgMUYgICAgICAgICAgICAgICAgCQlwb3BsCSVkcworICAgOCAwMDA0IDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4CisgICA5IDAwMDYgOENEOCAgICAgICAgICAgICAgCQltb3ZsCSVkcywlZWF4CisgIDEwIDAwMDggOENEOCAgICAgICAgICAgICAgCQltb3ZsCSVkcywlYXgKKy4qV2FybmluZzouKgorICAxMSAwMDBhIDhFRDggICAgICAgICAgICAgIAkJbW92CSVlYXgsJWRzCisgIDEyIDAwMGMgOEVEOCAgICAgICAgICAgICAgCQltb3ZsCSVheCwlZHMKKy4qV2FybmluZzouKgorICAxMyAwMDBlIDhFRDggICAgICAgICAgICAgIAkJbW92bAklZWF4LCVkcworICAxNCAgICAgICAgICAgICAgICAgICAgICAgCQorICAxNSAwMDEwIDY2MUUgICAgICAgICAgICAgIAkJcHVzaHcJJWRzCisgIDE2IDAwMTIgNjYxRiAgICAgICAgICAgICAgCQlwb3B3CSVkcworICAxNyAwMDE0IDY2OENEOCAgICAgICAgICAgIAkJbW92CSVkcywlYXgKKyAgMTggMDAxNyA2NjhDRDggICAgICAgICAgICAJCW1vdncJJWRzLCVheAorICAxOSAwMDFhIDY2OENEOCAgICAgICAgICAgIAkJbW92dwklZHMsJWVheAorLipXYXJuaW5nOi4qCisgIDIwIDAwMWQgOEVEOCAgICAgICAgICAgICAgCQltb3YJJWF4LCVkcworICAyMSAwMDFmIDhFRDggICAgICAgICAgICAgIAkJbW92dwklYXgsJWRzCisgIDIyIDAwMjEgOEVEOCAgICAgICAgICAgICAgCQltb3Z3CSVlYXgsJWRzCisuKldhcm5pbmc6LioKKyAgMjMgICAgICAgICAgICAgICAgICAgICAgIAkKKyAgMjQgICAgICAgICAgICAgICAgICAgICAgIAkjIHRlc3QgdmFyaW91cyBwdXNoZXMKKyAgMjUgMDAyMyA2QTBBICAgICAgICAgICAgICAJCXB1c2hsCVwkMTAKKyAgMjYgMDAyNSA2NjZBMEEgICAgICAgICAgICAJCXB1c2h3CVwkMTAKKyAgMjcgMDAyOCA2QTBBICAgICAgICAgICAgICAJCXB1c2gJXCQxMAorICAyOCAwMDJhIDY4RTgwMzAwIDAwICAgICAgIAkJcHVzaGwJXCQxMDAwCisgIDI5IDAwMmYgNjY2OEU4MDMgICAgICAgICAgCQlwdXNodwlcJDEwMDAKKyAgMzAgMDAzMyA2OEU4MDMwMCAwMCAgICAgICAJCXB1c2gJXCQxMDAwCisgIDMxIDAwMzggRkYzNTU3MDAgMDAwMCAgICAgCQlwdXNobAkxZgorICAzMiAwMDNlIDY2RkYzNTU3IDAwMDAwMCAgIAkJcHVzaHcJMWYKKyAgMzMgMDA0NSBGRjM1NTcwMCAwMDAwICAgICAJCXB1c2gJMWYKKyAgMzQgMDA0YiBGRkIzMEMwMCAwMDAwICAgICAJCXB1c2gJXCgxZi0uXClcKCVlYnhcKQorICAzNSAwMDUxIEZGMzUwNjAwIDAwMDAgICAgIAkJcHVzaAkxZi0uCisgIDM2ICAgICAgICAgICAgICAgICAgICAgICAJIyB0aGVzZSwgYW5kIG90aGVycyBsaWtlIHRoZW0gc2hvdWxkIGhhdmUgbm8gb3BlcmFuZCBzaXplIHByZWZpeAorICAzNyAwMDU3IDBGMDBEMSAgICAgICAgICAgIAkxOglsbGR0CSVjeAorICAzOCAwMDVhIDBGMDFGMCAgICAgICAgICAgIAkJbG1zdwklYXgKKyAgMzkgICAgICAgICAgICAgICAgICAgICAgIAkKKyAgNDAgICAgICAgICAgICAgICAgICAgICAgIAkjIEp1c3QgdG8gbWFrZSBzdXJlIHRoZXNlIGRvbid0IGJlY29tZSBpbGxlZ2FsIGR1ZSB0byBvdmVyLWVudGh1c2lhc3RpYworICA0MSAgICAgICAgICAgICAgICAgICAgICAgCSMgcmVnaXN0ZXIgY2hlY2tpbmcKKyAgNDIgMDA1ZCA2NjBGQkVGOCAgICAgICAgICAJCW1vdnNidwklYWwsJWRpCisgIDQzIDAwNjEgMEZCRUM4ICAgICAgICAgICAgCQltb3ZzYmwJJWFsLCVlY3gKKyAgNDQgMDA2NCAwRkJGQzggICAgICAgICAgICAJCW1vdnN3bAklYXgsJWVjeAorICA0NSAwMDY3IDY2MEZCNkY4ICAgICAgICAgIAkJbW92emJ3CSVhbCwlZGkKKyAgNDYgMDA2YiAwRkI2QzggICAgICAgICAgICAJCW1vdnpibAklYWwsJWVjeAorICA0NyAwMDZlIDBGQjdDOCAgICAgICAgICAgIAkJbW92endsCSVheCwlZWN4CisgIDQ4ICAgICAgICAgICAgICAgICAgICAgICAJCisgIDQ5IDAwNzEgRUMgICAgICAgICAgICAgICAgCQlpbgklZHgsJWFsCisgIDUwIDAwNzIgNjZFRCAgICAgICAgICAgICAgCQlpbgklZHgsJWF4CisgIDUxIDAwNzQgRUQgICAgICAgICAgICAgICAgCQlpbgklZHgsJWVheAorICA1MiAwMDc1IEVDICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYWwKKyAgNTMgMDA3NiA2NkVEICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWF4CisgIDU0IDAwNzggRUQgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVlYXgKKyAgNTUgMDA3OSBFQyAgICAgICAgICAgICAgICAJCWluYgklZHgsJWFsCisgIDU2IDAwN2EgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4LCVheAorICA1NyAwMDdjIEVEICAgICAgICAgICAgICAgIAkJaW5sCSVkeCwlZWF4CisgIDU4IDAwN2QgRUMgICAgICAgICAgICAgICAgCQlpbmIJJWR4CisgIDU5IDAwN2UgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4CisgIDYwIDAwODAgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4CisgIDYxIDAwODEgRTRGRiAgICAgICAgICAgICAgCQlpbmIJXCQyNTUKKyAgNjIgMDA4MyA2NkU1MDIgICAgICAgICAgICAJCWludwlcJDIKKyAgNjMgMDA4NiBFNTA0ICAgICAgICAgICAgICAJCWlubAlcJDQKKyAgNjQgMDA4OCBFRiAgICAgICAgICAgICAgICAJCW91dGwJJWVheCwlZHgKKyAgNjUgMDA4OSBFNjJBICAgICAgICAgICAgICAJCW91dAklYWwsIFwkNDIKKyAgNjYgMDA4YiA2NkU1MEQgICAgICAgICAgICAJCWluCVwkMTMsICVheAorICA2NyAgICAgICAgICAgICAgICAgICAgICAgCSMgVGhlc2UgYXJlIHVzZWQgaW4gQUlYLgorICA2OCAwMDhlIDY2RUQgICAgICAgICAgICAgIAkJaW53CVwoJWR4XCkKKyAgNjkgMDA5MCA2NkVGICAgICAgICAgICAgICAJCW91dHcJXCglZHhcKQorICA3MCAgICAgICAgICAgICAgICAgICAgICAgCQorICA3MSAwMDkyIEE0ICAgICAgICAgICAgICAgIAkJbW92c2IKKyAgNzIgMDA5MyA2NkE3ICAgICAgICAgICAgICAJCWNtcHN3CisgIDczIDAwOTUgQUYgICAgICAgICAgICAgICAgCQlzY2FzbAorICA3NCAwMDk2IEQ3ICAgICAgICAgICAgICAgIAkJeGxhdGIKKyAgNzUgMDA5NyAyRUE1ICAgICAgICAgICAgICAJCW1vdnNsCSVjczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKKyAgNzYgMDA5OSAwRjkzMDMgICAgICAgICAgICAJCXNldGFlCVwoJWVieFwpCisgIDc3IDAwOWMgMEY5MzAzICAgICAgICAgICAgCQlzZXRhZWIJXCglZWJ4XCkKKyAgNzggMDA5ZiAwRjkzQzAgICAgICAgICAgICAJCXNldGFlCSVhbAorICA3OSAgICAgICAgICAgICAgICAgICAgICAgCQorICA4MCAgICAgICAgICAgICAgICAgICAgICAgCSN0aGVzZSBzaG91bGQgZ2l2ZSB3YXJuaW5ncworICA4MSAwMGEyIDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlYXgKKy4qV2FybmluZzouKgorICA4MiAwMGE0IDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlZWF4CisuKldhcm5pbmc6LioKKyAgODMgMDBhNiA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWJ4CisuKldhcm5pbmc6LioKKyAgODQgMDBhOSA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWVieAorLipXYXJuaW5nOi4qCisgIDg1IDAwYWMgRDlDMSAgICAgICAgICAgICAgCQlmbGRsCSVzdFwoMVwpCisuKldhcm5pbmc6LioKKyAgODYgMDBhZSBEREQyICAgICAgICAgICAgICAJCWZzdGwJJXN0XCgyXCkKKy4qV2FybmluZzouKgorICA4NyAwMGIwIEREREIgICAgICAgICAgICAgIAkJZnN0cGwJJXN0XCgzXCkKKy4qV2FybmluZzouKgorICA4OCAwMGIyIEQ4RDQgICAgICAgICAgICAgIAkJZmNvbWwJJXN0XCg0XCkKKy4qV2FybmluZzouKgorICA4OSAwMGI0IEQ4REQgICAgICAgICAgICAgIAkJZmNvbXBsCSVzdFwoNVwpCisuKldhcm5pbmc6LioKKyAgOTAgMDBiNiBERUMxICAgICAgICAgICAgICAJCWZhZGRwCSVzdFwoMVwpLCVzdAorLipXYXJuaW5nOi4qCisgIDkxIDAwYjggREVDQSAgICAgICAgICAgICAgCQlmbXVscAklc3RcKDJcKSwlc3QKKy4qV2FybmluZzouKgorICA5MiAwMGJhIERFRTMgICAgICAgICAgICAgIAkJZnN1YnAJJXN0XCgzXCksJXN0CisuKldhcm5pbmc6LioKKyAgOTMgMDBiYyBERUVDICAgICAgICAgICAgICAJCWZzdWJycAklc3RcKDRcKSwlc3QKKy4qV2FybmluZzouKgorICA5NCAwMGJlIERFRjUgICAgICAgICAgICAgIAkJZmRpdnAJJXN0XCg1XCksJXN0CisuKldhcm5pbmc6LioKKyAgOTUgMDBjMCBERUZFICAgICAgICAgICAgICAJCWZkaXZycAklc3RcKDZcKSwlc3QKKy4qV2FybmluZzouKgorICA5NiAwMGMyIERFQzEgICAgICAgICAgICAgIAkJZmFkZAorLipXYXJuaW5nOi4qCisgIDk3IDAwYzQgREVFMSAgICAgICAgICAgICAgCQlmc3ViCisuKldhcm5pbmc6LioKKyAgOTggMDBjNiBERUM5ICAgICAgICAgICAgICAJCWZtdWwKKy4qV2FybmluZzouKgorICA5OSAwMGM4IERFRjEgICAgICAgICAgICAgIAkJZmRpdgorLipXYXJuaW5nOi4qCisgMTAwIDAwY2EgREVFOSAgICAgICAgICAgICAgCQlmc3VicgorLipXYXJuaW5nOi4qCisgMTAxIDAwY2MgREVGOSAgICAgICAgICAgICAgCQlmZGl2cgorLipXYXJuaW5nOi4qCisgMTAyICAgICAgICAgICAgICAgICAgICAgICAJI3RoZXNlIHNob3VsZCBhbGwgYmUgbGVnYWwKKyAxMDMgMDBjZSAwRkEzMTU1NiAzNDEyMDAgICAJCWJ0bAklZWR4LCAweDEyMzQ1NgorIDEwNCAwMGQ1IDBGQTNEMCAgICAgICAgICAgIAkJYnRsCSVlZHgsICVlYXgKKyAxMDUgMDBkOCAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWFsCisgMTA2IDAwZGEgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVibAorIDEwNyAwMGRkIEExMTEwMDAwIDAwICAgICAgIAkJbW92bAkxNywlZWF4CisgMTA4IDAwZTIgQTExMTAwMDAgMDAgICAgICAgCQltb3YJMTcsJWVheAorIDEwOSAwMGU3IDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeCwlYXgKKyAxMTAgMDBlOSBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgsJWVheAorIDExMSAwMGVhIDY2RUQgICAgICAgICAgICAgIAkJaW53CVwoJWR4XCksJWF4CisgMTEyIDAwZWMgRUQgICAgICAgICAgICAgICAgCQlpbmwJXCglZHhcKSwlZWF4CisgMTEzIDAwZWQgRUMgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVhbAorIDExNCAwMGVlIDY2RUQgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYXgKKyAxMTUgMDBmMCBFRCAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWVheAorIDExNiAwMGYxIDBGQjYxNDM3ICAgICAgICAgIAkJbW92emJsCVwoJWVkaSwlZXNpXCksJWVkeAorIDExNyAwMGY1IDBGQjY0NTFDICAgICAgICAgIAkJbW92emJsCTI4XCglZWJwXCksJWVheAorIDExOCAwMGY5IDBGQjZDMCAgICAgICAgICAgIAkJbW92emJsCSVhbCwlZWF4CisgMTE5IDAwZmMgMEZCNkYxICAgICAgICAgICAgCQltb3Z6YmwJJWNsLCVlc2kKKyAxMjAgMDBmZiAyNkQ3ICAgICAgICAgICAgICAJCXhsYXQJJWVzOlwoJWVieFwpCisgMTIxIDAxMDEgRDcgICAgICAgICAgICAgICAgCQl4bGF0CisgMTIyIDAxMDIgRDcgICAgICAgICAgICAgICAgCQl4bGF0YgorIDEyMyAwMTAzIERERDggICAgICAgICAgICAgIAkxOglmc3RwCSVzdFwoMFwpCisgMTI0IDAxMDUgRTJGQyAgICAgICAgICAgICAgCQlsb29wCTFiCisgMTI1IDAxMDcgRjZGMSAgICAgICAgICAgICAgCQlkaXZiICAgICVjbCAKKyAxMjYgMDEwOSA2NkY3RjEgICAgICAgICAgICAJCWRpdncgICAgJWN4IAorIDEyNyAwMTBjIEY3RjEgICAgICAgICAgICAgIAkJZGl2bCAgICAlZWN4CisgMTI4IDAxMGUgRjZGMSAgICAgICAgICAgICAgCQlkaXYJJWNsCisgMTI5IDAxMTAgNjZGN0YxICAgICAgICAgICAgCQlkaXYJJWN4CisgMTMwIDAxMTMgRjdGMSAgICAgICAgICAgICAgCQlkaXYJJWVjeAorIDEzMSAwMTE1IEY2RjEgICAgICAgICAgICAgIAkJZGl2CSVjbCwlYWwKKyAxMzIgMDExNyA2NkY3RjEgICAgICAgICAgICAJCWRpdgklY3gsJWF4CisgMTMzIDAxMWEgRjdGMSAgICAgICAgICAgICAgCQlkaXYJJWVjeCwlZWF4CisgMTM0IDAxMWMgOEVERSAgICAgICAgICAgICAgCQltb3YJJXNpLCVkcworIDEzNSAwMTFlIDhFREUgICAgICAgICAgICAgIAkJbW92bAklc2ksJWRzCQkjIHdhcm5pbmcgaGVyZQorLipXYXJuaW5nOi4qCisgMTM2IDAxMjAgMUUgICAgICAgICAgICAgICAgCQlwdXNobAklZHMKKyAxMzcgMDEyMSAxRSAgICAgICAgICAgICAgICAJCXB1c2gJJWRzCisgMTM4IDAxMjIgQTAwMDAwMDAgMDAgICAgICAgCQltb3YJMCwlYWwKKyAxMzkgMDEyNyA2NkExMDAwMCAwMTAwICAgICAJCW1vdgkweDEwMDAwLCVheAorIDE0MCAwMTJkIDg5QzMgICAgICAgICAgICAgIAkJbW92CSVlYXgsJWVieAorIDE0MSAwMTJmIDlDICAgICAgICAgICAgICAgIAkJcHVzaGYKKyAxNDIgMDEzMCA5QyAgICAgICAgICAgICAgICAJCXB1c2hmbAorIDE0MyAwMTMxIDY2OUMgICAgICAgICAgICAgIAkJcHVzaGZ3CisgMTQ0IDAxMzMgOUQgICAgICAgICAgICAgICAgCQlwb3BmCisgMTQ1IDAxMzQgOUQgICAgICAgICAgICAgICAgCQlwb3BmbAorIDE0NiAwMTM1IDY2OUQgICAgICAgICAgICAgIAkJcG9wZncKKyAxNDcgMDEzNyA4OTM0MUQwMCAwMDAwMDAgICAJCW1vdgklZXNpLFwoLCVlYngsMVwpCisgMTQ4IDAxM2UgODAyNTAwMDAgMDAwMDdGICAgCQlhbmRiCVwkfjB4ODAsZm9vCisgMTQ5ICAgICAgICAgICAgICAgICAgICAgICAJCisgMTUwICAgICAgICAgICAgICAgICAgICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KKyAxNTEgMDE0NSAwMDAwICAgICAgICAgICAgICAJCS53b3JkCTAKKyAxNTIgMDE0NyAwMCAgICAgICAgICAgICAgICAJCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczZjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zCkBAIC0wLDAgKzEsMTUyIEBACisucHNpemUgMAorLnRleHQKKyMgdGVzdCB2YXJpb3VzIHNlZ21lbnQgcmVnIGluc25zCisJcHVzaAklZHMKKwlwdXNobAklZHMKKwlwb3AJJWRzCisJcG9wbAklZHMKKwltb3YJJWRzLCVlYXgKKwltb3ZsCSVkcywlZWF4CisJbW92bAklZHMsJWF4CisJbW92CSVlYXgsJWRzCisJbW92bAklYXgsJWRzCisJbW92bAklZWF4LCVkcworCisJcHVzaHcJJWRzCisJcG9wdwklZHMKKwltb3YJJWRzLCVheAorCW1vdncJJWRzLCVheAorCW1vdncJJWRzLCVlYXgKKwltb3YJJWF4LCVkcworCW1vdncJJWF4LCVkcworCW1vdncJJWVheCwlZHMKKworIyB0ZXN0IHZhcmlvdXMgcHVzaGVzCisJcHVzaGwJJDEwCisJcHVzaHcJJDEwCisJcHVzaAkkMTAKKwlwdXNobAkkMTAwMAorCXB1c2h3CSQxMDAwCisJcHVzaAkkMTAwMAorCXB1c2hsCTFmCisJcHVzaHcJMWYKKwlwdXNoCTFmCisJcHVzaAkoMWYtLikoJWVieCkKKwlwdXNoCTFmLS4KKyMgdGhlc2UsIGFuZCBvdGhlcnMgbGlrZSB0aGVtIHNob3VsZCBoYXZlIG5vIG9wZXJhbmQgc2l6ZSBwcmVmaXgKKzE6CWxsZHQJJWN4CisJbG1zdwklYXgKKworIyBKdXN0IHRvIG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBiZWNvbWUgaWxsZWdhbCBkdWUgdG8gb3Zlci1lbnRodXNpYXN0aWMKKyMgcmVnaXN0ZXIgY2hlY2tpbmcKKwltb3ZzYncJJWFsLCVkaQorCW1vdnNibAklYWwsJWVjeAorCW1vdnN3bAklYXgsJWVjeAorCW1vdnpidwklYWwsJWRpCisJbW92emJsCSVhbCwlZWN4CisJbW92endsCSVheCwlZWN4CisKKwlpbgklZHgsJWFsCisJaW4JJWR4LCVheAorCWluCSVkeCwlZWF4CisJaW4JKCVkeCksJWFsCisJaW4JKCVkeCksJWF4CisJaW4JKCVkeCksJWVheAorCWluYgklZHgsJWFsCisJaW53CSVkeCwlYXgKKwlpbmwJJWR4LCVlYXgKKwlpbmIJJWR4CisJaW53CSVkeAorCWlubAklZHgKKwlpbmIJJDI1NQorCWludwkkMgorCWlubAkkNAorCW91dGwJJWVheCwlZHgKKwlvdXQJJWFsLCAkNDIKKwlpbgkkMTMsICVheAorIyBUaGVzZSBhcmUgdXNlZCBpbiBBSVguCisJaW53CSglZHgpCisJb3V0dwkoJWR4KQorCisJbW92c2IKKwljbXBzdworCXNjYXNsCisJeGxhdGIKKwltb3ZzbAklY3M6KCVlc2kpLCVlczooJWVkaSkKKwlzZXRhZQkoJWVieCkKKwlzZXRhZWIJKCVlYngpCisJc2V0YWUJJWFsCisKKyN0aGVzZSBzaG91bGQgZ2l2ZSB3YXJuaW5ncworCW9yYgkkMSwlYXgKKwlvcmIJJDEsJWVheAorCW9yYgkkMSwlYngKKwlvcmIJJDEsJWVieAorCWZsZGwJJXN0KDEpCisJZnN0bAklc3QoMikKKwlmc3RwbAklc3QoMykKKwlmY29tbAklc3QoNCkKKwlmY29tcGwJJXN0KDUpCisJZmFkZHAJJXN0KDEpLCVzdAorCWZtdWxwCSVzdCgyKSwlc3QKKwlmc3VicAklc3QoMyksJXN0CisJZnN1YnJwCSVzdCg0KSwlc3QKKwlmZGl2cAklc3QoNSksJXN0CisJZmRpdnJwCSVzdCg2KSwlc3QKKwlmYWRkCisJZnN1YgorCWZtdWwKKwlmZGl2CisJZnN1YnIKKwlmZGl2cgorI3RoZXNlIHNob3VsZCBhbGwgYmUgbGVnYWwKKwlidGwJJWVkeCwgMHgxMjM0NTYKKwlidGwJJWVkeCwgJWVheAorCW9yYgkkMSwlYWwKKwlvcmIJJDEsJWJsCisJbW92bAkxNywlZWF4CisJbW92CTE3LCVlYXgKKwlpbncJJWR4LCVheAorCWlubAklZHgsJWVheAorCWludwkoJWR4KSwlYXgKKwlpbmwJKCVkeCksJWVheAorCWluCSglZHgpLCVhbAorCWluCSglZHgpLCVheAorCWluCSglZHgpLCVlYXgKKwltb3Z6YmwJKCVlZGksJWVzaSksJWVkeAorCW1vdnpibAkyOCglZWJwKSwlZWF4CisJbW92emJsCSVhbCwlZWF4CisJbW92emJsCSVjbCwlZXNpCisJeGxhdAklZXM6KCVlYngpCisJeGxhdAorCXhsYXRiCisxOglmc3RwCSVzdCgwKQorCWxvb3AJMWIKKwlkaXZiICAgICVjbCAKKwlkaXZ3ICAgICVjeCAKKwlkaXZsICAgICVlY3gKKwlkaXYJJWNsCisJZGl2CSVjeAorCWRpdgklZWN4CisJZGl2CSVjbCwlYWwKKwlkaXYJJWN4LCVheAorCWRpdgklZWN4LCVlYXgKKwltb3YJJXNpLCVkcworCW1vdmwJJXNpLCVkcwkJIyB3YXJuaW5nIGhlcmUKKwlwdXNobAklZHMKKwlwdXNoCSVkcworCW1vdgkwLCVhbAorCW1vdgkweDEwMDAwLCVheAorCW1vdgklZWF4LCVlYngKKwlwdXNoZgorCXB1c2hmbAorCXB1c2hmdworCXBvcGYKKwlwb3BmbAorCXBvcGZ3CisJbW92CSVlc2ksKCwlZWJ4LDEpCisJYW5kYgkkfjB4ODAsZm9vCisKKwkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCisJLndvcmQJMAorCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaTM4Ni5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjFmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgaTM4NiB0ZXN0cworIworcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0geworICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCisgICAgc2V0IHRlc3RuYW1lICJpMzg2ICRuYW1lIgorICAgIHNldCBmaWxlICRzcmNkaXIvJHN1YmRpci8kbmFtZQorICAgIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgorICAgIGlmIHsgW3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0gdGhlbiB7CisJZmFpbCAkdGVzdG5hbWUKKwl2ZXJib3NlICJvdXRwdXQgaXMgW2ZpbGVfY29udGVudHMgImR1bXAub3V0Il0iIDIKKwlyZXR1cm4KKyAgICB9CisgICAgcGFzcyAkdGVzdG5hbWUKK30KKworCitpZiBbaXN0YXJnZXQgImkqODYtKi0qIl0gdGhlbiB7CisKKyAgICBydW5fbGlzdF90ZXN0ICJmbG9hdCIgIi1hbCIKKyAgICBydW5fbGlzdF90ZXN0ICJnZW5lcmFsIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MiIKKyAgICBydW5fbGlzdF90ZXN0ICJpbnZhbCIgIi1hbCIKKyAgICBydW5fbGlzdF90ZXN0ICJtb2RybSIgIi1hbCAtLWxpc3RpbmctbGhzLXdpZHRoPTIiCisgICAgcnVuX2R1bXBfdGVzdCAib3Bjb2RlIgorICAgIHJ1bl9kdW1wX3Rlc3QgInByZWZpeCIKKyAgICBydW5fZHVtcF90ZXN0ICJhbWQiCisKKyAgICAjIFRoZSByZWxvYyBhbmQgd2hpdGUgdGVzdHMgcmVxdWlyZSBzdXBwb3J0IGZvciA4IGFuZCAxNiBiaXQKKyAgICAjIHJlbG9jcywgc28gd2Ugb25seSBydW4gdGhlbSBmb3IgRUxGIHRhcmdldHMuCisgICAgaWYge1tpc3RhcmdldCAiKi0qLWVsZioiXSB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXX0gdGhlbiB7CisJcnVuX2R1bXBfdGVzdCAicmVsb2MiCisJcnVuX2xpc3RfdGVzdCAid2hpdGUiICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0zIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg5NDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5sCkBAIC0wLDAgKzEsOTggQEAKKy4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6CisuKjozOiBFcnJvcjogLioKKy4qOjQ6IEVycm9yOiAuKgorLio6NTogRXJyb3I6IC4qCisuKjo2OiBFcnJvcjogLioKKy4qOjc6IEVycm9yOiAuKgorLio6ODogRXJyb3I6IC4qCisuKjo5OiBFcnJvcjogLioKKy4qOjEwOiBFcnJvcjogLioKKy4qOjExOiBFcnJvcjogLioKKy4qOjEyOiBFcnJvcjogLioKKy4qOjEzOiBFcnJvcjogLioKKy4qOjE0OiBFcnJvcjogLioKKy4qOjE1OiBFcnJvcjogLioKKy4qOjE2OiBFcnJvcjogLioKKy4qOjE3OiBFcnJvcjogLioKKy4qOjE4OiBFcnJvcjogLioKKy4qOjE5OiBFcnJvcjogLioKKy4qOjIwOiBFcnJvcjogLioKKy4qOjIxOiBFcnJvcjogLioKKy4qOjIyOiBFcnJvcjogLioKKy4qOjIzOiBFcnJvcjogLioKKy4qOjI0OiBFcnJvcjogLioKKy4qOjI1OiBFcnJvcjogLioKKy4qOjI2OiBFcnJvcjogLioKKy4qOjI3OiBFcnJvcjogLioKKy4qOjI4OiBFcnJvcjogLioKKy4qOjI5OiBFcnJvcjogLioKKy4qOjMwOiBFcnJvcjogLioKKy4qOjMxOiBFcnJvcjogLioKKy4qOjMyOiBFcnJvcjogLioKKy4qOjMzOiBFcnJvcjogLioKKy4qOjM0OiBFcnJvcjogLioKKy4qOjM1OiBFcnJvcjogLioKKy4qOjM2OiBFcnJvcjogLioKKy4qOjM3OiBFcnJvcjogLioKKy4qOjM4OiBFcnJvcjogLioKKy4qOjM5OiBFcnJvcjogLioKKy4qOjQwOiBFcnJvcjogLioKKy4qOjQxOiBFcnJvcjogLioKKy4qOjQyOiBFcnJvcjogLioKKy4qOjQzOiBFcnJvcjogLioKKy4qOjQ0OiBFcnJvcjogLioKKy4qOjQ1OiBFcnJvcjogLioKKy4qOjQ2OiBFcnJvcjogLioKKy4qOjQ3OiBFcnJvcjogLioKKy4qOjQ4OiBFcnJvcjogLioKK0dBUyBMSVNUSU5HIC4qCisKKworICAgMSBbIAldKgkudGV4dAorICAgMiBbIAldKiMgQWxsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGlsbGVnYWwKKyAgIDMgWyAJXSoJbW92CVwoJWR4XCksJWFsCisgICA0IFsgCV0qCW1vdglcKCVlYXgsJWVzcCwyXCksJWFsCisgICA1IFsgCV0qCXNldGFlCSVlYXgKKyAgIDYgWyAJXSoJcHVzaGIJJWRzCisgICA3IFsgCV0qCXBvcGIJJWRzCisgICA4IFsgCV0qCXB1c2hiCSVhbAorICAgOSBbIAldKglwb3BiCSVhbAorICAxMCBbIAldKglwdXNoYgklYWgKKyAgMTEgWyAJXSoJcG9wYgklYWgKKyAgMTIgWyAJXSoJcHVzaGIJJWF4CisgIDEzIFsgCV0qCXBvcGIJJWF4CisgIDE0IFsgCV0qCXB1c2hiCSVlYXgKKyAgMTUgWyAJXSoJcG9wYgklZWF4CisgIDE2IFsgCV0qCW1vdmIJJWRzLCVheAorICAxNyBbIAldKgltb3ZiCSVkcywlZWF4CisgIDE4IFsgCV0qCW1vdmIJJWF4LCVkcworICAxOSBbIAldKgltb3ZiCSVlYXgsJWRzCisgIDIwIFsgCV0qCW1vdmRiCSVlYXgsJW1tMAorICAyMSBbIAldKgltb3ZxYgkwLCVtbTAKKyAgMjIgWyAJXSoJbGRzYgkwLCVlYXgKKyAgMjMgWyAJXSoJc2V0bmV3CTAKKyAgMjQgWyAJXSoJbW92ZHcJJWVheCwlbW0wCisgIDI1IFsgCV0qCW1vdnF3CTAsJW1tMAorICAyNiBbIAldKglkaXYJJWN4LCVhbAorICAyNyBbIAldKglkaXYJJWNsLCVheAorICAyOCBbIAldKglkaXYJJWVjeCwlYWwKKyAgMjkgWyAJXSoJaW11bAkxMCwlYngsJWVjeAorICAzMCBbIAldKglpbXVsCTEwLCVieCwlYWwKKyAgMzEgWyAJXSoJcG9wYWIKKyAgMzIgWyAJXSoJc3RpbAorICAzMyBbIAldKglhYWFiCisgIDM0IFsgCV0qCWN3ZGVsCisgIDM1IFsgCV0qCWN3ZHcKKyAgMzYgWyAJXSoJY2FsbHd3CTAKKyAgMzcgWyAJXSpmb286CWphdwlmb28KKyAgMzggWyAJXSoJamN4encJZm9vCisgIDM5IFsgCV0qCWplY3h6bAlmb28KKyAgNDAgWyAJXSoJbG9vcGIJZm9vCisgIDQxIFsgCV0qCXhsYXR3CSVlczolYngKKyAgNDIgWyAJXSoJeGxhdGwJJWVzOiVieAorICA0MyBbIAldKglpbnRsCTIKKyAgNDQgWyAJXSoJaW50M2IKKyAgNDUgWyAJXSoJaGx0YgorICA0NiBbIAldKglmc3RiCSVzdFwoMFwpCisgIDQ3IFsgCV0qCWZjb21wbGwJMjhcKCVlYnBcKQorICA0OCBbIAldKglmbGRsdwlcKCVlYXhcKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pbnZhbC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2ExOGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMKQEAgLTAsMCArMSw0OCBAQAorCS50ZXh0CisjIEFsbCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbGxlZ2FsCisJbW92CSglZHgpLCVhbAorCW1vdgkoJWVheCwlZXNwLDIpLCVhbAorCXNldGFlCSVlYXgKKwlwdXNoYgklZHMKKwlwb3BiCSVkcworCXB1c2hiCSVhbAorCXBvcGIJJWFsCisJcHVzaGIJJWFoCisJcG9wYgklYWgKKwlwdXNoYgklYXgKKwlwb3BiCSVheAorCXB1c2hiCSVlYXgKKwlwb3BiCSVlYXgKKwltb3ZiCSVkcywlYXgKKwltb3ZiCSVkcywlZWF4CisJbW92YgklYXgsJWRzCisJbW92YgklZWF4LCVkcworCW1vdmRiCSVlYXgsJW1tMAorCW1vdnFiCTAsJW1tMAorCWxkc2IJMCwlZWF4CisJc2V0bmV3CTAKKwltb3ZkdwklZWF4LCVtbTAKKwltb3ZxdwkwLCVtbTAKKwlkaXYJJWN4LCVhbAorCWRpdgklY2wsJWF4CisJZGl2CSVlY3gsJWFsCisJaW11bAkxMCwlYngsJWVjeAorCWltdWwJMTAsJWJ4LCVhbAorCXBvcGFiCisJc3RpbAorCWFhYWIKKwljd2RlbAorCWN3ZHcKKwljYWxsd3cJMAorZm9vOglqYXcJZm9vCisJamN4encJZm9vCisJamVjeHpsCWZvbworCWxvb3BiCWZvbworCXhsYXR3CSVlczolYngKKwl4bGF0bAklZXM6JWJ4CisJaW50bAkyCisJaW50M2IKKwlobHRiCisJZnN0Ygklc3QoMCkKKwlmY29tcGxsCTI4KCVlYnApCisJZmxkbHcJKCVlYXgpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExYmM3OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubApAQCAtMCwwICsxLDE5ODQgQEAKKy4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6CisuKjoxMjg6IFdhcm5pbmc6LioKKy4qOjEyOTogV2FybmluZzouKgorLio6MTMwOiBXYXJuaW5nOi4qCisuKjoxMzE6IFdhcm5pbmc6LioKKy4qOjEzMjogV2FybmluZzouKgorLio6MTMzOiBXYXJuaW5nOi4qCisuKjoxMzQ6IFdhcm5pbmc6LioKKy4qOjEzNTogV2FybmluZzouKgorLio6MTkyOiBXYXJuaW5nOi4qCisuKjoxOTM6IFdhcm5pbmc6LioKKy4qOjE5NDogV2FybmluZzouKgorLio6MTk1OiBXYXJuaW5nOi4qCisuKjoxOTY6IFdhcm5pbmc6LioKKy4qOjE5NzogV2FybmluZzouKgorLio6MTk4OiBXYXJuaW5nOi4qCisuKjoxOTk6IFdhcm5pbmc6LioKKy4qOjI1NjogV2FybmluZzouKgorLio6MjU3OiBXYXJuaW5nOi4qCisuKjoyNTg6IFdhcm5pbmc6LioKKy4qOjI1OTogV2FybmluZzouKgorLio6MjYwOiBXYXJuaW5nOi4qCisuKjoyNjE6IFdhcm5pbmc6LioKKy4qOjI2MjogV2FybmluZzouKgorLio6MjYzOiBXYXJuaW5nOi4qCisuKjozODQ6IFdhcm5pbmc6LioKKy4qOjM4NTogV2FybmluZzouKgorLio6Mzg2OiBXYXJuaW5nOi4qCisuKjozODc6IFdhcm5pbmc6LioKKy4qOjM4ODogV2FybmluZzouKgorLio6Mzg5OiBXYXJuaW5nOi4qCisuKjozOTA6IFdhcm5pbmc6LioKKy4qOjM5MTogV2FybmluZzouKgorLio6NDQ4OiBXYXJuaW5nOi4qCisuKjo0NDk6IFdhcm5pbmc6LioKKy4qOjQ1MDogV2FybmluZzouKgorLio6NDUxOiBXYXJuaW5nOi4qCisuKjo0NTI6IFdhcm5pbmc6LioKKy4qOjQ1MzogV2FybmluZzouKgorLio6NDU0OiBXYXJuaW5nOi4qCisuKjo0NTU6IFdhcm5pbmc6LioKKy4qOjUxMjogV2FybmluZzouKgorLio6NTEzOiBXYXJuaW5nOi4qCisuKjo1MTQ6IFdhcm5pbmc6LioKKy4qOjUxNTogV2FybmluZzouKgorLio6NTE2OiBXYXJuaW5nOi4qCisuKjo1MTc6IFdhcm5pbmc6LioKKy4qOjUxODogV2FybmluZzouKgorLio6NTE5OiBXYXJuaW5nOi4qCisuKjo2NDA6IFdhcm5pbmc6LioKKy4qOjY0MTogV2FybmluZzouKgorLio6NjQyOiBXYXJuaW5nOi4qCisuKjo2NDM6IFdhcm5pbmc6LioKKy4qOjY0NDogV2FybmluZzouKgorLio6NjQ1OiBXYXJuaW5nOi4qCisuKjo2NDY6IFdhcm5pbmc6LioKKy4qOjY0NzogV2FybmluZzouKgorLio6NzA0OiBXYXJuaW5nOi4qCisuKjo3MDU6IFdhcm5pbmc6LioKKy4qOjcwNjogV2FybmluZzouKgorLio6NzA3OiBXYXJuaW5nOi4qCisuKjo3MDg6IFdhcm5pbmc6LioKKy4qOjcwOTogV2FybmluZzouKgorLio6NzEwOiBXYXJuaW5nOi4qCisuKjo3MTE6IFdhcm5pbmc6LioKKy4qOjc2ODogV2FybmluZzouKgorLio6NzY5OiBXYXJuaW5nOi4qCisuKjo3NzA6IFdhcm5pbmc6LioKKy4qOjc3MTogV2FybmluZzouKgorLio6NzcyOiBXYXJuaW5nOi4qCisuKjo3NzM6IFdhcm5pbmc6LioKKy4qOjc3NDogV2FybmluZzouKgorLio6Nzc1OiBXYXJuaW5nOi4qCisuKjo4MTI6IFdhcm5pbmc6LioKKy4qOjgyMDogV2FybmluZzouKgorLio6ODI4OiBXYXJuaW5nOi4qCisuKjo4MzM6IFdhcm5pbmc6LioKKy4qOjgzNDogV2FybmluZzouKgorLio6ODM1OiBXYXJuaW5nOi4qCisuKjo5NjE6IFdhcm5pbmc6LioKKy4qOjk2MjogV2FybmluZzouKgorLio6OTYzOiBXYXJuaW5nOi4qCisuKjo5NjQ6IFdhcm5pbmc6LioKKy4qOjk2NTogV2FybmluZzouKgorLio6OTY2OiBXYXJuaW5nOi4qCisuKjo5Njc6IFdhcm5pbmc6LioKKy4qOjk2ODogV2FybmluZzouKgorLio6MTAyNTogV2FybmluZzouKgorLio6MTAyNjogV2FybmluZzouKgorLio6MTAyNzogV2FybmluZzouKgorLio6MTAyODogV2FybmluZzouKgorLio6MTAyOTogV2FybmluZzouKgorLio6MTAzMDogV2FybmluZzouKgorLio6MTAzMTogV2FybmluZzouKgorLio6MTAzMjogV2FybmluZzouKgorLio6MTA4OTogV2FybmluZzouKgorLio6MTA5MDogV2FybmluZzouKgorLio6MTA5MTogV2FybmluZzouKgorLio6MTA5MjogV2FybmluZzouKgorLio6MTA5MzogV2FybmluZzouKgorLio6MTA5NDogV2FybmluZzouKgorLio6MTA5NTogV2FybmluZzouKgorLio6MTA5NjogV2FybmluZzouKgorLio6MTIxNzogV2FybmluZzouKgorLio6MTIxODogV2FybmluZzouKgorLio6MTIxOTogV2FybmluZzouKgorLio6MTIyMDogV2FybmluZzouKgorLio6MTIyMTogV2FybmluZzouKgorLio6MTIyMjogV2FybmluZzouKgorLio6MTIyMzogV2FybmluZzouKgorLio6MTIyNDogV2FybmluZzouKgorLio6MTI4MTogV2FybmluZzouKgorLio6MTI4MjogV2FybmluZzouKgorLio6MTI4MzogV2FybmluZzouKgorLio6MTI4NDogV2FybmluZzouKgorLio6MTI4NTogV2FybmluZzouKgorLio6MTI4NjogV2FybmluZzouKgorLio6MTI4NzogV2FybmluZzouKgorLio6MTI4ODogV2FybmluZzouKgorLio6MTM0NTogV2FybmluZzouKgorLio6MTM0NjogV2FybmluZzouKgorLio6MTM0NzogV2FybmluZzouKgorLio6MTM0ODogV2FybmluZzouKgorLio6MTM0OTogV2FybmluZzouKgorLio6MTM1MDogV2FybmluZzouKgorLio6MTM1MTogV2FybmluZzouKgorLio6MTM1MjogV2FybmluZzouKgorLio6MTQ3MzogV2FybmluZzouKgorLio6MTQ3NDogV2FybmluZzouKgorLio6MTQ3NTogV2FybmluZzouKgorLio6MTQ3NjogV2FybmluZzouKgorLio6MTQ3NzogV2FybmluZzouKgorLio6MTQ3ODogV2FybmluZzouKgorLio6MTQ3OTogV2FybmluZzouKgorLio6MTQ4MDogV2FybmluZzouKgorLio6MTUzNzogV2FybmluZzouKgorLio6MTUzODogV2FybmluZzouKgorLio6MTUzOTogV2FybmluZzouKgorLio6MTU0MDogV2FybmluZzouKgorLio6MTU0MTogV2FybmluZzouKgorLio6MTU0MjogV2FybmluZzouKgorLio6MTU0MzogV2FybmluZzouKgorLio6MTU0NDogV2FybmluZzouKgorLio6MTYwMTogV2FybmluZzouKgorLio6MTYwMjogV2FybmluZzouKgorLio6MTYwMzogV2FybmluZzouKgorLio6MTYwNDogV2FybmluZzouKgorLio6MTYwNTogV2FybmluZzouKgorLio6MTYwNjogV2FybmluZzouKgorLio6MTYwNzogV2FybmluZzouKgorLio6MTYwODogV2FybmluZzouKgorLio6MTY0NTogV2FybmluZzouKgorLio6MTY1MzogV2FybmluZzouKgorLio6MTY2MTogV2FybmluZzouKgorLio6MTY2NjogV2FybmluZzouKgorLio6MTY2NzogV2FybmluZzouKgorLio6MTY2ODogV2FybmluZzouKgorICAgMSAgICAgICAgICAgICAgICAgICAgICAgCS5wc2l6ZSAwCisgICAyICAgICAgICAgICAgICAgICAgICAgICAJLnRleHQKKyAgIDMgMDAwMCAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheFwpCisgICA0IDAwMDMgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3hcKQorICAgNSAwMDA2IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4XCkKKyAgIDYgMDAwOSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieFwpCisgICA3IDAwMGMgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczowCisgICA4IDAwMTMgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2lcKQorICAgOSAwMDE2IDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpXCkKKyAgMTAgMDAxOSAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXhcKQorICAxMSAwMDFkIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeFwpCisgIDEyIDAwMjEgMzY4QzVBMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4XCkKKyAgMTMgMDAyNSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnhcKQorICAxNCAwMDI5IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicFwpCisgIDE1IDAwMmMgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpXCkKKyAgMTYgMDAzMCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGlcKQorICAxNyAwMDM0IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheFwpCisgIDE4IDAwM2IgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4XCkKKyAgMTkgMDA0MiAzNjhDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHhcKQorICAyMCAwMDQ5IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieFwpCisgIDIxIDAwNTAgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwXCkKKyAgMjIgMDA1NiAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2lcKQorICAyMyAwMDVkIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaVwpCisgIDI0IDAwNjQgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKKyAgMjUgMDA2NiA4Q0Q5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVjeAorICAyNiAwMDY4IDhDREEgICAgICAgICAgICAgIAkJbW92CSVkcywlZWR4CisgIDI3IDAwNmEgOENEQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYngKKyAgMjggMDA2YyA4Q0RDICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzcAorICAyOSAwMDZlIDhDREQgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJwCisgIDMwIDAwNzAgOENERSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc2kKKyAgMzEgMDA3MiA4Q0RGICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkaQorICAzMiAwMDc0IDM2OEMxQzAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYXgsMVwpCisgIDMzIDAwNzggMzY4QzFDMDEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVheCwxXCkKKyAgMzQgMDA3YyAzNjhDMUMwMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWF4LDFcKQorICAzNSAwMDgwIDM2OEMxQzAzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYXgsMVwpCisgIDM2IDAwODQgOEMxQzA0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVheCwxXCkKKyAgMzcgMDA4NyAzNjhDMUMwNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYXgsMVwpCisgIDM4IDAwOGYgMzY4QzFDMDYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVheCwxXCkKKyAgMzkgMDA5MyAzNjhDMUMwNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWF4LDFcKQorICA0MCAwMDk3IDM2OEMxQzA4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlY3gsMVwpCisgIDQxIDAwOWIgMzY4QzFDMDkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVjeCwxXCkKKyAgNDIgMDA5ZiAzNjhDMUMwQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWN4LDFcKQorICA0MyAwMGEzIDM2OEMxQzBCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlY3gsMVwpCisgIDQ0IDAwYTcgOEMxQzBDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVjeCwxXCkKKyAgNDUgMDBhYSAzNjhDMUMwRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlY3gsMVwpCisgIDQ2IDAwYjIgMzY4QzFDMEUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVjeCwxXCkKKyAgNDcgMDBiNiAzNjhDMUMwRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWN4LDFcKQorICA0OCAwMGJhIDM2OEMxQzEwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlZHgsMVwpCisgIDQ5IDAwYmUgMzY4QzFDMTEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkeCwxXCkKKyAgNTAgMDBjMiAzNjhDMUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWR4LDFcKQorICA1MSAwMGM2IDM2OEMxQzEzICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlZHgsMVwpCisgIDUyIDAwY2EgOEMxQzE0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVkeCwxXCkKKyAgNTMgMDBjZCAzNjhDMUMxNSAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlZHgsMVwpCisgIDU0IDAwZDUgMzY4QzFDMTYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVkeCwxXCkKKyAgNTUgMDBkOSAzNjhDMUMxNyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWR4LDFcKQorICA1NiAwMGRkIDM2OEMxQzE4ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LCVlYngsMVwpCisgIDU3IDAwZTEgMzY4QzFDMTkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVieCwxXCkKKyAgNTggMDBlNSAzNjhDMUMxQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWJ4LDFcKQorICA1OSAwMGU5IDM2OEMxQzFCICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LCVlYngsMVwpCisgIDYwIDAwZWQgOEMxQzFDICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsJWVieCwxXCkKKyAgNjEgMDBmMCAzNjhDMUMxRCAwMDAwMDAwMCAJCW1vdgklZHMsJXNzOlwoLCVlYngsMVwpCisgIDYyIDAwZjggMzY4QzFDMUUgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksJWVieCwxXCkKKyAgNjMgMDBmYyAzNjhDMUMxRiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwlZWJ4LDFcKQorICA2NCAwMTAwIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4LDFcKQorICA2NSAwMTAzIDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDFcKQorICA2NiAwMTA2IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDFcKQorICA2NyAwMTA5IDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4LDFcKQorICA2OCAwMTBjIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDFcKQorICA2OSAwMTBmIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsMVwpCisgIDcwIDAxMTYgMzY4QzFFICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc2ksMVwpCisgIDcxIDAxMTkgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksMVwpCisgIDcyIDAxMWMgMzY4QzFDMjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCwxXCkKKyAgNzMgMDEyMCAzNjhDMUMyOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDFcKQorICA3NCAwMTI0IDM2OEMxQzJBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsMVwpCisgIDc1IDAxMjggMzY4QzFDMkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCwxXCkKKyAgNzYgMDEyYyA4QzFDMkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDFcKQorICA3NyAwMTJmIDM2OEMxQzJEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCwxXCkKKyAgNzggMDEzNyAzNjhDMUMyRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDFcKQorICA3OSAwMTNiIDM2OEMxQzJGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsMVwpCisgIDgwIDAxM2YgMzY4QzFDMzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSwxXCkKKyAgODEgMDE0MyAzNjhDMUMzMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDFcKQorICA4MiAwMTQ3IDM2OEMxQzMyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksMVwpCisgIDgzIDAxNGIgMzY4QzFDMzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSwxXCkKKyAgODQgMDE0ZiA4QzFDMzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDFcKQorICA4NSAwMTUyIDM2OEMxQzM1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSwxXCkKKyAgODYgMDE1YSAzNjhDMUMzNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDFcKQorICA4NyAwMTVlIDM2OEMxQzM3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksMVwpCisgIDg4IDAxNjIgMzY4QzFDMzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSwxXCkKKyAgODkgMDE2NiAzNjhDMUMzOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDFcKQorICA5MCAwMTZhIDM2OEMxQzNBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksMVwpCisgIDkxIDAxNmUgMzY4QzFDM0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSwxXCkKKyAgOTIgMDE3MiA4QzFDM0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDFcKQorICA5MyAwMTc1IDM2OEMxQzNEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSwxXCkKKyAgOTQgMDE3ZCAzNjhDMUMzRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDFcKQorICA5NSAwMTgxIDM2OEMxQzNGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksMVwpCisgIDk2IDAxODUgMzY4QzFDNDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCwyXCkKKyAgOTcgMDE4OSAzNjhDMUM0MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDJcKQorICA5OCAwMThkIDM2OEMxQzQyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsMlwpCisgIDk5IDAxOTEgMzY4QzFDNDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCwyXCkKKyAxMDAgMDE5NSA4QzFDNDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDJcKQorIDEwMSAwMTk4IDM2OEMxQzQ1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCwyXCkKKyAxMDIgMDFhMCAzNjhDMUM0NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDJcKQorIDEwMyAwMWE0IDM2OEMxQzQ3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsMlwpCisgMTA0IDAxYTggMzY4QzFDNDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCwyXCkKKyAxMDUgMDFhYyAzNjhDMUM0OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDJcKQorIDEwNiAwMWIwIDM2OEMxQzRBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsMlwpCisgMTA3IDAxYjQgMzY4QzFDNEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCwyXCkKKyAxMDggMDFiOCA4QzFDNEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDJcKQorIDEwOSAwMWJiIDM2OEMxQzREIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCwyXCkKKyAxMTAgMDFjMyAzNjhDMUM0RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDJcKQorIDExMSAwMWM3IDM2OEMxQzRGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsMlwpCisgMTEyIDAxY2IgMzY4QzFDNTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCwyXCkKKyAxMTMgMDFjZiAzNjhDMUM1MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDJcKQorIDExNCAwMWQzIDM2OEMxQzUyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsMlwpCisgMTE1IDAxZDcgMzY4QzFDNTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCwyXCkKKyAxMTYgMDFkYiA4QzFDNTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDJcKQorIDExNyAwMWRlIDM2OEMxQzU1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCwyXCkKKyAxMTggMDFlNiAzNjhDMUM1NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDJcKQorIDExOSAwMWVhIDM2OEMxQzU3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsMlwpCisgMTIwIDAxZWUgMzY4QzFDNTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCwyXCkKKyAxMjEgMDFmMiAzNjhDMUM1OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDJcKQorIDEyMiAwMWY2IDM2OEMxQzVBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsMlwpCisgMTIzIDAxZmEgMzY4QzFDNUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCwyXCkKKyAxMjQgMDFmZSA4QzFDNUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDJcKQorIDEyNSAwMjAxIDM2OEMxQzVEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCwyXCkKKyAxMjYgMDIwOSAzNjhDMUM1RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDJcKQorIDEyNyAwMjBkIDM2OEMxQzVGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsMlwpCisgMTI4IDAyMTEgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsMlwpCisuKldhcm5pbmc6LioKKyAxMjkgMDIxNCAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwyXCkKKy4qV2FybmluZzouKgorIDEzMCAwMjE3IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDJcKQorLipXYXJuaW5nOi4qCisgMTMxIDAyMWEgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsMlwpCisuKldhcm5pbmc6LioKKyAxMzIgMDIxZCA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwyXCkKKy4qV2FybmluZzouKgorIDEzMyAwMjIwIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsMlwpCisuKldhcm5pbmc6LioKKyAxMzQgMDIyNyAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwyXCkKKy4qV2FybmluZzouKgorIDEzNSAwMjJhIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDJcKQorLipXYXJuaW5nOi4qCisgMTM2IDAyMmQgMzY4QzFDNjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCwyXCkKKyAxMzcgMDIzMSAzNjhDMUM2OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDJcKQorIDEzOCAwMjM1IDM2OEMxQzZBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsMlwpCisgMTM5IDAyMzkgMzY4QzFDNkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCwyXCkKKyAxNDAgMDIzZCA4QzFDNkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDJcKQorIDE0MSAwMjQwIDM2OEMxQzZEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCwyXCkKKyAxNDIgMDI0OCAzNjhDMUM2RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDJcKQorIDE0MyAwMjRjIDM2OEMxQzZGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsMlwpCisgMTQ0IDAyNTAgMzY4QzFDNzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSwyXCkKKyAxNDUgMDI1NCAzNjhDMUM3MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDJcKQorIDE0NiAwMjU4IDM2OEMxQzcyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksMlwpCisgMTQ3IDAyNWMgMzY4QzFDNzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSwyXCkKKyAxNDggMDI2MCA4QzFDNzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDJcKQorIDE0OSAwMjYzIDM2OEMxQzc1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSwyXCkKKyAxNTAgMDI2YiAzNjhDMUM3NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDJcKQorIDE1MSAwMjZmIDM2OEMxQzc3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksMlwpCisgMTUyIDAyNzMgMzY4QzFDNzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSwyXCkKKyAxNTMgMDI3NyAzNjhDMUM3OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDJcKQorIDE1NCAwMjdiIDM2OEMxQzdBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksMlwpCisgMTU1IDAyN2YgMzY4QzFDN0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSwyXCkKKyAxNTYgMDI4MyA4QzFDN0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDJcKQorIDE1NyAwMjg2IDM2OEMxQzdEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSwyXCkKKyAxNTggMDI4ZSAzNjhDMUM3RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDJcKQorIDE1OSAwMjkyIDM2OEMxQzdGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksMlwpCisgMTYwIDAyOTYgMzY4QzFDODAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCw0XCkKKyAxNjEgMDI5YSAzNjhDMUM4MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDRcKQorIDE2MiAwMjllIDM2OEMxQzgyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsNFwpCisgMTYzIDAyYTIgMzY4QzFDODMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCw0XCkKKyAxNjQgMDJhNiA4QzFDODQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDRcKQorIDE2NSAwMmE5IDM2OEMxQzg1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCw0XCkKKyAxNjYgMDJiMSAzNjhDMUM4NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDRcKQorIDE2NyAwMmI1IDM2OEMxQzg3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsNFwpCisgMTY4IDAyYjkgMzY4QzFDODggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCw0XCkKKyAxNjkgMDJiZCAzNjhDMUM4OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDRcKQorIDE3MCAwMmMxIDM2OEMxQzhBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsNFwpCisgMTcxIDAyYzUgMzY4QzFDOEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCw0XCkKKyAxNzIgMDJjOSA4QzFDOEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDRcKQorIDE3MyAwMmNjIDM2OEMxQzhEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCw0XCkKKyAxNzQgMDJkNCAzNjhDMUM4RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDRcKQorIDE3NSAwMmQ4IDM2OEMxQzhGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsNFwpCisgMTc2IDAyZGMgMzY4QzFDOTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCw0XCkKKyAxNzcgMDJlMCAzNjhDMUM5MSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDRcKQorIDE3OCAwMmU0IDM2OEMxQzkyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsNFwpCisgMTc5IDAyZTggMzY4QzFDOTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCw0XCkKKyAxODAgMDJlYyA4QzFDOTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDRcKQorIDE4MSAwMmVmIDM2OEMxQzk1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCw0XCkKKyAxODIgMDJmNyAzNjhDMUM5NiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDRcKQorIDE4MyAwMmZiIDM2OEMxQzk3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsNFwpCisgMTg0IDAyZmYgMzY4QzFDOTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCw0XCkKKyAxODUgMDMwMyAzNjhDMUM5OSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDRcKQorIDE4NiAwMzA3IDM2OEMxQzlBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsNFwpCisgMTg3IDAzMGIgMzY4QzFDOUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCw0XCkKKyAxODggMDMwZiA4QzFDOUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDRcKQorIDE4OSAwMzEyIDM2OEMxQzlEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCw0XCkKKyAxOTAgMDMxYSAzNjhDMUM5RSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDRcKQorIDE5MSAwMzFlIDM2OEMxQzlGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsNFwpCisgMTkyIDAzMjIgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsNFwpCisuKldhcm5pbmc6LioKKyAxOTMgMDMyNSAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCw0XCkKKy4qV2FybmluZzouKgorIDE5NCAwMzI4IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDRcKQorLipXYXJuaW5nOi4qCisgMTk1IDAzMmIgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsNFwpCisuKldhcm5pbmc6LioKKyAxOTYgMDMyZSA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCw0XCkKKy4qV2FybmluZzouKgorIDE5NyAwMzMxIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsNFwpCisuKldhcm5pbmc6LioKKyAxOTggMDMzOCAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSw0XCkKKy4qV2FybmluZzouKgorIDE5OSAwMzNiIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDRcKQorLipXYXJuaW5nOi4qCisgMjAwIDAzM2UgMzY4QzFDQTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCw0XCkKKyAyMDEgMDM0MiAzNjhDMUNBOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDRcKQorIDIwMiAwMzQ2IDM2OEMxQ0FBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsNFwpCisgMjAzIDAzNGEgMzY4QzFDQUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCw0XCkKKyAyMDQgMDM0ZSA4QzFDQUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDRcKQorIDIwNSAwMzUxIDM2OEMxQ0FEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCw0XCkKKyAyMDYgMDM1OSAzNjhDMUNBRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDRcKQorIDIwNyAwMzVkIDM2OEMxQ0FGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsNFwpCisgMjA4IDAzNjEgMzY4QzFDQjAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSw0XCkKKyAyMDkgMDM2NSAzNjhDMUNCMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDRcKQorIDIxMCAwMzY5IDM2OEMxQ0IyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksNFwpCisgMjExIDAzNmQgMzY4QzFDQjMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSw0XCkKKyAyMTIgMDM3MSA4QzFDQjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDRcKQorIDIxMyAwMzc0IDM2OEMxQ0I1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSw0XCkKKyAyMTQgMDM3YyAzNjhDMUNCNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDRcKQorIDIxNSAwMzgwIDM2OEMxQ0I3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksNFwpCisgMjE2IDAzODQgMzY4QzFDQjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSw0XCkKKyAyMTcgMDM4OCAzNjhDMUNCOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWRpLDRcKQorIDIxOCAwMzhjIDM2OEMxQ0JBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksNFwpCisgMjE5IDAzOTAgMzY4QzFDQkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSw0XCkKKyAyMjAgMDM5NCA4QzFDQkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDRcKQorIDIyMSAwMzk3IDM2OEMxQ0JEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSw0XCkKKyAyMjIgMDM5ZiAzNjhDMUNCRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDRcKQorIDIyMyAwM2EzIDM2OEMxQ0JGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksNFwpCisgMjI0IDAzYTcgMzY4QzFDQzAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCw4XCkKKyAyMjUgMDNhYiAzNjhDMUNDMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDhcKQorIDIyNiAwM2FmIDM2OEMxQ0MyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsOFwpCisgMjI3IDAzYjMgMzY4QzFDQzMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCw4XCkKKyAyMjggMDNiNyA4QzFDQzQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDhcKQorIDIyOSAwM2JhIDM2OEMxQ0M1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCw4XCkKKyAyMzAgMDNjMiAzNjhDMUNDNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDhcKQorIDIzMSAwM2M2IDM2OEMxQ0M3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsOFwpCisgMjMyIDAzY2EgMzY4QzFDQzggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCw4XCkKKyAyMzMgMDNjZSAzNjhDMUNDOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDhcKQorIDIzNCAwM2QyIDM2OEMxQ0NBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsOFwpCisgMjM1IDAzZDYgMzY4QzFDQ0IgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCw4XCkKKyAyMzYgMDNkYSA4QzFDQ0MgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDhcKQorIDIzNyAwM2RkIDM2OEMxQ0NEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCw4XCkKKyAyMzggMDNlNSAzNjhDMUNDRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDhcKQorIDIzOSAwM2U5IDM2OEMxQ0NGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsOFwpCisgMjQwIDAzZWQgMzY4QzFDRDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCw4XCkKKyAyNDEgMDNmMSAzNjhDMUNEMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDhcKQorIDI0MiAwM2Y1IDM2OEMxQ0QyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsOFwpCisgMjQzIDAzZjkgMzY4QzFDRDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCw4XCkKKyAyNDQgMDNmZCA4QzFDRDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDhcKQorIDI0NSAwNDAwIDM2OEMxQ0Q1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCw4XCkKKyAyNDYgMDQwOCAzNjhDMUNENiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDhcKQorIDI0NyAwNDBjIDM2OEMxQ0Q3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsOFwpCisgMjQ4IDA0MTAgMzY4QzFDRDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCw4XCkKKyAyNDkgMDQxNCAzNjhDMUNEOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDhcKQorIDI1MCAwNDE4IDM2OEMxQ0RBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsOFwpCisgMjUxIDA0MWMgMzY4QzFDREIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCw4XCkKKyAyNTIgMDQyMCA4QzFDREMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDhcKQorIDI1MyAwNDIzIDM2OEMxQ0REIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCw4XCkKKyAyNTQgMDQyYiAzNjhDMUNERSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDhcKQorIDI1NSAwNDJmIDM2OEMxQ0RGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsOFwpCisgMjU2IDA0MzMgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsOFwpCisuKldhcm5pbmc6LioKKyAyNTcgMDQzNiAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCw4XCkKKy4qV2FybmluZzouKgorIDI1OCAwNDM5IDM2OEMxQSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LDhcKQorLipXYXJuaW5nOi4qCisgMjU5IDA0M2MgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsOFwpCisuKldhcm5pbmc6LioKKyAyNjAgMDQzZiA4QzFDMjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCw4XCkKKy4qV2FybmluZzouKgorIDI2MSAwNDQyIDM2OEMxRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6XCgsOFwpCisuKldhcm5pbmc6LioKKyAyNjIgMDQ0OSAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSw4XCkKKy4qV2FybmluZzouKgorIDI2MyAwNDRjIDM2OEMxRiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLDhcKQorLipXYXJuaW5nOi4qCisgMjY0IDA0NGYgMzY4QzFDRTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVicCw4XCkKKyAyNjUgMDQ1MyAzNjhDMUNFOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJwLDhcKQorIDI2NiAwNDU3IDM2OEMxQ0VBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYnAsOFwpCisgMjY3IDA0NWIgMzY4QzFDRUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVicCw4XCkKKyAyNjggMDQ1ZiA4QzFDRUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJwLDhcKQorIDI2OSAwNDYyIDM2OEMxQ0VEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVicCw4XCkKKyAyNzAgMDQ2YSAzNjhDMUNFRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJwLDhcKQorIDI3MSAwNDZlIDM2OEMxQ0VGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYnAsOFwpCisgMjcyIDA0NzIgMzY4QzFDRjAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVzaSw4XCkKKyAyNzMgMDQ3NiAzNjhDMUNGMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZXNpLDhcKQorIDI3NCAwNDdhIDM2OEMxQ0YyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlc2ksOFwpCisgMjc1IDA0N2UgMzY4QzFDRjMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVzaSw4XCkKKyAyNzYgMDQ4MiA4QzFDRjQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZXNpLDhcKQorIDI3NyAwNDg1IDM2OEMxQ0Y1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVzaSw4XCkKKyAyNzggMDQ4ZCAzNjhDMUNGNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZXNpLDhcKQorIDI3OSAwNDkxIDM2OEMxQ0Y3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlc2ksOFwpCisgMjgwIDA0OTUgMzY4QzFDRjggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkaSw4XCkKKyAyODEgMDQ5OSAzNjhDMUNGQSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkeCwlZWRpLDhcKQorIDI4MiAwNDlkIDM2OEMxQ0Y5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksOFwpCisgMjgzIDA0YTEgMzY4QzFDRkIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkaSw4XCkKKyAyODQgMDRhNSA4QzFDRkMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWRpLDhcKQorIDI4NSAwNGE4IDM2OEMxQ0ZEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkaSw4XCkKKyAyODYgMDRiMCAzNjhDMUNGRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWRpLDhcKQorIDI4NyAwNGI0IDM2OEMxQ0ZGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZGksOFwpCisgMjg4IDA0YjggMzY4QzVDMDAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYXgsMVwpCisgMjg5IDA0YmQgMzY4QzVDMDEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYXgsMVwpCisgMjkwIDA0YzIgMzY4QzVDMDIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYXgsMVwpCisgMjkxIDA0YzcgMzY4QzVDMDMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYXgsMVwpCisgMjkyIDA0Y2MgOEM1QzA0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYXgsMVwpCisgMjkzIDA0ZDAgOEM1QzA1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYXgsMVwpCisgMjk0IDA0ZDQgMzY4QzVDMDYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYXgsMVwpCisgMjk1IDA0ZDkgMzY4QzVDMDcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYXgsMVwpCisgMjk2IDA0ZGUgMzY4QzVDMDggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlY3gsMVwpCisgMjk3IDA0ZTMgMzY4QzVDMDkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlY3gsMVwpCisgMjk4IDA0ZTggMzY4QzVDMEEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlY3gsMVwpCisgMjk5IDA0ZWQgMzY4QzVDMEIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlY3gsMVwpCisgMzAwIDA0ZjIgOEM1QzBDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlY3gsMVwpCisgMzAxIDA0ZjYgOEM1QzBEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlY3gsMVwpCisgMzAyIDA0ZmEgMzY4QzVDMEUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlY3gsMVwpCisgMzAzIDA0ZmYgMzY4QzVDMEYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlY3gsMVwpCisgMzA0IDA1MDQgMzY4QzVDMTAgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlZHgsMVwpCisgMzA1IDA1MDkgMzY4QzVDMTEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlZHgsMVwpCisgMzA2IDA1MGUgMzY4QzVDMTIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlZHgsMVwpCisgMzA3IDA1MTMgMzY4QzVDMTMgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlZHgsMVwpCisgMzA4IDA1MTggOEM1QzE0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlZHgsMVwpCisgMzA5IDA1MWMgOEM1QzE1MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlZHgsMVwpCisgMzEwIDA1MjAgMzY4QzVDMTYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlZHgsMVwpCisgMzExIDA1MjUgMzY4QzVDMTcgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlZHgsMVwpCisgMzEyIDA1MmEgMzY4QzVDMTggMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LCVlYngsMVwpCisgMzEzIDA1MmYgMzY4QzVDMTkgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LCVlYngsMVwpCisgMzE0IDA1MzQgMzY4QzVDMUEgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWR4LCVlYngsMVwpCisgMzE1IDA1MzkgMzY4QzVDMUIgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LCVlYngsMVwpCisgMzE2IDA1M2UgOEM1QzFDMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLCVlYngsMVwpCisgMzE3IDA1NDIgOEM1QzFEMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwLCVlYngsMVwpCisgMzE4IDA1NDYgMzY4QzVDMUUgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLCVlYngsMVwpCisgMzE5IDA1NGIgMzY4QzVDMUYgMTIgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLCVlYngsMVwpCisgMzIwIDA1NTAgMzY4QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWF4LDFcKQorIDMyMSAwNTU0IDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwxXCkKKyAzMjIgMDU1OCAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsMVwpCisgMzIzIDA1NWMgMzY4QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJ4LDFcKQorIDMyNCAwNTYwIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwxXCkKKyAzMjUgMDU2NCA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsMVwpCisgMzI2IDA1NjcgMzY4QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNpLDFcKQorIDMyNyAwNTZiIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwxXCkKKyAzMjggMDU2ZiAzNjhDNUMyOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCwxXCkKKyAzMjkgMDU3NCAzNjhDNUMyOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCwxXCkKKyAzMzAgMDU3OSAzNjhDNUMyQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCwxXCkKKyAzMzEgMDU3ZSAzNjhDNUMyQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCwxXCkKKyAzMzIgMDU4MyA4QzVDMkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCwxXCkKKyAzMzMgMDU4NyA4QzVDMkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCwxXCkKKyAzMzQgMDU4YiAzNjhDNUMyRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCwxXCkKKyAzMzUgMDU5MCAzNjhDNUMyRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCwxXCkKKyAzMzYgMDU5NSAzNjhDNUMzMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSwxXCkKKyAzMzcgMDU5YSAzNjhDNUMzMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSwxXCkKKyAzMzggMDU5ZiAzNjhDNUMzMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSwxXCkKKyAzMzkgMDVhNCAzNjhDNUMzMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSwxXCkKKyAzNDAgMDVhOSA4QzVDMzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSwxXCkKKyAzNDEgMDVhZCA4QzVDMzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSwxXCkKKyAzNDIgMDViMSAzNjhDNUMzNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSwxXCkKKyAzNDMgMDViNiAzNjhDNUMzNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSwxXCkKKyAzNDQgMDViYiAzNjhDNUMzOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSwxXCkKKyAzNDUgMDVjMCAzNjhDNUMzOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSwxXCkKKyAzNDYgMDVjNSAzNjhDNUMzQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSwxXCkKKyAzNDcgMDVjYSAzNjhDNUMzQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSwxXCkKKyAzNDggMDVjZiA4QzVDM0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSwxXCkKKyAzNDkgMDVkMyA4QzVDM0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSwxXCkKKyAzNTAgMDVkNyAzNjhDNUMzRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSwxXCkKKyAzNTEgMDVkYyAzNjhDNUMzRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSwxXCkKKyAzNTIgMDVlMSAzNjhDNUM0MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCwyXCkKKyAzNTMgMDVlNiAzNjhDNUM0MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCwyXCkKKyAzNTQgMDVlYiAzNjhDNUM0MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCwyXCkKKyAzNTUgMDVmMCAzNjhDNUM0MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCwyXCkKKyAzNTYgMDVmNSA4QzVDNDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCwyXCkKKyAzNTcgMDVmOSA4QzVDNDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCwyXCkKKyAzNTggMDVmZCAzNjhDNUM0NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCwyXCkKKyAzNTkgMDYwMiAzNjhDNUM0NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCwyXCkKKyAzNjAgMDYwNyAzNjhDNUM0OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCwyXCkKKyAzNjEgMDYwYyAzNjhDNUM0OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCwyXCkKKyAzNjIgMDYxMSAzNjhDNUM0QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCwyXCkKKyAzNjMgMDYxNiAzNjhDNUM0QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCwyXCkKKyAzNjQgMDYxYiA4QzVDNEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCwyXCkKKyAzNjUgMDYxZiA4QzVDNEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCwyXCkKKyAzNjYgMDYyMyAzNjhDNUM0RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCwyXCkKKyAzNjcgMDYyOCAzNjhDNUM0RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCwyXCkKKyAzNjggMDYyZCAzNjhDNUM1MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCwyXCkKKyAzNjkgMDYzMiAzNjhDNUM1MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCwyXCkKKyAzNzAgMDYzNyAzNjhDNUM1MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCwyXCkKKyAzNzEgMDYzYyAzNjhDNUM1MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCwyXCkKKyAzNzIgMDY0MSA4QzVDNTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCwyXCkKKyAzNzMgMDY0NSA4QzVDNTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCwyXCkKKyAzNzQgMDY0OSAzNjhDNUM1NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCwyXCkKKyAzNzUgMDY0ZSAzNjhDNUM1NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCwyXCkKKyAzNzYgMDY1MyAzNjhDNUM1OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCwyXCkKKyAzNzcgMDY1OCAzNjhDNUM1OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCwyXCkKKyAzNzggMDY1ZCAzNjhDNUM1QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCwyXCkKKyAzNzkgMDY2MiAzNjhDNUM1QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCwyXCkKKyAzODAgMDY2NyA4QzVDNUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCwyXCkKKyAzODEgMDY2YiA4QzVDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCwyXCkKKyAzODIgMDY2ZiAzNjhDNUM1RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCwyXCkKKyAzODMgMDY3NCAzNjhDNUM1RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCwyXCkKKyAzODQgMDY3OSAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsMlwpCisuKldhcm5pbmc6LioKKyAzODUgMDY3ZCAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsMlwpCisuKldhcm5pbmc6LioKKyAzODYgMDY4MSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsMlwpCisuKldhcm5pbmc6LioKKyAzODcgMDY4NSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsMlwpCisuKldhcm5pbmc6LioKKyAzODggMDY4OSA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsMlwpCisuKldhcm5pbmc6LioKKyAzODkgMDY4ZCA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsMlwpCisuKldhcm5pbmc6LioKKyAzOTAgMDY5MCAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksMlwpCisuKldhcm5pbmc6LioKKyAzOTEgMDY5NCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksMlwpCisuKldhcm5pbmc6LioKKyAzOTIgMDY5OCAzNjhDNUM2OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCwyXCkKKyAzOTMgMDY5ZCAzNjhDNUM2OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCwyXCkKKyAzOTQgMDZhMiAzNjhDNUM2QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCwyXCkKKyAzOTUgMDZhNyAzNjhDNUM2QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCwyXCkKKyAzOTYgMDZhYyA4QzVDNkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCwyXCkKKyAzOTcgMDZiMCA4QzVDNkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCwyXCkKKyAzOTggMDZiNCAzNjhDNUM2RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCwyXCkKKyAzOTkgMDZiOSAzNjhDNUM2RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCwyXCkKKyA0MDAgMDZiZSAzNjhDNUM3MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSwyXCkKKyA0MDEgMDZjMyAzNjhDNUM3MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSwyXCkKKyA0MDIgMDZjOCAzNjhDNUM3MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSwyXCkKKyA0MDMgMDZjZCAzNjhDNUM3MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSwyXCkKKyA0MDQgMDZkMiA4QzVDNzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSwyXCkKKyA0MDUgMDZkNiA4QzVDNzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSwyXCkKKyA0MDYgMDZkYSAzNjhDNUM3NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSwyXCkKKyA0MDcgMDZkZiAzNjhDNUM3NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSwyXCkKKyA0MDggMDZlNCAzNjhDNUM3OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSwyXCkKKyA0MDkgMDZlOSAzNjhDNUM3OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSwyXCkKKyA0MTAgMDZlZSAzNjhDNUM3QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSwyXCkKKyA0MTEgMDZmMyAzNjhDNUM3QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSwyXCkKKyA0MTIgMDZmOCA4QzVDN0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSwyXCkKKyA0MTMgMDZmYyA4QzVDN0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSwyXCkKKyA0MTQgMDcwMCAzNjhDNUM3RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSwyXCkKKyA0MTUgMDcwNSAzNjhDNUM3RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSwyXCkKKyA0MTYgMDcwYSAzNjhDNUM4MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCw0XCkKKyA0MTcgMDcwZiAzNjhDNUM4MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCw0XCkKKyA0MTggMDcxNCAzNjhDNUM4MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCw0XCkKKyA0MTkgMDcxOSAzNjhDNUM4MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCw0XCkKKyA0MjAgMDcxZSA4QzVDODQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCw0XCkKKyA0MjEgMDcyMiA4QzVDODUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCw0XCkKKyA0MjIgMDcyNiAzNjhDNUM4NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCw0XCkKKyA0MjMgMDcyYiAzNjhDNUM4NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCw0XCkKKyA0MjQgMDczMCAzNjhDNUM4OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCw0XCkKKyA0MjUgMDczNSAzNjhDNUM4OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCw0XCkKKyA0MjYgMDczYSAzNjhDNUM4QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCw0XCkKKyA0MjcgMDczZiAzNjhDNUM4QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCw0XCkKKyA0MjggMDc0NCA4QzVDOEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCw0XCkKKyA0MjkgMDc0OCA4QzVDOEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCw0XCkKKyA0MzAgMDc0YyAzNjhDNUM4RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCw0XCkKKyA0MzEgMDc1MSAzNjhDNUM4RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCw0XCkKKyA0MzIgMDc1NiAzNjhDNUM5MCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCw0XCkKKyA0MzMgMDc1YiAzNjhDNUM5MSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCw0XCkKKyA0MzQgMDc2MCAzNjhDNUM5MiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCw0XCkKKyA0MzUgMDc2NSAzNjhDNUM5MyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCw0XCkKKyA0MzYgMDc2YSA4QzVDOTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCw0XCkKKyA0MzcgMDc2ZSA4QzVDOTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCw0XCkKKyA0MzggMDc3MiAzNjhDNUM5NiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCw0XCkKKyA0MzkgMDc3NyAzNjhDNUM5NyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCw0XCkKKyA0NDAgMDc3YyAzNjhDNUM5OCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCw0XCkKKyA0NDEgMDc4MSAzNjhDNUM5OSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCw0XCkKKyA0NDIgMDc4NiAzNjhDNUM5QSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCw0XCkKKyA0NDMgMDc4YiAzNjhDNUM5QiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCw0XCkKKyA0NDQgMDc5MCA4QzVDOUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCw0XCkKKyA0NDUgMDc5NCA4QzVDOUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCw0XCkKKyA0NDYgMDc5OCAzNjhDNUM5RSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCw0XCkKKyA0NDcgMDc5ZCAzNjhDNUM5RiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCw0XCkKKyA0NDggMDdhMiAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsNFwpCisuKldhcm5pbmc6LioKKyA0NDkgMDdhNiAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsNFwpCisuKldhcm5pbmc6LioKKyA0NTAgMDdhYSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsNFwpCisuKldhcm5pbmc6LioKKyA0NTEgMDdhZSAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsNFwpCisuKldhcm5pbmc6LioKKyA0NTIgMDdiMiA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsNFwpCisuKldhcm5pbmc6LioKKyA0NTMgMDdiNiA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsNFwpCisuKldhcm5pbmc6LioKKyA0NTQgMDdiOSAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksNFwpCisuKldhcm5pbmc6LioKKyA0NTUgMDdiZCAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksNFwpCisuKldhcm5pbmc6LioKKyA0NTYgMDdjMSAzNjhDNUNBOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCw0XCkKKyA0NTcgMDdjNiAzNjhDNUNBOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCw0XCkKKyA0NTggMDdjYiAzNjhDNUNBQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCw0XCkKKyA0NTkgMDdkMCAzNjhDNUNBQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCw0XCkKKyA0NjAgMDdkNSA4QzVDQUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCw0XCkKKyA0NjEgMDdkOSA4QzVDQUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCw0XCkKKyA0NjIgMDdkZCAzNjhDNUNBRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCw0XCkKKyA0NjMgMDdlMiAzNjhDNUNBRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCw0XCkKKyA0NjQgMDdlNyAzNjhDNUNCMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSw0XCkKKyA0NjUgMDdlYyAzNjhDNUNCMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSw0XCkKKyA0NjYgMDdmMSAzNjhDNUNCMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSw0XCkKKyA0NjcgMDdmNiAzNjhDNUNCMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSw0XCkKKyA0NjggMDdmYiA4QzVDQjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSw0XCkKKyA0NjkgMDdmZiA4QzVDQjUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSw0XCkKKyA0NzAgMDgwMyAzNjhDNUNCNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSw0XCkKKyA0NzEgMDgwOCAzNjhDNUNCNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSw0XCkKKyA0NzIgMDgwZCAzNjhDNUNCOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSw0XCkKKyA0NzMgMDgxMiAzNjhDNUNCOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSw0XCkKKyA0NzQgMDgxNyAzNjhDNUNCQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSw0XCkKKyA0NzUgMDgxYyAzNjhDNUNCQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSw0XCkKKyA0NzYgMDgyMSA4QzVDQkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSw0XCkKKyA0NzcgMDgyNSA4QzVDQkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSw0XCkKKyA0NzggMDgyOSAzNjhDNUNCRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSw0XCkKKyA0NzkgMDgyZSAzNjhDNUNCRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSw0XCkKKyA0ODAgMDgzMyAzNjhDNUNDMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCw4XCkKKyA0ODEgMDgzOCAzNjhDNUNDMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCw4XCkKKyA0ODIgMDgzZCAzNjhDNUNDMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCw4XCkKKyA0ODMgMDg0MiAzNjhDNUNDMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCw4XCkKKyA0ODQgMDg0NyA4QzVDQzQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCw4XCkKKyA0ODUgMDg0YiA4QzVDQzUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCw4XCkKKyA0ODYgMDg0ZiAzNjhDNUNDNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCw4XCkKKyA0ODcgMDg1NCAzNjhDNUNDNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCw4XCkKKyA0ODggMDg1OSAzNjhDNUNDOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCw4XCkKKyA0ODkgMDg1ZSAzNjhDNUNDOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCw4XCkKKyA0OTAgMDg2MyAzNjhDNUNDQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCw4XCkKKyA0OTEgMDg2OCAzNjhDNUNDQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCw4XCkKKyA0OTIgMDg2ZCA4QzVDQ0MxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCw4XCkKKyA0OTMgMDg3MSA4QzVDQ0QxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCw4XCkKKyA0OTQgMDg3NSAzNjhDNUNDRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCw4XCkKKyA0OTUgMDg3YSAzNjhDNUNDRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCw4XCkKKyA0OTYgMDg3ZiAzNjhDNUNEMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCw4XCkKKyA0OTcgMDg4NCAzNjhDNUNEMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCw4XCkKKyA0OTggMDg4OSAzNjhDNUNEMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCw4XCkKKyA0OTkgMDg4ZSAzNjhDNUNEMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCw4XCkKKyA1MDAgMDg5MyA4QzVDRDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCw4XCkKKyA1MDEgMDg5NyA4QzVDRDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCw4XCkKKyA1MDIgMDg5YiAzNjhDNUNENiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCw4XCkKKyA1MDMgMDhhMCAzNjhDNUNENyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCw4XCkKKyA1MDQgMDhhNSAzNjhDNUNEOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCw4XCkKKyA1MDUgMDhhYSAzNjhDNUNEOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCw4XCkKKyA1MDYgMDhhZiAzNjhDNUNEQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCw4XCkKKyA1MDcgMDhiNCAzNjhDNUNEQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCw4XCkKKyA1MDggMDhiOSA4QzVDREMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCw4XCkKKyA1MDkgMDhiZCA4QzVDREQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCw4XCkKKyA1MTAgMDhjMSAzNjhDNUNERSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCw4XCkKKyA1MTEgMDhjNiAzNjhDNUNERiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCw4XCkKKyA1MTIgMDhjYiAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsOFwpCisuKldhcm5pbmc6LioKKyA1MTMgMDhjZiAzNjhDNTkxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsOFwpCisuKldhcm5pbmc6LioKKyA1MTQgMDhkMyAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsOFwpCisuKldhcm5pbmc6LioKKyA1MTUgMDhkNyAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsOFwpCisuKldhcm5pbmc6LioKKyA1MTYgMDhkYiA4QzVDMjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsOFwpCisuKldhcm5pbmc6LioKKyA1MTcgMDhkZiA4QzVEMTIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsOFwpCisuKldhcm5pbmc6LioKKyA1MTggMDhlMiAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksOFwpCisuKldhcm5pbmc6LioKKyA1MTkgMDhlNiAzNjhDNUYxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksOFwpCisuKldhcm5pbmc6LioKKyA1MjAgMDhlYSAzNjhDNUNFOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVicCw4XCkKKyA1MjEgMDhlZiAzNjhDNUNFOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVicCw4XCkKKyA1MjIgMDhmNCAzNjhDNUNFQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVicCw4XCkKKyA1MjMgMDhmOSAzNjhDNUNFQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVicCw4XCkKKyA1MjQgMDhmZSA4QzVDRUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVicCw4XCkKKyA1MjUgMDkwMiA4QzVDRUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVicCw4XCkKKyA1MjYgMDkwNiAzNjhDNUNFRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVicCw4XCkKKyA1MjcgMDkwYiAzNjhDNUNFRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVicCw4XCkKKyA1MjggMDkxMCAzNjhDNUNGMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVzaSw4XCkKKyA1MjkgMDkxNSAzNjhDNUNGMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVzaSw4XCkKKyA1MzAgMDkxYSAzNjhDNUNGMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVzaSw4XCkKKyA1MzEgMDkxZiAzNjhDNUNGMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVzaSw4XCkKKyA1MzIgMDkyNCA4QzVDRjQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVzaSw4XCkKKyA1MzMgMDkyOCA4QzVDRjUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVzaSw4XCkKKyA1MzQgMDkyYyAzNjhDNUNGNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVzaSw4XCkKKyA1MzUgMDkzMSAzNjhDNUNGNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVzaSw4XCkKKyA1MzYgMDkzNiAzNjhDNUNGOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkaSw4XCkKKyA1MzcgMDkzYiAzNjhDNUNGQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkaSw4XCkKKyA1MzggMDk0MCAzNjhDNUNGOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkaSw4XCkKKyA1MzkgMDk0NSAzNjhDNUNGQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkaSw4XCkKKyA1NDAgMDk0YSA4QzVDRkMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkaSw4XCkKKyA1NDEgMDk0ZSA4QzVDRkQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkaSw4XCkKKyA1NDIgMDk1MiAzNjhDNUNGRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkaSw4XCkKKyA1NDMgMDk1NyAzNjhDNUNGRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkaSw4XCkKKyA1NDQgMDk1YyAzNjhDOUMwMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwxXCkKKyA1NDUgMDk2NCAzNjhDOUMwMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCwxXCkKKyA1NDYgMDk2YyAzNjhDOUMwMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwxXCkKKyA1NDcgMDk3NCAzNjhDOUMwMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwxXCkKKyA1NDggMDk3YyA4QzlDMDQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCwxXCkKKyA1NDkgMDk4MyA4QzlDMDU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwxXCkKKyA1NTAgMDk4YSAzNjhDOUMwNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwxXCkKKyA1NTEgMDk5MiAzNjhDOUMwNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVheCwxXCkKKyA1NTIgMDk5YSAzNjhDOUMwOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwxXCkKKyA1NTMgMDlhMiAzNjhDOUMwOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwxXCkKKyA1NTQgMDlhYSAzNjhDOUMwQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCwxXCkKKyA1NTUgMDliMiAzNjhDOUMwQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwxXCkKKyA1NTYgMDliYSA4QzlDMEM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwxXCkKKyA1NTcgMDljMSA4QzlDMEQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCwxXCkKKyA1NTggMDljOCAzNjhDOUMwRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwxXCkKKyA1NTkgMDlkMCAzNjhDOUMwRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwxXCkKKyA1NjAgMDlkOCAzNjhDOUMxMCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCwxXCkKKyA1NjEgMDllMCAzNjhDOUMxMSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwxXCkKKyA1NjIgMDllOCAzNjhDOUMxMiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwxXCkKKyA1NjMgMDlmMCAzNjhDOUMxMyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCwxXCkKKyA1NjQgMDlmOCA4QzlDMTQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwxXCkKKyA1NjUgMDlmZiA4QzlDMTU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwxXCkKKyA1NjYgMGEwNiAzNjhDOUMxNiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCwxXCkKKyA1NjcgMGEwZSAzNjhDOUMxNyA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwxXCkKKyA1NjggMGExNiAzNjhDOUMxOCA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwxXCkKKyA1NjkgMGExZSAzNjhDOUMxOSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCwxXCkKKyA1NzAgMGEyNiAzNjhDOUMxQSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwxXCkKKyA1NzEgMGEyZSAzNjhDOUMxQiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwxXCkKKyA1NzIgMGEzNiA4QzlDMUM3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCwxXCkKKyA1NzMgMGEzZCA4QzlDMUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwxXCkKKyA1NzQgMGE0NCAzNjhDOUMxRSA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwxXCkKKyA1NzUgMGE0YyAzNjhDOUMxRiA3ODU2MzQxMiAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksJWVieCwxXCkKKyA1NzYgMGE1NCAzNjhDOTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYXgsMVwpCisgNTc3IDBhNWIgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDFcKQorIDU3OCAwYTYyIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwxXCkKKyA1NzkgMGE2OSAzNjhDOUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYngsMVwpCisgNTgwIDBhNzAgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDFcKQorIDU4MSAwYTc3IDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwxXCkKKyA1ODIgMGE3ZCAzNjhDOUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc2ksMVwpCisgNTgzIDBhODQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDFcKQorIDU4NCAwYThiIDM2OEM5QzI4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDFcKQorIDU4NSAwYTkzIDM2OEM5QzI5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDFcKQorIDU4NiAwYTliIDM2OEM5QzJBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDFcKQorIDU4NyAwYWEzIDM2OEM5QzJCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDFcKQorIDU4OCAwYWFiIDhDOUMyQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDFcKQorIDU4OSAwYWIyIDhDOUMyRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDFcKQorIDU5MCAwYWI5IDM2OEM5QzJFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDFcKQorIDU5MSAwYWMxIDM2OEM5QzJGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDFcKQorIDU5MiAwYWM5IDM2OEM5QzMwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDFcKQorIDU5MyAwYWQxIDM2OEM5QzMxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDFcKQorIDU5NCAwYWQ5IDM2OEM5QzMyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDFcKQorIDU5NSAwYWUxIDM2OEM5QzMzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDFcKQorIDU5NiAwYWU5IDhDOUMzNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDFcKQorIDU5NyAwYWYwIDhDOUMzNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDFcKQorIDU5OCAwYWY3IDM2OEM5QzM2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDFcKQorIDU5OSAwYWZmIDM2OEM5QzM3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDFcKQorIDYwMCAwYjA3IDM2OEM5QzM4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDFcKQorIDYwMSAwYjBmIDM2OEM5QzM5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDFcKQorIDYwMiAwYjE3IDM2OEM5QzNBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDFcKQorIDYwMyAwYjFmIDM2OEM5QzNCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDFcKQorIDYwNCAwYjI3IDhDOUMzQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDFcKQorIDYwNSAwYjJlIDhDOUMzRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDFcKQorIDYwNiAwYjM1IDM2OEM5QzNFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDFcKQorIDYwNyAwYjNkIDM2OEM5QzNGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDFcKQorIDYwOCAwYjQ1IDM2OEM5QzQwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDJcKQorIDYwOSAwYjRkIDM2OEM5QzQxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDJcKQorIDYxMCAwYjU1IDM2OEM5QzQyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDJcKQorIDYxMSAwYjVkIDM2OEM5QzQzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDJcKQorIDYxMiAwYjY1IDhDOUM0NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDJcKQorIDYxMyAwYjZjIDhDOUM0NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDJcKQorIDYxNCAwYjczIDM2OEM5QzQ2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDJcKQorIDYxNSAwYjdiIDM2OEM5QzQ3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDJcKQorIDYxNiAwYjgzIDM2OEM5QzQ4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDJcKQorIDYxNyAwYjhiIDM2OEM5QzQ5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDJcKQorIDYxOCAwYjkzIDM2OEM5QzRBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDJcKQorIDYxOSAwYjliIDM2OEM5QzRCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDJcKQorIDYyMCAwYmEzIDhDOUM0Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDJcKQorIDYyMSAwYmFhIDhDOUM0RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDJcKQorIDYyMiAwYmIxIDM2OEM5QzRFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDJcKQorIDYyMyAwYmI5IDM2OEM5QzRGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDJcKQorIDYyNCAwYmMxIDM2OEM5QzUwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDJcKQorIDYyNSAwYmM5IDM2OEM5QzUxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDJcKQorIDYyNiAwYmQxIDM2OEM5QzUyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDJcKQorIDYyNyAwYmQ5IDM2OEM5QzUzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDJcKQorIDYyOCAwYmUxIDhDOUM1NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDJcKQorIDYyOSAwYmU4IDhDOUM1NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDJcKQorIDYzMCAwYmVmIDM2OEM5QzU2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDJcKQorIDYzMSAwYmY3IDM2OEM5QzU3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDJcKQorIDYzMiAwYmZmIDM2OEM5QzU4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDJcKQorIDYzMyAwYzA3IDM2OEM5QzU5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDJcKQorIDYzNCAwYzBmIDM2OEM5QzVBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDJcKQorIDYzNSAwYzE3IDM2OEM5QzVCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDJcKQorIDYzNiAwYzFmIDhDOUM1Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDJcKQorIDYzNyAwYzI2IDhDOUM1RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDJcKQorIDYzOCAwYzJkIDM2OEM5QzVFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDJcKQorIDYzOSAwYzM1IDM2OEM5QzVGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDJcKQorIDY0MCAwYzNkIDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwyXCkKKy4qV2FybmluZzouKgorIDY0MSAwYzQ0IDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwyXCkKKy4qV2FybmluZzouKgorIDY0MiAwYzRiIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwyXCkKKy4qV2FybmluZzouKgorIDY0MyAwYzUyIDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwyXCkKKy4qV2FybmluZzouKgorIDY0NCAwYzU5IDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwyXCkKKy4qV2FybmluZzouKgorIDY0NSAwYzYwIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwyXCkKKy4qV2FybmluZzouKgorIDY0NiAwYzY2IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwyXCkKKy4qV2FybmluZzouKgorIDY0NyAwYzZkIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwyXCkKKy4qV2FybmluZzouKgorIDY0OCAwYzc0IDM2OEM5QzY4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDJcKQorIDY0OSAwYzdjIDM2OEM5QzY5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDJcKQorIDY1MCAwYzg0IDM2OEM5QzZBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDJcKQorIDY1MSAwYzhjIDM2OEM5QzZCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDJcKQorIDY1MiAwYzk0IDhDOUM2Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDJcKQorIDY1MyAwYzliIDhDOUM2RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDJcKQorIDY1NCAwY2EyIDM2OEM5QzZFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDJcKQorIDY1NSAwY2FhIDM2OEM5QzZGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDJcKQorIDY1NiAwY2IyIDM2OEM5QzcwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDJcKQorIDY1NyAwY2JhIDM2OEM5QzcxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDJcKQorIDY1OCAwY2MyIDM2OEM5QzcyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDJcKQorIDY1OSAwY2NhIDM2OEM5QzczIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDJcKQorIDY2MCAwY2QyIDhDOUM3NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDJcKQorIDY2MSAwY2Q5IDhDOUM3NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDJcKQorIDY2MiAwY2UwIDM2OEM5Qzc2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDJcKQorIDY2MyAwY2U4IDM2OEM5Qzc3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDJcKQorIDY2NCAwY2YwIDM2OEM5Qzc4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDJcKQorIDY2NSAwY2Y4IDM2OEM5Qzc5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDJcKQorIDY2NiAwZDAwIDM2OEM5QzdBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDJcKQorIDY2NyAwZDA4IDM2OEM5QzdCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDJcKQorIDY2OCAwZDEwIDhDOUM3Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDJcKQorIDY2OSAwZDE3IDhDOUM3RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDJcKQorIDY3MCAwZDFlIDM2OEM5QzdFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDJcKQorIDY3MSAwZDI2IDM2OEM5QzdGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDJcKQorIDY3MiAwZDJlIDM2OEM5QzgwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDRcKQorIDY3MyAwZDM2IDM2OEM5QzgxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDRcKQorIDY3NCAwZDNlIDM2OEM5QzgyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDRcKQorIDY3NSAwZDQ2IDM2OEM5QzgzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDRcKQorIDY3NiAwZDRlIDhDOUM4NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDRcKQorIDY3NyAwZDU1IDhDOUM4NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDRcKQorIDY3OCAwZDVjIDM2OEM5Qzg2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDRcKQorIDY3OSAwZDY0IDM2OEM5Qzg3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDRcKQorIDY4MCAwZDZjIDM2OEM5Qzg4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDRcKQorIDY4MSAwZDc0IDM2OEM5Qzg5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDRcKQorIDY4MiAwZDdjIDM2OEM5QzhBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDRcKQorIDY4MyAwZDg0IDM2OEM5QzhCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDRcKQorIDY4NCAwZDhjIDhDOUM4Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDRcKQorIDY4NSAwZDkzIDhDOUM4RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDRcKQorIDY4NiAwZDlhIDM2OEM5QzhFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDRcKQorIDY4NyAwZGEyIDM2OEM5QzhGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDRcKQorIDY4OCAwZGFhIDM2OEM5QzkwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDRcKQorIDY4OSAwZGIyIDM2OEM5QzkxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDRcKQorIDY5MCAwZGJhIDM2OEM5QzkyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDRcKQorIDY5MSAwZGMyIDM2OEM5QzkzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDRcKQorIDY5MiAwZGNhIDhDOUM5NDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDRcKQorIDY5MyAwZGQxIDhDOUM5NTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDRcKQorIDY5NCAwZGQ4IDM2OEM5Qzk2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDRcKQorIDY5NSAwZGUwIDM2OEM5Qzk3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDRcKQorIDY5NiAwZGU4IDM2OEM5Qzk4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDRcKQorIDY5NyAwZGYwIDM2OEM5Qzk5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDRcKQorIDY5OCAwZGY4IDM2OEM5QzlBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDRcKQorIDY5OSAwZTAwIDM2OEM5QzlCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDRcKQorIDcwMCAwZTA4IDhDOUM5Qzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDRcKQorIDcwMSAwZTBmIDhDOUM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDRcKQorIDcwMiAwZTE2IDM2OEM5QzlFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDRcKQorIDcwMyAwZTFlIDM2OEM5QzlGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDRcKQorIDcwNCAwZTI2IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCw0XCkKKy4qV2FybmluZzouKgorIDcwNSAwZTJkIDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCw0XCkKKy4qV2FybmluZzouKgorIDcwNiAwZTM0IDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCw0XCkKKy4qV2FybmluZzouKgorIDcwNyAwZTNiIDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCw0XCkKKy4qV2FybmluZzouKgorIDcwOCAwZTQyIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCw0XCkKKy4qV2FybmluZzouKgorIDcwOSAwZTQ5IDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCw0XCkKKy4qV2FybmluZzouKgorIDcxMCAwZTRmIDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSw0XCkKKy4qV2FybmluZzouKgorIDcxMSAwZTU2IDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSw0XCkKKy4qV2FybmluZzouKgorIDcxMiAwZTVkIDM2OEM5Q0E4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDRcKQorIDcxMyAwZTY1IDM2OEM5Q0E5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDRcKQorIDcxNCAwZTZkIDM2OEM5Q0FBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDRcKQorIDcxNSAwZTc1IDM2OEM5Q0FCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDRcKQorIDcxNiAwZTdkIDhDOUNBQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDRcKQorIDcxNyAwZTg0IDhDOUNBRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDRcKQorIDcxOCAwZThiIDM2OEM5Q0FFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDRcKQorIDcxOSAwZTkzIDM2OEM5Q0FGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDRcKQorIDcyMCAwZTliIDM2OEM5Q0IwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDRcKQorIDcyMSAwZWEzIDM2OEM5Q0IxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDRcKQorIDcyMiAwZWFiIDM2OEM5Q0IyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDRcKQorIDcyMyAwZWIzIDM2OEM5Q0IzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDRcKQorIDcyNCAwZWJiIDhDOUNCNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDRcKQorIDcyNSAwZWMyIDhDOUNCNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDRcKQorIDcyNiAwZWM5IDM2OEM5Q0I2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDRcKQorIDcyNyAwZWQxIDM2OEM5Q0I3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDRcKQorIDcyOCAwZWQ5IDM2OEM5Q0I4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDRcKQorIDcyOSAwZWUxIDM2OEM5Q0I5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDRcKQorIDczMCAwZWU5IDM2OEM5Q0JBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDRcKQorIDczMSAwZWYxIDM2OEM5Q0JCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDRcKQorIDczMiAwZWY5IDhDOUNCQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDRcKQorIDczMyAwZjAwIDhDOUNCRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDRcKQorIDczNCAwZjA3IDM2OEM5Q0JFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDRcKQorIDczNSAwZjBmIDM2OEM5Q0JGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDRcKQorIDczNiAwZjE3IDM2OEM5Q0MwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDhcKQorIDczNyAwZjFmIDM2OEM5Q0MxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDhcKQorIDczOCAwZjI3IDM2OEM5Q0MyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDhcKQorIDczOSAwZjJmIDM2OEM5Q0MzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDhcKQorIDc0MCAwZjM3IDhDOUNDNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDhcKQorIDc0MSAwZjNlIDhDOUNDNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDhcKQorIDc0MiAwZjQ1IDM2OEM5Q0M2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDhcKQorIDc0MyAwZjRkIDM2OEM5Q0M3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDhcKQorIDc0NCAwZjU1IDM2OEM5Q0M4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDhcKQorIDc0NSAwZjVkIDM2OEM5Q0M5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDhcKQorIDc0NiAwZjY1IDM2OEM5Q0NBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDhcKQorIDc0NyAwZjZkIDM2OEM5Q0NCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDhcKQorIDc0OCAwZjc1IDhDOUNDQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDhcKQorIDc0OSAwZjdjIDhDOUNDRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDhcKQorIDc1MCAwZjgzIDM2OEM5Q0NFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDhcKQorIDc1MSAwZjhiIDM2OEM5Q0NGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDhcKQorIDc1MiAwZjkzIDM2OEM5Q0QwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDhcKQorIDc1MyAwZjliIDM2OEM5Q0QxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDhcKQorIDc1NCAwZmEzIDM2OEM5Q0QyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDhcKQorIDc1NSAwZmFiIDM2OEM5Q0QzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDhcKQorIDc1NiAwZmIzIDhDOUNENDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDhcKQorIDc1NyAwZmJhIDhDOUNENTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDhcKQorIDc1OCAwZmMxIDM2OEM5Q0Q2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDhcKQorIDc1OSAwZmM5IDM2OEM5Q0Q3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDhcKQorIDc2MCAwZmQxIDM2OEM5Q0Q4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDhcKQorIDc2MSAwZmQ5IDM2OEM5Q0Q5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDhcKQorIDc2MiAwZmUxIDM2OEM5Q0RBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDhcKQorIDc2MyAwZmU5IDM2OEM5Q0RCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDhcKQorIDc2NCAwZmYxIDhDOUNEQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDhcKQorIDc2NSAwZmY4IDhDOUNERDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDhcKQorIDc2NiAwZmZmIDM2OEM5Q0RFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDhcKQorIDc2NyAxMDA3IDM2OEM5Q0RGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDhcKQorIDc2OCAxMDBmIDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCw4XCkKKy4qV2FybmluZzouKgorIDc2OSAxMDE2IDM2OEM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCw4XCkKKy4qV2FybmluZzouKgorIDc3MCAxMDFkIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCw4XCkKKy4qV2FybmluZzouKgorIDc3MSAxMDI0IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCw4XCkKKy4qV2FybmluZzouKgorIDc3MiAxMDJiIDhDOUMyNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCw4XCkKKy4qV2FybmluZzouKgorIDc3MyAxMDMyIDhDOUQ3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCw4XCkKKy4qV2FybmluZzouKgorIDc3NCAxMDM4IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSw4XCkKKy4qV2FybmluZzouKgorIDc3NSAxMDNmIDM2OEM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSw4XCkKKy4qV2FybmluZzouKgorIDc3NiAxMDQ2IDM2OEM5Q0U4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDhcKQorIDc3NyAxMDRlIDM2OEM5Q0U5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDhcKQorIDc3OCAxMDU2IDM2OEM5Q0VBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDhcKQorIDc3OSAxMDVlIDM2OEM5Q0VCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDhcKQorIDc4MCAxMDY2IDhDOUNFQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDhcKQorIDc4MSAxMDZkIDhDOUNFRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDhcKQorIDc4MiAxMDc0IDM2OEM5Q0VFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDhcKQorIDc4MyAxMDdjIDM2OEM5Q0VGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDhcKQorIDc4NCAxMDg0IDM2OEM5Q0YwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDhcKQorIDc4NSAxMDhjIDM2OEM5Q0YxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDhcKQorIDc4NiAxMDk0IDM2OEM5Q0YyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDhcKQorIDc4NyAxMDljIDM2OEM5Q0YzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDhcKQorIDc4OCAxMGE0IDhDOUNGNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDhcKQorIDc4OSAxMGFiIDhDOUNGNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDhcKQorIDc5MCAxMGIyIDM2OEM5Q0Y2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDhcKQorIDc5MSAxMGJhIDM2OEM5Q0Y3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDhcKQorIDc5MiAxMGMyIDM2OEM5Q0Y4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDhcKQorIDc5MyAxMGNhIDM2OEM5Q0ZBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDhcKQorIDc5NCAxMGQyIDM2OEM5Q0Y5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDhcKQorIDc5NSAxMGRhIDM2OEM5Q0ZCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDhcKQorIDc5NiAxMGUyIDhDOUNGQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDhcKQorIDc5NyAxMGU5IDhDOUNGRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDhcKQorIDc5OCAxMGYwIDM2OEM5Q0ZFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDhcKQorIDc5OSAxMGY4IDM2OEM5Q0ZGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDhcKQorIDgwMCAxMTAwIDhDNUMwNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsMVwpCisgODAxIDExMDQgOEM1QzBEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCwxXCkKKyA4MDIgMTEwOCA4QzVDMTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDFcKQorIDgwMyAxMTBjIDhDNUMxRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsMVwpCisgODA0IDExMTAgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsMVwpCisgODA1IDExMTMgOEM1QzJEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCwxXCkKKyA4MDYgMTExNyA4QzVDMzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDFcKQorIDgwNyAxMTFiIDhDNUMzRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksMVwpCisgODA4IDExMWYgOEM1QzQ1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCwyXCkKKyA4MDkgMTEyMyA4QzVDNEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDJcKQorIDgxMCAxMTI3IDhDNUM1NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsMlwpCisgODExIDExMmIgOEM1QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCwyXCkKKyA4MTIgMTEyZiA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwyXCkKKy4qV2FybmluZzouKgorIDgxMyAxMTMyIDhDNUM2RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsMlwpCisgODE0IDExMzYgOEM1Qzc1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSwyXCkKKyA4MTUgMTEzYSA4QzVDN0QwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDJcKQorIDgxNiAxMTNlIDhDNUM4NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsNFwpCisgODE3IDExNDIgOEM1QzhEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCw0XCkKKyA4MTggMTE0NiA4QzVDOTUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDRcKQorIDgxOSAxMTRhIDhDNUM5RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsNFwpCisgODIwIDExNGUgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsNFwpCisuKldhcm5pbmc6LioKKyA4MjEgMTE1MSA4QzVDQUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDRcKQorIDgyMiAxMTU1IDhDNUNCNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksNFwpCisgODIzIDExNTkgOEM1Q0JEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSw0XCkKKyA4MjQgMTE1ZCA4QzVDQzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDhcKQorIDgyNSAxMTYxIDhDNUNDRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsOFwpCisgODI2IDExNjUgOEM1Q0Q1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCw4XCkKKyA4MjcgMTE2OSA4QzVDREQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDhcKQorIDgyOCAxMTZkIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDhcKQorLipXYXJuaW5nOi4qCisgODI5IDExNzAgOEM1Q0VEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCw4XCkKKyA4MzAgMTE3NCA4QzVDRjUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDhcKQorIDgzMSAxMTc4IDhDNUNGRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksOFwpCisgODMyIDExN2MgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsMVwpCisgODMzIDExODMgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsMlwpCisuKldhcm5pbmc6LioKKyA4MzQgMTE4YSAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCw0XCkKKy4qV2FybmluZzouKgorIDgzNSAxMTkxIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDhcKQorLipXYXJuaW5nOi4qCisgODM2IDExOTggOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXhcKQorIDgzNyAxMTlhIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4XCkKKyA4MzggMTE5YyA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeFwpCisgODM5IDExOWUgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnhcKQorIDg0MCAxMWEwIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MAorIDg0MSAxMWE2IDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpXCkKKyA4NDIgMTFhOCA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaVwpCisgODQzIDExYWEgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4XCkKKyA4NDQgMTFhZCA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3hcKQorIDg0NSAxMWIwIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeFwpCisgODQ2IDExYjMgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4XCkKKyA4NDcgMTFiNiAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnBcKQorIDg0OCAxMWJhIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaVwpCisgODQ5IDExYmQgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpXCkKKyA4NTAgMTFjMCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXhcKQorIDg1MSAxMWM2IDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeFwpCisgODUyIDExY2MgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4XCkKKyA4NTMgMTFkMiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnhcKQorIDg1NCAxMWQ4IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicFwpCisgODU1IDExZGYgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpXCkKKyA4NTYgMTFlNSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGlcKQorIDg1NyAxMWViIDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4CisgODU4IDExZWQgOENEOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlY3gKKyA4NTkgMTFlZiA4Q0RBICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkeAorIDg2MCAxMWYxIDhDREIgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJ4CisgODYxIDExZjMgOENEQyAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc3AKKyA4NjIgMTFmNSA4Q0REICAgICAgICAgICAgICAJCW1vdgklZHMsJWVicAorIDg2MyAxMWY3IDhDREUgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNpCisgODY0IDExZjkgOENERiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZGkKKyA4NjUgMTFmYiA4QzFDMDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDFcKQorIDg2NiAxMWZlIDhDMUMwMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsMVwpCisgODY3IDEyMDEgOEMxQzAyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVheCwxXCkKKyA4NjggMTIwNCA4QzFDMDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDFcKQorIDg2OSAxMjA3IDNFOEMxQzA0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsMVwpCisgODcwIDEyMGIgOEMxQzA1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWF4LDFcKQorIDg3MSAxMjEyIDhDMUMwNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsMVwpCisgODcyIDEyMTUgOEMxQzA3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCwxXCkKKyA4NzMgMTIxOCA4QzFDMDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDFcKQorIDg3NCAxMjFiIDhDMUMwOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsMVwpCisgODc1IDEyMWUgOEMxQzBBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCwxXCkKKyA4NzYgMTIyMSA4QzFDMEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDFcKQorIDg3NyAxMjI0IDNFOEMxQzBDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsMVwpCisgODc4IDEyMjggOEMxQzBEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDFcKQorIDg3OSAxMjJmIDhDMUMwRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsMVwpCisgODgwIDEyMzIgOEMxQzBGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCwxXCkKKyA4ODEgMTIzNSA4QzFDMTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDFcKQorIDg4MiAxMjM4IDhDMUMxMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsMVwpCisgODgzIDEyM2IgOEMxQzEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCwxXCkKKyA4ODQgMTIzZSA4QzFDMTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDFcKQorIDg4NSAxMjQxIDNFOEMxQzE0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsMVwpCisgODg2IDEyNDUgOEMxQzE1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDFcKQorIDg4NyAxMjRjIDhDMUMxNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsMVwpCisgODg4IDEyNGYgOEMxQzE3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCwxXCkKKyA4ODkgMTI1MiA4QzFDMTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDFcKQorIDg5MCAxMjU1IDhDMUMxOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsMVwpCisgODkxIDEyNTggOEMxQzFBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCwxXCkKKyA4OTIgMTI1YiA4QzFDMUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDFcKQorIDg5MyAxMjVlIDNFOEMxQzFDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsMVwpCisgODk0IDEyNjIgOEMxQzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDFcKQorIDg5NSAxMjY5IDhDMUMxRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsMVwpCisgODk2IDEyNmMgOEMxQzFGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCwxXCkKKyA4OTcgMTI2ZiA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwxXCkKKyA4OTggMTI3MSA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwxXCkKKyA4OTkgMTI3MyA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwxXCkKKyA5MDAgMTI3NSA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwxXCkKKyA5MDEgMTI3NyAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwxXCkKKyA5MDIgMTI3YiA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDFcKQorIDkwMyAxMjgxIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDFcKQorIDkwNCAxMjgzIDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDFcKQorIDkwNSAxMjg1IDhDMUMyOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsMVwpCisgOTA2IDEyODggOEMxQzI5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCwxXCkKKyA5MDcgMTI4YiA4QzFDMkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDFcKQorIDkwOCAxMjhlIDhDMUMyQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsMVwpCisgOTA5IDEyOTEgM0U4QzFDMkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCwxXCkKKyA5MTAgMTI5NSA4QzFDMkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsMVwpCisgOTExIDEyOWMgOEMxQzJFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCwxXCkKKyA5MTIgMTI5ZiA4QzFDMkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDFcKQorIDkxMyAxMmEyIDhDMUMzMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksMVwpCisgOTE0IDEyYTUgOEMxQzMxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSwxXCkKKyA5MTUgMTJhOCA4QzFDMzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDFcKQorIDkxNiAxMmFiIDhDMUMzMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksMVwpCisgOTE3IDEyYWUgM0U4QzFDMzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSwxXCkKKyA5MTggMTJiMiA4QzFDMzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksMVwpCisgOTE5IDEyYjkgOEMxQzM2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSwxXCkKKyA5MjAgMTJiYyA4QzFDMzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDFcKQorIDkyMSAxMmJmIDhDMUMzOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksMVwpCisgOTIyIDEyYzIgOEMxQzM5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSwxXCkKKyA5MjMgMTJjNSA4QzFDM0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDFcKQorIDkyNCAxMmM4IDhDMUMzQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksMVwpCisgOTI1IDEyY2IgM0U4QzFDM0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSwxXCkKKyA5MjYgMTJjZiA4QzFDM0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksMVwpCisgOTI3IDEyZDYgOEMxQzNFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSwxXCkKKyA5MjggMTJkOSA4QzFDM0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDFcKQorIDkyOSAxMmRjIDhDMUM0MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsMlwpCisgOTMwIDEyZGYgOEMxQzQxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCwyXCkKKyA5MzEgMTJlMiA4QzFDNDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDJcKQorIDkzMiAxMmU1IDhDMUM0MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsMlwpCisgOTMzIDEyZTggM0U4QzFDNDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCwyXCkKKyA5MzQgMTJlYyA4QzFDNDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsMlwpCisgOTM1IDEyZjMgOEMxQzQ2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCwyXCkKKyA5MzYgMTJmNiA4QzFDNDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDJcKQorIDkzNyAxMmY5IDhDMUM0OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsMlwpCisgOTM4IDEyZmMgOEMxQzQ5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCwyXCkKKyA5MzkgMTJmZiA4QzFDNEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDJcKQorIDk0MCAxMzAyIDhDMUM0QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsMlwpCisgOTQxIDEzMDUgM0U4QzFDNEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCwyXCkKKyA5NDIgMTMwOSA4QzFDNEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsMlwpCisgOTQzIDEzMTAgOEMxQzRFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCwyXCkKKyA5NDQgMTMxMyA4QzFDNEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDJcKQorIDk0NSAxMzE2IDhDMUM1MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsMlwpCisgOTQ2IDEzMTkgOEMxQzUxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCwyXCkKKyA5NDcgMTMxYyA4QzFDNTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDJcKQorIDk0OCAxMzFmIDhDMUM1MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsMlwpCisgOTQ5IDEzMjIgM0U4QzFDNTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCwyXCkKKyA5NTAgMTMyNiA4QzFDNTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsMlwpCisgOTUxIDEzMmQgOEMxQzU2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCwyXCkKKyA5NTIgMTMzMCA4QzFDNTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDJcKQorIDk1MyAxMzMzIDhDMUM1OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsMlwpCisgOTU0IDEzMzYgOEMxQzU5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCwyXCkKKyA5NTUgMTMzOSA4QzFDNUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDJcKQorIDk1NiAxMzNjIDhDMUM1QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsMlwpCisgOTU3IDEzM2YgM0U4QzFDNUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCwyXCkKKyA5NTggMTM0MyA4QzFDNUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsMlwpCisgOTU5IDEzNGEgOEMxQzVFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCwyXCkKKyA5NjAgMTM0ZCA4QzFDNUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDJcKQorIDk2MSAxMzUwIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDJcKQorLipXYXJuaW5nOi4qCisgOTYyIDEzNTIgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsMlwpCisuKldhcm5pbmc6LioKKyA5NjMgMTM1NCA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwyXCkKKy4qV2FybmluZzouKgorIDk2NCAxMzU2IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDJcKQorLipXYXJuaW5nOi4qCisgOTY1IDEzNTggM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsMlwpCisuKldhcm5pbmc6LioKKyA5NjYgMTM1YyA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDJcKQorLipXYXJuaW5nOi4qCisgOTY3IDEzNjIgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksMlwpCisuKldhcm5pbmc6LioKKyA5NjggMTM2NCA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwyXCkKKy4qV2FybmluZzouKgorIDk2OSAxMzY2IDhDMUM2OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsMlwpCisgOTcwIDEzNjkgOEMxQzY5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCwyXCkKKyA5NzEgMTM2YyA4QzFDNkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDJcKQorIDk3MiAxMzZmIDhDMUM2QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsMlwpCisgOTczIDEzNzIgM0U4QzFDNkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCwyXCkKKyA5NzQgMTM3NiA4QzFDNkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsMlwpCisgOTc1IDEzN2QgOEMxQzZFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCwyXCkKKyA5NzYgMTM4MCA4QzFDNkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDJcKQorIDk3NyAxMzgzIDhDMUM3MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksMlwpCisgOTc4IDEzODYgOEMxQzcxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSwyXCkKKyA5NzkgMTM4OSA4QzFDNzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDJcKQorIDk4MCAxMzhjIDhDMUM3MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksMlwpCisgOTgxIDEzOGYgM0U4QzFDNzQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSwyXCkKKyA5ODIgMTM5MyA4QzFDNzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksMlwpCisgOTgzIDEzOWEgOEMxQzc2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSwyXCkKKyA5ODQgMTM5ZCA4QzFDNzcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDJcKQorIDk4NSAxM2EwIDhDMUM3OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksMlwpCisgOTg2IDEzYTMgOEMxQzc5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSwyXCkKKyA5ODcgMTNhNiA4QzFDN0EgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDJcKQorIDk4OCAxM2E5IDhDMUM3QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksMlwpCisgOTg5IDEzYWMgM0U4QzFDN0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSwyXCkKKyA5OTAgMTNiMCA4QzFDN0QwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksMlwpCisgOTkxIDEzYjcgOEMxQzdFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSwyXCkKKyA5OTIgMTNiYSA4QzFDN0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDJcKQorIDk5MyAxM2JkIDhDMUM4MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsNFwpCisgOTk0IDEzYzAgOEMxQzgxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCw0XCkKKyA5OTUgMTNjMyA4QzFDODIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDRcKQorIDk5NiAxM2M2IDhDMUM4MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsNFwpCisgOTk3IDEzYzkgM0U4QzFDODQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCw0XCkKKyA5OTggMTNjZCA4QzFDODUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsNFwpCisgOTk5IDEzZDQgOEMxQzg2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCw0XCkKKyAxMDAwIDEzZDcgOEMxQzg3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCw0XCkKKyAxMDAxIDEzZGEgOEMxQzg4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCw0XCkKKyAxMDAyIDEzZGQgOEMxQzg5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCw0XCkKKyAxMDAzIDEzZTAgOEMxQzhBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCw0XCkKKyAxMDA0IDEzZTMgOEMxQzhCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCw0XCkKKyAxMDA1IDEzZTYgM0U4QzFDOEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCw0XCkKKyAxMDA2IDEzZWEgOEMxQzhEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDRcKQorIDEwMDcgMTNmMSA4QzFDOEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDRcKQorIDEwMDggMTNmNCA4QzFDOEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDRcKQorIDEwMDkgMTNmNyA4QzFDOTAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDRcKQorIDEwMTAgMTNmYSA4QzFDOTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDRcKQorIDEwMTEgMTNmZCA4QzFDOTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDRcKQorIDEwMTIgMTQwMCA4QzFDOTMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDRcKQorIDEwMTMgMTQwMyAzRThDMUM5NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDRcKQorIDEwMTQgMTQwNyA4QzFDOTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsNFwpCisgMTAxNSAxNDBlIDhDMUM5NiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsNFwpCisgMTAxNiAxNDExIDhDMUM5NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsNFwpCisgMTAxNyAxNDE0IDhDMUM5OCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsNFwpCisgMTAxOCAxNDE3IDhDMUM5OSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsNFwpCisgMTAxOSAxNDFhIDhDMUM5QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsNFwpCisgMTAyMCAxNDFkIDhDMUM5QiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsNFwpCisgMTAyMSAxNDIwIDNFOEMxQzlDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsNFwpCisgMTAyMiAxNDI0IDhDMUM5RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCw0XCkKKyAxMDIzIDE0MmIgOEMxQzlFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCw0XCkKKyAxMDI0IDE0MmUgOEMxQzlGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCw0XCkKKyAxMDI1IDE0MzEgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsNFwpCisuKldhcm5pbmc6LioKKyAxMDI2IDE0MzMgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsNFwpCisuKldhcm5pbmc6LioKKyAxMDI3IDE0MzUgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsNFwpCisuKldhcm5pbmc6LioKKyAxMDI4IDE0MzcgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsNFwpCisuKldhcm5pbmc6LioKKyAxMDI5IDE0MzkgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsNFwpCisuKldhcm5pbmc6LioKKyAxMDMwIDE0M2QgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCw0XCkKKy4qV2FybmluZzouKgorIDEwMzEgMTQ0MyA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSw0XCkKKy4qV2FybmluZzouKgorIDEwMzIgMTQ0NSA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSw0XCkKKy4qV2FybmluZzouKgorIDEwMzMgMTQ0NyA4QzFDQTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDRcKQorIDEwMzQgMTQ0YSA4QzFDQTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDRcKQorIDEwMzUgMTQ0ZCA4QzFDQUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDRcKQorIDEwMzYgMTQ1MCA4QzFDQUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDRcKQorIDEwMzcgMTQ1MyAzRThDMUNBQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDRcKQorIDEwMzggMTQ1NyA4QzFDQUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsNFwpCisgMTAzOSAxNDVlIDhDMUNBRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsNFwpCisgMTA0MCAxNDYxIDhDMUNBRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsNFwpCisgMTA0MSAxNDY0IDhDMUNCMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksNFwpCisgMTA0MiAxNDY3IDhDMUNCMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksNFwpCisgMTA0MyAxNDZhIDhDMUNCMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksNFwpCisgMTA0NCAxNDZkIDhDMUNCMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksNFwpCisgMTA0NSAxNDcwIDNFOEMxQ0I0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksNFwpCisgMTA0NiAxNDc0IDhDMUNCNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSw0XCkKKyAxMDQ3IDE0N2IgOEMxQ0I2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSw0XCkKKyAxMDQ4IDE0N2UgOEMxQ0I3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSw0XCkKKyAxMDQ5IDE0ODEgOEMxQ0I4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSw0XCkKKyAxMDUwIDE0ODQgOEMxQ0I5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSw0XCkKKyAxMDUxIDE0ODcgOEMxQ0JBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSw0XCkKKyAxMDUyIDE0OGEgOEMxQ0JCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSw0XCkKKyAxMDUzIDE0OGQgM0U4QzFDQkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSw0XCkKKyAxMDU0IDE0OTEgOEMxQ0JEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDRcKQorIDEwNTUgMTQ5OCA4QzFDQkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDRcKQorIDEwNTYgMTQ5YiA4QzFDQkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDRcKQorIDEwNTcgMTQ5ZSA4QzFDQzAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWF4LDhcKQorIDEwNTggMTRhMSA4QzFDQzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDhcKQorIDEwNTkgMTRhNCA4QzFDQzIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDhcKQorIDEwNjAgMTRhNyA4QzFDQzMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWF4LDhcKQorIDEwNjEgMTRhYSAzRThDMUNDNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDhcKQorIDEwNjIgMTRhZSA4QzFDQzUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsOFwpCisgMTA2MyAxNGI1IDhDMUNDNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYXgsOFwpCisgMTA2NCAxNGI4IDhDMUNDNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsOFwpCisgMTA2NSAxNGJiIDhDMUNDOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsOFwpCisgMTA2NiAxNGJlIDhDMUNDOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlY3gsOFwpCisgMTA2NyAxNGMxIDhDMUNDQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsOFwpCisgMTA2OCAxNGM0IDhDMUNDQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsOFwpCisgMTA2OSAxNGM3IDNFOEMxQ0NDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlY3gsOFwpCisgMTA3MCAxNGNiIDhDMUNDRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCw4XCkKKyAxMDcxIDE0ZDIgOEMxQ0NFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCw4XCkKKyAxMDcyIDE0ZDUgOEMxQ0NGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVjeCw4XCkKKyAxMDczIDE0ZDggOEMxQ0QwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCw4XCkKKyAxMDc0IDE0ZGIgOEMxQ0QxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCw4XCkKKyAxMDc1IDE0ZGUgOEMxQ0QyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkeCw4XCkKKyAxMDc2IDE0ZTEgOEMxQ0QzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCw4XCkKKyAxMDc3IDE0ZTQgM0U4QzFDRDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCw4XCkKKyAxMDc4IDE0ZTggOEMxQ0Q1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWR4LDhcKQorIDEwNzkgMTRlZiA4QzFDRDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDhcKQorIDEwODAgMTRmMiA4QzFDRDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDhcKQorIDEwODEgMTRmNSA4QzFDRDggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJ4LDhcKQorIDEwODIgMTRmOCA4QzFDRDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDhcKQorIDEwODMgMTRmYiA4QzFDREEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDhcKQorIDEwODQgMTRmZSA4QzFDREIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJ4LDhcKQorIDEwODUgMTUwMSAzRThDMUNEQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDhcKQorIDEwODYgMTUwNSA4QzFDREQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsOFwpCisgMTA4NyAxNTBjIDhDMUNERSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYngsOFwpCisgMTA4OCAxNTBmIDhDMUNERiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsOFwpCisgMTA4OSAxNTEyIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDhcKQorLipXYXJuaW5nOi4qCisgMTA5MCAxNTE0IDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDhcKQorLipXYXJuaW5nOi4qCisgMTA5MSAxNTE2IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDhcKQorLipXYXJuaW5nOi4qCisgMTA5MiAxNTE4IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDhcKQorLipXYXJuaW5nOi4qCisgMTA5MyAxNTFhIDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDhcKQorLipXYXJuaW5nOi4qCisgMTA5NCAxNTFlIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsOFwpCisuKldhcm5pbmc6LioKKyAxMDk1IDE1MjQgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksOFwpCisuKldhcm5pbmc6LioKKyAxMDk2IDE1MjYgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksOFwpCisuKldhcm5pbmc6LioKKyAxMDk3IDE1MjggOEMxQ0U4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCw4XCkKKyAxMDk4IDE1MmIgOEMxQ0U5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVicCw4XCkKKyAxMDk5IDE1MmUgOEMxQ0VBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVicCw4XCkKKyAxMTAwIDE1MzEgOEMxQ0VCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCw4XCkKKyAxMTAxIDE1MzQgM0U4QzFDRUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVicCw4XCkKKyAxMTAyIDE1MzggOEMxQ0VEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJwLDhcKQorIDExMDMgMTUzZiA4QzFDRUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDhcKQorIDExMDQgMTU0MiA4QzFDRUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJwLDhcKQorIDExMDUgMTU0NSA4QzFDRjAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZXNpLDhcKQorIDExMDYgMTU0OCA4QzFDRjEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDhcKQorIDExMDcgMTU0YiA4QzFDRjIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZXNpLDhcKQorIDExMDggMTU0ZSA4QzFDRjMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZXNpLDhcKQorIDExMDkgMTU1MSAzRThDMUNGNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDhcKQorIDExMTAgMTU1NSA4QzFDRjUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlc2ksOFwpCisgMTExMSAxNTVjIDhDMUNGNiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlc2ksOFwpCisgMTExMiAxNTVmIDhDMUNGNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksOFwpCisgMTExMyAxNTYyIDhDMUNGOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZGksOFwpCisgMTExNCAxNTY1IDhDMUNGQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksOFwpCisgMTExNSAxNTY4IDhDMUNGOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZGksOFwpCisgMTExNiAxNTZiIDhDMUNGQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZGksOFwpCisgMTExNyAxNTZlIDNFOEMxQ0ZDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZGksOFwpCisgMTExOCAxNTcyIDhDMUNGRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSw4XCkKKyAxMTE5IDE1NzkgOEMxQ0ZFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkaSw4XCkKKyAxMTIwIDE1N2MgOEMxQ0ZGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkaSw4XCkKKyAxMTIxIDE1N2YgOEM1QzAwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsMVwpCisgMTEyMiAxNTgzIDhDNUMwMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDFcKQorIDExMjMgMTU4NyA4QzVDMDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCwxXCkKKyAxMTI0IDE1OGIgOEM1QzAzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsMVwpCisgMTEyNSAxNThmIDNFOEM1QzA0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDFcKQorIDExMjYgMTU5NCAzRThDNUMwNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCwxXCkKKyAxMTI3IDE1OTkgOEM1QzA2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsMVwpCisgMTEyOCAxNTlkIDhDNUMwNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDFcKQorIDExMjkgMTVhMSA4QzVDMDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCwxXCkKKyAxMTMwIDE1YTUgOEM1QzA5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsMVwpCisgMTEzMSAxNWE5IDhDNUMwQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDFcKQorIDExMzIgMTVhZCA4QzVDMEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCwxXCkKKyAxMTMzIDE1YjEgM0U4QzVDMEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsMVwpCisgMTEzNCAxNWI2IDNFOEM1QzBEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDFcKQorIDExMzUgMTViYiA4QzVDMEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCwxXCkKKyAxMTM2IDE1YmYgOEM1QzBGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsMVwpCisgMTEzNyAxNWMzIDhDNUMxMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDFcKQorIDExMzggMTVjNyA4QzVDMTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCwxXCkKKyAxMTM5IDE1Y2IgOEM1QzEyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsMVwpCisgMTE0MCAxNWNmIDhDNUMxMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDFcKQorIDExNDEgMTVkMyAzRThDNUMxNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCwxXCkKKyAxMTQyIDE1ZDggM0U4QzVDMTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsMVwpCisgMTE0MyAxNWRkIDhDNUMxNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDFcKQorIDExNDQgMTVlMSA4QzVDMTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCwxXCkKKyAxMTQ1IDE1ZTUgOEM1QzE4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsMVwpCisgMTE0NiAxNWU5IDhDNUMxOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDFcKQorIDExNDcgMTVlZCA4QzVDMUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCwxXCkKKyAxMTQ4IDE1ZjEgOEM1QzFCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsMVwpCisgMTE0OSAxNWY1IDNFOEM1QzFDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDFcKQorIDExNTAgMTVmYSAzRThDNUMxRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCwxXCkKKyAxMTUxIDE1ZmYgOEM1QzFFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsMVwpCisgMTE1MiAxNjAzIDhDNUMxRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDFcKQorIDExNTMgMTYwNyA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsMVwpCisgMTE1NCAxNjBhIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwxXCkKKyAxMTU1IDE2MGQgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDFcKQorIDExNTYgMTYxMCA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsMVwpCisgMTE1NyAxNjEzIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwxXCkKKyAxMTU4IDE2MTggM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDFcKQorIDExNTkgMTYxYyA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksMVwpCisgMTE2MCAxNjFmIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwxXCkKKyAxMTYxIDE2MjIgOEM1QzI4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsMVwpCisgMTE2MiAxNjI2IDhDNUMyOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDFcKQorIDExNjMgMTYyYSA4QzVDMkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCwxXCkKKyAxMTY0IDE2MmUgOEM1QzJCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsMVwpCisgMTE2NSAxNjMyIDNFOEM1QzJDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDFcKQorIDExNjYgMTYzNyAzRThDNUMyRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCwxXCkKKyAxMTY3IDE2M2MgOEM1QzJFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsMVwpCisgMTE2OCAxNjQwIDhDNUMyRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDFcKQorIDExNjkgMTY0NCA4QzVDMzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSwxXCkKKyAxMTcwIDE2NDggOEM1QzMxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksMVwpCisgMTE3MSAxNjRjIDhDNUMzMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDFcKQorIDExNzIgMTY1MCA4QzVDMzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSwxXCkKKyAxMTczIDE2NTQgM0U4QzVDMzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksMVwpCisgMTE3NCAxNjU5IDNFOEM1QzM1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDFcKQorIDExNzUgMTY1ZSA4QzVDMzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSwxXCkKKyAxMTc2IDE2NjIgOEM1QzM3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksMVwpCisgMTE3NyAxNjY2IDhDNUMzODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDFcKQorIDExNzggMTY2YSA4QzVDMzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSwxXCkKKyAxMTc5IDE2NmUgOEM1QzNBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksMVwpCisgMTE4MCAxNjcyIDhDNUMzQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDFcKQorIDExODEgMTY3NiAzRThDNUMzQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSwxXCkKKyAxMTgyIDE2N2IgM0U4QzVDM0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksMVwpCisgMTE4MyAxNjgwIDhDNUMzRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDFcKQorIDExODQgMTY4NCA4QzVDM0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSwxXCkKKyAxMTg1IDE2ODggOEM1QzQwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsMlwpCisgMTE4NiAxNjhjIDhDNUM0MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDJcKQorIDExODcgMTY5MCA4QzVDNDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCwyXCkKKyAxMTg4IDE2OTQgOEM1QzQzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsMlwpCisgMTE4OSAxNjk4IDNFOEM1QzQ0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDJcKQorIDExOTAgMTY5ZCAzRThDNUM0NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCwyXCkKKyAxMTkxIDE2YTIgOEM1QzQ2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsMlwpCisgMTE5MiAxNmE2IDhDNUM0NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDJcKQorIDExOTMgMTZhYSA4QzVDNDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCwyXCkKKyAxMTk0IDE2YWUgOEM1QzQ5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsMlwpCisgMTE5NSAxNmIyIDhDNUM0QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDJcKQorIDExOTYgMTZiNiA4QzVDNEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCwyXCkKKyAxMTk3IDE2YmEgM0U4QzVDNEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsMlwpCisgMTE5OCAxNmJmIDNFOEM1QzREIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDJcKQorIDExOTkgMTZjNCA4QzVDNEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCwyXCkKKyAxMjAwIDE2YzggOEM1QzRGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsMlwpCisgMTIwMSAxNmNjIDhDNUM1MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDJcKQorIDEyMDIgMTZkMCA4QzVDNTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCwyXCkKKyAxMjAzIDE2ZDQgOEM1QzUyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsMlwpCisgMTIwNCAxNmQ4IDhDNUM1MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDJcKQorIDEyMDUgMTZkYyAzRThDNUM1NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCwyXCkKKyAxMjA2IDE2ZTEgM0U4QzVDNTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsMlwpCisgMTIwNyAxNmU2IDhDNUM1NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDJcKQorIDEyMDggMTZlYSA4QzVDNTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCwyXCkKKyAxMjA5IDE2ZWUgOEM1QzU4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsMlwpCisgMTIxMCAxNmYyIDhDNUM1OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDJcKQorIDEyMTEgMTZmNiA4QzVDNUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCwyXCkKKyAxMjEyIDE2ZmEgOEM1QzVCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsMlwpCisgMTIxMyAxNmZlIDNFOEM1QzVDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDJcKQorIDEyMTQgMTcwMyAzRThDNUM1RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCwyXCkKKyAxMjE1IDE3MDggOEM1QzVFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsMlwpCisgMTIxNiAxNzBjIDhDNUM1RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDJcKQorIDEyMTcgMTcxMCA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsMlwpCisuKldhcm5pbmc6LioKKyAxMjE4IDE3MTMgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDJcKQorLipXYXJuaW5nOi4qCisgMTIxOSAxNzE2IDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwyXCkKKy4qV2FybmluZzouKgorIDEyMjAgMTcxOSA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsMlwpCisuKldhcm5pbmc6LioKKyAxMjIxIDE3MWMgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDJcKQorLipXYXJuaW5nOi4qCisgMTIyMiAxNzIxIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwyXCkKKy4qV2FybmluZzouKgorIDEyMjMgMTcyNSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksMlwpCisuKldhcm5pbmc6LioKKyAxMjI0IDE3MjggOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDJcKQorLipXYXJuaW5nOi4qCisgMTIyNSAxNzJiIDhDNUM2ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDJcKQorIDEyMjYgMTcyZiA4QzVDNjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCwyXCkKKyAxMjI3IDE3MzMgOEM1QzZBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsMlwpCisgMTIyOCAxNzM3IDhDNUM2QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDJcKQorIDEyMjkgMTczYiAzRThDNUM2QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCwyXCkKKyAxMjMwIDE3NDAgM0U4QzVDNkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsMlwpCisgMTIzMSAxNzQ1IDhDNUM2RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDJcKQorIDEyMzIgMTc0OSA4QzVDNkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCwyXCkKKyAxMjMzIDE3NGQgOEM1QzcwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksMlwpCisgMTIzNCAxNzUxIDhDNUM3MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDJcKQorIDEyMzUgMTc1NSA4QzVDNzIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSwyXCkKKyAxMjM2IDE3NTkgOEM1QzczMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksMlwpCisgMTIzNyAxNzVkIDNFOEM1Qzc0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDJcKQorIDEyMzggMTc2MiAzRThDNUM3NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSwyXCkKKyAxMjM5IDE3NjcgOEM1Qzc2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksMlwpCisgMTI0MCAxNzZiIDhDNUM3NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDJcKQorIDEyNDEgMTc2ZiA4QzVDNzgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSwyXCkKKyAxMjQyIDE3NzMgOEM1Qzc5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksMlwpCisgMTI0MyAxNzc3IDhDNUM3QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDJcKQorIDEyNDQgMTc3YiA4QzVDN0IxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSwyXCkKKyAxMjQ1IDE3N2YgM0U4QzVDN0MgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksMlwpCisgMTI0NiAxNzg0IDNFOEM1QzdEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDJcKQorIDEyNDcgMTc4OSA4QzVDN0UxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSwyXCkKKyAxMjQ4IDE3OGQgOEM1QzdGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksMlwpCisgMTI0OSAxNzkxIDhDNUM4MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDRcKQorIDEyNTAgMTc5NSA4QzVDODExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCw0XCkKKyAxMjUxIDE3OTkgOEM1QzgyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsNFwpCisgMTI1MiAxNzlkIDhDNUM4MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDRcKQorIDEyNTMgMTdhMSAzRThDNUM4NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCw0XCkKKyAxMjU0IDE3YTYgM0U4QzVDODUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsNFwpCisgMTI1NSAxN2FiIDhDNUM4NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDRcKQorIDEyNTYgMTdhZiA4QzVDODcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCw0XCkKKyAxMjU3IDE3YjMgOEM1Qzg4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsNFwpCisgMTI1OCAxN2I3IDhDNUM4OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDRcKQorIDEyNTkgMTdiYiA4QzVDOEExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCw0XCkKKyAxMjYwIDE3YmYgOEM1QzhCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsNFwpCisgMTI2MSAxN2MzIDNFOEM1QzhDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDRcKQorIDEyNjIgMTdjOCAzRThDNUM4RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCw0XCkKKyAxMjYzIDE3Y2QgOEM1QzhFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsNFwpCisgMTI2NCAxN2QxIDhDNUM4RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDRcKQorIDEyNjUgMTdkNSA4QzVDOTAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCw0XCkKKyAxMjY2IDE3ZDkgOEM1QzkxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsNFwpCisgMTI2NyAxN2RkIDhDNUM5MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDRcKQorIDEyNjggMTdlMSA4QzVDOTMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCw0XCkKKyAxMjY5IDE3ZTUgM0U4QzVDOTQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsNFwpCisgMTI3MCAxN2VhIDNFOEM1Qzk1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDRcKQorIDEyNzEgMTdlZiA4QzVDOTYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCw0XCkKKyAxMjcyIDE3ZjMgOEM1Qzk3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsNFwpCisgMTI3MyAxN2Y3IDhDNUM5ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDRcKQorIDEyNzQgMTdmYiA4QzVDOTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCw0XCkKKyAxMjc1IDE3ZmYgOEM1QzlBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsNFwpCisgMTI3NiAxODAzIDhDNUM5QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDRcKQorIDEyNzcgMTgwNyAzRThDNUM5QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCw0XCkKKyAxMjc4IDE4MGMgM0U4QzVDOUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsNFwpCisgMTI3OSAxODExIDhDNUM5RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDRcKQorIDEyODAgMTgxNSA4QzVDOUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCw0XCkKKyAxMjgxIDE4MTkgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDRcKQorLipXYXJuaW5nOi4qCisgMTI4MiAxODFjIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCw0XCkKKy4qV2FybmluZzouKgorIDEyODMgMTgxZiA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsNFwpCisuKldhcm5pbmc6LioKKyAxMjg0IDE4MjIgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDRcKQorLipXYXJuaW5nOi4qCisgMTI4NSAxODI1IDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCw0XCkKKy4qV2FybmluZzouKgorIDEyODYgMTgyYSAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsNFwpCisuKldhcm5pbmc6LioKKyAxMjg3IDE4MmUgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDRcKQorLipXYXJuaW5nOi4qCisgMTI4OCAxODMxIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSw0XCkKKy4qV2FybmluZzouKgorIDEyODkgMTgzNCA4QzVDQTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCw0XCkKKyAxMjkwIDE4MzggOEM1Q0E5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsNFwpCisgMTI5MSAxODNjIDhDNUNBQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDRcKQorIDEyOTIgMTg0MCA4QzVDQUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCw0XCkKKyAxMjkzIDE4NDQgM0U4QzVDQUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsNFwpCisgMTI5NCAxODQ5IDNFOEM1Q0FEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDRcKQorIDEyOTUgMTg0ZSA4QzVDQUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCw0XCkKKyAxMjk2IDE4NTIgOEM1Q0FGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsNFwpCisgMTI5NyAxODU2IDhDNUNCMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDRcKQorIDEyOTggMTg1YSA4QzVDQjExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSw0XCkKKyAxMjk5IDE4NWUgOEM1Q0IyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksNFwpCisgMTMwMCAxODYyIDhDNUNCMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDRcKQorIDEzMDEgMTg2NiAzRThDNUNCNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSw0XCkKKyAxMzAyIDE4NmIgM0U4QzVDQjUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksNFwpCisgMTMwMyAxODcwIDhDNUNCNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDRcKQorIDEzMDQgMTg3NCA4QzVDQjcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSw0XCkKKyAxMzA1IDE4NzggOEM1Q0I4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksNFwpCisgMTMwNiAxODdjIDhDNUNCOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDRcKQorIDEzMDcgMTg4MCA4QzVDQkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSw0XCkKKyAxMzA4IDE4ODQgOEM1Q0JCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksNFwpCisgMTMwOSAxODg4IDNFOEM1Q0JDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDRcKQorIDEzMTAgMTg4ZCAzRThDNUNCRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSw0XCkKKyAxMzExIDE4OTIgOEM1Q0JFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksNFwpCisgMTMxMiAxODk2IDhDNUNCRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDRcKQorIDEzMTMgMTg5YSA4QzVDQzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCw4XCkKKyAxMzE0IDE4OWUgOEM1Q0MxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsOFwpCisgMTMxNSAxOGEyIDhDNUNDMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDhcKQorIDEzMTYgMThhNiA4QzVDQzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCw4XCkKKyAxMzE3IDE4YWEgM0U4QzVDQzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsOFwpCisgMTMxOCAxOGFmIDNFOEM1Q0M1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDhcKQorIDEzMTkgMThiNCA4QzVDQzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCw4XCkKKyAxMzIwIDE4YjggOEM1Q0M3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsOFwpCisgMTMyMSAxOGJjIDhDNUNDODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDhcKQorIDEzMjIgMThjMCA4QzVDQzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCw4XCkKKyAxMzIzIDE4YzQgOEM1Q0NBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsOFwpCisgMTMyNCAxOGM4IDhDNUNDQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDhcKQorIDEzMjUgMThjYyAzRThDNUNDQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCw4XCkKKyAxMzI2IDE4ZDEgM0U4QzVDQ0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsOFwpCisgMTMyNyAxOGQ2IDhDNUNDRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDhcKQorIDEzMjggMThkYSA4QzVDQ0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCw4XCkKKyAxMzI5IDE4ZGUgOEM1Q0QwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsOFwpCisgMTMzMCAxOGUyIDhDNUNEMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDhcKQorIDEzMzEgMThlNiA4QzVDRDIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCw4XCkKKyAxMzMyIDE4ZWEgOEM1Q0QzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsOFwpCisgMTMzMyAxOGVlIDNFOEM1Q0Q0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDhcKQorIDEzMzQgMThmMyAzRThDNUNENSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCw4XCkKKyAxMzM1IDE4ZjggOEM1Q0Q2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsOFwpCisgMTMzNiAxOGZjIDhDNUNENzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDhcKQorIDEzMzcgMTkwMCA4QzVDRDgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCw4XCkKKyAxMzM4IDE5MDQgOEM1Q0Q5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsOFwpCisgMTMzOSAxOTA4IDhDNUNEQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDhcKQorIDEzNDAgMTkwYyA4QzVDREIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCw4XCkKKyAxMzQxIDE5MTAgM0U4QzVDREMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsOFwpCisgMTM0MiAxOTE1IDNFOEM1Q0REIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDhcKQorIDEzNDMgMTkxYSA4QzVDREUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCw4XCkKKyAxMzQ0IDE5MWUgOEM1Q0RGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsOFwpCisgMTM0NSAxOTIyIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCw4XCkKKy4qV2FybmluZzouKgorIDEzNDYgMTkyNSA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsOFwpCisuKldhcm5pbmc6LioKKyAxMzQ3IDE5MjggOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDhcKQorLipXYXJuaW5nOi4qCisgMTM0OCAxOTJiIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCw4XCkKKy4qV2FybmluZzouKgorIDEzNDkgMTkyZSAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsOFwpCisuKldhcm5pbmc6LioKKyAxMzUwIDE5MzMgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDhcKQorLipXYXJuaW5nOi4qCisgMTM1MSAxOTM3IDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSw4XCkKKy4qV2FybmluZzouKgorIDEzNTIgMTkzYSA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksOFwpCisuKldhcm5pbmc6LioKKyAxMzUzIDE5M2QgOEM1Q0U4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsOFwpCisgMTM1NCAxOTQxIDhDNUNFOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDhcKQorIDEzNTUgMTk0NSA4QzVDRUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCw4XCkKKyAxMzU2IDE5NDkgOEM1Q0VCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsOFwpCisgMTM1NyAxOTRkIDNFOEM1Q0VDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDhcKQorIDEzNTggMTk1MiAzRThDNUNFRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCw4XCkKKyAxMzU5IDE5NTcgOEM1Q0VFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsOFwpCisgMTM2MCAxOTViIDhDNUNFRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDhcKQorIDEzNjEgMTk1ZiA4QzVDRjAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSw4XCkKKyAxMzYyIDE5NjMgOEM1Q0YxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksOFwpCisgMTM2MyAxOTY3IDhDNUNGMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDhcKQorIDEzNjQgMTk2YiA4QzVDRjMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSw4XCkKKyAxMzY1IDE5NmYgM0U4QzVDRjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksOFwpCisgMTM2NiAxOTc0IDNFOEM1Q0Y1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDhcKQorIDEzNjcgMTk3OSA4QzVDRjYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSw4XCkKKyAxMzY4IDE5N2QgOEM1Q0Y3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksOFwpCisgMTM2OSAxOTgxIDhDNUNGODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDhcKQorIDEzNzAgMTk4NSA4QzVDRkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSw4XCkKKyAxMzcxIDE5ODkgOEM1Q0Y5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksOFwpCisgMTM3MiAxOThkIDhDNUNGQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDhcKQorIDEzNzMgMTk5MSAzRThDNUNGQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSw4XCkKKyAxMzc0IDE5OTYgM0U4QzVDRkQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksOFwpCisgMTM3NSAxOTliIDhDNUNGRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDhcKQorIDEzNzYgMTk5ZiA4QzVDRkYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSw4XCkKKyAxMzc3IDE5YTMgOEM5QzAwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMVwpCisgMTM3OCAxOWFhIDhDOUMwMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDFcKQorIDEzNzkgMTliMSA4QzlDMDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwxXCkKKyAxMzgwIDE5YjggOEM5QzAzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMVwpCisgMTM4MSAxOWJmIDNFOEM5QzA0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDFcKQorIDEzODIgMTljNyAzRThDOUMwNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwxXCkKKyAxMzgzIDE5Y2YgOEM5QzA2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMVwpCisgMTM4NCAxOWQ2IDhDOUMwNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDFcKQorIDEzODUgMTlkZCA4QzlDMDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwxXCkKKyAxMzg2IDE5ZTQgOEM5QzA5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMVwpCisgMTM4NyAxOWViIDhDOUMwQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDFcKQorIDEzODggMTlmMiA4QzlDMEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwxXCkKKyAxMzg5IDE5ZjkgM0U4QzlDMEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMVwpCisgMTM5MCAxYTAxIDNFOEM5QzBEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDFcKQorIDEzOTEgMWEwOSA4QzlDMEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwxXCkKKyAxMzkyIDFhMTAgOEM5QzBGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMVwpCisgMTM5MyAxYTE3IDhDOUMxMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDFcKQorIDEzOTQgMWExZSA4QzlDMTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwxXCkKKyAxMzk1IDFhMjUgOEM5QzEyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMVwpCisgMTM5NiAxYTJjIDhDOUMxMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDFcKQorIDEzOTcgMWEzMyAzRThDOUMxNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwxXCkKKyAxMzk4IDFhM2IgM0U4QzlDMTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMVwpCisgMTM5OSAxYTQzIDhDOUMxNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDFcKQorIDE0MDAgMWE0YSA4QzlDMTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwxXCkKKyAxNDAxIDFhNTEgOEM5QzE4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMVwpCisgMTQwMiAxYTU4IDhDOUMxOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDFcKQorIDE0MDMgMWE1ZiA4QzlDMUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwxXCkKKyAxNDA0IDFhNjYgOEM5QzFCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMVwpCisgMTQwNSAxYTZkIDNFOEM5QzFDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDFcKQorIDE0MDYgMWE3NSAzRThDOUMxRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwxXCkKKyAxNDA3IDFhN2QgOEM5QzFFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMVwpCisgMTQwOCAxYTg0IDhDOUMxRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDFcKQorIDE0MDkgMWE4YiA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsMVwpCisgMTQxMCAxYTkxIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwxXCkKKyAxNDExIDFhOTcgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDFcKQorIDE0MTIgMWE5ZCA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsMVwpCisgMTQxMyAxYWEzIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwxXCkKKyAxNDE0IDFhYWIgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDFcKQorIDE0MTUgMWFiMiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksMVwpCisgMTQxNiAxYWI4IDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwxXCkKKyAxNDE3IDFhYmUgOEM5QzI4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMVwpCisgMTQxOCAxYWM1IDhDOUMyOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDFcKQorIDE0MTkgMWFjYyA4QzlDMkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwxXCkKKyAxNDIwIDFhZDMgOEM5QzJCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMVwpCisgMTQyMSAxYWRhIDNFOEM5QzJDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDFcKQorIDE0MjIgMWFlMiAzRThDOUMyRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwxXCkKKyAxNDIzIDFhZWEgOEM5QzJFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMVwpCisgMTQyNCAxYWYxIDhDOUMyRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDFcKQorIDE0MjUgMWFmOCA4QzlDMzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwxXCkKKyAxNDI2IDFhZmYgOEM5QzMxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMVwpCisgMTQyNyAxYjA2IDhDOUMzMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDFcKQorIDE0MjggMWIwZCA4QzlDMzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwxXCkKKyAxNDI5IDFiMTQgM0U4QzlDMzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMVwpCisgMTQzMCAxYjFjIDNFOEM5QzM1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDFcKQorIDE0MzEgMWIyNCA4QzlDMzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwxXCkKKyAxNDMyIDFiMmIgOEM5QzM3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMVwpCisgMTQzMyAxYjMyIDhDOUMzODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDFcKQorIDE0MzQgMWIzOSA4QzlDMzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwxXCkKKyAxNDM1IDFiNDAgOEM5QzNBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMVwpCisgMTQzNiAxYjQ3IDhDOUMzQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDFcKQorIDE0MzcgMWI0ZSAzRThDOUMzQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwxXCkKKyAxNDM4IDFiNTYgM0U4QzlDM0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMVwpCisgMTQzOSAxYjVlIDhDOUMzRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDFcKQorIDE0NDAgMWI2NSA4QzlDM0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwxXCkKKyAxNDQxIDFiNmMgOEM5QzQwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMlwpCisgMTQ0MiAxYjczIDhDOUM0MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDJcKQorIDE0NDMgMWI3YSA4QzlDNDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCwyXCkKKyAxNDQ0IDFiODEgOEM5QzQzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMlwpCisgMTQ0NSAxYjg4IDNFOEM5QzQ0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDJcKQorIDE0NDYgMWI5MCAzRThDOUM0NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCwyXCkKKyAxNDQ3IDFiOTggOEM5QzQ2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMlwpCisgMTQ0OCAxYjlmIDhDOUM0Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDJcKQorIDE0NDkgMWJhNiA4QzlDNDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCwyXCkKKyAxNDUwIDFiYWQgOEM5QzQ5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMlwpCisgMTQ1MSAxYmI0IDhDOUM0QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDJcKQorIDE0NTIgMWJiYiA4QzlDNEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCwyXCkKKyAxNDUzIDFiYzIgM0U4QzlDNEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMlwpCisgMTQ1NCAxYmNhIDNFOEM5QzREIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDJcKQorIDE0NTUgMWJkMiA4QzlDNEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCwyXCkKKyAxNDU2IDFiZDkgOEM5QzRGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMlwpCisgMTQ1NyAxYmUwIDhDOUM1MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDJcKQorIDE0NTggMWJlNyA4QzlDNTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCwyXCkKKyAxNDU5IDFiZWUgOEM5QzUyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMlwpCisgMTQ2MCAxYmY1IDhDOUM1Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDJcKQorIDE0NjEgMWJmYyAzRThDOUM1NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCwyXCkKKyAxNDYyIDFjMDQgM0U4QzlDNTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMlwpCisgMTQ2MyAxYzBjIDhDOUM1Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDJcKQorIDE0NjQgMWMxMyA4QzlDNTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCwyXCkKKyAxNDY1IDFjMWEgOEM5QzU4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMlwpCisgMTQ2NiAxYzIxIDhDOUM1OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDJcKQorIDE0NjcgMWMyOCA4QzlDNUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCwyXCkKKyAxNDY4IDFjMmYgOEM5QzVCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMlwpCisgMTQ2OSAxYzM2IDNFOEM5QzVDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDJcKQorIDE0NzAgMWMzZSAzRThDOUM1RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCwyXCkKKyAxNDcxIDFjNDYgOEM5QzVFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMlwpCisgMTQ3MiAxYzRkIDhDOUM1Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDJcKQorIDE0NzMgMWM1NCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsMlwpCisuKldhcm5pbmc6LioKKyAxNDc0IDFjNWEgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDJcKQorLipXYXJuaW5nOi4qCisgMTQ3NSAxYzYwIDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwyXCkKKy4qV2FybmluZzouKgorIDE0NzYgMWM2NiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsMlwpCisuKldhcm5pbmc6LioKKyAxNDc3IDFjNmMgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDJcKQorLipXYXJuaW5nOi4qCisgMTQ3OCAxYzc0IDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwyXCkKKy4qV2FybmluZzouKgorIDE0NzkgMWM3YiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksMlwpCisuKldhcm5pbmc6LioKKyAxNDgwIDFjODEgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDJcKQorLipXYXJuaW5nOi4qCisgMTQ4MSAxYzg3IDhDOUM2ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDJcKQorIDE0ODIgMWM4ZSA4QzlDNjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCwyXCkKKyAxNDgzIDFjOTUgOEM5QzZBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMlwpCisgMTQ4NCAxYzljIDhDOUM2Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDJcKQorIDE0ODUgMWNhMyAzRThDOUM2QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCwyXCkKKyAxNDg2IDFjYWIgM0U4QzlDNkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMlwpCisgMTQ4NyAxY2IzIDhDOUM2RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDJcKQorIDE0ODggMWNiYSA4QzlDNkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCwyXCkKKyAxNDg5IDFjYzEgOEM5QzcwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMlwpCisgMTQ5MCAxY2M4IDhDOUM3MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDJcKQorIDE0OTEgMWNjZiA4QzlDNzI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSwyXCkKKyAxNDkyIDFjZDYgOEM5QzczNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMlwpCisgMTQ5MyAxY2RkIDNFOEM5Qzc0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDJcKQorIDE0OTQgMWNlNSAzRThDOUM3NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSwyXCkKKyAxNDk1IDFjZWQgOEM5Qzc2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMlwpCisgMTQ5NiAxY2Y0IDhDOUM3Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDJcKQorIDE0OTcgMWNmYiA4QzlDNzg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSwyXCkKKyAxNDk4IDFkMDIgOEM5Qzc5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMlwpCisgMTQ5OSAxZDA5IDhDOUM3QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDJcKQorIDE1MDAgMWQxMCA4QzlDN0I3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSwyXCkKKyAxNTAxIDFkMTcgM0U4QzlDN0MgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMlwpCisgMTUwMiAxZDFmIDNFOEM5QzdEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDJcKQorIDE1MDMgMWQyNyA4QzlDN0U3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSwyXCkKKyAxNTA0IDFkMmUgOEM5QzdGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMlwpCisgMTUwNSAxZDM1IDhDOUM4MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDRcKQorIDE1MDYgMWQzYyA4QzlDODE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw0XCkKKyAxNTA3IDFkNDMgOEM5QzgyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsNFwpCisgMTUwOCAxZDRhIDhDOUM4Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDRcKQorIDE1MDkgMWQ1MSAzRThDOUM4NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw0XCkKKyAxNTEwIDFkNTkgM0U4QzlDODUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsNFwpCisgMTUxMSAxZDYxIDhDOUM4Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDRcKQorIDE1MTIgMWQ2OCA4QzlDODc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw0XCkKKyAxNTEzIDFkNmYgOEM5Qzg4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsNFwpCisgMTUxNCAxZDc2IDhDOUM4OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDRcKQorIDE1MTUgMWQ3ZCA4QzlDOEE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw0XCkKKyAxNTE2IDFkODQgOEM5QzhCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsNFwpCisgMTUxNyAxZDhiIDNFOEM5QzhDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDRcKQorIDE1MTggMWQ5MyAzRThDOUM4RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw0XCkKKyAxNTE5IDFkOWIgOEM5QzhFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsNFwpCisgMTUyMCAxZGEyIDhDOUM4Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDRcKQorIDE1MjEgMWRhOSA4QzlDOTA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw0XCkKKyAxNTIyIDFkYjAgOEM5QzkxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsNFwpCisgMTUyMyAxZGI3IDhDOUM5Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDRcKQorIDE1MjQgMWRiZSA4QzlDOTM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw0XCkKKyAxNTI1IDFkYzUgM0U4QzlDOTQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsNFwpCisgMTUyNiAxZGNkIDNFOEM5Qzk1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDRcKQorIDE1MjcgMWRkNSA4QzlDOTY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw0XCkKKyAxNTI4IDFkZGMgOEM5Qzk3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsNFwpCisgMTUyOSAxZGUzIDhDOUM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDRcKQorIDE1MzAgMWRlYSA4QzlDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw0XCkKKyAxNTMxIDFkZjEgOEM5QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsNFwpCisgMTUzMiAxZGY4IDhDOUM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDRcKQorIDE1MzMgMWRmZiAzRThDOUM5QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw0XCkKKyAxNTM0IDFlMDcgM0U4QzlDOUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsNFwpCisgMTUzNSAxZTBmIDhDOUM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDRcKQorIDE1MzYgMWUxNiA4QzlDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw0XCkKKyAxNTM3IDFlMWQgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDRcKQorLipXYXJuaW5nOi4qCisgMTUzOCAxZTIzIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCw0XCkKKy4qV2FybmluZzouKgorIDE1MzkgMWUyOSA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsNFwpCisuKldhcm5pbmc6LioKKyAxNTQwIDFlMmYgOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDRcKQorLipXYXJuaW5nOi4qCisgMTU0MSAxZTM1IDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCw0XCkKKy4qV2FybmluZzouKgorIDE1NDIgMWUzZCAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsNFwpCisuKldhcm5pbmc6LioKKyAxNTQzIDFlNDQgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDRcKQorLipXYXJuaW5nOi4qCisgMTU0NCAxZTRhIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSw0XCkKKy4qV2FybmluZzouKgorIDE1NDUgMWU1MCA4QzlDQTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw0XCkKKyAxNTQ2IDFlNTcgOEM5Q0E5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsNFwpCisgMTU0NyAxZTVlIDhDOUNBQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDRcKQorIDE1NDggMWU2NSA4QzlDQUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw0XCkKKyAxNTQ5IDFlNmMgM0U4QzlDQUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsNFwpCisgMTU1MCAxZTc0IDNFOEM5Q0FEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDRcKQorIDE1NTEgMWU3YyA4QzlDQUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw0XCkKKyAxNTUyIDFlODMgOEM5Q0FGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsNFwpCisgMTU1MyAxZThhIDhDOUNCMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDRcKQorIDE1NTQgMWU5MSA4QzlDQjE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw0XCkKKyAxNTU1IDFlOTggOEM5Q0IyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksNFwpCisgMTU1NiAxZTlmIDhDOUNCMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDRcKQorIDE1NTcgMWVhNiAzRThDOUNCNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw0XCkKKyAxNTU4IDFlYWUgM0U4QzlDQjUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksNFwpCisgMTU1OSAxZWI2IDhDOUNCNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDRcKQorIDE1NjAgMWViZCA4QzlDQjc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw0XCkKKyAxNTYxIDFlYzQgOEM5Q0I4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksNFwpCisgMTU2MiAxZWNiIDhDOUNCOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDRcKQorIDE1NjMgMWVkMiA4QzlDQkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw0XCkKKyAxNTY0IDFlZDkgOEM5Q0JCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksNFwpCisgMTU2NSAxZWUwIDNFOEM5Q0JDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDRcKQorIDE1NjYgMWVlOCAzRThDOUNCRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw0XCkKKyAxNTY3IDFlZjAgOEM5Q0JFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksNFwpCisgMTU2OCAxZWY3IDhDOUNCRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDRcKQorIDE1NjkgMWVmZSA4QzlDQzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCw4XCkKKyAxNTcwIDFmMDUgOEM5Q0MxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsOFwpCisgMTU3MSAxZjBjIDhDOUNDMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDhcKQorIDE1NzIgMWYxMyA4QzlDQzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCw4XCkKKyAxNTczIDFmMWEgM0U4QzlDQzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsOFwpCisgMTU3NCAxZjIyIDNFOEM5Q0M1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDhcKQorIDE1NzUgMWYyYSA4QzlDQzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCw4XCkKKyAxNTc2IDFmMzEgOEM5Q0M3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsOFwpCisgMTU3NyAxZjM4IDhDOUNDODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDhcKQorIDE1NzggMWYzZiA4QzlDQzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCw4XCkKKyAxNTc5IDFmNDYgOEM5Q0NBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsOFwpCisgMTU4MCAxZjRkIDhDOUNDQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDhcKQorIDE1ODEgMWY1NCAzRThDOUNDQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCw4XCkKKyAxNTgyIDFmNWMgM0U4QzlDQ0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsOFwpCisgMTU4MyAxZjY0IDhDOUNDRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDhcKQorIDE1ODQgMWY2YiA4QzlDQ0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCw4XCkKKyAxNTg1IDFmNzIgOEM5Q0QwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsOFwpCisgMTU4NiAxZjc5IDhDOUNEMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDhcKQorIDE1ODcgMWY4MCA4QzlDRDI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCw4XCkKKyAxNTg4IDFmODcgOEM5Q0QzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsOFwpCisgMTU4OSAxZjhlIDNFOEM5Q0Q0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDhcKQorIDE1OTAgMWY5NiAzRThDOUNENSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCw4XCkKKyAxNTkxIDFmOWUgOEM5Q0Q2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsOFwpCisgMTU5MiAxZmE1IDhDOUNENzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDhcKQorIDE1OTMgMWZhYyA4QzlDRDg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCw4XCkKKyAxNTk0IDFmYjMgOEM5Q0Q5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsOFwpCisgMTU5NSAxZmJhIDhDOUNEQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDhcKQorIDE1OTYgMWZjMSA4QzlDREI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCw4XCkKKyAxNTk3IDFmYzggM0U4QzlDREMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsOFwpCisgMTU5OCAxZmQwIDNFOEM5Q0REIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDhcKQorIDE1OTkgMWZkOCA4QzlDREU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCw4XCkKKyAxNjAwIDFmZGYgOEM5Q0RGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsOFwpCisgMTYwMSAxZmU2IDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCw4XCkKKy4qV2FybmluZzouKgorIDE2MDIgMWZlYyA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsOFwpCisuKldhcm5pbmc6LioKKyAxNjAzIDFmZjIgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDhcKQorLipXYXJuaW5nOi4qCisgMTYwNCAxZmY4IDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCw4XCkKKy4qV2FybmluZzouKgorIDE2MDUgMWZmZSAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsOFwpCisuKldhcm5pbmc6LioKKyAxNjA2IDIwMDYgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDhcKQorLipXYXJuaW5nOi4qCisgMTYwNyAyMDBkIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSw4XCkKKy4qV2FybmluZzouKgorIDE2MDggMjAxMyA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksOFwpCisuKldhcm5pbmc6LioKKyAxNjA5IDIwMTkgOEM5Q0U4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsOFwpCisgMTYxMCAyMDIwIDhDOUNFOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDhcKQorIDE2MTEgMjAyNyA4QzlDRUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCw4XCkKKyAxNjEyIDIwMmUgOEM5Q0VCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsOFwpCisgMTYxMyAyMDM1IDNFOEM5Q0VDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDhcKQorIDE2MTQgMjAzZCAzRThDOUNFRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCw4XCkKKyAxNjE1IDIwNDUgOEM5Q0VFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsOFwpCisgMTYxNiAyMDRjIDhDOUNFRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDhcKQorIDE2MTcgMjA1MyA4QzlDRjA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSw4XCkKKyAxNjE4IDIwNWEgOEM5Q0YxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksOFwpCisgMTYxOSAyMDYxIDhDOUNGMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDhcKQorIDE2MjAgMjA2OCA4QzlDRjM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSw4XCkKKyAxNjIxIDIwNmYgM0U4QzlDRjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksOFwpCisgMTYyMiAyMDc3IDNFOEM5Q0Y1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDhcKQorIDE2MjMgMjA3ZiA4QzlDRjY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSw4XCkKKyAxNjI0IDIwODYgOEM5Q0Y3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksOFwpCisgMTYyNSAyMDhkIDhDOUNGODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDhcKQorIDE2MjYgMjA5NCA4QzlDRkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSw4XCkKKyAxNjI3IDIwOWIgOEM5Q0Y5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksOFwpCisgMTYyOCAyMGEyIDhDOUNGQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDhcKQorIDE2MjkgMjBhOSAzRThDOUNGQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSw4XCkKKyAxNjMwIDIwYjEgM0U4QzlDRkQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksOFwpCisgMTYzMSAyMGI5IDhDOUNGRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDhcKQorIDE2MzIgMjBjMCA4QzlDRkY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSw4XCkKKyAxNjMzIDIwYzcgM0U4QzVDMDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCwxXCkKKyAxNjM0IDIwY2MgM0U4QzVDMEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCwxXCkKKyAxNjM1IDIwZDEgM0U4QzVDMTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCwxXCkKKyAxNjM2IDIwZDYgM0U4QzVDMUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCwxXCkKKyAxNjM3IDIwZGIgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsMVwpCisgMTYzOCAyMGRmIDNFOEM1QzJEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsMVwpCisgMTYzOSAyMGU0IDNFOEM1QzM1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksMVwpCisgMTY0MCAyMGU5IDNFOEM1QzNEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksMVwpCisgMTY0MSAyMGVlIDNFOEM1QzQ1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsMlwpCisgMTY0MiAyMGYzIDNFOEM1QzREIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsMlwpCisgMTY0MyAyMGY4IDNFOEM1QzU1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsMlwpCisgMTY0NCAyMGZkIDNFOEM1QzVEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsMlwpCisgMTY0NSAyMTAyIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDJcKQorLipXYXJuaW5nOi4qCisgMTY0NiAyMTA2IDNFOEM1QzZEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsMlwpCisgMTY0NyAyMTBiIDNFOEM1Qzc1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksMlwpCisgMTY0OCAyMTEwIDNFOEM1QzdEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksMlwpCisgMTY0OSAyMTE1IDNFOEM1Qzg1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsNFwpCisgMTY1MCAyMTFhIDNFOEM1QzhEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsNFwpCisgMTY1MSAyMTFmIDNFOEM1Qzk1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsNFwpCisgMTY1MiAyMTI0IDNFOEM1QzlEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsNFwpCisgMTY1MyAyMTI5IDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDRcKQorLipXYXJuaW5nOi4qCisgMTY1NCAyMTJkIDNFOEM1Q0FEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsNFwpCisgMTY1NSAyMTMyIDNFOEM1Q0I1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksNFwpCisgMTY1NiAyMTM3IDNFOEM1Q0JEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksNFwpCisgMTY1NyAyMTNjIDNFOEM1Q0M1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYXgsOFwpCisgMTY1OCAyMTQxIDNFOEM1Q0NEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlY3gsOFwpCisgMTY1OSAyMTQ2IDNFOEM1Q0Q1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZHgsOFwpCisgMTY2MCAyMTRiIDNFOEM1Q0REIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYngsOFwpCisgMTY2MSAyMTUwIDNFOEM1RDAwICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLDhcKQorLipXYXJuaW5nOi4qCisgMTY2MiAyMTU0IDNFOEM1Q0VEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlYnAsOFwpCisgMTY2MyAyMTU5IDNFOEM1Q0Y1IDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlc2ksOFwpCisgMTY2NCAyMTVlIDNFOEM1Q0ZEIDAwICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJwLCVlZGksOFwpCisgMTY2NSAyMTYzIDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDFcKQorIDE2NjYgMjE2OSA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCwyXCkKKy4qV2FybmluZzouKgorIDE2NjcgMjE2ZiA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCw0XCkKKy4qV2FybmluZzouKgorIDE2NjggMjE3NSA4QzFEMTIwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCw4XCkKKy4qV2FybmluZzouKgorIDE2NjkgWyAJXSoKKyAxNjcwIFsgCV0qICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KKyAxNjcxIDIxN2IgMDAgWyAJXSoJLmJ5dGUJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmM2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMKQEAgLTAsMCArMSwxNjcxIEBACisucHNpemUgMAorLnRleHQKKwltb3YJJWRzLCVzczooJWVheCkKKwltb3YJJWRzLCVzczooJWVjeCkKKwltb3YJJWRzLCVzczooJWVkeCkKKwltb3YJJWRzLCVzczooJWVieCkKKwltb3YJJWRzLCVzczowCisJbW92CSVkcywlc3M6KCVlc2kpCisJbW92CSVkcywlc3M6KCVlZGkpCisJbW92CSVkcywlc3M6MHgxMiglZWF4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCkKKwltb3YJJWRzLCVzczoweDEyKCVlc2kpCisJbW92CSVkcywlc3M6MHgxMiglZWRpKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnApCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSkKKwltb3YJJWRzLCVlYXgKKwltb3YJJWRzLCVlY3gKKwltb3YJJWRzLCVlZHgKKwltb3YJJWRzLCVlYngKKwltb3YJJWRzLCVlc3AKKwltb3YJJWRzLCVlYnAKKwltb3YJJWRzLCVlc2kKKwltb3YJJWRzLCVlZGkKKwltb3YJJWRzLCVzczooJWVheCwlZWF4LDEpCisJbW92CSVkcywlc3M6KCVlY3gsJWVheCwxKQorCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsMSkKKwltb3YJJWRzLCVzczooJWVieCwlZWF4LDEpCisJbW92CSVkcywlc3M6KCVlc3AsJWVheCwxKQorCW1vdgklZHMsJXNzOigsJWVheCwxKQorCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsMSkKKwltb3YJJWRzLCVzczooJWVkaSwlZWF4LDEpCisJbW92CSVkcywlc3M6KCVlYXgsJWVjeCwxKQorCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsMSkKKwltb3YJJWRzLCVzczooJWVkeCwlZWN4LDEpCisJbW92CSVkcywlc3M6KCVlYngsJWVjeCwxKQorCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsMSkKKwltb3YJJWRzLCVzczooLCVlY3gsMSkKKwltb3YJJWRzLCVzczooJWVzaSwlZWN4LDEpCisJbW92CSVkcywlc3M6KCVlZGksJWVjeCwxKQorCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsMSkKKwltb3YJJWRzLCVzczooJWVjeCwlZWR4LDEpCisJbW92CSVkcywlc3M6KCVlZHgsJWVkeCwxKQorCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsMSkKKwltb3YJJWRzLCVzczooJWVzcCwlZWR4LDEpCisJbW92CSVkcywlc3M6KCwlZWR4LDEpCisJbW92CSVkcywlc3M6KCVlc2ksJWVkeCwxKQorCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsMSkKKwltb3YJJWRzLCVzczooJWVheCwlZWJ4LDEpCisJbW92CSVkcywlc3M6KCVlY3gsJWVieCwxKQorCW1vdgklZHMsJXNzOiglZWR4LCVlYngsMSkKKwltb3YJJWRzLCVzczooJWVieCwlZWJ4LDEpCisJbW92CSVkcywlc3M6KCVlc3AsJWVieCwxKQorCW1vdgklZHMsJXNzOigsJWVieCwxKQorCW1vdgklZHMsJXNzOiglZXNpLCVlYngsMSkKKwltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDEpCisJbW92CSVkcywlc3M6KCVlYXgsMSkKKwltb3YJJWRzLCVzczooJWVjeCwxKQorCW1vdgklZHMsJXNzOiglZWR4LDEpCisJbW92CSVkcywlc3M6KCVlYngsMSkKKwltb3YJJWRzLCVzczooJWVzcCwxKQorCW1vdgklZHMsJXNzOigsMSkKKwltb3YJJWRzLCVzczooJWVzaSwxKQorCW1vdgklZHMsJXNzOiglZWRpLDEpCisJbW92CSVkcywlc3M6KCVlYXgsJWVicCwxKQorCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsMSkKKwltb3YJJWRzLCVzczooJWVkeCwlZWJwLDEpCisJbW92CSVkcywlc3M6KCVlYngsJWVicCwxKQorCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsMSkKKwltb3YJJWRzLCVzczooLCVlYnAsMSkKKwltb3YJJWRzLCVzczooJWVzaSwlZWJwLDEpCisJbW92CSVkcywlc3M6KCVlZGksJWVicCwxKQorCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksMSkKKwltb3YJJWRzLCVzczooJWVjeCwlZXNpLDEpCisJbW92CSVkcywlc3M6KCVlZHgsJWVzaSwxKQorCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksMSkKKwltb3YJJWRzLCVzczooJWVzcCwlZXNpLDEpCisJbW92CSVkcywlc3M6KCwlZXNpLDEpCisJbW92CSVkcywlc3M6KCVlc2ksJWVzaSwxKQorCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksMSkKKwltb3YJJWRzLCVzczooJWVheCwlZWRpLDEpCisJbW92CSVkcywlc3M6KCVlY3gsJWVkaSwxKQorCW1vdgklZHMsJXNzOiglZWR4LCVlZGksMSkKKwltb3YJJWRzLCVzczooJWVieCwlZWRpLDEpCisJbW92CSVkcywlc3M6KCVlc3AsJWVkaSwxKQorCW1vdgklZHMsJXNzOigsJWVkaSwxKQorCW1vdgklZHMsJXNzOiglZXNpLCVlZGksMSkKKwltb3YJJWRzLCVzczooJWVkaSwlZWRpLDEpCisJbW92CSVkcywlc3M6KCVlYXgsJWVheCwyKQorCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsMikKKwltb3YJJWRzLCVzczooJWVkeCwlZWF4LDIpCisJbW92CSVkcywlc3M6KCVlYngsJWVheCwyKQorCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsMikKKwltb3YJJWRzLCVzczooLCVlYXgsMikKKwltb3YJJWRzLCVzczooJWVzaSwlZWF4LDIpCisJbW92CSVkcywlc3M6KCVlZGksJWVheCwyKQorCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsMikKKwltb3YJJWRzLCVzczooJWVjeCwlZWN4LDIpCisJbW92CSVkcywlc3M6KCVlZHgsJWVjeCwyKQorCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsMikKKwltb3YJJWRzLCVzczooJWVzcCwlZWN4LDIpCisJbW92CSVkcywlc3M6KCwlZWN4LDIpCisJbW92CSVkcywlc3M6KCVlc2ksJWVjeCwyKQorCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsMikKKwltb3YJJWRzLCVzczooJWVheCwlZWR4LDIpCisJbW92CSVkcywlc3M6KCVlY3gsJWVkeCwyKQorCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsMikKKwltb3YJJWRzLCVzczooJWVieCwlZWR4LDIpCisJbW92CSVkcywlc3M6KCVlc3AsJWVkeCwyKQorCW1vdgklZHMsJXNzOigsJWVkeCwyKQorCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsMikKKwltb3YJJWRzLCVzczooJWVkaSwlZWR4LDIpCisJbW92CSVkcywlc3M6KCVlYXgsJWVieCwyKQorCW1vdgklZHMsJXNzOiglZWN4LCVlYngsMikKKwltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDIpCisJbW92CSVkcywlc3M6KCVlYngsJWVieCwyKQorCW1vdgklZHMsJXNzOiglZXNwLCVlYngsMikKKwltb3YJJWRzLCVzczooLCVlYngsMikKKwltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDIpCisJbW92CSVkcywlc3M6KCVlZGksJWVieCwyKQorCW1vdgklZHMsJXNzOiglZWF4LDIpCisJbW92CSVkcywlc3M6KCVlY3gsMikKKwltb3YJJWRzLCVzczooJWVkeCwyKQorCW1vdgklZHMsJXNzOiglZWJ4LDIpCisJbW92CSVkcywlc3M6KCVlc3AsMikKKwltb3YJJWRzLCVzczooLDIpCisJbW92CSVkcywlc3M6KCVlc2ksMikKKwltb3YJJWRzLCVzczooJWVkaSwyKQorCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsMikKKwltb3YJJWRzLCVzczooJWVjeCwlZWJwLDIpCisJbW92CSVkcywlc3M6KCVlZHgsJWVicCwyKQorCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsMikKKwltb3YJJWRzLCVzczooJWVzcCwlZWJwLDIpCisJbW92CSVkcywlc3M6KCwlZWJwLDIpCisJbW92CSVkcywlc3M6KCVlc2ksJWVicCwyKQorCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsMikKKwltb3YJJWRzLCVzczooJWVheCwlZXNpLDIpCisJbW92CSVkcywlc3M6KCVlY3gsJWVzaSwyKQorCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksMikKKwltb3YJJWRzLCVzczooJWVieCwlZXNpLDIpCisJbW92CSVkcywlc3M6KCVlc3AsJWVzaSwyKQorCW1vdgklZHMsJXNzOigsJWVzaSwyKQorCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksMikKKwltb3YJJWRzLCVzczooJWVkaSwlZXNpLDIpCisJbW92CSVkcywlc3M6KCVlYXgsJWVkaSwyKQorCW1vdgklZHMsJXNzOiglZWN4LCVlZGksMikKKwltb3YJJWRzLCVzczooJWVkeCwlZWRpLDIpCisJbW92CSVkcywlc3M6KCVlYngsJWVkaSwyKQorCW1vdgklZHMsJXNzOiglZXNwLCVlZGksMikKKwltb3YJJWRzLCVzczooLCVlZGksMikKKwltb3YJJWRzLCVzczooJWVzaSwlZWRpLDIpCisJbW92CSVkcywlc3M6KCVlZGksJWVkaSwyKQorCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsNCkKKwltb3YJJWRzLCVzczooJWVjeCwlZWF4LDQpCisJbW92CSVkcywlc3M6KCVlZHgsJWVheCw0KQorCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsNCkKKwltb3YJJWRzLCVzczooJWVzcCwlZWF4LDQpCisJbW92CSVkcywlc3M6KCwlZWF4LDQpCisJbW92CSVkcywlc3M6KCVlc2ksJWVheCw0KQorCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsNCkKKwltb3YJJWRzLCVzczooJWVheCwlZWN4LDQpCisJbW92CSVkcywlc3M6KCVlY3gsJWVjeCw0KQorCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsNCkKKwltb3YJJWRzLCVzczooJWVieCwlZWN4LDQpCisJbW92CSVkcywlc3M6KCVlc3AsJWVjeCw0KQorCW1vdgklZHMsJXNzOigsJWVjeCw0KQorCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsNCkKKwltb3YJJWRzLCVzczooJWVkaSwlZWN4LDQpCisJbW92CSVkcywlc3M6KCVlYXgsJWVkeCw0KQorCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsNCkKKwltb3YJJWRzLCVzczooJWVkeCwlZWR4LDQpCisJbW92CSVkcywlc3M6KCVlYngsJWVkeCw0KQorCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsNCkKKwltb3YJJWRzLCVzczooLCVlZHgsNCkKKwltb3YJJWRzLCVzczooJWVzaSwlZWR4LDQpCisJbW92CSVkcywlc3M6KCVlZGksJWVkeCw0KQorCW1vdgklZHMsJXNzOiglZWF4LCVlYngsNCkKKwltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDQpCisJbW92CSVkcywlc3M6KCVlZHgsJWVieCw0KQorCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsNCkKKwltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDQpCisJbW92CSVkcywlc3M6KCwlZWJ4LDQpCisJbW92CSVkcywlc3M6KCVlc2ksJWVieCw0KQorCW1vdgklZHMsJXNzOiglZWRpLCVlYngsNCkKKwltb3YJJWRzLCVzczooJWVheCw0KQorCW1vdgklZHMsJXNzOiglZWN4LDQpCisJbW92CSVkcywlc3M6KCVlZHgsNCkKKwltb3YJJWRzLCVzczooJWVieCw0KQorCW1vdgklZHMsJXNzOiglZXNwLDQpCisJbW92CSVkcywlc3M6KCw0KQorCW1vdgklZHMsJXNzOiglZXNpLDQpCisJbW92CSVkcywlc3M6KCVlZGksNCkKKwltb3YJJWRzLCVzczooJWVheCwlZWJwLDQpCisJbW92CSVkcywlc3M6KCVlY3gsJWVicCw0KQorCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsNCkKKwltb3YJJWRzLCVzczooJWVieCwlZWJwLDQpCisJbW92CSVkcywlc3M6KCVlc3AsJWVicCw0KQorCW1vdgklZHMsJXNzOigsJWVicCw0KQorCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsNCkKKwltb3YJJWRzLCVzczooJWVkaSwlZWJwLDQpCisJbW92CSVkcywlc3M6KCVlYXgsJWVzaSw0KQorCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksNCkKKwltb3YJJWRzLCVzczooJWVkeCwlZXNpLDQpCisJbW92CSVkcywlc3M6KCVlYngsJWVzaSw0KQorCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksNCkKKwltb3YJJWRzLCVzczooLCVlc2ksNCkKKwltb3YJJWRzLCVzczooJWVzaSwlZXNpLDQpCisJbW92CSVkcywlc3M6KCVlZGksJWVzaSw0KQorCW1vdgklZHMsJXNzOiglZWF4LCVlZGksNCkKKwltb3YJJWRzLCVzczooJWVjeCwlZWRpLDQpCisJbW92CSVkcywlc3M6KCVlZHgsJWVkaSw0KQorCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksNCkKKwltb3YJJWRzLCVzczooJWVzcCwlZWRpLDQpCisJbW92CSVkcywlc3M6KCwlZWRpLDQpCisJbW92CSVkcywlc3M6KCVlc2ksJWVkaSw0KQorCW1vdgklZHMsJXNzOiglZWRpLCVlZGksNCkKKwltb3YJJWRzLCVzczooJWVheCwlZWF4LDgpCisJbW92CSVkcywlc3M6KCVlY3gsJWVheCw4KQorCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsOCkKKwltb3YJJWRzLCVzczooJWVieCwlZWF4LDgpCisJbW92CSVkcywlc3M6KCVlc3AsJWVheCw4KQorCW1vdgklZHMsJXNzOigsJWVheCw4KQorCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsOCkKKwltb3YJJWRzLCVzczooJWVkaSwlZWF4LDgpCisJbW92CSVkcywlc3M6KCVlYXgsJWVjeCw4KQorCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsOCkKKwltb3YJJWRzLCVzczooJWVkeCwlZWN4LDgpCisJbW92CSVkcywlc3M6KCVlYngsJWVjeCw4KQorCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsOCkKKwltb3YJJWRzLCVzczooLCVlY3gsOCkKKwltb3YJJWRzLCVzczooJWVzaSwlZWN4LDgpCisJbW92CSVkcywlc3M6KCVlZGksJWVjeCw4KQorCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsOCkKKwltb3YJJWRzLCVzczooJWVjeCwlZWR4LDgpCisJbW92CSVkcywlc3M6KCVlZHgsJWVkeCw4KQorCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsOCkKKwltb3YJJWRzLCVzczooJWVzcCwlZWR4LDgpCisJbW92CSVkcywlc3M6KCwlZWR4LDgpCisJbW92CSVkcywlc3M6KCVlc2ksJWVkeCw4KQorCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsOCkKKwltb3YJJWRzLCVzczooJWVheCwlZWJ4LDgpCisJbW92CSVkcywlc3M6KCVlY3gsJWVieCw4KQorCW1vdgklZHMsJXNzOiglZWR4LCVlYngsOCkKKwltb3YJJWRzLCVzczooJWVieCwlZWJ4LDgpCisJbW92CSVkcywlc3M6KCVlc3AsJWVieCw4KQorCW1vdgklZHMsJXNzOigsJWVieCw4KQorCW1vdgklZHMsJXNzOiglZXNpLCVlYngsOCkKKwltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDgpCisJbW92CSVkcywlc3M6KCVlYXgsOCkKKwltb3YJJWRzLCVzczooJWVjeCw4KQorCW1vdgklZHMsJXNzOiglZWR4LDgpCisJbW92CSVkcywlc3M6KCVlYngsOCkKKwltb3YJJWRzLCVzczooJWVzcCw4KQorCW1vdgklZHMsJXNzOigsOCkKKwltb3YJJWRzLCVzczooJWVzaSw4KQorCW1vdgklZHMsJXNzOiglZWRpLDgpCisJbW92CSVkcywlc3M6KCVlYXgsJWVicCw4KQorCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsOCkKKwltb3YJJWRzLCVzczooJWVkeCwlZWJwLDgpCisJbW92CSVkcywlc3M6KCVlYngsJWVicCw4KQorCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsOCkKKwltb3YJJWRzLCVzczooLCVlYnAsOCkKKwltb3YJJWRzLCVzczooJWVzaSwlZWJwLDgpCisJbW92CSVkcywlc3M6KCVlZGksJWVicCw4KQorCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksOCkKKwltb3YJJWRzLCVzczooJWVjeCwlZXNpLDgpCisJbW92CSVkcywlc3M6KCVlZHgsJWVzaSw4KQorCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksOCkKKwltb3YJJWRzLCVzczooJWVzcCwlZXNpLDgpCisJbW92CSVkcywlc3M6KCwlZXNpLDgpCisJbW92CSVkcywlc3M6KCVlc2ksJWVzaSw4KQorCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksOCkKKwltb3YJJWRzLCVzczooJWVheCwlZWRpLDgpCisJbW92CSVkcywlc3M6KCVlZHgsJWVkaSw4KQorCW1vdgklZHMsJXNzOiglZWN4LCVlZGksOCkKKwltb3YJJWRzLCVzczooJWVieCwlZWRpLDgpCisJbW92CSVkcywlc3M6KCVlc3AsJWVkaSw4KQorCW1vdgklZHMsJXNzOigsJWVkaSw4KQorCW1vdgklZHMsJXNzOiglZXNpLCVlZGksOCkKKwltb3YJJWRzLCVzczooJWVkaSwlZWRpLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDEpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDEpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDEpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDEpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsMSkKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDEpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksMSkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDEpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksMSkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDEpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDEpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDEpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSwxKQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsMikKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsMikKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsMikKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYngsMikKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsMikKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyKCVlZGksMikKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDIpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsMikKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDIpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsMikKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDIpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDIpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDIpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksMikKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksMikKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSwyKQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksMikKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LDQpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLDQpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDQpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsNCkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksNCkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksNCkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksNCkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDQpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDgpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDgpCisJbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsOCkKKwltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksOCkKKwltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksOCkKKwltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDgpCisJbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSw4KQorCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDgpCisJbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwxKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDEpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksMSkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksMikKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwyKQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDIpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDQpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksNCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSw0KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw4KQorCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDgpCisJbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksOCkKKwltb3YJJWRzLCVzczooJWVicCwlZWF4LDEpCisJbW92CSVkcywlc3M6KCVlYnAsJWVjeCwxKQorCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMSkKKwltb3YJJWRzLCVzczooJWVicCwlZWJ4LDEpCisJbW92CSVkcywlc3M6KCVlYnAsMSkKKwltb3YJJWRzLCVzczooJWVicCwlZWJwLDEpCisJbW92CSVkcywlc3M6KCVlYnAsJWVzaSwxKQorCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMSkKKwltb3YJJWRzLCVzczooJWVicCwlZWF4LDIpCisJbW92CSVkcywlc3M6KCVlYnAsJWVjeCwyKQorCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMikKKwltb3YJJWRzLCVzczooJWVicCwlZWJ4LDIpCisJbW92CSVkcywlc3M6KCVlYnAsMikKKwltb3YJJWRzLCVzczooJWVicCwlZWJwLDIpCisJbW92CSVkcywlc3M6KCVlYnAsJWVzaSwyKQorCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMikKKwltb3YJJWRzLCVzczooJWVicCwlZWF4LDQpCisJbW92CSVkcywlc3M6KCVlYnAsJWVjeCw0KQorCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsNCkKKwltb3YJJWRzLCVzczooJWVicCwlZWJ4LDQpCisJbW92CSVkcywlc3M6KCVlYnAsNCkKKwltb3YJJWRzLCVzczooJWVicCwlZWJwLDQpCisJbW92CSVkcywlc3M6KCVlYnAsJWVzaSw0KQorCW1vdgklZHMsJXNzOiglZWJwLCVlZGksNCkKKwltb3YJJWRzLCVzczooJWVicCwlZWF4LDgpCisJbW92CSVkcywlc3M6KCVlYnAsJWVjeCw4KQorCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsOCkKKwltb3YJJWRzLCVzczooJWVicCwlZWJ4LDgpCisJbW92CSVkcywlc3M6KCVlYnAsOCkKKwltb3YJJWRzLCVzczooJWVicCwlZWJwLDgpCisJbW92CSVkcywlc3M6KCVlYnAsJWVzaSw4KQorCW1vdgklZHMsJXNzOiglZWJwLCVlZGksOCkKKwltb3YJJWRzLCVzczoweDEyKCwxKQorCW1vdgklZHMsJXNzOjB4MTIoLDIpCisJbW92CSVkcywlc3M6MHgxMigsNCkKKwltb3YJJWRzLCVzczoweDEyKCw4KQorCW1vdgklZHMsJWRzOiglZWF4KQorCW1vdgklZHMsJWRzOiglZWN4KQorCW1vdgklZHMsJWRzOiglZWR4KQorCW1vdgklZHMsJWRzOiglZWJ4KQorCW1vdgklZHMsJWRzOjAKKwltb3YJJWRzLCVkczooJWVzaSkKKwltb3YJJWRzLCVkczooJWVkaSkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgpCisJbW92CSVkcywlZHM6MHgxMiglZWN4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngpCisJbW92CSVkcywlZHM6MHgxMiglZWJwKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSkKKwltb3YJJWRzLCVkczoweDEyKCVlZGkpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2kpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpKQorCW1vdgklZHMsJWVheAorCW1vdgklZHMsJWVjeAorCW1vdgklZHMsJWVkeAorCW1vdgklZHMsJWVieAorCW1vdgklZHMsJWVzcAorCW1vdgklZHMsJWVicAorCW1vdgklZHMsJWVzaQorCW1vdgklZHMsJWVkaQorCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsMSkKKwltb3YJJWRzLCVkczooJWVjeCwlZWF4LDEpCisJbW92CSVkcywlZHM6KCVlZHgsJWVheCwxKQorCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsMSkKKwltb3YJJWRzLCVkczooJWVzcCwlZWF4LDEpCisJbW92CSVkcywlZHM6KCwlZWF4LDEpCisJbW92CSVkcywlZHM6KCVlc2ksJWVheCwxKQorCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsMSkKKwltb3YJJWRzLCVkczooJWVheCwlZWN4LDEpCisJbW92CSVkcywlZHM6KCVlY3gsJWVjeCwxKQorCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsMSkKKwltb3YJJWRzLCVkczooJWVieCwlZWN4LDEpCisJbW92CSVkcywlZHM6KCVlc3AsJWVjeCwxKQorCW1vdgklZHMsJWRzOigsJWVjeCwxKQorCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsMSkKKwltb3YJJWRzLCVkczooJWVkaSwlZWN4LDEpCisJbW92CSVkcywlZHM6KCVlYXgsJWVkeCwxKQorCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsMSkKKwltb3YJJWRzLCVkczooJWVkeCwlZWR4LDEpCisJbW92CSVkcywlZHM6KCVlYngsJWVkeCwxKQorCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsMSkKKwltb3YJJWRzLCVkczooLCVlZHgsMSkKKwltb3YJJWRzLCVkczooJWVzaSwlZWR4LDEpCisJbW92CSVkcywlZHM6KCVlZGksJWVkeCwxKQorCW1vdgklZHMsJWRzOiglZWF4LCVlYngsMSkKKwltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDEpCisJbW92CSVkcywlZHM6KCVlZHgsJWVieCwxKQorCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsMSkKKwltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDEpCisJbW92CSVkcywlZHM6KCwlZWJ4LDEpCisJbW92CSVkcywlZHM6KCVlc2ksJWVieCwxKQorCW1vdgklZHMsJWRzOiglZWRpLCVlYngsMSkKKwltb3YJJWRzLCVkczooJWVheCwxKQorCW1vdgklZHMsJWRzOiglZWN4LDEpCisJbW92CSVkcywlZHM6KCVlZHgsMSkKKwltb3YJJWRzLCVkczooJWVieCwxKQorCW1vdgklZHMsJWRzOiglZXNwLDEpCisJbW92CSVkcywlZHM6KCwxKQorCW1vdgklZHMsJWRzOiglZXNpLDEpCisJbW92CSVkcywlZHM6KCVlZGksMSkKKwltb3YJJWRzLCVkczooJWVheCwlZWJwLDEpCisJbW92CSVkcywlZHM6KCVlY3gsJWVicCwxKQorCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsMSkKKwltb3YJJWRzLCVkczooJWVieCwlZWJwLDEpCisJbW92CSVkcywlZHM6KCVlc3AsJWVicCwxKQorCW1vdgklZHMsJWRzOigsJWVicCwxKQorCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsMSkKKwltb3YJJWRzLCVkczooJWVkaSwlZWJwLDEpCisJbW92CSVkcywlZHM6KCVlYXgsJWVzaSwxKQorCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksMSkKKwltb3YJJWRzLCVkczooJWVkeCwlZXNpLDEpCisJbW92CSVkcywlZHM6KCVlYngsJWVzaSwxKQorCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksMSkKKwltb3YJJWRzLCVkczooLCVlc2ksMSkKKwltb3YJJWRzLCVkczooJWVzaSwlZXNpLDEpCisJbW92CSVkcywlZHM6KCVlZGksJWVzaSwxKQorCW1vdgklZHMsJWRzOiglZWF4LCVlZGksMSkKKwltb3YJJWRzLCVkczooJWVjeCwlZWRpLDEpCisJbW92CSVkcywlZHM6KCVlZHgsJWVkaSwxKQorCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksMSkKKwltb3YJJWRzLCVkczooJWVzcCwlZWRpLDEpCisJbW92CSVkcywlZHM6KCwlZWRpLDEpCisJbW92CSVkcywlZHM6KCVlc2ksJWVkaSwxKQorCW1vdgklZHMsJWRzOiglZWRpLCVlZGksMSkKKwltb3YJJWRzLCVkczooJWVheCwlZWF4LDIpCisJbW92CSVkcywlZHM6KCVlY3gsJWVheCwyKQorCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsMikKKwltb3YJJWRzLCVkczooJWVieCwlZWF4LDIpCisJbW92CSVkcywlZHM6KCVlc3AsJWVheCwyKQorCW1vdgklZHMsJWRzOigsJWVheCwyKQorCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsMikKKwltb3YJJWRzLCVkczooJWVkaSwlZWF4LDIpCisJbW92CSVkcywlZHM6KCVlYXgsJWVjeCwyKQorCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsMikKKwltb3YJJWRzLCVkczooJWVkeCwlZWN4LDIpCisJbW92CSVkcywlZHM6KCVlYngsJWVjeCwyKQorCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsMikKKwltb3YJJWRzLCVkczooLCVlY3gsMikKKwltb3YJJWRzLCVkczooJWVzaSwlZWN4LDIpCisJbW92CSVkcywlZHM6KCVlZGksJWVjeCwyKQorCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsMikKKwltb3YJJWRzLCVkczooJWVjeCwlZWR4LDIpCisJbW92CSVkcywlZHM6KCVlZHgsJWVkeCwyKQorCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsMikKKwltb3YJJWRzLCVkczooJWVzcCwlZWR4LDIpCisJbW92CSVkcywlZHM6KCwlZWR4LDIpCisJbW92CSVkcywlZHM6KCVlc2ksJWVkeCwyKQorCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsMikKKwltb3YJJWRzLCVkczooJWVheCwlZWJ4LDIpCisJbW92CSVkcywlZHM6KCVlY3gsJWVieCwyKQorCW1vdgklZHMsJWRzOiglZWR4LCVlYngsMikKKwltb3YJJWRzLCVkczooJWVieCwlZWJ4LDIpCisJbW92CSVkcywlZHM6KCVlc3AsJWVieCwyKQorCW1vdgklZHMsJWRzOigsJWVieCwyKQorCW1vdgklZHMsJWRzOiglZXNpLCVlYngsMikKKwltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDIpCisJbW92CSVkcywlZHM6KCVlYXgsMikKKwltb3YJJWRzLCVkczooJWVjeCwyKQorCW1vdgklZHMsJWRzOiglZWR4LDIpCisJbW92CSVkcywlZHM6KCVlYngsMikKKwltb3YJJWRzLCVkczooJWVzcCwyKQorCW1vdgklZHMsJWRzOigsMikKKwltb3YJJWRzLCVkczooJWVzaSwyKQorCW1vdgklZHMsJWRzOiglZWRpLDIpCisJbW92CSVkcywlZHM6KCVlYXgsJWVicCwyKQorCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsMikKKwltb3YJJWRzLCVkczooJWVkeCwlZWJwLDIpCisJbW92CSVkcywlZHM6KCVlYngsJWVicCwyKQorCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsMikKKwltb3YJJWRzLCVkczooLCVlYnAsMikKKwltb3YJJWRzLCVkczooJWVzaSwlZWJwLDIpCisJbW92CSVkcywlZHM6KCVlZGksJWVicCwyKQorCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksMikKKwltb3YJJWRzLCVkczooJWVjeCwlZXNpLDIpCisJbW92CSVkcywlZHM6KCVlZHgsJWVzaSwyKQorCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksMikKKwltb3YJJWRzLCVkczooJWVzcCwlZXNpLDIpCisJbW92CSVkcywlZHM6KCwlZXNpLDIpCisJbW92CSVkcywlZHM6KCVlc2ksJWVzaSwyKQorCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksMikKKwltb3YJJWRzLCVkczooJWVheCwlZWRpLDIpCisJbW92CSVkcywlZHM6KCVlY3gsJWVkaSwyKQorCW1vdgklZHMsJWRzOiglZWR4LCVlZGksMikKKwltb3YJJWRzLCVkczooJWVieCwlZWRpLDIpCisJbW92CSVkcywlZHM6KCVlc3AsJWVkaSwyKQorCW1vdgklZHMsJWRzOigsJWVkaSwyKQorCW1vdgklZHMsJWRzOiglZXNpLCVlZGksMikKKwltb3YJJWRzLCVkczooJWVkaSwlZWRpLDIpCisJbW92CSVkcywlZHM6KCVlYXgsJWVheCw0KQorCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsNCkKKwltb3YJJWRzLCVkczooJWVkeCwlZWF4LDQpCisJbW92CSVkcywlZHM6KCVlYngsJWVheCw0KQorCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsNCkKKwltb3YJJWRzLCVkczooLCVlYXgsNCkKKwltb3YJJWRzLCVkczooJWVzaSwlZWF4LDQpCisJbW92CSVkcywlZHM6KCVlZGksJWVheCw0KQorCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsNCkKKwltb3YJJWRzLCVkczooJWVjeCwlZWN4LDQpCisJbW92CSVkcywlZHM6KCVlZHgsJWVjeCw0KQorCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsNCkKKwltb3YJJWRzLCVkczooJWVzcCwlZWN4LDQpCisJbW92CSVkcywlZHM6KCwlZWN4LDQpCisJbW92CSVkcywlZHM6KCVlc2ksJWVjeCw0KQorCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsNCkKKwltb3YJJWRzLCVkczooJWVheCwlZWR4LDQpCisJbW92CSVkcywlZHM6KCVlY3gsJWVkeCw0KQorCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsNCkKKwltb3YJJWRzLCVkczooJWVieCwlZWR4LDQpCisJbW92CSVkcywlZHM6KCVlc3AsJWVkeCw0KQorCW1vdgklZHMsJWRzOigsJWVkeCw0KQorCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsNCkKKwltb3YJJWRzLCVkczooJWVkaSwlZWR4LDQpCisJbW92CSVkcywlZHM6KCVlYXgsJWVieCw0KQorCW1vdgklZHMsJWRzOiglZWN4LCVlYngsNCkKKwltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDQpCisJbW92CSVkcywlZHM6KCVlYngsJWVieCw0KQorCW1vdgklZHMsJWRzOiglZXNwLCVlYngsNCkKKwltb3YJJWRzLCVkczooLCVlYngsNCkKKwltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDQpCisJbW92CSVkcywlZHM6KCVlZGksJWVieCw0KQorCW1vdgklZHMsJWRzOiglZWF4LDQpCisJbW92CSVkcywlZHM6KCVlY3gsNCkKKwltb3YJJWRzLCVkczooJWVkeCw0KQorCW1vdgklZHMsJWRzOiglZWJ4LDQpCisJbW92CSVkcywlZHM6KCVlc3AsNCkKKwltb3YJJWRzLCVkczooLDQpCisJbW92CSVkcywlZHM6KCVlc2ksNCkKKwltb3YJJWRzLCVkczooJWVkaSw0KQorCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsNCkKKwltb3YJJWRzLCVkczooJWVjeCwlZWJwLDQpCisJbW92CSVkcywlZHM6KCVlZHgsJWVicCw0KQorCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsNCkKKwltb3YJJWRzLCVkczooJWVzcCwlZWJwLDQpCisJbW92CSVkcywlZHM6KCwlZWJwLDQpCisJbW92CSVkcywlZHM6KCVlc2ksJWVicCw0KQorCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsNCkKKwltb3YJJWRzLCVkczooJWVheCwlZXNpLDQpCisJbW92CSVkcywlZHM6KCVlY3gsJWVzaSw0KQorCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksNCkKKwltb3YJJWRzLCVkczooJWVieCwlZXNpLDQpCisJbW92CSVkcywlZHM6KCVlc3AsJWVzaSw0KQorCW1vdgklZHMsJWRzOigsJWVzaSw0KQorCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksNCkKKwltb3YJJWRzLCVkczooJWVkaSwlZXNpLDQpCisJbW92CSVkcywlZHM6KCVlYXgsJWVkaSw0KQorCW1vdgklZHMsJWRzOiglZWN4LCVlZGksNCkKKwltb3YJJWRzLCVkczooJWVkeCwlZWRpLDQpCisJbW92CSVkcywlZHM6KCVlYngsJWVkaSw0KQorCW1vdgklZHMsJWRzOiglZXNwLCVlZGksNCkKKwltb3YJJWRzLCVkczooLCVlZGksNCkKKwltb3YJJWRzLCVkczooJWVzaSwlZWRpLDQpCisJbW92CSVkcywlZHM6KCVlZGksJWVkaSw0KQorCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsOCkKKwltb3YJJWRzLCVkczooJWVjeCwlZWF4LDgpCisJbW92CSVkcywlZHM6KCVlZHgsJWVheCw4KQorCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsOCkKKwltb3YJJWRzLCVkczooJWVzcCwlZWF4LDgpCisJbW92CSVkcywlZHM6KCwlZWF4LDgpCisJbW92CSVkcywlZHM6KCVlc2ksJWVheCw4KQorCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsOCkKKwltb3YJJWRzLCVkczooJWVheCwlZWN4LDgpCisJbW92CSVkcywlZHM6KCVlY3gsJWVjeCw4KQorCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsOCkKKwltb3YJJWRzLCVkczooJWVieCwlZWN4LDgpCisJbW92CSVkcywlZHM6KCVlc3AsJWVjeCw4KQorCW1vdgklZHMsJWRzOigsJWVjeCw4KQorCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsOCkKKwltb3YJJWRzLCVkczooJWVkaSwlZWN4LDgpCisJbW92CSVkcywlZHM6KCVlYXgsJWVkeCw4KQorCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsOCkKKwltb3YJJWRzLCVkczooJWVkeCwlZWR4LDgpCisJbW92CSVkcywlZHM6KCVlYngsJWVkeCw4KQorCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsOCkKKwltb3YJJWRzLCVkczooLCVlZHgsOCkKKwltb3YJJWRzLCVkczooJWVzaSwlZWR4LDgpCisJbW92CSVkcywlZHM6KCVlZGksJWVkeCw4KQorCW1vdgklZHMsJWRzOiglZWF4LCVlYngsOCkKKwltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDgpCisJbW92CSVkcywlZHM6KCVlZHgsJWVieCw4KQorCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsOCkKKwltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDgpCisJbW92CSVkcywlZHM6KCwlZWJ4LDgpCisJbW92CSVkcywlZHM6KCVlc2ksJWVieCw4KQorCW1vdgklZHMsJWRzOiglZWRpLCVlYngsOCkKKwltb3YJJWRzLCVkczooJWVheCw4KQorCW1vdgklZHMsJWRzOiglZWN4LDgpCisJbW92CSVkcywlZHM6KCVlZHgsOCkKKwltb3YJJWRzLCVkczooJWVieCw4KQorCW1vdgklZHMsJWRzOiglZXNwLDgpCisJbW92CSVkcywlZHM6KCw4KQorCW1vdgklZHMsJWRzOiglZXNpLDgpCisJbW92CSVkcywlZHM6KCVlZGksOCkKKwltb3YJJWRzLCVkczooJWVheCwlZWJwLDgpCisJbW92CSVkcywlZHM6KCVlY3gsJWVicCw4KQorCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsOCkKKwltb3YJJWRzLCVkczooJWVieCwlZWJwLDgpCisJbW92CSVkcywlZHM6KCVlc3AsJWVicCw4KQorCW1vdgklZHMsJWRzOigsJWVicCw4KQorCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsOCkKKwltb3YJJWRzLCVkczooJWVkaSwlZWJwLDgpCisJbW92CSVkcywlZHM6KCVlYXgsJWVzaSw4KQorCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksOCkKKwltb3YJJWRzLCVkczooJWVkeCwlZXNpLDgpCisJbW92CSVkcywlZHM6KCVlYngsJWVzaSw4KQorCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksOCkKKwltb3YJJWRzLCVkczooLCVlc2ksOCkKKwltb3YJJWRzLCVkczooJWVzaSwlZXNpLDgpCisJbW92CSVkcywlZHM6KCVlZGksJWVzaSw4KQorCW1vdgklZHMsJWRzOiglZWF4LCVlZGksOCkKKwltb3YJJWRzLCVkczooJWVkeCwlZWRpLDgpCisJbW92CSVkcywlZHM6KCVlY3gsJWVkaSw4KQorCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksOCkKKwltb3YJJWRzLCVkczooJWVzcCwlZWRpLDgpCisJbW92CSVkcywlZHM6KCwlZWRpLDgpCisJbW92CSVkcywlZHM6KCVlc2ksJWVkaSw4KQorCW1vdgklZHMsJWRzOiglZWRpLCVlZGksOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LDEpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLDEpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDEpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsMSkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksMSkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksMSkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksMSkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDEpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsMikKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsMikKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsMikKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsMikKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsMikKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDIpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDIpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsMikKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDIpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsMikKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDIpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsMikKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDIpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksMikKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDIpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksMikKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDIpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDIpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDIpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSwyKQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDQpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDQpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsNCkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDQpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDQpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDQpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSw0KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksNCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LDgpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLDgpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDgpCisJbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsOCkKKwltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksOCkKKwltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksOCkKKwltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDgpCisJbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksOCkKKwltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDEpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksMSkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSwxKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwyKQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDIpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksMikKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksNCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw0KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDQpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDgpCisJbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksOCkKKwltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSw4KQorCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMSkKKwltb3YJJWRzLCVkczooJWVicCwlZWN4LDEpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkeCwxKQorCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMSkKKwltb3YJJWRzLCVkczooJWVicCwxKQorCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMSkKKwltb3YJJWRzLCVkczooJWVicCwlZXNpLDEpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkaSwxKQorCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMikKKwltb3YJJWRzLCVkczooJWVicCwlZWN4LDIpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkeCwyKQorCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMikKKwltb3YJJWRzLCVkczooJWVicCwyKQorCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMikKKwltb3YJJWRzLCVkczooJWVicCwlZXNpLDIpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkaSwyKQorCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsNCkKKwltb3YJJWRzLCVkczooJWVicCwlZWN4LDQpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkeCw0KQorCW1vdgklZHMsJWRzOiglZWJwLCVlYngsNCkKKwltb3YJJWRzLCVkczooJWVicCw0KQorCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsNCkKKwltb3YJJWRzLCVkczooJWVicCwlZXNpLDQpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkaSw0KQorCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsOCkKKwltb3YJJWRzLCVkczooJWVicCwlZWN4LDgpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkeCw4KQorCW1vdgklZHMsJWRzOiglZWJwLCVlYngsOCkKKwltb3YJJWRzLCVkczooJWVicCw4KQorCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsOCkKKwltb3YJJWRzLCVkczooJWVicCwlZXNpLDgpCisJbW92CSVkcywlZHM6KCVlYnAsJWVkaSw4KQorCW1vdgklZHMsJWRzOjB4MTIoLDEpCisJbW92CSVkcywlZHM6MHgxMigsMikKKwltb3YJJWRzLCVkczoweDEyKCw0KQorCW1vdgklZHMsJWRzOjB4MTIoLDgpCisKKwkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCisJLmJ5dGUJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzYzE1OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLmQKQEAgLTAsMCArMSw1NzQgQEAKKyNhczogLUoKKyNvYmpkdW1wOiAtZHcKKyNuYW1lOiBpMzg2IG9wY29kZQorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArMDAwIDxmb28+OgorICAgMDoJMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQorICAgNjoJMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyAgIGM6CTAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKKyAgMTI6CTAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgIDE4OgkwNCA5MCBbIAldKmFkZCAgICBcJDB4OTAsJWFsCisgIDFhOgkwNSA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MDkwOTAsJWVheAorICAxZjoJMDYgWyAJXSpwdXNoICAgJWVzCisgIDIwOgkwNyBbIAldKnBvcCAgICAlZXMKKyAgMjE6CTA4IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKKyAgMjc6CTA5IDkwIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgIDJkOgkwYSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCisgIDMzOgkwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorICAzOToJMGMgOTAgWyAJXSpvciAgICAgXCQweDkwLCVhbAorICAzYjoJMGQgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgXCQweDkwOTA5MDkwLCVlYXgKKyAgNDA6CTBlIFsgCV0qcHVzaCAgICVjcworICA0MToJMTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQorICA0NzoJMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyAgNGQ6CTEyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKKyAgNTM6CTEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgIDU5OgkxNCA5MCBbIAldKmFkYyAgICBcJDB4OTAsJWFsCisgIDViOgkxNSA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICBcJDB4OTA5MDkwOTAsJWVheAorICA2MDoJMTYgWyAJXSpwdXNoICAgJXNzCisgIDYxOgkxNyBbIAldKnBvcCAgICAlc3MKKyAgNjI6CTE4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKKyAgNjg6CTE5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgIDZlOgkxYSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCisgIDc0OgkxYiA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorICA3YToJMWMgOTAgWyAJXSpzYmIgICAgXCQweDkwLCVhbAorICA3YzoJMWQgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTA5MDkwLCVlYXgKKyAgODE6CTFlIFsgCV0qcHVzaCAgICVkcworICA4MjoJMWYgWyAJXSpwb3AgICAgJWRzCisgIDgzOgkyMCA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCisgIDg5OgkyMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorICA4ZjoJMjIgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAorICA5NToJMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAgOWI6CTI0IDkwIFsgCV0qYW5kICAgIFwkMHg5MCwlYWwKKyAgOWQ6CTI1IDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIFwkMHg5MDkwOTA5MCwlZWF4CisgIGEyOgkyNyBbIAldKmRhYSAgICAKKyAgYTM6CTI4IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKKyAgYTk6CTI5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgIGFmOgkyYSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCisgIGI1OgkyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorICBiYjoJMmMgOTAgWyAJXSpzdWIgICAgXCQweDkwLCVhbAorICBiZDoJMmQgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgXCQweDkwOTA5MDkwLCVlYXgKKyAgYzI6CTJmIFsgCV0qZGFzICAgIAorICBjMzoJMzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQorICBjOToJMzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyAgY2Y6CTMyIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKKyAgZDU6CTMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgIGRiOgkzNCA5MCBbIAldKnhvciAgICBcJDB4OTAsJWFsCisgIGRkOgkzNSA5MCA5MCA5MCA5MCBbIAldKnhvciAgICBcJDB4OTA5MDkwOTAsJWVheAorICBlMjoJMzcgWyAJXSphYWEgICAgCisgIGUzOgkzOCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCisgIGU5OgkzOSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorICBlZjoJM2EgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAorICBmNToJM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAgZmI6CTNjIDkwIFsgCV0qY21wICAgIFwkMHg5MCwlYWwKKyAgZmQ6CTNkIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIFwkMHg5MDkwOTA5MCwlZWF4CisgMTAyOgkzZiBbIAldKmFhcyAgICAKKyAxMDM6CTQwIFsgCV0qaW5jICAgICVlYXgKKyAxMDQ6CTQxIFsgCV0qaW5jICAgICVlY3gKKyAxMDU6CTQyIFsgCV0qaW5jICAgICVlZHgKKyAxMDY6CTQzIFsgCV0qaW5jICAgICVlYngKKyAxMDc6CTQ0IFsgCV0qaW5jICAgICVlc3AKKyAxMDg6CTQ1IFsgCV0qaW5jICAgICVlYnAKKyAxMDk6CTQ2IFsgCV0qaW5jICAgICVlc2kKKyAxMGE6CTQ3IFsgCV0qaW5jICAgICVlZGkKKyAxMGI6CTQ4IFsgCV0qZGVjICAgICVlYXgKKyAxMGM6CTQ5IFsgCV0qZGVjICAgICVlY3gKKyAxMGQ6CTRhIFsgCV0qZGVjICAgICVlZHgKKyAxMGU6CTRiIFsgCV0qZGVjICAgICVlYngKKyAxMGY6CTRjIFsgCV0qZGVjICAgICVlc3AKKyAxMTA6CTRkIFsgCV0qZGVjICAgICVlYnAKKyAxMTE6CTRlIFsgCV0qZGVjICAgICVlc2kKKyAxMTI6CTRmIFsgCV0qZGVjICAgICVlZGkKKyAxMTM6CTUwIFsgCV0qcHVzaCAgICVlYXgKKyAxMTQ6CTUxIFsgCV0qcHVzaCAgICVlY3gKKyAxMTU6CTUyIFsgCV0qcHVzaCAgICVlZHgKKyAxMTY6CTUzIFsgCV0qcHVzaCAgICVlYngKKyAxMTc6CTU0IFsgCV0qcHVzaCAgICVlc3AKKyAxMTg6CTU1IFsgCV0qcHVzaCAgICVlYnAKKyAxMTk6CTU2IFsgCV0qcHVzaCAgICVlc2kKKyAxMWE6CTU3IFsgCV0qcHVzaCAgICVlZGkKKyAxMWI6CTU4IFsgCV0qcG9wICAgICVlYXgKKyAxMWM6CTU5IFsgCV0qcG9wICAgICVlY3gKKyAxMWQ6CTVhIFsgCV0qcG9wICAgICVlZHgKKyAxMWU6CTViIFsgCV0qcG9wICAgICVlYngKKyAxMWY6CTVjIFsgCV0qcG9wICAgICVlc3AKKyAxMjA6CTVkIFsgCV0qcG9wICAgICVlYnAKKyAxMjE6CTVlIFsgCV0qcG9wICAgICVlc2kKKyAxMjI6CTVmIFsgCV0qcG9wICAgICVlZGkKKyAxMjM6CTYwIFsgCV0qcHVzaGEgIAorIDEyNDoJNjEgWyAJXSpwb3BhICAgCisgMTI1Ogk2MiA5MCA5MCA5MCA5MCA5MCBbIAldKmJvdW5kICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDEyYjoJNjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphcnBsICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDEzMToJNjggOTAgOTAgOTAgOTAgWyAJXSpwdXNoICAgXCQweDkwOTA5MDkwCisgMTM2Ogk2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAxNDA6CTZhIDkwIFsgCV0qcHVzaCAgIFwkMHhmZmZmZmY5MAorIDE0MjoJNmIgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMTQ5Ogk2YyBbIAldKmluc2IgICBcKCVkeFwpLCVlczpcKCVlZGlcKQorIDE0YToJNmQgWyAJXSppbnNsICAgXCglZHhcKSwlZXM6XCglZWRpXCkKKyAxNGI6CTZlIFsgCV0qb3V0c2IgICVkczpcKCVlc2lcKSxcKCVkeFwpCisgMTRjOgk2ZiBbIAldKm91dHNsICAlZHM6XCglZXNpXCksXCglZHhcKQorIDE0ZDoJNzAgOTAgWyAJXSpqbyAgICAgKDB4KT9kZi4qCisgMTRmOgk3MSA5MCBbIAldKmpubyAgICAoMHgpP2UxLioKKyAxNTE6CTcyIDkwIFsgCV0qamIgICAgICgweCk/ZTMuKgorIDE1MzoJNzMgOTAgWyAJXSpqYWUgICAgKDB4KT9lNS4qCisgMTU1Ogk3NCA5MCBbIAldKmplICAgICAoMHgpP2U3LioKKyAxNTc6CTc1IDkwIFsgCV0qam5lICAgICgweCk/ZTkuKgorIDE1OToJNzYgOTAgWyAJXSpqYmUgICAgKDB4KT9lYi4qCisgMTViOgk3NyA5MCBbIAldKmphICAgICAoMHgpP2VkLioKKyAxNWQ6CTc4IDkwIFsgCV0qanMgICAgICgweCk/ZWYuKgorIDE1ZjoJNzkgOTAgWyAJXSpqbnMgICAgKDB4KT9mMS4qCisgMTYxOgk3YSA5MCBbIAldKmpwICAgICAoMHgpP2YzLioKKyAxNjM6CTdiIDkwIFsgCV0qam5wICAgICgweCk/ZjUuKgorIDE2NToJN2MgOTAgWyAJXSpqbCAgICAgKDB4KT9mNy4qCisgMTY3Ogk3ZCA5MCBbIAldKmpnZSAgICAoMHgpP2Y5LioKKyAxNjk6CTdlIDkwIFsgCV0qamxlICAgICgweCk/ZmIuKgorIDE2YjoJN2YgOTAgWyAJXSpqZyAgICAgKDB4KT9mZC4qCisgMTZkOgk4MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2IgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCisgMTc0Ogk4MSA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCisgMTdlOgk4MyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY2wgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpCisgMTg1Ogk4NCA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCisgMThiOgk4NSA5MCA5MCA5MCA5MCA5MCBbIAldKnRlc3QgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDE5MToJODYgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQorIDE5NzoJODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyAxOWQ6CTg4IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKKyAxYTM6CTg5IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgMWE5Ogk4YSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCisgMWFmOgk4YiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDFiNToJOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQorIDFiYjoJOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAxYzE6CThlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlc3MKKyAxYzc6CThmIDgwIDkwIDkwIDkwIDkwIFsgCV0qcG9wbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDFjZDoJOTAgWyAJXSpub3AgICAgCisgMWNlOgk5MSBbIAldKnhjaGcgICAlZWF4LCVlY3gKKyAxY2Y6CTkyIFsgCV0qeGNoZyAgICVlYXgsJWVkeAorIDFkMDoJOTMgWyAJXSp4Y2hnICAgJWVheCwlZWJ4CisgMWQxOgk5NCBbIAldKnhjaGcgICAlZWF4LCVlc3AKKyAxZDI6CTk1IFsgCV0qeGNoZyAgICVlYXgsJWVicAorIDFkMzoJOTYgWyAJXSp4Y2hnICAgJWVheCwlZXNpCisgMWQ0Ogk5NyBbIAldKnhjaGcgICAlZWF4LCVlZGkKKyAxZDU6CTk4IFsgCV0qY3d0bCAgIAorIDFkNjoJOTkgWyAJXSpjbHRkICAgCisgMWQ3Ogk5YSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmxjYWxsICBcJDB4OTA5MCxcJDB4OTA5MDkwOTAKKyAxZGU6CTliIFsgCV0qZndhaXQKKyAxZGY6CTljIFsgCV0qcHVzaGYgIAorIDFlMDoJOWQgWyAJXSpwb3BmICAgCisgMWUxOgk5ZSBbIAldKnNhaGYgICAKKyAxZTI6CTlmIFsgCV0qbGFoZiAgIAorIDFlMzoJYTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlYWwKKyAxZTg6CWExIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWVheAorIDFlZDoJYTIgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWFsLDB4OTA5MDkwOTAKKyAxZjI6CWEzIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVlYXgsMHg5MDkwOTA5MAorIDFmNzoJYTQgWyAJXSptb3ZzYiAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQorIDFmODoJYTUgWyAJXSptb3ZzbCAgJWRzOlwoJWVzaVwpLCVlczpcKCVlZGlcKQorIDFmOToJYTYgWyAJXSpjbXBzYiAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQorIDFmYToJYTcgWyAJXSpjbXBzbCAgJWVzOlwoJWVkaVwpLCVkczpcKCVlc2lcKQorIDFmYjoJYTggOTAgWyAJXSp0ZXN0ICAgXCQweDkwLCVhbAorIDFmZDoJYTkgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgXCQweDkwOTA5MDkwLCVlYXgKKyAyMDI6CWFhIFsgCV0qc3RvcyAgICVhbCwlZXM6XCglZWRpXCkKKyAyMDM6CWFiIFsgCV0qc3RvcyAgICVlYXgsJWVzOlwoJWVkaVwpCisgMjA0OglhYyBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWFsCisgMjA1OglhZCBbIAldKmxvZHMgICAlZHM6XCglZXNpXCksJWVheAorIDIwNjoJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAorIDIwNzoJYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVlYXgKKyAyMDg6CWIwIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWwKKyAyMGE6CWIxIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2wKKyAyMGM6CWIyIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGwKKyAyMGU6CWIzIDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmwKKyAyMTA6CWI0IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYWgKKyAyMTI6CWI1IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlY2gKKyAyMTQ6CWI2IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlZGgKKyAyMTY6CWI3IDkwIFsgCV0qbW92ICAgIFwkMHg5MCwlYmgKKyAyMTg6CWI4IDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWF4CisgMjFkOgliOSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVjeAorIDIyMjoJYmEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlZHgKKyAyMjc6CWJiIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWJ4CisgMjJjOgliYyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVzcAorIDIzMToJYmQgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlYnAKKyAyMzY6CWJlIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZXNpCisgMjNiOgliZiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVkaQorIDI0MDoJYzAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQorIDI0NzoJYzEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQorIDI0ZToJYzIgOTAgOTAgWyAJXSpyZXQgICAgXCQweDkwOTAKKyAyNTE6CWMzIFsgCV0qcmV0ICAgIAorIDI1MjoJYzQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZXMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAyNTg6CWM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMjVlOgljNiA4MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmIgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCisgMjY1OgljNyA4MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICBcJDB4OTA5MDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpCisgMjZmOgljOCA5MCA5MCA5MCBbIAldKmVudGVyICBcJDB4OTA5MCxcJDB4OTAKKyAyNzM6CWM5IFsgCV0qbGVhdmUgIAorIDI3NDoJY2EgOTAgOTAgWyAJXSpscmV0ICAgXCQweDkwOTAKKyAyNzc6CWNiIFsgCV0qbHJldCAgIAorIDI3ODoJY2MgWyAJXSppbnQzICAgCisgMjc5OgljZCA5MCBbIAldKmludCAgICBcJDB4OTAKKyAyN2I6CWNlIFsgCV0qaW50byAgIAorIDI3YzoJY2YgWyAJXSppcmV0ICAgCisgMjdkOglkMCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGIgICAweDkwOTA5MDkwXCglZWF4XCkKKyAyODM6CWQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDI4OToJZDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQorIDI4ZjoJZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xsICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQorIDI5NToJZDQgOTAgWyAJXSphYW0gICAgXCQweGZmZmZmZjkwCisgMjk3OglkNSA5MCBbIAldKmFhZCAgICBcJDB4ZmZmZmZmOTAKKyAyOTk6CWQ3IFsgCV0qeGxhdCAgICVkczpcKCVlYnhcKQorIDI5YToJZDggOTAgOTAgOTAgOTAgOTAgWyAJXSpmY29tcyAgMHg5MDkwOTA5MFwoJWVheFwpCisgMmEwOglkOSA5MCA5MCA5MCA5MCA5MCBbIAldKmZzdHMgICAweDkwOTA5MDkwXCglZWF4XCkKKyAyYTY6CWRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmljb21sIDB4OTA5MDkwOTBcKCVlYXhcKQorIDJhYzoJZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaXN0bCAgMHg5MDkwOTA5MFwoJWVheFwpCisgMmIyOglkYyA5MCA5MCA5MCA5MCA5MCBbIAldKmZjb21sICAweDkwOTA5MDkwXCglZWF4XCkKKyAyYjg6CWRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qZnN0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDJiZToJZGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaWNvbSAgMHg5MDkwOTA5MFwoJWVheFwpCisgMmM0OglkZiA5MCA5MCA5MCA5MCA5MCBbIAldKmZpc3QgICAweDkwOTA5MDkwXCglZWF4XCkKKyAyY2E6CWUwIDkwIFsgCV0qbG9vcG5lICgweCk/MjVjLioKKyAyY2M6CWUxIDkwIFsgCV0qbG9vcGUgICgweCk/MjVlLioKKyAyY2U6CWUyIDkwIFsgCV0qbG9vcCAgICgweCk/MjYwLioKKyAyZDA6CWUzIDkwIFsgCV0qamVjeHogICgweCk/MjYyLioKKyAyZDI6CWU0IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlYWwKKyAyZDQ6CWU1IDkwIFsgCV0qaW4gICAgIFwkMHg5MCwlZWF4CisgMmQ2OgllNiA5MCBbIAldKm91dCAgICAlYWwsXCQweDkwCisgMmQ4OgllNyA5MCBbIAldKm91dCAgICAlZWF4LFwkMHg5MAorIDJkYToJZTggOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgKDB4KT85MDkwOTM2Zi4qCisgMmRmOgllOSA5MCA5MCA5MCA5MCBbIAldKmptcCAgICAoMHgpPzkwOTA5Mzc0LioKKyAyZTQ6CWVhIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGptcCAgIFwkMHg5MDkwLFwkMHg5MDkwOTA5MAorIDJlYjoJZWIgOTAgWyAJXSpqbXAgICAgKDB4KT8yN2QuKgorIDJlZDoJZWMgWyAJXSppbiAgICAgXCglZHhcKSwlYWwKKyAyZWU6CWVkIFsgCV0qaW4gICAgIFwoJWR4XCksJWVheAorIDJlZjoJZWUgWyAJXSpvdXQgICAgJWFsLFwoJWR4XCkKKyAyZjA6CWVmIFsgCV0qb3V0ICAgICVlYXgsXCglZHhcKQorIDJmMToJZjQgWyAJXSpobHQgICAgCisgMmYyOglmNSBbIAldKmNtYyAgICAKKyAyZjM6CWY2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90YiAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDJmOToJZjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpub3RsICAgMHg5MDkwOTA5MFwoJWVheFwpCisgMmZmOglmOCBbIAldKmNsYyAgICAKKyAzMDA6CWY5IFsgCV0qc3RjICAgIAorIDMwMToJZmEgWyAJXSpjbGkgICAgCisgMzAyOglmYiBbIAldKnN0aSAgICAKKyAzMDM6CWZjIFsgCV0qY2xkICAgIAorIDMwNDoJZmQgWyAJXSpzdGQgICAgCisgMzA1OglmZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNhbGwgICBcKjB4OTA5MDkwOTBcKCVlYXhcKQorIDMwYjoJMGYgMDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsbGR0ICAgMHg5MDkwOTA5MFwoJWVheFwpCisgMzEyOgkwZiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmxnZHQgICAweDkwOTA5MDkwXCglZWF4XCkKKyAzMTk6CTBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMzIwOgkwZiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmxzbCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDMyNzoJMGYgMDYgWyAJXSpjbHRzICAgCisgMzI5OgkwZiAwOCBbIAldKmludmQgICAKKyAzMmI6CTBmIDA5IFsgCV0qd2JpbnZkIAorIDMyZDoJMGYgMGIgWyAJXSp1ZDJhICAgCisgMzJmOgkwZiAyMCBkMCBbIAldKm1vdiAgICAlY3IyLCVlYXgKKyAzMzI6CTBmIDIxIGQwIFsgCV0qbW92ICAgICVkYjIsJWVheAorIDMzNToJMGYgMjIgZDAgWyAJXSptb3YgICAgJWVheCwlY3IyCisgMzM4OgkwZiAyMyBkMCBbIAldKm1vdiAgICAlZWF4LCVkYjIKKyAzM2I6CTBmIDI0IGQwIFsgCV0qbW92ICAgICV0cjIsJWVheAorIDMzZToJMGYgMjYgZDAgWyAJXSptb3YgICAgJWVheCwldHIyCisgMzQxOgkwZiAzMCBbIAldKndybXNyICAKKyAzNDM6CTBmIDMxIFsgCV0qcmR0c2MgIAorIDM0NToJMGYgMzIgWyAJXSpyZG1zciAgCisgMzQ3OgkwZiAzMyBbIAldKnJkcG1jICAKKyAzNDk6CTBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMzUwOgkwZiA0MSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZubyAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDM1NzoJMGYgNDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YiAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAzNWU6CTBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMzY1OgkwZiA0NCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZlICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDM2YzoJMGYgNDUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bmUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAzNzM6CTBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMzdhOgkwZiA0NyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDM4MToJMGYgNDggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cyAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAzODg6CTBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgMzhmOgkwZiA0YSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZwICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDM5NjoJMGYgNGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bnAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAzOWQ6CTBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgM2E0OgkwZiA0ZCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDNhYjoJMGYgNGUgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bGUgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyAzYjI6CTBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgM2I5OgkwZiA2MCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2xidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDNjMDoJMGYgNjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsd2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyAzYzc6CTBmIDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgM2NlOgkwZiA2MyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgM2Q1OgkwZiA2NCA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndGIgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyAzZGM6CTBmIDY1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0dyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDNlMzoJMGYgNjYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3RkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgM2VhOgkwZiA2NyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2t1c3diIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgM2YxOgkwZiA2OCA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2hidyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDNmODoJMGYgNjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tod2QgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyAzZmY6CTBmIDZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraGRxIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNDA2OgkwZiA2YiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhY2tzc2R3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNDBkOgkwZiA2ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmQgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDQxNDoJMGYgNmYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZxICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA0MWI6CTBmIDcxIGQwIDkwIFsgCV0qcHNybHcgIFwkMHg5MCwlbW0wCisgNDFmOgkwZiA3MiBkMCA5MCBbIAldKnBzcmxkICBcJDB4OTAsJW1tMAorIDQyMzoJMGYgNzMgZDAgOTAgWyAJXSpwc3JscSAgXCQweDkwLCVtbTAKKyA0Mjc6CTBmIDc0IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDQyZToJMGYgNzUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXF3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNDM1OgkwZiA3NiA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcWQgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA0M2M6CTBmIDc3IFsgCV0qZW1tcyAgIAorIDQzZToJMGYgN2UgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZkICAgJW1tMiwweDkwOTA5MDkwXCglZWF4XCkKKyA0NDU6CTBmIDdmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92cSAgICVtbTIsMHg5MDkwOTA5MFwoJWVheFwpCisgNDRjOgkwZiA4MCA5MCA5MCA5MCA5MCBbIAldKmpvICAgICAoMHgpPzkwOTA5NGUyLioKKyA0NTI6CTBmIDgxIDkwIDkwIDkwIDkwIFsgCV0qam5vICAgICgweCk/OTA5MDk0ZTguKgorIDQ1ODoJMGYgODIgOTAgOTAgOTAgOTAgWyAJXSpqYiAgICAgKDB4KT85MDkwOTRlZS4qCisgNDVlOgkwZiA4MyA5MCA5MCA5MCA5MCBbIAldKmphZSAgICAoMHgpPzkwOTA5NGY0LioKKyA0NjQ6CTBmIDg0IDkwIDkwIDkwIDkwIFsgCV0qamUgICAgICgweCk/OTA5MDk0ZmEuKgorIDQ2YToJMGYgODUgOTAgOTAgOTAgOTAgWyAJXSpqbmUgICAgKDB4KT85MDkwOTUwMC4qCisgNDcwOgkwZiA4NiA5MCA5MCA5MCA5MCBbIAldKmpiZSAgICAoMHgpPzkwOTA5NTA2LioKKyA0NzY6CTBmIDg3IDkwIDkwIDkwIDkwIFsgCV0qamEgICAgICgweCk/OTA5MDk1MGMuKgorIDQ3YzoJMGYgODggOTAgOTAgOTAgOTAgWyAJXSpqcyAgICAgKDB4KT85MDkwOTUxMi4qCisgNDgyOgkwZiA4OSA5MCA5MCA5MCA5MCBbIAldKmpucyAgICAoMHgpPzkwOTA5NTE4LioKKyA0ODg6CTBmIDhhIDkwIDkwIDkwIDkwIFsgCV0qanAgICAgICgweCk/OTA5MDk1MWUuKgorIDQ4ZToJMGYgOGIgOTAgOTAgOTAgOTAgWyAJXSpqbnAgICAgKDB4KT85MDkwOTUyNC4qCisgNDk0OgkwZiA4YyA5MCA5MCA5MCA5MCBbIAldKmpsICAgICAoMHgpPzkwOTA5NTJhLioKKyA0OWE6CTBmIDhkIDkwIDkwIDkwIDkwIFsgCV0qamdlICAgICgweCk/OTA5MDk1MzAuKgorIDRhMDoJMGYgOGUgOTAgOTAgOTAgOTAgWyAJXSpqbGUgICAgKDB4KT85MDkwOTUzNi4qCisgNGE2OgkwZiA4ZiA5MCA5MCA5MCA5MCBbIAldKmpnICAgICAoMHgpPzkwOTA5NTNjLioKKyA0YWM6CTBmIDkwIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0byAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDRiMzoJMGYgOTEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRubyAgMHg5MDkwOTA5MFwoJWVheFwpCisgNGJhOgkwZiA5MiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGIgICAweDkwOTA5MDkwXCglZWF4XCkKKyA0YzE6CTBmIDkzIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YWUgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDRjODoJMGYgOTQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRlICAgMHg5MDkwOTA5MFwoJWVheFwpCisgNGNmOgkwZiA5NSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5lICAweDkwOTA5MDkwXCglZWF4XCkKKyA0ZDY6CTBmIDk2IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YmUgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDRkZDoJMGYgOTcgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRhICAgMHg5MDkwOTA5MFwoJWVheFwpCisgNGU0OgkwZiA5OCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldHMgICAweDkwOTA5MDkwXCglZWF4XCkKKyA0ZWI6CTBmIDk5IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bnMgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDRmMjoJMGYgOWEgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRwICAgMHg5MDkwOTA5MFwoJWVheFwpCisgNGY5OgkwZiA5YiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5wICAweDkwOTA5MDkwXCglZWF4XCkKKyA1MDA6CTBmIDljIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDUwNzoJMGYgOWQgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRnZSAgMHg5MDkwOTA5MFwoJWVheFwpCisgNTBlOgkwZiA5ZSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGxlICAweDkwOTA5MDkwXCglZWF4XCkKKyA1MTU6CTBmIDlmIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0ZyAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDUxYzoJMGYgYTAgWyAJXSpwdXNoICAgJWZzCisgNTFlOgkwZiBhMSBbIAldKnBvcCAgICAlZnMKKyA1MjA6CTBmIGEyIFsgCV0qY3B1aWQgIAorIDUyMjoJMGYgYTMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidCAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA1Mjk6CTBmIGE0IDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgIFwkMHg5MCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDUzMToJMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNTM4OgkwZiBhOCBbIAldKnB1c2ggICAlZ3MKKyA1M2E6CTBmIGE5IFsgCV0qcG9wICAgICVncworIDUzYzoJMGYgYWEgWyAJXSpyc20gICAgCisgNTNlOgkwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDU0NToJMGYgYWMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgXCQweDkwLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNTRkOgkwZiBhZCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICAlY2wsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA1NTQ6CTBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgNTViOgkwZiBiMCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtcHhjaGcgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQorIDU2MjoJMGYgYjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNTY5OgkwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDU3MDoJMGYgYjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHIgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA1Nzc6CTBmIGI0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGZzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgNTdlOgkwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDU4NToJMGYgYjYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z6YmwgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyA1OGM6CTBmIGI3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92endsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgNTkzOgkwZiBiOSBbIAldKnVkMmIgICAKKyA1OTU6CTBmIGJiIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRjICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNTljOgkwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDVhMzoJMGYgYmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpic3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKKyA1YWE6CTBmIGJlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92c2JsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4CisgNWIxOgkwZiBiZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnN3bCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAorIDViODoJMGYgYzAgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQorIDViZjoJMGYgYzEgOTAgOTAgOTAgOTAgOTAgWyAJXSp4YWRkICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA1YzY6CTBmIGM4IFsgCV0qYnN3YXAgICVlYXgKKyA1Yzg6CTBmIGM5IFsgCV0qYnN3YXAgICVlY3gKKyA1Y2E6CTBmIGNhIFsgCV0qYnN3YXAgICVlZHgKKyA1Y2M6CTBmIGNiIFsgCV0qYnN3YXAgICVlYngKKyA1Y2U6CTBmIGNjIFsgCV0qYnN3YXAgICVlc3AKKyA1ZDA6CTBmIGNkIFsgCV0qYnN3YXAgICVlYnAKKyA1ZDI6CTBmIGNlIFsgCV0qYnN3YXAgICVlc2kKKyA1ZDQ6CTBmIGNmIFsgCV0qYnN3YXAgICVlZGkKKyA1ZDY6CTBmIGQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNWRkOgkwZiBkMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmxkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDVlNDoJMGYgZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JscSAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA1ZWI6CTBmIGQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG11bGx3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNWYyOgkwZiBkOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ1c2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA1Zjk6CTBmIGQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnVzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDYwMDoJMGYgZGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYW5kICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2MDc6CTBmIGRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHVzYiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDYwZToJMGYgZGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdXN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjE1OgkwZiBkZiA5MCA5MCA5MCA5MCA5MCBbIAldKnBhbmRuICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDYxYzoJMGYgZTEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JhdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2MjM6CTBmIGUyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNyYWQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjJhOgkwZiBlNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtdWxodyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDYzMToJMGYgZTggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3Vic2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2Mzg6CTBmIGU5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjNmOgkwZiBlYiA5MCA5MCA5MCA5MCA5MCBbIAldKnBvciAgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDY0NjoJMGYgZWMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkc2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2NGQ6CTBmIGVkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHN3IDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjU0OgkwZiBlZiA5MCA5MCA5MCA5MCA5MCBbIAldKnB4b3IgICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDY1YjoJMGYgZjEgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xsdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2NjI6CTBmIGYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjY5OgkwZiBmMyA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGxxICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDY3MDoJMGYgZjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbWFkZHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjc3OgkwZiBmOCA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDY3ZToJMGYgZjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2ODU6CTBmIGZhIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YmQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNjhjOgkwZiBmYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRiICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgorIDY5MzoJMGYgZmQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkdyAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKKyA2OWE6CTBmIGZlIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZGQgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCisgNmExOgk2NiAwMSA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNmE4Ogk2NiAwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgNmFmOgk2NiAwNSA5MCA5MCBbIAldKmFkZCAgICBcJDB4OTA5MCwlYXgKKyA2YjM6CTY2IDA2IFsgCV0qcHVzaHcgICVlcworIDZiNToJNjYgMDcgWyAJXSpwb3B3ICAgJWVzCisgNmI3Ogk2NiAwOSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNmJlOgk2NiAwYiA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgNmM1Ogk2NiAwZCA5MCA5MCBbIAldKm9yICAgICBcJDB4OTA5MCwlYXgKKyA2Yzk6CTY2IDBlIFsgCV0qcHVzaHcgICVjcworIDZjYjoJNjYgMTEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDZkMjoJNjYgMTMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAorIDZkOToJNjYgMTUgOTAgOTAgWyAJXSphZGMgICAgXCQweDkwOTAsJWF4CisgNmRkOgk2NiAxNiBbIAldKnB1c2h3ICAlc3MKKyA2ZGY6CTY2IDE3IFsgCV0qcG9wdyAgICVzcworIDZlMToJNjYgMTkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDZlODoJNjYgMWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAorIDZlZjoJNjYgMWQgOTAgOTAgWyAJXSpzYmIgICAgXCQweDkwOTAsJWF4CisgNmYzOgk2NiAxZSBbIAldKnB1c2h3ICAlZHMKKyA2ZjU6CTY2IDFmIFsgCV0qcG9wdyAgICVkcworIDZmNzoJNjYgMjEgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDZmZToJNjYgMjMgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAorIDcwNToJNjYgMjUgOTAgOTAgWyAJXSphbmQgICAgXCQweDkwOTAsJWF4CisgNzA5Ogk2NiAyOSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgNzEwOgk2NiAyYiA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgNzE3Ogk2NiAyZCA5MCA5MCBbIAldKnN1YiAgICBcJDB4OTA5MCwlYXgKKyA3MWI6CTY2IDMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA3MjI6CTY2IDMzIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA3Mjk6CTY2IDM1IDkwIDkwIFsgCV0qeG9yICAgIFwkMHg5MDkwLCVheAorIDcyZDoJNjYgMzkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDczNDoJNjYgM2IgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAorIDczYjoJNjYgM2QgOTAgOTAgWyAJXSpjbXAgICAgXCQweDkwOTAsJWF4CisgNzNmOgk2NiA0MCBbIAldKmluYyAgICAlYXgKKyA3NDE6CTY2IDQxIFsgCV0qaW5jICAgICVjeAorIDc0MzoJNjYgNDIgWyAJXSppbmMgICAgJWR4CisgNzQ1Ogk2NiA0MyBbIAldKmluYyAgICAlYngKKyA3NDc6CTY2IDQ0IFsgCV0qaW5jICAgICVzcAorIDc0OToJNjYgNDUgWyAJXSppbmMgICAgJWJwCisgNzRiOgk2NiA0NiBbIAldKmluYyAgICAlc2kKKyA3NGQ6CTY2IDQ3IFsgCV0qaW5jICAgICVkaQorIDc0ZjoJNjYgNDggWyAJXSpkZWMgICAgJWF4CisgNzUxOgk2NiA0OSBbIAldKmRlYyAgICAlY3gKKyA3NTM6CTY2IDRhIFsgCV0qZGVjICAgICVkeAorIDc1NToJNjYgNGIgWyAJXSpkZWMgICAgJWJ4CisgNzU3Ogk2NiA0YyBbIAldKmRlYyAgICAlc3AKKyA3NTk6CTY2IDRkIFsgCV0qZGVjICAgICVicAorIDc1YjoJNjYgNGUgWyAJXSpkZWMgICAgJXNpCisgNzVkOgk2NiA0ZiBbIAldKmRlYyAgICAlZGkKKyA3NWY6CTY2IDUwIFsgCV0qcHVzaCAgICVheAorIDc2MToJNjYgNTEgWyAJXSpwdXNoICAgJWN4CisgNzYzOgk2NiA1MiBbIAldKnB1c2ggICAlZHgKKyA3NjU6CTY2IDUzIFsgCV0qcHVzaCAgICVieAorIDc2NzoJNjYgNTQgWyAJXSpwdXNoICAgJXNwCisgNzY5Ogk2NiA1NSBbIAldKnB1c2ggICAlYnAKKyA3NmI6CTY2IDU2IFsgCV0qcHVzaCAgICVzaQorIDc2ZDoJNjYgNTcgWyAJXSpwdXNoICAgJWRpCisgNzZmOgk2NiA1OCBbIAldKnBvcCAgICAlYXgKKyA3NzE6CTY2IDU5IFsgCV0qcG9wICAgICVjeAorIDc3MzoJNjYgNWEgWyAJXSpwb3AgICAgJWR4CisgNzc1Ogk2NiA1YiBbIAldKnBvcCAgICAlYngKKyA3Nzc6CTY2IDVjIFsgCV0qcG9wICAgICVzcAorIDc3OToJNjYgNWQgWyAJXSpwb3AgICAgJWJwCisgNzdiOgk2NiA1ZSBbIAldKnBvcCAgICAlc2kKKyA3N2Q6CTY2IDVmIFsgCV0qcG9wICAgICVkaQorIDc3ZjoJNjYgNjAgWyAJXSpwdXNoYXcgCisgNzgxOgk2NiA2MSBbIAldKnBvcGF3ICAKKyA3ODM6CTY2IDYyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYm91bmQgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA3OGE6CTY2IDY4IDkwIDkwIFsgCV0qcHVzaHcgIFwkMHg5MDkwCisgNzhlOgk2NiA2OSA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4CisgNzk3Ogk2NiA2YSA5MCBbIAldKnB1c2h3ICBcJDB4ZmZmZmZmOTAKKyA3OWE6CTY2IDZiIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCksJWR4CisgN2EyOgk2NiA2ZCBbIAldKmluc3cgICBcKCVkeFwpLCVlczpcKCVlZGlcKQorIDdhNDoJNjYgNmYgWyAJXSpvdXRzdyAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKKyA3YTY6CTY2IDgxIDkwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjdyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQorIDdhZjoJNjYgODMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGN3ICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKQorIDdiNzoJNjYgODUgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDdiZToJNjYgODcgOTAgOTAgOTAgOTAgOTAgWyAJXSp4Y2hnICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDdjNToJNjYgODkgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDdjYzoJNjYgOGIgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAorIDdkMzoJNjYgOGMgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Z3ICAgJXNzLDB4OTA5MDkwOTBcKCVlYXhcKQorIDdkYToJNjYgOGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZWEgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAorIDdlMToJNjYgOGYgODAgOTAgOTAgOTAgOTAgWyAJXSpwb3B3ICAgMHg5MDkwOTA5MFwoJWVheFwpCisgN2U4Ogk2NiA5MSBbIAldKnhjaGcgICAlYXgsJWN4CisgN2VhOgk2NiA5MiBbIAldKnhjaGcgICAlYXgsJWR4CisgN2VjOgk2NiA5MyBbIAldKnhjaGcgICAlYXgsJWJ4CisgN2VlOgk2NiA5NCBbIAldKnhjaGcgICAlYXgsJXNwCisgN2YwOgk2NiA5NSBbIAldKnhjaGcgICAlYXgsJWJwCisgN2YyOgk2NiA5NiBbIAldKnhjaGcgICAlYXgsJXNpCisgN2Y0Ogk2NiA5NyBbIAldKnhjaGcgICAlYXgsJWRpCisgN2Y2Ogk2NiA5OCBbIAldKmNidHcgICAKKyA3Zjg6CTY2IDk5IFsgCV0qY3d0ZCAgIAorIDdmYToJNjYgOWEgOTAgOTAgOTAgOTAgWyAJXSpsY2FsbHcgXCQweDkwOTAsXCQweDkwOTAKKyA4MDA6CTY2IDljIFsgCV0qcHVzaGZ3IAorIDgwMjoJNjYgOWQgWyAJXSpwb3BmdyAgCisgODA0Ogk2NiBhMSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVheAorIDgwYToJNjYgYTMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgJWF4LDB4OTA5MDkwOTAKKyA4MTA6CTY2IGE1IFsgCV0qbW92c3cgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKKyA4MTI6CTY2IGE3IFsgCV0qY21wc3cgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKKyA4MTQ6CTY2IGE5IDkwIDkwIFsgCV0qdGVzdCAgIFwkMHg5MDkwLCVheAorIDgxODoJNjYgYWIgWyAJXSpzdG9zICAgJWF4LCVlczpcKCVlZGlcKQorIDgxYToJNjYgYWQgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVheAorIDgxYzoJNjYgYWYgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVheAorIDgxZToJNjYgYjggOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWF4CisgODIyOgk2NiBiOSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlY3gKKyA4MjY6CTY2IGJhIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVkeAorIDgyYToJNjYgYmIgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWJ4CisgODJlOgk2NiBiYyA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlc3AKKyA4MzI6CTY2IGJkIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVicAorIDgzNjoJNjYgYmUgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJXNpCisgODNhOgk2NiBiZiA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlZGkKKyA4M2U6CTY2IGMxIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKKyA4NDY6CTY2IGMyIDkwIDkwIFsgCV0qcmV0dyAgIFwkMHg5MDkwCisgODRhOgk2NiBjMyBbIAldKnJldHcgICAKKyA4NGM6CTY2IGM0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4NTM6CTY2IGM1IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGRzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4NWE6CTY2IGM3IDgwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92dyAgIFwkMHg5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQorIDg2MzoJNjYgYzggOTAgOTAgOTAgWyAJXSplbnRlcncgXCQweDkwOTAsXCQweDkwCisgODY4Ogk2NiBjOSBbIAldKmxlYXZldyAKKyA4NmE6CTY2IGNhIDkwIDkwIFsgCV0qbHJldHcgIFwkMHg5MDkwCisgODZlOgk2NiBjYiBbIAldKmxyZXR3ICAKKyA4NzA6CTY2IGNmIFsgCV0qaXJldHcgIAorIDg3MjoJNjYgZDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgMHg5MDkwOTA5MFwoJWVheFwpCisgODc5Ogk2NiBkMyA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICAlY2wsMHg5MDkwOTA5MFwoJWVheFwpCisgODgwOgk2NiBlNSA5MCBbIAldKmluICAgICBcJDB4OTAsJWF4CisgODgzOgk2NiBlNyA5MCBbIAldKm91dCAgICAlYXgsXCQweDkwCisgODg2Ogk2NiBlOCA4ZiA5MCBbIAldKmNhbGx3ICAoMHgpP2ZmZmY5OTE5LioKKyA4OGE6CTY2IGVhIDkwIDkwIDkwIDkwIFsgCV0qbGptcHcgIFwkMHg5MDkwLFwkMHg5MDkwCisgODkwOgk2NiBlZCBbIAldKmluICAgICBcKCVkeFwpLCVheAorIDg5MjoJNjYgZWYgWyAJXSpvdXQgICAgJWF4LFwoJWR4XCkKKyA4OTQ6CTY2IGY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90dyAgIDB4OTA5MDkwOTBcKCVlYXhcKQorIDg5YjoJNjYgZmYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjYWxsdyAgXCoweDkwOTA5MDkwXCglZWF4XCkKKyA4YTI6CTY2IDBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4YWE6CTY2IDBmIDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNsICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4YjI6CTY2IDBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4YmE6CTY2IDBmIDQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5vIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4YzI6CTY2IDBmIDQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4Y2E6CTY2IDBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4ZDI6CTY2IDBmIDQ0IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmUgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4ZGE6CTY2IDBmIDQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5lIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4ZTI6CTY2IDBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4ZWE6CTY2IDBmIDQ3IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4ZjI6CTY2IDBmIDQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnMgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA4ZmE6CTY2IDBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MDI6CTY2IDBmIDRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MGE6CTY2IDBmIDRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5wIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MTI6CTY2IDBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MWE6CTY2IDBmIDRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmdlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MjI6CTY2IDBmIDRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmxlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MmE6CTY2IDBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5MzI6CTY2IDBmIGEwIFsgCV0qcHVzaHcgICVmcworIDkzNToJNjYgMGYgYTEgWyAJXSpwb3B3ICAgJWZzCisgOTM4Ogk2NiAwZiBhMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgOTQwOgk2NiAwZiBhNCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICBcJDB4OTAsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDk0OToJNjYgMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA5NTE6CTY2IDBmIGE4IFsgCV0qcHVzaHcgICVncworIDk1NDoJNjYgMGYgYTkgWyAJXSpwb3B3ICAgJWdzCisgOTU3Ogk2NiAwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgOTVmOgk2NiAwZiBhYyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICBcJDB4OTAsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQorIDk2ODoJNjYgMGYgYWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgJWNsLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKKyA5NzA6CTY2IDBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKKyA5Nzg6CTY2IDBmIGIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgOTgwOgk2NiAwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOTg4Ogk2NiAwZiBiMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ciAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgOTkwOgk2NiAwZiBiNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxmcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOTk4Ogk2NiAwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOWEwOgk2NiAwZiBiNiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnpidyAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOWE4Ogk2NiAwZiBiYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0YyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCisgOWIwOgk2NiAwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOWI4Ogk2NiAwZiBiZCA5MCA5MCA5MCA5MCA5MCBbIAldKmJzciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOWMwOgk2NiAwZiBiZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnNidyAweDkwOTA5MDkwXCglZWF4XCksJWR4CisgOWM4Ogk2NiAwZiBjMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM1OTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUucwpAQCAtMCwwICsxLDU2NyBAQAorLnRleHQKK2ZvbzoKKyBhZGQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKKyBhZGQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCisgYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGFkZCAgICAkMHg5MCwlYWwKKyBhZGQgICAgJDB4OTA5MDkwOTAsJWVheAorIHB1c2ggICAlZXMKKyBwb3AgICAgJWVzCisgb3IgICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCisgb3IgICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQorIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAorIG9yICAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBvciAgICAgJDB4OTAsJWFsCisgb3IgICAgICQweDkwOTA5MDkwLCVlYXgKKyBwdXNoICAgJWNzCisgYWRjICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCisgYWRjICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQorIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAorIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBhZGMgICAgJDB4OTAsJWFsCisgYWRjICAgICQweDkwOTA5MDkwLCVlYXgKKyBwdXNoICAgJXNzCisgcG9wICAgICVzcworIHNiYiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQorIHNiYiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKKyBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Cisgc2JiICAgICQweDkwLCVhbAorIHNiYiAgICAkMHg5MDkwOTA5MCwlZWF4CisgcHVzaCAgICVkcworIHBvcCAgICAlZHMKKyBhbmQgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKKyBhbmQgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCisgYW5kICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGFuZCAgICAkMHg5MCwlYWwKKyBhbmQgICAgJDB4OTA5MDkwOTAsJWVheAorIGRhYQorIHN1YiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQorIHN1YiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKKyBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Cisgc3ViICAgICQweDkwLCVhbAorIHN1YiAgICAkMHg5MDkwOTA5MCwlZWF4CisgZGFzCisgeG9yICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCisgeG9yICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQorIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAorIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyB4b3IgICAgJDB4OTAsJWFsCisgeG9yICAgICQweDkwOTA5MDkwLCVlYXgKKyBhYWEKKyBjbXAgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKKyBjbXAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCisgY21wICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGNtcCAgICAkMHg5MCwlYWwKKyBjbXAgICAgJDB4OTA5MDkwOTAsJWVheAorIGFhcworIGluYyAgICAlZWF4CisgaW5jICAgICVlY3gKKyBpbmMgICAgJWVkeAorIGluYyAgICAlZWJ4CisgaW5jICAgICVlc3AKKyBpbmMgICAgJWVicAorIGluYyAgICAlZXNpCisgaW5jICAgICVlZGkKKyBkZWMgICAgJWVheAorIGRlYyAgICAlZWN4CisgZGVjICAgICVlZHgKKyBkZWMgICAgJWVieAorIGRlYyAgICAlZXNwCisgZGVjICAgICVlYnAKKyBkZWMgICAgJWVzaQorIGRlYyAgICAlZWRpCisgcHVzaCAgICVlYXgKKyBwdXNoICAgJWVjeAorIHB1c2ggICAlZWR4CisgcHVzaCAgICVlYngKKyBwdXNoICAgJWVzcAorIHB1c2ggICAlZWJwCisgcHVzaCAgICVlc2kKKyBwdXNoICAgJWVkaQorIHBvcCAgICAlZWF4CisgcG9wICAgICVlY3gKKyBwb3AgICAgJWVkeAorIHBvcCAgICAlZWJ4CisgcG9wICAgICVlc3AKKyBwb3AgICAgJWVicAorIHBvcCAgICAlZXNpCisgcG9wICAgICVlZGkKKyBwdXNoYQorIHBvcGEKKyBib3VuZCAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgYXJwbCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCisgcHVzaCAgICQweDkwOTA5MDkwCisgaW11bCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCksJWVkeAorIHB1c2ggICAkMHhmZmZmZmY5MAorIGltdWwgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBpbnNiICAgKCVkeCksJWVzOiglZWRpKQorIGluc2wgICAoJWR4KSwlZXM6KCVlZGkpCisgb3V0c2IgICVkczooJWVzaSksKCVkeCkKKyBvdXRzbCAgJWRzOiglZXNpKSwoJWR4KQorIGpvICAgICAuKzItMHg3MAorIGpubyAgICAuKzItMHg3MAorIGpiICAgICAuKzItMHg3MAorIGphZSAgICAuKzItMHg3MAorIGplICAgICAuKzItMHg3MAorIGpuZSAgICAuKzItMHg3MAorIGpiZSAgICAuKzItMHg3MAorIGphICAgICAuKzItMHg3MAorIGpzICAgICAuKzItMHg3MAorIGpucyAgICAuKzItMHg3MAorIGpwICAgICAuKzItMHg3MAorIGpucCAgICAuKzItMHg3MAorIGpsICAgICAuKzItMHg3MAorIGpnZSAgICAuKzItMHg3MAorIGpsZSAgICAuKzItMHg3MAorIGpnICAgICAuKzItMHg3MAorIGFkY2IgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCisgYWRjbCAgICQweDkwOTA5MDkwLDB4OTA5MDkwOTAoJWVheCkKKyBhZGNsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQorIHRlc3QgICAlZGwsMHg5MDkwOTA5MCglZWF4KQorIHRlc3QgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyB4Y2hnICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKKyB4Y2hnICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgbW92ICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCisgbW92ICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQorIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAorIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBtb3ZsICAgJXNzLDB4OTA5MDkwOTAoJWVheCkKKyBsZWEgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgbW92bCAgIDB4OTA5MDkwOTAoJWVheCksJXNzCisgcG9wbCAgIDB4OTA5MDkwOTAoJWVheCkKKyB4Y2hnICAgJWVheCwlZWF4CisgeGNoZyAgICVlYXgsJWVjeAorIHhjaGcgICAlZWF4LCVlZHgKKyB4Y2hnICAgJWVheCwlZWJ4CisgeGNoZyAgICVlYXgsJWVzcAorIHhjaGcgICAlZWF4LCVlYnAKKyB4Y2hnICAgJWVheCwlZXNpCisgeGNoZyAgICVlYXgsJWVkaQorIGN3dGwKKyBjbHRkCisgbGNhbGwgICQweDkwOTAsJDB4OTA5MDkwOTAKKyBmd2FpdAorIHB1c2hmCisgcG9wZgorIHNhaGYKKyBsYWhmCisgbW92ICAgIDB4OTA5MDkwOTAsJWFsCisgbW92ICAgIDB4OTA5MDkwOTAsJWVheAorIG1vdiAgICAlYWwsMHg5MDkwOTA5MAorIG1vdiAgICAlZWF4LDB4OTA5MDkwOTAKKyBtb3ZzYiAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCisgbW92c2wgICVkczooJWVzaSksJWVzOiglZWRpKQorIGNtcHNiICAlZXM6KCVlZGkpLCVkczooJWVzaSkKKyBjbXBzbCAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCisgdGVzdCAgICQweDkwLCVhbAorIHRlc3QgICAkMHg5MDkwOTA5MCwlZWF4Cisgc3RvcyAgICVhbCwlZXM6KCVlZGkpCisgc3RvcyAgICVlYXgsJWVzOiglZWRpKQorIGxvZHMgICAlZHM6KCVlc2kpLCVhbAorIGxvZHMgICAlZHM6KCVlc2kpLCVlYXgKKyBzY2FzICAgJWVzOiglZWRpKSwlYWwKKyBzY2FzICAgJWVzOiglZWRpKSwlZWF4CisgbW92ICAgICQweDkwLCVhbAorIG1vdiAgICAkMHg5MCwlY2wKKyBtb3YgICAgJDB4OTAsJWRsCisgbW92ICAgICQweDkwLCVibAorIG1vdiAgICAkMHg5MCwlYWgKKyBtb3YgICAgJDB4OTAsJWNoCisgbW92ICAgICQweDkwLCVkaAorIG1vdiAgICAkMHg5MCwlYmgKKyBtb3YgICAgJDB4OTA5MDkwOTAsJWVheAorIG1vdiAgICAkMHg5MDkwOTA5MCwlZWN4CisgbW92ICAgICQweDkwOTA5MDkwLCVlZHgKKyBtb3YgICAgJDB4OTA5MDkwOTAsJWVieAorIG1vdiAgICAkMHg5MDkwOTA5MCwlZXNwCisgbW92ICAgICQweDkwOTA5MDkwLCVlYnAKKyBtb3YgICAgJDB4OTA5MDkwOTAsJWVzaQorIG1vdiAgICAkMHg5MDkwOTA5MCwlZWRpCisgcmNsYiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKKyByY2xsICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQorIHJldCAgICAkMHg5MDkwCisgcmV0CisgbGVzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGxkcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBtb3ZiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQorIG1vdmwgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpCisgZW50ZXIgICQweDkwOTAsJDB4OTAKKyBsZWF2ZQorIGxyZXQgICAkMHg5MDkwCisgbHJldAorIGludDMKKyBpbnQgICAgJDB4OTAKKyBpbnRvCisgaXJldAorIHJjbGIgICAweDkwOTA5MDkwKCVlYXgpCisgcmNsbCAgIDB4OTA5MDkwOTAoJWVheCkKKyByY2xiICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKKyByY2xsICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKKyBhYW0gICAgJDB4ZmZmZmZmOTAKKyBhYWQgICAgJDB4ZmZmZmZmOTAKKyB4bGF0ICAgJWRzOiglZWJ4KQorIGZjb21zICAweDkwOTA5MDkwKCVlYXgpCisgZnN0cyAgIDB4OTA5MDkwOTAoJWVheCkKKyBmaWNvbWwgMHg5MDkwOTA5MCglZWF4KQorIGZpc3RsICAweDkwOTA5MDkwKCVlYXgpCisgZmNvbWwgIDB4OTA5MDkwOTAoJWVheCkKKyBmc3RsICAgMHg5MDkwOTA5MCglZWF4KQorIGZpY29tICAweDkwOTA5MDkwKCVlYXgpCisgZmlzdCAgIDB4OTA5MDkwOTAoJWVheCkKKyBsb29wbmUgLisyLTB4NzAKKyBsb29wZSAgLisyLTB4NzAKKyBsb29wICAgLisyLTB4NzAKKyBqZWN4eiAgLisyLTB4NzAKKyBpbiAgICAgJDB4OTAsJWFsCisgaW4gICAgICQweDkwLCVlYXgKKyBvdXQgICAgJWFsLCQweDkwCisgb3V0ICAgICVlYXgsJDB4OTAKKyBjYWxsICAgLis1KzB4OTA5MDkwOTAKKyBqbXAgICAgLis1KzB4OTA5MDkwOTAKKyBsam1wICAgJDB4OTA5MCwkMHg5MDkwOTA5MAorIGptcCAgICAuKzItMHg3MAorIGluICAgICAoJWR4KSwlYWwKKyBpbiAgICAgKCVkeCksJWVheAorIG91dCAgICAlYWwsKCVkeCkKKyBvdXQgICAgJWVheCwoJWR4KQorIGhsdAorIGNtYworIG5vdGIgICAweDkwOTA5MDkwKCVlYXgpCisgbm90bCAgIDB4OTA5MDkwOTAoJWVheCkKKyBjbGMKKyBzdGMKKyBjbGkKKyBzdGkKKyBjbGQKKyBzdGQKKyBjYWxsICAgKjB4OTA5MDkwOTAoJWVheCkKKyBsbGR0ICAgMHg5MDkwOTA5MCglZWF4KQorIGxnZHQgICAweDkwOTA5MDkwKCVlYXgpCisgbGFyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBjbHRzCisgaW52ZAorIHdiaW52ZAorIHVkMmEKKyBtb3YgICAgJWNyMiwlZWF4CisgbW92ICAgICVkYjIsJWVheAorIG1vdiAgICAlZWF4LCVjcjIKKyBtb3YgICAgJWVheCwlZGIyCisgbW92ICAgICV0cjIsJWVheAorIG1vdiAgICAlZWF4LCV0cjIKKyB3cm1zcgorIHJkdHNjCisgcmRtc3IKKyByZHBtYworIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBjbW92bm8gMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgY21vdmIgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBjbW92ZSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgY21vdm5lIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBjbW92YSAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgY21vdnMgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBjbW92cCAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgY21vdm5wIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBjbW92Z2UgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgY21vdmxlIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBwdW5wY2tsYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHVucGNrbHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHB1bnBja2xkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwYWNrc3N3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwY21wZ3RiIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBjbXBndHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcGNtcGd0ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwYWNrdXN3YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwdW5wY2toYncgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHVucGNraHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHB1bnBja2hkcSAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwYWNrc3NkdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBtb3ZkICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgbW92cSAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBzcmx3ICAkMHg5MCwlbW0wCisgcHNybGQgICQweDkwLCVtbTAKKyBwc3JscSAgJDB4OTAsJW1tMAorIHBjbXBlcWIgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcGNtcGVxdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwY21wZXFkIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIGVtbXMKKyBtb3ZkICAgJW1tMiwweDkwOTA5MDkwKCVlYXgpCisgbW92cSAgICVtbTIsMHg5MDkwOTA5MCglZWF4KQorIGpvICAgICAuKzYrMHg5MDkwOTA5MAorIGpubyAgICAuKzYrMHg5MDkwOTA5MAorIGpiICAgICAuKzYrMHg5MDkwOTA5MAorIGphZSAgICAuKzYrMHg5MDkwOTA5MAorIGplICAgICAuKzYrMHg5MDkwOTA5MAorIGpuZSAgICAuKzYrMHg5MDkwOTA5MAorIGpiZSAgICAuKzYrMHg5MDkwOTA5MAorIGphICAgICAuKzYrMHg5MDkwOTA5MAorIGpzICAgICAuKzYrMHg5MDkwOTA5MAorIGpucyAgICAuKzYrMHg5MDkwOTA5MAorIGpwICAgICAuKzYrMHg5MDkwOTA5MAorIGpucCAgICAuKzYrMHg5MDkwOTA5MAorIGpsICAgICAuKzYrMHg5MDkwOTA5MAorIGpnZSAgICAuKzYrMHg5MDkwOTA5MAorIGpsZSAgICAuKzYrMHg5MDkwOTA5MAorIGpnICAgICAuKzYrMHg5MDkwOTA5MAorIHNldG8gICAweDkwOTA5MDkwKCVlYXgpCisgc2V0bm8gIDB4OTA5MDkwOTAoJWVheCkKKyBzZXRiICAgMHg5MDkwOTA5MCglZWF4KQorIHNldGFlICAweDkwOTA5MDkwKCVlYXgpCisgc2V0ZSAgIDB4OTA5MDkwOTAoJWVheCkKKyBzZXRuZSAgMHg5MDkwOTA5MCglZWF4KQorIHNldGJlICAweDkwOTA5MDkwKCVlYXgpCisgc2V0YSAgIDB4OTA5MDkwOTAoJWVheCkKKyBzZXRzICAgMHg5MDkwOTA5MCglZWF4KQorIHNldG5zICAweDkwOTA5MDkwKCVlYXgpCisgc2V0cCAgIDB4OTA5MDkwOTAoJWVheCkKKyBzZXRucCAgMHg5MDkwOTA5MCglZWF4KQorIHNldGwgICAweDkwOTA5MDkwKCVlYXgpCisgc2V0Z2UgIDB4OTA5MDkwOTAoJWVheCkKKyBzZXRsZSAgMHg5MDkwOTA5MCglZWF4KQorIHNldGcgICAweDkwOTA5MDkwKCVlYXgpCisgcHVzaCAgICVmcworIHBvcCAgICAlZnMKKyBjcHVpZAorIGJ0ICAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBzaGxkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgc2hsZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBwdXNoICAgJWdzCisgcG9wICAgICVncworIHJzbQorIGJ0cyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBzaHJkICAgJDB4OTAsJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgc2hyZCAgICVjbCwlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBpbXVsICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgY21weGNoZyAlZGwsMHg5MDkwOTA5MCglZWF4KQorIGNtcHhjaGcgJWVkeCwweDkwOTA5MDkwKCVlYXgpCisgbHNzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIGJ0ciAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgbGdzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIG1vdnpibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBtb3Z6d2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgdWQyYgorIGJ0YyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKKyBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgYnNyICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAorIG1vdnNibCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKKyBtb3Zzd2wgMHg5MDkwOTA5MCglZWF4KSwlZWR4CisgeGFkZCAgICVkbCwweDkwOTA5MDkwKCVlYXgpCisgeGFkZCAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQorIGJzd2FwICAlZWF4CisgYnN3YXAgICVlY3gKKyBic3dhcCAgJWVkeAorIGJzd2FwICAlZWJ4CisgYnN3YXAgICVlc3AKKyBic3dhcCAgJWVicAorIGJzd2FwICAlZXNpCisgYnN3YXAgICVlZGkKKyBwc3JsdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHNybGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBzcmxxICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwbXVsbHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHN1YnVzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwc3VidXN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBhbmQgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwYWRkdXNiIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBhZGR1c3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcGFuZG4gIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBzcmF3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwc3JhZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcG11bGh3IDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBzdWJzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwc3Vic3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcG9yICAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBhZGRzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwYWRkc3cgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHhvciAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBzbGx3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwc2xsZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHNsbHEgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBtYWRkd2QgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcHN1YmIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBzdWJ3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwc3ViZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgcGFkZGIgIDB4OTA5MDkwOTAoJWVheCksJW1tMgorIHBhZGR3ICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKKyBwYWRkZCAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCisgYWRkICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCisgYWRkICAgIDB4OTA5MDkwOTAoJWVheCksJWR4CisgYWRkICAgICQweDkwOTAsJWF4CisgcHVzaHcgICVlcworIHBvcHcgICAlZXMKKyBvciAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKKyBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBvciAgICAgJDB4OTA5MCwlYXgKKyBwdXNodyAgJWNzCisgYWRjICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCisgYWRjICAgIDB4OTA5MDkwOTAoJWVheCksJWR4CisgYWRjICAgICQweDkwOTAsJWF4CisgcHVzaHcgICVzcworIHBvcHcgICAlc3MKKyBzYmIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKKyBzYmIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBzYmIgICAgJDB4OTA5MCwlYXgKKyBwdXNodyAgJWRzCisgcG9wdyAgICVkcworIGFuZCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGFuZCAgICAkMHg5MDkwLCVheAorIHN1YiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIHN1YiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIHN1YiAgICAkMHg5MDkwLCVheAorIHhvciAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIHhvciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIHhvciAgICAkMHg5MDkwLCVheAorIGNtcCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtcCAgICAkMHg5MDkwLCVheAorIGluYyAgICAlYXgKKyBpbmMgICAgJWN4CisgaW5jICAgICVkeAorIGluYyAgICAlYngKKyBpbmMgICAgJXNwCisgaW5jICAgICVicAorIGluYyAgICAlc2kKKyBpbmMgICAgJWRpCisgZGVjICAgICVheAorIGRlYyAgICAlY3gKKyBkZWMgICAgJWR4CisgZGVjICAgICVieAorIGRlYyAgICAlc3AKKyBkZWMgICAgJWJwCisgZGVjICAgICVzaQorIGRlYyAgICAlZGkKKyBwdXNoICAgJWF4CisgcHVzaCAgICVjeAorIHB1c2ggICAlZHgKKyBwdXNoICAgJWJ4CisgcHVzaCAgICVzcAorIHB1c2ggICAlYnAKKyBwdXNoICAgJXNpCisgcHVzaCAgICVkaQorIHBvcCAgICAlYXgKKyBwb3AgICAgJWN4CisgcG9wICAgICVkeAorIHBvcCAgICAlYngKKyBwb3AgICAgJXNwCisgcG9wICAgICVicAorIHBvcCAgICAlc2kKKyBwb3AgICAgJWRpCisgcHVzaGF3CisgcG9wYXcKKyBib3VuZCAgJWR4LDB4OTA5MDkwOTAoJWVheCkKKyBwdXNodyAgJDB4OTA5MAorIGltdWwgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCksJWR4CisgcHVzaHcgICQweGZmZmZmZjkwCisgaW11bCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCksJWR4CisgaW5zdyAgICglZHgpLCVlczooJWVkaSkKKyBvdXRzdyAgJWRzOiglZXNpKSwoJWR4KQorIGFkY3cgICAkMHg5MDkwLDB4OTA5MDkwOTAoJWVheCkKKyBhZGN3ICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KQorIHRlc3QgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIHhjaGcgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIG1vdiAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQorIG1vdiAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIG1vdncgICAlc3MsMHg5MDkwOTA5MCglZWF4KQorIGxlYSAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIHBvcHcgICAweDkwOTA5MDkwKCVlYXgpCisgeGNoZyAgICVheCwlY3gKKyB4Y2hnICAgJWF4LCVkeAorIHhjaGcgICAlYXgsJWJ4CisgeGNoZyAgICVheCwlc3AKKyB4Y2hnICAgJWF4LCVicAorIHhjaGcgICAlYXgsJXNpCisgeGNoZyAgICVheCwlZGkKKyBjYnR3CisgY3d0ZAorIGxjYWxsdyAkMHg5MDkwLCQweDkwOTAKKyBwdXNoZncKKyBwb3BmdworIG1vdiAgICAweDkwOTA5MDkwLCVheAorIG1vdiAgICAlYXgsMHg5MDkwOTA5MAorIG1vdnN3ICAlZHM6KCVlc2kpLCVlczooJWVkaSkKKyBjbXBzdyAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCisgdGVzdCAgICQweDkwOTAsJWF4Cisgc3RvcyAgICVheCwlZXM6KCVlZGkpCisgbG9kcyAgICVkczooJWVzaSksJWF4Cisgc2NhcyAgICVlczooJWVkaSksJWF4CisgbW92ICAgICQweDkwOTAsJWF4CisgbW92ICAgICQweDkwOTAsJWN4CisgbW92ICAgICQweDkwOTAsJWR4CisgbW92ICAgICQweDkwOTAsJWJ4CisgbW92ICAgICQweDkwOTAsJXNwCisgbW92ICAgICQweDkwOTAsJWJwCisgbW92ICAgICQweDkwOTAsJXNpCisgbW92ICAgICQweDkwOTAsJWRpCisgcmNsdyAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKKyByZXR3ICAgJDB4OTA5MAorIHJldHcKKyBsZXMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBsZHMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBtb3Z3ICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpCisgZW50ZXJ3ICQweDkwOTAsJDB4OTAKKyBsZWF2ZXcKKyBscmV0dyAgJDB4OTA5MAorIGxyZXR3CisgaXJldHcKKyByY2x3ICAgMHg5MDkwOTA5MCglZWF4KQorIHJjbHcgICAlY2wsMHg5MDkwOTA5MCglZWF4KQorIGluICAgICAkMHg5MCwlYXgKKyBvdXQgICAgJWF4LCQweDkwCisgY2FsbHcgIC4rMysweDkwOTAKKyBsam1wdyAgJDB4OTA5MCwkMHg5MDkwCisgaW4gICAgICglZHgpLCVheAorIG91dCAgICAlYXgsKCVkeCkKKyBub3R3ICAgMHg5MDkwOTA5MCglZWF4KQorIGNhbGx3ICAqMHg5MDkwOTA5MCglZWF4KQorIGxhciAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGxzbCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZvICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZubyAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZiICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZhZSAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZlICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZuZSAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZiZSAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZhICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZzICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZucyAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZwICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZucCAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZsICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZnZSAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZsZSAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtb3ZnICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIHB1c2h3ICAlZnMKKyBwb3B3ICAgJWZzCisgYnQgICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCisgc2hsZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCisgc2hsZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQorIHB1c2h3ICAlZ3MKKyBwb3B3ICAgJWdzCisgYnRzICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCisgc2hyZCAgICQweDkwLCVkeCwweDkwOTA5MDkwKCVlYXgpCisgc2hyZCAgICVjbCwlZHgsMHg5MDkwOTA5MCglZWF4KQorIGltdWwgICAweDkwOTA5MDkwKCVlYXgpLCVkeAorIGNtcHhjaGcgJWR4LDB4OTA5MDkwOTAoJWVheCkKKyBsc3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBidHIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKKyBsZnMgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBsZ3MgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBtb3Z6YncgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBidGMgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKKyBic2YgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBic3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyBtb3ZzYncgMHg5MDkwOTA5MCglZWF4KSwlZHgKKyB4YWRkICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NGI2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCkBAIC0wLDAgKzEsMTUgQEAKKyNvYmpkdW1wOiAtZHcKKyNuYW1lOiBpMzg2IHByZWZpeAorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArMDAwIDxmb28+OgorICAgMDoJOWIgNjcgMjYgZDkgM2MgWyAJXSphZGRyMTYgZnN0Y3cgJWVzOlwoJXNpXCkKKyAgIDU6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAorICAgODoJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4CisgICBiOgk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKKyAgIGU6CTliIDY3IGRmIGUwIFsgCV0qYWRkcjE2IGZzdHN3ICVheAorICAxMjoJZjMgNjcgNjYgMzYgYTcgWyAJXSpyZXB6IGFkZHIxNiBjbXBzdyAlZXM6XCglZGlcKSwlc3M6XCglc2lcKQorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzZDMxMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMKQEAgLTAsMCArMSwxMSBAQAorLnRleHQKK2ZvbzoKKyBhZGRyMTYgZnN0Y3cgJWVzOiglc2kpCisgZnN0c3cKKyBmc3RzdyAlYXgKKyBmc3RzdyAlZWF4CisgYWRkcjE2IGZzdHN3ICVheAorIGFkZHIxNiByZXAgY21wc3cgJWVzOiglZGkpLCVzczooJXNpKQorCisgIyBHZXQgYSBnb29kIGFsaWdubWVudC4KKyAuYnl0ZSAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5MDNkZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MuZApAQCAtMCwwICsxLDE1IEBACisjb2JqZHVtcDogLWRydworI25hbWU6IGkzODYgcmVsb2MKKworLio6ICtmaWxlIGZvcm1hdCAuKmkzODYuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8Zm9vPjoKKyAgIDA6CWIzIDAwIFsgCV0qbW92ICAgIFwkMHgwLCVibAkxOiBSXzM4Nl84CS50ZXh0CisgICAyOgk2OCAwMCAwMCAwMCAwMCBbIAldKnB1c2ggICBcJDB4MAkzOiBSXzM4Nl8zMgkudGV4dAorICAgNzoJMDUgMDAgMDAgMDAgMDAgWyAJXSphZGQgICAgXCQweDAsJWVheAk4OiBSXzM4Nl8zMgkudGV4dAorICAgYzoJODEgYzMgMDAgMDAgMDAgMDAgWyAJXSphZGQgICAgXCQweDAsJWVieAllOiBSXzM4Nl8zMgkudGV4dAorICAxMjoJNjkgZDIgMDAgMDAgMDAgMDAgWyAJXSppbXVsICAgXCQweDAsJWVkeCwlZWR4CTE0OiBSXzM4Nl8zMgkudGV4dAorICAxODoJOWEgMDAgMDAgMDAgMDAgMDAgMDAgWyAJXSpsY2FsbCAgXCQweDAsXCQweDAJMTk6IFJfMzg2XzMyCS50ZXh0CisgIDFmOgk2NiA2OCAwMCAwMCBbIAldKnB1c2h3ICBcJDB4MAkyMTogUl8zODZfMTYJLnRleHQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VlOTMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zCkBAIC0wLDAgKzEsOCBAQAorLnRleHQKK2ZvbzoJbW92CSRmb28sICVibAorCXB1c2gJJGZvbworCWFkZAkkZm9vLCAlZWF4CisJYWRkCSRmb28sICVlYngKKwlpbXVsCSRmb28sICVlZHgKKwlsY2FsbAkkMCwgJGZvbworCXB1c2h3CSRmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvd2hpdGUubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2U2MTYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sCkBAIC0wLDAgKzEsMjEgQEAKK0dBUyBMSVNUSU5HIC4qCisKKworICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlLCBhbmQgdXBwZXItY2FzZQorICAgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5UZVh0IAorICAgMyAwMDAwIDM2ICAgICAgICAgICAgICAgICAgICAgICAgIAkJc3MgCisgICA0IDAwMDEgODgwMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgJSBhbCAsIFwoICUgZWJ4IFwpIAorICAgNSAwMDAzIEM3MDVENzExIDAwMDA3QjAwIDAwMDAgICAgIAkgICAgICAgIG1PdmwgXCQgMTIzICwgNDU2NyAKKyAgIDYgMDAwZCA2NzhBNzg3QiAgICAgICAgICAgICAgICAgICAJIEFERHIxNgltb3YgMTIzIFwoICUgYnggLCAlIHNpICwgMSBcKSAsICUgYmggCisgICA3IDAwMTEgRkZFMCAgICAgICAgICAgICAgICAgICAgICAgCQlqbXAgXCogJSBlYXggCisgICA4IDAwMTMgNjYyNkZGMjMgICAgICAgICAgICAgICAgICAgCWZvbzoJam1wdyAlIGVzIDogXCogXCggJSBlYnggXCkJCisgICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIAorICAxMCAwMDE3IEEwNTAwMDAwIDAwICAgICAgICAgICAgICAgIAkJbW92IFwoIDB4OCBcKiAwWGEgXCkgLCAlIGFsIAorICAxMSAwMDFjIEIwMjAgICAgICAgICAgICAgICAgICAgICAgIAkJbW92IFwkIFwoIDggXCogNCBcKSAsICUgYWwgCisgIDEyIDAwMWUgQjcxMyAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgZm9vICwgJSBiSCAKKyAgMTMgMDAyMCBCNzEzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdmIgXCQgZm9vICwgJSBCSCAKKyAgMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCisgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLkNPREUxNgkKKyAgMTYgMDAyMiA2NkI4MTMwMCAwMDAwICAgICAgICAgICAgICAJCU1vdiBcJCBmb28gLCAlZUF4CQorICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS5Db2RlMzIgCisgIDE4IDAwMjggNjZCODEzMDAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgZm9vICwgJWF4CQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjUwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLnMKQEAgLTAsMCArMSwxOCBAQAorIyB0ZXN0IGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UsIGFuZCB1cHBlci1jYXNlCisuVGVYdCAKKwlzcyAKKwltb3YgJSBhbCAsICggJSBlYnggKSAKKyAgICAgICAgbU92bCAkIDEyMyAsIDQ1NjcgCisgQUREcjE2CW1vdiAxMjMgKCAlIGJ4ICwgJSBzaSAsIDEgKSAsICUgYmggCisJam1wICogJSBlYXggCitmb286CWptcHcgJSBlcyA6ICogKCAlIGVieCApCQorIAorCW1vdiAoIDB4OCAqIDBYYSApICwgJSBhbCAKKwltb3YgJCAoIDggKiA0ICkgLCAlIGFsIAorCW1vdiAkIGZvbyAsICUgYkggCisJbW92YiAkIGZvbyAsICUgQkggCisJCisuQ09ERTE2CQorCU1vdiAkIGZvbyAsICVlQXgJCisuQ29kZTMyIAorCW1vdiAkIGZvbyAsICVheAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4OGQyYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwCkBAIC0wLDAgKzEsMjUgQEAKKyMgUmVwb3J0ZWQgOTMvMDUvMDkgYnkgSmltIFdpbHNvbjogSUVFRSBzaW5nbGUtcHJlY2lzaW9uIEZMVF9NSU4gdmFsdWUgZ2V0cworIyBhc3NlbWJsZWQgaW5jb3JyZWN0bHkuICAoT2ZmIGJ5IG9uZSB1bHAuKQorCitwcm9jIGRvdGVzdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJJRUVFIEZMVF9NSU4sIHNpbmdsZS1wcmVjaXNpb24iCisgICAgc2V0IHggMAorICAgIGdhc19zdGFydCAieDkzMDUwOWEucyIgIi1hbCIKKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIiAwMDAwODAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KKwkgICAgLXJlICIgMDA4MDAwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9CisJICAgIC1yZSAiIDAwODAgMDAwMFxbIAlcXSsuc2luZ2xlIiB7IHBhc3MgJHRlc3RuYW1lOyBzZXQgeCAxIH0KKwkgICAgLXJlICIgLi4uLi4uLi4gKy5zaW5nbGUiIHsgZmFpbCAkdGVzdG5hbWU7IHNldCB4IDEgfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iIHsgfQorCSAgICB0aW1lb3V0IHsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZiB7IGJyZWFrIH0KKwl9CisgICAgfQorICAgIGdhc19maW5pc2gKKyAgICBpZiAhJHggdGhlbiB7IGZhaWwgIiR0ZXN0bmFtZSAobGlzdGluZyBkaWRuJ3QgbWF0Y2gpIiB9Cit9CisKK2lmICFbaXN0YXJnZXQgdmF4Ki0qLSpdIHRoZW4geworICAgIGRvdGVzdAorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MWIzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMKQEAgLTAsMCArMSw1IEBACisgICAgICAgIC5nbG9iYWwgX2ZsdF9taW4KKwkuZGF0YQorICAgICAgICAuYWxpZ24gNAorX2ZsdF9taW46CisgICAgICAgIC5zaW5nbGUgMHIxLjE3NTQ5NDM1ZS0zOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk2NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLmQKQEAgLTAsMCArMSwzNzQgQEAKKyNhczoKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBhbGxpbnNuCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCswMDAwIDxhZGQ+OgorICAgMDoJMGQgYWQgZjAgMDAgCWFkZCBmcCxmcCBcfFx8IG5vcAorCiswKzAwMDQgPGFkZDM+OgorICAgNDoJOGQgYWQgMDAgMDAgCWFkZDMgZnAsZnAsWyNdKjAKKworMCswMDA4IDxhbmQ+OgorICAgODoJMGQgY2QgZjAgMDAgCWFuZCBmcCxmcCBcfFx8IG5vcAorCiswKzAwMGMgPGFuZDM+OgorICAgYzoJOGQgY2QgMDAgMDAgCWFuZDMgZnAsZnAsWyNdKjB4MAorCiswKzAwMTAgPG9yPjoKKyAgMTA6CTBkIGVkIGYwIDAwIAlvciBmcCxmcCBcfFx8IG5vcAorCiswKzAwMTQgPG9yMz46CisgIDE0Ogk4ZCBlZCAwMCAwMCAJb3IzIGZwLGZwLFsjXSoweDAKKworMCswMDE4IDx4b3I+OgorICAxODoJMGQgZGQgZjAgMDAgCXhvciBmcCxmcCBcfFx8IG5vcAorCiswKzAwMWMgPHhvcjM+OgorICAxYzoJOGQgZGQgMDAgMDAgCXhvcjMgZnAsZnAsWyNdKjB4MAorCiswKzAwMjAgPGFkZGk+OgorICAyMDoJNGQgMDAgZjAgMDAgCWFkZGkgZnAsWyNdKjAgXHxcfCBub3AKKworMCswMDI0IDxhZGR2PjoKKyAgMjQ6CTBkIDhkIGYwIDAwIAlhZGR2IGZwLGZwIFx8XHwgbm9wCisKKzArMDAyOCA8YWRkdjM+OgorICAyODoJOGQgOGQgMDAgMDAgCWFkZHYzIGZwLGZwLFsjXSowCisKKzArMDAyYyA8YWRkeD46CisgIDJjOgkwZCA5ZCBmMCAwMCAJYWRkeCBmcCxmcCBcfFx8IG5vcAorCiswKzAwMzAgPGJjOD46CisgIDMwOgk3YyBmNCBmMCAwMCAJYmMgMCA8YWRkPiBcfFx8IG5vcAorCiswKzAwMzQgPGJjOF9zPjoKKyAgMzQ6CTdjIGYzIGYwIDAwIAliYyAwIDxhZGQ+IFx8XHwgbm9wCisKKzArMDAzOCA8YmMyND46CisgIDM4Ogk3YyBmMiBmMCAwMCAJYmMgMCA8YWRkPiBcfFx8IG5vcAorCiswKzAwM2MgPGJjMjRfbD46CisgIDNjOglmYyBmZiBmZiBmMSAJYmMgMCA8YWRkPgorCiswKzAwNDAgPGJlcT46CisgIDQwOgliZCAwZCBmZiBmMCAJYmVxIGZwLGZwLDAgPGFkZD4KKworMCswMDQ0IDxiZXF6PjoKKyAgNDQ6CWIwIDhkIGZmIGVmIAliZXF6IGZwLDAgPGFkZD4KKworMCswMDQ4IDxiZ2V6PjoKKyAgNDg6CWIwIGJkIGZmIGVlIAliZ2V6IGZwLDAgPGFkZD4KKworMCswMDRjIDxiZ3R6PjoKKyAgNGM6CWIwIGRkIGZmIGVkIAliZ3R6IGZwLDAgPGFkZD4KKworMCswMDUwIDxibGV6PjoKKyAgNTA6CWIwIGNkIGZmIGVjIAlibGV6IGZwLDAgPGFkZD4KKworMCswMDU0IDxibHR6PjoKKyAgNTQ6CWIwIGFkIGZmIGViIAlibHR6IGZwLDAgPGFkZD4KKworMCswMDU4IDxibmV6PjoKKyAgNTg6CWIwIDlkIGZmIGVhIAlibmV6IGZwLDAgPGFkZD4KKworMCswMDVjIDxibDg+OgorICA1YzoJN2UgZTkgZjAgMDAgCWJsIDAgPGFkZD4gXHxcfCBub3AKKworMCswMDYwIDxibDhfcz46CisgIDYwOgk3ZSBlOCBmMCAwMCAJYmwgMCA8YWRkPiBcfFx8IG5vcAorCiswKzAwNjQgPGJsMjQ+OgorICA2NDoJN2UgZTcgZjAgMDAgCWJsIDAgPGFkZD4gXHxcfCBub3AKKworMCswMDY4IDxibDI0X2w+OgorICA2ODoJZmUgZmYgZmYgZTYgCWJsIDAgPGFkZD4KKworMCswMDZjIDxibmM4PjoKKyAgNmM6CTdkIGU1IGYwIDAwIAlibmMgMCA8YWRkPiBcfFx8IG5vcAorCiswKzAwNzAgPGJuYzhfcz46CisgIDcwOgk3ZCBlNCBmMCAwMCAJYm5jIDAgPGFkZD4gXHxcfCBub3AKKworMCswMDc0IDxibmMyND46CisgIDc0Ogk3ZCBlMyBmMCAwMCAJYm5jIDAgPGFkZD4gXHxcfCBub3AKKworMCswMDc4IDxibmMyNF9sPjoKKyAgNzg6CWZkIGZmIGZmIGUyIAlibmMgMCA8YWRkPgorCiswKzAwN2MgPGJuZT46CisgIDdjOgliZCAxZCBmZiBlMSAJYm5lIGZwLGZwLDAgPGFkZD4KKworMCswMDgwIDxicmE4PjoKKyAgODA6CTdmIGUwIGYwIDAwIAlicmEgMCA8YWRkPiBcfFx8IG5vcAorCiswKzAwODQgPGJyYThfcz46CisgIDg0Ogk3ZiBkZiBmMCAwMCAJYnJhIDAgPGFkZD4gXHxcfCBub3AKKworMCswMDg4IDxicmEyND46CisgIDg4Ogk3ZiBkZSBmMCAwMCAJYnJhIDAgPGFkZD4gXHxcfCBub3AKKworMCswMDhjIDxicmEyNF9sPjoKKyAgOGM6CWZmIGZmIGZmIGRkIAlicmEgMCA8YWRkPgorCiswKzAwOTAgPGNtcD46CisgIDkwOgkwZCA0ZCBmMCAwMCAJY21wIGZwLGZwIFx8XHwgbm9wCisKKzArMDA5NCA8Y21waT46CisgIDk0Ogk4MCA0ZCAwMCAwMCAJY21waSBmcCxbI10qMAorCiswKzAwOTggPGNtcHU+OgorICA5ODoJMGQgNWQgZjAgMDAgCWNtcHUgZnAsZnAgXHxcfCBub3AKKworMCswMDljIDxjbXB1aT46CisgIDljOgk4MCA1ZCAwMCAwMCAJY21wdWkgZnAsWyNdKjAKKworMCswMGEwIDxkaXY+OgorICBhMDoJOWQgMGQgMDAgMDAgCWRpdiBmcCxmcAorCiswKzAwYTQgPGRpdnU+OgorICBhNDoJOWQgMWQgMDAgMDAgCWRpdnUgZnAsZnAKKworMCswMGE4IDxyZW0+OgorICBhODoJOWQgMmQgMDAgMDAgCXJlbSBmcCxmcAorCiswKzAwYWMgPHJlbXU+OgorICBhYzoJOWQgM2QgMDAgMDAgCXJlbXUgZnAsZnAKKworMCswMGIwIDxqbD46CisgIGIwOgkxZSBjZCBmMCAwMCAJamwgZnAgXHxcfCBub3AKKworMCswMGI0IDxqbXA+OgorICBiNDoJMWYgY2QgZjAgMDAgCWptcCBmcCBcfFx8IG5vcAorCiswKzAwYjggPGxkPjoKKyAgYjg6CTJkIGNkIGYwIDAwIAlsZCBmcCxAZnAgXHxcfCBub3AKKworMCswMGJjIDxsZF8yPjoKKyAgYmM6CTJkIGNkIGYwIDAwIAlsZCBmcCxAZnAgXHxcfCBub3AKKworMCswMGMwIDxsZF9kPjoKKyAgYzA6CWFkIGNkIDAwIDAwIAlsZCBmcCxAXCgwLGZwXCkKKworMCswMGM0IDxsZF9kMj46CisgIGM0OglhZCBjZCAwMCAwMCAJbGQgZnAsQFwoMCxmcFwpCisKKzArMDBjOCA8bGRiPjoKKyAgYzg6CTJkIDhkIGYwIDAwIAlsZGIgZnAsQGZwIFx8XHwgbm9wCisKKzArMDBjYyA8bGRiXzI+OgorICBjYzoJMmQgOGQgZjAgMDAgCWxkYiBmcCxAZnAgXHxcfCBub3AKKworMCswMGQwIDxsZGJfZD46CisgIGQwOglhZCA4ZCAwMCAwMCAJbGRiIGZwLEBcKDAsZnBcKQorCiswKzAwZDQgPGxkYl9kMj46CisgIGQ0OglhZCA4ZCAwMCAwMCAJbGRiIGZwLEBcKDAsZnBcKQorCiswKzAwZDggPGxkaD46CisgIGQ4OgkyZCBhZCBmMCAwMCAJbGRoIGZwLEBmcCBcfFx8IG5vcAorCiswKzAwZGMgPGxkaF8yPjoKKyAgZGM6CTJkIGFkIGYwIDAwIAlsZGggZnAsQGZwIFx8XHwgbm9wCisKKzArMDBlMCA8bGRoX2Q+OgorICBlMDoJYWQgYWQgMDAgMDAgCWxkaCBmcCxAXCgwLGZwXCkKKworMCswMGU0IDxsZGhfZDI+OgorICBlNDoJYWQgYWQgMDAgMDAgCWxkaCBmcCxAXCgwLGZwXCkKKworMCswMGU4IDxsZHViPjoKKyAgZTg6CTJkIDlkIGYwIDAwIAlsZHViIGZwLEBmcCBcfFx8IG5vcAorCiswKzAwZWMgPGxkdWJfMj46CisgIGVjOgkyZCA5ZCBmMCAwMCAJbGR1YiBmcCxAZnAgXHxcfCBub3AKKworMCswMGYwIDxsZHViX2Q+OgorICBmMDoJYWQgOWQgMDAgMDAgCWxkdWIgZnAsQFwoMCxmcFwpCisKKzArMDBmNCA8bGR1Yl9kMj46CisgIGY0OglhZCA5ZCAwMCAwMCAJbGR1YiBmcCxAXCgwLGZwXCkKKworMCswMGY4IDxsZHVoPjoKKyAgZjg6CTJkIGJkIGYwIDAwIAlsZHVoIGZwLEBmcCBcfFx8IG5vcAorCiswKzAwZmMgPGxkdWhfMj46CisgIGZjOgkyZCBiZCBmMCAwMCAJbGR1aCBmcCxAZnAgXHxcfCBub3AKKworMCswMTAwIDxsZHVoX2Q+OgorIDEwMDoJYWQgYmQgMDAgMDAgCWxkdWggZnAsQFwoMCxmcFwpCisKKzArMDEwNCA8bGR1aF9kMj46CisgMTA0OglhZCBiZCAwMCAwMCAJbGR1aCBmcCxAXCgwLGZwXCkKKworMCswMTA4IDxsZF9wbHVzPjoKKyAxMDg6CTJkIGVkIGYwIDAwIAlsZCBmcCxAZnBcKyBcfFx8IG5vcAorCiswKzAxMGMgPGxkMjQ+OgorIDEwYzoJZWQgMDAgMDAgMDAgCWxkMjQgZnAsWyNdKjAgPGFkZD4KKwkJCTEwYzogUl9NMzJSXzI0CS5kYXRhCisKKzArMDExMCA8bGRpOD46CisgMTEwOgk2ZCAwMCBmMCAwMCAJbGRpIGZwLFsjXSowIFx8XHwgbm9wCisKKzArMDExNCA8bGRpMTY+OgorIDExNDoJOWQgZjAgMDEgMDAgCWxkaSBmcCxbI10qMjU2CisKKzArMDExOCA8bG9jaz46CisgMTE4OgkyZCBkZCBmMCAwMCAJbG9jayBmcCxAZnAgXHxcfCBub3AKKworMCswMTFjIDxtYWNoaT46CisgMTFjOgkzZCA0ZCBmMCAwMCAJbWFjaGkgZnAsZnAgXHxcfCBub3AKKworMCswMTIwIDxtYWNsbz46CisgMTIwOgkzZCA1ZCBmMCAwMCAJbWFjbG8gZnAsZnAgXHxcfCBub3AKKworMCswMTI0IDxtYWN3aGk+OgorIDEyNDoJM2QgNmQgZjAgMDAgCW1hY3doaSBmcCxmcCBcfFx8IG5vcAorCiswKzAxMjggPG1hY3dsbz46CisgMTI4OgkzZCA3ZCBmMCAwMCAJbWFjd2xvIGZwLGZwIFx8XHwgbm9wCisKKzArMDEyYyA8bXVsPjoKKyAxMmM6CTFkIDZkIGYwIDAwIAltdWwgZnAsZnAgXHxcfCBub3AKKworMCswMTMwIDxtdWxoaT46CisgMTMwOgkzZCAwZCBmMCAwMCAJbXVsaGkgZnAsZnAgXHxcfCBub3AKKworMCswMTM0IDxtdWxsbz46CisgMTM0OgkzZCAxZCBmMCAwMCAJbXVsbG8gZnAsZnAgXHxcfCBub3AKKworMCswMTM4IDxtdWx3aGk+OgorIDEzODoJM2QgMmQgZjAgMDAgCW11bHdoaSBmcCxmcCBcfFx8IG5vcAorCiswKzAxM2MgPG11bHdsbz46CisgMTNjOgkzZCAzZCBmMCAwMCAJbXVsd2xvIGZwLGZwIFx8XHwgbm9wCisKKzArMDE0MCA8bXY+OgorIDE0MDoJMWQgOGQgZjAgMDAgCW12IGZwLGZwIFx8XHwgbm9wCisKKzArMDE0NCA8bXZmYWNoaT46CisgMTQ0Ogk1ZCBmMCBmMCAwMCAJbXZmYWNoaSBmcCBcfFx8IG5vcAorCiswKzAxNDggPG12ZmFjbG8+OgorIDE0ODoJNWQgZjEgZjAgMDAgCW12ZmFjbG8gZnAgXHxcfCBub3AKKworMCswMTRjIDxtdmZhY21pPjoKKyAxNGM6CTVkIGYyIGYwIDAwIAltdmZhY21pIGZwIFx8XHwgbm9wCisKKzArMDE1MCA8bXZmYz46CisgMTUwOgkxZCA5MCBmMCAwMCAJbXZmYyBmcCxwc3cgXHxcfCBub3AKKworMCswMTU0IDxtdnRhY2hpPjoKKyAxNTQ6CTVkIDcwIGYwIDAwIAltdnRhY2hpIGZwIFx8XHwgbm9wCisKKzArMDE1OCA8bXZ0YWNsbz46CisgMTU4Ogk1ZCA3MSBmMCAwMCAJbXZ0YWNsbyBmcCBcfFx8IG5vcAorCiswKzAxNWMgPG12dGM+OgorIDE1YzoJMTAgYWQgZjAgMDAgCW12dGMgZnAscHN3IFx8XHwgbm9wCisKKzArMDE2MCA8bmVnPjoKKyAxNjA6CTBkIDNkIGYwIDAwIAluZWcgZnAsZnAgXHxcfCBub3AKKworMCswMTY0IDxub3A+OgorIDE2NDoJNzAgMDAgZjAgMDAgCW5vcCBcfFx8IG5vcAorCiswKzAxNjggPG5vdD46CisgMTY4OgkwZCBiZCBmMCAwMCAJbm90IGZwLGZwIFx8XHwgbm9wCisKKzArMDE2YyA8cmFjPjoKKyAxNmM6CWRkIGMwIDAwIDAwIAlzZXRoIGZwLFsjXSoweDAKKworMCswMTcwIDxzbGw+OgorIDE3MDoJMWQgNGQgZjAgMDAgCXNsbCBmcCxmcCBcfFx8IG5vcAorCiswKzAxNzQgPHNsbDM+OgorIDE3NDoJOWQgY2QgMDAgMDAgCXNsbDMgZnAsZnAsWyNdKjAKKworMCswMTc4IDxzbGxpPjoKKyAxNzg6CTVkIDQwIGYwIDAwIAlzbGxpIGZwLFsjXSoweDAgXHxcfCBub3AKKworMCswMTdjIDxzcmE+OgorIDE3YzoJMWQgMmQgZjAgMDAgCXNyYSBmcCxmcCBcfFx8IG5vcAorCiswKzAxODAgPHNyYTM+OgorIDE4MDoJOWQgYWQgMDAgMDAgCXNyYTMgZnAsZnAsWyNdKjAKKworMCswMTg0IDxzcmFpPjoKKyAxODQ6CTVkIDIwIGYwIDAwIAlzcmFpIGZwLFsjXSoweDAgXHxcfCBub3AKKworMCswMTg4IDxzcmw+OgorIDE4ODoJMWQgMGQgZjAgMDAgCXNybCBmcCxmcCBcfFx8IG5vcAorCiswKzAxOGMgPHNybDM+OgorIDE4YzoJOWQgOGQgMDAgMDAgCXNybDMgZnAsZnAsWyNdKjAKKworMCswMTkwIDxzcmxpPjoKKyAxOTA6CTVkIDAwIGYwIDAwIAlzcmxpIGZwLFsjXSoweDAgXHxcfCBub3AKKworMCswMTk0IDxzdD46CisgMTk0OgkyZCA0ZCBmMCAwMCAJc3QgZnAsQGZwIFx8XHwgbm9wCisKKzArMDE5OCA8c3RfMj46CisgMTk4OgkyZCA0ZCBmMCAwMCAJc3QgZnAsQGZwIFx8XHwgbm9wCisKKzArMDE5YyA8c3RfZD46CisgMTljOglhZCA0ZCAwMCAwMCAJc3QgZnAsQFwoMCxmcFwpCisKKzArMDFhMCA8c3RfZDI+OgorIDFhMDoJYWQgNGQgMDAgMDAgCXN0IGZwLEBcKDAsZnBcKQorCiswKzAxYTQgPHN0Yj46CisgMWE0OgkyZCAwZCBmMCAwMCAJc3RiIGZwLEBmcCBcfFx8IG5vcAorCiswKzAxYTggPHN0Yl8yPjoKKyAxYTg6CTJkIDBkIGYwIDAwIAlzdGIgZnAsQGZwIFx8XHwgbm9wCisKKzArMDFhYyA8c3RiX2Q+OgorIDFhYzoJYWQgMGQgMDAgMDAgCXN0YiBmcCxAXCgwLGZwXCkKKworMCswMWIwIDxzdGJfZDI+OgorIDFiMDoJYWQgMGQgMDAgMDAgCXN0YiBmcCxAXCgwLGZwXCkKKworMCswMWI0IDxzdGg+OgorIDFiNDoJMmQgMmQgZjAgMDAgCXN0aCBmcCxAZnAgXHxcfCBub3AKKworMCswMWI4IDxzdGhfMj46CisgMWI4OgkyZCAyZCBmMCAwMCAJc3RoIGZwLEBmcCBcfFx8IG5vcAorCiswKzAxYmMgPHN0aF9kPjoKKyAxYmM6CWFkIDJkIDAwIDAwIAlzdGggZnAsQFwoMCxmcFwpCisKKzArMDFjMCA8c3RoX2QyPjoKKyAxYzA6CWFkIDJkIDAwIDAwIAlzdGggZnAsQFwoMCxmcFwpCisKKzArMDFjNCA8c3RfcGx1cz46CisgMWM0OgkyZCA2ZCBmMCAwMCAJc3QgZnAsQFwrZnAgXHxcfCBub3AKKworMCswMWM4IDxzdF9taW51cz46CisgMWM4OgkyZCA3ZCBmMCAwMCAJc3QgZnAsQC1mcCBcfFx8IG5vcAorCiswKzAxY2MgPHN1Yj46CisgMWNjOgkwZCAyZCBmMCAwMCAJc3ViIGZwLGZwIFx8XHwgbm9wCisKKzArMDFkMCA8c3Vidj46CisgMWQwOgkwZCAwZCBmMCAwMCAJc3VidiBmcCxmcCBcfFx8IG5vcAorCiswKzAxZDQgPHN1Yng+OgorIDFkNDoJMGQgMWQgZjAgMDAgCXN1YnggZnAsZnAgXHxcfCBub3AKKworMCswMWQ4IDx0cmFwPjoKKyAxZDg6CTEwIGYwIGYwIDAwIAl0cmFwIFsjXSoweDAgXHxcfCBub3AKKworMCswMWRjIDx1bmxvY2s+OgorIDFkYzoJMmQgNWQgZjAgMDAgCXVubG9jayBmcCxAZnAgXHxcfCBub3AKKworMCswMWUwIDxwdXNoPjoKKyAxZTA6CTJkIDdmIGYwIDAwIAlwdXNoIGZwIFx8XHwgbm9wCisKKzArMDFlNCA8cG9wPjoKKyAxZTQ6CTJkIGVmIGYwIDAwIAlwb3AgZnAgXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGRkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwCkBAIC0wLDAgKzEsNSBAQAorIyBNMzJSIGFzc2VtYmxlciB0ZXN0c3VpdGUuCisKK2lmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKKyAgICBydW5fZHVtcF90ZXN0ICJhbGxpbnNuIgorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI0NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMKQEAgLTAsMCArMSw1MDEgQEAKKyAuZGF0YQorZm9vZGF0YTogLndvcmQgNDIKKyAudGV4dAorZm9vdGV4dDoKKwkudGV4dAorCS5nbG9iYWwgYWRkCithZGQ6CisJYWRkIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIGFkZDMKK2FkZDM6CisJYWRkMyBmcCxmcCwjMAorCS50ZXh0CisJLmdsb2JhbCBhbmQKK2FuZDoKKwlhbmQgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgYW5kMworYW5kMzoKKwlhbmQzIGZwLGZwLCMwCisJLnRleHQKKwkuZ2xvYmFsIG9yCitvcjoKKwlvciBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBvcjMKK29yMzoKKwlvcjMgZnAsZnAsIzAKKwkudGV4dAorCS5nbG9iYWwgeG9yCit4b3I6CisJeG9yIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIHhvcjMKK3hvcjM6CisJeG9yMyBmcCxmcCwjMAorCS50ZXh0CisJLmdsb2JhbCBhZGRpCithZGRpOgorCWFkZGkgZnAsIzAKKwkudGV4dAorCS5nbG9iYWwgYWRkdgorYWRkdjoKKwlhZGR2IGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIGFkZHYzCithZGR2MzoKKwlhZGR2MyBmcCxmcCwjMAorCS50ZXh0CisJLmdsb2JhbCBhZGR4CithZGR4OgorCWFkZHggZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgYmM4CitiYzg6CisJYmMgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBiYzhfcworYmM4X3M6CisJYmMucyBmb290ZXh0CisJLnRleHQKKwkuZ2xvYmFsIGJjMjQKK2JjMjQ6CisJYmMgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBiYzI0X2wKK2JjMjRfbDoKKwliYy5sIGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmVxCitiZXE6CisJYmVxIGZwLGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmVxegorYmVxejoKKwliZXF6IGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmdlegorYmdlejoKKwliZ2V6IGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmd0egorYmd0ejoKKwliZ3R6IGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmxlegorYmxlejoKKwlibGV6IGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmx0egorYmx0ejoKKwlibHR6IGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYm5legorYm5lejoKKwlibmV6IGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYmw4CitibDg6CisJYmwgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBibDhfcworYmw4X3M6CisJYmwucyBmb290ZXh0CisJLnRleHQKKwkuZ2xvYmFsIGJsMjQKK2JsMjQ6CisJYmwgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBibDI0X2wKK2JsMjRfbDoKKwlibC5sIGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYm5jOAorYm5jODoKKwlibmMgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBibmM4X3MKK2JuYzhfczoKKwlibmMucyBmb290ZXh0CisJLnRleHQKKwkuZ2xvYmFsIGJuYzI0CitibmMyNDoKKwlibmMgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBibmMyNF9sCitibmMyNF9sOgorCWJuYy5sIGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYm5lCitibmU6CisJYm5lIGZwLGZwLGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgYnJhOAorYnJhODoKKwlicmEgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBicmE4X3MKK2JyYThfczoKKwlicmEucyBmb290ZXh0CisJLnRleHQKKwkuZ2xvYmFsIGJyYTI0CiticmEyNDoKKwlicmEgZm9vdGV4dAorCS50ZXh0CisJLmdsb2JhbCBicmEyNF9sCiticmEyNF9sOgorCWJyYS5sIGZvb3RleHQKKwkudGV4dAorCS5nbG9iYWwgY21wCitjbXA6CisJY21wIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIGNtcGkKK2NtcGk6CisJY21waSBmcCwjMAorCS50ZXh0CisJLmdsb2JhbCBjbXB1CitjbXB1OgorCWNtcHUgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgY21wdWkKK2NtcHVpOgorCWNtcHVpIGZwLCMwCisJLnRleHQKKwkuZ2xvYmFsIGRpdgorZGl2OgorCWRpdiBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBkaXZ1CitkaXZ1OgorCWRpdnUgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgcmVtCityZW06CisJcmVtIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIHJlbXUKK3JlbXU6CisJcmVtdSBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBqbAoramw6CisJamwgZnAKKwkudGV4dAorCS5nbG9iYWwgam1wCitqbXA6CisJam1wIGZwCisJLnRleHQKKwkuZ2xvYmFsIGxkCitsZDoKKwlsZCBmcCxAZnAKKwkudGV4dAorCS5nbG9iYWwgbGRfMgorbGRfMjoKKwlsZCBmcCxAKGZwKQorCS50ZXh0CisJLmdsb2JhbCBsZF9kCitsZF9kOgorCWxkIGZwLEAoMCxmcCkKKwkudGV4dAorCS5nbG9iYWwgbGRfZDIKK2xkX2QyOgorCWxkIGZwLEAoZnAsMCkKKwkudGV4dAorCS5nbG9iYWwgbGRiCitsZGI6CisJbGRiIGZwLEBmcAorCS50ZXh0CisJLmdsb2JhbCBsZGJfMgorbGRiXzI6CisJbGRiIGZwLEAoZnApCisJLnRleHQKKwkuZ2xvYmFsIGxkYl9kCitsZGJfZDoKKwlsZGIgZnAsQCgwLGZwKQorCS50ZXh0CisJLmdsb2JhbCBsZGJfZDIKK2xkYl9kMjoKKwlsZGIgZnAsQChmcCwwKQorCS50ZXh0CisJLmdsb2JhbCBsZGgKK2xkaDoKKwlsZGggZnAsQGZwCisJLnRleHQKKwkuZ2xvYmFsIGxkaF8yCitsZGhfMjoKKwlsZGggZnAsQChmcCkKKwkudGV4dAorCS5nbG9iYWwgbGRoX2QKK2xkaF9kOgorCWxkaCBmcCxAKDAsZnApCisJLnRleHQKKwkuZ2xvYmFsIGxkaF9kMgorbGRoX2QyOgorCWxkaCBmcCxAKGZwLDApCisJLnRleHQKKwkuZ2xvYmFsIGxkdWIKK2xkdWI6CisJbGR1YiBmcCxAZnAKKwkudGV4dAorCS5nbG9iYWwgbGR1Yl8yCitsZHViXzI6CisJbGR1YiBmcCxAKGZwKQorCS50ZXh0CisJLmdsb2JhbCBsZHViX2QKK2xkdWJfZDoKKwlsZHViIGZwLEAoMCxmcCkKKwkudGV4dAorCS5nbG9iYWwgbGR1Yl9kMgorbGR1Yl9kMjoKKwlsZHViIGZwLEAoZnAsMCkKKwkudGV4dAorCS5nbG9iYWwgbGR1aAorbGR1aDoKKwlsZHVoIGZwLEBmcAorCS50ZXh0CisJLmdsb2JhbCBsZHVoXzIKK2xkdWhfMjoKKwlsZHVoIGZwLEAoZnApCisJLnRleHQKKwkuZ2xvYmFsIGxkdWhfZAorbGR1aF9kOgorCWxkdWggZnAsQCgwLGZwKQorCS50ZXh0CisJLmdsb2JhbCBsZHVoX2QyCitsZHVoX2QyOgorCWxkdWggZnAsQChmcCwwKQorCS50ZXh0CisJLmdsb2JhbCBsZF9wbHVzCitsZF9wbHVzOgorCWxkIGZwLEBmcCsKKwkudGV4dAorCS5nbG9iYWwgbGQyNAorbGQyNDoKKwlsZDI0IGZwLGZvb2RhdGEKKwkudGV4dAorCS5nbG9iYWwgbGRpOAorbGRpODoKKwlsZGkgZnAsMAorCS50ZXh0CisJLmdsb2JhbCBsZGkxNgorbGRpMTY6CisJbGRpIGZwLDI1NgorCS50ZXh0CisJLmdsb2JhbCBsb2NrCitsb2NrOgorCWxvY2sgZnAsQGZwCisJLnRleHQKKwkuZ2xvYmFsIG1hY2hpCittYWNoaToKKwltYWNoaSBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBtYWNsbworbWFjbG86CisJbWFjbG8gZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgbWFjd2hpCittYWN3aGk6CisJbWFjd2hpIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIG1hY3dsbworbWFjd2xvOgorCW1hY3dsbyBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBtdWwKK211bDoKKwltdWwgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgbXVsaGkKK211bGhpOgorCW11bGhpIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIG11bGxvCittdWxsbzoKKwltdWxsbyBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBtdWx3aGkKK211bHdoaToKKwltdWx3aGkgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgbXVsd2xvCittdWx3bG86CisJbXVsd2xvIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIG12CittdjoKKwltdiBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBtdmZhY2hpCittdmZhY2hpOgorCW12ZmFjaGkgZnAKKwkudGV4dAorCS5nbG9iYWwgbXZmYWNsbworbXZmYWNsbzoKKwltdmZhY2xvIGZwCisJLnRleHQKKwkuZ2xvYmFsIG12ZmFjbWkKK212ZmFjbWk6CisJbXZmYWNtaSBmcAorCS50ZXh0CisJLmdsb2JhbCBtdmZjCittdmZjOgorCW12ZmMgZnAscHN3CisJLnRleHQKKwkuZ2xvYmFsIG12dGFjaGkKK212dGFjaGk6CisJbXZ0YWNoaSBmcAorCS50ZXh0CisJLmdsb2JhbCBtdnRhY2xvCittdnRhY2xvOgorCW12dGFjbG8gZnAKKwkudGV4dAorCS5nbG9iYWwgbXZ0YworbXZ0YzoKKwltdnRjIGZwLHBzdworCS50ZXh0CisJLmdsb2JhbCBuZWcKK25lZzoKKwluZWcgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgbm9wCitub3A6CisJbm9wCisJLnRleHQKKwkuZ2xvYmFsIG5vdAorbm90OgorCW5vdCBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCByYWMKK3JhYzoKKwkudGV4dAorCS5nbG9iYWwgcmFjaAorcmFjaDoKKwkudGV4dAorCS5nbG9iYWwgcnRlCitydGU6CisJLnRleHQKKwkuZ2xvYmFsIHNldGgKK3NldGg6CisJc2V0aCBmcCwwCisJLnRleHQKKwkuZ2xvYmFsIHNsbAorc2xsOgorCXNsbCBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCBzbGwzCitzbGwzOgorCXNsbDMgZnAsZnAsMAorCS50ZXh0CisJLmdsb2JhbCBzbGxpCitzbGxpOgorCXNsbGkgZnAsMAorCS50ZXh0CisJLmdsb2JhbCBzcmEKK3NyYToKKwlzcmEgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgc3JhMworc3JhMzoKKwlzcmEzIGZwLGZwLDAKKwkudGV4dAorCS5nbG9iYWwgc3JhaQorc3JhaToKKwlzcmFpIGZwLDAKKwkudGV4dAorCS5nbG9iYWwgc3JsCitzcmw6CisJc3JsIGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIHNybDMKK3NybDM6CisJc3JsMyBmcCxmcCwwCisJLnRleHQKKwkuZ2xvYmFsIHNybGkKK3NybGk6CisJc3JsaSBmcCwwCisJLnRleHQKKwkuZ2xvYmFsIHN0CitzdDoKKwlzdCBmcCxAZnAKKwkudGV4dAorCS5nbG9iYWwgc3RfMgorc3RfMjoKKwlzdCBmcCxAKGZwKQorCS50ZXh0CisJLmdsb2JhbCBzdF9kCitzdF9kOgorCXN0IGZwLEAoMCxmcCkKKwkudGV4dAorCS5nbG9iYWwgc3RfZDIKK3N0X2QyOgorCXN0IGZwLEAoZnAsMCkKKwkudGV4dAorCS5nbG9iYWwgc3RiCitzdGI6CisJc3RiIGZwLEBmcAorCS50ZXh0CisJLmdsb2JhbCBzdGJfMgorc3RiXzI6CisJc3RiIGZwLEAoZnApCisJLnRleHQKKwkuZ2xvYmFsIHN0Yl9kCitzdGJfZDoKKwlzdGIgZnAsQCgwLGZwKQorCS50ZXh0CisJLmdsb2JhbCBzdGJfZDIKK3N0Yl9kMjoKKwlzdGIgZnAsQChmcCwwKQorCS50ZXh0CisJLmdsb2JhbCBzdGgKK3N0aDoKKwlzdGggZnAsQGZwCisJLnRleHQKKwkuZ2xvYmFsIHN0aF8yCitzdGhfMjoKKwlzdGggZnAsQChmcCkKKwkudGV4dAorCS5nbG9iYWwgc3RoX2QKK3N0aF9kOgorCXN0aCBmcCxAKDAsZnApCisJLnRleHQKKwkuZ2xvYmFsIHN0aF9kMgorc3RoX2QyOgorCXN0aCBmcCxAKGZwLDApCisJLnRleHQKKwkuZ2xvYmFsIHN0X3BsdXMKK3N0X3BsdXM6CisJc3QgZnAsQCtmcAorCS50ZXh0CisJLmdsb2JhbCBzdF9taW51cworc3RfbWludXM6CisJc3QgZnAsQC1mcAorCS50ZXh0CisJLmdsb2JhbCBzdWIKK3N1YjoKKwlzdWIgZnAsZnAKKwkudGV4dAorCS5nbG9iYWwgc3Vidgorc3VidjoKKwlzdWJ2IGZwLGZwCisJLnRleHQKKwkuZ2xvYmFsIHN1YngKK3N1Yng6CisJc3VieCBmcCxmcAorCS50ZXh0CisJLmdsb2JhbCB0cmFwCit0cmFwOgorCXRyYXAgMAorCS50ZXh0CisJLmdsb2JhbCB1bmxvY2sKK3VubG9jazoKKwl1bmxvY2sgZnAsQGZwCisJLnRleHQKKwkuZ2xvYmFsIHB1c2gKK3B1c2g6CisJcHVzaCBmcAorCS50ZXh0CisJLmdsb2JhbCBwb3AKK3BvcDoKKwlwb3AgZnAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWNmMDJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kCkBAIC0wLDAgKzEsMzEgQEAKKyNhczoKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBmc2xvdAorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArMCA8Ymw+OgorICowOgk3ZSAwMCBmMCAwMCAJYmwgMCA8Ymw+IFx8XHwgbm9wCisgKjQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKKworMCs4IDxibF9zPjoKKyAqODoJN2UgMDAgZjAgMDAgCWJsIDggPGJsX3M+IFx8XHwgbm9wCisgKmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKKworMCsxMCA8YnJhPjoKKyAqMTA6CTdmIDAwIGYwIDAwIAlicmEgMTAgPGJyYT4gXHxcfCBub3AKKyAqMTQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKKworMCsxOCA8YnJhX3M+OgorICoxODoJN2YgMDAgZjAgMDAgCWJyYSAxOCA8YnJhX3M+IFx8XHwgbm9wCisgKjFjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCisKKzArMjAgPGpsPjoKKyAqMjA6CTFlIGMwIGYwIDAwIAlqbCByMCBcfFx8IG5vcAorICoyNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAorCiswKzI4IDx0cmFwPjoKKyAqMjg6CTEwIGY0IGYwIDAwIAl0cmFwIFsjXSoweDQgXHxcfCBub3AKKyAqMmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZiNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5zCkBAIC0wLDAgKzEsMjcgQEAKKyMgVGVzdCB0aGUgRklMTC1TTE9UIGF0dHJpYnV0ZS4KKyMgVGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUgZW5zdXJlcyB0aGUgbmV4dCBpbnNuIGJlZ2lucyBvbiBhIDMyIGJ5dGUgYm91bmRhcnkuCisjIFRoaXMgaXMgbmVlZGVkIGZvciBleGFtcGxlIHdpdGggYmwgYmVjYXVzZSB0aGUgc3Vicm91dGluZSB3aWxsIHJldHVybgorIyB0byBhIDMyIGJpdCBib3VuZGFyeS4KKworCS50ZXh0CitibDoKKwlibCBibAorCWxkaSByMCwjOAorYmxfczoKKwlibC5zIGJsX3MKKwlsZGkgcjAsIzgKKworYnJhOgorCWJyYSBicmEKKwlsZGkgcjAsIzgKK2JyYV9zOgorCWJyYS5zIGJyYV9zCisJbGRpIHIwLCM4CisKK2psOgorCWpsIHIwCisJbGRpIHIwLCM4CisKK3RyYXA6CisJdHJhcCAjNAorCWxkaSByMCwjOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjY2I4YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQKQEAgLTAsMCArMSwxOSBAQAorI2FzOgorI29iamR1bXA6IC1kcgorI25hbWU6IGhpZ2gtMQorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzAqIDxmb28+OgorICowOglkNCBjMCAwMCAwMSAJc2V0aCByNCxbI10qMHgxCitbIAldKjA6IFJfTTMyUl9ISTE2X1VMTwkudGV4dAorICo0Ogk4NCBlNCAwMCAwMCAJb3IzIHI0LHI0LFsjXSoweDAKK1sgCV0qNDogUl9NMzJSX0xPMTYJLnRleHQKKyAqODoJZDQgYzAgMTIgMzQgCXNldGggcjQsWyNdKjB4MTIzNAorICpjOgk4NCBlNCA4NyA2NSAJb3IzIHI0LHI0LFsjXSoweDg3NjUKKyAqMTA6CWQ0IGMwIDEyIDM1IAlzZXRoIHI0LFsjXSoweDEyMzUKKyAqMTQ6CTg0IGU0IDg3IDY1IAlvcjMgcjQscjQsWyNdKjB4ODc2NQorICoxODoJZDQgYzAgODcgNjUgCXNldGggcjQsWyNdKjB4ODc2NQorICoxYzoJODQgZTQgNDMgMjEgCW9yMyByNCxyNCxbI10qMHg0MzIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVkMWQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9oaWdoLTEucwpAQCAtMCwwICsxLDE0IEBACis7IFRlc3QgaGlnaC9zaGlnaCBoYW5kbGluZy4KKworZm9vOgorCXNldGggcjQsI2hpZ2goZm9vKzB4MTAwMDApCisJb3IzICByNCxyNCwjbG93KGZvbysweDEwMDAwKQorCisJc2V0aCByNCwjaGlnaCgweDEyMzQ4NzY1KQorCW9yMyAgcjQscjQsI2xvdygweDEyMzQ4NzY1KQorCisJc2V0aCByNCwjc2hpZ2goMHgxMjM0ODc2NSkKKwlvcjMgIHI0LHI0LCNsb3coMHgxMjM0ODc2NSkKKworCXNldGggcjQsI3NoaWdoKDB4ODc2NTQzMjEpCisJb3IzICByNCxyNCwjbG93KDB4ODc2NTQzMjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGMyMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cApAQCAtMCwwICsxLDggQEAKKyMgTTMyUiB0ZXN0Y2FzZXMKKworaWYgW2lzdGFyZ2V0IG0zMnIqLSotKl0geworICAgIHJ1bl9kdW1wX3Rlc3QgImhpZ2gtMSIKKyAgICBydW5fZHVtcF90ZXN0ICJyZWxheC0xIgorICAgIHJ1bl9kdW1wX3Rlc3QgInVwcGVyY2FzZSIKKyAgICBydW5fZHVtcF90ZXN0ICJmc2xvdCIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9vdXRvZnJhbmdlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwZDMxMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zCkBAIC0wLDAgKzEsMTQ1IEBACis7IFRlc3QgZXJyb3IgbWVzc2FnZXMgd2hlcmUgYnJhbmNoZXMgYXJlIG91dCBvZiByYW5nZS4KKworOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IG0zMnItKi0qIH0gfQorCisJLnRleHQKKwkuZ2xvYmFsIGZvbworZm9vOgorCWJsLnMgbGFiZWwKKwkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYmwucyIgeyB0YXJnZXQgKi0qLSogfSB7IDggfSB9CisJYm5jLnMgbGFiZWwKKwkJOyB7IGRnLWVycm9yICJvdXQgb2YgcmFuZ2UiICJvdXQgb2YgcmFuZ2UgYm5jLnMiIHsgdGFyZ2V0ICotKi0qIH0geyAxMCB9IH0KKwlicmEucyBsYWJlbAorCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBicmEucyIgeyB0YXJnZXQgKi0qLSogfSB7IDEyIH0gfQorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKKwlsZDI0IHIwLCMwCisJbGQyNCByMCwjMAorCWxkMjQgcjAsIzAKK2xhYmVsOgorCWptcCByMTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0ZmNiOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5kCkBAIC0wLDAgKzEsMTggQEAKKyNhczoKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiByZWxheC0xCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCogPERvZXNOb3RXb3JrPjoKKyAqMDoJNzAgMDAgNzAgMDAgKglub3AgLT4gbm9wCisKKzAqNCA8V29yaz46CisgKjQ6CTcwIDAwIDcwIDAwICoJbm9wIC0+IG5vcAorRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuYnJhbmNoOgorCiswKiA8YnJhbmNoPjoKKyAqMDoJZmYgMDAgMDAgMDEgCWJyYSA0IDxXb3JrPgorWyAJXSowOiBSX00zMlJfMjZfUENSRUwJLnRleHQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlMTJjMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zCkBAIC0wLDAgKzEsMTcgQEAKKzsgVGVzdCByZWxheGF0aW9uIGludG8gbm9uLXplcm8gb2Zmc2V0IHRvIGRpZmZlcmVudCBzZWdtZW50LgorCisJLnNlY3Rpb24gLmJyYW5jaCwgImF4IixAcHJvZ2JpdHMKKwkuYmFsaWduIDQKK2JyYW5jaDoKKyAgICAgICAgYnJhIFdvcmsKKworCisJLnNlY3Rpb24gLnRleHQKKyAgICAgICAgLmJhbGlnbiA0CitEb2VzTm90V29yazoKKwlub3AKKwlub3AKKworV29yazoKKwlub3AKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjEzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kCkBAIC0wLDAgKzEsMjYgQEAKKyNhczoKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiB1cHBlcmNhc2UKKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswKzAwMDAgPGZvbz46CisgICAwOgkxMCA4MSAxMCA5MSAqCW12IHIwLHIxIC0+IG12ZmMgcjAsY2JyCisKKzArMDAwNCA8aGlnaD46CisgICA0OglkMCBjMCAwMCAwMCAJc2V0aCByMCwjMHgwCitbIAldKjQ6IFJfTTMyUl9ISTE2X1VMTwlbLl10ZXh0CisKKzArMDAwOCA8c2hpZ2g+OgorICAgODoJZDAgYzAgMDAgMDAgCXNldGggcjAsIzB4MAorWyAJXSo4OiBSX00zMlJfSEkxNl9TTE8JWy5ddGV4dAorCiswKzAwMGMgPGxvdz46CisgICBjOgk4MCBlMCAwMCAwYyAJb3IzIHIwLHIwLCMweGMKK1sgCV0qYzogUl9NMzJSX0xPMTYJWy5ddGV4dAorCiswKzAwMTAgPHNkYT46CisgIDEwOgk4MCBhMCAwMCAwMCAJYWRkMyByMCxyMCwjMAorWyAJXSoxMDogUl9NMzJSX1NEQTE2CXNkYXZhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZWFmZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvdXBwZXJjYXNlLnMKQEAgLTAsMCArMSwxNCBAQAorCS50ZXh0CisJLmdsb2JhbCBmb28KK2ZvbzoKKwltdiBSMCxSMQorCW12ZmMgUjAsQ0JSCisKK2hpZ2g6CisJc2V0aCByMCwjSElHSChoaWdoKQorc2hpZ2g6CisJc2V0aCByMCwjU0hJR0goc2hpZ2gpCitsb3c6CisJb3IzIHIwLHIwLCNMT1cobG93KQorc2RhOgorCWFkZDMgcjAscjAsI1NEQShzZGF2YXIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2VlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cApAQCAtMCwwICsxLDE1IEBACisjCisjIFNvbWUgbTY4ay1jb2ZmIHRlc3RzCisjCitpZiBbaXN0YXJnZXQgbTY4Ki0qLWNvZmZdIHRoZW4geworICAgIGdhc190ZXN0ICJwMjQzMC5zIiAiIiAkc3Rkb3B0bGlzdCAibG9jYWwgYnJhbmNoIG5vdCBpbiB0ZXh0IHNlY3Rpb24iCisKKyAgICBnYXNfdGVzdCAicDI0MzBhLnMiICIiICRzdGRvcHRsaXN0ICJsb2NhbCBicmFuY2ggbm90IGluIHRleHQgc2VjdGlvbiIKKworICAgIGdhc190ZXN0ICJ0MS5zIiAiIiAkc3Rkb3B0bGlzdCAibXVsdGlwbGUgLmZpbGUgZGlyZWN0aXZlcyIKKworICAgIGdhc190ZXN0ICJwMjM4OS5zIiAiIiAkc3Rkb3B0bGlzdCAiYnNzIGZpbGwiCisKKyAgICBzZXR1cF94ZmFpbCBtNjgqLSotY29mZgorICAgIGdhc190ZXN0X2Vycm9yICJwMjM4OWEucyIgIiIgImRldGVjdCBic3MgZmlsbCB3aXRoIG5vbi16ZXJvIGRhdGEiCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTkzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucwpAQCAtMCwwICsxLDE5IEBACisjICBJIHJlYWNoZWQgYSBwb2ludCB3aGVyZSB0aGUgZmlsZSBsb29rcworIyBjbGVhbiBhbmQgY29tcGxpZXMgd2l0aCBnYXMgc3ludGF4LCBidXQgaXQgY29yZSBkdW1wcyBnYXMuIEhlcmUncyBhCisjIGxpdHRsZSBnZGIgaW5mbzoKKyMKKyMgUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsIDExLCBTZWdtZW50YXRpb24gZmF1bHQuCisjICMwICAweDYzMjNjIGluIG1lbWNweSAoKQorIyAoZ2RiKSBidAorIyAjMCAgMHg2MzIzYyBpbiBtZW1jcHkgKCkKKyMgIzEgIDB4ZjJiMCBpbiBmaWxsX3NlY3Rpb24gKGFiZmQ9MHhlYWVlOCwgZmlsZWhkcj0weDhhN2Y0LCAKKyMgICAgIGZpbGVfY3Vyc29yPTB4ZjdmZmY2NTQpIGF0IG9iai1mb3JtYXQuYzo1MzQKKyMgIzIgIDB4MTEyYTggaW4gd3JpdGVfb2JqZWN0X2ZpbGUgKCkgYXQgb2JqLWZvcm1hdC5jOjE3ODYKKyMgIzMgIDB4MTNlZjggaW4gbWFpbiAoYXJnYz01LCBhcmd2PTB4ZjdmZmY3YmMpIGF0IC4uLy4uL3AzL2dhcy9hcy5jOjMxMAorIyAoZ2RiKSAKKyMKKyMgZ2FzIGRpZCBtYW5hZ2UgdG8gY3JlYXRlIHRoZSAubyBmaWxlIGF0IHRoaXMgcG9pbnQuCisKKwkuYnNzCisKK19BU0lDX0lOVF9UQkw6ICAgLnNwYWNlIDMyLDAJfCBrZWVwIGludGVycnVwdCByb3V0aW5lcyBoZXJlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiMjc2NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucwpAQCAtMCwwICsxLDMgQEAKKwkuYnNzCisKK19BU0lDX0lOVF9UQkw6ICAgLnNwYWNlIDMyLDEJfCBrZWVwIGludGVycnVwdCByb3V0aW5lcyBoZXJlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NzIzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucwpAQCAtMCwwICsxLDYgQEAKKyMgVGhpcyBkaWZmZXJzIGZyb20gcDI0MzBhLnMgKHRoZSBjdXN0b21lcidzIGFjdHVhbCBzb3VyY2UgZmlsZSkgb25seQorIyBpbiB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cy4gIFN0cmFuZ2VseSwgdGhpcyBmaWxlIGdhdmUgbm8gcHJvYmxlbXMuLi4KKworCS5zZWN0IGZvbwordGFnOgorCWJyYSB0YWcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMGEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFmYjExCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zCkBAIC0wLDAgKzEsNCBAQAorICAgIC5zZWN0IGZvbworCit0YWc6CisJYnJhIHRhZwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAxNWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3QxLnMKQEAgLTAsMCArMSwzNiBAQAorIyAxICJsaWJnY2MxLlMiCisjIDQyICJsaWJ4eXoxLlMiCisjIDI1OSAibGliZ2NjMS5TIgorCS50ZXh0CisJLnByb2MKK3wjUFJPQyMgMDQKKwkuZ2xvYmwJIF9fbXVsc2kzICAgICAgCisgX19tdWxzaTMgICAgICA6Cit8I1BST0xPR1VFIyAwCisJbGluawkgICVhNiAgICAgICAsIzAKKwlhZGRsCSMtTEYxNCwgICVzcCAgICAgICAKKwltb3ZlbWwJI0xTMTQsICAlc3AgICAgICAgQAorfCNQUk9MT0dVRSMgMQorCW1vdmV3CSAgJWE2ICAgICAgIEAoMHg4KSwgICAlZDAgICAgICAgCSAKKwltdWx1dwkgICVhNiAgICAgICBAKDB4ZSksICAgJWQwICAgICAgIAkgCisJbW92ZXcJICAlYTYgICAgICAgQCgweGEpLCAgICVkMSAgICAgICAJIAorCW11bHV3CSAgJWE2ICAgICAgIEAoMHhjKSwgICAlZDEgICAgICAgCSAKKwlhZGR3CSAgJWQxICAgICAgICwgICAlZDAgICAgICAgCisJbHNsbAkjOCwgICAlZDAgICAgICAgCisJbHNsbAkjOCwgICAlZDAgICAgICAgCisJbW92ZXcJICAlYTYgICAgICAgQCgweGEpLCAgICVkMSAgICAgICAJIAorCW11bHV3CSAgJWE2ICAgICAgIEAoMHhlKSwgICAlZDEgICAgICAgCSAKKwlhZGRsCSAgJWQxICAgICAgICwgICAlZDAgICAgICAgCisJanJhCUxFMTQKK0xFMTQ6Cit8I1BST0xPR1VFIyAyCisJbW92ZW1sCSAgJXNwICAgICAgIEAsICNMUzE0CisJdW5sawkgICVhNiAgICAgICAKK3wjUFJPTE9HVUUjIDMKKwlydHMKKwlMRjE0ID0gNAorCUxTMTQgPSAweDAwMDIJCSAKKwlMRkYxNCA9IDAKKyMgMzU0ICJsaWJnY2MxLlMiCisJTFNTMTQgPSAweDAKKwlMVjE0ID0gMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWIyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2FsbC5leHAKQEAgLTAsMCArMSwzOSBAQAorIworIyBTb21lIGdlbmVyaWMgbTY4ayB0ZXN0cworIworaWYgW2lzdGFyZ2V0IG02OCotKi0qXSB0aGVuIHsKKyAgICBnYXNfdGVzdCAidDIucyIgIiIgIiIgImNyb3NzLXNlY3Rpb24gYnJhbmNoIgorICAgIGlmIFtpc3RhcmdldCBtNjgqLW1vdG9yb2xhLXN5c3ZdIHRoZW4geworCXJ1bl9kdW1wX3Rlc3QgdDIKKyAgICB9CisKKyAgICBnYXNfdGVzdCAicGljMS5zIiAiIiAiIiAiUElDIGdlbmVyYXRpb24iCisKKyAgICBnYXNfdGVzdCAiZGlzcGVyci5zIiAiLW02ODAyMCIgIiIgIkluY29ycmVjdCBEaXNwbGFjZW1lbnQgdG9vIGxvbmcgZXJyb3IiCisKKyAgICBnYXNfdGVzdF9lcnJvciAicDI0MTAucyIgIiIgIm91dC1vZi1yYW5nZSAnYnJhcyciCisKKyAgICBydW5fZHVtcF90ZXN0IHBjcmVsCisgICAgcnVuX2R1bXBfdGVzdCBvcGVyYW5kcworICAgIHJ1bl9kdW1wX3Rlc3QgY2FzCisgICAgcnVuX2R1bXBfdGVzdCBiaXRmaWVsZAorICAgIHJ1bl9kdW1wX3Rlc3QgbGluaworICAgIHJ1bl9kdW1wX3Rlc3QgZm1vdmVtbAorCisgICAgc2V0IHRlc3RuYW1lICI2ODAwMCBvcGVyYW5kcyIKKyAgICBnYXNfcnVuICJvcGVyYW5kcy5zIiAiLW02ODAwMCIgIjI+ZXJyLm91dCIKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiY2hpbGQgcHJvY2VzcyBleGl0ZWQgYWJub3JtYWxseSIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKKwlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCisJZmFpbCAkdGVzdG5hbWUKKyAgICB9IGVsc2UgeworCWlmIFtyZWdleHBfZGlmZiAiZXJyLm91dCIgIiRzcmNkaXIvJHN1YmRpci9vcDY4MDAwLmQiXSB0aGVuIHsKKwkgICAgZmFpbCAkdGVzdG5hbWUKKwl9IGVsc2UgeworCSAgICBwYXNzICR0ZXN0bmFtZQorCX0KKyAgICB9Cit9CitpZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKKyAgICB1bnNldCBlcnJvckluZm8KKyAgICB9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2JpdGZpZWxkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMWJkZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZApAQCAtMCwwICsxLDI4IEBACisjb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCisjbmFtZTogYml0ZmllbGQKKworIyBUZXN0IGhhbmRsaW5nIG9mIGJpdGZpZWxkIGluc3RydWN0aW9uIG9wZXJhbmRzLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMCA8Zm9vPiBiZmV4dHMgJWEwQCwxLDIsJWQwCiswKzAwNCA8Zm9vXCsoMHh8KTQ+IGJmZXh0cyAlYTBALDEsNiwlZDAKKzArMDA4IDxmb29cKygweHwpOD4gYmZleHRzICVhMEAsMywyLCVkMAorMCswMGMgPGZvb1wrKDB4fCljPiBiZmV4dHMgJWEwQCwzLDYsJWQwCiswKzAxMCA8Zm9vXCsoMHh8KTEwPiBiZmV4dHMgJWEwQCwxLDIsJWQwCiswKzAxNCA8Zm9vXCsoMHh8KTE0PiBiZmV4dHMgJWEwQCwxLDYsJWQwCiswKzAxOCA8Zm9vXCsoMHh8KTE4PiBiZmV4dHMgJWEwQCwzLDIsJWQwCiswKzAxYyA8Zm9vXCsoMHh8KTFjPiBiZmV4dHMgJWEwQCwzLDYsJWQwCiswKzAyMCA8Zm9vXCsoMHh8KTIwPiBiZnNldCAlYTBALDEsMgorMCswMjQgPGZvb1wrKDB4fCkyND4gYmZzZXQgJWEwQCwxLDYKKzArMDI4IDxmb29cKygweHwpMjg+IGJmc2V0ICVhMEAsMywyCiswKzAyYyA8Zm9vXCsoMHh8KTJjPiBiZnNldCAlYTBALDMsNgorMCswMzAgPGZvb1wrKDB4fCkzMD4gYmZzZXQgJWEwQCwxLDIKKzArMDM0IDxmb29cKygweHwpMzQ+IGJmc2V0ICVhMEAsMSw2CiswKzAzOCA8Zm9vXCsoMHh8KTM4PiBiZnNldCAlYTBALDMsMgorMCswM2MgPGZvb1wrKDB4fCkzYz4gYmZzZXQgJWEwQCwzLDYKKzArMDQwIDxmb29cKygweHwpNDA+IGJmZXh0cyAlYTBALCVkMSwlZDIsJWQwCiswKzA0NCA8Zm9vXCsoMHh8KTQ0PiBiZmV4dHMgJWEwQCwlZDEsJWQyLCVkMAorMCswNDggPGZvb1wrKDB4fCk0OD4gYmZzZXQgJWEwQCwlZDEsJWQyCiswKzA0YyA8Zm9vXCsoMHh8KTRjPiBiZnNldCAlYTBALCVkMSwlZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDJmNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5zCkBAIC0wLDAgKzEsMjQgQEAKKyMgVGVzdCBoYW5kbGluZyBvZiBiaXRmaWVsZCBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KKwkudGV4dAorCS5nbG9ibAlmb28KK2ZvbzoJCisJYmZleHRzCSglYTApeyYxOiYyfSwlZDAKKwliZmV4dHMJKCVhMCl7JjE6JigyKzQpfSwlZDAKKwliZmV4dHMJKCVhMCl7JigxKzIpOiYyfSwlZDAKKwliZmV4dHMJKCVhMCl7JigxKzIpOiYoMis0KX0sJWQwCisJYmZleHRzCSVhMEAsJjEsJjIsJWQwCisJYmZleHRzCSVhMEAsJjEsJigyKzQpLCVkMAorCWJmZXh0cwklYTBALCYxKzIsJjIsJWQwCisJYmZleHRzCSVhMEAsJigxKzIpLCYoMis0KSwlZDAKKwliZnNldAkoJWEwKXsmMTomMn0KKwliZnNldAkoJWEwKXsmMTomKDIrNCl9CisJYmZzZXQJKCVhMCl7JigxKzIpOiYyfQorCWJmc2V0CSglYTApeyYoMSsyKTomKDIrNCl9CisJYmZzZXQJJWEwQCwmMSwmMgorCWJmc2V0CSVhMEAsJjEsJigyKzQpCisJYmZzZXQJJWEwQCwmMSsyLCYyCisJYmZzZXQJJWEwQCwmKDErMiksJigyKzQpCisJYmZleHRzCSglYTApeyVkMTolZDJ9LCVkMAorCWJmZXh0cwklYTBALCVkMSwlZDIsJWQwCisJYmZzZXQJKCVhMCl7JWQxOiVkMn0KKwliZnNldAklYTBALCVkMSwlZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDk3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kCkBAIC0wLDAgKzEsMjAgQEAKKyNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKKyNuYW1lOiBjYXMKKworIyBUZXN0IHBhcnNpbmcgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBjYXMgaW5zdHJ1Y3Rpb24KKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAgPGZvbz4gY2FzdyAlZDAsJWQxLCVhMEAKKzArMDA0IDxmb29cKygweHwpND4gY2FzdyAlZDAsJWQxLCVhMEAKKzArMDA4IDxmb29cKygweHwpOD4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAorMCswMGUgPGZvb1wrKDB4fCllPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKKzArMDE0IDxmb29cKygweHwpMTQ+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKKzArMDFhIDxmb29cKygweHwpMWE+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKKzArMDIwIDxmb29cKygweHwpMjA+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQorMCswMjYgPGZvb1wrKDB4fCkyNj4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAorMCswMmMgPGZvb1wrKDB4fCkyYz4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCiswKzAzMiA8Zm9vXCsoMHh8KTMyPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACiswKzAzOCA8Zm9vXCsoMHh8KTM4PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACiswKzAzZSA8Zm9vXCsoMHh8KTNlPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGU3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zCkBAIC0wLDAgKzEsMTYgQEAKKyMgVGVzdCBwYXJzaW5nIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgY2FzIGluc3RydWN0aW9uCisJLnRleHQKKwkuZ2xvYmwJZm9vCitmb286CQorCWNhcwklZDAsJWQxLCglYTApCisJY2FzCSVkMCwlZDEsJWEwQAorCWNhczIJJWQwOiVkMiwlZDM6JWQ0LCglYTApOiglYTEpCisJY2FzMgklZDA6JWQyLCVkMzolZDQsKCVkMCk6KCVkMSkKKwljYXMyCSVkMDolZDIsJWQzOiVkNCwlYTBAOiVhMUAKKwljYXMyCSVkMDolZDIsJWQzOiVkNCxAKCVhMCk6QCglYTEpCisJY2FzMgklZDA6JWQyLCVkMzolZDQsQCglZDApOkAoJWQxKQorCWNhczIJJWQwLCVkMiwlZDMsJWQ0LCglYTApLCglYTEpCisJY2FzMgklZDAsJWQyLCVkMywlZDQsKCVkMCksKCVkMSkKKwljYXMyCSVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKKwljYXMyCSVkMCwlZDIsJWQzLCVkNCxAKCVhMCksQCglYTEpCisJY2FzMgklZDAsJWQyLCVkMywlZDQsQCglZDApLEAoJWQxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9kaXNwZXJyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2QzYjdiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9kaXNwZXJyLnMKQEAgLTAsMCArMSwxNiBAQAorI05PX0FQUAorZ2NjMl9jb21waWxlZC46CitfX19nbnVfY29tcGlsZWRfYzoKKy50ZXh0CisJLmV2ZW4KKy5nbG9ibCBfZm9vCitfZm9vOgorCWxpbmsgJWE2LCMtMTIKKwlmbW92ZXggJWE2QCgtMTIpLCVmcDAKKwlmbW92ZXggJWZwMCwlc3BALQorCWpic3IgX2JhcgorCWFkZHF3ICM4LCVzcAorCWFkZHF3ICM0LCVzcAorTDE6CisJdW5sayAlYTYKKwlydHMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlMjc5MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kCkBAIC0wLDAgKzEsNjAgQEAKKyNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKKyNuYW1lOiBmbW92ZW1sCisKKyMgVGVzdCBoYW5kbGluZyBvZiBmbW92ZW1sIGFuZCBmbW92ZW14IGluc3RydWN0aW9ucy4KKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAgPGZvbz4gZm1vdmVsICVmcGNyLCVhMEAKKzArMDA0IDxmb29cKygweHwpND4gZm1vdmVsICVmcHNyLCVhMEAKKzArMDA4IDxmb29cKygweHwpOD4gZm1vdmVsICVmcGlhciwlYTBACiswKzAwYyA8Zm9vXCsoMHh8KWM+IGZtb3ZlbWwgJWZwc3IvJWZwY3IsJWEwQAorMCswMTAgPGZvb1wrKDB4fCkxMD4gZm1vdmVtbCAlZnBpYXIvJWZwY3IsJWEwQAorMCswMTQgPGZvb1wrKDB4fCkxND4gZm1vdmVtbCAlZnBpYXIvJWZwc3IsJWEwQAorMCswMTggPGZvb1wrKDB4fCkxOD4gZm1vdmVtbCAlZnBpYXIvJWZwc3IvJWZwY3IsJWEwQAorMCswMWMgPGZvb1wrKDB4fCkxYz4gZm1vdmVsICVmcGNyLCVkMAorMCswMjAgPGZvb1wrKDB4fCkyMD4gZm1vdmVsICVmcHNyLCVkMAorMCswMjQgPGZvb1wrKDB4fCkyND4gZm1vdmVsICVmcGlhciwlZDAKKzArMDI4IDxmb29cKygweHwpMjg+IGZtb3ZlbCAlZnBpYXIsJWEwCiswKzAyYyA8Zm9vXCsoMHh8KTJjPiBmbW92ZWwgJWEwQCwlZnBjcgorMCswMzAgPGZvb1wrKDB4fCkzMD4gZm1vdmVsICVhMEAsJWZwc3IKKzArMDM0IDxmb29cKygweHwpMzQ+IGZtb3ZlbCAlYTBALCVmcGlhcgorMCswMzggPGZvb1wrKDB4fCkzOD4gZm1vdmVtbCAlYTBALCVmcHNyLyVmcGNyCiswKzAzYyA8Zm9vXCsoMHh8KTNjPiBmbW92ZW1sICVhMEAsJWZwaWFyLyVmcGNyCiswKzA0MCA8Zm9vXCsoMHh8KTQwPiBmbW92ZW1sICVhMEAsJWZwaWFyLyVmcHNyCiswKzA0NCA8Zm9vXCsoMHh8KTQ0PiBmbW92ZW1sICVhMEAsJWZwaWFyLyVmcHNyLyVmcGNyCiswKzA0OCA8Zm9vXCsoMHh8KTQ4PiBmbW92ZWwgJWQwLCVmcGNyCiswKzA0YyA8Zm9vXCsoMHh8KTRjPiBmbW92ZWwgJWQwLCVmcHNyCiswKzA1MCA8Zm9vXCsoMHh8KTUwPiBmbW92ZWwgJWQwLCVmcGlhcgorMCswNTQgPGZvb1wrKDB4fCk1ND4gZm1vdmVsICVhMCwlZnBpYXIKKzArMDU4IDxmb29cKygweHwpNTg+IGZtb3ZlbCAjMSwlZnBjcgorMCswNjAgPGZvb1wrKDB4fCk2MD4gZm1vdmVsICMxLCVmcHNyCiswKzA2OCA8Zm9vXCsoMHh8KTY4PiBmbW92ZWwgIzEsJWZwaWFyCiswKzA3MCA8Zm9vXCsoMHh8KTcwPiBmbW92ZW1sICMxLCVmcHNyLyVmcGNyCiswKzA3OCA8Zm9vXCsoMHh8KTc4PiBmbW92ZW1sICMxLCVmcGlhci8lZnBjcgorMCswODAgPGZvb1wrKDB4fCk4MD4gZm1vdmVtbCAjMSwlZnBpYXIvJWZwc3IKKzArMDg4IDxmb29cKygweHwpODg+IGZtb3ZlbWwgIzEsJWZwaWFyLyVmcHNyLyVmcGNyCiswKzA5MCA8Zm9vXCsoMHh8KTkwPiBmbW92ZW14ICVmcDEsJWEwQAorMCswOTQgPGZvb1wrKDB4fCk5ND4gZm1vdmVteCAlZnA0LCVhMEAKKzArMDk4IDxmb29cKygweHwpOTg+IGZtb3ZlbXggJWZwNywlYTBACiswKzA5YyA8Zm9vXCsoMHh8KTljPiBmbW92ZW14ICVmcDEvJWZwMywlYTBACiswKzBhMCA8Zm9vXCsoMHh8KWEwPiBmbW92ZW14ICVmcDEtJWZwNCwlYTBACiswKzBhNCA8Zm9vXCsoMHh8KWE0PiBmbW92ZW14ICVmcDAvJWZwNywlYTBACiswKzBhOCA8Zm9vXCsoMHh8KWE4PiBmbW92ZW14ICVmcDAtJWZwNywlYTBACiswKzBhYyA8Zm9vXCsoMHh8KWFjPiBmbW92ZW14ICVhMEAsJWZwMAorMCswYjAgPGZvb1wrKDB4fCliMD4gZm1vdmVteCAlYTBALCVmcDEKKzArMGI0IDxmb29cKygweHwpYjQ+IGZtb3ZlbXggJWEwQCwlZnA3CiswKzBiOCA8Zm9vXCsoMHh8KWI4PiBmbW92ZW14ICVhMEAsJWZwMC8lZnAzCiswKzBiYyA8Zm9vXCsoMHh8KWJjPiBmbW92ZW14ICVhMEAsJWZwMC8lZnA0CiswKzBjMCA8Zm9vXCsoMHh8KWMwPiBmbW92ZW14ICVhMEAsJWZwMi0lZnA0CiswKzBjNCA8Zm9vXCsoMHh8KWM0PiBmbW92ZW14ICVhMEAsJWZwMS0lZnA3CiswKzBjOCA8Zm9vXCsoMHh8KWM4PiBmbW92ZW14ICVmcDAsJWEwQC0KKzArMGNjIDxmb29cKygweHwpY2M+IGZtb3ZlbXggJWZwMC0lZnA3LCVhMEAtCiswKzBkMCA8Zm9vXCsoMHh8KWQwPiBmbW92ZW14ICVmcDAvJWZwNCwlYTBALQorMCswZDQgPGZvb1wrKDB4fClkND4gZm1vdmVteCAlYTBAXCssJWZwNworMCswZDggPGZvb1wrKDB4fClkOD4gZm1vdmVteCAlYTBAXCssJWZwMC0lZnA3CiswKzBkYyA8Zm9vXCsoMHh8KWRjPiBmbW92ZW14ICVhMEBcKywlZnAzLyVmcDcKKzArMGUwIDxmb29cKygweHwpZTA+IGZtb3ZlbXggJWQwLCVhMEAtCiswKzBlNCA8Zm9vXCsoMHh8KWU0PiBmbW92ZW14ICVhMEBcKywlZDAKKzArMGU4IDxmb29cKygweHwpZTg+IGZtb3ZlbXggJWZwMS8lZnA1LCVhMEAtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDIyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucwpAQCAtMCwwICsxLDU4IEBACisjIFRlc3QgaGFuZGxpbmcgb2YgdGhlIGZtb3ZlbWwgYW5kIGZtb3ZlbXggaW5zdHJ1Y3Rpb25zLgorCS50ZXh0CisJLmdsb2JsCWZvbworZm9vOgorCWZtb3ZlbWwgJWZwY3IsJWEwQAorCWZtb3ZlbWwgJWZwc3IsJWEwQAorCWZtb3ZlbWwgJWZwaWFyLCVhMEAKKwlmbW92ZW1sICVmcGNyLyVmcHNyLCVhMEAKKwlmbW92ZW1sCSVmcGNyLyVmcGlhciwlYTBACisJZm1vdmVtbAklZnBzci8lZnBpYXIsJWEwQAorCWZtb3ZlbWwJJWZwY3IvJWZwc3IvJWZwaWFyLCVhMEAKKwlmbW92ZW1sCSVmcGNyLCVkMAorCWZtb3ZlbWwJJWZwc3IsJWQwCisJZm1vdmVtbAklZnBpYXIsJWQwCisJZm1vdmVtbAklZnBpYXIsJWEwCisJZm1vdmVtbCAlYTBALCVmcGNyCisJZm1vdmVtbCAlYTBALCVmcHNyCisJZm1vdmVtbCAlYTBALCVmcGlhcgorCWZtb3ZlbWwgJWEwQCwlZnBzci8lZnBjcgorCWZtb3ZlbWwJJWEwQCwlZnBpYXIvJWZwY3IKKwlmbW92ZW1sCSVhMEAsJWZwaWFyLyVmcHNyCisJZm1vdmVtbAklYTBALCVmcHNyLyVmcGlhci8lZnBjcgorCWZtb3ZlbWwJJWQwLCVmcGNyCisJZm1vdmVtbAklZDAsJWZwc3IKKwlmbW92ZW1sCSVkMCwlZnBpYXIKKwlmbW92ZW1sCSVhMCwlZnBpYXIKKwlmbW92ZW1sCSYxLCVmcGNyCisJZm1vdmVtbAkmMSwlZnBzcgorCWZtb3ZlbWwJJjEsJWZwaWFyCisJZm1vdmVtbAkmMSwlZnBjci8lZnBzcgorCWZtb3ZlbWwJJjEsJWZwY3IvJWZwaWFyCisJZm1vdmVtbAkmMSwlZnBzci8lZnBpYXIKKwlmbW92ZW1sCSYxLCVmcGlhci8lZnBzci8lZnBjcgorCisJZm1vdmVteCAlZnAxLCVhMEAKKwlmbW92ZW14ICVmcDQsJWEwQAorCWZtb3ZlbXggJWZwNywlYTBACisJZm1vdmVteCAlZnAxLyVmcDMsJWEwQAorCWZtb3ZlbXgJJWZwMS0lZnA0LCVhMEAKKwlmbW92ZW14CSVmcDAvJWZwNywlYTBACisJZm1vdmVteAklZnAwLSVmcDcsJWEwQAorCWZtb3ZlbXggJWEwQCwlZnAwCisJZm1vdmVteCAlYTBALCVmcDEKKwlmbW92ZW14ICVhMEAsJWZwNworCWZtb3ZlbXggJWEwQCwlZnAwLyVmcDMKKwlmbW92ZW14CSVhMEAsJWZwMC8lZnA0CisJZm1vdmVteAklYTBALCVmcDItJWZwNAorCWZtb3ZlbXgJJWEwQCwlZnAxLSVmcDcKKwlmbW92ZW14CSYxLCVhMEAtCisJZm1vdmVteAkmMHhmZiwlYTBALQorCWZtb3ZlbXgJJjB4MTEsJWEwQC0KKwlmbW92ZW14CSVhMEArLCYxCisJZm1vdmVteAklYTBAKywmMHhmZgorCWZtb3ZlbXgJJWEwQCssJjB4MTEKKwlmbW92ZW14CSVkMCwlYTBALQorCWZtb3ZlbXgJJWEwQCssJWQwCisJZm1vdmVteAkmc3ltLCVhMEAtCisJc3ltCT0JMHgyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUyNjNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9saW5rLmQKQEAgLTAsMCArMSwxNyBAQAorI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcworI25hbWU6IGxpbmsKKworIyBUZXN0IGhhbmRsaW5nIG9mIGxpbmsgaW5zdHJ1Y3Rpb24uCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwIDxmb28+IGxpbmt3ICVmcCwjMAorMCswMDQgPGZvb1wrKDB4fCk0PiBsaW5rdyAlZnAsIy00CiswKzAwOCA8Zm9vXCsoMHh8KTg+IGxpbmt3ICVmcCwjLTMyNzY3CiswKzAwYyA8Zm9vXCsoMHh8KWM+IGxpbmt3ICVmcCwjLTMyNzY4CiswKzAxMCA8Zm9vXCsoMHh8KTEwPiBsaW5rbCAlZnAsIy0zMjc2OQorMCswMTYgPGZvb1wrKDB4fCkxNj4gbGlua3cgJWZwLCMzMjc2NworMCswMWEgPGZvb1wrKDB4fCkxYT4gbGlua2wgJWZwLCMzMjc2OAorMCswMjAgPGZvb1wrKDB4fCkyMD4gbGlua2wgJWZwLCMzMjc2OQorMCswMjYgPGZvb1wrKDB4fCkyNj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMzIxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucwpAQCAtMCwwICsxLDEzIEBACisjIFRlc3QgaGFuZGxpbmcgb2YgbGluayBpbnN0cnVjdGlvbi4KKwkudGV4dAorCS5nbG9ibAlmb28KK2ZvbzoKKwlsaW5rCSVhNiwmMAorCWxpbmsJJWE2LCYtNAorCWxpbmsJJWE2LCYtMHg3ZmZmCisJbGluawklYTYsJi0weDgwMDAKKwlsaW5rCSVhNiwmLTB4ODAwMQorCWxpbmsJJWE2LCYweDdmZmYKKwlsaW5rCSVhNiwmMHg4MDAwCisJbGluawklYTYsJjB4ODAwMQorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wNjgwMDAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhkNWEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQKQEAgLTAsMCArMSwxOTUgQEAKKyMgVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHN0ZGVyciBvdXRwdXQgb2YgZ2FzIC1tNjgwMDAgb24gb3BlcmFuZHMucy4KKyMgV2UgZG9uJ3QgYm90aGVyIHRvIG1hdGNoIHRoZSBleGFjdCBlcnJvciBtZXNzYWdlLCBidXQgaW5zdGVhZCBqdXN0CisjIGxvb2sgZm9yIHRoZSBzdGF0ZW1lbnRzIHdoaWNoIHNob3VsZCBmYWlsLgorCisuKm9wZXJhbmRzLnM6IEFzc2VtYmxlciBtZXNzYWdlczoKKy4qc3RhdGVtZW50IGB0c3RsICVhMCcgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOnc6NFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDp3OjhcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6bDoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOmw6NFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDpsOjhcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqNFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMFwqOFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLndcKjRcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAud1wqOFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC5sXCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLmxcKjRcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAubFwqOFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDgsJWExLndcKjIsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIDhcKCVhMCwlZDAud1wqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCA4XCglZDAud1wqMiwlYTBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgOFwoJWExLndcKjIsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoJWQwLndcKjIsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlZDAsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTEud1wqMiwlYTBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMCwlYTBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoJWQwLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwMDAsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIDEwMDAwMFwoJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICV6YTFAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgJXphMUBcKDEwMDAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXphMSwlZDAud1wqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWQwLCV6YTFcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMS53XCoyLCV6YTFcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXphMSwlZDAud1wqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglZDAsJXphMVwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAwMCwlemExXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIDEwMDAwMFwoJXphMVwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCV6ZDE6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJXpkMTp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoJXpkMTp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMCwlemQxLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6ZDEsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemExLndcKjIsJWEwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVhMCwlemQxLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJXpkMSwlYTBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemQxLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXCglemQxLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIEBcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMFxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVhMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWzBcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCAlYTBAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsICVhMEBcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMCwlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDA6dzoyLCVhMFxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwLCVhMFxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWExLCVhMFxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWExOnc6MiwlYTBcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMCwlZDA6dzoyXF1cKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwLCVhMFxdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDAsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwLCVhMFxdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgdHN0bCBcKFxbJWQwOnc6MlxdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXBjQFwoOCwlZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoOCwlcGMsJWQwLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSA4XCglcGMsJWQwLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlcGMsJWQwLndcKjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWQwLCVwY1wpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEud1wqMiwlcGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLCVwY1wpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVkMCwlcGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglYTEsJXBjXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXCgxMDAwMDAsJXBjXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgMTAwMDAwXCglcGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlenBjLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVkMCwlenBjXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMS53XCoyLCV6cGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLCV6cGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglenBjLCVkMC53XCoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWQwLCV6cGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglYTEsJXpwY1wpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoMTAwMDAwLCV6cGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAxMDAwMDBcKCV6cGNcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMFwpQFwoMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwY1xdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWyVwY1xdLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICV6cGNAXCgwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwY1xdLCVkMDp3OjJcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFslenBjXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICVwY0BcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDA6dzoyLCVwY1xdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlcGNcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjLCVhMVxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTE6dzoyLCVwY1xdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCVwY1xdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCVwY1xdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFslcGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWyVkMCwlcGNcXVwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDA6dzoyLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlYTFcXSwyMDAwXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExOnc6MiwlenBjXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGMsJWQwOnc6MlxdXCknIGlnbm9yZWQKKy4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWQwLCV6cGNcXVwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMSwlenBjXF1cKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCisuKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVhMFxdLDIwMDBcKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwYywlZDA6dzoyXF1cKScgaWdub3JlZAorLipzdGF0ZW1lbnQgYHBlYSBcKFxbJWQwLCV6cGNcXVwpJyBpZ25vcmVkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzODNjMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMuZApAQCAtMCwwICsxLDI0MiBAQAorI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcworI25hbWU6IG9wZXJhbmRzCisKKyMgVGVzdCBoYW5kbGluZyBvZiBNSVQgYW5kIE1vdG9yb2xhIHN5bnRheCBvcGVyYW5kcworIyBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgc2VlIGFsc28gb3A2ODAwMC5kLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMCA8Zm9vPiB0c3RsICVkMAorMCswMDIgPGZvb1wrKDB4fCkyPiB0c3RsICVhMAorMCswMDQgPGZvb1wrKDB4fCk0PiB0c3RsICVhMEAKKzArMDA2IDxmb29cKygweHwpNj4gdHN0bCAlYTBACiswKzAwOCA8Zm9vXCsoMHh8KTg+IHRzdGwgJWEwQFwrCiswKzAwYSA8Zm9vXCsoMHh8KWE+IHRzdGwgJWEwQFwrCiswKzAwYyA8Zm9vXCsoMHh8KWM+IHRzdGwgJWEwQC0KKzArMDBlIDxmb29cKygweHwpZT4gdHN0bCAlYTBALQorMCswMTAgPGZvb1wrKDB4fCkxMD4gdHN0bCAlYTBAXCg4XCkKKzArMDE0IDxmb29cKygweHwpMTQ+IHRzdGwgJWEwQFwoOFwpCiswKzAxOCA8Zm9vXCsoMHh8KTE4PiB0c3RsICVhMEBcKDhcKQorMCswMWMgPGZvb1wrKDB4fCkxYz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCiswKzAyMCA8Zm9vXCsoMHh8KTIwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKKzArMDI0IDxmb29cKygweHwpMjQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQorMCswMjggPGZvb1wrKDB4fCkyOD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKKzArMDJjIDxmb29cKygweHwpMmM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6NFwpCiswKzAzMCA8Zm9vXCsoMHh8KTMwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjhcKQorMCswMzQgPGZvb1wrKDB4fCkzND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCiswKzAzOCA8Zm9vXCsoMHh8KTM4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKKzArMDNjIDxmb29cKygweHwpM2M+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6MlwpCiswKzA0MCA8Zm9vXCsoMHh8KTQwPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjRcKQorMCswNDQgPGZvb1wrKDB4fCk0ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo4XCkKKzArMDQ4IDxmb29cKygweHwpNDg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCiswKzA0YyA8Zm9vXCsoMHh8KTRjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKKzArMDUwIDxmb29cKygweHwpNTA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQorMCswNTQgPGZvb1wrKDB4fCk1ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDoyXCkKKzArMDU4IDxmb29cKygweHwpNTg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6NFwpCiswKzA1YyA8Zm9vXCsoMHh8KTVjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjhcKQorMCswNjAgPGZvb1wrKDB4fCk2MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCiswKzA2NCA8Zm9vXCsoMHh8KTY0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKKzArMDY4IDxmb29cKygweHwpNjg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCiswKzA2YyA8Zm9vXCsoMHh8KTZjPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjRcKQorMCswNzAgPGZvb1wrKDB4fCk3MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo4XCkKKzArMDc0IDxmb29cKygweHwpNzQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQorMCswNzggPGZvb1wrKDB4fCk3OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCiswKzA3YyA8Zm9vXCsoMHh8KTdjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjJcKQorMCswODAgPGZvb1wrKDB4fCk4MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo0XCkKKzArMDg0IDxmb29cKygweHwpODQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6OFwpCiswKzA4OCA8Zm9vXCsoMHh8KTg4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKKzArMDhjIDxmb29cKygweHwpOGM+IHRzdGwgJWEwQFwoMCswMDgsJWExOnc6MlwpCiswKzA5MCA8Zm9vXCsoMHh8KTkwPiB0c3RsICVhMUBcKDArMDA4LCVhMDpsXCkKKzArMDk0IDxmb29cKygweHwpOTQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCiswKzA5OCA8Zm9vXCsoMHh8KTk4PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQorMCswOWMgPGZvb1wrKDB4fCk5Yz4gdHN0bCAlYTBAXCgwKzAwOCwlYTE6dzoyXCkKKzArMGEwIDxmb29cKygweHwpYTA+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCiswKzBhNCA8Zm9vXCsoMHh8KWE0PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQorMCswYTggPGZvb1wrKDB4fClhOD4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKKzArMGFlIDxmb29cKygweHwpYWU+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCiswKzBiNCA8Zm9vXCsoMHh8KWI0PiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKQorMCswYjggPGZvb1wrKDB4fCliOD4gdHN0bCBAXCgwKzNlOFwpCiswKzBiZSA8Zm9vXCsoMHh8KWJlPiB0c3RsICVhMEBcKDArMTg2YTBcKQorMCswYzYgPGZvb1wrKDB4fCljNj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKKzArMGNjIDxmb29cKygweHwpY2M+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKQorMCswZDIgPGZvb1wrKDB4fClkMj4gdHN0bCAlYTBAXCgwKzNlOCwlYTE6dzoyXCkKKzArMGQ4IDxmb29cKygweHwpZDg+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCiswKzBkZSA8Zm9vXCsoMHh8KWRlPiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXCkKKzArMGU0IDxmb29cKygweHwpZTQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCiswKzBlYSA8Zm9vXCsoMHh8KWVhPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQorMCswZjAgPGZvb1wrKDB4fClmMD4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXCkKKzArMGY0IDxmb29cKygweHwpZjQ+IHRzdGwgJWEwQFwoMCsxODZhMFwpCiswKzBmYyA8Zm9vXCsoMHh8KWZjPiB0c3RsICVhMEBcKDArMTg2YTBcKQorMCsxMDQgPGZvb1wrKDB4fCkxMDQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCiswKzEwYSA8Zm9vXCsoMHh8KTEwYT4gdHN0bCBAXCgwKzE4NmEwXCkKKzArMTEyIDxmb29cKygweHwpMTEyPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQorMCsxMTggPGZvb1wrKDB4fCkxMTg+IHRzdGwgQFwoMCszZTgsJWQwOmxcKQorMCsxMWUgPGZvb1wrKDB4fCkxMWU+IHRzdGwgQFwoMCszZTgsJWExOnc6MlwpCiswKzEyNCA8Zm9vXCsoMHh8KTEyND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKKzArMTJhIDxmb29cKygweHwpMTJhPiB0c3RsIEBcKDArM2U4LCVkMDpsXCkKKzArMTMwIDxmb29cKygweHwpMTMwPiB0c3RsIEBcKDArMTg2YTBcKQorMCsxMzggPGZvb1wrKDB4fCkxMzg+IHRzdGwgQFwoMCsxODZhMFwpCiswKzE0MCA8Zm9vXCsoMHh8KTE0MD4gdHN0bCAlYTBAXCgwKzNlOFwpCiswKzE0NiA8Zm9vXCsoMHh8KTE0Nj4gdHN0bCBAXCgwKzNlOFwpCiswKzE0YyA8Zm9vXCsoMHh8KTE0Yz4gdHN0bCBAXCgwKzAwMFwpCiswKzE1MCA8Zm9vXCsoMHh8KTE1MD4gdHN0bCAlYTBAXCgwKzNlOFwpCiswKzE1NiA8Zm9vXCsoMHh8KTE1Nj4gdHN0bCAlYTBAXCgwKzNlOFwpCiswKzE1YyA8Zm9vXCsoMHh8KTE1Yz4gdHN0bCAlYTBAXCgwKzNlOFwpCiswKzE2MiA8Zm9vXCsoMHh8KTE2Mj4gdHN0bCAlYTBAXCgwKzNlOFwpCiswKzE2OCA8Zm9vXCsoMHh8KTE2OD4gdHN0bCAlYTBAXCgwKzNlOFwpCiswKzE2ZSA8Zm9vXCsoMHh8KTE2ZT4gdHN0bCBAXCgwKzNlOFwpCiswKzE3NCA8Zm9vXCsoMHh8KTE3ND4gdHN0bCBAXCgwKzNlOFwpCiswKzE3YSA8Zm9vXCsoMHh8KTE3YT4gdHN0bCBAXCgwKzAwMFwpCiswKzE3ZSA8Zm9vXCsoMHh8KTE3ZT4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCiswKzE4NiA8Zm9vXCsoMHh8KTE4Nj4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCiswKzE4YyA8Zm9vXCsoMHh8KTE4Yz4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDBcKQorMCsxOTQgPGZvb1wrKDB4fCkxOTQ+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQorMCsxOWMgPGZvb1wrKDB4fCkxOWM+IHRzdGwgQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQorMCsxYTIgPGZvb1wrKDB4fCkxYTI+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwXCkKKzArMWFhIDxmb29cKygweHwpMWFhPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKKzArMWIwIDxmb29cKygweHwpMWIwPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKKzArMWI0IDxmb29cKygweHwpMWI0PiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMFwpCiswKzFiYSA8Zm9vXCsoMHh8KTFiYT4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCiswKzFjMCA8Zm9vXCsoMHh8KTFjMD4gdHN0bCBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCiswKzFjNCA8Zm9vXCsoMHh8KTFjND4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDBcKQorMCsxY2EgPGZvb1wrKDB4fCkxY2E+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQorMCsxZDIgPGZvb1wrKDB4fCkxZDI+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQorMCsxZDggPGZvb1wrKDB4fCkxZDg+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwXCkKKzArMWUwIDxmb29cKygweHwpMWUwPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKKzArMWU4IDxmb29cKygweHwpMWU4PiB0c3RsIEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKKzArMWVlIDxmb29cKygweHwpMWVlPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMFwpCiswKzFmNiA8Zm9vXCsoMHh8KTFmNj4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCiswKzFmYyA8Zm9vXCsoMHh8KTFmYz4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCiswKzIwMCA8Zm9vXCsoMHh8KTIwMD4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDBcKQorMCsyMDYgPGZvb1wrKDB4fCkyMDY+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQorMCsyMGMgPGZvb1wrKDB4fCkyMGM+IHRzdGwgQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQorMCsyMTAgPGZvb1wrKDB4fCkyMTA+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwXCkKKzArMjE2IDxmb29cKygweHwpMjE2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjFlIDxmb29cKygweHwpMjFlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKKzArMjI0IDxmb29cKygweHwpMjI0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjJjIDxmb29cKygweHwpMjJjPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKKzArMjMyIDxmb29cKygweHwpMjMyPiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjM4IDxmb29cKygweHwpMjM4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKKzArMjNjIDxmb29cKygweHwpMjNjPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjQyIDxmb29cKygweHwpMjQyPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKKzArMjQ2IDxmb29cKygweHwpMjQ2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjRlIDxmb29cKygweHwpMjRlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjU2IDxmb29cKygweHwpMjU2PiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXClAXCgwKzdkMFwpCiswKzI1ZSA8Zm9vXCsoMHh8KTI1ZT4gdHN0bCAlYTFAXCgwKzNlOCwlYTA6bFwpQFwoMCs3ZDBcKQorMCsyNjYgPGZvb1wrKDB4fCkyNjY+IHRzdGwgJWEwQFwoMCszZTgsJWExOnc6MlwpQFwoMCs3ZDBcKQorMCsyNmUgPGZvb1wrKDB4fCkyNmU+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQorMCsyNzQgPGZvb1wrKDB4fCkyNzQ+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKUBcKDArMDAwXCkKKzArMjdhIDxmb29cKygweHwpMjdhPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjgyIDxmb29cKygweHwpMjgyPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKKzArMjg4IDxmb29cKygweHwpMjg4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKKzArMjhlIDxmb29cKygweHwpMjhlPiB0c3RsICVhMEBcKDArMDAwLCVkMDpsXClAXCgwKzdkMFwpCiswKzI5NCA8Zm9vXCsoMHh8KTI5ND4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCiswKzI5OCA8Zm9vXCsoMHh8KTI5OD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6bFwpQFwoMCswMDBcKQorMCsyOWMgPGZvb1wrKDB4fCkyOWM+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQorMCsyYTIgPGZvb1wrKDB4fCkyYTI+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQorMCsyYTYgPGZvb1wrKDB4fCkyYTY+IHBlYSAlcGNAXCgwKzJiMCA8Zm9vXCsoMHh8KTJiMD5cKQorMCsyYWEgPGZvb1wrKDB4fCkyYWE+IHBlYSAlcGNAXCgwKzJiNCA8Zm9vXCsoMHh8KTJiND5cKQorMCsyYWUgPGZvb1wrKDB4fCkyYWU+IHBlYSAlcGNAXCgwKzJiOCA8Zm9vXCsoMHh8KTJiOD5cKQorMCsyYjIgPGZvb1wrKDB4fCkyYjI+IHBlYSAlcGNAXCgwKzAwMCA8Zm9vPlwpCiswKzJiNiA8Zm9vXCsoMHh8KTJiNj4gcGVhICVwY0BcKDArMmMwIDxmb29cKygweHwpMmMwPiwlZDA6dzoyXCkKKzArMmJhIDxmb29cKygweHwpMmJhPiBwZWEgJXBjQFwoMCsyYmMgPGZvb1wrKDB4fCkyYmM+LCVkMDp3OjJcKQorMCsyYmUgPGZvb1wrKDB4fCkyYmU+IHBlYSAlcGNAXCgwKzJjOCA8Zm9vXCsoMHh8KTJjOD4sJWQwOnc6MlwpCiswKzJjMiA8Zm9vXCsoMHh8KTJjMj4gcGVhICVwY0BcKDArMmNjIDxmb29cKygweHwpMmNjPiwlZDA6bFwpCiswKzJjNiA8Zm9vXCsoMHh8KTJjNj4gcGVhICVwY0BcKDArMmQwIDxmb29cKygweHwpMmQwPiwlYTA6bFwpCiswKzJjYSA8Zm9vXCsoMHh8KTJjYT4gcGVhICVwY0BcKDArMmQ0IDxmb29cKygweHwpMmQ0PiwlZDA6dzoyXCkKKzArMmNlIDxmb29cKygweHwpMmNlPiBwZWEgJXBjQFwoMCsyZDggPGZvb1wrKDB4fCkyZDg+LCVkMDpsXCkKKzArMmQyIDxmb29cKygweHwpMmQyPiBwZWEgJXBjQFwoMCsyZGMgPGZvb1wrKDB4fCkyZGM+LCVhMDpsXCkKKzArMmQ2IDxmb29cKygweHwpMmQ2PiBwZWEgJXBjQFwoMCsyZDggPGZvb1wrKDB4fCkyZDg+LCVkMDp3OjJcKQorMCsyZGEgPGZvb1wrKDB4fCkyZGE+IHBlYSAlcGNAXCgwKzJkYyA8Zm9vXCsoMHh8KTJkYz4sJWQwOmxcKQorMCsyZGUgPGZvb1wrKDB4fCkyZGU+IHBlYSAlcGNAXCgwKzJlMCA8Zm9vXCsoMHh8KTJlMD4sJWEwOmxcKQorMCsyZTIgPGZvb1wrKDB4fCkyZTI+IHBlYSAlcGNAXCgwKzZjYyA8Lio+LCVkMDp3OjJcKQorMCsyZTggPGZvb1wrKDB4fCkyZTg+IHBlYSAlcGNAXCgwKzE4OThhIDwuKj5cKQorMCsyZjAgPGZvb1wrKDB4fCkyZjA+IHBlYSAlcGNAXCgwKzZkYSA8Lio+LCVkMDp3OjJcKQorMCsyZjYgPGZvb1wrKDB4fCkyZjY+IHBlYSAlcGNAXCgwKzZlMCA8Lio+LCVkMDpsXCkKKzArMmZjIDxmb29cKygweHwpMmZjPiBwZWEgJXBjQFwoMCs2ZTYgPC4qPiwlYTE6dzoyXCkKKzArMzAyIDxmb29cKygweHwpMzAyPiBwZWEgJXBjQFwoMCs2ZWMgPC4qPiwlYTE6bFwpCiswKzMwOCA8Zm9vXCsoMHh8KTMwOD4gcGVhICVwY0BcKDArNmYyIDwuKj4sJWQwOnc6MlwpCiswKzMwZSA8Zm9vXCsoMHh8KTMwZT4gcGVhICVwY0BcKDArNmY4IDwuKj4sJWQwOmxcKQorMCszMTQgPGZvb1wrKDB4fCkzMTQ+IHBlYSAlcGNAXCgwKzZmZSA8Lio+LCVhMTpsXCkKKzArMzFhIDxmb29cKygweHwpMzFhPiBwZWEgJXBjQFwoMCsxODliYyA8Lio+XCkKKzArMzIyIDxmb29cKygweHwpMzIyPiBwZWEgJXBjQFwoMCsxODljNCA8Lio+XCkKKzArMzJhIDxmb29cKygweHwpMzJhPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKQorMCszMzAgPGZvb1wrKDB4fCkzMzA+IHBlYSAlenBjQFwoMCsxODZhMFwpCiswKzMzOCA8Zm9vXCsoMHh8KTMzOD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXCkKKzArMzNlIDxmb29cKygweHwpMzNlPiBwZWEgJXpwY0BcKDArM2U4LCVkMDpsXCkKKzArMzQ0IDxmb29cKygweHwpMzQ0PiBwZWEgJXpwY0BcKDArM2U4LCVhMTp3OjJcKQorMCszNGEgPGZvb1wrKDB4fCkzNGE+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKQorMCszNTAgPGZvb1wrKDB4fCkzNTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpCiswKzM1NiA8Zm9vXCsoMHh8KTM1Nj4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpCiswKzM1YyA8Zm9vXCsoMHh8KTM1Yz4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpCiswKzM2MiA8Zm9vXCsoMHh8KTM2Mj4gcGVhICV6cGNAXCgwKzE4NmEwXCkKKzArMzZhIDxmb29cKygweHwpMzZhPiBwZWEgJXpwY0BcKDArMTg2YTBcKQorMCszNzIgPGZvb1wrKDB4fCkzNzI+IHBlYSAlcGNAXCgwKzc1YyA8Lio+XClAXCgwKzdkMCwlZDA6dzoyXCkKKzArMzdhIDxmb29cKygweHwpMzdhPiBwZWEgJXBjQFwoMCs3NjQgPC4qPlwpQFwoMCswMDAsJWQwOnc6MlwpCiswKzM4MCA8Zm9vXCsoMHh8KTM4MD4gcGVhICVwY0BcKDArNzZhIDwuKj5cKUBcKDArN2QwXCkKKzArMzg4IDxmb29cKygweHwpMzg4PiBwZWEgJXBjQFwoMCszOGEgPGZvb1wrKDB4fCkzOGE+XClAXCgwKzdkMCwlZDA6dzoyXCkKKzArMzhlIDxmb29cKygweHwpMzhlPiBwZWEgJXBjQFwoMCszOTAgPGZvb1wrKDB4fCkzOTA+XClAXCgwKzAwMCwlZDA6dzoyXCkKKzArMzkyIDxmb29cKygweHwpMzkyPiBwZWEgJXBjQFwoMCszOTQgPGZvb1wrKDB4fCkzOTQ+XClAXCgwKzdkMFwpCiswKzM5OCA8Zm9vXCsoMHh8KTM5OD4gcGVhICVwY0BcKDArNzgyIDwuKj5cKUBcKDArN2QwLCVkMDp3OjJcKQorMCszYTAgPGZvb1wrKDB4fCkzYTA+IHBlYSAlcGNAXCgwKzc4YSA8Lio+XClAXCgwKzAwMCwlZDA6dzoyXCkKKzArM2E2IDxmb29cKygweHwpM2E2PiBwZWEgJXBjQFwoMCs3OTAgPC4qPlwpQFwoMCs3ZDBcKQorMCszYWUgPGZvb1wrKDB4fCkzYWU+IHBlYSAlcGNAXCgwKzNiMCA8Zm9vXCsoMHh8KTNiMD5cKUBcKDArN2QwLCVkMDp3OjJcKQorMCszYjQgPGZvb1wrKDB4fCkzYjQ+IHBlYSAlcGNAXCgwKzNiNiA8Zm9vXCsoMHh8KTNiNj5cKUBcKDArMDAwLCVkMDp3OjJcKQorMCszYjggPGZvb1wrKDB4fCkzYjg+IHBlYSAlcGNAXCgwKzNiYSA8Zm9vXCsoMHh8KTNiYT5cKUBcKDArN2QwXCkKKzArM2JlIDxmb29cKygweHwpM2JlPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKKzArM2M2IDxmb29cKygweHwpM2M2PiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKKzArM2NjIDxmb29cKygweHwpM2NjPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMFwpCiswKzNkNCA8Zm9vXCsoMHh8KTNkND4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCiswKzNkYSA8Zm9vXCsoMHh8KTNkYT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCiswKzNkZSA8Zm9vXCsoMHh8KTNkZT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDBcKQorMCszZTQgPGZvb1wrKDB4fCkzZTQ+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQorMCszZWMgPGZvb1wrKDB4fCkzZWM+IHBlYSAlenBjQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQorMCszZjIgPGZvb1wrKDB4fCkzZjI+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwXCkKKzArM2ZhIDxmb29cKygweHwpM2ZhPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKKzArNDAwIDxmb29cKygweHwpNDAwPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKKzArNDA0IDxmb29cKygweHwpNDA0PiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMFwpCiswKzQwYSA8Zm9vXCsoMHh8KTQwYT4gcGVhICVwY0BcKDArN2Y0IDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQorMCs0MTIgPGZvb1wrKDB4fCk0MTI+IHBlYSAlcGNAXCgwKzdmYyA8Lio+LCVkMDp3OjJcKUBcKDArMDAwXCkKKzArNDE4IDxmb29cKygweHwpNDE4PiBwZWEgJXBjQFwoMCs0MWEgPGZvb1wrKDB4fCk0MWE+LCVkMDp3OjJcKUBcKDArN2QwXCkKKzArNDFlIDxmb29cKygweHwpNDFlPiBwZWEgJXBjQFwoMCs0MjAgPGZvb1wrKDB4fCk0MjA+LCVkMDp3OjJcKUBcKDArMDAwXCkKKzArNDIyIDxmb29cKygweHwpNDIyPiBwZWEgJXBjQFwoMCs4MGMgPC4qPiwlZDA6dzoyXClAXCgwKzdkMFwpCiswKzQyYSA8Zm9vXCsoMHh8KTQyYT4gcGVhICVwY0BcKDArODE0IDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQorMCs0MzIgPGZvb1wrKDB4fCk0MzI+IHBlYSAlcGNAXCgwKzgxYyA8Lio+LCVkMDpsXClAXCgwKzdkMFwpCiswKzQzYSA8Zm9vXCsoMHh8KTQzYT4gcGVhICVwY0BcKDArODI0IDwuKj4sJWExOmxcKUBcKDArN2QwXCkKKzArNDQyIDxmb29cKygweHwpNDQyPiBwZWEgJXBjQFwoMCs4MmMgPC4qPiwlYTE6bFwpQFwoMCs3ZDBcKQorMCs0NGEgPGZvb1wrKDB4fCk0NGE+IHBlYSAlcGNAXCgwKzgzNCA8Lio+LCVhMTp3OjJcKUBcKDArN2QwXCkKKzArNDUyIDxmb29cKygweHwpNDUyPiBwZWEgJXBjQFwoMCs4M2MgPC4qPiwlZDA6dzoyXClAXCgwKzAwMFwpCiswKzQ1OCA8Zm9vXCsoMHh8KTQ1OD4gcGVhICVwY0BcKDArODQyIDwuKj4sJWQwOmxcKUBcKDArMDAwXCkKKzArNDVlIDxmb29cKygweHwpNDVlPiBwZWEgJXBjQFwoMCs4NDggPC4qPiwlYTE6bFwpQFwoMCswMDBcKQorMCs0NjQgPGZvb1wrKDB4fCk0NjQ+IHBlYSAlcGNAXCgwKzQ2NiA8Zm9vXCsoMHh8KTQ2Nj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQorMCs0NmEgPGZvb1wrKDB4fCk0NmE+IHBlYSAlcGNAXCgwKzQ2YyA8Zm9vXCsoMHh8KTQ2Yz4sJWEwOmxcKUBcKDArN2QwXCkKKzArNDcwIDxmb29cKygweHwpNDcwPiBwZWEgJXBjQFwoMCs0NzIgPGZvb1wrKDB4fCk0NzI+LCVkMDp3OjJcKUBcKDArMDAwXCkKKzArNDc0IDxmb29cKygweHwpNDc0PiBwZWEgJXBjQFwoMCs0NzYgPGZvb1wrKDB4fCk0NzY+LCVkMDpsXClAXCgwKzAwMFwpCiswKzQ3OCA8Zm9vXCsoMHh8KTQ3OD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCiswKzQ4MCA8Zm9vXCsoMHh8KTQ4MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCiswKzQ4NiA8Zm9vXCsoMHh8KTQ4Nj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCiswKzQ4YyA8Zm9vXCsoMHh8KTQ4Yz4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCiswKzQ5MCA8Zm9vXCsoMHh8KTQ5MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCiswKzQ5OCA8Zm9vXCsoMHh8KTQ5OD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCiswKzRhMCA8Zm9vXCsoMHh8KTRhMD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpQFwoMCs3ZDBcKQorMCs0YTggPGZvb1wrKDB4fCk0YTg+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArN2QwXCkKKzArNGIwIDxmb29cKygweHwpNGIwPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzdkMFwpCiswKzRiOCA8Zm9vXCsoMHh8KTRiOD4gcGVhICV6cGNAXCgwKzNlOCwlYTE6dzoyXClAXCgwKzdkMFwpCiswKzRjMCA8Zm9vXCsoMHh8KTRjMD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCiswKzRjNiA8Zm9vXCsoMHh8KTRjNj4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpQFwoMCswMDBcKQorMCs0Y2MgPGZvb1wrKDB4fCk0Y2M+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArMDAwXCkKKzArNGQyIDxmb29cKygweHwpNGQyPiBwZWEgJXpwY0BcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKKzArNGQ4IDxmb29cKygweHwpNGQ4PiBwZWEgJXpwY0BcKDArMDAwLCVhMDpsXClAXCgwKzdkMFwpCiswKzRkZSA8Zm9vXCsoMHh8KTRkZT4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCiswKzRlMiA8Zm9vXCsoMHh8KTRlMj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6bFwpQFwoMCswMDBcKQorMCs0ZTYgPGZvb1wrKDB4fCk0ZTY+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgorMCs0ZWEgPGZvb1wrKDB4fCk0ZWE+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgorMCs0ZWUgPGZvb1wrKDB4fCk0ZWU+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgorMCs0ZjIgPGZvb1wrKDB4fCk0ZjI+IHRzdGwgMCsxODZhMCA8Lio+CiswKzRmOCA8Zm9vXCsoMHh8KTRmOD4gdHN0bCAwKzAwOCA8Zm9vXCsoMHh8KTg+CiswKzRmZSA8Zm9vXCsoMHh8KTRmZT4gdHN0bCAwKzAwOCA8Zm9vXCsoMHh8KTg+CiswKzUwNCA8Zm9vXCsoMHh8KTUwND4gYWRkaWIgIzEsJWQwCiswKzUwOCA8Zm9vXCsoMHh8KTUwOD4gYWRkaXcgIzEsJWQwCiswKzUwYyA8Zm9vXCsoMHh8KTUwYz4gYWRkaWwgIzEsJWQwCiswKzUxMiA8Zm9vXCsoMHh8KTUxMj4gYWRkcWIgIzEsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5ZjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMucwpAQCAtMCwwICsxLDI3MiBAQAorIyBUZXN0IGhhbmRsaW5nIG9mIE1JVCBhbmQgTW90b3JvbGEgc3ludGF4IG9wZXJhbmRzCisjIElmIHlvdSBjaGFuZ2UgdGhpcyBmaWxlLCBzZWUgYWxzbyBvcDY4MDAwLmQuCisJLnRleHQKK2ZvbzoJCisJfCBEYXRhIHJlZ2lzdGVyIGRpcmVjdAorCXRzdGwJJWQwCisKKwl8IEFkZHJlc3MgcmVnaXN0ZXIgZGlyZWN0CisJdHN0bAklYTAKKworCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdAorCXRzdGwJJWEwQAorCXRzdGwJKCVhMCkKKworCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3RpbmNyZW1lbnQKKwl0c3RsCSVhMEArCisJdHN0bAkoJWEwKSsKKworCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZWRlY3JlbWVudAorCXRzdGwJJWEwQC0KKwl0c3RsCS0oJWEwKQorCisJfCBBZGRyZXNzIHJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50CisJdHN0bAklYTBAKDgpCisJdHN0bAkoOCwlYTApCisJdHN0bAk4KCVhMCkKKworCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIGluZGV4ICg4LWJpdCBkaXNwbGFjZW1lbnQpCisJdHN0bAklYTBAKDgsJWQwKQorCXRzdGwJJWEwQCg4LCVkMDp3KQorCXRzdGwJJWEwQCg4LCVkMDp3OjEpCisJdHN0bAklYTBAKDgsJWQwOnc6MikKKwl0c3RsCSVhMEAoOCwlZDA6dzo0KQorCXRzdGwJJWEwQCg4LCVkMDp3OjgpCisJdHN0bAklYTBAKDgsJWQwOmwpCisJdHN0bAklYTBAKDgsJWQwOmw6MSkKKwl0c3RsCSVhMEAoOCwlZDA6bDoyKQorCXRzdGwJJWEwQCg4LCVkMDpsOjQpCisJdHN0bAklYTBAKDgsJWQwOmw6OCkKKwl0c3RsCSVhMEAoJWQwOnc6MikKKwl0c3RsCSg4LCVhMCwlZDApCisJdHN0bAkoOCwlYTAsJWQwKjEpCisJdHN0bAkoOCwlYTAsJWQwKjIpCisJdHN0bAkoOCwlYTAsJWQwKjQpCisJdHN0bAkoOCwlYTAsJWQwKjgpCisJdHN0bAkoOCwlYTAsJWQwLncpCisJdHN0bAkoOCwlYTAsJWQwLncqMSkKKwl0c3RsCSg4LCVhMCwlZDAudyoyKQorCXRzdGwJKDgsJWEwLCVkMC53KjQpCisJdHN0bAkoOCwlYTAsJWQwLncqOCkKKwl0c3RsCSg4LCVhMCwlZDAubCkKKwl0c3RsCSg4LCVhMCwlZDAubCoxKQorCXRzdGwJKDgsJWEwLCVkMC5sKjIpCisJdHN0bAkoOCwlYTAsJWQwLmwqNCkKKwl0c3RsCSg4LCVhMCwlZDAubCo4KQorCXRzdGwJKDgsJWQwLCVhMCkKKwl0c3RsCSg4LCVhMS53KjIsJWEwKQorCXRzdGwJKDgsJWExLCVhMCkKKwl0c3RsCTgoJWEwLCVkMC53KjIpCisJdHN0bAk4KCVkMC53KjIsJWEwKQorCXRzdGwJOCglYTEudyoyLCVhMCkKKwl0c3RsCSglYTAsJWQwLncqMikKKwl0c3RsCSglZDAudyoyLCVhMCkKKworCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIGluZGV4IChiYXNlIGRpc3BsYWNlbWVudCkKKwl0c3RsCSVhMEAoMTAwMCwlZDA6dzoyKQorCXRzdGwJQCgxMDAwLCVkMDp3OjIpCisJdHN0bAlAKCVkMDp3OjIpCisJdHN0bAlAKDEwMDApCisJdHN0bAklYTBAKDEwMDAwMCkKKwl0c3RsCSgxMDAwLCVhMCwlZDAudyoyKQorCXRzdGwJKDEwMDAsJWQwLCVhMCkKKwl0c3RsCSgxMDAwLCVhMS53KjIsJWEwKQorCXRzdGwJMTAwMCglYTAsJWQwLncqMikKKwl0c3RsCTEwMDAoJWQwLCVhMCkKKwl0c3RsCSgxMDAwLCVkMC53KjIpCisJdHN0bAkxMDAwKCVkMC53KjIpCisJdHN0bAkoJWQwLncqMikKKwl0c3RsCSgxMDAwMDAsJWEwKQorCXRzdGwJMTAwMDAwKCVhMCkKKwl0c3RsCSV6YTFAKDEwMDAsJWQwOnc6MikKKwl0c3RsCSV6YTFAKDEwMDAwMCkKKwl0c3RsCSgxMDAwLCV6YTEsJWQwLncqMikKKwl0c3RsCSgxMDAwLCVkMCwlemExKQorCXRzdGwJKDEwMDAsJWExLncqMiwlemExKQorCXRzdGwJMTAwMCglemExLCVkMC53KjIpCisJdHN0bAkxMDAwKCVkMCwlemExKQorCXRzdGwJKDEwMDAwMCwlemExKQorCXRzdGwJMTAwMDAwKCV6YTEpCisJdHN0bAklYTBAKDEwMDAsJXpkMTp3OjIpCisJdHN0bAlAKDEwMDAsJXpkMTp3OjIpCisJdHN0bAlAKCV6ZDE6dzoyKQorCXRzdGwJKDEwMDAsJWEwLCV6ZDEudyoyKQorCXRzdGwJKDEwMDAsJXpkMSwlYTApCisJdHN0bAkoMTAwMCwlemExLncqMiwlYTApCisJdHN0bAkxMDAwKCVhMCwlemQxLncqMikKKwl0c3RsCTEwMDAoJXpkMSwlYTApCisJdHN0bAkoMTAwMCwlemQxLncqMikKKwl0c3RsCTEwMDAoJXpkMS53KjIpCisJdHN0bAkoJXpkMS53KjIpCisKKwl8IE1lbW9yeSBpbmRpcmVjdCBwb3N0aW5kZXhlZAorCXRzdGwJJWEwQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQorCXRzdGwJJWEwQCgxMDAwKUAoJWQwOnc6MikKKwl0c3RsCSVhMEAoMTAwMClAKDIwMDApCisJdHN0bAlAKDEwMDApQCgyMDAwLCVkMDp3OjIpCisJdHN0bAlAKDEwMDApQCglZDA6dzoyKQorCXRzdGwJQCgxMDAwKUAoMjAwMCkKKwl0c3RsCSVhMEAoMClAKDIwMDAsJWQwOnc6MikKKwl0c3RsCSVhMEAoMClAKCVkMDp3OjIpCisJdHN0bAklYTBAKDApQCgyMDAwKQorCXRzdGwJQCgwKUAoMjAwMCwlZDA6dzoyKQorCXRzdGwJQCgwKUAoJWQwOnc6MikKKwl0c3RsCUAoMClAKDIwMDApCisJdHN0bAkoWzEwMDAsJWEwXSwlZDA6dzoyLDIwMDApCisJdHN0bAkoWzEwMDAsJWEwXSwlZDA6dzoyKQorCXRzdGwJKFsxMDAwLCVhMF0sMjAwMCkKKwl0c3RsCShbMTAwMF0sJWQwOnc6MiwyMDAwKQorCXRzdGwJKFsxMDAwXSwlZDA6dzoyKQorCXRzdGwJKFsxMDAwXSwyMDAwKQorCXRzdGwJKFslYTBdLCVkMDp3OjIsMjAwMCkKKwl0c3RsCShbJWEwXSwlZDA6dzoyKQorCXRzdGwJKFslYTBdLDIwMDApCisJdHN0bAkoWzBdLCVkMDp3OjIsMjAwMCkKKwl0c3RsCShbMF0sJWQwOnc6MikKKwl0c3RsCShbMF0sMjAwMCkKKworCXwgTWVtb3J5IGluZGlyZWN0IHByZWluZGV4ZWQKKwl0c3RsCSVhMEAoMTAwMCwlZDA6dzoyKUAoMjAwMCkKKwl0c3RsCSVhMEAoMTAwMCwlZDA6dzoyKUAoMCkKKwl0c3RsCUAoMTAwMCwlZDA6dzoyKUAoMjAwMCkKKwl0c3RsCUAoMTAwMCwlZDA6dzoyKUAoMCkKKwl0c3RsCSVhMEAoJWQwOnc6MilAKDIwMDApCisJdHN0bAklYTBAKCVkMDp3OjIpQCgwKQorCXRzdGwJQCglZDA6dzoyKUAoMjAwMCkKKwl0c3RsCUAoJWQwOnc6MilAKDApCisJdHN0bAkoWzEwMDAsJWEwLCVkMDp3OjJdLDIwMDApCisJdHN0bAkoWzEwMDAsJWQwOnc6MiwlYTBdLDIwMDApCisJdHN0bAkoWzEwMDAsJWQwLCVhMF0sMjAwMCkKKwl0c3RsCShbMTAwMCwlYTEsJWEwXSwyMDAwKQorCXRzdGwJKFsxMDAwLCVhMTp3OjIsJWEwXSwyMDAwKQorCXRzdGwJKFsxMDAwLCVhMCwlZDA6dzoyXSkKKwl0c3RsCShbMTAwMCwlZDAsJWEwXSkKKwl0c3RsCShbMTAwMCwlZDA6dzoyXSwyMDAwKQorCXRzdGwJKFsxMDAwLCVkMDp3OjJdKQorCXRzdGwJKFslYTAsJWQwOnc6Ml0sMjAwMCkKKwl0c3RsCShbJWQwLCVhMF0sMjAwMCkKKwl0c3RsCShbJWEwLCVkMDp3OjJdKQorCXRzdGwJKFslZDAsJWEwXSkKKwl0c3RsCShbJWQwOnc6Ml0sMjAwMCkKKwl0c3RsCShbJWQwOnc6Ml0pCisKKwl8IFByb2dyYW0gY291bnRlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAorCXBlYQklcGNAKDgpCisJcGVhCSg4LCVwYykKKwlwZWEJOCglcGMpCisJcGVhCWZvbworCisJfCBQcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoOC1iaXQgZGlzcGxhY2VtZW50KQorCXBlYQklcGNAKDgsJWQwOnc6MikKKwlwZWEJJXBjQCglZDA6dzoyKQorCXBlYQkoOCwlcGMsJWQwLncqMikKKwlwZWEJKDgsJWQwLCVwYykKKwlwZWEJKDgsJWEwLCVwYykKKwlwZWEJOCglcGMsJWQwLncqMikKKwlwZWEJOCglZDAsJXBjKQorCXBlYQk4KCVhMCwlcGMpCisJcGVhCSglcGMsJWQwLncqMikKKwlwZWEJKCVkMCwlcGMpCisJcGVhCSglYTAsJXBjKQorCisJfCBQcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoYmFzZSBkaXNwbGFjZW1lbnQpCisJcGVhCSVwY0AoMTAwMCwlZDA6dzoyKQorCXBlYQklcGNAKDEwMDAwMCkKKwlwZWEJKDEwMDAsJXBjLCVkMC53KjIpCisJcGVhCSgxMDAwLCVkMCwlcGMpCisJcGVhCSgxMDAwLCVhMS53KjIsJXBjKQorCXBlYQkoMTAwMCwlYTEsJXBjKQorCXBlYQkxMDAwKCVwYywlZDAudyoyKQorCXBlYQkxMDAwKCVkMCwlcGMpCisJcGVhCTEwMDAoJWExLCVwYykKKwlwZWEJKDEwMDAwMCwlcGMpCisJcGVhCTEwMDAwMCglcGMpCisJcGVhCSV6cGNAKDEwMDAsJWQwOnc6MikKKwlwZWEJJXpwY0AoMTAwMDAwKQorCXBlYQkoMTAwMCwlenBjLCVkMC53KjIpCisJcGVhCSgxMDAwLCVkMCwlenBjKQorCXBlYQkoMTAwMCwlYTEudyoyLCV6cGMpCisJcGVhCSgxMDAwLCVhMSwlenBjKQorCXBlYQkxMDAwKCV6cGMsJWQwLncqMikKKwlwZWEJMTAwMCglZDAsJXpwYykKKwlwZWEJMTAwMCglYTEsJXpwYykKKwlwZWEJKDEwMDAwMCwlenBjKQorCXBlYQkxMDAwMDAoJXpwYykKKworCXwgUHJvZ3JhbSBjb3VudGVyIG1lbW9yeSBpbmRpcmVjdCBwb3N0aW5kZXhlZAorCXBlYQklcGNAKDEwMDApQCgyMDAwLCVkMDp3OjIpCisJcGVhCSVwY0AoMTAwMClAKCVkMDp3OjIpCisJcGVhCSVwY0AoMTAwMClAKDIwMDApCisJcGVhCSVwY0AoMClAKDIwMDAsJWQwOnc6MikKKwlwZWEJJXBjQCgwKUAoJWQwOnc6MikKKwlwZWEJJXBjQCgwKUAoMjAwMCkKKwlwZWEJKFsxMDAwLCVwY10sJWQwOnc6MiwyMDAwKQorCXBlYQkoWzEwMDAsJXBjXSwlZDA6dzoyKQorCXBlYQkoWzEwMDAsJXBjXSwyMDAwKQorCXBlYQkoWyVwY10sJWQwOnc6MiwyMDAwKQorCXBlYQkoWyVwY10sJWQwOnc6MikKKwlwZWEJKFslcGNdLDIwMDApCisJcGVhCSV6cGNAKDEwMDApQCgyMDAwLCVkMDp3OjIpCisJcGVhCSV6cGNAKDEwMDApQCglZDA6dzoyKQorCXBlYQklenBjQCgxMDAwKUAoMjAwMCkKKwlwZWEJJXpwY0AoMClAKDIwMDAsJWQwOnc6MikKKwlwZWEJJXpwY0AoMClAKCVkMDp3OjIpCisJcGVhCSV6cGNAKDApQCgyMDAwKQorCXBlYQkoWzEwMDAsJXpwY10sJWQwOnc6MiwyMDAwKQorCXBlYQkoWzEwMDAsJXpwY10sJWQwOnc6MikKKwlwZWEJKFsxMDAwLCV6cGNdLDIwMDApCisJcGVhCShbJXpwY10sJWQwOnc6MiwyMDAwKQorCXBlYQkoWyV6cGNdLCVkMDp3OjIpCisJcGVhCShbJXpwY10sMjAwMCkKKworCXwgUHJvZ3JhbSBjb3VudGVyIG1lbW9yeSBpbmRpcmVjdCBwcmVpbmRleGVkCisJcGVhCSVwY0AoMTAwMCwlZDA6dzoyKUAoMjAwMCkKKwlwZWEJJXBjQCgxMDAwLCVkMDp3OjIpQCgwKQorCXBlYQklcGNAKCVkMDp3OjIpQCgyMDAwKQorCXBlYQklcGNAKCVkMDp3OjIpQCgwKQorCXBlYQkoWzEwMDAsJXBjLCVkMDp3OjJdLDIwMDApCisJcGVhCShbMTAwMCwlZDA6dzoyLCVwY10sMjAwMCkKKwlwZWEJKFsxMDAwLCVkMCwlcGNdLDIwMDApCisJcGVhCShbMTAwMCwlYTEsJXBjXSwyMDAwKQorCXBlYQkoWzEwMDAsJXBjLCVhMV0sMjAwMCkKKwlwZWEJKFsxMDAwLCVhMTp3OjIsJXBjXSwyMDAwKQorCXBlYQkoWzEwMDAsJXBjLCVkMDp3OjJdKQorCXBlYQkoWzEwMDAsJWQwLCVwY10pCisJcGVhCShbMTAwMCwlYTEsJXBjXSkKKwlwZWEJKFslcGMsJWQwOnc6Ml0sMjAwMCkKKwlwZWEJKFslcGMsJWEwXSwyMDAwKQorCXBlYQkoWyVwYywlZDA6dzoyXSkKKwlwZWEJKFslZDAsJXBjXSkKKwlwZWEJJXpwY0AoMTAwMCwlZDA6dzoyKUAoMjAwMCkKKwlwZWEJJXpwY0AoMTAwMCwlZDA6dzoyKUAoMCkKKwlwZWEJJXpwY0AoJWQwOnc6MilAKDIwMDApCisJcGVhCSV6cGNAKCVkMDp3OjIpQCgwKQorCXBlYQkoWzEwMDAsJXpwYywlZDA6dzoyXSwyMDAwKQorCXBlYQkoWzEwMDAsJWQwOnc6MiwlenBjXSwyMDAwKQorCXBlYQkoWzEwMDAsJWQwLCV6cGNdLDIwMDApCisJcGVhCShbMTAwMCwlYTEsJXpwY10sMjAwMCkKKwlwZWEJKFsxMDAwLCV6cGMsJWExXSwyMDAwKQorCXBlYQkoWzEwMDAsJWExOnc6MiwlenBjXSwyMDAwKQorCXBlYQkoWzEwMDAsJXpwYywlZDA6dzoyXSkKKwlwZWEJKFsxMDAwLCVkMCwlenBjXSkKKwlwZWEJKFsxMDAwLCVhMSwlenBjXSkKKwlwZWEJKFslenBjLCVkMDp3OjJdLDIwMDApCisJcGVhCShbJXpwYywlYTBdLDIwMDApCisJcGVhCShbJXpwYywlZDA6dzoyXSkKKwlwZWEJKFslZDAsJXpwY10pCisKKwl8IEFic29sdXRlIHNob3J0CisJdHN0bAk0CisJdHN0bAk0LncKKwl0c3RsCSg0KS53CisKKwl8IEFic29sdXRlIGxvbmcKKwl0c3RsCTEwMDAwMAorCXRzdGwJOC5sCisJdHN0bAkoOCkubAorCisJfCBJbW1lZGlhdGUKKwlhZGRpYgkmMSwlZDAKKwlhZGRpdwkmMSwlZDAKKwlhZGRpbAkmMSwlZDAKKwlhZGRxYgkmMSwlZDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI0MTAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI0MTAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAzMzdhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zCkBAIC0wLDAgKzEsMTUgQEAKKy50ZXh0CitzdGFydDoJbm9wCisJbm9wCisJbm9wCisJYnJhcyBsYWJlbDEKKwlicmFzIGxhYmVsMgorLmdsb2JsIGxhYmVsMQorbGFiZWwxOglub3AKKwkuc3BhY2UgMHhhMAorCW5vcAorCW5vcAorLmdsb2JsIGxhYmVsMgorbGFiZWwyOglicmFzIGxhYmVsMQorCWJyYXMgbGFiZWwyCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzNjUwZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI2NjMucwpAQCAtMCwwICsxLDE2IEBACit8Cit8IFRoaXMgY29kZSBnZW5lcmF0ZXMgYW4gaW5jb3JyZWN0IHBjIHJlbGF0aXZlIG9mZnNldCAKK3wKK2J1ZzogICAgICAgbW92ZWwgICM0LCVkNworICAgICAgICAgICBqc3IgICAgdGFibGUoJXBjLCVkNy53KSAgICAgICAgICAgIHwgd3JvbmcKKyAgICAgICAgICAganNyICAgICVwY0AodGFibGUtLi0yOmIsJWQ3OncpICAgICB8IGNvcnJlY3QgYnV0IGNyeXB0aWMKKyAgICAgICAgICAgbm9wCisgICAgICAgICAgIG5vcAordGFibGU6CisgICAgICAgICAgIGJyYSAgICBqdW5rCisgICAgICAgICAgIGJyYSAgICBqdW5rCisgICAgICAgICAgIGJyYSAgICBqdW5rCisKK2p1bms6CisgICAgbm9wCisgICAgcnRzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5ODM1OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwuZApAQCAtMCwwICsxLDg4IEBACisjbmFtZTogcGNyZWwKKyNvYmpkdW1wOiAtZHJzIC1qIC50ZXh0IC0tcHJlZml4LWFkZHJlc3NlcworCisuKjogICAgIGZpbGUgZm9ybWF0IC4qCisKK0NvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6CisgMDAwMCA0ZTcxNGU3MSA0Y2ZhMDMwMCBmZmZhNGNmYSAwMzAwZmZmNCAgTnFOcUwuLi4uLkwuLi4uLgorIDAwMTAgNGNmYjAzMDAgMDhlZTQxZmEgZmZlYTQxZmEgZmZlNjQxZmEgIEwuLi4uLkEuLi5BLi4uQS4KKyAwMDIwIGZmNjI0MWZiIDA4ZGU0MWZiIDA4ZGE0MWZiIDA4ZDY0MWZiICAuYkEuLi5BLi4uQS4uLkEuCisgMDAzMCAwOTIwZmZkMiA0MWZiMDkyMCBmZmNjNDFmYiAwOTMwZmZmZiAgLiAuLkEuLiAuLkEuLjAuLgorIDAwNDAgZmZjNjQxZmIgMDkzMGZmZmYgZmZiZTRlNzEgNjFmZjAwMDAgIC4uQS4uMC4uLi5OcWEuLi4KKyAwMDUwIDAwNTg2MTAwIDAwNTI2MTRlIDYxNGM0ZTcxIDQxZjkwMDAwICAuWGEuLlJhTmFMTnFBLi4uCisgMDA2MCAwMChhNnwwMCk0MWZhIDAwNDI0MWZhIDAwYmU0MWZiIDA4M2E0MWZiICAuLkEuLkJBLi4uQS4uOkEuCisgMDA3MCAwODM2NDFmYiAwODMyNDFmYiAwOTIwMDAyZSA0MWZiMDkyMCAgLjZBLi4yQS4uIC4uQS4uIAorIDAwODAgMDAyODQxZmIgMDkzMDAwMDAgMDAyMjQxZmIgMDkzMDAwMDAgIC5cKEEuLjAuLi4iQS4uMC4uCisgMDA5MCAwMDFhNDFmYiAwOTMwMDAwMCAwMDEyNDFmYiAwOTIwMDAwYSAgLi5BLi4wLi4uLkEuLiAuLgorIDAwYTAgNDFmYjA4MDQgNGU3MTRlNzEgNGU3MTQxZmIgMDg4MDQxZmIgIEEuLi5OcU5xTnFBLi4uQS4KKyAwMGIwIDA5MjBmZjdmIDQxZmIwOTIwIDgwMDA0MWZiIDA5MzBmZmZmICAuIC4uQS4uIC4uQS4uMC4uCisgMDBjMCA3ZmZmNGU3MSA0MWZiMDg3ZiA0MWZiMDkyMCAwMDgwNDFmYiAgLi5OcUEuLi5BLi4gLi5BLgorIDAwZDAgMDkyMDdmZmYgNDFmYjA5MzAgMDAwMDgwMDAgNGU3MTQxZmEgIC4gLi5BLi4wLi4uLk5xQS4KKyAwMGUwIDgwMDA0MWZiIDAxNzBmZmZmIDdmZmY0ZTcxIDQxZmE3ZmZmICAuLkEuLnAuLi4uTnFBLi4uCisgMDBmMCA0MWZiMDE3MCAwMDAwODAwMCA0ZTcxNDFmYiAwMTcwKGZmZmZ8MDAwMCkgIEEuLnAuLi4uTnFBLi5wLi4KKyAwMTAwIChmZjA0fDAwMDApNDFmYiAwOTMwKGZmZmZ8MDAwMCkgKGZlZmN8MDAwMCk0ZTcxIDQxZjkwMDAwICAuLkEuLjAuLi4uTnFBLi4uCisgMDExMCAwMDAwLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgLi4uLi4uLi4uLi4uLi4uLgorRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6CiswKzAwMDAgPC4qPiBub3AKKzArMDAwMiA8bGJsX2I+IG5vcAorMCswMDA0IDxsYmxfYlwrKDB4fCkyPiBtb3ZlbWwgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAtJWExCiswKzAwMGEgPGxibF9iXCsoMHh8KTg+IG1vdmVtbCAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMC0lYTEKKzArMDAxMCA8bGJsX2JcKygweHwpZT4gbW92ZW1sICVwY0BcKDArMDIgPGxibF9iPiwlZDA6bFwpLCVhMC0lYTEKKzArMDAxNiA8bGJsX2JcKygweHwpMTQ+IGxlYSAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMAorMCswMDFhIDxsYmxfYlwrKDB4fCkxOD4gbGVhICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwCiswKzAwMWUgPGxibF9iXCsoMHh8KTFjPiBsZWEgJXBjQFwoZitmZjgyIDwuKj5cKSwlYTAKKzArMDAyMiA8bGJsX2JcKygweHwpMjA+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDAyNiA8bGJsX2JcKygweHwpMjQ+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDAyYSA8bGJsX2JcKygweHwpMjg+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDAyZSA8bGJsX2JcKygweHwpMmM+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDAzNCA8bGJsX2JcKygweHwpMzI+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDAzYSA8bGJsX2JcKygweHwpMzg+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDA0MiA8bGJsX2JcKygweHwpNDA+IGxlYSAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAKKzArMDA0YSA8bGJsX2JcKygweHwpNDg+IG5vcAorMCswMDRjIDxsYmxfYlwrKDB4fCk0YT4gYnNybCAwKzAwYTYgPGxibF9hPgorMCswMDUyIDxsYmxfYlwrKDB4fCk1MD4gYnNydyAwKzAwYTYgPGxibF9hPgorMCswMDU2IDxsYmxfYlwrKDB4fCk1ND4gYnNycyAwKzAwYTYgPGxibF9hPgorMCswMDU4IDxsYmxfYlwrKDB4fCk1Nj4gYnNycyAwKzAwYTYgPGxibF9hPgorMCswMDVhIDxsYmxfYlwrKDB4fCk1OD4gbm9wCiswKzAwNWMgPGxibF9iXCsoMHh8KTVhPiBsZWEgKDArMDBhNiA8bGJsX2E+fDArMCA8Lio+KSwlYTAKKwkJCTVlOiAoMzIJXC50ZXh0fFJfNjhLXzMyCVwudGV4dFwrMHhhNikKKzArMDA2MiA8bGJsX2JcKygweHwpNjA+IGxlYSAlcGNAXCgwKzAwYTYgPGxibF9hPlwpLCVhMAorMCswMDY2IDxsYmxfYlwrKDB4fCk2ND4gbGVhICVwY0BcKDArMDEyNiA8Lio+XCksJWEwCiswKzAwNmEgPGxibF9iXCsoMHh8KTY4PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwNmUgPGxibF9iXCsoMHh8KTZjPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwNzIgPGxibF9iXCsoMHh8KTcwPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwNzYgPGxibF9iXCsoMHh8KTc0PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwN2MgPGxibF9iXCsoMHh8KTdhPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwODIgPGxibF9iXCsoMHh8KTgwPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwOGEgPGxibF9iXCsoMHh8KTg4PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwOTIgPGxibF9iXCsoMHh8KTkwPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwOWEgPGxibF9iXCsoMHh8KTk4PiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwYTAgPGxibF9iXCsoMHh8KTllPiBsZWEgJXBjQFwoMCthNiA8bGJsX2E+LCVkMDpsXCksJWEwCiswKzAwYTQgPGxibF9iXCsoMHh8KWEyPiBub3AKKzArMDBhNiA8bGJsX2E+IG5vcAorMCswMGE4IDxsYmxfYVwrKDB4fCkyPiBub3AKKzArMDBhYSA8bGJsX2FcKygweHwpND4gbGVhICVwY0BcKDArMmMgPGxibF9iXCsoMHh8KTJhPiwlZDA6bFwpLCVhMAorMCswMGFlIDxsYmxfYVwrKDB4fCk4PiBsZWEgJXBjQFwoMCsyZiA8bGJsX2JcKygweHwpMmQ+LCVkMDpsXCksJWEwCiswKzAwYjQgPGxibF9hXCsoMHh8KWU+IGxlYSAlcGNAXChmKzgwYjYgPC4qPiwlZDA6bFwpLCVhMAorMCswMGJhIDxsYmxfYVwrKDB4fCkxND4gbGVhICVwY0BcKGYrODBiYiA8Lio+LCVkMDpsXCksJWEwCiswKzAwYzIgPGxibF9hXCsoMHh8KTFjPiBub3AKKzArMDBjNCA8bGJsX2FcKygweHwpMWU+IGxlYSAlcGNAXCgwKzE0NSA8Lio+LCVkMDpsXCksJWEwCiswKzAwYzggPGxibF9hXCsoMHh8KTIyPiBsZWEgJXBjQFwoMCsxNGEgPC4qPiwlZDA6bFwpLCVhMAorMCswMGNlIDxsYmxfYVwrKDB4fCkyOD4gbGVhICVwY0BcKDArODBjZiA8Lio+LCVkMDpsXCksJWEwCiswKzAwZDQgPGxibF9hXCsoMHh8KTJlPiBsZWEgJXBjQFwoMCs4MGQ2IDwuKj4sJWQwOmxcKSwlYTAKKzArMDBkYyA8bGJsX2FcKygweHwpMzY+IG5vcAorMCswMGRlIDxsYmxfYVwrKDB4fCkzOD4gbGVhICVwY0BcKGYrODBlMCA8Lio+XCksJWEwCiswKzAwZTIgPGxibF9hXCsoMHh8KTNjPiBsZWEgJXBjQFwoZis4MGUzIDwuKj5cKSwlYTAKKzArMDBlYSA8bGJsX2FcKygweHwpNDQ+IG5vcAorMCswMGVjIDxsYmxfYVwrKDB4fCk0Nj4gbGVhICVwY0BcKDArODBlZCA8Lio+XCksJWEwCiswKzAwZjAgPGxibF9hXCsoMHh8KTRhPiBsZWEgJXBjQFwoMCs4MGYyIDwuKj5cKSwlYTAKKzArMDBmOCA8bGJsX2FcKygweHwpNTI+IG5vcAorMCswMGZhIDxsYmxfYVwrKDB4fCk1ND4gbGVhICVwY0BcKCgwKzAgPC4qPnwwKzBmYyA8bGJsX2FcKygweHwpNTY+KVwpLCVhMAorCQkJZmU6IChESVNQMzIJdW5kZWZ8Ul82OEtfUEMzMgl1bmRlZlwrMHgyKQorMCswMTAyIDxsYmxfYVwrKDB4fCk1Yz4gbGVhICVwY0BcKCgwKzAgPC4qPnwwKzAxMDQgPGxibF9hXCsoMHh8KTVlPiksJWQwOmxcKSwlYTAKKwkJCTEwNjogKERJU1AzMgl1bmRlZnxSXzY4S19QQzMyCXVuZGVmXCsweDIpCiswKzAxMGEgPGxibF9hXCsoMHh8KTY0PiBub3AKKzArMDEwYyA8bGJsX2FcKygweHwpNjY+IGxlYSAwKzAgPC4qPiwlYTAKKwkJCTEwZTogKFJfNjhLXyk/MzIJdW5kZWYKKzArMDExMiA8bGJsX2FcKygweHwpNmM+IG5vcAorMCswMTE0IDxsYmxfYVwrKDB4fCk2ZT4gb3JpYiAjMCwlZDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGNyZWwucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzVjMjJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zCkBAIC0wLDAgKzEsNTkgQEAKKwlub3AKK2xibF9iOglub3AKKwltb3ZlbWwJbGJsX2IsJWEwLSVhMQorCW1vdmVtbAklcGNAKGxibF9iKSwlYTAtJWExCisJbW92ZW1sCSVwY0AobGJsX2IsJWQwKSwlYTAtJWExCisJbGVhCWxibF9iLCVhMAorCWxlYQklcGNAKGxibF9iKSwlYTAKKwlsZWEJJXBjQChsYmxfYi0xMjgpLCVhMAorCWxlYQklcGNAKGxibF9iLCVkMCksJWEwCisJbGVhCSVwY0AobGJsX2I6YiwlZDApLCVhMAorCWxlYQklcGNAKGxibF9iLS4tMjpiLCVkMCksJWEwCisJbGVhCSVwY0AobGJsX2I6dywlZDApLCVhMAorCWxlYQklcGNAKGxibF9iLS4tMjp3LCVkMCksJWEwCisJbGVhCSVwY0AobGJsX2I6bCwlZDApLCVhMAorCWxlYQklcGNAKGxibF9iLS4tMjpsLCVkMCksJWEwCisJbm9wCisJYnNybAlsYmxfYQorCWJzcglsYmxfYQorCWJzcnMJbGJsX2EKKwlqYnNyCWxibF9hCisJbm9wCisJbGVhCWxibF9hLCVhMAorCWxlYQklcGNAKGxibF9hKSwlYTAKKwlsZWEJJXBjQChsYmxfYSsxMjgpLCVhMAorCWxlYQklcGNAKGxibF9hLCVkMCksJWEwCisJbGVhCSVwY0AobGJsX2E6YiwlZDApLCVhMAorCWxlYQklcGNAKGxibF9hLS4tMjpiLCVkMCksJWEwCisJbGVhCSVwY0AobGJsX2E6dywlZDApLCVhMAorCWxlYQklcGNAKGxibF9hLS4tMjp3LCVkMCksJWEwCisJbGVhCSVwY0AobGJsX2E6bCwlZDApLCVhMAorCWxlYQklcGNAKGxibF9hLS4tMjpsLCVkMCksJWEwCisJbGVhCSVwY0AoMTg6bCwlZDApLCVhMAorCWxlYQklcGNAKDEwOncsJWQwKSwlYTAKKwlsZWEJJXBjQCg0OmIsJWQwKSwlYTAKKwlub3AKK2xibF9hOglub3AKKwlub3AKKwlsZWEJJXBjQCguLTEyNiwlZDApLCVhMAorCWxlYQklcGNAKC4tMTI3LCVkMCksJWEwCisJbGVhCSVwY0AoLi0zMjc2NiwlZDApLCVhMAorCWxlYQklcGNAKC4tMzI3NjcsJWQwKSwlYTAKKwlub3AKKwlsZWEJJXBjQCguKzEyOSwlZDApLCVhMAorCWxlYQklcGNAKC4rMTMwLCVkMCksJWEwCisJbGVhCSVwY0AoLiszMjc2OSwlZDApLCVhMAorCWxlYQklcGNAKC4rMzI3NzAsJWQwKSwlYTAKKwlub3AKKwlsZWEJJXBjQCguLTMyNzY2KSwlYTAKKwlsZWEJJXBjQCguLTMyNzY3KSwlYTAKKwlub3AKKwlsZWEJJXBjQCguKzMyNzY5KSwlYTAKKwlsZWEJJXBjQCguKzMyNzcwKSwlYTAKKwlub3AKKwlsZWEJJXBjQCh1bmRlZiksJWEwCisJbGVhCSVwY0AodW5kZWYsJWQwKSwlYTAKKwlub3AKKwlsZWEJdW5kZWYsJWEwCisJbm9wCisJLmxvbmcgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9waWMxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTc4Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9waWMxLnMKQEAgLTAsMCArMSw1IEBACisJLnRleHQKKwkuZ2xvYmwgX2ZvbworX2ZvbzoKKwlsZWFsICVwY0AoX2kpLCAlYTAKKwlsZWFsICVwY0AoX2ktLiksICVhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTA5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLmQKQEAgLTAsMCArMSw4IEBACisjUFJPRzogbm0KKyNuYW1lOiBwcmVzZW5jZSBvZiBzZWN0aW9uIHN5bWJvbHMKKworMDAwMDAwMTIgYiAuYnNzCiswMDAwMDAwZSBkIC5kYXRhCiswMDAwMDAwMCB0IC50ZXh0CiswMDAwMDAwZSBkIGxvb3AxCiswMDAwMDAwMCB0IGxvb3AyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3QyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3MWU4NgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucwpAQCAtMCwwICsxLDYgQEAKKwkudGV4dAorbG9vcDI6CQorCW1vdmUubAklZDEsJWEwQCsKKwlkYmYJJWQwLGxvb3AxCisJLmRhdGEKK2xvb3AxOglicmEJbG9vcDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkOTI1OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvaW5pdC5kCkBAIC0wLDAgKzEsMTEgQEAKKyNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKKyNuYW1lOiBwYWRkaW5nIG9mIC5pbml0IHNlY3Rpb24KKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuaW5pdDoKKzAwMDAwMDAwIDwuaW5pdD4gc3VidSAgICAgICAgcjMxLHIzMSwweDEwCiswMDAwMDAwNCA8LmluaXRcKzB4ND4gc3QgICAgICAgICAgcjEzLHIzMSwweDIwCiswMDAwMDAwOCA8LmluaXRcKzB4OD4gb3IgICAgICAgICAgcjAscjAscjAKKzAwMDAwMDBjIDwuaW5pdFwrMHhjPiBvciAgICAgICAgICByMCxyMCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY4MWNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMKQEAgLTAsMCArMSw1IEBACis7IFRlc3QgcHJvcGVyIHBhZGRpbmcgb2YgdGhlIC5pbml0IHNlY3Rpb24KKwlzZWN0aW9uCSAuaW5pdCwieCIKKwlhbGlnbgkgNAorCXN1YnUJIHIzMSxyMzEsMTYKKwlzdAkgcjEzLHIzMSwzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9tODhrLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwN2MxMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAKQEAgLTAsMCArMSwxMCBAQAorIworIyBUZXN0cyBmb3IgbTg4ayBzdnIzIHRhcmdldHMKKyMKK2lmIHsgW2lzdGFyZ2V0IG04OCotKi1zeXN2M10gfHwgW2lzdGFyZ2V0IG04OCotKi1jb2ZmKiBdIH0gdGhlbiB7CisgICAgc2V0IHRlc3RuYW1lICJQcm9wZXIgcGFkZGluZyBvZiAuaW5pdCBzZWN0aW9uIgorICAgIHJ1bl9kdW1wX3Rlc3QgaW5pdAorfQoraWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7CisgICAgdW5zZXQgZXJyb3JJbmZvCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5NzYzMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucwpAQCAtMCwwICsxLDUgQEAKKwkubWFjcm8JbQorCW0KKwkuZW5kbQorCisJbQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzM2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLmQKQEAgLTAsMCArMSwxMyBAQAorI29iamR1bXA6IC1yCisjbmFtZTogbWFjcm8gaXJwCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAuKgorT0ZGU0VUWyAJXStUWVBFWyAJXStWQUxVRS4qCiswKzAwWyAJXStbYS16QS1aMC05X10rWyAJXStyMQorMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjIKKzArMDhbIAldK1thLXpBLVowLTlfXStbIAldK3IzCiswKzBjWyAJXStbYS16QS1aMC05X10rWyAJXStzMQorMCsxMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rczIKKzArMTRbIAldK1thLXpBLVowLTlfXStbIAldK3MzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvaXJwLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5YTYyMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucwpAQCAtMCwwICsxLDggQEAKKwkuaXJwCXBhcmFtLDEsMiwzCisJLmxvbmcJclxwYXJhbQorCS5lbmRyCisKKwkuaXJwYwlwYXJhbSwxMjMKKwkubG9uZwlzXHBhcmFtCisJLmVuZHIKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvbWFjcm9zLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFlNDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAKQEAgLTAsMCArMSwyMiBAQAorIyBSdW4gc29tZSB0ZXN0cyBvZiBnYXMgbWFjcm9zLgorCitpZiAhW2lzdGFyZ2V0IGhwcGEqLSotKl0geworICAgIHJ1bl9kdW1wX3Rlc3QgdGVzdDEKK30KKworcnVuX2R1bXBfdGVzdCB0ZXN0MgorCitydW5fZHVtcF90ZXN0IHRlc3QzCisKK3J1bl9kdW1wX3Rlc3QgaXJwCisKK3J1bl9kdW1wX3Rlc3QgcmVwdAorCitnYXNfdGVzdF9lcnJvciAiZXJyLnMiICIiICJtYWNybyBpbmZpbml0ZSByZWN1cnNpb24iCisKK2Nhc2UgJHRhcmdldF90cmlwbGV0IGluIHsKKyAgICB7IGhwcGEqLSotKiB9IHsgfQorICAgIGRlZmF1bHQgeworCXJ1bl9kdW1wX3Rlc3Qgc2VtaQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjVkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kCkBAIC0wLDAgKzEsMTAgQEAKKyNvYmpkdW1wOiAtcgorI25hbWU6IG1hY3JvIHJlcHQKKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCitPRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKKzArMDBbIAldK1thLXpBLVowLTlfXStbIAldK3IxCiswKzA0WyAJXStbYS16QS1aMC05X10rWyAJXStyMQorMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0M2NmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5zCkBAIC0wLDAgKzEsMyBAQAorCS5yZXB0CTMKKwkubG9uZwlyMQorCS5lbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg5ZTczCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3NlbWkuZApAQCAtMCwwICsxLDggQEAKKyNvYmpkdW1wOiAtcyAtaiAudGV4dAorI25hbWU6IHNlbWkKKworLio6IC4qCisKK0NvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6CisgMDAwMCAzYjIwM2IyMCAzYTIwM2EyMCAwMDAwMDAwMCAwMDAwMDAwMCAgOyA7IDogOiAuLi4uLi4uLgorIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTA5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zCkBAIC0wLDAgKzEsMTQgQEAKKyAgICAgICAgLm1hY3JvIHNlbWljb2xvbgorICAgICAgICAuYXNjaWkgIjsgIgorICAgICAgICAuZW5kbQorCisgICAgICAgIC5tYWNybyBjb2xvbgorICAgICAgICAuYXNjaWkgIjogIgorICAgICAgICAuZW5kbQorCisgICAgICAgIHNlbWljb2xvbgorICAgICAgICAuYXNjaWkgIjsgIgorICAgICAgICBjb2xvbgorICAgICAgICAuYXNjaWkgIjogIgorCisJLnAyYWxpZ24gNSwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGIzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZApAQCAtMCwwICsxLDUgQEAKKyNubTogLS1leHRlcm4tb25seQorI25hbWU6IG1hY3JvIHRlc3QgMQorCiswKzAxIEEgczEKKzArMDIgQSBzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODhiN2NkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLnMKQEAgLTAsMCArMSw3IEBACisJLm1hY3JvCW0gYXJnMSBhcmcyCisJLmdsb2JsCVxhcmcxCisJXGFyZzEgPSBcYXJnMgorCS5lbmRtCisKKwltIHMxLDEKKwltIHMyLDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZDczNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kCkBAIC0wLDAgKzEsMTAgQEAKKyNvYmpkdW1wOiAtcgorI25hbWU6IG1hY3JvIHRlc3QgMgorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK1JFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKK09GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgorMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rcjEKKzArMDRbIAldK1thLXpBLVowLTlfXStbIAldK3IyCiswKzA4WyAJXStbYS16QS1aMC05X10rWyAJXStyMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhjZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMKQEAgLTAsMCArMSw5IEBACisJLm1hY3JvCW0gYXJnMSBhcmcyIGFyZzMKKwkubG9uZwlcYXJnMQorCS5pZmMJLFxhcmcyXGFyZzMKKwkuRUxTRQorCW0JXGFyZzIsXGFyZzMKKwkuZW5kaWYKKwkuZW5kbQorCisJbQlyMSxyMixyMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTgwZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLmQKQEAgLTAsMCArMSw4IEBACisjb2JqZHVtcDogLXIKKyNuYW1lOiBtYWNybyB0ZXN0IDMKKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCitPRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKKzArMDBbIAldK1thLXpBLVowLTlfXStbIAldK3IxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDEwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMucwpAQCAtMCwwICsxLDcgQEAKKwkubWFjcm8JbSBhcmcxIGFyZzIKKwlcYXJnMQorCS5leGl0bQorCVxhcmcyCisJLmVuZG0KKworCW0JIi5sb25nIHIxIiwuZ2FyYmFnZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2Q4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmQKQEAgLTAsMCArMSw0MDAgQEAKKyNhczoKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBhbGxpbnNuCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCswMDAgPGFicz46CisgICAwOgkwMSBlMCAgICAgICAJYWJzCXIwCisKKzArMDAyIDxhZGRjPjoKKyAgIDI6CTA2IDIxICAgICAgIAlhZGRjCXIxLCByMgorCiswKzAwNCA8YWRkaT46CisgICA0OgkyMCAwMyAgICAgICAJYWRkaQlyMywgMQorCiswKzAwNiA8YWRkdT46CisgICA2OgkxYyA1NCAgICAgICAJYWRkdQlyNCwgcjUKKworMCswMDggPGFuZD46CisgICA4OgkxNiA3NiAgICAgICAJYW5kCXI2LCByNworCiswKzAwYSA8YW5kaT46CisgICBhOgkyZSAyOCAgICAgICAJYW5kaQlyOCwgMgorCiswKzAwYyA8YW5kbj46CisgICBjOgkxZiBhOSAgICAgICAJYW5kbglyOSwgcjEwCisKKzArMDBlIDxhc3I+OgorICAgZToJMWEgY2IgICAgICAgCWFzcglyMTEsIHIxMgorCiswKzAxMCA8YXNyYz46CisgIDEwOgkzYSAwZCAgICAgICAJYXNyYwlyMTMKKworMCswMTIgPGFzcmk+OgorICAxMjoJM2IgZmUgICAgICAgCWFzcmkJcjE0LCAzMQorCiswKzAxNCA8YmNscmk+OgorICAxNDoJMzAgMGYgICAgICAgCWJjbHJpCXIxNSwgMAorCiswKzAxNiA8YmY+OgorICAxNjoJZWYgZjQgICAgICAgCWJmCTB4MAorCiswKzAxOCA8Ymdlbmk+OgorICAxODoJMzIgNzAgICAgICAgCWJnZW5pCXIwLCA3CisKKzArMDFhIDxCR0VOST46CisgIDFhOgkzMiA4MCAgICAgICAJYmdlbmkJcjAsIDgKKworMCswMWMgPEJHRU5pPjoKKyAgMWM6CTMzIGYwICAgICAgIAliZ2VuaQlyMCwgMzEKKworMCswMWUgPGJnZW5yPjoKKyAgMWU6CTEzIDIxICAgICAgIAliZ2VucglyMSwgcjIKKworMCswMjAgPGJrcHQ+OgorCS4uLgorCiswKzAyMiA8Ym1hc2tpPjoKKyAgMjI6CTJjIDgzICAgICAgIAlibWFza2kJcjMsIDgKKworMCswMjQgPEJNQVNLST46CisgIDI0OgkyZCBmMyAgICAgICAJYm1hc2tpCXIzLCAzMQorCiswKzAyNiA8YnI+OgorICAyNjoJZjcgZmYgICAgICAgCWJyCTB4MjYKKworMCswMjggPGJyZXY+OgorICAyODoJMDAgZjQgICAgICAgCWJyZXYJcjQKKworMCswMmEgPGJzZXRpPjoKKyAgMmE6CTM1IGU1ICAgICAgIAlic2V0aQlyNSwgMzAKKworMCswMmMgPGJzcj46CisgIDJjOglmZiBlOSAgICAgICAJYnNyCTB4MAorCiswKzAyZSA8YnQ+OgorICAyZToJZTcgZTggICAgICAgCWJ0CTB4MAorCiswKzAzMCA8YnRzdGk+OgorICAzMDoJMzcgYjYgICAgICAgCWJ0c3RpCXI2LCAyNworCiswKzAzMiA8Y2xyYz46CisgIDMyOgkwZiAwMCAgICAgICAJY21wbmUJcjAsIHIwCisKKzArMDM0IDxjbHJmPjoKKyAgMzQ6CTAxIGQ3ICAgICAgIAljbHJmCXI3CisKKzArMDM2IDxjbHJ0PjoKKyAgMzY6CTAxIGM4ICAgICAgIAljbHJ0CXI4CisKKzArMDM4IDxjbXBocz46CisgIDM4OgkwYyBhOSAgICAgICAJY21waHMJcjksIHIxMAorCiswKzAzYSA8Y21wbHQ+OgorICAzYToJMGQgY2IgICAgICAgCWNtcGx0CXIxMSwgcjEyCisKKzArMDNjIDxjbXBsZWk+OgorICAzYzoJMjIgZWIgICAgICAgCWNtcGx0aQlyMTEsIDE1CisKKzArMDNlIDxjbXBsdGk+OgorICAzZToJMjMgZmQgICAgICAgCWNtcGx0aQlyMTMsIDMyCisKKzArMDQwIDxjbXBuZT46CisgIDQwOgkwZiBmZSAgICAgICAJY21wbmUJcjE0LCByMTUKKworMCswNDIgPGNtcG5laT46CisgIDQyOgkyYSAwMCAgICAgICAJY21wbmVpCXIwLCAwCisKKzArMDQ0IDxkZWNmPjoKKyAgNDQ6CTAwIDkxICAgICAgIAlkZWNmCXIxCisKKzArMDQ2IDxkZWNndD46CisgIDQ2OgkwMSBhMiAgICAgICAJZGVjZ3QJcjIKKworMCswNDggPGRlY2x0PjoKKyAgNDg6CTAxIDgzICAgICAgIAlkZWNsdAlyMworCiswKzA0YSA8ZGVjbmU+OgorICA0YToJMDEgYjQgICAgICAgCWRlY25lCXI0CisKKzArMDRjIDxkZWN0PjoKKyAgNGM6CTAwIDg1ICAgICAgIAlkZWN0CXI1CisKKzArMDRlIDxkaXZzPjoKKyAgNGU6CTMyIDE2ICAgICAgIAlkaXZzCXI2LCByMQorCiswKzA1MCA8ZGl2dT46CisgIDUwOgkyYyAxOCAgICAgICAJZGl2dQlyOCwgcjEKKworMCswNTIgPGRvemU+OgorICA1MjoJMDAgMDYgICAgICAgCWRvemUKKworMCswNTQgPGZmMT46CisgIDU0OgkwMCBlYSAgICAgICAJZmYxCXIxMAorCiswKzA1NiA8aW5jZj46CisgIDU2OgkwMCBiYiAgICAgICAJaW5jZglyMTEKKworMCswNTggPGluY3Q+OgorICA1ODoJMDAgYWMgICAgICAgCWluY3QJcjEyCisKKzArMDVhIDxpeGg+OgorICA1YToJMWQgZWQgICAgICAgCWl4aAlyMTMsIHIxNAorCiswKzA1YyA8aXh3PjoKKyAgNWM6CTE1IDBmICAgICAgIAlpeHcJcjE1LCByMAorCiswKzA1ZSA8amJmPjoKKyAgNWU6CWVmIGQwICAgICAgIAliZgkweDAKKworMCswNjAgPGpicj46CisgIDYwOglmMCAwZSAgICAgICAJYnIJMHg3ZQorCiswKzA2MiA8amJzcj46CisgIDYyOgk3ZiAwYSAgICAgICAJanNyaQkweC4qCisKKzArMDY0IDxqYnQ+OgorICA2NDoJZTAgMGMgICAgICAgCWJ0CTB4N2UKKworMCswNjYgPGptcD46CisgIDY2OgkwMCBjMSAgICAgICAJam1wCXIxCisKKzArMDY4IDxqbXBpPjoKKyAgNjg6CTcwIDA5ICAgICAgIAlqbXBpCTB4LioKKworMCswNmEgPGpzcj46CisgIDZhOgkwMCBkMiAgICAgICAJanNyCXIyCisKKzArMDZjIDxqc3JpPjoKKyAgNmM6CTdmIDA4ICAgICAgIAlqc3JpCTB4LioKKworMCswNmUgPGxkLmI+OgorICA2ZToJYTMgMDQgICAgICAgCWxkYglyMywgXChyNCwgMFwpCisKKzArMDcwIDxsZC5oPjoKKyAgNzA6CWM1IDE2ICAgICAgIAlsZGgJcjUsIFwocjYsIDJcKQorCiswKzA3MiA8bGQudz46CisgIDcyOgk4NyAxOCAgICAgICAJbGQJcjcsIFwocjgsIDRcKQorCiswKzA3NCA8bGRiPjoKKyAgNzQ6CWE5IGZhICAgICAgIAlsZGIJcjksIFwocjEwLCAxNVwpCisKKzArMDc2IDxsZGg+OgorICA3NjoJY2IgZmMgICAgICAgCWxkaAlyMTEsIFwocjEyLCAzMFwpCisKKzArMDc4IDxsZD46CisgIDc4Ogk4ZCA1ZSAgICAgICAJbGQJcjEzLCBcKHIxNCwgMjBcKQorCiswKzA3YSA8bGR3PjoKKyAgN2E6CThkIGZlICAgICAgIAlsZAlyMTMsIFwocjE0LCA2MFwpCisKKzArMDdjIDxsZG0+OgorICA3YzoJMDAgNjIgICAgICAgCWxkbQlyMi1yMTUsIFwocjBcKQorCiswKzA3ZSA8Zm9vbG9vcD46CisgIDdlOgkwMCA0MSAgICAgICAJbGRxCXI0LXI3LCBcKHIxXCkKKworMCswODAgPGxvb3B0PjoKKyAgODA6CTA0IDhlICAgICAgIAlsb29wdAlyOCwgMHg2NAorCiswKzA4MiA8TFJXPjoKKyAgODI6CTc5IDAzICAgICAgIAlscncJcjksIDB4LioKKworMCswODQgPGxydz46CisgIDg0Ogk3OSAwNCAgICAgICAJbHJ3CXI5LCAweDQzMjEKKworMCswODYgPGZvb2xpdD46CisgIDg2OgkxMiAzNCAgICAgICAJbW92CXI0LCByMworCiswKzA4OCA8bHNsPjoKKyAgODg6CTFiIGJhICAgICAgIAlsc2wJcjEwLCByMTEKKworMCswOGEgPGxzbGM+OgorICA4YToJM2MgMGMgICAgICAgCWxzbGMJcjEyCisKKzArMDhjIDwuWFAwMDAxPjoKKwkuLi4KKwkJCThjOiBBRERSMzIJLnRleHQKKwkJCTkwOiBBRERSMzIJLnRleHQuKgorICA5NDoJMDAgMDAgICAgICAgCWJrcHQKKyAgOTY6CTQzIDIxICAgICAgIAkud29yZCAweDQzMjEKKworMCswOTggPGxzbGk+OgorICA5ODoJM2QgZmQgICAgICAgCWxzbGkJcjEzLCAzMQorCiswKzA5YSA8bHNyPjoKKyAgOWE6CTBiIGZlICAgICAgIAlsc3IJcjE0LCByMTUKKworMCswOWMgPGxzcmM+OgorICA5YzoJM2UgMDAgICAgICAgCWxzcmMJcjAKKworMCswOWUgPGxzcmk+OgorICA5ZToJM2UgMTEgICAgICAgCWxzcmkJcjEsIDEKKworMCswYTAgPG1jbHJpPjoKKyAgYTA6CTMwIDY0ICAgICAgIAliY2xyaQlyNCwgNgorCiswKzBhMiA8bWZjcj46CisgIGEyOgkxMCAwMiAgICAgICAJbWZjcglyMiwgcHNyCisKKzArMGE0IDxtb3Y+OgorICBhNDoJMTIgNDMgICAgICAgCW1vdglyMywgcjQKKworMCswYTYgPG1vdmY+OgorICBhNjoJMGEgNjUgICAgICAgCW1vdmYJcjUsIHI2CisKKzArMGE4IDxtb3ZpPjoKKyAgYTg6CTY3IGY3ICAgICAgIAltb3ZpCXI3LCAxMjcKKworMCswYWEgPG1vdnQ+OgorICBhYToJMDIgOTggICAgICAgCW1vdnQJcjgsIHI5CisKKzArMGFjIDxtdGNyPjoKKyAgYWM6CTE4IDBhICAgICAgIAltdGNyCXIxMCwgcHNyCisKKzArMGFlIDxtdWx0PjoKKyAgYWU6CTAzIGNiICAgICAgIAltdWx0CXIxMSwgcjEyCisKKzArMGIwIDxtdmM+OgorICBiMDoJMDAgMmQgICAgICAgCW12YwlyMTMKKworMCswYjIgPG12Y3Y+OgorICBiMjoJMDAgM2UgICAgICAgCW12Y3YJcjE0CisKKzArMGI0IDxuZWc+OgorICBiNDoJMjggMDIgICAgICAgCXJzdWJpCXIyLCAwCisKKzArMGI2IDxub3Q+OgorICBiNjoJMDEgZmYgICAgICAgCW5vdAlyMTUKKworMCswYjggPG9yPjoKKyAgYjg6CTFlIDEwICAgICAgIAlvcglyMCwgcjEKKworMCswYmEgPHJmaT46CisgIGJhOgkwMCAwMyAgICAgICAJcmZpCisKKzArMGJjIDxyb2xjPjoKKyAgYmM6CTA2IDY2ICAgICAgIAlhZGRjCXI2LCByNgorCiswKzBiZSA8cm9yaT46CisgIGJlOgkzOSBhOSAgICAgICAJcm90bGkJcjksIDI2CisKKzArMGMwIDxyb3RsYz46CisgIGMwOgkwNiA2NiAgICAgICAJYWRkYwlyNiwgcjYKKworMCswYzIgPHJvdGxpPjoKKyAgYzI6CTM4IGEyICAgICAgIAlyb3RsaQlyMiwgMTAKKworMCswYzQgPHJvdHJpPjoKKyAgYzQ6CTM5IGE5ICAgICAgIAlyb3RsaQlyOSwgMjYKKworMCswYzYgPHJzdWI+OgorICBjNjoJMTQgNDMgICAgICAgCXJzdWIJcjMsIHI0CisKKzArMGM4IDxyc3ViaT46CisgIGM4OgkyOCAwNSAgICAgICAJcnN1YmkJcjUsIDAKKworMCswY2EgPHJ0ZT46CisgIGNhOgkwMCAwMiAgICAgICAJcnRlCisKKzArMGNjIDxydHM+OgorICBjYzoJMDAgY2YgICAgICAgCWptcAlyMTUKKworMCswY2UgPHNldGM+OgorICBjZToJMGMgMDAgICAgICAgCWNtcGhzCXIwLCByMAorCiswKzBkMCA8c2V4dGI+OgorICBkMDoJMDEgNTYgICAgICAgCXNleHRiCXI2CisKKzArMGQyIDxzZXh0aD46CisgIGQyOgkwMSA3NyAgICAgICAJc2V4dGgJcjcKKworMCswZDQgPHN0LmI+OgorICBkNDoJYjggMDkgICAgICAgCXN0YglyOCwgXChyOSwgMFwpCisKKzArMGQ2IDxzdC5oPjoKKyAgZDY6CWRhIDFiICAgICAgIAlzdGgJcjEwLCBcKHIxMSwgMlwpCisKKzArMGQ4IDxzdC53PjoKKyAgZDg6CTljIDFkICAgICAgIAlzdAlyMTIsIFwocjEzLCA0XCkKKworMCswZGEgPHN0Yj46CisgIGRhOgliZSBmZiAgICAgICAJc3RiCXIxNCwgXChyMTUsIDE1XCkKKworMCswZGMgPHN0aD46CisgIGRjOglkMCBmMSAgICAgICAJc3RoCXIwLCBcKHIxLCAzMFwpCisKKzArMGRlIDxzdHc+OgorICBkZToJOTIgZjMgICAgICAgCXN0CXIyLCBcKHIzLCA2MFwpCisKKzArMGUwIDxzdD46CisgIGUwOgk5NCAwNSAgICAgICAJc3QJcjQsIFwocjUsIDBcKQorCiswKzBlMiA8c3RtPjoKKyAgZTI6CTAwIDdlICAgICAgIAlzdG0JcjE0LXIxNSwgXChyMFwpCisKKzArMGU0IDxzdG9wPjoKKyAgZTQ6CTAwIDA0ICAgICAgIAlzdG9wCisKKzArMGU2IDxzdHE+OgorICBlNjoJMDAgNTEgICAgICAgCXN0cQlyNC1yNywgXChyMVwpCisKKzArMGU4IDxzdWJjPjoKKyAgZTg6CTA3IGQ3ICAgICAgIAlzdWJjCXI3LCByMTMKKworMCswZWEgPHN1Ymk+OgorICBlYToJMjUgZmUgICAgICAgCXN1YmkJcjE0LCAzMgorCiswKzBlYyA8c3VidT46CisgIGVjOgkwNSAzOSAgICAgICAJc3VidQlyOSwgcjMKKworMCswZWUgPHN5bmM+OgorICBlZToJMDAgMDEgICAgICAgCXN5bmMKKworMCswZjAgPHRzdGx0PjoKKyAgZjA6CTM3IGY1ICAgICAgIAlidHN0aQlyNSwgMzEKKworMCswZjIgPHRzdG5lPjoKKyAgZjI6CTJhIDA3ICAgICAgIAljbXBuZWkJcjcsIDAKKworMCswZjQgPHRyYXA+OgorICBmNDoJMDAgMGEgICAgICAgCXRyYXAJMgorCiswKzBmNiA8dHN0PjoKKyAgZjY6CTBlIGVlICAgICAgIAl0c3QJcjE0LCByMTQKKworMCswZjggPHRzdG5iej46CisgIGY4OgkwMSA5MiAgICAgICAJdHN0bmJ6CXIyCisKKzArMGZhIDx3YWl0PjoKKyAgZmE6CTAwIDA1ICAgICAgIAl3YWl0CisKKzArMGZjIDx4b3I+OgorICBmYzoJMTcgMGYgICAgICAgCXhvcglyMTUsIHIwCisKKzArMGZlIDx4c3I+OgorICBmZToJMzggMGIgICAgICAgCXhzcglyMTEKKworMCswMTAwIDx4dHJiMD46CisgMTAwOgkwMSAzMSAgICAgICAJeHRyYjAJcjEsIHIxCisKKzArMDEwMiA8eHRyYjE+OgorIDEwMjoJMDEgMjIgICAgICAgCXh0cmIxCXIxLCByMgorCiswKzAxMDQgPHh0cmIyPjoKKyAxMDQ6CTAxIDEwICAgICAgIAl4dHJiMglyMSwgcjAKKworMCswMTA2IDx4dHJiMz46CisgMTA2OgkwMSAwZCAgICAgICAJeHRyYjMJcjEsIHIxMworCiswKzAxMDggPHpleHRiPjoKKyAxMDg6CTAxIDQ4ICAgICAgIAl6ZXh0YglyOAorCiswKzAxMGEgPHpleHRoPjoKKyAxMGE6CTAxIDY0ICAgICAgIAl6ZXh0aAlyNAorIDEwYzoJMGYgMDAgICAgICAgCWNtcG5lCXIwLCByMAorIDEwZToJMGYgMDAgICAgICAgCWNtcG5lCXIwLCByMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU3ODYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAKQEAgLTAsMCArMSw1IEBACisjIE0qQ29yZSBhc3NlbWJsZXIgdGVzdHN1aXRlLgorCitpZiBbaXN0YXJnZXQgbWNvcmUtKi0qXSB7CisgICAgcnVuX2R1bXBfdGVzdCAiYWxsaW5zbiIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21jb3JlL2FsbGluc24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA2ODQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zCkBAIC0wLDAgKzEsMTQ2IEBACisgLmRhdGEKK2Zvb2RhdGE6IC53b3JkIDQyCisJIC50ZXh0Citmb290ZXh0OgorCisubWFjcm8gdGVzdCBpbnNuIHRleHQ9IiIKKwkuZXhwb3J0IFxpbnNuCitcaW5zbjoKKwlcaW5zbiBcdGV4dAorLmVuZG0KKworCXRlc3QgYWJzICAgcjAJCQorCXRlc3QgYWRkYyAgInIxLHIyIgkvLyBBIGRvdWJsZSBmb3J3YXJkIHNsYXNoIHN0YXJ0cyBhIGxpbmUgY29tbWVudAorCXRlc3QgYWRkaSAgInIzLCAxIgkjIFNvIGRvZXMgYSBoYXNoCisJdGVzdCBhZGR1ICAicjQsIHI1IgkvLyBXaGl0ZSBzcGFjZSBiZXR3ZWVuIG9wZXJhbmRzIHNob3VsZCBiZSBpZ25vcmVkCisJdGVzdCBhbmQgICAicjYscjciICAgOwl0ZXN0IGFuZGkgICJyOCwjMiIgLy8gQSBzZW1pY29sb24gc2VwZXJhdGVzIHN0YXRlbWVudHMKKwl0ZXN0IGFuZG4gICJyOSwgcjEwIgorCXRlc3QgYXNyICAgInIxMSwgUjEyIgkvLyBVcHBlcmNhc2UgUiBpcyBhbGxvd2VkIGFzIGEgcmVnaXN0ZXIgcHJlZml4CisJdGVzdCBhc3JjICAicjEzIgorCXRlc3QgYXNyaSAgInIxNCwjMHgxZiIKKwl0ZXN0IGJjbHJpICJyMTUsMCIKKwl0ZXN0IGJmICAgIGZvb3RleHQKKwl0ZXN0IGJnZW5pICJzcCwgNyIJLy8gcjAgY2FuIGFsc28gYmUgcmVmZXJlZCB0byBhcyAnc3AnCisJdGVzdCBCR0VOSSAicjAsIDgiCS8vIE9mZmljaWFsbHkgdXBwZXIgY2FzZSBvciBtaXhlZCBjYXNlCisJdGVzdCBCR0VOaSAicjAsIDMxIgkvLyBtbmVtb25pY3Mgc2hvdWxkIG5vdCBiZSBhbGxvd2VkLCBidXQgd2UgcmVsYXggdGhpcy4uLgorCXRlc3QgYmdlbnIgInIxLCByMiIKKwl0ZXN0IGJrcHQKKwl0ZXN0IGJtYXNraSAicjMsIzgiCisJdGVzdCBCTUFTS0kgInIzLDB4MWYiCisJdGVzdCBiciAgICAgLiAgLy8gRG90IG1lYW5zIHRoZSBjdXJyZW50IGFkZHJlc3MKKwl0ZXN0IGJyZXYgICByNAorCXRlc3QgYnNldGkgICJyNSwzMCIKKwl0ZXN0IGJzciAgICBmb290ZXh0CisJdGVzdCBidCAgICAgZm9vdGV4dAorCXRlc3QgYnRzdGkgICJyNiwgMjciCisJdGVzdCBjbHJjICAgCisJdGVzdCBjbHJmICAgcjcKKwl0ZXN0IGNscnQgICByOAorCXRlc3QgY21waHMgICJyOSxyMTAiCisJdGVzdCBjbXBsdCAgInIxMSxyMTIiIAorCXRlc3QgY21wbGVpICJyMTEsIDE0IiAKKwl0ZXN0IGNtcGx0aSAicjEzLDMyIgorCXRlc3QgY21wbmUgICJyMTQsIHIxNSIKKwl0ZXN0IGNtcG5laSAicjAsMCIKKwl0ZXN0IGRlY2YgICByMQorCXRlc3QgZGVjZ3QgIHIyCisJdGVzdCBkZWNsdCAgcjMKKwl0ZXN0IGRlY25lICByNAorCXRlc3QgZGVjdCAgIHI1CisJdGVzdCBkaXZzICAgInI2LHIxIgorCXRlc3QgZGl2dSAgICJyOCwgcjEiCisJdGVzdCBkb3plCisJdGVzdCBmZjEgICAgcjEwCisJdGVzdCBpbmNmICAgcjExCisJdGVzdCBpbmN0ICAgcjEyCisJdGVzdCBpeGggICAgInIxMyxyMTQiCisJdGVzdCBpeHcgICAgInIxNSxyMCIKKwl0ZXN0IGpiZiAgICBmb290ZXh0CisJdGVzdCBqYnIgICAgZm9vbG9vcAorCXRlc3QgamJzciAgIGZvb3RleHQKKwl0ZXN0IGpidCAgICBmb29sb29wCisJdGVzdCBqbXAgICAgcjEKKwl0ZXN0IGptcGkgICBmb290ZXh0IAorCXRlc3QganNyICAgIHIyCisJdGVzdCBqc3JpICAgZm9vdGV4dAorCXRlc3QgbGQuYiAgICJyMywocjQsMCkiCisJdGVzdCBsZC5oICAgInI1ICwgKCByNiwgIzIpIgorCXRlc3QgbGQudyAgICJyNywgKHI4LCAweDQpIgorCXRlc3QgbGRiICAgICJyOSwocjEwLCMweGYpIgorCXRlc3QgbGRoICAgICJyMTEsIChyMTIsIDMwKSIKKwl0ZXN0IGxkICAgICAicjEzLCAocjE0LCAyMCkiCisJdGVzdCBsZHcgICAgInIxMywgKHIxNCwgNjApIgorCXRlc3QgbGRtICAgICJyMi1yMTUsKHIwKSIKKwkuZXhwb3J0IGZvb2xvb3AKK2Zvb2xvb3A6CQkKKwl0ZXN0IGxkcSAgICAicjQtcjcsKHIxKSIKKwl0ZXN0IGxvb3B0ICAicjgsIGZvb2xvb3AiCisJdGVzdCBMUlcgICAgInI5LCBbZm9vbGl0XSIKKwl0ZXN0IGxydyAgICAicjksIDB4NDMyMSIgICAJLy8gUEMgcmVsIGluZGlyZWN0CisJLmdsb2JhbCBmb29saXQKK2Zvb2xpdDoKKwkud29yZCAweDEyMzQKKwl0ZXN0IGxzbCAgICAicjEwLHIxMSIKKwl0ZXN0IGxzbGMgICByMTIKKwkubGl0ZXJhbHMJCQkvLyBEdW1wIGxpdGVyYWxzIHRhYmxlCQorCXRlc3QgbHNsaSAgICJyMTMsMzEiCisJdGVzdCBsc3IgICAgInIxNCxyMTUiCisJdGVzdCBsc3JjICAgcjAKKwl0ZXN0IGxzcmkgICAicjEsMSIKKwl0ZXN0IG1jbHJpICAicjQsIDY0IgorCXRlc3QgbWZjciAgICJyMiwgY3IwIgorCXRlc3QgbW92ICAgICJyMyxyNCIKKwl0ZXN0IG1vdmYgICAicjUsIHI2IgorCXRlc3QgbW92aSAgICJyNywgMTI3IgorCXRlc3QgbW92dCAgICJyOCwgcjkiCisJdGVzdCBtdGNyICAgInIxMCwgcHNyIgorCXRlc3QgbXVsdCAgICJyMTEsIHIxMiIKKwl0ZXN0IG12YyAgICByMTMKKwl0ZXN0IG12Y3YgICByMTQKKwl0ZXN0IG5lZyAgICByMgorCXRlc3Qgbm90ICAgIHIxNQorCXRlc3Qgb3IgICAgICJyMCxyMSIKKwl0ZXN0IHJmaQorCXRlc3Qgcm9sYyAgICJyNiwgMSIKKwl0ZXN0IHJvcmkgICAicjksIDYiCisJdGVzdCByb3RsYyAgInI2LCAxIgorCXRlc3Qgcm90bGkgICJyMiwgIzEwIgorCXRlc3Qgcm90cmkgICJyOSwgNiIKKwl0ZXN0IHJzdWIgICAicjMsIHI0IgorCXRlc3QgcnN1YmkgICJyNSwgMHgwIgorCXRlc3QgcnRlCisJdGVzdCBydHMKKwl0ZXN0IHNldGMKKwl0ZXN0IHNleHRiICByNgorCXRlc3Qgc2V4dGggIHI3CisJdGVzdCBzdC5iICAgInI4LCAocjksIDApIgorCXRlc3Qgc3QuaCAgICJyMTAsIChyMTEsIDIpIgorCXRlc3Qgc3QudyAgICJyMTIsIChyMTMsIDQpIgorCXRlc3Qgc3RiICAgICJyMTQsIChyMTUsIDE1KSIJCisJdGVzdCBzdGggICAgInIwLCAocjEsIDMwKSIKKwl0ZXN0IHN0dyAgICAicjIsIChyMywgMHgzYykiCisJdGVzdCBzdCAgICAgInI0LCAocjUsIDApIgorCXRlc3Qgc3RtICAgICJyMTQgLSByMTUgLCAocjApIgorCXRlc3Qgc3RvcAorCXRlc3Qgc3RxICAgICJyNCAtIHI3ICwgKHIxKSIKKwl0ZXN0IHN1YmMgICAicjcsIHIxMyIKKwl0ZXN0IHN1YmkgICAicjE0LCAzMiIKKwl0ZXN0IHN1YnUgICAicjksIHIzIgorCXRlc3Qgc3luYworCXRlc3QgdHN0bHQgIHI1CisJdGVzdCB0c3RuZSAgcjcKKwl0ZXN0IHRyYXAgICAyCisJdGVzdCB0c3QgICAgInIxNCwgcjE0IgorCXRlc3QgdHN0bmJ6IHIyCisJdGVzdCB3YWl0CisJdGVzdCB4b3IgICAgInIxNSxyMCIKKwl0ZXN0IHhzciAgICByMTEKKwl0ZXN0IHh0cmIwICAicjEsIHIxIgorCXRlc3QgeHRyYjEgICJyMSwgcjIiCisJdGVzdCB4dHJiMiAgInIxLCByMCIKKwl0ZXN0IHh0cmIzICAicjEsIHIxMyIKKwl0ZXN0IHpleHRiICByOAorCXRlc3QgemV4dGggIHI0CisJY2xyYwkJCS8vIFRoZXNlIHR3byBpbnN0cnVjdGlvbnMgcGFkIHRoZSBvYmplY3QgZmlsZQorCWNscmMJCQkvLyBvdXQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NmQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Ficy5kCkBAIC0wLDAgKzEsMTUgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCisjbmFtZTogTUlQUyBhYnMKKworIyBUZXN0IHRoZSBhYnMgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMGMgPGZvb1wrKDB4fCljPgorMCswMDA0IDxbXj5dKj4gbm9wCiswKzAwMDggPFtePl0qPiBuZWcJXCRhMCxcJGEwCiswKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTEsMCswMDE4IDxmb29cKygweHwpMTg+CiswKzAwMTAgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQorMCswMDE0IDxbXj5dKj4gbmVnCVwkYTAsXCRhMQorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKQEAgLTAsMCArMSw1IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWJzIG1hY3JvLgorZm9vOgorCWFicwkkNAorCWFicwkkNCwkNQorCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxZDFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZApAQCAtMCwwICsxLDIwIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgYWRkCisKKyMgVGVzdCB0aGUgYWRkIG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwwCiswKzAwMDQgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwxCiswKzAwMDggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDBjIDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0CiswKzAwMTAgPFtePl0qPiBhZGRpCVwkYTAsXCRhMCwtMzI3NjgKKzArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDE4IDxbXj5dKj4gYWRkCVwkYTAsXCRhMCxcJGF0CiswKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwMjQgPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKKzArMDAyOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTk2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FkZC5zCkBAIC0wLDAgKzEsMTYgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhZGQgbWFjcm8uCisJCitmb286CisJYWRkCSQ0LCQ0LDAKKwlhZGQJJDQsJDQsMQorCWFkZAkkNCwkNCwweDgwMDAKKwlhZGQJJDQsJDQsLTB4ODAwMAorCWFkZAkkNCwkNCwweDEwMDAwCisJYWRkCSQ0LCQ0LDB4MWE1YTUKKwkKKyMgYWRkdSBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhZGQgaXM7IGp1c3QgY29uZmlybSB0aGF0IGl0IGlzbid0CisjIHRvdGFsbHkgYnJva2VuLgorCWFkZHUJJDQsJDQsMQorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2MTcxNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKQEAgLTAsMCArMSwzNCBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIGFuZAorCisjIFRlc3QgdGhlIGFuZCBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHgwCiswKzAwMDQgPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDEKKzArMDAwOCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4ODAwMAorMCswMDBjIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDAxMCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAorMCswMDE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMTggPFtePl0qPiBhbmQJXCRhMCxcJGEwLFwkYXQKKzArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDIwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKKzArMDAyNCA8W14+XSo+IGFuZAlcJGEwLFwkYTAsXCRhdAorMCswMDI4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDAKKzArMDAyYyA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCiswKzAwMzAgPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4MQorMCswMDM0IDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KKzArMDAzOCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHg4MDAwCiswKzAwM2MgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybworMCswMDQwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDA0NCA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAorMCswMDQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNGMgPFtePl0qPiBub3IJXCRhMCxcJGExLFwkYXQKKzArMDA1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDU0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKKzArMDA1OCA8W14+XSo+IG5vcglcJGEwLFwkYTEsXCRhdAorMCswMDVjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDAKKzArMDA2MCA8W14+XSo+IHhvcmkJXCRhMCxcJGExLDB4MAorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmYzU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMKQEAgLTAsMCArMSwyOCBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFuZCBtYWNyby4KKwkKK2ZvbzoKKwlhbmQJJDQsJDQsMAorCWFuZAkkNCwkNCwxCisJYW5kCSQ0LCQ0LDB4ODAwMAorCWFuZAkkNCwkNCwtMHg4MDAwCisJYW5kCSQ0LCQ0LDB4MTAwMDAKKwlhbmQJJDQsJDQsMHgxYTVhNQorCisjIG5vciwgb3IsIGFuZCB4b3IgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZS4gIFRoZXJlIGlzIGEgc3BlY2lhbAorIyBjYXNlIGZvciBub3IsIHNvIHdlIHRlc3QgYWxsIHZhcmlhbnRzLgorCQorCW5vcgkkNCwkNSwwCisJbm9yCSQ0LCQ1LDEKKwlub3IJJDQsJDUsMHg4MDAwCisJbm9yCSQ0LCQ1LC0weDgwMDAKKwlub3IJJDQsJDUsMHgxMDAwMAorCW5vcgkkNCwkNSwweDFhNWE1CisJCisJb3IJJDQsJDUsMAorCisJeG9yCSQ0LCQ1LDAKKworCSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTMyOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZXEuZApAQCAtMCwwICsxLDQwIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgYmVxCisKKyMgVGVzdCB0aGUgYmVxIG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBiZXEJXCRhMCxcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDAwNCA8W14+XSo+IG5vcAorMCswMDA4IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDAwYyA8W14+XSo+IG5vcAorMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwxCiswKzAwMTQgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDAxOCA8W14+XSo+IG5vcAorMCswMDFjIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDAyMCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDI0IDxbXj5dKj4gbm9wCiswKzAwMjggPFtePl0qPiBsaQlcJGF0LC0zMjc2OAorMCswMDJjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwMzAgPFtePl0qPiBub3AKKzArMDAzNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDM4IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwM2MgPFtePl0qPiBub3AKKzArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDQ0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKKzArMDA0OCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDRjIDxbXj5dKj4gbm9wCiswKzAwNTAgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDU0IDxbXj5dKj4gbm9wCiswKzAwNTggPFtePl0qPiBiZXF6bAlcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA1YyA8W14+XSo+IG5vcAorMCswMDYwIDxbXj5dKj4gYm5lemwJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+CisJLi4uCiswKzIwMDY4IDxbXj5dKj4gagkwKzAwMDAgPHRleHRfbGFiZWw+CitbIAldKjIwMDY4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0CiswKzIwMDZjIDxbXj5dKj4gbm9wCiswKzIwMDcwIDxbXj5dKj4gamFsCTArMDAwMCA8dGV4dF9sYWJlbD4KK1sgCV0qMjAwNzA6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCkBAIC0wLDAgKzEsMjggQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBiZXEgbWFjcm8uCisJLmdsb2JsCXRleHRfbGFiZWwJLnRleHQKK3RleHRfbGFiZWw6CQorCWJlcQkkNCwkNSx0ZXh0X2xhYmVsCisJYmVxCSQ0LDAsdGV4dF9sYWJlbAorCWJlcQkkNCwxLHRleHRfbGFiZWwKKwliZXEJJDQsMHg4MDAwLHRleHRfbGFiZWwKKwliZXEJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCisJYmVxCSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAorCWJlcQkkNCwweDFhNWE1LHRleHRfbGFiZWwKKworIyBibmUgaXMgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGFzIGJlcS4gIEp1c3Qgc2FuaXR5IGNoZWNrLgorCWJuZQkkNCwwLHRleHRfbGFiZWwKKworIyBTYW5pdHkgY2hlY2sgYmVxbCBhbmQgYm5lbAorCS5zZXQJbWlwczIKKwliZXFsCSQ0LDAsdGV4dF9sYWJlbAorCWJuZWwJJDQsMCx0ZXh0X2xhYmVsCisKKyMgVGVzdCB0aGF0IGJyYW5jaGVzIHdoaWNoIG92ZXJmbG93IGFyZSBjb252ZXJ0ZWQgdG8ganVtcHMuCisJLnNwYWNlCTB4MjAwMDAKKwliCXRleHRfbGFiZWwKKwliYWwJdGV4dF9sYWJlbAorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzZTI3YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQKQEAgLTAsMCArMSw1MyBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIGJnZQorCisjIFRlc3QgdGhlIGJnZSBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCiswKzAwMDQgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDA4IDxbXj5dKj4gbm9wCiswKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDEwIDxbXj5dKj4gbm9wCiswKzAwMTQgPFtePl0qPiBibGV6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDE4IDxbXj5dKj4gbm9wCiswKzAwMWMgPFtePl0qPiBiZ2V6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDIwIDxbXj5dKj4gbm9wCiswKzAwMjQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDI4IDxbXj5dKj4gbm9wCiswKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCiswKzAwMzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDM0IDxbXj5dKj4gbm9wCiswKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0CiswKzAwNDAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDQ0IDxbXj5dKj4gbm9wCiswKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKKzArMDA0YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwNTAgPFtePl0qPiBub3AKKzArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0CiswKzAwNWMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDYwIDxbXj5dKj4gbm9wCiswKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKKzArMDA3MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwNzQgPFtePl0qPiBub3AKKzArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAorMCswMDdjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA4MCA8W14+XSo+IG5vcAorMCswMDg0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA4OCA8W14+XSo+IG5vcAorMCswMDhjIDxbXj5dKj4gYmx0eglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA5MCA8W14+XSo+IG5vcAorMCswMDk0IDxbXj5dKj4gYmd0eglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA5OCA8W14+XSo+IG5vcAorMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCiswKzAwYTAgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDBhNCA8W14+XSo+IG5vcAorMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCiswKzAwYWMgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNWZkODIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5zCkBAIC0wLDAgKzEsMzEgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBiZ2UgbWFjcm8uCisJCit0ZXh0X2xhYmVsOgkKKwliZ2UJJDQsJDUsdGV4dF9sYWJlbAorCWJnZQkkNCwkMCx0ZXh0X2xhYmVsCisJYmdlCSQwLCQ1LHRleHRfbGFiZWwKKwliZ2UJJDQsMCx0ZXh0X2xhYmVsCisJYmdlCSQ0LDEsdGV4dF9sYWJlbAorCWJnZQkkNCwyLHRleHRfbGFiZWwKKwliZ2UJJDQsMHg4MDAwLHRleHRfbGFiZWwKKwliZ2UJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCisJYmdlCSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAorCWJnZQkkNCwweDFhNWE1LHRleHRfbGFiZWwKKworIyBiZ3QgaXMgaGFuZGxlZCBsaWtlIGJnZSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KKyMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgorCWJndAkkNCwkNSx0ZXh0X2xhYmVsCisJYmd0CSQ0LCQwLHRleHRfbGFiZWwKKwliZ3QJJDAsJDUsdGV4dF9sYWJlbAorCWJndAkkNCwwLHRleHRfbGFiZWwKKworIyBTYW5pdHkgdGVzdCBiZ2VsIGFuZCBiZ3RsCisJLnNldAltaXBzMgorCWJnZWwJJDQsJDUsdGV4dF9sYWJlbAorCWJndGwJJDQsJDUsdGV4dF9sYWJlbAorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCW5vcAorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E2MDQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQKQEAgLTAsMCArMSw0NyBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIGJnZXUKKworIyBUZXN0IHRoZSBiZ2V1IG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCiswKzAwMDQgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDA4IDxbXj5dKj4gbm9wCiswKzAwMGMgPFtePl0qPiBiZXEJXCR6ZXJvLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDEwIDxbXj5dKj4gbm9wCiswKzAwMTQgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDE4IDxbXj5dKj4gbm9wCiswKzAwMWMgPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsMgorMCswMDIwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDAyNCA8W14+XSo+IG5vcAorMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDAyYyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKKzArMDAzMCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwMzQgPFtePl0qPiBub3AKKzArMDAzOCA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwtMzI3NjgKKzArMDAzYyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwNDAgPFtePl0qPiBub3AKKzArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDQ4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAorMCswMDRjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA1MCA8W14+XSo+IG5vcAorMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMDVjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAorMCswMDYwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA2NCA8W14+XSo+IG5vcAorMCswMDY4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAorMCswMDZjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA3MCA8W14+XSo+IG5vcAorMCswMDc0IDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA3OCA8W14+XSo+IG5vcAorMCswMDdjIDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA4MCA8W14+XSo+IG5vcAorMCswMDg0IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQorMCswMDg4IDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwOGMgPFtePl0qPiBub3AKKzArMDA5MCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKKzArMDA5NCA8W14+XSo+IGJuZXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM3Zjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMKQEAgLTAsMCArMSwyNyBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJnZXUgbWFjcm8uCisJCit0ZXh0X2xhYmVsOgkKKwliZ2V1CSQ0LCQ1LHRleHRfbGFiZWwKKwliZ2V1CSQwLCQ1LHRleHRfbGFiZWwKKwkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIHRydWUKKwliZ2V1CSQ0LDEsdGV4dF9sYWJlbAorCWJnZXUJJDQsMix0ZXh0X2xhYmVsCisJYmdldQkkNCwweDgwMDAsdGV4dF9sYWJlbAorCWJnZXUJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCisJYmdldQkkNCwweDEwMDAwLHRleHRfbGFiZWwKKwliZ2V1CSQ0LDB4MWE1YTUsdGV4dF9sYWJlbAorCisjIGJndHUgaXMgaGFuZGxlZCBsaWtlIGJnZXUsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCisjIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KKwliZ3R1CSQ0LCQ1LHRleHRfbGFiZWwKKwliZ3R1CSQ0LCQwLHRleHRfbGFiZWwKKwliZ3R1CSQ0LDAsdGV4dF9sYWJlbAorCisjIFNhbml0eSB0ZXN0IGJnZXVsIGFuZCBiZ3R1bAorCS5zZXQJbWlwczIKKwliZ2V1bAkkNCwkNSx0ZXh0X2xhYmVsCisJYmd0dWwJJDQsJDUsdGV4dF9sYWJlbAorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxMGUyMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LmQKQEAgLTAsMCArMSw1MyBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIGJsdAorCisjIFRlc3QgdGhlIGJsdCBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCiswKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDA4IDxbXj5dKj4gbm9wCiswKzAwMGMgPFtePl0qPiBibHR6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDEwIDxbXj5dKj4gbm9wCiswKzAwMTQgPFtePl0qPiBiZ3R6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDE4IDxbXj5dKj4gbm9wCiswKzAwMWMgPFtePl0qPiBibHR6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDIwIDxbXj5dKj4gbm9wCiswKzAwMjQgPFtePl0qPiBibGV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDI4IDxbXj5dKj4gbm9wCiswKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCiswKzAwMzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDM0IDxbXj5dKj4gbm9wCiswKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0CiswKzAwNDAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDQ0IDxbXj5dKj4gbm9wCiswKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKKzArMDA0YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwNTAgPFtePl0qPiBub3AKKzArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0CiswKzAwNWMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDYwIDxbXj5dKj4gbm9wCiswKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKKzArMDA3MCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwNzQgPFtePl0qPiBub3AKKzArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAorMCswMDdjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA4MCA8W14+XSo+IG5vcAorMCswMDg0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA4OCA8W14+XSo+IG5vcAorMCswMDhjIDxbXj5dKj4gYmdleglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA5MCA8W14+XSo+IG5vcAorMCswMDk0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA5OCA8W14+XSo+IG5vcAorMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCiswKzAwYTAgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDBhNCA8W14+XSo+IG5vcAorMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCiswKzAwYWMgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDMwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCkBAIC0wLDAgKzEsMzEgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBibHQgbWFjcm8uCisJCit0ZXh0X2xhYmVsOgkKKwlibHQJJDQsJDUsdGV4dF9sYWJlbAorCWJsdAkkNCwkMCx0ZXh0X2xhYmVsCisJYmx0CSQwLCQ1LHRleHRfbGFiZWwKKwlibHQJJDQsMCx0ZXh0X2xhYmVsCisJYmx0CSQ0LDEsdGV4dF9sYWJlbAorCWJsdAkkNCwyLHRleHRfbGFiZWwKKwlibHQJJDQsMHg4MDAwLHRleHRfbGFiZWwKKwlibHQJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCisJYmx0CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAorCWJsdAkkNCwweDFhNWE1LHRleHRfbGFiZWwKKworIyBibGUgaXMgaGFuZGxlZCBsaWtlIGJsdCwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KKyMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgorCWJsZQkkNCwkNSx0ZXh0X2xhYmVsCisJYmxlCSQ0LCQwLHRleHRfbGFiZWwKKwlibGUJJDAsJDUsdGV4dF9sYWJlbAorCWJsZQkkNCwwLHRleHRfbGFiZWwKKworIyBTYW5pdHkgdGVzdCBibHRsIGFuZCBibGVsCisJLnNldAltaXBzMgorCWJsdGwJJDQsJDUsdGV4dF9sYWJlbAorCWJsZWwJJDQsJDUsdGV4dF9sYWJlbAorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCW5vcAorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI2MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQKQEAgLTAsMCArMSw0NyBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIGJsdHUKKworIyBUZXN0IHRoZSBibHR1IG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCiswKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDA4IDxbXj5dKj4gbm9wCiswKzAwMGMgPFtePl0qPiBibmUJXCR6ZXJvLFwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDEwIDxbXj5dKj4gbm9wCiswKzAwMTQgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgorMCswMDE4IDxbXj5dKj4gbm9wCiswKzAwMWMgPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsMgorMCswMDIwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDAyNCA8W14+XSo+IG5vcAorMCswMDI4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDAyYyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKKzArMDAzMCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwMzQgPFtePl0qPiBub3AKKzArMDAzOCA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwtMzI3NjgKKzArMDAzYyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwNDAgPFtePl0qPiBub3AKKzArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDQ4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAorMCswMDRjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA1MCA8W14+XSo+IG5vcAorMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNTggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMDVjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAorMCswMDYwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA2NCA8W14+XSo+IG5vcAorMCswMDY4IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAorMCswMDZjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA3MCA8W14+XSo+IG5vcAorMCswMDc0IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA3OCA8W14+XSo+IG5vcAorMCswMDdjIDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KKzArMDA4MCA8W14+XSo+IG5vcAorMCswMDg0IDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQorMCswMDg4IDxbXj5dKj4gYm5lemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+CiswKzAwOGMgPFtePl0qPiBub3AKKzArMDA5MCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKKzArMDA5NCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGIxYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LnMKQEAgLTAsMCArMSwyNyBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJsdHUgbWFjcm8uCisJCit0ZXh0X2xhYmVsOgkKKwlibHR1CSQ0LCQ1LHRleHRfbGFiZWwKKwlibHR1CSQwLCQ1LHRleHRfbGFiZWwKKwkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIGZhbHNlCisJYmx0dQkkNCwxLHRleHRfbGFiZWwKKwlibHR1CSQ0LDIsdGV4dF9sYWJlbAorCWJsdHUJJDQsMHg4MDAwLHRleHRfbGFiZWwKKwlibHR1CSQ0LC0weDgwMDAsdGV4dF9sYWJlbAorCWJsdHUJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCisJYmx0dQkkNCwweDFhNWE1LHRleHRfbGFiZWwKKworIyBibGV1IGlzIGhhbmRsZWQgbGlrZSBibHR1LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgorIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCisJYmxldQkkNCwkNSx0ZXh0X2xhYmVsCisJYmxldQkkNCwkMCx0ZXh0X2xhYmVsCisJYmxldQkkNCwwLHRleHRfbGFiZWwKKworIyBTYW5pdHkgdGVzdCBibHR1bCBhbmQgYmxldWwKKwkuc2V0CW1pcHMyCisJYmx0dWwJJDQsJDUsdGV4dF9sYWJlbAorCWJsZXVsCSQ0LCQ1LHRleHRfbGFiZWwKKworIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KKwlub3AKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5OGE0YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kCkBAIC0wLDAgKzEsMTggQEAKKyNhczogLW1jcHU9cjM5MDAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozOTAwCisjbmFtZTogTUlQUyAyMC1iaXQgYnJlYWsKKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gYnJlYWsKKzArMDAwNCA8W14+XSo+IGJyZWFrCiswKzAwMDggPFtePl0qPiBicmVhawkweDE0CiswKzAwMGMgPFtePl0qPiBicmVhawkweDE0LDB4MjgKKzArMDAxMCA8W14+XSo+IGJyZWFrCTB4M2ZmLDB4M2ZmCiswKzAwMTQgPFtePl0qPiBzZGJicAorMCswMDE4IDxbXj5dKj4gc2RiYnAKKzArMDAxYyA8W14+XSo+IHNkYmJwCTB4MTQKKzArMDAyMCA8W14+XSo+IHNkYmJwCTB4MTQsMHgyOAorMCswMDI0IDxbXj5dKj4gc2RiYnAJMHgzZmYsMHgzZmYKKwkuLi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzViMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucwpAQCAtMCwwICsxLDE3IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IGJyZWFrIGluc3RydWN0aW9ucworZm9vOgkKKwlicmVhaworCWJyZWFrCTAKKwlicmVhawkyMAorCWJyZWFrCTIwLDQwCisJYnJlYWsJMTAyMywxMDIzCisJCisJc2RiYnAKKwlzZGJicAkwCisJc2RiYnAJMjAKKwlzZGJicAkyMCw0MAorCXNkYmJwCTEwMjMsMTAyMworCQorIyBmb3JjZSBzb21lIHBhZGRpbmcsIHRvIG1ha2Ugb2JqZHVtcCBjb25zaXN0ZW50bHkgcmVwb3J0IHRoYXQgdGhlcmUncyBzb21lCisjIGhlcmUuLi4KKwkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGMwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LmQKQEAgLTAsMCArMSwyMCBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIGRlbGF5CisjYXM6IC1taXBzMyAtbWNwdT1yNDAwMAorCisjIAorIyBHYXMgc2hvdWxkIHByb2R1Y2Ugbm9wJ3MgYWZ0ZXIgbXRjMSBhbmQgcmVsYXRlZCAKKyMgaW5zbidzIGlmIHRoZSB0YXJnZXQgZnByIGlzIHVzZWQgaW4gdGhlIAorIyBpbW1lZGlhdGx5IGZvbGxvd2luZyBpbnNuLiAgU2VlIGFsc28gbm9kZWxheS5kLgorIworCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBtdGMxCVwkemVybyxcJGYwCiswKzAwMDQgPFtePl0qPiBub3AKKzArMDAwOCA8W14+XSo+IGN2dC5kLncJXCRmMCxcJGYwCiswKzAwMGMgPFtePl0qPiBtdGMxCVwkemVybyxcJGYxCiswKzAwMTAgPFtePl0qPiBub3AKKzArMDAxNCA8W14+XSo+IGN2dC5kLncJXCRmMSxcJGYxCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlMmYwMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGVsYXkucwpAQCAtMCwwICsxLDggQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhYnMgbWFjcm8uCitmb286CisJbXRjMQkkMCwkZjAKKwljdnQuZC53CSRmMCwkZjAKKyAgICAgICAgbXRjMSAgICAkMCwkZjEKKyAgICAgICAgY3Z0LmQudyAkZjEsJGYxCisgICAgICAgIC5zcGFjZQk4CisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYtaWxvY2tzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NTZkMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kCkBAIC0wLDAgKzEsMTEwIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgZGl2Cisjc291cmNlOiBkaXYucworCisjIFRlc3QgdGhlIGRpdiBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKKzArMDAwNCA8W14+XSo+IGJuZXoJXCRhMSwwKzAwMTAgPGZvb1wrMHgxMD4KKzArMDAwOCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCiswKzAwMGMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCiswKzAwMTAgPFtePl0qPiBsaQlcJGF0LC0xCiswKzAwMTQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgorMCswMDE4IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCiswKzAwMWMgPFtePl0qPiBibmUJXCRhMCxcJGF0LDArMDAyOCA8Zm9vXCsweDI4PgorMCswMDIwIDxbXj5dKj4gbm9wCiswKzAwMjQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAwMjggPFtePl0qPiBtZmxvCVwkYTAKKzArMDAyYyA8W14+XSo+IGJuZXoJXCRhMiwwKzAwMzggPGZvb1wrMHgzOD4KKzArMDAzMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCiswKzAwMzQgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCiswKzAwMzggPFtePl0qPiBsaQlcJGF0LC0xCiswKzAwM2MgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgorMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCiswKzAwNDQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1MCA8Zm9vXCsweDUwPgorMCswMDQ4IDxbXj5dKj4gbm9wCiswKzAwNGMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAwNTAgPFtePl0qPiBtZmxvCVwkYTAKKzArMDA1NCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCiswKzAwNTggPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQorMCswMDVjIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAorMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMQorMCswMDY0IDxbXj5dKj4gbGkJXCRhdCwyCiswKzAwNjggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAorMCswMDZjIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwNzAgPFtePl0qPiBsaQlcJGF0LDIKKzArMDA3NCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0CiswKzAwNzggPFtePl0qPiBtZmxvCVwkYTAKKzArMDA3YyA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCiswKzAwODAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAorMCswMDg0IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwODggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDA5OCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0CiswKzAwOWMgPFtePl0qPiBtZmxvCVwkYTAKKzArMDBhMCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4CiswKzAwYTQgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAorMCswMGE4IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwYWMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDBiMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0CiswKzAwYjQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwYzggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMGNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKKzArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwZDggPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMGRjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDBlMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGU0IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCiswKzAwZTggPFtePl0qPiBibmV6CVwkYTEsMCswZjQgPGZvb1wrMHhmND4KKzArMDBlYyA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTAsXCRhMQorMCswMGYwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQorMCswMGY0IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwZjggPFtePl0qPiBibmV6CVwkYTIsMCswMTA0IDxmb29cKzB4MTA0PgorMCswMGZjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCiswKzAxMDAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCiswKzAxMDQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDEwOCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCiswKzAxMGMgPFtePl0qPiBibmV6CVwkYTIsMCswMTE4IDxmb29cKzB4MTE4PgorMCswMTEwIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKKzArMDExNCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKKzArMDExOCA8W14+XSo+IGxpCVwkYXQsLTEKKzArMDExYyA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTMwIDxmb29cKzB4MTMwPgorMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCiswKzAxMjQgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDEzMCA8Zm9vXCsweDEzMD4KKzArMDEyOCA8W14+XSo+IG5vcAorMCswMTJjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQorMCswMTMwIDxbXj5dKj4gbWZoaQlcJGEwCiswKzAxMzQgPFtePl0qPiBsaQlcJGF0LDIKKzArMDEzOCA8W14+XSo+IGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAorMCswMTNjIDxbXj5dKj4gbWZoaQlcJGEwCiswKzAxNDAgPFtePl0qPiBibmV6CVwkYTIsMCswMTRjIDxmb29cKzB4MTRjPgorMCswMTQ0IDxbXj5dKj4gZGRpdglcJHplcm8sXCRhMSxcJGEyCiswKzAxNDggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCiswKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sLTEKKzArMDE1MCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTY4IDxmb29cKzB4MTY4PgorMCswMTU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLDEKKzArMDE1OCA8W14+XSo+IGRzbGwzMglcJGF0LFwkYXQsMHgxZgorMCswMTVjIDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAxNjggPGZvb1wrMHgxNjg+CiswKzAxNjAgPFtePl0qPiBub3AKKzArMDE2NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKKzArMDE2OCA8W14+XSo+IG1mbG8JXCRhMAorMCswMTZjIDxbXj5dKj4gbGkJXCRhdCwyCiswKzAxNzAgPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0CiswKzAxNzQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDE3OCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCiswKzAxN2MgPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDE4MCA8W14+XSo+IG1maGkJXCRhMAorMCswMTg0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDE4OCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKKzArMDE4YyA8W14+XSo+IG1maGkJXCRhMAorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjNWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LmQKQEAgLTAsMCArMSwxMjUgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCisjYXM6IC1tY3B1PXI0MDAwCisjbmFtZTogTUlQUyBkaXYKKworIyBUZXN0IHRoZSBkaXYgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCiswKzAwMDQgPFtePl0qPiBibmV6CVwkYTEsMCswMDEwIDxmb29cKzB4MTA+CiswKzAwMDggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQorMCswMDBjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQorMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwtMQorMCswMDE0IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KKzArMDAxOCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAorMCswMDFjIDxbXj5dKj4gYm5lCVwkYTAsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KKzArMDAyMCA8W14+XSo+IG5vcAorMCswMDI0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQorMCswMDI4IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwMmMgPFtePl0qPiBub3AKKzArMDAzMCA8W14+XSo+IGJuZXoJXCRhMiwwKzAwM2MgPGZvb1wrMHgzYz4KKzArMDAzNCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCiswKzAwMzggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCiswKzAwM2MgPFtePl0qPiBsaQlcJGF0LC0xCiswKzAwNDAgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1NCA8Zm9vXCsweDU0PgorMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCiswKzAwNDggPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1NCA8Zm9vXCsweDU0PgorMCswMDRjIDxbXj5dKj4gbm9wCiswKzAwNTAgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAwNTQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDA1OCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCiswKzAwNWMgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQorMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAorMCswMDY0IDxbXj5dKj4gbmVnCVwkYTAsXCRhMQorMCswMDY4IDxbXj5dKj4gbGkJXCRhdCwyCiswKzAwNmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAorMCswMDcwIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwNzQgPFtePl0qPiBsaQlcJGF0LDIKKzArMDA3OCA8W14+XSo+IG5vcAorMCswMDdjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDA4MCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDg0IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDA4OCA8W14+XSo+IG5vcAorMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKKzArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDA5OCA8W14+XSo+IG5vcAorMCswMDljIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDBhMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGE0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDBhOCA8W14+XSo+IG5vcAorMCswMGFjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKKzArMDBiMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGI0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDBiOCA8W14+XSo+IG5vcAorMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKKzArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwYzggPFtePl0qPiBub3AKKzArMDBjYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0CiswKzAwZDAgPFtePl0qPiBtZmxvCVwkYTAKKzArMDBkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMGQ4IDxbXj5dKj4gbm9wCiswKzAwZGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAorMCswMGUwIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDBlOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwZWMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAorMCswMGYwIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwZjQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDBmOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwZmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAorMCswMTAwIDxbXj5dKj4gbWZsbwlcJGEwCisJLi4uCiswKzAxMGMgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKKzArMDExMCA8W14+XSo+IGJuZXoJXCRhMSwwKzAxMWMgPGZvb1wrMHgxMWM+CiswKzAxMTQgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKKzArMDExOCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKKzArMDExYyA8W14+XSo+IG1mbG8JXCRhMAorMCswMTIwIDxbXj5dKj4gbm9wCiswKzAxMjQgPFtePl0qPiBibmV6CVwkYTIsMCswMTMwIDxmb29cKzB4MTMwPgorMCswMTI4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCiswKzAxMmMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCiswKzAxMzAgPFtePl0qPiBtZmxvCVwkYTAKKzArMDEzNCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCiswKzAxMzggPFtePl0qPiBibmV6CVwkYTIsMCswMTQ0IDxmb29cKzB4MTQ0PgorMCswMTNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKKzArMDE0MCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKKzArMDE0NCA8W14+XSo+IGxpCVwkYXQsLTEKKzArMDE0OCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTVjIDxmb29cKzB4MTVjPgorMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCiswKzAxNTAgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE1YyA8Zm9vXCsweDE1Yz4KKzArMDE1NCA8W14+XSo+IG5vcAorMCswMTU4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQorMCswMTVjIDxbXj5dKj4gbWZoaQlcJGEwCiswKzAxNjAgPFtePl0qPiBsaQlcJGF0LDIKKzArMDE2NCA8W14+XSo+IG5vcAorMCswMTY4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGF0CiswKzAxNmMgPFtePl0qPiBtZmhpCVwkYTAKKzArMDE3MCA8W14+XSo+IG5vcAorMCswMTc0IDxbXj5dKj4gYm5leglcJGEyLDArMDE4MCA8Zm9vXCsweDE4MD4KKzArMDE3OCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhMgorMCswMTdjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQorMCswMTgwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLC0xCiswKzAxODQgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE5YyA8Zm9vXCsweDE5Yz4KKzArMDE4OCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywxCiswKzAxOGMgPFtePl0qPiBkc2xsMzIJXCRhdCxcJGF0LDB4MWYKKzArMDE5MCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTljIDxmb29cKzB4MTljPgorMCswMTk0IDxbXj5dKj4gbm9wCiswKzAxOTggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAxOWMgPFtePl0qPiBtZmxvCVwkYTAKKzArMDFhMCA8W14+XSo+IGxpCVwkYXQsMgorMCswMWE0IDxbXj5dKj4gbm9wCiswKzAxYTggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0CiswKzAxYWMgPFtePl0qPiBtZmxvCVwkYTAKKzArMDFiMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCiswKzAxYjQgPFtePl0qPiBub3AKKzArMDFiOCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhdAorMCswMWJjIDxbXj5dKj4gbWZoaQlcJGEwCiswKzAxYzAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAorMCswMWM0IDxbXj5dKj4gbm9wCiswKzAxYzggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0CiswKzAxY2MgPFtePl0qPiBtZmhpCVwkYTAKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTk5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCkBAIC0wLDAgKzEsNDEgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBkaXYgbWFjcm8uCitmb286CisJZGl2CSQwLCQ0LCQ1CisJZGl2CSQ0LCQ1CisJZGl2CSQ0LCQ1LCQ2CisJZGl2CSQ0LDEKKwlkaXYJJDQsJDUsMQorCWRpdgkkNCwtMQorCWRpdgkkNCwkNSwtMQorCWRpdgkkNCwyCisJZGl2CSQ0LCQ1LDIKKwlkaXYJJDQsMHg4MDAwCisJZGl2CSQ0LCQ1LDB4ODAwMAorCWRpdgkkNCwtMHg4MDAwCisJZGl2CSQ0LCQ1LC0weDgwMDAKKwlkaXYJJDQsMHgxMDAwMAorCWRpdgkkNCwkNSwweDEwMDAwCisJZGl2CSQ0LDB4MWE1YTUKKwlkaXYJJDQsJDUsMHgxYTVhNQorCisjIGRpdnUgaXMgbGlrZSBkaXYsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCisjIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KKwlkaXZ1CSQwLCQ0LCQ1CisJZGl2dQkkNCwkNQorCWRpdnUJJDQsJDUsJDYKKwlkaXZ1CSQ0LDEKKworIyByZW0gaXMgbGlrZSBkaXYsIHJlbXUgaXMgbGlrZSBkaXZ1CisJcmVtCSQ0LCQ1LCQ2CisJcmVtdQkkNCwkNSwyCisKKyMgU2FuaXR5IGNoZWNrIHRoZSA2NCBiaXQgdmVyc2lvbnMuCisJLnNldAltaXBzMworCWRkaXYJJDQsJDUsJDYKKwlkZGl2dQkkNCwkNSwyCisJZHJlbQkkNCwkNSwweDgwMDAKKwlkcmVtdQkkNCwkNSwtMHg4MDAwCisKKyMgZm9yY2Ugc29tZSBwYWRkaW5nLCB0byBtYWtlIG9iamR1bXAgY29uc2lzdGVudGx5IHJlcG9ydCB0aGF0IHRoZXJlJ3Mgc29tZQorIyBoZXJlLi4uCisJLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjQ0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kCkBAIC0wLDAgKzEsMTE1IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgZGxpCisjYXM6IC1taXBzMworCisjIFRlc3QgdGhlIGRsaSBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCiswKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKKzArMDAwOCA8W14+XSo+IGxpCVwkYTAsLTEKKzArMDAwYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCiswKzAwMTAgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTggPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAxYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1CiswKzAwMjAgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAorMCswMDI0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAorMCswMDI4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKKzArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgorMCswMDMwIDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKKzArMDAzNCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgorMCswMDM4IDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKKzArMDAzYyA8W14+XSo+IGxpCVwkYTAsLTEKKzArMDA0MCA8W14+XSo+IGxpCVwkYTAsLTEKKzArMDA0NCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YworMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCiswKzAwNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAorMCswMDUwIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKKzArMDA1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKKzArMDA1OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0CiswKzAwNWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCiswKzAwNjAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NTY3OAorMCswMDY0IDxbXj5dKj4gbHVpCVwkYTAsMHg4MDAwCiswKzAwNjggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAorMCswMDZjIDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAorMCswMDcwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDU2NzgKKzArMDA3NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKKzArMDA3OCA8W14+XSo+IGxpCVwkYTAsLTMwODc1CiswKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKKzArMDA4MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg0MzIxCiswKzAwODQgPFtePl0qPiBsaQlcJGEwLC0xNgorMCswMDg4IDxbXj5dKj4gbGkJXCRhMCwtMjU2CiswKzAwOGMgPFtePl0qPiBsaQlcJGEwLC00MDk2CiswKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKKzArMDA5NCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmMAorMCswMDk4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZjAwCiswKzAwOWMgPFtePl0qPiBsdWkJXCRhMCwweGYwMDAKKzArMDBhMCA8W14+XSo+IGxpCVwkYTAsLTEKKzArMDBhNCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCiswKzAwYTggPFtePl0qPiBsaQlcJGEwLC0xNgorMCswMGFjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKKzArMDBiMCA8W14+XSo+IGxpCVwkYTAsLTI1NgorMCswMGI0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKKzArMDBiOCA8W14+XSo+IGxpCVwkYTAsLTQwOTYKKzArMDBiYyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCiswKzAwYzAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgorMCswMGM0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCiswKzAwYzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmMAorMCswMGNjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCiswKzAwZDAgPFtePl0qPiBsaQlcJGEwLDB4ZmYwMAorMCswMGQ0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCiswKzAwZDggPFtePl0qPiBsaQlcJGEwLDB4ZjAwMAorMCswMGRjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDEwCiswKzAwZTAgPFtePl0qPiBsaQlcJGEwLC0xCiswKzAwZTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDQKKzArMDBlOCA8W14+XSo+IGxpCVwkYTAsLTEKKzArMDBlYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4OAorMCswMGYwIDxbXj5dKj4gbGkJXCRhMCwtMQorMCswMGY0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhjCiswKzAwZjggPFtePl0qPiBsaQlcJGEwLC0xCiswKzAwZmMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDEwCiswKzAxMDAgPFtePl0qPiBsaQlcJGEwLC0xCiswKzAxMDQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE0CiswKzAxMDggPFtePl0qPiBsaQlcJGEwLC0xCiswKzAxMGMgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDE4CiswKzAxMTAgPFtePl0qPiBsaQlcJGEwLC0xCiswKzAxMTQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweDFjCiswKzAxMTggPFtePl0qPiBsdWkJXCRhMCwweGZmZmYKKzArMDExYyA8W14+XSo+IGRzcmwzMglcJGEwLFwkYTAsMHgwCiswKzAxMjAgPFtePl0qPiBsdWkJXCRhMCwweGZmZgorMCswMTI0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKKzArMDEyOCA8W14+XSo+IGx1aQlcJGEwLDB4ZmYKKzArMDEyYyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCiswKzAxMzAgPFtePl0qPiBsdWkJXCRhMCwweGYKKzArMDEzNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCiswKzAxMzggPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgorMCswMTNjIDxbXj5dKj4gbGkJXCRhMCw0MDk1CiswKzAxNDAgPFtePl0qPiBsaQlcJGEwLDI1NQorMCswMTQ0IDxbXj5dKj4gbGkJXCRhMCwxNQorMCswMTQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgzCiswKzAxNGMgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmYworMCswMTUwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKKzArMDE1NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MWUKKzArMDE1OCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCiswKzAxNWMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MgorMCswMTYwIDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKKzArMDE2NCA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHg2CiswKzAxNjggPFtePl0qPiBsaQlcJGEwLC0xCiswKzAxNmMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAorMCswMTcwIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCiswKzAxNzQgPFtePl0qPiBsaQlcJGEwLC0xCiswKzAxNzggPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDFjCiswKzAxN2MgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKKzArMDE4MCA8W14+XSo+IGxpCVwkYTAsLTEKKzArMDE4NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTgKKzArMDE4OCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQorMCswMThjIDxbXj5dKj4gbHVpCVwkYTAsMHgzZgorMCswMTkwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZjMDMKKzArMDE5NCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKKzArMDE5OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZmCiswKzAxOWMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCiswKzAxYTAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YzAwMAorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3OTUyOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGxpLnMKQEAgLTAsMCArMSw2NyBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGRsaSBtYWNyby4KKwkKK2ZvbzoJCisJZGxpCSQ0LDAKKwlkbGkJJDQsMQorCWRsaQkkNCwtMQorCWRsaQkkNCwweDgwMDAKKwlkbGkJJDQsLTB4ODAwMAorCWRsaQkkNCwweDEwMDAwCisJZGxpCSQ0LDB4MWE1YTUKKwlkbGkJJDQsMHg4MDAwMTIzNAorCWRsaQkkNCwweGZmZmZmZmZmCisJZGxpCSQ0LDB4MDAwMDAwMDBmZmZmZmZmZgorCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmZmYKKwlkbGkJJDQsMHgwMDBmZmZmZmZmZmZmZmZmCisJZGxpCSQ0LDB4ZmZmZmZmZmY4MDAwMTIzNAorCWRsaQkkNCwweGZmZmY4MDAwMTIzNDU2NzgKKwlkbGkJJDQsMHg4MDAwMTIzNDU2NzgwMDAwCisJZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmODc2NQorCWRsaQkkNCwweGZmZmZmZmZmZmZmZjQzMjEKKworCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmZjAKKwlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZjAwCisJZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZjAwMAorCWRsaQkkNCwweGZmZmZmZmZmZmZmZjAwMDAKKwlkbGkJJDQsMHhmZmZmZmZmZmZmZjAwMDAwCisJZGxpCSQ0LDB4ZmZmZmZmZmZmZjAwMDAwMAorCWRsaQkkNCwweGZmZmZmZmZmZjAwMDAwMDAKKwlkbGkJJDQsMHhmZmZmZmZmZjAwMDAwMDAwCisJZGxpCSQ0LDB4ZmZmZmZmZjAwMDAwMDAwMAorCWRsaQkkNCwweGZmZmZmZjAwMDAwMDAwMDAKKwlkbGkJJDQsMHhmZmZmZjAwMDAwMDAwMDAwCisJZGxpCSQ0LDB4ZmZmZjAwMDAwMDAwMDAwMAorCWRsaQkkNCwweGZmZjAwMDAwMDAwMDAwMDAKKwlkbGkJJDQsMHhmZjAwMDAwMDAwMDAwMDAwCisJZGxpCSQ0LDB4ZjAwMDAwMDAwMDAwMDAwMAorCisJZGxpCSQ0LDB4MGZmZmZmZmZmZmZmZmZmZgorCWRsaQkkNCwweDAwZmZmZmZmZmZmZmZmZmYKKwlkbGkJJDQsMHgwMDBmZmZmZmZmZmZmZmZmCisJZGxpCSQ0LDB4MDAwMGZmZmZmZmZmZmZmZgorCWRsaQkkNCwweDAwMDAwZmZmZmZmZmZmZmYKKwlkbGkJJDQsMHgwMDAwMDBmZmZmZmZmZmZmCisJZGxpCSQ0LDB4MDAwMDAwMGZmZmZmZmZmZgorCWRsaQkkNCwweDAwMDAwMDAwZmZmZmZmZmYKKwlkbGkJJDQsMHgwMDAwMDAwMDBmZmZmZmZmCisJZGxpCSQ0LDB4MDAwMDAwMDAwMGZmZmZmZgorCWRsaQkkNCwweDAwMDAwMDAwMDAwZmZmZmYKKwlkbGkJJDQsMHgwMDAwMDAwMDAwMDBmZmZmCisJZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMGZmZgorCWRsaQkkNCwweDAwMDAwMDAwMDAwMDAwZmYKKwlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwMDBmCisKKwlkbGkJJDQsMHgwMDAwMDAwMDAwMDNmZmZjCisJZGxpCSQ0LDB4MDAwMDNmZmZjMDAwMDAwMAorCWRsaQkkNCwweDAwMDNmZmZjMDAwMDAwMDAKKwlkbGkJJDQsMHgwMDNmZmZjMDAwMDAwMDAwCisJZGxpCSQ0LDB4MDAzZmZmZmZmZmMwMDAwMAorCWRsaQkkNCwweDAwM2ZmZmZmZmZmYzAwMDAKKwlkbGkJJDQsMHgwMDNmZmZmZmZmZmZjMDAwCisKKwlkbGkJJDQsMHgwMDNmZmMwM2ZmZmZjMDAwCisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmYjExMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYwpAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIGZpbGUgaXNuJ3QgZGlyZWN0bHkgdXNlZCBieSB0aGUgdGVzdCBzdWl0ZTsgaXQgdXNlcworICAgZWxmX2VfZmxhZ3Mucy4gIEhvd2V2ZXIsIEkgZmlndXJlZCBpdCB3b3VsZCBiZSBuaWNlIHRvIHByb3ZpZGUgdGhlCisgICBzb3VyY2UgY29kZSBmcm9tIHdoaWNoIHRoZSAucyBmaWxlIHdhcyBnZW5lcmF0ZWQuCisKKyAgIEl0IHdhcyBjb21waWxlZCBhcyBmb2xsb3dzOgorCisgICBtaXBzNjQtZWxmLWdjYyAtbTQ2NTAgLVMgLU8gZWxmX2VfZmxhZ3MuYworCisgICBXZSB1c2UgdGhlIC1tNDY1MCBmbGFnIHRvIGdldCB0aGUgNDY1MC1zcGVjaWZpYyAnbXVsJyBpbnN0cnVjdGlvbgorICAgaW4gdGhlcmU7IHRoZSB0ZXN0IHN1aXRlIHdhbnRzIHRvIGJlIHN1cmUgdGhhdCBHQVMncyAtbTQ2NTAgZmxhZworICAgd2lsbCBpbmRlZWQgY2F1c2UgaXQgdG8gZ2VuZXJhdGUgdGhlIDQ2NTAgbXVsIGluc3RydWN0aW9uLCBhbmQgbm90CisgICBleHBhbmQgaXQgYXMgYSBtYWNyby4gICovCisKK2ludAorZm9vIChpbnQgYSwgaW50IGIpCit7CisgIHJldHVybiAoYSAqIGIpICsgMTsKK30KKworaW50CittYWluICgpCit7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzMyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMKQEAgLTAsMCArMSw0MyBAQAorCS5maWxlCTEgImVsZl9lX2ZsYWdzLmMiCitnY2MyX2NvbXBpbGVkLjoKK19fZ251X2NvbXBpbGVkX2M6CisJLnRleHQKKwkuYWxpZ24JMgorCS5nbG9ibAlmb28KKwkudGV4dAorCS5lbnQJZm9vCitmb286CisJLmZyYW1lCSRzcCwwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAwLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCisJLm1hc2sJMHgwMDAwMDAwMCwwCisJLmZtYXNrCTB4MDAwMDAwMDAsMAorCW11bAkkMiwkNCwkNQorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub21hY3JvCisJagkkMzEKKwlhZGR1CSQyLCQyLDEKKwkuc2V0CW1hY3JvCisJLnNldAlyZW9yZGVyCisKKwkuZW5kCWZvbworCS5hbGlnbgkyCisJLmdsb2JsCW1haW4KKwkudGV4dAorCS5lbnQJbWFpbgorbWFpbjoKKwkuZnJhbWUJJHNwLDQwLCQzMQkJIyB2YXJzPSAwLCByZWdzPSAxLzAsIGFyZ3M9IDMyLCBleHRyYT0gMAorCS5tYXNrCTB4ODAwMDAwMDAsLTgKKwkuZm1hc2sJMHgwMDAwMDAwMCwwCisJc3VidQkkc3AsJHNwLDQwCisJc2QJJDMxLDMyKCRzcCkKKwlqYWwJX19nY2NtYWluCisJbW92ZQkkMiwkMAorCWxkCSQzMSwzMigkc3ApCisJI25vcAorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub21hY3JvCisJagkkMzEKKwlhZGR1CSRzcCwkc3AsNDAKKwkuc2V0CW1hY3JvCisJLnNldAlyZW9yZGVyCisKKwkuZW5kCW1haW4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYWE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kCkBAIC0wLDAgKzEsMjYgQEAKKyMgbmFtZTogRUxGIGVfZmxhZ3M6IG5vdGhpbmcgc3BlY2lhbAorIyBzb3VyY2U6IGVsZl9lX2ZsYWdzLnMKKyMgb2JqZHVtcDogLWZkCisKKy4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgorYXJjaGl0ZWN0dXJlOiBtaXBzOjQwMDAsIGZsYWdzIDB4MDAwMDAwMTE6CitIQVNfUkVMT0MsIEhBU19TWU1TCitzdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMDAwMDAwMDAwIDxmb28+OgorICAgMDoJMDA4NTAwMTkgCW11bHR1CVwkYTAsXCRhMQorICAgNDoJMDAwMDEwMTIgCW1mbG8JXCR2MAorICAgODoJMDNlMDAwMDggCWpyCVwkcmEKKyAgIGM6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQorCiswMDAwMDAwMDAwMDAwMDEwIDxtYWluPjoKKyAgMTA6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCisgIDE0OglmZmJmMDAyMCAJc2QJXCRyYSwzMlwoXCRzcFwpCisgIDE4OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KKyAgMWM6CTAwMDAwMDAwIAlub3AKKyAgMjA6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCisgIDI0OglkZmJmMDAyMCAJbGQJXCRyYSwzMlwoXCRzcFwpCisgIDI4OgkwM2UwMDAwOCAJanIJXCRyYQorICAyYzoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2NjFjMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MyLmQKQEAgLTAsMCArMSwyNiBAQAorIyBuYW1lOiBFTEYgZV9mbGFnczogLW00NjUwCisjIHNvdXJjZTogZWxmX2VfZmxhZ3MucworIyBhczogLW00NjUwCisjIG9iamR1bXA6IC1mZAorCisuKjouKmZpbGUgZm9ybWF0LiptaXBzLioKK2FyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgorSEFTX1JFTE9DLCBIQVNfU1lNUworc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKKyAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKKyAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCisgICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKKworMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46CisgICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAorICAxMDoJZmZiZjAwMjAgCXNkCVwkcmEsMzJcKFwkc3BcKQorICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+CisgIDE4OgkwMDAwMDAwMCAJbm9wCisgIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybworICAyMDoJZGZiZjAwMjAgCWxkCVwkcmEsMzJcKFwkc3BcKQorICAyNDoJMDNlMDAwMDggCWpyCVwkcmEKKyAgMjg6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2M0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kCkBAIC0wLDAgKzEsMjYgQEAKKyMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tY3B1PTQ2NTAKKyMgc291cmNlOiBlbGZfZV9mbGFncy5zCisjIGFzOiAtbWNwdT00NjUwCisjIG9iamR1bXA6IC1mZAorCisuKjouKmZpbGUgZm9ybWF0LiptaXBzLioKK2FyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgorSEFTX1JFTE9DLCBIQVNfU1lNUworc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKKyAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKKyAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCisgICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKKworMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46CisgICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAorICAxMDoJZmZiZjAwMjAgCXNkCVwkcmEsMzJcKFwkc3BcKQorICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+CisgIDE4OgkwMDAwMDAwMCAJbm9wCisgIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybworICAyMDoJZGZiZjAwMjAgCWxkCVwkcmEsMzJcKFwkc3BcKQorICAyNDoJMDNlMDAwMDggCWpyCVwkcmEKKyAgMjg6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3M0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjcwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kCkBAIC0wLDAgKzEsMjYgQEAKKyMgbmFtZTogRUxGIGVfZmxhZ3M6IC1tNDY1MCAtbWNwdT00NjUwCisjIHNvdXJjZTogZWxmX2VfZmxhZ3MucworIyBhczogLW00NjUwIC1tY3B1PTQ2NTAKKyMgb2JqZHVtcDogLWZkCisKKy4qOi4qZmlsZSBmb3JtYXQuKm1pcHMuKgorYXJjaGl0ZWN0dXJlOiBtaXBzOjQ2NTAsIGZsYWdzIDB4MDAwMDAwMTE6CitIQVNfUkVMT0MsIEhBU19TWU1TCitzdGFydCBhZGRyZXNzIDB4MDAwMDAwMDAwMDAwMDAwMAorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMDAwMDAwMDAwIDxmb28+OgorICAgMDoJNzA4NTEwMDIgCW11bAlcJHYwLFwkYTAsXCRhMQorICAgNDoJMDNlMDAwMDggCWpyCVwkcmEKKyAgIDg6CTI0NDIwMDAxIAlhZGRpdQlcJHYwLFwkdjAsMQorCiswMDAwMDAwMDAwMDAwMDBjIDxtYWluPjoKKyAgIGM6CTI3YmRmZmQ4IAlhZGRpdQlcJHNwLFwkc3AsLTQwCisgIDEwOglmZmJmMDAyMCAJc2QJXCRyYSwzMlwoXCRzcFwpCisgIDE0OgkwYzAwMDAwMCAJamFsCTAgPGZvbz4KKyAgMTg6CTAwMDAwMDAwIAlub3AKKyAgMWM6CTAwMDAxMDJkIAltb3ZlCVwkdjAsXCR6ZXJvCisgIDIwOglkZmJmMDAyMCAJbGQJXCRyYSwzMlwoXCRzcFwpCisgIDI0OgkwM2UwMDAwOCAJanIJXCRyYQorICAyODoJMjdiZDAwMjggCWFkZGl1CVwkc3AsXCRzcCw0MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjhhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwKQEAgLTAsMCArMSwxOSBAQAorCisgICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgorICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCisgICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KKyAgICA7IEhlcmUsIHRoZSBwcm9jZXNzb3JzIHJlcHJlc2VudCBtaXBzIGNvcHJvY2Vzc29ycy4KKworICAgIHAxIGRyZWcgZDEgMSAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKKyAgICBwMSBjcmVnIGMzIDMgICAgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCisgICAgcDMgaW5zbiBmaWUgMHgxZToyNC0yMCAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMQorICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKKyAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgorICAgIHAzIGluc24gZmVlIDB4MWU6MjQtMjAsZHJlZzoxNy0xMyxjcmVnOjEyLTgsaW1tZWQ6Ny0wCisKKyAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCisgICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKKyAgICBwMyBpbnNuIGZ1bSAweDAxZTAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04CisgICAgcDMgaW5zbiBmb2ggMHhmOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMAorCisgICAgcDMgaW5zbiBwaWcgMHgxOjI0LTIxKlsweDEwMHwweDJdLCBkcmVnOjIwLTE2LCBpbW1lZDoxNS0wKjB4MTAwMDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1NTQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zCkBAIC0wLDAgKzEsMTggQEAKKworICAgIDsgVGVzdCBjYXNlIGZvciBhc3NlbWJsZXIgb3B0aW9uICJpdGJsIi4KKyAgICA7IFJ1biBhcyAiYXMgLS1pdGJsIGl0YmwgaXRibC5zIgorICAgIDsgb3Igd2l0aCBzdGFuZC1hbG9uZSB0ZXN0IGNhc2UgIml0YmwtdGVzdCBpdGJsIGl0YmwucyIuCisKKyAgICA7IENhbGwgbWlwcyBjb3Byb2Nlc3NvciAiY29mdW4icyBhcyBkZWZpbmVkIGluICJpdGJsIi4KKworICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQorICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAorICAgIGZvaCAkMiwweDEwMAorICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQorICAgIHBpZyAkMiwweDEwMAorCisgICAgOyBDYWxsIGEgbWlwcyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aXRoIHJlZ2lzdGVyICJkMSIgCisgICAgOyBkZWZpbmVkIGluICJpdGJsIi4KKworICAgIExXQzEgJGQxLDB4MTAwKCQyKQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDZjY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZApAQCAtMCwwICsxLDI2IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgamFsLWVtcGljCisjYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYworI3NvdXJjZTogamFsLnMKKworIyBUZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gamFscglcJHQ5CiswKzAwMDQgPFtePl0qPiBub3AKKzArMDAwOCA8W14+XSo+IGphbHIJXCRhMCxcJHQ5CiswKzAwMGMgPFtePl0qPiBub3AKKzArMDAxMCA8W14+XSo+IGJhbAkwKzAwMDAgPHRleHRfbGFiZWw+CitbIAldKjEwOiBQQ1JFTDE2CS50ZXh0CiswKzAwMTQgPFtePl0qPiBub3AKKzArMDAxOCA8W14+XSo+IGJhbAkwKzAwMTggPHRleHRfbGFiZWxcKygweHwpMTg+CitbIAldKjE4OiBQQ1JFTDE2CWV4dGVybmFsX3RleHRfbGFiZWwKKzArMDAxYyA8W14+XSo+IG5vcAorMCswMDIwIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+CitbIAldKjIwOiBQQ1JFTDE2CS50ZXh0CiswKzAwMjQgPFtePl0qPiBub3AKKzArMDAyOCA8W14+XSo+IGIJMCswMDI4IDx0ZXh0X2xhYmVsXCsoMHh8KTI4PgorWyAJXSoyODogUENSRUwxNglleHRlcm5hbF90ZXh0X2xhYmVsCiswKzAwMmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTViZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5kCkBAIC0wLDAgKzEsMzkgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBSMzAwMCBqYWwtc3ZyNHBpYworI2FzOiAtbWlwczEgLUtQSUMgLW1jcHU9cjMwMDAKKworIyBUZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtS1BJQy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbHVpCVwkZ3AsMHgwCitbIAldKjA6IFJfTUlQU19ISTE2CV9ncF9kaXNwCiswKzAwMDQgPFtePl0qPiBhZGRpdQlcJGdwLFwkZ3AsMAorWyAJXSo0OiBSX01JUFNfTE8xNglfZ3BfZGlzcAorMCswMDA4IDxbXj5dKj4gYWRkdQlcJGdwLFwkZ3AsXCR0OQorMCswMDBjIDxbXj5dKj4gc3cJXCRncCwwXChcJHNwXCkKKzArMDAxMCA8W14+XSo+IGphbHIJXCR0OQorMCswMDE0IDxbXj5dKj4gbm9wCiswKzAwMTggPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQorMCswMDFjIDxbXj5dKj4gamFscglcJGEwLFwkdDkKKzArMDAyMCA8W14+XSo+IG5vcAorMCswMDI0IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKKzArMDAyOCA8W14+XSo+IG5vcAorMCswMDJjIDxbXj5dKj4gbHcJXCR0OSwwXChcJGdwXCkKK1sgCV0qMmM6IFJfTUlQU19HT1QxNgkudGV4dAorMCswMDMwIDxbXj5dKj4gbm9wCiswKzAwMzQgPFtePl0qPiBhZGRpdQlcJHQ5LFwkdDksMAorWyAJXSozNDogUl9NSVBTX0xPMTYJLnRleHQKKzArMDAzOCA8W14+XSo+IGphbHIJXCR0OQorMCswMDNjIDxbXj5dKj4gbm9wCiswKzAwNDAgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQorMCswMDQ0IDxbXj5dKj4gbm9wCiswKzAwNDggPFtePl0qPiBsdwlcJHQ5LDBcKFwkZ3BcKQorWyAJXSo0ODogUl9NSVBTX0NBTEwxNglleHRlcm5hbF90ZXh0X2xhYmVsCiswKzAwNGMgPFtePl0qPiBub3AKKzArMDA1MCA8W14+XSo+IGphbHIJXCR0OQorMCswMDU0IDxbXj5dKj4gbm9wCiswKzAwNTggPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQorMCswMDVjIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+CisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4OWRmYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMucwpAQCAtMCwwICsxLDIwIEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMgY29kZS4KKwkKK3RleHRfbGFiZWw6CQorCS5zZXQJbm9yZW9yZGVyCisJLmNwbG9hZAkkMjUKKwkuc2V0CXJlb3JkZXIKKwkuY3ByZXN0b3JlCTAKKwlqYWwJJDI1CisJamFsCSQ0LCQyNQorCWphbAl0ZXh0X2xhYmVsCisJamFsCWV4dGVybmFsX3RleHRfbGFiZWwKKwkKKyMgVGVzdCBqIGFzIHdlbGwJCisJagl0ZXh0X2xhYmVsCisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC14Z290LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2ZGNhMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXhnb3QuZApAQCAtMCwwICsxLDQyIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgUjMwMDAgamFsLXhnb3QKKyNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzMDAwCisjc291cmNlOiBqYWwtc3ZyNHBpYy5zCisKKyMgVGVzdCB0aGUgamFsIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx1aQlcJGdwLDB4MAorWyAJXSowOiBSX01JUFNfSEkxNglfZ3BfZGlzcAorMCswMDA0IDxbXj5dKj4gYWRkaXUJXCRncCxcJGdwLDAKK1sgCV0qNDogUl9NSVBTX0xPMTYJX2dwX2Rpc3AKKzArMDAwOCA8W14+XSo+IGFkZHUJXCRncCxcJGdwLFwkdDkKKzArMDAwYyA8W14+XSo+IHN3CVwkZ3AsMFwoXCRzcFwpCiswKzAwMTAgPFtePl0qPiBqYWxyCVwkdDkKKzArMDAxNCA8W14+XSo+IG5vcAorMCswMDE4IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKKzArMDAxYyA8W14+XSo+IGphbHIJXCRhMCxcJHQ5CiswKzAwMjAgPFtePl0qPiBub3AKKzArMDAyNCA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCiswKzAwMjggPFtePl0qPiBub3AKKzArMDAyYyA8W14+XSo+IGx3CVwkdDksMFwoXCRncFwpCitbIAldKjJjOiBSX01JUFNfR09UMTYJLnRleHQKKzArMDAzMCA8W14+XSo+IG5vcAorMCswMDM0IDxbXj5dKj4gYWRkaXUJXCR0OSxcJHQ5LDAKK1sgCV0qMzQ6IFJfTUlQU19MTzE2CS50ZXh0CiswKzAwMzggPFtePl0qPiBqYWxyCVwkdDkKKzArMDAzYyA8W14+XSo+IG5vcAorMCswMDQwIDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKKzArMDA0NCA8W14+XSo+IGx1aQlcJHQ5LDB4MAorWyAJXSo0NDogUl9NSVBTX0NBTExfSEkxNglleHRlcm5hbF90ZXh0X2xhYmVsCiswKzAwNDggPFtePl0qPiBhZGR1CVwkdDksXCR0OSxcJGdwCiswKzAwNGMgPFtePl0qPiBsdwlcJHQ5LDBcKFwkdDlcKQorWyAJXSo0YzogUl9NSVBTX0NBTExfTE8xNglleHRlcm5hbF90ZXh0X2xhYmVsCiswKzAwNTAgPFtePl0qPiBub3AKKzArMDA1NCA8W14+XSo+IGphbHIJXCR0OQorMCswMDU4IDxbXj5dKj4gbm9wCiswKzAwNWMgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQorMCswMDYwIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+CisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I1ODZmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwuZApAQCAtMCwwICsxLDI0IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgamFsCisKKyMgVGVzdCB0aGUgamFsIG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBqYWxyCVwkdDkKKzArMDAwNCA8W14+XSo+IG5vcAorMCswMDA4IDxbXj5dKj4gamFscglcJGEwLFwkdDkKKzArMDAwYyA8W14+XSo+IG5vcAorMCswMDEwIDxbXj5dKj4gamFsCTArIDx0ZXh0X2xhYmVsPgorWyAJXSoxMDogKE1JUFNfSk1QfE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAorMCswMDE0IDxbXj5dKj4gbm9wCiswKzAwMTggPFtePl0qPiBqYWwJMCsgPHRleHRfbGFiZWw+CitbIAldKjE4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCWV4dGVybmFsX3RleHRfbGFiZWwKKzArMDAxYyA8W14+XSo+IG5vcAorMCswMDIwIDxbXj5dKj4gagkwKyA8dGV4dF9sYWJlbD4KK1sgCV0qMjA6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKKzArMDAyNCA8W14+XSo+IG5vcAorMCswMDI4IDxbXj5dKj4gagkwKyA8dGV4dF9sYWJlbD4KK1sgCV0qMjg6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJZXh0ZXJuYWxfdGV4dF9sYWJlbAorMCswMDJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzliZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucwpAQCAtMCwwICsxLDExIEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgamFsIG1hY3JvLgorCS5nbG9ibAl0ZXh0X2xhYmVsCS50ZXh0Cit0ZXh0X2xhYmVsOgkKKwlqYWwJJDI1CisJamFsCSQ0LCQyNQorCWphbAl0ZXh0X2xhYmVsCisJamFsCWV4dGVybmFsX3RleHRfbGFiZWwKKwkKKyMgVGVzdCBqIGFzIHdlbGwJCisJagl0ZXh0X2xhYmVsCisJaglleHRlcm5hbF90ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyOTU3MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMuZApAQCAtMCwwICsxLDEwNSBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNuYW1lOiBNSVBTIGxhLWVtcGljCisjYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYworCisjIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAorMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCiswKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAorMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKKzArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQorMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCiswKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKKzArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCiswKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAorMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1CiswKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0CitbIAldKjUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAwNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAorWyAJXSo1NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKK1sgCV0qNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKK1sgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKK1sgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwNjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2Mzg0CitbIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDA2OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODQKK1sgCV0qNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMDZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MworWyAJXSo2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgorMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKK1sgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCitbIAldKjc0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA3OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCitbIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA3YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCitbIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4MworWyAJXSo4MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1MzgzCitbIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDA4OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKK1sgCV0qODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKKzArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDA5MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCitbIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAorWyAJXSo5ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAorWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwYTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAorWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDBiMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKK1sgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4NAorWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCitbIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwYzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQorWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMGQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKK1sgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMGQ4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKK1sgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKK1sgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCitbIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDBmMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODMKK1sgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMGY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmY4OiBSRUxISQlleHRlcm5hbF90ZXh0X2xhYmVsCiswKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMjUyCitbIAldKmZjOiBSRUxMTwlleHRlcm5hbF90ZXh0X2xhYmVsCiswKzAxMDAgPFtePl0qPiBsaQlcJGEwLDI0OAorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGY1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLnMKQEAgLTAsMCArMSw1NyBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMKKwkKKwkuZGF0YQorZGF0YV9sYWJlbDoKKwkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKKwkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQorCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAorCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCisJLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAorCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQorCQorCS50ZXh0Cit0ZXh0X2xhYmVsOgkKKwlsYQkkNCwwCisJbGEJJDQsMQorCWxhCSQ0LDB4ODAwMAorCWxhCSQ0LC0weDgwMDAKKwlsYQkkNCwweDEwMDAwCisJbGEJJDQsMHgxYTVhNQorCWxhCSQ0LDAoJDUpCisJbGEJJDQsMSgkNSkKKwlsYQkkNCwweDgwMDAoJDUpCisJbGEJJDQsLTB4ODAwMCgkNSkKKwlsYQkkNCwweDEwMDAwKCQ1KQorCWxhCSQ0LDB4MWE1YTUoJDUpCisJbGEJJDQsZGF0YV9sYWJlbAorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uCisJbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uCisJbGEJJDQsZGF0YV9sYWJlbCsxCisJbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxCisJbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKKwlsYQkkNCxkYXRhX2xhYmVsKCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCisJbGEJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCisJbGEJJDQsZGF0YV9sYWJlbCsxKCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCisJbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCisKK3NlY29uZF90ZXh0X2xhYmVsOgkKKwlsYQkkNCxleHRlcm5hbF90ZXh0X2xhYmVsIC0gdGV4dF9sYWJlbAorCWxhCSQ0LHNlY29uZF90ZXh0X2xhYmVsIC0gdGV4dF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXN2cjRwaWMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThhM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQKQEAgLTAsMCArMSw0NzQgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsYS1zdnI0cGljCisjYXM6IC1taXBzMSAtS1BJQyAtLWRlZnN5bSBLUElDPTEKKyNzb3VyY2U6IGxhLnMKKworIyBUZXN0IHRoZSBsYSBtYWNybyB3aXRoIC1LUElDLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKKzArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQorMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKKzArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4CiswKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKKzArMDAxYyA8W14+XSo+IGxpCVwkYTAsMAorMCswMDIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDI0IDxbXj5dKj4gbGkJXCRhMCwxCiswKzAwMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMmMgPFtePl0qPiBsaQlcJGEwLDB4ODAwMAorMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDM0IDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKKzArMDAzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwNDggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQorMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNTA6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMDU0IDxbXj5dKj4gbm9wCiswKzAwNTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSo1ODogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDA1YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjVjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjYwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNjQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwNjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo2ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNmM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwNzAgPFtePl0qPiBub3AKKzArMDA3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjc0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo3ODogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDA3YyA8W14+XSo+IG5vcAorMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKK1sgCV0qODA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDA4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjg0OiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDA4OCA8W14+XSo+IG5vcAorMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKK1sgCV0qOGM6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAwOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo5MDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOTQgPFtePl0qPiBub3AKKzArMDA5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAwOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo5YzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBhMCA8W14+XSo+IG5vcAorMCswMGE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKKzArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmE4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGFjIDxbXj5dKj4gbm9wCiswKzAwYjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorMCswMGI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBiOCA8W14+XSo+IG5vcAorMCswMGJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKKzArMDBjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmMwOiBSX01JUFNfR09UMTYJLmJzcworMCswMGM0IDxbXj5dKj4gbm9wCiswKzAwYzggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorWyAJXSpjODogUl9NSVBTX0xPMTYJLmJzcworMCswMGNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qY2M6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwZDAgPFtePl0qPiBub3AKKzArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCitbIAldKmQ0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAwZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSpkODogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwZGMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDBlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKK1sgCV0qZTA6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSplODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZWMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKKzArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDBmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmY4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAxMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CiswKzAxMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAxMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxMDg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxMGMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDExMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKKzArMDExNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDExOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjExODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAxMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CiswKzAxMjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxMjg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKK1sgCV0qMTMwOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxMzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAxMzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxMzg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDE0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKK1sgCV0qMTQwOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxNDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxNDg6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMTRjIDxbXj5dKj4gbm9wCiswKzAxNTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CitbIAldKjE1MDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDE1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjE1NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNTggPFtePl0qPiBub3AKKzArMDE1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKKzArMDE2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjE2MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE2NCA8W14+XSo+IG5vcAorMCswMTY4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAorMCswMTZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTZjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTcwIDxbXj5dKj4gbm9wCiswKzAxNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzAxNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxNzg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE3YyA8W14+XSo+IG5vcAorMCswMTgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAorMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTg0OiBSX01JUFNfR09UMTYJLmJzcworMCswMTg4IDxbXj5dKj4gbm9wCiswKzAxOGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CitbIAldKjE4YzogUl9NSVBTX0xPMTYJLmJzcworMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTkwOiBSX01JUFNfR09UMTYJLmJzcworMCswMTk0IDxbXj5dKj4gbm9wCiswKzAxOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4CitbIAldKjE5ODogUl9NSVBTX0xPMTYJLmJzcworMCswMTljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTljOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDFhMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMWE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMWE0OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMWE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMWFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMWFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMWI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKKzArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFiYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFjMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMWM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKKzArMDFjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFjYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFkMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMWQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKKzArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDFkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFkYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAxZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswMWU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMWVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMWVjOiBSX01JUFNfR09UMTYJLmJzcworMCswMWYwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAxZjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSoxZjQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDFmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFmYzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDIwMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKK1sgCV0qMjA0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAyMDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAyMGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyMGM6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAyMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCitbIAldKjIxNDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDIxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDIxYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjIxYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMjAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDIyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKKzArMDIyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDIyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjIyYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMjM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorMCswMjM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMjNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjNjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAyNDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCiswKzAyNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAyNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyNGM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI1MCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMjU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorMCswMjU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMjVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjVjOiBSX01JUFNfR09UMTYJLmJzcworMCswMjYwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAyNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCitbIAldKjI2NDogUl9NSVBTX0xPMTYJLmJzcworMCswMjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjZjOiBSX01JUFNfR09UMTYJLmJzcworMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAyNzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCitbIAldKjI3NDogUl9NSVBTX0xPMTYJLmJzcworMCswMjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjdjOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDI4MCA8W14+XSo+IG5vcAorMCswMjg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qMjg0OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMjg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjhjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI5MCA8W14+XSo+IG5vcAorMCswMjk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjk4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjljIDxbXj5dKj4gbm9wCiswKzAyYTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyYTQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyYTggPFtePl0qPiBub3AKKzArMDJhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjJiMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmI0IDxbXj5dKj4gbm9wCiswKzAyYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyYmM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAyYzAgPFtePl0qPiBub3AKKzArMDJjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjJjNDogUl9NSVBTX0xPMTYJLmJzcworMCswMmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMmNjOiBSX01JUFNfR09UMTYJLmJzcworMCswMmQwIDxbXj5dKj4gbm9wCiswKzAyZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSoyZDQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDJkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjJkYzogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAyZTAgPFtePl0qPiBub3AKKzArMDJlNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCitbIAldKjJlNDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDJlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJlYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjJlYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZjAgPFtePl0qPiBub3AKKzArMDJmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAyZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyZmM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMDAgPFtePl0qPiBub3AKKzArMDMwNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAzMDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzMGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozMGM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzMTAgPFtePl0qPiBub3AKKzArMDMxNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAzMTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzMWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozMWM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMyMCA8W14+XSo+IG5vcAorMCswMzI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKKzArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDMyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjMyYzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDMzMCA8W14+XSo+IG5vcAorMCswMzM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKK1sgCV0qMzM0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAzMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozM2M6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAzNDAgPFtePl0qPiBub3AKKzArMDM0NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCitbIAldKjM0NDogUl9NSVBTX0xPMTYJLmJzcworMCswMzQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMzRjOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDM1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMzU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorWyAJXSozNTQ6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAzNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozNjA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAzNjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CiswKzAzNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAzNzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozNzQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNzggPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDM3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKKzArMDM4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDM4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDM4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjM4ODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDM4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMzkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorMCswMzk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMzk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMzljOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzYTAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDNhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKKzArMDNhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDNhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDNiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjNiMDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDNiNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswM2I4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorWyAJXSozYjg6IFJfTUlQU19MTzE2CS5ic3MKKzArMDNiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDNjMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDNjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjNjNDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDNjOCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswM2NjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAorWyAJXSozY2M6IFJfTUlQU19MTzE2CS5ic3MKKzArMDNkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDNkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDNkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjNkODogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAzZGMgPFtePl0qPiBub3AKKzArMDNlMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKK1sgCV0qM2UwOiBSX01JUFNfTE8xNgkuZGF0YQorMCswM2U0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswM2U4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qM2U4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNlYyA8W14+XSo+IG5vcAorMCswM2YwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAorMCswM2Y0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswM2Y4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qM2Y4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2ZjIDxbXj5dKj4gbm9wCiswKzA0MDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzA0MDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0MDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0MDg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA0MGMgPFtePl0qPiBub3AKKzArMDQxMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKKzArMDQxNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDQxOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjQxODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNDFjIDxbXj5dKj4gbm9wCiswKzA0MjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzA0MjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0MjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0Mjg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA0MmMgPFtePl0qPiBub3AKKzArMDQzMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKK1sgCV0qNDMwOiBSX01JUFNfTE8xNgkuYnNzCiswKzA0MzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0MzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0Mzg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA0M2MgPFtePl0qPiBub3AKKzArMDQ0MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKK1sgCV0qNDQwOiBSX01JUFNfTE8xNgkuYnNzCiswKzA0NDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0NDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0NDg6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswNDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0NTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSo0NTA6IFJfTUlQU19MTzE2CS5kYXRhCiswKzA0NTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA0NTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0NWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0NWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDYwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0NjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswNDY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNDZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNDcwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0NzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswNDdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNDg0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDg4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0OGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswNDkwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNDk4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDRhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCiswKzA0YTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA0YTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0YWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0YWM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA0YjAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDRiNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjRiNDogUl9NSVBTX0xPMTYJLmJzcworMCswNGI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNGMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNGMwOiBSX01JUFNfR09UMTYJLmJzcworMCswNGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0YzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAorWyAJXSo0Yzg6IFJfTUlQU19MTzE2CS5ic3MKKzArMDRjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDRkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDRkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjRkNDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzA0ZDggPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDRkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKK1sgCV0qNGRjOiBSX01JUFNfTE8xNgkuZGF0YQorMCswNGUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNGU4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDRlYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswNGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorMCswNGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNGY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNGZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNGZjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzA1MDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCiswKzA1MDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA1MGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1MTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1MTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA1MTQgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDUxOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKKzArMDUxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDUyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDUyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjUyNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTI4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzA1MmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCiswKzA1MzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA1MzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1MzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1Mzg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA1M2MgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDU0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKK1sgCV0qNTQwOiBSX01JUFNfTE8xNgkuYnNzCiswKzA1NDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA1NDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1NGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1NGM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA1NTAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDU1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKK1sgCV0qNTU0OiBSX01JUFNfTE8xNgkuYnNzCiswKzA1NTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA1NWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEteGdvdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWNkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZApAQCAtMCwwICsxLDYxOCBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNuYW1lOiBNSVBTIGxhLXhnb3QKKyNhczogLW1pcHMxIC1LUElDIC14Z290IC0tZGVmc3ltIEtQSUM9MQorI3NvdXJjZTogbGEucworCisjIFRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAorMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCiswKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAorMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKKzArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQorMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCiswKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKKzArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCiswKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAorMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1CiswKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1MDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwNTQgPFtePl0qPiBub3AKKzArMDA1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjU4OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMDVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDA2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2OCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSo2ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjcwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjc0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qN2M6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qODA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDA4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjg4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo4YzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDA5MCA8W14+XSo+IG5vcAorMCswMDk0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qOTQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjk4OiBSX01JUFNfR09UMTYJLmJzcworMCswMDljIDxbXj5dKj4gbm9wCiswKzAwYTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSphMDogUl9NSVBTX0xPMTYJLmJzcworMCswMGE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYTQ6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMGE4IDxbXj5dKj4gbm9wCiswKzAwYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorWyAJXSphYzogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDBiMCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSpiMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSpiODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYmMgPFtePl0qPiBub3AKKzArMDBjMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAwYzQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qYzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAwY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSpjYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBkMCA8W14+XSo+IG5vcAorMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKKzArMDBkOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSpkODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDBlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKmUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGU0IDxbXj5dKj4gbm9wCiswKzAwZTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorMCswMGVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmVjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAwZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSpmNDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGY4IDxbXj5dKj4gbm9wCiswKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorMCswMTAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTAwOiBSX01JUFNfR09UMTYJLmJzcworMCswMTA0IDxbXj5dKj4gbm9wCiswKzAxMDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorWyAJXSoxMDg6IFJfTUlQU19MTzE2CS5ic3MKKzArMDEwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjEwYzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDExMCA8W14+XSo+IG5vcAorMCswMTE0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDEKK1sgCV0qMTE0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxMTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxMTg6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMTFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAxMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CitbIAldKjEyMDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDEyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDEyOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxMjg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMTMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMTMwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMTM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorMCswMTNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMTQwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjE0MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjE0ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMTUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorMCswMTU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMTU4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjE1ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDE2MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjE2MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMTY4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorMCswMTZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMTcwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjE3MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMTc4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxN2MgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDE4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKKzArMDE4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDE4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjE4ODogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMTkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorWyAJXSoxOTA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDE5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDE5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjE5ODogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE5YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMTc2OAorWyAJXSoxYTA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDFhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDFhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFhODogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAxYWMgPFtePl0qPiBub3AKKzArMDFiMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKK1sgCV0qMWIwOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMWI0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjFiNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoxYmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWMwIDxbXj5dKj4gbm9wCiswKzAxYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzAxYzggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWM4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMWQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMWQwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWQ0IDxbXj5dKj4gbm9wCiswKzAxZDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzAxZGMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWRjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMWU0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWU4IDxbXj5dKj4gbm9wCiswKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzAxZjAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWYwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoxZjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFmYyA8W14+XSo+IG5vcAorMCswMjAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAorMCswMjA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjA0OiBSX01JUFNfR09UMTYJLmJzcworMCswMjA4IDxbXj5dKj4gbm9wCiswKzAyMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CitbIAldKjIwYzogUl9NSVBTX0xPMTYJLmJzcworMCswMjEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjEwOiBSX01JUFNfR09UMTYJLmJzcworMCswMjE0IDxbXj5dKj4gbm9wCiswKzAyMTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4CitbIAldKjIxODogUl9NSVBTX0xPMTYJLmJzcworMCswMjFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMjFjOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDIyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMjI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjI0OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMjI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMjJjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjIyYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyMzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoyMzQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAyM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswMjQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMjQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjI0NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDI0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjI0YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMjU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKKzArMDI1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDI1YyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyNWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyNjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoyNjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyNjggPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDI2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCiswKzAyNzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAyNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoyN2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMjg0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKKzArMDI4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDI4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjI4YzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDI5MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMjk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjk0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAyOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAyOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyOWM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDJhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCitbIAldKjJhNDogUl9NSVBTX0xPMTYJLmJzcworMCswMmE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswMmFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMmFjOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDJiMCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMmI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorWyAJXSoyYjQ6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAyYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAyYmMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMmJjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJjMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDJjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjJjNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDJjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKKzArMDJkMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDJkNCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyZDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoyZGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZTAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDJlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKKzArMDJlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDJlYyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyZWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoyZjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjggPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDJmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKKzArMDMwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDMwNCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSozMDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMwOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDMwYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjMwYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAzMTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCiswKzAzMTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAzMWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozMWM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAzMjAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDMyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKK1sgCV0qMzI0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAzMmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozMmM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAzMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDMzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjIxMzEKK1sgCV0qMzM0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAzMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzAzM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozM2M6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMzQwIDxbXj5dKj4gbm9wCiswKzAzNDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSozNDQ6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAzNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNGMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMzRjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDM1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjM1NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNTggPFtePl0qPiBub3AKKzArMDM1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDM2MCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSozNjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAzNjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSozNjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNmMgPFtePl0qPiBub3AKKzArMDM3MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDM3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSozNzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAzN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSozN2M6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzODAgPFtePl0qPiBub3AKKzArMDM4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDM4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSozODg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDM4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDM5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjM5MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzk0IDxbXj5dKj4gbm9wCiswKzAzOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSozOWM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAzYTAgPFtePl0qPiBub3AKKzArMDNhNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjNhNDogUl9NSVBTX0xPMTYJLmJzcworMCswM2E4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswM2FjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qM2FjOiBSX01JUFNfR09UMTYJLmJzcworMCswM2IwIDxbXj5dKj4gbm9wCiswKzAzYjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSozYjQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDNiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDNiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjNiYzogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAzYzAgPFtePl0qPiBub3AKKzArMDNjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCitbIAldKjNjNDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDNjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDNjYyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSozY2M6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2QwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qM2Q0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNkOCA8W14+XSo+IG5vcAorMCswM2RjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKKzArMDNlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDNlNCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSozZTQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzZTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAzZWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSozZWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzZjAgPFtePl0qPiBub3AKKzArMDNmNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzAzZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzZmMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qM2ZjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDAwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNDA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDA4IDxbXj5dKj4gbm9wCiswKzA0MGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQorMCswNDEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjQxNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNDE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNDFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNDFjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0MjAgPFtePl0qPiBub3AKKzArMDQyNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCiswKzA0MjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0MmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo0MmM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA0MzAgPFtePl0qPiBub3AKKzArMDQzNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCitbIAldKjQzNDogUl9NSVBTX0xPMTYJLmJzcworMCswNDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNDNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNDNjOiBSX01JUFNfR09UMTYJLmJzcworMCswNDQwIDxbXj5dKj4gbm9wCiswKzA0NDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQorWyAJXSo0NDQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDQ0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDQ0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjQ0YzogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzA0NTAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDQ1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKK1sgCV0qNDU0OiBSX01JUFNfTE8xNgkuZGF0YQorMCswNDU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNDVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNDYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjQ2MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0NjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzA0NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSo0Njg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0NzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CiswKzA0NzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA0NzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0N2MgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNDdjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNDg0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDg4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0OGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CiswKzA0OTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA0OTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0OTggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNDk4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNGEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNGEwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNGE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0YTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CiswKzA0YWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA0YjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA0YjQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNGI0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0YjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzA0YmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSo0YmM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDRjMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswNGM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAorMCswNGM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNGNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNGQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNGQwOiBSX01JUFNfR09UMTYJLmJzcworMCswNGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0ZDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4CitbIAldKjRkODogUl9NSVBTX0xPMTYJLmJzcworMCswNGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNGUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNGU0OiBSX01JUFNfR09UMTYJLmJzcworMCswNGU4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA0ZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4CitbIAldKjRlYzogUl9NSVBTX0xPMTYJLmJzcworMCswNGYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNGY4OiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDRmYyA8W14+XSo+IG5vcAorMCswNTAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAorWyAJXSo1MDA6IFJfTUlQU19MTzE2CS5kYXRhCiswKzA1MDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1MDggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNTA4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDUwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDUxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjUxMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA1MTQgPFtePl0qPiBub3AKKzArMDUxOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKKzArMDUxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDUyMCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSo1MjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA1MjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzA1MjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSo1Mjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA1MmMgPFtePl0qPiBub3AKKzArMDUzMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKKzArMDUzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDUzOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSo1Mzg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA1M2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzA1NDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSo1NDA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA1NDQgPFtePl0qPiBub3AKKzArMDU0OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKKzArMDU0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDU1MCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSo1NTA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDU1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDU1OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjU1ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTVjIDxbXj5dKj4gbm9wCiswKzA1NjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4CiswKzA1NjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1Njg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA1NmMgPFtePl0qPiBub3AKKzArMDU3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKK1sgCV0qNTcwOiBSX01JUFNfTE8xNgkuYnNzCiswKzA1NzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1NzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1Nzg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzA1N2MgPFtePl0qPiBub3AKKzArMDU4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKK1sgCV0qNTgwOiBSX01JUFNfTE8xNgkuYnNzCiswKzA1ODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1ODggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1ODg6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswNThjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA1OTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSo1OTA6IFJfTUlQU19MTzE2CS5kYXRhCiswKzA1OTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA1OTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1OWMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNTljOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDVhMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDVhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjVhNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA1YTggPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDVhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCiswKzA1YjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA1YjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1YjggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNWI4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNWJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNWMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNWMwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA1YzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswNWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNWQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNWQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjVkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDVkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDVkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjVkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDVlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswNWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKKzArMDVlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDVlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDVmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSo1ZjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDVmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDVmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjVmODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNWZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA2MDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorMCswNjA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNjA4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNjBjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qNjBjOiBSX01JUFNfR09UMTYJLmJzcworMCswNjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA2MTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSo2MTQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDYxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDYxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDYyMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjYyMDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDYyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswNjI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKK1sgCV0qNjI4OiBSX01JUFNfTE8xNgkuYnNzCiswKzA2MmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0CiswKzA2MzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA2MzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo2MzQ6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswNjM4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzA2M2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCitbIAldKjYzYzogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDY0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDY0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDY0OCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSo2NDg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNjRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNjUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNjUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDY1NCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswNjU4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorMCswNjVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNjYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNjY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjY2NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDY2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDY2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjY2YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDY3MCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswNjc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorMCswNjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNjdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNjgwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjY4MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDY4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDY4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKjY4ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDY4YyA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswNjkwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorMCswNjk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAorMCswNjk4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswNjljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjY5YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNmEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswNmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNmE0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA2YTggPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDZhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKKzArMDZiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDZiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDZiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjZiODogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDZiYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswNmMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQorWyAJXSo2YzA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDZjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDZjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDZjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjZjYzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDZkMCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswNmQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQorWyAJXSo2ZDQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDZkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKKzArMDZkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWVhYTFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5kCkBAIC0wLDAgKzEsMzg0IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgbGEKKyNhczogLW1pcHMxCisKKyMgVGVzdCB0aGUgbGEgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAorMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCiswKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAorMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKKzArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQorMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCiswKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKKzArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCiswKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAorMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1CiswKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNTAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDU4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSo1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKK1sgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA2OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA2YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCitbIAldKjZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDcwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMDc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwNzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKworWyAJXSo3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDg0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwODggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSo4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKK1sgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDkwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCitbIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwYTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKworWyAJXSphNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSphODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwYjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSpiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBiOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBiYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBjMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKmMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKmM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBjOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGNjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSpkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMGQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMGRjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMGUwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBlNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBlOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSplODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSpmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTAwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSoxMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMTAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMTEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDExNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjExNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDEyMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMjggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjEzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxMzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTM4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDE0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNTAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDE1OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE2OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTcwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTc4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTdjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTgwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDE4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxODggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDE4YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMTk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoxOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFhMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCitbIAldKjFhMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYTggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAorWyAJXSoxYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYmMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMWMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMWM4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKK1sgCV0qMWM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFkMCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMWQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMWQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFkYyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjFlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMWU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKK1sgCV0qMWU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCitbIAldKjFmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDIwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDIwNCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyMDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyMTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKworWyAJXSoyMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMjE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjE4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDIxYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjIyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMjMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjIzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyM2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMjQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI0OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI1NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjI1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjI1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI2MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjI2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSoyNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjZjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjI2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjc4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjdjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyODQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjI4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyOTAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjI5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyOWMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmE4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJiNCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMmI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDJiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJjMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjJjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSoyYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoyZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJkOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoyZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMmU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjJlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyZjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoyZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyZmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzMDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzMDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSozMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMzBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMzBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDMxMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDMxNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjMxNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzMTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMzFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzIwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMzIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSozMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDMyYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjMyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSozMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzM4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMzM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDMzYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCitbIAldKjMzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSozNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzNDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSozNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNTAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSozNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKworWyAJXSozNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMzYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKK1sgCV0qMzYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDM2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhjODExCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5zCkBAIC0wLDAgKzEsMTE0IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGEgbWFjcm8uCisJCisJLmRhdGEKK2RhdGFfbGFiZWw6CisJLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCisJLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKKwkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKKwkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQorCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKKwkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKKwkKKwkudGV4dAorCWxhCSQ0LDAKKwlsYQkkNCwxCisJbGEJJDQsMHg4MDAwCisJbGEJJDQsLTB4ODAwMAorCWxhCSQ0LDB4MTAwMDAKKwlsYQkkNCwweDFhNWE1CisJbGEJJDQsMCgkNSkKKwlsYQkkNCwxKCQ1KQorCWxhCSQ0LDB4ODAwMCgkNSkKKwlsYQkkNCwtMHg4MDAwKCQ1KQorCWxhCSQ0LDB4MTAwMDAoJDUpCisJbGEJJDQsMHgxYTVhNSgkNSkKKwlsYQkkNCxkYXRhX2xhYmVsCisJbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgorCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24KKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24KKwlsYQkkNCxkYXRhX2xhYmVsKzEKKwlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEKKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCWxhCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCisJbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAorCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKKwlsYQkkNCxkYXRhX2xhYmVsLTB4ODAwMAorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCisJbGEJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCisJbGEJJDQsZGF0YV9sYWJlbCsweDEwMDAwCisJbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAorCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCisJbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCisJbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwlsYQkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKKwlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1CisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQorCWxhCSQ0LGRhdGFfbGFiZWwoJDUpCisJbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKKwlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQorCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKKwlsYQkkNCxkYXRhX2xhYmVsKzEoJDUpCisJbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQorCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQorCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKKwlsYQkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKKwlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCisJbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKKwlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQorCWxhCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKKwlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQorCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQorCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCisJbGEJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCisJbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCisJbGEJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCisJbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQorCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKKwlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKKwlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCisJbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCisKKwkuaWZuZGVmCUtQSUMKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCisJLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLWVtcGljLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyNGEzMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZApAQCAtMCwwICsxLDEwMiBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNuYW1lOiBNSVBTIGxiLWVtcGljCisjYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYworI3NvdXJjZTogbGItcGljLnMKKworIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCiswKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCiswKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKKzArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCiswKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCiswKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQorMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKKzArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQorMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQorMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCiswKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCiswKzAwNTQgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCitbIAldKjU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAwNTggPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQorWyAJXSo1ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDVjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKK1sgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKK1sgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKK1sgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwNjggPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCitbIAldKjY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDA2YyA8W14+XSo+IGxiCVwkYTAsLTE1Mzg0XChcJGdwXCkKK1sgCV0qNmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMDcwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQorWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgorMCswMDc0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKK1sgCV0qNzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA3OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCitbIAldKjc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA3YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCitbIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA4MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCitbIAldKjgwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDg0IDxbXj5dKj4gbGIJXCRhMCwtMTYzODNcKFwkZ3BcKQorWyAJXSo4NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwODggPFtePl0qPiBsYglcJGEwLC0xNTM4M1woXCRncFwpCitbIAldKjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDA4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKKzArMDA5MCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKK1sgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKKzArMDA5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKKzArMDA5OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAwYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAwYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKKzArMDBiOCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGEwXCkKK1sgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAorMCswMGMwIDxbXj5dKj4gbGIJXCRhMCwtMTUzODRcKFwkYTBcKQorWyAJXSpjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAwYzggPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCitbIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAwY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAwZDAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAorMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKK1sgCV0qZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAorMCswMGUwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKK1sgCV0qZTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAorMCswMGU4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKK1sgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAwZjAgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRhMFwpCitbIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKKzArMDBmOCA8W14+XSo+IGxiCVwkYTAsLTE1MzgzXChcJGEwXCkKK1sgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGZjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNmZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1waWMucwpAQCAtMCwwICsxLDU1IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGIgbWFjcm8gd2l0aCBQSUMgY29kZS4KKwkKKwkuZGF0YQorZGF0YV9sYWJlbDoKKwkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKKwkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQorCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAorCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCisJLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAorCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQorCQorCS50ZXh0CisJbGIJJDQsMAorCWxiCSQ0LDEKKwlsYgkkNCwweDgwMDAKKwlsYgkkNCwtMHg4MDAwCisJbGIJJDQsMHgxMDAwMAorCWxiCSQ0LDB4MWE1YTUKKwlsYgkkNCwwKCQ1KQorCWxiCSQ0LDEoJDUpCisJbGIJJDQsMHg4MDAwKCQ1KQorCWxiCSQ0LC0weDgwMDAoJDUpCisJbGIJJDQsMHgxMDAwMCgkNSkKKwlsYgkkNCwweDFhNWE1KCQ1KQorCWxiCSQ0LGRhdGFfbGFiZWwKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbgorCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCWxiCSQ0LGRhdGFfbGFiZWwrMQorCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQorCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCisJbGIJJDQsZGF0YV9sYWJlbCgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQorCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQorCWxiCSQ0LGRhdGFfbGFiZWwrMSgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQorCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXN2cjRwaWMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg4NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQKQEAgLTAsMCArMSwxODIgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsYi1zdnI0cGljCisjYXM6IC1taXBzMSAtS1BJQworI3NvdXJjZTogbGItcGljLnMKKworIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBsYglcJGEwLDBcKFwkemVyb1wpCiswKzAwMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkemVyb1wpCiswKzAwMDggPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAwYyA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKKzArMDAxMCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJHplcm9cKQorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDFjIDxbXj5dKj4gbHVpCVwkYTAsMHgyCiswKzAwMjAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCiswKzAwMjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTFcKQorMCswMDI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGExXCkKKzArMDAyYyA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQorMCswMDM4IDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTFcKQorMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgyCiswKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwNTAgPFtePl0qPiBsYglcJGEwLC0yMzEzMVwoXCRhMFwpCiswKzAwNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo1NDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwNTggPFtePl0qPiBub3AKKzArMDA1YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjVjOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDA2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjY0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2OCA8W14+XSo+IG5vcAorMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDA3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjcwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDc0IDxbXj5dKj4gbm9wCiswKzAwNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qN2M6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODAgPFtePl0qPiBub3AKKzArMDA4NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo4ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDhjIDxbXj5dKj4gbm9wCiswKzAwOTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDk0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qOTQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwOTggPFtePl0qPiBub3AKKzArMDA5YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjljOiBSX01JUFNfTE8xNgkuYnNzCiswKzAwYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMGE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYTQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwYTggPFtePl0qPiBub3AKKzArMDBhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCitbIAldKmFjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAwYjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMGI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYjQ6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMGI4IDxbXj5dKj4gbm9wCiswKzAwYmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSpiYzogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDBjMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAwYzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSpjNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYzggPFtePl0qPiBub3AKKzArMDBjYyA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAwZDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSpkMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBkNCA8W14+XSo+IG5vcAorMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDBkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmRjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGUwIDxbXj5dKj4gbm9wCiswKzAwZTQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qZTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBlYyA8W14+XSo+IG5vcAorMCswMGYwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDBmNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmY0OiBSX01JUFNfR09UMTYJLmJzcworMCswMGY4IDxbXj5dKj4gbm9wCiswKzAwZmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSpmYzogUl9NSVBTX0xPMTYJLmJzcworMCswMTAwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDEwNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjEwNDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDEwOCA8W14+XSo+IG5vcAorMCswMTBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKK1sgCV0qMTBjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxMTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMTE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTE0OiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDExOCA8W14+XSo+IG5vcAorMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qMTFjOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMTIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMTI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDEyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjEyODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMmMgPFtePl0qPiBub3AKKzArMDEzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDEzNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxMzggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxMzg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxM2MgPFtePl0qPiBub3AKKzArMDE0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDE0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxNDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxNDg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNGMgPFtePl0qPiBub3AKKzArMDE1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDE1NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxNTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxNTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1YyA8W14+XSo+IG5vcAorMCswMTYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMTY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDE2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjE2ODogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE2YyA8W14+XSo+IG5vcAorMCswMTcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qMTcwOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxNzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMTdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTdjOiBSX01JUFNfR09UMTYJLmJzcworMCswMTgwIDxbXj5dKj4gbm9wCiswKzAxODQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSoxODQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDE4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDE4YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxOTA6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMTk0IDxbXj5dKj4gbm9wCiswKzAxOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoxOTg6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAxOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMWE0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFhOCA8W14+XSo+IG5vcAorMCswMWFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMWIwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDFiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFiNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFiOCA8W14+XSo+IG5vcAorMCswMWJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMWMwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDFjNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFjNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFjOCA8W14+XSo+IG5vcAorMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMWQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDFkNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjFkNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWQ4IDxbXj5dKj4gbm9wCiswKzAxZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxZTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMWU0OiBSX01JUFNfR09UMTYJLmJzcworMCswMWU4IDxbXj5dKj4gbm9wCiswKzAxZWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSoxZWM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDFmMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFmNCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAxZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxZjg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxZmMgPFtePl0qPiBub3AKKzArMDIwMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCitbIAldKjIwMDogUl9NSVBTX0xPMTYJLmJzcworMCswMjA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjA4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDIwYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LWlsb2Nrcy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOGJkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQKQEAgLTAsMCArMSwyMTQgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsYi14Z290LWlsb2NrcworI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLW1jcHU9cjM5MDAKKyNzb3VyY2U6IGxiLXBpYy5zCisKKyMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKKzArMDAwMCA8Lio+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKKzArMDAwNCA8Lio+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKKzArMDAwOCA8Lio+IGx1aQlcJGEwLDB4MQorMCswMDBjIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQorMCswMDEwIDwuKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCiswKzAwMTQgPC4qPiBsdWkJXCRhMCwweDEKKzArMDAxOCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwMWMgPC4qPiBsdWkJXCRhMCwweDIKKzArMDAyMCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKKzArMDAyNCA8Lio+IGxiCVwkYTAsMFwoXCRhMVwpCiswKzAwMjggPC4qPiBsYglcJGEwLDFcKFwkYTFcKQorMCswMDJjIDwuKj4gbHVpCVwkYTAsMHgxCiswKzAwMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMzQgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCiswKzAwMzggPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCiswKzAwM2MgPC4qPiBsdWkJXCRhMCwweDEKKzArMDA0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDA0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwNDggPC4qPiBsdWkJXCRhMCwweDIKKzArMDA0YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDA1MCA8Lio+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKKzArMDA1NCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCisJCQk1NDogUl9NSVBTX0dPVDE2CVwuZGF0YQorMCswMDU4IDwuKj4gbm9wCiswKzAwNWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAorCQkJNWM6IFJfTUlQU19MTzE2CVwuZGF0YQorMCswMDYwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDA2NCA8Lio+IGx1aQlcJGEwLDB4MAorCQkJNjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMDZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKKwkJCTZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA3MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwNzQgPC4qPiBsdWkJXCRhMCwweDAKKwkJCTc0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDc4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMDdjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKKwkJCTdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDA4NCA8Lio+IGx1aQlcJGEwLDB4MAorCQkJODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAwOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJOGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwOTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDk0IDwuKj4gbHVpCVwkYTAsMHgwCisJCQk5NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDk4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMDljIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKKwkJCTljOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwYTAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMGE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCWE0OiBSX01JUFNfR09UMTYJXC5ic3MKKzArMDBhOCA8Lio+IG5vcAorMCswMGFjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKKwkJCWFjOiBSX01JUFNfTE8xNglcLmJzcworMCswMGIwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDBiNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCisJCQliNDogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAwYjggPC4qPiBub3AKKzArMDBiYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCisJCQliYzogUl9NSVBTX0xPMTYJXC5ic3MKKzArMDBjMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwYzQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQorCQkJYzQ6IFJfTUlQU19HT1QxNglcLmRhdGEKKzArMDBjOCA8Lio+IG5vcAorMCswMGNjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKKwkJCWNjOiBSX01JUFNfTE8xNglcLmRhdGEKKzArMDBkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAwZDQgPC4qPiBsdWkJXCRhMCwweDAKKwkJCWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBkOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDBkYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCisJCQlkYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMGU0IDwuKj4gbHVpCVwkYTAsMHgwCisJCQllNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBlOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDBlYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCisJCQllYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAwZjQgPC4qPiBsdWkJXCRhMCwweDAKKwkJCWY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGY4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMGZjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKKwkJCWZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTAwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDEwNCA8Lio+IGx1aQlcJGEwLDB4MAorCQkJMTA0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxMDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxMGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMTBjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxMTAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMTE0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTExNDogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAxMTggPC4qPiBub3AKKzArMDExYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCisJCQkxMWM6IFJfTUlQU19MTzE2CVwuYnNzCiswKzAxMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMTI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTEyNDogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAxMjggPC4qPiBub3AKKzArMDEyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCisJCQkxMmM6IFJfTUlQU19MTzE2CVwuYnNzCiswKzAxMzAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMTM0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTEzNDogUl9NSVBTX0dPVDE2CVwuZGF0YQorMCswMTM4IDwuKj4gbm9wCiswKzAxM2MgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAorCQkJMTNjOiBSX01JUFNfTE8xNglcLmRhdGEKKzArMDE0MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDE0NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxNDggPC4qPiBsdWkJXCRhMCwweDAKKwkJCTE0ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNGMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxNTAgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMTUwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE1NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDE1OCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxNWMgPC4qPiBsdWkJXCRhMCwweDAKKwkJCTE1YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE2MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDE2NCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCisJCQkxNjQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxNmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMTcwIDwuKj4gbHVpCVwkYTAsMHgwCisJCQkxNzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNzQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxNzggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMTc4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTdjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMTgwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDE4NCA8Lio+IGx1aQlcJGEwLDB4MAorCQkJMTg0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxODggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxOGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMThjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxOTAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxOTQgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMTk4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTE5ODogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAxOWMgPC4qPiBub3AKKzArMDFhMCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCisJCQkxYTA6IFJfTUlQU19MTzE2CVwuYnNzCiswKzAxYTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYTggPC4qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMWFjIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTFhYzogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAxYjAgPC4qPiBub3AKKzArMDFiNCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCisJCQkxYjQ6IFJfTUlQU19MTzE2CVwuYnNzCiswKzAxYjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYmMgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMWMwIDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTFjMDogUl9NSVBTX0dPVDE2CVwuZGF0YQorMCswMWM0IDwuKj4gbm9wCiswKzAxYzggPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAorCQkJMWM4OiBSX01JUFNfTE8xNglcLmRhdGEKKzArMDFjYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFkMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAxZDQgPC4qPiBsdWkJXCRhMCwweDAKKwkJCTFkNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxZGMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFlNCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAxZTggPC4qPiBsdWkJXCRhMCwweDAKKwkJCTFlODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDFmMCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCisJCQkxZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZjQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxZjggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMWZjIDwuKj4gbHVpCVwkYTAsMHgwCisJCQkxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyMDQgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMjA0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjA4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjBjIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDIxMCA8Lio+IGx1aQlcJGEwLDB4MAorCQkJMjEwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyMTQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyMTggPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQorCQkJMjE4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyMWMgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyMjAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMjI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTIyNDogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAyMjggPC4qPiBub3AKKzArMDIyYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCisJCQkyMmM6IFJfTUlQU19MTzE2CVwuYnNzCiswKzAyMzAgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyMzQgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMjM4IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKKwkJCTIzODogUl9NSVBTX0dPVDE2CVwuYnNzCiswKzAyM2MgPC4qPiBub3AKKzArMDI0MCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCisJCQkyNDA6IFJfTUlQU19MTzE2CVwuYnNzCiswKzAyNDQgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyNDggPC4qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMjRjIDwuKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOGM2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QuZApAQCAtMCwwICsxLDI0MiBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNuYW1lOiBNSVBTIGxiLXhnb3QKKyNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzMDAwCisjc291cmNlOiBsYi1waWMucworCisjIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKKzArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKKzArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQorMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCiswKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKKzArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKKzArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCiswKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQorMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCiswKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCiswKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKKzArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKKzArMDA1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjU0OiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDA1OCA8W14+XSo+IG5vcAorMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKK1sgCV0qNWM6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAwNjAgPFtePl0qPiBub3AKKzArMDA2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qNjg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qNzA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDc0IDxbXj5dKj4gbm9wCiswKzAwNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMDdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjdjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qODQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwODggPFtePl0qPiBub3AKKzArMDA4YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qOTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSo5ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA5YyA8W14+XSo+IG5vcAorMCswMGEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDBhNCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSphNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMGFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qYWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBiMCA8W14+XSo+IG5vcAorMCswMGI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmI4OiBSX01JUFNfR09UMTYJLmJzcworMCswMGJjIDxbXj5dKj4gbm9wCiswKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAorWyAJXSpjMDogUl9NSVBTX0xPMTYJLmJzcworMCswMGM0IDxbXj5dKj4gbm9wCiswKzAwYzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMGNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qY2M6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwZDAgPFtePl0qPiBub3AKKzArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCitbIAldKmQ0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAwZDggPFtePl0qPiBub3AKKzArMDBkYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSplMDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwZTQgPFtePl0qPiBub3AKKzArMDBlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKmU4OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMGVjIDxbXj5dKj4gbm9wCiswKzAwZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMGY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKKzArMDBmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCitbIAldKmZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEwMCA8W14+XSo+IG5vcAorMCswMTA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDEwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxMDg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxMTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoxMTA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMTQgPFtePl0qPiBub3AKKzArMDExOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAxMWMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMTFjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMTI0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTI4IDxbXj5dKj4gbm9wCiswKzAxMmMgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMTMwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjEzMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMTM4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxM2MgPFtePl0qPiBub3AKKzArMDE0MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAxNDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxNDQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxNDggPFtePl0qPiBub3AKKzArMDE0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjE0YzogUl9NSVBTX0xPMTYJLmJzcworMCswMTUwIDxbXj5dKj4gbm9wCiswKzAxNTQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMTU4OiBSX01JUFNfR09UMTYJLmJzcworMCswMTVjIDxbXj5dKj4gbm9wCiswKzAxNjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSoxNjA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDE2NCA8W14+XSo+IG5vcAorMCswMTY4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDE2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjE2YzogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAxNzAgPFtePl0qPiBub3AKKzArMDE3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjE3NDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDE3OCA8W14+XSo+IG5vcAorMCswMTdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMTgwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDE4NCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMThjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMThjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE5MCA8W14+XSo+IG5vcAorMCswMTk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMTk4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDE5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxOWM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoxYTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYTggPFtePl0qPiBub3AKKzArMDFhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxYjQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWI0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMWJjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWMwIDxbXj5dKj4gbm9wCiswKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMWNjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjFjYzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMWQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMWQ0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZDggPFtePl0qPiBub3AKKzArMDFkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFlMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCiswKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoxZTQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxZTggPFtePl0qPiBub3AKKzArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjFlYzogUl9NSVBTX0xPMTYJLmJzcworMCswMWYwIDxbXj5dKj4gbm9wCiswKzAxZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxZjggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMWZjOiBSX01JUFNfR09UMTYJLmJzcworMCswMjAwIDxbXj5dKj4gbm9wCiswKzAyMDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSoyMDQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDIwOCA8W14+XSo+IG5vcAorMCswMjBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDIxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjIxNDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAyMTggPFtePl0qPiBub3AKKzArMDIxYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjIxYzogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDIyMCA8W14+XSo+IG5vcAorMCswMjI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDIyYyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyMmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMjM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMjM0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzOCA8W14+XSo+IG5vcAorMCswMjNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDI0NCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyNDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCiswKzAyNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQorWyAJXSoyNGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNTAgPFtePl0qPiBub3AKKzArMDI1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI1OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAyNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMjY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMjY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjY4IDxbXj5dKj4gbm9wCiswKzAyNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyNzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMjc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjI3NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAorMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKK1sgCV0qMjdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyODAgPFtePl0qPiBub3AKKzArMDI4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI4OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCiswKzAyOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSoyOGM6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAyOTAgPFtePl0qPiBub3AKKzArMDI5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCitbIAldKjI5NDogUl9NSVBTX0xPMTYJLmJzcworMCswMjk4IDxbXj5dKj4gbm9wCiswKzAyOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyYTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qMmE0OiBSX01JUFNfR09UMTYJLmJzcworMCswMmE4IDxbXj5dKj4gbm9wCiswKzAyYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAorWyAJXSoyYWM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDJiMCA8W14+XSo+IG5vcAorMCswMmI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKKzArMDJiYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWM0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLmQKQEAgLTAsMCArMSwzOTUgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsYgorI2FzOiAtbWlwczEKKworIyBUZXN0IHRoZSBsYiBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbGIJXCRhMCwwXChcJHplcm9cKQorMCswMDA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJHplcm9cKQorMCswMDA4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMGMgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCiswKzAwMTAgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKKzArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDAxYyA8W14+XSo+IGx1aQlcJGEwLDB4MgorMCswMDIwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQorMCswMDI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGExXCkKKzArMDAyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMVwpCiswKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKKzArMDAzOCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKKzArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQorMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKKzArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4MgorMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMDUwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQorMCswMDU0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDA1OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKK1sgCV0qNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSo2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGdwXCkKK1sgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA2YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA3MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCitbIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMDc4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQorWyAJXSo3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDA3YyA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGdwXCkKK1sgCV0qN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMDgwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDA4NCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKK1sgCV0qODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDg4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOGMgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDkwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKK1sgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDk0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA5OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCitbIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA5YyA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCitbIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGEwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMGE0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQorWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDBhOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRncFwpCitbIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBhYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBiMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKmIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBiNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGJjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGM4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZDAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBkNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKmQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMGQ4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwZGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSpkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZTQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMGU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMGVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmYyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxMDAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTA0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjEwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwYyA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMTQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDExOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTIwIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQorWyAJXSoxMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTI0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMjggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMzAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDEzOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjEzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxM2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNDAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxNDggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCitbIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE0YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjE0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoxNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMTU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDE1OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxNWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE2MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTY0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMTY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE2OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjE2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoxNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTcwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE3NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE3OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE3YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjE3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDE4MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjE4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE4NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjE4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxODggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMThjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxOTQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCitbIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOTggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxYTAgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKKzArMDFhOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYWMgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFiNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAxYmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQorWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxYzAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMWM4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQorWyAJXSoxYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAxZDAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoxZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMWQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxZGMgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCitbIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxZTAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAxZTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKKzArMDFmMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCitbIAldKjFmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZjQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMWY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDFmYyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAyMDQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQorWyAJXSoyMDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMjBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjEwIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQorWyAJXSoyMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCiswKzAyMTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoyMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMjFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDIyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDIyNCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMjggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDIzMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjM0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDIzYyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjQ4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI0YyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI1NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI1OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI2MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDI2NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyNmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjcwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyNzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMjg0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODggPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI5MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjI5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDI5YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyYTAgPFtePl0qPiBsdWkJXCRhMCwweDAKK1sgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCitbIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJiNCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiOCA8W14+XSo+IGx1aQlcJGEwLDB4MAorWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMmJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmMwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDJjNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjJjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAyY2MgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCitbIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyZDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJkOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjJkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJlNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSoyZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMmVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMmYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKK1sgCV0qMmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJmNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDJmYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCitbIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMwMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjMwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDMwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDMwOCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKK1sgCV0qMzA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMzBjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMzBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDMxMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDMxNCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjMxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzMTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSozMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMzFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzIwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMzIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDMyNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjMyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzJjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMzJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMzAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKworWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzM4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDMzYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCitbIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzAzNDQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQorWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMzQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMzQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzUwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMzUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMzU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMzU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQorMCswMzVjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKK1sgCV0qMzVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMzYwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDM2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDM2OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzNmMgPFtePl0qPiBsYnUJXCRhMCwwXChcJHplcm9cKQorMCswMzcwIDxbXj5dKj4gbGgJXCRhMCwwXChcJHplcm9cKQorMCswMzc0IDxbXj5dKj4gbGh1CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDM3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDM3YyA8W14+XSo+IGx3bAlcJGEwLDBcKFwkemVyb1wpCiswKzAzODAgPFtePl0qPiBsd3IJXCRhMCwwXChcJHplcm9cKQorMCswMzg0IDxbXj5dKj4gbHdjMAlcJDQsMFwoXCR6ZXJvXCkKKzArMDM4OCA8W14+XSo+IGx3YzEJXCRmNCwwXChcJHplcm9cKQorMCswMzhjIDxbXj5dKj4gbHdjMglcJDQsMFwoXCR6ZXJvXCkKKzArMDM5MCA8W14+XSo+IGx3YzMJXCQ0LDBcKFwkemVyb1wpCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzY2NhZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucwpAQCAtMCwwICsxLDEyNSBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxiIG1hY3JvLgorCQorCS5kYXRhCitkYXRhX2xhYmVsOgorCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAorCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCisJLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCisJLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKKwkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCisJLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCisJCisJLnRleHQKKwlsYgkkNCwwCisJbGIJJDQsMQorCWxiCSQ0LDB4ODAwMAorCWxiCSQ0LC0weDgwMDAKKwlsYgkkNCwweDEwMDAwCisJbGIJJDQsMHgxYTVhNQorCWxiCSQ0LDAoJDUpCisJbGIJJDQsMSgkNSkKKwlsYgkkNCwweDgwMDAoJDUpCisJbGIJJDQsLTB4ODAwMCgkNSkKKwlsYgkkNCwweDEwMDAwKCQ1KQorCWxiCSQ0LDB4MWE1YTUoJDUpCisJbGIJJDQsZGF0YV9sYWJlbAorCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KKwlsYgkkNCxiaWdfbG9jYWxfY29tbW9uCisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uCisJbGIJJDQsZGF0YV9sYWJlbCsxCisJbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxCisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKKwlsYgkkNCxkYXRhX2xhYmVsKzB4ODAwMAorCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCisJbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKKwlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCisJbGIJJDQsZGF0YV9sYWJlbC0weDgwMDAKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAorCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAorCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAorCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCisJbGIJJDQsZGF0YV9sYWJlbCsweDFhNWE1CisJbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1CisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1CisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwlsYgkkNCxkYXRhX2xhYmVsKCQ1KQorCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCisJbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKKwlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCisJbGIJJDQsZGF0YV9sYWJlbCsxKCQ1KQorCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKKwlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKKwlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCisJbGIJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCisJbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQorCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCisJbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKKwlsYgkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCisJbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKKwlsYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKKwlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQorCWxiCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQorCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQorCWxiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQorCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKKwlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCisJbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCisJbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQorCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQorCisjIFNldmVyYWwgbWFjcm9zIGFyZSBoYW5kbGVkIGxpa2UgbGIuICBTYW5pdHkgY2hlY2sgdGhlbS4KKwlsYnUJJDQsMAorCWxoCSQ0LDAKKwlsaHUJJDQsMAorCWx3CSQ0LDAKKwlsd2wJJDQsMAorCWx3cgkkNCwwCisJbHdjMAkkNCwwCisJbHdjMQkkNCwwCisJbHdjMgkkNCwwCisJbHdjMwkkNCwwCisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5NjFmNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtZW1waWMuZApAQCAtMCwwICsxLDE4NiBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNuYW1lOiBNSVBTIGxkLWVtcGljCisjYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYyAtLWRlZnN5bSBFTVBJQz0xCisjc291cmNlOiBsZC1waWMucworCisjIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKKzArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKKzArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKKzArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCiswKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKKzArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKKzArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKKzArMDAzYyA8W14+XSo+IG5vcAorMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKKzArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCiswKzAwNDggPFtePl0qPiBub3AKKzArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCiswKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQorMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCiswKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCiswKzAwNjQgPFtePl0qPiBub3AKKzArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKKzArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKKzArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKKzArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKKzArMDA5MCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKK1sgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKKzArMDA5NCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKK1sgCV0qOTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKKzArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQorWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGE0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKK1sgCV0qYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKK1sgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQorWyAJXSpiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBiOCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKK1sgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGJjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQorWyAJXSpiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYzAgPFtePl0qPiBsdwlcJGEwLC0xNTM4NFwoXCRncFwpCitbIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBjNCA8W14+XSo+IGx3CVwkYTEsLTE1MzgwXChcJGdwXCkKK1sgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGM4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQorWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgorMCswMGNjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQorWyAJXSpjYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgorMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKK1sgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCitbIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZDggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQorWyAJXSpkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZGMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQorWyAJXSpkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQorWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQorWyAJXSplNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQorWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBlYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCitbIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQorWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZjQgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCitbIAldKmY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBmOCA8W14+XSo+IGx3CVwkYTAsLTE1MzgzXChcJGdwXCkKK1sgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGZjIDxbXj5dKj4gbHcJXCRhMSwtMTUzNzlcKFwkZ3BcKQorWyAJXSpmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMDAgPFtePl0qPiBub3AKKzArMDEwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDEwOCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKK1sgCV0qMTA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAxMGMgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCitbIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgorMCswMTEwIDxbXj5dKj4gbm9wCiswKzAxMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxMTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDExYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjExYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTIwIDxbXj5dKj4gbm9wCiswKzAxMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMTJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzMCA8W14+XSo+IG5vcAorMCswMTM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMTM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDEzYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjEzYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNDAgPFtePl0qPiBub3AKKzArMDE0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjE0ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE0YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjE0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1MCA8W14+XSo+IG5vcAorMCswMTU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQorWyAJXSoxNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTVjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQorWyAJXSoxNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTYwIDxbXj5dKj4gbm9wCiswKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxNjggPFtePl0qPiBsdwlcJGEwLC0xNTM4NFwoXCRhdFwpCitbIAldKjE2ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNmMgPFtePl0qPiBsdwlcJGExLC0xNTM4MFwoXCRhdFwpCitbIAldKjE2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNzAgPFtePl0qPiBub3AKKzArMDE3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKK1sgCV0qMTc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAxN2MgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCitbIAldKjE3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgorMCswMTgwIDxbXj5dKj4gbm9wCiswKzAxODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoxODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjE4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTkwIDxbXj5dKj4gbm9wCiswKzAxOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxOTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoxOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTljIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMTljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFhMCA8W14+XSo+IG5vcAorMCswMWE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFhYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjFhYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYjAgPFtePl0qPiBub3AKKzArMDFiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDFiOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjFiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFiYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFjMCA8W14+XSo+IG5vcAorMCswMWM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMWM4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQorWyAJXSoxYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMWNjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQorWyAJXSoxY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMWQwIDxbXj5dKj4gbm9wCiswKzAxZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxZDggPFtePl0qPiBsdwlcJGEwLC0xNTM4M1woXCRhdFwpCitbIAldKjFkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxZGMgPFtePl0qPiBsdwlcJGExLC0xNTM3OVwoXCRhdFwpCitbIAldKjFkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDZkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZApAQCAtMCwwICsxLDYzMiBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNhczogLW1pcHMzIC1tY3B1PXI0MDAwCisjbmFtZTogTUlQUyBsZC1pbG9ja3MKKyNzb3VyY2U6IGxkLnMKKworIyBUZXN0IHRoZSBsZCBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDwudGV4dD4gbHcJXCRhMCwwXChcJHplcm9cKQorMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQorMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQorMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQorMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCiswKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCiswKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKKzArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQorMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorMCswMDNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKKzArMDA0MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCiswKzAwNDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQorMCswMDQ4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKKzArMDA0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMDU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorMCswMDU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQorMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQorMCswMDY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMDcwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDA3NCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMDc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMDdjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorMCswMDgwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorMCswMDg0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDA4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDA4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDA5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDk0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA5OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYTAgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQorWyAJXSphMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQorWyAJXSpiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDBiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMGMwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwYzQgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRncFwpCitbIAldKmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBjOCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKK1sgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGNjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBlMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZTQgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQorWyAJXSplNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZTggPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQorWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGY0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKK1sgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZmMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQorWyAJXSpmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoxMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMDggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoxMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMGMgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRncFwpCitbIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMTAgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCitbIAldKjExMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDExOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDExYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDEyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxMjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMzAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMzQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjEzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMzggPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDEzYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE0MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNDggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE0YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDE1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDE2MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDE2NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDE2OCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTZjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTcwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE3YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxODAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTk0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE5YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWEwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxYWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDFiMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMWI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMWI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjFiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxYzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMWM0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMWQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWU4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFlYyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZjQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoxZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZjggPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjAwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMjAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjA0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjIwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyMDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDIxMCA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMjE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSoyMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjIwIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyNCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qMjI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMjggPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyYyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzMCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzNCA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjM4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjNjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjI0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI0NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjQ4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSoyNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNGMgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qMjRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMjUwIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyNTQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1OCA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMjVjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjYwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyNmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjcwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMjcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDI3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjgwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMmIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMmI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMmJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMmMwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQorWyAJXSoyYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMmM0IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQorWyAJXSoyYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyY2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoyZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMmQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDJkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJkYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDJlMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjJlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmU0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyZWMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoyZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMmY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmZjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDMwMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjMwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAzMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSozMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSozMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMzEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMzE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMzE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMzFjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMzIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMzI0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQorWyAJXSozMjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMzI4IDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQorWyAJXSozMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMzJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjMyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzMzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzMzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjMzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzMzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzNDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzQ4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSozNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMzU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSozNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzU4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjM1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzNjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjM2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNmMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMzZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzcwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMzc0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSozNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzNzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjM3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDM3YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSozN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjM4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDM4OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMzg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMzhjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjM4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzOTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjM5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzOTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjM5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMzljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDNhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNhNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qM2E0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDNhOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qM2E4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDNhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qM2I0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjNiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2JjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzYzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzYzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjNjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzYzggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjNjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qM2NjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDNkMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNkNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qM2Q0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDNkOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qM2Q4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDNkYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzZTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjNlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDNlOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qM2U4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswM2VjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDNmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNmNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qM2Y0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswM2Y4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qM2ZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDQwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQwNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qNDA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDQwOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qNDA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDQwYyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSo0MGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswNDEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qNDE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDQxOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjQxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzA0MWMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qNDFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0MjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0MjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0MjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQyOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjQyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjQyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0MzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0MzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0MzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDM4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSo0M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qNDQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDQ0OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjQ0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA0NGMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qNDRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNDUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qNDU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNDU4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjQ1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDQ2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQ2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjQ2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDQ2OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjQ2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDQ2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSo0NmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNDcwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDc0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qNDc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDQ3OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjQ3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA0N2MgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qNDdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDQ4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQ4NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNDg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDQ4OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qNDg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDQ4YyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo0OGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQ5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQ5NCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNDk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0OTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjQ5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjQ5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0YTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0YTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjRhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0YTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjRhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0YWMgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qNGFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDRiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRiNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNGI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDRiOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qNGI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDRiYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo0YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0YzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0YzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjRjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDRjOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qNGM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNGNjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjRjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDRkMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRkNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNGQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNGQ4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSo0ZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzA0ZGMgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qNGRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDRlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRlNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNGU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDRlOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qNGU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDRlYyA8W14+XSo+IGx3YzEJXCRmNSwwXChcJHplcm9cKQorMCswNGYwIDxbXj5dKj4gbHdjMQlcJGY0LDRcKFwkemVyb1wpCiswKzA0ZjQgPFtePl0qPiBsd2MxCVwkZjUsMVwoXCR6ZXJvXCkKKzArMDRmOCA8W14+XSo+IGx3YzEJXCRmNCw1XChcJHplcm9cKQorMCswNGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA1MDAgPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKKzArMDUwNCA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQorMCswNTA4IDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCR6ZXJvXCkKKzArMDUwYyA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkemVyb1wpCiswKzA1MTAgPFtePl0qPiBsd2MxCVwkZjUsMFwoXCRhMVwpCiswKzA1MTQgPFtePl0qPiBsd2MxCVwkZjQsNFwoXCRhMVwpCiswKzA1MTggPFtePl0qPiBsd2MxCVwkZjUsMVwoXCRhMVwpCiswKzA1MWMgPFtePl0qPiBsd2MxCVwkZjQsNVwoXCRhMVwpCiswKzA1MjAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDUyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDUyOCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQorMCswNTJjIDxbXj5dKj4gbHdjMQlcJGY0LC0zMjc2NFwoXCRhdFwpCiswKzA1MzAgPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJGExXCkKKzArMDUzNCA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkYTFcKQorMCswNTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjUzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDUzYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDU0MCA8W14+XSo+IGx3YzEJXCRmNSwtMjMxMzFcKFwkYXRcKQorWyAJXSo1NDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA1NDQgPFtePl0qPiBsd2MxCVwkZjQsLTIzMTI3XChcJGF0XCkKK1sgCV0qNTQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTQ4IDxbXj5dKj4gbm9wCiswKzA1NGMgPFtePl0qPiBzd2MxCVwkZjUsMFwoXCR6ZXJvXCkKKzArMDU1MCA8W14+XSo+IHN3YzEJXCRmNCw0XChcJHplcm9cKQorMCswNTU0IDxbXj5dKj4gc3djMQlcJGY1LDFcKFwkemVyb1wpCiswKzA1NTggPFtePl0qPiBzd2MxCVwkZjQsNVwoXCR6ZXJvXCkKKzArMDU1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswNTYwIDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCRhdFwpCiswKzA1NjQgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKKzArMDU2OCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkemVyb1wpCiswKzA1NmMgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJHplcm9cKQorMCswNTcwIDxbXj5dKj4gc3djMQlcJGY1LDBcKFwkYTFcKQorMCswNTc0IDxbXj5dKj4gc3djMQlcJGY0LDRcKFwkYTFcKQorMCswNTc4IDxbXj5dKj4gc3djMQlcJGY1LDFcKFwkYTFcKQorMCswNTdjIDxbXj5dKj4gc3djMQlcJGY0LDVcKFwkYTFcKQorMCswNTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA1ODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA1ODggPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKKzArMDU4YyA8W14+XSo+IHN3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQorMCswNTkwIDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCRhMVwpCiswKzA1OTQgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJGExXCkKKzArMDU5OCA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo1OTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNTljIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNWEwIDxbXj5dKj4gc3djMQlcJGY1LC0yMzEzMVwoXCRhdFwpCitbIAldKjVhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA1YTQgPFtePl0qPiBzd2MxCVwkZjQsLTIzMTI3XChcJGF0XCkKK1sgCV0qNWE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDVhOCA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDVhYyA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKKzArMDViMCA8W14+XSo+IGx1aQlcJGEwLDB4MgorWyAJXSo1YjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzA1YjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1YjggPFtePl0qPiBsZAlcJGEwLC0yMzEzMVwoXCRhMFwpCitbIAldKjViODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDViYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNWMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswNWM0IDxbXj5dKj4gc2QJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNWM4IDxbXj5dKj4gbm9wCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjJiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kCkBAIC0wLDAgKzEsNjMxIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcworI25hbWU6IE1JUFMgbGQtaWxvY2tzCisjc291cmNlOiBsZC5zCisjYXM6CisjIFRlc3QgdGhlIGxkIG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPC50ZXh0PiBsdwlcJGEwLDBcKFwkemVyb1wpCiswKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCiswKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCiswKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCiswKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKKzArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKKzArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQorMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCiswKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCiswKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCiswKzAwM2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQorMCswMDQwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKKzArMDA0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCiswKzAwNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQorMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCiswKzAwNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCiswKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCiswKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCiswKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAwNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAwNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwN2MgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCiswKzAwODAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCiswKzAwODQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDhjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDk4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBhMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCitbIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSphNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSphODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwYWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQorWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBiNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRncFwpCitbIAldKmI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMGJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwYzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSpjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDBjNCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKK1sgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGM4IDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQorWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwY2MgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSpkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBlNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCitbIAldKmU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBlOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCitbIAldKmU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZjggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQorWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBmYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCitbIAldKmZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDEwYyA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGdwXCkKK1sgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDExMCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGdwXCkKK1sgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDExNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxMTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzMCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzNCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMTM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzOCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTNjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTQwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE0OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTRjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMTUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTU0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMTY0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxNmMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxNzAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNzggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTdjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxOTAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjE5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxOTQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTljIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxYTAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFhNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxYTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjFhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDFhYyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxYjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxYmMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDFjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxYzQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoxYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoxZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMWQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxZTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjFlYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFmMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFmNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFmOCA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMDQgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMjA0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDIwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjIwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjIxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMjAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjIyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjI0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjMwIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMzggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjIzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyM2MgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyNDAgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI0YyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyNTAgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjI1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1NCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qMjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNWMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCitbIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNjAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNjQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDI2OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjc4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDI4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjI4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDJhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjJhNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjJhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyYjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSoyYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyYmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyYzAgPFtePl0qPiBsdwlcJGEwLC0xNjM4NFwoXCRhdFwpCitbIAldKjJjMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyYzQgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCitbIAldKjJjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyYzggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDJjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDJkMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjJkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMmQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmUwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjJlYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoyZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyZmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMzAwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDMwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDMwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjMwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjMwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzMTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSozMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAzMjQgPFtePl0qPiBsdwlcJGEwLC0xNjM4M1woXCRhdFwpCitbIAldKjMyNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzMjggPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCitbIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzMmMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMzJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDMzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDMzNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDMzOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDMzYyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM0NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjM0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjM0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjM1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDM2MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM2NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDM2OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDM2YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSozNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzNzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzNzQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCitbIAldKjM3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDM3OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMzc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDM4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM4NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMzg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMzg4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qMzhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDM5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM5NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qMzk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDM5OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswM2EwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswM2E0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSozYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswM2E4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozYTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswM2FjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2IwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswM2I0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSozYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qM2I4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzYmMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qM2JjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNjNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNjOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKK1sgCV0qM2M4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswM2QwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswM2Q0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSozZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswM2Q4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDNlMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNlNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKK1sgCV0qM2U0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswM2U4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSozZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzZWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qM2VjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswM2YwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswM2Y0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSozZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzZjggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCitbIAldKjNmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDNmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNDAwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDA0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorWyAJXSo0MDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNDA4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNDBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjQwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzA0MTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0MTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0MTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswNDE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDQxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSo0MWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQyNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDI4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0MmMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qNDJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQzMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjQzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0MzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjQzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA0NDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0NDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDQ4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQorWyAJXSo0NGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0NTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0NTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0NTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0NTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKK1sgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswNDYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qNDY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNDY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNDZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCitbIAldKjQ2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA0NzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0NzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0NzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNDc4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qNDc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDQ3YyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswNDgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDg0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSo0ODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswNDg4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSo0ODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswNDhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjQ4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDk0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSo0OTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQ5OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qNDk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0OWMgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDRhMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRhNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNGE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDRhOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKK1sgCV0qNGE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDRhYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo0YWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNGIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNGI0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSo0YjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNGI4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSo0Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNGJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDRjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRjNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNGM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNGM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0Y2MgPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qNGNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswNGQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNGQ0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSo0ZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzA0ZDggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCitbIAldKjRkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDRkYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNGUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNGU0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorWyAJXSo0ZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNGU4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorWyAJXSo0ZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNGVjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkemVyb1wpCiswKzA0ZjAgPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKKzArMDRmNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQorMCswNGY4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkemVyb1wpCiswKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDUwMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQorMCswNTA0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCiswKzA1MDggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQorMCswNTBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKKzArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJGExXCkKKzArMDUxNCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJGExXCkKKzArMDUxOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwxXChcJGExXCkKKzArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJGExXCkKKzArMDUyMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswNTI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNTI4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCiswKzA1MmMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKKzArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQorMCswNTM0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCiswKzA1MzggPFtePl0qPiBsdWkJXCRhdCwweDIKK1sgCV0qNTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNTQwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0yMzEzMVwoXCRhdFwpCitbIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDU0NCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQorWyAJXSo1NDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA1NDggPFtePl0qPiBub3AKKzArMDU0YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQorMCswNTUwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDRcKFwkemVyb1wpCiswKzA1NTQgPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKKzArMDU1OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQorMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA1NjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKKzArMDU2NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQorMCswNTY4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKKzArMDU2YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCiswKzA1NzAgPFtePl0qPiBzd2MxCVwkZls0NV0sMFwoXCRhMVwpCiswKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCRhMVwpCiswKzA1NzggPFtePl0qPiBzd2MxCVwkZls0NV0sMVwoXCRhMVwpCiswKzA1N2MgPFtePl0qPiBzd2MxCVwkZls0NV0sNVwoXCRhMVwpCiswKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDU4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDU4OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQorMCswNThjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCiswKzA1OTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKKzArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQorMCswNTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCitbIAldKjU5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA1OWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA1YTAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTIzMTMxXChcJGF0XCkKK1sgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDVhNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMjMxMjdcKFwkYXRcKQorWyAJXSo1YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNWE4IDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQorMCswNWFjIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQorMCswNWIwIDxbXj5dKj4gbHVpCVwkYTAsMHgyCitbIAldKjViMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDViNCA8W14+XSo+IChkfClhZGR1CVwkYTAsXCRhMCxcJGExCiswKzA1YjggPFtePl0qPiBsZAlcJGEwLC0yMzEzMVwoXCRhMFwpCitbIAldKjViODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDViYyA8W14+XSo+IGx1aQlcJGF0LDB4MgorWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNWMwIDxbXj5dKj4gKGR8KWFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDVjNCA8W14+XSo+IHNkCVwkYTAsLTIzMTMxXChcJGF0XCkKK1sgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDVjOCA8W14+XSo+IG5vcAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y1MmRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1waWMucwpAQCAtMCwwICsxLDYwIEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGQgbWFjcm8gd2l0aCBQSUMgY29kZS4KKwkKKwkuc2V0CW1pcHMxCisKKwkuZGF0YQorZGF0YV9sYWJlbDoKKwkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKKwkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQorCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAorCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCisJLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAorCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQorCQorCS50ZXh0CisJbGQJJDQsMAorCWxkCSQ0LDEKKwlsZAkkNCwweDgwMDAKKwlsZAkkNCwtMHg4MDAwCisJbGQJJDQsMHgxMDAwMAorCWxkCSQ0LDB4MWE1YTUKKwlsZAkkNCwwKCQ1KQorCWxkCSQ0LDEoJDUpCisJbGQJJDQsMHg4MDAwKCQ1KQorCWxkCSQ0LC0weDgwMDAoJDUpCisJbGQJJDQsMHgxMDAwMCgkNSkKKwlsZAkkNCwweDFhNWE1KCQ1KQorCWxkCSQ0LGRhdGFfbGFiZWwKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCisJbGQJJDQsYmlnX2xvY2FsX2NvbW1vbgorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCWxkCSQ0LGRhdGFfbGFiZWwrMQorCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCisJbGQJJDQsZGF0YV9sYWJlbCgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQorCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCisJbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQorCWxkCSQ0LGRhdGFfbGFiZWwrMSgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCisJbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCS5pZm5kZWYJRU1QSUMKKwlub3AKKwlub3AKKwkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1zdnI0cGljLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0M2Q3OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kCkBAIC0wLDAgKzEsMjI1IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgbGQtc3ZyNHBpYworI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMKKyNzb3VyY2U6IGxkLXBpYy5zCisKKyMgVGVzdCB0aGUgbGQgbWFjcm8gd2l0aCAtS1BJQy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbHcJXCRhMCwwXChcJHplcm9cKQorMCswMDA0IDxbXj5dKj4gbHcJXCRhMSw0XChcJHplcm9cKQorMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJHplcm9cKQorMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJHplcm9cKQorMCswMDEwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCiswKzAwMTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCiswKzAwMWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKKzArMDAyMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJHplcm9cKQorMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMDJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMDM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorMCswMDM4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorMCswMDNjIDxbXj5dKj4gbm9wCiswKzAwNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTFcKQorMCswMDQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGExXCkKKzArMDA0OCA8W14+XSo+IG5vcAorMCswMDRjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKKzArMDA1MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCiswKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA1OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKKzArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKKzArMDA2NCA8W14+XSo+IG5vcAorMCswMDY4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYTFcKQorMCswMDZjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYTFcKQorMCswMDcwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMDdjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MgorMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQorMCswMDhjIDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQorMCswMDkwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qOTA6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMDk0IDxbXj5dKj4gbm9wCiswKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo5ODogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDA5YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjljOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMGEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qYTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGE0IDxbXj5dKj4gbm9wCiswKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDBiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKmIwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGI0IDxbXj5dKj4gbm9wCiswKzAwYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMGJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDBjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKmMwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGM0IDxbXj5dKj4gbm9wCiswKzAwYzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMGNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDBkMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKmQwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZDQgPFtePl0qPiBub3AKKzArMDBkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAwZGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMGUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qZTA6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwZTQgPFtePl0qPiBub3AKKzArMDBlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKmU4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAwZWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorWyAJXSplYzogUl9NSVBTX0xPMTYJLmJzcworMCswMGYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qZjA6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwZjQgPFtePl0qPiBub3AKKzArMDBmOCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCitbIAldKmY4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAwZmMgPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQorWyAJXSpmYzogUl9NSVBTX0xPMTYJLmJzcworMCswMTAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMTAwOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDEwNCA8W14+XSo+IG5vcAorMCswMTA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMTA4OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMTBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMTBjOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMTEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMTEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDExNCA8W14+XSo+IG5vcAorMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKKzArMDExYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCiswKzAxMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxMjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMjQgPFtePl0qPiBub3AKKzArMDEyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCiswKzAxMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorMCswMTMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMTMwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTM0IDxbXj5dKj4gbm9wCiswKzAxMzggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorMCswMTNjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKKzArMDE0MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE0MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTQ0IDxbXj5dKj4gbm9wCiswKzAxNDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorMCswMTRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKKzArMDE1MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE1MDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE1NCA8W14+XSo+IG5vcAorMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMTU4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxNWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoxNWM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDE2MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE2MDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE2NCA8W14+XSo+IG5vcAorMCswMTY4IDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKK1sgCV0qMTY4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxNmMgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQorWyAJXSoxNmM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDE3MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE3MDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAxNzQgPFtePl0qPiBub3AKKzArMDE3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDE3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjE3YzogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDE4MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjE4MDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDE4NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE4NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxODggPFtePl0qPiBub3AKKzArMDE4YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDE5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAxOTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMTk4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMTk4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTljIDxbXj5dKj4gbm9wCiswKzAxYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMWE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDFhYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjFhYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFiMCA8W14+XSo+IG5vcAorMCswMWI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMWI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDFiYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAxYzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxYzA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFjNCA8W14+XSo+IG5vcAorMCswMWM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMWNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDFkMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAxZDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxZDQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxZDggPFtePl0qPiBub3AKKzArMDFkYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDFlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFlMDogUl9NSVBTX0xPMTYJLmJzcworMCswMWU0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMWU0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxZTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxZTg6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxZWMgPFtePl0qPiBub3AKKzArMDFmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDFmNCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCitbIAldKjFmNDogUl9NSVBTX0xPMTYJLmJzcworMCswMWY4IDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKK1sgCV0qMWY4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxZmMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxZmM6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMjAwIDxbXj5dKj4gbm9wCiswKzAyMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoyMDg6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAyMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoyMGM6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAyMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoyMTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjE0IDxbXj5dKj4gbm9wCiswKzAyMTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyMWMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorMCswMjIwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKKzArMDIyNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjIyNDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyOCA8W14+XSo+IG5vcAorMCswMjJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMjMwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKKzArMDIzNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCiswKzAyMzggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoyMzg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyM2MgPFtePl0qPiBub3AKKzArMDI0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDI0NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCiswKzAyNDggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorMCswMjRjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMjRjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNTAgPFtePl0qPiBub3AKKzArMDI1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDI1OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCiswKzAyNWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorMCswMjYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMjYwOiBSX01JUFNfR09UMTYJLmJzcworMCswMjY0IDxbXj5dKj4gbm9wCiswKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyNmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoyNmM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDI3MCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjI3MDogUl9NSVBTX0xPMTYJLmJzcworMCswMjc0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMjc0OiBSX01JUFNfR09UMTYJLmJzcworMCswMjc4IDxbXj5dKj4gbm9wCiswKzAyN2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyODAgPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQorWyAJXSoyODA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDI4NCA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCitbIAldKjI4NDogUl9NSVBTX0xPMTYJLmJzcworCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXhnb3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI2MmNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQKQEAgLTAsMCArMSwyNzMgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsZC14Z290CisjYXM6IC1taXBzMSAtbWNwdT1yMzAwMCAtS1BJQyAteGdvdAorI3NvdXJjZTogbGQtcGljLnMKKworIyBUZXN0IHRoZSBsZCBtYWNybyB3aXRoIC1LUElDIC14Z290LgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCiswKzAwMDQgPFtePl0qPiBsdwlcJGExLDRcKFwkemVyb1wpCiswKzAwMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkemVyb1wpCiswKzAwMGMgPFtePl0qPiBsdwlcJGExLDVcKFwkemVyb1wpCiswKzAwMTAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDAxNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKKzArMDAxOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKKzArMDAxYyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJHplcm9cKQorMCswMDIwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkemVyb1wpCiswKzAwMjQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDAyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAwMmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAwMzQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCiswKzAwMzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCiswKzAwM2MgPFtePl0qPiBub3AKKzArMDA0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCiswKzAwNDQgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQorMCswMDQ4IDxbXj5dKj4gbm9wCiswKzAwNGMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYTFcKQorMCswMDUwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGExXCkKKzArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMDVjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorMCswMDYwIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorMCswMDY0IDxbXj5dKj4gbm9wCiswKzAwNjggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhMVwpCiswKzAwNmMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhMVwpCiswKzAwNzAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDA3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAwN2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMDgwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCiswKzAwODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwODggPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCiswKzAwOGMgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCiswKzAwOTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSo5MDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwOTQgPFtePl0qPiBub3AKKzArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjk4OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMDljIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qOWM6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qYTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMGE4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qYTg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGFjIDxbXj5dKj4gbm9wCiswKzAwYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDBiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpiODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDBjMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKmMwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGM0IDxbXj5dKj4gbm9wCiswKzAwYzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMGNjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDBkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpkMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDBkOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKmQ4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGRjIDxbXj5dKj4gbm9wCiswKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMGU0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDBlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSplODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMGYwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qZjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBmNCA8W14+XSo+IG5vcAorMCswMGY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDBmYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAxMDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxMDQgPFtePl0qPiBub3AKKzArMDEwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjEwODogUl9NSVBTX0xPMTYJLmJzcworMCswMTBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKK1sgCV0qMTBjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxMTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxMTA6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAxMTQgPFtePl0qPiBub3AKKzArMDExOCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCitbIAldKjExODogUl9NSVBTX0xPMTYJLmJzcworMCswMTFjIDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKK1sgCV0qMTFjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxMjA6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMTI0IDxbXj5dKj4gbm9wCiswKzAxMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSoxMjg6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAxMmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoxMmM6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAxMzAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTMwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDEzOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKjEzODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxM2MgPFtePl0qPiBub3AKKzArMDE0MCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCiswKzAxNDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE0ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDE1MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKjE1MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE1NCA8W14+XSo+IG5vcAorMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKKzArMDE1YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCiswKzAxNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTYwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMTY4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qMTY4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTZjIDxbXj5dKj4gbm9wCiswKzAxNzAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorMCswMTc0IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKKzArMDE3OCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxNzg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE3YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDE4MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKjE4MDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTg0IDxbXj5dKj4gbm9wCiswKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorMCswMThjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKKzArMDE5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE5MDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE5NCA8W14+XSo+IG5vcAorMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMTk4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxOWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorWyAJXSoxOWM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDFhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjFhMDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDFhNCA8W14+XSo+IG5vcAorMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKK1sgCV0qMWE4OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxYWMgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQorWyAJXSoxYWM6IFJfTUlQU19MTzE2CS5ic3MKKzArMDFiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjFiMDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAxYjQgPFtePl0qPiBub3AKKzArMDFiOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFiYzogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDFjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjFjMDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDFjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMWNjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qMWNjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFkMCA8W14+XSo+IG5vcAorMCswMWQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMWQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDFkYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWUwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMWU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qMWU4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWVjIDxbXj5dKj4gbm9wCiswKzAxZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAxZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMWY4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDFmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAyMDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSoyMDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDggPFtePl0qPiBub3AKKzArMDIwYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDIxMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAyMTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjIxODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMjIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qMjIwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyMjQgPFtePl0qPiBub3AKKzArMDIyOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDIyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCiswKzAyMzAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQorMCswMjM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMjM0OiBSX01JUFNfR09UMTYJLmJzcworMCswMjM4IDxbXj5dKj4gbm9wCiswKzAyM2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyNDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyNDA6IFJfTUlQU19MTzE2CS5ic3MKKzArMDI0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKjI0NDogUl9NSVBTX0xPMTYJLmJzcworMCswMjQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMjQ4OiBSX01JUFNfR09UMTYJLmJzcworMCswMjRjIDxbXj5dKj4gbm9wCiswKzAyNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyNTQgPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQorWyAJXSoyNTQ6IFJfTUlQU19MTzE2CS5ic3MKKzArMDI1OCA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCitbIAldKjI1ODogUl9NSVBTX0xPMTYJLmJzcworMCswMjVjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMjVjOiBSX01JUFNfR09UMTYJLmRhdGEKKzArMDI2MCA8W14+XSo+IG5vcAorMCswMjY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMjY4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKK1sgCV0qMjY4OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMjZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMjZjOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI3MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAyNzggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSoyNzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjdjIDxbXj5dKj4gbm9wCiswKzAyODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyODQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorMCswMjg4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKKzArMDI4YyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyOGM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAyOTQgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSoyOTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOTggPFtePl0qPiBub3AKKzArMDI5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDJhMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCiswKzAyYTQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQorMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJhODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJhYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDJiMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKjJiMDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJiNCA8W14+XSo+IG5vcAorMCswMmI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmJjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKKzArMDJjMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCiswKzAyYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmM0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAyY2MgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSoyY2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJkMCA8W14+XSo+IG5vcAorMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKKzArMDJkYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCiswKzAyZTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoyZTA6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAyZTQgPFtePl0qPiBub3AKKzArMDJlOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDJlYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjJlYzogUl9NSVBTX0xPMTYJLmJzcworMCswMmYwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMmYwOiBSX01JUFNfTE8xNgkuYnNzCiswKzAyZjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoyZjQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAyZjggPFtePl0qPiBub3AKKzArMDJmYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDMwMCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCitbIAldKjMwMDogUl9NSVBTX0xPMTYJLmJzcworMCswMzA0IDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKK1sgCV0qMzA0OiBSX01JUFNfTE8xNgkuYnNzCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4OWNmMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQuZApAQCAtMCwwICsxLDYzOSBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNhczogLW1jcHU9cjQwMDAKKyNuYW1lOiBNSVBTIGxkCisKKyMgVGVzdCB0aGUgbGQgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKKzArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKKzArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKKzArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQorMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQorMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCiswKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKKzArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKKzArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKKzArMDAzYyA8W14+XSo+IG5vcAorMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKKzArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCiswKzAwNDggPFtePl0qPiBub3AKKzArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCiswKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQorMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCiswKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCiswKzAwNjQgPFtePl0qPiBub3AKKzArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKKzArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKKzArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKKzArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCiswKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKKzArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKKzArMDA5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwOTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwOTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKK1sgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKK1sgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBiOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCitbIAldKmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGMwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKK1sgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAwYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDBjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMGQwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGdwXCkKK1sgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKK1sgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBkYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBlMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBlNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQorWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQorWyAJXSpmNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGZjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTAwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCitbIAldKjEwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCitbIAldKjEwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoxMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkZ3BcKQorWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKK1sgCV0qMTFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDEyMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxMjQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTI4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDEyYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTMwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMzQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxM2MgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTQwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE0NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDE2MCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE2NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMTcwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTc4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDE3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxODAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxODQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTk0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTljIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFhMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDFiNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDFiOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMWMwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDFjNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMWNjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDFkMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxZDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjFkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFmNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyMDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyMDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMjE0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDIxOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMjIwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDIyNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjMwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI0OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyNGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyNWMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyNjAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMjY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDI2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDI3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDI3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI5MCA8W14+XSo+IG5vcAorMCswMjk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qMjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjI5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDJhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjJhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyYWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMmIwIDxbXj5dKj4gbm9wCiswKzAyYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSoyYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSoyYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMmM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMmNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMmQwIDxbXj5dKj4gbm9wCiswKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMmRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMmRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDJlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMmU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMmU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDJlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjJlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyZjAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAyZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzAwIDxbXj5dKj4gbm9wCiswKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAzMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQorWyAJXSozMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKK1sgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMzE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMzE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDMxYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzMjAgPFtePl0qPiBub3AKKzArMDMyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDMyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCitbIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCitbIAldKjMyYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDMzMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzMzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzM2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzNDAgPFtePl0qPiBub3AKKzArMDM0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDM0OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjM0ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzNGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMzUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDM1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM1OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzNWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMzYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzNjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjM2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzcwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjM3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzgwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDM4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDM4OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzOGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMzkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswMzk4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMzljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMzljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswM2EwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qM2EwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswM2E0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswM2E4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qM2E4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswM2FjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qM2FjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswM2IwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qM2IwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDNiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNiOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjNiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzYmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswM2MwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzYzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswM2NjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qM2NjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDNkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNkOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2RjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qM2RjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qM2UwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDNlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSozZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2YwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzAzZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswM2ZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qM2ZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDQwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo0MDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0MDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0MDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0MGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSo0MGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0MTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNDEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswNDE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNDFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNDIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjQyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA0MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0MjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNDJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDQzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzA0MzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0MzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswNDNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDQ0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQ0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNDQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKK1sgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0NGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSo0NGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQ1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQ1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0NTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0NTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQ2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQ2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA0NjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDQ3MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQ3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDQ3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQ3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjQ3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDQ3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjQ3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDQ4MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQ4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDQ4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDQ4OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDQ4YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjQ4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDQ5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQ5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA0OTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0OTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNDljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNDljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDRhMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzA0YTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0YTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswNGFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNGFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDRiMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNGI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNGI4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNGI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0YmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQorWyAJXSo0YmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDRjMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0YzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0YzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNGNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNGNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDRkMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA0ZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA0ZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0ZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNGRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNGRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDRlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDRlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDRlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjRlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDRmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDRmNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDRmOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjRmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDRmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjRmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDUwMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjUwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA1MDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0CiswKzA1MDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo1MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNTBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNTBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQorMCswNTE0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkemVyb1wpCiswKzA1MTggPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKKzArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQorMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzA1MjQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKKzArMDUyOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQorMCswNTJjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKKzArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCiswKzA1MzQgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCRhMVwpCiswKzA1MzggPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCRhMVwpCiswKzA1M2MgPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCRhMVwpCiswKzA1NDAgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCRhMVwpCiswKzA1NDQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDU0OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKKzArMDU0YyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQorMCswNTUwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCiswKzA1NTQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKKzArMDU1OCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQorMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNTY0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQorWyAJXSo1NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA1NjggPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRhdFwpCitbIAldKjU2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDU2YyA8W14+XSo+IG5vcAorMCswNTcwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkemVyb1wpCiswKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKKzArMDU3OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQorMCswNTdjIDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkemVyb1wpCiswKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDU4NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQorMCswNTg4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCiswKzA1OGMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQorMCswNTkwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKKzArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJGExXCkKKzArMDU5OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJGExXCkKKzArMDU5YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJGExXCkKKzArMDVhMCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJGExXCkKKzArMDVhNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswNWE4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNWFjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCiswKzA1YjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKKzArMDViNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQorMCswNWI4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCiswKzA1YmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNWMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAorMCswNWM0IDxbXj5dKj4gc3djMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQorWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNWM4IDxbXj5dKj4gc3djMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQorWyAJXSo1Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNWNjIDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQorMCswNWQwIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQorMCswNWQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKK1sgCV0qNWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswNWQ4IDxbXj5dKj4gZGFkZHUJXCRhMCxcJGEwLFwkYTEKKzArMDVkYyA8W14+XSo+IGxkCVwkYTAsWy0wLTldK1woXCRhMFwpCitbIAldKjVkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDVlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjVlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA1ZTQgPFtePl0qPiBkYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswNWU4IDxbXj5dKj4gc2QJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qNWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDVlYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWUzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLnMKQEAgLTAsMCArMSwxNDQgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsZCBtYWNyby4KKwkKKwkuc2V0CW1pcHMxCisKKwkuZGF0YQorZGF0YV9sYWJlbDoKKwkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKKwkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQorCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAorCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCisJLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAorCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQorCQorCS50ZXh0CisJbGQJJDQsMAorCWxkCSQ0LDEKKwlsZAkkNCwweDgwMDAKKwlsZAkkNCwtMHg4MDAwCisJbGQJJDQsMHgxMDAwMAorCWxkCSQ0LDB4MWE1YTUKKwlsZAkkNCwwKCQ1KQorCWxkCSQ0LDEoJDUpCisJbGQJJDQsMHg4MDAwKCQ1KQorCWxkCSQ0LC0weDgwMDAoJDUpCisJbGQJJDQsMHgxMDAwMCgkNSkKKwlsZAkkNCwweDFhNWE1KCQ1KQorCWxkCSQ0LGRhdGFfbGFiZWwKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCisJbGQJJDQsYmlnX2xvY2FsX2NvbW1vbgorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCWxkCSQ0LGRhdGFfbGFiZWwrMQorCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCisJbGQJJDQsZGF0YV9sYWJlbCsweDgwMDAKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAorCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCisJbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAorCWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCisJbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKKwlsZAkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKKwlsZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKKwlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAorCWxkCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQorCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1CisJbGQJJDQsZGF0YV9sYWJlbCgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQorCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCisJbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQorCWxkCSQ0LGRhdGFfbGFiZWwrMSgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCisJbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCisJbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQorCWxkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQorCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKKwlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQorCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCisJbGQJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCisJbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQorCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCisJbGQJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCisJbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKKwlsZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCisJbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCisJbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKKwlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKKwlsZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCisJbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKKwlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCisJbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQorCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQorCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKKwlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKKworIyBsLmQgYW5kIHMuZCBhcmUgc29ydCBvZiBsaWtlIGxkLgorCWwuZAkkZjQsMAorCWwuZAkkZjQsMQorCWwuZAkkZjQsMHg4MDAwCisJbC5kCSRmNCwtMHg4MDAwCisJbC5kCSRmNCwwKCQ1KQorCWwuZAkkZjQsMSgkNSkKKwlsLmQJJGY0LDB4ODAwMCgkNSkKKwlsLmQJJGY0LC0weDgwMDAoJDUpCisJbC5kCSRmNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKKwkjIExpdHRsZSBlbmRpYW4gd2lsbCBpbnNlcnQgYSBub3AgaGVyZS4KKwkjIFdlIHB1dCBpdCBpbiBleHBsaWNpdGx5IHNvIHRoYXQgYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGFyZSBzaW1pbGFyLgorCW5vcAorCXMuZAkkZjQsMAorCXMuZAkkZjQsMQorCXMuZAkkZjQsMHg4MDAwCisJcy5kCSRmNCwtMHg4MDAwCisJcy5kCSRmNCwwKCQ1KQorCXMuZAkkZjQsMSgkNSkKKwlzLmQJJGY0LDB4ODAwMCgkNSkKKwlzLmQJJGY0LC0weDgwMDAoJDUpCisJcy5kCSRmNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCisKKyMgc2QgaXMgaGFuZGxlZCBsaWtlIGxkLiAgU2FuaXR5IGNoZWNrIGl0LgorCXNkCSQ0LDAKKworIyBTYW5pdHkgY2hlY2sgdGhlIC1taXBzMyB2ZXJzaW9ucworCS5zZXQJbWlwczMKKwlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCisJc2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlMmIyMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZApAQCAtMCwwICsxLDE2IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgbGkKKworIyBUZXN0IHRoZSBsaSBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCiswKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKKzArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCiswKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAorMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCiswKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKKzArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1CiswKzAwMWMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzNhNjAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5zCkBAIC0wLDAgKzEsMTIgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsaSBtYWNyby4KKworZm9vOgorCWxpCSQ0LDAKKwlsaQkkNCwxCisJbGkJJDQsMHg4MDAwCisJbGkJJDQsLTB4ODAwMAorCWxpCSQ0LDB4MTAwMDAKKwlsaQkkNCwweDFhNWE1CisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODBkY2EzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZApAQCAtMCwwICsxLDI0IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgbGlmbG9hdC1lbXBpYworI2FzOiAtbWlwczEgLW1lbWJlZGRlZC1waWMgLS1kZWZzeW0gRU1QSUM9MQorI3NvdXJjZTogbGlmbG9hdC5zCisKKyMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3Mgd2l0aCAtbWVtYmVkZGVkLXBpYy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4NAorWyAJXSowOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5yZGF0YS4qCiswKzAwMDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQorMCswMDA4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKKzArMDAwYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMTYzNjhcKFwkZ3BcKQorWyAJXSpjOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgorMCswMDEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0xNjM2NFwoXCRncFwpCitbIAldKjEwOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgorMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCiswKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgorMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCiswKzAwMjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgorMCswMDI0IDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXN2cjRwaWMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA5YTdmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kCkBAIC0wLDAgKzEsMzAgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsaWZsb2F0LXN2cjRwaWMKKyNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC1FQiAtLWRlZnN5bSBTVlI0PTEKKyNzb3VyY2U6IGxpZmxvYXQucworCisjIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCiswKzAwMDQgPFtePl0qPiBub3AKKzArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKKzArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKKzArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQorMCswMDE0IDxbXj5dKj4gbm9wCiswKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCitbIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCiswKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQorWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQorMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCiswKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgorMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCiswKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgorMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg2ZTJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYteGdvdC5kCkBAIC0wLDAgKzEsMzAgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsaWZsb2F0LXhnb3QKKyNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290IC1FQiAtLWRlZnN5bSBYR09UPTEKKyNzb3VyY2U6IGxpZmxvYXQucworCisjIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMgLXhnb3QuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCiswKzAwMDQgPFtePl0qPiBub3AKKzArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCitbIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKKzArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCitbIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKKzArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQorMCswMDE0IDxbXj5dKj4gbm9wCiswKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCitbIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCiswKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQorWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQorMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCiswKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgorMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCiswKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgorMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxYjU1NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kCkBAIC0wLDAgKzEsMjMgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyBsaWZsb2F0CisjYXM6IC1taXBzMQorCisjIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkucm8/ZGF0YS4qCiswKzAwMDQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ybz9kYXRhLioKKzArMDAwOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCitbIAldKjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnJvP2RhdGEuKgorMCswMDBjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkZ3BcKQorWyAJXSpjOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDguKgorMCswMDEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkZ3BcKQorWyAJXSoxMDogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKKzArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgorMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKKzArMDAxYyA8W14+XSo+IGx3YzEJXCRmNCxbLTAtOV0rXChcJGdwXCkKK1sgCV0qMWM6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0NC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzdmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucwpAQCAtMCwwICsxLDI0IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3MuCisJCitmb286CQorCWxpLmQJJDQsMS4xMjM0NQorCWxpLmQJJGY0LDEuMTIzNDUKKwkKKwlsaS5zCSQ0LDEuMTIzNDUKKwlsaS5zCSRmNCwxLjEyMzQ1CisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJLmlmZGVmCVNWUjQKKwlub3AKKwlub3AKKwlub3AKKwkuZW5kaWYKKwkuaWZkZWYJWEdPVAorCW5vcAorCW5vcAorCW5vcAorCS5lbmRpZgorCS5pZmRlZglFTVBJQworCW5vcAorCW5vcAorCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNDBmNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLmQKQEAgLTAsMCArMSw5NyBAQAorI29iamR1bXA6IC1kIC1sIC1tbWlwczo0MDAwCisjbmFtZTogYXNzZW1ibHkgbGluZSBudW1iZXJzCisjYXM6IC1nIC1tY3B1PXI0MDAwCisKKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKKzArMDAwMCA8bWFpbi0weDEwPjoKKy4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgorLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCisuKlswLTlhLWZdKzouKmRlYWRiZWVmLioKKy4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgorCiswKzAwMTAgPG1haW4+OgorbWFpblwoXCk6CisuKmxpbmVuby5zOjE2CisuKjEwOi4qYWRkaXUuKgorLipsaW5lbm8uczoxNworLioxNDouKnNkLioKKy4qbGluZW5vLnM6MTgKKy4qMTg6LipzZC4qCisuKmxpbmVuby5zOjE5CisuKjFjOi4qbW92ZS4qCisuKmxpbmVuby5zOjIwCisuKjIwOi4qamFsLioKKy4qMjQ6Lipub3AKKy4qbGluZW5vLnM6MjEKKy4qMjg6LipsaS4qCisuKmxpbmVuby5zOjIyCisuKjJjOi4qc3cuKgorLipsaW5lbm8uczoyMworLiozMDouKmx3LioKKy4qbGluZW5vLnM6MjQKKy4qMzQ6Liptb3ZlLioKKy4qbGluZW5vLnM6MjUKKy4qMzg6LipzbGwuKgorLipsaW5lbm8uczoyNgorLiozYzouKmFkZHUuKgorLipsaW5lbm8uczoyNworLio0MDouKnN3LioKKy4qbGluZW5vLnM6MjgKKy4qNDQ6Lipsdy4qCisuKmxpbmVuby5zOjI5CisuKjQ4Oi4qamFsLioKKy4qNGM6Lipub3AKKy4qbGluZW5vLnM6MzAKKy4qNTA6Lipsdy4qCisuKmxpbmVuby5zOjMxCisuKjU0Oi4qbW92ZS4qCisuKmxpbmVuby5zOjMyCisuKjU4Oi4qYi4qCisuKjVjOi4qbm9wCisKKzAwMDAwMDAwMDAwMDAwNjAgPFwkTDE+OgorLipsaW5lbm8uczozNAorLio2MDouKm1vdmUuKgorLipsaW5lbm8uczozNQorLio2NDouKmxkLioKKy4qbGluZW5vLnM6MzYKKy4qNjg6LipsZC4qCisuKmxpbmVuby5zOjM3CisuKjZjOi4qYWRkaXUuKgorLipsaW5lbm8uczozOAorLio3MDouKmpyLioKKy4qNzQ6Lipub3AKKworMDAwMDAwMDAwMDAwMDA3OCA8Zz46CitnXChcKToKKy4qbGluZW5vLnM6NDcKKy4qNzg6LiphZGRpdS4qCisuKmxpbmVuby5zOjQ4CisuKjdjOi4qc2QuKgorLipsaW5lbm8uczo0OQorLio4MDouKm1vdmUuKgorLipsaW5lbm8uczo1MAorLio4NDouKnN3LioKKy4qbGluZW5vLnM6NTEKKy4qODg6Lipsdy4qCisuKmxpbmVuby5zOjUyCisuKjhjOi4qYWRkaXUuKgorLipsaW5lbm8uczo1MworLio5MDouKm1vdmUuKgorLipsaW5lbm8uczo1NAorLio5NDouKmIuKgorLio5ODouKm5vcAorCiswMDAwMDAwMDAwMDAwMDljIDxcJEwyPjoKKy4qbGluZW5vLnM6NTYKKy4qOWM6Liptb3ZlLioKKy4qbGluZW5vLnM6NTcKKy4qYTA6LipsZC4qCisuKmxpbmVuby5zOjU4CisuKmE0Oi4qYWRkaXUuKgorLipsaW5lbm8uczo1OQorLiphODouKmpyLioKKy4qYWM6Lipub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWYzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCkBAIC0wLDAgKzEsNjAgQEAKKwkudGV4dAorCisjIHNvbWUgZGF0YQorCS53b3JkCTB4ZGVhZGJlZWYKKwkud29yZAkweGRlYWRiZWVmCisJLndvcmQJMHhkZWFkYmVlZgorCS53b3JkCTB4ZGVhZGJlZWYKKworIyBzb21lIHJlYWwgY29kZSwgY29tcGlsZWQgZnJvbSBhIHRveSBDIHByb2dyYW0KKwkgICAgICAgIC5nbG9ibCAgbWFpbgorICAgICAgICAuZW50ICAgIG1haW4KK21haW46CisgICAgICAgIC5mcmFtZSAgJGZwLDMyLCQzMSAgICAgICAgICAgICAgIyB2YXJzPSAxNiwgcmVncz0gMi8wLCBhcmdzPSAwLCBleHRyYT0gMAorICAgICAgICAubWFzayAgIDB4YzAwMDAwMDAsLTgKKyAgICAgICAgLmZtYXNrICAweDAwMDAwMDAwLDAKKyAgICAgICAgc3VidSAgICAkc3AsJHNwLDMyCisgICAgICAgIHNkICAgICAgJDMxLDI0KCRzcCkKKyAgICAgICAgc2QgICAgICAkZnAsMTYoJHNwKQorICAgICAgICBtb3ZlICAgICRmcCwkc3AKKyAgICAgICAgamFsICAgICBfX21haW4KKyAgICAgICAgbGkgICAgICAkMiwyICAgICAgICAgICAgICAgICAgICAjIDB4MgorICAgICAgICBzdyAgICAgICQyLDAoJGZwKQorICAgICAgICBsdyAgICAgICQyLDAoJGZwKQorICAgICAgICBtb3ZlICAgICQzLCQyCisgICAgICAgIHNsbCAgICAgJDQsJDMsMQorICAgICAgICBhZGR1ICAgICQyLCQ0LCQyCisgICAgICAgIHN3ICAgICAgJDIsNCgkZnApCisgICAgICAgIGx3ICAgICAgJDQsNCgkZnApCisgICAgICAgIGphbCAgICAgZworICAgICAgICBsdyAgICAgICQzLDAoJGZwKQorICAgICAgICBtb3ZlICAgICQyLCQzCisgICAgICAgIGIgICAgICAgJEwxCiskTDE6CisgICAgICAgIG1vdmUgICAgJHNwLCRmcAorICAgICAgICBsZCAgICAgICQzMSwyNCgkc3ApCisgICAgICAgIGxkICAgICAgJGZwLDE2KCRzcCkKKyAgICAgICAgYWRkdSAgICAkc3AsJHNwLDMyCisgICAgICAgIGogICAgICAgJDMxCisgICAgICAgIC5lbmQgICAgbWFpbgorICAgICAgICAuYWxpZ24gIDIKKyAgICAgICAgLmdsb2JsICBnCisgICAgICAgIC5lbnQgICAgZworZzoKKyAgICAgICAgLmZyYW1lICAkZnAsMzIsJDMxICAgICAgICAgICAgICAjIHZhcnM9IDE2LCByZWdzPSAxLzAsIGFyZ3M9IDAsIGV4dHJhPSAwCisgICAgICAgIC5tYXNrICAgMHg0MDAwMDAwMCwtMTYKKyAgICAgICAgLmZtYXNrICAweDAwMDAwMDAwLDAKKyAgICAgICAgc3VidSAgICAkc3AsJHNwLDMyCisgICAgICAgIHNkICAgICAgJGZwLDE2KCRzcCkKKyAgICAgICAgbW92ZSAgICAkZnAsJHNwCisgICAgICAgIHN3ICAgICAgJDQsMCgkZnApCisgICAgICAgIGx3ICAgICAgJDIsMCgkZnApCisgICAgICAgIGFkZHUgICAgJDMsJDIsMQorICAgICAgICBtb3ZlICAgICQyLCQzCisgICAgICAgIGIgICAgICAgJEwyCiskTDI6CisgICAgICAgIG1vdmUgICAgJHNwLCRmcAorICAgICAgICBsZCAgICAgICRmcCwxNigkc3ApCisgICAgICAgIGFkZHUgICAgJHNwLCRzcCwzMgorICAgICAgICBqICAgICAgICQzMQorICAgICAgICAuZW5kICAgIGcKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTI2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwCkBAIC0wLDAgKzEsMTAyIEBACisjCisjIFNvbWUgZ2VuZXJpYyBNSVBTIHRlc3RzCisjCitpZiBbaXN0YXJnZXQgbWlwcyotKi0qXSB0aGVuIHsKKyAgICBzZXQgbm9fbWlwczE2IDAKKyAgICBzZXQgc3ZyNHBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVsZipdIHx8IFtpc3RhcmdldCAqLSotaXJpeDUqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg2KiBdIF0KKyAgICBzZXQgZW1waWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lY29mZipdIHx8IFtpc3RhcmdldCAqLSotdWx0cml4Kl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4XFsxLTRcXSpdIF0KKyAgICBzZXQgYW91dCBbZXhwciBbaXN0YXJnZXQgKi0qLWJzZCpdIHx8IFtpc3RhcmdldCAqLSotbmV0YnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1vcGVuYnNkKl1dCisgICAgc2V0IGlsb2NrcyBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl0KKyAgICBzZXQgZ3ByX2lsb2NrcyBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCisgICAgc2V0IGFkZHIzMiBbZXhwciBbaXN0YXJnZXQgbWlwc3R4MzkqLSotKl1dCisKKworCisKKworICAgIHJ1bl9kdW1wX3Rlc3QgImFicyIKKyAgICBydW5fZHVtcF90ZXN0ICJhZGQiCisgICAgcnVuX2R1bXBfdGVzdCAiYW5kIgorICAgIHJ1bl9kdW1wX3Rlc3QgImJyZWFrMjAiCisgICAgcnVuX2R1bXBfdGVzdCAidHJhcDIwIgorICAgIHJ1bl9kdW1wX3Rlc3QgImJlcSIKKyAgICBydW5fZHVtcF90ZXN0ICJiZ2UiCisgICAgcnVuX2R1bXBfdGVzdCAiYmdldSIKKyAgICBydW5fZHVtcF90ZXN0ICJibHQiCisgICAgcnVuX2R1bXBfdGVzdCAiYmx0dSIKKyAgICBpZiAhJGlsb2NrcyB7IHJ1bl9kdW1wX3Rlc3QgImRpdiIgfSBlbHNlIHsgcnVuX2R1bXBfdGVzdCAiZGl2LWlsb2NrcyIgfQorICAgIHJ1bl9kdW1wX3Rlc3QgImRsaSIKKyAgICBydW5fZHVtcF90ZXN0ICJqYWwiCisgICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtc3ZyNHBpYyIgfQorICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAiamFsLXhnb3QiIH0KKyAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJqYWwtZW1waWMiIH0KKyAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsYSIgfQorICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEtc3ZyNHBpYyIgfQorICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGEteGdvdCIgfQorICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxhLWVtcGljIiB9CisgICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGIiIH0KKyAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxiLXN2cjRwaWMiIH0KKyAgICBpZiAkc3ZyNHBpYyB7CisJIyBCb3RoIHZlcnNpb25zIHNwZWNpZnkgdGhlIGNwdSwgc28gd2UgY2FuIHJ1biBib3RoIHJlZ2FyZGxlc3Mgb2YKKwkjIHRoZSBpbnRlcmxvY2tpbmcgaW4gdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdCBjcHUuCisJcnVuX2R1bXBfdGVzdCAibGIteGdvdCIKKwlydW5fZHVtcF90ZXN0ICJsYi14Z290LWlsb2NrcyIKKyAgICB9CisgICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGItZW1waWMiIH0KKyAgICBpZiAhJGFvdXQgeyAKKyAgICAgICAgaWYgISRncHJfaWxvY2tzIHsgCisgICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZCIgCisgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgaWYgISRhZGRyMzIgeworICAgICAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkLWlsb2NrcyIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQtaWxvY2tzLWFkZHIzMiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXN2cjRwaWMiIH0KKyAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLXhnb3QiIH0KKyAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsZC1lbXBpYyIgfQorICAgIHJ1bl9kdW1wX3Rlc3QgImxpIgorICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxpZmxvYXQiIH0KKyAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1zdnI0cGljIiB9CisgICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsaWYteGdvdCIgfQorICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi1lbXBpYyIgfQorICAgIHJ1bl9kdW1wX3Rlc3QgIm1pcHM0IgorICAgIGlmICEkaWxvY2tzIHsgcnVuX2R1bXBfdGVzdCAibXVsIiB9IGVsc2UgeyBydW5fZHVtcF90ZXN0ICJtdWwtaWxvY2tzIiB9CisgICAgcnVuX2R1bXBfdGVzdCAicm9sIgorICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgInNiIiB9CisgICAgcnVuX2R1bXBfdGVzdCAidHJ1bmMiCisgICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAidWxoIiB9CisgICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtc3ZyNHBpYyIgfQorICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAidWxoLXhnb3QiIH0KKyAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgtZW1waWMiIH0KKyAgICBpZiAhJGFvdXQgeworCXJ1bl9kdW1wX3Rlc3QgInVsdyIKKwlydW5fZHVtcF90ZXN0ICJ1bGQiCisJcnVuX2R1bXBfdGVzdCAidXNoIgorCXJ1bl9kdW1wX3Rlc3QgInVzdyIKKwlydW5fZHVtcF90ZXN0ICJ1c2QiCisgICAgfQorICAgICMgVGhlIG1pcHMxNiB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBFTEYsIGJlY2F1c2Ugb25seSBFTEYKKyAgICAjIHN1cHBvcnRzIHRoZSBuZWNlc3NhcnkgbWlwczE2IHJlbG9jLgorICAgIGlmIHsgJHN2cjRwaWMgJiYgISRub19taXBzMTYgfSB7IHJ1bl9kdW1wX3Rlc3QgIm1pcHMxNiIgfQorICAgIHJ1bl9kdW1wX3Rlc3QgImRlbGF5IgorICAgIHJ1bl9kdW1wX3Rlc3QgIm5vZGVsYXkiCisgICAgcnVuX2R1bXBfdGVzdCAibWlwczQwMTAiCisgICAgcnVuX2R1bXBfdGVzdCAibWlwczQ2NTAiCisgICAgcnVuX2R1bXBfdGVzdCAibWlwczQxMDAiCisgICAgcnVuX2R1bXBfdGVzdCAibGluZW5vIgorICAgIHJ1bl9kdW1wX3Rlc3QgInN5bmMiCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IC1tY3B1PUZPTyBhbmQgLW1GT08gYXJlIGVxdWl2YWxlbnQuICBBc3NlbWJsZSBhIGZpbGUKKyAgICAjIGNvbnRhaW5pbmcgNDY1MC1zcGVjaWZpYyBpbnN0cnVjdGlvbnMgd2l0aCAtbTQ2NTAgYW5kIC1tY3B1PTQ2NTAsCisgICAgIyBhbmQgdmVyaWZ5IHRoYXQgdGhleSdyZSB0aGUgc2FtZS4gIFNwZWNpZmljYWxseSwgd2UncmUgY2hlY2tpbmcKKyAgICAjIHRoYXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZCBpcyBzZXQsIGFuZCB0aGF0IHRoZSA0NjUwICdtdWwnCisgICAgIyBpbnN0cnVjdGlvbiBkb2VzIGdldCB1c2VkLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgR0FTLCAKKyAgICAjIG9ubHkgLW1jcHU9NDY1MCB3b3VsZCBzZXQgdGhlIEVGX01JUFNfTUFDSCBmaWVsZDsgLW00NjUwIHdvdWxkbid0LgorICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMSIKKyAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczIiCisgICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MzIgorICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzNCIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzFhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5kCkBAIC0wLDAgKzEsNjgzIEBACisjb2JqZHVtcDogLWRyIC1tbWlwczo0MDAwCisjYXM6IC1taXBzMyAtbWNwdT1yNDAwMAorI25hbWU6IG1pcHMxNgorCisjIFRlc3QgdGhlIG1pcHMxNiBpbnN0cnVjdGlvbiBzZXQuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCswMDAwMDAgPGRhdGExPjoKKyAgIDA6CTAwMDAwMDAwIAlub3AKKworMCswMDAwMDQgPGluc25zMT46CisgICA0OgkzYjQwICAgICAgCWxkCVwkdjAsMFwoXCR2MVwpCisgICA2OglmMDAwIDNiNDEgCWxkCVwkdjAsMVwoXCR2MVwpCisgICBhOglmMDAwIDNiNDIgCWxkCVwkdjAsMlwoXCR2MVwpCisgICBlOglmMDAwIDNiNDMgCWxkCVwkdjAsM1woXCR2MVwpCisgIDEyOglmMDAwIDNiNDQgCWxkCVwkdjAsNFwoXCR2MVwpCisgIDE2OgkzYjQxICAgICAgCWxkCVwkdjAsOFwoXCR2MVwpCisgIDE4OgkzYjQyICAgICAgCWxkCVwkdjAsMTZcKFwkdjFcKQorICAxYToJM2I0NCAgICAgIAlsZAlcJHYwLDMyXChcJHYxXCkKKyAgMWM6CTNiNDggICAgICAJbGQJXCR2MCw2NFwoXCR2MVwpCisgIDFlOgkzYjUwICAgICAgCWxkCVwkdjAsMTI4XChcJHYxXCkKKyAgMjA6CWYxMDAgM2I0MCAJbGQJXCR2MCwyNTZcKFwkdjFcKQorICAyNDoJZjIwMCAzYjQwIAlsZAlcJHYwLDUxMlwoXCR2MVwpCisgIDI4OglmNDAwIDNiNDAgCWxkCVwkdjAsMTAyNFwoXCR2MVwpCisgIDJjOglmMDAxIDNiNDAgCWxkCVwkdjAsMjA0OFwoXCR2MVwpCisgIDMwOglmN2ZmIDNiNWYgCWxkCVwkdjAsLTFcKFwkdjFcKQorICAzNDoJZjdmZiAzYjVlIAlsZAlcJHYwLC0yXChcJHYxXCkKKyAgMzg6CWY3ZmYgM2I1ZCAJbGQJXCR2MCwtM1woXCR2MVwpCisgIDNjOglmN2ZmIDNiNWMgCWxkCVwkdjAsLTRcKFwkdjFcKQorICA0MDoJZjdmZiAzYjU4IAlsZAlcJHYwLC04XChcJHYxXCkKKyAgNDQ6CWY3ZmYgM2I1MCAJbGQJXCR2MCwtMTZcKFwkdjFcKQorICA0ODoJZjdmZiAzYjQwIAlsZAlcJHYwLC0zMlwoXCR2MVwpCisgIDRjOglmN2RmIDNiNDAgCWxkCVwkdjAsLTY0XChcJHYxXCkKKyAgNTA6CWY3OWYgM2I0MCAJbGQJXCR2MCwtMTI4XChcJHYxXCkKKyAgNTQ6CWY3MWYgM2I0MCAJbGQJXCR2MCwtMjU2XChcJHYxXCkKKyAgNTg6CWY2MWYgM2I0MCAJbGQJXCR2MCwtNTEyXChcJHYxXCkKKyAgNWM6CWY0MWYgM2I0MCAJbGQJXCR2MCwtMTAyNFwoXCR2MVwpCisgIDYwOglmMDFmIDNiNDAgCWxkCVwkdjAsLTIwNDhcKFwkdjFcKQorICA2NDoJZjdiZiBmYzQwIAlsZAlcJHYwLDAgPGRhdGExPgorICA2ODoJZjZhMCBmYzU0IAlsZAlcJHYwLDcxYyA8ZGF0YTI+CisgIDZjOglmMDAxIGZjNDAgCWxkCVwkdjAsODY4IDxiYXI+CisgIDcwOglmMGMxIGZjNDAgCWxkCVwkdjAsOTMwIDxxdXV4PgorICA3NDoJZjg0MCAgICAgIAlsZAlcJHYwLDBcKFwkc3BcKQorICA3NjoJZjAwMCBmODQxIAlsZAlcJHYwLDFcKFwkc3BcKQorICA3YToJZjAwMCBmODQyIAlsZAlcJHYwLDJcKFwkc3BcKQorICA3ZToJZjAwMCBmODQzIAlsZAlcJHYwLDNcKFwkc3BcKQorICA4MjoJZjAwMCBmODQ0IAlsZAlcJHYwLDRcKFwkc3BcKQorICA4NjoJZjg0MSAgICAgIAlsZAlcJHYwLDhcKFwkc3BcKQorICA4ODoJZjg0MiAgICAgIAlsZAlcJHYwLDE2XChcJHNwXCkKKyAgOGE6CWY4NDQgICAgICAJbGQJXCR2MCwzMlwoXCRzcFwpCisgIDhjOglmODQ4ICAgICAgCWxkCVwkdjAsNjRcKFwkc3BcKQorICA4ZToJZjg1MCAgICAgIAlsZAlcJHYwLDEyOFwoXCRzcFwpCisgIDkwOglmMTAwIGY4NDAgCWxkCVwkdjAsMjU2XChcJHNwXCkKKyAgOTQ6CWYyMDAgZjg0MCAJbGQJXCR2MCw1MTJcKFwkc3BcKQorICA5ODoJZjQwMCBmODQwIAlsZAlcJHYwLDEwMjRcKFwkc3BcKQorICA5YzoJZjAwMSBmODQwIAlsZAlcJHYwLDIwNDhcKFwkc3BcKQorICBhMDoJZjdmZiBmODVmIAlsZAlcJHYwLC0xXChcJHNwXCkKKyAgYTQ6CWY3ZmYgZjg1ZSAJbGQJXCR2MCwtMlwoXCRzcFwpCisgIGE4OglmN2ZmIGY4NWQgCWxkCVwkdjAsLTNcKFwkc3BcKQorICBhYzoJZjdmZiBmODVjIAlsZAlcJHYwLC00XChcJHNwXCkKKyAgYjA6CWY3ZmYgZjg1OCAJbGQJXCR2MCwtOFwoXCRzcFwpCisgIGI0OglmN2ZmIGY4NTAgCWxkCVwkdjAsLTE2XChcJHNwXCkKKyAgYjg6CWY3ZmYgZjg0MCAJbGQJXCR2MCwtMzJcKFwkc3BcKQorICBiYzoJZjdkZiBmODQwIAlsZAlcJHYwLC02NFwoXCRzcFwpCisgIGMwOglmNzlmIGY4NDAgCWxkCVwkdjAsLTEyOFwoXCRzcFwpCisgIGM0OglmNzFmIGY4NDAgCWxkCVwkdjAsLTI1NlwoXCRzcFwpCisgIGM4OglmNjFmIGY4NDAgCWxkCVwkdjAsLTUxMlwoXCRzcFwpCisgIGNjOglmNDFmIGY4NDAgCWxkCVwkdjAsLTEwMjRcKFwkc3BcKQorICBkMDoJZjAxZiBmODQwIAlsZAlcJHYwLC0yMDQ4XChcJHNwXCkKKyAgZDQ6CWJiNDAgICAgICAJbHd1CVwkdjAsMFwoXCR2MVwpCisgIGQ2OglmMDAwIGJiNDEgCWx3dQlcJHYwLDFcKFwkdjFcKQorICBkYToJZjAwMCBiYjQyIAlsd3UJXCR2MCwyXChcJHYxXCkKKyAgZGU6CWYwMDAgYmI0MyAJbHd1CVwkdjAsM1woXCR2MVwpCisgIGUyOgliYjQxICAgICAgCWx3dQlcJHYwLDRcKFwkdjFcKQorICBlNDoJYmI0MiAgICAgIAlsd3UJXCR2MCw4XChcJHYxXCkKKyAgZTY6CWJiNDQgICAgICAJbHd1CVwkdjAsMTZcKFwkdjFcKQorICBlODoJYmI0OCAgICAgIAlsd3UJXCR2MCwzMlwoXCR2MVwpCisgIGVhOgliYjUwICAgICAgCWx3dQlcJHYwLDY0XChcJHYxXCkKKyAgZWM6CWYwODAgYmI0MCAJbHd1CVwkdjAsMTI4XChcJHYxXCkKKyAgZjA6CWYxMDAgYmI0MCAJbHd1CVwkdjAsMjU2XChcJHYxXCkKKyAgZjQ6CWYyMDAgYmI0MCAJbHd1CVwkdjAsNTEyXChcJHYxXCkKKyAgZjg6CWY0MDAgYmI0MCAJbHd1CVwkdjAsMTAyNFwoXCR2MVwpCisgIGZjOglmMDAxIGJiNDAgCWx3dQlcJHYwLDIwNDhcKFwkdjFcKQorIDEwMDoJZjdmZiBiYjVmIAlsd3UJXCR2MCwtMVwoXCR2MVwpCisgMTA0OglmN2ZmIGJiNWUgCWx3dQlcJHYwLC0yXChcJHYxXCkKKyAxMDg6CWY3ZmYgYmI1ZCAJbHd1CVwkdjAsLTNcKFwkdjFcKQorIDEwYzoJZjdmZiBiYjVjIAlsd3UJXCR2MCwtNFwoXCR2MVwpCisgMTEwOglmN2ZmIGJiNTggCWx3dQlcJHYwLC04XChcJHYxXCkKKyAxMTQ6CWY3ZmYgYmI1MCAJbHd1CVwkdjAsLTE2XChcJHYxXCkKKyAxMTg6CWY3ZmYgYmI0MCAJbHd1CVwkdjAsLTMyXChcJHYxXCkKKyAxMWM6CWY3ZGYgYmI0MCAJbHd1CVwkdjAsLTY0XChcJHYxXCkKKyAxMjA6CWY3OWYgYmI0MCAJbHd1CVwkdjAsLTEyOFwoXCR2MVwpCisgMTI0OglmNzFmIGJiNDAgCWx3dQlcJHYwLC0yNTZcKFwkdjFcKQorIDEyODoJZjYxZiBiYjQwIAlsd3UJXCR2MCwtNTEyXChcJHYxXCkKKyAxMmM6CWY0MWYgYmI0MCAJbHd1CVwkdjAsLTEwMjRcKFwkdjFcKQorIDEzMDoJZjAxZiBiYjQwIAlsd3UJXCR2MCwtMjA0OFwoXCR2MVwpCisgMTM0Ogk5YjQwICAgICAgCWx3CVwkdjAsMFwoXCR2MVwpCisgMTM2OglmMDAwIDliNDEgCWx3CVwkdjAsMVwoXCR2MVwpCisgMTNhOglmMDAwIDliNDIgCWx3CVwkdjAsMlwoXCR2MVwpCisgMTNlOglmMDAwIDliNDMgCWx3CVwkdjAsM1woXCR2MVwpCisgMTQyOgk5YjQxICAgICAgCWx3CVwkdjAsNFwoXCR2MVwpCisgMTQ0Ogk5YjQyICAgICAgCWx3CVwkdjAsOFwoXCR2MVwpCisgMTQ2Ogk5YjQ0ICAgICAgCWx3CVwkdjAsMTZcKFwkdjFcKQorIDE0ODoJOWI0OCAgICAgIAlsdwlcJHYwLDMyXChcJHYxXCkKKyAxNGE6CTliNTAgICAgICAJbHcJXCR2MCw2NFwoXCR2MVwpCisgMTRjOglmMDgwIDliNDAgCWx3CVwkdjAsMTI4XChcJHYxXCkKKyAxNTA6CWYxMDAgOWI0MCAJbHcJXCR2MCwyNTZcKFwkdjFcKQorIDE1NDoJZjIwMCA5YjQwIAlsdwlcJHYwLDUxMlwoXCR2MVwpCisgMTU4OglmNDAwIDliNDAgCWx3CVwkdjAsMTAyNFwoXCR2MVwpCisgMTVjOglmMDAxIDliNDAgCWx3CVwkdjAsMjA0OFwoXCR2MVwpCisgMTYwOglmN2ZmIDliNWYgCWx3CVwkdjAsLTFcKFwkdjFcKQorIDE2NDoJZjdmZiA5YjVlIAlsdwlcJHYwLC0yXChcJHYxXCkKKyAxNjg6CWY3ZmYgOWI1ZCAJbHcJXCR2MCwtM1woXCR2MVwpCisgMTZjOglmN2ZmIDliNWMgCWx3CVwkdjAsLTRcKFwkdjFcKQorIDE3MDoJZjdmZiA5YjU4IAlsdwlcJHYwLC04XChcJHYxXCkKKyAxNzQ6CWY3ZmYgOWI1MCAJbHcJXCR2MCwtMTZcKFwkdjFcKQorIDE3ODoJZjdmZiA5YjQwIAlsdwlcJHYwLC0zMlwoXCR2MVwpCisgMTdjOglmN2RmIDliNDAgCWx3CVwkdjAsLTY0XChcJHYxXCkKKyAxODA6CWY3OWYgOWI0MCAJbHcJXCR2MCwtMTI4XChcJHYxXCkKKyAxODQ6CWY3MWYgOWI0MCAJbHcJXCR2MCwtMjU2XChcJHYxXCkKKyAxODg6CWY2MWYgOWI0MCAJbHcJXCR2MCwtNTEyXChcJHYxXCkKKyAxOGM6CWY0MWYgOWI0MCAJbHcJXCR2MCwtMTAyNFwoXCR2MVwpCisgMTkwOglmMDFmIDliNDAgCWx3CVwkdjAsLTIwNDhcKFwkdjFcKQorIDE5NDoJZjY3ZiBiMjBjIAlsdwlcJHYwLDAgPGRhdGExPgorIDE5ODoJZjU4MCBiMjA0IAlsdwlcJHYwLDcxYyA8ZGF0YTI+CisgMTljOglmNmMwIGIyMGMgCWx3CVwkdjAsODY4IDxiYXI+CisgMWEwOglmNzgwIGIyMTAgCWx3CVwkdjAsOTMwIDxxdXV4PgorIDFhNDoJOTIwMCAgICAgIAlsdwlcJHYwLDBcKFwkc3BcKQorIDFhNjoJZjAwMCA5MjAxIAlsdwlcJHYwLDFcKFwkc3BcKQorIDFhYToJZjAwMCA5MjAyIAlsdwlcJHYwLDJcKFwkc3BcKQorIDFhZToJZjAwMCA5MjAzIAlsdwlcJHYwLDNcKFwkc3BcKQorIDFiMjoJOTIwMSAgICAgIAlsdwlcJHYwLDRcKFwkc3BcKQorIDFiNDoJOTIwMiAgICAgIAlsdwlcJHYwLDhcKFwkc3BcKQorIDFiNjoJOTIwNCAgICAgIAlsdwlcJHYwLDE2XChcJHNwXCkKKyAxYjg6CTkyMDggICAgICAJbHcJXCR2MCwzMlwoXCRzcFwpCisgMWJhOgk5MjEwICAgICAgCWx3CVwkdjAsNjRcKFwkc3BcKQorIDFiYzoJOTIyMCAgICAgIAlsdwlcJHYwLDEyOFwoXCRzcFwpCisgMWJlOgk5MjQwICAgICAgCWx3CVwkdjAsMjU2XChcJHNwXCkKKyAxYzA6CTkyODAgICAgICAJbHcJXCR2MCw1MTJcKFwkc3BcKQorIDFjMjoJZjQwMCA5MjAwIAlsdwlcJHYwLDEwMjRcKFwkc3BcKQorIDFjNjoJZjAwMSA5MjAwIAlsdwlcJHYwLDIwNDhcKFwkc3BcKQorIDFjYToJZjdmZiA5MjFmIAlsdwlcJHYwLC0xXChcJHNwXCkKKyAxY2U6CWY3ZmYgOTIxZSAJbHcJXCR2MCwtMlwoXCRzcFwpCisgMWQyOglmN2ZmIDkyMWQgCWx3CVwkdjAsLTNcKFwkc3BcKQorIDFkNjoJZjdmZiA5MjFjIAlsdwlcJHYwLC00XChcJHNwXCkKKyAxZGE6CWY3ZmYgOTIxOCAJbHcJXCR2MCwtOFwoXCRzcFwpCisgMWRlOglmN2ZmIDkyMTAgCWx3CVwkdjAsLTE2XChcJHNwXCkKKyAxZTI6CWY3ZmYgOTIwMCAJbHcJXCR2MCwtMzJcKFwkc3BcKQorIDFlNjoJZjdkZiA5MjAwIAlsdwlcJHYwLC02NFwoXCRzcFwpCisgMWVhOglmNzlmIDkyMDAgCWx3CVwkdjAsLTEyOFwoXCRzcFwpCisgMWVlOglmNzFmIDkyMDAgCWx3CVwkdjAsLTI1NlwoXCRzcFwpCisgMWYyOglmNjFmIDkyMDAgCWx3CVwkdjAsLTUxMlwoXCRzcFwpCisgMWY2OglmNDFmIDkyMDAgCWx3CVwkdjAsLTEwMjRcKFwkc3BcKQorIDFmYToJZjAxZiA5MjAwIAlsdwlcJHYwLC0yMDQ4XChcJHNwXCkKKyAxZmU6CThiNDAgICAgICAJbGgJXCR2MCwwXChcJHYxXCkKKyAyMDA6CWYwMDAgOGI0MSAJbGgJXCR2MCwxXChcJHYxXCkKKyAyMDQ6CThiNDEgICAgICAJbGgJXCR2MCwyXChcJHYxXCkKKyAyMDY6CWYwMDAgOGI0MyAJbGgJXCR2MCwzXChcJHYxXCkKKyAyMGE6CThiNDIgICAgICAJbGgJXCR2MCw0XChcJHYxXCkKKyAyMGM6CThiNDQgICAgICAJbGgJXCR2MCw4XChcJHYxXCkKKyAyMGU6CThiNDggICAgICAJbGgJXCR2MCwxNlwoXCR2MVwpCisgMjEwOgk4YjUwICAgICAgCWxoCVwkdjAsMzJcKFwkdjFcKQorIDIxMjoJZjA0MCA4YjQwIAlsaAlcJHYwLDY0XChcJHYxXCkKKyAyMTY6CWYwODAgOGI0MCAJbGgJXCR2MCwxMjhcKFwkdjFcKQorIDIxYToJZjEwMCA4YjQwIAlsaAlcJHYwLDI1NlwoXCR2MVwpCisgMjFlOglmMjAwIDhiNDAgCWxoCVwkdjAsNTEyXChcJHYxXCkKKyAyMjI6CWY0MDAgOGI0MCAJbGgJXCR2MCwxMDI0XChcJHYxXCkKKyAyMjY6CWYwMDEgOGI0MCAJbGgJXCR2MCwyMDQ4XChcJHYxXCkKKyAyMmE6CWY3ZmYgOGI1ZiAJbGgJXCR2MCwtMVwoXCR2MVwpCisgMjJlOglmN2ZmIDhiNWUgCWxoCVwkdjAsLTJcKFwkdjFcKQorIDIzMjoJZjdmZiA4YjVkIAlsaAlcJHYwLC0zXChcJHYxXCkKKyAyMzY6CWY3ZmYgOGI1YyAJbGgJXCR2MCwtNFwoXCR2MVwpCisgMjNhOglmN2ZmIDhiNTggCWxoCVwkdjAsLThcKFwkdjFcKQorIDIzZToJZjdmZiA4YjUwIAlsaAlcJHYwLC0xNlwoXCR2MVwpCisgMjQyOglmN2ZmIDhiNDAgCWxoCVwkdjAsLTMyXChcJHYxXCkKKyAyNDY6CWY3ZGYgOGI0MCAJbGgJXCR2MCwtNjRcKFwkdjFcKQorIDI0YToJZjc5ZiA4YjQwIAlsaAlcJHYwLC0xMjhcKFwkdjFcKQorIDI0ZToJZjcxZiA4YjQwIAlsaAlcJHYwLC0yNTZcKFwkdjFcKQorIDI1MjoJZjYxZiA4YjQwIAlsaAlcJHYwLC01MTJcKFwkdjFcKQorIDI1NjoJZjQxZiA4YjQwIAlsaAlcJHYwLC0xMDI0XChcJHYxXCkKKyAyNWE6CWYwMWYgOGI0MCAJbGgJXCR2MCwtMjA0OFwoXCR2MVwpCisgMjVlOglhYjQwICAgICAgCWxodQlcJHYwLDBcKFwkdjFcKQorIDI2MDoJZjAwMCBhYjQxIAlsaHUJXCR2MCwxXChcJHYxXCkKKyAyNjQ6CWFiNDEgICAgICAJbGh1CVwkdjAsMlwoXCR2MVwpCisgMjY2OglmMDAwIGFiNDMgCWxodQlcJHYwLDNcKFwkdjFcKQorIDI2YToJYWI0MiAgICAgIAlsaHUJXCR2MCw0XChcJHYxXCkKKyAyNmM6CWFiNDQgICAgICAJbGh1CVwkdjAsOFwoXCR2MVwpCisgMjZlOglhYjQ4ICAgICAgCWxodQlcJHYwLDE2XChcJHYxXCkKKyAyNzA6CWFiNTAgICAgICAJbGh1CVwkdjAsMzJcKFwkdjFcKQorIDI3MjoJZjA0MCBhYjQwIAlsaHUJXCR2MCw2NFwoXCR2MVwpCisgMjc2OglmMDgwIGFiNDAgCWxodQlcJHYwLDEyOFwoXCR2MVwpCisgMjdhOglmMTAwIGFiNDAgCWxodQlcJHYwLDI1NlwoXCR2MVwpCisgMjdlOglmMjAwIGFiNDAgCWxodQlcJHYwLDUxMlwoXCR2MVwpCisgMjgyOglmNDAwIGFiNDAgCWxodQlcJHYwLDEwMjRcKFwkdjFcKQorIDI4NjoJZjAwMSBhYjQwIAlsaHUJXCR2MCwyMDQ4XChcJHYxXCkKKyAyOGE6CWY3ZmYgYWI1ZiAJbGh1CVwkdjAsLTFcKFwkdjFcKQorIDI4ZToJZjdmZiBhYjVlIAlsaHUJXCR2MCwtMlwoXCR2MVwpCisgMjkyOglmN2ZmIGFiNWQgCWxodQlcJHYwLC0zXChcJHYxXCkKKyAyOTY6CWY3ZmYgYWI1YyAJbGh1CVwkdjAsLTRcKFwkdjFcKQorIDI5YToJZjdmZiBhYjU4IAlsaHUJXCR2MCwtOFwoXCR2MVwpCisgMjllOglmN2ZmIGFiNTAgCWxodQlcJHYwLC0xNlwoXCR2MVwpCisgMmEyOglmN2ZmIGFiNDAgCWxodQlcJHYwLC0zMlwoXCR2MVwpCisgMmE2OglmN2RmIGFiNDAgCWxodQlcJHYwLC02NFwoXCR2MVwpCisgMmFhOglmNzlmIGFiNDAgCWxodQlcJHYwLC0xMjhcKFwkdjFcKQorIDJhZToJZjcxZiBhYjQwIAlsaHUJXCR2MCwtMjU2XChcJHYxXCkKKyAyYjI6CWY2MWYgYWI0MCAJbGh1CVwkdjAsLTUxMlwoXCR2MVwpCisgMmI2OglmNDFmIGFiNDAgCWxodQlcJHYwLC0xMDI0XChcJHYxXCkKKyAyYmE6CWYwMWYgYWI0MCAJbGh1CVwkdjAsLTIwNDhcKFwkdjFcKQorIDJiZToJODM0MCAgICAgIAlsYglcJHYwLDBcKFwkdjFcKQorIDJjMDoJODM0MSAgICAgIAlsYglcJHYwLDFcKFwkdjFcKQorIDJjMjoJODM0MiAgICAgIAlsYglcJHYwLDJcKFwkdjFcKQorIDJjNDoJODM0MyAgICAgIAlsYglcJHYwLDNcKFwkdjFcKQorIDJjNjoJODM0NCAgICAgIAlsYglcJHYwLDRcKFwkdjFcKQorIDJjODoJODM0OCAgICAgIAlsYglcJHYwLDhcKFwkdjFcKQorIDJjYToJODM1MCAgICAgIAlsYglcJHYwLDE2XChcJHYxXCkKKyAyY2M6CWYwMjAgODM0MCAJbGIJXCR2MCwzMlwoXCR2MVwpCisgMmQwOglmMDQwIDgzNDAgCWxiCVwkdjAsNjRcKFwkdjFcKQorIDJkNDoJZjA4MCA4MzQwIAlsYglcJHYwLDEyOFwoXCR2MVwpCisgMmQ4OglmMTAwIDgzNDAgCWxiCVwkdjAsMjU2XChcJHYxXCkKKyAyZGM6CWYyMDAgODM0MCAJbGIJXCR2MCw1MTJcKFwkdjFcKQorIDJlMDoJZjQwMCA4MzQwIAlsYglcJHYwLDEwMjRcKFwkdjFcKQorIDJlNDoJZjAwMSA4MzQwIAlsYglcJHYwLDIwNDhcKFwkdjFcKQorIDJlODoJZjdmZiA4MzVmIAlsYglcJHYwLC0xXChcJHYxXCkKKyAyZWM6CWY3ZmYgODM1ZSAJbGIJXCR2MCwtMlwoXCR2MVwpCisgMmYwOglmN2ZmIDgzNWQgCWxiCVwkdjAsLTNcKFwkdjFcKQorIDJmNDoJZjdmZiA4MzVjIAlsYglcJHYwLC00XChcJHYxXCkKKyAyZjg6CWY3ZmYgODM1OCAJbGIJXCR2MCwtOFwoXCR2MVwpCisgMmZjOglmN2ZmIDgzNTAgCWxiCVwkdjAsLTE2XChcJHYxXCkKKyAzMDA6CWY3ZmYgODM0MCAJbGIJXCR2MCwtMzJcKFwkdjFcKQorIDMwNDoJZjdkZiA4MzQwIAlsYglcJHYwLC02NFwoXCR2MVwpCisgMzA4OglmNzlmIDgzNDAgCWxiCVwkdjAsLTEyOFwoXCR2MVwpCisgMzBjOglmNzFmIDgzNDAgCWxiCVwkdjAsLTI1NlwoXCR2MVwpCisgMzEwOglmNjFmIDgzNDAgCWxiCVwkdjAsLTUxMlwoXCR2MVwpCisgMzE0OglmNDFmIDgzNDAgCWxiCVwkdjAsLTEwMjRcKFwkdjFcKQorIDMxODoJZjAxZiA4MzQwIAlsYglcJHYwLC0yMDQ4XChcJHYxXCkKKyAzMWM6CWEzNDAgICAgICAJbGJ1CVwkdjAsMFwoXCR2MVwpCisgMzFlOglhMzQxICAgICAgCWxidQlcJHYwLDFcKFwkdjFcKQorIDMyMDoJYTM0MiAgICAgIAlsYnUJXCR2MCwyXChcJHYxXCkKKyAzMjI6CWEzNDMgICAgICAJbGJ1CVwkdjAsM1woXCR2MVwpCisgMzI0OglhMzQ0ICAgICAgCWxidQlcJHYwLDRcKFwkdjFcKQorIDMyNjoJYTM0OCAgICAgIAlsYnUJXCR2MCw4XChcJHYxXCkKKyAzMjg6CWEzNTAgICAgICAJbGJ1CVwkdjAsMTZcKFwkdjFcKQorIDMyYToJZjAyMCBhMzQwIAlsYnUJXCR2MCwzMlwoXCR2MVwpCisgMzJlOglmMDQwIGEzNDAgCWxidQlcJHYwLDY0XChcJHYxXCkKKyAzMzI6CWYwODAgYTM0MCAJbGJ1CVwkdjAsMTI4XChcJHYxXCkKKyAzMzY6CWYxMDAgYTM0MCAJbGJ1CVwkdjAsMjU2XChcJHYxXCkKKyAzM2E6CWYyMDAgYTM0MCAJbGJ1CVwkdjAsNTEyXChcJHYxXCkKKyAzM2U6CWY0MDAgYTM0MCAJbGJ1CVwkdjAsMTAyNFwoXCR2MVwpCisgMzQyOglmMDAxIGEzNDAgCWxidQlcJHYwLDIwNDhcKFwkdjFcKQorIDM0NjoJZjdmZiBhMzVmIAlsYnUJXCR2MCwtMVwoXCR2MVwpCisgMzRhOglmN2ZmIGEzNWUgCWxidQlcJHYwLC0yXChcJHYxXCkKKyAzNGU6CWY3ZmYgYTM1ZCAJbGJ1CVwkdjAsLTNcKFwkdjFcKQorIDM1MjoJZjdmZiBhMzVjIAlsYnUJXCR2MCwtNFwoXCR2MVwpCisgMzU2OglmN2ZmIGEzNTggCWxidQlcJHYwLC04XChcJHYxXCkKKyAzNWE6CWY3ZmYgYTM1MCAJbGJ1CVwkdjAsLTE2XChcJHYxXCkKKyAzNWU6CWY3ZmYgYTM0MCAJbGJ1CVwkdjAsLTMyXChcJHYxXCkKKyAzNjI6CWY3ZGYgYTM0MCAJbGJ1CVwkdjAsLTY0XChcJHYxXCkKKyAzNjY6CWY3OWYgYTM0MCAJbGJ1CVwkdjAsLTEyOFwoXCR2MVwpCisgMzZhOglmNzFmIGEzNDAgCWxidQlcJHYwLC0yNTZcKFwkdjFcKQorIDM2ZToJZjYxZiBhMzQwIAlsYnUJXCR2MCwtNTEyXChcJHYxXCkKKyAzNzI6CWY0MWYgYTM0MCAJbGJ1CVwkdjAsLTEwMjRcKFwkdjFcKQorIDM3NjoJZjAxZiBhMzQwIAlsYnUJXCR2MCwtMjA0OFwoXCR2MVwpCisgMzdhOgk3YjQwICAgICAgCXNkCVwkdjAsMFwoXCR2MVwpCisgMzdjOglmMDAwIDdiNDEgCXNkCVwkdjAsMVwoXCR2MVwpCisgMzgwOglmMDAwIDdiNDIgCXNkCVwkdjAsMlwoXCR2MVwpCisgMzg0OglmMDAwIDdiNDMgCXNkCVwkdjAsM1woXCR2MVwpCisgMzg4OglmMDAwIDdiNDQgCXNkCVwkdjAsNFwoXCR2MVwpCisgMzhjOgk3YjQxICAgICAgCXNkCVwkdjAsOFwoXCR2MVwpCisgMzhlOgk3YjQyICAgICAgCXNkCVwkdjAsMTZcKFwkdjFcKQorIDM5MDoJN2I0NCAgICAgIAlzZAlcJHYwLDMyXChcJHYxXCkKKyAzOTI6CTdiNDggICAgICAJc2QJXCR2MCw2NFwoXCR2MVwpCisgMzk0Ogk3YjUwICAgICAgCXNkCVwkdjAsMTI4XChcJHYxXCkKKyAzOTY6CWYxMDAgN2I0MCAJc2QJXCR2MCwyNTZcKFwkdjFcKQorIDM5YToJZjIwMCA3YjQwIAlzZAlcJHYwLDUxMlwoXCR2MVwpCisgMzllOglmNDAwIDdiNDAgCXNkCVwkdjAsMTAyNFwoXCR2MVwpCisgM2EyOglmMDAxIDdiNDAgCXNkCVwkdjAsMjA0OFwoXCR2MVwpCisgM2E2OglmN2ZmIDdiNWYgCXNkCVwkdjAsLTFcKFwkdjFcKQorIDNhYToJZjdmZiA3YjVlIAlzZAlcJHYwLC0yXChcJHYxXCkKKyAzYWU6CWY3ZmYgN2I1ZCAJc2QJXCR2MCwtM1woXCR2MVwpCisgM2IyOglmN2ZmIDdiNWMgCXNkCVwkdjAsLTRcKFwkdjFcKQorIDNiNjoJZjdmZiA3YjU4IAlzZAlcJHYwLC04XChcJHYxXCkKKyAzYmE6CWY3ZmYgN2I1MCAJc2QJXCR2MCwtMTZcKFwkdjFcKQorIDNiZToJZjdmZiA3YjQwIAlzZAlcJHYwLC0zMlwoXCR2MVwpCisgM2MyOglmN2RmIDdiNDAgCXNkCVwkdjAsLTY0XChcJHYxXCkKKyAzYzY6CWY3OWYgN2I0MCAJc2QJXCR2MCwtMTI4XChcJHYxXCkKKyAzY2E6CWY3MWYgN2I0MCAJc2QJXCR2MCwtMjU2XChcJHYxXCkKKyAzY2U6CWY2MWYgN2I0MCAJc2QJXCR2MCwtNTEyXChcJHYxXCkKKyAzZDI6CWY0MWYgN2I0MCAJc2QJXCR2MCwtMTAyNFwoXCR2MVwpCisgM2Q2OglmMDFmIDdiNDAgCXNkCVwkdjAsLTIwNDhcKFwkdjFcKQorIDNkYToJZjk0MCAgICAgIAlzZAlcJHYwLDBcKFwkc3BcKQorIDNkYzoJZjAwMCBmOTQxIAlzZAlcJHYwLDFcKFwkc3BcKQorIDNlMDoJZjAwMCBmOTQyIAlzZAlcJHYwLDJcKFwkc3BcKQorIDNlNDoJZjAwMCBmOTQzIAlzZAlcJHYwLDNcKFwkc3BcKQorIDNlODoJZjAwMCBmOTQ0IAlzZAlcJHYwLDRcKFwkc3BcKQorIDNlYzoJZjk0MSAgICAgIAlzZAlcJHYwLDhcKFwkc3BcKQorIDNlZToJZjk0MiAgICAgIAlzZAlcJHYwLDE2XChcJHNwXCkKKyAzZjA6CWY5NDQgICAgICAJc2QJXCR2MCwzMlwoXCRzcFwpCisgM2YyOglmOTQ4ICAgICAgCXNkCVwkdjAsNjRcKFwkc3BcKQorIDNmNDoJZjk1MCAgICAgIAlzZAlcJHYwLDEyOFwoXCRzcFwpCisgM2Y2OglmMTAwIGY5NDAgCXNkCVwkdjAsMjU2XChcJHNwXCkKKyAzZmE6CWYyMDAgZjk0MCAJc2QJXCR2MCw1MTJcKFwkc3BcKQorIDNmZToJZjQwMCBmOTQwIAlzZAlcJHYwLDEwMjRcKFwkc3BcKQorIDQwMjoJZjAwMSBmOTQwIAlzZAlcJHYwLDIwNDhcKFwkc3BcKQorIDQwNjoJZjdmZiBmOTVmIAlzZAlcJHYwLC0xXChcJHNwXCkKKyA0MGE6CWY3ZmYgZjk1ZSAJc2QJXCR2MCwtMlwoXCRzcFwpCisgNDBlOglmN2ZmIGY5NWQgCXNkCVwkdjAsLTNcKFwkc3BcKQorIDQxMjoJZjdmZiBmOTVjIAlzZAlcJHYwLC00XChcJHNwXCkKKyA0MTY6CWY3ZmYgZjk1OCAJc2QJXCR2MCwtOFwoXCRzcFwpCisgNDFhOglmN2ZmIGY5NTAgCXNkCVwkdjAsLTE2XChcJHNwXCkKKyA0MWU6CWY3ZmYgZjk0MCAJc2QJXCR2MCwtMzJcKFwkc3BcKQorIDQyMjoJZjdkZiBmOTQwIAlzZAlcJHYwLC02NFwoXCRzcFwpCisgNDI2OglmNzlmIGY5NDAgCXNkCVwkdjAsLTEyOFwoXCRzcFwpCisgNDJhOglmNzFmIGY5NDAgCXNkCVwkdjAsLTI1NlwoXCRzcFwpCisgNDJlOglmNjFmIGY5NDAgCXNkCVwkdjAsLTUxMlwoXCRzcFwpCisgNDMyOglmNDFmIGY5NDAgCXNkCVwkdjAsLTEwMjRcKFwkc3BcKQorIDQzNjoJZjAxZiBmOTQwIAlzZAlcJHYwLC0yMDQ4XChcJHNwXCkKKyA0M2E6CWZhMDAgICAgICAJc2QJXCRyYSwwXChcJHNwXCkKKyA0M2M6CWYwMDAgZmEwMSAJc2QJXCRyYSwxXChcJHNwXCkKKyA0NDA6CWYwMDAgZmEwMiAJc2QJXCRyYSwyXChcJHNwXCkKKyA0NDQ6CWYwMDAgZmEwMyAJc2QJXCRyYSwzXChcJHNwXCkKKyA0NDg6CWYwMDAgZmEwNCAJc2QJXCRyYSw0XChcJHNwXCkKKyA0NGM6CWZhMDEgICAgICAJc2QJXCRyYSw4XChcJHNwXCkKKyA0NGU6CWZhMDIgICAgICAJc2QJXCRyYSwxNlwoXCRzcFwpCisgNDUwOglmYTA0ICAgICAgCXNkCVwkcmEsMzJcKFwkc3BcKQorIDQ1MjoJZmEwOCAgICAgIAlzZAlcJHJhLDY0XChcJHNwXCkKKyA0NTQ6CWZhMTAgICAgICAJc2QJXCRyYSwxMjhcKFwkc3BcKQorIDQ1NjoJZmEyMCAgICAgIAlzZAlcJHJhLDI1NlwoXCRzcFwpCisgNDU4OglmYTQwICAgICAgCXNkCVwkcmEsNTEyXChcJHNwXCkKKyA0NWE6CWZhODAgICAgICAJc2QJXCRyYSwxMDI0XChcJHNwXCkKKyA0NWM6CWYwMDEgZmEwMCAJc2QJXCRyYSwyMDQ4XChcJHNwXCkKKyA0NjA6CWY3ZmYgZmExZiAJc2QJXCRyYSwtMVwoXCRzcFwpCisgNDY0OglmN2ZmIGZhMWUgCXNkCVwkcmEsLTJcKFwkc3BcKQorIDQ2ODoJZjdmZiBmYTFkIAlzZAlcJHJhLC0zXChcJHNwXCkKKyA0NmM6CWY3ZmYgZmExYyAJc2QJXCRyYSwtNFwoXCRzcFwpCisgNDcwOglmN2ZmIGZhMTggCXNkCVwkcmEsLThcKFwkc3BcKQorIDQ3NDoJZjdmZiBmYTEwIAlzZAlcJHJhLC0xNlwoXCRzcFwpCisgNDc4OglmN2ZmIGZhMDAgCXNkCVwkcmEsLTMyXChcJHNwXCkKKyA0N2M6CWY3ZGYgZmEwMCAJc2QJXCRyYSwtNjRcKFwkc3BcKQorIDQ4MDoJZjc5ZiBmYTAwIAlzZAlcJHJhLC0xMjhcKFwkc3BcKQorIDQ4NDoJZjcxZiBmYTAwIAlzZAlcJHJhLC0yNTZcKFwkc3BcKQorIDQ4ODoJZjYxZiBmYTAwIAlzZAlcJHJhLC01MTJcKFwkc3BcKQorIDQ4YzoJZjQxZiBmYTAwIAlzZAlcJHJhLC0xMDI0XChcJHNwXCkKKyA0OTA6CWYwMWYgZmEwMCAJc2QJXCRyYSwtMjA0OFwoXCRzcFwpCisgNDk0OglkYjQwICAgICAgCXN3CVwkdjAsMFwoXCR2MVwpCisgNDk2OglmMDAwIGRiNDEgCXN3CVwkdjAsMVwoXCR2MVwpCisgNDlhOglmMDAwIGRiNDIgCXN3CVwkdjAsMlwoXCR2MVwpCisgNDllOglmMDAwIGRiNDMgCXN3CVwkdjAsM1woXCR2MVwpCisgNGEyOglkYjQxICAgICAgCXN3CVwkdjAsNFwoXCR2MVwpCisgNGE0OglkYjQyICAgICAgCXN3CVwkdjAsOFwoXCR2MVwpCisgNGE2OglkYjQ0ICAgICAgCXN3CVwkdjAsMTZcKFwkdjFcKQorIDRhODoJZGI0OCAgICAgIAlzdwlcJHYwLDMyXChcJHYxXCkKKyA0YWE6CWRiNTAgICAgICAJc3cJXCR2MCw2NFwoXCR2MVwpCisgNGFjOglmMDgwIGRiNDAgCXN3CVwkdjAsMTI4XChcJHYxXCkKKyA0YjA6CWYxMDAgZGI0MCAJc3cJXCR2MCwyNTZcKFwkdjFcKQorIDRiNDoJZjIwMCBkYjQwIAlzdwlcJHYwLDUxMlwoXCR2MVwpCisgNGI4OglmNDAwIGRiNDAgCXN3CVwkdjAsMTAyNFwoXCR2MVwpCisgNGJjOglmMDAxIGRiNDAgCXN3CVwkdjAsMjA0OFwoXCR2MVwpCisgNGMwOglmN2ZmIGRiNWYgCXN3CVwkdjAsLTFcKFwkdjFcKQorIDRjNDoJZjdmZiBkYjVlIAlzdwlcJHYwLC0yXChcJHYxXCkKKyA0Yzg6CWY3ZmYgZGI1ZCAJc3cJXCR2MCwtM1woXCR2MVwpCisgNGNjOglmN2ZmIGRiNWMgCXN3CVwkdjAsLTRcKFwkdjFcKQorIDRkMDoJZjdmZiBkYjU4IAlzdwlcJHYwLC04XChcJHYxXCkKKyA0ZDQ6CWY3ZmYgZGI1MCAJc3cJXCR2MCwtMTZcKFwkdjFcKQorIDRkODoJZjdmZiBkYjQwIAlzdwlcJHYwLC0zMlwoXCR2MVwpCisgNGRjOglmN2RmIGRiNDAgCXN3CVwkdjAsLTY0XChcJHYxXCkKKyA0ZTA6CWY3OWYgZGI0MCAJc3cJXCR2MCwtMTI4XChcJHYxXCkKKyA0ZTQ6CWY3MWYgZGI0MCAJc3cJXCR2MCwtMjU2XChcJHYxXCkKKyA0ZTg6CWY2MWYgZGI0MCAJc3cJXCR2MCwtNTEyXChcJHYxXCkKKyA0ZWM6CWY0MWYgZGI0MCAJc3cJXCR2MCwtMTAyNFwoXCR2MVwpCisgNGYwOglmMDFmIGRiNDAgCXN3CVwkdjAsLTIwNDhcKFwkdjFcKQorIDRmNDoJZDIwMCAgICAgIAlzdwlcJHYwLDBcKFwkc3BcKQorIDRmNjoJZjAwMCBkMjAxIAlzdwlcJHYwLDFcKFwkc3BcKQorIDRmYToJZjAwMCBkMjAyIAlzdwlcJHYwLDJcKFwkc3BcKQorIDRmZToJZjAwMCBkMjAzIAlzdwlcJHYwLDNcKFwkc3BcKQorIDUwMjoJZDIwMSAgICAgIAlzdwlcJHYwLDRcKFwkc3BcKQorIDUwNDoJZDIwMiAgICAgIAlzdwlcJHYwLDhcKFwkc3BcKQorIDUwNjoJZDIwNCAgICAgIAlzdwlcJHYwLDE2XChcJHNwXCkKKyA1MDg6CWQyMDggICAgICAJc3cJXCR2MCwzMlwoXCRzcFwpCisgNTBhOglkMjEwICAgICAgCXN3CVwkdjAsNjRcKFwkc3BcKQorIDUwYzoJZDIyMCAgICAgIAlzdwlcJHYwLDEyOFwoXCRzcFwpCisgNTBlOglkMjQwICAgICAgCXN3CVwkdjAsMjU2XChcJHNwXCkKKyA1MTA6CWQyODAgICAgICAJc3cJXCR2MCw1MTJcKFwkc3BcKQorIDUxMjoJZjQwMCBkMjAwIAlzdwlcJHYwLDEwMjRcKFwkc3BcKQorIDUxNjoJZjAwMSBkMjAwIAlzdwlcJHYwLDIwNDhcKFwkc3BcKQorIDUxYToJZjdmZiBkMjFmIAlzdwlcJHYwLC0xXChcJHNwXCkKKyA1MWU6CWY3ZmYgZDIxZSAJc3cJXCR2MCwtMlwoXCRzcFwpCisgNTIyOglmN2ZmIGQyMWQgCXN3CVwkdjAsLTNcKFwkc3BcKQorIDUyNjoJZjdmZiBkMjFjIAlzdwlcJHYwLC00XChcJHNwXCkKKyA1MmE6CWY3ZmYgZDIxOCAJc3cJXCR2MCwtOFwoXCRzcFwpCisgNTJlOglmN2ZmIGQyMTAgCXN3CVwkdjAsLTE2XChcJHNwXCkKKyA1MzI6CWY3ZmYgZDIwMCAJc3cJXCR2MCwtMzJcKFwkc3BcKQorIDUzNjoJZjdkZiBkMjAwIAlzdwlcJHYwLC02NFwoXCRzcFwpCisgNTNhOglmNzlmIGQyMDAgCXN3CVwkdjAsLTEyOFwoXCRzcFwpCisgNTNlOglmNzFmIGQyMDAgCXN3CVwkdjAsLTI1NlwoXCRzcFwpCisgNTQyOglmNjFmIGQyMDAgCXN3CVwkdjAsLTUxMlwoXCRzcFwpCisgNTQ2OglmNDFmIGQyMDAgCXN3CVwkdjAsLTEwMjRcKFwkc3BcKQorIDU0YToJZjAxZiBkMjAwIAlzdwlcJHYwLC0yMDQ4XChcJHNwXCkKKyA1NGU6CTYyMDAgICAgICAJc3cJXCRyYSwwXChcJHNwXCkKKyA1NTA6CWYwMDAgNjIwMSAJc3cJXCRyYSwxXChcJHNwXCkKKyA1NTQ6CWYwMDAgNjIwMiAJc3cJXCRyYSwyXChcJHNwXCkKKyA1NTg6CWYwMDAgNjIwMyAJc3cJXCRyYSwzXChcJHNwXCkKKyA1NWM6CTYyMDEgICAgICAJc3cJXCRyYSw0XChcJHNwXCkKKyA1NWU6CTYyMDIgICAgICAJc3cJXCRyYSw4XChcJHNwXCkKKyA1NjA6CTYyMDQgICAgICAJc3cJXCRyYSwxNlwoXCRzcFwpCisgNTYyOgk2MjA4ICAgICAgCXN3CVwkcmEsMzJcKFwkc3BcKQorIDU2NDoJNjIxMCAgICAgIAlzdwlcJHJhLDY0XChcJHNwXCkKKyA1NjY6CTYyMjAgICAgICAJc3cJXCRyYSwxMjhcKFwkc3BcKQorIDU2ODoJNjI0MCAgICAgIAlzdwlcJHJhLDI1NlwoXCRzcFwpCisgNTZhOgk2MjgwICAgICAgCXN3CVwkcmEsNTEyXChcJHNwXCkKKyA1NmM6CWY0MDAgNjIwMCAJc3cJXCRyYSwxMDI0XChcJHNwXCkKKyA1NzA6CWYwMDEgNjIwMCAJc3cJXCRyYSwyMDQ4XChcJHNwXCkKKyA1NzQ6CWY3ZmYgNjIxZiAJc3cJXCRyYSwtMVwoXCRzcFwpCisgNTc4OglmN2ZmIDYyMWUgCXN3CVwkcmEsLTJcKFwkc3BcKQorIDU3YzoJZjdmZiA2MjFkIAlzdwlcJHJhLC0zXChcJHNwXCkKKyA1ODA6CWY3ZmYgNjIxYyAJc3cJXCRyYSwtNFwoXCRzcFwpCisgNTg0OglmN2ZmIDYyMTggCXN3CVwkcmEsLThcKFwkc3BcKQorIDU4ODoJZjdmZiA2MjEwIAlzdwlcJHJhLC0xNlwoXCRzcFwpCisgNThjOglmN2ZmIDYyMDAgCXN3CVwkcmEsLTMyXChcJHNwXCkKKyA1OTA6CWY3ZGYgNjIwMCAJc3cJXCRyYSwtNjRcKFwkc3BcKQorIDU5NDoJZjc5ZiA2MjAwIAlzdwlcJHJhLC0xMjhcKFwkc3BcKQorIDU5ODoJZjcxZiA2MjAwIAlzdwlcJHJhLC0yNTZcKFwkc3BcKQorIDU5YzoJZjYxZiA2MjAwIAlzdwlcJHJhLC01MTJcKFwkc3BcKQorIDVhMDoJZjQxZiA2MjAwIAlzdwlcJHJhLC0xMDI0XChcJHNwXCkKKyA1YTQ6CWYwMWYgNjIwMCAJc3cJXCRyYSwtMjA0OFwoXCRzcFwpCisgNWE4OgljYjQwICAgICAgCXNoCVwkdjAsMFwoXCR2MVwpCisgNWFhOglmMDAwIGNiNDEgCXNoCVwkdjAsMVwoXCR2MVwpCisgNWFlOgljYjQxICAgICAgCXNoCVwkdjAsMlwoXCR2MVwpCisgNWIwOglmMDAwIGNiNDMgCXNoCVwkdjAsM1woXCR2MVwpCisgNWI0OgljYjQyICAgICAgCXNoCVwkdjAsNFwoXCR2MVwpCisgNWI2OgljYjQ0ICAgICAgCXNoCVwkdjAsOFwoXCR2MVwpCisgNWI4OgljYjQ4ICAgICAgCXNoCVwkdjAsMTZcKFwkdjFcKQorIDViYToJY2I1MCAgICAgIAlzaAlcJHYwLDMyXChcJHYxXCkKKyA1YmM6CWYwNDAgY2I0MCAJc2gJXCR2MCw2NFwoXCR2MVwpCisgNWMwOglmMDgwIGNiNDAgCXNoCVwkdjAsMTI4XChcJHYxXCkKKyA1YzQ6CWYxMDAgY2I0MCAJc2gJXCR2MCwyNTZcKFwkdjFcKQorIDVjODoJZjIwMCBjYjQwIAlzaAlcJHYwLDUxMlwoXCR2MVwpCisgNWNjOglmNDAwIGNiNDAgCXNoCVwkdjAsMTAyNFwoXCR2MVwpCisgNWQwOglmMDAxIGNiNDAgCXNoCVwkdjAsMjA0OFwoXCR2MVwpCisgNWQ0OglmN2ZmIGNiNWYgCXNoCVwkdjAsLTFcKFwkdjFcKQorIDVkODoJZjdmZiBjYjVlIAlzaAlcJHYwLC0yXChcJHYxXCkKKyA1ZGM6CWY3ZmYgY2I1ZCAJc2gJXCR2MCwtM1woXCR2MVwpCisgNWUwOglmN2ZmIGNiNWMgCXNoCVwkdjAsLTRcKFwkdjFcKQorIDVlNDoJZjdmZiBjYjU4IAlzaAlcJHYwLC04XChcJHYxXCkKKyA1ZTg6CWY3ZmYgY2I1MCAJc2gJXCR2MCwtMTZcKFwkdjFcKQorIDVlYzoJZjdmZiBjYjQwIAlzaAlcJHYwLC0zMlwoXCR2MVwpCisgNWYwOglmN2RmIGNiNDAgCXNoCVwkdjAsLTY0XChcJHYxXCkKKyA1ZjQ6CWY3OWYgY2I0MCAJc2gJXCR2MCwtMTI4XChcJHYxXCkKKyA1Zjg6CWY3MWYgY2I0MCAJc2gJXCR2MCwtMjU2XChcJHYxXCkKKyA1ZmM6CWY2MWYgY2I0MCAJc2gJXCR2MCwtNTEyXChcJHYxXCkKKyA2MDA6CWY0MWYgY2I0MCAJc2gJXCR2MCwtMTAyNFwoXCR2MVwpCisgNjA0OglmMDFmIGNiNDAgCXNoCVwkdjAsLTIwNDhcKFwkdjFcKQorIDYwODoJYzM0MCAgICAgIAlzYglcJHYwLDBcKFwkdjFcKQorIDYwYToJYzM0MSAgICAgIAlzYglcJHYwLDFcKFwkdjFcKQorIDYwYzoJYzM0MiAgICAgIAlzYglcJHYwLDJcKFwkdjFcKQorIDYwZToJYzM0MyAgICAgIAlzYglcJHYwLDNcKFwkdjFcKQorIDYxMDoJYzM0NCAgICAgIAlzYglcJHYwLDRcKFwkdjFcKQorIDYxMjoJYzM0OCAgICAgIAlzYglcJHYwLDhcKFwkdjFcKQorIDYxNDoJYzM1MCAgICAgIAlzYglcJHYwLDE2XChcJHYxXCkKKyA2MTY6CWYwMjAgYzM0MCAJc2IJXCR2MCwzMlwoXCR2MVwpCisgNjFhOglmMDQwIGMzNDAgCXNiCVwkdjAsNjRcKFwkdjFcKQorIDYxZToJZjA4MCBjMzQwIAlzYglcJHYwLDEyOFwoXCR2MVwpCisgNjIyOglmMTAwIGMzNDAgCXNiCVwkdjAsMjU2XChcJHYxXCkKKyA2MjY6CWYyMDAgYzM0MCAJc2IJXCR2MCw1MTJcKFwkdjFcKQorIDYyYToJZjQwMCBjMzQwIAlzYglcJHYwLDEwMjRcKFwkdjFcKQorIDYyZToJZjAwMSBjMzQwIAlzYglcJHYwLDIwNDhcKFwkdjFcKQorIDYzMjoJZjdmZiBjMzVmIAlzYglcJHYwLC0xXChcJHYxXCkKKyA2MzY6CWY3ZmYgYzM1ZSAJc2IJXCR2MCwtMlwoXCR2MVwpCisgNjNhOglmN2ZmIGMzNWQgCXNiCVwkdjAsLTNcKFwkdjFcKQorIDYzZToJZjdmZiBjMzVjIAlzYglcJHYwLC00XChcJHYxXCkKKyA2NDI6CWY3ZmYgYzM1OCAJc2IJXCR2MCwtOFwoXCR2MVwpCisgNjQ2OglmN2ZmIGMzNTAgCXNiCVwkdjAsLTE2XChcJHYxXCkKKyA2NGE6CWY3ZmYgYzM0MCAJc2IJXCR2MCwtMzJcKFwkdjFcKQorIDY0ZToJZjdkZiBjMzQwIAlzYglcJHYwLC02NFwoXCR2MVwpCisgNjUyOglmNzlmIGMzNDAgCXNiCVwkdjAsLTEyOFwoXCR2MVwpCisgNjU2OglmNzFmIGMzNDAgCXNiCVwkdjAsLTI1NlwoXCR2MVwpCisgNjVhOglmNjFmIGMzNDAgCXNiCVwkdjAsLTUxMlwoXCR2MVwpCisgNjVlOglmNDFmIGMzNDAgCXNiCVwkdjAsLTEwMjRcKFwkdjFcKQorIDY2MjoJZjAxZiBjMzQwIAlzYglcJHYwLC0yMDQ4XChcJHYxXCkKKyA2NjY6CTZhMDAgICAgICAJbGkJXCR2MCwwCisgNjY4Ogk2YTAxICAgICAgCWxpCVwkdjAsMQorIDY2YToJZjEwMCA2YTAwIAlsaQlcJHYwLDI1NgorIDY2ZToJNjc1ZSAgICAgIAltb3ZlCVwkdjAsXCRzOAorIDY3MDoJNjU5MiAgICAgIAltb3ZlCVwkczQsXCR2MAorIDY3MjoJNDM1MCAgICAgIAlkYWRkaXUJXCR2MCxcJHYxLDAKKyA2NzQ6CTQzNTEgICAgICAJZGFkZGl1CVwkdjAsXCR2MSwxCisgNjc2Ogk0MzVmICAgICAgCWRhZGRpdQlcJHYwLFwkdjEsLTEKKyA2Nzg6CWYwMTAgNDM1MCAJZGFkZGl1CVwkdjAsXCR2MSwxNgorIDY3YzoJZjdmZiA0MzUwIAlkYWRkaXUJXCR2MCxcJHYxLC0xNgorIDY4MDoJZTM4OCAgICAgIAlkYWRkdQlcJHYwLFwkdjEsXCRhMAorIDY4MjoJZmQ0MCAgICAgIAlkYWRkaXUJXCR2MCwwCisgNjg0OglmZDQxICAgICAgCWRhZGRpdQlcJHYwLDEKKyA2ODY6CWZkNWYgICAgICAJZGFkZGl1CVwkdjAsLTEKKyA2ODg6CWYwMjAgZmQ0MCAJZGFkZGl1CVwkdjAsMzIKKyA2OGM6CWY3ZmYgZmQ0MCAJZGFkZGl1CVwkdjAsLTMyCisgNjkwOglmMDgwIGZkNDAgCWRhZGRpdQlcJHYwLDEyOAorIDY5NDoJZjc5ZiBmZDQwIAlkYWRkaXUJXCR2MCwtMTI4CisgNjk4OglmMTdmIGZlNDggCWRsYQlcJHYwLDAgPGRhdGExPgorIDY5YzoJZjA4MCBmZTQwIAlkbGEJXCR2MCw3MWMgPGRhdGEyPgorIDZhMDoJZjFjMCBmZTQ4IAlkbGEJXCR2MCw4NjggPGJhcj4KKyA2YTQ6CWYyODAgZmU0YyAJZGxhCVwkdjAsOTMwIDxxdXV4PgorIDZhODoJZmIwMCAgICAgIAlkYWRkaXUJXCRzcCwwCisgNmFhOglmMDAwIGZiMDEgCWRhZGRpdQlcJHNwLDEKKyA2YWU6CWY3ZmYgZmIxZiAJZGFkZGl1CVwkc3AsLTEKKyA2YjI6CWZiMjAgICAgICAJZGFkZGl1CVwkc3AsMjU2CisgNmI0OglmYmUwICAgICAgCWRhZGRpdQlcJHNwLC0yNTYKKyA2YjY6CWZmNDAgICAgICAJZGFkZGl1CVwkdjAsXCRzcCwwCisgNmI4OglmMDAwIGZmNDEgCWRhZGRpdQlcJHYwLFwkc3AsMQorIDZiYzoJZjdmZiBmZjVmIAlkYWRkaXUJXCR2MCxcJHNwLC0xCisgNmMwOglmZjQ4ICAgICAgCWRhZGRpdQlcJHYwLFwkc3AsMzIKKyA2YzI6CWY3ZmYgZmY0MCAJZGFkZGl1CVwkdjAsXCRzcCwtMzIKKyA2YzY6CWYwODAgZmY0MCAJZGFkZGl1CVwkdjAsXCRzcCwxMjgKKyA2Y2E6CWY3OWYgZmY0MCAJZGFkZGl1CVwkdjAsXCRzcCwtMTI4CisgNmNlOgk0MzQwICAgICAgCWFkZGl1CVwkdjAsXCR2MSwwCisgNmQwOgk0MzQxICAgICAgCWFkZGl1CVwkdjAsXCR2MSwxCisgNmQyOgk0MzRmICAgICAgCWFkZGl1CVwkdjAsXCR2MSwtMQorIDZkNDoJZjAxMCA0MzQwIAlhZGRpdQlcJHYwLFwkdjEsMTYKKyA2ZDg6CWY3ZmYgNDM0MCAJYWRkaXUJXCR2MCxcJHYxLC0xNgorIDZkYzoJZTM4OSAgICAgIAlhZGR1CVwkdjAsXCR2MSxcJGEwCisgNmRlOgk0YTAwICAgICAgCWFkZGl1CVwkdjAsMAorIDZlMDoJNGEwMSAgICAgIAlhZGRpdQlcJHYwLDEKKyA2ZTI6CTRhZmYgICAgICAJYWRkaXUJXCR2MCwtMQorIDZlNDoJNGEyMCAgICAgIAlhZGRpdQlcJHYwLDMyCisgNmU2Ogk0YWUwICAgICAgCWFkZGl1CVwkdjAsLTMyCisgNmU4OglmMDgwIDRhMDAgCWFkZGl1CVwkdjAsMTI4CisgNmVjOgk0YTgwICAgICAgCWFkZGl1CVwkdjAsLTEyOAorIDZlZToJZjExZiAwYTE0IAlsYQlcJHYwLDAgPGRhdGExPgorIDZmMjoJMGEwYiAgICAgIAlsYQlcJHYwLDcxYyA8ZGF0YTI+CisgNmY0OgkwYTVkICAgICAgCWxhCVwkdjAsODY4IDxiYXI+CisgNmY2OgkwYThmICAgICAgCWxhCVwkdjAsOTMwIDxxdXV4PgorIDZmODoJNjMwMCAgICAgIAlhZGRpdQlcJHNwLDAKKyA2ZmE6CWYwMDAgNjMwMSAJYWRkaXUJXCRzcCwxCisgNmZlOglmN2ZmIDYzMWYgCWFkZGl1CVwkc3AsLTEKKyA3MDI6CTYzMjAgICAgICAJYWRkaXUJXCRzcCwyNTYKKyA3MDQ6CTYzZTAgICAgICAJYWRkaXUJXCRzcCwtMjU2CisgNzA2OgkwMjAwICAgICAgCWFkZGl1CVwkdjAsXCRzcCwwCisgNzA4OglmMDAwIDAyMDEgCWFkZGl1CVwkdjAsXCRzcCwxCisgNzBjOglmN2ZmIDAyMWYgCWFkZGl1CVwkdjAsXCRzcCwtMQorIDcxMDoJMDIwOCAgICAgIAlhZGRpdQlcJHYwLFwkc3AsMzIKKyA3MTI6CWY3ZmYgMDIwMCAJYWRkaXUJXCR2MCxcJHNwLC0zMgorIDcxNjoJMDIyMCAgICAgIAlhZGRpdQlcJHYwLFwkc3AsMTI4CisgNzE4OglmNzlmIDAyMDAgCWFkZGl1CVwkdjAsXCRzcCwtMTI4CisKKzArMDAwNzFjIDxkYXRhMj46CisgNzFjOgkwMDAwMDAwMCAJbm9wCisKKzArMDAwNzIwIDxpbnNuczI+OgorIDcyMDoJZTM4YSAgICAgIAlkc3VidQlcJHYwLFwkdjEsXCRhMAorIDcyMjoJZTM4YiAgICAgIAlzdWJ1CVwkdjAsXCR2MSxcJGEwCisgNzI0OgllYTZiICAgICAgCW5lZwlcJHYwLFwkdjEKKyA3MjY6CWVhNmMgICAgICAJYW5kCVwkdjAsXCR2MQorIDcyODoJZWE2ZCAgICAgIAlvcglcJHYwLFwkdjEKKyA3MmE6CWVhNmUgICAgICAJeG9yCVwkdjAsXCR2MQorIDcyYzoJZWE2ZiAgICAgIAlub3QJXCR2MCxcJHYxCisgNzJlOgk1MjAwICAgICAgCXNsdGkJXCR2MCwwCisgNzMwOgk1MjAxICAgICAgCXNsdGkJXCR2MCwxCisgNzMyOglmN2ZmIDUyMWYgCXNsdGkJXCR2MCwtMQorIDczNjoJNTJmZiAgICAgIAlzbHRpCVwkdjAsMjU1CisgNzM4OglmMTAwIDUyMDAgCXNsdGkJXCR2MCwyNTYKKyA3M2M6CWVhNjIgICAgICAJc2x0CVwkdjAsXCR2MQorIDczZToJNWEwMCAgICAgIAlzbHRpdQlcJHYwLDAKKyA3NDA6CTVhMDEgICAgICAJc2x0aXUJXCR2MCwxCisgNzQyOglmN2ZmIDVhMWYgCXNsdGl1CVwkdjAsLTEKKyA3NDY6CTVhZmYgICAgICAJc2x0aXUJXCR2MCwyNTUKKyA3NDg6CWYxMDAgNWEwMCAJc2x0aXUJXCR2MCwyNTYKKyA3NGM6CWVhNjMgICAgICAJc2x0dQlcJHYwLFwkdjEKKyA3NGU6CTcyMDAgICAgICAJY21waQlcJHYwLDAKKyA3NTA6CTcyMDEgICAgICAJY21waQlcJHYwLDEKKyA3NTI6CTcyZmYgICAgICAJY21waQlcJHYwLDI1NQorIDc1NDoJZjEwMCA3MjAwIAljbXBpCVwkdjAsMjU2CisgNzU4OgllYTZhICAgICAgCWNtcAlcJHYwLFwkdjEKKyA3NWE6CWYwMDAgMzI2MSAJZHNsbAlcJHYwLFwkdjEsMAorIDc1ZToJMzI2NSAgICAgIAlkc2xsCVwkdjAsXCR2MSwxCisgNzYwOgkzMjYxICAgICAgCWRzbGwJXCR2MCxcJHYxLDgKKyA3NjI6CWYyNDAgMzI2MSAJZHNsbAlcJHYwLFwkdjEsOQorIDc2NjoJZjdlMCAzMjYxIAlkc2xsCVwkdjAsXCR2MSw2MworIDc2YToJZWI1NCAgICAgIAlkc2xsdglcJHYwLFwkdjEKKyA3NmM6CWYwMDAgZTg0OCAJZHNybAlcJHYwLDAKKyA3NzA6CWU5NDggICAgICAJZHNybAlcJHYwLDEKKyA3NzI6CWU4NDggICAgICAJZHNybAlcJHYwLDgKKyA3NzQ6CWYyNDAgZTg0OCAJZHNybAlcJHYwLDkKKyA3Nzg6CWY3ZTAgZTg0OCAJZHNybAlcJHYwLDYzCisgNzdjOgllYjU2ICAgICAgCWRzcmx2CVwkdjAsXCR2MQorIDc3ZToJZjAwMCBlODUzIAlkc3JhCVwkdjAsMAorIDc4MjoJZTk1MyAgICAgIAlkc3JhCVwkdjAsMQorIDc4NDoJZTg1MyAgICAgIAlkc3JhCVwkdjAsOAorIDc4NjoJZjI0MCBlODUzIAlkc3JhCVwkdjAsOQorIDc4YToJZjdlMCBlODUzIAlkc3JhCVwkdjAsNjMKKyA3OGU6CWViNTcgICAgICAJZHNyYXYJXCR2MCxcJHYxCisgNzkwOgllYTEyICAgICAgCW1mbG8JXCR2MAorIDc5MjoJZWIxMCAgICAgIAltZmhpCVwkdjEKKyA3OTQ6CWYwMDAgMzI2MCAJc2xsCVwkdjAsXCR2MSwwCisgNzk4OgkzMjY0ICAgICAgCXNsbAlcJHYwLFwkdjEsMQorIDc5YToJMzI2MCAgICAgIAlzbGwJXCR2MCxcJHYxLDgKKyA3OWM6CWYyNDAgMzI2MCAJc2xsCVwkdjAsXCR2MSw5CisgN2EwOglmN2MwIDMyNjAgCXNsbAlcJHYwLFwkdjEsMzEKKyA3YTQ6CWViNDQgICAgICAJc2xsdglcJHYwLFwkdjEKKyA3YTY6CWYwMDAgMzI2MiAJc3JsCVwkdjAsXCR2MSwwCisgN2FhOgkzMjY2ICAgICAgCXNybAlcJHYwLFwkdjEsMQorIDdhYzoJMzI2MiAgICAgIAlzcmwJXCR2MCxcJHYxLDgKKyA3YWU6CWYyNDAgMzI2MiAJc3JsCVwkdjAsXCR2MSw5CisgN2IyOglmN2MwIDMyNjIgCXNybAlcJHYwLFwkdjEsMzEKKyA3YjY6CWViNDYgICAgICAJc3JsdglcJHYwLFwkdjEKKyA3Yjg6CWYwMDAgMzI2MyAJc3JhCVwkdjAsXCR2MSwwCisgN2JjOgkzMjY3ICAgICAgCXNyYQlcJHYwLFwkdjEsMQorIDdiZToJMzI2MyAgICAgIAlzcmEJXCR2MCxcJHYxLDgKKyA3YzA6CWYyNDAgMzI2MyAJc3JhCVwkdjAsXCR2MSw5CisgN2M0OglmN2MwIDMyNjMgCXNyYQlcJHYwLFwkdjEsMzEKKyA3Yzg6CWViNDcgICAgICAJc3JhdglcJHYwLFwkdjEKKyA3Y2E6CWVhN2MgICAgICAJZG11bHQJXCR2MCxcJHYxCisgN2NjOgllYTdkICAgICAgCWRtdWx0dQlcJHYwLFwkdjEKKyA3Y2U6CWVhN2UgICAgICAJZGRpdglcJHplcm8sXCR2MCxcJHYxCisgN2QwOgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZDQgPGluc25zMlwrKDB4fCliND4KKyA3ZDI6CWU4ZTUgICAgICAJYnJlYWsJNworIDdkNDoJZWExMiAgICAgIAltZmxvCVwkdjAKKyA3ZDY6CTY1MDAgICAgICAJbm9wCisgN2Q4Ogk2NTAwICAgICAgCW5vcAorIDdkYToJZWE3ZiAgICAgIAlkZGl2dQlcJHplcm8sXCR2MCxcJHYxCisgN2RjOgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZTAgPGluc25zMlwrKDB4fCljMD4KKyA3ZGU6CWU4ZTUgICAgICAJYnJlYWsJNworIDdlMDoJZWExMiAgICAgIAltZmxvCVwkdjAKKyA3ZTI6CTY1MDAgICAgICAJbm9wCisgN2U0Ogk2NTAwICAgICAgCW5vcAorIDdlNjoJZWE3OCAgICAgIAltdWx0CVwkdjAsXCR2MQorIDdlODoJZWE3OSAgICAgIAltdWx0dQlcJHYwLFwkdjEKKyA3ZWE6CWVhN2EgICAgICAJZGl2CVwkemVybyxcJHYwLFwkdjEKKyA3ZWM6CTJiMDEgICAgICAJYm5leglcJHYxLDdmMCA8aW5zbnMyXCsoMHh8KWQwPgorIDdlZToJZThlNSAgICAgIAlicmVhawk3CisgN2YwOgllYTEyICAgICAgCW1mbG8JXCR2MAorIDdmMjoJNjUwMCAgICAgIAlub3AKKyA3ZjQ6CTY1MDAgICAgICAJbm9wCisgN2Y2OgllYTdiICAgICAgCWRpdnUJXCR6ZXJvLFwkdjAsXCR2MQorIDdmODoJMmIwMSAgICAgIAlibmV6CVwkdjEsN2ZjIDxpbnNuczJcKygweHwpZGM+CisgN2ZhOgllOGU1ICAgICAgCWJyZWFrCTcKKyA3ZmM6CWVhMTIgICAgICAJbWZsbwlcJHYwCisgN2ZlOgllYTAwICAgICAgCWpyCVwkdjAKKyA4MDA6CTY1MDAgICAgICAJbm9wCisgODAyOgllODIwICAgICAgCWpyCVwkcmEKKyA4MDQ6CTY1MDAgICAgICAJbm9wCisgODA2OgllYTQwICAgICAgCWphbHIJXCR2MAorIDgwODoJNjUwMCAgICAgIAlub3AKKyA4MGE6CWYzZmYgMjIxYiAJYmVxeglcJHYwLDQgPGluc25zMT4KKyA4MGU6CTIyODggICAgICAJYmVxeglcJHYwLDcyMCA8aW5zbnMyPgorIDgxMDoJMjIyYiAgICAgIAliZXF6CVwkdjAsODY4IDxiYXI+CisgODEyOglmMDgwIDIyMGQgCWJlcXoJXCR2MCw5MzAgPHF1dXg+CisgODE2OglmM2ZmIDJhMTUgCWJuZXoJXCR2MCw0IDxpbnNuczE+CisgODFhOgkyYTgyICAgICAgCWJuZXoJXCR2MCw3MjAgPGluc25zMj4KKyA4MWM6CTJhMjUgICAgICAJYm5leglcJHYwLDg2OCA8YmFyPgorIDgxZToJZjA4MCAyYTA3IAlibmV6CVwkdjAsOTMwIDxxdXV4PgorIDgyMjoJZjNmZiA2MDBmIAlidGVxegk0IDxpbnNuczE+CisgODI2OglmNzdmIDYwMWIgCWJ0ZXF6CTcyMCA8aW5zbnMyPgorIDgyYToJNjAxZSAgICAgIAlidGVxegk4NjggPGJhcj4KKyA4MmM6CWYwODAgNjAwMCAJYnRlcXoJOTMwIDxxdXV4PgorIDgzMDoJZjNmZiA2MTA4IAlidG5legk0IDxpbnNuczE+CisgODM0OglmNzdmIDYxMTQgCWJ0bmV6CTcyMCA8aW5zbnMyPgorIDgzODoJNjExNyAgICAgIAlidG5legk4NjggPGJhcj4KKyA4M2E6CTYxN2EgICAgICAJYnRuZXoJOTMwIDxxdXV4PgorIDgzYzoJZjNmZiAxMDAyIAliCTQgPGluc25zMT4KKyA4NDA6CTE3NmYgICAgICAJYgk3MjAgPGluc25zMj4KKyA4NDI6CTEwMTIgICAgICAJYgk4NjggPGJhcj4KKyA4NDQ6CTEwNzUgICAgICAJYgk5MzAgPHF1dXg+CisgODQ2OgllODA1ICAgICAgCWJyZWFrCTAKKyA4NDg6CWU4MjUgICAgICAJYnJlYWsJMQorIDg0YToJZWZlNSAgICAgIAlicmVhawk2MworIDg0YzoJMTgwMCAwMDAwIAlqYWwJMCA8ZGF0YTE+CisJCQk4NGM6IFJfTUlQUzE2XzI2CWV4dGVybgorIDg1MDoJNjUwMCAgICAgIAlub3AKKyA4NTI6CWU4MDkgICAgICAJZW50cnkJCisgODU0OgllOTA5ICAgICAgCWVudHJ5CVwkYTAKKyA4NTY6CWViNDkgICAgICAJZW50cnkJXCRhMC1cJGEyLFwkczAKKyA4NTg6CWU4YTkgICAgICAJZW50cnkJXCRzMC1cJHMxLFwkcmEKKyA4NWE6CWU4MjkgICAgICAJZW50cnkJXCRyYQorIDg1YzoJZWYwOSAgICAgIAlleGl0CQorIDg1ZToJZWY0OSAgICAgIAlleGl0CVwkczAKKyA4NjA6CWVmYTkgICAgICAJZXhpdAlcJHMwLVwkczEsXCRyYQorIDg2MjoJZWYyOSAgICAgIAlleGl0CVwkcmEKKyA4NjQ6CTAwMDAgICAgICAJYWRkaXUJXCRzMCxcJHNwLDAKKwkuLi4KKworMCswMDA4NjggPGJhcj46CisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY4ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYucwpAQCAtMCwwICsxLDI1OCBAQAorIyBUZXN0IHRoZSBtaXBzMTYgaW5zdHJ1Y3Rpb24gc2V0LgorCisJLnNldAltaXBzMTYKKworCS5tYWNybwlsZHN0IG9wLCByZWcsIGJhc2UKKwlcb3AJXHJlZywwKFxiYXNlKQorCVxvcAlccmVnLDEoXGJhc2UpCisJXG9wCVxyZWcsMihcYmFzZSkKKwlcb3AJXHJlZywzKFxiYXNlKQorCVxvcAlccmVnLDQoXGJhc2UpCisJXG9wCVxyZWcsOChcYmFzZSkKKwlcb3AJXHJlZywxNihcYmFzZSkKKwlcb3AJXHJlZywzMihcYmFzZSkKKwlcb3AJXHJlZyw2NChcYmFzZSkKKwlcb3AJXHJlZywxMjgoXGJhc2UpCisJXG9wCVxyZWcsMjU2KFxiYXNlKQorCVxvcAlccmVnLDUxMihcYmFzZSkKKwlcb3AJXHJlZywxMDI0KFxiYXNlKQorCVxvcAlccmVnLDIwNDgoXGJhc2UpCisJXG9wCVxyZWcsLTEoXGJhc2UpCisJXG9wCVxyZWcsLTIoXGJhc2UpCisJXG9wCVxyZWcsLTMoXGJhc2UpCisJXG9wCVxyZWcsLTQoXGJhc2UpCisJXG9wCVxyZWcsLTgoXGJhc2UpCisJXG9wCVxyZWcsLTE2KFxiYXNlKQorCVxvcAlccmVnLC0zMihcYmFzZSkKKwlcb3AJXHJlZywtNjQoXGJhc2UpCisJXG9wCVxyZWcsLTEyOChcYmFzZSkKKwlcb3AJXHJlZywtMjU2KFxiYXNlKQorCVxvcAlccmVnLC01MTIoXGJhc2UpCisJXG9wCVxyZWcsLTEwMjQoXGJhc2UpCisJXG9wCVxyZWcsLTIwNDgoXGJhc2UpCisJLmVuZG0KKworCS5wMmFsaWduIDMKK2RhdGExOgorCS53b3JkCTAKK2luc25zMToKKwlsZHN0CWxkLCAkMiwgJDMKKwlsZAkkMixkYXRhMQorCWxkCSQyLGRhdGEyCisJbGQJJDIsYmFyCisJbGQJJDIscXV1eAorCWxkc3QJbGQsICQyLCAkc3AKKwlsZHN0CWx3dSwgJDIsICQzCisJbGRzdAlsdywgJDIsICQzCisJbHcJJDIsZGF0YTEKKwlsdwkkMixkYXRhMgorCWx3CSQyLGJhcgorCWx3CSQyLHF1dXgKKwlsZHN0CWx3LCAkMiwgJHNwCisJbGRzdAlsaCwgJDIsICQzCisJbGRzdAlsaHUsICQyLCAkMworCWxkc3QJbGIsICQyLCAkMworCWxkc3QJbGJ1LCAkMiwgJDMKKwlsZHN0CXNkLCAkMiwgJDMKKwlsZHN0CXNkLCAkMiwgJHNwCisJbGRzdAlzZCwgJDMxLCAkc3AKKwlsZHN0CXN3LCAkMiwgJDMKKwlsZHN0CXN3LCAkMiwgJHNwCisJbGRzdAlzdywgJDMxLCAkc3AKKwlsZHN0CXNoLCAkMiwgJDMKKwlsZHN0CXNiLCAkMiwgJDMKKworCWxpCSQyLDAKKwlsaQkkMiwxCisJbGkJJDIsMjU2CisKKwltb3ZlCSQyLCQzMAorCW1vdmUJJDIwLCQyCisKKwlkYWRkdQkkMiwkMywwCisJZGFkZHUJJDIsJDMsMQorCWRhZGR1CSQyLCQzLC0xCisJZGFkZHUJJDIsJDMsMTYKKwlkYWRkdQkkMiwkMywtMTYKKwlkYWRkdQkkMiwkMywkNAorCWRhZGR1CSQyLDAKKwlkYWRkdQkkMiwxCisJZGFkZHUJJDIsLTEKKwlkYWRkdQkkMiwzMgorCWRhZGR1CSQyLC0zMgorCWRhZGR1CSQyLDEyOAorCWRhZGR1CSQyLC0xMjgKKwlkbGEJJDIsZGF0YTEKKwlkbGEJJDIsZGF0YTIKKwlkbGEJJDIsYmFyCisJZGxhCSQyLHF1dXgKKwlkYWRkdQkkc3AsMAorCWRhZGR1CSRzcCwxCisJZGFkZHUJJHNwLC0xCisJZGFkZHUJJHNwLDI1NgorCWRhZGR1CSRzcCwtMjU2CisJZGFkZHUJJDIsJHNwLDAKKwlkYWRkdQkkMiwkc3AsMQorCWRhZGR1CSQyLCRzcCwtMQorCWRhZGR1CSQyLCRzcCwzMgorCWRhZGR1CSQyLCRzcCwtMzIKKwlkYWRkdQkkMiwkc3AsMTI4CisJZGFkZHUJJDIsJHNwLC0xMjgKKworCWFkZHUJJDIsJDMsMAorCWFkZHUJJDIsJDMsMQorCWFkZHUJJDIsJDMsLTEKKwlhZGR1CSQyLCQzLDE2CisJYWRkdQkkMiwkMywtMTYKKwlhZGR1CSQyLCQzLCQ0CisJYWRkdQkkMiwwCisJYWRkdQkkMiwxCisJYWRkdQkkMiwtMQorCWFkZHUJJDIsMzIKKwlhZGR1CSQyLC0zMgorCWFkZHUJJDIsMTI4CisJYWRkdQkkMiwtMTI4CisJbGEJJDIsZGF0YTEKKwlsYQkkMixkYXRhMgorCWxhCSQyLGJhcgorCWxhCSQyLHF1dXgKKwlhZGR1CSRzcCwwCisJYWRkdQkkc3AsMQorCWFkZHUJJHNwLC0xCisJYWRkdQkkc3AsMjU2CisJYWRkdQkkc3AsLTI1NgorCWFkZHUJJDIsJHNwLDAKKwlhZGR1CSQyLCRzcCwxCisJYWRkdQkkMiwkc3AsLTEKKwlhZGR1CSQyLCRzcCwzMgorCWFkZHUJJDIsJHNwLC0zMgorCWFkZHUJJDIsJHNwLDEyOAorCWFkZHUJJDIsJHNwLC0xMjgKKworZGF0YTI6CisJLndvcmQJMAoraW5zbnMyOgkKKwlkc3VidQkkMiwkMywkNAorCXN1YnUJJDIsJDMsJDQKKwluZWcJJDIsJDMKKworCWFuZAkkMiwkMworCW9yCSQyLCQzCisJeG9yCSQyLCQzCisJbm90CSQyLCQzCisKKwlzbHQJJDIsMAorCXNsdAkkMiwxCisJc2x0CSQyLC0xCisJc2x0CSQyLDI1NQorCXNsdAkkMiwyNTYKKwlzbHQJJDIsJDMKKwlzbHR1CSQyLDAKKwlzbHR1CSQyLDEKKwlzbHR1CSQyLC0xCisJc2x0dQkkMiwyNTUKKwlzbHR1CSQyLDI1NgorCXNsdHUJJDIsJDMKKwljbXAJJDIsMAorCWNtcAkkMiwxCisJY21wCSQyLDI1NQorCWNtcAkkMiwyNTYKKwljbXAJJDIsJDMKKworCWRzbGwJJDIsJDMsMAorCWRzbGwJJDIsJDMsMQorCWRzbGwJJDIsJDMsOAorCWRzbGwJJDIsJDMsOQorCWRzbGwJJDIsJDMsNjMKKwlkc2xsCSQyLCQzCisJZHNybAkkMiwwCisJZHNybAkkMiwxCisJZHNybAkkMiw4CisJZHNybAkkMiw5CisJZHNybAkkMiw2MworCWRzcmwJJDIsJDMKKwlkc3JhCSQyLDAKKwlkc3JhCSQyLDEKKwlkc3JhCSQyLDgKKwlkc3JhCSQyLDkKKwlkc3JhCSQyLDYzCisJZHNyYQkkMiwkMworCisJbWZsbwkkMgorCW1maGkJJDMKKworCXNsbAkkMiwkMywwCisJc2xsCSQyLCQzLDEKKwlzbGwJJDIsJDMsOAorCXNsbAkkMiwkMyw5CisJc2xsCSQyLCQzLDMxCisJc2xsCSQyLCQzCisJc3JsCSQyLCQzLDAKKwlzcmwJJDIsJDMsMQorCXNybAkkMiwkMyw4CisJc3JsCSQyLCQzLDkKKwlzcmwJJDIsJDMsMzEKKwlzcmwJJDIsJDMKKwlzcmEJJDIsJDMsMAorCXNyYQkkMiwkMywxCisJc3JhCSQyLCQzLDgKKwlzcmEJJDIsJDMsOQorCXNyYQkkMiwkMywzMQorCXNyYQkkMiwkMworCisJZG11bHQJJDIsJDMKKwlkbXVsdHUJJDIsJDMKKwlkZGl2CSQyLCQzCisJZGRpdnUJJDIsJDMKKworCW11bHQJJDIsJDMKKwltdWx0dQkkMiwkMworCWRpdgkkMiwkMworCWRpdnUJJDIsJDMKKworCWpyCSQyCisJanIJJDMxCisJamFscgkkMzEsJDIKKworCWJlcXoJJDIsaW5zbnMxCisJYmVxegkkMixpbnNuczIKKwliZXF6CSQyLGJhcgorCWJlcXoJJDIscXV1eAorCWJuZXoJJDIsaW5zbnMxCisJYm5legkkMixpbnNuczIKKwlibmV6CSQyLGJhcgorCWJuZXoJJDIscXV1eAorCWJ0ZXF6CWluc25zMQorCWJ0ZXF6CWluc25zMgorCWJ0ZXF6CWJhcgorCWJ0ZXF6CXF1dXgKKwlidG5leglpbnNuczEKKwlidG5leglpbnNuczIKKwlidG5legliYXIKKwlidG5leglxdXV4CisJYglpbnNuczEKKwliCWluc25zMgorCWIJYmFyCisJYglxdXV4CisKKwlicmVhawkwCisJYnJlYWsJMQorCWJyZWFrCTYzCisKKwlqYWwJZXh0ZXJuCisKKwllbnRyeQorCWVudHJ5CSQ0CisJZW50cnkJJDQtJDYsJDE2CisJZW50cnkJJDE2LSQxNywkMzEKKwllbnRyeQkkMzEKKwlleGl0CisJZXhpdAkkMTYKKwlleGl0CSQxNi0kMTcsJDMxCisJZXhpdAkkMzEKKworCS5wMmFsaWduIDMKK2JhcjoJCisKKwkuc2tpcAkyMDAKK3F1dXg6CQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmRlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LmQKQEAgLTAsMCArMSw1MSBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjUwMDAKKyNuYW1lOiBNSVBTIG1pcHM0CisjYXM6IC1taXBzNCAtbWNwdT1yNTAwMAorCisjIFRlc3QgdGhlIG1pcHM0IG1hY3Jvcy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gYmMxZgkwMDAwMDAwMCsgPHRleHRfbGFiZWw+CiswKzAwMDQgPFtePl0qPiBub3AKKzArMDAwOCA8W14+XSo+IGJjMWYJXCRmY2MxLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KKzArMDAwYyA8W14+XSo+IG5vcAorMCswMDEwIDxbXj5dKj4gYmMxZmwJXCRmY2MxLDAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KKzArMDAxNCA8W14+XSo+IG5vcAorMCswMDE4IDxbXj5dKj4gYmMxdAlcJGZjYzEsMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgorMCswMDFjIDxbXj5dKj4gbm9wCiswKzAwMjAgPFtePl0qPiBiYzF0bAlcJGZjYzIsMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgorMCswMDI0IDxbXj5dKj4gbm9wCiswKzAwMjggPFtePl0qPiBjLmYuZAlcJGY0LFwkZjYKKzArMDAyYyA8W14+XSo+IGMuZi5kCVwkZmNjMSxcJGY0LFwkZjYKKzArMDAzMCA8W14+XSo+IGxkeGMxCVwkZjIsXCRhMFwoXCRhMVwpCiswKzAwMzQgPFtePl0qPiBsd3hjMQlcJGYyLFwkYTBcKFwkYTFcKQorMCswMDM4IDxbXj5dKj4gbWFkZC5kCVwkZjAsXCRmMixcJGY0LFwkZjYKKzArMDAzYyA8W14+XSo+IG1hZGQucwlcJGYwLFwkZjIsXCRmNCxcJGY2CiswKzAwNDAgPFtePl0qPiBtb3ZmCVwkYTAsXCRhMSxcJGZjYzQKKzArMDA0NCA8W14+XSo+IG1vdmYuZAlcJGY0LFwkZjYsXCRmY2MwCiswKzAwNDggPFtePl0qPiBtb3ZmLnMJXCRmNCxcJGY2LFwkZmNjMAorMCswMDRjIDxbXj5dKj4gbW92bglcJGEwLFwkYTIsXCRhMgorMCswMDUwIDxbXj5dKj4gbW92bi5kCVwkZjQsXCRmNSxcJGEyCiswKzAwNTQgPFtePl0qPiBtb3ZuLnMJXCRmNCxcJGY1LFwkYTIKKzArMDA1OCA8W14+XSo+IG1vdnQJXCRhMCxcJGExLFwkZmNjNAorMCswMDVjIDxbXj5dKj4gbW92dC5kCVwkZjQsXCRmNixcJGZjYzAKKzArMDA2MCA8W14+XSo+IG1vdnQucwlcJGY0LFwkZjYsXCRmY2MwCiswKzAwNjQgPFtePl0qPiBtb3Z6CVwkYTAsXCRhMixcJGEyCiswKzAwNjggPFtePl0qPiBtb3Z6LmQJXCRmNCxcJGY1LFwkYTIKKzArMDA2YyA8W14+XSo+IG1vdnoucwlcJGY0LFwkZjUsXCRhMgorMCswMDcwIDxbXj5dKj4gbXN1Yi5kCVwkZjAsXCRmMixcJGY0LFwkZjYKKzArMDA3NCA8W14+XSo+IG1zdWIucwlcJGYwLFwkZjIsXCRmNCxcJGY2CiswKzAwNzggPFtePl0qPiBubWFkZC5kCVwkZjAsXCRmMixcJGY0LFwkZjYKKzArMDA3YyA8W14+XSo+IG5tYWRkLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgorMCswMDgwIDxbXj5dKj4gbm1zdWIuZAlcJGYwLFwkZjIsXCRmNCxcJGY2CiswKzAwODQgPFtePl0qPiBubXN1Yi5zCVwkZjAsXCRmMixcJGY0LFwkZjYKKzArMDA4OCA8W14+XSo+IHByZWZ4CTB4NCxcJGEwXChcJGExXCkKKzArMDA4YyA8W14+XSo+IHJlY2lwLmQJXCRmNCxcJGY2CiswKzAwOTAgPFtePl0qPiByZWNpcC5zCVwkZjQsXCRmNgorMCswMDk0IDxbXj5dKj4gcnNxcnQuZAlcJGY0LFwkZjYKKzArMDA5OCA8W14+XSo+IHJzcXJ0LnMJXCRmNCxcJGY2CiswKzAwOWMgPFtePl0qPiBzZHhjMQlcJGY0LFwkYTBcKFwkYTFcKQorMCswMGEwIDxbXj5dKj4gc3d4YzEJXCRmNCxcJGEwXChcJGExXCkKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjhiOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5zCkBAIC0wLDAgKzEsNTIgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IC1taXBzNCBpbnN0cnVjdGlvbnMuCisKK3RleHRfbGFiZWw6CQorCWJjMWYJdGV4dF9sYWJlbAorCWJjMWYJJGZjYzEsdGV4dF9sYWJlbAorCWJjMWZsCSRmY2MxLHRleHRfbGFiZWwKKwliYzF0CSRmY2MxLHRleHRfbGFiZWwKKwliYzF0bAkkZmNjMix0ZXh0X2xhYmVsCisJYy5mLmQJJGY0LCRmNgorCWMuZi5kCSRmY2MxLCRmNCwkZjYKKwlsZHhjMQkkZjIsJDQoJDUpCisJbHd4YzEJJGYyLCQ0KCQ1KQorCW1hZGQuZAkkZjAsJGYyLCRmNCwkZjYKKwltYWRkLnMJJGYwLCRmMiwkZjQsJGY2CisJbW92ZgkkNCwkNSwkZmNjNAorCW1vdmYuZAkkZjQsJGY2LCRmY2MwCisJbW92Zi5zCSRmNCwkZjYsJGZjYzAKKwltb3ZuCSQ0LCQ2LCQ2CisJbW92bi5kCSRmNCwkZjUsJDYKKwltb3ZuLnMJJGY0LCRmNSwkNgorCW1vdnQJJDQsJDUsJGZjYzQKKwltb3Z0LmQJJGY0LCRmNiwkZmNjMAorCW1vdnQucwkkZjQsJGY2LCRmY2MwCisJbW92egkkNCwkNiwkNgorCW1vdnouZAkkZjQsJGY1LCQ2CisJbW92ei5zCSRmNCwkZjUsJDYKKwltc3ViLmQJJGYwLCRmMiwkZjQsJGY2CisJbXN1Yi5zCSRmMCwkZjIsJGY0LCRmNgorCW5tYWRkLmQJJGYwLCRmMiwkZjQsJGY2CisJbm1hZGQucwkkZjAsJGYyLCRmNCwkZjYKKwlubXN1Yi5kCSRmMCwkZjIsJGY0LCRmNgorCW5tc3ViLnMJJGYwLCRmMiwkZjQsJGY2CisKKwkjIFdlIGRvbid0IHRlc3QgcHJlZiBiZWNhdXNlIGN1cnJlbnRseSB0aGUgZGlzYXNzZW1ibGVyIHdpbGwKKwkjIGRpc2Fzc2VtYmxlIGl0IGFzIGx3YzMuICBsd2MzIGlzIGNvcnJlY3QgZm9yIG1pcHMxIHRvIG1pcHMzLAorCSMgd2hpbGUgcHJlZiBpcyBjb3JyZWN0IGZvciBtaXBzNC4gIFVuZm9ydHVuYXRlbHksIHRoZQorCSMgZGlzYXNzZW1ibGVyIGRvZXMgbm90IGtub3cgd2hpY2ggYXJjaGl0ZWN0dXJlIGl0IGlzCisJIyBkaXNhc3NlbWJsaW5nIGZvci4KKwkjIHByZWYJNCwwKCQ0KQorCisJcHJlZngJNCwkNCgkNSkKKwlyZWNpcC5kCSRmNCwkZjYKKwlyZWNpcC5zCSRmNCwkZjYKKwlyc3FydC5kCSRmNCwkZjYKKwlyc3FydC5zCSRmNCwkZjYKKwlzZHhjMQkkZjQsJDQoJDUpCisJc3d4YzEJJGY0LCQ0KCQ1KQorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGUxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLmQKQEAgLTAsMCArMSwyMyBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMTAKKyNuYW1lOiBNSVBTIDQwMTAKKyNhczogLW1jcHU9NDAxMAorCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6CiswKzAwMDAgPHN0dWZmPiBmbHVzaGkKKzArMDAwNCA8c3R1ZmZcKzB4ND4gZmx1c2hkCiswKzAwMDggPHN0dWZmXCsweDg+IGZsdXNoaWQKKzArMDAwYyA8c3R1ZmZcKzB4Yz4gbWFkZAlcJGEwLFwkYTEKKzArMDAxMCA8c3R1ZmZcKzB4MTA+IG1hZGR1CVwkYTEsXCRhMgorMCswMDE0IDxzdHVmZlwrMHgxND4gZmZjCVwkYTIsXCRhMworMCswMDE4IDxzdHVmZlwrMHgxOD4gZmZzCVwkYTMsXCR0MAorMCswMDFjIDxzdHVmZlwrMHgxYz4gbXN1YglcJHQwLFwkdDEKKzArMDAyMCA8c3R1ZmZcKzB4MjA+IG1zdWJ1CVwkdDEsXCR0MgorMCswMDI0IDxzdHVmZlwrMHgyND4gc2Vsc2wJXCR0MixcJHQzLFwkdDQKKzArMDAyOCA8c3R1ZmZcKzB4Mjg+IHNlbHNyCVwkdDMsXCR0NCxcJHQ1CiswKzAwMmMgPHN0dWZmXCsweDJjPiB3YWl0aQorMCswMDMwIDxzdHVmZlwrMHgzMD4gd2IJMTZcKFwkdDZcKQorMCswMDM0IDxzdHVmZlwrMHgzND4gYWRkY2l1CVwkdDYsXCR0NywxNgorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDZlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLnMKQEAgLTAsMCArMSwyMCBAQAorCS50ZXh0CisKK3N0dWZmOgorCS5lbnQgc3R1ZmYKKwlmbHVzaGkKKwlmbHVzaGQKKwlmbHVzaGlkCisJbWFkZCAkNCwkNQorCW1hZGR1ICQ1LCQ2CisJZmZjICQ2LCQ3CisJZmZzICQ3LCQ4CisJbXN1YiAkOCwkOQorCW1zdWJ1ICQ5LCQxMAorCXNlbHNsICQxMCwkMTEsJDEyCisJc2Vsc3IgJDExLCQxMiwkMTMKKwl3YWl0aQorCXdiIDE2KCQxNCkKKwlhZGRjaXUgJDE0LCQxNSwxNgorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODRmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLmQKQEAgLTAsMCArMSwxNSBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQxMDAKKyNuYW1lOiBNSVBTIDQxMDAKKyNhczogLW1jcHU9NDEwMAorCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6CiswKzAwMDAgPHN0dWZmPiBkbWFkZDE2CVwkYTAsXCRhMQorCS4uLgorMCswMDBjIDxzdHVmZlwrMHhjPiBtYWRkMTYJXCRhMSxcJGEyCiswKzAwMTAgPHN0dWZmXCsweDEwPiBoaWJlcm5hdGUKKzArMDAxNCA8c3R1ZmZcKzB4MTQ+IHN0YW5kYnkKKzArMDAxOCA8c3R1ZmZcKzB4MTg+IHN1c3BlbmQKKzArMDAxYyA8c3R1ZmZcKzB4MWM+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjBlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLnMKQEAgLTAsMCArMSwxMCBAQAorCS50ZXh0CisKK3N0dWZmOgorCS5lbnQgc3R1ZmYKKwlkbWFkZDE2ICQ0LCQ1CisJbWFkZDE2ICQ1LCQ2CisJaGliZXJuYXRlCisJc3RhbmRieQorCXN1c3BlbmQKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTY0MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5kCkBAIC0wLDAgKzEsMTQgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0NjUwCisjbmFtZTogTUlQUyA0NjUwCisjYXM6IC1tY3B1PTQ2NTAKKworCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgorMCswMDAwIDxzdHVmZj4gbWFkCVwkYTAsXCRhMQorCS4uLgorMCswMDBjIDxzdHVmZlwrMHhjPiBtYWR1CVwkYTEsXCRhMgorCS4uLgorMCswMDE4IDxzdHVmZlwrMHgxOD4gbXVsCVwkYTIsXCRhMyxcJHQwCiswKzAwMWMgPHN0dWZmXCsweDFjPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmMyMmExCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5zCkBAIC0wLDAgKzEsOCBAQAorCS50ZXh0CisKK3N0dWZmOgorCS5lbnQgc3R1ZmYKKwltYWQgJDQsJDUKKwltYWR1ICQ1LCQ2CisJbXVsICQ2LCQ3LCQ4CisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLWlsb2Nrcy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWVkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC1pbG9ja3MuZApAQCAtMCwwICsxLDgxIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcworI25hbWU6IE1JUFMgbXVsLWlsb2NrcworI2FzOgorI3NvdXJjZTogbXVsLnMKKworIyBUZXN0IHRoZSBtdWwgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQorMCswMDA0IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwMDggPFtePl0qPiBtdWx0dQlcJGExLFwkYTIKKzArMDAwYyA8W14+XSo+IG1mbG8JXCRhMAorMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwwCiswKzAwMTQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAorMCswMDE4IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwMWMgPFtePl0qPiBsaQlcJGF0LDEKKzArMDAyMCA8W14+XSo+IG11bHQJXCRhMSxcJGF0CiswKzAwMjQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDAyOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCiswKzAwMmMgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAorMCswMDMwIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwMzQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAorMCswMDM4IDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKKzArMDAzYyA8W14+XSo+IG1mbG8JXCRhMAorMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNDQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAorMCswMDQ4IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA1MCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwNTQgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAorMCswMDU4IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwNWMgPFtePl0qPiBtdWx0CVwkYTAsXCRhMQorMCswMDYwIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwNjQgPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKKzArMDA2OCA8W14+XSo+IG1maGkJXCRhdAorMCswMDZjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzc4IDxmb29cKygweHwpNzg+CiswKzAwNzAgPFtePl0qPiBub3AKKzArMDA3NCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKKzArMDA3OCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDdjIDxbXj5dKj4gbXVsdAlcJGExLFwkYTIKKzArMDA4MCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDg0IDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCiswKzAwODggPFtePl0qPiBtZmhpCVwkYXQKKzArMDA4YyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCs5OCA8Zm9vXCsoMHh8KTk4PgorMCswMDkwIDxbXj5dKj4gbm9wCiswKzAwOTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAwOTggPFtePl0qPiBtZmxvCVwkYTAKKzArMDA5YyA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQorMCswMGEwIDxbXj5dKj4gbWZoaQlcJGF0CiswKzAwYTQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDBhOCA8W14+XSo+IGJlcXoJXCRhdCwwK2I0IDxmb29cKygweHwpYjQ+CiswKzAwYWMgPFtePl0qPiBub3AKKzArMDBiMCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKKzArMDBiNCA8W14+XSo+IG11bHR1CVwkYTEsXCRhMgorMCswMGI4IDxbXj5dKj4gbWZoaQlcJGF0CiswKzAwYmMgPFtePl0qPiBtZmxvCVwkYTAKKzArMDBjMCA8W14+XSo+IGJlcXoJXCRhdCwwK2NjIDxmb29cKygweHwpY2M+CiswKzAwYzQgPFtePl0qPiBub3AKKzArMDBjOCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKKzArMDBjYyA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKKzArMDBkMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGQ0IDxbXj5dKj4gbGkJXCRhdCwxCiswKzAwZDggPFtePl0qPiBkbXVsdAlcJGExLFwkYXQKKzArMDBkYyA8W14+XSo+IG1mbG8JXCRhMAorMCswMGUwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGEyCiswKzAwZTQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDBlOCA8W14+XSo+IGRzcmEzMglcJGEwLFwkYTAsMHgxZgorMCswMGVjIDxbXj5dKj4gbWZoaQlcJGF0CiswKzAwZjAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArZmMgPGZvb1wrKDB4fClmYz4KKzArMDBmNCA8W14+XSo+IG5vcAorMCswMGY4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQorMCswMGZjIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAxMDAgPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCiswKzAxMDQgPFtePl0qPiBtZmhpCVwkYXQKKzArMDEwOCA8W14+XSo+IG1mbG8JXCRhMAorMCswMTBjIDxbXj5dKj4gYmVxeglcJGF0LDArMTE4IDxmb29cKygweHwpMTE4PgorMCswMTEwIDxbXj5dKj4gbm9wCiswKzAxMTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI2MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwuZApAQCAtMCwwICsxLDkyIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI2FzOiAtbWNwdT1yNDAwMAorI25hbWU6IE1JUFMgbXVsCisKKyMgVGVzdCB0aGUgbXVsIG1hY3JvLgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPFtePl0qPiBtdWx0dQlcJGEwLFwkYTEKKzArMDAwNCA8W14+XSo+IG1mbG8JXCRhMAorCS4uLgorMCswMDEwIDxbXj5dKj4gbXVsdHUJXCRhMSxcJGEyCiswKzAwMTQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDAxOCA8W14+XSo+IGxpCVwkYXQsMAorMCswMDFjIDxbXj5dKj4gbm9wCiswKzAwMjAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAorMCswMDI0IDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwMjggPFtePl0qPiBsaQlcJGF0LDEKKzArMDAyYyA8W14+XSo+IG5vcAorMCswMDMwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKKzArMDAzNCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDM4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDAzYyA8W14+XSo+IG5vcAorMCswMDQwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKKzArMDA0NCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDQ4IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKKzArMDA0YyA8W14+XSo+IG5vcAorMCswMDUwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKKzArMDA1NCA8W14+XSo+IG1mbG8JXCRhMAorMCswMDU4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNWMgPFtePl0qPiBub3AKKzArMDA2MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0CiswKzAwNjQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDA2OCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDZjIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKKzArMDA3MCA8W14+XSo+IG11bHQJXCRhMSxcJGF0CiswKzAwNzQgPFtePl0qPiBtZmxvCVwkYTAKKwkuLi4KKzArMDA4MCA8W14+XSo+IG11bHQJXCRhMCxcJGExCiswKzAwODQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDA4OCA8W14+XSo+IHNyYQlcJGEwLFwkYTAsMHgxZgorMCswMDhjIDxbXj5dKj4gbWZoaQlcJGF0CiswKzAwOTAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArOWMgPGZvb1wrKDB4fCk5Yz4KKzArMDA5NCA8W14+XSo+IG5vcAorMCswMDk4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQorMCswMDljIDxbXj5dKj4gbWZsbwlcJGEwCisJLi4uCiswKzAwYTggPFtePl0qPiBtdWx0CVwkYTEsXCRhMgorMCswMGFjIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAwYjAgPFtePl0qPiBzcmEJXCRhMCxcJGEwLDB4MWYKKzArMDBiNCA8W14+XSo+IG1maGkJXCRhdAorMCswMGI4IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwK2M0IDxmb29cKygweHwpYzQ+CiswKzAwYmMgPFtePl0qPiBub3AKKzArMDBjMCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKKzArMDBjNCA8W14+XSo+IG1mbG8JXCRhMAorCS4uLgorMCswMGQwIDxbXj5dKj4gbXVsdHUJXCRhMCxcJGExCiswKzAwZDQgPFtePl0qPiBtZmhpCVwkYXQKKzArMDBkOCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGRjIDxbXj5dKj4gYmVxeglcJGF0LDArZTggPGZvb1wrKDB4fCllOD4KKzArMDBlMCA8W14+XSo+IG5vcAorMCswMGU0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQorMCswMGU4IDxbXj5dKj4gbXVsdHUJXCRhMSxcJGEyCiswKzAwZWMgPFtePl0qPiBtZmhpCVwkYXQKKzArMDBmMCA8W14+XSo+IG1mbG8JXCRhMAorMCswMGY0IDxbXj5dKj4gYmVxeglcJGF0LDArMTAwIDxmb29cKygweHwpMTAwPgorMCswMGY4IDxbXj5dKj4gbm9wCiswKzAwZmMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAxMDAgPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCiswKzAxMDQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDEwOCA8W14+XSo+IGxpCVwkYXQsMQorMCswMTBjIDxbXj5dKj4gbm9wCiswKzAxMTAgPFtePl0qPiBkbXVsdAlcJGExLFwkYXQKKzArMDExNCA8W14+XSo+IG1mbG8JXCRhMAorCS4uLgorMCswMTIwIDxbXj5dKj4gZG11bHQJXCRhMSxcJGEyCiswKzAxMjQgPFtePl0qPiBtZmxvCVwkYTAKKzArMDEyOCA8W14+XSo+IGRzcmEzMglcJGEwLFwkYTAsMHgxZgorMCswMTJjIDxbXj5dKj4gbWZoaQlcJGF0CiswKzAxMzAgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMTNjIDxmb29cKygweHwpMTNjPgorMCswMTM0IDxbXj5dKj4gbm9wCiswKzAxMzggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCiswKzAxM2MgPFtePl0qPiBtZmxvCVwkYTAKKwkuLi4KKzArMDE0OCA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKKzArMDE0YyA8W14+XSo+IG1maGkJXCRhdAorMCswMTUwIDxbXj5dKj4gbWZsbwlcJGEwCiswKzAxNTQgPFtePl0qPiBiZXF6CVwkYXQsMCsxNjAgPGZvb1wrKDB4fCkxNjA+CiswKzAxNTggPFtePl0qPiBub3AKKzArMDE1YyA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWUzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC5zCkBAIC0wLDAgKzEsMjcgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBtdWwgbWFjcm8uCisJCitmb286CisJbXVsCSQ0LCQ1CisJbXVsCSQ0LCQ1LCQ2CisJbXVsCSQ0LCQ1LDAKKwltdWwJJDQsJDUsMQorCW11bAkkNCwkNSwweDgwMDAKKwltdWwJJDQsJDUsLTB4ODAwMAorCW11bAkkNCwkNSwweDEwMDAwCisJbXVsCSQ0LCQ1LDB4MWE1YTUKKworIyBtdWxvIGFuZCBtdWxvdSBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHJlZ2lzdGVyIGFyZ3VtZW50cwkKKwltdWxvCSQ0LCQ1CisJbXVsbwkkNCwkNSwkNgorCisJbXVsb3UJJDQsJDUKKwltdWxvdQkkNCwkNSwkNgorCisjIFNhbml0eSBjaGVjayB0aGUgNjQgYml0IHZlcnNpb25zLgorCS5zZXQJbWlwczMKKwlkbXVsCSQ0LCQ1LCQ2CisJZG11bAkkNCwkNSwxCisJZG11bG8JJDQsJDUsJDYKKwlkbXVsb3UJJDQsJDUsJDYKKworICAgICAgICAuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ub2RlbGF5LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL25vZGVsYXkuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzkzMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ub2RlbGF5LmQKQEAgLTAsMCArMSwxOSBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjUwMDAKKyNuYW1lOiBNSVBTIG5vZGVsYXkKKyNhczogLW1pcHM0IC1tY3B1PXI4MDAwCisjc291cmNlOiBkZWxheS5zCisKKyMgRm9yIC1taXBzNCAKKyMgR2FzIHNob3VsZCAqbm90KiBwcm9kdWNlIG5vcCdzIGFmdGVyIG10YzEgYW5kIHJlbGF0ZWQgCisjIGluc24ncyBpZiB0aGUgdGFyZ2V0IGZwciBpcyB1c2VkIGluIHRoZSBpbW1lZGlhdGx5IAorIyBmb2xsb3dpbmcgaW5zbi4gIFNlZSBhbHNvIGRlbGF5LmQuCisjCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IG10YzEJXCR6ZXJvLFwkZjAKKzArMDAwNCA8W14+XSo+IGN2dC5kLncJXCRmMCxcJGYwCiswKzAwMDggPFtePl0qPiBtdGMxCVwkemVybyxcJGYxCiswKzAwMGMgPFtePl0qPiBjdnQuZC53CVwkZjEsXCRmMQorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjZTE0MgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLmQKQEAgLTAsMCArMSwzNyBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNhczogLW1jcHU9cjMwMDAKKyNuYW1lOiBNSVBTIFIzMDAwIHJvbAorCisjIFRlc3QgdGhlIHJvbCBhbmQgcm9yIG1hY3Jvcy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbmVndQlcJGF0LFwkYTEKKzArMDAwNCA8W14+XSo+IHNybHYJXCRhdCxcJGEwLFwkYXQKKzArMDAwOCA8W14+XSo+IHNsbHYJXCRhMCxcJGEwLFwkYTEKKzArMDAwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwMTAgPFtePl0qPiBuZWd1CVwkYXQsXCRhMgorMCswMDE0IDxbXj5dKj4gc3JsdglcJGF0LFwkYTEsXCRhdAorMCswMDE4IDxbXj5dKj4gc2xsdglcJGEwLFwkYTEsXCRhMgorMCswMDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDAyMCA8W14+XSo+IHNsbAlcJGF0LFwkYTAsMHgxCiswKzAwMjQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4MWYKKzArMDAyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwMmMgPFtePl0qPiBzbGwJXCRhdCxcJGExLDB4MQorMCswMDMwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMSwweDFmCiswKzAwMzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDM4IDxbXj5dKj4gbmVndQlcJGF0LFwkYTEKKzArMDAzYyA8W14+XSo+IHNsbHYJXCRhdCxcJGEwLFwkYXQKKzArMDA0MCA8W14+XSo+IHNybHYJXCRhMCxcJGEwLFwkYTEKKzArMDA0NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwNDggPFtePl0qPiBuZWd1CVwkYXQsXCRhMgorMCswMDRjIDxbXj5dKj4gc2xsdglcJGF0LFwkYTEsXCRhdAorMCswMDUwIDxbXj5dKj4gc3JsdglcJGEwLFwkYTEsXCRhMgorMCswMDU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA1OCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHgxCiswKzAwNWMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4MWYKKzArMDA2MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwNjQgPFtePl0qPiBzcmwJXCRhdCxcJGExLDB4MQorMCswMDY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMSwweDFmCiswKzAwNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5YTk1NwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLnMKQEAgLTAsMCArMSwxMiBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHJvbCBhbmQgcm9yIG1hY3Jvcy4KKworZm9vOgorCXJvbAkkNCwkNQorCXJvbAkkNCwkNSwkNgorCXJvbAkkNCwxCisJcm9sCSQ0LCQ1LDEKKworCXJvcgkkNCwkNQorCXJvcgkkNCwkNSwkNgorCXJvcgkkNCwxCisJcm9yCSQ0LCQ1LDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY0YmMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5kCkBAIC0wLDAgKzEsMzk2IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgc2IKKyNhczogLW1pcHMxCisKKyMgVGVzdCB0aGUgc2IgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IHNiCVwkYTAsMFwoXCR6ZXJvXCkKKzArMDAwNCA8W14+XSo+IHNiCVwkYTAsMVwoXCR6ZXJvXCkKKzArMDAwOCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDBjIDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkYXRcKQorMCswMDEwIDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkemVyb1wpCiswKzAwMTQgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDAxOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCiswKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDAyMCA8W14+XSo+IHNiCVwkYTAsLTIzMTMxXChcJGF0XCkKKzArMDAyNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhMVwpCiswKzAwMjggPFtePl0qPiBzYglcJGEwLDFcKFwkYTFcKQorMCswMDJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMzAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAwMzQgPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhdFwpCiswKzAwMzggPFtePl0qPiBzYglcJGEwLC0zMjc2OFwoXCRhMVwpCiswKzAwM2MgPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDA0NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCiswKzAwNDggPFtePl0qPiBsdWkJXCRhdCwweDIKKzArMDA0YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDA1MCA8W14+XSo+IHNiCVwkYTAsLTIzMTMxXChcJGF0XCkKKzArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwNTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwNWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCitbIAldKjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNjQgPFtePl0qPiBzYglcJGEwLDBcKFwkZ3BcKQorWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNjggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDZjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKK1sgCV0qNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDcwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGdwXCkKK1sgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAwNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDA3YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRncFwpCitbIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwODQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSo4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwODggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA4YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOTAgPFtePl0qPiBzYglcJGEwLDFcKFwkZ3BcKQorWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwOTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qOTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDk4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDljIDxbXj5dKj4gc2IJXCRhMCwxXChcJGdwXCkKK1sgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qYTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAwYTQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDBhOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRncFwpCitbIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDBhYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKmFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBiMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKmIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBiNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYjggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qY2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBkNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKmQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSpkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMGU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSpmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGY0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKmY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxMDAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTA0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjEwNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjEwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxMTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDExOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTIwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDEyNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjEyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTI4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKK1sgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTMwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKK1sgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjEzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxMzggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorWyAJXSoxMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTQwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKK1sgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTQ0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDE1MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjE1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMTU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDE1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTYwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE2YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNzAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoxNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTc0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTc4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTgwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMTgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTg0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDE4OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDE5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDE5NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjE5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAxYTAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDFhOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCitbIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDFiNCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCitbIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAxYmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorWyAJXSoxYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMWM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMWM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMWNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMWQwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDFkNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMWRjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDFlOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWVjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAorMCswMWYwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKK1sgCV0qMWYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMWZjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDIwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKKzArMDIwNCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCitbIAldKjIwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDIwOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyMGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyMTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCiswKzAyMTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMjFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDIyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDIyNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDIzMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjM0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIzOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDIzYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMjQ4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI0YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDI1NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjI1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDI2MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjI2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDI2NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyNmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyNzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjI3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMjg0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4YyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDI5MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjI5MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOTQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI5OCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDI5YyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMmE4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDJiNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMmJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMmMwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDJjNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyY2MgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMmQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyZDggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorWyAJXSoyZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyZTQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMmU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJlYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDJmMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCitbIAldKjJmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAyZmMgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzMDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAzMDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzMGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMzEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMzE0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMzE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDMxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjMxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzMWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAzMjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozMjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMzI0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAzMmMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDMzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAzMzggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDM0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKKzArMDM0NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCitbIAldKjM0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzNGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAzNTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzNTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAzNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCiswKzAzNWMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQorWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAzNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMzY0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQorMCswMzY4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKK1sgCV0qMzY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDM2YyA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDM3MCA8W14+XSo+IHN3CVwkYTEsNFwoXCR6ZXJvXCkKKzArMDM3NCA8W14+XSo+IHNoCVwkYTAsMFwoXCR6ZXJvXCkKKzArMDM3OCA8W14+XSo+IHN3CVwkYTAsMFwoXCR6ZXJvXCkKKzArMDM3YyA8W14+XSo+IHN3YzAJXCQ0LDBcKFwkemVyb1wpCiswKzAzODAgPFtePl0qPiBzd2MxCVwkZjQsMFwoXCR6ZXJvXCkKKzArMDM4NCA8W14+XSo+IHN3YzIJXCQ0LDBcKFwkemVyb1wpCiswKzAzODggPFtePl0qPiBzd2MzCVwkNCwwXChcJHplcm9cKQorMCswMzhjIDxbXj5dKj4gc3djMQlcJGY0LDBcKFwkemVyb1wpCiswKzAzOTAgPFtePl0qPiBzd2wJXCRhMCwwXChcJHplcm9cKQorMCswMzk0IDxbXj5dKj4gc3dyCVwkYTAsMFwoXCR6ZXJvXCkKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM3MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5zCkBAIC0wLDAgKzEsMTI0IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgc2IgbWFjcm8uCisJCisJLmRhdGEKK2RhdGFfbGFiZWw6CisJLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCisJLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKKwkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKKwkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQorCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKKwkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKKwkKKwkudGV4dAorCXNiCSQ0LDAKKwlzYgkkNCwxCisJc2IJJDQsMHg4MDAwCisJc2IJJDQsLTB4ODAwMAorCXNiCSQ0LDB4MTAwMDAKKwlzYgkkNCwweDFhNWE1CisJc2IJJDQsMCgkNSkKKwlzYgkkNCwxKCQ1KQorCXNiCSQ0LDB4ODAwMCgkNSkKKwlzYgkkNCwtMHg4MDAwKCQ1KQorCXNiCSQ0LDB4MTAwMDAoJDUpCisJc2IJJDQsMHgxYTVhNSgkNSkKKwlzYgkkNCxkYXRhX2xhYmVsCisJc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCisJc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgorCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24KKwlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KKwlzYgkkNCxkYXRhX2xhYmVsKzEKKwlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKKwlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCXNiCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCisJc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAorCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKKwlzYgkkNCxkYXRhX2xhYmVsLTB4ODAwMAorCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCisJc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCisJc2IJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKKwlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCisJc2IJJDQsZGF0YV9sYWJlbCsweDEwMDAwCisJc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAorCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCisJc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCisJc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwlzYgkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKKwlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1CisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQorCXNiCSQ0LGRhdGFfbGFiZWwoJDUpCisJc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKKwlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQorCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKKwlzYgkkNCxkYXRhX2xhYmVsKzEoJDUpCisJc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCisJc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQorCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQorCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKKwlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKKwlzYgkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKKwlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCisJc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKKwlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQorCXNiCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQorCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKKwlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQorCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQorCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCisJc2IJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQorCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQorCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCisJc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCisJc2IJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQorCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCisJc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQorCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKKwlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKKwlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCisJc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCisJCisjIFNldmVyYWwgbWFjcm9zIGFyZSBoYW5kbGVkIGxpa2Ugc2IuICBTYW5pdHkgY2hlY2sgdGhlbS4KKwlzZAkkNCwwCisJc2gJJDQsMAorCXN3CSQ0LDAKKwlzd2MwCSQ0LDAKKwlzd2MxCSQ0LDAKKwlzd2MyCSQ0LDAKKwlzd2MzCSQ0LDAKKwlzLnMJJGY0LDAKKwlzd2wJJDQsMAorCXN3cgkkNCwwCisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTBlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMuZApAQCAtMCwwICsxLDEwIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtLXNob3ctcmF3LWluc24KKyNuYW1lOiBzeW5jIGluc3RydWN0aW9ucworI2FzOgorCisuKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgorMCswMDAwIDxmb28+IDAwMDAwMDBmWyAJXSpzeW5jCiswKzAwMDQgPGZvb1wrMHg0PiAwMDAwMDQwZlsgCV0qc3luYy5wCiswKzAwMDggPGZvb1wrMHg4PiAwMDAwMDAwZlsgCV0qc3luYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3N5bmMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWMwZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLnMKQEAgLTAsMCArMSw1IEBACisJLnRleHQKK2ZvbzoKKwlzeW5jCisJc3luYy5wCisJc3luYy5sCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdhZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAuZApAQCAtMCwwICsxLDIwIEBACisjYXM6IC1tY3B1PXI0MDAwCisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgMjAtYml0IHRyYXAKKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gdGVxCVwkemVybyxcJHYxCiswKzAwMDQgPFtePl0qPiB0ZXEJXCR6ZXJvLFwkdjEsMHgxCiswKzAwMDggPFtePl0qPiB0Z2UJXCR6ZXJvLFwkdjEKKzArMDAwYyA8W14+XSo+IHRnZQlcJHplcm8sXCR2MSwweDMKKzArMDAxMCA8W14+XSo+IHRnZXUJXCR6ZXJvLFwkdjEKKzArMDAxNCA8W14+XSo+IHRnZXUJXCR6ZXJvLFwkdjEsMHg3CiswKzAwMTggPFtePl0qPiB0bHQJXCR6ZXJvLFwkdjEKKzArMDAxYyA8W14+XSo+IHRsdAlcJHplcm8sXCR2MSwweDFmCiswKzAwMjAgPFtePl0qPiB0bHR1CVwkemVybyxcJHYxCiswKzAwMjQgPFtePl0qPiB0bHR1CVwkemVybyxcJHYxLDB4ZmYKKzArMDAyOCA8W14+XSo+IHRuZQlcJHplcm8sXCR2MQorMCswMDJjIDxbXj5dKj4gdG5lCVwkemVybyxcJHYxLDB4M2ZmCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTZkNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucwpAQCAtMCwwICsxLDE4IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgMjAtYml0IHRyYXAgaW5zdHJ1Y3Rpb25zCitmb286CQorCXRlcQkkMCwkMworCXRlcQkkMCwkMywxCisJdGdlCSQwLCQzCisJdGdlCSQwLCQzLDMKKwl0Z2V1CSQwLCQzCisJdGdldQkkMCwkMyw3CisJdGx0CSQwLCQzCisJdGx0CSQwLCQzLDMxCisJdGx0dQkkMCwkMworCXRsdHUJJDAsJDMsMjU1CisJdG5lCSQwLCQzCisJdG5lCSQwLCQzLDEwMjMKKwkKKyMgZm9yY2Ugc29tZSBwYWRkaW5nLCB0byBtYWtlIG9iamR1bXAgY29uc2lzdGVudGx5IHJlcG9ydCB0aGF0IHRoZXJlJ3Mgc29tZQorIyBoZXJlLi4uCisJLnNwYWNlCTgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM4YWUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5kCkBAIC0wLDAgKzEsMjkgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyB0cnVuYworI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAKKworIyBUZXN0IHRoZSB0cnVuYyBtYWNyb3MuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCiswKzAwMDQgPFtePl0qPiBjZmMxCVwkYTAsXCQzMQorMCswMDA4IDxbXj5dKj4gbm9wCiswKzAwMGMgPFtePl0qPiBvcmkJXCRhdCxcJGEwLDB4MworMCswMDEwIDxbXj5dKj4geG9yaQlcJGF0LFwkYXQsMHgyCiswKzAwMTQgPFtePl0qPiBjdGMxCVwkYXQsXCQzMQorMCswMDE4IDxbXj5dKj4gbm9wCiswKzAwMWMgPFtePl0qPiBjdnQudy5kCVwkZjQsXCRmNgorMCswMDIwIDxbXj5dKj4gY3RjMQlcJGEwLFwkMzEKKzArMDAyNCA8W14+XSo+IG5vcAorMCswMDI4IDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKKzArMDAyYyA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCiswKzAwMzAgPFtePl0qPiBub3AKKzArMDAzNCA8W14+XSo+IG9yaQlcJGF0LFwkYTAsMHgzCiswKzAwMzggPFtePl0qPiB4b3JpCVwkYXQsXCRhdCwweDIKKzArMDAzYyA8W14+XSo+IGN0YzEJXCRhdCxcJDMxCiswKzAwNDAgPFtePl0qPiBub3AKKzArMDA0NCA8W14+XSo+IGN2dC53LnMJXCRmNCxcJGY2CiswKzAwNDggPFtePl0qPiBjdGMxCVwkYTAsXCQzMQorMCswMDRjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlOTBmMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMucwpAQCAtMCwwICsxLDYgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB0cnVuYyBtYWNyb3MuCisKK2ZvbzoKKwl0cnVuYy53LmQJJGY0LCRmNiwkNAorCisJdHJ1bmMudy5zCSRmNCwkZjYsJDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmUyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kCkBAIC0wLDAgKzEsMjcwIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAorI25hbWU6IE1JUFMgdWxkCisjYXM6IC1taXBzMyAtbWNwdT1yNDAwMAorCisjIFRlc3QgdGhlIHVsZCBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCR6ZXJvXCkKKzArMDAwNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkemVyb1wpCiswKzAwMDggPFtePl0qPiBsZGwJXCRhMCxbMThdXChcJHplcm9cKQorMCswMDBjIDxbXj5dKj4gbGRyCVwkYTAsWzE4XVwoXCR6ZXJvXCkKKzArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCiswKzAwMTQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDAxOCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDFjIDxbXj5dKj4gbGRsCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQorMCswMDIwIDxbXj5dKj4gbGRyCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQorMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMjggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDAyYyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMDM4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwM2MgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDA0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYTFcKQorMCswMDQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhMVwpCiswKzAwNDggPFtePl0qPiBsZGwJXCRhMCxbMThdXChcJGExXCkKKzArMDA0YyA8W14+XSo+IGxkcglcJGEwLFstMC05XStcKFwkYTFcKQorMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMDU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDA1OCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMDVjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwNmMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDA3MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAorWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNzQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDA3OCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDA4OCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCitbIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMDljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMGEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwYTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDBhOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYWMgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDBiMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBiOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwYmMgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDBjMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYzggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBjYyA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMGQwIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZDQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKK1sgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGQ4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZGMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGU4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZWMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDBmMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQorWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBmNCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMGY4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMDAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTA0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMDggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDEwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDEyMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDE0NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxNTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDE2NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE3MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTc0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMTdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxODAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDE4NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDE5MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTk0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDFhNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFiMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMWI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxYzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxZDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxZGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMWUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxZTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMWVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxZjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDFmNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDFmYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjAwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyMDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyMTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMjI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDIzNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI0MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMjQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjUwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyNTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDI2MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMjY0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMjZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDI3NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDI4NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjkwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyOTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJhMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMmE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmIwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyYjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyYzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDJjNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQorMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDJjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMmQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyZDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWZmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5zCkBAIC0wLDAgKzEsNjYgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bGQgbWFjcm8uCisJCisJLmRhdGEKK2RhdGFfbGFiZWw6CisJLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCisJLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKKwkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKKwkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQorCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKKwkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKKwkKKwkudGV4dAorCXVsZAkkNCwwCisJdWxkCSQ0LDEKKwl1bGQJJDQsMHg4MDAwCisJdWxkCSQ0LC0weDgwMDAKKwl1bGQJJDQsMHgxMDAwMAorCXVsZAkkNCwweDFhNWE1CisJdWxkCSQ0LDAoJDUpCisJdWxkCSQ0LDEoJDUpCisJdWxkCSQ0LGRhdGFfbGFiZWwKKwl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKwl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgorCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uCisJdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCXVsZAkkNCxkYXRhX2xhYmVsKzEKKwl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCisJdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCXVsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAorCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAorCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCisJdWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCisJdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCisJdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCisJdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKKwl1bGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwCisJdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1bGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1CisJdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKKworIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KKwlub3AKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLWVtcGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NWYwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1lbXBpYy5kCkBAIC0wLDAgKzEsOTEgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyB1bGgtZW1waWMKKyNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljCisjc291cmNlOiB1bGgtcGljLnMKKworIyBUZXN0IHRoZSB1bGggbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4NAorWyAJXSowOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCiswKzAwMDQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDA4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwMGMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDEwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDAxNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCitbIAldKjE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwMTggPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJGF0XCkKKzArMDAxYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMDIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDAyNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwMjggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAorWyAJXSoyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwMmMgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDAzMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMDM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKK1sgCV0qMzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDM4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDAzYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwNDAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwNDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA1MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCitbIAldKjUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDU0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwNTggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODQKK1sgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMDYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDA2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMDY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDA2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE1Mzg0CitbIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDA3NCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkYXRcKQorMCswMDc4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwN2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDgwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA4NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODMKK1sgCV0qODQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKKzArMDA4OCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMDhjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwOTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQorWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDk0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDA5OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwOWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMGEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwYTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMGE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDBhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBiMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMGI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQorWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwYmMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMGMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwYzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMGM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDBjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKmNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGQwIDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwZDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDBkOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwZGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4MworWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZTQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBlOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNTM4MworWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwZjAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMGY0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDBmOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwZmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDEwMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxMDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1waWMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNiMjljCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMKQEAgLTAsMCArMSwzNiBAQAorIyBUZXN0IHVuYWxpZ25lZCBsb2FkIGFuZCBzdG9yZSBtYWNyb3Mgd2l0aCBQSUMgY29kZS4gIFdlIGRvbid0IGJvdGhlcgorIyB0byB0ZXN0IG1vc3QgY2FzZXMuICBUaGUgYWN0dWFsIGxvYWRzIGFuZCBzdG9yZXMgYXJlIHRlc3RlZCBieSB0aGUKKyMgbm9uLVBJQyB0ZXN0IGNhc2UuICBXZSBqdXN0IHdhbnQgdG8gY2hlY2sgdGhhdCB0aGUgaW5pdGlhbCBhZGRyZXNzCisjIGlzIGxvYWRlZCBjb3JyZWN0bHkuCisKKwkuZGF0YQorZGF0YV9sYWJlbDoKKwkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKKwkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQorCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAorCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCisJLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAorCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQorCQorCS50ZXh0CisJdWxoCSQ0LGRhdGFfbGFiZWwKKwl1bGh1CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCisJdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKwl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgorCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KKwl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbgorCXVsaHUJJDQsc21hbGxfbG9jYWxfY29tbW9uCisJdWx3CSQ0LGRhdGFfbGFiZWwrMQorCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKKwl1bGh1CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCS5pZm5kZWYJWEdPVAorCW5vcAorCW5vcAorCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtc3ZyNHBpYy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTMzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1zdnI0cGljLmQKQEAgLTAsMCArMSwxMjQgQEAKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCisjbmFtZTogTUlQUyB1bGgtc3ZyNHBpYworI2FzOiAtbWlwczEgLUtQSUMgLUVCCisjc291cmNlOiB1bGgtcGljLnMKKworIyBUZXN0IHRoZSB1bmFsaWduZWQgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIHdpdGggLUtQSUMuCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjA6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMDA0IDxbXj5dKj4gbm9wCiswKzAwMDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSo4OiBSX01JUFNfTE8xNgkuZGF0YQorMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKKzArMDAxMCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQorMCswMDE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDAxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwMWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwMjAgPFtePl0qPiBub3AKKzArMDAyNCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQorMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDAzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjM0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDM4IDxbXj5dKj4gbm9wCiswKzAwM2MgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKKzArMDA0MCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQorMCswMDQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qNDQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwNDggPFtePl0qPiBub3AKKzArMDA0YyA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCiswKzAwNTAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMDU0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKKzArMDA1OCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQorMCswMDVjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDA2MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwNjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSo2NDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDY4IDxbXj5dKj4gbm9wCiswKzAwNmMgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKKzArMDA3MCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQorMCswMDc0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qNzQ6IFJfTUlQU19HT1QxNgkuYnNzCiswKzAwNzggPFtePl0qPiBub3AKKzArMDA3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjdjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAwODAgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQorMCswMDg0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAwODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjkwOiBSX01JUFNfR09UMTYJLmJzcworMCswMDk0IDxbXj5dKj4gbm9wCiswKzAwOTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAorWyAJXSo5ODogUl9NSVBTX0xPMTYJLmJzcworMCswMDljIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCiswKzAwYTAgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKKzArMDBhNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwYTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMGFjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qYWM6IFJfTUlQU19HT1QxNgkuZGF0YQorMCswMGIwIDxbXj5dKj4gbm9wCiswKzAwYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSpiNDogUl9NSVBTX0xPMTYJLmRhdGEKKzArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCiswKzAwYmMgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKKzArMDBjMCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQorMCswMGM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGM4IDxbXj5dKj4gbm9wCiswKzAwY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMGQwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKKzArMDBkNCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwZDggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorMCswMGRjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAwZTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMGU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDBlOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKmU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGVjIDxbXj5dKj4gbm9wCiswKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMGY0IDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCiswKzAwZjggPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKKzArMDBmYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKmZjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTAwIDxbXj5dKj4gbm9wCiswKzAxMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMTA4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKKzArMDEwYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQorMCswMTEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDExNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxMTggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSoxMTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDExYyA8W14+XSo+IG5vcAorMCswMTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKKzArMDEyNCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQorMCswMTI4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAxMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDEzNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjEzNDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDEzOCA8W14+XSo+IG5vcAorMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMTNjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMTQ0IDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCiswKzAxNDggPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKKzArMDE0YyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE0YzogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE1MCA8W14+XSo+IG5vcAorMCswMTU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKK1sgCV0qMTU0OiBSX01JUFNfTE8xNgkuYnNzCiswKzAxNTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMTVjIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKKzArMDE2MCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAxNjQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorMCswMTY4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAxNmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTcwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJmOWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgteGdvdC5kCkBAIC0wLDAgKzEsMTU0IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgdWxoLXhnb3QKKyNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290IC1FQiAtLWRlZnN5bSBYR09UPTEKKyNzb3VyY2U6IHVsaC1waWMucworCisjIFRlc3QgdGhlIHVuYWxpZ25lZCBsb2FkIGFuZCBzdG9yZSBtYWNyb3Mgd2l0aCAtS1BJQyAteGdvdC4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMDogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwMDQgPFtePl0qPiBub3AKKzArMDAwOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjg6IFJfTUlQU19MTzE2CS5kYXRhCiswKzAwMGMgPFtePl0qPiBub3AKKzArMDAxMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCiswKzAwMTQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKKzArMDAxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjIwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDAyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDAyOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKjI4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDAyYyA8W14+XSo+IG5vcAorMCswMDMwIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCiswKzAwMzQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKKzArMDAzOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwM2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjQwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMDQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qNDg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNGMgPFtePl0qPiBub3AKKzArMDA1MCA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQorMCswMDU0IDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCiswKzAwNTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNTg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwNWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAwNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSo2MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA2NCA8W14+XSo+IG5vcAorMCswMDY4IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKKzArMDA2YyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwNzAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQorMCswMDc0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAwNzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDdjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo4MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMDg4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qODg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDA4YyA8W14+XSo+IG5vcAorMCswMDkwIDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCiswKzAwOTQgPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKKzArMDA5OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjk4OiBSX01JUFNfR09UMTYJLmJzcworMCswMDljIDxbXj5dKj4gbm9wCiswKzAwYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSphMDogUl9NSVBTX0xPMTYJLmJzcworMCswMGE0IDxbXj5dKj4gbm9wCiswKzAwYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQorMCswMGFjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAwYjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMGI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDBiOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKmI4OiBSX01JUFNfR09UMTYJLmJzcworMCswMGJjIDxbXj5dKj4gbm9wCiswKzAwYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAorWyAJXSpjMDogUl9NSVBTX0xPMTYJLmJzcworMCswMGM0IDxbXj5dKj4gbm9wCiswKzAwYzggPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKKzArMDBjYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQorMCswMGQwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDBkNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwZDggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQorWyAJXSpkODogUl9NSVBTX0dPVDE2CS5kYXRhCiswKzAwZGMgPFtePl0qPiBub3AKKzArMDBlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKmUwOiBSX01JUFNfTE8xNgkuZGF0YQorMCswMGU0IDxbXj5dKj4gbm9wCiswKzAwZTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMGVjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCiswKzAwZjAgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKKzArMDBmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpmNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAwZmMgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSpmYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMDAgPFtePl0qPiBub3AKKzArMDEwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCiswKzAxMDggPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQorMCswMTBjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDExMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCiswKzAxMTQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKKzArMDExOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjEyMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKKzArMDEyOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCitbIAldKjEyODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyYyA8W14+XSo+IG5vcAorMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKKzArMDEzNCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQorMCswMTM4IDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCiswKzAxM2MgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTNjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAorMCswMTQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKK1sgCV0qMTQ0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTQ4IDxbXj5dKj4gbm9wCiswKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQorMCswMTUwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKKzArMDE1NCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQorMCswMTU4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDE1YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTYwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCiswKzAxNjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQorWyAJXSoxNjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE2YyA8W14+XSo+IG5vcAorMCswMTcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKKzArMDE3NCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQorMCswMTc4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCiswKzAxN2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTgwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDE4NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCitbIAldKjE4NDogUl9NSVBTX0dPVDE2CS5ic3MKKzArMDE4OCA8W14+XSo+IG5vcAorMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMThjOiBSX01JUFNfTE8xNgkuYnNzCiswKzAxOTAgPFtePl0qPiBub3AKKzArMDE5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCiswKzAxOTggPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKKzArMDE5YyA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQorMCswMWEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKK1sgCV0qMWEwOiBSX01JUFNfR09UMTYJLmJzcworMCswMWE0IDxbXj5dKj4gbm9wCiswKzAxYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAorWyAJXSoxYTg6IFJfTUlQU19MTzE2CS5ic3MKKzArMDFhYyA8W14+XSo+IG5vcAorMCswMWIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKKzArMDFiNCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCiswKzAxYjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMWJjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKKzArMDFjMCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQorMCswMWM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDFjOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxY2MgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNmQ0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kCkBAIC0wLDAgKzEsMzc0IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgdWxoCisjYXM6IC1taXBzMQorCisjIFRlc3QgdGhlIHVsaCBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJHplcm9cKQorMCswMDA0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCR6ZXJvXCkKKzArMDAwOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDEwIDxbXj5dKj4gbGIJXCRhMCxbMTJdXChcJHplcm9cKQorMCswMDE0IDxbXj5dKj4gbGJ1CVwkYXQsWzEyXVwoXCR6ZXJvXCkKKzArMDAxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDIwIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKKzArMDAyNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwMjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDAyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDM0IDxbXj5dKj4gbGIJXCRhMCwtMzI3Nls3OF1cKFwkemVyb1wpCiswKzAwMzggPFtePl0qPiBsYnUJXCRhdCwtMzI3Nls3OF1cKFwkemVyb1wpCiswKzAwM2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA0NCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDQ4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDA0YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMDUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDA1NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwNTggPFtePl0qPiBsdWkJXCRhdCwweDEKKzArMDA1YyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1CiswKzAwNjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwNjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA3MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhMVwpCiswKzAwNzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGExXCkKKzArMDA3OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwN2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDgwIDxbXj5dKj4gbGIJXCRhMCxbMTJdXChcJGExXCkKKzArMDA4NCA8W14+XSo+IGxidQlcJGF0LFsxMl1cKFwkYTFcKQorMCswMDg4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDA4YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwOTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwOTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMGE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDBhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSphODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBiMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwYjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDBiOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwYmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKK1sgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGM0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDBjOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMGNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDBkMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGQ4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGRjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDBlMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMGU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDBlOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAorWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBmMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDBmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMTAwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTA4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDEwYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMTEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDExNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxMTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTFjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDEyMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMTI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDEyOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxMmMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxMzQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTM4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxM2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDE0NCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE0OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTRjIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDE1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMTU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDE1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQorWyAJXSoxNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDE2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMTY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDE2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDE4OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKjE4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE4YyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxOTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDE5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxOTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMTljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDFhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDFhNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxYTggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDFhYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxYjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMWI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKK1sgCV0qMWI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKKzArMDFiOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxYmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDFjMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxYzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDFjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxZDAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMWQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxZDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMWRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDFlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMWVjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxZjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMWY0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjAwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDIwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMjA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDIwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyMTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDIxOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyMWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDIyMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyMjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjMwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDIzNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMjM4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDIzYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyNDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyNDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMjRjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAyNTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMjU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDI2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMjY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDI2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDI3NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMjdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAyODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMjg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDI4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjkwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDI5NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMjk4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDI5YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDJhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjJhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyYTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMmFjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAyYjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMmI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDJiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMmJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJjMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyYzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDJjOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyY2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMmQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJkOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyZGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDJlMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyZTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMmU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjJlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDJmMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDJmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMzAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjMwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzMDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSozMDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMzA4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDMwYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMzEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDMxNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMzFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMzFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDMyMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzMjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDMyOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAzMmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMzMwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzMzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDMzOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzM2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDM0MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAzNDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMzQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMzQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjM0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMzU0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAzNTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMzVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDM2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMzY4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDM2YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMzcwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDM3NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSozN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzODAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswMzg0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAzODggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMzhjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDM5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjM5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDM5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjM5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDM5OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzOWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDNhMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAzYTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswM2E4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qM2E4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDNhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjNhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzYjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswM2I0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAzYjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswM2JjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDNjMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjNjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAzYzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswM2M4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDNjYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswM2QwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDNkNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzZDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjNkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2UwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDNlNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswM2U4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDNlYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSozZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswM2Y0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qM2Y0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDNmOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzZmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDQwMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA0MDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNDA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNDA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDQwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjQwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA0MTAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQorMCswNDE0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzA0MTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswNDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDQyMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjQyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDQyNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjQyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDQyOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0MmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDQzMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA0MzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNDM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNDM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswNDNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNDNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNDQwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKKzArMDQ0NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswNDQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDQ0YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzA0NTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo0NTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNDU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDQ1OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0NWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDQ2MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA0NjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNDY4IDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCR6ZXJvXCkKKzArMDQ2YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkemVyb1wpCiswKzA0NzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswNDc0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWNiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5zCkBAIC0wLDAgKzEsNjkgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1bGggbWFjcm8uCisJCisJLmRhdGEKK2RhdGFfbGFiZWw6CisJLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCisJLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKKwkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKKwkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQorCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKKwkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKKwkKKwkudGV4dAorCXVsaAkkNCwwCisJdWxoCSQ0LDEKKwl1bGgJJDQsMHg4MDAwCisJdWxoCSQ0LC0weDgwMDAKKwl1bGgJJDQsMHgxMDAwMAorCXVsaAkkNCwweDFhNWE1CisJdWxoCSQ0LDAoJDUpCisJdWxoCSQ0LDEoJDUpCisJdWxoCSQ0LGRhdGFfbGFiZWwKKwl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKwl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgorCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uCisJdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCXVsaAkkNCxkYXRhX2xhYmVsKzEKKwl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCisJdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCXVsaAkkNCxkYXRhX2xhYmVsKzB4ODAwMAorCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAorCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCisJdWxoCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCisJdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCisJdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCisJdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKKwl1bGgJJDQsZGF0YV9sYWJlbCsweDEwMDAwCisJdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1bGgJJDQsZGF0YV9sYWJlbCsweDFhNWE1CisJdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVsaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKKworIyB1bGh1IGlzIGhhbmRsZWQgbGlrZSB1bGguICBTYW5pdHkgY2hlY2sgaXQuCisJdWxodQkkNCwwCisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJkYzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcuZApAQCAtMCwwICsxLDI3MCBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKKyNuYW1lOiBNSVBTIHVsdworI2FzOiAtbWlwczEKKworIyBUZXN0IHRoZSB1bHcgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkemVyb1wpCiswKzAwMDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJHplcm9cKQorMCswMDA4IDxbXj5dKj4gbHdsCVwkYTAsWzE0XVwoXCR6ZXJvXCkKKzArMDAwYyA8W14+XSo+IGx3cglcJGEwLFsxNF1cKFwkemVyb1wpCiswKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDE0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwMTggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDAxYyA8W14+XSo+IGx3bAlcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKKzArMDAyMCA8W14+XSo+IGx3cglcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKKzArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDI4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwMmMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKKzArMDAzOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMDNjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwNDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGExXCkKKzArMDA0NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYTFcKQorMCswMDQ4IDxbXj5dKj4gbHdsCVwkYTAsWzE0XVwoXCRhMVwpCiswKzAwNGMgPFtePl0qPiBsd3IJXCRhMCxbLTAtOV0rXChcJGExXCkKKzArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDA1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDA1OCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMDVjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNjggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA2YyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKK1sgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDc0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwNzggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA4OCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKK1sgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwOTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA5NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAwOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDBhMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMGE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYWMgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBiMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDBiYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMGMwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwY2MgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBkMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKK1sgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGQ4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwZGMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBlYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKK1sgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAwZjQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBmOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTA0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxMDggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDEwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCitbIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxMTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDExNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDExYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxMjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDEyNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE0MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE1MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTU0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE2NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTcwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxNzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMTgwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxODQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDE5MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTk0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFhMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMWE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFiNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxYzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxZDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFkNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDFkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDFlMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMWU0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDFlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxZjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFmNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDFmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyMDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDIwNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIxMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMjE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMjI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDIzMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMjM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyNDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI0NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMjRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjUwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMjYwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjcwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI4NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI5NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDI5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyYTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDJhNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQorMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyYjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDJjMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMmM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMmNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDJkMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMmQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCisJLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTM2ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucwpAQCAtMCwwICsxLDY2IEBACisjIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgdWx3IG1hY3JvLgorCQorCS5kYXRhCitkYXRhX2xhYmVsOgorCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAorCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCisJLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCisJLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKKwkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCisJLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCisJCisJLnRleHQKKwl1bHcJJDQsMAorCXVsdwkkNCwxCisJdWx3CSQ0LDB4ODAwMAorCXVsdwkkNCwtMHg4MDAwCisJdWx3CSQ0LDB4MTAwMDAKKwl1bHcJJDQsMHgxYTVhNQorCXVsdwkkNCwwKCQ1KQorCXVsdwkkNCwxKCQ1KQorCXVsdwkkNCxkYXRhX2xhYmVsCisJdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCisJdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKwl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgorCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KKwl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbgorCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24KKwl1bHcJJDQsZGF0YV9sYWJlbCsxCisJdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQorCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQorCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzEKKwl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKKwl1bHcJJDQsZGF0YV9sYWJlbCsweDgwMDAKKwl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCisJdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCisJdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCisJdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKKwl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAorCXVsdwkkNCxkYXRhX2xhYmVsLTB4ODAwMAorCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKKwl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKKwl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKKwl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAorCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCisJdWx3CSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAorCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAorCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKKwl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKKwl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCisJdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCisJdWx3CSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQorCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQorCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKKwl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKKwl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1CisJdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1CisKKyMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCisJbm9wCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2MwYjczCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QuZApAQCAtMCwwICsxLDI3MCBAQAorI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKKyNuYW1lOiBNSVBTIHVzZAorI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKKworIyBUZXN0IHRoZSB1c2QgbWFjcm8uCisKKy4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkemVyb1wpCiswKzAwMDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJHplcm9cKQorMCswMDA4IDxbXj5dKj4gc2RsCVwkYTAsWzE4XVwoXCR6ZXJvXCkKKzArMDAwYyA8W14+XSo+IHNkcglcJGEwLFsxOF1cKFwkemVyb1wpCiswKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDE0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwMTggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDAxYyA8W14+XSo+IHNkbAlcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKKzArMDAyMCA8W14+XSo+IHNkcglcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKKzArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDI4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwMmMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQorMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKKzArMDAzOCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMDNjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGExXCkKKzArMDA0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYTFcKQorMCswMDQ4IDxbXj5dKj4gc2RsCVwkYTAsWzE4XVwoXCRhMVwpCiswKzAwNGMgPFtePl0qPiBzZHIJXCRhMCxbLTAtOV0rXChcJGExXCkKKzArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDA1NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwNTggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDA1YyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA2NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwNmMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDA3MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAorWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNzQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDA3OCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDA4MCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwODQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDA4OCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMDhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCitbIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMDljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMGEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwYTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDBhOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAwYWMgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDBiMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDBiOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwYmMgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDBjMCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYzggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBjYyA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMGQwIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZDQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKK1sgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGQ4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZGMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAwZTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGU4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZWMgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDBmMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQorWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDBmNCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMGY4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxMDAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTA0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMDggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDEwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDEyMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDE0NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMTUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxNTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDE1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDE1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxNjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDE2NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE3MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTc0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMTdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxODAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDE4NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMTg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDE5MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMTk0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDFhNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDFiMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMWI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxYjggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxYzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxZDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxZGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMWUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAxZTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDFlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMWVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxZjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDFmNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDFmYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjAwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyMDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyMTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDIxOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjIxODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIyMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMjI0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMjJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDIzNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDI0MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMjQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjUwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyNTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDI2MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMjY0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMjZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDI3NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMjc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyODAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDI4NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJhMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQorMCswMmE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyYTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMmIwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyYjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKzArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDJiYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyYzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKKzArMDJjNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQorMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDJjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMmQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCiswKzAyZDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKKwkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzY3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzZC5zCkBAIC0wLDAgKzEsNjYgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1c2QgbWFjcm8uCisJCisJLmRhdGEKK2RhdGFfbGFiZWw6CisJLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCisJLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKKwkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKKwkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQorCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKKwkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKKwkKKwkudGV4dAorCXVzZAkkNCwwCisJdXNkCSQ0LDEKKwl1c2QJJDQsMHg4MDAwCisJdXNkCSQ0LC0weDgwMDAKKwl1c2QJJDQsMHgxMDAwMAorCXVzZAkkNCwweDFhNWE1CisJdXNkCSQ0LDAoJDUpCisJdXNkCSQ0LDEoJDUpCisJdXNkCSQ0LGRhdGFfbGFiZWwKKwl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKwl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgorCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uCisJdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCXVzZAkkNCxkYXRhX2xhYmVsKzEKKwl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCisJdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCXVzZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAorCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAorCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCisJdXNkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCisJdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCisJdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCisJdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKKwl1c2QJJDQsZGF0YV9sYWJlbCsweDEwMDAwCisJdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1c2QJJDQsZGF0YV9sYWJlbCsweDFhNWE1CisJdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKKworIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KKwlub3AKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjBhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kCkBAIC0wLDAgKzEsNDU1IEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgdXNoCisjYXM6IC1taXBzMQorCisjIFRlc3QgdGhlIHVzaCBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJHplcm9cKQorMCswMDA0IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKKzArMDAwOCA8W14+XSo+IHNiCVwkYXQsWzAxXVwoXCR6ZXJvXCkKKzArMDAwYyA8W14+XSo+IHNiCVwkYTAsWzEyXVwoXCR6ZXJvXCkKKzArMDAxMCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4CiswKzAwMTQgPFtePl0qPiBzYglcJGF0LFsxMl1cKFwkemVyb1wpCiswKzAwMTggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAorMCswMDFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDAyMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDAzNCA8W14+XSo+IHNiCVwkYTAsLTMyNzZbNzhdXChcJHplcm9cKQorMCswMDM4IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKKzArMDAzYyA8W14+XSo+IHNiCVwkYXQsLTMyNzZbNzhdXChcJHplcm9cKQorMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDA0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDA1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwNjAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMDY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDA2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwNmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMDcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwNzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMDc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDA3YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhMVwpCiswKzAwODAgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAorMCswMDg0IDxbXj5dKj4gc2IJXCRhdCxbMDFdXChcJGExXCkKKzArMDA4OCA8W14+XSo+IHNiCVwkYTAsWzEyXVwoXCRhMVwpCiswKzAwOGMgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAorMCswMDkwIDxbXj5dKj4gc2IJXCRhdCxbMTJdXChcJGExXCkKKzArMDA5NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDA5OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDA5YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwYTAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMGE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDBhOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMGFjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDBiMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMGMwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDBjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwYzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDBjYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAwZDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKK1sgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGQ4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDBkYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAwZTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMGU0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAwZTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMGVjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDBmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBmNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDBmOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAwZmMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMTAwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDEwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMTA4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDEwYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAxMTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAorWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAxMTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDExYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxMjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDEyNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxMjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMTM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDEzOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAxM2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxNDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCitbIAldKjE0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxNTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTU0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDE1OCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxNWMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDE2MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxNjQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTcwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDE3NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAxNzggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTdjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxODAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMTg0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTkwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDE5NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAxOTggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMTljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMWE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDFhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKjFhODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMWIwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDFiNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxYjggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDFiYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAxYzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDFkMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAxZDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMWQ4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAxZGMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMWUwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDFlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKjFlNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDFlOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAxZWMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMWYwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDFmNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMWY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDFmYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMjAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMjA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMjA4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDIwYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAyMTAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMjE0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAyMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMjFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDIyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCitbIAldKjIyMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMjI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDIyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyMzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDIzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyMzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMjNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDI0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAyNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMjQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDI0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDI1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMjVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyNjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyNjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMjZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDI3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMjc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDI3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyN2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMjhjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDI5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMjk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDI5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyOWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMmEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDJhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyYTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMmFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDJiMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMmI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDJiOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAyYmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAyYzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMmM4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDJjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAyZDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDJkNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAyZDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMmRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMmUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswMmU0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDJlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAyZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMmYwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAyZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMmY4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDJmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzMDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMzA0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDMwOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAzMGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMzEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAzMTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMzE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDMxYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMzIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMzIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDMyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzMjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMzJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDMzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMzM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDMzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzM2MgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMzNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSozNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzNDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswMzRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDM1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswMzU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDM1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzNWMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMzVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDM2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjM2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAzNjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMzY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDM2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzNzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDM3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAzNzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswMzdjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjM3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAzODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSozODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMzg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDM4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzAzOGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswMzkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzAzOTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswMzk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDM5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSozOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSozYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzAzYTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswM2E4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDNhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzYjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDNiNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAzYjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswM2JjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjNiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDNjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjNjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDNjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzYzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswM2NjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDNkMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswM2Q0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDNkOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDNlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjNlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAzZTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswM2U4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDNlYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzAzZjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDNmNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzAzZjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qM2ZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDQwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjQwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzA0MDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNDA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDQwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0MTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDQxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA0MTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNDFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA0MjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSo0MjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQyNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0MjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswNDJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDQzMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswNDM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDQzOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzA0M2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo0M2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNDQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qNDQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDQ0NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0NDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswNDRjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDQ1MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswNDU0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDQ1OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzA0NWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswNDYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qNDYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDQ2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0NjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswNDZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDQ3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswNDc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDQ3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzA0N2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo0N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0ODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAorWyAJXSo0ODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCiswKzA0ODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNDg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDQ4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA0OTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDQ5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA0OTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNDljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswNGEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNGEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgorMCswNGE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDRhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzA0YWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNGIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzA0YjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswNGI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDRiYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRiYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzA0YzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo0YzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswNGM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDRjOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzA0Y2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNGQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzA0ZDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswNGQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDRkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzA0ZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo0ZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswNGU0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDRlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzA0ZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNGYwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzA0ZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswNGY4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDRmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjRmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswNTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA1MDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNTA4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDUwYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA1MTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDUxNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA1MTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNTFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNTFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDUyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjUyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzA1MjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNTI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDUyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA1MzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDUzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA1MzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNTNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDU0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjU0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzA1NDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNTQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKKzArMDU0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA1NTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKKzArMDU1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4CiswKzA1NTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAorMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNTYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswNTY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDU2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4CiswKzA1NmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQorMCswNTcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCiswKzA1NzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAorMCswNTc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKKzArMDU3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjU3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDU4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjU4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDU4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA1ODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswNThjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDU5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswNTk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDU5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzA1OWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSo1OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswNWEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDVhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCiswKzA1YTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAorMCswNWFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKKzArMDViMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQorMCswNWI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKKzArMDViOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CiswKzA1YmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTU4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5zCkBAIC0wLDAgKzEsNjUgQEAKKyMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1c2ggbWFjcm8uCisJCisJLmRhdGEKK2RhdGFfbGFiZWw6CisJLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCisJLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKKwkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKKwkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQorCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKKwkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKKwkKKwkudGV4dAorCXVzaAkkNCwwCisJdXNoCSQ0LDEKKwl1c2gJJDQsMHg4MDAwCisJdXNoCSQ0LC0weDgwMDAKKwl1c2gJJDQsMHgxMDAwMAorCXVzaAkkNCwweDFhNWE1CisJdXNoCSQ0LDAoJDUpCisJdXNoCSQ0LDEoJDUpCisJdXNoCSQ0LGRhdGFfbGFiZWwKKwl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKwl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCisJdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgorCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uCisJdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgorCXVzaAkkNCxkYXRhX2xhYmVsKzEKKwl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKKwl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCisJdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCisJdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24rMQorCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQorCXVzaAkkNCxkYXRhX2xhYmVsKzB4ODAwMAorCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKKwl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKKwl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAorCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCisJdXNoCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCisJdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAorCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAorCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCisJdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCisJdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKKwl1c2gJJDQsZGF0YV9sYWJlbCsweDEwMDAwCisJdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCisJdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAorCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKKwl1c2gJJDQsZGF0YV9sYWJlbCsweDFhNWE1CisJdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1CisJdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQorCXVzaAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKKwl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKKworIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDI4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vzdy5kCkBAIC0wLDAgKzEsMjcwIEBACisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAorI25hbWU6IE1JUFMgdXN3CisjYXM6IC1taXBzMQorCisjIFRlc3QgdGhlIHVzdyBtYWNyby4KKworLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorMCswMDAwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCR6ZXJvXCkKKzArMDAwNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkemVyb1wpCiswKzAwMDggPFtePl0qPiBzd2wJXCRhMCxbMTRdXChcJHplcm9cKQorMCswMDBjIDxbXj5dKj4gc3dyCVwkYTAsWzE0XVwoXCR6ZXJvXCkKKzArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCiswKzAwMTQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDAxOCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMDFjIDxbXj5dKj4gc3dsCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQorMCswMDIwIDxbXj5dKj4gc3dyCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQorMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMjggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDAyYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCiswKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQorMCswMDM4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwM2MgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA0MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYTFcKQorMCswMDQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhMVwpCiswKzAwNDggPFtePl0qPiBzd2wJXCRhMCxbMTRdXChcJGExXCkKKzArMDA0YyA8W14+XSo+IHN3cglcJGEwLFstMC05XStcKFwkYTFcKQorMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMDU4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwNWMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMDY4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwNmMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCitbIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDA3NCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMDc4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMDg0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwODggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCitbIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMDkwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwOTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgorMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAwYTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBhNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKK1sgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMGFjIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwYjAgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAwYmMgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBjMCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAwYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMGNjIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwZDAgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDBkOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMGRjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMGU4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwZWMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCitbIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMGY0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAwZjggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDEwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDEwNCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTA4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKworWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgorMCswMTEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxMTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMTIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxMjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxMzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDEzNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDEzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxNDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE0NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAxNTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE1NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMTYwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxNjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDE2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDE3MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTc0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMTdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDE4MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMTg0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKKzArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxOTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDE5NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMTljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFhNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAxYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMWIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxYjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMWJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDFjMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMWM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKK1sgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMWQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxZDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAorWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAxZGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAxZTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFlNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCitbIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAxZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgorMCswMWYwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAxZjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCiswKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgorMCswMjAwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyMDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDIxNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDIxYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyMjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDIyNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KKzArMDIyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCitbIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyMzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDIzNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKK1sgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgorMCswMjQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKKzArMDI0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKKzArMDI1MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMjU0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgorMCswMjVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKKzArMDI2MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMjY0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgorMCswMjZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKK1sgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKKzArMDI3MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMjc0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKKzArMDI3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjgwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyODQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCiswKzAyOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAorMCswMjkwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyOTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCiswKzAyOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgorMCswMmEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyYTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKKzArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCitbIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KKzArMDJiMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQorMCswMmI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCiswKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKworWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCiswKzAyYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKworWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCiswKzAyYzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDJjNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKK1sgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKKzArMDJjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCitbIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCiswKzAyZDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKKzArMDJkNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQorCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxYzYwYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMKQEAgLTAsMCArMSw2NiBAQAorIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVzdyBtYWNyby4KKwkKKwkuZGF0YQorZGF0YV9sYWJlbDoKKwkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKKwkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQorCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAorCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCisJLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAorCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQorCQorCS50ZXh0CisJdXN3CSQ0LDAKKwl1c3cJJDQsMQorCXVzdwkkNCwweDgwMDAKKwl1c3cJJDQsLTB4ODAwMAorCXVzdwkkNCwweDEwMDAwCisJdXN3CSQ0LDB4MWE1YTUKKwl1c3cJJDQsMCgkNSkKKwl1c3cJJDQsMSgkNSkKKwl1c3cJJDQsZGF0YV9sYWJlbAorCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAorCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCisJdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24KKwl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCisJdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24KKwl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uCisJdXN3CSQ0LGRhdGFfbGFiZWwrMQorCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCisJdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQorCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKKwl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKKwl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbisxCisJdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCisJdXN3CSQ0LGRhdGFfbGFiZWwrMHg4MDAwCisJdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAorCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAorCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAorCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCisJdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCisJdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKKwl1c3cJJDQsZGF0YV9sYWJlbC0weDgwMDAKKwl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCisJdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCisJdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCisJdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKKwl1c3cJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKKwl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAorCXVzdwkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKKwl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAorCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKKwl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCisJdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCisJdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAorCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAorCXVzdwkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKKwl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQorCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKKwl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1CisJdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1CisJdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQorCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQorCisjIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgorCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYWRkLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyNTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYWRkLnMKQEAgLTAsMCArMSwxMyBAQAorCS50ZXh0CisJYWRkIGQxLGQyCisJYWRkIGQyLGEzCisJYWRkIGEyLGQxCisJYWRkIGEzLGEyCisJYWRkIDE2LGQxCisJYWRkIDI1NixkMgorCWFkZCAxMzEwNzEsZDMKKwlhZGQgMTYsYTEKKwlhZGQgMjU2LGEyCisJYWRkIDEzMTA3MSxhMworCWFkZGMgZDEsZDIKKwlhZGRuZiAxNixhMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2Jhc2ljLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkzZWIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iYXNpYy5leHAKQEAgLTAsMCArMSw4MzYgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIERlamFHbnVAY3lnbnVzLmNvbQorCisjIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK3Byb2MgZG9fYWRkIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBBZGQgb3BlcmF0aW9ucyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMjBCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMkM5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMjRFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBENTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGNzFBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjQ2M0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBEMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNzBBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjQ2N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgRjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRjUwRTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19iY2Mge30geworICAgIHNldCB0ZXN0bmFtZSAiYmNjLnM6IEJjYyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImJjYy5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEU5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEUyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEUzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEUwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEU1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEU2MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEU3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEU0MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY1RkMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjVGRDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGNUZFMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIEY1RkYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRUEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fYmNjeCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiY2N4LnM6IEJjY3ggdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiY2N4LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjVFODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNUU5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY1RTEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjVFMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGNUUzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY1RTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjVFNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGNUU2MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY1RTcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRjVFNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGNUVDMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEY1RUQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjVFRTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGNUVGMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2JpdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYml0LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUwNTQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNzA2MDAyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjAyOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjAzOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEyICtGRkZGNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCisKK3Byb2MgZG9fY21wIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImNtcC5zOiBjbXAgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJjbXAucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMjJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMkVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMjZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEQjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGNzRBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjQ3OUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBFRTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY0N0RGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTAgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2V4dCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJleHQuczogZXh0IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiZXh0LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjNDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQjJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBCN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEJBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgQkRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT01XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2V4dGVuZCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJleHRlbmQuczogZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJleHRlbmQucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGOTAyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZCMDMwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGRDAzMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzcgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjYxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjkxNjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQjE3MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkQxNzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNjRCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNjc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19sb2dpY2FsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNTAyN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEY3MDNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGNzEwRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjMxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjUwQTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNzQzRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjcxNEZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYzMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY3NEZGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGM0U3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbG9vcCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJsb29wLnM6IGxvb3AgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJsb29wLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDhcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBEOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEQxXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRDJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEM1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBENlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBEQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIERCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbW92MSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3YxLnM6IG1vdjEgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3YxLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjIzNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjJGOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgODZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMjc5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGM0YzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGM0Q4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGM0UxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGM0M4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiAyOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDY5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY3QzkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNDg5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEzICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3YyIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdjIuczogbW92MiB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdjIucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMTU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDOTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEY0QzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgNzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjdCOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY0RjlGRkZGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEYxMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY3MzEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGNEQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEwICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3YzIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdjMuczogbW92MyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdjMucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgNDkyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjc4OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY0MDlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjFFOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgQzE4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGNDQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IDU5MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3QTkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNDE5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzExICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3Y0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdjQuczogbW92NCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdjQucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMUE5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNzIxODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjQ1MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiA4NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY0NzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgREQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNDc1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzkgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX21vdngge30geworICAgIHNldCB0ZXN0bmFtZSAibW92eC5zOiBtb3Z4IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92eC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1NzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjc3OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY0QjlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjU1OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGNzY5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjQzOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT04XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX21vdmIge30geworICAgIHNldCB0ZXN0bmFtZSAibW92Yi5zOiBtb3ZiIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92Yi5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MjkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjdEOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY0QTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjA2QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjRDNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs2ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyAxOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjUxOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGNzk5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRjQyOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjBFOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgQzUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGNDQ1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEzICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3ZidSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3ZidS5zOiBtb3ZidSB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdmJ1LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEY1MzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjc1OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEY0OTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgQ0QwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNEM5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbW92aHUge30geworICAgIHNldCB0ZXN0bmFtZSAibW92aHUuczogbW92aHUgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3ZodS5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE2NjAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNjYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEJEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQkQwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0JEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzggK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjRBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzk4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0FEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzExICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE3NjAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTUgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5NzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxOCArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNERBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNzAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMjEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbW92bSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3ZtLnM6IG1vdm0gdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3ZtLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQ0UzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQ0VGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQ0YzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0ZGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tdWxkaXYge30geworICAgIHNldCB0ZXN0bmFtZSAibXVsZGl2LnM6IG11bGRpdiB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm11bGRpdi5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYzNUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYzNkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fb3RoZXIge30geworICAgIHNldCB0ZXN0bmFtZSAib3RoZXIuczogb3RoZXIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJvdGhlci5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZDMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjRFMEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICszICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGMDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY0RTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNiArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc2hpZnQge30geworICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYzM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYzMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYzMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fc3ViIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjJERlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjcxRUZGN0YgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGNDZBRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY3MEVGRjdGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjQ2RUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs5ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSBGMjk2IFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK2lmIFtpc3RhcmdldCBtbjEwMjAwKi0qLSpdIHRoZW4geworICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgorICAgIGRvX2FkZAorICAgIGRvX2JjYworICAgIGRvX2JjY3gKKyAgICBkb19iaXQKKyAgICBkb19jbXAKKyAgICBkb19leHQKKyAgICBkb19sb2dpY2FsCisgICAgZG9fbW92MQorICAgIGRvX21vdjIKKyAgICBkb19tb3YzCisgICAgZG9fbW92NAorICAgIGRvX21vdmIKKyAgICBkb19tb3Z4CisgICAgZG9fbW92YnUKKyAgICBkb19tdWxkaXYKKyAgICBkb19vdGhlcgorICAgIGRvX3NoaWZ0CisgICAgZG9fc3ViCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkyZGNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucwpAQCAtMCwwICsxLDE3IEBACisJLnRleHQKK2ZvbzoKKwliZXEgZm9vCisJYm5lIGZvbworCWJndCBmb28KKwliZ2UgZm9vCisJYmxlIGZvbworCWJsdCBmb28KKwliaGkgZm9vCisJYmNjIGZvbworCWJscyBmb28JCisJYmNzIGZvbworCWJ2YyBmb28KKwlidnMgZm9vCisJYm5jIGZvbworCWJucyBmb28KKwlicmEgZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmNjeC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTdlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucwpAQCAtMCwwICsxLDE2IEBACisJLnRleHQKK2ZvbzoKKwliZXF4IGZvbworCWJuZXggZm9vCisJYmd0eCBmb28KKwliZ2V4IGZvbworCWJsZXggZm9vCisJYmx0eCBmb28KKwliaGl4IGZvbworCWJjY3ggZm9vCisJYmxzeCBmb28JCisJYmNzeCBmb28KKwlidmN4IGZvbworCWJ2c3ggZm9vCisJYm5jeCBmb28KKwlibnN4IGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiNjBkNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYml0LnMKQEAgLTAsMCArMSw1IEBACisJLnRleHQKKwlidHN0IDY0LGQxCisJYnRzdCA4MTkyLGQyCisJYnNldCBkMSwoYTIpCisJYmNsciBkMSwoYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM5MjViCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucwpAQCAtMCwwICsxLDEwIEBACisJLnRleHQKKwljbXAgZDEsZDIKKwljbXAgZDIsYTMKKwljbXAgYTMsZDMKKwljbXAgYTMsYTIKKwljbXAgMTYsZDMKKwljbXAgMjU2LGQyCisJY21wIDEzMTA3MSxkMQorCWNtcCAyNTYsYTIKKwljbXAgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2V4dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUwMWJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucwpAQCAtMCwwICsxLDcgQEAKKwkudGV4dAorCWV4dCBkMQorCWV4dHggZDIKKwlleHR4dSBkMworCWV4dHhiIGQyCisJZXh0eGJ1IGQxCisJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDlkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2xvZ2ljYWwucwpAQCAtMCwwICsxLDEyIEBACisJLnRleHQKKwlhbmQgZDEsZDIKKwlhbmQgMTI3LGQyCisJYW5kIDMyNzY3LGQzCisJYW5kIDMyNzY3LHBzdworCW9yIGQxLGQyCisJb3IgMTI3LGQyCisJb3IgMzI3NjcsZDMKKwlvciAzMjc2Nyxwc3cKKwl4b3IgZDEsZDIKKwl4b3IgMzI3NjcsZDMKKwlub3QgZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyOGUzMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zCkBAIC0wLDAgKzEsMTMgQEAKKwkudGV4dAorCW1vdiBkMSxhMgorCW1vdiBhMixkMQorCW1vdiBkMSxkMgorCW1vdiBhMixhMQorCW1vdiBwc3csZDMKKwltb3YgZDIscHN3CisJbW92IG1kcixkMQorCW1vdiBkMixtZHIKKwltb3YgKGEyKSxkMQorCW1vdiAoOCxhMiksZDEKKwltb3YgKDI1NixhMiksZDEKKwltb3YgKDEzMTA3MSxhMiksZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmNmUyNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zCkBAIC0wLDAgKzEsMTAgQEAKKwkudGV4dAorCW1vdiAoZDEsYTEpLGQyCisJbW92ICgzMjc2OCksZDEKKwltb3YgKDEzMTA3MSksZDEKKwltb3YgKDgsYTIpLGExCisJbW92ICgyNTYsYTIpLGExCisJbW92ICgxMzEwNzEsYTIpLGExCisJbW92IChkMSxhMSksYTIKKyAgICAgICAgbW92ICgzMjc2OCksYTEKKyAgICAgICAgbW92ICgxMzEwNzEpLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzQ5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjMucwpAQCAtMCwwICsxLDExIEBACisJLnRleHQKKyAgICAgICAgbW92IGQxLChhMikKKyAgICAgICAgbW92IGQxLCgzMixhMikKKwltb3YgZDEsKDI1NixhMikKKwltb3YgZDEsKDEzMTA3MSxhMikKKwltb3YgZDEsKGQyLGEyKQorCW1vdiBkMSwoMTI4KQorCW1vdiBkMSwoMTMxMDcxKQorCW1vdiBhMSwoMzIsYTIpCisJbW92IGExLCgyNTYsYTIpCisJbW92IGExLCgxMzEwNzEsYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTg3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucwpAQCAtMCwwICsxLDkgQEAKKwkudGV4dAorCW1vdiBhMSwoZDIsYTIpCisJbW92IGExLCgxMjgpCisJbW92IGExLCgxMzEwNzEpCisJbW92IDgsZDEKKwltb3YgMjU2LGQxCisJbW92IDEzMTA3MSxkMQorCW1vdiAyNTYsYTEKKwltb3YgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Yi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTY2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucwpAQCAtMCwwICsxLDEzIEBACisJLnRleHQKKwltb3ZiICg4LGEyKSxkMQorCW1vdmIgKDI1NixhMiksZDEKKwltb3ZiICgxMzEwNzEsYTIpLGQxCisJbW92YiAoZDIsYTIpLGQzCisJbW92YiAoMTMxMDcxKSxkMgorCW1vdmIgZDEsKGEyKQorCW1vdmIgZDEsKDgsYTIpCisJbW92YiBkMSwoMjU2LGEyKQorCW1vdmIgZDEsKDEzMTA3MSxhMikKKwltb3ZiIGQxLChkMixhMikKKwltb3ZiIGQxLCgyNTYpCisJbW92YiBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDk3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMKQEAgLTAsMCArMSw4IEBACisJLnRleHQKKwltb3ZidSAoYTIpLGQxCisJbW92YnUgKDgsYTIpLGQxCisJbW92YnUgKDI1NixhMiksZDEKKwltb3ZidSAoMTMxMDcxLGEyKSxkMQorCW1vdmJ1IChkMSxhMSksZDIKKwltb3ZidSAoMzI3NjgpLGQxCisJbW92YnUgKDEzMTA3MSksZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlMWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zCkBAIC0wLDAgKzEsNyBAQAorCS50ZXh0CisJbW92eCAoOCxhMiksZDEKKwltb3Z4ICgyNTYsYTIpLGQxCisJbW92eCAoMTMxMDcxLGEyKSxkMQorCW1vdnggZDEsKDgsYTIpCisJbW92eCBkMSwoMjU2LGEyKQorCW1vdnggZDEsKDEzMTA3MSxhMikKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTcwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zCkBAIC0wLDAgKzEsNCBAQAorCS50ZXh0CisJbXVsIGQxLGQyCisJbXVsdSBkMixkMworCWRpdnUgZDMsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y5NGJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zCkBAIC0wLDAgKzEsMTAgQEAKKwkudGV4dAorCWptcCAyNTYKKwlqbXAgMTMxMDcxCisJam1wIChhMikKKwlqc3IgMjU2CisJanNyIDEzMTA3MQorCWpzciAoYTIpCisJcnRzCisJcnRpCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZTc2OQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc2hpZnQucwpAQCAtMCwwICsxLDUgQEAKKwkudGV4dAorCWFzciBkMgorCWxzciBkMworCXJvciBkMQorCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1MTY1NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMKQEAgLTAsMCArMSwxMCBAQAorCS50ZXh0CisJc3ViIGQxLGQyCisJc3ViIGQyLGEzCisJc3ViIGEzLGQzCisJc3ViIGEzLGEyCisJc3ViIDMyNzY3LGQyCisJc3ViIDEzMTA3MSxkMgorCXN1YiAzMjc2NyxhMgorCXN1YiAxMzEwNzEsYTIKKwlzdWJjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY1NThmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9hZGQucwpAQCAtMCwwICsxLDE1IEBACisJLnRleHQKKwlhZGQgZDEsZDIKKwlhZGQgZDIsYTMKKwlhZGQgYTMsYTIKKwlhZGQgYTIsZDEKKwlhZGQgMTYsZDEKKwlhZGQgMjU2LGQyCisJYWRkIDEzMTA3MSxkMworCWFkZCAxNixhMQorCWFkZCAyNTYsYTIKKwlhZGQgMTMxMDcxLGEzCisJYWRkIDE2LHNwCisJYWRkIDI1NixzcAorCWFkZCAxMzEwNzEsc3AKKwlhZGRjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmFzaWMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDU3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cApAQCAtMCwwICsxLDk4NiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKKyMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworcHJvYyBkb19hZGQge30geworICAgIHNldCB0ZXN0bmFtZSAiYWRkLnM6IEFkZCBvcGVyYXRpb25zIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYWRkLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxNkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxN0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEYxNTlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IDI5MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZBQzIwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGQ0MzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgMjExMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRkFEMjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IEZDRDNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRjhGRTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUZFMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRkNGRUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGMTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19iY2Mge30geworICAgIHNldCB0ZXN0bmFtZSAiYmNjLnM6IEJjYyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImJjYy5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEMxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEMyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEMzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEMwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEM1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEM2MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEM3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEM0MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY4RTgwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjhFOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGOEVBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIEY4RUIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQ0EwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fYml0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImJpdC5zOiBiaXQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGOEVENDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEZBRUUwMDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGQ0VGRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkFGOTA4NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDExIEZFMDJGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNiArMDEwMDQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjA4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRkFGMTA4NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEZFMDBGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArOSArMDEwMDQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjUgRjA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRkFGNTA4NDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJiIEZFMDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTIgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2NtcCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjbXAuczogY21wIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiY21wLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQTZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMUFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMTlGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBCRVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEFGMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZBQ0EwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGQ0M5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgQkYxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkFEQTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZDRDlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZXh0IHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImV4dC5zOiBleHQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJleHQucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMkQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiAxMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIDE3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMUFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSAxRFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fZXh0ZW5kIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImV4dGVuZC5zOiBleHRlbmRlZCBpbnN0cnVjdGlvbiB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImV4dGVuZC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY2RkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEY2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY5MDIxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkIwMzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZEMDNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGNjE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGOTE2MTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEZCMTcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGRDE3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEY2NEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEY2NUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEY2NzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2xvZ2ljYWwge30geworICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4RTI3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkFFM0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDRTNGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGQUZDRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjIxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjhFNjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQUU3RkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkNFN0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUZERkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRkFFQkZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEZDRUJGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRjIzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl5cW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2xvb3Age30geworICAgIHNldCB0ZXN0bmFtZSAibG9vcC5zOiBsb29wIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibG9vcC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEQ4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRDlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBEMVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEQyXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRDNcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBEMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEQ1XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRDZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEQ0XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgREFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBEQlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX21vdjEge30geworICAgIHNldCB0ZXN0bmFtZSAibW92MS5zOiBtb3YxIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibW92MS5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDg2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjFFNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjFEOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgOTlcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiAzRVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEYyRjRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEYyRkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEYyRTFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEYyRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDc2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjgwNjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGQTA2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRkMwNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxNCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCA1OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGQUI1MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjMgRjJFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbW92MiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3YyLnM6IG1vdjIgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3YyLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkNCNUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsyICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYzMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMxMDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgRkNBNUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDExIEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEY4MjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRkEyNjAwMDEgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGQzI2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzkgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgNUQwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFCMTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEZDQjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTIgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjNBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRkFBMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEZDQTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjhGMTIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0yMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3YzIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdjMuczogbW92MyB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdjMucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjgxNjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQTE2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkMxNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIDQ2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEZBOTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGQzk1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjM1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDU4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZiBGQzg1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEYwMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEY4MzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRkEzNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEZDMzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgNDcyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbW92NCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3Y0LnM6IG1vdjQgdGVzdHMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3Y0LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRkE5NDAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEZDOTRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGM0RBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGQTg0ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRkM4NEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs2ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY4RjUyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTkgODUwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgMkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGQ0NERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEwICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDk1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IDI1MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRkNEREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3ZidSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3ZidS5zOiBtb3ZidSB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdmJ1LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjg0NjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQTQ2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkM0NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY4QjkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFCOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZDQjlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNDI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSAzNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEZDQTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjA1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRjg1NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQTU2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkM1NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGODk2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEZBOTYwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZCBGQzk2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzE4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY0NUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ1IDA2ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkM4NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsyMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0yNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3ZodSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtb3ZodS5zOiBtb3ZodSB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdmh1LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjA2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjg2NjA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGQTY2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRkM2NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY4QkQwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFCRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZDQkRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNEE1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSAzOTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEZDQURGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjcgRjA3NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjkgRjg3NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQTc2MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRkM3NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGODk3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM5IEZBOTcwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZCBGQzk3RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzE4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY0REFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ1IDA3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRkM4N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsyMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0yNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19tb3ZtIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1vdm0uczogbW92bSB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1vdm0ucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDRTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDRUY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDRjMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDRkY4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX211bGRpdiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJtdWxkaXYuczogbXVsZGl2IHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibXVsZGl2LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjI1QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjI2RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjI3RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19vdGhlciB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJvdGhlci5zOiBvdGhlciB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm90aGVyLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSA0NFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgNTNcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDQzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IERDRkZGRjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArOCArMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgQ0QwMDAxMzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs5ICswOVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBEREZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEwICswMDMwMjBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGMEYyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGQUZGMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRkNGRkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMyArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBERjMwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IERFMzAwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjBGQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRjBGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjBGRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgQ0JcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMyBGMEZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT0yM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19zaGlmdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJzaGlmdC5zOiBzaGlmdCB0ZXN0cyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgInNoaWZ0LnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjJCNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjhDQTA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMkFCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGOEM3MDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYyOUVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEY4QzIwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgNTZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGMjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGMjgyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX3N1YiB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJzdWIuczogc3ViIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAic3ViLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjEyQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjExRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjEzRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRkNDNkZGRkYgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGQ0Q1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzcgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb191ZGYge30geworICAgIHNldCB0ZXN0bmFtZSAidWRmLnM6IHVkZiB0ZXN0cyBwYXJ0IDEiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJ1ZGYucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNjAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNjExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGNjMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGNjQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGNjUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGNjYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBGNjcxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGNjgxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNjkxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNkExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNkIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNkMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGNkQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNkUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGNkYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGNTAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNTExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNTIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBGNTQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBGNTUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGNTYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGNTcxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBGNTgxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGNTkxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBGNUExXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNiBGNUIxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBGNUMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYSBGNUQxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBGNUUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzZSBGNUYxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBGOTAxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQzIEY5MTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDYgRjkyMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OSBGOTMxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEY5NDE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGYgRjk1MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MiBGOTYxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU1IEY5NzE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggRjk4MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YiBGOTkxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVlIEY5QTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjEgRjlCMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBGOUMxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY3IEY5RDE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmEgRjlFMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA2ZCBGOUYxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIEZCMDFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBGQjExRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggRkIyMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIEZCMzFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBGQjQxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgRkI1MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IEZCNjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBGQjcxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgRkI4MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IEZCOTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBGQkExRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgRkJCMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIEZCQzFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBGQkQxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggRkJFMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIEZCRjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBGRDAxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzY2ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI2IEZEMTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNjcgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgRkQyMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs2OCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMiBGRDMxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzY5ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IEZENDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNzAgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2UgRkQ1MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs3MSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBGRDYxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzcyICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRhIEZENzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNzMgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgRkQ4MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs3NCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNiBGRDkxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzc1ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIEZEQTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNzYgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjIgRkRCMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs3NyArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBGREMxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzc4ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZlIEZERDFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArNzkgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgRkRFMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICs4MCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYSBGREYxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzgxICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIEY5MDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTMgRjkxNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExNiBGOTI1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE5IEY5MzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgRjk0NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDExZiBGOTU1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIyIEY5NjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjUgRjk3NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCBGOTg1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJiIEY5OTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmUgRjlBNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzMSBGOUI1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IEY5QzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzcgRjlENTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDEzYSBGOUU1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNkIEY5RjU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDAgRkIwNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IEZCMTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE0OCBGQjI1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNGMgRkIzNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIEZCNDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE1NCBGQjU1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTggRkI2NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIEZCNzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE2MCBGQjg1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjQgRkI5NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IEZCQTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE2YyBGQkI1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzAgRkJDNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IEZCRDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE3OCBGQkU1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxN2MgRkJGNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTgwIEZEMDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTE0ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODYgRkQxNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMTUgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyBGRDI1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzExNiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMTkyIEZEMzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTE3ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTggRkQ0NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMTggKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDE5ZSBGRDU1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzExOSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWE0IEZENjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTIwICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYWEgRkQ3NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMjEgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCBGRDg1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEyMiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI2IEZEOTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTIzICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYmMgRkRBNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMjQgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFjMiBGREI1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEyNSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM4IEZEQzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTI2ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxY2UgRkRENTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICsxMjcgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDFkNCBGREU1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gKzEyOCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMWRhIEZERjUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArMTI5ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MTYwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCisKK2lmIFtpc3RhcmdldCBtbjEwMzAwKi0qLSpdIHRoZW4geworICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgorICAgIGRvX2FkZAorICAgIGRvX2JjYworICAgIGRvX2JpdAorICAgIGRvX2NtcAorICAgIGRvX2V4dAorICAgIGRvX2V4dGVuZAorICAgIGRvX2xvZ2ljYWwKKyAgICBkb19sb29wCisgICAgZG9fbW92MQorICAgIGRvX21vdjIKKyAgICBkb19tb3YzCisgICAgZG9fbW92NAorICAgIGRvX21vdmJ1CisgICAgZG9fbW92aHUKKyAgICBkb19tb3ZtCisgICAgZG9fbXVsZGl2CisgICAgZG9fb3RoZXIKKyAgICBkb19zaGlmdAorICAgIGRvX3N1YgorICAgIGRvX3VkZgorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5MmRjZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMKQEAgLTAsMCArMSwxNyBAQAorCS50ZXh0Citmb286CisJYmVxIGZvbworCWJuZSBmb28KKwliZ3QgZm9vCisJYmdlIGZvbworCWJsZSBmb28KKwlibHQgZm9vCisJYmhpIGZvbworCWJjYyBmb28KKwlibHMgZm9vCQorCWJjcyBmb28KKwlidmMgZm9vCisJYnZzIGZvbworCWJuYyBmb28KKwlibnMgZm9vCisJYnJhIGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYml0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjNTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYml0LnMKQEAgLTAsMCArMSwxMiBAQAorCS50ZXh0CisJYnRzdCA2NCxkMQorCWJ0c3QgODE5MixkMgorCWJ0c3QgMTMxMDcxLGQzCisJYnRzdCA2NCwoOCxhMSkKKwlidHN0IDY0LCgxMzEwNzEpCisJYnNldCBkMSwoYTIpCisJYnNldCA2NCwoOCxhMSkKKwlic2V0IDY0LCgxMzEwNzEpCisJYmNsciBkMSwoYTIpCisJYmNsciA2NCwoOCxhMSkKKwliY2xyIDY0LCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhhNzFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucwpAQCAtMCwwICsxLDExIEBACisJLnRleHQKKwljbXAgZDEsZDIKKwljbXAgZDIsYTMKKwljbXAgYTMsZDMKKwljbXAgYTMsYTIKKwljbXAgMTYsZDMKKwljbXAgMjU2LGQyCisJY21wIDEzMTA3MSxkMQorCWNtcCAxNixhMworCWNtcCAyNTYsYTIKKwljbXAgMTMxMDcxLGExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGUyZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucwpAQCAtMCwwICsxLDcgQEAKKwkudGV4dAorCWV4dCBkMQorCWV4dGIgZDIKKwlleHRidSBkMworCWV4dGggZDIKKwlleHRodSBkMQorCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0ZW5kLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0MDViNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0ZW5kLnMKQEAgLTAsMCArMSwxNSBAQAorCS50ZXh0CisJcHV0eCBkMQorCWdldHggZDIKKwltdWxxIGQxLGQyCisJbXVscSAxNixkMgorCW11bHEgMjU2LGQzCisJbXVscSAxMzEwNzEsZDMKKwltdWxxdSBkMSxkMgorCW11bHF1IDE2LGQyCisJbXVscXUgMjU2LGQzCisJbXVscXUgMTMxMDcxLGQzCisJc2F0MTYgZDIsZDMKKwlzYXQyNCBkMyxkMgorCWJzY2ggZDEsZDIKKwkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5NzZkYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zCkBAIC0wLDAgKzEsMTUgQEAKKwkudGV4dAorCWFuZCBkMSxkMgorCWFuZCAxMjcsZDIKKwlhbmQgMzI3NjcsZDMKKwlhbmQgMTMxMDcxLGQzCisJYW5kIDMyNzY3LHBzdworCW9yIGQxLGQyCisJb3IgMTI3LGQyCisJb3IgMzI3NjcsZDMKKwlvciAxMzEwNzEsZDMKKwlvciAzMjc2Nyxwc3cKKwl4b3IgZDEsZDIKKwl4b3IgMzI3NjcsZDMKKwl4b3IgMTMxMDcxLGQzCisJbm90IGQzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9vcC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTgyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucwpAQCAtMCwwICsxLDE1IEBACisJLnRleHQKK2ZvbzoKKwlsZXEKKwlsbmUKKwlsZ3QKKwlsZ2UKKwlsbGUKKwlsbHQKKwlsaGkKKwlsY2MKKwlsbHMJCisJbGNzCisJbHJhCisJc2V0bGIKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRjYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YxLnMKQEAgLTAsMCArMSwxNyBAQAorCS50ZXh0CisJbW92IGQxLGQyCisJbW92IGQxLGEyCisJbW92IGEyLGQxCisJbW92IGEyLGExCisJbW92IHNwLGEyCisJbW92IGExLHNwCisJbW92IGQyLHBzdworCW1vdiBtZHIsZDEKKwltb3YgZDIsbWRyCisJbW92IChhMiksZDEKKwltb3YgKDgsYTIpLGQxCisJbW92ICgyNTYsYTIpLGQxCisJbW92ICgxMzEwNzEsYTIpLGQxCisJbW92ICg4LHNwKSxkMQorCW1vdiAoMjU2LHNwKSxkMQorCW1vdiBwc3csZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkMWVkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjIucwpAQCAtMCwwICsxLDE2IEBACisJLnRleHQKKyAgICAgICAgbW92ICgxMzEwNzEsc3ApLGQxCisJbW92IChkMSxhMSksZDIKKwltb3YgKDMyNzY4KSxkMQorCW1vdiAoMTMxMDcxKSxkMQorCW1vdiAoYTIpLGExCisJbW92ICg4LGEyKSxhMQorCW1vdiAoMjU2LGEyKSxhMQorCW1vdiAoMTMxMDcxLGEyKSxhMQorCW1vdiAoOCxzcCksYTEKKwltb3YgKDI1NixzcCksYTEKKwltb3YgKDEzMTA3MSxzcCksYTEKKwltb3YgKGQxLGExKSxhMgorICAgICAgICBtb3YgKDMyNzY4KSxhMQorICAgICAgICBtb3YgKDEzMTA3MSksYTEKKyAgICAgICAgbW92ICgzMixhMSksc3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlYzBiOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCkBAIC0wLDAgKzEsMTYgQEAKKwkudGV4dAorICAgICAgICBtb3YgZDEsKGEyKQorICAgICAgICBtb3YgZDEsKDMyLGEyKQorCW1vdiBkMSwoMjU2LGEyKQorCW1vdiBkMSwoMTMxMDcxLGEyKQorCW1vdiBkMSwoMzIsc3ApCisJbW92IGQxLCgzMjc2OCxzcCkKKwltb3YgZDEsKDEzMTA3MSxzcCkKKwltb3YgZDEsKGQyLGEyKQorCW1vdiBkMSwoMTI4KQorCW1vdiBkMSwoMTMxMDcxKQorCW1vdiBhMSwoYTIpCisJbW92IGExLCgzMixhMikKKwltb3YgYTEsKDI1NixhMikKKwltb3YgYTEsKDEzMTA3MSxhMikKKwltb3YgYTEsKDMyLHNwKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3Y0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ2OWMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3Y0LnMKQEAgLTAsMCArMSwxMyBAQAorCS50ZXh0CisJbW92IGExLCgzMjc2OCxzcCkKKwltb3YgYTEsKDEzMTA3MSxzcCkKKwltb3YgYTEsKGQyLGEyKQorCW1vdiBhMSwoMTI4KQorCW1vdiBhMSwoMTMxMDcxKQorCW1vdiBzcCwoMzIsYTEpCisJbW92IDgsZDEKKwltb3YgMjU2LGQxCisJbW92IDEzMTA3MSxkMQorCW1vdiA4LGExCisJbW92IDI1NixhMQorCW1vdiAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRiN2JlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZidS5zCkBAIC0wLDAgKzEsMjEgQEAKKwkudGV4dAorCW1vdmJ1IChhMiksZDEKKwltb3ZidSAoOCxhMiksZDEKKwltb3ZidSAoMjU2LGEyKSxkMQorCW1vdmJ1ICgxMzEwNzEsYTIpLGQxCisJbW92YnUgKDgsc3ApLGQxCisJbW92YnUgKDI1NixzcCksZDEKKwltb3ZidSAoMTMxMDcxLHNwKSxkMQorCW1vdmJ1IChkMSxhMSksZDIKKwltb3ZidSAoMzI3NjgpLGQxCisJbW92YnUgKDEzMTA3MSksZDEKKwltb3ZidSBkMSwoYTIpCisJbW92YnUgZDEsKDMyLGEyKQorCW1vdmJ1IGQxLCgyNTYsYTIpCisJbW92YnUgZDEsKDEzMTA3MSxhMikKKwltb3ZidSBkMSwoMzIsc3ApCisJbW92YnUgZDEsKDMyNzY4LHNwKQorCW1vdmJ1IGQxLCgxMzEwNzEsc3ApCisJbW92YnUgZDEsKGQyLGEyKQorCW1vdmJ1IGQxLCgxMjgpCisJbW92YnUgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92aHUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92aHUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM3ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zCkBAIC0wLDAgKzEsMjEgQEAKKwkudGV4dAorCW1vdmh1IChhMiksZDEKKwltb3ZodSAoOCxhMiksZDEKKwltb3ZodSAoMjU2LGEyKSxkMQorCW1vdmh1ICgxMzEwNzEsYTIpLGQxCisJbW92aHUgKDgsc3ApLGQxCisJbW92aHUgKDI1NixzcCksZDEKKwltb3ZodSAoMTMxMDcxLHNwKSxkMQorCW1vdmh1IChkMSxhMSksZDIKKwltb3ZodSAoMzI3NjgpLGQxCisJbW92aHUgKDEzMTA3MSksZDEKKwltb3ZodSBkMSwoYTIpCisJbW92aHUgZDEsKDMyLGEyKQorCW1vdmh1IGQxLCgyNTYsYTIpCisJbW92aHUgZDEsKDEzMTA3MSxhMikKKwltb3ZodSBkMSwoMzIsc3ApCisJbW92aHUgZDEsKDMyNzY4LHNwKQorCW1vdmh1IGQxLCgxMzEwNzEsc3ApCisJbW92aHUgZDEsKGQyLGEyKQorCW1vdmh1IGQxLCgxMjgpCisJbW92aHUgZDEsKDEzMTA3MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92bS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmYzY4MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92bS5zCkBAIC0wLDAgKzEsNSBAQAorCS50ZXh0CisJbW92bSAoc3ApLFthMixhM10KKwltb3ZtIChzcCksW2QyLGQzLGEyLGEzLG90aGVyXQorCW1vdm0gW2EyLGEzXSwoc3ApCisJbW92bSBbZDIsZDMsYTIsYTMsb3RoZXJdLChzcCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTFlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCkBAIC0wLDAgKzEsNSBAQAorCS50ZXh0CisJbXVsIGQxLGQyCisJbXVsdSBkMixkMworCWRpdiBkMyxkMworCWRpdnUgZDMsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvb3RoZXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvb3RoZXIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWFmNzRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zCkBAIC0wLDAgKzEsMjAgQEAKKwkudGV4dAorCWNsciBkMgorCWluYyBkMQorCWluYyBhMgorCWluYzQgYTMKKwlqbXAgKGEyKQorCWptcCAyNTYKKwlqbXAgMTMxMDcxCisJY2FsbCAyNTYsW2EyLGEzXSw5CisJY2FsbCAxMzEwNzEsW2EyLGEzXSwzMgorCWNhbGxzIChhMikKKwljYWxscyAyNTYKKwljYWxscyAxMzEwNzEKKwlyZXQgW2EyLGEzXSw3CisJcmV0ZiBbYTIsYTNdLDUKKwlyZXRzCisJcnRpCisJdHJhcAorCW5vcAorCXJ0bQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGM5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMKQEAgLTAsMCArMSwxMCBAQAorCS50ZXh0CisJYXNyIGQxLGQyCisJYXNyIDQsZDIKKwlsc3IgZDIsZDMKKwlsc3IgNCxkMworCWFzbCBkMyxkMgorCWFzbCA0LGQyCisJYXNsMiBkMgorCXJvciBkMQorCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkYzY2MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKQEAgLTAsMCArMSw4IEBACisJLnRleHQKKwlzdWIgZDEsZDIKKwlzdWIgZDIsYTMKKwlzdWIgYTMsZDMKKwlzdWIgYTMsYTIKKwlzdWIgMTMxMDcxLGQyCisJc3ViIDEzMTA3MSxhMQorCXN1YmMgZDEsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvdWRmLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2JkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zCkBAIC0wLDAgKzEsMTI5IEBACisJLnRleHQKKwl1ZGYwMCBkMCxkMQorCXVkZjAxIGQwLGQxCisJdWRmMDIgZDAsZDEKKwl1ZGYwMyBkMCxkMQorCXVkZjA0IGQwLGQxCisJdWRmMDUgZDAsZDEKKwl1ZGYwNiBkMCxkMQorCXVkZjA3IGQwLGQxCisJdWRmMDggZDAsZDEKKwl1ZGYwOSBkMCxkMQorCXVkZjEwIGQwLGQxCisJdWRmMTEgZDAsZDEKKwl1ZGYxMiBkMCxkMQorCXVkZjEzIGQwLGQxCisJdWRmMTQgZDAsZDEKKwl1ZGYxNSBkMCxkMQorCXVkZjIwIGQwLGQxCisJdWRmMjEgZDAsZDEKKwl1ZGYyMiBkMCxkMQorCXVkZjIzIGQwLGQxCisJdWRmMjQgZDAsZDEKKwl1ZGYyNSBkMCxkMQorCXVkZjI2IGQwLGQxCisJdWRmMjcgZDAsZDEKKwl1ZGYyOCBkMCxkMQorCXVkZjI5IGQwLGQxCisJdWRmMzAgZDAsZDEKKwl1ZGYzMSBkMCxkMQorCXVkZjMyIGQwLGQxCisJdWRmMzMgZDAsZDEKKwl1ZGYzNCBkMCxkMQorCXVkZjM1IGQwLGQxCisJdWRmMDAgMTI3LGQxCisJdWRmMDEgMTI3LGQxCisJdWRmMDIgMTI3LGQxCisJdWRmMDMgMTI3LGQxCisJdWRmMDQgMTI3LGQxCisJdWRmMDUgMTI3LGQxCisJdWRmMDYgMTI3LGQxCisJdWRmMDcgMTI3LGQxCisJdWRmMDggMTI3LGQxCisJdWRmMDkgMTI3LGQxCisJdWRmMTAgMTI3LGQxCisJdWRmMTEgMTI3LGQxCisJdWRmMTIgMTI3LGQxCisJdWRmMTMgMTI3LGQxCisJdWRmMTQgMTI3LGQxCisJdWRmMTUgMTI3LGQxCisJdWRmMDAgMzI3NjcsZDEKKwl1ZGYwMSAzMjc2NyxkMQorCXVkZjAyIDMyNzY3LGQxCisJdWRmMDMgMzI3NjcsZDEKKwl1ZGYwNCAzMjc2NyxkMQorCXVkZjA1IDMyNzY3LGQxCisJdWRmMDYgMzI3NjcsZDEKKwl1ZGYwNyAzMjc2NyxkMQorCXVkZjA4IDMyNzY3LGQxCisJdWRmMDkgMzI3NjcsZDEKKwl1ZGYxMCAzMjc2NyxkMQorCXVkZjExIDMyNzY3LGQxCisJdWRmMTIgMzI3NjcsZDEKKwl1ZGYxMyAzMjc2NyxkMQorCXVkZjE0IDMyNzY3LGQxCisJdWRmMTUgMzI3NjcsZDEKKwl1ZGYwMCA2NTUzNSxkMQorCXVkZjAxIDY1NTM1LGQxCisJdWRmMDIgNjU1MzUsZDEKKwl1ZGYwMyA2NTUzNSxkMQorCXVkZjA0IDY1NTM1LGQxCisJdWRmMDUgNjU1MzUsZDEKKwl1ZGYwNiA2NTUzNSxkMQorCXVkZjA3IDY1NTM1LGQxCisJdWRmMDggNjU1MzUsZDEKKwl1ZGYwOSA2NTUzNSxkMQorCXVkZjEwIDY1NTM1LGQxCisJdWRmMTEgNjU1MzUsZDEKKwl1ZGYxMiA2NTUzNSxkMQorCXVkZjEzIDY1NTM1LGQxCisJdWRmMTQgNjU1MzUsZDEKKwl1ZGYxNSA2NTUzNSxkMQorCXVkZnUwMCAxMjgsZDEKKwl1ZGZ1MDEgMTI4LGQxCisJdWRmdTAyIDEyOCxkMQorCXVkZnUwMyAxMjgsZDEKKwl1ZGZ1MDQgMTI4LGQxCisJdWRmdTA1IDEyOCxkMQorCXVkZnUwNiAxMjgsZDEKKwl1ZGZ1MDcgMTI4LGQxCisJdWRmdTA4IDEyOCxkMQorCXVkZnUwOSAxMjgsZDEKKwl1ZGZ1MTAgMTI4LGQxCisJdWRmdTExIDEyOCxkMQorCXVkZnUxMiAxMjgsZDEKKwl1ZGZ1MTMgMTI4LGQxCisJdWRmdTE0IDEyOCxkMQorCXVkZnUxNSAxMjgsZDEKKwl1ZGZ1MDAgMzI3NjgsZDEKKwl1ZGZ1MDEgMzI3NjgsZDEKKwl1ZGZ1MDIgMzI3NjgsZDEKKwl1ZGZ1MDMgMzI3NjgsZDEKKwl1ZGZ1MDQgMzI3NjgsZDEKKwl1ZGZ1MDUgMzI3NjgsZDEKKwl1ZGZ1MDYgMzI3NjgsZDEKKwl1ZGZ1MDcgMzI3NjgsZDEKKwl1ZGZ1MDggMzI3NjgsZDEKKwl1ZGZ1MDkgMzI3NjgsZDEKKwl1ZGZ1MTAgMzI3NjgsZDEKKwl1ZGZ1MTEgMzI3NjgsZDEKKwl1ZGZ1MTIgMzI3NjgsZDEKKwl1ZGZ1MTMgMzI3NjgsZDEKKwl1ZGZ1MTQgMzI3NjgsZDEKKwl1ZGZ1MTUgMzI3NjgsZDEKKwl1ZGZ1MDAgNjU1MzYsZDEKKwl1ZGZ1MDEgNjU1MzYsZDEKKwl1ZGZ1MDIgNjU1MzYsZDEKKwl1ZGZ1MDMgNjU1MzYsZDEKKwl1ZGZ1MDQgNjU1MzYsZDEKKwl1ZGZ1MDUgNjU1MzYsZDEKKwl1ZGZ1MDYgNjU1MzYsZDEKKwl1ZGZ1MDcgNjU1MzYsZDEKKwl1ZGZ1MDggNjU1MzYsZDEKKwl1ZGZ1MDkgNjU1MzYsZDEKKwl1ZGZ1MTAgNjU1MzYsZDEKKwl1ZGZ1MTEgNjU1MzYsZDEKKwl1ZGZ1MTIgNjU1MzYsZDEKKwl1ZGZ1MTMgNjU1MzYsZDEKKwl1ZGZ1MTQgNjU1MzYsZDEKKwl1ZGZ1MTUgNjU1MzYsZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNWY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5kCkBAIC0wLDAgKzEsOSBAQAorI29iamNvcHk6IC1PIHNyZWMKKyNuYW1lOiBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cworI2FzOiAtTQorCisjIFRlc3QgTVJJIGNoYXJhY3RlciBjb25zdGFudHMKKworUzAuKgorUzExMy4uLi4oNjE2MTYyNjM2MTYyNjM2NDY1MDAwMDAwNjEyNzYyMDApfCg2MTYxNjI2MzY0NjM2MjYxMDAwMDAwNjUwMDYyMjc2MSkuKgorI3Bhc3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGE4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCkBAIC0wLDAgKzEsNiBAQAorOyBUZXN0IE1SSSBzdHlsZSBjaGFyYWN0ZXIgY29uc3RhbnRzLgorCisJZGMuYgknYScKKwlkYy5iCSdhYmMnCisJZGMubAknYWJjZGUnCisJZGMubAknYScnYicKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDM0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kCkBAIC0wLDAgKzEsOSBAQAorI25tOiAtLWV4dGVybi1vbmx5CisjbmFtZTogTVJJIGNvbW1lbnRzCisjYXM6IC1NCisKKyMgVGVzdCBNUkkgY29tbWVudHMKKworMCswMiBBIFJBTQorMCswMSBBIFJPTQorICogVSBsYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3MzE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tZW50LnMKQEAgLTAsMCArMSwxMyBAQAorCXhyZWYgbGFiZWwKKwl4ZGVmCVJPTSxSQU0KKwkqIHRoaXMgaXMgYSBjb21tZW50CisKKwlkYy5sCWxhYmVsCWxvb3AgaWYgd2UgaGF2ZW4ndCByZWFjaCBlbmQgeWV0CisJCitST00JCQkJRVFVCSQwMDAwMDAwMQkqIHdvcmQgd2lkZQorUkFNCQkJCUVRVQkkMDAwMDAwMDIJd29yZCB3aWRlCisJZGMubAlSQU0KKwlkYy5sCTAJLHJlYWxseSxhLGNvbW1lbnQKKzsgYSBjb21tZW50CisgOyBhbm90aGVyIGNvbW1lbnQKKyAgOyBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWMxNTMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5kCkBAIC0wLDAgKzEsOCBAQAorI25tOiAtLWV4dGVybi1vbmx5CisjbmFtZTogTVJJIGNvbW1vbiBzZWN0aW9ucworI2FzOiAtTQorCisjIFRlc3QgTVJJIGNvbW1vbiBzZWN0aW9ucworCiswKzA4IEMgMDBjb20yCiswKzA4IEMgY29tMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1vbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MzVjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMKQEAgLTAsMCArMSwxMSBAQAorOyBUZXN0IE1SSSBjb21tb24gc2VjdGlvbnMKKwljb21tb24JY29tMQorCWRzLmwJMQorY29tMgljb21tb24gMDAKKwlkcy5sCTEKK2luY29tCWRzLmwJMQorCWNvbW1vbgljb20xCisJZHMubAkxCisJZGF0YQorCWRjLmwJY29tMQorCWRjLmwJaW5jb20KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEwMDIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kCkBAIC0wLDAgKzEsMjAgQEAKKyNubTogLS1leHRlcm4tb25seQorI25hbWU6IE1SSSBjb25zdGFudHMKKyNhczogLU0KKworIyBUZXN0IE1SSSBzdHlsZSBjb25zdGFudHMKKworMCowIFQgZm9vCiswKmEgQSBzMDEKKzAqYSBBIHMwMgorMCphIEEgczAzCiswKmEgQSBzMDQKKzAqYSBBIHMwNQorMCphIEEgczA2CiswKmEgQSBzMDcKKzAqYSBBIHMwOAorMCphIEEgczA5CiswKjYxIEEgczEwCiswKjYxIEEgczExCiswKjYxNjI2MzY0IEEgczEyCiswKjYxMjc2MjAwIEEgczEzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNGU2NwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMucwpAQCAtMCwwICsxLDMxIEBACisJeGRlZglzMDEsczAyLHMwMyxzMDQsczA1LHMwNixzMDcsczA4LHMwOSxzMTAsczExLHMxMixzMTMKK3MwMQllcXUJJTEwMTAKK3MwMgllcXUJMTAxMGIKK3MwMwllcXUJQDEyCitzMDQJZXF1CTEybworczA1CWVxdQkxMnEKK3MwNgllcXUJMTAKK3MwNwllcXUJMTBkCitzMDgJZXF1CSRhCitzMDkJZXF1CTBhaAorczEwCWVxdQknYScKK3MxMQllcXUJQSdhJworczEyCWVxdQknYWJjZCcKK3MxMwllcXUJJ2EnJ2InCisKKwl4ZGVmCWZvbworZm9vCisJbW92ZXEubAkjJTEwMTAsZDAKKwltb3ZlcS5sCSMxMDEwYixkMAorCW1vdmVxLmwJI0AxMixkMAorCW1vdmVxLmwJIzEybyxkMAorCW1vdmVxLmwJIzEycSxkMAorCW1vdmVxLmwJIzEwLGQwCisJbW92ZXEubAkjMTBkLGQwCisJbW92ZXEubAkjJGEsZDAKKwltb3ZlcS5sCSMwYWgsZDAKKwltb3ZlcS5sCSMnYScsZDAKKwltb3ZlcS5sCSNBJ2EnLGQwCisJbm9wCisKKwllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VtcHR5LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjMmNkZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCkBAIC0wLDAgKzEsOSBAQAorU0JUCU1BQ1JPCQk7IGVtcHR5IG1hY3JvCisJRU5ETQorCisJU0JUCWFyZzEgCisgICAgICAgIFNCVCAgICAgYXJnMiAtIG9uZSB0d3cKKyAgICAgICAgU0JUICAgICBhcmczIC0gb25lIHR3byB0aHJlZQorICAgICAgICBTQlQgICAgIGFyZzQgLSBvbmUgdHdvIHRocmVlIGZvdXIKKyAgICAgICAgU0JUICAgICBhcmc1IC0gb25lIHR3byB0aHJlZSBmb3VyIGZpdmUKKyAgICAgICAgU0JUICAgICBhcmc2IC0gb25lIHR3byAodGhyZWUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmOWE4NgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZApAQCAtMCwwICsxLDcgQEAKKyNubTogLS1leHRlcm4tb25seQorI25hbWU6IE1SSSBFUVUKKyNhczogLU0KKworIyBUZXN0IHRoZSBNUkkgRVFVIGRpcmVjdGl2ZQorCiswKjQgQSBTWU1CT0wKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjUxMmExCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2VxdS5zCkBAIC0wLDAgKzEsMyBAQAorIyBUZXN0IHRoZSBNUkkgRVFVIGRpcmVjdGl2ZQorCVhERUYJU1lNQk9MCitTWU1CT0wJRVFVCTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGVlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kCkBAIC0wLDAgKzEsMTEgQEAKKyNubTogLS1leHRlcm4tb25seQorI25hbWU6IE1SSSBleHByZXNzaW9ucworI2FzOiAtTQorCisjIFRlc3QgZXhwcmVzc2lvbnMgaW4gTVJJIG1vZGUKKworMDAqIEEgczEKKzAwKjEyIEEgczIKKzAwKjYgQSBzMworKDAwMDAwMDAwKT9mZiogQSBzNAorMDAqIEEgczUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Njc3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5zCkBAIC0wLDAgKzEsNyBAQAorOyBUZXN0IGV4cHJlc3Npb25zIGluIE1SSSBtb2RlCisJeGRlZglzMSxzMixzMyxzNCxzNQorczEJZXF1CTE+MgorczIJZXF1CTM8PDEqMworczMJZXF1CTUhITMKK3M0CWVxdQkiMAorczUJZXF1CSgxPj0yKSEoMTw+MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNjI3YQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kCkBAIC0wLDAgKzEsMTAgQEAKKyNvYmpjb3B5OiAtTyBzcmVjCisjbmFtZTogTVJJIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cworI2FzOiAtTQorCisjIFRlc3QgTVJJIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cworCitTMC4qCitTMTE4Li4uLigxMjM0NTY3ODlBQkNERUYwM0Y4MDAwMDA0MTIwMDAwMDQxMjAwMDAwNDIpfChGMERFQkM5QTc4NTYzNDEyMDAwMDgwM0YwMDAwMjA0MTAwMDAyMDQxMDApLioKK1MxMC4uLi4uKEM4MDAwMCl8KDAwQzg0MikuKgorI3Bhc3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3ZjljNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zCkBAIC0wLDAgKzEsNyBAQAorOyBUZXN0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpbiBNUkkgbW9kZS4KKworCWRjLmQJOjEyMzRfNTY3OF85YWJjX2RlZjAKKwlkYy5zCTEuMAorCWRjLnMJMWUxCisJZGMucwkxX2VfMQorCWRjLnMJMUUyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ZmI5NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IuZApAQCAtMCwwICsxLDMwIEBACisjb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCisjbmFtZTogTVJJIHN0cnVjdHVyZWQgZm9yCisjYXM6IC1NCisKKyMgVGVzdCBNUkkgc3RydWN0dXJlZCBmb3IgcHNldWRvLW9wLgorCisuKjogICAgIGZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMCA8Zm9vPiBjbHJ3ICVkMQorMCswMDIgPGZvb1wrKDB4fCkyPiBtb3ZldyAjMSwlZDAKKzArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMAorMCswMGEgPGZvb1wrKDB4fClhPiBibHRzIDArMDE2IDxmb29cKygweHwpMTY+CiswKzAwYyA8Zm9vXCsoMHh8KWM+IGFkZHcgJWQwLCVkMQorMCswMGUgPGZvb1wrKDB4fCllPiBidmNzIDArMDEyIDxmb29cKygweHwpMTI+CiswKzAxMCA8Zm9vXCsoMHh8KTEwPiBicmFzIDArMDE2IDxmb29cKygweHwpMTY+CiswKzAxMiA8Zm9vXCsoMHh8KTEyPiBhZGRxdyAjMiwlZDAKKzArMDE0IDxmb29cKygweHwpMTQ+IGJyYXMgMCswMDYgPGZvb1wrKDB4fCk2PgorMCswMTYgPGZvb1wrKDB4fCkxNj4gY2xydyAlZDEKKzArMDE4IDxmb29cKygweHwpMTg+IG1vdmV3ICMxMCwlZDAKKzArMDFjIDxmb29cKygweHwpMWM+IGNtcGl3ICMxLCVkMAorMCswMjAgPGZvb1wrKDB4fCkyMD4gYmd0cyAwKzAzMCA8Zm9vXCsoMHh8KTMwPgorMCswMjIgPGZvb1wrKDB4fCkyMj4gY21waXcgIzEwMCwlZDEKKzArMDI2IDxmb29cKygweHwpMjY+IGJndHMgMCswMmEgPGZvb1wrKDB4fCkyYT4KKzArMDI4IDxmb29cKygweHwpMjg+IGJyYXMgMCswMmMgPGZvb1wrKDB4fCkyYz4KKzArMDJhIDxmb29cKygweHwpMmE+IGFkZHcgJWQwLCVkMQorMCswMmMgPGZvb1wrKDB4fCkyYz4gc3VicXcgIzEsJWQwCiswKzAyZSA8Zm9vXCsoMHh8KTJlPiBicmFzIDArMDFjIDxmb29cKygweHwpMWM+CiswKzAzMCA8Zm9vXCsoMHh8KTMwPiBub3AKKzArMDMyIDxmb29cKygweHwpMzI+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjQ3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLnMKQEAgLTAsMCArMSwyMiBAQAorOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGZvciBwc2V1ZG8tb3AuCisKKwl4ZGVmCWZvbworZm9vCisJY2xyIGQxCisJZm9yIGQwID0gIzEgdG8gIzEwIGJ5ICMyIGRvCisJICBhZGQgZDAsZDEgYXJiaXRyYXJ5IHRleHQgJ2luIGNvbW1lbnQgZmllbGQKKwkgIGlmIDx2cz4gdGhlbgorCSAgICBicmVhaworCSAgZW5kaQorCWVuZGYKKworCWNsciBkMQorCWZvciBkMCA9ICMxMCBkb3dudG8gIzEgZG8KKwkgIGlmIGQxIDxnZT4gIzEwMCB0aGVuCisJICAgIG5leHQKKwkgIGVuZGkKKwkgIGFkZCBkMCxkMQorCWVuZGYKKworCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI5NzJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQKQEAgLTAsMCArMSwyNSBAQAorI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcworI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIGlmCisjYXM6IC1NCisKKyMgVGVzdCBNUkkgc3RydWN0dXJlZCBpZiBwc2V1ZG8tb3AuCisKKy4qOiAgICAgZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwIDxmb28+IGNtcHcgJWQxLCVkMAorMCswMDIgPGZvb1wrKDB4fCkyPiBibGVzIDArMDE0IDxmb29cKygweHwpMTQ+CiswKzAwNCA8Zm9vXCsoMHh8KTQ+IGNtcHcgJWQyLCVkMAorMCswMDYgPGZvb1wrKDB4fCk2PiBibGVzIDArMDE0IDxmb29cKygweHwpMTQ+CiswKzAwOCA8Zm9vXCsoMHh8KTg+IGNtcHcgJWQxLCVkMgorMCswMGEgPGZvb1wrKDB4fClhPiBibGVzIDArMDEwIDxmb29cKygweHwpMTA+CiswKzAwYyA8Zm9vXCsoMHh8KWM+IG1vdmV3ICVkMSwlZDMKKzArMDBlIDxmb29cKygweHwpZT4gYnJhcyAwKzAxMiA8Zm9vXCsoMHh8KTEyPgorMCswMTAgPGZvb1wrKDB4fCkxMD4gbW92ZXcgJWQyLCVkMworMCswMTIgPGZvb1wrKDB4fCkxMj4gYnJhcyAwKzAxZSA8Zm9vXCsoMHh8KTFlPgorMCswMTQgPGZvb1wrKDB4fCkxND4gY21wdyAlZDAsJWQxCiswKzAxNiA8Zm9vXCsoMHh8KTE2PiBiZ3RzIDArMDFjIDxmb29cKygweHwpMWM+CiswKzAxOCA8Zm9vXCsoMHh8KTE4PiBjbXB3ICVkMCwlZDIKKzArMDFhIDxmb29cKygweHwpMWE+IGJsZXMgMCswMWUgPGZvb1wrKDB4fCkxZT4KKzArMDFjIDxmb29cKygweHwpMWM+IG1vdmV3ICVkMCwlZDMKKzArMDFlIDxmb29cKygweHwpMWU+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQ2YmU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLnMKQEAgLTAsMCArMSwxNyBAQAorOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGlmIHBzZXVkby1vcC4KKworCXhkZWYJZm9vCitmb28KKwlpZiBkMSA8Z3Q+IGQwIGFuZCBkMiA8Z3Q+IGQwIHRoZW4KKwkgIGlmIGQxIDxndD4gZDIgdGhlbgorCSAgICBtb3ZlIGQxLGQzCisJICBlbHNlCisJICAgIG1vdmUgZDIsZDMKKwkgIGVuZGkKKwllbHNlCisJICBpZiBkMCA8Z3Q+IGQxIG9yIGQwIDxndD4gZDIgdGhlbgorCSAgICBtb3ZlIGQwLGQzCisJICBlbmRpCisJZW5kaQorCisJbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pbW1jb25zdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmRhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZApAQCAtMCwwICsxLDIyIEBACisjb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCisjbmFtZTogTVJJIGltbWVkaWF0ZSBjb25zdGFudHMKKyNhczogLU0KKyNzb3VyY2U6IGNvbnN0YW50cy5zCisKKyMgVGVzdCBNUkkgaW1tZWRpYXRlIGNvbnN0YW50cworCisuKjogICAgIGZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMCA8Zm9vPiBtb3ZlcSAjMTAsJWQwCiswKzAwMiA8Zm9vXCsoMHh8KTI+IG1vdmVxICMxMCwlZDAKKzArMDA0IDxmb29cKygweHwpND4gbW92ZXEgIzEwLCVkMAorMCswMDYgPGZvb1wrKDB4fCk2PiBtb3ZlcSAjMTAsJWQwCiswKzAwOCA8Zm9vXCsoMHh8KTg+IG1vdmVxICMxMCwlZDAKKzArMDBhIDxmb29cKygweHwpYT4gbW92ZXEgIzEwLCVkMAorMCswMGMgPGZvb1wrKDB4fCljPiBtb3ZlcSAjMTAsJWQwCiswKzAwZSA8Zm9vXCsoMHh8KWU+IG1vdmVxICMxMCwlZDAKKzArMDEwIDxmb29cKygweHwpMTA+IG1vdmVxICMxMCwlZDAKKzArMDEyIDxmb29cKygweHwpMTI+IG1vdmVxICM5NywlZDAKKzArMDE0IDxmb29cKygweHwpMTQ+IG1vdmVxICM5NywlZDAKKzArMDE2IDxmb29cKygweHwpMTY+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U1ODU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQKQEAgLTAsMCArMSw4IEBACisjbm06IC0tZXh0ZXJuLW9ubHkKKyNuYW1lOiBNUkkgbGFiZWwKKyNhczogLU0KKworIyBUZXN0IHVzaW5nIGFuIE1SSSBzdHlsZSBsYWJlbAorCiswMDAwKiBUIExBQkVMCitbIAldKlUgU1lNQk9MCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWVjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbGFiZWwucwpAQCAtMCwwICsxLDUgQEAKKzsgVGVzdCB1c2luZyBhbiBNUkkgc3R5bGUgbGFiZWwKKyogQWxzbyB0ZXN0IE1SSSBzdHlsZSBjb21tZW50cworISBBbmQgYW5vdGhlciBjb21tZW50CisJWERFRglMQUJFTAorTEFCRUwJREMuTAlTWU1CT0wJCTsgQW5kIHlldCBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM2ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5kCkBAIC0wLDAgKzEsMjcgQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IE1SSSBtb3ZlbWwKKyNhczogLU0KKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswKzAwMCA8LnRleHQ+OgorICAgMDoJNGNkZiAwN2ZjICAgICAgCW1vdmVtbCAlc3BAXCssJWQyLSVhMgorICAgNDoJNGNkZiAwN2ZjICAgICAgCW1vdmVtbCAlc3BAXCssJWQyLSVhMgorICAgODoJNDhmOSAwN2ZjIDAwMDAgCW1vdmVtbCAlZDItJWEyLDAgPC50ZXh0PgorICAgZToJMDAwMCAKKyAgMTA6CTQ4ZjkgMDdmYyAwMDAwIAltb3ZlbWwgJWQyLSVhMiwwIDwudGV4dD4KKyAgMTY6CTAwMDAgCisgIDE4Ogk0Y2Y5IDA3ZmMgMDAwMCAJbW92ZW1sIDAgPC50ZXh0PiwlZDItJWEyCisgIDFlOgkwMDAwIAorICAyMDoJNGNmOSAwN2ZjIDAwMDAgCW1vdmVtbCAwIDwudGV4dD4sJWQyLSVhMgorICAyNjoJMDAwMCAKKyAgMjg6CTRjZjkgMDdmYyAwMDAxIAltb3ZlbWwgMTYwMDAgPGZkc2E+LCVkMi0lYTIKKyAgMmU6CTYwMDAgCisgIDMwOgk0Y2Y5IDA3ZmMgMDAwMSAJbW92ZW1sIDE2MDAwIDxmZHNhPiwlZDItJWEyCisgIDM2Ogk2MDAwIAorICAzODoJNDhmOSAwN2ZjIDAwMDEgCW1vdmVtbCAlZDItJWEyLDE2MDAwIDxmZHNhPgorICAzZToJNjAwMCAKKyAgNDA6CTQ4ZjkgMDdmYyAwMDAxIAltb3ZlbWwgJWQyLSVhMiwxNjAwMCA8ZmRzYT4KKyAgNDY6CTYwMDAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmYzcyOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucwpAQCAtMCwwICsxLDE3IEBACithc2RmCXJlZwlhMC1hMi9kMi1kNworZmRzYQllcXUJJDE2MDAwCisKKwltb3ZlbS5sCShzcCkrLGEwLWEyL2QyLWQ3CisJbW92ZW0ubAkoc3ApKyxhc2RmCisJCisJbW92ZW0ubCBhMC1hMi9kMi1kNyxzeW1ib2wKKwltb3ZlbS5sCWFzZGYsc3ltYm9sCisKKwltb3ZlbS5sIHN5bWJvbCxhMC1hMi9kMi1kNworCW1vdmVtLmwJc3ltYm9sLGFzZGYKKworCW1vdmVtLmwgZmRzYSxhMC1hMi9kMi1kNworCW1vdmVtLmwJZmRzYSxhc2RmCisKKwltb3ZlbS5sIGEwLWEyL2QyLWQ3LGZkc2EKKwltb3ZlbS5sCWFzZGYsZmRzYQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21yaS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZjZGVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21yaS5leHAKQEAgLTAsMCArMSwyOCBAQAorIworIyBUZXN0IHRoZSBtNjhrIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuCisjCisjIEkgb3JpZ2luYWxseSB0aG91Z2h0IHRoYXQgbW9zdCBvZiB0ZXN0cyBhcHBsaWVkIHRvIGFueSBNUkkKKyMgYXNzZW1ibGVyLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgZGlmZmVyZW50IE1SSSBhc3NlbWJsZXJzIHVzZQorIyBkaWZmZXJlbnQgc3ludGF4ZXMuCisjCisKK2lmICFbaXN0YXJnZXQgIm02OCotKi0qIl0geworICAgIHJldHVybgorfQorCitydW5fZHVtcF90ZXN0IGxhYmVsCitydW5fZHVtcF90ZXN0IGVxdQorcnVuX2R1bXBfdGVzdCBjb25zdGFudHMKK3J1bl9kdW1wX3Rlc3QgaW1tY29uc3QKK3J1bl9kdW1wX3Rlc3QgZmxvYXQKK3J1bl9kdW1wX3Rlc3QgY2hhcgorcnVuX2R1bXBfdGVzdCBleHByCitydW5fZHVtcF90ZXN0IGNvbW1vbgorcnVuX2R1bXBfdGVzdCBjb21tZW50CitnYXNfdGVzdCAiZW1wdHkucyIgIi1NIiAiIiAiTVJJIGVtcHR5IG1hY3JvIgorcnVuX2R1bXBfdGVzdCBmb3IKK3J1bl9kdW1wX3Rlc3QgaWYKK3J1bl9kdW1wX3Rlc3QgcmVwZWF0CitydW5fZHVtcF90ZXN0IHdoaWxlCitydW5fZHVtcF90ZXN0IHNlbWkKK3J1bl9kdW1wX3Rlc3QgbW92ZW1sCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNWY2MwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQuZApAQCAtMCwwICsxLDE2IEBACisjb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCisjbmFtZTogTVJJIHN0cnVjdHVyZWQgcmVwZWF0CisjYXM6IC1NCisKKyMgVGVzdCBNUkkgc3RydWN0dXJlZCByZXBlYXQgcHNldWRvLW9wLgorCisuKjogICAgIGZpbGUgZm9ybWF0IC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMCA8Zm9vPiBiY2NzIDArMDAwIDxmb28+CiswKzAwMiA8Zm9vXCsoMHh8KTI+IGNscncgJWQxCiswKzAwNCA8Zm9vXCsoMHh8KTQ+IGFkZHF3ICMxLCVkMQorMCswMDYgPGZvb1wrKDB4fCk2PiBjbXBpdyAjMTAsJWQxCiswKzAwYSA8Zm9vXCsoMHh8KWE+IGJndHMgMCswMDQgPGZvb1wrKDB4fCk0PgorMCswMGMgPGZvb1wrKDB4fCljPiBub3AKKzArMDBlIDxmb29cKygweHwpZT4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0ZWEyYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucwpAQCAtMCwwICsxLDE0IEBACis7IFRlc3QgTVJJIHN0cnVjdHVyZWQgcmVwZWF0IHBzZXVkby1vcC4KKworCXhkZWYJZm9vCitmb28KKwlyZXBlYXQKKwl1bnRpbAk8Y3M+CisKKwljbHIgZDEKKwlyZXBlYXQKKwkgIGFkZCAjMSxkMQorCXVudGlsIGQxIDxnZT4gIzEwCisKKwlub3AKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZWNjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5kCkBAIC0wLDAgKzEsOSBAQAorI29iamR1bXA6IC1zIC1qIC50ZXh0CisjbmFtZTogTVJJIHNlbWkKKyNhczogLU0KKworLio6IC4qCisKK0NvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6CisgMDAwMCAzYjIwM2IyMCAzYTIwM2EyMCAwMDAwMDAwMCAwMDAwMDAwMCAgOyA7IDogOiAuLi4uLi4uLgorIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzA2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zCkBAIC0wLDAgKzEsMTQgQEAKK3NlbWljb2xvbiAgbWFjcm8KKwlkYy5iICAgICc7ICcKKwllbmRtCisKK2NvbG9uCSAgICBtYWNybworCWRjLmIgICAgJzogJworCWVuZG0KKworCXNlbWljb2xvbgorCWRjLmIJJzsgJworCWNvbG9uCisJZGMuYgknOiAnCisKKwlwMmFsaWduCTUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkZDM3YQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kCkBAIC0wLDAgKzEsMTggQEAKKyNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKKyNuYW1lOiBNUkkgc3RydWN0dXJlZCB3aGlsZQorI2FzOiAtTQorCisjIFRlc3QgTVJJIHN0cnVjdHVyZSB3aGlsZSBwc2V1ZG8tb3AuCisKKy4qOiAgICAgZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwIDxmb28+IGJjY3MgMCswMDQgPGZvb1wrKDB4fCk0PgorMCswMDIgPGZvb1wrKDB4fCkyPiBicmFzIDArMDAwIDxmb28+CiswKzAwNCA8Zm9vXCsoMHh8KTQ+IGNscncgJWQxCiswKzAwNiA8Zm9vXCsoMHh8KTY+IGNtcGl3ICMxMCwlZDEKKzArMDBhIDxmb29cKygweHwpYT4gYmx0cyAwKzAxMCA8Zm9vXCsoMHh8KTEwPgorMCswMGMgPGZvb1wrKDB4fCljPiBhZGRxdyAjMSwlZDEKKzArMDBlIDxmb29cKygweHwpZT4gYnJhcyAwKzAwNiA8Zm9vXCsoMHh8KTY+CiswKzAxMCA8Zm9vXCsoMHh8KTEwPiBub3AKKzArMDEyIDxmb29cKygweHwpMTI+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNiZGJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3doaWxlLnMKQEAgLTAsMCArMSwxNCBAQAorOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIHdoaWxlIHBzZXVkby1vcC4KKworCXhkZWYJZm9vCitmb28KKwl3aGlsZSA8Y3M+IGRvCisJZW5kdworCisJY2xyIGQxCisJd2hpbGUgZDEgPGxlPiAjMTAgZG8KKwkgIGFkZCAjMSxkMQorCWVuZHcKKworCW5vcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YWFiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LmQKQEAgLTAsMCArMSw3NCBAQAorI29iamR1bXA6IC1EcgorI25hbWU6IFBvd2VyUEMgdGVzdCAxCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItcG93ZXJwYworCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKKworMCswMDAwMDAwIDxmb28+OgorICAgMDoJNjAgMDAgMDAgMDAgCW5vcAorICAgNDoJNjAgMDAgMDAgMDAgCW5vcAorICAgODoJNjAgMDAgMDAgMDAgCW5vcAorCiswKzAwMDAwMGMgPGE+OgorICAgYzoJNDggMDAgMDAgMDQgCWIJMTAgPGFwZm91cj4KKworMCswMDAwMDEwIDxhcGZvdXI+OgorICAxMDoJNDggMDAgMDAgMDggCWIJMTggPGFwZm91clwrMHg4PgorICAxNDoJNDggMDAgMDAgMDAgCWIJMTQgPGFwZm91clwrMHg0PgorCQkJMTQ6IFJfUFBDX1JFTDI0CXgKKyAgMTg6CTQ4IDAwIDAwIDA0IAliCTFjIDxhcGZvdXJcKzB4Yz4KKwkJCTE4OiBSX1BQQ19SRUwyNAlcLmRhdGFcKzB4NAorICAxYzoJNDggMDAgMDAgMDAgCWIJMWMgPGFwZm91clwrMHhjPgorCQkJMWM6IFJfUFBDX1JFTDI0CXoKKyAgMjA6CTQ4IDAwIDAwIDE0IAliCTM0IDxhcGZvdXJcKzB4MjQ+CisJCQkyMDogUl9QUENfUkVMMjQJelwrMHgxNAorICAyNDoJNDggMDAgMDAgMDQgCWIJMjggPGFwZm91clwrMHgxOD4KKyAgMjg6CTQ4IDAwIDAwIDAwIAliCTI4IDxhcGZvdXJcKzB4MTg+CisJCQkyODogUl9QUENfUkVMMjQJYQorICAyYzoJNGIgZmYgZmYgZTQgCWIJMTAgPGFwZm91cj4KKyAgMzA6CTQ4IDAwIDAwIDA0IAliCTM0IDxhcGZvdXJcKzB4MjQ+CisJCQkzMDogUl9QUENfUkVMMjQJYVwrMHg0CisgIDM0Ogk0YiBmZiBmZiBlMCAJYgkxNCA8YXBmb3VyXCsweDQ+CisgIDM4Ogk0OCAwMCAwMCAwMCAJYgkzOCA8YXBmb3VyXCsweDI4PgorCQkJMzg6IFJfUFBDX0xPQ0FMMjRQQwlhCisgIDNjOgk0YiBmZiBmZiBkNCAJYgkxMCA8YXBmb3VyPgorCisgIDQwOgkwMCAwMCAwMCA0MCAJXC5sb25nIDB4NDAKKwkJCTQwOiBSX1BQQ19BRERSMzIJXC50ZXh0XCsweDQwCisKKyAgNDQ6CTAwIDAwIDAwIDRjIAlcLmxvbmcgMHg0YworCQkJNDQ6IFJfUFBDX0FERFIzMglcLnRleHRcKzB4NGMKKyAgNDg6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCisJCQk0ODogUl9QUENfUkVMMzIJeAorICA0YzoJMDAgMDAgMDAgMDQgCVwubG9uZyAweDQKKwkJCTRjOiBSX1BQQ19SRUwzMgl4XCsweDQKKwlcLlwuXC4KKwkJCTUwOiBSX1BQQ19SRUwzMgl6CisJCQk1NDogUl9QUENfUkVMMzIJeQorCQkJNTg6IFJfUFBDX0FERFIzMgl4CisJCQk1YzogUl9QUENfQUREUjMyCXkKKwkJCTYwOiBSX1BQQ19BRERSMzIJegorICA2NDoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKKwkJCTY0OiBSX1BQQ19BRERSMzIJeFwrMHhmK2ZmZmZmZmMKKyAgNjg6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCisJCQk2ODogUl9QUENfQUREUjMyCXlcKzB4ZitmZmZmZmZjCisgIDZjOglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQorCQkJNmM6IFJfUFBDX0FERFIzMgl6XCsweGYrZmZmZmZmYworICA3MDoJZmYgZmYgZmYgOWMgCVwubG9uZyAweGZmZmZmZjljCisgIDc0OglmZiBmZiBmZiA5YyAJXC5sb25nIDB4ZmZmZmZmOWMKKwlcLlwuXC4KKwkJCTc4OiBSX1BQQ19BRERSMzIJYQorCQkJN2M6IFJfUFBDX0FERFIzMgliCisJCQk4MDogUl9QUENfQUREUjMyCWFwZm91cgorICA4NDoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKKyAgODg6CTAwIDAwIDAwIDAyIAlcLmxvbmcgMHgyCisJCQk4ODogUl9QUENfQUREUjMyCWFwZm91clwrMHgyCisgIDhjOgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MAorRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLmRhdGE6CisKKzArMDAwMDAwMCA8eD46CisgICAwOgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MAorCiswKzAwMDAwMDQgPHk+OgorICAgNDoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFmMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCkBAIC0wLDAgKzEsNTIgQEAKKwkuc2VjdGlvbiAiLmRhdGEiCisJLmdsb2JsIHgKKwkuZ2xvYmwgegoreDoJLmxvbmcgMAoregk9IC4gKyA0Citmb3VyCT0geiAtIHggLSA0Cit5OgkubG9uZyAwCisJCisJLnNlY3Rpb24gIi50ZXh0IgorZm9vOgkKKwlub3AgOyBub3AgOyBub3AKKwkuZ2xvYmwgYQorYToJYiAuKzQKK2I6CWIgLis4CisJYiB4CisJYiB5CisJYiB6CisJYiB6KzIwCisJYiAuK2ZvdXIKKwliIGEKKwliIGIKKwliIGErNAorCWIgYis0CisJYiBhQGxvY2FsCisJYiBiQGxvY2FsCisJLmxvbmcgLgorCS5sb25nIC4rOAorCS5sb25nIHgtLgorCS5sb25nIHgrNC0uCisJLmxvbmcgei0uCisJLmxvbmcgeS0uCisJLmxvbmcgeAorCS5sb25nIHkKKwkubG9uZyB6CisJLmxvbmcgeC1mb3VyCisJLmxvbmcgeS1mb3VyCisJLmxvbmcgei1mb3VyCisJLmxvbmcgYS0uCisJLmxvbmcgYi0uCisJLmxvbmcgYQorCS5sb25nIGIKKworYXBmb3VyCT0gYSArIGZvdXIKKwkubG9uZyBhcGZvdXIKKwkubG9uZyBhLWFwZm91cgorCS5sb25nIGFwZm91cisyCisJLmxvbmcgYXBmb3VyLWIKKworCS50eXBlCWZvbyxAZnVuY3Rpb24KKwkudHlwZQlhLEBmdW5jdGlvbgorCS50eXBlCWIsQGZ1bmN0aW9uCisJLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwZTNiZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLmQKQEAgLTAsMCArMSw3NSBAQAorI29iamR1bXA6IC1EcgorI25hbWU6IFBvd2VyUEMgdGVzdCAyCisKKy4qOiArZmlsZSBmb3JtYXQgZWxmMzItcG93ZXJwYworCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswKzAwMDAwMDAgPGZvbz46CisgICAwOgk2MCAwMCAwMCAwMCAJbm9wCisgICA0Ogk2MCAwMCAwMCAwMCAJbm9wCisgICA4Ogk2MCAwMCAwMCAwMCAJbm9wCisgICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8Zm9vXCsweDEwPgorICAxMDoJNDggMDAgMDAgMDggCWIJMTggPGZvb1wrMHgxOD4KKyAgMTQ6CTQ4IDAwIDAwIDAwIAliCTE0IDxmb29cKzB4MTQ+CisJCQkxNDogUl9QUENfUkVMMjQJeAorICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGZvb1wrMHgxYz4KKwkJCTE4OiBSX1BQQ19SRUwyNAkuZGF0YVwrMHg0CisgIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8Zm9vXCsweDFjPgorCQkJMWM6IFJfUFBDX1JFTDI0CXoKKyAgMjA6CTQ4IDAwIDAwIDE0IAliCTM0IDxmb29cKzB4MzQ+CisJCQkyMDogUl9QUENfUkVMMjQJelwrMHgxNAorICAyNDoJNDggMDAgMDAgMDQgCWIJMjggPGZvb1wrMHgyOD4KKyAgMjg6CTQ4IDAwIDAwIDAwIAliCTI4IDxmb29cKzB4Mjg+CisJCQkyODogUl9QUENfUkVMMjQJYQorICAyYzoJNDggMDAgMDAgNTAgCWIJN2MgPGFwZm91cj4KKyAgMzA6CTQ4IDAwIDAwIDA0IAliCTM0IDxmb29cKzB4MzQ+CisJCQkzMDogUl9QUENfUkVMMjQJYVwrMHg0CisgIDM0Ogk0OCAwMCAwMCA0YyAJYgk4MCA8YXBmb3VyXCsweDQ+CisgIDM4Ogk0OCAwMCAwMCAwMCAJYgkzOCA8Zm9vXCsweDM4PgorCQkJMzg6IFJfUFBDX0xPQ0FMMjRQQwlhCisgIDNjOgk0OCAwMCAwMCA0MCAJYgk3YyA8YXBmb3VyPgorCisgIDQwOgkwMCAwMCAwMCA0MCAJLmxvbmcgMHg0MAorCQkJNDA6IFJfUFBDX0FERFIzMgkudGV4dFwrMHg0MAorCisgIDQ0OgkwMCAwMCAwMCA0YyAJLmxvbmcgMHg0YworCQkJNDQ6IFJfUFBDX0FERFIzMgkudGV4dFwrMHg0YworICA0ODoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAorCQkJNDg6IFJfUFBDX1JFTDMyCXgKKyAgNGM6CTAwIDAwIDAwIDA0IAkubG9uZyAweDQKKwkJCTRjOiBSX1BQQ19SRUwzMgl4XCsweDQKKwkuLi4KKwkJCTUwOiBSX1BQQ19SRUwzMgl6CisJCQk1NDogUl9QUENfUkVMMzIJeQorCQkJNTg6IFJfUFBDX0FERFIzMgl4CisJCQk1YzogUl9QUENfQUREUjMyCXkKKwkJCTYwOiBSX1BQQ19BRERSMzIJegorICA2NDoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKKwkJCTY0OiBSX1BQQ19BRERSMzIJeFwrMHhmK2ZmZmZmZmMKKyAgNjg6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCisJCQk2ODogUl9QUENfQUREUjMyCXlcKzB4ZitmZmZmZmZjCisgIDZjOglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQorCQkJNmM6IFJfUFBDX0FERFIzMgl6XCsweGYrZmZmZmZmYworICA3MDoJMDAgMDAgMDAgMDggCS5sb25nIDB4OAorICA3NDoJMDAgMDAgMDAgMDggCS5sb25nIDB4OAorCiswKzAwMDAwNzggPGE+OgorICA3ODoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAorCQkJNzg6IFJfUFBDX0FERFIzMglhCisKKzArMDAwMDA3YyA8YXBmb3VyPjoKKwkuLi4KKwkJCTdjOiBSX1BQQ19BRERSMzIJYgorCQkJODA6IFJfUFBDX0FERFIzMglhcGZvdXIKKyAgODQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCisgIDg4OgkwMCAwMCAwMCAwMiAJLmxvbmcgMHgyCisJCQk4ODogUl9QUENfQUREUjMyCWFwZm91clwrMHgyCisgIDhjOgkwMCAwMCAwMCAwMCAJLmxvbmcgMHgwCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5kYXRhOgorCiswKzAwMDAwMDAgPHg+OgorICAgMDoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAorCiswKzAwMDAwMDQgPHk+OgorICAgNDoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmMjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKQEAgLTAsMCArMSw1MiBAQAorZm91cgk9IDQKKwkuc2VjdGlvbiAiLnRleHQiCitmb286CQorCW5vcCA7IG5vcCA7IG5vcAorCS5nbG9ibCBhCisJYiAuKzQKKwliIC4rOAorCWIgeAorCWIgeQorCWIgegorCWIgeisyMAorCWIgLitmb3VyCisJYiBhCisJYiBiCisJYiBhKzQKKwliIGIrNAorCWIgYUBsb2NhbAorCWIgYkBsb2NhbAorCS5sb25nIC4KKwkubG9uZyAuKzgKKwkubG9uZyB4LS4KKwkubG9uZyB4KzQtLgorCS5sb25nIHotLgorCS5sb25nIHktLgorCS5sb25nIHgKKwkubG9uZyB5CisJLmxvbmcgegorCS5sb25nIHgtZm91cgorCS5sb25nIHktZm91cgorCS5sb25nIHotZm91cgorCS5sb25nIGEtLgorCS5sb25nIGItLgorYToJLmxvbmcgYQorYjoJLmxvbmcgYgorCithcGZvdXIJPSBhICsgZm91cgorCS5sb25nIGFwZm91cgorCS5sb25nIGEtYXBmb3VyCisJLmxvbmcgYXBmb3VyKzIKKwkubG9uZyBhcGZvdXItYgorCisJLnNlY3Rpb24gIi5kYXRhIgorCS5nbG9ibCB4CisJLmdsb2JsIHoKK3g6CS5sb25nIDAKK3oJPSAuICsgNAoreToJLmxvbmcgMAorCisJLnR5cGUJZm9vLEBmdW5jdGlvbgorCS50eXBlCWEsQGZ1bmN0aW9uCisJLnR5cGUJYixAZnVuY3Rpb24KKwkudHlwZQlhcGZvdXIsQGZ1bmN0aW9uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvcHBjLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9wcGMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmZiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvcHBjLmV4cApAQCAtMCwwICsxLDIxIEBACisjCisjIFNvbWUgUG93ZXJQQyB0ZXN0cworIworCisjIFRoZXNlIHRlc3RzIGFyZSBjdXJyZW50bHkgRUxGIHNwZWNpZmljLCBvbmx5IGJlY2F1c2Ugbm9ib2R5IGhhcworIyBjb252ZXJ0ZWQgdGhlbSB0byBsb29rIGZvciBYQ09GRiByZWxvY2F0aW9ucy4KKworaWYgeyBbaXN0YXJnZXQgcG93ZXJwYyotKi0qYnNkKl0gXAorICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1lbGYqXSBcCisgICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSBcCisgICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLXN5c3Y0Kl0gXAorICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1saW51eCpdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc29sYXJpcypdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotcnRlbXMqXSB9IHRoZW4geworICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdCIKKyAgICBydW5fZHVtcF90ZXN0ICJhc3Rlc3QyIgorfQorCitpZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpdIH0gdGhlbiB7CisgICBydW5fZHVtcF90ZXN0ICJzaW1wc2hmdCIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4OTNkNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9zaW1wc2hmdC5kCkBAIC0wLDAgKzEsMjcgQEAKKyNvYmpkdW1wOiAtcyAtaiAudGV4dAorI2FzOiAtbXBwYzY0CisjbmFtZTogUG93ZXJQQyB0ZXN0IDMsIHNpbXBsaWZpZWQgc2hpZnRzCisKKy4qCisKK0NvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgorIDAwMDAgNzg2NDBmZTAgNzg4M2Y4MGUgNzhhNTQ1ZTQgNzg2NDAwMjAgIHhkLi54Li4ueC5FLnhkLiAKKyAwMDEwIDU0NjQwZmZlIDUwODNmODAwIDU0YTU0MDJlIDU0NjQwNDNlICBUZC4uUC4uLlQuQC5UZC4+CisgMDAyMCA3ODY0MDAwNCA3ODY0MDdlNCA3ODY0ZjgwNiA3ODY0ZmZlNiAgeGQuLnhkLi54ZC4ueGQuLgorIDAwMzAgNzg2NGY4NDIgNzg2NGZmZTIgNzg2NDAwMGMgNzg2NDA4MGMgIHhkLkJ4ZC4ueGQuLnhkLi4KKyAwMDQwIDc4NjQwZmFjIDc4NjQwN2VjIDc4NjQwMDAwIDc4NjQwODAwICB4ZC4ueGQuLnhkLi54ZC4uCisgMDA1MCA3ODY0ZjgwMiA3ODY0MDAwMCA3ODY0ZjgwMiA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgorIDAwNjAgNzg2NTIwMTAgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NDAwMDAgIHhlIC54ZC4ueGQuLnhkLi4KKyAwMDcwIDc4NjRmODQyIDc4NjQwZmUwIDc4NjQwMDAwIDc4NjQwMDQwICB4ZC5CeGQuLnhkLi54ZC5ACisgMDA4MCA3ODY0MDdlMCA3ODY0MDdlNCA3ODY0MDdhNCA3ODY0MDAwNCAgeGQuLnhkLi54ZC4ueGQuLgorIDAwOTAgNzg2NDAwMDggNzg2NDAwNDggNzg2NDA3ZTggNzg2NDBmYTggIHhkLi54ZC5IeGQuLnhkLi4KKyAwMGEwIDc4NjRmODBhIDU0NjQwMDAwIDU0NjQwMDNlIDU0NjRmODAwICB4ZC4uVGQuLlRkLj5UZC4uCisgMDBiMCA1NDY0ZjgzZSA1NDY0Zjg3ZSA1NDY0ZmZmZSA1MDY0MDAwMCAgVGQuPlRkLn5UZC4uUGQuLgorIDAwYzAgNTA2NDAwM2UgNTA2NDBmZmUgNTA2NGY4MDAgNTA2NDAwM2UgIFBkLj5QZC4uUGQuLlBkLj4KKyAwMGQwIDUwNjQwN2ZlIDU0NjQwMDNlIDU0NjQwODNlIDU0NjRmODNlICBQZC4uVGQuPlRkLj5UZC4+CisgMDBlMCA1NDY0MDAzZSA1NDY0ZjgzZSA1NDY0MDgzZSA1YzY1MjAzZSAgVGQuPlRkLj5UZC4+XFxlID4KKyAwMGYwIDU0NjQwMDNlIDU0NjQwODNjIDU0NjRmODAwIDU0NjQwMDNlICBUZC4+VGQuPFRkLi5UZC4+CisgMDEwMCA1NDY0Zjg3ZSA1NDY0MGZmZSA1NDY0MDAzZSA1NDY0MDA3ZSAgVGQuflRkLi5UZC4+VGQufgorIDAxMTAgNTQ2NDA3ZmUgNTQ2NDAwM2UgNTQ2NDAwM2MgNTQ2NDAwMDAgIFRkLi5UZC4+VGQuPFRkLi4KKyAwMTIwIDU0NjQwMDNlIDU0NjQwMDdlIDU0NjQwN2ZlIDU0NjQwZmJjICBUZC4+VGQuflRkLi5UZC4uCisgMDEzMCA1NDY0ZjgwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgVGQuLi4uLi4gICAgICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZmOThkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMKQEAgLTAsMCArMSwxMTAgQEAKKyMgVGhlc2UgYXJlIGFsbCB0aGUgZXhhbXBsZXMgZnJvbSBzZWN0aW9uIEYuNCBvZgorIyAiUG93ZXJQQyBNaWNyb3Byb2Nlc3NvciBGYW1pbHk6IFRoZSBQcm9ncmFtbWluZyBFbnZpcm9ubWVudHMiLgorIyA2NC1iaXQgZXhhbXBsZXMKKwlleHRyZGkJJXI0LCVyMywxLDAKKwlpbnNyZGkJJXIzLCVyNCwxLDAKKwlzbGRpCSVyNSwlcjUsOAorCWNscmxkaQklcjQsJXIzLDMyCisjIDMyLWJpdCBleGFtcGxlcworCWV4dHJ3aQklcjQsJXIzLDEsMAorCWluc3J3aQklcjMsJXI0LDEsMAorCXNsd2kJJXI1LCVyNSw4CisJY2xybHdpCSVyNCwlcjMsMTYKKworCisjIFRoZXNlIHRlc3QgdGhlIHJlbWFpbmluZyBjb3JuZXIgY2FzZXMgZm9yIDY0LWJpdCBvcGVyYXRpb25zLgorCWV4dGxkaQklcjQsJXIzLDEsMAorCWV4dGxkaQklcjQsJXIzLDY0LDAKKwlleHRsZGkJJXI0LCVyMywxLDYzCisJZXh0bGRpCSVyNCwlcjMsNjQsNjMgICAgIyBiaXQgd2VpcmQsIHRoYXQgb25lLgorCQorCWV4dHJkaQklcjQsJXIzLDYzLDAKKwlleHRyZGkJJXI0LCVyMywxLDYyCisKKwlpbnNyZGkJJXI0LCVyMyw2NCwwCisJaW5zcmRpCSVyNCwlcjMsNjMsMAorCWluc3JkaQklcjQsJXIzLDEsNjIKKwlpbnNyZGkJJXI0LCVyMywxLDYzCisKKwlyb3RsZGkJJXI0LCVyMywwCisJcm90bGRpCSVyNCwlcjMsMQorCXJvdGxkaQklcjQsJXIzLDYzCisKKwlyb3RyZGkJJXI0LCVyMywwCisJcm90cmRpCSVyNCwlcjMsMQorCXJvdHJkaQklcjQsJXIzLDYzCisKKwlyb3RsZAklcjUsJXIzLCVyNAorCisJc2xkaQklcjQsJXIzLDAKKwlzbGRpCSVyNCwlcjMsNjMKKworCXNyZGkJJXI0LCVyMywwCisJc3JkaQklcjQsJXIzLDEKKwlzcmRpCSVyNCwlcjMsNjMKKworCWNscmxkaQklcjQsJXIzLDAKKwljbHJsZGkJJXI0LCVyMywxCisJY2xybGRpCSVyNCwlcjMsNjMKKworCWNscnJkaQklcjQsJXIzLDAKKwljbHJyZGkJJXI0LCVyMywxCisJY2xycmRpCSVyNCwlcjMsNjMKKwkKKwljbHJsc2xkaQklcjQsJXIzLDAsMAorCWNscmxzbGRpCSVyNCwlcjMsMSwwCisJY2xybHNsZGkJJXI0LCVyMyw2MywwCisJY2xybHNsZGkJJXI0LCVyMyw2MywxCisJY2xybHNsZGkJJXI0LCVyMyw2Myw2MworCQorIyBUaGVzZSB0ZXN0IHRoZSByZW1haW5pbmcgY29ybmVyIGNhc2VzIGZvciAzMi1iaXQgb3BlcmF0aW9ucy4KKwlleHRsd2kJJXI0LCVyMywxLDAKKwlleHRsd2kJJXI0LCVyMywzMiwwCisJZXh0bHdpCSVyNCwlcjMsMSwzMQorCWV4dGx3aQklcjQsJXIzLDMyLDMxICAgICMgYml0IHdlaXJkLCB0aGF0IG9uZS4KKwkKKwlleHRyd2kJJXI0LCVyMywzMSwwCisJZXh0cndpCSVyNCwlcjMsMSwzMAorCQorCWluc2x3aQklcjQsJXIzLDEsMAorCWluc2x3aQklcjQsJXIzLDMyLDAKKwlpbnNsd2kJJXI0LCVyMywxLDMxCisJCisJaW5zcndpCSVyNCwlcjMsMSwwCisJaW5zcndpCSVyNCwlcjMsMzIsMAorCWluc3J3aQklcjQsJXIzLDEsMzEKKwkKKwlyb3Rsd2kJJXI0LCVyMywwCisJcm90bHdpCSVyNCwlcjMsMQorCXJvdGx3aQklcjQsJXIzLDMxCisKKwlyb3Ryd2kJJXI0LCVyMywwCisJcm90cndpCSVyNCwlcjMsMQorCXJvdHJ3aQklcjQsJXIzLDMxCisKKwlyb3RsdwklcjUsJXIzLCVyNAorCisJc2x3aQklcjQsJXIzLDAKKwlzbHdpCSVyNCwlcjMsMQorCXNsd2kJJXI0LCVyMywzMQorCisJc3J3aQklcjQsJXIzLDAKKwlzcndpCSVyNCwlcjMsMQorCXNyd2kJJXI0LCVyMywzMQorCisJY2xybHdpCSVyNCwlcjMsMAorCWNscmx3aQklcjQsJXIzLDEKKwljbHJsd2kJJXI0LCVyMywzMQorCisJY2xycndpCSVyNCwlcjMsMAorCWNscnJ3aQklcjQsJXIzLDEKKwljbHJyd2kJJXI0LCVyMywzMQorCQorCWNscmxzbHdpCSVyNCwlcjMsMCwwCisJY2xybHNsd2kJJXI0LCVyMywxLDAKKwljbHJsc2x3aQklcjQsJXIzLDMxLDAKKwljbHJsc2x3aQklcjQsJXIzLDMxLDEKKwljbHJsc2x3aQklcjQsJXIzLDMxLDMxCisKKyMgRm9yY2UgYWxpZ25tZW50IHNvIHRoYXQgd2UgcGFzcyB0aGUgdGVzdCBvbiBBSVgKKwkucDJhbGlnbgkzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zaC9iYXNpYy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cApAQCAtMCwwICsxLDg2IEBACisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKKyMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKworcHJvYyBkb19mcCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJmcC5zOiBmbG9hdGluZyBwb2ludCB0ZXN0cyAoc2gzZSkiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJmcC5zIiAiLWFsIgorCisgICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCisgICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKKyAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KKyAgICAjCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYwMDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYwMEJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEYwMDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEYxMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEYwOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEYwOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEYxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEYxMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYxMDNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYxMEVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEYxMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEYxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEYwNERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEYwNURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEYwNkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYwMkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEYwM0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEYwMERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwMURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDQzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDQzNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDQzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQzNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM2IDAzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDQzNTJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNhIDAzNkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDQzNjJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTMxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCisKK2lmIFtpc3RhcmdldCBzaCotKi0qXSB0aGVuIHsKKyAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KKyAgICBkb19mcAorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2ZwLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZDg2NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2ZwLnMKQEAgLTAsMCArMSw0NCBAQAorCS5maWxlCSJ0ZXN0LmMiCisJLmRhdGEKKworISBIaXRhY2hpIFNIIGNjMSAoY3lnbnVzLTIuNy4xLTk1MDcyOCkgYXJndW1lbnRzOiAtTyAtZnBlZXBob2xlCishIC1mZnVuY3Rpb24tY3NlIC1mcmVnLXN0cnVjdC1yZXR1cm4gLWZkZWxheWVkLWJyYW5jaCAtZmNvbW1vbiAtZmdudS1saW5rZXIKKworZ2NjMl9jb21waWxlZC46CitfX19nbnVfY29tcGlsZWRfYzoKKwkudGV4dAorCS5hbGlnbiAyCisJLmdsb2JhbAlfZm9vCitfZm9vOgorCWZtb3YucwlAcjAsZnIwCisJZm1vdi5zCWZyMCxAcjAKKwlmbW92LnMJQHIwKyxmcjAKKwlmbW92LnMJZnIwLEAtcjAKKwlmbW92LnMJQChyMCxyMCksZnIwCisJZm1vdi5zCWZyMCxAKHIwLHIwKQorCWZtb3YJZnIwLGZyMQorCWZsZGkwCWZyMAorCWZsZGkxCWZyMAorCWZhZGQJZnIwLGZyMQorCWZzdWIJZnIwLGZyMQorCWZtdWwJZnIwLGZyMQorCWZkaXYJZnIwLGZyMQorCWZtYWMJZnIwLGZyMCxmcjEKKwlmY21wL2VxCWZyMCxmcjEKKwlmY21wL2d0CWZyMCxmcjEKKwlmbmVnCWZyMAorCWZhYnMJZnIwCisJZnNxcnQJZnIwCisJZmxvYXQJZnB1bCxmcjAKKwlmdHJjCWZyMCxmcHVsCisJZnN0cwlmcHVsLGZyMAorCWZsZHMJZnIwLGZwdWwKKwlsZHMJcjMsZnB1bAorCWxkcy5sCUByMyssZnB1bAorCWxkcwlyMyxmcHNjcgorCWxkcy5sCUByMyssZnBzY3IKKwlzdHMJZnB1bCxyMworCXN0cy5sCWZwdWwsQC1yMworCXN0cwlmcHNjcixyMworCXN0cy5sCWZwc2NyLEAtcjMKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODM4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5leHAKQEAgLTAsMCArMSwzNiBAQAorIworIyBTb2xhcmlzIG9uIFNQQVJDIHRlc3RzCisjCisKK2lmIFtpc3RhcmdldCBzcGFyYyotKi1zb2xhcmlzMipdIHRoZW4geworICAgIHNldCB4MSAwCisgICAgc2V0IHgyIDAKKyAgICBzZXQgeDMgMAorICAgIHNldCB4NCAwCisgICAgc2V0IHg1IDAKKyAgICBzZXQgeDYgMAorICAgIHNldCB0ZXN0bmFtZSAiYWRkZW5kcyAocGFydCAyKSIKKyAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJhZGRlbmQucyIgIiIgImFkZGVuZHMgKHBhcnQgMSkiXSB0aGVuIHsKKwlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKKwl3aGlsZSAxIHsKKwkgICAgIyBUaGVzZSBhcmUgd2hhdCB3ZSBnZXQgdXNpbmcgdGhlIFNvbGFyaXMgYXNzZW1ibGVyLgorCSAgICBleHBlY3QgeworCQktcmUgIjA4IFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCXsgaW5jciB4MSB9CisJCS1yZSAiMGMgUl9TUEFSQ19XRElTUDIyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJeyBpbmNyIHgyIH0KKwkJLXJlICIxMCBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcW15cblxdKlxuIgkJeyBpbmNyIHgzIH0KKwkJLXJlICIxNCBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcW15cblxdKlxuIgkJeyBpbmNyIHg0IH0KKwkJLXJlICIxYyBSX1NQQVJDXzMyICtmb28xXFteXG5cXSpcbiIJCQl7IGluY3IgeDUgfQorCQktcmUgIjIwIFJfU1BBUkNfMzIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgkJeyBpbmNyIHg2IH0KKwkJLXJlICJcW15cblxdKlxuIgkJCQkJeyB9CisJCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkJZW9mCQkJCXsgYnJlYWsgfQorCSAgICB9CisJfQorCW9iamR1bXBfZmluaXNoCisJaWYgW2FsbF9vbmVzICR4MSAkeDIgJHgzICR4NCAkeDUgJHg2XSB0aGVuIHsKKwkgICAgcGFzcyAkdGVzdG5hbWUKKwl9IGVsc2UgeworCSAgICBmYWlsICR0ZXN0bmFtZQorCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGViMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucwpAQCAtMCwwICsxLDExIEBACisJLmdsb2JhbCBmb28KK2ZvbzoKKwlub3AKKwlub3AKKwliYSBmb28xKzB4NAorCWJhIGZvbzErMHg0CisJYmEgZm9vMQorCWJhIGZvbzEKKwlub3AKKwkud29yZCBmb28xCisJLndvcmQgZm9vMSs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhZjY5MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvZ2FzLmV4cApAQCAtMCwwICsxLDEwIEBACisjCisjIFNvbGFyaXMtMiBvbiBTUEFSQyB0ZXN0cworIworIyBUaGUgdHdvIGNvbXBpbGVycywgY2MgYW5kIGdjYywgZ2VuZXJhdGUgcXVpdGUgZGlmZmVyZW50IGRlYnVnZ2luZworIyByZWNvcmRzLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGFjY2VwdCBib3RoLgorIworaWYgW2lzdGFyZ2V0IHNwYXJjLSotc29sYXJpczIqXSB0aGVuIHsKKyAgICBnYXNfdGVzdCAic29sLWNjLnMiICAiIiAkc3Rkb3B0bGlzdCAiU1BBUkMgU29sYXJpcyBjYyAtZyIKKyAgICBnYXNfdGVzdCAic29sLWdjYy5zIiAiIiAkc3Rkb3B0bGlzdCAiU1BBUkMgU29sYXJpcyBnY2MgLWciCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1jYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTI1MGRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucwpAQCAtMCwwICsxLDgxIEBACisJLnNlY3Rpb24gIi50ZXh0IgkJCSEgW2ludGVybmFsXQorCS5wcm9jCTQKKwkuZ2xvYmFsCW1haW4KKwkuYWxpZ24JNAorCS5nbG9iYWwJbWFpbgorbWFpbjoKKyEjUFJPTE9HVUUjIDAKKyEjUFJPTE9HVUUjIDEKKwlzYXZlCSVzcCwtOTYsJXNwCisJc2V0aGkJJWhpKC5MMTgpLCVvMAorCXNldGhpCSVoaShtc2cpLCVvMQorCW9yCSVvMSwlbG8obXNnKSwlbzEJISBbaW50ZXJuYWxdCisJY2FsbAlwcmludGYsMgorCW9yCSVvMCwlbG8oLkwxOCksJW8wCSEgW2ludGVybmFsXQorCXJldAorCXJlc3RvcmUJJWcwLDAsJW8wCisJLnR5cGUJbWFpbiwjZnVuY3Rpb24KKwkuc2l6ZQltYWluLCguLW1haW4pCisJLnNlY3Rpb24gIi5kYXRhIgkJCSEgW2ludGVybmFsXQorCS5hbGlnbgk0CitEZGF0YS5kYXRhOgorCS5zZWN0aW9uICIuYnNzIgkJCSEgW2ludGVybmFsXQorQmJzcy5ic3M6CisJLnNlY3Rpb24gIi5yb2RhdGEiCQkhIFtpbnRlcm5hbF0KK0Ryb2RhdGEucm9kYXRhOgorCS5maWxlCSJoaS1zb2wuYyIKKwkuZ2xvYmFsCW1zZworCS5nbG9iYWwJbXNnCittc2c6CisJLmFzY2lpCSJoZWxsbywgd29ybGQhXDAiCisJLnR5cGUJbXNnLCNvYmplY3QKKwkuc2l6ZQltc2csMTQKKwkuc2VjdGlvbiAiLmRhdGExIiwgI3dyaXRlLCAjYWxsb2MgISBbaW50ZXJuYWxdCisJLmFsaWduCTQKKy5MMTg6CisJLmFzY2lpCSIlc1xuXDAiCisJLmlkZW50CSJhY29tcDogKENEUykgU1BBUkNvbXBpbGVycyAyLjAuMSAwMyBTZXAgMTk5MiIKKwkuc2VjdGlvbiAidGV4dCIJCQkhIFtpbnRlcm5hbF0KKwkuc3RhYnMJIi9jeWdpbnQvczEvdXNlcnMvcmFlYnVybi8iLDEwMCwwLDAsMAorCS5zdGFicwkiaGktc29sLmMiLDEwMCwwLDMsMAorCS5zdGFicwkiIiw1NiwwLDAsMAorCS5zdGFicwkiIiw1NiwwLDAsMAorCS5zdGFicwkiWHQgOyBnIDsgTyA7IFY9Mi4wIiw2MCwwLDAsMHgyYmI3NzNiYQorCS5zdGFicwkiY2hhcjp0KDAsMSk9YnNjMTswOzg7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInNob3J0OnQoMCwyKT1iczI7MDsxNjsiLDEyOCwwLDAsMAorCS5zdGFicwkiaW50OnQoMCwzKT1iczQ7MDszMjsiLDEyOCwwLDAsMAorCS5zdGFicwkibG9uZzp0KDAsNCk9YnM0OzA7MzI7IiwxMjgsMCwwLDAKKwkuc3RhYnMJImxvbmcgbG9uZzp0KDAsNSk9YnM4OzA7NjQ7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInNpZ25lZCBjaGFyOnQoMCw2KT1ic2MxOzA7ODsiLDEyOCwwLDAsMAorCS5zdGFicwkic2lnbmVkIHNob3J0OnQoMCw3KT1iczI7MDsxNjsiLDEyOCwwLDAsMAorCS5zdGFicwkic2lnbmVkIGludDp0KDAsOCk9YnM0OzA7MzI7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInNpZ25lZCBsb25nOnQoMCw5KT1iczQ7MDszMjsiLDEyOCwwLDAsMAorCS5zdGFicwkic2lnbmVkIGxvbmcgbG9uZzp0KDAsMTApPWJzODswOzY0OyIsMTI4LDAsMCwwCisJLnN0YWJzCSJ1bnNpZ25lZCBjaGFyOnQoMCwxMSk9YnVjMTswOzg7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInVuc2lnbmVkIHNob3J0OnQoMCwxMik9YnUyOzA7MTY7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInVuc2lnbmVkIGludDp0KDAsMTMpPWJ1NDswOzMyOyIsMTI4LDAsMCwwCisJLnN0YWJzCSJ1bnNpZ25lZCBsb25nOnQoMCwxNCk9YnU0OzA7MzI7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInVuc2lnbmVkIGxvbmcgbG9uZzp0KDAsMTUpPWJ1ODswOzY0OyIsMTI4LDAsMCwwCisJLnN0YWJzCSJmbG9hdDp0KDAsMTYpPVIxOzQ7IiwxMjgsMCwwLDAKKwkuc3RhYnMJImRvdWJsZTp0KDAsMTcpPVIyOzg7IiwxMjgsMCwwLDAKKwkuc3RhYnMJImxvbmcgZG91YmxlOnQoMCwxOCk9UjY7MTY7IiwxMjgsMCwwLDAKKwkuc3RhYnMJInZvaWQ6dCgwLDE5KT1iczA7MDswIiwxMjgsMCwwLDAKKwkuc3RhYnMJIm1zZzpHKDAsMjApPWFyKDAsMyk7MDsxMzsoMCwxKSIsMzIsMCwxNCwwCisJLnN0YWJzCSJtYWluOkYoMCwzKTsoMCwzKTsoMCwyMSk9KigwLDIyKT0qKDAsMSkiLDM2LDAsMCxtYWluCisJLnN0YWJzCSJtYWluIiw0MiwwLDAsMAorCS5zdGFibgkxOTIsMCwxLDAKKwkuc3RhYm4JNjgsMCw0LDAKKwkuc3RhYnMJImFyZ2M6cCgwLDMpIiwxNjAsMCw0LDY4CisJLnN0YWJzCSJhcmd2OnAoMCwyMSkiLDE2MCwwLDQsNzIKKwkuc3RhYnMJInByaW50ZjpQKDAsMykiLDM2LDAsMCwwCisJLnN0YWJuCTIyNCwwLDEsMAorCS5zdGFicwkiIiw5OCwwLDAsMAorCS5zZWN0aW9uICJ0ZXh0IgkJCSEgW2ludGVybmFsXQorCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiL2N5Z2ludC9zMS91c2Vycy9yYWVidXJuLyIsMTAwLDAsMCwwCisJLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJoaS1zb2wuYyIsMTAwLDAsMywwCisJLnhzdGFicwkiLnN0YWIuaW5kZXgiLCIiLDU2LDAsMCwwCisJLnhzdGFicwkiLnN0YWIuaW5kZXgiLCIiLDU2LDAsMCwwCisJLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJYdCA7IGcgOyBPIDsgVj0yLjAiLDYwLDAsMCwweDJiYjc3M2JhCisJLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJtc2ciLDMyLDAsMCwwCisJLnhzdGFicwkiLnN0YWIuaW5kZXgiLCJtYWluIiw0MiwwLDAsMAorCS54c3RhYnMJIi5zdGFiLmluZGV4IiwibWFpbiIsMzYsMCwwLDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWdjYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtZ2NjLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1ZmRjZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWdjYy5zCkBAIC0wLDAgKzEsNjYgQEAKKwkuZmlsZQkiaGktc29sLmMiCisuc3RhYnMgIi8xaC9kZXZvL3NyYy9nYXMvdGVzdHN1aXRlL2dhcy8iLDEwMCwwLDAsLkxMdGV4dDAKKy5zdGFicyAiaGktc29sLmMiLDEwMCwwLDAsLkxMdGV4dDAKKy5zZWN0aW9uCSIudGV4dCIKKy5MTHRleHQwOgorCS5zdGFicwkiZ2NjMl9jb21waWxlZC4iLCAweDNjLCAwLCAwLCAwCisuc3RhYnMgImludDp0MT1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCisuc3RhYnMgImNoYXI6dDI9cjI7MDsxMjc7IiwxMjgsMCwwLDAKKy5zdGFicyAibG9uZyBpbnQ6dDM9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiLDEyOCwwLDAsMAorLnN0YWJzICJ1bnNpZ25lZCBpbnQ6dDQ9cjE7MDstMTsiLDEyOCwwLDAsMAorLnN0YWJzICJsb25nIHVuc2lnbmVkIGludDp0NT1yMTswOy0xOyIsMTI4LDAsMCwwCisuc3RhYnMgInNob3J0IGludDp0Nj1yMTstMzI3Njg7MzI3Njc7IiwxMjgsMCwwLDAKKy5zdGFicyAibG9uZyBsb25nIGludDp0Nz1yMTswOy0xOyIsMTI4LDAsMCwwCisuc3RhYnMgInNob3J0IHVuc2lnbmVkIGludDp0OD1yMTswOzY1NTM1OyIsMTI4LDAsMCwwCisuc3RhYnMgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDk9cjE7MDstMTsiLDEyOCwwLDAsMAorLnN0YWJzICJzaWduZWQgY2hhcjp0MTA9cjE7LTEyODsxMjc7IiwxMjgsMCwwLDAKKy5zdGFicyAidW5zaWduZWQgY2hhcjp0MTE9cjE7MDsyNTU7IiwxMjgsMCwwLDAKKy5zdGFicyAiZmxvYXQ6dDEyPXIxOzQ7MDsiLDEyOCwwLDAsMAorLnN0YWJzICJkb3VibGU6dDEzPXIxOzg7MDsiLDEyOCwwLDAsMAorLnN0YWJzICJsb25nIGRvdWJsZTp0MTQ9cjE7ODswOyIsMTI4LDAsMCwwCisuc3RhYnMgInZvaWQ6dDE1PTE1IiwxMjgsMCwwLDAKKy5zdGFicyAibXNnOkcxNj1hcjE7MDsxMzsyIiwzMiwwLDAsMAorCS5nbG9iYWwgbXNnCisuc2VjdGlvbgkiLnJvZGF0YSIKKwkuYWxpZ24gOAorCS50eXBlCSBtc2csI29iamVjdAorCS5zaXplCSBtc2csMTQKK21zZzoKKwkuYXNjaXoJImhlbGxvLCB3b3JsZCEiCisJLmFsaWduIDgKKy5MTEMwOgorCS5hc2NpegkiJXNcbiIKKy5zZWN0aW9uCSIudGV4dCIKKwkuYWxpZ24gNAorLnN0YWJzICJtYWluOkYxIiwzNiwwLDAsbWFpbgorLnN0YWJzICJhcmdjOlAxIiw2NCwwLDAsMjQKKy5zdGFicyAiYXJndjpQMTc9KjE4PSoyIiw2NCwwLDAsMjUKKwkuZ2xvYmFsIG1haW4KKwkudHlwZQkgbWFpbiwjZnVuY3Rpb24KKwkucHJvYwkwNAorbWFpbjoKKy5zdGFibiA2OCwwLDQsLkxNMS1tYWluCisuTE0xOgorCSEjUFJPTE9HVUUjIDAKKwlzYXZlICVzcCwtMTEyLCVzcAorCSEjUFJPTE9HVUUjIDEKKy5zdGFibiA2OCwwLDUsLkxNMi1tYWluCisuTE0yOgorLkxMQkIyOgorCXNldGhpICVoaSguTExDMCksJW8wCisJb3IgJW8wLCVsbyguTExDMCksJW8wCisJc2V0aGkgJWhpKG1zZyksJW8xCisJY2FsbCBwcmludGYsMAorCW9yICVvMSwlbG8obXNnKSwlbzEKKy5zdGFibiA2OCwwLDYsLkxNMy1tYWluCisuTE0zOgorLnN0YWJuIDY4LDAsNywuTE00LW1haW4KKy5MTTQ6CisuTExCRTI6CisJcmV0CisJcmVzdG9yZSAlZzAsMCwlbzAKKy5MTGZlMToKKwkuc2l6ZQkgbWFpbiwuTExmZTEtbWFpbgorLnN0YWJuIDE5MiwwLDAsLkxMQkIyLW1haW4KKy5zdGFibiAyMjQsMCwwLC5MTEJFMi1tYWluCisJLmlkZW50CSJHQ0M6IChHTlUpIGN5Z251cy0yLjMuMyIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1ZWExYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5kCkBAIC0wLDAgKzEsMzUgQEAKKyNhczogLUF2OQorI29iamR1bXA6IC1kcgorI25hbWU6IHNwYXJjNjQgYXNpCisKKy4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArIDwudGV4dD46CisgICAwOgljNCA4MCA0MCAwMCAJbGRhICBcWyAlZzEgXF0gXCgwXCksICVnMgorICAgNDoJYzQgODAgNWYgZTAgCWxkYSAgXFsgJWcxIFxdIFwoMjU1XCksICVnMgorICAgODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCisgICBjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKKyAgMTA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCisgIDE0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgorICAxODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCisgIDFjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKKyAgMjA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCisgIDI0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgorICAyODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKKyAgMmM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCisgIDMwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCisgIDM0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCisgIDM4OgljNCA4MCA0MiAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQLCAlZzIKKyAgM2M6CWM0IDgwIDQyIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVMsICVnMgorICA0MDoJYzQgODAgNDMgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUF9MLCAlZzIKKyAgNDQ6CWM0IDgwIDQzIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVNfTCwgJWcyCisgIDQ4OgljNCA4MCA1MCAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QLCAlZzIKKyAgNGM6CWM0IDgwIDUwIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1MsICVnMgorICA1MDoJYzQgODAgNTAgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GLCAlZzIKKyAgNTQ6CWM0IDgwIDUwIDYwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NORiwgJWcyCisgIDU4OgljNCA4MCA1MSAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QX0wsICVnMgorICA1YzoJYzQgODAgNTEgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU19MLCAlZzIKKyAgNjA6CWM0IDgwIDUxIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORl9MLCAlZzIKKyAgNjQ6CWM0IDgwIDUxIDYwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NORl9MLCAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2ZmU5YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zCkBAIC0wLDAgKzEsMjggQEAKKyMgVGVzdCBhc2kncy4KKwkudGV4dAorCWxkdXdhIFslZzFdMCwlZzIKKwlsZHV3YSBbJWcxXTI1NSwlZzIKKwlsZHV3YSBbJWcxXSNBU0lfQUlVUCwlZzIKKwlsZHV3YSBbJWcxXSNBU0lfQUlVUywlZzIKKwlsZHV3YSBbJWcxXSNBU0lfQUlVUF9MLCVnMgorCWxkdXdhIFslZzFdI0FTSV9BSVVTX0wsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1AsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1MsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1BORiwlZzIKKwlsZHV3YSBbJWcxXSNBU0lfU05GLCVnMgorCWxkdXdhIFslZzFdI0FTSV9QX0wsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1NfTCwlZzIKKwlsZHV3YSBbJWcxXSNBU0lfUE5GX0wsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1NORl9MLCVnMgorCWxkdXdhIFslZzFdI0FTSV9BU19JRl9VU0VSX1BSSU1BUlksJWcyCisJbGR1d2EgWyVnMV0jQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZLCVnMgorCWxkdXdhIFslZzFdI0FTSV9BU19JRl9VU0VSX1BSSU1BUllfTElUVExFLCVnMgorCWxkdXdhIFslZzFdI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWV9MSVRUTEUsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1BSSU1BUlksJWcyCisJbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWSwlZzIKKwlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWV9OT0ZBVUxULCVnMgorCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUllfTk9GQVVMVCwlZzIKKwlsZHV3YSBbJWcxXSNBU0lfUFJJTUFSWV9MSVRUTEUsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWV9MSVRUTEUsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1BSSU1BUllfTk9GQVVMVF9MSVRUTEUsJWcyCisJbGR1d2EgWyVnMV0jQVNJX1NFQ09OREFSWV9OT0ZBVUxUX0xJVFRMRSwlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiNmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5kCkBAIC0wLDAgKzEsMTkgQEAKKyNhczogLUF2OQorI29iamR1bXA6IC1kcgorI25hbWU6IHNwYXJjNjQgbWVtYmFyCisKKy4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArIDwudGV4dD46CisgICAwOgk4MSA0MyBlMCAwMCAJbWVtYmFyICAwCisgICA0Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCisgICA4Ogk4MSA0MyBlMCA3ZiAJbWVtYmFyICAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCisgICBjOgk4MSA0MyBlMCA0MCAJbWVtYmFyICAjU3luYworICAxMDoJODEgNDMgZTAgMjAgCW1lbWJhciAgI01lbUlzc3VlCisgIDE0Ogk4MSA0MyBlMCAxMCAJbWVtYmFyICAjTG9va2FzaWRlCisgIDE4Ogk4MSA0MyBlMCAwOCAJbWVtYmFyICAjU3RvcmVTdG9yZQorICAxYzoJODEgNDMgZTAgMDQgCW1lbWJhciAgI0xvYWRTdG9yZQorICAyMDoJODEgNDMgZTAgMDIgCW1lbWJhciAgI1N0b3JlTG9hZAorICAyNDoJODEgNDMgZTAgMDEgCW1lbWJhciAgI0xvYWRMb2FkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDVlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIucwpAQCAtMCwwICsxLDEyIEBACisjIFRlc3QgbWVtYmFyIGFyZ3MKKwkudGV4dAorCW1lbWJhciAwCisJbWVtYmFyIDEyNworCW1lbWJhciAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCisJbWVtYmFyICNTeW5jCisJbWVtYmFyICNNZW1Jc3N1ZQorCW1lbWJhciAjTG9va2FzaWRlCisJbWVtYmFyICNTdG9yZVN0b3JlCisJbWVtYmFyICNMb2FkU3RvcmUKKwltZW1iYXIgI1N0b3JlTG9hZAorCW1lbWJhciAjTG9hZExvYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbS0xLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjNWU0OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zCkBAIC0wLDAgKzEsMjIgQEAKKyEgVGVzdCBhcmNoaXRlY3R1cmUgbWlzbWF0Y2ggd2FybmluZ3MuCishIFdlIGRvbid0IHRlc3QgZXZlcnkgcG9zc2libGUgbWlzbWF0Y2gsIHdlIGp1c3Qgd2FudCB0byBiZSByZWFzb25hYmxlIHN1cmUKKyEgdGhlIG1pc21hdGNoIGNoZWNraW5nIGNvZGUgd29ya3MuCishCishIHsgZGctZG8gYXNzZW1ibGUgeyB0YXJnZXQgc3BhcmMqLSotKiB9IH0KKyEgeyBkZy1vcHRpb25zIC1BdjYgfQorCishIHNwYXJjbGl0ZQorCisJZGl2c2NjICVnMSwlZzIsJWczCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8c3BhcmNsaXRlIiAic3BhcmNsaXRlIGRpdnNjYyBtaXNtYXRjaCIgfQorCisJc2NhbiAlZzEsJWcyLCVnMwkhIHsgZGctZXJyb3IgIm1pc21hdGNofHNwYXJjbGl0ZSIgInNwYXJjbGl0ZSBzY2FuIG1pc21hdGNoIiB9CisKKyEgdjkKKworCW1vdnJ6ICVnMSwlZzIsJWczCSEgeyBkZy1lcnJvciAibWlzbWF0Y2h8djkiICJ2OSBmcCByZWcgbWlzbWF0Y2giIH0KKworISB2OWEKKworCXNodXRkb3duCQkhIHsgZGctZXJyb3IgIm1pc21hdGNofHY5YSIgInY5YSBzaHV0ZG93biBtaXNtYXRjaCIgfQorCitmb286CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtYXRjaC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9taXNtYXRjaC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4OWRlMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cApAQCAtMCwwICsxLDIwIEBACisjIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIGVycm9ycy4KKyMKKyMgR0FTIGlzc3VlcyB0d28gbGluZXMgb2YgZXJyb3IgdGV4dCBmb3IgZWFjaCBtaXNtYXRjaDoKKyMKKyMgbW0tbGl0ZS5zOjc6IEVycm9yOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggb24gImRpdnNjYyIuCisjIG1tLWxpdGUuczo3OiAgKFJlcXVpcmVzIHNwYXJjbGl0ZTsgcmVxdWVzdGVkIGFyY2hpdGVjdHVyZSBpcyB2OC4pCisjCisjIFRoZSBzdWdnZXN0ZWQgcmVnZXhwIGFyZ3VtZW50IHRvIGRnLWVycm9yIGlzICJtaXNtYXRjaHw8YXJjaD4iLgorCitpZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0geworCisgICAgbG9hZF9saWIgZ2FzLWRnLmV4cAorCisgICAgZGctaW5pdAorCisgICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL21pc20tKi5zXV0gIiIgIiIKKworICAgIGRnLWZpbmlzaAorCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2guZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTgwM2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2guZApAQCAtMCwwICsxLDE5IEBACisjYXM6IC1BdjkKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBzcGFyYzY0IHByZWZldGNoCisKKy4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzArIDwudGV4dD46CisgICAwOgljMSA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI25fcmVhZHMKKyAgIDQ6CWZmIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAzMQorICAgODoJYzEgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3JlYWRzCisgICBjOgljMyA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI29uZV9yZWFkCisgIDEwOgljNSA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI25fd3JpdGVzCisgIDE0OgljNyA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgI29uZV93cml0ZQorICAxODoJYzEgZTggNDIgMDAgCXByZWZldGNoYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgI25fcmVhZHMKKyAgMWM6CWZmIGU4IDYwIDAwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAlYXNpLCAzMQorICAyMDoJYzEgZTggNDIgMjAgCXByZWZldGNoYSAgXFsgJWcxIFxdICNBU0lfQUlVUywgI25fcmVhZHMKKyAgMjQ6CWMzIGU4IDYwIDAwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAlYXNpLCAjb25lX3JlYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzY4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zCkBAIC0wLDAgKzEsMTEgQEAKKwkudGV4dAorCXByZWZldGNoIFslZzFdLDAKKwlwcmVmZXRjaCBbJWcxXSwzMQorCXByZWZldGNoIFslZzFdLCNuX3JlYWRzCisJcHJlZmV0Y2ggWyVnMV0sI29uZV9yZWFkCisJcHJlZmV0Y2ggWyVnMV0sI25fd3JpdGVzCisJcHJlZmV0Y2ggWyVnMV0sI29uZV93cml0ZQorCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUCwwCisJcHJlZmV0Y2hhIFslZzFdJWFzaSwzMQorCXByZWZldGNoYSBbJWcxXSNBU0lfQUlVUywjbl9yZWFkcworCXByZWZldGNoYSBbJWcxXSVhc2ksI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhN2I2MQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZApAQCAtMCwwICsxLDI2IEBACisjYXM6IC1BdjkKKyNvYmpkdW1wOiAtZHIKKyNuYW1lOiBzcGFyYzY0IHJkcHIKKworLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCsgPC50ZXh0PjoKKyAgIDA6CTgzIDUwIDAwIDAwIAlyZHByICAldHBjLCAlZzEKKyAgIDQ6CTg1IDUwIDQwIDAwIAlyZHByICAldG5wYywgJWcyCisgICA4Ogk4NyA1MCA4MCAwMCAJcmRwciAgJXRzdGF0ZSwgJWczCisgICBjOgk4OSA1MCBjMCAwMCAJcmRwciAgJXR0LCAlZzQKKyAgMTA6CThiIDUxIDAwIDAwIAlyZHByICAldGljaywgJWc1CisgIDE0Ogk4ZCA1MSA0MCAwMCAJcmRwciAgJXRiYSwgJWc2CisgIDE4Ogk4ZiA1MSA4MCAwMCAJcmRwciAgJXBzdGF0ZSwgJWc3CisgIDFjOgk5MSA1MSBjMCAwMCAJcmRwciAgJXRsLCAlbzAKKyAgMjA6CTkzIDUyIDAwIDAwIAlyZHByICAlcGlsLCAlbzEKKyAgMjQ6CTk1IDUyIDQwIDAwIAlyZHByICAlY3dwLCAlbzIKKyAgMjg6CTk3IDUyIDgwIDAwIAlyZHByICAlY2Fuc2F2ZSwgJW8zCisgIDJjOgk5OSA1MiBjMCAwMCAJcmRwciAgJWNhbnJlc3RvcmUsICVvNAorICAzMDoJOWIgNTMgMDAgMDAgCXJkcHIgICVjbGVhbndpbiwgJW81CisgIDM0Ogk5ZCA1MyA0MCAwMCAJcmRwciAgJW90aGVyd2luLCAlc3AKKyAgMzg6CTlmIDUzIDgwIDAwIAlyZHByICAld3N0YXRlLCAlbzcKKyAgM2M6CWExIDUzIGMwIDAwIAlyZHByICAlZnEsICVsMAorICA0MDoJYTMgNTcgYzAgMDAgCXJkcHIgICV2ZXIsICVsMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmRwci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDYxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMKQEAgLTAsMCArMSwxOSBAQAorIyBUZXN0IHJkcHIKKwkudGV4dAorCXJkcHIgJXRwYywlZzEKKwlyZHByICV0bnBjLCVnMgorCXJkcHIgJXRzdGF0ZSwlZzMKKwlyZHByICV0dCwlZzQKKwlyZHByICV0aWNrLCVnNQorCXJkcHIgJXRiYSwlZzYKKwlyZHByICVwc3RhdGUsJWc3CisJcmRwciAldGwsJW8wCisJcmRwciAlcGlsLCVvMQorCXJkcHIgJWN3cCwlbzIKKwlyZHByICVjYW5zYXZlLCVvMworCXJkcHIgJWNhbnJlc3RvcmUsJW80CisJcmRwciAlY2xlYW53aW4sJW81CisJcmRwciAlb3RoZXJ3aW4sJW82CisJcmRwciAld3N0YXRlLCVvNworCXJkcHIgJWZxLCVsMAorCXJkcHIgJXZlciwlbDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4MjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5kCkBAIC0wLDAgKzEsNzYgQEAKKyNhczogLUF2OQorI29iamR1bXA6IC1kcgorI25hbWU6IHNwYXJjNjQgcmVsb2M2NAorCisuKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswKyA8Zm9vPjoKKyAgIDA6CTAzIDA0IDhkIDE1IAlzZXRoaSAgJWhpXCgweDEyMzQ1NDAwXCksICVnMQorICAgNDoJODIgMTAgNjIgNzggCW9yICAlZzEsIDB4Mjc4LCAlZzEuKgorICAgODoJMDEgMDAgMDAgMDAgCW5vcCAKKyAgIGM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcxCisJCQljOiBSX1NQQVJDX0hIMjIJLnRleHQKKyAgMTA6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgorCQkJMTA6IFJfU1BBUkNfSE0xMAkudGV4dAorICAxNDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAgMTg6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcxCisJCQkxODogUl9TUEFSQ19ISDIyCS50ZXh0XCsweDEyMzQ1Njc4MDAwMDAwMDAKKyAgMWM6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgorCQkJMWM6IFJfU1BBUkNfSE0xMAkudGV4dFwrMHgxMjM0NTY3ODAwMDAwMDAwCisgIDIwOgkwMSAwMCAwMCAwMCAJbm9wIAorICAyNDoJMDMgM2YgYjcgMmUgCXNldGhpICAlaGlcKDB4ZmVkY2I4MDBcKSwgJWcxCisgIDI4Ogk4MiAxMCA2MiA5OCAJb3IgICVnMSwgMHgyOTgsICVnMS4qCisgIDJjOgkwNSAxZCA5NSAwYyAJc2V0aGkgICVoaVwoMHg3NjU0MzAwMFwpLCAlZzIKKyAgMzA6CTg0IDEwIDYyIDEwIAlvciAgJWcxLCAweDIxMCwgJWcyCisgIDM0OgkwMSAwMCAwMCAwMCAJbm9wIAorICAzODoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzEKKwkJCTM4OiBSX1NQQVJDX0hIMjIJLnRleHQKKyAgM2M6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgorCQkJM2M6IFJfU1BBUkNfSE0xMAkudGV4dAorICA0MDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzIKKwkJCTQwOiBSX1NQQVJDX0xNMjIJLnRleHQKKyAgNDQ6CTg0IDEwIDYwIDAwIAltb3YgICVnMSwgJWcyCisJCQk0NDogUl9TUEFSQ19MTzEwCS50ZXh0CisgIDQ4OgkwMSAwMCAwMCAwMCAJbm9wIAorICA0YzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzEKKwkJCTRjOiBSX1NQQVJDX0hIMjIJLnRleHRcKzB4ZmVkY2JhOTg3NjU0MzIxMAorICA1MDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+CisJCQk1MDogUl9TUEFSQ19ITTEwCS50ZXh0XCsweGZlZGNiYTk4NzY1NDMyMTAKKyAgNTQ6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcyCisJCQk1NDogUl9TUEFSQ19MTTIyCS50ZXh0XCsweGZlZGNiYTk4NzY1NDMyMTAKKyAgNTg6CTg0IDEwIDYwIDAwIAltb3YgICVnMSwgJWcyCisJCQk1ODogUl9TUEFSQ19MTzEwCS50ZXh0XCsweGZlZGNiYTk4NzY1NDMyMTAKKyAgNWM6CTAxIDAwIDAwIDAwIAlub3AgCisgIDYwOgkwMyAyYSA2MSBkOSAJc2V0aGkgICVoaVwoMHhhOTg3NjQwMFwpLCAlZzEKKyAgNjQ6CTgyIDEwIDYxIDQzIAlvciAgJWcxLCAweDE0MywgJWcxLioKKyAgNjg6CTgyIDEwIDYyIDEwIAlvciAgJWcxLCAweDIxMCwgJWcxCisgIDZjOgkwMSAwMCAwMCAwMCAJbm9wIAorICA3MDoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKDB4MFwpLCAlZzEKKwkJCTcwOiBSX1NQQVJDX0g0NAkudGV4dAorICA3NDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+CisJCQk3NDogUl9TUEFSQ19NNDQJLnRleHQKKyAgNzg6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCisJCQk3ODogUl9TUEFSQ19MNDQJLnRleHQKKyAgN2M6CTAxIDAwIDAwIDAwIAlub3AgCisgIDgwOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMQorCQkJODA6IFJfU1BBUkNfSDQ0CS50ZXh0XCsweGE5ODc2NTQzMjEwCisgIDg0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KKwkJCTg0OiBSX1NQQVJDX000NAkudGV4dFwrMHhhOTg3NjU0MzIxMAorICA4ODoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEKKwkJCTg4OiBSX1NQQVJDX0w0NAkudGV4dFwrMHhhOTg3NjU0MzIxMAorICA4YzoJMDEgMDAgMDAgMDAgCW5vcCAKKyAgOTA6CTAzIDIyIDZhIGYzIAlzZXRoaSAgJWhpXCgweDg5YWJjYzAwXCksICVnMQorICA5NDoJODIgMTggN2UgMTAgCXhvciAgJWcxLCAtNDk2LCAlZzEKKyAgOTg6CTAxIDAwIDAwIDAwIAlub3AgCisgIDljOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMQorCQkJOWM6IFJfU1BBUkNfSElYMjIJLnRleHQKKyAgYTA6CTgyIDE4IDYwIDAwIAl4b3IgICVnMSwgMCwgJWcxCisJCQlhMDogUl9TUEFSQ19MT1gxMAkudGV4dAorICBhNDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAgYTg6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcxCisJCQlhODogUl9TUEFSQ19ISVgyMgkudGV4dFwrMHhmZmZmZmZmZjc2NTQzMjEwCisgIGFjOgk4MiAxOCA2MCAwMCAJeG9yICAlZzEsIDAsICVnMQorCQkJYWM6IFJfU1BBUkNfTE9YMTAJLnRleHRcKzB4ZmZmZmZmZmY3NjU0MzIxMAorICBiMDoJMDEgMDAgMDAgMDAgCW5vcCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFkNmFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCkBAIC0wLDAgKzEsNDggQEAKKyMgc3BhcmM2NCBzcGVjaWFsIHJlbG9jcworCitmb286CisJc2V0aGkgJXVoaSgweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQorCW9yICVnMSwldWxvKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCisJbm9wCisJc2V0aGkgJXVoaShmb28pLCVnMQorCW9yICVnMSwldWxvKGZvbyksJWcxCisJbm9wCisJc2V0aGkgJXVoaShmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKKwlvciAlZzEsJXVsbyhmb28rMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKKwlub3AKKwlzZXRoaSAlaGgoMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKKwlvciAlZzEsJWhtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCisJc2V0aGkgJWxtKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCisJb3IgJWcxLCVsbygweGZlZGNiYTk4NzY1NDMyMTApLCVnMgorCW5vcAorCXNldGhpICVoaChmb28pLCVnMQorCW9yICVnMSwlaG0oZm9vKSwlZzEKKwlzZXRoaSAlbG0oZm9vKSwlZzIKKwlvciAlZzEsJWxvKGZvbyksJWcyCisJbm9wCisJc2V0aGkgJWhoKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMQorCW9yICVnMSwlaG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCisJc2V0aGkgJWxtKGZvbysweGZlZGNiYTk4NzY1NDMyMTApLCVnMgorCW9yICVnMSwlbG8oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCisJbm9wCisJc2V0aGkgJWg0NCgweGE5ODc2NTQzMjEwKSwlZzEKKwlvciAlZzEsJW00NCgweGE5ODc2NTQzMjEwKSwlZzEKKwlvciAlZzEsJWw0NCgweGE5ODc2NTQzMjEwKSwlZzEKKwlub3AKKwlzZXRoaSAlaDQ0KGZvbyksJWcxCisJb3IgJWcxLCVtNDQoZm9vKSwlZzEKKwlvciAlZzEsJWw0NChmb28pLCVnMQorCW5vcAorCXNldGhpICVoNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQorCW9yICVnMSwlbTQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKKwlvciAlZzEsJWw0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCisJbm9wCisJc2V0aGkgJWhpeCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQorCXhvciAlZzEsJWxveCgweGZmZmZmZmZmNzY1NDMyMTApLCVnMQorCW5vcAorCXNldGhpICVoaXgoZm9vKSwlZzEKKwl4b3IgJWcxLCVsb3goZm9vKSwlZzEKKwlub3AKKwlzZXRoaSAlaGl4KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQorCXhvciAlZzEsJWxveChmb28rMHhmZmZmZmZmZjc2NTQzMjEwKSwlZzEKKwlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWJlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5kCkBAIC0wLDAgKzEsODggQEAKKyNhczogLUF2OQorI29iamR1bXA6IC1kcgorI25hbWU6IHNwYXJjNjQgc2V0NjQKKworLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCsgPGZvbz46CisgICAwOgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoMHgwXCksICVnMgorCQkJMDogUl9TUEFSQ19ISTIyCS50ZXh0CisgICA0Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KKwkJCTQ6IFJfU1BBUkNfTE8xMAkudGV4dAorICAgODoJMDcgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWczCisgICBjOgk4NiAxMCBlMiAxMCAJb3IgICVnMywgMHgyMTAsICVnMwkhIDc2NTQzMjEwIDxcKkFCU1wqXCsoMHh8KTB4NzY1NDMyMTA+CisgIDEwOgk4OCAxMCAyMCAwMCAJY2xyICAlZzQKKyAgMTQ6CTBiIDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWc1CisgIDE4Ogk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmYgPFwqQUJTXCpcKygweHwpZmZmZj4KKyAgMWM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcxCisJCQkxYzogUl9TUEFSQ19ISDIyCS50ZXh0CisgIDIwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KKwkJCTIwOiBSX1NQQVJDX0hNMTAJLnRleHQKKyAgMjQ6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDBcKSwgJWcyCisJCQkyNDogUl9TUEFSQ19ISTIyCS50ZXh0CisgIDI4Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KKwkJCTI4OiBSX1NQQVJDX0xPMTAJLnRleHQKKyAgMmM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQorICAzMDoJODQgMTAgODAgMDEgCW9yICAlZzIsICVnMSwgJWcyCisgIDM0Ogk4NiAxMCAzZiBmZiAJbW92ICAtMSwgJWczCisgIDM4Ogk4NiAxMCAyMCAwMCAJY2xyICAlZzMKKyAgM2M6CTg2IDEwIDIwIDAxIAltb3YgIDEsICVnMworICA0MDoJODYgMTAgMmYgZmYgCW1vdiAgMHhmZmYsICVnMworICA0NDoJMDcgMDAgMDAgMDQgCXNldGhpICAlaGlcKDB4MTAwMFwpLCAlZzMKKyAgNDg6CTg2IDEwIDMwIDAwIAltb3YgIC00MDk2LCAlZzMKKyAgNGM6CTA3IDNmIGZmIGZiIAlzZXRoaSAgJWhpXCgweGZmZmZlYzAwXCksICVnMworICA1MDoJODYgMTAgZTMgZmYgCW9yICAlZzMsIDB4M2ZmLCAlZzMJISBmZmZmZWZmZiA8XCpBQlNcKlwrKDB4fClmZmZmZWZmZj4KKyAgNTQ6CTg3IDM4IGUwIDAwIAlzcmEgICVnMywgMCwgJWczCisgIDU4OgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMworICA1YzoJODYgMTAgZTMgZmYgCW9yICAlZzMsIDB4M2ZmLCAlZzMJISBmZmZmIDxcKkFCU1wqXCsoMHh8KWZmZmY+CisgIDYwOgkwNyAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzMKKyAgNjQ6CTg3IDM4IGUwIDAwIAlzcmEgICVnMywgMCwgJWczCisgIDY4OgkwOSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzQKKyAgNmM6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgN2ZmZmZmZmYgPFwqQUJTXCpcKygweHwpN2ZmZmZmZmY+CisgIDcwOgkwOSAyMCAwMCAwMCAJc2V0aGkgICVoaVwoMHg4MDAwMDAwMFwpLCAlZzQKKyAgNzQ6CTA5IDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNAorICA3ODoJODkgMzkgMjAgMDAgCXNyYSAgJWc0LCAwLCAlZzQKKyAgN2M6CTgyIDEwIDNmIGZmIAltb3YgIC0xLCAlZzEKKyAgODA6CTA5IDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNAorICA4NDoJODggMTEgMjMgZmYgCW9yICAlZzQsIDB4M2ZmLCAlZzQJISA3ZmZmZmZmZiA8XCpBQlNcKlwrKDB4fCk3ZmZmZmZmZj4KKyAgODg6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQorICA4YzoJODggMTEgMDAgMDEgCW9yICAlZzQsICVnMSwgJWc0CisgIDkwOgkwOSAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzQKKyAgOTQ6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgZmZmZmZmZmYgPFwqQUJTXCpcKygweHwpZmZmZmZmZmY+CisgIDk4Ogk4OCAxMCAyMCAwMSAJbW92ICAxLCAlZzQKKyAgOWM6CTg5IDI5IDMwIDIwIAlzbGx4ICAlZzQsIDB4MjAsICVnNAorICBhMDoJMDMgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWcxCisgIGE0Ogk4MiAxMCA2MyBmZiAJb3IgICVnMSwgMHgzZmYsICVnMQkhIDdmZmZmZmZmIDxcKkFCU1wqXCsoMHh8KTdmZmZmZmZmPgorICBhODoJMGIgM2YgZmYgZmYgCXNldGhpICAlaGlcKDB4ZmZmZmZjMDBcKSwgJWc1CisgIGFjOgk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQkhIGZmZmZmZmZmIDxcKkFCU1wqXCsoMHh8KWZmZmZmZmZmPgorICBiMDoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCisgIGI0Ogk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKKyAgYjg6CTBiIDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNQorICBiYzoJOGIgMjkgNzAgMjAgCXNsbHggICVnNSwgMHgyMCwgJWc1CisgIGMwOgk4YSAxMCAzZiBmZiAJbW92ICAtMSwgJWc1CisgIGM0Ogk4YiAyOSA3MCAyMCAJc2xseCAgJWc1LCAweDIwLCAlZzUKKyAgYzg6CTBiIDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNQorICBjYzoJOGIgMzkgNjAgMDAgCXNyYSAgJWc1LCAwLCAlZzUKKyAgZDA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQorICBkNDoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1CisgIGQ4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKKyAgZGM6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQorICBlMDoJMDMgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWcxCisgIGU0Ogk4YSAxMCAyMCAwMSAJbW92ICAxLCAlZzUKKyAgZTg6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQorICBlYzoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1CisgIGYwOgk4MiAxMCAyMCAwMSAJbW92ICAxLCAlZzEKKyAgZjQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQorICBmODoJOGEgMTEgNjAgMDEgCW9yICAlZzUsIDEsICVnNQkhIGZmZmYwMDAxIDxcKkFCU1wqXCsoMHh8KWZmZmYwMDAxPgorICBmYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCisgMTAwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKKyAxMDQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQorIDEwODoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1CisgMTBjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKKyAxMTA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQorIDExNDoJODIgMTAgMjAgMDEgCW1vdiAgMSwgJWcxCisgMTE4Ogk4YSAxMCAyMCAwMSAJbW92ICAxLCAlZzUKKyAxMWM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQorIDEyMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRjOTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucwpAQCAtMCwwICsxLDQzIEBACisjIHNwYXJjNjQgc2V0IGluc24gaGFuZGxpbmcgKGluY2x1ZGVzIHNldCwgc2V0dXcsIHNldHN3LCBzZXR4KQorIyBGSVhNRTogc2V0dXcsc2V0c3cgbm90IHRlc3RlZCBmb3IgeWV0LgorCitmb286CisJc2V0IGZvbywlZzIKKwlzZXQgMHg3NjU0MzIxMCwlZzMKKwlzZXQgMCwlZzQKKwlzZXQgNjU1MzUsJWc1CisKKwlzZXR4IGZvbywlZzEsJWcyCisKKwlzZXR4IC0xLCVnMSwlZzMKKwlzZXR4IDAsJWcxLCVnMworCXNldHggMSwlZzEsJWczCisJc2V0eCA0MDk1LCVnMSwlZzMKKwlzZXR4IDQwOTYsJWcxLCVnMworCXNldHggLTQwOTYsJWcxLCVnMworCXNldHggLTQwOTcsJWcxLCVnMworCXNldHggNjU1MzUsJWcxLCVnMworCXNldHggLTY1NTM2LCVnMSwlZzMKKworCXNldHggMjE0NzQ4MzY0NywlZzEsJWc0CisJc2V0eCAyMTQ3NDgzNjQ4LCVnMSwlZzQKKwlzZXR4IC0yMTQ3NDgzNjQ4LCVnMSwlZzQKKwlzZXR4IC0yMTQ3NDgzNjQ5LCVnMSwlZzQKKwlzZXR4IDQyOTQ5NjcyOTUsJWcxLCVnNAorCXNldHggNDI5NDk2NzI5NiwlZzEsJWc0CisKKyEgR0FTIGRvZXNuJ3QgaGFuZGxlIGxhcmdlIGJhc2UxMCBudW1iZXJzIHlldC4KKyEJc2V0eCA5MjIzMzcyMDM2ODU0Nzc1ODA3LCVnMSwlZzUKKyEJc2V0eCA5MjIzMzcyMDM2ODU0Nzc1ODA4LCVnMSwlZzUKKyEJc2V0eCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwlZzEsJWc1CishCXNldHggLTkyMjMzNzIwMzY4NTQ3NzU4MDksJWcxLCVnNQorCisJc2V0eCAweDdmZmZmZmZmZmZmZmZmZmYsJWcxLCVnNQorCXNldHggMHg4MDAwMDAwMDAwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBvbmx5IGhoMjIgbmVlZGVkCisJc2V0eCAweGZmZmZmZmZmMDAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IG9ubHkgaG0xMCBuZWVkZWQKKwlzZXR4IDB4ZmZmZmZmZmY4MDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgc2lnbi1leHQgb2YgbG93ZXIgMzIKKwlzZXR4IDB4ZmZmZjAwMDBmZmZmMDAwMCwlZzEsJWc1CQkhIHRlc3QgaGgyMixoaTIyCisJc2V0eCAweGZmZmYwMDAwMDAwMDAwMDEsJWcxLCVnNQkJISB0ZXN0IGhoMjIsbG8xMAorCXNldHggMHgwMDAwMDAwMWZmZmYwMDAxLCVnMSwlZzUJCSEgdGVzdCBobTEwLGhpMjIsbG8xMAorCXNldHggMHgwMDAwMDAwMWZmZmYwMDAwLCVnMSwlZzUJCSEgdGVzdCBobTEwLGhpMjIKKwlzZXR4IDB4MDAwMDAwMDEwMDAwMDAwMSwlZzEsJWc1CQkhIHRlc3QgaG0xMCxsbzEwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3OTM1OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwYXJjLmV4cApAQCAtMCwwICsxLDI3IEBACisjIFNvbWUgZ2VuZXJpYyBTUEFSQyBhbmQgU1BBUkM2NCB0ZXN0cworCisjIEZJWE1FOiBUaGUgdGVzdHMgaGVyZSBhcmVuJ3QgcmVhbGx5IGJ1bGxldCBwcm9vZi4gIEEgbWlzdGFrZSBpbiB0aGUgb3Bjb2RlCisjIHRhYmxlIGNhbiBzbGlwIHRocm91Z2ggc2luY2Ugd2UgdXNlIHRoZSBzYW1lIHRhYmxlIGZvciBhc3NlbWJseSBhbmQKKyMgZGlzYXNzZW1ibHkuICBUaGUgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIGluY2x1ZGUgYSBoZXggZHVtcCBvZiB0aGUgaW5zbnMKKyMgYW5kIHRlc3QgdGhhdCBhcyB3ZWxsLiAgTGF0ZXIuCisKK2lmIFtpc3RhcmdldCBzcGFyYyotKi0qXSB7CisgICAgcnVuX2R1bXBfdGVzdCAic3ludGgiCit9CisKKworaWYgW2lzdGFyZ2V0IHNwYXJjNjQqLSotKl0geworICAgIHJ1bl9kdW1wX3Rlc3QgImFzaSIKKyAgICBydW5fZHVtcF90ZXN0ICJtZW1iYXIiCisgICAgcnVuX2R1bXBfdGVzdCAicHJlZmV0Y2giCisgICAgcnVuX2R1bXBfdGVzdCAic2V0NjQiCisgICAgcnVuX2R1bXBfdGVzdCAic3ludGg2NCIKKyAgICBydW5fZHVtcF90ZXN0ICJyZHByIgorICAgIHJ1bl9kdW1wX3Rlc3QgIndycHIiCisgICAgcnVuX2R1bXBfdGVzdCAicmVsb2M2NCIKK30KKworaWYgW2lzdGFyZ2V0IHNwYXJjbGV0Ki0qLSpdIHsKKyAgICBydW5fZHVtcF90ZXN0ICJzcGxldCIKKyAgICBydW5fZHVtcF90ZXN0ICJzcGxldC0yIgorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTU1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLmQKQEAgLTAsMCArMSwyMyBAQAorI2FzOiAtQXNwYXJjbGV0Cisjb2JqZHVtcDogLWRyCisjbmFtZTogc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMCsgPHN0YXJ0PjoKKyAgIDA6CTgxIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IKKyAgIDQ6CTgzIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjZnIKKyAgIDg6CTg1IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjY3JjcgorICAgYzoJODcgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2NwcgorICAxMDoJODkgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2NzcjIKKyAgMTQ6CThiIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjY3JyCisgIDE4Ogk4ZCBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3JzdHIKKyAgMWM6CTgzIGIwIDAxIDAwIAljcmRjeHQgICVjY3NyLCAlZzEKKyAgMjA6CTgzIGIwIDQxIDAwIAljcmRjeHQgICVjY2ZyLCAlZzEKKyAgMjQ6CTgzIGIwIDgxIDAwIAljcmRjeHQgICVjY2NyY3IsICVnMQorICAyODoJODMgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVnMQorICAyYzoJODMgYjEgMDEgMDAgCWNyZGN4dCAgJWNjc3IyLCAlZzEKKyAgMzA6CTgzIGIxIDQxIDAwIAljcmRjeHQgICVjY2NyciwgJWcxCisgIDM0Ogk4MyBiMSA4MSAwMCAJY3JkY3h0ICAlY2Nyc3RyLCAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM0NDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5zCkBAIC0wLDAgKzEsMjEgQEAKKyEgVGVzdCBzcGFyY2xldCBjb3Byb2Nlc3NvciByZWdpc3RlcnMuCisKKwkudGV4dAorCS5nbG9iYWwgc3RhcnQKK3N0YXJ0OgorCisJY3dyY3h0ICAgICVnMSwlY2NzcgorCWN3cmN4dCAgICAlZzEsJWNjZnIKKwljd3JjeHQgICAgJWcxLCVjY2NyY3IKKwljd3JjeHQgICAgJWcxLCVjY3ByCisJY3dyY3h0ICAgICVnMSwlY2NzcjIKKwljd3JjeHQgICAgJWcxLCVjY2NycgorCWN3cmN4dCAgICAlZzEsJWNjcnN0cgorCisJY3JkY3h0ICAgICVjY3NyLCVnMQorCWNyZGN4dCAgICAlY2NmciwlZzEKKwljcmRjeHQgICAgJWNjY3JjciwlZzEKKwljcmRjeHQgICAgJWNjcHIsJWcxCisJY3JkY3h0ICAgICVjY3NyMiwlZzEKKwljcmRjeHQgICAgJWNjY3JyLCVnMQorCWNyZGN4dCAgICAlY2Nyc3RyLCVnMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMGEyMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LmQKQEAgLTAsMCArMSwxOTUgQEAKKyNhczogLUFzcGFyY2xldAorI29iamR1bXA6IC1kcgorI25hbWU6IHNwYXJjbGV0IGV4dGVuc2lvbnMKKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswKyA8c3RhcnQ+OgorICAgMDoJYTEgNDAgMDAgMDAgCXJkICAleSwgJWwwCisgICA0OglhMSA0MCA0MCAwMCAJcmQgICVhc3IxLCAlbDAKKyAgIDg6CWExIDQzIGMwIDAwIAlyZCAgJWFzcjE1LCAlbDAKKyAgIGM6CWExIDQ0IDQwIDAwIAlyZCAgJWFzcjE3LCAlbDAKKyAgMTA6CWExIDQ0IDgwIDAwIAlyZCAgJWFzcjE4LCAlbDAKKyAgMTQ6CWExIDQ0IGMwIDAwIAlyZCAgJWFzcjE5LCAlbDAKKyAgMTg6CWExIDQ1IDAwIDAwIAlyZCAgJWFzcjIwLCAlbDAKKyAgMWM6CWExIDQ1IDQwIDAwIAlyZCAgJWFzcjIxLCAlbDAKKyAgMjA6CWExIDQ1IDgwIDAwIAlyZCAgJWFzcjIyLCAlbDAKKyAgMjQ6CTgxIDg0IDIwIDAwIAltb3YgICVsMCwgJXkKKyAgMjg6CTgzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjEKKyAgMmM6CTlmIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE1CisgIDMwOglhMyA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxNworICAzNDoJYTUgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTgKKyAgMzg6CWE3IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE5CisgIDNjOglhOSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMAorICA0MDoJYWIgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjEKKyAgNDQ6CWFkIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIyCisKKzArNDggPHRlc3RfdW11bD46CisgIDQ4Ogk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMworICA0YzoJODYgNTAgNDAgMDIgCXVtdWwgICVnMSwgJWcyLCAlZzMKKworMCs1MCA8dGVzdF9zbXVsPjoKKyAgNTA6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCisgIDU0Ogk4NiA1OCA0MCAwMiAJc211bCAgJWcxLCAlZzIsICVnMworCiswKzU4IDx0ZXN0X3N0YmFyPjoKKyAgNTg6CTgxIDQzIGMwIDAwIAlzdGJhciAKKyAgNWM6CTgxIDQzIGMwIDAwIAlzdGJhciAKKyAgNjA6CTAwIDAwIDAwIDAxIAl1bmltcCAgMHgxCisgIDY0Ogk4MSBkYyA0MCAwMCAJZmx1c2ggICVsMQorCiswKzY4IDx0ZXN0X3NjYW4+OgorICA2ODoJYTcgNjQgN2YgZmYgCXNjYW4gICVsMSwgLTEsICVsMworICA2YzoJYTcgNjQgNjAgMDAgCXNjYW4gICVsMSwgMCwgJWwzCisgIDcwOglhNyA2NCA0MCAxMSAJc2NhbiAgJWwxLCAlbDEsICVsMworCiswKzc0IDx0ZXN0X3NodWZmbGU+OgorICA3NDoJYTMgNmMgMjAgMDEgCXNodWZmbGUgICVsMCwgMSwgJWwxCisgIDc4OglhMyA2YyAyMCAwMiAJc2h1ZmZsZSAgJWwwLCAyLCAlbDEKKyAgN2M6CWEzIDZjIDIwIDA0IAlzaHVmZmxlICAlbDAsIDQsICVsMQorICA4MDoJYTMgNmMgMjAgMDggCXNodWZmbGUgICVsMCwgOCwgJWwxCisgIDg0OglhMyA2YyAyMCAxMCAJc2h1ZmZsZSAgJWwwLCAweDEwLCAlbDEKKyAgODg6CWEzIDZjIDIwIDE4IAlzaHVmZmxlICAlbDAsIDB4MTgsICVsMQorCiswKzhjIDx0ZXN0X3VtYWM+OgorICA4YzoJYTEgZjQgNDAgMTIgCXVtYWMgICVsMSwgJWwyLCAlbDAKKyAgOTA6CWExIGY0IDYwIDAyIAl1bWFjICAlbDEsIDIsICVsMAorICA5NDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCisKKzArOTggPHRlc3RfdW1hY2Q+OgorICA5ODoJYTEgNzQgODAgMTQgCXVtYWNkICAlbDIsICVsNCwgJWwwCisgIDljOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCisgIGEwOglhMSA3NCBhMCAwMyAJdW1hY2QgICVsMiwgMywgJWwwCisKKzArYTQgPHRlc3Rfc21hYz46CisgIGE0OglhMSBmYyA0MCAxMiAJc21hYyAgJWwxLCAlbDIsICVsMAorICBhODoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKKyAgYWM6CWExIGZjIDdmIGQ2IAlzbWFjICAlbDEsIC00MiwgJWwwCisKKzArYjAgPHRlc3Rfc21hY2Q+OgorICBiMDoJYTEgN2MgODAgMTQgCXNtYWNkICAlbDIsICVsNCwgJWwwCisgIGI0OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCisgIGI4OglhMSA3YyBhMCA3YiAJc21hY2QgICVsMiwgMHg3YiwgJWwwCisKKzArYmMgPHRlc3RfdW11bGQ+OgorICBiYzoJOTAgNGEgODAgMGMgCXVtdWxkICAlbzIsICVvNCwgJW8wCisgIGMwOgk5MCA0YSBhMiAzNCAJdW11bGQgICVvMiwgMHgyMzQsICVvMAorICBjNDoJOTAgNGEgYTUgNjcgCXVtdWxkICAlbzIsIDB4NTY3LCAlbzAKKworMCtjOCA8dGVzdF9zbXVsZD46CisgIGM4OgliMCA2ZSA4MCAxYyAJc211bGQgICVpMiwgJWk0LCAlaTAKKyAgY2M6CWIwIDZlIGIwIDAwIAlzbXVsZCAgJWkyLCAtNDA5NiwgJWkwCisgIGQwOgliMCA2ZiAyZiBmZiAJc211bGQgICVpNCwgMHhmZmYsICVpMAorCiswK2Q0IDx0ZXN0X2NvcHJvY2Vzc29yPjoKKyAgZDQ6CTgxIGI0IDAwIDExIAljcHVzaCAgJWwwLCAlbDEKKyAgZDg6CTgxIGI0IDIwIDAxIAljcHVzaCAgJWwwLCAxCisgIGRjOgk4MSBiNCAwMCA1MSAJY3B1c2hhICAlbDAsICVsMQorICBlMDoJODEgYjQgMjAgNDEgCWNwdXNoYSAgJWwwLCAxCisgIGU0OglhMSBiMCAwMCA4MCAJY3B1bGwgICVsMAorICBlODoJYTEgYjAgMDEgMDAgCWNyZGN4dCAgJWNjc3IsICVsMAorICBlYzoJYTEgYjAgNDEgMDAgCWNyZGN4dCAgJWNjZnIsICVsMAorICBmMDoJYTEgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVsMAorICBmNDoJYTEgYjAgODEgMDAgCWNyZGN4dCAgJWNjY3JjciwgJWwwCisgIGY4Ogk4MSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3NyCisgIGZjOgk4MyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2ZyCisgMTAwOgk4NyBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY3ByCisgMTA0Ogk4NSBiNCAwMCBjMCAJY3dyY3h0ICAlbDAsICVjY2NyY3IKKyAxMDg6CTAxIGMwIDAwIDAxIAljYm4gIDEwYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkzOD4KKwkJCTEwODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWY4CisgMTBjOgkwMSAwMCAwMCAwMCAJbm9wIAorIDExMDoJMjEgYzAgMDAgMDEgCWNibixhICAgMTE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTQwPgorCQkJMTEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjAKKyAxMTQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMTE4OgkwMyBjMCAwMCAwMSAJY2JlICAxMWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDg+CisJCQkxMTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVlOAorIDExYzoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxMjA6CTIzIGMwIDAwIDAxIAljYmUsYSAgIDEyNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk1MD4KKwkJCTEyMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWUwCisgMTI0OgkwMSAwMCAwMCAwMCAJbm9wIAorIDEyODoJMDUgYzAgMDAgMDEgCWNiZiAgMTJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTU4PgorCQkJMTI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZDgKKyAxMmM6CTAxIDAwIDAwIDAwIAlub3AgCisgMTMwOgkyNSBjMCAwMCAwMSAJY2JmLGEgICAxMzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjA+CisJCQkxMzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkMAorIDEzNDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxMzg6CTA3IGMwIDAwIDAxIAljYmVmICAxM2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNjg+CisJCQkxMzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjOAorIDEzYzoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxNDA6CTI3IGMwIDAwIDAxIAljYmVmLGEgICAxNDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNzA+CisJCQkxNDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVjMAorIDE0NDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxNDg6CTA5IGMwIDAwIDAxIAljYnIgIDE0YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3OD4KKwkJCTE0ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWI4CisgMTRjOgkwMSAwMCAwMCAwMCAJbm9wIAorIDE1MDoJMjkgYzAgMDAgMDEgCWNicixhICAgMTU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTgwPgorCQkJMTUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjAKKyAxNTQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMTU4OgkwYiBjMCAwMCAwMSAJY2JlciAgMTVjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTg4PgorCQkJMTU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTgKKyAxNWM6CTAxIDAwIDAwIDAwIAlub3AgCisgMTYwOgkyYiBjMCAwMCAwMSAJY2JlcixhICAgMTY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTkwPgorCQkJMTYwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYTAKKyAxNjQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMTY4OgkwZCBjMCAwMCAwMSAJY2JmciAgMTZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTk4PgorCQkJMTY4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTgKKyAxNmM6CTAxIDAwIDAwIDAwIAlub3AgCisgMTcwOgkyZCBjMCAwMCAwMSAJY2JmcixhICAgMTc0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWEwPgorCQkJMTcwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlOTAKKyAxNzQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMTc4OgkwZiBjMCAwMCAwMSAJY2JlZnIgIDE3YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClhOD4KKwkJCTE3ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTg4CisgMTdjOgkwMSAwMCAwMCAwMCAJbm9wIAorIDE4MDoJMmYgYzAgMDAgMDEgCWNiZWZyLGEgICAxODQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYjA+CisJCQkxODA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU4MAorIDE4NDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxODg6CTExIGMwIDAwIDAxIAljYmEgIDE4YyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliOD4KKwkJCTE4ODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTc4CisgMThjOgkwMSAwMCAwMCAwMCAJbm9wIAorIDE5MDoJMzEgYzAgMDAgMDEgCWNiYSxhICAgMTk0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWMwPgorCQkJMTkwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzAKKyAxOTQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMTk4OgkxMyBjMCAwMCAwMSAJY2JuZSAgMTljIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWM4PgorCQkJMTk4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjgKKyAxOWM6CTAxIDAwIDAwIDAwIAlub3AgCisgMWEwOgkzMyBjMCAwMCAwMSAJY2JuZSxhICAgMWE0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQwPgorCQkJMWEwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNjAKKyAxYTQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMWE4OgkxNSBjMCAwMCAwMSAJY2JuZiAgMWFjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWQ4PgorCQkJMWE4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTgKKyAxYWM6CTAxIDAwIDAwIDAwIAlub3AgCisgMWIwOgkzNSBjMCAwMCAwMSAJY2JuZixhICAgMWI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWUwPgorCQkJMWIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNTAKKyAxYjQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMWI4OgkxNyBjMCAwMCAwMSAJY2JuZWYgIDFiYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCllOD4KKwkJCTFiODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQ4CisgMWJjOgkwMSAwMCAwMCAwMCAJbm9wIAorIDFjMDoJMzcgYzAgMDAgMDEgCWNibmVmLGEgICAxYzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjA+CisJCQkxYzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU0MAorIDFjNDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxYzg6CTE5IGMwIDAwIDAxIAljYm5yICAxY2MgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZjg+CisJCQkxYzg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzOAorIDFjYzoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxZDA6CTM5IGMwIDAwIDAxIAljYm5yLGEgICAxZDQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTAwPgorCQkJMWQwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMzAKKyAxZDQ6CTAxIDAwIDAwIDAwIAlub3AgCisgMWQ4OgkxYiBjMCAwMCAwMSAJY2JuZXIgIDFkYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDg+CisJCQkxZDg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUyOAorIDFkYzoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxZTA6CTNiIGMwIDAwIDAxIAljYm5lcixhICAgMWU0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTExMD4KKwkJCTFlMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTIwCisgMWU0OgkwMSAwMCAwMCAwMCAJbm9wIAorIDFlODoJMWQgYzAgMDAgMDEgCWNibmZyICAxZWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTE4PgorCQkJMWU4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMTgKKyAxZWM6CTAxIDAwIDAwIDAwIAlub3AgCisgMWYwOgkzZCBjMCAwMCAwMSAJY2JuZnIsYSAgIDFmNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjA+CisJCQkxZjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxMAorIDFmNDoJMDEgMDAgMDAgMDAgCW5vcCAKKyAxZjg6CTFmIGMwIDAwIDAxIAljYm5lZnIgIDFmYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMjg+CisJCQkxZjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwOAorIDFmYzoJMDEgMDAgMDAgMDAgCW5vcCAKKyAyMDA6CTNmIGMwIDAwIDAxIAljYm5lZnIsYSAgIDIwNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMzA+CisJCQkyMDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUwMAorIDIwNDoJMDEgMDAgMDAgMDAgCW5vcCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmQ1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5zCkBAIC0wLDAgKzEsMjExIEBACisJLnRleHQKKwkuZ2xvYmFsIHN0YXJ0CisKKyEJU3RhcnRpbmcgcG9pbnQKK3N0YXJ0OgorCishCXRlc3QgYWxsIEFTUnMKKworCXJkCSVhc3IwLCAlbDAKKwlyZAklYXNyMSwgJWwwCisJcmQJJWFzcjE1LCAlbDAKKwlyZAklYXNyMTcsICVsMAorCXJkCSVhc3IxOCwgJWwwCisJcmQJJWFzcjE5LCAlbDAJISBzaG91bGQgc3RvcCB0aGUgcHJvY2Vzc29yCisJcmQJJWFzcjIwLCAlbDAKKwlyZAklYXNyMjEsICVsMAorCXJkCSVhc3IyMiwgJWwwCisKKwl3cgklbDAsIDAsICVhc3IwCisJd3IJJWwwLCAwLCAlYXNyMQorCXdyCSVsMCwgMCwgJWFzcjE1CisJd3IJJWwwLCAwLCAlYXNyMTcKKwl3cgklbDAsIDAsICVhc3IxOAorCXdyCSVsMCwgMCwgJWFzcjE5CisJd3IJJWwwLCAwLCAlYXNyMjAKKwl3cgklbDAsIDAsICVhc3IyMQorCXdyCSVsMCwgMCwgJWFzcjIyCisKKyEJdGVzdCBVTVVMIHdpdGggbm8gb3ZlcmZsb3cgaW5zaWRlIFkKK3Rlc3RfdW11bDoKKwl1bXVsCSVnMSwgJWcyLCAlZzMKKworIQl0ZXN0IFVNVUwgd2l0aCBhbiBvdmVyZmxvdyBpbnNpZGUgWQorCisJdW11bAklZzEsICVnMiwgJWczCSEgJWczIG11c3QgYmUgZXF1YWwgdG8gMAorCishCXRlc3QgU01VTCB3aXRoIG5lZ2F0aXZlIHJlc3VsdAordGVzdF9zbXVsOgorCXNtdWwJJWcxLCAlZzIsICVnMworCishCXRlc3QgU01VTCB3aXRoIHBvc2l0aXZlIHJlc3VsdAorCisJc211bAklZzEsICVnMiwgJWczCisKKyEJdGVzdCBTVEJBUjogdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzeW50YXhlcwordGVzdF9zdGJhcjoKKwlzdGJhcgkJCSEgaXMgYSB2YWxpZCBWOCBzeW50YXgsIGF0IGxlYXN0IGEgc3ludGhldGljCisJCQkJISBpbnN0cnVjdGlvbgorCXJkCSVhc3IxNSwgJWcwCSEgb3RoZXIgc29sdXRpb24KKworIQl0ZXN0IFVOSU1QCisJdW5pbXAJMQorCishCXRlc3QgRkxVU0gKKwlmbHVzaAklbDEJCSEgaXMgdGhlIG9mZmljaWFsIFY4IHN5bnRheAorCishCXRlc3QgU0NBTjogZmluZCBmaXJzdCAwCit0ZXN0X3NjYW46CisJc2NhbgklbDEsIDB4ZmZmZmZmZmYsICVsMworCishCXRlc3Qgc2NhbjogZmluZCBmaXJzdCAxCisKKwlzY2FuCSVsMSwgMCwgJWwzCisKKyEJdGVzdCBzY2FuOiBmaW5kIGZpcnN0IGJpdCAhPSBiaXQtMAorCisJc2NhbgklbDEsICVsMSwgJWwzCisKKyEJdGVzdCBTSFVGRkxFCit0ZXN0X3NodWZmbGU6CisJc2h1ZmZsZQklbDAsIDB4MSwgJWwxCisJc2h1ZmZsZQklbDAsIDB4MiwgJWwxCisJc2h1ZmZsZQklbDAsIDB4NCwgJWwxCisJc2h1ZmZsZQklbDAsIDB4OCwgJWwxCisJc2h1ZmZsZQklbDAsIDB4MTAsICVsMQorCXNodWZmbGUJJWwwLCAweDE4LCAlbDEKKworIQl0ZXN0IFVNQUMKK3Rlc3RfdW1hYzoKKwl1bWFjCSVsMSwgJWwyLCAlbDAKKwl1bWFjCSVsMSwgMiwgJWwwCisJdW1hYwkyLCAlbDEsICVsMAorCishCXRlc3QgVU1BQ0QKK3Rlc3RfdW1hY2Q6CisJdW1hY2QJJWwyLCAlbDQsICVsMAorCXVtYWNkCSVsMiwgMywgJWwwCisJdW1hY2QJMywgJWwyLCAlbDAKKworIQl0ZXN0IFNNQUMKK3Rlc3Rfc21hYzoKKwlzbWFjCSVsMSwgJWwyLCAlbDAKKwlzbWFjCSVsMSwgLTQyLCAlbDAKKwlzbWFjCS00MiwgJWwxLCAlbDAKKworIQl0ZXN0IFNNQUNECit0ZXN0X3NtYWNkOgorCXNtYWNkCSVsMiwgJWw0LCAlbDAKKwlzbWFjZAklbDIsIDEyMywgJWwwCisJc21hY2QJMTIzLCAlbDIsICVsMAorCishCXRlc3QgVU1VTEQKK3Rlc3RfdW11bGQ6CisJdW11bGQJJW8yLCAlbzQsICVvMAorCXVtdWxkCSVvMiwgMHgyMzQsICVvMAorCXVtdWxkCTB4NTY3LCAlbzIsICVvMAorCishCXRlc3QgU01VTEQKK3Rlc3Rfc211bGQ6CisJc211bGQJJWkyLCAlaTQsICVpMAorCXNtdWxkCSVpMiwgLTQwOTYsICVpMAorCXNtdWxkCTQwOTUsICVpNCwgJWkwCisKKyEJQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCit0ZXN0X2NvcHJvY2Vzc29yOgorIQklY2NzcglpcyByZWdpc3RlciAjIDAKKyEJJWNjZnIJaXMgcmVnaXN0ZXIgIyAxCishCSVjY3ByCWlzIHJlZ2lzdGVyICMgMworIQklY2NjcmNyIGlzIHJlZ2lzdGVyICMgMgorCishCXRlc3QgQ1BVU0g6IGp1c3Qgc3ludGF4CisKKwljcHVzaAklbDAsICVsMQorCWNwdXNoCSVsMCwgMQorCWNwdXNoYQklbDAsICVsMQorCWNwdXNoYQklbDAsIDEKKworIQl0ZXN0IENQVUxMOiBqdXN0IHN5bnRheAorCisJY3B1bGwJJWwwCisKKyEJdGVzdCBDUFJEQ1hUOiBqdXN0IHN5bnRheAorCisJY3JkY3h0CSVjY3NyLCAlbDAKKwljcmRjeHQJJWNjZnIsICVsMAorCWNyZGN4dAklY2NwciwgJWwwCisJY3JkY3h0CSVjY2NyY3IsICVsMAorCishCXRlc3QgQ1BXUkNYVDoganVzdCBzeW50YXgKKworCWN3cmN4dAklbDAsICVjY3NyCisJY3dyY3h0CSVsMCwgJWNjZnIKKwljd3JjeHQJJWwwLCAlY2NwcgorCWN3cmN4dAklbDAsICVjY2NyY3IKKworIQl0ZXN0IENCY2NjOiBqdXN0IHN5bnRheAorCisJY2JuCXN0b3AKKwlub3AKKwljYm4sYQlzdG9wCisJbm9wCisJY2JlCXN0b3AKKwlub3AKKwljYmUsYQlzdG9wCisJbm9wCisJY2JmCXN0b3AKKwlub3AKKwljYmYsYQlzdG9wCisJbm9wCisJY2JlZglzdG9wCisJbm9wCisJY2JlZixhCXN0b3AKKwlub3AKKwljYnIJc3RvcAorCW5vcAorCWNicixhCXN0b3AKKwlub3AKKwljYmVyCXN0b3AKKwlub3AKKwljYmVyLGEJc3RvcAorCW5vcAorCWNiZnIJc3RvcAorCW5vcAorCWNiZnIsYQlzdG9wCisJbm9wCisJY2JlZnIJc3RvcAorCW5vcAorCWNiZWZyLGEJc3RvcAorCW5vcAorCWNiYQlzdG9wCisJbm9wCisJY2JhLGEJc3RvcAorCW5vcAorCWNibmUJc3RvcAorCW5vcAorCWNibmUsYQlzdG9wCisJbm9wCisJY2JuZglzdG9wCisJbm9wCisJY2JuZixhCXN0b3AKKwlub3AKKwljYm5lZglzdG9wCisJbm9wCisJY2JuZWYsYQlzdG9wCisJbm9wCisJY2JucglzdG9wCisJbm9wCisJY2JucixhCXN0b3AKKwlub3AKKwljYm5lcglzdG9wCisJbm9wCisJY2JuZXIsYQlzdG9wCisJbm9wCisJY2JuZnIJc3RvcAorCW5vcAorCWNibmZyLGEJc3RvcAorCW5vcAorCWNibmVmcglzdG9wCisJbm9wCisJY2JuZWZyLGEJc3RvcAorCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyMjJjNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKQEAgLTAsMCArMSwxMSBAQAorI2FzOiAtQXY3Cisjb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcworI25hbWU6IHNwYXJjIHN5bnRoCisKKy4qOiArZmlsZSBmb3JtYXQgLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKzArMDAwMCA8Zm9vPiB4bm9yICAlZzEsICVnMCwgJWcyCiswKzAwMDQgPGZvb1wrKDB4fCk0PiB4bm9yICAlZzEsICVnMCwgJWcxCiswKzAwMDggPGZvb1wrKDB4fCk4PiBuZWcgICVnMSwgJWcyCiswKzAwMGMgPGZvb1wrKDB4fCljPiBuZWcgICVnMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwNjYyOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLnMKQEAgLTAsMCArMSw3IEBACisjIGNvbW1vbiAodjggb3IgdjkpIHN5bnRoZXRpYyBpbnNucworCS50ZXh0Citmb286CisJbm90ICVnMSwlZzIKKwlub3QgJWcxCisJbmVnICVnMSwlZzIKKwluZWcgJWcxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5ZGFiNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQuZApAQCAtMCwwICsxLDE5IEBACisjYXM6IC1BdjkKKyNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCisjbmFtZTogc3BhcmM2NCBzeW50aDY0CisKKy4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CiswKzAwMDAgPGZvby0oMHh8KTQ+IGlwcmVmZXRjaCAgMCswMDA0IDxmb28+CiswKzAwMDQgPGZvbz4gc2lnbnggICVnMSwgJWcyCiswKzAwMDggPGZvb1wrKDB4fCk0PiBjbHJ1dyAgJWcxLCAlZzIKKzArMDAwYyA8Zm9vXCsoMHh8KTg+IGNhcyAgXFsgJWcxIFxdLCAlZzIsICVnMworMCswMDEwIDxmb29cKygweHwpYz4gY2FzbCAgXFsgJWcxIFxdLCAlZzIsICVnMworMCswMDE0IDxmb29cKygweHwpMTA+IGNhc3ggIFxbICVnMSBcXSwgJWcyLCAlZzMKKzArMDAxOCA8Zm9vXCsoMHh8KTE0PiBjYXN4bCAgXFsgJWcxIFxdLCAlZzIsICVnMworMCswMDFjIDxmb29cKygweHwpMTg+IGNscnggIFxbICVnMSBcKyAlZzIgXF0KKzArMDAyMCA8Zm9vXCsoMHh8KTFjPiBjbHJ4ICBcWyAlZzEgXF0KKzArMDAyNCA8Zm9vXCsoMHh8KTIwPiBjbHJ4ICBcWyAlZzEgXCsgMSBcXQorMCswMDI4IDxmb29cKygweHwpMjQ+IGNscnggIFxbICVnMSBcKyAweDJhIFxdCiswKzAwMmMgPGZvb1wrKDB4fCkyOD4gY2xyeCAgXFsgMHg0MiBcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWYzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LnMKQEAgLTAsMCArMSwxNiBAQAorIyBzcGFyYzY0IHN5bnRoZXRpYyBpbnNucworCS50ZXh0CisJaXByZWZldGNoIGZvbworZm9vOgorCXNpZ254ICVnMSwlZzIKKwljbHJ1dyAlZzEsJWcyCisJY2FzIFslZzFdLCVnMiwlZzMKKwljYXNsIFslZzFdLCVnMiwlZzMKKwljYXN4IFslZzFdLCVnMiwlZzMKKwljYXN4bCBbJWcxXSwlZzIsJWczCisKKwljbHJ4IFslZzErJWcyXQorCWNscnggWyVnMV0KKwljbHJ4IFslZzErMV0KKwljbHJ4IFs0MislZzFdCisJY2xyeCBbMHg0Ml0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzVkY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5kCkBAIC0wLDAgKzEsMjQgQEAKKyNhczogLUF2OQorI29iamR1bXA6IC1kcgorI25hbWU6IHNwYXJjNjQgd3JwcgorCisuKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswKyA8LnRleHQ+OgorICAgMDoJODEgOTAgNDAgMDAgCXdycHIgICVnMSwgJXRwYworICAgNDoJODMgOTAgODAgMDAgCXdycHIgICVnMiwgJXRucGMKKyAgIDg6CTg1IDkwIGMwIDAwIAl3cnByICAlZzMsICV0c3RhdGUKKyAgIGM6CTg3IDkxIDAwIDAwIAl3cnByICAlZzQsICV0dAorICAxMDoJODkgOTEgNDAgMDAgCXdycHIgICVnNSwgJXRpY2sKKyAgMTQ6CThiIDkxIDgwIDAwIAl3cnByICAlZzYsICV0YmEKKyAgMTg6CThkIDkxIGMwIDAwIAl3cnByICAlZzcsICVwc3RhdGUKKyAgMWM6CThmIDkyIDAwIDAwIAl3cnByICAlbzAsICV0bAorICAyMDoJOTEgOTIgNDAgMDAgCXdycHIgICVvMSwgJXBpbAorICAyNDoJOTMgOTIgODAgMDAgCXdycHIgICVvMiwgJWN3cAorICAyODoJOTUgOTIgYzAgMDAgCXdycHIgICVvMywgJWNhbnNhdmUKKyAgMmM6CTk3IDkzIDAwIDAwIAl3cnByICAlbzQsICVjYW5yZXN0b3JlCisgIDMwOgk5OSA5MyA0MCAwMCAJd3JwciAgJW81LCAlY2xlYW53aW4KKyAgMzQ6CTliIDkzIDgwIDAwIAl3cnByICAlc3AsICVvdGhlcndpbgorICAzODoJOWQgOTMgYzAgMDAgCXdycHIgICVvNywgJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLnMKQEAgLTAsMCArMSwxNyBAQAorIyBUZXN0IHdycHIKKwkudGV4dAorCXdycHIgJWcxLCV0cGMKKwl3cnByICVnMiwldG5wYworCXdycHIgJWczLCV0c3RhdGUKKwl3cnByICVnNCwldHQKKwl3cnByICVnNSwldGljaworCXdycHIgJWc2LCV0YmEKKwl3cnByICVnNywlcHN0YXRlCisJd3JwciAlbzAsJXRsCisJd3JwciAlbzEsJXBpbAorCXdycHIgJW8yLCVjd3AKKwl3cnByICVvMywlY2Fuc2F2ZQorCXdycHIgJW80LCVjYW5yZXN0b3JlCisJd3JwciAlbzUsJWNsZWFud2luCisJd3JwciAlbzYsJW90aGVyd2luCisJd3JwciAlbzcsJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmZjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKQEAgLTAsMCArMSwxMyBAQAorI29iamR1bXA6IC1yCisjIG5hbWUgOiBhZGRlbmRzCisuKjogK2ZpbGUgZm9ybWF0IGEub3V0LXN1bm9zLWJpZworCitSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKK09GRlNFVCAgIFRZUEUgK1ZBTFVFIAorMCswOCBXRElTUDIyICtmb28xXCsweGYrZmMKKzArMGMgV0RJU1AyMiArZm9vMVwrMHhmK2Y4CiswKzEwIFdESVNQMjIgK2ZvbzFcKzB4ZitmMAorMCsxNCBXRElTUDIyICtmb28xXCsweGYrZWMKKzArMWMgMzIgK2ZvbzEKKzArMjAgMzIgK2ZvbzFcKzB4MCs0CisjMCsyMCAzMiArZm9vMVwrMHgwKzQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdiNDZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwCkBAIC0wLDAgKzEsNyBAQAorIworIyBTdW5PUzQgb24gU1BBUkMgdGVzdHMKKyMKKworaWYgW2lzdGFyZ2V0IHNwYXJjLSotc3Vub3M0Kl0gdGhlbiB7CisgICAgcnVuX2R1bXBfdGVzdCAiYWRkZW5kIgorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYjEwOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLnMKQEAgLTAsMCArMSwxMSBAQAorCS5nbG9iYWwgZm9vCitmb286CisJbm9wCisJbm9wCisJYmEgZm9vMSsweDQKKwliYSBmb28xKzB4NAorCWJhIGZvbzEKKwliYSBmb28xCisJbm9wCisJLndvcmQgZm9vMQorCS53b3JkIGZvbzErNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUgYi9nYXMvdGVzdHN1aXRlL2dhcy90ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRkNzllCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUKQEAgLTAsMCArMSw5NiBAQAorIworIyBUaGlzIGlzIHNvcnQgb2YgYSBwcm90b3R5cGUgdGVzdCBjYXNlLCB3aGljaCBwYXJzZXMgdGhlIGxpc3Rpbmcgb3V0cHV0CisjIGZyb20gdGhlIGFzc2VtYmxlci4gIExhdGVyLCBtb3JlIHByb3RvdHlwZXMgc2hvdWxkIGJlIGFkZGVkIGZvciBjYXNlcworIyB3aGVyZSBvYmpkdW1wIGdldHMgcnVuIG92ZXIgdGhlIC5vIGZpbGUsIGFuZCBhbnl0aGluZyBlbHNlIGxpa2UgdGhhdC4uLgorIworIyBXaGVuIHlvdSB3cml0ZSBhIHRlc3QgY2FzZSB0aGF0IHVzZXMgdGhlIGxpc3Rpbmcgb3V0cHV0LCBqdXN0IGNvcHkgdGhpcworIyBmaWxlICh0cmltbWluZyBkb3duIHRoZSBvdmVybHktdmVyYm9zZSBjb21tZW50cyBhIGxpdHRsZSksIGFuZAorIyBhZGp1c3QgaXQgdG8gZG8gd2hhdCB5b3UgbmVlZC4KKyMKKyMgUmVtZW1iZXIgdGhhdCBhbnkgIi5leHAiIGZpbGUgZm91bmQgaW4gdGhlIHRyZWUgd2lsbCBiZSBwcm9jZXNzZWQgYnkKKyMgZGVqYWdudS4KKworIworIyBGSVJTVCBTQU1QTEUgVEVTVCBDQVNFCisjCisKK3Byb2MgZG9fZm9vIHt9IHsKKyMgVGhpcyBzdHJpbmcgaXMgdXNlZCBiZWxvdyB3aGVuIHByaW50aW5nIG91dCBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBtZXNzYWdlLgorIyBJZiBtb3JlIHRoYW4gb25lIHRlc3QgaXMgcnVuIGJ5IGEgZ2l2ZW4gLmV4cCBmaWxlLCBpdCdkIGJlIG5pY2UgdG8gaW5jbHVkZQorIyB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4KKyAgICBzZXQgdGVzdG5hbWUgImZvby5zOiBtdWx0aS1yZWdpc3RlciB0d2Vha2luZyBhbmQgZnJvYm5pY2F0aW9uIgorCisjIEkgdXNlIHRoaXMgYXMgYSBmbGFnIHRvIHJlY29yZCB3aGV0aGVyIHRoZSB0ZXN0IGNhc2UgcGFzc2VkLiAgSWYgdGhpcworIyBmbGFnIGlzIHN0aWxsIGNsZWFyIHdoZW4gRU9GIGlzIHJlYWNoZWQsIHRoaXMgdGVzdCBmYWlscy4gIElmIHRoZXJlIGFyZQorIyB0d28gb3IgbW9yZSBwYXR0ZXJucywgYW5kIEkgbmVlZCB0byBzZWUgYWxsIG9mIHRoZW0sIEknbGwgY3JlYXRlIE4gdmFyaWFibGVzCisjIGFuZCBjaGVjayBpZiB0aGUgc3VtIGlzIE4uCisgICAgc2V0IHggMAorCisjIENhbGwgZ2FzX3N0YXJ0IHdpdGggdHdvIGFyZ3VtZW50czogVGhlIGlucHV0IGZpbGUgbmFtZSAod2hpY2ggaXQnbGwgc2VhcmNoCisjIGZvciBpbiAkc3JjZGlyLyRzdWJkaXIsIHRoYXQgaXMsIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHdoZXJlIHRoZSAuZXhwIGZpbGUKKyMgaXMpLCBhbmQgYSAocG9zc2libHkgZW1wdHkpIHN0cmluZyBvZiBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGFzc2VtYmxlci4KKyAgICBnYXNfc3RhcnQgImZvby5zIiAiLWFsIgorCisjIE5vdyBJIGp1c3QgaXRlcmF0ZSBvdmVyIGFsbCB0aGUgb3V0cHV0IGxpbmVzLCBsb29raW5nIGZvciB3aGF0IEkgd2FudAorIyB0byBzZWUuICBTaW5jZSBlYWNoIHBhdHRlcm4gZXhwbGljaXRseSB3aWxsIG5vdCBzcGFuIGxpbmUgYnJlYWtzLCB0aGVyZSdzCisjIGFsc28gYSBwYXR0ZXJuIGZvciBsaW5lcyB0aGF0IGRvbid0IG1hdGNoIGFueXRoaW5nIGVsc2UuICAgKElzIGl0IHNhZmUgdG8KKyMgdXNlICIuKiIgZm9yIHBhdHRlcm5zIG5vdCBjcm9zc2luZyBsaW5lIGJyZWFrcz8gSSBkb24ndCB0aGluayAiJCIgZG9lcyB0aGUKKyMgcmlnaHQgdGhpbmcgZm9yIHRoYXQsIGluIGFueSBjYXNlLiAgSSBzaG91bGQgY2hlY2sgaW50byB3aGV0aGVyIHRoZSBleHRyYQorIyBwYXR0ZXJuIGlzIGV2ZW4gbmVlZGVkLgorCisjIEFwcGFyZW50bHkgQ1JMRiBpcyByZWNlaXZlZCB3aGVuIHVzaW5nIHB0eXMgZm9yIHN1YnByb2Nlc3NlczsgaGVuY2UgdGhlCisjIFxyXG4gZm9yIG1hdGNoaW5nIGxpbmUgbnVtYmVyIDMuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSB1c2UgInsgLi4uIH0iIGZvciB0aGUgZXhwZWN0IGNsYXVzZSwgeW91IGNhbid0IGhhdmUKKyMgY29tbWVudHMgaW5zaWRlIGl0LgorCisjIFRoaXMgdGVzdCBjYXNlIGlzIGtpbmRhIGJvZ3VzIGluIHRoYXQgc2VlaW5nIGVpdGhlciBhIHdvcmQgb2YgYWxsIHplcm9zCisjIGF0IGFkZHJlc3MgemVybyBvciBhIEMtc3R5bGUgY29tbWVudCBvbiBsaW5lIHRocmVlIHRoYXQgc2F5cyAiTG9va2luZyBmb3IKKyMgQyBjb21tZW50cyIgKHdpdGggdmVyeSBzcGVjaWZpYyBwdW5jdHVhdGlvbiBhbmQgd2hpdGVzcGFjZSkgd2lsbCBjYXVzZQorIyBpdCB0byBwYXNzIHRoaXMgdGVzdC4gIFVzdWFsbHkgCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDAwMDAwXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9CisJICAgIC1yZSAiXiArM1xbIFx0XF0rLy4gTG9va2luZyBmb3IgQyBjb21tZW50cy4gLi9cclxuIgl7IHNldCB4IDEgfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKyMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdCBpc24ndAorIyBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgJHggdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworIyBOb3cgYWN0dWFsbHkgcnVuIHRoZSB0ZXN0LiAgSXQgY2FuIGJlIGNvbmRpdGlvbmFsaXplZCBpZiB0aGUgdGVzdCBpcworIyBub3QgYXBwcm9wcmlhdGUgZm9yIGFsbCB0YXJnZXRzLiAgVGhlIHByb2MgImlzdGFyZ2V0IiBjaGVja3MgYSBnZW5lcmFsaXplZAorIyBmb3JtIG9mIHRoZSB0YXJnZXQgbmFtZSwgc28gdGhhdCAoZS5nLikgIm02ODMzMi11bmtub3duLWFvdXQiIHdvdWxkIG1hdGNoCisjIGhlcmUuICBTbyBmYXIsIEkgdGhpbmsgb25seSB0aGUgQ1BVIG5hbWUgaXMgYWN0dWFsbHkgZXZlciBhbHRlcmVkLgoraWYgW2lzdGFyZ2V0IG02OGstKl0gdGhlbiB7CisgICAgZG9fZm9vCit9CisKKworCisKKyMKKyMgU0VDT05EIFNBTVBMRSBURVNUIENBU0UKKyMKKworIyBUaGlzIGlzIGEgdGlueSBiaXQgbGlrZSB0aGUgQyBjb21waWxlciB0b3J0dXJlIHRlc3RzLCBpbiB0aGF0IGl0J2xsIHJ1bgorIyB0aGUgYXNzZW1ibGVyIHdpdGggdGhlIHBvd2VyIHNldCBvZiB0aGUgbGlzdCBvZiBvcHRpb25zIHN1cHBsaWVkLgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIHRlc3QgZmlsZSBuYW1lOyB0aGUgc2Vjb25kIGlzIGFyZ3VtZW50cyB0aGF0CisjIGFyZSBhbHdheXMgdG8gYmUgcHJvdmlkZWQ7IHRoZSB0aGlyZCBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIG9wdGlvbnMKKyMgd2hpY2ggYXJlIG9wdGlvbmFsIChlbmRpbmcgaW4gIj4iIGlmIG91dHB1dCBzaG91bGQgYmUgaWdub3JlZCwgbGlrZSAiLWE+Iik7CisjIHRoZSBmb3VydGggaXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QuICBTbyBmYXIsIG9ubHkgYmluYXJ5IG9wdGlvbnMgYXJlIGhhbmRsZWQKKyMgdGhpcyB3YXk7IE4td2F5IG9wdGlvbnMgKGxpa2UgQ1BVIHR5cGUgZm9yIG02OGspIGFyZW4ndCBoYW5kbGVkIHlldC4KKyMKKyMgVGhlIHZhcmlhYmxlICRzdGRvcHRsaXN0IHVzdWFsbHkgaGFzIGEgcmVhc29uYWJsZSBzZXQgb2Ygb3B0aW9uYWwgb3B0aW9ucworIyBmb3IgdGhpcyB0YXJnZXQuCisKKyMgTm8sIFBJQyBpc24ndCBzdXBwb3J0ZWQgeWV0LiAgVGhpcyBpcyBvbmx5IGFuIGV4YW1wbGUuCitnYXNfdGVzdCAicXV1eC5zIiAiLUsiICRzdGRvcHRsaXN0ICJ1c2Ugb2YgcXV1eGVzIGluIFBJQyBtb2RlIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVjNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmQKQEAgLTAsMCArMSwyMiBAQAorI29iamR1bXA6IC1kCisjbmFtZTogVEljODAgc2lnbmVkIGFuZCB1bnNpZ25lZCBhZGQgaW5zdHJ1Y3Rpb25zCisKKy4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzAwMDAwMDAwIDwudGV4dD46CisgICAwOgkwYSAwMCBmYiA2Mi4qCisgICA0OglmZiAzZiBhYyAyMC4qCisgICA4OgkwMCA0MCAyYyAyMS4qCisgICBjOgkwMCAxMCA3YiAzMSAwMCA0MCAwMCAwMC4qCisgIDE0OgkwMCAxMCBmYiA0MSBmZiBiZiBmZiBmZi4qCisgIDFjOgkwMCAxMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCisgIDI0OgkwMCAxMCAzYiA2YiAwMCAwMCAwMCA4MC4qCisgIDJjOgkwYSAyMCBmYiA2Mi4qCisgIDMwOglmZiBiZiBhYyAyMC4qCisgIDM0OgkwMCBjMCAyYyAyMS4qCisgIDM4OgkwMCAzMCA3YiAzMSAwMCA0MCAwMCAwMC4qCisgIDQwOgkwMCAzMCBmYiA0MSBmZiBiZiBmZiBmZi4qCisgIDQ4OgkwMCAzMCBiYiA1YSBmZiBmZiBmZiA3Zi4qCisgIDUwOgkwMCAzMCAzYiA2YiAwMCAwMCAwMCA4MC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTJiMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmxzdApAQCAtMCwwICsxLDM0IEBACitNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMjA6MTM6MzMgMTk5NworQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAorCithZGQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKKworICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOyBUZXN0IHNpZ25lZCBhbmQgdW5zaWduZWQgYWRkaXRpb24gaW5zdHJ1Y3Rpb24uCisgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7IFRlc3QgYm91bmRhcnkgY29uZGl0aW9ucyB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nLgorICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOyBOb3RlIHRoYXQgdW5zaWduZWQgYWRkaXRpb24gc3RpbGwgdXNlcyBzaWduZWQgaW1tZWRpYXRlcy4KKyAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA1IDAwMDAwMDAwICAgNjJGQjAwMEEgICAgICAgICBhZGQgICAgIHIxMCxyMTEscjEyICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA2IDAwMDAwMDA0ICAgMjBBQzNGRkYgICAgICAgICBhZGQgICAgIDE2MzgzLHIyLHI0ICAgICAgICAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCisgICAgICAgIDcgMDAwMDAwMDggICAyMTJDNDAwMCAgICAgICAgIGFkZCAgICAgLTE2Mzg0LHI0LHI0ICAgICAgICAgICAgOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKKyAgICAgICAgOCAwMDAwMDAwQyAgIDMxN0IxMDAwICAgICAgICAgYWRkICAgICAxNjM4NCxyNSxyNiAgICAgICAgICAgICA7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCisgICAgICAgICAgMDAwMDAwMTAgICAwMDAwNDAwMCAKKyAgICAgICAgOSAwMDAwMDAxNCAgIDQxRkIxMDAwICAgICAgICAgYWRkICAgICAtMTYzODUscjcscjggICAgICAgICAgICA7IE1heGltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQorICAgICAgICAgIDAwMDAwMDE4ICAgRkZGRkJGRkYgCisgICAgICAgMTAgMDAwMDAwMUMgICA1QUJCMTAwMCAgICAgICAgIGFkZCAgICAgMjE0NzQ4MzY0NyxyMTAscjExICAgICAgOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQorICAgICAgICAgIDAwMDAwMDIwICAgN0ZGRkZGRkYgCisgICAgICAgMTEgMDAwMDAwMjQgICA2QjNCMTAwMCAgICAgICAgIGFkZCAgICAgLTIxNDc0ODM2NDgscjEyLHIxMyAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQorICAgICAgICAgIDAwMDAwMDI4ICAgODAwMDAwMDAgCisgICAgICAgMTIgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAxMyAwMDAwMDAyQyAgIDYyRkIyMDBBICAgICAgICAgYWRkdSAgICByMTAscjExLHIxMiAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICAxNCAwMDAwMDAzMCAgIDIwQUNCRkZGICAgICAgICAgYWRkdSAgICAxNjM4MyxyMixyNCAgICAgICAgICAgICA7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQorICAgICAgIDE1IDAwMDAwMDM0ICAgMjEyQ0MwMDAgICAgICAgICBhZGR1ICAgIC0xNjM4NCxyNCxyNCAgICAgICAgICAgIDsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCisgICAgICAgMTYgMDAwMDAwMzggICAzMTdCMzAwMCAgICAgICAgIGFkZHUgICAgMTYzODQscjUscjYgICAgICAgICAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQorICAgICAgICAgIDAwMDAwMDNDICAgMDAwMDQwMDAgCisgICAgICAgMTcgMDAwMDAwNDAgICA0MUZCMzAwMCAgICAgICAgIGFkZHUgICAgLTE2Mzg1LHI3LHI4ICAgICAgICAgICAgOyBNYXhpbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKKyAgICAgICAgICAwMDAwMDA0NCAgIEZGRkZCRkZGIAorICAgICAgIDE4IDAwMDAwMDQ4ICAgNUFCQjMwMDAgICAgICAgICBhZGR1ICAgIDIxNDc0ODM2NDcscjEwLHIxMSAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKKyAgICAgICAgICAwMDAwMDA0QyAgIDdGRkZGRkZGIAorICAgICAgIDE5IDAwMDAwMDUwICAgNkIzQjMwMDAgICAgICAgICBhZGR1ICAgIC0yMTQ3NDgzNjQ4LHIxMixyMTMgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKKyAgICAgICAgICAwMDAwMDA1NCAgIDgwMDAwMDAwIAorCisgTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyMjllZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zCkBAIC0wLDAgKzEsMTkgQEAKKzsgVGVzdCBzaWduZWQgYW5kIHVuc2lnbmVkIGFkZGl0aW9uIGluc3RydWN0aW9uLgorOyBUZXN0IGJvdW5kYXJ5IGNvbmRpdGlvbnMgdG8gZW5zdXJlIHByb3BlciBoYW5kbGluZy4KKzsgTm90ZSB0aGF0IHVuc2lnbmVkIGFkZGl0aW9uIHN0aWxsIHVzZXMgc2lnbmVkIGltbWVkaWF0ZXMuCisKKwlhZGQJcjEwLHIxMSxyMTIJCTsgUmVnaXN0ZXIgZm9ybQorCWFkZAkxNjM4MyxyMixyNAkJOyBNYXhpbXVtIHBvc2l0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKKwlhZGQJLTE2Mzg0LHI0LHI0CQk7IE1pbmltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQorCWFkZAkxNjM4NCxyNSxyNgkJOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQorCWFkZAktMTYzODUscjcscjgJCTsgTWF4aW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKKwlhZGQJMjE0NzQ4MzY0NyxyMTAscjExCTsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKKwlhZGQJLTIxNDc0ODM2NDgscjEyLHIxMwk7IE1pbmltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCisKKwlhZGR1CXIxMCxyMTEscjEyCQk7IFJlZ2lzdGVyIGZvcm0KKwlhZGR1CTE2MzgzLHIyLHI0CQk7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQorCWFkZHUJLTE2Mzg0LHI0LHI0CQk7IE1pbmltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQorCWFkZHUJMTYzODQscjUscjYJCTsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKKwlhZGR1CS0xNjM4NSxyNyxyOAkJOyBNYXhpbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQorCWFkZHUJMjE0NzQ4MzY0NyxyMTAscjExCTsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKKwlhZGR1CS0yMTQ3NDgzNjQ4LHIxMixyMTMJOyBNaW5pbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmOTYxMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmQKQEAgLTAsMCArMSwxOSBAQAorI29iamR1bXA6IC1kCisjbmFtZTogVEljODAgLmFsaWduIHBzZXVkbyBvcAorCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8LnRleHQ+OgorICAgMDoJYWIgMDAgMDAgMDAuKgorICAgNDoJY2QgMDAgZWYgMDAuKgorICAgODoJZjEgMDAgMDAgMDAuKgorICAgYzoJZWUgMDAgMDAgMDAuKgorICAxMDoJYWMgMDAgMDAgMDAuKgorICAxNDoJMDAgMDAgMDAgMDAuKgorICAxODoJYWIgMDAgMDAgMDAuKgorICAxYzoJMDAgMDAgMDAgMDAuKgorICAyMDoJZmUgMDAgMDAgMDAuKgorCVwuXC5cLgorICAzMDoJZGUgYWQgYmUgZWYuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5sc3QKQEAgLTAsMCArMSw0NyBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBUaHUgRmViIDI3IDE3OjAyOjIzIDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworYWxpZ24ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7ICAgICAgVGVzdCB0aGUgLmFsaWduIGRpcmVjdGl2ZS4KKyAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAzIDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAudGV4dAorICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMAorICAgICAgICA2IDAwMDAwMDAwICAgQUIgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUIKKyAgICAgICAgNyAwMDAwMDAwMSAgICAgICAgICAgICAgICAgICAgLmFsaWduICAgICAgICAgICAgICAgICAgOyBTaG91bGQgZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhDRDAwRUYwMAorICAgICAgIDEwIDAwMDAwMDA0ICAgQ0QgICAgICAgICAgICAgICAuYnl0ZSAgIDB4Q0QKKyAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduICAyICAgICAgICAgICAgICAgOyAgU2hvdWxkIGFsaWduIHRvIHRoZSBuZXh0IDItYnl0ZSBib3VuZGFyeSAocGFkIHdpdGggb25lIG51bGwgYnl0CisgICAgICAgMTIgMDAwMDAwMDYgICBFRiAgICAgICAgICAgICAgIC5ieXRlICAgMHhFRgorICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDEKKyAgICAgICAxNCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEYxMDAwMDAwCisgICAgICAgMTYgMDAwMDAwMDcgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgNCAgICAgICAgICAgICAgIDsgIFNob3VsZCBub3QgYWZmZWN0IGFsaWdubWVudCAoYWxyZWFkeSBvbiA0KQorICAgICAgIDE3IDAwMDAwMDA4ICAgRjEgICAgICAgICAgICAgICAuYnl0ZSAgIDB4RjEKKyAgICAgICAxOCAwMDAwMDAwOSAgICAgICAgICAgICAgICAgICAgLmFsaWduICA0ICAgICAgICAgICAgICAgOyAgU2hvdWxkIGFsaWduIHRvIG5leHQgNCBieXRlIGJvdW5kYXJ5CisgICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhFRTAwMDAwMCBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBvbiA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgMjEgMDAwMDAwMEMgICBFRSAgICAgICAgICAgICAgIC5ieXRlIDB4RUUKKyAgICAgICAyMiAwMDAwMDAwRCAgICAgICAgICAgICAgICAgICAgLmFsaWduICA4CisgICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQzAwMDAwMCAweDAwMDAwMDAwCisgICAgICAgMjUgMDAwMDAwMTAgICBBQyAgICAgICAgICAgICAgIC5ieXRlICAgMHhBQworICAgICAgIDI2IDAwMDAwMDExICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDgKKyAgICAgICAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAgMHgwMDAwMDAwMCBzaW5jZSB3ZSBhcmUgYXQgOCBieXRlIGFsaWdubWVudAorICAgICAgIDI5IDAwMDAwMDE4ICAgQUIgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUIKKyAgICAgICAzMCAwMDAwMDAxOSAgICAgICAgICAgICAgICAgICAgLmFsaWduICAxNgorICAgICAgIDMxICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RkUwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAKKyAgICAgICAzMyAwMDAwMDAyMCAgIEZFICAgICAgICAgICAgICAgLmJ5dGUgICAweEZFCisgICAgICAgMzQgMDAwMDAwMjEgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMTYKKyAgICAgICAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgMzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMganVzdCBmb3JjZXMgdGhlIGRpc2Fzc2VtYmxlciB0byBub3QgcHJpbnQgLi4uIGZvciB0cmFpbGluZyBudWxscworICAgICAgIDM3IDAwMDAwMDMwICAgREUgICAgICAgICAgICAgICAuYnl0ZSAweERFLCAweEFELCAweEJFLCAweEVGCisgICAgICAgICAgMDAwMDAwMzEgICBBRCAgICAgICAKKyAgICAgICAgICAwMDAwMDAzMiAgIEJFICAgICAgIAorICAgICAgICAgIDAwMDAwMDMzICAgRUYgICAgICAgCisKKyBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjMTI1NgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKQEAgLTAsMCArMSwzNyBAQAorOzsJVGVzdCB0aGUgLmFsaWduIGRpcmVjdGl2ZS4KKworCS50ZXh0CisJCisJOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMAorCS5ieXRlCTB4QUIKKwkuYWxpZ24JCQk7IFNob3VsZCBkZWZhdWx0IHRvIDQgYnl0ZSBhbGlnbm1lbnQKKworCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4Q0QwMEVGMDAKKwkuYnl0ZQkweENECisJLmFsaWduCTIJCTsgIFNob3VsZCBhbGlnbiB0byB0aGUgbmV4dCAyLWJ5dGUgYm91bmRhcnkgKHBhZCB3aXRoIG9uZSBudWxsIGJ5dGUpCisJLmJ5dGUJMHhFRgorCS5hbGlnbgkxCisKKwk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEYxMDAwMDAwCisJLmFsaWduCTQJCTsgIFNob3VsZCBub3QgYWZmZWN0IGFsaWdubWVudCAoYWxyZWFkeSBvbiA0KQorCS5ieXRlCTB4RjEKKwkuYWxpZ24JNAkJOyAgU2hvdWxkIGFsaWduIHRvIG5leHQgNCBieXRlIGJvdW5kYXJ5CisKKwk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEVFMDAwMDAwIHNpbmNlIHdlIGFyZSBhbHJlYWR5IG9uIDQgYnl0ZSBhbGlnbm1lbnQKKwkuYnl0ZSAweEVFCisJLmFsaWduCTgKKworCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUMwMDAwMDAgMHgwMDAwMDAwMAorCS5ieXRlCTB4QUMKKwkuYWxpZ24JOAorCQorCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAgMHgwMDAwMDAwMCBzaW5jZSB3ZSBhcmUgYXQgOCBieXRlIGFsaWdubWVudAorCS5ieXRlCTB4QUIKKwkuYWxpZ24JMTYKKworCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RkUwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAKKwkuYnl0ZQkweEZFCisJLmFsaWduCTE2CisJCisJOzsgVGhpcyBqdXN0IGZvcmNlcyB0aGUgZGlzYXNzZW1ibGVyIHRvIG5vdCBwcmludCAuLi4gZm9yIHRyYWlsaW5nIG51bGxzCisJLmJ5dGUgMHhERSwgMHhBRCwgMHhCRSwgMHhFRgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FlZThiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmQKQEAgLTAsMCArMSw4MiBAQAorI29iamR1bXA6IC1kCisjbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc3ltYm9saWMgQklUTlVNIHZhbHVlcworCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8LnRleHQ+OgorICAgMDoJMGEgNDAgMzkgZmEuKgorICAgNDoJMGEgNDAgMzkgZjIuKgorICAgODoJMGEgNDAgMzkgZWEuKgorICAgYzoJMGEgNDAgMzkgZTIuKgorICAxMDoJMGEgNDAgMzkgZGEuKgorICAxNDoJMGEgNDAgMzkgZDIuKgorICAxODoJMGEgNDAgMzkgY2EuKgorICAxYzoJMGEgNDAgMzkgYzIuKgorICAyMDoJMGEgNDAgMzkgYmEuKgorICAyNDoJMGEgNDAgMzkgYjIuKgorICAyODoJMGEgNDAgMzkgYWEuKgorICAyYzoJMGEgNDAgMzkgYTIuKgorICAzMDoJMGEgNDAgMzkgOWEuKgorICAzNDoJMGEgNDAgMzkgOTIuKgorICAzODoJMGEgNDAgMzkgOGEuKgorICAzYzoJMGEgNDAgMzkgODIuKgorICA0MDoJMGEgNDAgMzkgN2EuKgorICA0NDoJMGEgNDAgMzkgNzIuKgorICA0ODoJMGEgNDAgMzkgNmEuKgorICA0YzoJMGEgNDAgMzkgNjIuKgorICA1MDoJMGEgNDAgMzkgNWEuKgorICA1NDoJMGEgNDAgMzkgNTIuKgorICA1ODoJMGEgNDAgMzkgNGEuKgorICA1YzoJMGEgNDAgMzkgNDIuKgorICA2MDoJMGEgNDAgMzkgM2EuKgorICA2NDoJMGEgNDAgMzkgMzIuKgorICA2ODoJMGEgNDAgMzkgMmEuKgorICA2YzoJMGEgNDAgMzkgMjIuKgorICA3MDoJMGEgNDAgMzkgMWEuKgorICA3NDoJMGEgNDAgMzkgMTIuKgorICA3ODoJMGEgNDAgMzkgNWEuKgorICA3YzoJMGEgNDAgMzkgNTIuKgorICA4MDoJMGEgNDAgMzkgNGEuKgorICA4NDoJMGEgNDAgMzkgNDIuKgorICA4ODoJMGEgNDAgMzkgM2EuKgorICA4YzoJMGEgNDAgMzkgMzIuKgorICA5MDoJMGEgNDAgMzkgMmEuKgorICA5NDoJMGEgNDAgMzkgMjIuKgorICA5ODoJMGEgNDAgMzkgMWEuKgorICA5YzoJMGEgNDAgMzkgMTIuKgorICBhMDoJMGEgNDAgMzkgMGEuKgorICBhNDoJMGEgNDAgMzkgMDIuKgorICBhODoJMGEgNDAgMzkgZmEuKgorICBhYzoJMGEgNDAgMzkgZjIuKgorICBiMDoJMGEgNDAgMzkgZWEuKgorICBiNDoJMGEgNDAgMzkgZTIuKgorICBiODoJMGEgNDAgMzkgZGEuKgorICBiYzoJMGEgNDAgMzkgZDIuKgorICBjMDoJMGEgNDAgMzkgY2EuKgorICBjNDoJMGEgNDAgMzkgYzIuKgorICBjODoJMGEgNDAgMzkgYmEuKgorICBjYzoJMGEgNDAgMzkgYjIuKgorICBkMDoJMGEgNDAgMzkgYWEuKgorICBkNDoJMGEgNDAgMzkgYTIuKgorICBkODoJMGEgNDAgMzkgOWEuKgorICBkYzoJMGEgNDAgMzkgOTIuKgorICBlMDoJMGEgNDAgMzkgOGEuKgorICBlNDoJMGEgNDAgMzkgODIuKgorICBlODoJMGEgNDAgMzkgN2EuKgorICBlYzoJMGEgNDAgMzkgNzIuKgorICBmMDoJMGEgNDAgMzkgNmEuKgorICBmNDoJMGEgNDAgMzkgNjIuKgorICBmODoJMGEgNDAgMzkgNWEuKgorICBmYzoJMGEgNDAgMzkgNTIuKgorIDEwMDoJMGEgNDAgMzkgNGEuKgorIDEwNDoJMGEgNDAgMzkgNDIuKgorIDEwODoJMGEgNDAgMzkgM2EuKgorIDEwYzoJMGEgNDAgMzkgMzIuKgorIDExMDoJMGEgNDAgMzkgMmEuKgorIDExNDoJMGEgNDAgMzkgMjIuKgorIDExODoJMGEgNDAgMzkgMWEuKgorIDExYzoJMGEgNDAgMzkgMTIuKgorIDEyMDoJMGEgNDAgMzkgMGEuKgorIDEyNDoJMGEgNDAgMzkgMDIuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5sc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjMjY4YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5sc3QKQEAgLTAsMCArMSw5NyBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDIxOjM3OjE1IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworYml0bnVtLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgQklUTlVNIGZpZWxkCisgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCisgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICA7OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLCBhbmQKKyAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIDs7IHRoYXQgdGhlIHJhdyBudW1lcmljIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgKHN0b3JlZCBhcworICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgOzsgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIG9wZXJhbmQgbnVtZXJpYyB2YWx1ZS4KKyAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA3IDAwMDAwMDAwICAgRkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS5iICAgICA7ICh+MCAmIDB4MUYpCisgICAgICAgIDggMDAwMDAwMDQgICBGMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmIgICAgIDsgKH4xICYgMHgxRikKKyAgICAgICAgOSAwMDAwMDAwOCAgIEVBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QuYiAgICAgOyAofjIgJiAweDFGKQorICAgICAgIDEwIDAwMDAwMDBDICAgRTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS5iICAgICA7ICh+MyAmIDB4MUYpCisgICAgICAgMTEgMDAwMDAwMTAgICBEQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmIgICAgIDsgKH40ICYgMHgxRikKKyAgICAgICAxMiAwMDAwMDAxNCAgIEQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UuYiAgICAgOyAofjUgJiAweDFGKQorICAgICAgIDEzIDAwMDAwMDE4ICAgQ0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxoaS5iICAgICA7ICh+NiAmIDB4MUYpCisgICAgICAgMTQgMDAwMDAwMUMgICBDMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxzLmIgICAgIDsgKH43ICYgMHgxRikKKyAgICAgICAxNSAwMDAwMDAyMCAgIEJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8uYiAgICAgOyAofjggJiAweDFGKQorICAgICAgIDE2IDAwMDAwMDI0ICAgQjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxocy5iICAgICA7ICh+OSAmIDB4MUYpCisgICAgICAgMTcgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAxOCAwMDAwMDAyOCAgIEFBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEuaCAgICAgOyAofjEwICYgMHgxRikKKyAgICAgICAxOSAwMDAwMDAyQyAgIEEyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbmUuaCAgICAgOyAofjExICYgMHgxRikKKyAgICAgICAyMCAwMDAwMDAzMCAgIDlBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QuaCAgICAgOyAofjEyICYgMHgxRikKKyAgICAgICAyMSAwMDAwMDAzNCAgIDkyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUuaCAgICAgOyAofjEzICYgMHgxRikKKyAgICAgICAyMiAwMDAwMDAzOCAgIDhBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHQuaCAgICAgOyAofjE0ICYgMHgxRikKKyAgICAgICAyMyAwMDAwMDAzQyAgIDgyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UuaCAgICAgOyAofjE1ICYgMHgxRikKKyAgICAgICAyNCAwMDAwMDA0MCAgIDdBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkuaCAgICAgOyAofjE2ICYgMHgxRikKKyAgICAgICAyNSAwMDAwMDA0NCAgIDcyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHMuaCAgICAgOyAofjE3ICYgMHgxRikKKyAgICAgICAyNiAwMDAwMDA0OCAgIDZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8uaCAgICAgOyAofjE4ICYgMHgxRikKKyAgICAgICAyNyAwMDAwMDA0QyAgIDYyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMuaCAgICAgOyAofjE5ICYgMHgxRikKKyAgICAgICAyOCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIDI5IDAwMDAwMDUwICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS53ICAgICA7ICh+MjAgJiAweDFGKQorICAgICAgIDMwIDAwMDAwMDU0ICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS53ICAgICA7ICh+MjEgJiAweDFGKQorICAgICAgIDMxIDAwMDAwMDU4ICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxndC53ICAgICA7ICh+MjIgJiAweDFGKQorICAgICAgIDMyIDAwMDAwMDVDICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS53ICAgICA7ICh+MjMgJiAweDFGKQorICAgICAgIDMzIDAwMDAwMDYwICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC53ICAgICA7ICh+MjQgJiAweDFGKQorICAgICAgIDM0IDAwMDAwMDY0ICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxnZS53ICAgICA7ICh+MjUgJiAweDFGKQorICAgICAgIDM1IDAwMDAwMDY4ICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxoaS53ICAgICA7ICh+MjYgJiAweDFGKQorICAgICAgIDM2IDAwMDAwMDZDICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxscy53ICAgICA7ICh+MjcgJiAweDFGKQorICAgICAgIDM3IDAwMDAwMDcwICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsby53ICAgICA7ICh+MjggJiAweDFGKQorICAgICAgIDM4IDAwMDAwMDc0ICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxocy53ICAgICA7ICh+MjkgJiAweDFGKQorICAgICAgIDM5ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgNDAgMDAwMDAwNzggICA1QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGVxLmYgICAgIDsgKH4yMCAmIDB4MUYpCisgICAgICAgNDEgMDAwMDAwN0MgICA1MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmYgICAgIDsgKH4yMSAmIDB4MUYpCisgICAgICAgNDIgMDAwMDAwODAgICA0QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmYgICAgIDsgKH4yMiAmIDB4MUYpCisgICAgICAgNDMgMDAwMDAwODQgICA0MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxlLmYgICAgIDsgKH4yMyAmIDB4MUYpCisgICAgICAgNDQgMDAwMDAwODggICAzQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmYgICAgIDsgKH4yNCAmIDB4MUYpCisgICAgICAgNDUgMDAwMDAwOEMgICAzMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmYgICAgIDsgKH4yNSAmIDB4MUYpCisgICAgICAgNDYgMDAwMDAwOTAgICAyQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG91LmYgICAgIDsgKH4yNiAmIDB4MUYpCisgICAgICAgNDcgMDAwMDAwOTQgICAyMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGluLmYgICAgIDsgKH4yNyAmIDB4MUYpCisgICAgICAgNDggMDAwMDAwOTggICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGliLmYgICAgIDsgKH4yOCAmIDB4MUYpCisgICAgICAgNDkgMDAwMDAwOUMgICAxMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG9iLmYgICAgIDsgKH4yOSAmIDB4MUYpCisgICAgICAgNTAgMDAwMDAwQTAgICAwQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LHVvLmYgICAgIDsgKH4zMCAmIDB4MUYpCisgICAgICAgNTEgMDAwMDAwQTQgICAwMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG9yLmYgICAgIDsgKH4zMSAmIDB4MUYpCisgICAgICAgNTIgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICA1MyAwMDAwMDBBOCAgIEZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMAorICAgICAgIDU0IDAwMDAwMEFDICAgRjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxCisgICAgICAgNTUgMDAwMDAwQjAgICBFQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIKKwxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMjE6Mzc6MTUgMTk5NworQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAorCitiaXRudW0ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKKworICAgICAgIDU2IDAwMDAwMEI0ICAgRTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzCisgICAgICAgNTcgMDAwMDAwQjggICBEQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDQKKyAgICAgICA1OCAwMDAwMDBCQyAgIEQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsNQorICAgICAgIDU5IDAwMDAwMEMwICAgQ0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw2CisgICAgICAgNjAgMDAwMDAwQzQgICBDMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDcKKyAgICAgICA2MSAwMDAwMDBDOCAgIEJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsOAorICAgICAgIDYyIDAwMDAwMENDICAgQjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw5CisgICAgICAgNjMgMDAwMDAwRDAgICBBQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEwCisgICAgICAgNjQgMDAwMDAwRDQgICBBMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDExCisgICAgICAgNjUgMDAwMDAwRDggICA5QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEyCisgICAgICAgNjYgMDAwMDAwREMgICA5MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEzCisgICAgICAgNjcgMDAwMDAwRTAgICA4QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE0CisgICAgICAgNjggMDAwMDAwRTQgICA4MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE1CisgICAgICAgNjkgMDAwMDAwRTggICA3QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE2CisgICAgICAgNzAgMDAwMDAwRUMgICA3MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE3CisgICAgICAgNzEgMDAwMDAwRjAgICA2QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE4CisgICAgICAgNzIgMDAwMDAwRjQgICA2MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE5CisgICAgICAgNzMgMDAwMDAwRjggICA1QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIwCisgICAgICAgNzQgMDAwMDAwRkMgICA1MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIxCisgICAgICAgNzUgMDAwMDAxMDAgICA0QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIyCisgICAgICAgNzYgMDAwMDAxMDQgICA0MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIzCisgICAgICAgNzcgMDAwMDAxMDggICAzQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI0CisgICAgICAgNzggMDAwMDAxMEMgICAzMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI1CisgICAgICAgNzkgMDAwMDAxMTAgICAyQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI2CisgICAgICAgODAgMDAwMDAxMTQgICAyMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI3CisgICAgICAgODEgMDAwMDAxMTggICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI4CisgICAgICAgODIgMDAwMDAxMUMgICAxMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI5CisgICAgICAgODMgMDAwMDAxMjAgICAwQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDMwCisgICAgICAgODQgMDAwMDAxMjQgICAwMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDMxCisgICAgICAgODUgICAgICAgICAgICAgICAgICAgICAKKworIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjZlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucwpAQCAtMCwwICsxLDg1IEBACis7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIEJJVE5VTSBmaWVsZAorOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbworOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcywgYW5kCis7OyB0aGF0IHRoZSByYXcgbnVtZXJpYyB2YWx1ZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IChzdG9yZWQgYXMKKzs7IHRoZSBvbmUncyBjb21wbGVtZW50IG9mIHRoZSBvcGVyYW5kIG51bWVyaWMgdmFsdWUuCisKKwliYm8JcjEwLHI4LGVxLmIJOyAofjAgJiAweDFGKQorCWJibwlyMTAscjgsbmUuYgk7ICh+MSAmIDB4MUYpCisJYmJvCXIxMCxyOCxndC5iCTsgKH4yICYgMHgxRikKKwliYm8JcjEwLHI4LGxlLmIJOyAofjMgJiAweDFGKQorCWJibwlyMTAscjgsbHQuYgk7ICh+NCAmIDB4MUYpCisJYmJvCXIxMCxyOCxnZS5iCTsgKH41ICYgMHgxRikKKwliYm8JcjEwLHI4LGhpLmIJOyAofjYgJiAweDFGKQorCWJibwlyMTAscjgsbHMuYgk7ICh+NyAmIDB4MUYpCisJYmJvCXIxMCxyOCxsby5iCTsgKH44ICYgMHgxRikKKwliYm8JcjEwLHI4LGhzLmIJOyAofjkgJiAweDFGKQorCisJYmJvCXIxMCxyOCxlcS5oCTsgKH4xMCAmIDB4MUYpCisJYmJvCXIxMCxyOCxuZS5oCTsgKH4xMSAmIDB4MUYpCisJYmJvCXIxMCxyOCxndC5oCTsgKH4xMiAmIDB4MUYpCisJYmJvCXIxMCxyOCxsZS5oCTsgKH4xMyAmIDB4MUYpCisJYmJvCXIxMCxyOCxsdC5oCTsgKH4xNCAmIDB4MUYpCisJYmJvCXIxMCxyOCxnZS5oCTsgKH4xNSAmIDB4MUYpCisJYmJvCXIxMCxyOCxoaS5oCTsgKH4xNiAmIDB4MUYpCisJYmJvCXIxMCxyOCxscy5oCTsgKH4xNyAmIDB4MUYpCisJYmJvCXIxMCxyOCxsby5oCTsgKH4xOCAmIDB4MUYpCisJYmJvCXIxMCxyOCxocy5oCTsgKH4xOSAmIDB4MUYpCisKKwliYm8JcjEwLHI4LGVxLncJOyAofjIwICYgMHgxRikKKwliYm8JcjEwLHI4LG5lLncJOyAofjIxICYgMHgxRikKKwliYm8JcjEwLHI4LGd0LncJOyAofjIyICYgMHgxRikKKwliYm8JcjEwLHI4LGxlLncJOyAofjIzICYgMHgxRikKKwliYm8JcjEwLHI4LGx0LncJOyAofjI0ICYgMHgxRikKKwliYm8JcjEwLHI4LGdlLncJOyAofjI1ICYgMHgxRikKKwliYm8JcjEwLHI4LGhpLncJOyAofjI2ICYgMHgxRikKKwliYm8JcjEwLHI4LGxzLncJOyAofjI3ICYgMHgxRikKKwliYm8JcjEwLHI4LGxvLncJOyAofjI4ICYgMHgxRikKKwliYm8JcjEwLHI4LGhzLncJOyAofjI5ICYgMHgxRikKKworCWJibwlyMTAscjgsZXEuZgk7ICh+MjAgJiAweDFGKQorCWJibwlyMTAscjgsbmUuZgk7ICh+MjEgJiAweDFGKQorCWJibwlyMTAscjgsZ3QuZgk7ICh+MjIgJiAweDFGKQorCWJibwlyMTAscjgsbGUuZgk7ICh+MjMgJiAweDFGKQorCWJibwlyMTAscjgsbHQuZgk7ICh+MjQgJiAweDFGKQorCWJibwlyMTAscjgsZ2UuZgk7ICh+MjUgJiAweDFGKQorCWJibwlyMTAscjgsb3UuZgk7ICh+MjYgJiAweDFGKQorCWJibwlyMTAscjgsaW4uZgk7ICh+MjcgJiAweDFGKQorCWJibwlyMTAscjgsaWIuZgk7ICh+MjggJiAweDFGKQorCWJibwlyMTAscjgsb2IuZgk7ICh+MjkgJiAweDFGKQorCWJibwlyMTAscjgsdW8uZgk7ICh+MzAgJiAweDFGKQorCWJibwlyMTAscjgsb3IuZgk7ICh+MzEgJiAweDFGKQorCisJYmJvCXIxMCxyOCwwCisJYmJvCXIxMCxyOCwxCisJYmJvCXIxMCxyOCwyCisJYmJvCXIxMCxyOCwzCisJYmJvCXIxMCxyOCw0CisJYmJvCXIxMCxyOCw1CisJYmJvCXIxMCxyOCw2CisJYmJvCXIxMCxyOCw3CisJYmJvCXIxMCxyOCw4CisJYmJvCXIxMCxyOCw5CisJYmJvCXIxMCxyOCwxMAorCWJibwlyMTAscjgsMTEKKwliYm8JcjEwLHI4LDEyCisJYmJvCXIxMCxyOCwxMworCWJibwlyMTAscjgsMTQKKwliYm8JcjEwLHI4LDE1CisJYmJvCXIxMCxyOCwxNgorCWJibwlyMTAscjgsMTcKKwliYm8JcjEwLHI4LDE4CisJYmJvCXIxMCxyOCwxOQorCWJibwlyMTAscjgsMjAKKwliYm8JcjEwLHI4LDIxCisJYmJvCXIxMCxyOCwyMgorCWJibwlyMTAscjgsMjMKKwliYm8JcjEwLHI4LDI0CisJYmJvCXIxMCxyOCwyNQorCWJibwlyMTAscjgsMjYKKwliYm8JcjEwLHI4LDI3CisJYmJvCXIxMCxyOCwyOAorCWJibwlyMTAscjgsMjkKKwliYm8JcjEwLHI4LDMwCisJYmJvCXIxMCxyOCwzMQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWEzOGFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUuZApAQCAtMCwwICsxLDMyIEBACisjb2JqZHVtcDogLWQKKyNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzeW1ib2xpYyBjb25kaXRpb24gY29kZSB2YWx1ZXMKKworLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPC50ZXh0PjoKKyAgIDA6CTA3IGEwIDc5IDAxLioKKyAgIDQ6CTA3IGEwIDc5IDA5LioKKyAgIDg6CTA3IGEwIDc5IDExLioKKyAgIGM6CTA3IGEwIDc5IDE5LioKKyAgMTA6CTA3IGEwIDc5IDIxLioKKyAgMTQ6CTA3IGEwIDc5IDI5LioKKyAgMTg6CTA3IGEwIDc5IDMxLioKKyAgMWM6CTA3IGEwIDc5IDM5LioKKyAgMjA6CTA3IGEwIDc5IDQxLioKKyAgMjQ6CTA3IGEwIDc5IDQ5LioKKyAgMjg6CTA3IGEwIDc5IDUxLioKKyAgMmM6CTA3IGEwIDc5IDU5LioKKyAgMzA6CTA3IGEwIDc5IDYxLioKKyAgMzQ6CTA3IGEwIDc5IDY5LioKKyAgMzg6CTA3IGEwIDc5IDcxLioKKyAgM2M6CTA3IGEwIDc5IDc5LioKKyAgNDA6CTA3IGEwIDc5IDgxLioKKyAgNDQ6CTA3IGEwIDc5IDg5LioKKyAgNDg6CTA3IGEwIDc5IDkxLioKKyAgNGM6CTA3IGEwIDc5IDk5LioKKyAgNTA6CTA3IGEwIDc5IGExLioKKyAgNTQ6CTA3IGEwIDc5IGE5LioKKyAgNTg6CTA3IGEwIDc5IGIxLioKKyAgNWM6CTA3IGEwIDc5IGI5LioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAzNTFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUubHN0CkBAIC0wLDAgKzEsMzcgQEAKK01WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo0OSAxOTk3CitDb3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCisKK2Njb2RlLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQorCisgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIGNvbmRpdGlvbgorICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgY29kZXMgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLgorICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgIEFsc28gdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KKyAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA1IDAwMDAwMDAwICAgMDE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5ldi5iICAgICAgICAgICAgIDsgMDAwMDAKKyAgICAgICAgNiAwMDAwMDAwNCAgIDA5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxndDAuYiAgICAgICAgICAgICA7IDAwMDAxCisgICAgICAgIDcgMDAwMDAwMDggICAxMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZXEwLmIgICAgICAgICAgICAgOyAwMDAxMAorICAgICAgICA4IDAwMDAwMDBDICAgMTk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGdlMC5iICAgICAgICAgICAgIDsgMDAwMTEKKyAgICAgICAgOSAwMDAwMDAxMCAgIDIxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsdDAuYiAgICAgICAgICAgICA7IDAwMTAwCisgICAgICAgMTAgMDAwMDAwMTQgICAyOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmUwLmIgICAgICAgICAgICAgOyAwMDEwMQorICAgICAgIDExIDAwMDAwMDE4ICAgMzE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGxlMC5iICAgICAgICAgICAgIDsgMDAxMTAKKyAgICAgICAxMiAwMDAwMDAxQyAgIDM5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxhbHcuYiAgICAgICAgICAgICA7IDAwMTExCisgICAgICAgMTMgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAxNCAwMDAwMDAyMCAgIDQxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZXYuaCAgICAgICAgICAgICA7IDAxMDAwCisgICAgICAgMTUgMDAwMDAwMjQgICA0OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ3QwLmggICAgICAgICAgICAgOyAwMTAwMQorICAgICAgIDE2IDAwMDAwMDI4ICAgNTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGVxMC5oICAgICAgICAgICAgIDsgMDEwMTAKKyAgICAgICAxNyAwMDAwMDAyQyAgIDU5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxnZTAuaCAgICAgICAgICAgICA7IDAxMDExCisgICAgICAgMTggMDAwMDAwMzAgICA2MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbHQwLmggICAgICAgICAgICAgOyAwMTEwMAorICAgICAgIDE5IDAwMDAwMDM0ICAgNjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5lMC5oICAgICAgICAgICAgIDsgMDExMDEKKyAgICAgICAyMCAwMDAwMDAzOCAgIDcxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsZTAuaCAgICAgICAgICAgICA7IDAxMTEwCisgICAgICAgMjEgMDAwMDAwM0MgICA3OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsYWx3LmggICAgICAgICAgICAgOyAwMTExMQorICAgICAgIDIyICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgMjMgMDAwMDAwNDAgICA4MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmV2LncgICAgICAgICAgICAgOyAxMDAwMAorICAgICAgIDI0IDAwMDAwMDQ0ICAgODk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGd0MC53ICAgICAgICAgICAgIDsgMTAwMDEKKyAgICAgICAyNSAwMDAwMDA0OCAgIDkxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxlcTAudyAgICAgICAgICAgICA7IDEwMDEwCisgICAgICAgMjYgMDAwMDAwNEMgICA5OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ2UwLncgICAgICAgICAgICAgOyAxMDAxMQorICAgICAgIDI3IDAwMDAwMDUwICAgQTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGx0MC53ICAgICAgICAgICAgIDsgMTAxMDAKKyAgICAgICAyOCAwMDAwMDA1NCAgIEE5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZTAudyAgICAgICAgICAgICA7IDEwMTAxCisgICAgICAgMjkgMDAwMDAwNTggICBCMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbGUwLncgICAgICAgICAgICAgOyAxMDExMAorICAgICAgIDMwIDAwMDAwMDVDICAgQjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGFsdy53ICAgICAgICAgICAgIDsgMTAxMTEKKworIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRhYWMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucwpAQCAtMCwwICsxLDMwIEBACis7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIGNvbmRpdGlvbgorOzsgY29kZXMgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLgorOzsgIEFsc28gdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KKworCWJjbmQuYQlyNyxyNSxuZXYuYgkJOyAwMDAwMAorCWJjbmQuYQlyNyxyNSxndDAuYgkJOyAwMDAwMQorCWJjbmQuYQlyNyxyNSxlcTAuYgkJOyAwMDAxMAorCWJjbmQuYQlyNyxyNSxnZTAuYgkJOyAwMDAxMQorCWJjbmQuYQlyNyxyNSxsdDAuYgkJOyAwMDEwMAorCWJjbmQuYQlyNyxyNSxuZTAuYgkJOyAwMDEwMQorCWJjbmQuYQlyNyxyNSxsZTAuYgkJOyAwMDExMAorCWJjbmQuYQlyNyxyNSxhbHcuYgkJOyAwMDExMQorCisJYmNuZC5hCXI3LHI1LG5ldi5oCQk7IDAxMDAwCisJYmNuZC5hCXI3LHI1LGd0MC5oCQk7IDAxMDAxCisJYmNuZC5hCXI3LHI1LGVxMC5oCQk7IDAxMDEwCisJYmNuZC5hCXI3LHI1LGdlMC5oCQk7IDAxMDExCisJYmNuZC5hCXI3LHI1LGx0MC5oCQk7IDAxMTAwCisJYmNuZC5hCXI3LHI1LG5lMC5oCQk7IDAxMTAxCisJYmNuZC5hCXI3LHI1LGxlMC5oCQk7IDAxMTEwCisJYmNuZC5hCXI3LHI1LGFsdy5oCQk7IDAxMTExCisKKwliY25kLmEJcjcscjUsbmV2LncJCTsgMTAwMDAKKwliY25kLmEJcjcscjUsZ3QwLncJCTsgMTAwMDEKKwliY25kLmEJcjcscjUsZXEwLncJCTsgMTAwMTAKKwliY25kLmEJcjcscjUsZ2UwLncJCTsgMTAwMTEKKwliY25kLmEJcjcscjUsbHQwLncJCTsgMTAxMDAKKwliY25kLmEJcjcscjUsbmUwLncJCTsgMTAxMDEKKwliY25kLmEJcjcscjUsbGUwLncJCTsgMTAxMTAKKwliY25kLmEJcjcscjUsYWx3LncJCTsgMTAxMTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI2MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kCkBAIC0wLDAgKzEsNjggQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IFRJYzgwIGNvbnRyb2wgcmVnaXN0ZXIgb3BlcmFuZHMKKworLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPC50ZXh0PjoKKyAgIDA6CTM0IDAwIDAyIDEwLioKKyAgIDQ6CTM5IDAwIDAyIDEwLioKKyAgIDg6CTNhIDAwIDAyIDEwLioKKyAgIGM6CTAyIDAwIDAyIDEwLioKKyAgMTA6CTAwIDA1IDAyIDEwLioKKyAgMTQ6CTAwIDA0IDAyIDEwLioKKyAgMTg6CTAxIDA0IDAyIDEwLioKKyAgMWM6CTBhIDA0IDAyIDEwLioKKyAgMjA6CTBiIDA0IDAyIDEwLioKKyAgMjQ6CTBjIDA0IDAyIDEwLioKKyAgMjg6CTBkIDA0IDAyIDEwLioKKyAgMmM6CTBlIDA0IDAyIDEwLioKKyAgMzA6CTBmIDA0IDAyIDEwLioKKyAgMzQ6CTAyIDA0IDAyIDEwLioKKyAgMzg6CTAzIDA0IDAyIDEwLioKKyAgM2M6CTA0IDA0IDAyIDEwLioKKyAgNDA6CTA1IDA0IDAyIDEwLioKKyAgNDQ6CTA2IDA0IDAyIDEwLioKKyAgNDg6CTA3IDA0IDAyIDEwLioKKyAgNGM6CTA4IDA0IDAyIDEwLioKKyAgNTA6CTA5IDA0IDAyIDEwLioKKyAgNTQ6CTMzIDAwIDAyIDEwLioKKyAgNTg6CTAxIDAwIDAyIDEwLioKKyAgNWM6CTAwIDAwIDAyIDEwLioKKyAgNjA6CTExIDAwIDAyIDEwLioKKyAgNjQ6CTE0IDAwIDAyIDEwLioKKyAgNjg6CTEzIDAwIDAyIDEwLioKKyAgNmM6CTEwIDAwIDAyIDEwLioKKyAgNzA6CTEyIDAwIDAyIDEwLioKKyAgNzQ6CTA4IDAwIDAyIDEwLioKKyAgNzg6CTA2IDAwIDAyIDEwLioKKyAgN2M6CTAwIDAzIDAyIDEwLioKKyAgODA6CTAwIDQwIDAyIDEwLioKKyAgODQ6CTAxIDQwIDAyIDEwLioKKyAgODg6CTA0IDAwIDAyIDEwLioKKyAgOGM6CTAwIDAyIDAyIDEwLioKKyAgOTA6CTAxIDAyIDAyIDEwLioKKyAgOTQ6CTBhIDAyIDAyIDEwLioKKyAgOTg6CTBiIDAyIDAyIDEwLioKKyAgOWM6CTBjIDAyIDAyIDEwLioKKyAgYTA6CTBkIDAyIDAyIDEwLioKKyAgYTQ6CTBlIDAyIDAyIDEwLioKKyAgYTg6CTBmIDAyIDAyIDEwLioKKyAgYWM6CTAyIDAyIDAyIDEwLioKKyAgYjA6CTAzIDAyIDAyIDEwLioKKyAgYjQ6CTA0IDAyIDAyIDEwLioKKyAgYjg6CTA1IDAyIDAyIDEwLioKKyAgYmM6CTA2IDAyIDAyIDEwLioKKyAgYzA6CTA3IDAyIDAyIDEwLioKKyAgYzQ6CTA4IDAyIDAyIDEwLioKKyAgYzg6CTA5IDAyIDAyIDEwLioKKyAgY2M6CTMxIDAwIDAyIDEwLioKKyAgZDA6CTMwIDAwIDAyIDEwLioKKyAgZDQ6CTAyIDQwIDAyIDEwLioKKyAgZDg6CTBkIDAwIDAyIDEwLioKKyAgZGM6CTBhIDAwIDAyIDEwLioKKyAgZTA6CTIwIDAwIDAyIDEwLioKKyAgZTQ6CTIxIDAwIDAyIDEwLioKKyAgZTg6CTBlIDAwIDAyIDEwLioKKyAgZWM6CTBmIDAwIDAyIDEwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlYTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMubHN0CkBAIC0wLDAgKzEsNzYgQEAKK01WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo1NiAxOTk3CitDb3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCisKK2NyZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQorCisgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciBjb250cm9sIHJlZ2lzdGVycworICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbworICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaWFzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgorICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDUgMDAwMDAwMDAgICAxMDAyMDAzNCAgICAgICAgIHJkY3IgICAgQU5BU1RBVCxyMgorICAgICAgICA2IDAwMDAwMDA0ICAgMTAwMjAwMzkgICAgICAgICByZGNyICAgIEJSSzEscjIKKyAgICAgICAgNyAwMDAwMDAwOCAgIDEwMDIwMDNBICAgICAgICAgcmRjciAgICBCUksyLHIyCisgICAgICAgIDggMDAwMDAwMEMgICAxMDAyMDAwMiAgICAgICAgIHJkY3IgICAgQ09ORklHLHIyCisgICAgICAgIDkgMDAwMDAwMTAgICAxMDAyMDUwMCAgICAgICAgIHJkY3IgICAgRExSVSxyMgorICAgICAgIDEwIDAwMDAwMDE0ICAgMTAwMjA0MDAgICAgICAgICByZGNyICAgIERUQUcwLHIyCisgICAgICAgMTEgMDAwMDAwMTggICAxMDAyMDQwMSAgICAgICAgIHJkY3IgICAgRFRBRzEscjIKKyAgICAgICAxMiAwMDAwMDAxQyAgIDEwMDIwNDBBICAgICAgICAgcmRjciAgICBEVEFHMTAscjIKKyAgICAgICAxMyAwMDAwMDAyMCAgIDEwMDIwNDBCICAgICAgICAgcmRjciAgICBEVEFHMTEscjIKKyAgICAgICAxNCAwMDAwMDAyNCAgIDEwMDIwNDBDICAgICAgICAgcmRjciAgICBEVEFHMTIscjIKKyAgICAgICAxNSAwMDAwMDAyOCAgIDEwMDIwNDBEICAgICAgICAgcmRjciAgICBEVEFHMTMscjIKKyAgICAgICAxNiAwMDAwMDAyQyAgIDEwMDIwNDBFICAgICAgICAgcmRjciAgICBEVEFHMTQscjIKKyAgICAgICAxNyAwMDAwMDAzMCAgIDEwMDIwNDBGICAgICAgICAgcmRjciAgICBEVEFHMTUscjIKKyAgICAgICAxOCAwMDAwMDAzNCAgIDEwMDIwNDAyICAgICAgICAgcmRjciAgICBEVEFHMixyMgorICAgICAgIDE5IDAwMDAwMDM4ICAgMTAwMjA0MDMgICAgICAgICByZGNyICAgIERUQUczLHIyCisgICAgICAgMjAgMDAwMDAwM0MgICAxMDAyMDQwNCAgICAgICAgIHJkY3IgICAgRFRBRzQscjIKKyAgICAgICAyMSAwMDAwMDA0MCAgIDEwMDIwNDA1ICAgICAgICAgcmRjciAgICBEVEFHNSxyMgorICAgICAgIDIyIDAwMDAwMDQ0ICAgMTAwMjA0MDYgICAgICAgICByZGNyICAgIERUQUc2LHIyCisgICAgICAgMjMgMDAwMDAwNDggICAxMDAyMDQwNyAgICAgICAgIHJkY3IgICAgRFRBRzcscjIKKyAgICAgICAyNCAwMDAwMDA0QyAgIDEwMDIwNDA4ICAgICAgICAgcmRjciAgICBEVEFHOCxyMgorICAgICAgIDI1IDAwMDAwMDUwICAgMTAwMjA0MDkgICAgICAgICByZGNyICAgIERUQUc5LHIyCisgICAgICAgMjYgMDAwMDAwNTQgICAxMDAyMDAzMyAgICAgICAgIHJkY3IgICAgRUNPTUNOVEwscjIKKyAgICAgICAyNyAwMDAwMDA1OCAgIDEwMDIwMDAxICAgICAgICAgcmRjciAgICBFSVAscjIKKyAgICAgICAyOCAwMDAwMDA1QyAgIDEwMDIwMDAwICAgICAgICAgcmRjciAgICBFUEMscjIKKyAgICAgICAyOSAwMDAwMDA2MCAgIDEwMDIwMDExICAgICAgICAgcmRjciAgICBGTFRBRFIscjIKKyAgICAgICAzMCAwMDAwMDA2NCAgIDEwMDIwMDE0ICAgICAgICAgcmRjciAgICBGTFREVEgscjIKKyAgICAgICAzMSAwMDAwMDA2OCAgIDEwMDIwMDEzICAgICAgICAgcmRjciAgICBGTFREVEwscjIKKyAgICAgICAzMiAwMDAwMDA2QyAgIDEwMDIwMDEwICAgICAgICAgcmRjciAgICBGTFRPUCxyMgorICAgICAgIDMzIDAwMDAwMDcwICAgMTAwMjAwMTIgICAgICAgICByZGNyICAgIEZMVFRBRyxyMgorICAgICAgIDM0IDAwMDAwMDc0ICAgMTAwMjAwMDggICAgICAgICByZGNyICAgIEZQU1QscjIKKyAgICAgICAzNSAwMDAwMDA3OCAgIDEwMDIwMDA2ICAgICAgICAgcmRjciAgICBJRSxyMgorICAgICAgIDM2IDAwMDAwMDdDICAgMTAwMjAzMDAgICAgICAgICByZGNyICAgIElMUlUscjIKKyAgICAgICAzNyAwMDAwMDA4MCAgIDEwMDI0MDAwICAgICAgICAgcmRjciAgICBJTjBQLHIyCisgICAgICAgMzggMDAwMDAwODQgICAxMDAyNDAwMSAgICAgICAgIHJkY3IgICAgSU4xUCxyMgorICAgICAgIDM5IDAwMDAwMDg4ICAgMTAwMjAwMDQgICAgICAgICByZGNyICAgIElOVFBFTixyMgorICAgICAgIDQwIDAwMDAwMDhDICAgMTAwMjAyMDAgICAgICAgICByZGNyICAgIElUQUcwLHIyCisgICAgICAgNDEgMDAwMDAwOTAgICAxMDAyMDIwMSAgICAgICAgIHJkY3IgICAgSVRBRzEscjIKKyAgICAgICA0MiAwMDAwMDA5NCAgIDEwMDIwMjBBICAgICAgICAgcmRjciAgICBJVEFHMTAscjIKKyAgICAgICA0MyAwMDAwMDA5OCAgIDEwMDIwMjBCICAgICAgICAgcmRjciAgICBJVEFHMTEscjIKKyAgICAgICA0NCAwMDAwMDA5QyAgIDEwMDIwMjBDICAgICAgICAgcmRjciAgICBJVEFHMTIscjIKKyAgICAgICA0NSAwMDAwMDBBMCAgIDEwMDIwMjBEICAgICAgICAgcmRjciAgICBJVEFHMTMscjIKKyAgICAgICA0NiAwMDAwMDBBNCAgIDEwMDIwMjBFICAgICAgICAgcmRjciAgICBJVEFHMTQscjIKKyAgICAgICA0NyAwMDAwMDBBOCAgIDEwMDIwMjBGICAgICAgICAgcmRjciAgICBJVEFHMTUscjIKKyAgICAgICA0OCAwMDAwMDBBQyAgIDEwMDIwMjAyICAgICAgICAgcmRjciAgICBJVEFHMixyMgorICAgICAgIDQ5IDAwMDAwMEIwICAgMTAwMjAyMDMgICAgICAgICByZGNyICAgIElUQUczLHIyCisgICAgICAgNTAgMDAwMDAwQjQgICAxMDAyMDIwNCAgICAgICAgIHJkY3IgICAgSVRBRzQscjIKKyAgICAgICA1MSAwMDAwMDBCOCAgIDEwMDIwMjA1ICAgICAgICAgcmRjciAgICBJVEFHNSxyMgorICAgICAgIDUyIDAwMDAwMEJDICAgMTAwMjAyMDYgICAgICAgICByZGNyICAgIElUQUc2LHIyCisgICAgICAgNTMgMDAwMDAwQzAgICAxMDAyMDIwNyAgICAgICAgIHJkY3IgICAgSVRBRzcscjIKKyAgICAgICA1NCAwMDAwMDBDNCAgIDEwMDIwMjA4ICAgICAgICAgcmRjciAgICBJVEFHOCxyMgorICAgICAgIDU1IDAwMDAwMEM4ICAgMTAwMjAyMDkgICAgICAgICByZGNyICAgIElUQUc5LHIyCisMTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjU2IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworY3JlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCisKKyAgICAgICA1NiAwMDAwMDBDQyAgIDEwMDIwMDMxICAgICAgICAgcmRjciAgICBNSVAscjIKKyAgICAgICA1NyAwMDAwMDBEMCAgIDEwMDIwMDMwICAgICAgICAgcmRjciAgICBNUEMscjIKKyAgICAgICA1OCAwMDAwMDBENCAgIDEwMDI0MDAyICAgICAgICAgcmRjciAgICBPVVRQLHIyCisgICAgICAgNTkgMDAwMDAwRDggICAxMDAyMDAwRCAgICAgICAgIHJkY3IgICAgUEtUUkVRLHIyCisgICAgICAgNjAgMDAwMDAwREMgICAxMDAyMDAwQSAgICAgICAgIHJkY3IgICAgUFBFUlJPUixyMgorICAgICAgIDYxIDAwMDAwMEUwICAgMTAwMjAwMjAgICAgICAgICByZGNyICAgIFNZU1NUSyxyMgorICAgICAgIDYyIDAwMDAwMEU0ICAgMTAwMjAwMjEgICAgICAgICByZGNyICAgIFNZU1RNUCxyMgorICAgICAgIDYzIDAwMDAwMEU4ICAgMTAwMjAwMEUgICAgICAgICByZGNyICAgIFRDT1VOVCxyMgorICAgICAgIDY0IDAwMDAwMEVDICAgMTAwMjAwMEYgICAgICAgICByZGNyICAgIFRTQ0FMRSxyMgorCisgTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBhZGNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5zCkBAIC0wLDAgKzEsNjQgQEAKKzs7IFRlc3QgdGhhdCBhbGwgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIGNvbnRyb2wgcmVnaXN0ZXJzCis7OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCis7OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MuCisKKwlyZGNyCUFOQVNUQVQscjIKKwlyZGNyCUJSSzEscjIKKwlyZGNyCUJSSzIscjIKKwlyZGNyCUNPTkZJRyxyMgorCXJkY3IJRExSVSxyMgorCXJkY3IJRFRBRzAscjIKKwlyZGNyCURUQUcxLHIyCisJcmRjcglEVEFHMTAscjIKKwlyZGNyCURUQUcxMSxyMgorCXJkY3IJRFRBRzEyLHIyCisJcmRjcglEVEFHMTMscjIKKwlyZGNyCURUQUcxNCxyMgorCXJkY3IJRFRBRzE1LHIyCisJcmRjcglEVEFHMixyMgorCXJkY3IJRFRBRzMscjIKKwlyZGNyCURUQUc0LHIyCisJcmRjcglEVEFHNSxyMgorCXJkY3IJRFRBRzYscjIKKwlyZGNyCURUQUc3LHIyCisJcmRjcglEVEFHOCxyMgorCXJkY3IJRFRBRzkscjIKKwlyZGNyCUVDT01DTlRMLHIyCisJcmRjcglFSVAscjIKKwlyZGNyCUVQQyxyMgorCXJkY3IJRkxUQURSLHIyCisJcmRjcglGTFREVEgscjIKKwlyZGNyCUZMVERUTCxyMgorCXJkY3IJRkxUT1AscjIKKwlyZGNyCUZMVFRBRyxyMgorCXJkY3IJRlBTVCxyMgorCXJkY3IJSUUscjIKKwlyZGNyCUlMUlUscjIKKwlyZGNyCUlOMFAscjIKKwlyZGNyCUlOMVAscjIKKwlyZGNyCUlOVFBFTixyMgorCXJkY3IJSVRBRzAscjIKKwlyZGNyCUlUQUcxLHIyCisJcmRjcglJVEFHMTAscjIKKwlyZGNyCUlUQUcxMSxyMgorCXJkY3IJSVRBRzEyLHIyCisJcmRjcglJVEFHMTMscjIKKwlyZGNyCUlUQUcxNCxyMgorCXJkY3IJSVRBRzE1LHIyCisJcmRjcglJVEFHMixyMgorCXJkY3IJSVRBRzMscjIKKwlyZGNyCUlUQUc0LHIyCisJcmRjcglJVEFHNSxyMgorCXJkY3IJSVRBRzYscjIKKwlyZGNyCUlUQUc3LHIyCisJcmRjcglJVEFHOCxyMgorCXJkY3IJSVRBRzkscjIKKwlyZGNyCU1JUCxyMgorCXJkY3IJTVBDLHIyCisJcmRjcglPVVRQLHIyCisJcmRjcglQS1RSRVEscjIKKwlyZGNyCVBQRVJST1IscjIKKwlyZGNyCVNZU1NUSyxyMgorCXJkY3IJU1lTVE1QLHIyCisJcmRjcglUQ09VTlQscjIKKwlyZGNyCVRTQ0FMRSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDA4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQKQEAgLTAsMCArMSw0MSBAQAorI29iamR1bXA6IC1kCisjbmFtZTogVEljODAgY292ZXJhZ2Ugb2Ygc2hpZnQgaW5zdHJ1Y3Rpb24gRU5ETUFTSyBmaWVsZAorCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8LnRleHQ+OgorICAgMDoJMDUgMDAgYzcgNDkuKgorICAgNDoJMjUgMDAgYzcgNDkuKgorICAgODoJNDUgMDAgYzcgNDkuKgorICAgYzoJNjUgMDAgYzcgNDkuKgorICAxMDoJODUgMDAgYzcgNDkuKgorICAxNDoJYTUgMDAgYzcgNDkuKgorICAxODoJYzUgMDAgYzcgNDkuKgorICAxYzoJZTUgMDAgYzcgNDkuKgorICAyMDoJMDUgMDEgYzcgNDkuKgorICAyNDoJMjUgMDEgYzcgNDkuKgorICAyODoJNDUgMDEgYzcgNDkuKgorICAyYzoJNjUgMDEgYzcgNDkuKgorICAzMDoJODUgMDEgYzcgNDkuKgorICAzNDoJYTUgMDEgYzcgNDkuKgorICAzODoJYzUgMDEgYzcgNDkuKgorICAzYzoJZTUgMDEgYzcgNDkuKgorICA0MDoJMDUgMDIgYzcgNDkuKgorICA0NDoJMjUgMDIgYzcgNDkuKgorICA0ODoJNDUgMDIgYzcgNDkuKgorICA0YzoJNjUgMDIgYzcgNDkuKgorICA1MDoJODUgMDIgYzcgNDkuKgorICA1NDoJYTUgMDIgYzcgNDkuKgorICA1ODoJYzUgMDIgYzcgNDkuKgorICA1YzoJZTUgMDIgYzcgNDkuKgorICA2MDoJMDUgMDMgYzcgNDkuKgorICA2NDoJMjUgMDMgYzcgNDkuKgorICA2ODoJNDUgMDMgYzcgNDkuKgorICA2YzoJNjUgMDMgYzcgNDkuKgorICA3MDoJODUgMDMgYzcgNDkuKgorICA3NDoJYTUgMDMgYzcgNDkuKgorICA3ODoJYzUgMDMgYzcgNDkuKgorICA3YzoJZTUgMDMgYzcgNDkuKgorICA4MDoJMDUgMDAgYzcgNDkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTAzYjMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5sc3QKQEAgLTAsMCArMSw0NSBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI5IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworZW5kbWFzay5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3QgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZW5kbWFzayBpbiBiaXRzIDUtOS4KKyAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IFRoZSBtYXNrIHRoYXQgaXMgdXNlZCBpcyBjb21wdXRlZCBhcyAyKipiaXRzLTEgd2hlcmUgYml0cworICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHRoZSBiaXRzIDUtOSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCAwIGFuZCAzMgorICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHksIGFuZCBkaXNhc3NlbWJsZWQgYXMgMC4KKyAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA2IDAwMDAwMDAwICAgNDlDNzAwMDUgICAgICAgICBzbC5peiAgIDUsMCxyNyxyOQorICAgICAgICA3IDAwMDAwMDA0ICAgNDlDNzAwMjUgICAgICAgICBzbC5peiAgIDUsMSxyNyxyOQorICAgICAgICA4IDAwMDAwMDA4ICAgNDlDNzAwNDUgICAgICAgICBzbC5peiAgIDUsMixyNyxyOQorICAgICAgICA5IDAwMDAwMDBDICAgNDlDNzAwNjUgICAgICAgICBzbC5peiAgIDUsMyxyNyxyOQorICAgICAgIDEwIDAwMDAwMDEwICAgNDlDNzAwODUgICAgICAgICBzbC5peiAgIDUsNCxyNyxyOQorICAgICAgIDExIDAwMDAwMDE0ICAgNDlDNzAwQTUgICAgICAgICBzbC5peiAgIDUsNSxyNyxyOQorICAgICAgIDEyIDAwMDAwMDE4ICAgNDlDNzAwQzUgICAgICAgICBzbC5peiAgIDUsNixyNyxyOQorICAgICAgIDEzIDAwMDAwMDFDICAgNDlDNzAwRTUgICAgICAgICBzbC5peiAgIDUsNyxyNyxyOQorICAgICAgIDE0IDAwMDAwMDIwICAgNDlDNzAxMDUgICAgICAgICBzbC5peiAgIDUsOCxyNyxyOQorICAgICAgIDE1IDAwMDAwMDI0ICAgNDlDNzAxMjUgICAgICAgICBzbC5peiAgIDUsOSxyNyxyOQorICAgICAgIDE2IDAwMDAwMDI4ICAgNDlDNzAxNDUgICAgICAgICBzbC5peiAgIDUsMTAscjcscjkKKyAgICAgICAxNyAwMDAwMDAyQyAgIDQ5QzcwMTY1ICAgICAgICAgc2wuaXogICA1LDExLHI3LHI5CisgICAgICAgMTggMDAwMDAwMzAgICA0OUM3MDE4NSAgICAgICAgIHNsLml6ICAgNSwxMixyNyxyOQorICAgICAgIDE5IDAwMDAwMDM0ICAgNDlDNzAxQTUgICAgICAgICBzbC5peiAgIDUsMTMscjcscjkKKyAgICAgICAyMCAwMDAwMDAzOCAgIDQ5QzcwMUM1ICAgICAgICAgc2wuaXogICA1LDE0LHI3LHI5CisgICAgICAgMjEgMDAwMDAwM0MgICA0OUM3MDFFNSAgICAgICAgIHNsLml6ICAgNSwxNSxyNyxyOQorICAgICAgIDIyIDAwMDAwMDQwICAgNDlDNzAyMDUgICAgICAgICBzbC5peiAgIDUsMTYscjcscjkKKyAgICAgICAyMyAwMDAwMDA0NCAgIDQ5QzcwMjI1ICAgICAgICAgc2wuaXogICA1LDE3LHI3LHI5CisgICAgICAgMjQgMDAwMDAwNDggICA0OUM3MDI0NSAgICAgICAgIHNsLml6ICAgNSwxOCxyNyxyOQorICAgICAgIDI1IDAwMDAwMDRDICAgNDlDNzAyNjUgICAgICAgICBzbC5peiAgIDUsMTkscjcscjkKKyAgICAgICAyNiAwMDAwMDA1MCAgIDQ5QzcwMjg1ICAgICAgICAgc2wuaXogICA1LDIwLHI3LHI5CisgICAgICAgMjcgMDAwMDAwNTQgICA0OUM3MDJBNSAgICAgICAgIHNsLml6ICAgNSwyMSxyNyxyOQorICAgICAgIDI4IDAwMDAwMDU4ICAgNDlDNzAyQzUgICAgICAgICBzbC5peiAgIDUsMjIscjcscjkKKyAgICAgICAyOSAwMDAwMDA1QyAgIDQ5QzcwMkU1ICAgICAgICAgc2wuaXogICA1LDIzLHI3LHI5CisgICAgICAgMzAgMDAwMDAwNjAgICA0OUM3MDMwNSAgICAgICAgIHNsLml6ICAgNSwyNCxyNyxyOQorICAgICAgIDMxIDAwMDAwMDY0ICAgNDlDNzAzMjUgICAgICAgICBzbC5peiAgIDUsMjUscjcscjkKKyAgICAgICAzMiAwMDAwMDA2OCAgIDQ5QzcwMzQ1ICAgICAgICAgc2wuaXogICA1LDI2LHI3LHI5CisgICAgICAgMzMgMDAwMDAwNkMgICA0OUM3MDM2NSAgICAgICAgIHNsLml6ICAgNSwyNyxyNyxyOQorICAgICAgIDM0IDAwMDAwMDcwICAgNDlDNzAzODUgICAgICAgICBzbC5peiAgIDUsMjgscjcscjkKKyAgICAgICAzNSAwMDAwMDA3NCAgIDQ5QzcwM0E1ICAgICAgICAgc2wuaXogICA1LDI5LHI3LHI5CisgICAgICAgMzYgMDAwMDAwNzggICA0OUM3MDNDNSAgICAgICAgIHNsLml6ICAgNSwzMCxyNyxyOQorICAgICAgIDM3IDAwMDAwMDdDICAgNDlDNzAzRTUgICAgICAgICBzbC5peiAgIDUsMzEscjcscjkKKyAgICAgICAzOCAwMDAwMDA4MCAgIDQ5QzcwMDA1ICAgICAgICAgc2wuaXogICA1LDMyLHI3LHI5CisKKyBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmFlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLnMKQEAgLTAsMCArMSwzOCBAQAorOzsgVGVzdCBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHRoZSBlbmRtYXNrIGluIGJpdHMgNS05LgorOzsgVGhlIG1hc2sgdGhhdCBpcyB1c2VkIGlzIGNvbXB1dGVkIGFzIDIqKmJpdHMtMSB3aGVyZSBiaXRzCis7OyBhcmUgdGhlIGJpdHMgNS05IGZyb20gdGhlIGluc3RydWN0aW9uLiAgTm90ZSB0aGF0IDAgYW5kIDMyCis7OyBhcmUgdHJlYXRlZCBpZGVudGljYWxseSwgYW5kIGRpc2Fzc2VtYmxlZCBhcyAwLgorCisJc2wuaXoJNSwwLHI3LHI5CisJc2wuaXoJNSwxLHI3LHI5CisJc2wuaXoJNSwyLHI3LHI5CisJc2wuaXoJNSwzLHI3LHI5CisJc2wuaXoJNSw0LHI3LHI5CisJc2wuaXoJNSw1LHI3LHI5CisJc2wuaXoJNSw2LHI3LHI5CisJc2wuaXoJNSw3LHI3LHI5CisJc2wuaXoJNSw4LHI3LHI5CisJc2wuaXoJNSw5LHI3LHI5CisJc2wuaXoJNSwxMCxyNyxyOQorCXNsLml6CTUsMTEscjcscjkKKwlzbC5pegk1LDEyLHI3LHI5CisJc2wuaXoJNSwxMyxyNyxyOQorCXNsLml6CTUsMTQscjcscjkKKwlzbC5pegk1LDE1LHI3LHI5CisJc2wuaXoJNSwxNixyNyxyOQorCXNsLml6CTUsMTcscjcscjkKKwlzbC5pegk1LDE4LHI3LHI5CisJc2wuaXoJNSwxOSxyNyxyOQorCXNsLml6CTUsMjAscjcscjkKKwlzbC5pegk1LDIxLHI3LHI5CisJc2wuaXoJNSwyMixyNyxyOQorCXNsLml6CTUsMjMscjcscjkKKwlzbC5pegk1LDI0LHI3LHI5CisJc2wuaXoJNSwyNSxyNyxyOQorCXNsLml6CTUsMjYscjcscjkKKwlzbC5pegk1LDI3LHI3LHI5CisJc2wuaXoJNSwyOCxyNyxyOQorCXNsLml6CTUsMjkscjcscjkKKwlzbC5pegk1LDMwLHI3LHI5CisJc2wuaXoJNSwzMSxyNyxyOQorCXNsLml6CTUsMzIscjcscjkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWI4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5kCkBAIC0wLDAgKzEsNDAgQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IFRJYzgwIHNpbXBsZSBmbG9hdGluZyBwb2ludCBvcGVyYW5kcworCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8LnRleHQ+OgorICAgMDoJODAgMTIgYmUgNTEgMTYgNjggYTkgNjUuKgorICAgODoJMDAgMTIgYmUgNTEgMTYgNjggYTkgZTUuKgorICAxMDoJMDAgMTAgYmUgNTEgOWEgNmQgNDEgMTkuKgorICAxODoJODAgYjAgM2UgNTIgOWEgNmQgNDEgOTkuKgorICAyMDoJMDAgYjAgM2UgNTIgMDAgMDAgMDAgMDAuKgorICAyODoJODAgNzIgYmUgNTEgMDAgMDAgMDAgNDAuKgorICAzMDoJMDAgNzIgYmUgNTEgMDAgMDAgMDAgM2YuKgorICAzODoJMDAgNzAgYmUgNTEgMDAgMDAgODAgNDUuKgorICA0MDoJODAgNTIgYmUgNTEgMDAgMDAgODAgYzUuKgorICA0ODoJMDAgNTIgYmUgNTEgMDAgMDAgMDAgNDAuKgorICA1MDoJMDAgNTAgYmUgNTEgMDAgMDAgMDAgNDAuKgorICA1ODoJODAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA2MDoJODAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA2ODoJODAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA3MDoJODAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA3ODoJMDAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA4MDoJMDAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA4ODoJMDAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA5MDoJMDAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgorICA5ODoJMDAgOTMgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBhMDoJMDAgOTUgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBhODoJMDAgOTEgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBiMDoJMDAgOTcgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBiODoJODAgOTIgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBjMDoJODAgOTQgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBjODoJODAgOTAgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBkMDoJODAgOTYgM2UgNDAgMDAgMDAgMDAgNDAuKgorICBkODoJMDAgZjIgM2UgNTAgMDAgMDAgMDAgNDAuKgorICBlMDoJMDAgZjAgM2UgNTAgMDAgMDAgMDAgNDAuKgorICBlODoJODAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgorICBmMDoJMDAgMzIgYmUgNTEgMDAgMDAgMDAgNDAuKgorICBmODoJMDAgMzAgYmUgNTEgMDAgMDAgMDAgNDAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzQ1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5sc3QKQEAgLTAsMCArMSw3NiBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDIyOjA5OjA5IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworZmxvYXQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAwMDAwMDAwMCAgIDUxQkUxMjgwICAgICAgICAgZmFkZC5zZGQgICAgICAgIDEuMEUyMyxyNixyMTAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMDQgICA2NUE5NjgxNiAKKyAgICAgICAgMiAwMDAwMDAwOCAgIDUxQkUxMjAwICAgICAgICAgZmFkZC5zc2QgICAgICAgIC0xLjBFMjMscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMEMgICBFNUE5NjgxNiAKKyAgICAgICAgMyAwMDAwMDAxMCAgIDUxQkUxMDAwICAgICAgICAgZmFkZC5zc3MgICAgICAgIDEuMEUtMjMscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMTQgICAxOTQxNkQ5QSAKKyAgICAgICAgNCAwMDAwMDAxOCAgIDUyM0VCMDgwICAgICAgICAgZmNtcC5zZCAgICAgICAgIC0xLjBFLTIzLHI4LHIxMCA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMUMgICA5OTQxNkQ5QSAKKyAgICAgICAgNSAwMDAwMDAyMCAgIDUyM0VCMDAwICAgICAgICAgZmNtcC5zcyAgICAgICAgIDAuMCxyOCxyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMjQgICAwMDAwMDAwMCAKKyAgICAgICAgNiAwMDAwMDAyOCAgIDUxQkU3MjgwICAgICAgICAgZmRpdi5zZGQgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMkMgICA0MDAwMDAwMCAKKyAgICAgICAgNyAwMDAwMDAzMCAgIDUxQkU3MjAwICAgICAgICAgZmRpdi5zc2QgICAgICAgIDAuNSxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwMzQgICAzRjAwMDAwMCAKKyAgICAgICAgOCAwMDAwMDAzOCAgIDUxQkU3MDAwICAgICAgICAgZmRpdi5zc3MgICAgICAgIDQwOTYuMCxyNixyMTAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwM0MgICA0NTgwMDAwMCAKKyAgICAgICAgOSAwMDAwMDA0MCAgIDUxQkU1MjgwICAgICAgICAgZm1weS5zZGQgICAgICAgIC00MDk2LjAscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNDQgICBDNTgwMDAwMCAKKyAgICAgICAxMCAwMDAwMDA0OCAgIDUxQkU1MjAwICAgICAgICAgZm1weS5zc2QgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNEMgICA0MDAwMDAwMCAKKyAgICAgICAxMSAwMDAwMDA1MCAgIDUxQkU1MDAwICAgICAgICAgZm1weS5zc3MgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNTQgICA0MDAwMDAwMCAKKyAgICAgICAxMiAwMDAwMDA1OCAgIDQwM0U5MzgwICAgICAgICAgZnJuZG0uc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNUMgICA0MDAwMDAwMCAKKyAgICAgICAxMyAwMDAwMDA2MCAgIDQwM0U5NTgwICAgICAgICAgZnJuZG0uc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNjQgICA0MDAwMDAwMCAKKyAgICAgICAxNCAwMDAwMDA2OCAgIDQwM0U5MTgwICAgICAgICAgZnJuZG0uc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNkMgICA0MDAwMDAwMCAKKyAgICAgICAxNSAwMDAwMDA3MCAgIDQwM0U5NzgwICAgICAgICAgZnJuZG0uc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNzQgICA0MDAwMDAwMCAKKyAgICAgICAxNiAwMDAwMDA3OCAgIDQwM0U5MjAwICAgICAgICAgZnJuZG4uc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwN0MgICA0MDAwMDAwMCAKKyAgICAgICAxNyAwMDAwMDA4MCAgIDQwM0U5NDAwICAgICAgICAgZnJuZG4uc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwODQgICA0MDAwMDAwMCAKKyAgICAgICAxOCAwMDAwMDA4OCAgIDQwM0U5MDAwICAgICAgICAgZnJuZG4uc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwOEMgICA0MDAwMDAwMCAKKyAgICAgICAxOSAwMDAwMDA5MCAgIDQwM0U5NjAwICAgICAgICAgZnJuZG4uc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwOTQgICA0MDAwMDAwMCAKKyAgICAgICAyMCAwMDAwMDA5OCAgIDQwM0U5MzAwICAgICAgICAgZnJuZHAuc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwOUMgICA0MDAwMDAwMCAKKyAgICAgICAyMSAwMDAwMDBBMCAgIDQwM0U5NTAwICAgICAgICAgZnJuZHAuc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwQTQgICA0MDAwMDAwMCAKKyAgICAgICAyMiAwMDAwMDBBOCAgIDQwM0U5MTAwICAgICAgICAgZnJuZHAuc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwQUMgICA0MDAwMDAwMCAKKyAgICAgICAyMyAwMDAwMDBCMCAgIDQwM0U5NzAwICAgICAgICAgZnJuZHAuc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwQjQgICA0MDAwMDAwMCAKKyAgICAgICAyNCAwMDAwMDBCOCAgIDQwM0U5MjgwICAgICAgICAgZnJuZHouc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwQkMgICA0MDAwMDAwMCAKKyAgICAgICAyNSAwMDAwMDBDMCAgIDQwM0U5NDgwICAgICAgICAgZnJuZHouc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwQzQgICA0MDAwMDAwMCAKKyAgICAgICAyNiAwMDAwMDBDOCAgIDQwM0U5MDgwICAgICAgICAgZnJuZHouc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwQ0MgICA0MDAwMDAwMCAKKyAgICAgICAyNyAwMDAwMDBEMCAgIDQwM0U5NjgwICAgICAgICAgZnJuZHouc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwRDQgICA0MDAwMDAwMCAKKyAgICAgICAyOCAwMDAwMDBEOCAgIDUwM0VGMjAwICAgICAgICAgZnNxcnQuc2QgICAgICAgIDIuMCxyMTAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCisMTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDIyOjA5OjA5IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworZmxvYXQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCisKKyAgICAgICAgICAwMDAwMDBEQyAgIDQwMDAwMDAwIAorICAgICAgIDI5IDAwMDAwMEUwICAgNTAzRUYwMDAgICAgICAgICBmc3FydC5zcyAgICAgICAgMi4wLHIxMCAgICAgICAgIDsgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDBFNCAgIDQwMDAwMDAwIAorICAgICAgIDMwIDAwMDAwMEU4ICAgNTFCRTMyODAgICAgICAgICBmc3ViLnNkZCAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDBFQyAgIDQwMDAwMDAwIAorICAgICAgIDMxIDAwMDAwMEYwICAgNTFCRTMyMDAgICAgICAgICBmc3ViLnNzZCAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDBGNCAgIDQwMDAwMDAwIAorICAgICAgIDMyIDAwMDAwMEY4ICAgNTFCRTMwMDAgICAgICAgICBmc3ViLnNzcyAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDBGQyAgIDQwMDAwMDAwIAorCisgTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTJiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCkBAIC0wLDAgKzEsMzIgQEAKKwlmYWRkLnNkZAkwZjEuMEUyMyxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQorCWZhZGQuc3NkCTBmLTEuMEUyMyxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQorCWZhZGQuc3NzCTBmMS4wRS0yMyxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQorCWZjbXAuc2QJCTBmLTEuMEUtMjMscjgscjEwCTsgSW1tZWRpYXRlIGZvcm0KKwlmY21wLnNzCQkwZjAuMCxyOCxyMTAJOyBJbW1lZGlhdGUgZm9ybQorCWZkaXYuc2RkCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCisJZmRpdi5zc2QJMGYwLjUscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KKwlmZGl2LnNzcwkwZjQwOTYuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQorCWZtcHkuc2RkCTBmLTQwOTYuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQorCWZtcHkuc3NkCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCisJZm1weS5zc3MJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KKwlmcm5kbS5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQorCWZybmRtLnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCisJZnJuZG0uc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KKwlmcm5kbS5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQorCWZybmRuLnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCisJZnJuZG4uc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KKwlmcm5kbi5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQorCWZybmRuLnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCisJZnJuZHAuc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KKwlmcm5kcC5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQorCWZybmRwLnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCisJZnJuZHAuc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KKwlmcm5kei5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQorCWZybmR6LnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCisJZnJuZHouc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KKwlmcm5kei5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQorCWZzcXJ0LnNkCTBmMi4wLHIxMAkJOyBJbW1lZGlhdGUgZm9ybQorCWZzcXJ0LnNzCTBmMi4wLHIxMAkJOyBJbW1lZGlhdGUgZm9ybQorCWZzdWIuc2RkCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCisJZnN1Yi5zc2QJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KKwlmc3ViLnNzcwkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBmYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmQKQEAgLTAsMCArMSwxODggQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzCisKKy4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzAwMDAwMDAwIDwudGV4dD46CisgICAwOgkwMyAwMCAzYiAyOS4qCisgICA0OgkwMyAyMCAzYiAyOS4qCisgICA4OgkwNSAyMCAzMiAxMS4qCisgICBjOgkwNSAyMCAzMiAxMS4qCisgIDEwOgkwYSAwMCAzMyA3My4qCisgIDE0OgkwYSA4MCAzMiA3My4qCisgIDE4OgkwYSA0MCAzMiA3My4qCisgIDFjOgkwYSA0MCAzOSAxYS4qCisgIDIwOgkwYSA2MCAzOSBmYS4qCisgIDI0OgkwYSAwMCAzOSAyMi4qCisgIDI4OgkwYSAyMCAzOSAyYS4qCisgIDJjOgkwNCA4MCBiOSAyMS4qCisgIDMwOgkwNCBhMCBiOSAyMS4qCisgIDM0OgkwNiAwMCAzOSAwMC4qCisgIDM4OgkwNiAyMCAzOSAwMC4qCisgIDNjOgkwYSAwMCAwMyAwMC4qCisgIDQwOgkwNiAwMCAzOCBmOC4qCisgIDQ0OgkwNiAyMCAzOCBmOC4qCisgIDQ4OgkwNyA0MCAzMCAwMC4qCisgIDRjOgkwMyAwMCAzYSAyOS4qCisgIDUwOgkwOCAwMCBiNyAwMi4qCisgIDU0OgkwOCAwMCBiNyAwYS4qCisgIDU4OgkwNCAwNCBiNCA0MS4qCisgIDVjOgkwNCAyNCBiNCA0MS4qCisgIDYwOgkwNCA0NCBiNCA0MS4qCisgIDY0OgkwNCA2NCBiNCA0MS4qCisgIDY4OgkwNCAwNCBiNSA0MS4qCisgIDZjOgkwNCAyNCBiNSA0MS4qCisgIDcwOgkwNCAwNCBiNiA0MS4qCisgIDc0OgkwNCAyNCBiNiA0MS4qCisgIDc4OgkwNCA0NCBiNiA0MS4qCisgIDdjOgkwNCA2NCBiNiA0MS4qCisgIDgwOgkwNSAyMCAzMCAwOC4qCisgIDg0OgllMyA0NyA3MSAzMS4qCisgIDg4OgljMiAwNyA3MSA0OS4qCisgIDhjOgkwMiAwMCAzZSAzMS4qCisgIDkwOgkwMiAwMiAzZSAzMS4qCisgIDk0Ogk4MiAwMiAzZSAzMS4qCisgIDk4OgkyMiAwMiAzZSAzMS4qCisgIDljOglhMiAwMiAzZSAzMS4qCisgIGEwOgkwNCBhMCBiZSA0MS4qCisgIGE0Ogk4NCBhMCBiZSA0MS4qCisgIGE4OgkyNCBhMCBiZSA0MS4qCisgIGFjOglhNCBhMCBiZSA0MS4qCisgIGIwOgkwMiA2MCAzZSAzMS4qCisgIGI0OgkwMiA2MiAzZSAzMS4qCisgIGI4Ogk4MiA2MiAzZSAzMS4qCisgIGJjOgkyMiA2MiAzZSAzMS4qCisgIGMwOglhMiA2MiAzZSAzMS4qCisgIGM0OgkwMiA0MCAzZSAzMS4qCisgIGM4OgkwMiA0MiAzZSAzMS4qCisgIGNjOgk4MiA0MiAzZSAzMS4qCisgIGQwOgkyMiA0MiAzZSAzMS4qCisgIGQ0OglhMiA0MiAzZSAzMS4qCisgIGQ4Ogk0MiA0NSAzZSAzMS4qCisgIGRjOgllMiA0NyAzZSAzMS4qCisgIGUwOgk4NCA4MSAzZSAzMC4qCisgIGU0Ogk4NCA4MyAzZSAzMC4qCisgIGU4Ogk4NCA4NSAzZSAzMC4qCisgIGVjOgk4NCA4NyAzZSAzMC4qCisgIGYwOglhMiA4MSAzZSA0MC4qCisgIGY0OglhMiA4MyAzZSA0MC4qCisgIGY4OglhMiA4NSAzZSA0MC4qCisgIGZjOglhMiA4NyAzZSA0MC4qCisgMTAwOgljNCA4MSAzZSAzMC4qCisgMTA0OgljNCA4MyAzZSAzMC4qCisgMTA4OgllMiA4MSAzZSA0MC4qCisgMTBjOgllMiA4MyAzZSA0MC4qCisgMTEwOgkwNCA4MCAzZSAzMC4qCisgMTE0OgkwNCA4MiAzZSAzMC4qCisgMTE4OgkwNCA4NCAzZSAzMC4qCisgMTFjOgkwNCA4NiAzZSAzMC4qCisgMTIwOgkyMiA4MCAzZSA0MC4qCisgMTI0OgkyMiA4MiAzZSA0MC4qCisgMTI4OgkyMiA4NCAzZSA0MC4qCisgMTJjOgkyMiA4NiAzZSA0MC4qCisgMTMwOgk0NCA4MCAzZSAzMC4qCisgMTM0Ogk0NCA4MiAzZSAzMC4qCisgMTM4Ogk2MiA4MCAzZSA0MC4qCisgMTNjOgk2MiA4MiAzZSA0MC4qCisgMTQwOgkwNCA4MSAzZSAzMC4qCisgMTQ0OgkwNCA4MyAzZSAzMC4qCisgMTQ4OgkwNCA4NSAzZSAzMC4qCisgMTRjOgkwNCA4NyAzZSAzMC4qCisgMTUwOgkyMiA4MSAzZSA0MC4qCisgMTU0OgkyMiA4MyAzZSA0MC4qCisgMTU4OgkyMiA4NSAzZSA0MC4qCisgMTVjOgkyMiA4NyAzZSA0MC4qCisgMTYwOgk0NCA4MSAzZSAzMC4qCisgMTY0Ogk0NCA4MyAzZSAzMC4qCisgMTY4Ogk2MiA4MSAzZSA0MC4qCisgMTZjOgk2MiA4MyAzZSA0MC4qCisgMTcwOgk4NCA4MCAzZSAzMC4qCisgMTc0Ogk4NCA4MiAzZSAzMC4qCisgMTc4Ogk4NCA4NCAzZSAzMC4qCisgMTdjOgk4NCA4NiAzZSAzMC4qCisgMTgwOglhMiA4MCAzZSA0MC4qCisgMTg0OglhMiA4MiAzZSA0MC4qCisgMTg4OglhMiA4NCAzZSA0MC4qCisgMThjOglhMiA4NiAzZSA0MC4qCisgMTkwOgljNCA4MCAzZSAzMC4qCisgMTk0OgljNCA4MiAzZSAzMC4qCisgMTk4OgllMiA4MCAzZSA0MC4qCisgMTljOgllMiA4MiAzZSA0MC4qCisgMWEwOgkwNiBlMCAzZSA0MC4qCisgMWE0OgkwNiBlMiAzZSA0MC4qCisgMWE4OgkyNiBlMiAzZSA0MC4qCisgMWFjOgkwMiAyMCAzZSAzMS4qCisgMWIwOgkwMiAyMiAzZSAzMS4qCisgMWI0Ogk4MiAyMiAzZSAzMS4qCisgMWI4OgkyMiAyMiAzZSAzMS4qCisgMWJjOglhMiAyMiAzZSAzMS4qCisgMWMwOgllNCBlMyAzMSA1Mi4qCisgMWM0OgkwNCA4MCBiOCA0MS4qCisgMWM4OgkwNCBhMCBiOCA0MS4qCisgMWNjOgkwNCAwMCBiNCA0MS4qCisgMWQwOgkwNCAyMCBiNCA0MS4qCisgMWQ0OgkwNCA0MCBiNCA0MS4qCisgMWQ4OgkwNCA2MCBiNCA0MS4qCisgMWRjOgkwNCAwMCBiNSA0MS4qCisgMWUwOgkwNCAyMCBiNSA0MS4qCisgMWU0OgkwMCAwMCBmZiA0MS4qCisgMWU4OgkwMSBlMCBiMiAxOC4qCisgMWVjOgkwMSBlMCBiMiAxOC4qCisgMWYwOgkwMSBjMCBiMyAxOC4qCisgMWY0OgkwMSBhMCBiMyAxOC4qCisgMWY4OgkwMSA2MCBiMyAxOC4qCisgMWZjOgkwNiA4MCAzMCAyMC4qCisgMjAwOgkwMCAyMCAzZiAyOS4qCisgMjA0OgllMiAwMyAzMSA1Mi4qCisgMjA4OgllOCAwNyBiMSAzMC4qCisgMjBjOgllNCBjMyBiMSAzMC4qCisgMjEwOgk4NCAwMSA3MSAzMS4qCisgMjE0Ogk4NCAyMSA3MSAzMS4qCisgMjE4Ogk4NCA0MSA3MSAzMS4qCisgMjFjOgk4NCA2MSA3MSAzMS4qCisgMjIwOgk4NCA4MSA3MSAzMS4qCisgMjI0Ogk4NCBhMSA3MSAzMS4qCisgMjI4Ogk4NCBjMSA3MSAzMS4qCisgMjJjOgk4NCBlMSA3MSAzMS4qCisgMjMwOgk4NCAwOSA3MSAzMS4qCisgMjM0Ogk4NCAyOSA3MSAzMS4qCisgMjM4Ogk4NCA0OSA3MSAzMS4qCisgMjNjOgk4NCA2OSA3MSAzMS4qCisgMjQwOgk4NCA4OSA3MSAzMS4qCisgMjQ0Ogk4NCBhOSA3MSAzMS4qCisgMjQ4Ogk4NCBjOSA3MSAzMS4qCisgMjRjOgk4NCBlOSA3MSAzMS4qCisgMjUwOgk4NCAwNSA3MSAzMS4qCisgMjU0Ogk4NCAyNSA3MSAzMS4qCisgMjU4Ogk4NCA0NSA3MSAzMS4qCisgMjVjOgk4NCA2NSA3MSAzMS4qCisgMjYwOgk4NCA4NSA3MSAzMS4qCisgMjY0Ogk4NCBhNSA3MSAzMS4qCisgMjY4Ogk4NCBjNSA3MSAzMS4qCisgMjZjOgk4NCBlNSA3MSAzMS4qCisgMjcwOgkwNCBhNCBiMSA0MS4qCisgMjc0Ogk4NCAwZCA3MSAzMS4qCisgMjc4Ogk4NCAyZCA3MSAzMS4qCisgMjdjOgk4NCA0ZCA3MSAzMS4qCisgMjgwOgk4NCA2ZCA3MSAzMS4qCisgMjg0Ogk4NCA4ZCA3MSAzMS4qCisgMjg4Ogk4NCBhZCA3MSAzMS4qCisgMjhjOgk4NCBjZCA3MSAzMS4qCisgMjkwOgk4NCBlZCA3MSAzMS4qCisgMjk0OgkwNCA2NCBiMSA0MS4qCisgMjk4OgkwNCAwMCBiNiA0MS4qCisgMjljOgkwNCAyMCBiNiA0MS4qCisgMmEwOgkwNCA0MCBiNiA0MS4qCisgMmE0OgkwNCA2MCBiNiA0MS4qCisgMmE4OgkwNyA0MCAzYiA0YS4qCisgMmFjOgkwNyA2MCAzYiA0YS4qCisgMmIwOgkwOCBhMCBiMCAyMS4qCisgMmI0OgkwYSAyMCAzMCAwMC4qCisgMmI4OgkwMiAwMCAzYyAwMS4qCisgMmJjOgk4MiAwMCBiYyAwMS4qCisgMmMwOglhMiAwMCBiYyAwMi4qCisgMmM0OgkwNiBhMCA3MCAwMS4qCisgMmM4OgkwNSAyMCBiMyAzOS4qCisgMmNjOgkwNyBjMCAzMiA0YS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODg5ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmxzdApAQCAtMCwwICsxLDI2NCBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFNpbXBsZSByZWdpc3RlciBmb3JtcworICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgVGhvc2UgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFsc28gdXNlIGFuIGltbWVkaWF0ZSBqdXN0IHVzZSBhIGNvbnN0YW50LgorICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDQgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC50ZXh0CisgICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgNiAwMDAwMDAwMCAgIDI5M0IwMDAzICAgICAgICAgYWRkICAgICAgICAgICAgIHIzLHI0LHI1CisgICAgICAgIDcgMDAwMDAwMDQgICAyOTNCMjAwMyAgICAgICAgIGFkZHUgICAgICAgICAgICByMyxyNCxyNQorICAgICAgICA4IDAwMDAwMDA4ICAgMTEzMjIwMDUgICAgICAgICBhbmQgICAgICAgICAgICAgcjUscjQscjIKKyAgICAgICAgOSAwMDAwMDAwQyAgIDExMzIyMDA1ICAgICAgICAgYW5kLnR0ICAgICAgICAgIHI1LHI0LHIyCisgICAgICAgMTAgMDAwMDAwMTAgICA3MzMzMDAwQSAgICAgICAgIGFuZC5mZiAgICAgICAgICByMTAscjEyLHIxNAorICAgICAgIDExIDAwMDAwMDE0ICAgNzMzMjgwMEEgICAgICAgICBhbmQuZnQgICAgICAgICAgcjEwLHIxMixyMTQKKyAgICAgICAxMiAwMDAwMDAxOCAgIDczMzI0MDBBICAgICAgICAgYW5kLnRmICAgICAgICAgIHIxMCxyMTIscjE0CisgICAgICAgMTMgMDAwMDAwMUMgICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgICAgICAgICByMTAscjgsbG8udworICAgICAgIDE0IDAwMDAwMDIwICAgRkEzOTYwMEEgICAgICAgICBiYm8uYSAgICAgICAgICAgcjEwLHI4LGVxLmIKKyAgICAgICAxNSAwMDAwMDAyNCAgIDIyMzkwMDBBICAgICAgICAgYmJ6ICAgICAgICAgICAgIHIxMCxyOCxscy53CisgICAgICAgMTYgMDAwMDAwMjggICAyQTM5MjAwQSAgICAgICAgIGJiei5hICAgICAgICAgICByMTAscjgsaGkudworICAgICAgIDE3IDAwMDAwMDJDICAgMjFCOTgwMDQgICAgICAgICBiY25kICAgICAgICAgICAgcjQscjYsbHQwLmIKKyAgICAgICAxOCAwMDAwMDAzMCAgIDIxQjlBMDA0ICAgICAgICAgYmNuZC5hICAgICAgICAgIHI0LHI2LGx0MC5iCisgICAgICAgMTkgMDAwMDAwMzQgICAwMDM5MDAwNiAgICAgICAgIGJyICAgICAgICAgICAgICByNgorICAgICAgIDIwIDAwMDAwMDM4ICAgMDAzOTIwMDYgICAgICAgICBici5hICAgICAgICAgICAgcjYKKyAgICAgICAyMSAwMDAwMDAzQyAgIDAwMDMwMDBBICAgICAgICAgYnJjciAgICAgICAgICAgIDEwCisgICAgICAgMjIgMDAwMDAwNDAgICBGODM4MDAwNiAgICAgICAgIGJzciAgICAgICAgICAgICByNixyMzEKKyAgICAgICAyMyAwMDAwMDA0NCAgIEY4MzgyMDA2ICAgICAgICAgYnNyLmEgICAgICAgICAgIHI2LHIzMQorICAgICAgIDI0IDAwMDAwMDQ4ICAgMDAzMDQwMDcgICAgICAgICBjbW5kICAgICAgICAgICAgcjcKKyAgICAgICAyNSAwMDAwMDA0QyAgIDI5M0EwMDAzICAgICAgICAgY21wICAgICAgICAgICAgIHIzLHI0LHI1CisgICAgICAgMjYgMDAwMDAwNTAgICAwMkI3MDAwOCAgICAgICAgIGRjYWNoZWMgICAgICAgICByOChyMTApCisgICAgICAgMjcgMDAwMDAwNTQgICAwQUI3MDAwOCAgICAgICAgIGRjYWNoZWYgICAgICAgICByOChyMTApCisgICAgICAgMjggMDAwMDAwNTggICA0MUI0MDQwNCAgICAgICAgIGRsZC5iICAgICAgICAgICByNChyNikscjgKKyAgICAgICAyOSAwMDAwMDA1QyAgIDQxQjQyNDA0ICAgICAgICAgZGxkLmggICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgIDMwIDAwMDAwMDYwICAgNDFCNDQ0MDQgICAgICAgICBkbGQgICAgICAgICAgICAgcjQocjYpLHI4CisgICAgICAgMzEgMDAwMDAwNjQgICA0MUI0NjQwNCAgICAgICAgIGRsZC5kICAgICAgICAgICByNChyNikscjgKKyAgICAgICAzMiAwMDAwMDA2OCAgIDQxQjUwNDA0ICAgICAgICAgZGxkLnViICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgIDMzIDAwMDAwMDZDICAgNDFCNTI0MDQgICAgICAgICBkbGQudWggICAgICAgICAgcjQocjYpLHI4CisgICAgICAgMzQgMDAwMDAwNzAgICA0MUI2MDQwNCAgICAgICAgIGRzdC5iICAgICAgICAgICByNChyNikscjgKKyAgICAgICAzNSAwMDAwMDA3NCAgIDQxQjYyNDA0ICAgICAgICAgZHN0LmggICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgIDM2IDAwMDAwMDc4ICAgNDFCNjQ0MDQgICAgICAgICBkc3QgICAgICAgICAgICAgcjQocjYpLHI4CisgICAgICAgMzcgMDAwMDAwN0MgICA0MUI2NjQwNCAgICAgICAgIGRzdC5kICAgICAgICAgICByNChyNikscjgKKyAgICAgICAzOCAwMDAwMDA4MCAgIDA4MzAyMDA1ICAgICAgICAgZXRyYXAgICAgICAgICAgIHI1CisgICAgICAgMzkgMDAwMDAwODQgICAzMTcxNDdFMyAgICAgICAgIGV4dHMgICAgICAgICAgICByMywzMSxyNSxyNgorICAgICAgIDQwIDAwMDAwMDg4ICAgNDk3MTA3QzIgICAgICAgICBleHR1ICAgICAgICAgICAgcjIsMzAscjUscjkKKyAgICAgICA0MSAwMDAwMDA4QyAgIDMxM0UwMDAyICAgICAgICAgZmFkZC5zc3MgICAgICAgIHIyLHI0LHI2CisgICAgICAgNDIgMDAwMDAwOTAgICAzMTNFMDIwMiAgICAgICAgIGZhZGQuc3NkICAgICAgICByMixyNCxyNgorICAgICAgIDQzIDAwMDAwMDk0ICAgMzEzRTAyODIgICAgICAgICBmYWRkLnNkZCAgICAgICAgcjIscjQscjYKKyAgICAgICA0NCAwMDAwMDA5OCAgIDMxM0UwMjIyICAgICAgICAgZmFkZC5kc2QgICAgICAgIHIyLHI0LHI2CisgICAgICAgNDUgMDAwMDAwOUMgICAzMTNFMDJBMiAgICAgICAgIGZhZGQuZGRkICAgICAgICByMixyNCxyNgorICAgICAgIDQ2IDAwMDAwMEEwICAgNDFCRUEwMDQgICAgICAgICBmY21wLnNzICAgICAgICAgcjQscjYscjgKKyAgICAgICA0NyAwMDAwMDBBNCAgIDQxQkVBMDg0ICAgICAgICAgZmNtcC5zZCAgICAgICAgIHI0LHI2LHI4CisgICAgICAgNDggMDAwMDAwQTggICA0MUJFQTAyNCAgICAgICAgIGZjbXAuZHMgICAgICAgICByNCxyNixyOAorICAgICAgIDQ5IDAwMDAwMEFDICAgNDFCRUEwQTQgICAgICAgICBmY21wLmRkICAgICAgICAgcjQscjYscjgKKyAgICAgICA1MCAwMDAwMDBCMCAgIDMxM0U2MDAyICAgICAgICAgZmRpdi5zc3MgICAgICAgIHIyLHI0LHI2CisgICAgICAgNTEgMDAwMDAwQjQgICAzMTNFNjIwMiAgICAgICAgIGZkaXYuc3NkICAgICAgICByMixyNCxyNgorICAgICAgIDUyIDAwMDAwMEI4ICAgMzEzRTYyODIgICAgICAgICBmZGl2LnNkZCAgICAgICAgcjIscjQscjYKKyAgICAgICA1MyAwMDAwMDBCQyAgIDMxM0U2MjIyICAgICAgICAgZmRpdi5kc2QgICAgICAgIHIyLHI0LHI2CisgICAgICAgNTQgMDAwMDAwQzAgICAzMTNFNjJBMiAgICAgICAgIGZkaXYuZGRkICAgICAgICByMixyNCxyNgorICAgICAgIDU1IDAwMDAwMEM0ICAgMzEzRTQwMDIgICAgICAgICBmbXB5LnNzcyAgICAgICAgcjIscjQscjYKKwxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NworQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAorCityZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKKworICAgICAgIDU2IDAwMDAwMEM4ICAgMzEzRTQyMDIgICAgICAgICBmbXB5LnNzZCAgICAgICAgcjIscjQscjYKKyAgICAgICA1NyAwMDAwMDBDQyAgIDMxM0U0MjgyICAgICAgICAgZm1weS5zZGQgICAgICAgIHIyLHI0LHI2CisgICAgICAgNTggMDAwMDAwRDAgICAzMTNFNDIyMiAgICAgICAgIGZtcHkuZHNkICAgICAgICByMixyNCxyNgorICAgICAgIDU5IDAwMDAwMEQ0ICAgMzEzRTQyQTIgICAgICAgICBmbXB5LmRkZCAgICAgICAgcjIscjQscjYKKyAgICAgICA2MCAwMDAwMDBEOCAgIDMxM0U0NTQyICAgICAgICAgZm1weS5paWkgICAgICAgIHIyLHI0LHI2CisgICAgICAgNjEgMDAwMDAwREMgICAzMTNFNDdFMiAgICAgICAgIGZtcHkudXV1ICAgICAgICByMixyNCxyNgorICAgICAgIDYyIDAwMDAwMEUwICAgMzAzRTgxODQgICAgICAgICBmcm5kbS5zcyAgICAgICAgcjQscjYKKyAgICAgICA2MyAwMDAwMDBFNCAgIDMwM0U4Mzg0ICAgICAgICAgZnJuZG0uc2QgICAgICAgIHI0LHI2CisgICAgICAgNjQgMDAwMDAwRTggICAzMDNFODU4NCAgICAgICAgIGZybmRtLnNpICAgICAgICByNCxyNgorICAgICAgIDY1IDAwMDAwMEVDICAgMzAzRTg3ODQgICAgICAgICBmcm5kbS5zdSAgICAgICAgcjQscjYKKyAgICAgICA2NiAwMDAwMDBGMCAgIDQwM0U4MUEyICAgICAgICAgZnJuZG0uZHMgICAgICAgIHIyLHI4CisgICAgICAgNjcgMDAwMDAwRjQgICA0MDNFODNBMiAgICAgICAgIGZybmRtLmRkICAgICAgICByMixyOAorICAgICAgIDY4IDAwMDAwMEY4ICAgNDAzRTg1QTIgICAgICAgICBmcm5kbS5kaSAgICAgICAgcjIscjgKKyAgICAgICA2OSAwMDAwMDBGQyAgIDQwM0U4N0EyICAgICAgICAgZnJuZG0uZHUgICAgICAgIHIyLHI4CisgICAgICAgNzAgMDAwMDAxMDAgICAzMDNFODFDNCAgICAgICAgIGZybmRtLmlzICAgICAgICByNCxyNgorICAgICAgIDcxIDAwMDAwMTA0ICAgMzAzRTgzQzQgICAgICAgICBmcm5kbS5pZCAgICAgICAgcjQscjYKKyAgICAgICA3MiAwMDAwMDEwOCAgIDQwM0U4MUUyICAgICAgICAgZnJuZG0udXMgICAgICAgIHIyLHI4CisgICAgICAgNzMgMDAwMDAxMEMgICA0MDNFODNFMiAgICAgICAgIGZybmRtLnVkICAgICAgICByMixyOAorICAgICAgIDc0IDAwMDAwMTEwICAgMzAzRTgwMDQgICAgICAgICBmcm5kbi5zcyAgICAgICAgcjQscjYKKyAgICAgICA3NSAwMDAwMDExNCAgIDMwM0U4MjA0ICAgICAgICAgZnJuZG4uc2QgICAgICAgIHI0LHI2CisgICAgICAgNzYgMDAwMDAxMTggICAzMDNFODQwNCAgICAgICAgIGZybmRuLnNpICAgICAgICByNCxyNgorICAgICAgIDc3IDAwMDAwMTFDICAgMzAzRTg2MDQgICAgICAgICBmcm5kbi5zdSAgICAgICAgcjQscjYKKyAgICAgICA3OCAwMDAwMDEyMCAgIDQwM0U4MDIyICAgICAgICAgZnJuZG4uZHMgICAgICAgIHIyLHI4CisgICAgICAgNzkgMDAwMDAxMjQgICA0MDNFODIyMiAgICAgICAgIGZybmRuLmRkICAgICAgICByMixyOAorICAgICAgIDgwIDAwMDAwMTI4ICAgNDAzRTg0MjIgICAgICAgICBmcm5kbi5kaSAgICAgICAgcjIscjgKKyAgICAgICA4MSAwMDAwMDEyQyAgIDQwM0U4NjIyICAgICAgICAgZnJuZG4uZHUgICAgICAgIHIyLHI4CisgICAgICAgODIgMDAwMDAxMzAgICAzMDNFODA0NCAgICAgICAgIGZybmRuLmlzICAgICAgICByNCxyNgorICAgICAgIDgzIDAwMDAwMTM0ICAgMzAzRTgyNDQgICAgICAgICBmcm5kbi5pZCAgICAgICAgcjQscjYKKyAgICAgICA4NCAwMDAwMDEzOCAgIDQwM0U4MDYyICAgICAgICAgZnJuZG4udXMgICAgICAgIHIyLHI4CisgICAgICAgODUgMDAwMDAxM0MgICA0MDNFODI2MiAgICAgICAgIGZybmRuLnVkICAgICAgICByMixyOAorICAgICAgIDg2IDAwMDAwMTQwICAgMzAzRTgxMDQgICAgICAgICBmcm5kcC5zcyAgICAgICAgcjQscjYKKyAgICAgICA4NyAwMDAwMDE0NCAgIDMwM0U4MzA0ICAgICAgICAgZnJuZHAuc2QgICAgICAgIHI0LHI2CisgICAgICAgODggMDAwMDAxNDggICAzMDNFODUwNCAgICAgICAgIGZybmRwLnNpICAgICAgICByNCxyNgorICAgICAgIDg5IDAwMDAwMTRDICAgMzAzRTg3MDQgICAgICAgICBmcm5kcC5zdSAgICAgICAgcjQscjYKKyAgICAgICA5MCAwMDAwMDE1MCAgIDQwM0U4MTIyICAgICAgICAgZnJuZHAuZHMgICAgICAgIHIyLHI4CisgICAgICAgOTEgMDAwMDAxNTQgICA0MDNFODMyMiAgICAgICAgIGZybmRwLmRkICAgICAgICByMixyOAorICAgICAgIDkyIDAwMDAwMTU4ICAgNDAzRTg1MjIgICAgICAgICBmcm5kcC5kaSAgICAgICAgcjIscjgKKyAgICAgICA5MyAwMDAwMDE1QyAgIDQwM0U4NzIyICAgICAgICAgZnJuZHAuZHUgICAgICAgIHIyLHI4CisgICAgICAgOTQgMDAwMDAxNjAgICAzMDNFODE0NCAgICAgICAgIGZybmRwLmlzICAgICAgICByNCxyNgorICAgICAgIDk1IDAwMDAwMTY0ICAgMzAzRTgzNDQgICAgICAgICBmcm5kcC5pZCAgICAgICAgcjQscjYKKyAgICAgICA5NiAwMDAwMDE2OCAgIDQwM0U4MTYyICAgICAgICAgZnJuZHAudXMgICAgICAgIHIyLHI4CisgICAgICAgOTcgMDAwMDAxNkMgICA0MDNFODM2MiAgICAgICAgIGZybmRwLnVkICAgICAgICByMixyOAorICAgICAgIDk4IDAwMDAwMTcwICAgMzAzRTgwODQgICAgICAgICBmcm5kei5zcyAgICAgICAgcjQscjYKKyAgICAgICA5OSAwMDAwMDE3NCAgIDMwM0U4Mjg0ICAgICAgICAgZnJuZHouc2QgICAgICAgIHI0LHI2CisgICAgICAxMDAgMDAwMDAxNzggICAzMDNFODQ4NCAgICAgICAgIGZybmR6LnNpICAgICAgICByNCxyNgorICAgICAgMTAxIDAwMDAwMTdDICAgMzAzRTg2ODQgICAgICAgICBmcm5kei5zdSAgICAgICAgcjQscjYKKyAgICAgIDEwMiAwMDAwMDE4MCAgIDQwM0U4MEEyICAgICAgICAgZnJuZHouZHMgICAgICAgIHIyLHI4CisgICAgICAxMDMgMDAwMDAxODQgICA0MDNFODJBMiAgICAgICAgIGZybmR6LmRkICAgICAgICByMixyOAorICAgICAgMTA0IDAwMDAwMTg4ICAgNDAzRTg0QTIgICAgICAgICBmcm5kei5kaSAgICAgICAgcjIscjgKKyAgICAgIDEwNSAwMDAwMDE4QyAgIDQwM0U4NkEyICAgICAgICAgZnJuZHouZHUgICAgICAgIHIyLHI4CisgICAgICAxMDYgMDAwMDAxOTAgICAzMDNFODBDNCAgICAgICAgIGZybmR6LmlzICAgICAgICByNCxyNgorICAgICAgMTA3IDAwMDAwMTk0ICAgMzAzRTgyQzQgICAgICAgICBmcm5kei5pZCAgICAgICAgcjQscjYKKyAgICAgIDEwOCAwMDAwMDE5OCAgIDQwM0U4MEUyICAgICAgICAgZnJuZHoudXMgICAgICAgIHIyLHI4CisgICAgICAxMDkgMDAwMDAxOUMgICA0MDNFODJFMiAgICAgICAgIGZybmR6LnVkICAgICAgICByMixyOAorICAgICAgMTEwIDAwMDAwMUEwICAgNDAzRUUwMDYgICAgICAgICBmc3FydC5zcyAgICAgICAgcjYscjgKKwxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NworQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAorCityZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDMKKworICAgICAgMTExIDAwMDAwMUE0ICAgNDAzRUUyMDYgICAgICAgICBmc3FydC5zZCAgICAgICAgcjYscjgKKyAgICAgIDExMiAwMDAwMDFBOCAgIDQwM0VFMjI2ICAgICAgICAgZnNxcnQuZGQgICAgICAgIHI2LHI4CisgICAgICAxMTMgMDAwMDAxQUMgICAzMTNFMjAwMiAgICAgICAgIGZzdWIuc3NzICAgICAgICByMixyNCxyNgorICAgICAgMTE0IDAwMDAwMUIwICAgMzEzRTIyMDIgICAgICAgICBmc3ViLnNzZCAgICAgICAgcjIscjQscjYKKyAgICAgIDExNSAwMDAwMDFCNCAgIDMxM0UyMjgyICAgICAgICAgZnN1Yi5zZGQgICAgICAgIHIyLHI0LHI2CisgICAgICAxMTYgMDAwMDAxQjggICAzMTNFMjIyMiAgICAgICAgIGZzdWIuZHNkICAgICAgICByMixyNCxyNgorICAgICAgMTE3IDAwMDAwMUJDICAgMzEzRTIyQTIgICAgICAgICBmc3ViLmRkZCAgICAgICAgcjIscjQscjYKKyAgICAgIDExOCAwMDAwMDFDMCAgIDUyMzFFM0U0ICAgICAgICAgaW5zICAgICAgICAgICAgIHI0LDMxLHI4LHIxMAorICAgICAgMTE5IDAwMDAwMUM0ICAgNDFCODgwMDQgICAgICAgICBqc3IgICAgICAgICAgICAgcjQocjYpLHI4CisgICAgICAxMjAgMDAwMDAxQzggICA0MUI4QTAwNCAgICAgICAgIGpzci5hICAgICAgICAgICByNChyNikscjgKKyAgICAgIDEyMSAwMDAwMDFDQyAgIDQxQjQwMDA0ICAgICAgICAgbGQuYiAgICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgMTIyIDAwMDAwMUQwICAgNDFCNDIwMDQgICAgICAgICBsZC5oICAgICAgICAgICAgcjQocjYpLHI4CisgICAgICAxMjMgMDAwMDAxRDQgICA0MUI0NDAwNCAgICAgICAgIGxkICAgICAgICAgICAgICByNChyNikscjgKKyAgICAgIDEyNCAwMDAwMDFEOCAgIDQxQjQ2MDA0ICAgICAgICAgbGQuZCAgICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgMTI1IDAwMDAwMURDICAgNDFCNTAwMDQgICAgICAgICBsZC51YiAgICAgICAgICAgcjQocjYpLHI4CisgICAgICAxMjYgMDAwMDAxRTAgICA0MUI1MjAwNCAgICAgICAgIGxkLnVoICAgICAgICAgICByNChyNikscjgKKyAgICAgIDEyNyAwMDAwMDFFNCAgIDQxRkYwMDA3ICAgICAgICAgbG1vICAgICAgICAgICAgIHI3LHI4CisgICAgICAxMjggMDAwMDAxRTggICAxOEIyRTAwMSAgICAgICAgIG9yICAgICAgICAgICAgICByMSxyMixyMworICAgICAgMTI5IDAwMDAwMUVDICAgMThCMkUwMDEgICAgICAgICBvci50dCAgICAgICAgICAgcjEscjIscjMKKyAgICAgIDEzMCAwMDAwMDFGMCAgIDE4QjNDMDAxICAgICAgICAgb3IuZmYgICAgICAgICAgIHIxLHIyLHIzCisgICAgICAxMzEgMDAwMDAxRjQgICAxOEIzQTAwMSAgICAgICAgIG9yLmZ0ICAgICAgICAgICByMSxyMixyMworICAgICAgMTMyIDAwMDAwMUY4ICAgMThCMzYwMDEgICAgICAgICBvci50ZiAgICAgICAgICAgcjEscjIscjMKKyAgICAgIDEzMyAwMDAwMDFGQyAgIDIwMzA4MDA2ICAgICAgICAgcmRjciAgICAgICAgICAgIHI2LHI0CisgICAgICAxMzQgMDAwMDAyMDAgICAyOTNGMjAwNCAgICAgICAgIHJtbyAgICAgICAgICAgICByNCxyNQorICAgICAgMTM1IDAwMDAwMjA0ICAgNTIzMTAzRTIgICAgICAgICByb3RsICAgICAgICAgICAgcjIsMzEscjgscjEwCisgICAgICAxMzYgMDAwMDAyMDggICAzMEIxMDdFOCAgICAgICAgIHJvdHIgICAgICAgICAgICByOCwzMSxyMixyNgorICAgICAgMTM3IDAwMDAwMjBDICAgMzBCMUMzRTQgICAgICAgICBzaGwgICAgICAgICAgICAgcjQsMzEscjIscjYKKyAgICAgIDEzOCAwMDAwMDIxMCAgIDMxNzEwMTg0ICAgICAgICAgc2wuZHogICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxMzkgMDAwMDAyMTQgICAzMTcxMjE4NCAgICAgICAgIHNsLmRtICAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTQwIDAwMDAwMjE4ICAgMzE3MTQxODQgICAgICAgICBzbC5kcyAgICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE0MSAwMDAwMDIxQyAgIDMxNzE2MTg0ICAgICAgICAgc2wuZXogICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNDIgMDAwMDAyMjAgICAzMTcxODE4NCAgICAgICAgIHNsLmVtICAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTQzIDAwMDAwMjI0ICAgMzE3MUExODQgICAgICAgICBzbC5lcyAgICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE0NCAwMDAwMDIyOCAgIDMxNzFDMTg0ICAgICAgICAgc2wuaXogICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNDUgMDAwMDAyMkMgICAzMTcxRTE4NCAgICAgICAgIHNsLmltICAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTQ2IDAwMDAwMjMwICAgMzE3MTA5ODQgICAgICAgICBzbGkuZHogICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE0NyAwMDAwMDIzNCAgIDMxNzEyOTg0ICAgICAgICAgc2xpLmRtICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNDggMDAwMDAyMzggICAzMTcxNDk4NCAgICAgICAgIHNsaS5kcyAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTQ5IDAwMDAwMjNDICAgMzE3MTY5ODQgICAgICAgICBzbGkuZXogICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE1MCAwMDAwMDI0MCAgIDMxNzE4OTg0ICAgICAgICAgc2xpLmVtICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNTEgMDAwMDAyNDQgICAzMTcxQTk4NCAgICAgICAgIHNsaS5lcyAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTUyIDAwMDAwMjQ4ICAgMzE3MUM5ODQgICAgICAgICBzbGkuaXogICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE1MyAwMDAwMDI0QyAgIDMxNzFFOTg0ICAgICAgICAgc2xpLmltICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNTQgMDAwMDAyNTAgICAzMTcxMDU4NCAgICAgICAgIHNyLmR6ICAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTU1IDAwMDAwMjU0ICAgMzE3MTI1ODQgICAgICAgICBzci5kbSAgICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE1NiAwMDAwMDI1OCAgIDMxNzE0NTg0ICAgICAgICAgc3IuZHMgICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNTcgMDAwMDAyNUMgICAzMTcxNjU4NCAgICAgICAgIHNyLmV6ICAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTU4IDAwMDAwMjYwICAgMzE3MTg1ODQgICAgICAgICBzci5lbSAgICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE1OSAwMDAwMDI2NCAgIDMxNzFBNTg0ICAgICAgICAgc3IuZXMgICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNjAgMDAwMDAyNjggICAzMTcxQzU4NCAgICAgICAgIHNyLml6ICAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTYxIDAwMDAwMjZDICAgMzE3MUU1ODQgICAgICAgICBzci5pbSAgICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE2MiAwMDAwMDI3MCAgIDQxQjFBNDA0ICAgICAgICAgc3JhICAgICAgICAgICAgIHI0LDMyLHI2LHI4CisgICAgICAxNjMgMDAwMDAyNzQgICAzMTcxMEQ4NCAgICAgICAgIHNyaS5keiAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTY0IDAwMDAwMjc4ICAgMzE3MTJEODQgICAgICAgICBzcmkuZG0gICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE2NSAwMDAwMDI3QyAgIDMxNzE0RDg0ICAgICAgICAgc3JpLmRzICAgICAgICAgIHI0LDEyLHI1LHI2CisMTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICA0CisKKyAgICAgIDE2NiAwMDAwMDI4MCAgIDMxNzE2RDg0ICAgICAgICAgc3JpLmV6ICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNjcgMDAwMDAyODQgICAzMTcxOEQ4NCAgICAgICAgIHNyaS5lbSAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTY4IDAwMDAwMjg4ICAgMzE3MUFEODQgICAgICAgICBzcmkuZXMgICAgICAgICAgcjQsMTIscjUscjYKKyAgICAgIDE2OSAwMDAwMDI4QyAgIDMxNzFDRDg0ICAgICAgICAgc3JpLml6ICAgICAgICAgIHI0LDEyLHI1LHI2CisgICAgICAxNzAgMDAwMDAyOTAgICAzMTcxRUQ4NCAgICAgICAgIHNyaS5pbSAgICAgICAgICByNCwxMixyNSxyNgorICAgICAgMTcxIDAwMDAwMjk0ICAgNDFCMTY0MDQgICAgICAgICBzcmwgICAgICAgICAgICAgcjQsMzIscjYscjgKKyAgICAgIDE3MiAwMDAwMDI5OCAgIDQxQjYwMDA0ICAgICAgICAgc3QuYiAgICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgMTczIDAwMDAwMjlDICAgNDFCNjIwMDQgICAgICAgICBzdC5oICAgICAgICAgICAgcjQocjYpLHI4CisgICAgICAxNzQgMDAwMDAyQTAgICA0MUI2NDAwNCAgICAgICAgIHN0ICAgICAgICAgICAgICByNChyNikscjgKKyAgICAgIDE3NSAwMDAwMDJBNCAgIDQxQjY2MDA0ICAgICAgICAgc3QuZCAgICAgICAgICAgIHI0KHI2KSxyOAorICAgICAgMTc2IDAwMDAwMkE4ICAgNEEzQjQwMDcgICAgICAgICBzdWIgICAgICAgICAgICAgcjcscjgscjkKKyAgICAgIDE3NyAwMDAwMDJBQyAgIDRBM0I2MDA3ICAgICAgICAgc3VidSAgICAgICAgICAgIHI3LHI4LHI5CisgICAgICAxNzggMDAwMDAyQjAgICAyMUIwQTAwOCAgICAgICAgIHN3Y3IgICAgICAgICAgICByOCxyNixyNAorICAgICAgMTc5IDAwMDAwMkI0ICAgMDAzMDIwMEEgICAgICAgICB0cmFwICAgICAgICAgICAgcjEwCisgICAgICAxODAgMDAwMDAyQjggICAwMTNDMDAwMiAgICAgICAgIHZhZGQuc3MgICAgICAgICByMixyNCxyNAorICAgICAgMTgxIDAwMDAwMkJDICAgMDFCQzAwODIgICAgICAgICB2YWRkLnNkICAgICAgICAgcjIscjYscjYKKyAgICAgIDE4MiAwMDAwMDJDMCAgIDAyQkMwMEEyICAgICAgICAgdmFkZC5kZCAgICAgICAgIHIyLHIxMCxyMTAKKyAgICAgIDE4MyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMC5zICAgICAgICAgIHI2CisgICAgICAxODQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDEucyAgICAgICAgICByNworICAgICAgMTg1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bGQwLmQgICAgICAgICAgcjYKKyAgICAgIDE4NiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMS5kICAgICAgICAgIHI4CisgICAgICAxODcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSwwLGEzCisgICAgICAxODggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSwwLHIxMAorICAgICAgMTg5ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksYTEsYTMKKyAgICAgIDE5MCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc3MgICAgICAgIHI3LHI5LGEzLHIxMAorICAgICAgMTkxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksMCxhMAorICAgICAgMTkyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksMCxyMTAKKyAgICAgIDE5MyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LGExLGEyCisgICAgICAxOTQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NkICAgICAgICByNyxyOSxhMyxyMTAKKyAgICAgIDE5NSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1weS5zcyAgICAgICAgIHIxLHIzLHIzCisgICAgICAxOTYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtcHkuc2QgICAgICAgICByNSxyNixyNgorICAgICAgMTk3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXB5LmRkICAgICAgICAgcjIscjQscjQKKyAgICAgIDE5OCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LDAsYTAKKyAgICAgIDE5OSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LDAscjEwCisgICAgICAyMDAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSxhMCxhMQorICAgICAgMjAxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzcyAgICAgICAgcjcscjksYTMscjEwCisgICAgICAyMDIgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSwwLGEwCisgICAgICAyMDMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSwwLHIxMAorICAgICAgMjA0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksYTAsYTEKKyAgICAgIDIwNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc2QgICAgICAgIHI3LHI5LGEzLHIxMAorICAgICAgMjA2ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zcyAgICAgICAgcjYsYTIsYTQKKyAgICAgIDIwNyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc2QgICAgICAgIHI2LGEyLGE0CisgICAgICAyMDggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc3ViLnNzICAgICAgICByNCxhNCxyNgorICAgICAgMjA5ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zZCAgICAgICAgcjQsYTQscjYKKyAgICAgIDIxMCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zaSAgICAgICAgIHI0LHI2CisgICAgICAyMTEgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2kgICAgICAgICByNCxhMAorICAgICAgMjEyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnN1ICAgICAgICAgcjQscjYKKyAgICAgIDIxMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zdSAgICAgICAgIHI0LGEwCisgICAgICAyMTQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc3MgICAgICAgICByNCxyNgorICAgICAgMjE1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNzICAgICAgICAgcjQsYTAKKyAgICAgIDIxNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zZCAgICAgICAgIHI0LHI2CisgICAgICAyMTcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2QgICAgICAgICByNCxhMAorICAgICAgMjE4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRpICAgICAgICAgcjQscjYKKyAgICAgIDIxOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kaSAgICAgICAgIHI0LGEwCisgICAgICAyMjAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHUgICAgICAgICByNCxyNgorDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3CitDb3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCisKK3JlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgNQorCisgICAgICAyMjEgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHUgICAgICAgICByNCxhMAorICAgICAgMjIyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRzICAgICAgICAgcjQscjYKKyAgICAgIDIyMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kcyAgICAgICAgIHI0LGEwCisgICAgICAyMjQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZGQgICAgICAgICByNCxyNgorICAgICAgMjI1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRkICAgICAgICAgcjQsYTAKKyAgICAgIDIyNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5pcyAgICAgICAgIHI0LHI2CisgICAgICAyMjcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuaWQgICAgICAgICByNCxyNgorICAgICAgMjI4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnVzICAgICAgICAgcjQscjYKKyAgICAgIDIyOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC51ZCAgICAgICAgIHI0LHI2CisgICAgICAyMzAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdC5zICAgICAgICAgICByNgorICAgICAgMjMxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3QuZCAgICAgICAgICAgcjYKKyAgICAgIDIzMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN1Yi5zcyAgICAgICAgIHIyLHI0LHI2CisgICAgICAyMzMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdWIuc2QgICAgICAgICByMixyNCxyNgorICAgICAgMjM0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3ViLmRkICAgICAgICAgcjIscjQscjYKKyAgICAgIDIzNSAwMDAwMDJDNCAgIDAxNzBBMDA2ICAgICAgICAgd3JjciAgICAgICAgICAgIHI2LHI1CisgICAgICAyMzYgMDAwMDAyQzggICAzOUIzMjAwNSAgICAgICAgIHhub3IgICAgICAgICAgICByNSxyNixyNworICAgICAgMjM3IDAwMDAwMkNDICAgNEEzMkMwMDcgICAgICAgICB4b3IgICAgICAgICAgICAgcjcscjgscjkKKworIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjkzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucwpAQCAtMCwwICsxLDIzNyBAQAorOzsgU2ltcGxlIHJlZ2lzdGVyIGZvcm1zCis7OyBUaG9zZSBpbnN0cnVjdGlvbnMgd2hpY2ggYWxzbyB1c2UgYW4gaW1tZWRpYXRlIGp1c3QgdXNlIGEgY29uc3RhbnQuCisKKwkudGV4dAorCisJYWRkCQlyMyxyNCxyNQorCWFkZHUJCXIzLHI0LHI1CisJYW5kCQlyNSxyNCxyMgorCWFuZC50dAkJcjUscjQscjIKKwlhbmQuZmYJCXIxMCxyMTIscjE0CisJYW5kLmZ0CQlyMTAscjEyLHIxNAorCWFuZC50ZgkJcjEwLHIxMixyMTQKKwliYm8JCXIxMCxyOCxsby53CisJYmJvLmEJCXIxMCxyOCxlcS5iCisJYmJ6CQlyMTAscjgsbHMudworCWJiei5hCQlyMTAscjgsaGkudworCWJjbmQJCXI0LHI2LGx0MC5iCisJYmNuZC5hCQlyNCxyNixsdDAuYgorCWJyCQlyNgorCWJyLmEJCXI2CisJYnJjcgkJMTAKKwlic3IJCXI2LHIzMQorCWJzci5hCQlyNixyMzEKKwljbW5kCQlyNworCWNtcAkJcjMscjQscjUKKwlkY2FjaGVjCQlyOChyMTApCisJZGNhY2hlZgkJcjgocjEwKQorCWRsZC5iCQlyNChyNikscjgKKwlkbGQuaAkJcjQocjYpLHI4CisJZGxkCQlyNChyNikscjgKKwlkbGQuZAkJcjQocjYpLHI4CisJZGxkLnViCQlyNChyNikscjgKKwlkbGQudWgJCXI0KHI2KSxyOAorCWRzdC5iCQlyNChyNikscjgKKwlkc3QuaAkJcjQocjYpLHI4CisJZHN0CQlyNChyNikscjgKKwlkc3QuZAkJcjQocjYpLHI4CisJZXRyYXAJCXI1CisJZXh0cwkJcjMsMzEscjUscjYKKwlleHR1CQlyMiwzMCxyNSxyOQorCWZhZGQuc3NzCXIyLHI0LHI2CisJZmFkZC5zc2QJcjIscjQscjYKKwlmYWRkLnNkZAlyMixyNCxyNgorCWZhZGQuZHNkCXIyLHI0LHI2CisJZmFkZC5kZGQJcjIscjQscjYKKwlmY21wLnNzCQlyNCxyNixyOAorCWZjbXAuc2QJCXI0LHI2LHI4CisJZmNtcC5kcwkJcjQscjYscjgKKwlmY21wLmRkCQlyNCxyNixyOAorCWZkaXYuc3NzCXIyLHI0LHI2CisJZmRpdi5zc2QJcjIscjQscjYKKwlmZGl2LnNkZAlyMixyNCxyNgorCWZkaXYuZHNkCXIyLHI0LHI2CisJZmRpdi5kZGQJcjIscjQscjYKKwlmbXB5LnNzcwlyMixyNCxyNgorCWZtcHkuc3NkCXIyLHI0LHI2CisJZm1weS5zZGQJcjIscjQscjYKKwlmbXB5LmRzZAlyMixyNCxyNgorCWZtcHkuZGRkCXIyLHI0LHI2CisJZm1weS5paWkJcjIscjQscjYKKwlmbXB5LnV1dQlyMixyNCxyNgorCWZybmRtLnNzCXI0LHI2CisJZnJuZG0uc2QJcjQscjYKKwlmcm5kbS5zaQlyNCxyNgorCWZybmRtLnN1CXI0LHI2CisJZnJuZG0uZHMJcjIscjgKKwlmcm5kbS5kZAlyMixyOAorCWZybmRtLmRpCXIyLHI4CisJZnJuZG0uZHUJcjIscjgKKwlmcm5kbS5pcwlyNCxyNgorCWZybmRtLmlkCXI0LHI2CisJZnJuZG0udXMJcjIscjgKKwlmcm5kbS51ZAlyMixyOAorCWZybmRuLnNzCXI0LHI2CisJZnJuZG4uc2QJcjQscjYKKwlmcm5kbi5zaQlyNCxyNgorCWZybmRuLnN1CXI0LHI2CisJZnJuZG4uZHMJcjIscjgKKwlmcm5kbi5kZAlyMixyOAorCWZybmRuLmRpCXIyLHI4CisJZnJuZG4uZHUJcjIscjgKKwlmcm5kbi5pcwlyNCxyNgorCWZybmRuLmlkCXI0LHI2CisJZnJuZG4udXMJcjIscjgKKwlmcm5kbi51ZAlyMixyOAorCWZybmRwLnNzCXI0LHI2CisJZnJuZHAuc2QJcjQscjYKKwlmcm5kcC5zaQlyNCxyNgorCWZybmRwLnN1CXI0LHI2CisJZnJuZHAuZHMJcjIscjgKKwlmcm5kcC5kZAlyMixyOAorCWZybmRwLmRpCXIyLHI4CisJZnJuZHAuZHUJcjIscjgKKwlmcm5kcC5pcwlyNCxyNgorCWZybmRwLmlkCXI0LHI2CisJZnJuZHAudXMJcjIscjgKKwlmcm5kcC51ZAlyMixyOAorCWZybmR6LnNzCXI0LHI2CisJZnJuZHouc2QJcjQscjYKKwlmcm5kei5zaQlyNCxyNgorCWZybmR6LnN1CXI0LHI2CisJZnJuZHouZHMJcjIscjgKKwlmcm5kei5kZAlyMixyOAorCWZybmR6LmRpCXIyLHI4CisJZnJuZHouZHUJcjIscjgKKwlmcm5kei5pcwlyNCxyNgorCWZybmR6LmlkCXI0LHI2CisJZnJuZHoudXMJcjIscjgKKwlmcm5kei51ZAlyMixyOAorCWZzcXJ0LnNzCXI2LHI4CisJZnNxcnQuc2QJcjYscjgKKwlmc3FydC5kZAlyNixyOAorCWZzdWIuc3NzCXIyLHI0LHI2CisJZnN1Yi5zc2QJcjIscjQscjYKKwlmc3ViLnNkZAlyMixyNCxyNgorCWZzdWIuZHNkCXIyLHI0LHI2CisJZnN1Yi5kZGQJcjIscjQscjYKKwlpbnMJCXI0LDMxLHI4LHIxMAorCWpzcgkJcjQocjYpLHI4CisJanNyLmEJCXI0KHI2KSxyOAorCWxkLmIJCXI0KHI2KSxyOAorCWxkLmgJCXI0KHI2KSxyOAorCWxkCQlyNChyNikscjgKKwlsZC5kCQlyNChyNikscjgKKwlsZC51YgkJcjQocjYpLHI4CisJbGQudWgJCXI0KHI2KSxyOAorCWxtbwkJcjcscjgKKwlvcgkJcjEscjIscjMKKwlvci50dAkJcjEscjIscjMKKwlvci5mZgkJcjEscjIscjMKKwlvci5mdAkJcjEscjIscjMKKwlvci50ZgkJcjEscjIscjMKKwlyZGNyCQlyNixyNAorCXJtbwkJcjQscjUKKwlyb3RsCQlyMiwzMSxyOCxyMTAKKwlyb3RyCQlyOCwzMSxyMixyNgorCXNobAkJcjQsMzEscjIscjYKKwlzbC5kegkJcjQsMTIscjUscjYKKwlzbC5kbQkJcjQsMTIscjUscjYKKwlzbC5kcwkJcjQsMTIscjUscjYKKwlzbC5legkJcjQsMTIscjUscjYKKwlzbC5lbQkJcjQsMTIscjUscjYKKwlzbC5lcwkJcjQsMTIscjUscjYKKwlzbC5pegkJcjQsMTIscjUscjYKKwlzbC5pbQkJcjQsMTIscjUscjYKKwlzbGkuZHoJCXI0LDEyLHI1LHI2CisJc2xpLmRtCQlyNCwxMixyNSxyNgorCXNsaS5kcwkJcjQsMTIscjUscjYKKwlzbGkuZXoJCXI0LDEyLHI1LHI2CisJc2xpLmVtCQlyNCwxMixyNSxyNgorCXNsaS5lcwkJcjQsMTIscjUscjYKKwlzbGkuaXoJCXI0LDEyLHI1LHI2CisJc2xpLmltCQlyNCwxMixyNSxyNgorCXNyLmR6CQlyNCwxMixyNSxyNgorCXNyLmRtCQlyNCwxMixyNSxyNgorCXNyLmRzCQlyNCwxMixyNSxyNgorCXNyLmV6CQlyNCwxMixyNSxyNgorCXNyLmVtCQlyNCwxMixyNSxyNgorCXNyLmVzCQlyNCwxMixyNSxyNgorCXNyLml6CQlyNCwxMixyNSxyNgorCXNyLmltCQlyNCwxMixyNSxyNgorCXNyYQkJcjQsMzIscjYscjgKKwlzcmkuZHoJCXI0LDEyLHI1LHI2CisJc3JpLmRtCQlyNCwxMixyNSxyNgorCXNyaS5kcwkJcjQsMTIscjUscjYKKwlzcmkuZXoJCXI0LDEyLHI1LHI2CisJc3JpLmVtCQlyNCwxMixyNSxyNgorCXNyaS5lcwkJcjQsMTIscjUscjYKKwlzcmkuaXoJCXI0LDEyLHI1LHI2CisJc3JpLmltCQlyNCwxMixyNSxyNgorCXNybAkJcjQsMzIscjYscjgKKwlzdC5iCQlyNChyNikscjgKKwlzdC5oCQlyNChyNikscjgKKwlzdAkJcjQocjYpLHI4CisJc3QuZAkJcjQocjYpLHI4CisJc3ViCQlyNyxyOCxyOQorCXN1YnUJCXI3LHI4LHI5CisJc3djcgkJcjgscjYscjQKKwl0cmFwCQlyMTAKKwl2YWRkLnNzCQlyMixyNCxyNAorCXZhZGQuc2QJCXIyLHI2LHI2CisJdmFkZC5kZAkJcjIscjEwLHIxMAorOwl2bGQwLnMJCXI2Cis7CXZsZDEucwkJcjcKKzsJdmxkMC5kCQlyNgorOwl2bGQxLmQJCXI4Cis7CXZtYWMuc3NzCXI3LHI5LDAsYTMKKzsJdm1hYy5zc3MJcjcscjksMCxyMTAKKzsJdm1hYy5zc3MJcjcscjksYTEsYTMKKzsJdm1hYy5zc3MJcjcscjksYTMscjEwCis7CXZtYWMuc3NkCXI3LHI5LDAsYTAKKzsJdm1hYy5zc2QJcjcscjksMCxyMTAKKzsJdm1hYy5zc2QJcjcscjksYTEsYTIKKzsJdm1hYy5zc2QJcjcscjksYTMscjEwCis7CXZtcHkuc3MJCXIxLHIzLHIzCis7CXZtcHkuc2QJCXI1LHI2LHI2Cis7CXZtcHkuZGQJCXIyLHI0LHI0Cis7CXZtc2Muc3NzCXI3LHI5LDAsYTAKKzsJdm1zYy5zc3MJcjcscjksMCxyMTAKKzsJdm1zYy5zc3MJcjcscjksYTAsYTEKKzsJdm1zYy5zc3MJcjcscjksYTMscjEwCis7CXZtc2Muc3NkCXI3LHI5LDAsYTAKKzsJdm1zYy5zc2QJcjcscjksMCxyMTAKKzsJdm1zYy5zc2QJcjcscjksYTAsYTEKKzsJdm1zYy5zc2QJcjcscjksYTMscjEwCis7CXZtc3ViLnNzCXI2LGEyLGE0Cis7CXZtc3ViLnNkCXI2LGEyLGE0Cis7CXZtc3ViLnNzCXI0LGE0LHI2Cis7CXZtc3ViLnNkCXI0LGE0LHI2Cis7CXZybmQuc2kJCXI0LHI2Cis7CXZybmQuc2kJCXI0LGEwCis7CXZybmQuc3UJCXI0LHI2Cis7CXZybmQuc3UJCXI0LGEwCis7CXZybmQuc3MJCXI0LHI2Cis7CXZybmQuc3MJCXI0LGEwCis7CXZybmQuc2QJCXI0LHI2Cis7CXZybmQuc2QJCXI0LGEwCis7CXZybmQuZGkJCXI0LHI2Cis7CXZybmQuZGkJCXI0LGEwCis7CXZybmQuZHUJCXI0LHI2Cis7CXZybmQuZHUJCXI0LGEwCis7CXZybmQuZHMJCXI0LHI2Cis7CXZybmQuZHMJCXI0LGEwCis7CXZybmQuZGQJCXI0LHI2Cis7CXZybmQuZGQJCXI0LGEwCis7CXZybmQuaXMJCXI0LHI2Cis7CXZybmQuaWQJCXI0LHI2Cis7CXZybmQudXMJCXI0LHI2Cis7CXZybmQudWQJCXI0LHI2Cis7CXZzdC5zCQlyNgorOwl2c3QuZAkJcjYKKzsJdnN1Yi5zcwkJcjIscjQscjYKKzsJdnN1Yi5zZAkJcjIscjQscjYKKzsJdnN1Yi5kZAkJcjIscjQscjYKKwl3cmNyCQlyNixyNQorCXhub3IJCXI1LHI2LHI3CisJeG9yCQlyNyxyOCxyOQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2Y0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQKQEAgLTAsMCArMSw2OCBAQAorI29iamR1bXA6IC1kCisjbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMgd2l0aCA6bSBtb2RpZmllcgorCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8LnRleHQ+OgorICAgMDoJMDggODAgYjcgMDIuKgorICAgNDoJMDQgMDAgOWUgMDIuKgorICAgODoJZmMgN2YgOWUgMDIuKgorICAgYzoJMDAgOTAgYjcgMDIgNzggNTYgMzQgMTIuKgorICAxNDoJMDAgOTAgYjcgMDIgZWYgYmUgYWQgZGUuKgorICAxYzoJMDggODAgYjcgMGEuKgorICAyMDoJMDQgMDAgOWUgMGEuKgorICAyNDoJZmMgN2YgOWUgMGEuKgorICAyODoJMDAgOTAgYjcgMGEgNzggNTYgMzQgMTIuKgorICAzMDoJMDAgOTAgYjcgMGEgZWYgYmUgYWQgZGUuKgorICAzODoJMDQgODQgYjQgNDEuKgorICAzYzoJMDQgYTQgYjQgNDEuKgorICA0MDoJMDQgYzQgYjQgNDEuKgorICA0NDoJMDQgZTQgYjQgNDEuKgorICA0ODoJMDAgOTQgYjQgNDEgMDAgMDAgMDAgZTAuKgorICA1MDoJMDAgYjQgYjQgNDEgMDAgMDAgMDAgZTAuKgorICA1ODoJMDAgZDQgYjQgNDEgMDAgMDAgMDAgZTAuKgorICA2MDoJMDAgZjQgYjQgNDEgMDAgMDAgMDAgZTAuKgorICA2ODoJMDQgODQgYjUgNDEuKgorICA2YzoJMDQgYTQgYjUgNDEuKgorICA3MDoJMDAgOTQgYjUgNDEgMDAgMDAgMDAgZTAuKgorICA3ODoJMDAgYjQgYjUgNDEgMDAgMDAgMDAgZTAuKgorICA4MDoJMDQgODQgYjYgNDEuKgorICA4NDoJMDQgYTQgYjYgNDEuKgorICA4ODoJMDQgYzQgYjYgNDEuKgorICA4YzoJMDQgZTQgYjYgNDEuKgorICA5MDoJMDAgOTQgYjYgNDEgMDAgMDAgMDAgZTAuKgorICA5ODoJMDAgYjQgYjYgNDEgMDAgMDAgMDAgZTAuKgorICBhMDoJMDAgZDQgYjYgNDEgMDAgMDAgMDAgZTAuKgorICBhODoJMDAgZjQgYjYgNDEgMDAgMDAgMDAgZTAuKgorICBiMDoJMDQgODAgYjQgNDEuKgorICBiNDoJMDQgYTAgYjQgNDEuKgorICBiODoJMDQgYzAgYjQgNDEuKgorICBiYzoJMDQgZTAgYjQgNDEuKgorICBjMDoJZjAgN2YgOTIgNDEuKgorICBjNDoJZjAgZmYgOTIgNDEuKgorICBjODoJZjAgN2YgOTMgNDEuKgorICBjYzoJZjAgZmYgOTMgNDEuKgorICBkMDoJMDAgOTAgYjQgNDEgMDAgMDAgMDAgZTAuKgorICBkODoJMDAgYjAgYjQgNDEgMDAgMDAgMDAgZTAuKgorICBlMDoJMDAgZDAgYjQgNDEgMDAgMDAgMDAgZTAuKgorICBlODoJMDAgZjAgYjQgNDEgMDAgMDAgMDAgZTAuKgorICBmMDoJMDQgODAgYjUgNDEuKgorICBmNDoJMDQgYTAgYjUgNDEuKgorICBmODoJZjAgN2YgOTYgNDEuKgorICBmYzoJZjAgZmYgOTYgNDEuKgorIDEwMDoJMDAgOTAgYjUgNDEgMDAgMDAgMDAgZTAuKgorIDEwODoJMDAgYjAgYjUgNDEgMDAgMDAgMDAgZTAuKgorIDExMDoJMDQgODAgYjYgNDEuKgorIDExNDoJMDQgYTAgYjYgNDEuKgorIDExODoJMDQgYzAgYjYgNDEuKgorIDExYzoJMDQgZTAgYjYgNDEuKgorIDEyMDoJMDAgN2YgOWEgNDEuKgorIDEyNDoJMDAgZmYgOWEgNDEuKgorIDEyODoJMDAgN2YgOWIgNDEuKgorIDEyYzoJMDAgZmYgOWIgNDEuKgorIDEzMDoJMDAgOTAgYjYgNDEgMDAgMDAgMDAgZTAuKgorIDEzODoJMDAgYjAgYjYgNDEgMDAgMDAgMDAgZTAuKgorIDE0MDoJMDAgZDAgYjYgNDEgMDAgMDAgMDAgZTAuKgorIDE0ODoJMDAgZjAgYjYgNDEgMDAgMDAgMDAgZTAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTFmYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5sc3QKQEAgLTAsMCArMSw5NiBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE0IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworcmVnb3BzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAwMDAwMDAwMCAgIDAyQjc4MDA4ICAgICAgICAgZGNhY2hlYyByOChyMTA6bSkgICAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQorICAgICAgICAyIDAwMDAwMDA0ICAgMDI5RTAwMDQgICAgICAgICBkY2FjaGVjIDQocjEwOm0pICAgICAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQorICAgICAgICAzIDAwMDAwMDA4ICAgMDI5RTdGRkMgICAgICAgICBkY2FjaGVjIC00KHIxMDptKSAgICAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQorICAgICAgICA0IDAwMDAwMDBDICAgMDJCNzkwMDAgICAgICAgICBkY2FjaGVjIDB4MTIzNDU2NzgocjEwOm0pICAgICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCisgICAgICAgICAgMDAwMDAwMTAgICAxMjM0NTY3OCAKKyAgICAgICAgNSAwMDAwMDAxNCAgIDAyQjc5MDAwICAgICAgICAgZGNhY2hlYyAweERFQURCRUVGKHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQorICAgICAgICAgIDAwMDAwMDE4ICAgREVBREJFRUYgCisgICAgICAgIDYgMDAwMDAwMUMgICAwQUI3ODAwOCAgICAgICAgIGRjYWNoZWYgcjgocjEwOm0pICAgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKKyAgICAgICAgNyAwMDAwMDAyMCAgIDBBOUUwMDA0ICAgICAgICAgZGNhY2hlZiA0KHIxMDptKSAgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKKyAgICAgICAgOCAwMDAwMDAyNCAgIDBBOUU3RkZDICAgICAgICAgZGNhY2hlZiAtNChyMTA6bSkgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKKyAgICAgICAgOSAwMDAwMDAyOCAgIDBBQjc5MDAwICAgICAgICAgZGNhY2hlZiAweDEyMzQ1Njc4KHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQorICAgICAgICAgIDAwMDAwMDJDICAgMTIzNDU2NzggCisgICAgICAgMTAgMDAwMDAwMzAgICAwQUI3OTAwMCAgICAgICAgIGRjYWNoZWYgMHhERUFEQkVFRihyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKKyAgICAgICAgICAwMDAwMDAzNCAgIERFQURCRUVGIAorICAgICAgIDExIDAwMDAwMDM4ICAgNDFCNDg0MDQgICAgICAgICBkbGQuYiAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDEyIDAwMDAwMDNDICAgNDFCNEE0MDQgICAgICAgICBkbGQuaCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDEzIDAwMDAwMDQwICAgNDFCNEM0MDQgICAgICAgICBkbGQgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE0IDAwMDAwMDQ0ICAgNDFCNEU0MDQgICAgICAgICBkbGQuZCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE1IDAwMDAwMDQ4ICAgNDFCNDk0MDAgICAgICAgICBkbGQuYiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMDRDICAgRTAwMDAwMDAgCisgICAgICAgMTYgMDAwMDAwNTAgICA0MUI0QjQwMCAgICAgICAgIGRsZC5oICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNTQgICBFMDAwMDAwMCAKKyAgICAgICAxNyAwMDAwMDA1OCAgIDQxQjRENDAwICAgICAgICAgZGxkICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDA1QyAgIEUwMDAwMDAwIAorICAgICAgIDE4IDAwMDAwMDYwICAgNDFCNEY0MDAgICAgICAgICBkbGQuZCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMDY0ICAgRTAwMDAwMDAgCisgICAgICAgMTkgMDAwMDAwNjggICA0MUI1ODQwNCAgICAgICAgIGRsZC51YiAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMjAgMDAwMDAwNkMgICA0MUI1QTQwNCAgICAgICAgIGRsZC51aCAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMjEgMDAwMDAwNzAgICA0MUI1OTQwMCAgICAgICAgIGRsZC51YiAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwNzQgICBFMDAwMDAwMCAKKyAgICAgICAyMiAwMDAwMDA3OCAgIDQxQjVCNDAwICAgICAgICAgZGxkLnVoICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDA3QyAgIEUwMDAwMDAwIAorICAgICAgIDIzIDAwMDAwMDgwICAgNDFCNjg0MDQgICAgICAgICBkc3QuYiAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDI0IDAwMDAwMDg0ICAgNDFCNkE0MDQgICAgICAgICBkc3QuaCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDI1IDAwMDAwMDg4ICAgNDFCNkM0MDQgICAgICAgICBkc3QgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDI2IDAwMDAwMDhDICAgNDFCNkU0MDQgICAgICAgICBkc3QuZCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDI3IDAwMDAwMDkwICAgNDFCNjk0MDAgICAgICAgICBkc3QuYiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMDk0ICAgRTAwMDAwMDAgCisgICAgICAgMjggMDAwMDAwOTggICA0MUI2QjQwMCAgICAgICAgIGRzdC5oICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwOUMgICBFMDAwMDAwMCAKKyAgICAgICAyOSAwMDAwMDBBMCAgIDQxQjZENDAwICAgICAgICAgZHN0ICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDBBNCAgIEUwMDAwMDAwIAorICAgICAgIDMwIDAwMDAwMEE4ICAgNDFCNkY0MDAgICAgICAgICBkc3QuZCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMEFDICAgRTAwMDAwMDAgCisgICAgICAgMzEgMDAwMDAwQjAgICA0MUI0ODAwNCAgICAgICAgIGxkLmIgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMzIgMDAwMDAwQjQgICA0MUI0QTAwNCAgICAgICAgIGxkLmggICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMzMgMDAwMDAwQjggICA0MUI0QzAwNCAgICAgICAgIGxkICAgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMzQgMDAwMDAwQkMgICA0MUI0RTAwNCAgICAgICAgIGxkLmQgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMzUgMDAwMDAwQzAgICA0MTkyN0ZGMCAgICAgICAgIGxkLmIgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorICAgICAgIDM2IDAwMDAwMEM0ICAgNDE5MkZGRjAgICAgICAgICBsZC5oICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAzNyAwMDAwMDBDOCAgIDQxOTM3RkYwICAgICAgICAgbGQgICAgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisgICAgICAgMzggMDAwMDAwQ0MgICA0MTkzRkZGMCAgICAgICAgIGxkLmQgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorICAgICAgIDM5IDAwMDAwMEQwICAgNDFCNDkwMDAgICAgICAgICBsZC5iICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMEQ0ICAgRTAwMDAwMDAgCisgICAgICAgNDAgMDAwMDAwRDggICA0MUI0QjAwMCAgICAgICAgIGxkLmggICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisMTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE0IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworcmVnb3BzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCisKKyAgICAgICAgICAwMDAwMDBEQyAgIEUwMDAwMDAwIAorICAgICAgIDQxIDAwMDAwMEUwICAgNDFCNEQwMDAgICAgICAgICBsZCAgICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMEU0ICAgRTAwMDAwMDAgCisgICAgICAgNDIgMDAwMDAwRTggICA0MUI0RjAwMCAgICAgICAgIGxkLmQgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAwRUMgICBFMDAwMDAwMCAKKyAgICAgICA0MyAwMDAwMDBGMCAgIDQxQjU4MDA0ICAgICAgICAgbGQudWIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICA0NCAwMDAwMDBGNCAgIDQxQjVBMDA0ICAgICAgICAgbGQudWggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICA0NSAwMDAwMDBGOCAgIDQxOTY3RkYwICAgICAgICAgbGQudWIgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisgICAgICAgNDYgMDAwMDAwRkMgICA0MTk2RkZGMCAgICAgICAgIGxkLnVoICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorICAgICAgIDQ3IDAwMDAwMTAwICAgNDFCNTkwMDAgICAgICAgICBsZC51YiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMTA0ICAgRTAwMDAwMDAgCisgICAgICAgNDggMDAwMDAxMDggICA0MUI1QjAwMCAgICAgICAgIGxkLnVoICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAxMEMgICBFMDAwMDAwMCAKKyAgICAgICA0OSAwMDAwMDExMCAgIDQxQjY4MDA0ICAgICAgICAgc3QuYiAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICA1MCAwMDAwMDExNCAgIDQxQjZBMDA0ICAgICAgICAgc3QuaCAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICA1MSAwMDAwMDExOCAgIDQxQjZDMDA0ICAgICAgICAgc3QgICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICA1MiAwMDAwMDExQyAgIDQxQjZFMDA0ICAgICAgICAgc3QuZCAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KKyAgICAgICA1MyAwMDAwMDEyMCAgIDQxOUE3RjAwICAgICAgICAgc3QuYiAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisgICAgICAgNTQgMDAwMDAxMjQgICA0MTlBRkYwMCAgICAgICAgIHN0LmggICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorICAgICAgIDU1IDAwMDAwMTI4ICAgNDE5QjdGMDAgICAgICAgICBzdCAgICAgIC0yNTYocjY6bSkscjggICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KKyAgICAgICA1NiAwMDAwMDEyQyAgIDQxOUJGRjAwICAgICAgICAgc3QuZCAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisgICAgICAgNTcgMDAwMDAxMzAgICA0MUI2OTAwMCAgICAgICAgIHN0LmIgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAxMzQgICBFMDAwMDAwMCAKKyAgICAgICA1OCAwMDAwMDEzOCAgIDQxQjZCMDAwICAgICAgICAgc3QuaCAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KKyAgICAgICAgICAwMDAwMDEzQyAgIEUwMDAwMDAwIAorICAgICAgIDU5IDAwMDAwMTQwICAgNDFCNkQwMDAgICAgICAgICBzdCAgICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQorICAgICAgICAgIDAwMDAwMTQ0ICAgRTAwMDAwMDAgCisgICAgICAgNjAgMDAwMDAxNDggICA0MUI2RjAwMCAgICAgICAgIHN0LmQgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCisgICAgICAgICAgMDAwMDAxNEMgICBFMDAwMDAwMCAKKworIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NTViMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIucwpAQCAtMCwwICsxLDYwIEBACisJZGNhY2hlYwlyOChyMTA6bSkJCTsgUmVnaXN0ZXIgZm9ybSAobW9kaWZpZWQpCisJZGNhY2hlYwk0KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCisJZGNhY2hlYwktNChyMTA6bSkJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQorCWRjYWNoZWMJMHgxMjM0NTY3OChyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKKwlkY2FjaGVjCTB4REVBREJFRUYocjEwOm0pCTsgTG9uZyBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCisJZGNhY2hlZglyOChyMTA6bSkJCTsgUmVnaXN0ZXIgZm9ybSAobW9kaWZpZWQpCisJZGNhY2hlZgk0KHIxMDptKQkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCisJZGNhY2hlZgktNChyMTA6bSkJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQorCWRjYWNoZWYJMHgxMjM0NTY3OChyMTA6bSkJOyBMb25nIEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKKwlkY2FjaGVmCTB4REVBREJFRUYocjEwOm0pCTsgTG9uZyBJbW1lZGlhdGUgZm9ybSAobmVnYXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCisJZGxkLmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZC5oCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkbGQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkbGQuYgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQorCWRsZC5oCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJZGxkCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJZGxkLmQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlkbGQudWIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZC51aAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZGxkLnViCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJZGxkLnVoCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJZHN0LmIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRzdC5oCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkc3QJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRzdC5kCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkc3QuYgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQorCWRzdC5oCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJZHN0CTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJZHN0LmQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlsZC5iCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZC5oCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJbGQuZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJbGQuYgktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KKwlsZC5oCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorCWxkCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorCWxkLmQJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisJbGQuYgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQorCWxkLmgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlsZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQorCWxkLmQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlsZC51YglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJbGQudWgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWxkLnViCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorCWxkLnVoCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorCWxkLnViCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJbGQudWgJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlzdC5iCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlzdC5oCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlzdAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJc3QuZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJc3QuYgktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisJc3QuaAktMjU2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCisJc3QJLTI1NihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorCXN0LmQJLTI1NihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQorCXN0LmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlzdC5oCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCisJc3QJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KKwlzdC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhMzAxMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZApAQCAtMCwwICsxLDI4IEBACisjb2JqZHVtcDogLWQKKyNuYW1lOiBUSWM4MCByZWdpc3RlciBvcGVyYW5kcyB3aXRoIDpzIG1vZGlmaWVyCisKKy4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCisKK0Rpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6CisKKzAwMDAwMDAwIDwudGV4dD46CisgICAwOgkwNCAwYyBiNCA0MS4qCisgICA0OgkwNCAyYyBiNCA0MS4qCisgICA4OgkwNCA0YyBiNCA0MS4qCisgICBjOgkwNCA2YyBiNCA0MS4qCisgIDEwOgkwNCAwYyBiNSA0MS4qCisgIDE0OgkwNCAyYyBiNSA0MS4qCisgIDE4OgkwNCAwYyBiNiA0MS4qCisgIDFjOgkwNCAyYyBiNiA0MS4qCisgIDIwOgkwNCA0YyBiNiA0MS4qCisgIDI0OgkwNCA2YyBiNiA0MS4qCisgIDI4OgkwNCAwOCBiNCA0MS4qCisgIDJjOgkwNCAyOCBiNCA0MS4qCisgIDMwOgkwNCA0OCBiNCA0MS4qCisgIDM0OgkwNCA2OCBiNCA0MS4qCisgIDM4OgkwNCAwOCBiNSA0MS4qCisgIDNjOgkwNCAyOCBiNSA0MS4qCisgIDQwOgkwNCAwOCBiNiA0MS4qCisgIDQ0OgkwNCAyOCBiNiA0MS4qCisgIDQ4OgkwNCA0OCBiNiA0MS4qCisgIDRjOgkwNCA2OCBiNiA0MS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTgwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLmxzdApAQCAtMCwwICsxLDI3IEBACitNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFdlZCBGZWIgMjYgMTQ6MzI6MTkgMTk5NworQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAorCityZWdvcHMzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKKworICAgICAgICAxIDAwMDAwMDAwICAgNDFCNDBDMDQgICAgICAgICBkbGQuYiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICAyIDAwMDAwMDA0ICAgNDFCNDJDMDQgICAgICAgICBkbGQuaCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICAzIDAwMDAwMDA4ICAgNDFCNDRDMDQgICAgICAgICBkbGQgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA0IDAwMDAwMDBDICAgNDFCNDZDMDQgICAgICAgICBkbGQuZCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA1IDAwMDAwMDEwICAgNDFCNTBDMDQgICAgICAgICBkbGQudWIgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA2IDAwMDAwMDE0ICAgNDFCNTJDMDQgICAgICAgICBkbGQudWggIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA3IDAwMDAwMDE4ICAgNDFCNjBDMDQgICAgICAgICBkc3QuYiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA4IDAwMDAwMDFDICAgNDFCNjJDMDQgICAgICAgICBkc3QuaCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgICA5IDAwMDAwMDIwICAgNDFCNjRDMDQgICAgICAgICBkc3QgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDEwIDAwMDAwMDI0ICAgNDFCNjZDMDQgICAgICAgICBkc3QuZCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDExIDAwMDAwMDI4ICAgNDFCNDA4MDQgICAgICAgICBsZC5iICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDEyIDAwMDAwMDJDICAgNDFCNDI4MDQgICAgICAgICBsZC5oICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDEzIDAwMDAwMDMwICAgNDFCNDQ4MDQgICAgICAgICBsZCAgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE0IDAwMDAwMDM0ICAgNDFCNDY4MDQgICAgICAgICBsZC5kICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE1IDAwMDAwMDM4ICAgNDFCNTA4MDQgICAgICAgICBsZC51YiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE2IDAwMDAwMDNDICAgNDFCNTI4MDQgICAgICAgICBsZC51aCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE3IDAwMDAwMDQwICAgNDFCNjA4MDQgICAgICAgICBzdC5iICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE4IDAwMDAwMDQ0ICAgNDFCNjI4MDQgICAgICAgICBzdC5oICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDE5IDAwMDAwMDQ4ICAgNDFCNjQ4MDQgICAgICAgICBzdCAgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorICAgICAgIDIwIDAwMDAwMDRDICAgNDFCNjY4MDQgICAgICAgICBzdC5kICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQorCisgTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWQ4N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5zCkBAIC0wLDAgKzEsMjAgQEAKKwlkbGQuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZGxkLmgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZGxkLmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZC51YglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZGxkLnVoCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkc3QuYglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZHN0LmgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRzdAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZHN0LmQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWxkLmIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWxkLmgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWxkCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZC5kCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZC51YglyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCisJbGQudWgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCXN0LmIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCXN0LmgJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQorCXN0CXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlzdC5kCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzYwN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kCkBAIC0wLDAgKzEsMjggQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzIHdpdGggYm90aCA6bSBhbmQgOnMgbW9kaWZpZXIKKworLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPC50ZXh0PjoKKyAgIDA6CTA0IDhjIGI0IDQxLioKKyAgIDQ6CTA0IGFjIGI0IDQxLioKKyAgIDg6CTA0IGNjIGI0IDQxLioKKyAgIGM6CTA0IGVjIGI0IDQxLioKKyAgMTA6CTA0IDhjIGI1IDQxLioKKyAgMTQ6CTA0IGFjIGI1IDQxLioKKyAgMTg6CTA0IDhjIGI2IDQxLioKKyAgMWM6CTA0IGFjIGI2IDQxLioKKyAgMjA6CTA0IGNjIGI2IDQxLioKKyAgMjQ6CTA0IGVjIGI2IDQxLioKKyAgMjg6CTA0IDg4IGI0IDQxLioKKyAgMmM6CTA0IGE4IGI0IDQxLioKKyAgMzA6CTA0IGM4IGI0IDQxLioKKyAgMzQ6CTA0IGU4IGI0IDQxLioKKyAgMzg6CTA0IDg4IGI1IDQxLioKKyAgM2M6CTA0IGE4IGI1IDQxLioKKyAgNDA6CTA0IDg4IGI2IDQxLioKKyAgNDQ6CTA0IGE4IGI2IDQxLioKKyAgNDg6CTA0IGM4IGI2IDQxLioKKyAgNGM6CTA0IGU4IGI2IDQxLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmM2M5YQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQubHN0CkBAIC0wLDAgKzEsMjcgQEAKK01WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoyNSAxOTk3CitDb3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCisKK3JlZ29wczQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQorCisgICAgICAgIDEgMDAwMDAwMDAgICA0MUI0OEMwNCAgICAgICAgIGRsZC5iICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDIgMDAwMDAwMDQgICA0MUI0QUMwNCAgICAgICAgIGRsZC5oICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDMgMDAwMDAwMDggICA0MUI0Q0MwNCAgICAgICAgIGRsZCAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDQgMDAwMDAwMEMgICA0MUI0RUMwNCAgICAgICAgIGRsZC5kICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDUgMDAwMDAwMTAgICA0MUI1OEMwNCAgICAgICAgIGRsZC51YiAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDYgMDAwMDAwMTQgICA0MUI1QUMwNCAgICAgICAgIGRsZC51aCAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDcgMDAwMDAwMTggICA0MUI2OEMwNCAgICAgICAgIGRzdC5iICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDggMDAwMDAwMUMgICA0MUI2QUMwNCAgICAgICAgIGRzdC5oICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgIDkgMDAwMDAwMjAgICA0MUI2Q0MwNCAgICAgICAgIGRzdCAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTAgMDAwMDAwMjQgICA0MUI2RUMwNCAgICAgICAgIGRzdC5kICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTEgMDAwMDAwMjggICA0MUI0ODgwNCAgICAgICAgIGxkLmIgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTIgMDAwMDAwMkMgICA0MUI0QTgwNCAgICAgICAgIGxkLmggICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTMgMDAwMDAwMzAgICA0MUI0QzgwNCAgICAgICAgIGxkICAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTQgMDAwMDAwMzQgICA0MUI0RTgwNCAgICAgICAgIGxkLmQgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTUgMDAwMDAwMzggICA0MUI1ODgwNCAgICAgICAgIGxkLnViICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTYgMDAwMDAwM0MgICA0MUI1QTgwNCAgICAgICAgIGxkLnVoICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTcgMDAwMDAwNDAgICA0MUI2ODgwNCAgICAgICAgIHN0LmIgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTggMDAwMDAwNDQgICA0MUI2QTgwNCAgICAgICAgIHN0LmggICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMTkgMDAwMDAwNDggICA0MUI2QzgwNCAgICAgICAgIHN0ICAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisgICAgICAgMjAgMDAwMDAwNEMgICA0MUI2RTgwNCAgICAgICAgIHN0LmQgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCisKKyBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTc3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LnMKQEAgLTAsMCArMSwyMCBAQAorCWRsZC5iCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZC5oCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRsZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkbGQuZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkbGQudWIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJZGxkLnVoCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRzdC5iCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRzdC5oCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWRzdAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlkc3QuZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZC5iCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCWxkLmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJbGQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJbGQuZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZC51YglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlsZC51aAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KKwlzdC5iCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQorCXN0LmgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJc3QJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCisJc3QuZAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuYyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWYwNGIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jCkBAIC0wLDAgKzEsMjggQEAKK2V4dGVybiBpbnQgeGZ1bmMgKGludCB5KTsKKworc3RhdGljIGludCBzZnVuYyAoaW50IHkpCit7CisgIHhmdW5jICh5KTsKK30KKworaW50IGdmdW5jIChpbnQgeSkKK3sKKyAgc2Z1bmMgKHkpOworfQorCitpbnQgYnJhbmNoZXMgKGludCB5KQoreworICBpbnQgejsKKworICBmb3IgKHogPSB5OyB6IDwgeSArIDEwOyB6KyspCisgICAgeworICAgICAgaWYgKHogJiAweDEpCisJeworCSAgZ2Z1bmMgKHopOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB4ZnVuYyAoeik7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNhNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5kCkBAIC0wLDAgKzEsNTYgQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIGdsb2JhbC9sb2NhbCBmdW5jcyAmIGJyYW5jaGVzIChjb2RlKQorCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgorCiswMDAwMDAwMCA8X3NmdW5jPjoKKyAgIDA6CWYwIGZmIDZjIDA4LioKKyAgIDQ6CTBjIDAwIDU5IGY4LioKKyAgIDg6CTAwIDAwIDU5IDEwLioKKyAgIGM6CTAwIDkwIDM4IGY4IDAwIDAwIDAwIDAwLioKKyAgMTQ6CTAwIDAwIDUxIDEwLioKKyAgMTg6CTBjIDAwIDUxIGY4LioKKyAgMWM6CTFmIDgwIDM4IDAwLioKKyAgMjA6CTEwIDgwIDZjIDA4LioKKworMDAwMDAwMjQgPF9nZnVuYz46CisgIDI0OglmMCBmZiA2YyAwOC4qCisgIDI4OgkwYyAwMCA1OSBmOC4qCisgIDJjOgkwMCAwMCA1OSAxMC4qCisgIDMwOgkwMCA5MCAzOCBmOCAwMCAwMCAwMCAwMC4qCisgIDM4OgkwMCAwMCA1MSAxMC4qCisgIDNjOgkwYyAwMCA1MSBmOC4qCisgIDQwOgkxZiA4MCAzOCAwMC4qCisgIDQ0OgkxMCA4MCA2YyAwOC4qCisKKzAwMDAwMDQ4IDxfYnJhbmNoZXM+OgorICA0ODoJZjAgZmYgNmMgMDguKgorICA0YzoJMGMgMDAgNTkgZjguKgorICA1MDoJMDAgMDAgNTkgMTAuKgorICA1NDoJMDAgMDAgNTEgMTAuKgorICA1ODoJMDQgMDAgNTkgMTAuKgorICA1YzoJMDAgMDAgNTEgMTAuKgorICA2MDoJMDQgMDAgNTEgMTguKgorICA2NDoJMGEgODAgYWMgMTAuKgorICA2ODoJMDMgMDAgYmEgMTAuKgorICA2YzoJMTIgODAgYTUgMzAuKgorICA3MDoJMDQgMDAgNTEgMTAuKgorICA3NDoJMDUgODAgYTQgZjguKgorICA3ODoJMDAgOTAgMzggZjggMjQgMDAgMDAgMDAuKgorICA4MDoJMDQgMDAgNTEgMTAuKgorICA4NDoJMDQgODAgMjQgMDAuKgorICA4ODoJMDAgOTAgMzggZjggMDAgMDAgMDAgMDAuKgorICA5MDoJMDQgMDAgNTEgMTAuKgorICA5NDoJMDQgMDAgNTEgMTAuKgorICA5ODoJMDEgODAgYWMgMTAuKgorICA5YzoJMDQgMDAgNTkgMTAuKgorICBhMDoJMDAgMDAgNTEgMTguKgorICBhNDoJMDQgMDAgNTEgMTAuKgorICBhODoJMGEgODAgZWMgMTguKgorICBhYzoJMDIgMDAgZmEgMTAuKgorICBiMDoJZjAgZmYgYTUgMzguKgorICBiNDoJMGMgMDAgNTEgZjguKgorICBiODoJMWYgODAgMzggMDAuKgorICBiYzoJMTAgODAgNmMgMDguKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmFlYjFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QKQEAgLTAsMCArMSw4MCBAQAorTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDEzOjE5OjI4IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworcmVsb2NzMS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCisKKyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKKyAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGxvY2FsL2dsb2JhbCBmdW5jdGlvbnMsIGxvY2FsL2dsb2JhbAorICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgZnVuY3Rpb24gY2FsbHMsIGFuZCBhbiAiaWYiIGFuZCAiZm9yIiBzdGF0ZW1lbnQuCisgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeGZ1bmMKKyAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA3IDAwMDAwMDAwICAgICAgICAgICAgX3NmdW5jOgorICAgICAgICA4IDAwMDAwMDAwICAgMDg2Q0ZGRjAgICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQorICAgICAgICA5IDAwMDAwMDA0ICAgRjg1OTAwMEMgICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKKyAgICAgICAxMCAwMDAwMDAwOCAgIDEwNTkwMDAwICAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgorICAgICAgIDExIDAwMDAwMDBDICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCisgICAgICAgICAgMDAwMDAwMTAgICAwMDAwMDAwMCAKKyAgICAgICAxMiAwMDAwMDAxNCAgIDEwNTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgorICAgICAgIDEzIDAwMDAwMDE4ICAgRjg1MTAwMEMgICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKKyAgICAgICAxNCAwMDAwMDAxQyAgIDAwMzg4MDFGICAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCisgICAgICAgMTUgMDAwMDAwMjAgICAwODZDODAxMCAgICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKKyAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nZnVuYworICAgICAgIDE4ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgMTkgMDAwMDAwMjQgICAgICAgICAgICBfZ2Z1bmM6CisgICAgICAgMjAgMDAwMDAwMjQgICAwODZDRkZGMCAgICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCisgICAgICAgMjEgMDAwMDAwMjggICBGODU5MDAwQyAgICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQorICAgICAgIDIyIDAwMDAwMDJDICAgMTA1OTAwMDAgICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCisgICAgICAgMjMgMDAwMDAwMzAgICBGODM4OTAwMCAgICAgICAgICBqc3IgICAgICAgX3NmdW5jKHIwKSxyMzEKKyAgICAgICAgICAwMDAwMDAzNCAgIDAwMDAwMDAwIAorICAgICAgIDI0IDAwMDAwMDM4ICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCisgICAgICAgMjUgMDAwMDAwM0MgICBGODUxMDAwQyAgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQorICAgICAgIDI2IDAwMDAwMDQwICAgMDAzODgwMUYgICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKKyAgICAgICAyNyAwMDAwMDA0NCAgIDA4NkM4MDEwICAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQorICAgICAgIDI4ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgMjkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfYnJhbmNoZXMKKyAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIDMyIDAwMDAwMDQ4ICAgICAgICAgICAgX2JyYW5jaGVzOgorICAgICAgIDMzIDAwMDAwMDQ4ICAgMDg2Q0ZGRjAgICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQorICAgICAgIDM0IDAwMDAwMDRDICAgRjg1OTAwMEMgICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKKyAgICAgICAzNSAwMDAwMDA1MCAgIDEwNTkwMDAwICAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgorICAgICAgIDM2IDAwMDAwMDU0ICAgMTA1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCisgICAgICAgMzcgMDAwMDAwNTggICAxMDU5MDAwNCAgICAgICAgICBzdCAgICAgICAgNChyMSkscjIKKyAgICAgICAzOCAwMDAwMDA1QyAgIDEwNTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgorICAgICAgIDM5IDAwMDAwMDYwICAgMTg1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIzCisgICAgICAgNDAgMDAwMDAwNjQgICAxMEFDODAwQSAgICAgICAgICBhZGR1ICAgICAgMTAscjIscjIKKyAgICAgICA0MSAwMDAwMDA2OCAgIDEwQkEwMDAzICAgICAgICAgIGNtcCAgICAgICByMyxyMixyMgorICAgICAgIDQyIDAwMDAwMDZDICAgMzBBNTgwMTIgICAgICAgICAgYmJvLmEgICAgIEwxMixyMixnZS53CisgICAgICAgNDMgMDAwMDAwNzAgICAgICAgICAgICBMODoKKyAgICAgICA0NCAwMDAwMDA3MCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgorICAgICAgIDQ1IDAwMDAwMDc0ICAgRjhBNDgwMDUgICAgICAgICAgYmJ6LmEgICAgIEwxMCxyMiwwCisgICAgICAgNDYgMDAwMDAwNzggICBGODM4OTAwMCAgICAgICAgICBqc3IgICAgICAgX2dmdW5jKHIwKSxyMzEKKyAgICAgICAgICAwMDAwMDA3QyAgIDAwMDAwMDI0IAorICAgICAgIDQ3IDAwMDAwMDgwICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCisgICAgICAgNDggMDAwMDAwODQgICAwMDI0ODAwNCAgICAgICAgICBici5hICAgICAgTDExCisgICAgICAgNDkgMDAwMDAwODggICAgICAgICAgICBMMTA6CisgICAgICAgNTAgMDAwMDAwODggICBGODM4OTAwMCAgICAgICAgICBqc3IgICAgICAgX3hmdW5jKHIwKSxyMzEKKyAgICAgICAgICAwMDAwMDA4QyAgIDAwMDAwMDAwIAorICAgICAgIDUxIDAwMDAwMDkwICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCisMTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDEzOjE5OjI4IDE5OTcKK0NvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKKworcmVsb2NzMS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCisKKyAgICAgICA1MiAwMDAwMDA5NCAgICAgICAgICAgIEwxMToKKyAgICAgICA1MyAwMDAwMDA5NCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgorICAgICAgIDU0IDAwMDAwMDk4ICAgMTBBQzgwMDEgICAgICAgICAgYWRkdSAgICAgIDEscjIscjIKKyAgICAgICA1NSAwMDAwMDA5QyAgIDEwNTkwMDA0ICAgICAgICAgIHN0ICAgICAgICA0KHIxKSxyMgorICAgICAgIDU2IDAwMDAwMEEwICAgMTg1MTAwMDAgICAgICAgICAgbGQgICAgICAgIDAocjEpLHIzCisgICAgICAgNTcgMDAwMDAwQTQgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKKyAgICAgICA1OCAwMDAwMDBBOCAgIDE4RUM4MDBBICAgICAgICAgIGFkZHUgICAgICAxMCxyMyxyMworICAgICAgIDU5IDAwMDAwMEFDICAgMTBGQTAwMDIgICAgICAgICAgY21wICAgICAgIHIyLHIzLHIyCisgICAgICAgNjAgMDAwMDAwQjAgICAzOEE1RkZGMCAgICAgICAgICBiYm8uYSAgICAgTDgscjIsbHQudworICAgICAgIDYxIDAwMDAwMEI0ICAgICAgICAgICAgTDEyOgorICAgICAgIDYyIDAwMDAwMEI0ICAgRjg1MTAwMEMgICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKKyAgICAgICA2MyAwMDAwMDBCOCAgIDAwMzg4MDFGICAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCisgICAgICAgNjQgMDAwMDAwQkMgICAwODZDODAxMCAgICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKKworIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5ZTM5NQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucwpAQCAtMCwwICsxLDY2IEBACis7OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCis7OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBsb2NhbC9nbG9iYWwgZnVuY3Rpb25zLCBsb2NhbC9nbG9iYWwKKzs7IGZ1bmN0aW9uIGNhbGxzLCBhbmQgYW4gImlmIiBhbmQgImZvciIgc3RhdGVtZW50LgorCisJLmZpbGUJICAgInJlbG9jczEucyIKKworCS5nbG9iYWwJX3hmdW5jCisKK19zZnVuYzoKKyAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKKyAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCisgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKKyAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQorICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCisgICAgICAgICBsZCAgICAgICAgMTIocjEpLHIzMQorICAgICAgICAganNyICAgICAgIHIzMShyMCkscjAKKyAgICAgICAgIGFkZHUgICAgICAxNixyMSxyMQorCisJLmdsb2JhbAlfZ2Z1bmMKKworX2dmdW5jOgorICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQorICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKKyAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgorICAgICAgICAganNyICAgICAgIF9zZnVuYyhyMCkscjMxCisgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKKyAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCisgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAorICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCisKKworCS5nbG9iYWwJX2JyYW5jaGVzCisKK19icmFuY2hlczoKKyAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKKyAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCisgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKKyAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgorICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCisgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKKyAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMworICAgICAgICAgYWRkdSAgICAgIDEwLHIyLHIyCisgICAgICAgICBjbXAgICAgICAgcjMscjIscjIKKyAgICAgICAgIGJiby5hICAgICBMMTIscjIsZ2UudworTDg6CisgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKKyAgICAgICAgIGJiei5hICAgICBMMTAscjIsMAorICAgICAgICAganNyICAgICAgIF9nZnVuYyhyMCkscjMxCisgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKKyAgICAgICAgIGJyLmEgICAgICBMMTEKK0wxMDoKKyAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQorICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCitMMTE6CisgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKKyAgICAgICAgIGFkZHUgICAgICAxLHIyLHIyCisgICAgICAgICBzdCAgICAgICAgNChyMSkscjIKKyAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMworICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCisgICAgICAgICBhZGR1ICAgICAgMTAscjMscjMKKyAgICAgICAgIGNtcCAgICAgICByMixyMyxyMgorICAgICAgICAgYmJvLmEgICAgIEw4LHIyLGx0LncKK0wxMjoKKyAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCisgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAorICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMWIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWIzMTYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMWIuZApAQCAtMCwwICsxLDEyIEBACisjb2JqZHVtcDogLXIKKyNzb3VyY2U6IHJlbG9jczEucworI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIGdsb2JhbC9sb2NhbCBmdW5jcyAmIGJyYW5jaGVzIChyZWxvY3MpCisKKy4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCisKK1JFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgorT0ZGU0VUICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCiswMDAwMDAxMCAzMiAgICAgICAgICAgICAgICBfeGZ1bmMKKzAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIC50ZXh0CiswMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAudGV4dAorMDAwMDAwOGMgMzIgICAgICAgICAgICAgICAgX3hmdW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxMTIwYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuYwpAQCAtMCwwICsxLDQxIEBACitleHRlcm4gY2hhciB4X2NoYXI7CitleHRlcm4gc2hvcnQgeF9zaG9ydDsKK3N0YXRpYyBpbnQgeF9pbnQ7CitleHRlcm4gbG9uZyB4X2xvbmc7CitleHRlcm4gZmxvYXQgeF9mbG9hdDsKK2V4dGVybiBkb3VibGUgeF9kb3VibGU7CitleHRlcm4gY2hhciAqeF9jaGFyX3A7CisKK3N0YXRpYyBjaGFyIHNfY2hhcjsKK3N0YXRpYyBzaG9ydCBzX3Nob3J0Oworc3RhdGljIGludCBzX2ludDsKK3N0YXRpYyBsb25nIHNfbG9uZzsKK3N0YXRpYyBmbG9hdCBzX2Zsb2F0Oworc3RhdGljIGRvdWJsZSBzX2RvdWJsZTsKK3N0YXRpYyBjaGFyICpzX2NoYXJfcDsKKworY2hhciBnX2NoYXI7CitzaG9ydCBnX3Nob3J0OworaW50IGdfaW50OworbG9uZyBnX2xvbmc7CitmbG9hdCBnX2Zsb2F0OworZG91YmxlIGdfZG91YmxlOworY2hhciAqZ19jaGFyX3A7CisKK21haW4gKCkKK3sKKyAgeF9jaGFyID0gc19jaGFyOworICBnX2NoYXIgPSB4X2NoYXI7CisgIHhfc2hvcnQgPSBzX3Nob3J0OworICBnX3Nob3J0ID0geF9zaG9ydDsKKyAgeF9pbnQgPSBzX2ludDsKKyAgZ19pbnQgPSB4X2ludDsKKyAgeF9sb25nID0gc19sb25nOworICBnX2xvbmcgPSB4X2xvbmc7CisgIHhfZmxvYXQgPSBzX2Zsb2F0OworICBnX2Zsb2F0ID0geF9mbG9hdDsKKyAgeF9kb3VibGUgPSBzX2RvdWJsZTsKKyAgZ19kb3VibGUgPSB4X2RvdWJsZTsKKyAgeF9jaGFyX3AgPSBzX2NoYXJfcDsKKyAgZ19jaGFyX3AgPSB4X2NoYXJfcDsKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNlODdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kCkBAIC0wLDAgKzEsMzcgQEAKKyNvYmpkdW1wOiAtZAorI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAoY29kZSkKKworLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKKworRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKKworMDAwMDAwMDAgPF9tYWluPjoKKyAgIDA6CTAwIDEwIDM0IDEwIDI0IDAyIDAwIDAwLioKKyAgIDg6CTAwIDEwIDM2IDEwIDAwIDAwIDAwIDAwLioKKyAgMTA6CTAwIDEwIDM0IDEwIDAwIDAwIDAwIDAwLioKKyAgMTg6CTAwIDEwIDM2IDEwIDA0IDAyIDAwIDAwLioKKyAgMjA6CTAwIDMwIDM0IDEwIDI0IDAzIDAwIDAwLioKKyAgMjg6CTAwIDMwIDM2IDEwIDAwIDAwIDAwIDAwLioKKyAgMzA6CTAwIDMwIDM0IDEwIDAwIDAwIDAwIDAwLioKKyAgMzg6CTAwIDMwIDM2IDEwIDA0IDAzIDAwIDAwLioKKyAgNDA6CTAwIDUwIDM0IDEwIDM0IDAyIDAwIDAwLioKKyAgNDg6CTAwIDUwIDM2IDEwIDM0IDAzIDAwIDAwLioKKyAgNTA6CTAwIDUwIDM0IDEwIDM0IDAzIDAwIDAwLioKKyAgNTg6CTAwIDUwIDM2IDEwIDE0IDAyIDAwIDAwLioKKyAgNjA6CTAwIDUwIDM0IDEwIGY0IDAxIDAwIDAwLioKKyAgNjg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKKyAgNzA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKKyAgNzg6CTAwIDUwIDM2IDEwIGY0IDAwIDAwIDAwLioKKyAgODA6CTAwIDUwIDM0IDEwIGY0IDAyIDAwIDAwLioKKyAgODg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKKyAgOTA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKKyAgOTg6CTAwIDUwIDM2IDEwIDE0IDAzIDAwIDAwLioKKyAgYTA6CTAwIDcwIDM0IDEwIGU0IDAxIDAwIDAwLioKKyAgYTg6CTAwIDcwIDM2IDEwIDAwIDAwIDAwIDAwLioKKyAgYjA6CTAwIDcwIDM0IDEwIDAwIDAwIDAwIDAwLioKKyAgYjg6CTAwIDcwIDM2IDEwIGU0IDAyIDAwIDAwLioKKyAgYzA6CTAwIDUwIDM0IDEwIDQ0IDAzIDAwIDAwLioKKyAgYzg6CTAwIDUwIDM2IDEwIDAwIDAwIDAwIDAwLioKKyAgZDA6CTAwIDUwIDM0IDEwIDAwIDAwIDAwIDAwLioKKyAgZDg6CTAwIDUwIDM2IDEwIGU0IDAwIDAwIDAwLioKKyAgZTA6CTFmIGEwIDM4IDAwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5MGE4YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIubHN0CkBAIC0wLDAgKzEsMTEyIEBACitNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFN1biBGZWIgMjMgMTI6MTY6MzIgMTk5NworQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAorCityZWxvY3MyLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKKworICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQorICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgc3RhdGljLCBnbG9iYWwsIGFuZCBleHRlcm4gZGF0YSB2YXJpYWJsZXMuCisgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbGUgICAicmVsb2NzMi5zIgorICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2NoYXIKKyAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9zaG9ydAorICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2xvbmcKKyAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9mbG9hdAorICAgICAgICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2RvdWJsZQorICAgICAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2NoYXJfcAorICAgICAgIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXIKKyAgICAgICAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19zaG9ydAorICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2ludAorICAgICAgIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2xvbmcKKyAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19mbG9hdAorICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2RvdWJsZQorICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXJfcAorICAgICAgIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9tYWluCisgICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAyMCAwMDAwMDAwMCAgICAgICAgICAgIF9tYWluOgorICAgICAgIDIxIDAwMDAwMDAwICAgMTAzNDEwMDAgICAgICAgICAgbGQuYiAgICAgIF9zX2NoYXIrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDAwNCAgIDAwMDAwMDFDIAorICAgICAgIDIyIDAwMDAwMDA4ICAgMTAzNjEwMDAgICAgICAgICAgc3QuYiAgICAgIF94X2NoYXIrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDAwQyAgIDAwMDAwMDAwIAorICAgICAgIDIzIDAwMDAwMDEwICAgMTAzNDEwMDAgICAgICAgICAgbGQuYiAgICAgIF94X2NoYXIrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDAxNCAgIDAwMDAwMDAwIAorICAgICAgIDI0IDAwMDAwMDE4ICAgMTAzNjEwMDAgICAgICAgICAgc3QuYiAgICAgIF9nX2NoYXIrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDAxQyAgIDAwMDAwMDE0IAorICAgICAgIDI1IDAwMDAwMDIwICAgMTAzNDMwMDAgICAgICAgICAgbGQuaCAgICAgIF9zX3Nob3J0KzAocjApLHIyCisgICAgICAgICAgMDAwMDAwMjQgICAwMDAwMDAzQyAKKyAgICAgICAyNiAwMDAwMDAyOCAgIDEwMzYzMDAwICAgICAgICAgIHN0LmggICAgICBfeF9zaG9ydCswKHIwKSxyMgorICAgICAgICAgIDAwMDAwMDJDICAgMDAwMDAwMDAgCisgICAgICAgMjcgMDAwMDAwMzAgICAxMDM0MzAwMCAgICAgICAgICBsZC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDAzNCAgIDAwMDAwMDAwIAorICAgICAgIDI4IDAwMDAwMDM4ICAgMTAzNjMwMDAgICAgICAgICAgc3QuaCAgICAgIF9nX3Nob3J0KzAocjApLHIyCisgICAgICAgICAgMDAwMDAwM0MgICAwMDAwMDAzNCAKKyAgICAgICAyOSAwMDAwMDA0MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19pbnQrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA0NCAgIDAwMDAwMDIwIAorICAgICAgIDMwIDAwMDAwMDQ4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF94X2ludCswKHIwKSxyMgorICAgICAgICAgIDAwMDAwMDRDICAgMDAwMDAwNDAgCisgICAgICAgMzEgMDAwMDAwNTAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3hfaW50KzAocjApLHIyCisgICAgICAgICAgMDAwMDAwNTQgICAwMDAwMDA0MCAKKyAgICAgICAzMiAwMDAwMDA1OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfZ19pbnQrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA1QyAgIDAwMDAwMDE4IAorICAgICAgIDMzIDAwMDAwMDYwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2xvbmcrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA2NCAgIDAwMDAwMDEwIAorICAgICAgIDM0IDAwMDAwMDY4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF94X2xvbmcrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA2QyAgIDAwMDAwMDAwIAorICAgICAgIDM1IDAwMDAwMDcwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2xvbmcrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA3NCAgIDAwMDAwMDAwIAorICAgICAgIDM2IDAwMDAwMDc4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2xvbmcrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA3QyAgIDAwMDAwMDA0IAorICAgICAgIDM3IDAwMDAwMDgwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2Zsb2F0KzAocjApLHIyCisgICAgICAgICAgMDAwMDAwODQgICAwMDAwMDAzMCAKKyAgICAgICAzOCAwMDAwMDA4OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgorDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU3VuIEZlYiAyMyAxMjoxNjozMiAxOTk3CitDb3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCisKK3JlbG9jczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgorCisgICAgICAgICAgMDAwMDAwOEMgICAwMDAwMDAwMCAKKyAgICAgICAzOSAwMDAwMDA5MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgorICAgICAgICAgIDAwMDAwMDk0ICAgMDAwMDAwMDAgCisgICAgICAgNDAgMDAwMDAwOTggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfZmxvYXQrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDA5QyAgIDAwMDAwMDM4IAorICAgICAgIDQxIDAwMDAwMEEwICAgMTAzNDcwMDAgICAgICAgICAgbGQuZCAgICAgIF9zX2RvdWJsZSswKHIwKSxyMgorICAgICAgICAgIDAwMDAwMEE0ICAgMDAwMDAwMDggCisgICAgICAgNDIgMDAwMDAwQTggICAxMDM2NzAwMCAgICAgICAgICBzdC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCisgICAgICAgICAgMDAwMDAwQUMgICAwMDAwMDAwMCAKKyAgICAgICA0MyAwMDAwMDBCMCAgIDEwMzQ3MDAwICAgICAgICAgIGxkLmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKKyAgICAgICAgICAwMDAwMDBCNCAgIDAwMDAwMDAwIAorICAgICAgIDQ0IDAwMDAwMEI4ICAgMTAzNjcwMDAgICAgICAgICAgc3QuZCAgICAgIF9nX2RvdWJsZSswKHIwKSxyMgorICAgICAgICAgIDAwMDAwMEJDICAgMDAwMDAwMjggCisgICAgICAgNDUgMDAwMDAwQzAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3NfY2hhcl9wKzAocjApLHIyCisgICAgICAgICAgMDAwMDAwQzQgICAwMDAwMDA0NCAKKyAgICAgICA0NiAwMDAwMDBDOCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKKyAgICAgICAgICAwMDAwMDBDQyAgIDAwMDAwMDAwIAorICAgICAgIDQ3IDAwMDAwMEQwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2NoYXJfcCswKHIwKSxyMgorICAgICAgICAgIDAwMDAwMEQ0ICAgMDAwMDAwMDAgCisgICAgICAgNDggMDAwMDAwRDggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfY2hhcl9wKzAocjApLHIyCisgICAgICAgICAgMDAwMDAwREMgICAwMDAwMDAwMCAKKyAgICAgICA0OSAwMDAwMDBFMCAgIDAwMzhBMDFGICAgICAgICAgIGpzci5hICAgICByMzEocjApLHIwCisgICAgICAgNTAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICA1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyX3AKKyAgICAgICA1MiAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19jaGFyX3AsNCw0CisgICAgICAgNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfbG9uZworICAgICAgIDU0IDAwMDAwMDA0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2xvbmcsNCw0CisgICAgICAgNTUgMDAwMDAwMDggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfZG91YmxlLDgsOAorICAgICAgIDU2IDAwMDAwMDEwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2xvbmcsNCw0CisgICAgICAgNTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfY2hhcgorICAgICAgIDU4IDAwMDAwMDE0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2NoYXIsMSw0CisgICAgICAgNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfaW50CisgICAgICAgNjAgMDAwMDAwMTggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfaW50LDQsNAorICAgICAgIDYxIDAwMDAwMDFDICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2NoYXIsMSw0CisgICAgICAgNjIgMDAwMDAwMjAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfaW50LDQsNAorICAgICAgIDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2RvdWJsZQorICAgICAgIDY0IDAwMDAwMDI4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2RvdWJsZSw4LDgKKyAgICAgICA2NSAwMDAwMDAzMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19mbG9hdCw0LDQKKyAgICAgICA2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19zaG9ydAorICAgICAgIDY3IDAwMDAwMDM0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX3Nob3J0LDIsNAorICAgICAgIDY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2Zsb2F0CisgICAgICAgNjkgMDAwMDAwMzggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfZmxvYXQsNCw0CisgICAgICAgNzAgMDAwMDAwM0MgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3Nfc2hvcnQsMiw0CisgICAgICAgNzEgMDAwMDAwNDAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3hfaW50LDQsNAorICAgICAgIDcyIDAwMDAwMDQ0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2NoYXJfcCw0LDQKKworIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNTdkZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczIucwpAQCAtMCwwICsxLDcyIEBACis7OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCis7OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBzdGF0aWMsIGdsb2JhbCwgYW5kIGV4dGVybiBkYXRhIHZhcmlhYmxlcy4KKworCS5maWxlCSJyZWxvY3MyLnMiCisJLmdsb2JhbAlfeF9jaGFyCisJLmdsb2JhbAlfeF9zaG9ydAorCS5nbG9iYWwJX3hfbG9uZworCS5nbG9iYWwJX3hfZmxvYXQKKwkuZ2xvYmFsCV94X2RvdWJsZQorCS5nbG9iYWwJX3hfY2hhcl9wCisJLmdsb2JhbAlfZ19jaGFyCisJLmdsb2JhbAlfZ19zaG9ydAorCS5nbG9iYWwJX2dfaW50CisJLmdsb2JhbAlfZ19sb25nCisJLmdsb2JhbAlfZ19mbG9hdAorCS5nbG9iYWwJX2dfZG91YmxlCisJLmdsb2JhbAlfZ19jaGFyX3AKKwkuZ2xvYmFsCV9tYWluCisKK19tYWluOgorICAgICAgICAgbGQuYiAgICAgIF9zX2NoYXIrMChyMCkscjIKKyAgICAgICAgIHN0LmIgICAgICBfeF9jaGFyKzAocjApLHIyCisgICAgICAgICBsZC5iICAgICAgX3hfY2hhciswKHIwKSxyMgorICAgICAgICAgc3QuYiAgICAgIF9nX2NoYXIrMChyMCkscjIKKyAgICAgICAgIGxkLmggICAgICBfc19zaG9ydCswKHIwKSxyMgorICAgICAgICAgc3QuaCAgICAgIF94X3Nob3J0KzAocjApLHIyCisgICAgICAgICBsZC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKKyAgICAgICAgIHN0LmggICAgICBfZ19zaG9ydCswKHIwKSxyMgorICAgICAgICAgbGQgICAgICAgIF9zX2ludCswKHIwKSxyMgorICAgICAgICAgc3QgICAgICAgIF94X2ludCswKHIwKSxyMgorICAgICAgICAgbGQgICAgICAgIF94X2ludCswKHIwKSxyMgorICAgICAgICAgc3QgICAgICAgIF9nX2ludCswKHIwKSxyMgorICAgICAgICAgbGQgICAgICAgIF9zX2xvbmcrMChyMCkscjIKKyAgICAgICAgIHN0ICAgICAgICBfeF9sb25nKzAocjApLHIyCisgICAgICAgICBsZCAgICAgICAgX3hfbG9uZyswKHIwKSxyMgorICAgICAgICAgc3QgICAgICAgIF9nX2xvbmcrMChyMCkscjIKKyAgICAgICAgIGxkICAgICAgICBfc19mbG9hdCswKHIwKSxyMgorICAgICAgICAgc3QgICAgICAgIF94X2Zsb2F0KzAocjApLHIyCisgICAgICAgICBsZCAgICAgICAgX3hfZmxvYXQrMChyMCkscjIKKyAgICAgICAgIHN0ICAgICAgICBfZ19mbG9hdCswKHIwKSxyMgorICAgICAgICAgbGQuZCAgICAgIF9zX2RvdWJsZSswKHIwKSxyMgorICAgICAgICAgc3QuZCAgICAgIF94X2RvdWJsZSswKHIwKSxyMgorICAgICAgICAgbGQuZCAgICAgIF94X2RvdWJsZSswKHIwKSxyMgorICAgICAgICAgc3QuZCAgICAgIF9nX2RvdWJsZSswKHIwKSxyMgorICAgICAgICAgbGQgICAgICAgIF9zX2NoYXJfcCswKHIwKSxyMgorICAgICAgICAgc3QgICAgICAgIF94X2NoYXJfcCswKHIwKSxyMgorICAgICAgICAgbGQgICAgICAgIF94X2NoYXJfcCswKHIwKSxyMgorICAgICAgICAgc3QgICAgICAgIF9nX2NoYXJfcCswKHIwKSxyMgorICAgICAgICAganNyLmEgICAgIHIzMShyMCkscjAKKworCS5nbG9iYWwJX2dfY2hhcl9wCisJLmJzcwlfZ19jaGFyX3AsNCw0CisJLmdsb2JhbAlfZ19sb25nCisJLmJzcwlfZ19sb25nLDQsNAorCS5ic3MJX3NfZG91YmxlLDgsOAorCS5ic3MJX3NfbG9uZyw0LDQKKwkuZ2xvYmFsCV9nX2NoYXIKKwkuYnNzCV9nX2NoYXIsMSw0CisJLmdsb2JhbAlfZ19pbnQKKwkuYnNzCV9nX2ludCw0LDQKKwkuYnNzCV9zX2NoYXIsMSw0CisJLmJzcwlfc19pbnQsNCw0CisJLmdsb2JhbAlfZ19kb3VibGUKKwkuYnNzCV9nX2RvdWJsZSw4LDgKKwkuYnNzCV9zX2Zsb2F0LDQsNAorCS5nbG9iYWwJX2dfc2hvcnQKKwkuYnNzCV9nX3Nob3J0LDIsNAorCS5nbG9iYWwJX2dfZmxvYXQKKwkuYnNzCV9nX2Zsb2F0LDQsNAorCS5ic3MJX3Nfc2hvcnQsMiw0CisJLmJzcwlfeF9pbnQsNCw0CisJLmJzcwlfc19jaGFyX3AsNCw0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMmIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRmOTlkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMmIuZApAQCAtMCwwICsxLDM4IEBACisjb2JqZHVtcDogLXIKKyNzb3VyY2U6IHJlbG9jczIucworI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIHN0YXRpYyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAocmVsb2NzKQorCisuKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgorCitSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKK09GRlNFVCAgIFRZUEUgICAgICAgICAgICAgIFZBTFVFIAorMDAwMDAwMDQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYworMDAwMDAwMGMgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgorMDAwMDAwMTQgMzIgICAgICAgICAgICAgICAgX3hfY2hhcgorMDAwMDAwMWMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYworMDAwMDAwMjQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYworMDAwMDAwMmMgMzIgICAgICAgICAgICAgICAgX3hfc2hvcnQKKzAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIF94X3Nob3J0CiswMDAwMDAzYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA0NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA0YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA1NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA1YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA2NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA2YyAzMiAgICAgICAgICAgICAgICBfeF9sb25nCiswMDAwMDA3NCAzMiAgICAgICAgICAgICAgICBfeF9sb25nCiswMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA4NCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDA4YyAzMiAgICAgICAgICAgICAgICBfeF9mbG9hdAorMDAwMDAwOTQgMzIgICAgICAgICAgICAgICAgX3hfZmxvYXQKKzAwMDAwMDljIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKKzAwMDAwMGE0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKKzAwMDAwMGFjIDMyICAgICAgICAgICAgICAgIF94X2RvdWJsZQorMDAwMDAwYjQgMzIgICAgICAgICAgICAgICAgX3hfZG91YmxlCiswMDAwMDBiYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDBjNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCiswMDAwMDBjYyAzMiAgICAgICAgICAgICAgICBfeF9jaGFyX3AKKzAwMDAwMGQ0IDMyICAgICAgICAgICAgICAgIF94X2NoYXJfcAorMDAwMDAwZGMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYworCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWM0NjMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvdGljODAuZXhwCkBAIC0wLDAgKzEsMjEgQEAKKyMKKyMgVEkgVE1TMzIwQzgwIHRlc3RzLgorIworaWYgW2lzdGFyZ2V0IHRpYzgwKi0qLSpdIHRoZW4geworCisgICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzIgorICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wczIiCisgICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzMyIKKyAgICBydW5fZHVtcF90ZXN0ICJyZWdvcHM0IgorICAgIHJ1bl9kdW1wX3Rlc3QgImNyZWdvcHMiCisgICAgcnVuX2R1bXBfdGVzdCAiZmxvYXQiCisgICAgcnVuX2R1bXBfdGVzdCAiZW5kbWFzayIKKyAgICBydW5fZHVtcF90ZXN0ICJiaXRudW0iCisgICAgcnVuX2R1bXBfdGVzdCAiY2NvZGUiCisgICAgcnVuX2R1bXBfdGVzdCAiYWRkIgorICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczEiCisgICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMWIiCisgICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMiIKKyAgICBydW5fZHVtcF90ZXN0ICJyZWxvY3MyYiIKKyAgICBydW5fZHVtcF90ZXN0ICJhbGlnbiIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYXJpdGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYXJpdGgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzIxNDBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9hcml0aC5zCkBAIC0wLDAgKzEsMjQgQEAKKworCS50ZXh0CisJLmdsb2JhbCBhcml0aF9vcGNvZGVzCithcml0aF9vcGNvZGVzOgorCWFkZCByNSxyNgorCWFkZCA1LHI2CisJYWRkaSA3LHI1LHI2CisJZGl2aCByNSxyNgorCW11bGggcjUscjYKKwltdWxoIDUscjYKKwltdWxoaSA3LHI1LHI2CisJc2FyIHI1LHI2CisJc2FyIDMxLHI2CisJc2F0YWRkIHI1LHI2CisJc2F0YWRkIDUscjYKKwlzYXRzdWIgcjUscjYKKwlzYXRzdWJpIDcscjUscjYKKwlzYXRzdWJyIHI1LHI2CisJc2hsIHI1LHI2CisJc2hsIDMxLHI2CisJc2hyIHI1LHI2CisJc2hyIDMxLHI2CisJc3ViIHI1LHI2CisJc3ViciByNSxyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iYXNpYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2Jhc2ljLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZhNjMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iYXNpYy5leHAKQEAgLTAsMCArMSw0MzggQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIERlamFHbnVAY3lnbnVzLmNvbQorCisjIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisKK3Byb2MgZG9fYXJpdGgge30geworICAgIHNldCB0ZXN0bmFtZSAiYXJpdGguczogQXJpdGhtZXRpYyBvcGVyYXRpb25zIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYXJpdGgucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgICMgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ4OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDQ1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBFNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFNTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTUzN0EwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEJGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEM1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIDI1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEE1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIDY1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiA4NTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFNTM3QzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggREYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRTUzNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIDlGMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEE1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIDg1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2JpdCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IG9wZXJhdGlvbnMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJiaXQucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDNkFGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQzY2RjEwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEM2MkYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNkVGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19icmFuY2gge30geworICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGJyYW5jaCBvcGVyYXRpb25zIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiYnJhbmNoLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgOEYwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRkVGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTZGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDdGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQ0JGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgQjlGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgQTFGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgOTNGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgODJGRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRkFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTBGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRDhGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzRGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgQkNGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQTFGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgOTlGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgODJGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTVFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRERFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fY29tcGFyZSB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJjb21wYXJlLnM6IGNvbXBhcmUgb3BlcmF0aW9ucyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgImNvbXBhcmUucyIgIi1hbCIKKworICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCisgICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKKyAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgorICAgIHdoaWxlIDEgeworCWV4cGVjdCB7CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA2NTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFMDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRTgyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEUxMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBFMTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRTkyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEU5MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBFMjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRUEyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEUzMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBFQjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRTQyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEU0MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBFQzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRUMyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEU1MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBFRDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgRTYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEVFMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBFNzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgRUYyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDY1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTIzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2p1bXBzIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImp1bXBzLnM6IGp1bXBzIG9wZXJhdGlvbnMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJqdW1wcy5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDgwMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA2NTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBCRjA3RkFGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQorCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJICAgIGVvZgkJCQkJeyBicmVhayB9CisJfQorICAgIH0KKworICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAorICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgorICAgIGdhc19maW5pc2gKKworICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KKyAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KK30KKworcHJvYyBkb19sb2dpY2FsIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCBvcGVyYXRpb25zIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAibG9naWNhbC5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEM1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiAyNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSA4NTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgMjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgQTUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK3Byb2MgZG9fbWVtIHt9IHsKKyAgICBzZXQgdGVzdG5hbWUgIm1lbS5zOiBtZW1vcnkgb3BlcmF0aW9ucyIKKyAgICBzZXQgeCAwCisKKyAgICBnYXNfc3RhcnQgIm1lbS5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA1MzcwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNTM3MDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjUzNzA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDQwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIDQwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDQwMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIDQ2MkYwNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiA2NjJGMDQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgNjYyRjA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEMwMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEMwMzRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIDQxMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX21pc2Mge30geworICAgIHNldCB0ZXN0bmFtZSAibWlzYy5zOiBtaXNjIG9wZXJhdGlvbnMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtaXNjLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRTAwNzYwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUwODc2MDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFMDA3MjAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRTAwNzQwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEUwMDcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGRjA3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRTcyRjIwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFlIEU1M0Y0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT05XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX21vdmUge30geworICAgIHNldCB0ZXN0bmFtZSAibW92ZS5zOiBtb3ZlIG9wZXJhdGlvbnMiCisgICAgc2V0IHggMAorCisgICAgZ2FzX3N0YXJ0ICJtb3ZlLnMiICItYWwiCisKKyAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQorICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCisgICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KKyAgICB3aGlsZSAxIHsKKwlleHBlY3QgeworCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMDUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQ1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorCisgICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0CisgICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCisgICAgZ2FzX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitwcm9jIGRvX2hpbG8ge30geworICAgIHNldCB0ZXN0bmFtZSAiaGlsby5zOiBoaWxvIHRlc3RzIgorICAgIHNldCB4IDAKKworICAgIGdhc19zdGFydCAiaGlsby5zIiAiLWFsIgorCisgICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKKyAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycworICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIwMEVFRkJFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCA0MTBFQUVERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDEwRUFEREVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KKwkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQorCSAgICBlb2YJCQkJCXsgYnJlYWsgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBnYXNfZmluaXNoCisKKyAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisgICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKKworcHJvYyBkb19zaW1wbGVfcmVsb2NfdGVzdHMge30geworICAgIHNldCB0ZXN0bmFtZSAicmVsb2MuczogVGVzdCBmb3IgcHJvcGVyIHJlbG9jYXRpb25zIChwYXJ0IDIpIgorICAgIHNldCB4IDAKKworICAgIGlmIFtnYXNfdGVzdF9vbGQgInJlbG9jLnMiICIiICJUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbiAocGFydCAxKSJdIHRoZW4geworCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgorCisJd2hpbGUgMSB7CisJICAgIGV4cGVjdCB7CisJCS1yZSAiXjAwMDAwMDAyXFteXG5cXSpSX1Y4NTBfTE8xNlxbXlxuXF0qXG4iCisJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJeMDAwMDAwMDZcW15cblxdKlJfVjg1MF9ISTE2X1NcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJCS1yZSAiXjAwMDAwMDBhXFteXG5cXSpSX1Y4NTBfSEkxNlxbXlxuXF0qXG4iCisJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJeMDAwMDAwMGVcW15cblxdKlJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUXFteXG5cXSpcbiIKKwkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQorCQktcmUgIl4wMDAwMDAxMlxbXlxuXF0qUl9WODUwX1REQV8xNl8xNl9PRkZTRVRcW15cblxdKlxuIgorCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9CisJCS1yZSAiXjAwMDAwMDE2XFteXG5cXSpSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVFxbXlxuXF0qXG4iCisJCQl7IHNldCB4IFtleHByICR4KzFdIH0KKwkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KKwkJdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9CisJCWVvZgkJCQl7IGJyZWFrIH0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKKyAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KKyAgICBvYmpkdW1wX2ZpbmlzaAorCisgICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorICAgIGlmIFtleHByICR4PT02XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQorfQorCitpZiBbaXN0YXJnZXQgdjg1MCotKi0qXSB0aGVuIHsKKyAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KKyAgICBkb19hcml0aAorICAgIGRvX2JpdAorICAgIGRvX2JyYW5jaAorICAgIGRvX2NvbXBhcmUKKyAgICBkb19qdW1wcworICAgIGRvX2xvZ2ljYWwKKyAgICBkb19tZW0KKyAgICBkb19taXNjCisgICAgZG9fbW92ZQorCisgICAgIyBNYWtlIHN1cmUgd2UgaGFuZGxlIGxvKCkgaGkoKSBhbmQgaGkwKCkgY29ycmVjdGx5LgorICAgIGRvX2hpbG8KKworICAgICMgQ2hlY2sgZm9yIHByb3BlciByZWxvY3Mgb24gbG8sIGhpLCBoaTAsIHpkYW9mZiwgdGRhb2ZmIGFuZCBzZGFvZmYKKyAgICAjIGV4cHJlc3Npb25zCisgICAgZG9fc2ltcGxlX3JlbG9jX3Rlc3RzCisKKyAgICBnYXNfdGVzdCAiaGlsbzIucyIgIiIgIiIgImhpL2xvIHJlZ3Jlc3Npb24gdGVzdCIKKyAgICBnYXNfdGVzdCAiZmVwc3cucyIgIiIgIiIgImVxc3cgcmVncmVzc2lvbiB0ZXN0IgorCisgICAgZ2FzX3Rlc3RfZXJyb3IgInJhbmdlLnMiICItbXdhcm4tc2lnbmVkLW92ZXJmbG93IiAiQ2hlY2sgZm9yIHJhbmdlIGVycm9yIG9uIGJ5dGUgbG9hZC9zdG9yZSIKK30KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JpdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWFjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JpdC5zCkBAIC0wLDAgKzEsOCBAQAorCisJLnRleHQKKwkuZ2xvYmFsIGJpdAorYml0OgorCWNscjEgNSwxNltyNl0KKwlub3QxIDUsMTZbcjZdCisJc2V0MSA1LDE2W3I2XQorCXRzdDEgNSwxNltyNl0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzFiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCkBAIC0wLDAgKzEsMjQgQEAKKworCS50ZXh0CisJLmdsb2JhbCBiY2MKK2JjYzoKKwliZ3QgYmNjCisJYmdlIGJjYworCWJsdCBiY2MKKwlibGUgYmNjCisJYmggYmNjCisJYm5sIGJjYworCWJsIGJjYworCWJuaCBiY2MKKwliZSBiY2MKKwlibmUgYmNjCisJYnYgYmNjCisJYm52IGJjYworCWJuIGJjYworCWJwIGJjYworCWJjIGJjYworCWJuYyBiY2MKKwlieiBiY2MKKwlibnogYmNjCisJYnIgYmNjCisJYnNhIGJjYwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9jb21wYXJlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2NvbXBhcmUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFjOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9jb21wYXJlLnMKQEAgLTAsMCArMSwyOCBAQAorCisJLnRleHQKKwkuZ2xvYmFsIGNvbXBhcmUKK2NvbXBhcmU6CisJY21wIHI1LHI2CisJY21wIDUscjYKKwlzZXRmIHYscjUKKwlzZXRmIG52LHI1CisJc2V0ZiBjLHI1CisJc2V0ZiBsLHI1CisJc2V0ZiBuYyxyNQorCXNldGYgbmwscjUKKwlzZXRmIHoscjUKKwlzZXRmIG56LHI1CisJc2V0ZiBuaCxyNQorCXNldGYgaCxyNQorCXNldGYgcyxyNQorCXNldGYgbixyNQorCXNldGYgbnMscjUKKwlzZXRmIHAscjUKKwlzZXRmIHQscjUKKwlzZXRmIHNhLHI1CisJc2V0ZiBsdCxyNQorCXNldGYgZ2UscjUKKwlzZXRmIGxlLHI1CisJc2V0ZiBndCxyNQorCXRzdCByNSxyNgorCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDMzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2ZlcHN3LnMKQEAgLTAsMCArMSwyIEBACisJLnRleHQKKwlsZHNyIHIxNyxmZXBzdwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY3ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMKQEAgLTAsMCArMSw1IEBACisKKwkudGV4dAorCW1vdmVhIGxvKDB4ZGVhZGJlZWYpLHIwLHIxCisJbW92aGkgaGkoMHhkZWFkYmVlZikscjEscjEKKwltb3ZoaSBoaTAoMHhkZWFkYmVlZikscjEscjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsbzIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvaGlsbzIucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFkNTkzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCkBAIC0wLDAgKzEsNCBAQAorCS50ZXh0CisJLm9yZyAweDEwMDAwCisJbW92ZWEgaGkoYmxhaCkscjAscjEKK2JsYWg6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczMTY0YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvanVtcHMucwpAQCAtMCwwICsxLDggQEAKKworCS50ZXh0CisJLmdsb2JhbCBqdW1wcworanVtcHM6CisJamFybCBqdW1wcyxyNQorCWptcCBbcjVdCisJanIganVtcHMKKwkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9sb2dpY2FsLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMGIzYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zCkBAIC0wLDAgKzEsMTEgQEAKKworCS50ZXh0CisJLmdsb2JhbCBsb2dpY2FscworbG9naWNhbHM6CisJYW5kIHI1LHI2CisJYW5kaSA3LHI1LHI2CisJbm90IHI1LHI2CisJb3IgcjUscjYKKwlvcmkgNyxyNSxyNgorCXhvciByNSxyNgorCXhvcmkgNyxyNSxyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9tZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWVtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2OWNlYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWVtLnMKQEAgLTAsMCArMSwxNiBAQAorCisJLnRleHQKKwkuZ2xvYmFsIG1lbW9yeQorbWVtb3J5OgorCWxkLmIgNVtyNV0scjYKKwlsZC5oIDRbcjVdLHI2CisJbGQudyA0W3I1XSxyNgorCXNsZC5iIDY0W2VwXSxyNgorCXNsZC5oIDEyOFtlcF0scjYKKwlzbGQudyAxMjhbZXBdLHI2CisJc3QuYiByNSw1W3I2XQorCXN0LmggcjUsNFtyNl0KKwlzdC53IHI1LDRbcjZdCisJc3N0LmIgcjYsNjRbZXBdCisJc3N0LmggcjYsMTI4W2VwXQorCXNzdC53IHI2LDEyOFtlcF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWlzYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjNGU0YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWlzYy5zCkBAIC0wLDAgKzEsMTMgQEAKKworCS50ZXh0CisJLmdsb2JhbCBtaXNjCittaXNjOgorCWRpCisJZWkKKwloYWx0CisJbm9wCisJcmV0aQorCXRyYXAgMAorCXRyYXAgMzEKKwlsZHNyIHI3LHBzdworCXN0c3IgcHN3LHI3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbW92ZS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTZmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucwpAQCAtMCwwICsxLDggQEAKKworCS50ZXh0CisJLmdsb2JhbCBtb3ZlCittb3ZlOgorCW1vdiByNSxyNgorCW1vdiA1LHI2CisJbW92ZWEgNyxyNSxyNgorCW1vdmhpIDcscjUscjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmFuZ2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmFuZ2UucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmFjY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCkBAIC0wLDAgKzEsMiBAQAorCS50ZXh0CisJbGQuYiAweGZmNjJbcjBdLHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczOGQyNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmVsb2MucwpAQCAtMCwwICsxLDcgQEAKKwkudGV4dAorCW1vdmVhIGxvKGZvbykscjAscjEKKwltb3ZoaSBoaShmb28pLHIxLHIxCisJbW92aGkgaGkwKGZvbykscjEscjEKKwltb3ZlYSB6ZGFvZmYoX2ZvbykscjAscjEKKwltb3ZoaSB0ZGFvZmYoX2ZvbyksZXAscjEKKwltb3ZoaSBzZGFvZmYoX2ZvbyksZ3AscjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc3MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQuZXhwCkBAIC0wLDAgKzEsMjMgQEAKK3Byb2MgZG9fcXVhZCB7fSB7CisgICAgc2V0IHRlc3RuYW1lICJxdWFkLnM6IHF1YWR3b3JkIGltbWVkaWF0ZSB2YWx1ZXMiCisgICAgc2V0IHgxIDAKKyAgICBzZXQgeDIgMAorICAgIHNldCB4MyAwCisgICAgZ2FzX3N0YXJ0ICJxdWFkLnMiICItYWwiCisgICAgd2hpbGUgMSB7CisJZXhwZWN0IHsKKwkgICAgLXJlICJeICsyXFsgXHRcXSswMDAwKyA3RDhGNzg1NlxbIFx0XF0rbW92cVxbXlxuXF0qXG4iIHsgc2V0IHgxIDEgfQorCSAgICAtcmUgIl4gKzJcWyBcdFxdKzM0MTJERENDXFteXG5cXSpcbiIJCSAgIHsgc2V0IHgyIDEgfQorCSAgICAtcmUgIl4gKzJcWyBcdFxdK0JCQUE1MDAxXFsgXHRcXSpcclxuIgkJICAgeyBzZXQgeDMgMSB9CisJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9CisJICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KKwkgICAgZW9mCQkJCQl7IGJyZWFrIH0KKwl9CisgICAgfQorICAgIGdhc19maW5pc2gKKyAgICBpZiBbYWxsX29uZXMgJHgxICR4MiAkeDNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Cit9CisKK2lmIFtpc3RhcmdldCB2YXgtKi0qXSB0aGVuIHsKKyAgICBkb19xdWFkCit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFkNGFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQucwpAQCAtMCwwICsxLDIgQEAKKwkudGV4dAorCW1vdnEgJDB4YWFiYmNjZGQxMjM0NTY3OCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGJiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLmQKQEAgLTAsMCArMSwxMCBAQAorI29iamR1bXA6IC1yCisjbmFtZTogdnRhYmxlIGVudHJ5MAorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK1JFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgorT0ZGU0VUICtUWVBFICtWQUxVRSAKKzArMDAwMDAxMCBSXy4qX0dOVV9WVEVOVFJZICB2dGJsX2EKKworCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmODllMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTAucwpAQCAtMCwwICsxLDIgQEAKKy50ZXh0CisudnRhYmxlX2VudHJ5IHZ0YmxfYSwgMTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmE2ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCkBAIC0wLDAgKzEsMTAgQEAKKyNvYmpkdW1wOiAtcgorI25hbWU6IHZ0YWJsZSBlbnRyeTEKKworLio6ICtmaWxlIGZvcm1hdCAuKgorCitSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLnRleHRcXToKK09GRlNFVCArVFlQRSArVkFMVUUgCiswKzAwMDAwMDAgUl8uKl9HTlVfVlRFTlRSWSAgdnRibF9hLioKKworCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmODllMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEucwpAQCAtMCwwICsxLDIgQEAKKy50ZXh0CisudnRhYmxlX2VudHJ5IHZ0YmxfYSwgMTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3OTViMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kCkBAIC0wLDAgKzEsMTAgQEAKKyNvYmpkdW1wOiAtcgorI25hbWU6IHZ0YWJsZSBpbmhlcml0MAorCisuKjogK2ZpbGUgZm9ybWF0IC4qCisKK1JFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsuZGF0YVxdOgorT0ZGU0VUICtUWVBFICtWQUxVRSAKKzArMDAwMDAwMCBSXy4qX0dOVV9WVElOSEVSSVQgIFwqQUJTXCoKKzArMDAwMDAxMCBSXy4qX0dOVV9WVElOSEVSSVQgIHZ0YmxfYQorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzhkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAucwpAQCAtMCwwICsxLDEzIEBACisuZGF0YQorCisudHlwZSB2dGJsX2Esb2JqZWN0Cit2dGJsX2E6CisJLnNwYWNlIDE2Cisuc2l6ZSB2dGJsX2EsMTYKKy52dGFibGVfaW5oZXJpdCB2dGJsX2EsIDAKKworLnR5cGUgdnRibF9iLG9iamVjdAordnRibF9iOgorCS5zcGFjZSAxNgorLnNpemUgdnRibF9iLDE2CisudnRhYmxlX2luaGVyaXQgdnRibF9iLCB2dGJsX2EKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNjM1OAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5sCkBAIC0wLDAgKzEsNiBAQAorLio6IEFzc2VtYmxlciBtZXNzYWdlczoKKy4qOjE6IEVycm9yOiBleHBlY3RlZCBgdnRibF9hJyB0byBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIC52dGFibGVfaW5oZXJpdAorLipHQVMuKgorCisKKyArMS4qdnRhYmxlX2luaGVyaXQgdnRibF9hLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDFkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucwpAQCAtMCwwICsxIEBACisudnRhYmxlX2luaGVyaXQgdnRibF9hLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvdnRhYmxlLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS92dGFibGUuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTQ0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvdnRhYmxlLmV4cApAQCAtMCwwICsxLDM5IEBACisjCisjIHZ0YWJsZSB0ZXN0cworIworcHJvYyBydW5fbGlzdF90ZXN0IHsgbmFtZSBvcHRzIH0geworICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCisgICAgc2V0IHRlc3RuYW1lICJ2dGFibGUgJG5hbWUiCisgICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCisgICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCisgICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKKwlmYWlsICR0ZXN0bmFtZQorCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgorCXJldHVybgorICAgIH0KKyAgICBwYXNzICR0ZXN0bmFtZQorfQorCisjIFZ0YWJsZSBiaXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSBFTEYgdGFyZ2V0cy4KK2lmIHtbaXN0YXJnZXQgIiotKi1lbGYqIl0gfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl19IHRoZW4geworCisKKyAgICAjIG5vdCBzdXBwb3J0ZWQgYnkgRDMwVgorICAgIGlmIHtbaXN0YXJnZXQgImQzMHYtKi0qIl19IHsKKyAgICAgIHJldHVybgorICAgIH0KKworICAgIHJ1bl9kdW1wX3Rlc3QgImluaGVyaXQwIiAKKyAgICBydW5fbGlzdF90ZXN0ICJpbmhlcml0MSIgIi1hbCIKKworICAgICMgVGhlIHZ0YWJsZSBlbnRyeSByZXN1bHRzIGFyZSBkaWZmZXJlbnQgb24gUmVsIGFuZCBSZWxhIHRhcmdldHMuCisgICAgaWYge1tpc3RhcmdldCAiaSo4Ni0qLSoiXSB8fCBbaXN0YXJnZXQgIm1pcHMqLSotKiJdfSB0aGVuIHsKKworCXJ1bl9kdW1wX3Rlc3QgImVudHJ5MCIKKworICAgIH0gZWxzZSB7CisKKwlydW5fZHVtcF90ZXN0ICJlbnRyeTEiCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMS5IIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDM3MzIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSApAQCAtMCwwICsxLDMgQEAKK0ZJTEUgMSBGSVJTVCBMSU5FCisJLklOQ0xVREUJIklOQzIuSCIKK0ZJTEUgMSBMQVNUIExJTkUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMyLkggYi9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5ICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2MzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvSU5DMi5ICkBAIC0wLDAgKzEsMiBAQAorCUZJTEUgMiBGSVJTVCBMSU5FCisJRklMRSAyIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjY2NzE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20KQEAgLTAsMCArMSwxMyBAQAorCitmb286CS5BU1NJR05DCSJoZWxsbyIKK0JBUjoJLkFTU0lHTkEJMTIrMzQKKworCVwmZm9vJ2ZvbworCVwmZm9vXCZmb29cJmZvbyAKKwlcJmZvbyBcJmZvbyBcJmZvbyAKKwlcJkJBUlwmYmFyXCZCQVIKKworCisKKwkKKwkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24uZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzczM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgpAQCAtMCwwICsxIEBACithc3NpZ24uYXNtOjggQ2FuJ3QgZmluZCBwcmVwcm9jZXNzb3IgdmFyaWFibGUgYmFyLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUwOWFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5vdXQKQEAgLTAsMCArMSwyMiBAQAorIQorCishZm9vOgkuQVNTSUdOQwkiaGVsbG8iCishQkFSOgkuQVNTSUdOQQkxMiszNAorIQorCishCVwmZm9vJ2ZvbworCWhlbGxvZm9vCishCVwmZm9vXCZmb29cJmZvbyAKKwloZWxsb2hlbGxvaGVsbG8gCishCVwmZm9vIFwmZm9vIFwmZm9vIAorCWhlbGxvIGhlbGxvIGhlbGxvIAorIQlcJkJBUlwmYmFyXCZCQVIKKwk0NjQ2CishCisKKyEKKworIQorCishCQorIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkOWYwNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmFzbQpAQCAtMCwwICsxLDEyOSBAQAorCS5BSUYJMSBFUSAxCisJT0sKKwkuQUVMU0UKKwlCQUQKKwkuQUVOREkKKwkuQUlGCTEgRVEgMgorCUJBRAorCS5BRUxTRQorCU9LCisJLkFFTkRJCisJLkFJRgkxIEVRIDIKKwlCQUQKKwkuQUVMU0UKKwlPSworCS5BSUYJMSBFUSAyCisJQkFECisJLkFFTFNFCisJT0sKKwkuQUVOREkKKwkuQUVOREkKKwkuQUlGCTEgTFQgIDIKKwlPSworCS5BRU5ESQorCS5BSUYJMSBFUSAgMgorCUJBRAorCS5BRU5ESQorCS5BSUYJMSBORSAgMgorCU9LCisJLkFFTkRJCisJLkFJRgkxIExFICAyCisJT0sKKwkuQUVOREkKKwkuQUlGCTEgR1QgIDIKKwlCQUQKKwkuQUVOREkKKwkuQUlGCTMgR0UgIDIKKwlPSworCS5BRU5ESQorCS5BSUYJMyBMVCAgMgorCUJBRAorCS5BRU5ESQorCS5BSUYJMyBFUSAgMgorCUJBRCAKKwkuQUVOREkKKwkuQUlGCTMgTkUgIDIKKwlPSworCS5BRU5ESQorCS5BSUYJMyBMRSAgMgorCUJBRAorCS5BRU5ESQorCS5BSUYJMyBHVCAgMgorCU9LCisJLkFFTkRJCisJLkFJRgkzIEdFICAyCisJT0sKKwkuQUVOREkKKwkuQUlGCSJGT08iIEVRICJCQVIiCisJQkFECisJLkFFTkRJCisJLkFJRgkiRk9PIiBFUSAiRk9PIgorCU9LCisJLkFFTkRJCisJLkFJRgkiRk9PIiBORSAiQkFSIgorCU9LCisJLkFFTkRJCisJLkFJRgkiRk9PIiBFUSAiRk9PIgorCU9LCisJLkFFTkRJCisJLkFJRgkxIEVRIDEKKwkuQUlGCTEgRVEgMQorCU9LCisJLkFFTFNFCQorCUJBRAorCS5BRU5ESQorCS5BSUYJMSBFUSAwCisJQkFECisJLkFFTFNFCQorCU9LCisJLkFFTkRJCisJT0sKKwkuQUVMU0UJCisJQkFECisJLkFFTkRJCisJLkFJRgkxIEVRIDAKKwlCQUQKKwkuQUVMU0UJCisJT0sKKwkuQUVOREkKKwkuQUlGCTEgRVEgMQorCU9LCisJLkFFTFNFCQorCUJBRAorCS5BRU5ESQorCS5BSUYJMSBFUSAwCisJQkFECisJLkFFTFNFCQorCS5BSUYJMSBFUSAxCisJT0sKKwkuQUVMU0UJCisJQkFECisJLkFFTkRJCisJLkFJRgkxIEVRIDAKKwlCQUQKKwkuQUVMU0UJCisJT0sKKwkuQUVOREkKKwlPSworCS5BRU5ESQorCS5BSUYJMSBFUSAxCisJT0sKKwkuQUlGCTEgRVEgMQorCU9LCisJLkFFTFNFCQorCUJBRAorCS5BRU5ESQorCS5BSUYJMSBFUSAwCisJQkFECisJLkFFTFNFCQorCU9LCisJLkFFTkRJCisJLkFFTFNFCQorCUJBRAorCS5BRU5ESQorCS5BSUYJMSBFUSAwCisJQkFECisJLkFFTFNFCQorCU9LCisJLkFFTkRJCisJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVjZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0CkBAIC0wLDAgKzEsMTU1IEBACishCS5BSUYJMSBFUSAxCishCU9LCisJT0sKKyEJLkFFTFNFCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkxIEVRIDIKKyEJQkFECishCS5BRUxTRQorIQlPSworCU9LCishCS5BRU5ESQorIQkuQUlGCTEgRVEgMgorIQlCQUQKKyEJLkFFTFNFCishCU9LCisJT0sKKyEJLkFJRgkxIEVRIDIKKyEJQkFECishCS5BRUxTRQorIQlPSworCU9LCishCS5BRU5ESQorIQkuQUVOREkKKyEJLkFJRgkxIExUICAyCishCU9LCisJT0sKKyEJLkFFTkRJCishCS5BSUYJMSBFUSAgMgorIQlCQUQKKyEJLkFFTkRJCishCS5BSUYJMSBORSAgMgorIQlPSworCU9LCishCS5BRU5ESQorIQkuQUlGCTEgTEUgIDIKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJLkFJRgkxIEdUICAyCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkzIEdFICAyCishCU9LCisJT0sKKyEJLkFFTkRJCishCS5BSUYJMyBMVCAgMgorIQlCQUQKKyEJLkFFTkRJCishCS5BSUYJMyBFUSAgMgorIQlCQUQgCishCS5BRU5ESQorIQkuQUlGCTMgTkUgIDIKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJLkFJRgkzIExFICAyCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkzIEdUICAyCishCU9LCisJT0sKKyEJLkFFTkRJCishCS5BSUYJMyBHRSAgMgorIQlPSworCU9LCishCS5BRU5ESQorIQkuQUlGCSJGT08iIEVRICJCQVIiCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkiRk9PIiBFUSAiRk9PIgorIQlPSworCU9LCishCS5BRU5ESQorIQkuQUlGCSJGT08iIE5FICJCQVIiCishCU9LCisJT0sKKyEJLkFFTkRJCishCS5BSUYJIkZPTyIgRVEgIkZPTyIKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJLkFJRgkxIEVRIDEKKyEJLkFJRgkxIEVRIDEKKyEJT0sKKwlPSworIQkuQUVMU0UJCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkxIEVRIDAKKyEJQkFECishCS5BRUxTRQkKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJT0sKKwlPSworIQkuQUVMU0UJCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkxIEVRIDAKKyEJQkFECishCS5BRUxTRQkKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJLkFJRgkxIEVRIDEKKyEJT0sKKwlPSworIQkuQUVMU0UJCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkxIEVRIDAKKyEJQkFECishCS5BRUxTRQkKKyEJLkFJRgkxIEVRIDEKKyEJT0sKKwlPSworIQkuQUVMU0UJCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkxIEVRIDAKKyEJQkFECishCS5BRUxTRQkKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJLkFJRgkxIEVRIDEKKyEJT0sKKwlPSworIQkuQUlGCTEgRVEgMQorIQlPSworCU9LCishCS5BRUxTRQkKKyEJQkFECishCS5BRU5ESQorIQkuQUlGCTEgRVEgMAorIQlCQUQKKyEJLkFFTFNFCQorIQlPSworCU9LCishCS5BRU5ESQorIQkuQUVMU0UJCishCUJBRAorIQkuQUVOREkKKyEJLkFJRgkxIEVRIDAKKyEJQkFECishCS5BRUxTRQkKKyEJT0sKKwlPSworIQkuQUVOREkKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxMGNjNQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20KQEAgLTAsMCArMSwyMiBAQAorCisJU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAorCitmb286CS5NQUNSTwkKKwlISQorYmFyOgkuTUFDUk8JCisJVEhFUkUKKwliYXIKKwkuRU5ETQkKKworCisJLkVORE0KKwlmb28KKwlmb28KKwlmb28KKwlmb28KKwlmb28KKwliYXIKKworCisKKwkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMDg4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCkBAIC0wLDAgKzEgQEAKK2NyYXNoLmFzbToxOCBVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NDhhMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5vdXQKQEAgLTAsMCArMSwzMDU5IEBACishCisKKyEJU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAorCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKKyEKKworIWZvbzoJLk1BQ1JPCQorIQlISQorIWJhcjoJLk1BQ1JPCQorIQlUSEVSRQorIQliYXIKKyEJLkVORE0JCishCishCishCS5FTkRNCishCWZvbworIQlISQorCUhJCishYmFyOgkuTUFDUk8JCishCVRIRVJFCishCWJhcgorIQkuRU5ETQkKKyEKKworIQorCishCWZvbworIQlISQorCUhJCishYmFyOgkuTUFDUk8JCishCVRIRVJFCishCWJhcgorIQkuRU5ETQkKKyEKKworIQorCishCWZvbworIQlISQorCUhJCishYmFyOgkuTUFDUk8JCishCVRIRVJFCishCWJhcgorIQkuRU5ETQkKKyEKKworIQorCishCWZvbworIQlISQorCUhJCishYmFyOgkuTUFDUk8JCishCVRIRVJFCishCWJhcgorIQkuRU5ETQkKKyEKKworIQorCishCWZvbworIQlISQorCUhJCishYmFyOgkuTUFDUk8JCishCVRIRVJFCishCWJhcgorIQkuRU5ETQkKKyEKKworIQorCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgorIQlUSEVSRQorCVRIRVJFCishCWJhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI2YjMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20KQEAgLTAsMCArMSwxMyBAQAorCisKKwkuTUFDUk8gCWZvbyBhIGIgYz1hCisJXGEgXGIgXGMgXGQKKwkuRU5ETQorCisJZm9vIDEgMgorCWZvbyAxIDIgMyA0CisJZm9vIDEKKwlmb28gCisKKworCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWQwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLm91dApAQCAtMCwwICsxLDI0IEBACishCisKKyEKKworIQkuTUFDUk8gCWZvbyBhIGIgYz1hCishCVxhIFxiIFxjIFxkCishCS5FTkRNCishCisKKyEJZm9vIDEgMgorIQkxIDIgYSBcZAorCTEgMiBhIFxkCishCWZvbyAxIDIgMyA0CishCWZvbyAxCishCTEgIGEgXGQKKwkxICBhIFxkCishCWZvbyAKKyEJICBhIFxkCisJYSBcZAorIQorCishCisKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhhMDAzCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20KQEAgLTAsMCArMSw0MSBAQAorCitmb286CS5BU1NJR05BCTEKKwlcJmZvbysxCQorCVwmZm9vKzEKK2ZvbzoJLkFTU0lHTkMJImZvbyIKKwlcJmZvbysxCisJXCZmb28rMQorCitmb286CS5BU1NJR05BCTEKKwlcJmZvbysxCQorCVwmZm9vKzEKK2ZvbzoJLkFTU0lHTkMJImZvbyIKKwlcJmZvbysxCisJXCZmb28rMQorCitmb286CS5BU1NJR05BCTEKKwlcJmZvbysxCQorCVwmZm9vKzEKK2ZvbzoJLkFTU0lHTkMJImZvbyIKKwlcJmZvbysxCisJXCZmb28rMQorCitmb286CS5BU1NJR05BCTEKKwlcJmZvbysxCQorCVwmZm9vKzEKK2ZvbzoJLkFTU0lHTkMJImZvbyIKKwlcJmZvbysxCisJXCZmb28rMQorCitmb286CS5BU1NJR05BCTEKKwlcJmZvbysxCQorCVwmZm9vKzEKK2ZvbzoJLkFTU0lHTkMJImZvbyIKKwlcJmZvbysxCisJXCZmb28rMQorCWZvbworCWZvbwlmb28KKwlmb28JZm9vCisJZm9vCisJLkVORAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDFhMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5vdXQKQEAgLTAsMCArMSw2OSBAQAorIQorCishZm9vOgkuQVNTSUdOQQkxCishCVwmZm9vKzEJCisJMSsxCQorIQlcJmZvbysxCisJMSsxCishZm9vOgkuQVNTSUdOQwkiZm9vIgorIQlcJmZvbysxCisJZm9vKzEKKyEJXCZmb28rMQorCWZvbysxCishCisKKyFmb286CS5BU1NJR05BCTEKKyEJXCZmb28rMQkKKwkxKzEJCishCVwmZm9vKzEKKwkxKzEKKyFmb286CS5BU1NJR05DCSJmb28iCishCVwmZm9vKzEKKwlmb28rMQorIQlcJmZvbysxCisJZm9vKzEKKyEKKworIWZvbzoJLkFTU0lHTkEJMQorIQlcJmZvbysxCQorCTErMQkKKyEJXCZmb28rMQorCTErMQorIWZvbzoJLkFTU0lHTkMJImZvbyIKKyEJXCZmb28rMQorCWZvbysxCishCVwmZm9vKzEKKwlmb28rMQorIQorCishZm9vOgkuQVNTSUdOQQkxCishCVwmZm9vKzEJCisJMSsxCQorIQlcJmZvbysxCisJMSsxCishZm9vOgkuQVNTSUdOQwkiZm9vIgorIQlcJmZvbysxCisJZm9vKzEKKyEJXCZmb28rMQorCWZvbysxCishCisKKyFmb286CS5BU1NJR05BCTEKKyEJXCZmb28rMQkKKwkxKzEJCishCVwmZm9vKzEKKwkxKzEKKyFmb286CS5BU1NJR05DCSJmb28iCishCVwmZm9vKzEKKwlmb28rMQorIQlcJmZvbysxCisJZm9vKzEKKyEJZm9vCisJZm9vCishCWZvbwlmb28KKwlmb28JZm9vCishCWZvbwlmb28KKwlmb28JZm9vCishCWZvbworCWZvbworIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2YjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmFzbQpAQCAtMCwwICsxLDIzIEBACisKK2ZvbwkuREFUQQkxLDIsMworYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgorCS5EQVRBLkIJMTIzNDUsMTIsMgorCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKKwkuREFUQS5MIDJ+OTkKKworCisKKwkuREFUQUIJMSwyLDMKKwkuREFUQUIJMSwyLDMKKworCisKKworCS5EQVRBQgkxLDkrMzIKKworCS5EQVRBQi5MCTEsSCcxMTExMTExMQorCS5EQVRBQi5XCTIsSCcyMjIyCisJLkRBVEFCLkIJMyxIJzMzMworCisKKwkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmVycgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmUxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQKQEAgLTAsMCArMSw0NSBAQAorIQorCishZm9vCS5EQVRBCTEsMiwzCitmb286CS5sb25nCTEsMiwzCishYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgorYmFyOgkubG9uZwkxLDIsMyw0LDUsNgorIQkuREFUQS5CCTEyMzQ1LDEyLDIKKwkuYnl0ZQkxMjM0NSwxMiwyCishCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKKwkuc2hvcnQJOSwyLDEyLDMsNTQsZm9vKzkKKyEJLkRBVEEuTCAyfjk5CisJLmxvbmcJOTcKKyEKKworIQorCishCisKKyEJLkRBVEFCCTEsMiwzCisJLmZpbGwJMSw0LDIKKyEJLkRBVEFCCTEsMiwzCisJLmZpbGwJMSw0LDIKKyEKKworIQorCishCisKKyEKKworIQkuREFUQUIJMSw5KzMyCisJLmZpbGwJMSw0LDQxCishCisKKyEJLkRBVEFCLkwJMSxIJzExMTExMTExCisJLmZpbGwJMSw0LDI4NjMzMTE1MworIQkuREFUQUIuVwkyLEgnMjIyMgorCS5maWxsCTIsMiw4NzM4CishCS5EQVRBQi5CCTMsSCczMzMKKwkuZmlsbAkzLDEsODE5CishCisKKyEKKworIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTYwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbQpAQCAtMCwwICsxLDgwIEBACisKKzsgdGVzdCBhbGwgb3BzCisKK2ExCS5FUVUJNCsxMAorYTIJLkVRVQk0LTEwCithMwkuRVFVCTQmMTAKK2E0CS5FUVUJNHwyCithNQkuRVFVCTR+MgorYTYJLkVRVQk0KjEwCithNwkuRVFVCTQwLzEwCithOAkuRVFVCSs3CithOQkuRVFVCS03CithMTAJLkVRVQl+NworCisKKwlhMSBhMiBhMyBhNCBhNSBhNiBhNyBhOCBhOSBhMTAKKworOyB0ZXN0IHRoZSBwcmlvcml0aWVzCisKK2IxCS5FUVUJMXwyfjMmNCs1LTgqNy8yCitiMgkuRVFVCSgxfDJ+KDMmKDQrNS0oOCooNy8yKSkpKSkKK2IzCS5FUVUJMTAqMi8zKjQKK2I0CS5FUVUJKCgoMTAqMikvMykqNCkKK2I1CS5FUVUJMTArMi0zKzQKK2I2CS5FUVUJKCgoMTArMiktMykrNCkKKworCWIxIGIyIGIzIGI0CisKKzsgdGVzdCBhc3NvY2lhdGlvbgorCitjMQkuRVFVCS1+MworYzIJLkVRVQl+LTMKK2MzCS5FUVUJLSh+MykKK2M0CS5FUVUJfigtMykKKworCWMxIGMyIGMzIGM0CisKKzsgdGVzdCBydWxlcyBmb3Igc3ltYm9scworCitvazEJLkVRVQlGT08KK29rMgkuRVFVCUZPTysxMAorb2szCS5FUVUJMTArRk9PCitvazQJLkVRVQlGT08tMTAKKworCW9rMQorCW9rMiAKKwlvazMgCisJb2s0CisKK29rNQkuRVFVCUZPTyszKzQrNSs2CitvazYJLkVRVQlGT08tQkFSCisKKwlvazUKKwlvazYKKworYmFkMQkuRVFVCUZPTytGT08KK2JhZDIJLkVRVQlGT08qMgorYmFkMwkuRVFVCUZPTy8yCitiYWQ0CS5FUVUJRk9PfDIKK2JhZDUJLkVRVQlGT08mMgorYmFkNgkuRVFVCUZPT34yCitiYWQ3CS5FUVUJRk9PKjIKKworOyB0ZXN0IHNwYWNpbmcKKworc3BhY2UxCS5FUVUJMSArCTIJKzMrRk9PICsgMworc3BhY2UyCisKKzsgZnJvbSB0aGUgU0ggbWFudWFsCisKKwkuREFUQS5MCTErKDItKDMrKDQtNSkpKSwxCisKKwkuREFUQS5MCS1IJ2ZmZmZmZmYxK0gnMDAwMDAwZjAqSCcwMDAwMDAxMHxIJzAwMDAwMGYwJkgnMDAwMGZmZmYsSCcwMDAwMGZmZgorCisJLkRBVEEuTAktfi1+SCcwMDAwMDAwZixIJzAwCisKKworCQorCisJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDFmZDUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIKQEAgLTAsMCArMSw3IEBACitleHAuYXNtOjU2IGNhbid0IGFkZCB0d28gcmVsb2NhdGFibGUgZXhwcmVzc2lvbnMKK2V4cC5hc206NTcgdGhlICogb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KK2V4cC5hc206NTggdGhlIC8gb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KK2V4cC5hc206NTkgdGhlIHwgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KK2V4cC5hc206NjAgdGhlICYgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KK2V4cC5hc206NjEgdGhlIH4gb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KK2V4cC5hc206NjIgdGhlICogb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjYjlhOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAub3V0CkBAIC0wLDAgKzEsMTI0IEBACishCisKKyE7IHRlc3QgYWxsIG9wcworCTsgdGVzdCBhbGwgb3BzCishCisKKyFhMQkuRVFVCTQrMTAKKyFhMgkuRVFVCTQtMTAKKyFhMwkuRVFVCTQmMTAKKyFhNAkuRVFVCTR8MgorIWE1CS5FUVUJNH4yCishYTYJLkVRVQk0KjEwCishYTcJLkVRVQk0MC8xMAorIWE4CS5FUVUJKzcKKyFhOQkuRVFVCS03CishYTEwCS5FUVUJfjcKKyEKKworIQorCishCWExIGEyIGEzIGE0IGE1IGE2IGE3IGE4IGE5IGExMAorCTE0IC02IDAgNiA2IDQwIDQgNyAtNyAtOAorIQorCishOyB0ZXN0IHRoZSBwcmlvcml0aWVzCisJOyB0ZXN0IHRoZSBwcmlvcml0aWVzCishCisKKyFiMQkuRVFVCTF8Mn4zJjQrNS04KjcvMgorIWIyCS5FUVUJKDF8Mn4oMyYoNCs1LSg4Kig3LzIpKSkpKQorIWIzCS5FUVUJMTAqMi8zKjQKKyFiNAkuRVFVCSgoKDEwKjIpLzMpKjQpCishYjUJLkVRVQkxMCsyLTMrNAorIWI2CS5FUVUJKCgoMTArMiktMykrNCkKKyEKKworIQliMSBiMiBiMyBiNAorCTIgMiAyNCAyNAorIQorCishOyB0ZXN0IGFzc29jaWF0aW9uCisJOyB0ZXN0IGFzc29jaWF0aW9uCishCisKKyFjMQkuRVFVCS1+MworIWMyCS5FUVUJfi0zCishYzMJLkVRVQktKH4zKQorIWM0CS5FUVUJfigtMykKKyEKKworIQljMSBjMiBjMyBjNAorCTQgMiA0IDIKKyEKKworITsgdGVzdCBydWxlcyBmb3Igc3ltYm9scworCTsgdGVzdCBydWxlcyBmb3Igc3ltYm9scworIQorCishb2sxCS5FUVUJRk9PCishb2syCS5FUVUJRk9PKzEwCishb2szCS5FUVUJMTArRk9PCishb2s0CS5FUVUJRk9PLTEwCishCisKKyEJb2sxCisJRk9PCishCW9rMiAKKwlGT08rMTAgCishCW9rMyAKKwlGT08rMTAgCishCW9rNAorCUZPTystMTAKKyEKKworIW9rNQkuRVFVCUZPTyszKzQrNSs2Cishb2s2CS5FUVUJRk9PLUJBUgorIQorCishCW9rNQorCUZPTysxOAorIQlvazYKKwlGT08tRk9PCishCisKKyFiYWQxCS5FUVUJRk9PK0ZPTworIWJhZDIJLkVRVQlGT08qMgorIWJhZDMJLkVRVQlGT08vMgorIWJhZDQJLkVRVQlGT098MgorIWJhZDUJLkVRVQlGT08mMgorIWJhZDYJLkVRVQlGT09+MgorIWJhZDcJLkVRVQlGT08qMgorIQorCishOyB0ZXN0IHNwYWNpbmcKKwk7IHRlc3Qgc3BhY2luZworIQorCishc3BhY2UxCS5FUVUJMSArCTIJKzMrRk9PICsgMworIXNwYWNlMgorc3BhY2UyOgorIQorCishOyBmcm9tIHRoZSBTSCBtYW51YWwKKwk7IGZyb20gdGhlIFNIIG1hbnVhbAorIQorCishCS5EQVRBLkwJMSsoMi0oMysoNC01KSkpLDEKKwkubG9uZwkxLDEKKyEKKworIQkuREFUQS5MCS1IJ2ZmZmZmZmYxK0gnMDAwMDAwZjAqSCcwMDAwMDAxMHxIJzAwMDAwMGYwJkgnMDAwMGZmZmYsSCcwMDAwMGZmZgorCS5sb25nCTQwOTUsNDA5NQorIQorCishCS5EQVRBLkwJLX4tfkgnMDAwMDAwMGYsSCcwMAorCS5sb25nCTE3LDAKKyEKKworIQorCishCQorIQorCishCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcyYTZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2dhc3AuZXhwCkBAIC0wLDAgKzEsNDAgQEAKKyMgVGVzdCBnYXNwLgorCitwcm9jIGdhc3BfdGVzdCB7IGZpbGVuYW1lIHRlc3RuYW1lIG9wdCB9ICB7CisgICAgZ2xvYmFsIEdBU1AKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGhvc3RfdHJpcGxldAorCisgICAgc2VuZF9sb2cgIiRzcmNkaXIvbGliL3J1biAkR0FTUCAtSSRzcmNkaXIvZ2FzcCAtcyAkb3B0ICRmaWxlbmFtZS5hc20gLW8gZ2FzcC5vdXRcbiIKKyAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEdBU1AgLUkkc3JjZGlyL2dhc3AgLXMgJG9wdCAkZmlsZW5hbWUuYXNtIC1vIGdhc3Aub3V0IiBlcnJzCisgICAgY2F0Y2ggImV4ZWMgZGlmZiBnYXNwLm91dCAkZmlsZW5hbWUub3V0IiBkaWZmcworICAgIHNldCBkaWZmcyBbcHJ1bmVfd2FybmluZ3MgJGRpZmZzXQorICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRkaWZmc10geworCXNlbmRfbG9nICIkZGlmZnNcbiIKKwl2ZXJib3NlICRkaWZmcworCWZhaWwgJHRlc3RuYW1lCisJcmV0dXJuIDAKKyAgICB9IGVsc2UgeworCXBhc3MgJHRlc3RuYW1lCisgICAgfQorCit9CisKK2ZvcmVhY2ggc3JjIFsgbHNvcnQgWyBnbG9iICRzcmNkaXIvZ2FzcC8qLmFzbSBdIF0geworICAgIHJlZ3N1YiAtYWxsICIuYXNtIiAkc3JjICIiIHQKKyAgICByZWdzdWIgIl4uKi8oXFteL1xdKikkIiAkdCAiZ2FzcCBcXDEiIHRlc3RuYW1lCisgICAgZ2FzcF90ZXN0ICR0ICR0ZXN0bmFtZSAiIgorfQorCitmb3JlYWNoIHNyYyBbIGxzb3J0IFsgZ2xvYiAkc3JjZGlyL2dhc3AvbXJpLyouYXNtIF0gXSB7CisgICAgcmVnc3ViIC1hbGwgIi5hc20iICRzcmMgIiIgdAorICAgIHJlZ3N1YiAiXi4qLyhcW14vXF0qKSQiICR0ICJnYXNwIE1SSSBcXDEiIHRlc3RuYW1lCisgICAgZ2FzcF90ZXN0ICR0ICR0ZXN0bmFtZSAiLU0iCit9CisKKyMgRklYTUU6IHRoaXMgaXMgaGVyZSBjYXVzZSBvZiBhIGJ1ZyBpbiBEZWphR251IDEuMS4xLiBXaGVuIGl0IGlzIG5vIGxvbmdlcgorIyAgICAgICAgaW4gdXNlLCB0aGVuIHRoaXMgY2FuIGJlIHJlbW92ZWQuCitpZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKKyAgICB1bnNldCBlcnJvckluZm8KK30KKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWQxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5hc20KQEAgLTAsMCArMSw0IEBACisJSEkKKwkuSU5DTFVERQkiSU5DMS5IIgorCVRIRVJFCisJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdhMGRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUub3V0CkBAIC0wLDAgKzEsMTUgQEAKKyEJSEkKKwlISQorIQkuSU5DTFVERQkiSU5DMS5IIgorIUZJTEUgMSBGSVJTVCBMSU5FCitGSUxFOgkxIEZJUlNUIExJTkUKKyEJLklOQ0xVREUJIklOQzIuSCIKKyEJRklMRSAyIEZJUlNUIExJTkUKKwlGSUxFIDIgRklSU1QgTElORQorIQlGSUxFIDIgTEFTVCBMSU5FCisJRklMRSAyIExBU1QgTElORQorIUZJTEUgMSBMQVNUIExJTkUKK0ZJTEU6CTEgTEFTVCBMSU5FCishCVRIRVJFCisJVEhFUkUKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTRjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5hc20KQEAgLTAsMCArMSwxNSBAQAorCisKKwkuSEVBRElORwkiICIiUVVPVEUiIiAiCisJLlBBR0UKKwkuUFJJTlQgTElTVAorCWZvbwkJCisJLlBSSU5UIE5PTElTVAorCWZvbworCisKKwkuRk9STQlMSU49MTIKKwkuRk9STQlDT0w9OTAKKwkuRk9STQlMSU49MTIzIENPTD0yMworCQorCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1YmRhMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLm91dApAQCAtMCwwICsxLDI4IEBACishCisKKyEKKworIQkuSEVBRElORwkiICIiUVVPVEUiIiAiCisJLnRpdGxlCSIgIlFVT1RFIiAiCishCS5QQUdFCisJLmVqZWN0CishCS5QUklOVCBMSVNUCisJLmxpc3QKKyEJZm9vCQkKKwlmb28JCQorIQkuUFJJTlQgTk9MSVNUCisJLm5vbGlzdAorIQlmb28KKwlmb28KKyEKKworIQorCishCS5GT1JNCUxJTj0xMgorCS5wc2l6ZSAxMiwxMzIKKyEJLkZPUk0JQ09MPTkwCisJLnBzaXplIDYwLDkwCishCS5GT1JNCUxJTj0xMjMgQ09MPTIzCisJLnBzaXplIDEyMywyMworIQkKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiMTZiZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20KQEAgLTAsMCArMSwxMDIgQEAKKwkuTUFDUk8JU1VNIEZST009MCwgVE89OQorCTsgXEZST00gXFRPCisJTU9WCVJcRlJPTSxSMTAKK0NPVU5UCS5BU1NJR05BCVxGUk9NKzEKKwkuQVdISUxFCVwmQ09VTlQgTEUgXFRPCisJTU9WCVJcJkNPVU5ULFIxMAorQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCisJLkFFTkRXCisJLkVORE0KKworCVNVTSAwLDUKKwlTVU0gCVRPPTUKKwlTVU0gCUZST009MiwgVE89NQorCisKKzsgaGkgdGhpcyBpcyBhIGNvbW1lbnQKKwkuTUFDUk8JQkFDS19TTEFTSF9TRVQKKwlcKE1PVgkjIlwiLFIwKSAKKwkuRU5ETQorCUJBQ0tfU0xBU0hfU0VUCisJLk1BQ1JPCUNPTU0KKwliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAorCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCisJLkVORE0KKwlDT01NCisJQkFDS19TTEFTSF9TRVQKKwkuTUFDUk8JUExVUzIKKwlBREQJIzEsUlwmVjEKKwkuU0RBVEEJIlwmVicxIgorCS5FTkRNCitWCS5BU1NJR05DCSJSIgorVjEJLkFTU0lHTkEJMQorCVBMVVMyCisJLk1BQ1JPCVBMVVMxCVAsUDEKKwlBREQJIzEsXFAxCisJLlNEQVRBCSJcUCcxIgorCS5FTkRNCisJUExVUzEJUixSMQorCisJLk1BQ1JPCVNVTSBQMQorCU1PVglSMCxSMTAKKwlBREQJUjEsUjEwCisJQURECVIyLFIxMAorCVxQMQkKKwlBREQJUjMsUjEwCisJLkVORE0KKworCVNVTQkuRVhJVE0KKworCS5NQUNSTyBmb28gYmFyPWEgZGVmYXVsdD1iCisJXGJhcgorCVxkZWZhdWx0CisJYmFyCisJZGVmYXVsdAorCS5FTkRNCisJZm9vIGRlZmF1bHQ9ZG9nIGJhcj1jYXQKKwlmb28gWCBZCisJZm9vCisJZm9vIGJhcj1jYXQgZGVmYXVsdD1kb2cKKworCisJLk1BQ1JPCWZvbyBiYXIKKwlISQorCUhJIFxiYXIKKwlISQorCS5FTkRNCisKKwlmb28gMQorCWZvbyAxMjMKKwlmb28gMSAyIDMgNAorCWZvbworCisJCisJLk1BQ1JPCVBVU0ggUm4KKwlNT1YuTAlcUm4sQC1yMTUKKwkuRU5ETQorCVBVU0gJUjAKKwlQVVNICVIxCisKKworCS5NQUNSTwlSRVNfU1RSIFNUUiwgUm4KKwlNT1YuTAkjc3RyXEAsXFJuCisJQlJBCWVuZF9zdHJcQAorCU5PUAorc3RyXEAJLlNEQVRBICJcU1RSIgorCS5BTElHTgkyCitlbmRfc3RyXEAKKwkuRU5ETQorCQorCVJFU19TVFIJIk9ORSIsUjAJCisJUkVTX1NUUgkiVFdPIixSMQorCVJFU19TVFIJIlRIUkVFIixSMgorCisKKworCVJFU19TVFIgU1RSPWRvbmtleSBSbj1SMQorCVJFU19TVFIgZG9ua2V5LFIxCisgCVJFU19TVFIgZG9ua2V5IFJuPVIxCisJLkVORAorCisKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8ub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDA3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8ub3V0CkBAIC0wLDAgKzEsMzgyIEBACishCS5NQUNSTwlTVU0gRlJPTT0wLCBUTz05CishCTsgXEZST00gXFRPCishCU1PVglSXEZST00sUjEwCishQ09VTlQJLkFTU0lHTkEJXEZST00rMQorIQkuQVdISUxFCVwmQ09VTlQgTEUgXFRPCishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCS5FTkRNCishCisKKyEJU1VNIDAsNQorIQk7IDAgNQorCTsgMCA1CishCU1PVglSMCxSMTAKKwlNT1YJUjAsUjEwCishQ09VTlQJLkFTU0lHTkEJMCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjEsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjIsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjMsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjQsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjUsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCVNVTSAJVE89NQorIQk7IDAgNQorCTsgMCA1CishCU1PVglSMCxSMTAKKwlNT1YJUjAsUjEwCishQ09VTlQJLkFTU0lHTkEJMCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjEsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjIsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjMsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjQsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCU1PVglSXCZDT1VOVCxSMTAKKwlNT1YJUjUsUjEwCishQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCishCS5BV0hJTEUJXCZDT1VOVCBMRSA1CishCU1PVglSXCZDT1VOVCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFFTkRXCishCVNVTSAJRlJPTT0yLCBUTz01CishCTsgMiA1CisJOyAyIDUKKyEJTU9WCVIyLFIxMAorCU1PVglSMixSMTAKKyFDT1VOVAkuQVNTSUdOQQkyKzEKKyEJLkFXSElMRQlcJkNPVU5UIExFIDUKKyEJTU9WCVJcJkNPVU5ULFIxMAorIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQorIQkuQUVORFcKKyEJTU9WCVJcJkNPVU5ULFIxMAorCU1PVglSMyxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFXSElMRQlcJkNPVU5UIExFIDUKKyEJTU9WCVJcJkNPVU5ULFIxMAorIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQorIQkuQUVORFcKKyEJTU9WCVJcJkNPVU5ULFIxMAorCU1PVglSNCxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFXSElMRQlcJkNPVU5UIExFIDUKKyEJTU9WCVJcJkNPVU5ULFIxMAorIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQorIQkuQUVORFcKKyEJTU9WCVJcJkNPVU5ULFIxMAorCU1PVglSNSxSMTAKKyFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKKyEJLkFXSElMRQlcJkNPVU5UIExFIDUKKyEJTU9WCVJcJkNPVU5ULFIxMAorIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQorIQkuQUVORFcKKyEKKworIQorCishOyBoaSB0aGlzIGlzIGEgY29tbWVudAorCTsgaGkgdGhpcyBpcyBhIGNvbW1lbnQKKyEJLk1BQ1JPCUJBQ0tfU0xBU0hfU0VUCishCVwoTU9WCSMiXCIsUjApIAorIQkuRU5ETQorIQlCQUNLX1NMQVNIX1NFVAorIQlNT1YJIyJcIixSMCAKKwlNT1YJIyJcIixSMCAKKyEJLk1BQ1JPCUNPTU0KKyEJYmFyCTsgdGhpcyBjb21tZW50IHdpbGwgZ2V0IGNvcGllZCBvdXQKKyEJZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKKyEJLkVORE0KKyEJQ09NTQorIQliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAorCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0CishCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCisJZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKKyEJQkFDS19TTEFTSF9TRVQKKyEJTU9WCSMiXCIsUjAgCisJTU9WCSMiXCIsUjAgCishCS5NQUNSTwlQTFVTMgorIQlBREQJIzEsUlwmVjEKKyEJLlNEQVRBCSJcJlYnMSIKKyEJLkVORE0KKyFWCS5BU1NJR05DCSJSIgorIVYxCS5BU1NJR05BCTEKKyEJUExVUzIKKyEJQURECSMxLFJcJlYxCisJQURECSMxLFIxCishCS5TREFUQQkiXCZWJzEiCisJLmJ5dGUJODIsNDkKKyEJLk1BQ1JPCVBMVVMxCVAsUDEKKyEJQURECSMxLFxQMQorIQkuU0RBVEEJIlxQJzEiCishCS5FTkRNCishCVBMVVMxCVIsUjEKKyEJQURECSMxLFIxCisJQURECSMxLFIxCishCS5TREFUQQkiUjEiCisJLmJ5dGUJODIsNDkKKyEKKworIQkuTUFDUk8JU1VNIFAxCishCU1PVglSMCxSMTAKKyEJQURECVIxLFIxMAorIQlBREQJUjIsUjEwCishCVxQMQkKKyEJQURECVIzLFIxMAorIQkuRU5ETQorIQorCishCVNVTQkuRVhJVE0KKyEJTU9WCVIwLFIxMAorCU1PVglSMCxSMTAKKyEJQURECVIxLFIxMAorCUFERAlSMSxSMTAKKyEJQURECVIyLFIxMAorCUFERAlSMixSMTAKKyEJLkVYSVRNCQorIQorCishCS5NQUNSTyBmb28gYmFyPWEgZGVmYXVsdD1iCishCVxiYXIKKyEJXGRlZmF1bHQKKyEJYmFyCishCWRlZmF1bHQKKyEJLkVORE0KKyEJZm9vIGRlZmF1bHQ9ZG9nIGJhcj1jYXQKKyEJY2F0CisJY2F0CishCWRvZworCWRvZworIQliYXIKKwliYXIKKyEJZGVmYXVsdAorCWRlZmF1bHQKKyEJZm9vIFggWQorIQlYCisJWAorIQlZCisJWQorIQliYXIKKwliYXIKKyEJZGVmYXVsdAorCWRlZmF1bHQKKyEJZm9vCishCWEKKwlhCishCWIKKwliCishCWJhcgorCWJhcgorIQlkZWZhdWx0CisJZGVmYXVsdAorIQlmb28gYmFyPWNhdCBkZWZhdWx0PWRvZworIQljYXQKKwljYXQKKyEJZG9nCisJZG9nCishCWJhcgorCWJhcgorIQlkZWZhdWx0CisJZGVmYXVsdAorIQorCishCisKKyEJLk1BQ1JPCWZvbyBiYXIKKyEJSEkKKyEJSEkgXGJhcgorIQlISQorIQkuRU5ETQorIQorCishCWZvbyAxCishCUhJCisJSEkKKyEJSEkgMQorCUhJIDEKKyEJSEkKKwlISQorIQlmb28gMTIzCishCUhJCisJSEkKKyEJSEkgMTIzCisJSEkgMTIzCishCUhJCisJSEkKKyEJZm9vIDEgMiAzIDQKKyEJZm9vCishCUhJCisJSEkKKyEJSEkgCisJSEkgCishCUhJCisJSEkKKyEKKworIQkKKyEJLk1BQ1JPCVBVU0ggUm4KKyEJTU9WLkwJXFJuLEAtcjE1CishCS5FTkRNCishCVBVU0gJUjAKKyEJTU9WLkwJUjAsQC1yMTUKKwlNT1YuTAlSMCxALXIxNQorIQlQVVNICVIxCishCU1PVi5MCVIxLEAtcjE1CisJTU9WLkwJUjEsQC1yMTUKKyEKKworIQorCishCS5NQUNSTwlSRVNfU1RSIFNUUiwgUm4KKyEJTU9WLkwJI3N0clxALFxSbgorIQlCUkEJZW5kX3N0clxACishCU5PUAorIXN0clxACS5TREFUQSAiXFNUUiIKKyEJLkFMSUdOCTIKKyFlbmRfc3RyXEAKKyEJLkVORE0KKyEJCishCVJFU19TVFIJIk9ORSIsUjAJCishCU1PVi5MCSNzdHIwMDAxOCxSMAorCU1PVi5MCSNzdHIwMDAxOCxSMAorIQlCUkEJZW5kX3N0cjAwMDE4CisJQlJBCWVuZF9zdHIwMDAxOAorIQlOT1AKKwlOT1AKKyFzdHIwMDAxOAkuU0RBVEEgIk9ORSIKK3N0cjAwMDE4OgkuYnl0ZQk3OSw3OCw2OQorIQkuQUxJR04JMgorCS5hbGlnbgkyCishZW5kX3N0cjAwMDE4CitlbmRfc3RyMDAwMTg6CishCVJFU19TVFIJIlRXTyIsUjEKKyEJTU9WLkwJI3N0cjAwMDE5LFIxCisJTU9WLkwJI3N0cjAwMDE5LFIxCishCUJSQQllbmRfc3RyMDAwMTkKKwlCUkEJZW5kX3N0cjAwMDE5CishCU5PUAorCU5PUAorIXN0cjAwMDE5CS5TREFUQSAiVFdPIgorc3RyMDAwMTk6CS5ieXRlCTg0LDg3LDc5CishCS5BTElHTgkyCisJLmFsaWduCTIKKyFlbmRfc3RyMDAwMTkKK2VuZF9zdHIwMDAxOToKKyEJUkVTX1NUUgkiVEhSRUUiLFIyCishCU1PVi5MCSNzdHIwMDAyMCxSMgorCU1PVi5MCSNzdHIwMDAyMCxSMgorIQlCUkEJZW5kX3N0cjAwMDIwCisJQlJBCWVuZF9zdHIwMDAyMAorIQlOT1AKKwlOT1AKKyFzdHIwMDAyMAkuU0RBVEEgIlRIUkVFIgorc3RyMDAwMjA6CS5ieXRlCTg0LDcyLDgyLDY5LDY5CishCS5BTElHTgkyCisJLmFsaWduCTIKKyFlbmRfc3RyMDAwMjAKK2VuZF9zdHIwMDAyMDoKKyEKKworIQorCishCisKKyEJUkVTX1NUUiBTVFI9ZG9ua2V5IFJuPVIxCishCU1PVi5MCSNzdHIwMDAyMSxSMQorCU1PVi5MCSNzdHIwMDAyMSxSMQorIQlCUkEJZW5kX3N0cjAwMDIxCisJQlJBCWVuZF9zdHIwMDAyMQorIQlOT1AKKwlOT1AKKyFzdHIwMDAyMQkuU0RBVEEgImRvbmtleSIKK3N0cjAwMDIxOgkuYnl0ZQkxMDAsMTExLDExMCwxMDcsMTAxLDEyMQorIQkuQUxJR04JMgorCS5hbGlnbgkyCishZW5kX3N0cjAwMDIxCitlbmRfc3RyMDAwMjE6CishCVJFU19TVFIgZG9ua2V5LFIxCishCU1PVi5MCSNzdHIwMDAyMixSMQorCU1PVi5MCSNzdHIwMDAyMixSMQorIQlCUkEJZW5kX3N0cjAwMDIyCisJQlJBCWVuZF9zdHIwMDAyMgorIQlOT1AKKwlOT1AKKyFzdHIwMDAyMgkuU0RBVEEgImRvbmtleSIKK3N0cjAwMDIyOgkuYnl0ZQkxMDAsMTExLDExMCwxMDcsMTAxLDEyMQorIQkuQUxJR04JMgorCS5hbGlnbgkyCishZW5kX3N0cjAwMDIyCitlbmRfc3RyMDAwMjI6CishIAlSRVNfU1RSIGRvbmtleSBSbj1SMQorIQlNT1YuTAkjc3RyMDAwMjMsUjEKKwlNT1YuTAkjc3RyMDAwMjMsUjEKKyEJQlJBCWVuZF9zdHIwMDAyMworCUJSQQllbmRfc3RyMDAwMjMKKyEJTk9QCisJTk9QCishc3RyMDAwMjMJLlNEQVRBICJkb25rZXkiCitzdHIwMDAyMzoJLmJ5dGUJMTAwLDExMSwxMTAsMTA3LDEwMSwxMjEKKyEJLkFMSUdOCTIKKwkuYWxpZ24JMgorIWVuZF9zdHIwMDAyMworZW5kX3N0cjAwMDIzOgorIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNzdiNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmFzbQpAQCAtMCwwICsxLDQ3IEBACisKKwkuTUFDUk8JSEkKKwlBCisJXCEgdGhpcyBpcyBoaWRkZW4KKwlCCisJISB0aGlzIGlzIG5vdAorCUMKKwkuRU5ETQorCUhlbGxvIAorCUhJCisJRW1pbHkKKwkKKworCUgnMGYKKwkyMDArSCcwRgorCitYWAkuQVNTSUdOQQlRJzEwMAorISBEZWZpbml0aW9uOgorCS5NQUNSTwlHRVQgWD0xMDAsWSxaCisJTU9WCSNcWCtIJzBGLEBCCisJXFkKK1xaCUpNUAlATUFJTgorTFxACUFERCAJIzEsQEhMCisJTU9WCSMwLEBDCVwhIENsZWFyIEMKKwlBREQJIzIsQEMKKwlBREQJI1wmWFgsIEBDCisJLkVORE0KKworCU5PUAorCishQ2FsbDoJCisJR0VUCTIwMCwiQUREICMxLEBCIiwgRU5UUlkKKwkuRU5ECisKKwk7IERlZmluaXRpb246CisKKworCU5PUAorCisJO0NhbGw6CQorCU1PVgkjMjAwKzBGLEBCCisJQUREICMxLEBCCitFTlRSWToJSk1QCUBNQUlOCitMMDAwMDA6CUFERCAJIzEsQEhMCisJTU9WCSMwLEBDCQorCUFERAkjMixAQworCUFERAkjMCwgQEMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5YWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLm91dApAQCAtMCwwICsxLDY4IEBACishCisKKyEJLk1BQ1JPCUhJCishCUEKKyEJXCEgdGhpcyBpcyBoaWRkZW4KKyEJQgorIQkhIHRoaXMgaXMgbm90CishCUMKKyEJLkVORE0KKyEJSGVsbG8gCisJSGVsbG8gCishCUhJCishCUEKKwlBCishCQorIQlCCisJQgorIQkhIHRoaXMgaXMgbm90CisJISB0aGlzIGlzIG5vdAorIQlDCisJQworIQlFbWlseQorCUVtaWx5CishCQorIQorCishCUgnMGYKKwkxNQorIQkyMDArSCcwRgorCTIwMCsxNQorIQorCishWFgJLkFTU0lHTkEJUScxMDAKKyEhIERlZmluaXRpb246CisJISBEZWZpbml0aW9uOgorIQkuTUFDUk8JR0VUIFg9MTAwLFksWgorIQlNT1YJI1xYK0gnMEYsQEIKKyEJXFkKKyFcWglKTVAJQE1BSU4KKyFMXEAJQUREIAkjMSxASEwKKyEJTU9WCSMwLEBDCVwhIENsZWFyIEMKKyEJQURECSMyLEBDCishCUFERAkjXCZYWCwgQEMKKyEJLkVORE0KKyEKKworIQlOT1AKKwlOT1AKKyEKKworISFDYWxsOgkKKwkhQ2FsbDoJCishCUdFVAkyMDAsIkFERCAjMSxAQiIsIEVOVFJZCishCU1PVgkjMjAwK0gnMEYsQEIKKwlNT1YJIzIwMCsxNSxAQgorIQlBREQgIzEsQEIKKwlBREQgIzEsQEIKKyFFTlRSWQlKTVAJQE1BSU4KK0VOVFJZOglKTVAJQE1BSU4KKyFMMDAwMDEJQUREIAkjMSxASEwKK0wwMDAwMToJQUREIAkjMSxASEwKKyEJTU9WCSMwLEBDCQorCU1PVgkjMCxAQwkKKyEJQURECSMyLEBDCisJQURECSMyLEBDCishCUFERAkjXCZYWCwgQEMKKwlBREQJIzY0LCBAQworIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjhmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbQpAQCAtMCwwICsxLDUgQEAKK2VtYmVkCW1hY3JvCWxhYmVsCithZGRyJiZsYWJlbAlkYy5sCWxhYmVsCisJZW5kbQorCisJZW1iZWQJZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDkyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLm91dApAQCAtMCwwICsxLDkgQEAKKztlbWJlZAltYWNybwlsYWJlbAorO2FkZHImJmxhYmVsCWRjLmwJbGFiZWwKKzsJZW5kbQorOworCis7CWVtYmVkCWZvbworO2FkZHJmb28JZGMubAlmb28KK2FkZHJmb286CWRjLmwJZm9vCis7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjIwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5hc20KQEAgLTAsMCArMSwxMCBAQAorZXhpc3RzCW1hY3JvCWFyZzEsYXJnMgorCWlmbmUJPT1hcmcyCisJbW92ZQlhcmcxLGFyZzIKKwllbHNlYworCXB1c2gJYXJnMQorCWVuZGMKKwllbmRtCisKKwlleGlzdHMJZm9vLGJhcgorCWV4aXN0cwlmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzUzMzdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMub3V0CkBAIC0wLDAgKzEsMjQgQEAKKztleGlzdHMJbWFjcm8JYXJnMSxhcmcyCis7CWlmbmUJPT1hcmcyCis7CW1vdmUJYXJnMSxhcmcyCis7CWVsc2VjCis7CXB1c2gJYXJnMQorOwllbmRjCis7CWVuZG0KKzsKKworOwlleGlzdHMJZm9vLGJhcgorOwlpZm5lCS0xCis7CW1vdmUJZm9vLGJhcgorCW1vdmUJZm9vLGJhcgorOwllbHNlYworOwlwdXNoCWZvbworOwllbmRjCis7CWV4aXN0cwlmb28KKzsJaWZuZQkwCis7CW1vdmUJZm9vLAorOwllbHNlYworOwlwdXNoCWZvbworCXB1c2gJZm9vCis7CWVuZGMKKzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhMjFkOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLmFzbQpAQCAtMCwwICsxLDQgQEAKKwlpcnAJcGFyYW0sYXJnMSxhcmcyLGFyZzMKKwlkYy5sCXBhcmFtCisJZW5kcgorCWVuZAlxdWl0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwNTYyMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLm91dApAQCAtMCwwICsxLDggQEAKKzsJaXJwCXBhcmFtLGFyZzEsYXJnMixhcmczCis7CWRjLmwJcGFyYW0KKzsJZW5kcgorCWRjLmwJYXJnMQorCWRjLmwJYXJnMgorCWRjLmwJYXJnMworOwllbmQJcXVpdAorCWVuZAlxdWl0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFkNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbQpAQCAtMCwwICsxLDMgQEAKKwlpcnBjCWR1bW15LDEyMzQKKwlkYy5sCWR1bW15CisJZW5kcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmODgyNAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5vdXQKQEAgLTAsMCArMSw4IEBACis7CWlycGMJZHVtbXksMTIzNAorOwlkYy5sCWR1bW15Cis7CWVuZHIKKwlkYy5sCTEKKwlkYy5sCTIKKwlkYy5sCTMKKwlkYy5sCTQKKzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTFiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLmFzbQpAQCAtMCwwICsxLDggQEAKK2dldAltYWNybwlhcmcxLGFyZzIsYXJnMworCWRjLmwJYXJnMQorCWFyZzIKK2FyZzMJZGMubAlcNAorCW1vdmUuXDAJZDAsZDEKKwllbmRtCisKKwlnZXQuYgkxLDxkYy5sIDI+LGxhYmVsLGZvdXIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9tYWNyby5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlZWI5NAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0CkBAIC0wLDAgKzEsMTggQEAKKztnZXQJbWFjcm8JYXJnMSxhcmcyLGFyZzMKKzsJZGMubAlhcmcxCis7CWFyZzIKKzthcmczCWRjLmwJXDQKKzsJbW92ZS5cMAlkMCxkMQorOwllbmRtCis7CisKKzsJZ2V0LmIJMSw8ZGMubCAyPixsYWJlbCxmb3VyCis7CWRjLmwJMQorCWRjLmwJMQorOwlkYy5sIDIKKwlkYy5sIDIKKztsYWJlbAlkYy5sCWZvdXIKK2xhYmVsOglkYy5sCWZvdXIKKzsJbW92ZS5iCWQwLGQxCisJbW92ZS5iCWQwLGQxCis7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0Yzk0MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5hc20KQEAgLTAsMCArMSw5IEBACitsb29wCW1hY3JvCWFyZzEsYXJnMixhcmczCisJZGMubAlOQVJHCisJaWZuZQlOQVJHCisJZGMubAlhcmcxCisJbG9vcAlhcmcyLGFyZzMKKwllbmRjCisJZW5kbQorCisJbG9vcAkxLDIsMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzZWJjMQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5vdXQKQEAgLTAsMCArMSwzOCBAQAorO2xvb3AJbWFjcm8JYXJnMSxhcmcyLGFyZzMKKzsJZGMubAlOQVJHCis7CWlmbmUJTkFSRworOwlkYy5sCWFyZzEKKzsJbG9vcAlhcmcyLGFyZzMKKzsJZW5kYworOwllbmRtCis7CisKKzsJbG9vcAkxLDIsMworOwlkYy5sCTMKKwlkYy5sCTMKKzsJaWZuZQkzCis7CWRjLmwJMQorCWRjLmwJMQorOwlsb29wCTIsMworOwlkYy5sCTIKKwlkYy5sCTIKKzsJaWZuZQkyCis7CWRjLmwJMgorCWRjLmwJMgorOwlsb29wCTMsCis7CWRjLmwJMQorCWRjLmwJMQorOwlpZm5lCTEKKzsJZGMubAkzCisJZGMubAkzCis7CWxvb3AJLAorOwlkYy5sCTAKKwlkYy5sCTAKKzsJaWZuZQkwCis7CWRjLmwJCis7CWxvb3AJLAorOwllbmRjCis7CWVuZGMKKzsJZW5kYworOwllbmRjCis7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2M2JiMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20KQEAgLTAsMCArMSwzIEBACisJcmVwdAkzCisJZGMubAkxCisJZW5kcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0ZWQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5vdXQKQEAgLTAsMCArMSwxNiBAQAorOwlyZXB0CTMKKzsJZGMubAkxCis7CWVuZHIKKzsJZGMubAkxCisJZGMubAkxCis7CVJFUFQJMgorOwlkYy5sCTEKKzsJRU5EUgorOwlkYy5sCTEKKwlkYy5sCTEKKzsJUkVQVAkxCis7CWRjLmwJMQorOwlFTkRSCis7CWRjLmwJMQorCWRjLmwJMQorOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4YmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuYXNtCkBAIC0wLDAgKzEsMjAgQEAKKwkKKwkuQUxURVJOQVRFCisKK2FsbG9jIAlNQUNSTyB2YWwxLHZhbDIKKwlEQgl2YWwxCisJREIgCXZhbDIKKwlFTkRNCisKKwlhbGxvYwkidGhhdCdzIiAnc2hvdyBiaXonCisJYWxsb2MJMCwxCisJYWxsb2MJMCAxCisJYWxsb2MJMAkxCisJYWxsb2MJLDEKKworCisJCisKKworCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlMzMxOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyCkBAIC0wLDAgKzEgQEAKK0VORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODBmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLm91dApAQCAtMCwwICsxLDQ5IEBACishCQorIQkuQUxURVJOQVRFCishCisKKyFhbGxvYyAJTUFDUk8gdmFsMSx2YWwyCishCURCCXZhbDEKKyEJREIgCXZhbDIKKyEJRU5ETQorIQorCishCWFsbG9jCSJ0aGF0J3MiICdzaG93IGJpeicKKyEJREIJInRoYXQncyIKKwkuYnl0ZQkxMTYsMTA0LDk3LDExNiwzOSwxMTUKKyEJREIgCSJzaG93IGJpeiIKKwkuYnl0ZQkxMTUsMTA0LDExMSwxMTksMzIsOTgsMTA1LDEyMgorIQlhbGxvYwkwLDEKKyEJREIJMAorCS5ieXRlCTAKKyEJREIgCTEKKwkuYnl0ZQkxCishCWFsbG9jCTAgMQorIQlEQgkwCisJLmJ5dGUJMAorIQlEQiAJMQorCS5ieXRlCTEKKyEJYWxsb2MJMAkxCishCURCCTAKKwkuYnl0ZQkwCishCURCIAkxCisJLmJ5dGUJMQorIQlhbGxvYwksMQorIQlEQgkKKwkuYnl0ZQkKKyEJREIgCTEKKwkuYnl0ZQkxCishCisKKyEKKworIQkKKyEKKworIQorCishCisKKyEKKworIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3MTEzNwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuYXNtCkBAIC0wLDAgKzEsMjggQEAKKworCisJLkFMVEVSTkFURQorCisJISBvaworCSEhIGFsc28gb2sKKworZm9vCU1BQ1JPCQorCSEgeW91IGNhbiBzZWUgbWUKKwkhISBidXQgbm90IG1lCisJISB5b3UgY2FuIHNlZSBtZQorCSEhIGJ1dCBub3QgbWUKKwlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCisJRU5ETQorCisJZm9vCisKKworZGVmaW5lIAlNQUNSTwl2YWwxLHZhbDIKKwlEQiAJdmFsMQkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCisJREIJdmFsMgkhISB0aGlzIG9uIHdvbid0CisJRU5ETQorCisJZGVmaW5lCTAsMQorCisKKwlFTkQKKwkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTZmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLm91dApAQCAtMCwwICsxLDUxIEBACishCisKKyEKKworIQkuQUxURVJOQVRFCishCisKKyEJISBvaworCSEgb2sKKyEJISEgYWxzbyBvaworCSEhIGFsc28gb2sKKyEKKworIWZvbwlNQUNSTwkKKyEJISB5b3UgY2FuIHNlZSBtZQorIQkhISBidXQgbm90IG1lCishCSEgeW91IGNhbiBzZWUgbWUKKyEJISEgYnV0IG5vdCBtZQorIQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCishCUVORE0KKyEKKworIQlmb28KKyEJISB5b3UgY2FuIHNlZSBtZQorCSEgeW91IGNhbiBzZWUgbWUKKyEJCishCSEgeW91IGNhbiBzZWUgbWUKKwkhIHlvdSBjYW4gc2VlIG1lCishCQorIQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCisJYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgorIQorCishCisKKyFkZWZpbmUgCU1BQ1JPCXZhbDEsdmFsMgorIQlEQiAJdmFsMQkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCishCURCCXZhbDIJISEgdGhpcyBvbiB3b24ndAorIQlFTkRNCishCisKKyEJZGVmaW5lCTAsMQorIQlEQiAJMAkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCisJLmJ5dGUJMCEgdGhpcyBjb21tZW50IHdpbGwgc2hvdyB1cCAKKyEJREIJMQkKKwkuYnl0ZQkxCishCisKKyEKKworIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzMWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuYXNtCkBAIC0wLDAgKzEsMzAgQEAKKwkuQUxURVJOQVRFCisKK2ZvbwlNQUNSTwlzdHJpbmcKKwlMT0NBTAlsYWIxLCBsYWIyCitsYWIxOglEQVRBLkwJbGFiMgorbGFiMjoJU0RBVEEJc3RyaW5nCisJRU5ETQorCisJZm9vCSJBbiBleGFtcGxlIgorCWZvbwkidXNpbmcgTE9DQUwiCisKKyEgdGVzdCBvZiBMT0NBTCBkaXJlY3RpdmUKKworY2hrX2VycglNQUNSTwlsaW1pdAorCUxPQ0FMCQlza2lwICEhIGZyb2IKKwlMT0NBTAkJemFwLGRvZyxiYXJmCitiYXJmOgljbXAJCWF4LGxpbWl0CSEhIGNoZWNrIHZhbHVlIGFnYWluc3QKKwkJCQkJISEgbGltaXQKKwlqbGUJCXNraXAJCSEhIHNraXAgY2FsbCBpZiBPSworc2tpcDoJY2FsbAkgCWVycm9yCisJZm9vCQlkb2cKKwl6YXAJCWRvZwkKKwlub3AKKwlFTkRNCisKKwljaGtfZXJyIDUKKwljaGtfZXJyIDEwCisKKworCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2MTk0YwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMub3V0CkBAIC0wLDAgKzEsODYgQEAKKyEJLkFMVEVSTkFURQorIQorCishZm9vCU1BQ1JPCXN0cmluZworIQlMT0NBTAlsYWIxLCBsYWIyCishbGFiMToJREFUQS5MCWxhYjIKKyFsYWIyOglTREFUQQlzdHJpbmcKKyEJRU5ETQorIQorCishCWZvbwkiQW4gZXhhbXBsZSIKKyEJCishTEwwMDAxOglEQVRBLkwJTEwwMDAyCitMTDAwMDE6CS5sb25nCUxMMDAwMgorIUxMMDAwMjoJU0RBVEEJIkFuIGV4YW1wbGUiCitMTDAwMDI6CS5ieXRlCTY1LDExMCwzMiwxMDEsMTIwLDk3LDEwOSwxMTIsMTA4LDEwMQorIQlmb28JInVzaW5nIExPQ0FMIgorIQkKKyFMTDAwMDM6CURBVEEuTAlMTDAwMDQKK0xMMDAwMzoJLmxvbmcJTEwwMDA0CishTEwwMDA0OglTREFUQQkidXNpbmcgTE9DQUwiCitMTDAwMDQ6CS5ieXRlCTExNywxMTUsMTA1LDExMCwxMDMsMzIsNzYsNzksNjcsNjUsNzYKKyEKKworISEgdGVzdCBvZiBMT0NBTCBkaXJlY3RpdmUKKwkhIHRlc3Qgb2YgTE9DQUwgZGlyZWN0aXZlCishCisKKyFjaGtfZXJyCU1BQ1JPCWxpbWl0CishCUxPQ0FMCQlza2lwICEhIGZyb2IKKyEJTE9DQUwJCXphcCxkb2csYmFyZgorIWJhcmY6CWNtcAkJYXgsbGltaXQJISEgY2hlY2sgdmFsdWUgYWdhaW5zdAorIQkJCQkJISEgbGltaXQKKyEJamxlCQlza2lwCQkhISBza2lwIGNhbGwgaWYgT0sKKyFza2lwOgljYWxsCSAJZXJyb3IKKyEJZm9vCQlkb2cKKyEJemFwCQlkb2cJCishCW5vcAorIQlFTkRNCishCisKKyEJY2hrX2VyciA1CishCQorIQkKKyFMTDAwMDg6CWNtcAkJYXgsNQkKK0xMMDAwODoJY21wCQlheCw1CQorIQkJCQkJCishCWpsZQkJTEwwMDA1CQkKKwlqbGUJCUxMMDAwNQkJCishTEwwMDA1OgljYWxsCSAJZXJyb3IKK0xMMDAwNToJY2FsbAkgCWVycm9yCishCWZvbwkJTEwwMDA3CishCQorIUxMMDAwOToJREFUQS5MCUxMMDAwYQorTEwwMDA5OgkubG9uZwlMTDAwMGEKKyFMTDAwMGE6CVNEQVRBCUxMMDAwNworTEwwMDBhOgkuYnl0ZQk3Niw3Niw0OCw0OCw0OCw1NQorIQlMTDAwMDYJCUxMMDAwNwkKKwlMTDAwMDYJCUxMMDAwNwkKKyEJbm9wCisJbm9wCishCWNoa19lcnIgMTAKKyEJCishCQorIUxMMDAwZToJY21wCQlheCwxMAkKK0xMMDAwZToJY21wCQlheCwxMAkKKyEJCQkJCQorIQlqbGUJCUxMMDAwYgkJCisJamxlCQlMTDAwMGIJCQorIUxMMDAwYjoJY2FsbAkgCWVycm9yCitMTDAwMGI6CWNhbGwJIAllcnJvcgorIQlmb28JCUxMMDAwZAorIQkKKyFMTDAwMGY6CURBVEEuTAlMTDAwMTAKK0xMMDAwZjoJLmxvbmcJTEwwMDEwCishTEwwMDEwOglTREFUQQlMTDAwMGQKK0xMMDAxMDoJLmJ5dGUJNzYsNzYsNDgsNDgsNDgsMTAwCishCUxMMDAwYwkJTEwwMDBkCQorCUxMMDAwYwkJTEwwMDBkCQorIQlub3AKKwlub3AKKyEKKworIQorCishCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWRkM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5hc20KQEAgLTAsMCArMSwxMCBAQAorCS5BTFRFUk5BVEUKKyEgdGVzdCBvZiBtYWNybyBzdWJzdGl0dXRpb24gYXJvdW5kICZzCisKKworZm9vCU1BQ1JPCWEsYgorCXgmYSZiCisJRU5ETQorCisJZm9vIDMgMiAKKwlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDEzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0Lm91dApAQCAtMCwwICsxLDE2IEBACishCS5BTFRFUk5BVEUKKyEhIHRlc3Qgb2YgbWFjcm8gc3Vic3RpdHV0aW9uIGFyb3VuZCAmcworCSEgdGVzdCBvZiBtYWNybyBzdWJzdGl0dXRpb24gYXJvdW5kICZzCishCisKKyEKKworIWZvbwlNQUNSTwlhLGIKKyEJeCZhJmIKKyEJRU5ETQorIQorCishCWZvbyAzIDIgCishCXgzMgorCXgzMgorIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiOTk5YgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuYXNtCkBAIC0wLDAgKzEsMTUgQEAKKyEgdGVzdCBvZiBsaXRlcmFsIHRleHQgb3BlcmF0b3IKKwkuQUxURVJOQVRFCitmb29wCU1BQ1JPCXN0cjEsc3RyMgorCVNEQVRBCSJzdHIxIgorCVNEQVRBCXN0cjIKKwlFTkRNCisKKworCQorCWZvb3AJdGhpczwgaXMgYSA8c3RyaW5nPiB3aXRoIGFuZ2xlIGJyYWNrZXRzPgorCWZvb3AgCXRoaXM8IGlzIGEgc3RyaW5nIHdpdGggc3BhY2VzPgorCWZvb3AJdGhpcyA8IGlzIGEgc3RyaW5nIHdpdGggYSAhPj4KKworCisJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVycgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE0ODhiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5vdXQKQEAgLTAsMCArMSwzMiBAQAorISEgdGVzdCBvZiBsaXRlcmFsIHRleHQgb3BlcmF0b3IKKwkhIHRlc3Qgb2YgbGl0ZXJhbCB0ZXh0IG9wZXJhdG9yCishCS5BTFRFUk5BVEUKKyFmb29wCU1BQ1JPCXN0cjEsc3RyMgorIQlTREFUQQkic3RyMSIKKyEJU0RBVEEJc3RyMgorIQlFTkRNCishCisKKyEKKworIQkKKyEJZm9vcAl0aGlzPCBpcyBhIDxzdHJpbmc+IHdpdGggYW5nbGUgYnJhY2tldHM+CishCVNEQVRBCSJ0aGlzIgorCS5ieXRlCTExNiwxMDQsMTA1LDExNQorIQlTREFUQQkiIGlzIGEgPHN0cmluZz4gd2l0aCBhbmdsZSBicmFja2V0cyIKKwkuYnl0ZQkzMiwxMDUsMTE1LDMyLDk3LDMyLDYwLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDYyLDMyLDExOSwxMDUsMTE2LDEwNCwzMiw5NywxMTAsMTAzLDEwOCwxMDEsMzIsOTgsMTE0LDk3LDk5LDEwNywxMDEsMTE2LDExNQorIQlmb29wIAl0aGlzPCBpcyBhIHN0cmluZyB3aXRoIHNwYWNlcz4KKyEJU0RBVEEJInRoaXMiCisJLmJ5dGUJMTE2LDEwNCwxMDUsMTE1CishCVNEQVRBCSIgaXMgYSBzdHJpbmcgd2l0aCBzcGFjZXMiCisJLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE1LDExMiw5Nyw5OSwxMDEsMTE1CishCWZvb3AJdGhpcyA8IGlzIGEgc3RyaW5nIHdpdGggYSAhPj4KKyEJU0RBVEEJInRoaXMiCisJLmJ5dGUJMTE2LDEwNCwxMDUsMTE1CishCVNEQVRBCSIgaXMgYSBzdHJpbmcgd2l0aCBhID4iCisJLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsNjIKKyEKKworIQorCishCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjJkNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5hc20KQEAgLTAsMCArMSwyMSBAQAorCS5BTFRFUk5BVEUKKyEgdGVzdCBvZiBleHByZXNzaW9uIG9wZXJhdG9yCitkZWZpbmUgCU1BQ1JPIAl2YWwsIHN0cmluZworCVNEQVRBIAl2YWwKKwlTREFUQQlzdHJpbmcKKwlFTkRNCisJZGVmaW5lICIxIiwiOTklb2YxMDAiCSEgbm90aWNlICUgd2l0aGluIHN0cmluZworCWRlZmluZSAJJTEgKyAyLCAiPTMiCisKKworCWRlZmluZSAJJSAxICsgMiAlMys0CisKKwlkZWZpbmUJJTMqNC0yICA8PTEwPgorCisJZGVmaW5lCSUzKjQtMiAgNQorCisJZGVmaW5lCSUxICsgMiw8aXMgZXF1YWwgdG8gJTEgKyAyLCByaWdodD8+CisKKwkhIGhhcyBubyBlZmZlY3QKKworCWVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkMTZjZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYub3V0CkBAIC0wLDAgKzEsNTQgQEAKKyEJLkFMVEVSTkFURQorISEgdGVzdCBvZiBleHByZXNzaW9uIG9wZXJhdG9yCisJISB0ZXN0IG9mIGV4cHJlc3Npb24gb3BlcmF0b3IKKyFkZWZpbmUgCU1BQ1JPIAl2YWwsIHN0cmluZworIQlTREFUQSAJdmFsCishCVNEQVRBCXN0cmluZworIQlFTkRNCishCWRlZmluZSAiMSIsIjk5JW9mMTAwIgkhIG5vdGljZSAlIHdpdGhpbiBzdHJpbmcKKyEJU0RBVEEgCSIxIgorCS5ieXRlCTQ5CishCVNEQVRBCSI5OSVvZjEwMCIKKwkuYnl0ZQk1Nyw1NywzNywxMTEsMTAyLDQ5LDQ4LDQ4CishCWRlZmluZSAJJTEgKyAyLCAiPTMiCishCVNEQVRBIAkzCisJLmJ5dGUJNTEKKyEJU0RBVEEJIj0zIgorCS5ieXRlCTYxLDUxCishCisKKyEKKworIQlkZWZpbmUgCSUgMSArIDIgJTMrNAorIQlTREFUQSAJMworCS5ieXRlCTUxCishCVNEQVRBCTcKKwkuYnl0ZQk1NQorIQorCishCWRlZmluZQklMyo0LTIgIDw9MTA+CishCVNEQVRBIAkxMAorCS5ieXRlCTQ5LDQ4CishCVNEQVRBCSI9MTAiCisJLmJ5dGUJNjEsNDksNDgKKyEKKworIQlkZWZpbmUJJTMqNC0yICA1CishCVNEQVRBIAkxMAorCS5ieXRlCTQ5LDQ4CishCVNEQVRBCTUKKwkuYnl0ZQk1MworIQorCishCWRlZmluZQklMSArIDIsPGlzIGVxdWFsIHRvICUxICsgMiwgcmlnaHQ/PgorIQlTREFUQSAJMworCS5ieXRlCTUxCishCVNEQVRBCSJpcyBlcXVhbCB0byAlMSArIDIsIHJpZ2h0PyIKKwkuYnl0ZQkxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDk3LDEwOCwzMiwxMTYsMTExLDMyLDM3LDQ5LDMyLDQzLDMyLDUwLDQ0LDMyLDExNCwxMDUsMTAzLDEwNCwxMTYsNjMKKyEKKworIQkhIGhhcyBubyBlZmZlY3QKKwkhIGhhcyBubyBlZmZlY3QKKyEKKworIQllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhNDBhZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuYXNtCkBAIC0wLDAgKzEsMTIgQEAKKwkuQUxURVJOQVRFCishIHRlc3Qgb2Ygc3RyaW5nIG9wZXJhdG9ycworZGVmaW5lCU1BQ1JPCXN0cjEsc3RyMgorCVNEQVRBCXN0cjEKKwlTREFUQQkic3RyMiIKK0VORE0KKwlkZWZpbmUJb25lIiB3YXkgdG8gZ2V0ICJzcGFjZXMsMAorCWRlZmluZQkibG90J3MhIG9mIDxzcGVjaWFsPixjaGFycyUiLCAwCisKKworCisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlMzMxOAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyCkBAIC0wLDAgKzEgQEAKK0VORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTliMzQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3Lm91dApAQCAtMCwwICsxLDI2IEBACishCS5BTFRFUk5BVEUKKyEhIHRlc3Qgb2Ygc3RyaW5nIG9wZXJhdG9ycworCSEgdGVzdCBvZiBzdHJpbmcgb3BlcmF0b3JzCishZGVmaW5lCU1BQ1JPCXN0cjEsc3RyMgorIQlTREFUQQlzdHIxCishCVNEQVRBCSJzdHIyIgorIUVORE0KKyEJZGVmaW5lCW9uZSIgd2F5IHRvIGdldCAic3BhY2VzLDAKKyEJU0RBVEEJb25lIiB3YXkgdG8gZ2V0ICJzcGFjZXMKKwkuYnl0ZQkxMTEsMTEwLDEwMSwzNCwzMiwxMTksOTcsMTIxLDMyLDExNiwxMTEsMzIsMTAzLDEwMSwxMTYsMzIsMzQsMTE1LDExMiw5Nyw5OSwxMDEsMTE1CishCVNEQVRBCSIwIgorCS5ieXRlCTQ4CishCWRlZmluZQkibG90J3MhIG9mIDxzcGVjaWFsPixjaGFycyUiLCAwCishCVNEQVRBCSJsb3QncyBvZiA8c3BlY2lhbD4sY2hhcnMlIgorCS5ieXRlCTEwOCwxMTEsMTE2LDM5LDExNSwzMiwxMTEsMTAyLDMyLDYwLDExNSwxMTIsMTAxLDk5LDEwNSw5NywxMDgsNjIsNDQsOTksMTA0LDk3LDExNCwxMTUsMzcKKyEJU0RBVEEJIjAiCisJLmJ5dGUJNDgKKyEKKworIQorCishCisKKyEKKworIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YjE3MgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguYXNtCkBAIC0wLDAgKzEsMTggQEAKKworCS5BTFRFUk5BVEUKKwlTREFUQQklMSsyKzMgCisJU0RBVEEJIjUiCisKKworCisJTUFDUk8JZm9vCisJU0RBVEEJIkhJIgkhISB0aGlzIHdpbGwgZ28KKwlTREFUQQkiVEhFUkUJISB0aGlzIHdpbGwgc3RheQorCUVORE0KKworCWZvbworCisKKwlTREFUQQk8ITx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlIT4hIT4KKwlTREFUQQkiPHRoaXMgaXMgPGEgd2Fja3k+IGV4YW1wbGU+ISIKKwlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDgub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTA0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4Lm91dApAQCAtMCwwICsxLDMzIEBACishCisKKyEJLkFMVEVSTkFURQorIQlTREFUQQklMSsyKzMgCisJLmJ5dGUJMzcsNDksNDMsNTAsNDMsNTEsMzIKKyEJU0RBVEEJIjUiCisJLmJ5dGUJNTMKKyEKKworIQorCishCisKKyEJTUFDUk8JZm9vCishCVNEQVRBCSJISSIJISEgdGhpcyB3aWxsIGdvCishCVNEQVRBCSJUSEVSRQkhIHRoaXMgd2lsbCBzdGF5CishCUVORE0KKyEKKworIQlmb28KKyEJU0RBVEEJIkhJIgkKKwkuYnl0ZQk3Miw3MworIQlTREFUQQkiVEhFUkUJISB0aGlzIHdpbGwgc3RheQorCS5ieXRlCTg0LDcyLDY5LDgyLDY5LDksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExOSwxMDUsMTA4LDEwOCwzMiwxMTUsMTE2LDk3LDEyMQorIQorCishCisKKyEJU0RBVEEJPCE8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZSE+ISE+CisJLmJ5dGUJNjAsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsNjAsOTcsMzIsMTE5LDk3LDk5LDEwNywxMjEsNjIsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEsNjIsMzMKKyEJU0RBVEEJIjx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlPiEiCisJLmJ5dGUJNjAsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsNjAsOTcsMzIsMTE5LDk3LDk5LDEwNywxMjEsNjIsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEsNjIsMzQKKyEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2NhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmFzbQpAQCAtMCwwICsxLDMgQEAKKworICAgICAuc2RhdGEgInYxLjAwMDAiCisgICAgIC5lbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGYxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLm91dApAQCAtMCwwICsxLDUgQEAKKyEKKworISAgICAgLnNkYXRhICJ2MS4wMDAwIgorCS5ieXRlCTExOCw0OSw0Niw0OCw0OCw0OCw0OAorISAgICAgLmVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQ2M2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5hc20KQEAgLTAsMCArMSw5IEBACisKKworZm9vCS5SRUcJKHIxKQorCWFkZAlmb28sZm9vCisKK2JhcgkucmVnCShyMikKKwlhZGQJYmFyLGZvbworCisJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyNjhhMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcub3V0CkBAIC0wLDAgKzEsMTUgQEAKKyEKKworIQorCishZm9vCS5SRUcJKHIxKQorIQlhZGQJZm9vLGZvbworCWFkZAlyMSxyMQorIQorCishYmFyCS5yZWcJKHIyKQorIQlhZGQJYmFyLGZvbworCWFkZAlyMixyMQorIQorCishCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3YWM0NwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuYXNtCkBAIC0wLDAgKzEsMTMgQEAKKwkuQVJFUEVBVAk1CisJRklWRQorCS5BUkVQRUFUCTIKKwlUV08KKwkuQUVORFIKKwkuQVJFUEVBVAkzCisJVEhSRUUKKwkuQVJFUEVBVAkyCisJVFdPCQorCS5BRU5EUgorCS5BRU5EUgorCS5BRU5EUgorCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGQwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLm91dApAQCAtMCwwICsxLDM5MSBAQAorIQkuQVJFUEVBVAk1CishCUZJVkUKKyEJLkFSRVBFQVQJMgorIQlUV08KKyEJLkFFTkRSCishCS5BUkVQRUFUCTMKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJLkFFTkRSCishCUZJVkUKKwlGSVZFCishCS5BUkVQRUFUCTIKKyEJVFdPCishCS5BRU5EUgorIQlUV08KKwlUV08KKyEJLkFSRVBFQVQJMQorIQlUV08KKyEJLkFFTkRSCishCVRXTworCVRXTworIQkuQVJFUEVBVAkzCishCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJLkFFTkRSCishCVRIUkVFCisJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkxCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTIKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEhSRUUKKwlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTEKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCS5BRU5EUgorIQlUSFJFRQorCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAk0CishCUZJVkUKKyEJLkFSRVBFQVQJMgorIQlUV08KKyEJLkFFTkRSCishCS5BUkVQRUFUCTMKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJLkFFTkRSCishCUZJVkUKKwlGSVZFCishCS5BUkVQRUFUCTIKKyEJVFdPCishCS5BRU5EUgorIQlUV08KKwlUV08KKyEJLkFSRVBFQVQJMQorIQlUV08KKyEJLkFFTkRSCishCVRXTworCVRXTworIQkuQVJFUEVBVAkzCishCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJLkFFTkRSCishCVRIUkVFCisJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkxCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTIKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEhSRUUKKwlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTEKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCS5BRU5EUgorIQlUSFJFRQorCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkzCishCUZJVkUKKyEJLkFSRVBFQVQJMgorIQlUV08KKyEJLkFFTkRSCishCS5BUkVQRUFUCTMKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJLkFFTkRSCishCUZJVkUKKwlGSVZFCishCS5BUkVQRUFUCTIKKyEJVFdPCishCS5BRU5EUgorIQlUV08KKwlUV08KKyEJLkFSRVBFQVQJMQorIQlUV08KKyEJLkFFTkRSCishCVRXTworCVRXTworIQkuQVJFUEVBVAkzCishCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJLkFFTkRSCishCVRIUkVFCisJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkxCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTIKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEhSRUUKKwlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTEKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCS5BRU5EUgorIQlUSFJFRQorCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkyCishCUZJVkUKKyEJLkFSRVBFQVQJMgorIQlUV08KKyEJLkFFTkRSCishCS5BUkVQRUFUCTMKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJLkFFTkRSCishCUZJVkUKKwlGSVZFCishCS5BUkVQRUFUCTIKKyEJVFdPCishCS5BRU5EUgorIQlUV08KKwlUV08KKyEJLkFSRVBFQVQJMQorIQlUV08KKyEJLkFFTkRSCishCVRXTworCVRXTworIQkuQVJFUEVBVAkzCishCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJLkFFTkRSCishCVRIUkVFCisJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkxCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTIKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEhSRUUKKwlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTEKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCS5BRU5EUgorIQlUSFJFRQorCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkxCishCUZJVkUKKyEJLkFSRVBFQVQJMgorIQlUV08KKyEJLkFFTkRSCishCS5BUkVQRUFUCTMKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJLkFFTkRSCishCUZJVkUKKwlGSVZFCishCS5BUkVQRUFUCTIKKyEJVFdPCishCS5BRU5EUgorIQlUV08KKwlUV08KKyEJLkFSRVBFQVQJMQorIQlUV08KKyEJLkFFTkRSCishCVRXTworCVRXTworIQkuQVJFUEVBVAkzCishCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJLkFFTkRSCishCVRIUkVFCisJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuQVJFUEVBVAkxCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTIKKyEJVEhSRUUKKyEJLkFSRVBFQVQJMgorIQlUV08JCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEhSRUUKKwlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCVRXTwkKKwlUV08JCishCS5BUkVQRUFUCTEKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUSFJFRQorIQkuQVJFUEVBVAkyCishCVRXTwkKKyEJLkFFTkRSCishCS5BRU5EUgorIQlUSFJFRQorCVRIUkVFCishCS5BUkVQRUFUCTIKKyEJVFdPCQorIQkuQUVORFIKKyEJVFdPCQorCVRXTwkKKyEJLkFSRVBFQVQJMQorIQlUV08JCishCS5BRU5EUgorIQlUV08JCisJVFdPCQorIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhODVkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmFzbQpAQCAtMCwwICsxLDE0IEBACisKKwkuQVJFUEVBVAkxMAorCVRFTgorCS5BUkVQRUFUCTIJCisJVFdFTlRZCisJLkFFTkRSCisJLkFFTkRSCisKKwkuQVJFUEVBVAkzCisJUk9UQ0wJUjIKKwlESVYxCVIwLFIxCisJLkFFTkRSCisKKwkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVycgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVkOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5vdXQKQEAgLTAsMCArMSwyMTEgQEAKKyEKKworIQkuQVJFUEVBVAkxMAorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJOQorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJOAorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJNworIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJNgorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJNQorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJNAorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJMworIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJMgorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEJLkFSRVBFQVQJMQorIQlURU4KKyEJLkFSRVBFQVQJMgkKKyEJVFdFTlRZCishCS5BRU5EUgorIQkuQUVORFIKKyEJVEVOCisJVEVOCishCS5BUkVQRUFUCTIJCishCVRXRU5UWQorIQkuQUVORFIKKyEJVFdFTlRZCisJVFdFTlRZCishCS5BUkVQRUFUCTEKKyEJVFdFTlRZCishCS5BRU5EUgorIQlUV0VOVFkKKwlUV0VOVFkKKyEKKworIQkuQVJFUEVBVAkzCishCVJPVENMCVIyCishCURJVjEJUjAsUjEKKyEJLkFFTkRSCishCVJPVENMCVIyCisJUk9UQ0wJUjIKKyEJRElWMQlSMCxSMQorCURJVjEJUjAsUjEKKyEJLkFSRVBFQVQJMgorIQlST1RDTAlSMgorIQlESVYxCVIwLFIxCishCS5BRU5EUgorIQlST1RDTAlSMgorCVJPVENMCVIyCishCURJVjEJUjAsUjEKKwlESVYxCVIwLFIxCishCS5BUkVQRUFUCTEKKyEJUk9UQ0wJUjIKKyEJRElWMQlSMCxSMQorIQkuQUVORFIKKyEJUk9UQ0wJUjIKKwlST1RDTAlSMgorIQlESVYxCVIwLFIxCisJRElWMQlSMCxSMQorIQorCishCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4ODJiMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuYXNtCkBAIC0wLDAgKzEsMiBAQAorCisJLlJFUEVBVAkxMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWUzMzE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIKQEAgLTAsMCArMSBAQAorRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5ZjhjNgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIub3V0CkBAIC0wLDAgKzEsNSBAQAorIQorCishCS5SRVBFQVQJMTAKKwkuUkVQRUFUCTEwCishClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTg3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5hc20KQEAgLTAsMCArMSwzIEBACisKKwkuQVJFUEVBVAkxMAorCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY1NDViCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuZXJyCkBAIC0wLDAgKzEgQEAKK0VuZCBvZiBmaWxlIHdoaWxzdCBpbnNpZGUgQVJFUEVBVCwgc3RhcnRlZCBvbiBsaW5lIDMuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4Mjg4MAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLm91dApAQCAtMCwwICsxLDUgQEAKKyEKKworIQkuQVJFUEVBVAkxMAorIQkuRU5ECishClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMDZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5hc20KQEAgLTAsMCArMSw2IEBACisKKwkuQVJFUEVBVAk1CisJLkFFTkRSCQkKKwkuQUVORFIKKwkuRU5ECisKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDBjY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuZXJyCkBAIC0wLDAgKzEgQEAKK3JlcGVycjIuYXNtOjQgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3YTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLm91dApAQCAtMCwwICsxLDE0IEBACishCisKKyEJLkFSRVBFQVQJNQorIQkuQUVORFIJCQorIQkuQVJFUEVBVAk0CishCS5BRU5EUgorIQkuQVJFUEVBVAkzCishCS5BRU5EUgorIQkuQVJFUEVBVAkyCishCS5BRU5EUgorIQkuQVJFUEVBVAkxCishCS5BRU5EUgorIQkuQUVORFIKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGJjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5hc20KQEAgLTAsMCArMSwyMSBAQAorCS5BUkVQRUFUCTQKKwkuQVJFUEVBVAk0CisJLkFSRVBFQVQJNAorCS5BUkVQRUFUCTQKKwlzdHVmZgorCS5BRU5EUgkJCisJd2hpY2gKKwkuQUVORFIJCisJd2lsbAorCS5BRU5EUgkKKwlnZXQKKwkuQUVORFIJCisJcmVwZXRhZWQKKwkuQUVORFIJCisKKwkuQUVORFIJCisJLkFFTkRSCQorCS5BRU5EUgkKKwkuQUVORFIJCisJLkFFTkRSCQorCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUwZGNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuZXJyCkBAIC0wLDAgKzEsNiBAQAorcmVwZXJyMy5hc206MTQgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCityZXBlcnIzLmFzbToxNiBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KK3JlcGVycjMuYXNtOjE3IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgorcmVwZXJyMy5hc206MTggQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCityZXBlcnIzLmFzbToxOSBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KK3JlcGVycjMuYXNtOjIwIEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzUxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5vdXQKQEAgLTAsMCArMSwyMDM1IEBACishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgkKKyEJZ2V0CishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJd2lsbAorCXdpbGwKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkzCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQl3aWxsCisJd2lsbAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCXdpbGwKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCXdpbGwKKwl3aWxsCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJd2lsbAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJd2lsbAorCXdpbGwKKyEJZ2V0CisJZ2V0CishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgkKKyEJZ2V0CishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCXdpbGwKKyEJLkFFTkRSCQorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkzCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQl3aWxsCisJd2lsbAorIQkuQVJFUEVBVAkzCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCXdpbGwKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCXdpbGwKKwl3aWxsCishCS5BUkVQRUFUCTIKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJd2lsbAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJd2lsbAorCXdpbGwKKyEJLkFSRVBFQVQJMQorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkzCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQl3aWxsCisJd2lsbAorIQlnZXQKKwlnZXQKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCXdpbGwKKyEJLkFFTkRSCQorIQlnZXQKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJd2lsbAorIQkuQUVORFIJCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCXdpbGwKKwl3aWxsCishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJd2lsbAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJd2lsbAorCXdpbGwKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkzCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQl3aWxsCisJd2lsbAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCXdpbGwKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCXdpbGwKKwl3aWxsCishCWdldAorCWdldAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJd2lsbAorIQkuQUVORFIJCishCWdldAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJd2lsbAorCXdpbGwKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQl3aWxsCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkzCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMQorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQl3aWxsCisJd2lsbAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCXdpbGwKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIJCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTMKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkxCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCXdpbGwKKwl3aWxsCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJd2lsbAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgkKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJLkFSRVBFQVQJMworIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXdoaWNoCishCS5BRU5EUgorIQkuQVJFUEVBVAk0CishCXN0dWZmCishCS5BRU5EUgkJCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMworIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkyCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTEKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJd2hpY2gKKwl3aGljaAorIQkuQVJFUEVBVAkyCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJd2hpY2gKKyEJLkFFTkRSCishCS5BUkVQRUFUCTQKKyEJc3R1ZmYKKyEJLkFFTkRSCQkKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkzCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTIKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMQorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQl3aGljaAorCXdoaWNoCishCS5BUkVQRUFUCTEKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQl3aGljaAorIQkuQUVORFIKKyEJLkFSRVBFQVQJNAorIQlzdHVmZgorIQkuQUVORFIJCQorIQlzdHVmZgorCXN0dWZmCishCS5BUkVQRUFUCTMKKyEJc3R1ZmYKKyEJLkFFTkRSCishCXN0dWZmCisJc3R1ZmYKKyEJLkFSRVBFQVQJMgorIQlzdHVmZgorIQkuQUVORFIKKyEJc3R1ZmYKKwlzdHVmZgorIQkuQVJFUEVBVAkxCishCXN0dWZmCishCS5BRU5EUgorIQlzdHVmZgorCXN0dWZmCishCXdoaWNoCisJd2hpY2gKKyEJd2lsbAorCXdpbGwKKyEJZ2V0CisJZ2V0CishCXJlcGV0YWVkCisJcmVwZXRhZWQKKyEJLkFFTkRSCQorIQorCishCS5BRU5EUgkKKyEJLkFFTkRSCQorIQkuQUVORFIJCishCS5BRU5EUgkKKyEJLkFFTkRSCQorIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmJkMjNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmFzbQpAQCAtMCwwICsxLDI0IEBACisKKworCS5TREFUQQkiSEkiLCJTVEVWRSIKKwkuU0RBVEEJIkhJIiAsICJTVEVWRSIgLCA8NzI+LDw3Mz4sPDgzPjw2OT48ODY+PDY5PgorCisJLlNEQVRBCSJIIiJJIiAsICJTVEVWRSIgLCA8NzI+LDw3Mz4sPDgzPjw2OT48ODY+PDY5PgorCisKKworCS5TREFUQQkiU0hPVUxEIE5PVCBGQUlMIiAiSEVSRSIgCisJLlNEQVRBCSJTSE9VTEQgRkFJTCIgIGZvbyAiSEVSRSIgCisKKwkuU0RBVEFCCTgsIkJPSU5LIgorCisJOyBleGFtcGxlcyBmcm9tIGJvb2sKKworCS5TREFUQUIJMiwiQUFBQUEiCisJLlNEQVRBQgkyLCIiIkJCQiIiIgorCS5TREFUQUIJMiwiQUFCQiI8SCcwNz4KKworCithMToJLlNEQVRBWgkiSEkiCithMjoJLlNEQVRBQyAiSEkiCithMzoJLlNEQVRBCSJISSIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDRjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyCkBAIC0wLDAgKzEsMyBAQAorc2RhdGEuYXNtOjE5IENoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uCitzZGF0YS5hc206MTkgTWlzc2luZyA+IGZvciBjaGFyYWN0ZXIgY29kZS4KK0VORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg5ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLm91dApAQCAtMCwwICsxLDU5IEBACishCisKKyEKKworIQkuU0RBVEEJIkhJIiwiU1RFVkUiCisJLmJ5dGUJNzIsNzMsODMsODQsNjksODYsNjkKKyEJLlNEQVRBCSJISSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KKwkuYnl0ZQk3Miw3Myw4Myw4NCw2OSw4Niw2OSw3Miw3Myw4Myw2OSw4Niw2OQorIQorCishCS5TREFUQQkiSCIiSSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KKwkuYnl0ZQk3MiwzNCw3Myw4Myw4NCw2OSw4Niw2OSw3Miw3Myw4Myw2OSw4Niw2OQorIQorCishCisKKyEKKworIQkuU0RBVEEJIlNIT1VMRCBOT1QgRkFJTCIgIkhFUkUiIAorCS5ieXRlCTgzLDcyLDc5LDg1LDc2LDY4LDMyLDc4LDc5LDg0LDMyLDcwLDY1LDczLDc2LDcyLDY5LDgyLDY5CishCS5TREFUQQkiU0hPVUxEIEZBSUwiICBmb28gIkhFUkUiIAorCS5ieXRlCTgzLDcyLDc5LDg1LDc2LDY4LDMyLDcwLDY1LDczLDc2LDEwMiwxMTEsMTExLDMyLDM0LDcyLDY5LDgyLDY5LDM0LDMyCishCisKKyEJLlNEQVRBQgk4LCJCT0lOSyIKKwkuYnl0ZQk2Niw3OSw3Myw3OCw3NQorCS5ieXRlCTY2LDc5LDczLDc4LDc1CisJLmJ5dGUJNjYsNzksNzMsNzgsNzUKKwkuYnl0ZQk2Niw3OSw3Myw3OCw3NQorCS5ieXRlCTY2LDc5LDczLDc4LDc1CisJLmJ5dGUJNjYsNzksNzMsNzgsNzUKKwkuYnl0ZQk2Niw3OSw3Myw3OCw3NQorCS5ieXRlCTY2LDc5LDczLDc4LDc1CishCisKKyEJOyBleGFtcGxlcyBmcm9tIGJvb2sKKwk7IGV4YW1wbGVzIGZyb20gYm9vaworIQorCishCS5TREFUQUIJMiwiQUFBQUEiCisJLmJ5dGUJNjUsNjUsNjUsNjUsNjUKKwkuYnl0ZQk2NSw2NSw2NSw2NSw2NQorIQkuU0RBVEFCCTIsIiIiQkJCIiIiCisJLmJ5dGUJMzQsNjYsNjYsNjYsMzQKKwkuYnl0ZQkzNCw2Niw2Niw2NiwzNAorIQkuU0RBVEFCCTIsIkFBQkIiPEgnMDc+CisJLmJ5dGUJNjUsNjUsNjYsNjYsMAorCS5ieXRlCTY1LDY1LDY2LDY2LDAKKyEKKworIQorCishYTE6CS5TREFUQVoJIkhJIgorYTE6CS5ieXRlCTcyLDczLDAKKyFhMjoJLlNEQVRBQyAiSEkiCithMjoJLmJ5dGUJMiw3Miw3MworIWEzOgkuU0RBVEEJIkhJIgorYTM6CS5ieXRlCTcyLDczCishClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5OTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5hc20KQEAgLTAsMCArMSwyNiBAQAorCisJLk1BQ1JPCVJFU0VSVkVfU1RSIFAxPTAgUDIKKwkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsXFAxLFxQMikKKwkuRU5ETQorCisJUkVTRVJWRV9TVFIJMiwyCisJUkVTRVJWRV9TVFIJLDMKKworCisJLk1BQ1JPIEZJTkRfU1RSIFAxCisJLkRBVEEuVwkuSU5TVFIoIkFCQ0RFRkciLCJcUDEiLCAwKQorCS5FTkRNCisKKwlGSU5EX1NUUglDREUKKwlGSU5EX1NUUglICisKKwkuTUFDUk8JUkVTRVJWRV9MRU5HVEggUDEKKwkuQUxJR04JNAorCS5TUkVTCS5MRU4oIlxQMSIpCisJLkVORE0KKworCVJFU0VSVkVfTEVOR1RICUFCQ0RFRgorCVJFU0VSVkVfTEVOR1RICUFCQworCisJLkVORAorCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVycgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmNjk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5vdXQKQEAgLTAsMCArMSw0OSBAQAorIQorCishCS5NQUNSTwlSRVNFUlZFX1NUUiBQMT0wIFAyCishCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIixcUDEsXFAyKQorIQkuRU5ETQorIQorCishCVJFU0VSVkVfU1RSCTIsMgorIQkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsMiwyKQorCS5ieXRlCTY3LDY4CishCVJFU0VSVkVfU1RSCSwzCishCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIiwwLDMpCisJLmJ5dGUJNjUsNjYsNjcKKyEKKworIQorCishCS5NQUNSTyBGSU5EX1NUUiBQMQorIQkuREFUQS5XCS5JTlNUUigiQUJDREVGRyIsIlxQMSIsIDApCishCS5FTkRNCishCisKKyEJRklORF9TVFIJQ0RFCishCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiQ0RFIiwgMCkKKwkuc2hvcnQJMgorIQlGSU5EX1NUUglICishCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiSCIsIDApCisJLnNob3J0CS0xCishCisKKyEJLk1BQ1JPCVJFU0VSVkVfTEVOR1RIIFAxCishCS5BTElHTgk0CishCS5TUkVTCS5MRU4oIlxQMSIpCishCS5FTkRNCishCisKKyEJUkVTRVJWRV9MRU5HVEgJQUJDREVGCishCS5BTElHTgk0CisJLmFsaWduCTQKKyEJLlNSRVMJLkxFTigiQUJDREVGIikKKwkuc3BhY2UJMjQKKyEJUkVTRVJWRV9MRU5HVEgJQUJDCishCS5BTElHTgk0CisJLmFsaWduCTQKKyEJLlNSRVMJLkxFTigiQUJDIikKKwkuc3BhY2UJMTIKKyEKKworIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU0YzZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmFzbQpAQCAtMCwwICsxLDMgQEAKKworCXRlc3QgZm9yIGVvZiBpbiBtaWRkbGUgb2YgbGluZQorCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIzMGUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLm91dApAQCAtMCwwICsxLDUgQEAKKyEKKworIQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKKwl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMzUxYQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5hc20KQEAgLTAsMCArMSw4IEBACisKKworCXRlc3QKKysgY29udGludWVkCisrIGxpbmVzCisKKworCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzQ0ZThiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLm91dApAQCAtMCwwICsxLDEzIEBACishCisKKyEKKworIQl0ZXN0CishK2NvbnRpbnVlZAorIStsaW5lcworCXRlc3Rjb250aW51ZWRsaW5lcworIQorCishCisKKyEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3MDJkYgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5hc20KQEAgLTAsMCArMSwxMiBAQAorCisJdGVzdCBiYXNlIGNvbnZlcnRpb25zCisKKwlCJzEwMDEwMDAKKwlRJzIxMAorCUQnMTM2CisJSCc4OAorCisJRk9PQicxMDAxMDAwQkFSCisJRk9PUScyMTBCQVIKKwlGT09EJzEzNkJBUgorCUZPT0gnODhCQVIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTMzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyCkBAIC0wLDAgKzEgQEAKK0VORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQxNTBiCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLm91dApAQCAtMCwwICsxLDI1IEBACishCisKKyEJdGVzdCBiYXNlIGNvbnZlcnRpb25zCisJdGVzdCBiYXNlIGNvbnZlcnRpb25zCishCisKKyEJQicxMDAxMDAwCisJNzIKKyEJUScyMTAKKwkxMzYKKyEJRCcxMzYKKwkxMzYKKyEJSCc4OAorCTEzNgorIQorCishCUZPT0InMTAwMTAwMEJBUgorCUZPT0InMTAwMTAwMEJBUgorIQlGT09RJzIxMEJBUgorCUZPT1EnMjEwQkFSCishCUZPT0QnMTM2QkFSCisJRk9PRCcxMzZCQVIKKyEJRk9PSCc4OEJBUgorCUZPT0gnODhCQVIKKyEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE0M2NjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmFzbQpAQCAtMCwwICsxLDE4IEBACisJZG9ua2V5CitiYXIJLkFTU0lHTkEJMAorCS5BV0hJTEUJXCZiYXIgTFQgNQkKKwlISSBCQVIgSVMgXCZiYXIKK2ZvbwkuQVNTSUdOQQkwCisJLkFXSElMRQlcJmZvbyBMVCAyCisJSEkgQkVGT1JFCisJLkFSRVBFQVQJMgorCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCS5BRU5EUgorCUhJIEFGVEVSCitmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorCS5BRU5EVworYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKKwlBTkQgSVRTIE5PVyBcJmJhcgorCS5BRU5EVworCS5FTkQKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGFlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUub3V0CkBAIC0wLDAgKzEsMzg4IEBACishCWRvbmtleQorCWRvbmtleQorIWJhcgkuQVNTSUdOQQkwCishCS5BV0hJTEUJXCZiYXIgTFQgNQkKKyEJSEkgQkFSIElTIFwmYmFyCishZm9vCS5BU1NJR05BCTAKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQorIQlBTkQgSVRTIE5PVyBcJmJhcgorIQkuQUVORFcKKyEJSEkgQkFSIElTIFwmYmFyCisJSEkgQkFSIElTIDAKKyFmb28JLkFTU0lHTkEJMAorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIQlISSBCRUZPUkUKKwlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCUhJIE1FRElVTQkwIDAKKyEJLkFSRVBFQVQJMQorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCUhJIE1FRElVTQkwIDAKKyEJSEkgQUZURVIKKwlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishCUhJIEJFRk9SRQorCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTEgMAorIQkuQVJFUEVBVAkxCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTEgMAorIQlISSBBRlRFUgorCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQorIQlBTkQgSVRTIE5PVyBcJmJhcgorCUFORCBJVFMgTk9XIDEKKyEJLkFXSElMRQlcJmJhciBMVCA1CQorIQlISSBCQVIgSVMgXCZiYXIKKyFmb28JLkFTU0lHTkEJMAorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCishCUFORCBJVFMgTk9XIFwmYmFyCishCS5BRU5EVworIQlISSBCQVIgSVMgXCZiYXIKKwlISSBCQVIgSVMgMQorIWZvbwkuQVNTSUdOQQkwCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishCUhJIEJFRk9SRQorCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTAgMQorIQkuQVJFUEVBVAkxCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTAgMQorIQlISSBBRlRFUgorCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyEJSEkgQkVGT1JFCisJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKwlISSBNRURJVU0JMSAxCishCS5BUkVQRUFUCTEKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKwlISSBNRURJVU0JMSAxCishCUhJIEFGVEVSCisJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCishCUFORCBJVFMgTk9XIFwmYmFyCisJQU5EIElUUyBOT1cgMgorIQkuQVdISUxFCVwmYmFyIExUIDUJCishCUhJIEJBUiBJUyBcJmJhcgorIWZvbwkuQVNTSUdOQQkwCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKKyEJQU5EIElUUyBOT1cgXCZiYXIKKyEJLkFFTkRXCishCUhJIEJBUiBJUyBcJmJhcgorCUhJIEJBUiBJUyAyCishZm9vCS5BU1NJR05BCTAKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyEJSEkgQkVGT1JFCisJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKwlISSBNRURJVU0JMCAyCishCS5BUkVQRUFUCTEKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKwlISSBNRURJVU0JMCAyCishCUhJIEFGVEVSCisJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIQlISSBCRUZPUkUKKwlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCUhJIE1FRElVTQkxIDIKKyEJLkFSRVBFQVQJMQorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCUhJIE1FRElVTQkxIDIKKyEJSEkgQUZURVIKKwlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKKyEJQU5EIElUUyBOT1cgXCZiYXIKKwlBTkQgSVRTIE5PVyAzCishCS5BV0hJTEUJXCZiYXIgTFQgNQkKKyEJSEkgQkFSIElTIFwmYmFyCishZm9vCS5BU1NJR05BCTAKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQorIQlBTkQgSVRTIE5PVyBcJmJhcgorIQkuQUVORFcKKyEJSEkgQkFSIElTIFwmYmFyCisJSEkgQkFSIElTIDMKKyFmb28JLkFTU0lHTkEJMAorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIQlISSBCRUZPUkUKKwlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCUhJIE1FRElVTQkwIDMKKyEJLkFSRVBFQVQJMQorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorCUhJIE1FRElVTQkwIDMKKyEJSEkgQUZURVIKKwlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishCUhJIEJFRk9SRQorCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTEgMworIQkuQVJFUEVBVAkxCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTEgMworIQlISSBBRlRFUgorCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQorIQlBTkQgSVRTIE5PVyBcJmJhcgorCUFORCBJVFMgTk9XIDQKKyEJLkFXSElMRQlcJmJhciBMVCA1CQorIQlISSBCQVIgSVMgXCZiYXIKKyFmb28JLkFTU0lHTkEJMAorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCishCUFORCBJVFMgTk9XIFwmYmFyCishCS5BRU5EVworIQlISSBCQVIgSVMgXCZiYXIKKwlISSBCQVIgSVMgNAorIWZvbwkuQVNTSUdOQQkwCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishCUhJIEJFRk9SRQorCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTAgNAorIQkuQVJFUEVBVAkxCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCisJSEkgTUVESVVNCTAgNAorIQlISSBBRlRFUgorCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFXSElMRQlcJmZvbyBMVCAyCishCUhJIEJFRk9SRQorIQkuQVJFUEVBVAkyCishCUhJIE1FRElVTQlcJmZvbyBcJmJhcgorIQkuQUVORFIKKyEJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQUVORFcKKyEJSEkgQkVGT1JFCisJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKwlISSBNRURJVU0JMSA0CishCS5BUkVQRUFUCTEKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKwlISSBNRURJVU0JMSA0CishCUhJIEFGVEVSCisJSEkgQUZURVIKKyFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQorIQkuQVdISUxFCVwmZm9vIExUIDIKKyEJSEkgQkVGT1JFCishCS5BUkVQRUFUCTIKKyEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCishCS5BRU5EUgorIQlISSBBRlRFUgorIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCishCS5BRU5EVworIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCishCUFORCBJVFMgTk9XIFwmYmFyCisJQU5EIElUUyBOT1cgNQorIQkuQVdISUxFCVwmYmFyIExUIDUJCishCUhJIEJBUiBJUyBcJmJhcgorIWZvbwkuQVNTSUdOQQkwCishCS5BV0hJTEUJXCZmb28gTFQgMgorIQlISSBCRUZPUkUKKyEJLkFSRVBFQVQJMgorIQlISSBNRURJVU0JXCZmb28gXCZiYXIKKyEJLkFFTkRSCishCUhJIEFGVEVSCishZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKKyEJLkFFTkRXCishYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKKyEJQU5EIElUUyBOT1cgXCZiYXIKKyEJLkFFTkRXCishCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aCBiL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iY2I4MzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9ib3RoCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCit4PSQxIDsgc2hpZnQKK3k9JDEgOyBzaGlmdAorCitybSB0bXAuMCA+IC9kZXYvbnVsbCAyPiYxCitsbiAtcyAkeCB0bXAuMAorJCogdG1wLjAgPiB0bXAuMQorCitybSB0bXAuMAorbG4gLXMgJHkgdG1wLjAKKyQqIHRtcC4wID4gdG1wLjIKKworcm0gdG1wLjAKKworZGlmZiAtYyB0bXAuMSB0bXAuMgorZXhpdAorCisjZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcCBiL2dhcy90ZXN0c3VpdGUvbGliL2Rvb2JqY21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1YzMyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcApAQCAtMCwwICsxLDg4IEBACisjIS9iaW4vc2gKKyMgY29tcGFyZSB0d28gb2JqZWN0IGZpbGVzLCBpbiBkZXB0aC4KKworeD0kMQoreT0kMgorQk9USD0iJDEgJDIiCisKKworIyBpZiB0aGV5IGNtcCwgd2UncmUgZmluZS4KK2lmIChjbXAgJEJPVEggPiAvZGV2L251bGwpCit0aGVuCisJZXhpdCAwCitmaQorCisjIG90aGVyd2lzZSwgd2UgbXVzdCBsb29rIGNsb3Nlci4KK2lmIChkb2JvdGggJEJPVEggc2l6ZSkKK3RoZW4KKwllY2hvIFNpemVzIG9rLgorZWxzZQorCWVjaG8gU2l6ZXMgZGlmZmVyOgorCXNpemUgJEJPVEgKKyMJZXhpdCAxCitmaQorCitpZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK2hlYWRlcikKK3RoZW4KKwllY2hvIEhlYWRlcnMgb2suCitlbHNlCisJZWNobyBIZWFkZXIgZGlmZmVyZW5jZXMuCisjCWV4aXQgMQorZmkKKworaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICt0ZXh0ID4gL2Rldi9udWxsKQordGhlbgorCWVjaG8gVGV4dCBvay4KK2Vsc2UKKwllY2hvIFRleHQgZGlmZmVyZW5jZXMuCisjCWRvYm90aCAkQk9USCBvYmpkdW1wICt0ZXh0CisjCWV4aXQgMQorZmkKKworaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICtkYXRhID4gL2Rldi9udWxsKQordGhlbgorCWVjaG8gRGF0YSBvay4KK2Vsc2UKKwllY2hvIERhdGEgZGlmZmVyZW5jZXMuCisjCWRvYm90aCAkQk9USCBvYmpkdW1wICtkYXRhCisjCWV4aXQgMQorZmkKKworaWYgKGRvYm90aCAkQk9USCBvYmpkdW1wICtzeW1ib2xzID4gL2Rldi9udWxsKQordGhlbgorCWVjaG8gU3ltYm9scyBvay4KK2Vsc2UKKwllY2hvIC1uIFN5bWJvbCBkaWZmZXJlbmNlcy4uLgorCisJaWYgKGRvYm90aCAkQk9USCBkb3Vuc29ydHN5bWJvbHMpCisJdGhlbgorCQllY2hvIGJ1dCBzeW1ib2xzIGFyZSBzaW1wbHkgb3JkZXJlZCBkaWZmZXJlbnRseS4KKyMJCWVjaG8gTm93IHdoYXQgdG8gZG8gYWJvdXQgcmVsb2NzJz8nCisjCQlleGl0IDEKKwllbHNlCisJCWVjaG8gYW5kIHN5bWJvbHMgZGlmZmVyIGluIGNvbnRlbnQuCisJCWV4aXQgMQorCWZpCitmaQorCisjIG9mIGNvdXJzZSwgaWYgdGhlcmUgd2VyZSBzeW1ib2wgZGlmZnMsIHRoZW4gdGhlIHJlbG9jIHN5bWJvbCBpbmRleGVzCisjIHdpbGwgYmUgb2ZmLgorCitpZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgLXIgPiAvZGV2L251bGwpCit0aGVuCisJZWNobyBSZWxvYyBvay4KK2Vsc2UKKwllY2hvIC1uIFJlbG9jIGRpZmZlcmVuY2VzLi4uCisKKwlpZiAoZG9ib3RoICRCT1RIIGRvdW5zb3J0cmVsb2MpCisJdGhlbgorCQllY2hvIGJ1dCByZWxvY3MgYXJlIHNpbXBseSBvcmRlcmVkIGRpZmZlcmVudGx5LgorCWVsc2UKKwkJZWNobyBhbmQgcmVsb2NzIGRpZmZlciBpbiBjb250ZW50LgorCQlleGl0IDEKKwlmaQorZmkKKworZXhpdAorCisjIGVvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3N0cmlwdGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTUxNzAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9zdHJpcHRlc3QKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKK3g9c3RyaXB0ZXN0Lnh4LiQkCit5PXN0cmlwdGVzdC55eS4kJAorCitjcCAkMSAkeAorc3RyaXAgJHgKK2NwICQyICR5CitzdHJpcCAkeQorCitkb29iamNtcCAkeCAkeQorZXhpdAorCisjZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTc2OGEyMgotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdGVzdApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMgYWQgaG9jIGRlYnVnIHRvb2wKKworeD0kMQoreT0kMgorCit4b3V0PWBiYXNlbmFtZSAkeGAueHh4LiQkCit5b3V0PWBiYXNlbmFtZSAkeGAueXl5LiQkCisKK21rZGlyICR4b3V0Citta2RpciAkeW91dAorCitmb3IgaSBpbiAqLnMKK2RvCisJZWNobyBUZXN0aW5nICRpLi4uCisJb2JqZWN0PWBiYXNlbmFtZSAkaSAuc2AubworCSR4ICRpIC1vICR4b3V0LyRvYmplY3QKKwkkeSAkaSAtbyAkeW91dC8kb2JqZWN0CisKKyMgaWYgdGhleSBjbXAsIHdlJ3JlIG9rLiAgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gbG9vayBjbG9zZXIuCisKKwlpZiAoY21wICR4b3V0LyRvYmplY3QgJHlvdXQvJG9iamVjdCkKKwl0aGVuCisJCWVjaG8gJGkgaXMgb2suCisJZWxzZQorCQlpZiAoZG9vYmpjbXAgJHhvdXQvJG9iamVjdCAkeW91dC8kb2JqZWN0KQorCQl0aGVuCisJCQllY2hvIE5vdCB0aGUgc2FtZSBidXQgb2JqY21wIG9rLgorCQllbHNlCisJCQlleGl0IDEKKwkJZmkKKwlmaQorCisJZWNobworZG9uZQorCitybSAtcmYgJHhvdXQgJHlvdXQKKworZXhpdCAwCisKKyMgRU9GCisKKwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNyZWxvYyBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQ2OTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vc2gKKyMgb2JqZHVtcCB0aGUgcmVsb2MgdGFibGUsIGJ1dCBzdHJpcCBvZmYgdGhlIGhlYWRpbmdzIGFuZCByZWxvYworIyBudW1iZXJzIGFuZCBzb3J0IHRoZSByZXN1bHQuICBJbnRlbmRlZCBmb3IgdXNlIGluIGNvbXBhcmluZyByZWxvYworIyB0YWJsZXMgdGhhdCBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyLgorCitvYmpkdW1wICtyZWxvYyArb21pdC1yZWxvY2F0aW9uLW51bWJlcnMgK29taXQtc3ltYm9sLW51bWJlcnMgJDEgXAorCXwgc29ydAorI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0gYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3N5bQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDRkYTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZG91bnNzeW0KQEAgLTAsMCArMSw4IEBACisjIS9iaW4vc2gKKyMgb2JqZHVtcCB0aGUgc3ltYm9sIHRhYmxlLCBidXQgc3RyaXAgb2ZmIHRoZSBoZWFkaW5ncyBhbmQgc3ltYm9sCisjIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHN5bWJvbAorIyB0YWJsZXMgdGhhdCBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyLgorCitvYmpkdW1wICtzeW1ib2xzICtvbWl0LXN5bWJvbC1udW1iZXJzICQxIFwKKwl8IHNvcnQKKyNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cCBiL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTc3MThmCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRlZnMuZXhwCkBAIC0wLDAgKzEsNTc0IEBACisjIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEtlbiBSYWVidXJuIChyYWVidXJuQGN5Z251cy5jb20pLgorCitwcm9jIGdhc192ZXJzaW9uIHt9IHsKKyAgICBnbG9iYWwgQVMKKyAgICBjYXRjaCAiZXhlYyAkQVMgLXZlcnNpb24gPCAvZGV2L251bGwiIHRtcAorICAgICMgU2hvdWxkIGZpbmQgYSB3YXkgdG8gZGlzY2FyZCBjb25zdGFudCBwYXJ0cywga2VlcCB3aGF0ZXZlcidzCisgICAgIyBsZWZ0LCBzbyB0aGUgdmVyc2lvbiBzdHJpbmcgY291bGQgYmUgYWxtb3N0IGFueXRoaW5nIGF0IGFsbC4uLgorICAgIHJlZ2V4cCAiXFteXG5cXSogKGN5Z251cy18KShcWy0wLTkuYS16QS1aLVxdKylcW1xyXG5cXS4qIiAkdG1wIHZlcnNpb24gY3lnIG51bWJlcgorICAgIGlmICFbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKKyAgICAgICAgcmV0dXJuICJbd2hpY2ggJEFTXSAobm8gdmVyc2lvbiBudW1iZXIpXG4iCisgICAgfQorICAgIGNsb25lX291dHB1dCAiW3doaWNoICRBU10gJG51bWJlclxuIgorICAgIHVuc2V0IHZlcnNpb24KK30KKworcHJvYyBnYXNfcnVuIHsgcHJvZyBhc19vcHRzIHJlZGlyIH0geworICAgIGdsb2JhbCBBUworICAgIGdsb2JhbCBBU0ZMQUdTCisgICAgZ2xvYmFsIGNvbXBfb3V0cHV0CisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisKKyAgICB2ZXJib3NlICJFeGVjdXRpbmcgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cgJHJlZGlyIgorICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nICRyZWRpciIgY29tcF9vdXRwdXQKKyAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KKyAgICB2ZXJib3NlICJvdXRwdXQgd2FzICRjb21wX291dHB1dCIKKyAgICByZXR1cm4gW2xpc3QgJGNvbXBfb3V0cHV0ICIiXTsKK30KKworcHJvYyBhbGxfb25lcyB7IGFyZ3MgfSB7CisgICAgZm9yZWFjaCB4ICRhcmdzIHsgaWYgW2V4cHIgJHghPTFdIHsgcmV0dXJuIDAgfSB9CisgICAgcmV0dXJuIDEKK30KKworcHJvYyBnYXNfc3RhcnQgeyBwcm9nIGFzX29wdHMgfSB7CisgICAgZ2xvYmFsIEFTCisgICAgZ2xvYmFsIEFTRkxBR1MKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBzcGF3bl9pZAorCisgICAgdmVyYm9zZSAiU3RhcnRpbmcgJEFTICRBU0ZMQUdTICRhc19vcHRzICRwcm9nIiAyCisgICAgY2F0Y2ggeworCXNwYXduIC1ub2VjaG8gLW5vdHR5Y29weSAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZworICAgIH0gZm9vCisgICAgaWYgIVtyZWdleHAge15bMC05XSt9ICRmb29dIHRoZW4geworCXBlcnJvciAiQ2FuJ3QgcnVuICRzdWJkaXIvJHByb2c6ICRmb28iCisgICAgfQorfQorCitwcm9jIGdhc19maW5pc2ggeyB9IHsKKyAgICBnbG9iYWwgc3Bhd25faWQKKworICAgIGNhdGNoICJjbG9zZSIKKyAgICBjYXRjaCAid2FpdCIKK30KKworcHJvYyB3YW50X25vX291dHB1dCB7IHRlc3RuYW1lIH0geworICAgIGdsb2JhbCBjb21wX291dHB1dAorCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKKwlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCisgICAgfQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKKwlwYXNzICIkdGVzdG5hbWUiCisJcmV0dXJuIDEKKyAgICB9IGVsc2UgeworCWZhaWwgIiR0ZXN0bmFtZSIKKwlyZXR1cm4gMAorICAgIH0KK30KKworcHJvYyBnYXNfdGVzdF9vbGQgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7CisgICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiIgorICAgIHJldHVybiBbd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lXQorfQorCitwcm9jIGdhc190ZXN0IHsgZmlsZSBhc19vcHRzIHZhcl9vcHRzIHRlc3RuYW1lIH0geworICAgIGdsb2JhbCBjb21wX291dHB1dAorCisgICAgc2V0IGkgMAorICAgIGZvcmVhY2ggd29yZCAkdmFyX29wdHMgeworCXNldCBpZ25vcmVfc3Rkb3V0KCRpKSBbc3RyaW5nIG1hdGNoICIqPiIgJHdvcmRdCisJc2V0IG9wdCgkaSkgW3N0cmluZyB0cmltICR3b3JkIHs+fV0KKwlpbmNyIGkKKyAgICB9CisgICAgc2V0IG1heCBbZXhwciAxPDwkaV0KKyAgICBmb3Ige3NldCBpIDB9IHtbZXhwciAkaTwkbWF4XX0ge2luY3IgaX0geworCXNldCBtYXliZV9pZ25vcmVfc3Rkb3V0ICIiCisJc2V0IGV4dHJhX29wdHMgIiIKKwlmb3Ige3NldCBiaXQgMH0geygxPDwkYml0KTwkbWF4fSB7aW5jciBiaXR9IHsKKwkgICAgc2V0IG51bSBbZXhwciAxPDwkYml0XQorCSAgICBpZiBbZXhwciAkaSYkbnVtXSB0aGVuIHsKKwkJc2V0IGV4dHJhX29wdHMgIiRleHRyYV9vcHRzICRvcHQoJGJpdCkiCisJCWlmICRpZ25vcmVfc3Rkb3V0KCRiaXQpIHRoZW4geworCQkgICAgc2V0IG1heWJlX2lnbm9yZV9zdGRvdXQgIj4vZGV2L251bGwiCisJCX0KKwkgICAgfQorCX0KKwlzZXQgZXh0cmFfb3B0cyBbc3RyaW5nIHRyaW0gJGV4dHJhX29wdHNdCisJZ2FzX3J1biAkZmlsZSAiJGFzX29wdHMgJGV4dHJhX29wdHMiICRtYXliZV9pZ25vcmVfc3Rkb3V0CisKKwkjIFNob3VsZCBJIGJlIGFibGUgdG8gdXNlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBoZXJlPworCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4dHJhX29wdHNdIHRoZW4geworCSAgICB3YW50X25vX291dHB1dCAkdGVzdG5hbWUKKwl9IGVsc2UgeworCSAgICB3YW50X25vX291dHB1dCAiJHRlc3RuYW1lICgkZXh0cmFfb3B0cykiCisJfQorICAgIH0KKyAgICBpZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKKyAgICAgICAgdW5zZXQgZXJyb3JJbmZvCisgICAgfQorfQorCitwcm9jIGdhc190ZXN0X2lnbm9yZV9zdGRvdXQgeyBmaWxlIGFzX29wdHMgdGVzdG5hbWUgfSB7CisgICAgZ2xvYmFsIGNvbXBfb3V0cHV0CisKKyAgICBnYXNfcnVuICRmaWxlICRhc19vcHRzICI+L2Rldi9udWxsIgorICAgIHdhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZQorfQorCitwcm9jIGdhc190ZXN0X2Vycm9yIHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0geworICAgIGdsb2JhbCBjb21wX291dHB1dAorCisgICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiPi9kZXYvbnVsbCIKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4geworCXNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKKwl2ZXJib3NlICIkY29tcF9vdXRwdXQiIDMKKyAgICB9CisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4geworCWZhaWwgIiR0ZXN0bmFtZSIKKyAgICB9IGVsc2UgeworCXBhc3MgIiR0ZXN0bmFtZSIKKyAgICB9Cit9CisKK3Byb2MgZ2FzX2V4aXQge30ge30KKworcHJvYyBnYXNfaW5pdCB7IGFyZ3MgfSB7CisgICAgZ2xvYmFsIHRhcmdldF9jcHUKKyAgICBnbG9iYWwgdGFyZ2V0X2NwdV9mYW1pbHkKKyAgICBnbG9iYWwgdGFyZ2V0X2ZhbWlseQorICAgIGdsb2JhbCB0YXJnZXRfdmVuZG9yCisgICAgZ2xvYmFsIHRhcmdldF9vcworICAgIGdsb2JhbCBzdGRvcHRsaXN0CisKKyAgICBjYXNlICIkdGFyZ2V0X2NwdSIgaW4geworCSJtNjg/Pz8iCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSBtNjhrIH0KKwkiaVszNF04NiIJCXsgc2V0IHRhcmdldF9jcHVfZmFtaWx5IGkzODYgfQorCWRlZmF1bHQJCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSAkdGFyZ2V0X2NwdSB9CisgICAgfQorCisgICAgc2V0IHRhcmdldF9mYW1pbHkgIiR0YXJnZXRfY3B1X2ZhbWlseS0kdGFyZ2V0X3ZlbmRvci0kdGFyZ2V0X29zIgorICAgIHNldCBzdGRvcHRsaXN0ICItYT4iCisKKyAgICBpZiAhW2lzdGFyZ2V0ICIqLSotKiJdIHsKKwlwZXJyb3IgIlRhcmdldCBuYW1lIFtpc3RhcmdldF0gaXMgbm90IGEgdHJpcGxlLiIKKyAgICB9CisgICAgIyBOZWVkIHRvIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgcmV0dXJuCit9CisKKworIyBydW5fZHVtcF90ZXN0IEZJTEUgCisjCisjIEFzc2VtYmxlIGEgLnMgZmlsZSwgdGhlbiBydW4gc29tZSB1dGlsaXR5IG9uIGl0IGFuZCBjaGVjayB0aGUgb3V0cHV0LgorIyAKKyMgVGhlcmUgc2hvdWxkIGJlIGFuIGFzc2VtYmx5IGxhbmd1YWdlIGZpbGUgbmFtZWQgRklMRS5zIGluIHRoZSB0ZXN0CisjIHN1aXRlIGRpcmVjdG9yeSwgYW5kIGEgcGF0dGVybiBmaWxlIGNhbGxlZCBGSUxFLmQuICBgcnVuX2R1bXBfdGVzdCcKKyMgd2lsbCBhc3NlbWJsZSBGSUxFLnMsIHJ1biBzb21lIHRvb2wgbGlrZSBgb2JqZHVtcCcsIGBvYmpjb3B5Jywgb3IKKyMgYG5tJyBvbiB0aGUgLm8gZmlsZSB0byBwcm9kdWNlIHRleHR1YWwgb3V0cHV0LCBhbmQgdGhlbiBhbmFseXplIHRoYXQKKyMgd2l0aCByZWdleHBzLiAgVGhlIEZJTEUuZCBmaWxlIHNwZWNpZmllcyB3aGF0IHByb2dyYW0gdG8gcnVuLCBhbmQKKyMgd2hhdCB0byBleHBlY3QgaW4gaXRzIG91dHB1dC4KKyMKKyMgVGhlIEZJTEUuZCBmaWxlIGJlZ2lucyB3aXRoIHplcm8gb3IgbW9yZSBvcHRpb24gbGluZXMsIHdoaWNoIHNwZWNpZnkKKyMgZmxhZ3MgdG8gcGFzcyB0byB0aGUgYXNzZW1ibGVyLCB0aGUgcHJvZ3JhbSB0byBydW4gdG8gZHVtcCB0aGUKKyMgYXNzZW1ibGVyJ3Mgb3V0cHV0LCBhbmQgdGhlIG9wdGlvbnMgaXQgd2FudHMuICBUaGUgb3B0aW9uIGxpbmVzIGhhdmUKKyMgdGhlIHN5bnRheDoKKyMgCisjICAgICAgICAgIyBPUFRJT046IFZBTFVFCisjIAorIyBPUFRJT04gaXMgdGhlIG5hbWUgb2Ygc29tZSBvcHRpb24sIGxpa2UgIm5hbWUiIG9yICJvYmpkdW1wIiwgYW5kCisjIFZBTFVFIGlzIE9QVElPTidzIHZhbHVlLiAgVGhlIHZhbGlkIG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyMgV2hpdGVzcGFjZSBpcyBpZ25vcmVkIGV2ZXJ5d2hlcmUsIGV4Y2VwdCB3aXRoaW4gVkFMVUUuICBUaGUgb3B0aW9uCisjIGxpc3QgZW5kcyB3aXRoIHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgYWJvdmUgc3ludGF4CisjIChobW0sIG5vdCBncmVhdCBmb3IgZXJyb3IgZGV0ZWN0aW9uKS4KKyMKKyMgVGhlIGludGVyZXN0aW5nIG9wdGlvbnMgYXJlOgorIyAKKyMgICBuYW1lOiBURVNULU5BTUUKKyMJVGhlIG5hbWUgb2YgdGhpcyB0ZXN0LCBwYXNzZWQgdG8gRGVqYUdOVSdzIGBwYXNzJyBhbmQgYGZhaWwnCisjICAgICAgIGNvbW1hbmRzLiAgSWYgb21pdHRlZCwgdGhpcyBkZWZhdWx0cyB0byBGSUxFLCB0aGUgcm9vdCBvZiB0aGUKKyMgICAgICAgLnMgYW5kIC5kIGZpbGVzJyBuYW1lcy4KKyMgCisjICAgYXM6IEZMQUdTCisjCVdoZW4gYXNzZW1ibGluZyBGSUxFLnMsIHBhc3MgRkxBR1MgdG8gdGhlIGFzc2VtYmxlci4KKyMgCisjICAgUFJPRzogUFJPR1JBTS1OQU1FCisjICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHJ1biB0byBhbmFseXplIHRoZSAubyBmaWxlIHByb2R1Y2VkCisjICAgICAgIGJ5IHRoZSBhc3NlbWJsZXIuICBUaGlzIGNhbiBiZSBvbWl0dGVkOyBydW5fZHVtcF90ZXN0IHdpbGwgZ3Vlc3MKKyMgICAgICAgd2hpY2ggcHJvZ3JhbSB0byBydW4gYnkgc2VlaW5nIHdoaWNoIG9mIHRoZSBmbGFncyBvcHRpb25zIGJlbG93CisjCWlzIHByZXNlbnQuCisjIAorIyAgIG9iamR1bXA6IEZMQUdTCisjICAgbm06IEZMQUdTCisjICAgb2JqY29weTogRkxBR1MKKyMJVXNlIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB0byBhbmFseXplIHRoZSAubyBmaWxlLCBhbmQgcGFzcyBpdAorIwlGTEFHUywgaW4gYWRkaXRpb24gdG8gdGhlIC5vIGZpbGUgbmFtZS4KKyMKKyMgICBzb3VyY2U6IFNPVVJDRQorIwlBc3NlbWJsZSB0aGUgZmlsZSBTT1VSQ0Uucy4gIElmIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gRklMRS5zLgorIyAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiBzZXZlcmFsIC5kIGZpbGVzIHdhbnQgdG8gc2hhcmUgYSAucyBmaWxlLgorIworIyBFYWNoIG9wdGlvbiBtYXkgb2NjdXIgYXQgbW9zdCBvbmNlLgorIworIyBBZnRlciB0aGUgb3B0aW9uIGxpbmVzIGNvbWUgcmVnZXhwIGxpbmVzLiAgYHJ1bl9kdW1wX3Rlc3QnIGNhbGxzCisjIGByZWdleHBfZGlmZicgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mIHRoZSBkdW1waW5nIHRvb2wgYWdhaW5zdCB0aGUKKyMgcmVnZXhwcyBpbiBGSUxFLmQuICBgcmVnZXhwX2RpZmYnIGlzIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlOyBzZWUKKyMgZnVydGhlciBjb21tZW50cyB0aGVyZS4KKworcHJvYyBydW5fZHVtcF90ZXN0IHsgbmFtZSB9IHsKKyAgICBnbG9iYWwgc3ViZGlyIHNyY2RpcgorICAgIGdsb2JhbCBPQkpEVU1QIE5NIEFTIE9CSkNPUFkKKyAgICBnbG9iYWwgT0JKRFVNUEZMQUdTIE5NRkxBR1MgQVNGTEFHUyBPQkpDT1BZRkxBR1MKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIqLyoiICRuYW1lXSB7CisJc2V0IGZpbGUgJG5hbWUKKwlzZXQgbmFtZSBbZmlsZSB0YWlsICRuYW1lXQorICAgIH0gZWxzZSB7CisJc2V0IGZpbGUgIiRzcmNkaXIvJHN1YmRpci8kbmFtZSIKKyAgICB9CisgICAgc2V0IG9wdF9hcnJheSBbc2x1cnBfb3B0aW9ucyAiJHtmaWxlfS5kIl0KKyAgICBpZiB7ICRvcHRfYXJyYXkgPT0gLTEgfSB7CisJdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCisJcmV0dXJuCisgICAgfQorICAgIHNldCBvcHRzKGFzKSB7fQorICAgIHNldCBvcHRzKG9iamR1bXApIHt9CisgICAgc2V0IG9wdHMobm0pIHt9CisgICAgc2V0IG9wdHMob2JqY29weSkge30KKyAgICBzZXQgb3B0cyhuYW1lKSB7fQorICAgIHNldCBvcHRzKFBST0cpIHt9CisgICAgc2V0IG9wdHMoc291cmNlKSB7fQorCisgICAgZm9yZWFjaCBpICRvcHRfYXJyYXkgeworCXNldCBvcHRfbmFtZSBbbGluZGV4ICRpIDBdCisJc2V0IG9wdF92YWwgW2xpbmRleCAkaSAxXQorCWlmICFbaW5mbyBleGlzdHMgb3B0cygkb3B0X25hbWUpXSB7CisJICAgIHBlcnJvciAidW5rbm93biBvcHRpb24gJG9wdF9uYW1lIGluIGZpbGUgJGZpbGUuZCIKKwkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCisJICAgIHJldHVybgorCX0KKwlpZiBbc3RyaW5nIGxlbmd0aCAkb3B0cygkb3B0X25hbWUpXSB7CisJICAgIHBlcnJvciAib3B0aW9uICRvcHRfbmFtZSBtdWx0aXBseSBzZXQgaW4gJGZpbGUuZCIKKwkgICAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCisJICAgIHJldHVybgorCX0KKwlzZXQgb3B0cygkb3B0X25hbWUpICRvcHRfdmFsCisgICAgfQorCisgICAgaWYgeyRvcHRzKFBST0cpICE9ICIifSB7CisJc3dpdGNoIC0tICRvcHRzKFBST0cpIHsKKwkgICAgb2JqZHVtcAorCQl7IHNldCBwcm9ncmFtIG9iamR1bXAgfQorCSAgICBubQorCQl7IHNldCBwcm9ncmFtIG5tIH0KKwkgICAgb2JqY29weQorCQl7IHNldCBwcm9ncmFtIG9iamNvcHkgfQorCSAgICBkZWZhdWx0CisJCXsgcGVycm9yICJ1bnJlY29nbml6ZWQgcHJvZ3JhbSBvcHRpb24gJG9wdHMoUFJPRykgaW4gJGZpbGUuZCIKKwkJICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKKwkJICByZXR1cm4gfQorCX0KKyAgICB9IGVsc2UgeworCSMgR3Vlc3Mgd2hpY2ggcHJvZ3JhbSB0byBydW4sIGJ5IHNlZWluZyB3aGljaCBvcHRpb24gd2FzIHNwZWNpZmllZC4KKwlzZXQgcHJvZ3JhbSAiIgorCWZvcmVhY2ggcCB7b2JqZHVtcCBvYmpjb3B5IG5tfSB7CisJICAgIGlmIHskb3B0cygkcCkgIT0gIiJ9IHsKKwkJaWYgeyRwcm9ncmFtICE9ICIifSB7CisJCSAgICBwZXJyb3IgImFtYmlndW91cyBkdW1wIHByb2dyYW0gaW4gJGZpbGUuZCIKKwkJICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQorCQkgICAgcmV0dXJuCisJCX0gZWxzZSB7CisJCSAgICBzZXQgcHJvZ3JhbSAkcAorCQl9CisJICAgIH0KKwl9CisJaWYgeyRwcm9ncmFtID09ICIifSB7CisJICAgIHBlcnJvciAiZHVtcCBwcm9ncmFtIHVuc3BlY2lmaWVkIGluICRmaWxlLmQiCisJICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0IHByb2dvcHRzMSAkb3B0cygkcHJvZ3JhbSkKKyAgICBldmFsIHNldCBwcm9nb3B0cyBcJFtzdHJpbmcgdG91cHBlciAkcHJvZ3JhbV1GTEFHUworICAgIGV2YWwgc2V0IGJpbmFyeSBcJFtzdHJpbmcgdG91cHBlciAkcHJvZ3JhbV0KKyAgICBpZiB7ICRvcHRzKG5hbWUpID09ICIiIH0geworCXNldCB0ZXN0bmFtZSAiJHN1YmRpci8kbmFtZSIKKyAgICB9IGVsc2UgeworCXNldCB0ZXN0bmFtZSAkb3B0cyhuYW1lKQorICAgIH0KKworICAgIGlmIHsgJG9wdHMoc291cmNlKSA9PSAiIiB9IHsKKwlzZXQgc291cmNlZmlsZSAke2ZpbGV9LnMKKyAgICB9IGVsc2UgeworCXNldCBzb3VyY2VmaWxlICRzcmNkaXIvJHN1YmRpci8kb3B0cyhzb3VyY2UpCisgICAgfQorCisgICAgc2VuZF9sb2cgIiRBUyAkQVNGTEFHUyAkb3B0cyhhcykgLW8gZHVtcC5vICRzb3VyY2VmaWxlXG4iCisgICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkb3B0cyhhcykgLW8gZHVtcC5vICRzb3VyY2VmaWxlIiBjb21wX291dHB1dAorICAgIHNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQorCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKKwlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCisJZmFpbCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiB7IFt3aGljaCAkYmluYXJ5XSA9PSAwIH0geworCXVudGVzdGVkICR0ZXN0bmFtZQorCXJldHVybgorICAgIH0KKworICAgIGlmIHsgJHByb2dvcHRzMSA9PSAiIiB9IHsgc2V0ICRwcm9nb3B0czEgIi1yIiB9CisgICAgdmVyYm9zZSAicnVubmluZyAkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIiAzCisKKyAgICAjIE9iamNvcHksIHVubGlrZSB0aGUgb3RoZXIgdHdvLCB3b24ndCBzZW5kIGl0cyBvdXRwdXQgdG8gc3Rkb3V0LAorICAgICMgc28gd2UgaGF2ZSB0byBydW4gaXQgc3BlY2lhbGx5LgorICAgIGlmIHsgJHByb2dyYW0gPT0gIm9iamNvcHkiIH0geworCXNlbmRfbG9nICIkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyBkdW1wLm91dFxuIgorCWNhdGNoICJleGVjICRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vIGR1bXAub3V0IiBjb21wX291dHB1dAorCXNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQorCWlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7CisJICAgIHNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKKwkgICAgZmFpbCAkdGVzdG5hbWUKKwkgICAgcmV0dXJuCisJfQorICAgIH0gZWxzZSB7CisJc2VuZF9sb2cgIiRiaW5hcnkgJHByb2dvcHRzICRwcm9nb3B0czEgZHVtcC5vID4gZHVtcC5vdXRcbiIKKwljYXRjaCAiZXhlYyAkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyA+IGR1bXAub3V0IiBjb21wX291dHB1dAorCXNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGNvbXBfb3V0cHV0XQorCWlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7CisJICAgIHNlbmRfbG9nICIkY29tcF9vdXRwdXRcbiIKKwkgICAgZmFpbCAkdGVzdG5hbWUKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIHZlcmJvc2VfZXZhbCB7W2ZpbGVfY29udGVudHMgImR1bXAub3V0Il19IDMKKyAgICBpZiB7IFtyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmQiXSB9IHRoZW4geworCWZhaWwgJHRlc3RuYW1lCisJdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCisJcmV0dXJuCisgICAgfQorCisgICAgcGFzcyAkdGVzdG5hbWUKK30KKworcHJvYyBzbHVycF9vcHRpb25zIHsgZmlsZSB9IHsKKyAgICBpZiBbY2F0Y2ggeyBzZXQgZiBbb3BlbiAkZmlsZSByXSB9IHhdIHsKKwkjcGVycm9yICJjb3VsZG4ndCBvcGVuIGAkZmlsZSc6ICR4IgorCXBlcnJvciAiJHgiCisJcmV0dXJuIC0xCisgICAgfQorICAgIHNldCBvcHRfYXJyYXkge30KKyAgICAjIHdoaXRlc3BhY2UgZXhwcmVzc2lvbgorICAgIHNldCB3cyAge1sgCV0qfQorICAgIHNldCBud3Mge1teIAldKn0KKyAgICAjIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBhbnl3aGVyZSBleGNlcHQgd2l0aGluIHRoZSBvcHRpb25zIGxpc3Q7CisgICAgIyBvcHRpb24gbmFtZXMgYXJlIGFscGhhYmV0aWMgb25seQorICAgIHNldCBwYXQgIl4jJHt3c30oXFthLXpBLVpcXSopJHdzOiR7d3N9KC4qKSR3c1wkIgorICAgIHdoaWxlIHsgW2dldHMgJGYgbGluZV0gIT0gLTEgfSB7CisJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQorCSMgV2hpdGVzcGFjZSBoZXJlIGlzIHNwYWNlLXRhYi4KKwlpZiBbcmVnZXhwICRwYXQgJGxpbmUgeHh4IG9wdF9uYW1lIG9wdF92YWxdIHsKKwkgICAgIyBtYXRjaCEKKwkgICAgbGFwcGVuZCBvcHRfYXJyYXkgW2xpc3QgJG9wdF9uYW1lICRvcHRfdmFsXQorCX0gZWxzZSB7CisJICAgIGJyZWFrCisJfQorICAgIH0KKyAgICBjbG9zZSAkZgorICAgIHJldHVybiAkb3B0X2FycmF5Cit9CisKK3Byb2Mgb2JqZHVtcCB7IG9wdHMgfSB7CisgICAgZ2xvYmFsIE9CSkRVTVAKKyAgICBnbG9iYWwgY29tcF9vdXRwdXQKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisKKyAgICBjYXRjaCAiZXhlYyAkT0JKRFVNUCAkb3B0cyIgY29tcF9vdXRwdXQKKyAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KKyAgICB2ZXJib3NlICJvYmpkdW1wIG91dHB1dD0kY29tcF9vdXRwdXRcbiIgMworfQorCitwcm9jIG9iamR1bXBfc3RhcnRfbm9fc3ViZGlyIHsgcHJvZyBvcHRzIH0geworICAgIGdsb2JhbCBPQkpEVU1QCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzcGF3bl9pZAorCisgICAgdmVyYm9zZSAiU3RhcnRpbmcgJE9CSkRVTVAgJG9wdHMgJHByb2ciIDIKKyAgICBjYXRjaCB7CisJc3Bhd24gLW5vZWNobyAtbm90dHlpbml0ICRzcmNkaXIvbGliL3J1biAkT0JKRFVNUCAkb3B0cyAkcHJvZworICAgIH0gZm9vCisgICAgaWYgIVtyZWdleHAge15bMC05XSt9ICRmb29dIHRoZW4geworCXBlcnJvciAiQ2FuJ3QgcnVuICRwcm9nOiAkZm9vIgorICAgIH0KK30KKworcHJvYyBvYmpkdW1wX2ZpbmlzaCB7IH0geworICAgIGdsb2JhbCBzcGF3bl9pZAorCisgICAgY2F0Y2ggImNsb3NlIgorICAgIGNhdGNoICJ3YWl0IgorfQorCisjIERlZmF1bHQgdGltZW91dCBpcyAxMCBzZWNvbmRzLCBsb3NlcyBvbiBhIHNsb3cgbWFjaGluZS4gIEJ1dCBzb21lCisjIGNvbmZpZ3VyYXRpb25zIG9mIGRlamFnbnUgbWF5IG92ZXJyaWRlIGl0LgoraWYgeyR0aW1lb3V0PDEyMH0gdGhlbiB7IHNldCB0aW1lb3V0IDEyMCB9CisKK2V4cGVjdF9hZnRlciAtaSB7CisgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0IiB9CisgICAgInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIJeyBwZXJyb3IgInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIgfQorICAgIGJ1ZmZlcl9mdWxsCQkJeyBwZXJyb3IgImJ1ZmZlciBmdWxsIiB9CisgICAgZW9mCQkJCXsgcGVycm9yICJlb2YiIH0KK30KKworIyByZWdleHBfZGlmZiwgYmFzZWQgb24gc2ltcGxlX2RpZmYgdGFrZW4gZnJvbSBsZCB0ZXN0IHN1aXRlCisjCWNvbXBhcmVzIHR3byBmaWxlcyBsaW5lLWJ5LWxpbmUKKyMJZmlsZTEgY29udGFpbnMgc3RyaW5ncywgZmlsZTIgY29udGFpbnMgcmVnZXhwcyBhbmQgIy1jb21tZW50cworIwlibGFuayBsaW5lcyBhcmUgaWdub3JlZCBpbiBlaXRoZXIgZmlsZQorIwlyZXR1cm5zIG5vbi16ZXJvIGlmIGRpZmZlcmVuY2VzIGV4aXN0CisjCitwcm9jIHJlZ2V4cF9kaWZmIHsgZmlsZV8xIGZpbGVfMiB9IHsKKworICAgIHNldCBlb2YgLTEKKyAgICBzZXQgZW5kXzEgMAorICAgIHNldCBlbmRfMiAwCisgICAgc2V0IGRpZmZlcmVuY2VzIDAKKyAgICBzZXQgZGlmZl9wYXNzIDAKKworICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8xXSB0aGVuIHsKKwlzZXQgZmlsZV9hIFtvcGVuICRmaWxlXzEgcl0KKyAgICB9IGVsc2UgeworCXdhcm5pbmcgIiRmaWxlXzEgZG9lc24ndCBleGlzdCIKKwlyZXR1cm4gMQorICAgIH0KKworICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKKwlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KKyAgICB9IGVsc2UgeworCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKKwljbG9zZSAkZmlsZV9hCisJcmV0dXJuIDEKKyAgICB9CisKKyAgICB2ZXJib3NlICIgUmVnZXhwLWRpZmYnaW5nOiAkZmlsZV8xICRmaWxlXzIiIDIKKworICAgIHdoaWxlIHsgMSB9IHsKKwlzZXQgbGluZV9hICIiCisJc2V0IGxpbmVfYiAiIgorCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYV0gPT0gMCB9IHsKKwkgICAgaWYgeyBbZ2V0cyAkZmlsZV9hIGxpbmVfYV0gPT0gJGVvZiB9IHsKKwkJc2V0IGVuZF8xIDEKKwkJYnJlYWsKKwkgICAgfQorCX0KKwl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2JdID09IDAgfHwgW3N0cmluZyBtYXRjaCAiIyoiICRsaW5lX2JdIH0geworCSAgICBpZiBbIHN0cmluZyBtYXRjaCAiI3Bhc3MiICRsaW5lX2IgXSB7CisJCXNldCBlbmRfMiAxCisJCXNldCBkaWZmX3Bhc3MgMQorCQlicmVhaworCSAgICB9CisJICAgIGlmIHsgW2dldHMgJGZpbGVfYiBsaW5lX2JdID09ICRlb2YgfSB7CisJCXNldCBlbmRfMiAxCisJCWJyZWFrCisJICAgIH0KKwl9CisKKyAgICAgICAgaWYgeyAkZGlmZl9wYXNzIH0geyAKKyAgICAgICAgICAgIGJyZWFrIAorICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSAmJiAkZW5kXzIgfSB7IAorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgfSB7CisgICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMVxuIgorICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgcmVnZXhwcyBpbiAkZmlsZV8yIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYiRcIlxuRU9GIGZyb20gJGZpbGVfMSIgMworICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIH0gZWxzZWlmIHsgJGVuZF8yIH0geworICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iCisgICAgICAgICAgICB2ZXJib3NlICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIiAzCisgICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZlcmJvc2UgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCIiIDMKKyAgICAgICAgICAgIGlmICFbcmVnZXhwICJeJGxpbmVfYiQiICIkbGluZV9hIl0geworCQlzZW5kX2xvZyAicmVnZXhwX2RpZmYgbWF0Y2ggZmFpbHVyZVxuIgorCQlzZW5kX2xvZyAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIlxuIgorCQlzZXQgZGlmZmVyZW5jZXMgMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiB7ICRkaWZmZXJlbmNlcyA9PSAwICYmICEkZGlmZl9wYXNzICYmIFtlb2YgJGZpbGVfYV0gIT0gW2VvZiAkZmlsZV9iXSB9IHsKKwlzZW5kX2xvZyAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHNcbiIKKwl2ZXJib3NlICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3RocyIgMworCXNldCBkaWZmZXJlbmNlcyAxCisgICAgfQorCisgICAgY2xvc2UgJGZpbGVfYQorICAgIGNsb3NlICRmaWxlX2IKKworICAgIHJldHVybiAkZGlmZmVyZW5jZXMKK30KKworcHJvYyBmaWxlX2NvbnRlbnRzIHsgZmlsZW5hbWUgfSB7CisgICAgc2V0IGZpbGUgW29wZW4gJGZpbGVuYW1lIHJdCisgICAgc2V0IGNvbnRlbnRzIFtyZWFkICRmaWxlXQorICAgIGNsb3NlICRmaWxlCisgICAgcmV0dXJuICRjb250ZW50cworfQorCitwcm9jIHZlcmJvc2VfZXZhbCB7IGV4cHIgeyBsZXZlbCAxIH0gfSB7CisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBpZiAkdmVyYm9zZT4kbGV2ZWwgdGhlbiB7IGV2YWwgdmVyYm9zZSAiJGV4cHIiICRsZXZlbCB9Cit9CisKKyMgVGhpcyBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gYW4gdW5yZWxlYXNlZCB2ZXJzaW9uIG9mIERlamFHbnUuICBPbmNlCisjIHRoYXQgdmVyc2lvbiBnZXRzIHJlbGVhc2VkLCBhbmQgaGFzIGJlZW4gb3V0IGluIHRoZSB3b3JsZCBmb3IgYSBmZXcKKyMgbW9udGhzIGF0IGxlYXN0LCBpdCBtYXkgYmUgc2FmZSB0byBkZWxldGUgdGhpcyBjb3B5LgoraWYgIVtzdHJpbmcgbGVuZ3RoIFtpbmZvIHByb2MgcHJ1bmVfd2FybmluZ3NdXSB7CisgICAgIworICAgICMgcHJ1bmVfd2FybmluZ3MgLS0gZGVsZXRlIHZhcmlvdXMgc3lzdGVtIHZlcmJvc2l0aWVzIGZyb20gVEVYVC4KKyAgICAjCisgICAgIyBBbiBleGFtcGxlIGlzOgorICAgICMgbGQuc286IHdhcm5pbmc6IC91c3IvbGliL2xpYmMuc28uMS44LjEgaGFzIG9sZGVyIHJldmlzaW9uIHRoYW4gZXhwZWN0ZWQgOQorICAgICMKKyAgICAjIFNpdGVzIHdpdGggcGFydGljdWxhciB2ZXJib3NlIG9zJ3MgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBpbiBzaXRlLmV4cC4KKyAgICAjCisgICAgcHJvYyBwcnVuZV93YXJuaW5ncyB7IHRleHQgfSB7CisJIyBUaGlzIGlzIGZyb20gc3VuNCdzLiAgRG8gaXQgZm9yIGFsbCBtYWNoaW5lcyBmb3Igbm93LgorCSMgVGhlICJcXDEiIGlzIHRvIHRyeSB0byBwcmVzZXJ2ZSBhICJcbiIgYnV0IG9ubHkgaWYgbmVjZXNzYXJ5LgorCXJlZ3N1YiAtYWxsICIoXnxcbikobGQuc286IHdhcm5pbmc6XFteXG5cXSpcbj8pKyIgJHRleHQgIlxcMSIgdGV4dAorCisJIyBJdCBtaWdodCBiZSB0ZW1wdGluZyB0byBnZXQgY2FycmllZCBhd2F5IGFuZCBkZWxldGUgYmxhbmsgbGluZXMsIGV0Yy4KKwkjIEp1c3QgZGVsZXRlICpleGFjdGx5KiB3aGF0IHdlJ3JlIGFzayB0bywgYW5kIHRoYXQncyBpdC4KKwlyZXR1cm4gJHRleHQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGcuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY3ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cApAQCAtMCwwICsxLDUzIEBACisjIERlZmluZSBnYXMgY2FsbGJhY2tzIGZvciBkZy5leHAuCisKK2xvYWRfbGliIGRnLmV4cAorCisjIFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBzdGlsbCBpbiBhIGJpdCBvZiBmbHV4LgorIyBJdCBzaG91bGQgYmUgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBhc3NlbWJsZSwgbGluaywgYW5kIHJ1biBhIGZpbGUKKyMgYnV0IHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHRoYXQuICBBc3NlbWJsZXIgdGVzdGNhc2VzIGFyZW4ndCB1c3VhbGx5CisjIHRoYXQgZWxhYm9yYXRlIGFueXdheS4gIDotKQorCitwcm9jIGdhcy1kZy10ZXN0IHsgcHJvZyBkb193aGF0IHRvb2xfZmxhZ3MgfSB7CisgICAgIyBGSVhNRTogdGhlIGdhcyB0ZXN0c3VpdGUgZG9lc24ndCBkZWZpbmUgdG1wZGlyLiAgVXNlIG91dGRpcj8KKyAgICBzZXQgb3V0cHV0X2ZpbGUgIi4vYS5vdXQiCisKKyAgICBzd2l0Y2ggJGRvX3doYXQgeworCSJwcmVwcm9jZXNzIiB7CisJfQorCSJhc3NlbWJsZSIgeworCX0KKwkibGluayIgeworCX0KKwkicnVuIiB7CisJICAgICMgVGhpcyBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYXJlIGlmIGFuIGV4ZWN1dGFibGUgd2FzCisJICAgICMgY3JlYXRlZCBvciBub3QuICBJZiBpdCB3YXMsIGRnLmV4cCB3aWxsIHRyeSB0byBydW4gaXQuCisJICAgIGNhdGNoICJleGVjIHJtIC1mICRvdXRwdXRfZmlsZSIKKwl9CisJZGVmYXVsdCB7CisJICAgIHBlcnJvciAiJGRvX3doYXQ6IG5vdCBhIHZhbGlkIGRnLWRvIGtleXdvcmQiCisJICAgIHJldHVybiAiIgorCX0KKyAgICB9CisKKyAgICAjIGdhc19zdGFydCBwcmVwZW5kcyAkc3JjZGlyLyRzdWJkaXIgc28gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBQUk9HCisgICAgIyBpZiBwcmVzZW50LiAgRmlyc3QgcmVtb3ZlIGV4dHJhbmVvdXMgLy8ncy4KKyAgICBnbG9iYWwgc3JjZGlyIHN1YmRpcgorICAgIHNldCBkaXIgIiRzcmNkaXIvJHN1YmRpciIKKyAgICByZWdzdWIgLWFsbCAiLy8iICRkaXIgIi8iIGRpcgorICAgIHJlZ3N1YiAtYWxsICIvLyIgJHByb2cgIi8iIHByb2cKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIkZGlyLyoiICRwcm9nXSB7CisJcmVnc3ViICIkZGlyIiAkcHJvZyAiIiBwcm9nCisgICAgfQorCisgICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZ2FzX3N0YXJ0IGJ1dCBpdCBkb2Vzbid0IHNldCBjb21wX291dHB1dC4KKyAgICByZXR1cm4gW2dhc19ydW4gJHByb2cgJHRvb2xfZmxhZ3MgIiJdCit9CisKK3Byb2MgZ2FzLWRnLXBydW5lIHsgc3lzdGVtIHRleHQgfSB7CisgICAgI3NlbmRfdXNlciAiQmVmb3JlOiR0ZXh0XG4iCisgICAgcmVnc3ViIC1hbGwgIihefFxuKVxbXlxuXF0qOiBBc3NlbWJsZXIgbWVzc2FnZXM6XFteXG5cXSoiICR0ZXh0ICIiIHRleHQKKyAgICByZWdzdWIgLWFsbCAiKF58XG4pXFteXG5cXSo6IEVuZCBvZiBmaWxlIG5vdCBhdCBlbmRcW15cblxdKk5ld2xpbmUgaW5zZXJ0ZWQuIiAkdGV4dCAiIiB0ZXh0CisgICAgI3NlbmRfdXNlciAiQWZ0ZXI6JHRleHRcbiIKKworICAgIHJldHVybiAkdGV4dAorfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuIGIvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0MTUwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvdGVzdHN1aXRlL2xpYi9ydW4KQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK2V2YWwgZXhlYyAkQApkaWZmIC0tZ2l0IGEvZ2FzL3Ztc2NvbmYuc2ggYi9nYXMvdm1zY29uZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTQ1MzhhCi0tLSAvZGV2L251bGwKKysrIGIvZ2FzL3Ztc2NvbmYuc2gKQEAgLTAsMCArMSwxMjggQEAKKyMhL2Jpbi9zaAorCitjYXQgPDwgJ0VPRicKKyQhbWFrZS1nYXMuY29tCiskISBTZXQgdGhlIGRlZiBkaXIgdG8gcHJvcGVyIHBsYWNlIGZvciB1c2UgaW4gYmF0Y2guIFdvcmtzIGZvciBpbnRlcmFjdGl2ZSB0by4KKyRmbG5tID0gZiRlbnZpcm9tZW50KCJQUk9DRURVUkUiKSAgICAgISBnZXQgY3VycmVudCBwcm9jZWR1cmUgbmFtZQorJHNldCBkZWZhdWx0ICdmJHBhcnNlKGZsbm0sLCwiREVWSUNFIiknJ2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScKKyR2ID0gJ2YkdmVyaWZ5KDApJworJCEKKyQhCUNvbW1hbmQgZmlsZSB0byBidWlsZCBhIEdOVSBhc3NlbWJsZXIgb24gVk1TCiskIQorJCEJSWYgeW91IGFyZSB1c2luZyBhIHZlcnNpb24gb2YgR0NDIHRoYXQgc3VwcG9ydHMgZ2xvYmFsIGNvbnN0YW50cworJCEJeW91IHNob3VsZCByZW1vdmUgdGhlIGRlZmluZT0iY29uc3Q9IiBmcm9tIHRoZSBnY2MgbGluZXMuCiskIQorJCEJQ2F1dGlvbjogIFZlcnNpb25zIDEuMzguMSBhbmQgZWFybGllciBoYWQgYSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mCiskIQlzb21lIHN0YXRpYyBjb25zdGFudHMuIElmIHlvdSBhcmUgdXNpbmcgc3VjaCBhIHZlcnNpb24gb2YgdGhlCiskIQlhc3NlbWJsZXIsIGFuZCB5b3Ugd2lzaCB0byBjb21waWxlIHdpdGhvdXQgdGhlICJjb25zdD0iIGhhY2ssCiskIQl5b3Ugc2hvdWxkIGZpcnN0IGJ1aWxkIHRoaXMgdmVyc2lvbiAqd2l0aCogdGhlICJjb25zdD0iCiskIQlkZWZpbml0aW9uLCBhbmQgdGhlbiB1c2UgdGhhdCBhc3NlbWJsZXIgdG8gcmVidWlsZCBpdCB3aXRob3V0IHRoZQorJCEJImNvbnN0PSIgZGVmaW5pdGlvbi4gIEZhaWx1cmUgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlbWJsZXIKKyQhCXRoYXQgd2lsbCBtdW5nIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KKyQhCiskIQlOb3RlOiBUaGUgdmVyc2lvbiBvZiBnYXMgc2hpcHBlZCBvbiB0aGUgR0NDIFZNUyB0YXBlcyBoYXMgYmVlbiBwYXRjaGVkCiskIQl0byBmaXggdGhlIGFib3ZlIG1lbnRpb25lZCBidWcuCiskIQorJAkhVGhlIGdjYy12bXMgZHJpdmVyIHdhcyBtb2RpZmllZCB0byB1c2UgYC0xJyBxdWl0ZSBzb21lIHRpbWUgYWdvLAorJAkhc28gZG9uJ3QgZWNobyB0aGlzIHRleHQgYW55IG1vcmUuLi4KKyQgIXdyaXRlIHN5cyRvdXRwdXQgIklmIHRoaXMgYXNzZW1ibGVyIGlzIGdvaW5nIHRvIGJlIHVzZWQgd2l0aCBHQ0MgMS5uLCB5b3UiCiskICF3cml0ZSBzeXMkb3V0cHV0ICJuZWVkIHRvIG1vZGlmeSB0aGUgZHJpdmVyIHRvIHN1cHBseSB0aGUgLTEgc3dpdGNoIHRvIGdhcy4iCiskICF3cml0ZSBzeXMkb3V0cHV0ICJUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb2YgYSBzbWFsbCBjaGFuZ2UgaW4gaG93IGdsb2JhbCIKKyQgIXdyaXRlIHN5cyRvdXRwdXQgImNvbnN0YW50IHZhcmlhYmxlcyBhcmUgaGFuZGxlZC4gIEZhaWx1cmUgdG8gaW5jbHVkZSB0aGlzIgorJCAhd3JpdGUgc3lzJG91dHB1dCAid2lsbCByZXN1bHQgaW4gbGlua2VyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgbWlzbWF0Y2hlZAorJCAhd3JpdGUgc3lzJG91dHB1dCAicHNlY3QgYXR0cmlidXRlcy4iCiskIQorJCBnYXNfaG9zdD0idm1zIgorJCBhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkJISB2YXg9PTEsIGFscGhhPT0yCiskIGFyY2ggPSBmJGVsZW1lbnQoYXJjaF9pbmR4LCJ8IiwifFZBWHxBbHBoYXwiKQorJCBpZiBhcmNoLmVxcy4iVkFYIgorJCB0aGVuCiskICBjcHVfdHlwZT0idmF4IgorJCAgb2JqX2Zvcm1hdD0idm1zIgorJCAgYXRvZj0idmF4IgorJCBlbHNlCiskICBjcHVfdHlwZT0iYWxwaGEiCiskICBvYmpfZm9ybWF0PSJldmF4IgorJCAgYXRvZj0iaWVlZSIKKyQgZW5kaWYKKyQgZW11bGF0aW9uPSJnZW5lcmljIgorJCEKKyQJQ09QWQk9ICJjb3B5L25vTG9nIgorJCEKKyQgQ19ERUZTIDo9IiIiVk1TIiIiCiskISBDX0RFRlMgOj0iIiJWTVMiIiIsIiIiY29uc3Q9IiIiCiskIENfSU5DTFVERVMJPSAiL0luY2x1ZGU9KFtdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLS5pbmNsdWRlLmFvdXRdKSIKKyQgQ19GTEFHUwk9ICIvbm9WZXJib3NlL0RlYnVnIiArIGNfaW5jbHVkZXMKKyQhCiskIQorJCBvbiBlcnJvciB0aGVuICBnb3RvIGJhaWwKKyQgaWYgZiRzZWFyY2goIlstLmxpYmliZXJ0eV1saWJlcnR5Lm9sYiIpLmVxcy4iIgorJCB0aGVuCUBbLS5saWJpYmVydHlddm1zYnVpbGQuY29tCiskCXdyaXRlIHN5cyRvdXRwdXQgIk5vdyBidWlsZGluZyBnYXMuIgorJCBlbmRpZgorJCBpZiAiJydwMSciIC5lcXMuICJMSU5LIiB0aGVuIGdvdG8gTGluaworJCEKKyQhICBUaGlzIGhlbHBzIGdjYyAxLm5uIGZpbmQgdGhlIGFvdXQvKiBmaWxlcy4KKyQhCiskIGFvdXRfZGV2ID0gZiRwYXJzZShmbG5tLCwsIkRFVklDRSIpCiskIHRtcCA9IGFvdXRfZGV2IC0gIjoiCiskaWYgZiR0cm5sbm0odG1wKS5uZXMuIiIgdGhlbiBhb3V0X2RldiA9IGYkdHJubG5tKHRtcCkKKyQgYW91dF9kaXIgPSBhb3V0X2RlditmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknIC0KKwktICJHQVNdIiArICJJTkNMVURFLkFPVVQuXSIgLSAiXVsiCiskYXNzaWduICdhb3V0X2RpcicgYW91dC90cmFuPWNvbmMKKyQgb3Bjb2RlX2RpciA9IGFvdXRfZGV2K2YkcGFyc2UoZmxubSwsLCJESVJFQ1RPUlkiKScgLQorCS0gIkdBU10iICsgIklOQ0xVREUuT1BDT0RFLl0iIC0gIl1bIgorJGFzc2lnbiAnb3Bjb2RlX2Rpcicgb3Bjb2RlL3RyYW49Y29uYworJCEKKyQgc2V0IHZlcmlmeQorJCEKKyQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W110Yy0nY3B1X3R5cGUnLm9iaiBbLmNvbmZpZ110Yy0nY3B1X3R5cGUnLmMKKyQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W11vYmotJ29ial9mb3JtYXQnLm9iaiBbLmNvbmZpZ11vYmotJ29ial9mb3JtYXQnLmMKKyQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W11hdG9mLSdhdG9mJy5vYmogWy5jb25maWddYXRvZi0nYXRvZicuYworRU9GCisKK2NmaWxlcz0iYGVjaG8gJCogfCBzZWQgLWUgJ3MvXC5vLy5jL2cnIC1lICdzIS4uL1woW14gL10qXCkvXChbXiAvXSpcLmNcKSFbLS5cMV1cMiFnJ2AiCisKK2ZvciBjZmlsZSBpbiAkY2ZpbGVzIDsgZG8KKyAgY2FzZSAkY2ZpbGUgaW4KKyAgICAiWy0uIiopCisJYmFzZT1gZWNobyAkY2ZpbGUgfCBzZWQgLWUgJ3MvXFsuKlxdLy8nIC1lICdzL1wuYyQvLydgCisJZWNobyAiXCQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKS9PYmplY3Q9W10kYmFzZS5vYmogJGNmaWxlIgorCTs7CisgICAgKikKKwllY2hvICJcJCBnY2MgJ2NfZmxhZ3MnL0RlZmluZT0oJ0NfREVGUycpICRjZmlsZSIKKwk7OworICBlc2FjCitkb25lCisKK2NhdCA8PCAnRU9GJworJGxpbms6CiskISdmJHZlcmlmeSgwKScKKyQgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKKyQgY3JlYXRlIGdjYy1hcy5vcHQKKyEKKyEJTGlua2VyIG9wdGlvbnMgZmlsZSBmb3IgR05VIGFzc2VtYmxlcgorIQorJCBvcGVuL0FwcGVuZCBpZmlsZSQgZ2NjLWFzLm9wdAorJCB3cml0ZSBpZmlsZSQgInRjLScnY3B1X3R5cGUnLm9iaiIKKyQgd3JpdGUgaWZpbGUkICJvYmotJydvYmpfZm9ybWF0Jy5vYmoiCiskIHdyaXRlIGlmaWxlJCAiYXRvZi0nJ2F0b2YnLm9iaiIKKyQgQ09QWSBzeXMkaW5wdXQ6IGlmaWxlJDoKK0VPRgorCitmb3Igb2JqIGluICQqIDsgZG8KKyAgIyBDaGFuZ2UgImZvby5vIiBpbnRvICJmb28ub2JqIi4KKyAgZWNobyAke29ian1iaiwtIHwgc2VkICdzIS4qLyEhZycKK2RvbmUKKworY2F0IDw8ICdFT0YnCitbLS5saWJpYmVydHldbGliZXJ0eS5vbGIvTGliCitnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWIKKyEgVGVsbCBsaW5rZXIgZXhhY3RseSB3aGF0IHBzZWN0IGF0dHJpYnV0ZXMgd2Ugd2FudCAtLSBtYXRjaCBWQVhDUlRMLgorcHNlY3RfYXR0cj1FTlZJUk9OLGxvbmcscGljLG92cixyZWwsZ2JsLG5vc2hyLG5vZXhlLHJkLHdydAorJCBjbG9zZSBpZmlsZSQKKyQgc2V0IHZlcmlmeT0oUHJvYyxub0ltYWcpCiskIGxpbmsvbm9NYXAvRXhlYz1nY2MtYXMuZXhlIGdjYy1hcy5vcHQvT3B0LHZlcnNpb24ub3B0L09wdAorJCEKKyRiYWlsOiBleGl0ICRzdGF0dXMgKyAwKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCitFT0YKZGlmZiAtLWdpdCBhL2dhcy93cml0ZS5jIGIvZ2FzL3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlNmUxMAotLS0gL2Rldi9udWxsCisrKyBiL2dhcy93cml0ZS5jCkBAIC0wLDAgKzEsMjg4NCBAQAorLyogd3JpdGUuYyAtIGVtaXQgLm8gZmlsZQorICAgQ29weXJpZ2h0IChDKSAxOTg2LCA4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKworICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyB0aGluZyBzaG91bGQgYmUgc2V0IHVwIHRvIGRvIGJ5dGVvcmRlcmluZyBjb3JyZWN0bHkuICBCdXQuLi4gKi8KKworI2luY2x1ZGUgImFzLmgiCisjaW5jbHVkZSAic3Vic2Vncy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgorCisvKiBUaGlzIGxvb2tzIGxpa2UgYSBnb29kIGlkZWEuICBMZXQncyB0cnkgdHVybmluZyBpdCBvbiBhbHdheXMsIGZvciBub3cuICAqLworI3VuZGVmICBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKKyNkZWZpbmUgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCisKKy8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuICBGaWxsIGl0IHdpdGggYSBub3AKKyAgIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCBjaG9rZSBvbiBpdC4gICovCisjaWZuZGVmIE5PUF9PUENPREUKKyNkZWZpbmUgTk9QX09QQ09ERSAweDAwCisjZW5kaWYKKworI2lmbmRlZiBUQ19BREpVU1RfUkVMT0NfQ09VTlQKKyNkZWZpbmUgVENfQURKVVNUX1JFTE9DX0NPVU5UKEZJWFAsQ09VTlQpCisjZW5kaWYKKworI2lmbmRlZiBUQ19GT1JDRV9SRUxPQ0FUSU9OCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgMAorI2VuZGlmCisKKyNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OCisjZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTihGSVhQLFNFRykgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQorI2VuZGlmCisKKyNpZm5kZWYJTURfUENSRUxfRlJPTV9TRUNUSU9OCisjZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb20oRklYUCkKKyNlbmRpZgorCisjaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKK2V4dGVybiBDT05TVCBpbnQgbWRfc2hvcnRfanVtcF9zaXplOworZXh0ZXJuIENPTlNUIGludCBtZF9sb25nX2p1bXBfc2l6ZTsKKyNlbmRpZgorCitpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKK3ZvaWQgcHJpbnRfZml4dXAgUEFSQU1TICgoZml4UyAqKSk7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitzdGF0aWMgdm9pZCByZW51bWJlcl9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKKy8qIFdlIGdlbmVyYWxseSBhdHRhY2ggcmVsb2NzIHRvIGZyYWcgY2hhaW5zLiAgSG93ZXZlciwgYWZ0ZXIgd2UgaGF2ZQorICAgY2hhaW5lZCB0aGVzZSBhbGwgdG9nZXRoZXIgaW50byBhIHNlZ21lbnQsIGFueSByZWxvY3Mgd2UgYWRkIGFmdGVyCisgICB0aGF0IG11c3QgYmUgYXR0YWNoZWQgdG8gYSBzZWdtZW50LiAgVGhpcyB3aWxsIGluY2x1ZGUgcmVsb2NzIGFkZGVkCisgICBpbiBtZF9lc3RpbWF0ZV9zaXplX2Zvcl9yZWxheCwgZm9yIGV4YW1wbGUuICAqLworc3RhdGljIGludCBmcmFnc19jaGFpbmVkID0gMDsKKyNlbmRpZgorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKworI2lmbmRlZiBNQU5ZX1NFR01FTlRTCitzdHJ1Y3QgZnJhZyAqdGV4dF9mcmFnX3Jvb3Q7CitzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7CitzdHJ1Y3QgZnJhZyAqYnNzX2ZyYWdfcm9vdDsKKworc3RydWN0IGZyYWcgKnRleHRfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KK3N0cnVjdCBmcmFnICpkYXRhX2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCitzdGF0aWMgc3RydWN0IGZyYWcgKmJzc19sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLworI2VuZGlmCisKKyNpZm5kZWYgQkZECitzdGF0aWMgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKKyNlbmRpZgorCitsb25nIHN0cmluZ19ieXRlX2NvdW50OworY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsJLyogVHJhY2tzIG9iamVjdCBmaWxlIGJ5dGVzLiAqLworCisjaWZuZGVmIE9CSl9WTVMKK2ludCBtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlID0gREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFOworI2VuZGlmCisKKyNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCisKK3N0YXRpYyBpbnQgbl9maXh1cHM7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitzdGF0aWMgZml4UyAqZml4X25ld19pbnRlcm5hbCBQQVJBTVMgKChmcmFnUyAqLCBpbnQgd2hlcmUsIGludCBzaXplLAorCQkJCSAgICAgICBzeW1ib2xTICphZGQsIHN5bWJvbFMgKnN1YiwKKwkJCQkgICAgICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwKKwkJCQkgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOworI2Vsc2UKK3N0YXRpYyBmaXhTICpmaXhfbmV3X2ludGVybmFsIFBBUkFNUyAoKGZyYWdTICosIGludCB3aGVyZSwgaW50IHNpemUsCisJCQkJICAgICAgIHN5bWJvbFMgKmFkZCwgc3ltYm9sUyAqc3ViLAorCQkJCSAgICAgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLAorCQkJCSAgICAgICBpbnQgcl90eXBlKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKQorc3RhdGljIGxvbmcgZml4dXBfc2VnbWVudCBQQVJBTVMgKChmaXhTICogZml4UCwgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZSkpOworI2VuZGlmCitzdGF0aWMgcmVsYXhfYWRkcmVzc1QgcmVsYXhfYWxpZ24gUEFSQU1TICgocmVsYXhfYWRkcmVzc1QgYWRkciwgaW50IGFsaWduKSk7CisjaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChCRkQpCitzdGF0aWMgZnJhZ1MgKmNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgUEFSQU1TICgoc2VnVCwgc3RydWN0IGZyY2hhaW4gKikpOworI2VuZGlmCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorc3RhdGljIHZvaWQgY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOworc3RhdGljIHZvaWQgY3Z0X2ZyYWdfdG9fZmlsbCBQQVJBTVMgKChzZWdULCBmcmFnUyAqKSk7CitzdGF0aWMgdm9pZCByZWxheF9hbmRfc2l6ZV9zZWcgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIHZvaWQgYWRqdXN0X3JlbG9jX3N5bXMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIHZvaWQgd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIHdyaXRlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIHNldF9zeW10YWIgUEFSQU1TICgodm9pZCkpOworI2VuZGlmCisjaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCEgZGVmaW5lZCAoQkZEKSAmJiAhIGRlZmluZWQgKE9CSl9BT1VUKSkKK3N0YXRpYyB2b2lkIG1lcmdlX2RhdGFfaW50b190ZXh0IFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgISBkZWZpbmVkIChCRkQpCitzdGF0aWMgdm9pZCBjdnRfZnJhZ190b19maWxsIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICosIHNlZ1QsIGZyYWdTICopKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9zdWJzZWdzIFBBUkFNUyAoKGZyY2hhaW5TICosIGludCwgZnJhZ1MgKiosIGZyYWdTICoqKSk7CitzdGF0aWMgdm9pZCByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgUEFSQU1TICgodm9pZCkpOworI2VuZGlmCisKKy8qCisgKgkJCWZpeF9uZXcoKQorICoKKyAqIENyZWF0ZSBhIGZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgorICovCitzdGF0aWMgZml4UyAqCitmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgc3ViX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKKwkJICByX3R5cGUpCisgICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KKyAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KKyAgICAgaW50IHNpemU7CQkJLyogMSwgMiwgb3IgNCB1c3VhbGx5LiAqLworICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCisgICAgIHN5bWJvbFMgKnN1Yl9zeW1ib2w7CS8qIFhfb3Bfc3ltYm9sLiAqLworICAgICBvZmZzZXRUIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KKyAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLworI2Vsc2UKKyAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLworI2VuZGlmCit7CisgIGZpeFMgKmZpeFA7CisKKyAgbl9maXh1cHMrKzsKKworICBmaXhQID0gKGZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGZpeFMpKTsKKworICBmaXhQLT5meF9mcmFnID0gZnJhZzsKKyAgZml4UC0+Znhfd2hlcmUgPSB3aGVyZTsKKyAgZml4UC0+Znhfc2l6ZSA9IHNpemU7CisgIC8qIFdlJ3ZlIG1hZGUgZnhfc2l6ZSBhIG5hcnJvdyBmaWVsZDsgY2hlY2sgdGhhdCBpdCdzIHdpZGUgZW5vdWdoLiAgKi8KKyAgaWYgKGZpeFAtPmZ4X3NpemUgIT0gc2l6ZSkKKyAgICB7CisgICAgICBhc19iYWQgKF8oImZpZWxkIGZ4X3NpemUgdG9vIHNtYWxsIHRvIGhvbGQgJWQiKSwgc2l6ZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbDsKKyAgZml4UC0+Znhfc3Vic3kgPSBzdWJfc3ltYm9sOworICBmaXhQLT5meF9vZmZzZXQgPSBvZmZzZXQ7CisgIGZpeFAtPmZ4X3BjcmVsID0gcGNyZWw7CisgIGZpeFAtPmZ4X3BsdCA9IDA7CisjaWYgZGVmaW5lZChORUVEX0ZYX1JfVFlQRSkgfHwgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKKyAgZml4UC0+Znhfcl90eXBlID0gcl90eXBlOworI2VuZGlmCisgIGZpeFAtPmZ4X2ltX2Rpc3AgPSAwOworICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAwOworICBmaXhQLT5meF9iaXRfZml4UCA9IDA7CisgIGZpeFAtPmZ4X2FkZG51bWJlciA9IDA7CisgIGZpeFAtPmZ4X3RjYml0ID0gMDsKKyAgZml4UC0+ZnhfZG9uZSA9IDA7CisgIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMDsKKyAgZml4UC0+Znhfc2lnbmVkID0gMDsKKworI2lmZGVmIFVTSU5HX0NHRU4KKyAgZml4UC0+ZnhfY2dlbi5pbnNuID0gTlVMTDsKKyAgZml4UC0+ZnhfY2dlbi5vcGluZm8gPSAwOworI2VuZGlmCisKKyNpZmRlZiBUQ19GSVhfVFlQRQorICBUQ19JTklUX0ZJWF9EQVRBKGZpeFApOworI2VuZGlmCisKKyAgYXNfd2hlcmUgKCZmaXhQLT5meF9maWxlLCAmZml4UC0+ZnhfbGluZSk7CisKKyAgLyogVXN1YWxseSwgd2Ugd2FudCByZWxvY3Mgc29ydGVkIG51bWVyaWNhbGx5LCBidXQgd2hpbGUKKyAgICAgY29tcGFyaW5nIHRvIG9sZGVyIHZlcnNpb25zIG9mIGdhcyB0aGF0IGhhdmUgcmVsb2NzCisgICAgIHJldmVyc2Ugc29ydGVkLCBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgdGhpcyBjb21waWxlCisgICAgIHRpbWUgb3B0aW9uLiAgeG94b3JpY2guICovCisKKyAgeworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgIGZpeFMgKipzZWdfZml4X3Jvb3RQID0gKGZyYWdzX2NoYWluZWQKKwkJCSAgICA/ICZzZWdfaW5mbyAobm93X3NlZyktPmZpeF9yb290CisJCQkgICAgOiAmZnJjaGFpbl9ub3ctPmZpeF9yb290KTsKKyAgICBmaXhTICoqc2VnX2ZpeF90YWlsUCA9IChmcmFnc19jaGFpbmVkCisJCQkgICAgPyAmc2VnX2luZm8gKG5vd19zZWcpLT5maXhfdGFpbAorCQkJICAgIDogJmZyY2hhaW5fbm93LT5maXhfdGFpbCk7CisjZW5kaWYKKworI2lmZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKKworICAgIGZpeFAtPmZ4X25leHQgPSAqc2VnX2ZpeF9yb290UDsKKyAgICAqc2VnX2ZpeF9yb290UCA9IGZpeFA7CisKKyNlbHNlIC8qIFJFVkVSU0VfU09SVF9SRUxPQ1MgKi8KKworICAgIGZpeFAtPmZ4X25leHQgPSBOVUxMOworCisgICAgaWYgKCpzZWdfZml4X3RhaWxQKQorICAgICAgKCpzZWdfZml4X3RhaWxQKS0+ZnhfbmV4dCA9IGZpeFA7CisgICAgZWxzZQorICAgICAgKnNlZ19maXhfcm9vdFAgPSBmaXhQOworICAgICpzZWdfZml4X3RhaWxQID0gZml4UDsKKworI2VuZGlmIC8qIFJFVkVSU0VfU09SVF9SRUxPQ1MgKi8KKworICB9CisKKyAgcmV0dXJuIGZpeFA7Cit9CisKKy8qIENyZWF0ZSBhIGZpeHVwIHJlbGF0aXZlIHRvIGEgc3ltYm9sIChwbHVzIGEgY29uc3RhbnQpLiAgKi8KKworZml4UyAqCitmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwgcl90eXBlKQorICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCisgICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCisgICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KKyAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLworICAgICBvZmZzZXRUIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KKyAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLworI2Vsc2UKKyAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLworI2VuZGlmCit7CisgIHJldHVybiBmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKKwkJCSAgIChzeW1ib2xTICopIE5VTEwsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSk7Cit9CisKKy8qIENyZWF0ZSBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBmaXh1cHMKKyAgIGZvciBkaWZmZXJlbmNlIGV4cHJlc3Npb25zLiAgVGhhdCBpcyBpdHNlbGYgbW9yZSB0aGFuIG1vc3Qgb2JqZWN0CisgICBmaWxlIGZvcm1hdHMgc3VwcG9ydCBhbnlob3cuICAqLworCitmaXhTICoKK2ZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKQorICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCisgICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCisgICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KKyAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICAqLworICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsgLyogUmVsb2NhdGlvbiB0eXBlICovCisjZWxzZQorICAgICBpbnQgcl90eXBlOwkJLyogUmVsb2NhdGlvbiB0eXBlICovCisjZW5kaWYKK3sKKyAgc3ltYm9sUyAqYWRkID0gTlVMTDsKKyAgc3ltYm9sUyAqc3ViID0gTlVMTDsKKyAgb2Zmc2V0VCBvZmYgPSAwOworCisgIHN3aXRjaCAoZXhwLT5YX29wKQorICAgIHsKKyAgICBjYXNlIE9fYWJzZW50OgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9fYWRkOgorICAgICAgLyogVGhpcyBjb21lcyB1cCB3aGVuIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXysoLi1MMCkgaXMgcmVhZCwgaWYKKwkgdGhlIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiBjYW5ub3QgaW1tZWRpYXRlbHkgYmUgcmVkdWNlZC4gICovCisgICAgICB7CisJc3ltYm9sUyAqc3RtcCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cCk7CisJZXhwLT5YX29wID0gT19zeW1ib2w7CisJZXhwLT5YX29wX3N5bWJvbCA9IDA7CisJZXhwLT5YX2FkZF9zeW1ib2wgPSBzdG1wOworCWV4cC0+WF9hZGRfbnVtYmVyID0gMDsKKwlyZXR1cm4gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpOworICAgICAgfQorCisgICAgY2FzZSBPX3N5bWJvbF9ydmE6CisgICAgICBhZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKKyAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOworCisjaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKQorICAgICAgcl90eXBlID0gQkZEX1JFTE9DX1JWQTsKKyNlbHNlCisjaWYgZGVmaW5lZChUQ19SVkFfUkVMT0MpCisgICAgICByX3R5cGUgPSBUQ19SVkFfUkVMT0M7CisjZWxzZQorICAgICAgYXNfZmF0YWwoXygicnZhIG5vdCBzdXBwb3J0ZWQiKSk7CisjZW5kaWYKKyNlbmRpZgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9fdW1pbnVzOgorICAgICAgc3ViID0gZXhwLT5YX2FkZF9zeW1ib2w7CisgICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPX3N1YnRyYWN0OgorICAgICAgc3ViID0gZXhwLT5YX29wX3N5bWJvbDsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSBPX3N5bWJvbDoKKyAgICAgIGFkZCA9IGV4cC0+WF9hZGRfc3ltYm9sOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgICovCisgICAgY2FzZSBPX2NvbnN0YW50OgorICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhZGQgPSBtYWtlX2V4cHJfc3ltYm9sIChleHApOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkLCBzdWIsIG9mZiwKKwkJCSAgIHBjcmVsLCByX3R5cGUpOworfQorCisvKiBBcHBlbmQgYSBzdHJpbmcgb250byBhbm90aGVyIHN0cmluZywgYnVtcGluZyB0aGUgcG9pbnRlciBhbG9uZy4gICovCit2b2lkCithcHBlbmQgKGNoYXJQUCwgZnJvbVAsIGxlbmd0aCkKKyAgICAgY2hhciAqKmNoYXJQUDsKKyAgICAgY2hhciAqZnJvbVA7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworeworICAvKiBEb24ndCB0cnVzdCBtZW1jcHkoKSBvZiAwIGNoYXJzLiAqLworICBpZiAobGVuZ3RoID09IDApCisgICAgcmV0dXJuOworCisgIG1lbWNweSAoKmNoYXJQUCwgZnJvbVAsIGxlbmd0aCk7CisgICpjaGFyUFAgKz0gbGVuZ3RoOworfQorCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKK2ludCBzZWN0aW9uX2FsaWdubWVudFtTRUdfTUFYSU1VTV9PUkRJTkFMXTsKKyNlbmRpZgorCisvKgorICogVGhpcyByb3V0aW5lIHJlY29yZHMgdGhlIGxhcmdlc3QgYWxpZ25tZW50IHNlZW4gZm9yIGVhY2ggc2VnbWVudC4KKyAqIElmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQgaXMgYWxpZ25lZCBvbiB0aGUgd29yc3QtY2FzZQorICogYm91bmRhcnksIGFsbCBvZiB0aGUgb3RoZXIgYWxpZ25tZW50cyB3aXRoaW4gaXQgd2lsbCB3b3JrLiAgQXQKKyAqIGxlYXN0IG9uZSBvYmplY3QgZm9ybWF0IHJlYWxseSB1c2VzIHRoaXMgaW5mby4KKyAqLwordm9pZAorcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbikKKyAgICAgLyogU2VnbWVudCB0byB3aGljaCBhbGlnbm1lbnQgcGVydGFpbnMgKi8KKyAgICAgc2VnVCBzZWc7CisgICAgIC8qIEFsaWdubWVudCwgYXMgYSBwb3dlciBvZiAyIChlLmcuLCAxID0+IDItYnl0ZSBib3VuZGFyeSwgMiA9PiA0LWJ5dGUKKwlib3VuZGFyeSwgZXRjLikgICovCisgICAgIGludCBhbGlnbjsKK3sKKyAgaWYgKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorICAgIHJldHVybjsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIGlmICgodW5zaWduZWQgaW50KSBhbGlnbiA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkKKyAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgYWxpZ24pOworI2Vsc2UKKyAgaWYgKGFsaWduID4gc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkKKyAgICBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddID0gYWxpZ247CisjZW5kaWYKK30KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKworLyogUmVzZXQgdGhlIHNlY3Rpb24gaW5kaWNlcyBhZnRlciByZW1vdmluZyB0aGUgZ2FzIGNyZWF0ZWQgc2VjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorcmVudW1iZXJfc2VjdGlvbnMgKGFiZmQsIHNlYywgY291bnRwYXJnKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBjb3VudHBhcmc7Cit7CisgIGludCAqY291bnRwID0gKGludCAqKSBjb3VudHBhcmc7CisKKyAgc2VjLT5pbmRleCA9ICpjb3VudHA7CisgICsrKmNvdW50cDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICovCisKKyNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKEJGRCkKKworc3RhdGljIGZyYWdTICoKK2NoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlY3Rpb24sIGZyY2hwKQorICAgICBzZWdUIHNlY3Rpb247CisgICAgIHN0cnVjdCBmcmNoYWluICpmcmNocDsKK3sKKyAgZnJhZ1MgZHVtbXksICpwcmV2X2ZyYWcgPSAmZHVtbXk7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICBmaXhTIGZpeF9kdW1teSwgKnByZXZfZml4ID0gJmZpeF9kdW1teTsKKyNlbmRpZgorCisgIGZvciAoOyBmcmNocCAmJiBmcmNocC0+ZnJjaF9zZWcgPT0gc2VjdGlvbjsgZnJjaHAgPSBmcmNocC0+ZnJjaF9uZXh0KQorICAgIHsKKyAgICAgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGZyY2hwLT5mcmNoX3Jvb3Q7CisgICAgICBwcmV2X2ZyYWcgPSBmcmNocC0+ZnJjaF9sYXN0OworICAgICAgYXNzZXJ0IChwcmV2X2ZyYWctPmZyX3R5cGUgIT0gMCk7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorICAgICAgaWYgKGZyY2hwLT5maXhfcm9vdCAhPSAoZml4UyAqKSBOVUxMKQorCXsKKwkgIGlmIChzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF9yb290ID09IChmaXhTICopIE5VTEwpCisJICAgIHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3Jvb3QgPSBmcmNocC0+Zml4X3Jvb3Q7CisJICBwcmV2X2ZpeC0+ZnhfbmV4dCA9IGZyY2hwLT5maXhfcm9vdDsKKwkgIHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3RhaWwgPSBmcmNocC0+Zml4X3RhaWw7CisJICBwcmV2X2ZpeCA9IGZyY2hwLT5maXhfdGFpbDsKKwl9CisjZW5kaWYKKyAgICB9CisgIGFzc2VydCAocHJldl9mcmFnLT5mcl90eXBlICE9IDApOworICBwcmV2X2ZyYWctPmZyX25leHQgPSAwOworICByZXR1cm4gcHJldl9mcmFnOworfQorCisjZW5kaWYKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKworc3RhdGljIHZvaWQKK2NoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyIChhYmZkLCBzZWN0aW9uLCB4eHgpCisgICAgIGJmZCAqYWJmZDsJCQkvKiB1bnVzZWQgKi8KKyAgICAgc2VnVCBzZWN0aW9uOworICAgICBQVFIgeHh4OwkJCS8qIHVudXNlZCAqLworeworICBzZWdtZW50X2luZm9fdHlwZSAqaW5mbzsKKworICAvKiBCRkQgbWF5IGhhdmUgaW50cm9kdWNlZCBpdHMgb3duIHNlY3Rpb25zIHdpdGhvdXQgdXNpbmcKKyAgICAgc3Vic2VnX25ldywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBzZWdfaW5mbyBpcyBOVUxMLiAgKi8KKyAgaW5mbyA9IHNlZ19pbmZvIChzZWN0aW9uKTsKKyAgaWYgKGluZm8gIT0gKHNlZ21lbnRfaW5mb190eXBlICopIE5VTEwpCisgICBpbmZvLT5mcmNoYWluUC0+ZnJjaF9sYXN0CisgICAgID0gY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VjdGlvbiwgaW5mby0+ZnJjaGFpblApOworCisgIC8qIE5vdyB0aGF0IHdlJ3ZlIGNoYWluZWQgdGhlIGZyYWdzIHRvZ2V0aGVyLCB3ZSBtdXN0IGFkZCBuZXcgZml4dXBzCisgICAgIHRvIHRoZSBzZWdtZW50LCBub3QgdG8gdGhlIGZyYWcgY2hhaW4uICAqLworICBmcmFnc19jaGFpbmVkID0gMTsKK30KKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKKworc3RhdGljIHZvaWQKK3JlbW92ZV9zdWJzZWdzIChoZWFkLCBzZWcsIHJvb3QsIGxhc3QpCisgICAgIGZyY2hhaW5TICpoZWFkOworICAgICBpbnQgc2VnOworICAgICBmcmFnUyAqKnJvb3Q7CisgICAgIGZyYWdTICoqbGFzdDsKK3sKKyAgKnJvb3QgPSBoZWFkLT5mcmNoX3Jvb3Q7CisgICpsYXN0ID0gY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VnLCBoZWFkKTsKK30KKworI2VuZGlmIC8qIEJGRCAqLworCisjaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKK3N0YXRpYyB2b2lkCitjdnRfZnJhZ190b19maWxsIChzZWMsIGZyYWdQKQorICAgICBzZWdUIHNlYzsKKyAgICAgZnJhZ1MgKmZyYWdQOworI2Vsc2UKK3N0YXRpYyB2b2lkCitjdnRfZnJhZ190b19maWxsIChoZWFkZXJzUCwgc2VjLCBmcmFnUCkKKyAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnNQOworICAgICBzZWdUIHNlYzsKKyAgICAgZnJhZ1MgKmZyYWdQOworI2VuZGlmCit7CisgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCisgICAgeworICAgIGNhc2UgcnNfYWxpZ246CisgICAgY2FzZSByc19hbGlnbl9jb2RlOgorICAgIGNhc2UgcnNfb3JnOgorICAgIGNhc2UgcnNfc3BhY2U6CisjaWZkZWYgSEFORExFX0FMSUdOCisgICAgICBIQU5ETEVfQUxJR04gKGZyYWdQKTsKKyNlbmRpZgorICAgICAga25vdyAoZnJhZ1AtPmZyX25leHQgIT0gTlVMTCk7CisgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCisJCQkgIC0gZnJhZ1AtPmZyX2FkZHJlc3MKKwkJCSAgLSBmcmFnUC0+ZnJfZml4KSAvIGZyYWdQLT5mcl92YXI7CisgICAgICBpZiAoZnJhZ1AtPmZyX29mZnNldCA8IDApCisJeworCSAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIC5vcmcvLnNwYWNlIGJhY2t3YXJkcz8gKCVsZCkiKSwKKwkJICAobG9uZykgZnJhZ1AtPmZyX29mZnNldCk7CisJfQorICAgICAgZnJhZ1AtPmZyX3R5cGUgPSByc19maWxsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHJzX2ZpbGw6CisgICAgICBicmVhazsKKworICAgIGNhc2UgcnNfbGViMTI4OgorICAgICAgeworCXZhbHVlVCB2YWx1ZSA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBvdXRwdXRfbGViMTI4IChmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsIHZhbHVlLAorCQkJICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUpOworCisJZnJhZ1AtPmZyX2ZpeCArPSBzaXplOworCWZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKKwlmcmFnUC0+ZnJfdmFyID0gMDsKKwlmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKKwlmcmFnUC0+ZnJfc3ltYm9sID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSByc19jZmE6CisgICAgICBlaF9mcmFtZV9jb252ZXJ0X2ZyYWcgKGZyYWdQKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgICAgICBtZF9jb252ZXJ0X2ZyYWcgKHN0ZG91dHB1dCwgc2VjLCBmcmFnUCk7CisjZWxzZQorICAgICAgbWRfY29udmVydF9mcmFnIChoZWFkZXJzUCwgc2VjLCBmcmFnUCk7CisjZW5kaWYKKworICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfbmV4dCA9PSBOVUxMCisJICAgICAgfHwgKChvZmZzZXRUKSAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnUC0+ZnJfYWRkcmVzcykKKwkJICA9PSBmcmFnUC0+ZnJfZml4KSk7CisKKyAgICAgIC8qCisgICAgICAgKiBBZnRlciBtZF9jb252ZXJ0X2ZyYWcsIHdlIG1ha2UgdGhlIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCisgICAgICAgKiBNZF9jb252ZXJ0X2ZyYWcoKSBzaG91bGQgc2V0IHVwIGFueSBmaXhTcyBhbmQgY29uc3RhbnRzCisgICAgICAgKiByZXF1aXJlZC4KKyAgICAgICAqLworICAgICAgZnJhZ193YW5lIChmcmFnUCk7CisgICAgICBicmVhazsKKworI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECisgICAgY2FzZSByc19icm9rZW5fd29yZDoKKyAgICAgIHsKKwlzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKKworCWlmIChmcmFnUC0+ZnJfc3VidHlwZSkKKwkgIHsKKwkgICAgZnJhZ1AtPmZyX2ZpeCArPSBtZF9zaG9ydF9qdW1wX3NpemU7CisJICAgIGZvciAobGllID0gKHN0cnVjdCBicm9rZW5fd29yZCAqKSAoZnJhZ1AtPmZyX3N5bWJvbCk7CisJCSBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsKKwkJIGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKKwkgICAgICBpZiAobGllLT5hZGRlZCA9PSAxKQorCQlmcmFnUC0+ZnJfZml4ICs9IG1kX2xvbmdfanVtcF9zaXplOworCSAgfQorCWZyYWdfd2FuZSAoZnJhZ1ApOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisjZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkgKi8KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKK3N0YXRpYyB2b2lkCityZWxheF9hbmRfc2l6ZV9zZWcgKGFiZmQsIHNlYywgeHh4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiB4eHg7Cit7CisgIGZsYWd3b3JkIGZsYWdzOworICBmcmFnUyAqZnJhZ3A7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOworICBpbnQgeDsKKyAgdmFsdWVUIHNpemUsIG5ld3NpemU7CisKKyAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKKworICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKKworICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7CisgIGlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZyY2hhaW5QKQorICAgIHsKKyAgICAgIHJlbGF4X3NlZ21lbnQgKHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3QsIHNlYyk7CisgICAgICBmb3IgKGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsgZnJhZ3A7IGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCisJY3Z0X2ZyYWdfdG9fZmlsbCAoc2VjLCBmcmFncCk7CisgICAgICBmb3IgKGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKKwkgICBmcmFncC0+ZnJfbmV4dDsKKwkgICBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQorCS8qIHdhbGsgdG8gbGFzdCBlbHQgKi87CisgICAgICBzaXplID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OworICAgIH0KKyAgZWxzZQorICAgIHNpemUgPSAwOworCisgIGlmIChzaXplID4gMCAmJiAhIHNlZ2luZm8tPmJzcykKKyAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOworCisgIC8qIEBAIFRoaXMgaXMganVzdCBhbiBhcHByb3hpbWF0aW9uLiAgKi8KKyAgaWYgKHNlZ2luZm8gJiYgc2VnaW5mby0+Zml4X3Jvb3QpCisgICAgZmxhZ3MgfD0gU0VDX1JFTE9DOworICBlbHNlCisgICAgZmxhZ3MgJj0gflNFQ19SRUxPQzsKKyAgeCA9IGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncyk7CisgIGFzc2VydCAoeCA9PSB0cnVlKTsKKworICBuZXdzaXplID0gbWRfc2VjdGlvbl9hbGlnbiAoc2VjLCBzaXplKTsKKyAgeCA9IGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIG5ld3NpemUpOworICBhc3NlcnQgKHggPT0gdHJ1ZSk7CisKKyAgLyogSWYgdGhlIHNpemUgaGFkIHRvIGJlIHJvdW5kZWQgdXAsIGFkZCBzb21lIHBhZGRpbmcgaW4gdGhlIGxhc3QKKyAgICAgbm9uLWVtcHR5IGZyYWcuICAqLworICBhc3NlcnQgKG5ld3NpemUgPj0gc2l6ZSk7CisgIGlmIChzaXplICE9IG5ld3NpemUpCisgICAgeworICAgICAgZnJhZ1MgKmxhc3QgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9sYXN0OworICAgICAgZnJhZ3AgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OworICAgICAgd2hpbGUgKGZyYWdwLT5mcl9uZXh0ICE9IGxhc3QpCisJZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKKyAgICAgIGxhc3QtPmZyX2FkZHJlc3MgPSBzaXplOworICAgICAgZnJhZ3AtPmZyX29mZnNldCArPSBuZXdzaXplIC0gc2l6ZTsKKyAgICB9CisKKyNpZmRlZiB0Y19mcm9iX3NlY3Rpb24KKyAgdGNfZnJvYl9zZWN0aW9uIChzZWMpOworI2VuZGlmCisjaWZkZWYgb2JqX2Zyb2Jfc2VjdGlvbgorICBvYmpfZnJvYl9zZWN0aW9uIChzZWMpOworI2VuZGlmCit9CisKKyNpZmRlZiBERUJVRzIKK3N0YXRpYyB2b2lkCitkdW1wX3NlY3Rpb25fcmVsb2NzIChhYmZkLCBzZWMsIHN0cmVhbV8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgY2hhciAqc3RyZWFtXzsKK3sKKyAgRklMRSAqc3RyZWFtID0gKEZJTEUgKikgc3RyZWFtXzsKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKKyAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OworCisgIGlmICghZml4cCkKKyAgICByZXR1cm47CisKKyAgZnByaW50ZiAoc3RyZWFtLCAic2VjICVzIHJlbG9jczpcbiIsIHNlYy0+bmFtZSk7CisgIHdoaWxlIChmaXhwKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKnMgPSBmaXhwLT5meF9hZGRzeTsKKyAgICAgIGlmIChzKQorCXsKKwkgIGZwcmludGYgKHN0cmVhbSwgIiAgJTA4eDogJXMoJXMiLCBmaXhwLCBTX0dFVF9OQU1FIChzKSwKKwkJICAgcy0+YnN5bS0+c2VjdGlvbi0+bmFtZSk7CisJICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdHJlYW0sICIgc2VjdGlvbiBzeW0iKTsKKwkgICAgICBpZiAoU19HRVRfVkFMVUUgKHMpKQorCQlmcHJpbnRmIChzdHJlYW0sICIrJXgiLCBTX0dFVF9WQUxVRSAocykpOworCSAgICB9CisJICBlbHNlCisJICAgIGZwcmludGYgKHN0cmVhbSwgIisleCIsIFNfR0VUX1ZBTFVFIChzKSk7CisJICBmcHJpbnRmIChzdHJlYW0sICIpKyV4XG4iLCBmaXhwLT5meF9vZmZzZXQpOworCX0KKyAgICAgIGVsc2UKKwlmcHJpbnRmIChzdHJlYW0sICIgICUwOHg6IHR5cGUgJWQgbm8gc3ltXG4iLCBmaXhwLCBmaXhwLT5meF9yX3R5cGUpOworICAgICAgZml4cCA9IGZpeHAtPmZ4X25leHQ7CisgICAgfQorfQorI2Vsc2UKKyNkZWZpbmUgZHVtcF9zZWN0aW9uX3JlbG9jcyhBQkZELFNFQyxTVFJFQU0pCSgodm9pZCkgMCkKKyNlbmRpZgorCisjaWZuZGVmIEVNSVRfU0VDVElPTl9TWU1CT0xTCisjZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTIDEKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorYWRqdXN0X3JlbG9jX3N5bXMgKGFiZmQsIHNlYywgeHh4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiB4eHg7Cit7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7CisgIGZpeFMgKmZpeHA7CisKKyAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdGRlcnIpOworCisgIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKKyAgICBpZiAoZml4cC0+ZnhfZG9uZSkKKyAgICAgIC8qIGlnbm9yZSBpdCAqLzsKKyAgICBlbHNlIGlmIChmaXhwLT5meF9hZGRzeSkKKyAgICAgIHsKKwlzeW1ib2xTICpzeW07CisJYXNlY3Rpb24gKnN5bXNlYzsKKworI2lmZGVmIERFQlVHNQorCWZwcmludGYgKHN0ZGVyciwgIlxuXG5hZGp1c3RpbmcgZml4dXA6XG4iKTsKKwlwcmludF9maXh1cCAoZml4cCk7CisjZW5kaWYKKworCXN5bSA9IGZpeHAtPmZ4X2FkZHN5OworCisJLyogQWxsIHN5bWJvbHMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGF0IHRoaXMKKwkgICBwb2ludC4gIEl0IGlzIHBvc3NpYmxlIHRvIHNlZSB1bnJlc29sdmVkIGV4cHJlc3Npb24KKwkgICBzeW1ib2xzLCB0aG91Z2gsIHNpbmNlIHRoZXkgYXJlIG5vdCBpbiB0aGUgcmVndWxhciBzeW1ib2wKKwkgICB0YWJsZS4gICovCisJaWYgKHN5bSAhPSBOVUxMICYmICEgc3ltLT5zeV9yZXNvbHZlZCkKKwkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW0sIDEpOworCQorCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMICYmICEgZml4cC0+Znhfc3Vic3ktPnN5X3Jlc29sdmVkKQorCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZpeHAtPmZ4X3N1YnN5LCAxKTsKKworCS8qIElmIHRoaXMgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCwgY29udmVydAorICAgICAgICAgICB0aGUgZml4dXAgdG8gYmVpbmcgYWdhaW5zdCB0aGF0IHN5bWJvbC4gICovCisJaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAorCSAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQorCSAgeworCSAgICBmaXhwLT5meF9vZmZzZXQgKz0gc3ltLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7CisJICAgIHN5bSA9IHN5bS0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOworCSAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKKwkgIH0KKworCWlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPnN5X21yaV9jb21tb24pCisJICB7CisJICAgIC8qIFRoZXNlIHN5bWJvbHMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGluIGZpeHVwX3NlZ21lbnQuICAqLworCSAgICBnb3RvIGRvbmU7CisJICB9CisKKwlzeW1zZWMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOworCisJaWYgKHN5bXNlYyA9PSBOVUxMKQorCSAgYWJvcnQgKCk7CisJCisJaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltc2VjKSkKKwkgIHsKKwkgICAgLyogVGhlIGZpeHVwX3NlZ21lbnQgcm91dGluZSB3aWxsIG5vdCB1c2UgdGhpcyBzeW1ib2wgaW4gYQorICAgICAgICAgICAgICAgcmVsb2NhdGlvbiB1bmxlc3MgVENfRk9SQ0VfUkVMT0NBVElPTiByZXR1cm5zIDEuICAqLworCSAgICBpZiAoVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4cCkpCisJICAgICAgeworCQlmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYyA9IDE7CisjaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKKwkJaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCisJCSAgZml4cC0+Znhfc3Vic3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworI2VuZGlmCisJICAgICAgfQorCSAgICBnb3RvIGRvbmU7CisJICB9CisKKwkvKiBJZiBpdCdzIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgYXNzdW1lIHRoZSBzeW1ib2wgaXMKKwkgICBkZWZpbml0ZWx5IGdvaW5nIHRvIGJlIG91dHB1dC4gIFRoZSBjb2RlIGluCisJICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggaW4gdGMtbWlwcy5jIHVzZXMgdGhpcyB0ZXN0CisJICAgYXMgd2VsbCwgc28gaWYgeW91IGNoYW5nZSB0aGlzIGNvZGUgeW91IHNob3VsZCBsb29rIGF0IHRoYXQKKwkgICBjb2RlLiAgKi8KKwlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1zZWMpCisJICAgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc2VjKSkKKwkgIHsKKwkgICAgZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCisJICAgIC8qIFdlIGhhdmUgdGhlIGRpZmZlcmVuY2Ugb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBhbmQgc29tZQorCSAgICAgICBvdGhlciBzeW1ib2wuICBNYWtlIHN1cmUgdG8gbWFyayB0aGUgb3RoZXIgc3ltYm9sIGFzIHVzZWQKKwkgICAgICAgaW4gYSByZWxvY2F0aW9uIHNvIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgb3V0cHV0LiAgKi8KKwkgICAgaWYgKGZpeHAtPmZ4X3N1YnN5KQorCSAgICAgIGZpeHAtPmZ4X3N1YnN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsKKyNlbmRpZgorCSAgICBnb3RvIGRvbmU7CisJICB9CisKKwkvKiBEb24ndCB0cnkgdG8gcmVkdWNlIHJlbG9jcyB3aGljaCByZWZlciB0byAubGlua29uY2UKKyAgICAgICAgICAgc2VjdGlvbnMuICBJdCBjYW4gbGVhZCB0byBjb25mdXNpb24gd2hlbiBhIGRlYnVnZ2luZworICAgICAgICAgICBzZWN0aW9uIHJlZmVycyB0byBhIC5saW5rb25jZSBzZWN0aW9uLiAgSSBob3BlIHRoaXMgd2lsbAorICAgICAgICAgICBhbHdheXMgYmUgY29ycmVjdC4gICovCisJaWYgKHN5bXNlYyAhPSBzZWMpCisJICB7CisJICAgIGJvb2xlYW4gbGlua29uY2U7CisKKwkgICAgbGlua29uY2UgPSBmYWxzZTsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisJICAgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHN5bXNlYykgJiBTRUNfTElOS19PTkNFKQorCQkhPSAwKQorCSAgICAgIGxpbmtvbmNlID0gdHJ1ZTsKKyNlbmRpZgorI2lmZGVmIE9CSl9FTEYKKwkgICAgLyogVGhlIEdOVSB0b29sY2hhaW4gdXNlcyBhbiBleHRlbnNpb24gZm9yIEVMRjogYSBzZWN0aW9uCisgICAgICAgICAgICAgICBiZWdpbm5pbmcgd2l0aCB0aGUgbWFnaWMgc3RyaW5nIC5nbnUubGlua29uY2UgaXMgYQorICAgICAgICAgICAgICAgbGlua29uY2Ugc2VjdGlvbi4gICovCisJICAgIGlmIChzdHJuY21wIChzZWdtZW50X25hbWUgKHN5bXNlYyksICIuZ251LmxpbmtvbmNlIiwKKwkJCSBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkKKwkgICAgICBsaW5rb25jZSA9IHRydWU7CisjZW5kaWYKKworCSAgICBpZiAobGlua29uY2UpCisJICAgICAgeworCQlmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYyA9IDE7CisjaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKKwkJaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCisJCSAgZml4cC0+Znhfc3Vic3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworI2VuZGlmCisJCWdvdG8gZG9uZTsKKwkgICAgICB9CisJICB9CisKKwkvKiBTaW5jZSB3ZSdyZSByZWR1Y2luZyB0byBzZWN0aW9uIHN5bWJvbHMsIGRvbid0IGF0dGVtcHQgdG8gcmVkdWNlCisJICAgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgdXNpbmcgb25lLiAgKi8KKwlpZiAoc3ltLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKKwkgIHsKKwkgICAgZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworCSAgICBnb3RvIGRvbmU7CisJICB9CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisJLyogV2UgY2FuIG5ldmVyIGFkanVzdCBhIHJlbG9jIGFnYWluc3QgYSB3ZWFrIHN5bWJvbC4gIElmIHdlCisgICAgICAgICAgIGRpZCwgYW5kIHRoZSB3ZWFrIHN5bWJvbCB3YXMgb3ZlcnJpZGRlbiBieSBhIHJlYWwgc3ltYm9sCisgICAgICAgICAgIHNvbWV3aGVyZSBlbHNlLCB0aGVuIG91ciByZWxvY2F0aW9uIHdvdWxkIGJlIHBvaW50aW5nIGF0CisgICAgICAgICAgIHRoZSB3cm9uZyBhcmVhIG9mIG1lbW9yeS4gICovCisJaWYgKFNfSVNfV0VBSyAoc3ltKSkKKwkgIHsKKwkgICAgZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworCSAgICBnb3RvIGRvbmU7CisJICB9CisjZW5kaWYKKworCS8qIElzIHRoZXJlIHNvbWUgb3RoZXIgcmVhc29uIHdlIGNhbid0IGFkanVzdCB0aGlzIG9uZT8gIChFLmcuLAorCSAgIGNhbGwvYmFsIGxpbmtzIGluIGk5NjAtYm91dCBzeW1ib2xzLikgICovCisjaWZkZWYgb2JqX2ZpeF9hZGp1c3RhYmxlCisJaWYgKCEgb2JqX2ZpeF9hZGp1c3RhYmxlIChmaXhwKSkKKwkgIHsKKwkgICAgZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworCSAgICBnb3RvIGRvbmU7CisJICB9CisjZW5kaWYKKworCS8qIElzIHRoZXJlIHNvbWUgb3RoZXIgKHRhcmdldCBjcHUgZGVwZW5kZW50KSByZWFzb24gd2UgY2FuJ3QgYWRqdXN0CisJICAgdGhpcyBvbmU/ICAoRS5nLiByZWxvY2F0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gYWRkcmVzc2VzIG9uCisJICAgdGhlIFBBLiAgKi8KKyNpZmRlZiB0Y19maXhfYWRqdXN0YWJsZQorCWlmICghIHRjX2ZpeF9hZGp1c3RhYmxlIChmaXhwKSkKKwkgIHsKKwkgICAgZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworCSAgICBnb3RvIGRvbmU7CisJICB9CisjZW5kaWYKKworCS8qIElmIHRoZSBzZWN0aW9uIHN5bWJvbCBpc24ndCBnb2luZyB0byBiZSBvdXRwdXQsIHRoZSByZWxvY3MKKwkgICBhdCBsZWFzdCBzaG91bGQgc3RpbGwgd29yay4gIElmIG5vdCwgZmlndXJlIG91dCB3aGF0IHRvIGRvCisJICAgd2hlbiB3ZSBydW4gaW50byB0aGF0IGNhc2UuCisKKwkgICBXZSByZWZldGNoIHRoZSBzZWdtZW50IHdoZW4gY2FsbGluZyBzZWN0aW9uX3N5bWJvbCwgcmF0aGVyCisJICAgdGhhbiB1c2luZyBzeW1zZWMsIGJlY2F1c2UgU19HRVRfVkFMVUUgbWF5IHdpbmQgdXAgY2hhbmdpbmcKKwkgICB0aGUgc2VjdGlvbiB3aGVuIGl0IGNhbGxzIHJlc29sdmVfc3ltYm9sX3ZhbHVlLiAqLworCWZpeHAtPmZ4X29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltKTsKKwlmaXhwLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChTX0dFVF9TRUdNRU5UIChzeW0pKTsKKwlmaXhwLT5meF9hZGRzeS0+c3lfdXNlZF9pbl9yZWxvYyA9IDE7CisKKyAgICAgIGRvbmU6CisJOworICAgICAgfQorI2lmIDEvKmRlZiBSRUxPQ19SRVFVSVJFU19TWU1CT0wqLworICAgIGVsc2UKKyAgICAgIHsKKwkvKiBUaGVyZSB3YXMgbm8gc3ltYm9sIHJlcXVpcmVkIGJ5IHRoaXMgcmVsb2NhdGlvbi4gIEhvd2V2ZXIsCisJICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSByZWxvY2F0aW9ucyB3aXRob3V0IHN5bWJvbHMgd2VsbC4KKwkgICAoQXQgbGVhc3QsIHRoZSBDT0ZGIHN1cHBvcnQgZG9lc24ndC4pICBTbyBmb3Igbm93IHdlIGZha2UgdXAKKwkgICBhIGxvY2FsIHN5bWJvbCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCisKKwlmaXhwLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKKy8qCWZpeHAtPmZ4X2FkZHN5LT5zeV91c2VkX2luX3JlbG9jID0gMTsgKi8KKyAgICAgIH0KKyNlbmRpZgorCisgIGR1bXBfc2VjdGlvbl9yZWxvY3MgKGFiZmQsIHNlYywgc3RkZXJyKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3JlbG9jcyAoYWJmZCwgc2VjLCB4eHgpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIHh4eDsKK3sKKyAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKKyAgaW50IGk7CisgIHVuc2lnbmVkIGludCBuOworICBhcmVsZW50ICoqcmVsb2NzOworICBmaXhTICpmaXhwOworICBjaGFyICplcnI7CisKKyAgLyogSWYgc2VnaW5mbyBpcyBOVUxMLCB3ZSBkaWQgbm90IGNyZWF0ZSB0aGlzIHNlY3Rpb247IGRvbid0IGRvCisgICAgIGFueXRoaW5nIHdpdGggaXQuICAqLworICBpZiAoc2VnaW5mbyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmaXh1cF9zZWdtZW50IChzZWdpbmZvLT5maXhfcm9vdCwgc2VjKTsKKworICBuID0gMDsKKyAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHA7IGZpeHAgPSBmaXhwLT5meF9uZXh0KQorICAgIG4rKzsKKworI2lmbmRlZiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKKyAgLyogU2V0IHVwIHJlbG9jIGluZm9ybWF0aW9uIGFzIHdlbGwuICAqLworICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAobiAqIHNpemVvZiAoYXJlbGVudCAqKSk7CisgIG1lbXNldCAoKGNoYXIqKXJlbG9jcywgMCwgbiAqIHNpemVvZiAoYXJlbGVudCopKTsKKworICBpID0gMDsKKyAgZm9yIChmaXhwID0gc2VnaW5mby0+Zml4X3Jvb3Q7IGZpeHAgIT0gKGZpeFMgKikgTlVMTDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCisgICAgeworICAgICAgYXJlbGVudCAqcmVsb2M7CisgICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgczsKKyAgICAgIHN5bWJvbFMgKnN5bTsKKworICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCisJeworCSAgbi0tOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIGVxdWF0ZWQgdG8gYW5vdGhlcgorICAgICAgICAgc3ltYm9sLCB0aGVuIHVzZSBnZW5lcmF0ZSB0aGUgcmVsb2MgYWdhaW5zdCB0aGUgbGF0dGVyIHN5bWJvbAorICAgICAgICAgcmF0aGVyIHRoYW4gdGhlIGZvcm1lci4gICovCisgICAgICBzeW0gPSBmaXhwLT5meF9hZGRzeTsKKyAgICAgIHdoaWxlIChzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKKwkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCisJeworCSAgc3ltYm9sUyAqbjsKKworCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1ciB3aXRoIGEgYmFkbHkKKwkgICAgIHdyaXR0ZW4gcHJvZ3JhbS4gICovCisJICBuID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7CisJICBpZiAobiA9PSBzeW0pCisJICAgIGJyZWFrOworCSAgZml4cC0+Znhfb2Zmc2V0ICs9IHN5bS0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOworCSAgc3ltID0gbjsKKwl9CisgICAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKKworICAgICAgcmVsb2MgPSB0Y19nZW5fcmVsb2MgKHNlYywgZml4cCk7CisgICAgICBpZiAoIXJlbG9jKQorCXsKKwkgIG4tLTsKKwkgIGNvbnRpbnVlOworCX0KKworI2lmIDAKKyAgICAgIC8qIFRoaXMgdGVzdCBpcyB0cmlnZ2VyZWQgaW5hcHByb3ByaWF0ZWx5IGZvciB0aGUgU0guICAqLworICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICsgZml4cC0+Znhfc2l6ZQorCSAgPiBmaXhwLT5meF9mcmFnLT5mcl9maXggKyBmaXhwLT5meF9mcmFnLT5mcl9vZmZzZXQpCisJYWJvcnQgKCk7CisjZW5kaWYKKworICAgICAgcyA9IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKHN0ZG91dHB1dCwgcmVsb2MsCisJCQkJICBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsLAorCQkJCSAgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKKwkJCQkgIHNlYywgJmVycik7CisgICAgICBzd2l0Y2ggKHMpCisJeworCWNhc2UgYmZkX3JlbG9jX29rOgorCSAgYnJlYWs7CisJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6CisJICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7CisJICBicmVhazsKKwljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgorCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBfKCJyZWxvY2F0aW9uIG91dCBvZiByYW5nZSIpKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhc19mYXRhbCAoXygiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uOiAleCIpLAorCQkgICAgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgcyk7CisJfQorICAgICAgcmVsb2NzW2krK10gPSByZWxvYzsKKyAgICB9CisjZWxzZQorICBuID0gbiAqIE1BWF9SRUxPQ19FWFBBTlNJT047CisgIC8qIFNldCB1cCByZWxvYyBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgKi8KKyAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKGFyZWxlbnQgKikpOworCisgIGkgPSAwOworICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cCAhPSAoZml4UyAqKSBOVUxMOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKKyAgICB7CisgICAgICBhcmVsZW50ICoqcmVsb2M7CisgICAgICBjaGFyICpkYXRhOworICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHM7CisgICAgICBzeW1ib2xTICpzeW07CisgICAgICBpbnQgajsKKworICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCisJeworCSAgbi0tOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIGVxdWF0ZWQgdG8gYW5vdGhlcgorICAgICAgICAgc3ltYm9sLCB0aGVuIHVzZSBnZW5lcmF0ZSB0aGUgcmVsb2MgYWdhaW5zdCB0aGUgbGF0dGVyIHN5bWJvbAorICAgICAgICAgcmF0aGVyIHRoYW4gdGhlIGZvcm1lci4gICovCisgICAgICBzeW0gPSBmaXhwLT5meF9hZGRzeTsKKyAgICAgIHdoaWxlIChzeW0tPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKKwkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCisJc3ltID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7CisgICAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKKworICAgICAgcmVsb2MgPSB0Y19nZW5fcmVsb2MgKHNlYywgZml4cCk7CisKKyAgICAgIGZvciAoaiA9IDA7IHJlbG9jW2pdOyBqKyspCisJeworICAgICAgICAgIHJlbG9jc1tpKytdID0gcmVsb2Nbal07CisgICAgICAgICAgYXNzZXJ0KGkgPD0gbik7CisJfQorICAgICAgZGF0YSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKKyAgICAgIGlmIChmaXhwLT5meF93aGVyZSArIGZpeHAtPmZ4X3NpemUKKwkgID4gZml4cC0+ZnhfZnJhZy0+ZnJfZml4ICsgZml4cC0+ZnhfZnJhZy0+ZnJfb2Zmc2V0KQorCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJICAgICAgXygiaW50ZXJuYWwgZXJyb3I6IGZpeHVwIG5vdCBjb250YWluZWQgd2l0aGluIGZyYWciKSk7CisgICAgICBmb3IgKGogPSAwOyByZWxvY1tqXTsgaisrKQorICAgICAgICB7CisJICBzID0gYmZkX2luc3RhbGxfcmVsb2NhdGlvbiAoc3Rkb3V0cHV0LCByZWxvY1tqXSwKKwkJCQkgICAgICBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsLAorCQkJCSAgICAgIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCisJCQkJICAgICAgc2VjLCAmZXJyKTsKKyAgICAgICAgICBzd2l0Y2ggKHMpCisJICAgIHsKKwkgICAgY2FzZSBiZmRfcmVsb2Nfb2s6CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgorCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKKwkJCSAgICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFzX2ZhdGFsIChfKCIlczoldTogYmFkIHJldHVybiBmcm9tIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24iKSwKKwkJCWZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOworCSAgICB9CisgICAgICAgIH0KKyAgICB9CisgIG4gPSBpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRzQKKyAgeworICAgIGludCBpLCBqLCBuc3ltczsKKyAgICBhc3ltYm9sICoqc3ltcHA7CisgICAgc3ltcHAgPSBiZmRfZ2V0X291dHN5bWJvbHMgKHN0ZG91dHB1dCk7CisgICAgbnN5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChzdGRvdXRwdXQpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBpZiAoKCgqcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQorCXsKKwkgIGZvciAoaiA9IDA7IGogPCBuc3ltczsgaisrKQorCSAgICBpZiAoc3ltcHBbal0gPT0gKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIpCisJICAgICAgYnJlYWs7CisJICBpZiAoaiA9PSBuc3ltcykKKwkgICAgYWJvcnQgKCk7CisJfQorICB9CisjZW5kaWYKKworICBpZiAobikKKyAgICBiZmRfc2V0X3JlbG9jIChzdGRvdXRwdXQsIHNlYywgcmVsb2NzLCBuKTsKKyAgZWxzZQorICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLAorCQkJICAgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKQorCQkJICAgICYgKGZsYWd3b3JkKSB+U0VDX1JFTE9DKSk7CisKKyNpZmRlZiBERUJVRzMKKyAgeworICAgIGludCBpOworICAgIGFyZWxlbnQgKnI7CisgICAgYXN5bWJvbCAqczsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJyZWxvY3MgZm9yIHNlYyAlc1xuIiwgc2VjLT5uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgeworCXIgPSByZWxvY3NbaV07CisJcyA9ICpyLT5zeW1fcHRyX3B0cjsKKwlmcHJpbnRmIChzdGRlcnIsICIgIHJlbG9jICUyZCBAJTA4eCBvZmYgJTR4IDogc3ltICUtMTBzIGFkZGVuZCAleFxuIiwKKwkJIGksIHIsIHItPmFkZHJlc3MsIHMtPm5hbWUsIHItPmFkZGVuZCk7CisgICAgICB9CisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAord3JpdGVfY29udGVudHMgKGFiZmQsIHNlYywgeHh4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiB4eHg7Cit7CisgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7CisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKyAgZnJhZ1MgKmY7CisKKyAgLyogV3JpdGUgb3V0IHRoZSBmcmFncy4gICovCisgIGlmIChzZWdpbmZvID09IE5VTEwKKyAgICAgIHx8ICEgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19IQVNfQ09OVEVOVFMpKQorICAgIHJldHVybjsKKworICBmb3IgKGYgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OworICAgICAgIGY7CisgICAgICAgZiA9IGYtPmZyX25leHQpCisgICAgeworICAgICAgaW50IHg7CisgICAgICB1bnNpZ25lZCBsb25nIGZpbGxfc2l6ZTsKKyAgICAgIGNoYXIgKmZpbGxfbGl0ZXJhbDsKKyAgICAgIGxvbmcgY291bnQ7CisKKyAgICAgIGFzc2VydCAoZi0+ZnJfdHlwZSA9PSByc19maWxsKTsKKyAgICAgIGlmIChmLT5mcl9maXgpCisJeworCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCisJCQkJCWYtPmZyX2xpdGVyYWwsIChmaWxlX3B0cikgb2Zmc2V0LAorCQkJCQkoYmZkX3NpemVfdHlwZSkgZi0+ZnJfZml4KTsKKwkgIGlmICh4ID09IGZhbHNlKQorCSAgICB7CisJICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7CisJICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3Qgd3JpdGUgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7CisJICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKKwkgICAgfQorCSAgb2Zmc2V0ICs9IGYtPmZyX2ZpeDsKKwl9CisgICAgICBmaWxsX2xpdGVyYWwgPSBmLT5mcl9saXRlcmFsICsgZi0+ZnJfZml4OworICAgICAgZmlsbF9zaXplID0gZi0+ZnJfdmFyOworICAgICAgY291bnQgPSBmLT5mcl9vZmZzZXQ7CisgICAgICBhc3NlcnQgKGNvdW50ID49IDApOworICAgICAgaWYgKGZpbGxfc2l6ZSAmJiBjb3VudCkKKwl7CisJICBjaGFyIGJ1ZlsyNTZdOworCSAgaWYgKGZpbGxfc2l6ZSA+IHNpemVvZihidWYpKQorCSAgICB7CisJICAgICAgLyogRG8gaXQgdGhlIG9sZCB3YXkuIENhbiB0aGlzIGV2ZXIgaGFwcGVuPyAqLworCSAgICAgIHdoaWxlIChjb3VudC0tKQorCQl7CisJCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCisJCQkJCQlmaWxsX2xpdGVyYWwsCisJCQkJCQkoZmlsZV9wdHIpIG9mZnNldCwKKwkJCQkJCShiZmRfc2l6ZV90eXBlKSBmaWxsX3NpemUpOworCQkgIGlmICh4ID09IGZhbHNlKQorCQkgICAgeworCQkgICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKKwkJICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3Qgd3JpdGUgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7CisJCSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisJCSAgICB9CisJCSAgb2Zmc2V0ICs9IGZpbGxfc2l6ZTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBCdWlsZCBhIGJ1ZmZlciBmdWxsIG9mIGZpbGwgb2JqZWN0cyBhbmQgb3V0cHV0IGl0IGFzCisJCSBvZnRlbiBhcyBuZWNlc3NhcnkuIFRoaXMgc2F2ZXMgb24gdGhlIG92ZXJoZWFkIG9mCisJCSBwb3RlbnRpYWxseSBsb3RzIG9mIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyBjYWxscy4gICovCisJICAgICAgaW50IG5fcGVyX2J1ZiwgaTsKKwkgICAgICBpZiAoZmlsbF9zaXplID09IDEpCisJCXsKKwkJICBuX3Blcl9idWYgPSBzaXplb2YgKGJ1Zik7CisJCSAgbWVtc2V0IChidWYsICpmaWxsX2xpdGVyYWwsIG5fcGVyX2J1Zik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBjaGFyICpidWZwOworCQkgIG5fcGVyX2J1ZiA9IHNpemVvZihidWYpL2ZpbGxfc2l6ZTsKKwkJICBmb3IgKGkgPSBuX3Blcl9idWYsIGJ1ZnAgPSBidWY7IGk7IGktLSwgYnVmcCArPSBmaWxsX3NpemUpCisJCSAgICBtZW1jcHkoYnVmcCwgZmlsbF9saXRlcmFsLCBmaWxsX3NpemUpOworCQl9CisJICAgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gbl9wZXJfYnVmKQorCQl7CisJCSAgbl9wZXJfYnVmID0gbl9wZXJfYnVmID4gY291bnQgPyBjb3VudCA6IG5fcGVyX2J1ZjsKKwkJICB4ID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChzdGRvdXRwdXQsIHNlYywKKwkJCQkJCWJ1ZiwgKGZpbGVfcHRyKSBvZmZzZXQsCisJCQkJCQkoYmZkX3NpemVfdHlwZSkgbl9wZXJfYnVmICogZmlsbF9zaXplKTsKKwkJICBpZiAoeCAhPSB0cnVlKQorCQkgICAgYXNfZmF0YWwgKF8oIkNhbm5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZS4iKSk7CisJCSAgb2Zmc2V0ICs9IG5fcGVyX2J1ZiAqIGZpbGxfc2l6ZTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQoT0JKX0FPVVQpKQorc3RhdGljIHZvaWQKK21lcmdlX2RhdGFfaW50b190ZXh0ICgpCit7CisjaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKSB8fCBkZWZpbmVkKE1BTllfU0VHTUVOVFMpCisgIHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0LT5mcl9uZXh0ID0KKyAgICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKKyAgc2VnX2luZm8gKHRleHRfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX2xhc3QgPQorICAgIHNlZ19pbmZvIChkYXRhX3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0OworICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAgPSAwOworI2Vsc2UKKyAgZml4UyAqdG1wOworCisgIHRleHRfbGFzdF9mcmFnLT5mcl9uZXh0ID0gZGF0YV9mcmFnX3Jvb3Q7CisgIHRleHRfbGFzdF9mcmFnID0gZGF0YV9sYXN0X2ZyYWc7CisgIGRhdGFfbGFzdF9mcmFnID0gTlVMTDsKKyAgZGF0YV9mcmFnX3Jvb3QgPSBOVUxMOworICBpZiAodGV4dF9maXhfcm9vdCkKKyAgICB7CisgICAgICBmb3IgKHRtcCA9IHRleHRfZml4X3Jvb3Q7IHRtcC0+ZnhfbmV4dDsgdG1wID0gdG1wLT5meF9uZXh0KTs7CisgICAgICB0bXAtPmZ4X25leHQgPSBkYXRhX2ZpeF9yb290OworICAgICAgdGV4dF9maXhfdGFpbCA9IGRhdGFfZml4X3RhaWw7CisgICAgfQorICBlbHNlCisgICAgdGV4dF9maXhfcm9vdCA9IGRhdGFfZml4X3Jvb3Q7CisgIGRhdGFfZml4X3Jvb3QgPSBOVUxMOworI2VuZGlmCit9CisjZW5kaWYgLyogQkZEX0FTU0VNQkxFUiB8fCAoISBCRkQgJiYgISBPQkpfQU9VVCkgKi8KKworI2lmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSAmJiAhZGVmaW5lZCAoQkZEKQorc3RhdGljIHZvaWQKK3JlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyAoKQoreworICBmcmFnUyAqZnJhZ1A7CisKKyAgcmVsYXhfc2VnbWVudCAodGV4dF9mcmFnX3Jvb3QsIFNFR19URVhUKTsKKyAgcmVsYXhfc2VnbWVudCAoZGF0YV9mcmFnX3Jvb3QsIFNFR19EQVRBKTsKKyAgcmVsYXhfc2VnbWVudCAoYnNzX2ZyYWdfcm9vdCwgU0VHX0JTUyk7CisgIC8qCisgICAqIE5vdyB0aGUgYWRkcmVzc2VzIG9mIGZyYWdzIGFyZSBjb3JyZWN0IHdpdGhpbiB0aGUgc2VnbWVudC4KKyAgICovCisKKyAga25vdyAodGV4dF9sYXN0X2ZyYWctPmZyX3R5cGUgPT0gcnNfZmlsbCAmJiB0ZXh0X2xhc3RfZnJhZy0+ZnJfb2Zmc2V0ID09IDApOworICBIX1NFVF9URVhUX1NJWkUgKCZoZWFkZXJzLCB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7CisgIHRleHRfbGFzdF9mcmFnLT5mcl9hZGRyZXNzID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7CisKKyAgLyoKKyAgICogSm9pbiB0aGUgMiBzZWdtZW50cyBpbnRvIDEgaHVnZSBzZWdtZW50LgorICAgKiBUbyBkbyB0aGlzLCByZS1jb21wdXRlIGV2ZXJ5IHJuX2FkZHJlc3MgaW4gdGhlIFNFR19EQVRBIGZyYWdzLgorICAgKiBUaGVuIGpvaW4gdGhlIGRhdGEgZnJhZ3MgYWZ0ZXIgdGhlIHRleHQgZnJhZ3MuCisgICAqCisgICAqIERldGVybWluZSBhX2RhdGEgW2xlbmd0aCBvZiBkYXRhIHNlZ21lbnRdLgorICAgKi8KKyAgaWYgKGRhdGFfZnJhZ19yb290KQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHJlbGF4X2FkZHJlc3NUIHNsaWRlOworCisgICAgICBrbm93ICgodGV4dF9sYXN0X2ZyYWctPmZyX3R5cGUgPT0gcnNfZmlsbCkgJiYgKHRleHRfbGFzdF9mcmFnLT5mcl9vZmZzZXQgPT0gMCkpOworCisgICAgICBIX1NFVF9EQVRBX1NJWkUgKCZoZWFkZXJzLCBkYXRhX2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7CisgICAgICBkYXRhX2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyA9IEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpOworICAgICAgc2xpZGUgPSBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKTsJLyogJiBpbiBmaWxlIG9mIHRoZSBkYXRhIHNlZ21lbnQuICovCisjaWZkZWYgT0JKX0JPVVQKKyNkZWZpbmUgUm91bmRVcChOLFMpICgoKE4pKyhTKS0xKSYtKFMpKQorICAgICAgLyogRm9yIGIub3V0OiBJZiB0aGUgZGF0YSBzZWN0aW9uIGhhcyBhIHN0cmljdCBhbGlnbm1lbnQKKwkgcmVxdWlyZW1lbnQsIGl0cyBsb2FkIGFkZHJlc3MgaW4gdGhlIC5vIGZpbGUgd2lsbCBiZQorCSByb3VuZGVkIHVwIGZyb20gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4gIFRoZXNlCisJIHR3byB2YWx1ZXMgYXJlICpub3QqIHRoZSBzYW1lISAgU2ltaWxhcmx5IGZvciB0aGUgYnNzCisJIHNlY3Rpb24uLi4uICAqLworICAgICAgc2xpZGUgPSBSb3VuZFVwIChzbGlkZSwgMSA8PCBzZWN0aW9uX2FsaWdubWVudFtTRUdfREFUQV0pOworI2VuZGlmCisKKyAgICAgIGZvciAoZnJhZ1AgPSBkYXRhX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCisJeworCSAgZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc2xpZGU7CisJfQkJCS8qIGZvciBlYWNoIGRhdGEgZnJhZyAqLworCisgICAgICBrbm93ICh0ZXh0X2xhc3RfZnJhZyAhPSAwKTsKKyAgICAgIHRleHRfbGFzdF9mcmFnLT5mcl9uZXh0ID0gZGF0YV9mcmFnX3Jvb3Q7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgMCk7CisgICAgfQorCisjaWZkZWYgT0JKX0JPVVQKKyAgLyogU2VlIGFib3ZlIGNvbW1lbnRzIG9uIGIub3V0IGRhdGEgc2VjdGlvbiBhZGRyZXNzLiAgKi8KKyAgeworICAgIGxvbmcgYnNzX3ZtYTsKKyAgICBpZiAoZGF0YV9sYXN0X2ZyYWcgPT0gMCkKKyAgICAgIGJzc192bWEgPSBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKTsKKyAgICBlbHNlCisgICAgICBic3Nfdm1hID0gZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3M7CisgICAgYnNzX3ZtYSA9IFJvdW5kVXAgKGJzc192bWEsIDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0JTU10pOworICAgIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9IGJzc192bWE7CisgIH0KKyNlbHNlIC8qICEgT0JKX0JPVVQgKi8KKyAgYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzID0gKEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsKKwkJCQkgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykpOworCisjZW5kaWYgLyogISBPQkpfQk9VVCAqLworCisgIC8qIFNsaWRlIGFsbCB0aGUgZnJhZ3MgKi8KKyAgaWYgKGJzc19mcmFnX3Jvb3QpCisgICAgeworICAgICAgcmVsYXhfYWRkcmVzc1Qgc2xpZGUgPSBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3M7CisKKyAgICAgIGZvciAoZnJhZ1AgPSBic3NfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKKwl7CisJICBmcmFnUC0+ZnJfYWRkcmVzcyArPSBzbGlkZTsKKwl9CQkJLyogZm9yIGVhY2ggYnNzIGZyYWcgKi8KKyAgICB9CisKKyAgaWYgKGJzc19sYXN0X2ZyYWcpCisgICAgSF9TRVRfQlNTX1NJWkUgKCZoZWFkZXJzLAorCQkgICAgYnNzX2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyAtIGJzc19mcmFnX3Jvb3QtPmZyX2FkZHJlc3MpOworICBlbHNlCisgICAgSF9TRVRfQlNTX1NJWkUgKCZoZWFkZXJzLCAwKTsKK30KKyNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgJiYgISBCRkQgKi8KKworI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCitzdGF0aWMgdm9pZAorc2V0X3N5bXRhYiAoKQoreworICBpbnQgbnN5bXM7CisgIGFzeW1ib2wgKiphc3ltcHA7CisgIHN5bWJvbFMgKnN5bXA7CisgIGJvb2xlYW4gcmVzdWx0OworICBleHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7CisKKyAgLyogQ291bnQgc3ltYm9scy4gIFdlIGNhbid0IHJlbHkgb24gYSBjb3VudCBtYWRlIGJ5IHRoZSBsb29wIGluCisgICAgIHdyaXRlX29iamVjdF9maWxlLCBiZWNhdXNlICpfZnJvYl9maWxlIG1heSBhZGQgYSBuZXcgc3ltYm9sIG9yCisgICAgIHR3by4gICovCisgIG5zeW1zID0gMDsKKyAgZm9yIChzeW1wID0gc3ltYm9sX3Jvb3RQOyBzeW1wOyBzeW1wID0gc3ltYm9sX25leHQgKHN5bXApKQorICAgIG5zeW1zKys7CisKKyAgaWYgKG5zeW1zKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBhc3ltcHAgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChzdGRvdXRwdXQsCisJCQkJICAgICAgIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKKyAgICAgIHN5bXAgPSBzeW1ib2xfcm9vdFA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKywgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKKwl7CisJICBhc3ltcHBbaV0gPSBzeW1wLT5ic3ltOworCSAgc3ltcC0+d3JpdHRlbiA9IDE7CisJfQorICAgIH0KKyAgZWxzZQorICAgIGFzeW1wcCA9IDA7CisgIHJlc3VsdCA9IGJmZF9zZXRfc3ltdGFiIChzdGRvdXRwdXQsIGFzeW1wcCwgbnN5bXMpOworICBhc3NlcnQgKHJlc3VsdCA9PSB0cnVlKTsKKyAgc3ltYm9sX3RhYmxlX2Zyb3plbiA9IDE7Cit9CisjZW5kaWYKKworLyogRmluaXNoIHRoZSBzdWJzZWdtZW50cy4gIEFmdGVyIGV2ZXJ5IHN1Yi1zZWdtZW50LCB3ZSBmYWtlIGFuCisgICAiLmFsaWduIC4uLiIuICBUaGlzIGNvbmZvcm1zIHRvIEJTRDQuMiBicmFuZS1kYW1hZ2UuICBXZSB0aGVuIGZha2UKKyAgICIuZmlsbCAwIiBiZWNhdXNlIHRoYXQgaXMgdGhlIGtpbmQgb2YgZnJhZyB0aGF0IHJlcXVpcmVzIGxlYXN0CisgICB0aG91Z2h0LiAgIi5hbGlnbiIgZnJhZ3MgbGlrZSB0byBoYXZlIGEgZm9sbG93aW5nIGZyYWcgc2luY2UgdGhhdAorICAgbWFrZXMgY2FsY3VsYXRpbmcgdGhlaXIgaW50ZW5kZWQgbGVuZ3RoIHRyaXZpYWwuICAqLworCisjaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpICgwKQorI2Vsc2UKKyNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAoMikKKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQKK3N1YnNlZ3NfZmluaXNoICgpCit7CisgIHN0cnVjdCBmcmNoYWluICpmcmNoYWluUDsKKworICBmb3IgKGZyY2hhaW5QID0gZnJjaGFpbl9yb290OyBmcmNoYWluUDsgZnJjaGFpblAgPSBmcmNoYWluUC0+ZnJjaF9uZXh0KQorICAgIHsKKyAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5QLT5mcmNoX3NlZywgZnJjaGFpblAtPmZyY2hfc3Vic2VnKTsKKworICAgICAgLyogVGhpcyBub3cgZ2V0cyBjYWxsZWQgZXZlbiBpZiB3ZSBoYWQgZXJyb3JzLiAgSW4gdGhhdCBjYXNlLAorICAgICAgICAgYW55IGFsaWdubWVudCBpcyBtZWFuaW5nbGVzcywgYW5kLCBtb3Jlb3Zlciwgd2lsbCBsb29rIHdlaXJkCisgICAgICAgICBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIGxpc3RpbmcuICAqLworICAgICAgZnJhZ19hbGlnbiAoaGFkX2Vycm9ycyAoKSA/IDAgOiBTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksCisJCSAgTk9QX09QQ09ERSwgMCk7CisKKyAgICAgIC8qIGZyYWdfYWxpZ24gd2lsbCBoYXZlIGxlZnQgYSBuZXcgZnJhZy4KKwkgVXNlIHRoaXMgbGFzdCBmcmFnIGZvciBhbiBlbXB0eSAiLmZpbGwiLgorCisJIEZvciB0aGlzIHNlZ21lbnQgLi4uCisJIENyZWF0ZSBhIGxhc3QgZnJhZy4gRG8gbm90IGxlYXZlIGEgImJlaW5nIGZpbGxlZCBpbiBmcmFnIi4gICovCisKKyAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOworICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7CisgICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKKyAgICB9Cit9CisKKy8qIFdyaXRlIHRoZSBvYmplY3QgZmlsZS4gICovCisKK3ZvaWQKK3dyaXRlX29iamVjdF9maWxlICgpCit7CisjaWYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKFdPUktJTkdfRE9UX1dPUkQpCisgIGZyYWdTICpmcmFnUDsJCQkvKiBUcmFjayBhbG9uZyBhbGwgZnJhZ3MuICovCisjZW5kaWYKKworICAvKiBEbyB3ZSByZWFsbHkgd2FudCB0byB3cml0ZSBpdD8gICovCisgIHsKKyAgICBpbnQgbl93YXJucywgbl9lcnJzOworICAgIG5fd2FybnMgPSBoYWRfd2FybmluZ3MgKCk7CisgICAgbl9lcnJzID0gaGFkX2Vycm9ycyAoKTsKKyAgICAvKiBUaGUgLVogZmxhZyBpbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgZmlsZSBzaG91bGQgYmUgZ2VuZXJhdGVkLAorICAgICAgIHJlZ2FyZGxlc3Mgb2Ygd2FybmluZ3MgYW5kIGVycm9ycy4gICovCisgICAgaWYgKGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCkKKyAgICAgIHsKKwlpZiAobl93YXJucyB8fCBuX2VycnMpCisJICBhc193YXJuIChfKCIlZCBlcnJvciVzLCAlZCB3YXJuaW5nJXMsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLlxuIiksCisJCSAgIG5fZXJycywgbl9lcnJzID09IDEgPyAiIiA6ICJzIiwKKwkJICAgbl93YXJucywgbl93YXJucyA9PSAxID8gIiIgOiAicyIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlpZiAobl9lcnJzKQorCSAgYXNfZmF0YWwgKF8oIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgbm8gb2JqZWN0IGZpbGUgZ2VuZXJhdGVkLlxuIiksCisJCSAgICBuX2VycnMsIG5fZXJycyA9PSAxID8gIiIgOiAicyIsCisJCSAgICBuX3dhcm5zLCBuX3dhcm5zID09IDEgPyAiIiA6ICJzIik7CisgICAgICB9CisgIH0KKworI2lmZGVmCU9CSl9WTVMKKyAgLyogVW5kZXIgVk1TIHdlIHRyeSB0byBiZSBjb21wYXRpYmxlIHdpdGggVkFYLTExICJDIi4gIFRodXMsIHdlIGNhbGwKKyAgICAgYSByb3V0aW5lIHRvIGNoZWNrIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJvY2VkdXJlICJfbWFpbiIsCisgICAgIGFuZCBpZiBzbyAtLSBmaXggaXQgdXAgc28gdGhhdCBpdCBjYW4gYmUgcHJvZ3JhbSBlbnRyeSBwb2ludC4gKi8KKyAgdm1zX2NoZWNrX2Zvcl9tYWluICgpOworI2VuZGlmIC8qIE9CSl9WTVMgKi8KKworICAvKiBGcm9tIG5vdyBvbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCBzdWItc2VnbWVudHMuICBCdWlsZCBvbmUgZnJhZyBjaGFpbgorICAgICBmb3IgZWFjaCBzZWdtZW50LiBMaW5rZWQgdGhydSBmcl9uZXh0LiAgKi8KKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgLyogUmVtb3ZlIHRoZSBzZWN0aW9ucyBjcmVhdGVkIGJ5IGdhcyBmb3IgaXRzIG93biBwdXJwb3Nlcy4gICovCisgIHsKKyAgICBhc2VjdGlvbiAqKnNlY2xpc3QsICpzZWM7CisgICAgaW50IGk7CisKKyAgICBzZWNsaXN0ID0gJnN0ZG91dHB1dC0+c2VjdGlvbnM7CisgICAgd2hpbGUgKHNlY2xpc3QgJiYgKnNlY2xpc3QpCisgICAgICB7CisJc2VjID0gKnNlY2xpc3Q7CisJd2hpbGUgKHNlYyA9PSByZWdfc2VjdGlvbiB8fCBzZWMgPT0gZXhwcl9zZWN0aW9uKQorCSAgeworCSAgICBzZWMgPSBzZWMtPm5leHQ7CisJICAgICpzZWNsaXN0ID0gc2VjOworCSAgICBzdGRvdXRwdXQtPnNlY3Rpb25fY291bnQtLTsKKwkgICAgaWYgKCFzZWMpCisJICAgICAgYnJlYWs7CisJICB9CisJaWYgKCpzZWNsaXN0KQorCSAgc2VjbGlzdCA9ICYoKnNlY2xpc3QpLT5uZXh0OworICAgICAgfQorICAgIGkgPSAwOworICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCByZW51bWJlcl9zZWN0aW9ucywgJmkpOworICB9CisKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyLCAoY2hhciAqKSAwKTsKKyNlbHNlCisgIHJlbW92ZV9zdWJzZWdzIChmcmNoYWluX3Jvb3QsIFNFR19URVhULCAmdGV4dF9mcmFnX3Jvb3QsICZ0ZXh0X2xhc3RfZnJhZyk7CisgIHJlbW92ZV9zdWJzZWdzIChkYXRhMF9mcmNoYWluUCwgU0VHX0RBVEEsICZkYXRhX2ZyYWdfcm9vdCwgJmRhdGFfbGFzdF9mcmFnKTsKKyAgcmVtb3ZlX3N1YnNlZ3MgKGJzczBfZnJjaGFpblAsIFNFR19CU1MsICZic3NfZnJhZ19yb290LCAmYnNzX2xhc3RfZnJhZyk7CisjZW5kaWYKKworICAvKiBXZSBoYXZlIHR3byBzZWdtZW50cy4gSWYgdXNlciBnYXZlIC1SIGZsYWcsIHRoZW4gd2UgbXVzdCBwdXQgdGhlCisgICAgIGRhdGEgZnJhZ3MgaW50byB0aGUgdGV4dCBzZWdtZW50LiBEbyB0aGlzIGJlZm9yZSByZWxheGluZyBzbworICAgICB3ZSBrbm93IHRvIHRha2UgYWR2YW50YWdlIG9mIC1SIGFuZCBtYWtlIHNob3J0ZXIgYWRkcmVzc2VzLiAgKi8KKyNpZiAhZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCisgIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKKyAgICB7CisgICAgICBtZXJnZV9kYXRhX2ludG9fdGV4dCAoKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHJlbGF4X2FuZF9zaXplX3NlZywgKGNoYXIgKikgMCk7CisjZWxzZQorICByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgKCk7CisjZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLworCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKKyAgLyoKKyAgICoKKyAgICogQ3Jhd2wgdGhlIHN5bWJvbCBjaGFpbi4KKyAgICoKKyAgICogRm9yIGVhY2ggc3ltYm9sIHdob3NlIHZhbHVlIGRlcGVuZHMgb24gYSBmcmFnLCB0YWtlIHRoZSBhZGRyZXNzIG9mCisgICAqIHRoYXQgZnJhZyBhbmQgc3Vic3VtZSBpdCBpbnRvIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgorICAgKiBBZnRlciB0aGlzLCB0aGVyZSBpcyBqdXN0IG9uZSB3YXkgdG8gbG9va3VwIGEgc3ltYm9sIHZhbHVlLgorICAgKiBWYWx1ZXMgYXJlIGxlZnQgaW4gdGhlaXIgZmluYWwgc3RhdGUgZm9yIG9iamVjdCBmaWxlIGVtaXNzaW9uLgorICAgKiBXZSBhZGp1c3QgdGhlIHZhbHVlcyBvZiAnTCcgbG9jYWwgc3ltYm9scywgZXZlbiBpZiB3ZSBkbworICAgKiBub3QgaW50ZW5kIHRvIGVtaXQgdGhlbSB0byB0aGUgb2JqZWN0IGZpbGUsIGJlY2F1c2UgdGhlaXIgdmFsdWVzCisgICAqIGFyZSBuZWVkZWQgZm9yIGZpeC11cHMuCisgICAqCisgICAqIFVubGVzcyB3ZSBzYXcgYSAtTCBmbGFnLCByZW1vdmUgYWxsIHN5bWJvbHMgdGhhdCBiZWdpbiB3aXRoICdMJworICAgKiBmcm9tIHRoZSBzeW1ib2wgY2hhaW4uICAoVGhleSBhcmUgc3RpbGwgcG9pbnRlZCB0byBieSB0aGUgZml4ZXMuKQorICAgKgorICAgKiBDb3VudCB0aGUgcmVtYWluaW5nIHN5bWJvbHMuCisgICAqIEFzc2lnbiBhIHN5bWJvbCBudW1iZXIgdG8gZWFjaCBzeW1ib2wuCisgICAqIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaW5nLXRhYmxlIGNoYXJzIHdlIHdpbGwgZW1pdC4KKyAgICogUHV0IHRoaXMgaW5mbyBpbnRvIHRoZSBoZWFkZXJzIGFzIGFwcHJvcHJpYXRlLgorICAgKgorICAgKi8KKyAga25vdyAoemVyb19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9PSAwKTsKKyAgc3RyaW5nX2J5dGVfY291bnQgPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKKworICBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluICgmaGVhZGVycyk7CisKKyAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID09IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpKQorICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKKworICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKKworICAvKgorICAgKiBBZGRyZXNzZXMgb2YgZnJhZ3Mgbm93IHJlZmxlY3QgYWRkcmVzc2VzIHdlIHVzZSBpbiB0aGUgb2JqZWN0IGZpbGUuCisgICAqIFN5bWJvbCB2YWx1ZXMgYXJlIGNvcnJlY3QuCisgICAqIFNjYW4gdGhlIGZyYWdzLCBjb252ZXJ0aW5nIGFueSAiLm9yZyJzIGFuZCAiLmFsaWduInMgdG8gIi5maWxsInMuCisgICAqIEFsc28gY29udmVydGluZyBhbnkgbWFjaGluZS1kZXBlbmRlbnQgZnJhZ3MgdXNpbmcgbWRfY29udmVydF9mcmFnKCk7CisgICAqLworICBzdWJzZWdfY2hhbmdlIChTRUdfVEVYVCwgMCk7CisKKyAgZm9yIChmcmFnUCA9IHRleHRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKKyAgICB7CisgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbGlua2VkIGFsbCB0aGUgZnJhZ3MgaW50byBhIHNpbmdsZQorICAgICAgICAgY2hhaW4uICBIb3dldmVyLCBjdnRfZnJhZ190b19maWxsIG1heSBjYWxsIG1kX2NvbnZlcnRfZnJhZworICAgICAgICAgd2hpY2ggbWF5IGNhbGwgZml4X25ldy4gIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgZml4X25ldyBhZGRzCisgICAgICAgICB0aGUgZml4dXAgdG8gdGhlIHJpZ2h0IHNlY3Rpb24uICAqLworICAgICAgaWYgKGZyYWdQID09IGRhdGFfZnJhZ19yb290KQorCXN1YnNlZ19jaGFuZ2UgKFNFR19EQVRBLCAwKTsKKworICAgICAgY3Z0X2ZyYWdfdG9fZmlsbCAoJmhlYWRlcnMsIFNFR19URVhULCBmcmFnUCk7CisKKyAgICAgIC8qIFNvbWUgYXNzZXJ0IG1hY3JvcyBkb24ndCB3b3JrIHdpdGggIyBkaXJlY3RpdmVzIG1peGVkIGluLiAgKi8KKyNpZm5kZWYgTkRFQlVHCisgICAgICBpZiAoIShmcmFnUC0+ZnJfbmV4dCA9PSBOVUxMCisjaWZkZWYgT0JKX0JPVVQKKwkgICAgfHwgZnJhZ1AtPmZyX25leHQgPT0gZGF0YV9mcmFnX3Jvb3QKKyNlbmRpZgorCSAgICB8fCAoKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZ1AtPmZyX2FkZHJlc3MpCisJCT09IChmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX29mZnNldCAqIGZyYWdQLT5mcl92YXIpKSkpCisJYWJvcnQgKCk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCisKKyNpZm5kZWYgV09SS0lOR19ET1RfV09SRAorICB7CisgICAgc3RydWN0IGJyb2tlbl93b3JkICpsaWU7CisgICAgc3RydWN0IGJyb2tlbl93b3JkICoqcHJldlA7CisKKyAgICBwcmV2UCA9ICZicm9rZW5fd29yZHM7CisgICAgZm9yIChsaWUgPSBicm9rZW5fd29yZHM7IGxpZTsgbGllID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkKQorICAgICAgaWYgKCFsaWUtPmFkZGVkKQorCXsKKwkgIGV4cHJlc3Npb25TIGV4cDsKKworCSAgc3Vic2VnX2NoYW5nZSAobGllLT5zZWcsIGxpZS0+c3Vic2VnKTsKKwkgIGV4cC5YX29wID0gT19zdWJ0cmFjdDsKKwkgIGV4cC5YX2FkZF9zeW1ib2wgPSBsaWUtPmFkZDsKKwkgIGV4cC5YX29wX3N5bWJvbCA9IGxpZS0+c3ViOworCSAgZXhwLlhfYWRkX251bWJlciA9IGxpZS0+YWRkbnVtOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyNpZmRlZiBUQ19DT05TX0ZJWF9ORVcKKwkgIFRDX0NPTlNfRklYX05FVyAobGllLT5mcmFnLAorCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKKwkJICAgICAgIDIsICZleHApOworI2Vsc2UKKwkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCisJCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAorCQkgICAgICAgMiwgJmV4cCwgMCwgQkZEX1JFTE9DXzE2KTsKKyNlbmRpZgorI2Vsc2UKKyNpZiBkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspIHx8IGRlZmluZWQoTkVFRF9GWF9SX1RZUEUpCisJICBmaXhfbmV3X2V4cCAobGllLT5mcmFnLAorCQkgICAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKKwkJICAgICAgIDIsICZleHAsIDAsIE5PX1JFTE9DKTsKKyNlbHNlCisjaWZkZWYgVENfTlMzMksKKwkgIGZpeF9uZXdfbnMzMmtfZXhwIChsaWUtPmZyYWcsCisJCQkgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCisJCQkgICAgIDIsICZleHAsIDAsIDAsIDIsIDAsIDApOworI2Vsc2UKKwkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCisJCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAorCQkgICAgICAgMiwgJmV4cCwgMCwgMCk7CisjZW5kaWYgLyogVENfTlMzMksgKi8KKyNlbmRpZiAvKiBUQ19TUEFSQ3xUQ19BMjlLfE5FRURfRlhfUl9UWVBFICovCisjZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLworCSAgKnByZXZQID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOworCX0KKyAgICAgIGVsc2UKKwlwcmV2UCA9ICYobGllLT5uZXh0X2Jyb2tlbl93b3JkKTsKKworICAgIGZvciAobGllID0gYnJva2VuX3dvcmRzOyBsaWU7KQorICAgICAgeworCXN0cnVjdCBicm9rZW5fd29yZCAqdW50cnV0aDsKKwljaGFyICp0YWJsZV9wdHI7CisJYWRkcmVzc1QgdGFibGVfYWRkcjsKKwlhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7CisJaW50IG4sIG07CisKKwlzdWJzZWdfY2hhbmdlIChsaWUtPnNlZywgbGllLT5zdWJzZWcpOworCWZyYWdQID0gbGllLT5kaXNwZnJhZzsKKworCS8qIEZpbmQgb3V0IGhvdyBtYW55IGJyb2tlbl93b3JkcyBnbyBoZXJlLiAgKi8KKwluID0gMDsKKwlmb3IgKHVudHJ1dGggPSBsaWU7IHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gZnJhZ1A7IHVudHJ1dGggPSB1bnRydXRoLT5uZXh0X2Jyb2tlbl93b3JkKQorCSAgaWYgKHVudHJ1dGgtPmFkZGVkID09IDEpCisJICAgIG4rKzsKKworCXRhYmxlX3B0ciA9IGxpZS0+ZGlzcGZyYWctPmZyX29wY29kZTsKKwl0YWJsZV9hZGRyID0gbGllLT5kaXNwZnJhZy0+ZnJfYWRkcmVzcyArICh0YWJsZV9wdHIgLSBsaWUtPmRpc3BmcmFnLT5mcl9saXRlcmFsKTsKKwkvKiBDcmVhdGUgdGhlIGp1bXAgYXJvdW5kIHRoZSBsb25nIGp1bXBzLiAgVGhpcyBpcyBhIHNob3J0CisJICAganVtcCBmcm9tIHRhYmxlX3B0ciswIHRvIHRhYmxlX3B0cituKmxvbmdfanVtcF9zaXplLiAgKi8KKwlmcm9tX2FkZHIgPSB0YWJsZV9hZGRyOworCXRvX2FkZHIgPSB0YWJsZV9hZGRyICsgbWRfc2hvcnRfanVtcF9zaXplICsgbiAqIG1kX2xvbmdfanVtcF9zaXplOworCW1kX2NyZWF0ZV9zaG9ydF9qdW1wICh0YWJsZV9wdHIsIGZyb21fYWRkciwgdG9fYWRkciwgbGllLT5kaXNwZnJhZywgbGllLT5hZGQpOworCXRhYmxlX3B0ciArPSBtZF9zaG9ydF9qdW1wX3NpemU7CisJdGFibGVfYWRkciArPSBtZF9zaG9ydF9qdW1wX3NpemU7CisKKwlmb3IgKG0gPSAwOyBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsgbSsrLCBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCisJICB7CisJICAgIGlmIChsaWUtPmFkZGVkID09IDIpCisJICAgICAgY29udGludWU7CisJICAgIC8qIFBhdGNoIHRoZSBqdW1wIHRhYmxlICovCisJICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBmcm9tID8/PyB0byB0YWJsZV9wdHIrMCAqLworCSAgICB0b19hZGRyID0gdGFibGVfYWRkciAtIFNfR0VUX1ZBTFVFIChsaWUtPnN1Yik7CisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCSAgICB0b19hZGRyIC09IGxpZS0+c3ViLT5zeV9mcmFnLT5mcl9hZGRyZXNzOworI2VuZGlmCisJICAgIG1kX251bWJlcl90b19jaGFycyAobGllLT53b3JkX2dvZXNfaGVyZSwgdG9fYWRkciwgMik7CisJICAgIGZvciAodW50cnV0aCA9IGxpZS0+bmV4dF9icm9rZW5fd29yZDsgdW50cnV0aCAmJiB1bnRydXRoLT5kaXNwZnJhZyA9PSBmcmFnUDsgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCisJICAgICAgeworCQlpZiAodW50cnV0aC0+dXNlX2p1bXAgPT0gbGllKQorCQkgIG1kX251bWJlcl90b19jaGFycyAodW50cnV0aC0+d29yZF9nb2VzX2hlcmUsIHRvX2FkZHIsIDIpOworCSAgICAgIH0KKworCSAgICAvKiBJbnN0YWxsIHRoZSBsb25nIGp1bXAgKi8KKwkgICAgLyogdGhpcyBpcyBhIGxvbmcganVtcCBmcm9tIHRhYmxlX3B0ciswIHRvIHRoZSBmaW5hbCB0YXJnZXQgKi8KKwkgICAgZnJvbV9hZGRyID0gdGFibGVfYWRkcjsKKwkgICAgdG9fYWRkciA9IFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkgKyBsaWUtPmFkZG51bTsKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisJICAgIHRvX2FkZHIgKz0gbGllLT5hZGQtPnN5X2ZyYWctPmZyX2FkZHJlc3M7CisjZW5kaWYKKwkgICAgbWRfY3JlYXRlX2xvbmdfanVtcCAodGFibGVfcHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxpZS0+ZGlzcGZyYWcsIGxpZS0+YWRkKTsKKwkgICAgdGFibGVfcHRyICs9IG1kX2xvbmdfanVtcF9zaXplOworCSAgICB0YWJsZV9hZGRyICs9IG1kX2xvbmdfanVtcF9zaXplOworCSAgfQorICAgICAgfQorICB9CisjZW5kaWYgLyogbm90IFdPUktJTkdfRE9UX1dPUkQgKi8KKworI2lmbmRlZiBCRkRfQVNTRU1CTEVSCisjaWZuZGVmCU9CSl9WTVMKKyAgewkJCQkvKiBub3Qgdm1zICovCisgICAgY2hhciAqdGhlX29iamVjdF9maWxlOworICAgIGxvbmcgb2JqZWN0X2ZpbGVfc2l6ZTsKKyAgICAvKgorICAgICAqIFNjYW4gZXZlcnkgRml4UyBwZXJmb3JtaW5nIGZpeHVwcy4gV2UgaGFkIHRvIHdhaXQgdW50aWwgbm93IHRvIGRvCisgICAgICogdGhpcyBiZWNhdXNlIG1kX2NvbnZlcnRfZnJhZygpIG1heSBoYXZlIG1hZGUgc29tZSBmaXhTcy4KKyAgICAgKi8KKyAgICBpbnQgdHJzaXplLCBkcnNpemU7CisKKyAgICBzdWJzZWdfY2hhbmdlIChTRUdfVEVYVCwgMCk7CisgICAgdHJzaXplID0gbWRfcmVsb2Nfc2l6ZSAqIGZpeHVwX3NlZ21lbnQgKHRleHRfZml4X3Jvb3QsIFNFR19URVhUKTsKKyAgICBzdWJzZWdfY2hhbmdlIChTRUdfREFUQSwgMCk7CisgICAgZHJzaXplID0gbWRfcmVsb2Nfc2l6ZSAqIGZpeHVwX3NlZ21lbnQgKGRhdGFfZml4X3Jvb3QsIFNFR19EQVRBKTsKKyAgICBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzLCB0cnNpemUsIGRyc2l6ZSk7CisKKyAgICAvKiBGSVhNRSBtb3ZlIHRoaXMgc3R1ZmYgaW50byB0aGUgcHJlLXdyaXRlLWhvb2sgKi8KKyAgICBIX1NFVF9NQUdJQ19OVU1CRVIgKCZoZWFkZXJzLCBtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlKTsKKyAgICBIX1NFVF9FTlRSWV9QT0lOVCAoJmhlYWRlcnMsIDApOworCisgICAgb2JqX3ByZV93cml0ZV9ob29rICgmaGVhZGVycyk7CS8qIGV4dHJhIGNvZmYgc3R1ZmYgKi8KKworICAgIG9iamVjdF9maWxlX3NpemUgPSBIX0dFVF9GSUxFX1NJWkUgKCZoZWFkZXJzKTsKKyAgICBuZXh0X29iamVjdF9maWxlX2NoYXJQID0gdGhlX29iamVjdF9maWxlID0geG1hbGxvYyAob2JqZWN0X2ZpbGVfc2l6ZSk7CisKKyAgICBvdXRwdXRfZmlsZV9jcmVhdGUgKG91dF9maWxlX25hbWUpOworCisgICAgb2JqX2hlYWRlcl9hcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAmaGVhZGVycyk7CisKKyAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSk7CisKKyAgICAvKgorICAgICAqIEVtaXQgY29kZS4KKyAgICAgKi8KKyAgICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQorICAgICAgeworCXJlZ2lzdGVyIGxvbmcgY291bnQ7CisJcmVnaXN0ZXIgY2hhciAqZmlsbF9saXRlcmFsOworCXJlZ2lzdGVyIGxvbmcgZmlsbF9zaXplOworCisJUFJPR1JFU1MgKDEpOworCWtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX2ZpbGwpOworCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGZyYWdQLT5mcl9saXRlcmFsLCAodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2ZpeCk7CisJZmlsbF9saXRlcmFsID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4OworCWZpbGxfc2l6ZSA9IGZyYWdQLT5mcl92YXI7CisJa25vdyAoZnJhZ1AtPmZyX29mZnNldCA+PSAwKTsKKworCWZvciAoY291bnQgPSBmcmFnUC0+ZnJfb2Zmc2V0OyBjb3VudDsgY291bnQtLSkKKwkgIHsKKwkgICAgYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZmlsbF9saXRlcmFsLCAodW5zaWduZWQgbG9uZykgZmlsbF9zaXplKTsKKwkgIH0JCQkvKiBmb3IgZWFjaCAgKi8KKworICAgICAgfQkJCQkvKiBmb3IgZWFjaCBjb2RlIGZyYWcuICovCisKKyAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpKSk7CisKKyAgICAvKgorICAgICAqIEVtaXQgcmVsb2NhdGlvbnMuCisgICAgICovCisgICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCB0ZXh0X2ZpeF9yb290LCAocmVsYXhfYWRkcmVzc1QpIDApOworICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpKSk7CisjaWZkZWYgVENfSTk2MAorICAgIC8qIE1ha2UgYWRkcmVzc2VzIGluIGRhdGEgcmVsb2NhdGlvbiBkaXJlY3RpdmVzIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgorICAgICAqIGZpcnN0IGRhdGEgZnJhZ21lbnQsIG5vdCBlbmQgb2YgbGFzdCB0ZXh0IGZyYWdtZW50OiAgYWxpZ25tZW50IG9mIHRoZQorICAgICAqIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQgbWF5IHBsYWNlIGEgZ2FwIGJldHdlZW4gdGhlIHNlZ21lbnRzLgorICAgICAqLworICAgIG9ial9lbWl0X3JlbG9jYXRpb25zICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZGF0YV9maXhfcm9vdCwgZGF0YTBfZnJjaGFpblAtPmZyY2hfcm9vdC0+ZnJfYWRkcmVzcyk7CisjZWxzZSAvKiBUQ19JOTYwICovCisgICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBkYXRhX2ZpeF9yb290LCB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyk7CisjZW5kaWYgLyogVENfSTk2MCAqLworCisgICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpKSk7CisKKyAgICAvKgorICAgICAqIEVtaXQgbGluZSBudW1iZXIgZW50cmllcy4KKyAgICAgKi8KKyAgICBPQkpfRU1JVF9MSU5FTk8gKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBsaW5lbm9fcm9vdFAsIHRoZV9vYmplY3RfZmlsZSk7CisgICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfTElORU5PX1NJWkUgKCZoZWFkZXJzKSkpOworCisgICAgLyoKKyAgICAgKiBFbWl0IHN5bWJvbHMuCisgICAgICovCisgICAgb2JqX2VtaXRfc3ltYm9scyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIHN5bWJvbF9yb290UCk7CisgICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfTElORU5PX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycykpKTsKKworICAgIC8qCisgICAgICogRW1pdCBzdHJpbmdzLgorICAgICAqLworCisgICAgaWYgKHN0cmluZ19ieXRlX2NvdW50ID4gMCkKKyAgICAgIHsKKwlvYmpfZW1pdF9zdHJpbmdzICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCk7CisgICAgICB9CQkJCS8qIG9ubHkgaWYgd2UgaGF2ZSBhIHN0cmluZyB0YWJsZSAqLworCisjaWZkZWYgQkZEX0hFQURFUlMKKyAgICBiZmRfc2VlayAoc3Rkb3V0cHV0LCAwLCAwKTsKKyAgICBiZmRfd3JpdGUgKHRoZV9vYmplY3RfZmlsZSwgMSwgb2JqZWN0X2ZpbGVfc2l6ZSwgc3Rkb3V0cHV0KTsKKyNlbHNlCisKKyAgICAvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZSAqLworICAgIG91dHB1dF9maWxlX2FwcGVuZCAodGhlX29iamVjdF9maWxlLCBvYmplY3RfZmlsZV9zaXplLCBvdXRfZmlsZV9uYW1lKTsKKyAgICBmcmVlICh0aGVfb2JqZWN0X2ZpbGUpOworI2VuZGlmCisgIH0JCQkJLyogbm9uIHZtcyBvdXRwdXQgKi8KKyNlbHNlIC8qIE9CSl9WTVMgKi8KKyAgLyoKKyAgICoJTm93IGRvIHRoZSBWTVMtZGVwZW5kZW50IHBhcnQgb2Ygd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUKKyAgICovCisgIHZtc193cml0ZV9vYmplY3RfZmlsZSAoSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyksCisJCQkgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycyksCisJCQkgSF9HRVRfQlNTX1NJWkUgKCZoZWFkZXJzKSwKKwkJCSB0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QpOworI2VuZGlmIC8qIE9CSl9WTVMgKi8KKyNlbHNlIC8qIEJGRF9BU1NFTUJMRVIgKi8KKworICAvKiBSZXNvbHZlIHN5bWJvbCB2YWx1ZXMuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHByb2Nlc3NpbmcKKyAgICAgdGhlIHJlbG9jYXRpb25zLiAgKi8KKyAgaWYgKHN5bWJvbF9yb290UCkKKyAgICB7CisgICAgICBzeW1ib2xTICpzeW1wOworCisgICAgICBmb3IgKHN5bXAgPSBzeW1ib2xfcm9vdFA7IHN5bXA7IHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCisJaWYgKCFzeW1wLT5zeV9yZXNvbHZlZCkKKwkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1wLCAxKTsKKyAgICB9CisKKyAgUFJPR1JFU1MgKDEpOworCisjaWZkZWYgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKKyAgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCk7CisjZW5kaWYKKyNpZmRlZiBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKKyAgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpOworI2VuZGlmCisKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFkanVzdF9yZWxvY19zeW1zLCAoY2hhciAqKTApOworCisgIC8qIFNldCB1cCBzeW1ib2wgdGFibGUsIGFuZCB3cml0ZSBpdCBvdXQuICAqLworICBpZiAoc3ltYm9sX3Jvb3RQKQorICAgIHsKKyAgICAgIHN5bWJvbFMgKnN5bXA7CisKKyAgICAgIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKKwl7CisJICBpbnQgcHVudCA9IDA7CisJICBjb25zdCBjaGFyICpuYW1lOworCisJICBpZiAoc3ltcC0+c3lfbXJpX2NvbW1vbikKKwkgICAgeworCSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKKwkJYXNfYmFkIChfKCIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiKSwKKwkJCVNfR0VUX05BTUUgKHN5bXApKTsKKwkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBuYW1lID0gU19HRVRfTkFNRSAoc3ltcCk7CisJICBpZiAobmFtZSkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUyID0gZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUgKChjaGFyICopU19HRVRfTkFNRSAoc3ltcCkpOworCSAgICAgIC8qIFRoZXkgb25seSBkaWZmZXIgaWYgYG5hbWUnIGlzIGEgZmIgb3IgZG9sbGFyIGxvY2FsCisJCSBsYWJlbCBuYW1lLiAgKi8KKwkgICAgICBpZiAobmFtZTIgIT0gbmFtZSAmJiAhIFNfSVNfREVGSU5FRCAoc3ltcCkpCisJCWFzX2JhZCAoXygibG9jYWwgbGFiZWwgJXMgaXMgbm90IGRlZmluZWQiKSwgbmFtZTIpOworCSAgICB9CisKKwkgIC8qIERvIGl0IGFnYWluLCBiZWNhdXNlIGFkanVzdF9yZWxvY19zeW1zIG1pZ2h0IGludHJvZHVjZQorCSAgICAgbW9yZSBzeW1ib2xzLiAgVGhleSdsbCBwcm9iYWJseSBvbmx5IGJlIHNlY3Rpb24gc3ltYm9scywKKwkgICAgIGJ1dCB0aGV5J2xsIHN0aWxsIG5lZWQgdG8gaGF2ZSB0aGUgdmFsdWVzIGNvbXB1dGVkLiAgKi8KKwkgIGlmICghIHN5bXAtPnN5X3Jlc29sdmVkKQorCSAgICB7CisJICAgICAgaWYgKHN5bXAtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudCkKKwkJeworCQkgIC8qIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlOyBza2lwIHRoZSBjYWxsLiAgKi8KKwkJICBTX1NFVF9WQUxVRSAoc3ltcCwKKwkJCSAgICAgICAoU19HRVRfVkFMVUUgKHN5bXApCisJCQkJKyBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzKSk7CisJCSAgc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOworCQl9CisJICAgICAgZWxzZQorCQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgMSk7CisJICAgIH0KKworCSAgLyogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byB1bmRlZmluZWQgb3IgY29tbW9uCisgICAgICAgICAgICAgc3ltYm9scy4gICovCisJICBpZiAoc3ltcC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAorCSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltcCkgfHwgU19JU19DT01NT04gKHN5bXApKSkKKwkgICAgeworCSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bXAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFNvIGZhciwgY29tbW9uIHN5bWJvbHMgaGF2ZSBiZWVuIHRyZWF0ZWQgbGlrZSB1bmRlZmluZWQgc3ltYm9scy4KKwkgICAgIFB1dCB0aGVtIGluIHRoZSBjb21tb24gc2VjdGlvbiBub3cuICAqLworCSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltcCkgPT0gMAorCSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW1wKSAhPSAwKQorCSAgICBTX1NFVF9TRUdNRU5UIChzeW1wLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKKyNpZiAwCisJICBwcmludGYgKCJzeW1ib2wgYCVzJ1xuXHRAJXg6IHZhbHVlPSVkIGZsYWdzPSV4IHNlZz0lc1xuIiwKKwkJICBTX0dFVF9OQU1FIChzeW1wKSwgc3ltcCwKKwkJICBTX0dFVF9WQUxVRSAoc3ltcCksCisJCSAgc3ltcC0+YnN5bS0+ZmxhZ3MsCisJCSAgc2VnbWVudF9uYW1lIChzeW1wLT5ic3ltLT5zZWN0aW9uKSk7CisjZW5kaWYKKworI2lmZGVmIG9ial9mcm9iX3N5bWJvbAorCSAgb2JqX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KTsKKyNlbmRpZgorI2lmZGVmIHRjX2Zyb2Jfc3ltYm9sCisJICBpZiAoISBwdW50IHx8IHN5bXAtPnN5X3VzZWRfaW5fcmVsb2MpCisJICAgIHRjX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KTsKKyNlbmRpZgorCisJICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIGtlZXAgdGhpcyBzeW1ib2wsIHNwbGljZSBpdCBvdXQgb2YKKwkgICAgIHRoZSBjaGFpbiBub3cuICBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyAwLCB3ZSBuZXZlcgorCSAgICAgd2FudCBzZWN0aW9uIHN5bWJvbHMuICBPdGhlcndpc2UsIHdlIHNraXAgbG9jYWwgc3ltYm9scworCSAgICAgYW5kIHN5bWJvbHMgdGhhdCB0aGUgZnJvYl9zeW1ib2wgbWFjcm9zIHRvbGQgdXMgdG8gcHVudCwKKwkgICAgIGJ1dCB3ZSBrZWVwIHN1Y2ggc3ltYm9scyBpZiB0aGV5IGFyZSB1c2VkIGluIHJlbG9jcy4gICovCisJICBpZiAoKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKKwkgICAgICAgJiYgKHN5bXAtPmJzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQorCSAgICAgIC8qIE5vdGUgdGhhdCBTX0lTX0VYVEVSTiBhbmQgU19JU19MT0NBTCBhcmUgbm90IGFsd2F5cworCQkgb3Bwb3NpdGVzLiAgU29tZXRpbWVzIHRoZSBmb3JtZXIgY2hlY2tzIGZsYWdzIGFuZCB0aGUKKwkJIGxhdHRlciBleGFtaW5lcyB0aGUgbmFtZS4uLiAgKi8KKwkgICAgICB8fCAoIVNfSVNfRVhURVJOIChzeW1wKQorCQkgICYmIChTX0lTX0xPQ0FMIChzeW1wKSB8fCBwdW50KQorCQkgICYmICEgc3ltcC0+c3lfdXNlZF9pbl9yZWxvYykpCisJICAgIHsKKwkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKKwkgICAgICAvKiBBZnRlciBzeW1ib2xfcmVtb3ZlLCBzeW1ib2xfbmV4dChzeW1wKSBzdGlsbCByZXR1cm5zCisJCSB0aGUgb25lIHRoYXQgY2FtZSBhZnRlciBpdCBpbiB0aGUgY2hhaW4uICBTbyB3ZSBkb24ndAorCQkgbmVlZCB0byBkbyBhbnkgZXh0cmEgY2xlYW51cCB3b3JrIGhlcmUuICAqLworCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogTWFrZSBzdXJlIHdlIHJlYWxseSBnb3QgYSB2YWx1ZSBmb3IgdGhlIHN5bWJvbC4gICovCisJICBpZiAoISBzeW1wLT5zeV9yZXNvbHZlZCkKKwkgICAgeworCSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgcmVzb2x2ZSB2YWx1ZSBmb3Igc3ltYm9sIFwiJXNcIiIpLAorCQkgICAgICBTX0dFVF9OQU1FIChzeW1wKSk7CisJICAgICAgc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOworCSAgICB9CisKKwkgIC8qIFNldCB0aGUgdmFsdWUgaW50byB0aGUgQkZEIHN5bWJvbC4gIFVwIHRpbCBub3cgdGhlIHZhbHVlCisJICAgICBoYXMgb25seSBiZWVuIGtlcHQgaW4gdGhlIGdhcyBzeW1ib2xTIHN0cnVjdC4gICovCisJICBzeW1wLT5ic3ltLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1wKTsKKwl9CisgICAgfQorCisgIFBST0dSRVNTICgxKTsKKworICAvKiBOb3cgZG8gYW55IGZvcm1hdC1zcGVjaWZpYyBhZGp1c3RtZW50cyB0byB0aGUgc3ltYm9sIHRhYmxlLCBzdWNoCisgICAgIGFzIGFkZGluZyBmaWxlIHN5bWJvbHMuICAqLworI2lmZGVmIHRjX2FkanVzdF9zeW10YWIKKyAgdGNfYWRqdXN0X3N5bXRhYiAoKTsKKyNlbmRpZgorI2lmZGVmIG9ial9hZGp1c3Rfc3ltdGFiCisgIG9ial9hZGp1c3Rfc3ltdGFiICgpOworI2VuZGlmCisKKyAgLyogTm93IHRoYXQgYWxsIHRoZSBzaXplcyBhcmUga25vd24sIGFuZCBjb250ZW50cyBjb3JyZWN0LCB3ZSBjYW4KKyAgICAgc3RhcnQgd3JpdGluZyB0byB0aGUgZmlsZS4gICovCisgIHNldF9zeW10YWIgKCk7CisKKyAgLyogSWYgKl9mcm9iX2ZpbGUgY2hhbmdlcyB0aGUgc3ltYm9sIHZhbHVlIGF0IHRoaXMgcG9pbnQsIGl0IGlzCisgICAgIHJlc3BvbnNpYmxlIGZvciBtb3ZpbmcgdGhlIGNoYW5nZWQgdmFsdWUgaW50byBzeW1wLT5ic3ltLT52YWx1ZQorICAgICBhcyB3ZWxsLiAgSG9wZWZ1bGx5IGFsbCBzeW1ib2wgdmFsdWUgY2hhbmdpbmcgY2FuIGJlIGRvbmUgaW4KKyAgICAgKl9mcm9iX3N5bWJvbC4gICovCisjaWZkZWYgdGNfZnJvYl9maWxlCisgIHRjX2Zyb2JfZmlsZSAoKTsKKyNlbmRpZgorI2lmZGVmIG9ial9mcm9iX2ZpbGUKKyAgb2JqX2Zyb2JfZmlsZSAoKTsKKyNlbmRpZgorCisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCB3cml0ZV9yZWxvY3MsIChjaGFyICopIDApOworCisjaWZkZWYgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcworICB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpOworI2VuZGlmCisjaWZkZWYgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKKyAgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCk7CisjZW5kaWYKKworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgd3JpdGVfY29udGVudHMsIChjaGFyICopIDApOworI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KK30KKyNlbmRpZiAvKiAhIEJGRCAqLworCisvKgorICoJCQlyZWxheF9zZWdtZW50KCkKKyAqCisgKiBOb3cgd2UgaGF2ZSBhIHNlZ21lbnQsIG5vdCBhIGNyb3dkIG9mIHN1Yi1zZWdtZW50cywgd2UgY2FuIG1ha2UgZnJfYWRkcmVzcworICogdmFsdWVzLgorICoKKyAqIFJlbGF4IHRoZSBmcmFncy4KKyAqCisgKiBBZnRlciB0aGlzLCBhbGwgZnJhZ3MgaW4gdGhpcyBzZWdtZW50IGhhdmUgYWRkcmVzc2VzIHRoYXQgYXJlIGNvcnJlY3QKKyAqIHdpdGhpbiB0aGUgc2VnbWVudC4gU2luY2Ugc2VnbWVudHMgbGl2ZSBpbiBkaWZmZXJlbnQgZmlsZSBhZGRyZXNzZXMsCisgKiB0aGVzZSBmcmFnIGFkZHJlc3NlcyBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIGZpbmFsIG9iamVjdC1maWxlIGFkZHJlc3Nlcy4KKyAqLworCisjaWZkZWYgVENfR0VORVJJQ19SRUxBWF9UQUJMRQorCitzdGF0aWMgaW50IGlzX2RucmFuZ2UgUEFSQU1TICgoZnJhZ1MgKiwgZnJhZ1MgKikpOworCisvKiBTdWJyb3V0aW5lcyBvZiByZWxheF9zZWdtZW50LiAgKi8KK3N0YXRpYyBpbnQKK2lzX2RucmFuZ2UgKGYxLCBmMikKKyAgICAgZnJhZ1MgKmYxOworICAgICBmcmFnUyAqZjI7Cit7CisgIGZvciAoOyBmMTsgZjEgPSBmMS0+ZnJfbmV4dCkKKyAgICBpZiAoZjEtPmZyX25leHQgPT0gZjIpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJlbGF4IGEgZnJhZ21lbnQgYnkgc2Nhbm5pbmcgVENfR0VORVJJQ19SRUxBWF9UQUJMRS4gICovCisKK2xvbmcKK3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQorICAgICBmcmFnUyAqZnJhZ1A7CisgICAgIGxvbmcgc3RyZXRjaDsKK3sKKyAgY29uc3QgcmVsYXhfdHlwZVMgKnRoaXNfdHlwZTsKKyAgY29uc3QgcmVsYXhfdHlwZVMgKnN0YXJ0X3R5cGU7CisgIHJlbGF4X3N1YnN0YXRlVCBuZXh0X3N0YXRlOworICByZWxheF9zdWJzdGF0ZVQgdGhpc19zdGF0ZTsKKyAgbG9uZyBhaW0sIHRhcmdldCwgZ3Jvd3RoOworICBzeW1ib2xTICpzeW1ib2xQID0gZnJhZ1AtPmZyX3N5bWJvbDsKKyAgbG9uZyBvZmZzZXQgPSBmcmFnUC0+ZnJfb2Zmc2V0OworICAvKiBSZWNvbXB1dGUgd2FzX2FkZHJlc3MgYnkgdW5kb2luZyAiKz0gc3RyZXRjaCIgZG9uZSBieSByZWxheF9zZWdtZW50LiAgKi8KKyAgdW5zaWduZWQgbG9uZyB3YXNfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzIC0gc3RyZXRjaDsKKyAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3M7CisgIGNvbnN0IHJlbGF4X3R5cGVTICp0YWJsZSA9IFRDX0dFTkVSSUNfUkVMQVhfVEFCTEU7CisKKyAgdGhpc19zdGF0ZSA9IGZyYWdQLT5mcl9zdWJ0eXBlOworICBzdGFydF90eXBlID0gdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOworICB0YXJnZXQgPSBvZmZzZXQ7CisKKyAgaWYgKHN5bWJvbFApCisgICAgeworI2lmbmRlZiBESUZGX0VYUFJfT0sKKyNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCisgICAgICBrbm93ICgoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQorCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0RBVEEpCisJICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQlNTKQorCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX1RFWFQpKTsKKyNlbmRpZgorICAgICAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyk7CisjZW5kaWYKKyAgICAgIGtub3cgKCEoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwkgICAgfHwgc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOworICAgICAgdGFyZ2V0ICs9CisJU19HRVRfVkFMVUUgKHN5bWJvbFApCisJICArIHN5bWJvbFAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7CisKKyAgICAgIC8qIElmIGZyYWcgaGFzIHlldCB0byBiZSByZWFjaGVkIG9uIHRoaXMgcGFzcywKKwkgYXNzdW1lIGl0IHdpbGwgbW92ZSBieSBTVFJFVENIIGp1c3QgYXMgd2UgZGlkLgorCSBJZiB0aGlzIGlzIG5vdCBzbywgaXQgd2lsbCBiZSBiZWNhdXNlIHNvbWUgZnJhZworCSBiZXR3ZWVuIGdyb3dzLCBhbmQgdGhhdCB3aWxsIGZvcmNlIGFub3RoZXIgcGFzcy4KKworCSBCZXdhcmUgemVyby1sZW5ndGggZnJhZ3MuCisKKwkgVGhlcmUgc2hvdWxkIGJlIGEgZmFzdGVyIHdheSB0byBkbyB0aGlzLiAgKi8KKworICAgICAgaWYgKHN5bWJvbFAtPnN5X2ZyYWctPmZyX2FkZHJlc3MgPj0gd2FzX2FkZHJlc3MKKwkgICYmIGlzX2RucmFuZ2UgKGZyYWdQLCBzeW1ib2xQLT5zeV9mcmFnKSkKKwl7CisJICB0YXJnZXQgKz0gc3RyZXRjaDsKKwl9CisgICAgfQorCisgIGFpbSA9IHRhcmdldCAtIGFkZHJlc3MgLSBmcmFnUC0+ZnJfZml4OworI2lmZGVmIFRDX1BDUkVMX0FESlVTVAorICAvKiBDdXJyZW50bHkgb25seSB0aGUgbnMzMmsgZmFtaWx5IG5lZWRzIHRoaXMgKi8KKyAgYWltICs9IFRDX1BDUkVMX0FESlVTVChmcmFnUCk7CisvKiNlbHNlKi8KKyAgLyogVGhpcyBtYWNoaW5lIGRvZXNuJ3Qgd2FudCB0byB1c2UgcGNyZWxfYWRqdXN0LgorICAgICBJbiB0aGF0IGNhc2UsIHBjcmVsX2FkanVzdCBzaG91bGQgYmUgemVyby4gICovCisvKiAgYXNzZXJ0IChmcmFnUC0+ZnJfdGFyZy5uczMyay5wY3JlbF9hZGp1c3QgPT0gMCk7Ki8KKyNlbmRpZgorI2lmZGVmIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiAvKiBmb3JtZXJseSBjYWxsZWQgTTY4S19BSU1fS0xVREdFICovCisgIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiAoZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKTsKKyNlbmRpZgorCisgIGlmIChhaW0gPCAwKQorICAgIHsKKyAgICAgIC8qIExvb2sgYmFja3dhcmRzLiAqLworICAgICAgZm9yIChuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsgbmV4dF9zdGF0ZTspCisJaWYgKGFpbSA+PSB0aGlzX3R5cGUtPnJseF9iYWNrd2FyZCkKKwkgIG5leHRfc3RhdGUgPSAwOworCWVsc2UKKwkgIHsKKwkgICAgLyogR3JvdyB0byBuZXh0IHN0YXRlLiAqLworCSAgICB0aGlzX3N0YXRlID0gbmV4dF9zdGF0ZTsKKwkgICAgdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOworCSAgICBuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsKKwkgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBMb29rIGZvcndhcmRzLiAqLworICAgICAgZm9yIChuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsgbmV4dF9zdGF0ZTspCisJaWYgKGFpbSA8PSB0aGlzX3R5cGUtPnJseF9mb3J3YXJkKQorCSAgbmV4dF9zdGF0ZSA9IDA7CisJZWxzZQorCSAgeworCSAgICAvKiBHcm93IHRvIG5leHQgc3RhdGUuICovCisJICAgIHRoaXNfc3RhdGUgPSBuZXh0X3N0YXRlOworCSAgICB0aGlzX3R5cGUgPSB0YWJsZSArIHRoaXNfc3RhdGU7CisJICAgIG5leHRfc3RhdGUgPSB0aGlzX3R5cGUtPnJseF9tb3JlOworCSAgfQorICAgIH0KKworICBncm93dGggPSB0aGlzX3R5cGUtPnJseF9sZW5ndGggLSBzdGFydF90eXBlLT5ybHhfbGVuZ3RoOworICBpZiAoZ3Jvd3RoICE9IDApCisgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSB0aGlzX3N0YXRlOworICByZXR1cm4gZ3Jvd3RoOworfQorCisjZW5kaWYgLyogZGVmaW5lZCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSkgKi8KKworLyogUmVsYXhfYWxpZ24uIEFkdmFuY2UgbG9jYXRpb24gY291bnRlciB0byBuZXh0IGFkZHJlc3MgdGhhdCBoYXMgJ2FsaWdubWVudCcKKyAgIGxvd2VzdCBvcmRlciBiaXRzIGFsbCAwcywgcmV0dXJuIHNpemUgb2YgYWRqdXN0bWVudCBtYWRlLiAgKi8KK3N0YXRpYyByZWxheF9hZGRyZXNzVAorcmVsYXhfYWxpZ24gKGFkZHJlc3MsIGFsaWdubWVudCkKKyAgICAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsJLyogQWRkcmVzcyBub3cuICovCisgICAgIHJlZ2lzdGVyIGludCBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KK3sKKyAgcmVsYXhfYWRkcmVzc1QgbWFzazsKKyAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7CisKKyAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOworICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOworI2lmZGVmIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKKyAgaWYgKGxpbmtyZWxheCkKKyAgICAvKiBXZSBtdXN0IHByb3ZpZGUgbG90cyBvZiBwYWRkaW5nLCBzbyB0aGUgbGlua2VyIGNhbiBkaXNjYXJkIGl0CisgICAgICAgd2hlbiBuZWVkZWQuICBUaGUgbGlua2VyIHdpbGwgbm90IGFkZCBleHRyYSBzcGFjZSwgZXZlci4gICovCisgICAgbmV3X2FkZHJlc3MgKz0gKDEgPDwgYWxpZ25tZW50KTsKKyNlbmRpZgorICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Cit9CisKK3ZvaWQKK3JlbGF4X3NlZ21lbnQgKHNlZ21lbnRfZnJhZ19yb290LCBzZWdtZW50KQorICAgICBzdHJ1Y3QgZnJhZyAqc2VnbWVudF9mcmFnX3Jvb3Q7CisgICAgIHNlZ1Qgc2VnbWVudDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYWcgKmZyYWdQOworICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOworI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKKyAga25vdyAoc2VnbWVudCA9PSBTRUdfREFUQSB8fCBzZWdtZW50ID09IFNFR19URVhUIHx8IHNlZ21lbnQgPT0gU0VHX0JTUyk7CisjZW5kaWYKKyAgLyogSW4gY2FzZSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpIHdhbnRzIHRvIG1ha2UgZml4U3MuICovCisgIHN1YnNlZ19jaGFuZ2UgKHNlZ21lbnQsIDApOworCisgIC8qIEZvciBlYWNoIGZyYWcgaW4gc2VnbWVudDogY291bnQgYW5kIHN0b3JlICAoYSAxc3QgZ3Vlc3Mgb2YpCisgICAgIGZyX2FkZHJlc3MuICAqLworICBhZGRyZXNzID0gMDsKKyAgZm9yIChmcmFnUCA9IHNlZ21lbnRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKKyAgICB7CisgICAgICBmcmFnUC0+ZnJfYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICBhZGRyZXNzICs9IGZyYWdQLT5mcl9maXg7CisKKyAgICAgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCisJeworCWNhc2UgcnNfZmlsbDoKKwkgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX29mZnNldCAqIGZyYWdQLT5mcl92YXI7CisJICBicmVhazsKKworCWNhc2UgcnNfYWxpZ246CisJY2FzZSByc19hbGlnbl9jb2RlOgorCSAgeworCSAgICBhZGRyZXNzVCBvZmZzZXQgPSByZWxheF9hbGlnbiAoYWRkcmVzcywgKGludCkgZnJhZ1AtPmZyX29mZnNldCk7CisKKwkgICAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDAgJiYgb2Zmc2V0ID4gZnJhZ1AtPmZyX3N1YnR5cGUpCisJICAgICAgb2Zmc2V0ID0gMDsKKworCSAgICBpZiAob2Zmc2V0ICUgZnJhZ1AtPmZyX3ZhciAhPSAwKQorCSAgICAgIHsKKwkJYXNfYmFkIChfKCJhbGlnbm1lbnQgcGFkZGluZyAoJWx1IGJ5dGVzKSBub3QgYSBtdWx0aXBsZSBvZiAlbGQiKSwKKwkJCSh1bnNpZ25lZCBsb25nKSBvZmZzZXQsIChsb25nKSBmcmFnUC0+ZnJfdmFyKTsKKwkJb2Zmc2V0IC09IChvZmZzZXQgJSBmcmFnUC0+ZnJfdmFyKTsKKwkgICAgICB9CisKKwkgICAgYWRkcmVzcyArPSBvZmZzZXQ7CisJICB9CisJICBicmVhazsKKworCWNhc2UgcnNfb3JnOgorCWNhc2UgcnNfc3BhY2U6CisJICAvKiBBc3N1bWUgLm9yZyBpcyBudWdhdG9yeS4gSXQgd2lsbCBncm93IHdpdGggMXN0IHJlbGF4LiAgKi8KKwkgIGJyZWFrOworCisJY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKKwkgIGFkZHJlc3MgKz0gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KTsKKwkgIGJyZWFrOworCisjaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKKwkgIC8qIEJyb2tlbiB3b3JkcyBkb24ndCBjb25jZXJuIHVzIHlldCAqLworCWNhc2UgcnNfYnJva2VuX3dvcmQ6CisJICBicmVhazsKKyNlbmRpZgorCisJY2FzZSByc19sZWIxMjg6CisJICAvKiBJbml0aWFsIGd1ZXNzIGlzIGFsd2F5cyAxOyBkb2luZyBvdGhlcndpc2UgY2FuIHJlc3VsdCBpbiAKKwkgICAgIHN0YWJsZSBzb2x1dGlvbnMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0uICAqLworCSAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfb2Zmc2V0ID0gMTsKKwkgIGJyZWFrOworCisJY2FzZSByc19jZmE6CisJICBhZGRyZXNzICs9IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOworCSAgYnJlYWs7CisJfQkJCS8qIHN3aXRjaChmcl90eXBlKSAqLworICAgIH0JCQkJLyogZm9yIGVhY2ggZnJhZyBpbiB0aGUgc2VnbWVudCAqLworCisgIC8qIERvIHJlbGF4KCkuICAqLworICB7CisgICAgbG9uZyBzdHJldGNoOwkvKiBNYXkgYmUgYW55IHNpemUsIDAgb3IgbmVnYXRpdmUuICovCisgICAgLyogQ3VtdWxhdGl2ZSBudW1iZXIgb2YgYWRkcmVzc2VzIHdlIGhhdmUgKi8KKyAgICAvKiByZWxheGVkIHRoaXMgcGFzcy4gKi8KKyAgICAvKiBXZSBtYXkgaGF2ZSByZWxheGVkIG1vcmUgdGhhbiBvbmUgYWRkcmVzcy4gKi8KKyAgICBsb25nIHN0cmV0Y2hlZDsJLyogSGF2ZSB3ZSBzdHJldGNoZWQgb24gdGhpcyBwYXNzPyAqLworICAgIC8qIFRoaXMgaXMgJ2N1eiBzdHJldGNoIG1heSBiZSB6ZXJvLCB3aGVuLCBpbiBmYWN0IHNvbWUgcGllY2Ugb2YgY29kZQorICAgICAgIGdyZXcsIGFuZCBhbm90aGVyIHNocmFuay4gIElmIGEgYnJhbmNoIGluc3RydWN0aW9uIGRvZXNuJ3QgZml0IGFueW1vcmUsCisgICAgICAgd2UgY291bGQgYmUgc2Nyb2QuICAqLworCisgICAgZG8KKyAgICAgIHsKKwlzdHJldGNoID0gc3RyZXRjaGVkID0gMDsKKwlmb3IgKGZyYWdQID0gc2VnbWVudF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQorCSAgeworCSAgICBsb25nIGdyb3d0aCA9IDA7CisJICAgIGFkZHJlc3NUIHdhc19hZGRyZXNzOworCSAgICBvZmZzZXRUIG9mZnNldDsKKwkgICAgc3ltYm9sUyAqc3ltYm9sUDsKKworCSAgICB3YXNfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzOworCSAgICBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc3RyZXRjaDsKKwkgICAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7CisJICAgIG9mZnNldCA9IGZyYWdQLT5mcl9vZmZzZXQ7CisKKwkgICAgc3dpdGNoIChmcmFnUC0+ZnJfdHlwZSkKKwkgICAgICB7CisJICAgICAgY2FzZSByc19maWxsOgkvKiAuZmlsbCBuZXZlciByZWxheGVzLiAqLworCQlncm93dGggPSAwOworCQlicmVhazsKKworI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECisJCS8qIEpGOiAgVGhpcyBpcyBSTVMncyBpZGVhLiAgSSBkbyAqTk9UKiB3YW50IHRvIGJlIGJsYW1lZAorCQkgICBmb3IgaXQgSSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdC4gIEkgZG8gbm90IHdhbnQgdG8gaGF2ZQorCQkgICBhbnl0aGluZyB0byBkbyB3aXRoIGl0LiAgVGhpcyBpcyBub3QgdGhlIHByb3BlciB3YXkgdG8KKwkJICAgaW1wbGVtZW50IHRoaXMgbWlzZmVhdHVyZS4gICovCisJICAgICAgY2FzZSByc19icm9rZW5fd29yZDoKKwkJeworCQkgIHN0cnVjdCBicm9rZW5fd29yZCAqbGllOworCQkgIHN0cnVjdCBicm9rZW5fd29yZCAqdW50cnV0aDsKKworCQkgIC8qIFllcyB0aGlzIGlzIHVnbHkgKHN0b3JpbmcgdGhlIGJyb2tlbl93b3JkIHBvaW50ZXIKKwkJICAgICBpbiB0aGUgc3ltYm9sIHNsb3QpLiAgU3RpbGwsIHRoaXMgd2hvbGUgY2h1bmsgb2YKKwkJICAgICBjb2RlIGlzIHVnbHksIGFuZCBJIGRvbid0IGZlZWwgbGlrZSBkb2luZyBhbnl0aGluZworCQkgICAgIGFib3V0IGl0LiAgVGhpbmsgb2YgaXQgYXMgc3R1YmJvcm5uZXNzIGluIGFjdGlvbi4gICovCisJCSAgZ3Jvd3RoID0gMDsKKwkJICBmb3IgKGxpZSA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgKGZyYWdQLT5mcl9zeW1ib2wpOworCQkgICAgICAgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7CisJCSAgICAgICBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCisJCSAgICB7CisKKwkJICAgICAgaWYgKGxpZS0+YWRkZWQpCisJCQljb250aW51ZTsKKworCQkgICAgICBvZmZzZXQgPSAobGllLT5hZGQtPnN5X2ZyYWctPmZyX2FkZHJlc3MKKwkJCQkrIFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkKKwkJCQkrIGxpZS0+YWRkbnVtCisJCQkJLSAobGllLT5zdWItPnN5X2ZyYWctPmZyX2FkZHJlc3MKKwkJCQkgICArIFNfR0VUX1ZBTFVFIChsaWUtPnN1YikpKTsKKwkJICAgICAgaWYgKG9mZnNldCA8PSAtMzI3NjggfHwgb2Zmc2V0ID49IDMyNzY3KQorCQkJeworCQkJICBpZiAoZmxhZ193YXJuX2Rpc3BsYWNlbWVudCkKKwkJCSAgICB7CisJCQkgICAgICBjaGFyIGJ1Zls1MF07CisJCQkgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgKGFkZHJlc3NUKSBsaWUtPmFkZG51bSk7CisJCQkgICAgICBhc193YXJuIChfKCIud29yZCAlcy0lcyslcyBkaWRuJ3QgZml0IiksCisJCQkJICAgICAgIFNfR0VUX05BTUUgKGxpZS0+YWRkKSwKKwkJCQkgICAgICAgU19HRVRfTkFNRSAobGllLT5zdWIpLAorCQkJCSAgICAgICBidWYpOworCQkJICAgIH0KKwkJCSAgbGllLT5hZGRlZCA9IDE7CisJCQkgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQorCQkJICAgIHsKKwkJCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlKys7CisJCQkgICAgICBncm93dGggKz0gbWRfc2hvcnRfanVtcF9zaXplOworCQkJICAgIH0KKwkJCSAgZm9yICh1bnRydXRoID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOworCQkJICAgICAgIHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gbGllLT5kaXNwZnJhZzsKKwkJCSAgICAgICB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKKwkJCSAgICBpZiAoKHVudHJ1dGgtPmFkZC0+c3lfZnJhZyA9PSBsaWUtPmFkZC0+c3lfZnJhZykKKwkJCQkmJiBTX0dFVF9WQUxVRSAodW50cnV0aC0+YWRkKSA9PSBTX0dFVF9WQUxVRSAobGllLT5hZGQpKQorCQkJICAgICAgeworCQkJCXVudHJ1dGgtPmFkZGVkID0gMjsKKwkJCQl1bnRydXRoLT51c2VfanVtcCA9IGxpZTsKKwkJCSAgICAgIH0KKwkJCSAgZ3Jvd3RoICs9IG1kX2xvbmdfanVtcF9zaXplOworCQkJfQorCQkgICAgfQorCisJCSAgYnJlYWs7CisJCX0JCS8qIGNhc2UgcnNfYnJva2VuX3dvcmQgKi8KKyNlbmRpZgorCSAgICAgIGNhc2UgcnNfYWxpZ246CisJICAgICAgY2FzZSByc19hbGlnbl9jb2RlOgorCQl7CisJCSAgYWRkcmVzc1Qgb2xkb2ZmLCBuZXdvZmY7CisKKwkJICBvbGRvZmYgPSByZWxheF9hbGlnbiAod2FzX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4LAorCQkJCQkoaW50KSBvZmZzZXQpOworCQkgIG5ld29mZiA9IHJlbGF4X2FsaWduIChhZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCwKKwkJCQkJKGludCkgb2Zmc2V0KTsKKworCQkgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSAhPSAwKQorCQkgICAgeworCQkgICAgICBpZiAob2xkb2ZmID4gZnJhZ1AtPmZyX3N1YnR5cGUpCisJCQlvbGRvZmYgPSAwOworCQkgICAgICBpZiAobmV3b2ZmID4gZnJhZ1AtPmZyX3N1YnR5cGUpCisJCQluZXdvZmYgPSAwOworCQkgICAgfQorCisJCSAgZ3Jvd3RoID0gbmV3b2ZmIC0gb2xkb2ZmOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSByc19vcmc6CisJCXsKKwkJICBsb25nIHRhcmdldCA9IG9mZnNldDsKKwkJICBsb25nIGFmdGVyOworCisJCSAgaWYgKHN5bWJvbFApCisJCSAgICB7CisjaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQorCQkgICAgICBrbm93ICgoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQorCQkJICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkKKwkJCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX1RFWFQpCisJCQkgICAgfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0JTUyk7CisJCSAgICAgIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcpOworCQkgICAgICBrbm93ICghKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19BQlNPTFVURSkKKwkJCSAgICB8fCAoc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpKTsKKyNlbmRpZgorCQkgICAgICB0YXJnZXQgKz0gU19HRVRfVkFMVUUgKHN5bWJvbFApCisJCQkrIHN5bWJvbFAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7CisJCSAgICB9CQkvKiBpZiB3ZSBoYXZlIGEgc3ltYm9sICovCisKKwkJICBrbm93IChmcmFnUC0+ZnJfbmV4dCk7CisJCSAgYWZ0ZXIgPSBmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzczsKKwkJICBncm93dGggPSB0YXJnZXQgLSBhZnRlcjsKKwkJICBpZiAoZ3Jvd3RoIDwgMCkKKwkJICAgIHsKKwkJICAgICAgLyogR3Jvd3RoIG1heSBiZSBuZWdhdGl2ZSwgYnV0IHZhcmlhYmxlIHBhcnQgb2YgZnJhZworCQkJIGNhbm5vdCBoYXZlIGZld2VyIHRoYW4gMCBjaGFycy4gIFRoYXQgaXMsIHdlIGNhbid0CisJCQkgLm9yZyBiYWNrd2FyZHMuICovCisJCSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byAub3JnIGJhY2t3YXJkcyBpZ25vcmVkIikpOworCQkgICAgICBncm93dGggPSAwOworCQkgICAgfQorCisJCSAgZ3Jvd3RoIC09IHN0cmV0Y2g7CS8qIFRoaXMgaXMgYW4gYWJzb2x1dGUgZ3Jvd3RoIGZhY3RvciAqLworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBjYXNlIHJzX3NwYWNlOgorCQlpZiAoc3ltYm9sUCkKKwkJICB7CisJCSAgICBncm93dGggPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7CisJCSAgICBpZiAoc3ltYm9sUC0+c3lfZnJhZyAhPSAmemVyb19hZGRyZXNzX2ZyYWcKKwkJCXx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKQorCQkJfHwgISBTX0lTX0RFRklORUQgKHN5bWJvbFApKQorCQkgICAgICBhc19iYWRfd2hlcmUgKGZyYWdQLT5mcl9maWxlLCBmcmFnUC0+ZnJfbGluZSwKKwkJCQkgICAgXygiLnNwYWNlIHNwZWNpZmllcyBub24tYWJzb2x1dGUgdmFsdWUiKSk7CisJCSAgICBmcmFnUC0+ZnJfc3ltYm9sID0gMDsKKwkJICAgIGlmIChncm93dGggPCAwKQorCQkgICAgICB7CisJCQlhc193YXJuIChfKCIuc3BhY2Ugb3IgLmZpbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZSwgaWdub3JlZCIpKTsKKwkJCWdyb3d0aCA9IDA7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICBncm93dGggPSAwOworCQlicmVhazsKKworCSAgICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6CisjaWZkZWYgbWRfcmVsYXhfZnJhZworCQlncm93dGggPSBtZF9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7CisjZWxzZQorI2lmZGVmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKKwkJLyogVGhlIGRlZmF1bHQgd2F5IHRvIHJlbGF4IGEgZnJhZyBpcyB0byBsb29rIHRocm91Z2gKKwkJICAgVENfR0VORVJJQ19SRUxBWF9UQUJMRS4gICovCisJCWdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKKyNlbmRpZiAvKiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFICovCisjZW5kaWYKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIHJzX2xlYjEyODoKKwkJeworCQkgIHZhbHVlVCB2YWx1ZTsKKwkJICBpbnQgc2l6ZTsKKworCQkgIHZhbHVlID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWdQLT5mcl9zeW1ib2wsIDApOworCQkgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgZnJhZ1AtPmZyX3N1YnR5cGUpOworCQkgIGdyb3d0aCA9IHNpemUgLSBmcmFnUC0+ZnJfb2Zmc2V0OworCQkgIGZyYWdQLT5mcl9vZmZzZXQgPSBzaXplOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSByc19jZmE6CisJCWdyb3d0aCA9IGVoX2ZyYW1lX3JlbGF4X2ZyYWcgKGZyYWdQKTsKKwkJYnJlYWs7CisKKwkgICAgICBkZWZhdWx0OgorCQlCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGlmIChncm93dGgpCisJICAgICAgeworCQlzdHJldGNoICs9IGdyb3d0aDsKKwkJc3RyZXRjaGVkKys7CisJICAgICAgfQorCSAgfQkJCS8qIEZvciBlYWNoIGZyYWcgaW4gdGhlIHNlZ21lbnQuICovCisgICAgICB9CisgICAgd2hpbGUgKHN0cmV0Y2hlZCk7CQkvKiBVbnRpbCBub3RoaW5nIGZ1cnRoZXIgdG8gcmVsYXguICovCisgIH0JCQkJLyogZG9fcmVsYXggKi8KKworICAvKgorICAgKiBXZSBub3cgaGF2ZSB2YWxpZCBmcl9hZGRyZXNzJ2VzIGZvciBlYWNoIGZyYWcuCisgICAqLworCisgIC8qCisgICAqIEFsbCBmcl9hZGRyZXNzJ3MgYXJlIGNvcnJlY3QsIHJlbGF0aXZlIHRvIHRoZWlyIG93biBzZWdtZW50LgorICAgKiBXZSBoYXZlIG1hZGUgYWxsIHRoZSBmaXhTIHdlIHdpbGwgZXZlciBtYWtlLgorICAgKi8KK30JCQkJLyogcmVsYXhfc2VnbWVudCgpICovCisKKyNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKQorCisjaWZuZGVmIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUAorI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoWCkgKDEpCisjZW5kaWYKKworLyogZml4dXBfc2VnbWVudCgpCisKKyAgIEdvIHRocm91Z2ggYWxsIHRoZSBmaXhTJ3MgaW4gYSBzZWdtZW50IGFuZCBzZWUgd2hpY2ggb25lcyBjYW4gYmUKKyAgIGhhbmRsZWQgbm93LiAgKFRoZXNlIGNvbnNpc3Qgb2YgZml4UyB3aGVyZSB3ZSBoYXZlIHNpbmNlIGRpc2NvdmVyZWQKKyAgIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcgaW52b2x2ZWQuKQorICAgRm9yIGVhY2ggb25lLCBjYWxsIG1kX2FwcGx5X2ZpeCB0byBwdXQgdGhlIGZpeCBpbnRvIHRoZSBmcmFnIGRhdGEuCisKKyAgIFJlc3VsdCBpcyBhIGNvdW50IG9mIGhvdyBtYW55IHJlbG9jYXRpb24gc3RydWN0cyB3aWxsIGJlIG5lZWRlZCB0bworICAgaGFuZGxlIHRoZSByZW1haW5pbmcgZml4UydzIHRoYXQgd2UgY291bGRuJ3QgY29tcGxldGVseSBoYW5kbGUgaGVyZS4KKyAgIFRoZXNlIHdpbGwgYmUgb3V0cHV0IGxhdGVyIGJ5IGVtaXRfcmVsb2NhdGlvbnMoKS4gICovCisKK3N0YXRpYyBsb25nCitmaXh1cF9zZWdtZW50IChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkKKyAgICAgcmVnaXN0ZXIgZml4UyAqZml4UDsKKyAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsJLyogTl9UWVBFIGJpdHMgZm9yIHNlZ21lbnQuICovCit7CisgIGxvbmcgc2VnX3JlbG9jX2NvdW50ID0gMDsKKyAgc3ltYm9sUyAqYWRkX3N5bWJvbFA7CisgIHN5bWJvbFMgKnN1Yl9zeW1ib2xQOworICB2YWx1ZVQgYWRkX251bWJlcjsKKyAgaW50IHNpemU7CisgIGNoYXIgKnBsYWNlOworICBsb25nIHdoZXJlOworICBpbnQgcGNyZWwsIHBsdDsKKyAgZnJhZ1MgKmZyYWdQOworICBzZWdUIGFkZF9zeW1ib2xfc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247CisKKyAgLyogSWYgdGhlIGxpbmtlciBpcyBkb2luZyB0aGUgcmVsYXhpbmcsIHdlIG11c3Qgbm90IGRvIGFueSBmaXh1cHMuCisKKyAgICAgV2VsbCwgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCdzIG5vdCB0cnVlIC0tIHdlIGNvdWxkIGRvIGFueSB0aGF0IGFyZQorICAgICBQQy1yZWxhdGl2ZSBhbmQgZG9uJ3QgY3Jvc3MgcmVnaW9ucyB0aGF0IGNvdWxkIGNoYW5nZSBzaXplLiAgQW5kIGZvciB0aGUKKyAgICAgaTk2MCAodGhlIG9ubHkgbWFjaGluZSBmb3Igd2hpY2ggd2UndmUgZ290IGEgcmVsYXhpbmcgbGlua2VyIHJpZ2h0IG5vdyksCisgICAgIHdlIG1pZ2h0IGJlIGFibGUgdG8gdHVybiBjYWxseC9jYWxsaiBpbnRvIGJhbCBhbnl3YXlzIGluIGNhc2VzIHdoZXJlIHdlCisgICAgIGtub3cgdGhlIG1heGltdW0gZGlzcGxhY2VtZW50LiAgKi8KKyAgaWYgKGxpbmtyZWxheCkKKyAgICB7CisgICAgICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCisJc2VnX3JlbG9jX2NvdW50Kys7CisgICAgICBUQ19BREpVU1RfUkVMT0NfQ09VTlQgKGZpeFAsIHNlZ19yZWxvY19jb3VudCk7CisgICAgICByZXR1cm4gc2VnX3JlbG9jX2NvdW50OworICAgIH0KKworICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCisgICAgeworCisjaWZkZWYgREVCVUc1CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbnByb2Nlc3NpbmcgZml4dXA6XG4iKTsKKyAgICAgIHByaW50X2ZpeHVwIChmaXhQKTsKKyNlbmRpZgorCisKKyAgICAgIGZyYWdQID0gZml4UC0+ZnhfZnJhZzsKKyAgICAgIGtub3cgKGZyYWdQKTsKKyAgICAgIHdoZXJlID0gZml4UC0+Znhfd2hlcmU7CisgICAgICBwbGFjZSA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7CisgICAgICBzaXplID0gZml4UC0+Znhfc2l6ZTsKKyAgICAgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7CisjaWZkZWYgVENfVkFMSURBVEVfRklYCisgICAgICBUQ19WQUxJREFURV9GSVggKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlLCBza2lwKTsKKyNlbmRpZgorICAgICAgc3ViX3N5bWJvbFAgPSBmaXhQLT5meF9zdWJzeTsKKyAgICAgIGFkZF9udW1iZXIgPSBmaXhQLT5meF9vZmZzZXQ7CisgICAgICBwY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOworICAgICAgcGx0ID0gZml4UC0+ZnhfcGx0OworCisgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTAorCSAgJiYgYWRkX3N5bWJvbFAtPnN5X21yaV9jb21tb24pCisJeworCSAga25vdyAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wpOworCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOworCSAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKKwkgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOworCX0KKworICAgICAgaWYgKGFkZF9zeW1ib2xQKQorCWFkZF9zeW1ib2xfc2VnbWVudCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKTsKKworICAgICAgaWYgKHN1Yl9zeW1ib2xQKQorCXsKKwkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzdWJfc3ltYm9sUCwgMSk7CisJICBpZiAoYWRkX3N5bWJvbFAgPT0gTlVMTCB8fCBhZGRfc3ltYm9sX3NlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbikKKwkgICAgeworCSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMKQorCQl7CisJCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOworCQkgIGFkZF9zeW1ib2xQID0gTlVMTDsKKwkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7CisJCX0KKworCSAgICAgIC8qIEl0J3MganVzdCAtc3ltICovCisJICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQorCQl7CisJCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOworCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHBjcmVsCisJCSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUpCisJCXsKKwkJICAvKiBTaG91bGQgdHJ5IGNvbnZlcnRpbmcgdG8gYSBjb25zdGFudC4gICovCisJCSAgZ290byBiYWRfc3ViX3JlbG9jOworCQl9CisJICAgICAgZWxzZQorCSAgICAgIGJhZF9zdWJfcmVsb2M6CisJCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgICAgIF8oIk5lZ2F0aXZlIG9mIG5vbi1hYnNvbHV0ZSBzeW1ib2wgJXMiKSwKKwkJCSAgICAgIFNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhZGRfc3ltYm9sX3NlZ21lbnQKKwkJICAgJiYgU0VHX05PUk1BTCAoYWRkX3N5bWJvbF9zZWdtZW50KSkKKwkgICAgeworCSAgICAgIC8qIERpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIGZyb20gc2FtZSBzZWdtZW50LgorCQkgQ2FuJ3QgbWFrZSBkaWZmZXJlbmNlIG9mIDIgdW5kZWZpbmVkczogJ3ZhbHVlJyBtZWFucworCQkgc29tZXRoaW5nIGRpZmZlcmVudCBmb3IgTl9VTkRGLiAqLworI2lmZGVmIFRDX0k5NjAKKwkgICAgICAvKiBNYWtlcyBubyBzZW5zZSB0byB1c2UgdGhlIGRpZmZlcmVuY2Ugb2YgMiBhcmJpdHJhcnkgc3ltYm9scworCQkgYXMgdGhlIHRhcmdldCBvZiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGlmIChmaXhQLT5meF90Y2JpdCkKKwkJYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJICAgICAgXygiY2FsbGogdG8gZGlmZmVyZW5jZSBvZiAyIHN5bWJvbHMiKSk7CisjZW5kaWYgLyogVENfSTk2MCAqLworCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKSAtCisJCVNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7CisKKwkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7CisJICAgICAgcGNyZWwgPSAwOwkvKiBObyBmdXJ0aGVyIHBjcmVsIHByb2Nlc3NpbmcuICovCisKKwkgICAgICAvKiBMZXQgdGhlIHRhcmdldCBtYWNoaW5lIG1ha2UgdGhlIGZpbmFsIGRldGVybWluYXRpb24KKwkJIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bworCQkgaGFuZGxlIHRoaXMgZml4dXAuICAqLworCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkpCisJCXsKKwkJICBmaXhQLT5meF9wY3JlbCA9IDA7CisJCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOworCQkgIGZpeFAtPmZ4X3N1YnN5ID0gTlVMTDsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBEaWZmZXJlbnQgc2VnbWVudHMgaW4gc3VidHJhY3Rpb24uICovCisJICAgICAga25vdyAoIShTX0lTX0VYVEVSTkFMIChzdWJfc3ltYm9sUCkKKwkJICAgICAgJiYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkpOworCisJICAgICAgaWYgKChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpCisJCWFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKKworI2lmZGVmIERJRkZfRVhQUl9PSworCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSA9PSB0aGlzX3NlZ21lbnRfdHlwZQorI2lmIDAgLyogRG8gdGhpcyBldmVuIGlmIGl0J3MgYWxyZWFkeSBkZXNjcmliZWQgYXMgcGMtcmVsYXRpdmUuICBGb3IgZXhhbXBsZSwKKwkgb24gdGhlIG02OGssIGFuIG9wZXJhbmQgb2YgInBjQChmb28tLi0yKSIgc2hvdWxkIGFkZHJlc3MgImZvbyIgaW4gYQorCSBwYy1yZWxhdGl2ZSBtb2RlLiAgKi8KKwkJICAgICAgICYmIHBjcmVsCisjZW5kaWYKKwkJICAgICAgICkKKwkJeworCQkgIC8qIE1ha2UgaXQgcGMtcmVsYXRpdmUuICAqLworCQkgIGFkZF9udW1iZXIgKz0gKE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpCisJCQkJIC0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKSk7CisJCSAgcGNyZWwgPSAxOworCQkgIGZpeFAtPmZ4X3BjcmVsID0gMTsKKwkJICBzdWJfc3ltYm9sUCA9IDA7CisJCSAgZml4UC0+Znhfc3Vic3kgPSAwOworCQl9CisjZW5kaWYKKyNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSworCSAgICAgIC8qIFRoZSBQQSBuZWVkcyB0aGlzIGZvciBQSUMgY29kZSBnZW5lcmF0aW9uLiAgV2UgYmFzaWNhbGx5CisJCSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGlmIHdlIGhhdmUgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvCisJCSBzeW1ib2xzIGF0IHRoaXMgcG9pbnQuICAqLworCSAgICAgIGVsc2UgaWYgKDEpCisJCXsKKwkJICAvKiBMZWF2ZSBpdCBhbG9uZS4gICovCisJCX0KKyNlbmRpZgorI2lmZGVmIEJGRF9BU1NFTUJMRVIKKwkgICAgICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0dQUkVMMzIKKwkJICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfR1BSRUwxNikKKwkJeworCQkgIC8qIExlYXZlIGl0IGFsb25lLiAgKi8KKwkJfQorI2VuZGlmCisJICAgICAgZWxzZQorCQl7CisJCSAgY2hhciBidWZbNTBdOworCQkgIHNwcmludF92YWx1ZSAoYnVmLCBmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKTsKKwkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkJXygiU3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIFwiJXNcIiB7JXMgc2VjdGlvbn0gLSBcIiVzXCIgeyVzIHNlY3Rpb259IGF0IGZpbGUgYWRkcmVzcyAlcy4iKSwKKwkJCQlTX0dFVF9OQU1FIChhZGRfc3ltYm9sUCksCisJCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCkpLAorCQkJCVNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSwKKwkJCQlzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN1Yl9zeW1ib2xQKSksCisJCQkJYnVmKTsKKwkJfQorCSAgICB9CisJfQorCisgICAgICBpZiAoYWRkX3N5bWJvbFApCisJeworCSAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSB0aGlzX3NlZ21lbnRfdHlwZSAmJiBwY3JlbCAmJiAhcGx0CisJICAgICAgJiYgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQIChmaXhQKSkKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogVGhpcyBmaXh1cCB3YXMgbWFkZSB3aGVuIHRoZSBzeW1ib2wncyBzZWdtZW50IHdhcworCSAgICAgICAqIFNFR19VTktOT1dOLCBidXQgaXQgaXMgbm93IGluIHRoZSBsb2NhbCBzZWdtZW50LgorCSAgICAgICAqIFNvIHdlIGtub3cgaG93IHRvIGRvIHRoZSBhZGRyZXNzIHdpdGhvdXQgcmVsb2NhdGlvbi4KKwkgICAgICAgKi8KKyNpZmRlZiBUQ19JOTYwCisJICAgICAgLyogcmVsb2NfY2FsbGooKSBtYXkgcmVwbGFjZSBhICdjYWxsJyB3aXRoIGEgJ2NhbGxzJyBvciBhCisJCSAnYmFsJywgaW4gd2hpY2ggY2FzZXMgaXQgbW9kaWZpZXMgKmZpeFAgYXMgYXBwcm9wcmlhdGUuCisJCSBJbiB0aGUgY2FzZSBvZiBhICdjYWxscycsIG5vIGZ1cnRoZXIgd29yayBpcyByZXF1aXJlZCwKKwkJIGFuZCAqZml4UCBoYXMgYmVlbiBzZXQgdXAgdG8gbWFrZSB0aGUgcmVzdCBvZiB0aGUgY29kZQorCQkgYmVsb3cgYSBuby1vcC4gKi8KKwkgICAgICByZWxvY19jYWxsaiAoZml4UCk7CisjZW5kaWYgLyogVENfSTk2MCAqLworCisJICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOworCSAgICAgIGFkZF9udW1iZXIgLT0gTURfUENSRUxfRlJPTV9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSk7CisJICAgICAgcGNyZWwgPSAwOwkvKiBMaWUuIERvbid0IHdhbnQgZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLworCisJICAgICAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCisJCSBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KKwkJIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KKwkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQorCQl7CisJCSAgZml4UC0+ZnhfcGNyZWwgPSAwOworCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24KKwkJICAmJiAhIHBjcmVsKQorCQl7CisjaWZkZWYgVENfSTk2MAorCQkgIC8qIFNlZSBjb21tZW50IGFib3V0IHJlbG9jX2NhbGxqKCkgYWJvdmUuICAqLworCQkgIHJlbG9jX2NhbGxqIChmaXhQKTsKKyNlbmRpZiAvKiBUQ19JOTYwICovCisJCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOworCisJCSAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCisJCSAgICAgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCisJCSAgICAgaGFuZGxlIHRoaXMgZml4dXAuICAqLworCisJCSAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKKwkJICAgIHsKKwkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOworCQkgICAgICBhZGRfc3ltYm9sUCA9IE5VTEw7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24KKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisJCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGFkZF9zeW1ib2xfc2VnbWVudCkKKyNlbmRpZgorCQkgICAgICAgKQorCQl7CisjaWZkZWYgVENfSTk2MAorCQkgIGlmICgoaW50KSBmaXhQLT5meF9iaXRfZml4UCA9PSAxMykKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhCisJCSAgICAgICAqIDEzLWJpdCBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQKKwkJICAgICAgICogZm9yIGxvY2FsIGJyYW5jaGVzOiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZQorCQkgICAgICAgKiByZWxvY2F0aW9uLgorCQkgICAgICAgKi8KKwkJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAorCQkJCSAgICBfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKKwkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOworCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKKwkJICAgICAgY29udGludWU7CisJCSAgICB9CQkvKiBDT0JSICovCisjZW5kaWYgLyogVENfSTk2MCAqLworCisjaWZkZWYgT0JKX0NPRkYKKyNpZmRlZiBURV9JMzg2QUlYCisJCSAgaWYgKFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpCisJCSAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7CisjZW5kaWYgLyogVEVfSTM4NkFJWCAqLworI2VuZGlmIC8qIE9CSl9DT0ZGICovCisJCSAgKytzZWdfcmVsb2NfY291bnQ7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzZWdfcmVsb2NfY291bnQrKzsKKyNpZiAhKGRlZmluZWQgKFRDX1Y4NTApICYmIGRlZmluZWQgKE9CSl9FTEYpKQorI2lmICEoZGVmaW5lZCAoVENfTTY4SykgJiYgZGVmaW5lZCAoT0JKX0VMRikpCisjaWYgIShkZWZpbmVkIChUQ19BUk0pICAmJiBkZWZpbmVkIChPQkpfRUxGKSkKKyNpZiAhZGVmaW5lZCAoVENfSTM4NikgfHwgIShkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQ09GRikpIHx8IGRlZmluZWQgKFRFX1BFKQorCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChwY3JlbCkKKwl7CisJICBhZGRfbnVtYmVyIC09IE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpOworCSAgaWYgKGFkZF9zeW1ib2xQID09IDApCisJICAgIHsKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gJmFic19zeW1ib2w7CisjZWxzZQorCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOworI2VuZGlmCisJICAgICAgZml4UC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOworCSAgICAgICsrc2VnX3JlbG9jX2NvdW50OworCSAgICB9CisJfQorCisgICAgICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQICYmICFmaXhQLT5meF9ub19vdmVyZmxvdyAmJiBzaXplID4gMCkKKwl7CisJICBpZiAoKHNpemVfdCkgc2l6ZSA8IHNpemVvZiAodmFsdWVUKSkKKwkgICAgeworCSAgICAgIHZhbHVlVCBtYXNrLCBoaWJpdDsKKworCSAgICAgIC8qIHNldCBhbGwgYml0cyB0byBvbmUgKi8KKwkgICAgICBtYXNrID0gMDsKKwkgICAgICBtYXNrLS07CisJICAgICAgLyogVGVjaG5pY2FsbHksIGNvbWJpbmluZyB0aGVzZSBwcm9kdWNlcyBhbiB1bmRlZmluZWQgcmVzdWx0CisJCSBpZiBzaXplIGlzIHNpemVvZiAodmFsdWVUKSwgdGhvdWdoIEkgdGhpbmsgdGhlc2UgdHdvCisJCSBoYWxmLXdheSBvcGVyYXRpb25zIHNob3VsZCBib3RoIGJlIGRlZmluZWQuICBBbmQgdGhlCisJCSBjb21waWxlciBzaG91bGQgYmUgYWJsZSB0byBjb21iaW5lIHRoZW0gaWYgaXQncyB2YWxpZCBvbgorCQkgdGhlIGhvc3QgYXJjaGl0ZWN0dXJlLiAgKi8KKwkgICAgICBtYXNrIDw8PSBzaXplICogNDsKKwkgICAgICBtYXNrIDw8PSBzaXplICogNDsKKwkgICAgICBoaWJpdCA9ICh2YWx1ZVQpIDEgPDwgKHNpemUgKiA4IC0gMSk7CisJICAgICAgaWYgKCgoYWRkX251bWJlciAmIG1hc2spICE9IDAKKwkJICAgfHwgKGZpeFAtPmZ4X3NpZ25lZAorCQkgICAgICAgJiYgKGFkZF9udW1iZXIgJiBoaWJpdCkgIT0gMCkpCisJCSAgJiYgKChhZGRfbnVtYmVyICYgbWFzaykgIT0gbWFzaworCQkgICAgICB8fCAoYWRkX251bWJlciAmIGhpYml0KSA9PSAwKSkKKwkJeworCQkgIGNoYXIgYnVmWzUwXSwgYnVmMls1MF07CisJCSAgc3ByaW50X3ZhbHVlIChidWYsIGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpOworCQkgIGlmIChhZGRfbnVtYmVyID4gMTAwMCkKKwkJICAgIHNwcmludF92YWx1ZSAoYnVmMiwgYWRkX251bWJlcik7CisJCSAgZWxzZQorCQkgICAgc3ByaW50ZiAoYnVmMiwgIiVsZCIsIChsb25nKSBhZGRfbnVtYmVyKTsKKwkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCisJCQkJXygiVmFsdWUgb2YgJXMgdG9vIGxhcmdlIGZvciBmaWVsZCBvZiAlZCBieXRlcyBhdCAlcyIpLAorCQkJCWJ1ZjIsIHNpemUsIGJ1Zik7CisJCX0gLyogZ2VuZXJpYyBlcnJvciBjaGVja2luZyAqLworCSAgICB9CisjaWZkZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAorCSAgLyogV2FybiBpZiBhIC53b3JkIHZhbHVlIGlzIHRvbyBsYXJnZSB3aGVuIHRyZWF0ZWQgYXMgYSBzaWduZWQKKwkgICAgIG51bWJlci4gIFdlIGFscmVhZHkga25vdyBpdCBpcyBub3QgdG9vIG5lZ2F0aXZlLiAgVGhpcyBpcyB0bworCSAgICAgY2F0Y2ggb3Zlci1sYXJnZSBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uIHRoZSA2OGsuICAqLworCSAgaWYgKCFmbGFnX3NpZ25lZF9vdmVyZmxvd19vaworCSAgICAgICYmIHNpemUgPT0gMgorCSAgICAgICYmIGFkZF9udW1iZXIgPiAweDdmZmYpCisJICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKKwkJCSAgXygiU2lnbmVkIC53b3JkIG92ZXJmbG93OyBzd2l0Y2ggbWF5IGJlIHRvbyBsYXJnZTsgJWxkIGF0IDB4JWx4IiksCisJCQkgIChsb25nKSBhZGRfbnVtYmVyLAorCQkJICAodW5zaWduZWQgbG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKKyNlbmRpZgorCX0JCQkvKiBub3QgYSBiaXQgZml4ICovCisKKyAgICAgIGlmICghZml4UC0+ZnhfZG9uZSkKKwl7CisjaWZkZWYgTURfQVBQTFlfRklYMworCSAgbWRfYXBwbHlfZml4MyAoZml4UCwgJmFkZF9udW1iZXIsIHRoaXNfc2VnbWVudF90eXBlKTsKKyNlbHNlCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorCSAgbWRfYXBwbHlfZml4IChmaXhQLCAmYWRkX251bWJlcik7CisjZWxzZQorCSAgbWRfYXBwbHlfZml4IChmaXhQLCBhZGRfbnVtYmVyKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgVENfSEFORExFU19GWF9ET05FCisJICAvKiBJZiB0aGUgdGMtKiBmaWxlcyBoYXZlbid0IGJlZW4gY29udmVydGVkLCBhc3N1bWUgaXQncyBoYW5kbGluZworCSAgICAgaXQgdGhlIG9sZCB3YXksIHdoZXJlIGEgbnVsbCBmeF9hZGRzeSBtZWFucyB0aGF0IHRoZSBmaXggaGFzCisJICAgICBiZWVuIGFwcGxpZWQgY29tcGxldGVseSwgYW5kIG5vIGZ1cnRoZXIgd29yayBpcyBuZWVkZWQuICAqLworCSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgZml4UC0+ZnhfcGNyZWwgPT0gMCkKKwkgICAgZml4UC0+ZnhfZG9uZSA9IDE7CisjZW5kaWYKKwl9CisjaWZkZWYgVENfVkFMSURBVEVfRklYCisgICAgc2tpcDogOworI2VuZGlmCisjaWZkZWYgREVCVUc1CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZXN1bHQ6XG4iKTsKKyAgICAgIHByaW50X2ZpeHVwIChmaXhQKTsKKyNlbmRpZgorICAgIH0JCQkJLyogRm9yIGVhY2ggZml4UyBpbiB0aGlzIHNlZ21lbnQuICovCisKKyAgVENfQURKVVNUX1JFTE9DX0NPVU5UIChmaXhQLCBzZWdfcmVsb2NfY291bnQpOworICByZXR1cm4gc2VnX3JlbG9jX2NvdW50OworfQorCisjZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkIChPQkpfVk1TKSkgKi8KKwordm9pZAorbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG47Cit7CisgIGlmICgoc2l6ZV90KSBuID4gc2l6ZW9mICh2YWwpIHx8IG4gPD0gMCkKKyAgICBhYm9ydCAoKTsKKyAgd2hpbGUgKG4tLSkKKyAgICB7CisgICAgICBidWZbbl0gPSB2YWwgJiAweGZmOworICAgICAgdmFsID4+PSA4OworICAgIH0KK30KKwordm9pZAorbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdmFsdWVUIHZhbDsKKyAgICAgaW50IG47Cit7CisgIGlmICgoc2l6ZV90KSBuID4gc2l6ZW9mICh2YWwpIHx8IG4gPD0gMCkKKyAgICBhYm9ydCAoKTsKKyAgd2hpbGUgKG4tLSkKKyAgICB7CisgICAgICAqYnVmKysgPSB2YWwgJiAweGZmOworICAgICAgdmFsID4+PSA4OworICAgIH0KK30KKwordm9pZAord3JpdGVfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKKyAgICAgRklMRSAqZmlsZTsKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiZml4dXBzOiAlZFxuIiwgbl9maXh1cHMpOworfQorCisvKiBmb3IgZGVidWdnaW5nICovCitleHRlcm4gaW50IGluZGVudF9sZXZlbDsKKwordm9pZAorcHJpbnRfZml4dXAgKGZpeHApCisgICAgIGZpeFMgKmZpeHA7Cit7CisgIGluZGVudF9sZXZlbCA9IDE7CisgIGZwcmludGYgKHN0ZGVyciwgImZpeCAlbHggJXM6JWQiLCAobG9uZykgZml4cCwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7CisgIGlmIChmaXhwLT5meF9wY3JlbCkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgcGNyZWwiKTsKKyAgaWYgKGZpeHAtPmZ4X3BjcmVsX2FkanVzdCkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgcGNyZWxfYWRqdXN0PSVkIiwgZml4cC0+ZnhfcGNyZWxfYWRqdXN0KTsKKyAgaWYgKGZpeHAtPmZ4X2ltX2Rpc3ApCisgICAgeworI2lmZGVmIFRDX05TMzJLCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgaW1fZGlzcD0lZCIsIGZpeHAtPmZ4X2ltX2Rpc3ApOworI2Vsc2UKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBpbV9kaXNwIik7CisjZW5kaWYKKyAgICB9CisgIGlmIChmaXhwLT5meF90Y2JpdCkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgdGNiaXQiKTsKKyAgaWYgKGZpeHAtPmZ4X2RvbmUpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiIGRvbmUiKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAgc2l6ZT0lZCBmcmFnPSVseCB3aGVyZT0lbGQgb2Zmc2V0PSVseCBhZGRudW1iZXI9JWx4IiwKKwkgICBmaXhwLT5meF9zaXplLCAobG9uZykgZml4cC0+ZnhfZnJhZywgKGxvbmcpIGZpeHAtPmZ4X3doZXJlLAorCSAgIChsb25nKSBmaXhwLT5meF9vZmZzZXQsIChsb25nKSBmaXhwLT5meF9hZGRudW1iZXIpOworI2lmZGVmIEJGRF9BU1NFTUJMRVIKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICAgJXMgKCVkKSIsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhwLT5meF9yX3R5cGUpLAorCSAgIGZpeHAtPmZ4X3JfdHlwZSk7CisjZWxzZQorI2lmZGVmIE5FRURfRlhfUl9UWVBFCisgIGZwcmludGYgKHN0ZGVyciwgIiByX3R5cGU9JWQiLCBmaXhwLT5meF9yX3R5cGUpOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGZpeHAtPmZ4X2FkZHN5KQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuICAgKzwiKTsKKyAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIGZpeHAtPmZ4X2FkZHN5KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIj4iKTsKKyAgICB9CisgIGlmIChmaXhwLT5meF9zdWJzeSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiAgIC08Iik7CisgICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoc3RkZXJyLCBmaXhwLT5meF9zdWJzeSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICI+Iik7CisgICAgfQorICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworI2lmZGVmIFRDX0ZJWF9EQVRBX1BSSU5UCisgIFRDX0ZJWF9EQVRBX1BSSU5UIChzdGRlcnIsIGZpeHApOworI2VuZGlmCit9CisKKy8qIGVuZCBvZiB3cml0ZS5jICovCmRpZmYgLS1naXQgYS9nYXMvd3JpdGUuaCBiL2dhcy93cml0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NmQyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9nYXMvd3JpdGUuaApAQCAtMCwwICsxLDIwOCBAQAorLyogd3JpdGUuaAorICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKKyAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX193cml0ZV9oX18KKyNkZWZpbmUgX193cml0ZV9oX18KKworI2lmbmRlZiBUQ19JOTYwCisjaWZkZWYgaHB1eAorI2RlZmluZSBFWEVDX01BQ0hJTkVfVFlQRSBIUDkwMDBTMjAwX0lECisjZW5kaWYKKyNlbmRpZiAvKiBUQ19JOTYwICovCisKKyNpZm5kZWYgQkZEX0FTU0VNQkxFUgorCisjaWZuZGVmIExPQ0FMX0xBQkVMCisjZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lIFswXSA9PSAnTCcgKQorI2VuZGlmCisKKyNkZWZpbmUgU19MT0NBTF9OQU1FKHMpIChMT0NBTF9MQUJFTCAoU19HRVRfTkFNRSAocykpKQorCisjZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCisKKy8qIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSBmYWtlIHN5bWJvbCB3aGljaCB3aWxsIG5ldmVyIGFwcGVhciBpbiB0aGUKKyAgIGFzc2VtYmxlciBvdXRwdXQuICBTX0lTX0xPQ0FMIGRldGVjdHMgaXQgYmVjYXVzZSBvZiB0aGUgXDAwMS4gICovCisjZGVmaW5lIEZBS0VfTEFCRUxfTkFNRSAiTDBcMDAxIgorCisjaW5jbHVkZSAiYml0X2ZpeC5oIgorCisvKgorICogRml4U3MgbWF5IGJlIGJ1aWx0IHVwIGluIGFueSBvcmRlci4KKyAqLworCitzdHJ1Y3QgZml4Cit7CisgIC8qIFRoZXNlIHNtYWxsIGZpZWxkcyBhcmUgZ3JvdXBlZCB0b2dldGhlciBmb3IgY29tcGFjdG5lc3Mgb2YKKyAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBlZmZpY2llbmN5IG9mIGFjY2VzcyBvbiBzb21lIGFyY2hpdGVjdHVyZXMuICAqLworCisgIC8qIHBjLXJlbGF0aXZlIG9mZnNldCBhZGp1c3QgKG9ubHkgdXNlZCBieSBtNjhrKSAqLworICBjaGFyIGZ4X3BjcmVsX2FkanVzdDsKKworICAvKiBIb3cgbWFueSBieXRlcyBhcmUgaW52b2x2ZWQ/ICovCisgIHVuc2lnbmVkIGNoYXIgZnhfc2l6ZTsKKworICAvKiBJcyB0aGlzIGEgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbj8gICovCisgIHVuc2lnbmVkIGZ4X3BjcmVsIDogMTsKKworICAvKiBJcyB0aGlzIGEgcmVsb2NhdGlvbiB0byBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5PyAgSWYgc28sCisgICAgIHNvbWUgb2YgdGhlIHJlZHVjdGlvbnMgd2UgdHJ5IHRvIGFwcGx5IGFyZSBpbnZhbGlkLiAgQSBiZXR0ZXIgd2F5CisgICAgIG1pZ2h0IGJlIHRvIHJlcHJlc2VudCBQTFQgZW50cmllcyB3aXRoIGRpZmZlcmVudCBraW5kcyBvZgorICAgICBzeW1ib2xzLCBhbmQgdXNlIG5vcm1hbCByZWxvY2F0aW9ucyAod2l0aCB1bmRlZmluZWQgc3ltYm9scyk7CisgICAgIGxvb2sgaW50byBpdCBmb3IgdmVyc2lvbiAyLjYuICAqLworICB1bnNpZ25lZCBmeF9wbHQgOiAxOworCisgIC8qIElzIHRoaXMgdmFsdWUgYW4gaW1tZWRpYXRlIGRpc3BsYWNlbWVudD8gICovCisgIC8qIE9ubHkgdXNlZCBvbiBpOTYwIGFuZCBuczMyazsgbWVyZ2UgaXQgaW50byBUQ19GSVhfVFlQRSBzb21ldGltZS4gICovCisgIHVuc2lnbmVkIGZ4X2ltX2Rpc3AgOiAyOworCisgIC8qIEEgYml0IGZvciB0aGUgQ1BVIHNwZWNpZmljIGNvZGUuCisgICAgIFRoaXMgcHJvYmFibHkgY2FuIGJlIGZvbGRlZCBpbnRvIHRjX2ZpeF9kYXRhLCBiZWxvdy4gICovCisgIHVuc2lnbmVkIGZ4X3RjYml0IDogMTsKKworICAvKiBIYXMgdGhpcyByZWxvY2F0aW9uIGFscmVhZHkgYmVlbiBhcHBsaWVkPyAgKi8KKyAgdW5zaWduZWQgZnhfZG9uZSA6IDE7CisKKyAgLyogU3VwcHJlc3Mgb3ZlcmZsb3cgY29tcGxhaW50cyBvbiBsYXJnZSBhZGRlbmRzLiAgVGhpcyBpcyB1c2VkCisgICAgIGluIHRoZSBQb3dlclBDIEVMRiBjb25maWcgdG8gYWxsb3cgbGFyZ2UgYWRkZW5kcyBvbiB0aGUKKyAgICAgQkZEX1JFTE9DX3tMTzE2LEhJMTYsSEkxNl9TfSByZWxvY2F0aW9ucy4KKworICAgICBAQCBDYW4gdGhpcyBiZSBkZXRlcm1pbmVkIGZyb20gQkZEPyAgKi8KKyAgdW5zaWduZWQgZnhfbm9fb3ZlcmZsb3cgOiAxOworCisgIC8qIFRoZSB2YWx1ZSBpcyBzaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuICAqLworICB1bnNpZ25lZCBmeF9zaWduZWQgOiAxOworCisgIC8qIFdoaWNoIGZyYWcgZG9lcyB0aGlzIGZpeCBhcHBseSB0bz8gICovCisgIGZyYWdTICpmeF9mcmFnOworCisgIC8qIFdoZXJlIGlzIHRoZSBmaXJzdCBieXRlIHRvIGZpeCB1cD8gICovCisgIGxvbmcgZnhfd2hlcmU7CisKKyAgLyogTlVMTCBvciBTeW1ib2wgd2hvc2UgdmFsdWUgd2UgYWRkIGluLiAqLworICBzeW1ib2xTICpmeF9hZGRzeTsKKworICAvKiBOVUxMIG9yIFN5bWJvbCB3aG9zZSB2YWx1ZSB3ZSBzdWJ0cmFjdC4gKi8KKyAgc3ltYm9sUyAqZnhfc3Vic3k7CisKKyAgLyogQWJzb2x1dGUgbnVtYmVyIHdlIGFkZCBpbi4gKi8KKyAgdmFsdWVUIGZ4X29mZnNldDsKKworICAvKiBOZXh0IGZpeFMgaW4gbGlua2VkIGxpc3QsIG9yIE5VTEwuICAqLworICBzdHJ1Y3QgZml4ICpmeF9uZXh0OworCisgIC8qIElmIE5VTEwsIG5vIGJpdGZpeCdzIHRvIGRvLiAgKi8KKyAgLyogT25seSBpOTYwLWNvZmYgYW5kIG5zMzJrIHVzZSB0aGlzLCBhbmQgaTk2MC1jb2ZmIHN0b3JlcyBhbgorICAgICBpbnRlZ2VyLiAgVGhpcyBjYW4gcHJvYmFibHkgYmUgZm9sZGVkIGludG8gdGNfZml4X2RhdGEsIGJlbG93LgorICAgICBAQCBBbHBoYSBhbHNvIHVzZXMgaXQsIGJ1dCBvbmx5IHRvIGRpc2FibGUgY2VydGFpbiByZWxvY2F0aW9uCisgICAgIHByb2Nlc3NpbmcuICAqLworICBiaXRfZml4UyAqZnhfYml0X2ZpeFA7CisKKyNpZmRlZiBCRkRfQVNTRU1CTEVSCisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmeF9yX3R5cGU7CisjZWxzZQorI2lmZGVmIE5FRURfRlhfUl9UWVBFCisgIC8qIEhhY2sgZm9yIG1hY2hpbmVzIHdoZXJlIHRoZSB0eXBlIG9mIHJlbG9jIGNhbid0IGJlCisgICAgIHdvcmtlZCBvdXQgYnkgbG9va2luZyBhdCBob3cgYmlnIGl0IGlzLiAgKi8KKyAgaW50IGZ4X3JfdHlwZTsKKyNlbmRpZgorI2VuZGlmCisKKyAgLyogVGhpcyBmaWVsZCBpcyBzb3J0IG9mIG1pc25hbWVkLiAgSXQgYXBwZWFycyB0byBiZSBhIHNvcnQgb2YgcmFuZG9tCisgICAgIHNjcmF0Y2ggZmllbGQsIGZvciB1c2UgYnkgdGhlIGJhY2sgZW5kcy4gIFRoZSBtYWluIGdhcyBjb2RlIGRvZXNuJ3QKKyAgICAgZG8gYW55dGhpbmcgYnV0IGluaXRpYWxpemUgaXQgdG8gemVyby4gIFRoZSB1c2Ugb2YgaXQgZG9lcyBuZWVkIHRvCisgICAgIGJlIGNvb3JkaW5hdGVkIGJldHdlZW4gdGhlIGNwdSBhbmQgZm9ybWF0IGZpbGVzLCB0aG91Z2guICBFLmcuLCBzb21lCisgICAgIGNvZmYgdGFyZ2V0cyBwYXNzIHRoZSBgYWRkZW5kJyBmaWVsZCBmcm9tIHRoZSBjcHUgZmlsZSB2aWEgdGhpcworICAgICBmaWVsZC4gIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGBmeF9vZmZzZXQnIGZpZWxkIGFib3ZlIGNhbid0IGJlIHVzZWQKKyAgICAgZm9yIHRoYXQ7IGludmVzdGlnYXRlIGxhdGVyIGFuZCBkb2N1bWVudC4gS1IgICovCisgIHZhbHVlVCBmeF9hZGRudW1iZXI7CisKKyAgLyogVGhlIGxvY2F0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBjcmVhdGVkIHRoZSByZWxvYywgdXNlZAorICAgICBpbiBlcnJvciBtZXNzYWdlcy4gICovCisgIGNoYXIgKmZ4X2ZpbGU7CisgIHVuc2lnbmVkIGZ4X2xpbmU7CisKKyNpZmRlZiBVU0lOR19DR0VOCisgIHN0cnVjdCB7CisgICAgLyogQ0dFTl9JTlNOIGVudHJ5IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KKyAgICBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICppbnNuOworICAgIC8qIFRhcmdldCBzcGVjaWZpYyBkYXRhLCB1c3VhbGx5IHJlbG9jIG51bWJlci4gICovCisgICAgaW50IG9waW5mbzsKKyAgfSBmeF9jZ2VuOworI2VuZGlmCisKKyNpZmRlZiBUQ19GSVhfVFlQRQorICAvKiBMb2NhdGlvbiB3aGVyZSBhIGJhY2tlbmQgY2FuIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEKKyAgICAgbmVlZGVkIHRvIHBlcmZvcm0gZml4dXBzLiAgKi8KKyAgVENfRklYX1RZUEUgdGNfZml4X2RhdGE7CisjZW5kaWYKK307CisKK3R5cGVkZWYgc3RydWN0IGZpeCBmaXhTOworCisjaWZuZGVmIEJGRF9BU1NFTUJMRVIKK2V4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOworCisjaWZuZGVmIE1BTllfU0VHTUVOVFMKK0NPTU1PTiBmaXhTICp0ZXh0X2ZpeF9yb290LCAqdGV4dF9maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLworQ09NTU9OIGZpeFMgKmRhdGFfZml4X3Jvb3QsICpkYXRhX2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCitDT01NT04gZml4UyAqYnNzX2ZpeF9yb290LCAqYnNzX2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCitleHRlcm4gc3RydWN0IGZyYWcgKnRleHRfbGFzdF9mcmFnOwkJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCitleHRlcm4gc3RydWN0IGZyYWcgKmRhdGFfbGFzdF9mcmFnOwkJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCisjZW5kaWYKK0NPTU1PTiBmaXhTICoqc2VnX2ZpeF9yb290UCwgKipzZWdfZml4X3RhaWxQOwkvKiAtPiBvbmUgb2YgYWJvdmUuICovCisjZW5kaWYKKworZXh0ZXJuIGxvbmcgc3RyaW5nX2J5dGVfY291bnQ7CitleHRlcm4gaW50IHNlY3Rpb25fYWxpZ25tZW50W107CisKK2V4dGVybiBiaXRfZml4UyAqYml0X2ZpeF9uZXcKKyAgUEFSQU1TICgoaW50IHNpemUsIGludCBvZmZzZXQsIGxvbmcgYmFzZV90eXBlLCBsb25nIGJhc2VfYWRqLCBsb25nIG1pbiwKKwkgICBsb25nIG1heCwgbG9uZyBhZGQpKTsKK2V4dGVybiB2b2lkIGFwcGVuZCBQQVJBTVMgKChjaGFyICoqY2hhclBQLCBjaGFyICpmcm9tUCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpKTsKK2V4dGVybiB2b2lkIHJlY29yZF9hbGlnbm1lbnQgUEFSQU1TICgoc2VnVCBzZWcsIGludCBhbGlnbikpOworZXh0ZXJuIHZvaWQgc3Vic2Vnc19maW5pc2ggUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgd3JpdGVfb2JqZWN0X2ZpbGUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGxvbmcgcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBsb25nKSk7CitleHRlcm4gdm9pZCByZWxheF9zZWdtZW50CisgIFBBUkFNUyAoKHN0cnVjdCBmcmFnICogc2VnX2ZyYWdfcm9vdCwgc2VnVCBzZWdfdHlwZSkpOworCitleHRlcm4gdm9pZCBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKK2V4dGVybiB2b2lkIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gICAgUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOworCisjaWZkZWYgQkZEX0FTU0VNQkxFUgorZXh0ZXJuIGZpeFMgKmZpeF9uZXcKKyAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBzeW1ib2xTICogYWRkX3N5bWJvbCwKKwkgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlKSk7CitleHRlcm4gZml4UyAqZml4X25ld19leHAKKyAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBleHByZXNzaW9uUyAqZXhwLCBpbnQgcGNyZWwsCisJICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOworI2Vsc2UKK2V4dGVybiBmaXhTICpmaXhfbmV3CisgIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgc3ltYm9sUyAqIGFkZF9zeW1ib2wsCisJICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwgaW50IHJfdHlwZSkpOworZXh0ZXJuIGZpeFMgKmZpeF9uZXdfZXhwCisgIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwgaW50IHBjcmVsLAorCSAgIGludCByX3R5cGUpKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCB3cml0ZV9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOworCisjZW5kaWYgLyogX193cml0ZV9oX18gKi8KKy8qIGVuZCBvZiB3cml0ZS5oICovCmRpZmYgLS1naXQgYS9ncHJvZi8uZ2RiaW5pdCBiL2dwcm9mLy5nZGJpbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTk0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi8uZ2RiaW5pdApAQCAtMCwwICsxIEBACitkaXIgLi4KZGlmZiAtLWdpdCBhL2dwcm9mL0NoYW5nZUxvZyBiL2dwcm9mL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYyNmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTMxOSBAQAorMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCisKKzE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBncHJvZi5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KKwkqIGdwcm9mLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUKKwlzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0LgorCisxOTk5LTA0LTA1ICBILkouIEx1ICA8aGpsQGdudS5vcmc+CisKKwkqIGNvcmVmaWxlLmMgKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IERvbid0IHVzZSBmaXhlZCBzaXplIGFycmF5CisJZm9yIHByZXZfbmFtZSBhbmQgcHJldl9maWxlbmFtZS4KKworMTk5OS0wNC0wNCAgTWljaGFlbCBIb2htdXRoICA8aG9obXV0aEBpbm5vY2VudC5jb20+CisKKwkqIGdwcm9mLmggKEZGX0JTRDQ0KTogRGVmaW5lLgorCSogZ21vbi5oIChzdHJ1Y3QgcmF3X3BoZHIpOiBBZGQgdmVyc2lvbiwgcHJvZnJhdGUsIGFuZCBzcGFyZQorCWZpZWxkcyB1bmNvbmRpdGlvbmFsbHkuCisJKHN0cnVjdCBvbGRfcmF3X3BoZHIpOiBOZXcgc3RydWN0LgorCSogZ3Byb2YuYyAobWFpbik6IEhhbmRsZSAtTyA0LjRic2QuCisJKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiBIYW5kbGUgQlNEIDQuNCBmb3JtYXQsIGVpdGhlcgorCWF1dG9tYXRpY2FsbHkgb3IgYnkgdXNlciBzcGVjaWZpY2F0aW9uLgorCShnbW9uX291dF93cml0ZSk6IEhhbmRsZSBCU0QgNC40IGZvcm1hdC4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IEJTRDQ0X0ZPUk1BVC4KKwkqIGdwcm9mLnRleGkgKE1pc2NlbGxhbmVvdXMgT3B0aW9ucyk6IERvY3VtZW50IC1PIDQuNGJzZC4KKwkqIGNvbmZpZ3VyZSwgZ2NvbmZpZy5pbjogUmVidWlsZC4KKworVHVlIEZlYiAxNiAxNzowMTozMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgQ2hhbmdlIEFNX1BST0dfSU5TVEFMTAorCXRvIEFDX1BST0dfSU5TVEFMTC4gIFJlbW92ZSBBTV9DWUdXSU4zMi4gIENoYW5nZSBBTV9FWEVFWFQgdG8KKwlBQ19FWEVFWFQuICBBZGQgY29tbWVudCB0byBBQ19ERUZJTkUuCisJKiBhY2NvbmZpZy5oOiBSZW1vdmUuCisJKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisJKiBnY29uZmlnLmluOiBSZWJ1aWxkLgorCitTdW4gRGVjICA2IDIxOjU3OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ3Byb2YudGV4aSAoU3ltc3BlY3MpOiBNZW50aW9uIHRoYXQgeW91IGhhdmUgdG8gYWRkIGFueQorCXVuZGVyc2NvcmUgeW91cnNlbGYgd2hlbiBuYW1pbmcgYSBzeW1ib2wuCisKK01vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKKyAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKworV2VkIEF1ZyAxMiAxNDo1OTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlBdm9pZCBzb21lIG92ZXJmbG93IGNhc2VzOgorCSogYmFzaWNfYmxvY2tzLmggKGJiX21pbl9jYWxscyk6IENoYW5nZSB0byB1bnNpZ25lZCBsb25nLgorCSogY2FsbF9ncmFwaC5oIChjZ190YWxseSk6IENoYW5nZSBjb3VudCBwYXJhbWV0ZXIgdG8gdW5zaWduZWQKKwlsb25nLgorCSogY2dfYXJjcy5oIChBcmMpOiBDaGFuZ2UgY291bnQgZmllbGQgdG8gdW5zaWduZWQgbG9uZy4KKwkoYXJjX2FkZCk6IENoYW5nZSBjb3VudCBwYXJhbWV0ZXIgdG8gdW5zaWduZWQgbG9uZy4KKwkqIHNvdXJjZS5oIChTb3VyY2VfRmlsZSk6IENoYW5nZSBuY2FsbHMgZmllbGQgdG8gdW5zaWduZWQgbG9uZy4KKwkqIHN5bXRhYi5oIChTeW0pOiBDaGFuZ2UgZmllbGRzIG5jYWxscywgYmJfY2FsbHMsIGFuZAorCWNnLnNlbGZfY2FsbHMgdG8gdW5zaWduZWQgbG9uZy4KKwkqIE1hbnkgZmlsZXM6IFVwZGF0ZSBhY2NvcmRpbmdseS4KKworCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgdG9vbHMuCisKK0ZyaSBKdWwgMTAgMTc6Mjk6NDkgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChCU0Q0NF9GT1JNQVQpOiBEZWZpbmUgZm9yIGN5Z3dpbjMyLCB3aW4zMiwgbWluZ3czMgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgSnVuIDEyIDEzOjQwOjA1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KKwkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgorCitTdW4gTWF5IDEwIDIyOjM1OjMzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KKworVHVlIE1heSAgNSAxODoyODo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGdwcm9mLmggKF8pOiBVbmRlZmluZSBCRkQncyB2ZXJzaW9uLgorCitUdWUgQXByIDI4IDE5OjE3OjMzIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogZ3Byb2YuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCisJKiBncHJvZi5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KKwkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCisKK1R1ZSBBcHIgMjggMTk6NTA6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb3JlZmlsZS5jOiBSZW5hbWUgZnJvbSBjb3JlLmMuCisJKiBjb3JlZmlsZS5oOiBSZW5hbWUgZnJvbSBjb3JlLmguCisJKiBNYW55IC5jIGZpbGVzOiBJbmNsdWRlIGNvcmVmaWxlLmggcmF0aGVyIHRoYW4gY29yZS5oLgorCSogTWFrZWZpbGUuYW0gKHNvdXJjZXMpOiBDaGFuZ2UgY29yZS5jIHRvIGNvcmVmaWxlLmMuCisJKG5vaW5zdF9IRUFERVJTKTogQ2hhbmdlIGNvcmUuaCB0byBjb3JlZmlsZS5oLgorCSgkKE9CSkVDVFMpKTogRGVwZW5kIHVwb24gY29yZWZpbGUuaCByYXRoZXIgdGhhbiBjb3JlLmguCisJKGNvcmVmaWxlLm8pOiBSZW5hbWUgdGFyZ2V0IGZyb20gY29yZS5vLCBkZXBlbmQgdXBvbiBjb3JlZmlsZS5jLgorCSogTWFrZWZpbGUuaW4sIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWxkLgorCitNb24gQXByIDI3IDE2OjUwOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIEFwciAyMiAxNjowMToxNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCisKK1dlZCBBcHIgMjIgMDA6MDA6MjIgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBzY3JpYmJsZXMuY3lnbnVzLmNvbT4KKworCSogZ3Byb2YuaDogQWRkZWQgaW5jbHVkZXMgYW5kIGRlZmluZXMgZm9yIGdldHRleHQuCisJKiBjb25maWd1cmUuaW4gKEFMTF9MSU5HVUFTKTogTmV3IG1hY3JvLgorCUNhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kIHBvL01ha2VmaWxlLgorCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAorCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCisJKiBncHJvZi5jIChtYWluKTogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluLgorCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBOZXcgbWFjcm8uCisJKElOQ0xVREVTKTogTG9vayBpbiBpbnRsIGRpcnMgZm9yIGhlYWRlcnMuICBEZWZpbmUgTE9DQUxFRElSLgorCShncHJvZl9ERVBFTkRFTkNJRVMpOiBBZGRlZCBJTlRMREVQUy4KKwkoZ3Byb2ZfTERBREQpOiBBZGRlZCBJTlRMTExJQlMuCisJKFBPVEZJTEVTKTogTmV3IG1hY3JvLgorCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCisJKiBNYW55IGZpbGVzOiBXcmFwIHVzZXItdmlzaWJsZSBzdHJpbmdzIHdpdGggZ2V0dGV4dCBpbnZvY2F0aW9uLgorCitUdWUgQXByICA3IDEyOjQzOjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gaGpsQGx1Y29uLm9yZyA8SC5KLiBMdT46CisJKiBNYWtlZmlsZS5hbSAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitNb24gTWFyIDMwIDEyOjQ3OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgorCitTYXQgTWFyIDI4IDIzOjA5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKKwkqIGNnX2FyY3MuYyAobnVtX2N5Y2xlcyk6IENoYW5nZSB0byB1bnNpZ25lZCBpbnQuCisJKG51bWFyY3MpOiBMaWtld2lzZS4KKwkoYXJjX2FkZCk6IENoYW5nZSBtYXhhcmNzIHRvIHVuc2lnbmVkIGludC4KKwkoY2dfYXNzZW1ibGUpOiBDaGFuZ2UgaW5kZXggdG8gdW5zaWduZWQgaW50LgorCSogY2dfYXJjcy5oIChudW1fY3ljbGVzLCBudW1hcmNzKTogVXBkYXRlIGRlY2xhcmF0aW9ucy4KKwkqIGNnX3ByaW50LmMgKGNnX3ByaW50KTogQ2hhbmdlIGluZGV4IHRvIHVuc2lnbmVkIGludC4KKwkoY2dfcHJpbnRfaW5kZXgpOiBDaGFuZ2UgaW5kZXgsIG5uYW1lcywgdG9kbywgaSwgYW5kIGogdG8gdW5zaWduZWQKKwlpbnQuCisJKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpOiBDaGFuZ2Ugc3ltYm9sX2NvdW50IGFuZCBpbmRleDIgdG8KKwl1bnNpZ25lZCBpbnQuCisJKiBjb3JlLmMgKHN5bWJvbF9tYXBfY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQgaW50LgorCShjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgorCShjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgorCSogaGlzdC5jIChoaXN0X2Fzc2lnbl9zYW1wbGVzKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgorCShoaXN0X3ByaW50KTogQ2hhbmdlIGluZGV4IHRvIHVuc2lnbmVkIGkgbnQuICBBZGQgY2FzdCB0byBhdm9pZAorCXdhcm5pbmcuCisJKiBzeW1faWRzLmMgKHBhcnNlX3NwZWMpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZy4KKwkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCisJKHN5bV9sb29rdXApOiBVcGRhdGUgcHJpbnRmIGZvcm1hdCBzdHJpbmdzLgorCSogc3ltdGFiLmggKFN5bV9UYWJsZSk6IENoYW5nZSBsZW4gdG8gdW5zaWduZWQgaW50LgorCSogdGFob2UuYyAodGFob2VfcmVsYWRkcik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KKworVHVlIE1hciAyNCAxOTowMDoxMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlBZGQgLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZSBvcHRpb25zOgorCSogZ3Byb2YuaCAoZGVtYW5nbGUpOiBEZWNsYXJlLgorCSogZ3Byb2YuYyAoZGVtYW5nbGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShPUFRJT05fREVNQU5HTEUsIE9QVElPTl9OT19ERU1BTkdMRSk6IERlZmluZS4KKwkobG9uZ19vcHRpb25zKTogQWRkICJkZW1hbmdsZSIgYW5kICJuby1kZW1hbmdsZSIuCisJKHVzYWdlKTogTWVudGlvbiAtLWRlbWFuZ2xlIGFuZCAtLW5vLWRlbWFuZ2xlLgorCShtYWluKTogSGFuZGxlIE9QVElPTl9ERU1BTkdMRSBhbmQgT1BUSU9OX05PX0RFTUFOR0xFLgorCSogdXRpbHMuYyAocHJpbnRfbmFtZV9vbmx5KTogT25seSBkZW1hbmdsZSBzeW1ib2wgbmFtZSBpZiBkZW1hbmdsZQorCWlzIHRydWUuCisJKiBncHJvZi50ZXhpIChPdXRwdXQgT3B0aW9ucyk6IERvY3VtZW50IG5ldyBvcHRpb25zLgorCitGcmkgTWFyIDIwIDE5OjIxOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCisKK1RodSBGZWIgMTIgMTQ6MzY6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBncHJvZi5jICh1c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCisKK1NhdCBGZWIgIDcgMTU6NDM6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKworRnJpIEZlYiAgNiAxMjowMjoyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFscGhhLmMgKGFscGhhX0luc3RydWN0aW9uKTogVXNlIGludCwgbm90IHNpZ25lZC4KKworRnJpIEZlYiAgNiAwMjowMDoxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvcmUuYyAoY29yZV9pbml0KTogQWRkaW5nIG1pc3NpbmcgImJyZWFrIi4KKworVGh1IEZlYiAgNSAxMjo0OTozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKworVHVlIEZlYiAgMyAxNDoyNToyNSAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+CisKKwkqIGJiY29udi5wbDogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZCBiYmNvbnYucGwuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogZ3Byb2YudGV4aTogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBkb2N1bWVudCBhbGwgYXJndW1lbnRzIGFuZAorCW91dHB1dCBmb3JtYXRzLgorCisJKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogUHJlZmVyIGZ1bmN0aW9uIHN5bWJvbHMgb3ZlciBsaW5lCisJc3ltYm9scy4KKwkoZGJnX3N5bV9sb29rdXApOiBDb3JyZWN0IGRlYnVnZ2luZyBtZXNzYWdlcy4KKworCSogZ3Byb2YuYyAobWFpbik6IC0tc3VtIGltcGxpZXMgLS1saW5lLgorCisJKiBjZ19wcmludC5jIChjZ19wcmludCk6IFdoZW4gZG9pbmcgbGluZSBieSBsaW5lIHByb2ZpbGluZywgZG9uJ3QKKwl1c2UgYSBub24tZnVuY3Rpb24gYXMgYSBtYWluIGxpc3RpbmcgaXRlbS4KKworCSogY2FsbF9ncmFwaC5jIChjZ190YWxseSk6IFdoZW4gdXNpbmcgbGluZSBieSBsaW5lIHByb2ZpbGluZywgdXNlCisgCXRoZSBmdW5jdGlvbiBzeW1ib2wgYXMgdGhlIGNoaWxkLgorCisJKiBzeW10YWIuaCAoTkJCUyk6IERlZmluZS4KKwkoU3ltKTogQWRkIGJiX2FkZHIgYW5kIGJiX2NhbGxzIGZpZWxkcy4KKwkqIGJhc2ljX2Jsb2Nrcy5jIChiYl9yZWFkX3JlYyk6IFNhdmUgbXVsdGlwbGUgYmFzaWMgYmxvY2tzIHBlcgorCXN5bWJvbC4KKwkoYmJfd3JpdGVfYmxvY2tzKTogQWRqdXN0IGZvciBtdWx0aXBsZSBiYXNpYyBibG9ja3MgcGVyIHN5bWJvbC4KKwkocHJpbnRfZXhlY19jb3VudHMpOiBEb24ndCBjaGVjayB3aGV0aGVyIGEgc3ltYm9sIGlzIHRoZSBzdGFydCBvZgorCWEgYmFzaWMgYmxvY2suICBQcmludCBhbGwgYmFzaWMgYmxvY2tzIGZvciBhIHN5bWJvbC4KKwkoYW5ub3RhdGVfd2l0aF9jb3VudCk6IFJld3JpdGUgdG8gcHJpbnQgYWxsIGJhc2ljIGJsb2NrIGNvdW50cyBhbmQKKwl0byBwYXkgYXR0ZW50aW9uIHRvIHdpZHRoIGFyZ3VtZW50LgorCShwcmludF9hbm5vdGF0ZWRfc291cmNlKTogRG9uJ3QgY2hlY2sgd2hldGhlciBzeW1ib2wgaXMgdGhlIHN0YXJ0CisJb2YgYSBiYXNpYyBibG9jay4KKworCU1ha2UgaXQgcG9zc2libGUgdG8gYnVpbGQgYSBjcm9zcyBncHJvZiwgYWx0aG91Z2ggYSBmZXcgY2FzZXMgYXJlCisJc3RpbGwgbm90IGhhbmRsZWQ6CisJKiBjb25maWd1cmUuaW46IERvbid0IHNldCBNWV9UQVJHRVQuCisJKiBncHJvZi5oOiBEb24ndCBpbmNsdWRlIE1BQ0hJTkVfSC4gIERvbid0IGRlZmluZSBGT1BFTl9SQiBvcgorCUZPUEVOX1dCOyBqdXN0IGdldCB0aGVtIGZyb20gc3lzZGVwLmguCisJKiBjb3JlLmggKG1pbl9pbnNuX3NpemUsIG9mZnNldF90b19jb2RlKTogRGVjbGFyZS4KKwkqIGNvcmUuYyAoTUlOX0lOU05fU0laRSk6IERvbid0IGRlZmluZS4KKwkobWluX2luc25fc2l6ZSwgb2Zmc2V0X3RvX2NvZGUpOiBOZXcgdmFyaWFibGVzLgorCShjb3JlX2luaXQpOiBJbml0aWFsaXplIG1pbl9pbnNuX3NpemUgYW5kIG9mZnNldF90b19jb2RlLgorCShmaW5kX2NhbGwpOiBOZXcgZnVuY3Rpb24uCisJKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IERvbid0IHVzZSBtaW5fZGlzdC4gIFNldCBpc19zdGF0aWMgaW4KKwlwYXNzIDIuCisJKiBoaXN0LmMgKFVOSVRTX1RPX0NPREUpOiBEZWZpbmUuCisJKiBncHJvZi5jIChkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QpOiBBZGQgIl9fbWNvdW50X2ludGVybmFsIi4KKwkqIGdtb24uaDogQ2hhbmdlIFRBUkdFVF9hbHBoYSB0byBfX2FscGhhX18uCisJKiBoZXJ0ei5oOiBJZmRlZiBNQUNILCBkZWZpbmUgaGVydHogYXMgSFouCisJKiBhbHBoYS5jIChhbHBoYV9JbnN0cnVjdGlvbik6IFJlbmFtZSBmcm9tIEluc3RydWN0aW9uLiAgQ2hhbmdlCisJYWxsIHJlZmVyZW5jZXMuCisJKGFscGhhX2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4KKwkqIGFscGhhLmg6IFJlbW92ZS4KKwkqIGR1bW15LmMsIGR1bW15Lmg6IFJlbW92ZS4KKwkqIGkzODYuYyAoaTM4Nl9pc2NhbGwpOiBSZW5hbWUgZnJvbSBpc2NhbGwuICBDaGFuZ2UgYWxsCisJcmVmZXJlbmNlcy4gIENoZWNrIGZvciBjYWxsIGluc3RydWN0aW9uLCBub3QganVtcCBvciBsY2FsbC4KKwkoaTM4Nl9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuICBDb3JyZWN0IGZvciBWTUEuCisJQ29ycmVjdCBjYWxsIGRlc3RpbmF0aW9uIGNvbXB1dGF0aW9uLiAgRG9uJ3QgZGVyZWZlcmVuY2Ugc3ltYm9sIGlmCisJaXQgaXMgTlVMTC4KKwkqIGkzODYuaDogUmVtb3ZlLgorCSogbnM1MzIuYywgbnM1MzIuaDogUmVtb3ZlLgorCSogc3BhcmMuYyAoQ0FMTCk6IERlZmluZS4KKwkoc3BhcmNfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLgorCSogc3BhcmMuaDogUmVtb3ZlLgorCSogdGFob2UuYzogSW5jbHVkZSBjZ19hcmNzLmgsIGNvcmUuaCwgaGlzdC5oLCBhbmQgc3ltdGFiLmguICBEb24ndAorCWluY2x1ZGUgdGltZV9ob3N0LmguCisJKENBTExGLCBQQyk6IERlZmluZS4KKwkoZW51bSB0YWhvZV9vcGVybW9kZXMsIHRhaG9lX29wZXJhbmRlbnVtKTogRGVmaW5lLiAgUmVuYW1lIGFsbAorCXJlZmVyZW5jZXMgdG8gb3Blcm1vZGVzIG9yIG9wZXJhbmRlbnVtIHRvIHRoZXNlLgorCSh0YWhvZV9vcGVyYW5kbW9kZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRtb2RlLiAgQ2FsbCBhYm9ydCBpZgorCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCisJKHRhaG9lX29wZXJhbmRuYW1lKTogUmVuYW1lIGZyb20gb3BlcmFuZG5hbWUuICBDYWxsIGFib3J0IGlmCisJc3dpdGNoIGRvZXMgbm90IHJldHVybi4KKwkodGFob2Vfb3BlcmFuZGxlbmd0aCk6IFJlbmFtZSBmcm9tIG9wZXJhbmRsZW5ndGguICBDYWxsIGFib3J0IGlmCisJc3dpdGNoIGRvZXMgbm90IHJldHVybi4KKwkodGFob2VfcmVsYWRkcik6IFJlbmFtZSBmcm9tIHJlbGFkZHIuCisJKHRhaG9lX2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4gIFVzZSBjb3JlX3RleHRfc3BhY2UKKwlyYXRoZXIgdGhhbiB0ZXh0c3BhY2UuCisJKiB0YWhvZS5oOiBSZW1vdmUuCisJKiB2YXguYyAoQ0FMTFMsIFBDKTogRGVmaW5lLgorCShlbnVtIG9wZXJtb2Rlcywgb3BlcmFuZGVudW0sIHN0cnVjdCBtb2RlYnl0ZSk6IERlZmluZS4KKwkodmF4X29wZXJhbmRtb2RlKTogUmVuYW1lIGZyb20gb3BlcmFuZG1vZGUuICBDYWxsIGFib3J0IGlmIHN3aXRjaAorCWRvZXMgbm90IHJldHVybi4KKwkodmF4X29wZXJhbmRuYW1lKTogUmVuYW1lIGZyb20gb3BlcmFuZG5hbWUuICBDYWxsIGFib3J0IGlmIHN3aXRjaAorCWRvZXMgbm90IHJldHVybi4KKwkodmF4X29wZXJhbmRsZW5ndGgpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbGVuZ3RoLiAgQ2FsbCBhYm9ydCBpZgorCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCisJKHZheF9yZWxhZGRyKTogUmVuYW1lIGZyb20gcmVsYWRkci4KKwkodmF4X2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4KKwkqIHZheC5oOiBSZW1vdmUuCisJKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IFNldCB0byBjeWdudXMuCisJKE1ZX1RBUkdFVCk6IFJlbW92ZS4KKwkoSU5DTFVERVMpOiBSZW1vdmUgLURUQVJHRVRfJChNWV9UQVJHRVQpIGFuZCAtRE1BQ0hJTkVfSD0KKwlcIiQoTVlfVEFSR0VUKS5oXCIuCisJKGdwcm9mX1NPVVJDRVMpOiBBZGQgaTM4Ni5jLCBhbHBoYS5jLCB2YXguYywgdGFob2UuYywgc3BhcmMuYy4KKwkoZ3Byb2ZfREVQRU5ERU5DSUVTKTogUmVtb3ZlICQoTVlfVEFSR0VUKS5vLgorCShncHJvZl9MREFERCk6IExpa2V3aXNlLgorCShub2luc3RfSEVBREVSUyk6IFJlbW92ZSBhbHBoYS5oLCBpMzg2LmgsIG5zNTMyLmgsIHNwYXJjLmgsCisJdGFob2UuaCwgdmF4LmgsIGR1bW15LmguCisJKEVYVFJBX0RJU1QpOiBSZW1vdmUgYWxwaGEuYywgaTM4Ni5jLCBuczUzMi5jLCBzcGFyYy5jLCB0YWhvZS5jLAorCXZheC5jLCBkdW1teS5jLgorCSgkKE9CSkVDVFMpKTogRG9uJ3QgZGVwZW5kIHVwb24gJChNWV9UQVJHRVQpLmguCisJKCQoTVlfVEFSR0VUKS5vKTogUmVtb3ZlIHRhcmdldC4KKwkoaTM4Ni5vLCBhbHBoYS5vLCB2YXgubywgdGFob2Uubywgc3BhcmMubyk6IE5ldyB0YXJnZXRzLgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZC4KKworTW9uIERlYyAyOSAxNDoxNzowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvcmUuYyAoY29yZV9zeW1fY2xhc3MpOiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgdGV4dCBzeW1ib2xzLgorCUZyb20gRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4uCisKK1dlZCBTZXAgMjQgMTE6MzU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b21ha2UuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1NhdCBBdWcgIDkgMTY6MjU6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjguMi4gIENhbGwKKwlBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUgc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5CisJbGlidG9vbC4gIEFkZCBBTV9DT05GSUdfSEVBREVSLiAgQ2hhbmdlIEFDX1BST0dfSU5TVEFMTCB0bworCUFNX1BST0dfSU5TVEFMTC4gIEFkZCBBTV9FWEVFWFQuCisJKiBNYWtlZmlsZS5hbSAoTElOSyk6IFJlbW92ZS4KKwkoZ3Byb2ZfTERGTEFHUyk6IFJlbW92ZQorCShncHJvZl9ERVBFTkRFTkNJRVMpOiBDaGFuZ2UgbGliYmZkLmEgdG8gbGliYmZkLmxhLgorCShncHJvZl9MREFERCk6IExpa2V3aXNlLgorCSgkKE9CSkVDVFMpKTogRGVwZW5kIHVwb24gZ2NvbmZpZy5oIGFuZCAuLi9iZmQvY29uZmlnLmguCisJKiBncHJvZi5oOiBVbmRlZmluZSBQQUNLQUdFIGFuZCBWRVJTSU9OIGFmdGVyIGluY2x1ZGluZyBCRkQKKwlzeXNkZXAuaCBmaWxlLCB0aGVuIGluY2x1ZGUgbmV3IGdjb25maWcuaCBmaWxlLgorCSogZ3Byb2YuYyAoVkVSU0lPTik6IERvbid0IGRlZmluZS4KKwkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgorCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCisJKiBnY29uZmlnLmluOiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhdXRvaGVhZGVyLgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZC4KKworU2F0IEp1biAyOCAyMzoyMDo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjIuCisKK01vbiBKdW4gMTYgMTU6MzE6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBBZGQgLURERUJVRy4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitUdWUgQXByIDE1IDE0OjE5OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUNoYW5nZSB0byB1c2UgYXV0b21ha2U6CisJKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJ1biBBTV9JTklUX0FVVE9NQUtFLCBBTV9NQUlOVEFJTkVSX01PREUsIGFuZAorCUFNX0NZR1dJTjMyLgorCSogYWNsb2NhbC5tNDogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYWNsb2NhbC4KKwkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIHdpdGggZmlsZSBjcmVhdGVkIGJ5IGF1dG9tYWtlIC0tY3lnbnVzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUaHUgQXByICAzIDEzOjIxOjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ3Byb2YuYyAoVkVSU0lPTik6IERlZmluZSBhcyAiMi44LjEiLgorCisJKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCisKK1RodSBNYXIgMjcgMTc6MTU6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBncHJvZi5jIChtYWluKTogQ29ycmVjdCBjb3B5cmlnaHQgbWVzc2FnZS4KKworTW9uIE1hciAyNCAxMToxMjoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICguYy5vKTogRGVmaW5lIFRBUkdFVF8kKE1ZX1RBUkdFVCkgd2hlbiBjb21waWxpbmcuCisgIAkqIGdtb24uaDogVXNlIGJ5dGVzIGNvdW50cyByYXRoZXIgdGhhbiBzaXplb2YgaW4gc3RydWN0IHJhd19waGRyCisgCWFuZCBzdHJ1Y3QgcmF3X2FyYy4KKworTW9uIE1hciAxNyAxMDo1NDo0NyAxOTk3ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgorCisJKiBjZ19hcmNzLmMgKGFyY19hZGQpOiBtZW1zZXQoKSBuZXdseSBhbGxvY2VkIGFyYyB0byBlbnN1cmUKKwlhbGwgZmllbGRzIGFyZSBpbml0aWFsaXplZCB3aXRoIDAuCisKK1NhdCBNYXIgMTUgMTk6MTc6MzEgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHN5bXRhYi5oIChmaW5kX2NhbGwpOiBEZWNsYXJlLgorCSogY2dfYXJjcy5jIChjZ19hc3NlbWJsZSk6IERvbid0IGRlY2xhcmUgZmluZF9jYWxsLgorCSogaGlzdC5jIChzY2FsZV9hbmRfYWxpZ25fZW50cmllcyk6IERlY2xhcmUuCisKK1RodSBGZWIgMjcgMTI6NDY6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERlZmluZSBCU0Q0NF9GT1JNQVQgaWYgdGhlIHRhcmdldCBsb29rcyBsaWtlIGEKKwlCU0Q0LjQgZGVyaXZlZCBzeXN0ZW0uCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoLmMubyk6IEFkZCBAREVGU0AuCisJKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiBJbiBCU0Q0NF9GT1JNQVQgY29kZSwgZ2V0IHByb2ZyYXRlCisJZnJvbSBwcm9mcmF0ZSBmaWVsZCwgbm90IHZlcnNpb24gZmllbGQuCisKK1RodSBKYW4gMTYgMTc6NDI6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkdW1teS5jIChmaW5kX2NhbGwpOiBDbGVhciBpZ25vcmVfZGlyZWN0X2NhbGxzLgorCitUdWUgRGVjIDMxIDE1OjQ0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBBZGQgLURfR05VX1NPVVJDRS4gIFB1dCAkKENGTEFHUykgYXQgdGhlCisJZW5kLgorCShncHJvZik6IFB1dCAkKENGTEFHUykgYWZ0ZXIgdGhlIG90aGVyIG9wdGlvbnMuCisKK1R1ZSBOb3YgMjYgMTc6MDg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgorCitXZWQgT2N0ICAyIDE1OjIzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3BhcmMuYyAoZmluZF9jYWxsKTogQWxpZ24gcF9sb3dwYyB0byBhdm9pZCBidXMgZXJyb3IuCisKK1R1ZSBPY3QgIDEgMTU6NTg6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBncHJvZi5jICh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KKwkobWFpbik6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VIHN0YW5kYXJkcy4KKworRnJpIEF1ZyAzMCAxMjoxNjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdtb24uaDogUmVwbGFjZSAjZWxpZiB3aXRoICNlbHNlLyNlbmRpZi4KKworVGh1IEF1ZyAyOSAxNzowNDoxMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitUaHUgQXVnIDIyIDE3OjEyOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTZXQgYW5kIHN1YnN0aXR1dGUgSExERU5WLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKEhMREVOVik6IE5ldyB2YXJpYWJsZS4KKwkoZ3Byb2YpOiBVc2UgJChITERFTlYpLgorCitXZWQgQXVnICA3IDE0OjQzOjUxIDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIGNvcmUuYyAocmVhZF9mdW5jdGlvbl9tYXBwaW5ncyk6IENhc3QgeG1hbGxvYyByZXR1cm4uCisKK1RodSBKdWwgIDQgMTI6MDE6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBncHJvZi5jIChWRVJTSU9OKTogRGVmaW5lIGFzICIyLjcuMSIuCisKKwkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KKworCSogYmJfZXhpdF9mdW5jLmM6IFJlbmFtZSBmcm9tIF9fYmJfZXhpdF9mdW5jLmMsIHNvIHRoYXQgaXQgY2FuIGJlCisJc3RvcmVkIG9uIGEgU3lzdGVtIFYgZmlsZSBzeXN0ZW0uCisKK1RodSBKdW4gMjcgMTE6MzY6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfSVNDX1BPU0lYLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKGdwcm9mKTogUGFzcyAkKENGTEFHUykgZHVyaW5nIGxpbmsuCisJKiBoZXJ0ei5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdGltZS5oPjsgbGV0IHN5c2RlcC5oIGhhbmRsZSB0aGF0LgorCUlmIEhBVkVfU0VUSVRJTUVSIGlzIG5vdCBkZWZpbmVkLCB0cnkgdXNpbmcgc3lzY29uZi4KKworTW9uIEp1biAyNCAxODoyNzoyOCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAoZXhlY19wcmVmaXgsIGJpbmRpciwgbGliZGlyLCBtYW5kaXIsIGluZm9kaXIsIGRhdGFkaXIsCisJSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKwkoQUNfUFJPR19JTlNUQUxMKTogYWRkZWQuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK01vbiBKdW4gMjQgMTI6MDM6MDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKKwl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KKworVHVlIEp1biAxOCAxNzozNTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvcmUuYyAoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgorCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoKTogTGlrZXdpc2UuCisKK01vbiBBcHIgIDggMTQ6NDQ6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKKwlkaXJlY3Rvcmllcy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IE1hciAyMSAxNzoxODoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvcmUuYyAoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IE1vdmUgZmlsZW5hbWUgYW5kIGZ1bmNfbmFtZQorCWluc2lkZSBpZmRlZiB3aGVyZSB0aGV5IGFyZSB1c2VkLgorCisJKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogUGFyZW50aGVzaXplICYmIHdpdGhpbiB8fC4KKwkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24uCisKKwkqIGNnX3ByaW50LmggKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpOiBEZWNsYXJlLgorCShjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyk6IERlY2xhcmUuCisKKwkqIF9fYmJfZXhpdF9mdW5jLmMgKF9fYmJfZXhpdF9mdW5jKTogUmVwbGFjZSBiY29weSB3aXRoIG1lbWNweS4KKwkqIGNnX2FyY3MuYyAoYXJjX2FkZCk6IExpa2V3aXNlLgorCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBMaWtld2lzZS4KKworVGh1IE1hciAyMSAxNzowMjowMiAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgorCisJKiBncHJvZi5jIChkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QpOiBBZGQgIl9fbWNvdW50Ii4KKworCSogZ3Byb2YuYyAobWFpbik6IENoYW5nZSBpZmRlZiBfX29zZl9fIHRvIF9fYWxwaGFfXy4KKworCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogSWYgQlNENDRfRk9STUFUIGlzIGRlZmluZWQsIGdldCB0aGUKKwlwcm9maWxpbmcgcmF0ZSBmcm9tIHRoZSBoZWFkZXIuCisKKwkqIGdtb24uaCAoc3RydWN0IHJhd19waGRyKTogT25seSBpbmNsdWRlIHBhZCBpZiBib3RoIF9fYWxwaGFfXyBhbmQKKwlfX29zZl9fIGFyZSBkZWZpbmVkLiAgQWRkIG5ldyBmaWVsZHMgaWYgQlNENDRfRk9STUFUIGlzIGRlZmluZWQuCisKKwkqIGFscGhhLmggKE1JTl9JTlNOX1NJWkUpOiBEZWZpbmUuCisJKiBjb3JlLmMgKE1JTl9JTlNOX1NJWkUpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDEuCisJKGNvcmVfc3ltX2NsYXNzKTogSWdub3JlIGRlYnVnZ2luZyBzeW1ib2xzLgorCShjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBVc2UgTUlOX0lOU05fU0laRSB3aGVuIGdhdGhlcmluZyBsaW5lCisJaW5mb3JtYXRpb24uCisKK1dlZCBNYXIgMjAgMTg6MTU6NDcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNnX3ByaW50LmMgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogRml4IF9fR05VQ19fIG1pc3NwZWxsZWQKKwlhcyBfX0dOVV9DX18uCisJKG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzKTogTGlrZXdpc2UuCisKK1R1ZSBNYXIgMTIgMTI6MTk6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCisKK1N1biBGZWIgMTggMTU6MDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAnZG8gbm90IG1peCcgZnJvbSBuYXRpdmUgbGlua2VyIGJlZm9yZQorIAl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVHVlIEZlYiAxMyAxNTozMjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIEZlYiAgNyAxNDowMzoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IENDLiAgTG9vayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgU2V0CisJQkZETElCIGFuZCBITERGTEFHUyBhbmQgc3Vic3RpdHV0ZSB0aGVtLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKExJQlMpOiBVc2UgQEJGRExJQkAuCisJKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShncHJvZik6IFVzZSAkKEhMREZMQUdTKS4KKworTW9uIEZlYiAgNSAxNjozNDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KKwlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgorCSogTWFrZWZpbGUuaW4gKExJQkRFUFMpOiBOZXcgdmFyaWFibGUuCisJKExJQlMpOiBVc2UgLUwuLi9iZmQgLWxiZmQuCisJKGdwcm9mKTogRGVwZW5kIHVwb24gJChMSUJERVBTKSByYXRoZXIgdGhhbiAkKExJQlMpLgorCitTYXQgRGVjIDMwIDEwOjExOjAzIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ3Byb2YuYyAobG9uZ19vcHRpb25zKTogQWRkICItLWZ1bmN0aW9uLW9yZGVyaW5nIiBhbmQKKwkiLS1maWxlLW9yZGVyaW5nIiBvcHRpb25zLgorCSh1c2FnZSk6IEFkZCBuZXcgb3B0aW9ucyB0byB1c2FnZSBtZXNzYWdlLgorCShtYWluKTogSGFuZGxlIG5ldyBvcHRpb25zLgorCSogZ3Byb2YuaCAoU1RZTEVfRlVOQ1RJT05fT1JERVIpOiBEZWZpbmUuCisJKFNUWUxFX0ZJTEVfT1JERVIpOiBEZWZpbmUuCisJKGZ1bmN0aW9uX21hcHBpbmdfZmlsZSk6IERlY2xhcmUuCisJKiBjZ19hcmNzLmMgKGFyY3MsIG51bWFyY3MpOiBOZXcgZ2xvYmFscy4KKwkoYXJjX2FkZCk6IFB1dCBuZXcgYXJjcyBpbnRvIHRoZSBhcmMgYXJyYXkgc28gdGhlIGZ1bmN0aW9uL2ZpbGUKKwlvcmRlcmluZyBjb2RlIGNhbiBleGFtaW5lIHRoZW0uCisJKiBjZ19hcmNzLmggKHN0cnVjdCBhcmMpOiBOZXcgZmllbGQgImhhc19iZWVuX3BsYWNlZCIuCisJKGFyY3MsIG51bWFyY3MpOiBEZWNsYXJlIG5ldyBnbG9iYWxzLgorCSogY29yZS5jIChzeW1ib2xfbWFwLCBzeW1ib2xfbWFwX2NvdW50KTogTmV3IGdsb2JhbHMuCisJKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MpOiBOZXcgZnVuY3Rpb24gdG8gcmVhZCBpbiBhIGZ1bmN0aW9uCisJdG8gb2JqZWN0IG1hcCBmaWxlLgorCShjb3JlX2luaXQpOiBDYWxsIHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MgaWYgYSBmdW5jdGlvbiBtYXBwaW5nCisJZmlsZSBleGlzdHMuCisJKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBIYW5kbGUgZnVuY3Rpb24gdG8gb2JqZWN0IGZpbGUKKwltYXBwaW5ncy4KKwkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltKTogTmV3IGZpZWxkcyAibWFwcGVkIiwgImhhc19iZWVuX3BsYWNlZCIsCisJIm51c2VzIiwgInByZXYiLgorCSogY2dfcHJpbnQuYyAoY21wX2FyY19jb3VudCk6IE5ldyBmdW5jdGlvbiBmb3Igc29ydGluZyBhcmNzLgorCShjbXBfZnVuX251c2VzKTogTGlrZXdpc2UgZm9yIGZ1bmN0aW9ucy4KKwkoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgYSBzdWdnZXN0ZWQKKwlmdW5jdGlvbiBvcmRlcmluZy4KKwkoY2dfcHJpbnRfZmlsZV9vcmRlcmluZyk6IExpa2V3aXNlIGZvciBvcmRlcmluZyAubyBmaWxlcy4KKwkob3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MpOiBIZWxwZXIgZnVuY3Rpb24gZm9yIGZ1bmN0aW9uCisJYW5kIG9iamVjdCBmaWxlIG9yZGVyaW5nIGNvZGUuCisKK1N1biBEZWMgMjQgMjE6MzI6MjcgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogSWdub3JlIHN5bWJvbHMgd2l0aG91dCBCU0ZfRlVOQ1RJT04KKwlzZXQgaWYgaWdub3JlX25vbl9mdW5jdGlvbiBpcyBzZXQuCisJKiBncHJvZi5oIChpZ25vcmVfbm9uX2Z1bmN0aW9ucyk6IERlY2xhcmUuCisJKiBncHJvZi5jIChpZ25vcmVfbm9uX2Z1bmN0aW9ucyk6IERlZmluZS4KKwkobG9uZ19vcHRpb25zKTogQWRkICJpZ25vcmUtbm9uLWZ1bmN0aW9ucyIuCisJKHVzYWdlKTogQWRkIG5ldyBvcHRpb25zLgorCShtYWluKTogUmVjb2duaXplICItRCIgYW5kICItLWlnbm9yZS1ub24tZnVuY3Rpb25zIiBvcHRpb24uCisKK1R1ZSBOb3YgMjEgMTM6MjQ6MzkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICgubS5jKTogU3RyaXAgb3V0IGRpcmVjdG9yeSBuYW1lIGZyb20gZnVuY3Rpb24KKwluYW1lLgorCisJKiBoaXN0LmMgKHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKTogRG9uJ3QgdXNlIERFRlVOX1ZPSUQuICBEbworCVVOSVRTX1RPX0NPREUgYWRqdXN0bWVudCB1bmNvbmRpdGlvbmFsbHk7IGNvbXBpbGVyIGNhbiBvcHRpbWl6ZQorCWF3YXkgemVyby1vZmZzZXQgY2FzZS4gIFJlZmVyIHRvIHNjYWxlZF9hZGRyLCBub3QgYWxpZ25lZF9hZGRyLgorCisJKiB2YXguYzogRG9uJ3QgaW5jbHVkZSB2YXguaCBoZXJlLgorCitUaHUgTm92IDE2IDAzOjQxOjM3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJVmVyc2lvbiAyLjYgcmVsZWFzZWQuCisKK1dlZCBOb3YgIDggMTE6NDA6MDQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBncHJvZi5jIChtYWluKTogQ2FzdCBnZXRlbnYgcmV0dXJuIHZhbHVlLgorCitNb24gTm92ICA2IDE1OjA1OjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVEFHUyk6IE5ldyB0YXJnZXQuCisKK1dlZCBOb3YgIDEgMTI6NTE6MjEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiAgUmVuYW1lIHRvIEdFTl9GSUxFUywgdG8gYXZvaWQgY29uZnVzaW9uLgorCShhbGwpOiAgRGVwZW5kIG9uICQoR0VOX0ZJTEVTKSwgbm90IGRpc3RzdHVmZiAod2hpY2ggYWxzbyBkZXBlbmRzCisJb24gaW5mbykuCisKK1dlZCBOb3YgIDEgMTU6MjM6MTUgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIHN5bV9pZHMuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCisKK1dlZCBPY3QgMjUgMTM6MjQ6MzEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCisJKG1vc3RseWNsZWFuKTogIERvbid0IHJlbW92ZSBncHJvZi5pbmZvKi4KKwkobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiAgQWxzbyByZW1vdmUgKi5pbmZvKi4KKworRnJpIE9jdCAgNiAxNjoyNTozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZWNpZXMgZm9yICQoT0JKUykgb24gaGVhZGVyIGZpbGVzLgorCisJKiBjZ19wcmludC5jIChwcmludF9jeWNsZSwgcHJpbnRfbWVtYmVycywgY2dfcHJpbnRfaW5kZXgpOiBGaXggbmV3CisJc3R5bGUgb3V0cHV0IGZvcm1hdCB0byBtYWtlIGl0IGNvbnNpc3RlbnQuCisJKiBkdW1teS5jIChmaW5kX2NhbGwpOiBGaXggdHlwbyBpbiBlcnJvciBtZXNzYWdlLgorCitXZWQgU2VwIDIwIDEzOjIxOjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgorCXJlYWxjbGVhbi4KKworRnJpIFNlcCAgOCAxNDozODowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgorCitGcmkgQXVnIDI1IDE1OjMwOjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJTlMzMksgY2hhbmdlcyBmcm9tIElhbiBEYWxsOgorCSogY29uZmlndXJlLmluOiBVc2UgbnMzMmssIG5vdCBuczUzMi4KKwkqIG5zNTMyLmM6IEluY2x1ZGUgc3ltdGFiLmguCisJKGZpbmRfY2FsbCk6IFJlbmFtZWQgZnJvbSBmaW5kY2FsbC4gIFByaW50IGEgbWVzc2FnZS4KKwkqIG5zNTMyLmg6IFJlbW92ZSBkdW1teS5oIGNvbW1lbnRzLgorCitUdWUgQXVnIDIyIDEwOjAwOjQ1IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAiYnJva2Vuc2VkIiBoYWNrLCB1bm5lY2Vzc2FyeSBub3cKKwl0aGF0IHdlJ3JlIHVzaW5nIGF1dG9jb25mLgorCitXZWQgSnVsIDE5IDE4OjQ2OjEzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb3JlLmMgKGdldF9zcmNfaW5mbyk6IENhc3QgYXJnIDcgb2YgYmZkX2ZpbmRfbmVhcmVzdF9saW5lCisJdG8gcHJvcGVyIHR5cGUgb2YgInVuc2lnbmVkIGludCAqIi4KKworRnJpIEp1biAxNiAxNToyOTozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBjaGFuZ2VxdW90ZSBhcm91bmQgdXNlIG9mIFtdLgorCitNb24gSnVuIDEyIDEyOjE0OjUyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5jYWNoZSBhbmQKKwkgIGNvbmZpZy5sb2cuCisKK1dlZCBNYXkgMTcgMTc6NTY6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBBZGRlZCBjb25maWcuc3RhdHVzIHRvIGRlcGVuZGVuY3kgbGlzdC4KKwkgIChjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KKwkgIChTSEVMTCk6IE5ldyBkZWZpbml0aW9uLgorCitUdWUgQXByIDI1IDIxOjExOjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIG9uICJhbGwiLgorCitUaHUgQXByIDIwIDE3OjI5OjA3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gTVlfTUFDSElORSB0byBNWV9UQVJHRVQsCisJdG8gbWF0Y2ggY29uZmlndXJlIHNjcmlwdC4KKworV2VkIEFwciAxOSAxMToxOTozNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGdlbi1jLXByb2cuYXdrOiBDaGFuZ2VkIHJlZmVyZW5jZSB0byAibWFrZS1jLXByb2cuYXdrIiBpbgorCSAgY29tbWVudCBlbWl0dGVkIGJ5IHRoaXMgc2NyaXB0IHRvIGdlbi1jLXByb2cuYXdrLgorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDb252ZXJ0ZWQgdG8gdXNlIGF1dG9jb25mLgorCSogY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4zLgorCSogY29uZmlnL3ttdC1hbHBoYSwgbXQtZHVtbXksIG10LWkzODYsIG10LW5zNTMyLCBtdC1zcGFyYywKKwkgIG10LXRhaG9lLCBtdC12YXh9OiBSZW1vdmVkLgorCitNb24gTWFyIDEzIDIxOjQ0OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIF9fYmJfZXhpdF9mdW5jLmM6IE5ldyBmaWxlLCBmcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nLgorCisJVGh1IEZlYiAgOSAxNjo1NjowNyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+CisKKwkqIEFsbCAqLmM6IE1vcmUgY2xlYW51cCB0b3dhcmRzIEdOVSBmb3JtYXQuCisKKwkqIGdtb25fb3V0LmggKHN0cnVjdCBnbW9uX2hpc3RfaGRyLCBzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkKTogCisJcmVwbGFjZWQgc2l6ZW9mIChiZmRfdm1hKSBieSBzaXplIChjaGFyKikgYmVjYXVzZSBLZW4gdGVsbHMgbWUKKwl0aGF0IGJmZF92bWEgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIGF0IGxlYXN0IGFzIGJpZyBhcyBhIHBvaW50ZXIuCisKKwkoR01PTl9SZWNvcmRfdGFnKTogYWRkZWQgZXhwbGljaXQgZW51bWVyYXRpb24gdmFsdWVzIHRvIGVuc3VyZQorCWNvbXBhdGliaWxpdHkgYWNyb3NzIGNvbXBpbGVycy4KKworCSogZ21vbl9pby5jIChnZXRfdm1hLCBwdXRfdm1hKTogcmVwbGFjZWQgc2l6ZW9mKGJmZF92bWEpIGJ5CisJc2l6ZW9mKGNoYXIqKS4KKworVHVlIEZlYiAgNyAxNzoyNDoxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBBbGwgKi5jIGFuZCAqLmggZmlsZXM6IFJhbiAiaW5kZW50IC1nbnUiLiAgQ2xlYW5lZCB1cCBhIGNvdXBsZQorCW9mIGNvbnN0cnVjdHMgR05VIGluZGVudCBjb3VsZG4ndCBoYW5kbGUuICBCbG9jayBjb21tZW50cyBub3QgeWV0CisJcmV3cml0dGVuIGluIEdOVSBmb3JtYXQuCisKKwkqIGdwcm9mLmMgKFZFUlNJT04pOiBDaGFuZ2VkIHRvIDIuNiwgdG8gZ2V0IGluIHN5bmMgZm9yIG5leHQKKwliaW51dGlscyByZWxlYXNlLgorCitTdW4gRmViICA1IDE2OjE5OjQ2IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KKworCSogc3ltdGFiLmMgKHN5bXRhYl9maW5hbGl6ZSk6IGVuc3VyZSBnbG9iYWxzIHN5bWJvbHMgcmVhbGx5CisJYXJlIGZhdm9yZWQgb3ZlciBzdGF0aWMgb25lcy0tLWV2ZW4gaWYgdGhlaXIgbmFtZSBsb29rcyBsZXNzCisJcHJlZmVyYWJsZTsgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIEhQLVVYOyBmb3IgZXhhbXBsZSwgdGhlcmUKKwlpcyBhIHN0YXRpYyBsYWJlbCBMdGV4dF9zb21ldGhpbmcgdGhhdCBhbGlhc2VzIHRoZSBnbG9iYWwKKwlzeW1ib2wgX3N0YXJ0CisKKwkqIGhpc3QuYyAoaGlzdF9wcmludCk6IGF1dG8tc2NhbGluZyBpcyBub3cgaW4gZWZmZWN0IGZvciBGU0Ytc3R5bGUKKwlvdXRwdXQgb25seTsgYWxzbywgYXV0by1zY2FsaW5nIGlzIG5vdyBwZXJmb3JtZWQgYmFzZWQgb24KKwlwZXItY2FsbCwgcmF0aGVyIHRoYW4gdG90YWwgZXhlY3V0aW9uIHRpbWUsIHdoaWNoIGlzIHdoYXQgaXQgd2FzCisJbWVhbnQgdG8gYmUuCisKKwkqIGdwcm9mLmggKEZpbGVfRm9ybWF0KTogbmV3IHR5cGUuCisKKwkqIGdwcm9mLmMgKFZFUlNJT04pOiB1cHBlZCB0byAyLjctLS1zZWVtcyB0byBiZSBjb21wbGV0ZWx5IG91dCBvZgorCXN5bmMgd2l0aCBDeWdudXMgdmVyc2lvbiBudW1iZXJzIHRob3VnaC4uLgorCisJKGxvbmdfb3B0aW9ucyk6IHJlbmFtZWQgLS1nbW9uLWluZm8gdG8gLS1maWxlLWluZm8sIC0td2lkdGggYWRkZWQsCisJcmVuYW1lZCAtLW9sZC1maWxlLWZvcm1hdCB0byAtLWZpbGUtZm9ybWF0CisJKG1haW4pOiBkaXRvOyBhbHNvIGFkZGVkIHN1cHBvcnQgdG8gcmVhZCBwcm9mIGZpbGVzLCBidXQgYXMKKwltb25fb3V0X3JlYWQoKSBpcyBub3QgaW1wbGVtZW50ZWQsIGl0J3MgI2lmZGVmJ2Qgb3V0IGZvciBub3cKKworCSh1c2FnZSk6IHVwZGF0ZSB0byByZWZsZWN0IG5ldyBvcHRpb25zLgorCisJKiBnbW9uX2lvLmM6IHJlcGxhY2VkICJvbGRfZmlsZV9mb3JtYXQiIGJ5IG1vcmUgZ2VuZXJhbAorICAgICAgICAiZmlsZV9mb3JtYXQiIG9wdGlvbgorCisJKiBnbW9uLmggKHN0cnVjdCByYXdfcGhkcik6IGZpeGVkIGRlY2xhcmF0aW9uIGZvciBPU0YvMS4KKworCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IGFkZGVkIGJhY2sgY2hlY2sgZm9yIF9fZ251X2NvbXBpbGVkIGFuZAorCV9fX2dudV9jb21waWxlZCBmb3IgdGhlIGJlbmVmaXQgb2Ygc3lzdGVtcyB3aXRob3V0CisJYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgc3VwcG9ydAorCisJKGdldF9zcmNfaW5mbyk6IG5vdyB0aGUgbGliYmZkIGlzIGZpeGVkLCBpbnZva2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKKwl3aXRoIHNlY3Rpb24tcmVsYXRpdmUgYWRkcmVzc2VzCisKKwkoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IGdldF9zcmNfaW5mbygpIGNhbGxzIGFyZSBjdXJyZW50bHkKKwllbmFibGVkIGZvciBPU0YvMSBvbmx5LiAgSXQgYXBwZWFycyB0byB3b3JrIGFsbHJpZ2h0IGZvciBTdW5PUworICAgICAgICA0LjEueCBhcyB3ZWxsLCBidXQgb24gU1BBUkNzIGl0IGdldHMgcGFpbmZ1bGx5IHNsb3cgd2l0aCB0aGUKKyAgICAgICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBhb3V0XzMyX2ZpbmRfbmVhcmVzdF9saW5lKCk7CisgICAgICAgIHVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBzdGF0aWMgZnVuY3Rpb25zIHdpbGwgbm90IGhhdmUgdGhlaXIKKwlmaWxlbmFtZSBwcmludGVkIGluIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4OyBsaW5lLWxldmVsCisJcHJvZmlsaW5nIHNob3VsZCBzdGlsbCB3b3JrLCBidXQgcmVxdWlyZXMgc29tZSBwYXRpZW5jZQorCisJKiBjZ19wcmludC5jIChjZ19wcmludF9pbmRleCk6IHNhbml0aXNlZCBwcmludGluZyBvZiBpbmRleCB3aGVuCisJdXNpbmcgRlNGLXN0eWxlIG91dHB1dDsgaW4gcGFydGljdWxhciwgb3V0cHV0IHdpZHRoIGlzIG5vdyBjb250cm9sbGVkCisJdmlhIG9wdGlvbiAtLXdpZHRoIGFuZCB0aGUgZnVuY3Rpb24gdHJpZXMgaGFyZCB0byBrZWVwIGNvbHVtbnMKKwlhbGlnbmVkIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIChvY2Nhc2lvbmFsKSBsb25nIG5hbWVzCisKKwkqIE5PVEVTOiBhIGZpcnN0IHNob3QgYXQgdXBkYXRpbmcgdGhlIGRvY3VtZW50YXRpb24uCisKK1dlZCBGZWIgIDEgMTk6MDc6NDQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgorCisJKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBmaXhlZCBjb21wdXRhdGlvbiBvZiBtaW5fdm1hCisJYW5kIG1heF92bWEuCisKKwkqICouYzogcmVtb3ZlZCByY3NpZC4KKworVHVlIEphbiAzMSAxNjoxODoxOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBMb3RzIG9mIGNoYW5nZXMgZnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZzoKKworCVR1ZSBPY3QgMjUgMTk6MjA6MTQgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+CisKKwkqIGdwcm9mLmMgKG1haW4pOiBwdXQgcGFyZW50aGVzZXMgYXJvdW5kICYgd2l0aGluICYmLgorCisJKiBiYXNpY19ibG9ja3MuYyAoYmJfcmVhZF9yZWMpOiBwcmludCB3YXJuaW5nIG1lc3NhZ2UgKG9uY2UpIHdoZW4KKwlpZ25vcmluZyBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLgorCisJKiBzb3VyY2UuYyAoc291cmNlX2ZpbGVfbG9va3VwX25hbWUpOiBjb3JyZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvCisJc3RyY21wKCkuCisKKwkqIGhpc3QuYyAocHJpbnRfaGVhZGVyKTogbWVyZ2VkIEZyaSBPY3QgMjEgMTg6NTg6MDIgMTk5NCBjaGFuZ2UgYnkKKwlLZW4gUmFlYnVybiA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+IGZyb20gYmludXRpbHMtMi41LjEuCisKKwkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IHRoZSBvdXRwdXQgc3R1bGUgU1RZTEVfR01PTl9JTkZPIGlzIG5vdworCXN1cHBvcnRlZCBib3RoIGZvciBvbGQgYW5kIG5ldyAodmVyc2lvbmVkKSBnbW9uLm91dCBmaWxlcy4gIE9sZAorCWZpbGVzIGFyZSBpZGVudGlmaWVkIGFzIHZlcnNpb24gMC4KKworCSogZ21vbi5oIChzdHJ1Y3QgcmF3X2FyYyk6IGNvdW50IGZpZWxkIGlzIG5vdyBzaXplb2YobG9uZykgYnl0ZXMKKwlsb25nIChpbnN0ZWFkIG9mIDQpIGJlY2F1c2UgdGhhdCBpcyB3aGF0IE9TRi8xIHYzLjAgdXNlcy4KKworCSogY29yZS5jOiBtaW5vciBmaXhlcyBhbmQgZGVidWdnaW5nIGluZm8gY2hhbmdlcy4KKworCVN1biBTZXAgMTEgMTg6NDc6NDcgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCisKKwkqIGNvcmUuYyAoY29yZV9pbml0KTogaWYgLnRleHQgY2Fubm90IGJlIGZvdW5kLCB0cnkgJENPREUkICh0aGUKKwluYW1lIG9mIHRoZSB0ZXh0LXNlY3Rpb24gdW5kZXIgSFAtVVgpLgorCisJKiBoaXN0LmMgKGhpc3RfYXNzaWduX3NhbXBsZXMpOiBmaXhlZCBvZmYtYnktb25lIGJ1ZzogaGlnaHBjCisJcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0IHNhbXBsaW5nIGJpbiwgc28gaGlzdF9zY2FsZSBzaG91bGQgYmUKKwljb21wdXRlZCBhcyAiaGlzdF9zY2FsZSAvPSBoaXN0X251bV9iaW5zIiwgbm90ICJoaXN0X3NjYWxlIC89CisJaGlzdF9udW1fYmlucyAtIDEiLgorCisJKiBnbW9uX2lvLmMsIGhpc3QuYywgaGlzdC5oOiByZW5hbWVkIGhpc3RfbnVtX3NhbXBsZXMgdG8KKwloaXN0X251bV9iaW5zLgorCisJKiBjb25maWd1cmUuaW46IGFkZGVkIGFscGhhLSotKikgZm9yIHBlci10YXJnZXQgY29uZmlnLgorCisJKiBhbHBoYS5jLCBhbHBoYS5oOiBjcmVhdGVkLgorCisJKiBncHJvZi5jIChkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QpOiA8bG9jb3JlPiwgPGhpY29yZT4gYWRkZWQuCisKKwkqIGNvcmUuYyAoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcywgY29yZV9jcmVhdGVfbGluZV9zeW1zKToKKwlleHBsaWNpdGx5IGtlZXAgdHdvIHNlbnRpbmVscyAiPGxvY29yZT4iIGFuZCAiPGhpY29yZT4iIHRoYXQgY2F0Y2gKKwlhbGwgYWRkcmVzc2VzIG91dHNpZGUgdGhlIHRleHQtc3BhY2UuICBUaHVzLCBzeW1fbG9va3VwKCZzeW10YWIsCisJYWRkcikgY29udGludWVzIHRvIGd1YXJhbnRlZSBub3QgdG8gcmV0dXJuIDAgb24gYW55IGFkZHJlc3MuICBJdAorCWFsc28gYXZvaWRzIGluY29ycmVjdGx5IGNyZWRpdGluZyB0aGUgZmlyc3QvbGFzdCBzeW1ib2wgaW4gdGhlCisJdGV4dC1zcGFjZS4KKworCSogY29yZS5jIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBhbHdheXMgY3JlYXRlIGZ1bmN0aW9uIHN5bWJvbHMKKwlmaXJzdCwgdGhlbiBtZXJnZSBpbiBsaW5lIHN5bWJvbHM7IHRoaXMgaXMgc28gdGhhdCBpZiBwYXJ0cyBvZiB0aGUKKwlwcm9ncmFtIHdlcmUgY29tcGlsZWQgd2l0aG91dCAtZywgZnVuY3Rpb24tbGV2ZWwgc3ltYm9scyBhcmUKKwlhdmFpbGFibGUgc3RpbGwuCisKKwkqIHV0aWxzLmMgKHByaW50X25hbWVfb25seSk6IHN1cHBvcnQgZm9yIHByaW50X3BhdGggYWRkZWQuCisKKwkqIHN5bXRhYi5jIChjbXBfYWRkcik6IGFsc28gdXNlIGlzX2Z1bmMgZmxhZyBpbiBjb21wYXJpc29uLgorCShzeW10YWJfZmluYWxpemUpOiByZXR1cm4gaW1tZWRpYXRlbHkgd2hlbiB0YWJsZSBlbXB0eTsgbm93CisJbW9yZSBjYXJlZnVsIGFib3V0IGdldHRpbmcgcmlkIG9mIHRoZSByaWdodCBkdXBsaWNhdGUgc3ltYm9sLgorCisJKiBzcGFyYy5jIChmaW5kX2NhbGwpOiBtYW55IGZpeGVzLS0tdGhpcyBmdW5jdGlvbiB3YXMgcmF0aGVyCisJYm90Y2hlZCBpbiBiaW51dGlscy0yLjQgYWxyZWFkeTsgaXQgc2hvdWxkIHdvcmsgYWdhaW4uCisKKwkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCk6IFBBVEggaXMgbm93IHN0cmR1cCdlZCAoaXQgaXMKKwlub3QgZ29vZCB0byByZWx5IG9uIGdldF9zcmNfaW5mbygpIHRvIHJldHVybiBkaXN0aW5jdCBzdHJpbmcKKwlwb2ludGVycykuCisKKwkqIHNlYXJjaF9saXN0LmMgKHNlYXJjaF9saXN0X2FwcGVuZCk6IGFkZGVkIGNhc3QgZm9yIHhtYWxsb2MoKS4KKworCSogaGlzdC5jOiBhZGRlZCBleHBsaWNpdCBpbml0aWFsaXphdGlvbiB0byBzb21lIG9mIHRoZSBnbG9iYWwKKwl2YXJpYWJsZXM7IGZpeGVkIFNJdGFiIChzY2FsZXMgd2VyZSBvZmYgYnkgYSBmYWN0b3Igb2YgMTApLgorCisJKiBoaXN0Lmg6IGluY2x1ZGUgb2YgYmZkLmggYWRkZWQuCisKKwkqIGdwcm9mLmMsIGdwcm9mLmggKHByaW50X3BhdGgpOiBhZGRlZC4KKworCSogZ3Byb2YuaCAoTUFYKTogZml4ZWQuCisKKwkqIGdtb25fb3V0Lmg6IHJlbmFtZWQgZ21vbl90aW1lX2hpc3RfaGRyIHRvIGdtb25faGlzdF9oZHIuCisKKwkqIGdtb25faW8uYzogYWRkZWQgc29tZSBjYXN0cyB0byAobG9uZykgc28gd2UgY2FuIGFsd2F5cyBwcmludCBhcyAlbHgKKworCSogY29yZS5jIChjb3JlX2dldF90ZXh0X3NwYWNlKTogZml4ZWQgdG8gbWFrZSBpdCB3b3JrLgorCisJKiBjZ19wcmludC5jIChjZ19wcmludF9pbmRleCk6IGFkZGVkIHN1cHBvcnQgZm9yIHByaW50X3BhdGggb3B0aW9uLgorCisJKiBjZ19kZm4uaCAoY2dfZGZuKTogd3JhcCBwcm90b3R5cGUgaW4gUEFSQU1TKCkuCisKKwkqIGNhbGxfZ3JhcGguYywgZ21vbl9pby5jLCBoaXN0LmM6IGF2b2lkIHRha2luZyBhZGRyZXNzIG9mIGFycmF5CisJYXMgc29tZSBjb21waWxlcnMgY29tcGxhaW4gKGUuZy4sIERFQydzIE9TRi8xIGNvbXBpbGVyKQorCisJKiBiYXNpY19ibG9ja3MuYywgZ21vbl9pby5jLCBoaXN0LmMsIHNvdXJjZS5jLCBzeW1faWRzLmMsCisJc3ltdGFiLmM6IGNhbGxzIHRvIG1lbXNldCgpIGhhZCAybmQgYW5kIDNyZCBhcmdzIHJldmVyc2VkLgorCisJU2F0IFNlcCAxMCAyMTo1MzoxMyAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKKworCSogZ3Byb2YuYzogYWRkZWQgIl9tY291bnQiIHRvIGRlZmF1bHRfZXhjbHVkZWRfbGlzdC4KKwkobWFpbik6IGlmIG91dHB1dF9zdHlsZT09MCBhbmQgdGhlcmUgaXMgZWl0aGVyIGEgaGlzdG9ncmFtIG9yIGEKKwljYWxsLWdyYXBoLCBhbHdheXMgZ2VuZXJhdGUgZmxhdCBhbmQgY2FsbC1ncmFwaCwgbm8gbWF0dGVyIHdoYXQKKwlsaW5lX2dyYW51bGFyaXR5IGlzIHNldCB0by4KKworCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lKTogaWYgc2VhcmNoaW5nIGZvciBzZi0+bmFtZQorCWZhaWxzLCB0cnkgYWdhaW4gd2l0aCBmaWxlbmFtZSBvYnRhaW5lZCBhZnRlciBzdHJpcHBpbmcgb2ZmIGFueQorCXBhcnRpYWwgcGF0aCBmcm9tIHNmLT5uYW1lLgorCisJKiBncHJvZi5oIChTUkNERUJVRyk6IGFkZGVkLgorCisJKiBzZWFyY2hfbGlzdC5jIChzZWFyY2hfbGlzdF9hcHBlbmQpOiBkaXJlY3RvcmllcyB3ZXJlIGFkZGVkIGluIHdyb25nCisJb3JkZXIuCisKKwkqIHJlaW1wbGVtZW50ZWQgc2VsZWN0aW9uIG1lY2hhbmlzbSBmcm9tIGdyb3VuZCB1cDsgaXQgaXMgbm93IHBvc3NpYmxlCisJdG8gYWNjdXJhdGVseSBjb250cm9sIHdoYXQgZ2V0cyBpbmNsdWRlZC9leGNsdWRlZCBpbiBlYWNoIG9mIHRoZQorCW91dHB1dCBzdHlsZXM7CWEgInN5bWJvbC1zcGVjaWZpY2F0aW9uIiAoc3BlYykgaXMgdGhlIGJhc2ljIG1lYW5zCisJdG8gc2VsZWN0IGEgc2V0IG9mIHN5bWJvbHM7IGEgc3BlYyBoYXMgdGhlIHN5bnRheDoKKworCSAgc3BlYyA9PSAoRklMRU5BTUU6KEZVTkNOQU1FfExJTkVfTlVNKSB8IE5BTUUpLgorCSAgYXJjID09IHNwZWMvc3BlYy4KKworCWFueSBvZiB0aGUgdGVybWluYWwgc3ltYm9scyBjYW4gYmUgZW1wdHksIGluIHdoaWNoIGNhc2UgdGhleQorCW1hdGNoIGFueXRoaW5nICh3aWxkY2FyZHMpLiAgTkFNRSBpcyBpbnRlcnByZXRlZCBhcyBhIEZJTEVOQU1FCisJaWYgaXQgY29udGFpbnMgYSBkb3QgKGUuZy4sIGZvby5jKSwgYXMgTElORV9OVU0gaWYgaXQgc3RhcnRzCisJd2l0aCBhIGRpZ2l0LCBhbmQgYXMgRlVOQ05BTUUgb3RoZXJ3aXNlLgorCisJRm9yIGV4YW1wbGUsIHRvIGdldCBhIGNhbGwtZ3JhcGggZGlzcGxheSB0aGF0IGlnbm9yZXMgYXJjcworCWZyb20gZm9vKCkgdG8gYmFyKCksIHlvdSdkIHNheSAiLS1uby1ncmFwaD1mb28vYmFyIjsgdG8KKwlzaG93IG9ubHkgYXJjcyBpbnRvIGJhcigpIChubyBtYXR0ZXIgd2hhdCB0aGUgY2FsbGVyKSwKKwl5b3UnZCBzYXkgIi0tZ3JhcGg9L2JhciI7IGFuZCB0byBnZXQgYSBjYWxsLWdyYXBoIHdpdGhvdXQKKwlhbnkgYXJjIGluZm8sIHlvdSdkIHNheSAiLS1ncmFwaD0vIjsgIHNpbWlsYXJseSwgdG8KKwlnZXQgYSBmbGF0IHByb2ZpbGUgd2l0aG91dCBtY291bnQsIHlvdSdkIHNheSAiLS1uby1mbGF0PW1jb3VudCIKKwlhbmQgdG8gZ2V0IGEgZmxhdCBwcm9maWxlIHRoYXQgc2hvd3MgaW5jbHVkZXMgYWxsIGZ1bmN0aW9ucworCXlvdSdkIHNheSAiLS1mbGF0PSIiIiAoaS5lLiwgYW4gZW1wdHkgc3BlYykKKworCSogaGlzdC5jIChoaXN0X3ByaW50KTogdG9wX3RpbWUgd2Fzbid0IGluaXRpYWxpemVkIHRvIDAuMC4KKworCUZyaSBTZXAJIDkgMDE6MTA6MjEgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCisKKwkqIGdtb25fb3V0Lmg6IGFsbCBoZWFkZXJzIG5vdyBkZWNsYXJlZCBpbiB0ZXJtcyBvZiBjaGFyYWN0ZXJzCisJICB0byBhdm9pZCBnZXR0aW5nIGludG8gdHJvdWJsZSB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgaW50cm9kdWNpbmcKKwkgIGRpZmZlcmVudCBhbW91bnQgb2YgcGFkZGluZzsgdGhlIGNvZGUgYWxyZWFkeSBhY2Nlc3NlZCB0aGUgZmllbGRzCisJICB0aHJvdWdoIGJmZCBmdW5jdGlvbnMsIHNvIHRoYXQgZGlkbid0IGhhdmUgdG8gY2hhbmdlLgorCisJKiBoaXN0LmMgKGhpc3RfcmVhZF9yZWMsIGhpc3Rfd3JpdGVfcmVjKTogYWRkZWQgc3VwcG9ydCBmb3IKKwkgIGNvbGxlY3Rpb24gcGMgaGlzdG9ncmFtcyBtZWFzdXJpbmcgcXVhbnRpdGllcyBvdGhlciB0aGFuIHRpbWU7CisJICB0aGUgaGlzdG9ncmFtIGhlYWRlciBub3cgaW5jbHVkZXMgYSBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUKKwkgIGRpbWVuc2lvbiBvZiB0aGUgcXVhbnRpdHkgbWVhc3VyZWQgYnkgdGhlIGhpc3RvZ3JhbSBiaW5zCisJICAobm9ybWFsbHksIHRoaXMgaXMgInNlY29uZHMiLCBidXQgb3RoZXIgbWVhbmluZ2Z1bCBkaW1lbnNpb25zCisJICAgaW5jbHVkZSBzdWNoIHRoaW5ncyBhcyAiSS1jYWNoZSBtaXNzZXMiLCAiaW5zdHJ1Y3Rpb24gaXNzdWUgc3RhbGxzIgorCSAgIGV0Yy4pOyB0aGVyZSBpcyBhbHNvIGEgZmllbGQgdG8gc3BlY2lmeSBhIG9uZS1jaGFyYWN0ZXIKKwkgIGFiYnJldmlhdGlvbiBmb3IgdGhlIGRpbWVuc2lvbjsgaW4gdGhlIGNhc2Ugb2YgdGltZSwgdGhpcyB3b3VsZAorCSAgYmUgJ3MnOyBpbiBtb3N0IG90aGVyIGNhc2VzIGl0IHByb2JhYmx5IHdvdWxkIGJlICcxJyAobm90IGEgcGh5c2ljYWwKKwkgIGRpbWVuc2lvbikuCisKKwlUaHUgU2VwCSA4IDE2OjA1OjA4IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQorCisJKiBncHJvZi5jLCBnbW9uX2lvLltjaF06IEJTRF9DT01QQVRJQkxFIGlzIGdvbmUgYW5kIG5ld19maWxlX3ZlcnNpb24KKwkgIGhhcyBiZWNvbWUgb2xkX2ZpbGVfdmVyc2lvbjsgZ21vbl9pby5jIG5vdyBhbHdheXMgc3VwcG9ydHMgb2xkLXN0eWxlCisJICBnbW9uLm91dCBmaWxlczsgaXQgZmlyc3QgdHJpZXMgdG8gcmVhZCBnbW9uLm91dCBhcyBhIG5ldyB2ZXJzaW9uCisJICBmaWxlLCBpZiB0aGF0IGZhaWxzLCBpdCB0cmllcyB0byByZWFkIGl0IGluIHRoZSBvbGQgZm9ybWF0OworCSAgYWx0aG91Z2ggbm90IHZlcnkgbGlrZWx5LCBpdCBpcyBwb3NzaWJsZSBmb3IgZ3Byb2YgdG8gbWlzdGFrZSBhbgorCSAgb2xkLXN0eWxlIGZpbGUgYXMgYSBuZXcgb25lICh0aGUgZmlyc3QgNCBieXRlcyB3b3VsZCBoYXZlIHRvCisJICBiZSAiZ21vbiItLS1pbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcpOyBpbiB0aGF0IGNhc2UsIGl0IGlzCisJICBuZWNlc3NhcnkgdG8gc3BlY2lmeSAtLW9sZC1maWxlLXZlcnNpb24KKworCSogZ3Byb2YuaDogcmVtb3ZlZCBkZXBlbmRlbmN5IG9uIFNZU1Y7IHRoZSBjb2RlIG5vdyBhbHdheXMgdXNlcworCSAgc3RycmNocigpLCBtZW1zZXQoKSwgYW5kIG1lbWNweSgpIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGVpdGhlcgorCSAgb2Ygc3RyaW5nLmggb3Igc3RyaW5ncy5oOyB0aGlzIHNob3VsZCBtYWtlIGdwcm9mIGNvbXBpbGUgb24KKwkgIGFueSAoVW5peCkgc3lzdGVtIHdpdGhvdXQgY29uZmlndXJhdGlvbiAocGVyIHN1Z2dlc3Rpb24gb2YKKwkgIHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogZ3Byb2YuYyAodXNhZ2UpOiBmaXhlZCBsb2NhdGlvbiBvZiAtLW5ldy1maWxlLWZvcm1hdCBvcHRpb24uCisKKwkqIGNnX2FyY3MuYyAocHJvcGFnYXRlX2ZsYWdzKTogZml4ZWQgdHlwbyBpbiBkZWNsYXJhdGlvbi4KKworCSogZmxhdF9ibC5tOiByZW1vdmVkIGZvcm1mZWVkIGF0IGVuZCBvZiBmaWxlOyB0aGUgZm9ybS1mZWVkCisJICBpcyBub3cgcHJpbnRlZCBjZ19wcmludC5jIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisKKwkqIG1ham9yIHJld3JpdGUgb2YgZ3Byb2YtLS10b28gbWFueSBjaGFuZ2VzIHRvIG1lbnRpb24gYWxsIG9mCisJICB0aGVtLgkgbmV3IGZlYXR1cmVzOgorCisJKyAtbCBub3cgcmVxdWVzdHMgcHJvZmlsaW5nIGF0IHRoZSBsaW5lIGxldmVsIChhcyBvcHBvc2VkCisJICB0byBmdW5jdGlvbiBsZXZlbCk7IGluIHRoaXMgbW9kZSwgZ3Byb2YgY3JlYXRlcyBhICJzeW1ib2wiCisJICAoYWthIG5hbWUtbGlzdCBlbnRyeSkgZm9yIGVhY2ggbGluZSBvZiBzb3VyY2UgY29kZSwgaW5zdGVhZAorCSAgIG9mIG9uZSBwZXIgZnVuY3Rpb24pCisKKwkrIHN1cHBvcnQgZm9yIGEgbmV3IGdtb24ub3V0IGZpbGUgZm9ybWF0OyB0aGUgbmV3IGZvcm1hdCAKKwkgIGNvbnNpc3RzIG9mIGEgaGVhZGVyIHdpdGggYSBtYWdpYyBhbmQgYSB2ZXJzaW9uIG51bWJlciwKKwkgIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgcHJvZmlsZSBkYXRhOyBwcm9maWxlIGRhdGEKKwkgIGNhbiBhbnkgb2Y6IChhKSBQQyBoaXN0b2dyYW0sIChiKSBjYWxsLWdyYXBoIGFyY3MsIG9yCisJICAoYykgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50czsgdGhlIHZlcnNpb24gbnVtYmVyIG1ha2VzCisJICBpdCBwb3NzaWJsZSB0byBleHRlbmQgZ21vbi5vdXQgaW4gYSBiYWNrd2FyZHMgY29tcGF0aWJsZQorCSAgZmFzaGlvbgorCisJKyBzdXBwb3J0IGZvciB0Y292IHN0eWxlIGFubm90YXRlZCBvdXRwdXQ6IGlmIHRoZSBnbW9uLm91dCBmaWxlCisJICBjb250YWlucyBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLCB0aGUgdXNlciBjYW4gcmVxdWVzdAorCSAgdGhlIGdlbmVyYXRpb24gb2YgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcywgbXVjaCBsaWtlIFN1bidzCisJICB0Y292IHVzZWQgdG8gZG8KKworCSsgbG9uZyBvcHRpb25zCisKKwkrIG5ldyBzY2hlbWUgdG8gc3VwcHJlc3Mgc3ltYm9scyB0aGF0IGFyZW4ndCBmdW5jdGlvbiBuYW1lcworCSAgKGUuZy4sIGF2b2lkcyBtaXN0YWtpbmcgYSBnb3RvIGxhYmVsIGFzIGEgZnVuY3Rpb24pCisKKwkrIHJlb3JnYW5pemVkIHNvdXJjZSBjb2RlIHRvIG1ha2UgaXQgbW9yZSBtYW5hZ2FibGU7IGFzIGEKKwkgIHNpZGUgZWZmZWN0LCBncHJvZiBub3cgY29tcGlsZXMgY2xlYW5seSB3aXRoICJnY2MgLVdhbGwiCisKKwlUaHUgU2VwCSAxIDE1OjQ2OjQ5IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQorCisJKiBncHJvZi5jIChmdW5jc3ltYm9sKTogYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgaXMgbm93IHVzZWQgYXMgYQorCWZpbmFsIGNyb3NzLWNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGljIHN5bWJvbCBzaG91bGQgYmUKKwljb25zaWRlcmVkIGFzIGEgZnVuY3Rpb24tbmFtZS4KKworCUZyaSBBdWcJIDUgMTk6MzI6MzYgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCisKKwkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IHJlY29nbml6ZSAiLSIgYXMgdGhlIGZpbGVuYW1lIGZvcgorCXN0ZGluOyB0aGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FubmEga2VlcCBnbW9uLm91dCBmaWxlcyBjb21wcmVzc2VkOworCXRoaXMgd2F5IHlvdSBjYW4gImd6Y2F0IiB0aGUgY29tcHJlc3NlZCBmaWxlIGludG8gZ3Byb2YuCisKKwkqIGdwcm9mLmM6IGZsYWdfbWluX2NvdW50IG5vdyBpbml0aWFsaXplZCB3aXRoIDEgaW5zdGVhZCBvZiAwLgorCisJKiBiYXNpY19ibG9ja3MuYyAoYmJfYW5ub3RhdGVfc291cmNlKTogYWRkZWQgc3VwcG9ydCBmb3IgY3JlYXRpbmcKKwkudGNvdiBmaWxlcyB3aGVuIG9wdGlvbiBmbGFnX2Fubm90YXRlX21ha2VfZmlsZXMgaXMgVFJVRS4KKwkoYW5ub3RhdGVfd2l0aF9jb3VudCk6IGFsbCBjb3VudHMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGNvdW50CisJc3BlY2lmaWVkIGJ5IC1tIGFyZSBub3cgYW5ub3RhdGVkIHdpdGggaGFzaC1tYXJrcy4KKworCSogZ3Byb2YuYyAobWFpbik6IC1BIGlzIG5vdyBmb2xsb3dlZCBieSBhIHN0cmluZyBvZiBvcHRpb24gY2hhcnMuCisKKwkqIGJhc2ljX2Jsb2Nrcy5jIChhbm5vdGF0ZV93aXRoX2NvdW50KTogcmVwbGFjZWQgYi0+Y291bnQgd2l0aAorCWNudC4KKworCSogc291cmNlLmM6IGZsYWdfYW5ub3RhdGVfc291cmNlIHJlcGxhY2VkIGJ5IHNvdXJjZV9sb2NrX21hcC4KKworCSogc291cmNlLmg6IHNvdXJjZV9sb2NrX21hcCBhZGRlZC4KKworCSogZ3Byb2YuYyAobWFpbik6IG5ldyBjb21tYW5kLWxpbmUgc3ludGF4OiAtUyBzaW1wbHkgc3BlY2lmaWVzCisJd2hpY2ggc291cmNlLWZpbGVzIHVzZXIgaXMgaW50ZXJlc3RlZCBpbjsgLUEgcmVxdWVzdHMgYW5ub3RhdGVkCisJc291cmNlIGZpbGVzIGFuZCAtQUEgcmVxdWVzdHMgdGhhdCBhbGwgbGluZXMgaW4gYSBzb3VyY2UgZmlsZQorCWFyZSBhbm5vdGF0ZWQuCisKKwlUaHUgQXVnCSA0IDIzOjI3OjAzIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQorCisJKiBiYXNpY19ibG9ja3MuYyAoUEFUSF9NQVgpOiBpZiB1bmRlZmluZWQsIGRlZmluZSBhcyAxMDI0LgorCisJKiBzcGFyYy5jLCBpMzg2LmMsIHRhaG9lLmMsIHZheC5jOiBhZGRlZCBpbmNsdWRlIG9mICJ0aW1lX2hpc3QuaCIKKwlzbyBzX2xvd3BjIGV0Yy4gZ2V0IGRlY2xhcmVkLgorCisJKiBhcmNzLmggKGRvYXJjcyk6IGNyZWF0ZWQuCisKKwkqIGFyY3MuYzogcmVvcmRlcmVkIHN0YXRpYyBmdW5jdGlvbnMgc3VjaCB0aGF0IHRoZXkgZ2V0IGRlZmluZWQKKwliZWZvcmUgdXNlLgorCisJKiBncHJvZi5jIChtYWluKTogYWRkZWQgb3B0aW9uczoKKwkgICAtQTogcmVxdWVzdCBhbm5vdGF0aW9uIG9mIGFsbCBzb3VyY2UgbGluZXMgKHdpdGggLVMpCisJICAgLW06IG1pbmltdW0gZXhlY3V0aW9uIGNvdW50ICh3aXRoIGRlZmF1bHQgYmFzaWMtYmxvY2sgZGlzcGxheSkKKwkgICAtTjogZm9yY2UgbmV3IGZpbGUgZm9ybWF0IChvbmx5IGlmIEJTRF9DT01QQVRJQkxFIGlzIGRlZmluZWQpCisJICAgLVM6IGFubm90YXRlIHNvdXJjZSBmaWxlCisJICAgLXQ6IHNldCB0YWJsZSBsZW5ndGggKHdpdGggLVMpCisKKwkqIE1ha2VmaWxlIChPQkpTKTogYWRkZWQgYmFzaWNfYmxvY2tzLm8gY2FsbF9ncmFwaC5vIGdtb25faW8ubworCXNvdXJjZS5vIHRpbWVfaGlzdC5vCisKKwlGcmkgSnVsCSAxIDE1OjIzOjUwIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQorCisJKiBncHJvZi5jIChhc2duc2FtcGxlcyk6IGNvbXB1dGF0aW9uIG9mICJwY2wiIGFuZCAicGNoIiBkZXBlbmRlZAorCW9uIHRoZSBmYWN0IGJlaW5nIGFibGUgdG8gc3RvcmUgYSBsb25nIGluIGEgZG91YmxlIHdpdGhvdXQgbG9zcyBvZgorCXByZWNpc2lvbjsgdGhpcyBkb2VzIG5vdCBob2xkIG9uIG1hY2hpbmVzIHdpdGggNjQgYml0IGxvbmdzIGFuZCA2NAorCWJpdCBkb3VibGVzLgorCitGcmkgT2N0IDIxIDE4OjU4OjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHByaW50Z3Byb2YuYyAoZmxhdHByb2ZoZWFkZXIpOiBBbHdheXMgc2V0IHRvdGltZSB0byAxLjAgaWYgbm90CisJZ3JlYXRlciB0aGFuIDAuMC4gIFN1Z2dlc3RlZCBieSBIYXJvbGQgQXNzaW5rCisJPGNhcmxvQHNnLnRuLnR1ZGVsZnQubmw+LgorCitGcmkgU2VwIDIzIDE1OjA2OjQ1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIHByaW50Z3Byb2YuYyAocHJpbnRwcm9mKTogVXNlIGZyZWUsIG5vdCBjZnJlZS4KKwkocHJpbnRncHJvZiwgcHJpbnRpbmRleCk6IERpdHRvLgorCitUaHUgU2VwICAxIDEwOjQwOjQ1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBncHJvZi5oIChrZnJvbWxpc3QsIGt0b2xpc3QsIGZsaXN0LCBGbGlzdCwgZWxpc3QsIEVsaXN0KTogTWFrZQorCWRlY2xzIGV4dGVybiB0byBrZWVwIG5hdGl2ZSBIUCBjb21waWxlciBxdWlldC4KKworVHVlIEF1ZyAzMCAxMToxMjoxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiBJZ25vcmUgX19fZ251X2NvbXBpbGVkIGFzIHdlbGwgYXMKKwlfX2dudV9jb21waWxlZCwgZm9yIHRoZSBiZW5lZml0IG9mIHN5c3RlbXMgd2hpY2ggYWRkIGEgbGVhZGluZworCXVuZGVyc2NvcmUuCisKK1dlZCBBdWcgMjQgMTI6NDk6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSBpMzg2LSotKiB0byBpWzM0NV04Ni0qLSouCisKK1N1biBKdWwgMTAgMDA6MzU6MzEgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCisKKwkqIG5zNTMyLmMsIG5zNTMyLmg6IE5ldyBGaWxlcy4gbnM1MzIgc3VwcG9ydC4KKworCSogY29uZmlnL210LW5zNTMyOiBOZXcgRmlsZS4gbnM1MzIgc3VwcG9ydC4KKworCSogZ3Byb2YuYzogdXNlciByZWdpc3RlciBpbnQgaSBpbnN0ZWFkIG9mIGRlZmF1bHRpbmcgdGhlIGludC4KKwlBbGxvd3MgY29tcGlsYXRpb24gd2l0aCAtRHJlZ2lzdGVyPSBmb3IgZGVidWdnaW5nLgorCisJKiBjb25maWd1cmUuaW46IEFkZCBuczUzMiBzdXBwb3J0LgorCitUaHUgSnVuIDIzIDExOjIyOjQxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBNYWtlZmlsZS5pbiAoZ3Byb2YpOiBEZXBlbmQgb24gJChMSUJTKS4KKworRnJpIE1heSAyNyAxMjoyNDo1NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJRnJvbSBiaW51dGlscy0yLjQgcmVsZWFzZToKKworCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQorCisJKiBjb25maWd1cmUuYmF0OiBbbmV3XSBidWlsZCBtYWtlZmlsZSBmcm9tIG1ha2VmaWxlLmluIChkb3MpCisJKiBoZXJ0ei5jOiBhbGxvdyBzdGF0aWMgSEVSVFogKG1zZG9zIG5lZWRzIGl0KQorCSogZ3Byb2YuYzogYWxsb3cgdGFyZ2V0IHRvIHNlbGVjdCAiciIgb3IgInJiIiBmb3IgZm9wZW4KKwkqIGdwcm9mLmM6IGlnbm9yZSBfX2dudV9jb21waWxlZCBzeW1ib2xzCisJKiBpMzg2Lmg6IGRmaW5lIEZPUEVOX1JCIHRvICJyYiIgZm9yIGRvcy4KKworVHVlIE1heSAxNyAxNTozMDoyMiAxOTk0ICBFLiBNaWNoYWVsIFNtaXRoIChlbXNAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKC5tLmM6KTogIEFkZGVkIC5TVUZGSVhFUyA6IC5tIAorCXNvIGZsYXRfYmwuYyB3b3VsZCBtYWtlIGZyb20gZmxhdF9ibC5tIGZpbGUuCisKK1RodSBNYXkgIDUgMTk6MjM6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IENoZWNrIGZvciBncHJvZi5pbmZvIGluIGJ1aWxkIGRpciwKKwlmYWxsIGJhY2sgdG8gc3JjZGlyLiAgRGVwZW5kIG9uIGl0LgorCisJKiBncHJvZi5oIChUUlVFLCBGQUxTRSk6IEFsd2F5cyB1c2UgdW5kZWYgYmVmb3JlIGRlZmluaW5nIHRoZW0uCisKK01vbiBBcHIgIDQgMjM6NDc6MzAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIE1ha2VmaWxlLmluIChNWV9NQUNISU5FKTogUmVuYW1lZCBmcm9tIE1BQ0hJTkUgdG8gYXZvaWQgbG9zaW5nCisJbWFrZXMgKG9zZjEpIGluIHdoaWNoIHRoZSB2YWx1ZSBvZiBNQUNISU5FIGNhbiBub3QgYmUgY2hhbmdlZC4KKwkqIGNvbmZpZy8qLm10OiBDaGFuZ2VkIGFwcHJvcHJpYXRlbHkuCisKK1dlZCBNYXIgMzAgMTY6MTI6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBncHJvZi5jIChnZXRzeW10YWIpOiBDaGFuZ2Ugbm9zeW1zIHRvIGxvbmcuICBSZW5hbWUKKwlnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLiAgQ2hlY2sgZm9yCisJZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCisJYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCisKK1R1ZSBNYXIgMjIgMTA6NTA6NTIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiBVc2UgYmZkX2dldF9zeW1ib2xfaW5mbyBpbnN0ZWFkIG9mCisJYmZkX2RlY29kZV9zeW1jbGFzcy4KKworU3VuIE1hciAyMCAxNTo0MDoyMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWFrZWZpbGUuaW46IEF2b2lkIGJ1ZyBpbiBocHV4IHNlZC4KKworV2VkIERlYyAxNSAyMDoxNjo0MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGdwcm9mLnRleGkgKEludm9raW5nKTogYWRkIHRleHQgYWJvdXQgLXYgZmxhZworCisJKiBncHJvZi4xOiBhZGQgdGV4dCBhYm91dCAtdiBmbGFnCisKK1dlZCBEZWMgIDggMTY6NTU6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBncHJvZi5jIChWRVJTSU9OKTogZGVmaW5lZCBhIHZlcnNpb24gbWFjcm8sIHByaW50IHRoZSB2YWx1ZSAKKwl3aGVuIHRoZSAtdiBvcHRpb24gaXMgdXNlZAorCitUdWUgSnVsICA2IDEwOjExOjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBJbnN0YWxsIGNvcnJlY3RseS4KKworVGh1IEp1biAyNCAxNDo0MzoyMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGdwcm9mLmMgKG1haW4pOiBHZXQgd2hvYW1pIGZyb20gYXJndiwgaW5zdGVhZCBvZiBoYXJkY29kaW5nLgorCVVzZSBpdCBpbiB1c2FnZSBtZXNzYWdlLiAgU3BsaXQgdXNhZ2UgbWVzc2FnZSB0byBmaXQgaW4gODAgY29scy4KKworU3VuIEp1biAyMCAyMDo1ODowMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFVuZG8gMTUgSnVuZSBjaGFuZ2UuCisKK1dlZCBKdW4gMTYgMTI6NTQ6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogZ21vbi5oLCBncHJvZi5oOiBzdHJ1Y3RzIG9mIGNoYXJzIHVzZWQgdG8gaG9sZCBleHRlcm5hbAorCXJlcHJlc2VudGF0aW9ucy4KKwkqIGdwcm9mLmMgKGdldHBmaWxlLCBvcGVucGZpbGUsIHJlYWRzYW1wbGVzKTogU3dhcCBkYXRhIGluIHVzaW5nCisJbmV3IHN0cnVjdHVyZXMuCisKK1R1ZSBKdW4gMTUgMjM6MDk6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoLmMubyk6IExvb2sgaW4gLi4vaW5jbHVkZSwgbm90IC4uL2JmZCwgZm9yIGJmZC5oLgorCitNb24gSnVuIDE0IDE2OjIyOjU5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydAorCitNb24gSnVuICA3IDEyOjU2OjE3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgorCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KKworVHVlIE1heSAxOCAyMTo0NDoxMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogc2hvdWxkIG5vdCBkZXBlbmQgb24gaW5zdGFsbC1pbmZvCisKK01vbiBBcHIgMjYgMTI6Mzc6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBncHJvZi5oOiBJbmNsdWRlIGFuc2lkZWNsLmggYmVmb3JlIHN5c2RlcC5oLiAgVW5kZWZpbmUgaHouCisKK1R1ZSBBcHIgMTMgMTY6MTQ6MDMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIE0gTWFrZWZpbGUuaW46ICBBZGQgLWcgdG8gQ0ZMQUdTLgorCUFkcyBMREZMQUdTIGFuZCB1c2UgaW4gcGxhY2Ugb2YgQ0ZMQUdTIHdoZXJlIGFwcHJvcHJpYXRlLgorCSogY29uZmlndXJlLmluOiAgTWFrZSBhIHN5c2RlcC5obGluayBpbiB0aGUgc2FtZSB3YXkgb3RoZXIKKwliZmQtYmFzZWQgZGlyZWN0b3JpZXMgZG8uCisJKiBncHJvZi5oIChVTklUKTogIFJlcGxhY2Ugbm9uLXN0YW5kYXJkICd1X3Nob3J0JyBieSAndW5zaWduZWQKKwlzaG9ydCcuCisJKiBncHJvZi5oOiAgI2luY2x1ZGUgc3lzZGVwLmggaW5zdGVhZCBvZiBhIGJ1bmNoIG9mIHN0dWZmLgorCSogZ3Byb2YuYyAobWFpbik6ICBGaXggdHlwbyBncHJvZmYtPmdwcm9mLgorCitUaHUgTWFyIDI1IDE5OjAwOjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogZ3Byb2YudGV4aTogYWRkIElORk8tRElSLUVOVFJZCisKK1R1ZSBNYXIgMjMgMDA6MDM6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQKKworU2F0IEZlYiAyNyAxODoxNzoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGdwcm9mLmMgKGZ1bmNzeW1ib2wpOiAgSW52ZXJ0IHRlc3QgZm9yIGFmbGFnLgorCitUaHUgRmViIDI1IDE2OjAxOjUwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogcHJpbnRncHJvZiAoeG1hbGxvYywgeHJlYWxsb2MpOiAgQ2FzdCByZXN1bHRzIG9mIG1hbGxvYworCWFuZCByZWFsbG9jIHRvIFBUUi4KKworV2VkIEZlYiAgMyAxMzo1NTozMyAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogY3JlYXRlZCBpbmZvLCBpbnN0YWxsLWluZm8sIGR2aQorCitXZWQgSmFuICA2IDAwOjU4OjA5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGZpeCBpbnN0YWxsIHJ1bGUgZm9yICQoUFJPRykKKworRnJpIE9jdCAgOSAxMToyNTo0MSAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQorCisJKiBncHJvZi4xOiB1cGRhdGVkIFNZTk9QU0lTIHRvIG1hdGNoIGFjdHVhbCBiZWhhdmlvci4KKworTW9uIE9jdCAgNSAxNzo1MDoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogZ2VuLWMtcHJvZy5hd2s6ICBOZXcgYXdrIHNjcmlwdCwgbGlnaHRseSBjaGFuZ2VkIGZyb20KKwlwcmV2aW91c2x5IGRlbGV0ZWQgbWFrZS1jLXByb2cuYXdrLiAgQ29udmVydHMgYSB0ZXh0IGZpbGUKKwl0byBhIGMgZnVuY3Rpb24gdGhhdCBwcmludHMgdGhhdCB0ZXh0LgorCSogZmxhdF9ibC5tLCBmc2ZfY2FsbGdfYmwubSwgYnNkX2NhbGxnX2JsLm06ICBOZXcgZmlsZXMuCisJSW5wdXRzIHRvIGdlbi1jLXByb2cuYXdrLCBjb250YWluaW5nIHRleHQgZGVzY3JpYmluZworCWdwcm9mIG91dHB1dC4KKwkqIGJsdXJicy5jOiAgUmVtb3ZlZC4gIFVzZSAqX2JsLmMgaW5zdGVhZC4KKwkqIE1ha2VmaWxlLmluOiBVc2UgZ2VuLWNwcm9nLmF3ayB0byBnZW5lcmF0ZSAqX2JsLmMgZmlsZXMKKwlmcm9tICpfYmwubSBmaWxlcy4gIEFsc28sIGltcHJvdmUgKmNsZWFuIHJ1bGVzLgorCSogcHJpbnRncHJvZi5jIChwcmludGdwcm9mKTogIFVzdyBuZXcgZnVuY3Rpb24gbmFtZXMgZnJvbSAqX2JsLmMuCisJCisKK1N1biBBdWcgMzAgMTk6NTQ6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBncHJvZi5oLCBncHJvZi5jLCBwcmludGZncHJvZi5jOiAgQWRkIHN1cHBvcnQgZm9yIHR3bworCW91dHB1dCBzdHlsZXM6ICBUaGUgZGVmYXVsdCBpcyBzaW1pbGFyIHRvIHRoZSBvbGQgRlNGIGdwcm9mLAorCXdoaWxlIC1UIHNldHMgdGhlIHZhcmlhYmxlIGJzZF9zdHlsZV9vdXRwdXQsIHdoaWNoIGNhdXNlcworCW91dHB1dCBtYXRjaGluZyBCZXJrZWxleSdzIGdwcm9mLiAgVGhlIGJpZ2dlc3QgZGlmZmVyZW5jZXMKKwlhcmUgdGhhdCB3aXRoIHRoZSBGU0Ygc3R5bGUgb3V0cHV0LCB0aGUgZmxhdCBwcm9maWxlIGNvbWVzCisJYmVmb3JlIHRoZSBjYWxsIGdyYXBoOyBudW1iZXJzIGNvbWUgYmVmb3JlIGV4cGxhbmF0aW9uczsKKwlhbmQgdGhlcmUgaXMgbGVzcyBncmF0dWl0b3VzIHdoaXRlIHNwYWNlLgorCSogZ3Byb2YuaCwgZ3Byb2YuYywgcHJpbnRmZ3Byb2YuYzogIE5ldyBkaXNjYXJkX3VuZGVyc2NvcmVzCisJdmFyaWFibGUgY2F1c2VzIGRpc2NhcmRpbmcgb2YgaW5pdGlhbCB1bmRlcnNjb3JlcyB3aGVuCisJcHJpbnRpbmcgc3ltYm9sIG5hbWVzLiAgSXQgaXMgc2V0IHVubGVzcyB0aGVyZSBpcyBhICJtYWluIgorCXN5bWJvbCAod2l0aG91dCBhbiB1bmRlcnNjb3JlKS4KKwkqIHByaW50Zmdwcm9mLmM6ICBOZXcgZnVuY3Rpb24gcHJpbnRuYW1lb25seSgpLCBjYWxsZWQKKwlieSBwcmludG5hbWUoKS4gIEl0IGhhbmRsZXMgc3RyaXBwaW5nIG9mIGluaXRpYWwgJ18nLAorCWFzIHdlbGwgYXMgQysrIG5hbWUtZGVtYW5nbGluZy4KKwkqIGdwcm9mLmNhbGxnLCBncHJvZi5mbGF0LCBtYWtlLWMtcHJvZy5hd2s6ICBSZW1vdmVkLgorCUl0IGlzIGp1c3QgYXMgY29udmVuaWVudCB0byBlZGl0IGJsdXJicy5jIGRpcmVjdGx5LgorCSogTWFrZWZpbGUuaW46ICBSZW1vdmVkIHJ1bGUgZm9yIG1ha2luZyBibHVyYnMuYy4KKwkqIGJsdXJicy5jOiAgVGhpcyBpcyBub3cgYSB0cnVlIHNvdXJjZSBmaWxlIChhcyBvcHBvc2VkCisJdG8gYmVpbmcgZ2VuZXJhdGVkIGZyb20gZ3Byb2YuY2FsbGcgYW5kIGdwcm9mLmZsYXQpLgorCUNoYW5nZSBzdHlsZSB0byB1c2Ugb25lIGxvbmcgc3RyaW5nIGxpdGVyYWwsIGluc3RlYWQgb2YKKwlvbmUgbGl0ZXJhbCBwZXIgb3V0cHV0IGxpbmUuICBBZGQgRlNGLXN0eWxlIGJsdXJiIGZvciBjYWxsIGdyYXBoLgorCitXZWQgQXVnIDE5IDE0OjM2OjM5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgorCitXZWQgQXVnIDEyIDE1OjE0OjE0IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgJHtNQUNISU5FfSB0byAkKE1BQ0hJTkUpLgorCitTdW4gSnVsIDE5IDE3OjM0OjAxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICByZW1vdmVkIGluc3RhbGxhdGlvbiBvZiB0aGUgbm93IHVzZWxlc3MKKwljYWxsLntmbGFnLGNhbGxnfSBmaWxlcy4gIAorCisJKiBncHJvZi4xOiBub3cgdXNlcyB0aGUgc3RhbmRhcmQgbWFuIG1hY3JvcyBpbnN0ZWFkIG9mIHRoZSBuZXcgQlNECisJbWFuZG9jIG1hY3Jvcy4gCisKK1N1biBKdWwgMTIgMTk6MDY6MDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSBob3N0IHNlY3Rpb24sIGV4cGFuZCB0YXJnZXQgc2VjdGlvbi4KKwkqIGNvbmZpZy9tdC17dGFob2UsdmF4fTogIEFkZCwgdG8gbWF0Y2ggZXhpc3Rpbmcgc3VwcG9ydCBmaWxlcy4KKwkqIGNvbmZpZy90bWFrZS0qOiAgUmVtb3ZlIGxlZnRvdmVyIGNydWQuCisKKwkqIGJsdXJicy5jOiAgTmV3IGZpbGUsIGNyZWF0ZWQgZnJvbSBncHJvZi5mbGF0IGFuZCBncHJvZi5jYWxsZyBieQorCSogbWFrZS1jLXByb2cuYXdrOiAgd2hpY2ggcHJvY2Vzc2VzIHRleHQgZmlsZXMgaW50byBDIHByb2dyYW1zLgorCSogcHJpbnRncHJvZi5jIChmbGF0cHJvZmhlYWRlciwgZ3Byb2ZoZWFkZXIpOiAgQ2FsbCBuZXcgZnVuY3Rpb25zCisJdG8gcHJpbnQgYmx1cmJzLgorCShwcmludGJsdXJiKTogIFJlbW92ZS4KKwkqIE1ha2VmaWxlLmluOiAgSW5mcmFzdHJ1Y3R1cmUgdG8gYnVpbGQgYmx1cmJzLgorCSogcGF0aG5hbWVzLmg6ICBoYXMgYmVlbiByZW1vdmVkLiAgR3Byb2Ygbm93IGhhcyBubyBmaWxlbmFtZQorCWRlcGVuZGVuY2llcyBpbiBpdC4KKwkqIGdwcm9mLmM6ICBMaW50LgorCitTYXQgSnVsIDExIDE4OjA3OjIxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGRlZmluZSBtYW4xZGlyIGFuZCBpbnN0YWxsIHRoZSBtYW4gcGFnZQorCitGcmkgSnVsIDEwIDIxOjE0OjA4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdW1teSBpbmZvIGFuZCBpbnN0YWxsLWluZm8gdGFyZ2V0cworCitUaHUgSnVuICA0IDExOjM0OjAyIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCisKKwkqIGxvb2t1cC5jOiBmaXhlZCBmZW5jZXBvc3QgaW4gbmxsb29rdXAgYW5kIGFkZGVkIGRiZ19ubGxvb2t1cCBmb3IKKwloZWxwIGluIGRlYnVnZ2luZyB0aGUgcHJvYmxlbSAod2l0aCAtRERFQlVHKQorCSogZ3Byb2YuYzogc3ltYm9sIHZhbHVlcyBhcmUgbm93IHJlYWwgdmFsdWVzLCBkb24ndCBhZGQgdGhlIHZtYQorCWFueW1vcmUuIChkb25lIGZvciBzb2xhcmlzOyBzaG91bGQgdmVyaWZ5IHRoaXMgb24gb3RoZXIgcGxhdGZvcm1zKQorCSogQ2hhbmdlTG9nOiBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvTWFrZWZpbGUuYW0gYi9ncHJvZi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUxNDkyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3NCBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgorCitBVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCisKK1NVRkZJWEVTID0gLm0KKworU1VCRElSUyA9IHBvCisKK0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtRERFQlVHIC1JLi4vYmZkIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vYmZkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKKworYmluX1BST0dSQU1TID0gZ3Byb2YKKworIyMgQ29udmVuaWVuY2UgdmFyIGxpc3RpbmcgcHVyZSBzb3VyY2VzLgorc291cmNlcyA9IGJhc2ljX2Jsb2Nrcy5jIGNhbGxfZ3JhcGguYyBjZ19hcmNzLmMgY2dfZGZuLmMgXAorCWNnX3ByaW50LmMgY29yZWZpbGUuYyBnbW9uX2lvLmMgZ3Byb2YuYyBoZXJ0ei5jIGhpc3QuYyBzb3VyY2UuYyBcCisJc2VhcmNoX2xpc3QuYyBzeW10YWIuYyBzeW1faWRzLmMgdXRpbHMuYyBcCisJaTM4Ni5jIGFscGhhLmMgdmF4LmMgdGFob2UuYyBzcGFyYy5jCitncHJvZl9TT1VSQ0VTID0gJChzb3VyY2VzKSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKK2dwcm9mX0RFUEVOREVOQ0lFUyA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCitncHJvZl9MREFERCA9IC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTExJQlMpCisKK25vaW5zdF9IRUFERVJTID0gXAorCWJhc2ljX2Jsb2Nrcy5oIGNhbGxfZ3JhcGguaCBjZ19hcmNzLmggY2dfZGZuLmggY2dfcHJpbnQuaCBcCisJY29yZWZpbGUuaCBnbW9uLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCisJc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaAorCitFWFRSQV9ESVNUID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jIGJiY29udi5wbAorCitCVUlMVF9TT1VSQ0VTID0gZmxhdF9ibC5jIGJzZF9jYWxsZ19ibC5jIGZzZl9jYWxsZ19ibC5jCisKK2Rpc3RzdHVmZjogJChCVUlMVF9TT1VSQ0VTKSBpbmZvCisKKy5tLmM6CisJYXdrIC1mICQoc3JjZGlyKS9nZW4tYy1wcm9nLmF3ayA+IC4vJCouYyBcCisJICAgIEZVTkNUSU9OPWAoZWNobyAkKnxzZWQgLWUgJ3MsLiovLCxnJyAtZSAncy9fYmwvLycpYF9ibHVyYiBcCisJICAgIEZJTEU9JCoubSAkKHNyY2RpcikvJCoubQorCitQT1RGSUxFUyA9ICQoc291cmNlcykgJChub2luc3RfSEVBREVSUykKK3BvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCisJZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCisJICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCisKK2luZm9fVEVYSU5GT1MgPSBncHJvZi50ZXhpCittYW5fTUFOUyA9IGdwcm9mLjEKKworIyBEZXBlbmRlbmNpZXMuCiskKE9CSkVDVFMpOiAuLi9iZmQvYmZkLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19wcmludC5oIFwKKwljb3JlZmlsZS5oIGdtb25faW8uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAorCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAorCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAorCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKK2Jhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYworYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYworY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKK2NnX2FyY3MubzogY2dfYXJjcy5jCitjZ19kZm4ubzogY2dfZGZuLmMKK2NnX3ByaW50Lm86IGNnX3ByaW50LmMKK2NvcmVmaWxlLm86IGNvcmVmaWxlLmMKK2ZsYXRfYmwubzogZmxhdF9ibC5jCitmc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKK2dtb25faW8ubzogZ21vbl9pby5jCitncHJvZi5vOiBncHJvZi5jCitoZXJ0ei5vOiBoZXJ0ei5jCitoaXN0Lm86IGhpc3QuYworc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYworc291cmNlLm86IHNvdXJjZS5jCitzeW10YWIubzogc3ltdGFiLmMKK3N5bV9pZHMubzogc3ltX2lkcy5jCit1dGlscy5vOiB1dGlscy5jCitpMzg2Lm86IGkzODYuYworYWxwaGEubzogYWxwaGEuYwordmF4Lm86IHZheC5jCit0YWhvZS5vOiB0YWhvZS5jCitzcGFyYy5vOiBzcGFyYy5jCmRpZmYgLS1naXQgYS9ncHJvZi9NYWtlZmlsZS5pbiBiL2dwcm9mL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWRkODgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDcyNiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbGliZGlyID0gQGxpYmRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK21hbmRpciA9IEBtYW5kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCisKK0RFU1RESVIgPQorCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorCit0b3BfYnVpbGRkaXIgPSAuCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACisKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQVMgPSBAQVNACitDQVRBTE9HUyA9IEBDQVRBTE9HU0AKK0NBVE9CSkVYVCA9IEBDQVRPQkpFWFRACitDQyA9IEBDQ0AKK0RBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAorRExMVE9PTCA9IEBETExUT09MQAorRVhFRVhUID0gQEVYRUVYVEAKK0dNT0ZJTEVTID0gQEdNT0ZJTEVTQAorR01TR0ZNVCA9IEBHTVNHRk1UQAorR1RfTk8gPSBAR1RfTk9ACitHVF9ZRVMgPSBAR1RfWUVTQAorSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAorSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAorSU5UTERFUFMgPSBASU5UTERFUFNACitJTlRMTElCUyA9IEBJTlRMTElCU0AKK0lOVExPQkpTID0gQElOVExPQkpTQAorTEQgPSBATERACitMSUJUT09MID0gQExJQlRPT0xACitMTl9TID0gQExOX1NACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorTVNHRk1UID0gQE1TR0ZNVEAKK05NID0gQE5NQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUE9GSUxFUyA9IEBQT0ZJTEVTQAorUE9TVUIgPSBAUE9TVUJACitSQU5MSUIgPSBAUkFOTElCQAorVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACitVU0VfTkxTID0gQFVTRV9OTFNACitVU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorbCA9IEBsQAorCitBVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCisKK1NVRkZJWEVTID0gLm0KKworU1VCRElSUyA9IHBvCisKK0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtRERFQlVHIC1JLi4vYmZkIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vYmZkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKKworYmluX1BST0dSQU1TID0gZ3Byb2YKKworc291cmNlcyA9IGJhc2ljX2Jsb2Nrcy5jIGNhbGxfZ3JhcGguYyBjZ19hcmNzLmMgY2dfZGZuLmMgXAorCWNnX3ByaW50LmMgY29yZWZpbGUuYyBnbW9uX2lvLmMgZ3Byb2YuYyBoZXJ0ei5jIGhpc3QuYyBzb3VyY2UuYyBcCisJc2VhcmNoX2xpc3QuYyBzeW10YWIuYyBzeW1faWRzLmMgdXRpbHMuYyBcCisJaTM4Ni5jIGFscGhhLmMgdmF4LmMgdGFob2UuYyBzcGFyYy5jCisKK2dwcm9mX1NPVVJDRVMgPSAkKHNvdXJjZXMpIGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYworZ3Byb2ZfREVQRU5ERU5DSUVTID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKK2dwcm9mX0xEQUREID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKKworbm9pbnN0X0hFQURFUlMgPSBcCisJYmFzaWNfYmxvY2tzLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19kZm4uaCBjZ19wcmludC5oIFwKKwljb3JlZmlsZS5oIGdtb24uaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKKwlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oCisKKworRVhUUkFfRElTVCA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYyBiYmNvbnYucGwKKworQlVJTFRfU09VUkNFUyA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYworCitQT1RGSUxFUyA9ICQoc291cmNlcykgJChub2luc3RfSEVBREVSUykKKworaW5mb19URVhJTkZPUyA9IGdwcm9mLnRleGkKK21hbl9NQU5TID0gZ3Byb2YuMQorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGdjb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0gCitiaW5fUFJPR1JBTVMgPSAgZ3Byb2YkKEVYRUVYVCkKK1BST0dSQU1TID0gICQoYmluX1BST0dSQU1TKQorCisKK0RFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitMREZMQUdTID0gQExERkxBR1NACitMSUJTID0gQExJQlNACitncHJvZl9PQkpFQ1RTID0gIGJhc2ljX2Jsb2Nrcy5vIGNhbGxfZ3JhcGgubyBjZ19hcmNzLm8gY2dfZGZuLm8gXAorY2dfcHJpbnQubyBjb3JlZmlsZS5vIGdtb25faW8ubyBncHJvZi5vIGhlcnR6Lm8gaGlzdC5vIHNvdXJjZS5vIFwKK3NlYXJjaF9saXN0Lm8gc3ltdGFiLm8gc3ltX2lkcy5vIHV0aWxzLm8gaTM4Ni5vIGFscGhhLm8gdmF4Lm8gdGFob2UubyBcCitzcGFyYy5vIGZsYXRfYmwubyBic2RfY2FsbGdfYmwubyBmc2ZfY2FsbGdfYmwubworZ3Byb2ZfTERGTEFHUyA9IAorQ0ZMQUdTID0gQENGTEFHU0AKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACitURVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCitURVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAorSU5GT19ERVBTID0gZ3Byb2YuaW5mbworRFZJUyA9IGdwcm9mLmR2aQorVEVYSU5GT1MgPSBncHJvZi50ZXhpCittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK01BTlMgPSAkKG1hbl9NQU5TKQorCitOUk9GRiA9IG5yb2ZmCitIRUFERVJTID0gICQobm9pbnN0X0hFQURFUlMpCisKK0RJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gVE9ETyBcCithY2xvY2FsLm00IGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gZ2NvbmZpZy5pbgorCisKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCisKK1RBUiA9IHRhcgorR1pJUF9FTlYgPSAtLWJlc3QKK1NPVVJDRVMgPSAkKGdwcm9mX1NPVVJDRVMpCitPQkpFQ1RTID0gJChncHJvZl9PQkpFQ1RTKQorCithbGw6IGFsbC1yZWRpcmVjdAorLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuUyAuYyAuZHZpIC5pbmZvIC5sbyAubSAubyAucHMgLnMgLnRleGkgLnRleGluZm8gLnR4aQorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAKKwljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQorCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCisJY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCisKK2djb25maWcuaDogc3RhbXAtaAorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCQlybSAtZiBzdGFtcC1oOyBcCisJCSQoTUFLRSkgc3RhbXAtaDsgXAorCWVsc2UgOjsgZmkKK3N0YW1wLWg6ICQoc3JjZGlyKS9nY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Z2NvbmZpZy5oOmdjb25maWcuaW4gXAorCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisJQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKKyQoc3JjZGlyKS9nY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKKwkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAorCWVsc2UgOjsgZmkKKyQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAorCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQorCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAorCittb3N0bHljbGVhbi1oZHI6CisKK2NsZWFuLWhkcjoKKworZGlzdGNsZWFuLWhkcjoKKwktcm0gLWYgZ2NvbmZpZy5oCisKK21haW50YWluZXItY2xlYW4taGRyOgorCittb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKKworY2xlYW4tYmluUFJPR1JBTVM6CisJLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCisKK2Rpc3RjbGVhbi1iaW5QUk9HUkFNUzoKKworbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKKworaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAorCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCisJICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAorCWRvbmUKKworLmMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKKy5zLm86CisJJChDT01QSUxFKSAtYyAkPAorCisuUy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCisKK2NsZWFuLWNvbXBpbGU6CisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK21haW50YWluZXItY2xlYW4tY29tcGlsZToKKworLmMubG86CisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8CisKKy5zLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAorCisuUy5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisKK21haW50YWluZXItY2xlYW4tbGlidG9vbDoKKworZ3Byb2YkKEVYRUVYVCk6ICQoZ3Byb2ZfT0JKRUNUUykgJChncHJvZl9ERVBFTkRFTkNJRVMpCisJQHJtIC1mIGdwcm9mJChFWEVFWFQpCisJJChMSU5LKSAkKGdwcm9mX0xERkxBR1MpICQoZ3Byb2ZfT0JKRUNUUykgJChncHJvZl9MREFERCkgJChMSUJTKQorCitncHJvZi5pbmZvOiBncHJvZi50ZXhpCitncHJvZi5kdmk6IGdwcm9mLnRleGkKKworCitEVklQUyA9IGR2aXBzCisKKy50ZXhpLmluZm86CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnRleGkuZHZpOgorCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAorCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKKworLnRleGk6CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnRleGluZm8uaW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aW5mbzoKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorCisudGV4aW5mby5kdmk6CisJVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCisJICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAorCisudHhpLmluZm86CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnR4aS5kdmk6CisJVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCisJICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAorCisudHhpOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisuZHZpLnBzOgorCSQoRFZJUFMpICQ8IC1vICRACisKK2luc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQorCUBsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAorCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAorCSAgICBlbHNlIDogOyBmaTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKwlAJChQT1NUX0lOU1RBTEwpCisJQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKKwkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAorCSAgZG9uZTsgXAorCWVsc2UgOiA7IGZpCisKK3VuaW5zdGFsbC1pbmZvOgorCSQoUFJFX1VOSU5TVEFMTCkKKwlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpaT15ZXM7IFwKKwllbHNlIGlpPTsgZmk7IFwKKwlsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0IC16ICIkaWkiIFwKKwkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCisJZG9uZQorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCisJZG9uZQorCitkaXN0LWluZm86ICQoSU5GT19ERVBTKQorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisKK21vc3RseWNsZWFuLWFtaW5mbzoKKwktcm0gLWYgZ3Byb2YuYXV4IGdwcm9mLmNwIGdwcm9mLmNwcyBncHJvZi5kdmkgZ3Byb2YuZm4gZ3Byb2YuZm5zIFwKKwkgIGdwcm9mLmt5IGdwcm9mLmt5cyBncHJvZi5wcyBncHJvZi5sb2cgZ3Byb2YucGcgZ3Byb2YudG9jIFwKKwkgIGdwcm9mLnRwIGdwcm9mLnRwcyBncHJvZi52ciBncHJvZi52cnMgZ3Byb2Yub3AgZ3Byb2YudHIgXAorCSAgZ3Byb2YuY3YgZ3Byb2YuY24KKworY2xlYW4tYW1pbmZvOgorCitkaXN0Y2xlYW4tYW1pbmZvOgorCittYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKKwlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKKwkgIHJtIC1mICQkaTsgXAorCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCisJICAgIHJtIC1mICQkaS1bMC05XSo7IFwKKwkgIGZpOyBcCisJZG9uZQorY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCisKK2luc3RhbGwtbWFuMToKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCisJQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKKwlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCisJICBjYXNlICIkJGkiIGluIFwKKwkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKKwkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCisJICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAorCWRvbmUKKwordW5pbnN0YWxsLW1hbjE6CisJQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKKwlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCisJICBjYXNlICIkJGkiIGluIFwKKwkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKKwkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCisJICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKKwlkb25lCitpbnN0YWxsLW1hbjogJChNQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQordW5pbnN0YWxsLW1hbjoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCisKK0BTRVRfTUFLRUAKKworYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAoraW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCitjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCisJZG9uZTsgXAorCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKKwordGFnczogVEFHUworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAorCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAorCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBnY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKyAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisgICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAorCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKWdjb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgZ2NvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQorCittb3N0bHljbGVhbi10YWdzOgorCitjbGVhbi10YWdzOgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRAorCittYWludGFpbmVyLWNsZWFuLXRhZ3M6CisKK2Rpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKK3RvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwktcm0gLXJmICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKKwlta2RpciAkKGRpc3RkaXIpLz1idWlsZAorCW1rZGlyICQoZGlzdGRpcikvPWluc3QKKwlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAorCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKKwkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAorCS1ybSAtcmYgJChkaXN0ZGlyKQorCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCisJZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKKwllY2hvICIkJGRhc2hlcyI7IFwKKwllY2hvICIkJGJhbm5lciI7IFwKKwllY2hvICIkJGRhc2hlcyIKK2Rpc3Q6IGRpc3RkaXIKKwktY2htb2QgLVIgYStyICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCisJLXJtIC1yZiAkKGRpc3RkaXIpCitkaXN0LWFsbDogZGlzdGRpcgorCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQorCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKKwktcm0gLXJmICQoZGlzdGRpcikKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCS1ybSAtcmYgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikKKwktY2htb2QgNzc3ICQoZGlzdGRpcikKKwlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCisJICBmaTsgXAorCWRvbmUKKwlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCitpbmZvLWFtOiAkKElORk9fREVQUykKK2luZm86IGluZm8tcmVjdXJzaXZlCitkdmktYW06ICQoRFZJUykKK2R2aTogZHZpLXJlY3Vyc2l2ZQorY2hlY2stYW06CitjaGVjazogY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsY2hlY2stYW06CitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtaW5mby1hbTogCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKK2FsbC1yZWN1cnNpdmUtYW06IGdjb25maWcuaAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgJChIRUFERVJTKSBnY29uZmlnLmgKK2FsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CisJJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKKworCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQlVJTFRfU09VUkNFUykiIHx8IHJtIC1mICQoQlVJTFRfU09VUkNFUykKK21vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLWJpblBST0dSQU1TIFwKKwkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwkJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCisJCWNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KKworY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitkaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCisJCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAorCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQorCS1ybSAtZiBsaWJ0b29sCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBjb25maWcuc3RhdHVzCisKK21haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCisJCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCisJCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCisuUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCittb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAorbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCittb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAorbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAorY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKK21vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCittYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAordW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCitpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAordW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAoraW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAorZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAorZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCitpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKK2luc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAorYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCitkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCittb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgorCisKK2Rpc3RzdHVmZjogJChCVUlMVF9TT1VSQ0VTKSBpbmZvCisKKy5tLmM6CisJYXdrIC1mICQoc3JjZGlyKS9nZW4tYy1wcm9nLmF3ayA+IC4vJCouYyBcCisJICAgIEZVTkNUSU9OPWAoZWNobyAkKnxzZWQgLWUgJ3MsLiovLCxnJyAtZSAncy9fYmwvLycpYF9ibHVyYiBcCisJICAgIEZJTEU9JCoubSAkKHNyY2RpcikvJCoubQorcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKKwlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKKwkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KKworIyBEZXBlbmRlbmNpZXMuCiskKE9CSkVDVFMpOiAuLi9iZmQvYmZkLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19wcmludC5oIFwKKwljb3JlZmlsZS5oIGdtb25faW8uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAorCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAorCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAorCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKK2Jhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYworYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYworY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKK2NnX2FyY3MubzogY2dfYXJjcy5jCitjZ19kZm4ubzogY2dfZGZuLmMKK2NnX3ByaW50Lm86IGNnX3ByaW50LmMKK2NvcmVmaWxlLm86IGNvcmVmaWxlLmMKK2ZsYXRfYmwubzogZmxhdF9ibC5jCitmc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKK2dtb25faW8ubzogZ21vbl9pby5jCitncHJvZi5vOiBncHJvZi5jCitoZXJ0ei5vOiBoZXJ0ei5jCitoaXN0Lm86IGhpc3QuYworc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYworc291cmNlLm86IHNvdXJjZS5jCitzeW10YWIubzogc3ltdGFiLmMKK3N5bV9pZHMubzogc3ltX2lkcy5jCit1dGlscy5vOiB1dGlscy5jCitpMzg2Lm86IGkzODYuYworYWxwaGEubzogYWxwaGEuYwordmF4Lm86IHZheC5jCit0YWhvZS5vOiB0YWhvZS5jCitzcGFyYy5vOiBzcGFyYy5jCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL05PVEVTIGIvZ3Byb2YvTk9URVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExYWYzMAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL05PVEVTCkBAIC0wLDAgKzEsNDM4IEBACitTdW4gRmViICA1IDE2OjA5OjE2IDE5OTUKKworVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgY2hhbmdlcyBhbmQgbmV3IGZlYXR1cmVzIGF2YWlsYWJsZSB3aXRoIHRoaXMKK3ZlcnNpb24gb2YgR05VIGdwcm9mLgorCisqIE5ldyBGZWF0dXJlcworCisgbyBMb25nIG9wdGlvbnMKKworIG8gU3VwcG9ydHMgZ2VuZXJhbGl6ZWQgZmlsZSBmb3JtYXQsIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKyAgIG5ldyBmaWxlIGZvcm1hdCBzdXBwb3J0cyBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGFuZCBub24tcmVhbHRpbWUKKyAgIGhpc3RvZ3JhbXMgKHNlZSBiZWxvdykKKworIG8gU3VwcG9ydHMgcHJvZmlsaW5nIGF0IHRoZSBsaW5lIGxldmVsOiBmbGF0IHByb2ZpbGVzLCBjYWxsLWdyYXBoIHByb2ZpbGVzLAorICAgYW5kIGV4ZWN1dGlvbi1jb3VudHMgY2FuIGFsbCBiZSBkaXNwbGF5ZWQgYXQgYSBsZXZlbCB0aGF0IGlkZW50aWZpZXMKKyAgIGluZGl2aWR1YWwgbGluZXMgcmF0aGVyIHRoYW4ganVzdCBmdW5jdGlvbnMKKworIG8gVGVzdC1jb3ZlcmFnZSBzdXBwb3J0IChzaW1pbGFyIHRvIFN1biB0Y292IHByb2dyYW0pOiBzb3VyY2UgZmlsZXMKKyAgIGNhbiBiZSBhbm5vdGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZnVuY3Rpb24gd2FzIGludm9rZWQKKyAgIG9yIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGJhc2ljLWJsb2NrIGluIGEgZnVuY3Rpb24gd2FzCisgICBleGVjdXRlZAorCisgbyBHZW5lcmFsaXplZCBoaXN0b2dyYW1zOiBub3QganVzdCBleGVjdXRpb24tdGltZSwgYnV0IGFyYml0cmFyeQorICAgaGlzdG9ncmFtcyBhcmUgc3VwcG9ydCAoZm9yIGV4YW1wbGUsIHBlcmZvcm1hbmNlIGNvdW50ZXIgYmFzZWQKKyAgIHByb2ZpbGVzKQorCisgbyBQb3dlcmZ1bCBtZWNoYW5pc20gdG8gc2VsZWN0IGRhdGEgdG8gYmUgaW5jbHVkZWQvZXhjbHVkZWQgZnJvbQorICAgYW5hbHlzaXMgYW5kL29yIG91dHB1dAorCisgbyBTdXBwb3J0IGZvciBERUMgT1NGLzEgdjMuMAorCisgbyBGdWxsIGNyb3NzLXBsYXRmb3JtIHByb2ZpbGluZyBzdXBwb3J0OiBncHJvZiB1c2VzIEJGRCB0byBzdXBwb3J0CisgICBhcmJpdHJhcnksIG5vbi1uYXRpdmUgb2JqZWN0IGZpbGUgZm9ybWF0cyBhbmQgbm9uLW5hdGl2ZSBieXRlLW9yZGVycworICAgKHRoaXMgZmVhdHVyZSBoYXMgbm90IGJlZW4gdGVzdGVkIHlldCkKKworIG8gSW4gdGhlIGNhbGwtZ3JhcGggZnVuY3Rpb24gaW5kZXgsIHN0YXRpYyBmdW5jdGlvbiBuYW1lcyBhcmUgbm93CisgICBwcmludGVkIHRvZ2V0aGVyIHdpdGggdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZAorICAgKHJlcXVpcmVkIGJmZF9maW5kX25lYXJlc3RfbGluZSgpIHN1cHBvcnQgYW5kIHN5bWJvbGljIGRlYnVnZ2luZworICAgIGluZm9ybWF0aW9uIHRvIGJlIHByZXNlbnQgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSkKKworIG8gTWFqb3Igb3ZlcmhhdWwgb2Ygc291cmNlIGNvZGUgKGNvbXBpbGVzIGNsZWFubHkgd2l0aCAtV2FsbCwgZXRjLikKKworKiBTdXBwb3J0ZWQgUGxhdGZvcm1zCisKK1RoZSBjdXJyZW50IHZlcnNpb24gaXMga25vd24gdG8gd29yayBvbjoKKworIG8gREVDIE9TRi8xIHYzLjAKKwlBbGwgZmVhdHVyZXMgc3VwcG9ydGVkLgorCisgbyBTdW5PUyA0LjEueAorCUFsbCBmZWF0dXJlcyBzdXBwb3J0ZWQuCisKKyBvIFNvbGFyaXMgMi4zCisJTGluZS1sZXZlbCBwcm9maWxpbmcgdW5zdXBwb3J0ZWQgYmVjYXVzZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKQorCWlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBmb3IgRWxmIGJpbmFyaWVzLgorCisgbyBIUC1VWCA5LjAxCisJTGluZS1sZXZlbCBwcm9maWxpbmcgdW5zdXBwb3J0ZWQgYmVjYXVzZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKQorCWlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBmb3IgU09NIGJpbmFyaWVzLgorCisqIERldGFpbGVkIERlc2NyaXB0aW9uCisKKyoqIFVzZXIgSW50ZXJmYWNlIENoYW5nZXMKKworVGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgaXMgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyCit2ZXJzaW9ucyBvZiBHTlUgZ3Byb2YgYW5kIEJlcmtlbGV5IGdwcm9mLiAgVGhlIG9ubHkgZXhjZXB0aW9uIGlzCit0aGUgb3B0aW9uIHRvIGRlbGV0ZSBhcmNzIGZyb20gdGhlIGNhbGwgZ3JhcGguICBUaGUgb2xkIHN5bnRheAord2FzOgorCisJLWsgZnJvbW5hbWUgdG9uYW1lCisKK3doaWxlIHRoZSBuZXcgc3ludGF4IGlzOgorCisJLWsgZnJvbW5hbWUvdG9uYW1lCisKK1RoaXMgY2hhbmdlIHdhcyBuZWNlc3NhcnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGxvbmctb3B0aW9uIHBhcnNpbmcuCitBbHNvLCAiZnJvbW5hbWUiIGFuZCAidG9uYW1lIiBjYW4gbm93IGJlIGFyYml0cmFyeSBzeW1zcGVjcyByYXRoZXIKK3RoYW4ganVzdCBmdW5jdGlvbiBuYW1lcyAoc2VlIGJlbG93IGZvciBhbiBleHBsYW5hdGlvbiBvZiBzeW1zcGVjcykuCitGb3IgZXhhbXBsZSwgb3B0aW9uICItayBncHJvZi5jLyIgc3VwcHJlc3NlcyBhbGwgYXJjcyBkdWUgdG8gY2FsbHMgb3V0CitvZiBmaWxlICJncHJvZi5jIi4KKworKioqIFN5bSBTcGVjcworCitJdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gYXBwbHkgZ3Byb2Ygb25seSB0byBzcGVjaWZpYyBwYXJ0cyBvZiBhCitwcm9ncmFtLiAgR05VIGdwcm9mIGhhcyBhIHNpbXBsZSBidXQgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIGFjaGlldmUKK3RoaXMuICBTbyBjYWxsZWQge1xlbSBzeW1zcGVjc1wvfSBwcm92aWRlIHRoZSBmb3VuZGF0aW9uIGZvciB0aGlzCittZWNoYW5pc20uICBBIHN5bXNwZWMgc2VsZWN0cyB0aGUgcGFydHMgb2YgYSBwcm9maWxlZCBwcm9ncmFtIHRvIHdoaWNoCithbiBvcGVyYXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8uICBUaGUgc3ludGF4IG9mIGEgc3ltc3BlYyBpcworc2ltcGxlOgorCisJICBmaWxlbmFtZV9jb250YWluaW5nX2FfZG90CisJfCBmdW5jbmFtZV9ub3RfY29udGFpbmluZ19hX2RvdAorCXwgbGluZW51bWJlcgorCXwgKCBbIGFueV9maWxlbmFtZSBdIGA6JyAoIGFueV9mdW5jbmFtZSB8IGxpbmVudW1iZXIgKSApCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKKwltYWluLmMJCQlTZWxlY3RzIGV2ZXJ5dGhpbmcgaW4gZmlsZSAibWFpbi5jIi0tLXRoZQorCQkJCWRvdCBpbiB0aGUgc3RyaW5nIHRlbGxzIGdwcm9mIHRvIGludGVycHJldAorCQkJCXRoZSBzdHJpbmcgYXMgYSBmaWxlbmFtZSwgcmF0aGVyIHRoYW4gYXMKKwkJCQlhIGZ1bmN0aW9uIG5hbWUuICBUbyBzZWxlY3QgYSBmaWxlIHdob3NlCisJCQkJbmFtZSBkb2VzIGNvbnRhaW4gYSBkb3QsIGEgdHJhaWxpbmcgY29sb24KKwkJCQlzaG91bGQgYmUgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsICJvZGQ6IiBpcworCQkJCWludGVycHJldGVkIGFzIHRoZSBmaWxlIG5hbWVkICJvZGQiLgorCisJbWFpbgkJCVNlbGVjdHMgYWxsIGZ1bmN0aW9ucyBuYW1lZCAibWFpbiIuICBOb3RpY2UKKwkJCQl0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlCisJCQkJc2FtZSBmdW5jdGlvbiBuYW1lIGJlY2F1c2Ugc29tZSBvZiB0aGUKKwkJCQlkZWZpbml0aW9ucyBtYXkgYmUgbG9jYWwgKGkuZS4sIHN0YXRpYykuCisJCQkJVW5sZXNzIGEgZnVuY3Rpb24gbmFtZSBpcyB1bmlxdWUgaW4gYSBwcm9ncmFtLAorCQkJCXlvdSBtdXN0IHVzZSB0aGUgY29sb24gbm90YXRpb24gZXhwbGFpbmVkCisJCQkJYmVsb3cgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYworCQkJCXNvdXJjZSBmaWxlLiAgU29tZXRpbWVzLCBmdW5jdGlvbm5hbWVzIGNvbnRhaW4KKwkJCQlkb3RzLiAgSW4gc3VjaCBjYXNlcywgaXQgaXMgbmVjZXNzYXIgdG8KKwkJCQlhZGQgYSBsZWFkaW5nIGNvbG9uIHRvIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsCisJCQkJIjoubXVsIiBzZWxlY3RzIGZ1bmN0aW9uICIubXVsIi4KKwkJCQkKKwltYWluLmM6bWFpbgkJU2VsZWN0cyBmdW5jdGlvbiAibWFpbiIgaW4gZmlsZSAibWFpbi5jIi4KKworCW1haW4uYzoxMzQJCVNlbGVjdHMgbGluZSAxMzQgaW4gZmlsZSAibWFpbi5jIi4KKworSU1QTEVNRU5UQVRJT04gTk9URTogVGhlIHNvdXJjZSBjb2RlIHVzZXMgdGhlIHR5cGUgc3ltX2lkIGZvciBzeW1zcGVjcy4KK0F0IHNvbWUgcG9pbnQsIHRoaXMgcHJvYmFibHkgb3VnaHQgdG8gYmUgY2hhbmdlZCB0byAic3ltX3NwZWMiIHRvIG1ha2UKK3JlYWRpbmcgdGhlIGNvZGUgZWFzaWVyLgorCisqKiogTG9uZyBvcHRpb25zCisKK0dOVSBncHJvZiBub3cgc3VwcG9ydHMgbG9uZyBvcHRpb25zLiAgVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgYWxsCitzdXBwb3J0ZWQgb3B0aW9ucy4gIE9wdGlvbnMgdGhhdCBhcmUgbGlzdGVkIHdpdGhvdXQgZGVzY3JpcHRpb24KK29wZXJhdGUgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbiBpbiBvbGRlcgordmVyc2lvbnMgb2YgZ3Byb2YuCisKK1Nob3J0IEZvcm06CUxvbmcgRm9ybToKKy0tLS0tLS0tLS0tCS0tLS0tLS0tLS0KKy1sCQktLWxpbmUKKwkJCVJlcXVlc3QgcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWxldmVsIHJhdGhlcgorCQkJdGhhbiBqdXN0IGF0IHRoZSBmdW5jdGlvbiBsZXZlbC4gIFNvdXJjZQorCQkJbGluZXMgYXJlIGlkZW50aWZpZWQgYnkgc3ltYm9scyBvZiB0aGUgZm9ybToKKworCQkJCWZ1bmMgKGZpbGU6bGluZSkKKworCQkJd2hlcmUgImZ1bmMiIGlzIHRoZSBmdW5jdGlvbiBuYW1lLCAiZmlsZSIgaXMgdGhlCisJCQlmaWxlIG5hbWUgYW5kICJsaW5lIiBpcyB0aGUgbGluZS1udW1iZXIgdGhhdAorCQkJY29ycmVzcG9uZHMgdG8gdGhlIGxpbmUuCisKKwkJCVRvIHdvcmsgcHJvcGVybHksIHRoZSBiaW5hcnkgbXVzdCBjb250YWluIHN5bWJvbGljCisJCQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlIHNvdXJjZQorCQkJaGF2ZSB0byBiZSB0cmFuc2xhdGVkIHdpdGggb3B0aW9uICItZyIgc3BlY2lmaWVkLgorCQkJRnVuY3Rpb25zIGZvciB3aGljaCB0aGVyZSBpcyBubyBzeW1ib2xpYyBkZWJ1Z2dpbmcKKwkJCWluZm9ybWF0aW9uIGF2YWlsYWJsZSBhcmUgdHJlYXRlZCBhcyBpZiAiLS1saW5lIgorCQkJaGFkIG5vdCBiZWVuIHNwZWNpZmllZC4gIEhvd2V2ZXIsIHRoZSBsaW5lIG51bWJlcgorCQkJcHJpbnRlZCB3aXRoIHN1Y2ggc3ltYm9scyBpcyB1c3VhbGx5IGluY29ycmVjdAorCQkJYW5kIHNob3VsZCBiZSBpZ25vcmVkLgorCistYQkJLS1uby1zdGF0aWMKKy1BW3N5bXNwZWNdCS0tYW5ub3RhdGVkLXNvdXJjZVs9c3ltc3BlY10KKwkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGFubm90YXRlZCBzb3VyY2UKKwkJCWZpbGVzLiAgSWYgInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgcHJpbnQgb3V0cHV0IG9ubHkKKwkJCWZvciBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIi4gIElmIHRoZSBvcHRpb24KKwkJCWlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgYW5ub3RhdGVkIG91dHB1dCBpcworCQkJZ2VuZXJhdGVkIGZvciB0aGUgdW5pb24gb2YgYWxsIHN5bXNwZWNzLgorCisJCQlFeGFtcGxlczoKKworCQkJICAtQQkJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGFsbAorCQkJCQlzb3VyY2UgZmlsZXMuCisJCQkgIC1BZ3Byb2YuYwlQcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmb3IgZmlsZQorCQkJCQlncHJvZi5jLgorCQkJICAtQWZvb2JhcglQcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmb3IgZmlsZXMKKwkJCQkJY29udGFpbmluZyBhIGZ1bmN0aW9uIG5hbWVkICJmb29iYXIiLgorCQkJCQlUaGUgZW50aXJlIGZpbGUgd2lsbCBiZSBwcmludGVkLCBidXQKKwkJCQkJb25seSB0aGUgZnVuY3Rpb24gaXRzZWxmIHdpbGwgYmUKKwkJCQkJYW5ub3RhdGVkIHdpdGggcHJvZmlsZSBkYXRhLgorCistSltzeW1zcGVjXQktLW5vLWFubm90YXRlZC1zb3VyY2VbPXN5bXNwZWNdCisJCQlTdXBwcmVzcyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dC4gIElmIHNwZWNpZmllZAorCQkJd2l0aG91dCBhcmd1bWVudCwgYW5ub3RhdGVkIG91dHB1dCBpcyBzdXBwcmVzc2VkCisJCQljb21wbGV0ZWx5LiAgV2l0aCBhbiBhcmd1bWVudCwgYW5ub3RhdGVkIG91dHB1dAorCQkJaXMgc3VwcHJlc3NlZCBvbmx5IGZvciB0aGUgc3ltYm9scyBzZWxlY3RlZCBieQorCQkJInN5bXNwZWMiLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUKKwkJCXRpbWVzLCBhbm5vdGF0ZWQgb3V0cHV0IGlzIHN1cHByZXNzZWQgZm9yIHRoZQorCQkJdW5pb24gb2YgYWxsIHN5bXNwZWNzLiAgVGhpcyBvcHRpb24gaGFzIGxvd2VyCisJCQlwcmVjZWRlbmNlIHRoYW4gLS1hbm5vdGF0ZWQtc291cmNlCisKKy1wW3N5bXNwZWNdCS0tZmxhdC1wcm9maWxlWz1zeW1zcGVjXQorCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBmbGF0IHByb2ZpbGUKKwkJCSh1bmxlc3MgYW55IG90aGVyIG91dHB1dC1zdHlsZSBvcHRpb24gaXMgc3BlY2lmaWVkLAorCQkJIHRoaXMgb3B0aW9uIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0KS4gIElmCisJCQkic3ltc3BlYyIgaXMgc3BlY2lmaWVkLCBpbmNsdWRlIG9ubHkgc3ltYm9scworCQkJc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGluIGZsYXQgcHJvZmlsZS4gIElmIHRoZQorCQkJb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIGZsYXQKKwkJCXByb2ZpbGUgaW5jbHVkZXMgc3ltYm9scyBzZWxlY3RlZCBieSB0aGUgdW5pb24KKwkJCW9mIGFsbCBzeW1zcGVjcy4KKwkJCQorLVBbc3ltc3BlY10JLS1uby1mbGF0LXByb2ZpbGVbPXN5bXNwZWNdCisJCQlTdXBwcmVzcyBvdXRwdXQgaW4gdGhlIGZsYXQgcHJvZmlsZS4gIElmIGdpdmVuCisJCQl3aXRob3V0IGFuIGFyZ3VtZW50LCB0aGUgZmxhdCBwcm9maWxlIGlzIHN1cHByZXNzZWQKKwkJCWNvbXBsZXRlbHkuICBJZiAic3ltc3BlYyIgaXMgc3BlY2lmaWVkLCBzdXBwcmVzcworCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaW4gdGhlIGZsYXQgcHJvZmlsZS4gIElmIHRoZQorCQkJb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mCisJCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24KKwkJCWhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gLS1mbGF0LXByb2ZpbGUuCisKKy1xW3N5bXNwZWNdCS0tZ3JhcGhbPXN5bXNwZWNdCisJCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGNhbGwtZ3JhcGgKKwkJCSh1bmxlc3MgYW55IG90aGVyIG91dHB1dC1zdHlsZSBvcHRpb24gaXMgc3BlY2lmaWVkLAorCQkJIHRoaXMgb3B0aW9uIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0KS4gIElmICJzeW1zcGVjIgorCQkJaXMgc3BlY2lmaWVkLCBpbmNsdWRlIG9ubHkgc3ltYm9scyBzZWxlY3RlZCBieQorCQkJInN5bXNwZWMiIGluIHRoZSBjYWxsLWdyYXBoLiAgSWYgdGhlIG9wdGlvbiBpcworCQkJc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgY2FsbC1ncmFwaCBpbmNsdWRlcworCQkJc3ltYm9scyBzZWxlY3RlZCBieSB0aGUgdW5pb24gb2YgYWxsIHN5bXNwZWNzLgorCistUVtzeW1zcGVjXQktLW5vLWdyYXBoWz1zeW1zcGVjXQorCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBjYWxsLWdyYXBoLiAgSWYgZ2l2ZW4gd2l0aG91dAorCQkJYW4gYXJndW1lbnQsIHRoZSBjYWxsLWdyYXBoIGlzIHN1cHByZXNzZWQgY29tcGxldGVseS4KKwkJCVdpdGggYSAic3ltc3BlYyIsIHN1cHByZXNzIHRoZSBzZWxlY3RlZCBzeW1ib2xzCisJCQlmcm9tIHRoZSBjYWxsLWdyYXBoLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQKKwkJCW11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24gb2YgdGhlIHNlbGVjdGVkIHN5bWJvbHMKKwkJCWlzIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbiBoYXMgbG93ZXIgcHJlY2VkZW5jZQorCQkJdGhhbiAtLWdyYXBoLgorCistQ1tzeW1zcGVjXQktLWV4ZWMtY291bnRzWz1zeW1zcGVjXQorCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgZXhlY3V0aW9uIGNvdW50cy4KKwkJCUlmICJzeW1zcGVjIiBpcyBwcmVzZW50LCBpbmNsdWRlIG9ubHkgc3ltYm9scworCQkJc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGluIHRoZSBleGVjdXRpb24gY291bnQKKwkJCWxpc3RpbmcuICBJZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZQorCQkJdGltZXMsIHRoZSBleGVjdXRpb24gY291bnQgbGlzdGluZyBpbmNsdWRlcworCQkJc3ltYm9scyBzZWxlY3RlZCBieSB0aGUgdW5pb24gb2YgYWxsIHN5bXNwZWNzLgorCistWltzeW1zcGVjXQktLW5vLWV4ZWMtY291bnRzWz1zeW1zcGVjXQorCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBleGVjdXRpb24gY291bnQgbGlzdGluZy4KKwkJCUlmIGdpdmVuIHdpdGhvdXQgYW4gYXJndW1lbnQsIHRoZSBsaXN0aW5nIGlzCisJCQlzdXBwcmVzc2VkIGNvbXBsZXRlbHkuICBXaXRoIGEgInN5bXNwZWMiLCBzdXBwcmVzcworCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgZnJvbSB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZQorCQkJb3B0aW9uIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mCisJCQl0aGUgc2VsZWN0ZWQgc3ltYm9scyBpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24KKwkJCWhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gLS1leGVjLWNvdW50cy4KKworLWkJCS0tZmlsZS1pbmZvCisJCQlQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZmlsZSBmaWxlcyB0aGF0CisJCQlhcmUgcmVhZC4gIFRoZSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKKwkJCW51bWJlciBhbmQgdHlwZXMgb2YgcmVjb3JkcyBwcmVzZW50IGluIHRoZQorCQkJcHJvZmlsZSBmaWxlLiAgQ3VycmVudGx5LCBhIHByb2ZpbGUgZmlsZSBjYW4KKwkJCWNvbnRhaW4gYW55IG51bWJlciBhbmQgYW55IGNvbWJpbmF0aW9uIG9mIGhpc3RvZ3JhbSwKKwkJCWNhbGwtZ3JhcGgsIG9yIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZHMuCisKKy1zCQktLXN1bQorCisteAkJLS1hbGwtbGluZXMKKwkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KKwkJCUJ5IGRlZmF1bHQsIG9ubHkgdGhlIGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YKKwkJCWEgYmFzaWMtYmxvY2sgYXJlIGFubm90YXRlZC4gIElmIHRoaXMgb3B0aW9uIGlzCisJCQlzcGVjaWZpZWQsIGV2ZXJ5IGxpbmUgaW4gYSBiYXNpYy1ibG9jayBpcyBhbm5vdGF0ZWQKKwkJCWJ5IHJlcGVhdGluZyB0aGUgYW5ub3RhdGlvbiBmb3IgdGhlIGZpcnN0IGxpbmUuCisJCQlUaGlzIG9wdGlvbiBpcyBpZGVudGljYWwgdG8gdGNvdidzICItYSIuCisKKy1JIGRpcnMJCS0tZGlyZWN0b3J5LXBhdGg9ZGlycworCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgorCQkJU3BlY2lmaWVzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkCisJCQlmb3Igc291cmNlIGZpbGVzLiAgVGhlIGFyZ3VtZW50ICJkaXJzIiBpcyBhIGNvbG9uCisJCQlzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3Rvcmllcy4gIEJ5IGRlZmF1bHQsIGdwcm9mCisJCQlzZWFyY2hlcyBmb3Igc291cmNlIGZpbGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CisJCQl3b3JraW5nIGRpcmVjdG9yeSBvbmx5LgorCistegkJLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMKKworLW0gbnVtCQktLW1pbi1jb3VudD1udW0KKwkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBhbmQgZXhlY3V0aW9uCisJCQljb3VudCBvdXRwdXQgb25seS4gIFN5bWJvbHMgdGhhdCBhcmUgZXhlY3V0ZWQKKwkJCWxlc3MgdGhhbiAibnVtIiB0aW1lcyBhcmUgc3VwcHJlc3NlZC4gIEZvciBhbm5vdGF0ZWQKKwkJCXNvdXJjZSBvdXRwdXQsIHN1cHByZXNzZWQgc3ltYm9scyBhcmUgbWFya2VkCisJCQlieSBmaXZlIGhhc2gtbWFya3MgKCMjIyMjKS4gIEluIGFuIGV4ZWN1dGlvbiBjb3VudAorCQkJb3V0cHV0LCBzdXBwcmVzc2VkIHN5bWJvbHMgZG8gbm90IGFwcGVhciBhdCBhbGwuCisKKy1MCQktLXByaW50LXBhdGgKKwkJCU5vcm1hbGx5LCBzb3VyY2UgZmlsZW5hbWVzIGFyZSBwcmludGVkIHdpdGggdGhlIHBhdGgKKwkJCWNvbXBvbmVudCBzdXBwcmVzc2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgZ3Byb2YKKwkJCWNhbiBiZSBmb3JjZWQgdG8gcHJpbnQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YKKwkJCXNvdXJjZSBmaWxlbmFtZXMuICBUaGUgZnVsbCBwYXRobmFtZSBpcyBkZXRlcm1pbmVkCisJCQlmcm9tIHN5bWJvbGljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgaW1hZ2UgZmlsZQorCQkJYW5kIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyCisJCQl3YXMgaW52b2tlZC4KKworLXkJCS0tc2VwYXJhdGUtZmlsZXMKKwkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KKwkJCU5vcm1hbGx5LCBncHJvZiBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcworCQkJdG8gc3RhbmRhcmQtb3V0cHV0LiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAorCQkJYW5ub3RhdGVkIHNvdXJjZSBmb3IgYSBmaWxlIG5hbWVkICJwYXRoL2ZpbGVuYW1lIgorCQkJaXMgZ2VuZXJhdGVkIGluIHRoZSBmaWxlICJmaWxlbmFtZS1hbm4iLiAgVGhhdCBpcywKKwkJCWFubm90YXRlZCBvdXRwdXQgaXMge1xlbSBhbHdheXNcL30gZ2VuZXJhdGVkIGluCisJCQlncHJvZidzIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBDYXJlIGhhcyB0bworCQkJYmUgdGFrZW4gaWYgYSBwcm9ncmFtIGNvbnNpc3RzIG9mIGZpbGVzIHRoYXQgaGF2ZQorCQkJaWRlbnRpY2FsIGZpbGVuYW1lcywgYnV0IGRpc3RpbmN0IHBhdGhzLgorCistYwkJLS1zdGF0aWMtY2FsbC1ncmFwaAorCistdCBudW0JCS0tdGFibGUtbGVuZ3RoPW51bQorCQkJVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgorCQkJQWZ0ZXIgYW5ub3RhdGluZyBhIHNvdXJjZSBmaWxlLCBncHJvZiBnZW5lcmF0ZXMKKwkJCWFuIGV4ZWN1dGlvbiBjb3VudCBzdW1tYXJ5IGNvbnNpc3Rpbmcgb2YgYSB0YWJsZQorCQkJb2YgbGluZXMgd2l0aCB0aGUgdG9wIGV4ZWN1dGlvbiBjb3VudHMuICBCeQorCQkJZGVmYXVsdCwgdGhpcyB0YWJsZSBpcyB0ZW4gZW50cmllcyBsb25nLgorCQkJVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB0YWJsZSBsZW5ndGgKKwkJCW9yLCBieSBzcGVjaWZ5aW5nIGFuIGFyZ3VtZW50IHZhbHVlIG9mIDAsIGl0IGNhbiBiZQorCQkJc3VwcHJlc3NlZCBjb21wbGV0ZWx5LgorCistbiBzeW1zcGVjCS0tdGltZT1zeW1zcGVjCisJCQlPbmx5IHN5bWJvbHMgc2VsZWN0ZWQgYnkgInN5bXNwZWMiIGFyZSBjb25zaWRlcmVkCisJCQlpbiB0b3RhbCBhbmQgcGVyY2VudGFnZSB0aW1lIGNvbXB1dGF0aW9ucy4KKwkJCUhvd2V2ZXIsIHRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBwZXJjZW50YWdlIHRpbWUKKwkJCWNvbXB1dGF0aW9uIGZvciB0aGUgZmxhdCBwcm9maWxlLgorCQkJSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbgorCQkJb2YgYWxsIHNlbGVjdGVkIHN5bWJvbHMgaXMgdXNlZCBpbiB0aW1lIGNvbXB1dGF0aW9ucy4KKworLU4JCS0tbm8tdGltZT1zeW1zcGVjCisJCQlFeGNsdWRlIHRoZSBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBmcm9tCisJCQl0b3RhbCBhbmQgcGVyY2VudGFnZSB0aW1lIGNvbXB1dGF0aW9ucy4KKwkJCUhvd2V2ZXIsIHRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCBwZXJjZW50YWdlIHRpbWUKKwkJCWNvbXB1dGF0aW9uIGZvciB0aGUgZmxhdCBwcm9maWxlLgorCQkJVGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiBhbnkgLS10aW1lIG9wdGlvbnMgYXJlCisJCQlzcGVjaWZpZWQuCisKKy13IG51bQkJLS13aWR0aD1udW0KKwkJCVNldHMgdGhlIG91dHB1dCBsaW5lIHdpZHRoLiAgQ3VycmVudGx5LCB0aGlzIG9wdGlvbgorCQkJYWZmZWN0cyB0aGUgcHJpbnRpbmcgb2YgdGhlIGNhbGwtZ3JhcGggZnVuY3Rpb24gaW5kZXgKKwkJCW9ubHkuCisKKy1lCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+CistRQkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgorLWYJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KKy1GCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+CistawkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgorLWIJCS0tYnJpZWYKKy1kbnVtCQktLWRlYnVnWz1udW1dCisKKy1oCQktLWhlbHAKKwkJCVByaW50cyBhIHVzYWdlIG1lc3NhZ2UuCisKKy1PIG5hbWUJCS0tZmlsZS1mb3JtYXQ9bmFtZQorCQkJU2VsZWN0cyB0aGUgZm9ybWF0IG9mIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMuCisJCQlSZWNvZ25pemVkIGZvcm1hdHMgYXJlICJhdXRvIiwgImJzZCIsICJtYWdpYyIsCisJCQlhbmQgInByb2YiLiAgVGhlIGxhc3Qgb25lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorCQkJRm9ybWF0ICJhdXRvIiBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIGZpbGUgZm9ybWF0CisJCQlhdXRvbWF0aWNhbGx5ICh0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4KKwkJCUl0IGF0dGVtcHRzIHRvIHJlYWQgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcyBhcworCQkJIm1hZ2ljIiBmaWxlcyBhbmQgaWYgdGhpcyBmYWlscywgZmFsbHMgYmFjayB0bworCQkJdGhlICJic2QiIGZvcm1hdC4gICJic2QiIGZvcmNlcyBncHJvZiB0byByZWFkCisJCQl0aGUgZGF0YSBmaWxlcyBpbiB0aGUgQlNEIGZvcm1hdC4gICJtYWdpYyIgZm9yY2VzCisJCQlncHJvZiB0byByZWFkIHRoZSBkYXRhIGZpbGVzIGluIHRoZSAibWFnaWMiIGZvcm1hdC4KKworLVQJCS0tdHJhZGl0aW9uYWwKKy12CQktLXZlcnNpb24KKworKiogRmlsZSBGb3JtYXQgQ2hhbmdlcworCitUaGUgb2xkIEJTRC1kZXJpdmVkIGZvcm1hdCB1c2VkIGZvciBwcm9maWxlIGRhdGEgZG9lcyBub3QgY29udGFpbiBhCittYWdpYyBjb29raWUgdGhhdCBhbGxvd3MgdG8gY2hlY2sgd2hldGhlciBhIGRhdGEgZmlsZSByZWFsbHkgaXMgYQorZ3Byb2YgZmlsZS4gIEZ1cnRoZXJtb3JlLCBpdCBkb2VzIG5vdCBwcm92aWRlIGEgdmVyc2lvbiBudW1iZXIsIHRodXMKK3JlbmRlcmluZyBjaGFuZ2VzIHRvIHRoZSBmaWxlIGZvcm1hdCBhbG1vc3QgaW1wb3NzaWJsZS4gIEdOVSBncHJvZgordXNlcyBhIG5ldyBmaWxlIGZvcm1hdCB0aGF0IHByb3ZpZGVzIHRoZXNlIGZlYXR1cmVzLiAgRm9yIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5LCBHTlUgZ3Byb2YgY29udGludWVzIHRvIHN1cHBvcnQgdGhlIG9sZCBCU0QtZGVyaXZlZAorZm9ybWF0LCBidXQgbm90IGFsbCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIHdpdGggaXQuICBGb3IgZXhhbXBsZSwKK2Jhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgY2Fubm90IGJlIGFjY29tbW9kYXRlZCBieSB0aGUgb2xkIGZpbGUKK2Zvcm1hdC4KKworVGhlIG5ldyBmaWxlIGZvcm1hdCBpcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlIFxmaWxle2dtb25fb3V0Lmh9LiAgSXQKK2NvbnNpc3RzIG9mIGEgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIG1hZ2ljIGNvb2tpZSBhbmQgYSB2ZXJzaW9uIG51bWJlciwKK2FzIHdlbGwgYXMgc29tZSBzcGFyZSBieXRlcyBhdmFpbGFibGUgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiAgQWxsIGRhdGEKK2luIGEgcHJvZmlsZSBkYXRhIGZpbGUgaXMgaW4gdGhlIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb24gd2hpY2gKK3RoZSBwcm9maWxlIHdhcyBjb2xsZWN0ZWQuICBHTlUgZ3Byb2YgYWRhcHRzIGF1dG9tYXRpY2FsbHkgdG8gdGhlCitieXRlLW9yZGVyIGluIHVzZS4KKworSW4gdGhlIG5ldyBmaWxlIGZvcm1hdCwgdGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mCityZWNvcmRzLiAgQ3VycmVudGx5LCB0aGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IHJlY29yZCB0eXBlczogaGlzdG9ncmFtCityZWNvcmRzLCBjYWxsLWdyYXBoIGFyYyByZWNvcmRzLCBhbmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50CityZWNvcmRzLiAgRWFjaCBmaWxlIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgZWFjaCByZWNvcmQgdHlwZS4gIFdoZW4KK3JlYWRpbmcgYSBmaWxlLCBHTlUgZ3Byb2Ygd2lsbCBlbnN1cmUgcmVjb3JkcyBvZiB0aGUgc2FtZSB0eXBlIGFyZQorY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgYW5kIGNvbXB1dGUgdGhlIHVuaW9uIG9mIGFsbCByZWNvcmRzLiAgRm9yCitleGFtcGxlLCBmb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVuaW9uIGlzIHNpbXBseSB0aGUgc3VtCitvZiBhbGwgZXhlY3V0aW9uIGNvdW50cyBmb3IgZWFjaCBiYXNpYy1ibG9jay4KKworKioqIEhpc3RvZ3JhbSBSZWNvcmRzCisKK0hpc3RvZ3JhbSByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgdGhhdCBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZgorYmlucy4gIFRoZSBoZWFkZXIgY29udGFpbnMgdGhlIHRleHQtc2VnbWVudCByYW5nZSB0aGF0IHRoZSBoaXN0b2dyYW0KK3NwYW5zLCB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGluIGJ5dGVzICh1bmxpa2UgaW4gdGhlIG9sZCBCU0QKK2Zvcm1hdCwgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIpLCB0aGUgcmF0ZSBvZiB0aGUKK3Byb2ZpbGluZyBjbG9jaywgYW5kIHRoZSBwaHlzaWNhbCBkaW1lbnNpb24gdGhhdCB0aGUgYmluIGNvdW50cworcmVwcmVzZW50IGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGUgcHJvZmlsaW5nIGNsb2NrIHJhdGUuICBUaGUKK3BoeXNpY2FsIGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdHdvIHBhcnRzOiBhIGxvbmcgbmFtZSBvZiB1cCB0byAxNQorY2hhcmFjdGVycyBhbmQgYSBzaW5nbGUgY2hhcmFjdGVyIGFiYnJldmlhdGlvbi4gIEZvciBleGFtcGxlLCBhCitoaXN0b2dyYW0gcmVwcmVzZW50aW5nIHJlYWwtdGltZSB3b3VsZCBzcGVjaWZ5IHRoZSBsb25nIG5hbWUgYXMKKyJzZWNvbmRzIiBhbmQgdGhlIGFiYnJldmlhdGlvbiBhcyAicyIuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcgorYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgcGVyZm9ybWFuY2UgbW9uaXRvciBoYXJkd2FyZSAod2hpY2gsCitmb3J0dW5hdGVseSwgaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IGNvbW1vbikuICBGb3IgZXhhbXBsZSwgdW5kZXIgREVDCitPU0YvMSwgdGhlICJ1cHJvZmlsZSIgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgaGlzdG9ncmFtIG9mLAorc2F5LCBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMuICBJbiB0aGlzIGNhc2UsIHRoZSBkaW1lbnNpb24gaW4gdGhlCitoaXN0b2dyYW0gaGVhZGVyIGNvdWxkIGJlIHNldCB0byAiaS1jYWNoZSBtaXNzZXMiIGFuZCB0aGUgYWJicmV2aWF0aW9uCitjb3VsZCBiZSBzZXQgdG8gIjEiIChiZWNhdXNlIGl0IGlzIHNpbXBseSBhIGNvdW50LCBub3QgYSBwaHlzaWNhbAorZGltZW5zaW9uKS4gIEFsc28sIHRoZSBwcm9maWxpbmcgcmF0ZSB3b3VsZCBoYXZlIHRvIGJlIHNldCB0byAxIGluCit0aGlzIGNhc2UuCisKK0hpc3RvZ3JhbSBiaW5zIGFyZSAxNi1iaXQgbnVtYmVycyBhbmQgZWFjaCBiaW4gcmVwcmVzZW50IGFuIGVxdWFsCithbW91bnQgb2YgdGV4dC1zcGFjZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGV4dC1zZWdtZW50IGlzIG9uZQordGhvdXNhbmQgYnl0ZXMgbG9uZyBhbmQgaWYgdGhlcmUgYXJlIHRlbiBiaW5zIGluIHRoZSBoaXN0b2dyYW0sIGVhY2gKK2JpbiByZXByZXNlbnRzIG9uZSBodW5kcmVkIGJ5dGVzLgorCisKKyoqKiBDYWxsLUdyYXBoIFJlY29yZHMKKworQ2FsbC1ncmFwaCByZWNvcmRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB1c2VkIGluCit0aGUgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQuICBJdCBjb25zaXN0cyBvZiBhbiBhcmMgaW4gdGhlIGNhbGwgZ3JhcGgKK2FuZCBhIGNvdW50IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYXJjIHdhcyB0cmF2ZXJzZWQKK2R1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4gIEFyY3MgYXJlIHNwZWNpZmllZCBieSBhIHBhaXIgb2YgYWRkcmVzc2VzOgordGhlIGZpcnN0IG11c3QgYmUgd2l0aGluIGNhbGxlcidzIGZ1bmN0aW9uIGFuZCB0aGUgc2Vjb25kIG11c3QgYmUKK3dpdGhpbiB0aGUgY2FsbGVlJ3MgZnVuY3Rpb24uICBXaGVuIHBlcmZvcm1pbmcgcHJvZmlsaW5nIGF0IHRoZQorZnVuY3Rpb24gbGV2ZWwsIHRoZXNlIGFkZHJlc3NlcyBjYW4gcG9pbnQgYW55d2hlcmUgd2l0aGluIHRoZQorcmVzcGVjdGl2ZSBmdW5jdGlvbi4gIEhvd2V2ZXIsIHdoZW4gcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWxldmVsLCBpdCBpcworYmV0dGVyIGlmIHRoZSBhZGRyZXNzZXMgYXJlIGFzIGNsb3NlIHRvIHRoZSBjYWxsLXNpdGUvZW50cnktcG9pbnQgYXMKK3Bvc3NpYmxlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsaW5lLWxldmVsIGNhbGwtZ3JhcGggaXMgYWJsZSB0bworaWRlbnRpZnkgZXhhY3RseSB3aGljaCBsaW5lIG9mIHNvdXJjZSBjb2RlIHBlcmZvcm1lZCBjYWxscyB0byBhCitmdW5jdGlvbi4KKworKioqIEJhc2ljLUJsb2NrIEV4ZWN1dGlvbiBDb3VudCBSZWNvcmRzCisKK0Jhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudCByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgZm9sbG93ZWQgYnkgYQorc2VxdWVuY2Ugb2YgYWRkcmVzcy9jb3VudCBwYWlycy4gIFRoZSBoZWFkZXIgc2ltcGx5IHNwZWNpZmllcyB0aGUKK2xlbmd0aCBvZiB0aGUgc2VxdWVuY2UuICBJbiBhbiBhZGRyZXNzL2NvdW50IHBhaXIsIHRoZSBhZGRyZXNzCitpZGVudGlmaWVzIGEgYmFzaWMtYmxvY2sgYW5kIHRoZSBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcwordGhhdCBiYXNpYy1ibG9jayB3YXMgZXhlY3V0ZWQuICBBbnkgYWRkcmVzcyB3aXRoaW4gdGhlIGJhc2ljLWFkZHJlc3MgY2FuCitiZSB1c2VkLgorCitJTVBMRU1FTlRBVElPTiBOT1RFOiBnY2MgLWEgY2FuIGJlIHVzZWQgdG8gaW5zdHJ1bWVudCBhIHByb2dyYW0gdG8KK3JlY29yZCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLiAgSG93ZXZlciwgdGhlIF9fYmJfZXhpdF9mdW5jKCkKK3RoYXQgaXMgY3VycmVudGx5IHByZXNlbnQgaW4gbGliZ2NjMi5jIGRvZXMgbm90IGdlbmVyYXRlIGEgZ21vbi5vdXQKK2ZpbGUgaW4gYSBzdWl0ZWFibGUgZm9ybWF0LiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgZm9yIGZ1dHVyZSByZWxlYXNlcworb2YgZ2NjLiAgSW4gdGhlIG1lYW50aW1lLCBjb250YWN0IGRhdmlkbUBjcy5hcml6b25hLmVkdSBmb3IgYSB2ZXJzaW9uCitvZiBfX2JiX2V4aXRfZnVuYygpIHRvIGlzIGFwcHJvcHJpYXRlLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvVEVTVCBiL2dwcm9mL1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhOTAzMAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL1RFU1QKQEAgLTAsMCArMSw3IEBACistIGNoZWNrIHdoZXRoZXIgb2xkIGZpbGUgZm9ybWF0IGlzIHByb3Blcmx5IHJlYWQgd2hlbiBpbnB1dCBjb21lcyBmcm9tCisgIHN0ZGluCisKKy0gY2hlY2sgd2hldGhlciB1bmRlcnNjb3JlcyBhcmUgcHJvcGVybHkgZGVhbHQgd2l0aCAoYm90aCwgb24gc3lzdGVtcworICB0aGF0IHByZXBlbmQgdGhlbSB0byBlYWNoIEMgbmFtZSBhbmQgb24gc3lzdGVtcyB0aGF0IGRvbid0KQorCistIGVuc3VyZSBncHJvZiBmYWlscyBncmFjZWZ1bGx5IHdoZW4gbm8gZGVidWdnaW5nIGluZm8gYXZhaWxhYmxlCmRpZmYgLS1naXQgYS9ncHJvZi9UT0RPIGIvZ3Byb2YvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDExMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvVE9ETwpAQCAtMCwwICsxLDcyIEBACisKKy0gZ21vbl9pby5jIGNhbm5vdCBkZWFsIHdpdGggdGFyZ2V0IGFyY2hpdGVjdHVyZSB0aGF0IGhhdmUgYSBwb2ludGVyIHNpemUKKyAgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaG9zdCBhcmNoaXRlY3R1cmVzIHBvaW50ZXIgc2l6ZS0tLWZpeCB0aGlzCisgIChnbW9uX291dC5oLCBhbmQgZ21vbl9pby5jKQorLSBhZGQgc3VwcG9ydCBmb3IgcHJvZiBmaWxlIGZvcm1hdCBzbyB0aGF0IHByb2YgZmlsZXMgY2FuIGJlIGRpc3BsYXllZAorICBhdCB0aGUgbGluZS1sZXZlbCAodGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB1cHJvZmlsZSB0b29sIHVuZGVyIERFQydzCisgIE9TRi8xKQorLSB0YWtlIGEgaGFyZCBsb29rIGF0IC0tZmlsZS1vcmRlcmluZyAoYnJva2VuKSBhbmQgLS1mdW5jdGlvbi1vcmRlcmluZworCisrIGRvY3VtZW50YXRpb24KKysgb3B0aW1pemUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lX251bSgpIChvciByZXBsYWNlIGJ5IGRpZmZlcmVudCBpbnRlcmZhY2UpCisrIGNsZWFudXAgX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZV9udW0oKSBmaXhlcyAmIGRlc2NyaXB0aW9uCisrIGVuc3VyZSAiY2MgLXBnIiBwcm9kdWNlcyBnb29kIGZpbGVzIHVuZGVyIE9TRi8xIHYzLjAKKysgbWFrZSBzdXJlIGdwcm9mIHdvcmtzIHRvZ2V0aGVyIHdpdGggT1NGLzEgdjMuMCdzIHByb2ZpbGluZyBsaWJyYXJpZXMKKysgaW1wbGVtZW50IHN5bXRhYl9wYXJzZSgpOyBtb2RpZnkgc3ltX2xvb2t1cCgpIHRvIGNvbnNpZGVyIGFkZHJfaGlnaAorKyBjaGFuZ2UgZ3Byb2YuYyB0byBjb2xsZWN0IGxpc3RzLCB0aGVuIGludm9rZSBzeW10YWJfcGFyc2UoKSBmb3IKKyAgZWFjaCBsaXN0CisrIFF1ZXN0aW9uczoKKwlvIGlzIC1jICgtLXN0YXRpYy1jYWxsLWdyYXBoKSB1c2VmdWwgYXQgYWxsPyAgaSBjYW4ndCBzZWUKKwkgIGhvdzsgaWYgaXQgd2VyZSBkZWxldGVkLCBncHJvZiB3b3VsZCBiZSBjb21wbGV0ZWx5IG1hY2hpbmUKKwkgIGluZGVwZW5kZW50ID0+IHl1cCwgaXQgaXMKKwlvIGFyZSAobG9uZykgb3B0aW9uIG5hbWVzIGFwcHJvcHJpYXRlPworCW8gLWsgKC0tZXhjbHVkZS1hcmMpIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRoIGdldG9wdCgpOworCSAgaXMgbmV3IHN5bnRheCAoLWsgZnJvbS90bykgYWNjZXB0YWJsZT8gIElmIG5vdCwgaG93IHRvCisJICBmaXggaXQ/CisJbyBpbiB0aGUgRlNGIG91dHB1dCwgdGhlIGNhbGwtZ3JhcGggaW5kZXggbm93IHByaW50cworCSAgdGhlIGZpbGVuYW1lIG9mIHN0YXRpYyBmdW5jdGlvbnMgaW4gcGFyZW50aGVzZXM7IGUuZy4sCisJICBzdGF0aWMgZnVuY3Rpb24gZm9vKCkgdGhhdCBpcyBkZWZpbmVkIGluIGZpbGUgYmFyLmMKKwkgIHdvdWxkIGJlIHByaW50ZWQgYXM6CisKKwkJCVs0XSBmb28gKGJhci5jKQorCisJICBpcyB0aGlzIGFjY2VwdGFibGU/ICBzaG91bGQgaXQgYmUgZG9uZSBvbmx5IG9wdGlvbmFsbHk/CisJbyBzeW1ib2xzIHdpdGggYWRkcmVzc2VzIHRoYXQgbWFwIGJhY2sgdG8gYSBkaWZmZXJlbnQKKwkgIG5hbWUgYXJlIHN1cHByZXNzZWQgKGhhcHBlbnMgd2l0aCBsYWJlbHMsIGZvciBleGFtcGxlKTsKKwkgIGlzIHRoaXMgYWNjZXB0YWJsZT8gIHNob3VsZCBpdCBiZSBkb25lIG9ubHkgb3B0aW9uYWxseT8KKysgZ2VuZXJhbGl6ZSB0byBhbGxvdyBhcmJpdHJhcnkgaGlzdG9ncmFtcyAobm90IGp1c3QgdGltZSBoaXN0b2dyYW1zKQorKyBiYXNpYy1ibG9jayBpbmZvcm1hdGlvbiBjdXJyZW50bHkgcmVwbGFjZXMgYWxsIHN5bWJvbHMgY3JlYXRlZCBmcm9tCisgIHRoZSBjb3JlIGJlY2F1c2Ugb2YgYW4gdWdseSBvcmRlcmluZyBjb25mbGljdC0tLWZvciBub3csIHRoZSBjdXJyZW50CisgIHNvbHV0aW9uIHdvcmtzLCBidXQgc29tZXRoaW5nIGNsZWFuZXIgaXMgZGVzaXJhYmxlID09PiBjbGVhbmVkIHVwLAorICBidXQgaXQncyBzbG93ZXIgbm93CisrIGNvbnZlcnQgdG8gdmVyeSBuZXcgZmlsZSBmb3JtYXQgKGJhY2sgdG8gdHJpdmlhbCBmb3JtYXQsIHRoYXQgaXMgOikKKysgcmVwbGFjZSAiZHVtbXkuaCIgZm9yIEFscGhhIChpZiB0aGVyZSBpcyBhbnkgdXNlIHRvIGl0KQorKyBhZGQgc3VwcG9ydCBmb3IgZXhlY3V0aW9uIHRpbWUgcHJvZmlsaW5nIGF0IGEgYmFzaWMtYmxvY2sgbGV2ZWwKKysgZml4IGZpbGVuYW1lLW9mZi1ieS1vbmUgYnVnIGZvciBBbHBoYSAoc2VlIH4vdG1wL2QuW2NoXSktLS1ubyBsb25nZXIKKyAgcmVsZXZhbnQKKysgIi1wZyAtYSIgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIGJlY2F1c2UgbWNsZWFudXAoKSB3aWxsIG92ZXJ3cml0ZQorICB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgX19iYl9leGl0X2Z1bmMoKSAob3IgdmljZSB2ZXJzYSkKKysgZmlyc3QgYmFzaWMtYmxvY2sgb2YgZmFjKCkgc2VlbXMgdG8gZ2V0IGNyZWRpdGVkIHRvIGxhc3QgYmFzaWMtYmxvY2sKKyAgb2YgcHJldmlvdXMgZnVuY3Rpb24gPT4gYnVnIGluIGJhc2ljX2Jsb2Nrcy5jCisrIGZsYXQgcHJvZmlsZSBzaG91bGQgcHJvdmlkZSBhdXRvbWF0aWMgc2NhbGluZyBmb3IgcGVyLWNhbGwgdGltZXMgYmVjYXVzZQorICBvdGhlcndpc2UgdGhleSdsbCBhbHdheXMgYmUgemVybyBvbiBhIGZhc3QgbWFjaGluZSB3aXRoIHRvbnMgb2Ygc21hbGwKKyAgZnVuY3Rpb25zCisrIG1ha2UgIi1hIiBpbXBseSB0byByZXRhaW4gbGluZSBudW1iZXIgaW5mbyAod2l0aG91dCBhY3R1YWxseSBnZW5lcmF0aW5nCisgIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKHVubGVzcyAtZyBpcyBzcGVjaWZpZWQpLS0tbm8sIHRoaXMgaXMgYQorICBiYWQgaWRlYSwgYmVjYXVzZSBpdCBpcyBub3QgY2xlYXIgd2hhdCBsZXZlbCBvZiBkZWJ1Z2dpbmcgaW5mbyBzaG91bGQKKyAgYmUgcmVxdWVzdGVkIChlLmcuLCAtZyB2cy4gLWczKTsgbGVhdmluZyBpdCB1cCB0byB0aGUgdXNlciBzZWVtcyBiZXN0CisrIGFkZCBsb25nIG9wdGlvbnMgc3VwcG9ydCAob3IgYXQgbGVhc3QgdXNlIGdldG9wdCBpbnN0ZWFkIG9mIGFkLWhvYworICBpbXBsZW1lbnRhdGlvbikKKysgc3BsaXQgaW50byBmaWxlcyBhY2NvcmRpbmcgdG8gYWJzdHJhY3Qgb2JqZWN0cyB0aGF0IGFyZSBtYW5pcHVsYXRlZAorKyByZXBsYWNlIHNjY3NpZCBieSByY3NpZCAmIGFkZCAiZW5kIG9mIC4uLiIgdG8gZXZlcnkgLmMgZmlsZQorKyB1c2UgREJHKCkgZXZlcnl3aGVyZQorKyBmaXggc3BhY2luZyAoIiAsIiAtPiAiLCIgZXRjLikKKysgdXNlIERFRlVOcyBldmVyeXdoZXJlCisrIG1ha2UgY29tcGlsZSBjbGVhbmx5IHdpdGggLVdhbGwKKysgImdjYyAtcGcgLU8yIiBkb2Vzbid0IHdvcmsgb24gdGVjYy5jIHVubGVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciBpcworICBzcGVjaWZpZWQ7IGZpbmQgb3V0IHdoeQorKyBtYWtlIHRoaW5ncyBwb3J0YWJsZSAocHJvdG90eXBlcywgY29uc3QsIGV0Yy4pCisrIGlmIE5FV19HTU9OX09VVCBpcyBub3QgZGVmaW5lZCwgaGF2ZSBhIGZsYWcgdGhhdCB3aWxsIGFsbG93IHRvCisgIHJlYWQgbmV3IGdtb24ub3V0IHN0eWxlIGZpbGVzLiAgVGhlIGlkZWEgYmVpbmcgdGhhdCBldmVyeW9uZQorICB3aWxsIHVzZSB0aGUgbmV3IGZvcm1hdCBmb3IgYmFzaWMtYmxvY2sgc3R5bGUgcHJvZmlsaW5nIGJ1dAorICB0aGUgb2xkIGZvcm1hdCBmb3IgcmVndWxhciBncHByb2ZpbGluZwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWNsb2NhbC5tNCBiL2dwcm9mL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyMDEyMgotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2FjbG9jYWwubTQKQEAgLTAsMCArMSwxMTA5IEBACitkbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAorCitkbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CitkbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCisjIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KKyMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgc2VyaWFsIDEKKworZG5sIFVzYWdlOgorZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKKworQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQorUEFDS0FHRT1bJDFdCitBQ19TVUJTVChQQUNLQUdFKQorVkVSU0lPTj1bJDJdCitBQ19TVUJTVChWRVJTSU9OKQorZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQorZmkKK2lmZWxzZShbJDNdLCwKK0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKK0FDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKK2RubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgorbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KKyMKKworQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAorICAgZmkKKyAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgZmkKKworICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCitkbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgorQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAorW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICQxPSQyCisgICBBQ19NU0dfUkVTVUxUKGZvdW5kKQorZWxzZQorICAgJDE9IiQzL21pc3NpbmcgJDIiCisgICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCitmaQorQUNfU1VCU1QoJDEpXSkKKworCisjIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKK0FDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKK1tBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKKworIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0CitBQ19DQUNIRV9TQVZFCisKKyMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCitDQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKK0xEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKK0RMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCiske0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCiskbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAorfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQorCisjIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCitBQ19DQUNIRV9MT0FECisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCisjIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAorIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KK2V4ZWMgNT4+Li9jb25maWcubG9nCitdKQorCitBQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAorW0FDX1BSRVJFUSgyLjEzKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCitBQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKK2RubAorCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgorbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKK3Rlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCit0ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgordGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICIkaG9zdCIgaW4KKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCisgICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CisKKyotKi1jeWd3aW4qKQorICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KKyAgOzsKKworZXNhYworCisjIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKKworQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCitbICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAorbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAorbmVlZF9sb2Nrcz15ZXMpCisKK2lmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KKyAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCitmaQorXSkKKworIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAorQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKKworIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAorW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKHNoYXJlZCwKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCitdKQorCisjIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKK0FDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAorW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKKworIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAorW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKHN0YXRpYywKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CitubykgZW5hYmxlX3N0YXRpYz1ubyA7OworKikKKyAgZW5hYmxlX3N0YXRpYz1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCitdKQorCisjIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKK0FDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAorW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKKworCisjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCisjIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KKyMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KKyMgICBgeWVzJy4KK0FDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCitbZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Oworbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyopCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjXSwKK2VuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAorXSkKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKK0FDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAorW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKKworCisjIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKK0FDX0RFRlVOKEFDX1BST0dfTEQsCitbQUNfQVJHX1dJVEgoZ251LWxkLAorWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCit0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorYWNfcHJvZz1sZAoraWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQorICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCisgIGNhc2UgIiRhY19wcm9nIiBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorY2hhbmdlcXVvdGUoLClkbmwKKyAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKK2NoYW5nZXF1b3RlKFssXSlkbmwKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZWxzZQorICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRhY19jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorQUNfU1VCU1QoTEQpCitBQ19QUk9HX0xEX0dOVQorXSkKKworQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KK2lmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ251X2xkPW5vCitmaV0pCitdKQorCisjIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKK0FDX0RFRlVOKEFDX1BST0dfTk0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgYWNfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKyAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisgICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisgICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgorCWJyZWFrCisgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCisJYnJlYWsKKyAgICAgIGVsc2UKKwlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCitmaV0pCitOTT0iJGFjX2N2X3BhdGhfTk0iCitBQ19NU0dfUkVTVUxUKFskTk1dKQorQUNfU1VCU1QoTk0pCitdKQorCisjIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAorIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCitBQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCitbIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQorCitjaGFuZ2VxdW90ZSgsKWRubAorIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorYWNfc3ltY29kZT0nW0JDREVHUlNUXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCithY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCithY19zeW14ZnJtPSdcMSBcMlwzIFwzJworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCithY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeCopCisgIGFjX3N5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyopCisgIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopCisgIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICA7OworaXJpeCopCisgIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgYWNfc3ltY29kZT0nW0JEVF0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgoraWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisgIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJworZmkKK2NoYW5nZXF1b3RlKFssXSlkbmwKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBhY19waXBlX3dvcmtzPW5vCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKKworICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgIAorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisKKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgorCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkYWNfbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitjaGFuZ2VxdW90ZSgsKWRubAorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9CitjaGFuZ2VxdW90ZShbLF0pZG5sCit7CitFT0YKKwlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKKwljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0CisJICBhY19zYXZlX0xJQlM9IiRMSUJTIgorCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisJICAgIGFjX3BpcGVfd29ya3M9eWVzCisJICBlbHNlCisJICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCisJICBmaQorCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQworICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICBlbHNlCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KKyAgICBmaQorICAgIGJyZWFrCisgIGVsc2UKKyAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKKworYWNfcmVzdWx0PXllcworaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgICBhY19yZXN1bHQ9bm8KK2ZpCitBQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCitdKQorCisjIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgorQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAorW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCitBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCitdKQorCisjIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/CitBQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCitbQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCitBQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCitBQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAorW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgordm9pZCBubV90ZXN0X2Z1bmMoKXt9CitpbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKK2lmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICBhY19ubGlzdD1jb25mdGVzdC5ubQorICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgIGVsc2UKKyAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQworICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCitmaQorcm0gLXJmIGNvbmZ0ZXN0KgorXSkKK0FDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKK1VTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KK0FDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKK10pCisKKyMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKK0FDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCitBQ19DSEVDS19MSUIobSwgY29zKQorXSkKKworIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKKyMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCisjIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgorIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCisjIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCisjICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCisjIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCitBQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCisgIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KKyAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7CisgICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKKyAgZXNhYworICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKK10pCisKKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCisjIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bworIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKKyMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAorIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAorIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90CisjIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcworIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgorIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCitBQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCisgIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCisgICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCisgICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OworICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcworICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKKyAgICBlc2FjCisgIF0pCisgIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KKyAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQorICBmaQorXSkKKworZG5sIG9sZCBuYW1lcworQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKK0FDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCitBQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAorQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAorQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAorQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAorQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAorQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKK0FDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCitBQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAorCisjIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCisKK0FDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCitbQUNfUFJFUkVRKFsyLjEyXSkKK0FDX0NPTkZJR19IRUFERVIoWyQxXSkKK2RubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgorZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKK2RubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KK0FDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKK2lmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKKzw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCis8PGFtX2luZHg9MQorZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbworICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCisgICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+CisgICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKKyAgICA7OworICBlc2FjCisgIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAorZG9uZTw8Pj5kbmw+PikKK2NoYW5nZXF1b3RlKFssXSkpXSkKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworQUNfREVGVU4oQ1lfV0lUSF9OTFMsCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKKyAgICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKKyAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICAgIEFDX1NVQlNUKFVTRV9OTFMpCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQorICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKwlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KKwlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKKwkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAorCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCisJICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKKwkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQorCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCisJCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKKwkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQorCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKwkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAorCQkgIFtDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCisJCSAgW0NBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliXSkKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCV0pCisKKwlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KKyAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KKworICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgorCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKKyAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorICAgICAgICBBQ19TVUJTVChNU0dGTVQpCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisJZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKwlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBBQ19NU0dfUkVTVUxUKAorCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKKyAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCisgICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKENBVEFMT0dTKQorICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKyAgICBBQ19TVUJTVChHTU9GSUxFUykKKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorICAgIEFDX1NVQlNUKElOVExERVBTKQorICAgIEFDX1NVQlNUKElOVExMSUJTKQorICAgIEFDX1NVQlNUKElOVExPQkpTKQorICAgIEFDX1NVQlNUKFBPRklMRVMpCisgICAgQUNfU1VCU1QoUE9TVUIpCisgIF0pCisKK0FDX0RFRlVOKENZX0dOVV9HRVRURVhULAorICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKworICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQorICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQorCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCisgICBmaQorCisgICBBTV9MQ19NRVNTQUdFUworICAgQ1lfV0lUSF9OTFMKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCisgICAgIGZpCisKKyAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCisgICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKKyAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKKworICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQorICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6CisgICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAorICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQorCisJIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcworICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCisJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCisgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKKyAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKKyAgIGRubCBwYWNrYWdlcy4KKyAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICBBQ19TVUJTVChHVF9OTykKKyAgIEFDX1NVQlNUKEdUX1lFUykKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKKworICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCisgICBsPQorICAgQUNfU1VCU1QobCkKKworICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKKyAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQorICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCisgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgXSkKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAorZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKK1sjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIFskM107IHRoZW4KKwlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAorZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCitpZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgorXSlkbmwKKyAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoWyRdJDEpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorQUNfU1VCU1QoJDEpZG5sCitdKQorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAorICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAorICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisJCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCisgICAgZmkKKyAgZmldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KKyMgRnJvbSBKaW0gTWV5ZXJpbmcKKworIyBzZXJpYWwgMQorCitBQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCisgIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKK1sgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQorICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQorICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICBBQ19TVUJTVChNQUlOVClkbmwKK10KKykKKworIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KKworQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCitbQUNfU1VCU1QoJDFfVFJVRSkKK0FDX1NVQlNUKCQxX0ZBTFNFKQoraWYgJDI7IHRoZW4KKyAgJDFfVFJVRT0KKyAgJDFfRkFMU0U9JyMnCitlbHNlCisgICQxX1RSVUU9JyMnCisgICQxX0ZBTFNFPQorZmldKQorCmRpZmYgLS1naXQgYS9ncHJvZi9hbHBoYS5jIGIvZ3Byb2YvYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDRmMjJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvYWxwaGEuYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5CisgKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCisgKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJworICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlICJncHJvZi5oIgorI2luY2x1ZGUgImNnX2FyY3MuaCIKKyNpbmNsdWRlICJjb3JlZmlsZS5oIgorI2luY2x1ZGUgImhpc3QuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworLyoKKyAqIE9wY29kZXMgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb25zOgorICovCisjZGVmaW5lIE9QX0p4eAkweDFhCisjZGVmaW5lCU9QX0JTUgkweDM0CisKKyNkZWZpbmUgSnh4X0ZVTkNfSk1QCQkwCisjZGVmaW5lIEp4eF9GVU5DX0pTUgkJMQorI2RlZmluZSBKeHhfRlVOQ19SRVQJCTIKKyNkZWZpbmUgSnh4X0ZVTkNfSlNSX0NPUk9VVElORQkzCisKK3R5cGVkZWYgdW5pb24KKyAgeworICAgIHN0cnVjdAorICAgICAgeworCXVuc2lnbmVkIG90aGVyOjI2OworCXVuc2lnbmVkIG9wX2NvZGU6NjsKKyAgICAgIH0KKyAgICBhOwkJCQkvKiBhbnkgZm9ybWF0ICovCisgICAgc3RydWN0CisgICAgICB7CisJaW50IGRpc3A6MjE7CisJdW5zaWduZWQgcmE6NTsKKwl1bnNpZ25lZCBvcF9jb2RlOjY7CisgICAgICB9CisgICAgYjsJCQkJLyogYnJhbmNoIGZvcm1hdCAqLworICAgIHN0cnVjdAorICAgICAgeworCWludCBoaW50OjE0OworCXVuc2lnbmVkIGZ1bmM6MjsKKwl1bnNpZ25lZCByYjo1OworCXVuc2lnbmVkIHJhOjU7CisJdW5zaWduZWQgb3BfY29kZTo2OworICAgICAgfQorICAgIGo7CQkJCS8qIGp1bXAgZm9ybWF0ICovCisgIH0KK2FscGhhX0luc3RydWN0aW9uOworCitzdGF0aWMgU3ltIGluZGlyZWN0X2NoaWxkOworCisKKy8qCisgKiBPbiB0aGUgQWxwaGEgd2UgY2FuIG9ubHkgZGV0ZWN0IFBDIHJlbGF0aXZlIGNhbGxzLCB3aGljaCBhcmUKKyAqIHVzdWFsbHkgZ2VuZXJhdGVkIGZvciBjYWxscyB0byBmdW5jdGlvbnMgd2l0aGluIHRoZSBzYW1lCisgKiBvYmplY3QgZmlsZSBvbmx5LiAgVGhpcyBpcyBzdGlsbCBiZXR0ZXIgdGhhbiBub3RoaW5nLCBob3dldmVyLgorICogKEluIHBhcnRpY3VsYXIgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGZpbmQgZnVuY3Rpb25zIHRoYXQKKyAqICBwb3RlbnRpYWxseSBjYWxsIGludGVnZXIgZGl2aXNpb24gcm91dGluZXMsIGZvciBleGFtcGxlLikKKyAqLwordm9pZAorYWxwaGFfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKQorICAgICBTeW0gKnBhcmVudDsKKyAgICAgYmZkX3ZtYSBwX2xvd3BjOworICAgICBiZmRfdm1hIHBfaGlnaHBjOworeworICBzdGF0aWMgYmZkX3ZtYSBkZWx0YSA9IDA7CisgIGJmZF92bWEgZGVzdF9wYzsKKyAgYWxwaGFfSW5zdHJ1Y3Rpb24gKnBjOworICBTeW0gKmNoaWxkOworCisgIGlmICghZGVsdGEpCisgICAgeworICAgICAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKKworICAgICAgc3ltX2luaXQgKCZpbmRpcmVjdF9jaGlsZCk7CisgICAgICBpbmRpcmVjdF9jaGlsZC5uYW1lID0gXygiPGluZGlyZWN0IGNoaWxkPiIpOworICAgICAgaW5kaXJlY3RfY2hpbGQuY2cucHJvcC5mcmFjdCA9IDEuMDsKKyAgICAgIGluZGlyZWN0X2NoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0X2NoaWxkOworICAgIH0KKworICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCisgICAgeworICAgICAgcF9sb3dwYyA9IHNfbG93cGM7CisgICAgfQorICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKKyAgICB7CisgICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOworICAgIH0KKyAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iKSwKKwkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOworICBmb3IgKHBjID0gKGFscGhhX0luc3RydWN0aW9uICopIChwX2xvd3BjICsgZGVsdGEpOworICAgICAgIHBjIDwgKGFscGhhX0luc3RydWN0aW9uICopIChwX2hpZ2hwYyArIGRlbHRhKTsKKyAgICAgICArK3BjKQorICAgIHsKKyAgICAgIHN3aXRjaCAocGMtPmEub3BfY29kZSkKKwl7CisJY2FzZSBPUF9KeHg6CisJICAvKgorCSAgICogVGhlcmUgaXMgbm8gc2ltcGxlIGFuZCByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQorCSAgICogdGFyZ2V0IG9mIGEganNyICh0aGUgaGludCBiaXRzIGhlbHAsIGJ1dCB0aGVyZSBhcmVuJ3QKKwkgICAqIGVub3VnaCBiaXRzIHRvIGdldCBhIHNhdGlzZmFjdG9yeSBoaXQgcmF0ZSkuICBJbnN0ZWFkLAorCSAgICogZm9yIGFueSBpbmRpcmVjdCBqdW1wIHdlIHNpbXBseSBhZGQgYW4gYXJjIGZyb20gUEFSRU5UCisJICAgKiB0byBJTkRJUkVDVF9DSElMRC0tLXRoYXQgd2F5IHRoZSB1c2VyIGl0IGF0IGxlYXN0IGFibGUKKwkgICAqIHRvIHNlZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBjYWxscyBhcyB3ZWxsLgorCSAgICovCisJICBpZiAocGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1IKKwkgICAgICB8fCBwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUl9DT1JPVVRJTkUpCisJICAgIHsKKwkgICAgICBEQkcgKENBTExERUJVRywKKwkJICAgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIiksCisJCQkgICAoYmZkX3ZtYSkgcGMgLSBkZWx0YSwKKwkJCSAgIHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSID8gIiIgOiAiX2Nvcm91dGluZSIpKTsKKwkgICAgICBhcmNfYWRkIChwYXJlbnQsICZpbmRpcmVjdF9jaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgT1BfQlNSOgorCSAgREJHIChDQUxMREVCVUcsCisJICAgICAgIHByaW50ZiAoXygiW2ZpbmRfY2FsbF0gMHglbHg6IGJzciIpLCAoYmZkX3ZtYSkgcGMgLSBkZWx0YSkpOworCSAgLyoKKwkgICAqIFJlZ3VsYXIgUEMgcmVsYXRpdmUgYWRkcmVzc2luZy4gIENoZWNrIHRoYXQgdGhpcyBpcyB0aGUKKwkgICAqIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gIFRoZSBsaW5rZXIgc29tZXRpbWVzIHJlZGlyZWN0cworCSAgICogdGhlIGVudHJ5IHBvaW50IGJ5IDggYnl0ZXMgdG8gc2tpcCBsb2FkaW5nIHRoZSBnbG9iYWwKKwkgICAqIHBvaW50ZXIsIHNvIHdlIGFsbCBmb3IgZWl0aGVyIGFkZHJlc3M6CisJICAgKi8KKwkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChwYyArIDEgKyBwYy0+Yi5kaXNwKSkgLSBkZWx0YTsKKwkgIGlmIChkZXN0X3BjID49IHNfbG93cGMgJiYgZGVzdF9wYyA8PSBzX2hpZ2hwYykKKwkgICAgeworCSAgICAgIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZGVzdF9wYyk7CisJICAgICAgREJHIChDQUxMREVCVUcsCisJCSAgIHByaW50ZiAoIiAweCVseFx0OyBuYW1lPSVzLCBhZGRyPTB4JWx4IiwKKwkJCSAgIGRlc3RfcGMsIGNoaWxkLT5uYW1lLCBjaGlsZC0+YWRkcikpOworCSAgICAgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0X3BjIHx8IGNoaWxkLT5hZGRyID09IGRlc3RfcGMgLSA4KQorCQl7CisJCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlxuIikpOworCQkgIC8qIGEgaGl0OiAgKi8KKwkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgfQorCSAgLyoKKwkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KKwkgICAqLworCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5jIGIvZ3Byb2YvYmFzaWNfYmxvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiNmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5jCkBAIC0wLDAgKzEsNjM1IEBACisvKgorICogQmFzaWMtYmxvY2sgbGV2ZWwgcmVsYXRlZCBjb2RlOiByZWFkaW5nL3dyaXRpbmcgb2YgYmFzaWMtYmxvY2sgaW5mbworICogdG8vZnJvbSBnbW9uLm91dDsgY29tcHV0aW5nIGFuZCBmb3JtYXR0aW5nIG9mIGJhc2ljLWJsb2NrIHJlbGF0ZWQKKyAqIHN0YXRpc3RpY3MuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImJhc2ljX2Jsb2Nrcy5oIgorI2luY2x1ZGUgImNvcmVmaWxlLmgiCisjaW5jbHVkZSAiZ21vbl9pby5oIgorI2luY2x1ZGUgImdtb25fb3V0LmgiCisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJzb3VyY2UuaCIKKyNpbmNsdWRlICJzeW1faWRzLmgiCisKKworLyoKKyAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKKyAqLworYm9vbCBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgPSBGQUxTRTsKK3Vuc2lnbmVkIGxvbmcgYmJfbWluX2NhbGxzID0gMTsKK2ludCBiYl90YWJsZV9sZW5ndGggPSAxMDsKKworLyoKKyAqIFZhcmlhYmxlcyB1c2VkIHRvIGNvbXB1dGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIHN0YXRzOgorICovCitzdGF0aWMgbG9uZyBudW1fZXhlY3V0YWJsZV9saW5lczsKK3N0YXRpYyBsb25nIG51bV9saW5lc19leGVjdXRlZDsKKworCisvKgorICogSGVscGVyIGZvciBzb3J0aW5nLiAgQ29tcGFyZXMgdHdvIHN5bWJvbHMgYW5kIHJldHVybnMgcmVzdWx0CisgKiBzdWNoIHRoYXQgc29ydGluZyB3aWxsIGJlIGluY3JlYXNpbmcgYWNjb3JkaW5nIHRvIGZpbGVuYW1lLCBsaW5lCisgKiBudW1iZXIsIGFuZCBhZGRyZXNzIChpbiB0aGF0IG9yZGVyKS4KKyAqLworCitzdGF0aWMgaW50CitERUZVTiAoY21wX2JiLCAobHAsIHJwKSwgY29uc3Qgdm9pZCAqbHAgQU5EIGNvbnN0IHZvaWQgKnJwKQoreworICBpbnQgcjsKKyAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOworICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOworCisgIGlmIChsZWZ0LT5maWxlICYmIHJpZ2h0LT5maWxlKQorICAgIHsKKyAgICAgIHIgPSBzdHJjbXAgKGxlZnQtPmZpbGUtPm5hbWUsIHJpZ2h0LT5maWxlLT5uYW1lKTsKKyAgICAgIGlmIChyKQorCXsKKwkgIHJldHVybiByOworCX0KKworICAgICAgaWYgKGxlZnQtPmxpbmVfbnVtICE9IHJpZ2h0LT5saW5lX251bSkKKwl7CisJICByZXR1cm4gbGVmdC0+bGluZV9udW0gLSByaWdodC0+bGluZV9udW07CisJfQorICAgIH0KKworICBpZiAobGVmdC0+YWRkciA8IHJpZ2h0LT5hZGRyKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGVsc2UgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKKyAgICB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKworLyoKKyAqIEhlbHBlciBmb3Igc29ydGluZy4gIE9yZGVyIGJhc2ljIGJsb2NrcyBpbiBkZWNyZWFzaW5nIG51bWJlciBvZgorICogY2FsbHMsIHRpZXMgYXJlIGJyb2tlbiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGxpbmUgbnVtYmVycy4KKyAqLworc3RhdGljIGludAorREVGVU4gKGNtcF9uY2FsbHMsIChscCwgcnApLCBjb25zdCB2b2lkICpscCBBTkQgY29uc3Qgdm9pZCAqcnApCit7CisgIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKKyAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKKworICBpZiAoIWxlZnQpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlIGlmICghcmlnaHQpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobGVmdC0+bmNhbGxzIDwgcmlnaHQtPm5jYWxscykKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAobGVmdC0+bmNhbGxzID4gcmlnaHQtPm5jYWxscykKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIGxlZnQtPmxpbmVfbnVtIC0gcmlnaHQtPmxpbmVfbnVtOworfQorCisKKy8qCisgKiBTa2lwIG92ZXIgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChmc2tpcF9zdHJpbmcsIChmcCksIEZJTEUgKiBmcCkKK3sKKyAgaW50IGNoOworCisgIHdoaWxlICgoY2ggPSBmZ2V0YyAoZnApKSAhPSBFT0YpCisgICAgeworICAgICAgaWYgKGNoID09ICdcMCcpCisJeworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworCisvKgorICogUmVhZCBhIGJhc2ljLWJsb2NrIHJlY29yZCBmcm9tIGZpbGUgSUZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUKKyAqIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgorICovCit2b2lkCitERUZVTiAoYmJfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGludCBuYmxvY2tzLCBiOworICBiZmRfdm1hIGFkZHI7CisgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOworICBTeW0gKnN5bTsKKworICBpZiAoZnJlYWQgKCZuYmxvY2tzLCBzaXplb2YgKG5ibG9ja3MpLCAxLCBpZnApICE9IDEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLCB3aG9hbWksIGZpbGVuYW1lKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKworICBuYmxvY2tzID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIG5ibG9ja3MpOworICBpZiAoZ21vbl9maWxlX3ZlcnNpb24gPT0gMCkKKyAgICB7CisgICAgICBmc2tpcF9zdHJpbmcgKGlmcCk7CisgICAgfQorCisgIGZvciAoYiA9IDA7IGIgPCBuYmxvY2tzOyArK2IpCisgICAgeworICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uID09IDApCisJeworCSAgaW50IGxpbmVfbnVtOworCSAgLyoKKwkgICAqIFZlcnNpb24gMCBoYWQgbG90cyBvZiBleHRyYSBzdHVmZiB0aGF0IHdlIGRvbid0CisJICAgKiBjYXJlIGFib3V0IGFueW1vcmUuCisJICAgKi8KKwkgIGlmICgoZnJlYWQgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgaWZwKSAhPSAxKQorCSAgICAgIHx8IChmcmVhZCAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIGlmcCkgIT0gMSkKKwkgICAgICB8fCAoZnNraXBfc3RyaW5nIChpZnApLCBGQUxTRSkKKwkgICAgICB8fCAoZnNraXBfc3RyaW5nIChpZnApLCBGQUxTRSkKKwkgICAgICB8fCAoZnJlYWQgKCZsaW5lX251bSwgc2l6ZW9mIChsaW5lX251bSksIDEsIGlmcCkgIT0gMSkpCisJICAgIHsKKwkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgICAgICBkb25lICgxKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZnJlYWQgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBpZnApICE9IDEKKwkgICAgICB8fCBmcmVhZCAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBpZnApICE9IDEpCisJICAgIHsKKwkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgICAgICBkb25lICgxKTsKKwkgICAgfQorCX0KKworICAgICAgLyoKKyAgICAgICAqIEJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYXJlIG1lYW5pbmdmdWwgb25seSBpZiB3ZSdyZQorICAgICAgICogcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWJ5LWxpbmUgbGV2ZWw6CisgICAgICAgKi8KKyAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5KQorCXsKKworCSAgLyogY29udmVydCBmcm9tIHRhcmdldCB0byBob3N0IGVuZGlhbm5lc3M6ICovCisKKwkgIGFkZHIgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICYgYWRkcik7CisJICBuY2FsbHMgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZuY2FsbHMpOworCisJICBzeW0gPSBzeW1fbG9va3VwICgmc3ltdGFiLCBhZGRyKTsKKworCSAgaWYgKHN5bSkKKwkgICAgeworCSAgICAgIGludCBpOworCisJICAgICAgREJHIChCQkRFQlVHLAorCQkgICBwcmludGYgKCJbYmJfcmVhZF9yZWNdIDB4JWx4LT4weCVseCAoJXM6JWQpIGNudD0lbHVcbiIsCisJCQkgICBhZGRyLCBzeW0tPmFkZHIsIHN5bS0+bmFtZSwgc3ltLT5saW5lX251bSwgbmNhbGxzKSk7CisKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUzsgaSsrKQorCQl7CisJCSAgaWYgKCEgc3ltLT5iYl9hZGRyW2ldIHx8IHN5bS0+YmJfYWRkcltpXSA9PSBhZGRyKQorCQkgICAgeworCQkgICAgICBzeW0tPmJiX2FkZHJbaV0gPSBhZGRyOworCQkgICAgICBzeW0tPmJiX2NhbGxzW2ldICs9IG5jYWxsczsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdGF0aWMgYm9vbCB1c2VyX3dhcm5lZCA9IEZBTFNFOworCisJICBpZiAoIXVzZXJfd2FybmVkKQorCSAgICB7CisJICAgICAgdXNlcl93YXJuZWQgPSBUUlVFOworCSAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIF8oIiVzOiB3YXJuaW5nOiBpZ25vcmluZyBiYXNpYy1ibG9jayBleGVjIGNvdW50cyAodXNlIC1sIG9yIC0tbGluZSlcbiIpLAorCQkgICAgICAgd2hvYW1pKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybjsKK30KKworCisvKgorICogV3JpdGUgYWxsIGJhc2ljLWJsb2NrcyB3aXRoIG5vbi16ZXJvIGNvdW50cyB0byBmaWxlIE9GUC4gIEZJTEVOQU1FCisgKiBpcyB0aGUgbmFtZSBvZiBPRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBwcm9kdWNpbmcgZXJyb3ItbWVzc2FnZXMKKyAqIG9ubHkuCisgKi8KK3ZvaWQKK0RFRlVOIChiYl93cml0ZV9ibG9ja3MsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFnID0gR01PTl9UQUdfQkJfQ09VTlQ7CisgIGludCBuYmxvY2tzID0gMDsKKyAgYmZkX3ZtYSBhZGRyOworICB1bnNpZ25lZCBsb25nIG5jYWxsczsKKyAgU3ltICpzeW07CisgIGludCBpOworCisgIC8qIGNvdW50IGhvdyBtYW55IG5vbi16ZXJvIGJsb2NrcyB3aXRoIGhhdmU6ICovCisKKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbaV07IGkrKykKKwk7CisgICAgICBuYmxvY2tzICs9IGk7CisgICAgfQorCisgIC8qIHdyaXRlIGhlYWRlcjogKi8KKyAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIG5ibG9ja3MsIChiZmRfYnl0ZSAqKSAmIG5ibG9ja3MpOworICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQorICAgICAgfHwgZndyaXRlICgmbmJsb2Nrcywgc2l6ZW9mIChuYmxvY2tzKSwgMSwgb2ZwKSAhPSAxKQorICAgIHsKKyAgICAgIHBlcnJvciAoZmlsZW5hbWUpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIC8qIHdyaXRlIGNvdW50czogKi8KKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbaV07IGkrKykKKwl7CisJICBwdXRfdm1hIChjb3JlX2JmZCwgc3ltLT5iYl9hZGRyW2ldLCAoYmZkX2J5dGUgKikgJiBhZGRyKTsKKwkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBzeW0tPmJiX2NhbGxzW2ldLCAoYmZkX2J5dGUgKikgJiBuY2FsbHMpOworCisJICBpZiAoZndyaXRlICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgb2ZwKSAhPSAxCisJICAgICAgfHwgZndyaXRlICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIG9mcCkgIT0gMSkKKwkgICAgeworCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOworCSAgICAgIGRvbmUgKDEpOworCSAgICB9CisJfQorICAgIH0KK30KKworCisvKgorICogT3V0cHV0IGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MgaW4gYSBmb3JtYXQgdGhhdCBpcyBlYXNpbHkgcGFyc2VhYmxlLgorICogQ3VycmVudCB0aGUgZm9ybWF0IGlzOgorICoKKyAqICAgICAgPGZpbGVuYW1lPjo8bGluZS1udW1iZXI+OiAoPGZ1bmN0aW9uLW5hbWU+OjxiYi1hZGRyKTogPG5jYWxscz4KKyAqLwordm9pZAorREVGVU5fVk9JRCAocHJpbnRfZXhlY19jb3VudHMpCit7CisgIFN5bSAqKnNvcnRlZF9iYnMsICpzeW07CisgIGludCBpLCBqLCBsZW47CisKKyAgaWYgKGZpcnN0X291dHB1dCkKKyAgICB7CisgICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCJcZlxuIik7CisgICAgfQorCisgIC8qIHNvcnQgYmFzaWMtYmxvY2tzIGFjY29yZGluZyB0byBmdW5jdGlvbiBuYW1lIGFuZCBsaW5lIG51bWJlcjogKi8KKworICBzb3J0ZWRfYmJzID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoc29ydGVkX2Jic1swXSkpOworICBsZW4gPSAwOworICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBBY2NlcHQgc3ltYm9sIGlmIGl0J3MgaW4gdGhlIElOQ0xfRVhFQyB0YWJsZQorICAgICAgICogb3IgdGhlcmUgaXMgbm8gSU5DTF9FWEVDIHRhYmxlCisgICAgICAgKiAgICBhbmQgaXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBFWENMX0VYRUMgdGFibGUuCisgICAgICAgKi8KKyAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0VYRUNdLCBzeW0tPmFkZHIpCisJICB8fCAoc3ltc1tJTkNMX0VYRUNdLmxlbiA9PSAwCisJICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRVhFQ10sIHN5bS0+YWRkcikpKQorCXsKKwkgIHNvcnRlZF9iYnNbbGVuKytdID0gc3ltOworCX0KKyAgICB9CisgIHFzb3J0IChzb3J0ZWRfYmJzLCBsZW4sIHNpemVvZiAoc29ydGVkX2Jic1swXSksIGNtcF9iYik7CisKKyAgLyogb3V0cHV0IGJhc2ljLWJsb2NrczogKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgeworICAgICAgaWYgKHN5bS0+bmNhbGxzID4gMCB8fCAhIGlnbm9yZV96ZXJvcykKKwl7CisJICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKKwkJICBzeW0tPmZpbGUgPyBzeW0tPmZpbGUtPm5hbWUgOiBfKCI8dW5rbm93bj4iKSwgc3ltLT5saW5lX251bSwKKwkJICBzeW0tPm5hbWUsIHN5bS0+YWRkciwgc3ltLT5uY2FsbHMpOworCX0KKyAgICAgIGZvciAoaiA9IDA7IGogPCBOQkJTICYmIHN5bS0+YmJfYWRkcltqXTsgaiArKykKKwl7CisJICBpZiAoc3ltLT5iYl9jYWxsc1tqXSA+IDAgfHwgISBpZ25vcmVfemVyb3MpCisJICAgIHsKKwkgICAgICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKKwkJICAgICAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCisJCSAgICAgIHN5bS0+bmFtZSwgc3ltLT5iYl9hZGRyW2pdLCBzeW0tPmJiX2NhbGxzW2pdKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGZyZWUgKHNvcnRlZF9iYnMpOworfQorCisvKgorICogSGVscGVyIGZvciBiYl9hbm5vdGF0ZWRfc291cmNlOiBmb3JtYXQgYW5ub3RhdGlvbiBjb250YWluaW5nCisgKiBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zLiAgRGVwZW5kcyBvbiBiZWluZyBjYWxsZWQgb24gZWFjaAorICogbGluZSBvZiBhIGZpbGUgaW4gc2VxdWVudGlhbCBvcmRlci4KKyAqCisgKiBHbG9iYWwgdmFyaWFibGUgYmJfYW5ub3RhdGVfYWxsX2xpbmVzIGVuYWJsZXMgZXhlY3V0aW9uIGNvdW50CisgKiBjb21wcmVzc2lvbiAoY291bnRzIGFyZSBzdXByZXNzZWQgaWYgaWRlbnRpY2FsIHRvIHRoZSBsYXN0IG9uZSkKKyAqIGFuZCBwcmludHMgY291bnRzIG9uIGFsbCBleGVjdXRlZCBsaW5lcy4gIE90aGVyd2lzZSwgcHJpbnQKKyAqIGFsbCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGV4YWN0bHkgb25jZSBvbiB0aGUgbGluZQorICogdGhhdCBzdGFydHMgdGhlIGJhc2ljLWJsb2NrLgorICovCisKK3N0YXRpYyB2b2lkCitERUZVTiAoYW5ub3RhdGVfd2l0aF9jb3VudCwgKGJ1Ziwgd2lkdGgsIGxpbmVfbnVtLCBhcmcpLAorICAgICAgIGNoYXIgKmJ1ZiBBTkQgaW50IHdpZHRoIEFORCBpbnQgbGluZV9udW0gQU5EIHZvaWQgKmFyZykKK3sKKyAgU291cmNlX0ZpbGUgKnNmID0gYXJnOworICBTeW0gKmI7CisgIGludCBpOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2NvdW50OworICB1bnNpZ25lZCBsb25nIGxhc3RfcHJpbnQgPSAodW5zaWduZWQgbG9uZykgLTE7CisKKyAgYiA9IE5VTEw7CisgIGlmIChsaW5lX251bSA8PSBzZi0+bnVtX2xpbmVzKQorICAgIHsKKyAgICAgIGIgPSBzZi0+bGluZVtsaW5lX251bSAtIDFdOworICAgIH0KKyAgaWYgKCFiKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCWJ1ZltpXSA9ICcgJzsKKyAgICAgIGJ1Zlt3aWR0aF0gPSAnXDAnOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgdG1wYnVmW05CQlMgKiAzMF07CisgICAgICBjaGFyICpwOworICAgICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7CisgICAgICBpbnQgbmNhbGxzX3NldDsKKyAgICAgIGludCBsZW47CisKKyAgICAgICsrbnVtX2V4ZWN1dGFibGVfbGluZXM7CisKKyAgICAgIHAgPSB0bXBidWY7CisgICAgICAqcCA9ICdcMCc7CisKKyAgICAgIG5jYWxscyA9IDA7CisgICAgICBuY2FsbHNfc2V0ID0gMDsKKworICAgICAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LCBsYWJlbCB0aGUgbGluZSBubyBtYXR0ZXIgd2hhdC4KKyAgICAgICAqIE90aGVyd2lzZSwgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uLCBzbyBjaGVjayB0byBzZWUKKyAgICAgICAqIGlmIHRoZSBmaXJzdCBiYXNpYy1ibG9jayBhZGRyZXNzIGlzIGxhcmdlciB0aGFuIHRoZSBzdGFydGluZworICAgICAgICogYWRkcmVzcyBvZiB0aGUgbGluZS4gIElmIHNvLCB0aGVuIHRoaXMgbGluZSBiZWdpbnMgd2l0aCBhCisgICAgICAgKiBhIHBvcnRpb24gb2YgdGhlIHByZXZpb3VzIGJhc2ljLWJsb2NrLCBzbyBwcmludCB0aGF0IHByaW9yCisgICAgICAgKiBleGVjdXRpb24gY291bnQgKGlmIGJiX2Fubm90YXRlX2FsbF9saW5lcyBpcyBzZXQpLgorICAgICAgICovCisKKyAgICAgIGlmIChiLT5pc19mdW5jKQorCXsKKwkgIHNwcmludGYgKHAsICIlbHUiLCBiLT5uY2FsbHMpOworCSAgcCArPSBzdHJsZW4gKHApOworCSAgbGFzdF9jb3VudCA9IGItPm5jYWxsczsKKwkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OworCSAgbmNhbGxzID0gYi0+bmNhbGxzOworCSAgbmNhbGxzX3NldCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzCisJICAgICAgICYmIGItPmJiX2FkZHJbMF0gJiYgYi0+YmJfYWRkclswXSA+IGItPmFkZHIpCisJeworCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOworCSAgcCArPSBzdHJsZW4gKHApOworCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7CisJICBuY2FsbHMgPSBsYXN0X2NvdW50OworCSAgbmNhbGxzX3NldCA9IDE7CisJfQorCisgICAgICAvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoaXMgbGluZSdzIGJhc2ljLWJsb2Nrcy4gIEZvciBlYWNoIG9uZSwKKyAgICAgICAqIHVwZGF0ZSBsYXN0X2NvdW50LCB0aGVuIGNvbXByZXNzIHNlcXVlbnRpYWwgaWRlbnRpY2FsIGNvdW50cworICAgICAgICogKGlmIGJiX2Fubm90YXRlX2FsbF9saW5lcykgYW5kIHByaW50IHRoZSBleGVjdXRpb24gY291bnQuCisgICAgICAgKi8KKworICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgYi0+YmJfYWRkcltpXTsgaSsrKQorCXsKKwkgIGxhc3RfY291bnQgPSBiLT5iYl9jYWxsc1tpXTsKKwkgIGlmICghIG5jYWxsc19zZXQpCisJICAgIHsKKwkgICAgICBuY2FsbHMgPSAwOworCSAgICAgIG5jYWxsc19zZXQgPSAxOworCSAgICB9CisJICBuY2FsbHMgKz0gbGFzdF9jb3VudDsKKworCSAgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcyAmJiBsYXN0X2NvdW50ID09IGxhc3RfcHJpbnQpCisJICAgIHsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBpZiAocCA+IHRtcGJ1ZikKKwkgICAgKnArKyA9ICcsJzsKKwkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKKwkgIHAgKz0gc3RybGVuIChwKTsKKworCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7CisJfQorCisgICAgICAvKiBXZSdyZSBkb25lLiAgSWYgbm90aGluZyBoYXMgYmVlbiBwcmludGVkIG9uIHRoaXMgbGluZSwKKyAgICAgICAqIHByaW50IHRoZSBsYXN0IGV4ZWN1dGlvbiBjb3VudCAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzKSwKKyAgICAgICAqIHdoaWNoIGNvdWxkIGJlIGZyb20gZWl0aGVyIGEgcHJldmlvdXMgbGluZSAoaWYgdGhlcmUgd2VyZQorICAgICAgICogbm8gQkJzIG9uIHRoaXMgbGluZSksIG9yIGZyb20gdGhpcyBsaW5lIChpZiBhbGwgb3VyIEJCCisgICAgICAgKiBjb3VudHMgd2VyZSBjb21wcmVzc2VkIG91dCBiZWNhdXNlIHRoZXkgd2VyZSBpZGVudGljYWwpLgorICAgICAgICovCisKKyAgICAgIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMgJiYgcCA9PSB0bXBidWYpCisJeworCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOworCSAgcCArPSBzdHJsZW4gKHApOworCSAgbmNhbGxzID0gbGFzdF9jb3VudDsKKwkgIG5jYWxsc19zZXQgPSAxOworCX0KKworICAgICAgaWYgKCEgbmNhbGxzX3NldCkKKwl7CisJICBpbnQgYzsKKworCSAgZm9yIChjID0gMDsgYyA8IHdpZHRoOyBjKyspCisJICAgIGJ1ZltjXSA9ICcgJzsKKwkgIGJ1Zlt3aWR0aF0gPSAnXDAnOworCSAgcmV0dXJuOworCX0KKworICAgICAgKytudW1fbGluZXNfZXhlY3V0ZWQ7CisKKyAgICAgIGlmIChuY2FsbHMgPCBiYl9taW5fY2FsbHMpCisJeworCSAgc3RyY3B5ICh0bXBidWYsICIjIyMjIyIpOworCSAgcCA9IHRtcGJ1ZiArIDU7CisJfQorCisgICAgICBzdHJjcHkgKHAsICIgLT4gIik7CisgICAgICBwICs9IDQ7CisKKyAgICAgIGxlbiA9IHAgLSB0bXBidWY7CisgICAgICBpZiAobGVuID49IHdpZHRoKQorCXsKKwkgIHN0cm5jcHkgKGJ1ZiwgdG1wYnVmLCB3aWR0aCk7CisJICBidWZbd2lkdGhdID0gJ1wwJzsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IGM7CisKKwkgIHN0cmNweSAoYnVmICsgd2lkdGggLSBsZW4sIHRtcGJ1Zik7CisJICBmb3IgKGMgPSAwOyBjIDwgd2lkdGggLSBsZW47ICsrYykKKwkgICAgYnVmW2NdID0gJyAnOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBBbm5vdGF0ZSB0aGUgZmlsZXMgbmFtZWQgaW4gU09VUkNFX0ZJTEVTIHdpdGggYmFzaWMtYmxvY2sgc3RhdGlzdGljcworICogKGV4ZWN1dGlvbiBjb3VudHMpLiAgQWZ0ZXIgZWFjaCBzb3VyY2UgZmlsZXMsIGEgZmV3IHN0YXRpc3RpY3MKKyAqIHJlZ2FyZGluZyB0aGF0IHNvdXJjZSBmaWxlIGFyZSBwcmludGVkLgorICovCit2b2lkCitERUZVTl9WT0lEIChwcmludF9hbm5vdGF0ZWRfc291cmNlKQoreworICBTeW0gKnN5bSwgKmxpbmVfc3RhdHMsICpuZXdfbGluZTsKKyAgU291cmNlX0ZpbGUgKnNmOworICBpbnQgaSwgdGFibGVfbGVuOworICBGSUxFICpvZnA7CisKKyAgLyoKKyAgICogRmluZCBtYXhpbXVtIGxpbmUgbnVtYmVyIGZvciBlYWNoIHNvdXJjZSBmaWxlIHRoYXQgdXNlciBpcworICAgKiBpbnRlcmVzdGVkIGluOgorICAgKi8KKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICAvKgorICAgICAgICogQWNjZXB0IHN5bWJvbCBpZiBpdCdzIGZpbGUgaXMga25vd24sIGl0cyBsaW5lIG51bWJlciBpcworICAgICAgICogYmlnZ2VyIHRoYW4gYW55dGhpbmcgd2UgaGF2ZSBzZWVuIGZvciB0aGF0IGZpbGUgc28gZmFyIGFuZAorICAgICAgICogaWYgaXQncyBpbiB0aGUgSU5DTF9BTk5PIHRhYmxlIG9yIHRoZXJlIGlzIG5vIElOQ0xfQU5OTworICAgICAgICogdGFibGUgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgRVhDTF9BTk5PIHRhYmxlLgorICAgICAgICovCisgICAgICBpZiAoc3ltLT5maWxlICYmIHN5bS0+bGluZV9udW0gPiBzeW0tPmZpbGUtPm51bV9saW5lcworCSAgJiYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfQU5OT10sIHN5bS0+YWRkcikKKwkgICAgICB8fCAoc3ltc1tJTkNMX0FOTk9dLmxlbiA9PSAwCisJCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfQU5OT10sIHN5bS0+YWRkcikpKSkKKwl7CisJICBzeW0tPmZpbGUtPm51bV9saW5lcyA9IHN5bS0+bGluZV9udW07CisJfQorICAgIH0KKworICAvKiBhbGxvY2F0ZSBsaW5lIGRlc2NyaXB0b3JzOiAqLworCisgIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCisgICAgeworICAgICAgaWYgKHNmLT5udW1fbGluZXMgPiAwKQorCXsKKwkgIHNmLT5saW5lID0gKHZvaWQgKikgeG1hbGxvYyAoc2YtPm51bV9saW5lcyAqIHNpemVvZiAoc2YtPmxpbmVbMF0pKTsKKwkgIG1lbXNldCAoc2YtPmxpbmUsIDAsIHNmLT5udW1fbGluZXMgKiBzaXplb2YgKHNmLT5saW5lWzBdKSk7CisJfQorICAgIH0KKworICAvKiBjb3VudCBleGVjdXRpb25zIHBlciBsaW5lOiAqLworCisgIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCisgICAgeworICAgICAgaWYgKHN5bS0+ZmlsZSAmJiBzeW0tPmZpbGUtPm51bV9saW5lcworCSAgJiYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfQU5OT10sIHN5bS0+YWRkcikKKwkgICAgICB8fCAoc3ltc1tJTkNMX0FOTk9dLmxlbiA9PSAwCisJCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfQU5OT10sIHN5bS0+YWRkcikpKSkKKwl7CisJICBzeW0tPmZpbGUtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKKwkgIGxpbmVfc3RhdHMgPSBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdOworCSAgaWYgKCFsaW5lX3N0YXRzKQorCSAgICB7CisJICAgICAgLyogY29tbW9uIGNhc2UgaGFzIGF0IG1vc3Qgb25lIGJhc2ljLWJsb2NrIHBlciBzb3VyY2UgbGluZTogKi8KKwkgICAgICBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdID0gc3ltOworCSAgICB9CisJICBlbHNlIGlmICghbGluZV9zdGF0cy0+YWRkcikKKwkgICAgeworCSAgICAgIC8qIHN5bSBpcyB0aGUgM3JkIC4uIG50aCBiYXNpYyBibG9jayBmb3IgdGhpcyBsaW5lOiAqLworCSAgICAgIGxpbmVfc3RhdHMtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogc3ltIGlzIHRoZSBzZWNvbmQgYmFzaWMgYmxvY2sgZm9yIHRoaXMgbGluZSAqLworCSAgICAgIG5ld19saW5lID0gKFN5bSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdfbGluZSkpOworCSAgICAgICpuZXdfbGluZSA9ICpsaW5lX3N0YXRzOworCSAgICAgIG5ld19saW5lLT5hZGRyID0gMDsKKwkgICAgICBuZXdfbGluZS0+bmNhbGxzICs9IHN5bS0+bmNhbGxzOworCSAgICAgIHN5bS0+ZmlsZS0+bGluZVtzeW0tPmxpbmVfbnVtIC0gMV0gPSBuZXdfbGluZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogcGxvZCBvdmVyIHNvdXJjZSBmaWxlcywgYW5ub3RhdGluZyB0aGVtOiAqLworCisgIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCisgICAgeworICAgICAgaWYgKCFzZi0+bnVtX2xpbmVzIHx8IChpZ25vcmVfemVyb3MgJiYgc2YtPm5jYWxscyA9PSAwKSkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzID0gbnVtX2xpbmVzX2V4ZWN1dGVkID0gMDsKKyAgICAgIG9mcCA9IGFubm90YXRlX3NvdXJjZSAoc2YsIDE2LCBhbm5vdGF0ZV93aXRoX2NvdW50LCBzZik7CisgICAgICBpZiAoIW9mcCkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChiYl90YWJsZV9sZW5ndGggPiAwKQorCXsKKwkgIGZwcmludGYgKG9mcCwgXygiXG5cblRvcCAlZCBMaW5lczpcblxuICAgICBMaW5lICAgICAgQ291bnRcblxuIiksCisJCSAgIGJiX3RhYmxlX2xlbmd0aCk7CisKKwkgIC8qIGFidXNlIGxpbmUgYXJyYXlzLS0taXQncyBub3QgbmVlZGVkIGFueW1vcmU6ICovCisJICBxc29ydCAoc2YtPmxpbmUsIHNmLT5udW1fbGluZXMsIHNpemVvZiAoc2YtPmxpbmVbMF0pLCBjbXBfbmNhbGxzKTsKKwkgIHRhYmxlX2xlbiA9IGJiX3RhYmxlX2xlbmd0aDsKKwkgIGlmICh0YWJsZV9sZW4gPiBzZi0+bnVtX2xpbmVzKQorCSAgICB7CisJICAgICAgdGFibGVfbGVuID0gc2YtPm51bV9saW5lczsKKwkgICAgfQorCSAgZm9yIChpID0gMDsgaSA8IHRhYmxlX2xlbjsgKytpKQorCSAgICB7CisJICAgICAgc3ltID0gc2YtPmxpbmVbaV07CisJICAgICAgaWYgKCFzeW0gfHwgc3ltLT5uY2FsbHMgPT0gMCkKKwkJeworCQkgIGJyZWFrOworCQl9CisJICAgICAgZnByaW50ZiAob2ZwLCAiJTlkICUxMGx1XG4iLCBzeW0tPmxpbmVfbnVtLCBzeW0tPm5jYWxscyk7CisJICAgIH0KKwl9CisKKyAgICAgIGZyZWUgKHNmLT5saW5lKTsKKyAgICAgIHNmLT5saW5lID0gMDsKKworICAgICAgZnByaW50ZiAob2ZwLCBfKCJcbkV4ZWN1dGlvbiBTdW1tYXJ5OlxuXG4iKSk7CisgICAgICBmcHJpbnRmIChvZnAsIF8oIiU5bGQgICBFeGVjdXRhYmxlIGxpbmVzIGluIHRoaXMgZmlsZVxuIiksCisJICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzKTsKKyAgICAgIGZwcmludGYgKG9mcCwgXygiJTlsZCAgIExpbmVzIGV4ZWN1dGVkXG4iKSwgbnVtX2xpbmVzX2V4ZWN1dGVkKTsKKyAgICAgIGZwcmludGYgKG9mcCwgXygiJTkuMmYgICBQZXJjZW50IG9mIHRoZSBmaWxlIGV4ZWN1dGVkXG4iKSwKKwkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMKKwkgICAgICAgPyAxMDAuMCAqIG51bV9saW5lc19leGVjdXRlZCAvIChkb3VibGUpIG51bV9leGVjdXRhYmxlX2xpbmVzCisJICAgICAgIDogMTAwLjApOworICAgICAgZnByaW50ZiAob2ZwLCBfKCJcbiU5bHUgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iKSwKKwkgICAgICAgc2YtPm5jYWxscyk7CisgICAgICBmcHJpbnRmIChvZnAsIF8oIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iKSwKKwkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMKKwkgICAgICAgPyAoZG91YmxlKSBzZi0+bmNhbGxzIC8gKGRvdWJsZSkgbnVtX2V4ZWN1dGFibGVfbGluZXMKKwkgICAgICAgOiAwLjApOworICAgICAgaWYgKG9mcCAhPSBzdGRvdXQpCisJeworCSAgZmNsb3NlIChvZnApOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9iYXNpY19ibG9ja3MuaCBiL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2VjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9iYXNpY19ibG9ja3MuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIGJhc2ljX2Jsb2Nrc19oCisjZGVmaW5lIGJhc2ljX2Jsb2Nrc19oCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAic291cmNlLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisKKy8qCisgKiBPcHRpb25zOgorICovCitleHRlcm4gYm9vbCBiYl9hbm5vdGF0ZV9hbGxfbGluZXM7CS8qIGZvcmNlIGFubm90YXRpb24gb2YgYWxsIGxpbmVzPyAqLworZXh0ZXJuIGludCBiYl90YWJsZV9sZW5ndGg7CQkvKiBsZW5ndGggb2YgbW9zdC11c2VkIGJiIHRhYmxlICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBiYl9taW5fY2FsbHM7CS8qIG1pbmltdW0gZXhlY3V0aW9uIGNvdW50ICovCisKK2V4dGVybiB2b2lkIGJiX3JlYWRfcmVjIFBBUkFNUyAoKEZJTEUgKiBpZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7CitleHRlcm4gdm9pZCBiYl93cml0ZV9ibG9ja3MgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKK2V4dGVybiB2b2lkIGJiX2NyZWF0ZV9zeW1zIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfYW5ub3RhdGVkX3NvdXJjZSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBwcmludF9leGVjX2NvdW50cyBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbmRpZiAvKiBiYXNpY19ibG9ja3NfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmJfZXhpdF9mdW5jLmMgYi9ncHJvZi9iYl9leGl0X2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTMzMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvYmJfZXhpdF9mdW5jLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBEYXZpZCBNb3NiZXJnZXItVGFuZy4KKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIF9fYmJfZXhpdF9mdW5jKCkgZHVtcHMgYWxsIHRoZSBiYXNpYy1ibG9jayBzdGF0aXN0aWNzIGxpbmtlZCBpbnRvCisgKiB0aGUgYmJfaGVhZCBjaGFpbiB0byAuZCBmaWxlcy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdtb25fb3V0LmgiCisKKy8qIHN0cnVjdHVyZSBlbWl0dGVkIGJ5IC1hICovCitzdHJ1Y3QgYmIgeworICAgIGxvbmcJCXplcm9fd29yZDsKKyAgICBjb25zdCBjaGFyCQkqZmlsZW5hbWU7CisgICAgbG9uZwkJKmNvdW50czsKKyAgICBsb25nCQluY291bnRzOworICAgIHN0cnVjdCBiYgkJKm5leHQ7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZwkqYWRkcmVzc2VzOworfTsKKworc3RydWN0IGJiICpfX2JiX2hlYWQgPSAoc3RydWN0IGJiICopMDsKKworCit2b2lkCitfX2JiX2V4aXRfZnVuYyAodm9pZCkKK3sKKyAgICBjb25zdCBpbnQgdmVyc2lvbiA9IEdNT05fVkVSU0lPTjsKKyAgICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKKyAgICBzdHJ1Y3QgYmIgKnB0cjsKKyAgICBGSUxFICpmcDsKKyAgICAvKgorICAgICAqIEdFTl9HTU9OX0NOVF9GSUxFIHNob3VsZCBiZSBkZWZpbmVkIG9uIHN5c3RlbXMgd2l0aCBtY2xlYW51cCgpCisgICAgICogZnVuY3Rpb25zIHRoYXQgZG8gbm90IHdyaXRlIGJhc2ljLWJsb2NrIHRvIGdtb24ub3V0LiAgSW4gc3VjaAorICAgICAqIGNhc2VzIHByb2ZpbGluZyB3aXRoICItcGcgLWEiIHdvdWxkIHJlc3VsdCBpbiBhIGdtb24ub3V0IGZpbGUKKyAgICAgKiB3aXRob3V0IGJhc2ljLWJsb2NrIGluZm8gKGJlY2F1c2UgdGhlIGZpbGUgd3JpdHRlbiBoZXJlIHdvdWxkCisgICAgICogYmUgb3ZlcndyaXR0ZW4uICBUaHVzLCBhIHNlcGFyYXRlIGZpbGUgaXMgZ2VuZXJhdGVkIGluc3RlYWQuCisgICAgICogVGhlIHR3byBmaWxlcyBjYW4gZWFzaWx5IGJlIGNvbWJpbmVkIGJ5IHNwZWNpZnlpbmcgdGhlbQorICAgICAqIG9uIGdwcm9mJ3MgY29tbWFuZCBsaW5lIChhbmQgcG9zc2libHkgZ2VuZXJhdGluZyBhIGdtb24uc3VtCisgICAgICogZmlsZSB3aXRoICJncHJvZiAtcyIpLgorICAgICAqLworI2lmbmRlZiBHRU5fR01PTl9DTlRfRklMRQorIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5vdXQiCisjZWxzZQorIyAgIGRlZmluZSBPVVRfTkFNRQkiZ21vbi5jbnQiCisjZW5kaWYKKyAgICBmcCA9IGZvcGVuKE9VVF9OQU1FLCAid2IiKTsKKyAgICBpZiAoIWZwKSB7CisJcGVycm9yKE9VVF9OQU1FKTsKKwlyZXR1cm47CisgICAgfSAvKiBpZiAqLworICAgIG1lbWNweSgmZ2hkci5jb29raWVbMF0sIEdNT05fTUFHSUMsIDQpOworICAgIG1lbWNweSgmZ2hkci52ZXJzaW9uLCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKTsKKyAgICBmd3JpdGUoJmdoZHIsIHNpemVvZihnaGRyKSwgMSwgZnApOworCisgICAgZm9yIChwdHIgPSBfX2JiX2hlYWQ7IHB0ciAhPSAwOyBwdHIgPSBwdHItPm5leHQpIHsKKwl1X2ludCBuY291bnRzID0gcHRyLT5uY291bnRzOworCXVfY2hhciB0YWc7CisJdV9pbnQgaTsKKworCXRhZyA9IEdNT05fVEFHX0JCX0NPVU5UOworCWZ3cml0ZSgmdGFnLCBzaXplb2YodGFnKSwgMSwgZnApOworCWZ3cml0ZSgmbmNvdW50cywgc2l6ZW9mKG5jb3VudHMpLCAxLCBmcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmNvdW50czsgKytpKSB7CisJICAgIGZ3cml0ZSgmcHRyLT5hZGRyZXNzZXNbaV0sIHNpemVvZihwdHItPmFkZHJlc3Nlc1swXSksIDEsIGZwKTsKKwkgICAgZndyaXRlKCZwdHItPmNvdW50c1tpXSwgc2l6ZW9mKHB0ci0+Y291bnRzWzBdKSwgMSwgZnApOworCX0gLyogZm9yICovCisgICAgfSAvKiBmb3IgKi8KKyAgICBmY2xvc2UgKGZwKTsKK30gLyogX19iYl9leGl0X2Z1bmMgKi8KKworCQkJLyoqKiBlbmQgb2YgX19iYl9leGl0X2Z1bmMuYyAqKiovCmRpZmYgLS1naXQgYS9ncHJvZi9iYmNvbnYucGwgYi9ncHJvZi9iYmNvbnYucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMxMmY1MQotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2JiY29udi5wbApAQCAtMCwwICsxLDM2IEBACisjISAvdXNyL2Jpbi9wZXJsCisKKyMgVGhpcyBzY3JpcHQgY29udmVydHMgYSAiYmIub3V0IiBmaWxlIGludG8gYSBmb3JtYXQKKyMgc3VpdGFibGUgZm9yIHByb2Nlc3NpbmcgYnkgZ3Byb2YKKworIyBXcml0ZSBhIG5ldy1zdHlsZSBnbW9uIGhlYWRlcgorCitwcmludCBwYWNrKCJBNEl4MTIiLCAiZ21vbiIsIDEpOworCisKKyMgVGhlIGlucHV0IGZpbGUgZm9ybWF0IGNvbnRhaW5zIGhlYWRlciBsaW5lcyBhbmQgZGF0YSBsaW5lcy4KKyMgSGVhZGVyIGxpbmVzIGNvbnRhaW4gYSBjb3VudCBvZiBob3cgbWFueSBkYXRhIGxpbmVzIGZvbGxvdyBiZWZvcmUKKyMgdGhlIG5leHQgaGVhZGVyIGxpbmUuICAkYmxvY2tjb3VudCBpcyBzZXQgdG8gdGhlIGNvdW50IHRoYXQKKyMgYXBwZWFycyBpbiBlYWNoIGhlYWRlciBsaW5lLCB0aGVuIGRlY3JlbWVudGVkIGF0IGVhY2ggZGF0YSBsaW5lLgorIyAkYmxvY2tjb3VudCBzaG91bGQgYWx3YXlzIGJlIHplcm8gYXQgdGhlIHN0YXJ0IG9mIGEgaGVhZGVyIGxpbmUsCisjIGFuZCBzaG91bGQgbmV2ZXIgYmUgemVybyBhdCB0aGUgc3RhcnQgb2YgYSBkYXRhIGxpbmUuCisKKyRibG9ja2NvdW50PTA7CisKK3doaWxlICg8PikgeworICAgIGlmICgvXkZpbGUgLiosIChbMC05XSspIGJhc2ljIGJsb2Nrcy8pIHsKKwlwcmludCBTVERFUlIgIk1pc2NvdW50OiBsaW5lICQuXG4iIGlmICgkYmxvY2tjb3VudCAhPSAwKTsKKwkkYmxvY2tjb3VudCA9ICQxOworCisJcHJpbnQgcGFjaygiY0kiLCAyLCAkYmxvY2tjb3VudCk7CisgICAgfQorICAgIGlmICgvQmxvY2suKmV4ZWN1dGVkKFsgMC05XSspIHRpbWUuKiBhZGRyZXNzPSAweChbMC05YS1mQS1GXSopLykgeworCXByaW50IFNUREVSUiAiTWlzY291bnQ6IGxpbmUgJC5cbiIgaWYgKCRibG9ja2NvdW50ID09IDApOworCSRibG9ja2NvdW50LS0gaWYgKCRibG9ja2NvdW50ID4gMCk7CisKKwkkY291bnQgPSAkMTsKKwkkYWRkciA9IGhleCAkMjsKKworCXByaW50IHBhY2soIklJIiwkYWRkciwkY291bnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dwcm9mL2JzZF9jYWxsZ19ibC5tIGIvZ3Byb2YvYnNkX2NhbGxnX2JsLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzYzk2YwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2JzZF9jYWxsZ19ibC5tCkBAIC0wLDAgKzEsMTA4IEBACisKKworCitjYWxsIGdyYXBoIHByb2ZpbGU6CisgICAgICAgICAgVGhlIHN1bSBvZiBzZWxmIGFuZCBkZXNjZW5kZW50cyBpcyB0aGUgbWFqb3Igc29ydAorICAgICAgICAgIGZvciB0aGlzIGxpc3RpbmcuCisKKyAgICAgICAgICBmdW5jdGlvbiBlbnRyaWVzOgorCitpbmRleCAgICAgdGhlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaAorICAgICAgICAgIGxpc3RpbmcsIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdCAoc2VlIGJlbG93KS4KKworJXRpbWUgICAgIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCB0aW1lIG9mIHRoZSBwcm9ncmFtCisgICAgICAgICAgYWNjb3VudGVkIGZvciBieSB0aGlzIGZ1bmN0aW9uIGFuZCBpdHMKKyAgICAgICAgICBkZXNjZW5kZW50cy4KKworc2VsZiAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgaXRzZWxmLgorCitkZXNjZW5kZW50cworICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzcGVudCBpbiB0aGUgZGVzY2VuZGVudHMgb2YKKyAgICAgICAgICB0aGlzIGZ1bmN0aW9uIG9uIGJlaGFsZiBvZiB0aGlzIGZ1bmN0aW9uLgorCitjYWxsZWQgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAob3RoZXIKKyAgICAgICAgICB0aGFuIHJlY3Vyc2l2ZSBjYWxscykuCisKK3NlbGYgICAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gY2FsbHMgaXRzZWxmCisgICAgICAgICAgcmVjdXJzaXZlbHkuCisKK25hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIHdpdGggYW4gaW5kaWNhdGlvbiBvZgorICAgICAgICAgIGl0cyBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KKworaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGgKKyAgICAgICAgICBsaXN0aW5nLCBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQuCisKKworCisgICAgICAgICAgcGFyZW50IGxpc3RpbmdzOgorCitzZWxmKiAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgZnVuY3Rpb24ncyBzZWxmIHRpbWUKKyAgICAgICAgICB3aGljaCBpcyBkdWUgdG8gY2FsbHMgZnJvbSB0aGlzIHBhcmVudC4KKworZGVzY2VuZGVudHMqCisgICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgZnVuY3Rpb24ncworICAgICAgICAgIGRlc2NlbmRlbnQgdGltZSB3aGljaCBpcyBkdWUgdG8gY2FsbHMgZnJvbSB0aGlzCisgICAgICAgICAgcGFyZW50LgorCitjYWxsZWQqKiAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieQorICAgICAgICAgIHRoaXMgcGFyZW50LiAgVGhpcyBpcyB0aGUgbnVtZXJhdG9yIG9mIHRoZQorICAgICAgICAgIGZyYWN0aW9uIHdoaWNoIGRpdmlkZXMgdXAgdGhlIGZ1bmN0aW9uJ3MgdGltZSB0bworICAgICAgICAgIGl0cyBwYXJlbnRzLgorCit0b3RhbCogICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYnkKKyAgICAgICAgICBhbGwgb2YgaXRzIHBhcmVudHMuICBUaGlzIGlzIHRoZSBkZW5vbWluYXRvciBvZgorICAgICAgICAgIHRoZSBwcm9wYWdhdGlvbiBmcmFjdGlvbi4KKworcGFyZW50cyAgIHRoZSBuYW1lIG9mIHRoaXMgcGFyZW50LCB3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCisgICAgICAgICAgcGFyZW50J3MgbWVtYmVyc2hpcCBpbiBhIGN5Y2xlLCBpZiBhbnkuCisKK2luZGV4ICAgICB0aGUgaW5kZXggb2YgdGhpcyBwYXJlbnQgaW4gdGhlIGNhbGwgZ3JhcGgKKyAgICAgICAgICBsaXN0aW5nLCBhcyBhbiBhaWQgaW4gbG9jYXRpbmcgaXQuCisKKworCisgICAgICAgICAgY2hpbGRyZW4gbGlzdGluZ3M6CisKK3NlbGYqICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBjaGlsZCdzIHNlbGYgdGltZQorICAgICAgICAgIHdoaWNoIGlzIGR1ZSB0byBiZWluZyBjYWxsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKworZGVzY2VuZGVudCoKKyAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhpcyBjaGlsZCdzIGRlc2NlbmRlbnQncworICAgICAgICAgIHRpbWUgd2hpY2ggaXMgZHVlIHRvIGJlaW5nIGNhbGxlZCBieSB0aGlzCisgICAgICAgICAgZnVuY3Rpb24uCisKK2NhbGxlZCoqICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgY2hpbGQgaXMgY2FsbGVkIGJ5IHRoaXMKKyAgICAgICAgICBmdW5jdGlvbi4gIFRoaXMgaXMgdGhlIG51bWVyYXRvciBvZiB0aGUKKyAgICAgICAgICBwcm9wYWdhdGlvbiBmcmFjdGlvbiBmb3IgdGhpcyBjaGlsZC4KKwordG90YWwqICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjaGlsZCBpcyBjYWxsZWQgYnkgYWxsCisgICAgICAgICAgZnVuY3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVub21pbmF0b3Igb2YgdGhlCisgICAgICAgICAgcHJvcGFnYXRpb24gZnJhY3Rpb24uCisKK2NoaWxkcmVuICB0aGUgbmFtZSBvZiB0aGlzIGNoaWxkLCBhbmQgYW4gaW5kaWNhdGlvbiBvZiBpdHMKKyAgICAgICAgICBtZW1iZXJzaGlwIGluIGEgY3ljbGUsIGlmIGFueS4KKworaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGlzIGNoaWxkIGluIHRoZSBjYWxsIGdyYXBoIGxpc3RpbmcsCisgICAgICAgICAgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0LgorCisKKworICAgICAgICAgICogdGhlc2UgZmllbGRzIGFyZSBvbWl0dGVkIGZvciBwYXJlbnRzIChvcgorICAgICAgICAgIGNoaWxkcmVuKSBpbiB0aGUgc2FtZSBjeWNsZSBhcyB0aGUgZnVuY3Rpb24uICBJZgorICAgICAgICAgIHRoZSBmdW5jdGlvbiAob3IgY2hpbGQpIGlzIGEgbWVtYmVyIG9mIGEgY3ljbGUsCisgICAgICAgICAgdGhlIHByb3BhZ2F0ZWQgdGltZXMgYW5kIHByb3BhZ2F0aW9uIGRlbm9taW5hdG9yCisgICAgICAgICAgcmVwcmVzZW50IHRoZSBzZWxmIHRpbWUgYW5kIGRlc2NlbmRlbnQgdGltZSBvZiB0aGUKKyAgICAgICAgICBjeWNsZSBhcyBhIHdob2xlLgorCisgICAgICAgICAgKiogc3RhdGljLW9ubHkgcGFyZW50cyBhbmQgY2hpbGRyZW4gYXJlIGluZGljYXRlZAorICAgICAgICAgIGJ5IGEgY2FsbCBjb3VudCBvZiAwLgorCisKKworICAgICAgICAgIGN5Y2xlIGxpc3RpbmdzOgorICAgICAgICAgIHRoZSBjeWNsZSBhcyBhIHdob2xlIGlzIGxpc3RlZCB3aXRoIHRoZSBzYW1lCisgICAgICAgICAgZmllbGRzIGFzIGEgZnVuY3Rpb24gZW50cnkuICBCZWxvdyBpdCBhcmUgbGlzdGVkCisgICAgICAgICAgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlLCBhbmQgdGhlaXIgY29udHJpYnV0aW9ucworICAgICAgICAgIHRvIHRoZSB0aW1lIGFuZCBjYWxsIGNvdW50cyBvZiB0aGUgY3ljbGUuCisMCmRpZmYgLS1naXQgYS9ncHJvZi9jYWxsX2dyYXBoLmMgYi9ncHJvZi9jYWxsX2dyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxMmNiZAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NhbGxfZ3JhcGguYwpAQCAtMCwwICsxLDExNiBAQAorI2luY2x1ZGUgImNnX2FyY3MuaCIKKyNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCisjaW5jbHVkZSAiY29yZWZpbGUuaCIKKyNpbmNsdWRlICJnbW9uX2lvLmgiCisjaW5jbHVkZSAiZ21vbl9vdXQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1faWRzLmgiCisKK2V4dGVybiB2b2lkCitERUZVTiAoY2dfdGFsbHksIChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCksCisgICAgICAgYmZkX3ZtYSBmcm9tX3BjIEFORCBiZmRfdm1hIHNlbGZfcGMgQU5EIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisgIFN5bSAqcGFyZW50OworICBTeW0gKmNoaWxkOworCisgIHBhcmVudCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGZyb21fcGMpOworICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIHNlbGZfcGMpOworCisgIGlmIChjaGlsZCA9PSBOVUxMIHx8IHBhcmVudCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBJZiB3ZSdyZSBkb2luZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZQorICAgICBjaGlsZCB3aWxsIHByb2JhYmx5IHBvaW50IHRvIGxpbmUgc3ltYm9scyBpbnN0ZWFkIG9mIGZ1bmN0aW9uCisgICAgIHN5bWJvbHMuICBGb3IgdGhlIHBhcmVudCB0aGlzIGlzIGZpbmUsIHNpbmNlIHRoaXMgaWRlbnRpZmllcyB0aGUKKyAgICAgbGluZSBudW1iZXIgaW4gdGhlIGNhbGxpbmcgcm91dGluZywgYnV0IHRoZSBjaGlsZCBzaG91bGQgYWx3YXlzCisgICAgIHBvaW50IHRvIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQsIHNvIHdlIGJhY2sgdXAgaW4gdGhlIHN5bWJvbAorICAgICB0YWJsZSB1bnRpbCB3ZSBmaW5kIGl0LgorICAgCisgICAgIEZvciBub3JtYWwgcHJvZmlsaW5nLCBpc19mdW5jIHdpbGwgYmUgc2V0IG9uIGFsbCBzeW1ib2xzLCBzbyB0aGlzCisgICAgIGNvZGUgd2lsbCBkbyBub3RoaW5nLiAgKi8KKworICB3aGlsZSAoY2hpbGQgPj0gc3ltdGFiLmJhc2UgJiYgISBjaGlsZC0+aXNfZnVuYykKKyAgICAtLWNoaWxkOworCisgIGlmIChjaGlsZCA8IHN5bXRhYi5iYXNlKQorICAgIHJldHVybjsKKworICAvKgorICAgKiBLZWVwIGFyYyBpZiBpdCBpcyBvbiBJTkNMX0FSQ1MgdGFibGUgb3IgaWYgdGhlIElOQ0xfQVJDUyB0YWJsZQorICAgKiBpcyBlbXB0eSBhbmQgaXQgaXMgbm90IGluIHRoZSBFWENMX0FSQ1MgdGFibGUuCisgICAqLworICBpZiAoc3ltX2lkX2FyY19pc19wcmVzZW50ICgmc3ltc1tJTkNMX0FSQ1NdLCBwYXJlbnQsIGNoaWxkKQorICAgICAgfHwgKHN5bXNbSU5DTF9BUkNTXS5sZW4gPT0gMAorCSAgJiYgIXN5bV9pZF9hcmNfaXNfcHJlc2VudCAoJnN5bXNbRVhDTF9BUkNTXSwgcGFyZW50LCBjaGlsZCkpKQorICAgIHsKKyAgICAgIGNoaWxkLT5uY2FsbHMgKz0gY291bnQ7CisgICAgICBEQkcgKFRBTExZREVCVUcsCisJICAgcHJpbnRmIChfKCJbY2dfdGFsbHldIGFyYyBmcm9tICVzIHRvICVzIHRyYXZlcnNlZCAlbHUgdGltZXNcbiIpLAorCQkgICBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lLCBjb3VudCkpOworICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgY291bnQpOworICAgIH0KK30KKworCisvKgorICogUmVhZCBhIHJlY29yZCBmcm9tIGZpbGUgSUZQIGRlc2NyaWJpbmcgYW4gYXJjIGluIHRoZSBmdW5jdGlvbgorICogY2FsbC1ncmFwaCBhbmQgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzIHRoZSBhcmMgaGFzIGJlZW4KKyAqIHRyYXZlcnNlZC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZAorICogZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMgb25seS4KKyAqLwordm9pZAorREVGVU4gKGNnX3JlYWRfcmVjLCAoaWZwLCBmaWxlbmFtZSksIEZJTEUgKiBpZnAgQU5EIENPTlNUIGNoYXIgKmZpbGVuYW1lKQoreworICBiZmRfdm1hIGZyb21fcGMsIHNlbGZfcGM7CisgIHN0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQgYXJjOworICB1bnNpZ25lZCBsb25nIGNvdW50OworCisgIGlmIChmcmVhZCAoJmFyYywgc2l6ZW9mIChhcmMpLCAxLCBpZnApICE9IDEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAorCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKyAgZnJvbV9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgYXJjLmZyb21fcGMpOworICBzZWxmX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuc2VsZl9wYyk7CisgIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuY291bnQpOworICBEQkcgKFNBTVBMRURFQlVHLAorICAgICAgIHByaW50ZiAoIltjZ19yZWFkX3JlY10gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCisJICAgICAgIGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KSk7CisgIC8qIGFkZCB0aGlzIGFyYzogKi8KKyAgY2dfdGFsbHkgKGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KTsKK30KKworCisvKgorICogV3JpdGUgYWxsIHRoZSBhcmNzIGluIHRoZSBjYWxsLWdyYXBoIHRvIGZpbGUgT0ZQLiAgRklMRU5BTUUgaXMKKyAqIHRoZSBuYW1lIG9mIE9GUCBhbmQgaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3ItbWVzc2FnZXMKKyAqIG9ubHkuCisgKi8KK3ZvaWQKK0RFRlVOIChjZ193cml0ZV9hcmNzLCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyIHRhZyA9IEdNT05fVEFHX0NHX0FSQzsKKyAgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCByYXdfYXJjOworICBBcmMgKmFyYzsKKyAgU3ltICpzeW07CisKKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyBzeW0rKykKKyAgICB7CisgICAgICBmb3IgKGFyYyA9IHN5bS0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQorCXsKKwkgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwgKGJmZF9ieXRlICopIHJhd19hcmMuZnJvbV9wYyk7CisJICBwdXRfdm1hIChjb3JlX2JmZCwgYXJjLT5jaGlsZC0+YWRkciwgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7CisJICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgYXJjLT5jb3VudCwgKGJmZF9ieXRlICopIHJhd19hcmMuY291bnQpOworCSAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKKwkgICAgICB8fCBmd3JpdGUgKCZyYXdfYXJjLCBzaXplb2YgKHJhd19hcmMpLCAxLCBvZnApICE9IDEpCisJICAgIHsKKwkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgICAgICBkb25lICgxKTsKKwkgICAgfQorCSAgREJHIChTQU1QTEVERUJVRywKKwkgICAgIHByaW50ZiAoIltjZ193cml0ZV9hcmNzXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKKwkJICAgICBhcmMtPnBhcmVudC0+YWRkciwgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9jYWxsX2dyYXBoLmggYi9ncHJvZi9jYWxsX2dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1MTM5YgotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NhbGxfZ3JhcGguaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIGNhbGxfZ3JhcGhfaAorI2RlZmluZSBjYWxsX2dyYXBoX2gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworZXh0ZXJuIHZvaWQgY2dfdGFsbHkgUEFSQU1TICgoYmZkX3ZtYSBmcm9tX3BjLCBiZmRfdm1hIHNlbGZfcGMsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSk7CitleHRlcm4gdm9pZCBjZ19yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOworZXh0ZXJuIHZvaWQgY2dfd3JpdGVfYXJjcyBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOworCisjZW5kaWYgLyogY2FsbF9ncmFwaF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19hcmNzLmMgYi9ncHJvZi9jZ19hcmNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwMjMxNwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NnX2FyY3MuYwpAQCAtMCwwICsxLDY4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5CisgKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCisgKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJworICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJncHJvZi5oIgorI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKKyNpbmNsdWRlICJjZ19hcmNzLmgiCisjaW5jbHVkZSAiY2dfZGZuLmgiCisjaW5jbHVkZSAiY2dfcHJpbnQuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInN5bV9pZHMuaCIKKworU3ltICpjeWNsZV9oZWFkZXI7Cit1bnNpZ25lZCBpbnQgbnVtX2N5Y2xlczsKK0FyYyAqKmFyY3M7Cit1bnNpZ25lZCBpbnQgbnVtYXJjczsKKworLyoKKyAqIFJldHVybiBUUlVFIGlmZiBQQVJFTlQgaGFzIGFuIGFyYyB0byBjb3ZlcnMgdGhlIGFkZHJlc3MKKyAqIHJhbmdlIGNvdmVyZWQgYnkgQ0hJTEQuCisgKi8KK0FyYyAqCitERUZVTiAoYXJjX2xvb2t1cCwgKHBhcmVudCwgY2hpbGQpLCBTeW0gKiBwYXJlbnQgQU5EIFN5bSAqIGNoaWxkKQoreworICBBcmMgKmFyYzsKKworICBpZiAoIXBhcmVudCB8fCAhY2hpbGQpCisgICAgeworICAgICAgcHJpbnRmICgiW2FyY19sb29rdXBdIHBhcmVudCA9PSAwIHx8IGNoaWxkID09IDBcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbYXJjX2xvb2t1cF0gcGFyZW50ICVzIGNoaWxkICVzXG4iLAorCQkJICAgIHBhcmVudC0+bmFtZSwgY2hpbGQtPm5hbWUpKTsKKyAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKKyAgICB7CisgICAgICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbYXJjX2xvb2t1cF1cdCBwYXJlbnQgJXMgY2hpbGQgJXNcbiIsCisJCQkJYXJjLT5wYXJlbnQtPm5hbWUsIGFyYy0+Y2hpbGQtPm5hbWUpKTsKKyAgICAgIGlmIChjaGlsZC0+YWRkciA+PSBhcmMtPmNoaWxkLT5hZGRyCisJICAmJiBjaGlsZC0+ZW5kX2FkZHIgPD0gYXJjLT5jaGlsZC0+ZW5kX2FkZHIpCisJeworCSAgcmV0dXJuIGFyYzsKKwl9CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKgorICogQWRkIChvciBqdXN0IGluY3JlbWVudCkgYW4gYXJjOgorICovCit2b2lkCitERUZVTiAoYXJjX2FkZCwgKHBhcmVudCwgY2hpbGQsIGNvdW50KSwKKyAgICAgICBTeW0gKiBwYXJlbnQgQU5EIFN5bSAqIGNoaWxkIEFORCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworICBzdGF0aWMgdW5zaWduZWQgaW50IG1heGFyY3MgPSAwOworICBBcmMgKmFyYywgKipuZXdhcmNzOworCisgIERCRyAoVEFMTFlERUJVRywgcHJpbnRmICgiW2FyY19hZGRdICVsdSBhcmNzIGZyb20gJXMgdG8gJXNcbiIsCisJCQkgICBjb3VudCwgcGFyZW50LT5uYW1lLCBjaGlsZC0+bmFtZSkpOworICBhcmMgPSBhcmNfbG9va3VwIChwYXJlbnQsIGNoaWxkKTsKKyAgaWYgKGFyYykKKyAgICB7CisgICAgICAvKgorICAgICAgICogQSBoaXQ6IGp1c3QgaW5jcmVtZW50IHRoZSBjb3VudC4KKyAgICAgICAqLworICAgICAgREJHIChUQUxMWURFQlVHLCBwcmludGYgKCJbdGFsbHldIGhpdCAlbHUgKz0gJWx1XG4iLAorCQkJICAgICAgIGFyYy0+Y291bnQsIGNvdW50KSk7CisgICAgICBhcmMtPmNvdW50ICs9IGNvdW50OworICAgICAgcmV0dXJuOworICAgIH0KKyAgYXJjID0gKEFyYyAqKSB4bWFsbG9jIChzaXplb2YgKCphcmMpKTsKKyAgbWVtc2V0IChhcmMsIDAsIHNpemVvZiAoKmFyYykpOworICBhcmMtPnBhcmVudCA9IHBhcmVudDsKKyAgYXJjLT5jaGlsZCA9IGNoaWxkOworICBhcmMtPmNvdW50ID0gY291bnQ7CisKKyAgLyogSWYgdGhpcyBpc24ndCBhbiBhcmMgZm9yIGEgcmVjdXJzaXZlIGNhbGwgdG8gcGFyZW50LCB0aGVuIGFkZCBpdAorICAgICB0byB0aGUgYXJyYXkgb2YgYXJjcy4gICovCisgIGlmIChwYXJlbnQgIT0gY2hpbGQpCisgICAgeworICAgICAgLyogSWYgd2UndmUgZXhoYXVzdGVkIHNwYWNlIGluIG91ciBjdXJyZW50IGFycmF5LCBnZXQgYSBuZXcgb25lCisJIGFuZCBjb3B5IHRoZSBjb250ZW50cy4gICBXZSBtaWdodCB3YW50IHRvIHRocm90dGxlIHRoZSBkb3VibGluZworCSBmYWN0b3Igb25lIGRheS4gICovCisgICAgICBpZiAobnVtYXJjcyA9PSBtYXhhcmNzKQorCXsKKwkgIC8qIERldGVybWluZSBob3cgbXVjaCBzcGFjZSB3ZSB3YW50IHRvIGFsbG9jYXRlLiAgKi8KKwkgIGlmIChtYXhhcmNzID09IDApCisJICAgIG1heGFyY3MgPSAxOworCSAgbWF4YXJjcyAqPSAyOworCQorCSAgLyogQWxsb2NhdGUgdGhlIG5ldyBhcnJheS4gICovCisJICBuZXdhcmNzID0gKEFyYyAqKil4bWFsbG9jKHNpemVvZiAoQXJjICopICogbWF4YXJjcyk7CisKKwkgIC8qIENvcHkgdGhlIG9sZCBhcnJheSdzIGNvbnRlbnRzIGludG8gdGhlIG5ldyBhcnJheS4gICovCisJICBtZW1jcHkgKG5ld2FyY3MsIGFyY3MsIG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7CisKKwkgIC8qIEZyZWUgdXAgdGhlIG9sZCBhcnJheS4gICovCisJICBmcmVlIChhcmNzKTsKKworCSAgLyogQW5kIG1ha2UgdGhlIG5ldyBhcnJheSBiZSB0aGUgY3VycmVudCBhcnJheS4gICovCisJICBhcmNzID0gbmV3YXJjczsKKwl9CisKKyAgICAgIC8qIFBsYWNlIHRoaXMgYXJjIGluIHRoZSBhcmMgYXJyYXkuICAqLworICAgICAgYXJjc1tudW1hcmNzKytdID0gYXJjOworICAgIH0KKworICAvKiBwcmVwZW5kIHRoaXMgY2hpbGQgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50OiAqLworICBhcmMtPm5leHRfY2hpbGQgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOworICBwYXJlbnQtPmNnLmNoaWxkcmVuID0gYXJjOworCisgIC8qIHByZXBlbmQgdGhpcyBwYXJlbnQgdG8gdGhlIHBhcmVudHMgb2YgdGhpcyBjaGlsZDogKi8KKyAgYXJjLT5uZXh0X3BhcmVudCA9IGNoaWxkLT5jZy5wYXJlbnRzOworICBjaGlsZC0+Y2cucGFyZW50cyA9IGFyYzsKK30KKworCitzdGF0aWMgaW50CitERUZVTiAoY21wX3RvcG8sIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKK3sKKyAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOworICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOworCisgIHJldHVybiBsZWZ0LT5jZy50b3Bfb3JkZXIgLSByaWdodC0+Y2cudG9wX29yZGVyOworfQorCisKK3N0YXRpYyB2b2lkCitERUZVTiAocHJvcGFnYXRlX3RpbWUsIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCit7CisgIEFyYyAqYXJjOworICBTeW0gKmNoaWxkOworICBkb3VibGUgc2hhcmUsIHByb3Bfc2hhcmU7CisKKyAgaWYgKHBhcmVudC0+Y2cucHJvcC5mcmFjdCA9PSAwLjApCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBnYXRoZXIgdGltZSBmcm9tIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50OiAqLworCisgIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCisgICAgeworICAgICAgY2hpbGQgPSBhcmMtPmNoaWxkOworICAgICAgaWYgKGFyYy0+Y291bnQgPT0gMCB8fCBjaGlsZCA9PSBwYXJlbnQgfHwgY2hpbGQtPmNnLnByb3AuZnJhY3QgPT0gMCkKKwl7CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGNoaWxkKQorCXsKKwkgIGlmIChwYXJlbnQtPmNnLmN5Yy5udW0gPT0gY2hpbGQtPmNnLmN5Yy5udW0pCisJICAgIHsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgaWYgKHBhcmVudC0+Y2cudG9wX29yZGVyIDw9IGNoaWxkLT5jZy50b3Bfb3JkZXIpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbcHJvcGFnYXRlXSB0b3BvcmRlciBib3RjaGVzXG4iKTsKKwkgICAgfQorCSAgY2hpbGQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChwYXJlbnQtPmNnLnRvcF9vcmRlciA8PSBjaGlsZC0+Y2cudG9wX29yZGVyKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3Byb3BhZ2F0ZV0gdG9wb3JkZXIgYm90Y2hlc1xuIik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisgICAgICBpZiAoY2hpbGQtPm5jYWxscyA9PSAwKQorCXsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogZGlzdHJpYnV0ZSB0aW1lIGZvciB0aGlzIGFyYzogKi8KKyAgICAgIGFyYy0+dGltZSA9IGNoaWxkLT5oaXN0LnRpbWUgKiAoKChkb3VibGUpIGFyYy0+Y291bnQpCisJCQkJICAgICAgLyAoKGRvdWJsZSkgY2hpbGQtPm5jYWxscykpOworICAgICAgYXJjLT5jaGlsZF90aW1lID0gY2hpbGQtPmNnLmNoaWxkX3RpbWUKKwkqICgoKGRvdWJsZSkgYXJjLT5jb3VudCkgLyAoKGRvdWJsZSkgY2hpbGQtPm5jYWxscykpOworICAgICAgc2hhcmUgPSBhcmMtPnRpbWUgKyBhcmMtPmNoaWxkX3RpbWU7CisgICAgICBwYXJlbnQtPmNnLmNoaWxkX3RpbWUgKz0gc2hhcmU7CisKKyAgICAgIC8qICgxIC0gY2cucHJvcC5mcmFjdCkgZ2V0cyBsb3N0IGFsb25nIHRoZSB3YXk6ICovCisgICAgICBwcm9wX3NoYXJlID0gcGFyZW50LT5jZy5wcm9wLmZyYWN0ICogc2hhcmU7CisKKyAgICAgIC8qIGZpeCB0aGluZ3MgZm9yIHByaW50aW5nOiAqLworICAgICAgcGFyZW50LT5jZy5wcm9wLmNoaWxkICs9IHByb3Bfc2hhcmU7CisgICAgICBhcmMtPnRpbWUgKj0gcGFyZW50LT5jZy5wcm9wLmZyYWN0OworICAgICAgYXJjLT5jaGlsZF90aW1lICo9IHBhcmVudC0+Y2cucHJvcC5mcmFjdDsKKworICAgICAgLyogYWRkIHRoaXMgc2hhcmUgdG8gdGhlIHBhcmVudCdzIGN5Y2xlIGhlYWRlciwgaWYgYW55OiAqLworICAgICAgaWYgKHBhcmVudC0+Y2cuY3ljLmhlYWQgIT0gcGFyZW50KQorCXsKKwkgIHBhcmVudC0+Y2cuY3ljLmhlYWQtPmNnLmNoaWxkX3RpbWUgKz0gc2hhcmU7CisJICBwYXJlbnQtPmNnLmN5Yy5oZWFkLT5jZy5wcm9wLmNoaWxkICs9IHByb3Bfc2hhcmU7CisJfQorICAgICAgREJHIChQUk9QREVCVUcsCisJICAgcHJpbnRmICgiW3Byb3BfdGltZV0gY2hpbGQgXHQiKTsKKwkgICBwcmludF9uYW1lIChjaGlsZCk7CisJICAgcHJpbnRmICgiIHdpdGggJWYgJWYgJWx1LyVsdVxuIiwgY2hpbGQtPmhpc3QudGltZSwKKwkJICAgY2hpbGQtPmNnLmNoaWxkX3RpbWUsIGFyYy0+Y291bnQsIGNoaWxkLT5uY2FsbHMpOworCSAgIHByaW50ZiAoIltwcm9wX3RpbWVdIHBhcmVudFx0Iik7CisJICAgcHJpbnRfbmFtZSAocGFyZW50KTsKKwkgICBwcmludGYgKCJcbltwcm9wX3RpbWVdIHNoYXJlICVmXG4iLCBzaGFyZSkpOworICAgIH0KK30KKworCisvKgorICogQ29tcHV0ZSB0aGUgdGltZSBvZiBhIGN5Y2xlIGFzIHRoZSBzdW0gb2YgdGhlIHRpbWVzIG9mIGFsbAorICogaXRzIG1lbWJlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitERUZVTl9WT0lEIChjeWNsZV90aW1lKQoreworICBTeW0gKm1lbWJlciwgKmN5YzsKKworICBmb3IgKGN5YyA9ICZjeWNsZV9oZWFkZXJbMV07IGN5YyA8PSAmY3ljbGVfaGVhZGVyW251bV9jeWNsZXNdOyArK2N5YykKKyAgICB7CisgICAgICBmb3IgKG1lbWJlciA9IGN5Yy0+Y2cuY3ljLm5leHQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKKwl7CisJICBpZiAobWVtYmVyLT5jZy5wcm9wLmZyYWN0ID09IDAuMCkKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogQWxsIG1lbWJlcnMgaGF2ZSB0aGUgc2FtZSBwcm9wZnJhY3Rpb24gZXhjZXB0IHRob3NlCisJICAgICAgICogdGhhdCB3ZXJlIGV4Y2x1ZGVkIHdpdGggLUUuCisJICAgICAgICovCisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGN5Yy0+aGlzdC50aW1lICs9IG1lbWJlci0+aGlzdC50aW1lOworCX0KKyAgICAgIGN5Yy0+Y2cucHJvcC5zZWxmID0gY3ljLT5jZy5wcm9wLmZyYWN0ICogY3ljLT5oaXN0LnRpbWU7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitERUZVTl9WT0lEIChjeWNsZV9saW5rKQoreworICBTeW0gKnN5bSwgKmN5YywgKm1lbWJlcjsKKyAgQXJjICphcmM7CisgIGludCBudW07CisKKyAgLyogY291bnQgdGhlIG51bWJlciBvZiBjeWNsZXMsIGFuZCBpbml0aWFsaXplIHRoZSBjeWNsZSBsaXN0czogKi8KKworICBudW1fY3ljbGVzID0gMDsKKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICAvKiB0aGlzIGlzIGhvdyB5b3UgZmluZCB1bmF0dGFjaGVkIGN5Y2xlczogKi8KKyAgICAgIGlmIChzeW0tPmNnLmN5Yy5oZWFkID09IHN5bSAmJiBzeW0tPmNnLmN5Yy5uZXh0KQorCXsKKwkgICsrbnVtX2N5Y2xlczsKKwl9CisgICAgfQorCisgIC8qCisgICAqIGN5Y2xlX2hlYWRlciBpcyBpbmRleGVkIGJ5IGN5Y2xlIG51bWJlcjogaS5lLiBpdCBpcyBvcmlnaW4gMSwKKyAgICogbm90IG9yaWdpbiAwLgorICAgKi8KKyAgY3ljbGVfaGVhZGVyID0gKFN5bSAqKSB4bWFsbG9jICgobnVtX2N5Y2xlcyArIDEpICogc2l6ZW9mIChTeW0pKTsKKworICAvKgorICAgKiBOb3cgbGluayBjeWNsZXMgdG8gdHJ1ZSBjeWNsZS1oZWFkcywgbnVtYmVyIHRoZW0sIGFjY3VtdWxhdGUKKyAgICogdGhlIGRhdGEgZm9yIHRoZSBjeWNsZS4KKyAgICovCisgIG51bSA9IDA7CisgIGN5YyA9IGN5Y2xlX2hlYWRlcjsKKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICBpZiAoIShzeW0tPmNnLmN5Yy5oZWFkID09IHN5bSAmJiBzeW0tPmNnLmN5Yy5uZXh0ICE9IDApKQorCXsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgICsrbnVtOworICAgICAgKytjeWM7CisgICAgICBzeW1faW5pdCAoY3ljKTsKKyAgICAgIGN5Yy0+Y2cucHJpbnRfZmxhZyA9IFRSVUU7CS8qIHNob3VsZCB0aGlzIGJlIHByaW50ZWQ/ICovCisgICAgICBjeWMtPmNnLnRvcF9vcmRlciA9IERGTl9OQU47CS8qIGdyYXBoIGNhbGwgY2hhaW4gdG9wLXNvcnQgb3JkZXIgKi8KKyAgICAgIGN5Yy0+Y2cuY3ljLm51bSA9IG51bTsJLyogaW50ZXJuYWwgbnVtYmVyIG9mIGN5Y2xlIG9uICovCisgICAgICBjeWMtPmNnLmN5Yy5oZWFkID0gY3ljOwkvKiBwb2ludGVyIHRvIGhlYWQgb2YgY3ljbGUgKi8KKyAgICAgIGN5Yy0+Y2cuY3ljLm5leHQgPSBzeW07CS8qIHBvaW50ZXIgdG8gbmV4dCBtZW1iZXIgb2YgY3ljbGUgKi8KKyAgICAgIERCRyAoQ1lDTEVERUJVRywgcHJpbnRmICgiW2N5Y2xlX2xpbmtdICIpOworCSAgIHByaW50X25hbWUgKHN5bSk7CisJICAgcHJpbnRmICgiIGlzIHRoZSBoZWFkIG9mIGN5Y2xlICVkXG4iLCBudW0pKTsKKworICAgICAgLyogbGluayBtZW1iZXJzIHRvIGN5Y2xlIGhlYWRlcjogKi8KKyAgICAgIGZvciAobWVtYmVyID0gc3ltOyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCisJeworCSAgbWVtYmVyLT5jZy5jeWMubnVtID0gbnVtOworCSAgbWVtYmVyLT5jZy5jeWMuaGVhZCA9IGN5YzsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBDb3VudCBjYWxscyBmcm9tIG91dHNpZGUgdGhlIGN5Y2xlIGFuZCB0aG9zZSBhbW9uZyBjeWNsZQorICAgICAgICogbWVtYmVyczoKKyAgICAgICAqLworICAgICAgZm9yIChtZW1iZXIgPSBzeW07IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKKwl7CisJICBmb3IgKGFyYyA9IG1lbWJlci0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQorCSAgICB7CisJICAgICAgaWYgKGFyYy0+cGFyZW50ID09IG1lbWJlcikKKwkJeworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgaWYgKGFyYy0+cGFyZW50LT5jZy5jeWMubnVtID09IG51bSkKKwkJeworCQkgIGN5Yy0+Y2cuc2VsZl9jYWxscyArPSBhcmMtPmNvdW50OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY3ljLT5uY2FsbHMgKz0gYXJjLT5jb3VudDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworCisvKgorICogQ2hlY2sgaWYgYW55IHBhcmVudCBvZiB0aGlzIGNoaWxkIChvciBvdXRzaWRlIHBhcmVudHMgb2YgdGhpcworICogY3ljbGUpIGhhdmUgdGhlaXIgcHJpbnQgZmxhZ3Mgb24gYW5kIHNldCB0aGUgcHJpbnQgZmxhZyBvZiB0aGUKKyAqIGNoaWxkIChjeWNsZSkgYXBwcm9wcmlhdGVseS4gIFNpbWlsYXJseSwgZGVhbCB3aXRoIHByb3BhZ2F0aW9uCisgKiBmcmFjdGlvbnMgZnJvbSBwYXJlbnRzLgorICovCitzdGF0aWMgdm9pZAorREVGVU4gKGluaGVyaXRfZmxhZ3MsIChjaGlsZCksIFN5bSAqIGNoaWxkKQoreworICBTeW0gKmhlYWQsICpwYXJlbnQsICptZW1iZXI7CisgIEFyYyAqYXJjOworCisgIGhlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7CisgIGlmIChjaGlsZCA9PSBoZWFkKQorICAgIHsKKyAgICAgIC8qIGp1c3QgYSByZWd1bGFyIGNoaWxkLCBjaGVjayBpdHMgcGFyZW50czogKi8KKyAgICAgIGNoaWxkLT5jZy5wcmludF9mbGFnID0gRkFMU0U7CisgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9IDAuMDsKKyAgICAgIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKKwl7CisJICBwYXJlbnQgPSBhcmMtPnBhcmVudDsKKwkgIGlmIChjaGlsZCA9PSBwYXJlbnQpCisJICAgIHsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgY2hpbGQtPmNnLnByaW50X2ZsYWcgfD0gcGFyZW50LT5jZy5wcmludF9mbGFnOworCSAgLyoKKwkgICAqIElmIHRoZSBjaGlsZCB3YXMgbmV2ZXIgYWN0dWFsbHkgY2FsbGVkIChlLmcuLCB0aGlzIGFyYworCSAgICogaXMgc3RhdGljIChhbmQgYWxsIG90aGVycyBhcmUsIHRvbykpIG5vIHRpbWUgcHJvcGFnYXRlcworCSAgICogYWxvbmcgdGhpcyBhcmMuCisJICAgKi8KKwkgIGlmIChjaGlsZC0+bmNhbGxzICE9IDApCisJICAgIHsKKwkgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCArPSBwYXJlbnQtPmNnLnByb3AuZnJhY3QKKwkJKiAoKChkb3VibGUpIGFyYy0+Y291bnQpIC8gKChkb3VibGUpIGNoaWxkLT5uY2FsbHMpKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKgorICAgICAgICogSXRzIGEgbWVtYmVyIG9mIGEgY3ljbGUsIGxvb2sgYXQgYWxsIHBhcmVudHMgZnJvbSBvdXRzaWRlCisgICAgICAgKiB0aGUgY3ljbGUuCisgICAgICAgKi8KKyAgICAgIGhlYWQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKKyAgICAgIGhlYWQtPmNnLnByb3AuZnJhY3QgPSAwLjA7CisgICAgICBmb3IgKG1lbWJlciA9IGhlYWQtPmNnLmN5Yy5uZXh0OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCisJeworCSAgZm9yIChhcmMgPSBtZW1iZXItPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKKwkgICAgeworCSAgICAgIGlmIChhcmMtPnBhcmVudC0+Y2cuY3ljLmhlYWQgPT0gaGVhZCkKKwkJeworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgcGFyZW50ID0gYXJjLT5wYXJlbnQ7CisJICAgICAgaGVhZC0+Y2cucHJpbnRfZmxhZyB8PSBwYXJlbnQtPmNnLnByaW50X2ZsYWc7CisJICAgICAgLyoKKwkgICAgICAgKiBJZiB0aGUgY3ljbGUgd2FzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCAoZS5nLiB0aGlzCisJICAgICAgICogYXJjIGlzIHN0YXRpYyAoYW5kIGFsbCBvdGhlcnMgYXJlLCB0b28pKSBubyB0aW1lCisJICAgICAgICogcHJvcGFnYXRlcyBhbG9uZyB0aGlzIGFyYy4KKwkgICAgICAgKi8KKwkgICAgICBpZiAoaGVhZC0+bmNhbGxzICE9IDApCisJCXsKKwkJICBoZWFkLT5jZy5wcm9wLmZyYWN0ICs9IHBhcmVudC0+Y2cucHJvcC5mcmFjdAorCQkgICAgKiAoKChkb3VibGUpIGFyYy0+Y291bnQpIC8gKChkb3VibGUpIGhlYWQtPm5jYWxscykpOworCQl9CisJICAgIH0KKwl9CisgICAgICBmb3IgKG1lbWJlciA9IGhlYWQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKKwl7CisJICBtZW1iZXItPmNnLnByaW50X2ZsYWcgPSBoZWFkLT5jZy5wcmludF9mbGFnOworCSAgbWVtYmVyLT5jZy5wcm9wLmZyYWN0ID0gaGVhZC0+Y2cucHJvcC5mcmFjdDsKKwl9CisgICAgfQorfQorCisKKy8qCisgKiBJbiBvbmUgdG9wLXRvLWJvdHRvbSBwYXNzIG92ZXIgdGhlIHRvcG9sb2dpY2FsbHkgc29ydGVkIHN5bWJvbHMKKyAqIHByb3BhZ2F0ZToKKyAqICAgICAgY2cucHJpbnRfZmxhZyBhcyB0aGUgdW5pb24gb2YgcGFyZW50cycgcHJpbnRfZmxhZ3MKKyAqICAgICAgcHJvcGZyYWN0aW9uIGFzIHRoZSBzdW0gb2YgZnJhY3Rpb25hbCBwYXJlbnRzJyBwcm9wZnJhY3Rpb25zCisgKiBhbmQgd2hpbGUgd2UncmUgaGVyZSwgc3VtIHRpbWUgZm9yIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChwcm9wYWdhdGVfZmxhZ3MsIChzeW1ib2xzKSwgU3ltICoqIHN5bWJvbHMpCit7CisgIGludCBpbmRleDsKKyAgU3ltICpvbGRfaGVhZCwgKmNoaWxkOworCisgIG9sZF9oZWFkID0gMDsKKyAgZm9yIChpbmRleCA9IHN5bXRhYi5sZW4gLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KQorICAgIHsKKyAgICAgIGNoaWxkID0gc3ltYm9sc1tpbmRleF07CisgICAgICAvKgorICAgICAgICogSWYgd2UgaGF2ZW4ndCBkb25lIHRoaXMgZnVuY3Rpb24gb3IgY3ljbGUsIGluaGVyaXQgdGhpbmdzCisgICAgICAgKiBmcm9tIHBhcmVudC4gIFRoaXMgd2F5LCB3ZSBhcmUgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgYXJjcworICAgICAgICogc2luY2Ugd2UgZG8gYWxsIG1lbWJlcnMgb2YgYSBjeWNsZSAoYW5kIHRoZSBjeWNsZSBpdHNlbGYpCisgICAgICAgKiBhcyB3ZSBoaXQgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgY3ljbGUuCisgICAgICAgKi8KKyAgICAgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gb2xkX2hlYWQpCisJeworCSAgb2xkX2hlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7CisJICBpbmhlcml0X2ZsYWdzIChjaGlsZCk7CisJfQorICAgICAgREJHIChQUk9QREVCVUcsCisJICAgcHJpbnRmICgiW3Byb3BfZmxhZ3NdICIpOworCSAgIHByaW50X25hbWUgKGNoaWxkKTsKKwkgICBwcmludGYgKCJpbmhlcml0cyBwcmludC1mbGFnICVkIGFuZCBwcm9wLWZyYWN0ICVmXG4iLAorCQkgICBjaGlsZC0+Y2cucHJpbnRfZmxhZywgY2hpbGQtPmNnLnByb3AuZnJhY3QpKTsKKyAgICAgIGlmICghY2hpbGQtPmNnLnByaW50X2ZsYWcpCisJeworCSAgLyoKKwkgICAqIFByaW50ZmxhZyBpcyBvZmYuIEl0IGdldHMgdHVybmVkIG9uIGJ5IGJlaW5nIGluIHRoZQorCSAgICogSU5DTF9HUkFQSCB0YWJsZSwgb3IgdGhlcmUgYmVpbmcgYW4gZW1wdHkgSU5DTF9HUkFQSAorCSAgICogdGFibGUgYW5kIG5vdCBiZWluZyBpbiB0aGUgRVhDTF9HUkFQSCB0YWJsZS4KKwkgICAqLworCSAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikKKwkgICAgICB8fCAoc3ltc1tJTkNMX0dSQVBIXS5sZW4gPT0gMAorCQkgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0dSQVBIXSwgY2hpbGQtPmFkZHIpKSkKKwkgICAgeworCSAgICAgIGNoaWxkLT5jZy5wcmludF9mbGFnID0gVFJVRTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKgorCSAgICogVGhpcyBmdW5jdGlvbiBoYXMgcHJpbnRpbmcgcGFyZW50czogbWF5YmUgc29tZW9uZSB3YW50cworCSAgICogdG8gc2h1dCBpdCB1cCBieSBwdXR0aW5nIGl0IGluIHRoZSBFWENMX0dSQVBIIHRhYmxlLgorCSAgICogKEJ1dCBmYXZvciBJTkNMX0dSQVBIIG92ZXIgRVhDTF9HUkFQSC4pCisJICAgKi8KKwkgIGlmICghc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9HUkFQSF0sIGNoaWxkLT5hZGRyKQorCSAgICAgICYmIHN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikpCisJICAgIHsKKwkgICAgICBjaGlsZC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOworCSAgICB9CisJfQorICAgICAgaWYgKGNoaWxkLT5jZy5wcm9wLmZyYWN0ID09IDAuMCkKKwl7CisJICAvKgorCSAgICogTm8gcGFyZW50cyB0byBwYXNzIHRpbWUgdG8uICBDb2xsZWN0IHRpbWUgZnJvbSBjaGlsZHJlbgorCSAgICogaWYgaXRzIGluIHRoZSBJTkNMX1RJTUUgdGFibGUsIG9yIHRoZXJlIGlzIGFuIGVtcHR5CisJICAgKiBJTkNMX1RJTUUgdGFibGUgYW5kIGl0cyBub3QgaW4gdGhlIEVYQ0xfVElNRSB0YWJsZS4KKwkgICAqLworCSAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfVElNRV0sIGNoaWxkLT5hZGRyKQorCSAgICAgIHx8IChzeW1zW0lOQ0xfVElNRV0ubGVuID09IDAKKwkJICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9USU1FXSwgY2hpbGQtPmFkZHIpKSkKKwkgICAgeworCSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ID0gMS4wOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qCisJICAgKiBJdCBoYXMgcGFyZW50cyB0byBwYXNzIHRpbWUgdG8sIGJ1dCBtYXliZSBzb21lb25lIHdhbnRzCisJICAgKiB0byBzaHV0IGl0IHVwIGJ5IHB1dHR0aW5nIGl0IGluIHRoZSBFWENMX1RJTUUgdGFibGUuCisJICAgKiAoQnV0IGZhdm9yIGJlaW5nIGluIElOQ0xfVElNRSB0YWJlIG92ZXIgYmVpbmcgaW4KKwkgICAqIEVYQ0xfVElNRSB0YWJsZS4pCisJICAgKi8KKwkgIGlmICghc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9USU1FXSwgY2hpbGQtPmFkZHIpCisJICAgICAgJiYgc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9USU1FXSwgY2hpbGQtPmFkZHIpKQorCSAgICB7CisJICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgPSAwLjA7CisJICAgIH0KKwl9CisgICAgICBjaGlsZC0+Y2cucHJvcC5zZWxmID0gY2hpbGQtPmhpc3QudGltZSAqIGNoaWxkLT5jZy5wcm9wLmZyYWN0OworICAgICAgcHJpbnRfdGltZSArPSBjaGlsZC0+Y2cucHJvcC5zZWxmOworICAgICAgREJHIChQUk9QREVCVUcsCisJICAgcHJpbnRmICgiW3Byb3BfZmxhZ3NdICIpOworCSAgIHByaW50X25hbWUgKGNoaWxkKTsKKwkgICBwcmludGYgKCIgZW5kcyB1cCB3aXRoIHByaW50ZmxhZyAlZCBhbmQgcHJvcC1mcmFjdCAlZlxuIiwKKwkJICAgY2hpbGQtPmNnLnByaW50X2ZsYWcsIGNoaWxkLT5jZy5wcm9wLmZyYWN0KTsKKwkgICBwcmludGYgKCJbcHJvcF9mbGFnc10gdGltZSAlZiBwcm9wc2VsZiAlZiBwcmludF90aW1lICVmXG4iLAorCQkgICBjaGlsZC0+aGlzdC50aW1lLCBjaGlsZC0+Y2cucHJvcC5zZWxmLCBwcmludF90aW1lKSk7CisgICAgfQorfQorCisKKy8qCisgKiBDb21wYXJlIGJ5IGRlY3JlYXNpbmcgcHJvcGFnYXRlZCB0aW1lLiAgSWYgdGltZXMgYXJlIGVxdWFsLCBidXQgb25lCisgKiBpcyBhIGN5Y2xlIGhlYWRlciwgc2F5IHRoYXQncyBmaXJzdCAoZS5nLiBsZXNzLCBpLmUuIC0xKS4gIElmIG9uZSdzCisgKiBuYW1lIGRvZXNuJ3QgaGF2ZSBhbiB1bmRlcnNjb3JlIGFuZCB0aGUgb3RoZXIgZG9lcywgc2F5IHRoYXQgb25lIGlzCisgKiBmaXJzdC4gIEFsbCBlbHNlIGJlaW5nIGVxdWFsLCBjb21wYXJlIGJ5IG5hbWVzLgorICovCitzdGF0aWMgaW50CitERUZVTiAoY21wX3RvdGFsLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCit7CisgIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKKyAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKKyAgZG91YmxlIGRpZmY7CisKKyAgZGlmZiA9IChsZWZ0LT5jZy5wcm9wLnNlbGYgKyBsZWZ0LT5jZy5wcm9wLmNoaWxkKQorICAgIC0gKHJpZ2h0LT5jZy5wcm9wLnNlbGYgKyByaWdodC0+Y2cucHJvcC5jaGlsZCk7CisgIGlmIChkaWZmIDwgMC4wKQorICAgIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgaWYgKGRpZmYgPiAwLjApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKCFsZWZ0LT5uYW1lICYmIGxlZnQtPmNnLmN5Yy5udW0gIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBpZiAoIXJpZ2h0LT5uYW1lICYmIHJpZ2h0LT5jZy5jeWMubnVtICE9IDApCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoIWxlZnQtPm5hbWUpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKCFyaWdodC0+bmFtZSkKKyAgICB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGlmIChsZWZ0LT5uYW1lWzBdICE9ICdfJyAmJiByaWdodC0+bmFtZVswXSA9PSAnXycpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKGxlZnQtPm5hbWVbMF0gPT0gJ18nICYmIHJpZ2h0LT5uYW1lWzBdICE9ICdfJykKKyAgICB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGlmIChsZWZ0LT5uY2FsbHMgPiByaWdodC0+bmNhbGxzKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGlmIChsZWZ0LT5uY2FsbHMgPCByaWdodC0+bmNhbGxzKQorICAgIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIHN0cmNtcCAobGVmdC0+bmFtZSwgcmlnaHQtPm5hbWUpOworfQorCisKKy8qCisgKiBUb3BvbG9naWNhbGx5IHNvcnQgdGhlIGdyYXBoIChjb2xsYXBzaW5nIGN5Y2xlcyksIGFuZCBwcm9wYWdhdGVzCisgKiB0aW1lIGJvdHRvbSB1cCBhbmQgZmxhZ3MgdG9wIGRvd24uCisgKi8KK1N5bSAqKgorREVGVU5fVk9JRCAoY2dfYXNzZW1ibGUpCit7CisgIFN5bSAqcGFyZW50LCAqKnRpbWVfc29ydGVkX3N5bXMsICoqdG9wX3NvcnRlZF9zeW1zOworICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgIEFyYyAqYXJjOworCisgIC8qCisgICAqIGluaXRpYWxpemUgdmFyaW91cyB0aGluZ3M6CisgICAqICAgICAgemVybyBvdXQgY2hpbGQgdGltZXMuCisgICAqICAgICAgY291bnQgc2VsZi1yZWN1cnNpdmUgY2FsbHMuCisgICAqICAgICAgaW5kaWNhdGUgdGhhdCBub3RoaW5nIGlzIG9uIGN5Y2xlcy4KKyAgICovCisgIGZvciAocGFyZW50ID0gc3ltdGFiLmJhc2U7IHBhcmVudCA8IHN5bXRhYi5saW1pdDsgcGFyZW50KyspCisgICAgeworICAgICAgcGFyZW50LT5jZy5jaGlsZF90aW1lID0gMC4wOworICAgICAgYXJjID0gYXJjX2xvb2t1cCAocGFyZW50LCBwYXJlbnQpOworICAgICAgaWYgKGFyYyAmJiBwYXJlbnQgPT0gYXJjLT5jaGlsZCkKKwl7CisJICBwYXJlbnQtPm5jYWxscyAtPSBhcmMtPmNvdW50OworCSAgcGFyZW50LT5jZy5zZWxmX2NhbGxzID0gYXJjLT5jb3VudDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcGFyZW50LT5jZy5zZWxmX2NhbGxzID0gMDsKKwl9CisgICAgICBwYXJlbnQtPmNnLnByb3AuZnJhY3QgPSAwLjA7CisgICAgICBwYXJlbnQtPmNnLnByb3Auc2VsZiA9IDAuMDsKKyAgICAgIHBhcmVudC0+Y2cucHJvcC5jaGlsZCA9IDAuMDsKKyAgICAgIHBhcmVudC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOworICAgICAgcGFyZW50LT5jZy50b3Bfb3JkZXIgPSBERk5fTkFOOworICAgICAgcGFyZW50LT5jZy5jeWMubnVtID0gMDsKKyAgICAgIHBhcmVudC0+Y2cuY3ljLmhlYWQgPSBwYXJlbnQ7CisgICAgICBwYXJlbnQtPmNnLmN5Yy5uZXh0ID0gMDsKKyAgICAgIGlmIChpZ25vcmVfZGlyZWN0X2NhbGxzKQorCXsKKwkgIGZpbmRfY2FsbCAocGFyZW50LCBwYXJlbnQtPmFkZHIsIChwYXJlbnQgKyAxKS0+YWRkcik7CisJfQorICAgIH0KKyAgLyoKKyAgICogVG9wb2xvZ2ljYWxseSBvcmRlciB0aGluZ3MuICBJZiBhbnkgbm9kZSBpcyB1bm51bWJlcmVkLCBudW1iZXIKKyAgICogaXQgYW5kIGFueSBvZiBpdHMgZGVzY2VuZGVudHMuCisgICAqLworICBmb3IgKHBhcmVudCA9IHN5bXRhYi5iYXNlOyBwYXJlbnQgPCBzeW10YWIubGltaXQ7IHBhcmVudCsrKQorICAgIHsKKyAgICAgIGlmIChwYXJlbnQtPmNnLnRvcF9vcmRlciA9PSBERk5fTkFOKQorCXsKKwkgIGNnX2RmbiAocGFyZW50KTsKKwl9CisgICAgfQorCisgIC8qIGxpbmsgdG9nZXRoZXIgbm9kZXMgb24gdGhlIHNhbWUgY3ljbGU6ICovCisgIGN5Y2xlX2xpbmsgKCk7CisKKyAgLyogc29ydCB0aGUgc3ltYm9sIHRhYmxlIGluIHJldmVyc2UgdG9wb2xvZ2ljYWwgb3JkZXI6ICovCisgIHRvcF9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCisgICAgeworICAgICAgdG9wX3NvcnRlZF9zeW1zW2luZGV4XSA9ICZzeW10YWIuYmFzZVtpbmRleF07CisgICAgfQorICBxc29ydCAodG9wX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuLCBzaXplb2YgKFN5bSAqKSwgY21wX3RvcG8pOworICBEQkcgKERGTkRFQlVHLAorICAgICAgIHByaW50ZiAoIltjZ19hc3NlbWJsZV0gdG9wb2xvZ2ljYWwgc29ydCBsaXN0aW5nXG4iKTsKKyAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQorICAgICAgIHsKKyAgICAgICBwcmludGYgKCJbY2dfYXNzZW1ibGVdICIpOworICAgICAgIHByaW50ZiAoIiVkOiIsIHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0tPmNnLnRvcF9vcmRlcik7CisgICAgICAgcHJpbnRfbmFtZSAodG9wX3NvcnRlZF9zeW1zW2luZGV4XSk7CisgICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgICB9CisgICk7CisgIC8qCisgICAqIFN0YXJ0aW5nIGZyb20gdGhlIHRvcG9sb2dpY2FsIHRvcCwgcHJvcGFnYXRlIHByaW50IGZsYWdzIHRvCisgICAqIGNoaWxkcmVuLiAgYWxzbywgY2FsY3VsYXRlIHByb3BhZ2F0aW9uIGZyYWN0aW9ucy4gIHRoaXMgaGFwcGVucworICAgKiBiZWZvcmUgdGltZSBwcm9wYWdhdGlvbiBzaW5jZSB0aW1lIHByb3BhZ2F0aW9uIHVzZXMgdGhlCisgICAqIGZyYWN0aW9ucy4KKyAgICovCisgIHByb3BhZ2F0ZV9mbGFncyAodG9wX3NvcnRlZF9zeW1zKTsKKworICAvKgorICAgKiBTdGFydGluZyBmcm9tIHRoZSB0b3BvbG9naWNhbCBib3R0b20sIHByb3BvZ2F0ZSBjaGlsZHJlbiB0aW1lcworICAgKiB1cCB0byBwYXJlbnRzLgorICAgKi8KKyAgY3ljbGVfdGltZSAoKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKKyAgICB7CisgICAgICBwcm9wYWdhdGVfdGltZSAodG9wX3NvcnRlZF9zeW1zW2luZGV4XSk7CisgICAgfQorCisgIGZyZWUgKHRvcF9zb3J0ZWRfc3ltcyk7CisKKyAgLyoKKyAgICogTm93LCBzb3J0IGJ5IENHLlBST1AuU0VMRiArIENHLlBST1AuQ0hJTEQuICBTb3J0aW5nIGJvdGggdGhlIHJlZ3VsYXIKKyAgICogZnVuY3Rpb24gbmFtZXMgYW5kIGN5Y2xlIGhlYWRlcnMuCisgICAqLworICB0aW1lX3NvcnRlZF9zeW1zID0gKFN5bSAqKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzKSAqIHNpemVvZiAoU3ltICopKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKKyAgICB7CisgICAgICB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSA9ICZzeW10YWIuYmFzZVtpbmRleF07CisgICAgfQorICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPD0gbnVtX2N5Y2xlczsgaW5kZXgrKykKKyAgICB7CisgICAgICB0aW1lX3NvcnRlZF9zeW1zW3N5bXRhYi5sZW4gKyBpbmRleCAtIDFdID0gJmN5Y2xlX2hlYWRlcltpbmRleF07CisgICAgfQorICBxc29ydCAodGltZV9zb3J0ZWRfc3ltcywgc3ltdGFiLmxlbiArIG51bV9jeWNsZXMsIHNpemVvZiAoU3ltICopLAorCSBjbXBfdG90YWwpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuICsgbnVtX2N5Y2xlczsgaW5kZXgrKykKKyAgICB7CisgICAgICB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XS0+Y2cuaW5kZXggPSBpbmRleCArIDE7CisgICAgfQorICByZXR1cm4gdGltZV9zb3J0ZWRfc3ltczsKK30KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2FyY3MuaCBiL2dwcm9mL2NnX2FyY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWEwMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvY2dfYXJjcy5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgY2dfYXJjc19oCisjZGVmaW5lIGNnX2FyY3NfaAorCisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworLyoKKyAqIEFyYyBzdHJ1Y3R1cmUgZm9yIGNhbGwtZ3JhcGguCisgKgorICogV2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBvZiB0aGUgcGFyZW50IGFuZCB0aGUgY2hpbGQsIGEgY291bnQKKyAqIG9mIGhvdyBtYW55IHRpbWVzIHRoaXMgYXJjIHdhcyB0cmF2ZXJzZWQsIGFuZCBwb2ludGVycyB0byB0aGUgbmV4dAorICogcGFyZW50IG9mIHRoaXMgY2hpbGQgYW5kIHRoZSBuZXh0IGNoaWxkIG9mIHRoaXMgcGFyZW50LgorICovCit0eXBlZGVmIHN0cnVjdCBhcmMKKyAgeworICAgIFN5bSAqcGFyZW50OwkJLyogc291cmNlIHZlcnRpY2Ugb2YgYXJjICovCisgICAgU3ltICpjaGlsZDsJCQkvKiBkZXN0IHZlcnRpY2Ugb2YgYXJjICovCisgICAgdW5zaWduZWQgbG9uZyBjb3VudDsJLyogIyBvZiBjYWxscyBmcm9tIHBhcmVudCB0byBjaGlsZCAqLworICAgIGRvdWJsZSB0aW1lOwkJLyogdGltZSBpbmhlcml0ZWQgYWxvbmcgYXJjICovCisgICAgZG91YmxlIGNoaWxkX3RpbWU7CQkvKiBjaGlsZC10aW1lIGluaGVyaXRlZCBhbG9uZyBhcmMgKi8KKyAgICBzdHJ1Y3QgYXJjICpuZXh0X3BhcmVudDsJLyogbmV4dCBwYXJlbnQgb2YgQ0hJTEQgKi8KKyAgICBzdHJ1Y3QgYXJjICpuZXh0X2NoaWxkOwkvKiBuZXh0IGNoaWxkIG9mIFBBUkVOVCAqLworICAgIGludCBoYXNfYmVlbl9wbGFjZWQ7CS8qIGhhdmUgdGhpcyBhcmMncyBmdW5jdGlvbnMgYmVlbiBwbGFjZWQ/ICovCisgIH0KK0FyYzsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fY3ljbGVzOwkvKiBudW1iZXIgb2YgY3ljbGVzIGRpc2NvdmVyZWQgKi8KK2V4dGVybiBTeW0gKmN5Y2xlX2hlYWRlcjsJLyogY3ljbGUgaGVhZGVycyAqLworCitleHRlcm4gdm9pZCBhcmNfYWRkIFBBUkFNUyAoKFN5bSAqIHBhcmVudCwgU3ltICogY2hpbGQsIHVuc2lnbmVkIGxvbmcgY291bnQpKTsKK2V4dGVybiBBcmMgKmFyY19sb29rdXAgUEFSQU1TICgoU3ltICogcGFyZW50LCBTeW0gKiBjaGlsZCkpOworZXh0ZXJuIFN5bSAqKmNnX2Fzc2VtYmxlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBBcmMgKiphcmNzOworZXh0ZXJuIHVuc2lnbmVkIGludCBudW1hcmNzOworCisjZW5kaWYgLyogY2dfYXJjc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19kZm4uYyBiL2dwcm9mL2NnX2Rmbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTM3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9jZ19kZm4uYwpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5CisgKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCisgKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJworICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAiY2dfYXJjcy5oIgorI2luY2x1ZGUgImNnX2Rmbi5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNkZWZpbmUJREZOX0RFUFRICTEwMAorCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgU3ltICpzeW07CisgICAgaW50IGN5Y2xlX3RvcDsKKyAgfQorREZOX1N0YWNrOworCitERk5fU3RhY2sgZGZuX3N0YWNrW0RGTl9ERVBUSF07CitpbnQgZGZuX2RlcHRoID0gMDsKK2ludCBkZm5fY291bnRlciA9IERGTl9OQU47CisKKworLyoKKyAqIElzIENISUxEIGFscmVhZHkgbnVtYmVyZWQ/CisgKi8KK3N0YXRpYyBib29sCitERUZVTiAoaXNfbnVtYmVyZWQsIChjaGlsZCksIFN5bSAqIGNoaWxkKQoreworICByZXR1cm4gY2hpbGQtPmNnLnRvcF9vcmRlciAhPSBERk5fTkFOICYmIGNoaWxkLT5jZy50b3Bfb3JkZXIgIT0gREZOX0JVU1k7Cit9CisKKworLyoKKyAqIElzIENISUxEIGFscmVhZHkgYnVzeT8KKyAqLworc3RhdGljIGJvb2wKK0RFRlVOIChpc19idXN5LCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKK3sKKyAgaWYgKGNoaWxkLT5jZy50b3Bfb3JkZXIgPT0gREZOX05BTikKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogQ0hJTEQgaXMgcGFydCBvZiBhIGN5Y2xlLiAgRmluZCB0aGUgdG9wIGNhbGxlciBpbnRvIHRoaXMgY3ljbGUKKyAqIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGN5Y2xlIGFuZCBtYWtlIGFsbCBmdW5jdGlvbnMgaW4gY3ljbGUKKyAqIG1lbWJlcnMgb2YgdGhhdCBjeWNsZSAodG9wIGNhbGxlciA9PSBjYWxsZXIgd2l0aCBzbWFsbGVzdAorICogZGVwdGgtZmlyc3QgbnVtYmVyKS4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChmaW5kX2N5Y2xlLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKK3sKKyAgU3ltICpoZWFkID0gMDsKKyAgU3ltICp0YWlsOworICBpbnQgY3ljbGVfdG9wOworICBpbnQgaW5kZXg7CisKKyAgZm9yIChjeWNsZV90b3AgPSBkZm5fZGVwdGg7IGN5Y2xlX3RvcCA+IDA7IC0tY3ljbGVfdG9wKQorICAgIHsKKyAgICAgIGhlYWQgPSBkZm5fc3RhY2tbY3ljbGVfdG9wXS5zeW07CisgICAgICBpZiAoY2hpbGQgPT0gaGVhZCkKKwl7CisJICBicmVhazsKKwl9CisgICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGNoaWxkICYmIGNoaWxkLT5jZy5jeWMuaGVhZCA9PSBoZWFkKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGlmIChjeWNsZV90b3AgPD0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJbZmluZF9jeWNsZV0gY291bGRuJ3QgZmluZCBoZWFkIG9mIGN5Y2xlXG4iKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKyNpZmRlZiBERUJVRworICBpZiAoZGVidWdfbGV2ZWwgJiBERk5ERUJVRykKKyAgICB7CisgICAgICBwcmludGYgKCJbZmluZF9jeWNsZV0gZGZuX2RlcHRoICVkIGN5Y2xlX3RvcCAlZCAiLAorCSAgICAgIGRmbl9kZXB0aCwgY3ljbGVfdG9wKTsKKyAgICAgIGlmIChoZWFkKQorCXsKKwkgIHByaW50X25hbWUgKGhlYWQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKCI8dW5rbm93bj4iKTsKKwl9CisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KKyNlbmRpZgorICBpZiAoY3ljbGVfdG9wID09IGRmbl9kZXB0aCkKKyAgICB7CisgICAgICAvKgorICAgICAgICogVGhpcyBpcyBwcmV2aW91cyBmdW5jdGlvbiwgZS5nLiB0aGlzIGNhbGxzIGl0c2VsZi4gIFNvcnQgb2YKKyAgICAgICAqIGJvcmluZy4KKyAgICAgICAqCisgICAgICAgKiBTaW5jZSB3ZSBhcmUgdGFraW5nIG91dCBzZWxmLWN5Y2xlcyBlbHNld2hlcmUgbm8gbmVlZCBmb3IKKyAgICAgICAqIHRoZSBzcGVjaWFsIGNhc2UsIGhlcmUuCisgICAgICAgKi8KKyAgICAgIERCRyAoREZOREVCVUcsCisJICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdICIpOworCSAgIHByaW50X25hbWUgKGNoaWxkKTsKKwkgICBwcmludGYgKCJcbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKgorICAgICAgICogR2xvbSBpbnRlcnZlbmluZyBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgYWxyZWFkeSBnbG9tbWVkIGludG8KKyAgICAgICAqIHRoaXMgY3ljbGUuICBUaGluZ3MgaGF2ZSBiZWVuIGdsb21tZWQgd2hlbiB0aGVpciBjeWNsZWhlYWQKKyAgICAgICAqIGZpZWxkIHBvaW50cyB0byB0aGUgaGVhZCBvZiB0aGUgY3ljbGUgdGhleSBhcmUgZ2xvbW1lZAorICAgICAgICogaW50by4KKyAgICAgICAqLworICAgICAgZm9yICh0YWlsID0gaGVhZDsgdGFpbC0+Y2cuY3ljLm5leHQ7IHRhaWwgPSB0YWlsLT5jZy5jeWMubmV4dCkKKwl7CisJICAvKiB2b2lkOiBjaGFzZSBkb3duIHRvIHRhaWwgb2YgdGhpbmdzIGFscmVhZHkgZ2xvbW1lZCAqLworCSAgREJHIChERk5ERUJVRywKKwkgICAgICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIHRhaWwgIik7CisJICAgICAgIHByaW50X25hbWUgKHRhaWwpOworCSAgICAgICBwcmludGYgKCJcbiIpKTsKKwl9CisgICAgICAvKgorICAgICAgICogSWYgd2hhdCB3ZSB0aGluayBpcyB0aGUgdG9wIG9mIHRoZSBjeWNsZSBoYXMgYSBjeWNsZWhlYWQKKyAgICAgICAqIGZpZWxkLCB0aGVuIGl0J3Mgbm90IHJlYWxseSB0aGUgaGVhZCBvZiB0aGUgY3ljbGUsIHdoaWNoIGlzCisgICAgICAgKiByZWFsbHkgd2hhdCB3ZSB3YW50LgorICAgICAgICovCisgICAgICBpZiAoaGVhZC0+Y2cuY3ljLmhlYWQgIT0gaGVhZCkKKwl7CisJICBoZWFkID0gaGVhZC0+Y2cuY3ljLmhlYWQ7CisJICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gbmV3IGN5Y2xlaGVhZCAiKTsKKwkgICAgICAgcHJpbnRfbmFtZSAoaGVhZCk7CisJICAgICAgIHByaW50ZiAoIlxuIikpOworCX0KKyAgICAgIGZvciAoaW5kZXggPSBjeWNsZV90b3AgKyAxOyBpbmRleCA8PSBkZm5fZGVwdGg7ICsraW5kZXgpCisJeworCSAgY2hpbGQgPSBkZm5fc3RhY2tbaW5kZXhdLnN5bTsKKwkgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgPT0gY2hpbGQpCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIE5vdCB5ZXQgZ2xvbW1lZCBhbnl3aGVyZSwgZ2xvbSBpdCBhbmQgZml4IGFueQorCSAgICAgICAqIGNoaWxkcmVuIGl0IGhhcyBnbG9tbWVkLgorCSAgICAgICAqLworCSAgICAgIHRhaWwtPmNnLmN5Yy5uZXh0ID0gY2hpbGQ7CisJICAgICAgY2hpbGQtPmNnLmN5Yy5oZWFkID0gaGVhZDsKKwkgICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gZ2xvbW1pbmcgIik7CisJCSAgIHByaW50X25hbWUgKGNoaWxkKTsKKwkJICAgcHJpbnRmICgiIG9udG8gIik7CisJCSAgIHByaW50X25hbWUgKGhlYWQpOworCQkgICBwcmludGYgKCJcbiIpKTsKKwkgICAgICBmb3IgKHRhaWwgPSBjaGlsZDsgdGFpbC0+Y2cuY3ljLm5leHQ7IHRhaWwgPSB0YWlsLT5jZy5jeWMubmV4dCkKKwkJeworCQkgIHRhaWwtPmNnLmN5Yy5uZXh0LT5jZy5jeWMuaGVhZCA9IGhlYWQ7CisJCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGFuZCBpdHMgdGFpbCAiKTsKKwkJICAgICAgIHByaW50X25hbWUgKHRhaWwtPmNnLmN5Yy5uZXh0KTsKKwkJICAgICAgIHByaW50ZiAoIiBvbnRvICIpOworCQkgICAgICAgcHJpbnRfbmFtZSAoaGVhZCk7CisJCSAgICAgICBwcmludGYgKCJcbiIpKTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gaGVhZCAvKiBmaXJld2FsbCAqLyApCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbZmluZF9jeWNsZV0gZ2xvbW1lZCwgYnV0IG5vdCB0byBoZWFkXG4iKTsKKwkgICAgICBkb25lICgxKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyoKKyAqIFByZXBhcmUgZm9yIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiBQQVJFTlQuICBQdXNoIGEgcGFyZW50IG9udG8KKyAqIHRoZSBzdGFjayBhbmQgbWFyayBpdCBidXN5LgorICovCitzdGF0aWMgdm9pZAorREVGVU4gKHByZV92aXNpdCwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKK3sKKyAgKytkZm5fZGVwdGg7CisgIGlmIChkZm5fZGVwdGggPj0gREZOX0RFUFRIKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIltwcmVfdmlzaXRdIGRmbl9zdGFjayBvdmVyZmxvd1xuIik7CisgICAgICBkb25lICgxKTsKKyAgICB9CisgIGRmbl9zdGFja1tkZm5fZGVwdGhdLnN5bSA9IHBhcmVudDsKKyAgZGZuX3N0YWNrW2Rmbl9kZXB0aF0uY3ljbGVfdG9wID0gZGZuX2RlcHRoOworICBwYXJlbnQtPmNnLnRvcF9vcmRlciA9IERGTl9CVVNZOworICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcHJlX3Zpc2l0XVx0XHQlZDoiLCBkZm5fZGVwdGgpOworICAgICAgIHByaW50X25hbWUgKHBhcmVudCk7CisgICAgICAgcHJpbnRmICgiXG4iKSk7Cit9CisKKworLyoKKyAqIERvbmUgd2l0aCB2aXNpdGluZyBub2RlIFBBUkVOVC4gIFBvcCBQQVJFTlQgb2ZmIGRmbl9zdGFjaworICogYW5kIG51bWJlciBmdW5jdGlvbnMgaWYgUEFSRU5UIGlzIGhlYWQgb2YgYSBjeWNsZS4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChwb3N0X3Zpc2l0LCAocGFyZW50KSwgU3ltICogcGFyZW50KQoreworICBTeW0gKm1lbWJlcjsKKworICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcG9zdF92aXNpdF1cdCVkOiAiLCBkZm5fZGVwdGgpOworICAgICAgIHByaW50X25hbWUgKHBhcmVudCk7CisgICAgICAgcHJpbnRmICgiXG4iKSk7CisgIC8qCisgICAqIE51bWJlciBmdW5jdGlvbnMgYW5kIHRoaW5ncyBpbiB0aGVpciBjeWNsZXMgdW5sZXNzIHRoZSBmdW5jdGlvbgorICAgKiBpcyBpdHNlbGYgcGFydCBvZiBhIGN5Y2xlOgorICAgKi8KKyAgaWYgKHBhcmVudC0+Y2cuY3ljLmhlYWQgPT0gcGFyZW50KQorICAgIHsKKyAgICAgICsrZGZuX2NvdW50ZXI7CisgICAgICBmb3IgKG1lbWJlciA9IHBhcmVudDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQorCXsKKwkgIG1lbWJlci0+Y2cudG9wX29yZGVyID0gZGZuX2NvdW50ZXI7CisJICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbcG9zdF92aXNpdF1cdFx0bWVtYmVyICIpOworCSAgICAgICBwcmludF9uYW1lIChtZW1iZXIpOworCSAgICAgICBwcmludGYgKCItPiBjZy50b3Bfb3JkZXIgPSAlZFxuIiwgZGZuX2NvdW50ZXIpKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHRcdGlzIHBhcnQgb2YgYSBjeWNsZVxuIikpOworICAgIH0KKyAgLS1kZm5fZGVwdGg7Cit9CisKKworLyoKKyAqIEdpdmVuIHRoaXMgUEFSRU5ULCBkZXB0aCBmaXJzdCBudW1iZXIgaXRzIGNoaWxkcmVuLgorICovCit2b2lkCitERUZVTiAoY2dfZGZuLCAocGFyZW50KSwgU3ltICogcGFyZW50KQoreworICBBcmMgKmFyYzsKKworICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZGZuXSBkZm4oICIpOworICAgICAgIHByaW50X25hbWUgKHBhcmVudCk7CisgICAgICAgcHJpbnRmICgiKVxuIikpOworICAvKgorICAgKiBJZiB3ZSdyZSBhbHJlYWR5IG51bWJlcmVkLCBubyBuZWVkIHRvIGxvb2sgYW55IGZ1cnRoZXI6CisgICAqLworICBpZiAoaXNfbnVtYmVyZWQgKHBhcmVudCkpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgLyoKKyAgICogSWYgd2UncmUgYWxyZWFkeSBidXN5LCBtdXN0IGJlIGEgY3ljbGU6CisgICAqLworICBpZiAoaXNfYnVzeSAocGFyZW50KSkKKyAgICB7CisgICAgICBmaW5kX2N5Y2xlIChwYXJlbnQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgcHJlX3Zpc2l0IChwYXJlbnQpOworICAvKgorICAgKiBSZWN1cnNpdmVseSB2aXNpdCBjaGlsZHJlbjoKKyAgICovCisgIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCisgICAgeworICAgICAgY2dfZGZuIChhcmMtPmNoaWxkKTsKKyAgICB9CisgIHBvc3RfdmlzaXQgKHBhcmVudCk7Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9jZ19kZm4uaCBiL2dwcm9mL2NnX2Rmbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDMwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9jZ19kZm4uaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIGNnX2Rmbl9oCisjZGVmaW5lIGNnX2Rmbl9oCisKKy8qCisgKiBGbGFncyB3aGljaCBtYXJrIGEgc3ltYm9sIGFzIHRvcG9sb2dpY2FsbHkgYGBidXN5Jycgb3IgYXMKKyAqIHRvcG9sb2dpY2FsbHkgYGBub3RfbnVtYmVyZWQnJzoKKyAqLworI2RlZmluZQlERk5fQlVTWQktMQorI2RlZmluZQlERk5fTkFOCQkwCisKKy8qCisgKiBEZXB0aC1maXJzdCBudW1iZXJpbmcgb2YgYSBjYWxsLWdyYXBoLgorICovCisKK2V4dGVybiB2b2lkIGNnX2RmbiBQQVJBTVMgKChTeW0gKiByb290KSk7CisKKyNlbmRpZiAvKiBjZ19kZm5faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuYyBiL2dwcm9mL2NnX3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0NWJjNwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NnX3ByaW50LmMKQEAgLTAsMCArMSwxMjc2IEBACisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiY2dfYXJjcy5oIgorI2luY2x1ZGUgImNnX3ByaW50LmgiCisjaW5jbHVkZSAiaGlzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKy8qCisgKiBSZXR1cm4gdmFsdWUgb2YgY29tcGFyaXNvbiBmdW5jdGlvbnMgdXNlZCB0byBzb3J0IHRhYmxlczoKKyAqLworI2RlZmluZQlMRVNTVEhBTgktMQorI2RlZmluZQlFUVVBTFRPCQkwCisjZGVmaW5lCUdSRUFURVJUSEFOCTEKKworc3RhdGljIHZvaWQgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgUEFSQU1TICgoQXJjICoqLCB1bnNpZ25lZCBsb25nLAorCQkJCQkJICAgICAgaW50LCBBcmMgKiosCisJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICopKTsKKy8qIGRlY2xhcmF0aW9ucyBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgdG8gb3V0cHV0IGJsdXJiczogKi8KK2V4dGVybiB2b2lkIGJzZF9jYWxsZ19ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKK2V4dGVybiB2b2lkIGZzZl9jYWxsZ19ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKKworZG91YmxlIHByaW50X3RpbWUgPSAwLjA7CisKKworc3RhdGljIHZvaWQKK0RFRlVOX1ZPSUQgKHByaW50X2hlYWRlcikKK3sKKyAgaWYgKGZpcnN0X291dHB1dCkKKyAgICB7CisgICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCJcZlxuIik7CisgICAgfQorICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCisgICAgeworICAgICAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucykKKwl7CisJICBwcmludGYgKF8oIlx0XHQgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpXG5cbiIpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmIChfKCJcdFx0XHRDYWxsIGdyYXBoXG5cbiIpKTsKKwl9CisgICAgfQorICBwcmludGYgKF8oIlxuZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiKSwKKwkgIChsb25nKSBoaXN0X3NjYWxlICogc2l6ZW9mIChVTklUKSk7CisgIGlmIChwcmludF90aW1lID4gMC4wKQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiIGZvciAlLjJmJSUgb2YgJS4yZiBzZWNvbmRzXG5cbiIpLAorCSAgICAgIDEwMC4wIC8gcHJpbnRfdGltZSwgcHJpbnRfdGltZSAvIGh6KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKF8oIiBubyB0aW1lIHByb3BhZ2F0ZWRcblxuIikpOworICAgICAgLyoKKyAgICAgICAqIFRoaXMgZG9lc24ndCBodXJ0LCBzaW5jZSBhbGwgdGhlIG51bWVyYXRvcnMgd2lsbCBiZSAwLjA6CisgICAgICAgKi8KKyAgICAgIHByaW50X3RpbWUgPSAxLjA7CisgICAgfQorICBpZiAoYnNkX3N0eWxlX291dHB1dCkKKyAgICB7CisgICAgICBwcmludGYgKCIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzLyUtNy43cyAgICAgJS04LjhzXG4iLAorCSAgICAgICIiLCAiIiwgIiIsICIiLCBfKCJjYWxsZWQiKSwgXygidG90YWwiKSwgXygicGFyZW50cyIpKTsKKyAgICAgIHByaW50ZiAoIiUtNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzKyUtNy43cyAlLTguOHNcdCU1LjVzXG4iLAorCSAgICAgIF8oImluZGV4IiksIF8oIiV0aW1lIiksIF8oInNlbGYiKSwgXygiZGVzY2VuZGVudHMiKSwKKwkgICAgICBfKCJjYWxsZWQiKSwgXygic2VsZiIpLCBfKCJuYW1lIiksIF8oImluZGV4IikpOworICAgICAgcHJpbnRmICgiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cy8lLTcuN3MgICAgICUtOC44c1xuIiwKKwkgICAgICAiIiwgIiIsICIiLCAiIiwgXygiY2FsbGVkIiksIF8oInRvdGFsIiksIF8oImNoaWxkcmVuIikpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKF8oImluZGV4ICUlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lXG4iKSk7CisgICAgfQorfQorCisKKy8qCisgKiBQcmludCBhIGN5Y2xlIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChwcmludF9jeWNsZSwgKGN5YyksIFN5bSAqIGN5YykKK3sKKyAgY2hhciBidWZbQlVGU0laXTsKKworICBzcHJpbnRmIChidWYsICJbJWRdIiwgY3ljLT5jZy5pbmRleCk7CisgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAorCSAgPyAiJS02LjZzICU1LjFmICU3LjJmICUxMS4yZiAlN2x1IgorCSAgOiAiJS02LjZzICU1LjFmICU3LjJmICU3LjJmICU3bHUiLCBidWYsCisJICAxMDAgKiAoY3ljLT5jZy5wcm9wLnNlbGYgKyBjeWMtPmNnLnByb3AuY2hpbGQpIC8gcHJpbnRfdGltZSwKKwkgIGN5Yy0+Y2cucHJvcC5zZWxmIC8gaHosIGN5Yy0+Y2cucHJvcC5jaGlsZCAvIGh6LCBjeWMtPm5jYWxscyk7CisgIGlmIChjeWMtPmNnLnNlbGZfY2FsbHMgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIrJS03bHUiLCBjeWMtPmNnLnNlbGZfY2FsbHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAlNy43cyIsICIiKTsKKyAgICB9CisgIHByaW50ZiAoXygiIDxjeWNsZSAlZCBhcyBhIHdob2xlPiBbJWRdXG4iKSwgY3ljLT5jZy5jeWMubnVtLCBjeWMtPmNnLmluZGV4KTsKK30KKworCisvKgorICogQ29tcGFyZSBMRUZUIGFuZCBSSUdIVCBtZW1ibWVyLiAgTWFqb3IgY29tcGFyaXNvbiBrZXkgaXMKKyAqIENHLlBST1AuU0VMRitDRy5QUk9QLkNISUxELCBzZWNvbmRhcnkga2V5IGlzIE5DQUxMUytDRy5TRUxGX0NBTExTLgorICovCitzdGF0aWMgaW50CitERUZVTiAoY21wX21lbWJlciwgKGxlZnQsIHJpZ2h0KSwgU3ltICogbGVmdCBBTkQgU3ltICogcmlnaHQpCit7CisgIGRvdWJsZSBsZWZ0X3RpbWUgPSBsZWZ0LT5jZy5wcm9wLnNlbGYgKyBsZWZ0LT5jZy5wcm9wLmNoaWxkOworICBkb3VibGUgcmlnaHRfdGltZSA9IHJpZ2h0LT5jZy5wcm9wLnNlbGYgKyByaWdodC0+Y2cucHJvcC5jaGlsZDsKKyAgdW5zaWduZWQgbG9uZyBsZWZ0X2NhbGxzID0gbGVmdC0+bmNhbGxzICsgbGVmdC0+Y2cuc2VsZl9jYWxsczsKKyAgdW5zaWduZWQgbG9uZyByaWdodF9jYWxscyA9IHJpZ2h0LT5uY2FsbHMgKyByaWdodC0+Y2cuc2VsZl9jYWxsczsKKworICBpZiAobGVmdF90aW1lID4gcmlnaHRfdGltZSkKKyAgICB7CisgICAgICByZXR1cm4gR1JFQVRFUlRIQU47CisgICAgfQorICBpZiAobGVmdF90aW1lIDwgcmlnaHRfdGltZSkKKyAgICB7CisgICAgICByZXR1cm4gTEVTU1RIQU47CisgICAgfQorCisgIGlmIChsZWZ0X2NhbGxzID4gcmlnaHRfY2FsbHMpCisgICAgeworICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOworICAgIH0KKyAgaWYgKGxlZnRfY2FsbHMgPCByaWdodF9jYWxscykKKyAgICB7CisgICAgICByZXR1cm4gTEVTU1RIQU47CisgICAgfQorICByZXR1cm4gRVFVQUxUTzsKK30KKworCisvKgorICogU29ydCBtZW1iZXJzIG9mIGEgY3ljbGUuCisgKi8KK3N0YXRpYyB2b2lkCitERUZVTiAoc29ydF9tZW1iZXJzLCAoY3ljKSwgU3ltICogY3ljKQoreworICBTeW0gKnRvZG8sICpkb2luZywgKnByZXY7CisgIC8qCisgICAqIERldGFjaCBjeWNsZSBtZW1iZXJzIGZyb20gY3ljbGVoZWFkLCBhbmQgaW5zZXJ0aW9uIHNvcnQgdGhlbQorICAgKiBiYWNrIG9uLgorICAgKi8KKyAgdG9kbyA9IGN5Yy0+Y2cuY3ljLm5leHQ7CisgIGN5Yy0+Y2cuY3ljLm5leHQgPSAwOworICBmb3IgKGRvaW5nID0gdG9kbzsgZG9pbmcgJiYgZG9pbmctPmNnLmN5Yy5uZXh0OyBkb2luZyA9IHRvZG8pCisgICAgeworICAgICAgdG9kbyA9IGRvaW5nLT5jZy5jeWMubmV4dDsKKyAgICAgIGZvciAocHJldiA9IGN5YzsgcHJldi0+Y2cuY3ljLm5leHQ7IHByZXYgPSBwcmV2LT5jZy5jeWMubmV4dCkKKwl7CisJICBpZiAoY21wX21lbWJlciAoZG9pbmcsIHByZXYtPmNnLmN5Yy5uZXh0KSA9PSBHUkVBVEVSVEhBTikKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgZG9pbmctPmNnLmN5Yy5uZXh0ID0gcHJldi0+Y2cuY3ljLm5leHQ7CisgICAgICBwcmV2LT5jZy5jeWMubmV4dCA9IGRvaW5nOworICAgIH0KK30KKworCisvKgorICogUHJpbnQgdGhlIG1lbWJlcnMgb2YgYSBjeWNsZS4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChwcmludF9tZW1iZXJzLCAoY3ljKSwgU3ltICogY3ljKQoreworICBTeW0gKm1lbWJlcjsKKworICBzb3J0X21lbWJlcnMgKGN5Yyk7CisgIGZvciAobWVtYmVyID0gY3ljLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQorICAgIHsKKyAgICAgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAorCSAgICAgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1IgorCSAgICAgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUiLAorCSAgICAgICIiLCAiIiwgbWVtYmVyLT5jZy5wcm9wLnNlbGYgLyBoeiwgbWVtYmVyLT5jZy5wcm9wLmNoaWxkIC8gaHosCisJICAgICAgbWVtYmVyLT5uY2FsbHMpOworICAgICAgaWYgKG1lbWJlci0+Y2cuc2VsZl9jYWxscyAhPSAwKQorCXsKKwkgIHByaW50ZiAoIislLTdsdSIsIG1lbWJlci0+Y2cuc2VsZl9jYWxscyk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByaW50ZiAoIiAlNy43cyIsICIiKTsKKwl9CisgICAgICBwcmludGYgKCIgICAgICIpOworICAgICAgcHJpbnRfbmFtZSAobWVtYmVyKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgfQorfQorCisKKy8qCisgKiBDb21wYXJlIHR3byBhcmNzIHRvL2Zyb20gdGhlIHNhbWUgY2hpbGQvcGFyZW50LgorICogICAgICAtIGlmIG9uZSBhcmMgaXMgYSBzZWxmIGFyYywgaXQncyBsZWFzdC4KKyAqICAgICAgLSBpZiBvbmUgYXJjIGlzIHdpdGhpbiBhIGN5Y2xlLCBpdCdzIGxlc3MgdGhhbi4KKyAqICAgICAgLSBpZiBib3RoIGFyY3MgYXJlIHdpdGhpbiBhIGN5Y2xlLCBjb21wYXJlIGFyYyBjb3VudHMuCisgKiAgICAgIC0gaWYgbmVpdGhlciBhcmMgaXMgd2l0aGluIGEgY3ljbGUsIGNvbXBhcmUgd2l0aAorICogICAgICAgICAgICAgIHRpbWUgKyBjaGlsZF90aW1lIGFzIG1ham9yIGtleQorICogICAgICAgICAgICAgIGFyYyBjb3VudCBhcyBtaW5vciBrZXkKKyAqLworc3RhdGljIGludAorREVGVU4gKGNtcF9hcmMsIChsZWZ0LCByaWdodCksIEFyYyAqIGxlZnQgQU5EIEFyYyAqIHJpZ2h0KQoreworICBTeW0gKmxlZnRfcGFyZW50ID0gbGVmdC0+cGFyZW50OworICBTeW0gKmxlZnRfY2hpbGQgPSBsZWZ0LT5jaGlsZDsKKyAgU3ltICpyaWdodF9wYXJlbnQgPSByaWdodC0+cGFyZW50OworICBTeW0gKnJpZ2h0X2NoaWxkID0gcmlnaHQtPmNoaWxkOworICBkb3VibGUgbGVmdF90aW1lLCByaWdodF90aW1lOworCisgIERCRyAoVElNRURFQlVHLAorICAgICAgIHByaW50ZiAoIltjbXBfYXJjXSAiKTsKKyAgICAgICBwcmludF9uYW1lIChsZWZ0X3BhcmVudCk7CisgICAgICAgcHJpbnRmICgiIGNhbGxzICIpOworICAgICAgIHByaW50X25hbWUgKGxlZnRfY2hpbGQpOworICAgICAgIHByaW50ZiAoIiAlZiArICVmICVsdS8lbHVcbiIsIGxlZnQtPnRpbWUsIGxlZnQtPmNoaWxkX3RpbWUsCisJICAgICAgIGxlZnQtPmNvdW50LCBsZWZ0X2NoaWxkLT5uY2FsbHMpOworICAgICAgIHByaW50ZiAoIltjbXBfYXJjXSAiKTsKKyAgICAgICBwcmludF9uYW1lIChyaWdodF9wYXJlbnQpOworICAgICAgIHByaW50ZiAoIiBjYWxscyAiKTsKKyAgICAgICBwcmludF9uYW1lIChyaWdodF9jaGlsZCk7CisgICAgICAgcHJpbnRmICgiICVmICsgJWYgJWx1LyVsdVxuIiwgcmlnaHQtPnRpbWUsIHJpZ2h0LT5jaGlsZF90aW1lLAorCSAgICAgICByaWdodC0+Y291bnQsIHJpZ2h0X2NoaWxkLT5uY2FsbHMpOworICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgKTsKKyAgaWYgKGxlZnRfcGFyZW50ID09IGxlZnRfY2hpbGQpCisgICAgeworICAgICAgcmV0dXJuIExFU1NUSEFOOwkJLyogbGVmdCBpcyBhIHNlbGYgY2FsbCAqLworICAgIH0KKyAgaWYgKHJpZ2h0X3BhcmVudCA9PSByaWdodF9jaGlsZCkKKyAgICB7CisgICAgICByZXR1cm4gR1JFQVRFUlRIQU47CS8qIHJpZ2h0IGlzIGEgc2VsZiBjYWxsICovCisgICAgfQorCisgIGlmIChsZWZ0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIGxlZnRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAorICAgICAgJiYgbGVmdF9wYXJlbnQtPmNnLmN5Yy5udW0gPT0gbGVmdF9jaGlsZC0+Y2cuY3ljLm51bSkKKyAgICB7CisgICAgICAvKiBsZWZ0IGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLworICAgICAgaWYgKHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKKwkgICYmIHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSA9PSByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSkKKwl7CisJICAvKiByaWdodCBpcyBhIGNhbGwgd2l0aGluIHRoZSBjeWNsZSwgdG9vICovCisJICBpZiAobGVmdC0+Y291bnQgPCByaWdodC0+Y291bnQpCisJICAgIHsKKwkgICAgICByZXR1cm4gTEVTU1RIQU47CisJICAgIH0KKwkgIGlmIChsZWZ0LT5jb3VudCA+IHJpZ2h0LT5jb3VudCkKKwkgICAgeworCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKKwkgICAgfQorCSAgcmV0dXJuIEVRVUFMVE87CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHJpZ2h0IGlzbid0IGEgY2FsbCB3aXRoaW4gdGhlIGN5Y2xlICovCisJICByZXR1cm4gTEVTU1RIQU47CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIGxlZnQgaXNuJ3QgYSBjYWxsIHdpdGhpbiBhIGN5Y2xlICovCisgICAgICBpZiAocmlnaHRfcGFyZW50LT5jZy5jeWMubnVtICE9IDAgJiYgcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAorCSAgJiYgcmlnaHRfcGFyZW50LT5jZy5jeWMubnVtID09IHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtKQorCXsKKwkgIC8qIHJpZ2h0IGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLworCSAgcmV0dXJuIEdSRUFURVJUSEFOOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBuZWl0aGVyIGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLworCSAgbGVmdF90aW1lID0gbGVmdC0+dGltZSArIGxlZnQtPmNoaWxkX3RpbWU7CisJICByaWdodF90aW1lID0gcmlnaHQtPnRpbWUgKyByaWdodC0+Y2hpbGRfdGltZTsKKwkgIGlmIChsZWZ0X3RpbWUgPCByaWdodF90aW1lKQorCSAgICB7CisJICAgICAgcmV0dXJuIExFU1NUSEFOOworCSAgICB9CisJICBpZiAobGVmdF90aW1lID4gcmlnaHRfdGltZSkKKwkgICAgeworCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKKwkgICAgfQorCSAgaWYgKGxlZnQtPmNvdW50IDwgcmlnaHQtPmNvdW50KQorCSAgICB7CisJICAgICAgcmV0dXJuIExFU1NUSEFOOworCSAgICB9CisJICBpZiAobGVmdC0+Y291bnQgPiByaWdodC0+Y291bnQpCisJICAgIHsKKwkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47CisJICAgIH0KKwkgIHJldHVybiBFUVVBTFRPOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK0RFRlVOIChzb3J0X3BhcmVudHMsIChjaGlsZCksIFN5bSAqIGNoaWxkKQoreworICBBcmMgKmFyYywgKmRldGFjaGVkLCBzb3J0ZWQsICpwcmV2OworCisgIC8qCisgICAqIFVubGluayBwYXJlbnRzIGZyb20gY2hpbGQsIHRoZW4gaW5zZXJ0aW9uIHNvcnQgYmFjayBvbiB0bworICAgKiBzb3J0ZWQncyBwYXJlbnRzLgorICAgKiAgICAgICphcmMgICAgICAgIHRoZSBhcmMgeW91IGhhdmUgZGV0YWNoZWQgYW5kIGFyZSBpbnNlcnRpbmcuCisgICAqICAgICAgKmRldGFjaGVkICAgdGhlIHJlc3Qgb2YgdGhlIGFyY3MgdG8gYmUgc29ydGVkLgorICAgKiAgICAgIHNvcnRlZCAgICAgIGFyYyBsaXN0IG9udG8gd2hpY2ggeW91IGluc2VydGlvbiBzb3J0LgorICAgKiAgICAgICpwcmV2ICAgICAgIGFyYyBiZWZvcmUgdGhlIGFyYyB5b3UgYXJlIGNvbXBhcmluZy4KKyAgICovCisgIHNvcnRlZC5uZXh0X3BhcmVudCA9IDA7CisgIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gZGV0YWNoZWQpCisgICAgeworICAgICAgZGV0YWNoZWQgPSBhcmMtPm5leHRfcGFyZW50OworCisgICAgICAvKiBjb25zaWRlciAqYXJjIGFzIGRpc2Nvbm5lY3RlZDsgaW5zZXJ0IGl0IGludG8gc29ydGVkOiAqLworICAgICAgZm9yIChwcmV2ID0gJnNvcnRlZDsgcHJldi0+bmV4dF9wYXJlbnQ7IHByZXYgPSBwcmV2LT5uZXh0X3BhcmVudCkKKwl7CisJICBpZiAoY21wX2FyYyAoYXJjLCBwcmV2LT5uZXh0X3BhcmVudCkgIT0gR1JFQVRFUlRIQU4pCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGFyYy0+bmV4dF9wYXJlbnQgPSBwcmV2LT5uZXh0X3BhcmVudDsKKyAgICAgIHByZXYtPm5leHRfcGFyZW50ID0gYXJjOworICAgIH0KKworICAvKiByZWF0dGFjaCBzb3J0ZWQgYXJjcyB0byBjaGlsZDogKi8KKyAgY2hpbGQtPmNnLnBhcmVudHMgPSBzb3J0ZWQubmV4dF9wYXJlbnQ7Cit9CisKKworc3RhdGljIHZvaWQKK0RFRlVOIChwcmludF9wYXJlbnRzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKK3sKKyAgU3ltICpwYXJlbnQ7CisgIEFyYyAqYXJjOworICBTeW0gKmN5Y2xlX2hlYWQ7CisKKyAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSAwKQorICAgIHsKKyAgICAgIGN5Y2xlX2hlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY3ljbGVfaGVhZCA9IGNoaWxkOworICAgIH0KKyAgaWYgKCFjaGlsZC0+Y2cucGFyZW50cykKKyAgICB7CisgICAgICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKKwkgICAgICA/IF8oIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIpCisJICAgICAgOiBfKCIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIiksCisJICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIik7CisgICAgICByZXR1cm47CisgICAgfQorICBzb3J0X3BhcmVudHMgKGNoaWxkKTsKKyAgZm9yIChhcmMgPSBjaGlsZC0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQorICAgIHsKKyAgICAgIHBhcmVudCA9IGFyYy0+cGFyZW50OworICAgICAgaWYgKGNoaWxkID09IHBhcmVudCB8fCAoY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAorCQkJICAgICAgJiYgcGFyZW50LT5jZy5jeWMubnVtID09IGNoaWxkLT5jZy5jeWMubnVtKSkKKwl7CisJICAvKiBzZWxmY2FsbCBvciBjYWxsIGFtb25nIHNpYmxpbmdzOiAqLworCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0CisJCSAgPyAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlN2x1ICU3LjdzICAgICAiCisJCSAgOiAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTdsdSAlNy43cyAgICAgIiwKKwkJICAiIiwgIiIsICIiLCAiIiwKKwkJICBhcmMtPmNvdW50LCAiIik7CisJICBwcmludF9uYW1lIChwYXJlbnQpOworCSAgcHJpbnRmICgiXG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogcmVndWxhciBwYXJlbnQgb2YgY2hpbGQ6ICovCisJICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKKwkJICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdS8lLTdsdSAgICAgIgorCQkgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUvJS03bHUgICAgICIsCisJCSAgIiIsICIiLAorCQkgIGFyYy0+dGltZSAvIGh6LCBhcmMtPmNoaWxkX3RpbWUgLyBoeiwKKwkJICBhcmMtPmNvdW50LCBjeWNsZV9oZWFkLT5uY2FsbHMpOworCSAgcHJpbnRfbmFtZSAocGFyZW50KTsKKwkgIHByaW50ZiAoIlxuIik7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorREVGVU4gKHNvcnRfY2hpbGRyZW4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCit7CisgIEFyYyAqYXJjLCAqZGV0YWNoZWQsIHNvcnRlZCwgKnByZXY7CisgIC8qCisgICAqIFVubGluayBjaGlsZHJlbiBmcm9tIHBhcmVudCwgdGhlbiBpbnNlcnRpb24gc29ydCBiYWNrIG9uIHRvCisgICAqIHNvcnRlZCdzIGNoaWxkcmVuLgorICAgKiAgICAgICphcmMgICAgICAgIHRoZSBhcmMgeW91IGhhdmUgZGV0YWNoZWQgYW5kIGFyZSBpbnNlcnRpbmcuCisgICAqICAgICAgKmRldGFjaGVkICAgdGhlIHJlc3Qgb2YgdGhlIGFyY3MgdG8gYmUgc29ydGVkLgorICAgKiAgICAgIHNvcnRlZCAgICAgIGFyYyBsaXN0IG9udG8gd2hpY2ggeW91IGluc2VydGlvbiBzb3J0LgorICAgKiAgICAgICpwcmV2ICAgICAgIGFyYyBiZWZvcmUgdGhlIGFyYyB5b3UgYXJlIGNvbXBhcmluZy4KKyAgICovCisgIHNvcnRlZC5uZXh0X2NoaWxkID0gMDsKKyAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGRldGFjaGVkKQorICAgIHsKKyAgICAgIGRldGFjaGVkID0gYXJjLT5uZXh0X2NoaWxkOworCisgICAgICAvKiBjb25zaWRlciAqYXJjIGFzIGRpc2Nvbm5lY3RlZDsgaW5zZXJ0IGl0IGludG8gc29ydGVkOiAqLworICAgICAgZm9yIChwcmV2ID0gJnNvcnRlZDsgcHJldi0+bmV4dF9jaGlsZDsgcHJldiA9IHByZXYtPm5leHRfY2hpbGQpCisJeworCSAgaWYgKGNtcF9hcmMgKGFyYywgcHJldi0+bmV4dF9jaGlsZCkgIT0gTEVTU1RIQU4pCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGFyYy0+bmV4dF9jaGlsZCA9IHByZXYtPm5leHRfY2hpbGQ7CisgICAgICBwcmV2LT5uZXh0X2NoaWxkID0gYXJjOworICAgIH0KKworICAvKiByZWF0dGFjaCBzb3J0ZWQgY2hpbGRyZW4gdG8gcGFyZW50OiAqLworICBwYXJlbnQtPmNnLmNoaWxkcmVuID0gc29ydGVkLm5leHRfY2hpbGQ7Cit9CisKKworc3RhdGljIHZvaWQKK0RFRlVOIChwcmludF9jaGlsZHJlbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKK3sKKyAgU3ltICpjaGlsZDsKKyAgQXJjICphcmM7CisKKyAgc29ydF9jaGlsZHJlbiAocGFyZW50KTsKKyAgYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsKKyAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKKyAgICB7CisgICAgICBjaGlsZCA9IGFyYy0+Y2hpbGQ7CisgICAgICBpZiAoY2hpbGQgPT0gcGFyZW50IHx8IChjaGlsZC0+Y2cuY3ljLm51bSAhPSAwCisJCQkgICAgICAmJiBjaGlsZC0+Y2cuY3ljLm51bSA9PSBwYXJlbnQtPmNnLmN5Yy5udW0pKQorCXsKKwkgIC8qIHNlbGYgY2FsbCBvciBjYWxsIHRvIHNpYmxpbmc6ICovCisJICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKKwkJICA/ICIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3bHUgJTcuN3MgICAgICIKKwkJICA6ICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlN2x1ICU3LjdzICAgICAiLAorCQkgICIiLCAiIiwgIiIsICIiLCBhcmMtPmNvdW50LCAiIik7CisJICBwcmludF9uYW1lIChjaGlsZCk7CisJICBwcmludGYgKCJcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiByZWd1bGFyIGNoaWxkIG9mIHBhcmVudDogKi8KKwkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAorCQkgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1LyUtN2x1ICAgICAiCisJCSAgOiAiJTYuNnMgJTUuNXMgJTcuMmYgJTcuMmYgJTdsdS8lLTdsdSAgICAgIiwKKwkJICAiIiwgIiIsCisJCSAgYXJjLT50aW1lIC8gaHosIGFyYy0+Y2hpbGRfdGltZSAvIGh6LAorCQkgIGFyYy0+Y291bnQsIGNoaWxkLT5jZy5jeWMuaGVhZC0+bmNhbGxzKTsKKwkgIHByaW50X25hbWUgKGNoaWxkKTsKKwkgIHByaW50ZiAoIlxuIik7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorREVGVU4gKHByaW50X2xpbmUsIChucCksIFN5bSAqIG5wKQoreworICBjaGFyIGJ1ZltCVUZTSVpdOworCisgIHNwcmludGYgKGJ1ZiwgIlslZF0iLCBucC0+Y2cuaW5kZXgpOworICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKKwkgID8gIiUtNi42cyAlNS4xZiAlNy4yZiAlMTEuMmYiCisJICA6ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTcuMmYiLCBidWYsCisJICAxMDAgKiAobnAtPmNnLnByb3Auc2VsZiArIG5wLT5jZy5wcm9wLmNoaWxkKSAvIHByaW50X3RpbWUsCisJICBucC0+Y2cucHJvcC5zZWxmIC8gaHosIG5wLT5jZy5wcm9wLmNoaWxkIC8gaHopOworICBpZiAoKG5wLT5uY2FsbHMgKyBucC0+Y2cuc2VsZl9jYWxscykgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIgJTdsdSIsIG5wLT5uY2FsbHMpOworICAgICAgaWYgKG5wLT5jZy5zZWxmX2NhbGxzICE9IDApCisJeworCSAgcHJpbnRmICgiKyUtN2x1ICIsIG5wLT5jZy5zZWxmX2NhbGxzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiICU3LjdzICIsICIiKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgiICU3LjdzICU3LjdzICIsICIiLCAiIik7CisgICAgfQorICBwcmludF9uYW1lIChucCk7CisgIHByaW50ZiAoIlxuIik7Cit9CisKKworLyoKKyAqIFByaW50IGR5bmFtaWMgY2FsbCBncmFwaC4KKyAqLwordm9pZAorREVGVU4gKGNnX3ByaW50LCAodGltZXNvcnRzeW0pLCBTeW0gKiogdGltZXNvcnRzeW0pCit7CisgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgU3ltICpwYXJlbnQ7CisKKyAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiBic2Rfc3R5bGVfb3V0cHV0KQorICAgIHsKKyAgICAgIGJzZF9jYWxsZ19ibHVyYiAoc3Rkb3V0KTsKKyAgICB9CisKKyAgcHJpbnRfaGVhZGVyICgpOworCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzOyArK2luZGV4KQorICAgIHsKKyAgICAgIHBhcmVudCA9IHRpbWVzb3J0c3ltW2luZGV4XTsKKyAgICAgIGlmICgoaWdub3JlX3plcm9zICYmIHBhcmVudC0+bmNhbGxzID09IDAKKwkgICAmJiBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPT0gMCAmJiBwYXJlbnQtPmNnLnByb3Auc2VsZiA9PSAwCisJICAgJiYgcGFyZW50LT5jZy5wcm9wLmNoaWxkID09IDApCisJICB8fCAhcGFyZW50LT5jZy5wcmludF9mbGFnCisJICB8fCAobGluZV9ncmFudWxhcml0eSAmJiAhIHBhcmVudC0+aXNfZnVuYykpCisJeworCSAgY29udGludWU7CisJfQorICAgICAgaWYgKCFwYXJlbnQtPm5hbWUgJiYgcGFyZW50LT5jZy5jeWMubnVtICE9IDApCisJeworCSAgLyogY3ljbGUgaGVhZGVyOiAqLworCSAgcHJpbnRfY3ljbGUgKHBhcmVudCk7CisJICBwcmludF9tZW1iZXJzIChwYXJlbnQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludF9wYXJlbnRzIChwYXJlbnQpOworCSAgcHJpbnRfbGluZSAocGFyZW50KTsKKwkgIHByaW50X2NoaWxkcmVuIChwYXJlbnQpOworCX0KKyAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQorCXByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKKwlwcmludGYgKCJcbiIpOworICAgIH0KKyAgZnJlZSAodGltZXNvcnRzeW0pOworICBpZiAocHJpbnRfZGVzY3JpcHRpb25zICYmICFic2Rfc3R5bGVfb3V0cHV0KQorICAgIHsKKyAgICAgIGZzZl9jYWxsZ19ibHVyYiAoc3Rkb3V0KTsKKyAgICB9Cit9CisKKworc3RhdGljIGludAorREVGVU4gKGNtcF9uYW1lLCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQoreworICBjb25zdCBTeW0gKipucHAxID0gKGNvbnN0IFN5bSAqKikgbGVmdDsKKyAgY29uc3QgU3ltICoqbnBwMiA9IChjb25zdCBTeW0gKiopIHJpZ2h0OworCisgIHJldHVybiBzdHJjbXAgKCgqbnBwMSktPm5hbWUsICgqbnBwMiktPm5hbWUpOworfQorCisKK3ZvaWQKK0RFRlVOX1ZPSUQgKGNnX3ByaW50X2luZGV4KQoreworICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgIHVuc2lnbmVkIGludCBubmFtZXMsIHRvZG8sIGksIGo7CisgIGludCBjb2wsIHN0YXJ0aW5nX2NvbDsKKyAgU3ltICoqbmFtZV9zb3J0ZWRfc3ltcywgKnN5bTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgYnVmWzIwXTsKKyAgaW50IGNvbHVtbl93aWR0aCA9IChvdXRwdXRfd2lkdGggLSAxKSAvIDM7CS8qIGRvbid0IHdyaXRlIGluIGxhc3QgY29sISAqLworICAvKgorICAgKiBOb3csIHNvcnQgcmVndWxhciBmdW5jdGlvbiBuYW1lIGFscGhhYmV0aWNhbGx5IHRvIGNyZWF0ZSBhbgorICAgKiBpbmRleDoKKyAgICovCisgIG5hbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jICgoc3ltdGFiLmxlbiArIG51bV9jeWNsZXMpICogc2l6ZW9mIChTeW0gKikpOworICBmb3IgKGluZGV4ID0gMCwgbm5hbWVzID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQorICAgIHsKKyAgICAgIGlmIChpZ25vcmVfemVyb3MgJiYgc3ltdGFiLmJhc2VbaW5kZXhdLm5jYWxscyA9PSAwCisJICAmJiBzeW10YWIuYmFzZVtpbmRleF0uaGlzdC50aW1lID09IDApCisJeworCSAgY29udGludWU7CisJfQorICAgICAgbmFtZV9zb3J0ZWRfc3ltc1tubmFtZXMrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOworICAgIH0KKyAgcXNvcnQgKG5hbWVfc29ydGVkX3N5bXMsIG5uYW1lcywgc2l6ZW9mIChTeW0gKiksIGNtcF9uYW1lKTsKKyAgZm9yIChpbmRleCA9IDEsIHRvZG8gPSBubmFtZXM7IGluZGV4IDw9IG51bV9jeWNsZXM7IGluZGV4KyspCisgICAgeworICAgICAgbmFtZV9zb3J0ZWRfc3ltc1t0b2RvKytdID0gJmN5Y2xlX2hlYWRlcltpbmRleF07CisgICAgfQorICBwcmludGYgKCJcZlxuIik7CisgIHByaW50ZiAoXygiSW5kZXggYnkgZnVuY3Rpb24gbmFtZVxuXG4iKSk7CisgIGluZGV4ID0gKHRvZG8gKyAyKSAvIDM7CisgIGZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQorICAgIHsKKyAgICAgIGNvbCA9IDA7CisgICAgICBzdGFydGluZ19jb2wgPSAwOworICAgICAgZm9yIChqID0gaTsgaiA8IHRvZG87IGogKz0gaW5kZXgpCisJeworCSAgc3ltID0gbmFtZV9zb3J0ZWRfc3ltc1tqXTsKKwkgIGlmIChzeW0tPmNnLnByaW50X2ZsYWcpCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChidWYsICJbJWRdIiwgc3ltLT5jZy5pbmRleCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNwcmludGYgKGJ1ZiwgIiglZCkiLCBzeW0tPmNnLmluZGV4KTsKKwkgICAgfQorCSAgaWYgKGogPCBubmFtZXMpCisJICAgIHsKKwkgICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKKwkJeworCQkgIHByaW50ZiAoIiU2LjZzICUtMTkuMTlzIiwgYnVmLCBzeW0tPm5hbWUpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY29sICs9IHN0cmxlbiAoYnVmKTsKKwkJICBmb3IgKDsgY29sIDwgc3RhcnRpbmdfY29sICsgNTsgKytjb2wpCisJCSAgICB7CisJCSAgICAgIHB1dGNoYXIgKCcgJyk7CisJCSAgICB9CisJCSAgcHJpbnRmICgiICVzICIsIGJ1Zik7CisJCSAgY29sICs9IHByaW50X25hbWVfb25seSAoc3ltKTsKKwkJICBpZiAoIWxpbmVfZ3JhbnVsYXJpdHkgJiYgc3ltLT5pc19zdGF0aWMgJiYgc3ltLT5maWxlKQorCQkgICAgeworCQkgICAgICBmaWxlbmFtZSA9IHN5bS0+ZmlsZS0+bmFtZTsKKwkJICAgICAgaWYgKCFwcmludF9wYXRoKQorCQkJeworCQkJICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOworCQkJICBpZiAoZmlsZW5hbWUpCisJCQkgICAgeworCQkJICAgICAgKytmaWxlbmFtZTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBmaWxlbmFtZSA9IHN5bS0+ZmlsZS0+bmFtZTsKKwkJCSAgICB9CisJCQl9CisJCSAgICAgIHByaW50ZiAoIiAoJXMpIiwgZmlsZW5hbWUpOworCQkgICAgICBjb2wgKz0gc3RybGVuIChmaWxlbmFtZSkgKyAzOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQorCQl7CisJCSAgcHJpbnRmICgiJTYuNnMgIiwgYnVmKTsKKwkJICBzcHJpbnRmIChidWYsIF8oIjxjeWNsZSAlZD4iKSwgc3ltLT5jZy5jeWMubnVtKTsKKwkJICBwcmludGYgKCIlLTE5LjE5cyIsIGJ1Zik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBjb2wgKz0gc3RybGVuIChidWYpOworCQkgIGZvciAoOyBjb2wgPCBzdGFydGluZ19jb2wgKyA1OyArK2NvbCkKKwkJICAgIHB1dGNoYXIgKCcgJyk7CisJCSAgcHJpbnRmICgiICVzICIsIGJ1Zik7CisJCSAgc3ByaW50ZiAoYnVmLCBfKCI8Y3ljbGUgJWQ+IiksIHN5bS0+Y2cuY3ljLm51bSk7CisJCSAgcHJpbnRmICgiJXMiLCBidWYpOworCQkgIGNvbCArPSBzdHJsZW4gKGJ1Zik7CisJCX0KKwkgICAgfQorCSAgc3RhcnRpbmdfY29sICs9IGNvbHVtbl93aWR0aDsKKwl9CisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KKyAgZnJlZSAobmFtZV9zb3J0ZWRfc3ltcyk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGFyY3MgYmFzZWQgb24gdGhlaXIgdXNhZ2UgY291bnRzLiAgV2Ugd2FudCB0byBzb3J0CisgICBpbiBkZXNjZW5kaW5nIG9yZGVyLiAgKi8KK3N0YXRpYyBpbnQKK0RFRlVOIChjbXBfYXJjX2NvdW50LCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQoreworICBjb25zdCBBcmMgKipucHAxID0gKGNvbnN0IEFyYyAqKikgbGVmdDsKKyAgY29uc3QgQXJjICoqbnBwMiA9IChjb25zdCBBcmMgKiopIHJpZ2h0OworCisgIGlmICgoKm5wcDEpLT5jb3VudCA+ICgqbnBwMiktPmNvdW50KQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoKCpucHAxKS0+Y291bnQgPCAoKm5wcDIpLT5jb3VudCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBDb21wYXJlIHR3byBmdW50aW9ucyBiYXNlZCBvbiB0aGVpciB1c2FnZSBjb3VudHMuICBXZSB3YW50IHRvIHNvcnQKKyAgIGluIGRlc2NlbmRpbmcgb3JkZXIuICAqLworc3RhdGljIGludAorREVGVU4gKGNtcF9mdW5fbnVzZXMsIChsZWZ0LCByaWdodCksIGNvbnN0IFBUUiBsZWZ0IEFORCBjb25zdCBQVFIgcmlnaHQpCit7CisgIGNvbnN0IFN5bSAqKm5wcDEgPSAoY29uc3QgU3ltICoqKSBsZWZ0OworICBjb25zdCBTeW0gKipucHAyID0gKGNvbnN0IFN5bSAqKikgcmlnaHQ7CisKKyAgaWYgKCgqbnBwMSktPm51c2VzID4gKCpucHAyKS0+bnVzZXMpCisgICAgcmV0dXJuIC0xOworICBlbHNlIGlmICgoKm5wcDEpLT5udXNlcyA8ICgqbnBwMiktPm51c2VzKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFByaW50IGEgc3VnZ2VzdGVkIGZ1bmN0aW9uIG9yZGVyaW5nIGJhc2VkIG9uIHRoZSBwcm9maWxpbmcgZGF0YS4KKworICAgV2UgcGVyZm9ybSA0IG1ham9yIHN0ZXBzIHdoZW4gb3JkZXJpbmcgZnVuY3Rpb25zOgorCisJKiBHcm91cCB1bnVzZWQgZnVuY3Rpb25zIHRvZ2V0aGVyIGFuZCBwbGFjZSB0aGVtIGF0IHRoZQorCWVuZCBvZiB0aGUgZnVuY3Rpb24gb3JkZXIuCisKKwkqIFNlYXJjaCB0aGUgaGlnaGVzdCB1c2UgYXJjcyAodGhvc2Ugd2hpY2ggYWNjb3VudCBmb3IgOTAlIG9mCisJdGhlIHRvdGFsIGFyYyBjb3VudCkgZm9yIGZ1bmN0aW9ucyB3aGljaCBoYXZlIHNldmVyYWwgcGFyZW50cy4KKworCUdyb3VwIHRob3NlIHdpdGggdGhlIG1vc3QgY2FsbCBzaXRlcyB0b2dldGhlciAoY3VycmVudGx5IHRoZQorCXRvcCAxLjI1JSB3aGljaCBoYXZlIGF0IGxlYXN0IGZpdmUgZGlmZmVyZW50IGNhbGwgc2l0ZXMpLgorCisJVGhlc2UgYXJlIGVtaXR0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBvcmRlci4KKworCSogVXNlIGEgZ3JlZWR5IHBsYWNlbWVudCBhbGdvcml0aG0gdG8gcGxhY2UgZnVuY3Rpb25zIHdoaWNoCisJb2NjdXIgaW4gdGhlIHRvcCA5OSUgb2YgdGhlIGFyY3MgaW4gdGhlIHByb2ZpbGUuICBTb21lIHByb3Zpc2lvbnMKKwlhcmUgbWFkZSB0byBoYW5kbGUgaGlnaCB1c2FnZSBhcmNzIHdoZXJlIHRoZSBwYXJlbnQgYW5kL29yCisJY2hpbGQgaGFzIGFscmVhZHkgYmVlbiBwbGFjZWQuCisKKwkqIFJ1biB0aGUgc2FtZSBncmVlZHkgcGxhY2VtZW50IGFsZ29yaXRobSBvbiB0aGUgcmVtYWluaW5nCisJYXJjcyB0byBwbGFjZSB0aGUgbGVmdG92ZXIgZnVuY3Rpb25zLgorCisKKyAgIFRoZSB2YXJpb3VzICJtYWdpYyBudW1iZXJzIiBzaG91bGQgKG9uZSBkYXkpIGJlIHR1bmVhYmxlIGJ5IGNvbW1hbmQKKyAgIGxpbmUgb3B0aW9ucy4gIFRoZXkgd2VyZSBhcnJpdmVkIGF0IGJ5IGJlbmNobWFya2luZyBhIGZldyBhcHBsaWNhdGlvbnMKKyAgIHdpdGggdmFyaW91cyB2YWx1ZXMgdG8gc2VlIHdoaWNoIHZhbHVlcyBwcm9kdWNlZCBiZXR0ZXIgb3ZlcmFsbCBmdW5jdGlvbgorICAgb3JkZXJpbmdzLgorCisgICBPZiBjb3Vyc2UsIHByb2ZpbGluZyBlcnJvcnMsIG1hY2hpbmUgbGltaXRhdGlvbnMgKFBBIGxvbmcgY2FsbHMpLCBhbmQKKyAgIHBvb3IgY3V0b2ZmIHZhbHVlcyBmb3IgdGhlIHBsYWNlbWVudCBhbGdvcml0aG0gbWF5IGxpbWl0IHRoZSB1c2VmdWxsbmVzcworICAgb2YgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBvcmRlci4gIEltcHJvdmVtZW50cyB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLgorICAgCisgICBTdWdnZXN0aW9uczoKKworCSogUGxhY2UgdGhlIGZ1bmN0aW9ucyB3aXRoIG1hbnkgY2FsbGVycyBuZWFyIHRoZSBtaWRkbGUgb2YgdGhlCisJbGlzdCB0byByZWR1Y2UgbG9uZyBjYWxscy4KKworCSogUHJvcGFnYXRlIGFyYyB1c2FnZSBjaGFuZ2VzIGFzIGZ1bmN0aW9ucyBhcmUgcGxhY2VkLiAgSWUgaWYKKwlmdW5jMSBhbmQgZnVuYzIgYXJlIHBsYWNlZCB0b2dldGhlciwgYXJjcyB0by9mcm9tIHRob3NlIGFyY3MKKwl0byB0aGUgc2FtZSBwYXJlbnQvY2hpbGQgc2hvdWxkIGJlIGNvbWJpbmVkLCB0aGVuIHJlc29ydCB0aGUKKwlhcmNzIHRvIGNob29zZSB0aGUgbmV4dCBvbmUuCisKKwkqIEltcGxlbWVudCBzb21lIGdsb2JhbCBwb3NpdGlvbmluZyBhbGdvcml0aG0gdG8gcGxhY2UgdGhlCisJY2hhaW5zIG1hZGUgYnkgdGhlIGdyZWVkeSBsb2NhbCBwb3NpdGlvbmluZyBhbGdvcml0aG0uICBQcm9iYWJseQorCWJ5IGV4YW1pbmluZyBhcmNzIHdoaWNoIGhhdmVuJ3QgYmVlbiBwbGFjZWQgeWV0IHRvIHRpZSB0d28KKwljaGFpbnMgdG9nZXRoZXIuCisKKwkqIFRha2UgYSBmdW5jdGlvbidzIHNpemUgYW5kIHRpbWUgaW50byBhY2NvdW50IGluIHRoZSBhbGdvcml0aG07CisJc2l6ZSBpbiBwYXJ0aWN1bGFyIGlzIGltcG9ydGFudCBvbiB0aGUgUEEgKGxvbmcgY2FsbHMpLiAgUGxhY2luZworCW1hbnkgc21hbGwgZnVuY3Rpb25zIG9udG8gdGhlaXIgb3duIHBhZ2UgbWF5IGJlIHdpc2UuCisKKwkqIFVzZSBiZXR0ZXIgcHJvZmlsaW5nIGluZm9ybWF0aW9uOyBtYW55IHB1Ymxpc2hlZCBhbGdvcml0aG1zCisJYXJlIGJhc2VkIG9uIGNhbGwgc2VxdWVuY2VzIHRocm91Z2ggdGltZSwgcmF0aGVyIHRoYW4ganVzdAorCWFyYyBjb3VudHMuCisKKwkqIFByb2RlY3VyZSBjbG9uaW5nIGNvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhIHNtYWxsIG51bWJlcgorCW9mIGFyY3MgYWNjb3VudCBmb3IgbW9zdCBvZiB0aGUgY2FsbHMgdG8gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgorCisJKiBVc2UgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhdm9pZCBtb3ZpbmcgdW51c2VkIGZ1bmN0aW9ucworCWNvbXBsZXRlbHkgb3V0IG9mIHRoZSBjb2RlIHN0cmVhbTsgdGhpcyB3b3VsZCBhdm9pZCBzZXZlcmUgbG9zc2FnZQorCXdoZW4gdGhlIHByb2ZpbGUgZGF0YSBiZWFycyBsaXR0bGUgcmVzZW1ibGFuY2UgdG8gYWN0dWFsIHJ1bnMuCisKKwkqIFByb3BhZ2F0aW9uIG9mIGFyYyB1c2FnZXMgc2hvdWxkIGFsc28gaW1wcm92ZSAubyBsaW5rIGxpbmUKKwlvcmRlcmluZyB3aGljaCBzaGFyZXMgdGhlIHNhbWUgYXJjIHBsYWNlbWVudCBhbGdvcml0aG0gd2l0aAorCXRoZSBmdW5jdGlvbiBvcmRlcmluZyBjb2RlIChpbiBmYWN0IGl0IGlzIGEgZGVnZW5lcmF0ZSBjYXNlCisJb2YgZnVuY3Rpb24gb3JkZXJpbmcpLiAgKi8KKwkKK3ZvaWQKK0RFRlVOX1ZPSUQgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKQoreworICB1bnNpZ25lZCBsb25nIGluZGV4LCB1c2VkLCB1bnVzZWQsIHNjcmF0Y2hfaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgIHVucGxhY2VkX2FyY19jb3VudCwgaGlnaF9hcmNfY291bnQsIHNjcmF0Y2hfYXJjX2NvdW50OworI2lmZGVmIF9fR05VQ19fCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9hcmNzLCB0bXBfYXJjc19jb3VudDsKKyNlbHNlCisgIHVuc2lnbmVkIGxvbmcgdG90YWxfYXJjcywgdG1wX2FyY3NfY291bnQ7CisjZW5kaWYKKyAgU3ltICoqdW51c2VkX3N5bXMsICoqdXNlZF9zeW1zLCAqKnNjcmF0Y2hfc3ltczsKKyAgQXJjICoqdW5wbGFjZWRfYXJjcywgKipoaWdoX2FyY3MsICoqc2NyYXRjaF9hcmNzOworCisgIGluZGV4ID0gMDsKKyAgdXNlZCA9IDA7CisgIHVudXNlZCA9IDA7CisgIHNjcmF0Y2hfaW5kZXggPSAwOworICB1bnBsYWNlZF9hcmNfY291bnQgPSAwOworICBoaWdoX2FyY19jb3VudCA9IDA7CisgIHNjcmF0Y2hfYXJjX2NvdW50ID0gMDsKKworICAvKiBGaXJzdCBncm91cCBhbGwgdGhlIHVudXNlZCBmdW5jdGlvbnMgdG9nZXRoZXIuICAqLworICB1bnVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7CisgIHVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7CisgIHNjcmF0Y2hfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7CisgIGhpZ2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7CisgIHNjcmF0Y2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7CisgIHVucGxhY2VkX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOworCisgIC8qIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGZ1bmN0aW9uczsgbWFyayB0aG9zZSB3aGljaCBhcmUgbmV2ZXIKKyAgICAgY2FsbGVkIGFzIHBsYWNlZCAod2UnbGwgZW1pdCB0aGVtIGFzIGEgZ3JvdXAgbGF0ZXIpLiAgKi8KKyAgZm9yIChpbmRleCA9IDAsIHVzZWQgPSAwLCB1bnVzZWQgPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCisgICAgeworICAgICAgaWYgKHN5bXRhYi5iYXNlW2luZGV4XS5uY2FsbHMgPT0gMCkKKwl7CisJICAvKiBGaWx0ZXIgb3V0IGdwcm9mIGdlbmVyYXRlZCBuYW1lcy4gICovCisJICBpZiAoc3RyY21wIChzeW10YWIuYmFzZVtpbmRleF0ubmFtZSwgIjxsb2NvcmU+IikKKwkgICAgICAmJiBzdHJjbXAgKHN5bXRhYi5iYXNlW2luZGV4XS5uYW1lLCAiPGhpY29yZT4iKSkKKwkgICAgeworCSAgICAgIHVudXNlZF9zeW1zW3VudXNlZCsrXSA9ICZzeW10YWIuYmFzZVtpbmRleF07CisJICAgICAgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCA9IDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgdXNlZF9zeW1zW3VzZWQrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOworCSAgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCA9IDA7CisJICBzeW10YWIuYmFzZVtpbmRleF0ubmV4dCA9IDA7CisJICBzeW10YWIuYmFzZVtpbmRleF0ucHJldiA9IDA7CisJICBzeW10YWIuYmFzZVtpbmRleF0ubnVzZXMgPSAwOworCX0KKyAgICB9CisKKyAgLyogU29ydCB0aGUgYXJjcyBmcm9tIG1vc3QgdXNlZCB0byBsZWFzdCB1c2VkLiAgKi8KKyAgcXNvcnQgKGFyY3MsIG51bWFyY3MsIHNpemVvZiAoQXJjICopLCBjbXBfYXJjX2NvdW50KTsKKworICAvKiBDb21wdXRlIHRoZSB0b3RhbCBhcmMgY291bnQuICBBbHNvIG1hcmsgYXJjcyBhcyB1bnBsYWNlZC4KKworICAgICBOb3RlIHdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIG92ZXJmbG93IGlmIHRoYXQgaGFwcGVucyEKKyAgICAgT3ZlcmZsb3cgaXMgbXVjaCBsZXNzIGxpa2VseSB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZAorICAgICB3aXRoIEdDQyBhcyBpdCBjYW4gZG91YmxlLXdpZGUgaW50ZWdlcnMgdmlhIGxvbmcgbG9uZy4gICovCisgIHRvdGFsX2FyY3MgPSAwOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQorICAgIHsKKyAgICAgIHRvdGFsX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OworICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDA7CisgICAgfQorCisgIC8qIFdlIHdhbnQgdG8gcHVsbCBvdXQgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VkCisgICAgIGJ5IG1hbnkgaGlnaGx5IHVzZWQgYXJjcyBhbmQgZW1pdCB0aGVtIGFzIGEgZ3JvdXAuICBUaGlzCisgICAgIGNvdWxkIHByb2JhYmx5IHVzZSBzb21lIHR1bmluZy4gICovCisgIHRtcF9hcmNzX2NvdW50ID0gMDsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKKyAgICB7CisgICAgICB0bXBfYXJjc19jb3VudCArPSBhcmNzW2luZGV4XS0+Y291bnQ7CisKKyAgICAgIC8qIENvdW50IGhvdyBtYW55IHRpbWVzIGVhY2ggcGFyZW50IGFuZCBjaGlsZCBhcmUgdXNlZCB1cAorCSB0byBvdXIgdGhyZXNoaG9sZCBvZiBhcmNzICg5MCUpLiAgKi8KKyAgICAgIGlmICgoZG91YmxlKXRtcF9hcmNzX2NvdW50IC8gKGRvdWJsZSl0b3RhbF9hcmNzID4gMC45MCkKKwlicmVhazsKKworICAgICAgYXJjc1tpbmRleF0tPmNoaWxkLT5udXNlcysrOworICAgIH0KKworICAvKiBOb3cgc29ydCBhIHRlbXBvcmFyeSBzeW1ib2wgdGFibGUgYmFzZWQgb24gdGhlIG51bWJlciBvZgorICAgICB0aW1lcyBlYWNoIGZ1bmN0aW9uIHdhcyB1c2VkIGluIHRoZSBoaWdoZXN0IHVzZWQgYXJjcy4gICovCisgIG1lbWNweSAoc2NyYXRjaF9zeW1zLCB1c2VkX3N5bXMsIHVzZWQgKiBzaXplb2YgKFN5bSAqKSk7CisgIHFzb3J0IChzY3JhdGNoX3N5bXMsIHVzZWQsIHNpemVvZiAoU3ltICopLCBjbXBfZnVuX251c2VzKTsKKworICAvKiBOb3cgcGljayBvdXQgdGhvc2Ugc3ltYm9scyB3ZSdyZSBnb2luZyB0byBlbWl0IGFzCisgICAgIGEgZ3JvdXAuICBXZSB0YWtlIHVwIHRvIDEuMjUlIG9mIHRoZSB1c2VkIHN5bWJvbHMuICAqLworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1c2VkIC8gODA7IGluZGV4KyspCisgICAgeworICAgICAgU3ltICpzeW0gPSBzY3JhdGNoX3N5bXNbaW5kZXhdOworICAgICAgQXJjICphcmM7CisKKyAgICAgIC8qIElmIHdlIGhpdCBzeW1ib2xzIHRoYXQgYXJlbid0IHVzZWQgZnJvbSBtYW55IGNhbGwgc2l0ZXMsCisJIHRoZW4gd2UgY2FuIHF1aXQuICBXZSBjaG9vc2UgZml2ZSBhcyB0aGUgbG93IGxpbWl0IGZvcgorCSBubyBwYXJ0aWN1bGFyIHJlYXNvbi4gICovCisgICAgICBpZiAoc3ltLT5udXNlcyA9PSA1KQorCWJyZWFrOworCisgICAgICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIHRoZSBhcmNzIGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zLgorCSBVbmZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBrbm93IGFsbCB0aGVzZSBmdW5jdGlvbnMKKwkgdW50aWwgd2UncmUgZG9uZS4gIFNvIHdlIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSBhcmNzCisJIHRvIHRoZSBmdW5jdGlvbnMgd2UgY2FyZSBhYm91dCwgdGhlbiBwcnVuZSBvdXQgdGhvc2UKKwkgd2hpY2ggYXJlIHVuaW50ZXJlc3RpbmcuIAorCisJIEFuIGludGVyZXN0aW5nIHZhcmlhdGlvbiB3b3VsZCBiZSB0byBxdWl0IHdoZW4gd2UgZm91bmQKKwkgbXVsdGktY2FsbCBzaXRlIGZ1bmN0aW9ucyB3aGljaCBhY2NvdW50IGZvciBzb21lIHBlcmNlbnRhZ2UKKwkgb2YgdGhlIGFyY3MuICAqLworCisgICAgICBhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOworICAgICAgd2hpbGUgKGFyYykKKwl7CisJICBpZiAoYXJjLT5wYXJlbnQgIT0gYXJjLT5jaGlsZCkKKwkgICAgc2NyYXRjaF9hcmNzW3NjcmF0Y2hfYXJjX2NvdW50KytdID0gYXJjOworCSAgYXJjLT5oYXNfYmVlbl9wbGFjZWQgPSAxOworCSAgYXJjID0gYXJjLT5uZXh0X2NoaWxkOworCX0KKworICAgICAgYXJjID0gc3ltLT5jZy5wYXJlbnRzOworICAgICAgd2hpbGUgKGFyYykKKwl7CisJICBpZiAoYXJjLT5wYXJlbnQgIT0gYXJjLT5jaGlsZCkKKwkgICAgc2NyYXRjaF9hcmNzW3NjcmF0Y2hfYXJjX2NvdW50KytdID0gYXJjOworCSAgYXJjLT5oYXNfYmVlbl9wbGFjZWQgPSAxOworCSAgYXJjID0gYXJjLT5uZXh0X3BhcmVudDsKKwl9CisKKyAgICAgIC8qIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgc3ltYm9scyB3ZSdyZSBnb2luZyB0byBwbGFjZS4gICovCisgICAgICBzY3JhdGNoX2luZGV4ID0gaW5kZXg7CisKKyAgICAgIC8qIEEgbGllLCBidXQgaXQgbWFrZXMgaWRlbnRpZnlpbmcgdGhlc2UgZnVuY3Rpb25zIGVhc2llcgorCSBsYXRlci4gICovCisgICAgICBzeW0tPmhhc19iZWVuX3BsYWNlZCA9IDE7CisgICAgfQorCisgIC8qIE5vdyB3YWxrIHRocm91Z2ggdGhlIHRlbXBvcmFyeSBhcmNzIGFuZCBjb3B5IHRob3NlIHdlIGNhcmUgYWJvdXQKKyAgICAgaW50byB0aGUgaGlnaCBhcmNzIGFycmF5LiAgKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2NyYXRjaF9hcmNfY291bnQ7IGluZGV4KyspCisgICAgeworICAgICAgQXJjICphcmMgPSBzY3JhdGNoX2FyY3NbaW5kZXhdOworCisgICAgICAvKiBJZiB0aGlzIGFyYyByZWZlcnMgdG8gaGlnaGx5IHVzZWQgZnVuY3Rpb25zLCB0aGVuCisJIHRoZW4gd2Ugd2FudCB0byBrZWVwIGl0LiAgKi8KKyAgICAgIGlmIChhcmMtPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQKKwkgICYmIGFyYy0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQpCisJeworCSAgaGlnaF9hcmNzW2hpZ2hfYXJjX2NvdW50KytdID0gc2NyYXRjaF9hcmNzW2luZGV4XTsKKworCSAgLyogV2UgbmVlZCB0byB0dXJuIG9mIGhhc19iZWVuX3BsYWNlZCBzaW5jZSB3ZSdyZSBnb2luZyB0bworCSAgICAgdXNlIHRoZSBtYWluIGFyYyBwbGFjZW1lbnQgYWxnb3JpdGhtIG9uIHRoZXNlIGFyY3MuICAqLworCSAgYXJjLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkID0gMDsKKwkgIGFyYy0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQgPSAwOworCX0KKyAgICB9CisKKyAgLyogRHVtcCB0aGUgbXVsdGktc2l0ZSBoaWdoIHVzYWdlIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGdvaW5nCisgICAgIHRvIGJlIG9yZGVyZWQgYnkgdGhlIG1haW4gb3JkZXJpbmcgYWxnb3JpdGhtLiAgKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2NyYXRjaF9pbmRleDsgaW5kZXgrKykKKyAgICB7CisgICAgICBpZiAoc2NyYXRjaF9zeW1zW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkKQorCXByaW50ZiAoIiVzXG4iLCBzY3JhdGNoX3N5bXNbaW5kZXhdLT5uYW1lKTsKKyAgICB9CisKKyAgLyogTm93IHdlIGNhbiBvcmRlciB0aGUgbXVsdGktc2l0ZSBoaWdoIHVzZSBmdW5jdGlvbnMgYmFzZWQgb24gdGhlCisgICAgIGFyY3MgYmV0d2VlbiB0aGVtLiAgKi8KKyAgcXNvcnQgKGhpZ2hfYXJjcywgaGlnaF9hcmNfY291bnQsIHNpemVvZiAoQXJjICopLCBjbXBfYXJjX2NvdW50KTsKKyAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGhpZ2hfYXJjcywgaGlnaF9hcmNfY291bnQsIDEsCisJCQkJICAgIHVucGxhY2VkX2FyY3MsICZ1bnBsYWNlZF9hcmNfY291bnQpOworCisgIC8qIE9yZGVyIGFuZCBkdW1wIHRoZSBoaWdoIHVzZSBmdW5jdGlvbnMgbGVmdCwgdGhlc2UgdHlwaWNhbGx5CisgICAgIGhhdmUgb25seSBhIGZldyBjYWxsIHNpdGVzLiAgKi8KKyAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCisJCQkJICAgIHVucGxhY2VkX2FyY3MsICZ1bnBsYWNlZF9hcmNfY291bnQpOworCisgIC8qIE5vdyBwbGFjZSB0aGUgcmFyZWx5IHVzZWQgZnVuY3Rpb25zLiAgKi8KKyAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKHVucGxhY2VkX2FyY3MsIHVucGxhY2VkX2FyY19jb3VudCwgMSwKKwkJCQkgICAgc2NyYXRjaF9hcmNzLCAmc2NyYXRjaF9hcmNfY291bnQpOworCisgIC8qIE91dHB1dCBhbnkgZnVuY3Rpb25zIG5vdCBlbWl0dGVkIGJ5IHRoZSBvcmRlcl9hbmRfZHVtcCBjYWxscy4gICovCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVzZWQ7IGluZGV4KyspCisgICAgaWYgKHVzZWRfc3ltc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9PSAwKQorICAgICAgcHJpbnRmKCIlc1xuIiwgdXNlZF9zeW1zW2luZGV4XS0+bmFtZSk7CisKKyAgLyogT3V0cHV0IHRoZSB1bnVzZWQgZnVuY3Rpb25zLiAgKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdW51c2VkOyBpbmRleCsrKQorICAgIHByaW50ZigiJXNcbiIsIHVudXNlZF9zeW1zW2luZGV4XS0+bmFtZSk7CisKKyAgdW51c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOworICB1c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOworICBzY3JhdGNoX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOworICBoaWdoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOworICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOworICB1bnBsYWNlZF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKKworICBmcmVlICh1bnVzZWRfc3ltcyk7CisgIGZyZWUgKHVzZWRfc3ltcyk7CisgIGZyZWUgKHNjcmF0Y2hfc3ltcyk7CisgIGZyZWUgKGhpZ2hfYXJjcyk7CisgIGZyZWUgKHNjcmF0Y2hfYXJjcyk7CisgIGZyZWUgKHVucGxhY2VkX2FyY3MpOworfQorCisvKiBQbGFjZSBmdW5jdGlvbnMgYmFzZWQgb24gdGhlIGFyY3MgaW4gQVJDUyB3aXRoIE5VTUFSQ1MgZW50cmllczsKKyAgIHBsYWNlIHVudXNlZCBhcmNzIGludG8gVU5QTEFDRURfQVJDUy9VTlBMQUNFRF9BUkNfQ09VTlQuCisKKyAgIElmIEFMTCBpcyBub256ZXJvLCB0aGVuIHBsYWNlIGFsbCBmdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBBUkNTLAorICAgZWxzZSBvbmx5IHBsYWNlIHRob3NlIHJlZmVyZW5jZWQgaW4gdGhlIHRvcCA5OSUgb2YgdGhlIGFyY3MgaW4gQVJDUy4gICovCisKKyNkZWZpbmUgTU9TVCAwLjk5CitzdGF0aWMgdm9pZAorb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIGFsbCwKKwkJCQkgIHVucGxhY2VkX2FyY3MsIHVucGxhY2VkX2FyY19jb3VudCkKKyAgICAgQXJjICoqYXJjczsKKyAgICAgdW5zaWduZWQgbG9uZyBudW1hcmNzOworICAgICBpbnQgYWxsOworICAgICBBcmMgKip1bnBsYWNlZF9hcmNzOworICAgICB1bnNpZ25lZCBsb25nICp1bnBsYWNlZF9hcmNfY291bnQ7Cit7CisjaWZkZWYgX19HTlVDX18KKyAgdW5zaWduZWQgbG9uZyBsb25nIHRtcF9hcmNzLCB0b3RhbF9hcmNzOworI2Vsc2UKKyAgdW5zaWduZWQgbG9uZyB0bXBfYXJjcywgdG90YWxfYXJjczsKKyNlbmRpZgorICB1bnNpZ25lZCBpbnQgaW5kZXg7CisKKyAgLyogSWYgbmVlZGVkLCBjb21wdXRlIHRoZSB0b3RhbCBhcmMgY291bnQuCisKKyAgICAgTm90ZSB3ZSBkb24ndCBjb21wZW5zYXRlIGZvciBvdmVyZmxvdyBpZiB0aGF0IGhhcHBlbnMhICAqLworICBpZiAoISBhbGwpCisgICAgeworICAgICAgdG90YWxfYXJjcyA9IDA7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQorCXRvdGFsX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OworICAgIH0KKyAgZWxzZQorICAgIHRvdGFsX2FyY3MgPSAwOworCisgIHRtcF9hcmNzID0gMDsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKKyAgICB7CisgICAgICBTeW0gKnN5bTEsICpzeW0yOworICAgICAgU3ltICpjaGlsZCwgKnBhcmVudDsKKworICAgICAgdG1wX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OworCisgICAgICAvKiBJZ25vcmUgdGhpcyBhcmMgaWYgaXQncyBhbHJlYWR5IGJlZW4gcGxhY2VkLiAgKi8KKyAgICAgIGlmIChhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkKQorCWNvbnRpbnVlOworCisgICAgICBjaGlsZCA9IGFyY3NbaW5kZXhdLT5jaGlsZDsKKyAgICAgIHBhcmVudCA9IGFyY3NbaW5kZXhdLT5wYXJlbnQ7CisKKyAgICAgIC8qIElmIHdlJ3JlIG5vdCB1c2luZyBhbGwgYXJjcywgYW5kIHRoaXMgaXMgYSByYXJlbHkgdXNlZAorCSBhcmMsIHRoZW4gcHV0IGl0IG9uIHRoZSB1bnBsYWNlZF9hcmMgbGlzdC4gIFNpbWlsYXJseQorCSBpZiBib3RoIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG9mIHRoaXMgYXJjIGhhdmUgYmVlbiBwbGFjZWQuICAqLworICAgICAgaWYgKCghIGFsbCAmJiAoZG91YmxlKXRtcF9hcmNzIC8gKGRvdWJsZSl0b3RhbF9hcmNzID4gTU9TVCkKKwkgIHx8IGNoaWxkLT5oYXNfYmVlbl9wbGFjZWQgfHwgcGFyZW50LT5oYXNfYmVlbl9wbGFjZWQpCisJeworCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSWYgYWxsIHNsb3RzIGluIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGFyZSBmdWxsLCB0aGVuIHRoZXJlIGlzbid0CisJIGFueXRoaW5nIHdlIGNhbiBkbyByaWdodCBub3cuICBXZSdsbCBwbGFjZSB0aGlzIGFyYyBvbiB0aGUKKwkgdW5wbGFjZWQgYXJjIGxpc3QgaW4gdGhlIGhvcGUgdGhhdCBhIGdsb2JhbCBwb3NpdGlvbmluZworCSBhbGdvcml0aG0gY2FuIHVzZSBpdCB0byBwbGFjZSBmdW5jdGlvbiBjaGFpbnMuICAqLworICAgICAgaWYgKHBhcmVudC0+bmV4dCAmJiBwYXJlbnQtPnByZXYgJiYgY2hpbGQtPm5leHQgJiYgY2hpbGQtPnByZXYpCisJeworCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSWYgdGhlIHBhcmVudCBpcyB1bmF0dGFjaGVkLCB0aGVuIGZpbmQgdGhlIGNsb3Nlc3QKKwkgcGxhY2UgdG8gYXR0YWNoIGl0IG9udG8gY2hpbGQncyBjaGFpbi4gICBTaW1pbGFybHkKKwkgZm9yIHRoZSBvcHBvc2l0ZSBjYXNlLiAgKi8KKyAgICAgIGlmICghcGFyZW50LT5uZXh0ICYmICFwYXJlbnQtPnByZXYpCisJeworCSAgaW50IG5leHRfY291bnQgPSAwOworCSAgaW50IHByZXZfY291bnQgPSAwOworCSAgU3ltICpwcmV2ID0gY2hpbGQ7CisJICBTeW0gKm5leHQgPSBjaGlsZDsKKworCSAgLyogV2FsayB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGNoaWxkJ3MgY2hhaW4uICAqLworCSAgd2hpbGUgKG5leHQtPm5leHQpCisJICAgIHsKKwkgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKKwkgICAgICBuZXh0X2NvdW50Kys7CisJICAgIH0KKworCSAgd2hpbGUgKHByZXYtPnByZXYpCisJICAgIHsKKwkgICAgICBwcmV2ID0gcHJldi0+cHJldjsKKwkgICAgICBwcmV2X2NvdW50Kys7CisJICAgIH0KKwkgIAorCSAgLyogQ2hvb3NlIHRoZSBjbG9zZXN0LiAgKi8KKwkgIGNoaWxkID0gbmV4dF9jb3VudCA8IHByZXZfY291bnQgPyBuZXh0IDogcHJldjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCEgY2hpbGQtPm5leHQgJiYgIWNoaWxkLT5wcmV2KQorCXsKKwkgIGludCBuZXh0X2NvdW50ID0gMDsKKwkgIGludCBwcmV2X2NvdW50ID0gMDsKKwkgIFN5bSAqcHJldiA9IHBhcmVudDsKKwkgIFN5bSAqbmV4dCA9IHBhcmVudDsKKworCSAgd2hpbGUgKG5leHQtPm5leHQpCisJICAgIHsKKwkgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKKwkgICAgICBuZXh0X2NvdW50Kys7CisJICAgIH0KKworCSAgd2hpbGUgKHByZXYtPnByZXYpCisJICAgIHsKKwkgICAgICBwcmV2ID0gcHJldi0+cHJldjsKKwkgICAgICBwcmV2X2NvdW50Kys7CisJICAgIH0KKworCSAgcGFyZW50ID0gcHJldl9jb3VudCA8IG5leHRfY291bnQgPyBwcmV2IDogbmV4dDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQ291bGRuJ3QgZmluZCBhbnl3aGVyZSB0byBhdHRhY2ggdGhlIGZ1bmN0aW9ucywKKwkgICAgIHB1dCB0aGUgYXJjIG9uIHRoZSB1bnBsYWNlZCBhcmMgbGlzdC4gICovCisJICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGllIHR3byBlbmRzIHRvZ2V0aGVyLiAgKi8KKyAgICAgIHN5bTEgPSBwYXJlbnQ7CisgICAgICBpZiAoc3ltMS0+bmV4dCkKKwl3aGlsZSAoc3ltMS0+bmV4dCkKKwkgIHN5bTEgPSBzeW0xLT5uZXh0OworICAgICAgZWxzZQorCXdoaWxlIChzeW0xLT5wcmV2KQorCSAgc3ltMSA9IHN5bTEtPnByZXY7CisKKyAgICAgIHN5bTIgPSBjaGlsZDsKKyAgICAgIGlmIChzeW0yLT5uZXh0KQorCXdoaWxlIChzeW0yLT5uZXh0KQorCSAgc3ltMiA9IHN5bTItPm5leHQ7CisgICAgICBlbHNlCisJd2hpbGUgKHN5bTItPnByZXYpCisJICBzeW0yID0gc3ltMi0+cHJldjsKKworICAgICAgaWYgKHN5bTEgPT0gY2hpbGQKKwkgICYmIHN5bTIgPT0gcGFyZW50KQorCXsKKwkgIC8qIFRoaXMgd291bGQgdGllIHR3byBlbmRzIHRvZ2V0aGVyLiAgKi8KKwkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChwYXJlbnQtPm5leHQpCisJeworCSAgLyogTXVzdCBhdHRhY2ggdG8gdGhlIHBhcmVudCdzIHByZXYgZmllbGQuICAqLworCSAgaWYgKCEgY2hpbGQtPm5leHQpCisJICAgIHsKKwkgICAgICAvKiBwYXJlbnQtcHJldiBhbmQgY2hpbGQtbmV4dCAqLworCSAgICAgIHBhcmVudC0+cHJldiA9IGNoaWxkOworCSAgICAgIGNoaWxkLT5uZXh0ID0gcGFyZW50OworCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAocGFyZW50LT5wcmV2KQorCXsKKwkgIC8qIE11c3QgYXR0YWNoIHRvIHRoZSBwYXJlbnQncyBuZXh0IGZpZWxkLiAgKi8KKwkgIGlmICghIGNoaWxkLT5wcmV2KQorCSAgICB7CisJICAgICAgLyogcGFyZW50LW5leHQgYW5kIGNoaWxkLXByZXYgKi8KKwkgICAgICBwYXJlbnQtPm5leHQgPSBjaGlsZDsKKwkgICAgICBjaGlsZC0+cHJldiA9IHBhcmVudDsKKwkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBDYW4gYXR0YWNoIHRvIGVpdGhlciBmaWVsZCBpbiB0aGUgcGFyZW50LCBkZXBlbmRzCisJICAgICBvbiB3aGVyZSB3ZSd2ZSBnb3Qgc3BhY2UgaW4gdGhlIGNoaWxkLiAgKi8KKwkgIGlmIChjaGlsZC0+cHJldikKKwkgICAgeworCSAgICAgIC8qIHBhcmVudC1wcmV2IGFuZCBjaGlsZC1uZXh0ICovCisJICAgICAgcGFyZW50LT5wcmV2ID0gY2hpbGQ7CisJICAgICAgY2hpbGQtPm5leHQgPSBwYXJlbnQ7CisJICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIHBhcmVudC1uZXh0IGFuZCBjaGlsZC1wcmV2ICovCisJICAgICAgcGFyZW50LT5uZXh0ID0gY2hpbGQ7CisJICAgICAgY2hpbGQtPnByZXYgPSBwYXJlbnQ7CisJICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIER1bXAgdGhlIGNoYWlucyBvZiBmdW5jdGlvbnMgd2UndmUgbWFkZS4gICovCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCisgICAgeworICAgICAgU3ltICpzeW07CisgICAgICBpZiAoYXJjc1tpbmRleF0tPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkCisJICB8fCBhcmNzW2luZGV4XS0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCkKKwljb250aW51ZTsKKworICAgICAgc3ltID0gYXJjc1tpbmRleF0tPnBhcmVudDsKKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYXR0YWNoZWQgdG8gYW55IG90aGVyCisJIHN5bWJvbHMsIHRoZW4gd2UndmUgZ290IGEgcmFyZWx5IHVzZWQgYXJjLgorCisJIFNraXAgaXQgZm9yIG5vdywgd2UnbGwgZGVhbCB3aXRoIHRoZW0gbGF0ZXIuICAqLworICAgICAgaWYgKHN5bS0+bmV4dCA9PSBOVUxMCisJICAmJiBzeW0tPnByZXYgPT0gTlVMTCkKKwljb250aW51ZTsKKworICAgICAgLyogR2V0IHRvIHRoZSBzdGFydCBvZiB0aGlzIGNoYWluLiAgKi8KKyAgICAgIHdoaWxlIChzeW0tPnByZXYpCisJc3ltID0gc3ltLT5wcmV2OworCisgICAgICB3aGlsZSAoc3ltKQorCXsKKwkgIC8qIE1hcmsgaXQgYXMgcGxhY2VkLiAgKi8KKwkgIHN5bS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKKwkgIHByaW50ZiAoIiVzXG4iLCBzeW0tPm5hbWUpOworCSAgc3ltID0gc3ltLT5uZXh0OworCX0KKyAgICB9CisKKyAgLyogSWYgd2Ugd2FudCB0byBwbGFjZSBhbGwgdGhlIGFyY3MsIHRoZW4gb3V0cHV0IHRob3NlIHdoaWNoIHdlcmVuJ3QKKyAgICAgcGxhY2VkIGJ5IHRoZSBtYWluIGFsZ29yaXRobS4gICovCisgIGlmIChhbGwpCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKKyAgICAgIHsKKwlTeW0gKnN5bTsKKwlpZiAoYXJjc1tpbmRleF0tPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkCisJICAgIHx8IGFyY3NbaW5kZXhdLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkKQorCSAgY29udGludWU7CisKKwlzeW0gPSBhcmNzW2luZGV4XS0+cGFyZW50OworCisJc3ltLT5oYXNfYmVlbl9wbGFjZWQgPSAxOworCXByaW50ZiAoIiVzXG4iLCBzeW0tPm5hbWUpOworICAgICAgfQorfQorCisvKiBQcmludCBhIHN1Z2dlc3RlZCAubyBvcmRlcmluZyBmb3IgZmlsZXMgb24gYSBsaW5rIGxpbmUgYmFzZWQKKyAgIG9uIHByb2ZpbGluZyBpbmZvcm1hdGlvbi4gIFRoaXMgdXNlcyB0aGUgZnVuY3Rpb24gcGxhY2VtZW50CisgICBjb2RlIGZvciB0aGUgYnVsayBvZiBpdHMgd29yay4gICovCisKK3N0cnVjdCBmdW5jdGlvbl9tYXAgeworICBjaGFyICpmdW5jdGlvbl9uYW1lOworICBjaGFyICpmaWxlX25hbWU7Cit9OworCit2b2lkCitERUZVTl9WT0lEIChjZ19wcmludF9maWxlX29yZGVyaW5nKQoreworICB1bnNpZ25lZCBsb25nIHNjcmF0Y2hfYXJjX2NvdW50LCBpbmRleDsKKyAgQXJjICoqc2NyYXRjaF9hcmNzOworICBleHRlcm4gc3RydWN0IGZ1bmN0aW9uX21hcCAqc3ltYm9sX21hcDsKKyAgZXh0ZXJuIHVuc2lnbmVkIGludCBzeW1ib2xfbWFwX2NvdW50OworICBjaGFyICpsYXN0OworCisgIHNjcmF0Y2hfYXJjX2NvdW50ID0gMDsKKworICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQorICAgIHsKKyAgICAgIGlmICghIGFyY3NbaW5kZXhdLT5wYXJlbnQtPm1hcHBlZAorCSAgfHwgISBhcmNzW2luZGV4XS0+Y2hpbGQtPm1hcHBlZCkKKwlhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKKyAgICB9CisKKyAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCisJCQkJICAgIHNjcmF0Y2hfYXJjcywgJnNjcmF0Y2hfYXJjX2NvdW50KTsKKworICAvKiBPdXRwdXQgLm8ncyBub3QgaGFuZGxlZCBieSB0aGUgbWFpbiBwbGFjZW1lbnQgYWxnb3JpdGhtLiAgKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKKyAgICB7CisgICAgICBpZiAoc3ltdGFiLmJhc2VbaW5kZXhdLm1hcHBlZAorCSAgJiYgISBzeW10YWIuYmFzZVtpbmRleF0uaGFzX2JlZW5fcGxhY2VkKQorCXByaW50ZiAoIiVzXG4iLCBzeW10YWIuYmFzZVtpbmRleF0ubmFtZSk7CisgICAgfQorCisgIC8qIE5vdyBvdXRwdXQgYW55IC5vJ3MgdGhhdCBkaWRuJ3QgaGF2ZSBhbnkgdGV4dCBzeW1ib2xzLiAgKi8KKyAgbGFzdCA9IE5VTEw7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bWJvbF9tYXBfY291bnQ7IGluZGV4KyspCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGluZGV4MjsKKworICAgICAgLyogRG9uJ3QgYm90aGVyIHNlYXJjaGluZyBpZiB0aGlzIHN5bWJvbCBpcyB0aGUKKwkgc2FtZSBhcyB0aGUgcHJldmlvdXMgb25lLiAgKi8KKyAgICAgIGlmIChsYXN0ICYmICFzdHJjbXAgKGxhc3QsIHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZSkpCisJY29udGludWU7CisKKyAgICAgIGZvciAoaW5kZXgyID0gMDsgaW5kZXgyIDwgc3ltdGFiLmxlbjsgaW5kZXgyKyspCisJeworCSAgaWYgKCEgc3ltdGFiLmJhc2VbaW5kZXgyXS5tYXBwZWQpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoIXN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXgyXS5uYW1lLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGl0IGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZW4gaXQgbXVzdCBiZSBhIC5vCisJIHdpdGggbm8gdGV4dCBzeW1ib2xzLiAgT3V0cHV0IGl0IGxhc3QuICAqLworICAgICAgaWYgKGluZGV4MiA9PSBzeW10YWIubGVuKQorCXByaW50ZiAoIiVzXG4iLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpOworICAgICAgbGFzdCA9IHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZTsKKyAgICB9IAorfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuaCBiL2dwcm9mL2NnX3ByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyYzRhYQotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NnX3ByaW50LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBjZ19wcmludF9oCisjZGVmaW5lIGNnX3ByaW50X2gKKworI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisKK2V4dGVybiBkb3VibGUgcHJpbnRfdGltZTsJLyogdG90YWwgb2YgdGltZSBiZWluZyBwcmludGVkICovCisKK2V4dGVybiB2b2lkIGNnX3ByaW50IFBBUkFNUyAoKFN5bSAqKiBjZykpOworZXh0ZXJuIHZvaWQgY2dfcHJpbnRfaW5kZXggUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgY2dfcHJpbnRfZmlsZV9vcmRlcmluZyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbmRpZiAvKiBjZ19wcmludF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jb25maWd1cmUgYi9ncHJvZi9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWZmNTEzNwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDQ0MDMgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWdwcm9mLmMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTkwOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxMTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjI5OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY2NDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MTc6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCisgICBmaQorICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KKyAgIGZpCisKKyAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIieWVzIiAxPiY2CitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzc0OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKKworUEFDS0FHRT1ncHJvZgorCitWRVJTSU9OPTIuOS40CisKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQorZmkKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorRU9GCisKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorRU9GCisKKworCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODIwOiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQUNMT0NBTD1hY2xvY2FsCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT0NPTkY9YXV0b2NvbmYKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NDY6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9NQUtFPWF1dG9tYWtlCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NTk6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODcyOiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBNQUtFSU5GTz1tYWtlaW5mbworICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CitubykgZW5hYmxlX3N0YXRpYz1ubyA7OworKikKKyAgZW5hYmxlX3N0YXRpYz1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3N0YXRpYz15ZXMKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CitubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworKikKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTU4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5ODg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTAxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorCisjbGluZSAxMTEyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTExNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTQzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE0ODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTc2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgorICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCisKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIxOTogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKKyAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAorICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjQzOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKK2Vsc2UKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNDY6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworICAgICAgZWxzZQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitlbHNlCisgIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRhY19jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJExEIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3Rlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjgyOiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICBhY19jdl9wcm9nX2dudV9sZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2CisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjk4OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBhY19jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCisJYnJlYWsKKyAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKKwlicmVhaworICAgICAgZWxzZQorCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KK2ZpCitmaQorCitOTT0iJGFjX2N2X3BhdGhfTk0iCitlY2hvICIkYWNfdCIiJE5NIiAxPiY2CisKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMzNjogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCithY19zeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK2FjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK2FjX3N5bXhmcm09J1wxIFwyXDMgXDMnCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2FjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4KikKKyAgYWNfc3ltY29kZT0nW0JDRFRdJworICA7OworY3lnd2luKiB8IG1pbmd3KikKKyAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikKKyAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgIDs7Citpcml4KikKKyAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK3NvbGFyaXMqKQorICBhY19zeW1jb2RlPSdbQkRUXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitpZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKyAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCitmaQorCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIGFjX3BpcGVfd29ya3M9bm8KKyAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmMoKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgorCisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgIAorICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwMzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKworICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRhY19ubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJworCisJICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyX3QgYWRkcmVzczsKK30KK2x0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQoreworRU9GCisJc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCisJY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAorCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKwkgICAgYWNfcGlwZV93b3Jrcz15ZXMKKwkgIGVsc2UKKwkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKwkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisJICBmaQorCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgZWxzZQorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCisgICAgZmkKKyAgICBicmVhaworICBlbHNlCisgICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworCithY19yZXN1bHQ9eWVzCitpZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgIGFjX3Jlc3VsdD1ubworZmkKK2VjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTAxOiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCit2b2lkIG5tX3Rlc3RfZnVuYygpe30KK2ludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICBhY19ubGlzdD1jb25mdGVzdC5ubQorICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTM6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisgICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgorICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgZWxzZQorICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1CisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC5jID4mNQorZmkKK3JtIC1yZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKK1VTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTUzOTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgcm0gLWYgY29uZnRlc3RkYXRhCitpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAordGhlbgorICBybSAtZiBjb25mdGVzdGRhdGEKKyAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19MTl9TPWxuCitmaQorZmkKK0xOX1M9IiRhY19jdl9wcm9nX0xOX1MiCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCisgIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCitlbHNlCisgIGFjX3Rvb2xfcHJlZml4PQorZmkKKworCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgorbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKK3Rlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCit0ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgordGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICIkaG9zdCIgaW4KKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnI2xpbmUgMTU4MSAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU4MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjAzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYwOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2CisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CisKKyotKi1jeWd3aW4qKQorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2Mzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgorZmkKK2ZpCitETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgoraWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2Vsc2UKKyAgRExMVE9PTD0iZmFsc2UiCitmaQorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQVM9IiRhY19jdl9wcm9nX0FTIgoraWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTczNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0FTPSJhcyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgorZmkKK2ZpCitBUz0iJGFjX2N2X3Byb2dfQVMiCitpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIEFTPSJmYWxzZSIKK2ZpCitmaQorCisKKyAgOzsKKworZXNhYworCisjIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKK2Vsc2UKKyAgbmVlZF9sb2Nrcz15ZXMKK2ZpCisKKworaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgorICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKK2ZpCisKKworIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCisKKyMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCitDQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKK0xEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKK0RMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCiske0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCiskbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAorfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQorCisjIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworCisjIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAorIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KK2V4ZWMgNT4+Li9jb25maWcubG9nCisKKworCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5MDU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTU2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTg4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorCisjbGluZSAxOTk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDMwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAzNTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDYzOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxMDY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNjA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworCitBTExfTElOR1VBUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTgzOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxOTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNjM6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyNjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI5MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzY3OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQyMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDQyOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDU2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ4MjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTE1OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1MjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1NTA6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTgzOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1ODggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2NDg6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNjUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY3ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjY4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3MzM6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzQxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc4NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3OTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjgyOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODc3OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODg1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA1MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDkzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxNTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxNTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjEyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMyMTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI0NTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjY1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyODQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMyODkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzI5NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMTE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzMxNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzM5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM0NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNzQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDQ4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0NzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTM5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1Nzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM2ODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3NzE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3OTk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM4MDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzgwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODcyOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX01BSU5UQUlORVJfTU9ERT1ubworZmkKKworICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKKyAgCisKK2lmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9CisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKK2Vsc2UKKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KK2ZpCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICAKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzg5NTogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzkwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisjaWZuZGVmIF9fQ1lHV0lOX18KKyNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KKyNlbmRpZgorcmV0dXJuIF9fQ1lHV0lOX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkxMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2N5Z3dpbj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY3lnd2luPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2CitDWUdXSU49Cit0ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzkyODogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzOTMzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gX19NSU5HVzMyX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X21pbmd3MzI9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X21pbmd3MzI9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2CitNSU5HVzMyPQordGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozOTU5OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgorICBhY19jdl9leGVleHQ9LmV4ZQorZWxzZQorICBybSAtZiBjb25mdGVzdCoKKyAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X2V4ZWV4dD0KKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCisgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKKyAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KgorICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCitmaQorZmkKKworRVhFRVhUPSIiCit0ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgorYWNfZXhlZXh0PSRFWEVFWFQKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBnY29uZmlnLmg6Z2NvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVARkZMQUdTQCUkRkZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKK3MlQFZFUlNJT05AJSRWRVJTSU9OJWcKK3MlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKK3MlQEFVVE9DT05GQCUkQVVUT0NPTkYlZworcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCitzJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCitzJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQENDQCUkQ0MlZworcyVATERAJSRMRCVnCitzJUBOTUAlJE5NJWcKK3MlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCitzJUBMTl9TQCUkTE5fUyVnCitzJUBETExUT09MQCUkRExMVE9PTCVnCitzJUBBU0AlJEFTJWcKK3MlQExJQlRPT0xAJSRMSUJUT09MJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKK3MlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJnY29uZmlnLmg6Z2NvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCit0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAorc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlLmJhdCBiL2dwcm9mL2NvbmZpZ3VyZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlZjM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2NvbmZpZ3VyZS5iYXQKQEAgLTAsMCArMSwxOCBAQAorQGVjaG8gb2ZmDQorZWNobyBDb25maWd1cmluZyBncHJvZiBmb3IgZ28zMg0KK3JlbSBUaGlzIGJhdGNoIGZpbGUgYXNzdW1lcyBhIHVuaXgtdHlwZSAic2VkIiBwcm9ncmFtDQorDQorZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQorDQoraWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KKw0KK2VjaG8gIi9eIyMjJC8gaVwJCQkJIj4+Y29uZmlnLnNlZA0KK2VjaG8gIk1ZX01BQ0hJTkU9aTM4NlwJCQkJIj4+Y29uZmlnLnNlZA0KK2VjaG8gIkNDPWdjYwkJCQkJIj4+Y29uZmlnLnNlZA0KKw0KK2VjaG8gIyA+PiBjb25maWcuc2VkDQorDQorc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KK3NlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KK2RlbCBjb25maWcuc2VkDQorZGVsIGNvbmZpZzIuc2VkDQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlLmluIGIvZ3Byb2YvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGI1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwyOSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19QUkVSRVEoMi4xMykKK0FDX0lOSVQoZ3Byb2YuYykKKworQUNfQ0FOT05JQ0FMX1NZU1RFTQorCitBTV9JTklUX0FVVE9NQUtFKGdwcm9mLCAyLjkuNCkKKworQU1fUFJPR19MSUJUT09MCisKK2RubCBGb3Igc2ltcGxpY2l0eSwgd2UgdXNlIHRoZSBCRkQgY29uZmlndXJhdGlvbiBmaWxlIGZvciBtb3N0CitkbmwgdGhpbmdzLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIG91ciBvd24gY29uZmlndXJhdGlvbiBmaWxlIGZvcgorZG5sIHRoZSBhdXRvbWFrZSBQQUNLQUdFIGFuZCBWRVJTSU9OIG1hY3Jvcy4gIFdlIGRvbid0IG5hbWUgaXQKK2RubCBjb25maWcuaCwgdG8gYXZvaWQgYW55IHBvc3NpYmxlIGNvbmZ1c2lvbiB3aXRoIHRoZSBiZmQgY29uZmlnLmguCitBTV9DT05GSUdfSEVBREVSKGdjb25maWcuaDpnY29uZmlnLmluKQorCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKKworQUNfSVNDX1BPU0lYCisKK0FMTF9MSU5HVUFTPQorQ1lfR05VX0dFVFRFWFQKKworQU1fTUFJTlRBSU5FUl9NT0RFCitBQ19FWEVFWFQKKworQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCitbc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2dwcm9mL2NvcmVmaWxlLmMgYi9ncHJvZi9jb3JlZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTZmODMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9jb3JlZmlsZS5jCkBAIC0wLDAgKzEsNzYyIEBACisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJjb3JlZmlsZS5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorCitiZmQgKmNvcmVfYmZkOworaW50IGNvcmVfbnVtX3N5bXM7Cithc3ltYm9sICoqY29yZV9zeW1zOworYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OworUFRSIGNvcmVfdGV4dF9zcGFjZTsKKworaW50IG1pbl9pbnNuX3NpemU7CitpbnQgb2Zmc2V0X3RvX2NvZGU7CisKKy8qIEZvciBtYXBwaW5nIHN5bWJvbHMgdG8gc3BlY2lmaWMgLm8gZmlsZXMgZHVyaW5nIGZpbGUgb3JkZXJpbmcuICAqLworc3RydWN0IGZ1bmN0aW9uX21hcCB7CisgIGNoYXIgKmZ1bmN0aW9uX25hbWU7CisgIGNoYXIgKmZpbGVfbmFtZTsKK307CisKK3N0cnVjdCBmdW5jdGlvbl9tYXAgKnN5bWJvbF9tYXA7Cit1bnNpZ25lZCBpbnQgc3ltYm9sX21hcF9jb3VudDsKKworZXh0ZXJuIHZvaWQgaTM4Nl9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKK2V4dGVybiB2b2lkIGFscGhhX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOworZXh0ZXJuIHZvaWQgdmF4X2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOworZXh0ZXJuIHZvaWQgdGFob2VfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7CitleHRlcm4gdm9pZCBzcGFyY19maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKKworc3RhdGljIHZvaWQKK0RFRlVOIChyZWFkX2Z1bmN0aW9uX21hcHBpbmdzLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgRklMRSAqZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKKyAgY2hhciBkdW1teVsxMDI0XTsKKyAgaW50IGNvdW50ID0gMDsKKworICBpZiAoIWZpbGUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY291bGQgbm90IG9wZW4gJXMuXG4iKSwgd2hvYW1pLCBmaWxlbmFtZSk7CisgICAgICBkb25lICgxKTsKKyAgICB9CisKKyAgLyogRmlyc3QgcGFyc2UgdGhlIG1hcHBpbmcgZmlsZSBzbyB3ZSBrbm93IGhvdyBiaWcgd2UgbmVlZCB0bworICAgICBtYWtlIG91ciB0YWJsZXMuICBXZSBhbHNvIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBhdCB0aGlzCisgICAgIHRpbWUuICAqLworICB3aGlsZSAoIWZlb2YgKGZpbGUpKQorICAgIHsKKyAgICAgIGludCBtYXRjaGVzOworCisgICAgICBtYXRjaGVzID0gZnNjYW5mIChmaWxlLCAiJVteXG46XSIsIGR1bW15KTsKKyAgICAgIGlmICghbWF0Y2hlcykKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIiksCisJCSAgIHdob2FtaSwgZmlsZW5hbWUpOworCSAgZG9uZSAoMSk7CisJfQorCisgICAgICAvKiBKdXN0IHNraXAgbWVzc2FnZXMgYWJvdXQgZmlsZXMgd2l0aCBubyBzeW1ib2xzLiAgKi8KKyAgICAgIGlmICghc3RybmNtcCAoZHVtbXksICJObyBzeW1ib2xzIGluICIsIDE0KSkKKwl7CisJICBmc2NhbmYgKGZpbGUsICJcbiIpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBEb24ndCBjYXJlIHdoYXQgZWxzZSBpcyBvbiB0aGlzIGxpbmUgYXQgdGhpcyBwb2ludC4gICovCisgICAgICBmc2NhbmYgKGZpbGUsICIlW15cbl1cbiIsIGR1bW15KTsKKyAgICAgIGNvdW50Kys7CisgICAgfQorCisgIC8qIE5vdyB3ZSBrbm93IGhvdyBiaWcgd2UgbmVlZCB0byBtYWtlIG91ciB0YWJsZS4gICovCisgIHN5bWJvbF9tYXAgPSAoKHN0cnVjdCBmdW5jdGlvbl9tYXAgKikKKwkJeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKHN0cnVjdCBmdW5jdGlvbl9tYXApKSk7CisKKyAgLyogUmV3aW5kIHRoZSBpbnB1dCBmaWxlIHNvIHdlIGNhbiByZWFkIGl0IGFnYWluLiAgKi8KKyAgcmV3aW5kIChmaWxlKTsKKworICAvKiBSZWFkIGVhY2ggZW50cnkgYW5kIHB1dCBpdCBpbnRvIHRoZSB0YWJsZS4gICovCisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKCFmZW9mIChmaWxlKSkKKyAgICB7CisgICAgICBpbnQgbWF0Y2hlczsKKyAgICAgIGNoYXIgKnRtcDsKKworICAgICAgbWF0Y2hlcyA9IGZzY2FuZiAoZmlsZSwgIiVbXlxuOl0iLCBkdW1teSk7CisgICAgICBpZiAoIW1hdGNoZXMpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIHBhcnNlIG1hcHBpbmcgZmlsZSAlcy5cbiIpLAorCQkgICB3aG9hbWksIGZpbGVuYW1lKTsKKwkgIGRvbmUgKDEpOworCX0KKworICAgICAgLyogSnVzdCBza2lwIG1lc3NhZ2VzIGFib3V0IGZpbGVzIHdpdGggbm8gc3ltYm9scy4gICovCisgICAgICBpZiAoIXN0cm5jbXAgKGR1bW15LCAiTm8gc3ltYm9scyBpbiAiLCAxNCkpCisJeworCSAgZnNjYW5mIChmaWxlLCAiXG4iKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogZHVtbXkgaGFzIHRoZSBmaWxlbmFtZSwgZ28gYWhlYWQgYW5kIGNvcHkgaXQuICAqLworICAgICAgc3ltYm9sX21hcFtjb3VudF0uZmlsZV9uYW1lID0geG1hbGxvYyAoc3RybGVuIChkdW1teSkgKyAxKTsKKyAgICAgIHN0cmNweSAoc3ltYm9sX21hcFtjb3VudF0uZmlsZV9uYW1lLCBkdW1teSk7CisKKyAgICAgIC8qIE5vdyB3ZSBuZWVkIHRoZSBmdW5jdGlvbiBuYW1lLiAgKi8KKyAgICAgIGZzY2FuZiAoZmlsZSwgIiVbXlxuXVxuIiwgZHVtbXkpOworICAgICAgdG1wID0gc3RycmNociAoZHVtbXksICcgJykgKyAxOworICAgICAgc3ltYm9sX21hcFtjb3VudF0uZnVuY3Rpb25fbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAodG1wKSArIDEpOworICAgICAgc3RyY3B5IChzeW1ib2xfbWFwW2NvdW50XS5mdW5jdGlvbl9uYW1lLCB0bXApOworICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgLyogUmVjb3JkIHRoZSBzaXplIG9mIHRoZSBtYXAgdGFibGUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICAqLworICBzeW1ib2xfbWFwX2NvdW50ID0gY291bnQ7Cit9CisKK3ZvaWQKK0RFRlVOIChjb3JlX2luaXQsIChhX291dF9uYW1lKSwgY29uc3QgY2hhciAqYV9vdXRfbmFtZSkKK3sKKyAgY29yZV9iZmQgPSBiZmRfb3BlbnIgKGFfb3V0X25hbWUsIDApOworCisgIGlmICghY29yZV9iZmQpCisgICAgeworICAgICAgcGVycm9yIChhX291dF9uYW1lKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKworICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGNvcmVfYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogbm90IGluIGEub3V0IGZvcm1hdFxuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7CisgICAgICBkb25lICgxKTsKKyAgICB9CisKKyAgLyogZ2V0IGNvcmUncyB0ZXh0IHNlY3Rpb246ICovCisgIGNvcmVfdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiLnRleHQiKTsKKyAgaWYgKCFjb3JlX3RleHRfc2VjdCkKKyAgICB7CisgICAgICBjb3JlX3RleHRfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChjb3JlX2JmZCwgIiRDT0RFJCIpOworICAgICAgaWYgKCFjb3JlX3RleHRfc2VjdCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjYW4ndCBmaW5kIC50ZXh0IHNlY3Rpb24gaW4gJXNcbiIpLAorCQkgICB3aG9hbWksIGFfb3V0X25hbWUpOworCSAgZG9uZSAoMSk7CisJfQorICAgIH0KKworICAvKiByZWFkIGNvcmUncyBzeW1ib2wgdGFibGU6ICovCisKKyAgLyogdGhpcyB3aWxsIHByb2JhYmx5IGdpdmUgdXMgbW9yZSB0aGFuIHdlIG5lZWQsIGJ1dCB0aGF0J3Mgb2s6ICAqLworICBjb3JlX251bV9zeW1zID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGNvcmVfYmZkKTsKKyAgaWYgKGNvcmVfbnVtX3N5bXMgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHdob2FtaSwgYV9vdXRfbmFtZSwKKwkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIGNvcmVfc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChjb3JlX251bV9zeW1zKTsKKyAgY29yZV9udW1fc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChjb3JlX2JmZCwgY29yZV9zeW1zKTsKKyAgaWYgKGNvcmVfbnVtX3N5bXMgPCAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHdob2FtaSwgYV9vdXRfbmFtZSwKKwkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIG1pbl9pbnNuX3NpemUgPSAxOworICBvZmZzZXRfdG9fY29kZSA9IDA7CisKKyAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGNvcmVfYmZkKSkKKyAgICB7CisgICAgY2FzZSBiZmRfYXJjaF92YXg6CisgICAgY2FzZSBiZmRfYXJjaF90YWhvZToKKyAgICAgIG9mZnNldF90b19jb2RlID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKKyAgICAgIG1pbl9pbnNuX3NpemUgPSA0OworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpCisgICAgcmVhZF9mdW5jdGlvbl9tYXBwaW5ncyAoZnVuY3Rpb25fbWFwcGluZ19maWxlKTsKK30KKworCisvKgorICogUmVhZCBpbiB0aGUgdGV4dCBzcGFjZSBvZiBhbiBhLm91dCBmaWxlCisgKi8KK3ZvaWQKK0RFRlVOIChjb3JlX2dldF90ZXh0X3NwYWNlLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKK3sKKyAgY29yZV90ZXh0X3NwYWNlID0gKFBUUikgbWFsbG9jIChjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKTsKKworICBpZiAoIWNvcmVfdGV4dF9zcGFjZSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiByYW4gb3V0IHJvb20gZm9yICVsZCBieXRlcyBvZiB0ZXh0IHNwYWNlXG4iKSwKKwkgICAgICAgd2hvYW1pLCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGNvcmVfYmZkLCBjb3JlX3RleHRfc2VjdCwgY29yZV90ZXh0X3NwYWNlLAorCQkJCSAwLCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplKSkKKyAgICB7CisgICAgICBiZmRfcGVycm9yICgiYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIik7CisgICAgICBmcmVlIChjb3JlX3RleHRfc3BhY2UpOworICAgICAgY29yZV90ZXh0X3NwYWNlID0gMDsKKyAgICB9CisgIGlmICghY29yZV90ZXh0X3NwYWNlKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbid0IGRvIC1jXG4iKSwgd2hvYW1pKTsKKyAgICB9Cit9CisKKwordm9pZAorREVGVU4gKGZpbmRfY2FsbCwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpLAorICAgICAgIFN5bSAqIHBhcmVudCBBTkQgYmZkX3ZtYSBwX2xvd3BjIEFORCBiZmRfdm1hIHBfaGlnaHBjKQoreworICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoY29yZV9iZmQpKQorICAgIHsKKyAgICBjYXNlIGJmZF9hcmNoX2kzODY6CisgICAgICBpMzg2X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6CisgICAgICBhbHBoYV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9hcmNoX3ZheDoKKyAgICAgIHZheF9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgorICAgICAgc3BhcmNfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfYXJjaF90YWhvZToKKyAgICAgIHRhaG9lX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAtYyBub3Qgc3VwcG9ydGVkIG9uIGFyY2hpdGVjdHVyZSAlc1xuIiksCisJICAgICAgIHdob2FtaSwgYmZkX3ByaW50YWJsZV9uYW1lKGNvcmVfYmZkKSk7CisKKyAgICAgIC8qIERvbid0IGdpdmUgdGhlIGVycm9yIG1vcmUgdGhhbiBvbmNlLiAgKi8KKyAgICAgIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBGQUxTRTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gY2xhc3Mgb2Ygc3ltYm9sIFNZTS4gIFRoZSByZXR1cm5lZCBjbGFzcyBjYW4gYmUgYW55IG9mOgorICogICAgICAwICAgLT4gc3ltYm9sIGlzIG5vdCBpbnRlcmVzdGluZyB0byB1cworICogICAgICAnVCcgLT4gc3ltYm9sIGlzIGEgZ2xvYmFsIG5hbWUKKyAqICAgICAgJ3QnIC0+IHN5bWJvbCBpcyBhIGxvY2FsIChzdGF0aWMpIG5hbWUKKyAqLworc3RhdGljIGludAorREVGVU4gKGNvcmVfc3ltX2NsYXNzLCAoc3ltKSwgYXN5bWJvbCAqIHN5bSkKK3sKKyAgc3ltYm9sX2luZm8gc3ltaW5mbzsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY2hhciBzeW1fcHJlZml4OworICBpbnQgaTsKKworICBpZiAoc3ltLT5zZWN0aW9uID09IE5VTEwgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKgorICAgKiBNdXN0IGJlIGEgdGV4dCBzeW1ib2wsIGFuZCBzdGF0aWMgdGV4dCBzeW1ib2xzIGRvbid0IHF1YWxpZnkgaWYKKyAgICogaWdub3JlX3N0YXRpY19mdW5jcyBzZXQuCisgICAqLworICBpZiAoaWdub3JlX3N0YXRpY19mdW5jcyAmJiAoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkpCisgICAgeworICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX3N5bV9jbGFzc10gJXM6IG5vdCBhIGZ1bmN0aW9uXG4iLAorCQkJICAgICAgc3ltLT5uYW1lKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgYmZkX2dldF9zeW1ib2xfaW5mbyAoY29yZV9iZmQsIHN5bSwgJnN5bWluZm8pOworICBpID0gc3ltaW5mby50eXBlOworCisgIGlmIChpID09ICdUJykKKyAgICB7CisgICAgICByZXR1cm4gaTsJCQkvKiBpdCdzIGEgZ2xvYmFsIHN5bWJvbCAqLworICAgIH0KKworICBpZiAoaSA9PSAnVycpCisgICAgeworICAgICAgLyogVHJlYXQgd2VhayBzeW1ib2xzIGFzIHRleHQgc3ltYm9scy4gIEZJWE1FOiBhIHdlYWsgc3ltYm9sIG1heQorICAgICAgICAgYWxzbyBiZSBhIGRhdGEgc3ltYm9sLiAgKi8KKyAgICAgIHJldHVybiAnVCc7CisgICAgfQorCisgIGlmIChpICE9ICd0JykKKyAgICB7CisgICAgICAvKiBub3QgYSBzdGF0aWMgdGV4dCBzeW1ib2wgKi8KKyAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9zeW1fY2xhc3NdICVzIGlzIG9mIGNsYXNzICVjXG4iLAorCQkJICAgICAgc3ltLT5uYW1lLCBpKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogZG8gc29tZSBtb3JlIGZpbHRlcmluZyBvbiBzdGF0aWMgZnVuY3Rpb24tbmFtZXM6ICovCisKKyAgaWYgKGlnbm9yZV9zdGF0aWNfZnVuY3MpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAvKgorICAgKiBDYW4ndCB6ZXJvLWxlbmd0aCBuYW1lIG9yIGZ1bm55IGNoYXJhY3RlcnMgaW4gbmFtZSwgd2hlcmUKKyAgICogYGZ1bm55JyBpbmNsdWRlczogYC4nICgubyBmaWxlIG5hbWVzKSBhbmQgYCQnIChQYXNjYWwgbGFiZWxzKS4KKyAgICovCisgIGlmICghc3ltLT5uYW1lIHx8IHN5bS0+bmFtZVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmb3IgKG5hbWUgPSBzeW0tPm5hbWU7ICpuYW1lOyArK25hbWUpCisgICAgeworICAgICAgaWYgKCpuYW1lID09ICcuJyB8fCAqbmFtZSA9PSAnJCcpCisJeworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgLyoKKyAgICogT24gc3lzdGVtcyB3aGVyZSB0aGUgQyBjb21waWxlciBhZGRzIGFuIHVuZGVyc2NvcmUgdG8gYWxsCisgICAqIG5hbWVzLCBzdGF0aWMgbmFtZXMgd2l0aG91dCB1bmRlcnNjb3JlcyBzZWVtIHVzdWFsbHkgdG8gYmUKKyAgICogbGFiZWxzIGluIGhhbmQgd3JpdHRlbiBhc3NlbWJsZXIgaW4gdGhlIGxpYnJhcnkuICBXZSBkb24ndCB3YW50CisgICAqIHRoZXNlIG5hbWVzLiAgVGhpcyBpcyBjZXJ0YWlubHkgbmVjZXNzYXJ5IG9uIGEgU3BhcmMgcnVubmluZworICAgKiBTdW5PUyA0LjEgKHRyeSBwcm9maWxpbmcgYSBwcm9ncmFtIHRoYXQgZG9lcyBhIGxvdCBvZgorICAgKiBkaXZpc2lvbikuIEkgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGhhcyBoYXJtZnVsIHNpZGUgZWZmZWN0cyBvbgorICAgKiBvdGhlciBzeXN0ZW1zLiAgUGVyaGFwcyBpdCBzaG91bGQgYmUgbWFkZSBjb25maWd1cmFibGUuCisgICAqLworICBzeW1fcHJlZml4ID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChjb3JlX2JmZCk7CisgIGlmICgoc3ltX3ByZWZpeCAmJiBzeW1fcHJlZml4ICE9IHN5bS0+bmFtZVswXSkKKyAgLyoKKyAgICogR0NDIG1heSBhZGQgc3BlY2lhbCBzeW1ib2xzIHRvIGhlbHAgZ2RiIGZpZ3VyZSBvdXQgdGhlIGZpbGUKKyAgICogbGFuZ3VhZ2UuICBXZSB3YW50IHRvIGlnbm9yZSB0aGVzZSwgc2luY2Ugc29tZXRpbWVzIHRoZXkgbWFzaworICAgKiB0aGUgcmVhbCBmdW5jdGlvbi4gIChkakBjdHJvbikKKyAgICovCisgICAgICB8fCAhc3RybmNtcCAoc3ltLT5uYW1lLCAiX19nbnVfY29tcGlsZWQiLCAxNCkKKyAgICAgIHx8ICFzdHJuY21wIChzeW0tPm5hbWUsICJfX19nbnVfY29tcGlsZWQiLCAxNSkpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIElmIHRoZSBvYmplY3QgZmlsZSBzdXBwb3J0cyBtYXJraW5nIG9mIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZW4gd2UgY2FuCisgICAgIHphcCBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZSBCU0ZfRlVOQ1RJT04gc2V0LiAgKi8KKyAgaWYgKGlnbm9yZV9ub25fZnVuY3Rpb25zICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAndCc7CQkJLyogaXQncyBhIHN0YXRpYyB0ZXh0IHN5bWJvbCAqLworfQorCisKKy8qCisgKiBHZXQgd2hhdGV2ZXIgc291cmNlIGluZm8gd2UgY2FuIGdldCByZWdhcmRpbmcgYWRkcmVzcyBBRERSOgorICovCitzdGF0aWMgYm9vbAorREVGVU4gKGdldF9zcmNfaW5mbywgKGFkZHIsIGZpbGVuYW1lLCBuYW1lLCBsaW5lX251bSksCisgICAgICAgYmZkX3ZtYSBhZGRyIEFORCBjb25zdCBjaGFyICoqZmlsZW5hbWUgQU5EIGNvbnN0IGNoYXIgKipuYW1lCisgICAgICAgQU5EIGludCAqbGluZV9udW0pCit7CisgIGNvbnN0IGNoYXIgKmZuYW1lID0gMCwgKmZ1bmNfbmFtZSA9IDA7CisgIGludCBsID0gMDsKKworICBpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChjb3JlX2JmZCwgY29yZV90ZXh0X3NlY3QsIGNvcmVfc3ltcywKKwkJCSAgICAgYWRkciAtIGNvcmVfdGV4dF9zZWN0LT52bWEsCisJCQkgICAgICZmbmFtZSwgJmZ1bmNfbmFtZSwgKHVuc2lnbmVkIGludCAqKSAmbCkKKyAgICAgICYmIGZuYW1lICYmIGZ1bmNfbmFtZSAmJiBsKQorICAgIHsKKyAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbZ2V0X3NyY19pbmZvXSAweCVseCAtPiAlczolZCAoJXMpXG4iLAorCQkJICAgICAgYWRkciwgZm5hbWUsIGwsIGZ1bmNfbmFtZSkpOworICAgICAgKmZpbGVuYW1lID0gZm5hbWU7CisgICAgICAqbmFtZSA9IGZ1bmNfbmFtZTsKKyAgICAgICpsaW5lX251bSA9IGw7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2dldF9zcmNfaW5mb10gbm8gaW5mbyBmb3IgMHglbHggKCVzOiVkLCVzKVxuIiwKKwkJCSAgICAgIChsb25nKSBhZGRyLCBmbmFtZSA/IGZuYW1lIDogIjx1bmtub3duPiIsIGwsCisJCQkgICAgICBmdW5jX25hbWUgPyBmdW5jX25hbWUgOiAiPHVua25vd24+IikpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworCisvKgorICogUmVhZCBpbiBzeW1ib2wgdGFibGUgZnJvbSBjb3JlLiAgT25lIHN5bWJvbCBwZXIgZnVuY3Rpb24gaXMKKyAqIGVudGVyZWQuCisgKi8KK3ZvaWQKK0RFRlVOIChjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKK3sKKyAgYmZkX3ZtYSBtaW5fdm1hID0gfjAsIG1heF92bWEgPSAwOworICBpbnQgY2xhc3M7CisgIGxvbmcgaSwgZm91bmQsIHNraXA7CisgIHVuc2lnbmVkIGludCBqOworCisgIC8qIHBhc3MgMSAtIGRldGVybWluZSB1cHBlciBib3VuZCBvbiBudW1iZXIgb2YgZnVuY3Rpb24gbmFtZXM6ICovCisgIHN5bXRhYi5sZW4gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgY29yZV9udW1fc3ltczsgKytpKQorICAgIHsKKyAgICAgIGlmICghY29yZV9zeW1fY2xhc3MgKGNvcmVfc3ltc1tpXSkpCisJeworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgYmluYXJ5IHNlYXJjaCBvciBoYXNoZWQKKwkgc2VhcmNoLiAgR3Jvc3MuIAorCisJIERvbid0IGNyZWF0ZSBhIHN5bXRhYiBlbnRyeSBmb3IgYSBmdW5jdGlvbiB0aGF0IGhhcworCSBhIG1hcHBpbmcgdG8gYSBmaWxlLCB1bmxlc3MgaXQncyB0aGUgZmlyc3QgZnVuY3Rpb24KKwkgaW4gdGhlIGZpbGUuICAqLworICAgICAgc2tpcCA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgc3ltYm9sX21hcF9jb3VudDsgaisrKQorCWlmICghc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbal0uZnVuY3Rpb25fbmFtZSkpCisJICB7CisJICAgIGlmIChqID4gMCAmJiAhIHN0cmNtcCAoc3ltYm9sX21hcCBbal0uZmlsZV9uYW1lLAorCQkJIAkgICBzeW1ib2xfbWFwIFtqIC0gMV0uZmlsZV9uYW1lKSkKKwkgICAgICBza2lwID0gMTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICBpZiAoIXNraXApCisgICAgICAgICsrc3ltdGFiLmxlbjsKKyAgICB9CisKKyAgaWYgKHN5bXRhYi5sZW4gPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIG5vIHN5bWJvbHNcbiIpLCB3aG9hbWksIGFfb3V0X25hbWUpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIC8qIHRoZSAiKyAyIiBpcyBmb3IgdGhlIHNlbnRpbmVsczogKi8KKyAgc3ltdGFiLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKChzeW10YWIubGVuICsgMikgKiBzaXplb2YgKFN5bSkpOworCisgIC8qIHBhc3MgMiAtIGNyZWF0ZSBzeW1ib2xzOiAqLworCisgIHN5bXRhYi5saW1pdCA9IHN5bXRhYi5iYXNlOworICBmb3IgKGkgPSAwOyBpIDwgY29yZV9udW1fc3ltczsgKytpKQorICAgIHsKKyAgICAgIGNsYXNzID0gY29yZV9zeW1fY2xhc3MgKGNvcmVfc3ltc1tpXSk7CisgICAgICBpZiAoIWNsYXNzKQorCXsKKwkgIERCRyAoQU9VVERFQlVHLAorCSAgICAgICBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltc10gcmVqZWN0aW5nOiAweCVseCAlc1xuIiwKKwkJICAgICAgIGNvcmVfc3ltc1tpXS0+dmFsdWUsIGNvcmVfc3ltc1tpXS0+bmFtZSkpOworCSAgY29udGludWU7CisJfQorICAgICAgLyogVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhIGJpbmFyeSBzZWFyY2ggb3IgaGFzaGVkCisJIHNlYXJjaC4gIEdyb3NzLiAgICovCisKKyAgICAgIHNraXAgPSAwOworICAgICAgZm91bmQgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IHN5bWJvbF9tYXBfY291bnQ7IGorKykKKwlpZiAoIXN0cmNtcCAoY29yZV9zeW1zW2ldLT5uYW1lLCBzeW1ib2xfbWFwW2pdLmZ1bmN0aW9uX25hbWUpKQorCSAgeworCSAgICBpZiAoaiA+IDAgJiYgISBzdHJjbXAgKHN5bWJvbF9tYXAgW2pdLmZpbGVfbmFtZSwKKwkJCSAJICAgc3ltYm9sX21hcCBbaiAtIDFdLmZpbGVfbmFtZSkpCisJICAgICAgc2tpcCA9IDE7CisJICAgIGVsc2UKKwkgICAgICBmb3VuZCA9IGo7CisJICAgIGJyZWFrOworCSAgfQorCisgICAgICBpZiAoc2tpcCkKKwljb250aW51ZTsKKworICAgICAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7CisKKyAgICAgIC8qIHN5bWJvbCBvZmZzZXRzIGFyZSBhbHdheXMgc2VjdGlvbi1yZWxhdGl2ZTogKi8KKworICAgICAgc3ltdGFiLmxpbWl0LT5hZGRyID0gY29yZV9zeW1zW2ldLT52YWx1ZSArIGNvcmVfc3ltc1tpXS0+c2VjdGlvbi0+dm1hOworICAgICAgaWYgKHN5bWJvbF9tYXBfY291bnQKKwkgICYmICFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtmb3VuZF0uZnVuY3Rpb25fbmFtZSkpCisJeworCSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gc3ltYm9sX21hcFtmb3VuZF0uZmlsZV9uYW1lOworCSAgc3ltdGFiLmxpbWl0LT5tYXBwZWQgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzeW10YWIubGltaXQtPm5hbWUgPSBjb3JlX3N5bXNbaV0tPm5hbWU7CisJICBzeW10YWIubGltaXQtPm1hcHBlZCA9IDA7CisJfQorCisgICAgICAvKiBMb29rdXAgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLCBpZiB3ZSBjYW4gKi8KKworICAgICAgeworCWNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZnVuY19uYW1lOworCQorCWlmIChnZXRfc3JjX2luZm8gKHN5bXRhYi5saW1pdC0+YWRkciwgJmZpbGVuYW1lLCAmZnVuY19uYW1lLAorCQkJICAmc3ltdGFiLmxpbWl0LT5saW5lX251bSkpCisJICB7CisJICAgIHN5bXRhYi5saW1pdC0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIChmaWxlbmFtZSk7CisKKwkgICAgLyogRklYTUU6IENoZWNraW5nIF9fb3NmX18gaGVyZSBkb2VzIG5vdCB3b3JrIHdpdGggYSBjcm9zcworICAgICAgICAgICAgICAgZ3Byb2YuICAqLworI2lmZGVmIF9fb3NmX18KKwkgICAgLyoKKwkgICAgICogU3VwcHJlc3Mgc3ltYm9scyB0aGF0IGFyZSBub3QgZnVuY3Rpb24gbmFtZXMuICBUaGlzIGlzCisJICAgICAqIHVzZWZ1bCB0byBzdXBwcmVzcyBjb2RlLWxhYmVscyBhbmQgYWxpYXNlcy4KKwkgICAgICoKKwkgICAgICogVGhpcyBpcyBrbm93biB0byBiZSB1c2VmdWwgdW5kZXIgREVDJ3MgT1NGLzEuICBVbmRlciBTdW5PUyA0LngsCisJICAgICAqIGxhYmVscyBkbyBub3QgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUgaW5mbywgc28gdGhpcyBpc24ndAorCSAgICAgKiBuZWNlc3NhcnkuCisJICAgICAqLworCisJICAgIGlmIChzdHJjbXAgKHN5bXRhYi5saW1pdC0+bmFtZSwgZnVuY19uYW1lKSAhPSAwKQorCSAgICAgIHsKKwkJLyoKKwkJICogVGhlIHN5bWJvbCdzIGFkZHJlc3MgbWFwcyB0byBhIGRpZmZlcmVudCBuYW1lLCBzbworCQkgKiBpdCBjYW4ndCBiZSBhIGZ1bmN0aW9uLWVudHJ5IHBvaW50LiAgVGhpcyBoYXBwZW5zCisJCSAqIGZvciBsYWJlbHMsIGZvciBleGFtcGxlLgorCQkgKi8KKwkJREJHIChBT1VUREVCVUcsCisJCSAgICAgcHJpbnRmICgiW2NvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXM6IHJlaiAlcyAobWFwcyB0byAlcylcbiIsCisJCQkgICAgIHN5bXRhYi5saW1pdC0+bmFtZSwgZnVuY19uYW1lKSk7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKyNlbmRpZgorCSAgfQorICAgICAgfQorCisgICAgICBzeW10YWIubGltaXQtPmlzX2Z1bmMgPSBUUlVFOworICAgICAgc3ltdGFiLmxpbWl0LT5pc19iYl9oZWFkID0gVFJVRTsKKyAgICAgIGlmIChjbGFzcyA9PSAndCcpCisJeworCSAgc3ltdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBUUlVFOworCX0KKworICAgICAgbWluX3ZtYSA9IE1JTiAoc3ltdGFiLmxpbWl0LT5hZGRyLCBtaW5fdm1hKTsKKyAgICAgIG1heF92bWEgPSBNQVggKHN5bXRhYi5saW1pdC0+YWRkciwgbWF4X3ZtYSk7CisKKyAgICAgIC8qCisgICAgICAgKiBJZiB3ZSBzZWUgIm1haW4iIHdpdGhvdXQgYW4gaW5pdGlhbCAnXycsIHdlIGFzc3VtZSBuYW1lcworICAgICAgICogYXJlICpub3QqIHByZWZpeGVkIGJ5ICdfJy4KKyAgICAgICAqLworICAgICAgaWYgKHN5bXRhYi5saW1pdC0+bmFtZVswXSA9PSAnbScgJiYgZGlzY2FyZF91bmRlcnNjb3JlcworCSAgJiYgc3RyY21wIChzeW10YWIubGltaXQtPm5hbWUsICJtYWluIikgPT0gMCkKKwl7CisJICBkaXNjYXJkX3VuZGVyc2NvcmVzID0gMDsKKwl9CisKKyAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltc10gJWxkICVzIDB4JWx4XG4iLAorCQkJICAgICAgKGxvbmcpIChzeW10YWIubGltaXQgLSBzeW10YWIuYmFzZSksCisJCQkgICAgICBzeW10YWIubGltaXQtPm5hbWUsIHN5bXRhYi5saW1pdC0+YWRkcikpOworICAgICAgKytzeW10YWIubGltaXQ7CisgICAgfQorCisgIC8qIGNyZWF0ZSBzZW50aW5lbHM6ICovCisKKyAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7CisgIHN5bXRhYi5saW1pdC0+bmFtZSA9ICI8bG9jb3JlPiI7CisgIHN5bXRhYi5saW1pdC0+YWRkciA9IDA7CisgIHN5bXRhYi5saW1pdC0+ZW5kX2FkZHIgPSBtaW5fdm1hIC0gMTsKKyAgKytzeW10YWIubGltaXQ7CisKKyAgc3ltX2luaXQgKHN5bXRhYi5saW1pdCk7CisgIHN5bXRhYi5saW1pdC0+bmFtZSA9ICI8aGljb3JlPiI7CisgIHN5bXRhYi5saW1pdC0+YWRkciA9IG1heF92bWEgKyAxOworICBzeW10YWIubGltaXQtPmVuZF9hZGRyID0gfjA7CisgICsrc3ltdGFiLmxpbWl0OworCisgIHN5bXRhYi5sZW4gPSBzeW10YWIubGltaXQgLSBzeW10YWIuYmFzZTsKKyAgc3ltdGFiX2ZpbmFsaXplICgmc3ltdGFiKTsKK30KKworCisvKgorICogUmVhZCBpbiBzeW1ib2wgdGFibGUgZnJvbSBjb3JlLiAgT25lIHN5bWJvbCBwZXIgbGluZSBvZiBzb3VyY2UgY29kZQorICogaXMgZW50ZXJlZC4KKyAqLwordm9pZAorREVGVU4gKGNvcmVfY3JlYXRlX2xpbmVfc3ltcywgKGNvcmVfYmZkKSwgYmZkICogY29yZV9iZmQpCit7CisgIGNoYXIgKnByZXZfbmFtZSwgKnByZXZfZmlsZW5hbWU7CisgIGludCBwcmV2X25hbWVfbGVuLCBwcmV2X2ZpbGVuYW1lX2xlbjsKKyAgYmZkX3ZtYSB2bWEsIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7CisgIGJmZF92bWEgb2Zmc2V0OworICBTeW0gKnByZXYsIGR1bW15LCAqc2VudGluZWwsICpzeW07CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBpbnQgcHJldl9saW5lX251bTsKKyAgU3ltX1RhYmxlIGx0YWI7CisgIC8qCisgICAqIENyZWF0ZSBzeW1ib2xzIGZvciBmdW5jdGlvbnMgYXMgdXN1YWwuICBUaGlzIGlzIG5lY2Vzc2FyeSBpbgorICAgKiBjYXNlcyB3aGVyZSBwYXJ0cyBvZiBhIHByb2dyYW0gd2VyZSBub3QgY29tcGlsZWQgd2l0aCAtZy4gIEZvcgorICAgKiB0aG9zZSBwYXJ0cyB3ZSBzdGlsbCB3YW50IHRvIGdldCBpbmZvIGF0IHRoZSBmdW5jdGlvbiBsZXZlbDoKKyAgICovCisgIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgKGNvcmVfYmZkKTsKKworICAvKiBwYXNzIDEgLSBjb3VudGVyIG51bWJlciBvZiBzeW1ib2xzOiAqLworCisgIC8qCisgICAqIFRvIGZpbmQgYWxsIGxpbmUgaW5mb3JtYXRpb24sIHdhbGsgdGhyb3VnaCBhbGwgcG9zc2libGUKKyAgICogdGV4dC1zcGFjZSBhZGRyZXNzZXMgKG9uZSBieSBvbmUhKSBhbmQgZ2V0IHRoZSBkZWJ1Z2dpbmcKKyAgICogaW5mbyBmb3IgZWFjaCBhZGRyZXNzLiAgV2hlbiB0aGUgZGVidWdnaW5nIGluZm8gY2hhbmdlcywKKyAgICogaXQgaXMgdGltZSB0byBjcmVhdGUgYSBuZXcgc3ltYm9sLgorICAgKgorICAgKiBPZiBjb3Vyc2UsIHRoaXMgaXMgcmF0aGVyIHNsb3cgYW5kIGl0IHdvdWxkIGJlIGJldHRlciBpZgorICAgKiBiZmQgd291bGQgcHJvdmlkZSBhbiBpdGVyYXRvciBmb3IgZW51bWVyYXRpbmcgYWxsIGxpbmUgaW5mb3MKKyAgICovCisgIHByZXZfbmFtZV9sZW4gPSBQQVRIX01BWDsKKyAgcHJldl9maWxlbmFtZV9sZW4gPSBQQVRIX01BWDsKKyAgcHJldl9uYW1lID0geG1hbGxvYyAocHJldl9uYW1lX2xlbik7CisgIHByZXZfZmlsZW5hbWUgPSB4bWFsbG9jIChwcmV2X2ZpbGVuYW1lX2xlbik7CisgIGx0YWIubGVuID0gMDsKKyAgcHJldl9saW5lX251bSA9IDA7CisgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZTsgb2Zmc2V0ICs9IG1pbl9pbnNuX3NpemUpCisgICAgeworICAgICAgaW50IGxlbjsKKworICAgICAgdm1hID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldDsKKyAgICAgIGlmICghZ2V0X3NyY19pbmZvICh2bWEsICZmaWxlbmFtZSwgJmR1bW15Lm5hbWUsICZkdW1teS5saW5lX251bSkKKwkgIHx8IChwcmV2X2xpbmVfbnVtID09IGR1bW15LmxpbmVfbnVtCisJICAgICAgJiYgcHJldl9uYW1lICE9IE5VTEwKKwkgICAgICAmJiBzdHJjbXAgKHByZXZfbmFtZSwgZHVtbXkubmFtZSkgPT0gMAorCSAgICAgICYmIHN0cmNtcCAocHJldl9maWxlbmFtZSwgZmlsZW5hbWUpID09IDApKQorCXsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgKytsdGFiLmxlbjsKKyAgICAgIHByZXZfbGluZV9udW0gPSBkdW1teS5saW5lX251bTsKKworICAgICAgbGVuID0gc3RybGVuIChkdW1teS5uYW1lKTsKKyAgICAgIGlmIChsZW4gPj0gcHJldl9uYW1lX2xlbikKKwl7CisJICBwcmV2X25hbWVfbGVuID0gbGVuICsgMTAyNDsKKwkgIGZyZWUgKHByZXZfbmFtZSk7CisJICBwcmV2X25hbWUgPSB4bWFsbG9jIChwcmV2X25hbWVfbGVuKTsKKwl9CisgICAgICBzdHJjcHkgKHByZXZfbmFtZSwgZHVtbXkubmFtZSk7CisKKyAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOworICAgICAgaWYgKGxlbiA+PSBwcmV2X2ZpbGVuYW1lX2xlbikKKwl7CisJICBwcmV2X2ZpbGVuYW1lX2xlbiA9IGxlbiArIDEwMjQ7CisJICBmcmVlIChwcmV2X2ZpbGVuYW1lKTsKKwkgIHByZXZfZmlsZW5hbWUgPSB4bWFsbG9jIChwcmV2X2ZpbGVuYW1lX2xlbik7CisJfQorICAgICAgc3RyY3B5IChwcmV2X2ZpbGVuYW1lLCBmaWxlbmFtZSk7CisKKyAgICAgIG1pbl92bWEgPSBNSU4gKHZtYSwgbWluX3ZtYSk7CisgICAgICBtYXhfdm1hID0gTUFYICh2bWEsIG1heF92bWEpOworICAgIH0KKworICBmcmVlIChwcmV2X25hbWUpOworICBmcmVlIChwcmV2X2ZpbGVuYW1lKTsKKworICAvKiBtYWtlIHJvb20gZm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRvbzogKi8KKyAgbHRhYi5sZW4gKz0gc3ltdGFiLmxlbjsKKyAgbHRhYi5iYXNlID0gKFN5bSAqKSB4bWFsbG9jIChsdGFiLmxlbiAqIHNpemVvZiAoU3ltKSk7CisgIGx0YWIubGltaXQgPSBsdGFiLmJhc2U7CisKKyAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCisKKyAgLyogV2Ugbm93IHNldCBpc19zdGF0aWMgYXMgd2UgZ28gYWxvbmcsIHJhdGhlciB0aGFuIGJ5IHJ1bm5pbmcKKyAgICAgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlIGF0IHRoZSBlbmQuCisKKyAgICAgVGhlIG9sZCB3YXkgY2FsbGVkIHN5bXRhYl9maW5hbGl6ZSBiZWZvcmUgdGhlIGlzX3N0YXRpYyBwYXNzLAorICAgICBjYXVzaW5nIGEgcHJvYmxlbSBzaW5jZSBzeW10YWJfZmluYWxpemUgdXNlcyBpc19zdGF0aWMgYXMgcGFydCBvZgorICAgICBpdHMgYWRkcmVzcyBjb25mbGljdCByZXNvbHV0aW9uIGFsZ29yaXRobS4gIFNpbmNlIGdsb2JhbCBzeW1ib2xzCisgICAgIHdlcmUgcHJlZmVyZWQgb3ZlciBzdGF0aWMgc3ltYm9scywgYW5kIGFsbCBsaW5lIHN5bWJvbHMgd2VyZQorICAgICBnbG9iYWwgYXQgdGhhdCBwb2ludCwgc3RhdGljIGZ1bmN0aW9uIG5hbWVzIHRoYXQgY29uZmxpY3RlZCB3aXRoCisgICAgIHRoZWlyIG93biBsaW5lIG51bWJlcnMgKHN0YXRpYywgYnV0IGxhYmVsZWQgYXMgZ2xvYmFsKSB3ZXJlCisgICAgIHJlamVjdGVkIGluIGZhdm9yIG9mIHRoZSBsaW5lIG51bS4KKworICAgICBUaGlzIHdhcyBub3QgdGhlIGRlc2lyZWQgZnVuY3Rpb25hbGl0eS4gIFdlIGFsd2F5cyB3YW50IHRvIGtlZXAKKyAgICAgb3VyIGZ1bmN0aW9uIHN5bWJvbHMgYW5kIGRpc2NhcmQgYW55IGNvbmZsaWN0aW5nIGxpbmUgc3ltYm9scy4KKyAgICAgUGVyaGFwcyBzeW10YWJfZmluYWxpemUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIG1ha2UgdGhpcworICAgICBkaXN0aW5jdGlvbiBhcyB3ZWxsLCBidXQgdGhlIGN1cnJlbnQgZml4IHdvcmtzIGFuZCB0aGUgY29kZSBpcyBhCisgICAgIGxvdCBjbGVhbmVyIG5vdy4gICovCisKKyAgcHJldiA9IDA7CisgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZTsgb2Zmc2V0ICs9IG1pbl9pbnNuX3NpemUpCisgICAgeworICAgICAgc3ltX2luaXQgKGx0YWIubGltaXQpOworICAgICAgaWYgKCFnZXRfc3JjX2luZm8gKGNvcmVfdGV4dF9zZWN0LT52bWEgKyBvZmZzZXQsICZmaWxlbmFtZSwKKwkJCSAmbHRhYi5saW1pdC0+bmFtZSwgJmx0YWIubGltaXQtPmxpbmVfbnVtKQorCSAgfHwgKHByZXYgJiYgcHJldi0+bGluZV9udW0gPT0gbHRhYi5saW1pdC0+bGluZV9udW0KKwkgICAgICAmJiBzdHJjbXAgKHByZXYtPm5hbWUsIGx0YWIubGltaXQtPm5hbWUpID09IDAKKwkgICAgICAmJiBzdHJjbXAgKHByZXYtPmZpbGUtPm5hbWUsIGZpbGVuYW1lKSA9PSAwKSkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIG1ha2UgbmFtZSBwb2ludGVyIGEgbWFsbG9jJ2VkIHN0cmluZzogKi8KKyAgICAgIGx0YWIubGltaXQtPm5hbWUgPSB4c3RyZHVwIChsdGFiLmxpbWl0LT5uYW1lKTsKKyAgICAgIGx0YWIubGltaXQtPmZpbGUgPSBzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCAoZmlsZW5hbWUpOworCisgICAgICBsdGFiLmxpbWl0LT5hZGRyID0gY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldDsKKworICAgICAgLyogU2V0IGlzX3N0YXRpYyBiYXNlZCBvbiB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLCB1c2luZyBlaXRoZXI6CisgICAgICAgKiAxKSB0aGUgcHJldmlvdXMgc3ltYm9sLCBpZiBpdCdzIGZyb20gdGhlIHNhbWUgZnVuY3Rpb24sIG9yCisgICAgICAgKiAyKSBhIHN5bXRhYiBsb29rdXAKKyAgICAgICAqLworCisgICAgICBpZiAocHJldiAmJiBsdGFiLmxpbWl0LT5maWxlID09IHByZXYtPmZpbGUgJiYKKwkgIHN0cmNtcCAobHRhYi5saW1pdC0+bmFtZSwgcHJldi0+bmFtZSkgPT0gMCkKKwl7CisJICBsdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBwcmV2LT5pc19zdGF0aWM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN5bSA9IHN5bV9sb29rdXAoJnN5bXRhYiwgbHRhYi5saW1pdC0+YWRkcik7CisJICBsdGFiLmxpbWl0LT5pc19zdGF0aWMgPSBzeW0tPmlzX3N0YXRpYzsKKwl9CisKKyAgICAgIHByZXYgPSBsdGFiLmxpbWl0OworCisgICAgICAvKgorICAgICAgICogSWYgd2Ugc2VlICJtYWluIiB3aXRob3V0IGFuIGluaXRpYWwgJ18nLCB3ZSBhc3N1bWUgbmFtZXMKKyAgICAgICAqIGFyZSAqbm90KiBwcmVmaXhlZCBieSAnXycuCisgICAgICAgKi8KKyAgICAgIGlmIChsdGFiLmxpbWl0LT5uYW1lWzBdID09ICdtJyAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzCisJICAmJiBzdHJjbXAgKGx0YWIubGltaXQtPm5hbWUsICJtYWluIikgPT0gMCkKKwl7CisJICBkaXNjYXJkX3VuZGVyc2NvcmVzID0gMDsKKwl9CisKKyAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbY29yZV9jcmVhdGVfbGluZV9zeW1zXSAlZCAlcyAweCVseFxuIiwKKwkJCSAgICAgIGx0YWIubGltaXQgLSBsdGFiLmJhc2UsIGx0YWIubGltaXQtPm5hbWUsCisJCQkgICAgICBsdGFiLmxpbWl0LT5hZGRyKSk7CisgICAgICArK2x0YWIubGltaXQ7CisgICAgfQorCisgIC8qIHVwZGF0ZSBzZW50aW5lbHM6ICovCisKKyAgc2VudGluZWwgPSBzeW1fbG9va3VwICgmc3ltdGFiLCAwKTsKKyAgaWYgKHN0cmNtcCAoc2VudGluZWwtPm5hbWUsICI8bG9jb3JlPiIpID09IDAKKyAgICAgICYmIG1pbl92bWEgPD0gc2VudGluZWwtPmVuZF9hZGRyKQorICAgIHsKKyAgICAgIHNlbnRpbmVsLT5lbmRfYWRkciA9IG1pbl92bWEgLSAxOworICAgIH0KKworICBzZW50aW5lbCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIH4wKTsKKyAgaWYgKHN0cmNtcCAoc2VudGluZWwtPm5hbWUsICI8aGljb3JlPiIpID09IDAgJiYgbWF4X3ZtYSA+PSBzZW50aW5lbC0+YWRkcikKKyAgICB7CisgICAgICBzZW50aW5lbC0+YWRkciA9IG1heF92bWEgKyAxOworICAgIH0KKworICAvKiBjb3B5IGluIGZ1bmN0aW9uIHN5bWJvbHM6ICovCisgIG1lbWNweSAobHRhYi5saW1pdCwgc3ltdGFiLmJhc2UsIHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSkpOworICBsdGFiLmxpbWl0ICs9IHN5bXRhYi5sZW47CisKKyAgaWYgKCh1bnNpZ25lZCBpbnQpIChsdGFiLmxpbWl0IC0gbHRhYi5iYXNlKSAhPSBsdGFiLmxlbikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgIF8oIiVzOiBzb21lYm9keSBtaXNjb3VudGVkOiBsdGFiLmxlbj0lZCBpbnN0ZWFkIG9mICVsZFxuIiksCisJICAgICAgIHdob2FtaSwgbHRhYi5sZW4sIChsb25nKSAobHRhYi5saW1pdCAtIGx0YWIuYmFzZSkpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIC8qIGZpbmFsaXplIGx0YWIgYW5kIG1ha2UgaXQgc3ltYm9sIHRhYmxlOiAqLworCisgIHN5bXRhYl9maW5hbGl6ZSAoJmx0YWIpOworICBmcmVlIChzeW10YWIuYmFzZSk7CisgIHN5bXRhYiA9IGx0YWI7CisKK30KZGlmZiAtLWdpdCBhL2dwcm9mL2NvcmVmaWxlLmggYi9ncHJvZi9jb3JlZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTZmODUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9jb3JlZmlsZS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgY29yZWZpbGVfaAorI2RlZmluZSBjb3JlZmlsZV9oCisKKyNpbmNsdWRlICJiZmQuaCIKKworZXh0ZXJuIGJmZCAqY29yZV9iZmQ7CQkvKiBiZmQgZm9yIGNvcmUtZmlsZSAqLworZXh0ZXJuIGludCBjb3JlX251bV9zeW1zOwkvKiAjIG9mIGVudHJpZXMgaW4gc3ltYm9sLXRhYmxlICovCitleHRlcm4gYXN5bWJvbCAqKmNvcmVfc3ltczsJLyogc3ltYm9sIHRhYmxlIGluIGEub3V0ICovCitleHRlcm4gYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OwkvKiBjb3JlIHRleHQgc2VjdGlvbiAqLworZXh0ZXJuIFBUUiBjb3JlX3RleHRfc3BhY2U7CS8qIHRleHQgc3BhY2Ugb2YgYS5vdXQgaW4gY29yZSAqLworCitleHRlcm4gaW50IG1pbl9pbnNuX3NpemU7CS8qIHNpemUgb2Ygc21hbGxlc3QgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzICovCitleHRlcm4gaW50IG9mZnNldF90b19jb2RlOwkvKiBvZmZzZXQgKGluIGJ5dGVzKSBvZiBjb2RlIGZyb20gZW50cnkKKwkJCQkgICBhZGRyZXNzIG9mIHJvdXRpbmUgKi8KKworZXh0ZXJuIHZvaWQgY29yZV9pbml0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFfb3V0X25hbWUpKTsKK2V4dGVybiB2b2lkIGNvcmVfZ2V0X3RleHRfc3BhY2UgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKK2V4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKK2V4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOworCisjZW5kaWYgLyogY29yZWZpbGVfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZmxhdF9ibC5tIGIvZ3Byb2YvZmxhdF9ibC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjg3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9mbGF0X2JsLm0KQEAgLTAsMCArMSwyNyBAQAorCisgJSAgICAgICAgIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUgb2YgdGhlCit0aW1lICAgICAgIHByb2dyYW0gdXNlZCBieSB0aGlzIGZ1bmN0aW9uLgorCitjdW11bGF0aXZlIGEgcnVubmluZyBzdW0gb2YgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFjY291bnRlZAorIHNlY29uZHMgICBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbmQgdGhvc2UgbGlzdGVkIGFib3ZlIGl0LgorCisgc2VsZiAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQgZm9yIGJ5IHRoaXMKK3NlY29uZHMgICAgZnVuY3Rpb24gYWxvbmUuICBUaGlzIGlzIHRoZSBtYWpvciBzb3J0IGZvciB0aGlzCisgICAgICAgICAgIGxpc3RpbmcuCisKK2NhbGxzICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIHdhcyBpbnZva2VkLCBpZgorICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLCBlbHNlIGJsYW5rLgorIAorIHNlbGYgICAgICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKK21zL2NhbGwgICAgZnVuY3Rpb24gcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQsCisJICAgZWxzZSBibGFuay4KKworIHRvdGFsICAgICB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKK21zL2NhbGwgICAgZnVuY3Rpb24gYW5kIGl0cyBkZXNjZW5kZW50cyBwZXIgY2FsbCwgaWYgdGhpcyAKKwkgICBmdW5jdGlvbiBpcyBwcm9maWxlZCwgZWxzZSBibGFuay4KKworbmFtZSAgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBtaW5vciBzb3J0CisgICAgICAgICAgIGZvciB0aGlzIGxpc3RpbmcuIFRoZSBpbmRleCBzaG93cyB0aGUgbG9jYXRpb24gb2YKKwkgICB0aGUgZnVuY3Rpb24gaW4gdGhlIGdwcm9mIGxpc3RpbmcuIElmIHRoZSBpbmRleCBpcworCSAgIGluIHBhcmVudGhlc2lzIGl0IHNob3dzIHdoZXJlIGl0IHdvdWxkIGFwcGVhciBpbgorCSAgIHRoZSBncHJvZiBsaXN0aW5nIGlmIGl0IHdlcmUgdG8gYmUgcHJpbnRlZC4KZGlmZiAtLWdpdCBhL2dwcm9mL2ZzZl9jYWxsZ19ibC5tIGIvZ3Byb2YvZnNmX2NhbGxnX2JsLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxNjgyMQotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCkBAIC0wLDAgKzEsODMgQEAKKworIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBjYWxsIHRyZWUgb2YgdGhlIHByb2dyYW0sIGFuZCB3YXMgc29ydGVkIGJ5CisgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGVhY2ggZnVuY3Rpb24gYW5kIGl0cyBjaGlsZHJlbi4KKworIEVhY2ggZW50cnkgaW4gdGhpcyB0YWJsZSBjb25zaXN0cyBvZiBzZXZlcmFsIGxpbmVzLiAgVGhlIGxpbmUgd2l0aCB0aGUKKyBpbmRleCBudW1iZXIgYXQgdGhlIGxlZnQgaGFuZCBtYXJnaW4gbGlzdHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgVGhlIGxpbmVzIGFib3ZlIGl0IGxpc3QgdGhlIGZ1bmN0aW9ucyB0aGF0IGNhbGxlZCB0aGlzIGZ1bmN0aW9uLAorIGFuZCB0aGUgbGluZXMgYmVsb3cgaXQgbGlzdCB0aGUgZnVuY3Rpb25zIHRoaXMgb25lIGNhbGxlZC4KKyBUaGlzIGxpbmUgbGlzdHM6CisgICAgIGluZGV4CUEgdW5pcXVlIG51bWJlciBnaXZlbiB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIHRhYmxlLgorCQlJbmRleCBudW1iZXJzIGFyZSBzb3J0ZWQgbnVtZXJpY2FsbHkuCisJCVRoZSBpbmRleCBudW1iZXIgaXMgcHJpbnRlZCBuZXh0IHRvIGV2ZXJ5IGZ1bmN0aW9uIG5hbWUgc28KKwkJaXQgaXMgZWFzaWVyIHRvIGxvb2sgdXAgd2hlcmUgdGhlIGZ1bmN0aW9uIGluIHRoZSB0YWJsZS4KKworICAgICAlIHRpbWUJVGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgYHRvdGFsJyB0aW1lIHRoYXQgd2FzIHNwZW50CisJCWluIHRoaXMgZnVuY3Rpb24gYW5kIGl0cyBjaGlsZHJlbi4gIE5vdGUgdGhhdCBkdWUgdG8KKwkJZGlmZmVyZW50IHZpZXdwb2ludHMsIGZ1bmN0aW9ucyBleGNsdWRlZCBieSBvcHRpb25zLCBldGMsCisJCXRoZXNlIG51bWJlcnMgd2lsbCBOT1QgYWRkIHVwIHRvIDEwMCUuCisKKyAgICAgc2VsZglUaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uLgorCisgICAgIGNoaWxkcmVuCVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHByb3BhZ2F0ZWQgaW50byB0aGlzCisJCWZ1bmN0aW9uIGJ5IGl0cyBjaGlsZHJlbi4KKworICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLgorCQlJZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGl0c2VsZiByZWN1cnNpdmVseSwgdGhlIG51bWJlcgorCQlvbmx5IGluY2x1ZGVzIG5vbi1yZWN1cnNpdmUgY2FsbHMsIGFuZCBpcyBmb2xsb3dlZCBieQorCQlhIGArJyBhbmQgdGhlIG51bWJlciBvZiByZWN1cnNpdmUgY2FsbHMuCisKKyAgICAgbmFtZQlUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRoZSBpbmRleCBudW1iZXIgaXMKKwkJcHJpbnRlZCBhZnRlciBpdC4gIElmIHRoZSBmdW5jdGlvbiBpcyBhIG1lbWJlciBvZiBhCisJCWN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQgYmV0d2VlbiB0aGUKKwkJZnVuY3Rpb24ncyBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgorCisKKyBGb3IgdGhlIGZ1bmN0aW9uJ3MgcGFyZW50cywgdGhlIGZpZWxkcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisKKyAgICAgc2VsZglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGRpcmVjdGx5CisJCWZyb20gdGhlIGZ1bmN0aW9uIGludG8gdGhpcyBwYXJlbnQuCisKKyAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBmcm9tCisJCXRoZSBmdW5jdGlvbidzIGNoaWxkcmVuIGludG8gdGhpcyBwYXJlbnQuCisKKyAgICAgY2FsbGVkCVRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHBhcmVudCBjYWxsZWQgdGhlCisJCWZ1bmN0aW9uIGAvJyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbgorCQl3YXMgY2FsbGVkLiAgUmVjdXJzaXZlIGNhbGxzIHRvIHRoZSBmdW5jdGlvbiBhcmUgbm90CisJCWluY2x1ZGVkIGluIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGAvJy4KKworICAgICBuYW1lCVRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmVudC4gIFRoZSBwYXJlbnQncyBpbmRleAorCQludW1iZXIgaXMgcHJpbnRlZCBhZnRlciBpdC4gIElmIHRoZSBwYXJlbnQgaXMgYQorCQltZW1iZXIgb2YgYSBjeWNsZSwgdGhlIGN5Y2xlIG51bWJlciBpcyBwcmludGVkIGJldHdlZW4KKwkJdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCisKKyBJZiB0aGUgcGFyZW50cyBvZiB0aGUgZnVuY3Rpb24gY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSB3b3JkCisgYDxzcG9udGFuZW91cz4nIGlzIHByaW50ZWQgaW4gdGhlIGBuYW1lJyBmaWVsZCwgYW5kIGFsbCB0aGUgb3RoZXIKKyBmaWVsZHMgYXJlIGJsYW5rLgorCisgRm9yIHRoZSBmdW5jdGlvbidzIGNoaWxkcmVuLCB0aGUgZmllbGRzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKworICAgICBzZWxmCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZGlyZWN0bHkKKwkJZnJvbSB0aGUgY2hpbGQgaW50byB0aGUgZnVuY3Rpb24uCisKKyAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBmcm9tIHRoZQorCQljaGlsZCdzIGNoaWxkcmVuIHRvIHRoZSBmdW5jdGlvbi4KKworICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiBjYWxsZWQKKwkJdGhpcyBjaGlsZCBgLycgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgY2hpbGQKKwkJd2FzIGNhbGxlZC4gIFJlY3Vyc2l2ZSBjYWxscyBieSB0aGUgY2hpbGQgYXJlIG5vdAorCQlsaXN0ZWQgaW4gdGhlIG51bWJlciBhZnRlciB0aGUgYC8nLgorCisgICAgIG5hbWUJVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY2hpbGQuICBUaGUgY2hpbGQncyBpbmRleAorCQludW1iZXIgaXMgcHJpbnRlZCBhZnRlciBpdC4gIElmIHRoZSBjaGlsZCBpcyBhCisJCW1lbWJlciBvZiBhIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQKKwkJYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KKworIElmIHRoZXJlIGFyZSBhbnkgY3ljbGVzIChjaXJjbGVzKSBpbiB0aGUgY2FsbCBncmFwaCwgdGhlcmUgaXMgYW4KKyBlbnRyeSBmb3IgdGhlIGN5Y2xlLWFzLWEtd2hvbGUuICBUaGlzIGVudHJ5IHNob3dzIHdobyBjYWxsZWQgdGhlCisgY3ljbGUgKGFzIHBhcmVudHMpIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgY3ljbGUgKGFzIGNoaWxkcmVuLikKKyBUaGUgYCsnIHJlY3Vyc2l2ZSBjYWxscyBlbnRyeSBzaG93cyB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9uIGNhbGxzIHRoYXQKKyB3ZXJlIGludGVybmFsIHRvIHRoZSBjeWNsZSwgYW5kIHRoZSBjYWxscyBlbnRyeSBmb3IgZWFjaCBtZW1iZXIgc2hvd3MsCisgZm9yIHRoYXQgbWVtYmVyLCBob3cgbWFueSB0aW1lcyBpdCB3YXMgY2FsbGVkIGZyb20gb3RoZXIgbWVtYmVycyBvZgorIHRoZSBjeWNsZS4KKwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ2NvbmZpZy5pbiBiL2dwcm9mL2djb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3ZThlMAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2djb25maWcuaW4KQEAgLTAsMCArMSwxMjkgQEAKKy8qIGdjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FSR1pfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSAorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBQQUNLQUdFCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCmRpZmYgLS1naXQgYS9ncHJvZi9nZW4tYy1wcm9nLmF3ayBiL2dwcm9mL2dlbi1jLXByb2cuYXdrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWMxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9nZW4tYy1wcm9nLmF3awpAQCAtMCwwICsxLDI2IEBACitOUiA9PSAxCXsKKyAgICBGUz0iXCIiOworICAgIHByaW50ICIvKiA9PT4gRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhISAgSXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IgorICAgIHByaW50ZiAiICAgZnJvbSAlcyB1c2luZyB0aGUgZ2VuLWMtcHJvZy5hd2sgc2NyaXB0LiAgPD09ICovXG5cbiIsIEZJTEUKKyAgICBwcmludCAiI2luY2x1ZGUgPHN0ZGlvLmg+IgorfQorCisJeworCSAgaWYgKGN1cmZ1biAhPSBGVU5DVElPTikKKwkgICAgeworCSAgICAgIGlmIChjdXJmdW4pCisJCXByaW50ICJ9IgorCSAgICAgIGN1cmZ1biA9IEZVTkNUSU9OCisJICAgICAgcHJpbnQgIiIKKwkgICAgICBwcmludCAidm9pZCI7CisJICAgICAgcHJpbnRmICIlcyAoZmlsZSlcbiIsIEZVTkNUSU9OCisJICAgICAgcHJpbnQgIiAgICAgRklMRSAqZmlsZTsiOworCSAgICAgIHByaW50ICJ7IjsKKwkgICAgfQorCSAgcHJpbnRmICIgIGZwdXRzIChcIiI7CisJICBmb3IgKGkgPSAxOyBpIDwgTkY7IGkrKykKKwkgICAgcHJpbnRmICIlc1xcXCIiLCAkaTsKKwkgIHByaW50ZiAiJXNcXG5cIiwgZmlsZSk7XG4iLCAkTkY7Cit9CisKK0VORAl7IHByaW50ICJ9IiB9CmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uLmggYi9ncHJvZi9nbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxZmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2dtb24uaApAQCAtMCwwICsxLDE1NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZ21vbi5oCTUuMiAoQmVya2VsZXkpIDUvNi85MQorICovCisjaWZuZGVmIGdtb25faAorI2RlZmluZSBnbW9uX2gKKworc3RydWN0IHJhd19waGRyCisgIHsKKyAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQorICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KKyNpZmRlZiBfX2FscGhhX18KKyAgICBjaGFyIGxvd19wY1s4XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCisgICAgY2hhciBoaWdoX3BjWzhdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KKyNlbHNlCisgICAgY2hhciBsb3dfcGNbNF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgaGlnaF9wY1s0XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCisjZW5kaWYKKyAgICBjaGFyIG5jbnRbNF07CQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKHBsdXMgdGhpcyBoZWFkZXIpICovCisKKyAgICBjaGFyIHZlcnNpb25bNF07CQkvKiB2ZXJzaW9uIG51bWJlciAqLworICAgIGNoYXIgcHJvZnJhdGVbNF07CQkvKiBwcm9maWxpbmcgY2xvY2sgcmF0ZSAqLworICAgIGNoYXIgc3BhcmVbMyo0XTsJCS8qIHJlc2VydmVkICovCisgIH07CisKKyNkZWZpbmUgR01PTlZFUlNJT04gICAgIDB4MDAwNTE4NzkKKworc3RydWN0IG9sZF9yYXdfcGhkcgorICB7CisgICAgLyogRklYTUU6IENoZWNraW5nIGEgaG9zdCBjb21waWxlciBkZWZpbmUgbWVhbnMgdGhhdCB3ZSBjYW4ndCB1c2UKKyAgICAgICBhIGNyb3NzIGdwcm9mIHRvIHRoZSBhbHBoYS4gICovCisjaWZkZWYgX19hbHBoYV9fCisgICAgY2hhciBsb3dfcGNbOF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgaGlnaF9wY1s4XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCisjZWxzZQorICAgIGNoYXIgbG93X3BjWzRdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KKyAgICBjaGFyIGhpZ2hfcGNbNF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLworI2VuZGlmCisgICAgY2hhciBuY250WzRdOwkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyIChwbHVzIHRoaXMgaGVhZGVyKSAqLworCisgICAgLyogRklYTUU6IENoZWNraW5nIGhvc3QgY29tcGlsZXIgZGVmaW5lcyBoZXJlIG1lYW5zIHRoYXQgd2UgY2FuJ3QKKyAgICAgICB1c2UgYSBjcm9zcyBncHJvZiBhbHBoYSBPU0YuICAqLworI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgJiYgZGVmaW5lZCAoX19vc2ZfXykKKyAgICAvKgorICAgICAqIERFQydzIE9TRiB2My4wIHVzZXMgNCBieXRlcyBvZiBwYWRkaW5nIHRvIGJyaW5nIHRoZSBoZWFkZXIgdG8KKyAgICAgKiBhIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIDguCisgICAgICovCisgICAgY2hhciBwYWRbNF07CisjZW5kaWYKKyAgfTsKKworLyoKKyAqIEhpc3RvZ3JhbSBjb3VudGVycyBhcmUgdW5zaWduZWQgc2hvcnRzOgorICovCisjZGVmaW5lCUhJU1RDT1VOVEVSIHVuc2lnbmVkIHNob3J0CisKKy8qCisgKiBGcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBoaXN0b2dyYW0gY291bnRlcnMgaGVyZSwgMS8yOgorICovCisjZGVmaW5lCUhJU1RGUkFDVElPTgkyCisKKy8qCisgKiBGcmFjdGlvbiBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciBmcm9tIGhhc2ggYnVja2V0cy4gIFRoZQorICogdmFsdWUgb2YgSEFTSEZSQUNUSU9OIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBvZgorICogc2VwYXJhdGlvbiBiZXR3ZWVuIHR3byBzdWJyb3V0aW5lIGNhbGwgcG9pbnRzIGluIHRoZSBvYmplY3QgY29kZS4KKyAqIEdpdmVuIE1JTl9TVUJSX1NFUEFSQVRJT04gYnl0ZXMgb2Ygc2VwYXJhdGlvbiB0aGUgdmFsdWUgb2YKKyAqIEhBU0hGUkFDVElPTiBpcyBjYWxjdWxhdGVkIGFzOgorICoKKyAqICAgICAgSEFTSEZSQUNUSU9OID0gTUlOX1NVQlJfU0VQQVJBVElPTiAvICgyICogc2l6ZW9mKHNob3J0KSAtIDEpOworICoKKyAqIEZvciB0aGUgVkFYLCB0aGUgc2hvcnRlc3QgdHdvIGNhbGwgc2VxdWVuY2UgaXM6CisgKgorICogICAgICBjYWxscyAgICQwLChyMCkKKyAqICAgICAgY2FsbHMgICAkMCwocjApCisgKgorICogd2hpY2ggaXMgc2VwYXJhdGVkIGJ5IG9ubHkgdGhyZWUgYnl0ZXMsIHRodXMgSEFTSEZSQUNUSU9OIGlzIAorICogY2FsY3VsYXRlZCBhczoKKyAqCisgKiAgICAgIEhBU0hGUkFDVElPTiA9IDMgLyAoMiAqIDIgLSAxKSA9IDEKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRpdmlzaW9uIGFib3ZlIHJvdW5kcyBkb3duLCB0aHVzIGlmIE1JTl9TVUJSX0ZSQUNUSU9OCisgKiBpcyBsZXNzIHRoYW4gdGhyZWUsIHRoaXMgYWxnb3JpdGhtIHdpbGwgbm90IHdvcmshCisgKi8KKyNkZWZpbmUJSEFTSEZSQUNUSU9OIDEKKworLyoKKyAqIFBlcmNlbnQgb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdG9zdHJ1Y3RzIHdpdGggYSBtaW5pbXVtOgorICovCisjZGVmaW5lIEFSQ0RFTlNJVFkJMgorI2RlZmluZSBNSU5BUkNTCQk1MAorCitzdHJ1Y3QgdG9zdHJ1Y3QKKyAgeworICAgIGNoYXIgKnNlbGZwYzsKKyAgICBpbnQgY291bnQ7CisgICAgdW5zaWduZWQgc2hvcnQgbGluazsKKyAgfTsKKworLyoKKyAqIEEgcmF3IGFyYywgd2l0aCBwb2ludGVycyB0byB0aGUgY2FsbGluZyBzaXRlIGFuZCB0aGUgY2FsbGVkIHNpdGUKKyAqIGFuZCBhIGNvdW50LiAgRXZlcnl0aGluZyBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIGNoYXJhY3RlcnMgc28KKyAqIGFzIHRvIGdldCBhIHBhY2tlZCByZXByZXNlbnRhdGlvbiAob3RoZXJ3aXNlLCBkaWZmZXJlbnQgY29tcGlsZXJzCisgKiBtaWdodCBpbnRyb2R1Y2UgZGlmZmVyZW50IHBhZGRpbmcpOgorICovCitzdHJ1Y3QgcmF3X2FyYworICB7CisgICAgLyogRklYTUU6IENoZWNraW5nIGEgaG9zdCBjb21waWxlciBkZWZpbmUgbWVhbnMgdGhhdCB3ZSBjYW4ndCB1c2UKKyAgICAgICBhIGNyb3NzIGdwcm9mIHRvIHRoZSBhbHBoYS4gICovCisjaWZkZWYgX19hbHBoYV9fCisgICAgY2hhciBmcm9tX3BjWzhdOworICAgIGNoYXIgc2VsZl9wY1s4XTsKKyAgICBjaGFyIGNvdW50WzhdOworI2Vsc2UKKyAgICBjaGFyIGZyb21fcGNbNF07CisgICAgY2hhciBzZWxmX3BjWzRdOworICAgIGNoYXIgY291bnRbNF07CisjZW5kaWYKKyAgfTsKKworLyoKKyAqIEdlbmVyYWwgcm91bmRpbmcgZnVuY3Rpb25zOgorICovCisjZGVmaW5lIFJPVU5ERE9XTih4LHkpCSgoKHgpLyh5KSkqKHkpKQorI2RlZmluZSBST1VORFVQKHgseSkJKCgoKHgpKyh5KS0xKS8oeSkpKih5KSkKKworI2VuZGlmIC8qIGdtb25faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9pby5jIGIvZ3Byb2YvZ21vbl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjk0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9nbW9uX2lvLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBJbnB1dCBhbmQgb3V0cHV0IGZyb20vdG8gZ21vbi5vdXQgZmlsZXMuCisgKi8KKyNpbmNsdWRlICJjZ19hcmNzLmgiCisjaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiY29yZWZpbGUuaCIKKyNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCisjaW5jbHVkZSAiZ21vbl9pby5oIgorI2luY2x1ZGUgImdtb25fb3V0LmgiCisjaW5jbHVkZSAiZ21vbi5oIgkJLyogZmV0Y2ggaGVhZGVyIGZvciBvbGQgZm9ybWF0ICovCisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJoZXJ0ei5oIgorI2luY2x1ZGUgImhpc3QuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworaW50IGdtb25faW5wdXQgPSAwOworaW50IGdtb25fZmlsZV92ZXJzaW9uID0gMDsJLyogMCA9PSBvbGQgKG5vbi12ZXJzaW9uZWQpIGZpbGUgZm9ybWF0ICovCisKKy8qCisgKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KKyAqLworYmZkX3ZtYQorREVGVU4gKGdldF92bWEsIChhYmZkLCBhZGRyKSwgYmZkICogYWJmZCBBTkQgYmZkX2J5dGUgKiBhZGRyKQoreworICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQorICAgIHsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7CisgICAgY2FzZSA4OgorICAgICAgcmV0dXJuIGJmZF9nZXRfNjQgKGFiZmQsIGFkZHIpOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKKwkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorfQorCisKKy8qCisgKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KKyAqLwordm9pZAorREVGVU4gKHB1dF92bWEsIChhYmZkLCB2YWwsIGFkZHIpLCBiZmQgKiBhYmZkIEFORCBiZmRfdm1hIHZhbCBBTkQgYmZkX2J5dGUgKiBhZGRyKQoreworICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQorICAgIHsKKyAgICBjYXNlIDQ6CisgICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIGFkZHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBhZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKKwkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorfQorCisKK3ZvaWQKK0RFRlVOIChnbW9uX291dF9yZWFkLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgRklMRSAqaWZwOworICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKKyAgdW5zaWduZWQgY2hhciB0YWc7CisgIGludCBuaGlzdCA9IDAsIG5hcmNzID0gMCwgbmJicyA9IDA7CisKKyAgLyogb3BlbiBnbW9uLm91dCBmaWxlOiAqLworCisgIGlmIChzdHJjbXAgKGZpbGVuYW1lLCAiLSIpID09IDApCisgICAgeworICAgICAgaWZwID0gc3RkaW47CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWZwID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7CisgICAgICBpZiAoIWlmcCkKKwl7CisJICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgIGRvbmUgKDEpOworCX0KKyAgICB9CisgIGlmIChmcmVhZCAoJmdoZHIsIHNpemVvZiAoc3RydWN0IGdtb25faGRyKSwgMSwgaWZwKSAhPSAxKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKKwkgICAgICAgZmlsZW5hbWUpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIGlmICgoZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpIHx8CisgICAgICAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTyAmJiAhc3RybmNtcCAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KSkpCisgICAgeworICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX01BR0lDICYmIHN0cm5jbXAgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSBgJXMnIGhhcyBiYWQgbWFnaWMgY29va2llXG4iKSwKKwkJICAgd2hvYW1pLCBmaWxlbmFtZSk7CisJICBkb25lICgxKTsKKwl9CisKKyAgICAgIC8qIHJpZ2h0IG1hZ2ljLCBzbyBpdCdzIHByb2JhYmx5IHJlYWxseSBhIG5ldyBnbW9uLm91dCBmaWxlICovCisKKyAgICAgIGdtb25fZmlsZV92ZXJzaW9uID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOworICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uICE9IEdNT05fVkVSU0lPTiAmJiBnbW9uX2ZpbGVfdmVyc2lvbiAhPSAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgXygiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIiksCisJCSAgIHdob2FtaSwgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKKwkgIGRvbmUgKDEpOworCX0KKworICAgICAgLyogcmVhZCBpbiBhbGwgdGhlIHJlY29yZHM6ICovCisgICAgICB3aGlsZSAoZnJlYWQgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgaWZwKSA9PSAxKQorCXsKKwkgIHN3aXRjaCAodGFnKQorCSAgICB7CisJICAgIGNhc2UgR01PTl9UQUdfVElNRV9ISVNUOgorCSAgICAgICsrbmhpc3Q7CisJICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9ISVNUT0dSQU07CisJICAgICAgaGlzdF9yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBHTU9OX1RBR19DR19BUkM6CisJICAgICAgKytuYXJjczsKKwkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0NBTExfR1JBUEg7CisJICAgICAgY2dfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgR01PTl9UQUdfQkJfQ09VTlQ6CisJICAgICAgKytuYmJzOworCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfQkJfQ09VTlRTOworCSAgICAgIGJiX3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIF8oIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIiksCisJCSAgICAgICB3aG9hbWksIGZpbGVuYW1lLCB0YWcpOworCSAgICAgIGRvbmUgKDEpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTworCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRAorCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQorICAgIHsKKyAgICAgIHN0cnVjdCBoZHIKKyAgICAgIHsKKwliZmRfdm1hIGxvd19wYzsKKwliZmRfdm1hIGhpZ2hfcGM7CisJaW50IG5jbnQ7CisgICAgICB9OworICAgICAgaW50IGksIHNhbXBfYnl0ZXMsIGhlYWRlcl9zaXplOworICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyAgICAgIGJmZF92bWEgZnJvbV9wYywgc2VsZl9wYzsKKyAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7CisgICAgICBzdHJ1Y3QgcmF3X3BoZHIgcmF3OworICAgICAgc3RhdGljIHN0cnVjdCBoZHIgaDsKKyAgICAgIFVOSVQgcmF3X2Jpbl9jb3VudDsKKyAgICAgIHN0cnVjdCBoZHIgdG1wOworCisgICAgICAvKgorICAgICAgICogSW5mb3JtYXRpb24gZnJvbSBhIGdtb24ub3V0IGZpbGUgaXMgaW4gdHdvIHBhcnRzOiBhbiBhcnJheSBvZgorICAgICAgICogc2FtcGxpbmcgaGl0cyB3aXRoaW4gcGMgcmFuZ2VzLCBhbmQgdGhlIGFyY3MuCisgICAgICAgKi8KKyAgICAgIGdtb25faW5wdXQgPSBJTlBVVF9ISVNUT0dSQU0gfCBJTlBVVF9DQUxMX0dSQVBIOworCisgICAgICAvKgorICAgICAgICogVGhpcyBmc2VlaygpIG91Z2h0IHRvIHdvcmsgZXZlbiBvbiBzdGRpbiBhcyBsb25nIGFzIGl0J3MKKyAgICAgICAqIG5vdCBhbiBpbnRlcmFjdGl2ZSBkZXZpY2UgKGhlY2ssIGlzIHRoZXJlIGFueWJvZHkgd2hvIHdvdWxkCisgICAgICAgKiB3YW50IHRvIHR5cGUgaW4gYSBnbW9uLm91dCBhdCB0aGUgdGVybWluYWw/KS4KKyAgICAgICAqLworICAgICAgaWYgKGZzZWVrIChpZnAsIDAsIFNFRUtfU0VUKSA8IDApCisJeworCSAgcGVycm9yIChmaWxlbmFtZSk7CisJICBkb25lICgxKTsKKwl9CisgICAgICBpZiAoZnJlYWQgKCZyYXcsIDEsIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwgaWZwKQorCSAgIT0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKKwkJICAgZmlsZW5hbWUpOworCSAgZG9uZSAoMSk7CisJfQorICAgICAgdG1wLmxvd19wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5sb3dfcGNbMF0pOworICAgICAgdG1wLmhpZ2hfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcuaGlnaF9wY1swXSk7CisgICAgICB0bXAubmNudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5uY250WzBdKTsKKworICAgICAgaWYgKGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy52ZXJzaW9uWzBdKQorCSAgPT0gR01PTlZFUlNJT04pCisJeworCSAgaW50IHByb2ZyYXRlOworCisJICAvKiA0LjRCU0QgZm9ybWF0IGhlYWRlci4gICovCisKKwkgIHByb2ZyYXRlID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LnByb2ZyYXRlWzBdKTsKKwkgIGlmICghc19oaWdocGMpCisJICAgIGh6ID0gcHJvZnJhdGU7CisJICBlbHNlIGlmIChoeiAhPSBwcm9mcmF0ZSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIF8oIiVzOiBwcm9maWxpbmcgcmF0ZSBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAorCQkgICAgICAgZmlsZW5hbWUpOworCSAgICAgIGRvbmUgKDEpOworCSAgICB9CisKKwkgIGhlYWRlcl9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBvbGQgc3R5bGUgQlNEIGZvcm1hdC4gICovCisJICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIpLAorCQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7CisJICAgICAgZG9uZSAoMSk7CisJICAgIH0KKworCSAgaWYgKGZzZWVrIChpZnAsIHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkciksIFNFRUtfU0VUKSA8IDApCisJICAgIHsKKwkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgICAgICBkb25lICgxKTsKKwkgICAgfQorCisJICBoZWFkZXJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkcik7CisJfQorCisgICAgICBpZiAoc19oaWdocGMgJiYgKHRtcC5sb3dfcGMgIT0gaC5sb3dfcGMgfHwKKwkJICAgICAgIHRtcC5oaWdoX3BjICE9IGguaGlnaF9wYyB8fCB0bXAubmNudCAhPSBoLm5jbnQpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCisJCSAgIGZpbGVuYW1lKTsKKwkgIGRvbmUgKDEpOworCX0KKyAgICAgIGggPSB0bXA7CisgICAgICBzX2xvd3BjID0gKGJmZF92bWEpIGgubG93X3BjOworICAgICAgc19oaWdocGMgPSAoYmZkX3ZtYSkgaC5oaWdoX3BjOworICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgaC5sb3dfcGMgLyBzaXplb2YgKFVOSVQpOworICAgICAgaGlnaHBjID0gKGJmZF92bWEpIGguaGlnaF9wYyAvIHNpemVvZiAoVU5JVCk7CisgICAgICBzYW1wX2J5dGVzID0gaC5uY250IC0gaGVhZGVyX3NpemU7CisgICAgICBoaXN0X251bV9iaW5zID0gc2FtcF9ieXRlcyAvIHNpemVvZiAoVU5JVCk7CisgICAgICBEQkcgKFNBTVBMRURFQlVHLAorCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBsb3dwYyAweCVseCBoaWdocGMgMHglbHggbmNudCAlZFxuIiwKKwkJICAgaC5sb3dfcGMsIGguaGlnaF9wYywgaC5uY250KTsKKwkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICBzX2xvd3BjIDB4JWx4ICAgc19oaWdocGMgMHglbHhcbiIsCisJCSAgIHNfbG93cGMsIHNfaGlnaHBjKTsKKwkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICAgIGxvd3BjIDB4JWx4ICAgICBoaWdocGMgMHglbHhcbiIsCisJCSAgIGxvd3BjLCBoaWdocGMpOworCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBzYW1wX2J5dGVzICVkIGhpc3RfbnVtX2JpbnMgJWRcbiIsCisJCSAgIHNhbXBfYnl0ZXMsIGhpc3RfbnVtX2JpbnMpKTsKKworICAgICAgaWYgKGhpc3RfbnVtX2JpbnMpCisJeworCSAgKytuaGlzdDsKKwl9CisKKyAgICAgIGlmICghaGlzdF9zYW1wbGUpCisJeworCSAgaGlzdF9zYW1wbGUgPQorCSAgICAoaW50ICopIHhtYWxsb2MgKGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7CisJICBtZW1zZXQgKGhpc3Rfc2FtcGxlLCAwLCBoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOworCX0KKworICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKKwl7CisJICBpZiAoZnJlYWQgKHJhd19iaW5fY291bnQsIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIGlmcCkgIT0gMSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIF8oIiVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkLyVkIGJpbnNcbiIpLAorCQkgICAgICAgd2hvYW1pLCAtLWksIGhpc3RfbnVtX2JpbnMpOworCSAgICAgIGRvbmUgKDEpOworCSAgICB9CisJICBoaXN0X3NhbXBsZVtpXSArPSBiZmRfZ2V0XzE2IChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19iaW5fY291bnQpOworCX0KKworICAgICAgLyoKKyAgICAgICAqIFRoZSByZXN0IG9mIHRoZSBmaWxlIGNvbnNpc3RzIG9mIGEgYnVuY2ggb2YgPGZyb20sc2VsZixjb3VudD4KKyAgICAgICAqIHR1cGxlczoKKyAgICAgICAqLworICAgICAgd2hpbGUgKGZyZWFkICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgaWZwKSA9PSAxKQorCXsKKwkgICsrbmFyY3M7CisJICBmcm9tX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOworCSAgc2VsZl9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKKwkgIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKKwkgIERCRyAoU0FNUExFREVCVUcsCisJICAgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCisJCSAgICAgZnJvbV9wYywgc2VsZl9wYywgY291bnQpKTsKKwkgIC8qIGFkZCB0aGlzIGFyYzogKi8KKwkgIGNnX3RhbGx5IChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCk7CisJfQorICAgICAgZmNsb3NlIChpZnApOworCisgICAgICBpZiAoaHogPT0gSFpfV1JPTkcpCisJeworCSAgLyoKKwkgICAqIEhvdyBtYW55IHRpY2tzIHBlciBzZWNvbmQ/ICBJZiB3ZSBjYW4ndCB0ZWxsLCByZXBvcnQKKwkgICAqIHRpbWUgaW4gdGlja3MuCisJICAgKi8KKwkgIGh6ID0gaGVydHogKCk7CisJICBpZiAoaHogPT0gSFpfV1JPTkcpCisJICAgIHsKKwkgICAgICBoeiA9IDE7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIikpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCisJICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9HTU9OX0lORk8pCisgICAgeworICAgICAgcHJpbnRmIChfKCJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIiksCisJICAgICAgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKKyAgICAgIHByaW50ZiAoXygiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIpLAorCSAgICAgIG5oaXN0LCBuaGlzdCA9PSAxID8gIiIgOiAicyIpOworICAgICAgcHJpbnRmIChfKCJcdCVkIGNhbGwtZ3JhcGggcmVjb3JkJXNcbiIpLAorCSAgICAgIG5hcmNzLCBuYXJjcyA9PSAxID8gIiIgOiAicyIpOworICAgICAgcHJpbnRmIChfKCJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iKSwKKwkgICAgICBuYmJzLCBuYmJzID09IDEgPyAiIiA6ICJzIik7CisgICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKKyAgICB9Cit9CisKKwordm9pZAorREVGVU4gKGdtb25fb3V0X3dyaXRlLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgRklMRSAqb2ZwOworICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKKworICBvZnAgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dCKTsKKyAgaWYgKCFvZnApCisgICAgeworICAgICAgcGVycm9yIChmaWxlbmFtZSk7CisgICAgICBkb25lICgxKTsKKyAgICB9CisKKyAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0FVVE8gfHwgZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpCisgICAgeworICAgICAgLyogd3JpdGUgZ21vbiBoZWFkZXI6ICovCisKKyAgICAgIG1lbWNweSAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KTsKKyAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBHTU9OX1ZFUlNJT04sIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOworICAgICAgaWYgKGZ3cml0ZSAoJmdoZHIsIHNpemVvZiAoZ2hkciksIDEsIG9mcCkgIT0gMSkKKwl7CisJICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgIGRvbmUgKDEpOworCX0KKworICAgICAgLyogd3JpdGUgZXhlY3V0aW9uIHRpbWUgaGlzdG9ncmFtIGlmIHdlIGhhdmUgb25lOiAqLworICAgICAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pCisJeworCSAgaGlzdF93cml0ZV9oaXN0IChvZnAsIGZpbGVuYW1lKTsKKwl9CisKKyAgICAgIC8qIHdyaXRlIGNhbGwgZ3JhcGggYXJjcyBpZiB3ZSBoYXZlIGFueTogKi8KKyAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkKKwl7CisJICBjZ193cml0ZV9hcmNzIChvZnAsIGZpbGVuYW1lKTsKKwl9CisKKyAgICAgIC8qIHdyaXRlIGJhc2ljLWJsb2NrIGluZm8gaWYgd2UgaGF2ZSBpdDogKi8KKyAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQkJfQ09VTlRTKQorCXsKKwkgIGJiX3dyaXRlX2Jsb2NrcyAob2ZwLCBmaWxlbmFtZSk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNEIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQorICAgIHsKKyAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7CisgICAgICBVTklUIHJhd19iaW5fY291bnQ7CisgICAgICBzdHJ1Y3QgcmF3X3BoZHIgaDsKKyAgICAgIGludCBpOworICAgICAgQXJjICphcmM7CisgICAgICBTeW0gKnN5bTsKKworICAgICAgbWVtc2V0ICgmaCwgMCwgc2l6ZW9mIGgpOworICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfbG93cGMsIChiZmRfYnl0ZSAqKSAmaC5sb3dfcGMpOworICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfaGlnaHBjLCAoYmZkX2J5dGUgKikgJmguaGlnaF9wYyk7CisgICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwKKwkJICBoaXN0X251bV9iaW5zICogc2l6ZW9mIChVTklUKSArIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwKKwkJICAoYmZkX2J5dGUgKikgJmgubmNudCk7CisKKyAgICAgIC8qIFdyaXRlIGhlYWRlci4gIFVzZSBuZXcgc3R5bGUgQlNEIGZvcm1hdCBpcyBleHBsaWNpdGx5CisgICAgICAgICBzcGVjaWZpZWQsIG9yIGlmIHRoZSBwcm9maWxpbmcgcmF0ZSBpcyBub24tc3RhbmRhcmQ7CisgICAgICAgICBvdGhlcndpc2UsIHVzZSB0aGUgb2xkIEJTRCBmb3JtYXQuICAqLworICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0CisJICB8fCBoeiAhPSBoZXJ0eiAoKSkKKwl7CisJICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgR01PTlZFUlNJT04sIChiZmRfYnl0ZSAqKSAmaC52ZXJzaW9uKTsKKwkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopICZoLnByb2ZyYXRlKTsKKwkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksIDEsIG9mcCkgIT0gMSkKKwkgICAgeworCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOworCSAgICAgIGRvbmUgKDEpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCBvbGRfcmF3X3BoZHIpLCAxLCBvZnApICE9IDEpCisJICAgIHsKKwkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgICAgICBkb25lICgxKTsKKwkgICAgfQorCX0KKworICAgICAgLyogZHVtcCB0aGUgc2FtcGxlczogKi8KKworICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKKwl7CisJICBiZmRfcHV0XzE2IChjb3JlX2JmZCwgaGlzdF9zYW1wbGVbaV0sIChiZmRfYnl0ZSAqKSAmIHJhd19iaW5fY291bnRbMF0pOworCSAgaWYgKGZ3cml0ZSAoJnJhd19iaW5fY291bnRbMF0sIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIG9mcCkgIT0gMSkKKwkgICAgeworCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOworCSAgICAgIGRvbmUgKDEpOworCSAgICB9CisJfQorCisgICAgICAvKiBkdW1wIHRoZSBub3JtYWxpemVkIHJhdyBhcmMgaW5mb3JtYXRpb246ICovCisKKyAgICAgIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCisJeworCSAgZm9yIChhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKKwkgICAgeworCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwKKwkJICAgICAgIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOworCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLAorCQkgICAgICAgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7CisJICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGFyYy0+Y291bnQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKKwkgICAgICBpZiAoZndyaXRlICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgb2ZwKSAhPSAxKQorCQl7CisJCSAgcGVycm9yIChmaWxlbmFtZSk7CisJCSAgZG9uZSAoMSk7CisJCX0KKwkgICAgICBEQkcgKFNBTVBMRURFQlVHLAorCQkgICBwcmludGYgKCJbZHVtcHN1bV0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCisJCQkgICBhcmMtPnBhcmVudC0+YWRkciwgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOworCSAgICB9CisJfQorICAgICAgZmNsb3NlIChvZnApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCisJICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9pby5oIGIvZ3Byb2YvZ21vbl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjU3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9nbW9uX2lvLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBnbW9uX2lvX2gKKyNkZWZpbmUgZ21vbl9pb19oCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJnbW9uLmgiCisKKyNkZWZpbmUgSU5QVVRfSElTVE9HUkFNCQkoMTw8MCkKKyNkZWZpbmUgSU5QVVRfQ0FMTF9HUkFQSAkoMTw8MSkKKyNkZWZpbmUgSU5QVVRfQkJfQ09VTlRTCQkoMTw8MikKKworZXh0ZXJuIGludCBnbW9uX2lucHV0OwkJLyogd2hhdCBpbnB1dCBkaWQgd2Ugc2VlPyAqLworZXh0ZXJuIGludCBnbW9uX2ZpbGVfdmVyc2lvbjsJLyogZmlsZSB2ZXJzaW9uIGFyZSB3ZSBkZWFsaW5nIHdpdGggKi8KKworZXh0ZXJuIGJmZF92bWEgZ2V0X3ZtYSBQQVJBTVMgKChiZmQgKiBhYmZkLCBiZmRfYnl0ZSAqIGFkZHIpKTsKK2V4dGVybiB2b2lkIHB1dF92bWEgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX3ZtYSB2YWwsIGJmZF9ieXRlICogYWRkcikpOworCitleHRlcm4gdm9pZCBnbW9uX291dF9yZWFkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7CitleHRlcm4gdm9pZCBnbW9uX291dF93cml0ZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOworCisjZW5kaWYgLyogZ21vbl9pb19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uX291dC5oIGIvZ3Byb2YvZ21vbl9vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQ0ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvZ21vbl9vdXQuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIGdtb24ub3V0IGZpbGVzLiAgSXQgc2hvdWxkIGhhdmUKKyAqIGFzIGZldyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgcG9zc2libGUgYXMgaXQgaXMgZ29pbmcgdG8gYmUKKyAqIGluY2x1ZGVkIGluIG1hbnkgZGlmZmVyZW50IHByb2dyYW1zLiAgVGhhdCBpcywgbWluaW1pemUgdGhlCisgKiBudW1iZXIgb2YgI2luY2x1ZGUncy4KKyAqCisgKiBBIGdtb24ub3V0IGZpbGUgY29uc2lzdHMgb2YgYSBoZWFkZXIgKGRlZmluZWQgYnkgZ21vbl9oZHIpIGZvbGxvd2VkCisgKiBieSBhIHNlcXVlbmNlIG9mIHJlY29yZHMuICBFYWNoIHJlY29yZCBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHRhZworICogaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgcmVjb3JkcywgZm9sbG93ZWQgYnkgcmVjb3JkcyBzcGVjaWZpYyBkYXRhLgorICovCisjaWZuZGVmIGdtb25fb3V0X2gKKyNkZWZpbmUgZ21vbl9vdXRfaAorCisjZGVmaW5lCUdNT05fTUFHSUMJImdtb24iCS8qIG1hZ2ljIGNvb2tpZSAqLworI2RlZmluZSBHTU9OX1ZFUlNJT04JMQkvKiB2ZXJzaW9uIG51bWJlciAqLworCisvKgorICogUmF3IGhlYWRlciBhcyBpdCBhcHBlYXJzIG9uIGZpbGUgKHdpdGhvdXQgcGFkZGluZyk6CisgKi8KK3N0cnVjdCBnbW9uX2hkcgorICB7CisgICAgY2hhciBjb29raWVbNF07CisgICAgY2hhciB2ZXJzaW9uWzRdOworICAgIGNoYXIgc3BhcmVbMyAqIDRdOworICB9OworCisvKiB0eXBlcyBvZiByZWNvcmRzIGluIHRoaXMgZmlsZTogKi8KK3R5cGVkZWYgZW51bQorICB7CisgICAgR01PTl9UQUdfVElNRV9ISVNUID0gMCwgR01PTl9UQUdfQ0dfQVJDID0gMSwgR01PTl9UQUdfQkJfQ09VTlQgPSAyCisgIH0KK0dNT05fUmVjb3JkX1RhZzsKKworc3RydWN0IGdtb25faGlzdF9oZHIKKyAgeworICAgIGNoYXIgbG93X3BjW3NpemVvZiAoY2hhciopXTsJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KKyAgICBjaGFyIGhpZ2hfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLworICAgIGNoYXIgaGlzdF9zaXplWzRdOwkJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgcHJvZl9yYXRlWzRdOwkJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCisgICAgY2hhciBkaW1lblsxNV07CQkJLyogcGh5cy4gZGltLiwgdXN1YWxseSAic2Vjb25kcyIgKi8KKyAgICBjaGFyIGRpbWVuX2FiYnJldjsJCQkvKiB1c3VhbGx5ICdzJyBmb3IgInNlY29uZHMiICovCisgIH07CisKK3N0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQKKyAgeworICAgIGNoYXIgZnJvbV9wY1tzaXplb2YgKGNoYXIqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlcidzIGJvZHkgKi8KKyAgICBjaGFyIHNlbGZfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZWUncyBib2R5ICovCisgICAgY2hhciBjb3VudFs0XTsJCQkvKiBudW1iZXIgb2YgYXJjIHRyYXZlcnNhbHMgKi8KKyAgfTsKKworI2VuZGlmIC8qIGdtb25fb3V0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLjEgYi9ncHJvZi9ncHJvZi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzM0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9ncHJvZi4xCkBAIC0wLDAgKzEsMjUyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorLlwiIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkgdGhlIGZvbGxvd2luZworLlwiIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKy5cIiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycgaW4gdGhlCisuXCIgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFuZCBpbgorLlwiIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKy5cIiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKy5cIiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisuXCIgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5cIiAgICAgQCgjKWdwcm9mLjEJNi42IChCZXJrZWxleSkgNy8yNC85MAorLlwiCisuVEggR1BST0YgMSAiSmFudWFyeSAyOSwgMTk5MyIKKy5TSCBOQU1FCitncHJvZiBcLSBkaXNwbGF5IGNhbGwgZ3JhcGggcHJvZmlsZSBkYXRhCisuU0ggU1lOT1BTSVMKKy5CIGdwcm9mIFsgXC1hYmNzeiBdIFsgXC1lfFwtRQorLkkgbmFtZQorLkIgXSBbIFwtZnxcLUYgCisuSSBuYW1lCisuQiBdIAorLkIgWyBcLWsKKy5JIGZyb21uYW1lIHRvbmFtZQorLkIgXSBbIAorLkkgb2JqZmlsZQorLkIgWyAKKy5JIGdtb24ub3V0CisuQiBdIAorLkIgXSAKKy5TSCBERVNDUklQVElPTgorLkIgZ3Byb2YKK3Byb2R1Y2VzIGFuIGV4ZWN1dGlvbiBwcm9maWxlIG9mIEMsIFBhc2NhbCwgb3IgRm9ydHJhbjc3IHByb2dyYW1zLgorVGhlIGVmZmVjdCBvZiBjYWxsZWQgcm91dGluZXMgaXMgaW5jb3Jwb3JhdGVkIGluIHRoZSBwcm9maWxlIG9mIGVhY2ggY2FsbGVyLgorVGhlIHByb2ZpbGUgZGF0YSBpcyB0YWtlbiBmcm9tIHRoZSBjYWxsIGdyYXBoIHByb2ZpbGUgZmlsZQorXCYoYGdtb24ub3V0JyBkZWZhdWx0KSB3aGljaCBpcyBjcmVhdGVkIGJ5IHByb2dyYW1zCit0aGF0IGFyZSBjb21waWxlZCB3aXRoIHRoZQorLkIgXC1wZworb3B0aW9uIG9mCisuQlIgY2MgKCAxICkgLAorLkJSIHBjICggMSApICwKK2FuZAorLkJSIGY3NyAoIDEgKSAuCitUaGUKKy5CIFwtcGcKK29wdGlvbiBhbHNvIGxpbmtzIGluIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHJvdXRpbmVzCit0aGF0IGFyZSBjb21waWxlZCBmb3IgcHJvZmlsaW5nLgorLkIgR3Byb2YKK3JlYWRzIHRoZSBnaXZlbiBvYmplY3QgZmlsZSAodGhlIGRlZmF1bHQgaXMgYGEub3V0JykKK2FuZCBlc3RhYmxpc2hlcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBpdHMgc3ltYm9sIHRhYmxlCithbmQgdGhlIGNhbGwgZ3JhcGggcHJvZmlsZSBmcm9tIGBnbW9uLm91dCcuCitJZiBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZmlsZSBpcyBzcGVjaWZpZWQsCit0aGUKKy5CIGdwcm9mCitvdXRwdXQgc2hvd3MgdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gcHJvZmlsZSBmaWxlcy4KKy5QUAorLkIgR3Byb2YKK2NhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGVhY2ggcm91dGluZS4KK05leHQsIHRoZXNlIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBlZGdlcyBvZiB0aGUgY2FsbCBncmFwaC4KK0N5Y2xlcyBhcmUgZGlzY292ZXJlZCwgYW5kIGNhbGxzIGludG8gYSBjeWNsZSBhcmUgbWFkZSB0byBzaGFyZSB0aGUgdGltZQorb2YgdGhlIGN5Y2xlLgorVGhlIGZpcnN0IGxpc3Rpbmcgc2hvd3MgdGhlIGZ1bmN0aW9ucworc29ydGVkIGFjY29yZGluZyB0byB0aGUgdGltZSB0aGV5IHJlcHJlc2VudAoraW5jbHVkaW5nIHRoZSB0aW1lIG9mIHRoZWlyIGNhbGwgZ3JhcGggZGVzY2VuZGFudHMuCitCZWxvdyBlYWNoIGZ1bmN0aW9uIGVudHJ5IGlzIHNob3duIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIGNoaWxkcmVuLAorYW5kIGhvdyB0aGVpciB0aW1lcyBhcmUgcHJvcGFnYXRlZCB0byB0aGlzIGZ1bmN0aW9uLgorQSBzaW1pbGFyIGRpc3BsYXkgYWJvdmUgdGhlIGZ1bmN0aW9uIHNob3dzIGhvdyB0aGlzIGZ1bmN0aW9uJ3MgdGltZSBhbmQgdGhlCit0aW1lIG9mIGl0cyBkZXNjZW5kYW50cyBpcyBwcm9wYWdhdGVkIHRvIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIHBhcmVudHMuCisuUFAKK0N5Y2xlcyBhcmUgYWxzbyBzaG93biwgd2l0aCBhbiBlbnRyeSBmb3IgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgYW5kCithIGxpc3Rpbmcgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlIGFuZCB0aGVpciBjb250cmlidXRpb25zIHRvIHRoZQordGltZSBhbmQgY2FsbCBjb3VudHMgb2YgdGhlIGN5Y2xlLgorLlBQCitTZWNvbmQsIGEgZmxhdCBwcm9maWxlIGlzIGdpdmVuLAorc2ltaWxhciB0byB0aGF0IHByb3ZpZGVkIGJ5CisuQlIgcHJvZiAoIDEgKSAgLgorVGhpcyBsaXN0aW5nIGdpdmVzIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZXMsIHRoZSBjYWxsIGNvdW50cywKK3RoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgY2FsbCBzcGVudCBpbiB0aGUgcm91dGluZSBpdHNlbGYsIGFuZAordGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoZSBjYWxsIHNwZW50IGluIHRoZSByb3V0aW5lIGl0c2VsZiBpbmNsdWRpbmcKK2l0cyBkZXNjZW5kYW50cy4KKy5QUAorRmluYWxseSwgYW4gaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGlzIHByb3ZpZGVkLgorLlNIIE9QVElPTlMKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorLlRQCisuQiBcLWEKK3N1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHN0YXRpY2FsbHkgZGVjbGFyZWQgZnVuY3Rpb25zLgorSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4sIGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGljIGZ1bmN0aW9uCisoZS5nLiwgdGltZSBzYW1wbGVzLCBjYWxscyB0byBvdGhlciBmdW5jdGlvbnMsIGNhbGxzIGZyb20gb3RoZXIgZnVuY3Rpb25zKQorYmVsb25ncyB0byB0aGUgZnVuY3Rpb24gbG9hZGVkIGp1c3QgYmVmb3JlIHRoZSBzdGF0aWMgZnVuY3Rpb24gaW4gdGhlCitcJmBvYmpmaWxlJyBmaWxlLgorLlRQCisuQiBcLWIKK3N1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZCBpbiB0aGUgcHJvZmlsZS4KKy5UUAorLkIgXC1jCit0aGUgc3RhdGljIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0gaXMgZGlzY292ZXJlZCBieSBhIGhldXJpc3RpYwordGhhdCBleGFtaW5lcyB0aGUgdGV4dCBzcGFjZSBvZiB0aGUgb2JqZWN0IGZpbGUuCitTdGF0aWMtb25seSBwYXJlbnRzIG9yIGNoaWxkcmVuIGFyZSBzaG93bgord2l0aCBjYWxsIGNvdW50cyBvZiAwLgorLlRQCisuQkkgIlwtZSAiIG5hbWUKK3N1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCisuSSBuYW1lCithbmQgYWxsIGl0cyBkZXNjZW5kYW50cworKHVubGVzcyB0aGV5IGhhdmUgb3RoZXIgYW5jZXN0b3JzIHRoYXQgYXJlbid0IHN1cHByZXNzZWQpLgorTW9yZSB0aGFuIG9uZQorLkIgXC1lCitvcHRpb24gbWF5IGJlIGdpdmVuLgorT25seSBvbmUKKy5JIG5hbWUKK21heSBiZSBnaXZlbiB3aXRoIGVhY2gKKy5CIFwtZQorb3B0aW9uLgorLlRQCisuQkkgIlwtRSAiIG5hbWUKK3N1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCisuSSBuYW1lCisoYW5kIGl0cyBkZXNjZW5kYW50cykgYXMKKy5CIFwtZSAgLAorYWJvdmUsIGFuZCBhbHNvIGV4Y2x1ZGVzIHRoZSB0aW1lIHNwZW50IGluCisuSSBuYW1lCisoYW5kIGl0cyBkZXNjZW5kYW50cykgZnJvbSB0aGUgdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCisoRm9yIGV4YW1wbGUsCisuQkkgIlwtRSAiIG1jb3VudAorLkJJICJcLUUgIiBtY2xlYW51cAoraXMgdGhlIGRlZmF1bHQuKQorLlRQCisuQkkgIlwtZiAiIG5hbWUKK3ByaW50cyB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBvZiBvbmx5IHRoZSBzcGVjaWZpZWQgcm91dGluZQorLkkgbmFtZQorYW5kIGl0cyBkZXNjZW5kYW50cy4KK01vcmUgdGhhbiBvbmUKKy5CIFwtZgorb3B0aW9uIG1heSBiZSBnaXZlbi4KK09ubHkgb25lCisuSSBuYW1lCittYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCisuQiBcLWYKK29wdGlvbi4KKy5UUAorLkJJICJcLUYgIiBuYW1lCitwcmludHMgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgb2Ygb25seSB0aGUgcm91dGluZQorLkkgbmFtZQorYW5kIGl0cyBkZXNjZW5kYW50cyAoYXMKKy5CIFwtZiAsCithYm92ZSkgYW5kIGFsc28gdXNlcyBvbmx5IHRoZSB0aW1lcyBvZiB0aGUgcHJpbnRlZCByb3V0aW5lcworaW4gdG90YWwgdGltZSBhbmQgcGVyY2VudGFnZSBjb21wdXRhdGlvbnMuCitNb3JlIHRoYW4gb25lCisuQiBcLUYKK29wdGlvbiBtYXkgYmUgZ2l2ZW4uCitPbmx5IG9uZQorLkkgbmFtZQorbWF5IGJlIGdpdmVuIHdpdGggZWFjaAorLkIgXC1GCitvcHRpb24uCitUaGUKKy5CIFwtRgorb3B0aW9uCitvdmVycmlkZXMKK3RoZQorLkIgXC1FCitvcHRpb24uCisuVFAKKy5CSSAiXC1rICIgImZyb21uYW1lIHRvbmFtZSIKK3dpbGwgZGVsZXRlIGFueSBhcmNzIGZyb20gcm91dGluZQorLkkgZnJvbW5hbWUKK3RvIHJvdXRpbmUKKy5JUiB0b25hbWUgIC4KK1RoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgdW5kZXNpcmVkIGN5Y2xlcy4KK01vcmUgdGhhbiBvbmUKKy5CIFwtaworb3B0aW9uIG1heSBiZSBnaXZlbi4KK09ubHkgb25lIHBhaXIgb2Ygcm91dGluZSBuYW1lcyBtYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCisuQiBcLWsKK29wdGlvbi4KKy5UUAorLkIgXC1zCithIHByb2ZpbGUgZmlsZSBgZ21vbi5zdW0nIGlzIHByb2R1Y2VkIHRoYXQgcmVwcmVzZW50cwordGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiBhbGwgdGhlIHNwZWNpZmllZCBwcm9maWxlIGZpbGVzLgorVGhpcyBzdW1tYXJ5IHByb2ZpbGUgZmlsZSBtYXkgYmUgZ2l2ZW4gdG8gbGF0ZXIKK2V4ZWN1dGlvbnMgb2YgZ3Byb2YgKHByb2JhYmx5IGFsc28gd2l0aCBhCisuQlIgXC1zICApCit0byBhY2N1bXVsYXRlIHByb2ZpbGUgZGF0YSBhY3Jvc3Mgc2V2ZXJhbCBydW5zIG9mIGFuIGBvYmpmaWxlJyBmaWxlLgorLlRQCisuQiAtdgorcHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgZ3Byb2YsIGFuZCB0aGVuIGV4aXRzLgorLlRQCisuQiAtegorZGlzcGxheXMgcm91dGluZXMgdGhhdCBoYXZlIHplcm8gdXNhZ2UgKGFzIHNob3duIGJ5IGNhbGwgY291bnRzCithbmQgYWNjdW11bGF0ZWQgdGltZSkuCitUaGlzIGlzIHVzZWZ1bCB3aXRoIHRoZQorLkIgXC1jCitvcHRpb24gZm9yIGRpc2NvdmVyaW5nIHdoaWNoIHJvdXRpbmVzIHdlcmUgbmV2ZXIgY2FsbGVkLgorLlBQCisuU0ggRklMRVMKKy50YSBcdydnbW9uLnN1bSAndQorYS5vdXQJdGhlIG5hbWVsaXN0IGFuZCB0ZXh0IHNwYWNlLgorLmJyCitnbW9uLm91dAlkeW5hbWljIGNhbGwgZ3JhcGggYW5kIHByb2ZpbGUuCisuYnIKK2dtb24uc3VtIHN1bW1hcml6ZWQgZHluYW1pYyBjYWxsIGdyYXBoIGFuZCBwcm9maWxlLgorLlNIIFNFRSBBTFNPCisuQlIgbW9uaXRvciAoIDMgKSAsCisuQlIgcHJvZmlsICggMiApICwKKy5CUiBjYyAoIDEgKSAsCisuQlIgcHJvZiAoIDEgKQorLnNwCitgYEFuIEV4ZWN1dGlvbiBQcm9maWxlciBmb3IgTW9kdWxhciBQcm9ncmFtcycnLAorYnkgUy4gR3JhaGFtLCBQLiBLZXNzbGVyLCBNLiBNY0t1c2ljazsKKy5JCitTb2Z0d2FyZSBcLSBQcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwKK1ZvbC4gMTMsIHBwLiA2NzEtNjg1LCAxOTgzLgorLnNwCitgYGdwcm9mOiBBIENhbGwgR3JhcGggRXhlY3V0aW9uIFByb2ZpbGVyJycsCitieSBTLiBHcmFoYW0sIFAuIEtlc3NsZXIsIE0uIE1jS3VzaWNrOworLkkKK1Byb2NlZWRpbmdzIG9mIHRoZSBTSUdQTEFOICc4MiBTeW1wb3NpdW0gb24gQ29tcGlsZXIgQ29uc3RydWN0aW9uLAorU0lHUExBTiBOb3RpY2VzLCBWb2wuIDE3LCBObyAgNiwgcHAuIDEyMC0xMjYsIEp1bmUgMTk4Mi4KKy5TSCBISVNUT1JZCisuQiBHcHJvZgorYXBwZWFyZWQgaW4gNC4yIEJTRC4KKy5TSCBCVUdTCitUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHNhbXBsaW5nIGlzIHNob3duLCBidXQgcmVtYWlucworc3RhdGlzdGljYWwgYXQgYmVzdC4KK1dlIGFzc3VtZSB0aGF0IHRoZSB0aW1lIGZvciBlYWNoIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uCitjYW4gYmUgZXhwcmVzc2VkIGJ5IHRoZSB0b3RhbCB0aW1lIGZvciB0aGUgZnVuY3Rpb24gZGl2aWRlZAorYnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorVGh1cyB0aGUgdGltZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoIGFyY3MgdG8gdGhlIGZ1bmN0aW9uJ3MKK3BhcmVudHMgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdAorYXJjIGlzIHRyYXZlcnNlZC4KKy5QUAorUGFyZW50cyB0aGF0IGFyZSBub3QgdGhlbXNlbHZlcyBwcm9maWxlZCB3aWxsIGhhdmUgdGhlIHRpbWUgb2YKK3RoZWlyIHByb2ZpbGVkIGNoaWxkcmVuIHByb3BhZ2F0ZWQgdG8gdGhlbSwgYnV0IHRoZXkgd2lsbCBhcHBlYXIKK3RvIGJlIHNwb250YW5lb3VzbHkgaW52b2tlZCBpbiB0aGUgY2FsbCBncmFwaCBsaXN0aW5nLCBhbmQgd2lsbAorbm90IGhhdmUgdGhlaXIgdGltZSBwcm9wYWdhdGVkIGZ1cnRoZXIuCitTaW1pbGFybHksIHNpZ25hbCBjYXRjaGVycywgZXZlbiB0aG91Z2ggcHJvZmlsZWQsIHdpbGwgYXBwZWFyCit0byBiZSBzcG9udGFuZW91cyAoYWx0aG91Z2ggZm9yIG1vcmUgb2JzY3VyZSByZWFzb25zKS4KK0FueSBwcm9maWxlZCBjaGlsZHJlbiBvZiBzaWduYWwgY2F0Y2hlcnMgc2hvdWxkIGhhdmUgdGhlaXIgdGltZXMKK3Byb3BhZ2F0ZWQgcHJvcGVybHksIHVubGVzcyB0aGUgc2lnbmFsIGNhdGNoZXIgd2FzIGludm9rZWQgZHVyaW5nCit0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9maWxpbmcgcm91dGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgaXMgbG9zdC4KKy5QUAorVGhlIHByb2ZpbGVkIHByb2dyYW0gbXVzdCBjYWxsCisuQlIgZXhpdCAoIDIgKQorb3IgcmV0dXJuIG5vcm1hbGx5IGZvciB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIGJlIHNhdmVkCitpbiB0aGUgYGdtb24ub3V0JyBmaWxlLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuYyBiL2dwcm9mL2dwcm9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MDQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2dwcm9mLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQorICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQorICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KKyAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJiYXNpY19ibG9ja3MuaCIKKyNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCisjaW5jbHVkZSAiY2dfYXJjcy5oIgorI2luY2x1ZGUgImNnX3ByaW50LmgiCisjaW5jbHVkZSAiY29yZWZpbGUuaCIKKyNpbmNsdWRlICJnbW9uX2lvLmgiCisjaW5jbHVkZSAiaGVydHouaCIKKyNpbmNsdWRlICJoaXN0LmgiCisjaW5jbHVkZSAic291cmNlLmgiCisjaW5jbHVkZSAic3ltX2lkcy5oIgorCitjb25zdCBjaGFyICp3aG9hbWk7Citjb25zdCBjaGFyICpmdW5jdGlvbl9tYXBwaW5nX2ZpbGU7Citjb25zdCBjaGFyICphX291dF9uYW1lID0gQV9PVVROQU1FOworbG9uZyBoeiA9IEhaX1dST05HOworCisvKgorICogRGVmYXVsdCBvcHRpb25zIHZhbHVlczoKKyAqLworaW50IGRlYnVnX2xldmVsID0gMDsKK2ludCBvdXRwdXRfc3R5bGUgPSAwOworaW50IG91dHB1dF93aWR0aCA9IDgwOworYm9vbCBic2Rfc3R5bGVfb3V0cHV0ID0gRkFMU0U7Citib29sIGRlbWFuZ2xlID0gVFJVRTsKK2Jvb2wgZGlzY2FyZF91bmRlcnNjb3JlcyA9IFRSVUU7Citib29sIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBGQUxTRTsKK2Jvb2wgaWdub3JlX3N0YXRpY19mdW5jcyA9IEZBTFNFOworYm9vbCBpZ25vcmVfemVyb3MgPSBUUlVFOworYm9vbCBsaW5lX2dyYW51bGFyaXR5ID0gRkFMU0U7Citib29sIHByaW50X2Rlc2NyaXB0aW9ucyA9IFRSVUU7Citib29sIHByaW50X3BhdGggPSBGQUxTRTsKK2Jvb2wgaWdub3JlX25vbl9mdW5jdGlvbnMgPSBGQUxTRTsKK0ZpbGVfRm9ybWF0IGZpbGVfZm9ybWF0ID0gRkZfQVVUTzsKKworYm9vbCBmaXJzdF9vdXRwdXQgPSBUUlVFOworCitjaGFyIGNvcHlyaWdodFtdID0KKyBOXygiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iKTsKKworc3RhdGljIGNoYXIgKmdtb25fbmFtZSA9IEdNT05OQU1FOwkvKiBwcm9maWxlIGZpbGVuYW1lICovCisKK2JmZCAqYWJmZDsKKworLyoKKyAqIEZ1bmN0aW9ucyB0aGF0IGdldCBleGNsdWRlZCBieSBkZWZhdWx0OgorICovCitzdGF0aWMgY2hhciAqZGVmYXVsdF9leGNsdWRlZF9saXN0W10gPQoreworICAiX2dwcm9mX21jb3VudCIsICJtY291bnQiLCAiX21jb3VudCIsICJfX21jb3VudCIsICJfX21jb3VudF9pbnRlcm5hbCIsCisgICJfX21jbGVhbnVwIiwKKyAgIjxsb2NvcmU+IiwgIjxoaWNvcmU+IiwKKyAgMAorfTsKKworLyogQ29kZXMgdXNlZCBmb3IgdGhlIGxvbmcgb3B0aW9ucyB3aXRoIG5vIHNob3J0IHN5bm9ueW1zLiAgMTUwIGlzbid0CisgICBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KKworI2RlZmluZSBPUFRJT05fREVNQU5HTEUJCSgxNTApCisjZGVmaW5lIE9QVElPTl9OT19ERU1BTkdMRQkoT1BUSU9OX0RFTUFOR0xFICsgMSkKKworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQoreworICB7ImxpbmUiLCBub19hcmd1bWVudCwgMCwgJ2wnfSwKKyAgeyJuby1zdGF0aWMiLCBub19hcmd1bWVudCwgMCwgJ2EnfSwKKyAgeyJpZ25vcmUtbm9uLWZ1bmN0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCAnRCd9LAorCisgICAgLyogb3V0cHV0IHN0eWxlczogKi8KKworICB7ImFubm90YXRlZC1zb3VyY2UiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0EnfSwKKyAgeyJuby1hbm5vdGF0ZWQtc291cmNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdKJ30sCisgIHsiZmxhdC1wcm9maWxlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdwJ30sCisgIHsibm8tZmxhdC1wcm9maWxlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdQJ30sCisgIHsiZ3JhcGgiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ3EnfSwKKyAgeyJuby1ncmFwaCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnUSd9LAorICB7ImV4ZWMtY291bnRzIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdDJ30sCisgIHsibm8tZXhlYy1jb3VudHMiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1onfSwKKyAgeyJmdW5jdGlvbi1vcmRlcmluZyIsIG5vX2FyZ3VtZW50LCAwLCAncid9LAorICB7ImZpbGUtb3JkZXJpbmciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKKyAgeyJmaWxlLWluZm8iLCBub19hcmd1bWVudCwgMCwgJ2knfSwKKyAgeyJzdW0iLCBub19hcmd1bWVudCwgMCwgJ3MnfSwKKworICAgIC8qIHZhcmlvdXMgb3B0aW9ucyB0byBhZmZlY3Qgb3V0cHV0OiAqLworCisgIHsiYWxsLWxpbmVzIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCisgIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0RFTUFOR0xFfSwKKyAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fTk9fREVNQU5HTEV9LAorICB7ImRpcmVjdG9yeS1wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgIHsiZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zIiwgbm9fYXJndW1lbnQsIDAsICd6J30sCisgIHsibWluLWNvdW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdtJ30sCisgIHsicHJpbnQtcGF0aCIsIG5vX2FyZ3VtZW50LCAwLCAnTCd9LAorICB7InNlcGFyYXRlLWZpbGVzIiwgbm9fYXJndW1lbnQsIDAsICd5J30sCisgIHsic3RhdGljLWNhbGwtZ3JhcGgiLCBub19hcmd1bWVudCwgMCwgJ2MnfSwKKyAgeyJ0YWJsZS1sZW5ndGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3QnfSwKKyAgeyJ0aW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICduJ30sCisgIHsibm8tdGltZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAorICB7IndpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd3J30sCisgICAgLyoKKyAgICAgKiBUaGVzZSBhcmUgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG9ubHkuICBUaGVpciBmdW5jdGlvbmFsaXR5CisgICAgICogaXMgcHJvdmlkZWQgYnkgdGhlIG91dHB1dCBzdHlsZSBvcHRpb25zIGFscmVhZHk6CisgICAgICovCisgIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdlJ30sCisgIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdFJ30sCisgIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCisgIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCisgIHsiIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdrJ30sCisKKyAgICAvKiBtaXNjZWxsYW5lb3VzOiAqLworCisgIHsiYnJpZWYiLCBub19hcmd1bWVudCwgMCwgJ2InfSwKKyAgeyJkZWJ1ZyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnZCd9LAorICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKKyAgeyJmaWxlLWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAorICB7InRyYWRpdGlvbmFsIiwgbm9fYXJndW1lbnQsIDAsICdUJ30sCisgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAorICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Cit9OworCisKK3N0YXRpYyB2b2lkCitERUZVTiAodXNhZ2UsIChzdHJlYW0sIHN0YXR1cyksIEZJTEUgKiBzdHJlYW0gQU5EIGludCBzdGF0dXMpCit7CisgIGZwcmludGYgKHN0cmVhbSwgXygiXAorVXNhZ2U6ICVzIFstW2FiY0RoaWxMc1R2d3h5el1dIFstW0FDZUVmRkpuTk9wUHFRWl1bbmFtZV1dIFstSSBkaXJzXVxuXAorCVstZFtudW1dXSBbLWsgZnJvbS90b10gWy1tIG1pbi1jb3VudF0gWy10IHRhYmxlLWxlbmd0aF1cblwKKwlbLS1bbm8tXWFubm90YXRlZC1zb3VyY2VbPW5hbWVdXSBbLS1bbm8tXWV4ZWMtY291bnRzWz1uYW1lXV1cblwKKwlbLS1bbm8tXWZsYXQtcHJvZmlsZVs9bmFtZV1dIFstLVtuby1dZ3JhcGhbPW5hbWVdXVxuXAorCVstLVtuby1ddGltZT1uYW1lXSBbLS1hbGwtbGluZXNdIFstLWJyaWVmXSBbLS1kZWJ1Z1s9bGV2ZWxdXVxuXAorCVstLWZ1bmN0aW9uLW9yZGVyaW5nXSBbLS1maWxlLW9yZGVyaW5nXVxuXAorCVstLWRpcmVjdG9yeS1wYXRoPWRpcnNdIFstLWRpc3BsYXktdW51c2VkLWZ1bmN0aW9uc11cblwKKwlbLS1maWxlLWZvcm1hdD1uYW1lXSBbLS1maWxlLWluZm9dIFstLWhlbHBdIFstLWxpbmVdIFstLW1pbi1jb3VudD1uXVxuXAorCVstLW5vLXN0YXRpY10gWy0tcHJpbnQtcGF0aF0gWy0tc2VwYXJhdGUtZmlsZXNdXG5cCisJWy0tc3RhdGljLWNhbGwtZ3JhcGhdIFstLXN1bV0gWy0tdGFibGUtbGVuZ3RoPWxlbl0gWy0tdHJhZGl0aW9uYWxdXG5cCisJWy0tdmVyc2lvbl0gWy0td2lkdGg9bl0gWy0taWdub3JlLW5vbi1mdW5jdGlvbnNdXG5cCisJWy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXVxuXAorCVtpbWFnZS1maWxlXSBbcHJvZmlsZS1maWxlLi4uXVxuIiksCisJICAgd2hvYW1pKTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7CisgIGRvbmUgKHN0YXR1cyk7Cit9CisKKworaW50CitERUZVTiAobWFpbiwgKGFyZ2MsIGFyZ3YpLCBpbnQgYXJnYyBBTkQgY2hhciAqKmFyZ3YpCit7CisgIGNoYXIgKipzcCwgKnN0cjsKKyAgU3ltICoqY2cgPSAwOworICBpbnQgY2gsIHVzZXJfc3BlY2lmaWVkID0gMDsKKworI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQorICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7CisjZW5kaWYKKyAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7CisgIHRleHRkb21haW4gKFBBQ0tBR0UpOworCisgIHdob2FtaSA9IGFyZ3ZbMF07CisgIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAod2hvYW1pKTsKKworICB3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsCisJImFBOjpiQmNDZEQ6OmU6RTpmOkY6aGlJOko6Oms6bExtOm46Ok46Ok86cDo6UDo6cTo6UTo6c3Q6VHZ3Onh5elo6OiIsCisJCQkgICAgbG9uZ19vcHRpb25zLCAwKSkKKwkgIT0gRU9GKQorICAgIHsKKyAgICAgIHN3aXRjaCAoY2gpCisJeworCWNhc2UgJ2EnOgorCSAgaWdub3JlX3N0YXRpY19mdW5jcyA9IFRSVUU7CisJICBicmVhazsKKwljYXNlICdBJzoKKwkgIGlmIChvcHRhcmcpCisJICAgIHsKKwkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfQU5OTyk7CisJICAgIH0KKwkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOworCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKKwkgIGJyZWFrOworCWNhc2UgJ2InOgorCSAgcHJpbnRfZGVzY3JpcHRpb25zID0gRkFMU0U7CisJICBicmVhazsKKwljYXNlICdCJzoKKwkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOworCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKKwkgIGJyZWFrOworCWNhc2UgJ2MnOgorCSAgaWdub3JlX2RpcmVjdF9jYWxscyA9IFRSVUU7CisJICBicmVhazsKKwljYXNlICdDJzoKKwkgIGlmIChvcHRhcmcpCisJICAgIHsKKwkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRVhFQyk7CisJICAgIH0KKwkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKKwkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0VYRUNfQ09VTlRTOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBpZiAob3B0YXJnKQorCSAgICB7CisJICAgICAgZGVidWdfbGV2ZWwgfD0gYXRvaSAob3B0YXJnKTsKKwkgICAgICBkZWJ1Z19sZXZlbCB8PSBBTllERUJVRzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZGVidWdfbGV2ZWwgPSB+MDsKKwkgICAgfQorCSAgREJHIChBTllERUJVRywgcHJpbnRmICgiW21haW5dIGRlYnVnLWxldmVsPTB4JXhcbiIsIGRlYnVnX2xldmVsKSk7CisjaWZuZGVmIERFQlVHCisJICBwcmludGYgKF8oIiVzOiBkZWJ1Z2dpbmcgbm90IHN1cHBvcnRlZDsgLWQgaWdub3JlZFxuIiksIHdob2FtaSk7CisjZW5kaWYJLyogREVCVUcgKi8KKwkgIGJyZWFrOworCWNhc2UgJ0QnOgorCSAgaWdub3JlX25vbl9mdW5jdGlvbnMgPSBUUlVFOworCSAgYnJlYWs7CisJY2FzZSAnRSc6CisJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfVElNRSk7CisJY2FzZSAnZSc6CisJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfR1JBUEgpOworCSAgYnJlYWs7CisJY2FzZSAnRic6CisJICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfVElNRSk7CisJY2FzZSAnZic6CisJICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfR1JBUEgpOworCSAgYnJlYWs7CisJY2FzZSAnZyc6CisJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRkxBVCk7CisJICBicmVhazsKKwljYXNlICdHJzoKKwkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9GTEFUKTsKKwkgIGJyZWFrOworCWNhc2UgJ2gnOgorCSAgdXNhZ2UgKHN0ZG91dCwgMCk7CisJY2FzZSAnaSc6CisJICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfR01PTl9JTkZPOworCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfR01PTl9JTkZPOworCSAgYnJlYWs7CisJY2FzZSAnSSc6CisJICBzZWFyY2hfbGlzdF9hcHBlbmQgKCZzcmNfc2VhcmNoX2xpc3QsIG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlICdKJzoKKwkgIGlmIChvcHRhcmcpCisJICAgIHsKKwkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfQU5OTyk7CisJICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKKwkgICAgfQorCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKKwkgIGJyZWFrOworCWNhc2UgJ2snOgorCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FSQ1MpOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJICBsaW5lX2dyYW51bGFyaXR5ID0gVFJVRTsKKwkgIGJyZWFrOworCWNhc2UgJ0wnOgorCSAgcHJpbnRfcGF0aCA9IFRSVUU7CisJICBicmVhazsKKwljYXNlICdtJzoKKwkgIGJiX21pbl9jYWxscyA9ICh1bnNpZ25lZCBsb25nKSBzdHJ0b3VsIChvcHRhcmcsIChjaGFyICoqKSBOVUxMLCAxMCk7CisJICBicmVhazsKKwljYXNlICduJzoKKwkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9USU1FKTsKKwkgIGJyZWFrOworCWNhc2UgJ04nOgorCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX1RJTUUpOworCSAgYnJlYWs7CisJY2FzZSAnTyc6CisJICBzd2l0Y2ggKG9wdGFyZ1swXSkKKwkgICAgeworCSAgICBjYXNlICdhJzoKKwkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0FVVE87CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ20nOgorCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfTUFHSUM7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2InOgorCSAgICAgIGZpbGVfZm9ybWF0ID0gRkZfQlNEOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICc0JzoKKwkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0JTRDQ0OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdwJzoKKwkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX1BST0Y7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5rbm93biBmaWxlIGZvcm1hdCAlc1xuIiksCisJCSAgICAgICBvcHRhcmcsIHdob2FtaSk7CisJICAgICAgZG9uZSAoMSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ3AnOgorCSAgaWYgKG9wdGFyZykKKwkgICAgeworCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9GTEFUKTsKKwkgICAgfQorCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKKwkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKKwkgIGJyZWFrOworCWNhc2UgJ1AnOgorCSAgaWYgKG9wdGFyZykKKwkgICAgeworCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9GTEFUKTsKKwkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0ZMQVRfUFJPRklMRTsKKwkgICAgfQorCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfRkxBVF9QUk9GSUxFOworCSAgYnJlYWs7CisJY2FzZSAncSc6CisJICBpZiAob3B0YXJnKQorCSAgICB7CisJICAgICAgaWYgKHN0cmNociAob3B0YXJnLCAnLycpKQorCQl7CisJCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0FSQ1MpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0dSQVBIKTsKKwkJfQorCSAgICB9CisJICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKKwkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7CisJICBicmVhazsKKwljYXNlICdyJzoKKwkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GVU5DVElPTl9PUkRFUjsKKwkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZVTkNUSU9OX09SREVSOworCSAgYnJlYWs7CisJY2FzZSAnUic6CisJICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRklMRV9PUkRFUjsKKwkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZJTEVfT1JERVI7CisJICBmdW5jdGlvbl9tYXBwaW5nX2ZpbGUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlICdRJzoKKwkgIGlmIChvcHRhcmcpCisJICAgIHsKKwkgICAgICBpZiAoc3RyY2hyIChvcHRhcmcsICcvJykpCisJCXsKKwkJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfQVJDUyk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfR1JBUEgpOworCQl9CisJICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfQ0FMTF9HUkFQSDsKKwkgICAgfQorCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX1NVTU1BUllfRklMRTsKKwkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX1NVTU1BUllfRklMRTsKKwkgIGJyZWFrOworCWNhc2UgJ3QnOgorCSAgYmJfdGFibGVfbGVuZ3RoID0gYXRvaSAob3B0YXJnKTsKKwkgIGlmIChiYl90YWJsZV9sZW5ndGggPCAwKQorCSAgICB7CisJICAgICAgYmJfdGFibGVfbGVuZ3RoID0gMDsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnVCc6CisJICBic2Rfc3R5bGVfb3V0cHV0ID0gVFJVRTsKKwkgIGJyZWFrOworCWNhc2UgJ3YnOgorCSAgLyogVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LiAgKi8KKwkgIHByaW50ZiAoXygiR05VIGdwcm9mICVzXG4iKSwgVkVSU0lPTik7CisJICBwcmludGYgKF8oIkJhc2VkIG9uIEJTRCBncHJvZiwgY29weXJpZ2h0IDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIikpOworCSAgcHJpbnRmIChfKCJcCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKKwkgIGRvbmUgKDApOworCWNhc2UgJ3cnOgorCSAgb3V0cHV0X3dpZHRoID0gYXRvaSAob3B0YXJnKTsKKwkgIGlmIChvdXRwdXRfd2lkdGggPCAxKQorCSAgICB7CisJICAgICAgb3V0cHV0X3dpZHRoID0gMTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAneCc6CisJICBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgPSBUUlVFOworCSAgYnJlYWs7CisJY2FzZSAneSc6CisJICBjcmVhdGVfYW5ub3RhdGlvbl9maWxlcyA9IFRSVUU7CisJICBicmVhazsKKwljYXNlICd6JzoKKwkgIGlnbm9yZV96ZXJvcyA9IEZBTFNFOworCSAgYnJlYWs7CisJY2FzZSAnWic6CisJICBpZiAob3B0YXJnKQorCSAgICB7CisJICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0VYRUMpOworCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9FWEVDX0NPVU5UUzsKKwkgICAgfQorCSAgdXNlcl9zcGVjaWZpZWQgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0RFTUFOR0xFOgorCSAgZGVtYW5nbGUgPSBUUlVFOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTk9fREVNQU5HTEU6CisJICBkZW1hbmdsZSA9IEZBTFNFOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHVzYWdlIChzdGRlcnIsIDEpOworCX0KKyAgICB9CisKKyAgLyogRG9uJ3QgYWxsb3cgYm90aCBvcmRlcmluZyBvcHRpb25zLCB0aGV5IG1vZGlmeSB0aGUgYXJjIGRhdGEgaW4tcGxhY2UuICAqLworICBpZiAoKHVzZXJfc3BlY2lmaWVkICYgU1RZTEVfRlVOQ1RJT05fT1JERVIpCisgICAgICAmJiAodXNlcl9zcGVjaWZpZWQgJiBTVFlMRV9GSUxFX09SREVSKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsXygiXAorJXM6IE9ubHkgb25lIG9mIC0tZnVuY3Rpb24tb3JkZXJpbmcgYW5kIC0tZmlsZS1vcmRlcmluZyBtYXkgYmUgc3BlY2lmaWVkLlxuIiksCisJICAgICAgIHdob2FtaSk7CisgICAgICBkb25lICgxKTsKKyAgICB9CisKKyAgLyogLS1zdW0gaW1wbGllcyAtLWxpbmUsIG90aGVyd2lzZSB3ZSdkIGxvc2UgYi1iIGNvdW50cyBpbiBnbW9uLnN1bSAqLworICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfU1VNTUFSWV9GSUxFKQorICAgIHsKKyAgICAgIGxpbmVfZ3JhbnVsYXJpdHkgPSAxOworICAgIH0KKworICAvKiBhcHBlbmQgdmFsdWUgb2YgR1BST0ZfUEFUSCB0byBzb3VyY2Ugc2VhcmNoIGxpc3QgaWYgc2V0OiAqLworICBzdHIgPSAoY2hhciAqKSBnZXRlbnYgKCJHUFJPRl9QQVRIIik7CisgIGlmIChzdHIpCisgICAgeworICAgICAgc2VhcmNoX2xpc3RfYXBwZW5kICgmc3JjX3NlYXJjaF9saXN0LCBzdHIpOworICAgIH0KKworICBpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisgICAgICBhX291dF9uYW1lID0gYXJndltvcHRpbmQrK107CisgICAgfQorICBpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisgICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZCsrXTsKKyAgICB9CisKKyAgLyoKKyAgICogVHVybiBvZmYgZGVmYXVsdCBmdW5jdGlvbnM6CisgICAqLworICBmb3IgKHNwID0gJmRlZmF1bHRfZXhjbHVkZWRfbGlzdFswXTsgKnNwOyBzcCsrKQorICAgIHsKKyAgICAgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9USU1FKTsKKyAgICAgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9HUkFQSCk7CisjaWZkZWYgX19hbHBoYV9fCisgICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfRkxBVCk7CisjZW5kaWYKKyAgICB9CisKKyAgLyoKKyAgICogRm9yIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGFsc28gd2FudCB0byBrZWVwIHRob3NlCisgICAqIGZ1bmN0aW9ucyBvZmYgdGhlIGZsYXQgcHJvZmlsZToKKyAgICovCisgIGlmIChsaW5lX2dyYW51bGFyaXR5KQorICAgIHsKKyAgICAgIGZvciAoc3AgPSAmZGVmYXVsdF9leGNsdWRlZF9saXN0WzBdOyAqc3A7IHNwKyspCisJeworCSAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0ZMQVQpOworCX0KKyAgICB9CisKKyAgLyoKKyAgICogUmVhZCBzeW1ib2wgdGFibGUgZnJvbSBjb3JlIGZpbGU6CisgICAqLworICBjb3JlX2luaXQgKGFfb3V0X25hbWUpOworCisgIC8qCisgICAqIElmIHdlIHNob3VsZCBpZ25vcmUgZGlyZWN0IGZ1bmN0aW9uIGNhbGxzLCB3ZSBuZWVkIHRvIGxvYWQKKyAgICogdG8gY29yZSdzIHRleHQtc3BhY2U6CisgICAqLworICBpZiAoaWdub3JlX2RpcmVjdF9jYWxscykKKyAgICB7CisgICAgICBjb3JlX2dldF90ZXh0X3NwYWNlIChjb3JlX2JmZCk7CisgICAgfQorCisgIC8qCisgICAqIENyZWF0ZSBzeW1ib2xzIGZyb20gY29yZSBpbWFnZToKKyAgICovCisgIGlmIChsaW5lX2dyYW51bGFyaXR5KQorICAgIHsKKyAgICAgIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyAoY29yZV9iZmQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgKGNvcmVfYmZkKTsKKyAgICB9CisKKyAgLyoKKyAgICogVHJhbnNsYXRlIHN5bSBzcGVjcyBpbnRvIHN5bXM6CisgICAqLworICBzeW1faWRfcGFyc2UgKCk7CisKKyAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX1BST0YpCisgICAgeworI2lmZGVmIFBST0ZfU1VQUE9SVF9JTVBMRU1FTlRFRAorICAgICAgLyoKKyAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBtb24ub3V0IGZpbGUocyk6CisgICAgICAgKi8KKyAgICAgIGRvCisJeworCSAgbW9uX291dF9yZWFkIChnbW9uX25hbWUpOworCSAgaWYgKG9wdGluZCA8IGFyZ2MpCisJICAgIHsKKwkgICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZF07CisJICAgIH0KKwl9CisgICAgICB3aGlsZSAob3B0aW5kKysgPCBhcmdjKTsKKyNlbHNlCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgIF8oIiVzOiBzb3JyeSwgZmlsZSBmb3JtYXQgYHByb2YnIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKSwKKwkgICAgICAgd2hvYW1pKTsKKyAgICAgIGRvbmUgKDEpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBnbW9uLm91dCBmaWxlKHMpOgorICAgICAgICovCisgICAgICBkbworCXsKKwkgIGdtb25fb3V0X3JlYWQgKGdtb25fbmFtZSk7CisJICBpZiAob3B0aW5kIDwgYXJnYykKKwkgICAgeworCSAgICAgIGdtb25fbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChvcHRpbmQrKyA8IGFyZ2MpOworICAgIH0KKworICAvKgorICAgKiBJZiB1c2VyIGRpZCBub3Qgc3BlY2lmeSBvdXRwdXQgc3R5bGUsIHRyeSB0byBndWVzcyBzb21ldGhpbmcKKyAgICogcmVhc29uYWJsZToKKyAgICovCisgIGlmIChvdXRwdXRfc3R5bGUgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZ21vbl9pbnB1dCAmIChJTlBVVF9ISVNUT0dSQU0gfCBJTlBVVF9DQUxMX0dSQVBIKSkKKwl7CisJICBvdXRwdXRfc3R5bGUgPSBTVFlMRV9GTEFUX1BST0ZJTEUgfCBTVFlMRV9DQUxMX0dSQVBIOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBvdXRwdXRfc3R5bGUgPSBTVFlMRV9FWEVDX0NPVU5UUzsKKwl9CisgICAgICBvdXRwdXRfc3R5bGUgJj0gfnVzZXJfc3BlY2lmaWVkOworICAgIH0KKworICAvKgorICAgKiBEdW1wIGEgZ21vbi5zdW0gZmlsZSBpZiByZXF1ZXN0ZWQgKGJlZm9yZSBhbnkgb3RoZXIgcHJvY2Vzc2luZyEpOgorICAgKi8KKyAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX1NVTU1BUllfRklMRSkKKyAgICB7CisgICAgICBnbW9uX291dF93cml0ZSAoR01PTlNVTSk7CisgICAgfQorCisgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfSElTVE9HUkFNKQorICAgIHsKKyAgICAgIGhpc3RfYXNzaWduX3NhbXBsZXMgKCk7CisgICAgfQorCisgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkKKyAgICB7CisgICAgICBjZyA9IGNnX2Fzc2VtYmxlICgpOworICAgIH0KKworICAvKiBkbyBzb21lIHNpbXBsZSBzYW5pdHkgY2hlY2tzOiAqLworCisgIGlmICgob3V0cHV0X3N0eWxlICYgU1RZTEVfRkxBVF9QUk9GSUxFKQorICAgICAgJiYgIShnbW9uX2lucHV0ICYgSU5QVVRfSElTVE9HUkFNKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgaGlzdG9ncmFtXG4iKSwgd2hvYW1pKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKworICBpZiAoKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpICYmICEoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkgICAgICAgXygiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBjYWxsLWdyYXBoIGRhdGFcbiIpLCB3aG9hbWkpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIC8qIG91dHB1dCB3aGF0ZXZlciB1c2VyIHdoaXNoZXMgdG8gc2VlOiAqLworCisgIGlmIChjZyAmJiAob3V0cHV0X3N0eWxlICYgU1RZTEVfQ0FMTF9HUkFQSCkgJiYgYnNkX3N0eWxlX291dHB1dCkKKyAgICB7CisgICAgICBjZ19wcmludCAoY2cpOwkJLyogcHJpbnQgdGhlIGR5bmFtaWMgcHJvZmlsZSAqLworICAgIH0KKworICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfRkxBVF9QUk9GSUxFKQorICAgIHsKKyAgICAgIGhpc3RfcHJpbnQgKCk7CQkvKiBwcmludCB0aGUgZmxhdCBwcm9maWxlICovCisgICAgfQorCisgIGlmIChjZyAmJiAob3V0cHV0X3N0eWxlICYgU1RZTEVfQ0FMTF9HUkFQSCkpCisgICAgeworICAgICAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQorCXsKKwkgIGNnX3ByaW50IChjZyk7CS8qIHByaW50IHRoZSBkeW5hbWljIHByb2ZpbGUgKi8KKwl9CisgICAgICBjZ19wcmludF9pbmRleCAoKTsKKyAgICB9CisKKyAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0VYRUNfQ09VTlRTKQorICAgIHsKKyAgICAgIHByaW50X2V4ZWNfY291bnRzICgpOworICAgIH0KKworICBpZiAob3V0cHV0X3N0eWxlICYgU1RZTEVfQU5OT1RBVEVEX1NPVVJDRSkKKyAgICB7CisgICAgICBwcmludF9hbm5vdGF0ZWRfc291cmNlICgpOworICAgIH0KKyAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZVTkNUSU9OX09SREVSKQorICAgIHsKKyAgICAgIGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nICgpOworICAgIH0KKyAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZJTEVfT1JERVIpCisgICAgeworICAgICAgY2dfcHJpbnRfZmlsZV9vcmRlcmluZyAoKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCit2b2lkCitkb25lIChzdGF0dXMpCisgICAgIGludCBzdGF0dXM7Cit7CisgIGV4aXQgKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi5oIGIvZ3Byb2YvZ3Byb2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYyYWVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvZ3Byb2YuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5CisgKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCisgKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJworICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogICAgICBAKCMpZ3Byb2YuaCAgICAgNS45IChCZXJrZWxleSkgNi8xLzkwCisgKi8KKyNpZm5kZWYgZ3Byb2ZfaAorI2RlZmluZSBncHJvZl9oCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorCisvKiBJbmNsdWRlIHRoZSBCRkQgc3lzZGVwLmggZmlsZS4gICovCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKy8qIFVuZGVmaW5lIHRoZSBCRkQgUEFDS0FHRSBhbmQgVkVSU0lPTiBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZyB0aGUKKyAgIGdwcm9mIGNvbmZpZy5oIGZpbGUuICAqLworI3VuZGVmIFBBQ0tBR0UKKyN1bmRlZiBWRVJTSU9OCisvKiBBbHNvIHVuZGVmaW5lIEJGRCdzIGBfJyBtYWNybzsgd2UgaGF2ZSBvdXIgb3duIGRlZmluaXRpb24uICAqLworI3VuZGVmIF8KKworI2luY2x1ZGUgImdjb25maWcuaCIKKworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisvKiBBSVggZGVmaW5lcyBoeiBhcyBhIG1hY3JvLiAgKi8KKyN1bmRlZiBoegorCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYCTEwMjQKKyNlbmRpZgorCisjZGVmaW5lCUFfT1VUTkFNRQkiYS5vdXQiCS8qIGRlZmF1bHQgY29yZSBmaWxlbmFtZSAqLworI2RlZmluZQlHTU9OTkFNRQkiZ21vbi5vdXQiCS8qIGRlZmF1bHQgcHJvZmlsZSBmaWxlbmFtZSAqLworI2RlZmluZQlHTU9OU1VNCQkiZ21vbi5zdW0iCS8qIHByb2ZpbGUgc3VtbWFyeSBmaWxlbmFtZSAqLworCisjaWZkZWYgSEFWRV9MT0NBTEVfSAorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX05MUworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQorIyBpZmRlZiBnZXR0ZXh0X25vb3AKKyMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQorIyBlbHNlCisjICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorIyBlbmRpZgorI2Vsc2UKKy8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCisjIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKKyMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQorIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQorIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKKyMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorI2VuZGlmCisKKworLyoKKyAqIFRoZXNlIG1heSBhbHJlYWR5IGJlIGRlZmluZWQgb24gc29tZSBzeXN0ZW1zLiAgV2UgY291bGQgcHJvYmFibHkKKyAqIGp1c3QgdXNlIHRoZSBCRkQgdmVyc2lvbnMgb2YgdGhlc2UsIHNpbmNlIEJGRCBoYXMgYWxyZWFkeSBkZWFsdAorICogd2l0aCB0aGlzIHByb2JsZW0uCisgKi8KKyN1bmRlZiBGQUxTRQorI2RlZmluZQlGQUxTRQkwCisjdW5kZWYgVFJVRQorI2RlZmluZQlUUlVFCTEKKworI2RlZmluZSBTVFlMRV9GTEFUX1BST0ZJTEUJKDE8PDApCisjZGVmaW5lIFNUWUxFX0NBTExfR1JBUEgJKDE8PDEpCisjZGVmaW5lIFNUWUxFX1NVTU1BUllfRklMRQkoMTw8MikKKyNkZWZpbmUgU1RZTEVfRVhFQ19DT1VOVFMJKDE8PDMpCisjZGVmaW5lIFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0UJKDE8PDQpCisjZGVmaW5lIFNUWUxFX0dNT05fSU5GTwkJKDE8PDUpCisjZGVmaW5lIFNUWUxFX0ZVTkNUSU9OX09SREVSCSgxPDw2KQorI2RlZmluZSBTVFlMRV9GSUxFX09SREVSCSgxPDw3KQorCisjZGVmaW5lCUFOWURFQlVHCSgxPDwwKQkvKiAgICAxICovCisjZGVmaW5lCURGTkRFQlVHCSgxPDwxKQkvKiAgICAyICovCisjZGVmaW5lCUNZQ0xFREVCVUcJKDE8PDIpCS8qICAgIDQgKi8KKyNkZWZpbmUJQVJDREVCVUcJKDE8PDMpCS8qICAgIDggKi8KKyNkZWZpbmUJVEFMTFlERUJVRwkoMTw8NCkJLyogICAxNiAqLworI2RlZmluZQlUSU1FREVCVUcJKDE8PDUpCS8qICAgMzIgKi8KKyNkZWZpbmUJU0FNUExFREVCVUcJKDE8PDYpCS8qICAgNjQgKi8KKyNkZWZpbmUJQU9VVERFQlVHCSgxPDw3KQkvKiAgMTI4ICovCisjZGVmaW5lCUNBTExERUJVRwkoMTw8OCkJLyogIDI1NiAqLworI2RlZmluZQlMT09LVVBERUJVRwkoMTw8OSkJLyogIDUxMiAqLworI2RlZmluZQlQUk9QREVCVUcJKDE8PDEwKQkvKiAxMDI0ICovCisjZGVmaW5lIEJCREVCVUcJCSgxPDwxMSkJLyogMjA0OCAqLworI2RlZmluZSBJRERFQlVHCQkoMTw8MTIpCS8qIDQwOTYgKi8KKyNkZWZpbmUgU1JDREVCVUcJKDE8PDEzKQkvKiA4MTkyICovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcobCxzKQlpZiAoZGVidWdfbGV2ZWwgJiAobCkpIHtzO30KKyNlbHNlCisjZGVmaW5lIERCRyhsLHMpCisjZW5kaWYKKwordHlwZWRlZiBlbnVtCisgIHsKKyAgICBGRl9BVVRPID0gMCwgRkZfTUFHSUMsIEZGX0JTRCwgRkZfQlNENDQsIEZGX1BST0YKKyAgfQorRmlsZV9Gb3JtYXQ7CisKK3R5cGVkZWYgaW50IGJvb2w7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVU5JVFsyXTsJLyogdW5pdCBvZiBwcm9maWxpbmcgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKndob2FtaTsJLyogY29tbWFuZC1uYW1lLCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KK2V4dGVybiBjb25zdCBjaGFyICpmdW5jdGlvbl9tYXBwaW5nX2ZpbGU7IC8qIGZpbGUgbWFwcGluZyBmdW5jdGlvbnMgdG8gZmlsZXMgKi8KK2V4dGVybiBjb25zdCBjaGFyICphX291dF9uYW1lOwkvKiBjb3JlIGZpbGVuYW1lICovCitleHRlcm4gbG9uZyBoejsJCQkvKiB0aWNrcyBwZXIgc2Vjb25kICovCisKKy8qCisgKiBDb21tYW5kLWxpbmUgb3B0aW9uczoKKyAqLworZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsJCS8qIGRlYnVnIGxldmVsICovCitleHRlcm4gaW50IG91dHB1dF9zdHlsZTsKK2V4dGVybiBpbnQgb3V0cHV0X3dpZHRoOwkvKiBjb250cm9scyBjb2x1bW4gd2lkdGggaW4gaW5kZXggKi8KK2V4dGVybiBib29sIGJzZF9zdHlsZV9vdXRwdXQ7CS8qIGFzIG9wcG9zZWQgdG8gRlNGIHN0eWxlIG91dHB1dCAqLworZXh0ZXJuIGJvb2wgZGVtYW5nbGU7CQkvKiBkZW1hbmdsZSBzeW1ib2wgbmFtZXM/ICovCitleHRlcm4gYm9vbCBkaXNjYXJkX3VuZGVyc2NvcmVzOwkvKiBkaXNjYXJkIGxlYWRpbmcgdW5kZXJzY29yZXM/ICovCitleHRlcm4gYm9vbCBpZ25vcmVfZGlyZWN0X2NhbGxzOwkvKiBkb24ndCBjb3VudCBkaXJlY3QgY2FsbHMgKi8KK2V4dGVybiBib29sIGlnbm9yZV9zdGF0aWNfZnVuY3M7CS8qIHN1cHByZXNzIHN0YXRpYyBmdW5jdGlvbnMgKi8KK2V4dGVybiBib29sIGlnbm9yZV96ZXJvczsJLyogaWdub3JlIHVudXNlZCBzeW1ib2xzL2ZpbGVzICovCitleHRlcm4gYm9vbCBsaW5lX2dyYW51bGFyaXR5OwkvKiBmdW5jdGlvbiBvciBsaW5lIGdyYW51bGFyaXR5PyAqLworZXh0ZXJuIGJvb2wgcHJpbnRfZGVzY3JpcHRpb25zOwkvKiBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdGlvbiAqLworZXh0ZXJuIGJvb2wgcHJpbnRfcGF0aDsJCS8qIHByaW50IHBhdGggb3IganVzdCBmaWxlbmFtZT8gKi8KK2V4dGVybiBib29sIGlnbm9yZV9ub25fZnVuY3Rpb25zOy8qIElnbm9yZSBub24tZnVuY3Rpb24gc3ltYm9scy4gICovCisKK2V4dGVybiBGaWxlX0Zvcm1hdCBmaWxlX2Zvcm1hdDsJLyogcmVxdWVzdGVkIGZpbGUgZm9ybWF0ICovCisKK2V4dGVybiBib29sIGZpcnN0X291dHB1dDsJLyogbm8gb3V0cHV0IHNvIGZhcj8gKi8KKworZXh0ZXJuIHZvaWQgZG9uZSBQQVJBTVMgKChpbnQgc3RhdHVzKSk7CisKKyNlbmRpZiAvKiBncHJvZl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9ncHJvZi50ZXhpIGIvZ3Byb2YvZ3Byb2YudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q4YjlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvZ3Byb2YudGV4aQpAQCAtMCwwICsxLDIwMjggQEAKK1xpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KK0BzZXRmaWxlbmFtZSBncHJvZi5pbmZvCitAc2V0dGl0bGUgR05VIGdwcm9mCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCisKK0BpZmluZm8KK0BjIFRoaXMgaXMgYSBkaXIuaW5mbyBmcmFnbWVudCB0byBzdXBwb3J0IHNlbWktYXV0b21hdGVkIGFkZGl0aW9uIG9mCitAYyBtYW51YWxzIHRvIGFuIGluZm8gdHJlZS4gIHpvb0BjeWdudXMuY29tIGlzIGRldmVsb3BpbmcgdGhpcyBmYWNpbGl0eS4KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIGdwcm9mOiAoZ3Byb2YpLiAgICAgICAgICAgICAgICBQcm9maWxpbmcgeW91ciBwcm9ncmFtJ3MgZXhlY3V0aW9uCitFTkQtSU5GTy1ESVItRU5UUlkKK0BlbmQgZm9ybWF0CitAZW5kIGlmaW5mbworCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBncHJvZiBwcm9maWxlciBvZiB0aGUgR05VIHN5c3RlbS4KKworQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkyLCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQorcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgorQGVuZCBpZmluZm8KKworQGZpbmFsb3V0CitAc21hbGxib29rCisKK0B0aXRsZXBhZ2UKK0B0aXRsZSBHTlUgZ3Byb2YKK0BzdWJ0aXRsZSBUaGUgQHNje2dudX0gUHJvZmlsZXIgCitAYXV0aG9yIEpheSBGZW5sYXNvbiBhbmQgUmljaGFyZCBTdGFsbG1hbgorCitAcGFnZQorCitUaGlzIG1hbnVhbCBkZXNjcmliZXMgdGhlIEBzY3tnbnV9IHByb2ZpbGVyLCBAY29kZXtncHJvZn0sIGFuZCBob3cgeW91CitjYW4gdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBwYXJ0cyBvZiBhIHByb2dyYW0gYXJlIHRha2luZyBtb3N0IG9mIHRoZQorZXhlY3V0aW9uIHRpbWUuICBXZSBhc3N1bWUgdGhhdCB5b3Uga25vdyBob3cgdG8gd3JpdGUsIGNvbXBpbGUsIGFuZAorZXhlY3V0ZSBwcm9ncmFtcy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3YXMgd3JpdHRlbiBieSBKYXkgRmVubGFzb24uCisKK1RoaXMgbWFudWFsIHdhcyBlZGl0ZWQgSmFudWFyeSAxOTkzIGJ5IEplZmZyZXkgT3NpZXIKK2FuZCB1cGRhdGVkIFNlcHRlbWJlciAxOTk3IGJ5IEJyZW50IEJhY2NhbGEuCisKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk4OCwgMTk5MiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitAZW5kIGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKK3Jlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgorCitAZW5kIHRpdGxlcGFnZQorCitAaWZpbmZvCitAbm9kZSBUb3AKK0B0b3AgUHJvZmlsaW5nIGEgUHJvZ3JhbTogV2hlcmUgRG9lcyBJdCBTcGVuZCBJdHMgVGltZT8KKworVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBAc2N7Z251fSBwcm9maWxlciwgQGNvZGV7Z3Byb2Z9LCBhbmQgaG93IHlvdQorY2FuIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggcGFydHMgb2YgYSBwcm9ncmFtIGFyZSB0YWtpbmcgbW9zdCBvZiB0aGUKK2V4ZWN1dGlvbiB0aW1lLiAgV2UgYXNzdW1lIHRoYXQgeW91IGtub3cgaG93IHRvIHdyaXRlLCBjb21waWxlLCBhbmQKK2V4ZWN1dGUgcHJvZ3JhbXMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gd2FzIHdyaXR0ZW4gYnkgSmF5IEZlbmxhc29uLgorCitUaGlzIG1hbnVhbCB3YXMgdXBkYXRlZCBBdWd1c3QgMTk5NyBieSBCcmVudCBCYWNjYWxhLgorCitAbWVudQorKiBJbnRyb2R1Y3Rpb246OiAgICAgICAgV2hhdCBwcm9maWxpbmcgbWVhbnMsIGFuZCB3aHkgaXQgaXMgdXNlZnVsLgorCisqIENvbXBpbGluZzo6ICAgICAgICAgICBIb3cgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0gZm9yIHByb2ZpbGluZy4KKyogRXhlY3V0aW5nOjogICAgICAgICAgIEV4ZWN1dGluZyB5b3VyIHByb2dyYW0gdG8gZ2VuZXJhdGUgcHJvZmlsZSBkYXRhCisqIEludm9raW5nOjogICAgICAgICAgICBIb3cgdG8gcnVuIEBjb2Rle2dwcm9mfSwgYW5kIGl0cyBvcHRpb25zCisKKyogT3V0cHV0OjoJCUludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBvdXRwdXQKKworKiBJbmFjY3VyYWN5OjogICAgICAgICAgUG90ZW50aWFsIHByb2JsZW1zIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YKKyogSG93IGRvIEk/OjogICAgICAgICAgIEFuc3dlcnMgdG8gY29tbW9uIHF1ZXN0aW9ucworKiBJbmNvbXBhdGliaWxpdGllczo6ICAgKGJldHdlZW4gQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBVbml4IEBjb2Rle2dwcm9mfS4pCisqIERldGFpbHM6OiAgICAgICAgICAgICBEZXRhaWxzIG9mIGhvdyBwcm9maWxpbmcgaXMgZG9uZQorQGVuZCBtZW51CitAZW5kIGlmaW5mbworCitAbm9kZSBJbnRyb2R1Y3Rpb24KK0BjaGFwdGVyIEludHJvZHVjdGlvbiB0byBQcm9maWxpbmcKKworUHJvZmlsaW5nIGFsbG93cyB5b3UgdG8gbGVhcm4gd2hlcmUgeW91ciBwcm9ncmFtIHNwZW50IGl0cyB0aW1lIGFuZCB3aGljaAorZnVuY3Rpb25zIGNhbGxlZCB3aGljaCBvdGhlciBmdW5jdGlvbnMgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZy4gIFRoaXMKK2luZm9ybWF0aW9uIGNhbiBzaG93IHlvdSB3aGljaCBwaWVjZXMgb2YgeW91ciBwcm9ncmFtIGFyZSBzbG93ZXIgdGhhbiB5b3UKK2V4cGVjdGVkLCBhbmQgbWlnaHQgYmUgY2FuZGlkYXRlcyBmb3IgcmV3cml0aW5nIHRvIG1ha2UgeW91ciBwcm9ncmFtCitleGVjdXRlIGZhc3Rlci4gIEl0IGNhbiBhbHNvIHRlbGwgeW91IHdoaWNoIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkIG1vcmUKK29yIGxlc3Mgb2Z0ZW4gdGhhbiB5b3UgZXhwZWN0ZWQuICBUaGlzIG1heSBoZWxwIHlvdSBzcG90IGJ1Z3MgdGhhdCBoYWQKK290aGVyd2lzZSBiZWVuIHVubm90aWNlZC4KKworU2luY2UgdGhlIHByb2ZpbGVyIHVzZXMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGR1cmluZyB0aGUgYWN0dWFsIGV4ZWN1dGlvbgorb2YgeW91ciBwcm9ncmFtLCBpdCBjYW4gYmUgdXNlZCBvbiBwcm9ncmFtcyB0aGF0IGFyZSB0b28gbGFyZ2Ugb3IgdG9vCitjb21wbGV4IHRvIGFuYWx5emUgYnkgcmVhZGluZyB0aGUgc291cmNlLiAgSG93ZXZlciwgaG93IHlvdXIgcHJvZ3JhbSBpcyBydW4KK3dpbGwgYWZmZWN0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IHNob3dzIHVwIGluIHRoZSBwcm9maWxlIGRhdGEuICBJZiB5b3UKK2Rvbid0IHVzZSBzb21lIGZlYXR1cmUgb2YgeW91ciBwcm9ncmFtIHdoaWxlIGl0IGlzIGJlaW5nIHByb2ZpbGVkLCBubworcHJvZmlsZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhhdCBmZWF0dXJlLgorCitQcm9maWxpbmcgaGFzIHNldmVyYWwgc3RlcHM6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitZb3UgbXVzdCBjb21waWxlIGFuZCBsaW5rIHlvdXIgcHJvZ3JhbSB3aXRoIHByb2ZpbGluZyBlbmFibGVkLgorQHhyZWZ7Q29tcGlsaW5nfS4KKworQGl0ZW0KK1lvdSBtdXN0IGV4ZWN1dGUgeW91ciBwcm9ncmFtIHRvIGdlbmVyYXRlIGEgcHJvZmlsZSBkYXRhIGZpbGUuCitAeHJlZntFeGVjdXRpbmd9LgorCitAaXRlbQorWW91IG11c3QgcnVuIEBjb2Rle2dwcm9mfSB0byBhbmFseXplIHRoZSBwcm9maWxlIGRhdGEuCitAeHJlZntJbnZva2luZ30uCitAZW5kIGl0ZW1pemUKKworVGhlIG5leHQgdGhyZWUgY2hhcHRlcnMgZXhwbGFpbiB0aGVzZSBzdGVwcyBpbiBncmVhdGVyIGRldGFpbC4KKworU2V2ZXJhbCBmb3JtcyBvZiBvdXRwdXQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBhbmFseXNpcy4KKworVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyBob3cgbXVjaCB0aW1lIHlvdXIgcHJvZ3JhbSBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uLAorYW5kIGhvdyBtYW55IHRpbWVzIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHlvdSBzaW1wbHkgd2FudCB0byBrbm93Cit3aGljaCBmdW5jdGlvbnMgYnVybiBtb3N0IG9mIHRoZSBjeWNsZXMsIGl0IGlzIHN0YXRlZCBjb25jaXNlbHkgaGVyZS4KK0B4cmVme0ZsYXQgUHJvZmlsZX0uCisKK1RoZSBAZGZue2NhbGwgZ3JhcGh9IHNob3dzLCBmb3IgZWFjaCBmdW5jdGlvbiwgd2hpY2ggZnVuY3Rpb25zIGNhbGxlZCBpdCwgd2hpY2gKK290aGVyIGZ1bmN0aW9ucyBpdCBjYWxsZWQsIGFuZCBob3cgbWFueSB0aW1lcy4gIFRoZXJlIGlzIGFsc28gYW4gZXN0aW1hdGUKK29mIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IGluIHRoZSBzdWJyb3V0aW5lcyBvZiBlYWNoIGZ1bmN0aW9uLiAgVGhpcyBjYW4KK3N1Z2dlc3QgcGxhY2VzIHdoZXJlIHlvdSBtaWdodCB0cnkgdG8gZWxpbWluYXRlIGZ1bmN0aW9uIGNhbGxzIHRoYXQgdXNlIGEKK2xvdCBvZiB0aW1lLiAgQHhyZWZ7Q2FsbCBHcmFwaH0uCisKK1RoZSBAZGZue2Fubm90YXRlZCBzb3VyY2V9IGxpc3RpbmcgaXMgYSBjb3B5IG9mIHRoZSBwcm9ncmFtJ3MKK3NvdXJjZSBjb2RlLCBsYWJlbGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgb2YgdGhlCitwcm9ncmFtIHdhcyBleGVjdXRlZC4gIEB4cmVme0Fubm90YXRlZCBTb3VyY2V9LgorCitUbyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgcHJvZmlsaW5nIHdvcmtzLCB5b3UgbWF5IHdpc2ggdG8gcmVhZAorYSBkZXNjcmlwdGlvbiBvZiBpdHMgaW1wbGVtZW50YXRpb24uCitAeHJlZntJbXBsZW1lbnRhdGlvbn0uCisKK0Bub2RlIENvbXBpbGluZworQGNoYXB0ZXIgQ29tcGlsaW5nIGEgUHJvZ3JhbSBmb3IgUHJvZmlsaW5nCisKK1RoZSBmaXJzdCBzdGVwIGluIGdlbmVyYXRpbmcgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgeW91ciBwcm9ncmFtIGlzCit0byBjb21waWxlIGFuZCBsaW5rIGl0IHdpdGggcHJvZmlsaW5nIGVuYWJsZWQuCisKK1RvIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBmb3IgcHJvZmlsaW5nLCBzcGVjaWZ5IHRoZSBAc2FtcHstcGd9IG9wdGlvbiB3aGVuCit5b3UgcnVuIHRoZSBjb21waWxlci4gIChUaGlzIGlzIGluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIHlvdSBub3JtYWxseQordXNlLikKKworVG8gbGluayB0aGUgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLCBpZiB5b3UgdXNlIGEgY29tcGlsZXIgc3VjaCBhcyBAY29kZXtjY30KK3RvIGRvIHRoZSBsaW5raW5nLCBzaW1wbHkgc3BlY2lmeSBAc2FtcHstcGd9IGluIGFkZGl0aW9uIHRvIHlvdXIgdXN1YWwKK29wdGlvbnMuICBUaGUgc2FtZSBvcHRpb24sIEBzYW1wey1wZ30sIGFsdGVycyBlaXRoZXIgY29tcGlsYXRpb24gb3IgbGlua2luZwordG8gZG8gd2hhdCBpcyBuZWNlc3NhcnkgZm9yIHByb2ZpbGluZy4gIEhlcmUgYXJlIGV4YW1wbGVzOgorCitAZXhhbXBsZQorY2MgLWcgLWMgbXlwcm9nLmMgdXRpbHMuYyAtcGcKK2NjIC1vIG15cHJvZyBteXByb2cubyB1dGlscy5vIC1wZworQGVuZCBleGFtcGxlCisKK1RoZSBAc2FtcHstcGd9IG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggYSBjb21tYW5kIHRoYXQgYm90aCBjb21waWxlcyBhbmQgbGlua3M6CisKK0BleGFtcGxlCitjYyAtbyBteXByb2cgbXlwcm9nLmMgdXRpbHMuYyAtZyAtcGcKK0BlbmQgZXhhbXBsZQorCitJZiB5b3UgcnVuIHRoZSBsaW5rZXIgQGNvZGV7bGR9IGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCBhIGNvbXBpbGVyCitzdWNoIGFzIEBjb2Rle2NjfSwgeW91IG1heSBoYXZlIHRvIHNwZWNpZnkgYSBwcm9maWxpbmcgc3RhcnR1cCBmaWxlCitAZmlsZXtnY3J0MC5vfSBhcyB0aGUgZmlyc3QgaW5wdXQgZmlsZSBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBzdGFydHVwCitmaWxlIEBmaWxle2NydDAub30uICBJbiBhZGRpdGlvbiwgeW91IHdvdWxkIHByb2JhYmx5IHdhbnQgdG8KK3NwZWNpZnkgdGhlIHByb2ZpbGluZyBDIGxpYnJhcnksIEBmaWxle2xpYmNfcC5hfSwgYnkgd3JpdGluZworQHNhbXB7LWxjX3B9IGluc3RlYWQgb2YgdGhlIHVzdWFsIEBzYW1wey1sY30uICBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5CituZWNlc3NhcnksIGJ1dCBkb2luZyB0aGlzIGdpdmVzIHlvdSBudW1iZXItb2YtY2FsbHMgaW5mb3JtYXRpb24gZm9yCitzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBzdWNoIGFzIEBjb2Rle3JlYWR9IGFuZCBAY29kZXtvcGVufS4gIEZvcgorZXhhbXBsZToKKworQGV4YW1wbGUKK2xkIC1vIG15cHJvZyAvbGliL2djcnQwLm8gbXlwcm9nLm8gdXRpbHMubyAtbGNfcAorQGVuZCBleGFtcGxlCisKK0lmIHlvdSBjb21waWxlIG9ubHkgc29tZSBvZiB0aGUgbW9kdWxlcyBvZiB0aGUgcHJvZ3JhbSB3aXRoIEBzYW1wey1wZ30sIHlvdQorY2FuIHN0aWxsIHByb2ZpbGUgdGhlIHByb2dyYW0sIGJ1dCB5b3Ugd29uJ3QgZ2V0IGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgbW9kdWxlcyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aG91dCBAc2FtcHstcGd9LiAgVGhlIG9ubHkgaW5mb3JtYXRpb24KK3lvdSBnZXQgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhvc2UgbW9kdWxlcyBpcyB0aGUgdG90YWwgdGltZSBzcGVudCBpbiB0aGVtOwordGhlcmUgaXMgbm8gcmVjb3JkIG9mIGhvdyBtYW55IHRpbWVzIHRoZXkgd2VyZSBjYWxsZWQsIG9yIGZyb20gd2hlcmUuICBUaGlzCit3aWxsIG5vdCBhZmZlY3QgdGhlIGZsYXQgcHJvZmlsZSAoZXhjZXB0IHRoYXQgdGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBmb3IKK3RoZSBmdW5jdGlvbnMgd2lsbCBiZSBibGFuayksIGJ1dCB3aWxsIGdyZWF0bHkgcmVkdWNlIHRoZSB1c2VmdWxuZXNzIG9mIHRoZQorY2FsbCBncmFwaC4KKworSWYgeW91IHdpc2ggdG8gcGVyZm9ybSBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLAoreW91IHdpbGwgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIEBzYW1wey1nfSBvcHRpb24sCitpbnN0cnVjdGluZyB0aGUgY29tcGlsZXIgdG8gaW5zZXJ0IGRlYnVnZ2luZyBzeW1ib2xzIGludG8gdGhlIHByb2dyYW0KK3RoYXQgbWF0Y2ggcHJvZ3JhbSBhZGRyZXNzZXMgdG8gc291cmNlIGNvZGUgbGluZXMuCitAeHJlZntMaW5lLWJ5LWxpbmV9LgorCitJbiBhZGRpdGlvbiB0byB0aGUgQHNhbXB7LXBnfSBhbmQgQHNhbXB7LWd9IG9wdGlvbnMsCit5b3UgbWF5IGFsc28gd2lzaCB0byBzcGVjaWZ5IHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4gY29tcGlsaW5nLgorVGhpcyB3aWxsIGluc3RydW1lbnQKK3RoZSBwcm9ncmFtIHRvIHBlcmZvcm0gYmFzaWMtYmxvY2sgY291bnRpbmcuICBBcyB0aGUgcHJvZ3JhbSBydW5zLAoraXQgd2lsbCBjb3VudCBob3cgbWFueSB0aW1lcyBpdCBleGVjdXRlZCBlYWNoIGJyYW5jaCBvZiBlYWNoIEBzYW1we2lmfQorc3RhdGVtZW50LCBlYWNoIGl0ZXJhdGlvbiBvZiBlYWNoIEBzYW1we2RvfSBsb29wLCBldGMuICBUaGlzIHdpbGwKK2VuYWJsZSBAY29kZXtncHJvZn0gdG8gY29uc3RydWN0IGFuIGFubm90YXRlZCBzb3VyY2UgY29kZQorbGlzdGluZyBzaG93aW5nIGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZSBvZiBjb2RlIHdhcyBleGVjdXRlZC4KKworQG5vZGUgRXhlY3V0aW5nCitAY2hhcHRlciBFeGVjdXRpbmcgdGhlIFByb2dyYW0KKworT25jZSB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZCBmb3IgcHJvZmlsaW5nLCB5b3UgbXVzdCBydW4gaXQgaW4gb3JkZXIgdG8KK2dlbmVyYXRlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IEBjb2Rle2dwcm9mfSBuZWVkcy4gIFNpbXBseSBydW4gdGhlIHByb2dyYW0KK2FzIHVzdWFsLCB1c2luZyB0aGUgbm9ybWFsIGFyZ3VtZW50cywgZmlsZSBuYW1lcywgZXRjLiAgVGhlIHByb2dyYW0gc2hvdWxkCitydW4gbm9ybWFsbHksIHByb2R1Y2luZyB0aGUgc2FtZSBvdXRwdXQgYXMgdXN1YWwuICBJdCB3aWxsLCBob3dldmVyLCBydW4KK3NvbWV3aGF0IHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIG9mIHRoZSB0aW1lIHNwZW50IGNvbGxlY3RpbmcgYW5kIHRoZQord3JpdGluZyB0aGUgcHJvZmlsZSBkYXRhLgorCitUaGUgd2F5IHlvdSBydW4gdGhlIHByb2dyYW0tLS10aGUgYXJndW1lbnRzIGFuZCBpbnB1dCB0aGF0IHlvdSBnaXZlCitpdC0tLW1heSBoYXZlIGEgZHJhbWF0aWMgZWZmZWN0IG9uIHdoYXQgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gc2hvd3MuICBUaGUKK3Byb2ZpbGUgZGF0YSB3aWxsIGRlc2NyaWJlIHRoZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdlcmUgYWN0aXZhdGVkIGZvcgordGhlIHBhcnRpY3VsYXIgaW5wdXQgeW91IHVzZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3QgY29tbWFuZCB5b3UgZ2l2ZQordG8geW91ciBwcm9ncmFtIGlzIHRvIHF1aXQsIHRoZSBwcm9maWxlIGRhdGEgd2lsbCBzaG93IHRoZSB0aW1lIHVzZWQgaW4KK2luaXRpYWxpemF0aW9uIGFuZCBpbiBjbGVhbnVwLCBidXQgbm90IG11Y2ggZWxzZS4KKworWW91ciBwcm9ncmFtIHdpbGwgd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSBpbnRvIGEgZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5vdXR9CitqdXN0IGJlZm9yZSBleGl0aW5nLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgY2FsbGVkIEBmaWxle2dtb24ub3V0fSwKK2l0cyBjb250ZW50cyBhcmUgb3ZlcndyaXR0ZW4uICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIHRlbGwgdGhlCitwcm9ncmFtIHRvIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZSwgYnV0IHlvdSBjYW4gcmVuYW1lCit0aGUgZmlsZSBhZnRlcndhcmQgaWYgeW91IGFyZSBjb25jZXJuZWQgdGhhdCBpdCBtYXkgYmUgb3ZlcndyaXR0ZW4uCisKK0luIG9yZGVyIHRvIHdyaXRlIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSBwcm9wZXJseSwgeW91ciBwcm9ncmFtIG11c3QgZXhpdAorbm9ybWFsbHk6IGJ5IHJldHVybmluZyBmcm9tIEBjb2Rle21haW59IG9yIGJ5IGNhbGxpbmcgQGNvZGV7ZXhpdH0uICBDYWxsaW5nCit0aGUgbG93LWxldmVsIGZ1bmN0aW9uIEBjb2Rle19leGl0fSBkb2VzIG5vdCB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhLCBhbmQKK25laXRoZXIgZG9lcyBhYm5vcm1hbCB0ZXJtaW5hdGlvbiBkdWUgdG8gYW4gdW5oYW5kbGVkIHNpZ25hbC4KKworVGhlIEBmaWxle2dtb24ub3V0fSBmaWxlIGlzIHdyaXR0ZW4gaW4gdGhlIHByb2dyYW0ncyBAZW1waHtjdXJyZW50IHdvcmtpbmcKK2RpcmVjdG9yeX0gYXQgdGhlIHRpbWUgaXQgZXhpdHMuICBUaGlzIG1lYW5zIHRoYXQgaWYgeW91ciBwcm9ncmFtIGNhbGxzCitAY29kZXtjaGRpcn0sIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSB3aWxsIGJlIGxlZnQgaW4gdGhlIGxhc3QgZGlyZWN0b3J5Cit5b3VyIHByb2dyYW0gQGNvZGV7Y2hkaXJ9J2QgdG8uICBJZiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIGluCit0aGlzIGRpcmVjdG9yeSwgdGhlIGZpbGUgaXMgbm90IHdyaXR0ZW4sIGFuZCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgbWVzc2FnZS4KKworT2xkZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IHByb2ZpbGluZyBsaWJyYXJ5IG1heSBhbHNvIHdyaXRlIGEgZmlsZQorY2FsbGVkIEBmaWxle2JiLm91dH0uICBUaGlzIGZpbGUsIGlmIHByZXNlbnQsIGNvbnRhaW5zIGFuIGh1bWFuLXJlYWRhYmxlCitsaXN0aW5nIG9mIHRoZSBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLiAgVW5mb3J0dW5hdGVseSwgdGhlCithcHBlYXJhbmNlIG9mIGEgaHVtYW4tcmVhZGFibGUgQGZpbGV7YmIub3V0fSBtZWFucyB0aGUgYmFzaWMtYmxvY2sKK2NvdW50cyBkaWRuJ3QgZ2V0IHdyaXR0ZW4gaW50byBAZmlsZXtnbW9uLm91dH0uCitUaGUgUGVybCBzY3JpcHQgQGNvZGV7YmJjb252LnBsfSwgaW5jbHVkZWQgd2l0aCB0aGUgQGNvZGV7Z3Byb2Z9Citzb3VyY2UgZGlzdHJpYnV0aW9uLCB3aWxsIGNvbnZlcnQgYSBAZmlsZXtiYi5vdXR9IGZpbGUgaW50bworYSBmb3JtYXQgcmVhZGFibGUgYnkgQGNvZGV7Z3Byb2Z9LgorCitAbm9kZSBJbnZva2luZworQGNoYXB0ZXIgQGNvZGV7Z3Byb2Z9IENvbW1hbmQgU3VtbWFyeQorCitBZnRlciB5b3UgaGF2ZSBhIHByb2ZpbGUgZGF0YSBmaWxlIEBmaWxle2dtb24ub3V0fSwgeW91IGNhbiBydW4gQGNvZGV7Z3Byb2Z9Cit0byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGluIGl0LiAgVGhlIEBjb2Rle2dwcm9mfSBwcm9ncmFtIHByaW50cyBhCitmbGF0IHByb2ZpbGUgYW5kIGEgY2FsbCBncmFwaCBvbiBzdGFuZGFyZCBvdXRwdXQuICBUeXBpY2FsbHkgeW91IHdvdWxkCityZWRpcmVjdCB0aGUgb3V0cHV0IG9mIEBjb2Rle2dwcm9mfSBpbnRvIGEgZmlsZSB3aXRoIEBzYW1wez59LgorCitZb3UgcnVuIEBjb2Rle2dwcm9mfSBsaWtlIHRoaXM6CisKK0BzbWFsbGV4YW1wbGUKK2dwcm9mIEB2YXJ7b3B0aW9uc30gW0B2YXJ7ZXhlY3V0YWJsZS1maWxlfSBbQHZhcntwcm9maWxlLWRhdGEtZmlsZXN9QGRvdHN7fV1dIFs+IEB2YXJ7b3V0ZmlsZX1dCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK0hlcmUgc3F1YXJlLWJyYWNrZXRzIGluZGljYXRlIG9wdGlvbmFsIGFyZ3VtZW50cy4KKworSWYgeW91IG9taXQgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXthLm91dH0gaXMgdXNlZC4gIElmCit5b3UgZ2l2ZSBubyBwcm9maWxlIGRhdGEgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXtnbW9uLm91dH0gaXMgdXNlZC4gIElmCithbnkgZmlsZSBpcyBub3QgaW4gdGhlIHByb3BlciBmb3JtYXQsIG9yIGlmIHRoZSBwcm9maWxlIGRhdGEgZmlsZSBkb2VzIG5vdAorYXBwZWFyIHRvIGJlbG9uZyB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQuCisKK1lvdSBjYW4gZ2l2ZSBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZGF0YSBmaWxlIGJ5IGVudGVyaW5nIGFsbCB0aGVpciBuYW1lcworYWZ0ZXIgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lOyB0aGVuIHRoZSBzdGF0aXN0aWNzIGluIGFsbCB0aGUgZGF0YSBmaWxlcworYXJlIHN1bW1lZCB0b2dldGhlci4KKworVGhlIG9yZGVyIG9mIHRoZXNlIG9wdGlvbnMgZG9lcyBub3QgbWF0dGVyLgorCitAbWVudQorKiBPdXRwdXQgT3B0aW9uczo6ICAgICAgQ29udHJvbGxpbmcgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0IHN0eWxlCisqIEFuYWx5c2lzIE9wdGlvbnM6OiAgICBDb250cm9sbGluZyBob3cgQGNvZGV7Z3Byb2Z9IGFuYWx5c2VzIGl0cyBkYXRhCisqIE1pc2NlbGxhbmVvdXMgT3B0aW9uczo6CisqIERlcHJpY2F0ZWQgT3B0aW9uczo6ICBPcHRpb25zIHlvdSBubyBsb25nZXIgbmVlZCB0byB1c2UsIGJ1dCB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eQorKiBTeW1zcGVjczo6ICAgICAgICAgICAgU3BlY2lmeWluZyBmdW5jdGlvbnMgdG8gaW5jbHVkZSBvciBleGNsdWRlCitAZW5kIG1lbnUKKworQG5vZGUgT3V0cHV0IE9wdGlvbnMsQW5hbHlzaXMgT3B0aW9ucywsSW52b2tpbmcKK0BzZWN0aW9uIE91dHB1dCBPcHRpb25zCisKK1RoZXNlIG9wdGlvbnMgc3BlY2lmeSB3aGljaCBvZiBzZXZlcmFsIG91dHB1dCBmb3JtYXRzCitAY29kZXtncHJvZn0gc2hvdWxkIHByb2R1Y2UuCisKK01hbnkgb2YgdGhlc2Ugb3B0aW9ucyB0YWtlIGFuIG9wdGlvbmFsIEBkZm57c3ltc3BlY30gdG8gc3BlY2lmeQorZnVuY3Rpb25zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUKK3NwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgd2l0aCBkaWZmZXJlbnQgc3ltc3BlY3MsIHRvIGluY2x1ZGUKK29yIGV4Y2x1ZGUgc2V0cyBvZiBzeW1ib2xzLiAgQHhyZWZ7U3ltc3BlY3N9LgorCitTcGVjaWZ5aW5nIGFueSBvZiB0aGVzZSBvcHRpb25zIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCAoQHNhbXB7LXAgLXF9KSwKK3doaWNoIHByaW50cyBhIGZsYXQgcHJvZmlsZSBhbmQgY2FsbCBncmFwaCBhbmFseXNpcworZm9yIGFsbCBmdW5jdGlvbnMuCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSAtQVtAdmFye3N5bXNwZWN9XQorQGl0ZW14IC0tYW5ub3RhdGVkLXNvdXJjZVs9QHZhcntzeW1zcGVjfV0KK1RoZSBAc2FtcHstQX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYW5ub3RhdGVkIHNvdXJjZSBjb2RlLgorSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgorQHhyZWZ7QW5ub3RhdGVkIFNvdXJjZX0uCisKK0BpdGVtIC1iCitAaXRlbXggLS1icmllZgorSWYgdGhlIEBzYW1wey1ifSBvcHRpb24gaXMgZ2l2ZW4sIEBjb2Rle2dwcm9mfSBkb2Vzbid0IHByaW50IHRoZQordmVyYm9zZSBibHVyYnMgdGhhdCB0cnkgdG8gZXhwbGFpbiB0aGUgbWVhbmluZyBvZiBhbGwgb2YgdGhlIGZpZWxkcyBpbgordGhlIHRhYmxlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBpbnRlbmQgdG8gcHJpbnQgb3V0IHRoZSBvdXRwdXQsIG9yCithcmUgdGlyZWQgb2Ygc2VlaW5nIHRoZSBibHVyYnMuCisKK0BpdGVtIC1DW0B2YXJ7c3ltc3BlY31dCitAaXRlbXggLS1leGVjLWNvdW50c1s9QHZhcntzeW1zcGVjfV0KK1RoZSBAc2FtcHstQ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8KK3ByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KK0lmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgorCitJZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgY29udGFpbnMgYmFzaWMtYmxvY2sgY291bnQgcmVjb3Jkcywgc3BlY2lmaW5nCit0aGUgQHNhbXB7LWx9IG9wdGlvbiwgYWxvbmcgd2l0aCBAc2FtcHstQ30sIHdpbGwgY2F1c2UgYmFzaWMtYmxvY2sKK2V4ZWN1dGlvbiBjb3VudHMgdG8gYmUgdGFsbGllZCBhbmQgZGlzcGxheWVkLgorCitAaXRlbSAtaQorQGl0ZW14IC0tZmlsZS1pbmZvCitUaGUgQHNhbXB7LWl9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGRpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIGFuZCB0aGVuIGV4aXQuICBUaGUgbnVtYmVyIG9mIGhpc3RvZ3JhbSwKK2NhbGwgZ3JhcGgsIGFuZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzIGlzIGRpc3BsYXllZC4KKworQGl0ZW0gLUkgQHZhcntkaXJzfQorQGl0ZW14IC0tZGlyZWN0b3J5LXBhdGg9QHZhcntkaXJzfQorVGhlIEBzYW1wey1JfSBvcHRpb24gc3BlY2lmaWVzIGEgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMgaW4KK3doaWNoIHRvIGZpbmQgc291cmNlIGZpbGVzLiAgRW52aXJvbm1lbnQgdmFyaWFibGUgQHZhcntHUFJPRl9QQVRIfQorY2FuIGFsc28gYmUgdXNlZCB0byBjb252ZXJ5IHRoaXMgaW5mb3JtYXRpb24uCitVc2VkIG1vc3RseSBmb3IgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuCisKK0BpdGVtIC1KW0B2YXJ7c3ltc3BlY31dCitAaXRlbXggLS1uby1hbm5vdGF0ZWQtc291cmNlWz1AdmFye3N5bXNwZWN9XQorVGhlIEBzYW1wey1KfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KK3ByaW50IGFubm90YXRlZCBzb3VyY2UgY29kZS4KK0lmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGFubm90YXRlZCBzb3VyY2UsCitidXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KKworQGl0ZW0gLUwKK0BpdGVteCAtLXByaW50LXBhdGgKK05vcm1hbGx5LCBzb3VyY2UgZmlsZW5hbWVzIGFyZSBwcmludGVkIHdpdGggdGhlIHBhdGgKK2NvbXBvbmVudCBzdXBwcmVzc2VkLiAgVGhlIEBzYW1wey1MfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfQordG8gcHJpbnQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YKK3NvdXJjZSBmaWxlbmFtZXMsIHdoaWNoIGlzIGRldGVybWluZWQKK2Zyb20gc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZSBmaWxlCithbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIKK3dhcyBpbnZva2VkLgorCitAaXRlbSAtcFtAdmFye3N5bXNwZWN9XQorQGl0ZW14IC0tZmxhdC1wcm9maWxlWz1AdmFye3N5bXNwZWN9XQorVGhlIEBzYW1wey1wfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhIGZsYXQgcHJvZmlsZS4KK0lmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBmbGF0IHByb2ZpbGUgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KK0B4cmVme0ZsYXQgUHJvZmlsZX0uCisKK0BpdGVtIC1QW0B2YXJ7c3ltc3BlY31dCitAaXRlbXggLS1uby1mbGF0LXByb2ZpbGVbPUB2YXJ7c3ltc3BlY31dCitUaGUgQHNhbXB7LVB9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIGEgZmxhdCBwcm9maWxlLgorSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIEBjb2Rle2dwcm9mfSBwcmludHMgYSBmbGF0IHByb2ZpbGUsCitidXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KKworQGl0ZW0gLXFbQHZhcntzeW1zcGVjfV0KK0BpdGVteCAtLWdyYXBoWz1AdmFye3N5bXNwZWN9XQorVGhlIEBzYW1wey1xfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY2FsbCBncmFwaCBhbmFseXNpcy4KK0lmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBjYWxsIGdyYXBoIG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMKK2FuZCB0aGVpciBjaGlsZHJlbi4KK0B4cmVme0NhbGwgR3JhcGh9LgorCitAaXRlbSAtUVtAdmFye3N5bXNwZWN9XQorQGl0ZW14IC0tbm8tZ3JhcGhbPUB2YXJ7c3ltc3BlY31dCitUaGUgQHNhbXB7LVF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIHRoZQorY2FsbCBncmFwaC4KK0lmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGEgY2FsbCBncmFwaCwKK2J1dCBleGNsdWRlcyBtYXRjaGluZyBzeW1ib2xzLgorCitAaXRlbSAteQorQGl0ZW14IC0tc2VwYXJhdGUtZmlsZXMKK1RoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KK05vcm1hbGx5LCBncHJvZiBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcwordG8gc3RhbmRhcmQtb3V0cHV0LiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAorYW5ub3RhdGVkIHNvdXJjZSBmb3IgYSBmaWxlIG5hbWVkIEBmaWxle3BhdGgvZmlsZW5hbWV9CitpcyBnZW5lcmF0ZWQgaW4gdGhlIGZpbGUgQGZpbGV7ZmlsZW5hbWUtYW5ufS4KKworQGl0ZW0gLVpbQHZhcntzeW1zcGVjfV0KK0BpdGVteCAtLW5vLWV4ZWMtY291bnRzWz1AdmFye3N5bXNwZWN9XQorVGhlIEBzYW1wey1afSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KK3ByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KK0lmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSwgYnV0IGV4Y2x1ZGUgbWF0Y2hpbmcgc3ltYm9scy4KKworQGl0ZW0gLS1mdW5jdGlvbi1vcmRlcmluZworVGhlIEBzYW1wey0tZnVuY3Rpb24tb3JkZXJpbmd9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEKK3N1Z2dlc3RlZCBmdW5jdGlvbiBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCitUaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKK2NhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJ5CitvcmRlcmluZyBvZiBmdW5jdGlvbnMgaW4gYW4gZXhlY3V0YWJsZS4KKworVGhlIGV4YWN0IGRldGFpbHMgb2YgaG93IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gcGxhY2UgZnVuY3Rpb25zCitpbiBhIHBhcnRpY3VsYXIgb3JkZXIgaXMgc3lzdGVtIGRlcGVuZGVudCBhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzCittYW51YWwuCisKK0BpdGVtIC0tZmlsZS1vcmRlcmluZyBAdmFye21hcF9maWxlfQorVGhlIEBzYW1wey0tZmlsZS1vcmRlcmluZ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYQorc3VnZ2VzdGVkIC5vIGxpbmsgbGluZSBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCitUaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKK2NhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IGFyYml0cmFyeQorb3JkZXJpbmcgb2YgZnVuY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUuCisKK1VzZSBvZiB0aGUgQHNhbXB7LWF9IGFyZ3VtZW50IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMgb3B0aW9uLgorCitUaGUgQHZhcnttYXBfZmlsZX0gYXJndW1lbnQgaXMgYSBwYXRobmFtZSB0byBhIGZpbGUgd2hpY2ggcHJvdmlkZXMKK2Z1bmN0aW9uIG5hbWUgdG8gb2JqZWN0IGZpbGUgbWFwcGluZ3MuICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIHNpbWlsYXIgdG8KK3RoZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gQGNvZGV7bm19LgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK2MtcGFyc2UubzowMDAwMDAwMCBUIHl5cGFyc2UKK2MtcGFyc2UubzowMDAwMDAwNCBDIHl5ZXJyZmxhZworYy1sYW5nLm86MDAwMDAwMDAgVCBtYXliZV9vYmpjX21ldGhvZF9uYW1lCitjLWxhbmcubzowMDAwMDAwMCBUIHByaW50X2xhbmdfc3RhdGlzdGljcworYy1sYW5nLm86MDAwMDAwMDAgVCByZWNvZ25pemVfb2JqY19rZXl3b3JkCitjLWRlY2wubzowMDAwMDAwMCBUIHByaW50X2xhbmdfaWRlbnRpZmllcgorYy1kZWNsLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX3R5cGUKK0Bkb3Rze30KKworQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworR05VIEBjb2Rle25tfSBAc2FtcHstLWV4dGVybi1vbmx5fSBAc2FtcHstLWRlZmluZWQtb25seX0gQHNhbXB7LXZ9IEBzYW1wey0tcHJpbnQtZmlsZS1uYW1lfSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQHZhcnttYXBfZmlsZX0uCisKK0BpdGVtIC1UCitAaXRlbXggLS10cmFkaXRpb25hbAorVGhlIEBzYW1wey1UfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBpdHMgb3V0cHV0IGluCitgYHRyYWRpdGlvbmFsJycgQlNEIHN0eWxlLgorCitAaXRlbSAtdyBAdmFye3dpZHRofQorQGl0ZW14IC0td2lkdGg9QHZhcnt3aWR0aH0KK1NldHMgd2lkdGggb2Ygb3V0cHV0IGxpbmVzIHRvIEB2YXJ7d2lkdGh9LgorQ3VycmVudGx5IG9ubHkgdXNlZCB3aGVuIHByaW50aW5nIHRoZSBmdW5jdGlvbiBpbmRleCBhdCB0aGUgYm90dG9tCitvZiB0aGUgY2FsbCBncmFwaC4KKworQGl0ZW0gLXgKK0BpdGVteCAtLWFsbC1saW5lcworVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgorQnkgZGVmYXVsdCwgb25seSB0aGUgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJhc2ljLWJsb2NrCithcmUgYW5ub3RhdGVkLiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluCithIGJhc2ljLWJsb2NrIGlzIGFubm90YXRlZCBieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZQorZmlyc3QgbGluZS4gIFRoaXMgYmVoYXZpb3IgaXMgc2ltaWxhciB0byBAY29kZXt0Y292fSdzIEBzYW1wey1hfS4KKworQGl0ZW0gLS1kZW1hbmdsZQorQGl0ZW14IC0tbm8tZGVtYW5nbGUKK1RoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIEMrKyBzeW1ib2wgbmFtZXMgc2hvdWxkIGJlIGRlbWFuZ2xlZCB3aGVuCitwcmludGluZyBvdXRwdXQuICBUaGUgZGVmYXVsdCBpcyB0byBkZW1hbmdsZSBzeW1ib2xzLiAgVGhlCitAY29kZXstLW5vLWRlbWFuZ2xlfSBvcHRpb24gbWF5IGJlIHVzZWQgdG8gdHVybiBvZmYgZGVtYW5nbGluZy4KKworQGVuZCB0YWJsZQorCitAbm9kZSBBbmFseXNpcyBPcHRpb25zLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxPdXRwdXQgT3B0aW9ucyxJbnZva2luZworQHNlY3Rpb24gQW5hbHlzaXMgT3B0aW9ucworCitAdGFibGUgQGNvZGUKKworQGl0ZW0gLWEKK0BpdGVteCAtLW5vLXN0YXRpYworVGhlIEBzYW1wey1hfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyB0aGUgcHJpbnRpbmcgb2YKK3N0YXRpY2FsbHkgZGVjbGFyZWQgKHByaXZhdGUpIGZ1bmN0aW9ucy4gIChUaGVzZSBhcmUgZnVuY3Rpb25zIHdob3NlCituYW1lcyBhcmUgbm90IGxpc3RlZCBhcyBnbG9iYWwsIGFuZCB3aGljaCBhcmUgbm90IHZpc2libGUgb3V0c2lkZSB0aGUKK2ZpbGUvZnVuY3Rpb24vYmxvY2sgd2hlcmUgdGhleSB3ZXJlIGRlZmluZWQuKSAgVGltZSBzcGVudCBpbiB0aGVzZQorZnVuY3Rpb25zLCBjYWxscyB0by9mcm9tIHRoZW0sIGV0Yywgd2lsbCBhbGwgYmUgYXR0cmlidXRlZCB0byB0aGUKK2Z1bmN0aW9uIHRoYXQgd2FzIGxvYWRlZCBkaXJlY3RseSBiZWZvcmUgaXQgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZS4KK0BjIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFVuaXggQGNvZGV7Z3Byb2Z9LCBidXQgYSBiYWQgaWRlYS4gIAorVGhpcyBvcHRpb24gYWZmZWN0cyBib3RoIHRoZSBmbGF0IHByb2ZpbGUgYW5kIHRoZSBjYWxsIGdyYXBoLgorCitAaXRlbSAtYworQGl0ZW14IC0tc3RhdGljLWNhbGwtZ3JhcGgKK1RoZSBAc2FtcHstY30gb3B0aW9uIGNhdXNlcyB0aGUgY2FsbCBncmFwaCBvZiB0aGUgcHJvZ3JhbSB0byBiZQorYXVnbWVudGVkIGJ5IGEgaGV1cmlzdGljIHdoaWNoIGV4YW1pbmVzIHRoZSB0ZXh0IHNwYWNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgYW5kIGlkZW50aWZpZXMgZnVuY3Rpb24gY2FsbHMgaW4gdGhlIGJpbmFyeSBtYWNoaW5lIGNvZGUuCitTaW5jZSBub3JtYWwgY2FsbCBncmFwaCByZWNvcmRzIGFyZSBvbmx5IGdlbmVyYXRlZCB3aGVuIGZ1bmN0aW9ucyBhcmUKK2VudGVyZWQsIHRoaXMgb3B0aW9uIGlkZW50aWZpZXMgY2hpbGRyZW4gdGhhdCBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkLAorYnV0IG5ldmVyIHdlcmUuICBDYWxscyB0byBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5vdCBjb21waWxlZCB3aXRoCitwcm9maWxpbmcgZW5hYmxlZCBhcmUgYWxzbyBpZGVudGlmaWVkLCBidXQgb25seSBpZiBzeW1ib2wgdGFibGUKK2VudHJpZXMgYXJlIHByZXNlbnQgZm9yIHRoZW0uCitDYWxscyB0byBkeW5hbWljIGxpYnJhcnkgcm91dGluZXMgYXJlIHR5cGljYWxseSBAZW1waHtub3R9IGZvdW5kCitieSB0aGlzIG9wdGlvbi4KK1BhcmVudHMgb3IgY2hpbGRyZW4gaWRlbnRpZmllZCB2aWEgdGhpcyBoZXVyaXN0aWMKK2FyZSBpbmRpY2F0ZWQgaW4gdGhlIGNhbGwgZ3JhcGggd2l0aCBjYWxsIGNvdW50cyBvZiBAc2FtcHswfS4KKworQGl0ZW0gLUQKK0BpdGVteCAtLWlnbm9yZS1ub24tZnVuY3Rpb25zCitUaGUgQHNhbXB7LUR9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGlnbm9yZSBzeW1ib2xzIHdoaWNoCithcmUgbm90IGtub3duIHRvIGJlIGZ1bmN0aW9ucy4gIFRoaXMgb3B0aW9uIHdpbGwgZ2l2ZSBtb3JlIGFjY3VyYXRlCitwcm9maWxlIGRhdGEgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBzdXBwb3J0ZWQgKFNvbGFyaXMgYW5kIEhQVVggZm9yCitleGFtcGxlKS4KKworQGl0ZW0gLWsgQHZhcntmcm9tfS9AdmFye3RvfQorVGhlIEBzYW1wey1rfSBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWxldGUgZnJvbSB0aGUgY2FsbCBncmFwaCBhbnkgYXJjcyBmcm9tCitzeW1ib2xzIG1hdGNoaW5nIHN5bXNwZWMgQHZhcntmcm9tfSB0byB0aG9zZSBtYXRjaGluZyBzeW1zcGVjIEB2YXJ7dG99LgorCitAaXRlbSAtbAorQGl0ZW14IC0tbGluZQorVGhlIEBzYW1wey1sfSBvcHRpb24gZW5hYmxlcyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCB3aGljaCBjYXVzZXMKK2hpc3RvZ3JhbSBoaXRzIHRvIGJlIGNoYXJnZWQgdG8gaW5kaXZpZHVhbCBzb3VyY2UgY29kZSBsaW5lcywKK2luc3RlYWQgb2YgZnVuY3Rpb25zLgorSWYgdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwKK3RoaXMgb3B0aW9uIHdpbGwgYWxzbyBpZGVudGlmeSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUgb2YKK2NvZGUgd2FzIGV4ZWN1dGVkLgorV2hpbGUgbGluZS1ieS1saW5lIHByb2ZpbGluZyBjYW4gaGVscCBpc29sYXRlIHdoZXJlIGluIGEgbGFyZ2UgZnVuY3Rpb24KK2EgcHJvZ3JhbSBpcyBzcGVuZGluZyBpdHMgdGltZSwgaXQgYWxzbyBzaWduaWZpY2FudGx5IGluY3JlYXNlcwordGhlIHJ1bm5pbmcgdGltZSBvZiBAY29kZXtncHJvZn0sIGFuZCBtYWduaWZpZXMgc3RhdGlzdGljYWwKK2luYWNjdXJhY2llcy4KK0B4cmVme1NhbXBsaW5nIEVycm9yfS4KKworQGl0ZW0gLW0gQHZhcntudW19CitAaXRlbXggLS1taW4tY291bnQ9QHZhcntudW19CitUaGlzIG9wdGlvbiBhZmZlY3RzIGV4ZWN1dGlvbiBjb3VudCBvdXRwdXQgb25seS4KK1N5bWJvbHMgdGhhdCBhcmUgZXhlY3V0ZWQgbGVzcyB0aGFuIEB2YXJ7bnVtfSB0aW1lcyBhcmUgc3VwcHJlc3NlZC4KKworQGl0ZW0gLW5bQHZhcntzeW1zcGVjfV0KK0BpdGVteCAtLXRpbWVbPUB2YXJ7c3ltc3BlY31dCitUaGUgQHNhbXB7LW59IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9LCBpbiBpdHMgY2FsbCBncmFwaCBhbmFseXNpcywKK3RvIG9ubHkgcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCisKK0BpdGVtIC1OW0B2YXJ7c3ltc3BlY31dCitAaXRlbXggLS1uby10aW1lWz1AdmFye3N5bXNwZWN9XQorVGhlIEBzYW1wey1ufSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSwgaW4gaXRzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCitub3QgdG8gcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCisKK0BpdGVtIC16CitAaXRlbXggLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMKK0lmIHlvdSBnaXZlIHRoZSBAc2FtcHsten0gb3B0aW9uLCBAY29kZXtncHJvZn0gd2lsbCBtZW50aW9uIGFsbAorZnVuY3Rpb25zIGluIHRoZSBmbGF0IHByb2ZpbGUsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlIG5ldmVyIGNhbGxlZCwgYW5kCit0aGF0IGhhZCBubyB0aW1lIHNwZW50IGluIHRoZW0uICBUaGlzIGlzIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorQHNhbXB7LWN9IG9wdGlvbiBmb3IgZGlzY292ZXJpbmcgd2hpY2ggcm91dGluZXMgd2VyZSBuZXZlciBjYWxsZWQuCisKK0BlbmQgdGFibGUKKworQG5vZGUgTWlzY2VsbGFuZW91cyBPcHRpb25zLERlcHJpY2F0ZWQgT3B0aW9ucyxBbmFseXNpcyBPcHRpb25zLEludm9raW5nCitAc2VjdGlvbiBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIC1kW0B2YXJ7bnVtfV0KK0BpdGVteCAtLWRlYnVnWz1AdmFye251bX1dCitUaGUgQHNhbXB7LWQgQHZhcntudW19fSBvcHRpb24gc3BlY2lmaWVzIGRlYnVnZ2luZyBvcHRpb25zLgorSWYgQHZhcntudW19IGlzIG5vdCBzcGVjaWZpZWQsIGVuYWJsZSBhbGwgZGVidWdnaW5nLgorQHhyZWZ7RGVidWdnaW5nfS4KKworQGl0ZW0gLU9AdmFye25hbWV9CitAaXRlbXggLS1maWxlLWZvcm1hdD1AdmFye25hbWV9CitTZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcy4gIFJlY29nbml6ZWQgZm9ybWF0cyBhcmUKK0BzYW1we2F1dG99ICh0aGUgZGVmYXVsdCksIEBzYW1we2JzZH0sIEBzYW1wezQuNGJzZH0sIEBzYW1we21hZ2ljfSwgYW5kCitAc2FtcHtwcm9mfSAobm90IHlldCBzdXBwb3J0ZWQpLgorCitAaXRlbSAtcworQGl0ZW14IC0tc3VtCitUaGUgQHNhbXB7LXN9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1bW1hcml6ZSB0aGUgaW5mb3JtYXRpb24KK2luIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgaXQgcmVhZCBpbiwgYW5kIHdyaXRlIG91dCBhIHByb2ZpbGUgZGF0YQorZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5zdW19LCB3aGljaCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20KK3RoZSBwcm9maWxlIGRhdGEgZmlsZXMgdGhhdCBAY29kZXtncHJvZn0gcmVhZCBpbi4gIFRoZSBmaWxlIEBmaWxle2dtb24uc3VtfQorbWF5IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IGZpbGVzOyB0aGUgZWZmZWN0IG9mIHRoaXMgaXMgdG8KK21lcmdlIHRoZSBkYXRhIGluIHRoZSBvdGhlciBpbnB1dCBmaWxlcyBpbnRvIEBmaWxle2dtb24uc3VtfS4KKworRXZlbnR1YWxseSB5b3UgY2FuIHJ1biBAY29kZXtncHJvZn0gYWdhaW4gd2l0aG91dCBAc2FtcHstc30gdG8gYW5hbHl6ZSB0aGUKK2N1bXVsYXRpdmUgZGF0YSBpbiB0aGUgZmlsZSBAZmlsZXtnbW9uLnN1bX0uCisKK0BpdGVtIC12CitAaXRlbXggLS12ZXJzaW9uCitUaGUgQHNhbXB7LXZ9IGZsYWcgY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY3VycmVudCB2ZXJzaW9uCitudW1iZXIsIGFuZCB0aGVuIGV4aXQuCisKK0BlbmQgdGFibGUKKworQG5vZGUgRGVwcmljYXRlZCBPcHRpb25zLFN5bXNwZWNzLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxJbnZva2luZworQHNlY3Rpb24gRGVwcmljYXRlZCBPcHRpb25zCisKK0B0YWJsZSBAY29kZQorCitUaGVzZSBvcHRpb25zIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIG5ld2VyIHZlcnNpb25zIHRoYXQgdXNlIHN5bXNwZWNzLgorCitAaXRlbSAtZSBAdmFye2Z1bmN0aW9uX25hbWV9CitUaGUgQHNhbXB7LWUgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB0ZWxscyBAY29kZXtncHJvZn0gdG8gbm90IHByaW50CitpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbl9uYW1lfSAoYW5kIGl0cworY2hpbGRyZW5AZG90c3t9KSBpbiB0aGUgY2FsbCBncmFwaC4gIFRoZSBmdW5jdGlvbiB3aWxsIHN0aWxsIGJlIGxpc3RlZAorYXMgYSBjaGlsZCBvZiBhbnkgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdCwgYnV0IGl0cyBpbmRleCBudW1iZXIgd2lsbCBiZQorc2hvd24gYXMgQHNhbXB7W25vdCBwcmludGVkXX0uICBNb3JlIHRoYW4gb25lIEBzYW1wey1lfSBvcHRpb24gbWF5IGJlCitnaXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstZX0KK29wdGlvbi4gCisKK0BpdGVtIC1FIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KK1RoZSBAY29kZXstRSBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1lfSBvcHRpb24sIGJ1dAordGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gKGFuZCBjaGlsZHJlbiB3aG8gd2VyZSBub3QgY2FsbGVkIGZyb20KK2FueXdoZXJlIGVsc2UpLCB3aWxsIG5vdCBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHBlcmNlbnRhZ2VzLW9mLXRpbWUgZm9yCit0aGUgY2FsbCBncmFwaC4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LUV9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47IG9ubHkgb25lCitAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1FfSBvcHRpb24uCisKK0BpdGVtIC1mIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KK1RoZSBAc2FtcHstZiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gbGltaXQgdGhlCitjYWxsIGdyYXBoIHRvIHRoZSBmdW5jdGlvbiBAdmFye2Z1bmN0aW9uX25hbWV9IGFuZCBpdHMgY2hpbGRyZW4gKGFuZAordGhlaXIgY2hpbGRyZW5AZG90c3t9KS4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LWZ9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47Citvbmx5IG9uZSBAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1mfQorb3B0aW9uLiAgCisKK0BpdGVtIC1GIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KK1RoZSBAc2FtcHstRiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1mfSBvcHRpb24sIGJ1dAorb25seSB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuIChhbmQgdGhlaXIKK2NoaWxkcmVuQGRvdHN7fSkgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0b3RhbC10aW1lIGFuZAorcGVyY2VudGFnZXMtb2YtdGltZSBmb3IgdGhlIGNhbGwgZ3JhcGguICBNb3JlIHRoYW4gb25lIEBzYW1wey1GfSBvcHRpb24KK21heSBiZSBnaXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaAorQHNhbXB7LUZ9IG9wdGlvbi4gIFRoZSBAc2FtcHstRn0gb3B0aW9uIG92ZXJyaWRlcyB0aGUgQHNhbXB7LUV9IG9wdGlvbi4KKworQGVuZCB0YWJsZQorCitOb3RlIHRoYXQgb25seSBvbmUgZnVuY3Rpb24gY2FuIGJlIHNwZWNpZmllZCB3aXRoIGVhY2ggQGNvZGV7LWV9LAorQGNvZGV7LUV9LCBAY29kZXstZn0gb3IgQGNvZGV7LUZ9IG9wdGlvbi4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZQorZnVuY3Rpb24sIHVzZSBtdWx0aXBsZSBvcHRpb25zLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29tbWFuZDoKKworQGV4YW1wbGUKK2dwcm9mIC1lIGJvcmluZyAtZiBmb28gLWYgYmFyIG15cHJvZ3JhbSA+IGdwcm9mLm91dHB1dAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorbGlzdHMgaW4gdGhlIGNhbGwgZ3JhcGggYWxsIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcmVhY2hlZCBmcm9tIGVpdGhlcgorQGNvZGV7Zm9vfSBvciBAY29kZXtiYXJ9IGFuZCB3ZXJlIG5vdCByZWFjaGFibGUgZnJvbSBAY29kZXtib3Jpbmd9LgorCitAbm9kZSBTeW1zcGVjcywsRGVwcmljYXRlZCBPcHRpb25zLEludm9raW5nCitAc2VjdGlvbiBTeW1zcGVjcworCitNYW55IG9mIHRoZSBvdXRwdXQgb3B0aW9ucyBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKK3VzaW5nIEBkZm57c3ltc3BlY3N9IChzeW1ib2wgc3BlY2lmaWNhdGlvbnMpLCB3aGljaCBvYnNlcnZlIHRoZQorZm9sbG93aW5nIHN5bnRheDoKKworQGV4YW1wbGUKKyAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAorfCBmdW5jbmFtZV9ub3RfY29udGFpbmluZ19hX2RvdAorfCBsaW5lbnVtYmVyCit8ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQorQGVuZCBleGFtcGxlCisKK0hlcmUgYXJlIHNvbWUgc2FtcGxlIHN5bXNwZWNzOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIG1haW4uYworU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgQGZpbGV7bWFpbi5jfS0tLXRoZQorZG90IGluIHRoZSBzdHJpbmcgdGVsbHMgZ3Byb2YgdG8gaW50ZXJwcmV0Cit0aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCithIGZ1bmN0aW9uIG5hbWUuICBUbyBzZWxlY3QgYSBmaWxlIHdob3NlCituYW1lIGRvZXMgbm90IGNvbnRhaW4gYSBkb3QsIGEgdHJhaWxpbmcgY29sb24KK3Nob3VsZCBiZSBzcGVjaWZpZWQuICBGb3IgZXhhbXBsZSwgQHNhbXB7b2RkOn0gaXMKK2ludGVycHJldGVkIGFzIHRoZSBmaWxlIG5hbWVkIEBmaWxle29kZH0uCisKK0BpdGVtIG1haW4KK1NlbGVjdHMgYWxsIGZ1bmN0aW9ucyBuYW1lZCBAc2FtcHttYWlufS4KKworTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZnVuY3Rpb24gbmFtZQorYmVjYXVzZSBzb21lIG9mIHRoZSBkZWZpbml0aW9ucyBtYXkgYmUgbG9jYWwgKGkuZS4sIHN0YXRpYykuICBVbmxlc3MgYQorZnVuY3Rpb24gbmFtZSBpcyB1bmlxdWUgaW4gYSBwcm9ncmFtLCB5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uCitleHBsYWluZWQgYmVsb3cgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYyBzb3VyY2UgZmlsZS4KKworU29tZXRpbWVzLCBmdW5jdGlvbiBuYW1lcyBjb250YWluIGRvdHMuICBJbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhcgordG8gYWRkIGEgbGVhZGluZyBjb2xvbiB0byB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCBAc2FtcHs6Lm11bH0gc2VsZWN0cworZnVuY3Rpb24gQHNhbXB7Lm11bH0uCisKK0luIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgZ3Byb2YKK3dpbGwgbm9ybWFsbHkgbm90IHByaW50IHRoZXNlIHVuZGVyc2NvcmVzLiAgSG93ZXZlciwgeW91IG11c3QgdXNlIHRoZQordW5kZXJzY29yZSB3aGVuIHlvdSBuYW1lIGEgc3ltYm9sIGluIGEgc3ltc3BlYy4gIFlvdSBjYW4gdXNlIHRoZQorQGNvZGV7bm19IHByb2dyYW0gdG8gc2VlIHdoZXRoZXIgc3ltYm9scyBoYXZlIHVuZGVyc2NvcmVzIGZvciB0aGUgb2JqZWN0CitmaWxlIGZvcm1hdCB5b3UgYXJlIHVzaW5nLgorCitAaXRlbSBtYWluLmM6bWFpbgorU2VsZWN0cyBmdW5jdGlvbiBAc2FtcHttYWlufSBpbiBmaWxlIEBmaWxle21haW4uY30uCisKK0BpdGVtIG1haW4uYzoxMzQKK1NlbGVjdHMgbGluZSAxMzQgaW4gZmlsZSBAZmlsZXttYWluLmN9LgorQGVuZCB0YWJsZQorCitAbm9kZSBPdXRwdXQKK0BjaGFwdGVyIEludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBPdXRwdXQKKworQGNvZGV7Z3Byb2Z9IGNhbiBwcm9kdWNlIHNldmVyYWwgZGlmZmVyZW50IG91dHB1dCBzdHlsZXMsIHRoZQorbW9zdCBpbXBvcnRhbnQgb2Ygd2hpY2ggYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBzaW1wbGVzdCBvdXRwdXQKK3N0eWxlcyAoZmlsZSBpbmZvcm1hdGlvbiwgZXhlY3V0aW9uIGNvdW50LCBhbmQgZnVuY3Rpb24gYW5kIGZpbGUgb3JkZXJpbmcpCithcmUgbm90IGRlc2NyaWJlZCBoZXJlLCBidXQgYXJlIGRvY3VtZW50ZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBvcHRpb25zCit0aGF0IHRyaWdnZXIgdGhlbS4KK0B4cmVme091dHB1dCBPcHRpb25zfS4KKworQG1lbnUKKyogRmxhdCBQcm9maWxlOjogICAgICAgIFRoZSBmbGF0IHByb2ZpbGUgc2hvd3MgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmcgZGlyZWN0bHkgaW4gZWFjaCBmdW5jdGlvbi4KKyogQ2FsbCBHcmFwaDo6ICAgICAgICAgIFRoZSBjYWxsIGdyYXBoIHNob3dzIHdoaWNoIGZ1bmN0aW9ucyBjYWxsZWQgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcnMsIGFuZCBob3cgbXVjaCB0aW1lIGVhY2ggZnVuY3Rpb24gdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gaXRzIHN1YnJvdXRpbmUgY2FsbHMgYXJlIGluY2x1ZGVkLgorKiBMaW5lLWJ5LWxpbmU6OiAgICAgICAgQGNvZGV7Z3Byb2Z9IGNhbiBhbmFseXplIGluZGl2aWR1YWwgc291cmNlIGNvZGUgbGluZXMKKyogQW5ub3RhdGVkIFNvdXJjZTo6ICAgIFRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcgZGlzcGxheXMgc291cmNlIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGVkIHdpdGggZXhlY3V0aW9uIGNvdW50cworQGVuZCBtZW51CisKKworQG5vZGUgRmxhdCBQcm9maWxlLENhbGwgR3JhcGgsLE91dHB1dAorQHNlY3Rpb24gVGhlIEZsYXQgUHJvZmlsZQorQGNpbmRleCBmbGF0IHByb2ZpbGUKKworVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgeW91ciBwcm9ncmFtCitzcGVudCBleGVjdXRpbmcgZWFjaCBmdW5jdGlvbi4gIFVubGVzcyB0aGUgQHNhbXB7LXp9IG9wdGlvbiBpcyBnaXZlbiwKK2Z1bmN0aW9ucyB3aXRoIG5vIGFwcGFyZW50IHRpbWUgc3BlbnQgaW4gdGhlbSwgYW5kIG5vIGFwcGFyZW50IGNhbGxzCit0byB0aGVtLCBhcmUgbm90IG1lbnRpb25lZC4gIE5vdGUgdGhhdCBpZiBhIGZ1bmN0aW9uIHdhcyBub3QgY29tcGlsZWQKK2ZvciBwcm9maWxpbmcsIGFuZCBkaWRuJ3QgcnVuIGxvbmcgZW5vdWdoIHRvIHNob3cgdXAgb24gdGhlIHByb2dyYW0KK2NvdW50ZXIgaGlzdG9ncmFtLCBpdCB3aWxsIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmdW5jdGlvbiB0aGF0Cit3YXMgbmV2ZXIgY2FsbGVkLgorCitUaGlzIGlzIHBhcnQgb2YgYSBmbGF0IHByb2ZpbGUgZm9yIGEgc21hbGwgcHJvZ3JhbToKKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCitGbGF0IHByb2ZpbGU6CisKK0VhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCisgICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgc2VsZiAgICAgdG90YWwgICAgICAgICAgIAorIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgbXMvY2FsbCAgbXMvY2FsbCAgbmFtZSAgICAKKyAzMy4zNCAgICAgIDAuMDIgICAgIDAuMDIgICAgIDcyMDggICAgIDAuMDAgICAgIDAuMDAgIG9wZW4KKyAxNi42NyAgICAgIDAuMDMgICAgIDAuMDEgICAgICAyNDQgICAgIDAuMDQgICAgIDAuMTIgIG9mZnRpbWUKKyAxNi42NyAgICAgIDAuMDQgICAgIDAuMDEgICAgICAgIDggICAgIDEuMjUgICAgIDEuMjUgIG1lbWNjcHkKKyAxNi42NyAgICAgIDAuMDUgICAgIDAuMDEgICAgICAgIDcgICAgIDEuNDMgICAgIDEuNDMgIHdyaXRlCisgMTYuNjcgICAgICAwLjA2ICAgICAwLjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY291bnQKKyAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAyMzYgICAgIDAuMDAgICAgIDAuMDAgIHR6c2V0CisgIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgMTkyICAgICAwLjAwICAgICAwLjAwICB0b2xvd2VyCisgIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgIDQ3ICAgICAwLjAwICAgICAwLjAwICBzdHJsZW4KKyAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgNDUgICAgIDAuMDAgICAgIDAuMDAgIHN0cmNocgorICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICA1MC4wMCAgbWFpbgorICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAgMC4wMCAgbWVtY3B5CisgIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDEwLjExICBwcmludAorICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAgMC4wMCAgcHJvZmlsCisgIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgICAxICAgICAwLjAwICAgIDUwLjAwICByZXBvcnQKK0Bkb3Rze30KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorVGhlIGZ1bmN0aW9ucyBhcmUgc29ydGVkIGJ5IGZpcnN0IGJ5IGRlY3JlYXNpbmcgcnVuLXRpbWUgc3BlbnQgaW4gdGhlbSwKK3RoZW4gYnkgZGVjcmVhc2luZyBudW1iZXIgb2YgY2FsbHMsIHRoZW4gYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4gIFRoZQorZnVuY3Rpb25zIEBzYW1we21jb3VudH0gYW5kIEBzYW1we3Byb2ZpbH0gYXJlIHBhcnQgb2YgdGhlIHByb2ZpbGluZworYXBhcmF0dXMgYW5kIGFwcGVhciBpbiBldmVyeSBmbGF0IHByb2ZpbGU7IHRoZWlyIHRpbWUgZ2l2ZXMgYSBtZWFzdXJlIG9mCit0aGUgYW1vdW50IG9mIG92ZXJoZWFkIGR1ZSB0byBwcm9maWxpbmcuCisKK0p1c3QgYmVmb3JlIHRoZSBjb2x1bW4gaGVhZGVycywgYSBzdGF0ZW1lbnQgYXBwZWFycyBpbmRpY2F0aW5nCitob3cgbXVjaCB0aW1lIGVhY2ggc2FtcGxlIGNvdW50ZWQgYXMuCitUaGlzIEBkZm57c2FtcGxpbmcgcGVyaW9kfSBlc3RpbWF0ZXMgdGhlIG1hcmdpbiBvZiBlcnJvciBpbiBlYWNoIG9mIHRoZSB0aW1lCitmaWd1cmVzLiAgQSB0aW1lIGZpZ3VyZSB0aGF0IGlzIG5vdCBtdWNoIGxhcmdlciB0aGFuIHRoaXMgaXMgbm90CityZWxpYWJsZS4gIEluIHRoaXMgZXhhbXBsZSwgZWFjaCBzYW1wbGUgY291bnRlZCBhcyAwLjAxIHNlY29uZHMsCitzdWdnZXN0aW5nIGEgMTAwIEh6IHNhbXBsaW5nIHJhdGUuCitUaGUgcHJvZ3JhbSdzIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHdhcyAwLjA2CitzZWNvbmRzLCBhcyBpbmRpY2F0ZWQgYnkgdGhlIEBzYW1we2N1bXVsYXRpdmUgc2Vjb25kc30gZmllbGQuICBTaW5jZQorZWFjaCBzYW1wbGUgY291bnRlZCBmb3IgMC4wMSBzZWNvbmRzLCB0aGlzIG1lYW5zIG9ubHkgc2l4IHNhbXBsZXMKK3dlcmUgdGFrZW4gZHVyaW5nIHRoZSBydW4uICBUd28gb2YgdGhlIHNhbXBsZXMgb2NjdXJlZCB3aGlsZSB0aGUKK3Byb2dyYW0gd2FzIGluIHRoZSBAc2FtcHtvcGVufSBmdW5jdGlvbiwgYXMgaW5kaWNhdGVkIGJ5IHRoZQorQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZC4gIEVhY2ggb2YgdGhlIG90aGVyIGZvdXIgc2FtcGxlcworb2NjdXJlZCBvbmUgZWFjaCBpbiBAc2FtcHtvZmZ0aW1lfSwgQHNhbXB7bWVtY2NweX0sIEBzYW1we3dyaXRlfSwKK2FuZCBAc2FtcHttY291bnR9LgorU2luY2Ugb25seSBzaXggc2FtcGxlcyB3ZXJlIHRha2VuLCBub25lIG9mIHRoZXNlIHZhbHVlcyBjYW4KK2JlIHJlZ2FyZGVkIGFzIHBhcnRpY3VsYXJseSByZWxpYWJsZS4KK0luIGFub3RoZXIgcnVuLAordGhlIEBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQgZm9yCitAc2FtcHttY291bnR9IG1pZ2h0IHdlbGwgYmUgQHNhbXB7MC4wMH0gb3IgQHNhbXB7MC4wMn0uCitAeHJlZntTYW1wbGluZyBFcnJvcn0sIGZvciBhIGNvbXBsZXRlIGRpc2N1c3Npb24uCisKK1RoZSByZW1haW5pbmcgZnVuY3Rpb25zIGluIHRoZSBsaXN0aW5nICh0aG9zZSB3aG9zZQorQHNhbXB7c2VsZiBzZWNvbmRzfSBmaWVsZCBpcyBAc2FtcHswLjAwfSkgZGlkbid0IGFwcGVhcgoraW4gdGhlIGhpc3RvZ3JhbSBzYW1wbGVzIGF0IGFsbC4gIEhvd2V2ZXIsIHRoZSBjYWxsIGdyYXBoCitpbmRpY2F0ZWQgdGhhdCB0aGV5IHdlcmUgY2FsbGVkLCBzbyB0aGVyZWZvcmUgdGhleSBhcmUgbGlzdGVkLAorc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIgYnkgdGhlIEBzYW1we2NhbGxzfSBmaWVsZC4KK0NsZWFybHkgc29tZSB0aW1lIHdhcyBzcGVudCBleGVjdXRpbmcgdGhlc2UgZnVuY3Rpb25zLAorYnV0IHRoZSBwYXVjaXR5IG9mIGhpc3RvZ3JhbSBzYW1wbGVzIHByZXZlbnRzIGFueQorZGV0ZXJtaW5hdGlvbiBvZiBob3cgbXVjaCB0aW1lIGVhY2ggdG9vay4KKworSGVyZSBpcyB3aGF0IHRoZSBmaWVsZHMgaW4gZWFjaCBsaW5lIG1lYW46CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gJSB0aW1lCitUaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSB5b3VyIHByb2dyYW0gc3BlbnQKK2luIHRoaXMgZnVuY3Rpb24uICBUaGVzZSBzaG91bGQgYWxsIGFkZCB1cCB0byAxMDAlLgorCitAaXRlbSBjdW11bGF0aXZlIHNlY29uZHMKK1RoaXMgaXMgdGhlIGN1bXVsYXRpdmUgdG90YWwgbnVtYmVyIG9mIHNlY29uZHMgdGhlIGNvbXB1dGVyIHNwZW50CitleGVjdXRpbmcgdGhpcyBmdW5jdGlvbnMsIHBsdXMgdGhlIHRpbWUgc3BlbnQgaW4gYWxsIHRoZSBmdW5jdGlvbnMKK2Fib3ZlIHRoaXMgb25lIGluIHRoaXMgdGFibGUuCisKK0BpdGVtIHNlbGYgc2Vjb25kcworVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkIGZvciBieSB0aGlzIGZ1bmN0aW9uIGFsb25lLgorVGhlIGZsYXQgcHJvZmlsZSBsaXN0aW5nIGlzIHNvcnRlZCBmaXJzdCBieSB0aGlzIG51bWJlci4KKworQGl0ZW0gY2FsbHMKK1RoaXMgaXMgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHRoZQorZnVuY3Rpb24gd2FzIG5ldmVyIGNhbGxlZCwgb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgY2FsbGVkIGNhbm5vdAorYmUgZGV0ZXJtaW5lZCAocHJvYmFibHkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd2FzIG5vdCBjb21waWxlZCB3aXRoCitwcm9maWxpbmcgZW5hYmxlZCksIHRoZSBAZGZue2NhbGxzfSBmaWVsZCBpcyBibGFuay4KKworQGl0ZW0gc2VsZiBtcy9jYWxsCitUaGlzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCitmdW5jdGlvbiBwZXIgY2FsbCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZC4gIE90aGVyd2lzZSwgdGhpcyBmaWVsZAoraXMgYmxhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCisKK0BpdGVtIHRvdGFsIG1zL2NhbGwKK1RoaXMgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNwZW50IGluIHRoaXMKK2Z1bmN0aW9uIGFuZCBpdHMgZGVzY2VuZGFudHMgcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQuCitPdGhlcndpc2UsIHRoaXMgZmllbGQgaXMgYmxhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCitUaGlzIGlzIHRoZSBvbmx5IGZpZWxkIGluIHRoZSBmbGF0IHByb2ZpbGUgdGhhdCB1c2VzIGNhbGwgZ3JhcGggYW5hbHlzaXMuCisKK0BpdGVtIG5hbWUKK1RoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgIFRoZSBmbGF0IHByb2ZpbGUgaXMgc29ydGVkIGJ5IHRoaXMKK2ZpZWxkIGFscGhhYmV0aWNhbGx5IGFmdGVyIHRoZSBAZGZue3NlbGYgc2Vjb25kc30gYW5kIEBkZm57Y2FsbHN9CitmaWVsZHMgYXJlIHNvcnRlZC4KK0BlbmQgdGFibGUKKworQG5vZGUgQ2FsbCBHcmFwaCxMaW5lLWJ5LWxpbmUsRmxhdCBQcm9maWxlLE91dHB1dAorQHNlY3Rpb24gVGhlIENhbGwgR3JhcGgKK0BjaW5kZXggY2FsbCBncmFwaAorCitUaGUgQGRmbntjYWxsIGdyYXBofSBzaG93cyBob3cgbXVjaCB0aW1lIHdhcyBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uCithbmQgaXRzIGNoaWxkcmVuLiAgRnJvbSB0aGlzIGluZm9ybWF0aW9uLCB5b3UgY2FuIGZpbmQgZnVuY3Rpb25zIHRoYXQsCit3aGlsZSB0aGV5IHRoZW1zZWx2ZXMgbWF5IG5vdCBoYXZlIHVzZWQgbXVjaCB0aW1lLCBjYWxsZWQgb3RoZXIKK2Z1bmN0aW9ucyB0aGF0IGRpZCB1c2UgdW51c3VhbCBhbW91bnRzIG9mIHRpbWUuCisKK0hlcmUgaXMgYSBzYW1wbGUgY2FsbCBmcm9tIGEgc21hbGwgcHJvZ3JhbS4gIFRoaXMgY2FsbCBjYW1lIGZyb20gdGhlCitzYW1lIEBjb2Rle2dwcm9mfSBydW4gYXMgdGhlIGZsYXQgcHJvZmlsZSBleGFtcGxlIGluIHRoZSBwcmV2aW91cworY2hhcHRlci4KKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCitncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAyIGJ5dGUocykgZm9yIDIwLjAwJSBvZiAwLjA1IHNlY29uZHMKKworaW5kZXggJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcG9udGFuZW91cz4KK1sxXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgICAgICAgICAgIHN0YXJ0IFsxXQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCisgICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMiAgICAgICAgICAgb25fZXhpdCBbMjhdCisgICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMSAgICAgICAgICAgZXhpdCBbNTldCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHN0YXJ0IFsxXQorWzJdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgbWFpbiBbMl0KKyAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICByZXBvcnQgWzNdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIG1haW4gWzJdCitbM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCisgICAgICAgICAgICAgICAgMC4wMCAgICAwLjAzICAgICAgIDgvOCAgICAgICAgICAgdGltZWxvY2FsIFs2XQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMSAgICAgICAxLzEgICAgICAgICAgIHByaW50IFs5XQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMSAgICAgICA5LzkgICAgICAgICAgIGZnZXRzIFsxMl0KKyAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxMi8zNCAgICAgICAgICBzdHJuY21wIDxjeWNsZSAxPiBbNDBdCisgICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvOCAgICAgICAgICAgbG9va3VwIFsyMF0KKyAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xICAgICAgICAgICBmb3BlbiBbMjFdCisgICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDgvOCAgICAgICAgICAgY2hld3RpbWUgWzI0XQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzE2ICAgICAgICAgIHNraXBzcGFjZSBbNDRdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWzRdICAgICA1OS44ICAgIDAuMDEgICAgICAgIDAuMDIgICAgICAgOCs0NzIgICAgIDxjeWNsZSAyIGFzIGEgd2hvbGU+CVs0XQorICAgICAgICAgICAgICAgIDAuMDEgICAgICAgIDAuMDIgICAgIDI0NCsyNjAgICAgICAgICBvZmZ0aW1lIDxjeWNsZSAyPiBbN10KKyAgICAgICAgICAgICAgICAwLjAwICAgICAgICAwLjAwICAgICAyMzYrMSAgICAgICAgICAgdHpzZXQgPGN5Y2xlIDI+IFsyNl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgbGluZXMgZnVsbCBvZiBkYXNoZXMgZGl2aWRlIHRoaXMgdGFibGUgaW50byBAZGZue2VudHJpZXN9LCBvbmUgZm9yIGVhY2gKK2Z1bmN0aW9uLiAgRWFjaCBlbnRyeSBoYXMgb25lIG9yIG1vcmUgbGluZXMuCisKK0luIGVhY2ggZW50cnksIHRoZSBwcmltYXJ5IGxpbmUgaXMgdGhlIG9uZSB0aGF0IHN0YXJ0cyB3aXRoIGFuIGluZGV4IG51bWJlcgoraW4gc3F1YXJlIGJyYWNrZXRzLiAgVGhlIGVuZCBvZiB0aGlzIGxpbmUgc2F5cyB3aGljaCBmdW5jdGlvbiB0aGUgZW50cnkgaXMKK2Zvci4gIFRoZSBwcmVjZWRpbmcgbGluZXMgaW4gdGhlIGVudHJ5IGRlc2NyaWJlIHRoZSBjYWxsZXJzIG9mIHRoaXMKK2Z1bmN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGxpbmVzIGRlc2NyaWJlIGl0cyBzdWJyb3V0aW5lcyAoYWxzbyBjYWxsZWQKK0BkZm57Y2hpbGRyZW59IHdoZW4gd2Ugc3BlYWsgb2YgdGhlIGNhbGwgZ3JhcGgpLgorCitUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IHRpbWUgc3BlbnQgaW4gdGhlIGZ1bmN0aW9uIGFuZCBpdHMgc3Vicm91dGluZXMuCisKK1RoZSBpbnRlcm5hbCBwcm9maWxpbmcgZnVuY3Rpb24gQGNvZGV7bWNvdW50fSAoQHB4cmVme0ZsYXQgUHJvZmlsZX0pCitpcyBuZXZlciBtZW50aW9uZWQgaW4gdGhlIGNhbGwgZ3JhcGguCisKK0BtZW51CisqIFByaW1hcnk6OiAgICAgICBEZXRhaWxzIG9mIHRoZSBwcmltYXJ5IGxpbmUncyBjb250ZW50cy4KKyogQ2FsbGVyczo6ICAgICAgIERldGFpbHMgb2YgY2FsbGVyLWxpbmVzJyBjb250ZW50cy4KKyogU3Vicm91dGluZXM6OiAgIERldGFpbHMgb2Ygc3Vicm91dGluZS1saW5lcycgY29udGVudHMuCisqIEN5Y2xlczo6ICAgICAgICBXaGVuIHRoZXJlIGFyZSBjeWNsZXMgb2YgcmVjdXJzaW9uLAorICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgQGNvZGV7YX0gY2FsbHMgQGNvZGV7Yn0gY2FsbHMgQGNvZGV7YX1AZG90c3t9CitAZW5kIG1lbnUKKworQG5vZGUgUHJpbWFyeQorQHN1YnNlY3Rpb24gVGhlIFByaW1hcnkgTGluZQorCitUaGUgQGRmbntwcmltYXJ5IGxpbmV9IGluIGEgY2FsbCBncmFwaCBlbnRyeSBpcyB0aGUgbGluZSB0aGF0CitkZXNjcmliZXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHRoZSBlbnRyeSBpcyBhYm91dCBhbmQgZ2l2ZXMgdGhlIG92ZXJhbGwKK3N0YXRpc3RpY3MgZm9yIHRoaXMgZnVuY3Rpb24uCisKK0ZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0aGUgcHJpbWFyeSBsaW5lIGZyb20gdGhlIGVudHJ5IGZvciBmdW5jdGlvbgorQGNvZGV7cmVwb3J0fSBpbiBvdXIgbWFpbiBleGFtcGxlLCB0b2dldGhlciB3aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdAorc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6CisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAoraW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKK0Bkb3Rze30KK1szXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0hlcmUgaXMgd2hhdCB0aGUgZmllbGRzIGluIHRoZSBwcmltYXJ5IGxpbmUgbWVhbjoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBpbmRleAorRW50cmllcyBhcmUgbnVtYmVyZWQgd2l0aCBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4gIEVhY2ggZnVuY3Rpb24KK3RoZXJlZm9yZSBoYXMgYW4gaW5kZXggbnVtYmVyLCB3aGljaCBhcHBlYXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzCitwcmltYXJ5IGxpbmUuCisKK0VhY2ggY3Jvc3MtcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24sIGFzIGEgY2FsbGVyIG9yIHN1YnJvdXRpbmUgb2YKK2Fub3RoZXIsIGdpdmVzIGl0cyBpbmRleCBudW1iZXIgYXMgd2VsbCBhcyBpdHMgbmFtZS4gIFRoZSBpbmRleCBudW1iZXIKK2d1aWRlcyB5b3UgaWYgeW91IHdpc2ggdG8gbG9vayBmb3IgdGhlIGVudHJ5IGZvciB0aGF0IGZ1bmN0aW9uLgorCitAaXRlbSAlIHRpbWUKK1RoaXMgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHRpbWUgdGhhdCB3YXMgc3BlbnQgaW4gdGhpcworZnVuY3Rpb24sIGluY2x1ZGluZyB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIGNhbGxlZCBmcm9tIHRoaXMKK2Z1bmN0aW9uLgorCitUaGUgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uIGlzIGNvdW50ZWQgYWdhaW4gZm9yIHRoZSBjYWxsZXJzIG9mCit0aGlzIGZ1bmN0aW9uLiAgVGhlcmVmb3JlLCBhZGRpbmcgdXAgdGhlc2UgcGVyY2VudGFnZXMgaXMgbWVhbmluZ2xlc3MuCisKK0BpdGVtIHNlbGYKK1RoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24uICBUaGlzCitzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoZSBudW1iZXIgcHJpbnRlZCBpbiB0aGUgQGNvZGV7c2Vjb25kc30gZmllbGQKK2ZvciB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmbGF0IHByb2ZpbGUuCisKK0BpdGVtIGNoaWxkcmVuCitUaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGUgc3Vicm91dGluZSBjYWxscyBtYWRlIGJ5Cit0aGlzIGZ1bmN0aW9uLiAgVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIHN1bSBvZiBhbGwgdGhlIEBjb2Rle3NlbGZ9CithbmQgQGNvZGV7Y2hpbGRyZW59IGVudHJpZXMgb2YgdGhlIGNoaWxkcmVuIGxpc3RlZCBkaXJlY3RseSBiZWxvdyB0aGlzCitmdW5jdGlvbi4KKworQGl0ZW0gY2FsbGVkCitUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCisKK0lmIHRoZSBmdW5jdGlvbiBjYWxsZWQgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0aGVyZSBhcmUgdHdvIG51bWJlcnMsCitzZXBhcmF0ZWQgYnkgYSBAc2FtcHsrfS4gIFRoZSBmaXJzdCBudW1iZXIgY291bnRzIG5vbi1yZWN1cnNpdmUgY2FsbHMsCithbmQgdGhlIHNlY29uZCBjb3VudHMgcmVjdXJzaXZlIGNhbGxzLgorCitJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBvbmNlIGZyb20KK0Bjb2Rle21haW59LgorCitAaXRlbSBuYW1lCitUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIGluZGV4IG51bWJlciBpcworcmVwZWF0ZWQgYWZ0ZXIgaXQuCisKK0lmIHRoZSBmdW5jdGlvbiBpcyBwYXJ0IG9mIGEgY3ljbGUgb2YgcmVjdXJzaW9uLCB0aGUgY3ljbGUgbnVtYmVyIGlzCitwcmludGVkIGJldHdlZW4gdGhlIGZ1bmN0aW9uJ3MgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlcgorKEBweHJlZntDeWNsZXN9KS4gIEZvciBleGFtcGxlLCBpZiBmdW5jdGlvbiBAY29kZXtnbnVycn0gaXMgcGFydCBvZgorY3ljbGUgbnVtYmVyIG9uZSwgYW5kIGhhcyBpbmRleCBudW1iZXIgdHdlbHZlLCBpdHMgcHJpbWFyeSBsaW5lIHdvdWxkCitiZSBlbmQgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorZ251cnIgPGN5Y2xlIDE+IFsxMl0KK0BlbmQgZXhhbXBsZQorQGVuZCB0YWJsZQorCitAbm9kZSBDYWxsZXJzLCBTdWJyb3V0aW5lcywgUHJpbWFyeSwgQ2FsbCBHcmFwaAorQHN1YnNlY3Rpb24gTGluZXMgZm9yIGEgRnVuY3Rpb24ncyBDYWxsZXJzCisKK0EgZnVuY3Rpb24ncyBlbnRyeSBoYXMgYSBsaW5lIGZvciBlYWNoIGZ1bmN0aW9uIGl0IHdhcyBjYWxsZWQgYnkuCitUaGVzZSBsaW5lcycgZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBsaW5lLCBidXQKK3RoZWlyIG1lYW5pbmdzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiBjb250ZXh0LgorCitGb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdHdvIGxpbmVzIGZyb20gdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24KK0Bjb2Rle3JlcG9ydH0sIHRoZSBwcmltYXJ5IGxpbmUgYW5kIG9uZSBjYWxsZXItbGluZSBwcmVjZWRpbmcgaXQsIHRvZ2V0aGVyCit3aXRoIHRoZSBoZWFkaW5nIGxpbmUgdGhhdCBzaG93cyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkczoKKworQHNtYWxsZXhhbXBsZQoraW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKK0Bkb3Rze30KKyAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQorWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQorQGVuZCBzbWFsbGV4YW1wbGUKKworSGVyZSBhcmUgdGhlIG1lYW5pbmdzIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGNhbGxlci1saW5lIGZvciBAY29kZXtyZXBvcnR9CitjYWxsZWQgZnJvbSBAY29kZXttYWlufToKKworQHRhYmxlIEBjb2RlCitAaXRlbSBzZWxmCitBbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gQGNvZGV7cmVwb3J0fSBpdHNlbGYgd2hlbiBpdCB3YXMKK2NhbGxlZCBmcm9tIEBjb2Rle21haW59LgorCitAaXRlbSBjaGlsZHJlbgorQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIG9mIEBjb2Rle3JlcG9ydH0KK3doZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCisKK1RoZSBzdW0gb2YgdGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGlzIGFuIGVzdGltYXRlCitvZiB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd2l0aGluIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufS4KKworQGl0ZW0gY2FsbGVkCitUd28gbnVtYmVyczogdGhlIG51bWJlciBvZiB0aW1lcyBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufSwKK2ZvbGxvd2VkIGJ5IHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9ucmVjdXJzaXZlIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbQorYWxsIGl0cyBjYWxsZXJzLgorCitAaXRlbSBuYW1lIGFuZCBpbmRleCBudW1iZXIKK1RoZSBuYW1lIG9mIHRoZSBjYWxsZXIgb2YgQGNvZGV7cmVwb3J0fSB0byB3aGljaCB0aGlzIGxpbmUgYXBwbGllcywKK2ZvbGxvd2VkIGJ5IHRoZSBjYWxsZXIncyBpbmRleCBudW1iZXIuCisKK05vdCBhbGwgZnVuY3Rpb25zIGhhdmUgZW50cmllcyBpbiB0aGUgY2FsbCBncmFwaDsgc29tZQorb3B0aW9ucyB0byBAY29kZXtncHJvZn0gcmVxdWVzdCB0aGUgb21pc3Npb24gb2YgY2VydGFpbiBmdW5jdGlvbnMuCitXaGVuIGEgY2FsbGVyIGhhcyBubyBlbnRyeSBvZiBpdHMgb3duLCBpdCBzdGlsbCBoYXMgY2FsbGVyLWxpbmVzCitpbiB0aGUgZW50cmllcyBvZiB0aGUgZnVuY3Rpb25zIGl0IGNhbGxzLgorCitJZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgYSByZWN1cnNpb24gY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMKK3ByaW50ZWQgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KK0BlbmQgdGFibGUKKworSWYgdGhlIGlkZW50aXR5IG9mIHRoZSBjYWxsZXJzIG9mIGEgZnVuY3Rpb24gY2Fubm90IGJlIGRldGVybWluZWQsIGEKK2R1bW15IGNhbGxlci1saW5lIGlzIHByaW50ZWQgd2hpY2ggaGFzIEBzYW1wezxzcG9udGFuZW91cz59IGFzIHRoZQorYGBjYWxsZXIncyBuYW1lJycgYW5kIGFsbCBvdGhlciBmaWVsZHMgYmxhbmsuICBUaGlzIGNhbiBoYXBwZW4gZm9yCitzaWduYWwgaGFuZGxlcnMuCitAYyBXaGF0IGlmIHNvbWUgY2FsbHMgaGF2ZSBkZXRlcm1pbmFibGUgY2FsbGVycycgbmFtZXMgYnV0IG5vdCBhbGw/CitAYyBGSVhNRSAtIHN0aWxsIHJlbGV2YW50PworCitAbm9kZSBTdWJyb3V0aW5lcywgQ3ljbGVzLCBDYWxsZXJzLCBDYWxsIEdyYXBoCitAc3Vic2VjdGlvbiBMaW5lcyBmb3IgYSBGdW5jdGlvbidzIFN1YnJvdXRpbmVzCisKK0EgZnVuY3Rpb24ncyBlbnRyeSBoYXMgYSBsaW5lIGZvciBlYWNoIG9mIGl0cyBzdWJyb3V0aW5lcy0tLWluIG90aGVyCit3b3JkcywgYSBsaW5lIGZvciBlYWNoIG90aGVyIGZ1bmN0aW9uIHRoYXQgaXQgY2FsbGVkLiAgVGhlc2UgbGluZXMnCitmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGxpbmUsIGJ1dCB0aGVpciBtZWFuaW5ncworYXJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbmNlIGluIGNvbnRleHQuCisKK0ZvciByZWZlcmVuY2UsIHdlIHJlcGVhdCB0d28gbGluZXMgZnJvbSB0aGUgZW50cnkgZm9yIHRoZSBmdW5jdGlvbgorQGNvZGV7bWFpbn0sIHRoZSBwcmltYXJ5IGxpbmUgYW5kIGEgbGluZSBmb3IgYSBzdWJyb3V0aW5lLCB0b2dldGhlcgord2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQgc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6CisKK0BzbWFsbGV4YW1wbGUKK2luZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCitAZG90c3t9CitbMl0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICBtYWluIFsyXQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wNSAgICAgICAxLzEgICAgICAgICAgIHJlcG9ydCBbM10KK0BlbmQgc21hbGxleGFtcGxlCisKK0hlcmUgYXJlIHRoZSBtZWFuaW5ncyBvZiB0aGUgZmllbGRzIGluIHRoZSBzdWJyb3V0aW5lLWxpbmUgZm9yIEBjb2Rle21haW59CitjYWxsaW5nIEBjb2Rle3JlcG9ydH06CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gc2VsZgorQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGRpcmVjdGx5IHdpdGhpbiBAY29kZXtyZXBvcnR9Cit3aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgorCitAaXRlbSBjaGlsZHJlbgorQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHN1YnJvdXRpbmVzIG9mIEBjb2Rle3JlcG9ydH0KK3doZW4gQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0uCisKK1RoZSBzdW0gb2YgdGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGlzIGFuIGVzdGltYXRlCitvZiB0aGUgdG90YWwgdGltZSBzcGVudCBpbiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0uCisKK0BpdGVtIGNhbGxlZAorVHdvIG51bWJlcnMsIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59Citmb2xsb3dlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIG5vbnJlY3Vyc2l2ZSBjYWxscyB0byBAY29kZXtyZXBvcnR9LgorVGhpcyByYXRpbyBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgbXVjaCBvZiBAY29kZXtyZXBvcnR9J3MgQGNvZGV7c2VsZn0KK2FuZCBAY29kZXtjaGlsZHJlbn0gdGltZSBnZXRzIGNyZWRpdGVkIHRvIEBjb2Rle21haW59LgorQHhyZWZ7QXNzdW1wdGlvbnN9LgorCitAaXRlbSBuYW1lCitUaGUgbmFtZSBvZiB0aGUgc3Vicm91dGluZSBvZiBAY29kZXttYWlufSB0byB3aGljaCB0aGlzIGxpbmUgYXBwbGllcywKK2ZvbGxvd2VkIGJ5IHRoZSBzdWJyb3V0aW5lJ3MgaW5kZXggbnVtYmVyLgorCitJZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgYSByZWN1cnNpb24gY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMKK3ByaW50ZWQgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KK0BlbmQgdGFibGUKKworQG5vZGUgQ3ljbGVzLCwgU3Vicm91dGluZXMsIENhbGwgR3JhcGgKK0BzdWJzZWN0aW9uIEhvdyBNdXR1YWxseSBSZWN1cnNpdmUgRnVuY3Rpb25zIEFyZSBEZXNjcmliZWQKK0BjaW5kZXggY3ljbGUKK0BjaW5kZXggcmVjdXJzaW9uIGN5Y2xlCisKK1RoZSBncmFwaCBtYXkgYmUgY29tcGxpY2F0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIEBkZm57Y3ljbGVzIG9mCityZWN1cnNpb259IGluIHRoZSBjYWxsIGdyYXBoLiAgQSBjeWNsZSBleGlzdHMgaWYgYSBmdW5jdGlvbiBjYWxscworYW5vdGhlciBmdW5jdGlvbiB0aGF0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBjYWxscyAob3IgYXBwZWFycyB0bworY2FsbCkgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6IGlmIEBjb2Rle2F9IGNhbGxzIEBjb2Rle2J9LAorYW5kIEBjb2Rle2J9IGNhbGxzIEBjb2Rle2F9LCB0aGVuIEBjb2Rle2F9IGFuZCBAY29kZXtifSBmb3JtIGEgY3ljbGUuCisKK1doZW5ldmVyIHRoZXJlIGFyZSBjYWxsIHBhdGhzIGJvdGggd2F5cyBiZXR3ZWVuIGEgcGFpciBvZiBmdW5jdGlvbnMsIHRoZXkKK2JlbG9uZyB0byB0aGUgc2FtZSBjeWNsZS4gIElmIEBjb2Rle2F9IGFuZCBAY29kZXtifSBjYWxsIGVhY2ggb3RoZXIgYW5kCitAY29kZXtifSBhbmQgQGNvZGV7Y30gY2FsbCBlYWNoIG90aGVyLCBhbGwgdGhyZWUgbWFrZSBvbmUgY3ljbGUuICBOb3RlIHRoYXQKK2V2ZW4gaWYgQGNvZGV7Yn0gb25seSBjYWxscyBAY29kZXthfSBpZiBpdCB3YXMgbm90IGNhbGxlZCBmcm9tIEBjb2Rle2F9LAorQGNvZGV7Z3Byb2Z9IGNhbm5vdCBkZXRlcm1pbmUgdGhpcywgc28gQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGFyZSBzdGlsbAorY29uc2lkZXJlZCBhIGN5Y2xlLgorCitUaGUgY3ljbGVzIGFyZSBudW1iZXJlZCB3aXRoIGNvbnNlY3V0aXZlIGludGVnZXJzLiAgV2hlbiBhIGZ1bmN0aW9uCitiZWxvbmdzIHRvIGEgY3ljbGUsIGVhY2ggdGltZSB0aGUgZnVuY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBjYWxsIGdyYXBoCitpdCBpcyBmb2xsb3dlZCBieSBAc2FtcHs8Y3ljbGUgQHZhcntudW1iZXJ9Pn0uCisKK1RoZSByZWFzb24gY3ljbGVzIG1hdHRlciBpcyB0aGF0IHRoZXkgbWFrZSB0aGUgdGltZSB2YWx1ZXMgaW4gdGhlIGNhbGwKK2dyYXBoIHBhcmFkb3hpY2FsLiAgVGhlIGBgdGltZSBzcGVudCBpbiBjaGlsZHJlbicnIG9mIEBjb2Rle2F9IHNob3VsZAoraW5jbHVkZSB0aGUgdGltZSBzcGVudCBpbiBpdHMgc3Vicm91dGluZSBAY29kZXtifSBhbmQgaW4gQGNvZGV7Yn0ncworc3Vicm91dGluZXMtLS1idXQgb25lIG9mIEBjb2Rle2J9J3Mgc3Vicm91dGluZXMgaXMgQGNvZGV7YX0hICBIb3cgbXVjaCBvZgorQGNvZGV7YX0ncyB0aW1lIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hpbGRyZW4gb2YgQGNvZGV7YX0sIHdoZW4KK0Bjb2Rle2F9IGlzIGluZGlyZWN0bHkgcmVjdXJzaXZlPworCitUaGUgd2F5IEBjb2Rle2dwcm9mfSByZXNvbHZlcyB0aGlzIHBhcmFkb3ggaXMgYnkgY3JlYXRpbmcgYSBzaW5nbGUgZW50cnkKK2ZvciB0aGUgY3ljbGUgYXMgYSB3aG9sZS4gIFRoZSBwcmltYXJ5IGxpbmUgb2YgdGhpcyBlbnRyeSBkZXNjcmliZXMgdGhlCit0b3RhbCB0aW1lIHNwZW50IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLiAgVGhlCitgYHN1YnJvdXRpbmVzJycgb2YgdGhlIGN5Y2xlIGFyZSB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLCBhbmQKK2FsbCBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIGNhbGxlZCBkaXJlY3RseSBieSB0aGVtLiAgVGhlIGBgY2FsbGVycycnIG9mCit0aGUgY3ljbGUgYXJlIHRoZSBmdW5jdGlvbnMsIG91dHNpZGUgdGhlIGN5Y2xlLCB0aGF0IGNhbGxlZCBmdW5jdGlvbnMgaW4KK3RoZSBjeWNsZS4KKworSGVyZSBpcyBhbiBleGFtcGxlIHBvcnRpb24gb2YgYSBjYWxsIGdyYXBoIHdoaWNoIHNob3dzIGEgY3ljbGUgY29udGFpbmluZworZnVuY3Rpb25zIEBjb2Rle2F9IGFuZCBAY29kZXtifS4gIFRoZSBjeWNsZSB3YXMgZW50ZXJlZCBieSBhIGNhbGwgdG8KK0Bjb2Rle2F9IGZyb20gQGNvZGV7bWFpbn07IGJvdGggQGNvZGV7YX0gYW5kIEBjb2Rle2J9IGNhbGxlZCBAY29kZXtjfS4KKworQHNtYWxsZXhhbXBsZQoraW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCitbM10gICAgIDkxLjcxICAgIDEuNzcgICAgICAgIDAgICAgMSs1ICAgIDxjeWNsZSAxIGFzIGEgd2hvbGU+IFszXQorICAgICAgICAgICAgICAgICAxLjAyICAgICAgICAwICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCisgICAgICAgICAgICAgICAgIDAuNzUgICAgICAgIDAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorWzRdICAgICA1Mi44NSAgICAxLjAyICAgICAgICAwICAgIDAgICAgICBiIDxjeWNsZSAxPiBbNF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KK1s1XSAgICAgMzguODYgICAgMC43NSAgICAgICAgMCAgICAxICAgICAgYSA8Y3ljbGUgMT4gWzVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KKyAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKKyhUaGUgZW50aXJlIGNhbGwgZ3JhcGggZm9yIHRoaXMgcHJvZ3JhbSBjb250YWlucyBpbiBhZGRpdGlvbiBhbiBlbnRyeSBmb3IKK0Bjb2Rle21haW59LCB3aGljaCBjYWxscyBAY29kZXthfSwgYW5kIGFuIGVudHJ5IGZvciBAY29kZXtjfSwgd2l0aCBjYWxsZXJzCitAY29kZXthfSBhbmQgQGNvZGV7Yn0uKQorCitAc21hbGxleGFtcGxlCitpbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwb250YW5lb3VzPgorWzFdICAgIDEwMC4wMCAgICAgICAwICAgICAxLjkzICAgIDAgICAgICBzdGFydCBbMV0KKyAgICAgICAgICAgICAgICAgMC4xNiAgICAgMS43NyAgICAxLzEgICAgICAgIG1haW4gWzJdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgIDAuMTYgICAgIDEuNzcgICAgMS8xICAgICAgICBzdGFydCBbMV0KK1syXSAgICAxMDAuMDAgICAgMC4xNiAgICAgMS43NyAgICAxICAgICAgbWFpbiBbMl0KKyAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAxLjc3ICAgICAgICAwICAgIDEvMSAgICAgICAgbWFpbiBbMl0KK1szXSAgICAgOTEuNzEgICAgMS43NyAgICAgICAgMCAgICAxKzUgICAgPGN5Y2xlIDEgYXMgYSB3aG9sZT4gWzNdCisgICAgICAgICAgICAgICAgIDEuMDIgICAgICAgIDAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KKyAgICAgICAgICAgICAgICAgMC43NSAgICAgICAgMCAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDYvNiAgICAgICAgYyBbNl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorWzRdICAgICA1Mi44NSAgICAxLjAyICAgICAgICAwICAgIDAgICAgICBiIDxjeWNsZSAxPiBbNF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYyBbNl0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KK1s1XSAgICAgMzguODYgICAgMC43NSAgICAgICAgMCAgICAxICAgICAgYSA8Y3ljbGUgMT4gWzVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBiIDxjeWNsZSAxPiBbNF0KKyAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBiIDxjeWNsZSAxPiBbNF0KKyAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGEgPGN5Y2xlIDE+IFs1XQorWzZdICAgICAgMC4wMCAgICAgICAwICAgICAgICAwICAgIDYgICAgICBjIFs2XQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIEBjb2Rle3NlbGZ9IGZpZWxkIG9mIHRoZSBjeWNsZSdzIHByaW1hcnkgbGluZSBpcyB0aGUgdG90YWwgdGltZQorc3BlbnQgaW4gYWxsIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGN5Y2xlLiAgSXQgZXF1YWxzIHRoZSBzdW0gb2YgdGhlCitAY29kZXtzZWxmfSBmaWVsZHMgZm9yIHRoZSBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBpbiB0aGUgY3ljbGUsIGZvdW5kCitpbiB0aGUgZW50cnkgaW4gdGhlIHN1YnJvdXRpbmUgbGluZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KKworVGhlIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgb2YgdGhlIGN5Y2xlJ3MgcHJpbWFyeSBsaW5lIGFuZCBzdWJyb3V0aW5lIGxpbmVzCitjb3VudCBvbmx5IHN1YnJvdXRpbmVzIG91dHNpZGUgdGhlIGN5Y2xlLiAgRXZlbiB0aG91Z2ggQGNvZGV7YX0gY2FsbHMKK0Bjb2Rle2J9LCB0aGUgdGltZSBzcGVudCBpbiB0aG9zZSBjYWxscyB0byBAY29kZXtifSBpcyBub3QgY291bnRlZCBpbgorQGNvZGV7YX0ncyBAY29kZXtjaGlsZHJlbn0gdGltZS4gIFRodXMsIHdlIGRvIG5vdCBlbmNvdW50ZXIgdGhlIHByb2JsZW0gb2YKK3doYXQgdG8gZG8gd2hlbiB0aGUgdGltZSBpbiB0aG9zZSBjYWxscyB0byBAY29kZXtifSBpbmNsdWRlcyBpbmRpcmVjdAorcmVjdXJzaXZlIGNhbGxzIGJhY2sgdG8gQGNvZGV7YX0uCisKK1RoZSBAY29kZXtjaGlsZHJlbn0gZmllbGQgb2YgYSBjYWxsZXItbGluZSBpbiB0aGUgY3ljbGUncyBlbnRyeSBlc3RpbWF0ZXMKK3RoZSBhbW91bnQgb2YgdGltZSBzcGVudCBAZW1waHtpbiB0aGUgd2hvbGUgY3ljbGV9LCBhbmQgaXRzIG90aGVyCitzdWJyb3V0aW5lcywgb24gdGhlIHRpbWVzIHdoZW4gdGhhdCBjYWxsZXIgY2FsbGVkIGEgZnVuY3Rpb24gaW4gdGhlIGN5Y2xlLgorCitUaGUgQGNvZGV7Y2FsbHN9IGZpZWxkIGluIHRoZSBwcmltYXJ5IGxpbmUgZm9yIHRoZSBjeWNsZSBoYXMgdHdvIG51bWJlcnM6CitmaXJzdCwgdGhlIG51bWJlciBvZiB0aW1lcyBmdW5jdGlvbnMgaW4gdGhlIGN5Y2xlIHdlcmUgY2FsbGVkIGJ5IGZ1bmN0aW9ucworb3V0c2lkZSB0aGUgY3ljbGU7IHNlY29uZCwgdGhlIG51bWJlciBvZiB0aW1lcyB0aGV5IHdlcmUgY2FsbGVkIGJ5CitmdW5jdGlvbnMgaW4gdGhlIGN5Y2xlIChpbmNsdWRpbmcgdGltZXMgd2hlbiBhIGZ1bmN0aW9uIGluIHRoZSBjeWNsZSBjYWxscworaXRzZWxmKS4gIFRoaXMgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgdXN1YWwgc3BsaXQgaW50byBub25yZWN1cnNpdmUgYW5kCityZWN1cnNpdmUgY2FsbHMuCisKK1RoZSBAY29kZXtjYWxsc30gZmllbGQgb2YgYSBzdWJyb3V0aW5lLWxpbmUgZm9yIGEgY3ljbGUgbWVtYmVyIGluIHRoZQorY3ljbGUncyBlbnRyeSBzYXlzIGhvdyBtYW55IHRpbWUgdGhhdCBmdW5jdGlvbiB3YXMgY2FsbGVkIGZyb20gZnVuY3Rpb25zIGluCit0aGUgY3ljbGUuICBUaGUgdG90YWwgb2YgYWxsIHRoZXNlIGlzIHRoZSBzZWNvbmQgbnVtYmVyIGluIHRoZSBwcmltYXJ5IGxpbmUncworQGNvZGV7Y2FsbHN9IGZpZWxkLgorCitJbiB0aGUgaW5kaXZpZHVhbCBlbnRyeSBmb3IgYSBmdW5jdGlvbiBpbiBhIGN5Y2xlLCB0aGUgb3RoZXIgZnVuY3Rpb25zIGluCit0aGUgc2FtZSBjeWNsZSBjYW4gYXBwZWFyIGFzIHN1YnJvdXRpbmVzIGFuZCBhcyBjYWxsZXJzLiAgVGhlc2UgbGluZXMgc2hvdworaG93IG1hbnkgdGltZXMgZWFjaCBmdW5jdGlvbiBpbiB0aGUgY3ljbGUgY2FsbGVkIG9yIHdhcyBjYWxsZWQgZnJvbSBlYWNoIG90aGVyCitmdW5jdGlvbiBpbiB0aGUgY3ljbGUuICBUaGUgQGNvZGV7c2VsZn0gYW5kIEBjb2Rle2NoaWxkcmVufSBmaWVsZHMgaW4gdGhlc2UKK2xpbmVzIGFyZSBibGFuayBiZWNhdXNlIG9mIHRoZSBkaWZmaWN1bHR5IG9mIGRlZmluaW5nIG1lYW5pbmdzIGZvciB0aGVtCit3aGVuIHJlY3Vyc2lvbiBpcyBnb2luZyBvbi4KKworQG5vZGUgTGluZS1ieS1saW5lLEFubm90YXRlZCBTb3VyY2UsQ2FsbCBHcmFwaCxPdXRwdXQKK0BzZWN0aW9uIExpbmUtYnktbGluZSBQcm9maWxpbmcKKworQGNvZGV7Z3Byb2Z9J3MgQHNhbXB7LWx9IG9wdGlvbiBjYXVzZXMgdGhlIHByb2dyYW0gdG8gcGVyZm9ybQorQGRmbntsaW5lLWJ5LWxpbmV9IHByb2ZpbGluZy4gIEluIHRoaXMgbW9kZSwgaGlzdG9ncmFtCitzYW1wbGVzIGFyZSBhc3NpZ25lZCBub3QgdG8gZnVuY3Rpb25zLCBidXQgdG8gaW5kaXZpZHVhbAorbGluZXMgb2Ygc291cmNlIGNvZGUuICBUaGUgcHJvZ3JhbSB1c3VhbGx5IG11c3QgYmUgY29tcGlsZWQKK3dpdGggYSBAc2FtcHstZ30gb3B0aW9uLCBpbiBhZGRpdGlvbiB0byBAc2FtcHstcGd9LCBpbiBvcmRlcgordG8gZ2VuZXJhdGUgZGVidWdnaW5nIHN5bWJvbHMgZm9yIHRyYWNraW5nIHNvdXJjZSBjb2RlIGxpbmVzLgorCitUaGUgZmxhdCBwcm9maWxlIGlzIHRoZSBtb3N0IHVzZWZ1bCBvdXRwdXQgdGFibGUKK2luIGxpbmUtYnktbGluZSBtb2RlLgorVGhlIGNhbGwgZ3JhcGggaXNuJ3QgYXMgdXNlZnVsIGFzIG5vcm1hbCwgc2luY2UKK3RoZSBjdXJyZW50IHZlcnNpb24gb2YgQGNvZGV7Z3Byb2Z9IGRvZXMgbm90IHByb3BhZ2F0ZQorY2FsbCBncmFwaCBhcmNzIGZyb20gc291cmNlIGNvZGUgbGluZXMgdG8gdGhlIGVuY2xvc2luZyBmdW5jdGlvbi4KK1RoZSBjYWxsIGdyYXBoIGRvZXMsIGhvd2V2ZXIsIHNob3cgZWFjaCBsaW5lIG9mIGNvZGUKK3RoYXQgY2FsbGVkIGVhY2ggZnVuY3Rpb24sIGFsb25nIHdpdGggYSBjb3VudC4KKworSGVyZSBpcyBhIHNlY3Rpb24gb2YgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0LCB3aXRob3V0IGxpbmUtYnktbGluZSBwcm9maWxpbmcuCitOb3RlIHRoYXQgQGNvZGV7Y3RfaW5pdH0gYWNjb3VudGVkIGZvciBmb3VyIGhpc3RvZ3JhbSBoaXRzLCBhbmQKKzEzMzI3IGNhbGxzIHRvIEBjb2Rle2luaXRfYmxvY2t9LgorCitAc21hbGxleGFtcGxlCitGbGF0IHByb2ZpbGU6CisKK0VhY2ggc2FtcGxlIGNvdW50cyBhcyAwLjAxIHNlY29uZHMuCisgICUgICBjdW11bGF0aXZlICAgc2VsZiAgICAgICAgICAgICAgc2VsZiAgICAgdG90YWwgICAgICAgICAgIAorIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgdXMvY2FsbCAgdXMvY2FsbCAgbmFtZSAgICAKKyAzMC43NyAgICAgIDAuMTMgICAgIDAuMDQgICAgIDYzMzUgICAgIDYuMzEgICAgIDYuMzEgIGN0X2luaXQKKworCisJCSAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cykKKworCitncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyA0IGJ5dGUocykgZm9yIDcuNjklIG9mIDAuMTMgc2Vjb25kcworCitpbmRleCAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lCisKKyAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBuYW1lX3Rvb19sb25nCisgICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgNDAvMTM0OTYgICAgICAgZGVmbGF0ZQorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgMTI4LzEzNDk2ICAgICAgIGRlZmxhdGVfZmFzdAorICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgIDEzMzI3LzEzNDk2ICAgICAgIGN0X2luaXQKK1s3XSAgICAgIDAuMCAgICAwLjAwICAgIDAuMDAgICAxMzQ5NiAgICAgICAgIGluaXRfYmxvY2sKKworQGVuZCBzbWFsbGV4YW1wbGUKKworTm93IGxldCdzIGxvb2sgYXQgc29tZSBvZiBAY29kZXtncHJvZn0ncyBvdXRwdXQgZnJvbSB0aGUgc2FtZSBwcm9ncmFtIHJ1biwKK3RoaXMgdGltZSB3aXRoIGxpbmUtYnktbGluZSBwcm9maWxpbmcgZW5hYmxlZC4gIE5vdGUgdGhhdCBAY29kZXtjdF9pbml0fSdzCitmb3VyIGhpc3RvZ3JhbSBoaXRzIGFyZSBicm9rZW4gZG93biBpbnRvIGZvdXIgbGluZXMgb2Ygc291cmNlIGNvZGUgLSBvbmUgaGl0CitvY2N1cmVkIG9uIGVhY2ggb2YgbGluZXMgMzQ5LCAzNTEsIDM4MiBhbmQgMzg1LiAgSW4gdGhlIGNhbGwgZ3JhcGgsCitub3RlIGhvdworQGNvZGV7Y3RfaW5pdH0ncyAxMzMyNyBjYWxscyB0byBAY29kZXtpbml0X2Jsb2NrfSBhcmUgYnJva2VuIGRvd24KK2ludG8gb25lIGNhbGwgZnJvbSBsaW5lIDM5NiwgMzA3MSBjYWxscyBmcm9tIGxpbmUgMzg0LCAzNzMwIGNhbGxzCitmcm9tIGxpbmUgMzg1LCBhbmQgNjUyNSBjYWxscyBmcm9tIDM4Ny4KKworQHNtYWxsZXhhbXBsZQorRmxhdCBwcm9maWxlOgorCitFYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgorICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgICAgICAgIAorIHRpbWUgICBzZWNvbmRzICAgc2Vjb25kcyAgICBjYWxscyAgbmFtZSAgICAKKyAgNy42OSAgICAgIDAuMTAgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzQ5KQorICA3LjY5ICAgICAgMC4xMSAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozNTEpCisgIDcuNjkgICAgICAwLjEyICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4MikKKyAgNy42OSAgICAgIDAuMTMgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg1KQorCisKKwkJICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKQorCisKK2dyYW51bGFyaXR5OiBlYWNoIHNhbXBsZSBoaXQgY292ZXJzIDQgYnl0ZShzKSBmb3IgNy42OSUgb2YgMC4xMyBzZWNvbmRzCisKKyAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQorCisgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBuYW1lX3Rvb19sb25nIChnemlwLmM6MTQ0MCkKKyAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3NjMpCisgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM5NikKKyAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAyLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo3MjcpCisgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgNC8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njg2KQorICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDUvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY3NSkKKyAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDEyLzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2NzkpCisgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxNi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzMwKQorICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAxMjgvMTM0OTYgICAgICAgZGVmbGF0ZV9mYXN0IChkZWZsYXRlLmM6NjU0KQorICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDMwNzEvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODQpCisgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgMzczMC8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NSkKKyAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICA2NTI1LzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg3KQorWzZdICAwLjAgICAgMC4wMCAgICAwLjAwICAgMTM0OTYgICAgICAgICBpbml0X2Jsb2NrICh0cmVlcy5jOjQwOCkKKworQGVuZCBzbWFsbGV4YW1wbGUKKworCitAbm9kZSBBbm5vdGF0ZWQgU291cmNlLCxMaW5lLWJ5LWxpbmUsT3V0cHV0CitAc2VjdGlvbiBUaGUgQW5ub3RhdGVkIFNvdXJjZSBMaXN0aW5nCisKK0Bjb2Rle2dwcm9mfSdzIEBzYW1wey1BfSBvcHRpb24gdHJpZ2dlcnMgYW4gYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nLAord2hpY2ggbGlzdHMgdGhlIHByb2dyYW0ncyBzb3VyY2UgY29kZSwgZWFjaCBmdW5jdGlvbiBsYWJlbGVkIHdpdGggdGhlCitudW1iZXIgb2YgdGltZXMgaXQgd2FzIGNhbGxlZC4gIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlCitAc2FtcHstSX0gb3B0aW9uLCBpZiBAY29kZXtncHJvZn0gY2FuJ3QgZmluZCB0aGUgc291cmNlIGNvZGUgZmlsZXMuCisKK0NvbXBpbGluZyB3aXRoIEBzYW1we2djYyBAZG90c3t9IC1nIC1wZyAtYX0gYXVnbWVudHMgeW91ciBwcm9ncmFtCit3aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGNvZGUsIGluIGFkZGl0aW9uIHRvIGZ1bmN0aW9uIGNvdW50aW5nIGNvZGUuCitUaGlzIGVuYWJsZXMgQGNvZGV7Z3Byb2Z9IHRvIGRldGVybWluZSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUKK29mIGNvZGUgd2FzIGV4ZXVjdGVkLgorRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24sIHRha2VuIGZyb20gZ3ppcCwKK3dpdGggbGluZSBudW1iZXJzIGFkZGVkOgorCitAc21hbGxleGFtcGxlCisgMSB1bGcgdXBkY3JjKHMsIG4pCisgMiAgICAgdWNoICpzOworIDMgICAgIHVuc2lnbmVkIG47CisgNCBAeworIDUgICAgIHJlZ2lzdGVyIHVsZyBjOworIDYKKyA3ICAgICBzdGF0aWMgdWxnIGNyYyA9ICh1bGcpMHhmZmZmZmZmZkw7CisgOAorIDkgICAgIGlmIChzID09IE5VTEwpIEB7CisxMCAgICAgICAgIGMgPSAweGZmZmZmZmZmTDsKKzExICAgICBAfSBlbHNlIEB7CisxMiAgICAgICAgIGMgPSBjcmM7CisxMyAgICAgICAgIGlmIChuKSBkbyBAeworMTQgICAgICAgICAgICAgYyA9IGNyY18zMl90YWJbLi4uXTsKKzE1ICAgICAgICAgQH0gd2hpbGUgKC0tbik7CisxNiAgICAgQH0KKzE3ICAgICBjcmMgPSBjOworMTggICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7CisxOSBAfQorCitAZW5kIHNtYWxsZXhhbXBsZQorCitAY29kZXt1cGRjcmN9IGhhcyBhdCBsZWFzdCBmaXZlIGJhc2ljLWJsb2Nrcy4KK09uZSBpcyB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhlCitAY29kZXtpZn0gc3RhdGVtZW50IG9uIGxpbmUgOSBnZW5lcmF0ZXMgdHdvIG1vcmUgYmFzaWMtYmxvY2tzLCBvbmUKK2ZvciBlYWNoIGJyYW5jaCBvZiB0aGUgQGNvZGV7aWZ9LiAgQSBmb3VydGggYmFzaWMtYmxvY2sgcmVzdWx0cyBmcm9tCit0aGUgQGNvZGV7aWZ9IG9uIGxpbmUgMTMsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIEBjb2Rle2RvfSBsb29wIGZvcm0KK3RoZSBmaWZ0aCBiYXNpYy1ibG9jay4gIFRoZSBjb21waWxlciBtYXkgYWxzbyBnZW5lcmF0ZSBhZGRpdGlvbmFsCitiYXNpYy1ibG9ja3MgdG8gaGFuZGxlIHZhcmlvdXMgc3BlY2lhbCBjYXNlcy4KKworQSBwcm9ncmFtIGF1Z21lbnRlZCBmb3IgYmFzaWMtYmxvY2sgY291bnRpbmcgY2FuIGJlIGFuYWx5emVkIHdpdGgKK0Bjb2Rle2dwcm9mIC1sIC1BfS4gIEkgYWxzbyBzdWdnZXN0IHVzZSBvZiB0aGUgQHNhbXB7LXh9IG9wdGlvbiwKK3doaWNoIGVuc3VyZXMgdGhhdCBlYWNoIGxpbmUgb2YgY29kZSBpcyBsYWJlbGVkIGF0IGxlYXN0IG9uY2UuCitIZXJlIGlzIEBjb2Rle3VwZGNyY30ncworYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIGZvciBhIHNhbXBsZSBAY29kZXtnemlwfSBydW46CisKK0BzbWFsbGV4YW1wbGUKKyAgICAgICAgICAgICAgICB1bGcgdXBkY3JjKHMsIG4pCisgICAgICAgICAgICAgICAgICAgIHVjaCAqczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbjsKKyAgICAgICAgICAgIDIgLT5AeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB1bGcgYzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIHVsZyBjcmMgPSAodWxnKTB4ZmZmZmZmZmZMOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgMiAtPiAgICBpZiAocyA9PSBOVUxMKSBAeworICAgICAgICAgICAgMSAtPgljID0gMHhmZmZmZmZmZkw7CisgICAgICAgICAgICAxIC0+ICAgIEB9IGVsc2UgQHsKKyAgICAgICAgICAgIDEgLT4JYyA9IGNyYzsKKyAgICAgICAgICAgIDEgLT4gICAgICAgIGlmIChuKSBkbyBAeworICAgICAgICAyNjMxMiAtPiAgICAgICAgICAgIGMgPSBjcmNfMzJfdGFiWy4uLl07CisyNjMxMiwxLDI2MzExIC0+ICAgICAgICBAfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgICAgICAgICAgICAgQH0KKyAgICAgICAgICAgIDIgLT4gICAgY3JjID0gYzsKKyAgICAgICAgICAgIDIgLT4gICAgcmV0dXJuIGMgXiAweGZmZmZmZmZmTDsKKyAgICAgICAgICAgIDIgLT5AfQorQGVuZCBzbWFsbGV4YW1wbGUKKworSW4gdGhpcyBleGFtcGxlLCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCB0d2ljZSwgcGFzc2luZyBvbmNlIHRocm91Z2gKK2VhY2ggYnJhbmNoIG9mIHRoZSBAY29kZXtpZn0gc3RhdGVtZW50LiAgVGhlIGJvZHkgb2YgdGhlIEBjb2Rle2RvfQorbG9vcCB3YXMgZXhlY3V0ZWQgYSB0b3RhbCBvZiAyNjMxMiB0aW1lcy4gIE5vdGUgaG93IHRoZSBAY29kZXt3aGlsZX0KK3N0YXRlbWVudCBpcyBhbm5vdGF0ZWQuICBJdCBiZWdhbiBleGVjdXRpb24gMjYzMTIgdGltZXMsIG9uY2UgZm9yCitlYWNoIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsb29wLiAgT25lIG9mIHRob3NlIHRpbWVzICh0aGUgbGFzdCB0aW1lKQoraXQgZXhpdGVkLCB3aGlsZSBpdCBicmFuY2hlZCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AgMjYzMTEgdGltZXMuCisKK0Bub2RlIEluYWNjdXJhY3kKK0BjaGFwdGVyIEluYWNjdXJhY3kgb2YgQGNvZGV7Z3Byb2Z9IE91dHB1dAorCitAbWVudQorKiBTYW1wbGluZyBFcnJvcjo6ICAgICAgU3RhdGlzdGljYWwgbWFyZ2lucyBvZiBlcnJvcgorKiBBc3N1bXB0aW9uczo6ICAgICAgICAgRXN0aW1hdGluZyBjaGlsZHJlbiB0aW1lcworQGVuZCBtZW51CisKK0Bub2RlIFNhbXBsaW5nIEVycm9yLEFzc3VtcHRpb25zLCxJbmFjY3VyYWN5CitAc2VjdGlvbiBTdGF0aXN0aWNhbCBTYW1wbGluZyBFcnJvcgorCitUaGUgcnVuLXRpbWUgZmlndXJlcyB0aGF0IEBjb2Rle2dwcm9mfSBnaXZlcyB5b3UgYXJlIGJhc2VkIG9uIGEgc2FtcGxpbmcKK3Byb2Nlc3MsIHNvIHRoZXkgYXJlIHN1YmplY3QgdG8gc3RhdGlzdGljYWwgaW5hY2N1cmFjeS4gIElmIGEgZnVuY3Rpb24gcnVucworb25seSBhIHNtYWxsIGFtb3VudCBvZiB0aW1lLCBzbyB0aGF0IG9uIHRoZSBhdmVyYWdlIHRoZSBzYW1wbGluZyBwcm9jZXNzCitvdWdodCB0byBjYXRjaCB0aGF0IGZ1bmN0aW9uIGluIHRoZSBhY3Qgb25seSBvbmNlLCB0aGVyZSBpcyBhIHByZXR0eSBnb29kCitjaGFuY2UgaXQgd2lsbCBhY3R1YWxseSBmaW5kIHRoYXQgZnVuY3Rpb24gemVybyB0aW1lcywgb3IgdHdpY2UuCisKK0J5IGNvbnRyYXN0LCB0aGUgbnVtYmVyLW9mLWNhbGxzIGFuZCBiYXNpYy1ibG9jayBmaWd1cmVzCithcmUgZGVyaXZlZCBieSBjb3VudGluZywgbm90CitzYW1wbGluZy4gIFRoZXkgYXJlIGNvbXBsZXRlbHkgYWNjdXJhdGUgYW5kIHdpbGwgbm90IHZhcnkgZnJvbSBydW4gdG8gcnVuCitpZiB5b3VyIHByb2dyYW0gaXMgZGV0ZXJtaW5pc3RpYy4KKworVGhlIEBkZm57c2FtcGxpbmcgcGVyaW9kfSB0aGF0IGlzIHByaW50ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmxhdAorcHJvZmlsZSBzYXlzIGhvdyBvZnRlbiBzYW1wbGVzIGFyZSB0YWtlbi4gIFRoZSBydWxlIG9mIHRodW1iIGlzIHRoYXQgYQorcnVuLXRpbWUgZmlndXJlIGlzIGFjY3VyYXRlIGlmIGl0IGlzIGNvbnNpZGVyYWJseSBiaWdnZXIgdGhhbiB0aGUgc2FtcGxpbmcKK3BlcmlvZC4KKworVGhlIGFjdHVhbCBhbW91bnQgb2YgZXJyb3IgY2FuIGJlIHByZWRpY3RlZC4KK0ZvciBAdmFye259IHNhbXBsZXMsIHRoZSBAZW1waHtleHBlY3RlZH0gZXJyb3IKK2lzIHRoZSBzcXVhcmUtcm9vdCBvZiBAdmFye259LiAgRm9yIGV4YW1wbGUsCitpZiB0aGUgc2FtcGxpbmcgcGVyaW9kIGlzIDAuMDEgc2Vjb25kcyBhbmQgQGNvZGV7Zm9vfSdzIHJ1bi10aW1lIGlzIDEgc2Vjb25kLAorQHZhcntufSBpcyAxMDAgc2FtcGxlcyAoMSBzZWNvbmQvMC4wMSBzZWNvbmRzKSwgc3FydChAdmFye259KSBpcyAxMCBzYW1wbGVzLCBzbwordGhlIGV4cGVjdGVkIGVycm9yIGluIEBjb2Rle2Zvb30ncyBydW4tdGltZSBpcyAwLjEgc2Vjb25kcyAoMTAqMC4wMSBzZWNvbmRzKSwKK29yIHRlbiBwZXJjZW50IG9mIHRoZSBvYnNlcnZlZCB2YWx1ZS4KK0FnYWluLCBpZiB0aGUgc2FtcGxpbmcgcGVyaW9kIGlzIDAuMDEgc2Vjb25kcyBhbmQgQGNvZGV7YmFyfSdzIHJ1bi10aW1lIGlzCisxMDAgc2Vjb25kcywgQHZhcntufSBpcyAxMDAwMCBzYW1wbGVzLCBzcXJ0KEB2YXJ7bn0pIGlzIDEwMCBzYW1wbGVzLCBzbwordGhlIGV4cGVjdGVkIGVycm9yIGluIEBjb2Rle2Jhcn0ncyBydW4tdGltZSBpcyAxIHNlY29uZCwKK29yIG9uZSBwZXJjZW50IG9mIHRoZSBvYnNlcnZlZCB2YWx1ZS4KK0l0IGlzIGxpa2VseSB0bwordmFyeSB0aGlzIG11Y2ggQGVtcGh7b24gdGhlIGF2ZXJhZ2V9IGZyb20gb25lIHByb2ZpbGluZyBydW4gdG8gdGhlIG5leHQuCisoQGVtcGh7U29tZXRpbWVzfSBpdCB3aWxsIHZhcnkgbW9yZS4pCisKK1RoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGEgc21hbGwgcnVuLXRpbWUgZmlndXJlIGlzIGRldm9pZCBvZiBpbmZvcm1hdGlvbi4KK0lmIHRoZSBwcm9ncmFtJ3MgQGVtcGh7dG90YWx9IHJ1bi10aW1lIGlzIGxhcmdlLCBhIHNtYWxsIHJ1bi10aW1lIGZvciBvbmUKK2Z1bmN0aW9uIGRvZXMgdGVsbCB5b3UgdGhhdCB0aGF0IGZ1bmN0aW9uIHVzZWQgYW4gaW5zaWduaWZpY2FudCBmcmFjdGlvbiBvZgordGhlIHdob2xlIHByb2dyYW0ncyB0aW1lLiAgVXN1YWxseSB0aGlzIG1lYW5zIGl0IGlzIG5vdCB3b3J0aCBvcHRpbWl6aW5nLgorCitPbmUgd2F5IHRvIGdldCBtb3JlIGFjY3VyYWN5IGlzIHRvIGdpdmUgeW91ciBwcm9ncmFtIG1vcmUgKGJ1dCBzaW1pbGFyKQoraW5wdXQgZGF0YSBzbyBpdCB3aWxsIHRha2UgbG9uZ2VyLiAgQW5vdGhlciB3YXkgaXMgdG8gY29tYmluZSB0aGUgZGF0YSBmcm9tCitzZXZlcmFsIHJ1bnMsIHVzaW5nIHRoZSBAc2FtcHstc30gb3B0aW9uIG9mIEBjb2Rle2dwcm9mfS4gIEhlcmUgaXMgaG93OgorCitAZW51bWVyYXRlCitAaXRlbQorUnVuIHlvdXIgcHJvZ3JhbSBvbmNlLgorCitAaXRlbQorSXNzdWUgdGhlIGNvbW1hbmQgQHNhbXB7bXYgZ21vbi5vdXQgZ21vbi5zdW19LgorCitAaXRlbQorUnVuIHlvdXIgcHJvZ3JhbSBhZ2FpbiwgdGhlIHNhbWUgYXMgYmVmb3JlLgorCitAaXRlbQorTWVyZ2UgdGhlIG5ldyBkYXRhIGluIEBmaWxle2dtb24ub3V0fSBpbnRvIEBmaWxle2dtb24uc3VtfSB3aXRoIHRoaXMgY29tbWFuZDoKKworQGV4YW1wbGUKK2dwcm9mIC1zIEB2YXJ7ZXhlY3V0YWJsZS1maWxlfSBnbW9uLm91dCBnbW9uLnN1bQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitSZXBlYXQgdGhlIGxhc3QgdHdvIHN0ZXBzIGFzIG9mdGVuIGFzIHlvdSB3aXNoLgorCitAaXRlbQorQW5hbHl6ZSB0aGUgY3VtdWxhdGl2ZSBkYXRhIHVzaW5nIHRoaXMgY29tbWFuZDoKKworQGV4YW1wbGUKK2dwcm9mIEB2YXJ7ZXhlY3V0YWJsZS1maWxlfSBnbW9uLnN1bSA+IEB2YXJ7b3V0cHV0LWZpbGV9CitAZW5kIGV4YW1wbGUKK0BlbmQgZW51bWVyYXRlCisKK0Bub2RlIEFzc3VtcHRpb25zLCxTYW1wbGluZyBFcnJvcixJbmFjY3VyYWN5CitAc2VjdGlvbiBFc3RpbWF0aW5nIEBjb2Rle2NoaWxkcmVufSBUaW1lcworCitTb21lIG9mIHRoZSBmaWd1cmVzIGluIHRoZSBjYWxsIGdyYXBoIGFyZSBlc3RpbWF0ZXMtLS1mb3IgZXhhbXBsZSwgdGhlCitAY29kZXtjaGlsZHJlbn0gdGltZSB2YWx1ZXMgYW5kIGFsbCB0aGUgdGhlIHRpbWUgZmlndXJlcyBpbiBjYWxsZXIgYW5kCitzdWJyb3V0aW5lIGxpbmVzLgorCitUaGVyZSBpcyBubyBkaXJlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWVhc3VyZW1lbnRzIGluIHRoZSBwcm9maWxlCitkYXRhIGl0c2VsZi4gIEluc3RlYWQsIEBjb2Rle2dwcm9mfSBlc3RpbWF0ZXMgdGhlbSBieSBtYWtpbmcgYW4gYXNzdW1wdGlvbgorYWJvdXQgeW91ciBwcm9ncmFtIHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIHRydWUuCisKK1RoZSBhc3N1bXB0aW9uIG1hZGUgaXMgdGhhdCB0aGUgYXZlcmFnZSB0aW1lIHNwZW50IGluIGVhY2ggY2FsbCB0byBhbnkKK2Z1bmN0aW9uIEBjb2Rle2Zvb30gaXMgbm90IGNvcnJlbGF0ZWQgd2l0aCB3aG8gY2FsbGVkIEBjb2Rle2Zvb30uICBJZgorQGNvZGV7Zm9vfSB1c2VkIDUgc2Vjb25kcyBpbiBhbGwsIGFuZCAyLzUgb2YgdGhlIGNhbGxzIHRvIEBjb2Rle2Zvb30gY2FtZQorZnJvbSBAY29kZXthfSwgdGhlbiBAY29kZXtmb299IGNvbnRyaWJ1dGVzIDIgc2Vjb25kcyB0byBAY29kZXthfSdzCitAY29kZXtjaGlsZHJlbn0gdGltZSwgYnkgYXNzdW1wdGlvbi4KKworVGhpcyBhc3N1bXB0aW9uIGlzIHVzdWFsbHkgdHJ1ZSBlbm91Z2gsIGJ1dCBmb3Igc29tZSBwcm9ncmFtcyBpdCBpcyBmYXIKK2Zyb20gdHJ1ZS4gIFN1cHBvc2UgdGhhdCBAY29kZXtmb299IHJldHVybnMgdmVyeSBxdWlja2x5IHdoZW4gaXRzIGFyZ3VtZW50CitpcyB6ZXJvOyBzdXBwb3NlIHRoYXQgQGNvZGV7YX0gYWx3YXlzIHBhc3NlcyB6ZXJvIGFzIGFuIGFyZ3VtZW50LCB3aGlsZQorb3RoZXIgY2FsbGVycyBvZiBAY29kZXtmb299IHBhc3Mgb3RoZXIgYXJndW1lbnRzLiAgSW4gdGhpcyBwcm9ncmFtLCBhbGwgdGhlCit0aW1lIHNwZW50IGluIEBjb2Rle2Zvb30gaXMgaW4gdGhlIGNhbGxzIGZyb20gY2FsbGVycyBvdGhlciB0aGFuIEBjb2Rle2F9LgorQnV0IEBjb2Rle2dwcm9mfSBoYXMgbm8gd2F5IG9mIGtub3dpbmcgdGhpczsgaXQgd2lsbCBibGluZGx5IGFuZAoraW5jb3JyZWN0bHkgY2hhcmdlIDIgc2Vjb25kcyBvZiB0aW1lIGluIEBjb2Rle2Zvb30gdG8gdGhlIGNoaWxkcmVuIG9mCitAY29kZXthfS4KKworQGMgRklYTUUgLSBoYXMgdGhpcyBiZWVuIGZpeGVkPworV2UgaG9wZSBzb21lIGRheSB0byBwdXQgbW9yZSBjb21wbGV0ZSBkYXRhIGludG8gQGZpbGV7Z21vbi5vdXR9LCBzbyB0aGF0Cit0aGlzIGFzc3VtcHRpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZCwgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgaG93LiAgRm9yIHRoZQorbm9uY2UsIHRoZSBlc3RpbWF0ZWQgZmlndXJlcyBhcmUgdXN1YWxseSBtb3JlIHVzZWZ1bCB0aGFuIG1pc2xlYWRpbmcuCisKK0Bub2RlIEhvdyBkbyBJPworQGNoYXB0ZXIgQW5zd2VycyB0byBDb21tb24gUXVlc3Rpb25zCisKK0B0YWJsZSBAYXNpcworQGl0ZW0gSG93IGRvIEkgZmluZCB3aGljaCBsaW5lcyBpbiBteSBwcm9ncmFtIHdlcmUgZXhlY3V0ZWQgdGhlIG1vc3QgdGltZXM/CisKK0NvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwgcnVuIGl0LCB0aGVuCit1c2UgdGhlIGZvbGxvd2luZyBwaXBlbGluZToKKworQGV4YW1wbGUKK2dwcm9mIC1sIC1DIEB2YXJ7b2JqZmlsZX0gfCBzb3J0IC1rIDMgLW4gLXIKK0BlbmQgZXhhbXBsZQorCitUaGlzIGxpc3Rpbmcgd2lsbCBzaG93IHlvdSB0aGUgbGluZXMgaW4geW91ciBjb2RlIGV4ZWN1dGVkIG1vc3Qgb2Z0ZW4sCitidXQgbm90IG5lY2Vzc2FyaWx5IHRob3NlIHRoYXQgY29uc3VtZWQgdGhlIG1vc3QgdGltZS4KKworQGl0ZW0gSG93IGRvIEkgZmluZCB3aGljaCBsaW5lcyBpbiBteSBwcm9ncmFtIGNhbGxlZCBhIHBhcnRpY3VsYXIgZnVuY3Rpb24/CisKK1VzZSBAY29kZXtncHJvZiAtbH0gYW5kIGxvb2t1cCB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGguCitUaGUgY2FsbGVycyB3aWxsIGJlIGJyb2tlbiBkb3duIGJ5IGZ1bmN0aW9uIGFuZCBsaW5lIG51bWJlci4KKworQGl0ZW0gSG93IGRvIEkgYW5hbHl6ZSBhIHByb2dyYW0gdGhhdCBydW5zIGZvciBsZXNzIHRoYW4gYSBzZWNvbmQ/CisKK1RyeSB1c2luZyBhIHNoZWxsIHNjcmlwdCBsaWtlIHRoaXMgb25lOgorCitAZXhhbXBsZQorZm9yIGkgaW4gYHNlcSAxIDEwMGA7IGRvCisgIGZhc3Rwcm9nCisgIG12IGdtb24ub3V0IGdtb24ub3V0LiRpCitkb25lCisKK2dwcm9mIC1zIGZhc3Rwcm9nIGdtb24ub3V0LioKKworZ3Byb2YgZmFzdHByb2cgZ21vbi5zdW0KK0BlbmQgZXhhbXBsZQorCitJZiB5b3VyIHByb2dyYW0gaXMgY29tcGxldGVseSBkZXRlcm1pbmlzdGljLCBhbGwgdGhlIGNhbGwgY291bnRzCit3aWxsIGJlIHNpbXBsZSBtdWx0aXBsZXMgb2YgMTAwIChpLmUuIGEgZnVuY3Rpb24gY2FsbGVkIG9uY2UgaW4KK2VhY2ggcnVuIHdpbGwgYXBwZWFyIHdpdGggYSBjYWxsIGNvdW50IG9mIDEwMCkuCisKK0BlbmQgdGFibGUKKworQG5vZGUgSW5jb21wYXRpYmlsaXRpZXMKK0BjaGFwdGVyIEluY29tcGF0aWJpbGl0aWVzIHdpdGggVW5peCBAY29kZXtncHJvZn0KKworQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBCZXJrZWxleSBVbml4IEBjb2Rle2dwcm9mfSB1c2UgdGhlIHNhbWUgZGF0YQorZmlsZSBAZmlsZXtnbW9uLm91dH0sIGFuZCBwcm92aWRlIGVzc2VudGlhbGx5IHRoZSBzYW1lIGluZm9ybWF0aW9uLiAgQnV0Cit0aGVyZSBhcmUgYSBmZXcgZGlmZmVyZW5jZXMuCisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitAc2N7Z251fSBAY29kZXtncHJvZn0gdXNlcyBhIG5ldywgZ2VuZXJhbGl6ZWQgZmlsZSBmb3JtYXQgd2l0aCBzdXBwb3J0Citmb3IgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhbmQgbm9uLXJlYWx0aW1lIGhpc3RvZ3JhbXMuICBBIG1hZ2ljCitjb29raWUgYW5kIHZlcnNpb24gbnVtYmVyIGFsbG93cyBAY29kZXtncHJvZn0gdG8gZWFzaWx5IGlkZW50aWZ5CituZXcgc3R5bGUgZmlsZXMuICBPbGQgQlNELXN0eWxlIGZpbGVzIGNhbiBzdGlsbCBiZSByZWFkLgorQHhyZWZ7RmlsZSBGb3JtYXR9LgorCitAaXRlbQorRm9yIGEgcmVjdXJzaXZlIGZ1bmN0aW9uLCBVbml4IEBjb2Rle2dwcm9mfSBsaXN0cyB0aGUgZnVuY3Rpb24gYXMgYQorcGFyZW50IGFuZCBhcyBhIGNoaWxkLCB3aXRoIGEgQGNvZGV7Y2FsbHN9IGZpZWxkIHRoYXQgbGlzdHMgdGhlIG51bWJlcgorb2YgcmVjdXJzaXZlIGNhbGxzLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IG9taXRzIHRoZXNlIGxpbmVzIGFuZCBwdXRzCit0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpbiB0aGUgcHJpbWFyeSBsaW5lLgorCitAaXRlbQorV2hlbiBhIGZ1bmN0aW9uIGlzIHN1cHByZXNzZWQgZnJvbSB0aGUgY2FsbCBncmFwaCB3aXRoIEBzYW1wey1lfSwgQHNje2dudX0KK0Bjb2Rle2dwcm9mfSBzdGlsbCBsaXN0cyBpdCBhcyBhIHN1YnJvdXRpbmUgb2YgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdC4KKworQGl0ZW0KK0BzY3tnbnV9IEBjb2Rle2dwcm9mfSBhY2NlcHRzIHRoZSBAc2FtcHsta30gd2l0aCBpdHMgYXJndW1lbnQKK2luIHRoZSBmb3JtIEBzYW1we2Zyb20vdG99LCBpbnN0ZWFkIG9mIEBzYW1we2Zyb20gdG99LgorCitAaXRlbQorSW4gdGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZywKK2lmIHRoZXJlIGFyZSBtdWx0aXBsZSBiYXNpYyBibG9ja3Mgb24gdGhlIHNhbWUgbGluZSwKK0BzY3tnbnV9IEBjb2Rle2dwcm9mfSBwcmludHMgYWxsIG9mIHRoZWlyIGNvdW50cywgc2VwZXJhdGVkIGJ5IGNvbW1hcy4KKworQGlnbm9yZSAtIGl0IGRvZXMgdGhpcyBub3cKK0BpdGVtCitUaGUgZnVuY3Rpb24gbmFtZXMgcHJpbnRlZCBpbiBAc2N7Z251fSBAY29kZXtncHJvZn0gb3V0cHV0IGRvIG5vdCBpbmNsdWRlCit0aGUgbGVhZGluZyB1bmRlcnNjb3JlcyB0aGF0IGFyZSBhZGRlZCBpbnRlcm5hbGx5IHRvIHRoZSBmcm9udCBvZiBhbGwKK0MgaWRlbnRpZmllcnMgb24gbWFueSBvcGVyYXRpbmcgc3lzdGVtcy4KK0BlbmQgaWdub3JlCisKK0BpdGVtCitUaGUgYmx1cmJzLCBmaWVsZCB3aWR0aHMsIGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgZGlmZmVyZW50LiAgQHNje2dudX0KK0Bjb2Rle2dwcm9mfSBwcmludHMgYmx1cmJzIGFmdGVyIHRoZSB0YWJsZXMsIHNvIHRoYXQgeW91IGNhbiBzZWUgdGhlCit0YWJsZXMgd2l0aG91dCBza2lwcGluZyB0aGUgYmx1cmJzLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIERldGFpbHMKK0BjaGFwdGVyIERldGFpbHMgb2YgUHJvZmlsaW5nCisKK0BtZW51CisqIEltcGxlbWVudGF0aW9uOjogICAgICBIb3cgYSBwcm9ncmFtIGNvbGxldHMgcHJvZmlsaW5nIGluZm9ybWF0aW9uCisqIEZpbGUgRm9ybWF0OjogICAgICAgICBGb3JtYXQgb2YgQHNhbXB7Z21vbi5vdXR9IGZpbGVzCisqIEludGVybmFsczo6ICAgICAgICAgICBAY29kZXtncHJvZn0ncyBpbnRlcm5hbCBvcGVyYXRpb24KKyogRGVidWdnaW5nOjogICAgICAgICAgIFVzaW5nIEBjb2Rle2dwcm9mfSdzIEBzYW1wey1kfSBvcHRpb24KK0BlbmQgbWVudQorCitAbm9kZSBJbXBsZW1lbnRhdGlvbixGaWxlIEZvcm1hdCwsRGV0YWlscworQHNlY3Rpb24gSW1wbGVtZW50YXRpb24gb2YgUHJvZmlsaW5nCisKK1Byb2ZpbGluZyB3b3JrcyBieSBjaGFuZ2luZyBob3cgZXZlcnkgZnVuY3Rpb24gaW4geW91ciBwcm9ncmFtIGlzIGNvbXBpbGVkCitzbyB0aGF0IHdoZW4gaXQgaXMgY2FsbGVkLCBpdCB3aWxsIHN0YXNoIGF3YXkgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZQoraXQgd2FzIGNhbGxlZCBmcm9tLiAgRnJvbSB0aGlzLCB0aGUgcHJvZmlsZXIgY2FuIGZpZ3VyZSBvdXQgd2hhdCBmdW5jdGlvbgorY2FsbGVkIGl0LCBhbmQgY2FuIGNvdW50IGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQuICBUaGlzIGNoYW5nZSBpcyBtYWRlCitieSB0aGUgY29tcGlsZXIgd2hlbiB5b3VyIHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCB0aGUgQHNhbXB7LXBnfSBvcHRpb24sCit3aGljaCBjYXVzZXMgZXZlcnkgZnVuY3Rpb24gdG8gY2FsbCBAY29kZXttY291bnR9Cisob3IgQGNvZGV7X21jb3VudH0sIG9yIEBjb2Rle19fbWNvdW50fSwgZGVwZW5kaW5nIG9uIHRoZSBPUyBhbmQgY29tcGlsZXIpCithcyBvbmUgb2YgaXRzIGZpcnN0IG9wZXJhdGlvbnMuCisKK1RoZSBAY29kZXttY291bnR9IHJvdXRpbmUsIGluY2x1ZGVkIGluIHRoZSBwcm9maWxpbmcgbGlicmFyeSwKK2lzIHJlc3BvbnNpYmxlIGZvciByZWNvcmRpbmcgaW4gYW4gaW4tbWVtb3J5IGNhbGwgZ3JhcGggdGFibGUKK2JvdGggaXRzIHBhcmVudCByb3V0aW5lICh0aGUgY2hpbGQpIGFuZCBpdHMgcGFyZW50J3MgcGFyZW50LiAgVGhpcyBpcwordHlwaWNhbGx5IGRvbmUgYnkgZXhhbWluaW5nIHRoZSBzdGFjayBmcmFtZSB0byBmaW5kIGJvdGgKK3RoZSBhZGRyZXNzIG9mIHRoZSBjaGlsZCwgYW5kIHRoZSByZXR1cm4gYWRkcmVzcyBpbiB0aGUgb3JpZ2luYWwgcGFyZW50LgorU2luY2UgdGhpcyBpcyBhIHZlcnkgbWFjaGluZS1kZXBlbmRhbnQgb3BlcmF0aW9uLCBAY29kZXttY291bnR9CitpdHNlbGYgaXMgdHlwaWNhbGx5IGEgc2hvcnQgYXNzZW1ibHktbGFuZ3VhZ2Ugc3R1YiByb3V0aW5lCit0aGF0IGV4dHJhY3RzIHRoZSByZXF1aXJlZAoraW5mb3JtYXRpb24sIGFuZCB0aGVuIGNhbGxzIEBjb2Rle19fbWNvdW50X2ludGVybmFsfQorKGEgbm9ybWFsIEMgZnVuY3Rpb24pIHdpdGggdHdvIGFyZ3VtZW50cyAtIEBjb2Rle2Zyb21wY30gYW5kIEBjb2Rle3NlbGZwY30uCitAY29kZXtfX21jb3VudF9pbnRlcm5hbH0gaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nCit0aGUgaW4tbWVtb3J5IGNhbGwgZ3JhcGgsIHdoaWNoIHJlY29yZHMgQGNvZGV7ZnJvbXBjfSwgQGNvZGV7c2VsZnBjfSwKK2FuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggb2YgdGhlc2UgY2FsbCBhcmNzIHdhcyB0cmFuc3ZlcnNlZC4KKworR0NDIFZlcnNpb24gMiBwcm92aWRlcyBhIG1hZ2ljYWwgZnVuY3Rpb24gKEBjb2Rle19fYnVpbHRpbl9yZXR1cm5fYWRkcmVzc30pLAord2hpY2ggYWxsb3dzIGEgZ2VuZXJpYyBAY29kZXttY291bnR9IGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlCityZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFjayBmcmFtZS4gIEhvd2V2ZXIsIG9uIHNvbWUKK2FyY2hpdGVjdHVyZXMsIG1vc3Qgbm90YWJseSB0aGUgU1BBUkMsIHVzaW5nIHRoaXMgYnVpbHRpbiBjYW4gYmUKK3ZlcnkgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSwgYW5kIGFuIGFzc2VtYmx5IGxhbmd1YWdlIHZlcnNpb24KK29mIEBjb2Rle21jb3VudH0gaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKworTnVtYmVyLW9mLWNhbGxzIGluZm9ybWF0aW9uIGZvciBsaWJyYXJ5IHJvdXRpbmVzIGlzIGNvbGxlY3RlZCBieSB1c2luZyBhCitzcGVjaWFsIHZlcnNpb24gb2YgdGhlIEMgbGlicmFyeS4gIFRoZSBwcm9ncmFtcyBpbiBpdCBhcmUgdGhlIHNhbWUgYXMgaW4KK3RoZSB1c3VhbCBDIGxpYnJhcnksIGJ1dCB0aGV5IHdlcmUgY29tcGlsZWQgd2l0aCBAc2FtcHstcGd9LiAgSWYgeW91CitsaW5rIHlvdXIgcHJvZ3JhbSB3aXRoIEBzYW1we2djYyBAZG90c3t9IC1wZ30sIGl0IGF1dG9tYXRpY2FsbHkgdXNlcyB0aGUKK3Byb2ZpbGluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorCitQcm9maWxpbmcgYWxzbyBpbnZvbHZlcyB3YXRjaGluZyB5b3VyIHByb2dyYW0gYXMgaXQgcnVucywgYW5kIGtlZXBpbmcgYQoraGlzdG9ncmFtIG9mIHdoZXJlIHRoZSBwcm9ncmFtIGNvdW50ZXIgaGFwcGVucyB0byBiZSBldmVyeSBub3cgYW5kIHRoZW4uCitUeXBpY2FsbHkgdGhlIHByb2dyYW0gY291bnRlciBpcyBsb29rZWQgYXQgYXJvdW5kIDEwMCB0aW1lcyBwZXIgc2Vjb25kIG9mCitydW4gdGltZSwgYnV0IHRoZSBleGFjdCBmcmVxdWVuY3kgbWF5IHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLgorCitUaGlzIGlzIGRvbmUgaXMgb25lIG9mIHR3byB3YXlzLiAgTW9zdCBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMKK3Byb3ZpZGUgYSBAY29kZXtwcm9maWwoKX0gc3lzdGVtIGNhbGwsIHdoaWNoIHJlZ2lzdGVycyBhIG1lbW9yeQorYXJyYXkgd2l0aCB0aGUga2VybmVsLCBhbG9uZyB3aXRoIGEgc2NhbGUKK2ZhY3RvciB0aGF0IGRldGVybWluZXMgaG93IHRoZSBwcm9ncmFtJ3MgYWRkcmVzcyBzcGFjZSBtYXBzCitpbnRvIHRoZSBhcnJheS4KK1R5cGljYWwgc2NhbGluZyB2YWx1ZXMgY2F1c2UgZXZlcnkgMiB0byA4IGJ5dGVzIG9mIGFkZHJlc3Mgc3BhY2UKK3RvIG1hcCBpbnRvIGEgc2luZ2xlIGFycmF5IHNsb3QuCitPbiBldmVyeSB0aWNrIG9mIHRoZSBzeXN0ZW0gY2xvY2sKKyhhc3N1bWluZyB0aGUgcHJvZmlsZWQgcHJvZ3JhbSBpcyBydW5uaW5nKSwgdGhlIHZhbHVlIG9mIHRoZQorcHJvZ3JhbSBjb3VudGVyIGlzIGV4YW1pbmVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzbG90IGluCit0aGUgbWVtb3J5IGFycmF5IGlzIGluY3JlbWVudGVkLiAgU2luY2UgdGhpcyBpcyBkb25lIGluIHRoZSBrZXJuZWwsCit3aGljaCBoYWQgdG8gaW50ZXJydXB0IHRoZSBwcm9jZXNzIGFueXdheSB0byBoYW5kbGUgdGhlIGNsb2NrCitpbnRlcnJ1cHQsIHZlcnkgbGl0dGxlIGFkZGl0aW9uYWwgc3lzdGVtIG92ZXJoZWFkIGlzIHJlcXVpcmVkLgorCitIb3dldmVyLCBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBtb3N0IG5vdGFibHkgTGludXggMi4wIChhbmQgZWFybGllciksCitkbyBub3QgcHJvdmlkZSBhIEBjb2Rle3Byb2ZpbCgpfSBzeXN0ZW0gY2FsbC4gIE9uIHN1Y2ggYSBzeXN0ZW0sCithcnJhbmdlbWVudHMgYXJlIG1hZGUgZm9yIHRoZSBrZXJuZWwgdG8gcGVyaW9kaWNhbGx5IGRlbGl2ZXIKK2Egc2lnbmFsIHRvIHRoZSBwcm9jZXNzICh0eXBpY2FsbHkgdmlhIEBjb2Rle3NldGl0aW1lcigpfSksCit3aGljaCB0aGVuIHBlcmZvcm1zIHRoZSBzYW1lIG9wZXJhdGlvbiBvZiBleGFtaW5pbmcgdGhlCitwcm9ncmFtIGNvdW50ZXIgYW5kIGluY3JlbWVudGluZyBhIHNsb3QgaW4gdGhlIG1lbW9yeSBhcnJheS4KK1NpbmNlIHRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZCB0bwordXNlciBzcGFjZSBldmVyeSB0aW1lIGEgc2FtcGxlIGlzIHRha2VuLCBpdCB1c2VzIGNvbnNpZGVyYWJseQorbW9yZSBvdmVyaGVhZCB0aGFuIGtlcm5lbC1iYXNlZCBwcm9maWxpbmcuICBBbHNvLCBkdWUgdG8gdGhlCithZGRlZCBkZWxheSByZXF1aXJlZCB0byBkZWxpdmVyIHRoZSBzaWduYWwsIHRoaXMgbWV0aG9kIGlzCitsZXNzIGFjY3VyYXRlIGFzIHdlbGwuCisKK0Egc3BlY2lhbCBzdGFydHVwIHJvdXRpbmUgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGhpc3RvZ3JhbSBhbmQgCitlaXRoZXIgY2FsbHMgQGNvZGV7cHJvZmlsKCl9IG9yIHNldHMgdXAKK2EgY2xvY2sgc2lnbmFsIGhhbmRsZXIuCitUaGlzIHJvdXRpbmUgKEBjb2Rle21vbnN0YXJ0dXB9KSBjYW4gYmUgaW52b2tlZCBpbiBzZXZlcmFsIHdheXMuCitPbiBMaW51eCBzeXN0ZW1zLCBhIHNwZWNpYWwgcHJvZmlsaW5nIHN0YXJ0dXAgZmlsZSBAY29kZXtnY3J0MC5vfSwKK3doaWNoIGludm9rZXMgQGNvZGV7bW9uc3RhcnR1cH0gYmVmb3JlIEBjb2Rle21haW59LAoraXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEBjb2Rle2NydDAub30uCitVc2Ugb2YgdGhpcyBzcGVjaWFsIHN0YXJ0dXAgZmlsZSBpcyBvbmUgb2YgdGhlIGVmZmVjdHMKK29mIHVzaW5nIEBzYW1we2djYyBAZG90c3t9IC1wZ30gdG8gbGluay4KK09uIFNQQVJDIHN5c3RlbXMsIG5vIHNwZWNpYWwgc3RhcnR1cCBmaWxlcyBhcmUgdXNlZC4KK1JhdGhlciwgdGhlIEBjb2Rle21jb3VudH0gcm91dGluZSwgd2hlbiBpdCBpcyBpbnZva2VkIGZvcgordGhlIGZpcnN0IHRpbWUgKHR5cGljYWxseSB3aGVuIEBjb2Rle21haW59IGlzIGNhbGxlZCksCitjYWxscyBAY29kZXttb25zdGFydHVwfS4KKworSWYgdGhlIGNvbXBpbGVyJ3MgQHNhbXB7LWF9IG9wdGlvbiB3YXMgdXNlZCwgYmFzaWMtYmxvY2sgY291bnRpbmcKK2lzIGFsc28gZW5hYmxlZC4gIEVhY2ggb2JqZWN0IGZpbGUgaXMgdGhlbiBjb21waWxlZCB3aXRoIGEgc3RhdGljIGFycmF5CitvZiBjb3VudHMsIGluaXRpYWxseSB6ZXJvLgorSW4gdGhlIGV4ZWN1dGFibGUgY29kZSwgZXZlcnkgdGltZSBhIG5ldyBiYXNpYy1ibG9jayBiZWdpbnMKKyhpLmUuIHdoZW4gYW4gQGNvZGV7aWZ9IHN0YXRlbWVudCBhcHBlYXJzKSwgYW4gZXh0cmEgaW5zdHJ1Y3Rpb24KK2lzIGluc2VydGVkIHRvIGluY3JlbWVudCB0aGUgY29ycmVzcG9uZGluZyBjb3VudCBpbiB0aGUgYXJyYXkuCitBdCBjb21waWxlIHRpbWUsIGEgcGFpcmVkIGFycmF5IHdhcyBjb25zdHJ1Y3RlZCB0aGF0IHJlY29yZGVkCit0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBlYWNoIGJhc2ljLWJsb2NrLiAgVGFrZW4gdG9nZXRoZXIsCit0aGUgdHdvIGFycmF5cyByZWNvcmQgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZXZlcnkgYmFzaWMtYmxvY2ssCithbG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGV4ZWN1dGVkLgorCitUaGUgcHJvZmlsaW5nIGxpYnJhcnkgYWxzbyBpbmNsdWRlcyBhIGZ1bmN0aW9uIChAY29kZXttY2xlYW51cH0pIHdoaWNoIGlzCit0eXBpY2FsbHkgcmVnaXN0ZXJlZCB1c2luZyBAY29kZXthdGV4aXQoKX0gdG8gYmUgY2FsbGVkIGFzIHRoZQorcHJvZ3JhbSBleGl0cywgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIHRoZSBmaWxlIEBmaWxle2dtb24ub3V0fS4KK1Byb2ZpbGluZyBpcyB0dXJuZWQgb2ZmLCB2YXJpb3VzIGhlYWRlcnMgYXJlIG91dHB1dCwgYW5kIHRoZSBoaXN0b2dyYW0KK2lzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBjYWxsLWdyYXBoIGFyY3MgYW5kIHRoZSBiYXNpYy1ibG9jayBjb3VudHMuCisKK1RoZSBvdXRwdXQgZnJvbSBAY29kZXtncHJvZn0gZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiBwYXJ0cyBvZiB5b3VyIHByb2dyYW0gdGhhdAorYXJlIGxpbWl0ZWQgYnkgSS9PIG9yIHN3YXBwaW5nIGJhbmR3aWR0aC4gIFRoaXMgaXMgYmVjYXVzZSBzYW1wbGVzIG9mIHRoZQorcHJvZ3JhbSBjb3VudGVyIGFyZSB0YWtlbiBhdCBmaXhlZCBpbnRlcnZhbHMgb2YgdGhlIHByb2dyYW0ncyBydW4gdGltZS4KK1RoZXJlZm9yZSwgdGhlCit0aW1lIG1lYXN1cmVtZW50cyBpbiBAY29kZXtncHJvZn0gb3V0cHV0IHNheSBub3RoaW5nIGFib3V0IHRpbWUgdGhhdCB5b3VyCitwcm9ncmFtIHdhcyBub3QgcnVubmluZy4gIEZvciBleGFtcGxlLCBhIHBhcnQgb2YgdGhlIHByb2dyYW0gdGhhdCBjcmVhdGVzCitzbyBtdWNoIGRhdGEgdGhhdCBpdCBjYW5ub3QgYWxsIGZpdCBpbiBwaHlzaWNhbCBtZW1vcnkgYXQgb25jZSBtYXkgcnVuIHZlcnkKK3Nsb3dseSBkdWUgdG8gdGhyYXNoaW5nLCBidXQgQGNvZGV7Z3Byb2Z9IHdpbGwgc2F5IGl0IHVzZXMgbGl0dGxlIHRpbWUuICBPbgordGhlIG90aGVyIGhhbmQsIHNhbXBsaW5nIGJ5IHJ1biB0aW1lIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGFtb3VudCBvZgorbG9hZCBkdWUgdG8gb3RoZXIgdXNlcnMgd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZSBvdXRwdXQgeW91IGdldC4KKworQG5vZGUgRmlsZSBGb3JtYXQsSW50ZXJuYWxzLEltcGxlbWVudGF0aW9uLERldGFpbHMKK0BzZWN0aW9uIFByb2ZpbGluZyBEYXRhIEZpbGUgRm9ybWF0CisKK1RoZSBvbGQgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQgdXNlZCBmb3IgcHJvZmlsZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYQorbWFnaWMgY29va2llIHRoYXQgYWxsb3dzIHRvIGNoZWNrIHdoZXRoZXIgYSBkYXRhIGZpbGUgcmVhbGx5IGlzIGEKK2dwcm9mIGZpbGUuICBGdXJ0aGVybW9yZSwgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHZlcnNpb24gbnVtYmVyLCB0aHVzCityZW5kZXJpbmcgY2hhbmdlcyB0byB0aGUgZmlsZSBmb3JtYXQgYWxtb3N0IGltcG9zc2libGUuICBAc2N7Z251fSBAY29kZXtncHJvZn0KK3VzZXMgYSBuZXcgZmlsZSBmb3JtYXQgdGhhdCBwcm92aWRlcyB0aGVzZSBmZWF0dXJlcy4gIEZvciBiYWNrd2FyZAorY29tcGF0aWJpbGl0eSwgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGNvbnRpbnVlcyB0byBzdXBwb3J0IHRoZSBvbGQgQlNELWRlcml2ZWQKK2Zvcm1hdCwgYnV0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCB3aXRoIGl0LiAgRm9yIGV4YW1wbGUsCitiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGNhbm5vdCBiZSBhY2NvbW1vZGF0ZWQgYnkgdGhlIG9sZCBmaWxlCitmb3JtYXQuCisKK1RoZSBuZXcgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSBAZmlsZXtnbW9uX291dC5ofS4gIEl0Citjb25zaXN0cyBvZiBhIGhlYWRlciBjb250YWluaW5nIHRoZSBtYWdpYyBjb29raWUgYW5kIGEgdmVyc2lvbiBudW1iZXIsCithcyB3ZWxsIGFzIHNvbWUgc3BhcmUgYnl0ZXMgYXZhaWxhYmxlIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gIEFsbCBkYXRhCitpbiBhIHByb2ZpbGUgZGF0YSBmaWxlIGlzIGluIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBob3N0IG9uIHdoaWNoCit0aGUgcHJvZmlsZSB3YXMgY29sbGVjdGVkLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFkYXB0cyBhdXRvbWF0aWNhbGx5IHRvIHRoZQorYnl0ZS1vcmRlciBpbiB1c2UuCisKK0luIHRoZSBuZXcgZmlsZSBmb3JtYXQsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgorcmVjb3Jkcy4gIEN1cnJlbnRseSwgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IGhpc3RvZ3JhbQorcmVjb3JkcywgY2FsbC1ncmFwaCBhcmMgcmVjb3JkcywgYW5kIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudAorcmVjb3Jkcy4gIEVhY2ggZmlsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGVhY2ggcmVjb3JkIHR5cGUuICBXaGVuCityZWFkaW5nIGEgZmlsZSwgQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHdpbGwgZW5zdXJlIHJlY29yZHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKK2NvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGFuZCBjb21wdXRlIHRoZSB1bmlvbiBvZiBhbGwgcmVjb3Jkcy4gIEZvcgorZXhhbXBsZSwgZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1bmlvbiBpcyBzaW1wbHkgdGhlIHN1bQorb2YgYWxsIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggYmFzaWMtYmxvY2suCisKK0BzdWJzZWN0aW9uIEhpc3RvZ3JhbSBSZWNvcmRzCisKK0hpc3RvZ3JhbSByZWNvcmRzIGNvbnNpc3Qgb2YgYSBoZWFkZXIgdGhhdCBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZgorYmlucy4gIFRoZSBoZWFkZXIgY29udGFpbnMgdGhlIHRleHQtc2VnbWVudCByYW5nZSB0aGF0IHRoZSBoaXN0b2dyYW0KK3NwYW5zLCB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGluIGJ5dGVzICh1bmxpa2UgaW4gdGhlIG9sZCBCU0QKK2Zvcm1hdCwgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIpLCB0aGUgcmF0ZSBvZiB0aGUKK3Byb2ZpbGluZyBjbG9jaywgYW5kIHRoZSBwaHlzaWNhbCBkaW1lbnNpb24gdGhhdCB0aGUgYmluIGNvdW50cworcmVwcmVzZW50IGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGUgcHJvZmlsaW5nIGNsb2NrIHJhdGUuICBUaGUKK3BoeXNpY2FsIGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdHdvIHBhcnRzOiBhIGxvbmcgbmFtZSBvZiB1cCB0byAxNQorY2hhcmFjdGVycyBhbmQgYSBzaW5nbGUgY2hhcmFjdGVyIGFiYnJldmlhdGlvbi4gIEZvciBleGFtcGxlLCBhCitoaXN0b2dyYW0gcmVwcmVzZW50aW5nIHJlYWwtdGltZSB3b3VsZCBzcGVjaWZ5IHRoZSBsb25nIG5hbWUgYXMKKyJzZWNvbmRzIiBhbmQgdGhlIGFiYnJldmlhdGlvbiBhcyAicyIuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvcgorYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgcGVyZm9ybWFuY2UgbW9uaXRvciBoYXJkd2FyZSAod2hpY2gsCitmb3J0dW5hdGVseSwgaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IGNvbW1vbikuICBGb3IgZXhhbXBsZSwgdW5kZXIgREVDCitPU0YvMSwgdGhlICJ1cHJvZmlsZSIgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgaGlzdG9ncmFtIG9mLAorc2F5LCBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMuICBJbiB0aGlzIGNhc2UsIHRoZSBkaW1lbnNpb24gaW4gdGhlCitoaXN0b2dyYW0gaGVhZGVyIGNvdWxkIGJlIHNldCB0byAiaS1jYWNoZSBtaXNzZXMiIGFuZCB0aGUgYWJicmV2aWF0aW9uCitjb3VsZCBiZSBzZXQgdG8gIjEiIChiZWNhdXNlIGl0IGlzIHNpbXBseSBhIGNvdW50LCBub3QgYSBwaHlzaWNhbAorZGltZW5zaW9uKS4gIEFsc28sIHRoZSBwcm9maWxpbmcgcmF0ZSB3b3VsZCBoYXZlIHRvIGJlIHNldCB0byAxIGluCit0aGlzIGNhc2UuCisKK0hpc3RvZ3JhbSBiaW5zIGFyZSAxNi1iaXQgbnVtYmVycyBhbmQgZWFjaCBiaW4gcmVwcmVzZW50IGFuIGVxdWFsCithbW91bnQgb2YgdGV4dC1zcGFjZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGV4dC1zZWdtZW50IGlzIG9uZQordGhvdXNhbmQgYnl0ZXMgbG9uZyBhbmQgaWYgdGhlcmUgYXJlIHRlbiBiaW5zIGluIHRoZSBoaXN0b2dyYW0sIGVhY2gKK2JpbiByZXByZXNlbnRzIG9uZSBodW5kcmVkIGJ5dGVzLgorCisKK0BzdWJzZWN0aW9uIENhbGwtR3JhcGggUmVjb3JkcworCitDYWxsLWdyYXBoIHJlY29yZHMgaGF2ZSBhIGZvcm1hdCB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHVzZWQgaW4KK3RoZSBCU0QtZGVyaXZlZCBmaWxlIGZvcm1hdC4gIEl0IGNvbnNpc3RzIG9mIGFuIGFyYyBpbiB0aGUgY2FsbCBncmFwaAorYW5kIGEgY291bnQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhcmMgd2FzIHRyYXZlcnNlZAorZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgQXJjcyBhcmUgc3BlY2lmaWVkIGJ5IGEgcGFpciBvZiBhZGRyZXNzZXM6Cit0aGUgZmlyc3QgbXVzdCBiZSB3aXRoaW4gY2FsbGVyJ3MgZnVuY3Rpb24gYW5kIHRoZSBzZWNvbmQgbXVzdCBiZQord2l0aGluIHRoZSBjYWxsZWUncyBmdW5jdGlvbi4gIFdoZW4gcGVyZm9ybWluZyBwcm9maWxpbmcgYXQgdGhlCitmdW5jdGlvbiBsZXZlbCwgdGhlc2UgYWRkcmVzc2VzIGNhbiBwb2ludCBhbnl3aGVyZSB3aXRoaW4gdGhlCityZXNwZWN0aXZlIGZ1bmN0aW9uLiAgSG93ZXZlciwgd2hlbiBwcm9maWxpbmcgYXQgdGhlIGxpbmUtbGV2ZWwsIGl0IGlzCitiZXR0ZXIgaWYgdGhlIGFkZHJlc3NlcyBhcmUgYXMgY2xvc2UgdG8gdGhlIGNhbGwtc2l0ZS9lbnRyeS1wb2ludCBhcworcG9zc2libGUuICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGxpbmUtbGV2ZWwgY2FsbC1ncmFwaCBpcyBhYmxlIHRvCitpZGVudGlmeSBleGFjdGx5IHdoaWNoIGxpbmUgb2Ygc291cmNlIGNvZGUgcGVyZm9ybWVkIGNhbGxzIHRvIGEKK2Z1bmN0aW9uLgorCitAc3Vic2VjdGlvbiBCYXNpYy1CbG9jayBFeGVjdXRpb24gQ291bnQgUmVjb3JkcworCitCYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQgcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IGEKK3NlcXVlbmNlIG9mIGFkZHJlc3MvY291bnQgcGFpcnMuICBUaGUgaGVhZGVyIHNpbXBseSBzcGVjaWZpZXMgdGhlCitsZW5ndGggb2YgdGhlIHNlcXVlbmNlLiAgSW4gYW4gYWRkcmVzcy9jb3VudCBwYWlyLCB0aGUgYWRkcmVzcworaWRlbnRpZmllcyBhIGJhc2ljLWJsb2NrIGFuZCB0aGUgY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMKK3RoYXQgYmFzaWMtYmxvY2sgd2FzIGV4ZWN1dGVkLiAgQW55IGFkZHJlc3Mgd2l0aGluIHRoZSBiYXNpYy1hZGRyZXNzIGNhbgorYmUgdXNlZC4KKworQG5vZGUgSW50ZXJuYWxzLERlYnVnZ2luZyxGaWxlIEZvcm1hdCxEZXRhaWxzCitAc2VjdGlvbiBAY29kZXtncHJvZn0ncyBJbnRlcm5hbCBPcGVyYXRpb24KKworTGlrZSBtb3N0IHByb2dyYW1zLCBAY29kZXtncHJvZn0gYmVnaW5zIGJ5IHByb2Nlc3NpbmcgaXRzIG9wdGlvbnMuCitEdXJpbmcgdGhpcyBzdGFnZSwgaXQgbWF5IGJ1aWxkaW5nIGl0cyBzeW1zcGVjIGxpc3QKKyhAY29kZXtzeW1faWRzLmM6c3ltX2lkX2FkZH0pLCBpZgorb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHdoaWNoIHVzZSBzeW1zcGVjcy4KK0Bjb2Rle2dwcm9mfSBtYWludGFpbnMgYSBzaW5nbGUgbGlua2VkIGxpc3Qgb2Ygc3ltc3BlY3MsCit3aGljaCB3aWxsIGV2ZW50dWFsbHkgZ2V0IHR1cm5lZCBpbnRvIDEyIHN5bWJvbCB0YWJsZXMsCitvcmdhbml6ZWQgaW50byBzaXggaW5jbHVkZS9leGNsdWRlIHBhaXJzIC0gb25lCitwYWlyIGVhY2ggZm9yIHRoZSBmbGF0IHByb2ZpbGUgKElOQ0xfRkxBVC9FWENMX0ZMQVQpLAordGhlIGNhbGwgZ3JhcGggYXJjcyAoSU5DTF9BUkNTL0VYQ0xfQVJDUyksCitwcmludGluZyBpbiB0aGUgY2FsbCBncmFwaCAoSU5DTF9HUkFQSC9FWENMX0dSQVBIKSwKK3RpbWluZyBwcm9wYWdhdGlvbiBpbiB0aGUgY2FsbCBncmFwaCAoSU5DTF9USU1FL0VYQ0xfVElNRSksCit0aGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIChJTkNMX0FOTk8vRVhDTF9BTk5PKSwKK2FuZCB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcgKElOQ0xfRVhFQy9FWENMX0VYRUMpLgorCitBZnRlciBvcHRpb24gcHJvY2Vzc2luZywgQGNvZGV7Z3Byb2Z9IGZpbmlzaGVzCitidWlsZGluZyB0aGUgc3ltc3BlYyBsaXN0IGJ5IGFkZGluZyBhbGwgdGhlIHN5bXNwZWNzIGluCitAY29kZXtkZWZhdWx0X2V4Y2x1ZGVkX2xpc3R9IHRvIHRoZSBleGNsdWRlIGxpc3RzCitFWENMX1RJTUUgYW5kIEVYQ0xfR1JBUEgsIGFuZCBpZiBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGlzIHNwZWNpZmllZCwKK0VYQ0xfRkxBVCBhcyB3ZWxsLgorVGhlc2UgZGVmYXVsdCBleGNsdWRlcyBhcmUgbm90IGFkZGVkIHRvIEVYQ0xfQU5OTywgRVhDTF9BUkNTLCBhbmQgRVhDTF9FWEVDLgorCitOZXh0LCB0aGUgQkZEIGxpYnJhcnkgaXMgY2FsbGVkIHRvIG9wZW4gdGhlIG9iamVjdCBmaWxlLAordmVyaWZ5IHRoYXQgaXQgaXMgYW4gb2JqZWN0IGZpbGUsCithbmQgcmVhZCBpdHMgc3ltYm9sIHRhYmxlIChAY29kZXtjb3JlLmM6Y29yZV9pbml0fSksCit1c2luZyBAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0gYWZ0ZXIgbWFsbG9jaW5nCithbiBhcHByb3BpYXRlIHNpemVkIGFycmF5IG9mIGFzeW1ib2xzLiAgQXQgdGhpcyBwb2ludCwKK2Z1bmN0aW9uIG1hcHBpbmdzIGFyZSByZWFkIChpZiB0aGUgQHNhbXB7LS1maWxlLW9yZGVyaW5nfSBvcHRpb24KK2hhcyBiZWVuIHNwZWNpZmllZCksIGFuZCB0aGUgY29yZSB0ZXh0IHNwYWNlIGlzIHJlYWQgaW50bworbWVtb3J5IChpZiB0aGUgQHNhbXB7LWN9IG9wdGlvbiB3YXMgZ2l2ZW4pLgorCitAY29kZXtncHJvZn0ncyBvd24gc3ltYm9sIHRhYmxlLCBhbiBhcnJheSBvZiBTeW0gc3RydWN0dXJlcywKK2lzIG5vdyBidWlsdC4KK1RoaXMgaXMgZG9uZSBpbiBvbmUgb2YgdHdvIHdheXMsIGJ5IG9uZSBvZiB0d28gcm91dGluZXMsIGRlcGVuZGluZworb24gd2hldGhlciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIChAc2FtcHstbH0gb3B0aW9uKSBoYXMgYmVlbgorZW5hYmxlZC4KK0ZvciBub3JtYWwgcHJvZmlsaW5nLCB0aGUgQkZEIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUgaXMgc2Nhbm5lZC4KK0ZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBldmVyeQordGV4dCBzcGFjZSBhZGRyZXNzIGlzIGV4YW1pbmVkLCBhbmQgYSBuZXcgc3ltYm9sIHRhYmxlIGVudHJ5CitnZXRzIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGUgbGluZSBudW1iZXIgY2hhbmdlcy4KK0luIGVpdGhlciBjYXNlLCB0d28gcGFzc2VzIGFyZSBtYWRlIHRocm91Z2ggdGhlIHN5bWJvbAordGFibGUgLSBvbmUgdG8gY291bnQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0YWJsZSByZXF1aXJlZCwKK2FuZCB0aGUgb3RoZXIgdG8gYWN0dWFsbHkgcmVhZCB0aGUgc3ltYm9scy4gIEluIGJldHdlZW4gdGhlCit0d28gcGFzc2VzLCBhIHNpbmdsZSBhcnJheSBvZiB0eXBlIEBjb2Rle1N5bX0gaXMgY3JlYXRlZCBvZgordGhlIGFwcHJvcGlhdGUgbGVuZ3RoLgorRmluYWxseSwgQGNvZGV7c3ltdGFiLmM6c3ltdGFiX2ZpbmFsaXplfQoraXMgY2FsbGVkIHRvIHNvcnQgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzCisoZW50cmllcyB3aXRoIHRoZSBzYW1lIG1lbW9yeSBhZGRyZXNzKS4KKworVGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIGEgY29udGlndW91cyBhcnJheSBmb3IgdHdvIHJlYXNvbnMuCitGaXJzdCwgdGhlIEBjb2Rle3Fzb3J0fSBsaWJyYXJ5IGZ1bmN0aW9uICh3aGljaCBzb3J0cyBhbiBhcnJheSkKK3dpbGwgYmUgdXNlZCB0byBzb3J0IHRoZSBzeW1ib2wgdGFibGUuCitBbHNvLCB0aGUgc3ltYm9sIGxvb2t1cCByb3V0aW5lIChAY29kZXtzeW10YWIuYzpzeW1fbG9va3VwfSksCit3aGljaCBmaW5kcyBzeW1ib2xzCitiYXNlZCBvbiBtZW1vcnkgYWRkcmVzcywgdXNlcyBhIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtCit3aGljaCByZXF1aXJlcyB0aGUgc3ltYm9sIHRhYmxlIHRvIGJlIGEgc29ydGVkIGFycmF5LgorRnVuY3Rpb24gc3ltYm9scyBhcmUgaW5kaWNhdGVkIHdpdGggYW4gQGNvZGV7aXNfZnVuY30gZmxhZy4KK0xpbmUgbnVtYmVyIHN5bWJvbHMgaGF2ZSBubyBzcGVjaWFsIGZsYWdzIHNldC4KK0FkZGl0aW9uYWxseSwgYSBzeW1ib2wgY2FuIGhhdmUgYW4gQGNvZGV7aXNfc3RhdGljfSBmbGFnCit0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgbG9jYWwgc3ltYm9sLgorCitXaXRoIHRoZSBzeW1ib2wgdGFibGUgcmVhZCwgdGhlIHN5bXNwZWNzIGNhbiBub3cgYmUgdHJhbnNsYXRlZAoraW50byBTeW1zIChAY29kZXtzeW1faWRzLmM6c3ltX2lkX3BhcnNlfSkuICBSZW1lbWJlciB0aGF0IGEgc2luZ2xlCitzeW1zcGVjIGNhbiBtYXRjaCBtdWx0aXBsZSBzeW1ib2xzLgorQW4gYXJyYXkgb2Ygc3ltYm9sIHRhYmxlcworKEBjb2Rle3N5bXN9KSBpcyBjcmVhdGVkLCBlYWNoIGVudHJ5IG9mIHdoaWNoIGlzIGEgc3ltYm9sIHRhYmxlCitvZiBTeW1zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGZyb20gYSBwYXJ0aWN1bGFyIGxpc3RpbmcuCitUaGUgbWFzdGVyIHN5bWJvbCB0YWJsZSBhbmQgdGhlIHN5bXNwZWNzIGFyZSBleGFtaW5lZCBieSBuZXN0ZWQKK2xvb3BzLCBhbmQgZXZlcnkgc3ltYm9sIHRoYXQgbWF0Y2hlcyBhIHN5bXNwZWMgaXMgaW5zZXJ0ZWQKK2ludG8gdGhlIGFwcHJvcHJpYXRlIHN5bXMgdGFibGUuICBUaGlzIGlzIGRvbmUgdHdpY2UsIG9uY2UgdG8KK2NvdW50IHRoZSBzaXplIG9mIGVhY2ggcmVxdWlyZWQgc3ltYm9sIHRhYmxlLCBhbmQgYWdhaW4gdG8gYnVpbGQKK3RoZSB0YWJsZXMsIHdoaWNoIGhhdmUgYmVlbiBtYWxsb2NlZCBiZXR3ZWVuIHBhc3Nlcy4KK0Zyb20gbm93IG9uLCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN5bWJvbCBpcyBvbiBhbiBpbmNsdWRlCitvciBleGNsdWRlIHN5bXNwZWMgbGlzdCwgQGNvZGV7Z3Byb2Z9IHNpbXBseSB1c2VzIGl0cworc3RhbmRhcmQgc3ltYm9sIGxvb2t1cCByb3V0aW5lIG9uIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQoraW4gdGhlIEBjb2Rle3N5bXN9IGFycmF5LgorCitOb3cgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIHRoZW1zZWx2ZXMgYXJlIHJlYWQKKyhAY29kZXtnbW9uX2lvLmM6Z21vbl9vdXRfcmVhZH0pLAorZmlyc3QgYnkgY2hlY2tpbmcgZm9yIGEgbmV3LXN0eWxlIEBzYW1we2dtb24ub3V0fSBoZWFkZXIsCit0aGVuIGFzc3VtaW5nIHRoaXMgaXMgYW4gb2xkLXN0eWxlIEJTRCBAc2FtcHtnbW9uLm91dH0KK2lmIHRoZSBtYWdpYyBudW1iZXIgdGVzdCBmYWlsZWQuCisKK05ldy1zdHlsZSBoaXN0b2dyYW0gcmVjb3JkcyBhcmUgcmVhZCBieSBAY29kZXtoaXN0LmM6aGlzdF9yZWFkX3JlY30uCitGb3IgdGhlIGZpcnN0IGhpc3RvZ3JhbSByZWNvcmQsIGFsbG9jYXRlIGEgbWVtb3J5IGFycmF5IHRvIGhvbGQKK2FsbCB0aGUgYmlucywgYW5kIHJlYWQgdGhlbSBpbi4KK1doZW4gbXVsdGlwbGUgcHJvZmlsZSBkYXRhIGZpbGVzIChvciBmaWxlcyB3aXRoIG11bHRpcGxlIGhpc3RvZ3JhbQorcmVjb3JkcykgYXJlIHJlYWQsIHRoZSBzdGFydGluZyBhZGRyZXNzLCBlbmRpbmcgYWRkcmVzcywgbnVtYmVyCitvZiBiaW5zIGFuZCBzYW1wbGluZyByYXRlIG11c3QgbWF0Y2ggYmV0d2VlbiB0aGUgdmFyaW91cyBoaXN0b2dyYW1zLAorb3IgYSBmYXRhbCBlcnJvciB3aWxsIHJlc3VsdC4KK0lmIGV2ZXJ5dGhpbmcgbWF0Y2hlcywganVzdCBzdW0gdGhlIGFkZGl0aW9uYWwgaGlzdG9ncmFtcyBpbnRvCit0aGUgZXhpc3RpbmcgaW4tbWVtb3J5IGFycmF5LgorCitBcyBlYWNoIGNhbGwgZ3JhcGggcmVjb3JkIGlzIHJlYWQgKEBjb2Rle2NhbGxfZ3JhcGguYzpjZ19yZWFkX3JlY30pLAordGhlIHBhcmVudCBhbmQgY2hpbGQgYWRkcmVzc2VzCithcmUgbWF0Y2hlZCB0byBzeW1ib2wgdGFibGUgZW50cmllcywgYW5kIGEgY2FsbCBncmFwaCBhcmMgaXMKK2NyZWF0ZWQgYnkgQGNvZGV7Y2dfYXJjcy5jOmFyY19hZGR9LCB1bmxlc3MgdGhlIGFyYyBmYWlscyBhIHN5bXNwZWMKK2NoZWNrIGFnYWluc3QgSU5DTF9BUkNTL0VYQ0xfQVJDUy4gIEFzIGVhY2ggYXJjIGlzIGFkZGVkLAorYSBsaW5rZWQgbGlzdCBpcyBtYWludGFpbmVkIG9mIHRoZSBwYXJlbnQncyBjaGlsZCBhcmNzLCBhbmQgb2YgdGhlIGNoaWxkJ3MKK3BhcmVudCBhcmNzLgorQm90aCB0aGUgY2hpbGQncyBjYWxsIGNvdW50IGFuZCB0aGUgYXJjJ3MgY2FsbCBjb3VudCBhcmUKK2luY3JlbWVudGVkIGJ5IHRoZSByZWNvcmQncyBjYWxsIGNvdW50LgorCitCYXNpYy1ibG9jayByZWNvcmRzIGFyZSByZWFkIChAY29kZXtiYXNpY19ibG9ja3MuYzpiYl9yZWFkX3JlY30pLAorYnV0IG9ubHkgaWYgbGluZS1ieS1saW5lIHByb2ZpbGluZyBoYXMgYmVlbiBzZWxlY3RlZC4KK0VhY2ggYmFzaWMtYmxvY2sgYWRkcmVzcyBpcyBtYXRjaGVkIHRvIGEgY29ycmVzcG9uZGluZyBsaW5lCitzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYW5kIGFuIGVudHJ5IG1hZGUgaW4gdGhlIHN5bWJvbCdzCitiYl9hZGRyIGFuZCBiYl9jYWxscyBhcnJheXMuICBBZ2FpbiwgaWYgbXVsdGlwbGUgYmFzaWMtYmxvY2sKK3JlY29yZHMgYXJlIHByZXNlbnQgZm9yIHRoZSBzYW1lIGFkZHJlc3MsIHRoZSBjYWxsIGNvdW50cworYXJlIGN1bXVsYXRpdmUuCisKK0EgZ21vbi5zdW0gZmlsZSBpcyBkdW1wZWQsIGlmIHJlcXVlc3RlZCAoQGNvZGV7Z21vbl9pby5jOmdtb25fb3V0X3dyaXRlfSkuCisKK0lmIGhpc3RvZ3JhbXMgd2VyZSBwcmVzZW50IGluIHRoZSBkYXRhIGZpbGVzLCBhc3NpZ24gdGhlbSB0byBzeW1ib2xzCisoQGNvZGV7aGlzdC5jOmhpc3RfYXNzaWduX3NhbXBsZXN9KSBieSBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlIHNhbXBsZQorYmlucyBhbmQgYXNzaWduaW5nIHRoZW0gdG8gc3ltYm9scy4gIFNpbmNlIHRoZSBzeW1ib2wgdGFibGUKK2lzIHNvcnRlZCBpbiBvcmRlciBvZiBhc2NlbmRpbmcgbWVtb3J5IGFkZHJlc3Nlcywgd2UgY2FuCitzaW1wbGUgZm9sbG93IGFsb25nIGluIHRoZSBzeW1ib2wgdGFibGUgYXMgd2UgbWFrZSBvdXIgcGFzcworb3ZlciB0aGUgc2FtcGxlIGJpbnMuCitUaGlzIHN0ZXAgaW5jbHVkZXMgYSBzeW1zcGVjIGNoZWNrIGFnYWluc3QgSU5DTF9GTEFUL0VYQ0xfRkxBVC4KK0RlcGVuZGluZyBvbiB0aGUgaGlzdG9ncmFtCitzY2FsZSBmYWN0b3IsIGEgc2FtcGxlIGJpbiBtYXkgc3BhbiBtdWx0aXBsZSBzeW1ib2xzLAoraW4gd2hpY2ggY2FzZSBhIGZyYWN0aW9uIG9mIHRoZSBzYW1wbGUgY291bnQgaXMgYWxsb2NhdGVkCit0byBlYWNoIHN5bWJvbCwgcHJvcG9ydGlvbmFsIHRvIHRoZSBkZWdyZWUgb2Ygb3ZlcmxhcC4KK1RoaXMgZWZmZWN0IGlzIHJhcmUgZm9yIG5vcm1hbCBwcm9maWxpbmcsIGJ1dCBvdmVybGFwcworYXJlIG1vcmUgY29tbW9uIGR1cmluZyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBhbmQgY2FuCitjYXVzZSBlYWNoIG9mIHR3byBhZGphY2VudCBsaW5lcyB0byBiZSBjcmVkaXRlZCB3aXRoIGhhbGYKK2EgaGl0LCBmb3IgZXhhbXBsZS4KKworSWYgY2FsbCBncmFwaCBkYXRhIGlzIHByZXNlbnQsIEBjb2Rle2NnX2FyY3MuYzpjZ19hc3NlbWJsZX0gaXMgY2FsbGVkLgorRmlyc3QsIGlmIEBzYW1wey1jfSB3YXMgc3BlY2lmaWVkLCBhIG1hY2hpbmUtZGVwZW5kYW50Cityb3V0aW5lIChAY29kZXtmaW5kX2NhbGx9KSBzY2FucyB0aHJvdWdoIGVhY2ggc3ltYm9sJ3MgbWFjaGluZSBjb2RlLAorbG9va2luZyBmb3Igc3Vicm91dGluZSBjYWxsIGluc3RydWN0aW9ucywgYW5kIGFkZGluZyB0aGVtCit0byB0aGUgY2FsbCBncmFwaCB3aXRoIGEgemVybyBjYWxsIGNvdW50LgorQSB0b3BvbG9naWNhbCBzb3J0IGlzIHBlcmZvcm1lZCBieSBkZXB0aC1maXJzdCBudW1iZXJpbmcKK2FsbCB0aGUgc3ltYm9scyAoQGNvZGV7Y2dfZGZuLmM6Y2dfZGZufSksIHNvIHRoYXQKK2NoaWxkcmVuIGFyZSBhbHdheXMgbnVtYmVyZWQgbGVzcyB0aGFuIHRoZWlyIHBhcmVudHMsCit0aGVuIG1ha2luZyBhIGFycmF5IG9mIHBvaW50ZXJzIGludG8gdGhlIHN5bWJvbCB0YWJsZSBhbmQgc29ydGluZyBpdCBpbnRvCitudW1lcmljYWwgb3JkZXIsIHdoaWNoIGlzIHJldmVyc2UgdG9wb2xvZ2ljYWwKK29yZGVyIChjaGlsZHJlbiBhcHBlYXIgYmVmb3JlIHBhcmVudHMpLgorQ3ljbGVzIGFyZSBhbHNvIGRldGVjdGVkIGF0IHRoaXMgcG9pbnQsIGFsbCBtZW1iZXJzCitvZiB3aGljaCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgdG9wb2xvZ2ljYWwgbnVtYmVyLgorVHdvIHBhc3NlcyBhcmUgbm93IG1hZGUgdGhyb3VnaCB0aGlzIHNvcnRlZCBhcnJheSBvZiBzeW1ib2wgcG9pbnRlcnMuCitUaGUgZmlyc3QgcGFzcywgZnJvbSBlbmQgdG8gYmVnaW5uaW5nIChwYXJlbnRzIHRvIGNoaWxkcmVuKSwKK2NvbXB1dGVzIHRoZSBmcmFjdGlvbiBvZiBjaGlsZCB0aW1lIHRvIHByb3BvZ2F0ZSB0byBlYWNoIHBhcmVudAorYW5kIGEgcHJpbnQgZmxhZy4KK1RoZSBwcmludCBmbGFnIHJlZmxlY3RzIHN5bXNwZWMgaGFuZGxpbmcgb2YgSU5DTF9HUkFQSC9FWENMX0dSQVBILAord2l0aCBhIHBhcmVudCdzIGluY2x1ZGUgb3IgZXhjbHVkZSAocHJpbnQgb3Igbm8gcHJpbnQpIHByb3BlcnR5CitiZWluZyBwcm9wYWdhdGVkIHRvIGl0cyBjaGlsZHJlbiwgdW5sZXNzIHRoZXkgdGhlbXNlbHZlcyBleHBsaWNpdGx5IGFwcGVhcgoraW4gSU5DTF9HUkFQSCBvciBFWENMX0dSQVBILgorQSBzZWNvbmQgcGFzcywgZnJvbSBiZWdpbm5pbmcgdG8gZW5kIChjaGlsZHJlbiB0byBwYXJlbnRzKSBhY3R1YWxseQorcHJvcG9nYXRlcyB0aGUgdGltaW5ncyBhbG9uZyB0aGUgY2FsbCBncmFwaCwgc3ViamVjdAordG8gYSBjaGVjayBhZ2FpbnN0IElOQ0xfVElNRS9FWENMX1RJTUUuCitXaXRoIHRoZSBwcmludCBmbGFnLCBmcmFjdGlvbnMsIGFuZCB0aW1pbmdzIG5vdyBzdG9yZWQgaW4gdGhlIHN5bWJvbAorc3RydWN0dXJlcywgdGhlIHRvcG9sb2dpY2FsIHNvcnQgYXJyYXkgaXMgbm93IGRpc2NhcmRlZCwgYW5kIGEKK25ldyBhcnJheSBvZiBwb2ludGVycyBpcyBhc3NlbWJsZWQsIHRoaXMgdGltZSBzb3J0ZWQgYnkgcHJvcGFnYXRlZCB0aW1lLgorCitGaW5hbGx5LCBwcmludCB0aGUgdmFyaW91cyBvdXRwdXRzIHRoZSB1c2VyIHJlcXVlc3RlZCwgd2hpY2ggaXMgbm93IGZhaXJseQorc3RyYWlnaHRmb3J3YXJkLiAgVGhlIGNhbGwgZ3JhcGggKEBjb2Rle2NnX3ByaW50LmM6Y2dfcHJpbnR9KSBhbmQKK2ZsYXQgcHJvZmlsZSAoQGNvZGV7aGlzdC5jOmhpc3RfcHJpbnR9KSBhcmUgcmVndXJnaXRhdGlvbnMgb2YgdmFsdWVzCithbHJlYWR5IGNvbXB1dGVkLiAgVGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZworKEBjb2Rle2Jhc2ljX2Jsb2Nrcy5jOnByaW50X2Fubm90YXRlZF9zb3VyY2V9KSB1c2VzIGJhc2ljLWJsb2NrCitpbmZvcm1hdGlvbiwgaWYgcHJlc2VudCwgdG8gbGFiZWwgZWFjaCBsaW5lIG9mIGNvZGUgd2l0aCBjYWxsIGNvdW50cywKK290aGVyd2lzZSBvbmx5IHRoZSBmdW5jdGlvbiBjYWxsIGNvdW50cyBhcmUgcHJlc2VudGVkLgorCitUaGUgZnVuY3Rpb24gb3JkZXJpbmcgY29kZSBpcyBtYXJnaW5hbGx5IHdlbGwgZG9jdW1lbnRlZAoraW4gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiAoQGNvZGV7Y2dfcHJpbnQuY30pLiAgQmFzaWNhbGx5LAordGhlIGZ1bmN0aW9ucyB3aXRoIHRoZSBtb3N0IHVzZSBhbmQgdGhlIG1vc3QgcGFyZW50cyBhcmUKK3BsYWNlZCBmaXJzdCwgZm9sbG93ZWQgYnkgb3RoZXIgZnVuY3Rpb25zIHdpdGggdGhlIG1vc3QgdXNlLAorZm9sbG93ZWQgYnkgbG93ZXIgdXNlIGZ1bmN0aW9ucywgZm9sbG93ZWQgYnkgdW51c2VkIGZ1bmN0aW9ucworYXQgdGhlIGVuZC4KKworQG5vZGUgRGVidWdnaW5nLCxJbnRlcm5hbHMsRGV0YWlscworQHN1YnNlY3Rpb24gRGVidWdnaW5nIEBjb2Rle2dwcm9mfQorCitJZiBAY29kZXtncHJvZn0gd2FzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsCit0aGUgQHNhbXB7LWR9IG9wdGlvbiB0cmlnZ2VycyBkZWJ1Z2dpbmcgb3V0cHV0CisodG8gc3Rkb3V0KSB3aGljaCBjYW4gYmUgaGVscGZ1bCBpbiB1bmRlcnN0YW5kaW5nIGl0cyBvcGVyYXRpb24uCitUaGUgZGVidWdnaW5nIG51bWJlciBzcGVjaWZpZWQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdW0gb2YgdGhlIGZvbGxvd2luZworb3B0aW9uczoKKworQHRhYmxlIEBhc2lzCitAaXRlbSAyIC0gVG9wb2xvZ2ljYWwgc29ydAorTW9uaXRvciBkZXB0aC1maXJzdCBudW1iZXJpbmcgb2Ygc3ltYm9scyBkdXJpbmcgY2FsbCBncmFwaCBhbmFseXNpcworQGl0ZW0gNCAtIEN5Y2xlcworU2hvd3Mgc3ltYm9scyBhcyB0aGV5IGFyZSBpZGVudGlmaWVkIGFzIGN5Y2xlIGhlYWRzCitAaXRlbSAxNiAtIFRhbGx5aW5nCitBcyB0aGUgY2FsbCBncmFwaCBhcmNzIGFyZSByZWFkLCBzaG93IGVhY2ggYXJjIGFuZCBob3cKK3RoZSB0b3RhbCBjYWxscyB0byBlYWNoIGZ1bmN0aW9uIGFyZSB0YWxsaWVkCitAaXRlbSAzMiAtIENhbGwgZ3JhcGggYXJjIHNvcnRpbmcKK0RldGFpbHMgc29ydGluZyBpbmRpdmlkdWFsIHBhcmVudHMvY2hpbGRyZW4gd2l0aGluIGVhY2ggY2FsbCBncmFwaCBlbnRyeQorQGl0ZW0gNjQgLSBSZWFkaW5nIGhpc3RvZ3JhbSBhbmQgY2FsbCBncmFwaCByZWNvcmRzCitTaG93cyBhZGRyZXNzIHJhbmdlcyBvZiBoaXN0b2dyYW1zIGFzIHRoZXkgYXJlIHJlYWQsIGFuZCBlYWNoCitjYWxsIGdyYXBoIGFyYworQGl0ZW0gMTI4IC0gU3ltYm9sIHRhYmxlCitSZWFkaW5nLCBjbGFzc2lmeWluZywgYW5kIHNvcnRpbmcgdGhlIHN5bWJvbCB0YWJsZSBmcm9tIHRoZSBvYmplY3QgZmlsZS4KK0ZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIChAc2FtcHstbH0gb3B0aW9uKSwgYWxzbyBzaG93cyBsaW5lIG51bWJlcnMKK2JlaW5nIGFzc2lnbmVkIHRvIG1lbW9yeSBhZGRyZXNzZXMuCitAaXRlbSAyNTYgLSBTdGF0aWMgY2FsbCBncmFwaAorVHJhY2Ugb3BlcmF0aW9uIG9mIEBzYW1wey1jfSBvcHRpb24KK0BpdGVtIDUxMiAtIFN5bWJvbCB0YWJsZSBhbmQgYXJjIHRhYmxlIGxvb2t1cHMKK0RldGFpbCBvcGVyYXRpb24gb2YgbG9va3VwIHJvdXRpbmVzCitAaXRlbSAxMDI0IC0gQ2FsbCBncmFwaCBwcm9wYWdhdGlvbgorU2hvd3MgaG93IGZ1bmN0aW9uIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoCitAaXRlbSAyMDQ4IC0gQmFzaWMtYmxvY2tzCitTaG93cyBiYXNpYy1ibG9jayByZWNvcmRzIGFzIHRoZXkgYXJlIHJlYWQgZnJvbSBwcm9maWxlIGRhdGEKKyhvbmx5IG1lYW5pbmdmdWwgd2l0aCBAc2FtcHstbH0gb3B0aW9uKQorQGl0ZW0gNDA5NiAtIFN5bXNwZWNzCitTaG93cyBzeW1zcGVjLXRvLXN5bWJvbCBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdGlvbgorQGl0ZW0gODE5MiAtIEFubm90YXRlIHNvdXJjZQorVHJhY2tzIG9wZXJhdGlvbiBvZiBAc2FtcHstQX0gb3B0aW9uCitAZW5kIHRhYmxlCisKK0Bjb250ZW50cworQGJ5ZQorCitORUVEUyBBTiBJTkRFWAorCistVCAtICJ0cmFkaXRpb25hbCBCU0Qgc3R5bGUiOiBIb3cgaXMgaXQgZGlmZmVyZW50PyAgU2hvdWxkIHRoZQorZGlmZmVyZW5jZXMgYmUgZG9jdW1lbnRlZD8KKworZXhhbXBsZSBmbGF0IGZpbGUgYWRkcyB1cCB0byAxMDAuMDElLi4uCisKK25vdGU6IHRpbWUgZXN0aW1hdGVzIG5vdyBvbmx5IGdvIG91dCB0byBvbmUgZGVjaW1hbCBwbGFjZSAoMC4wKSwgd2hlcmUKK3RoZXkgdXNlZCB0byBleHRlbmQgdHdvICg3OC42NykuCmRpZmYgLS1naXQgYS9ncHJvZi9oZXJ0ei5jIGIvZ3Byb2YvaGVydHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTMxNGFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvaGVydHouYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKKyAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKKyAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCisgKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgImhlcnR6LmgiCisKKworI2lmZGVmIF9fTVNET1NfXworI2RlZmluZSBIRVJUWiAxOAorI2VuZGlmCisKK2ludAoraGVydHogKCkKK3sKKyNpZmRlZiBIRVJUWgorICByZXR1cm4gSEVSVFo7CisjZWxzZSAvKiAhIGRlZmluZWQgKEhFUlRaKSAqLworI2lmZGVmIEhBVkVfU0VUSVRJTUVSCisgIHN0cnVjdCBpdGltZXJ2YWwgdGltOworCisgIHRpbS5pdF9pbnRlcnZhbC50dl9zZWMgPSAwOworICB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDE7CisgIHRpbS5pdF92YWx1ZS50dl9zZWMgPSAwOworICB0aW0uaXRfdmFsdWUudHZfdXNlYyA9IDA7CisgIHNldGl0aW1lciAoSVRJTUVSX1JFQUwsICZ0aW0sIDApOworICBzZXRpdGltZXIgKElUSU1FUl9SRUFMLCAwLCAmdGltKTsKKyAgaWYgKHRpbS5pdF9pbnRlcnZhbC50dl91c2VjIDwgMikKKyAgICB7CisgICAgICByZXR1cm4gSFpfV1JPTkc7CisgICAgfQorICByZXR1cm4gMTAwMDAwMCAvIHRpbS5pdF9pbnRlcnZhbC50dl91c2VjOworI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgKi8KKyNpZiBkZWZpbmVkIChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQgKF9TQ19DTEtfVENLKQorICByZXR1cm4gc3lzY29uZiAoX1NDX0NMS19UQ0spOworI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1NZU0NPTkYpIHx8ICEgZGVmaW5lZCAoX1NDX0NMS19UQ0spICovCisgIHJldHVybiBIWl9XUk9ORzsKKyNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgfHwgISBkZWZpbmVkIChfU0NfQ0xLX1RDSykgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU0VUSVRJTUVSKSAqLworI2VuZGlmIC8qICEgZGVmaW5lZCAoSEVSVFopICovCit9CmRpZmYgLS1naXQgYS9ncHJvZi9oZXJ0ei5oIGIvZ3Byb2YvaGVydHouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWEwMWJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvaGVydHouaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIGhlcnR6X2gKKyNkZWZpbmUgaGVydHpfaAorCisjaW5jbHVkZSAiZ3Byb2YuaCIKKworI2RlZmluZQlIWl9XUk9ORyAwCQkvKiBpbXBvc3NpYmxlIGNsb2NrIGZyZXF1ZW5jeSAqLworCisvKgorICogRGlzY292ZXIgdGhlIHRpY2sgZnJlcXVlbmN5IG9mIHRoZSBtYWNoaW5lIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLAorICogd2UgcmV0dXJuIEhaX1dST05HLCBhbiBpbXBvc3NpYmxlIHNhbXBsaW5nIGZyZXF1ZW5jeS4KKyAqLworCisvKiBGSVhNRTogQ2hlY2tpbmcgZm9yIE1BQ0ggaGVyZSBtYWtlcyBubyBzZW5zZSB3aGVuIGZvciBhIGNyb3NzCisgICBncHJvZi4gICovCisjaWZkZWYgTUFDSAorI2luY2x1ZGUgPG1hY2hpbmUvbWFjaF9wYXJhbS5oPgorI2RlZmluZSBoZXJ0eigpIChIWikKKyNlbHNlCitleHRlcm4gaW50IGhlcnR6IFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorCisjZW5kaWYgLyogaGVydHpfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGlzdC5jIGIvZ3Byb2YvaGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGJiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9oaXN0LmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBIaXN0b2dyYW0gcmVsYXRlZCBvcGVyYXRpb25zLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJncHJvZi5oIgorI2luY2x1ZGUgImNvcmVmaWxlLmgiCisjaW5jbHVkZSAiZ21vbl9pby5oIgorI2luY2x1ZGUgImdtb25fb3V0LmgiCisjaW5jbHVkZSAiaGlzdC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bV9pZHMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjZGVmaW5lIFVOSVRTX1RPX0NPREUgKG9mZnNldF90b19jb2RlIC8gc2l6ZW9mKFVOSVQpKQorCitzdGF0aWMgdm9pZCBzY2FsZV9hbmRfYWxpZ25fZW50cmllcyBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIGRlY2xhcmF0aW9ucyBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgdG8gb3V0cHV0IGJsdXJiczogKi8KK2V4dGVybiB2b2lkIGZsYXRfYmx1cmIgUEFSQU1TICgoRklMRSAqIGZwKSk7CisKK2JmZF92bWEgc19sb3dwYzsJCS8qIGxvd2VzdCBhZGRyZXNzIGluIC50ZXh0ICovCitiZmRfdm1hIHNfaGlnaHBjID0gMDsJCS8qIGhpZ2hlc3QgYWRkcmVzcyBpbiAudGV4dCAqLworYmZkX3ZtYSBsb3dwYywgaGlnaHBjOwkJLyogc2FtZSwgYnV0IGV4cHJlc3NlZCBpbiBVTklUcyAqLworaW50IGhpc3RfbnVtX2JpbnMgPSAwOwkJLyogbnVtYmVyIG9mIGhpc3RvZ3JhbSBzYW1wbGVzICovCitpbnQgKmhpc3Rfc2FtcGxlID0gMDsJCS8qIGhpc3RvZ3JhbSBzYW1wbGVzIChzaG9ydHMgaW4gdGhlIGZpbGUhKSAqLworZG91YmxlIGhpc3Rfc2NhbGU7CitjaGFyIGhpc3RfZGltZW5zaW9uW3NpemVvZiAoKChzdHJ1Y3QgZ21vbl9oaXN0X2hkciAqKSAwKS0+ZGltZW4pICsgMV0gPQorICAic2Vjb25kcyI7CitjaGFyIGhpc3RfZGltZW5zaW9uX2FiYnJldiA9ICdzJzsKKworc3RhdGljIGRvdWJsZSBhY2N1bV90aW1lOwkvKiBhY2N1bXVsYXRlZCB0aW1lIHNvIGZhciBmb3IgcHJpbnRfbGluZSgpICovCitzdGF0aWMgZG91YmxlIHRvdGFsX3RpbWU7CS8qIHRvdGFsIHRpbWUgZm9yIGFsbCByb3V0aW5lcyAqLworLyoKKyAqIFRhYmxlIG9mIFNJIHByZWZpeGVzIGZvciBwb3dlcnMgb2YgMTAgKHVzZWQgdG8gYXV0b21hdGljYWxseQorICogc2NhbGUgc29tZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBmbGF0IHByb2ZpbGUpLgorICovCitjb25zdCBzdHJ1Y3QKKyAgeworICAgIGNoYXIgcHJlZml4OworICAgIGRvdWJsZSBzY2FsZTsKKyAgfQorU0l0YWJbXSA9Cit7CisgIHsKKyAgICAnVCcsIDFlLTEyCisgIH0KKyAgLAkJCQkvKiB0ZXJhICovCisgIHsKKyAgICAnRycsIDFlLTA5CisgIH0KKyAgLAkJCQkvKiBnaWdhICovCisgIHsKKyAgICAnTScsIDFlLTA2CisgIH0KKyAgLAkJCQkvKiBtZWdhICovCisgIHsKKyAgICAnSycsIDFlLTAzCisgIH0KKyAgLAkJCQkvKiBraWxvICovCisgIHsKKyAgICAnICcsIDFlLTAwCisgIH0KKyAgLAorICB7CisgICAgJ20nLCAxZSswMworICB9CisgICwJCQkJLyogbWlsbGkgKi8KKyAgeworICAgICd1JywgMWUrMDYKKyAgfQorICAsCQkJCS8qIG1pY3JvICovCisgIHsKKyAgICAnbicsIDFlKzA5CisgIH0KKyAgLAkJCQkvKiBuYW5vICovCisgIHsKKyAgICAncCcsIDFlKzEyCisgIH0KKyAgLAkJCQkvKiBwaWNvICovCisgIHsKKyAgICAnZicsIDFlKzE1CisgIH0KKyAgLAkJCQkvKiBmZW10byAqLworICB7CisgICAgJ2EnLCAxZSsxOAorICB9CisgICwJCQkJLyogYXRvICovCit9OworCisvKgorICogUmVhZCB0aGUgaGlzdG9ncmFtIGZyb20gZmlsZSBJRlAuICBGSUxFTkFNRSBpcyB0aGUgbmFtZSBvZiBJRlAgYW5kCisgKiBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBvbmx5LgorICovCit2b2lkCitERUZVTiAoaGlzdF9yZWFkX3JlYywgKGlmcCwgZmlsZW5hbWUpLCBGSUxFICogaWZwIEFORCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgc3RydWN0IGdtb25faGlzdF9oZHIgaGRyOworICBiZmRfdm1hIG5fbG93cGMsIG5faGlnaHBjOworICBpbnQgaSwgbmNudCwgcHJvZnJhdGU7CisgIFVOSVQgY291bnQ7CisKKyAgaWYgKGZyZWFkICgmaGRyLCBzaXplb2YgKGhkciksIDEsIGlmcCkgIT0gMSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiksCisJICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOworICAgICAgZG9uZSAoMSk7CisgICAgfQorCisgIG5fbG93cGMgPSAoYmZkX3ZtYSkgZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIubG93X3BjKTsKKyAgbl9oaWdocGMgPSAoYmZkX3ZtYSkgZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIuaGlnaF9wYyk7CisgIG5jbnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5oaXN0X3NpemUpOworICBwcm9mcmF0ZSA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLnByb2ZfcmF0ZSk7CisgIHN0cm5jcHkgKGhpc3RfZGltZW5zaW9uLCBoZHIuZGltZW4sIHNpemVvZiAoaGRyLmRpbWVuKSk7CisgIGhpc3RfZGltZW5zaW9uW3NpemVvZiAoaGRyLmRpbWVuKV0gPSAnXDAnOworICBoaXN0X2RpbWVuc2lvbl9hYmJyZXYgPSBoZHIuZGltZW5fYWJicmV2OworCisgIGlmICghc19oaWdocGMpCisgICAgeworCisgICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBoaXN0b2dyYW0gcmVjb3JkOiAqLworCisgICAgICBzX2xvd3BjID0gbl9sb3dwYzsKKyAgICAgIHNfaGlnaHBjID0gbl9oaWdocGM7CisgICAgICBsb3dwYyA9IChiZmRfdm1hKSBuX2xvd3BjIC8gc2l6ZW9mIChVTklUKTsKKyAgICAgIGhpZ2hwYyA9IChiZmRfdm1hKSBuX2hpZ2hwYyAvIHNpemVvZiAoVU5JVCk7CisgICAgICBoaXN0X251bV9iaW5zID0gbmNudDsKKyAgICAgIGh6ID0gcHJvZnJhdGU7CisgICAgfQorCisgIERCRyAoU0FNUExFREVCVUcsCisgICAgICAgcHJpbnRmICgiW2hpc3RfcmVhZF9yZWNdIG5fbG93cGMgMHglbHggbl9oaWdocGMgMHglbHggbmNudCAlZFxuIiwKKwkgICAgICAgbl9sb3dwYywgbl9oaWdocGMsIG5jbnQpOworICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBzX2xvd3BjIDB4JWx4IHNfaGlnaHBjIDB4JWx4IG5zYW1wbGVzICVkXG4iLAorCSAgICAgICBzX2xvd3BjLCBzX2hpZ2hwYywgaGlzdF9udW1fYmlucyk7CisgICAgICAgcHJpbnRmICgiW2hpc3RfcmVhZF9yZWNdICAgbG93cGMgMHglbHggICBoaWdocGMgMHglbHhcbiIsCisJICAgICAgIGxvd3BjLCBoaWdocGMpKTsKKworICBpZiAobl9sb3dwYyAhPSBzX2xvd3BjIHx8IG5faGlnaHBjICE9IHNfaGlnaHBjCisgICAgICB8fCBuY250ICE9IGhpc3RfbnVtX2JpbnMgfHwgaHogIT0gcHJvZnJhdGUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYCVzJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAorCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKKyAgICAgIGRvbmUgKDEpOworICAgIH0KKworICBpZiAoIWhpc3Rfc2FtcGxlKQorICAgIHsKKyAgICAgIGhpc3Rfc2FtcGxlID0gKGludCAqKSB4bWFsbG9jIChoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOworICAgICAgbWVtc2V0IChoaXN0X3NhbXBsZSwgMCwgaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKKyAgICB7CisgICAgICBpZiAoZnJlYWQgKCZjb3VudFswXSwgc2l6ZW9mIChjb3VudCksIDEsIGlmcCkgIT0gMSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgIF8oIiVzOiAlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZCBvZiAlZCBzYW1wbGVzXG4iKSwKKwkJICAgd2hvYW1pLCBmaWxlbmFtZSwgaSwgaGlzdF9udW1fYmlucyk7CisJICBkb25lICgxKTsKKwl9CisgICAgICBoaXN0X3NhbXBsZVtpXSArPSBiZmRfZ2V0XzE2IChjb3JlX2JmZCwgKGJmZF9ieXRlICopICYgY291bnRbMF0pOworICAgIH0KK30KKworCisvKgorICogV3JpdGUgZXhlY3V0aW9uIGhpc3RvZ3JhbSB0byBmaWxlIE9GUC4gIEZJTEVOQU1FIGlzIHRoZSBuYW1lCisgKiBvZiBPRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBmb3JtYXR0aW5nIGVycm9yLW1lc3NhZ2VzIG9ubHkuCisgKi8KK3ZvaWQKK0RFRlVOIChoaXN0X3dyaXRlX2hpc3QsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIHN0cnVjdCBnbW9uX2hpc3RfaGRyIGhkcjsKKyAgdW5zaWduZWQgY2hhciB0YWc7CisgIFVOSVQgY291bnQ7CisgIGludCBpOworCisgIC8qIHdyaXRlIGhlYWRlcjogKi8KKworICB0YWcgPSBHTU9OX1RBR19USU1FX0hJU1Q7CisgIHB1dF92bWEgKGNvcmVfYmZkLCBzX2xvd3BjLCAoYmZkX2J5dGUgKikgaGRyLmxvd19wYyk7CisgIHB1dF92bWEgKGNvcmVfYmZkLCBzX2hpZ2hwYywgKGJmZF9ieXRlICopIGhkci5oaWdoX3BjKTsKKyAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGhpc3RfbnVtX2JpbnMsIChiZmRfYnl0ZSAqKSBoZHIuaGlzdF9zaXplKTsKKyAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGh6LCAoYmZkX2J5dGUgKikgaGRyLnByb2ZfcmF0ZSk7CisgIHN0cm5jcHkgKGhkci5kaW1lbiwgaGlzdF9kaW1lbnNpb24sIHNpemVvZiAoaGRyLmRpbWVuKSk7CisgIGhkci5kaW1lbl9hYmJyZXYgPSBoaXN0X2RpbWVuc2lvbl9hYmJyZXY7CisKKyAgaWYgKGZ3cml0ZSAoJnRhZywgc2l6ZW9mICh0YWcpLCAxLCBvZnApICE9IDEKKyAgICAgIHx8IGZ3cml0ZSAoJmhkciwgc2l6ZW9mIChoZHIpLCAxLCBvZnApICE9IDEpCisgICAgeworICAgICAgcGVycm9yIChmaWxlbmFtZSk7CisgICAgICBkb25lICgxKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKKyAgICB7CisgICAgICBiZmRfcHV0XzE2IChjb3JlX2JmZCwgaGlzdF9zYW1wbGVbaV0sIChiZmRfYnl0ZSAqKSAmIGNvdW50WzBdKTsKKyAgICAgIGlmIChmd3JpdGUgKCZjb3VudFswXSwgc2l6ZW9mIChjb3VudCksIDEsIG9mcCkgIT0gMSkKKwl7CisJICBwZXJyb3IgKGZpbGVuYW1lKTsKKwkgIGRvbmUgKDEpOworCX0KKyAgICB9Cit9CisKKworLyoKKyAqIENhbGN1bGF0ZSBzY2FsZWQgZW50cnkgcG9pbnQgYWRkcmVzc2VzICh0byBzYXZlIHRpbWUgaW4KKyAqIGhpc3RfYXNzaWduX3NhbXBsZXMpLCBhbmQsIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBoYXZlIHByb2NlZHVyZQorICogZW50cnkgbWFza3MgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24sIHBvc3NpYmx5IHB1c2ggdGhlIHNjYWxlZAorICogZW50cnkgcG9pbnRzIG92ZXIgdGhlIHByb2NlZHVyZSBlbnRyeSBtYXNrLCBpZiBpdCB0dXJucyBvdXQgdGhhdAorICogdGhlIGVudHJ5IHBvaW50IGlzIGluIG9uZSBiaW4gYW5kIHRoZSBjb2RlIGZvciBhIHJvdXRpbmUgaXMgaW4gdGhlCisgKiBuZXh0IGJpbi4KKyAqLworc3RhdGljIHZvaWQKK3NjYWxlX2FuZF9hbGlnbl9lbnRyaWVzICgpCit7CisgIFN5bSAqc3ltOworICBiZmRfdm1hIGJpbl9vZl9lbnRyeTsKKyAgYmZkX3ZtYSBiaW5fb2ZfY29kZTsKKworICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7IHN5bSsrKQorICAgIHsKKyAgICAgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciA9IHN5bS0+YWRkciAvIHNpemVvZiAoVU5JVCk7CisgICAgICBiaW5fb2ZfZW50cnkgPSAoc3ltLT5oaXN0LnNjYWxlZF9hZGRyIC0gbG93cGMpIC8gaGlzdF9zY2FsZTsKKyAgICAgIGJpbl9vZl9jb2RlID0gKHN5bS0+aGlzdC5zY2FsZWRfYWRkciArIFVOSVRTX1RPX0NPREUgLSBsb3dwYykgLyBoaXN0X3NjYWxlOworICAgICAgaWYgKGJpbl9vZl9lbnRyeSA8IGJpbl9vZl9jb2RlKQorCXsKKwkgIERCRyAoU0FNUExFREVCVUcsCisJICAgICAgIHByaW50ZiAoIltzY2FsZV9hbmRfYWxpZ25fZW50cmllc10gcHVzaGluZyAweCVseCB0byAweCVseFxuIiwKKwkJICAgICAgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciwKKwkJICAgICAgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciArIFVOSVRTX1RPX0NPREUpKTsKKwkgIHN5bS0+aGlzdC5zY2FsZWRfYWRkciArPSBVTklUU19UT19DT0RFOworCX0KKyAgICB9Cit9CisKKworLyoKKyAqIEFzc2lnbiBzYW1wbGVzIHRvIHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhleSBiZWxvbmcuCisgKgorICogSGlzdG9ncmFtIGJpbiBJIGNvdmVycyBzb21lIGFkZHJlc3MgcmFuZ2UgW0JJTl9MT1dQQyxCSU5fSElHSF9QQykKKyAqIHdoaWNoIG1heSBvdmVybGFwIG9uZSBtb3JlIHN5bWJvbCBhZGRyZXNzIHJhbmdlcy4gIElmIGEgc3ltYm9sCisgKiBvdmVybGFwcyB3aXRoIHRoZSBiaW4ncyBhZGRyZXNzIHJhbmdlIGJ5IE8gcGVyY2VudCwgdGhlbiBPIHBlcmNlbnQKKyAqIG9mIHRoZSBiaW4ncyBjb3VudCBpcyBjcmVkaXRlZCB0byB0aGF0IHN5bWJvbC4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgYXMgdG8gd2hlcmUgQklOX0xPV19QQyBhbmQgQklOX0hJR0hfUEMgY2FuIGJlCisgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIHN5bWJvbCdzIGFkZHJlc3MgcmFuZ2UgW1NZTV9MT1dfUEMsCisgKiBTWU1fSElHSF9QQykgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBkaWFncmFtLiAgT1ZFUkxBUCBjb21wdXRlcworICogdGhlIGRpc3RhbmNlIChpbiBVTklUcykgYmV0d2VlbiB0aGUgYXJyb3dzLCB0aGUgZnJhY3Rpb24gb2YgdGhlCisgKiBzYW1wbGUgdGhhdCBpcyB0byBiZSBjcmVkaXRlZCB0byB0aGUgc3ltYm9sIHdoaWNoIHN0YXJ0cyBhdAorICogU1lNX0xPV19QQy4KKyAqCisgKiAgICAgICAgc3ltX2xvd19wYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltX2hpZ2hfcGMKKyAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAqCisgKiAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgfCAgLT58ICAgIHw8LSAgICAgICAgIC0+fCAgICAgICAgIHw8LSAgICAgICAgIC0+fCAgICB8PC0gIHwKKyAqICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgfAorICogICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICstLS0tLS0tLS0rCisgKgorICogICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICBeCisgKiAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwKKyAqICAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYyAgYmluX2xvd19wYyBiaW5faGlnaF9wYworICoKKyAqIEZvciB0aGUgVkFYIHdlIGFzc2VydCB0aGF0IHNhbXBsZXMgd2lsbCBuZXZlciBmYWxsIGluIHRoZSBmaXJzdCB0d28KKyAqIGJ5dGVzIG9mIGFueSByb3V0aW5lLCBzaW5jZSB0aGF0IGlzIHRoZSBlbnRyeSBtYXNrLCB0aHVzIHdlIGNhbGwKKyAqIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzKCkgdG8gYWRqdXN0IHRoZSBlbnRyeSBwb2ludHMgaWYgdGhlIGVudHJ5CisgKiBtYXNrIGZhbGxzIGluIG9uZSBiaW4gYnV0IHRoZSBjb2RlIGZvciB0aGUgcm91dGluZSBkb2Vzbid0IHN0YXJ0CisgKiB1bnRpbCB0aGUgbmV4dCBiaW4uICBJbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbGlnbm1lbnQgb2Ygcm91dGluZQorICogYWRkcmVzc2VzLCB0aGlzIHNob3VsZCBhbGxvdyB1cyB0byBoYXZlIG9ubHkgb25lIHNhbXBsZSBmb3IgZXZlcnkKKyAqIGZvdXIgYnl0ZXMgb2YgdGV4dCBzcGFjZSBhbmQgbmV2ZXIgaGF2ZSBhbnkgb3ZlcmxhcCAodGhlIHR3byBlbmQKKyAqIGNhc2VzLCBhYm92ZSkuCisgKi8KK3ZvaWQKK0RFRlVOX1ZPSUQgKGhpc3RfYXNzaWduX3NhbXBsZXMpCit7CisgIGJmZF92bWEgYmluX2xvd19wYywgYmluX2hpZ2hfcGM7CisgIGJmZF92bWEgc3ltX2xvd19wYywgc3ltX2hpZ2hfcGM7CisgIGJmZF92bWEgb3ZlcmxhcCwgYWRkcjsKKyAgaW50IGJpbl9jb3VudCwgaTsKKyAgdW5zaWduZWQgaW50IGo7CisgIGRvdWJsZSB0aW1lLCBjcmVkaXQ7CisKKyAgLyogcmVhZCBzYW1wbGVzIGFuZCBhc3NpZ24gdG8gc3ltYm9sczogKi8KKyAgaGlzdF9zY2FsZSA9IGhpZ2hwYyAtIGxvd3BjOworICBoaXN0X3NjYWxlIC89IGhpc3RfbnVtX2JpbnM7CisgIHNjYWxlX2FuZF9hbGlnbl9lbnRyaWVzICgpOworCisgIC8qIGl0ZXJhdGUgb3ZlciBhbGwgc2FtcGxlIGJpbnM6ICovCisKKyAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCisgICAgeworICAgICAgYmluX2NvdW50ID0gaGlzdF9zYW1wbGVbaV07CisgICAgICBpZiAoIWJpbl9jb3VudCkKKwl7CisJICBjb250aW51ZTsKKwl9CisgICAgICBiaW5fbG93X3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiBpKTsKKyAgICAgIGJpbl9oaWdoX3BjID0gbG93cGMgKyAoYmZkX3ZtYSkgKGhpc3Rfc2NhbGUgKiAoaSArIDEpKTsKKyAgICAgIHRpbWUgPSBiaW5fY291bnQ7CisgICAgICBEQkcgKFNBTVBMRURFQlVHLAorCSAgIHByaW50ZiAoCisgICAgICAiW2Fzc2lnbl9zYW1wbGVzXSBiaW5fbG93X3BjPTB4JWx4LCBiaW5faGlnaF9wYz0weCVseCwgYmluX2NvdW50PSVkXG4iLAorCQkgICAgc2l6ZW9mIChVTklUKSAqIGJpbl9sb3dfcGMsIHNpemVvZiAoVU5JVCkgKiBiaW5faGlnaF9wYywKKwkJICAgIGJpbl9jb3VudCkpOworICAgICAgdG90YWxfdGltZSArPSB0aW1lOworCisgICAgICAvKiBjcmVkaXQgYWxsIHN5bWJvbHMgdGhhdCBhcmUgY292ZXJlZCBieSBiaW4gSTogKi8KKworICAgICAgZm9yIChqID0gaiAtIDE7IGogPCBzeW10YWIubGVuOyArK2opCisJeworCSAgc3ltX2xvd19wYyA9IHN5bXRhYi5iYXNlW2pdLmhpc3Quc2NhbGVkX2FkZHI7CisJICBzeW1faGlnaF9wYyA9IHN5bXRhYi5iYXNlW2ogKyAxXS5oaXN0LnNjYWxlZF9hZGRyOworCSAgLyoKKwkgICAqIElmIGhpZ2ggZW5kIG9mIGJpbiBpcyBiZWxvdyBlbnRyeSBhZGRyZXNzLCBnbyBmb3IgbmV4dAorCSAgICogYmluOgorCSAgICovCisJICBpZiAoYmluX2hpZ2hfcGMgPCBzeW1fbG93X3BjKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIC8qCisJICAgKiBJZiBsb3cgZW5kIG9mIGJpbiBpcyBhYm92ZSBoaWdoIGVuZCBvZiBzeW1ib2wsIGdvIGZvcgorCSAgICogbmV4dCBzeW1ib2wuCisJICAgKi8KKwkgIGlmIChiaW5fbG93X3BjID49IHN5bV9oaWdoX3BjKQorCSAgICB7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIG92ZXJsYXAgPQorCSAgICBNSU4gKGJpbl9oaWdoX3BjLCBzeW1faGlnaF9wYykgLSBNQVggKGJpbl9sb3dfcGMsIHN5bV9sb3dfcGMpOworCSAgaWYgKG92ZXJsYXAgPiAwKQorCSAgICB7CisJICAgICAgREJHIChTQU1QTEVERUJVRywKKwkJICAgcHJpbnRmICgKKwkJCSAgICAiW2Fzc2lnbl9zYW1wbGVzXSBbMHglbHgsMHglbHgpICVzIGdldHMgJWYgdGlja3MgJWxkIG92ZXJsYXBcbiIsCisJCQkgICAgc3ltdGFiLmJhc2Vbal0uYWRkciwgc2l6ZW9mIChVTklUKSAqIHN5bV9oaWdoX3BjLAorCQkJICAgIHN5bXRhYi5iYXNlW2pdLm5hbWUsIG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZSwKKwkJCSAgICBvdmVybGFwKSk7CisJICAgICAgYWRkciA9IHN5bXRhYi5iYXNlW2pdLmFkZHI7CisJICAgICAgY3JlZGl0ID0gb3ZlcmxhcCAqIHRpbWUgLyBoaXN0X3NjYWxlOworCSAgICAgIC8qCisJICAgICAgICogQ3JlZGl0IHN5bWJvbCBpZiBpdCBhcHBlYXJzIGluIElOQ0xfRkxBVCBvciB0aGF0CisJICAgICAgICogdGFibGUgaXMgZW1wdHkgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpdCBpbgorCSAgICAgICAqIEVYQ0xfRkxBVC4KKwkgICAgICAgKi8KKwkgICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9GTEFUXSwgYWRkcikKKwkJICB8fCAoc3ltc1tJTkNMX0ZMQVRdLmxlbiA9PSAwCisJCSAgICAgICYmICFzeW1fbG9va3VwICgmc3ltc1tFWENMX0ZMQVRdLCBhZGRyKSkpCisJCXsKKwkJICBzeW10YWIuYmFzZVtqXS5oaXN0LnRpbWUgKz0gY3JlZGl0OworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgdG90YWxfdGltZSAtPSBjcmVkaXQ7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIERCRyAoU0FNUExFREVCVUcsIHByaW50ZiAoIlthc3NpZ25fc2FtcGxlc10gdG90YWxfdGltZSAlZlxuIiwKKwkJCSAgICB0b3RhbF90aW1lKSk7Cit9CisKKworLyoKKyAqIFByaW50IGhlYWRlciBmb3IgZmxhZyBoaXN0b2dyYW0gcHJvZmlsZToKKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChwcmludF9oZWFkZXIsIChwcmVmaXgpLCBjb25zdCBjaGFyIHByZWZpeCkKK3sKKyAgY2hhciB1bml0WzY0XTsKKworICBzcHJpbnRmICh1bml0LCBfKCIlYyVjL2NhbGwiKSwgcHJlZml4LCBoaXN0X2RpbWVuc2lvbl9hYmJyZXYpOworCisgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiXG5ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAlbGQgYnl0ZShzKSIpLAorCSAgICAgIChsb25nKSBoaXN0X3NjYWxlICogc2l6ZW9mIChVTklUKSk7CisgICAgICBpZiAodG90YWxfdGltZSA+IDAuMCkKKwl7CisJICBwcmludGYgKF8oIiBmb3IgJS4yZiUlIG9mICUuMmYgJXNcblxuIiksCisJCSAgMTAwLjAgLyB0b3RhbF90aW1lLCB0b3RhbF90aW1lIC8gaHosIGhpc3RfZGltZW5zaW9uKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmIChfKCJcbkVhY2ggc2FtcGxlIGNvdW50cyBhcyAlZyAlcy5cbiIpLCAxLjAgLyBoeiwgaGlzdF9kaW1lbnNpb24pOworICAgIH0KKworICBpZiAodG90YWxfdGltZSA8PSAwLjApCisgICAgeworICAgICAgcHJpbnRmIChfKCIgbm8gdGltZSBhY2N1bXVsYXRlZFxuXG4iKSk7CisgICAgICAvKiB0aGlzIGRvZXNuJ3QgaHVydCBzaW5jZSBhbGwgdGhlIG51bWVyYXRvcnMgd2lsbCBiZSB6ZXJvOiAqLworICAgICAgdG90YWxfdGltZSA9IDEuMDsKKyAgICB9CisKKyAgcHJpbnRmICgiJTUuNXMgJTEwLjEwcyAlOC44cyAlOC44cyAlOC44cyAlOC44cyAgJS04LjhzXG4iLAorCSAgIiUgICIsIF8oImN1bXVsYXRpdmUiKSwgXygic2VsZiAgIiksICIiLCBfKCJzZWxmICAiKSwgXygidG90YWwgIiksICIiKTsKKyAgcHJpbnRmICgiJTUuNXMgJTkuOXMgICU4LjhzICU4LjhzICU4LjhzICU4LjhzICAlLTguOHNcbiIsCisJICBfKCJ0aW1lIiksIGhpc3RfZGltZW5zaW9uLCBoaXN0X2RpbWVuc2lvbiwgXygiY2FsbHMiKSwgdW5pdCwgdW5pdCwKKwkgIF8oIm5hbWUiKSk7Cit9CisKKworc3RhdGljIHZvaWQKK0RFRlVOIChwcmludF9saW5lLCAoc3ltLCBzY2FsZSksIFN5bSAqIHN5bSBBTkQgZG91YmxlIHNjYWxlKQoreworICBpZiAoaWdub3JlX3plcm9zICYmIHN5bS0+bmNhbGxzID09IDAgJiYgc3ltLT5oaXN0LnRpbWUgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGFjY3VtX3RpbWUgKz0gc3ltLT5oaXN0LnRpbWU7CisgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQorICAgIHsKKyAgICAgIHByaW50ZiAoIiU1LjFmICUxMC4yZiAlOC4yZiIsCisJICAgICAgdG90YWxfdGltZSA+IDAuMCA/IDEwMCAqIHN5bS0+aGlzdC50aW1lIC8gdG90YWxfdGltZSA6IDAuMCwKKwkgICAgICBhY2N1bV90aW1lIC8gaHosIHN5bS0+aGlzdC50aW1lIC8gaHopOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIiU2LjJmICU5LjJmICU4LjJmIiwKKwkgICAgICB0b3RhbF90aW1lID4gMC4wID8gMTAwICogc3ltLT5oaXN0LnRpbWUgLyB0b3RhbF90aW1lIDogMC4wLAorCSAgICAgIGFjY3VtX3RpbWUgLyBoeiwgc3ltLT5oaXN0LnRpbWUgLyBoeik7CisgICAgfQorICBpZiAoc3ltLT5uY2FsbHMgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIgJThsdSAlOC4yZiAlOC4yZiAgIiwKKwkgICAgICBzeW0tPm5jYWxscywgc2NhbGUgKiBzeW0tPmhpc3QudGltZSAvIGh6IC8gc3ltLT5uY2FsbHMsCisJICBzY2FsZSAqIChzeW0tPmhpc3QudGltZSArIHN5bS0+Y2cuY2hpbGRfdGltZSkgLyBoeiAvIHN5bS0+bmNhbGxzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCIgJTguOHMgJTguOHMgJTguOHMgICIsICIiLCAiIiwgIiIpOworICAgIH0KKyAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCisgICAgeworICAgICAgcHJpbnRfbmFtZSAoc3ltKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludF9uYW1lX29ubHkgKHN5bSk7CisgICAgfQorICBwcmludGYgKCJcbiIpOworfQorCisKKy8qCisgKiBDb21wYXJlIExQIGFuZCBSUC4gIFRoZSBwcmltYXJ5IGNvbXBhcmlzb24ga2V5IGlzIGV4ZWN1dGlvbiB0aW1lLAorICogdGhlIHNlY29uZGFyeSBpcyBudW1iZXIgb2YgaW52b2NhdGlvbiwgYW5kIHRoZSB0ZXJ0aWFyeSBpcyB0aGUKKyAqIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzLgorICovCitzdGF0aWMgaW50CitERUZVTiAoY21wX3RpbWUsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKK3sKKyAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOworICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOworICBkb3VibGUgdGltZV9kaWZmOworCisgIHRpbWVfZGlmZiA9IHJpZ2h0LT5oaXN0LnRpbWUgLSBsZWZ0LT5oaXN0LnRpbWU7CisgIGlmICh0aW1lX2RpZmYgPiAwLjApCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAodGltZV9kaWZmIDwgMC4wKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKHJpZ2h0LT5uY2FsbHMgPiBsZWZ0LT5uY2FsbHMpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAocmlnaHQtPm5jYWxscyA8IGxlZnQtPm5jYWxscykKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBzdHJjbXAgKGxlZnQtPm5hbWUsIHJpZ2h0LT5uYW1lKTsKK30KKworCisvKgorICogUHJpbnQgdGhlIGZsYXQgaGlzdG9ncmFtIHByb2ZpbGUuCisgKi8KK3ZvaWQKK0RFRlVOX1ZPSUQgKGhpc3RfcHJpbnQpCit7CisgIFN5bSAqKnRpbWVfc29ydGVkX3N5bXMsICp0b3BfZG9nLCAqc3ltOworICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgIGludCBsb2dfc2NhbGU7CisgIGRvdWJsZSB0b3BfdGltZSwgdGltZTsKKyAgYmZkX3ZtYSBhZGRyOworCisgIGlmIChmaXJzdF9vdXRwdXQpCisgICAgeworICAgICAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgiXGZcbiIpOworICAgIH0KKworICBhY2N1bV90aW1lID0gMC4wOworICBpZiAoYnNkX3N0eWxlX291dHB1dCkKKyAgICB7CisgICAgICBpZiAocHJpbnRfZGVzY3JpcHRpb25zKQorCXsKKwkgIHByaW50ZiAoXygiXG5cblxuZmxhdCBwcm9maWxlOlxuIikpOworCSAgZmxhdF9ibHVyYiAoc3Rkb3V0KTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmIChfKCJGbGF0IHByb2ZpbGU6XG4iKSk7CisgICAgfQorICAvKgorICAgKiBTb3J0IHRoZSBzeW1ib2wgdGFibGUgYnkgdGltZSAoY2FsbC1jb3VudCBhbmQgbmFtZSBhcyBzZWNvbmRhcnkKKyAgICogYW5kIHRlcnRpYXJ5IGtleXMpOgorICAgKi8KKyAgdGltZV9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCisgICAgeworICAgICAgdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOworICAgIH0KKyAgcXNvcnQgKHRpbWVfc29ydGVkX3N5bXMsIHN5bXRhYi5sZW4sIHNpemVvZiAoU3ltICopLCBjbXBfdGltZSk7CisKKyAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCisgICAgeworICAgICAgbG9nX3NjYWxlID0gNTsJCS8qIG1pbGxpLXNlY29uZHMgaXMgQlNELWRlZmF1bHQgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKgorICAgICAgICogU2VhcmNoIGZvciBzeW1ib2wgd2l0aCBoaWdoZXN0IHBlci1jYWxsIGV4ZWN1dGlvbiB0aW1lIGFuZAorICAgICAgICogc2NhbGUgYWNjb3JkaW5nbHk6CisgICAgICAgKi8KKyAgICAgIGxvZ19zY2FsZSA9IDA7CisgICAgICB0b3BfZG9nID0gMDsKKyAgICAgIHRvcF90aW1lID0gMC4wOworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKKwl7CisJICBzeW0gPSB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XTsKKwkgIGlmIChzeW0tPm5jYWxscyAhPSAwKQorCSAgICB7CisJICAgICAgdGltZSA9IChzeW0tPmhpc3QudGltZSArIHN5bS0+Y2cuY2hpbGRfdGltZSkgLyBzeW0tPm5jYWxsczsKKwkgICAgICBpZiAodGltZSA+IHRvcF90aW1lKQorCQl7CisJCSAgdG9wX2RvZyA9IHN5bTsKKwkJICB0b3BfdGltZSA9IHRpbWU7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGlmICh0b3BfZG9nICYmIHRvcF9kb2ctPm5jYWxscyAhPSAwICYmIHRvcF90aW1lID4gMC4wKQorCXsKKwkgIHRvcF90aW1lIC89IGh6OworCSAgd2hpbGUgKFNJdGFiW2xvZ19zY2FsZV0uc2NhbGUgKiB0b3BfdGltZSA8IDEwMDAuMAorCQkgJiYgKChzaXplX3QpIGxvZ19zY2FsZQorCQkgICAgIDwgc2l6ZW9mIChTSXRhYikgLyBzaXplb2YgKFNJdGFiWzBdKSAtIDEpKQorCSAgICB7CisJICAgICAgKytsb2dfc2NhbGU7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qCisgICAqIEZvciBub3csIHRoZSBkaW1lbnNpb24gaXMgYWx3YXlzIHNlY29uZHMuICBJbiB0aGUgZnV0dXJlLCB3ZQorICAgKiBtYXkgYWxzbyB3YW50IHRvIHN1cHBvcnQgb3RoZXIgKHBzZXVkby0pZGltZW5zaW9ucyAoc3VjaCBhcworICAgKiBJLWNhY2hlIG1pc3NlcyBldGMuKS4KKyAgICovCisgIHByaW50X2hlYWRlciAoU0l0YWJbbG9nX3NjYWxlXS5wcmVmaXgpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQorICAgIHsKKyAgICAgIGFkZHIgPSB0aW1lX3NvcnRlZF9zeW1zW2luZGV4XS0+YWRkcjsKKyAgICAgIC8qCisgICAgICAgKiBQcmludCBzeW1ib2wgaWYgaXRzIGluIElOQ0xfRkxBVCB0YWJsZSBvciB0aGF0IHRhYmxlCisgICAgICAgKiBpcyBlbXB0eSBhbmQgdGhlIHN5bWJvbCBpcyBub3QgaW4gRVhDTF9GTEFULgorICAgICAgICovCisgICAgICBpZiAoc3ltX2xvb2t1cCAoJnN5bXNbSU5DTF9GTEFUXSwgYWRkcikKKwkgIHx8IChzeW1zW0lOQ0xfRkxBVF0ubGVuID09IDAKKwkgICAgICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9GTEFUXSwgYWRkcikpKQorCXsKKwkgIHByaW50X2xpbmUgKHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdLCBTSXRhYltsb2dfc2NhbGVdLnNjYWxlKTsKKwl9CisgICAgfQorICBmcmVlICh0aW1lX3NvcnRlZF9zeW1zKTsKKworICBpZiAocHJpbnRfZGVzY3JpcHRpb25zICYmICFic2Rfc3R5bGVfb3V0cHV0KQorICAgIHsKKyAgICAgIGZsYXRfYmx1cmIgKHN0ZG91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGlzdC5oIGIvZ3Byb2YvaGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjJlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9oaXN0LmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBoaXN0X2gKKyNkZWZpbmUgaGlzdF9oCisKKyNpbmNsdWRlICJiZmQuaCIKKworZXh0ZXJuIGJmZF92bWEgc19sb3dwYzsJCS8qIGxvd3BjIGZyb20gdGhlIHByb2ZpbGUgZmlsZSAqLworZXh0ZXJuIGJmZF92bWEgc19oaWdocGM7CS8qIGhpZ2hwYyBmcm9tIHRoZSBwcm9maWxlIGZpbGUgKi8KK2V4dGVybiBiZmRfdm1hIGxvd3BjLCBoaWdocGM7CS8qIHJhbmdlIHByb2ZpbGVkLCBpbiBVTklUJ3MgKi8KK2V4dGVybiBpbnQgaGlzdF9udW1fYmluczsJLyogbnVtYmVyIG9mIGhpc3RvZ3JhbSBiaW5zICovCitleHRlcm4gaW50ICpoaXN0X3NhbXBsZTsJLyogY29kZSBoaXN0b2dyYW0gKi8KKy8qCisgKiBTY2FsZSBmYWN0b3IgY29udmVydGluZyBzYW1wbGVzIHRvIHBjIHZhbHVlczogZWFjaCBzYW1wbGUgY292ZXJzCisgKiBISVNUX1NDQUxFIGJ5dGVzOgorICovCitleHRlcm4gZG91YmxlIGhpc3Rfc2NhbGU7CisKKworZXh0ZXJuIHZvaWQgaGlzdF9yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOworZXh0ZXJuIHZvaWQgaGlzdF93cml0ZV9oaXN0IFBBUkFNUyAoKEZJTEUgKiBvZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7CitleHRlcm4gdm9pZCBoaXN0X2Fzc2lnbl9zYW1wbGVzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGhpc3RfcHJpbnQgUEFSQU1TICgodm9pZCkpOworCisjZW5kaWYgLyogaGlzdF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9pMzg2LmMgYi9ncHJvZi9pMzg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhYWQxYwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL2kzODYuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5CisgKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCisgKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJworICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlICJncHJvZi5oIgorI2luY2x1ZGUgImNnX2FyY3MuaCIKKyNpbmNsdWRlICJjb3JlZmlsZS5oIgorI2luY2x1ZGUgImhpc3QuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworCitpbnQKK0RFRlVOIChpMzg2X2lzY2FsbCwgKGlwKSwgdW5zaWduZWQgY2hhciAqaXApCit7CisgIGlmICgqaXAgPT0gMHhlOCkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAoraTM4Nl9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCisgICAgIFN5bSAqcGFyZW50OworICAgICBiZmRfdm1hIHBfbG93cGM7CisgICAgIGJmZF92bWEgcF9oaWdocGM7Cit7CisgIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKKyAgU3ltICpjaGlsZDsKKyAgYmZkX3ZtYSBkZXN0cGMsIGRlbHRhOworCisgIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCisgICAgeworICAgICAgcF9sb3dwYyA9IHNfbG93cGM7CisgICAgfQorICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKKyAgICB7CisgICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOworICAgIH0KKyAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAorCQkJICBwYXJlbnQtPm5hbWUsIHBfbG93cGMsIHBfaGlnaHBjKSk7CisKKyAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKKworICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIChwX2xvd3BjICsgZGVsdGEpOworICAgICAgIGluc3RydWN0cCA8ICh1bnNpZ25lZCBjaGFyICopIChwX2hpZ2hwYyArIGRlbHRhKTsKKyAgICAgICBpbnN0cnVjdHAgKyspCisgICAgeworICAgICAgaWYgKGkzODZfaXNjYWxsIChpbnN0cnVjdHApKQorCXsKKwkgIERCRyAoQ0FMTERFQlVHLAorCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGwiLAorCQkgICAgICAgaW5zdHJ1Y3RwIC0gKHVuc2lnbmVkIGNoYXIgKikgZGVsdGEpKTsKKwkgIC8qCisJICAgKiAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCisJICAgKiAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCisJICAgKiAgICBhIGZ1bmN0aW9uLgorCSAgICovCisKKwkgIGRlc3RwYyA9ICgoYmZkX3ZtYSkgYmZkX2dldF8zMiAoY29yZV9iZmQsIGluc3RydWN0cCArIDEpCisJCSAgICArIChiZmRfdm1hKSBpbnN0cnVjdHAgLSAoYmZkX3ZtYSkgZGVsdGEgKyA1KTsKKwkgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCisJICAgIHsKKwkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7CisJICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5hZGRyID09IGRlc3RwYykKKwkJeworCQkgIC8qCisJCSAgICogICAgICBhIGhpdAorCQkgICAqLworCQkgIERCRyAoQ0FMTERFQlVHLAorCQkgICAgICAgcHJpbnRmICgiXHRkZXN0cGMgMHglbHggKCVzKVxuIiwgZGVzdHBjLCBjaGlsZC0+bmFtZSkpOworCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKKwkJICBpbnN0cnVjdHAgKz0gNDsJLyogY2FsbCBpcyBhIDUgYnl0ZSBpbnN0cnVjdGlvbiAqLworCQkgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgIC8qCisJICAgKiAgZWxzZToKKwkgICAqICAgIGl0IGxvb2tlZCBsaWtlIGEgY2FsbGYsIGJ1dCBpdDoKKwkgICAqICAgICAgYSkgd2Fzbid0IGFjdHVhbGx5IGEgY2FsbGYsIG9yCisJICAgKiAgICAgIGIpIGRpZG4ndCBwb2ludCB0byBhIGtub3duIGZ1bmN0aW9uIGluIHRoZSBzeW10YWIsIG9yCisJICAgKiAgICAgIGMpIHNvbWV0aGluZyBmdW5ueSBpcyBnb2luZyBvbi4KKwkgICAqLworCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9wby9NYWtlLWluIGIvZ3Byb2YvcG8vTWFrZS1pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTUyZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvcG8vTWFrZS1pbgpAQCAtMCwwICsxLDI1MSBAQAorIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworUEFDS0FHRSA9IEBQQUNLQUdFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitTSEVMTCA9IC9iaW4vc2gKK0BTRVRfTUFLRUAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQorZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCitzdWJkaXIgPSBwbworCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAorCitDQyA9IEBDQ0AKK0dFTkNBVCA9IEBHRU5DQVRACitHTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAorTVNHRk1UID0gQE1TR0ZNVEAKK1hHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKK01TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCisKK0RFRlMgPSBAREVGU0AKK0NGTEFHUyA9IEBDRkxBR1NACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKKworSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCisKK0NPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCisKK1NPVVJDRVMgPSBjYXQtaWQtdGJsLmMKK1BPRklMRVMgPSBAUE9GSUxFU0AKK0dNT0ZJTEVTID0gQEdNT0ZJTEVTQAorRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKK3N0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKKworUE9URklMRVMgPSBcCisKK0NBVEFMT0dTID0gQENBVEFMT0dTQAorQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKK0lOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKKworLmMubzoKKwkkKENPTVBJTEUpICQ8CisKKy5wby5wb3g6CisJJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAorCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKKworLnBvLm1vOgorCSQoTVNHRk1UKSAtbyAkQCAkPAorCisucG8uZ21vOgorCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKKwkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAorCisucG8uY2F0OgorCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCisJICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCisKKworYWxsOiBhbGwtQFVTRV9OTFNACisKK2FsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKK2FsbC1ubzoKKworJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQorCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKKwkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCisJICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCisJcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90CisJbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKKworJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgorJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKKwlybSAtZiBjYXQtaWQtdGJsLnRtcAorCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKKwkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKKwlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCisJICBybSBjYXQtaWQtdGJsLnRtcDsgXAorCWVsc2UgXAorCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAorCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAorCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAorCWZpCisJY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAorCisKK2luc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKK2luc3RhbGwtZXhlYzoKK2luc3RhbGwtaW5mbzoKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAoraW5zdGFsbC1kYXRhLW5vOiBhbGwKK2luc3RhbGwtZGF0YS15ZXM6IGFsbAorCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCisJICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKKwllbHNlIFwKKwkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCisJZmkKKwlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGNhc2UgIiQkY2F0IiBpbiBcCisJICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKKwkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAorCSAgZXNhYzsgXAorCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCisJICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAorCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKKwkgIGVsc2UgXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCisJCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKKwkgIGVsc2UgXAorCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKKwkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCisJCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICB0cnVlOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWRvbmUKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCisJICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgIGVsc2UgXAorCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAorCSAgZmk7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAorCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKKyMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KK2luc3RhbGxjaGVjazoKKwordW5pbnN0YWxsOgorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAorCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJZG9uZQorCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KKworY2hlY2s6IGFsbAorCitjYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCisKK2R2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKKworbW9zdGx5Y2xlYW46CisJcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAorCXJtIC1mciAqLm8KKworY2xlYW46IG1vc3RseWNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KKworbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJcm0gLWYgJChHTU9GSUxFUykKKworZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKK2Rpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQorCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCWRvbmUKKwordXBkYXRlLXBvOiBNYWtlZmlsZQorCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKKwlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKKwljZCAkKHNyY2Rpcik7IFwKKwljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAorCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCisJICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAorCSAgZWNobyAiJCRsYW5nOiI7IFwKKwkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKKwkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAorCSAgZWxzZSBcCisJICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAorCSAgICBybSAtZiAkJGxhbmcucG87IFwKKwkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKKwkgIGZpOyBcCisJZG9uZQorCitQT1RGSUxFUzogUE9URklMRVMuaW4KKwkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAorCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCisJICBlbHNlIFwKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKKwkgIGZpOyBcCisJICBybSAtZiAkQC10ICRAIFwKKwkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAorCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCisJCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKKwkgICAgJiYgY2htb2QgYS13ICRALXQgXAorCSAgICAmJiBtdiAkQC10ICRAICkKKworUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKKwljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCisKK01ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKKwljZCAuLiBcCisJICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKKwkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ3Byb2YvcG8vUE9URklMRVMuaW4gYi9ncHJvZi9wby9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQ4NjQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvcG8vUE9URklMRVMuaW4KQEAgLTAsMCArMSwzOCBAQAorYWxwaGEuYworYmFzaWNfYmxvY2tzLmMKK2Jhc2ljX2Jsb2Nrcy5oCitiYl9leGl0X2Z1bmMuYworY2FsbF9ncmFwaC5jCitjYWxsX2dyYXBoLmgKK2NnX2FyY3MuYworY2dfYXJjcy5oCitjZ19kZm4uYworY2dfZGZuLmgKK2NnX3ByaW50LmMKK2NnX3ByaW50LmgKK2NvcmVmaWxlLmMKK2NvcmVmaWxlLmgKK2dtb24uaAorZ21vbl9pby5jCitnbW9uX2lvLmgKK2dtb25fb3V0LmgKK2dwcm9mLmMKK2dwcm9mLmgKK2hlcnR6LmMKK2hlcnR6LmgKK2hpc3QuYworaGlzdC5oCitpMzg2LmMKK3NlYXJjaF9saXN0LmMKK3NlYXJjaF9saXN0LmgKK3NvdXJjZS5jCitzb3VyY2UuaAorc3BhcmMuYworc3ltX2lkcy5jCitzeW1faWRzLmgKK3N5bXRhYi5jCitzeW10YWIuaAordGFob2UuYwordXRpbHMuYwordXRpbHMuaAordmF4LmMKZGlmZiAtLWdpdCBhL2dwcm9mL3BvL2dwcm9mLnBvdCBiL2dwcm9mL3BvL2dwcm9mLnBvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmJmNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2YvcG8vZ3Byb2YucG90CkBAIC0wLDAgKzEsNDcwIEBACisjIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCisjIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KKyMKKyMsIGZ1enp5Cittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OC0wNi0xMiAxOTozMy0wNDAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKKworIzogYWxwaGEuYzo4OQorbXNnaWQgIjxpbmRpcmVjdCBjaGlsZD4iCittc2dzdHIgIiIKKworIzogYWxwaGEuYzoxMDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiW2ZpbmRfY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iCittc2dzdHIgIiIKKworIzogYWxwaGEuYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiW2ZpbmRfY2FsbF0gMHglbHg6IGpzciVzIDxpbmRpcmVjdF9jaGlsZD5cbiIKK21zZ3N0ciAiIgorCisjOiBhbHBoYS5jOjEzNgorIywgYy1mb3JtYXQKK21zZ2lkICJbZmluZF9jYWxsXSAweCVseDogYnNyIgorbXNnc3RyICIiCisKKyM6IGJhc2ljX2Jsb2Nrcy5jOjEzNCBjYWxsX2dyYXBoLmM6NzAgaGlzdC5jOjEwNQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIKK21zZ3N0ciAiIgorCisjOiBiYXNpY19ibG9ja3MuYzoyMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHdhcm5pbmc6IGlnbm9yaW5nIGJhc2ljLWJsb2NrIGV4ZWMgY291bnRzICh1c2UgLWwgb3IgLS1saW5lKVxuIgorbXNnc3RyICIiCisKKyM6IGJhc2ljX2Jsb2Nrcy5jOjMyMiBiYXNpY19ibG9ja3MuYzozMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6JWQ6ICglczoweCVseCkgJWQgZXhlY3V0aW9uc1xuIgorbXNnc3RyICIiCisKKyM6IGJhc2ljX2Jsb2Nrcy5jOjMyMyBiYXNpY19ibG9ja3MuYzozMzEKK21zZ2lkICI8dW5rbm93bj4iCittc2dzdHIgIiIKKworIzogYmFzaWNfYmxvY2tzLmM6NTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJcbiIKKyJUb3AgJWQgTGluZXM6XG4iCisiXG4iCisiICAgICBMaW5lICAgICAgQ291bnRcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBiYXNpY19ibG9ja3MuYzo2MDgKK21zZ2lkICIiCisiXG4iCisiRXhlY3V0aW9uIFN1bW1hcnk6XG4iCisiXG4iCittc2dzdHIgIiIKKworIzogYmFzaWNfYmxvY2tzLmM6NjA5CisjLCBjLWZvcm1hdAorbXNnaWQgIiU5bGQgICBFeGVjdXRhYmxlIGxpbmVzIGluIHRoaXMgZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IGJhc2ljX2Jsb2Nrcy5jOjYxMQorIywgYy1mb3JtYXQKK21zZ2lkICIlOWxkICAgTGluZXMgZXhlY3V0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiBiYXNpY19ibG9ja3MuYzo2MTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTkuMmYgICBQZXJjZW50IG9mIHRoZSBmaWxlIGV4ZWN1dGVkXG4iCittc2dzdHIgIiIKKworIzogYmFzaWNfYmxvY2tzLmM6NjE2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyIlOWQgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iCittc2dzdHIgIiIKKworIzogYmFzaWNfYmxvY2tzLmM6NjE3CisjLCBjLWZvcm1hdAorbXNnaWQgIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iCittc2dzdHIgIiIKKworIzogY2FsbF9ncmFwaC5jOjQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIltjZ190YWxseV0gYXJjIGZyb20gJXMgdG8gJXMgdHJhdmVyc2VkICVkIHRpbWVzXG4iCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzozOQorbXNnaWQgIiIKKyJcdFx0ICAgICBDYWxsIGdyYXBoIChleHBsYW5hdGlvbiBmb2xsb3dzKVxuIgorIlxuIgorbXNnc3RyICIiCisKKyM6IGNnX3ByaW50LmM6NDMKK21zZ2lkICIiCisiXHRcdFx0Q2FsbCBncmFwaFxuIgorIlxuIgorbXNnc3RyICIiCisKKyM6IGNnX3ByaW50LmM6NDYgaGlzdC5jOjM4MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzo1MAorbXNnaWQgIiIKKyIgZm9yICUuMmYlJSBvZiAlLjJmIHNlY29uZHNcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjU1Cittc2dpZCAiIgorIiBubyB0aW1lIHByb3BhZ2F0ZWRcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY0IGNnX3ByaW50LmM6NjcgY2dfcHJpbnQuYzo2OQorbXNnaWQgImNhbGxlZCIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY0IGNnX3ByaW50LmM6NjkKK21zZ2lkICJ0b3RhbCIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY0Cittc2dpZCAicGFyZW50cyIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY2IGNnX3ByaW50LmM6NjcKK21zZ2lkICJpbmRleCIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY2Cittc2dpZCAiJXRpbWUiCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzo2NiBjZ19wcmludC5jOjY3Cittc2dpZCAic2VsZiIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY2Cittc2dpZCAiZGVzY2VuZGVudHMiCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzo2NyBoaXN0LmM6NDA1Cittc2dpZCAibmFtZSIKK21zZ3N0ciAiIgorCisjOiBjZ19wcmludC5jOjY5Cittc2dpZCAiY2hpbGRyZW4iCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzo3NAorbXNnaWQgImluZGV4ICUlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lXG4iCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzoxMDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIDxjeWNsZSAlZCBhcyBhIHdob2xlPiBbJWRdXG4iCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzozNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIgorbXNnc3RyICIiCisKKyM6IGNnX3ByaW50LmM6MzU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiU2LjZzICU1LjVzICU3LjdzICU3LjdzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iCittc2dzdHIgIiIKKworIzogY2dfcHJpbnQuYzo1ODcKK21zZ2lkICIiCisiSW5kZXggYnkgZnVuY3Rpb24gbmFtZVxuIgorIlxuIgorbXNnc3RyICIiCisKKyM6IGNnX3ByaW50LmM6NjQ0IGNnX3ByaW50LmM6NjUzCisjLCBjLWZvcm1hdAorbXNnaWQgIjxjeWNsZSAlZD4iCittc2dzdHIgIiIKKworIzogY29yZWZpbGUuYzozOQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogY291bGQgbm90IG9wZW4gJXMuXG4iCittc2dzdHIgIiIKKworIzogY29yZWZpbGUuYzo1MyBjb3JlZmlsZS5jOjg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIgorbXNnc3RyICIiCisKKyM6IGNvcmVmaWxlLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAlczogbm90IGluIGEub3V0IGZvcm1hdFxuIgorbXNnc3RyICIiCisKKyM6IGNvcmVmaWxlLmM6MTM5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjYW4ndCBmaW5kIC50ZXh0IHNlY3Rpb24gaW4gJXNcbiIKK21zZ3N0ciAiIgorCisjOiBjb3JlZmlsZS5jOjE5OAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogcmFuIG91dCByb29tIGZvciAlbGQgYnl0ZXMgb2YgdGV4dCBzcGFjZVxuIgorbXNnc3RyICIiCisKKyM6IGNvcmVmaWxlLmM6MjExCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjYW4ndCBkbyAtY1xuIgorbXNnc3RyICIiCisKKyM6IGNvcmVmaWxlLmM6MjQzCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAtYyBub3Qgc3VwcG9ydGVkIG9uIGFyY2hpdGVjdHVyZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGNvcmVmaWxlLmM6NDMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIG5vIHN5bWJvbHNcbiIKK21zZ3N0ciAiIgorCisjOiBjb3JlZmlsZS5jOjcyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogc29tZWJvZHkgbWlzY291bnRlZDogbHRhYi5sZW49JWQgaW5zdGVhZCBvZiAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiBnbW9uX2lvLmM6MzMgZ21vbl9pby5jOjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iCittc2dzdHIgIiIKKworIzogZ21vbl9pby5jOjg3IGdtb25faW8uYzoxNzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iCittc2dzdHIgIiIKKworIzogZ21vbl9pby5jOjk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIKK21zZ3N0ciAiIgorCisjOiBnbW9uX2lvLmM6MTA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBmaWxlIGAlcycgaGFzIHVuc3VwcG9ydGVkIHZlcnNpb24gJWRcbiIKK21zZ3N0ciAiIgorCisjOiBnbW9uX2lvLmM6MTM4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHByb2ZpbGluZyByYXRlIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoyNDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQvJWQgYmluc1xuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoyODAKK21zZ2lkICJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoyODYgZ21vbl9pby5jOjQxMAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIGZpbGUgZm9ybWF0ICVkXG4iCittc2dzdHIgIiIKKworIzogZ21vbl9pby5jOjI5MworIywgYy1mb3JtYXQKK21zZ2lkICJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoyOTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIKK21zZ3N0ciAiIgorCisjOiBnbW9uX2lvLmM6Mjk3CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0JWQgY2FsbC1ncmFwaCByZWNvcmQlc1xuIgorbXNnc3RyICIiCisKKyM6IGdtb25faW8uYzoyOTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQlZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmQlc1xuIgorbXNnc3RyICIiCisKKyM6IGdwcm9mLmM6NTkKK21zZ2lkICIiCisiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIgorIiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIgorbXNnc3RyICIiCisKKyM6IGdwcm9mLmM6MTQ0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJVc2FnZTogJXMgWy1bYWJjRGhpbExzVHZ3eHl6XV0gWy1bQUNlRWZGSm5OT3BQcVFaXVtuYW1lXV0gWy1JIGRpcnNdXG4iCisiXHRbLWRbbnVtXV0gWy1rIGZyb20vdG9dIFstbSBtaW4tY291bnRdIFstdCB0YWJsZS1sZW5ndGhdXG4iCisiXHRbLS1bbm8tXWFubm90YXRlZC1zb3VyY2VbPW5hbWVdXSBbLS1bbm8tXWV4ZWMtY291bnRzWz1uYW1lXV1cbiIKKyJcdFstLVtuby1dZmxhdC1wcm9maWxlWz1uYW1lXV0gWy0tW25vLV1ncmFwaFs9bmFtZV1dXG4iCisiXHRbLS1bbm8tXXRpbWU9bmFtZV0gWy0tYWxsLWxpbmVzXSBbLS1icmllZl0gWy0tZGVidWdbPWxldmVsXV1cbiIKKyJcdFstLWZ1bmN0aW9uLW9yZGVyaW5nXSBbLS1maWxlLW9yZGVyaW5nXVxuIgorIlx0Wy0tZGlyZWN0b3J5LXBhdGg9ZGlyc10gWy0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zXVxuIgorIlx0Wy0tZmlsZS1mb3JtYXQ9bmFtZV0gWy0tZmlsZS1pbmZvXSBbLS1oZWxwXSBbLS1saW5lXSBbLS1taW4tY291bnQ9bl1cbiIKKyJcdFstLW5vLXN0YXRpY10gWy0tcHJpbnQtcGF0aF0gWy0tc2VwYXJhdGUtZmlsZXNdXG4iCisiXHRbLS1zdGF0aWMtY2FsbC1ncmFwaF0gWy0tc3VtXSBbLS10YWJsZS1sZW5ndGg9bGVuXSBbLS10cmFkaXRpb25hbF1cbiIKKyJcdFstLXZlcnNpb25dIFstLXdpZHRoPW5dIFstLWlnbm9yZS1ub24tZnVuY3Rpb25zXVxuIgorIlx0Wy0tZGVtYW5nbGVdIFstLW5vLWRlbWFuZ2xlXVxuIgorIlx0W2ltYWdlLWZpbGVdIFtwcm9maWxlLWZpbGUuLi5dXG4iCittc2dzdHIgIiIKKworIzogZ3Byb2YuYzoxNjAKK21zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKK21zZ3N0ciAiIgorCisjOiBncHJvZi5jOjIyOQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogZGVidWdnaW5nIG5vdCBzdXBwb3J0ZWQ7IC1kIGlnbm9yZWRcbiIKK21zZ3N0ciAiIgorCisjOiBncHJvZi5jOjMwNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogdW5rbm93biBmaWxlIGZvcm1hdCAlc1xuIgorbXNnc3RyICIiCisKKyMuIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4KKyM6IGdwcm9mLmM6MzkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkdOVSBncHJvZiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGdwcm9mLmM6MzkxCittc2dpZCAiIgorIkJhc2VkIG9uIEJTRCBncHJvZiwgY29weXJpZ2h0IDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIgorbXNnc3RyICIiCisKKyM6IGdwcm9mLmM6MzkyCittc2dpZCAiIgorIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgorbXNnc3RyICIiCisKKyM6IGdwcm9mLmM6NDM4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIlczogT25seSBvbmUgb2YgLS1mdW5jdGlvbi1vcmRlcmluZyBhbmQgLS1maWxlLW9yZGVyaW5nIG1heSBiZSBzcGVjaWZpZWQuXG4iCittc2dzdHIgIiIKKworIzogZ3Byb2YuYzo1MzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHNvcnJ5LCBmaWxlIGZvcm1hdCBgcHJvZicgaXMgbm90IHlldCBzdXBwb3J0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiBncHJvZi5jOjU5OQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGhpc3RvZ3JhbVxuIgorbXNnc3RyICIiCisKKyM6IGdwcm9mLmM6NjA2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgY2FsbC1ncmFwaCBkYXRhXG4iCittc2dzdHIgIiIKKworIzogaGlzdC5jOjE0MgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogYCVzJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIKK21zZ3N0ciAiIgorCisjOiBoaXN0LmM6MTU4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZCBvZiAlZCBzYW1wbGVzXG4iCittc2dzdHIgIiIKKworIzogaGlzdC5jOjM3NworIywgYy1mb3JtYXQKK21zZ2lkICIlYyVjL2NhbGwiCittc2dzdHIgIiIKKworIzogaGlzdC5jOjM4NQorbXNnaWQgIiIKKyIgZm9yICUuMmYlJSBvZiAlLjJmICVzXG4iCisiXG4iCittc2dzdHIgIiIKKworIzogaGlzdC5jOjM5MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiRWFjaCBzYW1wbGUgY291bnRzIGFzICVnICVzLlxuIgorbXNnc3RyICIiCisKKyM6IGhpc3QuYzozOTYKK21zZ2lkICIiCisiIG5vIHRpbWUgYWNjdW11bGF0ZWRcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBoaXN0LmM6NDAyCittc2dpZCAiY3VtdWxhdGl2ZSIKK21zZ3N0ciAiIgorCisjOiBoaXN0LmM6NDAyCittc2dpZCAic2VsZiAgIgorbXNnc3RyICIiCisKKyM6IGhpc3QuYzo0MDIKK21zZ2lkICJ0b3RhbCAiCittc2dzdHIgIiIKKworIzogaGlzdC5jOjQwNAorbXNnaWQgInRpbWUiCittc2dzdHIgIiIKKworIzogaGlzdC5jOjQwNAorbXNnaWQgImNhbGxzIgorbXNnc3RyICIiCisKKyM6IGhpc3QuYzo1MTUKK21zZ2lkICIiCisiXG4iCisiXG4iCisiXG4iCisiZmxhdCBwcm9maWxlOlxuIgorbXNnc3RyICIiCisKKyM6IGhpc3QuYzo1MjEKK21zZ2lkICJGbGF0IHByb2ZpbGU6XG4iCittc2dzdHIgIiIKKworIzogc291cmNlLmM6MTQwCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBzb3VyY2UuYzoyMDAKKyMsIGMtZm9ybWF0Cittc2dpZCAiKioqIEZpbGUgJXM6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMuYzo5MworIywgYy1mb3JtYXQKK21zZ2lkICIgPGN5Y2xlICVkPiIKK21zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc2VhcmNoX2xpc3QuYyBiL2dwcm9mL3NlYXJjaF9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NWRiZgotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL3NlYXJjaF9saXN0LmMKQEAgLTAsMCArMSw0NCBAQAorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKKworCit2b2lkCitERUZVTiAoc2VhcmNoX2xpc3RfYXBwZW5kLCAobGlzdCwgcGF0aHMpLAorICAgICAgIFNlYXJjaF9MaXN0ICogbGlzdCBBTkQgY29uc3QgY2hhciAqcGF0aHMpCit7CisgIFNlYXJjaF9MaXN0X0VsZW0gKm5ld19lbDsKKyAgY29uc3QgY2hhciAqYmVnLCAqY29sb247CisgIGludCBsZW47CisKKyAgY29sb24gPSBwYXRocyAtIDE7CisgIGRvCisgICAgeworICAgICAgYmVnID0gY29sb24gKyAxOworICAgICAgY29sb24gPSBzdHJjaHIgKGJlZywgJzonKTsKKyAgICAgIGlmIChjb2xvbikKKwl7CisJICBsZW4gPSBjb2xvbiAtIGJlZzsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGVuID0gc3RybGVuIChiZWcpOworCX0KKyAgICAgIG5ld19lbCA9IChTZWFyY2hfTGlzdF9FbGVtICopIHhtYWxsb2MgKHNpemVvZiAoKm5ld19lbCkgKyBsZW4pOworICAgICAgbWVtY3B5IChuZXdfZWwtPnBhdGgsIGJlZywgbGVuKTsKKyAgICAgIG5ld19lbC0+cGF0aFtsZW5dID0gJ1wwJzsKKworICAgICAgLyogYXBwZW5kIG5ldyBwYXRoIGF0IGVuZCBvZiBsaXN0OiAqLworICAgICAgbmV3X2VsLT5uZXh0ID0gMDsKKyAgICAgIGlmIChsaXN0LT50YWlsKQorCXsKKwkgIGxpc3QtPnRhaWwtPm5leHQgPSBuZXdfZWw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxpc3QtPmhlYWQgPSBuZXdfZWw7CisJfQorICAgICAgbGlzdC0+dGFpbCA9IG5ld19lbDsKKyAgICB9CisgIHdoaWxlIChjb2xvbik7Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5oIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRmZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIHNlYXJjaF9saXN0X2gKKyNkZWZpbmUgc2VhcmNoX2xpc3RfaAorCit0eXBlZGVmIHN0cnVjdCBzZWFyY2hfbGlzdF9lbGVtCisgIHsKKyAgICBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbSAqbmV4dDsKKyAgICBjaGFyIHBhdGhbMV07CisgIH0KK1NlYXJjaF9MaXN0X0VsZW07CisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbSAqaGVhZDsKKyAgICBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbSAqdGFpbDsKKyAgfQorU2VhcmNoX0xpc3Q7CisKK2V4dGVybiB2b2lkIHNlYXJjaF9saXN0X2FwcGVuZCBQQVJBTVMgKChTZWFyY2hfTGlzdCAqIGxpc3QsIGNvbnN0IGNoYXIgKnBhdGhzKSk7CisKKyNlbmRpZiAvKiBzZWFyY2hfbGlzdF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zb3VyY2UuYyBiL2dwcm9mL3NvdXJjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MDFhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9zb3VyY2UuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIEtlZXBzIHRyYWNrIG9mIHNvdXJjZSBmaWxlcy4KKyAqLworI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKKyNpbmNsdWRlICJzb3VyY2UuaCIKKworI2RlZmluZSBFWFRfQU5OTyAiLWFubiIJCS8qIHBvc3RmaXggb2YgYW5ub3RhdGVkIGZpbGVzICovCisKKy8qCisgKiBEZWZhdWx0IG9wdGlvbiB2YWx1ZXM6CisgKi8KK2Jvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXMgPSBGQUxTRTsKKworU2VhcmNoX0xpc3Qgc3JjX3NlYXJjaF9saXN0ID0KK3swLCAwfTsKK1NvdXJjZV9GaWxlICpmaXJzdF9zcmNfZmlsZSA9IDA7CisKKworU291cmNlX0ZpbGUgKgorREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoLCAocGF0aCksIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIFNvdXJjZV9GaWxlICpzZjsKKworICBmb3IgKHNmID0gZmlyc3Rfc3JjX2ZpbGU7IHNmOyBzZiA9IHNmLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHBhdGgsIHNmLT5uYW1lKSA9PSAwKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGlmICghc2YpCisgICAgeworICAgICAgLyogY3JlYXRlIGEgbmV3IHNvdXJjZSBmaWxlIGRlc2NyaXB0b3I6ICovCisKKyAgICAgIHNmID0gKFNvdXJjZV9GaWxlICopIHhtYWxsb2MgKHNpemVvZiAoKnNmKSk7CisgICAgICBtZW1zZXQgKHNmLCAwLCBzaXplb2YgKCpzZikpOworICAgICAgc2YtPm5hbWUgPSB4c3RyZHVwIChwYXRoKTsKKyAgICAgIHNmLT5uZXh0ID0gZmlyc3Rfc3JjX2ZpbGU7CisgICAgICBmaXJzdF9zcmNfZmlsZSA9IHNmOworICAgIH0KKyAgcmV0dXJuIHNmOworfQorCisKK1NvdXJjZV9GaWxlICoKK0RFRlVOIChzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSwgKGZpbGVuYW1lKSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmZuYW1lOworICBTb3VyY2VfRmlsZSAqc2Y7CisgIC8qCisgICAqIFRoZSB1c2VyIGNhbm5vdCBrbm93IGV4YWN0bHkgaG93IGEgZmlsZW5hbWUgd2lsbCBiZSBzdG9yZWQgaW4KKyAgICogdGhlIGRlYnVnZ2luZyBpbmZvIChlLmcuLCAuLi9pbmNsdWRlL2Zvby5oCisgICAqIHZzLiAvdXNyL2luY2x1ZGUvZm9vLmgpLiAgU28gd2Ugc2ltcGx5IGNvbXBhcmUgdGhlIGZpbGVuYW1lCisgICAqIGNvbXBvbmVudCBvZiBhIHBhdGggb25seToKKyAgICovCisgIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCisgICAgeworICAgICAgZm5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKKyAgICAgIGlmIChmbmFtZSkKKwl7CisJICArK2ZuYW1lOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmbmFtZSA9IHNmLT5uYW1lOworCX0KKyAgICAgIGlmIChzdHJjbXAgKGZpbGVuYW1lLCBmbmFtZSkgPT0gMCkKKwl7CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gc2Y7Cit9CisKKworRklMRSAqCitERUZVTiAoYW5ub3RhdGVfc291cmNlLCAoc2YsIG1heF93aWR0aCwgYW5ub3RlLCBhcmcpLAorICAgICAgIFNvdXJjZV9GaWxlICogc2YgQU5EIGludCBtYXhfd2lkdGgKKyAgICAgICBBTkQgdm9pZCAoKmFubm90ZSkgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgdywgaW50IGwsIHZvaWQgKmFyZykpCisgICAgICAgQU5EIHZvaWQgKmFyZykKK3sKKyAgc3RhdGljIGJvb2wgZmlyc3RfZmlsZSA9IFRSVUU7CisgIGludCBpLCBsaW5lX251bSwgbnJlYWQ7CisgIGJvb2wgbmV3X2xpbmU7CisgIGNoYXIgYnVmWzgxOTJdOworICBjaGFyIGZuYW1lW1BBVEhfTUFYXTsKKyAgY2hhciAqYW5ub3RhdGlvbiwgKm5hbWVfb25seTsKKyAgRklMRSAqaWZwLCAqb2ZwOworICBTZWFyY2hfTGlzdF9FbGVtICpzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKKworICAvKgorICAgKiBPcGVuIGlucHV0IGZpbGUuICBJZiBvcGVuIGZhaWxzLCB3YWxrIGFsb25nIHNlYXJjaC1saXN0IHVudGlsCisgICAqIG9wZW4gc3VjY2VlZHMgb3IgcmVhY2hpbmcgZW5kIG9mIGxpc3Q6CisgICAqLworICBzdHJjcHkgKGZuYW1lLCBzZi0+bmFtZSk7CisgIGlmIChzZi0+bmFtZVswXSA9PSAnLycpCisgICAgeworICAgICAgc2xlID0gMDsJCQkvKiBkb24ndCB1c2Ugc2VhcmNoIGxpc3QgZm9yIGFic29sdXRlIHBhdGhzICovCisgICAgfQorICBuYW1lX29ubHkgPSAwOworICB3aGlsZSAoVFJVRSkKKyAgICB7CisgICAgICBEQkcgKFNSQ0RFQlVHLCBwcmludGYgKCJbYW5ub3RhdGVfc291cmNlXTogbG9va2luZyBmb3IgJXMsIHRyeWluZyAlc1xuIiwKKwkJCSAgICAgc2YtPm5hbWUsIGZuYW1lKSk7CisgICAgICBpZnAgPSBmb3BlbiAoZm5hbWUsIEZPUEVOX1JCKTsKKyAgICAgIGlmIChpZnApCisJeworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKCFzbGUgJiYgIW5hbWVfb25seSkKKwl7CisJICBuYW1lX29ubHkgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKKwkgIGlmIChuYW1lX29ubHkpCisJICAgIHsKKwkgICAgICAvKiB0cnkgc2VhcmNoLWxpc3QgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCBuYW1lIG9ubHk6ICovCisJICAgICAgKytuYW1lX29ubHk7CisJICAgICAgc2xlID0gc3JjX3NlYXJjaF9saXN0LmhlYWQ7CisJICAgIH0KKwl9CisgICAgICBpZiAoc2xlKQorCXsKKwkgIHN0cmNweSAoZm5hbWUsIHNsZS0+cGF0aCk7CisJICBzdHJjYXQgKGZuYW1lLCAiLyIpOworCSAgaWYgKG5hbWVfb25seSkKKwkgICAgeworCSAgICAgIHN0cmNhdCAoZm5hbWUsIG5hbWVfb25seSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cmNhdCAoZm5hbWUsIHNmLT5uYW1lKTsKKwkgICAgfQorCSAgc2xlID0gc2xlLT5uZXh0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZXJybm8gPT0gRU5PRU5UKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY291bGQgbm90IGxvY2F0ZSBgJXMnXG4iKSwKKwkJICAgICAgIHdob2FtaSwgc2YtPm5hbWUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwZXJyb3IgKHNmLT5uYW1lKTsKKwkgICAgfQorCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBvZnAgPSBzdGRvdXQ7CisgIGlmIChjcmVhdGVfYW5ub3RhdGlvbl9maWxlcykKKyAgICB7CisgICAgICAvKiB0cnkgdG8gY3JlYXRlIGFubm90YXRlZCBzb3VyY2UgZmlsZTogKi8KKyAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworCisgICAgICAvKiBjcmVhdGUgYW5ub3RhdGlvbiBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogKi8KKyAgICAgIGZpbGVuYW1lID0gc3RycmNociAoc2YtPm5hbWUsICcvJyk7CisgICAgICBpZiAoZmlsZW5hbWUpCisJeworCSAgKytmaWxlbmFtZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZmlsZW5hbWUgPSBzZi0+bmFtZTsKKwl9CisKKyAgICAgIHN0cmNweSAoZm5hbWUsIGZpbGVuYW1lKTsKKyAgICAgIHN0cmNhdCAoZm5hbWUsIEVYVF9BTk5PKTsKKyAgICAgIG9mcCA9IGZvcGVuIChmbmFtZSwgInciKTsKKyAgICAgIGlmICghb2ZwKQorCXsKKwkgIHBlcnJvciAoZm5hbWUpOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICAvKgorICAgKiBQcmludCBmaWxlIG5hbWVzIGlmIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgdGhlcmUgYXJlCisgICAqIG1vcmUgdGhhbiBvbmUgc291cmNlIGZpbGU6CisgICAqLworICBpZiAob2ZwID09IHN0ZG91dCkKKyAgICB7CisgICAgICBpZiAoZmlyc3RfZmlsZSkKKwl7CisJICBmaXJzdF9maWxlID0gRkFMU0U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwdXRjICgnXG4nLCBvZnApOworCX0KKyAgICAgIGlmIChmaXJzdF9vdXRwdXQpCisJeworCSAgZmlyc3Rfb3V0cHV0ID0gRkFMU0U7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwcmludGYgKG9mcCwgIlxmXG4iKTsKKwl9CisgICAgICBmcHJpbnRmIChvZnAsIF8oIioqKiBGaWxlICVzOlxuIiksIHNmLT5uYW1lKTsKKyAgICB9CisKKyAgYW5ub3RhdGlvbiA9IHhtYWxsb2MgKG1heF93aWR0aCArIDEpOworICBsaW5lX251bSA9IDE7CisgIG5ld19saW5lID0gVFJVRTsKKyAgd2hpbGUgKChucmVhZCA9IGZyZWFkIChidWYsIDEsIHNpemVvZiAoYnVmKSwgaWZwKSkgPiAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBucmVhZDsgKytpKQorCXsKKwkgIGlmIChuZXdfbGluZSkKKwkgICAgeworCSAgICAgICgqYW5ub3RlKSAoYW5ub3RhdGlvbiwgbWF4X3dpZHRoLCBsaW5lX251bSwgYXJnKTsKKwkgICAgICBmcHV0cyAoYW5ub3RhdGlvbiwgb2ZwKTsKKwkgICAgICArK2xpbmVfbnVtOworCSAgICAgIG5ld19saW5lID0gRkFMU0U7CisJICAgIH0KKwkgIG5ld19saW5lID0gKGJ1ZltpXSA9PSAnXG4nKTsKKwkgIGZwdXRjIChidWZbaV0sIG9mcCk7CisJfQorICAgIH0KKyAgZnJlZSAoYW5ub3RhdGlvbik7CisgIHJldHVybiBvZnA7Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9zb3VyY2UuaCBiL2dwcm9mL3NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzM2JhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9zb3VyY2UuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIHNvdXJjZV9oCisjZGVmaW5lIHNvdXJjZV9oCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc291cmNlX2ZpbGUKKyAgeworICAgIHN0cnVjdCBzb3VyY2VfZmlsZSAqbmV4dDsKKyAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogbmFtZSBvZiBzb3VyY2UgZmlsZSAqLworICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiAjIG9mICJjYWxscyIgdG8gdGhpcyBmaWxlICovCisgICAgaW50IG51bV9saW5lczsJCS8qICMgb2YgbGluZXMgaW4gZmlsZSAqLworICAgIGludCBuYWxsb2NlZDsJCS8qIG51bWJlciBvZiBsaW5lcyBhbGxvY2F0ZWQgKi8KKyAgICB2b2lkICoqbGluZTsJCS8qIHVzYWdlLWRlcGVuZGVudCBwZXItbGluZSBkYXRhICovCisgIH0KK1NvdXJjZV9GaWxlOworCisvKgorICogT3B0aW9uczoKKyAqLworZXh0ZXJuIGJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXM7CS8qIGNyZWF0ZSBhbm5vdGF0ZWQgb3V0cHV0IGZpbGVzPyAqLworCisvKgorICogTGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlczoKKyAqLworZXh0ZXJuIFNlYXJjaF9MaXN0IHNyY19zZWFyY2hfbGlzdDsKKworLyoKKyAqIENoYWluIG9mIHNvdXJjZS1maWxlIGRlc2NyaXB0b3JzOgorICovCitleHRlcm4gU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlOworCisvKgorICogUmV0dXJucyBwb2ludGVyIHRvIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgZm9yIFBBVEgvRklMRU5BTUUuCisgKi8KK2V4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX3BhdGggUEFSQU1TICgoY29uc3QgY2hhciAqcGF0aCkpOworZXh0ZXJuIFNvdXJjZV9GaWxlICpzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOworCisvKgorICogUmVhZCBzb3VyY2UgZmlsZSBTRiBvdXRwdXQgYW5ub3RhdGVkIHNvdXJjZS4gIFRoZSBhbm5vdGF0aW9uIGlzIGF0CisgKiBNQVhfV0lEVEggY2hhcmFjdGVycyB3aWRlIGFuZCBmb3IgZWFjaCBzb3VyY2UtbGluZSBhbiBhbm5vdGF0aW9uIGlzCisgKiBvYnRhaW5lZCBieSBpbnZva2luZyBmdW5jdGlvbiBBTk5PVEUuICBBUkcgaXMgYW4gYXJndW1lbnQgcGFzc2VkIHRvCisgKiBBTk5PVEUgdGhhdCBpcyBsZWZ0IHVuaW50ZXJwcmV0ZWQgYnkgYW5ub3RhdGVfc291cmNlKCkuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmaWxlICh3aGljaCBtYXliZSBzdGRvdXQpIHN1Y2gKKyAqIHRoYXQgc3VtbWFyeSBzdGF0aXN0aWNzIGNhbiBiZSBwcmludGVkLiAgSWYgdGhlIHJldHVybmVkIGZpbGUKKyAqIGlzIG5vdCBzdGRvdXQsIGl0IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBkb25lIHdpdGggaXQuCisgKi8KK2V4dGVybiBGSUxFICphbm5vdGF0ZV9zb3VyY2UgUEFSQU1TICgoU291cmNlX0ZpbGUgKiBzZiwgaW50IG1heF93aWR0aCwKKwkJCQkgICAgICB2b2lkICgqYW5ub3RlKSAoY2hhciAqYiwgaW50IHcsIGludCBsLAorCQkJCQkJICAgICAgdm9pZCAqYXJnKSwKKwkJCQkgICAgICB2b2lkICphcmcpKTsKKworI2VuZGlmIC8qIHNvdXJjZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zcGFyYy5jIGIvZ3Byb2Yvc3BhcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDcwMmIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Byb2Yvc3BhcmMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKKyAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKKyAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCisgKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAiY2dfYXJjcy5oIgorI2luY2x1ZGUgImNvcmVmaWxlLmgiCisjaW5jbHVkZSAiaGlzdC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorCisgICAgLyoKKyAgICAgKiAgICAgICAgb3Bjb2RlIG9mIHRoZSBgY2FsbGYnIGluc3RydWN0aW9uCisgICAgICovCisjZGVmaW5lCUNBTEwJKDB4YzAwMDAwMDApCisKK3ZvaWQKK3NwYXJjX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKKyAgICAgU3ltICpwYXJlbnQ7CisgICAgIGJmZF92bWEgcF9sb3dwYzsKKyAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKK3sKKyAgYmZkX3ZtYSBkZXN0X3BjLCBkZWx0YTsKKyAgdW5zaWduZWQgaW50ICppbnN0cjsKKyAgU3ltICpjaGlsZDsKKworICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOworCisgIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCisgICAgeworICAgICAgcF9sb3dwYyA9IHNfbG93cGM7CisgICAgfQorICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKKyAgICB7CisgICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOworICAgIH0KKyAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kX2NhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKKwkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOworICBmb3IgKGluc3RyID0gKHVuc2lnbmVkIGludCAqKSAoKChwX2xvd3BjICsgZGVsdGEpICsgMykgJn4gMyk7CisgICAgICAgaW5zdHIgPCAodW5zaWduZWQgaW50ICopIChwX2hpZ2hwYyArIGRlbHRhKTsKKyAgICAgICArK2luc3RyKQorICAgIHsKKyAgICAgIGlmICgoKmluc3RyICYgQ0FMTCkpCisJeworCSAgREJHIChDQUxMREVCVUcsCisJICAgICAgIHByaW50ZiAoIltmaW5kX2NhbGxdIDB4JWx4OiBjYWxsZiIsIChiZmRfdm1hKSBpbnN0ciAtIGRlbHRhKSk7CisJICAvKgorCSAgICogUmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nIGNoZWNrIHRoYXQgdGhpcyBpcyB0aGUKKwkgICAqIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4KKwkgICAqLworCSAgZGVzdF9wYyA9ICgoYmZkX3ZtYSkgKGluc3RyICsgKCppbnN0ciAmIH5DQUxMKSkpIC0gZGVsdGE7CisJICBpZiAoZGVzdF9wYyA+PSBzX2xvd3BjICYmIGRlc3RfcGMgPD0gc19oaWdocGMpCisJICAgIHsKKwkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RfcGMpOworCSAgICAgIERCRyAoQ0FMTERFQlVHLAorCQkgICBwcmludGYgKCJcdGRlc3RfcGM9MHglbHgsIChuYW1lPSVzLCBhZGRyPTB4JWx4KVxuIiwKKwkJCSAgIGRlc3RfcGMsIGNoaWxkLT5uYW1lLCBjaGlsZC0+YWRkcikpOworCSAgICAgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0X3BjKQorCQl7CisJCSAgLyogYSBoaXQ6ICAqLworCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJICAvKgorCSAgICogU29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgorCSAgICovCisJICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dwcm9mL3N0YW1wLWguaW4gYi9ncHJvZi9zdGFtcC1oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODhmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9zdGFtcC1oLmluCkBAIC0wLDAgKzEgQEAKK3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvZ3Byb2Yvc3ltX2lkcy5jIGIvZ3Byb2Yvc3ltX2lkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2NhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9zeW1faWRzLmMKQEAgLTAsMCArMSwzNzIgQEAKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiY2dfYXJjcy5oIgorI2luY2x1ZGUgInN5bV9pZHMuaCIKKworc3RydWN0IHN5bV9pZAorICB7CisgICAgc3RydWN0IHN5bV9pZCAqbmV4dDsKKyAgICBjaGFyICpzcGVjOwkJCS8qIHBhcnNpbmcgbW9kaWZpZXMgdGhpcyAqLworICAgIFRhYmxlX0lkIHdoaWNoX3RhYmxlOworICAgIGJvb2wgaGFzX3JpZ2h0OworICAgIHN0cnVjdCBtYXRjaAorICAgICAgeworCWludCBwcmV2X2luZGV4OwkJLyogaW5kZXggb2YgcHJldiBtYXRjaCAqLworCVN5bSAqcHJldl9tYXRjaDsJLyogcHJldmlvdXMgbWF0Y2ggKi8KKwlTeW0gKmZpcnN0X21hdGNoOwkvKiBjaGFpbiBvZiBhbGwgbWF0Y2hlcyAqLworCVN5bSBzeW07CisgICAgICB9CisgICAgbGVmdCwgcmlnaHQ7CisgIH0KKyAqaWRfbGlzdDsKKworU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107CisKKyNpZmRlZiBERUJVRworY29uc3QgY2hhciAqdGFibGVfbmFtZVtdID0KK3sKKyAgIklOQ0xfR1JBUEgiLCAiRVhDTF9HUkFQSCIsCisgICJJTkNMX0FSQ1MiLCAiRVhDTF9BUkNTIiwKKyAgIklOQ0xfRkxBVCIsICJFWENMX0ZMQVQiLAorICAiSU5DTF9USU1FIiwgIkVYQ0xfVElNRSIsCisgICJJTkNMX0FOTk8iLCAiRVhDTF9BTk5PIiwKKyAgIklOQ0xfRVhFQyIsICJFWENMX0VYRUMiCit9OworI2VuZGlmIC8qIERFQlVHICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSB0YWJsZSBpbiB3aGljaCB3ZSBrZWVwIGFsbCB0aGUgc3ltcyB0aGF0IG1hdGNoCisgKiB0aGUgcmlnaHQgaGFsZiBvZiBhbiBhcmMgaWQuICBJdCBpcyBOT1Qgc29ydGVkIGFjY29yZGluZworICogdG8gdGhlIGFkZHJlc3NlcywgYmVjYXVzZSBpdCBpcyBhY2Nlc3NlZCBvbmx5IHRocm91Z2gKKyAqIHRoZSBsZWZ0IGhhbGYncyBDSElMRFJFTiBwb2ludGVycyAoc28gaXQncyBjcnVjaWFsIG5vdAorICogdG8gcmVvcmRlciB0aGlzIHRhYmxlIG9uY2UgcG9pbnRlcnMgaW50byBpdCBleGlzdCkuCisgKi8KK3N0YXRpYyBTeW1fVGFibGUgcmlnaHRfaWRzOworCitzdGF0aWMgU291cmNlX0ZpbGUgbm9uX2V4aXN0ZW50X2ZpbGUgPQoreworICAwLCAiPG5vbi1leGlzdGVudC1maWxlPiIKK307CisKKwordm9pZAorREVGVU4gKHN5bV9pZF9hZGQsIChzcGVjLCB3aGljaF90YWJsZSksCisgICAgICAgY29uc3QgY2hhciAqc3BlYyBBTkQgVGFibGVfSWQgd2hpY2hfdGFibGUpCit7CisgIHN0cnVjdCBzeW1faWQgKmlkOworICBpbnQgbGVuID0gc3RybGVuIChzcGVjKTsKKworICBpZCA9IChzdHJ1Y3Qgc3ltX2lkICopIHhtYWxsb2MgKHNpemVvZiAoKmlkKSArIGxlbiArIDEpOworICBtZW1zZXQgKGlkLCAwLCBzaXplb2YgKCppZCkpOworCisgIGlkLT5zcGVjID0gKGNoYXIgKikgaWQgKyBzaXplb2YgKCppZCk7CisgIHN0cmNweSAoaWQtPnNwZWMsIHNwZWMpOworICBpZC0+d2hpY2hfdGFibGUgPSB3aGljaF90YWJsZTsKKworICBpZC0+bmV4dCA9IGlkX2xpc3Q7CisgIGlkX2xpc3QgPSBpZDsKK30KKworCisvKgorICogQSBzcGVjIGhhcyB0aGUgc3ludGF4IEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FTlVNKS4gIEFzIGEgY29udmVuaWVuY2UKKyAqIHRvIHRoZSB1c2VyLCBhIHNwZWMgd2l0aG91dCBhIGNvbG9uIGlzIGludGVycHJldGVkIGFzOgorICoKKyAqICAgICAgKGkpICAgYSBGSUxFTkFNRSBpZiBpdCBjb250YWlucyBhIGRvdAorICogICAgICAoaWkpICBhIEZVTkNOQU1FIGlmIGl0IHN0YXJ0cyB3aXRoIGEgbm9uLWRpZ2l0IGNoYXJhY3RlcgorICogICAgICAoaWlpKSBhIExJTkVOVU0gaWYgaXQgc3RhcnRzIHdpdGggYSBkaWdpdAorICoKKyAqIEEgRlVOQ05BTUUgY29udGFpbmluZyBhIGRvdCBjYW4gYmUgc3BlY2lmaWVkIGJ5IDpGVU5DTkFNRSwgYQorICogRklMRU5BTUUgbm90IGNvbnRhaW5pbmcgYSBkb3QgY2FuIGJlIHNwZWNpZmllZCBieSBGSUxFTkFNRTouCisgKi8KK3N0YXRpYyB2b2lkCitERUZVTiAocGFyc2Vfc3BlYywgKHNwZWMsIHN5bSksIGNoYXIgKnNwZWMgQU5EIFN5bSAqIHN5bSkKK3sKKyAgY2hhciAqY29sb247CisKKyAgc3ltX2luaXQgKHN5bSk7CisgIGNvbG9uID0gc3RycmNociAoc3BlYywgJzonKTsKKyAgaWYgKGNvbG9uKQorICAgIHsKKyAgICAgICpjb2xvbiA9ICdcMCc7CisgICAgICBpZiAoY29sb24gPiBzcGVjKQorCXsKKwkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKKwkgIGlmICghc3ltLT5maWxlKQorCSAgICB7CisJICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOworCSAgICB9CisJfQorICAgICAgc3BlYyA9IGNvbG9uICsgMTsKKyAgICAgIGlmIChzdHJsZW4gKHNwZWMpKQorCXsKKwkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3BlY1swXSkpCisJICAgIHsKKwkgICAgICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN5bS0+bmFtZSA9IHNwZWM7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChzdHJsZW4gKHNwZWMpKQorICAgIHsKKyAgICAgIC8qIG5vIGNvbG9uOiBzcGVjIGlzIGEgZmlsZW5hbWUgaWYgaXQgY29udGFpbnMgYSBkb3Q6ICovCisgICAgICBpZiAoc3RyY2hyIChzcGVjLCAnLicpKQorCXsKKwkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKKwkgIGlmICghc3ltLT5maWxlKQorCSAgICB7CisJICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzcGVjKSkKKwl7CisJICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7CisJfQorICAgICAgZWxzZSBpZiAoc3RybGVuIChzcGVjKSkKKwl7CisJICBzeW0tPm5hbWUgPSBzcGVjOworCX0KKyAgICB9Cit9CisKKworLyoKKyAqIEEgc3ltYm9sIGlkIGhhcyB0aGUgc3ludGF4IFNQRUNbL1NQRUNdLCB3aGVyZSBTUEVDIGlzIGlzIGRlZmluZWQKKyAqIGJ5IHBhcnNlX3NwZWMoKS4KKyAqLworc3RhdGljIHZvaWQKK0RFRlVOIChwYXJzZV9pZCwgKGlkKSwgc3RydWN0IHN5bV9pZCAqaWQpCit7CisgIGNoYXIgKnNsYXNoOworCisgIERCRyAoSURERUJVRywgcHJpbnRmICgiW3BhcnNlX2lkXSAlcyAtPiAiLCBpZC0+c3BlYykpOworCisgIHNsYXNoID0gc3RyY2hyIChpZC0+c3BlYywgJy8nKTsKKyAgaWYgKHNsYXNoKQorICAgIHsKKyAgICAgIHBhcnNlX3NwZWMgKHNsYXNoICsgMSwgJmlkLT5yaWdodC5zeW0pOworICAgICAgKnNsYXNoID0gJ1wwJzsKKyAgICAgIGlkLT5oYXNfcmlnaHQgPSBUUlVFOworICAgIH0KKyAgcGFyc2Vfc3BlYyAoaWQtPnNwZWMsICZpZC0+bGVmdC5zeW0pOworCisjaWZkZWYgREVCVUcKKyAgaWYgKGRlYnVnX2xldmVsICYgSURERUJVRykKKyAgICB7CisgICAgICBwcmludGYgKCIlczoiLCBpZC0+bGVmdC5zeW0uZmlsZSA/IGlkLT5sZWZ0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKKyAgICAgIGlmIChpZC0+bGVmdC5zeW0ubmFtZSkKKwl7CisJICBwcmludGYgKCIlcyIsIGlkLT5sZWZ0LnN5bS5uYW1lKTsKKwl9CisgICAgICBlbHNlIGlmIChpZC0+bGVmdC5zeW0ubGluZV9udW0pCisJeworCSAgcHJpbnRmICgiJWQiLCBpZC0+bGVmdC5zeW0ubGluZV9udW0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKCIqIik7CisJfQorICAgICAgaWYgKGlkLT5oYXNfcmlnaHQpCisJeworCSAgcHJpbnRmICgiLyVzOiIsCisJCSAgaWQtPnJpZ2h0LnN5bS5maWxlID8gaWQtPnJpZ2h0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKKwkgIGlmIChpZC0+cmlnaHQuc3ltLm5hbWUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlcyIsIGlkLT5yaWdodC5zeW0ubmFtZSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGlkLT5yaWdodC5zeW0ubGluZV9udW0pCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlZCIsIGlkLT5yaWdodC5zeW0ubGluZV9udW0pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGYgKCIqIik7CisJICAgIH0KKwl9CisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KKyNlbmRpZgorfQorCisKKy8qCisgKiBSZXR1cm4gVFJVRSBpZmYgUEFUVEVSTiBtYXRjaGVzIFNZTS4KKyAqLworc3RhdGljIGJvb2wKK0RFRlVOIChtYXRjaCwgKHBhdHRlcm4sIHN5bSksIFN5bSAqIHBhdHRlcm4gQU5EIFN5bSAqIHN5bSkKK3sKKyAgcmV0dXJuIChwYXR0ZXJuLT5maWxlID8gcGF0dGVybi0+ZmlsZSA9PSBzeW0tPmZpbGUgOiBUUlVFKQorICAgICYmIChwYXR0ZXJuLT5saW5lX251bSA/IHBhdHRlcm4tPmxpbmVfbnVtID09IHN5bS0+bGluZV9udW0gOiBUUlVFKQorICAgICYmIChwYXR0ZXJuLT5uYW1lID8gc3RyY21wIChwYXR0ZXJuLT5uYW1lLCBzeW0tPm5hbWUpID09IDAgOiBUUlVFKTsKK30KKworCitzdGF0aWMgdm9pZAorREVGVU4gKGV4dGVuZF9tYXRjaCwgKG0sIHN5bSwgdGFiLCBzZWNvbmRfcGFzcyksCisgICAgIHN0cnVjdCBtYXRjaCAqbSBBTkQgU3ltICogc3ltIEFORCBTeW1fVGFibGUgKiB0YWIgQU5EIGJvb2wgc2Vjb25kX3Bhc3MpCit7CisgIGlmIChtLT5wcmV2X21hdGNoICE9IHN5bSAtIDEpCisgICAgeworICAgICAgLyogZGlzY29udGludWl0eTogYWRkIG5ldyBtYXRjaCB0byB0YWJsZTogKi8KKyAgICAgIGlmIChzZWNvbmRfcGFzcykKKwl7CisJICB0YWItPmJhc2VbdGFiLT5sZW5dID0gKnN5bTsKKwkgIG0tPnByZXZfaW5kZXggPSB0YWItPmxlbjsKKworCSAgLyogbGluayBtYXRjaCBpbnRvIG1hdGNoJ3MgY2hhaW46ICovCisJICB0YWItPmJhc2VbdGFiLT5sZW5dLm5leHQgPSBtLT5maXJzdF9tYXRjaDsKKwkgIG0tPmZpcnN0X21hdGNoID0gJnRhYi0+YmFzZVt0YWItPmxlbl07CisJfQorICAgICAgKyt0YWItPmxlbjsKKyAgICB9CisKKyAgLyogZXh0ZW5kIG1hdGNoIHRvIGluY2x1ZGUgdGhpcyBzeW1ib2w6ICovCisgIGlmIChzZWNvbmRfcGFzcykKKyAgICB7CisgICAgICB0YWItPmJhc2VbbS0+cHJldl9pbmRleF0uZW5kX2FkZHIgPSBzeW0tPmVuZF9hZGRyOworICAgIH0KKyAgbS0+cHJldl9tYXRjaCA9IHN5bTsKK30KKworCisvKgorICogR28gdGhyb3VnaCBzeW1faWQgbGlzdCBwcm9kdWNlZCBieSBvcHRpb24gcHJvY2Vzc2luZyBhbmQgZmlsbAorICogaW4gdGhlIHZhcmlvdXMgc3ltYm9sIHRhYmxlcyBpbmRpY2F0aW5nIHdoYXQgc3ltYm9scyBzaG91bGQKKyAqIGJlIGRpc3BsYXllZCBvciBzdXBwcmVzc2VkIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZiBvdXRwdXRzLgorICoKKyAqIFRoaXMgY2FuIHBvdGVudGlhbGx5IHByb2R1Y2UgaHVnZSB0YWJsZXMgYW5kIGluIHBhcnRpY3VsYXJzCisgKiB0b25zIG9mIGFyY3MsIGJ1dCB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGUgdXNlciBtYWtlcyBzaWxseQorICogcmVxdWVzdHMtLS15b3UgZ2V0IHdoYXQgeW91IGFzayBmb3IhCisgKi8KK3ZvaWQKK0RFRlVOX1ZPSUQgKHN5bV9pZF9wYXJzZSkKK3sKKyAgU3ltICpzeW0sICpsZWZ0LCAqcmlnaHQ7CisgIHN0cnVjdCBzeW1faWQgKmlkOworICBTeW1fVGFibGUgKnRhYjsKKworICAvKgorICAgKiBDb252ZXJ0IHN5bWJvbCBpZHMgaW50byBTeW1zLCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoZW0gbW9yZSBlYXNpbHk6CisgICAqLworICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCisgICAgeworICAgICAgcGFyc2VfaWQgKGlkKTsKKyAgICB9CisKKyAgLyogZmlyc3QgZGV0ZXJtaW5lIHNpemUgb2YgZWFjaCB0YWJsZTogKi8KKworICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQorICAgIHsKKyAgICAgIGZvciAoaWQgPSBpZF9saXN0OyBpZDsgaWQgPSBpZC0+bmV4dCkKKwl7CisJICBpZiAobWF0Y2ggKCZpZC0+bGVmdC5zeW0sIHN5bSkpCisJICAgIHsKKwkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+bGVmdCwgc3ltLCAmc3ltc1tpZC0+d2hpY2hfdGFibGVdLCBGQUxTRSk7CisJICAgIH0KKwkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKKwkgICAgeworCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBGQUxTRSk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIGNyZWF0ZSB0YWJsZXMgb2YgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmVzZXQgbGVuZ3RoczogKi8KKworICBmb3IgKHRhYiA9IHN5bXM7IHRhYiA8ICZzeW1zW05VTV9UQUJMRVNdOyArK3RhYikKKyAgICB7CisgICAgICBpZiAodGFiLT5sZW4pCisJeworCSAgdGFiLT5iYXNlID0gKFN5bSAqKSB4bWFsbG9jICh0YWItPmxlbiAqIHNpemVvZiAoU3ltKSk7CisJICB0YWItPmxpbWl0ID0gdGFiLT5iYXNlICsgdGFiLT5sZW47CisJICB0YWItPmxlbiA9IDA7CisJfQorICAgIH0KKyAgaWYgKHJpZ2h0X2lkcy5sZW4pCisgICAgeworICAgICAgcmlnaHRfaWRzLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKHJpZ2h0X2lkcy5sZW4gKiBzaXplb2YgKFN5bSkpOworICAgICAgcmlnaHRfaWRzLmxpbWl0ID0gcmlnaHRfaWRzLmJhc2UgKyByaWdodF9pZHMubGVuOworICAgICAgcmlnaHRfaWRzLmxlbiA9IDA7CisgICAgfQorCisgIC8qIG1ha2UgYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHN5bXRhYiwgY3JlYXRpbmcgc3ltcyBhcyBuZWNlc3Nhcnk6ICovCisKKyAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCisJeworCSAgaWYgKG1hdGNoICgmaWQtPmxlZnQuc3ltLCBzeW0pKQorCSAgICB7CisJICAgICAgZXh0ZW5kX21hdGNoICgmaWQtPmxlZnQsIHN5bSwgJnN5bXNbaWQtPndoaWNoX3RhYmxlXSwgVFJVRSk7CisJICAgIH0KKwkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKKwkgICAgeworCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBUUlVFKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogZ28gdGhyb3VnaCBpZHMgY3JlYXRpbmcgYXJjcyBhcyBuZWVkZWQ6ICovCisKKyAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChpZC0+aGFzX3JpZ2h0KQorCXsKKwkgIGZvciAobGVmdCA9IGlkLT5sZWZ0LmZpcnN0X21hdGNoOyBsZWZ0OyBsZWZ0ID0gbGVmdC0+bmV4dCkKKwkgICAgeworCSAgICAgIGZvciAocmlnaHQgPSBpZC0+cmlnaHQuZmlyc3RfbWF0Y2g7IHJpZ2h0OyByaWdodCA9IHJpZ2h0LT5uZXh0KQorCQl7CisJCSAgREJHIChJRERFQlVHLAorCQkgICAgICAgcHJpbnRmICgKKwkJCQkiW3N5bV9pZF9wYXJzZV06IGFyYyAlczolcyglbHgtJWx4KSAtPiAlczolcyglbHgtJWx4KSB0byAlc1xuIiwKKwkJCQlsZWZ0LT5maWxlID8gbGVmdC0+ZmlsZS0+bmFtZSA6ICIqIiwKKwkJCQlsZWZ0LT5uYW1lID8gbGVmdC0+bmFtZSA6ICIqIiwgbGVmdC0+YWRkciwKKwkJCQlsZWZ0LT5lbmRfYWRkciwKKwkJCQlyaWdodC0+ZmlsZSA/IHJpZ2h0LT5maWxlLT5uYW1lIDogIioiLAorCQkJCXJpZ2h0LT5uYW1lID8gcmlnaHQtPm5hbWUgOiAiKiIsIHJpZ2h0LT5hZGRyLAorCQkJCXJpZ2h0LT5lbmRfYWRkciwKKwkJCQl0YWJsZV9uYW1lW2lkLT53aGljaF90YWJsZV0pKTsKKwkJICBhcmNfYWRkIChsZWZ0LCByaWdodCwgKHVuc2lnbmVkIGxvbmcpIDApOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIGZpbmFsbHksIHdlIGNhbiBzb3J0IHRoZSB0YWJsZXMgYW5kIHdlJ3JlIGRvbmU6ICovCisKKyAgZm9yICh0YWIgPSAmc3ltc1swXTsgdGFiIDwgJnN5bXNbTlVNX1RBQkxFU107ICsrdGFiKQorICAgIHsKKyAgICAgIERCRyAoSURERUJVRywgcHJpbnRmICgiW3N5bV9pZF9wYXJzZV0gc3ltc1slc106XG4iLAorCQkJICAgIHRhYmxlX25hbWVbdGFiIC0gJnN5bXNbMF1dKSk7CisgICAgICBzeW10YWJfZmluYWxpemUgKHRhYik7CisgICAgfQorfQorCisKKy8qCisgKiBTeW1ib2wgdGFibGVzIHN0b3JpbmcgdGhlIEZST00gc3ltYm9scyBvZiBhcmNzIGRvIG5vdCBuZWNlc3NhcmlseQorICogaGF2ZSBkaXN0aW5jdCBhZGRyZXNzIHJhbmdlcy4gIEZvciBleGFtcGxlLCBzb21lYm9keSBtaWdodCByZXF1ZXN0CisgKiAtayAvX21jb3VudCB0byBzdXBwcmVzcyBhbnkgYXJjcyBpbnRvIF9tY291bnQsIHdoaWxlIGF0IHRoZSBzYW1lCisgKiB0aW1lIHJlcXVlc3RpbmcgLWsgYS9iLiAgRm9ydHVuYXRlbHksIHRob3NlIHN5bWJvbCB0YWJsZXMgZG9uJ3QgZ2V0CisgKiB2ZXJ5IGJpZyAodGhlIHVzZXIgaGFzIHRvIHR5cGUgdGhlbSEpLCBzbyBhIGxpbmVhciBzZWFyY2ggaXMgcHJvYmFibHkKKyAqIHRvbGVyYWJsZS4KKyAqLworYm9vbAorREVGVU4gKHN5bV9pZF9hcmNfaXNfcHJlc2VudCwgKHN5bXRhYiwgZnJvbSwgdG8pLAorICAgICAgIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgU3ltICogZnJvbSBBTkQgU3ltICogdG8pCit7CisgIFN5bSAqc3ltOworCisgIGZvciAoc3ltID0gc3ltdGFiLT5iYXNlOyBzeW0gPCBzeW10YWItPmxpbWl0OyArK3N5bSkKKyAgICB7CisgICAgICBpZiAoZnJvbS0+YWRkciA+PSBzeW0tPmFkZHIgJiYgZnJvbS0+YWRkciA8PSBzeW0tPmVuZF9hZGRyCisJICAmJiBhcmNfbG9va3VwIChzeW0sIHRvKSkKKwl7CisJICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmggYi9ncHJvZi9zeW1faWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL3N5bV9pZHMuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIHN5bV9pZHNfaAorI2RlZmluZSBzeW1faWRzX2gKKworI2luY2x1ZGUgInN5bXRhYi5oIgorCit0eXBlZGVmIGVudW0KKyAgeworICAgIElOQ0xfR1JBUEggPSAwLCBFWENMX0dSQVBILAorICAgIElOQ0xfQVJDUywgRVhDTF9BUkNTLAorICAgIElOQ0xfRkxBVCwgRVhDTF9GTEFULAorICAgIElOQ0xfVElNRSwgRVhDTF9USU1FLAorICAgIElOQ0xfQU5OTywgRVhDTF9BTk5PLAorICAgIElOQ0xfRVhFQywgRVhDTF9FWEVDLAorICAgIE5VTV9UQUJMRVMKKyAgfQorVGFibGVfSWQ7CisKK2V4dGVybiBTeW1fVGFibGUgc3ltc1tOVU1fVEFCTEVTXTsKKworZXh0ZXJuIHZvaWQgc3ltX2lkX2FkZCBQQVJBTVMgKChjb25zdCBjaGFyICpzcGVjLCBUYWJsZV9JZCB3aGljaF90YWJsZSkpOworZXh0ZXJuIHZvaWQgc3ltX2lkX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBib29sIHN5bV9pZF9hcmNfaXNfcHJlc2VudCBQQVJBTVMgKChTeW1fVGFibGUgKiBzeW10YWIsCisJCQkJCSAgIFN5bSAqIGZyb20sIFN5bSAqIHRvKSk7CisKKyNlbmRpZiAvKiBzeW1faWRzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bXRhYi5jIGIvZ3Byb2Yvc3ltdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYzY1NwotLS0gL2Rldi9udWxsCisrKyBiL2dwcm9mL3N5bXRhYi5jCkBAIC0wLDAgKzEsMjY5IEBACisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJjZ19hcmNzLmgiCisjaW5jbHVkZSAiY29yZWZpbGUuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworU3ltX1RhYmxlIHN5bXRhYjsKKworCisvKgorICogSW5pdGlhbGl6ZSBhIHN5bWJvbCAoc28gaXQncyBlbXB0eSkuCisgKi8KK3ZvaWQKK0RFRlVOIChzeW1faW5pdCwgKHN5bSksIFN5bSAqIHN5bSkKK3sKKyAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoKnN5bSkpOworICAvKgorICAgKiBJdCBpcyBub3Qgc2FmZSB0byBhc3N1bWUgdGhhdCBhIGJpbmFyeSB6ZXJvIGNvcnJlc3BvbmRzIHRvCisgICAqIGEgZmxvYXRpbmctcG9pbnQgMC4wLCBzbyBpbml0aWFsaXplIGZsb2F0cyBleHBsaWNpdGx5OgorICAgKi8KKyAgc3ltLT5oaXN0LnRpbWUgPSAwLjA7CisgIHN5bS0+Y2cuY2hpbGRfdGltZSA9IDAuMDsKKyAgc3ltLT5jZy5wcm9wLmZyYWN0ID0gMC4wOworICBzeW0tPmNnLnByb3Auc2VsZiA9IDAuMDsKKyAgc3ltLT5jZy5wcm9wLmNoaWxkID0gMC4wOworfQorCisKKy8qCisgKiBDb21wYXJlIHRoZSBmdW5jdGlvbiBlbnRyeS1wb2ludCBvZiB0d28gc3ltYm9scyBhbmQgcmV0dXJuIDwwLCA9MCwKKyAqIG9yID4wIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBsZWZ0IHZhbHVlIGlzIHNtYWxsZXIgdGhhbiwgZXF1YWwKKyAqIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHJpZ2h0IHZhbHVlLiAgSWYgdHdvIHN5bWJvbHMgYXJlIGVxdWFsCisgKiBidXQgb25lIGhhcyBpc19mdW5jIHNldCBhbmQgdGhlIG90aGVyIGRvZXNuJ3QsIHdlIG1ha2UgdGhlCisgKiBub24tZnVuY3Rpb24gc3ltYm9sIG9uZSAiYmlnZ2VyIiBzbyB0aGF0IHRoZSBmdW5jdGlvbiBzeW1ib2wgd2lsbAorICogc3Vydml2ZSBkdXBsaWNhdGUgcmVtb3ZhbC4gIEZpbmFsbHksIGlmIGJvdGggc3ltYm9scyBoYXZlIHRoZQorICogc2FtZSBpc19mdW5jIHZhbHVlLCB3ZSBkaXNjcmltaW5hdGUgYWdhaW5zdCBpc19zdGF0aWMgc3VjaCB0aGF0CisgKiB0aGUgZ2xvYmFsIHN5bWJvbCBzdXJ2aXZlcy4KKyAqLworc3RhdGljIGludAorREVGVU4gKGNtcF9hZGRyLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCit7CisgIFN5bSAqbGVmdCA9IChTeW0gKikgbHA7CisgIFN5bSAqcmlnaHQgPSAoU3ltICopIHJwOworCisgIGlmIChsZWZ0LT5hZGRyID4gcmlnaHQtPmFkZHIpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlIGlmIChsZWZ0LT5hZGRyIDwgcmlnaHQtPmFkZHIpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAobGVmdC0+aXNfZnVuYyAhPSByaWdodC0+aXNfZnVuYykKKyAgICB7CisgICAgICByZXR1cm4gcmlnaHQtPmlzX2Z1bmMgLSBsZWZ0LT5pc19mdW5jOworICAgIH0KKworICByZXR1cm4gbGVmdC0+aXNfc3RhdGljIC0gcmlnaHQtPmlzX3N0YXRpYzsKK30KKworCit2b2lkCitERUZVTiAoc3ltdGFiX2ZpbmFsaXplLCAodGFiKSwgU3ltX1RhYmxlICogdGFiKQoreworICBTeW0gKnNyYywgKmRzdDsKKyAgYmZkX3ZtYSBwcmV2X2FkZHI7CisKKyAgaWYgKCF0YWItPmxlbikKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qCisgICAqIFNvcnQgc3ltYm9sIHRhYmxlIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgZnVuY3Rpb24gYWRkcmVzc2VzOgorICAgKi8KKyAgcXNvcnQgKHRhYi0+YmFzZSwgdGFiLT5sZW4sIHNpemVvZiAoU3ltKSwgY21wX2FkZHIpOworCisgIC8qCisgICAqIFJlbW92ZSBkdXBsaWNhdGUgZW50cmllcyB0byBzcGVlZC11cCBsYXRlciBwcm9jZXNzaW5nIGFuZAorICAgKiBzZXQgZW5kX2FkZHIgaWYgaXRzIG5vdCBzZXQgeWV0OgorICAgKi8KKyAgcHJldl9hZGRyID0gdGFiLT5iYXNlWzBdLmFkZHIgKyAxOworICBmb3IgKHNyYyA9IGRzdCA9IHRhYi0+YmFzZTsgc3JjIDwgdGFiLT5saW1pdDsgKytzcmMpCisgICAgeworICAgICAgaWYgKHNyYy0+YWRkciA9PSBwcmV2X2FkZHIpCisJeworCSAgLyoKKwkgICAqIElmIHNhbWUgYWRkcmVzcywgZmF2b3IgZ2xvYmFsIHN5bWJvbCBvdmVyIHN0YXRpYyBvbmUsCisJICAgKiB0aGVuIGZ1bmN0aW9uIG92ZXIgbGluZSBudW1iZXIuICBJZiBib3RoIHN5bWJvbHMgYXJlCisJICAgKiBlaXRoZXIgc3RhdGljIG9yIGdsb2JhbCBhbmQgZWl0aGVyIGZ1bmN0aW9uIG9yIGxpbmUsIGNoZWNrCisJICAgKiB3aGV0aGVyIG9uZSBoYXMgbmFtZSBiZWdpbm5pbmcgd2l0aCB1bmRlcnNjb3JlIHdoaWxlCisJICAgKiB0aGUgb3RoZXIgZG9lc24ndC4gIEluIHN1Y2ggY2FzZXMsIGtlZXAgc3ltIHdpdGhvdXQKKwkgICAqIHVuZGVyc2NvcmUuICBUaGlzIHRha2VzIGNhcmVzIG9mIGNvbXBpbGVyIGdlbmVyYXRlZAorCSAgICogc3ltYm9scyAoc3VjaCBhcyBfX2dudV9jb21waWxlZCwgX19jODlfdXNlZCwgZXRjLikuCisJICAgKi8KKwkgIGlmICgoIXNyYy0+aXNfc3RhdGljICYmIGRzdFstMV0uaXNfc3RhdGljKQorCSAgICAgIHx8ICgoc3JjLT5pc19zdGF0aWMgPT0gZHN0Wy0xXS5pc19zdGF0aWMpCisJCSAgJiYgKChzcmMtPmlzX2Z1bmMgJiYgIWRzdFstMV0uaXNfZnVuYykKKwkJICAgICAgfHwgKChzcmMtPmlzX2Z1bmMgPT0gZHN0Wy0xXS5pc19mdW5jKQorCQkJICAmJiAoKHNyYy0+bmFtZVswXSAhPSAnXycgJiYgZHN0Wy0xXS5uYW1lWzBdID09ICdfJykKKwkJCSAgICAgIHx8IChzcmMtPm5hbWVbMF0KKwkJCQkgICYmIHNyYy0+bmFtZVsxXSAhPSAnXycKKwkJCQkgICYmIGRzdFstMV0ubmFtZVsxXSA9PSAnXycpKSkpKSkKKwkgICAgeworCSAgICAgIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKKwkJICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV0gZmF2b3IgJXNAJWMlYyBvdmVyICVzQCVjJWMiLAorCQkJICAgc3JjLT5uYW1lLCBzcmMtPmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKKwkJCSAgIHNyYy0+aXNfZnVuYyA/ICdGJyA6ICdmJywKKwkJCSAgIGRzdFstMV0ubmFtZSwgZHN0Wy0xXS5pc19zdGF0aWMgPyAndCcgOiAnVCcsCisJCQkgICBkc3RbLTFdLmlzX2Z1bmMgPyAnRicgOiAnZicpOworCQkgICBwcmludGYgKCIgKGFkZHI9JWx4KVxuIiwgc3JjLT5hZGRyKSk7CisJICAgICAgZHN0Wy0xXSA9ICpzcmM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKKwkJICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV0gZmF2b3IgJXNAJWMlYyBvdmVyICVzQCVjJWMiLAorCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKKwkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJywKKwkJCSAgIHNyYy0+bmFtZSwgc3JjLT5pc19zdGF0aWMgPyAndCcgOiAnVCcsCisJCQkgICBzcmMtPmlzX2Z1bmMgPyAnRicgOiAnZicpOworCQkgICBwcmludGYgKCIgKGFkZHI9JWx4KVxuIiwgc3JjLT5hZGRyKSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGRzdCA+IHRhYi0+YmFzZSAmJiBkc3RbLTFdLmVuZF9hZGRyID09IDApCisJICAgIHsKKwkgICAgICBkc3RbLTFdLmVuZF9hZGRyID0gc3JjLT5hZGRyIC0gMTsKKwkgICAgfQorCisJICAvKiByZXRhaW4gc3ltIG9ubHkgaWYgaXQgaGFzIGEgbm9uLWVtcHR5IGFkZHJlc3MgcmFuZ2U6ICovCisJICBpZiAoIXNyYy0+ZW5kX2FkZHIgfHwgc3JjLT5hZGRyIDw9IHNyYy0+ZW5kX2FkZHIpCisJICAgIHsKKwkgICAgICAqZHN0KysgPSAqc3JjOworCSAgICAgIHByZXZfYWRkciA9IHNyYy0+YWRkcjsKKwkgICAgfQorCX0KKyAgICB9CisgIGlmICh0YWItPmxlbiA+IDAgJiYgZHN0Wy0xXS5lbmRfYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGRzdFstMV0uZW5kX2FkZHIgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgY29yZV90ZXh0X3NlY3QtPl9yYXdfc2l6ZSAtIDE7CisgICAgfQorCisgIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKKyAgICAgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXTogcmVtb3ZlZCAlZCBkdXBsaWNhdGUgZW50cmllc1xuIiwKKwkgICAgICAgdGFiLT5sZW4gLSAoaW50KSAoZHN0IC0gdGFiLT5iYXNlKSkpOworCisgIHRhYi0+bGltaXQgPSBkc3Q7CisgIHRhYi0+bGVuID0gdGFiLT5saW1pdCAtIHRhYi0+YmFzZTsKKworICBEQkcgKEFPVVRERUJVRyB8IElEREVCVUcsCisgICAgICAgdW5zaWduZWQgaW50IGo7CisKKyAgICAgICBmb3IgKGogPSAwOyBqIDwgdGFiLT5sZW47ICsraikKKyAgICAgICB7CisgICAgICAgcHJpbnRmICgiW3N5bXRhYl9maW5hbGl6ZV0gMHglbHgtMHglbHhcdCVzXG4iLAorCSAgICAgICAobG9uZykgdGFiLT5iYXNlW2pdLmFkZHIsIChsb25nKSB0YWItPmJhc2Vbal0uZW5kX2FkZHIsCisJICAgICAgIHRhYi0+YmFzZVtqXS5uYW1lKTsKKyAgICAgICB9CisgICk7Cit9CisKKworI2lmZGVmIERFQlVHCisKK1N5bSAqCitERUZVTiAoZGJnX3N5bV9sb29rdXAsIChzeW10YWIsIGFkZHJlc3MpLCBTeW1fVGFibGUgKiBzeW10YWIgQU5EIGJmZF92bWEgYWRkcmVzcykKK3sKKyAgbG9uZyBsb3csIG1pZCwgaGlnaDsKKyAgU3ltICpzeW07CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiW2RiZ19zeW1fbG9va3VwXSBhZGRyZXNzIDB4JWx4XG4iLCBhZGRyZXNzKTsKKworICBzeW0gPSBzeW10YWItPmJhc2U7CisgIGZvciAobG93ID0gMCwgaGlnaCA9IHN5bXRhYi0+bGVuIC0gMTsgbG93ICE9IGhpZ2g7KQorICAgIHsKKyAgICAgIG1pZCA9IChoaWdoICsgbG93KSA+PiAxOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2RiZ19zeW1fbG9va3VwXSBsb3c9MHglbHgsIG1pZD0weCVseCwgaGlnaD0weCVseFxuIiwKKwkgICAgICAgbG93LCBtaWQsIGhpZ2gpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW2RiZ19zeW1fbG9va3VwXSBzeW1bbV09MHglbHggc3ltW20gKyAxXT0weCVseFxuIiwKKwkgICAgICAgc3ltW21pZF0uYWRkciwgc3ltW21pZCArIDFdLmFkZHIpOworICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCisJeworCSAgcmV0dXJuICZzeW1bbWlkXTsKKwl9CisgICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCisJeworCSAgaGlnaCA9IG1pZDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbG93ID0gbWlkICsgMTsKKwl9CisgICAgfQorICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGJpbmFyeSBzZWFyY2ggZmFpbHM/Pz9cbiIpOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIERFQlVHICovCisKKworLyoKKyAqIExvb2sgdXAgYW4gYWRkcmVzcyBpbiB0aGUgc3ltYm9sLXRhYmxlIHRoYXQgaXMgc29ydGVkIGJ5IGFkZHJlc3MuCisgKiBJZiBhZGRyZXNzIGRvZXMgbm90IGhpdCBhbnkgc3ltYm9sLCAwIGlzIHJldHVybmVkLgorICovCitTeW0gKgorREVGVU4gKHN5bV9sb29rdXAsIChzeW10YWIsIGFkZHJlc3MpLCBTeW1fVGFibGUgKiBzeW10YWIgQU5EIGJmZF92bWEgYWRkcmVzcykKK3sKKyAgbG9uZyBsb3csIGhpZ2g7CisgIGxvbmcgbWlkID0gLTE7CisgIFN5bSAqc3ltOworI2lmZGVmIERFQlVHCisgIGludCBwcm9iZXMgPSAwOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgaWYgKCFzeW10YWItPmxlbikKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3ltID0gc3ltdGFiLT5iYXNlOworICBmb3IgKGxvdyA9IDAsIGhpZ2ggPSBzeW10YWItPmxlbiAtIDE7IGxvdyAhPSBoaWdoOykKKyAgICB7CisgICAgICBEQkcgKExPT0tVUERFQlVHLCArK3Byb2Jlcyk7CisgICAgICBtaWQgPSAoaGlnaCArIGxvdykgLyAyOworICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPD0gYWRkcmVzcyAmJiBzeW1bbWlkICsgMV0uYWRkciA+IGFkZHJlc3MpCisJeworCSAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkXS5lbmRfYWRkcikKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogQWRkcmVzcyBmYWxscyBpbnRvIGdhcCBiZXR3ZWVuIHN5bVttaWRdIGFuZAorCSAgICAgICAqIHN5bVttaWQgKyAxXToKKwkgICAgICAgKi8KKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgREJHIChMT09LVVBERUJVRywKKwkJICAgcHJpbnRmICgiW3N5bV9sb29rdXBdICVkIHByb2JlcyAoc3ltdGFiLT5sZW49JXUpXG4iLAorCQkJICAgcHJvYmVzLCBzeW10YWItPmxlbiAtIDEpKTsKKwkgICAgICByZXR1cm4gJnN5bVttaWRdOworCSAgICB9CisJfQorICAgICAgaWYgKHN5bVttaWRdLmFkZHIgPiBhZGRyZXNzKQorCXsKKwkgIGhpZ2ggPSBtaWQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxvdyA9IG1pZCArIDE7CisJfQorICAgIH0KKyAgaWYgKHN5bVttaWQgKyAxXS5hZGRyIDw9IGFkZHJlc3MpCisgICAgeworICAgICAgaWYgKGFkZHJlc3MgPiBzeW1bbWlkICsgMV0uZW5kX2FkZHIpCisJeworCSAgLyogYWRkcmVzcyBpcyBiZXlvbmQgZW5kIG9mIHN5bVttaWQgKyAxXTogKi8KKwkgIHJldHVybiAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBEQkcgKExPT0tVUERFQlVHLCBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgKCV1KSBwcm9iZXMsIGZhbGwgb2ZmXG4iLAorCQkJCSAgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOworCSAgcmV0dXJuICZzeW1bbWlkICsgMV07CisJfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuaCBiL2dwcm9mL3N5bXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTQ1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi9zeW10YWIuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBzeW10YWJfaAorI2RlZmluZSBzeW10YWJfaAorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZ3Byb2YuaCIKKworLyoKKyAqIEZvciBhIHByb2ZpbGUgdG8gYmUgaW50ZWxsaWdpYmxlIHRvIGEgaHVtYW4gdXNlciwgaXQgaXMgbmVjZXNzYXJ5CisgKiB0byBtYXAgY29kZS1hZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZSBpbmZvcm1hdGlvbi4gIFNvdXJjZS1jb2RlCisgKiBpbmZvcm1hdGlvbiBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mOiAoaSkgZnVuY3Rpb24tbmFtZSwgKGlpKQorICogc291cmNlIGZpbGUtbmFtZSwgYW5kIChpaWkpIHNvdXJjZSBsaW5lIG51bWJlci4KKyAqCisgKiBUaGUgc3ltYm9sIHRhYmxlIGlzIHVzZWQgdG8gbWFwIGFkZHJlc3NlcyBpbnRvIHNvdXJjZS1jb2RlCisgKiBpbmZvcm1hdGlvbi4KKyAqLworCisjaW5jbHVkZSAic291cmNlLmgiCisKKyNkZWZpbmUgTkJCUyAxMAorCisvKgorICogU3ltYm9sLWVudHJ5LiAgRm9yIGVhY2ggZXh0ZXJuYWwgaW4gdGhlIHNwZWNpZmllZCBmaWxlIHdlIGdhdGhlcgorICogaXRzIGFkZHJlc3MsIHRoZSBudW1iZXIgb2YgY2FsbHMgYW5kIGNvbXB1dGUgaXRzIHNoYXJlIG9mIGNwdSB0aW1lLgorICovCit0eXBlZGVmIHN0cnVjdCBzeW0KKyAgeworICAgIC8qCisgICAgICogQ29tbW9uIGluZm9ybWF0aW9uOgorICAgICAqCisgICAgICogSW4gdGhlIHN5bWJvbC10YWJsZSwgZmllbGRzIEFERFIgYW5kIEZVTkNfTkFNRSBhcmUgZ3VhcmFudGVlZAorICAgICAqIHRvIGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICBGSUxFIG1heSBiZSAwLCBpZiB1bmtub3duIGFuZAorICAgICAqIExJTkVfTlVNIG1heWJlIDAgaWYgdW5rbm93bi4KKyAgICAgKi8KKyAgICBiZmRfdm1hIGFkZHI7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICovCisgICAgYmZkX3ZtYSBlbmRfYWRkcjsJCS8qIGVuZC1hZGRyZXNzICovCisgICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgZnVuY3Rpb24gdGhpcyBzeW0gaXMgZnJvbSAqLworICAgIFNvdXJjZV9GaWxlICpmaWxlOwkJLyogc291cmNlIGZpbGUgc3ltYm9sIGNvbWVzIGZyb20gKi8KKyAgICBpbnQgbGluZV9udW07CQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgaXNfZnVuYzoxLAkvKiBpcyB0aGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQ/ICovCisgICAgICBpc19zdGF0aWM6MSwJCS8qIGlzIHRoaXMgYSBsb2NhbCAoc3RhdGljKSBzeW1ib2w/ICovCisgICAgICBpc19iYl9oZWFkOjEsCQkvKiBpcyB0aGlzIHRoZSBoZWFkIG9mIGEgYmFzaWMtYmxrPyAqLworICAgICAgbWFwcGVkOjEsCQkJLyogdGhpcyBzeW1ib2wgd2FzIG1hcHBlZCB0byBhbm90aGVyIG5hbWUgKi8KKyAgICAgIGhhc19iZWVuX3BsYWNlZDoxOwkvKiBoYXZlIHdlIHBsYWNlZCB0aGlzIHN5bWJvbD8gICovCisgICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7CS8qIGhvdyBtYW55IHRpbWVzIGV4ZWN1dGVkICovCisgICAgaW50IG51c2VzOwkJCS8qIGhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGFwcGVhcnMgaW4KKwkJCQkgICBhIHBhcnRpY3VsYXIgY29udGV4dCAqLworICAgIGJmZF92bWEgYmJfYWRkcltOQkJTXTsJLyogYWRkcmVzcyBvZiBiYXNpYy1ibG9jayBzdGFydCAqLworICAgIHVuc2lnbmVkIGxvbmcgYmJfY2FsbHNbTkJCU107IC8qIGhvdyBtYW55IHRpbWVzIGJhc2ljLWJsb2NrIHdhcyBjYWxsZWQgKi8KKyAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkJLyogZm9yIGJ1aWxkaW5nIGNoYWlucyBvZiBzeW1zICovCisgICAgc3RydWN0IHN5bSAqcHJldjsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLworCisgICAgLyogcHJvZmlsZS1zcGVjaWZpYyBpbmZvcm1hdGlvbjogKi8KKworICAgIC8qIGhpc3RvZ3JhbSBzcGVjaWZpYyBpbmZvOiAqLworICAgIHN0cnVjdAorICAgICAgeworCWRvdWJsZSB0aW1lOwkJLyogKHdlaWdodGVkKSB0aWNrcyBpbiB0aGlzIHJvdXRpbmUgKi8KKwliZmRfdm1hIHNjYWxlZF9hZGRyOwkvKiBzY2FsZWQgZW50cnkgcG9pbnQgKi8KKyAgICAgIH0KKyAgICBoaXN0OworCisgICAgLyogY2FsbC1ncmFwaCBzcGVjaWZpYyBpbmZvOiAqLworICAgIHN0cnVjdAorICAgICAgeworCXVuc2lnbmVkIGxvbmcgc2VsZl9jYWxsczsgLyogaG93IG1hbnkgY2FsbHMgdG8gc2VsZiAqLworCWRvdWJsZSBjaGlsZF90aW1lOwkvKiBjdW11bGF0aXZlIHRpY2tzIGluIGNoaWxkcmVuICovCisJaW50IGluZGV4OwkJLyogaW5kZXggaW4gdGhlIGdyYXBoIGxpc3QgKi8KKwlpbnQgdG9wX29yZGVyOwkJLyogZ3JhcGggY2FsbCBjaGFpbiB0b3Atc29ydCBvcmRlciAqLworCWJvb2wgcHJpbnRfZmxhZzsJLyogc2hvdWxkIHRoaXMgYmUgcHJpbnRlZD8gKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgZG91YmxlIGZyYWN0OwkvKiB3aGF0ICUgb2YgdGltZSBwcm9wYWdhdGVzICovCisJICAgIGRvdWJsZSBzZWxmOwkvKiBob3cgbXVjaCBzZWxmIHRpbWUgcHJvcGFnYXRlcyAqLworCSAgICBkb3VibGUgY2hpbGQ7CS8qIGhvdyBtdWNoIGNoaWxkIHRpbWUgcHJvcGFnYXRlcyAqLworCSAgfQorCXByb3A7CisJc3RydWN0CisJICB7CisJICAgIGludCBudW07CQkvKiBpbnRlcm5hbCBudW1iZXIgb2YgY3ljbGUgb24gKi8KKwkgICAgc3RydWN0IHN5bSAqaGVhZDsJLyogaGVhZCBvZiBjeWNsZSAqLworCSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkvKiBuZXh0IG1lbWJlciBvZiBjeWNsZSAqLworCSAgfQorCWN5YzsKKwlzdHJ1Y3QgYXJjICpwYXJlbnRzOwkvKiBsaXN0IG9mIGNhbGxlciBhcmNzICovCisJc3RydWN0IGFyYyAqY2hpbGRyZW47CS8qIGxpc3Qgb2YgY2FsbGVlIGFyY3MgKi8KKyAgICAgIH0KKyAgICBjZzsKKyAgfQorU3ltOworCisvKgorICogU3ltYm9sLXRhYmxlcyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIKKyAqIG9mIGFkZHJlc3NlczoKKyAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGludCBsZW47CQkvKiAjIG9mIHN5bWJvbHMgaW4gdGhpcyB0YWJsZSAqLworICAgIFN5bSAqYmFzZTsJCQkvKiBmaXJzdCBlbGVtZW50IGluIHN5bWJvbCB0YWJsZSAqLworICAgIFN5bSAqbGltaXQ7CQkJLyogbGltaXQgPSBiYXNlICsgbGVuICovCisgIH0KK1N5bV9UYWJsZTsKKworZXh0ZXJuIFN5bV9UYWJsZSBzeW10YWI7CS8qIHRoZSBzeW1ib2wgdGFibGUgKi8KKworZXh0ZXJuIHZvaWQgc3ltX2luaXQgUEFSQU1TICgoU3ltICogc3ltKSk7CitleHRlcm4gdm9pZCBzeW10YWJfZmluYWxpemUgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiKSk7CitleHRlcm4gU3ltICpzeW1fbG9va3VwIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYiwgYmZkX3ZtYSBhZGRyZXNzKSk7CisKK2V4dGVybiB2b2lkIGZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOworCisjZW5kaWYgLyogc3ltdGFiX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3RhaG9lLmMgYi9ncHJvZi90YWhvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzNjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi90YWhvZS5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKKyAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKKyAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCisgKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgImdwcm9mLmgiCisjaW5jbHVkZSAiY2dfYXJjcy5oIgorI2luY2x1ZGUgImNvcmVmaWxlLmgiCisjaW5jbHVkZSAiaGlzdC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorCisgICAgLyoKKyAgICAgKiAgICAgICAgb3Bjb2RlIG9mIHRoZSBgY2FsbGYnIGluc3RydWN0aW9uCisgICAgICovCisjZGVmaW5lCUNBTExGCTB4ZmUKKworICAgIC8qCisgICAgICogICAgICAgIHJlZ2lzdGVyIGZvciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCisgICAgICovCisjZGVmaW5lCVBDCTB4ZgorCitlbnVtIHRhaG9lX29wZXJtb2RlcworICB7CisgICAgbGl0ZXJhbCwgaW5kZXhlZCwgcmVnLCByZWdkZWYsIGF1dG9kZWMsIGF1dG9pbmMsIGF1dG9pbmNkZWYsCisgICAgYnl0ZWRpc3AsIGJ5dGVkaXNwZGVmLCB3b3JkZGlzcCwgd29yZGRpc3BkZWYsIGxvbmdkaXNwLCBsb25nZGlzcGRlZiwKKyAgICBpbW1lZGlhdGUsIGFic29sdXRlLCBieXRlcmVsLCBieXRlcmVsZGVmLCB3b3JkcmVsLCB3b3JkcmVsZGVmLAorICAgIGxvbmdyZWwsIGxvbmdyZWxkZWYKKyAgfTsKK3R5cGVkZWYgZW51bSB0YWhvZV9vcGVybW9kZXMgdGFob2Vfb3BlcmFuZGVudW07CisKKy8qCisgKiBBIHN5bWJvbCB0byBiZSB0aGUgY2hpbGQgb2YgaW5kaXJlY3QgY2FsbGY6CisgKi8KK1N5bSBpbmRpcmVjdGNoaWxkOworCisKK3RhaG9lX29wZXJhbmRlbnVtCit0YWhvZV9vcGVyYW5kbW9kZSAobW9kZXApCisgICAgIHVuc2lnbmVkIGNoYXIgKm1vZGVwOworeworICBsb25nIHVzZXNyZWcgPSAoKGxvbmcpICptb2RlcCkgJiAweGY7CisKKyAgc3dpdGNoICgoKGxvbmcpICptb2RlcCkgPj4gNCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgICAgcmV0dXJuIGxpdGVyYWw7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIGluZGV4ZWQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIHJlZzsKKyAgICBjYXNlIDY6CisgICAgICByZXR1cm4gcmVnZGVmOworICAgIGNhc2UgNzoKKyAgICAgIHJldHVybiBhdXRvZGVjOworICAgIGNhc2UgODoKKyAgICAgIHJldHVybiB1c2VzcmVnICE9IDB4ZSA/IGF1dG9pbmMgOiBpbW1lZGlhdGU7CisgICAgY2FzZSA5OgorICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBhdXRvaW5jZGVmIDogYWJzb2x1dGU7CisgICAgY2FzZSAxMDoKKyAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3AgOiBieXRlcmVsOworICAgIGNhc2UgMTE6CisgICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwZGVmIDogYnl0ZXJlbGRlZjsKKyAgICBjYXNlIDEyOgorICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcCA6IHdvcmRyZWw7CisgICAgY2FzZSAxMzoKKyAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3BkZWYgOiB3b3JkcmVsZGVmOworICAgIGNhc2UgMTQ6CisgICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwIDogbG9uZ3JlbDsKKyAgICBjYXNlIDE1OgorICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcGRlZiA6IGxvbmdyZWxkZWY7CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCisgIGFib3J0ICgpOworfQorCitjaGFyICoKK3RhaG9lX29wZXJhbmRuYW1lIChtb2RlKQorICAgICB0YWhvZV9vcGVyYW5kZW51bSBtb2RlOworeworCisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBsaXRlcmFsOgorICAgICAgcmV0dXJuICJsaXRlcmFsIjsKKyAgICBjYXNlIGluZGV4ZWQ6CisgICAgICByZXR1cm4gImluZGV4ZWQiOworICAgIGNhc2UgcmVnOgorICAgICAgcmV0dXJuICJyZWdpc3RlciI7CisgICAgY2FzZSByZWdkZWY6CisgICAgICByZXR1cm4gInJlZ2lzdGVyIGRlZmVycmVkIjsKKyAgICBjYXNlIGF1dG9kZWM6CisgICAgICByZXR1cm4gImF1dG9kZWNyZW1lbnQiOworICAgIGNhc2UgYXV0b2luYzoKKyAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCI7CisgICAgY2FzZSBhdXRvaW5jZGVmOgorICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IGRlZmVycmVkIjsKKyAgICBjYXNlIGJ5dGVkaXNwOgorICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCI7CisgICAgY2FzZSBieXRlZGlzcGRlZjoKKyAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOworICAgIGNhc2UgYnl0ZXJlbDoKKyAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSI7CisgICAgY2FzZSBieXRlcmVsZGVmOgorICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIGRlZmVycmVkIjsKKyAgICBjYXNlIHdvcmRkaXNwOgorICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCI7CisgICAgY2FzZSB3b3JkZGlzcGRlZjoKKyAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOworICAgIGNhc2Ugd29yZHJlbDoKKyAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSI7CisgICAgY2FzZSB3b3JkcmVsZGVmOgorICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIGRlZmVycmVkIjsKKyAgICBjYXNlIGltbWVkaWF0ZToKKyAgICAgIHJldHVybiAiaW1tZWRpYXRlIjsKKyAgICBjYXNlIGFic29sdXRlOgorICAgICAgcmV0dXJuICJhYnNvbHV0ZSI7CisgICAgY2FzZSBsb25nZGlzcDoKKyAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQiOworICAgIGNhc2UgbG9uZ2Rpc3BkZWY6CisgICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKKyAgICBjYXNlIGxvbmdyZWw6CisgICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUiOworICAgIGNhc2UgbG9uZ3JlbGRlZjoKKyAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSBkZWZlcnJlZCI7CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCisgIGFib3J0ICgpOworfQorCitsb25nCit0YWhvZV9vcGVyYW5kbGVuZ3RoIChtb2RlcCkKKyAgICAgdW5zaWduZWQgY2hhciAqbW9kZXA7Cit7CisKKyAgc3dpdGNoICh0YWhvZV9vcGVyYW5kbW9kZSAobW9kZXApKQorICAgIHsKKyAgICBjYXNlIGxpdGVyYWw6CisgICAgY2FzZSByZWc6CisgICAgY2FzZSByZWdkZWY6CisgICAgY2FzZSBhdXRvZGVjOgorICAgIGNhc2UgYXV0b2luYzoKKyAgICBjYXNlIGF1dG9pbmNkZWY6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIGJ5dGVkaXNwOgorICAgIGNhc2UgYnl0ZWRpc3BkZWY6CisgICAgY2FzZSBieXRlcmVsOgorICAgIGNhc2UgYnl0ZXJlbGRlZjoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2Ugd29yZGRpc3A6CisgICAgY2FzZSB3b3JkZGlzcGRlZjoKKyAgICBjYXNlIHdvcmRyZWw6CisgICAgY2FzZSB3b3JkcmVsZGVmOgorICAgICAgcmV0dXJuIDM7CisgICAgY2FzZSBpbW1lZGlhdGU6CisgICAgY2FzZSBhYnNvbHV0ZToKKyAgICBjYXNlIGxvbmdkaXNwOgorICAgIGNhc2UgbG9uZ2Rpc3BkZWY6CisgICAgY2FzZSBsb25ncmVsOgorICAgIGNhc2UgbG9uZ3JlbGRlZjoKKyAgICAgIHJldHVybiA1OworICAgIGNhc2UgaW5kZXhlZDoKKyAgICAgIHJldHVybiAxICsgdGFob2Vfb3BlcmFuZGxlbmd0aCAobW9kZXAgKyAxKTsKKyAgICB9CisgIC8qIE5PVFJFQUNIRUQgKi8KKyAgYWJvcnQgKCk7Cit9CisKK2JmZF92bWEKK3RhaG9lX3JlbGFkZHIgKG1vZGVwKQorICAgICBjaGFyICptb2RlcDsKK3sKKyAgdGFob2Vfb3BlcmFuZGVudW0gbW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChtb2RlcCk7CisgIGNoYXIgKmNwOworICBzaG9ydCAqc3A7CisgIGxvbmcgKmxwOworICBpbnQgaTsKKyAgbG9uZyB2YWx1ZSA9IDA7CisKKyAgY3AgPSBtb2RlcDsKKyAgKytjcDsJCQkJLyogc2tpcCBvdmVyIHRoZSBtb2RlICovCisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIltyZWxhZGRyXSBub3QgcmVsYXRpdmUgYWRkcmVzc1xuIik7CisgICAgICByZXR1cm4gKGJmZF92bWEpIG1vZGVwOworICAgIGNhc2UgYnl0ZXJlbDoKKyAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpjcCArICpjcCk7CisgICAgY2FzZSB3b3JkcmVsOgorICAgICAgZm9yIChpID0gMDsgKHNpemVfdCkgaSA8IHNpemVvZiAqc3A7IGkrKykKKwl2YWx1ZSA9ICh2YWx1ZSA8PCA4KSArIChjcFtpXSAmIDB4ZmYpOworICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKnNwICsgdmFsdWUpOworICAgIGNhc2UgbG9uZ3JlbDoKKyAgICAgIGZvciAoaSA9IDA7IChzaXplX3QpIGkgPCBzaXplb2YgKmxwOyBpKyspCisJdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoY3BbaV0gJiAweGZmKTsKKyAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpscCArIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQKK3RhaG9lX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKKyAgICAgU3ltICpwYXJlbnQ7CisgICAgIGJmZF92bWEgcF9sb3dwYzsKKyAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKK3sKKyAgdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3RwOworICBsb25nIGxlbmd0aDsKKyAgU3ltICpjaGlsZDsKKyAgdGFob2Vfb3BlcmFuZGVudW0gbW9kZTsKKyAgdGFob2Vfb3BlcmFuZGVudW0gZmlyc3Rtb2RlOworICBiZmRfdm1hIGRlc3RwYzsKKyAgc3RhdGljIGJvb2wgaW5pdGVkID0gRkFMU0U7CisKKyAgaWYgKCFpbml0ZWQpCisgICAgeworICAgICAgaW5pdGVkID0gVFJVRTsKKyAgICAgIHN5bV9pbml0ICgmaW5kaXJlY3RjaGlsZCk7CisgICAgICBpbmRpcmVjdGNoaWxkLmNnLnByb3AuZnJhY3QgPSAxLjA7CisgICAgICBpbmRpcmVjdGNoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0Y2hpbGQ7CisgICAgfQorCisgIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCisgICAgeworICAgICAgcF9sb3dwYyA9IHNfbG93cGM7CisgICAgfQorICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKKyAgICB7CisgICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOworICAgIH0KKyAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAorCQkJICBwYXJlbnQtPm5hbWUsIHBfbG93cGMsIHBfaGlnaHBjKSk7CisgIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9sb3dwYzsKKyAgICAgICBpbnN0cnVjdHAgPCAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2hpZ2hwYzsKKyAgICAgICBpbnN0cnVjdHAgKz0gbGVuZ3RoKQorICAgIHsKKyAgICAgIGxlbmd0aCA9IDE7CisgICAgICBpZiAoKmluc3RydWN0cCA9PSBDQUxMRikKKwl7CisJICAvKgorCSAgICogICAgbWF5YmUgYSBjYWxsZiwgYmV0dGVyIGNoZWNrIGl0IG91dC4KKwkgICAqICAgICAgc2tpcCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisJICAgKi8KKwkgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGxmIiwKKwkJCQkgIGluc3RydWN0cCAtICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSkpOworCSAgZmlyc3Rtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKGluc3RydWN0cCArIGxlbmd0aCk7CisJICBzd2l0Y2ggKGZpcnN0bW9kZSkKKwkgICAgeworCSAgICBjYXNlIGxpdGVyYWw6CisJICAgIGNhc2UgaW1tZWRpYXRlOgorCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGdvdG8gYm90Y2hlZDsKKwkgICAgfQorCSAgbGVuZ3RoICs9IHRhaG9lX29wZXJhbmRsZW5ndGggKGluc3RydWN0cCArIGxlbmd0aCk7CisJICBtb2RlID0gdGFob2Vfb3BlcmFuZG1vZGUgKGluc3RydWN0cCArIGxlbmd0aCk7CisJICBEQkcgKENBTExERUJVRywKKwkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdGFob2Vfb3BlcmFuZG5hbWUgKGZpcnN0bW9kZSkpOworCSAgICAgICBwcmludGYgKCJcdHNlY29uZCBvcGVyYW5kIGlzICVzXG4iLCB0YWhvZV9vcGVyYW5kbmFtZSAobW9kZSkpOworCSAgICApOworCSAgc3dpdGNoIChtb2RlKQorCSAgICB7CisJICAgIGNhc2UgcmVnZGVmOgorCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgorCSAgICBjYXNlIHdvcmRkaXNwZGVmOgorCSAgICBjYXNlIGxvbmdkaXNwZGVmOgorCSAgICBjYXNlIGJ5dGVyZWxkZWY6CisJICAgIGNhc2Ugd29yZHJlbGRlZjoKKwkgICAgY2FzZSBsb25ncmVsZGVmOgorCSAgICAgIC8qCisJICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKKwkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAorCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCisJICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgorCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKKwkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCisJICAgICAgICovCisJICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOworCSAgICAgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOworCSAgICAgIGNvbnRpbnVlOworCSAgICBjYXNlIGJ5dGVyZWw6CisJICAgIGNhc2Ugd29yZHJlbDoKKwkgICAgY2FzZSBsb25ncmVsOgorCSAgICAgIC8qCisJICAgICAgICogICAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCisJICAgICAgICogICAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCisJICAgICAgICogICAgICBhIGZ1bmN0aW9uLgorCSAgICAgICAqLworCSAgICAgIGRlc3RwYyA9IHRhaG9lX3JlbGFkZHIgKGluc3RydWN0cCArIGxlbmd0aCkKKwkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOworCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCisJCXsKKwkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7CisJCSAgREJHIChDQUxMREVCVUcsCisJCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLCBkZXN0cGMpOworCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOworCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLCBjaGlsZC0+YWRkcik7CisJCSAgICApOworCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCisJCSAgICB7CisJCSAgICAgIC8qCisJCSAgICAgICAqICAgIGEgaGl0CisJCSAgICAgICAqLworCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7CisJCSAgICAgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOworCQkgICAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICBnb3RvIGJvdGNoZWQ7CisJCX0KKwkgICAgICAvKgorCSAgICAgICAqICAgIGVsc2U6CisJICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxmLAorCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KKwkgICAgICAgKi8KKwkgICAgICBnb3RvIGJvdGNoZWQ7CisJICAgIGRlZmF1bHQ6CisJICAgIGJvdGNoZWQ6CisJICAgICAgLyoKKwkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCisJICAgICAgICovCisJICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKKwkgICAgICBsZW5ndGggPSAxOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dwcm9mL3V0aWxzLmMgYi9ncHJvZi91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjAzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi91dGlscy5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKKyAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKKyAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCisgKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2luY2x1ZGUgPGRlbWFuZ2xlLmg+CisjaW5jbHVkZSAiZ3Byb2YuaCIKKyNpbmNsdWRlICJjZ19hcmNzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisKKworLyoKKyAqIFByaW50IG5hbWUgb2Ygc3ltYm9sLiAgUmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCisgKi8KK2ludAorREVGVU4gKHByaW50X25hbWVfb25seSwgKHNlbGYpLCBTeW0gKiBzZWxmKQoreworICBjb25zdCBjaGFyICpuYW1lID0gc2VsZi0+bmFtZTsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKmRlbWFuZ2xlZCA9IDA7CisgIGNoYXIgYnVmW1BBVEhfTUFYXTsKKyAgaW50IHNpemUgPSAwOworCisgIGlmIChuYW1lKQorICAgIHsKKyAgICAgIGlmICghYnNkX3N0eWxlX291dHB1dCkKKwl7CisJICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzKQorCSAgICB7CisJICAgICAgbmFtZSsrOworCSAgICB9CisJICBpZiAoZGVtYW5nbGUpCisJICAgIHsKKwkgICAgICBkZW1hbmdsZWQgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOworCSAgICAgIGlmIChkZW1hbmdsZWQpCisJCXsKKwkJICBuYW1lID0gZGVtYW5nbGVkOworCQl9CisJICAgIH0KKwl9CisgICAgICBwcmludGYgKCIlcyIsIG5hbWUpOworICAgICAgc2l6ZSA9IHN0cmxlbiAobmFtZSk7CisgICAgICBpZiAobGluZV9ncmFudWxhcml0eSAmJiBzZWxmLT5maWxlKQorCXsKKwkgIGZpbGVuYW1lID0gc2VsZi0+ZmlsZS0+bmFtZTsKKwkgIGlmICghcHJpbnRfcGF0aCkKKwkgICAgeworCSAgICAgIGZpbGVuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7CisJICAgICAgaWYgKGZpbGVuYW1lKQorCQl7CisJCSAgKytmaWxlbmFtZTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGZpbGVuYW1lID0gc2VsZi0+ZmlsZS0+bmFtZTsKKwkJfQorCSAgICB9CisJICBzcHJpbnRmIChidWYsICIgKCVzOiVkKSIsIGZpbGVuYW1lLCBzZWxmLT5saW5lX251bSk7CisJICBwcmludGYgKGJ1Zik7CisJICBzaXplICs9IHN0cmxlbiAoYnVmKTsKKwl9CisgICAgICBpZiAoZGVtYW5nbGVkKQorCXsKKwkgIGZyZWUgKGRlbWFuZ2xlZCk7CisJfQorICAgICAgREJHIChERk5ERUJVRywgcHJpbnRmICgieyVkfSAiLCBzZWxmLT5jZy50b3Bfb3JkZXIpKTsKKyAgICAgIERCRyAoUFJPUERFQlVHLCBwcmludGYgKCIlNC4wZiUlICIsIDEwMC4wICogc2VsZi0+Y2cucHJvcC5mcmFjdCkpOworICAgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKwordm9pZAorREVGVU4gKHByaW50X25hbWUsIChzZWxmKSwgU3ltICogc2VsZikKK3sKKyAgcHJpbnRfbmFtZV9vbmx5IChzZWxmKTsKKworICBpZiAoc2VsZi0+Y2cuY3ljLm51bSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoXygiIDxjeWNsZSAlZD4iKSwgc2VsZi0+Y2cuY3ljLm51bSk7CisgICAgfQorICBpZiAoc2VsZi0+Y2cuaW5kZXggIT0gMCkKKyAgICB7CisgICAgICBpZiAoc2VsZi0+Y2cucHJpbnRfZmxhZykKKwl7CisJICBwcmludGYgKCIgWyVkXSIsIHNlbGYtPmNnLmluZGV4KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiICglZCkiLCBzZWxmLT5jZy5pbmRleCk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dwcm9mL3V0aWxzLmggYi9ncHJvZi91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmI5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi91dGlscy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiB1dGlsc19oCisjZGVmaW5lIHV0aWxzX2gKKworZXh0ZXJuIGludCBwcmludF9uYW1lX29ubHkgUEFSQU1TICgoU3ltICogc2VsZikpOworZXh0ZXJuIHZvaWQgcHJpbnRfbmFtZSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7CisKKyNlbmRpZiAvKiB1dGlsc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi92YXguYyBiL2dwcm9mL3ZheC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2JkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncHJvZi92YXguYwpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5CisgKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCisgKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJworICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpbmNsdWRlICJncHJvZi5oIgorI2luY2x1ZGUgImNnX2FyY3MuaCIKKyNpbmNsdWRlICJjb3JlZmlsZS5oIgorI2luY2x1ZGUgImhpc3QuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworICAgIC8qCisgICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxzJyBpbnN0cnVjdGlvbgorICAgICAqLworI2RlZmluZQlDQUxMUwkweGZiCisKKyAgICAvKgorICAgICAqICAgICAgICByZWdpc3RlciBmb3IgcGMgcmVsYXRpdmUgYWRkcmVzc2luZworICAgICAqLworI2RlZmluZQlQQwkweGYKKworZW51bSBvcGVybW9kZXMKKyAgeworICAgIGxpdGVyYWwsIGluZGV4ZWQsIHJlZywgcmVnZGVmLCBhdXRvZGVjLCBhdXRvaW5jLCBhdXRvaW5jZGVmLAorICAgIGJ5dGVkaXNwLCBieXRlZGlzcGRlZiwgd29yZGRpc3AsIHdvcmRkaXNwZGVmLCBsb25nZGlzcCwgbG9uZ2Rpc3BkZWYsCisgICAgaW1tZWRpYXRlLCBhYnNvbHV0ZSwgYnl0ZXJlbCwgYnl0ZXJlbGRlZiwgd29yZHJlbCwgd29yZHJlbGRlZiwKKyAgICBsb25ncmVsLCBsb25ncmVsZGVmCisgIH07Cit0eXBlZGVmIGVudW0gb3Blcm1vZGVzIG9wZXJhbmRlbnVtOworCitzdHJ1Y3QgbW9kZWJ5dGUKKyAgeworICAgIHVuc2lnbmVkIGludCByZWdmaWVsZDo0OworICAgIHVuc2lnbmVkIGludCBtb2RlZmllbGQ6NDsKKyAgfTsKKworLyoKKyAqIEEgc3ltYm9sIHRvIGJlIHRoZSBjaGlsZCBvZiBpbmRpcmVjdCBjYWxsczoKKyAqLworU3ltIGluZGlyZWN0Y2hpbGQ7CisKKworc3RhdGljIG9wZXJhbmRlbnVtCit2YXhfb3BlcmFuZG1vZGUgKG1vZGVwKQorICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOworeworICBsb25nIHVzZXNyZWcgPSBtb2RlcC0+cmVnZmllbGQ7CisKKyAgc3dpdGNoIChtb2RlcC0+bW9kZWZpZWxkKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gbGl0ZXJhbDsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gaW5kZXhlZDsKKyAgICBjYXNlIDU6CisgICAgICByZXR1cm4gcmVnOworICAgIGNhc2UgNjoKKyAgICAgIHJldHVybiByZWdkZWY7CisgICAgY2FzZSA3OgorICAgICAgcmV0dXJuIGF1dG9kZWM7CisgICAgY2FzZSA4OgorICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBhdXRvaW5jIDogaW1tZWRpYXRlOworICAgIGNhc2UgOToKKyAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luY2RlZiA6IGFic29sdXRlOworICAgIGNhc2UgMTA6CisgICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwIDogYnl0ZXJlbDsKKyAgICBjYXNlIDExOgorICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcGRlZiA6IGJ5dGVyZWxkZWY7CisgICAgY2FzZSAxMjoKKyAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3AgOiB3b3JkcmVsOworICAgIGNhc2UgMTM6CisgICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwZGVmIDogd29yZHJlbGRlZjsKKyAgICBjYXNlIDE0OgorICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcCA6IGxvbmdyZWw7CisgICAgY2FzZSAxNToKKyAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3BkZWYgOiBsb25ncmVsZGVmOworICAgIH0KKyAgLyogTk9UUkVBQ0hFRCAqLworICBhYm9ydCAoKTsKK30KKworc3RhdGljIGNoYXIgKgordmF4X29wZXJhbmRuYW1lIChtb2RlKQorICAgICBvcGVyYW5kZW51bSBtb2RlOworeworCisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBsaXRlcmFsOgorICAgICAgcmV0dXJuICJsaXRlcmFsIjsKKyAgICBjYXNlIGluZGV4ZWQ6CisgICAgICByZXR1cm4gImluZGV4ZWQiOworICAgIGNhc2UgcmVnOgorICAgICAgcmV0dXJuICJyZWdpc3RlciI7CisgICAgY2FzZSByZWdkZWY6CisgICAgICByZXR1cm4gInJlZ2lzdGVyIGRlZmVycmVkIjsKKyAgICBjYXNlIGF1dG9kZWM6CisgICAgICByZXR1cm4gImF1dG9kZWNyZW1lbnQiOworICAgIGNhc2UgYXV0b2luYzoKKyAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCI7CisgICAgY2FzZSBhdXRvaW5jZGVmOgorICAgICAgcmV0dXJuICJhdXRvaW5jcmVtZW50IGRlZmVycmVkIjsKKyAgICBjYXNlIGJ5dGVkaXNwOgorICAgICAgcmV0dXJuICJieXRlIGRpc3BsYWNlbWVudCI7CisgICAgY2FzZSBieXRlZGlzcGRlZjoKKyAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOworICAgIGNhc2UgYnl0ZXJlbDoKKyAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSI7CisgICAgY2FzZSBieXRlcmVsZGVmOgorICAgICAgcmV0dXJuICJieXRlIHJlbGF0aXZlIGRlZmVycmVkIjsKKyAgICBjYXNlIHdvcmRkaXNwOgorICAgICAgcmV0dXJuICJ3b3JkIGRpc3BsYWNlbWVudCI7CisgICAgY2FzZSB3b3JkZGlzcGRlZjoKKyAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQgZGVmZXJyZWQiOworICAgIGNhc2Ugd29yZHJlbDoKKyAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSI7CisgICAgY2FzZSB3b3JkcmVsZGVmOgorICAgICAgcmV0dXJuICJ3b3JkIHJlbGF0aXZlIGRlZmVycmVkIjsKKyAgICBjYXNlIGltbWVkaWF0ZToKKyAgICAgIHJldHVybiAiaW1tZWRpYXRlIjsKKyAgICBjYXNlIGFic29sdXRlOgorICAgICAgcmV0dXJuICJhYnNvbHV0ZSI7CisgICAgY2FzZSBsb25nZGlzcDoKKyAgICAgIHJldHVybiAibG9uZyBkaXNwbGFjZW1lbnQiOworICAgIGNhc2UgbG9uZ2Rpc3BkZWY6CisgICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKKyAgICBjYXNlIGxvbmdyZWw6CisgICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUiOworICAgIGNhc2UgbG9uZ3JlbGRlZjoKKyAgICAgIHJldHVybiAibG9uZyByZWxhdGl2ZSBkZWZlcnJlZCI7CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCisgIGFib3J0ICgpOworfQorCitzdGF0aWMgbG9uZwordmF4X29wZXJhbmRsZW5ndGggKG1vZGVwKQorICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOworeworCisgIHN3aXRjaCAodmF4X29wZXJhbmRtb2RlIChtb2RlcCkpCisgICAgeworICAgIGNhc2UgbGl0ZXJhbDoKKyAgICBjYXNlIHJlZzoKKyAgICBjYXNlIHJlZ2RlZjoKKyAgICBjYXNlIGF1dG9kZWM6CisgICAgY2FzZSBhdXRvaW5jOgorICAgIGNhc2UgYXV0b2luY2RlZjoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgYnl0ZWRpc3A6CisgICAgY2FzZSBieXRlZGlzcGRlZjoKKyAgICBjYXNlIGJ5dGVyZWw6CisgICAgY2FzZSBieXRlcmVsZGVmOgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSB3b3JkZGlzcDoKKyAgICBjYXNlIHdvcmRkaXNwZGVmOgorICAgIGNhc2Ugd29yZHJlbDoKKyAgICBjYXNlIHdvcmRyZWxkZWY6CisgICAgICByZXR1cm4gMzsKKyAgICBjYXNlIGltbWVkaWF0ZToKKyAgICBjYXNlIGFic29sdXRlOgorICAgIGNhc2UgbG9uZ2Rpc3A6CisgICAgY2FzZSBsb25nZGlzcGRlZjoKKyAgICBjYXNlIGxvbmdyZWw6CisgICAgY2FzZSBsb25ncmVsZGVmOgorICAgICAgcmV0dXJuIDU7CisgICAgY2FzZSBpbmRleGVkOgorICAgICAgcmV0dXJuIDEgKyB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoKGNoYXIgKikgbW9kZXApICsgMSk7CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCisgIGFib3J0ICgpOworfQorCitzdGF0aWMgYmZkX3ZtYQordmF4X3JlbGFkZHIgKG1vZGVwKQorICAgICBzdHJ1Y3QgbW9kZWJ5dGUgKm1vZGVwOworeworICBvcGVyYW5kZW51bSBtb2RlID0gdmF4X29wZXJhbmRtb2RlIChtb2RlcCk7CisgIGNoYXIgKmNwOworICBzaG9ydCAqc3A7CisgIGxvbmcgKmxwOworCisgIGNwID0gKGNoYXIgKikgbW9kZXA7CisgICsrY3A7CQkJCS8qIHNraXAgb3ZlciB0aGUgbW9kZSAqLworICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJbcmVsYWRkcl0gbm90IHJlbGF0aXZlIGFkZHJlc3NcbiIpOworICAgICAgcmV0dXJuIChiZmRfdm1hKSBtb2RlcDsKKyAgICBjYXNlIGJ5dGVyZWw6CisgICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqY3AgKyAqY3ApOworICAgIGNhc2Ugd29yZHJlbDoKKyAgICAgIHNwID0gKHNob3J0ICopIGNwOworICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKnNwICsgKnNwKTsKKyAgICBjYXNlIGxvbmdyZWw6CisgICAgICBscCA9IChsb25nICopIGNwOworICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmxwICsgKmxwKTsKKyAgICB9Cit9CisKKwordm9pZAordmF4X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYykKKyAgICAgU3ltICpwYXJlbnQ7CisgICAgIGJmZF92bWEgcF9sb3dwYzsKKyAgICAgYmZkX3ZtYSBwX2hpZ2hwYzsKK3sKKyAgdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3RwOworICBsb25nIGxlbmd0aDsKKyAgU3ltICpjaGlsZDsKKyAgb3BlcmFuZGVudW0gbW9kZTsKKyAgb3BlcmFuZGVudW0gZmlyc3Rtb2RlOworICBiZmRfdm1hIGRlc3RwYzsKKyAgc3RhdGljIGJvb2wgaW5pdGVkID0gRkFMU0U7CisKKyAgaWYgKCFpbml0ZWQpCisgICAgeworICAgICAgaW5pdGVkID0gVFJVRTsKKyAgICAgIHN5bV9pbml0ICgmaW5kaXJlY3RjaGlsZCk7CisgICAgICBpbmRpcmVjdGNoaWxkLmNnLnByb3AuZnJhY3QgPSAxLjA7CisgICAgICBpbmRpcmVjdGNoaWxkLmNnLmN5Yy5oZWFkID0gJmluZGlyZWN0Y2hpbGQ7CisgICAgfQorCisgIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCisgICAgeworICAgICAgcF9sb3dwYyA9IHNfbG93cGM7CisgICAgfQorICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKKyAgICB7CisgICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOworICAgIH0KKyAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAorCQkJICBwYXJlbnQtPm5hbWUsIHBfbG93cGMsIHBfaGlnaHBjKSk7CisgIGZvciAoaW5zdHJ1Y3RwID0gKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9sb3dwYzsKKyAgICAgICBpbnN0cnVjdHAgPCAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UgKyBwX2hpZ2hwYzsKKyAgICAgICBpbnN0cnVjdHAgKz0gbGVuZ3RoKQorICAgIHsKKyAgICAgIGxlbmd0aCA9IDE7CisgICAgICBpZiAoKmluc3RydWN0cCA9PSBDQUxMUykKKwl7CisJICAvKgorCSAgICogICAgbWF5YmUgYSBjYWxscywgYmV0dGVyIGNoZWNrIGl0IG91dC4KKwkgICAqICAgICAgc2tpcCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisJICAgKi8KKwkgIERCRyAoQ0FMTERFQlVHLAorCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGxzIiwKKwkJICAgICAgIGluc3RydWN0cCAtICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSkpOworCSAgZmlyc3Rtb2RlID0gdmF4X29wZXJhbmRtb2RlICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKKwkgIHN3aXRjaCAoZmlyc3Rtb2RlKQorCSAgICB7CisJICAgIGNhc2UgbGl0ZXJhbDoKKwkgICAgY2FzZSBpbW1lZGlhdGU6CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZ290byBib3RjaGVkOworCSAgICB9CisJICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOworCSAgbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7CisJICBEQkcgKENBTExERUJVRywKKwkgICAgICAgcHJpbnRmICgiXHRmaXJzdCBvcGVyYW5kIGlzICVzIiwgdmF4X29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKKwkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdmF4X29wZXJhbmRuYW1lIChtb2RlKSkpOworCSAgc3dpdGNoIChtb2RlKQorCSAgICB7CisJICAgIGNhc2UgcmVnZGVmOgorCSAgICBjYXNlIGJ5dGVkaXNwZGVmOgorCSAgICBjYXNlIHdvcmRkaXNwZGVmOgorCSAgICBjYXNlIGxvbmdkaXNwZGVmOgorCSAgICBjYXNlIGJ5dGVyZWxkZWY6CisJICAgIGNhc2Ugd29yZHJlbGRlZjoKKwkgICAgY2FzZSBsb25ncmVsZGVmOgorCSAgICAgIC8qCisJICAgICAgICogICAgaW5kaXJlY3QgY2FsbDogY2FsbCB0aHJvdWdoIHBvaW50ZXIKKwkgICAgICAgKiAgICAgIGVpdGhlciAgKmQocikgICBhcyBhIHBhcmFtZXRlciBvciBsb2NhbAorCSAgICAgICAqICAgICAgICAgICAgICAocikgICAgIGFzIGEgcmV0dXJuIHZhbHVlCisJICAgICAgICogICAgICAgICAgICAgICpmICAgICAgYXMgYSBnbG9iYWwgcG9pbnRlcgorCSAgICAgICAqICAgICAgW2FyZSB0aGVyZSBvdGhlcnMgdGhhdCB3ZSBtaXNzPywKKwkgICAgICAgKiAgICAgICBlLmcuIGFycmF5cyBvZiBwb2ludGVycyB0byBmdW5jdGlvbnM/Pz9dCisJICAgICAgICovCisJICAgICAgYXJjX2FkZCAocGFyZW50LCAmaW5kaXJlY3RjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOworCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoCisJCQkJICAoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgY2FzZSBieXRlcmVsOgorCSAgICBjYXNlIHdvcmRyZWw6CisJICAgIGNhc2UgbG9uZ3JlbDoKKwkgICAgICAvKgorCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZworCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAorCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KKwkgICAgICAgKi8KKwkgICAgICBkZXN0cGMgPSB2YXhfcmVsYWRkciAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSkKKwkJLSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlOworCSAgICAgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCisJCXsKKwkJICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7CisJCSAgREJHIChDQUxMREVCVUcsCisJCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHRkZXN0cGMgMHglbHgiLCBkZXN0cGMpOworCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5uYW1lICVzIiwgY2hpbGQtPm5hbWUpOworCQkgICAgICAgcHJpbnRmICgiIGNoaWxkLT5hZGRyIDB4JWx4XG4iLCBjaGlsZC0+YWRkcik7CisJCSAgICApOworCQkgIGlmIChjaGlsZC0+YWRkciA9PSBkZXN0cGMpCisJCSAgICB7CisJCSAgICAgIC8qCisJCSAgICAgICAqICAgIGEgaGl0CisJCSAgICAgICAqLworCQkgICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7CisJCSAgICAgIGxlbmd0aCArPSB2YXhfb3BlcmFuZGxlbmd0aCAoKHN0cnVjdCBtb2RlYnl0ZSAqKQorCQkJCQkJICAgKGluc3RydWN0cCArIGxlbmd0aCkpOworCQkgICAgICBjb250aW51ZTsKKwkJICAgIH0KKwkJICBnb3RvIGJvdGNoZWQ7CisJCX0KKwkgICAgICAvKgorCSAgICAgICAqICAgIGVsc2U6CisJICAgICAgICogICAgICBpdCBsb29rZWQgbGlrZSBhIGNhbGxzLAorCSAgICAgICAqICAgICAgYnV0IGl0IHdhc24ndCB0byBhbnl3aGVyZS4KKwkgICAgICAgKi8KKwkgICAgICBnb3RvIGJvdGNoZWQ7CisJICAgIGRlZmF1bHQ6CisJICAgIGJvdGNoZWQ6CisJICAgICAgLyoKKwkgICAgICAgKiAgICBzb21ldGhpbmcgZnVubnkgZ29pbmcgb24uCisJICAgICAgICovCisJICAgICAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF1cdGJ1dCBpdCdzIGEgYm90Y2hcbiIpKTsKKwkgICAgICBsZW5ndGggPSAxOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQ09QWUlORyBiL2luY2x1ZGUvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU0OWJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhZGY5MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTUyNyBAQAorMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChiZmRfZWxmX3ZlcnNpb25fZXhwcik6IFJlbmFtZSBgbWF0Y2gnIHRvIGBwYXR0ZXJuJy4KKwlBZGQgYG1hdGNoJyBjYWxsYmFjayBmdW5jdGlvbi4KKworMTk5OS0wNC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChiZmRfbGlua19pbmZvKTogQWRkIG5vX3VuZGVmaW5lZC4KKworMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZGlzLWFzbS5oOiBBZGQgcHJvdG90eXBlIGZvciBwcmludF9pbnNuX21jb3JlLgorCisxOTk5LTA0LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyk6IERlY2xhcmUuCisKKzE5OTktMDMtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX2ludHMpOiBEZWNsYXJlLgorCitXZWQgTWFyIDI0IDEyOjQ2OjI5IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYW15LmN5Z251cy5jb20+CisKKwkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEN5Z3dpbnssMzJ9IHNob3VsZCBoYXZlIHRoZSBwcm90b3R5cGUuCisKKzE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBhZGQgZmllbGQgIm1wYzg2MGMwIi4KKworTW9uIEZlYiAgMSAyMTowNTo0NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICogZGlzLWFzbS5oIChwcmludF9pbnNuX2kzODZfYXR0KTogIERlY2xhcmUuCisgICAgICAgKHByaW50X2luc25faTM4Nl9pbnRlbCk6ICBEZWNsYXJlLgorCis5OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogQ2FzdCBTVFJFQU0gYW5kCisJRlBSSU5URl9GVU5DIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorCitXZWQgRGVjIDMwIDE2OjA3OjE0IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmg6IGNoYW5nZSB2b2lkICogdG8gUFRSICh0d28gcGxhY2VzKS4KKworTW9uIERlYyAxNCAwOTo1MzozMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGRlbWFuZ2xlLmg6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgorCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KKworVHVlIERlYyAgOCAwMDozMDozMSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+IAorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBFbGVuYSBaYW5ub25pCisgCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYW5kIEVkaXRoIEVwc3RlaW4KKyAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbgorIAljaGFuZ2VzIG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgorCisJKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogY2hhbmdlIHRoZSB0eXBlIG9mIHN0cmVhbQorCWZyb20gRklMRSogdG8gdm9pZCosIGZvciB1c2Ugd2l0aCBnZGIncyBuZXcgdHlwZSBHREJfRklMRS4KKwkoZnByaW50Zl9mdHlwZSk6IGNoYW5nZSBGSUxFKiBwYXJhbWV0ZXIgdHlwZSB0byB2b2lkKi4KKworICAgICAgICAqIGRlbWFuZ2xlLmg6IChETUdMX0VERyk6IG5ldyBtYWNybyBmb3IgS3VjayBhbmQgQXNzb2NpYXRlcworICAgICAgICAoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgS3VjayBhbmQgQXNzb2Mgc3R5bGUKKyAgICAgICAgKGRlbWFuZ2xpbmdfc3R5bGVzKTogYWRkIG5ldyBlZGdfZGVtYW5nbGluZyBzdHlsZQorICAgICAgICAoRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvCisgICAgICAgIChFREdfREVNQU5HTElORyk6IG5ldyBtYWNybworCisgICAgICAgICogZGVtYW5nbGUuaCAoRE1HTF9IUCk6IG5ldyBtYWNybywgZm9yIEhQL2FDQyBjb21waWxlci4KKyAgICAgICAgKERNR0xfU1RZTEVfTUFTSyk6IG1vZGlmeSB0byBpbmNsdWRlIG5ldyBIUCdzIHN0eWxlLgorICAgICAgICAoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGhwX2RlbWFuZ2xpbmcgdmFsdWUuCisgICAgICAgIChIUF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORyk6IG5ldyBtYWNyby4KKyAgICAgICAgKEFSTV9ERU1BTkdMSU5HKTogY29lcmNlIHRvIGludC4KKyAgICAgICAgKEhQX0RFTUFOR0xJTkcpOiBuZXcgbWFjcm8uCisKKwkqIGhwLXN5bXRhYi5oOiByZXdyaXR0ZW4sIGZyb20gSFAuCisJKHF1aWNrX3Byb2NlZHVyZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAorCShxdWlja19tb2R1bGUpOiBjaGFuZ2UgdHlwZSBvZiBsYW5ndWFnZSBmaWVsZCB0byB1bnNpZ25lZCBpbnQKKwkoc3RydWN0IGRudHRfdHlwZV9zdmFyKTogYWRkIGZpZWxkIHRocmVhZF9zcGVjaWZpYy4KKwkoaHBfbGFuZ3VhZ2UpOiBhZGQgbGFuZ3VhZ2VzIG1vZGNhbCBhbmQgZG1wYXNjYWwuCisKK01vbiBOb3YgMzAgMTU6MjU6NTggMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBlbGYvc2guaCAoZWxmX3NoX3JlbG9jX3R5cGUpOiBBZGQgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DLAorCVJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCBSX1NIX1NXSVRDSDggYW5kIFJfU0hfbWF4LgorCitGcmkgTm92IDIwIDEzOjE0OjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgRnJlZUJTRC4KKworRnJpIE5vdiAxMyAxOToxOToxMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGxpYmliZXJ0eS5oOiBQcm90b3R5cGUgeGNhbGxvYy4KKworU3VuIE5vdiAgOCAxNzo0MjoyNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGFuc2lkZWNsLmg6IFdyYXAgcHJvYmxlbWF0aWMgbWFjcm9zIHdpdGggIUlOX0dDQy4KKworCSogZGVtYW5nbGUuaDogTmV2ZXIgZGVmaW5lIFBBUkFNUygpLgorCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KKworU2F0IE5vdiAgNyAxODozMDoyMCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGV0ZXIuc2NoYXVlckByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fdmF4KTogRGVjbGFyZS4KKworU2F0IE5vdiAgNyAxNjowNDowMyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgZ2Fuc2lkZWNsLmguCisJKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgorCisxOTk4LTEwLTI2IDE2OjAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgb3B0aW1pemUuCisKK1RodSBPY3QgMjIgMTk6NTg6MDAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgorCisJKiBzcGxheS10cmVlLmg6IFdyYXAgZnVuY3Rpb24gcG9pbnRlciBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIGluCisJUEFSQU1TKCkgbWFjcm8uCisKKzE5OTgtMTAtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+CisKKwkqIHNwbGF5LXRyZWUuaDogTmV3IGZpbGUuCisKK0ZyaSBPY3QgIDkgMDA6MDI6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNZXJnZSBkZXZvIGFuZCBlZ2NzIGluY2x1ZGUgZGlyZWN0b3JpZXMuCisKK1NhdCBTZXAgIDUgMTI6MTY6MzMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZXRvcHQuaCwgb2JzdGFjay5oOiBVcGRhdGVkIGZyb20gZ2NjLgorCisxOTk4LTA4LTAzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IENoYW5nZSBkZWNsIHRvIHVzZSBtb2Rlcm4gR0NDIGF0dHJpYnV0ZQorCXRvIGluZGljYXRlIGV4aXQgZG9lcyBub3QgcmV0dXJuLgorCitNb24gSnVuICAxIDEzOjQ4OjMyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCisKK1R1ZSBNYXkgMjYgMjA6NTc6NDMgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KKworCSogZWxmL3NwYXJjLmggKEVGX1NQQVJDX0xFREFUQSwgUl9TUEFSQ18zMkxFKTogQWRkZWQuCisKK1R1ZSBGZWIgMjQgMTM6MDU6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogTWVtYmVyIGBzeW1ib2wnIHJlbmFtZWQgdG8gYHN5bWJvbHMnCisJYW5kIG1hZGUgYW4gImFzeW1ib2wgKioiLiAgTmV3IG1lbWJlciBudW1fc3ltYm9scy4KKwkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBVcGRhdGUuCisKK1R1ZSBGZWIgMTcgMTI6MzI6MTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmggKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogQWRkCisgCXJlZ2lzdGVyIGxlbmd0aCBwYXJhbWV0ZXIuICBGdW5jdGlvbnMgcmV0dXJuIGFjdHVhbCBsZW5ndGggb2YKKyAJcmVnaXN0ZXIuCisKK1RodSBGZWIgMTIgMTY6Mjk6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnZXRvcHQuaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KKworV2VkIEZlYiAxMSAxNjo1NjowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzeW1jYXQuaDogTmV3IGZpbGUuCisKK01vbiBGZWIgIDIgMTc6MTM6MzEgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KKworCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzMwKTogRGVjbGFyZS4KKworVGh1IEphbiAyMiAxNjoyMzo1OSAxOTk4ICBGcmVkIEZpc2ggPGZuZkBjeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmg6IEFkZCBmbGFnIElOU05fSEFTX1JFTE9DIHRvIHRlbGwgZGlzYXNzZW1ibHkKKwlmdW5jdGlvbiB0aGVyZSBpcyBhIHJlbG9jIG9uIHRoaXMgbGluZS4KKworTW9uIERlYyAgOCAxMToyMjoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmg6IFJlbW92ZSBwcm90b3R5cGUgb2YgZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uCisJbm8gbG9uZ2VyIGV4aXN0cy4KKworVHVlIERlYyAgMiAxMDoyMDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKGRpc2FzbV9zeW1hZGRyKTogTmV3IHByb3RvdHlwZS4KKworTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwkqIGNvZmYvc2guaCAoUl9TSF9TV0lUQ0g4KTogTmV3LgorCitNb24gRGVjICAxIDExOjI5OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNhbGxiYWNrLmggKENCX1NZU0NBTEwpOiBDb21tZW50IG91dCBhcmcgbmFtZXMgaW4gcHJvdG90eXBlcy4KKworV2VkIE5vdiAyNiAxNjo0Nzo1OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suaCAoQ0JfU1lTQ0FMTCk6IENvbnNpc3RhbnRseSB1c2UgbmFtZXMgZm9yIHByb3RvdHlwZQorCWFyZ3VtZW50cy4KKworV2VkIE5vdiAyNiAxMTozOTozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oIChDQl9TWVNDQUxMKTogQ2hhbmdlIGJ5dGUgY291bnQgYXJndW1lbnRzIHRvCisJe3JlYWQsd3JpdGV9X21lbSB0byBgaW50Jy4gIE5ldyBtZW1iZXIgYG1hZ2ljJy4KKwkoQ0JfU1lTQ0FMTF9NQUdJQyxDQl9TWVNDQUxMX0lOSVQpOiBOZXcgbWFjcm9zLgorCitUdWUgTm92IDI1IDAxOjM1OjUyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oIChzdHJ1Y3Qgc3RhdCk6IE1vdmUgZm9yd2FyZCBkZWNsIHVwLgorCShob3N0X2NhbGxiYWNrKTogUGFzcyBzdGF0IHN0cnVjdCBwb2ludGVyIHRvIHN0YXQsZnN0YXQuCisJKENCX1NZU19ubm4pOiBSZW9yZ2FuaXplLgorCShDQl9TWVNDQUxMKTogTmV3IG1lbWJlcnMgcDEscDIuCisJKGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQpOiBEZWxldGUgZm91cnRoIGFyZy4KKworU2F0IE5vdiAyMiAyMzozNDoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3BfcmVhc29uKTogQ2xhcmlmeSBzaW1fc2lnbmFsbGVkIFNJR1JDCisgCWFyZ3VtZW50LgorCitNb24gTm92IDE3IDE0OjAwOjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oIChDQl9UQVJHRVRfREVGU19NQVApOiBSZW5hbWVkIGZyb20gdGFyZ2V0X2RlZnNfbWFwLgorCShob3N0X2NhbGxiYWNrKTogQWRkIHN0YXQsIGZzdGF0LCBzeXNjYWxsX21hcCwgZXJybm9fbWFwLCBvcGVuX21hcCwKKwlzaWduYWxfbWFwLCBzdGF0X21hcC4KKwkoZXJybl9tYXAsb3Blbl9tYXApOiBSZW5hbWVkIHRvIGNiX2luaXRfZm9vX21hcC4KKwkoY2JfaG9zdF90b190YXJnZXRfZXJybm8sY2JfdGFyZ2V0X3RvX2hvc3Rfb3Blbik6IFJlbmFtZWQgZnJvbQorCWhvc3RfdG9fdGFyZ2V0X2Vycm5vLHRhcmdldF90b19ob3N0X29wZW4uCisJKGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyk6IEFkZCBwcm90b3R5cGUuCisJKGNiX3RhcmdldF90b19ob3N0X3N5c2NhbGwpOiBMaWtld2lzZS4KKwkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IExpa2V3aXNlLgorCShjYl9zeXNjYWxsKTogTGlrZXdpc2UuCisJKENCX1NZU197ZXhpdCxvcGVuLGNsb3NlLHJlYWQsd3JpdGUsbHNlZWssdW5saW5rLGdldHBpZCxraWxsLGZzdGF0LAorCWFyZ3ZsZW4sYXJndixjaGRpcixzdGF0LGNobW9kLHV0aW1lLHRpbWV9KTogRGVmaW5lLgorCShDQl9TWVNDQUxMKTogTmV3IHR5cGUuCisJKENCX1JDKTogTmV3IGVudW0uCisKK0ZyaSBOb3YgIDcgMTA6MzQ6MDkgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaDogQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKworCXByb2dyYW1zLgorCSogcmVtb3RlLXNpbS5oOiAgQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKworCXByb2dyYW1zLgorCitUdWUgT2N0IDE0IDE2OjA3OjUxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQKKwknc3ltYm9sX2F0X2FkZHJlc3NfZnVuYycuCisJKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGlzZSBuZXcgZmllbGQgd2l0aAorCWdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MuCisKK01vbiBPY3QgMTMgMTA6MTc6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmg6IENsYXJpZnkgc2ltX3JlYWQsIHNpbV93cml0ZSBNRU0gYXJndW1lbnQuCisKK1dlZCBTZXAgMjQgMTg6MDM6MTAgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoU0lNX1JDKTogIEFkZCBhIGJ1bmNoIG9mIG5ldyByZXR1cm4gY29kZXMgZm9yCisJYnJlYWtwb2ludCBzdHVmZi4KKwkqIEFkZCBmdW5jdGlvbnMgdG8gdGVsbCB0aGUgc2ltdWxhdG9yIHRvIHNldC9jbGVhci9lbmFibGUvZGlzYWJsZQorCWludHJpbnNpYyBicmVha3BvaW50cy4KKworVGh1IEF1ZyAyOCAxOTo0MTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGxpYmliZXJ0eS5oIChkdXBhcmd2KTogQWRkIHByb3RvdHlwZS4KKworVHVlIEF1ZyAyNiAxMjoyNTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZy4gRG9jdW1lbnQuCisKK01vbiBBdWcgMjUgMTA6NTA6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmggKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJnLiBEb2N1bWVudC4KKworRnJpIEF1ZyAgOCAxNjo0Mzo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKGFyY19nZXRfZGlzYXNzZW1ibGVyKTogRGVjbGFyZS4KKworV2VkIEp1bCAzMCAxMTozOTo1MCAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KKworCSogZGVtYW5nbGUuaCAoRE1HTF9KQVZBKTogIE5ldyBvcHRpb24gdG8gcmVxdWVzdCBKYXZhIGRlbWFuZ2xpbmcuCisKK1R1ZSBKdWwgMjIgMTc6NTk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaCAoUEVYRUNVVEVfKik6IERlZmluZS4KKwkocGV4ZWN1dGUsIHB3YWl0KTogRGVjbGFyZS4KKworRnJpIEp1biAgNiAxMzowMjozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX2tpbGwpOiBNYXJrIGFzIGRlcHJlY2lhdGVkLgorCitGcmkgTWF5IDIzIDEzOjQzOjQxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRhc2tfbGluayBtZW1iZXIuCisKK1RodSBNYXkgMjIgMTE6MzI6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmg6IFJldmlldyBkb2N1bWVudGF0aW9uLiAgQ2xhcmlmeSByZXN0cmljdGlvbnMgb24KKyAJd2hlbiBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4KKworV2VkIE1heSAyMSAxNjo0Nzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX3NldF9wcm9maWxlX3NpemUpOiBBZGQgcHJvdG90eXBlLCBkb2N1bWVudCBhcworIAlkZXByZWNpYXRlZC4KKworVHVlIE1heSAyMCAwOTozMjoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgc3RydWN0LgorCShzaW1fc2V0X2NhbGxiYWNrcyk6IERyb3AgU0lNX0RFU0MgYXJndW1lbnQuIERvY3VtZW50LgorCShzaW1fc2l6ZSk6IFJlbW92ZSByZWNlbnRseSBhZGRlZCBTSU1fREVTQyBhcmd1bWVudC4gRG9jdW1lbnQuCisKK01vbiBNYXkgMTkgMTk6MTQ6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmg6IFBhc3MgU0QgaW50byBzaW1fc2l6ZS4KKworVGh1IE1heSAxNSAwMToyNDoxNiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG9ic3RhY2suaCAob2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcsIG9ic3RhY2tfY2h1bmtmdW4sCisJb2JzdGFja19mcmVlZnVuKTogRWxpbWluYXRlIGNvbXBpbGUgd2FybmluZ3MgaW4gZ2RiLgorCitUdWUgTWF5IDEzIDEwOjIxOjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvZmYvYXJtLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGZsYWcgYml0cyBGX0FQQ1NfMjYgYW5kCisJRl9BUENTX1NFVCBmb3IgdGhlIGZfZmxhZ3MgZmllbGQgb2YgdGhlIGZpbGVoZHIgc3RydWN0dXJlLiAgQWRkZWQgbmV3CisJZmxhZ3M6IEZfQVBDUzI2LCBGX0FSTV8yLCBGX0FSTV8zLCBGX0FSTV83LCBGX0FSTV83VCB0byBzdG9yZQorCWluZm9ybWF0aW9uIGluIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUgdXNlZCBieSBCRkQKKwlyb3V0aW5lcy4KKworVHVlIEFwciAyMiAxMDoyNDozNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyk6IEFkZCBjb21tZW50cyBmb3IgcHJldmlvdXMKKwlmb3JtYXRzIGFuZCBhZGQgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkLCBwcmltYXJpbHkgZm9yIEFSTS4KKwlBZGQgZGVjbGFyYXRpb24gZm9yIGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZC4KKworRnJpIEFwciAxOCAxMzowNDo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3ApOiBOZXcgaW50ZXJmYWNlIC0gYXN5bmNocm9ub3VzCisgCW5vdGlmaWNhdGlvbiBvZiBhIHJlcXVlc3QgdG8gc3RvcCAvIHN1c3BlbmQgdGhlIHJ1bm5pbmcKKyAJc2ltdWxhdGlvbi4KKworCSogcmVtb3RlLXNpbS5oIChlbnVtIHNpbV9zdG9wKTogQWRkIHNpbV9ydW5uaW5nIGFuZCBzaW1fcG9sbGluZyBhcworIAlzdGF0ZXMgZm9yIHVzZSBpbnRlcm5hbCB0byBzaW11bGF0b3JzLgorCisJKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1dCk6IFB1dCBhIG1hZ2ljIG51bWJlciBhdAorIAl0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QgdG8gYWxsb3cgYmFzaWMgY2hlY2tpbmcuCisJKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCApOiBBZGQgcG9sbF9xdWl0IC0gc28KKyAJdGhhdCB0aGUgY29uc29sZSBldGMgY2FuIGJlIHBvbGxlZCBhdCByZWd1bGFyIGludGVydmFscy4KKworVGh1IEFwciAxNyAwMjoxNzoxMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmggKHN0cnVjdCBfYmZkKTogRGVjbGFyZS4KKwkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBgYWJmZCcuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBgc3RhcnRfYWRkcmVzcycuCisKK1dlZCBBcHIgIDIgMTc6MDk6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX3RyYWNlLCBzaW1fc2l6ZSk6IE1ha2UgdGhlc2UgZ2xvYmFsLiAgVGhleQorIAl3aWxsIGdvIGF3YXkgc2hvcnRseS4KKworV2VkIEFwciAgMiAxNToyMzo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmggKFNJTV9PUEVOX0tJTkQsIFNJTV9SQyk6IE5ldyBlbnVtcy4KKwkoc2ltX29wZW4pOiBOZXcgYXJndW1lbnQgYGtpbmQnLgorCitXZWQgQXByICAyIDE0OjQ1OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgorCitGcmkgTWFyIDI4IDE1OjI5OjU0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oICh0b3AgbGV2ZWwpOiBJbmNsdWRlIHN0ZGFyZy5oIG9yIHZhcmFyZ3MuaCBpZgorCXZhX3N0YXJ0IGlzIG5vdCBkZWZpbmVkLgorCShob3N0X2NhbGxiYWNrX3N0cnVjdCk6IE1ha2UgeyxlfXZwcmludGZfZmlsdGVyZWQgdGFrZSBhIHZhX2xpc3QKKwlpbnN0ZWFkIG9mIHZvaWQgKiwgc2luY2UgdmFfbGlzdCBtaWdodCBiZSBhbiBhcnJheSBvciBzdHJ1Y3R1cmUKKwl0eXBlLgorCitGcmkgTWFyIDI4IDE1OjQ0OjQxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEFkZCBwcm90b3R5cGUgZm9yIGdsaWJjIGFuZCBsaW51eC4KKworTW9uIE1hciAxNyAxOToyMjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamFsbG9jLmg6IE5ldyBmaWxlLgorCitNb24gTWFyIDE3IDE0OjU3OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmg6IE5ldyBmaWxlLCBjb3BpZWQgaW4gZnJvbSBnZGIvcmVtb3RlLXNpbS5oLiAgT25lCisgCWRheSB0aGlzIHdpbGwgYmUgcGxhY2VkIGluIGEgZGlyZWN0b3J5IG9mIGl0cyBvd24uCisKK1NhdCBNYXIgMTUgMTk6MDA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLgorCitUaHUgTWFyICA2IDE1OjQ2OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QpOiBBZGQgY2FsbGJhY2tzIC0KKyAJZmx1c2hfc3Rkb3V0LCB3cml0ZV9zdGRlcnIsIGZsdXNoX3N0ZGVyciwgdnByaW50Zl9maWx0ZXJlZCwKKyAJZXZwcmludGZfZmlsdGVyZWQuICBEZWxldGUgcmVkdW5kYW50IGNhbGxiYWNrcyAtIHByaW50Zl9maWx0ZXJlZC4KKworVGh1IEZlYiAyNyAyMzoxODoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KKwlmaWVsZHMuCisKK1R1ZSBGZWIgMjUgMDA6MTA6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGl6ZQorCWJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCisKK01vbiBGZWIgMjQgMTc6NDc6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgorCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIpOiBEZWZpbmUuCisJKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyk6IERlZmluZS4KKwkoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlKTogRGVmaW5lLgorCitUaHUgRmViICA2IDE0OjIwOjAxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEFkZCBuZXcgZmllbGRzCisJYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbiB0byBjb250cm9sIHRoZQorCWRpc3BsYXkgb2YgcmF3IGluc3RydWN0aW9ucy4KKworRnJpIERlYyAyNyAyMjoxNzozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzgwKTogRGVjbGFyZS4KKworU3VuIERlYyAgOCAxNzoxMToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oIChob3N0X2NhbGxiYWNrKTogTmV3IG1lbWJlciBgZXJyb3InLgorCitXZWQgTm92IDIwIDAwOjQwOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNhbGxiYWNrLmg6IE5ldyBmaWxlLCBtb3ZlZCBoZXJlIGZyb20gZ2RiLgorCitNb24gTm92IDE4IDE2OjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogbGliaWJlcnR5Lmg6IENoZWNraW4gYWdhaW47IGxhc3QgY2hlY2tpbiBmYWlsZWQgZHVlIHRvIHN0aWNreSB0YWcuCisKK1dlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaDogUmV2ZXJ0IGxhc3QgY29tbWl0IGR1ZSB0byBjb25mbGljdHMgd2l0aCBocHV4CisJc3lzdGVtIGhlYWRlcnMuCisKK1R1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaDogTW92ZSBwcm90b3R5cGVzIGZyb20gYXJndi5jIGhlcmUuCisKK1RodSBPY3QgMzEgMTQ6NTY6MTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYW5zaWRlY2wuaCAoVlBBUkFNUyxWQV9TVEFSVCk6IERlZmluZS4KKworRnJpIE9jdCAyNSAxMjowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IEFkZCBieXRlc19wZXJfbGluZSBmaWVsZC4KKwkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIGJ5dGVzX3Blcl9saW5lIGZpZWxkLgorCitUaHUgT2N0IDI0IDE3OjEwOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogQWRkIHN5bWJvbCBmaWVsZC4KKwkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIHN5bWJvbCBmaWVsZC4KKworVGh1IE9jdCAxNyAxMToxNzo0MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fbTMycik6IERlY2xhcmUuCisKK01vbiBPY3QgMTQgMjM6NTY6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaDogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMgZm9yIHhtYWxsb2MgYW5kIHhyZWFsbG9jLgorCitUaHUgT2N0ICAzIDEzOjQ1OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZm5tYXRjaC5oOiBOZXcgZmlsZS4KKworVGh1IE9jdCAgMyAxMDozMzoxNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tbjEweDAwKTogRGVsZXRlIGRlY2xhcmF0aW9uLgorCShwcmludF9pbnNuX21uMTAyMDAsIHByaW50X2luc25fbW4xMDMwMCk6IERlY2xhcmUuCisKK1dlZCBPY3QgIDIgMjE6MjQ6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fbW4xMHgwMCk6IERlY2xhcmUuCisKK01vbiBTZXAgMzAgMTM6NTY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGxpYmliZXJ0eS5oOiBSZW1vdmUgI2lmbmRlZiBQUklWQVRFX1hNQUxMT0MuCisKK1NhdCBBdWcgMzEgMTM6Mjc6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fdjg1MCk6IERlY2xhcmUuCisKK1R1ZSBBdWcgMTMgMTY6MTA6MzAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogb2JzdGFjay5oOiAgQ2hhbmdlIGJjb3B5IHRvIG1lbWNweS4gIFdvcmtzIGJldHRlciBvbiBQb3NpeAorCXN5c3RlbXMsIHdoaWNoIGdlbmVyYWxseSBsYWNrIGJjb3B5LgorCitNb24gQXVnIDEyIDE3OjAzOjE4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGFuc2lkZWNsLmg6ICBDaGFuZ2UgV0lOMzIgdG8gX1dJTjMyLgorCitGcmkgSnVsIDI2IDEzOjU4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGlzLWFzbS5oOiBBZGQgZmxhdm91ciBmaWVsZC4KKwkocHJpbnRfaW5zbl9hbHBoYSk6IERlY2xhcmUuCisJKHByaW50X2luc25fYWxwaGFfb3NmLCBwcmludF9pbnNuX2FscGhhX3Ztcyk6IERvbid0IGRlY2xhcmUuCisJKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IEluaXRpYWxpemUgZmxhdm91ciBmaWVsZC4KKworVHVlIEp1bCAyMyAxNzozNzo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbGliaWJlcnR5LmggKFBSSVZBVEVfWE1BTExPQyk6IEVuY2xvc2UgeG1hbGxvYy94cmVhbGxvYworCWRlZmluaXRpb25zIGluc2lkZSAjaWZuZGVmIHNvIHRoYXQgcHJvZ3JhbXMgdGhhdCB3YW50IHRvCisJY2FuIGRlZmluZSBQUklWQVRFX1hNQUxMT0MgYW5kIHRoZW4gZGVmaW5lIHhtYWxsb2MgYW5kCisJeHJlYWxsb2MgYW55d2F5IHRoZXkgd2FudC4KKwkoYmFzZW5hbWUpOiBEb2N1bWVudCBpbiBzb3VyY2UgdGhhdCB3ZSBjYW4ndCBkZWNsYXJlIHRoZQorIAlwYXJhbWV0ZXIgdHlwZSBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5IGFjcm9zcworCWRpZmZlcmVudCBzeXN0ZW1zLgorCitNb24gSnVsIDIyIDEzOjE2OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fYWxwaGEpOiBEb24ndCBkZWNsYXJlLgorCShwcmludF9pbnNuX2FscGhhX29zZiwgcHJpbnRfaW5zbl9hbHBoYV92bXMpOiBEZWNsYXJlLgorCitXZWQgSnVsIDE3IDE0OjQ1OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmg6IChwcmludF9pbnNuX2QxMHYpOiBEZWNsYXJlLgorCitNb24gSnVsIDE1IDE2OjU1OjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGRpcy1hc20uaDogIEdldCByaWQgb2YgZGVjbHMgZm9yIHByaW50X2luc25faTgwODYsCisJcHJpbnRfaW5zbl9zcGFyYzY0IGFuZCBwcmludF9pbnNuX3NwYXJjbGl0ZS4KKwkqIChJTklUX0RJU0FTU0VNQkxFX0lORk8pOiAgU3BsaXQgaW50byB0d28gcGllY2VzLiAgT25lLAorCUlOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIIGluaXRzIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciBlbmRpYW4sCisJbWFjaCwgYW5kIGFyY2guCisKK0ZyaSBKdWwgMTIgMTA6MTk6MjcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2k4MDg2KTogIERlY2xhcmUuCisKK1dlZCBKdWwgIDMgMTY6MDI6MzkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3NwYXJjbGl0ZSk6ICBEZWNsYXJlLgorCitUdWUgSnVuIDE4IDE2OjAyOjQ2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25faDgzMDBzKTogRGVjbGFyZS4KKworVHVlIEp1biAxOCAxNToxMTozMyAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogZm9wZW4tdm1zLmg6IE5ldyBmaWxlLgorCitUdWUgSnVuICA0IDE4OjU4OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBub3RpY2VfYWxsIGZpZWxkLgorCitGcmkgQXByIDI2IDEwOjMzOjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGRlbWFuZ2xlLmggKCNpZmRlZiBJTl9HQ0MpOiAjaW5jbHVkZSAiZ2Fuc2lkZWNsLmgiLgorCShQUk9UTyxQVFIsY29uc3QpOiBEZWxldGUuCisKK01vbiBBcHIgMjIgMTc6Mjc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRyYWRpdGlvbmFsX2Zvcm1hdCBmaWVsZC4KKworTW9uIEFwciAxNSAxNToxNjo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaCAoY2hvb3NlX3RlbXBfYmFzZSk6IEFkZCBwcm90b3R5cGUuCisKK1R1ZSBNYXIgMTIgMTc6Mjk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBEZWNsYXJlLgorCShzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCB3cmFwX2hhc2ggZmllbGQuCisKK1dlZCBGZWIgMTQgMTY6NDk6MTcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KKworCSogaWVlZS5oIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpOiBEZWZpbmUKKwlpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX2VudW0uCisKK0ZyaSBGZWIgIDIgMTc6MDk6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGRpcy1hc20uaCAoRElTQVNNX1JBV19JTlNOKTogRGVsZXRlLgorCitUdWUgSmFuIDIzIDA5OjIxOjQ3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IFNldCBlbmRpYW4gdG8gQkZEX0VORElBTl9VTktOT1dOLgorCU5ldyBhcmd1bWVudCBGUFJJTlRGX0ZVTkMuCisKK01vbiBKYW4gMjIgMTY6Mzc6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBtZW1iZXJzIGFyY2gsIG1hY2gsIGVuZGlhbi4KKwkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogSW5pdGlhbGl6ZSB0aGVtLgorCShESVNBU01fUkFXX0lOU057LEZMQUd9KTogRGVmaW5lLgorCitUaHUgSmFuIDE4IDExOjMyOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KKwljb25zdCBjaGFyICouCisJKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KKwljb25zdCBjaGFyICouCisKK0ZyaSBKYW4gIDUgMDA6MDE6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpZWVlLmggKGVudW0gaWVlZV9yZWNvcmQpOiBBZGQgaWVlZV9hc25fcmVjb3JkX2VudW0sCisJaWVlZV9hdF9yZWNvcmRfZW51bSwgaWVlZV90eV9yZWNvcmRfZW51bSwgaWVlZV9hdG5fcmVjb3JkX2VudW0sCisJaWVlZV9iYl9yZWNvcmRfZW51bSwgYW5kIGllZWVfYmVfcmVjb3JkX2VudW0uCisKK1dlZCBKYW4gIDMgMTM6MTI6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIG9ic3RhY2suaDogVXBkYXRlIGNvcHlyaWdodCB0byAxOTk2LgorCShfb2JzdGFja19tZW1vcnlfdXNlZCk6IERlY2xhcmUuCisJKG9ic3RhY2tfbWVtb3J5X3VzZWQpOiBEZWZpbmUgbWFjcm8uCisKK1RodSBEZWMgMjggMTE6NDI6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaCAoeHN0cmR1cCk6IERlY2xhcmUuCisKK1RodSBEZWMgMjEgMTQ6NDc6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiB3YWl0Lmg6IFByb3RlY3QgYWxsIG1hY3JvcyB3aXRoICNpZm5kZWYuCisKK1R1ZSBPY3QgMjQgMjE6NDU6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHN0YXRpY19saW5rIGZpZWxkLgorCitUdWUgU2VwIDEyIDE2OjI4OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIHN5bWJvbCBwYXJhbWV0ZXIgdG8KKwl3YXJuaW5nIGNhbGxiYWNrLgorCitGcmkgU2VwICAxIDEzOjExOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIHdhcm5pbmcgY2FsbGJhY2sKKwl0byB0YWtlIEJGRCwgc2VjdGlvbiwgYW5kIGFkZHJlc3MgYXJndW1lbnRzLgorCitUaHUgQXVnIDMxIDE2OjQ1OjEyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgUEUgc3R1ZmYuCisKK1R1ZSBBdWcgMjIgMDM6MTg6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJKiBsaWJpYmVydHkuaDogRGVjbGFyZSB4c3RyZXJyb3IuICBGcm9tIFBhdCBSYW5raW4uCisKK01vbiBBdWcgMjEgMTg6MTE6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBQRSBzdHVmZi4KKworV2VkIEF1ZyAgMiAwODoxNDoxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fc3BhcmM2NCk6IERlY2xhcmUuCisKK01vbiBKdWwgMTAgMTM6MjY6NDkgMTk5NSAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFpYi5jb20+CisKKwkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHN5bWJvbGljLgorCitTdW4gSnVsICAyIDE3OjQ4OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGJhc2VfZmlsZSB0bworCVBUUi4KKworVGh1IEp1biAyOSAwMDowMjo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkZWQgYmFzZV9maWxlIG1lbWJlci4KKworVHVlIEp1biAyMCAxNjo0MDowNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBhbnNpZGVjbC5oOiB3aW4zMnMgaXMgQU5TSSBlbm91Z2guCisKK1RodSBNYXkgMTggMDQ6MjU6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKKworCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2FybSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KKwkocHJpbnRfaW5zbl97bGl0dGxlLGJpZ31fYXJtKTogTmV3IGRlY2xhcmF0aW9ucy4KKworCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYXJtX2V4dCk6IERlY2xhcmUuCisKK1NhdCBNYXkgMTMgMTA6MTQ6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29mZi9wZS5oOiBOZXcgZmlsZS4KKwkqIGJmZGxpbmsuaCAoc3Vic3l0ZW0sIHN0YWNrX2hlYXBfcGFyYW1ldGVycyk6IE5ldy4KKwkqIGNvZmYvaTM4Ni5oIChOVF9TRUNUSU9OX0FMSUdOTUVOVCwgTlRfRklMRV9BTElHTk1FTlQsCisJTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBOZXcuCisJKiBjb2ZmL2ludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIpOiAgTmV3IGZpZWxkcyBmb3IgUEUuCisJKElNQUdFX0RBVEFfRElSRUNUT1JZKTogTmV3LgorCShpbnRlcm5hbF9hb3V0aGRyKTogTmV3IGZpZWxkcyBmb3IgUEUuCisKK1RodSBNYXkgIDQgMTQ6MzY6NDIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgYW5zaWRlY2wuaCBpZiBJTl9HQ0MuCisKK1R1ZSBGZWIgMjEgMDA6Mzc6MjggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwLXN5bXRhYi5oOiBEb24ndCB1c2UgYml0ZmllbGQgZW51bWVyYXRpb25zLCB0aGUgSFAgQyBjb21waWxlcgorCWRvZXMgbm90IGhhbmRsZSB0aGVtIGNvcnJlY3RseS4KKworVGh1IEZlYiAgOSAxNDoyMDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVyIHR5cGU7IHNvbWUKKwlzeXN0ZW1zIGhhdmUgdGhpcyBpbiB0aGVpciBoZWFkZXIgZmlsZXMuCisKK1dlZCBGZWIgIDggMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIGZvcm1hdCBvZiBjb21tb24KKwlzeW1ib2wgaW5mb3JtYXRpb24sIHRvIHJlbW92ZSByZXN0cmljdGlvbnMgb24gbWF4aW11bSBzaXplIGFuZAorCWFsaWdubWVudCBwb3dlciwgYnkgdXNpbmcgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIGluc3RlYWQuCisKK01vbiBGZWIgIDYgMTQ6NTU6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKGVudW0gYmZkX2xpbmtfaGFzaF90eXBlKTogUmVuYW1lIGJmZF9saW5rX2hhc2hfd2VhaworCXRvIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgQWRkIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KKworTW9uIEphbiAxNiAyMTowMDoyMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGRpcy1hc20uaCAoR0RCX0lOSVRfRElTQVNTRU1CTEVfSU5GTywgZXRjKTogUmVtb3ZlIGFsbAorCUdEQi1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKworU3VuIEphbiAxNSAxODozOTozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3c2NSk6IERlY2xhcmUuCisKK1RodSBKYW4gMTIgMTc6NTE6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbGliaWJlcnR5LmggKGhleF9wKTogRml4IHNlbnNlIG9mIHRlc3QuCisKK1dlZCBKYW4gMTEgMjI6MzY6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbGliaWJlcnR5LmggKF9oZXhfYXJyYXlfc2l6ZSwgX2hleF9iYWQsIF9oZXhfdmFsdWUsIGhleF9pbml0LAorCWhleF9wLCBoZXhfdmFsdWUpOiBOZXcgbWFjcm9zIGFuZCBkZWNsYXJhdGlvbnMsIGZvciBoZXguYy4KKworRnJpIEphbiAgNiAxNzo0NDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGRpcy1hc20uaDogTWFrZSBpZGVtcG90ZW50LgorCitXZWQgRGVjIDE0IDEzOjA4OjQzIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcHJvZ3Jlc3MuaDogTmV3IGZpbGUsIGVtcHR5IGRlZmluaXRpb25zIGZvciBwcm9ncmVzcyBtYWNyb3MuCisKK0ZyaSBOb3YgMjUgMDA6MTQ6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwLXN5bXRhYi5oOiBOZXcgZmlsZSBkZXNjcmliaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzIGVtaXR0ZWQKKwlieSB0aGUgSFAgQyBjb21waWxlcnMuCisKK0ZyaSBOb3YgMTEgMTU6NDg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGZyb20gMjQKKwl0byAyNiBiaXRzLCBhbmQgY2hhbmdlIHUuYy5hbGlnbm1lbnRfcG93ZXIgZnJvbSA4IHRvIDYgYml0cy4gIDYKKwliaXQgaW4gdGhlIGFsaWdubWVudCBwb3dlciBpcyBlbm91Z2ggZm9yIGEgNjQgYml0IGFkZHJlc3Mgc3BhY2UuCisKK01vbiBPY3QgMzEgMTM6MDI6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBkZW1hbmdsZS5oIChjcGx1c19tYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KKworVHVlIE9jdCAyNSAxMTozODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEZpeCBjb21tZW50cyBmb3IKKwltdWx0aXBsZV9jb21tb24gZmllbGQuCisKK1N1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKworCSogYW91dC9hb3V0NjQuaDogT25seSBkZWZpbmUgUU1BR0lDIGlmIGl0IGlzbid0IGFscmVhZHkgZGVmaW5lZC4KKworCSogZGlzLWFzbS5oOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KKworV2VkIEF1ZyAxMCAxMjo1MTo0MSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBsaWJpYmVydHkuaCAoc3Ryc2lnbmFsKTogRG9jdW1lbnQgaXRzIGV4aXN0ZW5jZSBldmVuIGlmIHdlCisJY2FuJ3QgZGVjbGFyZSBpdC4KKworVHVlIEF1ZyAgMiAxNDo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogb3M5ay5oOiBSZW1vdmUgdV9pbnQxNiwgdV9pbnQzMiwgYW5kIG93bmVyX2lkIHR5cGVkZWZzIGFuZAorCWV4cGFuZCB0aGVpciB1c2VzLiAgVGhvc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBNYWNoIGhlYWRlcnMuCisKK0ZyaSBKdWwgMjIgMTQ6MTc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGludG8gYQorCWJpdGZpZWxkLiAgQWRkIGZpZWxkIHUuYy5hbGlnbm1lbnRfcG93ZXIuCisKK1N1biBKdWwgMTAgMDA6MjY6MzkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCisKKwkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fbnMzMmsgZGVjbGFyYXRpb24uCisKK01vbiBKdW4gMjAgMTc6MTM6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBiZmRsaW5rLmggKGJmZF9saW5rX2hhc2hfdGFibGUpOiBNYWtlIGNyZWF0b3IgYSBjb25zdCBwb2ludGVyLgorCitTYXQgSnVuIDE4IDE2OjA5OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KKworVGh1IEp1biAxNiAxNToxOTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHNoYXJlZC4KKworTW9uIEp1biAgNiAxNDozOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgd3JpdHRlbiBmaWVsZDoKKwlub3QgbmVlZGVkIGZvciBhbGwgYmFja2VuZHMuCisKK1RodSBBcHIgMjggMTk6MDY6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgorCitGcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKKworICAgICAgICAqIG9ic3RhY2suaDogRGVsZXRlIHVzZSBvZiBJTl9HQ0MgdG8gY29udHJvbCB3aGV0aGVyCisgICAgICAgIHN0ZGRlZi5oIG9yIGdzdGRkZWYuaCBpcyBpbmNsdWRlZC4KKworVHVlIE1hciAyMiAxMzowNjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGJmZGxpbmsuaCAoZW51bSBiZmRfbGlua19vcmRlcl90eXBlKTogQWRkIGJmZF9kYXRhX2xpbmtfb3JkZXIuCisJKHN0cnVjdCBiZmRfbGlua19vcmRlcik6IEFkZCBkYXRhIGZpZWxkIHRvIHVuaW9uLgorCitNb24gTWFyIDIxIDE4OjQ1OjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIGJpdHNpemUgYXJndW1lbnQKKwl0byBhZGRfdG9fc2V0IHRvIHJlbG9jLiAgUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbSBjb25zdHJ1Y3Rvci4KKwlDb21tZW50IHRoYXQgcmVsb2Nfb3ZlcmZsb3csIHJlbG9jX2Rhbmdlcm91cyBhbmQgdW5hdHRhY2hlZF9yZWxvYworCW11c3QgaGFuZGxlIE5VTEwgcG9pbnRlcnMgZm9yIHJlbG9jIGxvY2F0aW9uLgorCShlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUpOiBBZGQgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBhbmQKKwliZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIuCisJKHN0cnVjdCBiZmRfbGlua19vcmRlcik6IEFkZCByZWxvYyBmaWVsZCB0byB1bmlvbi4KKwkoc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jKTogRGVmaW5lLgorCitNb24gTWFyIDE0IDEyOjI3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogaWVlZS1mbG9hdC5oOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KKworVHVlIE1hciAgMSAxODoxMDo0OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBvczlrLmg6IG9zOTAwMCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyIGZpbGUsIHRoZSBoZWFkZXIgb2YgdGhlCisJb2JqZWN0IGZpbGUgaXMgdXNlZCBub3cuCisKK1N1biBGZWIgMjcgMjE6NTI6MjYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGZsb2F0Zm9ybWF0Lmg6IE5ldyBmaWxlLCBpbnRlbmRlZCB0byByZXBsYWNlIGllZWUtZmxvYXQuaC4KKworU3VuIEZlYiAyMCAxNzoxNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogYW5zaWRlY2wuaCAoQU5TSV9QUk9UT1RZUEVTKTogRGVmaW5lIGlmIHVzaW5nIEFOU0kgcHJvdG90eXBlcy4KKworV2VkIEZlYiAxNiAwMTowNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxpYmliZXJ0eS5oOiBEb24ndCBkZWNsYXJlIHN0cnNpZ25hbCwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGgKKwlTb2xhcmlzIHN5c3RlbSBoZWFkZXIgZmlsZXMuCisKK1NhdCBGZWIgMTIgMjI6MTE6MzIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IFVzZSBfX3ZvbGF0aWxlX18gdG8gYXZvaWQgbG9zaW5nIGlmCisJY29tcGlsaW5nIHdpdGggZ2NjIC10cmFkaXRpb25hbC4KKworVGh1IEZlYiAxMCAxNDowNTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxpYmliZXJ0eS5oOiBOZXcgZmlsZS4gIERlY2xhcmVzIGZ1bmN0aW9ucyBwcm92aWRlZCBieQorCWxpYmliZXJ0eS4KKworVHVlIEZlYiAgOCAwNToxOTo1MiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwlIYW5kbGUgb2JzdGFja19jaHVua19hbGxvYyByZXR1cm5pbmcgTlVMTC4gIFRoaXMgYWxsb3dzCisJb2JzdGFja3MgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMsIHdpdGhvdXQgZm9yY2luZyB0aGVtCisJdG8gY2FsbCBleGl0IG9yIGxvbmdqbXAuCisJKiBvYnN0YWNrLmggKHN0cnVjdCBvYnN0YWNrKTogQWRkIGFsbG9jX2ZhaWxlZCBmbGFnLgorCV9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xKTogRGVjbGFyZSB0byByZXR1cm4gaW50LCBub3Qgdm9pZC4KKwkob2JzdGFja19maW5pc2gpOiBJZiBhbGxvY19mYWlsZWQsIHJldHVybiBOVUxMLgorCShvYnN0YWNrX2Jhc2UsIG9ic3RhY2tfbmV4dF9mcmVlLCBvYmpzdGFja19vYmplY3Rfc2l6ZSk6CisJSWYgYWxsb2NfZmFpbGVkLCByZXR1cm4gMC4KKwkob2JzdGFja19ncm93LCBvYnN0YWNrX2dyb3cwLCBvYnN0YWNrXzFncm93LCBvYnN0YWNrX3B0cl9ncm93LAorCW9ic3RhY2tfaW50X2dyb3csIG9ic3RhY2tfYmxhbmspOiBJZiBhbGxvY19mYWlsZWQsIGRvIG5vdGhpbmcgdGhhdAorCWNvdWxkIGNvcnJ1cHQgdGhlIG9ic3RhY2suCisKK01vbiBKYW4gMjQgMTU6MDY6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgbmFtZSwgcmVsb2NfbmFtZSBhbmQKKwlhZGRlbmQgYXJnbWVudHMgdG8gcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCisKK0ZyaSBKYW4gMjEgMTk6MTM6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25fYmlnX3Bvd2VycGMsIHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMsCisJcHJpbnRfaW5zbl9yczYwMDApOiBEZWNsYXJlLgorCitUaHUgSmFuICA2IDE0OjE1OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIGJpdHNpemUgYXJndW1lbnQgdG8KKwlhZGRfdG9fc2V0IGZpZWxkLiAgQWRkIG5ldyBjYWxsYmFjayBuYW1lZCBjb25zdHJ1Y3Rvci4KKworVGh1IERlYyAzMCAxMDo0NDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQorCisJKiBiZmRsaW5rLmg6IE5ldyBmaWxlIGZvciBuZXcgQkZEIGxpbmtlciBiYWNrZW5kIHJvdXRpbmVzLgorCitNb24gTm92IDI5IDEwOjQzOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oIChlbnVtIGRpc19pbnNuX3R5dXBlKTogUmVtb3ZlIG5vbi1BTlNJIHRyYWlsaW5nIGNvbW1hLgorCitTYXQgT2N0ICAyIDIwOjQyOjI2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmg6IE1vdmUgY29tbWVudCB0byByaWdodCBwbGFjZS4KKworTW9uIEF1ZyAgOSAxOTowMzozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG9ic3RhY2suaCAob2JzdGFja19jaHVua2Z1biwgb2JzdGFja19mcmVlZnVuKTogQWRkIGRlZm5zIGZyb20KKwlwcmV2aW91cyB2ZXJzaW9uLiAgQXJlIHRoZXNlIEN5Z251cyBsb2NhbCBjaGFuZ2VzPworCitGcmkgQXVnICA2IDE3OjA1OjQ3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0LmgsIG9ic3RhY2suaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KKworTW9uIEF1ZyAgMiAxNjozNzoxNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmL2kzODYuaDogIEFkZCBMeW54IG1hZ2ljIG51bWJlci4KKworTW9uIEF1ZyAgMiAxNDo0NToyOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oOiAgTW92ZSBlbnVtIG91dHNpZGUgb2Ygc3RydWN0IGRlZm4gdG8gYXZvaWQgd2FybmluZ3MuCisKK01vbiBBdWcgIDIgMDg6NDk6MzAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogd2FpdC5oIChXRVhJVFNUQVRVUywgV1NUT1BTSUcpOiBNYXNrIGRvd24gdG8gOCBiaXRzLiAgVGhpcyBpcworCWZvciBzeXN0ZW1zIHRoYXQgc3RvcmUgc3R1ZmYgaW50byB0aGUgaGlnaCAxNiBiaXRzIG9mIGEgd2FpdAorCXN0YXR1cy4KKworRnJpIEp1bCAzMCAxODozODowMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oOiAgQWRkIG5ldyBmaWVsZHMgaW5zbl9pbmZvX3ZhbGlkLCBicmFuY2hfZGVsYXlfaW5zbnMsCisJZGF0YV9zaXplLCBpbnNuX3R5cGUsIHRhcmdldCwgdGFyZ2V0Mi4gIFRoZXNlIGFyZSB1c2VkIHRvIHJldHVybgorCWluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIGJhY2sgdG8gdGhlIGNhbGxpbmcKKwlwcm9ncmFtLiAgQWRkIGNvbW1lbnRzLCBtYWtlIG1vcmUgcmVhZGFibGUuCisKK01vbiBKdWwgMTkgMjI6MTQ6MTQgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG5sbTogIE5ldyBkaXJlY3RvcnkgY29udGFpbmluZyBOTE0vTmV0V2FyZSBpbmNsdWRlcy4KKworVGh1IEp1bCAxNSAxMjoxMDowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQgYXBwbGljYXRpb25fZGF0YS4KKworVGh1IEp1bCAxNSAxMjo0MToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGRpcy1hc20uaDogQWRkZWQgZGVjbGFyYXRpb24gb2YgcHJpbnRfaW5zbl9tODhrLgorCitUaHUgSnVsICA4IDA5OjA1OjI2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIG9wY29kZS9oODMwMC5oOiBMb3RzIG9mIGxpdHRsZSBmaXhlcyBmb3IgdGhlIGg4LzMwMGguCisKK0ZyaSBKdWwgIDIgMTA6MzE6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhbnNpZGVjbC5oOiBVc2UgQU5TSSBtYWNyb3MgaWYgX19taXBzIGFuZCBfU1lTVFlQRV9TVlI0IGFyZQorCWRlZmluZWQsIHNpbmNlIFJJU0MvT1MgY2MgaGFuZGxlcyBBTlNJIGRlY2xhcmF0aW9ucyBpbiBTVlI0IG1vZGUKKwlidXQgZG9lcyBub3QgZGVmaW5lIF9fU1REQ19fLgorCitTdW4gSnVuIDIwIDE4OjI3OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmg6IERvbid0IG5lZWQgdG8gaW5jbHVkZSBhbnNpZGVjbC5oIGFueSBtb3JlLgorCitGcmkgSnVuIDE4IDAzOjIyOjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBvYXN5cy5oOiAgRWxpbWluYXRlICJpbnQ4X3R5cGUiLCAiaW50MTZfdHlwZSIsICJpbnQzMl90eXBlIiwgYW5kCisJdGhlaXIgdmFyaWFudHMuICBUaGVzZSBjaGFuZ2VzIGFyZSBjb29yZGluYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcKKwljaGFuZ2VzIGluIC4uL2JmZC9vYXN5cy5jLgorCitXZWQgSnVuIDE2IDEwOjQzOjA4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBiZmQuaDogIE5vdGUgdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkLgorCitUdWUgSnVuICA4IDEyOjE2OjAzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkgU3VwcG9ydCBmb3IgSDgvMzAwLUgKKwkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9oODMwMCwgcHJpbnRfaW5zbl9oODMwMGgpOiBEZWNsYXJlIGl0LgorCSogY29mZi9oODMwMC5oOiBOZXcgbWFnaWMgbnVtYmVyLgorCSogY29mZi9pbnRlcm5hbC5oOiBOZXcgcmVsb2NhdGlvbnMuCisJKiBvcGNvZGUvaDgzMDAuaDogTG90cyBvZiBuZXcgb3Bjb2Rlcy4KKworVHVlIEp1biAgMSAwNzozNTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogYW5zaWRlY2wuaCAoY29uc3QpOiBEb24ndCBkZWZpbmUgaXQgaWYgaXQncyBhbHJlYWR5IGRlZmluZWQuCisKK1RodSBNYXkgMjcgMTg6MTk6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmggKHByaW50X2luc25faHBwYSk6IERlY2xhcmUgaXQuCisKKwkqIGJmZC5oOiBNb3ZlZCB0byBiZmQgZGlyZWN0b3J5LiAgU21hbGwgc3R1YiBoZXJlIGluY2x1ZGVzIGl0CisJd2l0aG91dCByZXF1aXJpbmcgIi1JLi4vYmZkIi4KKworVGh1IEFwciAyOSAxMjowNjoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYmZkLmg6IFVwZGF0ZWQgd2l0aCBCU0ZfRlVOQ1RJT04uCisKK01vbiBBcHIgMjYgMTg6MTU6NTAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGJmZC5oLCBkaXMtYXNtLmg6IFVwZGF0ZWQgd2l0aCBIaXRhY2hpIFNILgorCitGcmkgQXByIDIzIDE4OjQxOjM4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQuaDogVXBkYXRlZCB3aXRoIGFscGhhIGNoYW5nZXMuCisJKiBkaXMtYXNtLmg6IEFkZGVkIGFscGhhLgorCitGcmkgQXByIDE2IDE3OjM1OjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBiZmQuaDogVXBkYXRlIGZvciBzaWduZWQgYmZkXypnZXRfKi4KKworVGh1IEFwciAxNSAwOToyNDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogYmZkLmg6IFVwZGF0ZWQgZm9yIGZpbGVfdHJ1bmNhdGVkIGVycm9yLgorCitUaHUgQXByICA4IDEwOjUzOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYW5zaWRlY2wuaDogSWYgbm8gQU5TSSwgZGVmaW5lIGNvbnN0IHRvIGJlIGVtcHR5LgorCitUaHUgQXByICAxIDA5OjAwOjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmg6IERlY2xhcmUgYTI5ayBhbmQgaTk2MCBwcmludF9pbnNuXyouCisKKwkqIGRpcy1hc20uaDogQWRkIHByaW50X2FkZHJlc3NfZnVuYyBhbmQgcmVsYXRlZCBzdHVmZi4KKworCSogZGlzLWFzbS5oIChkaXNfYXNtX3JlYWRfbWVtb3J5KTogRml4IHByb3RvdHlwZS4KKworV2VkIE1hciAzMSAxNzo0MDoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfaW5zbl9zcGFyYy4KKworV2VkIE1hciAzMSAxNzo1MTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiBVcGRhdGVkIGZvciBCRkRfUkVMT0NfTUlQU19HUFJFTCBhbmQgYmZkX1tnc11ldF9ncF9zaXplCisJcHJvdG90eXBlcy4KKworV2VkIE1hciAzMSAxNjozNToxMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEZpeCB0eXBvIGluIHByb3RvdHlwZSBvZgorCWRpc19hc21fbWVtb3J5X2Vycm9yKCkuCisKK1R1ZSBNYXIgMzAgMTk6MDk6MjMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVyX2luZm8pOiBBZGQgcmVhZF9tZW1vcnlfZnVuYywKKwltZW1vcnlfZXJyb3JfZnVuYywgYnVmZmVyLCBhbmQgbGVuZ3RoLgorCSh7R0RCXyx9SU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogU2V0IHRoZW0uCisJcHJpbnRfaW5zbl8qOiBSZW1vdmUgc2Vjb25kIGFyZ3VtZW50LgorCitUdWUgTWFyIDMwIDE0OjQ4OjU1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQuaDogVXBkYXRlIGZvciBsbWEgZmllbGQgb2Ygc2VjdGlvbi4KKworVHVlIE1hciAzMCAxMjoyMjo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogYW5zaWRlY2wuaDogVXNlIEFOU0kgdmVyc2lvbnMgb24gQUlYIHJlZ2FyZGxlc3Mgb2YgX19TVERDX18uCisKK0ZyaSBNYXIgMTkgMTQ6NDk6NDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGRpcy1hc20uaDogQWRkIGg4NTAwLgorCitUaHUgTWFyIDE4IDEzOjQ5OjA5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogaWVlZS1mbG9hdC5oOiAgTW92ZWQgZnJvbSAuLi9nZGIuCisJKiBkaXMtYXNtLmg6ICBOZXcgZmlsZS4gIEludGVyZmFjZSB0byBkaXMtYXNzZW1ibGVyLgorCitUaHUgTWFyIDExIDEwOjUyOjU3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkZW1hbmdsZS5oIChETUdMX05PX09QVFMpOiAgQWRkIGRlZmluZSAoc2V0IHRvIDApIHRvIHVzZQorCWluIHBsYWNlIG9mIGJhcmUgMCwgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMuCisKK1R1ZSBNYXIgIDIgMTc6NTA6MTEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGRlbWFuZ2xlLmg6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNmcm9udCB3aXRoIEFSTS4KKworVHVlIEZlYiAyMyAxMjoyMToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiBVcGRhdGUgZm9yIG5ldyBlbGVtZW50cyBpbiBKVU1QX1RBQkxFLgorCitUdWUgRmViIDE2IDAwOjUxOjMwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBiZmQuaDogIFVwZGF0ZSBmb3IgQkZEX1ZFUlNJT04gMi4xLgorCitUdWUgSmFuIDI2IDExOjQ5OjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYmZkLmg6IFVwZGF0ZSBmb3IgU0VDX0lTX0NPTU1PTiBmbGFnLgorCitUdWUgSmFuIDE5IDEyOjI1OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYmZkLmg6IFVwZGF0ZSBmb3IgYmZkX2FzeW1ib2xfdmFsdWUgYnVnIGZpeC4KKworRnJpIEphbiAgOCAxNjozNzoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGJmZC5oOiBVcGRhdGUgdG8gaW5jbHVkZSBFQ09GRiB0ZGF0YSBhbmQgdGFyZ2V0X2ZsYXZvdXIuCisKK1N1biBEZWMgMjcgMTc6NTI6MzAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiAgQWRkIGRlY2xhcmF0aW9uIGZvciBiZmRfZ2V0X3NpemUoKS4KKworVHVlIERlYyAyMiAyMjo0Mjo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZGVtYW5nbGUuaDogIFByb3RlY3QgZmlsZSBmcm9tIG11bHRpcGxlIGluY2x1c2lvbnMgd2l0aAorCSNpZiAhZGVmaW5lZChERU1BTkdMRV9IKS4uLiNkZWZpbmUgREVNQU5HTEVfSC4uLiNlbmRpZi4KKworTW9uIERlYyAyMSAyMToyNTo1MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBiZmQuaDogIFVwZGF0ZSB0byBnZXQgaHBwYV9jb3JlX3N0cnVjdCBmcm9tIGJmZC5jLgorCitUaHUgRGVjIDE3IDAwOjQyOjM1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBiZmQuaDogIFVwZGF0ZSB0byBnZXQgdGVraGV4IHRkYXRhIG5hbWUgY2hhbmdlIGZyb20gYmZkLgorCitNb24gTm92ICA5IDIzOjU1OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBhbnNpZGVjbC5oOiAgVXBkYXRlIGNvbW1lbnRzIHRvIGRpc2NvdXJhZ2UgdXNlIG9mIEVYRlVOLgorCitUaHUgTm92ICA1IDE2OjM1OjQ0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYmZkLmg6IFVwZGF0ZSB0byBicmluZyBpbiBTRUNfU0hBUkVEX0xJQlJBUlkuCisKK1RodSBOb3YgIDUgMDM6MjE6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIEVYRlVOLCBiZmRfc2VjbGV0X3N0cnVjdCwgYW5kIFNERUYKKwljbGVhbnVwcyBpbiBiZmQuCisKK1dlZCBOb3YgIDQgMDc6Mjg6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGJvdXQuaCAoTl9DQUxMTkFNRSwgTl9CQUxOQU1FKTogRGVmaW5lIGFzIGNoYXItdHlwZSB2YWx1ZXMsIHNvCisJd2lkZW5pbmcgd29ya3MgY29uc2lzdGVudGx5LgorCitGcmkgT2N0IDE2IDAzOjE3OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZXRvcHQuaDogIFVwZGF0ZSB0byBSZXZpc2VkIFN0YW5kYXJkIEZTRiBWZXJzaW9uLgorCitUaHUgT2N0IDE1IDIxOjQzOjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0LmggKHN0cnVjdCBvcHRpb24pOiB1c2UgdGhlIHByb3ZpZGVkIGVudW0gZm9yIGhhc19hcmcuCisKKwkqIGRlbWFuZ2xlLmggKEFVVE9fREVNQU5HTElORywgR05VX0RFTUFOR0xJTkcsCisJICBMVUNJRF9ERU1BTkdMSU5HKTogdWx0cml4IGNvbXBpbGVycyByZXF1aXJlIGVudW1zIHRvIGJlCisJICBlbnVtcyBhbmQgaW50cyB0byBiZSBpbnRzIGFuZCBjYXN0cyB3aGVyZSB0aGV5IG1lZXQuICBjYXN0IHNvbWUKKwkgIGVudW1zIGludG8gaW50cy4KKworVGh1IE9jdCAxNSAwNDozNTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYmZkLmg6ICBVcGRhdGUgYWZ0ZXIgY29tbWVudCBjaGFuZ2VzLgorCitUaHUgT2N0ICA4IDA5OjAzOjAyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQuaCAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogbmV3IG1hY3JvIGZvciBnZXR0aW5nIGluIHh2ZWMKKworVGh1IFNlcCAgMyAwOToxMDo1MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBiZmQuaCAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6ICBzaXplIG5lZWRzIHRvIGJlIHNpZ25lZCBpZgorCWl0J3MgZ29pbmcgdG8gaG9sZCBuZWdhdGl2ZSB2YWx1ZXMuCisKK1N1biBBdWcgMzAgMTc6NTA6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBkZW1hbmdsZS5oOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiLiAgTWFkZSBpbmRlcGVuZGVudAorCW9mIGdkYi4gIEFsbG93IGRlbWFuZ2xpbmcgc3R5bGUgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhCisJcGFyYW1ldGVyIHRvIGNwbHVzX2RlbWFuZ2xlKCksIGJ1dCB1c2luZyB0aGUKKwljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgZ2xvYmFsIGFzIHRoZSBkZWZhdWx0LgorCitTYXQgQXVnIDI5IDEwOjA3OjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmg6ICBNZXJnZSBjb21tZW50IGNoYW5nZSBmcm9tIGN1cnJlbnQgRlNGIHZlcnNpb24uCisKK1RodSBBdWcgMjcgMTI6NTk6MjkgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKKworCSogYmZkLmg6IGFkZCB3ZTMyaworCitUdWUgQXVnIDI1IDE1OjA3OjQ3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQuaDogbmV3IGFmdGVyIFo4MDAwIHN0dWZmCisKK01vbiBBdWcgMTcgMDk6MDE6MjMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiBSZWdlbmVyYXRlZCBhZnRlciBwYWdlL3NlZ21lbnQgc2l6ZSBjaGFuZ2VzLgorCitTYXQgQXVnICAxIDEzOjQ2OjMxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmg6IE1lcmdlIGNoYW5nZXMgZnJvbSBjdXJyZW50IEZTRiB2ZXJzaW9uLgorCitNb24gSnVsIDIwIDIxOjA2OjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmggKGFyZWFfaWQsIGZsYWdzKTogIFJlbW92ZSwgcmVwbGFjZSB3aXRoIGV4dHJhX2FyZywKKwl1c2VfZXh0cmFfYXJnLCBhbmQgbWF5YmVfZW1wdHlfb2JqZWN0LgorCSogb2JzdGFjay5oIChPQlNUQUNLX01BWUJFX0VNUFRZX09CSkVDVCwgT0JTVEFDS19NTUFMTE9DX0xJS0UpOgorCVJlbW92ZSwgcmVwbGFjZWQgYnkgbWF5YmVfZW1wdHlfb2JqZWN0IGFuZCB1c2VfZXh0cmFfYXJnIGJpdGZpZWxkcy4KKwkqIG9ic3RhY2suaCAob2JzdGFja19mdWxsX2JlZ2luLCBfb2JzdGFja19iZWdpbik6ICBSZW1vdmUgYXJlYV9pZAorCWFuZCBmbGFncyBhcmd1bWVudHMuCisJKiBvYnN0YWNrLmggKG9ic3RhY2tfYWxsb2NfYXJnKTogIE5ldyBtYWNybyB0byBzZXQgZXh0cmFfYXJnLgorCitUaHUgSnVsIDE2IDA4OjEyOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBiZmQuaDogbmV3IGFmdGVyIGFkZGluZyBCRkRfSVNfUkVMQVhBQkxFCisKK1NhdCBKdWwgIDQgMDM6MjI6MjMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiAgUmVnZW4gYWZ0ZXIgYWRkaW5nIEJTRl9GSUxFLgorCitNb24gSnVuIDI5IDE0OjE4OjM2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBzdW5maXNoKQorCisJKiBvYnN0YWNrLmg6ICBDb252ZXJ0IGJjb3B5KCkgdXNlIHRvIG1lbWNweSgpLCB3aGljaCBpcyBtb3JlCisJcG9ydGFibGUsIG1vcmUgc3RhbmRhcmQsIGFuZCBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgZ2NjJ3MgYnVpbHRpbgorCWZ1bmN0aW9ucyBmb3IgaW5jcmVhc2VkIHBlcmZvcm1hbmNlLgorCitUaHUgSnVuIDI1IDA0OjQ2OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBhbnNpZGVjbC5oIChQQVJBTVMpOiAgSW5jb3Jwb3JhdGUgdGhpcyBtYWNybyBmcm9tIGdkYidzIGRlZnMuaC4KKwlJdCdzIGEgY2xlYW5lciB3YXkgdG8gZm9yd2FyZC1kZWNsYXJlIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisKK0ZyaSBKdW4gMTkgMTU6NDY6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogYmZkLmg6ICBIUFBBIG1lcmdlLgorCitUdWUgSnVuIDE2IDIxOjMwOjU2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBnZXRvcHQuaDogZ3JhdHVpdG91cyB3aGl0ZSBzcGFjZSBjaGFuZ2VzIG1lcmdlZCBmcm9tIG90aGVyIHByZXAKKwkgIHJlbGVhc2VzLgorCitUaHUgSnVuIDExIDAxOjEwOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBiZmQuaDogIFJlZ2VuJ2QgZnJvbSBiZmQuYyBhZnRlciByZW1vdmluZyBlbGZfY29yZV90ZGF0YV9zdHJ1Y3QuCisKK01vbiBNYXkgMTggMTc6Mjk6MDMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIG1ha2UtMy42Mi4xMS4KKworCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gZ3JlcC0xLjYgKGFscGhhKS4KKworRnJpIE1heSAgOCAxNDo1MzozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gYmlzb24tMS4xOC4KKworU2F0IE1hciAxNCAxNzoyNToyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogb2JzdGFjay5oOiAgQWRkICJhcmVhX2lkIiBhbmQgImZsYWdzIiBtZW1iZXJzIHRvIG9ic3RhY2sKKwlzdHJ1Y3R1cmUuICBBZGQgb2JzdGFja19jaHVua2Z1bigpIGFuZCBvYnN0YWNrX2ZyZWVmdW4oKSB0bworCXNldCBmdW5jdGlvbnMgZXhwbGljaXRseS4gIENvbnZlcnQgbWF5YmVfZW1wdHlfb2JqZWN0IHRvCisJYSBiaXQgaW4gImZsYWdzIi4KKworVGh1IEZlYiAyNyAyMjowMTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogd2FpdC5oIChXSUZTVE9QUEVEKTogIEFkZCBJQk0gcnM2MDAwLXNwZWNpZmljIHZlcnNpb24uCisKK0ZyaSBGZWIgMjEgMjA6NDk6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG9ic3RhY2suaDogIEFkZCBvYnN0YWNrX2Z1bGxfYmVnaW4uCisJKiBiZmQuaCwgb2JzdGFjay5oOiAgUHJvdG9saW50LgorCitUaHUgSmFuIDMwIDAxOjE4OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBiZmQuaDogIFJlbW92ZSBjb21tYSBmcm9tIGVudW0gZGVjbGFyYXRpb24uCisKK01vbiBKYW4gMjcgMjI6MDE6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogYmZkLmggOiBuZXcgdGFyZ2V0IGVudHIsIGJmZF9yZWxheF9zZWN0aW9uCisKK1dlZCBEZWMgMTggMTc6MTk6NDQgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogYmZkLmgsIGllZWUuaCwgb3Bjb2RlL202OGsuaCwgb3Bjb2RlL3NwYXJjLmg6ICBBTlNJZnkgZW51bXMuCisKK1RodSBEZWMgMTIgMjA6NTk6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGZvcGVuLXNhbWUuaCwgZm9wZW4tYmluLmg6ICBOZXcgZmlsZXMgZm9yIGNvbmZpZ3VyaW5nCisJd2hldGhlciBmb3BlbiBkaXN0aW5ndWlzaGVzIGJpbmFyeSBmaWxlcyBvciBub3QuICBGb3IgdXNlCisJYnkgaG9zdC1kZXBlbmRlbnQgY29uZmlnIGZpbGVzLgorCitTYXQgTm92IDMwIDIwOjQ2OjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBiZmQuaDogY2hhbmdlIHRoZSBkb2N1bWVudGF0aW9uIGZvcm1hdC4KKworCSogY3JlYXRlZCBjb2ZmLCBlbGYgYW5kIG9wY29kZSBhbmQgYW91dCBkaXJlY3Rvcmllcy4gTW92ZWQ6CisKKwlhb3V0NjQuaAk9PT4gYW91dC9hb3V0NjQuaAorCWFyLmgJCT09PiBhb3V0L2FyLmgKKwlhLm91dC5lbmNhcC5oCT09PiBhb3V0L2VuY2FwLmgKKwlhLm91dC5ob3N0LmgJPT0+IGFvdXQvaG9zdC5oCisJYS5vdXQuaHAuaAk9PT4gYW91dC9ocC5oCisJYS5vdXQuc3VuNC5oCT09PiBhb3V0L3N1bjQuaAorCXJhbmxpYi5oCT09PiBhb3V0L3JhbmxpYi5oCisJcmVsb2MuaAkJPT0+IGFvdXQvcmVsb2MuaAorCXN0YWIuZGVmCT09PiBhb3V0L3N0YWIuZGVmCisJc3RhYi5nbnUuaAk9PT4gYW91dC9zdGFiX2dudS5oCisKKwljb2ZmLWEyOWsuaAk9PT4gY29mZi9hMjlrLmgKKwljb2ZmLWg4MzAwLmgJPT0+IGNvZmYvaDgzMDAuaAorCWNvZmYtaTM4Ni5oCT09PiBjb2ZmL2kzODYuaAorCWNvZmYtaTk2MC5oCT09PiBjb2ZmL2k5NjAuaAorCWludGVybmFsY29mZi5oCT09PiBjb2ZmL2ludGVybmFsLmgKKwljb2ZmLW02OGsuaAk9PT4gY29mZi9tNjhrLmgKKwljb2ZmLW04OGsuaAk9PT4gY29mZi9tODhrLmgKKwljb2ZmLW1pcHMuaAk9PT4gY29mZi9taXBzLmgKKwljb2ZmLXJzNjAwMC5oCT09PiBjb2ZmL3JzNjAwMC5oCisKKwllbGYtY29tbW9uLmgJPT0+IGVsZi9jb21tb24uaAorCWR3YXJmLmgJCT09PiBlbGYvZHdhcmYuaAorCWVsZi1leHRlcm5hbC5oCT09PiBlbGYvZXh0ZXJuYWwuaAorCWVsZi1pbnRlcm5hbC5oICA9PT4gZWxmL2ludGVybmFsLmgKKworCWEyOWstb3Bjb2RlLmgJPT0+IG9wY29kZS9hMjlrLmgKKwlhcm0tb3Bjb2RlLmgJPT0+IG9wY29kZS9hcm0uaAorCWg4MzAwLW9wY29kZS5oCT09PiBvcGNvZGUvaDgzMDAuaAorCWkzODYtb3Bjb2RlLmgJPT0+IG9wY29kZS9pMzg2LmgKKwlpODYwLW9wY29kZS5oCT09PiBvcGNvZGUvaTg2MC5oCisJaTk2MC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2k5NjAuaAorCW02OGstb3Bjb2RlLmgJPT0+IG9wY29kZS9tNjhrLmgKKwltODhrLW9wY29kZS5oCT09PiBvcGNvZGUvbTg4ay5oCisJbWlwcy1vcGNvZGUuaAk9PT4gb3Bjb2RlL21pcHMuaAorCW5wMS1vcGNvZGUuaAk9PT4gb3Bjb2RlL25wMS5oCisJbnMzMmstb3Bjb2RlLmgJPT0+IG9wY29kZS9uczMyay5oCisJcG4tb3Bjb2RlLmgJPT0+IG9wY29kZS9wbi5oCisJcHlyLW9wY29kZS5oCT09PiBvcGNvZGUvcHlyLmgKKwlzcGFyYy1vcGNvZGUuaAk9PT4gb3Bjb2RlL3NwYXJjLmgKKwl0YWhvZS1vcGNvZGUuaAk9PT4gb3Bjb2RlL3RhaG9lLmgKKwl2YXgtb3Bjb2RlLmgJPT0+IG9wY29kZS92YXguaAorCisKKworV2VkIE5vdiAyNyAxMDozODozMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWxjb2ZmLmg6IChpbnRlcm5hbF9zY25oZHIpIHRvb2sgb3V0ICNkZWYgZGVwZW5kZW5jeSwgbm93CisJc19ucmVsb2MgYW5kIHNfbmxubm8gYXJlIGFsd2F5cyBsb25nLiAJKGludGVybmFsX3JlbG9jKTogYWxsd2F5cworCWhhcyBhbiBvZmZzZXQgZmllbGQgbm93LgorCitGcmkgTm92IDIyIDA4OjEyOjU4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmLXJzNjAwMC5oOiAgTGludDsgdXNlIHVuc2lnbmVkIGNoYXJzIGZvciBleHRlcm5hbCBmaWVsZHMuCisJKiBpbnRlcm5hbGNvZmYuaDogIExpbnQ7IGNhc3Qgc3RvcmFnZSBjbGFzc2VzIHRvIHNpZ25lZCBjaGFyLgorCitUaHUgTm92IDIxIDIxOjAxOjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBzdGFiLmRlZjogUmVtb3ZlIHRoZSBHTlUgZXh0ZW5kZWQgdHlwZSBjb2RlcyAoZS5nLiBOX1NFVFQpLgorCSogYW91dDY0Lmg6ICBUaGUgaGV1cmlzdGljIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuCisJc3Vub3Mtc3R5bGUgYW5kIGJzZC1zdHlsZSBaTUFHSUMgZmlsZXMgKHdydC4gd2hlcmUgdGhlCisJdGV4dCBzZWdtZW50IHN0YXJ0cykgaXMgbW92ZWQgaW50byAodGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZikKKwl0aGUgbWFjcm8gTl9IRUFERVJfSU5fVEVYVC4gIFRoaXMgZGVmaW5pdGlvbiBpcyBvbmx5IHVzZWQKKwlpZiBubyBvdGhlciBkZWZpbml0aW9uIGlzIHVzZWQgLSBlLmcuIGJmZC9uZXdzb3MzLmMgZGVmaW5lcworCU5fSEVBREVSX0lOX1RFWFQoeCkgdG8gYmUgYWx3YXlzIDAgKGFzIGJlZm9yZSkuCisKK1RodSBOb3YgMjEgMTE6NTM6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFvdXQ2NC5oIChOX1RYVEFERFIsIE5fVFhUT0ZGLCBOX1RYVFNJWkUpOiAgTmV3IGRlZmluaXRpb25zCisJdGhhdCBzaG91bGQgaGFuZGxlIGFsbCB1c2VzLiAgTE9HSUNBTF8gdmVyc2lvbnMgZGVsZXRlZC4KKwlFbGltaW5hdGUgTl9IRUFERVJfSU5fVEVYVCwgdXNpbmcgYV9lbnRyeSB0byBkZXRlcm1pbmUgd2hpY2gKKwlraW5kIG9mIHptYWdpYyBhLm91dCBmaWxlIHdlIGFyZSBsb29raW5nIGF0LgorCSogY29mZi1yczYwMDAuaDogIFR5cG8uCisKK1R1ZSBOb3YgMTkgMTg6NDM6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkoTm90ZTogIFRoaXMgaXMgYSByZXZpc2VkIGVudHJ5LCBhcyB3YXMgYW91dDY0LmguKQorCSogYW91dDY0Lmg6ICBTb21lIGNsZWFudXBzIG9mIE5fVFhUQUREUiBhbmQgTl9UWFRPRkY6CisJV2lsbCBub3cgd29yayBmb3IgYm90aCBvbGQtIGFuZCBuZXctc3R5bGUgWk1BR0lDIGZpbGVzLAorCWRlcGVuZGluZyBvbiBOX0hFQURFUl9JTl9URVhUIG1hY3JvLgorCUFkZCBMT0dJQ0FMX1RYVEFERFIsIExPSUNBTF9UWFRPRkYgYW5kIExPR0lDQUxfVFhUU0laRQorCXRoYXQgZG9uJ3QgY291bnQgdGhlIGV4ZWMgaGVhZGVyIGFzIHBhcnQKKwlvZiB0aGUgdGV4dCBzZWdtZW50LCB0byBiZSBjb25zaXN0ZW50IHdpdGggYmZkLgorCSogYS5vdXQuc3VuNC5oOiAgU2ltcGxpZmllZC9maXhlZCBmb3IgcHJldmlvdXMgY2hhbmdlLgorCitNb24gTm92IDE4IDAwOjAyOjA2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkd2FyZi5oOiAgVXBkYXRlIHRvIERXQVJGIGRyYWZ0IDUgdmVyc2lvbiBmcm9tIGdjYzIuCisKK1RodSBOb3YgMTQgMTk6NDQ6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIHN0YWIuZGVmOiAgQWRkZWQgZGVmcyBmb3IgZXh0ZW5kZWQgR05VIHN5bWJvbCB0eXBlcywKKwlzdWNoIGFzIE5fU0VUVC4gIFRoZXNlIGFyZSBub3JtYWxseSBpZmRlZidkIG91dCAoYmVjYXVzZQorCW9mIGNvbmZsaWN0cyB3aXRoIGEub3V0LmdudS5oKSwgYnV0IGFyZSB1c2VkIGJ5IGJmYl9zdGFiX25hbWUoKS4KKworVGh1IE5vdiAxNCAxOToxNzowMyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZWxmLWNvbW1vbi5oOiAgQWRkIGRlZmluZXMgdG8gc3VwcG9ydCBFTEYgc3ltYm9sIHRhYmxlIGNvZGUuCisKK01vbiBOb3YgMTEgMTk6MDE6MDYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGVsZi1pbnRlcm5hbC5oLCBlbGYtZXh0ZXJuYWwuaCwgZWxmLWNvbW1vbi5oOiAgQWRkIHN1cHBvcnQgZm9yCisJbm90ZSBzZWN0aW9ucywgd2hpY2ggYXJlIHVzZWQgaW4gRUxGIGNvcmUgZmlsZXMgdG8gaG9sZCBjb3BpZXMKKwlvZiB2YXJpb3VzIC9wcm9jIHN0cnVjdHVyZXMuCisKK1RodSBOb3YgIDcgMDg6NTg6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWxjb2ZmLmg6IHRvb2sgb3V0IHRoZSBNODggZGVwZW5kZW5jeSBpbiB0aGUgbGluZW5vCisJc3RydWN0LgorCSogY29mZi1tODhrLmg6IGRlZmluZXMgR0VUX0xJTkVOT19MTk5PIGFuZCBQVVRfTElORU5PX0xOTk8gdG8gdXNlCisJMzJiaXQgbGlubm8gZW50cmllcy4KKwkqIGEyOWstb3Bjb2RlLmg6IGZpeGVkIGVuY29kaW5nIG9mIG10YWNjCisKK1N1biBOb3YgIDMgMTE6NTQ6MjIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGJmZC5oOiBVcGRhdGVkIGZyb20gLi4vYmZkL2JmZC1pbi5oIChxLnYpLgorCitGcmkgTm92ICAxIDExOjEzOjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBpbnRlcm5hbGNvZmYuaDogIEFkZCB4X2NzZWN0IGRlZmluZXMuCisKK0ZyaSBPY3QgMjUgMDM6MTg6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIFJlbmFtZSBDT0ZGLXJlbGF0ZWQgZmlsZXMgaW4gYGNvZmYtQVJDSC5oJyBmb3JtLgorCWNvZmYtYTI5ay5oLCBjb2ZmLWkzODYuaCwgY29mZi1pOTYwLmgsIGNvZmYtbTY4ay5oLCBjb2ZmLW04OGsuaCwKKwljb2ZmLW1pcHMuaCwgY29mZi1yczYwMDAuaCB0byBiZSBleGFjdC4KKworVGh1IE9jdCAyNCAyMjoxMToxMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCVJTLzYwMDAgc3VwcG9ydCwgYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBo+/RuZy1UaOVvIFb1LCBhbmQKKwlKb2huIEdpbG1vcmUuCisKKwkqIGEub3V0LmdudS5oOiAgVXBkYXRlIHNsaWdodGx5LgorCSogYmZkLmg6ICBBZGQgbmV3IGVycm9yIGNvZGUsIGZpeCBkb2MsIGFkZCBiZmRfYXJjaF9yczYwMDAuCisJKiBpbnRlcm5hbGNvZmYuaDogIEFkZCBtb3JlIEZfIGNvZGVzIGZvciBmaWxlaGRyLiAgQWRkCisJcnMvNjAwMC1kZXBlbmRlbnQgZmllbGRzIHRvIGFvdXRoZHIuICBBZGQgc3RvcmFnZSBjbGFzc2VzCisJdG8gc3ltZW50cy4gIEFkZCA2MDAwLXNwZWNpZmljIGF1eGVudC4gIEFkZCByX3NpemUgaW4gcmVsb2MuCisJKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KKworVGh1IE9jdCAyNCAwNDoxMzoyMCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmYuaDogTmV3IGZpbGUgZm9yIGR3YXJmIHN1cHBvcnQuICBDb3BpZWQgZnJvbSBnY2MyCisJZGlzdHJpYnV0aW9uLgorCitXZWQgT2N0IDE2IDEzOjMxOjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0NjQuaDogIFJlbW92ZSBQQUdFX1NJWkUgZGVmaW5lczsgdGhleSBhcmUgdGFyZ2V0LWRlcGVuZGVudC4KKwlBZGQgTl9GTl9TRVEgZm9yIE5fRk4gc3ltYm9sIHR5cGUgdXNlZCBvbiBTZXF1ZW50IG1hY2hpbmVzLgorCSogc3RhYi5kZWY6ICBJbmNsdWRlIE5fRk5fU0VRIGluIHRhYmxlLgorCSogYm91dC5oOiAgRXh0ZXJuYWwgZm9ybWF0cyBvZiBzdHJ1Y3R1cmVzIHVzZSB1bnNpZ25lZCBjaGFycy4KKworRnJpIE9jdCAxMSAxMjo0MDo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIGJmZC5oOnVwZ3JhZGUgZnJvbSBiZmQuYworCSogaW50ZXJuYWxjb2ZmLmg6IGFkZCBuX25hbWUsIG5femVyb2VzIGFuZCBuX29mZnNldCBtYWNyb3MKKwkqIGFtZGNvZmYuaDogRGVmaW5lIE9NQUdJQyBhbmQgQU9VVEhEUlNaLgorCitGcmkgT2N0IDExIDEwOjU4OjA2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBhLm91dC5ob3N0Lmg6IENoYW5nZSBTRUdNRU5UX1NJWkUgdG8gMHgxMDAwIGZvciBTb255LgorCSogYmZkLmggKGFsaWduX3Bvd2VyKTogQWRkIChhY3R1YWxseSBtb3ZlKSBjb21tZW50LgorCitUdWUgT2N0ICA4IDE1OjI5OjMyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBzeXMvaC1ydGJzZC5oOiBEZWZpbmUgTUlTU0lOR19WRlBSSU5UIChmb3IgYmludXRpbHMvYnVjb21tLmMpLgorCitTdW4gT2N0ICA2IDE5OjI0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBhb3V0NjQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgdG8gLi4vYmZkL2xpYmFvdXQuaCBzbworCWl0IGNhbiBiZSBzaGFyZWQgYnkgYWxsIGBhLm91dC1mYW1pbHknIGNvZGUuICBSZW5hbWUKKwlFWFRFUk5BTF9MSVNUX1NJWkUgdG8gRVhURVJOQUxfTkxJU1RfU0laRS4gIFVzZSBiYXNpYyB0eXBlcworCWZvciBubGlzdCBtZW1iZXJzLCBhbmQgbWFrZSBzdHJ4IGludGVncmFsIHJhdGhlciB0aGFuIHBvaW50ZXIuCisJTW9yZSBjb21tZW50YXJ5IG9uIG5fdHlwZSB2YWx1ZXMuCisJKiBib3V0Lmg6ICBQcm92aWRlIGEgc3RydWN0IGV4dGVybmFsX2V4ZWMgcmF0aGVyIHRoYW4gYW4KKwlpbnRlcm5hbF9leGVjLgorCSogbTY4a2NvZmYuaDogIFJlbW92ZSBgdGFnZW50cmllcycgd2hpY2ggc251Y2sgaW4gZnJvbSB0aGUgaTk2MAorCUNPRkYgcG9ydC4KKworRnJpIE9jdCAgNCAwMToyNTo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaDgzMDAtb3Bjb2RlLmg6ICBSZW1vdmUgYF9lbnVtJyBmcm9tIHRoZSB0eXBlZGVmIGZvciBhbiBlbnVtLgorCSogYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggYmZkIGNoYW5nZXMuCisKKwkqIHN5cy9oLWkzODZtYWNoLmgsIHN5c2RlcC5oOiAgQWRkIDM4NiBNYWNoIGhvc3Qgc3VwcG9ydC4KKworVHVlIE9jdCAgMSAwNDo1ODo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYmZkLmgsIGVsZi1jb21tb24uaCwgZWxmLWV4dGVybmFsLmgsIGVsZi1pbnRlcm5hbC5oOgorCUFkZCBwcmVsaW1pbmFyeSBFTEYgc3VwcG9ydCwgc3VmZmljaWVudCBmb3IgR0RCLCBmcm9tIEZyZWQgRmlzaC4KKwkqIHN5c2RlcC5oLCBzeXMvaC1hbWl4Lmg6ICBTdXBwb3J0IEFtaWdhIFNWUjQuCisKKwkqIHN5cy9oLXZheHVsdC5oOiAgTWFrZSBpdCB3b3JrLiAgKERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT4pCisJKiBhLm91dC52YXguaDogIFJlbW92ZSB1bnVzZWQgYW5kIGNvbmZ1c2luZyBmaWxlLgorCitNb24gU2VwIDMwIDEyOjUyOjM1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBzeXNkZXAuaDogRGVmaW5lIE5FV1NPUzNfU1lTLCBhbmQgdXNlIGl0LgorCitGcmkgU2VwIDIwIDEzOjM4OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBhLm91dC5nbnUuaCAoTl9GTik6ICBJdHMgdmFsdWUgKnJlYWxseSBpcyogMHgxRi4KKwlGaXggaXQsIGFuZCBhZGQgY29tbWVudHMgd2FybmluZyBhYm91dCBvci1pbmcgTl9FWFQgd2l0aCBpdAorCWFuZC9vciBOX1dBUk5JTkcuCisJKiBhb3V0NjQuaCAoTl9GTik6ICBGaXggdmFsdWUsIGFkZCBjb21tZW50cyBhYm91dCBOX0VYVC4KKwkqIHN0YWIuZGVmICh0YWJsZSBhdCBlbmQpOiAgVXBkYXRlIHRvIHNob3cgYWxsIHRoZSB0eXBlCisJdmFsdWVzIDwweDIwLCBpbmNsdWRpbmcgbG93IG9yZGVyIGJpdHMuICBNb3ZlIE5fRk4gdG8KKwlpdHMgcmlnaHRmdWwgcGxhY2UuCisKK1R1ZSBTZXAgMTcgMTc6NDE6MzcgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogc3lzL2gtaXJpeDMuaDogIHNnaS9pcml4IHN1cHBvcnQuCisKK1R1ZSBTZXAgMTcgMDc6NTI6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBzdGFiLmRlZiAoTl9ERUZEKTogIEFkZCBHTlUgTW9kdWxhLTIgZGVidWcgc3RhYiwgZnJvbSBBbmRyZXcKKwlCZWVycy4KKworVGh1IFNlcCAxMiAxNDoxMjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGludGVybmFsY29mZi5oIChTWU1OTUxFTiwgRklMTk1MRU4sIERJTU5VTSk6ICBEZWZpbmUgdGhlc2UKKwlmb3IgaW50ZXJuYWxjb2ZmLCBzZXBhcmF0ZWx5IGZyb20gdGhlIHZhcmlvdXMgZXh0ZXJuYWwgY29mZidzLgorCSogYW1kY29mZi5oLCBiY3M4OGtjb2ZmLmgsIGkzODZjb2ZmLmgsIGludGVsLWNvZmYuaCwgbTY4a2NvZmYuaCwKKwltODhrLWJjcy5oOiBQcmVmaXggU1lNTk1MRU4sIEZJTE5NTEVOLCBhbmQgRElNTlVNIHdpdGggRV8ncyBmb3IKKwl0aGUgZXh0ZXJuYWwgc3RydWN0IGRlZmluaXRpb25zLgorCSogZWNvZmYuaDogUmVtb3ZlIHRoZXNlICNkZWZpbmUncywga2x1ZGdlIG5vIGxvbmdlciBuZWVkZWQuCisKKwkqIHN5cy9oLXVsdHJhMy5oOiAgQWRkIG5ldyBVbHRyYWNvbXB1dGVyIGhvc3QuCisJKiBzeXNkZXAuaDogIEFkZCBVTFRSQTNfU1lNMV9TWVMgYW5kIHVzZSBpdC4KKworVHVlIFNlcCAxMCAxMDoxMTo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGkzODZjb2ZmLmggKExJTkVTWik6ICBBbHdheXMgNiwgbm90IGJhc2VkIG9uIHNpemVvZigpLgorCShGaXggZnJvbSBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uKQorCitXZWQgU2VwICA0IDA4OjU4OjM3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYS5vdXQuZ251LmgsIGFvdXQ2NC5oOiAgQWRkIE5fV0FSTklORy4gIENoYW5nZSBOX0ZOIHRvIDB4MEUsCisJdG8gbWF0Y2ggU3VuT1MgYW5kIEJTRC4gIEFkZCBOX0NPTU0gYXMgMHgxMiBmb3IgU3VuT1Mgc2hhcmVkIGxpYgorCXN1cHBvcnQuCisJKiBzdGFiLmRlZjogIEFkZCBOX0NPTU0gdG8gdGFibGUsIGZpeCBvdmVybGFwIGNvbW1lbnQuCisKK1R1ZSBTZXAgIDMgMDY6Mjk6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJTWVyZ2Ugd2l0aCBsYXRlc3QgRlNGIHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLgorCisJKiBzdGFiLmdudS5oOiAgQWRkIExBU1RfVU5VU0VEX1NUQUJfQ09ERS4KKwkqIHN0YWIuZGVmOiAgVXBkYXRlIHRvIEdQTDIuICBNb3ZlIE5fV0FSTklORyBvdXQsIHNpbmNlIG5vdCBhCisJZGVidWcgc3ltYm9sLiAgQ2hhbmdlIGNvbW1lbnRzLCBhbmQgcmVvcmRlciB0YWJsZSB0byBudW1lcmljCisJb3JkZXIuICBVcGRhdGUgZmluYWwgdGFibGUgY29tbWVudC4KKwkoTl9EU0xJTkUsIE5fQlNMSU5FKTogIFJlbnVtYmVyIGZyb20gMHg2NiBhbmQgMHg2OCwgdG8gMHg0NiBhbmQgMHg0OC4KKworCSogb2JzdGFjay5oOiAgR1BMMi4gIE1lcmdlLgorCitGcmkgQXVnIDIzIDAxOjU0OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYS5vdXQuZ251LmgsIGEub3V0LnN1bjQuaDogIE1ha2UgU0VHTUVOVF9TSVpFIGFibGUgdG8gZGVwZW5kCisJb24gdGhlIHBhcnRpY3VsYXIgYS5vdXQgYmVpbmcgZXhhbWluZWQuCisJKiBhLm91dC5zdW40Lmg6ICBEZWZpbmUgc2VnbWVudCBzaXplcyBmb3IgU3VuLTMncyBhbmQgU3VuLTQncy4KKwkqIEZJWE1FOiAgYS5vdXQuZ251LmggaXMgYWxtb3N0IG9ic29sZXRlLgorCSogRklYTUU6ICBhLm91dC5zdW40Lmggc2hvdWxkIGJlIHJlbmFtZWQgYS5vdXQuc3VuLmggbm93LgorCitXZWQgQXVnIDIxIDIwOjMyOjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogU3RhcnQgYSBDaGFuZ2VMb2cgZm9yIHRoZSBpbmNsdWRlcyBkaXJlY3RvcnkuCisKKwkqIGEub3V0LmdudS5oIChOX0ZOKTogIEZpeCB2YWx1ZSAtLSB3YXMgMTUsIHNob3VsZCBiZSAweDFFLgorCSogc3RhYi5kZWY6ICBVcGRhdGUgYWxsb2NhdGlvbiB0YWJsZSBpbiBjb21tZW50cyBhdCBlbmQsCisJdG8gcmVmbGVjdCByZWFsaXR5IGFzIEkga25vdyBpdC4KKworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbnNpZGVjbC5oIGIvaW5jbHVkZS9hbnNpZGVjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjlmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Fuc2lkZWNsLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0YWJpbGl0eSBtYWNyb3MKKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0aWJpbGl0eSBtYWNyb3MKKworICAgQU5TSSBDIGlzIGFzc3VtZWQgaWYgX19TVERDX18gaXMgI2RlZmluZWQuCisKKyAgIE1hY3JvCUFOU0kgQyBkZWZpbml0aW9uCVRyYWRpdGlvbmFsIEMgZGVmaW5pdGlvbgorICAgLS0tLS0JLS0tLSAtIC0tLS0tLS0tLS0JLS0tLS0tLS0tLS0gLSAtLS0tLS0tLS0tCisgICBQVFIJCWB2b2lkIConCQlgY2hhciAqJworICAgTE9OR19ET1VCTEUJYGxvbmcgZG91YmxlJwkJYGRvdWJsZScKKyAgIFZPTEFUSUxFCWB2b2xhdGlsZScJCWAnCisgICBTSUdORUQJYHNpZ25lZCcJCWAnCisgICBQVFJDT05TVAlgdm9pZCAqY29uc3QnCQlgY2hhciAqJworICAgQU5TSV9QUk9UT1RZUEVTICAxCQkJbm90IGRlZmluZWQKKworICAgQ09OU1QgaXMgYWxzbyBkZWZpbmVkLCBidXQgaXMgb2Jzb2xldGUuICBKdXN0IHVzZSBjb25zdC4KKworICAgb2Jzb2xldGUgLS0gICAgIERFRlVOIChuYW1lLCBhcmdsaXN0LCBhcmdzKQorCisJRGVmaW5lcyBmdW5jdGlvbiBOQU1FLgorCisJQVJHTElTVCBsaXN0cyB0aGUgYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBlbmNsb3NlZCBpbgorCXBhcmVudGhlc2VzLiAgQVJHTElTVCBiZWNvbWVzIHRoZSBhcmd1bWVudCBsaXN0IGluIHRyYWRpdGlvbmFsIEMuCisKKwlBUkdTIGxpc3QgdGhlIGFyZ3VtZW50cyB3aXRoIHRoZWlyIHR5cGVzLiAgSXQgYmVjb21lcyBhIHByb3RvdHlwZSBpbgorCUFOU0kgQywgYW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0cmFkaXRpb25hbCBDLiAgQXJndW1lbnRzIHNob3VsZAorCWJlIHNlcGFyYXRlZCB3aXRoIGBBTkQnLiAgRm9yIGZ1bmN0aW9ucyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCisJYXJndW1lbnRzLCB0aGUgbGFzdCB0aGluZyBsaXN0ZWQgc2hvdWxkIGJlIGBET1RTJy4KKworICAgb2Jzb2xldGUgLS0gICAgIERFRlVOX1ZPSUQgKG5hbWUpCisKKwlEZWZpbmVzIGEgZnVuY3Rpb24gTkFNRSwgd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLgorCisgICBvYnNvbGV0ZSAtLSAgICAgRVhGVU4gKG5hbWUsIChwcm90b3R5cGUpKQktLSBvYnNvbGV0ZS4KKworCVJlcGxhY2VkIGJ5IFBBUkFNUy4gIERvIG5vdCB1c2U7IHdpbGwgZGlzYXBwZWFyIHNvbWVkYXkgc29vbi4KKwlXYXMgdXNlZCBpbiBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisJSW4gQU5TSSBDIGl0IGlzIGBOQU1FIFBST1RPVFlQRScgKHNvIFBST1RPVFlQRSBzaG91bGQgYmUgZW5jbG9zZWQgaW4KKwlwYXJlbnRoZXNlcykuICBJbiB0cmFkaXRpb25hbCBDIGl0IGlzIGBOQU1FKCknLgorCUZvciBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLCBQUk9UT1RZUEUgc2hvdWxkIGJlIGAodm9pZCknLgorCisgICBvYnNvbGV0ZSAtLSAgICAgUFJPVE8gKHR5cGUsIG5hbWUsIChwcm90b3R5cGUpICAgIC0tIG9ic29sZXRlLgorCisJVGhpcyBvbmUgaGFzIGFsc28gYmVlbiByZXBsYWNlZCBieSBQQVJBTVMuICBEbyBub3QgdXNlLgorCisgICBQQVJBTVMgKChhcmdzKSkKKworCVdlIGNvdWxkIHVzZSB0aGUgRVhGVU4gbWFjcm8gdG8gaGFuZGxlIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMsIGJ1dAorCXRoZSBuYW1lIGlzIG1pc2xlYWRpbmcgYW5kIHRoZSByZXN1bHQgaXMgdWdseS4gIFNvIHdlIGp1c3QgZGVmaW5lIGEKKwlzaW1wbGUgbWFjcm8gdG8gaGFuZGxlIHRoZSBwYXJhbWV0ZXIgbGlzdHMsIGFzIGluOgorCisJICAgICAgc3RhdGljIGludCBmb28gUEFSQU1TICgoaW50LCBjaGFyKSk7CisKKwlUaGlzIHByb2R1Y2VzOiAgYHN0YXRpYyBpbnQgZm9vKCk7JyBvciBgc3RhdGljIGludCBmb28gKGludCwgY2hhcik7JworCisJRVhGVU4gd291bGQgaGF2ZSBkb25lIGl0IGxpa2UgdGhpczoKKworCSAgICAgIHN0YXRpYyBpbnQgRVhGVU4gKGZvbywgKGludCwgY2hhcikpOworCisJYnV0IHRoZSBmdW5jdGlvbiBpcyBub3QgZXh0ZXJuYWwuLi5hbmQgaXQncyBoYXJkIHRvIHZpc3VhbGx5IHBhcnNlCisJdGhlIGZ1bmN0aW9uIG5hbWUgb3V0IG9mIHRoZSBtZXNzLiAgIEVYRlVOIHNob3VsZCBiZSBjb25zaWRlcmVkCisJb2Jzb2xldGU7IG5ldyBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvIHVzZSBQQVJBTVMuCisKKyAgIERPVFMgaXMgYWxzbyBvYnNvbGV0ZS4KKworICAgRXhhbXBsZXM6CisKKwlleHRlcm4gaW50IHByaW50ZiBQQVJBTVMgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOworKi8KKworI2lmbmRlZglfQU5TSURFQ0xfSAorCisjZGVmaW5lCV9BTlNJREVDTF9ICTEKKworCisvKiBFdmVyeSBzb3VyY2UgZmlsZSBpbmNsdWRlcyB0aGlzIGZpbGUsCisgICBzbyB0aGV5IHdpbGwgYWxsIGdldCB0aGUgc3dpdGNoIGZvciBsaW50LiAgKi8KKy8qIExJTlRMSUJSQVJZICovCisKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfQUlYKSB8fCAoZGVmaW5lZCAoX19taXBzKSAmJiBkZWZpbmVkIChfU1lTVFlQRV9TVlI0KSkgfHwgZGVmaW5lZChfV0lOMzIpCisvKiBBbGwga25vd24gQUlYIGNvbXBpbGVycyBpbXBsZW1lbnQgdGhlc2UgdGhpbmdzIChidXQgZG9uJ3QgYWx3YXlzCisgICBkZWZpbmUgX19TVERDX18pLiAgVGhlIFJJU0MvT1MgTUlQUyBjb21waWxlciBkZWZpbmVzIHRoZXNlIHRoaW5ncworICAgaW4gU1ZSNCBtb2RlLCBidXQgZG9lcyBub3QgZGVmaW5lIF9fU1REQ19fLiAgKi8KKworI2RlZmluZQlQVFIJCXZvaWQgKgorI2RlZmluZQlQVFJDT05TVAl2b2lkICpDT05TVAorI2RlZmluZQlMT05HX0RPVUJMRQlsb25nIGRvdWJsZQorCisjaWZuZGVmIElOX0dDQworI2RlZmluZQlBTkQJCSwKKyNkZWZpbmUJTk9BUkdTCQl2b2lkCisjZGVmaW5lCVZPTEFUSUxFCXZvbGF0aWxlCisjZGVmaW5lCVNJR05FRAkJc2lnbmVkCisjZW5kaWYgLyogISBJTl9HQ0MgKi8KKworI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KQkJcGFyYW1saXN0CisjZGVmaW5lIEFOU0lfUFJPVE9UWVBFUwkJCTEKKworI2RlZmluZSBWUEFSQU1TKEFSR1MpCQkJQVJHUworI2RlZmluZSBWQV9TVEFSVCh2YV9saXN0LHZhcikJCXZhX3N0YXJ0KHZhX2xpc3QsdmFyKQorCisvKiBUaGVzZSBhcmUgb2Jzb2xldGUuICBEbyBub3QgdXNlLiAgKi8KKyNpZm5kZWYgSU5fR0NDCisjZGVmaW5lIENPTlNUCQkJCWNvbnN0CisjZGVmaW5lIERPVFMJCQkJLCAuLi4KKyNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkJdHlwZSBuYW1lIGFyZ2xpc3QKKyNkZWZpbmUgRVhGVU4obmFtZSwgcHJvdG8pCQluYW1lIHByb3RvCisjZGVmaW5lIERFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUoYXJncykKKyNkZWZpbmUgREVGVU5fVk9JRChuYW1lKQkJbmFtZSh2b2lkKQorI2VuZGlmIC8qICEgSU5fR0NDICovCisKKyNlbHNlCS8qIE5vdCBBTlNJIEMuICAqLworCisjZGVmaW5lCVBUUgkJY2hhciAqCisjZGVmaW5lCVBUUkNPTlNUCVBUUgorI2RlZmluZQlMT05HX0RPVUJMRQlkb3VibGUKKworI2lmbmRlZiBJTl9HQ0MKKyNkZWZpbmUJQU5ECQk7CisjZGVmaW5lCU5PQVJHUworI2RlZmluZQlWT0xBVElMRQorI2RlZmluZQlTSUdORUQKKyNlbmRpZiAvKiAhSU5fR0NDICovCisKKyNpZm5kZWYgY29uc3QgLyogc29tZSBzeXN0ZW1zIGRlZmluZSBpdCBpbiBoZWFkZXIgZmlsZXMgZm9yIG5vbi1hbnNpIG1vZGUgKi8KKyNkZWZpbmUJY29uc3QKKyNlbmRpZgorCisjZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpCQkoKQorCisjZGVmaW5lIFZQQVJBTVMoQVJHUykJCQkodmFfYWxpc3QpIHZhX2RjbAorI2RlZmluZSBWQV9TVEFSVCh2YV9saXN0LHZhcikJCXZhX3N0YXJ0KHZhX2xpc3QpCisKKy8qIFRoZXNlIGFyZSBvYnNvbGV0ZS4gIERvIG5vdCB1c2UuICAqLworI2lmbmRlZiBJTl9HQ0MKKyNkZWZpbmUgQ09OU1QKKyNkZWZpbmUgRE9UUworI2RlZmluZSBQUk9UTyh0eXBlLCBuYW1lLCBhcmdsaXN0KQl0eXBlIG5hbWUgKCkKKyNkZWZpbmUgRVhGVU4obmFtZSwgcHJvdG8pCQluYW1lKCkKKyNkZWZpbmUgREVGVU4obmFtZSwgYXJnbGlzdCwgYXJncykJbmFtZSBhcmdsaXN0IGFyZ3M7CisjZGVmaW5lIERFRlVOX1ZPSUQobmFtZSkJCW5hbWUoKQorI2VuZGlmIC8qICEgSU5fR0NDICovCisKKyNlbmRpZgkvKiBBTlNJIEMuICAqLworCisjZW5kaWYJLyogYW5zaWRlY2wuaAkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L0NoYW5nZUxvZyBiL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0Y2ZkNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxNzggQEAKK1N1biBKdW4gMjggMTE6MzM6NDggMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgorCisJKiBzdGFiLmRlZjogIEFkZCBOX0FMSUFTIGZyb20gU3VuUHJvIEY3Ny4KKworTW9uIE1hciAxMSAxMjoxNTo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWIuZGVmOiBVc2UgX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgcmF0aGVyIHRoYW4gX19kZWZpbmVfc3RhYgorCWZvciBkdXBsaWNhdGUgZW50cmllcyBOX0JST1dTIGFuZCBOX01PRDIuCisJKiBzdGFiX2dudS5oIChfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSk6IERlZmluZSBiZWZvcmUgaW5jbHVkaW5nCisJc3RhYi5kZWYuCisKK0ZyaSBPY3QgMjcgMTc6NDc6MTYgMTk5NSAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KKworCSogYW91dDY0LmgsIGhvc3QuaCwgaHAzMDBocHV4LmgsIHN1bjQuaDogQ2hhbmdlZCBQQUdFX1NJWkUgdG8KKwlUQVJHRVRfUEFHRV9TSVpFLgorCitUdWUgU2VwIDEyIDEyOjA3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3VuNC5oIChzdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmspOiBDaGFuZ2UgYWxsIGZpZWxkcworCWZyb20gbG9uZyB0byB1bnNpZ25lZCBsb25nLgorCitXZWQgSnVsIDEyIDAwOjE1OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgorCisJKiBzdW40LmggKFBBR0VfU0laRSk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZy4KKworVGh1IEp1biAxNiAxNDoyMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFvdXQ2NC5oIChCTUFHSUMpOiBEZWZpbmUuCisKK1NhdCBKdW4gMTEgMTY6MTY6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCisJKiBhb3V0NjQuaCAoTl9XRUFLVSwgTl9XRUFLQSwgTl9XRUFLVCwgTl9XRUFLRCwgTl9XRUFLQik6IERlZmluZS4KKwkqIHN0YWIuZGVmOiBVcGRhdGUgc3ltYm9sIHZhbHVlIHRhYmxlLgorCitUaHUgSnVuICAyIDE3OjEzOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc3VuNC5oIChFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSk6IENvcnJlY3QgZnJvbSAyOCB0bworCTI0LiAgRml4IHVwIGxkX2dvdCBjb21tZW50LgorCitXZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZHluaXgzLmg6ICBDbGVhbnVwLCBhZGFwdCB0byBjdXJyZW50IGJmZCB2ZXJzaW9uLgorCitTYXQgRmViIDI2IDEwOjI1OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogYW91dDY0Lmg6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCisKK0ZyaSBGZWIgMTEgMTI6NTY6MDQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBhci5oIChBUk1BRywgQVJNQUdCLCBBUkZNQUcpOiBDaGFuZ2UgJ1xuJyB0byAnXDAxMicsIGZvciBncmVhdGVyCisJcG9ydGFiaWxpdHkuCisKK0ZyaSBKYW4gMjEgMDA6NTk6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBzdW40Lmg6IEFkZGVkIGluZm9ybWF0aW9uIGFib3V0IFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCisKK0ZyaSBKYW4gIDcgMDg6MjA6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGFvdXQ2NC5oIChOX1RYVEFERFIpOiBBZGQgY29tbWVudCByZWdhcmRpbmcgT01BR0lDIGFuZCBOTUFHSUMuCisKK1NhdCBEZWMgMjUgMTQ6NTU6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGFvdXQ2NC5oIChOX0RBVE9GRik6IERvbid0IHBhZCAocmV2ZXJ0IGNoYW5nZSBvZiA4IEp1bCAxOTkzKS4KKworVHVlIE5vdiAxNiAxNTo0Mzo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYW91dDY0Lmg6IE5ldyBtYWNyb3MgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSBhbmQgTl9ESVNLX0JMT0NLX1NJWkUKKwlmb3IgTGludXggWk1BR0lDLgorCShOX1RYVE9GRiwgTl9EQVRPRkYpOiBVc2UgdGhlbS4KKworVGh1IE5vdiAgNCAwMDozMzo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCSogYW91dDY0LmggKFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSk6IEZpeGVkIHZhbHVlIHRvIG1hdGNoCisJc3VuMyBzeXN0ZW07IHVzZWQgdG8gb3ZlcmxhcCBvdGhlciBmaWVsZHMuCisJKFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSk6IExpa2V3aXNlLgorCitXZWQgTm92ICAzIDEzOjQ4OjI3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYW91dDY0LmggKFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFKTogTWFrZSBpdCAweDEwIChLZW4ncworCXN1Z2dlc3Rpb24pIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRS4KKworRnJpIE9jdCAyOSAxNTowOTo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGhwMzAwaHB1eC5oIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUgdG8gYmUgMC4KKworTW9uIFNlcCAxMyAyMTowMDo1NiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYXIuaCAoQVJNQVBfVElNRV9PRkZTRVQpOiAgQWRkIGFuZCBkZXNjcmliZS4KKworTW9uIEF1ZyAyMyAgU2VhbiBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQorCisJKiBhb3V0NjQuaCBbQVJDSF9TSVpFICE9IDY0XTogQWxsb3cgTl9CQURNQUcgdG8gYmUgb3ZlcnJpZGRlbi4KKworTW9uIEF1ZyAxNiAxNDozMDoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYl9nbnUuaDogSW5jbHVkZSBhb3V0L3N0YWIuZGVmIG5vdCBqdXN0IHN0YWIuZGVmLgorCitTdW4gSnVsIDE4IDIxOjQxOjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKKworCSogZHluaXgzLmg6IE5ldywgZm9yIHN5bW1ldHJ5IHJ1bm5pbmcgZHluaXguCisKK1RodSBKdWwgIDggMTI6NTI6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGFvdXQ2NC5oIChOX0JBRE1BRyk6IFJlY29nbml6ZSBRTUFHSUMuCisJTl9UWFRPRkYsIE5fVFhUQUREUiwgTl9UWFRTSVpFOiBTcGVjaWFsIGNvZGUgZm9yIFFNQUdJQy4KKwlOX0RBVE9GRjogUGFkIHRleHQgc2l6ZSBpZiB3ZSBuZWVkIHRvLgorCitGcmkgSnVuIDE4IDE5OjE5OjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFiLmRlZiAoTl9FQ09NTCk6IEZpeCBjb21tZW50LgorCitNb24gTWF5IDMxIDA5OjIxOjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzdGFiLmRlZjogUmVtb3ZlIFNvbGFyaXMgaW5mb3JtYXRpb24gb24gTl9GVU4gc3RhYnN0cmluZyBncmFtbWFyOworCUkndmUgdHJhbnNmZXJyZWQgaXQgdG8gZ2RiL2RvYy9zdGFicy50ZXhpbmZvLCB3aGVyZSBpdCBiZWxvbmdzLgorCitNb24gTWF5IDEwIDA1OjQ4OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBocDMwMGhwdXguaDogUGF0Y2ggZnJvbSBHbGVubiBFbmdlbCBmb3IgbGlua2VyIHByb2JsZW0gYW5kCisJY29tcGF0aWJpbGl0eSBmaXg6CisJKE9NQUdJQywgTk1BR0lDKTogTmV3IGRlZmluaXRpb25zLgorCShTSEFSRU1BR0lDKTogRGVsZXRlZC4KKwkoSFBVWF9ET1RfT19NQUdJQyk6IE5ldyBtYWNyby4KKwkoX05fQkFETUFHKTogQWRqdXN0ZWQuCisJKE5fSEVBREVSX0lOX1RFWFQsIE5fREFUQUREUik6IE5ldyBtYWNyb3MuCisKK1RodSBBcHIgMjkgMTI6MDc6MzcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGhwMzAwaHB1eC5oOiBOZXcgZmlsZSBmcm9tIEdsZW5uIEVuZ2VsLCBnbGVubmVAbHNpZC5ocC5jb20uCisKK1R1ZSBBcHIgMjcgMDU6NTE6MDQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCisKKwkqIGFvdXQ2NC5oIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYywgKk1BR0lDLCBOX0JBRE1BRyk6IERvbid0IGRlZmluZQorCWlmIGBleHRlcm5hbF9leGVjJyBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KKwkoTl9EQVRPRkYsIE5fVFJFTE9GRiwgTl9EUkVMT0ZGLCBOX1NZTU9GRiwgTl9TVFJPRkYpOiBEb24ndCBkZWZpbmUKKwlpZiBhbHJlYWR5IGRlZmluZWQuCisJKHN0cnVjdCBleHRlcm5hbF9ubGlzdCwgRVhURVJOQUxfTkxJU1RfU0laRSk6IERvbid0IGRlZmluZSBpZgorCWBleHRlcm5hbF9ubGlzdCcgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgbWFjcm8uCisKK1NhdCBBdWcgMTUgMDQ6MjM6MDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGFkb2JlLmg6ICBBZGQgZGVzY3JpcHRpb24gb2YgYS5vdXQuYWRvYmUgZm9ybWF0LgorCitGcmkgSnVsICAzIDAwOjM2OjUyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzdGFiLmRlZjogIFVwZGF0ZSBtb3JlIFNvbGFyaXMgZGVmaW5pdGlvbnMuCisJKiBzdGFiX2dudS5oOiAgQWRkIE5fU08gbGFuZ3VhZ2UgdHlwZXMsIGFuZCBTb2xhcmlzIGJhc2ljIGZsb2F0IHR5cGVzLgorCitTdW4gSnVuIDE0IDEwOjUzOjUzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzdGFiLmRlZjogIFVwZGF0ZSBkZXNjcmlwdGlvbnMgb2YgU29sYXJpcy0yIHN0YWJzOyBhZGQgTl9VTkRGLgorCitUaHUgSnVuIDExIDAxOjEyOjA3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzdGFiLmRlZjogIEFkZCBOX09CSiBhbmQgTl9PUFQgZnJvbSBTb2xhcmlzLTIuCisKK1RodSBKYW4gMzAgMTg6MTI6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFvdXQvYW91dDY0Lmg6IE5fVFhUU0laRSBuZWVkcyBzb21lIG1vcmUgcGFyZW50aGVzZXMuCisJSSBkb24ndCB0cnVzdCBDIHByZWNlZGVuY2UuCisKK1dlZCBEZWMgMTggMTQ6MzI6MDEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGFvdXQvYW91dDY0Lmg6ICBNb3ZlIGNvbW1vbiBzdW5vcy1zcGVjaWZpYyB0ZXN0CisJdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMgaW50byBuZXcgbWFjcm8gTl9TSEFSRURfTElCLgorCVVzZSBpdCB0byBzaW1wbGlmeSZyZWZvcm1hdCBOX1RYVEFERFIsIE5fVFhUT0ZGLCBOX1RYVFNJWkUuCisKK1NhdCBOb3YgMzAgMjA6MzQ6NTIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIENoYW5nZUxvZywgYW91dDY0LmgsIGFyLmgsIGVuY2FwLmgsIGhvc3QuaCwgaHAuaCwgcmFubGliLmgsCisJcmVsb2MuaCwgc3RhYi5kZWYsIHN0YWJfZ251LmgsIHN1bjQuaDogQWxsIG1vdmVkIGZyb20gdGhlCisJZGV2by9pbmNsdWRlIGRpcmVjdG9yeQorCisMCitMb2NhbCBWYXJpYWJsZXM6Cit2ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCitFbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvYWRvYmUuaCBiL2luY2x1ZGUvYW91dC9hZG9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmYxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvYWRvYmUuaApAQCAtMCwwICsxLDI5NyBAQAorLyogYGEub3V0LmFkb2JlJyBkaWZmZXJlbmNlcyBmcm9tIHN0YW5kYXJkIGEub3V0IGZpbGVzICovCisKKyNpZm5kZWYgX19BX09VVF9BRE9CRV9IX18KKyNkZWZpbmUgX19BX09VVF9BRE9CRV9IX18KKworI2RlZmluZQlCWVRFU19JTl9XT1JECTQKKworLyogU3RydWN0IGV4dGVybmFsX2V4ZWMgaXMgdGhlIHNhbWUuICAqLworCisvKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KKworc3RydWN0IGV4dGVybmFsX2V4ZWMgCit7CisgIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCisgIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLworICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KKyAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCisgIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KKyAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLworICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCisgIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCit9OworCisjZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQorCisvKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLworCisjdW5kZWYJWk1BR0lDCisjZGVmaW5lCVpNQUdJQwkweEFEMEJFCQkvKiBDdXRlLCBlaD8gICovCisjdW5kZWYJT01BR0lDCisjdW5kZWYJTk1BR0lDCisKKyNkZWZpbmUgTl9CQURNQUcoeCkJICAoKHgpLmFfaW5mbyAhPSBaTUFHSUMpCisKKy8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKKyAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KKyNpZm5kZWYJTl9TRUdTSVpFCisjZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKKyNlbmRpZgorI3VuZGVmIE5fU0VHU0laRSAgIC8qIEZJWE1FWFhYWCAqLworCisvKiBTZWdtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYS5vdXQuQWRvYmUgZm9ybWF0IGlzIHNwZWNpZmllZCBhZnRlciB0aGUKKyAgIGZpbGUgaGVhZGVyLiAgSXQgY29udGFpbnMgTiBzZWdtZW50IGRlc2NyaXB0b3JzLCBmb2xsb3dlZCBieSBvbmUgd2l0aAorICAgYSB0eXBlIG9mIHplcm8uICAKKworICAgVGhlIGFjdHVhbCB0ZXh0IG9mIHRoZSBzZWdtZW50cyBzdGFydHMgYXQgTl9UWFRPRkYgaW4gdGhlIGZpbGUsCisgICByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG9yIGhvdyBmZXcgc2VnbWVudCBoZWFkZXJzIHRoZXJlIGFyZS4gICovCisKK3N0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHsKKwl1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKKwl1bnNpZ25lZCBjaGFyIGVfc2l6ZVszXTsKKwl1bnNpZ25lZCBjaGFyIGVfdmlydGJhc2VbNF07CisJdW5zaWduZWQgY2hhciBlX2ZpbGViYXNlWzRdOworfTsKKworc3RydWN0IGludGVybmFsX3NlZ2Rlc2MgeworCXVuc2lnbmVkIGludAlhX3R5cGU6ODsJLyogU2VnbWVudCB0eXBlIE5fVEVYVCwgTl9EQVRBLCAwICovCisJdW5zaWduZWQgaW50IAlhX3NpemU6MjQ7CS8qIFNlZ21lbnQgc2l6ZSAqLworCWJmZF92bWEJCWFfdmlydGJhc2U7CS8qIFZpcnR1YWwgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludAlhX2ZpbGViYXNlOwkvKiBCYXNlIGFkZHJlc3MgaW4gb2JqZWN0IGZpbGUgKi8KK307CisKKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKworLyogVGhpcyBpcyBkb2N1bWVudGVkIHRvIGJlIGF0IDEwMjQsIGJ1dCBhcHBlYXJzIHRvIHJlYWxseSBiZSBhdCAyMDQ4LgorICAgRklYTUU/ISAgKi8KKyNkZWZpbmUgTl9UWFRPRkYoeCkJMjA0OAorCisjZGVmaW5lCU5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKKworI2RlZmluZSBOX0RBVEFERFIoeCkKKworI2RlZmluZSBOX0JTU0FERFIoeCkKKworLyogT2Zmc2V0cyBvZiB0aGUgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgZmlsZSBhZnRlciB0aGUgdGV4dCBzZWdtZW50LiAgKi8KKworI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKKyNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKKyNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQorI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCisMCisvKiBTeW1ib2xzICovCitzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgeworICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KKyAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCisgIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLworICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KKyAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCit9OworCisjZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgKEJZVEVTX0lOX1dPUkQrNCtCWVRFU19JTl9XT1JEKQorCitzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgeworICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCisgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCisgIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KKyAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLworfTsKKworLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLworCisjZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KKyNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCisjZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLworI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KKyNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLworI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KKyNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCisjZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLworLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCisgICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCisgICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KKyNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KKyNkZWZpbmUgTl9UWVBFICAweDFlCisjZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KKworI2RlZmluZSBOX0lORFIgMHgwYQorCisvKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgorICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCisgICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0CisgICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCisgICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgorCisgICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCisgICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCisgICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAorICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCisKKy8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KKyNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCisKKy8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLworI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCisKKy8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCisgICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKKyAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCisKKyNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKKworLyogUmVsb2NhdGlvbnMgCisKKyAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAorICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKKyAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAorICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KKyAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKKyAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQorICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgorICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgorKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgorICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCisgICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KKyAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KKworc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7CisgIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KKyAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KKyAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLworfTsKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJMHg4MAorI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJMHgwMQorCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJMHg2MAorI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUJLyogVG8gc2hpZnQgdG8gdW5pdHMgcGxhY2UgKi8KKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkweDA2CisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQorCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJMHgxMAorI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCTB4MDgKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkweDA4CisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCTB4MDgKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJMHgwNAorI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJMHgwNAorCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkweDAyCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkweDAyCisKKyNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCisKK3N0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKK3sKKyAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KKyAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCisgIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKKyAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAorICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKKyAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKKyAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgorICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKKyAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KKyAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKKyAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KKyAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCisgICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCisgIHVuc2lnbmVkIGludCByX2V4dGVybjoxOworICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KKyAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCisgIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KKyAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCisgIC8qIHVudXNlZCAqLworICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KK307CisKKworLyogRVhURU5ERUQgUkVMT0NTICAqLworCitzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKKyAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KKyAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KKyAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLworICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCit9OworCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJMHg4MAorI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCTB4MDEKKworI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0JJRwkJMHgxRgorI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCTB4RjgKKyNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMworCisvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLworI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKKworZW51bSByZWxvY190eXBlCit7CisgIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLworICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KKyAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KKyAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KKyAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLworICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLworICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCisgIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KKyAgLyogU3BlY2lhbCAqLworICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KKyAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCisgIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLworICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCisgIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLworICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCisgIFJFTE9DX1NGQV9CQVNFLAkJCisgIFJFTE9DX1NGQV9PRkYxMywKKyAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLworICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCisgIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCisgIFJFTE9DX0JBU0UyMiwKKyAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLworICBSRUxPQ19QQzEwLAorICBSRUxPQ19QQzIyLAorICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLworICBSRUxPQ19KTVBfVEJMLAorICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLworICBSRUxPQ19TRUdPRkYxNiwKKyAgUkVMT0NfR0xPQl9EQVQsCisgIFJFTE9DX0pNUF9TTE9ULAorICBSRUxPQ19SRUxBVElWRSwKKworICBSRUxPQ18xMSwJCisgIFJFTE9DX1dESVNQMl8xNCwKKyAgUkVMT0NfV0RJU1AxOSwKKyAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCisgIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLworICAKKyAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KKyAgUkVMT0NfSlVNUFRBUkcsCisgIFJFTE9DX0NPTlNULAorICBSRUxPQ19DT05TVEgsCisgIAorICBOT19SRUxPQworICB9OworCisKK3N0cnVjdCByZWxvY19pbnRlcm5hbCB7CisgIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCisgIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCisgIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCisgIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KK307CisKKyNlbmRpZgkJCQkvKiBfX0FfT1VUX0FET0JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oIGIvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjExNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvYW91dDY0LmgKQEAgLTAsMCArMSw0NzUgQEAKKy8qIGBhLm91dCcgb2JqZWN0LWZpbGUgZGVmaW5pdGlvbnMsIGluY2x1ZGluZyBleHRlbnNpb25zIHRvIDY0LWJpdCBmaWVsZHMgKi8KKworI2lmbmRlZiBfX0FfT1VUXzY0X0hfXworI2RlZmluZSBfX0FfT1VUXzY0X0hfXworCisvKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KKworI2lmbmRlZiBleHRlcm5hbF9leGVjCitzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAKK3sKKyAgYmZkX2J5dGUgZV9pbmZvWzRdOwkJLyogbWFnaWMgbnVtYmVyIGFuZCBzdHVmZgkJKi8KKyAgYmZkX2J5dGUgZV90ZXh0W0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCBzZWN0aW9uIGluIGJ5dGVzCSovCisgIGJmZF9ieXRlIGVfZGF0YVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGRhdGEgc2VjdGlvbiBpbiBieXRlcwkqLworICBiZmRfYnl0ZSBlX2Jzc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIGJzcyBhcmVhIGluIGJ5dGVzIAkJKi8KKyAgYmZkX2J5dGUgZV9zeW1zW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGluIGJ5dGVzIAkqLworICBiZmRfYnl0ZSBlX2VudHJ5W0JZVEVTX0lOX1dPUkRdOyAvKiBzdGFydCBhZGRyZXNzIAkJCSovCisgIGJmZF9ieXRlIGVfdHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KKyAgYmZkX2J5dGUgZV9kcnNpemVbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHJlbG9jYXRpb24gaW5mbyAJKi8KK307CisKKyNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCSg0ICsgQllURVNfSU5fV09SRCAqIDcpCisKKy8qIE1hZ2ljIG51bWJlcnMgZm9yIGEub3V0IGZpbGVzICovCisKKyNpZiBBUkNIX1NJWkU9PTY0CisjZGVmaW5lIE9NQUdJQyAweDEwMDEJCS8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSAgKi8KKyNkZWZpbmUgWk1BR0lDIDB4MTAwMgkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDB4MTAwMwkJLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCisKKy8qIFRoZXJlIGlzIG5vIDY0LWJpdCBRTUFHSUMgYXMgZmFyIGFzIEkga25vdy4gICovCisKKyNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKKwkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCisgIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQorI2Vsc2UKKyNkZWZpbmUgT01BR0lDIDA0MDcJCS8qIC4uLm9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDA0MTAJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLworI2RlZmluZSBaTUFHSUMgMDQxMwkJLyogQ29kZSBpbmRpY2F0aW5nIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgQk1BR0lDIDA0MTUJCS8qIFVzZWQgYnkgYSBiLm91dCBvYmplY3QuICAqLworCisvKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4KKyAgIEl0IGlzIHVzZWQgYnkgMzg2QlNEIChhbmQgdmFyaWFudHMpIGFuZCBMaW51eCwgYXQgbGVhc3QuICAqLworI2lmbmRlZiBRTUFHSUMKKyNkZWZpbmUgUU1BR0lDIDAzMTQKKyNlbmRpZgorIyBpZm5kZWYgTl9CQURNQUcKKyMgIGRlZmluZSBOX0JBRE1BRyh4KQkgIChOX01BR0lDKHgpICE9IE9NQUdJQwkJXAorCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKKyAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgXAorCQkgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gUU1BR0lDKQorIyBlbmRpZiAvKiBOX0JBRE1BRyAqLworI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgUU1BR0lDCisjZGVmaW5lIE5fSVNfUU1BR0lDKHgpIChOX01BR0lDICh4KSA9PSBRTUFHSUMpCisjZWxzZQorI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoMCkKKyNlbmRpZgorCisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRBUkdFVF9QQUdFX1NJWkUgYW5kIE5fU0VHU0laRSBpcyB0aGF0IFRBUkdFVF9QQUdFX1NJWkUgaXMKKyAgIHRoZSBmaW5lc3QgZ3JhbnVsYXJpdHkgYXQgd2hpY2ggeW91IGNhbiBwYWdlIHNvbWV0aGluZywgdGh1cyBpdAorICAgY29udHJvbHMgdGhlIHBhZGRpbmcgKGlmIGFueSkgYmVmb3JlIHRoZSB0ZXh0IHNlZ21lbnQgb2YgYSBaTUFHSUMKKyAgIGZpbGUuICBOX1NFR1NJWkUgaXMgdGhlIHJlc29sdXRpb24gYXQgd2hpY2ggdGhpbmdzIGNhbiBiZSBtYXJrZWQgYXMKKyAgIHJlYWQtb25seSB2ZXJzdXMgcmVhZC93cml0ZSwgc28gaXQgY29udHJvbHMgdGhlIHBhZGRpbmcgYmV0d2VlbiB0aGUKKyAgIHRleHQgc2VnbWVudCBhbmQgdGhlIGRhdGEgc2VnbWVudCAoaW4gbWVtb3J5OyBvbiBkaXNrIHRoZSBwYWRkaW5nCisgICBiZXR3ZWVuIHRoZW0gaXMgVEFSR0VUX1BBR0VfU0laRSkuICBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgYXJlIHRoZSBzYW1lCisgICBmb3IgbW9zdCBtYWNoaW5lcywgYnV0IGRpZmZlcmVudCBmb3Igc3VuMy4gICovCisKKy8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKKyAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KKworI2lmbmRlZglOX1NFR1NJWkUKKyNkZWZpbmUJTl9TRUdTSVpFKHgpCVNFR01FTlRfU0laRQorI2VuZGlmCisMCisvKiBWaXJ0dWFsIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCisgICBUaGlzIGlzIGdldHRpbmcgdmVyeSBjb21wbGljYXRlZC4gIEEgZ29vZCByZWFzb24gdG8gZGlzY2FyZCBhLm91dCBmb3JtYXQKKyAgIGZvciBzb21ldGhpbmcgdGhhdCBzcGVjaWZpZXMgdGhlc2UgZmllbGRzIGV4cGxpY2l0bHkuICBCdXQgdGlsIHRoZW4uLi4KKworICAgKiBPTUFHSUMgYW5kIE5NQUdJQyBmaWxlczoKKyAgICAgICAob2JqZWN0IGZpbGVzOiB0ZXh0IGZvciAicmVsb2NhdGFibGUgYWRkciAwIiByaWdodCBhZnRlciB0aGUgaGVhZGVyKQorICAgICAgIHN0YXJ0IGF0IDAsIG9mZnNldCBpcyBFWEVDX0JZVEVTX1NJWkUsIHNpemUgYXMgc3RhdGVkLgorICAgKiBUaGUgdGV4dCBhZGRyZXNzLCBvZmZzZXQsIGFuZCBzaXplIG9mIFpNQUdJQyBmaWxlcyBkZXBlbmQKKyAgICAgb24gdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBmaWxlOgorICAgICAqIGVudHJ5IHBvaW50IGJlbG93IFRFWFRfU1RBUlRfQUREUjoKKyAgICAgICAoaGFjayBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcykKKyAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgMCwgc2l6ZSBhcyBzdGF0ZWQuCisgICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyB0cnVlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUKKyAgICAgICBjYXNlIHdoZW4gdGhlIGVudHJ5IHBvaW50IGlzIEVYRUNfQllURVNfU0laRSBvciBmdXJ0aGVyIGludG8gYSBwYWdlKToKKyAgICAgICBubyBwYWRkaW5nIGlzIG5lZWRlZDsgdGV4dCBjYW4gc3RhcnQgYWZ0ZXIgZXhlYyBoZWFkZXIuICBTdW4KKyAgICAgICBjb25zaWRlcnMgdGhlIHRleHQgc2VnbWVudCBvZiBzdWNoIGZpbGVzIHRvIGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyOworICAgICAgIGZvciBCRkQncyBwdXJwb3Nlcywgd2UgZG9uJ3QsIHdoaWNoIG1ha2VzIG1vcmUgd29yayBmb3IgdXMuCisgICAgICAgc3RhcnQgYXQgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLAorICAgICAgIHNpemUgYXMgc3RhdGVkIG1pbnVzIEVYRUNfQllURVNfU0laRS4KKyAgICAgKiBJZiBOX0hFQURFUl9JTl9URVhUKHgpIGlzIGZhbHNlICh3aGljaCBkZWZhdWx0cyB0byBiZWluZyB0aGUgY2FzZSB3aGVuCisgICAgICAgdGhlIGVudHJ5IHBvaW50IGlzIGxlc3MgdGhhbiBFWEVDX0JZVEVTX1NJWkUgaW50byBhIHBhZ2UgKGUuZy4gcGFnZQorICAgICAgIGFsaWduZWQpKTogKHBhZGRpbmcgaXMgbmVlZGVkIHNvIHRoYXQgdGV4dCBjYW4gc3RhcnQgYXQgYSBwYWdlIGJvdW5kYXJ5KQorICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiwgb2Zmc2V0IFRBUkdFVF9QQUdFX1NJWkUsIHNpemUgYXMgc3RhdGVkLgorCisgICAgU3BlY2lmaWMgY29uZmlndXJhdGlvbnMgbWF5IHdhbnQgdG8gaGFyZHdpcmUgTl9IRUFERVJfSU5fVEVYVCwKKyAgICBmb3IgZWZmaWNpZW5jeSBvciB0byBhbGxvdyBwZW9wbGUgdG8gcGxheSBnYW1lcyB3aXRoIHRoZSBlbnRyeSBwb2ludC4KKyAgICBJbiB0aGF0IGNhc2UsIHlvdSB3b3VsZCAjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgYXMgMSBmb3Igc3Vub3MsCisgICAgYW5kIGFzIDAgZm9yIG1vc3Qgb3RoZXIgaG9zdHMgKFNvbnkgTmV3cywgVmF4IFVsdHJpeCwgZXRjKS4KKyAgICAoRG8gdGhpcyBpbiB0aGUgYXBwcm9wcmlhdGUgYmZkIHRhcmdldCBmaWxlLikKKyAgICAoVGhlIGRlZmF1bHQgaXMgYSBoZXVyaXN0aWMgdGhhdCB3aWxsIGJyZWFrIGlmIHBlb3BsZSB0cnkgY2hhbmdpbmcKKyAgICB0aGUgZW50cnkgcG9pbnQsIHBlcmhhcHMgd2l0aCB0aGUgbGQgLWUgZmxhZy4pCisKKyAgICAqIFFNQUdJQyBpcyBhbHdheXMgbGlrZSBhIFpNQUdJQyBmb3Igd2hpY2ggTl9IRUFERVJfSU5fVEVYVCBpcyB0cnVlLAorICAgIGFuZCBmb3Igd2hpY2ggdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaXMgVEFSR0VUX1BBR0VfU0laRSAob3Igc2hvdWxkIHRoaXMgYmUKKyAgICBTRUdNRU5UX1NJWkU/KSAoVEVYVF9TVEFSVF9BRERSIG9ubHkgYXBwbGllcyB0byBaTUFHSUMsIG5vdCB0byBRTUFHSUMpLgorICAgICovCisKKy8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDIGZpbGVzOyBRTUFHSUMgYWx3YXlzIGhhcyB0aGUgaGVhZGVyCisgICBpbiB0aGUgdGV4dC4gICovCisjaWZuZGVmIE5fSEVBREVSX0lOX1RFWFQKKyNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAoKCh4KS5hX2VudHJ5ICYgKFRBUkdFVF9QQUdFX1NJWkUtMSkpID49IEVYRUNfQllURVNfU0laRSkKKyNlbmRpZgorCisvKiBTdW4gc2hhcmVkIGxpYnJhcmllcywgbm90IGxpbnV4LiAgVGhpcyBtYWNybyBpcyBvbmx5IHJlbGV2YW50IGZvciBaTUFHSUMKKyAgIGZpbGVzLiAgKi8KKyNpZm5kZWYgTl9TSEFSRURfTElCCisjZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAoKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpCisjZW5kaWYKKworLyogUmV0dXJuaW5nIDAgbm90IFRFWFRfU1RBUlRfQUREUiBmb3IgT01BR0lDIGFuZCBOTUFHSUMgaXMgYmFzZWQgb24KKyAgIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIC5vIGZpbGUsIG5vdCBhbgorICAgZXhlY3V0YWJsZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBPTUFHSUMgKGJ1dCBtZWFucyB3ZSBkb24ndCB3b3JrCisgICByaWdodCBvbiB0aGUgb3V0cHV0IGZyb20gbGQgLU4pOyBtb3JlIHF1ZXN0aW9uYWJsZSBmb3IgTk1BR0lDLiAgKi8KKworI2lmbmRlZiBOX1RYVEFERFIKKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKyAgICAoLyogVGhlIGFkZHJlc3Mgb2YgYSBRTUFHSUMgZmlsZSBpcyBhbHdheXMgb25lIHBhZ2UgaW4sICovIFwKKyAgICAgLyogd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8gXAorICAgICBOX0lTX1FNQUdJQyAoeCkgPyBUQVJHRVRfUEFHRV9TSVpFICsgRVhFQ19CWVRFU19TSVpFIDogXAorICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCisgICAgIE5fU0hBUkVEX0xJQih4KSA/IDAgOglcCisgICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAorCSAgICBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUgOgkvKiBubyBwYWRkaW5nICovXAorCSAgICBURVhUX1NUQVJUX0FERFIJCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKKyAgICApCisjZW5kaWYKKworLyogSWYgTl9IRUFERVJfSU5fVEVYVCBpcyBub3QgdHJ1ZSBmb3IgWk1BR0lDLCB0aGVyZSBpcyBzb21lIHBhZGRpbmcKKyAgIHRvIG1ha2UgdGhlIHRleHQgc2VnbWVudCBzdGFydCBhdCBhIGNlcnRhaW4gYm91bmRhcnkuICBGb3IgbW9zdAorICAgc3lzdGVtcywgdGhpcyBib3VuZGFyeSBpcyBUQVJHRVRfUEFHRV9TSVpFLiAgQnV0IGZvciBMaW51eCwgaW4gdGhlCisgICB0aW1lLWhvbm9yZWQgdHJhZGl0aW9uIG9mIGNyYXp5IFpNQUdJQyBoYWNrcywgaXQgaXMgMTAyNCB3aGljaCBpcworICAgbm90IHdoYXQgVEFSR0VUX1BBR0VfU0laRSBuZWVkcyB0byBiZSBmb3IgUU1BR0lDLiAgKi8KKworI2lmbmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCisjZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgVEFSR0VUX1BBR0VfU0laRQorI2VuZGlmCisKKyNkZWZpbmUgTl9ESVNLX0JMT0NLX1NJWkUoeCkgXAorICAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPyBaTUFHSUNfRElTS19CTE9DS19TSVpFIDogVEFSR0VUX1BBR0VfU0laRSkKKworLyogT2Zmc2V0IGluIGFuIGEub3V0IG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAqLworI2lmbmRlZiBOX1RYVE9GRgorI2RlZmluZSBOX1RYVE9GRih4KQlcCisgICAgKC8qIEZvciB7TyxOLFF9TUFHSUMsIG5vIHBhZGRpbmcuICAqLyBcCisgICAgIE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gRVhFQ19CWVRFU19TSVpFIDogXAorICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDogXAorICAgICBOX0hFQURFUl9JTl9URVhUKHgpID8JXAorCSAgICBFWEVDX0JZVEVTX1NJWkUgOgkJCS8qIG5vIHBhZGRpbmcgKi9cCisJICAgIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAorICAgICkKKyNlbmRpZgorLyogU2l6ZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgSXQncyBhbHdheXMgYXMgc3RhdGVkLCBleGNlcHQgdGhhdCB3ZQorICAgb2Zmc2V0IGl0IHRvIGB1bmRvJyB0aGUgYWRqdXN0bWVudCB0byBOX1RYVEFERFIgYW5kIE5fVFhUT0ZGCisgICBmb3IgWk1BR0lDIGZpbGVzIHRoYXQgbm9taW5hbGx5IGluY2x1ZGUgdGhlIGV4ZWMgaGVhZGVyCisgICBhcyBwYXJ0IG9mIHRoZSBmaXJzdCBwYWdlIG9mIHRleHQuICAoQkZEIGRvZXNuJ3QgY29uc2lkZXIgdGhlCisgICBleGVjIGhlYWRlciB0byBiZSBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQuKSAgKi8KKyNpZm5kZWYgTl9UWFRTSVpFCisjZGVmaW5lCU5fVFhUU0laRSh4KSBcCisgICAgKC8qIEZvciBRTUFHSUMsIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBoZWFkZXIgcGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgKi9cCisgICAgIE5fSVNfUU1BR0lDICh4KSA/ICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkUgOiBcCisgICAgIChOX01BR0lDKHgpICE9IFpNQUdJQyB8fCBOX1NIQVJFRF9MSUIoeCkpID8gKHgpLmFfdGV4dCA6IFwKKyAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSAgPwlcCisJICAgICh4KS5hX3RleHQgLSBFWEVDX0JZVEVTX1NJWkU6CS8qIG5vIHBhZGRpbmcgKi9cCisJICAgICh4KS5hX3RleHQJCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCisgICAgKQorI2VuZGlmCisvKiBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGluIHZpcnR1YWwgbWVtb3J5LgorICAgSXQgaXMgdGhlIHRleHQgc2VnbWVudCBhZGRyZXNzLCBwbHVzIHRleHQgc2VnbWVudCBzaXplLCByb3VuZGVkCisgICB1cCB0byBhIE5fU0VHU0laRSBib3VuZGFyeSBmb3IgcHVyZSBvciBwYWdlYWJsZSBmaWxlcy4gKi8KKyNpZm5kZWYgTl9EQVRBRERSCisjZGVmaW5lIE5fREFUQUREUih4KSBcCisgICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCkpIFwKKyAgICAgOiAgKE5fU0VHU0laRSh4KSArICgoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KS0xKSAmIH4oTl9TRUdTSVpFKHgpLTEpKSkpCisjZW5kaWYKKy8qIFRoZSBhZGRyZXNzIG9mIHRoZSBCU1Mgc2VnbWVudCAtLSBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGF0YSBzZWdtZW50LiAgKi8KKworI2RlZmluZSBOX0JTU0FERFIoeCkJKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCisKKy8qIE9mZnNldHMgb2YgdGhlIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIGZpbGUgYWZ0ZXIgdGhlIHRleHQgc2VnbWVudC4gICovCisKKy8qIEZvciB7USxafU1BR0lDLCB0aGVyZSBpcyBwYWRkaW5nIHRvIG1ha2UgdGhlIGRhdGEgc2VnbWVudCBzdGFydCBvbgorICAgYSBwYWdlIGJvdW5kYXJ5LiAgTW9zdCBvZiB0aGUgdGltZSB0aGUgYV90ZXh0IGZpZWxkIChhbmQgdGh1cworICAgTl9UWFRTSVpFKSBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgcGFkZGluZy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgZm9yCisgICBCU0RJIGFuZC9vciAzODZCU0QgaXQgc29tZXRpbWVzIGRvZXNuJ3QgY29udGFpbiB0aGUgcGFkZGluZywgYW5kCisgICBwZXJoYXBzIHdlIHNob3VsZCBiZSBhZGRpbmcgaXQgaGVyZS4gIEJ1dCB0aGlzIHNlZW1zIGtpbmQgb2YKKyAgIHF1ZXN0aW9uYWJsZSBhbmQgcHJvYmFibHkgc2hvdWxkIGJlIEJTREkvMzg2QlNELXNwZWNpZmljIGlmIHdlIGRvCisgICBkbyBpdC4KKworICAgRm9yIE5NQUdJQyAoYXQgbGVhc3QgZm9yIGhwMzAwIEJTRCwgcHJvYmFibHkgb3RoZXJzKSwgdGhlcmUgaXMKKyAgIHBhZGRpbmcgaW4gbWVtb3J5IG9ubHksIG5vdCBvbiBkaXNrLCBzbyB3ZSBtdXN0ICpub3QqIGV2ZXIgcGFkIGhlcmUKKyAgIGZvciBOTUFHSUMuICAqLworCisjaWZuZGVmIE5fREFUT0ZGCisjZGVmaW5lIE5fREFUT0ZGKHgpIFwKKyAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCisjZW5kaWYKKworI2lmbmRlZiBOX1RSRUxPRkYKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKKyNlbmRpZgorI2lmbmRlZiBOX0RSRUxPRkYKKyNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKKyNlbmRpZgorI2lmbmRlZiBOX1NZTU9GRgorI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCisjZW5kaWYKKyNpZm5kZWYgTl9TVFJPRkYKKyNkZWZpbmUgTl9TVFJPRkYoeCkJKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQorI2VuZGlmCisMCisvKiBTeW1ib2xzICovCisjaWZuZGVmIGV4dGVybmFsX25saXN0CitzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgeworICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KKyAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCisgIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLworICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KKyAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCit9OworI2RlZmluZSBFWFRFUk5BTF9OTElTVF9TSVpFIChCWVRFU19JTl9XT1JEKzQrQllURVNfSU5fV09SRCkKKyNlbmRpZgorCitzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgeworICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCisgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCisgIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KKyAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLworfTsKKworLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLworCisjZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KKyNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCisjZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLworI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KKyNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLworI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KKyNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCisjZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLworLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCisgICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCisgICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KKyNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KKyNkZWZpbmUgTl9UWVBFICAweDFlCisjZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KKworI2RlZmluZSBOX0lORFIgMHgwYQorCisvKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgorICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCisgICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0CisgICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCisgICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgorCisgICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCisgICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCisgICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAorICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCisKKy8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KKyNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCisKKy8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLworI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCisKKy8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCisgICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKKyAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCisKKyNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKKworLyogV2VhayBzeW1ib2xzLiAgVGhlc2UgYXJlIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgYS5vdXQgZm9ybWF0LiAgVGhlCisgICBzZW1hbnRpY3MgYXJlIHRob3NlIG9mIEVMRiB3ZWFrIHN5bWJvbHMuICBXZWFrIHN5bWJvbHMgYXJlIGFsd2F5cworICAgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhlIE5fV0VBSz8gdmFsdWVzIGFyZSBzcXVlZXplZCBpbnRvIHRoZQorICAgYXZhaWxhYmxlIHNsb3RzLiAgVGhlIHZhbHVlIG9mIGEgTl9XRUFLVSBzeW1ib2wgaXMgMC4gIFRoZSB2YWx1ZXMKKyAgIG9mIHRoZSBvdGhlciB0eXBlcyBhcmUgdGhlIGRlZmluaXRpb25zLiAgKi8KKyNkZWZpbmUgTl9XRUFLVQkweDBkCQkvKiBXZWFrIHVuZGVmaW5lZCBzeW1ib2wuICAqLworI2RlZmluZSBOX1dFQUtBIDB4MGUJCS8qIFdlYWsgYWJzb2x1dGUgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9XRUFLVCAweDBmCQkvKiBXZWFrIHRleHQgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9XRUFLRCAweDEwCQkvKiBXZWFrIGRhdGEgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9XRUFLQiAweDExCQkvKiBXZWFrIGJzcyBzeW1ib2wuICAqLworCisvKiBSZWxvY2F0aW9ucyAKKworICBUaGVyZQlhcmUgdHdvIHR5cGVzIG9mIHJlbG9jYXRpb24gZmxhdm91cnMgZm9yIGEub3V0IHN5c3RlbXMsCisgIHN0YW5kYXJkIGFuZCBleHRlbmRlZC4gVGhlIHN0YW5kYXJkIGZvcm0gaXMgdXNlZCBvbiBzeXN0ZW1zIHdoZXJlIHRoZQorICBpbnN0cnVjdGlvbiBoYXMgcm9vbSBmb3IgYWxsIHRoZSBiaXRzIG9mIGFuIG9mZnNldCB0byB0aGUgb3BlcmFuZCwgd2hpbHN0CisgIHRoZSBleHRlbmRlZCBmb3JtIGlzIHVzZWQgd2hlbiBhbiBhZGRyZXNzIG9wZXJhbmQgaGFzIHRvIGJlIHNwbGl0IG92ZXIgbgorICBpbnN0cnVjdGlvbnMuIEVnLCBvbiB0aGUgNjhrLCBlYWNoIG1vdmUgaW5zdHJ1Y3Rpb24gY2FuIHJlZmVyZW5jZQorICB0aGUgdGFyZ2V0IHdpdGggYSBkaXNwbGFjZW1lbnQgb2YgMTYgb3IgMzIgYml0cy4gT24gdGhlIHNwYXJjLCBtb3ZlCisgIGluc3RydWN0aW9ucyB1c2UgYW4gb2Zmc2V0IG9mIDE0IGJpdHMsIHNvIHRoZSBvZmZzZXQgaXMgc3RvcmVkIGluCisgIHRoZSByZWxvYyBmaWVsZCwgYW5kIHRoZSBkYXRhIGluIHRoZSBzZWN0aW9uIGlzIGlnbm9yZWQuCisqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCisgICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKKyAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgorICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLworCitzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsIHsKKyAgYmZkX2J5dGUJcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KKyAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KKyAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLworfTsKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCisjZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfQklHCSgodW5zaWduZWQgaW50KSAweDYwKQorI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwNikKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCisKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkoKHVuc2lnbmVkIGludCkgMHgxMCkKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwOCkKKworI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwOCkKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MTApCisKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHCSgodW5zaWduZWQgaW50KSAweDA0KQorI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MjApCisKKyNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCSgodW5zaWduZWQgaW50KSAweDAyKQorI2RlZmluZQlSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4NDApCisKKyNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCisKK3N0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKK3sKKyAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KKyAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCisgIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKKyAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAorICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKKyAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKKyAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgorICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKKyAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KKyAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKKyAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KKyAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCisgICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCisgIHVuc2lnbmVkIGludCByX2V4dGVybjoxOworICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KKyAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCisgIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KKyAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCisgIC8qIHVudXNlZCAqLworICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KK307CisKKworLyogRVhURU5ERUQgUkVMT0NTICAqLworCitzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKKyAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KKyAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KKyAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLworICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCit9OworCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4ODApCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCisKKyNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCSgodW5zaWduZWQgaW50KSAweDFGKQorI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCisjZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweEY4KQorI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRQkzCisKKy8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCisjZGVmaW5lCVJFTE9DX0VYVF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEgKyBCWVRFU19JTl9XT1JEKQorCitlbnVtIHJlbG9jX3R5cGUKK3sKKyAgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCisgIFJFTE9DXzgsCQkJLyogZGF0YVswOjddID0gYWRkZW5kICsgc3YgCQkqLworICBSRUxPQ18xNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kICsgc3YgCQkqLworICBSRUxPQ18zMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kICsgc3YgCQkqLworICAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCisgIFJFTE9DX0RJU1A4LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCisgIFJFTE9DX0RJU1AxNiwJCQkvKiBkYXRhWzA6MTVdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KKyAgUkVMT0NfRElTUDMyLAkJCS8qIGRhdGFbMDozMV0gPSBhZGRlbmQgLSBwYyArIHN2IAkqLworICAvKiBTcGVjaWFsICovCisgIFJFTE9DX1dESVNQMzAsCQkvKiBkYXRhWzA6MjldID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLworICBSRUxPQ19XRElTUDIyLAkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KKyAgUkVMT0NfSEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KT4+MTAgCSovCisgIFJFTE9DXzIyLAkJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YpIAkJKi8KKyAgUkVMT0NfMTMsCQkJLyogZGF0YVswOjEyXSA9IChhZGRlbmQgKyBzdikJCSovCisgIFJFTE9DX0xPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KQkJKi8KKyAgUkVMT0NfU0ZBX0JBU0UsCQkKKyAgUkVMT0NfU0ZBX09GRjEzLAorICAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCisgIFJFTE9DX0JBU0UxMCwgIAkJLyogTm90IHN1cmUgLSBtYXliZSB3ZSBjYW4gZG8gdGhpcyB0aGUgKi8KKyAgUkVMT0NfQkFTRTEzLAkJCS8qIHJpZ2h0IHdheSBub3cgKi8KKyAgUkVMT0NfQkFTRTIyLAorICAvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCisgIFJFTE9DX1BDMTAsCisgIFJFTE9DX1BDMjIsCisgIC8qIFAuSS5DLiBqdW1wIHRhYmxlICovCisgIFJFTE9DX0pNUF9UQkwsCisgIC8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCisgIFJFTE9DX1NFR09GRjE2LAorICBSRUxPQ19HTE9CX0RBVCwKKyAgUkVMT0NfSk1QX1NMT1QsCisgIFJFTE9DX1JFTEFUSVZFLAorCisgIFJFTE9DXzExLAkKKyAgUkVMT0NfV0RJU1AyXzE0LAorICBSRUxPQ19XRElTUDE5LAorICBSRUxPQ19ISEkyMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSA+PiA0MiAgICAgKi8KKyAgUkVMT0NfSExPMTAsCQkJLyogZGF0YVswOjldID0gKGFkZGVuZCArIHN2KSA+PiAzMiAgICAgICovCisgIAorICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLworICBSRUxPQ19KVU1QVEFSRywKKyAgUkVMT0NfQ09OU1QsCisgIFJFTE9DX0NPTlNUSCwKKyAgCisgIC8qIEFsbCB0aGUgbmV3IG9uZXMgSSBjYW4gdGhpbmsgb2YsIGZvciBzcGFyYyB2OSAqLworCisgIFJFTE9DXzY0LAkJCS8qIGRhdGFbMDo2M10gPSBhZGRlbmQgKyBzdiAJCSovCisgIFJFTE9DX0RJU1A2NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KKyAgUkVMT0NfV0RJU1AyMSwJCS8qIGRhdGFbMDoyMF0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCisgIFJFTE9DX0RJU1AyMSwJCQkvKiBkYXRhWzA6MjBdID0gYWRkZW5kIC0gcGMgKyBzdiAgICAgICAgKi8KKyAgUkVMT0NfRElTUDE0LAkJCS8qIGRhdGFbMDoxM10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLworICAvKiBRIC4KKyAgICAgV2hhdCBhcmUgdGhlIG90aGVyIG9uZXMsCisgICAgIFNpbmNlIHRoaXMgaXMgYSBjbGVhbiBzbGF0ZSwgY2FuIHdlIHRocm93IGF3YXkgdGhlIG9uZXMgd2UgZG9udAorICAgICB1bmRlcnN0YW5kID8gU2hvdWxkIHdlIHNvcnQgdGhlIHZhbHVlcyA/IFdoYXQgYWJvdXQgdXNpbmcgYQorICAgICBtaWNyb2NvZGUgZm9ybWF0IGxpa2UgdGhlIDY4ayA/CisgICAgICovCisgIE5PX1JFTE9DCisgIH07CisKKworc3RydWN0IHJlbG9jX2ludGVybmFsIHsKKyAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KKyAgbG9uZwlyX2luZGV4OwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KKyAgZW51bSByZWxvY190eXBlIHJfdHlwZTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KKyAgYmZkX3ZtYSByX2FkZGVuZDsJCS8qIGRhdHVtIGFkZGVuZAkJCQkqLworfTsKKworLyogUS4KKyAgIFNob3VsZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUgYmUgNCBieXRlcyBvciA4IGJ5dGVzID8KKworICAgUS4KKyAgIFdoYXQgYWJvdXQgYXJjaGl2ZSBpbmRleGVzID8KKworICovCisKKyNlbmRpZgkJCQkvKiBfX0FfT1VUXzY0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FyLmggYi9pbmNsdWRlL2FvdXQvYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjVkY2RhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hb3V0L2FyLmgKQEAgLTAsMCArMSwzNiBAQAorLyogYXJjaGl2ZSBmaWxlIGRlZmluaXRpb24gZm9yIEdOVSBzb2Z0d2FyZSAqLworCisvKiBTbyBmYXIgdGhpcyBpcyBjb3JyZWN0IGZvciBCU0Rpc2ggYXJjaGl2ZXMuICBEb24ndCBmb3JnZXQgdGhhdAorICAgZmlsZXMgbXVzdCBiZWdpbiBvbiBhbiBldmVuIGJ5dGUgYm91bmRhcnkuICovCisKKyNpZm5kZWYgX19HTlVfQVJfSF9fCisjZGVmaW5lIF9fR05VX0FSX0hfXworCisvKiBOb3RlIHRoYXQgdGhlIHVzdWFsICdcbicgaW4gbWFnaWMgc3RyaW5ncyBtYXkgdHJhbnNsYXRlIHRvIGRpZmZlcmVudAorICAgY2hhcmFjdGVycywgYXMgYWxsb3dlZCBieSBBTlNJLiAgJ1wwMTInIGhhcyBhIGZpeGVkIHZhbHVlLCBhbmQgcmVtYWlucworICAgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIEJTRGlzaCBhcmNoaXZlcy4gKi8KKworI2RlZmluZSBBUk1BRyAgIiE8YXJjaD5cMDEyIgkvKiBGb3IgQ09GRiBhbmQgYS5vdXQgYXJjaGl2ZXMgKi8KKyNkZWZpbmUgQVJNQUdCICIhPGJvdXQ+XDAxMiIJLyogRm9yIGIub3V0IGFyY2hpdmVzICovCisjZGVmaW5lIFNBUk1BRyA4CisjZGVmaW5lIEFSRk1BRyAiYFwwMTIiCisKKy8qIFRoZSBhcl9kYXRlIGZpZWxkIG9mIHRoZSBhcm1hcCAoX18uU1lNREVGKSBtZW1iZXIgb2YgYW4gYXJjaGl2ZQorICAgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1vZGlmaWVkIGRhdGUgb2YgdGhlIGVudGlyZSBmaWxlLCBvciAKKyAgIEJTRC1kZXJpdmVkIGxpbmtlcnMgY29tcGxhaW4uICBXZSBvcmlnaW5hbGx5IHdyaXRlIHRoZSBhcl9kYXRlIHdpdGgKKyAgIHRoaXMgb2Zmc2V0IGZyb20gdGhlIHJlYWwgZmlsZSdzIG1vZC10aW1lLiAgQWZ0ZXIgZmluaXNoaW5nIHRoZQorICAgZmlsZSwgd2UgcmV3cml0ZSBhcl9kYXRlIGlmIGl0J3Mgbm90IHN0aWxsIGdyZWF0ZXIgdGhhbiB0aGUgbW9kIGRhdGUuICAqLworCisjZGVmaW5lIEFSTUFQX1RJTUVfT0ZGU0VUICAgICAgIDYwCisKK3N0cnVjdCBhcl9oZHIgeworICBjaGFyIGFyX25hbWVbMTZdOwkJLyogbmFtZSBvZiB0aGlzIG1lbWJlciAqLworICBjaGFyIGFyX2RhdGVbMTJdOwkJLyogZmlsZSBtdGltZSAqLworICBjaGFyIGFyX3VpZFs2XTsJCS8qIG93bmVyIHVpZDsgcHJpbnRlZCBhcyBkZWNpbWFsICovCisgIGNoYXIgYXJfZ2lkWzZdOwkJLyogb3duZXIgZ2lkOyBwcmludGVkIGFzIGRlY2ltYWwgKi8KKyAgY2hhciBhcl9tb2RlWzhdOwkJLyogZmlsZSBtb2RlLCBwcmludGVkIGFzIG9jdGFsICAgKi8KKyAgY2hhciBhcl9zaXplWzEwXTsJCS8qIGZpbGUgc2l6ZSwgcHJpbnRlZCBhcyBkZWNpbWFsICovCisgIGNoYXIgYXJfZm1hZ1syXTsJCS8qIHNob3VsZCBjb250YWluIEFSRk1BRyAqLworfTsKKworI2VuZGlmIC8qIF9fR05VX0FSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2R5bml4My5oIGIvaW5jbHVkZS9hb3V0L2R5bml4My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvZHluaXgzLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIGEub3V0IHNwZWNpZmljcyBmb3IgU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIER5bml4IDMueAorICovCisjaWZuZGVmIEFfT1VUX0RZTklYM19ICisjZGVmaW5lIEFfT1VUX0RZTklYM19ICisKKyNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBkeW5peF9leHRlcm5hbF9leGVjCisKKy8qIHN0cnVjdCBleGVjIGZvciBEeW5peCAzCisgKgorICogYV9nZHRibCBhbmQgYV9ib290c3RyYXAgYXJlIG9ubHkgZm9yIHN0YW5kYWxvbmUgYmluYXJpZXMuCisgKiBTaGFyZWQgZGF0YSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCBhcyBvZiBEeW5peCAzLjEsCisgKiBidXQgYXJlIHN1cHBvcnRlZCBieSBEeW5peCBjb21waWxlciBwcm9ncmFtcy4KKyAqLworc3RydWN0IGR5bml4X2V4dGVybmFsX2V4ZWMgeworCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOworCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOworCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOworCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07CisJdW5zaWduZWQgY2hhciBlX3N5bXNbNF07CisJdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOworCXVuc2lnbmVkIGNoYXIgZV90cnNpemVbNF07CisJdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIGVfZ19jb2RlWzhdLCBlX2dfZGF0YVs4XSwgZV9nX2Rlc2NbOF07CisJdW5zaWduZWQgY2hhciBlX3NoZGF0YVs0XTsKKwl1bnNpZ25lZCBjaGFyIGVfc2hic3NbNF07CisJdW5zaWduZWQgY2hhciBlX3NoZHJzaXplWzRdOworCXVuc2lnbmVkIGNoYXIgZV9ib290c3RyYXBbNDRdOworCXVuc2lnbmVkIGNoYXIgZV9yZXNlcnZlZFsxMl07CisJdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bNF07Cit9OworCisjZGVmaW5lCUVYRUNfQllURVNfU0laRQkoMTI4KQorCisvKgorICogQWxsIGV4ZWN1dGFibGVzIHVuZGVyIER5bml4IGFyZSBkZW1hbmQgcGFnZWQgd2l0aCByZWFkLW9ubHkgdGV4dCwKKyAqIFRodXMgbm8gTk1BR0lDLgorICoKKyAqIFpNQUdJQyBoYXMgYSBwYWdlIG9mIDBzIGF0IHZpcnR1YWwgMCwKKyAqIFhNQUdJQyBoYXMgYW4gaW52YWxpZCBwYWdlIGF0IHZpcnR1YWwgMAorICovCisjZGVmaW5lIE9NQUdJQwkweDEyZWIJCS8qIC5vICovCisjZGVmaW5lIFpNQUdJQwkweDIyZWIJCS8qIHplcm8gQCAwLCBkZW1hbmQgbG9hZCAqLworI2RlZmluZSBYTUFHSUMJMHgzMmViCQkvKiBpbnZhbGlkIEAgMCwgZGVtYW5kIGxvYWQgKi8KKyNkZWZpbmUgU01BR0lDCTB4NDJlYgkJLyogc3RhbmRhbG9uZSwgbm90IHN1cHBvcnRlZCBoZXJlICovCisKKyNkZWZpbmUgTl9CQURNQUcoeCkgKChPTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAorCQkgICAgIChaTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAorCQkgICAgIChYTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAorCQkgICAgIChTTUFHSUMgIT0gTl9NQUdJQyh4KSkpCisKKyNkZWZpbmUgTl9BRERSQURKKHgpICgoWk1BR0lDID09IE5fTUFHSUMoeCkgfHwgWE1BR0lDID09IE5fTUFHSUMoeCkpID8gMHgxMDAwIDogMCkKKworI2RlZmluZSBOX1RYVE9GRih4KSAoRVhFQ19CWVRFU19TSVpFKQorI2RlZmluZSBOX0RBVE9GRih4KSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCisjZGVmaW5lIE5fU0hEQVRPRkYoeCkgKE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX1NIREFUT0ZGKHgpICsgKHgpLmFfc2hkYXRhKQorI2RlZmluZSBOX0RSRUxPRkYoeCkgKE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSkKKyNkZWZpbmUgTl9TSERSRUxPRkYoeCkgKE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSkKKyNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fU0hEUkVMT0ZGKHgpICsgKHgpLmFfc2hkcnNpemUpCisjZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArICh4KS5hX3N5bXMpCisKKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKwkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAwIFwKKwkgOiBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUpCisKKyNkZWZpbmUgTl9UWFRTSVpFKHgpIFwKKwkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAoKHgpLmFfdGV4dCkgXAorCSA6ICgoeCkuYV90ZXh0IC0gTl9BRERSQURKKHgpIC0gRVhFQ19CWVRFU19TSVpFKSkKKworI2VuZGlmIC8qIEFfT1VUX0RZTklYM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZW5jYXAuaCBiL2luY2x1ZGUvYW91dC9lbmNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMTVkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvZW5jYXAuaApAQCAtMCwwICsxLDEzNSBAQAorLyogWWV0IEFub3RoZXIgVHJ5IGF0IGVuY2Fwc3VsYXRpbmcgYnNkIG9iamVjdCBmaWxlcyBpbiBjb2ZmLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBQYWNlIFdpbGxpc3NvbiAxMi85Lzg4CisKKyAgIFRoaXMgZmlsZSBpcyBvYnNvbGV0ZS4gIEl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBqdXN0IGRlZmluZSBhIGJ1bmNoCisgICBvZiBzdHVmZiB0aGF0IEJGRCBjYW4gdXNlIHRvIGRvIGNvZmYtZW5jYXBzdWxhdGVkIGZpbGVzLiAgLS1nbnVAY3lnbnVzLmNvbQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogV2Ugb25seSB1c2UgdGhlIGNvZmYgaGVhZGVycyB0byB0ZWxsIHRoZSBrZXJuZWwKKyAqIGhvdyB0byBleGVjIHRoZSBmaWxlLiAgVGhlcmVmb3JlLCB0aGUgb25seSBmaWVsZHMgdGhhdCBuZWVkIHRvIAorICogYmUgZmlsbGVkIGluIGFyZSB0aGUgc2NucHRyIGFuZCB2YWRkciBmb3IgdGhlIHRleHQgYW5kIGRhdGEKKyAqIHNlY3Rpb25zLCBhbmQgdGhlIHZhZGRyIGZvciB0aGUgYnNzLiAgQXMgZmFyIGFzIGNvZmYgaXMgY29uY2VybmVkLAorICogdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLCByZWxvY2F0aW9uLCBvciBsaW5lIG51bWJlcnMuCisgKgorICogQSBub3JtYWwgYnNkIGhlYWRlciAoc3RydWN0IGV4ZWMpIGlzIHBsYWNlZCBhZnRlciB0aGUgY29mZiBoZWFkZXJzLAorICogYW5kIGJlZm9yZSB0aGUgcmVhbCB0ZXh0LiAgSSBkZWZpbmVkIGEgdGhlIG5ldyBmaWVsZHMgJ2FfbWFjaHR5cGUnCisgKiBhbmQgYV9mbGFncy4gIElmIGFfbWFjaHR5cGUgaXMgTV8zODYsIGFuZCBhX2ZsYWdzICYgQV9FTkNBUCBpcworICogdHJ1ZSwgdGhlbiB0aGUgYnNkIGhlYWRlciBpcyBwcmVjZWVkZWQgYnkgYSBjb2ZmIGhlYWRlci4gIE1hY3JvcworICogbGlrZSBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIHVzZSB0aGlzIGZpZWxkIHRvIGZpbmQgdGhlIGJzZCBoZWFkZXIuCisgKiAKKyAqIFRoZSBvbmx5IHByb2JsZW0gaXMgdG8gdHJhY2sgZG93biB0aGUgYnNkIGV4ZWMgaGVhZGVyLiAgVGhlCisgKiBtYWNyb3MgSEVBREVSX09GRlNFVCwgZXRjIGRvIHRoaXMuCisgKi8KKworI2RlZmluZSBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUgMHgyMCAvKiBjb2ZmIGhlYWRlciBwcmVjZWRlcyBic2QgaGVhZGVyICovCisKKy8qIERlc2NyaWJlIHRoZSBDT0ZGIGhlYWRlciB1c2VkIGZvciBlbmNhcHN1bGF0aW9uLiAgKi8KKworc3RydWN0IGNvZmZoZWFkZXIKK3sKKyAgLyogZmlsZWhkciAqLworICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOworICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOworICBsb25nIGZfdGltZGF0OworICBsb25nIGZfc3ltcHRyOworICBsb25nIGZfbnN5bXM7CisgIHVuc2lnbmVkIHNob3J0IGZfb3B0aGRyOworICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOworICAvKiBhb3V0aGRyICovCisgIHNob3J0IG1hZ2ljOworICBzaG9ydCB2c3RhbXA7CisgIGxvbmcgdHNpemU7CisgIGxvbmcgZHNpemU7CisgIGxvbmcgYnNpemU7CisgIGxvbmcgZW50cnk7CisgIGxvbmcgdGV4dF9zdGFydDsKKyAgbG9uZyBkYXRhX3N0YXJ0OworICBzdHJ1Y3QgY29mZnNjbgorICAgIHsKKyAgICAgIGNoYXIgc19uYW1lWzhdOworICAgICAgbG9uZyBzX3BhZGRyOworICAgICAgbG9uZyBzX3ZhZGRyOworICAgICAgbG9uZyBzX3NpemU7CisgICAgICBsb25nIHNfc2NucHRyOworICAgICAgbG9uZyBzX3JlbHB0cjsKKyAgICAgIGxvbmcgc19sbm5vcHRyOworICAgICAgdW5zaWduZWQgc2hvcnQgc19ucmVsb2M7CisgICAgICB1bnNpZ25lZCBzaG9ydCBzX25sbm5vOworICAgICAgbG9uZyBzX2ZsYWdzOworICAgIH0gc2Nuc1szXTsKK307CisMCisvKiBEZXNjcmliZSBzb21lIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBlbmNhcHN1bGF0aW9uLAorICAgaW5jbHVkaW5nIGhvdyB0byBmaW5kIHRoZSBlbmNhcHN1bGF0ZWQgQlNEIGhlYWRlci4gICovCisKKy8qIEZJWE1FLCB0aGlzIGlzIGR1bWIuICBUaGUgc2FtZSB0b29scyBjYW4ndCBoYW5kbGUgYS5vdXRzIGZvciBkaWZmZXJlbnQKKyAgIGFyY2hpdGVjdHVyZXMsIGp1c3QgYmVjYXVzZSBDT0ZGX01BR0lDIGlzIGRpZmZlcmVudDsgc28geW91IG5lZWQgYQorICAgc2VwYXJhdGUgR05VIG5tIGZvciBldmVyeSBhcmNoaXRlY3R1cmUhIT8gIFVuZm9ydHVuYXRlbHksIGl0IG5lZWRzIHRvCisgICBiZSB0aGlzIHdheSwgc2luY2UgdGhlIENPRkZfTUFHSUMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUga2VybmVsCisgICB3ZSdyZSB0cnlpbmcgdG8gZm9vbCBoZXJlLiAgKi8KKyAgIAorI2RlZmluZSBDT0ZGX01BR0lDX0kzODYgMDUxNCAvKiBJMzg2TUFHSUMgKi8KKyNkZWZpbmUgQ09GRl9NQUdJQ19NNjhLIDA1MjAgLyogTUM2OE1BR0lDICovCisjZGVmaW5lCUNPRkZfTUFHSUNfQTI5SyAweDE3QQkvKiBVc2VkIGJ5IGFzbTI5ayBjcm9zcy10b29scyAqLworCisjaWZkZWYgQ09GRl9NQUdJQworc2hvcnQgX19oZWFkZXJfb2Zmc2V0X3RlbXA7CisjZGVmaW5lIEhFQURFUl9PRkZTRVQoZikgXAorCShfX2hlYWRlcl9vZmZzZXRfdGVtcCA9IDAsIFwKKwkgZnJlYWQgKChjaGFyICopJl9faGVhZGVyX29mZnNldF90ZW1wLCBzaXplb2YgKHNob3J0KSwgMSwgKGYpKSwgXAorCSBmc2VlayAoKGYpLCAtc2l6ZW9mIChzaG9ydCksIDEpLCBcCisJIF9faGVhZGVyX29mZnNldF90ZW1wPT1DT0ZGX01BR0lDID8gc2l6ZW9mKHN0cnVjdCBjb2ZmaGVhZGVyKSA6IDApCisjZWxzZQorI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIDAKKyNlbmRpZgorCisjZGVmaW5lIEhFQURFUl9TRUVLKGYpIChmc2VlayAoKGYpLCBIRUFERVJfT0ZGU0VUKChmKSksIDEpKQorDAorLyogRGVzY3JpYmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgQlNEIGhlYWRlcgorICAgdGhhdCBhcHBlYXJzIGluc2lkZSB0aGUgZW5jYXBzdWxhdGlvbi4gICovCisKKy8qIEVuY2Fwc3VsYXRlZCBjb2ZmIGZpbGVzIHRoYXQgYXJlIGxpbmtlZCBaTUFHSUMgaGF2ZSBhIHRleHQgc2VnbWVudAorICAgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyIChhbmQgYSBtYXRjaGluZyBUWFRBRERSKSwgZXhjbHVkaW5nCisgICB0aGUgaGVhZGVycyBmcm9tIHRoZSB0ZXh0IHNlZ21lbnQgcHJvcGVyIGJ1dCBrZWVwaW5nIHRoZSBwaHlzaWNhbAorICAgbGF5b3V0IGFuZCB0aGUgdmlydHVhbCBtZW1vcnkgbGF5b3V0IHBhZ2UtYWxpZ25lZC4KKworICAgTm9uLWVuY2Fwc3VsYXRlZCBhLm91dCBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0CisgICBzZWdtZW50IHRoYXQgc3RhcnRzIGF0IDAgYW5kIGFuIE5fVFhUQURSIHNpbWlsYXJseSBvZmZzZXQgdG8gMC4KKyAgIFRoZXkgdG9vIGFyZSBwYWdlLWFsaWduZWQgd2l0aCBlYWNoIG90aGVyLCBidXQgdGhleSBpbmNsdWRlIHRoZQorICAgYS5vdXQgaGVhZGVyIGFzIHBhcnQgb2YgdGhlIHRleHQuIAorCisgICBUaGUgX05fSERST0ZGIGdldHMgc2l6ZW9mIHN0cnVjdCBleGVjIGFkZGVkIHRvIGl0LCBzbyB3ZSBoYXZlCisgICB0byBjb21wZW5zYXRlIGhlcmUuICBTZWUgPGEub3V0LmdudS5oPi4gICovCisKKyN1bmRlZiBfTl9IRFJPRkYKKyN1bmRlZiBOX1RYVEFERFIKKyN1bmRlZiBOX0RBVEFERFIKKworI2RlZmluZSBfTl9IRFJPRkYoeCkgKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKKwkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQorCisvKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKwkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAorCSBzaXplb2YgKHN0cnVjdCBjb2ZmaGVhZGVyKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDogMCkKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCisKKyNkZWZpbmUgTl9EQVRBRERSKHgpIFwKKwkoKE5fRkxBR1MoeCkgJiBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUpID8gXAorCSAoU0VHTUVOVF9TSVpFICsgKChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dC0xKSAmIH4oU0VHTUVOVF9TSVpFLTEpKSkgOiBcCisJIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaG9zdC5oIGIvaW5jbHVkZS9hb3V0L2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM2MjEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hb3V0L2hvc3QuaApAQCAtMCwwICsxLDIyIEBACisvKiBQYXJhbWV0ZXJzIGFib3V0IHRoZSBhLm91dCBmb3JtYXQsIGJhc2VkIG9uIHRoZSBob3N0IHN5c3RlbSBvbiB3aGljaAorICAgdGhlIHByb2dyYW0gaXMgY29tcGlsZWQuICAqLworCisvKiBBZGRyZXNzIG9mIGRhdGEgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLgorICAgSXQgaXMgdXAgdG8geW91IHRvIGRlZmluZSBTRUdNRU5UX1NJWkUKKyAgIG9uIG1hY2hpbmVzIG5vdCBsaXN0ZWQgaGVyZS4gICovCisjaWZuZGVmIFNFR01FTlRfU0laRQorI2lmIGRlZmluZWQoaHAzMDApIHx8IGRlZmluZWQocHlyKQorI2RlZmluZSBTRUdNRU5UX1NJWkUgcGFnZV9zaXplCisjZW5kaWYKKyNpZmRlZglzb255CisjZGVmaW5lCVNFR01FTlRfU0laRQkweDEwMDAKKyNlbmRpZgkvKiBTb255LiAgKi8KKyNpZmRlZiBpczY4aworI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgyMDAwMAorI2VuZGlmCisjaWYgZGVmaW5lZChtNjhrKSAmJiBkZWZpbmVkKFBPUlRBUikKKyNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDQwMAorI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQorI2VuZGlmCisjZW5kaWYgLyohZGVmaW5lZChTRUdNRU5UX1NJWkUpKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwLmggYi9pbmNsdWRlL2FvdXQvaHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJmNDljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hb3V0L2hwLmgKQEAgLTAsMCArMSw4MiBAQAorLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgorICAgQ29weXJpZ2h0IDE5ODgsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRISVMgRklMRSBJUyBPQlNPTEVURS4gIEl0IG5lZWRzIHRvIGJlIHJldmlzZWQgYXMgYSB2YXJpYW50ICJleHRlcm5hbCIKKyAgIGEub3V0IGZvcm1hdCBmb3IgdXNlIHdpdGggQkZELiAgKi8KKworLyogVGhlIGBleGVjJyBzdHJ1Y3R1cmUgYW5kIG92ZXJhbGwgbGF5b3V0IG11c3QgYmUgY2xvc2UgdG8gSFAncyB3aGVuCisgICB3ZSBhcmUgcnVubmluZyBvbiBhbiBIUCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvCisgICBleGVjdXRlIHRoZSByZXN1bHRpbmcgZmlsZS4gKi8KKworLyogQWxsb3cgdGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIHR3aWNlLiAqLworI2lmbmRlZiBfX0dOVV9FWEVDX01BQ1JPU19fCisKK3N0cnVjdCBleGVjCit7CisgIHVuc2lnbmVkIHNob3J0IGFfbWFjaHR5cGU7CS8qIG1hY2hpbmUgdHlwZSAqLworICB1bnNpZ25lZCBzaG9ydCBhX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgKi8KKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMTsKKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMjsKKyAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMzsJLyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNDsJLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwkvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNjsJLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCisgIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTc7CS8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLworICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OworfTsKKworLyogVGVsbCBhLm91dC5nbnUuaCBub3QgdG8gZGVmaW5lIGBzdHJ1Y3QgZXhlYycuICAqLworI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KKworI2luY2x1ZGUgIi4uL2Eub3V0LmdudS5oIgorCisjdW5kZWYgTl9NQUdJQworI3VuZGVmIE5fTUFDSFRZUEUKKyN1bmRlZiBOX0ZMQUdTCisjdW5kZWYgTl9TRVRfSU5GTworI3VuZGVmIE5fU0VUX01BR0lDCisjdW5kZWYgTl9TRVRfTUFDSFRZUEUKKyN1bmRlZiBOX1NFVF9GTEFHUworCisjZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKSAuIGFfbWFnaWMpCisjZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChleGVjKSAuIGFfbWFjaHR5cGUpCisjZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSAoKChleGVjKSAuIGFfbWFnaWMpID0gKG1hZ2ljKSkKKyNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpICgoKGV4ZWMpIC4gYV9tYWNodHlwZSkgPSAobWFjaHR5cGUpKQorCisjdW5kZWYgTl9CQURNQUcKKyNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQorCisjZGVmaW5lIF9OX0JBRE1BQ0goeCkJCQkJCQkJXAorKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmCQkJCQlcCisgKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKKworI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKKyNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQworCisjdW5kZWYgX05fSERST0ZGCisjZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKKworI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgxMDAwCisKKyNlbmRpZiAvKiBfX0dOVV9FWEVDX01BQ1JPU19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmggYi9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkNTE5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYW91dC9ocDMwMGhwdXguaApAQCAtMCwwICsxLDExOSBAQAorLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgorICAgQ29weXJpZ2h0IChDKSAxOTg4LDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCisKK3N0cnVjdCBocDMwMGhwdXhfZXhlY19ieXRlcworeworICB1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsgICAvKiBhX21hY2h0eXBlL2FfbWFnaWMgKi8KKyAgdW5zaWduZWQgY2hhciBlX3NwYXJlMVs0XTsKKyAgdW5zaWduZWQgY2hhciBlX3NwYXJlMls0XTsKKyAgdW5zaWduZWQgY2hhciBlX3RleHRbNF07ICAgLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOyAgIC8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIGVfYnNzWzRdOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgLCBpbiBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIGVfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyovCisgIHVuc2lnbmVkIGNoYXIgZV9kcnNpemVbNF07IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzKi8KKyAgdW5zaWduZWQgY2hhciBlX3Bhc3NpemVbNF07LyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KKyAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07ICAgLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU1WzRdOyAvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyIGVfZW50cnlbNF07ICAvKiBzdGFydCBhZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTZbNF07IC8qIEhQID0gc291cmNlIGxpbmUgdGFibGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyIGVfc3Vwc2l6ZVs0XTsvKiBIUCA9IHZhbHVlIHRhYmxlIHNpemUgKi8KKyAgdW5zaWduZWQgY2hhciBlX2RyZWxvY3NbNF07CisgIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07IC8qIGZpbGUgb2Zmc2V0IG9mIGV4dGVuc2lvbiAqLworfTsKKyNkZWZpbmUJRVhFQ19CWVRFU19TSVpFCTY0CisKK3N0cnVjdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgZV92YWx1ZVs0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKKyAgICB1bnNpZ25lZCBjaGFyIGVfbGVuZ3RoWzFdOwkvKiBsZW5ndGggb2YgYXNjaWkgc3ltYm9sIG5hbWUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGVfYWxtb2RbMl07CS8qIGFsaWdubWVudCBtb2QgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGVfc2hsaWJbMl07ICAgLyogaW5mbyBhYm91dCBkeW5hbWljIGxpbmtpbmcgKi8KKyAgfTsKKyNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAxMAorCitzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIHJfYWRkcmVzc1s0XTsvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAqLworICAgIHVuc2lnbmVkIGNoYXIgcl9pbmRleFsyXTsgIC8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgcl90eXBlWzFdOyAgIC8qIHJlbG9jYXRpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgcl9sZW5ndGhbMV07IC8qIGxlbmd0aCBvZiBpdGVtIHRvIHJlbG9jICAgICAgICAgICAgICAqLworICB9OworCitzdHJ1Y3QgaHAzMDBocHV4X2hlYWRlcl9leHRlbnNpb24KK3sKKyAgICB1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsKKyAgICB1bnNpZ25lZCBjaGFyIHVuaXF1ZV9oZWFkZXJzWzEyKjRdOworICAgIHVuc2lnbmVkIGNoYXIgZV9oZWFkZXJbMl07ICAgLyogdHlwZSBvZiBoZWFkZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGVfdmVyc2lvblsyXTsgIC8qIHZlcnNpb24gICAgICAgICovCisgICAgdW5zaWduZWQgY2hhciBlX3NpemVbNF07ICAgICAvKiBieXRlcyBmb2xsb3dpbmcqLworICAgIHVuc2lnbmVkIGNoYXIgZV9leHRlbnNpb25bNF07LyogZmlsZSBvZmZzZXQgb2YgbmV4dCBleHRlbnNpb24gKi8KK307CisjZGVmaW5lIEVYVEVSTkFMX0VYVEVOU0lPTl9IRUFERVJfU0laRSAoMTYqNCkKKworLyogaHB1eCBzZXBhcmF0ZXMgb2JqZWN0IGZpbGVzICgweDEwNikgYW5kIGltcHVyZSBleGVjdXRhYmxlcyAoMHgxMDcpICAqLworLyogYnV0IHRoZSBiZmQgY29kZSBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uIFNpbmNlIHdlIHdhbnQgdG8qLworLyogcmVhZCBocHV4IC5vIGZpbGVzLCB3ZSBhZGQgYW4gc3BlY2lhbCBkZWZpbmUgYW5kIHVzZSBpdCBiZWxvdyBpbiAgICAqLworLyogb2Zmc2V0IGFuZCBhZGRyZXNzIGNhbGN1bGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEhQVVhfRE9UX09fTUFHSUMgMHgxMDYKKyNkZWZpbmUgT01BR0lDIDB4MTA3ICAgICAgIC8qIG9iamVjdCBmaWxlIG9yIGltcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDB4MTA4ICAgICAgIC8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAgKi8KKyNkZWZpbmUgWk1BR0lDIDB4MTBCICAgICAgIC8qIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlLiAgICAgICAgICAgKi8KKworI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKKworI2lmIDAgLyogbGliYW91dC5oIG9ubHkgdXNlcyB0aGUgbG93ZXIgOCBiaXRzICovCisjZGVmaW5lIEhQOTh4Nl9JRCAweDIwQQorI2RlZmluZSBIUDkwMDBTMjAwX0lEIDB4MjBDCisjZW5kaWYKKyNkZWZpbmUgSFA5OHg2X0lEIDB4MEEKKyNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDBDCisKKyNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQorCisjZGVmaW5lIE5fREFUQUREUih4KSBcCisgICAgKChOX01BR0lDKHgpPT1PTUFHSUMgfHwgTl9NQUdJQyh4KT09SFBVWF9ET1RfT19NQUdJQykgPyBcCisgICAgICAgIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCisgICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQorCisjZGVmaW5lIF9OX0JBRE1BQ0goeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5MDAwUzIwMF9JRCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKKworI2RlZmluZSBfTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBIUFVYX0RPVF9PX01BR0lDIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCisJCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAorICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyApCisKKyN1bmRlZiBfTl9IRFJPRkYKKyNkZWZpbmUgX05fSERST0ZGKHgpIChTRUdNRU5UX1NJWkUgLSAoc2l6ZW9mIChzdHJ1Y3QgZXhlYykpKQorCisjdW5kZWYgTl9EQVRPRkYKKyN1bmRlZiBOX1BBU09GRgorI3VuZGVmIE5fU1lNT0ZGCisjdW5kZWYgTl9TVVBPRkYKKyN1bmRlZiBOX1RSRUxPRkYKKyN1bmRlZiBOX0RSRUxPRkYKKyN1bmRlZiBOX1NUUk9GRgorCisjZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkgKQorI2RlZmluZSBOX1BBU09GRih4KSAgICAgKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCisjZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9QQVNPRkYoeCkgICAvKiArICh4KS5hX3Bhc3NpemUqLyApCisjZGVmaW5lIE5fU1VQT0ZGKHgpICAgICAoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCisjZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fU1VQT0ZGKHgpICAgIC8qICsgMCAoeCkuYV9zdXBzaXplKi8gKQorI2RlZmluZSBOX0RSRUxPRkYoeCkJKCBOX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUgKQorI2RlZmluZSBOX0VYVEhPRkYoeCkgICAgKCBOX0RSRUxPRkYoeCkgICAvKiAgKyAwICh4KS5hX2Ryc2l6ZSAqLykKKyNkZWZpbmUgTl9TVFJPRkYoeCkJKCAwIC8qIG5vIHN0cmluZyB0YWJsZSAqLyApCisKKy8qIHVzZSB0aGVzZSB3aGVuIHRoZSBmaWxlIGhhcyBnbnUgc3ltYm9sIHRhYmxlcyAqLworI2RlZmluZSBOX0dOVV9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCisjZGVmaW5lIE5fR05VX0RSRUxPRkYoeCkgKE5fR05VX1RSRUxPRkYoeCkgKyAoeCkuYV90cnNpemUpCisjZGVmaW5lIE5fR05VX1NZTU9GRih4KSAgKE5fR05VX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUpCisKKyNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDEwMDAKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MTAwMAorI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAorCisjdW5kZWYgTl9TSEFSRURfTElCCisjZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAgKCAwIC8qIG5vIHNoYXJlZCBsaWJyYXJpZXMgKi8gKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hwcGEuaCBiL2luY2x1ZGUvYW91dC9ocHBhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxODVkZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYW91dC9ocHBhLmgKQEAgLTAsMCArMSw3IEBACisjaW5jbHVkZSAiZmlsZWhkci5oIgorI2luY2x1ZGUgImFvdXRoZHIuaCIKKyNpbmNsdWRlICJzY25oZHIuaCIKKyNpbmNsdWRlICJzcGFjZWhkci5oIgorI2luY2x1ZGUgInN5bXMuaCIKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvcmFubGliLmggYi9pbmNsdWRlL2FvdXQvcmFubGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyNjAwNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYW91dC9yYW5saWIuaApAQCAtMCwwICsxLDYyIEBACisvKiByYW5saWIuaCAtLSBhcmNoaXZlIGxpYnJhcnkgaW5kZXggbWVtYmVyIGRlZmluaXRpb24gZm9yIEdOVS4KKyAgIENvcHlyaWdodCAxOTkwLTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUgU3ltZGVmIG1lbWJlciBvZiBhbiBhcmNoaXZlIGNvbnRhaW5zIHR3byB0aGluZ3M6CisgICBhIHRhYmxlIHRoYXQgbWFwcyBzeW1ib2wtc3RyaW5nIG9mZnNldHMgdG8gZmlsZSBvZmZzZXRzLAorICAgYW5kIGEgc3ltYm9sLXN0cmluZyB0YWJsZS4gIEFsbCB0aGUgc3ltYm9sIG5hbWVzIGFyZQorICAgcnVuIHRvZ2V0aGVyIChlYWNoIHdpdGggdHJhaWxpbmcgbnVsbCkgaW4gdGhlIHN5bWJvbC1zdHJpbmcKKyAgIHRhYmxlLiAgVGhlcmUgaXMgYSBzaW5nbGUgbG9uZ3dvcmQgYnl0ZWNvdW50IG9uIHRoZSBmcm9udAorICAgb2YgZWFjaCBvZiB0aGVzZSB0YWJsZXMuICBUaHVzIGlmIHdlIGhhdmUgdHdvIHN5bWJvbHMsCisgICAiZm9vIiBhbmQgIl9iYXIiLCB0aGF0IGFyZSBpbiBhcmNoaXZlIG1lbWJlcnMgYXQgb2Zmc2V0cworICAgMjAwIGFuZCA5MDAsIGl0IHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorICAgICAgICAxNgkJOyBieXRlIGNvdW50IG9mIGluZGV4IHRhYmxlCisgIAkwCQk7IG9mZnNldCBvZiAiZm9vIiBpbiBzdHJpbmcgdGFibGUKKyAgCTIwMAkJOyBvZmZzZXQgb2YgZm9vLW1vZHVsZSBpbiBmaWxlCisgIAk0CQk7IG9mZnNldCBvZiAiYmFyIiBpbiBzdHJpbmcgdGFibGUKKyAgCTkwMAkJOyBvZmZzZXQgb2YgYmFyLW1vZHVsZSBpbiBmaWxlCisgIAk5CQk7IGJ5dGUgY291bnQgb2Ygc3RyaW5nIHRhYmxlCisgIAkiZm9vXDBfYmFyXDAiCTsgc3RyaW5nIHRhYmxlICAqLworCisjZGVmaW5lCVJBTkxJQk1BRwkiX18uU1lNREVGIgkvKiBBcmNoaXZlIGZpbGUgbmFtZSBjb250YWluaW5nIGluZGV4ICovCisjZGVmaW5lCVJBTkxJQlNLRVcJMwkJLyogQ3JlYXRpb24gdGltZSBvZmZzZXQgKi8KKworLyogRm9ybWF0IG9mIF9fLlNZTURFRjoKKyAgIEZpcnN0LCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlICdzeW1kZWYnIGRhdGEgdGhhdCBmb2xsb3dzLgorICAgU2Vjb25kLCB6ZXJvIG9yIG1vcmUgJ3N5bWRlZicgc3RydWN0dXJlcy4KKyAgIFRoaXJkLCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSBzdHJpbmdzLgorICAgRm91cnRoLCB6ZXJvIG9yIG1vcmUgc3ltYm9sIG5hbWUgc3RyaW5ncyAoZWFjaCBmb2xsb3dlZCBieSBhIG51bGwpLiAgKi8KKworc3RydWN0IHN5bWRlZgorICB7CisgICAgdW5pb24KKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIHN0cmluZ19vZmZzZXQ7CS8qIEluIHRoZSBmaWxlICovCisJY2hhciAqbmFtZTsJCQkvKiBJbiBtZW1vcnksIHNvbWV0aW1lcyAqLworICAgICAgfSBzOworICAgIC8qIHRoaXMgcG9pbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBoZWFkZXIgKEFLQSBtZW1iZXIgaGVhZGVyIC0tCisgICAgICAgYSBzdHJ1Y3QgYXJfaGRyKSwgbm90IHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBvciBpbnRvIHRoZSBmaWxlKS4KKyAgICAgICBpbiBvdGhlciB3b3JkcyBpdCBvbmx5IHRlbGxzIHlvdSB3aGljaCBmaWxlIHRvIHJlYWQgKi8gICAgICAgCisgICAgdW5zaWduZWQgbG9uZyBmaWxlX29mZnNldDsKKyAgfTsKKworLyogQ29tcGF0YWJpbGl0eSB3aXRoIEJTRCBjb2RlICovCisKKyNkZWZpbmUJcmFubGliCXN5bWRlZgorI2RlZmluZQlyYW5fdW4JcworI2RlZmluZQlyYW5fc3RyeCBzdHJpbmdfb2Zmc2V0CisjZGVmaW5lCXJhbl9uYW1lIG5hbWUKKyNkZWZpbmUJcmFuX29mZglmaWxlX29mZnNldApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JlbG9jLmggYi9pbmNsdWRlL2FvdXQvcmVsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNjNTUyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hb3V0L3JlbG9jLmgKQEAgLTAsMCArMSw2NiBAQAorLyogcmVsb2MuaCAtLSBIZWFkZXIgZmlsZSBmb3IgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgIENvcHlyaWdodCAxOTg5LTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBSZWxvY2F0aW9uIHR5cGVzIGZvciBhLm91dCBmaWxlcyB1c2luZyByZWxvY19pbmZvX2V4dGVuZGVkCisgICAoU1BBUkMgYW5kIEFNRCAyOTAwMCkuICovCisKKyNpZm5kZWYgX1JFTE9DX0hfUkVBRF8KKyNkZWZpbmUgX1JFTE9DX0hfUkVBRF8gMQorCitlbnVtIHJlbG9jX3R5cGUKKyAgeworICAgIFJFTE9DXzgsICAgICAgICBSRUxPQ18xNiwgICAgICAgIFJFTE9DXzMyLCAvKiBzaW1wbGUgcmVsb2NhdGlvbnMgKi8KKyAgICBSRUxPQ19ESVNQOCwgICAgUkVMT0NfRElTUDE2LCAgICBSRUxPQ19ESVNQMzIsIC8qIHBjLXJlbCBkaXNwbGFjZW1lbnQgKi8KKyAgICBSRUxPQ19XRElTUDMwLCAgUkVMT0NfV0RJU1AyMiwKKyAgICBSRUxPQ19ISTIyLCAgICAgUkVMT0NfMjIsCisgICAgUkVMT0NfMTMsICAgICAgIFJFTE9DX0xPMTAsCisgICAgUkVMT0NfU0ZBX0JBU0UsIFJFTE9DX1NGQV9PRkYxMywKKyAgICBSRUxPQ19CQVNFMTAsICAgUkVMT0NfQkFTRTEzLCAgICBSRUxPQ19CQVNFMjIsIC8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KKyAgICBSRUxPQ19QQzEwLCAgICAgUkVMT0NfUEMyMiwJLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLworICAgIFJFTE9DX0pNUF9UQkwsCQkvKiBQLkkuQy4ganVtcCB0YWJsZSAqLworICAgIFJFTE9DX1NFR09GRjE2LAkJLyogcmVwdXRlZGx5IGZvciBzaGFyZWQgbGlicmFyaWVzIHNvbWVob3cgKi8KKyAgICBSRUxPQ19HTE9CX0RBVCwgIFJFTE9DX0pNUF9TTE9ULCBSRUxPQ19SRUxBVElWRSwKKyAgICBSRUxPQ18xMSwKKyAgICBSRUxPQ19XRElTUDJfMTQsCisgICAgUkVMT0NfV0RJU1AxOSwKKyAgICBSRUxPQ19ISEkyMiwKKyAgICBSRUxPQ19ITE8xMCwKKyAgICAKKyAgICAvKiAyOUsgcmVsb2NhdGlvbiB0eXBlcyAqLworICAgIFJFTE9DX0pVTVBUQVJHLCBSRUxPQ19DT05TVCwgICAgIFJFTE9DX0NPTlNUSCwKKyAgICAKKyAgICBSRUxPQ19XRElTUDE0LCBSRUxPQ19XRElTUDIxLAorICAgIAorICAgIE5PX1JFTE9DCisgICAgfTsKKworI2RlZmluZQlSRUxPQ19UWVBFX05BTUVTIFwKKyI4IiwJCSIxNiIsCQkiMzIiLAkJIkRJU1A4IiwJXAorIkRJU1AxNiIsCSJESVNQMzIiLAkiV0RJU1AzMCIsCSJXRElTUDIyIiwJXAorIkhJMjIiLAkJIjIyIiwJCSIxMyIsCQkiTE8xMCIsCQlcCisiU0ZBX0JBU0UiLAkiU0ZBT0ZGMTMiLAkiQkFTRTEwIiwJIkJBU0UxMyIsCVwKKyJCQVNFMjIiLAkiUEMxMCIsCQkiUEMyMiIsCQkiSk1QX1RCTCIsCVwKKyJTRUdPRkYxNiIsCSJHTE9CX0RBVCIsCSJKTVBfU0xPVCIsCSJSRUxBVElWRSIsCVwKKyIxMSIsCQkiV0RJU1AyXzE0IiwJIldESVNQMTkiLCAJIkhISTIyIiwJXAorIkhMTzEwIiwJCQkJCQkJXAorIkpVTVBUQVJHIiwJIkNPTlNUIiwJIkNPTlNUSCIsCSJXRElTUDE0IiwJXAorIldESVNQMjEiLAlcCisiTk9fUkVMT0MiCisKKyNlbmRpZiAvKiBfUkVMT0NfSF9SRUFEXyAqLworCisvKiBlbmQgb2YgcmVsb2MuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3N0YWIuZGVmIGIvaW5jbHVkZS9hb3V0L3N0YWIuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmQyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvc3RhYi5kZWYKQEAgLTAsMCArMSwyNjggQEAKKy8qIFRhYmxlIG9mIERCWCBzeW1ib2wgY29kZXMgZm9yIHRoZSBHTlUgc3lzdGVtLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwwKKy8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgVGhpcyB1c2VzIGFuIG5fdHlwZSBvZiAwLCB3aGljaCBpbiBhLm91dCBmaWxlcworICAgb3ZlcmxhcHMgdGhlIE5fVU5ERiB1c2VkIGZvciBvcmRpbmFyeSBzeW1ib2xzLiAgSW4gRUxGIGZpbGVzLCB0aGUKKyAgIGRlYnVnIGluZm9ybWF0aW9uIGlzIGluIGEgZGlmZmVyZW50IGZpbGUgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gY29uZmxpY3QuCisgICBUaGlzIHN5bWJvbCdzIG5fdmFsdWUgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBzZWN0aW9uIGFzc29jaWF0ZWQKKyAgIHdpdGggdGhpcyBmaWxlLiAgVGhlIHN5bWJvbCdzIG5fc3RyeCAocmVsYXRpdmUgdG8gdGhlIGp1c3QtdXBkYXRlZAorICAgc3RyaW5nIHNlY3Rpb24gc3RhcnQgYWRkcmVzcykgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLAorICAgZS5nLiAiZm9vLmMiLCB3aXRob3V0IGFueSBwYXRoIGluZm9ybWF0aW9uLiAgVGhlIHN5bWJvbCdzIG5fZGVzYyBnaXZlcworICAgdGhlIGNvdW50IG9mIHVwY29taW5nIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSAobm90IGluY2x1ZGluZworICAgdGhpcyBvbmUpLiAgKi8KKy8qIF9fZGVmaW5lX3N0YWIgKE5fVU5ERiwgMHgwMCwgIlVOREYiKSAgKi8KKworLyogR2xvYmFsIHZhcmlhYmxlLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fR1NZTSwgMHgyMCwgIkdTWU0iKQorCisvKiBGdW5jdGlvbiBuYW1lIGZvciBCU0QgRm9ydHJhbi4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCisgICBUbyBmaW5kIHRoZSBhZGRyZXNzLCBsb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gICovCitfX2RlZmluZV9zdGFiIChOX0ZOQU1FLCAweDIyLCAiRk5BTUUiKQorCisvKiBGdW5jdGlvbiBuYW1lIG9yIHRleHQtc2VnbWVudCB2YXJpYWJsZSBmb3IgQy4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLgorICAgRGVzYyBpcyBzdXBwb3NlZGx5IHN0YXJ0aW5nIGxpbmUgbnVtYmVyLCBidXQgR0NDIGRvZXNuJ3Qgc2V0IGl0CisgICBhbmQgREJYIHNlZW1zIG5vdCB0byBtaXNzIGl0LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRlVOLCAweDI0LCAiRlVOIikKKworLyogRGF0YS1zZWdtZW50IHZhcmlhYmxlIHdpdGggaW50ZXJuYWwgbGlua2FnZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLgorICAgIlN0YXRpYyBTeW0iLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU1RTWU0sIDB4MjYsICJTVFNZTSIpCisKKy8qIEJTUy1zZWdtZW50IHZhcmlhYmxlIHdpdGggaW50ZXJuYWwgbGlua2FnZS4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTENTWU0sIDB4MjgsICJMQ1NZTSIpCisKKy8qIE5hbWUgb2YgbWFpbiByb3V0aW5lLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4gICovCitfX2RlZmluZV9zdGFiIChOX01BSU4sIDB4MmEsICJNQUlOIikKKworLyogU29sYXJpczI6ICBSZWFkLW9ubHkgZGF0YSBzeW1ib2xzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUk9TWU0sIDB4MmMsICJST1NZTSIpCisKKy8qIEdsb2JhbCBzeW1ib2wgaW4gUGFzY2FsLgorICAgU3VwcG9zZWRseSB0aGUgdmFsdWUgaXMgaXRzIGxpbmUgbnVtYmVyOyBJJ20gc2tlcHRpY2FsLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUEMsIDB4MzAsICJQQyIpCisKKy8qIE51bWJlciBvZiBzeW1ib2xzOiAgMCwgZmlsZXMsLGZ1bmNzLGxpbmVzIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTlNZTVMsIDB4MzIsICJOU1lNUyIpCisKKy8qICJObyBEU1QgbWFwIGZvciBzeW06IG5hbWUsICwwLHR5cGUsaWdub3JlZCIgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTk9NQVAsIDB4MzQsICJOT01BUCIpCisKKy8qIE5ldyBzdGFiIGZyb20gU29sYXJpcyAyLiAgTGlrZSBOX1NPLCBidXQgZm9yIHRoZSBvYmplY3QgZmlsZS4gIFR3byBpbgorICAgYSByb3cgcHJvdmlkZSB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgLm8gZnJvbSBpdC4KKyAgIFNvbGFyaXMyIHVzZXMgdGhpcyB0byBhdm9pZCBwdXR0aW5nIHRoZSBzdGFicyBpbmZvIGludG8gdGhlIGxpbmtlZAorICAgZXhlY3V0YWJsZTsgdGhpcyBzdGFiIGdvZXMgaW50byB0aGUgIi5zdGFiLmluZGV4IiBzZWN0aW9uLCBhbmQgdGhlIGRlYnVnZ2VyCisgICByZWFkcyB0aGUgcmVhbCBzdGFicyBkaXJlY3RseSBmcm9tIHRoZSAubyBmaWxlcyBpbnN0ZWFkLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fT0JKLCAweDM4LCAiT0JKIikKKworLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBPcHRpb25zIGZvciB0aGUgZGVidWdnZXIsIHJlbGF0ZWQgdG8gdGhlCisgICBzb3VyY2UgbGFuZ3VhZ2UgZm9yIHRoaXMgbW9kdWxlLiAgRS5nLiB3aGV0aGVyIHRvIHVzZSBBTlNJCisgICBpbnRlZ3JhbCBwcm9tb3Rpb25zIG9yIHRyYWRpdGlvbmFsIGludGVncmFsIHByb21vdGlvbnMuICAqLworX19kZWZpbmVfc3RhYiAoTl9PUFQsIDB4M2MsICJPUFQiKQorCisvKiBSZWdpc3RlciB2YXJpYWJsZS4gIFZhbHVlIGlzIG51bWJlciBvZiByZWdpc3Rlci4gICovCitfX2RlZmluZV9zdGFiIChOX1JTWU0sIDB4NDAsICJSU1lNIikKKworLyogTW9kdWxhLTIgY29tcGlsYXRpb24gdW5pdC4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLworX19kZWZpbmVfc3RhYiAoTl9NMkMsIDB4NDIsICJNMkMiKQorCisvKiBMaW5lIG51bWJlciBpbiB0ZXh0IHNlZ21lbnQuICBEZXNjIGlzIHRoZSBsaW5lIG51bWJlcjsKKyAgIHZhbHVlIGlzIGNvcnJlc3BvbmRpbmcgYWRkcmVzcy4gIE9uIFNvbGFyaXMyLCB0aGUgbGluZSBudW1iZXIgaXMKKyAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX1NMSU5FLCAweDQ0LCAiU0xJTkUiKQorCisvKiBTaW1pbGFyLCBmb3IgZGF0YSBzZWdtZW50LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRFNMSU5FLCAweDQ2LCAiRFNMSU5FIikKKworLyogU2ltaWxhciwgZm9yIGJzcyBzZWdtZW50LiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQlNMSU5FLCAweDQ4LCAiQlNMSU5FIikKKworLyogU3VuJ3Mgc291cmNlLWNvZGUgYnJvd3NlciBzdGFicy4gID8/IERvbid0IGtub3cgd2hhdCB0aGUgZmllbGRzIGFyZS4KKyAgIFN1cHBvc2VkbHkgdGhlIGZpZWxkIGlzICJwYXRoIHRvIGFzc29jaWF0ZWQgLmNiIGZpbGUiLiAgVEhJUyBWQUxVRQorICAgT1ZFUkxBUFMgV0lUSCBOX0JTTElORSEgICovCitfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSAoTl9CUk9XUywgMHg0OCwgIkJST1dTIikKKworLyogR05VIE1vZHVsYS0yIGRlZmluaXRpb24gbW9kdWxlIGRlcGVuZGVuY3kuICBWYWx1ZSBpcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKKyAgIG9mIHRoZSBkZWZpbml0aW9uIGZpbGUuICBPdGhlciBpcyBub24temVybyBpZiBpdCBpcyBpbXBvcnRlZCB3aXRoIHRoZQorICAgR05VIE0yIGtleXdvcmQgJUlOSVRJQUxJWkUuICBQZXJoYXBzIE5fTTJDIGNhbiBiZSB1c2VkIGlmIHRoZXJlCisgICBhcmUgZW5vdWdoIGVtcHR5IGZpZWxkcz8gKi8KK19fZGVmaW5lX3N0YWIoTl9ERUZELCAweDRhLCAiREVGRCIpCisKKy8qIE5ldyBpbiBTb2xhcmlzMi4gIEZ1bmN0aW9uIHN0YXJ0L2JvZHkvZW5kIGxpbmUgbnVtYmVycy4gICovCitfX2RlZmluZV9zdGFiKE5fRkxJTkUsIDB4NEMsICJGTElORSIpCisKKy8qIFRIRSBGT0xMT1dJTkcgVFdPIFNUQUIgVkFMVUVTIENPTkZMSUNULiAgSGFwcGlseSwgb25lIGlzIGZvciBNb2R1bGEtMgorICAgYW5kIG9uZSBpcyBmb3IgQysrLiAgIFN0aWxsLC4uLiAqLworLyogR05VIEMrKyBleGNlcHRpb24gdmFyaWFibGUuICBOYW1lIGlzIHZhcmlhYmxlIG5hbWUuICAqLworX19kZWZpbmVfc3RhYiAoTl9FSERFQ0wsIDB4NTAsICJFSERFQ0wiKQorLyogTW9kdWxhMiBpbmZvICJmb3IgaW1jIjogIG5hbWUsLDAsMCwwICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICAqLworX19kZWZpbmVfc3RhYl9kdXBsaWNhdGUgKE5fTU9EMiwgMHg1MCwgIk1PRDIiKQorCisvKiBHTlUgQysrIGBjYXRjaCcgY2xhdXNlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICBEZXNjIGlzIG5vbnplcm8gaWYKKyAgIHRoaXMgZW50cnkgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBDQVVHSFQgc3RhYiBzYXlpbmcgd2hhdCBleGNlcHRpb24KKyAgIHdhcyBjYXVnaHQuICBNdWx0aXBsZSBDQVVHSFQgc3RhYnMgbWVhbnMgdGhhdCBtdWx0aXBsZSBleGNlcHRpb25zCisgICBjYW4gYmUgY2F1Z2h0IGhlcmUuICBJZiBEZXNjIGlzIDAsIGl0IG1lYW5zIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQKKyAgIGhlcmUuICAqLworX19kZWZpbmVfc3RhYiAoTl9DQVRDSCwgMHg1NCwgIkNBVENIIikKKworLyogU3RydWN0dXJlIG9yIHVuaW9uIGVsZW1lbnQuICBWYWx1ZSBpcyBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZS4gICovCitfX2RlZmluZV9zdGFiIChOX1NTWU0sIDB4NjAsICJTU1lNIikKKworLyogU29sYXJpczI6ICBMYXN0IHN0YWIgZW1pdHRlZCBmb3IgbW9kdWxlLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRU5ETSwgMHg2MiwgIkVORE0iKQorCisvKiBOYW1lIG9mIG1haW4gc291cmNlIGZpbGUuCisgICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLgorICAgSWYgbXVsdGlwbGUgTl9TTydzIGFwcGVhciwgdGhlIGZpcnN0IHRvIGNvbnRhaW4gYSB0cmFpbGluZyAvIGlzIHRoZQorICAgY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgVGhlIGZpcnN0IHRvIG5vdCBjb250YWluIGEgdHJhaWxpbmcgLyBpcyB0aGUKKyAgIHNvdXJjZSBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBPdGhlcnMgKHBlcmhhcHMKKyAgIHJlc3VsdGluZyBmcm9tIGNmcm9udCkgYXJlIGlnbm9yZWQuCisgICBPbiBTb2xhcmlzMiwgdmFsdWUgaXMgdW5kZWZpbmVkLCBidXQgZGVzYyBpcyBhIHNvdXJjZS1sYW5ndWFnZSBjb2RlLiAgKi8KKworX19kZWZpbmVfc3RhYiAoTl9TTywgMHg2NCwgIlNPIikKKworLyogU3VuUHJvIEY3NzogIE5hbWUgb2YgYWxpYXMuICAqLworX19kZWZpbmVfc3RhYiAoTl9BTElBUywgMHg2YywgIkFMSUFTIikKKworLyogQXV0b21hdGljIHZhcmlhYmxlIGluIHRoZSBzdGFjay4gIFZhbHVlIGlzIG9mZnNldCBmcm9tIGZyYW1lIHBvaW50ZXIuCisgICBBbHNvIHVzZWQgZm9yIHR5cGUgZGVzY3JpcHRpb25zLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTFNZTSwgMHg4MCwgIkxTWU0iKQorCisvKiBCZWdpbm5pbmcgb2YgYW4gaW5jbHVkZSBmaWxlLiAgT25seSBTdW4gdXNlcyB0aGlzLgorICAgSW4gYW4gb2JqZWN0IGZpbGUsIG9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuCisgICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBvdGhlciBmaWVsZHMuICAqLworX19kZWZpbmVfc3RhYiAoTl9CSU5DTCwgMHg4MiwgIkJJTkNMIikKKworLyogTmFtZSBvZiBzdWItc291cmNlIGZpbGUgKCNpbmNsdWRlIGZpbGUpLgorICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX1NPTCwgMHg4NCwgIlNPTCIpCisKKy8qIFBhcmFtZXRlciB2YXJpYWJsZS4gIFZhbHVlIGlzIG9mZnNldCBmcm9tIGFyZ3VtZW50IHBvaW50ZXIuCisgICAoT24gbW9zdCBtYWNoaW5lcyB0aGUgYXJndW1lbnQgcG9pbnRlciBpcyB0aGUgc2FtZSBhcyB0aGUgZnJhbWUgcG9pbnRlci4gICovCitfX2RlZmluZV9zdGFiIChOX1BTWU0sIDB4YTAsICJQU1lNIikKKworLyogRW5kIG9mIGFuIGluY2x1ZGUgZmlsZS4gIE5vIG5hbWUuCisgICBUaGlzIGFuZCBOX0JJTkNMIGFjdCBhcyBicmFja2V0cyBhcm91bmQgdGhlIGZpbGUncyBvdXRwdXQuCisgICBJbiBhbiBvYmplY3QgZmlsZSwgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGF0YSBpbiB0aGlzIGVudHJ5LgorICAgVGhlIFN1biBsaW5rZXIgcHV0cyBkYXRhIGludG8gc29tZSBvZiB0aGUgZmllbGRzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUlOQ0wsIDB4YTIsICJFSU5DTCIpCisKKy8qIEFsdGVybmF0ZSBlbnRyeSBwb2ludC4gIFZhbHVlIGlzIGl0cyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRU5UUlksIDB4YTQsICJFTlRSWSIpCisKKy8qIEJlZ2lubmluZyBvZiBsZXhpY2FsIGJsb2NrLgorICAgVGhlIGRlc2MgaXMgdGhlIG5lc3RpbmcgbGV2ZWwgaW4gbGV4aWNhbCBibG9ja3MuCisgICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suCisgICBUaGUgdmFyaWFibGVzIGRlY2xhcmVkIGluc2lkZSB0aGUgYmxvY2sgKnByZWNlZGUqIHRoZSBOX0xCUkFDIHN5bWJvbC4KKyAgIE9uIFNvbGFyaXMyLCB0aGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTEJSQUMsIDB4YzAsICJMQlJBQyIpCisKKy8qIFBsYWNlIGhvbGRlciBmb3IgZGVsZXRlZCBpbmNsdWRlIGZpbGUuICBSZXBsYWNlcyBhIE5fQklOQ0wgYW5kIGV2ZXJ5dGhpbmcKKyAgIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5fRUlOQ0wuICBUaGUgU3VuIGxpbmtlciBnZW5lcmF0ZXMgdGhlc2Ugd2hlbgorICAgaXQgZmluZHMgbXVsdGlwbGUgaWRlbnRpY2FsIGNvcGllcyBvZiB0aGUgc3ltYm9scyBmcm9tIGFuIGluY2x1ZGUgZmlsZS4KKyAgIFRoaXMgYXBwZWFycyBvbmx5IGluIG91dHB1dCBmcm9tIHRoZSBTdW4gbGlua2VyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRVhDTCwgMHhjMiwgIkVYQ0wiKQorCisvKiBNb2R1bGEtMiBzY29wZSBpbmZvcm1hdGlvbi4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLworX19kZWZpbmVfc3RhYiAoTl9TQ09QRSwgMHhjNCwgIlNDT1BFIikKKworLyogRW5kIG9mIGEgbGV4aWNhbCBibG9jay4gIERlc2MgbWF0Y2hlcyB0aGUgTl9MQlJBQydzIGRlc2MuCisgICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLgorICAgT24gU29sYXJpczIsIHRoZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLworX19kZWZpbmVfc3RhYiAoTl9SQlJBQywgMHhlMCwgIlJCUkFDIikKKworLyogQmVnaW4gbmFtZWQgY29tbW9uIGJsb2NrLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4gICovCitfX2RlZmluZV9zdGFiIChOX0JDT01NLCAweGUyLCAiQkNPTU0iKQorCisvKiBFbmQgbmFtZWQgY29tbW9uIGJsb2NrLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudAorICAgKGFuZCBpdCBzaG91bGQgbWF0Y2ggdGhlIE5fQkNPTU0pLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUNPTU0sIDB4ZTQsICJFQ09NTSIpCisKKy8qIE1lbWJlciBvZiBhIGNvbW1vbiBibG9jazsgdmFsdWUgaXMgb2Zmc2V0IHdpdGhpbiB0aGUgY29tbW9uIGJsb2NrLgorICAgVGhpcyBzaG91bGQgb2NjdXIgd2l0aGluIGEgQkNPTU0vRUNPTU0gcGFpci4gICovCitfX2RlZmluZV9zdGFiIChOX0VDT01MLCAweGU4LCAiRUNPTUwiKQorCisvKiBTb2xhcmlzMjogUGFzY2FsICJ3aXRoIiBzdGF0ZW1lbnQ6IHR5cGUsLDAsMCxvZmZzZXQgKi8KK19fZGVmaW5lX3N0YWIgKE5fV0lUSCwgMHhlYSwgIldJVEgiKQorCisvKiBUaGVzZSBTVEFCJ3MgYXJlIHVzZWQgb24gR291bGQgc3lzdGVtcyBmb3IgTm9uLUJhc2UgcmVnaXN0ZXIgc3ltYm9scworICAgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gIEZJWE1FLiAgSSBoYXZlIGFzc2lnbmVkIHRoZSB2YWx1ZXMgYXQgcmFuZG9tCisgICBzaW5jZSBJIGRvbid0IGhhdmUgYSBHb3VsZCBoZXJlLiAgRml4dXBzIGZyb20gR291bGQgZm9sayB3ZWxjb21lLi4uICovCitfX2RlZmluZV9zdGFiIChOX05CVEVYVCwgMHhGMCwgIk5CVEVYVCIpCitfX2RlZmluZV9zdGFiIChOX05CREFUQSwgMHhGMiwgIk5CREFUQSIpCitfX2RlZmluZV9zdGFiIChOX05CQlNTLCAgMHhGNCwgIk5CQlNTIikKK19fZGVmaW5lX3N0YWIgKE5fTkJTVFMsICAweEY2LCAiTkJTVFMiKQorX19kZWZpbmVfc3RhYiAoTl9OQkxDUywgIDB4RjgsICJOQkxDUyIpCisKKy8qIFNlY29uZCBzeW1ib2wgZW50cnkgY29udGFpbmluZyBhIGxlbmd0aC12YWx1ZSBmb3IgdGhlIHByZWNlZGluZyBlbnRyeS4KKyAgIFRoZSB2YWx1ZSBpcyB0aGUgbGVuZ3RoLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTEVORywgMHhmZSwgIkxFTkciKQorDAorLyogVGhlIGFib3ZlIGluZm9ybWF0aW9uLCBpbiBtYXRyaXggZm9ybWF0LgorCisJCQlTVEFCIE1BVFJJWAorCV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKwl8IDAwIC0gMUYgYXJlIG5vdCBkYnggc3RhYiBzeW1ib2xzCQl8CisJfCBJbiBtb3N0IGNhc2VzLCB0aGUgbG93IGJpdCBpcyB0aGUgRVhUZXJuYWwgYml0fAorCisJfCAwMCBVTkRFRiAgfCAwMiBBQlMJfCAwNCBURVhUICAgfCAwNiBEQVRBCXwKKwl8IDAxICB8RVhUICB8IDAzICB8RVhUCXwgMDUgIHxFWFQgIHwgMDcgIHxFWFQJfAorCisJfCAwOCBCU1MgICAgfCAwQSBJTkRSCXwgMEMgRk5fU0VRIHwgMEUgV0VBS0EJfAorCXwgMDkgIHxFWFQgIHwgMEIgCXwgMEQgV0VBS1UgIHwgMEYgV0VBS1QJfAorCisJfCAxMCBXRUFLRCAgfCAxMiBDT01NCXwgMTQgU0VUQSAgIHwgMTYgU0VUVAl8CisJfCAxMSBXRUFLQiAgfCAxMwl8IDE1IAkgICAgfCAxNwl8CisKKwl8IDE4IFNFVEQgICB8IDFBIFNFVEIJfCAxQyBTRVRWICAgfCAxRSBXQVJOSU5HfAorCXwgMTkJICAgIHwgMUIJfCAxRCAJICAgIHwgMUYgRk4JfAorCisJfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCXwgRGVidWcgZW50cmllcyB3aXRoIGJpdCAwMSBzZXQgYXJlIHVudXNlZC4JfAorCXwgMjAgR1NZTSAgIHwgMjIgRk5BTUUJfCAyNCBGVU4gICAgfCAyNiBTVFNZTQl8CisJfCAyOCBMQ1NZTSAgfCAyQSBNQUlOCXwgMkMgUk9TWU0gIHwgMkUJfAorCXwgMzAgUEMJICAgIHwgMzIgTlNZTVMJfCAzNCBOT01BUCAgfCAzNgl8CisJfCAzOCBPQkogICAgfCAzQQl8IDNDIE9QVCAgICB8IDNFCXwKKwl8IDQwIFJTWU0gICB8IDQyIE0yQwl8IDQ0IFNMSU5FICB8IDQ2IERTTElORSB8CisJfCA0OCBCU0xJTkUqfCA0QSBERUZECXwgNEMgRkxJTkUgIHwgNEUJfAorCXwgNTAgRUhERUNMKnwgNTIJfCA1NCBDQVRDSCAgfCA1NiAgICAgICAgfAorCXwgNTggICAgICAgIHwgNUEgICAgICAgIHwgNUMgICAgICAgIHwgNUUJfAorCXwgNjAgU1NZTSAgIHwgNjIgRU5ETQl8IDY0IFNPCSAgICB8IDY2IAl8CisJfCA2OCAJICAgIHwgNkEJfCA2QyBBTElBUyAgfCA2RQl8CisJfCA3MAkgICAgfCA3Mgl8IDc0CSAgICB8IDc2CXwKKwl8IDc4CSAgICB8IDdBCXwgN0MJICAgIHwgN0UJfAorCXwgODAgTFNZTSAgIHwgODIgQklOQ0wJfCA4NCBTT0wgICAgfCA4Ngl8CisJfCA4OAkgICAgfCA4QQl8IDhDCSAgICB8IDhFCXwKKwl8IDkwCSAgICB8IDkyCXwgOTQJICAgIHwgOTYJfAorCXwgOTgJICAgIHwgOUEJfCA5QwkgICAgfCA5RQl8CisJfCBBMCBQU1lNICAgfCBBMiBFSU5DTAl8IEE0IEVOVFJZICB8IEE2CXwKKwl8IEE4CSAgICB8IEFBCXwgQUMJICAgIHwgQUUJfAorCXwgQjAJICAgIHwgQjIJfCBCNAkgICAgfCBCNgl8CisJfCBCOAkgICAgfCBCQQl8IEJDCSAgICB8IEJFCXwKKwl8IEMwIExCUkFDICB8IEMyIEVYQ0wJfCBDNCBTQ09QRSAgfCBDNgl8CisJfCBDOAkgICAgfCBDQQl8IENDCSAgICB8IENFCXwKKwl8IEQwCSAgICB8IEQyCXwgRDQJICAgIHwgRDYJfAorCXwgRDgJICAgIHwgREEJfCBEQwkgICAgfCBERQl8CisJfCBFMCBSQlJBQyAgfCBFMiBCQ09NTQl8IEU0IEVDT01NICB8IEU2CXwKKwl8IEU4IEVDT01MICB8IEVBIFdJVEgJfCBFQwkgICAgfCBFRQl8CisJfCBGMAkgICAgfCBGMgl8IEY0CSAgICB8IEY2CXwKKwl8IEY4CSAgICB8IEZBCXwgRkMJICAgIHwgRkUgTEVORwl8CisJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogNTAgRUhERUNMIGlzIGFsc28gTU9EMi4KKyAqIDQ4IEJTTElORSBpcyBhbHNvIEJST1dTLgorICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaCBiL2luY2x1ZGUvYW91dC9zdGFiX2dudS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMThlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvc3RhYl9nbnUuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9fR05VX1NUQUJfXworCisvKiBJbmRpY2F0ZSB0aGUgR05VIHN0YWIuaCBpcyBpbiB1c2UuICAqLworCisjZGVmaW5lIF9fR05VX1NUQUJfXworCisjZGVmaW5lIF9fZGVmaW5lX3N0YWIoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCisjZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykgTkFNRT1DT0RFLAorCitlbnVtIF9fc3RhYl9kZWJ1Z19jb2RlCit7CisjaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKK0xBU1RfVU5VU0VEX1NUQUJfQ09ERQorfTsKKworI3VuZGVmIF9fZGVmaW5lX3N0YWIKKworLyogRGVmaW5pdGlvbnMgb2YgImRlc2MiIGZpZWxkIGZvciBOX1NPIHN0YWJzIGluIFNvbGFyaXMyLiAgKi8KKworI2RlZmluZQlOX1NPX0FTCQkxCisjZGVmaW5lCU5fU09fQwkJMgorI2RlZmluZQlOX1NPX0FOU0lfQwkzCisjZGVmaW5lCU5fU09fQ0MJCTQJLyogQysrICovCisjZGVmaW5lCU5fU09fRk9SVFJBTgk1CisjZGVmaW5lCU5fU09fUEFTQ0FMCTYKKworLyogU29sYXJpczI6IEZsb2F0aW5nIHBvaW50IHR5cGUgdmFsdWVzIGluIGJhc2ljIHR5cGVzLiAgKi8KKworI2RlZmluZQlORl9OT05FCQkwCisjZGVmaW5lCU5GX1NJTkdMRQkxCS8qIElFRUUgMzItYml0ICovCisjZGVmaW5lCU5GX0RPVUJMRQkyCS8qIElFRUUgNjQtYml0ICovCisjZGVmaW5lCU5GX0NPTVBMRVgJMwkvKiBGb3J0cmFuIGNvbXBsZXggKi8KKyNkZWZpbmUJTkZfQ09NUExFWDE2CTQJLyogRm9ydHJhbiBkb3VibGUgY29tcGxleCAqLworI2RlZmluZQlORl9DT01QTEVYMzIJNQkvKiBGb3J0cmFuIGNvbXBsZXgqMTYgKi8KKyNkZWZpbmUJTkZfTERPVUJMRQk2CS8qIExvbmcgZG91YmxlICh3aGF0ZXZlciB0aGF0IGlzKSAqLworCisjZW5kaWYgLyogX19HTlVfU1RBQl8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdW40LmggYi9pbmNsdWRlL2FvdXQvc3VuNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmEwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FvdXQvc3VuNC5oCkBAIC0wLDAgKzEsMjE5IEBACisvKiBTUEFSQy1zcGVjaWZpYyB2YWx1ZXMgZm9yIGEub3V0IGZpbGVzICovCisKKy8qIFNvbWUgc3lzdGVtcywgZS5nLiwgQUlYLCBtYXkgaGF2ZSBkZWZpbmVkIHRoaXMgaW4gaGVhZGVyIGZpbGVzIGFscmVhZHkKKyAgIGluY2x1ZGVkLiAgKi8KKyN1bmRlZiBUQVJHRVRfUEFHRV9TSVpFCisjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCQkvKiA4Sy4gIGFrYSBOQlBHIGluIDxzeXMvcGFyYW0uaD4gKi8KKy8qIE5vdGUgdGhhdCBzb21lIFNQQVJDcyBoYXZlIDRLIHBhZ2VzLCBzb21lIDhLLCBzb21lIG90aGVycy4gICovCisKKyNkZWZpbmUgU0VHX1NJWkVfU1BBUkMJVEFSR0VUX1BBR0VfU0laRQorI2RlZmluZQlTRUdfU0laRV9TVU4zCTB4MjAwMDAJCS8qIFJlc29sdXRpb24gb2Ygci93IHByb3RlY3Rpb24gaHcgKi8KKworI2RlZmluZSBURVhUX1NUQVJUX0FERFIJVEFSR0VUX1BBR0VfU0laRQkvKiBMb2NhdGlvbiAwIGlzIG5vdCBhY2Nlc3NpYmxlICovCisjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQorCisvKiBOb24tZGVmYXVsdCBkZWZpbml0aW9ucyBvZiB0aGUgYWNjZXNzb3IgbWFjcm9zLi4uICovCisKKy8qIFNlZ21lbnQgc2l6ZSB2YXJpZXMgb24gU3VuLTMgdmVyc3VzIFN1bi00LiAgKi8KKworI2RlZmluZSBOX1NFR1NJWkUoeCkJKE5fTUFDSFRZUEUoeCkgPT0gTV9TUEFSQz8JU0VHX1NJWkVfU1BBUkM6CVwKKwkJCSBOX01BQ0hUWVBFKHgpID09IE1fNjgwMjA/CVNFR19TSVpFX1NVTjM6CVwKKwkJCS8qIEd1ZXNzPyAqLwkJCVRBUkdFVF9QQUdFX1NJWkUpCisKKy8qIFZpcnR1YWwgQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgZnJvbSB0aGUgYS5vdXQgZmlsZS4gIEZvciBPTUFHSUMsCisgICAoYWxtb3N0IGFsd2F5cyAidW5saW5rZWQgLm8ncyIgdGhlc2UgZGF5cyksIHNob3VsZCBiZSB6ZXJvLgorICAgU3VuIGFkZGVkIGEga2x1ZGdlIHNvIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBsaW5rZWQgWk1BR0lDIGdldAorICAgYW4gYWRkcmVzcyBvZiB6ZXJvIGlmIGFfZW50cnkgKCEhISkgaXMgbG93ZXIgdGhhbiB0aGUgb3RoZXJ3aXNlCisgICBleHBlY3RlZCB0ZXh0IGFkZHJlc3MuICBUaGVzZSBrbHVkZ2VzIGhhdmUgZ290dGEgZ28hCisgICBGb3IgbGlua2VkIGZpbGVzLCBzaG91bGQgcmVmbGVjdCByZWFsaXR5IGlmIHdlIGtub3cgaXQuICAqLworCisvKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdmVyc2lvbiBpbiBhb3V0NjQuaCAod2hpY2ggd2Ugb3ZlcnJpZGUgYnkgZGVmaW5pbmcKKyAgIGl0IGhlcmUpIG9ubHkgZm9yIE5NQUdJQyAod2UgcmV0dXJuIFRFWFRfU1RBUlRfQUREUitFWEVDX0JZVEVTX1NJWkU7CisgICB0aGV5IHJldHVybiAwKS4gICovCisKKyNkZWZpbmUgTl9UWFRBRERSKHgpIFwKKyAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAwIFwKKyAgICAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgJiYgKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFIpPyAwIFwKKyAgICAgOiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFKQorCisvKiBXaGVuIGEgZmlsZSBpcyBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TIDQsIHRoZQorICAgZHluYW1pYyBiaXQgaW4gdGhlIGV4ZWMgaGVhZGVyIGlzIHNldCwgYW5kIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlCisgICBzeW1ib2wgdGFibGUgaXMgX19EWU5BTUlDLiAgSXRzIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgZm9sbG93aW5nIHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMKK3sKKyAgLyogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUuICBTdW5PUyA0LjEueCBjcmVhdGVzIGZpbGVzCisgICAgIHdpdGggdmVyc2lvbiBudW1iZXIgMywgd2hpY2ggaXMgd2hhdCB0aGlzIHN0cnVjdHVyZSBpcyBiYXNlZCBvbi4KKyAgICAgQWNjb3JkaW5nIHRvIGdkYiwgdmVyc2lvbiAyIGlzIHNpbWlsYXIuICBJIGJlbGlldmUgdGhhdCB2ZXJzaW9uIDIKKyAgICAgdXNlZCBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBhbmQgdGhlcmUgbWF5CisgICAgIGhhdmUgYmVlbiBvdGhlciBkaWZmZXJlbmNlcy4gICovCisgIGJmZF9ieXRlIGxkX3ZlcnNpb25bNF07CisgIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYSAyOCBieXRlIHN0cnVjdHVyZSB1c2VkIGluIGRlYnVnZ2luZy4KKyAgICAgVGhlIGNvbnRlbnRzIGFyZSBmaWxsZWQgaW4gYXQgcnVuIHRpbWUgYnkgbGQuc28uICAqLworICBiZmRfYnl0ZSBsZGRbNF07CisgIC8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgYW5vdGhlciBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dAorICAgICBob3cgdG8gcmVsb2NhdGUgdGhlIGV4ZWN1dGFibGUgYXQgcnVuIHRpbWUuICAqLworICBiZmRfYnl0ZSBsZFs0XTsKK307CisKKy8qIFRoZSBzaXplIG9mIHRoZSBkZWJ1Z2dpbmcgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGRlYnVnZ2VyCisgICBmaWVsZCBvZiBfX0RZTkFNSUMuICAqLworI2RlZmluZSBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSAoMjQpCisKKy8qIFRoZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgbGlua2VyIGZpZWxkIG9mIF9fRFlOQU1JQy4gIEFzIGZhcgorICAgYXMgSSBjYW4gdGVsbCwgbW9zdCBvZiB0aGUgYWRkcmVzc2VzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBvZmZzZXRzCisgICB3aXRoaW4gdGhlIGZpbGUsIGJ1dCBzb21lIGFyZSBhY3R1YWxseSB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCisKK3N0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluaworeworICAvKiBMaW5rZWQgbGlzdCBvZiBsb2FkZWQgb2JqZWN0cy4gIFRoaXMgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUgYnkKKyAgICAgbGQuc28gYW5kIHByb2JhYmx5IGJ5IGRsb3Blbi4gICovCisgIHVuc2lnbmVkIGxvbmcgbGRfbG9hZGVkOworCisgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0IG9mIG5hbWVzIG9mIHNoYXJlZCBvYmplY3RzIHdoaWNoIG11c3QgYmUKKyAgICAgaW5jbHVkZWQgYXQgcnVudGltZS4gIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgaXMgMTYgYnl0ZXM6IHRoZSA0CisgICAgIGJ5dGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIG5hbWluZyB0aGUgb2JqZWN0IChlLmcuLCBmb3IgLWxjIHRoaXMKKyAgICAgaXMgImMiKTsgNCBieXRlcyBvZiBmbGFncy0tdGhlIGhpZ2ggYml0IGlzIHdoZXRoZXIgdG8gc2VhcmNoIGZvcgorICAgICB0aGUgb2JqZWN0IHVzaW5nIHRoZSBsaWJyYXJ5IHBhdGg7IHRoZSAyIGJ5dGUgbWFqb3IgdmVyc2lvbgorICAgICBudW1iZXI7IHRoZSAyIGJ5dGUgbWlub3IgdmVyc2lvbiBudW1iZXI7IHRoZSA0IGJ5dGUgYWRkcmVzcyBvZgorICAgICB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdCAoemVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5KS4gIFRoZQorICAgICB2ZXJzaW9uIG51bWJlcnMgc2VlbSB0byBvbmx5IGJlIG5vbi16ZXJvIHdoZW4gZG9pbmcgbGlicmFyeQorICAgICBzZWFyY2hpbmcuICAqLworICB1bnNpZ25lZCBsb25nIGxkX25lZWQ7CisKKyAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHBhdGggdG8gc2VhcmNoIGZvciB0aGUgc2hhcmVkIG9iamVjdHMgd2hpY2gKKyAgICAgbXVzdCBiZSBpbmNsdWRlZC4gIFRoaXMgcG9pbnRzIHRvIGEgc3RyaW5nIGluIFBBVEggZm9ybWF0IHdoaWNoCisgICAgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSAtTCBhcmd1bWVudHMgdG8gdGhlIGxpbmtlci4gIEFjY29yZGluZyB0bworICAgICB0aGUgbWFuIHBhZ2UsIGxkLnNvIGltcGxpY2l0bHkgYWRkcyAke0xEX0xJQlJBUllfUEFUSH0gdG8gdGhlCisgICAgIGJlZ2lubmluZyBvZiB0aGlzIHN0cmluZyBhbmQgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiB0byB0aGUKKyAgICAgZW5kLiAgVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBieXRlLiAgVGhpcyBmaWVsZCBpcworICAgICB6ZXJvIGlmIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgcGF0aC4gICovCisgIHVuc2lnbmVkIGxvbmcgbGRfcnVsZXM7CisKKyAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQorICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LiAgVGhlIGZpcnN0IGVudHJ5IGluIHRoZQorICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlIHNlZW1zIHRvIGJlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlCisgICAgIHN1bjRfZHluYW1pYyBzdHJ1Y3R1cmUgKHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBfX0RZTkFNSUMgc3ltYm9sKS4KKyAgICAgVGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgaXMgdXNlZCBmb3IgUElDIGNvZGUgdG8gaG9sZCB0aGUKKyAgICAgYWRkcmVzc2VzIG9mIHZhcmlhYmxlcy4gIEEgZHluYW1pY2FsbHkgbGlua2VkIGZpbGUgd2hpY2ggZG9lcyBub3QKKyAgICAgaXRzZWxmIGNvbnRhaW4gUElDIGNvZGUgaGFzIGEgZm91ciBieXRlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLworICB1bnNpZ25lZCBsb25nIGxkX2dvdDsKKworICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBUaGlzIGFwcGVhcnMgdG8gYmUgYQorICAgICB2aXJ0dWFsIGFkZHJlc3MsIG5vdCBhIGZpbGUgb2Zmc2V0LgorCisgICAgIE9uIGEgU1BBUkMsIHRoZSB0YWJsZSBpcyBjb21wb3NlZCBvZiAxMiBieXRlIGVudHJpZXMsIGVhY2ggb2YKKyAgICAgd2hpY2ggY29uc2lzdHMgb2YgdGhyZWUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpcnN0IGVudHJ5IGlzCisgICAgICAgICBzZXRoaSAlaGkoMCksJWcxCisJIGptcCAlZzEKKwkgbm9wCisgICAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgY2hhbmdlZCBieSBsZC5zbyBpbnRvIGEganVtcCBkaXJlY3RseSBpbnRvCisgICAgIGxkLnNvIGl0c2VsZi4gIEVhY2ggc3Vic2VxdWVudCBlbnRyeSBpcworICAgICAgICAgc2F2ZSAlc3AsIC05NiwgJXNwCisJIGNhbGwgPGFkZHJlc3Mgb2YgZmlyc3QgZW50cnkgaW4gcHJvY2VkdXJlIGxpbmthZ2UgdGFibGU+CisJIDxyZWxvY19udW1iZXIgfCAweDAxMDAwMDAwPgorICAgICBUaGUgcmVsb2NfbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgdGhlIHJlbG9jIHRvIHVzZSB0byByZXNvbHZlCisgICAgIHRoaXMgZW50cnkuICBUaGUgcmVsb2Mgd2lsbCBiZSBhIEpNUF9TTE9UIHJlbG9jIGFnYWluc3Qgc29tZQorICAgICBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCBmaWxlIGJ1dCBzaG91bGQgYmUKKyAgICAgZGVmaW5lZCBpbiBhIHNoYXJlZCBvYmplY3QgKGlmIGl0IGlzIG5vdCwgbGQuc28gd2lsbCByZXBvcnQgYQorICAgICBydW50aW1lIGVycm9yIGFuZCBleGl0KS4gIFRoZSBjb25zdGFudCAweDAxMDAwMDAwMCB0dXJucyB0aGUKKyAgICAgcmVsb2MgbnVtYmVyIGludG8gYSBzZXRoaSBvZiAlZzAsIHdoaWNoIGRvZXMgbm90aGluZyBzaW5jZSAlZzAgaXMKKyAgICAgaGFyZHdpcmVkIHRvIHplcm8uCisKKyAgICAgV2hlbiBvbmUgb2YgdGhlc2UgZW50cmllcyBpcyBleGVjdXRlZCwgaXQgd2luZHMgdXAgY2FsbGluZyBpbnRvCisgICAgIGxkLnNvLiAgbGQuc28gbG9va3MgYXQgdGhlIHJlbG9jIG51bWJlciwgYXZhaWxhYmxlIHZpYSB0aGUgcmV0dXJuCisgICAgIGFkZHJlc3MsIHRvIGRldGVybWluZSB3aGljaCBlbnRyeSB0aGlzIGlzLiAgSXQgdGhlbiBsb29rcyBhdCB0aGUKKyAgICAgcmVsb2MgYW5kIHBhdGNoZXMgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZSBpbnRvIGEgc2V0aGkgYW5kIGptcAorICAgICB0byB0aGUgcmVhbCBhZGRyZXNzIGZvbGxvd2VkIGJ5IGEgbm9wLiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZWxvYworICAgICBsb29rdXAgb25seSBoYXMgdG8gaGFwcGVuIG9uY2UsIGFuZCBpdCBhbHNvIG1lYW5zIHRoYXQgdGhlCisgICAgIHJlbG9jYXRpb24gb25seSBuZWVkcyB0byBiZSBkb25lIGlmIHRoZSBmdW5jdGlvbiBpcyBhY3R1YWxseQorICAgICBjYWxsZWQuICBUaGUgcmVsb2NhdGlvbiBpcyBleHBlbnNpdmUgYmVjYXVzZSBsZC5zbyBtdXN0IGxvb2sgdXAKKyAgICAgdGhlIHN5bWJvbCBieSBuYW1lLgorCisgICAgIFRoZSBzaXplIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyBnaXZlbiBieSB0aGUgbGRfcGx0X3N6CisgICAgIGZpZWxkLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZF9wbHQ7CisKKyAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jcy4gIFRoZXNlIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMKKyAgICAgb3JkaW5hcnkgcmVsb2NzLiAgU3ltYm9sIGluZGV4IG51bWJlcnMgcmVmZXIgdG8gdGhlIHN5bWJvbHMKKyAgICAgcG9pbnRlZCB0byBieSBsZF9zdGFiLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQorICAgICBudW1iZXIgb2YgcmVsb2NzIGlzIHRvIGFzc3VtZSB0aGF0IGFsbCB0aGUgYnl0ZXMgZnJvbSBsZF9yZWwgdG8KKyAgICAgbGRfaGFzaCBjb250YWluIHJlbG9jIGVudHJpZXMuICAqLworICB1bnNpZ25lZCBsb25nIGxkX3JlbDsKKworICAvKiBUaGUgYWRkcmVzcyBvZiBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIFRoZSBoYXNoIHRhYmxlIGhhcworICAgICByb3VnaGx5IHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZXJlIGFyZSBkeW5hbWljIHN5bWJvbHM7CisgICAgIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgZXhhY3Qgc2l6ZSBpcyB0byBhc3N1bWUgdGhhdAorICAgICBldmVyeSBieXRlIGZyb20gbGRfaGFzaCB0byBsZF9zdGFiIGlzIGRldm90ZWQgdG8gdGhlIGhhc2ggdGFibGUuCisKKyAgICAgRWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBpcyBlaWdodCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyCisgICAgIGJ5dGVzIGFyZSBhIHN5bWJvbCBpbmRleCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbHMuICBUaGUgc2Vjb25kCisgICAgIGZvdXIgYnl0ZXMgYXJlIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZQorICAgICBidWNrZXQuICBUaGUgbGRfYnVja2V0cyBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIHNheSBCLgorICAgICBUaGUgZmlyc3QgQiBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGVhY2ggc3RhcnQgYSBidWNrZXQgd2hpY2gKKyAgICAgaXMgY2hhaW5lZCB0aHJvdWdoIHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiBlYWNoIGVudHJ5LiAgQSB2YWx1ZQorICAgICBvZiB6ZXJvIGVuZHMgdGhlIGNoYWluLgorCisgICAgIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNpbXBseQorICAgICAgICAgaCA9IDA7CisgICAgICAgICB3aGlsZSAoKnN0cmluZyAhPSAnXDAnKQorCSAgIGggPSAoaCA8PCAxKSArICpzdHJpbmcrKzsKKwkgaCAmPSAweDdmZmZmZmZmOworCisgICAgIFRvIGxvb2sgdXAgYSBzeW1ib2wsIGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIG5hbWUuICBUYWtlCisgICAgIHRoZSBtb2R1bG9zIG9mIGhhc2ggdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgYnVja2V0cy4gIFN0YXJ0IGF0CisgICAgIHRoYXQgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTZWUgaWYgdGhlIHN5bWJvbCAoZnJvbSB0aGUgZmlyc3QKKyAgICAgZm91ciBieXRlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeSkgaGFzIHRoZSBuYW1lIHlvdSBhcmUgbG9va2luZworICAgICBmb3IuICBJZiBub3QsIHVzZSB0aGUgY2hhaW4gZmllbGQgKHRoZSBzZWNvbmQgZm91ciBieXRlcyBvZiB0aGUKKyAgICAgaGFzaCB0YWJsZSBlbnRyeSkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIGJ1Y2tldC4KKyAgICAgSWYgdGhlIGNoYWluIGZpZWxkIGlzIHplcm8geW91IGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQorICAgICBidWNrZXQsIGFuZCB0aGUgc3ltYm9sIGlzIG5vdCBpbiB0aGUgaGFzaCB0YWJsZS4gICovIAorICB1bnNpZ25lZCBsb25nIGxkX2hhc2g7CisKKyAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgYSBsaXN0IG9mCisgICAgIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICBUaGUgc3RyaW5nIGluZGljZXMgYXJlIHJlbGF0aXZlIHRvCisgICAgIHRoZSBsZF9zeW1ib2xzIGZpZWxkLiAgSSB0aGluayB0aGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHRoZQorICAgICBudW1iZXIgb2Ygc3ltYm9scyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGJldHdlZW4gbGRfc3RhYgorICAgICBhbmQgbGRfc3ltYm9scyBhcmUgZXh0ZXJuYWxfbmxpc3Qgc3RydWN0dXJlcy4gICovCisgIHVuc2lnbmVkIGxvbmcgbGRfc3RhYjsKKworICAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvci4gIEl0IHNlZW1zIHRvIGFsd2F5cyBiZSB6ZXJvLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZF9zdGFiX2hhc2g7CisKKyAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZF9idWNrZXRzOworCisgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhlIGZpcnN0IHN0cmluZyBpbiB0aGlzCisgICAgIHN0cmluZyB0YWJsZSBuZWVkIG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZF9zeW1ib2xzOworCisgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsZF9zeW1iX3NpemU7CisKKyAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRleHQgc2VnbWVudC4gICovCisgIHVuc2lnbmVkIGxvbmcgbGRfdGV4dDsKKworICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworICB1bnNpZ25lZCBsb25nIGxkX3BsdF9zejsKK307CisKKy8qIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKK3sKKyAgYmZkX2J5dGUgbGRfbG9hZGVkWzRdOworICBiZmRfYnl0ZSBsZF9uZWVkWzRdOworICBiZmRfYnl0ZSBsZF9ydWxlc1s0XTsKKyAgYmZkX2J5dGUgbGRfZ290WzRdOworICBiZmRfYnl0ZSBsZF9wbHRbNF07CisgIGJmZF9ieXRlIGxkX3JlbFs0XTsKKyAgYmZkX2J5dGUgbGRfaGFzaFs0XTsKKyAgYmZkX2J5dGUgbGRfc3RhYls0XTsKKyAgYmZkX2J5dGUgbGRfc3RhYl9oYXNoWzRdOworICBiZmRfYnl0ZSBsZF9idWNrZXRzWzRdOworICBiZmRfYnl0ZSBsZF9zeW1ib2xzWzRdOworICBiZmRfYnl0ZSBsZF9zeW1iX3NpemVbNF07CisgIGJmZF9ieXRlIGxkX3RleHRbNF07CisgIGJmZF9ieXRlIGxkX3BsdF9zels0XTsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JmZGxpbmsuaCBiL2luY2x1ZGUvYmZkbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTVmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JmZGxpbmsuaApAQCAtMCwwICsxLDUyMCBAQAorLyogYmZkbGluay5oIC0tIGhlYWRlciBmaWxlIGZvciBCRkQgbGluayByb3V0aW5lcworICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBhbmQgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBCRkRMSU5LX0gKKyNkZWZpbmUgQkZETElOS19ICisKKy8qIFdoaWNoIHN5bWJvbHMgdG8gc3RyaXAgZHVyaW5nIGEgbGluay4gICovCitlbnVtIGJmZF9saW5rX3N0cmlwCit7CisgIHN0cmlwX25vbmUsCQkvKiBEb24ndCBzdHJpcCBhbnkgc3ltYm9scy4gICovCisgIHN0cmlwX2RlYnVnZ2VyLAkvKiBTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCisgIHN0cmlwX3NvbWUsCQkvKiBrZWVwX2hhc2ggaXMgdGhlIGxpc3Qgb2Ygc3ltYm9scyB0byBrZWVwLiAgKi8KKyAgc3RyaXBfYWxsCQkvKiBTdHJpcCBhbGwgc3ltYm9scy4gICovCit9OworCisvKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIGRpc2NhcmQgZHVyaW5nIGEgbGluay4gIFRoaXMgaXMgaXJyZWxldmFudAorICAgaWYgc3RyaXBfYWxsIGlzIHVzZWQuICAqLworZW51bSBiZmRfbGlua19kaXNjYXJkCit7CisgIGRpc2NhcmRfbm9uZSwJCS8qIERvbid0IGRpc2NhcmQgYW55IGxvY2Fscy4gICovCisgIGRpc2NhcmRfbCwJCS8qIERpc2NhcmQgbG9jYWwgdGVtcG9yYXJ5IHN5bWJvbHMuICAqLworICBkaXNjYXJkX2FsbAkJLyogRGlzY2FyZCBhbGwgbG9jYWxzLiAgKi8KK307CisMCisvKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGFuIGVudHJ5IGluIHRoZSBCRkQgbGluayBoYXNoCisgICB0YWJsZS4gICovCisKK2VudW0gYmZkX2xpbmtfaGFzaF90eXBlCit7CisgIGJmZF9saW5rX2hhc2hfbmV3LAkJLyogU3ltYm9sIGlzIG5ldy4gICovCisgIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkLAkvKiBTeW1ib2wgc2VlbiBiZWZvcmUsIGJ1dCB1bmRlZmluZWQuICAqLworICBiZmRfbGlua19oYXNoX3VuZGVmd2VhaywJLyogU3ltYm9sIGlzIHdlYWsgYW5kIHVuZGVmaW5lZC4gICovCisgIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwJLyogU3ltYm9sIGlzIGRlZmluZWQuICAqLworICBiZmRfbGlua19oYXNoX2RlZndlYWssCS8qIFN5bWJvbCBpcyB3ZWFrIGFuZCBkZWZpbmVkLiAgKi8KKyAgYmZkX2xpbmtfaGFzaF9jb21tb24sCQkvKiBTeW1ib2wgaXMgY29tbW9uLiAgKi8KKyAgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwJLyogU3ltYm9sIGlzIGFuIGluZGlyZWN0IGxpbmsuICAqLworICBiZmRfbGlua19oYXNoX3dhcm5pbmcJCS8qIExpa2UgaW5kaXJlY3QsIGJ1dCB3YXJuIGlmIHJlZmVyZW5jZWQuICAqLworfTsKKworLyogVGhlIGxpbmtpbmcgcm91dGluZXMgdXNlIGEgaGFzaCB0YWJsZSB3aGljaCB1c2VzIHRoaXMgc3RydWN0dXJlIGZvcgorICAgaXRzIGVsZW1lbnRzLiAgKi8KKworc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkKK3sKKyAgLyogQmFzZSBoYXNoIHRhYmxlIGVudHJ5IHN0cnVjdHVyZS4gICovCisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworICAvKiBUeXBlIG9mIHRoaXMgZW50cnkuICAqLworICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSB0eXBlOworCisgIC8qIFVuZGVmaW5lZCBhbmQgY29tbW9uIHN5bWJvbHMgYXJlIGtlcHQgaW4gYSBsaW5rZWQgbGlzdCB0aHJvdWdoCisgICAgIHRoaXMgZmllbGQuICBUaGlzIGZpZWxkIGlzIG5vdCBpbiB0aGUgdW5pb24gYmVjYXVzZSB0aGF0IHdvdWxkCisgICAgIGZvcmNlIHVzIHRvIHJlbW92ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3Qgd2hlbiB3ZSBjaGFuZ2VkIHRoZWlyCisgICAgIHR5cGUsIHdoaWNoIHdvdWxkIGZvcmNlIHRoZSBsaXN0IHRvIGJlIGRvdWJseSBsaW5rZWQsIHdoaWNoIHdvdWxkCisgICAgIHdhc3RlIG1vcmUgbWVtb3J5LiAgV2hlbiBhbiB1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbCBpcworICAgICBjcmVhdGVkLCBpdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBsaXN0LCB0aGUgaGVhZCBvZiB3aGljaCBpcyBpbgorICAgICB0aGUgbGluayBoYXNoIHRhYmxlIGl0c2VsZi4gIEFzIHN5bWJvbHMgYXJlIGRlZmluZWQsIHRoZXkgbmVlZAorICAgICBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0OyBhbnl0aGluZyB3aGljaCByZWFkcyB0aGUgbGlzdCBtdXN0CisgICAgIGRvdWJsZWNoZWNrIHRoZSBzeW1ib2wgdHlwZS4KKworICAgICBXZWFrIHN5bWJvbHMgYXJlIG5vdCBrZXB0IG9uIHRoaXMgbGlzdC4KKworICAgICBEZWZpbmVkIGFuZCBkZWZ3ZWFrIHN5bWJvbHMgdXNlIHRoaXMgZmllbGQgYXMgYSByZWZlcmVuY2UgbWFya2VyLgorICAgICBJZiB0aGUgZmllbGQgaXMgbm90IE5VTEwsIG9yIHRoaXMgc3RydWN0dXJlIGlzIHRoZSB0YWlsIG9mIHRoZQorICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QsIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZC4gIElmIHRoZQorICAgICBzeW1ib2wgaXMgdW5kZWZpbmVkIGFuZCBiZWNvbWVzIGRlZmluZWQsIHRoaXMgZmllbGQgd2lsbAorICAgICBhdXRvbWF0aWNhbGx5IGJlIG5vbi1OVUxMIHNpbmNlIHRoZSBzeW1ib2wgd2lsbCBoYXZlIGJlZW4gb24gdGhlCisgICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gICovCisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpuZXh0OworICAvKiBBIHVuaW9uIG9mIGluZm9ybWF0aW9uIGRlcGVuZGluZyB1cG9uIHRoZSB0eXBlLiAgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICAvKiBOb3RoaW5nIGlzIGtlcHQgZm9yIGJmZF9oYXNoX25ldy4gICovCisgICAgICAvKiBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuICAqLworICAgICAgc3RydWN0CisJeworCSAgYmZkICphYmZkOwkJLyogQkZEIHN5bWJvbCB3YXMgZm91bmQgaW4uICAqLworCX0gdW5kZWY7CisgICAgICAvKiBiZmRfbGlua19oYXNoX2RlZmluZWQsIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4gICovCisgICAgICBzdHJ1Y3QKKwl7CisJICBiZmRfdm1hIHZhbHVlOwkvKiBTeW1ib2wgdmFsdWUuICAqLworCSAgYXNlY3Rpb24gKnNlY3Rpb247CS8qIFN5bWJvbCBzZWN0aW9uLiAgKi8KKwl9IGRlZjsKKyAgICAgIC8qIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QsIGJmZF9saW5rX2hhc2hfd2FybmluZy4gICovCisgICAgICBzdHJ1Y3QKKwl7CisJICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGluazsJLyogUmVhbCBzeW1ib2wuICAqLworCSAgY29uc3QgY2hhciAqd2FybmluZzsJLyogV2FybmluZyAoYmZkX2xpbmtfaGFzaF93YXJuaW5nIG9ubHkpLiAgKi8KKwl9IGk7CisgICAgICAvKiBiZmRfbGlua19oYXNoX2NvbW1vbi4gICovCisgICAgICBzdHJ1Y3QKKwl7CisJICAvKiBUaGUgbGlua2VyIG5lZWRzIHRvIGtub3cgdGhyZWUgdGhpbmdzIGFib3V0IGNvbW1vbgorICAgICAgICAgICAgIHN5bWJvbHM6IHRoZSBzaXplLCB0aGUgYWxpZ25tZW50LCBhbmQgdGhlIHNlY3Rpb24gaW4KKyAgICAgICAgICAgICB3aGljaCB0aGUgc3ltYm9sIHNob3VsZCBiZSBwbGFjZWQuICBXZSBzdG9yZSB0aGUgc2l6ZQorICAgICAgICAgICAgIGhlcmUsIGFuZCB3ZSBhbGxvY2F0ZSBhIHNtYWxsIHN0cnVjdHVyZSB0byBob2xkIHRoZQorICAgICAgICAgICAgIHNlY3Rpb24gYW5kIHRoZSBhbGlnbm1lbnQuICBUaGUgYWxpZ25tZW50IGlzIHN0b3JlZCBhcyBhCisgICAgICAgICAgICAgcG93ZXIgb2YgdHdvLiAgV2UgZG9uJ3Qgc3RvcmUgYWxsIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZgorICAgICAgICAgICAgIHRoZSB1bmlvbjsgdGhpcyBzdHJ1Y3R1cmUgaXMgYSBtYWpvciBzcGFjZSB1c2VyIGluIHRoZQorICAgICAgICAgICAgIGxpbmtlci4gICovCisJICBiZmRfc2l6ZV90eXBlIHNpemU7CS8qIENvbW1vbiBzeW1ib2wgc2l6ZS4gICovCisJICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7CS8qIEFsaWdubWVudC4gICovCisJICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CQkvKiBTeW1ib2wgc2VjdGlvbi4gICovCisJICAgIH0gKnA7CisJfSBjOworICAgIH0gdTsKK307CisKKy8qIFRoaXMgaXMgdGhlIGxpbmsgaGFzaCB0YWJsZS4gIEl0IGlzIGEgZGVyaXZlZCBjbGFzcyBvZgorICAgYmZkX2hhc2hfdGFibGUuICAqLworCitzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZQoreworICAvKiBUaGUgaGFzaCB0YWJsZSBpdHNlbGYuICAqLworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7CisgIC8qIFRoZSBiYWNrIGVuZCB3aGljaCBjcmVhdGVkIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaW5kaWNhdGVzIHRoZQorICAgICB0eXBlIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlLCB3aGljaCBpcyBzb21ldGltZXMKKyAgICAgaW1wb3J0YW50IGluZm9ybWF0aW9uIHdoZW4gbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50CisgICAgIHR5cGVzIHRvZ2V0aGVyLiAgKi8KKyAgY29uc3QgYmZkX3RhcmdldCAqY3JlYXRvcjsKKyAgLyogQSBsaW5rZWQgbGlzdCBvZiB1bmRlZmluZWQgYW5kIGNvbW1vbiBzeW1ib2xzLCBsaW5rZWQgdGhyb3VnaCB0aGUKKyAgICAgbmV4dCBmaWVsZCBpbiB0aGUgYmZkX2xpbmtfaGFzaF9lbnRyeSBzdHJ1Y3R1cmUuICAqLworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzOworICAvKiBFbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgdGFpbCBvZiB0aGUgdW5kZWZzIGxpc3QuICAqLworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzX3RhaWw7Cit9OworCisvKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgbGluayBoYXNoIHRhYmxlLiAgSWYgRk9MTE9XIGlzIHRydWUsIHRoaXMKKyAgIGZvbGxvd3MgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCBhbmQgYmZkX2xpbmtfaGFzaF93YXJuaW5nIGxpbmtzIHRvCisgICB0aGUgcmVhbCBzeW1ib2wuICAqLworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpiZmRfbGlua19oYXNoX2xvb2t1cAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAorCSAgIGJvb2xlYW4gY29weSwgYm9vbGVhbiBmb2xsb3cpKTsKKworLyogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgbWFpbiBsaW5rZXIgaGFzaCB0YWJsZSBpZiB0aGUgc3ltYm9sIG1pZ2h0CisgICBiZSB3cmFwcGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciByZWZlcmVuY2VzIHRvIGFuCisgICB1bmRlZmluZWQgc3ltYm9sLCBub3QgZm9yIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwCisgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCisJICAgYm9vbGVhbikpOworCisvKiBUcmF2ZXJzZSBhIGxpbmsgaGFzaCB0YWJsZS4gICovCitleHRlcm4gdm9pZCBiZmRfbGlua19oYXNoX3RyYXZlcnNlCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosCisJICAgYm9vbGVhbiAoKikgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUiksCisJICAgUFRSKSk7CisKKy8qIEFkZCBhbiBlbnRyeSB0byB0aGUgdW5kZWZzIGxpc3QuICAqLworZXh0ZXJuIHZvaWQgYmZkX2xpbmtfYWRkX3VuZGVmCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopKTsKKwwKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbW11bmljYXRlCisgICBiZXR3ZWVuIEJGRCBhbmQgdGhlIGxpbmtlciB3aGVuIGRvaW5nIGEgbGluay4gICovCisKK3N0cnVjdCBiZmRfbGlua19pbmZvCit7CisgIC8qIEZ1bmN0aW9uIGNhbGxiYWNrcy4gICovCisgIGNvbnN0IHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MgKmNhbGxiYWNrczsKKyAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLiAgKi8KKyAgYm9vbGVhbiByZWxvY2F0ZWFibGU7CisgIC8qIHRydWUgaWYgQkZEIHNob3VsZCBnZW5lcmF0ZSBhICJ0YXNrIGxpbmtlZCIgb2JqZWN0IGZpbGUsCisgICAgIHNpbWlsYXIgdG8gcmVsb2NhdGFibGUgYnV0IGFsc28gd2l0aCBnbG9iYWxzIGNvbnZlcnRlZCB0byBzdGF0aWNzLiAqLworICBib29sZWFuIHRhc2tfbGluazsKKyAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgc2hhcmVkIG9iamVjdC4gICovCisgIGJvb2xlYW4gc2hhcmVkOworICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgcHJlLWJpbmQgc3ltYm9scyBpbiBhIHNoYXJlZCBvYmplY3QuICAqLworICBib29sZWFuIHN5bWJvbGljOworICAvKiB0cnVlIGlmIHNoYXJlZCBvYmplY3RzIHNob3VsZCBiZSBsaW5rZWQgZGlyZWN0bHksIG5vdCBzaGFyZWQuICAqLworICBib29sZWFuIHN0YXRpY19saW5rOworICAvKiB0cnVlIGlmIHRoZSBvdXRwdXQgZmlsZSBzaG91bGQgYmUgaW4gYSB0cmFkaXRpb25hbCBmb3JtYXQuICBUaGlzCisgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHNldHRpbmcgb2YgdGhlIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgZmxhZworICAgICBvbiB0aGUgb3V0cHV0IGZpbGUsIGJ1dCBtYXkgYmUgY2hlY2tlZCB3aGVuIHJlYWRpbmcgdGhlIGlucHV0CisgICAgIGZpbGVzLiAgKi8KKyAgYm9vbGVhbiB0cmFkaXRpb25hbF9mb3JtYXQ7CisgIC8qIHRydWUgaWYgd2Ugd2FudCB0byBwcm9kdWNlZCBvcHRpbWl6ZWQgb3V0cHV0IGZpbGVzLiAgVGhpcyBtaWdodAorICAgICBuZWVkIG11Y2ggbW9yZSB0aW1lIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSBleHBsaWNpdGx5IHNlbGVjdGVkLiAgKi8KKyAgYm9vbGVhbiBvcHRpbWl6ZTsKKyAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGVycm9ycyBmb3IgdW5kZWZpbmVkIHN5bWJvbHMKKyAgICAgZXZlbiBpZiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4gICovCisgIGJvb2xlYW4gbm9fdW5kZWZpbmVkOworICAvKiBXaGljaCBzeW1ib2xzIHRvIHN0cmlwLiAgKi8KKyAgZW51bSBiZmRfbGlua19zdHJpcCBzdHJpcDsKKyAgLyogV2hpY2ggbG9jYWwgc3ltYm9scyB0byBkaXNjYXJkLiAgKi8KKyAgZW51bSBiZmRfbGlua19kaXNjYXJkIGRpc2NhcmQ7CisgIC8qIHRydWUgaWYgc3ltYm9scyBzaG91bGQgYmUgcmV0YWluZWQgaW4gbWVtb3J5LCBmYWxzZSBpZiB0aGV5CisgICAgIHNob3VsZCBiZSBmcmVlZCBhbmQgcmVyZWFkLiAgKi8KKyAgYm9vbGVhbiBrZWVwX21lbW9yeTsKKyAgLyogVGhlIGxpc3Qgb2YgaW5wdXQgQkZEJ3MgaW52b2x2ZWQgaW4gdGhlIGxpbmsuICBUaGVzZSBhcmUgY2hhaW5lZAorICAgICB0b2dldGhlciB2aWEgdGhlIGxpbmtfbmV4dCBmaWVsZC4gICovCisgIGJmZCAqaW5wdXRfYmZkczsKKyAgLyogSWYgYSBzeW1ib2wgc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaW5wdXQgQkZELCB0aGlzIGlzIHNlY3Rpb24KKyAgICAgd2hlcmUgdGhvc2Ugc3ltYm9scyBzaG91bGQgYmUgcGxhY2VkLiAgSXQgbXVzdCBiZSBhIHNlY3Rpb24gaW4KKyAgICAgdGhlIG91dHB1dCBCRkQuICBJdCBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBubyBzdWNoIHN5bWJvbHMKKyAgICAgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBpcyB0byBzdXBwb3J0IENSRUFURV9PQkpFQ1RfU1lNQk9MUyBpbiB0aGUKKyAgICAgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuICAqLworICBhc2VjdGlvbiAqY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb247CisgIC8qIEhhc2ggdGFibGUgaGFuZGxlZCBieSBCRkQuICAqLworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqaGFzaDsKKyAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIGtlZXAuICBUaGlzIGlzIE5VTEwgdW5sZXNzIHN0cmlwIGlzCisgICAgIHN0cmlwX3NvbWUuICAqLworICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmtlZXBfaGFzaDsKKyAgLyogdHJ1ZSBpZiBldmVyeSBzeW1ib2wgc2hvdWxkIGJlIHJlcG9ydGVkIGJhY2sgdmlhIHRoZSBub3RpY2UKKyAgICAgY2FsbGJhY2suICAqLworICBib29sZWFuIG5vdGljZV9hbGw7CisgIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB0byByZXBvcnQgYmFjayB2aWEgdGhlIG5vdGljZSBjYWxsYmFjay4gIElmCisgICAgIHRoaXMgaXMgTlVMTCwgYW5kIG5vdGljZV9hbGwgaXMgZmFsc2UsIHRoZW4gbm8gc3ltYm9scyBhcmUKKyAgICAgcmVwb3J0ZWQgYmFjay4gICovCisgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqbm90aWNlX2hhc2g7CisgIC8qIEhhc2ggdGFibGUgb2Ygc3ltYm9scyB3aGljaCBhcmUgYmVpbmcgd3JhcHBlZCAodGhlIC0td3JhcCBsaW5rZXIKKyAgICAgb3B0aW9uKS4gIElmIHRoaXMgaXMgTlVMTCwgbm8gc3ltYm9scyBhcmUgYmVpbmcgd3JhcHBlZC4gICovCisgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqd3JhcF9oYXNoOworICAvKiBJZiBhIGJhc2Ugb3V0cHV0IGZpbGUgaXMgd2FudGVkLCB0aGVuIHRoaXMgcG9pbnRzIHRvIGl0ICovCisgIFBUUiBiYXNlX2ZpbGU7CisKKyAgLyogSWYgbm9uLXplcm8sIHNwZWNpZmllcyB0aGF0IGJyYW5jaGVzIHdoaWNoIGFyZSBwcm9ibGVtYXRpYyBmb3IgdGhlCisgIE1QQzg2MCBDMCAob3IgZWFybGllcikgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGFuZCBtb2RpZmllZC4gIEl0IGdpdmVzIHRoZQorICBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGV4dCBwYWdlLiAqLworICBpbnQgbXBjODYwYzA7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZXMgaG9sZHMgYSBzZXQgb2YgY2FsbGJhY2sgZnVuY3Rpb25zLiAgVGhlc2UgYXJlCisgICBjYWxsZWQgYnkgdGhlIEJGRCBsaW5rZXIgcm91dGluZXMuICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gZWFjaAorICAgY2FsbGJhY2sgZnVuY3Rpb24gaXMgdGhlIGJmZF9saW5rX2luZm8gc3RydWN0dXJlIGJlaW5nIHVzZWQuICBFYWNoCisgICBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLAorICAgdGhlbiB0aGUgQkZEIGZ1bmN0aW9uIHdoaWNoIGNhbGxlZCBpdCB3aWxsIHJldHVybiB3aXRoIGEgZmFpbHVyZQorICAgaW5kaWNhdGlvbi4gICovCisKK3N0cnVjdCBiZmRfbGlua19jYWxsYmFja3MKK3sKKyAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbiBvYmplY3QgaXMgYWRkZWQgZnJvbSBhbgorICAgICBhcmNoaXZlLiAgQUJGRCBpcyB0aGUgYXJjaGl2ZSBlbGVtZW50IGJlaW5nIGFkZGVkLiAgTkFNRSBpcyB0aGUKKyAgICAgbmFtZSBvZiB0aGUgc3ltYm9sIHdoaWNoIGNhdXNlZCB0aGUgYXJjaGl2ZSBlbGVtZW50IHRvIGJlIHB1bGxlZAorICAgICBpbi4gICovCisgIGJvb2xlYW4gKCphZGRfYXJjaGl2ZV9lbGVtZW50KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkgIGJmZCAqYWJmZCwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lKSk7CisgIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaXMgZm91bmQgd2l0aCBtdWx0aXBsZQorICAgICBkZWZpbml0aW9ucy4gIE5BTUUgaXMgdGhlIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLgorICAgICBPQkZEIGlzIHRoZSBvbGQgQkZELCBPU0VDIGlzIHRoZSBvbGQgc2VjdGlvbiwgT1ZBTCBpcyB0aGUgb2xkCisgICAgIHZhbHVlLCBOQkZEIGlzIHRoZSBuZXcgQkZELCBOU0VDIGlzIHRoZSBuZXcgc2VjdGlvbiwgYW5kIE5WQUwgaXMKKyAgICAgdGhlIG5ldyB2YWx1ZS4gIE9CRkQgbWF5IGJlIE5VTEwuICBPU0VDIGFuZCBOU0VDIG1heSBiZQorICAgICBiZmRfY29tX3NlY3Rpb24gb3IgYmZkX2luZF9zZWN0aW9uLiAgKi8KKyAgYm9vbGVhbiAoKm11bHRpcGxlX2RlZmluaXRpb24pIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICBiZmQgKm9iZmQsCisJCQkJCSAgYXNlY3Rpb24gKm9zZWMsCisJCQkJCSAgYmZkX3ZtYSBvdmFsLAorCQkJCQkgIGJmZCAqbmJmZCwKKwkJCQkJICBhc2VjdGlvbiAqbnNlYywKKwkJCQkJICBiZmRfdm1hIG52YWwpKTsKKyAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgZGVmaW5lZAorICAgICBtdWx0aXBsZSB0aW1lcy4gIE5BTUUgaXMgdGhlIHN5bWJvbCBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCisgICAgIE9CRkQgaXMgdGhlIEJGRCBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sOyBpdCBtYXkgYmUgTlVMTCBpZiB0aGlzIGlzCisgICAgIG5vdCBrbm93bi4gIE9UWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBleGlzdGluZyBzeW1ib2wsIHdoaWNoIG1heQorICAgICBiZSBiZmRfbGlua19oYXNoX2RlZmluZWQsIGJmZF9saW5rX2hhc2hfZGVmd2VhaywKKyAgICAgYmZkX2xpbmtfaGFzaF9jb21tb24sIG9yIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuICBJZiBPVFlQRSBpcworICAgICBiZmRfbGlua19oYXNoX2NvbW1vbiwgT1NJWkUgaXMgdGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbC4KKyAgICAgTkJGRCBpcyB0aGUgQkZEIG9mIHRoZSBuZXcgc3ltYm9sLiAgTlRZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIG5ldworICAgICBzeW1ib2wsIG9uZSBvZiBiZmRfbGlua19oYXNoX2RlZmluZWQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBvcgorICAgICBiZmRfbGlua19oYXNoX2luZGlyZWN0LiAgSWYgTlRZUEUgaXMgYmZkX2xpbmtfaGFzaF9jb21tb24sIE5TSVpFCisgICAgIGlzIHRoZSBzaXplIG9mIHRoZSBuZXcgc3ltYm9sLiAgKi8KKyAgYm9vbGVhbiAoKm11bHRpcGxlX2NvbW1vbikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIGJmZCAqb2JmZCwKKwkJCQkgICAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBvdHlwZSwKKwkJCQkgICAgICBiZmRfdm1hIG9zaXplLAorCQkJCSAgICAgIGJmZCAqbmJmZCwKKwkJCQkgICAgICBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSBudHlwZSwKKwkJCQkgICAgICBiZmRfdm1hIG5zaXplKSk7CisgIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHRvIGFkZCBhIHN5bWJvbCB0byBhIHNldC4gIEVOVFJZIGlzCisgICAgIHRoZSBsaW5rIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBzZXQgaXRzZWxmIChlLmcuLAorICAgICBfX0NUT1JfTElTVF9fKS4gIFJFTE9DIGlzIHRoZSByZWxvY2F0aW9uIHRvIHVzZSBmb3IgYW4gZW50cnkgaW4KKyAgICAgdGhlIHNldCB3aGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgZmlsZSwgYW5kIGlzIGFsc28gdXNlZCB0bworICAgICBnZXQgdGhlIHNpemUgb2YgdGhlIGVudHJ5IHdoZW4gZ2VuZXJhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUuCisgICAgIEFCRkQsIFNFQyBhbmQgVkFMVUUgaWRlbnRpZnkgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2V0LiAgKi8KKyAgYm9vbGVhbiAoKmFkZF90b19zZXQpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICplbnRyeSwKKwkJCQkgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jLAorCQkJCSBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGJmZF92bWEgdmFsdWUpKTsKKyAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgbmFtZSBvZiBhIGcrKyBjb25zdHJ1Y3RvciBvcgorICAgICBkZXN0cnVjdG9yIGlzIGZvdW5kLiAgVGhpcyBpcyBvbmx5IGNhbGxlZCBieSBzb21lIG9iamVjdCBmaWxlCisgICAgIGZvcm1hdHMuICBDT05TVFJVQ1RPUiBpcyB0cnVlIGZvciBhIGNvbnN0cnVjdG9yLCBmYWxzZSBmb3IgYQorICAgICBkZXN0cnVjdG9yLiAgVGhpcyB3aWxsIHVzZSBCRkRfUkVMT0NfQ1RPUiB3aGVuIGdlbmVyYXRpbmcgYQorICAgICByZWxvY2F0ZWFibGUgZmlsZS4gIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBmb3VuZC4gIEFCRkQsCisgICAgIFNFQ1RJT04gYW5kIFZBTFVFIGFyZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCisgIGJvb2xlYW4gKCpjb25zdHJ1Y3RvcikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkgIGJvb2xlYW4gY29uc3RydWN0b3IsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLCBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsCisJCQkJICBiZmRfdm1hIHZhbHVlKSk7CisgIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHRvIGlzc3VlIGEgbGlua2VyIHdhcm5pbmcuICBGb3IKKyAgICAgZXhhbXBsZSwgdGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcKKyAgICAgc3ltYm9sLiAgV0FSTklORyBpcyB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuICBTWU1CT0wgaXMgdGhlIG5hbWUKKyAgICAgb2YgdGhlIHN5bWJvbCB3aGljaCB0cmlnZ2VyZWQgdGhlIHdhcm5pbmc7IGl0IG1heSBiZSBOVUxMIGlmCisgICAgIHRoZXJlIGlzIG5vbmUuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbgorICAgICB3aGljaCB0cmlnZXJyZWQgdGhlIHdhcm5pbmc7IGVpdGhlciBBQkZEIG9yIFNFQ1RJT04gb3IgYm90aCBtYXkKKyAgICAgYmUgTlVMTCBpZiB0aGUgbG9jYXRpb24gaXMgbm90IGtub3duLiAgKi8KKyAgYm9vbGVhbiAoKndhcm5pbmcpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkgICAgICBjb25zdCBjaGFyICp3YXJuaW5nLCBjb25zdCBjaGFyICpzeW1ib2wsCisJCQkgICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAorCQkJICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7CisgIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSByZWxvY2F0aW9uIGlzIGF0dGVtcHRlZCBhZ2FpbnN0CisgICAgIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBOQU1FIGlzIHRoZSBzeW1ib2wgd2hpY2ggaXMgdW5kZWZpbmVkLgorICAgICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZQorICAgICByZWZlcmVuY2UgaXMgbWFkZS4gIEluIHNvbWUgY2FzZXMgU0VDVElPTiBtYXkgYmUgTlVMTC4gICovCisgIGJvb2xlYW4gKCp1bmRlZmluZWRfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBiZmQgKmFiZmQsCisJCQkJICAgICAgIGFzZWN0aW9uICpzZWN0aW9uLCBiZmRfdm1hIGFkZHJlc3MpKTsKKyAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIG92ZXJmbG93IG9jY3Vycy4gIE5BTUUgaXMKKyAgICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBvciBzZWN0aW9uIHRoZSByZWxvYyBpcyBhZ2FpbnN0LAorICAgICBSRUxPQ19OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSByZWxvY2F0aW9uLCBhbmQgQURERU5EIGlzIGFueQorICAgICBhZGRlbmQgdGhhdCBpcyB1c2VkLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUKKyAgICAgbG9jYXRpb24gYXQgd2hpY2ggdGhlIG92ZXJmbG93IG9jY3VyczsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKKyAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KKyAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLworICBib29sZWFuICgqcmVsb2Nfb3ZlcmZsb3cpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZSwgYmZkX3ZtYSBhZGRlbmQsCisJCQkJICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAorCQkJCSAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7CisgIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBkYW5nZXJvdXMgcmVsb2MgaXMgcGVyZm9ybWVkLgorICAgICBUaGUgY2Fub25pY2FsIGV4YW1wbGUgaXMgYW4gYTI5ayBJSENPTlNUIHJlbG9jIHdoaWNoIGRvZXMgbm90CisgICAgIGZvbGxvdyBhbiBJSElIQUxGIHJlbG9jLiAgTUVTU0FHRSBpcyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlLgorICAgICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUKKyAgICAgcHJvYmxlbSBvY2N1cnJlZDsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKKyAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KKyAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLworICBib29sZWFuICgqcmVsb2NfZGFuZ2Vyb3VzKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCQkJICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKKyAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIGlzIGZvdW5kIHRvIGJlIGF0dGFjaGVkCisgICAgIHRvIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBiZWluZyB3cml0dGVuIG91dC4gIE5BTUUgaXMgdGhlIG5hbWUgb2YKKyAgICAgdGhlIHN5bWJvbC4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIG9mCisgICAgIHRoZSByZWxvYzsgaWYgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEKKyAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvciBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoZW4KKyAgICAgQUJGRCB3aWxsIGJlIE5VTEwuICAqLworICBib29sZWFuICgqdW5hdHRhY2hlZF9yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwKKwkJCQkgICAgICAgYmZkX3ZtYSBhZGRyZXNzKSk7CisgIC8qIEEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaW4gbm90aWNlX2hhc2ggaXMKKyAgICAgZGVmaW5lZCBvciByZWZlcmVuY2VkLiAgTkFNRSBpcyB0aGUgc3ltYm9sLiAgQUJGRCwgU0VDVElPTiBhbmQKKyAgICAgQUREUkVTUyBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJZiBTRUNUSU9OIGlzCisgICAgIGJmZF91bmRfc2VjdGlvbiwgdGhpcyBpcyBhIHJlZmVyZW5jZS4gICovCisgIGJvb2xlYW4gKCpub3RpY2UpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF92bWEgYWRkcmVzcykpOworfTsKKwwKKy8qIFRoZSBsaW5rZXIgYnVpbGRzIGxpbmtfb3JkZXIgc3RydWN0dXJlcyB3aGljaCB0ZWxsIHRoZSBjb2RlIGhvdyB0bworICAgaW5jbHVkZSBpbnB1dCBkYXRhIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCisKKy8qIFRoZXNlIGFyZSB0aGUgdHlwZXMgb2YgbGlua19vcmRlciBzdHJ1Y3R1cmVzLiAgKi8KKworZW51bSBiZmRfbGlua19vcmRlcl90eXBlCit7CisgIGJmZF91bmRlZmluZWRfbGlua19vcmRlciwJLyogVW5kZWZpbmVkLiAgKi8KKyAgYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIsCS8qIEJ1aWx0IGZyb20gYSBzZWN0aW9uLiAgKi8KKyAgYmZkX2ZpbGxfbGlua19vcmRlciwJCS8qIEZpbGwgd2l0aCBhIDE2IGJpdCBjb25zdGFudC4gICovCisgIGJmZF9kYXRhX2xpbmtfb3JkZXIsCQkvKiBTZXQgdG8gZXhwbGljaXQgZGF0YS4gICovCisgIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIsCS8qIFJlbG9jYXRlIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KKyAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyCS8qIFJlbG9jYXRlIGFnYWluc3QgYSBzeW1ib2wuICAqLworfTsKKworLyogVGhpcyBpcyB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmUgaXRzZWxmLiAgVGhlc2UgZm9ybSBhIGNoYWluCisgICBhdHRhY2hlZCB0byB0aGUgc2VjdGlvbiB3aG9zZSBjb250ZW50cyB0aGV5IGFyZSBkZXNjcmliaW5nLiAgKi8KKworc3RydWN0IGJmZF9saW5rX29yZGVyIAoreworICAvKiBOZXh0IGxpbmtfb3JkZXIgaW4gY2hhaW4uICAqLworICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKm5leHQ7CisgIC8qIFR5cGUgb2YgbGlua19vcmRlci4gICovCisgIGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSB0eXBlOworICAvKiBPZmZzZXQgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KKyAgYmZkX3ZtYSBvZmZzZXQ7ICAKKyAgLyogU2l6ZSB3aXRoaW4gb3V0cHV0IHNlY3Rpb24uICAqLworICBiZmRfc2l6ZV90eXBlIHNpemU7CisgIC8qIFR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLworICB1bmlvbiAKKyAgICB7CisgICAgICBzdHJ1Y3QgCisJeworCSAgLyogU2VjdGlvbiB0byBpbmNsdWRlLiAgSWYgdGhpcyBpcyB1c2VkLCB0aGVuCisJICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiBtdXN0IGJlIHRoZSBzZWN0aW9uIHRoZQorCSAgICAgbGlua19vcmRlciBpcyBhdHRhY2hlZCB0bywgc2VjdGlvbi0+b3V0cHV0X29mZnNldCBtdXN0CisJICAgICBlcXVhbCB0aGUgbGlua19vcmRlciBvZmZzZXQgZmllbGQsIGFuZCBzZWN0aW9uLT5fcmF3X3NpemUKKwkgICAgIG11c3QgZXF1YWwgdGhlIGxpbmtfb3JkZXIgc2l6ZSBmaWVsZC4gIE1heWJlIHRoZXNlCisJICAgICByZXN0cmljdGlvbnMgc2hvdWxkIGJlIHJlbGF4ZWQgc29tZWRheS4gICovCisJICBhc2VjdGlvbiAqc2VjdGlvbjsKKwl9IGluZGlyZWN0OworICAgICAgc3RydWN0CisJeworCSAgLyogVmFsdWUgdG8gZmlsbCB3aXRoLiAgKi8KKwkgIHVuc2lnbmVkIGludCB2YWx1ZTsKKwl9IGZpbGw7CisgICAgICBzdHJ1Y3QKKwl7CisJICAvKiBEYXRhIHRvIHB1dCBpbnRvIGZpbGUuICBUaGUgc2l6ZSBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyCisJICAgICBvZiBieXRlcyB3aGljaCB0aGlzIGZpZWxkIHBvaW50cyB0by4gICovCisJICBiZmRfYnl0ZSAqY29udGVudHM7CisJfSBkYXRhOworICAgICAgc3RydWN0CisJeworCSAgLyogRGVzY3JpcHRpb24gb2YgcmVsb2MgdG8gZ2VuZXJhdGUuICBVc2VkIGZvcgorCSAgICAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBhbmQKKwkgICAgIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlci4gICovCisJICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKnA7CisJfSByZWxvYzsKKyAgICB9IHU7Cit9OworCisvKiBBIGxpbmtlciBvcmRlciBvZiB0eXBlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIgb3IKKyAgIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciBtZWFucyB0byBjcmVhdGUgYSByZWxvYyBhZ2FpbnN0IGEKKyAgIHNlY3Rpb24gb3Igc3ltYm9sLCByZXNwZWN0aXZlbHkuICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IC1VciB0bworICAgZ2VuZXJhdGUgcmVsb2NzIGZvciB0aGUgY29uc3RydWN0b3IgdGFibGVzLiAgVGhlCisgICBiZmRfbGlua19vcmRlcl9yZWxvYyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSByZWxvYyB0aGF0IEJGRCBzaG91bGQKKyAgIGNyZWF0ZS4gIEl0IGlzIHNpbWlsYXIgdG8gYSBhcmVsZW50LCBidXQgSSBkaWRuJ3QgdXNlIGFyZWxlbnQKKyAgIGJlY2F1c2UgdGhlIGxpbmtlciBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IG1vc3Qgc3ltYm9scywgYW5kCisgICBhbnkgYXN5bWJvbCBzdHJ1Y3R1cmUgaXQgY3JlYXRlcyB3aWxsIGJlIHBhcnRpYWxseSBtZWFuaW5nbGVzcy4KKyAgIFRoaXMgaW5mb3JtYXRpb24gY291bGQgbG9naWNhbGx5IGJlIGluIHRoZSBiZmRfbGlua19vcmRlciBzdHJ1Y3QsCisgICBidXQgSSBkaWRuJ3Qgd2FudCB0byB3YXN0ZSB0aGUgc3BhY2Ugc2luY2UgdGhlc2UgdHlwZXMgb2YgcmVsb2NzCisgICBhcmUgcmVsYXRpdmVseSByYXJlLiAgKi8KKworc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jCit7CisgIC8qIFJlbG9jIHR5cGUuICAqLworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CisKKyAgdW5pb24KKyAgICB7CisgICAgICAvKiBGb3IgdHlwZSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyLCB0aGlzIGlzIHRoZSBzZWN0aW9uCisJIHRoZSByZWxvYyBzaG91bGQgYmUgYWdhaW5zdC4gIFRoaXMgbXVzdCBiZSBhIHNlY3Rpb24gaW4gdGhlCisJIG91dHB1dCBCRkQsIG5vdCBhbnkgb2YgdGhlIGlucHV0IEJGRHMuICAqLworICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgICAvKiBGb3IgdHlwZSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCisJIHN5bWJvbCB0aGUgcmVsb2Mgc2hvdWxkIGJlIGFnYWluc3QuICAqLworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB9IHU7CisKKyAgLyogQWRkZW5kIHRvIHVzZS4gIFRoZSBvYmplY3QgZmlsZSBzaG91bGQgY29udGFpbiB6ZXJvLiAgVGhlIEJGRAorICAgICBiYWNrZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0CisgICAgIGZpbGUgY29ycmVjdGx5LiAgRm9yIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyAoZS5nLiwgQ09GRikgdGhlCisgICAgIGFkZGVuZCBtdXN0IGJlIHN0b3JlZCBpbnRvIGluIHRoZSBvYmplY3QgZmlsZSwgYW5kIGZvciBzb21lCisgICAgIChlLmcuLCBTUEFSQyBhLm91dCkgaXQgaXMga2VwdCBpbiB0aGUgcmVsb2MuICAqLworICBiZmRfdm1hIGFkZGVuZDsKK307CisKKy8qIEFsbG9jYXRlIGEgbmV3IGxpbmtfb3JkZXIgZm9yIGEgc2VjdGlvbi4gICovCitleHRlcm4gc3RydWN0IGJmZF9saW5rX29yZGVyICpiZmRfbmV3X2xpbmtfb3JkZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKKworLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgdXNlZCB0byBkZXNjcmliZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUKKyAgIEVMRiBsaW5rZXIuICBUaGVzZSBzdHJ1Y3R1cmVzIGNvdWxkIGJlIG1hbmlwdWxhdGVkIGVudGlyZWx5IGluc2lkZQorICAgQkZELCBidXQgaXQgd291bGQgYmUgYSBwYWluLiAgSW5zdGVhZCwgdGhlIHJlZ3VsYXIgbGlua2VyIHNldHMgdXAKKyAgIHRoZXNlIHN0cnVjdHVyZXMsIGFuZCB0aGVuIHBhc3NlcyB0aGVtIGludG8gQkZELiAgKi8KKworLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgYSB2ZXJzaW9uLiAgKi8KKworc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByCit7CisgIC8qIE5leHQgcmVndWxhciBleHByZXNzaW9uIGZvciB0aGlzIHZlcnNpb24uICAqLworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKm5leHQ7CisgIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbi4gICovCisgIGNvbnN0IGNoYXIgKnBhdHRlcm47CisgIC8qIE1hdGNoaW5nIGZ1bmN0aW9uLiAgKi8KKyAgaW50ICgqbWF0Y2gpIFBBUkFNUygoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIGNvbnN0IGNoYXIgKikpOworfTsKKworLyogVmVyc2lvbiBkZXBlbmRlbmNpZXMuICAqLworCitzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMKK3sKKyAgLyogTmV4dCBkZXBlbmRlbmN5IGZvciB0aGlzIHZlcnNpb24uICAqLworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm5leHQ7CisgIC8qIFRoZSB2ZXJzaW9uIHdoaWNoIHRoaXMgdmVyc2lvbiBkZXBlbmRzIHVwb24uICAqLworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnZlcnNpb25fbmVlZGVkOworfTsKKworLyogQSBub2RlIGluIHRoZSB2ZXJzaW9uIHRyZWUuICAqLworCitzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUKK3sKKyAgLyogTmV4dCB2ZXJzaW9uLiAgKi8KKyAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpuZXh0OworICAvKiBOYW1lIG9mIHRoaXMgdmVyc2lvbi4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIFZlcnNpb24gbnVtYmVyLiAgKi8KKyAgdW5zaWduZWQgaW50IHZlcm51bTsKKyAgLyogUmVndWxhciBleHByZXNzaW9ucyBmb3IgZ2xvYmFsIHN5bWJvbHMgaW4gdGhpcyB2ZXJzaW9uLiAgKi8KKyAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpnbG9iYWxzOworICAvKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBsb2NhbCBzeW1ib2xzIGluIHRoaXMgdmVyc2lvbi4gICovCisgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbG9jYWxzOworICAvKiBMaXN0IG9mIHZlcnNpb25zIHdoaWNoIHRoaXMgdmVyc2lvbiBkZXBlbmRzIHVwb24uICAqLworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlcHM7CisgIC8qIEluZGV4IG9mIHRoZSB2ZXJzaW9uIG5hbWUuICBUaGlzIGlzIHVzZWQgd2l0aGluIEJGRC4gICovCisgIHVuc2lnbmVkIGludCBuYW1lX2luZHg7CisgIC8qIFdoZXRoZXIgdGhpcyB2ZXJzaW9uIHRyZWUgd2FzIHVzZWQuICBUaGlzIGlzIHVzZWQgd2l0aGluIEJGRC4gICovCisgIGludCB1c2VkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JvdXQuaCBiL2luY2x1ZGUvYm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzI4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JvdXQuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgJ2Eub3V0LmgnLiAgSXQgaXMgdG8gYmUgdXNlZCBpbiBhbGwKKyAqIEdOVSB0b29scyBtb2RpZmllZCB0byBzdXBwb3J0IHRoZSBpODA5NjAgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgorICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCisgKgorICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAorICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCisgKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKKyAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwKKyAqIG9yIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgorICoKKyAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KKyAqCisgKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCisgKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKKyAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0CisgKgkgIGFjY29tbW9kYXRlKS4KKyAqCisgKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKKyAqCisgKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCisgKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCisgKgorICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQorICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCisgKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKKyAqCSAgbW9kaWZpY2F0aW9uLgorICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCisgKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTworICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09CisgKgorICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgorICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQorICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKKyAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCisgKi8KKworCisjZGVmaW5lIEJNQUdJQwkwNDE1CisvKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KKyAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KKyAqLworI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KKyNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCisjZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KKworLyogRklMRSBIRUFERVIKKyAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgorICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgorICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCisgKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgorICovCitzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyB7CisJLyogU3RhbmRhcmQgc3R1ZmYgKi8KKwl1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsJLyogSWRlbnRpZmllcyB0aGlzIGFzIGEgYi5vdXQgZmlsZSAqLworCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwkvKiBMZW5ndGggb2YgdGV4dCAqLworCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwkvKiBMZW5ndGggb2YgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07CQkvKiBMZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KKwl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSAqLworCXVuc2lnbmVkIGNoYXIgZV9lbnRyeVs0XTsJLyogUnVudGltZSBzdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvICovCisJdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvICovCisKKwkvKiBBZGRlZCBmb3IgaTk2MCAqLworCXVuc2lnbmVkIGNoYXIgZV90bG9hZFs0XTsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGNoYXIgZV9kbG9hZFs0XTsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGNoYXIgZV90YWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiB0ZXh0IHNlZ21lbnQgKi8KKwl1bnNpZ25lZCBjaGFyIGVfZGFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50ICovCisJdW5zaWduZWQgY2hhciBlX2JhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50ICovCisJdW5zaWduZWQgY2hhciBlX3JlbGF4YWJsZVsxXTsJLyogQXNzZW1ibGVkIHdpdGggZW5vdWdoIGluZm8gdG8gYWxsb3cgbGlua2VyIHRvIHJlbGF4ICovCit9OworCisjZGVmaW5lCUVYRUNfQllURVNfU0laRQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYykpCisKKy8qIFRoZXNlIG1hY3JvcyB1c2UgdGhlIGFfeHh4IGZpZWxkIG5hbWVzLCBzaW5jZSB0aGV5IG9wZXJhdGUgb24gdGhlIGV4ZWMKKyAgIHN0cnVjdHVyZSBhZnRlciBpdCdzIGJlZW4gYnl0ZS1zd2FwcGVkIGFuZCByZWFsaWduZWQgb24gdGhlIGhvc3QgbWFjaGluZS4gKi8KKyNkZWZpbmUgTl9CQURNQUcoeCkJKCgoeCkuYV9pbmZvKSE9Qk1BR0lDKQorI2RlZmluZSBOX1RYVE9GRih4KQlFWEVDX0JZVEVTX1NJWkUKKyNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQorI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKKyNkZWZpbmUgTl9UUkVMT0ZGCU5fVFJPRkYKKyNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQorI2RlZmluZSBOX0RSRUxPRkYJTl9EUk9GRgorI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQorI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCisjZGVmaW5lIE5fREFUQUREUih4KQkoICh4KS5hX2Rsb2FkICkgICAgCisKKy8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLworI2lmICFkZWZpbmVkIChOX1RYVEFERFIpCisjZGVmaW5lIE5fVFhUQUREUih4KSAwCisjZW5kaWYKKworLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQorICovCitzdHJ1Y3Qgbmxpc3QgeworCXVuaW9uIHsKKwkJY2hhcgkqbl9uYW1lOworCQlzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKKwkJbG9uZwluX3N0cng7CQkvKiBJbmRleCBpbnRvIHN0cmluZyB0YWJsZQkqLworCX0gbl91bjsKKwl1bnNpZ25lZCBjaGFyIG5fdHlwZTsJLyogU2VlIGJlbG93CQkJCSovCisJY2hhcgluX290aGVyOwkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLworCXNob3J0CW5fZGVzYzsKKwl1bnNpZ25lZCBsb25nIG5fdmFsdWU7Cit9OworCisKKy8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUKKyAqLworI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sCSovCisjZGVmaW5lIE5fQUJTCTIJLyogQWJzb2x1dGUgc3ltYm9sCSovCisjZGVmaW5lIE5fVEVYVAk0CS8qIFRleHQgc3ltYm9sCQkqLworI2RlZmluZSBOX0RBVEEJNgkvKiBEYXRhIHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9CU1MJOAkvKiBCU1Mgc3ltYm9sCQkqLworI2RlZmluZSBOX0ZOCTMxCS8qIEZpbGVuYW1lIHN5bWJvbAkqLworCisjZGVmaW5lIE5fRVhUCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLworI2RlZmluZSBOX1RZUEUJMDM2CS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KKyNkZWZpbmUgTl9TVEFCCTAzNDAJLyogTWFzayBmb3IgYWxsIGJpdHMgdXNlZCBmb3IgU0RCIGVudHJpZXMgCSovCisKKy8qIE1FQU5JTkcgT0YgJ25fb3RoZXInCisgKgorICogSWYgbm9uLXplcm8sIHRoZSAnbl9vdGhlcicgZmllbGRzIGluZGljYXRlcyBlaXRoZXIgYSBsZWFmIHByb2NlZHVyZSBvcgorICogYSBzeXN0ZW0gcHJvY2VkdXJlLCBhcyBmb2xsb3dzOgorICoKKyAqCTEgPD0gbl9vdGhlciA8PSAzMiA6CisgKgkJVGhlIHN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlLgorICoJCSduX3ZhbHVlJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFzIGZvciBhbnkgb3RoZXIKKyAqCQlwcm9jZWR1cmUuICBUaGUgc3lzdGVtIHByb2NlZHVyZSBudW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkIGluCisgKgkJYSAnY2FsbHMnIGluc3RydWN0aW9uKSBpcyAobl9vdGhlci0xKS4gIFRoZXNlIGVudHJpZXMgY29tZSBmcm9tCisgKgkJJy5zeXNwcm9jJyBkaXJlY3RpdmVzLgorICoKKyAqCW5fb3RoZXIgPT0gTl9DQUxMTkFNRQorICoJCXRoZSBzeW1ib2wgaXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgorICoJCVRoZSAqbmV4dCogc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZworICoJCSdiYWwnIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9jZWR1cmUgKHNlZSBmb2xsb3dpbmcpLiAgVGhlc2UKKyAqCQllbnRyaWVzIGNvbWUgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIHR3byBkaWZmZXJlbnQKKyAqCQlzeW1ib2xzIGFyZSBzcGVjaWZpZWQgKHRoZSBmaXJzdCBvbmUgaXMgcmVwcmVzZW50ZWQgaGVyZSkuCisgKgkKKyAqCisgKgluX290aGVyID09IE5fQkFMTkFNRQorICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCisgKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKKyAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCisgKgkJc3BlY2lmaWVkIHR3aWNlLgorICoKKyAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCisgKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KKyAqLworI2RlZmluZSBOX0NBTExOQU1FCSgoY2hhciktMSkKKyNkZWZpbmUgTl9CQUxOQU1FCSgoY2hhciktMikKKyNkZWZpbmUgSVNfQ0FMTE5BTUUoeCkJKE5fQ0FMTE5BTUUgPT0gKHgpKQorI2RlZmluZSBJU19CQUxOQU1FKHgpCShOX0JBTE5BTUUgPT0gKHgpKQorI2RlZmluZSBJU19PVEhFUih4KQkoKHgpPjAgJiYgKHgpIDw9MzIpCisKKyNkZWZpbmUgYl9vdXRfcmVsb2NhdGlvbl9pbmZvIHJlbG9jYXRpb25faW5mbworc3RydWN0IHJlbG9jYXRpb25faW5mbyB7CisJaW50CSByX2FkZHJlc3M7CS8qIEZpbGUgYWRkcmVzcyBvZiBpdGVtIHRvIGJlIHJlbG9jYXRlZAkqLworCXVuc2lnbmVkCisjZGVmaW5lIHJfaW5kZXggcl9zeW1ib2xudW0KKwkJcl9zeW1ib2xudW06MjQsLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQsCisJCQkJKglpZiByX2V4dGVybiBpcyBzZXQuICBPdGhlcndpc2Ugc2V0IHRvCisJCQkJKgllaXRoZXIgTl9URVhULCBOX0RBVEEsIG9yIE5fQlNTIHRvCisJCQkJKglpbmRpY2F0ZSBzZWN0aW9uIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMKKwkJCQkqCWJhc2VkLgorCQkJCSovCisJCXJfcGNyZWw6MSwJLyogMSA9PiByZWxvY2F0ZSBQQy1yZWxhdGl2ZTsgZWxzZSBhYnNvbHV0ZQorCQkJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0CisJCQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCisJCQkJICovCisJCXJfbGVuZ3RoOjIsCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKKwkJCQkgKgkwID0+IDEgYnl0ZQorCQkJCSAqCTEgPT4gMiBieXRlcyAtLSB1c2VkIGZvciAxMyBiaXQgcGNyZWwKKwkJCQkgKgkyID0+IDQgYnl0ZXMgCisJCQkJICovCisJCXJfZXh0ZXJuOjEsCisJCXJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KKwkJcl9kaXNwOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KKwkJcl9jYWxsajoxLAkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLworCQlyX3JlbGF4YWJsZToxOwkvKiAxIGlmIGVub3VnaCBpbmZvIGlzIGxlZnQgdG8gcmVsYXgKKwkJCQkgICB0aGUgZGF0YSAqLworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc1Mjg0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYWxsYmFjay5oCkBAIC0wLDAgKzEsMjcwIEBACisvKiBSZW1vdGUgdGFyZ2V0IHN5c3RlbSBjYWxsIGNhbGxiYWNrIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpbnRlcmZhY2UgaXNuJ3QgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIga2luZAorICAgb2YgcmVtb3RlIChoYXJkd2FyZSwgc2ltdWxhdG9yLCB3aGF0ZXZlcikuICBBcyBzdWNoLCBzdXBwb3J0IGZvciBpdAorICAgKGUuZy4gc2ltL2NvbW1vbi9jYWxsYmFjay5jKSBzaG91bGQgKm5vdCogbGl2ZSBpbiB0aGUgc2ltdWxhdG9yIHNvdXJjZQorICAgdHJlZSwgbm9yIHNob3VsZCBpdCBsaXZlIGluIHRoZSBnZGIgc291cmNlIHRyZWUuICAqLworCisvKiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGhhbmRsZSBzeXN0ZW0gY2FsbHM6CisKKyAgIDEpIEhhdmUgYSBzaW11bGF0b3IgaW50ZXJjZXB0IHRoZSBhcHByb3ByaWF0ZSB0cmFwIGluc3RydWN0aW9uIGFuZAorICAgZGlyZWN0bHkgcGVyZm9ybSB0aGUgc3lzdGVtIGNhbGwgb24gYmVoYWxmIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbS4KKyAgIFRoaXMgaXMgdGhlIHR5cGljYWwgd2F5IG9mIGhhbmRsaW5nIHN5c3RlbSBjYWxscyBmb3IgZW1iZWRkZWQgdGFyZ2V0cy4KKyAgIFtIYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMgaXNuJ3QgdGhhdCBtdWNoIG9mIGFuCisgICBveHltb3JvbiBhcyBydW5uaW5nIGNvbXBpbGVyIHRlc3RzdWl0ZXMgbWFrZSB1c2Ugb2YgdGhlIGNhcGFiaWxpdHkuXQorCisgICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKKyAgIGlzIEVOVklST05NRU5UX1VTRVIuCisKKyAgIDIpIEhhdmUgYSBzaW11bGF0b3IgZW11bGF0ZSB0aGUgaGFyZHdhcmUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAgIElmIHRoZSBwcm9ncmFtIHJ1bm5pbmcgb24gdGhlIHJlYWwgaGFyZHdhcmUgY29tbXVuaWNhdGVzIHdpdGggc29tZSBzb3J0CisgICBvZiB0YXJnZXQgbWFuYWdlciwgb25lIHdvdWxkIHdhbnQgdG8gYmUgYWJsZSB0byBydW4gdGhpcyBwcm9ncmFtIG9uIHRoZQorICAgc2ltdWxhdG9yIGFzIHdlbGwuCisKKyAgIFRoaXMgbWV0aG9kIG9mIHN5c3RlbSBjYWxsIGhhbmRsaW5nIGlzIGRvbmUgd2hlbiBTVEFURV9FTlZJUk9OTUVOVAorICAgaXMgRU5WSVJPTk1FTlRfT1BFUkFUSU5HLgorKi8KKworI2lmbmRlZiBDQUxMQkFDS19ICisjZGVmaW5lIENBTExCQUNLX0gKKworLyogPz8/IFRoZSByZWFzb24gd2h5IHdlIGNoZWNrIGZvciB2YV9zdGFydCBoZXJlIHNob3VsZCBiZSBkb2N1bWVudGVkLiAgKi8KKworI2lmbmRlZiB2YV9zdGFydAorI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisMCisvKiBNYXBwaW5nIG9mIGhvc3QvdGFyZ2V0IHZhbHVlcy4gICovCisvKiA/Pz8gRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb25lIG1pZ2h0IHdhbnQgdG8gYWRkIGEgc3RyaW5nIG9mIHRoZQorICAgbmFtZSBvZiB0aGUgc3ltYm9sLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaG9zdF92YWw7CisgIGludCB0YXJnZXRfdmFsOworfSBDQl9UQVJHRVRfREVGU19NQVA7CisKKyNkZWZpbmUgTUFYX0NBTExCQUNLX0ZEUyAxMAorCisvKiBGb3J3YXJkIGRlY2wgZm9yIHN0YXQvZnN0YXQuICAqLworc3RydWN0IHN0YXQ7CisKK3R5cGVkZWYgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0IGhvc3RfY2FsbGJhY2s7CisKK3N0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAKK3sKKyAgaW50ICgqY2xvc2UpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQpKTsKKyAgaW50ICgqZ2V0X2Vycm5vKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKKyAgaW50ICgqaXNhdHR5KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOworICBpbnQgKCpsc2VlaykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGxvbmcgLCBpbnQpKTsKKyAgaW50ICgqb3BlbikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyKiwgaW50IG1vZGUpKTsKKyAgaW50ICgqcmVhZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgIGNoYXIgKiwgaW50KSk7CisgIGludCAoKnJlYWRfc3RkaW4pIFBBUkFNUyAoKCBob3N0X2NhbGxiYWNrICosIGNoYXIgKiwgaW50KSk7CisgIGludCAoKnJlbmFtZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICBpbnQgKCpzeXN0ZW0pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7CisgIGxvbmcgKCp0aW1lKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGxvbmcgKikpOworICBpbnQgKCp1bmxpbmspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqKSk7CisgIGludCAoKndyaXRlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50LCBjb25zdCBjaGFyICosIGludCkpOworICBpbnQgKCp3cml0ZV9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKyAgdm9pZCAoKmZsdXNoX3N0ZG91dCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7CisgIGludCAoKndyaXRlX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIGludCkpOworICB2b2lkICgqZmx1c2hfc3RkZXJyKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKKyAgaW50ICgqc3RhdCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopKTsKKyAgaW50ICgqZnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBzdHJ1Y3Qgc3RhdCAqKSk7CisKKyAgLyogV2hlbiBwcmVzZW50LCBjYWxsIHRvIHRoZSBjbGllbnQgdG8gZ2l2ZSBpdCB0aGUgb3BvcnR1bml0eSB0bworICAgICBwb2xsIGFueSBpbyBkZXZpY2VzIGZvciBhIHJlcXVlc3QgdG8gcXVpdCAoaW5kaWNhdGVkIGJ5IGEgbm9uemVybworICAgICByZXR1cm4gdmFsdWUpLiAqLworICBpbnQgKCpwb2xsX3F1aXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOworCisgIC8qIFVzZWQgd2hlbiB0aGUgdGFyZ2V0IGhhcyBnb25lIGF3YXksIHNvIHdlIGNhbiBjbG9zZSBvcGVuCisgICAgIGhhbmRsZXMgYW5kIGZyZWUgbWVtb3J5IGV0YyBldGMuICAqLworICBpbnQgKCpzaHV0ZG93bikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7CisgIGludCAoKmluaXQpICAgICBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKKworICAvKiBkZXByZWNpYXRlZCwgdXNlIHZwcmludGZfZmlsdGVyZWQgLSBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCisgIHZvaWQgKCpwcmludGZfZmlsdGVyZWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKKworICAvKiBUYWxrIHRvIHRoZSB1c2VyIG9uIGEgY29uc29sZS4gICovCisgIHZvaWQgKCp2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworCisgIC8qIFNhbWUgYXMgdnByaW50Zl9maWx0ZXJlZCBidXQgdG8gc3RkZXJyLiAgKi8KKyAgdm9pZCAoKmV2cHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworCisgIC8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kICJleGl0Ii4KKyAgICAgSW4gdGhlIGNhc2Ugb2YgZ2RiICJleGl0aW5nIiBtZWFucyBkb2luZyBhIGxvbmdqbXAgYmFjayB0byB0aGUgbWFpbgorICAgICBjb21tYW5kIGxvb3AuICAqLworICB2b2lkICgqZXJyb3IpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKKworICBpbnQgbGFzdF9lcnJubzsJCS8qIGhvc3QgZm9ybWF0ICovCisKKyAgaW50IGZkbWFwW01BWF9DQUxMQkFDS19GRFNdOworICBjaGFyIGZkb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKKyAgY2hhciBhbHdheXNvcGVuW01BWF9DQUxMQkFDS19GRFNdOworCisgIC8qIFN5c3RlbSBjYWxsIG51bWJlcnMuICAqLworICBDQl9UQVJHRVRfREVGU19NQVAgKnN5c2NhbGxfbWFwOworICAvKiBFcnJubyB2YWx1ZXMuICAqLworICBDQl9UQVJHRVRfREVGU19NQVAgKmVycm5vX21hcDsKKyAgLyogRmxhZ3MgdG8gdGhlIG9wZW4gc3lzdGVtIGNhbGwuICAqLworICBDQl9UQVJHRVRfREVGU19NQVAgKm9wZW5fbWFwOworICAvKiBTaWduYWwgbnVtYmVycy4gICovCisgIENCX1RBUkdFVF9ERUZTX01BUCAqc2lnbmFsX21hcDsKKyAgLyogTGF5b3V0IG9mIGBzdGF0JyBzdHJ1Y3QuCisgICAgIFRoZSBmb3JtYXQgaXMgYSBzZXJpZXMgb2YgIm5hbWUsbGVuZ3RoIiBwYWlycyBzZXBhcmF0ZWQgYnkgY29sb25zLgorICAgICBFbXB0eSBzcGFjZSBpcyBpbmRpY2F0ZWQgd2l0aCBhIGBuYW1lJyBvZiAic3BhY2UiLgorICAgICBBbGwgcGFkZGluZyBtdXN0IGJlIGV4cGxpY2l0bHkgbWVudGlvbmVkLgorICAgICBMZW5ndGhzIGFyZSBpbiBieXRlcy4gIElmIHRoaXMgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gYml0cywKKyAgICAgdXNlICJuYW1lLmJpdHMiLgorICAgICBFeGFtcGxlOiAic3RfZGV2LDQ6c3RfaW5vLDQ6c3RfbW9kZSw0Oi4uLiIgICovCisgIGNvbnN0IGNoYXIgKnN0YXRfbWFwOworCisgIC8qIE1hcmtlciBmb3IgdGhvc2Ugd2FudGluZyB0byBkbyBzYW5pdHkgY2hlY2tzLgorICAgICBUaGlzIHNob3VsZCByZW1haW4gdGhlIGxhc3QgbWVtYmVyIG9mIHRoaXMgc3RydWN0IHRvIGhlbHAgY2F0Y2gKKyAgICAgbWlzY29tcGlsYXRpb24gZXJyb3JzLiAqLworI2RlZmluZSBIT1NUX0NBTExCQUNLX01BR0lDIDQ3MDUgLyogdGVkcyBjb25zdGFudCAqLworICBpbnQgbWFnaWM7Cit9OworCitleHRlcm4gaG9zdF9jYWxsYmFjayBkZWZhdWx0X2NhbGxiYWNrOworDAorLyogQ2Fub25pY2FsIHZlcnNpb25zIG9mIHN5c3RlbSBjYWxsIG51bWJlcnMuCisgICBJdCdzIG5vdCBpbnRlbmRlZCB0byB3aWxseS1uaWxseSB0aHJvdyBldmVyeSBzeXN0ZW0gY2FsbCBldmVyIGhlYXJkCisgICBvZiBpbiBoZXJlLiAgT25seSBpbmNsdWRlIHRob3NlIHRoYXQgaGF2ZSBhbiBpbXBvcnRhbnQgdXNlLgorICAgPz8/IE9uZSBjYW4gY2VydGFpbmx5IHN0YXJ0IGEgZGlzY3Vzc2lvbiBvdmVyIHRoZSBvbmVzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgaGVyZSwgYnV0IHRoYXQgd2lsbCBhbHdheXMgYmUgdHJ1ZS4gICovCisKKy8qIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBBTlNJIEMgc3VwcG9ydCBvZiBsaWJjLiAgKi8KKyNkZWZpbmUJQ0JfU1lTX2V4aXQJMQorI2RlZmluZQlDQl9TWVNfb3BlbgkyCisjZGVmaW5lCUNCX1NZU19jbG9zZQkzCisjZGVmaW5lCUNCX1NZU19yZWFkCTQKKyNkZWZpbmUJQ0JfU1lTX3dyaXRlCTUKKyNkZWZpbmUJQ0JfU1lTX2xzZWVrCTYKKyNkZWZpbmUJQ0JfU1lTX3VubGluawk3CisjZGVmaW5lCUNCX1NZU19nZXRwaWQJOAorI2RlZmluZQlDQl9TWVNfa2lsbAk5CisjZGVmaW5lIENCX1NZU19mc3RhdCAgICAxMAorLyojZGVmaW5lIENCX1NZU19zYnJrCTExIC0gbm90IGN1cnJlbnRseSBhIHN5c3RlbSBjYWxsLCBidXQgcmVzZXJ2ZWQuICAqLworCisvKiBBUkdWIHN1cHBvcnQuICAqLworI2RlZmluZSBDQl9TWVNfYXJndmxlbgkxMgorI2RlZmluZSBDQl9TWVNfYXJndgkxMworCisvKiBUaGVzZSBhcmUgZXh0cmFzIGFkZGVkIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLworI2RlZmluZSBDQl9TWVNfY2hkaXIJMTQKKyNkZWZpbmUgQ0JfU1lTX3N0YXQJMTUKKyNkZWZpbmUgQ0JfU1lTX2NobW9kIAkxNgorI2RlZmluZSBDQl9TWVNfdXRpbWUgCTE3CisjZGVmaW5lIENCX1NZU190aW1lIAkxOAorDAorLyogU3RydWN0IHVzZSB0byBwYXNzIGFuZCByZXR1cm4gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHBlcmZvcm0gYQorICAgc3lzdGVtIGNhbGwuICAqLworLyogRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgdGFyZ2V0IHdvcmQgc2l6ZS4gICovCisKK3R5cGVkZWYgc3RydWN0IGNiX3N5c2NhbGwgeworICAvKiBUaGUgdGFyZ2V0J3MgdmFsdWUgb2Ygd2hhdCBzeXN0ZW0gY2FsbCB0byBwZXJmb3JtLiAgKi8KKyAgaW50IGZ1bmM7CisgIC8qIFRoZSBhcmd1bWVudHMgdG8gdGhlIHN5c2NhbGwuICAqLworICBsb25nIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQ7CisKKyAgLyogVGhlIHJlc3VsdC4gICovCisgIGxvbmcgcmVzdWx0OworICAvKiBTb21lIHN5c3RlbSBjYWxscyBoYXZlIHR3byByZXN1bHRzLiAgKi8KKyAgbG9uZyByZXN1bHQyOworICAvKiBUaGUgdGFyZ2V0J3MgZXJybm8gdmFsdWUsIG9yIDAgaWYgc3VjY2Vzcy4KKyAgICAgVGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCdzIHZhbHVlIHdpdGggaG9zdF90b190YXJnZXRfZXJybm8uICAqLworICBpbnQgZXJyY29kZTsKKworICAvKiBXb3JraW5nIHNwYWNlIHRvIGJlIHVzZWQgYnkgbWVtb3J5IHJlYWQvd3JpdGUgY2FsbGJhY2tzLiAgKi8KKyAgUFRSIHAxOworICBQVFIgcDI7CisgIGxvbmcgeDEseDI7CisKKyAgLyogQ2FsbGJhY2tzIGZvciByZWFkaW5nL3dyaXRpbmcgbWVtb3J5IChlLmcuIGZvciByZWFkL3dyaXRlIHN5c2NhbGxzKS4KKyAgICAgPz8/IGxvbmcgb3IgdW5zaWduZWQgbG9uZyBtaWdodCBiZSBiZXR0ZXIgdG8gdXNlIGZvciB0aGUgYGNvdW50JworICAgICBhcmd1bWVudCBoZXJlLiAgV2UgbWltaWMgc2ltX3tyZWFkLHdyaXRlfSBmb3Igbm93LiAgQmUgY2FyZWZ1bCB0bworICAgICB0ZXN0IGFueSBjaGFuZ2VzIHdpdGggLVdhbGwgLVdlcnJvciwgbWl4ZWQgc2lnbmVkIGNvbXBhcmlzb25zCisgICAgIHdpbGwgZ2V0IHlvdS4gICovCisgIGludCAoKnJlYWRfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgLyp0YWRkciovLCBjaGFyICogLypidWYqLywKKwkJCSAgIGludCAvKmJ5dGVzKi8pKTsKKyAgaW50ICgqd3JpdGVfbWVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICogLypjYiovLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqIC8qc2MqLywKKwkJCSAgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY29uc3QgY2hhciAqIC8qYnVmKi8sCisJCQkgICAgaW50IC8qYnl0ZXMqLykpOworCisgIC8qIEZvciBzYW5pdHkgY2hlY2tpbmcsIHNob3VsZCBiZSBsYXN0IGVudHJ5LiAgKi8KKyAgaW50IG1hZ2ljOworfSBDQl9TWVNDQUxMOworCisvKiBNYWdpYyBudW1iZXIgc2FuaXR5IGNoZWNrZXIuICAqLworI2RlZmluZSBDQl9TWVNDQUxMX01BR0lDIDB4MTIzNDQzMjEKKworLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBDQl9TWVNDQUxMLiAgQ2FsbGVkIGZpcnN0LCBiZWZvcmUgZmlsbGluZyBpbgorICAgYW55IGZpZWxkcy4gICovCisjZGVmaW5lIENCX1NZU0NBTExfSU5JVChzYykgXAorZG8geyBcCisgIG1lbXNldCAoKHNjKSwgMCwgc2l6ZW9mICgqKHNjKSkpOyBcCisgIChzYyktPm1hZ2ljID0gQ0JfU1lTQ0FMTF9NQUdJQzsgXAorfSB3aGlsZSAoMCkKKwwKKy8qIFJldHVybiBjb2RlcyBmb3IgdmFyaW91cyBpbnRlcmZhY2Ugcm91dGluZXMuICAqLworCit0eXBlZGVmIGVudW0geworICBDQl9SQ19PSyA9IDAsCisgIC8qIGdlbmVyaWMgZXJyb3IgKi8KKyAgQ0JfUkNfRVJSLAorICAvKiBlaXRoZXIgZmlsZSBub3QgZm91bmQgb3Igbm8gcmVhZCBhY2Nlc3MgKi8KKyAgQ0JfUkNfQUNDRVNTLAorICBDQl9SQ19OT19NRU0KK30gQ0JfUkM7CisKKy8qIFJlYWQgaW4gdGFyZ2V0IHZhbHVlcyBmb3Igc3lzdGVtIGNhbGwgbnVtYmVycywgZXJybm8gdmFsdWVzLCBzaWduYWxzLiAgKi8KK0NCX1JDIGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOworCisvKiBUcmFuc2xhdGUgdGFyZ2V0IHRvIGhvc3Qgc3lzY2FsbCBmdW5jdGlvbiBudW1iZXJzLiAgKi8KK2ludCBjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7CisKKy8qIFRyYW5zbGF0ZSBob3N0IHRvIHRhcmdldCBlcnJubyB2YWx1ZS4gICovCitpbnQgY2JfaG9zdF90b190YXJnZXRfZXJybm8gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKKworLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IG9wZW4gZmxhZ3MuICAqLworaW50IGNiX3RhcmdldF90b19ob3N0X29wZW4gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKKworLyogVHJhbnNsYXRlIHRhcmdldCBzaWduYWwgbnVtYmVyIHRvIGhvc3QuICAqLworaW50IGNiX3RhcmdldF90b19ob3N0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOworCisvKiBUcmFuc2xhdGUgaG9zdCBzaWduYWwgbnVtYmVyIHRvIHRhcmdldC4gICovCitpbnQgY2JfaG9zdF90b190YXJnZXRfc2lnbmFsIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7CisKKy8qIFRyYW5zbGF0ZSBob3N0IHN0YXQgc3RydWN0IHRvIHRhcmdldC4KKyAgIElmIHN0YXQgc3RydWN0IHB0ciBpcyBOVUxMLCBqdXN0IGNvbXB1dGUgdGFyZ2V0IHN0YXQgc3RydWN0IHNpemUuCisgICBSZXN1bHQgaXMgc2l6ZSBvZiB0YXJnZXQgc3RhdCBzdHJ1Y3Qgb3IgMCBpZiBlcnJvci4gICovCitpbnQgY2JfaG9zdF90b190YXJnZXRfc3RhdCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IHN0cnVjdCBzdGF0ICosIFBUUikpOworCisvKiBQZXJmb3JtIGEgc3lzdGVtIGNhbGwuICAqLworQ0JfUkMgY2Jfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIENCX1NZU0NBTEwgKikpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDZlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNzkzIEBACisxOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBtY29yZS5oIChHRVRfTElORU5PX0xOTk8pOiBOZXcgbWFjcm8uCisJKFBVVF9MSU5FTk9fTE5OTyk6IE5ldyBtYWNyby4KKworMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKKwlwcm9jZXNzb3IuIAorCitTdW4gRGVjICA2IDIxOjM2OjM3IDE5OTggIE1hcmsgRWxicmVjaHQgIDxzbm93YmFsbDNAdXNhLm5ldD4KKworCSogaW50ZXJuYWwuaCAoQ19XRUFLRVhUKTogRGVmaW5lLgorCitXZWQgSmFuIDI3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBjb2ZmL2FybS5oIChGX1BJQ19JTlQsIEZfQVJNXzIsIEZfQVJNXzMsIEZfQVJNXzQsIEZfQVBDUzI2KToKKwlDaGFuZ2VkIHZhbHVlcyB0byBhdm9pZCBjbGFzaGluZyB3aXRoIElNQUdFX0ZJTEVfKiBjb2ZmIGhlYWRlcgorCWZsYWcgdmFsdWVzLgorCQorV2VkIEFwciAgMSAxNjowNjoxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oOiBEb2N1bWVudCBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCBUaHVtYiBzeW1ib2wKKwl0eXBlcy4gCisKK0ZyaSBNYXIgMjcgMTc6MTY6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChJU1BUUiwgSVNGQ04sIElTQVJZKTogQWRkIGNhc3RzIHRvIHVuc2lnbmVkIGxvbmcuCisKK01vbiBGZWIgIDIgMTc6MTA6MzggMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KKworCSogdGljMzAuaDogTmV3IGZpbGUuCisKK0ZyaSBEZWMgMTIgMTE6NDk6MDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLmggKFJfTVBQQ1IxNVcpOiBOZXcgcmVsb2NhdGlvbiB0eXBlLCBmb3IgMTUgYml0IFBDIHJlbGF0aXZlCisJb2Zmc2V0cy4KKworVHVlIERlYyAgMiAxMDoyMTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm0uaCAoQ09GRkFSTSk6IE5ldyBkZWZpbmUuCisKK1NhdCBOb3YgMjIgMTU6MTA6MTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogaW50ZXJuYWwuaCAoQ19USFVNQkVYVEZVTkMsIENfVEhVTUJTVEFURlVOQyk6IENvbnN0YW50cyB0bworCWRlZmluZSBzdGF0aWMgYW5kIGV4dGVybmFsIGZ1bmN0aW9ucy4KKworCSogYXJtLmg6IEFkZCBiaXRzIHRvIHN1cHBvcnQgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMsCisJd2hlbiBpbXBsZW1lbnRlZC4KKworRnJpIE9jdCAgMyAxNDoyNToxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAuaCAoUl9QUEwxNkIpOiBNYWtlIGNvbnN0YW50IHVwcGVyY2FzZSBmb3IgY29uc2lzdGVuY3kuCisKK1R1ZSBKdWwgMjIgMTg6MTg6NTggMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgorCisJKiBnbzMyZXhlLmg6IE5ldyBmaWxlLgorCitUdWUgSnVsICA4IDEyOjIzOjU1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oIChUSUM4MF9UQVJHRVRfSUQpOiBBZGQgZGVmaW5lLgorCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIpOiBBZGQgZl90YXJnZXRfaWQgZmllbGQuCisKK1R1ZSBKdW4gIDMgMTY6NDQ6MTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogaW50ZXJuYWwuaDogQWRkIHN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scworCitNb24gTWF5IDI2IDE0OjA3OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogdGljODAuaCAoUl9QUEwxNkIpOiBDb3JyZWN0IHZhbHVlLgorCitTYXQgTWF5ICAzIDA4OjI0OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChDX1VFWFQsIENfU1RBVExBQiwgQ19FWFRMQUIsIENfU1lTVEVNKToKKwlOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MC4KKworRnJpIEFwciAxOCAxMTo1Mjo1NSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgorCisJKiBhbHBoYS5oIChBTFBIQV9FQ09GRl9CQURNQUcpOiBSZWNvZ25pemUgKkJTRC9hbHBoYSBtYWdpYyB0b28uCisJKEFMUEhBX1JfTElURVJBTFNMRUFaWSk6IERlZmluZS4KKwkqIGVjb2ZmLmggKEFMUEhBX01BR0lDX0JTRCk6IERlZmluZS4KKworV2VkIEphbiAyOSAxMTozMTo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGk5NjAuaCAoUl9JUFIxMywgUl9BTElHTik6IERlZmluZS4KKworTW9uIEphbiAyNyAxMzozNDozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGludGVybmFsLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiBNb3ZlIGRlZmluaXRpb25zCisJZnJvbSBoZXJlLi4uCisJKiBpOTYwLmggKFJfSVBSTUVELCBSX09QVENBTEwsIFJfT1BUQ0FMTFgpOiAuLi50byBoZXJlLgorCitXZWQgSmFuIDIyIDIwOjEwOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oIChUSUM4ME1BR0lDKTogUmVuYW1lZCB0byBUSUM4MF9BT1VUSERSX01BR0lDLgorCitGcmkgRGVjIDI3IDIyOjA1OjQ1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oOiBOZXcgZmlsZSBmb3IgVEljODAgc3VwcG9ydC4KKworVGh1IERlYyAxOSAxNjoxODoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFybS5oIChfTElUKTogRGVmaW5lLgorCitGcmkgSnVuIDI4IDEyOjU0OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcGUuaCAoRklMSFNaKTogRGVmaW5lLgorCitXZWQgSnVuIDI2IDE2OjI0OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogQWxsIGZpbGVzOiBEZWZpbmUgRklMSFNaLCBBT1VUU1osIEFPVVRIRFJTWiwgU0NOSFNaLCBTWU1FU1osCisJQVVYRVNaLCBMSU5FU1osIFJFTFNaIGFzIG51bWVyaWMgY29uc3RhbnRzIHJhdGhlciB0aGFuIHVzZXMgb2YKKwlzaXplb2YuICBEZWZpbmUgQU9VVEhEUlNaIGluIGFsbCBmaWxlcy4KKwkqIHBlLmggKEFPVVRTWik6IERlZmluZSBieSBhZGRpbmcgdG8gQU9VVEhEUlNaLgorCitGcmkgSnVuIDIxIDExOjE3OjQ2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBhbHBoYS5oOiBBZGQgZGVjbGFyYXRpb25zIGZvciByZWxvY2F0aW9uIHR5cGVzIGFkZGVkIGZvciBBbHBoYQorIAlPU0YvMSAzLjAuCisKK1R1ZSBKdW4gMTggMTY6MDQ6MjkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGg4MzAwLmggKEg4MzAwU01BR0lDKTogRGVmaW5lLgorCShIODMwMFNCQURNQUcpOiBEZWZpbmUuCisKK01vbiBKdW4gMTAgMTE6NTM6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oIChSX0JDQ19JTlYsIFJfSk1QX0RFTCk6IE5ldyByZWxvY2F0aW9ucyBmb3IKKwlyZWxheGluZyBpbiB0aGUgSDgvMzAwIHNlcmllcy4KKworVGh1IE1heSAxNiAxNTo0OToyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNoLmggKFJfU0hfQ09ERSwgUl9TSF9EQVRBLCBSX1NIX0xBQkVMKTogRGVmaW5lLgorCitUdWUgTWF5ICA3IDAwOjM2OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaCAoUl9KTVBMMik6IFJlbmFtZWQgZnJvbSBSX0pNUExfQjggdG8gYmUKKwljb25zaXN0ZW50IHdpdGggb3RoZXIgc2ltaWxhciByZWxvY3MuCisKKwkqIGludGVybmFsLmggKEg4LzMwMCBzcGVjaWZpYyByZWxvY3MpOiBBZGQgY29tbWVudHMgYmV0dGVyCisJZXhwbGFpbmluZyB3aGF0IGVhY2ggcmVsb2MgaXMgdXNlZCBmb3IuCisJKFJfTU9WMTZCMSwgUl9NT1YxNkIyKTogUmVuYW1lZCBmcm9tIFJfTU9WQjEgYW5kIFJfTU9WQjIuCisJKFJfTU9WMjRCMSwgUl9NT1YyNEIyKTogUmVuYW1lZCBmcm9tIFJfTU9WTEIxIGFuZCBSX01PVkxCMi4KKwkoUl9NT1ZMMSwgUl9NT1ZMMik6IE5ldyByZWxvY3MuCisJCitGcmkgTWF5ICAzIDEzOjAxOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaCAoUl9QQ1JXT1JEX0IpOiBEZWZpbmUgZm9yIHRoZSBoODMwMCByZWxheGluZworCWxpbmtlci4KKworV2VkIE1heSAgMSAxOToyMTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGludGVybmFsLmggKFNDTk5NTEVOKTogRGVmaW5lLgorCShzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyKTogVXNlIFNDTk5NTEVOIGZvciBzX25hbWUgZmllbGQuCisKK0ZyaSBNYXIgMjkgMTM6NDE6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwZS5oOiBEZWZpbmUgSU1BR0VfQ09NREFUIGNvZGVzLgorCitXZWQgTWFyIDI3IDE3OjI5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYXJtLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IEFkZCB4X2NoZWNrc3VtLCB4X2Fzc29jaWF0ZWQsIGFuZAorCXhfY29tZGF0IGZpZWxkcyB0byB4X3NjbiBzdHJ1Y3QuCisJKiBpMzg2LmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgorCSogcG93ZXJwYy5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBMaWtld2lzZS4KKwkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgorCitUaHUgTWFyIDIxIDE2OjI1OjU3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+CisKKwkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpOiBBZGQgY2FjaGluZyBmaWVsZHMuCisKK1RodSBNYXIgMTQgMTU6MjI6NDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oIChSX01FTV9JTkRJUkVDVCk6IE5ldyByZWxvYyBmb3IgdGhlIGg4MzAwLgorIAorRnJpIEZlYiAgOSAxMDo0NDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGF1eC1jb2ZmLmg6IFJlbmFtZSBmcm9tIGF1eC5oLCB0byBhdm9pZCBwcm9ibGVtcyBvbiBoYXBsZXNzIERPUworCXN5c3RlbXMgd2hpY2ggdGhpbmsgdGhhdCBhdXggaXMgYSBjb20gcG9ydC4KKworTW9uIEZlYiAgNSAxODozNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGk5NjAuaCAoRl9JOTYwSFgpOiBEZWZpbmUuCisKK1dlZCBKYW4gMzEgMTM6MTE6NTQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGF1eC5oOiBOZXcgZmlsZS4KKwkqIGludGVybmFsLmgsIG02OGsuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4KKworV2VkIE5vdiAyMiAxMzo0ODozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVjb2ZmLmggKF9SQ09OU1QsIFNUWVBfUkNPTlNULCBSRUxPQ19TRUNUSU9OX1JDT05TVCk6IERlZmluZS4KKwkoTlVNX1JFTE9DX1NFQ1RJT05TKTogVXBkYXRlLgorCSogc3ltY29uc3QuaCAoc2NSQ29uc3QpOiBEZWZpbmUuCisKK1R1ZSBOb3YgMTQgMTg6NTQ6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChDX05UX1dFQUspOiBEZWZpbmUuCisKK1RodSBOb3YgIDkgMTQ6MDg6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByczYwMDAuaCAoU1RZUF9PVlJGTE8pOiBEZWZpbmUuCisKK1R1ZSBOb3YgIDcgMTQ6Mzg6NDUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+CisKKwkqIGNvZmYvcG93ZXJwYy5oIChJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMpOiBBZGRlZCBkZWZpbmUuCisJKiBjb2ZmL3BlLmg6IEFkZGVkIGRlZmluZXMgZm9yIGZpbGUgbGV2ZWwgZmxhZ3MKKworTW9uIE5vdiAgNiAxNzoyODowMSAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+CisKKwkqIGk4NjAuaDogTmV3IGZpbGUsIGJhc2VkIG9uIGkzODYuaC4KKworV2VkIE5vdiAgMSAxNToyNToxOCAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KKworCSogbTY4ay5oIChQQUdFTUFHSUNFWEVDU1dBUFBFRCk6IERlZmluZS4KKwkoUEFHRU1BR0lDUEVYRUNTV0FQUEVEKTogRGVmaW5lLgorCShQQUdFTUFHSUNQRVhFQ1RTSExJQik6IERlZmluZS4KKwkoUEFHRU1BR0lDUEVYRUNQQUdFRCk6IERlZmluZS4KKwkoX0NPTU1FTlQpOiBERUZJTkUuCisJKiBtODhrLmggKF9DT01NRU5UKTogRGVmaW5lLgorCitXZWQgT2N0IDE4IDE4OjM2OjE5IDE5OTUgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIHN5bS5oOiAjaWYgMCdkIG91dCBydW50aW1lX3BkciBzdHJ1Y3QgYmVjYXVzZSBpdCBjaG9rZXMgCisJVmlzdWFsIEMrKyBhbmQgdGhlcmUgYXJlbid0IGFueSByZWZlcmVuY2VzIHRvIGl0IGVsc2V3aGVyZSBpbiBnZGIuCisKK01vbiBPY3QgMTYgMTE6MTI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiByczYwMDAuaCAoU01BTExfQU9VVFNaKTogRGVmaW5lLgorCisJKiBpbnRlcm5hbC5oIChYTUNfVEQpOiBEZWZpbmUuCisKK1R1ZSBPY3QgMTAgMTg6NDE6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX2NwdXR5cGUgZmllbGQuCisJKiByczYwMDAuaCAoQU9VVEhEUik6IFJlbmFtZSBvX3Jlc3YxIHRvIG9fY3B1dHlwZS4KKworTW9uIE9jdCAgOSAxNDo0NTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJzNjAwMC5oIChBT1VUSERSKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4gIEFkZCBjb21tZW50cy4KKwkoX1BBRCwgX0xPQURFUik6IERlZmluZS4KKwkoU1RZUF9MT0FERVIpOiBEZWZpbmUuCisJKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcik6IEFkZCBvX21heGRhdGEgZmllbGQuCisKK1RodSBPY3QgIDUgMTA6MDI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlY29mZi5oOiBEZWZpbmUgc2VjdGlvbiBuYW1lIG1hY3JvcyBhbmQgU1RZUCBtYWNyb3MgZm9yIHZhcmlvdXMKKwlBbHBoYSBzZWN0aW9uczogLmdvdCwgLmhhc2gsIC5keW5zeW0sIC5keW5zdHIsIC5yZWwuZHluLCAuY29uZmxpYywKKwkuY29tbWVudCwgLmxpYmxpc3QsIC5keW5hbWljLgorCitXZWQgT2N0ICA0IDEwOjU2OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBwZS5oOiBNb3ZlZCBET1NNQUdJQyBhbmQgTlRfU0lHTkFUVVJFIGRlZmluZXMgaGVyZQorCSogcG93ZXJwYy5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcworCUFsc28gcmVtb3ZlZCBvdGhlciB1bnVzZWQgZGVmaW5lcyAodmFyaW91cyBNQUdJQyBvbmVzKQorCSogaTM4Ni5oOiByZW1vdmVkIERPU01BR0lDLCBOVF9TSUdOQVRVUkUsIGFuZCBERUZBVUxUXyogZGVmaW5lcworCSogYXJtLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCisJKiBhcG9sbG8uaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIGFscGhhLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCisJKiBoODUwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcworCSogaDgzMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIGk5NjAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIG04OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIHdlMzJrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCisJKiByczYwMDAuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIG1pcHMuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIG02OGsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKwkqIHo4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcworCSogdzY1Lmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCisJKiBzcGFyYy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcworCSogc2guaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKKworRnJpIFNlcCAyOSAwODo0MDowOCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogcG93ZXJwYy5oOiBSZWZvcm1hdHRlZCB0byBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgorCitXZWQgU2VwIDI3IDA2OjUwOjUwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+CisKKwkqIHBlLmg6IGFkZGVkIGRlZmluZXMgZm9yIG1vcmUgc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MKKwkqIHBvd2VycGMuaCAobmV3IGZpbGUpOiBiYXNlIGNvZmYgZGVmaW5pdGlvbnMgZm9yIHBwYyBQRQorCitUdWUgU2VwIDEyIDEyOjA4OjIwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3N5bWVudCk6IENoYW5nZSBuX251bWF1eCBmaWVsZCBmcm9tCisJY2hhciB0byB1bnNpZ25lZCBjaGFyLgorCitGcmkgU2VwICAxIDE1OjM5OjM2IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgorCisJKiBtaXBzLmggKHN0cnVjdCBycGRyX2V4dCk6IERlZmluZS4KKworVGh1IEF1ZyAzMSAxNjo1MTo1MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyLCBpbnRlcm5hbF9maWxlaGRyKToKKwlkb24ndCBpbmRpcmVjdCB0aGUgcGUgc3R1ZmYuCisKK1R1ZSBBdWcgMjkgMTQ6MTY6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IE1ha2UgdGhlIHNhbWUKKwlhcyAndGhlIG90aGVyJyBjb21waWxlci4KKwkqIGludGVybmFsLmggKE5UX0lNQUdFX0JBU0UpOiBEZWxldGVkLgorCShOVF9FWEVfSU1BR0VfQkFTRSwgTlRfRExMX0lNQUdFX0JBU0UpOiBOZXcuCisJKFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKTogTmV3LgorCShSX0lNQUdFQkFTRSk6IE5ldy4KKworTW9uIEF1ZyAyMSAxODoxMjoxOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oOiAoaW50ZXJuYWxfZmlsZWhkcik6IE1vdmVkIFBFIHN0dWZmIGludG8KKwlpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyLgorCShpbnRlcm5hbF9hb3V0aGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bworCWludGVyYW5sX2V4dHJhX3BlX2FvdXRoZHIuCisKK01vbiBKdWwgMjQgMTQ6MDU6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oOiBNb3ZlIFJfU0hfKiByZWxvY3MgZnJvbSBoZXJlLi4uCisJKiBzaC5oOiAuLi50byBoZXJlLgorCShSX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDMyKTogRGVmaW5lLgorCShSX1NIX1VTRVMsIFJfU0hfQ09VTlQsIFJfU0hfQUxJR04pOiBEZWZpbmUuCisKK1RodSBKdW4gMjkgMDA6MDQ6MjUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogaW50ZXJuYWwuaCAoTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBJbmNyZWFzZSBhIGxvdC4KKworVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWxldGUKKworVHVlIE1heSAxNiAxNTowODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBOb3cgZXh0ZXJuLgorCitUdWUgRmViIDE0IDE3OjU5OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSk6IERlZmluZS4KKwkoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IERlZmluZS4KKworU2F0IEZlYiAgNCAxNDozODowMyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+CisKKwkqIHN5bS5oIChzdHJ1Y3QgcGRyKTogZmllbGQgInByb2YiIGFkZGVkLgorCisJKiBhbHBoYS5oIChQRFJfQklUUzFfUFJPRl8qKTogYWRkZWQsIG1hY3JvcyBmb3IgUERSX0JJVFMqX1JFU0VSVkVEXyoKKwl1cGRhdGVkIGFjY29yZGluZ2x5LgorCitTdW4gSmFuIDE1IDE4OjM4OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgorCisJKiB3NjUuaDogTmV3IGZpbGUuCisKK1dlZCBOb3YgMjMgMjI6NDM6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogc2guaCAoU0hfQVJDSF9NQUdJQ19CSUcsIFNIX0FSQ0hfTUFHSUNfTElUVExFKTogTmV3LgorCShTSEJBRE1BRyk6IENoYW5nZWQgdG8gc3VpdC4KKworVHVlIEp1bCAyNiAxNzo0NjowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBpOTYwLmggKEZfSTk2MEpYKTogTmV3IG1hY3JvLgorCitXZWQgSnVsICA2IDAwOjQ4OjU3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYWxwaGEuaDogIEFkZCBkZWZpbml0aW9ucyBmb3IgYWxwaGEgZmlsZSBoZWFkZXIgZmxhZ3MsIGVuY29kaW5nCisJdGhlIG9iamVjdCB0eXBlIG9mIHRoZSBmaWxlLgorCitNb24gSnVuIDIwIDEzOjQ3OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuaCAoZWNvZmZfc3dhcF90aXJfaW4pOiBSZW1vdmUgZGVjbGFyYXRpb24uCisJKGVjb2ZmX3N3YXBfdGlyX291dCk6IExpa2V3aXNlLgorCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBMaWtld2lzZS4KKwkoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGQgbmV3IGZpZWxkczogc3dhcF90aXJfaW4sCisJc3dhcF9ybmR4X2luLCBzd2FwX3Rpcl9vdXQsIHN3YXBfcm5keF9vdXQsIHJlYWRfZGVidWdfaW5mby4KKworU3VuIEp1biAxMiAwMzo1MTo1MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmUgZm9yIHN0SW5kaXJlY3QuCisKK0ZyaSBBcHIgMjIgMTM6MDU6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5oIChSRUdJTkZPKTogRG9uJ3QgZGVmaW5lLgorCShzdHJ1Y3QgZWNvZmZfcmVnaW5mbyk6IERvbid0IGRlZmluZS4KKworCSogc2guaCAoU0hfQVJDSF9NQUdJQyk6IFJlbmFtZSBmcm9tIFNITUFHSUMuICBTSE1BR0lDIGlzIHVzZWQgYnkKKwlzZXZlcmFsIHRhcmdldHMgdG8gbWVhbiBhIHNoYXJlZCBsaWJyYXJ5LgorCShTSEJBRE1BRyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgorCitUaHUgQXByIDE0IDEzOjAwOjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFX0JJRyk6IENoYW5nZWQgZnJvbSAweDFlIHRvIDB4M2UuCisJKFJFTE9DX0JJVFMzX1RZUEVISV9MSVRUTEUpOiBEZWZpbmUuCisJKFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpOiBEZWZpbmUuCisJKE1JUFNfUl9QQ1JFTDE2KTogQ2hhbmdlIHZhbHVlIGZyb20gOCB0byAxMiB0byBtYXRjaCBJcml4IDQuCisJKE1JUFNfUl9SRUxISSk6IERlZmluZS4KKwkoTUlQU19SX1JFTExPKTogRGVmaW5lLgorCShNSVBTX1JfU1dJVENIKTogQ2hhbmdlIHZhbHVlIGZyb20gOSB0byAyMi4KKworVGh1IEFwciAgNyAxNDoxOTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoTUlQU19SX1NXSVRDSCk6IERlZmluZS4KKworVGh1IE1hciAzMSAxOToyODozMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgY29tbWVudHMgZm9yIEFwb2xsbyBmaWVsZHMuCisKK1RodSBNYXIgMzEgMTY6Mjg6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5oIChTVFlQX0VDT0ZGX0xJQik6IERlZmluZSBhcyB1c2VkIG9uIElyaXggNC4KKworRnJpIE1hciAyNSAxNzoxNjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogQWRkIGFkanVzdCBmaWVsZC4KKwkoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCk6IERlZmluZS4KKworVHVlIE1hciAyMiAxMzoyMjo0NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoTUlQU19SX1BDUkVMMTYpOiBEZWZpbmUuCisKK1NhdCBGZWIgMjYgMTA6MjY6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBlY29mZi5oOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBTVlI0IGNjLgorCitNb24gRmViIDIxIDA5OjQ4OjQ2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBzeW0uaCAoc3RydWN0IHJ1bnRpbWVfcGRyKTogTWFrZSBmaWVsZCBhZHIgYmZkX3ZtYSwgbm90IHVuc2lnbmVkCisJbG9uZy4KKwkoU1lNUik6IE1ha2UgZmllbGQgdmFsdWUgYmZkX3ZtYSwgbm90IGxvbmcuCisKK0ZyaSBGZWIgIDQgMjM6MzU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiByczYwMDAuaCAoU1RZUF9ERUJVRyk6IERlZmluZS4KKworV2VkIEZlYiAgMiAxNDozMTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmggKHVuaW9uIGludGVybmFsX2F1eGVudCk6IENoYW5nZSB4X2NzZWN0Lnhfc2NubGVuIGludG8KKwlhIHVuaW9uIG9mIGEgbG9uZyBhbmQgYSBwb2ludGVyIHRvIGEgc3ltYm9sLiAgWENPRkYgc29tZXRpbWVzIHVzZXMKKwl0aGlzIGZpZWxkIGFzIGEgc3ltYm9sIGluZGV4LgorCitNb24gSmFuIDEwIDIzOjU0OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuaCAoZWNvZmZfZGVidWdfaW5mbyk6IFJlbW92ZSBmaWVsZHMgbGluZV9lbmQsCisJZXh0ZXJuYWxfZG5yX2VuZCwgZXh0ZXJuYWxfcGRyX2VuZCwgZXh0ZXJuYWxfc3ltX2VuZCwKKwlleHRlcm5hbF9vcHRfZW5kLCBleHRlcm5hbF9hdXhfZW5kLCBzc19lbmQsIGV4dGVybmFsX2Zkcl9lbmQuCisJUmVwbGFjZSBpZmRiYXNlIHdpdGggaWZkbWFwLgorCitXZWQgSmFuICA1IDE3OjA1OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5oIChTVFlQX0VYVEVOREVTQywgU1RZUF9DT01NRU5ULCBTVFlQX1hEQVRBLCBTVFlQX1BEQVRBKToKKwlEZWZpbmUuCisKK1dlZCBKYW4gIDUgMTY6NTg6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5oIChOVU1fUkVMT0NfU0VDVElPTlMpOiBEZWZpbmUuCisKK1R1ZSBEZWMgMjEgMDk6MjQ6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBzcGFyYy5oIChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MpOiBSZW5hbWUgZmllbGQgcl9hZGRlbmQgdG8KKwlyX29mZnNldC4KKworU2F0IERlYyAxMSAxNjoxMjozMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaCAoUl9ESVNQNywgUl9TSF9JTU0xNik6IE5ldyByZWxvYyB0eXBlcy4KKworVHVlIE5vdiAyMyAxNDoyMzoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogQWRkZWQgKl9lbmQgZmllbGRzIGZvciBhbGwKKwl0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gcG9pbnRlcnMuCisKKwkqIHN5bS5oOiBOYW1lZCB0aGUgRVhUUiBzdHJ1Y3R1cmUgZWNvZmZfZXh0ci4KKworRnJpIE5vdiAxOSAwODoyMToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaCAoUkVMU1opOiBVc2UgY29ycmVjdCBzaXplLgorCitXZWQgTm92IDE3IDE3OjE4OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyk6IERlZmluZS4KKworVHVlIE5vdiAgMiAxNzo1Njo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwKTogRGVmaW5lLgorCitUaHUgT2N0IDI4IDE3OjA3OjUwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oIChJMzg2TFlOWE1BR0lDKTogUmVuYW1lIHRvIExZTlhDT0ZGTUFHSUMuCisJKiBtNjhrLmggKExZTlhDT0ZGTUFHSUMpOiBEZWZpbmUuCisJKiBzcGFyYy5oOiBOZXcgZmlsZS4KKworVHVlIE9jdCAxOSAxNTozNDo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFscGhhLmggKGV4dGVybmFsX2FvdXRoZHIpOiBTcGxpdCBmb3VyIGJ5dGUgcGFkZGluZyBmaWVsZCBpbnRvCisJdHdvIGJ5dGUgYmxkcmV2IGZpZWxkIGFuZCB0d28gYnl0ZSBwYWRkaW5nIGZpZWxkLgorCisJKiBlY29mZi5oIChfTElUQSwgX1BEQVRBLCBfWERBVEEsIFNUWVBfTElUQSk6IERlZmluZWQuCisKK1dlZCBPY3QgMTMgMTU6NTI6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwlTdW4gT2N0IDEwIDE3OjI3OjEwIDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKKworCSogY29mZi9pbnRlcm5hbC5oOiBBZGRlZCBvX3NyaSwgb19pbmxpYiBhbmQgb192aWQgZm9yIEFwb2xsb3MKKwkJCWFzIHdlbGwgYXMgUl9ESVIxNi4KKworCSogY29mZi9hcG9sbG8uaDogTmV3IGZpbGUKKworTW9uIE9jdCAxMSAxNzoxNjo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmggKFJFR0lORk8sIHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRGVmaW5lLgorCitUdWUgT2N0ICA1IDEwOjUyOjUzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByczYwMDAuaDogQ2hhbmdlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGNvbW1lbnQgdG8gb2N0YWwKKwllc2NhcGVzLgorCitUdWUgU2VwIDI4IDAzOjI3OjA0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZWNvZmYuaCAoX0ZJTkksIFNUWVBfRUNPRkZfRklOSSk6ICBBZGQgdG8gc3VwcG9ydCAuZmluaSBzZWN0aW9uLgorCitGcmkgU2VwIDI0IDExOjUzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCisJKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUzIGFuZCBNSVBTX01BR0lDX0JJRzMuCisKK1RodSBTZXAgMjMgMjE6MDc6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoQkFETUFHKTogUmVjb2duaXplIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgorCSogZWNvZmYuaDogRGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMiBhbmQgTUlQU19NQUdJQ19CSUcyLgorCitUaHUgU2VwIDE2IDIwOjI3OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3ltLmgsIHN5bWNvbnN0Lmg6IEFkZCBjb21tZW50IHN0YXRpbmcgdGhlc2UgZmlsZXMgYXJlIG5vdCBwYXJ0CisJb2YgR0RCLCBHQVMsIGV0Yy4gIEluIDE5OTEsIHdoZW4gd2UgYXNrZWQgcm1zIHdoZXRoZXIgd2UgY291bGQKKwlpbmNsdWRlIHRoZXNlIGZpbGVzIGluIEdEQiAoYWx0aG91Z2ggdGhleSBhcmUgY29weXJpZ2h0ZWQgYnkKKwlzb21lb25lIGJlc2lkZXMgdGhlIEZTRiksIGhlIHNhaWQgaXQgd2FzIE9LIGlmIHRoZXkgd2VyZSBub3QKKwljb25zaWRlcmVkIHBhcnQgb2YgR0RCLgorCitGcmkgU2VwIDEwIDE3OjQwOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmYuaCAoQVVYX1BVVF9BTlkpOiBDYXN0IHZhbCBhcmd1bWVudCB0byBiZmRfdm1hLgorCisJKiBhbHBoYS5jIChleHRlcm5hbF9hb3V0aGRyKTogTmVlZCBmb3VyIGJ5dGVzIG9mIHBhZGRpbmcgYmV0d2VlbgorCXZzdGFtcCBhbmQgdHNpemUuCisKK1R1ZSBTZXAgIDcgMTQ6MjA6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlY29mZi5oIChBVVhfR0VUX0FOWSwgQVVYX1BVVF9BTlkpOiBDaGFuZ2VkIHRvIHJlZmxlY3QgZnVydGhlcgorCWNoYW5nZSBpbiBiZmQgc3dhcHBpbmcgcm91dGluZSBuYW1lcy4KKworVHVlIFNlcCAgNyAxMDoxNToxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZWNvZmYuaCAoQVVYX0dFVF9BTlkpOiBDaGFuZ2UgbmFtZSBvZiBfZG9fZ2V0YjMyIHRvIHJlZmxlY3QgYmZkCisJY2hhbmdlcy4KKworRnJpIEF1ZyAxMyAxNDozMDozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fTk9ORSk6IERlZmluZS4KKworVGh1IEF1ZyAxMiAxMToyNDo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFscGhhLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IEFkZCByX3N5bW5keCBmaWVsZC4KKwkoUkVMU1opOiBDb3JyZWN0LgorCShSRUxPQ19CSVRTKik6IENvcnJlY3QuCisJKEFMUEhBX1JfKik6IERlZmluZS4KKwkqIGVjb2ZmLmggKFJFTE9DX1NFQ1RJT05fe1hEQVRBLFBEQVRBLEZJTkksTElUQSxBQlN9KTogRGVmaW5lLgorCShyX2V4dGVybik6IFVuZGVmaW5lLgorCSogaW50ZXJuYWwuaCAoc3RydWN0IGludGVybmFsX3JlbG9jKTogTWFrZSByX3ZhZGRyIGJmZF92bWEgcmF0aGVyCisJdGhhbiBsb25nLiAgQWRkIHJfZXh0ZXJuIGZpZWxkLgorCisJKiBhbHBoYS5oIChQRFJfQklUUyopOiBEZWZpbmUuCisJKiBzeW0uaCAoUERSKTogR2l2ZSBjb3JyZWN0IG5hbWVzIHRvIG5ldyBmaWVsZHMuCisKKwkqIGVjb2ZmLmg6IE1vdmVkIE1JUFMgcmVsb2MgZGVmaW5pdGlvbnMgZnJvbSBoZXJlLi4uCisJKiBtaXBzLmg6IHRvIGhlcmUuCisKK1R1ZSBBdWcgIDMgMTE6MTc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBhbHBoYS5oOiBDb3JyZWN0ZWQgZXh0ZXJuYWwgc3ltYm9saWMgZGVidWdnaW5nIHN0cnVjdHVyZXMgdG8KKwltYXRjaCBhY3R1YWwgdXNhZ2UuCisJKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9maWxlaGRyLCBpbnRlcm5hbF9hb3V0aGRyLAorCWludGVybmFsX3Njbmhkcik6IENoYW5nZWQgdHlwZSBvZiBzb21lIGZpZWxkcyB0byBiZmRfdm1hIHNvIHRoZXkKKwljYW4gaG9sZCA2NCBiaXRzLgorCSogc3ltLmggKEhEUlIsIEZEUiwgUERSLCBFWFRSKTogTGlrZXdpc2UuCisJKFBEUik6IEFkZGVkIG5ldyBmaWVsZHMgZm91bmQgb24gQWxwaGEuCisJKiBzeW1jb25zdC5oIChtYWdpY1N5bTIpOiBEZWZpbmU7IG5ldyB2YWx1ZSBmb3VuZCBvbiBBbHBoYS4KKworCSogZWNvZmYuaDogTmV3IGZpbGUuCisJKiBhbHBoYS5oLCBtaXBzLmg6IE1vdmVkIGNvbW1vbiBpbmZvcm1hdGlvbiBpbnRvIGVjb2ZmLmguICBNb3ZlZAorCWV4dGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiBmcm9tIGVjb2ZmLWV4dC5oLgorCSogZWNvZmYtZXh0Lmg6IFJlbW92ZWQ7IGluZm9ybWF0aW9uIG5vdyBpbiBhbHBoYS5oIGFuZCBtaXBzLmguCisKK1N1biBKdWwgMTggMjE6NDM6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBpMzg2Lmg6IFJlY29nbml6ZSBJMzg2UFRYTUFHSUMuCisKK0ZyaSBKdWwgMTYgMDk6NTQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLmggKE1JUFNfQU9VVF97T1p9TUFHSUMpOiBSZW5hbWVkIGZyb20ge09afU1BR0lDLgorCitUaHUgSnVsIDE1IDEyOjIzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbTg4ay5oICh1bmlvbiBleHRlcm5hbF9hdXhlbnQpOiBNb3ZlIHhfZmNuIGJhY2sgaW5zaWRlIHhfZmNuYXJ5LgorCSh7R0VULFBVVH1fRkNOX3tMTk5PUFRSLEVORE5EWH0pOiBBZGp1c3QgYWNjb3JkaW5nbHkuCisKK1N1biBKdWwgMTEgMTg6MDA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG02OGsuaDogRGVmaW5lIE1DNjhLQkNTTUFHSUMuCisKK1RodSBKdW4gMTAgMTE6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLmggKF9JTklULCBTVFlQX01JUFNfSU5JVCk6IERlZmluZSAodXNlZCBvbiBJcml4NCkuCisJKFNUWVBfT1RIRVJfTE9BRCk6IERlZmluZSBhcyBTVFlQX01JUFNfSU5JVC4KKworV2VkIEp1biAgOSAxNTowOTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoT01BR0lDKTogRGVmaW5lLgorCitNb24gQXByIDI2IDE4OjA0OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oLCBzaC5oOiBTdXBwb3J0IGZvciBTSC4KKworU2F0IEFwciAyNCAyMTozNDo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogYTI5ay5oOiBEZWZpbmUgX0xJVC4KKworRnJpIEFwciAyMyAxODo0MToyMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYWxwaGEuaDogTmV3IGZpbGUuCisKK1RodSBBcHIgIDggMTI6MzY6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oIChDX1NIQURPVywgQ19WRVJTSU9OKTogQ29waWVkIGluIGZyb20gbTg4ay5oLgorCSogbTg4ay5oLCBpMzg2LmgsIHdlMzJrLmg6IERvbid0IGRlZmluZSBhbGwgdGhlIHN0b3JhZ2UgY2xhc3NlczsKKwl0aGV5J3JlIGFscmVhZHkgaW4gaW50ZXJuYWwuaC4KKworV2VkIEFwciAgNyAxMTo1MToyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaDogQ2hhbmdlIG5fc2NsYXNzIHRvIHVuc2lnbmVkIGNoYXIuCisJQ2hhbmdlIENfRUZDTiB0byAweGZmLCBjaGFuZ2UgUlMvNjAwMCBkYnggc3ltYm9scworCXRvIG5vIGxvbmdlciBiZSBzaWduZWQuCisKK0ZyaSBNYXIgMTkgMTQ6NTI6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmg6IEFkZCBIOC81MDAgcmVsb2MgdHlwZXMuCisKK1dlZCBNYXIgMTcgMDk6NDY6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBlY29mZi1leHQuaCAoQVVYX1BVVF9BTlkpOiBEb24ndCB1c2Ugdm9pZCB2YWx1ZXMgaW4gYnJhbmNoZXMgb2YKKwljb25kaXRpb25hbCBleHByZXNzaW9uLgorCitUaHUgTWFyICA0IDE0OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZWNvZmYtZXh0LmggKEFVWF9HRVRfKik6IFJld3JvdGUgdG8gdXNlIG5ldyBtYWNybyBBVVhfR0VUX0FOWS4KKwkoQVVYX1BVVF8qKTogTmV3IG1hY3JvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBVVhfR0VUIG1hY3Jvcy4KKwkoZWNvZmZfc3dhcF90aXJfb3V0KTogQWRkZWQgcHJvdG90eXBlLgorCisJKiBtaXBzLmggKE5fQlRNQVNLLCBOX1RNQVNLLCBOX0JUU0hGVCwgTl9UU0hJRlQpOiBEZWZpbmU7IHRoZXNlCisJYXJlIG5lZWRlZCB0byBpbnRlcnByZXQgZ2NjIGRlYnVnZ2luZyBvdXRwdXQuCisKK1R1ZSBGZWIgIDkgMDc6NDM6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB3ZTMyay5oIChCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGKTogUmVtb3ZlZAorCW1vcmUgZGVmaW5pdGlvbnMgZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgorCitXZWQgRmViICAzIDA5OjE4OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChSRUxPQ19CSVRTM19UWVBFXyopOiBDb3JyZWN0IGZvciBiaWcgZW5kaWFuIG1hY2hpbmVzLgorCitNb24gSmFuIDI1IDExOjM1OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfYW91dGhkcik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgb25seQorCWJ5IE1JUFMgRUNPRkYuCisKK1RodSBKYW4gMjEgMTA6Mjg6MzggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLmggKEFPVVRIRFIpOiBBZGRlZCBhZGRpdGlvbmFsIGZpZWxkcyB1c2VkIGJ5IEVDT0ZGLgorCitUdWUgSmFuIDE5IDEyOjIxOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oLCB3ZTMyay5oIChOXyosIFRfKiwgRFRfKik6IFJlbW92ZWQgc3RpbGwgbW9yZSBkZWZpbml0aW9ucworCWR1cGxpY2F0ZWQgaW4gaW50ZXJuYWwuaC4KKworCSogbWlwcy5oIChSRUxPQ19TRUNUSU9OXyosIEVDT0ZGX1JfKik6IERlZmluZWQgY29uc3RhbnRzIGZvciBFQ09GRgorCXJlbG9jcy4KKworRnJpIEphbiAxNSAxODoxNzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVjb2ZmLWV4dC5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBuZXcgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgorCShvcHRfZXh0KTogTmV3IHN0cnVjdHVyZS4KKwkqIG1pcHMuaCAoWk1BR0lDKTogRGVmaW5lZCB0byBiZSAwNDEzLgorCShfTElCKTogRGVmaW5lZCB0byBiZSAiLmxpYiIKKwkoZXh0ZXJuYWxfcmVsb2MpOiBNSVBTIEVDT0ZGIHJlbG9jcyBhcmUgb25seSA4IGJ5dGVzLiAgQWRkZWQKKwltYWNyb3MgdG8gYWlkIGluIHN3YXBwaW5nLgorCitGcmkgSmFuICA4IDE2OjE5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIEVDT0ZGIHN3YXBwaW5nIGZ1bmN0aW9ucy4KKwkqIGludGVybmFsLmggKGludGVybmFsX3Njbmhkcik6IEFsd2F5cyBwcm92aWRlIHNfYWxpZ24gZmllbGQsIG5vdAorCWp1c3Qgb24gaTk2MC4KKwkoaW50ZXJuYWxfcmVsb2MpOiBBbHdheXMgcHJvdmlkZSByX3NpemUgZmllbGQsIG5vdCBqdXN0IG9uCisJUlMvNjAwMC4KKwkqIG1pcHMuaCAoX1JEQVRBLCBfU0RBVEEsIF9TQlNTLCBfTElUNCwgX0xJVDgsIFNUWVBfUkRBVEEsCisJU1RZUF9TREFUQSwgU1RZUF9TQlNTLCBTVFlQX0xJVDQsIFNUWVBfTElUOCk6IERlZmluZWQuCisJKENPREVfTUFTSywgTUlQU19JU19TVEFCLCBNSVBTX01BUktfU1RBQiwgTUlQU19VTk1BUktfU1RBQiwKKwlTVEFCU19TWU1CT0wpOiBNb3ZlZCBpbiBmcm9tIGdkYi9taXBzcmVhZC5jLgorCitXZWQgSmFuICA2IDE0OjAxOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oLCB3ZTMyay5oOiByZW1vdmVkIFNUWVBfKiBkZWZpbmVzLCBzaW5jZSB0aGV5IGR1cGxpY2F0ZWQKKwl0aG9zZSBpbiBpbnRlcm5hbC5oLgorCitUdWUgRGVjIDI5IDE1OjQwOjA3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oOiBkZWZpbmUgSTM4NkFJWE1BR0lDIGZvciBEYW5idXJ5IEFJWCBQUy8yIGNvbXBpbGVyLgorCitTYXQgRGVjIDEyIDE2OjA3OjU3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oOiBkb24ndCBkZWZpbmUgQlRZUEUsIElTUFRSLCBJU0ZDTiwgSVNBUlksIERFQ1JFRjogdGhleQorCWFyZSBkZWZpbmVkIGluIGludGVybmFsLmguCisKK1RodSBOb3YgMTIgMDk6NTI6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmg6IChpbnRlcm5hbF9yZWxvYyk6IHJfb2Zmc2V0IGlzIG5vdyBhIGxvbmcuCisJKiB6OGsuaDogc2xpZ2h0IGNvbW1lbnQgZW5oYW5jZW1lbnQKKworV2VkIFNlcCAzMCAwNzo0NjowOCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaDogY2hhbmdlZCB6OGsgcmVsb2MgdHlwZXMKKworRnJpIEF1ZyAyOCAxMDoxNjozMSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQorCisJKiB3ZTMyay5oOiBuZXcgZmlsZQorCitUaHUgQXVnIDI3IDEzOjAwOjAxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCisKKwkqIHN5bWNvbnN0Lmg6IGNvbW1lbnQgb3V0IGNydWZ0IGF0IHRoZSBlbmQgb2YgI2VuZGlmCisKK1R1ZSBBdWcgMjUgMTU6MDY6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmg6IGFkZGVkICNkZWZpbmUgZm9yIFNUWVBfTElULCByZW1vdmVkIGZyb20gYTI5ayBhbmQKKwloODMwMC4KKworCSogejhrLmg6IGFkZGVkIHo4MDAwIHN1cHBvcnQKKworVGh1IEp1bCAxNiAxNjozMjowMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaDogYWRkZWQgUl9SRUxMT05HX05FRyByZWxvYyB0eXBlCisKK0ZyaSBKdW4gMTIgMjA6MTE6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHN5bWNvbnN0Lmg6ICBGaXggdW50ZXJtaW5hdGVkIGNvbW1lbnQuCisKK1dlZCBKdW4gMTAgMDc6NTc6NDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGkzODYuaDogYS5vdXQgbWFnaWMgbnVtYmVycyBmcm9tCisJbW9ocmluZ0BpbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlCisKK01vbiBKdW4gIDggMjA6MTM6MzMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLWV4dC5oLCBtaXBzLmg6ICBVc2UgdW5zaWduZWQgY2hhcnMgZXZlcnl3aGVyZS4KKwkoU3VnZ2VzdGVkIGJ5IEFudHRpIE1pZXR0aW5lbi4pCisKK1R1ZSBBcHIgMTQgMTU6MTg6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHN5bS5oOiAgQWRkIGNvbW1lbnRzLgorCSogc3ltY29uc3QuaDogIE1lcmdlIHdpdGggRnJlZCdzIGNoYW5nZXMuCisKK1R1ZSBBcHIgMTQgMTQ6MzA6MDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHN5bWNvbnN0Lmg6ICBQaWNrIHVwIFNHSSBkZWZpbmVzIGZvciBzdFN0cnVjdCwgc3RVbmlvbiwgc3RFbnVtLAorCWxhbmdDcGx1c3BsdXMsIGFuZCBsYW5nQ3BsdXNwbHVzVjIuCisKK1RodSBBcHIgIDIgMTk6NDc6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHN5bS5oLCBzeW1jb25zdC5oOiAgTUlQUyBoYXMgcHJvdmlkZWQgcmVkaXN0cmlidXRhYmxlIHZlcnNpb25zCisJb2YgdGhlc2UgZmlsZXMuICBUaGFua3MhCisJKiBlY29mZi1leHQuaDogIEFkZCB3ZWFrZXh0IGJpdCB0byBtYXRjaCBuZXcgc3ltLmguCisKK0ZyaSBNYXIgIDYgMDA6MTA6NDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLWV4dC5oOiAgQWRkIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMuCisKK1RodSBGZWIgMjcgMTE6NTM6MDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLWV4dC5oOiAgTmV3IGZpbGUgZm9yIGV4dGVybmFsIChpbi1maWxlKSBmb3JtIG9mIGVjb2ZmCisJc3ltYm9sIHN0cnVjdHVyZXMuCisKK1RodSBGZWIgIDYgMTE6MzM6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmg6IG1hZGUgdGhlIGV4dGVybmFsX2xpbmVubyBsX2xubm8gZmllbGQgNCBieXRlcyB3aWRlLgorCWFuZGRlZCBHRVQvUFVUX0xJTkVOT19MTk5PIG1hY3JvcworCitTYXQgTm92IDMwIDIwOjM4OjM1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBDaGFuZ2VMb2csIGEyOWsuaCwgaDgzMDAuaCwgaTM4Ni5oLCBpOTYwLmgsIGludGVybmFsLmgsIG02OGsuaCwKKwltODhrLmgsIG1pcHMuaCwgcnM2MDAwLmg6IG1vdmUgZnJvbSBhYm92ZSBjb2ZmLTxmb28+LmgKKworDAorTG9jYWwgVmFyaWFibGVzOgordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2EyOWsuaCBiL2luY2x1ZGUvY29mZi9hMjlrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzYTY0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9hMjlrLmgKQEAgLTAsMCArMSwzMDUgQEAKKy8qIENPRkYgc3BlYyBmb3IgQU1EIDI5MCowIAorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBAIE5ldyBZb3JrIFVuaXZlcnNpdHkuCisgKi8KKyAKKyNpZm5kZWYgQU1ECisjIGRlZmluZSBBTUQKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyoqIEZpbGUgSGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCisqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgoreworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkgKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkgICAqLworCWNoYXIgZl90aW1kYXRbNF07ICAgICAgIC8qIHRpbWUgJiBkYXRlIHN0YW1wCSAgICAqLworCWNoYXIgZl9zeW1wdHJbNF07ICAgICAgIC8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIgICAgICAgKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KKwljaGFyIGZfb3B0aGRyWzJdOyAgICAgICAvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkgKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKyNkZWZpbmUgRklMSERSICBzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZSBGSUxIU1oJMjAKKworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKy8qCisqKiBNYWdpYyBudW1iZXJzIGZvciBBbTI5MDAwIAorKioJKEFUJlQgd2lsbCBhc3NpZ24gdGhlICJyZWFsIiBtYWdpYyBudW1iZXIpICAKKyovCisKKyNkZWZpbmUgU0lQRkJPTUFHSUMgICAgIDA1NzIgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIE1TQikgKi8KKyNkZWZpbmUgU0lQUkJPTUFHSUMgICAgIDA1NzMgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIExTQikgKi8KKworCisjZGVmaW5lIEEyOUtfTUFHSUNfQklHIAkJU0lQRkJPTUFHSUMJCisjZGVmaW5lIEEyOUtfTUFHSUNfTElUVExFCVNJUFJCT01BR0lDCQorI2RlZmluZSBBMjlLQkFETUFHKHgpIAkoKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0JJRykgJiYgXAorCQkJICAoKHgpLmZfbWFnaWMhPUEyOUtfTUFHSUNfTElUVExFKSkKKworI2RlZmluZSBPTUFHSUMgQTI5S19NQUdJQ19CSUcKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLworCisvKgorKiogRmlsZSBoZWFkZXIgZmxhZ3MgY3VycmVudGx5IGtub3duIHRvIHVzLgorKioKKyoqIEFtMjkwMDAgd2lsbCB1c2UgdGhlIEZfQVIzMldSIGFuZCBGX0FSMzJXIGZsYWdzIHRvIGluZGljYXRlCisqKiB0aGUgYnl0ZSBvcmRlcmluZyBpbiB0aGUgZmlsZS4KKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorKiogT3B0aW9uYWwgKGEub3V0KSBoZWFkZXIgCisqLworCit0eXBlZGVmCXN0cnVjdCBleHRlcm5hbF9hb3V0aGRyIAoreworICBjaGFyICBtYWdpY1syXTsJICAgICAgIC8qIHR5cGUgb2YgZmlsZQkJCSAqLworICBjaGFyICB2c3RhbXBbMl07CSAgICAgIC8qIHZlcnNpb24gc3RhbXAJCQkqLworICBjaGFyICB0c2l6ZVs0XTsJICAgICAgIC8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyICBkc2l6ZVs0XTsJICAgICAgIC8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhciAgYnNpemVbNF07CSAgICAgICAvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJICAgICAqLworICBjaGFyICBlbnRyeVs0XTsJICAgICAgIC8qIGVudHJ5IHB0LgkJCSAgICAqLworICBjaGFyICB0ZXh0X3N0YXJ0WzRdOwkgIC8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgY2hhciAgZGF0YV9zdGFydFs0XTsJICAvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCit9IEFPVVRIRFI7CisKKyNkZWZpbmUgQU9VVFNaIDI4CisjZGVmaW5lIEFPVVRIRFJTWiAyOAorCisvKiBhb3V0aGRyIG1hZ2ljIG51bWJlcnMgKi8KKyNkZWZpbmUgTk1BR0lDCQkwNDEwCS8qIHNlcGFyYXRlIGkvZCBleGVjdXRhYmxlICovCisjZGVmaW5lIFNITUFHSUMJMDQwNgkJLyogTllVL1VsdHJhMyBzaGFyZWQgZGF0YSBleGVjdXRhYmxlIAorCQkJCSAgICh3cml0YWJsZSB0ZXh0KSAqLworCisjZGVmaW5lIF9FVEVYVCAgIAkiX2V0ZXh0IgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyoqIFNlY3Rpb24gaGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCisqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAoreworCWNoYXIJICAgIHNfbmFtZVs4XTsgICAgICAvKiBzZWN0aW9uIG5hbWUJCSAqLworCWNoYXIJICAgIHNfcGFkZHJbNF07ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworCWNoYXIJICAgIHNfdmFkZHJbNF07ICAgICAvKiB2aXJ0dWFsIGFkZHJlc3MJICAgICAgKi8KKwljaGFyCSAgICBzX3NpemVbNF07ICAgICAgLyogc2VjdGlvbiBzaXplCQkgKi8KKwljaGFyCSAgICBzX3NjbnB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCSAgICBzX3JlbHB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbiAgICAgICAqLworCWNoYXIJICAgIHNfbG5ub3B0cls0XTsgICAvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMgICAgICovCisJY2hhcgkgICAgc19ucmVsb2NbMl07ICAgIC8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMgKi8KKwljaGFyCSAgICBzX25sbm5vWzJdOyAgICAgLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWNoYXIJICAgIHNfZmxhZ3NbNF07ICAgICAvKiBmbGFncwkJCSovCit9OworCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QJZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0MAorCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQgICAiLnRleHQiCisjZGVmaW5lIF9EQVRBICAgIi5kYXRhIgorI2RlZmluZSBfQlNTICAgICIuYnNzIgorI2RlZmluZSBfTElUCSIubGl0IgorCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworLyoKKyoqIFNlY3Rpb24gdHlwZXMgLSB3aXRoIGFkZGl0aW9uYWwgc2VjdGlvbiB0eXBlIGZvciBnbG9iYWwgCisqKiByZWdpc3RlcnMgd2hpY2ggd2lsbCBiZSByZWxvY2F0YWJsZSBmb3IgdGhlIEFtMjkwMDAuCisqKgorKiogSW4gaW5zdGFuY2VzIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSBmb3IgYSBsaW5rZXIgdG8gcHJvZHVjZSBhbgorKiogb3V0cHV0IGZpbGUgd2hpY2ggY29udGFpbnMgdGV4dCBvciBkYXRhIG5vdCBiYXNlZCBhdCB2aXJ0dWFsCisqKiBhZGRyZXNzIDAsIGUuZy4gZm9yIGEgUk9NLCB0aGVuIHRoZSBsaW5rZXIgc2hvdWxkIGFjY2VwdAorKiogYWRkcmVzcyBiYXNlIGluZm9ybWF0aW9uIGFzIGNvbW1hbmQgaW5wdXQgYW5kIHVzZSBQQUQgc2VjdGlvbnMKKyoqIHRvIHNraXAgb3ZlciB1bnVzZWQgYWRkcmVzc2VzLgorKi8KKworI2RlZmluZQlTVFlQX0JTU1JFRwkweDEyMDAJLyogR2xvYmFsIHJlZ2lzdGVyIGFyZWEgKGxpa2UgU1RZUF9JTkZPKSAqLworI2RlZmluZSBTVFlQX0VOVklSCTB4MjIwMAkvKiBFbnZpcm9ubWVudCAobGlrZSBTVFlQX0lORk8pICovCisjZGVmaW5lIFNUWVBfQUJTCTB4NDAwMAkvKiBBYnNvbHV0ZSAoYWxsb2NhdGVkLCBub3QgcmVsb2MsIGxvYWRlZCkgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisqKiBSZWxvY2F0aW9uIGluZm9ybWF0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCisqLworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgeworICBjaGFyIHJfdmFkZHJbNF07CS8qICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHJlZmVyZW5jZSAqLworICBjaGFyIHJfc3ltbmR4WzRdOwkvKiBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLworICBjaGFyIHJfdHlwZVsyXTsJLyogcmVsb2NhdGlvbiB0eXBlICovCit9OworCisjZGVmaW5lCVJFTE9DCQlzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUJUkVMU1oJCTEwCQkvKiBzaXplb2YgKFJFTE9DKSAqLyAKKworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKy8qCisqKiBSZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgQW0yOTAwMCAKKyovCisKKyNkZWZpbmUJUl9BQlMJCTAJLyogcmVmZXJlbmNlIGlzIGFic29sdXRlICovCisgCisjZGVmaW5lCVJfSVJFTAkJMDMwCS8qIGluc3RydWN0aW9uIHJlbGF0aXZlIChqbXAvY2FsbCkgKi8KKyNkZWZpbmUJUl9JQUJTCQkwMzEJLyogaW5zdHJ1Y3Rpb24gYWJzb2x1dGUgKGptcC9jYWxsKSAqLworI2RlZmluZQlSX0lMT0hBTEYJMDMyCS8qIGluc3RydWN0aW9uIGxvdyBoYWxmICAoY29uc3QpICAqLworI2RlZmluZQlSX0lISUhBTEYJMDMzCS8qIGluc3RydWN0aW9uIGhpZ2ggaGFsZiAoY29uc3RoKSBwYXJ0IDEgKi8KKyNkZWZpbmUJUl9JSENPTlNUCTAzNAkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAyICovCisJCQkJLyogY29uc3RhbnQgb2Zmc2V0IG9mIFJfSUhJSEFMRiByZWxvY2F0aW9uICovCisjZGVmaW5lCVJfQllURQkJMDM1CS8qIHJlbG9jYXRhYmxlIGJ5dGUgdmFsdWUgKi8KKyNkZWZpbmUgUl9IV09SRAkJMDM2CS8qIHJlbG9jYXRhYmxlIGhhbGZ3b3JkIHZhbHVlICovCisjZGVmaW5lIFJfV09SRAkJMDM3CS8qIHJlbG9jYXRhYmxlIHdvcmQgdmFsdWUgKi8KKworI2RlZmluZQlSX0lHTEJMUkMJMDQwCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQyAqLworI2RlZmluZQlSX0lHTEJMUkEJMDQxCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQSAqLworI2RlZmluZQlSX0lHTEJMUkIJMDQyCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQiAqLworIAorLyoKK05PVEU6CitBbGwgdGhlICJJIiBmb3JtcyByZWZlciB0byAyOTAwMCBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgVGhlIGxpbmtlciBpcyAKK2V4cGVjdGVkIHRvIGtub3cgaG93IHRoZSBudW1lcmljIGluZm9ybWF0aW9uIGlzIHNwbGl0IGFuZC9vciBhbGlnbmVkCit3aXRoaW4gdGhlIGluc3RydWN0aW9uIHdvcmQocykuICBSX0JZVEUgd29ya3MgZm9yIGluc3RydWN0aW9ucywgdG9vLgorCitJZiB0aGUgcGFyYW1ldGVyIHRvIGEgQ09OU1RIIGluc3RydWN0aW9uIGlzIGEgcmVsb2NhdGFibGUgdHlwZSwgdHdvIAorcmVsb2NhdGlvbiByZWNvcmRzIGFyZSB3cml0dGVuLiAgVGhlIGZpcnN0IGhhcyBhbiByX3R5cGUgb2YgUl9JSElIQUxGIAorKDMzIG9jdGFsKSBhbmQgYSBub3JtYWwgcl92YWRkciBhbmQgcl9zeW1uZHguICBUaGUgc2Vjb25kIHJlbG9jYXRpb24gCityZWNvcmQgaGFzIGFuIHJfdHlwZSBvZiBSX0lIQ09OU1QgKDM0IG9jdGFsKSwgYSBub3JtYWwgcl92YWRkciAod2hpY2ggCitpcyByZWR1bmRhbnQpLCBhbmQgYW4gcl9zeW1uZHggY29udGFpbmluZyB0aGUgMzItYml0IGNvbnN0YW50IG9mZnNldCAKK3RvIHRoZSByZWxvY2F0aW9uIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBzeW1ib2wgdGFibGUgaW5kZXguICBUaGlzIAorc2Vjb25kIHJlY29yZCBpcyBhbHdheXMgd3JpdHRlbiwgZXZlbiBpZiB0aGUgY29uc3RhbnQgb2Zmc2V0IGlzIHplcm8uCitUaGUgY29uc3RhbnQgZmllbGRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgc2V0IHRvIHplcm8uCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyoqIExpbmUgbnVtYmVyIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCisqLworCitzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIAoreworICAgdW5pb24geworCSBjaGFyIGxfc3ltbmR4WzRdOyAvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKwkgY2hhciBsX3BhZGRyWzRdOyAgLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyICAgICovCisgICB9IGxfYWRkcjsKKyAgIGNoYXIgbF9sbm5vWzJdOyAJLyogbGluZSBudW1iZXIJICAqLworfTsKKworI2RlZmluZQlMSU5FTk8JCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCQk2CQkvKiBzaXplb2YgKExJTkVOTykgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisqKiBTeW1ib2wgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyovCisKKyNkZWZpbmUJRV9TWU1OTUxFTgk4CS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07CisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOworICAgIH0gZTsKKyAgfSBlOworICBjaGFyIGVfdmFsdWVbNF07CisgIGNoYXIgZV9zY251bVsyXTsKKyAgY2hhciBlX3R5cGVbMl07CisgIGNoYXIgZV9zY2xhc3NbMV07CisgIGNoYXIgZV9udW1hdXhbMV07Cit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWiAJMTgKKworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCisKKy8qCisqKiBTdG9yYWdlIGNsYXNzIGRlZmluaXRpb25zIC0gbmV3IGNsYXNzZXMgZm9yIGdsb2JhbCByZWdpc3RlcnMuCisqLworCisjZGVmaW5lIENfR0xCTFJFRwkxOQkJLyogZ2xvYmFsIHJlZ2lzdGVyICovCisjZGVmaW5lIENfRVhUUkVHCTIwCQkvKiBleHRlcm5hbCBnbG9iYWwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ19ERUZSRUcJMjEJCS8qIGV4dC4gZGVmLiBvZiBnbG9iYWwgcmVnaXN0ZXIgKi8KKworCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KKworLyoKKyoqIERlcml2ZWQgc3ltYm9sIG1hc2svc2hpZnRzLgorKi8KKworI2RlZmluZSBOX0JUTUFTSwkoMHhmKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCisjZGVmaW5lIE5fVFNISUZUCSgyKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyoqIEF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgCisqKiBkZWZpbml0aW9ucy4KKyovCisKKyNkZWZpbmUgRV9GSUxOTUxFTgkxNCAgICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkgICovCisjZGVmaW5lIEVfRElNTlVNICAJNCAgICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOyAgLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOyAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07ICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07ICAgICAgIC8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworCXN0cnVjdCB7CisJCWNoYXIgeF90dmZpbGxbNF07ICAgICAgIC8qIHR2IGZpbGwgdmFsdWUgKi8KKwkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCisJCWNoYXIgeF90dnJhblsyXVsyXTsgICAgIC8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkgLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworfTsKKworI2RlZmluZQlBVVhFTlQJCXVuaW9uIGV4dGVybmFsX2F1eGVudAorI2RlZmluZQlBVVhFU1oJCTE4CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2FscGhhLmggYi9pbmNsdWRlL2NvZmYvYWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZjYmNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL2FscGhhLmgKQEAgLTAsMCArMSwzNjIgQEAKKy8qIEVDT0ZGIHN1cHBvcnQgb24gQWxwaGEgbWFjaGluZXMuCisgICBjb2ZmL2Vjb2ZmLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBmaWxlLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworICB1bnNpZ25lZCBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisgIHVuc2lnbmVkIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworICB1bnNpZ25lZCBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKyAgdW5zaWduZWQgY2hhciBmX3N5bXB0cls4XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworICB1bnNpZ25lZCBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworICB1bnNpZ25lZCBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKyAgdW5zaWduZWQgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisvKiBNYWdpYyBudW1iZXJzIGFyZSBkZWZpbmVkIGluIGNvZmYvZWNvZmYuaC4gICovCisjZGVmaW5lIEFMUEhBX0VDT0ZGX0JBRE1BRyh4KSBcCisgICgoeCkuZl9tYWdpYyAhPSBBTFBIQV9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBBTFBIQV9NQUdJQ19CU0QpCisKKy8qIFRoZSBvYmplY3QgdHlwZSBpcyBlbmNvZGVkIGluIHRoZSBmX2ZsYWdzLiAgKi8KKyNkZWZpbmUgRl9BTFBIQV9PQkpFQ1RfVFlQRV9NQVNLCTB4MzAwMAorI2RlZmluZSBGX0FMUEhBX05PX1NIQVJFRAkJMHgxMDAwCisjZGVmaW5lIEZfQUxQSEFfU0hBUkFCTEUJCTB4MjAwMAorI2RlZmluZSBGX0FMUEhBX0NBTExfU0hBUkVECQkweDMwMDAKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCit0eXBlZGVmIHN0cnVjdCBleHRlcm5hbF9hb3V0aGRyCit7CisgIHVuc2lnbmVkIGNoYXIgbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCQkqLworICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIHVuc2lnbmVkIGNoYXIgYmxkcmV2WzJdOwkvKiA/PyAqLworICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMl07CS8qIHBhZCB0byBxdWFkd29yZCBib3VuZGFyeQkJKi8KKyAgdW5zaWduZWQgY2hhcgl0c2l6ZVs4XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzCQkJKi8KKyAgdW5zaWduZWQgY2hhcglkc2l6ZVs4XTsJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICB1bnNpZ25lZCBjaGFyCWJzaXplWzhdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIHVuc2lnbmVkIGNoYXIJZW50cnlbOF07CS8qIGVudHJ5IHB0LgkJCQkqLworICB1bnNpZ25lZCBjaGFyIHRleHRfc3RhcnRbOF07CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgY2hhciBkYXRhX3N0YXJ0WzhdOwkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIgYnNzX3N0YXJ0WzhdOwkvKiBiYXNlIG9mIGJzcyB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgY2hhciBncHJtYXNrWzRdOwkvKiBiaXRtYXNrIG9mIGdlbmVyYWwgcmVnaXN0ZXJzIHVzZWQgKi8KKyAgdW5zaWduZWQgY2hhciBmcHJtYXNrWzRdOwkvKiBiaXRtYXNrIG9mIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2VkICovCisgIHVuc2lnbmVkIGNoYXIgZ3BfdmFsdWVbOF07CS8qIHZhbHVlIGZvciBncCByZWdpc3RlciAqLworfSBBT1VUSERSOworCisvKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KKworI2RlZmluZSBBT1VUU1ogODAKKyNkZWZpbmUgQU9VVEhEUlNaIDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9zY25oZHIgeworICB1bnNpZ25lZCBjaGFyCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KKyAgdW5zaWduZWQgY2hhcglzX3BhZGRyWzhdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworICB1bnNpZ25lZCBjaGFyCXNfdmFkZHJbOF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KKyAgdW5zaWduZWQgY2hhcglzX3NpemVbOF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCisgIHVuc2lnbmVkIGNoYXIJc19zY25wdHJbOF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJc19yZWxwdHJbOF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KKyAgdW5zaWduZWQgY2hhcglzX2xubm9wdHJbOF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworICB1bnNpZ25lZCBjaGFyCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCisgIHVuc2lnbmVkIGNoYXIJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworICB1bnNpZ25lZCBjaGFyCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KK307CisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTY0CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgeworICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbOF07CisgIHVuc2lnbmVkIGNoYXIgcl9zeW1uZHhbNF07CisgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOworfTsKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTYKKworLyogQ29uc3RhbnRzIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkLiAgVGhlIEFscGhhIHNlZW1zIHRvIGFsd2F5cyBiZQorICAgbGl0dGxlIGVuZGlhbiwgc28gSSBoYXZlbid0IGJvdGhlcmVkIHRvIGRlZmluZSBiaWcgZW5kaWFuIHZhcmlhbnRzCisgICBvZiB0aGVzZS4gICovCisKKyNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUJCQkweGZmCisjZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFCQkwCisKKyNkZWZpbmUgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRQkJMHgwMQorCisjZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUJCTB4N2UKKyNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRQkJMQorCisjZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkJMHg4MAorI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJCTcKKyNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfTElUVExFCQkweGZmCisjZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTEKKyNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfTElUVExFCQkweDAzCisjZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTkKKworI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRQkJCTB4ZmMKKyNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUJCTIKKworLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhIHJlbG9jIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCisjZGVmaW5lIEFMUEhBX1JfSUdOT1JFCQkwCisjZGVmaW5lIEFMUEhBX1JfUkVGTE9ORwkJMQorI2RlZmluZSBBTFBIQV9SX1JFRlFVQUQJCTIKKyNkZWZpbmUgQUxQSEFfUl9HUFJFTDMyCQkzCisjZGVmaW5lIEFMUEhBX1JfTElURVJBTAkJNAorI2RlZmluZSBBTFBIQV9SX0xJVFVTRQkJNQorI2RlZmluZSBBTFBIQV9SX0dQRElTUAkJNgorI2RlZmluZSBBTFBIQV9SX0JSQUREUgkJNworI2RlZmluZSBBTFBIQV9SX0hJTlQJCTgKKyNkZWZpbmUgQUxQSEFfUl9TUkVMMTYJCTkKKyNkZWZpbmUgQUxQSEFfUl9TUkVMMzIJICAgICAgIDEwCisjZGVmaW5lIEFMUEhBX1JfU1JFTDY0CSAgICAgICAxMQorI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJICAgICAgIDEyCisjZGVmaW5lIEFMUEhBX1JfT1BfU1RPUkUgICAgICAgMTMKKyNkZWZpbmUgQUxQSEFfUl9PUF9QU1VCCSAgICAgICAxNAorI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQgICAgIDE1CisjZGVmaW5lIEFMUEhBX1JfR1BWQUxVRQkgICAgICAgMTYKKyNkZWZpbmUgQUxQSEFfUl9HUFJFTEhJR0ggICAgICAxNworI2RlZmluZSBBTFBIQV9SX0dQUkVMTE9XICAgICAgIDE4CisjZGVmaW5lIEFMUEhBX1JfSU1NRUQgICAgICAgICAgMTkKKworLyogT3ZlcmxvYWRlZCByZWxvYyB2YWx1ZSB1c2VkIGJ5IE5ldC0gYW5kIE9wZW5CU0QuICAqLworI2RlZmluZSBBTFBIQV9SX0xJVEVSQUxTTEVBWlkgIDE3CisKKy8qIFdpdGggQUxQSEFfUl9MSVRVU0UsIHRoZSByX3NpemUgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KKyNkZWZpbmUgQUxQSEFfUl9MVV9CQVNFICAgICAgICAgMQorI2RlZmluZSBBTFBIQV9SX0xVX0JZVE9GRiAgICAgICAyCisjZGVmaW5lIEFMUEhBX1JfTFVfSlNSICAgICAgICAgIDMKKworLyogV2l0aCBBTFBIQV9SX0lNTUVELCB0aGUgcl9zaXplIGZpZWxkIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCisjZGVmaW5lIEFMUEhBX1JfSU1NRURfR1BfMTYgICAgIDEKKyNkZWZpbmUgQUxQSEFfUl9JTU1FRF9HUF9ISTMyICAgMgorI2RlZmluZSBBTFBIQV9SX0lNTUVEX1NDTl9ISTMyICAzCisjZGVmaW5lIEFMUEhBX1JfSU1NRURfQlJfSEkzMiAgIDQKKyNkZWZpbmUgQUxQSEFfUl9JTU1FRF9MTzMyICAgICAgNQorCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xJQyBJTkZPUk1BVElPTiAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZS4gICovCisKKy8qIEVDT0ZGIHVzZXMgQ09GRi1saWtlIHNlY3Rpb24gc3RydWN0dXJlcywgYnV0IGl0cyBvd24gc3ltYm9sIGZvcm1hdC4KKyAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzeW1ib2wgZm9ybWF0IGluIGZpZWxkcyB3aG9zZSBzaXplIGFuZCBhbGlnbm1lbnQKKyAgIHdpbGwgbm90IHZhcnkgb24gZGlmZmVyZW50IGhvc3Qgc3lzdGVtcy4gICovCisKKy8qIEZpbGUgaGVhZGVyIGFzIGEgc2V0IG9mIGJ5dGVzICovCisKK3N0cnVjdCBoZHJfZXh0IHsKKwl1bnNpZ25lZCBjaGFyIAloX21hZ2ljWzJdOworCXVuc2lnbmVkIGNoYXIJaF92c3RhbXBbMl07CisJdW5zaWduZWQgY2hhcgloX2lsaW5lTWF4WzRdOworCXVuc2lnbmVkIGNoYXIJaF9pZG5NYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2lwZE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaXN5bU1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaW9wdE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaWF1eE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaXNzTWF4WzRdOworCXVuc2lnbmVkIGNoYXIJaF9pc3NFeHRNYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2lmZE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY3JmZFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaWV4dE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lWzhdOworCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVPZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiRG5PZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiUGRPZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiU3ltT2Zmc2V0WzhdOworCXVuc2lnbmVkIGNoYXIJaF9jYk9wdE9mZnNldFs4XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JBdXhPZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiU3NPZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiU3NFeHRPZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiRmRPZmZzZXRbOF07CisJdW5zaWduZWQgY2hhcgloX2NiUmZkT2Zmc2V0WzhdOworCXVuc2lnbmVkIGNoYXIJaF9jYkV4dE9mZnNldFs4XTsKK307CisKKy8qIEZpbGUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KKworc3RydWN0IGZkcl9leHQgeworCXVuc2lnbmVkIGNoYXIJZl9hZHJbOF07CisJdW5zaWduZWQgY2hhcglmX2NiTGluZU9mZnNldFs4XTsKKwl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lWzhdOworCXVuc2lnbmVkIGNoYXIJZl9jYlNzWzhdOworCXVuc2lnbmVkIGNoYXIJZl9yc3NbNF07CisJdW5zaWduZWQgY2hhcglmX2lzc0Jhc2VbNF07CisJdW5zaWduZWQgY2hhcglmX2lzeW1CYXNlWzRdOworCXVuc2lnbmVkIGNoYXIJZl9jc3ltWzRdOworCXVuc2lnbmVkIGNoYXIJZl9pbGluZUJhc2VbNF07CisJdW5zaWduZWQgY2hhcglmX2NsaW5lWzRdOworCXVuc2lnbmVkIGNoYXIJZl9pb3B0QmFzZVs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfY29wdFs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfaXBkRmlyc3RbNF07CisJdW5zaWduZWQgY2hhcglmX2NwZFs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfaWF1eEJhc2VbNF07CisJdW5zaWduZWQgY2hhcglmX2NhdXhbNF07CisJdW5zaWduZWQgY2hhcglmX3JmZEJhc2VbNF07CisJdW5zaWduZWQgY2hhcglmX2NyZmRbNF07CisJdW5zaWduZWQgY2hhcglmX2JpdHMxWzFdOworCXVuc2lnbmVkIGNoYXIJZl9iaXRzMlszXTsKKwl1bnNpZ25lZCBjaGFyCWZfcGFkZGluZ1s0XTsKK307CisKKyNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfQklHCQkweEY4CisjZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0JJRwkJMworI2RlZmluZQlGRFJfQklUUzFfTEFOR19MSVRUTEUJCTB4MUYKKyNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFCTAKKworI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0JJRwkJMHgwNAorI2RlZmluZQlGRFJfQklUUzFfRk1FUkdFX0xJVFRMRQkJMHgyMAorCisjZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0JJRwkJMHgwMgorI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9MSVRUTEUJMHg0MAorCisjZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0JJRwkweDAxCisjZGVmaW5lCUZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRQkweDgwCisKKyNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9CSUcJCTB4QzAKKyNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9CSUcJCTYKKyNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUJCTB4MDMKKyNkZWZpbmUJRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEUJMAorCisvKiBXZSBpZ25vcmUgdGhlIGByZXNlcnZlZCcgZmllbGQgaW4gYml0czIuICovCisKKy8qIFByb2NlZHVyZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLworCitzdHJ1Y3QgcGRyX2V4dCB7CisJdW5zaWduZWQgY2hhcglwX2Fkcls4XTsKKwl1bnNpZ25lZCBjaGFyCXBfY2JMaW5lT2Zmc2V0WzhdOworCXVuc2lnbmVkIGNoYXIJcF9pc3ltWzRdOworCXVuc2lnbmVkIGNoYXIJcF9pbGluZVs0XTsKKwl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKKwl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOworCXVuc2lnbmVkIGNoYXIJcF9pb3B0WzRdOworCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKKwl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcglwX2xuTG93WzRdOworCXVuc2lnbmVkIGNoYXIJcF9sbkhpZ2hbNF07CisJdW5zaWduZWQgY2hhcglwX2dwX3Byb2xvZ3VlWzFdOworCXVuc2lnbmVkIGNoYXIJcF9iaXRzMVsxXTsKKwl1bnNpZ25lZCBjaGFyCXBfYml0czJbMV07CisJdW5zaWduZWQgY2hhcglwX2xvY2Fsb2ZmWzFdOworCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKKwl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Cit9OworCisjZGVmaW5lIFBEUl9CSVRTMV9HUF9VU0VEX0JJRwkJMHg4MAorI2RlZmluZSBQRFJfQklUUzFfUkVHX0ZSQU1FX0JJRwkJMHg0MAorI2RlZmluZSBQRFJfQklUUzFfUFJPRl9CSUcJCTB4MjAKKyNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX0JJRwkJMHgxZgorI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfU0hfTEVGVF9CSUcJOAorI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfQklHCQkweGZmCisjZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9CSUcJMAorCisjZGVmaW5lIFBEUl9CSVRTMV9HUF9VU0VEX0xJVFRMRQkweDAxCisjZGVmaW5lIFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFCTB4MDIKKyNkZWZpbmUgUERSX0JJVFMxX1BST0ZfTElUVExFCQkweDA0CisjZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9MSVRUTEUJMHhmOAorI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCTMKKyNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkweGZmCisjZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSA1CisKKy8qIExpbmUgbnVtYmVycyAqLworCitzdHJ1Y3QgbGluZV9leHQgeworCXVuc2lnbmVkIGNoYXIJbF9saW5lWzRdOworfTsKKworLyogU3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLworCitzdHJ1Y3Qgc3ltX2V4dCB7CisJdW5zaWduZWQgY2hhcglzX3ZhbHVlWzhdOworCXVuc2lnbmVkIGNoYXIJc19pc3NbNF07CisJdW5zaWduZWQgY2hhcglzX2JpdHMxWzFdOworCXVuc2lnbmVkIGNoYXIJc19iaXRzMlsxXTsKKwl1bnNpZ25lZCBjaGFyCXNfYml0czNbMV07CisJdW5zaWduZWQgY2hhcglzX2JpdHM0WzFdOworfTsKKworI2RlZmluZQlTWU1fQklUUzFfU1RfQklHCQkweEZDCisjZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9CSUcJCTIKKyNkZWZpbmUJU1lNX0JJVFMxX1NUX0xJVFRMRQkJMHgzRgorI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfTElUVExFCQkwCisKKyNkZWZpbmUJU1lNX0JJVFMxX1NDX0JJRwkJMHgwMworI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcJMworI2RlZmluZQlTWU1fQklUUzFfU0NfTElUVExFCQkweEMwCisjZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MSVRUTEUJCTYKKworI2RlZmluZQlTWU1fQklUUzJfU0NfQklHCQkweEUwCisjZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9CSUcJCTUKKyNkZWZpbmUJU1lNX0JJVFMyX1NDX0xJVFRMRQkJMHgwNworI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfTEVGVF9MSVRUTEUJMgorCisjZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9CSUcJCTB4MTAKKyNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkweDA4CisKKyNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0JJRwkJMHgwRgorI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJMTYKKyNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX0xJVFRMRQkJMHhGMAorI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfU0hfTElUVExFCTQKKworI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcJOAorI2RlZmluZQlTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJNAorCisjZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0JJRwkwCisjZGVmaW5lCVNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRQkxMgorCisvKiBFeHRlcm5hbCBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCisKK3N0cnVjdCBleHRfZXh0IHsKKwlzdHJ1Y3QJc3ltX2V4dCBlc19hc3ltOworCXVuc2lnbmVkIGNoYXIJZXNfYml0czFbMV07CisJdW5zaWduZWQgY2hhcgllc19iaXRzMlszXTsKKwl1bnNpZ25lZCBjaGFyCWVzX2lmZFs0XTsKK307CisKKyNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9CSUcJCTB4ODAKKyNkZWZpbmUJRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUJCTB4MDEKKworI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcJMHg0MAorI2RlZmluZQlFWFRfQklUUzFfQ09CT0xfTUFJTl9MSVRUTEUJMHgwMgorCisjZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0JJRwkJMHgyMAorI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUJMHgwNAorCisvKiBEZW5zZSBudW1iZXJzIGV4dGVybmFsIHJlY29yZCAqLworCitzdHJ1Y3QgZG5yX2V4dCB7CisJdW5zaWduZWQgY2hhcglkX3JmZFs0XTsKKwl1bnNpZ25lZCBjaGFyCWRfaW5kZXhbNF07Cit9OworCisvKiBSZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgKi8KKworc3RydWN0IHJmZF9leHQgeworICB1bnNpZ25lZCBjaGFyCXJmZFs0XTsKK307CisKKy8qIE9wdGltaXplciBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCisKK3N0cnVjdCBvcHRfZXh0IHsKKyAgdW5zaWduZWQgY2hhciBvX2JpdHMxWzFdOworICB1bnNpZ25lZCBjaGFyIG9fYml0czJbMV07CisgIHVuc2lnbmVkIGNoYXIgb19iaXRzM1sxXTsKKyAgdW5zaWduZWQgY2hhciBvX2JpdHM0WzFdOworICBzdHJ1Y3Qgcm5keF9leHQgb19ybmR4OworICB1bnNpZ25lZCBjaGFyIG9fb2Zmc2V0WzRdOworfTsKKworI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcJMTYKKyNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFCTAKKworI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9CSUcJOAorI2RlZmluZSBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9MSVRUTEUJOAorCisjZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0JJRwkwCisjZGVmaW5lIE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0xJVFRMRQkxNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oIGIvaW5jbHVkZS9jb2ZmL2Fwb2xsby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzQ3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgQXBvbGxvIE02OEsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKworLyogTW90b3JvbGEgNjgwMDAvNjgwMDgvNjgwMTAvNjgwMjAgKi8KKyNkZWZpbmUJTUM2OE1BR0lDCTA1MjAKKyNkZWZpbmUgTUM2OEtXUk1BR0lDCTA1MjAJLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKi8KKyNkZWZpbmUJTUM2OFRWTUFHSUMJMDUyMQorI2RlZmluZSBNQzY4S1JPTUFHSUMJMDUyMQkvKiByZWFkb25seSBzaGFyZWFibGUgdGV4dCBzZWdtZW50cyAqLworI2RlZmluZSBNQzY4S1BHTUFHSUMJMDUyMgkvKiBkZW1hbmQgcGFnZWQgdGV4dCBzZWdtZW50cyAqLworI2RlZmluZQlNNjhNQUdJQwkwMjEwCisjZGVmaW5lCU02OFRWTUFHSUMJMDIxMQorCisvKiBBcG9sbG8gNjgwMDAtYmFzZWQgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCBtYWdpYyBudW1iZXIuIFRoaXMgY29tZXMKKyAqIGZyb20gL3Vzci9pbmNsdWRlL2Fwb2xsby9maWxlaGRyLmgKKyAqLworI2RlZmluZSBBUE9MTE9NNjhLTUFHSUMgMDYyNworCisjZGVmaW5lIE9NQUdJQyBNNjhNQUdJQworI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKKyAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICAmJiBcCisgICgoeCkuZl9tYWdpYyE9QVBPTExPTTY4S01BR0lDKSApCisKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIJb19zcmlbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuc3JpIGRhdGEgcG9pbnRlciAqLworICBjaGFyICBvX2lubGliWzRdOwkJLyogQXBvbGxvIHNwZWNpZmljIC0gLmlubGliIGRhdGEgcG9pbnRlciAqLworICBjaGFyCXZpZFs4XTsJCQkvKiBBcG9sbG8gc3BlY2lmaWMgLSA2NCBiaXQgdmVyc2lvbiBJRCAqLworfQorQU9VVEhEUjsKKworI2RlZmluZQlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUiAxIC8qIHRoZSB2YWx1ZSBvZiB0aGUgYW91dGhkciBtYWdpYyAqLworI2RlZmluZQlBT1VUSERSU1ogNDQKKyNkZWZpbmUgQU9VVFNaIDQ0CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwkvKiBBcG9sbG8gYWxsb3cgZm9yIGxhcmdlciBzZWN0aW9uIG5hbWVzIGJ5ICBhbGxvd2luZyBpdCB0byBiZSBpbgorCSAqIHRoZSBzdHJpbmcgdGFibGUuCisJICovCisJY2hhcgkJc19uYW1lWzhdOworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworLyogSWYgc196ZW9yZXMgaXMgYWxsIHplcm9lcywgc19vZmZzZXQgZ2l2ZXMgdGhlIHJlYWwgbG9jYXRpb24gb2YgdGhlIG5hbWUKKyAqIGluIHRoZSBzdHJpbmcgdGFibGUuCisgKi8KKworI2RlZmluZQlzX3plcm9lcyBzZWN0aW9uX25hbWUuc19uYW1lCisjZGVmaW5lCXNfb2Zmc2V0IChzZWN0aW9uX25hbWUuc19uYW1lKzQpCisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKyNkZWZpbmUgX1RWCSIudHYiCisjZGVmaW5lIF9JTklUCSIuaW5pdCIKKyNkZWZpbmUgX0ZJTkkJIi5maW5pIgorI2RlZmluZQlfTElORVMJIi5saW5lcyIKKyNkZWZpbmUJX0JMT0NLUwkiLmJsb2NrcyIKKyNkZWZpbmUgX1NSSSAgICAiLnNyaSIgICAgICAgICAgICAgICAgICAvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKHN5c3R5cGUsCisgZXQgYWwuKSAqLworI2RlZmluZSBfTUlSICAgICIubWlyIiAgICAgICAgICAgICAgICAgIC8qIE1vZHVsZSBJbmZvcm1hdGlvbiBSZWNvcmRzICAqLworI2RlZmluZSBfQVBUViAgICIuYXB0diIgICAgICAgICAgICAgICAgIC8qIEFwb2xsby1zdHlsZSB0cmFuc2ZlciB2ZWN0b3JzLiAqLworI2RlZmluZSBfSU5MSUIgICIuaW5saWIiICAgICAgICAgICAgICAgIC8qIFNoYXJlZCBMaWJyYXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIF9SV0RJICAgIi5yd2RpIiAgICAgICAgIC8qIFJlYWQvd3JpdGUgZGF0YSBpbml0aWFsaXphdGlvbiBkaXJlY3RpdmVzIGZvcgorIGNvbXByZXNzZWQgc2VjdGlvbnMgKi8KKyNkZWZpbmUgX1VOV0lORCAiLnVud2luZCIgICAgICAgICAgICAgICAvKiBTdGFjayB1bndpbmQgaW5mb3JtYXRpb24gKi8KKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk2CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfdHlwZVsyXTsKKyNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCisgIGNoYXIgcl9vZmZzZXRbNF07CisjZW5kaWYKKworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworCisjaWZkZWYgTTY4S19DT0ZGX09GRlNFVAorI2RlZmluZSBSRUxTWiAxNAorI2Vsc2UKKyNkZWZpbmUgUkVMU1ogMTAKKyNlbmRpZgorCisvKiBBcG9sbG8gc3BlY2lmaWMgU1RZUCBmbGFncyAqLworCisjZGVmaW5lIFNUWVBfUkVMT0NBVEVEX05PVF9MT0FERUQgMHgwMDAxMDAwMAkvKiBTZWN0aW9uIGlzIHJlbG9jYXRlZCBub3JtYWxseSBkdXJpbmcgbGlua2luZywgYnV0IG5lZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIG5vdCBiZSBsb2FkZWQgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uICovCisjZGVmaW5lIFNUWVBfREVCVUcgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogZGVidWcgc2VjdGlvbiAqLworI2RlZmluZSBTVFlQX09WRVJMQVkJCTB4MDAwNDAwMDAJLyogU2VjdGlvbiBpcyBvdmVybGF5ZWQgKi8KKyNkZWZpbmUgU1RZUF9JTlNUUlVDVElPTiAgICAJMHgwMDIwMDAwMAkvKiBTZWN0aW9uIGNvbnRhaW5zIGV4ZWN1dGFibGUgY29kZSAqLworCisjZGVmaW5lIFNUWVBfWkVSTwkJMHgwMDgwMDAwMAkvKiBTZWN0aW9uIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKi8KKyNkZWZpbmUgU1RZUF9JTlNUQUxMRUQJCTB4MDIwMDAwMDAJLyogU2VjdGlvbiBzaG91bGQgYmUgaW5zdGFsbGFibGUgaW4gS0dUICovCisjZGVmaW5lIFNUWVBfTE9PS19JTlNUQUxMRUQJMHgwNDAwMDAwMAkvKiBMb29rIGZvciBzZWN0aW9uIGluIEtHVCAqLworI2RlZmluZSBTVFlQX1NFQ0FMSUdOMQkJMHgwODAwMDAwMAkvKiBTcGVjaWFsbHkgYWxpZ25lZCBzZWN0aW9uICovCisjZGVmaW5lIFNUWVBfU0VDQUxJR04yCQkweDEwMDAwMDAwCS8qICAgICAgIiAgICAgICAiICAgICAgICIgICAgKi8KKyNkZWZpbmUgU1RZUF9DT01QUkVTU0VECQkweDIwMDAwMDAwCS8qIE5vIHNlY3Rpb24gZGF0YSBwZXIgc2UgKHNfc2NucHRyID0gMCksIGJ1dCB0aGVyZSBhcmUKKwkJCQkJCSAgIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yIGl0IGluIC5yd2RpIHNlY3Rpb24KKwkJCQkJCSAgICh1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU1RZUF9CU1MpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXJtLmggYi9pbmNsdWRlL2NvZmYvYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1NzhiMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9hcm0uaApAQCAtMCwwICsxLDI1OCBAQAorLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciB0aGUgQVJNICovCisKKyNkZWZpbmUgQ09GRkFSTSAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKKwljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisJY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisJY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCisJY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisvKiBCaXRzIGZvciBmX2ZsYWdzOgorICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKKyAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqICAgICAgRl9JTlRFUldPUksgICAgIGZpbGUgc3VwcG9ydHMgc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBpbnN0cnVjdGlvbiBzZXRzCisgKiAgICAgIEZfSU5URVJXT1JLX1NFVCB0aGUgRl9JTlRFUldPUksgYml0IGlzIHZhbGlkCisgKglGX0FQQ1NfRkxPQVQJY29kZSBwYXNzZXMgZmxvYXQgYXJndW1lbnRzIGluIGZsb2F0IHJlZ2lzdGVycworICoJRl9QSUMJCWNvZGUgaXMgcmVlbnRyYW50L3Bvc2l0aW9uLWluZGVwZW5kZW50CisgKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKKyAqCUZfQVBDU18yNglmaWxlIHVzZXMgMjYgYml0IEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZAorICoJRl9BUENTX1NFVAl0aGUgRl9BUENTXzI2LCBGX0FQQ1NfRkxPQVQgYW5kIEZfUElDIGJpdHMgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCisgKi8KKworI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQorI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCisjZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKKyNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKKyNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKKyNkZWZpbmUgRl9JTlRFUldPUktfU0VUCSgweDAwMjApCisjZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQorI3VuZGVmICBGX0FSMTZXUgorI2RlZmluZSBGX1BJQwkJKDB4MDA4MCkKKyNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKKyNkZWZpbmUgRl9BUENTXzI2CSgweDA0MDApCisjZGVmaW5lIEZfQVBDU19TRVQJKDB4MDgwMCkKKworLyogQml0cyBzdG9yZWQgaW4gZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlICovCisKKyNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKKyNkZWZpbmUgRl9QSUNfSU5UCSgweDAwMjApCisjZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQorI2RlZmluZSBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSwkoMHgwYzAwKQorI2RlZmluZSBGX0FSTV8yCQkoMHgwMDAwKQorI2RlZmluZSBGX0FSTV8yYQkoMHgwMDAwKQorI2RlZmluZSBGX0FSTV8zCQkoMHgwNDAwKQorI2RlZmluZSBGX0FSTV8zTQkoMHgwNDAwKQorI2RlZmluZSBGX0FSTV80CQkoMHgwODAwKQorI2RlZmluZSBGX0FSTV80VAkoMHgwYzAwKQorI2RlZmluZSBGX0FQQ1MyNgkoMHg0MDAwKQorCisvKgorICogQVJNTUFHSUMgb3VnaHQgdG8gZW5jb2RlZCB0aGUgcHJvY2Vzb3IgdHlwZSwKKyAqIGJ1dCBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBpbnN0ZWFkCisgKiB0aGUgZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlCisgKiBpcyB1c2VkIGFzIHNob3duIGFib3ZlLgorICoKKyAqIFhYWCAtIE5DIDUvNi85NworICovCisKKyNkZWZpbmUJQVJNTUFHSUMJMHhhMDAgIC8qIEkganVzdCBtYWRlIHRoaXMgdXAgKi8gCisKKyNkZWZpbmUgQVJNQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gQVJNTUFHSUMpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworCisKK30KK0FPVVRIRFI7CisKKworI2RlZmluZSBBT1VUU1ogMjgKKyNkZWZpbmUgQU9VVEhEUlNaIDI4CisKKyNkZWZpbmUgT01BR0lDICAgICAgICAgIDA0MDQgICAgLyogb2JqZWN0IGZpbGVzLCBlZyBhcyBvdXRwdXQgKi8KKyNkZWZpbmUgWk1BR0lDICAgICAgICAgIDA0MTMgICAgLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCisjZGVmaW5lIFNUTUFHSUMJCTA0MDEJLyogdGFyZ2V0IHNobGliICovCisjZGVmaW5lIFNITUFHSUMJCTA0NDMJLyogaG9zdCAgIHNobGliICovCisKKworLyogZGVmaW5lIHNvbWUgTlQgZGVmYXVsdCB2YWx1ZXMgKi8KKy8qICAjZGVmaW5lIE5UX0lNQUdFX0JBU0UgICAgICAgIDB4NDAwMDAwIG1vdmVkIHRvIGludGVybmFsLmggKi8KKyNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCisjZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwICAKKyNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisJY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworLyoKKyAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucworICovCisjZGVmaW5lIF9URVhUCSIudGV4dCIKKyNkZWZpbmUgX0RBVEEJIi5kYXRhIgorI2RlZmluZSBfQlNTCSIuYnNzIgorI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCisjZGVmaW5lIF9MSUIgIi5saWIiCisKKy8qIFdlIHVzZSB0aGUgLnJkYXRhIHNlY3Rpb24gdG8gaG9sZCByZWFkIG9ubHkgZGF0YS4gICovCisjZGVmaW5lIF9MSVQJIi5yZGF0YSIKKworLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgorICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCisgKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQorICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCitzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKKwl1bmlvbiB7CisJCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLworCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworCX0gbF9hZGRyOworCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KK307CisKKworI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubworI2RlZmluZQlMSU5FU1oJNgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCisjZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07CisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOworICAgIH0gZTsKKyAgfSBlOworICBjaGFyIGVfdmFsdWVbNF07CisgIGNoYXIgZV9zY251bVsyXTsKKyAgY2hhciBlX3R5cGVbMl07CisgIGNoYXIgZV9zY2xhc3NbMV07CisgIGNoYXIgZV9udW1hdXhbMV07Cit9OworCisjZGVmaW5lIE5fQlRNQVNLCSgweGYpCisjZGVmaW5lIE5fVE1BU0sJCSgweDMwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLworCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCisJCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCisJCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKyMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgeworICBjaGFyIHJfdmFkZHJbNF07CisgIGNoYXIgcl9zeW1uZHhbNF07CisgIGNoYXIgcl90eXBlWzJdOworICBjaGFyIHJfb2Zmc2V0WzRdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmggYi9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODljMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL2F1eC1jb2ZmLmgKQEAgLTAsMCArMSwzMSBAQAorLyogTW9kaWZpY2F0aW9ucyBvZiBpbnRlcm5hbC5oIGFuZCBtNjhrLmggbmVlZGVkIGJ5IEEvVVgKKyAgIFN1Z2dlc3RlZCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gKi8KKworI2lmbmRlZiBHTlVfQ09GRl9BVVhfSAorI2RlZmluZSBHTlVfQ09GRl9BVVhfSCAxCisKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiY29mZi9tNjhrLmgiCisKKy8qIFNlY3Rpb24gY29udGFpbnMgNjQtYnl0ZSBwYWRkZWQgcGF0aG5hbWVzIG9mIHNoYXJlZCBsaWJyYXJpZXMgKi8KKyN1bmRlZiBTVFlQX0xJQgorI2RlZmluZSBTVFlQX0xJQiAweDIwMAorCisvKiBTZWN0aW9uIGNvbnRhaW5zIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KKyN1bmRlZiBTVFlQX0lOSVQKKyNkZWZpbmUgU1RZUF9JTklUIDB4NDAwCisKKy8qIFNlY3Rpb24gY29udGFpbnMgLmlkZW50IGluZm9ybWF0aW9uICovCisjdW5kZWYgU1RZUF9JREVOVAorI2RlZmluZSBTVFlQX0lERU5UIDB4ODAwCisKKy8qIFNlY3Rpb24gdHlwZXMgdXNlZCBieSBiZmQgYW5kIGdhcyBub3QgZGVmaW5lZCAoZGlyZWN0bHkpIGJ5IEEvVVggKi8KKyN1bmRlZiBTVFlQX09WRVIKKyNkZWZpbmUgU1RZUF9PVkVSIDAKKyN1bmRlZiBTVFlQX0lORk8KKyNkZWZpbmUgU1RZUF9JTkZPIFNUWVBfSURFTlQKKworLyogVHJhZGl0aW9uYWwgbmFtZSBvZiB0aGUgc2VjdGlvbiB0YWdnZWQgd2l0aCBTVFlQX0xJQiAqLworI2RlZmluZSBfTElCICIubGliIgorCisjZW5kaWYgLyogR05VX0NPRkZfQVVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9lY29mZi5oIGIvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0MjAyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9lY29mZi5oCkBAIC0wLDAgKzEsNDIxIEBACisjaWZuZGVmIEVDT0ZGX0gKKyNkZWZpbmUgRUNPRkZfSAorCisvKiBHZW5lcmljIEVDT0ZGIHN1cHBvcnQuCisgICBUaGlzIGRvZXMgbm90IGluY2x1ZGUgc3ltYm9sIGluZm9ybWF0aW9uLCBmb3VuZCBpbiBzeW0uaCBhbmQKKyAgIHN5bWNvbnN0LmguICAqLworCisvKiBNaXBzIG1hZ2ljIG51bWJlcnMgdXNlZCBpbiBmaWxlaGRyLiAgTUlQU19NQUdJQ19MSVRUTEUgaXMgdXNlZCBvbgorICAgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4gIE1JUFNfTUFHSUNfQklHIGlzIHVzZWQgb24gYmlnIGVuZGlhbgorICAgbWFjaGluZXMuICBXaGVyZSBpcyBNSVBTX01BR0lDXzEgZnJvbT8gICovCisjZGVmaW5lIE1JUFNfTUFHSUNfMSAweDAxODAKKyNkZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUgMHgwMTYyCisjZGVmaW5lIE1JUFNfTUFHSUNfQklHIDB4MDE2MAorCisvKiBUaGVzZSBhcmUgdGhlIG1hZ2ljIG51bWJlcnMgdXNlZCBmb3IgTUlQUyBjb2RlIGNvbXBpbGVkIGF0IElTQQorICAgbGV2ZWwgMi4gICovCisjZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMiAweDAxNjYKKyNkZWZpbmUgTUlQU19NQUdJQ19CSUcyIDB4MDE2MworCisvKiBUaGVzZSBhcmUgdGhlIG1hZ2ljIG51bWJlcnMgdXNlZCBmb3IgTUlQUyBjb2RlIGNvbXBpbGVkIGF0IElTQQorICAgbGV2ZWwgMy4gICovCisjZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFMyAweDE0MgorI2RlZmluZSBNSVBTX01BR0lDX0JJRzMgMHgxNDAKKworLyogQWxwaGEgbWFnaWMgbnVtYmVycyB1c2VkIGluIGZpbGVoZHIuICAqLworI2RlZmluZSBBTFBIQV9NQUdJQyAweDE4MworI2RlZmluZSBBTFBIQV9NQUdJQ19CU0QgMHgxODUKKworLyogTWFnaWMgbnVtYmVycyB1c2VkIGluIGEub3V0IGhlYWRlci4gICovCisjZGVmaW5lIEVDT0ZGX0FPVVRfT01BR0lDIDA0MDcJLyogbm90IGRlbWFuZCBwYWdlZCAobGQgLU4pLiAgKi8KKyNkZWZpbmUgRUNPRkZfQU9VVF9aTUFHSUMgMDQxMwkvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KKworLyogTmFtZXMgb2Ygc3BlY2lhbCBzZWN0aW9ucy4gICovCisjZGVmaW5lIF9URVhUICAgIi50ZXh0IgorI2RlZmluZSBfREFUQSAgICIuZGF0YSIKKyNkZWZpbmUgX0JTUyAgICAiLmJzcyIKKyNkZWZpbmUgX1JEQVRBCSIucmRhdGEiCisjZGVmaW5lIF9TREFUQQkiLnNkYXRhIgorI2RlZmluZSBfU0JTUwkiLnNic3MiCisjZGVmaW5lIF9MSVRBCSIubGl0YSIKKyNkZWZpbmUgX0xJVDQJIi5saXQ0IgorI2RlZmluZSBfTElUOAkiLmxpdDgiCisjZGVmaW5lIF9MSUIJIi5saWIiCisjZGVmaW5lIF9JTklUCSIuaW5pdCIKKyNkZWZpbmUgX0ZJTkkJIi5maW5pIgorI2RlZmluZSBfUERBVEEJIi5wZGF0YSIKKyNkZWZpbmUgX1hEQVRBCSIueGRhdGEiCisjZGVmaW5lIF9HT1QJIi5nb3QiCisjZGVmaW5lIF9IQVNICSIuaGFzaCIKKyNkZWZpbmUgX0RZTlNZTQkiLmR5bnN5bSIKKyNkZWZpbmUgX0RZTlNUUgkiLmR5bnN0ciIKKyNkZWZpbmUgX1JFTERZTgkiLnJlbC5keW4iCisjZGVmaW5lIF9DT05GTElDICIuY29uZmxpYyIKKyNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgorI2RlZmluZSBfTElCTElTVCAiLmxpYmxpc3QiCisjZGVmaW5lIF9EWU5BTUlDICIuZHluYW1pYyIKKyNkZWZpbmUgX1JDT05TVAkiLnJjb25zdCIKKworLyogRUNPRkYgdXNlcyBzb21lIGFkZGl0aW9uYWwgc2VjdGlvbiBmbGFncy4gICovCisjZGVmaW5lIFNUWVBfUkRBVEEJICAgICAweDEwMAorI2RlZmluZSBTVFlQX1NEQVRBCSAgICAgMHgyMDAKKyNkZWZpbmUgU1RZUF9TQlNTCSAgICAgMHg0MDAKKyNkZWZpbmUgU1RZUF9HT1QJICAgIDB4MTAwMAorI2RlZmluZSBTVFlQX0RZTkFNSUMJICAgIDB4MjAwMAorI2RlZmluZSBTVFlQX0RZTlNZTQkgICAgMHg0MDAwCisjZGVmaW5lIFNUWVBfUkVMRFlOCSAgICAweDgwMDAKKyNkZWZpbmUgU1RZUF9EWU5TVFIJICAgMHgxMDAwMAorI2RlZmluZSBTVFlQX0hBU0gJICAgMHgyMDAwMAorI2RlZmluZSBTVFlQX0xJQkxJU1QJICAgMHg0MDAwMAorI2RlZmluZSBTVFlQX0NPTkZMSUMJICAweDEwMDAwMAorI2RlZmluZSBTVFlQX0VDT0ZGX0ZJTkkJIDB4MTAwMDAwMAorI2RlZmluZSBTVFlQX0VYVEVOREVTQwkgMHgyMDAwMDAwIC8qIDB4MDJGRkYwMDAgYml0cyA9PiBzY24gdHlwZSwgcmVzdCBjbHIgKi8KKyNkZWZpbmUgU1RZUF9MSVRBCSAweDQwMDAwMDAKKyNkZWZpbmUgU1RZUF9MSVQ4CSAweDgwMDAwMDAKKyNkZWZpbmUgU1RZUF9MSVQ0CTB4MTAwMDAwMDAKKyNkZWZpbmUgU1RZUF9FQ09GRl9MSUIJMHg0MDAwMDAwMAorI2RlZmluZSBTVFlQX0VDT0ZGX0lOSVQgMHg4MDAwMDAwMAorI2RlZmluZSBTVFlQX09USEVSX0xPQUQgKFNUWVBfRUNPRkZfSU5JVCB8IFNUWVBfRUNPRkZfRklOSSkKKworLyogZXh0ZW5kZWQgc2VjdGlvbiB0eXBlcyAqLworI2RlZmluZSBTVFlQX0NPTU1FTlQJIDB4MjEwMDAwMAorI2RlZmluZSBTVFlQX1JDT05TVAkgMHgyMjAwMDAwCisjZGVmaW5lIFNUWVBfWERBVEEJIDB4MjQwMDAwMAorI2RlZmluZSBTVFlQX1BEQVRBCSAweDI4MDAwMDAKKworLyogVGhlIGxpbmtlciBuZWVkcyBhIHNlY3Rpb24gdG8gaG9sZCBzbWFsbCBjb21tb24gdmFyaWFibGVzIHdoaWxlCisgICBsaW5raW5nLiAgVGhlcmUgaXMgbm8gY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIGl0IHdoZW4gdGhlIGxpbmtlcgorICAgbmVlZHMgaXQsIHNvIHdlIGFsd2F5cyBjcmVhdGUgb25lIGZvciBlYWNoIEJGRC4gIFdlIHRoZW4gYXZvaWQKKyAgIHdyaXRpbmcgaXQgb3V0LiAgKi8KKyNkZWZpbmUgU0NPTU1PTiAiLnNjb21tb24iCisKKy8qIElmIHRoZSBleHRlcm4gYml0IGluIGEgcmVsb2MgaXMgMSwgdGhlbiByX3N5bW5keCBpcyBhbiBpbmRleCBpbnRvCisgICB0aGUgZXh0ZXJuYWwgc3ltYm9sIHRhYmxlLiAgSWYgdGhlIGV4dGVybiBiaXQgaXMgMCwgdGhlbiByX3N5bW5keAorICAgaW5kaWNhdGVzIGEgc2VjdGlvbiwgYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCisjZGVmaW5lIFJFTE9DX1NFQ1RJT05fTk9ORQkwCisjZGVmaW5lIFJFTE9DX1NFQ1RJT05fVEVYVAkxCisjZGVmaW5lIFJFTE9DX1NFQ1RJT05fUkRBVEEJMgorI2RlZmluZSBSRUxPQ19TRUNUSU9OX0RBVEEJMworI2RlZmluZSBSRUxPQ19TRUNUSU9OX1NEQVRBCTQKKyNkZWZpbmUgUkVMT0NfU0VDVElPTl9TQlNTCTUKKyNkZWZpbmUgUkVMT0NfU0VDVElPTl9CU1MJNgorI2RlZmluZSBSRUxPQ19TRUNUSU9OX0lOSVQJNworI2RlZmluZSBSRUxPQ19TRUNUSU9OX0xJVDgJOAorI2RlZmluZSBSRUxPQ19TRUNUSU9OX0xJVDQJOQorI2RlZmluZSBSRUxPQ19TRUNUSU9OX1hEQVRBICAgIDEwCisjZGVmaW5lIFJFTE9DX1NFQ1RJT05fUERBVEEgICAgMTEKKyNkZWZpbmUgUkVMT0NfU0VDVElPTl9GSU5JICAgICAxMgorI2RlZmluZSBSRUxPQ19TRUNUSU9OX0xJVEEgICAgIDEzCisjZGVmaW5lIFJFTE9DX1NFQ1RJT05fQUJTICAgICAgMTQKKyNkZWZpbmUgUkVMT0NfU0VDVElPTl9SQ09OU1QgICAxNQorCisjZGVmaW5lIE5VTV9SRUxPQ19TRUNUSU9OUyAgICAgMTYKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1RBQlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZ2NjIHVzZXMgbWlwcy10ZmlsZSB0byBvdXRwdXQgdHlwZSBpbmZvcm1hdGlvbiBpbiBzcGVjaWFsIHN0YWJzCisgICBlbnRyaWVzLiAgVGhlc2UgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9uIGluCisgICBnY2MvY29uZmlnL21pcHMuaC4gIEF0IHNvbWUgcG9pbnQsIHRoZXNlIHNob3VsZCBwcm9iYWJseSBnbyBpbnRvIGEKKyAgIHNoYXJlZCBpbmNsdWRlIGZpbGUsIGJ1dCBjdXJyZW50bHkgZ2NjIGFuZCBnZGIgZG8gbm90IHNoYXJlIGFueQorICAgZGlyZWN0b3JpZXMuICovCisjZGVmaW5lIENPREVfTUFTSyAweDhGMzAwCisjZGVmaW5lIEVDT0ZGX0lTX1NUQUIoc3ltKSAoKChzeW0pLT5pbmRleCAmIDB4RkZGMDApID09IENPREVfTUFTSykKKyNkZWZpbmUgRUNPRkZfTUFSS19TVEFCKGNvZGUpICgoY29kZSkrQ09ERV9NQVNLKQorI2RlZmluZSBFQ09GRl9VTk1BUktfU1RBQihjb2RlKSAoKGNvZGUpLUNPREVfTUFTSykKKyNkZWZpbmUgU1RBQlNfU1lNQk9MICJAc3RhYnMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqIENPRkYgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZ2NjIGFsc28gdXNlcyBtaXBzLXRmaWxlIHRvIG91dHB1dCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGl0IHVzZXMgd2hlbiBvdXRwdXR0aW5nIHRoZSAudHlwZSBkaXJlY3RpdmUuCisgICBUaGVzZSBzaG91bGQgYWxzbyBiZSBpbiBhIHNoYXJlZCBpbmNsdWRlIGZpbGUuICAqLworI2RlZmluZSBOX0JUTUFTSwkoMDE3KQorI2RlZmluZSBOX1RNQVNLCQkoMDYwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFVWCAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgYXV4aWxpYXJ5IHR5cGUgaW5mb3JtYXRpb24gaXMgdGhlIHNhbWUgb24gYWxsIGtub3duIEVDT0ZGCisgICB0YXJnZXRzLiAgSSBjYW4ndCBzZWUgYW55IHJlYXNvbiB0aGF0IGl0IHdvdWxkIGV2ZXIgY2hhbmdlLCBzbyBJIGFtCisgICBnb2luZyB0byBnYW1ibGUgYW5kIGRlZmluZSB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlcyBoZXJlLCBpbiB0aGUKKyAgIHRhcmdldCBpbmRlcGVuZGVudCBFQ09GRiBoZWFkZXIgZmlsZS4gIFRoZSBpbnRlcm5hbCBmb3JtcyBhcmUKKyAgIGRlZmluZWQgaW4gY29mZi9zeW0uaCwgd2hpY2ggd2FzIG9yaWdpbmFsbHkgZG9uYXRlZCBieSBNSVBTCisgICBDb21wdXRlciBTeXN0ZW1zLiAgKi8KKworLyogVHlwZSBpbmZvcm1hdGlvbiBleHRlcm5hbCByZWNvcmQgKi8KKworc3RydWN0IHRpcl9leHQgeworCXVuc2lnbmVkIGNoYXIJdF9iaXRzMVsxXTsKKwl1bnNpZ25lZCBjaGFyCXRfdHE0NVsxXTsKKwl1bnNpZ25lZCBjaGFyCXRfdHEwMVsxXTsKKwl1bnNpZ25lZCBjaGFyCXRfdHEyM1sxXTsKK307CisKKyNkZWZpbmUJVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcJCSgodW5zaWduZWQgaW50KSAweDgwKQorI2RlZmluZQlUSVJfQklUUzFfRkJJVEZJRUxEX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMSkKKworI2RlZmluZQlUSVJfQklUUzFfQ09OVElOVUVEX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4NDApCisjZGVmaW5lCVRJUl9CSVRTMV9DT05USU5VRURfTElUVExFCSgodW5zaWduZWQgaW50KSAweDAyKQorCisjZGVmaW5lCVRJUl9CSVRTMV9CVF9CSUcJCSgodW5zaWduZWQgaW50KSAweDNGKQorI2RlZmluZQlUSVJfQklUUzFfQlRfU0hfQklHCQkwCisjZGVmaW5lCVRJUl9CSVRTMV9CVF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEZDKQorI2RlZmluZQlUSVJfQklUUzFfQlRfU0hfTElUVExFCQkyCisKKyNkZWZpbmUJVElSX0JJVFNfVFE0X0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCisjZGVmaW5lCVRJUl9CSVRTX1RRNF9TSF9CSUcJCTQKKyNkZWZpbmUJVElSX0JJVFNfVFE1X0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCisjZGVmaW5lCVRJUl9CSVRTX1RRNV9TSF9CSUcJCTAKKyNkZWZpbmUJVElSX0JJVFNfVFE0X0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCisjZGVmaW5lCVRJUl9CSVRTX1RRNF9TSF9MSVRUTEUJCTAKKyNkZWZpbmUJVElSX0JJVFNfVFE1X0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCisjZGVmaW5lCVRJUl9CSVRTX1RRNV9TSF9MSVRUTEUJCTQKKworI2RlZmluZQlUSVJfQklUU19UUTBfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKKyNkZWZpbmUJVElSX0JJVFNfVFEwX1NIX0JJRwkJNAorI2RlZmluZQlUSVJfQklUU19UUTFfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKKyNkZWZpbmUJVElSX0JJVFNfVFExX1NIX0JJRwkJMAorI2RlZmluZQlUSVJfQklUU19UUTBfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKKyNkZWZpbmUJVElSX0JJVFNfVFEwX1NIX0xJVFRMRQkJMAorI2RlZmluZQlUSVJfQklUU19UUTFfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKKyNkZWZpbmUJVElSX0JJVFNfVFExX1NIX0xJVFRMRQkJNAorCisjZGVmaW5lCVRJUl9CSVRTX1RRMl9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQorI2RlZmluZQlUSVJfQklUU19UUTJfU0hfQklHCQk0CisjZGVmaW5lCVRJUl9CSVRTX1RRM19CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQorI2RlZmluZQlUSVJfQklUU19UUTNfU0hfQklHCQkwCisjZGVmaW5lCVRJUl9CSVRTX1RRMl9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQorI2RlZmluZQlUSVJfQklUU19UUTJfU0hfTElUVExFCQkwCisjZGVmaW5lCVRJUl9CSVRTX1RRM19MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQorI2RlZmluZQlUSVJfQklUU19UUTNfU0hfTElUVExFCQk0CisKKy8qIFJlbGF0aXZlIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KKworc3RydWN0IHJuZHhfZXh0IHsKKwl1bnNpZ25lZCBjaGFyCXJfYml0c1s0XTsKK307CisKKyNkZWZpbmUJUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUcJNAorI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQorI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9TSF9CSUcJCTQKKworI2RlZmluZQlSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRQkwCisjZGVmaW5lCVJORFhfQklUUzFfUkZEX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCisjZGVmaW5lCVJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFCTgKKworI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCisjZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcJMTYKKyNkZWZpbmUJUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwk4CisjZGVmaW5lCVJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcJMAorCisjZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKKyNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUJNAorI2RlZmluZQlSTkRYX0JJVFMyX0lOREVYX1NIX0xFRlRfTElUVExFCTQKKyNkZWZpbmUJUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQkxMgorCisvKiBBdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uIGV4dGVybmFsIHJlY29yZCAqLworCit1bmlvbiBhdXhfZXh0IHsKKwlzdHJ1Y3QgdGlyX2V4dAlhX3RpOworCXN0cnVjdCBybmR4X2V4dAlhX3JuZHg7CisJdW5zaWduZWQgY2hhcglhX2RuTG93WzRdOworCXVuc2lnbmVkIGNoYXIJYV9kbkhpZ2hbNF07CisJdW5zaWduZWQgY2hhcglhX2lzeW1bNF07CisJdW5zaWduZWQgY2hhcglhX2lzc1s0XTsKKwl1bnNpZ25lZCBjaGFyCWFfd2lkdGhbNF07CisJdW5zaWduZWQgY2hhcglhX2NvdW50WzRdOworfTsKKworI2RlZmluZSBBVVhfR0VUX0FOWShiaWdlbmQsIGF4LCBmaWVsZCkgXAorICAoKGJpZ2VuZCkgPyBiZmRfZ2V0YjMyICgoYXgpLT5maWVsZCkgOiBiZmRfZ2V0bDMyICgoYXgpLT5maWVsZCkpCisKKyNkZWZpbmUJQVVYX0dFVF9ETkxPVyhiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfZG5Mb3cpCisjZGVmaW5lCUFVWF9HRVRfRE5ISUdIKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9kbkhpZ2gpCisjZGVmaW5lCUFVWF9HRVRfSVNZTShiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfaXN5bSkKKyNkZWZpbmUgQVVYX0dFVF9JU1MoYmlnZW5kLCBheCkJCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9pc3MpCisjZGVmaW5lIEFVWF9HRVRfV0lEVEgoYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX3dpZHRoKQorI2RlZmluZSBBVVhfR0VUX0NPVU5UKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV9jb3VudCkKKworI2RlZmluZSBBVVhfUFVUX0FOWShiaWdlbmQsIHZhbCwgYXgsIGZpZWxkKSBcCisgICgoYmlnZW5kKSBcCisgICA/IChiZmRfcHV0YjMyICgoYmZkX3ZtYSkgKHZhbCksIChheCktPmZpZWxkKSwgMCkgXAorICAgOiAoYmZkX3B1dGwzMiAoKGJmZF92bWEpICh2YWwpLCAoYXgpLT5maWVsZCksIDApKQorCisjZGVmaW5lIEFVWF9QVVRfRE5MT1coYmlnZW5kLCB2YWwsIGF4KSBcCisgIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfZG5Mb3cpCisjZGVmaW5lIEFVWF9QVVRfRE5ISUdIKGJpZ2VuZCwgdmFsLCBheCkgXAorICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2RuSGlnaCkKKyNkZWZpbmUgQVVYX1BVVF9JU1lNKGJpZ2VuZCwgdmFsLCBheCkgXAorICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2lzeW0pCisjZGVmaW5lIEFVWF9QVVRfSVNTKGJpZ2VuZCwgdmFsLCBheCkgXAorICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2lzcykKKyNkZWZpbmUgQVVYX1BVVF9XSURUSChiaWdlbmQsIHZhbCwgYXgpIFwKKyAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV93aWR0aCkKKyNkZWZpbmUgQVVYX1BVVF9DT1VOVChiaWdlbmQsIHZhbCwgYXgpIFwKKyAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9jb3VudCkKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGb3IgZWZmaWNpZW5jeSwgZ2RiIGRlYWxzIGRpcmVjdGx5IHdpdGggdGhlIHVuc3dhcHBlZCBzeW1ib2xpYworICAgaW5mb3JtYXRpb24gKHRoYXQgd2F5IGl0IG9ubHkgdGFrZXMgdGhlIHRpbWUgdG8gc3dhcCBpbmZvcm1hdGlvbgorICAgdGhhdCBpdCByZWFsbHkgbmVlZHMgdG8gcmVhZCkuICBnZGIgb3JpZ2luYWxseSByZXRyaWV2ZWQgdGhlCisgICBpbmZvcm1hdGlvbiBkaXJlY3RseSBmcm9tIHRoZSBCRkQgYmFja2VuZCBpbmZvcm1hdGlvbiwgYnV0IHRoYXQKKyAgIHN0cmF0ZWd5LCBiZXNpZGVzIGJlaW5nIHNvcnQgb2YgdWdseSwgZG9lcyBub3Qgd29yayBmb3IgTUlQUyBFTEYsCisgICB3aGljaCBhbHNvIHVzZXMgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMKKyAgIHBvaW50ZXJzIHRvIHRoZSAobW9zdGx5KSB1bnN3YXBwZWQgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLworCitzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbworeworICAvKiBUaGUgc3dhcHBlZCBFQ09GRiBzeW1ib2xpYyBoZWFkZXIuICAqLworICBIRFJSIHN5bWJvbGljX2hlYWRlcjsKKworICAvKiBQb2ludGVycyB0byB0aGUgdW5zd2FwcGVkIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHRoZQorICAgICBwb2ludGVycyB0byBleHRlcm5hbCBzdHJ1Y3R1cmVzIHBvaW50IHRvIGRpZmZlcmVudCBzb3J0cyBvZgorICAgICBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgRUNPRkYgdGFyZ2V0cy4gIFRoZSBlY29mZl9kZWJ1Z19zd2FwCisgICAgIHN0cnVjdHVyZSBwcm92aWRlcyB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHVyZXMgYW5kIHRoZSBmdW5jdGlvbnMKKyAgICAgbmVlZGVkIHRvIHN3YXAgdGhlIGluZm9ybWF0aW9uIGluIGFuZCBvdXQuICBUaGVzZSBwb2ludGVycyBhcmUKKyAgICAgYWxsIHBvaW50ZXJzIHRvIGFycmF5cywgbm90IHNpbmdsZSBzdHJ1Y3R1cmVzLiAgVGhleSB3aWxsIGJlIE5VTEwKKyAgICAgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBvZiB0aGUgcmVsZXZhbnQgc3RydWN0dXJlLiAgVGhlc2UKKyAgICAgZmllbGRzIGFyZSBhbHNvIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0byBvdXRwdXQgRUNPRkYgZGVidWdnaW5nCisgICAgIGluZm9ybWF0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciAqbGluZTsKKyAgUFRSIGV4dGVybmFsX2RucjsJLyogc3RydWN0IGRucl9leHQgKi8KKyAgUFRSIGV4dGVybmFsX3BkcjsJLyogc3RydWN0IHBkcl9leHQgKi8KKyAgUFRSIGV4dGVybmFsX3N5bTsJLyogc3RydWN0IHN5bV9leHQgKi8KKyAgUFRSIGV4dGVybmFsX29wdDsJLyogc3RydWN0IG9wdF9leHQgKi8KKyAgdW5pb24gYXV4X2V4dCAqZXh0ZXJuYWxfYXV4OworICBjaGFyICpzczsKKyAgY2hhciAqc3NleHQ7CisgIFBUUiBleHRlcm5hbF9mZHI7CS8qIHN0cnVjdCBmZHJfZXh0ICovCisgIFBUUiBleHRlcm5hbF9yZmQ7CS8qIHN0cnVjdCByZmRfZXh0ICovCisgIFBUUiBleHRlcm5hbF9leHQ7CS8qIHN0cnVjdCBleHRfZXh0ICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSB1c2VkIHdoZW4gbGlua2luZy4gIFRoZXkgbWF5IGRpc2FwcGVhciBhdCBzb21lCisgICAgIHBvaW50LiAgKi8KKyAgY2hhciAqc3NleHRfZW5kOworICBQVFIgZXh0ZXJuYWxfZXh0X2VuZDsKKworICAvKiBXaGVuIGxpbmtpbmcsIHRoaXMgZmllbGQgaG9sZHMgYSBtYXBwaW5nIGZyb20gdGhlIGlucHV0IEZEUgorICAgICBudW1iZXJzIHRvIHRoZSBvdXRwdXQgbnVtYmVycywgYW5kIGlzIHVzZWQgd2hlbiB3cml0aW5nIG91dCB0aGUKKyAgICAgZXh0ZXJuYWwgc3ltYm9scy4gIEl0IGlzIE5VTEwgaWYgbm8gbWFwcGluZyBpcyByZXF1aXJlZC4gICovCisgIFJGRFQgKmlmZG1hcDsKKworICAvKiBUaGUgc3dhcHBlZCBGRFIgaW5mb3JtYXRpb24uICBDdXJyZW50bHkgdGhpcyBpcyBuZXZlciBOVUxMLCBidXQKKyAgICAgY29kZSB1c2luZyB0aGlzIHN0cnVjdHVyZSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIGluIGNhc2UKKyAgICAgdGhpcyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUuICBUaGlzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSwgbm90IGEKKyAgICAgc2luZ2xlIHN0cnVjdHVyZS4gICovCisgIEZEUiAqZmRyOworCisgIC8qIFdoZW4gcmVsYXhpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgbWF5IG5lZWQgdG8gYWRqdXN0CisgICAgIHN5bWJvbCB2YWx1ZXMgd2hlbiB0aGV5IGFyZSBvdXRwdXQuICBUaGlzIGlzIGEgbGlua2VkIGxpc3Qgb2YKKyAgICAgc3RydWN0dXJlcyBpbmRpY2F0aW5nIGhvdyB2YWx1ZXMgc2hvdWxkIGJlIGFkanVzdGVkLiAgVGhlcmUgaXMgbm8KKyAgICAgcmVxdWlyZW1lbnQgdGhhdCB0aGUgZW50cmllcyBiZSBpbiBhbnkgb3JkZXIsIG9yIHRoYXQgdGhleSBub3QKKyAgICAgb3ZlcmxhcC4gIFRoaXMgZmllbGQgaXMgbm9ybWFsbHkgTlVMTCwgaW4gd2hpY2ggY2FzZSBubworICAgICBhZGp1c3RtZW50cyBuZWVkIHRvIGJlIG1hZGUuICAqLworICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgaG93IHRvIGFkanVzdCBzeW1ib2wgdmFsdWVzIHdoZW4KKyAgIG91dHB1dHRpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZS4gIFRoZXNlIGFkanVzdG1lbnRzIG9ubHkgYXBwbHkgdG8KKyAgIHRoZSBpbnRlcm5hbCBzeW1ib2xzLCBhcyB0aGUgZXh0ZXJuYWwgc3ltYm9sIHZhbHVlcyB3aWxsIGNvbWUgZnJvbQorICAgdGhlIGhhc2ggdGFibGUgYW5kIGhhdmUgYWxyZWFkeSBiZWVuIGFkanVzdGVkLiAgKi8KKworc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdAoreworICAvKiBOZXh0IGVudHJ5IG9uIGFkanVzdG1lbnQgbGlzdC4gICovCisgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKm5leHQ7CisgIC8qIFN0YXJ0aW5nIFZNQSBvZiBhZGp1c3RtZW50LiAgVGhpcyBpcyB0aGUgVk1BIGluIHRoZSBFQ09GRiBmaWxlLAorICAgICBub3QgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbi4gIFRodXMgaXQgc2hvdWxkCisgICAgIGluZGljYXRlIGEgcGFydGljdWxhciBzZWN0aW9uLiAgKi8KKyAgYmZkX3ZtYSBzdGFydDsKKyAgLyogRW5kaW5nIFZNQSBvZiBhZGp1c3RtZW50LiAgKi8KKyAgYmZkX3ZtYSBlbmQ7CisgIC8qIEFkanVzdG1lbnQuICBUaGlzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCwgb3IKKyAgICAgRkRSLiAgVGhpcyBpcyB6ZXJvIGZvciB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgYXJyYXkuICAqLworICBsb25nIGFkanVzdDsKK307CisKKy8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgYnkgdGhlIEVDT0ZGIGZpbmRfbmVhcmVzdF9saW5lIGZ1bmN0aW9uLiAgKi8KKworc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeQoreworICAvKiBCYXNlIGFkZHJlc3MgaW4gLnRleHQgb2YgdGhpcyBGRFIuICAqLworICBiZmRfdm1hIGJhc2VfYWRkcjsKKyAgRkRSICpmZHI7Cit9OworCitzdHJ1Y3QgZWNvZmZfZmluZF9saW5lCit7CisgIC8qIEFsbG9jYXRlZCBtZW1vcnkgdG8gaG9sZCBmdW5jdGlvbiBhbmQgZmlsZSBuYW1lcy4gICovCisgIGNoYXIgKmZpbmRfYnVmZmVyOworCisgIC8qIEZEUiB0YWJsZSwgc29ydGVkIGJ5IGFkZHJlc3M6ICovCisgIGxvbmcgZmRydGFiX2xlbjsKKyAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqZmRydGFiOworCisgIC8qIENhY2hlIGVudHJ5IGZvciBtb3N0IHJlY2VudGx5IGZvdW5kIGxpbmUgaW5mb3JtYXRpb24uICBUaGUgc2VjdAorICAgICBmaWVsZCBpcyBOVUxMIGlmIHRoaXMgY2FjaGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdAorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWN0OworICAgICAgYmZkX3ZtYSBzdGFydDsKKyAgICAgIGJmZF92bWEgc3RvcDsKKyAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOworICAgICAgdW5zaWduZWQgaW50IGxpbmVfbnVtOworICAgIH0gY2FjaGU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKiBTV0FQUElORyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZ2VuZXJpYyBFQ09GRiBjb2RlIG5lZWRzIHRvIGJlIGFibGUgdG8gc3dhcCBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uIGluIGFuZCBvdXQgaW4gdGhlIHNwZWNpZmljIGZvcm1hdCB1c2VkIGJ5IGEgcGFydGljdWxhcgorICAgRUNPRkYgaW1wbGVtZW50YXRpb24uICBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24KKyAgIG5lZWRlZCB0byBkbyB0aGlzLiAgKi8KKworc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAKK3sKKyAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCisgIGludCBzeW1fbWFnaWM7CisgIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KKyAgYmZkX3NpemVfdHlwZSBkZWJ1Z19hbGlnbjsKKyAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2hkcl9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Rucl9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX29wdF9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2V4dF9zaXplOworICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KKyAgdm9pZCAoKnN3YXBfaGRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBIRFJSICopKTsKKyAgdm9pZCAoKnN3YXBfZG5yX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBETlIgKikpOworICB2b2lkICgqc3dhcF9wZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBEUiAqKSk7CisgIHZvaWQgKCpzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSk7CisgIHZvaWQgKCpzd2FwX29wdF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgT1BUUiAqKSk7CisgIHZvaWQgKCpzd2FwX2Zkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRkRSICopKTsKKyAgdm9pZCAoKnN3YXBfcmZkX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBSRkRUICopKTsKKyAgdm9pZCAoKnN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKTsKKyAgdm9pZCAoKnN3YXBfdGlyX2luKSBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCB0aXJfZXh0ICosIFRJUiAqKSk7CisgIHZvaWQgKCpzd2FwX3JuZHhfaW4pIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKKyAgLyogRnVuY3Rpb25zIHRvIHN3YXAgb3V0IGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLworICB2b2lkICgqc3dhcF9oZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgSERSUiAqLCBQVFIpKTsKKyAgdm9pZCAoKnN3YXBfZG5yX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEROUiAqLCBQVFIpKTsKKyAgdm9pZCAoKnN3YXBfcGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFBEUiAqLCBQVFIpKTsKKyAgdm9pZCAoKnN3YXBfc3ltX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSk7CisgIHZvaWQgKCpzd2FwX29wdF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBPUFRSICosIFBUUikpOworICB2b2lkICgqc3dhcF9mZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpOworICB2b2lkICgqc3dhcF9yZmRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUkZEVCAqLCBQVFIpKTsKKyAgdm9pZCAoKnN3YXBfZXh0X291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEVYVFIgKiwgUFRSKSk7CisgIHZvaWQgKCpzd2FwX3Rpcl9vdXQpIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKKyAgdm9pZCAoKnN3YXBfcm5keF9vdXQpIFBBUkFNUyAoKGludCwgY29uc3QgUk5EWFIgKiwgc3RydWN0IHJuZHhfZXh0ICopKTsKKyAgLyogRnVuY3Rpb24gdG8gcmVhZCBzeW1ib2wgZGF0YSBhbmQgc2V0IHVwIHBvaW50ZXJzIGluCisgICAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgVGhlIHNlY3Rpb24gYXJndW1lbnQgaXMgdXNlZCBmb3IKKyAgICAgRUxGLCBub3Qgc3RyYWlnaHQgRUNPRkYuICAqLworICBib29sZWFuICgqcmVhZF9kZWJ1Z19pbmZvKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKKwkJCQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Cit9OworCisjZW5kaWYgLyogISBkZWZpbmVkIChFQ09GRl9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2dvMzJleGUuaCBiL2luY2x1ZGUvY29mZi9nbzMyZXhlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMjZjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9nbzMyZXhlLmgKQEAgLTAsMCArMSwyMCBAQAorLyogQ09GRiBpbmZvcm1hdGlvbiBmb3IgUEMgcnVubmluZyBnbzMyLiAgKi8KKworI2RlZmluZSBTVFVCU0laRSAyMDQ4CisKK3N0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlIHsKKwljaGFyIHN0dWJbU1RVQlNJWkVdOwkvKiB0aGUgc3R1YiB0byBsb2FkIHRoZSBpbWFnZQkqLworCS8qIHRoZSBzdGFuZGFyZCBDT0ZGIGhlYWRlciAqLworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKyN1bmRlZiBGSUxIRFIKKyNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyX2dvMzJfZXhlCisjdW5kZWYgRklMSFNaCisjZGVmaW5lCUZJTEhTWglTVFVCU0laRSsyMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2g4MzAwLmggYi9pbmNsdWRlL2NvZmYvaDgzMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYyMzk0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL2g4MzAwLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzMwMC1IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKKwljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisJY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisJY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCisJY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisKKworI2RlZmluZQlIODMwME1BR0lDCTB4ODMwMAorI2RlZmluZQlIODMwMEhNQUdJQwkweDgzMDEKKyNkZWZpbmUJSDgzMDBTTUFHSUMJMHg4MzAyCisKKyNkZWZpbmUgSDgzMDBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBNQUdJQykpCisjZGVmaW5lIEg4MzAwSEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMEhNQUdJQykpCisjZGVmaW5lIEg4MzAwU0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMFNNQUdJQykpCisKKyNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCisjZGVmaW5lCUZJTEhTWgkyMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCit9CitBT1VUSERSOworCisKKyNkZWZpbmUgQU9VVEhEUlNaIDI4CisjZGVmaW5lIEFPVVRTWiAyOAorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cnVjdCBleHRlcm5hbF9zY25oZHIgeworCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KKwljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KKwljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCisJY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisJY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KKwljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCisJY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KK307CisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKworCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0MAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworc3RydWN0IGV4dGVybmFsX2xpbmVubyB7CisJdW5pb24geworCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKwkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KKwl9IGxfYWRkcjsKKwljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCit9OworCisjZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7CisjZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7CisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCTgKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudCAKK3sKKyAgdW5pb24geworICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIGVfemVyb2VzWzRdOworICAgICAgY2hhciBlX29mZnNldFs0XTsKKyAgICB9IGU7CisgIH0gZTsKKyAgY2hhciBlX3ZhbHVlWzRdOworICBjaGFyIGVfc2NudW1bMl07CisgIGNoYXIgZV90eXBlWzJdOworICBjaGFyIGVfc2NsYXNzWzFdOworICBjaGFyIGVfbnVtYXV4WzFdOworfTsKKworCisKKyNkZWZpbmUgTl9CVE1BU0sJKDAxNykKKyNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKKyNkZWZpbmUgTl9CVFNIRlQJKDQpCisjZGVmaW5lIE5fVFNISUZUCSgyKQorICAKKwordW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKKwlzdHJ1Y3QgeworCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CisJCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLworCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KKwkJCX0geF9sbnN6OworCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCisJCX0geF9taXNjOworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCisJCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCisJCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCisJCQl9IHhfZmNuOworCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLworCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisJCQl9IHhfYXJ5OworCQl9IHhfZmNuYXJ5OworCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLworCX0geF9zeW07CisKKwl1bmlvbiB7CisJCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKKwkJc3RydWN0IHsKKwkJCWNoYXIgeF96ZXJvZXNbNF07CisJCQljaGFyIHhfb2Zmc2V0WzRdOworCQl9IHhfbjsKKwl9IHhfZmlsZTsKKworCXN0cnVjdCB7CisJCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KKwkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KKwkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KKwl9IHhfc2NuOworCisgICAgICAgIHN0cnVjdCB7CisJCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KKwkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCisJCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KKwl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCisKKworfTsKKworI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAorI2RlZmluZQlTWU1FU1oJMTgJCisjZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKKyNkZWZpbmUJQVVYRVNaCTE4CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKKyAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCisgICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgeworICBjaGFyIHJfdmFkZHJbNF07CisgIGNoYXIgcl9zeW1uZHhbNF07CisgIGNoYXIgcl9vZmZzZXRbNF07CisgIGNoYXIgcl90eXBlWzJdOworICBjaGFyIHJfc3R1ZmZbMl07Cit9OworCisKKyNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCisjZGVmaW5lIFJFTFNaIDE2CisKKworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9oODUwMC5oIGIvaW5jbHVkZS9jb2ZmL2g4NTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwNWJmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvaDg1MDAuaApAQCAtMCwwICsxLDIwMSBAQAorLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBIaXRhY2hpIEg4LzUwMCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworCisKKyNkZWZpbmUJSDg1MDBNQUdJQwkweDg1MDAKKworCisjZGVmaW5lIEg4NTAwQkFETUFHKHgpICgoMHhmZmZmICYmICgoeCkuZl9tYWdpYykhPUg4NTAwTUFHSUMpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworfQorQU9VVEhEUjsKKworCisjZGVmaW5lIEFPVVRIRFJTWiAyOAorI2RlZmluZSBBT1VUU1ogMjgKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk4CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCisgICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQorICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfb2Zmc2V0WzRdOworICBjaGFyIHJfdHlwZVsyXTsKKyAgY2hhciByX3N0dWZmWzJdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxNgorCisKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTM4Ni5oIGIvaW5jbHVkZS9jb2ZmL2kzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWJmNGEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL2kzODYuaApAQCAtMCwwICsxLDIyOCBAQAorLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCAzODYvNDg2LiAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworLyogQml0cyBmb3IgZl9mbGFnczoKKyAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCisgKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKKyAqLworCisjZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCisjZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKKyNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQorI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQorCisKKworI2RlZmluZQlJMzg2TUFHSUMJMHgxNGMKKyNkZWZpbmUgSTM4NlBUWE1BR0lDCTB4MTU0CisjZGVmaW5lIEkzODZBSVhNQUdJQwkweDE3NQorCisvKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KKworI2RlZmluZSBMWU5YQ09GRk1BR0lDCTA0MTUKKworI2RlZmluZSBJMzg2QkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gSTM4Nk1BR0lDKSBcCisJCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2QUlYTUFHSUMgXAorCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gSTM4NlBUWE1BR0lDIFwKKwkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCisKKyNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCisjZGVmaW5lCUZJTEhTWgkyMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCisKKworfQorQU9VVEhEUjsKKworCisjZGVmaW5lIEFPVVRTWiAyOAorI2RlZmluZSBBT1VUSERSU1ogMjgKKworI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLworI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KKyNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KKyNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KKworCisvKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLworLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLworI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKKyNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAKKyNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisJY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworLyoKKyAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucworICovCisjZGVmaW5lIF9URVhUCSIudGV4dCIKKyNkZWZpbmUgX0RBVEEJIi5kYXRhIgorI2RlZmluZSBfQlNTCSIuYnNzIgorI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCisjZGVmaW5lIF9MSUIgIi5saWIiCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworc3RydWN0IGV4dGVybmFsX2xpbmVubyB7CisJdW5pb24geworCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKwkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KKwl9IGxfYWRkcjsKKwljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCit9OworCisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCTYKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudCAKK3sKKyAgdW5pb24geworICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIGVfemVyb2VzWzRdOworICAgICAgY2hhciBlX29mZnNldFs0XTsKKyAgICB9IGU7CisgIH0gZTsKKyAgY2hhciBlX3ZhbHVlWzRdOworICBjaGFyIGVfc2NudW1bMl07CisgIGNoYXIgZV90eXBlWzJdOworICBjaGFyIGVfc2NsYXNzWzFdOworICBjaGFyIGVfbnVtYXV4WzFdOworfTsKKworI2RlZmluZSBOX0JUTUFTSwkoMHhmKQorI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKKyNkZWZpbmUgTl9CVFNIRlQJKDQpCisjZGVmaW5lIE5fVFNISUZUCSgyKQorICAKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkvKiBzZWN0aW9uIGxlbmd0aCAqLworCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworCQljaGFyIHhfY2hlY2tzdW1bNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCisJCWNoYXIgeF9hc3NvY2lhdGVkWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCisJCWNoYXIgeF9jb21kYXRbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKyMJZGVmaW5lIF9FVEVYVAkiZXRleHQiCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgeworICBjaGFyIHJfdmFkZHJbNF07CisgIGNoYXIgcl9zeW1uZHhbNF07CisgIGNoYXIgcl90eXBlWzJdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxMAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaTg2MC5oIGIvaW5jbHVkZS9jb2ZmL2k4NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzY4NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL2k4NjAuaApAQCAtMCwwICsxLDIwNSBAQAorLyogVGhpcyBmaWxlIHdhcyBoYWNrZWQgZnJvbSBpMzg2LmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KKworLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCA4NjAuICAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKKwljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisJY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisJY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCisJY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisKKy8qIEJpdHMgZm9yIGZfZmxhZ3M6CisgKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQorICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCisgKi8KKworI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQorI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCisjZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKKyNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKKworCisKKyNkZWZpbmUJSTg2ME1BR0lDCTB4MTRkCisKKyNkZWZpbmUgSTg2MEJBRE1BRyh4KSAgICgoeCkuZl9tYWdpYyAhPSBJODYwTUFHSUMpCisKKyNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCisjZGVmaW5lCUZJTEhTWgkyMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCit9CitBT1VUSERSOworCisKKyNkZWZpbmUgQU9VVFNaIDI4CisjZGVmaW5lIEFPVVRIRFJTWiAyOAorCisvKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnM/ICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cnVjdCBleHRlcm5hbF9zY25oZHIgeworCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KKwljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KKwljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCisJY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisJY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KKwljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCisJY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KK307CisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTQwCisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKyNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgorI2RlZmluZSBfTElCICIubGliIgorCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk2CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKyNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKKyNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCit1bmlvbiBleHRlcm5hbF9hdXhlbnQgeworCXN0cnVjdCB7CisJCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKwkJdW5pb24geworCQkJc3RydWN0IHsKKwkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworCQkJfSB4X2xuc3o7CisJCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KKwkJfSB4X21pc2M7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKwkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKwkJCX0geF9mY247CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKKwkJCX0geF9hcnk7CisJCX0geF9mY25hcnk7CisJCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCisJfSB4X3N5bTsKKworCXVuaW9uIHsKKwkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOworCQlzdHJ1Y3QgeworCQkJY2hhciB4X3plcm9lc1s0XTsKKwkJCWNoYXIgeF9vZmZzZXRbNF07CisJCX0geF9uOworCX0geF9maWxlOworCisJc3RydWN0IHsKKwkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLworCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworCX0geF9zY247CisKKyAgICAgICAgc3RydWN0IHsKKwkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLworCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KKwkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLworCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KKworCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkxOAkKKyNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAorI2RlZmluZQlBVVhFU1oJMTgKKworCisjCWRlZmluZSBfRVRFWFQJImV0ZXh0IgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCisKKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfdHlwZVsyXTsKK307CisKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pOTYwLmggYi9pbmNsdWRlL2NvZmYvaTk2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzU4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvaTk2MC5oCkBAIC0wLDAgKzEsMjc1IEBACisvKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIDgwOTYwLiAgT3JpZ2luczogSW50ZWwgY29ycCwgbmF0Y2guICovCisKKy8qIE5PVEU6IFRhZ2VudHJpZXMgKGNmIFRBR0JJVFMpIGFyZSBubyBsb25nZXIgdXNlZCBieSB0aGUgOTYwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKKwljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisJY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisJY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCisJY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisjZGVmaW5lIE9NQUdJQyAgICAgICgwNDA3KQkvKiBvbGQgaW1wdXJlIGZvcm1hdC4gZGF0YSBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dzIHRleHQuIGJvdGggc2VjdGlvbnMgYXJlIHJ3LiAqLworI2RlZmluZSBOTUFHSUMgICAgICAoMDQxMCkJLyogc3BsaXQgaSZkLCByZWFkLW9ubHkgdGV4dCAqLworCisvKgorKglJbnRlbCA4MDk2MCAoSTk2MCkgcHJvY2Vzc29yIGZsYWdzLgorKglGX0k5NjBUWVBFID09IG1hc2sgZm9yIHByb2Nlc3NvciB0eXBlIGZpZWxkLiAKKyovCisKKyNkZWZpbmUJRl9JOTYwVFlQRQkoMHhmMDAwKQorI2RlZmluZQlGX0k5NjBDT1JFCSgweDEwMDApCisjZGVmaW5lCUZfSTk2MEtCCSgweDIwMDApCisjZGVmaW5lCUZfSTk2MFNCCSgweDIwMDApCisjZGVmaW5lCUZfSTk2ME1DCSgweDMwMDApCisjZGVmaW5lCUZfSTk2MFhBCSgweDQwMDApCisjZGVmaW5lCUZfSTk2MENBCSgweDUwMDApCisjZGVmaW5lCUZfSTk2MEtBCSgweDYwMDApCisjZGVmaW5lCUZfSTk2MFNBCSgweDYwMDApCisjZGVmaW5lIEZfSTk2MEpYCSgweDcwMDApCisjZGVmaW5lIEZfSTk2MEhYCSgweDgwMDApCisKKworLyoqIGk4MDk2MCBNYWdpYyBOdW1iZXJzCisqLworCisjZGVmaW5lIEk5NjBST01BR0lDCSgweDE2MCkJLyogcmVhZC1vbmx5IHRleHQgc2VnbWVudHMgKi8KKyNkZWZpbmUgSTk2MFJXTUFHSUMJKDB4MTYxKQkvKiByZWFkLXdyaXRlIHRleHQgc2VnbWVudHMgKi8KKworI2RlZmluZSBJOTYwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPUk5NjBST01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPUk5NjBSV01BR0lDKSkKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJcGh5c19hZGRyOworCXVuc2lnbmVkIGxvbmcJYml0YXJyYXk7Cit9IFRBR0JJVFM7CisKKworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIJdGFnZW50cmllc1s0XTsJCS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KK30KK0FPVVRIRFI7CisKKy8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRhZyBiaXRzIGFycmF5ICovCisKKyNkZWZpbmUgVEFHUFRSKGFvdXQpICgoVEFHQklUUyAqKSAoJihhb3V0LnRhZ2VudHJpZXMpKzEpKQorCisvKiBjb21wdXRlIHNpemUgb2YgYSBoZWFkZXIgKi8KKworLyojZGVmaW5lIEFPVVRTWihhb3V0KSAoc2l6ZW9mKEFPVVRIRFIpKyhhb3V0LnRhZ2VudHJpZXMqc2l6ZW9mKFRBR0JJVFMpKSkqLworI2RlZmluZSBBT1VUU1ogMzIKKyNkZWZpbmUgQU9VVEhEUlNaIDMyCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCisJY2hhciAJCXNfYWxpZ25bNF07CS8qIHNlY3Rpb24gYWxpZ25tZW50CQkqLworfTsKKworCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0NAorCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQgICAiLnRleHQiCisjZGVmaW5lIF9EQVRBICAgIi5kYXRhIgorI2RlZmluZSBfQlNTICAgICIuYnNzIgorCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CQkvKiBsaW5lIG51bWJlcgkJKi8KKwljaGFyIHBhZGRpbmdbMl07CS8qIGZvcmNlIGFsaWdubWVudAkqLworfTsKKworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk4CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfZmxhZ3NbMl07CisgIGNoYXIgZV90eXBlWzRdOworICBjaGFyIGVfc2NsYXNzWzFdOworICBjaGFyIGVfbnVtYXV4WzFdOworICBjaGFyIHBhZDJbMl07Cit9OworCisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgweDFmKQorI2RlZmluZSBOX1RNQVNLCQkoMHg2MCkKKyNkZWZpbmUgTl9CVFNIRlQJKDUpCisjZGVmaW5lIE5fVFNISUZUCSgyKQorICAKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqICBJOTYwLXNwZWNpZmljICoybmQqIGF1eC4gZW50cnkgZm9ybWF0cworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJc3RydWN0IHsKKwkgIC8qIFRoaXMgaXMgYSB2ZXJ5IG9sZCB0eXBvIHRoYXQga2VlcHMgZ2V0dGluZyBwcm9wYWdhdGVkLiAqLworI2RlZmluZSB4X3N0ZGluZHggeF9zdGluZHgKKwkJY2hhciB4X3N0aW5keFs0XTsJLyogc3lzLiB0YWJsZSBlbnRyeSAqLworCX0geF9zYzsJLyogc3lzdGVtIGNhbGwgZW50cnkgKi8KKworCXN0cnVjdCB7CisJCWNoYXIgeF9iYWxudHJ5WzRdOyAvKiBCQUwgZW50cnkgcG9pbnQgKi8KKwl9IHhfYmFsOyAvKiBCQUwtY2FsbGFibGUgZnVuY3Rpb24gKi8KKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdGltZXN0YW1wWzRdOwkgICAgICAgIC8qIHRpbWUgc3RhbXAgKi8KKwkJY2hhciAJeF9pZHN0cmluZ1syMF07CSAgICAgICAgLyogcHJvZHVjZXIgaWRlbnRpdHkgc3RyaW5nICovCisJfSB4X2lkZW50OwkgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9kdWNlciBpZGVudCBpbmZvICovCisKK307CisKKworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkyNAorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkyNAorCisjCWRlZmluZSBfRVRFWFQJIl9ldGV4dCIKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsKKyAgY2hhciByX3N5bW5keFs0XTsKKyAgY2hhciByX3R5cGVbMl07CisgIGNoYXIgcGFkWzJdOworfTsKKworLyogcl90eXBlIHZhbHVlcyBmb3IgdGhlIGk5NjAuICAqLworCisvKiBUaGUgaTk2MCB1c2VzIFJfUkVMTE9ORywgd2hpY2ggaXMgZGVmaW5lZCBpbiBpbnRlcm5hbC5oIGFzIDB4MTEuCisgICBJdCBpcyBhbiBhYnNvbHV0ZSAzMiBiaXQgcmVsb2NhdGlvbi4gICovCisKKyNkZWZpbmUgUl9JUFJNRUQgCSgweDE5KQkvKiAyNC1iaXQgaXAtcmVsYXRpdmUgcmVsb2NhdGlvbiAqLworI2RlZmluZSBSX09QVENBTEwJKDB4MWIpCS8qIDMyLWJpdCBvcHRpbWl6YWJsZSBjYWxsIChsZWFmcHJvYy9zeXNwcm9jKSAqLworI2RlZmluZSBSX09QVENBTExYCSgweDFjKQkvKiA2NC1iaXQgb3B0aW1pemFibGUgY2FsbCAobGVhZnByb2Mvc3lzcHJvYykgKi8KKworLyogVGhlIGZvbGxvd2luZyByZWxvY2F0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIHVzZSBieSByZWxheGluZyBsaW5rZXJzLAorICAgd2hpY2ggY29udmVydCAzMiBiaXQgY2FsbHMgKHdoaWNoIHJlcXVpcmUgYSA2NCBiaXQgaW5zdHJ1Y3Rpb24pCisgICBpbnRvIDI0IGJpdCBjYWxscyAod2hpY2ggcmVxdWlyZSBhIDMyIGJpdCBpbnN0cnVjdGlvbikgd2hlbgorICAgcG9zc2libGUuICBJdCB3aWxsIGJlIHBvc3NpYmxlIHdoZW5ldmVyIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwgaXMKKyAgIHdpdGhpbiBhIDI0IGJpdCByYW5nZSBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbi4KKworICAgSXQgaXMgYWx3YXlzIHNhZmUgdG8gaWdub3JlIHRoZXNlIHJlbG9jYXRpb25zLiAgVGhleSBvbmx5IHNlcnZlIHRvCisgICBtYXJrIHBvaW50cyB3aGljaCB0aGUgcmVsYXhpbmcgbGlua2VyIHdpbGwgaGF2ZSB0byBjb25zaWRlci4gIFRoZQorICAgYXNzZW1ibGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgY29kZSBpcyBnZW5lcmF0ZWQgZXZlbiBpZgorICAgdGhlIHJlbG9jYXRpb25zIGFyZSBpZ25vcmVkLiAgSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IHRoZQorICAgUl9JUFIxMyByZWxvY2F0aW9uIG1heSBub3QgYXBwZWFyIHdpdGggYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KKworI2RlZmluZSBSX0lQUjEzCQkoMHgxZCkJLyogMTMgYml0IGlwLXJlbGF0aXZlIGJyYW5jaCAqLworI2RlZmluZSBSX0FMSUdOCQkoMHgxZSkgIC8qIGFsaWdubWVudCBtYXJrZXIuICBUaGlzIGhhcyBubworCQkJCSAgIGFzc29jaWF0ZWQgc3ltYm9sLiAgSW5zdGVhZCwgdGhlCisJCQkJICAgcl9zeW1uZHggZmllbGQgaW5kaWNhdGVzIHRoZQorCQkJCSAgIHJlcXVpcmUgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQgaW4KKwkJCQkgICB0aGUgZmlsZS4gIEl0IG11c3QgYmUgYSBwb3dlciBvZiAyLiAgKi8KKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTIKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmggYi9pbmNsdWRlL2NvZmYvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVhOTUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmgKQEAgLTAsMCArMSw3MjggQEAKKy8qIEludGVybmFsIGZvcm1hdCBvZiBDT0ZGIG9iamVjdCBmaWxlIGRhdGEgc3RydWN0dXJlcywgZm9yIEdOVSBCRkQuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuICAqLworCisjaWZuZGVmIEdOVV9DT0ZGX0lOVEVSTkFMX0gKKyNkZWZpbmUgR05VX0NPRkZfSU5URVJOQUxfSCAxCisKKy8qIEZpcnN0LCBtYWtlICJzaWduZWQgY2hhciIgd29yaywgZXZlbiBvbiBvbGQgY29tcGlsZXJzLiAqLworI2lmbmRlZiBzaWduZWQKKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUJc2lnbmVkCQkJLyoqLworI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZXh0cmEgc3R1ZmYgaW4gYSBQRSBoZWFkZXIuICovCisKK3N0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyCit7CisgIC8qIERPUyBoZWFkZXIgZGF0YSBmb2xsb3dzIGZvciBQRSBzdHVmZiAqLworICB1bnNpZ25lZCBzaG9ydCBlX21hZ2ljOwkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLworICB1bnNpZ25lZCBzaG9ydCBlX2NibHA7CS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCisgIHVuc2lnbmVkIHNob3J0IGVfY3A7CQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KKyAgdW5zaWduZWQgc2hvcnQgZV9jcmxjOwkvKiBSZWxvY2F0aW9ucywgMHgwICovCisgIHVuc2lnbmVkIHNob3J0IGVfY3BhcmhkcjsJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCisgIHVuc2lnbmVkIHNob3J0IGVfbWluYWxsb2M7CS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLworICB1bnNpZ25lZCBzaG9ydCBlX21heGFsbG9jOwkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KKyAgdW5zaWduZWQgc2hvcnQgZV9zczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCisgIHVuc2lnbmVkIHNob3J0IGVfc3A7CQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCisgIHVuc2lnbmVkIHNob3J0IGVfY3N1bTsJLyogQ2hlY2tzdW0sIDB4MCAqLworICB1bnNpZ25lZCBzaG9ydCBlX2lwOwkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCisgIHVuc2lnbmVkIHNob3J0IGVfY3M7CQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLworICB1bnNpZ25lZCBzaG9ydCBlX2xmYXJsYzsJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KKyAgdW5zaWduZWQgc2hvcnQgZV9vdm5vOwkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCisgIHVuc2lnbmVkIHNob3J0IGVfcmVzWzRdOwkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLworICB1bnNpZ25lZCBzaG9ydCBlX29lbWlkOwkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLworICB1bnNpZ25lZCBzaG9ydCBlX29lbWluZm87CS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCisgIHVuc2lnbmVkIHNob3J0IGVfcmVzMlsxMF07CS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCisgIGJmZF92bWEgIGVfbGZhbmV3OwkJLyogRmlsZSBhZGRyZXNzIG9mIG5ldyBleGUgaGVhZGVyLCAweDgwICovCisgIHVuc2lnbmVkIGxvbmcgZG9zX21lc3NhZ2VbMTZdOyAvKiB0ZXh0IHdoaWNoIGFsd2F5cyBmb2xsb3dzIGRvcyBoZWFkZXIgKi8KKyAgYmZkX3ZtYSAgbnRfc2lnbmF0dXJlOyAgIAkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKK307CisKK3N0cnVjdCBpbnRlcm5hbF9maWxlaGRyCit7CisgIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9maWxlaGRyIHBlOworCisgIC8qIHN0YW5kYXJkIGNvZmYgIGludGVybmFsIGluZm8gKi8KKyAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKyAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworICBsb25nIGZfdGltZGF0OwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisgIGJmZF92bWEgZl9zeW1wdHI7CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisgIGxvbmcgZl9uc3ltczsJCQkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKyAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworICB1bnNpZ25lZCBzaG9ydCBmX2ZsYWdzOwkvKiBmbGFncwkJCSovCisgIHVuc2lnbmVkIHNob3J0IGZfdGFyZ2V0X2lkOwkvKiAoVEljODAgc3BlY2lmaWMpCQkqLworfTsKKworCisvKiBCaXRzIGZvciBmX2ZsYWdzOgorICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKKyAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfQVIxNldSCWZpbGUgaXMgMTYtYml0IGxpdHRsZS1lbmRpYW4KKyAqCUZfQVIzMldSCWZpbGUgaXMgMzItYml0IGxpdHRsZS1lbmRpYW4KKyAqCUZfQVIzMlcJCWZpbGUgaXMgMzItYml0IGJpZy1lbmRpYW4KKyAqCUZfRFlOTE9BRAlycy82MDAwIGFpeDogZHluYW1pY2FsbHkgbG9hZGFibGUgdy9pbXBvcnRzICYgZXhwb3J0cworICoJRl9TSFJPQkoJcnMvNjAwMCBhaXg6IGZpbGUgaXMgYSBzaGFyZWQgb2JqZWN0CisgKiAgICAgIEZfRExMICAgICAgICAgICBQRSBmb3JtYXQgRExMCisgKi8KKworI2RlZmluZQlGX1JFTEZMRwkoMHgwMDAxKQorI2RlZmluZQlGX0VYRUMJCSgweDAwMDIpCisjZGVmaW5lCUZfTE5OTwkJKDB4MDAwNCkKKyNkZWZpbmUJRl9MU1lNUwkJKDB4MDAwOCkKKyNkZWZpbmUJRl9BUjE2V1IJKDB4MDA4MCkKKyNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKKyNkZWZpbmUJRl9BUjMyVyAgICAgCSgweDAyMDApCisjZGVmaW5lCUZfRFlOTE9BRAkoMHgxMDAwKQorI2RlZmluZQlGX1NIUk9CSgkoMHgyMDAwKQorI2RlZmluZSBGX0RMTCAgICAgICAgICAgKDB4MjAwMCkKKworLyogZXh0cmEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZIAoreworICBiZmRfdm1hIFZpcnR1YWxBZGRyZXNzOworICBsb25nICAgIFNpemU7Cit9ICBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKKyNkZWZpbmUgSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVMgIDE2CisKKy8qIGRlZmF1bHQgaW1hZ2UgYmFzZSBmb3IgTlQgKi8KKyNkZWZpbmUgTlRfRVhFX0lNQUdFX0JBU0UgMHg0MDAwMDAKKyNkZWZpbmUgTlRfRExMX0lNQUdFX0JBU0UgMHgxMDAwMDAwMAorCisvKiBFeHRyYSBzdHVmZiBpbiBhIFBFIGFvdXRoZHIgKi8KKworI2RlZmluZSBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCisjZGVmaW5lIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCAweDIwMAorCitzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAKK3sKKyAgLyogUEUgc3R1ZmYgICovCisgIGJmZF92bWEgSW1hZ2VCYXNlOwkJLyogYWRkcmVzcyBvZiBzcGVjaWZpYyBsb2NhdGlvbiBpbiBtZW1vcnkgdGhhdAorCQkJCSAgIGZpbGUgaXMgbG9jYXRlZCwgTlQgZGVmYXVsdCAweDEwMDAwICovCisKKyAgYmZkX3ZtYSBTZWN0aW9uQWxpZ25tZW50OwkvKiBzZWN0aW9uIGFsaWdubWVudCBkZWZhdWx0IDB4MTAwMCAqLworICBiZmRfdm1hIEZpbGVBbGlnbm1lbnQ7CS8qIGZpbGUgYWxpZ25tZW50IGRlZmF1bHQgMHgyMDAgKi8KKyAgc2hvcnQgICBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8qIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nICovCisgIHNob3J0ICAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvKiBzeXN0ZW0gcmVxJ2QgZm9yIGV4ZSwgZGVmYXVsdCB0byAxKi8KKyAgc2hvcnQgICBNYWpvckltYWdlVmVyc2lvbjsJLyogdXNlciBkZWZpbmVhYmxlIGZpZWxkIHRvIHN0b3JlIHZlcnNpb24gb2YgKi8KKyAgc2hvcnQgICBNaW5vckltYWdlVmVyc2lvbjsJLyogZXhlIG9yIGRsbCBiZWluZyBjcmVhdGVkLCBkZWZhdWx0IHRvIDAgKi8gCisgIHNob3J0ICAgTWFqb3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBtaW5pbXVtIHN1YnN5c3RlbSB2ZXJzaW9uIHJlcXVpcmVkIHRvICovCisgIHNob3J0ICAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOyAvKiBydW4gZXhlOyBkZWZhdWx0IHRvIDMuMSAqLworICBsb25nICAgIFJlc2VydmVkMTsJCS8qIHNlZW1zIHRvIGJlIDAgKi8KKyAgbG9uZyAgICBTaXplT2ZJbWFnZTsJCS8qIHNpemUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciBwcm9nICovCisgIGxvbmcgICAgU2l6ZU9mSGVhZGVyczsJLyogc2l6ZSBvZiBQRSBoZWFkZXIgYW5kIHNlY3Rpb24gdGFibGUgKi8KKyAgbG9uZyAgICBDaGVja1N1bTsJCS8qIHNldCB0byAwICovCisgIHNob3J0ICAgU3Vic3lzdGVtOwkKKworICAvKiB0eXBlIG9mIHN1YnN5c3RlbSBleGUgdXNlcyBmb3IgdXNlciBpbnRlcmZhY2UsCisgICAgIHBvc3NpYmxlIHZhbHVlczoKKyAgICAgMSAtIE5BVElWRSAgIERvZXNuJ3QgcmVxdWlyZSBhIHN1YnN5c3RlbQorICAgICAyIC0gV0lORE9XU19HVUkgcnVucyBpbiBXaW5kb3dzIEdVSSBzdWJzeXN0ZW0KKyAgICAgMyAtIFdJTkRPV1NfQ1VJIHJ1bnMgaW4gV2luZG93cyBjaGFyIHN1Yi4gKGNvbnNvbGUgYXBwKQorICAgICA1IC0gT1MyX0NVSSBydW5zIGluIE9TLzIgY2hhcmFjdGVyIHN1YnN5c3RlbQorICAgICA3IC0gUE9TSVhfQ1VJIHJ1bnMgaW4gUG9zaXggY2hhcmFjdGVyIHN1YnN5c3RlbSAqLworICBzaG9ydCAgIERsbENoYXJhY3RlcmlzdGljczsJLyogZmxhZ3MgZm9yIERMTCBpbml0LCB1c2UgMCAqLworICBiZmRfdm1hIFNpemVPZlN0YWNrUmVzZXJ2ZTsJLyogYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlICAqLworICBiZmRfdm1hIFNpemVPZlN0YWNrQ29tbWl0OwkvKiBhbW91bnQgb2YgbWVtb3J5IGluaXRpYWxseSBjb21taXR0ZWQgZm9yIAorCQkJCSAgIGluaXRpYWwgdGhyZWFkJ3Mgc3RhY2ssIGRlZmF1bHQgaXMgMHgxMDAwICovCisgIGJmZF92bWEgU2l6ZU9mSGVhcFJlc2VydmU7CS8qIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSB0byByZXNlcnZlIGFuZCAqLworICBiZmRfdm1hIFNpemVPZkhlYXBDb21taXQ7CS8qIGNvbW1pdCwgZG9uJ3Qga25vdyB3aGF0IHRvIGRlZmF1dCBpdCB0byAqLworICBsb25nICAgIExvYWRlckZsYWdzOwkJLyogY2FuIHByb2JhYmx5IHNldCB0byAwICovCisgIGxvbmcgICAgTnVtYmVyT2ZSdmFBbmRTaXplczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV4dCBlbnRyeSwgMTYgKi8KKyAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkcgoreworICBzaG9ydCBtYWdpYzsJCQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgc2hvcnQgdnN0YW1wOwkJCS8qIHZlcnNpb24gc3RhbXAJCQkqLworICBiZmRfdm1hIHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCisgIGJmZF92bWEgZHNpemU7CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCisgIGJmZF92bWEgYnNpemU7CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIGJmZF92bWEgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KKyAgYmZkX3ZtYSB0ZXh0X3N0YXJ0OwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBiZmRfdm1hIGRhdGFfc3RhcnQ7CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCisKKyAgLyogaTk2MCBzdHVmZiAqLworICB1bnNpZ25lZCBsb25nIHRhZ2VudHJpZXM7CS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KKworICAvKiBSUy82MDAwIHN0dWZmICovCisgIHVuc2lnbmVkIGxvbmcgb190b2M7CQkvKiBhZGRyZXNzIG9mIFRPQwkJCSovCisgIHNob3J0IG9fc25lbnRyeTsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBlbnRyeSBwb2ludCAqLworICBzaG9ydCBvX3NudGV4dDsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0ZXh0CSovCisgIHNob3J0IG9fc25kYXRhOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGRhdGEJKi8KKyAgc2hvcnQgb19zbnRvYzsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciB0b2MJKi8KKyAgc2hvcnQgb19zbmxvYWRlcjsJCS8qIHNlY3Rpb24gbnVtYmVyIGZvciBsb2FkZXIgc2VjdGlvbiAqLworICBzaG9ydCBvX3NuYnNzOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGJzcwkqLworICBzaG9ydCBvX2FsZ250ZXh0OwkJLyogbWF4IGFsaWdubWVudCBmb3IgdGV4dAkqLworICBzaG9ydCBvX2FsZ25kYXRhOwkJLyogbWF4IGFsaWdubWVudCBmb3IgZGF0YQkqLworICBzaG9ydCBvX21vZHR5cGU7CQkvKiBNb2R1bGUgdHlwZSBmaWVsZCwgMVIsUkUsUk8JKi8KKyAgc2hvcnQgb19jcHV0eXBlOwkJLyogRW5jb2RlZCBDUFUgdHlwZQkJKi8KKyAgdW5zaWduZWQgbG9uZyBvX21heHN0YWNrOwkvKiBtYXggc3RhY2sgc2l6ZSBhbGxvd2VkLgkqLworICB1bnNpZ25lZCBsb25nIG9fbWF4ZGF0YTsJLyogbWF4IGRhdGEgc2l6ZSBhbGxvd2VkLgkqLworCisgIC8qIEVDT0ZGIHN0dWZmICovCisgIGJmZF92bWEgYnNzX3N0YXJ0OwkJLyogQmFzZSBvZiBic3Mgc2VjdGlvbi4JCSovCisgIGJmZF92bWEgZ3BfdmFsdWU7CQkvKiBHUCByZWdpc3RlciB2YWx1ZS4JCSovCisgIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsJLyogR2VuZXJhbCByZWdpc3RlcnMgdXNlZC4JKi8KKyAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwkvKiBDb3Byb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4JKi8KKyAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwkvKiBGbG9hdGluZyBwb2ludGVyIHJlZ2lzdGVycyB1c2VkLiAgKi8KKworICAvKiBBcG9sbG8gc3R1ZmYgKi8KKyAgbG9uZyBvX2lubGliOwkJCS8qIGlubGliIGRhdGEgKi8KKyAgbG9uZyBvX3NyaTsJCQkvKiBTdGF0aWMgUmVzb3VyY2UgSW5mb3JtYXRpb24gKi8KKyAgbG9uZyB2aWRbMl07CQkJLyogVmVyc2lvbiBpZCAqLworCisKKyAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGU7CisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNUT1JBR0UgQ0xBU1NFUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHVzZWQgdG8gYmUgZGVmaW5lZCBhcyAtMSwgYnV0IG5vdyBuX3NjbGFzcyBpcyB1bnNpZ25lZC4gICovCisjZGVmaW5lIENfRUZDTgkJMHhmZgkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JKi8KKyNkZWZpbmUgQ19OVUxMCQkwCisjZGVmaW5lIENfQVVUTwkJMQkvKiBhdXRvbWF0aWMgdmFyaWFibGUJCSovCisjZGVmaW5lIENfRVhUCQkyCS8qIGV4dGVybmFsIHN5bWJvbAkJKi8KKyNkZWZpbmUgQ19TVEFUCQkzCS8qIHN0YXRpYwkJCSovCisjZGVmaW5lIENfUkVHCQk0CS8qIHJlZ2lzdGVyIHZhcmlhYmxlCQkqLworI2RlZmluZSBDX0VYVERFRgk1CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSovCisjZGVmaW5lIENfTEFCRUwJCTYJLyogbGFiZWwJCQkqLworI2RlZmluZSBDX1VMQUJFTAk3CS8qIHVuZGVmaW5lZCBsYWJlbAkJKi8KKyNkZWZpbmUgQ19NT1MJCTgJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkJKi8KKyNkZWZpbmUgQ19BUkcJCTkJLyogZnVuY3Rpb24gYXJndW1lbnQJCSovCisjZGVmaW5lIENfU1RSVEFHCTEwCS8qIHN0cnVjdHVyZSB0YWcJCSovCisjZGVmaW5lIENfTU9VCQkxMQkvKiBtZW1iZXIgb2YgdW5pb24JCSovCisjZGVmaW5lIENfVU5UQUcJCTEyCS8qIHVuaW9uIHRhZwkJCSovCisjZGVmaW5lIENfVFBERUYJCTEzCS8qIHR5cGUgZGVmaW5pdGlvbgkJKi8KKyNkZWZpbmUgQ19VU1RBVElDCTE0CS8qIHVuZGVmaW5lZCBzdGF0aWMJCSovCisjZGVmaW5lIENfRU5UQUcJCTE1CS8qIGVudW1lcmF0aW9uIHRhZwkJKi8KKyNkZWZpbmUgQ19NT0UJCTE2CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkqLworI2RlZmluZSBDX1JFR1BBUk0JMTcJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkqLworI2RlZmluZSBDX0ZJRUxECQkxOAkvKiBiaXQgZmllbGQJCQkqLworI2RlZmluZSBDX0FVVE9BUkcJMTkJLyogYXV0byBhcmd1bWVudAkJKi8KKyNkZWZpbmUgQ19MQVNURU5UCTIwCS8qIGR1bW15IGVudHJ5IChlbmQgb2YgYmxvY2spCSovCisjZGVmaW5lIENfQkxPQ0sJCTEwMAkvKiAiLmJiIiBvciAiLmViIgkJKi8KKyNkZWZpbmUgQ19GQ04JCTEwMQkvKiAiLmJmIiBvciAiLmVmIgkJKi8KKyNkZWZpbmUgQ19FT1MJCTEwMgkvKiBlbmQgb2Ygc3RydWN0dXJlCQkqLworI2RlZmluZSBDX0ZJTEUJCTEwMwkvKiBmaWxlIG5hbWUJCQkqLworI2RlZmluZSBDX0xJTkUJCTEwNAkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCisjZGVmaW5lIENfQUxJQVMJIAkxMDUJLyogZHVwbGljYXRlIHRhZwkJKi8KKyNkZWZpbmUgQ19ISURERU4JMTA2CS8qIGV4dCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYiAqLworCisjZGVmaW5lIENfV0VBS0VYVAkxMjcJLyogd2VhayBzeW1ib2wgLS0gR05VIGV4dGVuc2lvbiAqLworCisvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MCAqLworI2RlZmluZSBDX1VFWFQJCTE5CS8qIFRlbnRhdGl2ZSBleHRlcm5hbCBkZWZpbml0aW9uICovCisjZGVmaW5lIENfU1RBVExBQgkyMAkvKiBTdGF0aWMgbG9hZCB0aW1lIGxhYmVsICovCisjZGVmaW5lIENfRVhUTEFCCTIxCS8qIEV4dGVybmFsIGxvYWQgdGltZSBsYWJlbCAqLworI2RlZmluZSBDX1NZU1RFTQkyMwkvKiBTeXN0ZW0gV2lkZSB2YXJpYWJsZSAqLworCisvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBXSU5ET1dTX05UICAgKi8KKyNkZWZpbmUgQ19TRUNUSU9OICAgICAgIDEwNCAgICAgLyogc2VjdGlvbiBuYW1lICovCisjZGVmaW5lIENfTlRfV0VBSwkxMDUJLyogd2VhayBleHRlcm5hbCAqLworCisgLyogTmV3IHN0b3JhZ2UgY2xhc3NlcyBmb3IgODA5NjAgKi8KKworLyogQ19MRUFGUFJPQyBpcyBvYnNvbGV0ZS4gIFVzZSBDX0xFQUZFWFQgb3IgQ19MRUFGU1RBVCAqLworI2RlZmluZSBDX0xFQUZQUk9DCTEwOAkvKiBMZWFmIHByb2NlZHVyZSwgImNhbGwiIHZpYSBCQUwgKi8KKworI2RlZmluZSBDX1NDQUxMCQkxMDcJLyogUHJvY2VkdXJlIHJlYWNoYWJsZSB2aWEgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUgQ19MRUFGRVhUICAgICAgIDEwOAkvKiBFeHRlcm5hbCBsZWFmICovCisjZGVmaW5lIENfTEVBRlNUQVQgICAgICAxMTMJLyogU3RhdGljIGxlYWYgKi8KKyNkZWZpbmUgQ19PUFRWQVIJMTA5CS8qIE9wdGltaXplZCB2YXJpYWJsZQkJKi8KKyNkZWZpbmUgQ19ERUZJTkUJMTEwCS8qIFByZXByb2Nlc3NvciAjZGVmaW5lCQkqLworI2RlZmluZSBDX1BSQUdNQQkxMTEJLyogQWR2aWNlIHRvIGNvbXBpbGVyIG9yIGxpbmtlcgkqLworI2RlZmluZSBDX1NFR01FTlQJMTEyCS8qIDgwOTYwIHNlZ21lbnQgbmFtZQkJKi8KKworICAvKiBTdG9yYWdlIGNsYXNzZXMgZm9yIG04OGsgKi8KKyNkZWZpbmUgQ19TSEFET1cgICAgICAgIDEwNyAgICAgLyogc2hhZG93IHN5bWJvbCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDX1ZFUlNJT04gICAgICAgMTA4ICAgICAvKiBjb2ZmIHZlcnNpb24gc3ltYm9sICAgICAgICAgICovCisKKyAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBSUy82MDAwICovCisjZGVmaW5lIENfSElERVhUICAgICAgICAxMDcJLyogVW4tbmFtZWQgZXh0ZXJuYWwgc3ltYm9sICovCisjZGVmaW5lIENfQklOQ0wgICAgICAgICAxMDgJLyogTWFya3MgYmVnaW5uaW5nIG9mIGluY2x1ZGUgZmlsZSAqLworI2RlZmluZSBDX0VJTkNMICAgICAgICAgMTA5CS8qIE1hcmtzIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgKi8KKworIC8qIHN0b3JhZ2UgY2xhc3NlcyBmb3Igc3RhYiBzeW1ib2xzIGZvciBSUy82MDAwICovCisjZGVmaW5lIENfR1NZTSAgICAgICAgICAoMHg4MCkKKyNkZWZpbmUgQ19MU1lNICAgICAgICAgICgweDgxKQorI2RlZmluZSBDX1BTWU0gICAgICAgICAgKDB4ODIpCisjZGVmaW5lIENfUlNZTSAgICAgICAgICAoMHg4MykKKyNkZWZpbmUgQ19SUFNZTSAgICAgICAgICgweDg0KQorI2RlZmluZSBDX1NUU1lNICAgICAgICAgKDB4ODUpCisjZGVmaW5lIENfVENTWU0gICAgICAgICAoMHg4NikKKyNkZWZpbmUgQ19CQ09NTSAgICAgICAgICgweDg3KQorI2RlZmluZSBDX0VDT01MICAgICAgICAgKDB4ODgpCisjZGVmaW5lIENfRUNPTU0gICAgICAgICAoMHg4OSkKKyNkZWZpbmUgQ19ERUNMICAgICAgICAgICgweDhjKQorI2RlZmluZSBDX0VOVFJZICAgICAgICAgKDB4OGQpCisjZGVmaW5lIENfRlVOICAgICAgICAgICAoMHg4ZSkKKyNkZWZpbmUgQ19CU1RBVCAgICAgICAgICgweDhmKQorI2RlZmluZSBDX0VTVEFUICAgICAgICAgKDB4OTApCisKKy8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgVGh1bWIgc3ltYm9scyAqLworI2RlZmluZSBDX1RIVU1CRVhUICAgICAgKDEyOCArIENfRVhUKQkJLyogMTMwICovCisjZGVmaW5lIENfVEhVTUJTVEFUICAgICAoMTI4ICsgQ19TVEFUKQkJLyogMTMxICovCisjZGVmaW5lIENfVEhVTUJMQUJFTCAgICAoMTI4ICsgQ19MQUJFTCkJCS8qIDEzNCAqLworI2RlZmluZSBDX1RIVU1CRVhURlVOQyAgKENfVEhVTUJFWFQgICsgMjApCS8qIDE1MCAqLworI2RlZmluZSBDX1RIVU1CU1RBVEZVTkMgKENfVEhVTUJTVEFUICsgMjApCS8qIDE1MSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNDTk5NTEVOICg4KQorCitzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyCit7CisgIGNoYXIgc19uYW1lW1NDTk5NTEVOXTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KKworICAvKiBQaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYi4KKyAgICAgSW4gdGhlIHBlaSBmb3JtYXQsIHRoaXMgZmllbGQgaXMgdGhlIHZpcnR1YWwgc2VjdGlvbiBzaXplCisgICAgICh0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBhZnRlciBiZWluZyBsb2FkZWQgaW50IG1lbW9yeSksCisgICAgIE5PVCB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gICovCisgIGJmZF92bWEgc19wYWRkcjsKKworICBiZmRfdm1hIHNfdmFkZHI7CQkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisgIGJmZF92bWEgc19zaXplOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KKyAgYmZkX3ZtYSBzX3NjbnB0cjsJCS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisgIGJmZF92bWEgc19yZWxwdHI7CQkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisgIGJmZF92bWEgc19sbm5vcHRyOwkJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisgIHVuc2lnbmVkIGxvbmcgc19ucmVsb2M7CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKyAgdW5zaWduZWQgbG9uZyBzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisgIGxvbmcgc19mbGFnczsJCQkvKiBmbGFncwkJCSovCisgIGxvbmcgc19hbGlnbjsJCQkvKiB1c2VkIG9uIEk5NjAJCQkqLworfTsKKworLyoKKyAqIHNfZmxhZ3MgInR5cGUiCisgKi8KKyNkZWZpbmUgU1RZUF9SRUcJICgweDAwMDApCS8qICJyZWd1bGFyIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIGxvYWRlZCAqLworI2RlZmluZSBTVFlQX0RTRUNUCSAoMHgwMDAxKQkvKiAiZHVtbXkiOiAgcmVsb2NhdGVkIG9ubHkqLworI2RlZmluZSBTVFlQX05PTE9BRAkgKDB4MDAwMikJLyogIm5vbG9hZCI6IGFsbG9jYXRlZCwgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCisjZGVmaW5lIFNUWVBfR1JPVVAJICgweDAwMDQpCS8qICJncm91cGVkIjogZm9ybWVkIG9mIGlucHV0IHNlY3Rpb25zICovCisjZGVmaW5lIFNUWVBfUEFECSAoMHgwMDA4KQkvKiAicGFkZGluZyI6IG5vdCBhbGxvY2F0ZWQsIG5vdCByZWxvY2F0ZWQsIGxvYWRlZCAqLworI2RlZmluZSBTVFlQX0NPUFkJICgweDAwMTApCS8qICJjb3B5IjogZm9yIGRlY2lzaW9uIGZ1bmN0aW9uIHVzZWQgYnkgZmllbGQgdXBkYXRlOyAgbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwKKwkJCQkJCQkJCSAgICAgbG9hZGVkOyByZWxvYyAmIGxpbmVubyBlbnRyaWVzIHByb2Nlc3NlZCBub3JtYWxseSAqLworI2RlZmluZSBTVFlQX1RFWFQJICgweDAwMjApCS8qIHNlY3Rpb24gY29udGFpbnMgdGV4dCBvbmx5ICovCisjZGVmaW5lIFNfU0hSU0VHCSAoMHgwMDIwKQkvKiBJbiAzYiBVcGRhdGUgZmlsZXMgKG91dHB1dCBvZiBvZ2VuKSwgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIFNIQVJFRCBzZWdtZW50cyBvZiB0aGUgUGZpbGUKKwkJCQkJCQkJCSAgICAgd2lsbCBoYXZlIHRoZSBTX1NIUlNFRyBmbGFnIHNldCBieSBvZ2VuLCB0byBpbmZvcm0gZHVmciB0aGF0IHVwZGF0aW5nIDEgY29weSBvZiB0aGUgcHJvYy4gd2lsbAorCQkJCQkJCQkJICAgICB1cGRhdGUgYWxsIHByb2Nlc3MgaW52b2NhdGlvbnMuICovCisjZGVmaW5lIFNUWVBfREFUQQkgKDB4MDA0MCkJLyogc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkgKi8KKyNkZWZpbmUgU1RZUF9CU1MJICgweDAwODApCS8qIHNlY3Rpb24gY29udGFpbnMgYnNzIG9ubHkgKi8KKyNkZWZpbmUgU19ORVdGQ04JICgweDAxMDApCS8qIEluIGEgbWluaW1hbCBmaWxlIG9yIGFuIHVwZGF0ZSBmaWxlLCBhIG5ldyBmdW5jdGlvbiAoYXMgY29tcGFyZWQgd2l0aCBhIHJlcGxhY2VkIGZ1bmN0aW9uKSAqLworI2RlZmluZSBTVFlQX0lORk8JICgweDAyMDApCS8qIGNvbW1lbnQ6IG5vdCBhbGxvY2F0ZWQgbm90IHJlbG9jYXRlZCwgbm90IGxvYWRlZCAqLworI2RlZmluZSBTVFlQX09WRVIJICgweDA0MDApCS8qIG92ZXJsYXk6IHJlbG9jYXRlZCBub3QgYWxsb2NhdGVkIG9yIGxvYWRlZCAqLworI2RlZmluZSBTVFlQX0xJQgkgKDB4MDgwMCkJLyogZm9yIC5saWI6IHNhbWUgYXMgSU5GTyAqLworI2RlZmluZSBTVFlQX01FUkdFCSAoMHgyMDAwKQkvKiBtZXJnZSBzZWN0aW9uIC0tIGNvbWJpbmVzIHdpdGggdGV4dCwgZGF0YSBvciBic3Mgc2VjdGlvbnMgb25seSAqLworI2RlZmluZSBTVFlQX1JFVkVSU0VfUEFEICgweDQwMDApCS8qIHNlY3Rpb24gd2lsbCBiZSBwYWRkZWQgd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlcmV2ZXIgcGFkZGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzIGEKKwkJCQkJCisJCQkJCQkJCQkgICAgIHdvcmQgb2YgY29udGlndW91cyBieXRlcworCQkJCQkJCQkJICAgICBiZWdpbm5pbmcgb24gYSB3b3JkIGJvdW5kYXJ5LiAqLworCisjZGVmaW5lIFNUWVBfTElUCTB4ODAyMAkvKiBMaXRlcmFsIGRhdGEgKGxpa2UgU1RZUF9URVhUKSAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgorICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCisgKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQorICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCisKK3N0cnVjdCBpbnRlcm5hbF9saW5lbm8KK3sKKyAgdW5pb24KKyAgeworICAgIGxvbmcgbF9zeW1uZHg7CQkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKyAgICBsb25nIGxfcGFkZHI7CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KKyAgfSAgICAgbF9hZGRyOworICB1bnNpZ25lZCBsb25nIGxfbG5ubzsJCS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBESU1OVU0JCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCitzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50Cit7CisgIHVuaW9uCisgIHsKKyAgICBjaGFyIF9uX25hbWVbU1lNTk1MRU5dOwkvKiBvbGQgQ09GRiB2ZXJzaW9uCSovCisgICAgc3RydWN0CisgICAgeworICAgICAgbG9uZyBfbl96ZXJvZXM7CQkvKiBuZXcgPT0gMAkJKi8KKyAgICAgIGxvbmcgX25fb2Zmc2V0OwkJLyogb2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlICovCisgICAgfSAgICAgIF9uX247CisgICAgY2hhciAqX25fbnB0clsyXTsJCS8qIGFsbG93cyBmb3Igb3ZlcmxheWluZwkqLworICB9ICAgICBfbjsKKyAgbG9uZyBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbAkJKi8KKyAgc2hvcnQgbl9zY251bTsJCS8qIHNlY3Rpb24gbnVtYmVyCQkqLworICB1bnNpZ25lZCBzaG9ydCBuX2ZsYWdzOwkvKiBjb3B5IG9mIGZsYWdzIGZyb20gZmlsaGRyCSovCisgIHVuc2lnbmVkIHNob3J0IG5fdHlwZTsJLyogdHlwZSBhbmQgZGVyaXZlZCB0eXBlCSovCisgIHVuc2lnbmVkIGNoYXIgbl9zY2xhc3M7CS8qIHN0b3JhZ2UgY2xhc3MJCSovCisgIHVuc2lnbmVkIGNoYXIgbl9udW1hdXg7CS8qIG51bWJlciBvZiBhdXguIGVudHJpZXMJKi8KK307CisKKyNkZWZpbmUgbl9uYW1lCQlfbi5fbl9uYW1lCisjZGVmaW5lIG5femVyb2VzCV9uLl9uX24uX25femVyb2VzCisjZGVmaW5lIG5fb2Zmc2V0CV9uLl9uX24uX25fb2Zmc2V0CisKKworLyogUmVsb2NhdGFibGUgc3ltYm9scyBoYXZlIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkLAorICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCisKKyNkZWZpbmUgTl9VTkRFRgkoKHNob3J0KTApCS8qIHVuZGVmaW5lZCBzeW1ib2wgKi8KKyNkZWZpbmUgTl9BQlMJKChzaG9ydCktMSkJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlICovCisjZGVmaW5lIE5fREVCVUcJKChzaG9ydCktMikJLyogZGVidWdnaW5nIHN5bWJvbCAtLSB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAqLworI2RlZmluZSBOX1RWCSgoc2hvcnQpLTMpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcHJlbG9hZCB0cmFuc2ZlciB2ZWN0b3IgKi8KKyNkZWZpbmUgUF9UVgkoKHNob3J0KS00KQkvKiBpbmRpY2F0ZXMgc3ltYm9sIG5lZWRzIHBvc3Rsb2FkIHRyYW5zZmVyIHZlY3RvciovCisKKy8qCisgKiBUeXBlIG9mIGEgc3ltYm9sLCBpbiBsb3cgTiBiaXRzIG9mIHRoZSB3b3JkCisgKi8KKyNkZWZpbmUgVF9OVUxMCQkwCisjZGVmaW5lIFRfVk9JRAkJMQkvKiBmdW5jdGlvbiBhcmd1bWVudCAob25seSB1c2VkIGJ5IGNvbXBpbGVyKSAqLworI2RlZmluZSBUX0NIQVIJCTIJLyogY2hhcmFjdGVyCQkqLworI2RlZmluZSBUX1NIT1JUCQkzCS8qIHNob3J0IGludGVnZXIJKi8KKyNkZWZpbmUgVF9JTlQJCTQJLyogaW50ZWdlcgkJKi8KKyNkZWZpbmUgVF9MT05HCQk1CS8qIGxvbmcgaW50ZWdlcgkJKi8KKyNkZWZpbmUgVF9GTE9BVAkJNgkvKiBmbG9hdGluZyBwb2ludAkqLworI2RlZmluZSBUX0RPVUJMRQk3CS8qIGRvdWJsZSB3b3JkCQkqLworI2RlZmluZSBUX1NUUlVDVAk4CS8qIHN0cnVjdHVyZSAJCSovCisjZGVmaW5lIFRfVU5JT04JCTkJLyogdW5pb24gCQkqLworI2RlZmluZSBUX0VOVU0JCTEwCS8qIGVudW1lcmF0aW9uIAkJKi8KKyNkZWZpbmUgVF9NT0UJCTExCS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbiovCisjZGVmaW5lIFRfVUNIQVIJCTEyCS8qIHVuc2lnbmVkIGNoYXJhY3RlcgkqLworI2RlZmluZSBUX1VTSE9SVAkxMwkvKiB1bnNpZ25lZCBzaG9ydAkqLworI2RlZmluZSBUX1VJTlQJCTE0CS8qIHVuc2lnbmVkIGludGVnZXIJKi8KKyNkZWZpbmUgVF9VTE9ORwkJMTUJLyogdW5zaWduZWQgbG9uZwkqLworI2RlZmluZSBUX0xOR0RCTAkxNgkvKiBsb25nIGRvdWJsZQkJKi8KKworLyoKKyAqIGRlcml2ZWQgdHlwZXMsIGluIG5fdHlwZQorKi8KKyNkZWZpbmUgRFRfTk9OCQkoMCkJLyogbm8gZGVyaXZlZCB0eXBlICovCisjZGVmaW5lIERUX1BUUgkJKDEpCS8qIHBvaW50ZXIgKi8KKyNkZWZpbmUgRFRfRkNOCQkoMikJLyogZnVuY3Rpb24gKi8KKyNkZWZpbmUgRFRfQVJZCQkoMykJLyogYXJyYXkgKi8KKworI2RlZmluZSBCVFlQRSh4KQkoKHgpICYgTl9CVE1BU0spCisKKyNkZWZpbmUgSVNQVFIoeCkgXAorICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX1BUUiA8PCBOX0JUU0hGVCkpCisjZGVmaW5lIElTRkNOKHgpIFwKKyAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9GQ04gPDwgTl9CVFNIRlQpKQorI2RlZmluZSBJU0FSWSh4KSBcCisgICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfQVJZIDw8IE5fQlRTSEZUKSkKKyNkZWZpbmUgSVNUQUcoeCkgXAorICAoKHgpID09IENfU1RSVEFHIHx8ICh4KSA9PSBDX1VOVEFHIHx8ICh4KSA9PSBDX0VOVEFHKQorI2RlZmluZSBERUNSRUYoeCkgXAorICAoKCgoeCkgPj4gTl9UU0hJRlQpICYgfiBOX0JUTUFTSykgfCAoKHgpICYgTl9CVE1BU0spKQorCit1bmlvbiBpbnRlcm5hbF9hdXhlbnQKK3sKKyAgc3RydWN0CisgIHsKKworICAgIHVuaW9uCisgICAgeworICAgICAgbG9uZyBsOwkJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKyAgICAgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7CisgICAgfSAgICAgeF90YWduZHg7CisKKyAgICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdAorICAgICAgeworCXVuc2lnbmVkIHNob3J0IHhfbG5ubzsJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCB4X3NpemU7CS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisgICAgICB9ICAgICAgeF9sbnN6OworICAgICAgbG9uZyB4X2ZzaXplOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworICAgIH0gICAgIHhfbWlzYzsKKworICAgIHVuaW9uCisgICAgeworICAgICAgc3RydWN0CisgICAgICB7CQkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCWxvbmcgeF9sbm5vcHRyOwkJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwl1bmlvbgorCXsJCQkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKwkgIGxvbmcgbDsKKwkgIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnA7CisJfSAgICAgeF9lbmRuZHg7CisgICAgICB9ICAgICAgeF9mY247CisKKyAgICAgIHN0cnVjdAorICAgICAgewkJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwl1bnNpZ25lZCBzaG9ydCB4X2RpbWVuW0RJTU5VTV07CisgICAgICB9ICAgICAgeF9hcnk7CisgICAgfSAgICAgeF9mY25hcnk7CisKKyAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bmR4OwkvKiB0diBpbmRleCAqLworICB9ICAgICAgeF9zeW07CisKKyAgdW5pb24KKyAgeworICAgIGNoYXIgeF9mbmFtZVtGSUxOTUxFTl07CisgICAgc3RydWN0CisgICAgeworICAgICAgbG9uZyB4X3plcm9lczsKKyAgICAgIGxvbmcgeF9vZmZzZXQ7CisgICAgfSAgICAgIHhfbjsKKyAgfSAgICAgeF9maWxlOworCisgIHN0cnVjdAorICB7CisgICAgbG9uZyB4X3NjbmxlbjsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisgICAgdW5zaWduZWQgc2hvcnQgeF9ucmVsb2M7CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisgICAgdW5zaWduZWQgc2hvcnQgeF9ubGlubm87CS8qICMgbGluZSBudW1iZXJzICovCisgICAgdW5zaWduZWQgbG9uZyB4X2NoZWNrc3VtOwkvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bSBmb3IgUEUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB4X2Fzc29jaWF0ZWQ7IC8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggZm9yIFBFICovCisgICAgdW5zaWduZWQgY2hhciB4X2NvbWRhdDsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgZm9yIFBFICovCisgIH0gICAgICB4X3NjbjsKKworICBzdHJ1Y3QKKyAgeworICAgIGxvbmcgeF90dmZpbGw7CQkvKiB0diBmaWxsIHZhbHVlICovCisgICAgdW5zaWduZWQgc2hvcnQgeF90dmxlbjsJLyogbGVuZ3RoIG9mIC50diAqLworICAgIHVuc2lnbmVkIHNob3J0IHhfdHZyYW5bMl07CS8qIHR2IHJhbmdlICovCisgIH0gICAgICB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIFJTLzYwMDAtc3BlY2lmaWMgYXV4ZW50IC0gbGFzdCBhdXhlbnQgZm9yIGV2ZXJ5IGV4dGVybmFsIHN5bWJvbAorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBzdHJ1Y3QKKyAgeworICAgIHVuaW9uCisgICAgICB7CQkJCS8qIGNzZWN0IGxlbmd0aCBvciBlbmNsb3NpbmcgY3NlY3QgKi8KKwlsb25nIGw7CisJc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKKyAgICAgIH0geF9zY25sZW47CisgICAgbG9uZyB4X3Bhcm1oYXNoOwkJLyogcGFybSB0eXBlIGhhc2ggaW5kZXggKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB4X3NuaGFzaDsJLyogc2VjdCBudW0gd2l0aCBwYXJtIGhhc2ggKi8KKyAgICB1bnNpZ25lZCBjaGFyIHhfc210eXA7CS8qIHN5bWJvbCBhbGlnbiBhbmQgdHlwZSAqLworICAgIC8qIDAtNCAtIExvZyAyIG9mIGFsaWdubWVudCAqLworICAgIC8qIDUtNyAtIHN5bWJvbCB0eXBlICovCisgICAgdW5zaWduZWQgY2hhciB4X3NtY2xhczsJLyogc3RvcmFnZSBtYXBwaW5nIGNsYXNzICovCisgICAgbG9uZyB4X3N0YWI7CQkvKiBkYnggc3RhYiBpbmZvIGluZGV4ICovCisgICAgdW5zaWduZWQgc2hvcnQgeF9zbnN0YWI7CS8qIHNlY3QgbnVtIHdpdGggZGJ4IHN0YWIgKi8KKyAgfSAgICAgIHhfY3NlY3Q7CQkvKiBjc2VjdCBkZWZpbml0aW9uIGluZm9ybWF0aW9uICovCisKKy8qIHhfc210eXAgdmFsdWVzOiAgKi8KKworI2RlZmluZQlTTVRZUF9BTElHTih4KQkoKHgpID4+IDMpCS8qIGxvZzIgb2YgYWxpZ25tZW50ICovCisjZGVmaW5lCVNNVFlQX1NNVFlQKHgpCSgoeCkgJiAweDcpCS8qIHN5bWJvbCB0eXBlICovCisvKiBTeW1ib2wgdHlwZSB2YWx1ZXM6ICAqLworI2RlZmluZQlYVFlfRVIJMAkJLyogRXh0ZXJuYWwgcmVmZXJlbmNlICovCisjZGVmaW5lCVhUWV9TRAkxCQkvKiBDc2VjdCBkZWZpbml0aW9uICovCisjZGVmaW5lCVhUWV9MRAkyCQkvKiBMYWJlbCBkZWZpbml0aW9uICovCisjZGVmaW5lIFhUWV9DTQkzCQkvKiAuQlNTICovCisjZGVmaW5lCVhUWV9FTQk0CQkvKiBFcnJvciBtZXNzYWdlICovCisjZGVmaW5lCVhUWV9VUwk1CQkvKiAiUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSIgKi8KKworLyogeF9zbWNsYXMgdmFsdWVzOiAgKi8KKworI2RlZmluZQlYTUNfUFIJMAkJLyogUmVhZC1vbmx5IHByb2dyYW0gY29kZSAqLworI2RlZmluZQlYTUNfUk8JMQkJLyogUmVhZC1vbmx5IGNvbnN0YW50ICovCisjZGVmaW5lCVhNQ19EQgkyCQkvKiBSZWFkLW9ubHkgZGVidWcgZGljdGlvbmFyeSB0YWJsZSAqLworI2RlZmluZQlYTUNfVEMJMwkJLyogUmVhZC13cml0ZSBnZW5lcmFsIFRPQyBlbnRyeSAqLworI2RlZmluZQlYTUNfVUEJNAkJLyogUmVhZC13cml0ZSB1bmNsYXNzaWZpZWQgKi8KKyNkZWZpbmUJWE1DX1JXCTUJCS8qIFJlYWQtd3JpdGUgZGF0YSAqLworI2RlZmluZQlYTUNfR0wJNgkJLyogUmVhZC1vbmx5IGdsb2JhbCBsaW5rYWdlICovCisjZGVmaW5lCVhNQ19YTwk3CQkvKiBSZWFkLW9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9uICovCisjZGVmaW5lCVhNQ19TVgk4CQkvKiBSZWFkLW9ubHkgc3VwZXJ2aXNvciBjYWxsICovCisjZGVmaW5lCVhNQ19CUwk5CQkvKiBSZWFkLXdyaXRlIEJTUyAqLworI2RlZmluZQlYTUNfRFMJMTAJCS8qIFJlYWQtd3JpdGUgZGVzY3JpcHRvciBjc2VjdCAqLworI2RlZmluZQlYTUNfVUMJMTEJCS8qIFJlYWQtd3JpdGUgdW5uYW1lZCBGb3J0cmFuIGNvbW1vbiAqLworI2RlZmluZQlYTUNfVEkJMTIJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgaW5kZXggY3NlY3QgKi8KKyNkZWZpbmUJWE1DX1RCCTEzCQkvKiBSZWFkLW9ubHkgdHJhY2ViYWNrIHRhYmxlIGNzZWN0ICovCisvKiAJCTE0CT8/PyAqLworI2RlZmluZQlYTUNfVEMwCTE1CQkvKiBSZWFkLXdyaXRlIFRPQyBhbmNob3IgKi8KKyNkZWZpbmUgWE1DX1RECTE2CQkvKiBSZWFkLXdyaXRlIGRhdGEgaW4gVE9DICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgc3RydWN0CisgIHsKKyAgICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KKyNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4CisgICAgbG9uZyB4X3N0aW5keDsJCS8qIHN5cy4gdGFibGUgZW50cnkgKi8KKyAgfSAgICAgIHhfc2M7CQkJLyogc3lzdGVtIGNhbGwgZW50cnkgKi8KKworICBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgeF9iYWxudHJ5OwkvKiBCQUwgZW50cnkgcG9pbnQgKi8KKyAgfSAgICAgIHhfYmFsOwkJCS8qIEJBTC1jYWxsYWJsZSBmdW5jdGlvbiAqLworCisgIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgbG9uZyB4X3RpbWVzdGFtcDsJLyogdGltZSBzdGFtcCAqLworICAgIGNoYXIgeF9pZHN0cmluZ1syMF07CS8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLworICB9ICAgICAgeF9pZGVudDsJCS8qIFByb2R1Y2VyIGlkZW50IGluZm8gKi8KKworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBpbnRlcm5hbF9yZWxvYworeworICBiZmRfdm1hIHJfdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgcmVmZXJlbmNlICovCisgIGxvbmcgcl9zeW1uZHg7CQkvKiBJbmRleCBpbnRvIHN5bWJvbCB0YWJsZQkqLworICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7CS8qIFJlbG9jYXRpb24gdHlwZQkJKi8KKyAgdW5zaWduZWQgY2hhciByX3NpemU7CQkvKiBVc2VkIGJ5IFJTLzYwMDAgYW5kIEVDT0ZGCSovCisgIHVuc2lnbmVkIGNoYXIgcl9leHRlcm47CS8qIFVzZWQgYnkgRUNPRkYJCSovCisgIHVuc2lnbmVkIGxvbmcgcl9vZmZzZXQ7CS8qIFVzZWQgYnkgQWxwaGEgRUNPRkYsIFNQQVJDLCBvdGhlcnMgKi8KK307CisKKyNkZWZpbmUgUl9SRUxCWVRFCTAxNworI2RlZmluZSBSX1JFTFdPUkQJMDIwCisjZGVmaW5lIFJfUENSQllURQkwMjIKKyNkZWZpbmUgUl9QQ1JXT1JECTAyMworI2RlZmluZSBSX1BDUkxPTkcJMDI0CisKKyNkZWZpbmUJUl9ESVIxNgkJMDEKKyNkZWZpbmUgUl9ESVIzMgkJMDYKKyNkZWZpbmUJUl9QQ0xPTkcJMDIwCisjZGVmaW5lIFJfUkVMQllURQkwMTcKKyNkZWZpbmUgUl9SRUxXT1JECTAyMAorI2RlZmluZSBSX0lNQUdFQkFTRSAgICAgMDcKKworCisjZGVmaW5lIFJfUENSMTZMIDEyOAorI2RlZmluZSBSX1BDUjI2TCAxMjkKKyNkZWZpbmUgUl9WUlQxNiAgMTMwCisjZGVmaW5lIFJfSFZSVDE2IDEzMQorI2RlZmluZSBSX0xWUlQxNiAxMzIKKyNkZWZpbmUgUl9WUlQzMiAgMTMzCisjZGVmaW5lIFJfUkVMTE9ORwkoMHgxMSkJLyogRGlyZWN0IDMyLWJpdCByZWxvY2F0aW9uICovCisjZGVmaW5lIFJfSVBSU0hPUlQJKDB4MTgpCisjZGVmaW5lIFJfSVBSTE9ORwkoMHgxYSkKKyNkZWZpbmUgUl9HRVRTRUcJKDB4MWQpCisjZGVmaW5lIFJfR0VUUEEJCSgweDFlKQorI2RlZmluZSBSX1RBR1dPUkQJKDB4MWYpCisjZGVmaW5lIFJfSlVNUFRBUkcJMHgyMAkvKiBzdHJhbmdlIDI5ayAwMHh4MDB4eCByZWxvYyAqLworCisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDE2Yml0IGFic29sdXRlCisgICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCisgICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9NT1YxNkIxICAgIAkweDQxCisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMTZiaXQKKyAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKKyAgIGFic29sdXRlIGFkZHJlc3MuICAqLworI2RlZmluZSBSX01PVjE2QjIgCTB4NDIKKworLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMTZiaXQgdGFyZ2V0IGFkZHJlc3M7CisgICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAorICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLworI2RlZmluZSBSX0pNUDEgICAgIAkweDQzCisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJyYSB3aXRoIGFuIDgtYml0IHBjLXJlbGF0aXZlCisgICB0YXJnZXQgdGhhdCB3YXMgZm9ybWVybGx5IGEgam1wIGluc24gd2l0aCBhIDE2Yml0IHRhcmdldC4gICovCisjZGVmaW5lIFJfSk1QMiAJCTB4NDQKKworLyogPz8/ICovCisjZGVmaW5lIFJfUkVMTE9OR19ORUcgIAkweDQ1CisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBqbXAgaW5zbnMgd2l0aCBhIDI0Yml0IHRhcmdldCBhZGRyZXNzOworICAgdGhlIGxpbmtlciB0cmllcyB0byB0dXJuIHRoZXNlIGluc25zIGludG8gYnJhIGluc25zIHdpdGgKKyAgIGFuIDhiaXQgcGMtcmVsYXRpdmUgdGFyZ2V0LiAgKi8KKyNkZWZpbmUgUl9KTVBMMSAgICAgCTB4NDYKKworLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKKyAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMjRiaXQgdGFyZ2V0LiAgKi8KKyNkZWZpbmUgUl9KTVBMMgkJMHg0NworCisvKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92LmIgaW5zdHJ1Y3Rpb25zIHdpdGggYSAyNGJpdCBhYnNvbHV0ZQorICAgYWRkcmVzcy4gIFRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiBpbnNucyB3aXRoIHRoaXMgcmVsb2MgaW50bworICAgYW4gYWJzb2x1dGUgOC1iaXQgYWRkcmVzcy4gICovCisKKyNkZWZpbmUgUl9NT1YyNEIxICAgIAkweDQ4CisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2hpY2ggaGFkIGEgMjRiaXQKKyAgIGFic29sdXRlIGFkZHJlc3Mgd2hpY2ggaGF2ZSBiZWVuIHNob3J0ZW5lZCBpbnRvIGEgOC1iaXQKKyAgIGFic29sdXRlIGFkZHJlc3MuICAqLworI2RlZmluZSBSX01PVjI0QjIgCTB4NDkKKworLyogQW4gaDgzMDAgbWVtb3J5IGluZGlyZWN0IGp1bXAvY2FsbC4gIEZvcmNlcyB0aGUgYWRkcmVzcyBvZiB0aGUganVtcC9jYWxsCisgICB0YXJnZXQgaW50byB0aGUgZnVuY3Rpb24gdmVjdG9yIChpbiBwYWdlIHplcm8pLCBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICB2ZWN0b3IgZW50cnkgdG8gYmUgcGxhY2VkIGluIHRoZSBqdW1wL2NhbGwgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBSX01FTV9JTkRJUkVDVAkweDRhCisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgd2hpY2ggd2FzCisgICBzaG9ydGVuZWQgaW50byBhbiA4Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCB0YXJnZXQuICAqLworI2RlZmluZSBSX1BDUldPUkRfQgkweDRiCisKKy8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuW3dsXSBpbnN0cnVjdGlvbnMgd2l0aCBhIDMyLzI0IGJpdAorICAgYWJzb2x1dGUgYWRkcmVzczsgdGhlIGxpbmtlciBtYXkgdHVybiB0aGlzIGludG8gYSBtb3YuW3dsXQorICAgaW5zbiB3aXRoIGEgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcy4gICovCisjZGVmaW5lIFJfTU9WTDEgICAgCTB4NGMKKworLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc25zIHdoaWNoIGZvcm1lcmxseSBoYWQKKyAgIGEgMzIvMjRiaXQgYWJzb2x1dGUgYWRkcmVzcyBhbmQgaG93IGhhdmUgYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9NT1ZMMiAJMHg0ZAorCisvKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBiQ0M6OCB3aGljaCB3aWxsIGhhdmUgaXQncyBjb25kaXRpb24KKyAgIGludmVydGVkIGFuZCBpdHMgdGFyZ2V0IHJlZGlyZWN0ZWQgdG8gdGhlIHRhcmdldCBvZiB0aGUgYnJhbmNoCisgICBpbiB0aGUgZm9sbG93aW5nIGluc24uICAqLworI2RlZmluZSBSX0JDQ19JTlYJMHg0ZQorCisvKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBqbXAgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYmVlbiBkZWxldGVkLiAgKi8KKyNkZWZpbmUgUl9KTVBfREVMCTB4NGYKKworLyogWjhrIG1vZGVzICovCisjZGVmaW5lIFJfSU1NMTYgICAweDAxCQkvKiAxNiBiaXQgYWJzICovCisjZGVmaW5lIFJfSlIJICAweDAyCQkvKiBqciAgOCBiaXQgZGlzcCAqLworI2RlZmluZSBSX0lNTTRMICAgMHgyMwkJLyogbG93IG5pYmJsZSAqLworI2RlZmluZSBSX0lNTTggICAgMHgyMgkJLyogOCBiaXQgYWJzICovCisjZGVmaW5lIFJfSU1NMzIgICBSX1JFTExPTkcJLyogMzIgYml0IGFicyAqLworI2RlZmluZSBSX0NBTEwgICAgUl9EQQkJLyogQWJzb2x1dGUgYWRkcmVzcyB3aGljaCBjb3VsZCBiZSBhIGNhbGxyICovCisjZGVmaW5lIFJfSlAJICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEganAgKi8KKyNkZWZpbmUgUl9SRUwxNiAgIDB4MDQJCS8qIDE2IGJpdCBQQyByZWwgKi8KKyNkZWZpbmUgUl9DQUxMUgkgIDB4MDUJCS8qIGNhbGxyIDEyIGJpdCBkaXNwICovCisjZGVmaW5lIFJfU0VHICAgICAweDEwCQkvKiBzZXQgaWYgaW4gc2VnbWVudGVkIG1vZGUgKi8KKyNkZWZpbmUgUl9JTU00SCAgIDB4MjQJCS8qIGhpZ2ggbmliYmxlICovCisjZGVmaW5lIFJfRElTUDcgICAweDI1ICAgICAgICAgIC8qIGRqbnogZGlzcGxhY2VtZW50ICovCisKKy8qIEg4NTAwIG1vZGVzICovCisKKyNkZWZpbmUgUl9IODUwMF9JTU04ICAJMQkJLyogIDggYml0IGltbWVkaWF0ZSAJKi8KKyNkZWZpbmUgUl9IODUwMF9JTU0xNiAJMgkJLyogMTYgYml0IGltbWVkaWF0ZQkqLworI2RlZmluZSBSX0g4NTAwX1BDUkVMOCAJMwkJLyogIDggYml0IHBjcmVsIAkqLworI2RlZmluZSBSX0g4NTAwX1BDUkVMMTYgNAkJLyogMTYgYml0IHBjcmVsIAkqLworI2RlZmluZSBSX0g4NTAwX0hJR0g4ICAJNQkJLyogaGlnaCA4IGJpdHMgb2YgMjQgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9IODUwMF9MT1cxNiAJNwkJLyogbG93IDE2IGJpdHMgb2YgMjQgYml0IGltbWVkaWF0ZSAqLworI2RlZmluZSBSX0g4NTAwX0lNTTI0CTYJCS8qIDI0IGJpdCBpbW1lZGlhdGUgKi8KKyNkZWZpbmUgUl9IODUwMF9JTU0zMiAgIDggICAgICAgICAgICAgICAvKiAzMiBiaXQgaW1tZWRpYXRlICovCisjZGVmaW5lIFJfSDg1MDBfSElHSDE2ICA5CQkvKiBoaWdoIDE2IGJpdHMgb2YgMzIgYml0IGltbWVkaWF0ZSAqLworCisvKiBXNjUgbW9kZXMgKi8KKworI2RlZmluZSBSX1c2NV9BQlM4CTEgIC8qIGFkZHIgJiAweGZmIAkJKi8KKyNkZWZpbmUgUl9XNjVfQUJTMTYJMiAgLyogYWRkciAmIDB4ZmZmZiAJCSovCisjZGVmaW5lIFJfVzY1X0FCUzI0CTMgIC8qIGFkZHIgJiAweGZmZmZmZiAJCSovCisKKyNkZWZpbmUgUl9XNjVfQUJTOFM4ICAgIDQgIC8qIChhZGRyID4+IDgpICYgMHhmZiAJKi8KKyNkZWZpbmUgUl9XNjVfQUJTOFMxNiAgIDUgIC8qIChhZGRyID4+IDE2KSAmIDB4ZmYgCSovCisKKyNkZWZpbmUgUl9XNjVfQUJTMTZTOCAgIDYgIC8qIChhZGRyID4+IDgpICYgMGZmZmYgCSovCisjZGVmaW5lIFJfVzY1X0FCUzE2UzE2ICA3ICAvKiAoYWRkciA+PiAxNikgJiAwZmZmZiAJKi8KKworI2RlZmluZSBSX1c2NV9QQ1I4CTgKKyNkZWZpbmUgUl9XNjVfUENSMTYJOQorCisjZGVmaW5lIFJfVzY1X0RQICAgICAgIDEwICAvKiBkaXJlY3QgcGFnZSA4IGJpdHMgb25seSAgICovCisKKyNlbmRpZiAvKiBHTlVfQ09GRl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTY4ay5oIGIvaW5jbHVkZS9jb2ZmL202OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE0N2VkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL202OGsuaApAQCAtMCwwICsxLDIyNSBAQAorLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBNNjhLICovCisKKyNpZm5kZWYgR05VX0NPRkZfTTY4S19ICisjZGVmaW5lIEdOVV9DT0ZGX002OEtfSCAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKKwljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisJY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCisJY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCisJY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisKKy8qIE1vdG9yb2xhIDY4MDAwLzY4MDA4LzY4MDEwLzY4MDIwICovCisjZGVmaW5lCU1DNjhNQUdJQwkwNTIwCisjZGVmaW5lIE1DNjhLV1JNQUdJQwkwNTIwCS8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICovCisjZGVmaW5lCU1DNjhUVk1BR0lDCTA1MjEKKyNkZWZpbmUgTUM2OEtST01BR0lDCTA1MjEJLyogcmVhZG9ubHkgc2hhcmVhYmxlIHRleHQgc2VnbWVudHMgKi8KKyNkZWZpbmUgTUM2OEtQR01BR0lDCTA1MjIJLyogZGVtYW5kIHBhZ2VkIHRleHQgc2VnbWVudHMgKi8KKyNkZWZpbmUJTTY4TUFHSUMJMDIxMAorI2RlZmluZQlNNjhUVk1BR0lDCTAyMTEKKworLyogdGhpcyBpcyB0aGUgbWFnaWMgb2YgdGhlIEJ1bGwgZHB4LzIgKi8KKyNkZWZpbmUgTUM2OEtCQ1NNQUdJQwkwNTI2CisKKy8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLworCisjZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQorCisjZGVmaW5lIE9NQUdJQyBNNjhNQUdJQworCisvKiBUaGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgaW5jbHVkZSBNQzY4S0JDU01BR0lDOyBpdCBvbmx5IGluY2x1ZGVzCisgICBtYWdpYyBudW1iZXJzIHdoaWNoIGltcGx5IHRoYXQgbmFtZXMgZG8gbm90IGhhdmUgdW5kZXJzY29yZXMuICAqLworI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKKyAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TFlOWENPRkZNQUdJQykgKQorCisvKiBNYWdpYyBudW1iZXJzIGZvciB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KKworI2RlZmluZSBQQUdFTUFHSUNFWEVDU1dBUFBFRCAgMDQwNyAvKiBleGVjdXRhYmxlIChzd2FwcGVkKSAqLworI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgMDQxMCAvKiBwdXJlIGV4ZWN1dGFibGUgKHN3YXBwZWQpICovCisjZGVmaW5lIFBBR0VNQUdJQ1BFWEVDVFNITElCICAwNDQzIC8qIHB1cmUgZXhlY3V0YWJsZSAodGFyZ2V0IHNoYXJlZCBsaWJyYXJ5KSAqLworI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1BBR0VEICAgMDQxMyAvKiBwdXJlIGV4ZWN1dGFibGUgKHBhZ2VkKSAqLworCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworfQorQU9VVEhEUjsKKworI2RlZmluZSBBT1VUU1ogMjgKKyNkZWZpbmUgQU9VVEhEUlNaIDI4CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisjZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk2CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfdHlwZVsyXTsKKyNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCisgIGNoYXIgcl9vZmZzZXRbNF07CisjZW5kaWYKKworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworCisjaWZkZWYgTTY4S19DT0ZGX09GRlNFVAorI2RlZmluZSBSRUxTWiAxNAorI2Vsc2UKKyNkZWZpbmUgUkVMU1ogMTAKKyNlbmRpZgorCisjZW5kaWYgLyogR05VX0NPRkZfTTY4S19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTg4ay5oIGIvaW5jbHVkZS9jb2ZmL204OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDZlYjQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL204OGsuaApAQCAtMCwwICsxLDIxOSBAQAorLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciA4OGsgYmNzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworI2RlZmluZSBNQzg4TUFHSUMgIDA1NDAgICAgICAgICAgIC8qIDg4ayBCQ1MgZXhlY3V0YWJsZSAqLworI2RlZmluZSBNQzg4RE1BR0lDIDA1NDEgICAgICAgICAgIC8qIERHL1VYIGV4ZWN1dGFibGUgICAqLworI2RlZmluZSBNQzg4T01BR0lDIDA1NTUJICAgICAgICAgIC8qIE9iamVjdCBmaWxlICAgICAgICAqLworCisjZGVmaW5lIE1DODhCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUM4OE1BR0lDKSAmJigoeCkuZl9tYWdpYyE9TUM4OERNQUdJQykgJiYgKCh4KS5mX21hZ2ljICE9IE1DODhPTUFHSUMpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBQQUdFTUFHSUMzIDA0MTQgLyogU3BsaXQgaSZkLCB6ZXJvIG1hcHBlZCAqLworI2RlZmluZSBQQUdFTUFHSUNCQ1MgMDQxMworCisKK3R5cGVkZWYgc3RydWN0IAoreworICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLworICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLworICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCisgIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCisgIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KKyAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KK30KK0FPVVRIRFI7CisKKworLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCisKKyNkZWZpbmUgQU9VVFNaIDI4CisjZGVmaW5lIEFPVVRIRFJTWiAyOAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciAKK3sKKyAgY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworICBjaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworICBjaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisgIGNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKyAgY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisgIGNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisgIGNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisgIGNoYXIJCXNfbnJlbG9jWzRdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCisgIGNoYXIJCXNfbmxubm9bNF07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKyAgY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0NAorCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQgICAiLnRleHQiCisjZGVmaW5lIF9EQVRBICAgIi5kYXRhIgorI2RlZmluZSBfQlNTICAgICIuYnNzIgorI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworc3RydWN0IGV4dGVybmFsX2xpbmVub3sKKwl1bmlvbiB7CisJCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLworCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworCX0gbF9hZGRyOworCisJY2hhciBsX2xubm9bNF07CisKK307CisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCTgKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudCAKK3sKKyAgdW5pb24geworICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIGVfemVyb2VzWzRdOworICAgICAgY2hhciBlX29mZnNldFs0XTsKKyAgICB9IGU7CisgIH0gZTsKKyAgY2hhciBlX3ZhbHVlWzRdOworICBjaGFyIGVfc2NudW1bMl07CisgIGNoYXIgZV90eXBlWzJdOworICBjaGFyIGVfc2NsYXNzWzFdOworICBjaGFyIGVfbnVtYXV4WzFdOworICBjaGFyIHBhZDJbMl07Cit9OworCisKKworCisjZGVmaW5lIE5fQlRNQVNLCTAxNworI2RlZmluZSBOX1RNQVNLCQkwNjAKKyNkZWZpbmUgTl9CVFNIRlQJNAorI2RlZmluZSBOX1RTSElGVAkyCisKKworLyogTm90ZSB0aGF0IHRoaXMgaXNuJ3QgdGhlIHNhbWUgc2hhcGUgYXMgb3RoZXIgY29mZnMgKi8KK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisgIHN0cnVjdCB7CisgICAgY2hhciB4X3RhZ25keFs0XTsJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKyAgICAvKiA0ICovCisgICAgdW5pb24geworICAgICAgY2hhciB4X2ZzaXplWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworICAgICAgc3RydWN0IHsKKwljaGFyICB4X2xubm9bNF07CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJY2hhciAgeF9zaXplWzRdOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworICAgICAgfSB4X2xuc3o7CisgICAgfSB4X21pc2M7CisgICAgCisgICAgLyogMTIgKi8KKyAgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgewkJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCWNoYXIgeF9lbmRuZHhbNF07CQkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKyAgICAgIH0geF9mY247CisgICAgICBzdHJ1Y3QgewkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLworCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisgICAgICB9IHhfYXJ5OworICAgIH0geF9mY25hcnk7CisgICAgLyogMjAgKi8KKyAgICAKKyAgfSB4X3N5bTsKKyAgCisgIHVuaW9uIHsKKyAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgeF96ZXJvZXNbNF07CisgICAgICBjaGFyIHhfb2Zmc2V0WzRdOworICAgIH0geF9uOworICB9IHhfZmlsZTsKKyAgCisgIHN0cnVjdCB7CisgICAgY2hhciB4X3Njbmxlbls0XTsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisgICAgY2hhciB4X25yZWxvY1s0XTsJCS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisgICAgY2hhciB4X25saW5ub1s0XTsJCS8qICMgbGluZSBudW1iZXJzICovCisgIH0geF9zY247CisgIAorICBzdHJ1Y3QgeworICAgIGNoYXIgeF90dmZpbGxbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCisgICAgY2hhciB4X3R2bGVuWzJdOwkJLyogbGVuZ3RoIG9mIC50diAqLworICAgIGNoYXIgeF90dnJhblsyXVsyXTsJCS8qIHR2IHJhbmdlICovCisgIH0geF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCisKK307CisKKyNkZWZpbmUgR0VUX0ZDTl9MTk5PUFRSKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQorI2RlZmluZSBHRVRfRkNOX0VORE5EWChhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKKyNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCisjZGVmaW5lIFBVVF9GQ05fRU5ETkRYKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopICAgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKKyNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKKyNkZWZpbmUgR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKKyNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQorI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCisjZGVmaW5lIEdFVF9TQ05fU0NOTEVOKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQorI2RlZmluZSBHRVRfU0NOX05SRUxPQyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25yZWxvYykKKyNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQorI2RlZmluZSBQVVRfU0NOX1NDTkxFTihhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCisjZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQorI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCxpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ubGlubm8pCisjZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpCisjZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworCisKKworI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAorI2RlZmluZQlTWU1FU1oJMjAKKyNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAorI2RlZmluZQlBVVhFU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfdHlwZVsyXTsKKyAgY2hhciByX29mZnNldFsyXTsKK307CisKKyNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCisjZGVmaW5lIFJFTFNaICAxMgorCisjZGVmaW5lIE5PX1RWTkRYCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbWNvcmUuaCBiL2luY2x1ZGUvY29mZi9tY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGI2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvbWNvcmUuaApAQCAtMCwwICsxLDI0NSBAQAorLyogTW90b3JvbGxhIE1Db3JlIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1Db3JlIENPRkYvUEUgQUJJLiAqLworCisjaWZuZGVmIF9DT0ZGX01PUkVfSAorI2RlZmluZSBfQ09GRl9NT1JFX0gKKworCisjZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCisjZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURSAgICAgICAgICAJMHgwMDAwCisjZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9BRERSMzIgICAgICAgICAgICAJMHgwMDAxCisjZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU04Qlk0CQkweDAwMDIKKyNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTExQlkyCQkweDAwMDMKKyNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTRCWTIJCTB4MDAwNAorI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIJCTB4MDAwNQorI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyCTB4MDAwNgorCisjZGVmaW5lIFBFTUNPUkUKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljICAgICAgWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wICAgICBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZSAgICAgIFs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplICAgICAgWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplICAgICAgWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5ICAgICAgWzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnQgWzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0IFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KK30KK0FPVVRIRFI7CisKKyNkZWZpbmUgQU9VVFNaIDI4CisjZGVmaW5lIEFPVVRIRFJTWiAyOAorCisjZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCisjZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLworI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLworI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLworCisvKiBGcm9tIHdpbm50LmggKi8KKyNkZWZpbmUgSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDICAgICAgICAweDEwYgorCisKKy8qIERlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzLiAqLworI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKKyNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAorI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAorI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKKworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKK3sKKyAgY2hhciByX3ZhZGRyICBbNF07CisgIGNoYXIgcl9zeW1uZHggWzRdOworICBjaGFyIHJfdHlwZSAgIFsyXTsKKyAgY2hhciByX29mZnNldCBbNF07Cit9OworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxNAorCisjZGVmaW5lCU1DT1JFTUFHSUMJMHhiMDAgIC8qIEkganVzdCBtYWRlIHRoaXMgdXAgKi8gCisKKyNkZWZpbmUgTUNPUkVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9IE1DT1JFTUFHSUMpKQorCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgoreworICBjaGFyIGZfbWFnaWMgIFsyXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKyAgY2hhciBmX25zY25zICBbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKyAgY2hhciBmX3RpbWRhdCBbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworICBjaGFyIGZfc3ltcHRyIFs0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworICBjaGFyIGZfbnN5bXMgIFs0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisgIGNoYXIgZl9vcHRoZHIgWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKyAgY2hhciBmX2ZsYWdzICBbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKyNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCisjZGVmaW5lCUZJTEhTWgkyMAorCisKKyNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudCAKK3sKKyAgdW5pb24KKyAgeworICAgIGNoYXIgZV9uYW1lIFtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBjaGFyIGVfemVyb2VzIFs0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXQgWzRdOworICAgIH0gZTsKKyAgfSBlOworICAKKyAgY2hhciBlX3ZhbHVlICBbNF07CisgIGNoYXIgZV9zY251bSAgWzJdOworICBjaGFyIGVfdHlwZSAgIFsyXTsKKyAgY2hhciBlX3NjbGFzcyBbMV07CisgIGNoYXIgZV9udW1hdXggWzFdOworfTsKKworI2RlZmluZSBOX0JUTUFTSwkweGYKKyNkZWZpbmUgTl9UTUFTSwkJMHgzMAorI2RlZmluZSBOX0JUU0hGVAk0CisjZGVmaW5lIE5fVFNISUZUCTIKKwordW5pb24gZXh0ZXJuYWxfYXV4ZW50Cit7CisgIHN0cnVjdAorICB7CisgICAgY2hhciB4X3RhZ25keCBbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisgICAgCisgICAgdW5pb24KKyAgICB7CisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKwljaGFyICB4X2xubm8gWzJdOyAJLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwljaGFyICB4X3NpemUgWzJdOyAJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KKyAgICAgIH0geF9sbnN6OworCisgICAgICBjaGFyIHhfZnNpemUgWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCisgICAgfSB4X21pc2M7CisKKyAgICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdCAJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKyAgICAgIHsKKwljaGFyIHhfbG5ub3B0ciBbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCisJY2hhciB4X2VuZG5keCAgWzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKyAgICAgIH0geF9mY247CisKKyAgICAgIHN0cnVjdCAJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKyAgICAgIHsKKwljaGFyIHhfZGltZW4gW0VfRElNTlVNXVsyXTsKKyAgICAgIH0geF9hcnk7CisgICAgICAKKyAgICB9IHhfZmNuYXJ5OworCisgICAgY2hhciB4X3R2bmR4IFsyXTsJCS8qIHR2IGluZGV4ICovCisKKyAgfSB4X3N5bTsKKworICB1bmlvbgorICB7CisgICAgY2hhciB4X2ZuYW1lIFtFX0ZJTE5NTEVOXTsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBjaGFyIHhfemVyb2VzIFs0XTsKKyAgICAgIGNoYXIgeF9vZmZzZXQgWzRdOworICAgIH0geF9uOworICAgIAorICB9IHhfZmlsZTsKKworICBzdHJ1Y3QKKyAgeworICAgIGNoYXIgeF9zY25sZW4gICAgIFs0XTsJLyogc2VjdGlvbiBsZW5ndGggKi8KKyAgICBjaGFyIHhfbnJlbG9jICAgICBbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisgICAgY2hhciB4X25saW5ubyAgICAgWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworICAgIGNoYXIgeF9jaGVja3N1bSAgIFs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KKyAgICBjaGFyIHhfYXNzb2NpYXRlZCBbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KKyAgICBjaGFyIHhfY29tZGF0ICAgICBbMV07CS8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyICovCisgIH0geF9zY247CisKKyAgc3RydWN0CisgIHsKKyAgICBjaGFyIHhfdHZmaWxsIFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KKyAgICBjaGFyIHhfdHZsZW4gIFsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KKyAgICBjaGFyIHhfdHZyYW4gIFsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KKyAgfSB4X3R2OwkJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gICovCitzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCit7CisgIHVuaW9uCisgIHsKKyAgICBjaGFyIGxfc3ltbmR4IFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisgICAgY2hhciBsX3BhZGRyICBbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworICB9IGxfYWRkcjsKKworICBjaGFyIGxfbG5ubyBbMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubworI2RlZmluZQlMSU5FU1oJNgorCisjZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpICAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKKyNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7CisKK3N0cnVjdCBleHRlcm5hbF9zY25oZHIKK3sKKyAgY2hhcglzX25hbWUgICAgWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworICBjaGFyCXNfcGFkZHIgICBbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisgIGNoYXIJc192YWRkciAgIFs0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworICBjaGFyCXNfc2l6ZSAgICBbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCisgIGNoYXIJc19zY25wdHIgIFs0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKyAgY2hhcglzX3JlbHB0ciAgWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisgIGNoYXIJc19sbm5vcHRyIFs0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisgIGNoYXIJc19ucmVsb2MgIFsyXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworICBjaGFyCXNfbmxubm8gICBbMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKyAgY2hhcglzX2ZsYWdzICAgWzRdOwkvKiBmbGFncwkJCSovCit9OworCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCisjZGVmaW5lCVNDTkhTWgk0MAorCisvKiBOYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMuICAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKworCisKKyNlbmRpZiAvKiBfX0NPRkZfTUNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21pcHMuaCBiL2luY2x1ZGUvY29mZi9taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2NjViMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9taXBzLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qIEVDT0ZGIHN1cHBvcnQgb24gTUlQUyBtYWNoaW5lcy4KKyAgIGNvZmYvZWNvZmYuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGZpbGUuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisgIHVuc2lnbmVkIGNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKyAgdW5zaWduZWQgY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisgIHVuc2lnbmVkIGNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworICB1bnNpZ25lZCBjaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisgIHVuc2lnbmVkIGNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisgIHVuc2lnbmVkIGNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworICB1bnNpZ25lZCBjaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKy8qIE1hZ2ljIG51bWJlcnMgYXJlIGRlZmluZWQgaW4gY29mZi9lY29mZi5oLiAgKi8KKyNkZWZpbmUgTUlQU19FQ09GRl9CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ18xKSAmJiBcCisJCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFKSAmJlwKKwkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUcpICYmIFwKKwkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUyKSAmJiBcCisJCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfQklHMikgJiYgXAorCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRTMpICYmIFwKKwkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUczKSkKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCit0eXBlZGVmIHN0cnVjdCBleHRlcm5hbF9hb3V0aGRyCit7CisgIHVuc2lnbmVkIGNoYXIgbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCQkqLworICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIHVuc2lnbmVkIGNoYXIJdHNpemVbNF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCisgIHVuc2lnbmVkIGNoYXIJYnNpemVbNF07CS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJCSovCisgIHVuc2lnbmVkIGNoYXIgdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICB1bnNpZ25lZCBjaGFyIGRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgY2hhciBic3Nfc3RhcnRbNF07CS8qIGJhc2Ugb2YgYnNzIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICB1bnNpZ25lZCBjaGFyIGdwcm1hc2tbNF07CS8qID8/ICovCisgIHVuc2lnbmVkIGNoYXIgY3BybWFza1s0XVs0XTsJLyogPz8gKi8KKyAgdW5zaWduZWQgY2hhciBncF92YWx1ZVs0XTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCit9IEFPVVRIRFI7CisKKy8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLworCisjZGVmaW5lIEFPVVRTWiA1NgorI2RlZmluZSBBT1VUSERSU1ogNTYKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisgIHVuc2lnbmVkIGNoYXIJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworICB1bnNpZ25lZCBjaGFyCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisgIHVuc2lnbmVkIGNoYXIJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworICB1bnNpZ25lZCBjaGFyCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKyAgdW5zaWduZWQgY2hhcglzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworICB1bnNpZ25lZCBjaGFyCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisgIHVuc2lnbmVkIGNoYXIJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKyAgdW5zaWduZWQgY2hhcglzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisgIHVuc2lnbmVkIGNoYXIJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIHVuc2lnbmVkIGNoYXIgcl92YWRkcls0XTsKKyAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Cit9OworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiA4CisKKy8qIE1JUFMgRUNPRkYgdXNlcyBhIHBhY2tlZCA4IGJ5dGUgZm9ybWF0IGZvciByZWxvY3MuICBUaGVzZSBjb25zdGFudHMKKyAgIGFyZSB1c2VkIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkLiAgKi8KKworI2RlZmluZSBSRUxPQ19CSVRTMF9TWU1ORFhfU0hfTEVGVF9CSUcJCTE2CisjZGVmaW5lIFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQkwCisKKyNkZWZpbmUgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfQklHCQk4CisjZGVmaW5lIFJFTE9DX0JJVFMxX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQk4CisKKyNkZWZpbmUgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfQklHCQkwCisjZGVmaW5lIFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRQkxNgorCisvKiBPcmlnaW5hbGx5LCBFQ09GRiB1c2VkIGZvdXIgYml0cyBmb3IgdGhlIHJlbG9jIHR5cGUgYW5kIGhhZCB0aHJlZQorICAgcmVzZXJ2ZWQgYml0cy4gIElyaXggNCBhZGRlZCBhbm90aGVyIGJpdCBmb3IgdGhlIHJlbG9jIHR5cGUsIHdoaWNoCisgICB3YXMgZWFzeSBiZWNhdXNlIGl0IHdhcyBiaWcgZW5kaWFuIGFuZCBvbmUgb2YgdGhlIHNwYXJlIGJpdHMgYmVjYW1lCisgICB0aGUgbmV3IG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVG8gbWFrZSB0aGlzIGFsc28gd29yayBmb3IgbGl0dGxlCisgICBlbmRpYW4gRUNPRkYsIHdlIG5lZWQgdG8gd3JhcCBvbmUgb2YgdGhlIHJlc2VydmVkIGJpdHMgYXJvdW5kIHRvCisgICBiZWNvbWUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSByZWxvYyB0eXBlLiAgKi8KKyNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9CSUcJCQkweDNFCisjZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfU0hfQklHCQkJMQorI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRQkJCTB4NzgKKyNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUJCTMKKyNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRQkJMHgwNAorI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCQkyCisKKyNkZWZpbmUgUkVMT0NfQklUUzNfRVhURVJOX0JJRwkJCTB4MDEKKyNkZWZpbmUgUkVMT0NfQklUUzNfRVhURVJOX0xJVFRMRQkJMHg4MAorCisvKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgSQorICAgZG9uJ3Qga25vdyBpZiBhbnkgb3RoZXIgdmFsdWVzIGNhbiBhcHBlYXIuICBUaGVzZSBzZWVtIHRvIGJlIGFsbAorICAgdGhhdCBvY2N1ciBpbiB0aGUgVWx0cml4IDQuMiBsaWJyYXJpZXMuICAqLworI2RlZmluZSBNSVBTX1JfSUdOT1JFCTAKKyNkZWZpbmUgTUlQU19SX1JFRkhBTEYJMQorI2RlZmluZSBNSVBTX1JfUkVGV09SRAkyCisjZGVmaW5lIE1JUFNfUl9KTVBBRERSCTMKKyNkZWZpbmUgTUlQU19SX1JFRkhJCTQKKyNkZWZpbmUgTUlQU19SX1JFRkxPCTUKKyNkZWZpbmUgTUlQU19SX0dQUkVMCTYKKyNkZWZpbmUgTUlQU19SX0xJVEVSQUwJNworCisvKiBUaGVzZSByZWxvYyB0eXBlcyBhcmUgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nCisgICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgVGhlIG51bWJlcnMgYXJlCisgICB0YWtlbiBmcm9tIElyaXggNCwgYnV0IGF0IGxlYXN0IGZvciBpbnRlcm5hbCByZWxvY3MgSXJpeCA1IGRvZXMgbm90CisgICBnaXZlIHRoZW0gdGhlIHNhbWUgbWVhbmluZy4gIEZvciBhbiBpbnRlcm5hbCByZWxvYyB0aGUgc3ltYm9sIGluZGV4CisgICBvZiBSRUxISSBhbmQgUkVMTE8gaXMgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGJlbG93IGZvcgorICAgTUlQU19SX1NXSVRDSC4gICovCisjZGVmaW5lIE1JUFNfUl9QQ1JFTDE2CTEyCisjZGVmaW5lIE1JUFNfUl9SRUxISQkxMworI2RlZmluZSBNSVBTX1JfUkVMTE8JMTQKKworLyogVGhpcyByZWxvYyB0eXBlIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgorICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IGlzIHVzZWQgZm9yIGFuIGVudHJ5IGluCisgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgorICAgICAud29yZCAkTDMtJExTMTIKKyAgIFRoZSBvYmplY3QgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIGNvcnJlY3QgZGlmZmVyZW5jZSwgYW5kIGRvZXMgbm90CisgICByZXF1aXJlIGFkanVzdG1lbnQuICBIb3dldmVyLCB3aGVuIHRoZSBsaW5rZXIgaXMgcmVsYXhpbmcgUEMKKyAgIHJlbGF0aXZlIGNhbGxzLCBpdCBpcyBwb3NzaWJsZSBmb3IgJEwzIHRvIG1vdmUgZmFydGhlciBhd2F5LiAgVGhpcworICAgcmVsb2MgYWx3YXlzIGFwcGVhcnMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuZCBpcyBhbHdheXMgYWdhaW5zdAorICAgdGhlIC50ZXh0IHNlY3Rpb24uICBIb3dldmVyLCB0aGUgc3ltYm9sIGluZGV4IGlzIG5vdAorICAgUkVMT0NfU0VDVElPTl9URVhULiAgSXQgaXMsIGluc3RlYWQsIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMKKyAgIHN3aXRjaCB0YWJsZSBlbnRyeSBhbmQgJExTMTIuICBUaHVzLCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgJEwxMiBpcworICAgICB2YWRkciAtIHN5bW5keAorICAgYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMgaXMKKyAgICAgdmFkZHIgLSBzeW1uZHggKyBhZGRlbmQKKyAgIHdoZXJlIGFkZGVuZCBpcyB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlLiAgS25vd2luZyB0aGlzLCB0aGUKKyAgIGxpbmtlciBjYW4ga25vdyB3aGV0aGVyIHRoZSBhZGRlbmQgaW4gdGhlIG9iamVjdCBmaWxlIG11c3QgYmUKKyAgIGFkanVzdGVkLiAgKi8KKyNkZWZpbmUgTUlQU19SX1NXSVRDSAkyMgorCisvKioqKioqKioqKioqKioqKioqKioqKiBTVEFCUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1JUFNfSVNfU1RBQiBFQ09GRl9JU19TVEFCCisjZGVmaW5lIE1JUFNfTUFSS19TVEFCIEVDT0ZGX01BUktfU1RBQgorI2RlZmluZSBNSVBTX1VOTUFSS19TVEFCIEVDT0ZGX1VOTUFSS19TVEFCCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTElDIElORk9STUFUSU9OICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLiAgKi8KKworLyogRUNPRkYgdXNlcyBDT0ZGLWxpa2Ugc2VjdGlvbiBzdHJ1Y3R1cmVzLCBidXQgaXRzIG93biBzeW1ib2wgZm9ybWF0LgorICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN5bWJvbCBmb3JtYXQgaW4gZmllbGRzIHdob3NlIHNpemUgYW5kIGFsaWdubWVudAorICAgd2lsbCBub3QgdmFyeSBvbiBkaWZmZXJlbnQgaG9zdCBzeXN0ZW1zLiAgKi8KKworLyogRmlsZSBoZWFkZXIgYXMgYSBzZXQgb2YgYnl0ZXMgKi8KKworc3RydWN0IGhkcl9leHQgeworCXVuc2lnbmVkIGNoYXIgCWhfbWFnaWNbMl07CisJdW5zaWduZWQgY2hhcgloX3ZzdGFtcFsyXTsKKwl1bnNpZ25lZCBjaGFyCWhfaWxpbmVNYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2NiTGluZVs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lT2Zmc2V0WzRdOworCXVuc2lnbmVkIGNoYXIJaF9pZG5NYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2NiRG5PZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcgloX2lwZE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JQZE9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaXN5bU1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JTeW1PZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcgloX2lvcHRNYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2NiT3B0T2Zmc2V0WzRdOworCXVuc2lnbmVkIGNoYXIJaF9pYXV4TWF4WzRdOworCXVuc2lnbmVkIGNoYXIJaF9jYkF1eE9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfaXNzTWF4WzRdOworCXVuc2lnbmVkIGNoYXIJaF9jYlNzT2Zmc2V0WzRdOworCXVuc2lnbmVkIGNoYXIJaF9pc3NFeHRNYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2NiU3NFeHRPZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcgloX2lmZE1heFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JGZE9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY3JmZFs0XTsKKwl1bnNpZ25lZCBjaGFyCWhfY2JSZmRPZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcgloX2lleHRNYXhbNF07CisJdW5zaWduZWQgY2hhcgloX2NiRXh0T2Zmc2V0WzRdOworfTsKKworLyogRmlsZSBkZXNjcmlwdG9yIGV4dGVybmFsIHJlY29yZCAqLworCitzdHJ1Y3QgZmRyX2V4dCB7CisJdW5zaWduZWQgY2hhcglmX2Fkcls0XTsKKwl1bnNpZ25lZCBjaGFyCWZfcnNzWzRdOworCXVuc2lnbmVkIGNoYXIJZl9pc3NCYXNlWzRdOworCXVuc2lnbmVkIGNoYXIJZl9jYlNzWzRdOworCXVuc2lnbmVkIGNoYXIJZl9pc3ltQmFzZVs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfY3N5bVs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfaWxpbmVCYXNlWzRdOworCXVuc2lnbmVkIGNoYXIJZl9jbGluZVs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfaW9wdEJhc2VbNF07CisJdW5zaWduZWQgY2hhcglmX2NvcHRbNF07CisJdW5zaWduZWQgY2hhcglmX2lwZEZpcnN0WzJdOworCXVuc2lnbmVkIGNoYXIJZl9jcGRbMl07CisJdW5zaWduZWQgY2hhcglmX2lhdXhCYXNlWzRdOworCXVuc2lnbmVkIGNoYXIJZl9jYXV4WzRdOworCXVuc2lnbmVkIGNoYXIJZl9yZmRCYXNlWzRdOworCXVuc2lnbmVkIGNoYXIJZl9jcmZkWzRdOworCXVuc2lnbmVkIGNoYXIJZl9iaXRzMVsxXTsKKwl1bnNpZ25lZCBjaGFyCWZfYml0czJbM107CisJdW5zaWduZWQgY2hhcglmX2NiTGluZU9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lWzRdOworfTsKKworI2RlZmluZQlGRFJfQklUUzFfTEFOR19CSUcJCTB4RjgKKyNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfU0hfQklHCQkzCisjZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0xJVFRMRQkJMHgxRgorI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9MSVRUTEUJMAorCisjZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfQklHCQkweDA0CisjZGVmaW5lCUZEUl9CSVRTMV9GTUVSR0VfTElUVExFCQkweDIwCisKKyNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fQklHCQkweDAyCisjZGVmaW5lCUZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRQkweDQwCisKKyNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHCTB4MDEKKyNkZWZpbmUJRkRSX0JJVFMxX0ZCSUdFTkRJQU5fTElUVExFCTB4ODAKKworI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0JJRwkJMHhDMAorI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0JJRwkJNgorI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX0xJVFRMRQkJMHgwMworI2RlZmluZQlGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRQkwCisKKy8qIFdlIGlnbm9yZSB0aGUgYHJlc2VydmVkJyBmaWVsZCBpbiBiaXRzMi4gKi8KKworLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCisKK3N0cnVjdCBwZHJfZXh0IHsKKwl1bnNpZ25lZCBjaGFyCXBfYWRyWzRdOworCXVuc2lnbmVkIGNoYXIJcF9pc3ltWzRdOworCXVuc2lnbmVkIGNoYXIJcF9pbGluZVs0XTsKKwl1bnNpZ25lZCBjaGFyCXBfcmVnbWFza1s0XTsKKwl1bnNpZ25lZCBjaGFyCXBfcmVnb2Zmc2V0WzRdOworCXVuc2lnbmVkIGNoYXIJcF9pb3B0WzRdOworCXVuc2lnbmVkIGNoYXIJcF9mcmVnbWFza1s0XTsKKwl1bnNpZ25lZCBjaGFyCXBfZnJlZ29mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCXBfZnJhbWVvZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcglwX2ZyYW1lcmVnWzJdOworCXVuc2lnbmVkIGNoYXIJcF9wY3JlZ1syXTsKKwl1bnNpZ25lZCBjaGFyCXBfbG5Mb3dbNF07CisJdW5zaWduZWQgY2hhcglwX2xuSGlnaFs0XTsKKwl1bnNpZ25lZCBjaGFyCXBfY2JMaW5lT2Zmc2V0WzRdOworfTsKKworLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUgKi8KKworc3RydWN0IHJwZHJfZXh0IHsKKwl1bnNpZ25lZCBjaGFyCXBfYWRyWzRdOworCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOworCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07CisJdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOworCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOworCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKKwl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07CisJdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOworCXVuc2lnbmVkIGNoYXIJcF9pcnBzc1s0XTsKKwl1bnNpZ25lZCBjaGFyCXBfcmVzZXJ2ZWRbNF07CisJdW5zaWduZWQgY2hhcglwX2V4Y2VwdGlvbl9pbmZvWzRdOworfTsKKworLyogTGluZSBudW1iZXJzICovCisKK3N0cnVjdCBsaW5lX2V4dCB7CisJdW5zaWduZWQgY2hhcglsX2xpbmVbNF07Cit9OworCisvKiBTeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCisKK3N0cnVjdCBzeW1fZXh0IHsKKwl1bnNpZ25lZCBjaGFyCXNfaXNzWzRdOworCXVuc2lnbmVkIGNoYXIJc192YWx1ZVs0XTsKKwl1bnNpZ25lZCBjaGFyCXNfYml0czFbMV07CisJdW5zaWduZWQgY2hhcglzX2JpdHMyWzFdOworCXVuc2lnbmVkIGNoYXIJc19iaXRzM1sxXTsKKwl1bnNpZ25lZCBjaGFyCXNfYml0czRbMV07Cit9OworCisjZGVmaW5lCVNZTV9CSVRTMV9TVF9CSUcJCTB4RkMKKyNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0JJRwkJMgorI2RlZmluZQlTWU1fQklUUzFfU1RfTElUVExFCQkweDNGCisjZGVmaW5lCVNZTV9CSVRTMV9TVF9TSF9MSVRUTEUJCTAKKworI2RlZmluZQlTWU1fQklUUzFfU0NfQklHCQkweDAzCisjZGVmaW5lCVNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRwkzCisjZGVmaW5lCVNZTV9CSVRTMV9TQ19MSVRUTEUJCTB4QzAKKyNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xJVFRMRQkJNgorCisjZGVmaW5lCVNZTV9CSVRTMl9TQ19CSUcJCTB4RTAKKyNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0JJRwkJNQorI2RlZmluZQlTWU1fQklUUzJfU0NfTElUVExFCQkweDA3CisjZGVmaW5lCVNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRQkyCisKKyNkZWZpbmUJU1lNX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHgxMAorI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfTElUVExFCTB4MDgKKworI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfQklHCQkweDBGCisjZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRwkxNgorI2RlZmluZQlTWU1fQklUUzJfSU5ERVhfTElUVExFCQkweEYwCisjZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUJNAorCisjZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0JJRwk4CisjZGVmaW5lCVNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRQk0CisKKyNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHCTAKKyNkZWZpbmUJU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfTElUVExFCTEyCisKKy8qIEV4dGVybmFsIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KKworc3RydWN0IGV4dF9leHQgeworCXVuc2lnbmVkIGNoYXIJZXNfYml0czFbMV07CisJdW5zaWduZWQgY2hhcgllc19iaXRzMlsxXTsKKwl1bnNpZ25lZCBjaGFyCWVzX2lmZFsyXTsKKwlzdHJ1Y3QJc3ltX2V4dCBlc19hc3ltOworfTsKKworI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0JJRwkJMHg4MAorI2RlZmluZQlFWFRfQklUUzFfSk1QVEJMX0xJVFRMRQkJMHgwMQorCisjZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRwkweDQwCisjZGVmaW5lCUVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRQkweDAyCisKKyNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfQklHCQkweDIwCisjZGVmaW5lCUVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRQkweDA0CisKKy8qIERlbnNlIG51bWJlcnMgZXh0ZXJuYWwgcmVjb3JkICovCisKK3N0cnVjdCBkbnJfZXh0IHsKKwl1bnNpZ25lZCBjaGFyCWRfcmZkWzRdOworCXVuc2lnbmVkIGNoYXIJZF9pbmRleFs0XTsKK307CisKKy8qIFJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvciAqLworCitzdHJ1Y3QgcmZkX2V4dCB7CisgIHVuc2lnbmVkIGNoYXIJcmZkWzRdOworfTsKKworLyogT3B0aW1pemVyIHN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KKworc3RydWN0IG9wdF9leHQgeworICB1bnNpZ25lZCBjaGFyIG9fYml0czFbMV07CisgIHVuc2lnbmVkIGNoYXIgb19iaXRzMlsxXTsKKyAgdW5zaWduZWQgY2hhciBvX2JpdHMzWzFdOworICB1bnNpZ25lZCBjaGFyIG9fYml0czRbMV07CisgIHN0cnVjdCBybmR4X2V4dCBvX3JuZHg7CisgIHVuc2lnbmVkIGNoYXIgb19vZmZzZXRbNF07Cit9OworCisjZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRwkxNgorI2RlZmluZSBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMAorCisjZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0JJRwk4CisjZGVmaW5lIE9QVF9CSVRTM19WQUxVRV9TSF9MRUZUX0xJVFRMRQk4CisKKyNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfQklHCTAKKyNkZWZpbmUgT1BUX0JJVFM0X1ZBTFVFX1NIX0xFRlRfTElUVExFCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcGUuaCBiL2luY2x1ZGUvY29mZi9wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjc2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvcGUuaApAQCAtMCwwICsxLDE2OSBAQAorLyogUEUgQ09GRiBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKworI2lmbmRlZiBfUEVfSAorI2RlZmluZSBfUEVfSAorCisvKiBOVCBzcGVjaWZpYyBmaWxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgSU1BR0VfRklMRV9SRUxPQ1NfU1RSSVBQRUQgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NUUklQUEVEICAgICAgIDB4MDAwOAorI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgICAgICAgMHgwMDgwCisjZGVmaW5lIElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJTUFHRV9GSUxFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIElNQUdFX0ZJTEVfRExMICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9ISSAgICAgICAgIDB4ODAwMAorCisvKiBhZGRpdGlvbmFsIGZsYWdzIHRvIGJlIHNldCBmb3Igc2VjdGlvbiBoZWFkZXJzIHRvIGFsbG93IHRoZSBOVCBsb2FkZXIgdG8KKyAgIHJlYWQgYW5kIHdyaXRlIHRvIHRoZSBzZWN0aW9uIGRhdGEgKHRvIHJlcGxhY2UgdGhlIGFkZHJlc3NlcyBvZiBkYXRhIGluCisgICBkbGxzIGZvciBvbmUgdGhpbmcpOyBhbHNvIHRvIGV4ZWN1dGUgdGhlIHNlY3Rpb24gaW4gLnRleHQncyBjYXNlICovCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgMHgwMjAwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgMHg4MDAwMDAwMAorCisvKgorICogU2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYWRkZWQgZm9yIHBwYy1udAorICovCisKKyNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8qIFJlc2VydmVkLiAqLworCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUuICovCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSAgICAgICAweDAwMDAwMDQwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEuICovCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBICAgICAweDAwMDAwMDgwICAvKiBTZWN0aW9uIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YS4gKi8KKworI2RlZmluZSBJTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLyogUmVzZXJ2ZWQuICovCisjZGVmaW5lIElNQUdFX1NDTl9MTktfSU5GTyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4gKi8KKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFNlY3Rpb24gY29udGVudHMgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgaW1hZ2UuICovCisjZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvKiBTZWN0aW9uIGNvbnRlbnRzIGNvbWRhdC4gKi8KKworI2RlZmluZSBJTUFHRV9TQ05fTUVNX0ZBUkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fUFVSR0VBQkxFICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fMTZCSVQgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTE9DS0VEICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fUFJFTE9BRCAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAgICAgIDB4MDA1MDAwMDAgIC8qIERlZmF1bHQgYWxpZ25tZW50IGlmIG5vIG90aGVycyBhcmUgc3BlY2lmaWVkLiAqLworI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAgICAgICAgICAgICAgMHgwMDYwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUyAgICAgICAgICAgICAgMHgwMDcwMDAwMAorCisKKyNkZWZpbmUgSU1BR0VfU0NOX0xOS19OUkVMT0NfT1ZGTCAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIFNlY3Rpb24gY29udGFpbnMgZXh0ZW5kZWQgcmVsb2NhdGlvbnMuICovCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4gICAgICAgICAgICAgICAqLworI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgcGFnZWFibGUuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9TSEFSRUQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgIC8qIFNlY3Rpb24gaXMgc2hhcmVhYmxlLiAgICAgICAgICAgICAgICAgICovCisKKy8qIENPTURBVCBzZWxlY3Rpb24gY29kZXMuICAqLworCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgICAoMSkgLyogV2FybiBpZiBkdXBsaWNhdGVzLiAgKi8KKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlkJCSAgICAgKDIpIC8qIE5vIHdhcm5pbmcuICAqLworI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRQkgICAgICgzKSAvKiBXYXJuIGlmIGRpZmZlcmVudCBzaXplLiAgKi8KKyNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSAkgICAgICg0KSAvKiBXYXJuIGlmIGRpZmZlcmVudC4gICovCisjZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUJICAgICAoNSkgLyogQmFzZSBvbiBvdGhlciBzZWN0aW9uLiAgKi8KKworLyogTWFnaWMgdmFsdWVzIHRoYXQgYXJlIHRydWUgZm9yIGFsbCBkb3MvbnQgaW1wbGVtZW50YXRpb25zICovCisjZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgCisjZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAKKworICAvKiBOVCBhbGxvd3MgbG9uZyBmaWxlbmFtZXMsIHdlIHdhbnQgdG8gYWNjb21tb2RhdGUgdGhpcy4gIFRoaXMgbWF5IGJyZWFrCisgICAgIHNvbWUgb2YgdGhlIGJmZCBmdW5jdGlvbnMgKi8KKyN1bmRlZiAgRklMTk1MRU4KKyNkZWZpbmUgRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLworCisKKyNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKKy8qIFRoZSBmaWxlaGRyIGlzIG9ubHkgd2VpcmVkIGluIGltYWdlcyAqLworCisjdW5kZWYgRklMSERSCitzdHJ1Y3QgZXh0ZXJuYWxfUEVfZmlsZWhkcgoreworICAvKiBET1MgaGVhZGVyIGZpZWxkcyAqLworICBjaGFyIGVfbWFnaWNbMl07CQkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLworICBjaGFyIGVfY2JscFsyXTsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCisgIGNoYXIgZV9jcFsyXTsJCQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KKyAgY2hhciBlX2NybGNbMl07CQkvKiBSZWxvY2F0aW9ucywgMHgwICovCisgIGNoYXIgZV9jcGFyaGRyWzJdOwkJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCisgIGNoYXIgZV9taW5hbGxvY1syXTsJCS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLworICBjaGFyIGVfbWF4YWxsb2NbMl07CQkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KKyAgY2hhciBlX3NzWzJdOwkJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCisgIGNoYXIgZV9zcFsyXTsJCQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCisgIGNoYXIgZV9jc3VtWzJdOwkJLyogQ2hlY2tzdW0sIDB4MCAqLworICBjaGFyIGVfaXBbMl07CQkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCisgIGNoYXIgZV9jc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLworICBjaGFyIGVfbGZhcmxjWzJdOwkJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KKyAgY2hhciBlX292bm9bMl07CQkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCisgIGNoYXIgZV9yZXNbNF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLworICBjaGFyIGVfb2VtaWRbMl07CQkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLworICBjaGFyIGVfb2VtaW5mb1syXTsJCS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCisgIGNoYXIgZV9yZXMyWzEwXVsyXTsJCS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCisgIGNoYXIgZV9sZmFuZXdbNF07CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KKyAgY2hhciBkb3NfbWVzc2FnZVsxNl1bNF07CS8qIG90aGVyIHN0dWZmLCBhbHdheXMgZm9sbG93IERPUyBoZWFkZXIgKi8KKyAgY2hhciBudF9zaWduYXR1cmVbNF07CQkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKKworICAvKiBGcm9tIHN0YW5kYXJkIGhlYWRlciAqLyAgCisKKworICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLworICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisgIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKyAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKyAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisgIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKyAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLworCit9OworCisKKyNkZWZpbmUgRklMSERSIHN0cnVjdCBleHRlcm5hbF9QRV9maWxlaGRyCisjdW5kZWYgRklMSFNaCisjZGVmaW5lIEZJTEhTWiAxNTIKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IAoreworICBBT1VUSERSIHN0YW5kYXJkOworCisgIC8qIE5UIGV4dHJhIGZpZWxkczsgc2VlIGludGVybmFsLmggZm9yIGRlc2NyaXB0aW9ucyAqLworICBjaGFyICBJbWFnZUJhc2VbNF07CisgIGNoYXIgIFNlY3Rpb25BbGlnbm1lbnRbNF07CisgIGNoYXIgIEZpbGVBbGlnbm1lbnRbNF07CisgIGNoYXIgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvblsyXTsKKyAgY2hhciAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uWzJdOworICBjaGFyICBNYWpvckltYWdlVmVyc2lvblsyXTsKKyAgY2hhciAgTWlub3JJbWFnZVZlcnNpb25bMl07CisgIGNoYXIgIE1ham9yU3Vic3lzdGVtVmVyc2lvblsyXTsKKyAgY2hhciAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uWzJdOworICBjaGFyICBSZXNlcnZlZDFbNF07CisgIGNoYXIgIFNpemVPZkltYWdlWzRdOworICBjaGFyICBTaXplT2ZIZWFkZXJzWzRdOworICBjaGFyICBDaGVja1N1bVs0XTsKKyAgY2hhciAgU3Vic3lzdGVtWzJdOworICBjaGFyICBEbGxDaGFyYWN0ZXJpc3RpY3NbMl07CisgIGNoYXIgIFNpemVPZlN0YWNrUmVzZXJ2ZVs0XTsKKyAgY2hhciAgU2l6ZU9mU3RhY2tDb21taXRbNF07CisgIGNoYXIgIFNpemVPZkhlYXBSZXNlcnZlWzRdOworICBjaGFyICBTaXplT2ZIZWFwQ29tbWl0WzRdOworICBjaGFyICBMb2FkZXJGbGFnc1s0XTsKKyAgY2hhciAgTnVtYmVyT2ZSdmFBbmRTaXplc1s0XTsKKyAgLyogSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107ICovCisgIGNoYXIgIERhdGFEaXJlY3RvcnlbMTZdWzJdWzRdOyAvKiAxNiBlbnRyaWVzLCAyIGVsZW1lbnRzL2VudHJ5LCA0IGNoYXJzICovCisKK30gUEVBT1VUSERSOworCisKKyN1bmRlZiBBT1VUU1oKKyNkZWZpbmUgQU9VVFNaIChBT1VUSERSU1ogKyAxOTYpCisKKyN1bmRlZiAgRV9GSUxOTUxFTgorI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaCBiL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1MmNmOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qIEJhc2ljIGNvZmYgaW5mb3JtYXRpb24gZm9yIHRoZSBQb3dlclBDCisgKgorICogQmFzZWQgb24gY29mZi9yczYwMDAuaCwgY29mZi9pMzg2LmggYW5kIG90aGVycy4KKyAqCisgKiBJbml0aWFsIHJlbGVhc2U6IEtpbSBLbnV0dGlsYSAoa3JrQGN5Z251cy5jb20pCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworICBjaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCisgIGNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworICBjaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKyAgY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLworICBjaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworICBjaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKyAgY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCit9OworCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworLyogQml0cyBmb3IgZl9mbGFnczoKKyAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCisgKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKKyAqLworCisjZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCisjZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKKyNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQorI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQorCisvKiBleHRyYSBOVCBkZWZpbmVzICovCisjZGVmaW5lIFBQQ01BR0lDICAgICAgIDA3NjAgICAgICAgICAvKiBwZWVrZWQgb24gYWEgUG93ZXJQQyBXaW5kb3dzIE5UIGJveCAqLworI2RlZmluZSBET1NNQUdJQyAgICAgICAweDVhNGQgICAgICAgLyogZnJvbSBhcm0uaCwgaTM4Ni5oICovCisjZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAgICAvKiBmcm9tIGFybS5oLCBpMzg2LmggKi8KKworLyogZnJvbSB3aW5udC5oICovCisjZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKKworI2RlZmluZSBQUENCQURNQUcoeCkgKCh4KS5mX21hZ2ljICE9IFBQQ01BR0lDKSAKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCisgIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCit9CitBT1VUSERSOworCisjZGVmaW5lIEFPVVRTWiAyOAorI2RlZmluZSBBT1VUSERSU1ogMjgKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisgIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJICAgICovCisgIGNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisgIGNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkgICAgICAgICAgICAqLworICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSAgICAqLworICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKyAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JICAgICovCisgIGNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSAgICAqLworICBjaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkgICAgKi8KKyAgY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMgICAgKi8KKyAgY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkgICAgKi8KK307CisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTQwCisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKyNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgorI2RlZmluZSBfTElCICIubGliIgorCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworICB1bmlvbiB7CisgICAgY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCAqLworICAgIGNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSAgICAgICAqLworICB9IGxfYWRkcjsKKyAgY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk2CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFX1NZTU5NTEVOCTggICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lICAgICAgICovCisKKy8qIEFsbG93IHRoZSBmaWxlIG5hbWUgbGVuZ3RoIHRvIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGluY2x1ZGluZyBmaWxlICAgKi8KKyNpZm5kZWYgRV9GSUxOTUxFTgorI2RlZmluZSBFX0ZJTE5NTEVOCTE0CisjZW5kaWYKKworI2RlZmluZSBFX0RJTU5VTQk0ICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorCisjZGVmaW5lIE5fQlRNQVNLCSgweGYpCisjZGVmaW5lIE5fVE1BU0sJCSgweDMwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisgIAordW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKKyAgc3RydWN0IHsKKyAgICBjaGFyIHhfdGFnbmR4WzRdOwkgICAgICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggICAgICAgKi8KKyAgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgeworCWNoYXIgIHhfbG5ub1syXTsgICAgICAgICAgIC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICAgICAgICAgKi8KKwljaGFyICB4X3NpemVbMl07ICAgICAgICAgICAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAgICAgICAgICAgICovCisgICAgICB9IHhfbG5zejsKKyAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJICAgICAgICAgICAvKiBzaXplIG9mIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisgICAgfSB4X21pc2M7CisgICAgdW5pb24geworICAgICAgc3RydWN0IHsJCSAgICAgICAgICAgLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICAgICAgICAgICAqLworCWNoYXIgeF9sbm5vcHRyWzRdOyAgICAgICAgIC8qIHB0ciB0byBmY24gbGluZSAjICAgICAgICAgICAgICAgKi8KKwljaGFyIHhfZW5kbmR4WzRdOwkgICAvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgICAgICAgICovCisgICAgICB9IHhfZmNuOworICAgICAgc3RydWN0IHsJCSAgICAgICAgICAgLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICAgICAgICAqLworCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisgICAgICB9IHhfYXJ5OworICAgIH0geF9mY25hcnk7CisgICAgY2hhciB4X3R2bmR4WzJdOwkJICAgLyogdHYgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAqLworICB9IHhfc3ltOworICAKKyAgdW5pb24geworICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciB4X3plcm9lc1s0XTsKKyAgICAgIGNoYXIgeF9vZmZzZXRbNF07CisgICAgfSB4X247CisgIH0geF9maWxlOworICAKKyAgc3RydWN0IHsKKyAgICBjaGFyIHhfc2NubGVuWzRdOwkgICAgICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICAgICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyIHhfbnJlbG9jWzJdOwkgICAgICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICAgICAgICAgICAgKi8KKyAgICBjaGFyIHhfbmxpbm5vWzJdOwkgICAgICAgICAgIC8qICMgbGluZSBudW1iZXJzICAgICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyIHhfY2hlY2tzdW1bNF07CQkgICAvKiBzZWN0aW9uIENPTURBVCBjaGVja3N1bQkgICAgICAqLworICAgIGNoYXIgeF9hc3NvY2lhdGVkWzJdOwkgICAvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCisgICAgY2hhciB4X2NvbWRhdFsxXTsJCSAgIC8qIENPTURBVCBzZWxlY3Rpb24gbnVtYmVyCSAgICAgICovCisgIH0geF9zY247Cit9OworCisjZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKKyNkZWZpbmUJQVVYRVNaCTE4CisKKyNkZWZpbmUgX0VURVhUCSJldGV4dCIKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsKKyAgY2hhciByX3N5bW5keFs0XTsKKyAgY2hhciByX3R5cGVbMl07Cit9OworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxMAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvcnM2MDAwLmggYi9pbmNsdWRlL2NvZmYvcnM2MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlZjFkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9yczYwMDAuaApAQCAtMCwwICsxLDI0MyBAQAorLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlIGRlZmluaXRpb25zIGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBGSVhNRTogQ2FuIHNvbWVvbmUgcHJvdmlkZSBhIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGlzIG5hbWUgaW50byBBU0NJST8KKyAgIFVzaW5nIHRoZSBmb2xsb3dpbmcgY2hhcnMgY2F1c2VkIGEgY29tcGlsZXIgd2FybmluZyBvbiBISVVYIChzbyBJIHJlcGxhY2VkCisgICB0aGVtIHdpdGggb2N0YWwgZXNjYXBlcyksIGFuZCBpc24ndCB1c2VmdWwgd2l0aG91dCBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoYXQKKyAgIGNoYXJhY3RlciBzZXQgaXQgaXMuCisgICBXcml0dGVuIGJ5IE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUgb2YgSUJNCisgICBhbmQgSm9obiBHaWxtb3JlIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKyAgICAgICAgLyogSUJNIFJTLzYwMDAgKi8KKyNkZWZpbmUgVTgwMldSTUFHSUMgICAgIDA3MzAgICAgLyogd3JpdGVhYmxlIHRleHQgc2VnbWVudHMgKipjaGgqKiAgICAgICovCisjZGVmaW5lIFU4MDJST01BR0lDICAgICAwNzM1ICAgIC8qIHJlYWRvbmx5IHNoYXJhYmxlIHRleHQgc2VnbWVudHMgICAgICAqLworI2RlZmluZSBVODAyVE9DTUFHSUMgICAgMDczNyAgICAvKiByZWFkb25seSB0ZXh0IHNlZ21lbnRzIGFuZCBUT0MgICAgICAgKi8KKworI2RlZmluZSBCQURNQUcoeCkJXAorCSgoeCkuZl9tYWdpYyAhPSBVODAyUk9NQUdJQyAmJiAoeCkuZl9tYWdpYyAhPSBVODAyV1JNQUdJQyAmJiBcCisJICh4KS5mX21hZ2ljICE9IFU4MDJUT0NNQUdJQykKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgc3RydWN0IAoreworICB1bnNpZ25lZCBjaGFyCW1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkqLworICB1bnNpZ25lZCBjaGFyCXZzdGFtcFsyXTsJLyogdmVyc2lvbiBzdGFtcAkJKi8KKyAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSAqLworICB1bnNpZ25lZCBjaGFyCWRzaXplWzRdOwkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJKi8KKyAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCSovCisgIHVuc2lnbmVkIGNoYXIJZW50cnlbNF07CS8qIGVudHJ5IHB0LgkJCSovCisgIHVuc2lnbmVkIGNoYXIJdGV4dF9zdGFydFs0XTsJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICB1bnNpZ25lZCBjaGFyCWRhdGFfc3RhcnRbNF07CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgY2hhcglvX3RvY1s0XTsJLyogYWRkcmVzcyBvZiBUT0MgKi8KKyAgdW5zaWduZWQgY2hhcglvX3NuZW50cnlbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIGVudHJ5IHBvaW50ICovCisgIHVuc2lnbmVkIGNoYXIJb19zbnRleHRbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC50ZXh0IHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglvX3NuZGF0YVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmRhdGEgc2VjdGlvbiAqLworICB1bnNpZ25lZCBjaGFyCW9fc250b2NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIFRPQyAqLworICB1bnNpZ25lZCBjaGFyCW9fc25sb2FkZXJbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5sb2FkZXIgc2VjdGlvbiAqLworICB1bnNpZ25lZCBjaGFyCW9fc25ic3NbMl07CS8qIHNlY3Rpb24gbnVtYmVyIG9mIC5ic3Mgc2VjdGlvbiAqLworICB1bnNpZ25lZCBjaGFyCW9fYWxnbnRleHRbMl07CS8qIC50ZXh0IGFsaWdubWVudCAqLworICB1bnNpZ25lZCBjaGFyCW9fYWxnbmRhdGFbMl07CS8qIC5kYXRhIGFsaWdubWVudCAqLworICB1bnNpZ25lZCBjaGFyCW9fbW9kdHlwZVsyXTsJLyogbW9kdWxlIHR5cGUgKD8/KSAqLworICB1bnNpZ25lZCBjaGFyIG9fY3B1dHlwZVsyXTsJLyogY3B1IHR5cGUgKi8KKyAgdW5zaWduZWQgY2hhcglvX21heHN0YWNrWzRdOwkvKiBtYXggc3RhY2sgc2l6ZSAoPz8pICovCisgIHVuc2lnbmVkIGNoYXIgb19tYXhkYXRhWzRdOwkvKiBtYXggZGF0YSBzaXplICg/PykgKi8KKyAgdW5zaWduZWQgY2hhcglvX3Jlc3YyWzEyXTsJLyogcmVzZXJ2ZWQgKi8KK30KK0FPVVRIRFI7CisKKyNkZWZpbmUgQU9VVFNaIDcyCisjZGVmaW5lIFNNQUxMX0FPVVRTWiAoMjgpCisjZGVmaW5lIEFPVVRIRFJTWiA3MgorCisjZGVmaW5lCVJTNktfQU9VVEhEUl9PTUFHSUMJMHgwMTA3CS8qIG9sZDogdGV4dCAmIGRhdGEgd3JpdGVhYmxlICovCisjZGVmaW5lCVJTNktfQU9VVEhEUl9OTUFHSUMJMHgwMTA4CS8qIG5ldzogdGV4dCByL28sIGRhdGEgci93ICovCisjZGVmaW5lCVJTNktfQU9VVEhEUl9aTUFHSUMJMHgwMTBCCS8qIHBhZ2VkOiB0ZXh0IHIvbywgYm90aCBwYWdlLWFsaWduZWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cnVjdCBleHRlcm5hbF9zY25oZHIgeworCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KKwljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KKwljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCisJY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisJY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KKwljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCisJY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KK307CisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKyNkZWZpbmUgX1BBRAkiLnBhZCIKKyNkZWZpbmUgX0xPQURFUgkiLmxvYWRlciIKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworLyogWENPRkYgdXNlcyBhIHNwZWNpYWwgLmxvYWRlciBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0xPQURFUi4gICovCisjZGVmaW5lIFNUWVBfTE9BREVSIDB4MTAwMAorCisvKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAuZGVidWcgc2VjdGlvbiB3aXRoIHR5cGUgU1RZUF9ERUJVRy4gICovCisjZGVmaW5lIFNUWVBfREVCVUcgMHgyMDAwCisKKy8qIFhDT0ZGIGhhbmRsZXMgbGluZSBudW1iZXIgb3IgcmVsb2NhdGlvbiBvdmVyZmxvdyBieSBjcmVhdGluZworICAgYW5vdGhlciBzZWN0aW9uIGhlYWRlciB3aXRoIFNUWVBfT1ZSRkxPIHNldC4gICovCisjZGVmaW5lIFNUWVBfT1ZSRkxPIDB4ODAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk2CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciB4X3Njbmxlbls0XTsKKwkJdW5zaWduZWQgY2hhciB4X3Bhcm1oYXNoWzRdOworCQl1bnNpZ25lZCBjaGFyIHhfc25oYXNoWzJdOworCQl1bnNpZ25lZCBjaGFyIHhfc210eXBbMV07CisJCXVuc2lnbmVkIGNoYXIgeF9zbWNsYXNbMV07CisJCXVuc2lnbmVkIGNoYXIgeF9zdGFiWzRdOworCQl1bnNpZ25lZCBjaGFyIHhfc25zdGFiWzJdOworCX0geF9jc2VjdDsKKworfTsKKworI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAorI2RlZmluZQlTWU1FU1oJMTgJCisjZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKKyNkZWZpbmUJQVVYRVNaCTE4CisjZGVmaW5lIERCWE1BU0sgMHg4MAkJLyogZm9yIGRieCBzdG9yYWdlIG1hc2sgKi8KKyNkZWZpbmUgU1lNTkFNRV9JTl9ERUJVRyhzeW1wdHIpICgoc3ltcHRyKS0+bl9zY2xhc3MgJiBEQlhNQVNLKQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfc2l6ZVsxXTsKKyAgY2hhciByX3R5cGVbMV07Cit9OworCisKKyNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCisjZGVmaW5lIFJFTFNaIDEwCisKKyNkZWZpbmUgREVGQVVMVF9EQVRBX1NFQ1RJT05fQUxJR05NRU5UIDQKKyNkZWZpbmUgREVGQVVMVF9CU1NfU0VDVElPTl9BTElHTk1FTlQgNAorI2RlZmluZSBERUZBVUxUX1RFWFRfU0VDVElPTl9BTElHTk1FTlQgNAorLyogRm9yIG5ldyBzZWN0aW9ucyB3ZSBoYXZuJ3QgaGVhcmQgb2YgYmVmb3JlICovCisjZGVmaW5lIERFRkFVTFRfU0VDVElPTl9BTElHTk1FTlQgNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3NoLmggYi9pbmNsdWRlL2NvZmYvc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk1N2RmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL3NoLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBTSCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworCisKKyNkZWZpbmUJU0hfQVJDSF9NQUdJQ19CSUcJMHgwNTAwCisjZGVmaW5lCVNIX0FSQ0hfTUFHSUNfTElUVExFCTB4MDU1MCAgLyogTGl0dGxlIGVuZGlhbiBTSCAqLworCisKKyNkZWZpbmUgU0hCQURNQUcoeCkgXAorICgoKHgpLmZfbWFnaWMhPVNIX0FSQ0hfTUFHSUNfQklHKSAmJiBcCisgICgoeCkuZl9tYWdpYyE9U0hfQVJDSF9NQUdJQ19MSVRUTEUpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworfQorQU9VVEhEUjsKKworCisjZGVmaW5lIEFPVVRIRFJTWiAyOAorI2RlZmluZSBBT1VUU1ogMjgKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk4CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCisgICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQorICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfb2Zmc2V0WzRdOworICBjaGFyIHJfdHlwZVsyXTsKKyAgY2hhciByX3N0dWZmWzJdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxNgorCisvKiBTSCByZWxvY2F0aW9uIHR5cGVzLiAgTm90IGFsbCBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgdXNlZC4gICovCisKKyNkZWZpbmUgUl9TSF9VTlVTRUQJMAkJLyogb25seSB1c2VkIGludGVybmFsbHkgKi8KKyNkZWZpbmUgUl9TSF9QQ1JFTDggCTMJCS8qICA4IGJpdCBwY3JlbCAJKi8KKyNkZWZpbmUgUl9TSF9QQ1JFTDE2IAk0CQkvKiAxNiBiaXQgcGNyZWwgCSovCisjZGVmaW5lIFJfU0hfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLworI2RlZmluZSBSX1NIX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCisjZGVmaW5lIFJfU0hfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLworI2RlZmluZSBSX1NIX1BDRElTUDhCWTQJOSAgCQkvKiBQQyByZWwgOCBiaXRzICo0ICt2ZSAqLworI2RlZmluZSBSX1NIX1BDRElTUDhCWTIJMTAgIAkJLyogUEMgcmVsIDggYml0cyAqMiArdmUgKi8KKyNkZWZpbmUgUl9TSF9QQ0RJU1A4ICAgIDExICAJCS8qIDggYml0IGJyYW5jaCAqLworI2RlZmluZSBSX1NIX1BDRElTUCAgICAgMTIgIAkJLyogMTIgYml0IGJyYW5jaCAqLworI2RlZmluZSBSX1NIX0lNTTMyICAgICAgMTQgICAgCQkvKiAzMiBiaXQgaW1tZWRpYXRlICovCisjZGVmaW5lIFJfU0hfSU1NOCAgIAkxNgkJLyogOCBiaXQgaW1tZWRpYXRlICovCisjZGVmaW5lIFJfU0hfSU1NOEJZMiAgICAxNwkJLyogOCBiaXQgaW1tZWRpYXRlICoyICovCisjZGVmaW5lIFJfU0hfSU1NOEJZNCAgICAxOAkJLyogOCBiaXQgaW1tZWRpYXRlICo0ICovCisjZGVmaW5lIFJfU0hfSU1NNCAgIAkxOQkJLyogNCBiaXQgaW1tZWRpYXRlICovCisjZGVmaW5lIFJfU0hfSU1NNEJZMiAgICAyMAkJLyogNCBiaXQgaW1tZWRpYXRlICoyICovCisjZGVmaW5lIFJfU0hfSU1NNEJZNCAgICAyMQkJLyogNCBiaXQgaW1tZWRpYXRlICo0ICovCisjZGVmaW5lIFJfU0hfUENSRUxJTU04QlkyICAgMjIJCS8qIFBDIHJlbCA4IGJpdHMgKjIgdW5zaWduZWQgKi8KKyNkZWZpbmUgUl9TSF9QQ1JFTElNTThCWTQgICAyMwkJLyogUEMgcmVsIDggYml0cyAqNCB1bnNpZ25lZCAqLworI2RlZmluZSBSX1NIX0lNTTE2ICAgICAgMjQgICAgCQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCisKKy8qIFRoZSBzd2l0Y2ggdGFibGUgcmVsb2MgdHlwZXMgYXJlIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhleSBhcmUKKyAgIGdlbmVyYXRlZCBmb3IgZXhwcmVzc2lvbnMgc3VjaCBhcworICAgICAud29yZCBMMSAtIEwyCisgICBUaGUgcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcworICAgYW5kIEwyLiAgKi8KKyNkZWZpbmUgUl9TSF9TV0lUQ0g4CTMzCQkvKiA4IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgUl9TSF9TV0lUQ0gxNgkyNQkJLyogMTYgYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBSX1NIX1NXSVRDSDMyCTI2CQkvKiAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCisKKy8qIFRoZSBVU0VTIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgY29tcGlsZXIgd2lsbAorICAgZ2VuZXJhdGUgLnVzZXMgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBpdAorICAgY2FuIHJlbGF4LiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBVU0VTIHJlbG9jIGhvbGRzIHRoZSBQQworICAgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbgorICAgdGhlIGZ1bmN0aW9uIGNhbGwuICAqLworI2RlZmluZSBSX1NIX1VTRVMJMjcJCS8qIC51c2VzIHBzZXVkby1vcCAqLworCisvKiBUaGUgQ09VTlQgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSBhc3NlbWJsZXIgd2lsbAorICAgZ2VuZXJhdGUgQ09VTlQgcmVsb2NzIGZvciBhZGRyZXNzZXMgcmVmZXJyZWQgdG8gYnkgdGhlIHJlZ2lzdGVyCisgICBsb2FkcyBhc3NvY2lhdGVkIHdpdGggVVNFUyByZWxvY3MuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIENPVU5UCisgICByZWxvYyBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCisgICBvYmplY3QgZmlsZS4gICovCisjZGVmaW5lIFJfU0hfQ09VTlQJMjgJCS8qIENvdW50IG9mIGNvbnN0YW50IHBvb2wgdXNlcyAqLworCisvKiBUaGUgQUxJR04gcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSByX29mZnNldCBmaWVsZCBpcworICAgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZQorICAgbXVzdCBiZSBhbGlnbmVkLiAgKi8KKyNkZWZpbmUgUl9TSF9BTElHTgkyOQkJLyogLmFsaWduIHBzZXVkby1vcCAqLworCisvKiBUaGUgQ09ERSBhbmQgREFUQSByZWxvYyB0eXBlcyBhcmUgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKKyAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIENPREUgcmVsb2MgYmVmb3JlIGEKKyAgIGJsb2NrIG9mIGluc3RydWN0aW9ucy4gIEl0IHdpbGwgZ2VuZXJhdGUgYSBEQVRBIHJlbG9jIGJlZm9yZSBkYXRhLgorICAgQSBzZWN0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgYXNzdW1pbmcgaXQgY29udGFpbnMgZGF0YSwgdW5sZXNzIGEKKyAgIENPREUgcmVsb2MgaXMgc2Vlbi4gIFRoZSBvbmx5IHJlbGV2YW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgIENPREUgYW5kIERBVEEgcmVsb2NzIGFyZSB0aGUgc2VjdGlvbiBhbmQgdGhlIGFkZHJlc3MuICBUaGUgc3ltYm9sCisgICBhbmQgb2Zmc2V0IGFyZSBtZWFuaW5nbGVzcy4gICovCisjZGVmaW5lIFJfU0hfQ09ERQkzMAkJLyogc3RhcnQgb2YgY29kZSAqLworI2RlZmluZSBSX1NIX0RBVEEJMzEJCS8qIHN0YXJ0IG9mIGRhdGEgKi8KKworLyogVGhlIExBQkVMIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKKyAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIExBQkVMIHJlbG9jIGZvciBlYWNoCisgICBsYWJlbCB3aXRoaW4gYSBibG9jayBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bworICAgYXZvaWQgc3dhcHBpbmcgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSB0aGUgdGFyZ2V0cyBvZiBicmFuY2hlcy4gICovCisjZGVmaW5lIFJfU0hfTEFCRUwJMzIJCS8qIGxhYmVsICovCisKKy8qIE5COiBSX1NIX1NXSVRDSDggaXMgMzMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zcGFyYy5oIGIvaW5jbHVkZS9jb2ZmL3NwYXJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhMjRmMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi9zcGFyYy5oCkBAIC0wLDAgKzEsMjEwIEBACisvKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFNwYXJjLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIGFuIGFtYWxnYW1hdGlvbiBvZiBzZXZlcmFsIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgdGhhdAorICAgZGVmaW5lIGNvZmYgZm9ybWF0LCBzdWNoIGFzIGZpbGVoZHIuaCwgYW91dGhkci5oLCBhbmQgc28gZm9ydGguICBJbgorICAgYWRkaXRpb24sIGFsbCBkYXRhdHlwZXMgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgaW50byBjaGFyYWN0ZXIgYXJyYXlzIG9mCisgICAocHJlc3VtZWQpIGVxdWl2YWxlbnQgc2l6ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgdGhpcyBmaWxlIGNhbgorICAgYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzeXN0ZW1zIHdoaWxlIHN0aWxsIHlpZWxkaW5nIHRoZSBzYW1lIHJlc3VsdHMuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgoreworICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLworICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisgIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKyAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKyAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisgIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKyAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLworfTsKKworI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQkvKiByZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgKi8KKyNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQkvKiBmaWxlIGlzIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQkvKiBsaW5lIG51bWJlcnMgc3RyaXBwZWQgKi8KKyNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkJLyogbG9jYWwgc3ltYm9scyBzdHJpcHBlZCAqLworCisjZGVmaW5lIFNQQVJDTUFHSUMJKDA1NDApCisKKy8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLworCisjZGVmaW5lIExZTlhDT0ZGTUFHSUMJKDA0MTUpCisKKyNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCisjZGVmaW5lCUZJTEhTWgkyMAorCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IAoreworICBjaGFyIG1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIgdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIgdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhciBkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhciBic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhciBlbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIHRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIGNoYXIgZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KK30KK0FPVVRIRFI7CisKKyNkZWZpbmUgQU9VVFNaIDI4CisjZGVmaW5lIEFPVVRIRFJTWiAyOAorCisjZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCisjZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLworI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLworI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCit7CisgIGNoYXIgc19uYW1lWzhdOwkJLyogc2VjdGlvbiBuYW1lCQkJKi8KKyAgY2hhciBzX3BhZGRyWzRdOwkJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKyAgY2hhciBzX3ZhZGRyWzRdOwkJLyogdmlydHVhbCBhZGRyZXNzCQkqLworICBjaGFyIHNfc2l6ZVs0XTsJCS8qIHNlY3Rpb24gc2l6ZQkJCSovCisgIGNoYXIgc19zY25wdHJbNF07CQkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworICBjaGFyIHNfcmVscHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworICBjaGFyIHNfbG5ub3B0cls0XTsJCS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworICBjaGFyIHNfbnJlbG9jWzJdOwkJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworICBjaGFyIHNfbmxubm9bMl07CQkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisgIGNoYXIgc19mbGFnc1s0XTsJCS8qIGZsYWdzCQkJKi8KK307CisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTQwCisKKy8qIE5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucy4gKi8KKworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKyNkZWZpbmUgX1RWCSIudHYiCisjZGVmaW5lIF9JTklUCSIuaW5pdCIKKyNkZWZpbmUgX0ZJTkkJIi5maW5pIgorI2RlZmluZSBfQ09NTUVOVCAiLmNvbW1lbnQiCisjZGVmaW5lIF9MSUIgIi5saWIiCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAgIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICAgZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAgIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gKi8KKworc3RydWN0IGV4dGVybmFsX2xpbmVubworeworICB1bmlvbiB7CisgICAgY2hhciBsX3N5bW5keFs0XTsJCS8qIGZuIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KKyAgICBjaGFyIGxfcGFkZHJbNF07CQkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIgKi8KKyAgfSBsX2FkZHI7CisgIGNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIgKi8KK307CisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KKyNkZWZpbmUJTElORVNaCSg2KQorCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRV9TWU1OTUxFTgkoOCkJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgRV9GSUxOTUxFTgkoMTQpCS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JKDQpCS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworc3RydWN0IGV4dGVybmFsX3N5bWVudCAKK3sKKyAgdW5pb24geworICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIGVfemVyb2VzWzRdOworICAgICAgY2hhciBlX29mZnNldFs0XTsKKyAgICB9IGU7CisjaWYgMCAvKiBvZiBkb3VidGZ1bCB2YWx1ZSAqLworICAgIGNoYXIgZV9ucHRyWzJdWzRdOworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIGVfbGVhZGluZ196ZXJvWzFdOworICAgICAgY2hhciBlX2RieF90eXBlWzFdOworICAgICAgY2hhciBlX2RieF9kZXNjWzJdOworICAgIH0gZV9kYng7CisjZW5kaWYKKyAgfSBlOworCisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKKyAgY2hhciBwYWRkaW5nWzJdOworfTsKKworI2RlZmluZSBOX0JUTUFTSwkoMHhmKQorI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKKyNkZWZpbmUgTl9CVFNIRlQJKDQpCisjZGVmaW5lIE5fVFNISUZUCSgyKQorICAKK3VuaW9uIGV4dGVybmFsX2F1eGVudAoreworICBzdHJ1Y3QgeworICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisgICAgdW5pb24geworICAgICAgc3RydWN0IHsKKwljaGFyICB4X2xubm9bMl07CS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJY2hhciAgeF9zaXplWzJdOwkvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworICAgICAgfSB4X2xuc3o7CisgICAgICBjaGFyIHhfZnNpemVbNF07CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCisgICAgfSB4X21pc2M7CisgICAgdW5pb24geworICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKwljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKyAgICAgIH0geF9mY247CisgICAgICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKKyAgICAgIH0geF9hcnk7CisgICAgfSB4X2ZjbmFyeTsKKyAgICBjaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLworICB9IHhfc3ltOworICAKKyAgdW5pb24geworICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciB4X3plcm9lc1s0XTsKKyAgICAgIGNoYXIgeF9vZmZzZXRbNF07CisgICAgfSB4X247CisgIH0geF9maWxlOworICAKKyAgc3RydWN0IHsKKyAgICBjaGFyIHhfc2NubGVuWzRdOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KKyAgICBjaGFyIHhfbnJlbG9jWzJdOwkJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KKyAgICBjaGFyIHhfbmxpbm5vWzJdOwkJLyogIyBsaW5lIG51bWJlcnMgKi8KKyAgfSB4X3NjbjsKKyAgCisgIHN0cnVjdCB7CisgICAgY2hhciB4X3R2ZmlsbFs0XTsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KKyAgICBjaGFyIHhfdHZsZW5bMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCisgICAgY2hhciB4X3R2cmFuWzJdWzJdOwkJLyogdHYgcmFuZ2UgKi8KKyAgfSB4X3R2OwkJCS8qIC50diBzZWN0aW9uIGluZm8gKGluIGF1eGVudCBvZiBzeW0gLnR2KSkgKi8KKworICBjaGFyIHhfZmlsbFsyMF07CQkvKiBmb3JjZXMgdG8gMjAtYnl0ZSBzaXplICovCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkyMAkKKyNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAorI2RlZmluZQlBVVhFU1oJMjAKKworI2RlZmluZSBfRVRFWFQJImV0ZXh0IgorCisvKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfdHlwZVsyXTsKKyAgY2hhciByX3NwYXJlWzJdOworICBjaGFyIHJfb2Zmc2V0WzRdOworfTsKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bS5oIGIvaW5jbHVkZS9jb2ZmL3N5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjA0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvc3ltLmgKQEAgLTAsMCArMSw0ODQgQEAKKy8qIERlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBmb3JtYXQgb2YgTUlQUyBFQ09GRiBzeW1ib2xzLgorICAgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBNSVBTIENvbXB1dGVyIFN5c3RlbXMgYW5kIFRoaXJkIEV5ZSBTb2Z0d2FyZS4KKyAgIENoYW5nZXMgY29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgCisKKyAgIFRoaXMgZmlsZSBpcyBqdXN0IGFnZ3JlZ2F0ZWQgd2l0aCB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBHTlUKKyAgIHJlbGVhc2U7IGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgR0FTLCBHREIsIG9yIG90aGVyIEdOVQorICAgcHJvZ3JhbXMuICAqLworCisvKgorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEsIDE5OTAgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMufAorICogfCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlICAgfAorICogfCByaWdodHMgdG8gYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzICAgICAgfAorICogfCBtYWludGFpbmVkIGluIHRoZSBjb3B5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICovCisjaWZuZGVmIF9TWU1fSAorI2RlZmluZSBfU1lNX0gKKworLyogKEMpIENvcHlyaWdodCAxOTg0IGJ5IFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXJkIEV5ZSBTb2Z0d2FyZSwgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgcmlnaHRzIHRvCisgKiBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgY29weS4KKyAqCisgKiBUaGlyZCBFeWUgbWFrZXMgbm8gY2xhaW1zIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIHRoaXMKKyAqIHN5bWJvbCB0YWJsZSB0byBhIHBhcnRpY3VsYXIgdXNlLgorICovCisKKy8qIAorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBUaGlyZCBFeWUgU3ltYm9sIFRhYmxlLgorICoKKyAqIFN5bWJvbHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gJ2VuY291bnRlciBvcmRlcicgLSBpLmUuIHRoZSBvcmRlciB0aGF0CisgKiB0aGUgdGhpbmdzIHRoZXkgcmVwcmVzZW50IHdlcmUgZW5jb3VudGVyZWQgYnkgdGhlIGNvbXBpbGVyL2Fzc2VtYmxlci9sb2FkZXIuCisgKiBFWENFUFQgZm9yIGdsb2JhbHMhCVRoZXNlIGFyZSBhc3N1bWVkIHRvIGJlIGJ1bmNoZWQgdG9nZXRoZXIsCisgKiBwcm9iYWJseSByaWdodCBhZnRlciB0aGUgbGFzdCAnbm9ybWFsJyBzeW1ib2wuICBHbG9iYWxzIEFSRSBzb3J0ZWQKKyAqIGluIGFzY2VuZGluZyBvcmRlci4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQSBicmllZiB3b3JkIGFib3V0IFRoaXJkIEV5ZSBuYW1pbmcvdXNlIGNvbnZlbnRpb25zOgorICoKKyAqIEFsbCBhcnJheXMgYW5kIGluZGV4J3MgYXJlIDAgYmFzZWQuCisgKiBBbGwgImlmb29NYXgiIHZhbHVlcyBhcmUgdGhlIGhpZ2hlc3QgbGVnYWwgdmFsdWUgUExVUyBPTkUuIFRoaXMgbWFrZXMKKyAqIHRoZW0gZ29vZCBmb3IgYWxsb2NhdGluZyBhcnJheXMsIGV0Yy4gQWxsIGNoZWNrcyBhcmUgImlmb28gPCBpZm9vTWF4Ii4KKyAqCisgKiAiaXN5bSIJSW5kZXggaW50byB0aGUgU1lNYm9sIHRhYmxlLgorICogImlwZCIJSW5kZXggaW50byB0aGUgUHJvY2VkdXJlIERlc2NyaXB0b3IgYXJyYXkuCisgKiAiaWZkIglJbmRleCBpbnRvIHRoZSBGaWxlIERlc2NyaXB0b3IgYXJyYXkuCisgKiAiaXNzIglJbmRleCBpbnRvIFN0cmluZyBTcGFjZS4KKyAqICJjYiIJCUNvdW50IG9mIEJ5dGVzLgorICogInJnUGQiCWFycmF5IHdob3NlIGRvbWFpbiBpcyAiMC4uaXBkTWF4LTEiIGFuZCBSYW5HZSBpcyBQRFIuCisgKiAicmdGZCIJYXJyYXkgd2hvc2UgZG9tYWluIGlzICIwLi5pZmRNYXgtMSIgYW5kIFJhbkdlIGlzIEZEUi4KKyAqLworCisKKy8qIAorICogU3ltYm9saWMgSGVhZGVyIChIRFIpIHN0cnVjdHVyZS4KKyAqIEFzIGxvbmcgYXMgYWxsIHRoZSBwb2ludGVycyBhcmUgc2V0IGNvcnJlY3RseSwKKyAqIHdlIGRvbid0IGNhcmUgV0hBVCBvcmRlciB0aGUgdmFyaW91cyBzZWN0aW9ucyBjb21lIG91dCBpbiEKKyAqCisgKiBBIGZpbGUgcHJvZHVjZWQgc29sZWx5IGZvciB0aGUgdXNlIG9mIENEQiB3aWxsIHByb2JhYmx5IE5PVCBoYXZlCisgKiBhbnkgaW5zdHJ1Y3Rpb25zIG9yIGRhdGEgYXJlYXMgaW4gaXQsIGFzIHRoZXNlIGFyZSBhdmFpbGFibGUKKyAqIGluIHRoZSBvcmlnaW5hbC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJc2hvcnQJbWFnaWM7CQkvKiB0byB2ZXJpZnkgdmFsaWRpdHkgb2YgdGhlIHRhYmxlICovCisJc2hvcnQJdnN0YW1wOwkJLyogdmVyc2lvbiBzdGFtcCAqLworCWxvbmcJaWxpbmVNYXg7CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzICovCisJYmZkX3ZtYQljYkxpbmU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9yIGxpbmUgbnVtYmVyIGVudHJpZXMgKi8KKwliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWxvbmcJaWRuTWF4OwkJLyogbWF4IGluZGV4IGludG8gZGVuc2UgbnVtYmVyIHRhYmxlICovCisJYmZkX3ZtYQljYkRuT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgZGVuc2UgbnVtYmVyIHRhYmxlICovCisJbG9uZwlpcGRNYXg7CQkvKiBudW1iZXIgb2YgcHJvY2VkdXJlcyAqLworCWJmZF92bWEJY2JQZE9mZnNldDsJLyogb2Zmc2V0IHRvIHByb2NlZHVyZSBkZXNjcmlwdG9yIHRhYmxlICovCisJbG9uZwlpc3ltTWF4OwkvKiBudW1iZXIgb2YgbG9jYWwgc3ltYm9scyAqLworCWJmZF92bWEJY2JTeW1PZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsb2NhbCBzeW1ib2xzKi8KKwlsb25nCWlvcHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyAqLworCWJmZF92bWEJY2JPcHRPZmZzZXQ7CS8qIG9mZnNldCB0byBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMgKi8KKwlsb25nCWlhdXhNYXg7CS8qIG51bWJlciBvZiBhdXhpbGxhcnkgc3ltYm9sIGVudHJpZXMgKi8KKwliZmRfdm1hCWNiQXV4T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYXV4aWxsYXJ5IHN5bWJvbCBlbnRyaWVzKi8KKwlsb25nCWlzc01heDsJCS8qIG1heCBpbmRleCBpbnRvIGxvY2FsIHN0cmluZ3MgKi8KKwliZmRfdm1hCWNiU3NPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBsb2NhbCBzdHJpbmdzICovCisJbG9uZwlpc3NFeHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIGV4dGVybmFsIHN0cmluZ3MgKi8KKwliZmRfdm1hCWNiU3NFeHRPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBleHRlcm5hbCBzdHJpbmdzICovCisJbG9uZwlpZmRNYXg7CQkvKiBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KKwliZmRfdm1hCWNiRmRPZmZzZXQ7CS8qIG9mZnNldCB0byBmaWxlIGRlc2NyaXB0b3IgdGFibGUgKi8KKwlsb25nCWNyZmQ7CQkvKiBudW1iZXIgb2YgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KKwliZmRfdm1hCWNiUmZkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlICovCisJbG9uZwlpZXh0TWF4OwkvKiBtYXggaW5kZXggaW50byBleHRlcm5hbCBzeW1ib2xzICovCisJYmZkX3ZtYQljYkV4dE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGV4dGVybmFsIHN5bWJvbCBlbnRyaWVzKi8KKwkvKiBJZiB5b3UgYWRkIG1hY2hpbmUgZGVwZW5kZW50IGZpZWxkcywgYWRkIHRoZW0gaGVyZSAqLworCX0gSERSUiwgKnBIRFJSOyAKKyNkZWZpbmUgY2JIRFJSIHNpemVvZihIRFJSKQorI2RlZmluZSBoZHJOaWwgKChwSERSUikwKQorCisvKgorICogVGhlIEZEUiBhbmQgUERSIHN0cnVjdHVyZXMgc3BlZWQgbWFwcGluZyBvZiBhZGRyZXNzIDwtPiBuYW1lLgorICogVGhleSBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBtZW1vcnkgb3JkZXIgYW5kIGFyZSBrZXB0IGluCisgKiBtZW1vcnkgYnkgQ0RCIGF0IHJ1bnRpbWUuCisgKi8KKworLyogCisgKiBGaWxlIERlc2NyaXB0b3IKKyAqCisgKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIEVWRVJZIEZJTEUsIHdoZXRoZXIgY29tcGlsZWQgd2l0aAorICogZnVsbCBkZWJ1Z2dpbmcgc3ltYm9scyBvciBub3QuICBUaGUgbmFtZSBvZiBhIGZpbGUgc2hvdWxkIGJlCisgKiB0aGUgcGF0aCBuYW1lIGdpdmVuIHRvIHRoZSBjb21waWxlci4JIFRoaXMgYWxsb3dzIHRoZSB1c2VyCisgKiB0byBzaW1wbHkgc3BlY2lmeSB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHRoZSBDT01QSUxFUworICogd2VyZSBkb25lLCBhbmQgd2Ugd2lsbCBiZSBhYmxlIHRvIGZpbmQgdGhlaXIgZmlsZXMuCisgKiBBIGZpZWxkIHdob3NlIGNvbW1lbnQgc3RhcnRzIHdpdGggIlIgLSAiIGluZGljYXRlcyB0aGF0IGl0IHdpbGwgYmUKKyAqIHNldHVwIGF0IHJ1bnRpbWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZkciB7CisJYmZkX3ZtYQlhZHI7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgZmlsZSAqLworCWxvbmcJcnNzOwkJLyogZmlsZSBuYW1lIChvZiBzb3VyY2UsIGlmIGtub3duKSAqLworCWxvbmcJaXNzQmFzZTsJLyogZmlsZSdzIHN0cmluZyBzcGFjZSAqLworCWJmZF92bWEJY2JTczsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3MgKi8KKwlsb25nCWlzeW1CYXNlOwkvKiBiZWdpbm5pbmcgb2Ygc3ltYm9scyAqLworCWxvbmcJY3N5bTsJCS8qIGNvdW50IGZpbGUncyBvZiBzeW1ib2xzICovCisJbG9uZwlpbGluZUJhc2U7CS8qIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KKwlsb25nCWNsaW5lOwkJLyogY291bnQgb2YgZmlsZSdzIGxpbmUgc3ltYm9scyAqLworCWxvbmcJaW9wdEJhc2U7CS8qIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLworCWxvbmcJY29wdDsJCS8qIGNvdW50IG9mIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLworCXVuc2lnbmVkIHNob3J0IGlwZEZpcnN0Oy8qIHN0YXJ0IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLworCXNob3J0CWNwZDsJCS8qIGNvdW50IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLworCWxvbmcJaWF1eEJhc2U7CS8qIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLworCWxvbmcJY2F1eDsJCS8qIGNvdW50IG9mIGZpbGUncyBhdXhpbGlhcnkgZW50cmllcyAqLworCWxvbmcJcmZkQmFzZTsJLyogaW5kZXggaW50byB0aGUgZmlsZSBpbmRpcmVjdCB0YWJsZSAqLworCWxvbmcJY3JmZDsJCS8qIGNvdW50IGZpbGUgaW5kaXJlY3QgZW50cmllcyAqLworCXVuc2lnbmVkIGxhbmc6IDU7CS8qIGxhbmd1YWdlIGZvciB0aGlzIGZpbGUgKi8KKwl1bnNpZ25lZCBmTWVyZ2UgOiAxOwkvKiB3aGV0aGVyIHRoaXMgZmlsZSBjYW4gYmUgbWVyZ2VkICovCisJdW5zaWduZWQgZlJlYWRpbiA6IDE7CS8qIHRydWUgaWYgaXQgd2FzIHJlYWQgaW4gKG5vdCBqdXN0IGNyZWF0ZWQpICovCisJdW5zaWduZWQgZkJpZ2VuZGlhbiA6IDE7LyogaWYgc2V0LCB3YXMgY29tcGlsZWQgb24gYmlnIGVuZGlhbiBtYWNoaW5lICovCisJCQkJLyoJYXV4J3Mgd2lsbCBiZSBpbiBjb21waWxlIGhvc3QncyBzZXggKi8KKwl1bnNpZ25lZCBnbGV2ZWwgOiAyOwkvKiBsZXZlbCB0aGlzIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGggKi8KKwl1bnNpZ25lZCByZXNlcnZlZCA6IDIyOyAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwliZmRfdm1hCWNiTGluZU9mZnNldDsJLyogYnl0ZSBvZmZzZXQgZnJvbSBoZWFkZXIgZm9yIHRoaXMgZmlsZSBsbidzICovCisJYmZkX3ZtYQljYkxpbmU7CQkvKiBzaXplIG9mIGxpbmVzIGZvciB0aGlzIGZpbGUgKi8KKwl9IEZEUiwgKnBGRFI7CisjZGVmaW5lIGNiRkRSIHNpemVvZihGRFIpCisjZGVmaW5lIGZkTmlsICgocEZEUikwKQorI2RlZmluZSBpZmROaWwgLTEKKyNkZWZpbmUgaWZkVGVtcCAwCisjZGVmaW5lIGlsbk5pbCAtMQorCisKKy8qIAorICogUHJvY2VkdXJlIERlc2NyaXB0b3IKKyAqCisgKiBUaGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIEVWRVJZIFRFWFQgTEFCRUwuCisgKiBJZiBhIHByb2NlZHVyZSBpcyBpbiBhIGZpbGUgd2l0aCBmdWxsIHN5bWJvbHMsIHRoZW4gaXN5bQorICogd2lsbCBwb2ludCB0byB0aGUgUFJPQyBzeW1ib2xzLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlCisgKiBnbG9iYWwgc3ltYm9sIGZvciB0aGUgbGFiZWwuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgcGRyIHsKKwliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLworCWxvbmcJaXN5bTsJCS8qIHN0YXJ0IG9mIGxvY2FsIHN5bWJvbCBlbnRyaWVzICovCisJbG9uZwlpbGluZTsJCS8qIHN0YXJ0IG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCisJbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCisJbG9uZwlpb3B0OwkJLyogc3RhcnQgb2Ygb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzKi8KKwlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KKwlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCisJbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLworCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCisJc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLworCWxvbmcJbG5Mb3c7CQkvKiBsb3dlc3QgbGluZSBpbiB0aGUgcHJvY2VkdXJlICovCisJbG9uZwlsbkhpZ2g7CQkvKiBoaWdoZXN0IGxpbmUgaW4gdGhlIHByb2NlZHVyZSAqLworCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmb3IgdGhpcyBwcm9jZWR1cmUgZnJvbSB0aGUgZmQgYmFzZSAqLworCS8qIFRoZXNlIGZpZWxkcyBhcmUgbmV3IGZvciA2NCBiaXQgRUNPRkYuICAqLworCXVuc2lnbmVkIGdwX3Byb2xvZ3VlIDogODsgLyogYnl0ZSBzaXplIG9mIEdQIHByb2xvZ3VlICovCisJdW5zaWduZWQgZ3BfdXNlZCA6IDE7CS8qIHRydWUgaWYgdGhlIHByb2NlZHVyZSB1c2VzIEdQICovCisJdW5zaWduZWQgcmVnX2ZyYW1lIDogMTsJLyogdHJ1ZSBpZiByZWdpc3RlciBmcmFtZSBwcm9jZWR1cmUgKi8KKwl1bnNpZ25lZCBwcm9mIDogMTsJLyogdHJ1ZSBpZiBjb21waWxlZCB3aXRoIC1wZyAqLworCXVuc2lnbmVkIHJlc2VydmVkIDogMTM7CS8qIHJlc2VydmVkOiBtdXN0IGJlIHplcm8gKi8KKwl1bnNpZ25lZCBsb2NhbG9mZiA6IDg7CS8qIG9mZnNldCBvZiBsb2NhbCB2YXJpYWJsZXMgZnJvbSB2ZnAgKi8KKwl9IFBEUiwgKnBQRFI7CisjZGVmaW5lIGNiUERSIHNpemVvZihQRFIpCisjZGVmaW5lIHBkTmlsICgocFBEUikgMCkKKyNkZWZpbmUgaXBkTmlsCS0xCisKKy8qCisgKiBUaGUgc3RydWN0dXJlIG9mIHRoZSBydW50aW1lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgdGhlIGxvYWRlcgorICogZm9yIHVzZSBieSB0aGUgc3RhdGljIGV4Y2VwdGlvbiBzeXN0ZW0uCisgKi8KKy8qCisgKiBJZiAwJ2Qgb3V0IGJlY2F1c2UgZXhjZXB0aW9uX2luZm8gY2hva2VzIFZpc3VhbCBDKysgYW5kIGJlY2F1c2UgdGhlcmUKKyAqIGRvbid0IHNlZW0gdG8gYmUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBzdHJ1Y3R1cmUgZWxzZXdoZXJlIGluIGdkYi4KKyAqLworI2lmIDAKK3R5cGVkZWYgc3RydWN0IHJ1bnRpbWVfcGRyIHsKKwliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLworCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCisJbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCisJbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCisJbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLworCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KKwlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLworCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KKwlsb25nCWlycHNzOwkJLyogaW5kZXggaW50byB0aGUgcnVudGltZSBzdHJpbmcgdGFibGUgKi8KKwlsb25nCXJlc2VydmVkOworCXN0cnVjdCBleGNlcHRpb25faW5mbyAqZXhjZXB0aW9uX2luZm87LyogcG9pbnRlciB0byBleGNlcHRpb24gYXJyYXkgKi8KK30gUlBEUiwgKnBSUERSOworI2RlZmluZSBjYlJQRFIgc2l6ZW9mKFJQRFIpCisjZGVmaW5lIHJwZE5pbCAoKHBSUERSKSAwKQorI2VuZGlmCisKKy8qCisgKiBMaW5lIE51bWJlcnMKKyAqCisgKiBMaW5lIE51bWJlcnMgYXJlIHNlZ3JlZ2F0ZWQgZnJvbSB0aGUgbm9ybWFsIHN5bWJvbHMgYmVjYXVzZSB0aGV5CisgKiBhcmUgWzFdIHNtYWxsZXIgLCBbMl0gYXJlIG9mIG5vIGludGVyZXN0IHRvIHlvdXIKKyAqIGF2ZXJhZ2UgbG9hZGVyLCBhbmQgWzNdIGFyZSBuZXZlciBuZWVkZWQgaW4gdGhlIG1pZGRsZSBvZiBub3JtYWwKKyAqIHNjYW5uaW5nIGFuZCB0aGVyZWZvcmUgc2xvdyB0aGluZ3MgZG93bi4KKyAqCisgKiBCeSBkZWZpbml0aW9uLCB0aGUgZmlyc3QgTElORVIgZm9yIGFueSBnaXZlbiBwcm9jZWR1cmUgd2lsbCBoYXZlCisgKiB0aGUgZmlyc3QgbGluZSBvZiBhIHByb2NlZHVyZSBhbmQgcmVwcmVzZW50IHRoZSBmaXJzdCBhZGRyZXNzLgorICovCisKK3R5cGVkZWYJbG9uZyBMSU5FUiwgKnBMSU5FUjsKKyNkZWZpbmUgbGluZU5pbCAoKHBMSU5FUikwKQorI2RlZmluZSBjYkxJTkVSIHNpemVvZihMSU5FUikKKyNkZWZpbmUgaWxpbmVOaWwJLTEKKworCisKKy8qCisgKiBUaGUgU3ltYm9sIFN0cnVjdHVyZQkJKEdGVywgdG8gdGhvc2Ugd2hvIEtub3chKQorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlsb25nCWlzczsJCS8qIGluZGV4IGludG8gU3RyaW5nIFNwYWNlIG9mIG5hbWUgKi8KKwliZmRfdm1hCXZhbHVlOwkJLyogdmFsdWUgb2Ygc3ltYm9sICovCisJdW5zaWduZWQgc3QgOiA2OwkvKiBzeW1ib2wgdHlwZSAqLworCXVuc2lnbmVkIHNjICA6IDU7CS8qIHN0b3JhZ2UgY2xhc3MgLSB0ZXh0LCBkYXRhLCBldGMgKi8KKwl1bnNpZ25lZCByZXNlcnZlZCA6IDE7CS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgaW5kZXggOiAyMDsJLyogaW5kZXggaW50byBzeW0vYXV4IHRhYmxlICovCisJfSBTWU1SLCAqcFNZTVI7CisjZGVmaW5lIHN5bU5pbCAoKHBTWU1SKTApCisjZGVmaW5lIGNiU1lNUiBzaXplb2YoU1lNUikKKyNkZWZpbmUgaXN5bU5pbCAtMQorI2RlZmluZSBpbmRleE5pbCAweGZmZmZmCisjZGVmaW5lIGlzc05pbCAtMQorI2RlZmluZSBpc3NOdWxsIDAKKworCisvKiBUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgbWVtb3J5IHJlc2lkZW50IHN0cmluZyB0byBhbiBpc3MuCisgKiBUaGlzIGhhY2sgaXMgcmVjb2duaXplZCBpbiBTYkZJc3MsIGluIHN5bS5jIG9mIHRoZSBkZWJ1Z2dlci4KKyAqLworI2RlZmluZSBJc3NGU2Ioc2IpICgweDgwMDAwMDAwIHwgKCh1bnNpZ25lZCBsb25nKShzYikpKQorCisvKiBFIFggVCBFIFIgTiBBIEwgICBTIFkgTSBCIE8gTCAgUiBFIEMgTyBSIEQKKyAqCisgKglTYW1lIGFzIHRoZSBTWU1SIGV4Y2VwdCBpdCBjb250YWlucyBmaWxlIGNvbnRleHQgdG8gZGV0ZXJtaW5lIHdoZXJlCisgKgl0aGUgaW5kZXggaXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGVjb2ZmX2V4dHIgeworCXVuc2lnbmVkIGptcHRibDoxOwkvKiBzeW1ib2wgaXMgYSBqdW1wIHRhYmxlIGVudHJ5IGZvciBzaGxpYnMgKi8KKwl1bnNpZ25lZCBjb2JvbF9tYWluOjE7CS8qIHN5bWJvbCBpcyBhIGNvYm9sIG1haW4gcHJvY2VkdXJlICovCisJdW5zaWduZWQgd2Vha2V4dDoxOwkvKiBzeW1ib2wgaXMgd2VhayBleHRlcm5hbCAqLworCXVuc2lnbmVkIHJlc2VydmVkOjEzOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCWludAlpZmQ7CQkvKiB3aGVyZSB0aGUgaXNzIGFuZCBpbmRleCBmaWVsZHMgcG9pbnQgaW50byAqLworCVNZTVIJYXN5bTsJCS8qIHN5bWJvbCBmb3IgdGhlIGV4dGVybmFsICovCisJfSBFWFRSLCAqcEVYVFI7CisjZGVmaW5lIGV4dE5pbCAoKHBFWFRSKTApCisjZGVmaW5lIGNiRVhUUiBzaXplb2YoRVhUUikKKworCisvKiBBIFUgWCBJIEwgTCBBIFIgWSAgIFQgWSBQIEUJIEkgTiBGIE8gUiBNIEEgVCBJIE8gTiAqLworCisvKgorICogVHlwZSBJbmZvcm1hdGlvbiBSZWNvcmQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGZCaXRmaWVsZCA6IDE7IC8qIHNldCBpZiBiaXQgd2lkdGggaXMgc3BlY2lmaWVkICovCisJdW5zaWduZWQgY29udGludWVkIDogMTsgLyogaW5kaWNhdGVzIGFkZGl0aW9uYWwgVFEgaW5mbyBpbiBuZXh0IEFVWCAqLworCXVuc2lnbmVkIGJ0ICA6IDY7CS8qIGJhc2ljIHR5cGUgKi8KKwl1bnNpZ25lZCB0cTQgOiA0OworCXVuc2lnbmVkIHRxNSA6IDQ7CisJLyogLS0tLSAxNiBiaXQgYm91bmRhcnkgLS0tLSAqLworCXVuc2lnbmVkIHRxMCA6IDQ7CisJdW5zaWduZWQgdHExIDogNDsJLyogNiB0eXBlIHF1YWxpZmllcnMgLSB0cVB0ciwgZXRjLiAqLworCXVuc2lnbmVkIHRxMiA6IDQ7CisJdW5zaWduZWQgdHEzIDogNDsKKwl9IFRJUiwgKnBUSVI7CisjZGVmaW5lIGNiVElSIHNpemVvZihUSVIpCisjZGVmaW5lIHRpTmlsICgocFRJUikwKQorI2RlZmluZSBpdHFNYXggNgorCisvKgorICogUmVsYXRpdmUgc3ltYm9sIHJlY29yZAorICoKKyAqIElmIHRoZSByZmQgZmllbGQgaXMgNDA5NSwgdGhlIGluZGV4IGZpZWxkIGluZGV4ZXMgaW50byB0aGUgZ2xvYmFsIHN5bWJvbAorICoJdGFibGUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCXJmZCA6IDEyOyAgICAvKiBpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCisJdW5zaWduZWQJaW5kZXggOiAyMDsgLyogaW5kZXggaW50IHN5bS9hdXgvaXNzIHRhYmxlcyAqLworCX0gUk5EWFIsICpwUk5EWFI7CisjZGVmaW5lIGNiUk5EWFIgc2l6ZW9mKFJORFhSKQorI2RlZmluZSBybmR4TmlsICgocFJORFhSKTApCisKKy8qIGRlbnNlIG51bWJlcnMgb3Igc29tZXRpbWVzIGNhbGxlZCBibG9jayBudW1iZXJzIGFyZSBzdG9yZWQgaW4gdGhpcyB0eXBlLAorICoJYSByZmQgb2YgMHhmZmZmZmZmZiBpcyBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwgdGFibGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCXJmZDsgICAgLyogaW5kZXggaW50byB0aGUgZmlsZSB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcJaW5kZXg7IAkvKiBpbmRleCBpbnQgc3ltL2F1eC9pc3MgdGFibGVzICovCisJfSBETlIsICpwRE5SOworI2RlZmluZSBjYkROUiBzaXplb2YoRE5SKQorI2RlZmluZSBkbk5pbCAoKHBETlIpMCkKKworCisKKy8qCisgKiBBdXhpbGxhcnkgaW5mb3JtYXRpb24gb2NjdXJzIG9ubHkgaWYgbmVlZGVkLgorICogSXQgQUxXQVlTIG9jY3VycyBpbiB0aGlzIG9yZGVyIHdoZW4gcHJlc2VudC4KKworCSAgICBpc3ltTWFjCQl1c2VkIGJ5IHN0UHJvYyBvbmx5CisJICAgIFRJUgkJCXR5cGUgaW5mbworCSAgICBUSVIJCQlhZGRpdGlvbmFsIFRRIGluZm8gKGlmIGZpcnN0IFRJUiB3YXMgbm90IGVub3VnaCkKKwkgICAgcm5keAkJaWYgKGJ0ID09IGJ0U3RydWN0LGJ0VW5pb24sYnRFbnVtLGJ0U2V0LGJ0UmFuZ2UsCisJCQkJICAgIGJ0VHlwZWRlZik6CisJCQkJICAgIHJzeW0uaW5kZXggPT0gaWF1eCBmb3IgYnRTZXQgb3IgYnRSYW5nZQorCQkJCSAgICBlbHNlIHJzeW0uaW5kZXggPT0gaXN5bQorCSAgICBkaW1Mb3cJCWJ0UmFuZ2UsIGJ0U2V0CisJICAgIGRpbU1hYwkJYnRSYW5nZSwgYnRTZXQKKwkgICAgcm5keDAJCUFzIG1hbnkgYXMgdGhlcmUgYXJlIHRxIGFycmF5cworCSAgICBkaW1Mb3cwCisJICAgIGRpbUhpZ2gwCisJICAgIC4uLgorCSAgICBybmR4TWF4LTEKKwkgICAgZGltTG93TWF4LTEKKwkgICAgZGltSGlnaE1heC0xCisJICAgIHdpZHRoIGluIGJpdHMJaWYgKGJpdCBmaWVsZCksIHdpZHRoIGluIGJpdHMuCisgKi8KKyNkZWZpbmUgY0F1eE1heCAoNiArIChpZGltTWF4KjMpKQorCisvKiBhIHVuaW9uIG9mIGFsbCBwb3NzaWJsZSBpbmZvIGluIHRoZSBBVVggdW5pdmVyc2UgKi8KK3R5cGVkZWYgdW5pb24geworCVRJUgl0aTsJCS8qIHR5cGUgaW5mb3JtYXRpb24gcmVjb3JkICovCisJUk5EWFIJcm5keDsJCS8qIHJlbGF0aXZlIGluZGV4IGludG8gc3ltYm9sIHRhYmxlICovCisJbG9uZwlkbkxvdzsJCS8qIGxvdyBkaW1lbnNpb24gKi8KKwlsb25nCWRuSGlnaDsJCS8qIGhpZ2ggZGltZW5zaW9uICovCisJbG9uZwlpc3ltOwkJLyogc3ltYm9sIHRhYmxlIGluZGV4IChlbmQgb2YgcHJvYykgKi8KKwlsb25nCWlzczsJCS8qIGluZGV4IGludG8gc3RyaW5nIHNwYWNlIChub3QgdXNlZCkgKi8KKwlsb25nCXdpZHRoOwkJLyogd2lkdGggZm9yIG5vbi1kZWZhdWx0IHNpemVkIHN0cnVjIGZpZWxkcyAqLworCWxvbmcJY291bnQ7CQkvKiBjb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgYXJtICovCisJfSBBVVhVLCAqcEFVWFU7CisjZGVmaW5lIGNiQVVYVSBzaXplb2YoQVVYVSkKKyNkZWZpbmUgYXV4TmlsICgocEFVWFUpMCkKKyNkZWZpbmUgaWF1eE5pbCAtMQorCisKKy8qCisgKiBPcHRpbWl6YXRpb24gc3ltYm9scworICoKKyAqIE9wdGltaXphdGlvbiBzeW1ib2xzIGNvbnRhaW4gc29tZSBvdmVybGFwIGluZm9ybWF0aW9uIHdpdGggdGhlIG5vcm1hbAorICogc3ltYm9sIHRhYmxlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcHJvYyBpbmZvcm1hdGlvbgorICogaXMgc29tZXdoYXQgcmVkdW5kYW50IGJ1dCBuZWNlc3NhcnkgdG8gZWFzaWx5IGZpbmQgdGhlIG90aGVyIGluZm9ybWF0aW9uCisgKiBwcmVzZW50LiAKKyAqCisgKiBBbGwgb2YgdGhlIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhc3Qgb3RQcm9jCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIG90OiA4OwkJLyogb3B0aW1pemF0aW9uIHR5cGUgKi8KKwl1bnNpZ25lZCB2YWx1ZTogMjQ7CS8qIGFkZHJlc3Mgd2hlcmUgd2UgYXJlIG1vdmluZyBpdCB0byAqLworCVJORFhSCXJuZHg7CQkvKiBwb2ludHMgdG8gYSBzeW1ib2wgb3Igb3B0IGVudHJ5ICovCisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CS8qIHJlbGF0aXZlIG9mZnNldCB0aGlzIG9jY3VyZWQgKi8KKwl9IE9QVFIsICpwT1BUUjsKKyNkZWZpbmUgb3B0TmlsCSgocE9QVFIpIDApCisjZGVmaW5lIGNiT1BUUiBzaXplb2YoT1BUUikKKyNkZWZpbmUgaW9wdE5pbCAtMQorCisvKgorICogRmlsZSBJbmRpcmVjdAorICoKKyAqIFdoZW4gYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBhY3Jvc3MgZmlsZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgaXMgdXNlZDoKKyAqCTEpIHVzZSB0aGUgZmlsZSBpbmRleCB0byBnZXQgdGhlIEZpbGUgaW5kaXJlY3QgZW50cnkuCisgKgkyKSB1c2UgdGhlIGZpbGUgaW5kaXJlY3QgZW50cnkgdG8gZ2V0IHRoZSBGaWxlIGRlc2NyaXB0b3IuCisgKgkzKSBhZGQgdGhlIHN5bSBpbmRleCB0byB0aGUgYmFzZSBvZiB0aGF0IGZpbGUncyBzeW0gdGFibGUKKyAqCisgKi8KKwordHlwZWRlZiBsb25nIFJGRFQsICpwUkZEVDsKKyNkZWZpbmUgY2JSRkRUIHNpemVvZihSRkRUKQorI2RlZmluZSByZmROaWwJLTEKKworLyoKKyAqIFRoZSBmaWxlIGluZGlyZWN0IHRhYmxlIGluIHRoZSBtaXBzIGxvYWRlciBpcyBrbm93biBhcyBhbiBhcnJheSBvZiBGSVRzLgorICogVGhpcyBpcyBkb25lIHRvIGtlZXAgdGhlIGNvZGUgaW4gdGhlIGxvYWRlciByZWFkYWJsZSBpbiB0aGUgYXJlYSB3aGVyZQorICogdGhlc2UgdGFibGVzIGFyZSBtZXJnZWQuICBOb3RlIHRoaXMgaXMgb25seSBhIG5hbWUgY2hhbmdlLgorICovCit0eXBlZGVmIGxvbmcgRklULCAqcEZJVDsKKyNkZWZpbmUgY2JGSVQJc2l6ZW9mKEZJVCkKKyNkZWZpbmUgaWZpTmlsCS0xCisjZGVmaW5lIGZpTmlsCSgocEZJVCkgMCkKKworI2lmZGVmIF9MQU5HVUFHRV9QQVNDQUwKKyNkZWZpbmUgaWZkTmlsIC0xCisjZGVmaW5lIGlsbk5pbCAtMQorI2RlZmluZSBpcGROaWwgLTEKKyNkZWZpbmUgaWxpbmVOaWwgLTEKKyNkZWZpbmUgaXN5bU5pbCAtMQorI2RlZmluZSBpbmRleE5pbCAxNiNmZmZmZgorI2RlZmluZSBpc3NOaWwgLTEKKyNkZWZpbmUgaXNzTnVsbCAwCisjZGVmaW5lIGl0cU1heCA2CisjZGVmaW5lIGlhdXhOaWwgLTEKKyNkZWZpbmUgaW9wdE5pbCAtMQorI2RlZmluZSByZmROaWwgLTEKKyNkZWZpbmUgaWZpTmlsIC0xCisjZW5kaWYJLyogX0xBTkdVQUdFX1BBU0NBTCAqLworCisKKy8qIERlbnNlIG51bWJlcnMKKyAqCisgKiBSYXRoZXIgdGhhbiB1c2UgZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4IHBhaXJzIHRvIHJlcHJlc2VudCBzeW1ib2xzCisgKglhbmQgZ2xvYmFscywgd2UgdXNlIGRlbnNlIG51bWJlciBzbyB0aGF0IHRoZXkgY2FuIGJlIGVhc2lseSBlbWJlZGVkCisgKglpbiBpbnRlcm1lZGlhdGUgY29kZSBhbmQgdGhlIHByb2dyYW1zIHRoYXQgcHJvY2VzcyB0aGVtIGNhbgorICoJdXNlIGRpcmVjdCBhY2Nlc3MgdGFibHMgaW5zdGVhZCBvZiBoYXNoIHRhYmxlICh3aGljaCB3b3VsZCBiZQorICoJbmVjZXNhcnkgb3RoZXJ3aXNlIGJlY2F1c2Ugb2YgdGhlIHNwYXJzZSBuYW1lIHNwYWNlIGNhdXNlZCBieQorICoJZmlsZSBpbmRleCwgc3ltYm9sIGluZGV4IHBhaXJzLiBEZW5zZSBudW1iZXIgYXJlIHJlcHJlc2VudGVkCisgKglieSBSTkRYUnMuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5lcyB0aGUgbWVhbmluZyBvZiBlYWNoIFNZTSBmaWVsZCBhcworICogYSBmdW5jdGlvbiBvZiB0aGUgInN0Ii4gKHNjRC9CID09IHNjRGF0YSBPUiBzY0JzcykKKyAqCisgKiBOb3RlOiB0aGUgdmFsdWUgImlzeW1NYWMiIGlzIHVzZWQgYnkgc3ltYm9scyB0aGF0IGhhdmUgdGhlIGNvbmNlcHQKKyAqIG9mIGVuY2xvc2luZyBhIGJsb2NrIG9mIHJlbGF0ZWQgaW5mb3JtYXRpb24uCSBUaGlzIHZhbHVlIGlzIHRoZQorICogaXN5bSBvZiB0aGUgZmlyc3Qgc3ltYm9sIEFGVEVSIHRoZSBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5CisgKiBzeW1ib2wuIEZvciBleGFtcGxlIGlmIGEgcHJvY2VkdXJlIHdhcyBhdCBpc3ltPT05MCBhbmQgaGFkIGFuCisgKiBpc3ltTWFjPT0xNTUsIHRoZSBhc3NvY2lhdGVkIGVuZCB3b3VsZCBiZSBhdCBpc3ltPT0xNTQsIGFuZCB0aGUKKyAqIHN5bWJvbCBhdCAxNTUgd291bGQgcHJvYmFibHkgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSkgYmUgdGhlCisgKiBzeW1ib2wgZm9yIHRoZSBuZXh0IHByb2NlZHVyZS4gIFRoaXMgYWxsb3dzIHJhcGlkIHNraXBwaW5nIG92ZXIKKyAqIGludGVybmFsIGluZm9ybWF0aW9uIG9mIHZhcmlvdXMgc29ydHMuICJzdEVuZCJzIEFMV0FZUyBoYXZlIHRoZQorICogaXN5bSBvZiB0aGUgcHJpbWFyeSBzeW1ib2wgdGhhdCBzdGFydGVkIHRoZSBibG9jay4KKyAqIAorCitTVAkJU0MJVkFMVUUJCUlOREVYCistLS0tLS0tLQktLS0tLS0JLS0tLS0tLS0JLS0tLS0tCitzdEZpbGUJCXNjVGV4dAlhZGRyZXNzCQlpc3ltTWFjCitzdExhYmVsCQlzY1RleHQJYWRkcmVzcwkJLS0tCitzdEdsb2JhbAlzY0QvQglhZGRyZXNzCQlpYXV4CitzdFN0YXRpYwlzY0QvQglhZGRyZXNzCQlpYXV4CitzdFBhcmFtCQlzY0FicwlvZmZzZXQJCWlhdXgKK3N0TG9jYWwJCXNjQWJzCW9mZnNldAkJaWF1eAorc3RQcm9jCQlzY1RleHQJYWRkcmVzcwkJaWF1eAkoaXN5bU1hYyBpcyBmaXJzdCBBVVgpCitzdFN0YXRpY1Byb2MJc2NUZXh0CWFkZHJlc3MJCWlhdXgJKGlzeW1NYWMgaXMgZmlyc3QgQVVYKQorCitzdE1lbWJlcglzY05pbAlvcmRpbmFsCQktLS0JKGlmIG1lbWJlciBvZiBlbnVtKQorCShtaXBzcmVhZCB0aGlua3MgdGhlIGNhc2UgYmVsb3cgaGFzIGEgYml0LCBub3QgYnl0ZSwgb2Zmc2V0LikKK3N0TWVtYmVyCXNjTmlsCWJ5dGUgb2Zmc2V0CWlhdXgJKGlmIG1lbWJlciBvZiBzdHJ1Y3QvdW5pb24pCitzdE1lbWJlcglzY0JpdHMJYml0IG9mZnNldAlpYXV4CShiaXQgZmllbGQgc3BlYykKKworc3RCbG9jawkJc2NUZXh0CWFkZHJlc3MJCWlzeW1NYWMgKHRleHQgYmxvY2spCisJKHRoZSBjb2RlIHNlZW1zIHRvIHRoaW5rIHRoYXQgcmF0aGVyIHRoYW4gc2NOaWwsIHdlIHNlZSBzY0luZm8gZm9yCisJIHRoZSB0d28gY2FzZXMgYmVsb3cuKQorc3RCbG9jawkJc2NOaWwJY2IJCWlzeW1NYWMgKHN0cnVjdC91bmlvbiBtZW1iZXIgZGVmaW5lKQorc3RCbG9jawkJc2NOaWwJY01lbWJlcnMJaXN5bU1hYyAoZW51bSBtZW1iZXIgZGVmaW5lKQorCisJKE5ldyB0eXBlcyBhZGRlZCBieSBTR0kgdG8gc2ltcGxpZnkgdGhpbmdzOikKK3N0U3RydWN0CXNjSW5mbwljYgkJaXN5bU1hYyAoc3RydWN0IHR5cGUgZGVmaW5lKQorc3RVbmlvbgkJc2NJbmZvCWNiCQlpc3ltTWFjICh1bmlvbiAgdHlwZSBkZWZpbmUpCitzdEVudW0JCXNjSW5mbwljTWVtYmVycwlpc3ltTWFjIChlbnVtICAgdHlwZSBkZWZpbmUpCisKK3N0RW5kCQlzY1RleHQJYWRkcmVzcwkJaXN5bVN0YXJ0CitzdEVuZAkJc2NOaWwJLS0tLS0tLQkJaXN5bVN0YXJ0IChzdHJ1Y3QvdW5pb24vZW51bSkKKworc3RUeXBlZGVmCXNjTmlsCS0tLS0tLS0JCWlhdXgKK3N0UmVnUmVsb2MJc2M/Pz8JdmFsdWUJCW9sZCByZWdpc3RlciBudW1iZXIKK3N0Rm9yd2FyZAlzYz8/PwluZXcgYWRkcmVzcwlpc3ltIHRvIG9yaWdpbmFsIHN5bWJvbAorCitzdENvbnN0YW50CXNjSW5mbwl2YWx1ZQkJLS0tIChzY2FsYXIpCitzdENvbnN0YW50CXNjSW5mbwlpc3MJCS0tLSAoY29tcGxleCwgZS5nLiBzdHJpbmcpCisKKyAqCisgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmggYi9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDBlZWYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL3N5bWNvbnN0LmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qIERlY2xhcmF0aW9ucyBvZiBjb25zdGFudHMgZm9yIGludGVybmFsIGZvcm1hdCBvZiBNSVBTIEVDT0ZGIHN5bWJvbHMuCisgICBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcyBhbmQgVGhpcmQgRXllIFNvZnR3YXJlLgorICAgQ2hhbmdlcyBjb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCisKKyAgIFRoaXMgZmlsZSBpcyBqdXN0IGFnZ3JlZ2F0ZWQgd2l0aCB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBHTlUKKyAgIHJlbGVhc2U7IGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgR0FTLCBHREIsIG9yIG90aGVyIEdOVQorICAgcHJvZ3JhbXMuICAqLworCisvKgorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICogfCBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEsIDE5OTAgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMufAorICogfCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlICAgfAorICogfCByaWdodHMgdG8gYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzICAgICAgfAorICogfCBtYWludGFpbmVkIGluIHRoZSBjb3B5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICovCisKKy8qIChDKSBDb3B5cmlnaHQgMTk4NCBieSBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlIHJpZ2h0cyB0bworICogYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzIG1haW50YWluZWQgaW4gdGhlIGNvcHkuCisgKgorICogVGhpcmQgRXllIG1ha2VzIG5vIGNsYWltcyBhYm91dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzCisgKiBzeW1ib2wgdGFibGUgdG8gYSBwYXJ0aWN1bGFyIHVzZS4KKyAqLworCisvKiBnbGV2ZWxzIGZvciBmaWVsZCBpbiBGRFIgKi8KKyNkZWZpbmUgR0xFVkVMXzAJMgorI2RlZmluZSBHTEVWRUxfMQkxCisjZGVmaW5lIEdMRVZFTF8yCTAJLyogZm9yIHVwd2FyZCBjb21wYXQgcmVhc29ucy4gKi8KKyNkZWZpbmUgR0xFVkVMXzMJMworCisvKiBtYWdpYyBudW1iZXIgZm8gc3ltaGVhZGVyICovCisjZGVmaW5lIG1hZ2ljU3ltCTB4NzAwOQorLyogVGhlIEFscGhhIHVzZXMgdGhpcyB2YWx1ZSBpbnN0ZWFkLCBmb3Igc29tZSByZWFzb24uICAqLworI2RlZmluZSBtYWdpY1N5bTIJMHgxOTkyCisKKy8qIExhbmd1YWdlIGNvZGVzICovCisjZGVmaW5lIGxhbmdDCQkwCQorI2RlZmluZSBsYW5nUGFzY2FsCTEKKyNkZWZpbmUgbGFuZ0ZvcnRyYW4JMgorI2RlZmluZQlsYW5nQXNzZW1ibGVyCTMJLyogb25lIEFzc2VtYmxleSBpbnN0IG1pZ2h0IG1hcCB0byBtYW55IG1hY2ggKi8KKyNkZWZpbmUgbGFuZ01hY2hpbmUJNAorI2RlZmluZSBsYW5nTmlsCQk1CisjZGVmaW5lIGxhbmdBZGEJCTYKKyNkZWZpbmUgbGFuZ1BsMQkJNworI2RlZmluZSBsYW5nQ29ib2wJOAorI2RlZmluZSBsYW5nU3RkYwk5CS8qIEZJWE1FOiBDb2xsaWRlcyB3aXRoIFNHSSBsYW5nQ3BsdXNwbHVzICovCisjZGVmaW5lIGxhbmdDcGx1c3BsdXMJOQkvKiBGSVhNRTogQ29sbGlkZXMgd2l0aCBsYW5nU3RkYyAqLworI2RlZmluZSBsYW5nQ3BsdXNwbHVzVjIJMTAJLyogU0dJIGFkZGl0aW9uICovCisjZGVmaW5lIGxhbmdNYXgJCTExCS8qIG1heGltdW4gYWxsb3dlZCAzMiAtLSA1IGJpdHMgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgdmFsdWUgZGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZHMgaW4gdGhlIFNZTVIgKi8KKworLyoKKyAqIFN0b3JhZ2UgQ2xhc3NlcworICovCisKKyNkZWZpbmUgc2NOaWwJCTAKKyNkZWZpbmUgc2NUZXh0CQkxCS8qIHRleHQgc3ltYm9sICovCisjZGVmaW5lIHNjRGF0YQkJMgkvKiBpbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLworI2RlZmluZSBzY0JzcwkJMwkvKiB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLworI2RlZmluZSBzY1JlZ2lzdGVyCTQJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLworI2RlZmluZSBzY0FicwkJNQkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KKyNkZWZpbmUgc2NVbmRlZmluZWQJNgkvKiB3aG8ga25vd3M/ICovCisjZGVmaW5lIHNjQ2RiTG9jYWwJNwkvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIHNlLT52YS4/PyAqLworI2RlZmluZSBzY0JpdHMJCTgJLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLworI2RlZmluZSBzY0NkYlN5c3RlbQk5CS8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBzY0RieAkJOQkvKiBvdmVybGFwIGRieCBpbnRlcm5hbCB1c2UgKi8KKyNkZWZpbmUgc2NSZWdJbWFnZQkxMAkvKiByZWdpc3RlciB2YWx1ZSBzYXZlZCBvbiBzdGFjayAqLworI2RlZmluZSBzY0luZm8JCTExCS8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBzY1VzZXJTdHJ1Y3QJMTIJLyogYWRkcmVzcyBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzICovCisjZGVmaW5lIHNjU0RhdGEJCTEzCS8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KKyNkZWZpbmUgc2NTQnNzCQkxNAkvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24gKi8KKyNkZWZpbmUgc2NSRGF0YQkJMTUJLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KKyNkZWZpbmUgc2NWYXIJCTE2CS8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLworI2RlZmluZSBzY0NvbW1vbgkxNwkvKiBjb21tb24gdmFyaWFibGUgKi8KKyNkZWZpbmUgc2NTQ29tbW9uCTE4CS8qIHNtYWxsIGNvbW1vbiAqLworI2RlZmluZSBzY1ZhclJlZ2lzdGVyCTE5CS8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLworI2RlZmluZSBzY1ZhcmlhbnQJMjAJLyogVmFyaWFudCByZWNvcmQgKi8KKyNkZWZpbmUgc2NTVW5kZWZpbmVkCTIxCS8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLworI2RlZmluZSBzY0luaXQJCTIyCS8qIC5pbml0IHNlY3Rpb24gc3ltYm9sICovCisjZGVmaW5lIHNjQmFzZWRWYXIJMjMJLyogRm9ydHJhbiBvciBQTC8xIHB0ciBiYXNlZCB2YXIgKi8gCisjZGVmaW5lIHNjWERhdGEgICAgICAgICAyNCAgICAgIC8qIGV4Y2VwdGlvbiBoYW5kbGluZyBkYXRhICovCisjZGVmaW5lIHNjUERhdGEgICAgICAgICAyNSAgICAgIC8qIFByb2NlZHVyZSBzZWN0aW9uICovCisjZGVmaW5lIHNjRmluaSAgICAgICAgICAyNiAgICAgIC8qIC5maW5pIHNlY3Rpb24gKi8KKyNkZWZpbmUgc2NSQ29uc3QJMjcJLyogLnJjb25zdCBzZWN0aW9uICovCisjZGVmaW5lIHNjTWF4CQkzMgorCisKKy8qCisgKiAgIFN5bWJvbCBUeXBlcworICovCisKKyNkZWZpbmUgc3ROaWwJCTAJLyogTnV0aGluJyBzcGVjaWFsICovCisjZGVmaW5lIHN0R2xvYmFsCTEJLyogZXh0ZXJuYWwgc3ltYm9sICovCisjZGVmaW5lIHN0U3RhdGljCTIJLyogc3RhdGljICovCisjZGVmaW5lIHN0UGFyYW0JCTMJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCisjZGVmaW5lIHN0TG9jYWwJCTQJLyogbG9jYWwgdmFyaWFibGUgKi8KKyNkZWZpbmUgc3RMYWJlbAkJNQkvKiBsYWJlbCAqLworI2RlZmluZSBzdFByb2MJCTYJLyogICAgICIgICAgICAiCSBQcm9jZWR1cmUgKi8KKyNkZWZpbmUgc3RCbG9jawkJNwkvKiBiZWdpbm5uaW5nIG9mIGJsb2NrICovCisjZGVmaW5lIHN0RW5kCQk4CS8qIGVuZCAob2YgYW55dGhpbmcpICovCisjZGVmaW5lIHN0TWVtYmVyCTkJLyogbWVtYmVyIChvZiBhbnl0aGluZwktIHN0cnVjdC91bmlvbi9lbnVtICovCisjZGVmaW5lIHN0VHlwZWRlZgkxMAkvKiB0eXBlIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgc3RGaWxlCQkxMQkvKiBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgc3RSZWdSZWxvYwkxMgkvKiByZWdpc3RlciByZWxvY2F0aW9uICovCisjZGVmaW5lIHN0Rm9yd2FyZAkxMwkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgc3RTdGF0aWNQcm9jCTE0CS8qIGxvYWQgdGltZSBvbmx5IHN0YXRpYyBwcm9jcyAqLworI2RlZmluZSBzdENvbnN0YW50CTE1CS8qIGNvbnN0ICovCisjZGVmaW5lIHN0U3RhUGFyYW0JMTYJLyogRm9ydHJhbiBzdGF0aWMgcGFyYW1ldGVycyAqLworICAgIC8qIFRoZXNlIG5ldyBzeW1ib2wgdHlwZXMgaGF2ZSBiZWVuIHJlY2VudGx5IGFkZGVkIHRvIFNHSSBtYWNoaW5lcy4gKi8KKyNkZWZpbmUgc3RTdHJ1Y3QJMjYJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGEgc3RydWN0IHR5cGUgKi8KKyNkZWZpbmUgc3RVbmlvbgkJMjcJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGEgdW5pb24gdHlwZSAqLworI2RlZmluZSBzdEVudW0JCTI4CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhbiBlbnVtIHR5cGUgKi8KKyNkZWZpbmUgc3RJbmRpcmVjdAkzNAkvKiBJbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KKyAgICAvKiBQc2V1ZG8tc3ltYm9scyAtIGludGVybmFsIHRvIGRlYnVnZ2VyICovCisjZGVmaW5lIHN0U3RyCQk2MAkvKiBzdHJpbmcgKi8KKyNkZWZpbmUgc3ROdW1iZXIJNjEJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCisjZGVmaW5lIHN0RXhwcgkJNjIJLyogMisyIHZzLiA0ICovCisjZGVmaW5lIHN0VHlwZQkJNjMJLyogcG9zdC1jb2Vyc2lvbiBTRVIgKi8KKyNkZWZpbmUgc3RNYXgJCTY0CisKKy8qIGRlZmluaXRpb25zIGZvciBmaWVsZHMgaW4gVElSICovCisKKy8qIHR5cGUgcXVhbGlmaWVycyBmb3IgdGkudHEwIC0+IHRpLihpdHFNYXgtMSkgKi8KKyNkZWZpbmUgdHFOaWwJMAkvKiBidCBpcyB3aGF0IHlvdSBzZWUgKi8KKyNkZWZpbmUgdHFQdHIJMQkvKiBwb2ludGVyICovCisjZGVmaW5lIHRxUHJvYwkyCS8qIHByb2NlZHVyZSAqLworI2RlZmluZSB0cUFycmF5IDMJLyogZHVoICovCisjZGVmaW5lIHRxRmFyCTQJLyogbG9uZ2VyIGFkZHJlc3NpbmcgLSA4MDg2LzggbGFuZCAqLworI2RlZmluZSB0cVZvbAk1CS8qIHZvbGF0aWxlICovCisjZGVmaW5lIHRxQ29uc3QgNgkvKiBjb25zdCAqLworI2RlZmluZSB0cU1heAk4CisKKy8qIGJhc2ljIHR5cGVzIGFzIHNlZW4gaW4gdGkuYnQgKi8KKyNkZWZpbmUgYnROaWwJCTAJLyogdW5kZWZpbmVkIChhbHNvLCBlbnVtIG1lbWJlcnMpICovCisjZGVmaW5lIGJ0QWRyCQkxCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCisjZGVmaW5lIGJ0Q2hhcgkJMgkvKiBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgYnRVQ2hhcgkJMwkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgYnRTaG9ydAkJNAkvKiBzaG9ydCAqLworI2RlZmluZSBidFVTaG9ydAk1CS8qIHVuc2lnbmVkIHNob3J0ICovCisjZGVmaW5lIGJ0SW50CQk2CS8qIGludCAqLworI2RlZmluZSBidFVJbnQJCTcJLyogdW5zaWduZWQgaW50ICovCisjZGVmaW5lIGJ0TG9uZwkJOAkvKiBsb25nICovCisjZGVmaW5lIGJ0VUxvbmcJCTkJLyogdW5zaWduZWQgbG9uZyAqLworI2RlZmluZSBidEZsb2F0CQkxMAkvKiBmbG9hdCAocmVhbCkgKi8KKyNkZWZpbmUgYnREb3VibGUJMTEJLyogRG91YmxlIChyZWFsKSAqLworI2RlZmluZSBidFN0cnVjdAkxMgkvKiBTdHJ1Y3R1cmUgKFJlY29yZCkgKi8KKyNkZWZpbmUgYnRVbmlvbgkJMTMJLyogVW5pb24gKHZhcmlhbnQpICovCisjZGVmaW5lIGJ0RW51bQkJMTQJLyogRW51bWVyYXRlZCAqLworI2RlZmluZSBidFR5cGVkZWYJMTUJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLworI2RlZmluZSBidFJhbmdlCQkxNgkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KKyNkZWZpbmUgYnRTZXQJCTE3CS8qIHBhc2NhbCBzZXRzICovCisjZGVmaW5lIGJ0Q29tcGxleAkxOAkvKiBmb3J0cmFuIGNvbXBsZXggKi8KKyNkZWZpbmUgYnREQ29tcGxleAkxOQkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCisjZGVmaW5lIGJ0SW5kaXJlY3QJMjAJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KKyNkZWZpbmUgYnRGaXhlZERlYwkyMQkvKiBGaXhlZCBEZWNpbWFsICovCisjZGVmaW5lIGJ0RmxvYXREZWMJMjIJLyogRmxvYXQgRGVjaW1hbCAqLworI2RlZmluZSBidFN0cmluZwkyMwkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCisjZGVmaW5lIGJ0Qml0CQkyNAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KKyNkZWZpbmUgYnRQaWN0dXJlCTI1CS8qIFBpY3R1cmUgKi8KKyNkZWZpbmUgYnRWb2lkCQkyNgkvKiB2b2lkICovCisjZGVmaW5lIGJ0TG9uZ0xvbmcJMjcJLyogbG9uZyBsb25nICovCisjZGVmaW5lIGJ0VUxvbmdMb25nCTI4CS8qIHVuc2lnbmVkIGxvbmcgbG9uZyAqLworI2RlZmluZSBidE1heAkJNjQKKworI2lmIChfTUZHID09IF9NSVBTKQorLyogb3B0aW1pemF0aW9uIHR5cGUgY29kZXMgKi8KKyNkZWZpbmUgb3ROaWwJCTAKKyNkZWZpbmUgb3RSZWcJCTEJLyogbW92ZSB2YXIgdG8gcmVnICovCisjZGVmaW5lIG90QmxvY2sJCTIJLyogYmVnaW4gYmFzaWMgYmxvY2sgKi8KKyNkZWZpbmUJb3RQcm9jCQkzCS8qIHByb2NlZHVyZSAqLworI2RlZmluZSBvdElubGluZQk0CS8qIGlubGluZSBwcm9jZWR1cmUgKi8KKyNkZWZpbmUgb3RFbmQJCTUJLyogd2hhdGV2ZXIgeW91IHN0YXJ0ZWQgKi8KKyNkZWZpbmUgb3RNYXgJCTYJLyogS0VFUCBVUCBUTyBEQVRFICovCisjZW5kaWYgLyogKF9NRkcgPT0gX01JUFMpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdGljMzAuaCBiL2luY2x1ZGUvY29mZi90aWMzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvdGljMzAuaApAQCAtMCwwICsxLDIwMyBAQAorLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDM1ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKworI2RlZmluZQlUSUMzME1BR0lDCTB4QzAwMAorCisjZGVmaW5lIFRJQzMwQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVRJQzMwTUFHSUMpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworfQorQU9VVEhEUjsKKworCisjZGVmaW5lIEFPVVRIRFJTWiAyOAorI2RlZmluZSBBT1VUU1ogMjgKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk4CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisgIHN0cnVjdCB7CisJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCXVuaW9uIHsKKwkgIHN0cnVjdCB7CisJCWNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworCSAgfSB4X2xuc3o7CisJICBjaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KKwl9IHhfbWlzYzsKKwl1bmlvbiB7CisJICBzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCisJCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQljaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKwkgIH0geF9mY247CisJICBzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07CisJICB9IHhfYXJ5OworCX0geF9mY25hcnk7CisJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKyAgfSB4X3N5bTsKKyAgCisgIHVuaW9uIHsKKwljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJc3RydWN0IHsKKwkgIGNoYXIgeF96ZXJvZXNbNF07CisJICBjaGFyIHhfb2Zmc2V0WzRdOworCX0geF9uOworICB9IHhfZmlsZTsKKyAgCisgIHN0cnVjdCB7CisJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLworCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KKyAgfSB4X3NjbjsKKyAgCisgIHN0cnVjdCB7CisJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLworCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KKyAgfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworICAKKworfTsKKworI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAorI2RlZmluZQlTWU1FU1oJMTgJCisjZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKKyNkZWZpbmUJQVVYRVNaCTE4CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKKyAgIHR5cGVzIG9uIHRoZSB6OGsgZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQorICAgb2Zmc2V0IC0gZWcgd2l0aCBzZWdtZW50cyAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgeworICBjaGFyIHJfdmFkZHJbNF07CisgIGNoYXIgcl9zeW1uZHhbNF07CisgIGNoYXIgcl9vZmZzZXRbNF07CisgIGNoYXIgcl90eXBlWzJdOworICBjaGFyIHJfc3R1ZmZbMl07Cit9OworCisKKyNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCisjZGVmaW5lIFJFTFNaIDE2CisKKy8qIFRNUzMyMEMzMCByZWxvY2F0aW9uIHR5cGVzLiAgKi8KKworI2RlZmluZSBSX1RJQzMwX0FCUzE2IDB4MTAwICAvKiAxNiBiaXQgYWJzb2x1dGUuICovCisjZGVmaW5lIFJfVElDMzBfQUJTMjQgMHgxMDEgIC8qIDI0IGJpdCBhYnNvbHV0ZS4gKi8KKyNkZWZpbmUgUl9USUMzMF9BQlMzMiAweDEwMiAgLyogMzIgYml0IGFic29sdXRlLiAqLworI2RlZmluZSBSX1RJQzMwX0xEUCAgIDB4MTAzICAvKiBMRFAgYml0cyAyMy0xNiB0byA3LTAuICovCisjZGVmaW5lIFJfVElDMzBfUEMxNiAgMHgxMDQgIC8qIDE2IGJpdCBwYyByZWxhdGl2ZS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi90aWM4MC5oIGIvaW5jbHVkZS9jb2ZmL3RpYzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MzhmNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29mZi90aWM4MC5oCkBAIC0wLDAgKzEsMjI4IEBACisvKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFRJIFRNUzMyMEM4MCAoTVZQKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworCWNoYXIgZl90YXJnZXRfaWRbMl07CS8qIHRhcmdldCBpZCAoVEljODAgc3BlY2lmaWMpCSovCit9OworCisjZGVmaW5lCVRJQzgwX0FSQ0hfTUFHSUMJMHgwQzEJLyogR29lcyBpbiB0aGUgZmlsZSBoZWFkZXIgbWFnaWMgbnVtYmVyIGZpZWxkICovCisjZGVmaW5lIFRJQzgwX1RBUkdFVF9JRAkJMHg5NQkvKiBHb2VzIGluIHRoZSB0YXJnZXQgaWQgZmllbGQgKi8KKworI2RlZmluZSBUSUM4MEJBRE1BRyh4KSAoKHgpLmZfbWFnaWMgIT0gVElDODBfQVJDSF9NQUdJQykKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIyCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgc3RydWN0IAoreworICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLworICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLworICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCisgIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCisgIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KKyAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KK30KK0FPVVRIRFI7CisKKyNkZWZpbmUgVElDODBfQU9VVEhEUl9NQUdJQwkweDEwOAkvKiBHb2VzIGluIHRoZSBvcHRpb25hbCBmaWxlIGhlYWRlciBtYWdpYyBudW1iZXIgZmllbGQgKi8KKworI2RlZmluZSBBT1VUSERSU1ogMjgKKyNkZWZpbmUgQU9VVFNaIDI4CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisJY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworCWNoYXIJCXNfcmVzZXJ2ZWRbMV07CS8qIHJlc2VydmVkIChUSWM4MCBzcGVjaWZpYykJKi8KKwljaGFyCQlzX21lbXBhZ2VbMV07CS8qIG1lbW9yeSBwYWdlIG51bWJlciAoVEljODApCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisjZGVmaW5lIF9DSU5JVAkiLmNpbml0IgorI2RlZmluZSBfQ09OU1QJIi5jb25zdCIKKyNkZWZpbmUgX1NXSVRDSAkiLnN3aXRjaCIKKyNkZWZpbmUgX1NUQUNLCSIuc3RhY2siCisjZGVmaW5lIF9TWVNNRU0JIi5zeXNtZW0iCisKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CQkJLyogbGluZSBudW1iZXIJKi8KK307CisKKyNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKKyNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKKworI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubworI2RlZmluZQlMSU5FU1oJNgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCisjZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07CisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOworICAgIH0gZTsKKyAgfSBlOworICBjaGFyIGVfdmFsdWVbNF07CisgIGNoYXIgZV9zY251bVsyXTsKKyAgY2hhciBlX3R5cGVbMl07CisgIGNoYXIgZV9zY2xhc3NbMV07CisgIGNoYXIgZV9udW1hdXhbMV07Cit9OworCisKKworI2RlZmluZSBOX0JUTUFTSwkoMDE3KQorI2RlZmluZSBOX1RNQVNLCQkoMDYwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisgIAorLyogRklYTUUgLSBuZWVkIHRvIGNvcnJlbGF0ZSB3aXRoIFRJYzgwIENvZGUgR2VuZXJhdGlvbiBUb29scyBVc2VyJ3MgR3VpZGUsIENHOkEtMjUgKi8KK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCisgICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQorICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfcmVzZXJ2ZWRbMl07CisgIGNoYXIgcl90eXBlWzJdOworfTsKKworCisjZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYworI2RlZmluZSBSRUxTWiAxMgorCisvKiBUSWM4MCByZWxvY2F0aW9uIHR5cGVzLiAqLworCisjZGVmaW5lIFJfQUJTCQkweDAwCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIC0gbm8gcmVsb2NhdGlvbiAqLworI2RlZmluZSBSX1JFTExPTkdYCTB4MTEJCS8qIFBQOiAzMiBiaXRzLCBkaXJlY3QgKi8KKyNkZWZpbmUgUl9QUEJBU0UJMHgzNAkJLyogUFA6IEdsb2JhbCBiYXNlIGFkZHJlc3MgdHlwZSAqLworI2RlZmluZSBSX1BQTEJBU0UJMHgzNQkJLyogUFA6IExvY2FsIGJhc2UgYWRkcmVzcyB0eXBlICovCisjZGVmaW5lIFJfUFAxNQkJMHgzOAkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0ICovCisjZGVmaW5lIFJfUFAxNVcJCTB4MzkJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgUl9QUDE1SAkJMHgzQQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLworI2RlZmluZSBSX1BQMTZCCQkweDNCCQkvKiBQUDogR2xvYmFsIDE2IGJpdCBvZmZzZXQgZm9yIGJ5dGVzICovCisjZGVmaW5lIFJfUFBMMTUJCTB4M0MJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0ICovCisjZGVmaW5lIFJfUFBMMTVXCTB4M0QJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSX1BQTDE1SAkweDNFCQkvKiBQUDogTG9jYWwgMTUgYml0IG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUl9QUEwxNkIJMHgzRgkJLyogUFA6IExvY2FsIDE2IGJpdCBvZmZzZXQgZm9yIGJ5dGVzICovCisjZGVmaW5lIFJfUFBOMTUJCTB4NDAJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCAqLworI2RlZmluZSBSX1BQTjE1VwkweDQxCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSA0ICovCisjZGVmaW5lIFJfUFBOMTVICTB4NDIJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KKyNkZWZpbmUgUl9QUE4xNkIJMHg0MwkJLyogUFA6IEdsb2JhbCAxNiBiaXQgbmVnYXRpdmUgYnl0ZSBvZmZzZXQgKi8KKyNkZWZpbmUgUl9QUExOMTUJMHg0NAkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgKi8KKyNkZWZpbmUgUl9QUExOMTVXCTB4NDUJCS8qIFBQOiBMb2NhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLworI2RlZmluZSBSX1BQTE4xNUgJMHg0NgkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSAyICovCisjZGVmaW5lIFJfUFBMTjE2QgkweDQ3CQkvKiBQUDogTG9jYWwgMTYgYml0IG5lZ2F0aXZlIGJ5dGUgb2Zmc2V0ICovCisjZGVmaW5lIFJfTVBQQ1IxNVcJMHg0RQkJLyogTVA6IDE1IGJpdCBQQy1yZWxhdGl2ZSBkaXZpZGVkIGJ5IDQgKi8KKyNkZWZpbmUgUl9NUFBDUgkJMHg0RgkJLyogTVA6IDMyIGJpdCBQQy1yZWxhdGl2ZSBkaXZpZGVkIGJ5IDQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi93NjUuaCBiL2luY2x1ZGUvY29mZi93NjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc4YzIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL3c2NS5oCkBAIC0wLDAgKzEsMjAxIEBACisvKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFdEQyA2NTgxNiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7CisJY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLworCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLworCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KKwljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLworCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLworfTsKKworCisKKyNkZWZpbmUJVzY1TUFHSUMJMHg2NTAwCisKKworI2RlZmluZSBXNjVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9VzY1TUFHSUMpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJMjAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCisgIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KKyAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLworICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLworICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLworfQorQU9VVEhEUjsKKworCisjZGVmaW5lIEFPVVRIRFJTWiAyOAorI2RlZmluZSBBT1VUU1ogMjgKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLworCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLworCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCisJY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KKwljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLworCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KKwljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisKKworI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgorI2RlZmluZQlTQ05IU1oJNDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk4CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKworCisjZGVmaW5lIE5fQlRNQVNLCSgwMTcpCisjZGVmaW5lIE5fVE1BU0sJCSgwNjApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCisKK3VuaW9uIGV4dGVybmFsX2F1eGVudCB7CisJc3RydWN0IHsKKwkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KKwkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCisJCQl9IHhfbG5zejsKKwkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLworCQl9IHhfbWlzYzsKKwkJdW5pb24geworCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworCQkJfSB4X2ZjbjsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KKwkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOworCQkJfSB4X2FyeTsKKwkJfSB4X2ZjbmFyeTsKKwkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KKwl9IHhfc3ltOworCisJdW5pb24geworCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQljaGFyIHhfemVyb2VzWzRdOworCQkJY2hhciB4X29mZnNldFs0XTsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCisJCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCisJfSB4X3NjbjsKKworICAgICAgICBzdHJ1Y3QgeworCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisJCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLworCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCisJfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLworCisKK307CisKKyNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKKyNkZWZpbmUJU1lNRVNaCTE4CQorI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50CisjZGVmaW5lCUFVWEVTWgkxOAorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCisgICB0eXBlcyBvbiB0aGUgdzY1IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKKyAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsKKyAgY2hhciByX3N5bW5keFs0XTsKKyAgY2hhciByX29mZnNldFs0XTsKKyAgY2hhciByX3R5cGVbMl07CisgIGNoYXIgcl9zdHVmZlsyXTsKK307CisKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTYKKworCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3dlMzJrLmggYi9pbmNsdWRlL2NvZmYvd2UzMmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNmYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb2ZmL3dlMzJrLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3Igd2UzMmsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKworLyogQml0cyBmb3IgZl9mbGFnczoKKyAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmFsIHJlZmVyZW5jZXMpCisgKglGX0xOTk8JCWxpbmUgbnVtYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKKyAqLworCisjZGVmaW5lIEZfUkVMRkxHCSgweDAwMDEpCisjZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikKKyNkZWZpbmUgRl9MTk5PCQkoMHgwMDA0KQorI2RlZmluZSBGX0xTWU1TCQkoMHgwMDA4KQorI2RlZmluZQlGX0JNMzJCCQkoMDAyMDAwMCkKKyNkZWZpbmUJRl9CTTMyTUFVCSgwMDQwMDAwKQorCisjZGVmaW5lCVdFMzJLTUFHSUMJMHgxNzAJLyogd2UzMmsgc2FucyB0cmFuc2ZlciB2ZWN0b3IgKi8KKyNkZWZpbmUgRkJPTUFHSUMJMHgxNzAJLyogd2UzMmsgc2FucyB0cmFuc2ZlciB2ZWN0b3IgKi8KKyNkZWZpbmUgTVRWTUFHSUMJMHgxNzEJLyogd2UzMmsgd2l0aCB0cmFuc2ZlciB2ZWN0b3IgKi8KKyNkZWZpbmUgUkJPTUFHSUMJMHgxNzIJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgV0UzMktCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBXRTMyS01BR0lDKSBcCisJCQkmJiAoKHgpLmZfbWFnaWMgIT0gRkJPTUFHSUMpIFwKKwkJCSYmICgoeCkuZl9tYWdpYyAhPSBSQk9NQUdJQykgXAorCQkJJiYgKCh4KS5mX21hZ2ljICE9IE1UVk1BR0lDKSkKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgc3RydWN0IAoreworICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLworICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLworICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCisgIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCisgIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KKyAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KK30KK0FPVVRIRFI7CisKKyNkZWZpbmUgQU9VVFNaIDI4CisjZGVmaW5lIEFPVVRIRFJTWiAyOAorCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0cnVjdCBleHRlcm5hbF9zY25oZHIgeworCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KKwljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KKwljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCisJY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCisJY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KKwljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLworCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCisJY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLworCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KK307CisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTQwCisKKy8qCisgKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKKyAqLworI2RlZmluZSBfVEVYVAkiLnRleHQiCisjZGVmaW5lIF9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgX0JTUwkiLmJzcyIKKyNkZWZpbmUgX1RWCSIudHYiCisjZGVmaW5lIF9JTklUCSIuaW5pdCIKKyNkZWZpbmUgX0ZJTkkJIi5maW5pIgorCisvKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCisgKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KKyAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCisgKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3N0cnVjdCBleHRlcm5hbF9saW5lbm8geworCXVuaW9uIHsKKwkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCisJCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCisJfSBsX2FkZHI7CisJY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworCisjZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCisjZGVmaW5lCUxJTkVTWgk2CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLworI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKK3N0cnVjdCBleHRlcm5hbF9zeW1lbnQgCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciBlX3plcm9lc1s0XTsKKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07CisgICAgfSBlOworICB9IGU7CisgIGNoYXIgZV92YWx1ZVs0XTsKKyAgY2hhciBlX3NjbnVtWzJdOworICBjaGFyIGVfdHlwZVsyXTsKKyAgY2hhciBlX3NjbGFzc1sxXTsKKyAgY2hhciBlX251bWF1eFsxXTsKK307CisKKyNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKKyNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCisjZGVmaW5lIE5fQlRTSEZUCSg0KQorI2RlZmluZSBOX1RTSElGVAkoMikKKyAgCit1bmlvbiBleHRlcm5hbF9hdXhlbnQgeworCXN0cnVjdCB7CisJCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKwkJdW5pb24geworCQkJc3RydWN0IHsKKwkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworCQkJfSB4X2xuc3o7CisJCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KKwkJfSB4X21pc2M7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKwkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKwkJCX0geF9mY247CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKKwkJCX0geF9hcnk7CisJCX0geF9mY25hcnk7CisJCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCisJfSB4X3N5bTsKKworCXVuaW9uIHsKKwkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOworCQlzdHJ1Y3QgeworCQkJY2hhciB4X3plcm9lc1s0XTsKKwkJCWNoYXIgeF9vZmZzZXRbNF07CisJCX0geF9uOworCX0geF9maWxlOworCisJc3RydWN0IHsKKwkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLworCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworCX0geF9zY247CisKKyAgICAgICAgc3RydWN0IHsKKwkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLworCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KKwkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLworCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KKworCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkxOAkKKyNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAorI2RlZmluZQlBVVhFU1oJMTgKKworCisjCWRlZmluZSBfRVRFWFQJImV0ZXh0IgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCisKKworc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOworICBjaGFyIHJfc3ltbmR4WzRdOworICBjaGFyIHJfdHlwZVsyXTsKK307CisKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTAKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3o4ay5oIGIvaW5jbHVkZS9jb2ZmL3o4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Yjg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvZmYvejhrLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgWmlsb2cgWjgwME4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKworLyogVHlwZSBvZiBjcHUgaXMgc3RvcmVkIGluIGZsYWdzICovCisjZGVmaW5lIEZfWjgwMDEgICAgMHgxMDAwCisjZGVmaW5lIEZfWjgwMDIgICAgMHgyMDAwCisjZGVmaW5lIEZfTUFDSE1BU0sgMHhmMDAwCisKKyNkZWZpbmUJWjhLTUFHSUMJMHg4MDAwCisKKyNkZWZpbmUgWjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPVo4S01BR0lDKSkKKworI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKKyNkZWZpbmUJRklMSFNaCTIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgc3RydWN0IAoreworICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLworICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLworICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCisgIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCisgIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisgIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KKyAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KK30KK0FPVVRIRFI7CisKKworI2RlZmluZSBBT1VUSERSU1ogMjgKKyNkZWZpbmUgQU9VVFNaIDI4CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RydWN0IGV4dGVybmFsX3NjbmhkciB7CisJY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLworCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCisJY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLworCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KKwljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLworfTsKKworLyoKKyAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucworICovCisjZGVmaW5lIF9URVhUCSIudGV4dCIKKyNkZWZpbmUgX0RBVEEJIi5kYXRhIgorI2RlZmluZSBfQlNTCSIuYnNzIgorCisKKyNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKKyNkZWZpbmUJU0NOSFNaCTQwCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgorICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCisgKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQorICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCitzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKKwl1bmlvbiB7CisJCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLworCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworCX0gbF9hZGRyOworCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KK307CisKKyNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKKyNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKKworI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubworI2RlZmluZQlMSU5FU1oJOAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KKyNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCisjZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCitzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAoreworICB1bmlvbiB7CisgICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07CisgICAgc3RydWN0IHsKKyAgICAgIGNoYXIgZV96ZXJvZXNbNF07CisgICAgICBjaGFyIGVfb2Zmc2V0WzRdOworICAgIH0gZTsKKyAgfSBlOworICBjaGFyIGVfdmFsdWVbNF07CisgIGNoYXIgZV9zY251bVsyXTsKKyAgY2hhciBlX3R5cGVbMl07CisgIGNoYXIgZV9zY2xhc3NbMV07CisgIGNoYXIgZV9udW1hdXhbMV07Cit9OworCisKKworI2RlZmluZSBOX0JUTUFTSwkoMDE3KQorI2RlZmluZSBOX1RNQVNLCQkoMDYwKQorI2RlZmluZSBOX0JUU0hGVAkoNCkKKyNkZWZpbmUgTl9UU0hJRlQJKDIpCisgIAorCit1bmlvbiBleHRlcm5hbF9hdXhlbnQgeworCXN0cnVjdCB7CisJCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKwkJdW5pb24geworCQkJc3RydWN0IHsKKwkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLworCQkJfSB4X2xuc3o7CisJCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KKwkJfSB4X21pc2M7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KKwkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KKwkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KKwkJCX0geF9mY247CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKKwkJCX0geF9hcnk7CisJCX0geF9mY25hcnk7CisJCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCisJfSB4X3N5bTsKKworCXVuaW9uIHsKKwkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOworCQlzdHJ1Y3QgeworCQkJY2hhciB4X3plcm9lc1s0XTsKKwkJCWNoYXIgeF9vZmZzZXRbNF07CisJCX0geF9uOworCX0geF9maWxlOworCisJc3RydWN0IHsKKwkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLworCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworCX0geF9zY247CisKKyAgICAgICAgc3RydWN0IHsKKwkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLworCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KKwkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLworCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KKworCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50CisjZGVmaW5lCVNZTUVTWgkxOAkKKyNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAorI2RlZmluZQlBVVhFU1oJMTgKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYworICAgdHlwZXMgb24gdGhlIHo4ayBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCisgICBvZmZzZXQgLSBlZyB3aXRoIHNlZ21lbnRzICovCisKK3N0cnVjdCBleHRlcm5hbF9yZWxvYyB7CisgIGNoYXIgcl92YWRkcls0XTsKKyAgY2hhciByX3N5bW5keFs0XTsKKyAgY2hhciByX29mZnNldFs0XTsKKyAgY2hhciByX3R5cGVbMl07CisgIGNoYXIgcl9zdHVmZlsyXTsKK307CisKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKKyNkZWZpbmUgUkVMU1ogMTYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZW1hbmdsZS5oIGIvaW5jbHVkZS9kZW1hbmdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmU1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RlbWFuZ2xlLmgKQEAgLTAsMCArMSw5NSBAQAorLyogRGVmcyBmb3IgaW50ZXJmYWNlIHRvIGRlbWFuZ2xlcnMuCisgICBDb3B5cmlnaHQgMTk5MiwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmICFkZWZpbmVkIChERU1BTkdMRV9IKQorI2RlZmluZSBERU1BTkdMRV9ICisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorCisvKiBPcHRpb25zIHBhc3NlZCB0byBjcGx1c19kZW1hbmdsZSAoaW4gMm5kIHBhcmFtZXRlcikuICovCisKKyNkZWZpbmUgRE1HTF9OT19PUFRTCTAJCS8qIEZvciByZWFkYWJpbGl0eS4uLiAqLworI2RlZmluZSBETUdMX1BBUkFNUwkoMSA8PCAwKQkvKiBJbmNsdWRlIGZ1bmN0aW9uIGFyZ3MgKi8KKyNkZWZpbmUgRE1HTF9BTlNJCSgxIDw8IDEpCS8qIEluY2x1ZGUgY29uc3QsIHZvbGF0aWxlLCBldGMgKi8KKyNkZWZpbmUgRE1HTF9KQVZBCSgxIDw8IDIpCS8qIERlbWFuZ2xlIGFzIEphdmEgcmF0aGVyIHRoYW4gQysrLiAqLworCisjZGVmaW5lIERNR0xfQVVUTwkoMSA8PCA4KQorI2RlZmluZSBETUdMX0dOVQkoMSA8PCA5KQorI2RlZmluZSBETUdMX0xVQ0lECSgxIDw8IDEwKQorI2RlZmluZSBETUdMX0FSTQkoMSA8PCAxMSkKKyNkZWZpbmUgRE1HTF9IUCAJKDEgPDwgMTIpICAgICAgIC8qIEZvciB0aGUgSFAgYUNDIGNvbXBpbGVyOyBzYW1lIGFzIEFSTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGVtcGxhdGUgYXJndW1lbnRzLCBldGMuICovCisjZGVmaW5lIERNR0xfRURHCSgxIDw8IDEzKQorCisvKiBJZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIHVzZSAnY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlJyBhcyB0aGUgZGVmYXVsdC4gKi8KKyNkZWZpbmUgRE1HTF9TVFlMRV9NQVNLIChETUdMX0FVVE98RE1HTF9HTlV8RE1HTF9MVUNJRHxETUdMX0FSTXxETUdMX0hQfERNR0xfRURHKQorCisvKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBkZW1hbmdsaW5nIHN0eWxlcy4KKworICAgTHVjaWQgYW5kIEFSTSBzdHlsZXMgYXJlIHN0aWxsIGtlcHQgbG9naWNhbGx5IGRpc3RpbmN0LCBldmVuIHRob3VnaAorICAgdGhleSBub3cgYm90aCBiZWhhdmUgaWRlbnRpY2FsbHkuICBUaGUgcmVzdWx0aW5nIHN0eWxlIGlzIGFjdHVhbCB0aGUKKyAgIHVuaW9uIG9mIGJvdGguICBJLkUuIGVpdGhlciBzdHlsZSByZWNvZ25pemVzIGJvdGggIl9fcHRfXyIgYW5kICJfX3JmX18iCisgICBmb3Igb3BlcmF0b3IgIi0+IiwgZXZlbiB0aG91Z2ggdGhlIGZpcnN0IGlzIGx1Y2lkIHN0eWxlIGFuZCB0aGUgc2Vjb25kCisgICBpcyBBUk0gc3R5bGUuIChGSVhNRT8pICovCisKK2V4dGVybiBlbnVtIGRlbWFuZ2xpbmdfc3R5bGVzCit7CisgIHVua25vd25fZGVtYW5nbGluZyA9IDAsCisgIGF1dG9fZGVtYW5nbGluZyA9IERNR0xfQVVUTywKKyAgZ251X2RlbWFuZ2xpbmcgPSBETUdMX0dOVSwKKyAgbHVjaWRfZGVtYW5nbGluZyA9IERNR0xfTFVDSUQsCisgIGFybV9kZW1hbmdsaW5nID0gRE1HTF9BUk0sCisgIGhwX2RlbWFuZ2xpbmcgPSBETUdMX0hQLAorICBlZGdfZGVtYW5nbGluZyA9IERNR0xfRURHCit9IGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZTsKKworLyogRGVmaW5lIHN0cmluZyBuYW1lcyBmb3IgdGhlIHZhcmlvdXMgZGVtYW5nbGluZyBzdHlsZXMuICovCisKKyNkZWZpbmUgQVVUT19ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiYXV0byIKKyNkZWZpbmUgR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJnbnUiCisjZGVmaW5lIExVQ0lEX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJsdWNpZCIKKyNkZWZpbmUgQVJNX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJhcm0iCisjZGVmaW5lIEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJocCIKKyNkZWZpbmUgRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJlZGciCisKKy8qIFNvbWUgbWFjcm9zIHRvIHRlc3Qgd2hhdCBkZW1hbmdsaW5nIHN0eWxlIGlzIGFjdGl2ZS4gKi8KKworI2RlZmluZSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlCisjZGVmaW5lIEFVVE9fREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0FVVE8pCisjZGVmaW5lIEdOVV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfR05VKQorI2RlZmluZSBMVUNJRF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfTFVDSUQpCisjZGVmaW5lIEFSTV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfQVJNKQorI2RlZmluZSBIUF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfSFApCisjZGVmaW5lIEVER19ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfRURHKQorCitleHRlcm4gY2hhciAqCitjcGx1c19kZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykpOworCitleHRlcm4gaW50CitjcGx1c19kZW1hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBjaGFyICpyZXN1bHQsIGludCBvcHRpb25zKSk7CisKK2V4dGVybiBjb25zdCBjaGFyICoKK2NwbHVzX21hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBpbnQgb3B0aW9ucykpOworCisvKiBOb3RlOiBUaGlzIHNldHMgZ2xvYmFsIHN0YXRlLiAgRklYTUUgaWYgeW91IGNhcmUgYWJvdXQgbXVsdGktdGhyZWFkaW5nLiAqLworCitleHRlcm4gdm9pZAorc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyBQQVJBTVMgKChpbnQgY2gpKTsKKworI2VuZGlmCS8qIERFTUFOR0xFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlzLWFzbS5oIGIvaW5jbHVkZS9kaXMtYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2ZWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZGlzLWFzbS5oCkBAIC0wLDAgKzEsMjQzIEBACisvKiBJbnRlcmZhY2UgYmV0d2VlbiB0aGUgb3Bjb2RlIGxpYnJhcnkgYW5kIGl0cyBjYWxsZXJzLgorICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydCwgMTk5My4KKworICAgVGhlIG9wY29kZSBsaWJyYXJ5IChsaWJvcGNvZGVzLmEpIHByb3ZpZGVzIGluc3RydWN0aW9uIGRlY29kZXJzIGZvcgorICAgYSBsYXJnZSB2YXJpZXR5IG9mIGluc3RydWN0aW9uIHNldHMsIGNhbGxhYmxlIHdpdGggYW4gaWRlbnRpY2FsCisgICBpbnRlcmZhY2UsIGZvciBtYWtpbmcgaW5zdHJ1Y3Rpb24tcHJvY2Vzc2luZyBwcm9ncmFtcyBtb3JlIGluZGVwZW5kZW50CisgICBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGJlaW5nIHByb2Nlc3NlZC4gICovCisKKyNpZm5kZWYgRElTX0FTTV9ICisjZGVmaW5lIERJU19BU01fSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJiZmQuaCIKKwordHlwZWRlZiBpbnQgKCpmcHJpbnRmX2Z0eXBlKSBQQVJBTVMoKFBUUiwgY29uc3QgY2hhciosIC4uLikpOworCitlbnVtIGRpc19pbnNuX3R5cGUgeworICBkaXNfbm9uaW5zbiwJCQkvKiBOb3QgYSB2YWxpZCBpbnN0cnVjdGlvbiAqLworICBkaXNfbm9uYnJhbmNoLAkJLyogTm90IGEgYnJhbmNoIGluc3RydWN0aW9uICovCisgIGRpc19icmFuY2gsCQkJLyogVW5jb25kaXRpb25hbCBicmFuY2ggKi8KKyAgZGlzX2NvbmRicmFuY2gsCQkvKiBDb25kaXRpb25hbCBicmFuY2ggKi8KKyAgZGlzX2pzciwJCQkvKiBKdW1wIHRvIHN1YnJvdXRpbmUgKi8KKyAgZGlzX2NvbmRqc3IsCQkJLyogQ29uZGl0aW9uYWwganVtcCB0byBzdWJyb3V0aW5lICovCisgIGRpc19kcmVmLAkJCS8qIERhdGEgcmVmZXJlbmNlIGluc3RydWN0aW9uICovCisgIGRpc19kcmVmMgkJCS8qIFR3byBkYXRhIHJlZmVyZW5jZXMgaW4gaW5zdHJ1Y3Rpb24gKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHBhc3NlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGluZyByb3V0aW5lLCAKKyAgIGFuZCBpcyBwYXNzZWQgYmFjayBvdXQgaW50byBlYWNoIGNhbGxiYWNrLiAgVGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkCisgICBmb3IgY29udmV5aW5nIGluZm9ybWF0aW9uIGZyb20geW91ciBtYWluIHJvdXRpbmUgaW50byB5b3VyIGNhbGxiYWNrcywKKyAgIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIChzdWNoIGFzIHRoZQorICAgYWRkcmVzc2VzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMpLCBvciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbgorICAgYmFjayBmcm9tIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyB0byB0aGVpciBjYWxsZXJzLgorCisgICBJdCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyBmaXJzdCBwYXNzZWQ7IHRoaXMgY2FuIGJlIGRvbmUKKyAgIGJ5IGhhbmQsIG9yIHVzaW5nIG9uZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gbWFjcm9zIGJlbG93LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyB7CisgIGZwcmludGZfZnR5cGUgZnByaW50Zl9mdW5jOworICBQVFIgc3RyZWFtOworICBQVFIgYXBwbGljYXRpb25fZGF0YTsKKworICAvKiBUYXJnZXQgZGVzY3JpcHRpb24uICBXZSBjb3VsZCByZXBsYWNlIHRoaXMgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGJmZCwKKyAgICAgYnV0IHRoYXQgd291bGQgcmVxdWlyZSBvbmUuICBUaGVyZSBjdXJyZW50bHkgaXNuJ3QgYW55IHN1Y2ggcmVxdWlyZW1lbnQKKyAgICAgc28gdG8gYXZvaWQgaW50cm9kdWNpbmcgb25lIHdlIHJlY29yZCB0aGVzZSBleHBsaWNpdGx5LiAgKi8KKyAgLyogVGhlIGJmZF9mbGF2b3VyLiAgVGhpcyBjYW4gYmUgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIuICAqLworICBlbnVtIGJmZF9mbGF2b3VyIGZsYXZvdXI7CisgIC8qIFRoZSBiZmRfYXJjaCB2YWx1ZS4gICovCisgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAvKiBUaGUgYmZkX21hY2ggdmFsdWUuICAqLworICB1bnNpZ25lZCBsb25nIG1hY2g7CisgIC8qIEVuZGlhbm5lc3MgKGZvciBiaS1lbmRpYW4gY3B1cykuICBNb25vLWVuZGlhbiBjcHVzIGNhbiBpZ25vcmUgdGhpcy4gICovCisgIGVudW0gYmZkX2VuZGlhbiBlbmRpYW47CisKKyAgLyogQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc3ltYm9scyBlaXRoZXIgYXQgdGhlIGxvY2F0aW9uIGJlaW5nIGRpc2Fzc2VtYmxlZAorICAgICBvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGRpc2Fzc2VtYmxlZC4gIFRoZSBhcnJheSBpcyBzb3J0ZWQKKyAgICAgc28gdGhhdCB0aGUgZmlyc3Qgc3ltYm9sIGlzIGludGVuZGVkIHRvIGJlIHRoZSBvbmUgdXNlZC4gIFRoZSBvdGhlcnMgYXJlCisgICAgIHByZXNlbnQgZm9yIGFueSBtaXNjLiBwdXJwb3Nlcy4gIFRoaXMgaXMgbm90IHNldCByZWxpYWJseSwgYnV0IGlmIGl0IGlzCisgICAgIG5vdCBOVUxMLCBpdCBpcyBjb3JyZWN0LiAgKi8KKyAgYXN5bWJvbCAqKnN5bWJvbHM7CisgIC8qIE51bWJlciBvZiBzeW1ib2xzIGluIGFycmF5LiAgKi8KKyAgaW50IG51bV9zeW1ib2xzOworCisgIC8qIEZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlci4KKyAgICAgVGhlIHRvcCAxNiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgcHVibGljIHVzZSAoYW5kIGFyZSBkb2N1bWVudGVkIGhlcmUpLgorICAgICBUaGUgYm90dG9tIDE2IGJpdHMgYXJlIGZvciB0aGUgaW50ZXJuYWwgdXNlIG9mIHRoZSBkaXNhc3NlbWJsZXIuICAqLworICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2RlZmluZSBJTlNOX0hBU19SRUxPQwkweDgwMDAwMDAwCisgIFBUUiBwcml2YXRlX2RhdGE7CisKKyAgLyogRnVuY3Rpb24gdXNlZCB0byBnZXQgYnl0ZXMgdG8gZGlzYXNzZW1ibGUuICBNRU1BRERSIGlzIHRoZQorICAgICBhZGRyZXNzIG9mIHRoZSBzdHVmZiB0byBiZSBkaXNhc3NlbWJsZWQsIE1ZQUREUiBpcyB0aGUgYWRkcmVzcyB0bworICAgICBwdXQgdGhlIGJ5dGVzIGluLCBhbmQgTEVOR1RIIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgSU5GTyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuCisgICAgIFJldHVybnMgYW4gZXJybm8gdmFsdWUgb3IgMCBmb3Igc3VjY2Vzcy4gICovCisgIGludCAoKnJlYWRfbWVtb3J5X2Z1bmMpCisgICAgUEFSQU1TICgoYmZkX3ZtYSBtZW1hZGRyLCBiZmRfYnl0ZSAqbXlhZGRyLCBpbnQgbGVuZ3RoLAorCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKKworICAvKiBGdW5jdGlvbiB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGlmIHdlIGdldCBhbiBlcnJvciB0aGF0IHdlIGNhbid0CisgICAgIHJlY292ZXIgZnJvbS4gIFNUQVRVUyBpcyB0aGUgZXJybm8gdmFsdWUgZnJvbSByZWFkX21lbW9yeV9mdW5jIGFuZAorICAgICBNRU1BRERSIGlzIHRoZSBhZGRyZXNzIHRoYXQgd2Ugd2VyZSB0cnlpbmcgdG8gcmVhZC4gIElORk8gaXMgYQorICAgICBwb2ludGVyIHRvIHRoaXMgc3RydWN0LiAgKi8KKyAgdm9pZCAoKm1lbW9yeV9lcnJvcl9mdW5jKQorICAgIFBBUkFNUyAoKGludCBzdGF0dXMsIGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKKworICAvKiBGdW5jdGlvbiBjYWxsZWQgdG8gcHJpbnQgQUREUi4gICovCisgIHZvaWQgKCpwcmludF9hZGRyZXNzX2Z1bmMpCisgICAgUEFSQU1TICgoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOworCisgIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXQgdGhlIGdpdmVuIEFERFIuCisgICAgIElmIHRoZXJlIGlzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLCBvdGhlcndpc2UgaXQgcmV0dXJucyAwLgorICAgICBUaGlzIGlzIHVzZWQgYnkgcG9ydHMgd2hpY2ggc3VwcG9ydCBhbiBvdmVybGF5IG1hbmFnZXIgd2hlcmUKKyAgICAgdGhlIG92ZXJsYXkgbnVtYmVyIGlzIGhlbGQgaW4gdGhlIHRvcCBwYXJ0IG9mIGFuIGFkZHJlc3MuICBJbgorICAgICBzb21lIGNpcmN1bXN0YW5jZXMgd2Ugd2FudCB0byBpbmNsdWRlIHRoZSBvdmVybGF5IG51bWJlciBpbiB0aGUKKyAgICAgYWRkcmVzcywgKG5vcm1hbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoCisgICAgIHRoYXQgYWRkcmVzcyksIGJ1dCBzb21ldGltZXMgd2Ugd2FudCB0byBtYXNrIG91dCB0aGUgb3ZlcmxheSBiaXRzLiAgKi8KKyAgaW50ICgqIHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMpCisgICAgUEFSQU1TICgoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm8pKTsKKworICAvKiBUaGVzZSBhcmUgZm9yIGJ1ZmZlcl9yZWFkX21lbW9yeS4gICovCisgIGJmZF9ieXRlICpidWZmZXI7CisgIGJmZF92bWEgYnVmZmVyX3ZtYTsKKyAgaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgLyogVGhpcyB2YXJpYWJsZSBtYXkgYmUgc2V0IGJ5IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLiAgSXQgc3VnZ2VzdHMKKyAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2JqZHVtcCBzaG91bGQgZGlzcGxheSBvbiBhIHNpbmdsZSBsaW5lLiAgSWYKKyAgICAgIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyIHNldHMgdGhpcywgaXQgc2hvdWxkIGFsd2F5cyBzZXQgaXQgdG8KKyAgICAgIHRoZSBzYW1lIHZhbHVlIGluIG9yZGVyIHRvIGdldCByZWFzb25hYmxlIGxvb2tpbmcgb3V0cHV0LiAgKi8KKyAgaW50IGJ5dGVzX3Blcl9saW5lOworCisgIC8qIHRoZSBuZXh0IHR3byB2YXJpYWJsZXMgY29udHJvbCB0aGUgd2F5IG9iamR1bXAgZGlzcGxheXMgdGhlIHJhdyBkYXRhICovCisgIC8qIEZvciBleGFtcGxlLCBpZiBieXRlc19wZXJfbGluZSBpcyA4IGFuZCBieXRlc19wZXJfY2h1bmsgaXMgNCwgdGhlICovCisgIC8qIG91dHB1dCB3aWxsIGxvb2sgbGlrZSB0aGlzOgorICAgICAwMDogICAwMDAwMDAwMCAwMDAwMDAwMAorICAgICB3aXRoIHRoZSBjaHVua3MgZGlzcGxheWVkIGFjY29yZGluZyB0byAiZGlzcGxheV9lbmRpYW4iLiAqLworICBpbnQgYnl0ZXNfcGVyX2NodW5rOworICBlbnVtIGJmZF9lbmRpYW4gZGlzcGxheV9lbmRpYW47CisKKyAgLyogUmVzdWx0cyBmcm9tIGluc3RydWN0aW9uIGRlY29kZXJzLiAgTm90IGFsbCBkZWNvZGVycyB5ZXQgc3VwcG9ydAorICAgICB0aGlzIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvIGlzIHNldCBlYWNoIHRpbWUgYW4gaW5zdHJ1Y3Rpb24gaXMKKyAgICAgZGVjb2RlZCwgYW5kIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBsYXN0IHN1Y2ggaW5zdHJ1Y3Rpb24uCisKKyAgICAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZWNvZGVyIHN1cHBvcnRzIHRoaXMgaW5mb3JtYXRpb24sIHNldAorICAgICBpbnNuX2luZm9fdmFsaWQgdG8gMCwgZGVjb2RlIGFuIGluc3RydWN0aW9uLCB0aGVuIGNoZWNrIGl0LiAgKi8KKworICBjaGFyIGluc25faW5mb192YWxpZDsJCS8qIEJyYW5jaCBpbmZvIGhhcyBiZWVuIHNldC4gKi8KKyAgY2hhciBicmFuY2hfZGVsYXlfaW5zbnM7CS8qIEhvdyBtYW55IHNlcXVlbnRpYWwgaW5zbidzIHdpbGwgcnVuIGJlZm9yZQorCQkJCSAgIGEgYnJhbmNoIHRha2VzIGVmZmVjdC4gICgwID0gbm9ybWFsKSAqLworICBjaGFyIGRhdGFfc2l6ZTsJCS8qIFNpemUgb2YgZGF0YSByZWZlcmVuY2UgaW4gaW5zbiwgaW4gYnl0ZXMgKi8KKyAgZW51bSBkaXNfaW5zbl90eXBlIGluc25fdHlwZTsJLyogVHlwZSBvZiBpbnN0cnVjdGlvbiAqLworICBiZmRfdm1hIHRhcmdldDsJCS8qIFRhcmdldCBhZGRyZXNzIG9mIGJyYW5jaCBvciBkcmVmLCBpZiBrbm93bjsKKwkJCQkgICB6ZXJvIGlmIHVua25vd24uICAqLworICBiZmRfdm1hIHRhcmdldDI7CQkvKiBTZWNvbmQgdGFyZ2V0IGFkZHJlc3MgZm9yIGRyZWYyICovCisKK30gZGlzYXNzZW1ibGVfaW5mbzsKKworDAorLyogU3RhbmRhcmQgZGlzYXNzZW1ibGVycy4gIERpc2Fzc2VtYmxlIG9uZSBpbnN0cnVjdGlvbiBhdCB0aGUgZ2l2ZW4KKyAgIHRhcmdldCBhZGRyZXNzLiAgUmV0dXJuIG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQuICAqLwordHlwZWRlZiBpbnQgKCpkaXNhc3NlbWJsZXJfZnR5cGUpCisgICAgIFBBUkFNUygoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfbWlwcwkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfbWlwcwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2kzODZfYXR0CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2kzODZfaW50ZWwJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9tNjhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAxCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX3o4MDAyCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2g4MzAwaAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25faDg1MDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fYWxwaGEJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gZGlzYXNzZW1ibGVyX2Z0eXBlIGFyY19nZXRfZGlzYXNzZW1ibGVyIFBBUkFNUyAoKGludCwgaW50KSk7CitleHRlcm4gaW50IHByaW50X2luc25fYmlnX2FybQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfYXJtCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fc3BhcmMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fYmlnX2EyOWsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX2EyOWsJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9pOTYwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX3NoCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX3NobAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9ocHBhCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2ZyMzAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fbTMycgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9tODhrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX21jb3JlCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX21uMTAyMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fbW4xMDMwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9uczMyawkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9iaWdfcG93ZXJwYwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fcnM2MDAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX3c2NQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl9kMTB2CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOworZXh0ZXJuIGludCBwcmludF9pbnNuX2QzMHYJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fdjg1MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl90aWMzMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBpbnQgcHJpbnRfaW5zbl92YXgJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CitleHRlcm4gaW50IHByaW50X2luc25fdGljODAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7CisKKy8qIEZldGNoIHRoZSBkaXNhc3NlbWJsZXIgZm9yIGEgZ2l2ZW4gQkZELCBpZiB0aGF0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KK2V4dGVybiBkaXNhc3NlbWJsZXJfZnR5cGUgZGlzYXNzZW1ibGVyCVBBUkFNUyAoKGJmZCAqKSk7CisKKwwKKy8qIFRoaXMgYmxvY2sgb2YgZGVmaW5pdGlvbnMgaXMgZm9yIHBhcnRpY3VsYXIgY2FsbGVycyB3aG8gcmVhZCBpbnN0cnVjdGlvbnMKKyAgIGludG8gYSBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICAqLworCisvKiBIZXJlIGlzIGEgZnVuY3Rpb24gd2hpY2ggY2FsbGVycyBtYXkgd2lzaCB0byB1c2UgZm9yIHJlYWRfbWVtb3J5X2Z1bmMuCisgICBJdCBnZXRzIGJ5dGVzIGZyb20gYSBidWZmZXIuICAqLworZXh0ZXJuIGludCBidWZmZXJfcmVhZF9tZW1vcnkKKyAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKiwgaW50LCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gZ29lcyB3aXRoIGJ1ZmZlcl9yZWFkX21lbW9yeS4KKyAgIEl0IHByaW50cyBhIG1lc3NhZ2UgdXNpbmcgaW5mby0+ZnByaW50Zl9mdW5jIGFuZCBpbmZvLT5zdHJlYW0uICAqLworZXh0ZXJuIHZvaWQgcGVycm9yX21lbW9yeSBQQVJBTVMgKChpbnQsIGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKKworCisvKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGluIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCisgICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCisgICBhZGRyZXNzZXMpLiAgKi8KK2V4dGVybiB2b2lkIGdlbmVyaWNfcHJpbnRfYWRkcmVzcworICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKKy8qIEFsd2F5cyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcworICBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKKy8qIE1hY3JvIHRvIGluaXRpYWxpemUgYSBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdC4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZAorICAgYnkgYWxsIGFwcGxpY2F0aW9ucyBjcmVhdGluZyBzdWNoIGEgc3RydWN0LiAgKi8KKyNkZWZpbmUgSU5JVF9ESVNBU1NFTUJMRV9JTkZPKElORk8sIFNUUkVBTSwgRlBSSU5URl9GVU5DKSBcCisgIChJTkZPKS5mbGF2b3VyID0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsIFwKKyAgKElORk8pLmFyY2ggPSBiZmRfYXJjaF91bmtub3duLCBcCisgIChJTkZPKS5tYWNoID0gMCwgXAorICAoSU5GTykuZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOLCBcCisgIElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKElORk8sIFNUUkVBTSwgRlBSSU5URl9GVU5DKQorCisvKiBDYWxsIHRoaXMgbWFjcm8gdG8gaW5pdGlhbGl6ZSBvbmx5IHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgZm9yIHRoZQorICAgZGlzYXNzZW1ibGVyLiAgQXJjaGl0ZWN0dXJlIGRlcGVuZGVudCB0aGluZ3Mgc3VjaCBhcyBieXRlIG9yZGVyLCBvciBtYWNoaW5lCisgICB2YXJpYW50IGFyZSBub3QgdG91Y2hlZCBieSB0aGlzIG1hY3JvLiAgVGhpcyBtYWtlcyB0aGluZ3MgbXVjaCBlYXNpZXIgZm9yCisgICBHREIgd2hpY2ggbXVzdCBpbml0aWFsaXplIHRoZXNlIHRoaW5ncyBzZXBlcmF0bHkuICAqLworCisjZGVmaW5lIElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKElORk8sIFNUUkVBTSwgRlBSSU5URl9GVU5DKSBcCisgIChJTkZPKS5mcHJpbnRmX2Z1bmMgPSAoZnByaW50Zl9mdHlwZSkoRlBSSU5URl9GVU5DKSwgXAorICAoSU5GTykuc3RyZWFtID0gKFBUUikoU1RSRUFNKSwgXAorICAoSU5GTykuc3ltYm9scyA9IE5VTEwsIFwKKyAgKElORk8pLm51bV9zeW1ib2xzID0gMCwgXAorICAoSU5GTykuYnVmZmVyID0gTlVMTCwgXAorICAoSU5GTykuYnVmZmVyX3ZtYSA9IDAsIFwKKyAgKElORk8pLmJ1ZmZlcl9sZW5ndGggPSAwLCBcCisgIChJTkZPKS5yZWFkX21lbW9yeV9mdW5jID0gYnVmZmVyX3JlYWRfbWVtb3J5LCBcCisgIChJTkZPKS5tZW1vcnlfZXJyb3JfZnVuYyA9IHBlcnJvcl9tZW1vcnksIFwKKyAgKElORk8pLnByaW50X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfcHJpbnRfYWRkcmVzcywgXAorICAoSU5GTykuc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MsIFwKKyAgKElORk8pLmZsYWdzID0gMCwgXAorICAoSU5GTykuYnl0ZXNfcGVyX2xpbmUgPSAwLCBcCisgIChJTkZPKS5ieXRlc19wZXJfY2h1bmsgPSAwLCBcCisgIChJTkZPKS5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAorICAoSU5GTykuaW5zbl9pbmZvX3ZhbGlkID0gMAorCisjZW5kaWYgLyogISBkZWZpbmVkIChESVNfQVNNX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cgYi9pbmNsdWRlL2VsZi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhY2NkNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL0NoYW5nZUxvZwpAQCAtMCwwICsxLDcxOSBAQAorMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVsb2MtbWFjcm9zLmggKFNUQVJUX1JFTE9DX05VTUJFUlMpOiBQcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8KKwlmYWtlIHJlbG9jIGVudHJ5IG5hbWUgKGlmIHBvc3NpYmxlKSwgaW4gb3JkZXIgdG8gYXZvaWQgY29uZmxpY3RzCisJd2l0aCB0eXBlZGVmcyBvZiB0aGUgc2FtZSBuYW1lLgorCisxOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChFRl9NSVBTXzMyQklUTU9ERSk6IE5ldy4KKworMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKKwlwcm9jZXNzb3IuIAorCisxOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb21tb24uaDogQWRkIG5ldyBjb25zdGFudHMgZGVmaW5lZCBpbjogIlN5c3RlbSBWIEFwcGxpY2F0aW9uCisJQmluYXJ5IEludGVyZmFjZSAtIERSQUZUIC0gQXByaWwgMjksIDE5OTgiIGZvdW5kIGF0IHRoZSB3ZWIgc2l0ZTogCisJaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKKworCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKKwl2YWx1ZS4gCisKKzE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJlbG9jLW1hY3Jvcy5oOiBGaXhlZCB0byBub3QgZ2VuZXJhdGUgYW4gZW51bSB3aXRoIGEgdHJhaWxpbmcKKwljb21tYS4gCisKKzE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKEVfTUlQU19NQUNIXzUwMDApOiBOZXcuCisKKzE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBjb21tb24uaDogQWRkIGRlZmluaXRpb25zIGZvciBhIGZldyBtb3JlIFNvbGFyaXMgRUxGIGV4dGVuc2lvbnMuCisKK1RodSBGZWIgMTggMTg6NTg6MjYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBleHRlcm5hbC5oOiBPbmx5IHVzZSBhdHRyaWJ1dGUgaWYgX19HTlVDX18gaXMgZGVmaW5lZC4KKworMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCVBhdGNoIHN1Ym1pdHRlZCBieTogU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAY29yZWxjb21wdXRlci5jb20+CisKKwkqIGVsZi9leHRlcm5hbC5oOiBzdHJ1Y3QgRWxmX0V4dGVybmFsX1ZlcnN5bSBtdXN0IGJlIHBhY2tlZCBvbgorCUFSTS4gIENvZGUgdXNlcyBzaXplb2YoRWxmX0V4dGVybmFsX1ZlcnN5bSkgYW5kIGFzc3VtZXMgaXQgaXMKKwllcXVhbCB0byBzaXplb2YoY2hhclsyXSkuICBSZXBvcnRlZCBieSBKaW0gUGljayA8amltQGppbXBpY2suY29tPgorCisxOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkd2FyZjIuaCAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSk6IE5ldyBzdHJ1Y3R1cmUuCisJKERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgorCitNb24gRmViICAxIDExOjMzOjU2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogYXJtLmg6ICBSZW51bWJlciByZWxvY3MgdG8gY29uZm9ybSB0byBzdGFuZGFyZC4KKyAgICAgICAgKEVGX05FV19BQkkpOiAgRGVmaW5lLgorICAgICAgICAoRUZfT0xEX0FCSSk6ICBEZWZpbmUuCisgICAgICAgICogYXJtLW9hYmkuaDogIE5ldyBmaWxlLgorCisxOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBmcjMwLmg6IEFkZCBSX0ZSMzBfR05VX1ZUe0lOSEVSSVQsRU5UUll9IHJlbG9jcy4KKworMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZHdhcmYyLmg6IEFkZCB0eXBlZGVmcyBmb3Igc3RydWN0dXJlcyBmb3VuZCBpbiBkd2FyZjIgc2VjdGlvbnMuCisKKzE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKEVfTUlQU19NQUNIXzQxMTEpOiBOZXcuCisKKzE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKEVGX01JUFNfQUJJLEVfTUlQU19BQklfTzMyLEVfTUlQU19BQklfTzY0LAorCUVfTUlQU19BQklfRUFCSTMyLEVfTUlQU19BQklfRUFCSTY0KToKKworMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZnIzMC5oOiBBZGQgUl9GUjMwXzQ4IHJlbG9jLgorCisxOTk4LTEyLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogbWlwcy5oOiBBZGQgZXh0ZXJuYWwgZGF0YSB0eXBlIGZvciBjb25mbGljdCBzZWN0aW9uLgorCisJKiBtaXBzLmg6IEFkZCBtb3JlIExMXyogb3B0aW9ucyBmcm9tIElyaXggNi41LgorCisJKiBtaXBzLmg6IEFkZCBSX01JUFNfSkFMUiBhbmQgYWRqdXN0IFJfTUlQU19tYXggYXBwcm9wcmlhdGVseS4KKworVHVlIE5vdiAxMCAxNToxMjoyOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBSZWR1Y2UgdG8gYSAxNiBiaXQgdmFsdWUuCisKK1R1ZSBOb3YgMTAgMTU6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBkMTB2Lmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KKworV2VkIE5vdiAgNCAxNTo1Njo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBOZXcgbWFjaGluZSBudW1iZXIuCisKKwkqIGZyMzAuaDogTmV3IGZpbGU6IERlZmluaXRpb25zIGZvciB0aGUgRlIzMC4KKworRnJpIE9jdCAzMCAxMTo1NDoxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICBGcm9tIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OgorICAgICAgICAqIGFybS5oIChSX0FSTV9DT1BZLCBldCBhbC4pOiBOZXcgcmVsb2NzLCB1c2VkIGJ5IExpbnV4IGZvciBQSUMuCisgICAgICAgIChFRl9BTElHTjgpOiBOZXcgZmxhZy4KKworVHVlIE9jdCAyMCAxMToxOTo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oIChOVF9MV1BTVEFUVVMpOiBDbG9zZSBjb21tZW50IGFjY2lkZW50YWxseSBsZWZ0IG9wZW4uCisKK01vbiBPY3QgMTkgMjA6MjQ6MTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBzaC5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCisKK01vbiBPY3QgMTkgMDE6NDQ6NDIgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBjb21tb24uaCAoTlRfUFNUQVRVUywgTlRfRlBSRUdTLCBOVF9QU0lORk8sCisgCU5UX0xXUFNUQVRVUyxOVF9MV1BTSU5GTyk6IGFkZGVkLgorCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX05vdGUpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCisKK0ZyaSBPY3QgMTYgMTQ6MTE6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBtMzJyLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KKworVHVlIE9jdCAgNiAwOToyMjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIHNwYXJjLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KKworTW9uIE9jdCAgNSAwOTozOToyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIHY4NTAuaDogIEFkZCB2dGFibGUgcmVsb2NzLgorCitTdW4gT2N0ICA0IDIxOjE3OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oIChSXzM4Nl9tYXgpOiBDaGFuZ2UgZnJvbSAyNTIgdG8gMjQuCisKK01vbiBTZXAgMjEgMTI6MjQ6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBpMzg2Lmg6ICBDaGFuZ2UgdnRhYmxlIHJlbG9jIG51bWJlcnMuCisKK1N1biBTZXAgMjAgMDA6NTQ6MjIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGsuaDogQWRkIHZ0YWJsZSByZWxvY3MgYW5kIFJfNjhLX21heC4KKworVHVlIFNlcCAxNSAwOTo1Njo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAqIGFybS5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCisKK01vbiBBdWcgMzEgMTE6MjU6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBhcm0uaDogIERlZmluZSBTVFRfQVJNX1RGVU5DLiAgUmVtb3ZlIFNUX1RIVU1CX3h4eHgKKyAgICAgICAgZGVmaW5pdGlvbnMuCisKK1NhdCBBdWcgMjkgMjI6MjU6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBBZGQgdnRhYmxlIHJlbG9jcy4KKworMTk5OC0wOC0yNSAxNjo0MiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oOiBBZGQgU1lNSU5GT18qIG1hY3JvcyB0byBhY2Nlc3MgRWxmKl9TeW1pbmZvIGluZm9ybWF0aW9uLgorCisJKiBleHRlcm5hbC5oOiBBZGQgRWxmX0V4dGVybmFsX1N5bWluZm8gZGVmaW5pdGlvbi4KKworCSogaW50ZXJuYWwuaDogQWRkIEVsZl9JbnRlcm5hbF9TeW1pbmZvLCBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvLAorCWFuZCBFbGY2NF9TeW1pbmZvIGRlZmluaXRpb25zLgorCitTdW4gQXVnICA5IDIwOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICogYXJtLmg6ICBBZGQgU1RfVEhVTUIgZGVmaW5pdGlvbnMuCisKK1dlZCBBdWcgIDUgMTU6NTI6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogYXJtLmg6IEFkZCBFTEYgaGVhZGVyIGZsYWdzIHRvIHNwZWNpZnkgY29tcGlsZSB0aW1lIG9wdGluczoKKwlFRl9JTlRFUldPUks6IE5ldyBmbGFnLgorCUVGX0FQQ1NfMjY6IE5ldyBmbGFnLgorCUVGX0FQQ1NfRkxPQVQ6IE5ldyBmbGFnLgorCUVGX1BJQzogTmV3IGZsYWcuCisKKzE5OTgtMDctMzEgMjE6MjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBtaXBzLmg6IEFkZCBtaXNzaW5nIFJIRl8qIGNvbnN0YW50cy4KKworRnJpIEp1bCAzMSAxMDowMTo0MCAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogYXJtLmg6IEFkZCBSX0FSTV9USE1fUEM5IHJlbG9jYXRpb24uCisKKzE5OTgtMDctMzAgMTY6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBjb21tb24uaDogQWRkIG5ldyBEVF8qIGVudHJpZXMgYW5kIHRoZXJlIGZsYWcgbWFjcm9zIGZyb20gU29sYXJpcy4KKworVHVlIEp1bCAyOCAxODoxNDowNyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oOiAoUl9TUEFSQ19SRVYzMik6IEFkZGVkIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEgZS5nLiBzcGFyYyA4NnguCisKK0ZyaSBKdWwgMjQgMTE6MjI6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfMjQgcmVsb2NhdGlvbi4KKworMTk5OC0wNy0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaDogQWRkIE1JUFM2NCByZWxvY2F0aW9uIG5hbWVzIGFuZCB2YWx1ZXMuCisKK1dlZCBKdWwgMjIgMTk6Mjk6MDAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBhcm0uaDogUmVuYW1lIHJlbG9jYXRpb25zLgorCisxOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogcHBjLmg6IERlZmluZSBlbnVtIGFzIGVsZl9wcGNfcmVsb2NfdHlwZS4KKworV2VkIEp1bCAyMiAxNjoyMjoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZWxvYy1tYWNyb3MuaDogTmV3IGZpbGUuICBQcm92aWRlcyByZWxvY2F0aW9uIG1hY3JvczoKKwlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIEZBS0VfUkVMT0MsIEVNUFRZX1JFTE9DIGFuZAorCUVORF9SRUxPQ19OVU1CRVJTIHVzZWQgYnkgb3RoZXIgZWxmIGhlYWRlciBmaWxlcy4KKworCSogYWxwaGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KKwkqIGFybS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCisJKiBkMTB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KKwkqIGQzMHYuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogaHBwYS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCisJKiBpMzg2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KKwkqIG0zMnIuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogbTY4ay5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCisJKiBtaXBzLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KKwkqIG1uMTAyMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogbW4xMDMwMC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCisJKiBwcGMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogc2guaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogc3BhcmMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgorCSogdjg1MC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCisKKzE5OTgtMDctMjIgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBtbjEwMzAwLmg6IFJld3JpdGUgcmVsb2NhdGlvbiBkZWZpbml0aW9uIHVzaW5nIG1hY3Jvcy4KKwkqIG1pcHMuaDogTGlrZXdpc2UuCisJKiBwcGMuaDogTGlrZXdpc2UuCisJKiBhbHBoYS5oOiBMaWtld2lzZS4KKwkqIGFybS5oOiBMaWtld2lzZS4KKwkqIGQxMHYuaDogTGlrZXdpc2UuCisJKiBkMzB2Lmg6IExpa2V3aXNlLgorCSogbTMyci5oOiBMaWtld2lzZS4KKwkqIG02OGsuaDogTGlrZXdpc2UuCisJKiBtbjEwMjAwLmg6IExpa2V3aXNlLgorCSogc2guaDogTGlrZXdpc2UuCisJKiBzcGFyYy5oOiBMaWtld2lzZS4KKworMTk5OC0wNy0yMSAxMzowNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGFybS5oOiBOZXcgZmlsZS4KKwkqIGQxMHYuaDogTmV3IGZpbGUuCisJKiBkMzB2Lmg6IE5ldyBmaWxlLgorCSogaTM4Ni5oOiBOZXcgZmlsZS4KKwkqIG02OGsuaDogTmV3IGZpbGUuCisJKiBtbjEwMjAwLmg6IE5ldyBmaWxlLgorCSogc2guaDogTmV3IGZpbGUuCisKKwkqIG1pcHMuaDogQWRkIFJfTUlQU18qIGFuZCBTSFRfTUlQU18qIGVudHJpZXMuCisKKwkqIG1uMTAzMDAuaDogQWRkIFJfTU4xMDMwMF8qIGVudHJpZXMuCisKKwkqIHBwYy5oOiBBZGQgUl9QUENfKiBlbnRyaWVzLgorCisxOTk4LTA3LTIwIDA3OjExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogbWlwcy5oOiBBZGQgT0RLXyosIE9FWF8qLCBPUEFEXyosIE9IV18qLCBhbmQgT0dQXyogY29uc3RhbnRzLgorCURlZmluZSBFbGYzMl9FeHRlcm5hbF9MaWIuCisKKzE5OTgtMDctMTkgMTU6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKFBUX01JUFNfT1BUSU9OUyk6IE5ldyBzeW1ib2wuCisJQWRkIGxvdHMgb2YgRFRfTUlQU18qIHN5bWJvbHMuCisKK0ZyaSBKdW4gMjYgMTA6NDY6MzUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmg6IE5ldyBmaWxlLgorCitUaHUgSnVuIDE4IDE5OjI3OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oIChFTV85NjAsIEVNX1Y4MDAsIEVNX0ZSMjAsIEVNX1JIMzIsIEVNX01NQSwKKwlFTV9PTERfQUxQSEEpOiBBZGQgdGhlc2UgY29uc3RhbnRzLgorCitUaHUgSnVuIDExIDE3OjU5OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oIChFTV80ODYsIEVNX1MzNzApOiBBZGQgdGhlc2UgY29uc3RhbnRzLgorCitUdWUgSnVuICA5IDA5OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oIChFTV9BUk0pOiBBZGQgdGhpcyBjb25zdGFudC4KKworV2VkIE1heSAgNiAwOTo0NTozMCAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChFRl9NSVBTX01BQ0gsRV9NSVBTX01BQ0hfKik6IEFkZGVkLgorCitTYXQgQXByIDI1IDE4OjM1OjA2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGFscGhhLmggKFNUT19BTFBIQV9OT1BWLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk6IE5ldy4KKworV2VkIEFwciAxNSAxNTo0Mjo0NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBjb21tb24uaCAoRU1fU1BBUkM2NCk6IE1vdmUgYW5kIHJlbmFtZSB0byBFTV9PTERfU1BBUkNWOS4KKwkoRU1fU1BBUkNWOSk6IE5ldy4gIFRoaXMgaXMgdGhlIG9mZmljaWFsIEFCSSBuYW1lIGFuZCBudW1iZXIuCisKK1NhdCBGZWIgMjggMTc6MDQ6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYWxwaGEuaCAoRUZfQUxQSEFfMzJCSVQsIEVGX0FMUEhBX0NBTlJFTEFYKTogTmV3LgorCitNb24gRGVjIDE1IDE1OjA3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIG0zMnIuaCAoRUZfTTMyUl9BUkNILCBFX00zMlJfQVJDSCk6IE5ldyBmbGFncyB0bworCXNwZWNpZnkgbWFjaGluZSBhcmNoaXRlY3R1cmUuCisKK0ZyaSBEZWMgIDUgMTE6MjA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5oOiBOZXcgY29uc3RhbnRzOiBTSE5fVjg1MF9TQ09NTU9OLCBTSE5fVjg1MF9UQ09NTU9OLAorCVNITl9WODUwX1pDT01NT04sIFNIVF9WODUwX1NDT01NT04sIFNIVF9WODUwX1RDT01NT04sCisJU0hUX1Y4NTBfWkNPTU1PTiB0byBoYW5kbGUgdjg1MCBjb21tb24gc2VjdGlvbnMuCisJZW51bSByZWxvY190eXBlIHJlbmFtZWQgdG8gdjg1MF9yZWxvY190eXBlIHRvIGF2b2lkIG5hbWUKKwljb25mbGljdC4KKworVGh1IE9jdCAyMyAxMzo1NToyNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChlbnVtIGVsZl9zcGFyY19yZWxvY190eXBlKTogQWRkIFVBNjQgJiBVQTE2LgorCitUaHUgT2N0IDIzIDAwOjQyOjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChEVF9TUEFSQ19SRUdJU1RFUik6IE5ldyBtYWNyby4KKwkoRFRfU1BBUkNfUExURk1UKTogSW4gc3VwcG9ydCBvZiBvbGQgc3BhcmM2NC1saW51eCAucGx0czsgd2lsbAorCWdvIGF3YXkgc29vbi4KKworVHVlIFNlcCAzMCAxMzoyNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChFRl9TUEFSQ19IQUxfUjEsIEVGX1NQQVJDX0VYVF9NQVNLKTogTmV3IG1hY3Jvcy4KKwkoRUZfU1BBUkNWOV97TU0sVFNPLFBTTyxSTU99KTogTmV3IG1hY3Jvcy4KKwkoU0hOX0JFRk9SRSxTSE5fQUZURVIpOiBOZXcgbWFjcm9zLgorCShTSEZfRVhDTFVERSxTSEZfT1JERVJFRCk6IE5ldyBtYWNyb3MuCisJKFNUVF9SRUdJU1RFUik6IE5ldyBtYWNyby4KKwkoUl9TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZWQsIGJ1dCBzbG90IHJlc2VydmVkLgorCShSX1NQQVJDX3tESVNQNjQsUExUNjQsSElYMjIsTE9YMTB9KTogTmV3IHJlbG9jYXRpb25zLgorCShSX1NQQVJDX3tINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NhdGlvbnMuCisJKEVMRjY0X1JfVFlQRV97REFUQSxJRCxJTkZPfSk6IE5ldyBtYWNyb3MuCisKK1dlZCBTZXAgMTcgMTY6NDE6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5oOiBBZGQgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCisKK1R1ZSBTZXAgMTYgMTQ6MTY6MTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgorCitXZWQgU2VwICAzIDE1OjExOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCisKK1dlZCBTZXAgIDMgMTE6MjU6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5oIChyZWxvY190eXBlKTogUmVtb3ZlIFJfVjg1MF8xNl9QQ1JFTC4KKworVHVlIFNlcCAgMiAxNzo0MTowNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEUuCisJKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEVBLgorCSogdjg1MC5oOiBBZGQgbmV3IGZsYWdzIGZvciBlX2ZsYWdzIGZpZWxkIGluIGVsZiBoZWFkZXIuCisKK01vbiBBdWcgMjUgMTY6MDY6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwRSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZS4KKwkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEVBKTogYmFja2VuZCBtYWdpYyBudW1iZXIgZm9yIHY4NTBlYS4KKworTW9uIEF1ZyAxOCAxMTowNToyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB2ODUwLmggKHJlbG9jX3R5cGUpOiBBZGQgMTYgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCisKK0ZyaSBBdWcgMTUgMDU6MTA6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYXJjLmggKGVudW0gcmVsb2MpOiBNb3ZlIGhlcmUgZnJvbSBlbGYzMi1hcmMuYy4KKworRnJpIEF1ZyAgOCAxNzowNToyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBhcmMuaDogTmV3IGZpbGUuCisJKiBjb21tb24uaCAoRU1fQ1lHTlVTX0FSQyk6IERlZmluZS4KKworTW9uIEp1biAxNiAxNDo0NjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9FaGRyKTogQ2hhbmdlIGVfcGhvZmYgYW5kIGVfc2hvZmYgZnJvbQorCWJmZF9zaWduZWRfdm1hIHRvIGJmZF9zaXplX3R5cGUsIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCisKK1dlZCBNYXIgIDUgMTU6MzU6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+CisKKwkqIG0zMnIuaCAoU0hGX00zMlJfQ0FOX1JFTEFYKTogRGVmaW5lLgorCitNb24gRmViIDI0IDE3OjQ5OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZXh0ZXJuYWwuaDogRHVtcCB0aGUgMzIvNjQgYml0IHNwZWNpZmljIGZvcm1zIG9mIHRoZSB2ZXJzaW9uCisJc3RydWN0dXJlcywgYW5kIGp1c3QgZGVmaW5lIHRoZW0gYXMgc2l6ZSBpbmRlcGVuZGVudC4KKworCSogY29tbW9uLmggKFZFUlNZTV9ISURERU4sIFZFUlNZTV9WRVJTSU9OKTogRGVmaW5lLgorCitGcmkgRmViIDIxIDEzOjAwOjM0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG0zMnIuaCAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTTMyUl9TREExNi4KKwkoU0hOX00zMlJfU0NPTU1PTik6IERlZmluZS4KKworV2VkIEZlYiAxOSAxNTozNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46CisJKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgbmV3IHN0cnVjdHVyZXMgYW5kCisJZGVmaW5pdGlvbnMgZm9yIEVMRiB2ZXJzaW9ucy4KKworVHVlIEZlYiAxOCAxNzo0MDozNiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29tbW9uLmggKEVNX0NZR05VU19EMzBWKTogRGVmaW5lLgorCitNb24gSmFuIDI3IDExOjU0OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfSEkxNl9bU1VdTE8sUl9NMzJSX0xPMTYuCisKK0ZyaSBKYW4gIDMgMTE6MzI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiB2ODUwLmggKFY4NTBfT1RIRVJfe1REQV9CWVRFLEVSUk9SfSk6IE5ldyBiaXRzIGZvciB0aGUgc3Rfb3RoZXIKKwlmaWVsZC4KKwkoU0hOX1Y4NTBfKik6IFJlbW92ZSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gaW5kZXhlcywgd2hpY2ggYXJlIG5vdAorCW5lZWRlZC4KKwkoZW51bSByZWxvY190eXBlKTogTW92ZSB0aGUgdjg1MCByZWxvY2F0aW9ucyBoZXJlIGZyb20KKwllbGYzMi12ODUwLmMKKworVGh1IEphbiAgMiAxOTozMDoyMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHY4NTAuaDogTmV3IGZpbGUsIHByb3ZpZGUgVjg1MCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKworVHVlIERlYyAzMSAxNDo0NDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oIChEVF9BVVhJTElBUlkpOiBEZWZpbmUuCisJKERUX0ZJTFRFUik6IERlZmluZS4KKworV2VkIERlYyAgNCAwNTowMzozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGR3YXJmMi5oOiBVcGRhdGUuCisKK1R1ZSBOb3YgMjYgMTA6NDQ6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKFNUT19NSVBTMTYpOiBEZWZpbmUuCisKK1R1ZSBOb3YgMTIgMTU6NDU6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYuaDogUmVtb3ZlIGVtcHR5IGZpbGUuCisKK1R1ZSBPY3QgIDggMTE6MzE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKEVGX01JUFNfQUJJMik6IERlZmluZS4KKworVGh1IE9jdCAgMyAxMDowMTo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbW1vbi5oOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byBtbjEwMjAwIGFuZCBtbjEwMzAwLgorCitXZWQgT2N0ICAyIDIxOjI2OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29tbW9uLmggKEVNX0NZR05VU19NTjEweDAwKTogRGVmaW5lLgorCitNb24gU2VwIDIzIDA5OjE4OjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBtMzJyLmg6IE5ldyBmaWxlLgorCitGcmkgQXVnIDMwIDE3OjA2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29tbW9uLmggKEVNX1NIKTogRGVmaW5lLgorCitUdWUgQXVnIDIwIDE0OjQ3OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgorCisJKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTApOiBEZWZpbmUuCisKK01vbiBBdWcgMTkgMTA6NTk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29tbW9uLmggKEVNX0NZR05VU19NMzJSKTogRGVmaW5lLgorCitNb24gSnVsIDIyIDE4OjU5OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChTSFRfTUlQU19JRkFDRSwgU0hUX01JUFNfQ09OVEVOVCk6IERlZmluZS4KKwkoU0hUX01JUFNfU1lNQk9MX0xJQik6IERlZmluZS4KKwkoU0hGX01JUFNfTUVSR0UsIFNIRl9NSVBTX0FERFIzMiwgU0hGX01JUFNfQUREUjY0KTogRGVmaW5lLgorCShTSEZfTUlQU19OT1NUUklQLCBTSEZfTUlQU19MT0NBTCwgU0hGX01JUFNfTkFNRVMpOiBEZWZpbmUuCisKK1RodSBKdWwgMTggMTk6MTI6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBkd2FyZjIuaDogTmV3IGZpbGUuCisKK0p1bCAxOCAxMzoyMDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29tbW9uLmggKEVNX0NZR05VU19EMTBWKTogRGVmaW5lLgorCSogZDEwdi5oOiBOZXcgZmlsZS4KKworRnJpIEp1biAyMSAxMjozMzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogYWxwaGEuaDogTmV3IGZpbGUuCisJKiBjb21tb24uaCAoRU1fQUxQSEEpOiBEZWZpbmUuCisKK0ZyaSBNYXkgMzEgMTc6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKEVsZl9FeHRlcm5hbF9PcHRpb25zLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyk6IERlZmluZS4KKwkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IERlY2xhcmUuCisJKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogRGVjbGFyZS4KKwkoT0RLXyopOiBEZWZpbmUuCisJKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8sIEVsZjY0X0ludGVybmFsX1JlZ0luZm8pOiBEZWZpbmUuCisJKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbik6IERlY2xhcmUuCisJKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBEZWNsYXJlLgorCitUaHUgTWF5IDMwIDEyOjM1OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChFX01JUFNfQVJDSF80KTogRGVmaW5lLgorCitXZWQgTWF5IDI5IDE1OjM1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCk6IERlZmluZS4KKwkoRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwpOiBEZWZpbmUuCisJKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSwgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhKTogRGVmaW5lLgorCShSU1NfKik6IERlZmluZS4KKworTW9uIEFwciAyMiAxODoyNjozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChSX1NQQVJDX1s1Nl0pOiBBbHdheXMgZGVmaW5lLgorCitNb24gRmViIDE5IDAxOjU1OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChSX1NQQVJDX3tQTFQzMixISVBMVDIyLExPUExUMTAsUENQTFQzMixQQ1BMVDIyLAorCVBDUExUMTAsNSw2fSk6IERvbid0IGRlZmluZSBpZmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MuCisKK1R1ZSBGZWIgIDYgMTE6MzM6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLmggKGVudW0gc3BhcmNfZWxmX3JlbG9jX3R5cGUpOiBEZWZpbmUuCisKK1dlZCBKYW4gMTcgMDk6MDk6MTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29tbW9uLmg6IERlZmluZSBFTV9TUEFSQzMyUExVUy4KKwkqIHNwYXJjLmg6IE5ldyBmaWxlLgorCitUaHUgSmFuIDExIDE2OjI3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcHBjLmggKFNIRl9FWENMVURFLCBTSFRfT1JERVJFRCk6IE5ldyBmaWVsZHMgZnJvbSB0aGUgYWJpLgorCitUaHUgTm92IDMwIDE2OjQ3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaW50ZXJuYWwuaCAoc3RydWN0IGVsZl9zZWdtZW50X21hcCk6IEFkZCBpbmNsdWRlc19maWxlaGRyIGFuZAorCWluY2x1ZGVzX3BoZHJzIGZpZWxkcy4KKworVHVlIE5vdiAyOCAxNjo1ODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBEZWZpbmUuCisKK1R1ZSBPY3QgMzEgMTU6MTk6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBocHBhLmgsIGludGVybmFsLmgsCisJbWlwcy5oLCBwcGMuaDogIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgorCitUaHUgU2VwIDIxIDEzOjUxOjU4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcHBjLmggKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpOiBBZGQgbmV3IGZsYWcgYml0LgorCitGcmkgU2VwICAxIDE1OjMyOjE3IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgorCisJKiBtaXBzLmg6IEFkZCBzb21lIGRlZmluaXRpb25zIHVzZWQgb24gSXJpeCA1LgorCitUdWUgSnVuIDIwIDEwOjE4OjI4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLmggKENQVV9QQV9SSVNDMV8wKTogUHJvdGVjdCBmcm9tIHJlZGVmaW5pdGlvbnMuCisJKENQVV9QQV9SSVNDMV8xKTogTGlrZXdpc2UuCisKK1dlZCBNYXIgIDggMTg6MTQ6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwcGMuaDogTmV3IGZpbGUgZm9yIFBvd2VyUEMgc3VwcG9ydC4KKworVHVlIEZlYiAxNCAxMzo1OToxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbW1vbi5oIChFTV9QUEMpOiBVc2Ugb2ZmaWNhbCB2YWx1ZSBvZiAyMCwgbm90IDE3LgorCShFTV9QUENfT0xEKTogRGVmaW5lIHRoaXMgdG8gYmUgdGhlIG9sZCB2YWx1ZSBvZiBFTV9QUEMuCisKK1R1ZSBKYW4gMjQgMDk6NDA6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb21tb24uaCAoRU1fUFBDKTogTmV3IG1hY3JvLCBQb3dlclBDIG1hY2hpbmUgaWQuCisKK1R1ZSBKYW4gMTcgMTA6NTE6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBtaXBzLmggKFNIVF9NSVBTX01TWU0sIFNIVF9NSVBTX0RXQVJGLCBTSFRfTUlQU19FVkVOVFMpOiBEZWZpbmUuCisKK01vbiBPY3QgMTcgMTM6NDM6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFJlbW92ZSByYXdkYXRhIGFuZCBzaXplIGZpZWxkcy4KKwlBZGQgYmZkX3NlY3Rpb24gZmllbGQuCisKK1R1ZSBNYXkgMjQgMTY6MTE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLmggKEVsZjMyX0V4dGVybmFsX2dwdGFiKTogRGVmaW5lLgorCitNb24gTWF5IDE2IDEzOjIyOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb21tb24uaCAoRU1fSFBQQSk6IERlbGV0ZS4KKwkoRU1fUEFSSVNDKTogQWRkLgorCSogaHBwYS5oOiBOZXcgZmlsZS4KKworTW9uIE1heSAgOSAxMzoyNzowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbW1vbi5oIChTSE5fTE9SRVNFUlZFKTogUmVuYW1lIGZyb20gU0hOX0xPUkVTRVJWLgorCShFTEYzMl9SX1RZUEUsIEVMRjMyX1JfSU5GTyk6IERvbid0IHJlbHkgb24gc2l6ZSBvZiB1bnNpZ25lZCBjaGFyLgorCShFTEY2NF9SX1RZUEUpOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgbG9uZy4KKworTW9uIEFwciAyNSAxNTo1MzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9TaGRyKTogVXNlIFBUUiwgbm90IHZvaWQgKi4KKworRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHMuaCAoU0hOX01JUFNfVEVYVCwgU0hOX01JUFNfREFUQSk6ICBEZWZpbmUuCisKK1NhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBpbnRlcm5hbC5oOiAgUmVtb3ZlIEVsZjMyXyosIEVsZjY0XyogdHlwZWRlZnMuICBUaGVzZSBuYW1lcworCWNhdXNlIGNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXJzLCBlLmcuIGxpbmsuaCBpbiBnZGIvc29saWIuYy4KKwlDb21iaW5lIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mICpfSW50ZXJuYWxfRHluLgorCSogY29tbW9uLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmNjRfV29yZCwgRWxmNjRfWHdvcmQgdHlwZWRlZnMKKwlieSB0aGVpciBleHBhbnNpb24uCisJKiBtaXBzLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmMzJfV29yZCwgRWxmMzJfU3dvcmQsIEVsZjMyX0FkZHIKKwl0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24uIEFkZCBEVF9NSVBTX1JMRF9NQVAgZGVmaW5pdGlvbi4KKworRnJpIEZlYiAxOCAxMDozOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbW1vbi5oIChFTV9DWUdOVVNfUE9XRVJQQyk6IERlZmluZS4gIFRoaXMgbWF5IGJlIHRlbXBvcmFyeSwKKwlkZXBlbmRpbmcgdXBvbiBob3cgcXVpY2tseSBJIGNhbiBmaW5kIGEgcmVhbCBQb3dlclBDIEFCSS4KKworTW9uIEZlYiAgNyAwODoyNzoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KKworV2VkIEZlYiAgMiAxNDoxMjoxOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29tbW9uLmg6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgdmFsdWUgb2YgRU1fSFBQQSBhbmQgaG93IHRvCisJcGljayBhbiB1bm9mZmljaWFsIHZhbHVlLgorCitXZWQgTm92IDE3IDE3OjE0OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChTSFRfTUlQU19PUFRJT05TKTogRGVmaW5lLgorCitNb24gTm92ICA4IDE3OjU3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oOiBBZGRlZCBzb21lIG1vcmUgTUlQUyBBQkkgbWFjcm8gZGVmaW5pdGlvbnMuCisKK1dlZCBOb3YgIDMgMjI6MDc6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb21tb24uaCAoRU1fTUlQU19SUzRfQkUpOiBOZXcgbWFjcm8uCisKK1R1ZSBPY3QgMTIgMDc6Mjg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLmg6IE5ldyBmaWxlLiAgTUlQUyBBQkkgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisKK01vbiBKdW4gMjEgMTM6MTM6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmg6IENvbWJpbmVkIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mIGFsbCBzdHJ1Y3R1cmVzCisJZXhjZXB0ICpfSW50ZXJuYWxfRHluLiAgVGhpcyB3aWxsIHNpbXBseSB0aGUgYXNzZW1ibGVyIGludGVyZmFjZSwKKwlhbmQgc29tZSBiZmQgY29kZS4KKworVHVlIE1heSAyNSAwMjowMDoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGV4dGVybmFsLmgsIGludGVybmFsLmgsIGNvbW1vbi5oOiBBZGRlZCA2NC1iaXQgdmVyc2lvbnMgb2Ygc29tZQorCXN0cnVjdHVyZXMgYW5kIG1hY3Jvcy4gIFJlbmFtZWQgb2xkIHZlcnNpb25zIHRvIHB1dCAiMzIiIGluIHRoZQorCW5hbWUuICBTb21lIGFyZSB1bmNoYW5nZWQuCisKK1RodSBBcHIgMjkgMTI6MTI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbW1vbi5oIChFTV9IUFBBLCBOVF9WRVJTSU9OLCBTVE5fVU5ERUYsIERUXyopOiBOZXcgbWFjcm9zLgorCSogZXh0ZXJuYWwuaCAoRWxmX0V4dGVybmFsX0R5bik6IE5ldyB0eXBlLgorCisJKiBpbnRlcm5hbC5oIChFbGZfSW50ZW5yYWxfU2hkcik6IE5ldyBmaWVsZCBgc2l6ZScuCisJKEVsZl9JbnRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KKworVHVlIEFwciAyMCAxNjowMzo0NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBDaGFuZ2UgdmFsdWUgdG8gb25lIHJhbmRvbWx5IHBpY2tlZCBpbgorCXRoZSB1c2VyIGRlZmluZWQgcmFuZ2UsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb25zLgorCitTdW4gTm92IDE1IDA5OjM0OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkd2FyZi5oIChBVF9zcmNfY29vcmRzKTogIFdoaXRlc3BhY2UgY2hhbmdlIG9ubHkuCisJKiBkd2FyZi5oIChBVF9ib2R5X2JlZ2luLCBBVF9ib2R5X2VuZCwgTEFOR19NT0RVTEEyKToKKwlBZGQgZnJvbSBsYXRlc3QgZ2NjLgorCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBBZGQgYXMgR05VIGV4dGVuc2lvbi4KKworU2F0IEF1ZyAgMSAxMzo0Njo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmYuaDogIFJlcGxhY2Ugd2l0aCBjdXJyZW50IHZlcnNpb24gZnJvbSBnY2MgZGlzdHJpYnV0aW9uLgorCitGcmkgSnVuIDE5IDE5OjA1OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oOiAgQWRkIHJlYWwgc3RydWN0IHRhZ3MgdG8gYWxsIHRoZSBUeXBlX0RlZnMsIHNvIHRoZXkKKwljYW4gYmUgdXNlZCBpbiBwcm90b3R5cGVzIHdoZXJlIHRoZSBUeXBlX0RlZnMgYXJlIG5vdCBrbm93bi4KKworRnJpIEFwciAgMyAyMDo1ODo1OCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQorCisJKiBjb21tb24uaDogYWRkZWQgRUxGX1Jfe1NZTSxUWVBFLElORk99IGZvciBoYW5kbGluZyByZWxvY2F0aW9uCisJaW5mbworCWFkZGVkIEVNX01JUFMsIGFuZCBjb3JyZWN0ZWQgdmFsdWUgb2YgRU1fODYwIGJhc2VkIG9uIFN5c3RlbSBWIEFCSQorCW1hbnVhbC4KKworCSogZXh0ZXJuYWwuaDogYWRkZWQgRWxmX0V4dGVybmFsX3tSZWwsUmVsYX0uCisKKwkqIGludGVybmFsLmg6IGFkZGVkIEVsZl9JbnRlcm5hbF97UmVsLFJlbGF9LgorCWFkZGVkIHJhd2RhdGEgdG8gRWxmX0ludGVybmFsX1NoZHIuCisKK1NhdCBOb3YgMzAgMjA6NDM6NTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBDaGFuZ2VMb2c7IG1vdmVkIGZyb20KKwkuLi9lbGYtPGZvbz4KKworDAorTG9jYWwgVmFyaWFibGVzOgordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYWxwaGEuaCBiL2luY2x1ZGUvZWxmL2FscGhhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlOWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL2FscGhhLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIEFMUEhBIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIEJ5IEVyaWMgWW91bmdkYWxlLCA8ZXJpY0BhaWIuY29tPi4gIE5vIHByb2Nlc3NvciBzdXBwbGVtZW50IGF2YWlsYWJsZQorICAgZm9yIHRoaXMgcGxhdGZvcm0uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBBTFBIQSBFTEYgQUJJLiAgTm90ZQorICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCisKKyNpZm5kZWYgX0VMRl9BTFBIQV9ICisjZGVmaW5lIF9FTEZfQUxQSEFfSAorCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLworCisvKiBBbGwgYWRkcmVzc2VzIG11c3QgYmUgYmVsb3cgMkdCLiAgKi8KKyNkZWZpbmUgRUZfQUxQSEFfMzJCSVQJCTB4MDAwMDAwMDEKKworLyogQWxsIHJlbG9jYXRpb25zIG5lZWRlZCBmb3IgcmVsYXhhdGlvbiB3aXRoIGNvZGUgbW92ZW1lbnQgYXJlIHByZXNlbnQuICAqLworI2RlZmluZSBFRl9BTFBIQV9DQU5SRUxBWAkweDAwMDAwMDAyCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KKworLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIGdsb2JhbCBkYXRhIGFyZWEuICAqLworI2RlZmluZSBTSEZfQUxQSEFfR1BSRUwJCTB4MTAwMDAwMDAKKworLyogU2VjdGlvbiBjb250YWlucyBzb21lIHNvcnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhlIGV4YWN0CisgICBmb3JtYXQgaXMgdW5zcGVjaWZpZWQuICBJdCdzIHByb2JhYmx5IEVDT0ZGIHN5bWJvbHMuICAqLworI2RlZmluZSBTSFRfQUxQSEFfREVCVUcJCTB4NzAwMDAwMDEKKworLyogU2VjdGlvbiBjb250YWlucyByZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIFNIVF9BTFBIQV9SRUdJTkZPCTB4NzAwMDAwMDIKKworLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfUkVHSU5GTyBjb250YWlucyB0aGUgZm9sbG93aW5nCisgICBzdHJ1Y3R1cmUuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLworICB1bnNpZ25lZCBsb25nIHJpX2dwcm1hc2s7CisgIC8qIE1hc2sgb2YgY28tcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLiAgKi8KKyAgdW5zaWduZWQgbG9uZyByaV9jcHJtYXNrWzRdOworICAvKiBHUCByZWdpc3RlciB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCisgIGxvbmcgcmlfZ3BfdmFsdWU7Cit9IEVsZjY0X1JlZ0luZm87CisKKy8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCisKKyNkZWZpbmUgU1RPX0FMUEhBX05PUFYJCTB4ODAKKyNkZWZpbmUgU1RPX0FMUEhBX1NURF9HUExPQUQJMHg4OAorCisjaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgorCisvKiBBbHBoYSByZWxvY3MuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FscGhhX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9OT05FLCAwKQkvKiBObyByZWxvYyAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfUkVGTE9ORywgMSkJLyogRGlyZWN0IDMyIGJpdCAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfUkVGUVVBRCwgMikJLyogRGlyZWN0IDY0IGJpdCAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BSRUwzMiwgMykJLyogR1AgcmVsYXRpdmUgMzIgYml0ICovCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9MSVRFUkFMLCA0KQkvKiBHUCByZWxhdGl2ZSAxNiBiaXQgdy9vcHRpbWl6YXRpb24gKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0xJVFVTRSwgNSkJLyogT3B0aW1pemF0aW9uIGhpbnQgZm9yIExJVEVSQUwgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQRElTUCwgNikJLyogQWRkIGRpc3BsYWNlbWVudCB0byBHUCAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfQlJBRERSLCA3KQkvKiBQQys0IHJlbGF0aXZlIDIzIGJpdCBzaGlmdGVkICovCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9ISU5ULCA4KQkvKiBQQys0IHJlbGF0aXZlIDE2IGJpdCBzaGlmdGVkICovCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9TUkVMMTYsIDkpCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDMyLCAxMCkJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9TUkVMNjQsIDExKQkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KKworLyogSW5oZXJpdGVkIHRoZXNlIGZyb20gRUNPRkYsIGJ1dCB0aGV5IGFyZSBub3QgcGFydGljdWxhcmx5IHVzZWZ1bAorICAgYW5kIGFyZSBkZXByZWNpYXRlZC4gIEFuZCBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIEJGRCwgYnR3LiAgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1BVU0gsIDEyKQkvKiBPUCBzdGFjayBwdXNoICovCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9TVE9SRSwgMTMpCS8qIE9QIHN0YWNrIHBvcCBhbmQgc3RvcmUgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1BTVUIsIDE0KQkvKiBPUCBzdGFjayBzdWJ0cmFjdCAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfUFJTSElGVCwgMTUpCS8qIE9QIHN0YWNrIHJpZ2h0IHNoaWZ0ICovCisKKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQVkFMVUUsIDE2KQorICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfR1BSRUxISUdILCAxNykKKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMTE9XLCAxOCkKKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0dQXzE2LCAxOSkKKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0dQX0hJMzIsIDIwKQorICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfU0NOX0hJMzIsIDIxKQorICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfQlJfSEkzMiwgMjIpCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9MTzMyLCAyMykKKworLyogVGhlc2UgcmVsb2NhdGlvbnMgYXJlIHNwZWNpZmljIHRvIHNoYXJlZCBsaWJyYXJpZXMuICAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfQ09QWSwgMjQpCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dMT0JfREFULCAyNSkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSk1QX1NMT1QsIDI2KQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisgIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9SRUxBVElWRSwgMjcpCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKworICBFTVBUWV9SRUxPQyAgKFJfQUxQSEFfbWF4KQorRU5EX1JFTE9DX05VTUJFUlMKKworI2VuZGlmIC8qIF9FTEZfQUxQSEFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJjLmggYi9pbmNsdWRlL2VsZi9hcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRiNTVmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvYXJjLmgKQEAgLTAsMCArMSw1NCBAQAorLyogQVJDIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zLCAoZGplQGN5Z251cy5jb20pCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBBUkMgRUxGIEFCSS4gICovCisKKyNpZm5kZWYgX0VMRl9BUkNfSAorI2RlZmluZSBfRUxGX0FSQ19ICisKKyNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCisKKy8qIFJlbG9jYXRpb25zLiAgKi8KK1NUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hcmNfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSQ19OT05FLCAwKQorICBSRUxPQ19OVU1CRVIgKFJfQVJDXzMyLCAxKQorICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyNiwgMikKKyAgUkVMT0NfTlVNQkVSIChSX0FSQ19CMjJfUENSRUwsIDMpCisgIEVNUFRZX1JFTE9DICAoUl9BUkNfbWF4KQorRU5EX1JFTE9DX05VTUJFUlMKKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKworLyogRm91ciBiaXQgQVJDIG1hY2hpbmUgdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIEVGX0FSQ19NQUNICQkweDAwMDAwMDBmCisKKy8qIFZhcmlvdXMgQ1BVIHR5cGVzLiAgKi8KKyNkZWZpbmUgRV9BUkNfTUFDSF9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMQkweDAwMDAwMDAxCisjZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VEMgkweDAwMDAwMDAyCisjZGVmaW5lIEVfQVJDX01BQ0hfVU5VU0VENAkweDAwMDAwMDAzCisKKy8qIExlYXZlIGJpdHMgMHhmMCBhbG9uZSBpbiBjYXNlIHdlIGV2ZXIgaGF2ZSBtb3JlIHRoYW4gMTYgY3B1IHR5cGVzLgorICAgSGlnaGx5IHVubGlrZWx5LCBidXQgd2hhdCB0aGUgaGVjay4gICovCisKKy8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCisjZGVmaW5lIEVGX0FSQ19QSUMJCTB4MDAwMDAxMDAKKworI2VuZGlmIC8qIF9FTEZfQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FybS1vYWJpLmggYi9pbmNsdWRlL2VsZi9hcm0tb2FiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDk4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9hcm0tb2FiaS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0VMRl9BUk1fSAorI2RlZmluZSBfRUxGX0FSTV9ICisKKyNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCisjZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCisjZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0CisjZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4CisjZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCisjZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLworI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAorI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKKworLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCisjZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSworI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2CisjZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCisjZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKKworLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCisjZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAorCisvKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLworI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KKyNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLworCisvKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KKyNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCisKKy8qIFJlbG9jYXRpb24gdHlwZXMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDQpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMjIsICAgICA4KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9BTVBfVkNBTEw5LCAgMTApCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDExKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTIpICAgICAgIC8qIGN5Z251cyBleHRlbnNpb24gdG8gYWJpOiB0aHVtYiBjb25kaXRpb25hbCBicmFuY2ggKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMykKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTQpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MsIDI4KQorICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQywgIDI0OSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKK0VORF9SRUxPQ19OVU1CRVJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLmggYi9pbmNsdWRlL2VsZi9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk0YjEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvYXJtLmgKQEAgLTAsMCArMSw5NiBAQAorLyogQVJNIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfRUxGX0FSTV9ICisjZGVmaW5lIF9FTEZfQVJNX0gKKworI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUZfQVJNX1JFTEVYRUMgICAgIDB4MDEKKyNkZWZpbmUgRUZfQVJNX0hBU0VOVFJZICAgIDB4MDIKKyNkZWZpbmUgRUZfSU5URVJXT1JLICAgICAgIDB4MDQKKyNkZWZpbmUgRUZfQVBDU18yNiAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUZfQVBDU19GTE9BVCAgICAgIDB4MTAKKyNkZWZpbmUgRUZfUElDICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgRUZfQUxJR044CSAgIDB4NDAJCS8qIDgtYml0IHN0cnVjdHVyZSBhbGlnbm1lbnQgaXMgaW4gdXNlICovCisjZGVmaW5lIEVGX05FV19BQkkgICAgICAgICAweDgwCisjZGVmaW5lIEVGX09MRF9BQkkgICAgICAgICAweDEwMAorCisvKiBMb2NhbCBhbGlhc2VzIGZvciBzb21lIGZsYWdzIHRvIG1hdGNoIG5hbWVzIHVzZWQgYnkgQ09GRiBwb3J0LiAgKi8KKyNkZWZpbmUgRl9JTlRFUldPUksJICAgRUZfSU5URVJXT1JLCisjZGVmaW5lIEZfQVBDUzI2CSAgIEVGX0FQQ1NfMjYKKyNkZWZpbmUgRl9BUENTX0ZMT0FUCSAgIEVGX0FQQ1NfRkxPQVQKKyNkZWZpbmUgRl9QSUMgICAgICAgICAgICAgIEVGX1BJQworCisvKiBBZGRpdGlvbmFsIHN5bWJvbCB0eXBlcyBmb3IgVGh1bWIgKi8KKyNkZWZpbmUgU1RUX0FSTV9URlVOQyAgICAgMHhkCisKKy8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzICovCisjZGVmaW5lIFNIRl9FTlRSWVNFQ1QgICAgICAweDEwMDAwMDAwICAgLyogU2VjdGlvbiBjb250YWlucyBhbiBlbnRyeSBwb2ludCAqLworI2RlZmluZSBTSEZfQ09NREVGICAgICAgICAgMHg4MDAwMDAwMCAgIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwICovCisKKy8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncyAqLworI2RlZmluZSBQRl9BUk1fU0IgICAgICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlZ21lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIGFkZHJlc3NlZCBieSB0aGUgc3RhdGljIGJhc2UgKi8KKworLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCitTVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfYXJtX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fTk9ORSwgICAgICAgICAwKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMjQsICAgICAgICAgMSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMzMiwgICAgICAgIDIpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMMzIsICAgICAgICAzKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BDMTMsICAgICAgICAgNCkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlMxNiwgICAgICAgIDUpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTIsICAgICAgICA2KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9BQlM1LCAgICAgNykKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDgpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fU0JSRUwzMiwgICAgICA5KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9QQzIyLCAgICAxMCkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM4LCAgICAgMTEpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fQU1QX1ZDQUxMOSwgIDEyKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NXSTI0LCAgICAgICAxMykKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fU1dJOCwgICAgMTQpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fWFBDMjUsICAgICAgIDE1KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9YUEMyMiwgICAxNikKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9DT1BZLCAgICAgICAgMjApICAgICAgIC8qIGNvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTE9CX0RBVCwgICAgMjEpICAgICAgIC8qIGNyZWF0ZSBHT1QgZW50cnkgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9KVU1QX1NMT1QsICAgMjIpICAgICAgIC8qIGNyZWF0ZSBQTFQgZW50cnkgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9SRUxBVElWRSwgICAgMjMpICAgICAgIC8qIGFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1RPRkYsICAgICAgMjQpICAgICAgIC8qIDMyIGJpdCBvZmZzZXQgdG8gR09UICovCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UUEMsICAgICAgIDI1KSAgICAgICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVDMyLCAgICAgICAyNikgICAgICAgLyogMzIgYml0IEdPVCBlbnRyeSAqLworICBSRUxPQ19OVU1CRVIgKFJfQVJNX1BMVDMyLCAgICAgICAyNykgICAgICAgLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisgIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzEsIDI4KQorICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQzEsICA5OSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTAwKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dOVV9WVElOSEVSSVQsIDEwMSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMxMSwgICAgMTAyKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTAzKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCisgIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQzIsIDEwNCkKKyAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MyLCAgMjQ4KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JYUEMyNSwgICAgIDI0OSkKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKKyAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCisgIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQorICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKK0VORF9SRUxPQ19OVU1CRVJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvY29tbW9uLmggYi9pbmNsdWRlL2VsZi9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGEzYmEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvY29tbW9uLmgKQEAgLTAsMCArMSw0NTQgQEAKKy8qIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCisgICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCisgICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKKyAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgorICAgRm9yIGV4YW1wbGUsIEVMRk1BRzAgaXMgdGhlIGJ5dGUgMHg3RiBpbiBib3RoIHRoZSBpbnRlcm5hbCAoaW4tbWVtb3J5KQorICAgYW5kIGV4dGVybmFsIChpbi1maWxlKSByZXByZXNlbnRhdGlvbnMuICovCisKKyNpZm5kZWYgX0VMRl9DT01NT05fSAorI2RlZmluZSBfRUxGX0NPTU1PTl9ICisKKy8qIEZpZWxkcyBpbiBlX2lkZW50W10gKi8KKworI2RlZmluZSBFSV9NQUcwCQkwCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAwIGluZGV4ICovCisjZGVmaW5lIEVMRk1BRzAJCTB4N0YJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMCAqLworCisjZGVmaW5lIEVJX01BRzEJCTEJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMQkJJ0UnCS8qIE1hZ2ljIG51bWJlciBieXRlIDEgKi8KKworI2RlZmluZSBFSV9NQUcyCQkyCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAyIGluZGV4ICovCisjZGVmaW5lIEVMRk1BRzIJCSdMJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCisKKyNkZWZpbmUgRUlfTUFHMwkJMwkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMyBpbmRleCAqLworI2RlZmluZSBFTEZNQUczCQknRicJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMyAqLworCisjZGVmaW5lIEVJX0NMQVNTCTQJLyogRmlsZSBjbGFzcyAqLworI2RlZmluZSBFTEZDTEFTU05PTkUJMAkvKiBJbnZhbGlkIGNsYXNzICovCisjZGVmaW5lIEVMRkNMQVNTMzIJMQkvKiAzMi1iaXQgb2JqZWN0cyAqLworI2RlZmluZSBFTEZDTEFTUzY0CTIJLyogNjQtYml0IG9iamVjdHMgKi8KKworI2RlZmluZSBFSV9EQVRBCQk1CS8qIERhdGEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgRUxGREFUQU5PTkUJMAkvKiBJbnZhbGlkIGRhdGEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgRUxGREFUQTJMU0IJMQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBFTEZEQVRBMk1TQgkyCS8qIDIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuICovCisKKyNkZWZpbmUgRUlfVkVSU0lPTgk2CS8qIEZpbGUgdmVyc2lvbiAqLworCisjZGVmaW5lIEVJX09TQUJJICAgICAgICA3ICAgICAgIC8qIE9wZXJhdGluZyBTeXN0ZW0vQUJJIGluZGljYXRpb24gKi8KKyNkZWZpbmUgRUxGT1NBQklfU1lTViAgIDAgICAgICAgLyogVU5JWCBTeXN0ZW0gViBBQkkgKi8KKyNkZWZpbmUgRUxGT1NBQklfSFBVWCAgIDEgICAgICAgLyogSFAtVVggb3BlcmF0aW5nIHN5c3RlbSAqLworI2RlZmluZSBFTEZPU0FCSV9TVEFOREFMT05FIDI1NSAvKiBTdGFuZGFsb25lIChlbWJlZGRlZCkgYXBwbGljYXRpb24gKi8KKworI2RlZmluZSBFSV9BQklWRVJTSU9OICAgOCAgICAgICAvKiBBQkkgdmVyc2lvbiAqLworCisjZGVmaW5lIEVJX1BBRAkJOQkvKiBTdGFydCBvZiBwYWRkaW5nIGJ5dGVzICovCisKKworLyogVmFsdWVzIGZvciBlX3R5cGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIG9iamVjdCBmaWxlIHR5cGUgKi8KKworI2RlZmluZSBFVF9OT05FCQkwCS8qIE5vIGZpbGUgdHlwZSAqLworI2RlZmluZSBFVF9SRUwJCTEJLyogUmVsb2NhdGFibGUgZmlsZSAqLworI2RlZmluZSBFVF9FWEVDCQkyCS8qIEV4ZWN1dGFibGUgZmlsZSAqLworI2RlZmluZSBFVF9EWU4JCTMJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCisjZGVmaW5lIEVUX0NPUkUJCTQJLyogQ29yZSBmaWxlICovCisjZGVmaW5lIEVUX0xPT1MgICAgICAgICAweEZFMDAJLyogT3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyAqLworI2RlZmluZSBFVF9ISU9TICAgICAgICAgMHhGRUZGICAvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCisjZGVmaW5lIEVUX0xPUFJPQwkweEZGMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIEVUX0hJUFJPQwkweEZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIFZhbHVlcyBmb3IgZV9tYWNoaW5lLCB3aGljaCBpZGVudGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgKi8KKworI2RlZmluZSBFTV9OT05FCQkwCS8qIE5vIG1hY2hpbmUgKi8KKyNkZWZpbmUgRU1fTTMyCQkxCS8qIEFUJlQgV0UgMzIxMDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMJMgkvKiBTVU4gU1BBUkMgKi8KKyNkZWZpbmUgRU1fMzg2CQkzCS8qIEludGVsIDgwMzg2ICovCisjZGVmaW5lIEVNXzY4SwkJNAkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLworI2RlZmluZSBFTV84OEsJCTUJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KKyNkZWZpbmUgRU1fNDg2CQk2CS8qIEludGVsIDgwNDg2ICovCisjZGVmaW5lIEVNXzg2MAkJNwkvKiBJbnRlbCA4MDg2MCAqLworI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KKyNkZWZpbmUgRU1fUzM3MAkJOQkvKiBBbWRhaGwgKi8KKyNkZWZpbmUgRU1fTUlQU19SUzRfQkUgMTAJLyogTUlQUyBSNDAwMCBiaWctZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDICAgICAgMTUJLyogSFBQQSAqLworI2RlZmluZSBFTV9WUFA1NTAgICAgICAxNyAgICAgICAvKiBGdWppdHN1IFZQUDUwMCAqLworI2RlZmluZSBFTV9TUEFSQzMyUExVUyAxOAkvKiBTdW4ncyAidjhwbHVzIiAqLworI2RlZmluZSBFTV85NjAgICAgICAgICAxOSAgICAgICAvKiBJbnRlbCA4MDk2MCAqLworI2RlZmluZSBFTV9QUEMJICAgICAgIDIwCS8qIFBvd2VyUEMgKi8KKworI2RlZmluZSBFTV9WODAwICAgICAgICAzNgkvKiBORUMgVjgwMCBzZXJpZXMgKi8KKyNkZWZpbmUgRU1fRlIyMAkgICAgICAgMzcJLyogRnVqaXRzdSBGUjIwICovCisjZGVmaW5lIEVNX1JIMzIJICAgICAgIDM4ICAgICAgIC8qIFRSVyBSSDMyICovCisjZGVmaW5lIEVNX01DT1JFICAgICAgIDM5ICAgICAgIC8qIE1vdG9yb2xsYSBNQ29yZSAqLyAvKiBNYXkgYWxzbyBiZSB0YWtlbiBieSBGdWppdHN1IE1NQSAqLworI2RlZmluZSBFTV9BUk0JICAgICAgIDQwCS8qIEFSTSAqLworI2RlZmluZSBFTV9PTERfQUxQSEEgICA0MQkvKiBEaWdpdGFsIEFscGhhICovCisjZGVmaW5lIEVNX1NICSAgICAgICA0MgkvKiBIaXRhY2hpIFNIICovCisjZGVmaW5lIEVNX1NQQVJDVjkgICAgIDQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLworI2RlZmluZSBFTV9UUklDT1JFICAgICA0NCAgICAgICAvKiBTaWVtZW5zIFRyaWNvcmUgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0FSQyAgICAgICAgIDQ1ICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSwgQXJnb25hdXQgVGVjaG5vbG9naWVzIEluYy4gKi8KKyNkZWZpbmUgRU1fSDhfMzAwICAgICAgNDYgICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KKyNkZWZpbmUgRU1fSDhfMzAwSCAgICAgNDcgICAgICAgLyogSGl0YWNoaSBIOC8zMDBIICovCisjZGVmaW5lIEVNX0g4UyAgICAgICAgIDQ4ICAgICAgIC8qIEhpdGFjaGkgSDhTICovCisjZGVmaW5lIEVNX0g4XzUwMCAgICAgIDQ5ICAgICAgIC8qIEhpdGFjaGkgSDgvNTAwICovCisjZGVmaW5lIEVNX0lBXzY0ICAgICAgIDUwICAgICAgIC8qIEludGVsIE1lcmNlZFRNIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9NSVBTX1ggICAgICA1MSAgICAgICAvKiBTdGFuZm9yZCBNSVBTLVggKi8KKyNkZWZpbmUgRU1fQ09MREZJUkUgICAgNTIgICAgICAgLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KKyNkZWZpbmUgRU1fNjhIQzEyICAgICAgNTMgICAgICAgLyogTW90b3JvbGEgTTY4SEMxMiAqLworCisvKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYXNzaWduIG5ldyB1bm9mZmljaWFsIEVNXyogdmFsdWVzLCBwbGVhc2UgcGljayBsYXJnZQorICAgcmFuZG9tIG51bWJlcnMgKDB4ODUyMywgMHhhN2YyLCBldGMuKSB0byBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBjb2xsaXNpb24KKyAgIHdpdGggb2ZmaWNpYWwgb3Igbm9uLUdOVSB1bm9mZmljaWFsIHZhbHVlcy4KKworICAgTk9URTogRG8gbm90IGp1c3QgaW5jcmVtZW50IHRoZSBtb3N0IHJlY2VudCBudW1iZXIgYnkgb25lLgorICAgU29tZWJvZHkgZWxzZSBzb21ld2hlcmUgd2lsbCBkbyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nLCBhbmQgeW91CisgICB3aWxsIGhhdmUgYSBjb2xsaXNpb24uICBJbnN0ZWFkLCBwaWNrIGEgcmFuZG9tIG51bWJlci4gICovCisKKy8qIEN5Z251cyBQb3dlclBDIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLworI2RlZmluZSBFTV9DWUdOVVNfUE9XRVJQQyAweDkwMjUKKworLyogT2xkIHZlcnNpb24gb2YgU3BhcmMgdjksIGZyb20gYmVmb3JlIHRoZSBBQkk7IHRoaXMgc2hvdWxkIGJlCisgICByZW1vdmVkIHNob3J0bHkuICAqLworI2RlZmluZSBFTV9PTERfU1BBUkNWOQkxMQorCisvKiBPbGQgdmVyc2lvbiBvZiBQb3dlclBDLCB0aGlzIHNob3VsZCBiZSByZW1vdmVkIHNob3J0bHkuICovCisjZGVmaW5lIEVNX1BQQ19PTEQJMTcKKworLyogQ3lnbnVzIEFSQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX0FSQyAweDkwNDAKKworLyogQ3lnbnVzIE0zMlIgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCisjZGVmaW5lIEVNX0NZR05VU19NMzJSIDB4OTA0MQorCisvKiBBbHBoYSBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KKyNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2CisKKy8qIEQxMFYgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCisjZGVmaW5lIEVNX0NZR05VU19EMTBWCTB4NzY1MAorCisvKiBEMzBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLworI2RlZmluZSBFTV9DWUdOVVNfRDMwVgkweDc2NzYKKworLyogVjg1MCBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAJMHg5MDgwCisKKy8qIG1uMTAyMDAgYW5kIG1uMTAzMDAgYmFja2VuZCBtYWdpYyBudW1iZXJzLgorICAgV3JpdHRlbiBpbiB0aGUgYWJzZW5zZSBvZiBhbiBBQkkuICAqLworI2RlZmluZSBFTV9DWUdOVVNfTU4xMDIwMAkweGRlYWQKKyNkZWZpbmUgRU1fQ1lHTlVTX01OMTAzMDAJMHhiZWVmCisKKy8qIEZSMzAgbWFnaWMgbnVtYmVyIC0gbm8gRUFCSSBhdmFpbGFibGUuICAqLworI2RlZmluZSBFTV9DWUdOVVNfRlIzMAkJMHgzMzMwCisKKy8qIFNlZSB0aGUgYWJvdmUgY29tbWVudCBiZWZvcmUgeW91IGFkZCBhIG5ldyBFTV8qIHZhbHVlIGhlcmUuICAqLworCisvKiBWYWx1ZXMgZm9yIGVfdmVyc2lvbiAqLworCisjZGVmaW5lIEVWX05PTkUJCTAJCS8qIEludmFsaWQgRUxGIHZlcnNpb24gKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVAkxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKworLyogVmFsdWVzIGZvciBwcm9ncmFtIGhlYWRlciwgcF90eXBlIGZpZWxkICovCisKKyNkZWZpbmUJUFRfTlVMTAkJMAkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCisjZGVmaW5lIFBUX0xPQUQJCTEJCS8qIExvYWRhYmxlIHByb2dyYW0gc2VnbWVudCAqLworI2RlZmluZSBQVF9EWU5BTUlDCTIJCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQVF9JTlRFUlAJMwkJLyogUHJvZ3JhbSBpbnRlcnByZXRlciAqLworI2RlZmluZSBQVF9OT1RFCQk0CQkvKiBBdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfU0hMSUIJNQkJLyogUmVzZXJ2ZWQsIHVuc3BlY2lmaWVkIHNlbWFudGljcyAqLworI2RlZmluZSBQVF9QSERSCQk2CQkvKiBFbnRyeSBmb3IgaGVhZGVyIHRhYmxlIGl0c2VsZiAqLworI2RlZmluZSBQVF9MT09TICAgICAgICAgMHg2MDAwMDAwMAkvKiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9ISU9TICAgICAgICAgMHg2ZmZmZmZmZgkvKiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIFByb2dyYW0gc2VnbWVudCBwZXJtaXNzaW9ucywgaW4gcHJvZ3JhbSBoZWFkZXIgcF9mbGFncyBmaWVsZCAqLworCisjZGVmaW5lIFBGX1gJCSgxIDw8IDApCS8qIFNlZ21lbnQgaXMgZXhlY3V0YWJsZSAqLworI2RlZmluZSBQRl9XCQkoMSA8PCAxKQkvKiBTZWdtZW50IGlzIHdyaXRhYmxlICovCisjZGVmaW5lIFBGX1IJCSgxIDw8IDIpCS8qIFNlZ21lbnQgaXMgcmVhZGFibGUgKi8KKyNkZWZpbmUgUEZfTUFTS09TCTB4MEYwMDAwMDAJLyogT1Mtc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLworI2RlZmluZSBQRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByZXNlcnZlZCBiaXRzICovCisKKy8qIFZhbHVlcyBmb3Igc2VjdGlvbiBoZWFkZXIsIHNoX3R5cGUgZmllbGQgKi8KKworI2RlZmluZSBTSFRfTlVMTAkwCQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KKyNkZWZpbmUgU0hUX1BST0dCSVRTCTEJCS8qIFByb2dyYW0gc3BlY2lmaWMgKHByaXZhdGUpIGRhdGEgKi8KKyNkZWZpbmUgU0hUX1NZTVRBQgkyCQkvKiBMaW5rIGVkaXRpbmcgc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIFNIVF9TVFJUQUIJMwkJLyogQSBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgU0hUX1JFTEEJNAkJLyogUmVsb2NhdGlvbiBlbnRyaWVzIHdpdGggYWRkZW5kcyAqLworI2RlZmluZSBTSFRfSEFTSAk1CQkvKiBBIHN5bWJvbCBoYXNoIHRhYmxlICovCisjZGVmaW5lIFNIVF9EWU5BTUlDCTYJCS8qIEluZm9ybWF0aW9uIGZvciBkeW5hbWljIGxpbmtpbmcgKi8KKyNkZWZpbmUgU0hUX05PVEUJNwkJLyogSW5mb3JtYXRpb24gdGhhdCBtYXJrcyBmaWxlICovCisjZGVmaW5lIFNIVF9OT0JJVFMJOAkJLyogU2VjdGlvbiBvY2N1cGllcyBubyBzcGFjZSBpbiBmaWxlICovCisjZGVmaW5lIFNIVF9SRUwJCTkJCS8qIFJlbG9jYXRpb24gZW50cmllcywgbm8gYWRkZW5kcyAqLworI2RlZmluZSBTSFRfU0hMSUIJMTAJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgU0hUX0RZTlNZTQkxMQkJLyogRHluYW1pYyBsaW5raW5nIHN5bWJvbCB0YWJsZSAqLworCisjZGVmaW5lIFNIVF9MT09TICAgICAgICAweDYwMDAwMDAwICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCisjZGVmaW5lIFNIVF9ISU9TICAgICAgICAweDZmZmZmZmZmICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCisKKy8qIFRoZSBuZXh0IHRocmVlIHNlY3Rpb24gdHlwZXMgYXJlIGRlZmluZWQgYnkgU29sYXJpcywgYW5kIGFyZSBuYW1lZAorICAgU0hUX1NVTlcqLiAgV2UgdXNlIHRoZW0gaW4gR05VIGNvZGUsIHNvIHdlIGFsc28gZGVmaW5lIFNIVF9HTlUqCisgICB2ZXJzaW9ucy4gICovCisjZGVmaW5lIFNIVF9TVU5XX3ZlcmRlZgkweDZmZmZmZmZkCS8qIFZlcnNpb25zIGRlZmluZWQgYnkgZmlsZSAqLworI2RlZmluZSBTSFRfU1VOV192ZXJuZWVkIDB4NmZmZmZmZmUJLyogVmVyc2lvbnMgbmVlZGVkIGJ5IGZpbGUgKi8KKyNkZWZpbmUgU0hUX1NVTldfdmVyc3ltCTB4NmZmZmZmZmYJLyogU3ltYm9sIHZlcnNpb25zICovCisKKyNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJU0hUX1NVTldfdmVyZGVmCisjZGVmaW5lIFNIVF9HTlVfdmVybmVlZAlTSFRfU1VOV192ZXJuZWVkCisjZGVmaW5lIFNIVF9HTlVfdmVyc3ltCVNIVF9TVU5XX3ZlcnN5bQorCisjZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLworI2RlZmluZSBTSFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KKyNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLworI2RlZmluZSBTSFRfSElVU0VSCTB4OEZGRkZGRkYJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCisKKy8qIFZhbHVlcyBmb3Igc2VjdGlvbiBoZWFkZXIsIHNoX2ZsYWdzIGZpZWxkICovCisKKyNkZWZpbmUgU0hGX1dSSVRFCSgxIDw8IDApCS8qIFdyaXRhYmxlIGRhdGEgZHVyaW5nIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTSEZfQUxMT0MJKDEgPDwgMSkJLyogT2NjdXBpZXMgbWVtb3J5IGR1cmluZyBleGVjdXRpb24gKi8KKyNkZWZpbmUgU0hGX0VYRUNJTlNUUgkoMSA8PCAyKQkvKiBFeGVjdXRhYmxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFNIRl9NQVNLT1MJMHgwRjAwMDAwMAkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgU0hGX01BU0tQUk9DCTB4RjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcyAqLworCisvKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIGNvcmUgZmlsZXMuICovCisKKyNkZWZpbmUgTlRfUFJTVEFUVVMJMQkJLyogQ29udGFpbnMgY29weSBvZiBwcnN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfRlBSRUdTRVQJMgkJLyogQ29udGFpbnMgY29weSBvZiBmcHJlZ3NldCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJQU0lORk8JMwkJLyogQ29udGFpbnMgY29weSBvZiBwcnBzaW5mbyBzdHJ1Y3QgKi8KKworLyogTm90ZSBzZWdtZW50cyBmb3IgY29yZSBmaWxlcyBvbiBkaXItc3R5bGUgcHJvY2ZzIHN5c3RlbXMuICovCisKKyNkZWZpbmUgTlRfUFNUQVRVUwkxMAkJLyogSGFzIGEgc3RydWN0IHBzdGF0dXMgKi8KKyNkZWZpbmUgTlRfRlBSRUdTCTEyCQkvKiBIYXMgYSBzdHJ1Y3QgZnByZWdzZXQgKi8KKyNkZWZpbmUgTlRfUFNJTkZPCTEzCQkvKiBIYXMgYSBzdHJ1Y3QgcHNpbmZvICovCisjZGVmaW5lIE5UX0xXUFNUQVRVUwkxNgkJLyogSGFzIGEgc3RydWN0IGx3cHN0YXR1c190ICovCisjZGVmaW5lIE5UX0xXUFNJTkZPCTE3CQkvKiBIYXMgYSBzdHJ1Y3QgbHdwc2luZm9fdCAqLworCisvKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCisvKiAoT25seSBmb3IgaHBwYSByaWdodCBub3cuICBTaG91bGQgdGhpcyBiZSBtb3ZlZCBlbHNld2hlcmU/KSAgKi8KKworI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLworCisvKiBUaGVzZSB0aHJlZSBtYWNyb3MgZGlzYXNzZW1ibGUgYW5kIGFzc2VtYmxlIGEgc3ltYm9sIHRhYmxlIHN0X2luZm8gZmllbGQsCisgICB3aGljaCBjb250YWlucyB0aGUgc3ltYm9sIGJpbmRpbmcgYW5kIHN5bWJvbCB0eXBlLiAgVGhlIFNUQl8gYW5kIFNUVF8KKyAgIGRlZmluZXMgaWRlbnRpZnkgdGhlIGJpbmRpbmcgYW5kIHR5cGUuICovCisKKyNkZWZpbmUgRUxGX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgaW50KSh2YWwpKSA+PiA0KQorI2RlZmluZSBFTEZfU1RfVFlQRSh2YWwpCQkoKHZhbCkgJiAweEYpCisjZGVmaW5lIEVMRl9TVF9JTkZPKGJpbmQsdHlwZSkJCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4RikpCisKKyNkZWZpbmUgU1ROX1VOREVGCTAJCS8qIHVuZGVmaW5lZCBzeW1ib2wgaW5kZXggKi8KKworI2RlZmluZSBTVEJfTE9DQUwJMAkJLyogU3ltYm9sIG5vdCB2aXNpYmxlIG91dHNpZGUgb2JqICovCisjZGVmaW5lIFNUQl9HTE9CQUwJMQkJLyogU3ltYm9sIHZpc2libGUgb3V0c2lkZSBvYmogKi8KKyNkZWZpbmUgU1RCX1dFQUsJMgkJLyogTGlrZSBnbG9iYWxzLCBsb3dlciBwcmVjZWRlbmNlICovCisjZGVmaW5lIFNUQl9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCisjZGVmaW5lIFNUQl9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCisjZGVmaW5lIFNUQl9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLworI2RlZmluZSBTVEJfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KKworI2RlZmluZSBTVFRfTk9UWVBFCTAJCS8qIFN5bWJvbCB0eXBlIGlzIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIFNUVF9PQkpFQ1QJMQkJLyogU3ltYm9sIGlzIGEgZGF0YSBvYmplY3QgKi8KKyNkZWZpbmUgU1RUX0ZVTkMJMgkJLyogU3ltYm9sIGlzIGEgY29kZSBvYmplY3QgKi8KKyNkZWZpbmUgU1RUX1NFQ1RJT04JMwkJLyogU3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24gKi8KKyNkZWZpbmUgU1RUX0ZJTEUJNAkJLyogU3ltYm9sIGdpdmVzIGEgZmlsZSBuYW1lICovCisjZGVmaW5lIFNUVF9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCisjZGVmaW5lIFNUVF9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCisjZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLworI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KKworLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMsIHdoaWNoIG1heSBzaG93IHVwIGluIHN0X3NobmR4IGZpZWxkcywgYW1vbmcKKyAgIG90aGVyIHBsYWNlcy4gKi8KKworI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gcmVmZXJlbmNlICovCisjZGVmaW5lIFNITl9MT1JFU0VSVkUJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCisjZGVmaW5lIFNITl9MT1BST0MJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCisjZGVmaW5lIFNITl9ISVBST0MJMHhGRjFGCQkvKiBFbmQgcmFuZ2Ugb2YgYXBwbC1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fTE9PUyAgICAgICAgMHhGRjIwCQkvKiBPUyBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCisjZGVmaW5lIFNITl9ISU9TICAgICAgICAweEZGM0YJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KKyNkZWZpbmUgU0hOX0FCUwkJMHhGRkYxCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLworI2RlZmluZSBTSE5fQ09NTU9OCTB4RkZGMgkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgaW4gY29tbW9uICovCisjZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhGRkZGCQkvKiBFbmQgcmFuZ2Ugb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLworCisvKiByZWxvY2F0aW9uIGluZm8gaGFuZGxpbmcgbWFjcm9zICovCisKKyNkZWZpbmUgRUxGMzJfUl9TWU0oaSkJCSgoaSkgPj4gOCkKKyNkZWZpbmUgRUxGMzJfUl9UWVBFKGkpCQkoKGkpICYgMHhmZikKKyNkZWZpbmUgRUxGMzJfUl9JTkZPKHMsdCkJKCgocykgPDwgOCkgKyAoKHQpICYgMHhmZikpCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCSgoaSkgPj4gMzIpCisjZGVmaW5lIEVMRjY0X1JfVFlQRShpKQkJKChpKSAmIDB4ZmZmZmZmZmYpCisjZGVmaW5lIEVMRjY0X1JfSU5GTyhzLHQpCSgoKGJmZF92bWEpIChzKSA8PCAzMikgKyAoYmZkX3ZtYSkgKHQpKQorCisvKiBEeW5hbWljIHNlY3Rpb24gdGFncyAqLworCisjZGVmaW5lIERUX05VTEwJCTAKKyNkZWZpbmUgRFRfTkVFREVECTEKKyNkZWZpbmUgRFRfUExUUkVMU1oJMgorI2RlZmluZSBEVF9QTFRHT1QJMworI2RlZmluZSBEVF9IQVNICQk0CisjZGVmaW5lIERUX1NUUlRBQgk1CisjZGVmaW5lIERUX1NZTVRBQgk2CisjZGVmaW5lIERUX1JFTEEJCTcKKyNkZWZpbmUgRFRfUkVMQVNaCTgKKyNkZWZpbmUgRFRfUkVMQUVOVAk5CisjZGVmaW5lIERUX1NUUlNaCTEwCisjZGVmaW5lIERUX1NZTUVOVAkxMQorI2RlZmluZSBEVF9JTklUCQkxMgorI2RlZmluZSBEVF9GSU5JCQkxMworI2RlZmluZSBEVF9TT05BTUUJMTQKKyNkZWZpbmUgRFRfUlBBVEgJMTUKKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKKyNkZWZpbmUgRFRfUkVMCQkxNworI2RlZmluZSBEVF9SRUxTWgkxOAorI2RlZmluZSBEVF9SRUxFTlQJMTkKKyNkZWZpbmUgRFRfUExUUkVMCTIwCisjZGVmaW5lIERUX0RFQlVHCTIxCisjZGVmaW5lIERUX1RFWFRSRUwJMjIKKyNkZWZpbmUgRFRfSk1QUkVMCTIzCisjZGVmaW5lIERUX0JJTkRfTk9XICAgICAyNAorI2RlZmluZSBEVF9JTklUX0FSUkFZICAgMjUKKyNkZWZpbmUgRFRfRklOSV9BUlJBWSAgIDI2CisjZGVmaW5lIERUX0lOSVRfQVJSQVlTWiAyNworI2RlZmluZSBEVF9GSU5JX0FSUkFZU1ogMjgKKworI2RlZmluZSBEVF9MT09TICAgICAgICAgMHg2MDAwMDAwMAorI2RlZmluZSBEVF9ISU9TICAgICAgICAgMHg2ZmZmZmZmZgorCisvKiBUaGUgbmV4dCBmb3VyIGR5bmFtaWMgdGFncyBhcmUgdXNlZCBvbiBTb2xhcmlzLiAgV2Ugc3VwcG9ydCB0aGVtCisgICBldmVyeXdoZXJlLiAgKi8KKyNkZWZpbmUgRFRfVkFMUk5HTE8JMHg2ZmZmZmQwMAorI2RlZmluZSBEVF9QTFRQQURTWgkweDZmZmZmZGY5CisjZGVmaW5lIERUX01PVkVFTlQJMHg2ZmZmZmRmYQorI2RlZmluZSBEVF9NT1ZFU1oJMHg2ZmZmZmRmYgorI2RlZmluZSBEVF9GRUFUVVJFXzEJMHg2ZmZmZmRmYworI2RlZmluZSBEVF9QT1NGTEFHXzEJMHg2ZmZmZmRmZAorI2RlZmluZSBEVF9TWU1JTlNaCTB4NmZmZmZkZmUKKyNkZWZpbmUgRFRfU1lNSU5FTlQJMHg2ZmZmZmRmZgorI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCisKKyNkZWZpbmUgRFRfQUREUlJOR0xPCTB4NmZmZmZlMDAKKyNkZWZpbmUgRFRfU1lNSU5GTwkweDZmZmZmZWZmCisjZGVmaW5lIERUX0FERFJSTkdISQkweDZmZmZmZWZmCisKKyNkZWZpbmUgRFRfUkVMQUNPVU5UCTB4NmZmZmZmZjkKKyNkZWZpbmUgRFRfUkVMQ09VTlQJMHg2ZmZmZmZmYQorI2RlZmluZSBEVF9GTEFHU18xCTB4NmZmZmZmZmIKKyNkZWZpbmUgRFRfVkVSREVGCTB4NmZmZmZmZmMKKyNkZWZpbmUgRFRfVkVSREVGTlVNCTB4NmZmZmZmZmQKKyNkZWZpbmUgRFRfVkVSTkVFRAkweDZmZmZmZmZlCisjZGVmaW5lIERUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgorCisvKiBUaGlzIHRhZyBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFNvbGFyaXMgdmVyc2lvbiBzY2hlbWUuICAqLworI2RlZmluZSBEVF9WRVJTWU0JMHg2ZmZmZmZmMAorCisjZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCisjZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCisKKy8qIFRoZXNlIHNlY3Rpb24gdGFncyBhcmUgdXNlZCBvbiBTb2xhcmlzLiAgV2Ugc3VwcG9ydCB0aGVtCisgICBldmVyeXdoZXJlLCBhbmQgaG9wZSB0aGV5IGRvIG5vdCBjb25mbGljdC4gICovCisKKyNkZWZpbmUgRFRfQVVYSUxJQVJZCTB4N2ZmZmZmZmQKKyNkZWZpbmUgRFRfVVNFRAkJMHg3ZmZmZmZmZQorI2RlZmluZSBEVF9GSUxURVIJMHg3ZmZmZmZmZgorCisvKiBWYWx1ZXMgdXNlZCBpbiBEVF9GRUFUVVJFXzEgLmR5bmFtaWMgZW50cnkuICAqLworI2RlZmluZSBEVEZfMV9QQVJJTklUCTB4MDAwMDAwMDEKKworLyogRmxhZyB2YWx1ZXMgdXNlZCBpbiB0aGUgRFRfUE9TRkxBR18xIC5keW5hbWljIGVudHJ5LiAgKi8KKyNkZWZpbmUgREZfUDFfTEFaWUxPQUQJMHgwMDAwMDAwMQorI2RlZmluZSBERl9QMV9HUk9VUFBFUk0JMHgwMDAwMDAwMgorCisvKiBGbGFnIHZhbHVlIGluIGluIHRoZSBEVF8xX0ZMQUdTIC5keW5hbWljIGVudHJ5LiAgKi8KKyNkZWZpbmUgREZfMV9OT1cJMHgwMDAwMDAwMQorI2RlZmluZSBERl8xX0dMT0JBTAkweDAwMDAwMDAyCisjZGVmaW5lIERGXzFfR1JPVVAJMHgwMDAwMDAwNAorI2RlZmluZSBERl8xX05PREVMRVRFCTB4MDAwMDAwMDgKKyNkZWZpbmUgREZfMV9MT0FERkxUUgkweDAwMDAwMDEwCisjZGVmaW5lIERGXzFfSU5JVEZJUlNUCTB4MDAwMDAwMjAKKyNkZWZpbmUgREZfMV9OT09QRU4JMHgwMDAwMDA0MAorI2RlZmluZSBERl8xX09SSUdJTgkweDAwMDAwMDgwCisjZGVmaW5lIERGXzFfRElSRUNUCTB4MDAwMDAxMDAKKyNkZWZpbmUgREZfMV9UUkFOUwkweDAwMDAwMjAwCisjZGVmaW5lIERGXzFfSU5URVJQT1NFCTB4MDAwMDA0MDAKKworLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJkZWYKKyAgIHN0cnVjdHVyZS4gICovCisKKyNkZWZpbmUgVkVSX0RFRl9OT05FCQkwCisjZGVmaW5lIFZFUl9ERUZfQ1VSUkVOVAkJMQorCisvKiBUaGVzZSBjb25zdGFudHMgYXBwZWFyIGluIHRoZSB2ZF9mbGFncyBmaWVsZCBvZiBhIEVsZjMyX1ZlcmRlZgorICAgc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBWRVJfRkxHX0JBU0UJCTB4MQorI2RlZmluZSBWRVJfRkxHX1dFQUsJCTB4MgorCisvKiBUaGVzZSBzcGVjaWFsIGNvbnN0YW50cyBjYW4gYmUgZm91bmQgaW4gYW4gRWxmMzJfVmVyc3ltIGZpZWxkLiAgKi8KKworI2RlZmluZSBWRVJfTkRYX0xPQ0FMCQkwCisjZGVmaW5lIFZFUl9ORFhfR0xPQkFMCQkxCisKKy8qIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGEgRWxmMzJfVmVybmVlZAorICAgc3RydWN0dXJlLiAgKi8KKworI2RlZmluZSBWRVJfTkVFRF9OT05FCQkwCisjZGVmaW5lIFZFUl9ORUVEX0NVUlJFTlQJMQorCisvKiBUaGlzIGZsYWcgYXBwZWFycyBpbiBhIFZlcnN5bSBzdHJ1Y3R1cmUuICBJdCBtZWFucyB0aGF0IHRoZSBzeW1ib2wKKyAgIGlzIGhpZGRlbiwgYW5kIGlzIG9ubHkgdmlzaWJsZSB3aXRoIGFuIGV4cGxpY2l0IHZlcnNpb24gbnVtYmVyLgorICAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLworCisjZGVmaW5lIFZFUlNZTV9ISURERU4JCTB4ODAwMAorCisvKiBUaGlzIGlzIHRoZSBtYXNrIGZvciB0aGUgcmVzdCBvZiB0aGUgVmVyc3ltIGluZm9ybWF0aW9uLiAgKi8KKworI2RlZmluZSBWRVJTWU1fVkVSU0lPTgkJMHg3ZmZmCisKKy8qIFRoaXMgaXMgYSBzcGVjaWFsIHRva2VuIHdoaWNoIGFwcGVhcnMgYXMgcGFydCBvZiBhIHN5bWJvbCBuYW1lLiAgSXQKKyAgIGluZGljdGVzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgYWN0dWFsbHkgdGhlIG5hbWUgb2YgYQorICAgdmVyc2lvbiBub2RlLCBhbmQgaXMgbm90IHBhcnQgb2YgdGhlIGFjdHVhbCBuYW1lLiAgVGhpcyBpcyBhIEdOVQorICAgZXh0ZW5zaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBzeW1ib2wgbmFtZSBgc3RhdEB2ZXIyJyBpcyB0YWtlbiB0bworICAgbWVhbiB0aGUgc3ltYm9sIGBzdGF0JyBpbiB2ZXJzaW9uIGB2ZXIyJy4gICovCisKKyNkZWZpbmUgRUxGX1ZFUl9DSFIJJ0AnCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lfYm91bmR0by4gICovCisjZGVmaW5lIFNZTUlORk9fQlRfU0VMRgkJMHhmZmZmCS8qIFN5bWJvbCBib3VuZCB0byBzZWxmICovCisjZGVmaW5lIFNZTUlORk9fQlRfUEFSRU5UCTB4ZmZmZQkvKiBTeW1ib2wgYm91bmQgdG8gcGFyZW50ICovCisjZGVmaW5lIFNZTUlORk9fQlRfTE9XUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMgKi8KKworLyogUG9zc2libGUgYml0bWFza3MgZm9yIHNpX2ZsYWdzLiAgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfRElSRUNUCTB4MDAwMQkvKiBEaXJlY3QgYm91bmQgc3ltYm9sICovCisjZGVmaW5lIFNZTUlORk9fRkxHX1BBU1NUSFJVCTB4MDAwMgkvKiBQYXNzLXRocnUgc3ltYm9sIGZvciB0cmFuc2xhdG9yICovCisjZGVmaW5lIFNZTUlORk9fRkxHX0NPUFkJMHgwMDA0CS8qIFN5bWJvbCBpcyBhIGNvcHktcmVsb2MgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfTEFaWUxPQUQJMHgwMDA4CS8qIFN5bWJvbCBib3VuZCB0byBvYmplY3QgdG8gYmUgbGF6eQorCQkJCQkgICBsb2FkZWQgKi8KKy8qIFN5bWluZm8gdmVyc2lvbiB2YWx1ZXMuICAqLworI2RlZmluZSBTWU1JTkZPX05PTkUJCTAKKyNkZWZpbmUgU1lNSU5GT19DVVJSRU5UCQkxCisjZGVmaW5lIFNZTUlORk9fTlVNCQkyCisKKyNlbmRpZiAvKiBfRUxGX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kMTB2LmggYi9pbmNsdWRlL2VsZi9kMTB2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNzljOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL2QxMHYuaApAQCAtMCwwICsxLDM4IEBACisvKiBkMTB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfRUxGX0QxMFZfSAorI2RlZmluZSBfRUxGX0QxMFZfSAorCisjaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgorCisvKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KK1NUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9kMTB2X3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9EMTBWX05PTkUsIDApCisgIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX1IsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9EMTBWXzEwX1BDUkVMX0wsIDIpCisgIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE2LCAzKQorICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xOCwgNCkKKyAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMThfUENSRUwsIDUpCisgIFJFTE9DX05VTUJFUiAoUl9EMTBWXzMyLCA2KQorICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRJTkhFUklULCA3KQorICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9HTlVfVlRFTlRSWSwgOCkKK0VORF9SRUxPQ19OVU1CRVJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZDMwdi5oIGIvaW5jbHVkZS9lbGYvZDMwdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmFkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9kMzB2LmgKQEAgLTAsMCArMSw0MiBAQAorLyogZDMwdiBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0VMRl9EMzBWX0gKKyNkZWZpbmUgX0VMRl9EMzBWX0gKKworI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKKworLyogUmVsb2NhdGlvbnMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2QzMHZfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfTk9ORSwgMCkKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfNiwgMSkKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfOV9QQ1JFTCwgMikKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfOV9QQ1JFTF9SLCAzKQorICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNSwgNCkKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTVfUENSRUwsIDUpCisgIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1X1BDUkVMX1IsIDYpCisgIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxLCA3KQorICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMV9QQ1JFTCwgOCkKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjFfUENSRUxfUiwgOSkKKyAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzIsIDEwKQorICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMl9QQ1JFTCwgMTEpCisgIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyX05PUk1BTCwgMTIpCitFTkRfUkVMT0NfTlVNQkVSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2R3YXJmLmggYi9pbmNsdWRlL2VsZi9kd2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzNkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9kd2FyZi5oCkBAIC0wLDAgKzEsMzE5IEBACisvKiBEZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zIG9mIGNvZGVzIHJlbGF0aW5nIHRvIHRoZSBEV0FSRiBzeW1ib2xpYworICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvcm1hdC4KKworICAgV3JpdHRlbiBieSBSb24gR3VpbG1ldHRlIChyZmdAbmNkLmNvbSkKKworQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCisKK0dOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCisgICBSZXZpc2lvbiAxLjAuMSAoQXByaWwgOCwgMTk5MikgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKKyAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCisgICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQorICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuCisqLworCisjaWZuZGVmIF9FTEZfRFdBUkZfSAorI2RlZmluZSBfRUxGX0RXQVJGX0gKKworLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfdGFnIHsKKyAgICBUQUdfcGFkZGluZwkJCT0gMHgwMDAwLAorICAgIFRBR19hcnJheV90eXBlCQk9IDB4MDAwMSwKKyAgICBUQUdfY2xhc3NfdHlwZQkJPSAweDAwMDIsCisgICAgVEFHX2VudHJ5X3BvaW50CQk9IDB4MDAwMywKKyAgICBUQUdfZW51bWVyYXRpb25fdHlwZQk9IDB4MDAwNCwKKyAgICBUQUdfZm9ybWFsX3BhcmFtZXRlcgk9IDB4MDAwNSwKKyAgICBUQUdfZ2xvYmFsX3N1YnJvdXRpbmUJPSAweDAwMDYsCisgICAgVEFHX2dsb2JhbF92YXJpYWJsZQkJPSAweDAwMDcsCisgICAgCQkJCS8qIDB4MDAwOCAtLSByZXNlcnZlZCAqLworCQkJCS8qIDB4MDAwOSAtLSByZXNlcnZlZCAqLworICAgIFRBR19sYWJlbAkJCT0gMHgwMDBhLAorICAgIFRBR19sZXhpY2FsX2Jsb2NrCQk9IDB4MDAwYiwKKyAgICBUQUdfbG9jYWxfdmFyaWFibGUJCT0gMHgwMDBjLAorICAgIFRBR19tZW1iZXIJCQk9IDB4MDAwZCwKKwkJCQkvKiAweDAwMGUgLS0gcmVzZXJ2ZWQgKi8KKyAgICBUQUdfcG9pbnRlcl90eXBlCQk9IDB4MDAwZiwKKyAgICBUQUdfcmVmZXJlbmNlX3R5cGUJCT0gMHgwMDEwLAorICAgIFRBR19jb21waWxlX3VuaXQJCT0gMHgwMDExLAorICAgIFRBR19zdHJpbmdfdHlwZQkJPSAweDAwMTIsCisgICAgVEFHX3N0cnVjdHVyZV90eXBlCQk9IDB4MDAxMywKKyAgICBUQUdfc3Vicm91dGluZQkJPSAweDAwMTQsCisgICAgVEFHX3N1YnJvdXRpbmVfdHlwZQkJPSAweDAwMTUsCisgICAgVEFHX3R5cGVkZWYJCQk9IDB4MDAxNiwKKyAgICBUQUdfdW5pb25fdHlwZQkJPSAweDAwMTcsCisgICAgVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMJPSAweDAwMTgsCisgICAgVEFHX3ZhcmlhbnQJCQk9IDB4MDAxOSwKKyAgICBUQUdfY29tbW9uX2Jsb2NrCQk9IDB4MDAxYSwKKyAgICBUQUdfY29tbW9uX2luY2x1c2lvbgk9IDB4MDAxYiwKKyAgICBUQUdfaW5oZXJpdGFuY2UJCT0gMHgwMDFjLAorICAgIFRBR19pbmxpbmVkX3N1YnJvdXRpbmUJPSAweDAwMWQsCisgICAgVEFHX21vZHVsZQkJCT0gMHgwMDFlLAorICAgIFRBR19wdHJfdG9fbWVtYmVyX3R5cGUJPSAweDAwMWYsCisgICAgVEFHX3NldF90eXBlCQk9IDB4MDAyMCwKKyAgICBUQUdfc3VicmFuZ2VfdHlwZQkJPSAweDAwMjEsCisgICAgVEFHX3dpdGhfc3RtdAkJPSAweDAwMjIsCisKKyAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLworCisgICAgVEFHX2Zvcm1hdF9sYWJlbAkJPSAweDgwMDAsICAvKiBmb3IgRk9SVFJBTiA3NyBhbmQgRm9ydHJhbiA5MCAqLworICAgIFRBR19uYW1lbGlzdAkJPSAweDgwMDEsICAvKiBGb3IgRm9ydHJhbiA5MCAqLworICAgIFRBR19mdW5jdGlvbl90ZW1wbGF0ZQk9IDB4ODAwMiwgIC8qIGZvciBDKysgKi8KKyAgICBUQUdfY2xhc3NfdGVtcGxhdGUJCT0gMHg4MDAzICAgLyogZm9yIEMrKyAqLworfTsKKworI2RlZmluZSBUQUdfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KKyNkZWZpbmUgVEFHX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLworI2RlZmluZSBUQUdfc291cmNlX2ZpbGUgVEFHX2NvbXBpbGVfdW5pdCAgLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKworLyogRm9ybSBuYW1lcyBhbmQgY29kZXMuICAqLworCitlbnVtIGR3YXJmX2Zvcm0geworICAgIEZPUk1fQUREUgk9IDB4MSwKKyAgICBGT1JNX1JFRgk9IDB4MiwKKyAgICBGT1JNX0JMT0NLMgk9IDB4MywKKyAgICBGT1JNX0JMT0NLNAk9IDB4NCwKKyAgICBGT1JNX0RBVEEyCT0gMHg1LAorICAgIEZPUk1fREFUQTQJPSAweDYsCisgICAgRk9STV9EQVRBOAk9IDB4NywKKyAgICBGT1JNX1NUUklORwk9IDB4OAorfTsKKworLyogQXR0cmlidXRlIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfYXR0cmlidXRlIHsKKyAgICBBVF9zaWJsaW5nCQkJPSAoMHgwMDEwfEZPUk1fUkVGKSwKKyAgICBBVF9sb2NhdGlvbgkJCT0gKDB4MDAyMHxGT1JNX0JMT0NLMiksCisgICAgQVRfbmFtZQkJCT0gKDB4MDAzMHxGT1JNX1NUUklORyksCisgICAgQVRfZnVuZF90eXBlCQk9ICgweDAwNTB8Rk9STV9EQVRBMiksCisgICAgQVRfbW9kX2Z1bmRfdHlwZQkJPSAoMHgwMDYwfEZPUk1fQkxPQ0syKSwKKyAgICBBVF91c2VyX2RlZl90eXBlCQk9ICgweDAwNzB8Rk9STV9SRUYpLAorICAgIEFUX21vZF91X2RfdHlwZQkJPSAoMHgwMDgwfEZPUk1fQkxPQ0syKSwKKyAgICBBVF9vcmRlcmluZwkJCT0gKDB4MDA5MHxGT1JNX0RBVEEyKSwKKyAgICBBVF9zdWJzY3JfZGF0YQkJPSAoMHgwMGEwfEZPUk1fQkxPQ0syKSwKKyAgICBBVF9ieXRlX3NpemUJCT0gKDB4MDBiMHxGT1JNX0RBVEE0KSwKKyAgICBBVF9iaXRfb2Zmc2V0CQk9ICgweDAwYzB8Rk9STV9EQVRBMiksCisgICAgQVRfYml0X3NpemUJCQk9ICgweDAwZDB8Rk9STV9EQVRBNCksCisJCQkJLyogKDB4MDBlMHxGT1JNX3h4eHgpIC0tIHJlc2VydmVkICovCisgICAgQVRfZWxlbWVudF9saXN0CQk9ICgweDAwZjB8Rk9STV9CTE9DSzQpLAorICAgIEFUX3N0bXRfbGlzdAkJPSAoMHgwMTAwfEZPUk1fREFUQTQpLAorICAgIEFUX2xvd19wYwkJCT0gKDB4MDExMHxGT1JNX0FERFIpLAorICAgIEFUX2hpZ2hfcGMJCQk9ICgweDAxMjB8Rk9STV9BRERSKSwKKyAgICBBVF9sYW5ndWFnZQkJCT0gKDB4MDEzMHxGT1JNX0RBVEE0KSwKKyAgICBBVF9tZW1iZXIJCQk9ICgweDAxNDB8Rk9STV9SRUYpLAorICAgIEFUX2Rpc2NyCQkJPSAoMHgwMTUwfEZPUk1fUkVGKSwKKyAgICBBVF9kaXNjcl92YWx1ZQkJPSAoMHgwMTYwfEZPUk1fQkxPQ0syKSwKKwkJCQkvKiAoMHgwMTcwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KKwkJCQkvKiAoMHgwMTgwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KKyAgICBBVF9zdHJpbmdfbGVuZ3RoCQk9ICgweDAxOTB8Rk9STV9CTE9DSzIpLAorICAgIEFUX2NvbW1vbl9yZWZlcmVuY2UJCT0gKDB4MDFhMHxGT1JNX1JFRiksCisgICAgQVRfY29tcF9kaXIJCQk9ICgweDAxYjB8Rk9STV9TVFJJTkcpLAorICAgICAgICBBVF9jb25zdF92YWx1ZV9zdHJpbmcJPSAoMHgwMWMwfEZPUk1fU1RSSU5HKSwKKyAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTIJPSAoMHgwMWMwfEZPUk1fREFUQTIpLAorICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhNAk9ICgweDAxYzB8Rk9STV9EQVRBNCksCisgICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE4CT0gKDB4MDFjMHxGT1JNX0RBVEE4KSwKKyAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2syCT0gKDB4MDFjMHxGT1JNX0JMT0NLMiksCisgICAgICAgIEFUX2NvbnN0X3ZhbHVlX2Jsb2NrNAk9ICgweDAxYzB8Rk9STV9CTE9DSzQpLAorICAgIEFUX2NvbnRhaW5pbmdfdHlwZQkJPSAoMHgwMWQwfEZPUk1fUkVGKSwKKyAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9hZGRyCT0gKDB4MDFlMHxGT1JNX0FERFIpLAorICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGEyCT0gKDB4MDFlMHxGT1JNX0RBVEEyKSwKKyAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhNAk9ICgweDAxZTB8Rk9STV9EQVRBNCksCisgICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTgJPSAoMHgwMWUwfEZPUk1fREFUQTgpLAorICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX3N0cmluZwk9ICgweDAxZTB8Rk9STV9TVFJJTkcpLAorICAgIEFUX2ZyaWVuZHMJCQk9ICgweDAxZjB8Rk9STV9CTE9DSzIpLAorICAgIEFUX2lubGluZQkJCT0gKDB4MDIwMHxGT1JNX1NUUklORyksCisgICAgQVRfaXNfb3B0aW9uYWwJCT0gKDB4MDIxMHxGT1JNX1NUUklORyksCisgICAgICAgIEFUX2xvd2VyX2JvdW5kX3JlZgk9ICgweDAyMjB8Rk9STV9SRUYpLAorICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhMgk9ICgweDAyMjB8Rk9STV9EQVRBMiksCisgICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGE0CT0gKDB4MDIyMHxGT1JNX0RBVEE0KSwKKyAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTgJPSAoMHgwMjIwfEZPUk1fREFUQTgpLAorICAgIEFUX3ByaXZhdGUJCQk9ICgweDAyNDB8Rk9STV9TVFJJTkcpLAorICAgIEFUX3Byb2R1Y2VyCQkJPSAoMHgwMjUwfEZPUk1fU1RSSU5HKSwKKyAgICBBVF9wcm9ncmFtCQkJPSAoMHgwMjMwfEZPUk1fU1RSSU5HKSwKKyAgICBBVF9wcm90ZWN0ZWQJCT0gKDB4MDI2MHxGT1JNX1NUUklORyksCisgICAgQVRfcHJvdG90eXBlZAkJPSAoMHgwMjcwfEZPUk1fU1RSSU5HKSwKKyAgICBBVF9wdWJsaWMJCQk9ICgweDAyODB8Rk9STV9TVFJJTkcpLAorICAgIEFUX3B1cmVfdmlydHVhbAkJPSAoMHgwMjkwfEZPUk1fU1RSSU5HKSwKKyAgICBBVF9yZXR1cm5fYWRkcgkJPSAoMHgwMmEwfEZPUk1fQkxPQ0syKSwKKyAgICBBVF9hYnN0cmFjdF9vcmlnaW4JCT0gKDB4MDJiMHxGT1JNX1JFRiksCisgICAgQVRfc3RhcnRfc2NvcGUJCT0gKDB4MDJjMHxGT1JNX0RBVEE0KSwKKyAgICBBVF9zdHJpZGVfc2l6ZQkJPSAoMHgwMmUwfEZPUk1fREFUQTQpLAorICAgICAgICBBVF91cHBlcl9ib3VuZF9yZWYJPSAoMHgwMmYwfEZPUk1fUkVGKSwKKyAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTIJPSAoMHgwMmYwfEZPUk1fREFUQTIpLAorICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhNAk9ICgweDAyZjB8Rk9STV9EQVRBNCksCisgICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE4CT0gKDB4MDJmMHxGT1JNX0RBVEE4KSwKKyAgICBBVF92aXJ0dWFsCQkJPSAoMHgwMzAwfEZPUk1fU1RSSU5HKSwKKworICAgIC8qIEdOVSBleHRlbnNpb25zLiAgKi8KKworICAgIEFUX3NmX25hbWVzCQkJPSAoMHg4MDAwfEZPUk1fREFUQTQpLAorICAgIEFUX3NyY19pbmZvCQkJPSAoMHg4MDEwfEZPUk1fREFUQTQpLAorICAgIEFUX21hY19pbmZvCQkJPSAoMHg4MDIwfEZPUk1fREFUQTQpLAorICAgIEFUX3NyY19jb29yZHMJCT0gKDB4ODAzMHxGT1JNX0RBVEE0KSwKKyAgICBBVF9ib2R5X2JlZ2luCQk9ICgweDgwNDB8Rk9STV9BRERSKSwKKyAgICBBVF9ib2R5X2VuZAkJCT0gKDB4ODA1MHxGT1JNX0FERFIpCit9OworCisjZGVmaW5lIEFUX2xvX3VzZXIJMHg4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIEFUX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLworCisvKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfbG9jYXRpb25fYXRvbSB7CisgICAgT1BfUkVHCT0gMHgwMSwKKyAgICBPUF9CQVNFUkVHCT0gMHgwMiwKKyAgICBPUF9BRERSCT0gMHgwMywKKyAgICBPUF9DT05TVAk9IDB4MDQsCisgICAgT1BfREVSRUYyCT0gMHgwNSwKKyAgICBPUF9ERVJFRjQJPSAweDA2LAorICAgIE9QX0FERAk9IDB4MDcKK307CisKKyNkZWZpbmUgT1BfTE9fVVNFUgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIE9QX0hJX1VTRVIJMHhmZiAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KKworLyogRnVuZGFtZW50YWwgdHlwZSBuYW1lcyBhbmQgY29kZXMuICAqLworCitlbnVtIGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgeworICAgIEZUX2NoYXIJCT0gMHgwMDAxLAorICAgIEZUX3NpZ25lZF9jaGFyCT0gMHgwMDAyLAorICAgIEZUX3Vuc2lnbmVkX2NoYXIJPSAweDAwMDMsCisgICAgRlRfc2hvcnQJCT0gMHgwMDA0LAorICAgIEZUX3NpZ25lZF9zaG9ydAk9IDB4MDAwNSwKKyAgICBGVF91bnNpZ25lZF9zaG9ydAk9IDB4MDAwNiwKKyAgICBGVF9pbnRlZ2VyCQk9IDB4MDAwNywKKyAgICBGVF9zaWduZWRfaW50ZWdlcgk9IDB4MDAwOCwKKyAgICBGVF91bnNpZ25lZF9pbnRlZ2VyCT0gMHgwMDA5LAorICAgIEZUX2xvbmcJCT0gMHgwMDBhLAorICAgIEZUX3NpZ25lZF9sb25nCT0gMHgwMDBiLAorICAgIEZUX3Vuc2lnbmVkX2xvbmcJPSAweDAwMGMsCisgICAgRlRfcG9pbnRlcgkJPSAweDAwMGQsICAvKiBhbiBhbGlhcyBmb3IgKHZvaWQgKikgKi8KKyAgICBGVF9mbG9hdAkJPSAweDAwMGUsCisgICAgRlRfZGJsX3ByZWNfZmxvYXQJPSAweDAwMGYsCisgICAgRlRfZXh0X3ByZWNfZmxvYXQJPSAweDAwMTAsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCisgICAgRlRfY29tcGxleAkJPSAweDAwMTEsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCisgICAgRlRfZGJsX3ByZWNfY29tcGxleAk9IDB4MDAxMiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KKwkJCS8qIDB4MDAxMyAtLSByZXNlcnZlZCAqLworICAgIEZUX3ZvaWQJCT0gMHgwMDE0LAorICAgIEZUX2Jvb2xlYW4JCT0gMHgwMDE1LCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLworICAgIEZUX2V4dF9wcmVjX2NvbXBsZXgJPSAweDAwMTYsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCisgICAgRlRfbGFiZWwJCT0gMHgwMDE3LAorICAKKyAgICAvKiBHTlUgZXh0ZW5zaW9ucworICAgICAgIFRoZSBsb3cgb3JkZXIgYnl0ZSBtdXN0IGluZGljYXRlIHRoZSBzaXplIChpbiBieXRlcykgZm9yIHRoZSB0eXBlLgorICAgICAgIEFsbCBvZiB0aGVzZSB0eXBlcyB3aWxsIHByb2JhYmx5IGJyZWFrICJjbGFzc2ljIiBzdnI0IFNEQiAqLworCisgICAgRlRfbG9uZ19sb25nCT0gMHg4MDA4LAorICAgIEZUX3NpZ25lZF9sb25nX2xvbmcJPSAweDgxMDgsCisgICAgRlRfdW5zaWduZWRfbG9uZ19sb25nID0gMHg4MjA4LAorCisgICAgRlRfaW50OAkJPSAweDkwMDEsCisgICAgRlRfc2lnbmVkX2ludDgJPSAweDkxMDEsCisgICAgRlRfdW5zaWduZWRfaW50OAk9IDB4OTIwMSwKKyAgICBGVF9pbnQxNgkJPSAweDkzMDIsCisgICAgRlRfc2lnbmVkX2ludDE2CT0gMHg5NDAyLAorICAgIEZUX3Vuc2lnbmVkX2ludDE2CT0gMHg5NTAyLAorICAgIEZUX2ludDMyCQk9IDB4OTYwNCwKKyAgICBGVF9zaWduZWRfaW50MzIJPSAweDk3MDQsCisgICAgRlRfdW5zaWduZWRfaW50MzIJPSAweDk4MDQsCisgICAgRlRfaW50NjQJCT0gMHg5OTA4LAorICAgIEZUX3NpZ25lZF9pbnQ2NAk9IDB4OWEwOCwKKyAgICBGVF91bnNpZ25lZF9pbnQ2NAk9IDB4OWIwOCwKKworICAgIEZUX3JlYWwzMgkJPSAweGEwMDQsCisgICAgRlRfcmVhbDY0CQk9IDB4YTEwOCwKKyAgICBGVF9yZWFsOTYJCT0gMHhhMjBjLAorICAgIEZUX3JlYWwxMjgJCT0gMHhhMzEwCit9OworCisjZGVmaW5lIEZUX2xvX3VzZXIJMHg4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIEZUX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHJhbmdlIGVuZCAqLworCisvKiBUeXBlIG1vZGlmaWVyIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfdHlwZV9tb2RpZmllciB7CisgICAgTU9EX3BvaW50ZXJfdG8JPSAweDAxLAorICAgIE1PRF9yZWZlcmVuY2VfdG8JPSAweDAyLAorICAgIE1PRF9jb25zdAkJPSAweDAzLAorICAgIE1PRF92b2xhdGlsZQk9IDB4MDQKK307CisKKyNkZWZpbmUgTU9EX2xvX3VzZXIJMHg4MCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLworI2RlZmluZSBNT0RfaGlfdXNlcgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLworCisvKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLworCitlbnVtIGR3YXJmX2FycmF5X2RpbV9vcmRlcmluZyB7CisgICAgT1JEX3Jvd19tYWpvcgk9IDAsCisgICAgT1JEX2NvbF9tYWpvcgk9IDEKK307CisKKy8qIEFycmF5IHN1YnNjcmlwdCBmb3JtYXQgbmFtZXMgYW5kIGNvZGVzLiAgKi8KKworZW51bSBkd2FyZl9zdWJzY3JfZGF0YV9mb3JtYXRzIHsKKyAgICBGTVRfRlRfQ19DCT0gMHgwLAorICAgIEZNVF9GVF9DX1gJPSAweDEsCisgICAgRk1UX0ZUX1hfQwk9IDB4MiwKKyAgICBGTVRfRlRfWF9YCT0gMHgzLAorICAgIEZNVF9VVF9DX0MJPSAweDQsCisgICAgRk1UX1VUX0NfWAk9IDB4NSwKKyAgICBGTVRfVVRfWF9DCT0gMHg2LAorICAgIEZNVF9VVF9YX1gJPSAweDcsCisgICAgRk1UX0VUCT0gMHg4Cit9OworCisvKiBEZXJpdmVkIGZyb20gYWJvdmUgZm9yIGVhc2Ugb2YgdXNlLiAgKi8KKworI2RlZmluZSBGTVRfQ09ERShfRlVOREFNRU5UQUxfVFlQRV9QLCBfVUJfQ09OU1RfUCwgX0xCX0NPTlNUX1ApIFwKKyAoKChfRlVOREFNRU5UQUxfVFlQRV9QKSA/IDAgOiA0KQlcCisgIHwgKChfVUJfQ09OU1RfUCkgPyAwIDogMikJCVwKKyAgfCAoKF9MQl9DT05TVF9QKSA/IDAgOiAxKSkKKworLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlIHsKKyAgICBMQU5HX0M4OQkJPSAweDAwMDAwMDAxLAorICAgIExBTkdfQwkJPSAweDAwMDAwMDAyLAorICAgIExBTkdfQURBODMJCT0gMHgwMDAwMDAwMywKKyAgICBMQU5HX0NfUExVU19QTFVTCT0gMHgwMDAwMDAwNCwKKyAgICBMQU5HX0NPQk9MNzQJPSAweDAwMDAwMDA1LAorICAgIExBTkdfQ09CT0w4NQk9IDB4MDAwMDAwMDYsCisgICAgTEFOR19GT1JUUkFONzcJPSAweDAwMDAwMDA3LAorICAgIExBTkdfRk9SVFJBTjkwCT0gMHgwMDAwMDAwOCwKKyAgICBMQU5HX1BBU0NBTDgzCT0gMHgwMDAwMDAwOSwKKyAgICBMQU5HX01PRFVMQTIJPSAweDAwMDAwMDBhLAorCisgICAgLyogR05VIGV4dGVuc2lvbnMgKi8KKworICAgIExBTkdfQ0hJTEwJCT0gMHgwMDAwOWFmMwkvKiByYW5kb20gdmFsdWUgZm9yIEdOVSBDaGlsbCAqLworfTsKKworI2RlZmluZSBMQU5HX2xvX3VzZXIJMHgwMDAwODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLworI2RlZmluZSBMQU5HX2hpX3VzZXIJMHgwMDAwZmZmZiAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KKworLyogTmFtZXMgYW5kIGNvZGVzIGZvciBHTlUgIm1hY2luZm8iIGV4dGVuc2lvbi4gICovCisKK2VudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZSB7CisgICAgTUFDSU5GT19zdGFydAk9ICdzJywKKyAgICBNQUNJTkZPX3Jlc3VtZQk9ICdyJywKKyAgICBNQUNJTkZPX2RlZmluZQk9ICdkJywKKyAgICBNQUNJTkZPX3VuZGVmCT0gJ3UnCit9OworCisjZW5kaWYgLyogX0VMRl9EV0FSRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZjIuaCBiL2luY2x1ZGUvZWxmL2R3YXJmMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2JiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9kd2FyZjIuaApAQCAtMCwwICsxLDYzNyBAQAorLyogRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBjb2RlcyByZWxhdGluZyB0byB0aGUgRFdBUkYgc3ltYm9saWMKKyAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgR2FyeSBGdW5jayAoZ2FyeUBpbnRyZXBpZC5jb20pIFRoZSBBZGEgSm9pbnQgUHJvZ3JhbQorICAgT2ZmaWNlIChBSlBPKSwgRmxvcmlkYSBTdGF0ZSBVbnZpdmVyc2l0eSBhbmQgU2lsaWNvbiBHcmFwaGljcyBJbmMuCisgICBwcm92aWRlZCBzdXBwb3J0IGZvciB0aGlzIGVmZm9ydCAtLSBKdW5lIDIxLCAxOTk1LgorCisgICBEZXJpdmVkIGZyb20gdGhlIERXQVJGIDEgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBSb24gR3VpbG1ldHRlCisgICAocmZnQG5ldGNvbS5jb20pLCBOb3ZlbWJlciAxOTkwLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCisKK0dOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0dOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCisgICBSZXZpc2lvbiAyLjAuMCAoSnVseSAyNywgMTk5MykgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKKyAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCisgICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQorICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuICAqLworCisjaWZuZGVmIF9FTEZfRFdBUkYyX0gKKyNkZWZpbmUgX0VMRl9EV0FSRjJfSAorCisvKiBTdHJ1Y3R1cmUgZm91bmQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBsaV9sZW5ndGggICAgICAgICAgWzRdOworICB1bnNpZ25lZCBjaGFyIGxpX3ZlcnNpb24gICAgICAgICBbMl07CisgIHVuc2lnbmVkIGNoYXIgbGlfcHJvbG9ndWVfbGVuZ3RoIFs0XTsKKyAgdW5zaWduZWQgY2hhciBsaV9taW5faW5zbl9sZW5ndGggWzFdOworICB1bnNpZ25lZCBjaGFyIGxpX2RlZmF1bHRfaXNfc3RtdCBbMV07CisgIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9iYXNlICAgICAgIFsxXTsKKyAgdW5zaWduZWQgY2hhciBsaV9saW5lX3JhbmdlICAgICAgWzFdOworICB1bnNpZ25lZCBjaGFyIGxpX29wY29kZV9iYXNlICAgICBbMV07Cit9CitEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgIGxpX2xlbmd0aDsKKyAgdW5zaWduZWQgc2hvcnQgbGlfdmVyc2lvbjsKKyAgdW5zaWduZWQgaW50ICAgbGlfcHJvbG9ndWVfbGVuZ3RoOworICB1bnNpZ25lZCBjaGFyICBsaV9taW5faW5zbl9sZW5ndGg7CisgIHVuc2lnbmVkIGNoYXIgIGxpX2RlZmF1bHRfaXNfc3RtdDsKKyAgaW50ICAgICAgICAgICAgbGlfbGluZV9iYXNlOworICB1bnNpZ25lZCBjaGFyICBsaV9saW5lX3JhbmdlOworICB1bnNpZ25lZCBjaGFyICBsaV9vcGNvZGVfYmFzZTsKK30KK0RXQVJGMl9JbnRlcm5hbF9MaW5lSW5mbzsKKworLyogU3RydWN0dXJlIGZvdW5kIGluIC5kZWJ1Z19wdWJuYW1lcyBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgcG5fbGVuZ3RoICBbNF07CisgIHVuc2lnbmVkIGNoYXIgcG5fdmVyc2lvbiBbMl07CisgIHVuc2lnbmVkIGNoYXIgcG5fb2Zmc2V0ICBbNF07CisgIHVuc2lnbmVkIGNoYXIgcG5fc2l6ZSAgICBbNF07Cit9CitEV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgIHBuX2xlbmd0aDsKKyAgdW5zaWduZWQgc2hvcnQgcG5fdmVyc2lvbjsKKyAgdW5zaWduZWQgbG9uZyAgcG5fb2Zmc2V0OworICB1bnNpZ25lZCBsb25nICBwbl9zaXplOworfQorRFdBUkYyX0ludGVybmFsX1B1Yk5hbWVzOworCisvKiBTdHJjdXR1cmUgZm91bmQgaW4gLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBjdV9sZW5ndGggICAgICAgIFs0XTsKKyAgdW5zaWduZWQgY2hhciAgY3VfdmVyc2lvbiAgICAgICBbMl07CisgIHVuc2lnbmVkIGNoYXIgIGN1X2FiYnJldl9vZmZzZXQgWzRdOworICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemUgIFsxXTsKK30KK0RXQVJGMl9FeHRlcm5hbF9Db21wVW5pdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgbG9uZyAgY3VfbGVuZ3RoOworICB1bnNpZ25lZCBzaG9ydCBjdV92ZXJzaW9uOworICB1bnNpZ25lZCBsb25nICBjdV9hYmJyZXZfb2Zmc2V0OworICB1bnNpZ25lZCBjaGFyICBjdV9wb2ludGVyX3NpemU7Cit9CitEV0FSRjJfSW50ZXJuYWxfQ29tcFVuaXQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgIGFyX2xlbmd0aCAgICAgICBbNF07CisgIHVuc2lnbmVkIGNoYXIgIGFyX3ZlcnNpb24gICAgICBbMl07CisgIHVuc2lnbmVkIGNoYXIgIGFyX2luZm9fb2Zmc2V0ICBbNF07CisgIHVuc2lnbmVkIGNoYXIgIGFyX3BvaW50ZXJfc2l6ZSBbMV07CisgIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZSBbMV07Cit9CitEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlOworCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBsb25nICBhcl9sZW5ndGg7CisgIHVuc2lnbmVkIHNob3J0IGFyX3ZlcnNpb247CisgIHVuc2lnbmVkIGxvbmcgIGFyX2luZm9fb2Zmc2V0OworICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgIGFyX3NlZ21lbnRfc2l6ZTsKK30KK0RXQVJGMl9JbnRlcm5hbF9BUmFuZ2U7CisKKworLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfdGFnCisgIHsKKyAgICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCisgICAgRFdfVEFHX2FycmF5X3R5cGUgPSAweDAxLAorICAgIERXX1RBR19jbGFzc190eXBlID0gMHgwMiwKKyAgICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAorICAgIERXX1RBR19lbnVtZXJhdGlvbl90eXBlID0gMHgwNCwKKyAgICBEV19UQUdfZm9ybWFsX3BhcmFtZXRlciA9IDB4MDUsCisgICAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKKyAgICBEV19UQUdfbGFiZWwgPSAweDBhLAorICAgIERXX1RBR19sZXhpY2FsX2Jsb2NrID0gMHgwYiwKKyAgICBEV19UQUdfbWVtYmVyID0gMHgwZCwKKyAgICBEV19UQUdfcG9pbnRlcl90eXBlID0gMHgwZiwKKyAgICBEV19UQUdfcmVmZXJlbmNlX3R5cGUgPSAweDEwLAorICAgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAorICAgIERXX1RBR19zdHJpbmdfdHlwZSA9IDB4MTIsCisgICAgRFdfVEFHX3N0cnVjdHVyZV90eXBlID0gMHgxMywKKyAgICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKKyAgICBEV19UQUdfdHlwZWRlZiA9IDB4MTYsCisgICAgRFdfVEFHX3VuaW9uX3R5cGUgPSAweDE3LAorICAgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKKyAgICBEV19UQUdfdmFyaWFudCA9IDB4MTksCisgICAgRFdfVEFHX2NvbW1vbl9ibG9jayA9IDB4MWEsCisgICAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAorICAgIERXX1RBR19pbmhlcml0YW5jZSA9IDB4MWMsCisgICAgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSA9IDB4MWQsCisgICAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCisgICAgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSA9IDB4MWYsCisgICAgRFdfVEFHX3NldF90eXBlID0gMHgyMCwKKyAgICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCisgICAgRFdfVEFHX3dpdGhfc3RtdCA9IDB4MjIsCisgICAgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbiA9IDB4MjMsCisgICAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCisgICAgRFdfVEFHX2NhdGNoX2Jsb2NrID0gMHgyNSwKKyAgICBEV19UQUdfY29uc3RfdHlwZSA9IDB4MjYsCisgICAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKKyAgICBEV19UQUdfZW51bWVyYXRvciA9IDB4MjgsCisgICAgRFdfVEFHX2ZpbGVfdHlwZSA9IDB4MjksCisgICAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCisgICAgRFdfVEFHX25hbWVsaXN0ID0gMHgyYiwKKyAgICBEV19UQUdfbmFtZWxpc3RfaXRlbSA9IDB4MmMsCisgICAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKKyAgICBEV19UQUdfc3VicHJvZ3JhbSA9IDB4MmUsCisgICAgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0gPSAweDJmLAorICAgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCisgICAgRFdfVEFHX3Rocm93bl90eXBlID0gMHgzMSwKKyAgICBEV19UQUdfdHJ5X2Jsb2NrID0gMHgzMiwKKyAgICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKKyAgICBEV19UQUdfdmFyaWFibGUgPSAweDM0LAorICAgIERXX1RBR192b2xhdGlsZV90eXBlID0gMHgzNSwKKyAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCisgICAgRFdfVEFHX01JUFNfbG9vcCA9IDB4NDA4MSwKKyAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLworICAgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCS8qIGZvciBGT1JUUkFOIDc3IGFuZCBGb3J0cmFuIDkwICovCisgICAgRFdfVEFHX2Z1bmN0aW9uX3RlbXBsYXRlID0gMHg0MTAyLAkvKiBmb3IgQysrICovCisgICAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCS8qIGZvciBDKysgKi8KKyAgfTsKKworI2RlZmluZSBEV19UQUdfbG9fdXNlcgkweDQwODAKKyNkZWZpbmUgRFdfVEFHX2hpX3VzZXIJMHhmZmZmCisKKy8qIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIGVudHJ5IGhhcyBhIGNoaWxkIG9yIG5vdCAqLworI2RlZmluZSBEV19jaGlsZHJlbl9ubyAgIDAKKyNkZWZpbmUJRFdfY2hpbGRyZW5feWVzICAxCisKKy8qIEZvcm0gbmFtZXMgYW5kIGNvZGVzLiAgKi8KK2VudW0gZHdhcmZfZm9ybQorICB7CisgICAgRFdfRk9STV9hZGRyID0gMHgwMSwKKyAgICBEV19GT1JNX2Jsb2NrMiA9IDB4MDMsCisgICAgRFdfRk9STV9ibG9jazQgPSAweDA0LAorICAgIERXX0ZPUk1fZGF0YTIgPSAweDA1LAorICAgIERXX0ZPUk1fZGF0YTQgPSAweDA2LAorICAgIERXX0ZPUk1fZGF0YTggPSAweDA3LAorICAgIERXX0ZPUk1fc3RyaW5nID0gMHgwOCwKKyAgICBEV19GT1JNX2Jsb2NrID0gMHgwOSwKKyAgICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCisgICAgRFdfRk9STV9kYXRhMSA9IDB4MGIsCisgICAgRFdfRk9STV9mbGFnID0gMHgwYywKKyAgICBEV19GT1JNX3NkYXRhID0gMHgwZCwKKyAgICBEV19GT1JNX3N0cnAgPSAweDBlLAorICAgIERXX0ZPUk1fdWRhdGEgPSAweDBmLAorICAgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAorICAgIERXX0ZPUk1fcmVmMSA9IDB4MTEsCisgICAgRFdfRk9STV9yZWYyID0gMHgxMiwKKyAgICBEV19GT1JNX3JlZjQgPSAweDEzLAorICAgIERXX0ZPUk1fcmVmOCA9IDB4MTQsCisgICAgRFdfRk9STV9yZWZfdWRhdGEgPSAweDE1LAorICAgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2CisgIH07CisKKy8qIEF0dHJpYnV0ZSBuYW1lcyBhbmQgY29kZXMuICAqLworCitlbnVtIGR3YXJmX2F0dHJpYnV0ZQorICB7CisgICAgRFdfQVRfc2libGluZyA9IDB4MDEsCisgICAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAorICAgIERXX0FUX25hbWUgPSAweDAzLAorICAgIERXX0FUX29yZGVyaW5nID0gMHgwOSwKKyAgICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCisgICAgRFdfQVRfYnl0ZV9zaXplID0gMHgwYiwKKyAgICBEV19BVF9iaXRfb2Zmc2V0ID0gMHgwYywKKyAgICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCisgICAgRFdfQVRfZWxlbWVudF9saXN0ID0gMHgwZiwKKyAgICBEV19BVF9zdG10X2xpc3QgPSAweDEwLAorICAgIERXX0FUX2xvd19wYyA9IDB4MTEsCisgICAgRFdfQVRfaGlnaF9wYyA9IDB4MTIsCisgICAgRFdfQVRfbGFuZ3VhZ2UgPSAweDEzLAorICAgIERXX0FUX21lbWJlciA9IDB4MTQsCisgICAgRFdfQVRfZGlzY3IgPSAweDE1LAorICAgIERXX0FUX2Rpc2NyX3ZhbHVlID0gMHgxNiwKKyAgICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKKyAgICBEV19BVF9pbXBvcnQgPSAweDE4LAorICAgIERXX0FUX3N0cmluZ19sZW5ndGggPSAweDE5LAorICAgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAorICAgIERXX0FUX2NvbXBfZGlyID0gMHgxYiwKKyAgICBEV19BVF9jb25zdF92YWx1ZSA9IDB4MWMsCisgICAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKKyAgICBEV19BVF9kZWZhdWx0X3ZhbHVlID0gMHgxZSwKKyAgICBEV19BVF9pbmxpbmUgPSAweDIwLAorICAgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKKyAgICBEV19BVF9sb3dlcl9ib3VuZCA9IDB4MjIsCisgICAgRFdfQVRfcHJvZHVjZXIgPSAweDI1LAorICAgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAorICAgIERXX0FUX3JldHVybl9hZGRyID0gMHgyYSwKKyAgICBEV19BVF9zdGFydF9zY29wZSA9IDB4MmMsCisgICAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAorICAgIERXX0FUX3VwcGVyX2JvdW5kID0gMHgyZiwKKyAgICBEV19BVF9hYnN0cmFjdF9vcmlnaW4gPSAweDMxLAorICAgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAorICAgIERXX0FUX2FkZHJlc3NfY2xhc3MgPSAweDMzLAorICAgIERXX0FUX2FydGlmaWNpYWwgPSAweDM0LAorICAgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAorICAgIERXX0FUX2NhbGxpbmdfY29udmVudGlvbiA9IDB4MzYsCisgICAgRFdfQVRfY291bnQgPSAweDM3LAorICAgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKKyAgICBEV19BVF9kZWNsX2NvbHVtbiA9IDB4MzksCisgICAgRFdfQVRfZGVjbF9maWxlID0gMHgzYSwKKyAgICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAorICAgIERXX0FUX2RlY2xhcmF0aW9uID0gMHgzYywKKyAgICBEV19BVF9kaXNjcl9saXN0ID0gMHgzZCwKKyAgICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCisgICAgRFdfQVRfZXh0ZXJuYWwgPSAweDNmLAorICAgIERXX0FUX2ZyYW1lX2Jhc2UgPSAweDQwLAorICAgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCisgICAgRFdfQVRfaWRlbnRpZmllcl9jYXNlID0gMHg0MiwKKyAgICBEV19BVF9tYWNyb19pbmZvID0gMHg0MywKKyAgICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCisgICAgRFdfQVRfcHJpb3JpdHkgPSAweDQ1LAorICAgIERXX0FUX3NlZ21lbnQgPSAweDQ2LAorICAgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAorICAgIERXX0FUX3N0YXRpY19saW5rID0gMHg0OCwKKyAgICBEV19BVF90eXBlID0gMHg0OSwKKyAgICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAorICAgIERXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciA9IDB4NGIsCisgICAgRFdfQVRfdmlydHVhbGl0eSA9IDB4NGMsCisgICAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAorICAgIC8qIFNHSS9NSVBTIEV4dGVuc2lvbnMgKi8KKyAgICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKKyAgICBEV19BVF9NSVBTX2xvb3BfYmVnaW4gPSAweDIwMDIsCisgICAgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW4gPSAweDIwMDMsCisgICAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCisgICAgRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IgPSAweDIwMDUsCisgICAgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCA9IDB4MjAwNiwKKyAgICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKKyAgICBEV19BVF9NSVBTX3N0cmlkZSA9IDB4MjAwOCwKKyAgICBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWUgPSAweDIwMDksCisgICAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCisgICAgRFdfQVRfTUlQU19oYXNfaW5saW5lcyA9IDB4MjAwYiwKKyAgICAvKiBHTlUgZXh0ZW5zaW9ucy4gICovCisgICAgRFdfQVRfc2ZfbmFtZXMgPSAweDIxMDEsCisgICAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCisgICAgRFdfQVRfbWFjX2luZm8gPSAweDIxMDMsCisgICAgRFdfQVRfc3JjX2Nvb3JkcyA9IDB4MjEwNCwKKyAgICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAorICAgIERXX0FUX2JvZHlfZW5kID0gMHgyMTA2CisgIH07CisKKyNkZWZpbmUgRFdfQVRfbG9fdXNlcgkweDIwMDAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLworI2RlZmluZSBEV19BVF9oaV91c2VyCTB4M2ZmMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLworCisvKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfbG9jYXRpb25fYXRvbQorICB7CisgICAgRFdfT1BfYWRkciA9IDB4MDMsCisgICAgRFdfT1BfZGVyZWYgPSAweDA2LAorICAgIERXX09QX2NvbnN0MXUgPSAweDA4LAorICAgIERXX09QX2NvbnN0MXMgPSAweDA5LAorICAgIERXX09QX2NvbnN0MnUgPSAweDBhLAorICAgIERXX09QX2NvbnN0MnMgPSAweDBiLAorICAgIERXX09QX2NvbnN0NHUgPSAweDBjLAorICAgIERXX09QX2NvbnN0NHMgPSAweDBkLAorICAgIERXX09QX2NvbnN0OHUgPSAweDBlLAorICAgIERXX09QX2NvbnN0OHMgPSAweDBmLAorICAgIERXX09QX2NvbnN0dSA9IDB4MTAsCisgICAgRFdfT1BfY29uc3RzID0gMHgxMSwKKyAgICBEV19PUF9kdXAgPSAweDEyLAorICAgIERXX09QX2Ryb3AgPSAweDEzLAorICAgIERXX09QX292ZXIgPSAweDE0LAorICAgIERXX09QX3BpY2sgPSAweDE1LAorICAgIERXX09QX3N3YXAgPSAweDE2LAorICAgIERXX09QX3JvdCA9IDB4MTcsCisgICAgRFdfT1BfeGRlcmVmID0gMHgxOCwKKyAgICBEV19PUF9hYnMgPSAweDE5LAorICAgIERXX09QX2FuZCA9IDB4MWEsCisgICAgRFdfT1BfZGl2ID0gMHgxYiwKKyAgICBEV19PUF9taW51cyA9IDB4MWMsCisgICAgRFdfT1BfbW9kID0gMHgxZCwKKyAgICBEV19PUF9tdWwgPSAweDFlLAorICAgIERXX09QX25lZyA9IDB4MWYsCisgICAgRFdfT1Bfbm90ID0gMHgyMCwKKyAgICBEV19PUF9vciA9IDB4MjEsCisgICAgRFdfT1BfcGx1cyA9IDB4MjIsCisgICAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAorICAgIERXX09QX3NobCA9IDB4MjQsCisgICAgRFdfT1Bfc2hyID0gMHgyNSwKKyAgICBEV19PUF9zaHJhID0gMHgyNiwKKyAgICBEV19PUF94b3IgPSAweDI3LAorICAgIERXX09QX2JyYSA9IDB4MjgsCisgICAgRFdfT1BfZXEgPSAweDI5LAorICAgIERXX09QX2dlID0gMHgyYSwKKyAgICBEV19PUF9ndCA9IDB4MmIsCisgICAgRFdfT1BfbGUgPSAweDJjLAorICAgIERXX09QX2x0ID0gMHgyZCwKKyAgICBEV19PUF9uZSA9IDB4MmUsCisgICAgRFdfT1Bfc2tpcCA9IDB4MmYsCisgICAgRFdfT1BfbGl0MCA9IDB4MzAsCisgICAgRFdfT1BfbGl0MSA9IDB4MzEsCisgICAgRFdfT1BfbGl0MiA9IDB4MzIsCisgICAgRFdfT1BfbGl0MyA9IDB4MzMsCisgICAgRFdfT1BfbGl0NCA9IDB4MzQsCisgICAgRFdfT1BfbGl0NSA9IDB4MzUsCisgICAgRFdfT1BfbGl0NiA9IDB4MzYsCisgICAgRFdfT1BfbGl0NyA9IDB4MzcsCisgICAgRFdfT1BfbGl0OCA9IDB4MzgsCisgICAgRFdfT1BfbGl0OSA9IDB4MzksCisgICAgRFdfT1BfbGl0MTAgPSAweDNhLAorICAgIERXX09QX2xpdDExID0gMHgzYiwKKyAgICBEV19PUF9saXQxMiA9IDB4M2MsCisgICAgRFdfT1BfbGl0MTMgPSAweDNkLAorICAgIERXX09QX2xpdDE0ID0gMHgzZSwKKyAgICBEV19PUF9saXQxNSA9IDB4M2YsCisgICAgRFdfT1BfbGl0MTYgPSAweDQwLAorICAgIERXX09QX2xpdDE3ID0gMHg0MSwKKyAgICBEV19PUF9saXQxOCA9IDB4NDIsCisgICAgRFdfT1BfbGl0MTkgPSAweDQzLAorICAgIERXX09QX2xpdDIwID0gMHg0NCwKKyAgICBEV19PUF9saXQyMSA9IDB4NDUsCisgICAgRFdfT1BfbGl0MjIgPSAweDQ2LAorICAgIERXX09QX2xpdDIzID0gMHg0NywKKyAgICBEV19PUF9saXQyNCA9IDB4NDgsCisgICAgRFdfT1BfbGl0MjUgPSAweDQ5LAorICAgIERXX09QX2xpdDI2ID0gMHg0YSwKKyAgICBEV19PUF9saXQyNyA9IDB4NGIsCisgICAgRFdfT1BfbGl0MjggPSAweDRjLAorICAgIERXX09QX2xpdDI5ID0gMHg0ZCwKKyAgICBEV19PUF9saXQzMCA9IDB4NGUsCisgICAgRFdfT1BfbGl0MzEgPSAweDRmLAorICAgIERXX09QX3JlZzAgPSAweDUwLAorICAgIERXX09QX3JlZzEgPSAweDUxLAorICAgIERXX09QX3JlZzIgPSAweDUyLAorICAgIERXX09QX3JlZzMgPSAweDUzLAorICAgIERXX09QX3JlZzQgPSAweDU0LAorICAgIERXX09QX3JlZzUgPSAweDU1LAorICAgIERXX09QX3JlZzYgPSAweDU2LAorICAgIERXX09QX3JlZzcgPSAweDU3LAorICAgIERXX09QX3JlZzggPSAweDU4LAorICAgIERXX09QX3JlZzkgPSAweDU5LAorICAgIERXX09QX3JlZzEwID0gMHg1YSwKKyAgICBEV19PUF9yZWcxMSA9IDB4NWIsCisgICAgRFdfT1BfcmVnMTIgPSAweDVjLAorICAgIERXX09QX3JlZzEzID0gMHg1ZCwKKyAgICBEV19PUF9yZWcxNCA9IDB4NWUsCisgICAgRFdfT1BfcmVnMTUgPSAweDVmLAorICAgIERXX09QX3JlZzE2ID0gMHg2MCwKKyAgICBEV19PUF9yZWcxNyA9IDB4NjEsCisgICAgRFdfT1BfcmVnMTggPSAweDYyLAorICAgIERXX09QX3JlZzE5ID0gMHg2MywKKyAgICBEV19PUF9yZWcyMCA9IDB4NjQsCisgICAgRFdfT1BfcmVnMjEgPSAweDY1LAorICAgIERXX09QX3JlZzIyID0gMHg2NiwKKyAgICBEV19PUF9yZWcyMyA9IDB4NjcsCisgICAgRFdfT1BfcmVnMjQgPSAweDY4LAorICAgIERXX09QX3JlZzI1ID0gMHg2OSwKKyAgICBEV19PUF9yZWcyNiA9IDB4NmEsCisgICAgRFdfT1BfcmVnMjcgPSAweDZiLAorICAgIERXX09QX3JlZzI4ID0gMHg2YywKKyAgICBEV19PUF9yZWcyOSA9IDB4NmQsCisgICAgRFdfT1BfcmVnMzAgPSAweDZlLAorICAgIERXX09QX3JlZzMxID0gMHg2ZiwKKyAgICBEV19PUF9icmVnMCA9IDB4NzAsCisgICAgRFdfT1BfYnJlZzEgPSAweDcxLAorICAgIERXX09QX2JyZWcyID0gMHg3MiwKKyAgICBEV19PUF9icmVnMyA9IDB4NzMsCisgICAgRFdfT1BfYnJlZzQgPSAweDc0LAorICAgIERXX09QX2JyZWc1ID0gMHg3NSwKKyAgICBEV19PUF9icmVnNiA9IDB4NzYsCisgICAgRFdfT1BfYnJlZzcgPSAweDc3LAorICAgIERXX09QX2JyZWc4ID0gMHg3OCwKKyAgICBEV19PUF9icmVnOSA9IDB4NzksCisgICAgRFdfT1BfYnJlZzEwID0gMHg3YSwKKyAgICBEV19PUF9icmVnMTEgPSAweDdiLAorICAgIERXX09QX2JyZWcxMiA9IDB4N2MsCisgICAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKKyAgICBEV19PUF9icmVnMTQgPSAweDdlLAorICAgIERXX09QX2JyZWcxNSA9IDB4N2YsCisgICAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKKyAgICBEV19PUF9icmVnMTcgPSAweDgxLAorICAgIERXX09QX2JyZWcxOCA9IDB4ODIsCisgICAgRFdfT1BfYnJlZzE5ID0gMHg4MywKKyAgICBEV19PUF9icmVnMjAgPSAweDg0LAorICAgIERXX09QX2JyZWcyMSA9IDB4ODUsCisgICAgRFdfT1BfYnJlZzIyID0gMHg4NiwKKyAgICBEV19PUF9icmVnMjMgPSAweDg3LAorICAgIERXX09QX2JyZWcyNCA9IDB4ODgsCisgICAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKKyAgICBEV19PUF9icmVnMjYgPSAweDhhLAorICAgIERXX09QX2JyZWcyNyA9IDB4OGIsCisgICAgRFdfT1BfYnJlZzI4ID0gMHg4YywKKyAgICBEV19PUF9icmVnMjkgPSAweDhkLAorICAgIERXX09QX2JyZWczMCA9IDB4OGUsCisgICAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKKyAgICBEV19PUF9yZWd4ID0gMHg5MCwKKyAgICBEV19PUF9mYnJlZyA9IDB4OTEsCisgICAgRFdfT1BfYnJlZ3ggPSAweDkyLAorICAgIERXX09QX3BpZWNlID0gMHg5MywKKyAgICBEV19PUF9kZXJlZl9zaXplID0gMHg5NCwKKyAgICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCisgICAgRFdfT1Bfbm9wID0gMHg5NgorICB9OworCisjZGVmaW5lIERXX09QX2xvX3VzZXIJMHg4MAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIERXX09QX2hpX3VzZXIJMHhmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLworCisvKiBUeXBlIGVuY29kaW5ncy4gICovCisKK2VudW0gZHdhcmZfdHlwZQorICB7CisgICAgRFdfQVRFX3ZvaWQgPSAweDAsCisgICAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCisgICAgRFdfQVRFX2Jvb2xlYW4gPSAweDIsCisgICAgRFdfQVRFX2NvbXBsZXhfZmxvYXQgPSAweDMsCisgICAgRFdfQVRFX2Zsb2F0ID0gMHg0LAorICAgIERXX0FURV9zaWduZWQgPSAweDUsCisgICAgRFdfQVRFX3NpZ25lZF9jaGFyID0gMHg2LAorICAgIERXX0FURV91bnNpZ25lZCA9IDB4NywKKyAgICBEV19BVEVfdW5zaWduZWRfY2hhciA9IDB4OAorICB9OworCisjZGVmaW5lCURXX0FURV9sb191c2VyIDB4ODAKKyNkZWZpbmUJRFdfQVRFX2hpX3VzZXIgMHhmZgorCisvKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLworZW51bSBkd2FyZl9hcnJheV9kaW1fb3JkZXJpbmcKKyAgeworICAgIERXX09SRF9yb3dfbWFqb3IgPSAwLAorICAgIERXX09SRF9jb2xfbWFqb3IgPSAxCisgIH07CisKKy8qIGFjY2VzcyBhdHRyaWJ1dGUgKi8KK2VudW0gZHdhcmZfYWNjZXNzX2F0dHJpYnV0ZQorICB7CisgICAgRFdfQUNDRVNTX3B1YmxpYyA9IDEsCisgICAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDIsCisgICAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCisgIH07CisKKy8qIHZpc2liaWxpdHkgKi8KK2VudW0gZHdhcmZfdmlzaWJpbGl0eV9hdHRyaWJ1dGUKKyAgeworICAgIERXX1ZJU19sb2NhbCA9IDEsCisgICAgRFdfVklTX2V4cG9ydGVkID0gMiwKKyAgICBEV19WSVNfcXVhbGlmaWVkID0gMworICB9OworCisvKiB2aXJ0dWFsaXR5ICovCitlbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCisgIHsKKyAgICBEV19WSVJUVUFMSVRZX25vbmUgPSAwLAorICAgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCisgICAgRFdfVklSVFVBTElUWV9wdXJlX3ZpcnR1YWwgPSAyCisgIH07CisKKy8qIGNhc2Ugc2Vuc2l0aXZpdHkgKi8KK2VudW0gZHdhcmZfaWRfY2FzZQorICB7CisgICAgRFdfSURfY2FzZV9zZW5zaXRpdmUgPSAwLAorICAgIERXX0lEX3VwX2Nhc2UgPSAxLAorICAgIERXX0lEX2Rvd25fY2FzZSA9IDIsCisgICAgRFdfSURfY2FzZV9pbnNlbnNpdGl2ZSA9IDMKKyAgfTsKKworLyogY2FsbGluZyBjb252ZW50aW9uICovCitlbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgorICB7CisgICAgRFdfQ0Nfbm9ybWFsID0gMHgxLAorICAgIERXX0NDX3Byb2dyYW0gPSAweDIsCisgICAgRFdfQ0Nfbm9jYWxsID0gMHgzCisgIH07CisKKyNkZWZpbmUgRFdfQ0NfbG9fdXNlciAweDQwCisjZGVmaW5lIERXX0NDX2hpX3VzZXIgMHhmZgorCisvKiBpbmxpbmUgYXR0cmlidXRlICovCitlbnVtIGR3YXJmX2lubGluZV9hdHRyaWJ1dGUKKyAgeworICAgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCisgICAgRFdfSU5MX2lubGluZWQgPSAxLAorICAgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDIsCisgICAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCisgIH07CisKKy8qIGRlc2NyaW1pbmFudCBsaXN0cyAqLworZW51bSBkd2FyZl9kZXNjcmltX2xpc3QKKyAgeworICAgIERXX0RTQ19sYWJlbCA9IDAsCisgICAgRFdfRFNDX3JhbmdlID0gMQorICB9OworCisvKiBsaW5lIG51bWJlciBvcGNvZGVzICovCitlbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcworICB7CisgICAgRFdfTE5TX2V4dGVuZGVkX29wID0gMCwKKyAgICBEV19MTlNfY29weSA9IDEsCisgICAgRFdfTE5TX2FkdmFuY2VfcGMgPSAyLAorICAgIERXX0xOU19hZHZhbmNlX2xpbmUgPSAzLAorICAgIERXX0xOU19zZXRfZmlsZSA9IDQsCisgICAgRFdfTE5TX3NldF9jb2x1bW4gPSA1LAorICAgIERXX0xOU19uZWdhdGVfc3RtdCA9IDYsCisgICAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCisgICAgRFdfTE5TX2NvbnN0X2FkZF9wYyA9IDgsCisgICAgRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgPSA5CisgIH07CisKKy8qIGxpbmUgbnVtYmVyIGV4dGVuZGVkIG9wY29kZXMgKi8KK2VudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKKyAgeworICAgIERXX0xORV9lbmRfc2VxdWVuY2UgPSAxLAorICAgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCisgICAgRFdfTE5FX2RlZmluZV9maWxlID0gMworICB9OworCisvKiBjYWxsIGZyYW1lIGluZm9ybWF0aW9uICovCitlbnVtIGR3YXJmX2NhbGxfZnJhbWVfaW5mbworICB7CisgICAgRFdfQ0ZBX2FkdmFuY2VfbG9jID0gMHg0MCwKKyAgICBEV19DRkFfb2Zmc2V0ID0gMHg4MCwKKyAgICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCisgICAgRFdfQ0ZBX25vcCA9IDB4MDAsCisgICAgRFdfQ0ZBX3NldF9sb2MgPSAweDAxLAorICAgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAorICAgIERXX0NGQV9hZHZhbmNlX2xvYzIgPSAweDAzLAorICAgIERXX0NGQV9hZHZhbmNlX2xvYzQgPSAweDA0LAorICAgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAorICAgIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkID0gMHgwNiwKKyAgICBEV19DRkFfdW5kZWZpbmVkID0gMHgwNywKKyAgICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCisgICAgRFdfQ0ZBX3JlZ2lzdGVyID0gMHgwOSwKKyAgICBEV19DRkFfcmVtZW1iZXJfc3RhdGUgPSAweDBhLAorICAgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKKyAgICBEV19DRkFfZGVmX2NmYSA9IDB4MGMsCisgICAgRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgPSAweDBkLAorICAgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCisgICAgLyogU0dJL01JUFMgc3BlY2lmaWMgKi8KKyAgICBEV19DRkFfTUlQU19hZHZhbmNlX2xvYzggPSAweDFkCisgIH07CisKKyNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgorI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKKworI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCisjZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKKyNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgorCisjZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKKyNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKKworI2RlZmluZSBEV19BRERSX25vbmUJCTAKKworLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCisKK2VudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlCisgIHsKKyAgICBEV19MQU5HX0M4OSA9IDB4MDAwMSwKKyAgICBEV19MQU5HX0MgPSAweDAwMDIsCisgICAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKKyAgICBEV19MQU5HX0NfcGx1c19wbHVzID0gMHgwMDA0LAorICAgIERXX0xBTkdfQ29ib2w3NCA9IDB4MDAwNSwKKyAgICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCisgICAgRFdfTEFOR19Gb3J0cmFuNzcgPSAweDAwMDcsCisgICAgRFdfTEFOR19Gb3J0cmFuOTAgPSAweDAwMDgsCisgICAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKKyAgICBEV19MQU5HX01vZHVsYTIgPSAweDAwMGEsCisgICAgRFdfTEFOR19NaXBzX0Fzc2VtYmxlciA9IDB4ODAwMQorICB9OworCisKKyNkZWZpbmUgRFdfTEFOR19sb191c2VyIDB4ODAwMAkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIERXX0xBTkdfaGlfdXNlciAweGZmZmYJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLworCisvKiBOYW1lcyBhbmQgY29kZXMgZm9yIG1hY3JvIGluZm9ybWF0aW9uLiAgKi8KKworZW51bSBkd2FyZl9tYWNpbmZvX3JlY29yZF90eXBlCisgIHsKKyAgICBEV19NQUNJTkZPX2RlZmluZSA9IDEsCisgICAgRFdfTUFDSU5GT191bmRlZiA9IDIsCisgICAgRFdfTUFDSU5GT19zdGFydF9maWxlID0gMywKKyAgICBEV19NQUNJTkZPX2VuZF9maWxlID0gNCwKKyAgICBEV19NQUNJTkZPX3ZlbmRvcl9leHQgPSAyNTUKKyAgfTsKKworI2VuZGlmIC8qIF9FTEZfRFdBUkYyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2V4dGVybmFsLmggYi9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYWI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9leHRlcm5hbC5oCkBAIC0wLDAgKzEsMjU2IEBACisvKiBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCisgICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCisgICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKKyAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBleHRlcm5hbGx5IGJ5IHRoZSBCRkQgbGlicmFyeS4KKyAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1maWxlIHJlcHJlc2VudGF0aW9uIG9mIEVMRi4gIEl0IHJlcXVpcmVzCisgICB0aGUgZWxmLWNvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bworICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KKworLyogVGhlIDY0LWJpdCBzdHVmZiBpcyBraW5kIG9mIHJhbmRvbS4gIFBlcmhhcHMgc29tZW9uZSB3aWxsIHB1Ymxpc2ggYQorICAgc3BlYyBzb21lZGF5LiAgKi8KKworI2lmbmRlZiBfRUxGX0VYVEVSTkFMX0gKKyNkZWZpbmUgX0VMRl9FWFRFUk5BTF9ICisKKy8qIEVMRiBIZWFkZXIgKDMyLWJpdCBpbXBsZW1lbnRhdGlvbnMpICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLworICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLworICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KKyAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KKyAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzRdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJZV9waG9mZls0XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls0XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLworICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLworfSBFbGYzMl9FeHRlcm5hbF9FaGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIJZV9pZGVudFsxNl07CQkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KKyAgdW5zaWduZWQgY2hhcgllX3R5cGVbMl07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KKyAgdW5zaWduZWQgY2hhcgllX21hY2hpbmVbMl07CQkvKiBTcGVjaWZpZXMgcmVxdWlyZWQgYXJjaGl0ZWN0dXJlICovCisgIHVuc2lnbmVkIGNoYXIJZV92ZXJzaW9uWzRdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB2ZXJzaW9uICovCisgIHVuc2lnbmVkIGNoYXIJZV9lbnRyeVs4XTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLworICB1bnNpZ25lZCBjaGFyCWVfcGhvZmZbOF07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICB1bnNpZ25lZCBjaGFyCWVfc2hvZmZbOF07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICB1bnNpZ25lZCBjaGFyCWVfZmxhZ3NbNF07CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KKyAgdW5zaWduZWQgY2hhcgllX2Voc2l6ZVsyXTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyCWVfcGhlbnRzaXplWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCWVfcGhudW1bMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICB1bnNpZ25lZCBjaGFyCWVfc2hlbnRzaXplWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCWVfc2hudW1bMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICB1bnNpZ25lZCBjaGFyCWVfc2hzdHJuZHhbMl07CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KK30gRWxmNjRfRXh0ZXJuYWxfRWhkcjsKKworLyogUHJvZ3JhbSBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCXBfdHlwZVs0XTsJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KKyAgdW5zaWduZWQgY2hhcglwX29mZnNldFs0XTsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgdW5zaWduZWQgY2hhcglwX3ZhZGRyWzRdOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwX3BhZGRyWzRdOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcF9maWxlc3pbNF07CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICB1bnNpZ25lZCBjaGFyCXBfbWVtc3pbNF07CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCisgIHVuc2lnbmVkIGNoYXIJcF9mbGFnc1s0XTsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgdW5zaWduZWQgY2hhcglwX2FsaWduWzRdOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KK30gRWxmMzJfRXh0ZXJuYWxfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCXBfdHlwZVs0XTsJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KKyAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLworICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzhdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLworICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbOF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLworICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbOF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels4XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIJcF9tZW1zels4XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KKyAgdW5zaWduZWQgY2hhcglwX2FsaWduWzhdOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KK30gRWxmNjRfRXh0ZXJuYWxfUGhkcjsKKworLyogU2VjdGlvbiBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCXNoX25hbWVbNF07CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgdW5zaWduZWQgY2hhcglzaF90eXBlWzRdOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJc2hfZmxhZ3NbNF07CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLworICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJbNF07CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KKyAgdW5zaWduZWQgY2hhcglzaF9vZmZzZXRbNF07CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJc2hfc2l6ZVs0XTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyCXNoX2xpbmtbNF07CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglzaF9pbmZvWzRdOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJc2hfYWRkcmFsaWduWzRdOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICB1bnNpZ25lZCBjaGFyCXNoX2VudHNpemVbNF07CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30gRWxmMzJfRXh0ZXJuYWxfU2hkcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCXNoX25hbWVbNF07CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgdW5zaWduZWQgY2hhcglzaF90eXBlWzRdOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJc2hfZmxhZ3NbOF07CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLworICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJbOF07CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KKyAgdW5zaWduZWQgY2hhcglzaF9vZmZzZXRbOF07CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJc2hfc2l6ZVs4XTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyCXNoX2xpbmtbNF07CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgY2hhcglzaF9pbmZvWzRdOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJc2hfYWRkcmFsaWduWzhdOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICB1bnNpZ25lZCBjaGFyCXNoX2VudHNpemVbOF07CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30gRWxmNjRfRXh0ZXJuYWxfU2hkcjsKKworLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcglzdF9uYW1lWzRdOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs0XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9zaXplWzRdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLworICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCit9IEVsZjMyX0V4dGVybmFsX1N5bTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLworICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCisgIHVuc2lnbmVkIGNoYXIJc3RfdmFsdWVbOF07CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCisgIHVuc2lnbmVkIGNoYXIJc3Rfc2l6ZVs4XTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KK30gRWxmNjRfRXh0ZXJuYWxfU3ltOworCisvKiBOb3RlIHNlZ21lbnRzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcgluYW1lc3pbNF07CQkvKiBTaXplIG9mIGVudHJ5J3Mgb3duZXIgc3RyaW5nICovCisgIHVuc2lnbmVkIGNoYXIJZGVzY3N6WzRdOwkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCisgIHVuc2lnbmVkIGNoYXIJdHlwZVs0XTsJCS8qIEludGVycHJldGF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yICovCisgIGNoYXIJCW5hbWVbMV07CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KK30gRWxmX0V4dGVybmFsX05vdGU7CisKKy8qIFJlbG9jYXRpb24gRW50cmllcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzRdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzRdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCit9IEVsZjMyX0V4dGVybmFsX1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzRdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzRdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJcl9hZGRlbmRbNF07CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KK30gRWxmMzJfRXh0ZXJuYWxfUmVsYTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzhdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCit9IEVsZjY0X0V4dGVybmFsX1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzhdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJcl9hZGRlbmRbOF07CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KK30gRWxmNjRfRXh0ZXJuYWxfUmVsYTsKKworLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIJZF90YWdbNF07CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KKyAgdW5pb24geworICAgIHVuc2lnbmVkIGNoYXIJZF92YWxbNF07CisgICAgdW5zaWduZWQgY2hhcglkX3B0cls0XTsKKyAgfSBkX3VuOworfSBFbGYzMl9FeHRlcm5hbF9EeW47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcglkX3RhZ1s4XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLworICB1bmlvbiB7CisgICAgdW5zaWduZWQgY2hhcglkX3ZhbFs4XTsKKyAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzhdOworICB9IGRfdW47Cit9IEVsZjY0X0V4dGVybmFsX0R5bjsKKworLyogVGhlIHZlcnNpb24gc3RydWN0dXJlcyBhcmUgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBUaGV5IGFyZQorICAgbmFtZWQgd2l0aG91dCBhIDMyIG9yIDY0LiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoZXNlIHN0cnVjdHVyZXMKKyAgIHdpbGwgbmVlZCB0byBiZSByZW5hbWVkLiAgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIJCXZkX3ZlcnNpb25bMl07CisgIHVuc2lnbmVkIGNoYXIJCXZkX2ZsYWdzWzJdOworICB1bnNpZ25lZCBjaGFyCQl2ZF9uZHhbMl07CisgIHVuc2lnbmVkIGNoYXIJCXZkX2NudFsyXTsKKyAgdW5zaWduZWQgY2hhcgkJdmRfaGFzaFs0XTsKKyAgdW5zaWduZWQgY2hhcgkJdmRfYXV4WzRdOworICB1bnNpZ25lZCBjaGFyCQl2ZF9uZXh0WzRdOworfSBFbGZfRXh0ZXJuYWxfVmVyZGVmOworCisvKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcgkJdmRhX25hbWVbNF07CisgIHVuc2lnbmVkIGNoYXIJCXZkYV9uZXh0WzRdOworfSBFbGZfRXh0ZXJuYWxfVmVyZGF1eDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCQl2bl92ZXJzaW9uWzJdOworICB1bnNpZ25lZCBjaGFyCQl2bl9jbnRbMl07CisgIHVuc2lnbmVkIGNoYXIJCXZuX2ZpbGVbNF07CisgIHVuc2lnbmVkIGNoYXIJCXZuX2F1eFs0XTsKKyAgdW5zaWduZWQgY2hhcgkJdm5fbmV4dFs0XTsKK30gRWxmX0V4dGVybmFsX1Zlcm5lZWQ7CisKKy8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcgkJdm5hX2hhc2hbNF07CisgIHVuc2lnbmVkIGNoYXIJCXZuYV9mbGFnc1syXTsKKyAgdW5zaWduZWQgY2hhcgkJdm5hX290aGVyWzJdOworICB1bnNpZ25lZCBjaGFyCQl2bmFfbmFtZVs0XTsKKyAgdW5zaWduZWQgY2hhcgkJdm5hX25leHRbNF07Cit9IEVsZl9FeHRlcm5hbF9WZXJuYXV4OworCisvKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJzeW0gc2VjdGlvbi4gIFRoaXMgaXMgbm90IGEKKyAgIHN0YW5kYXJkIEVMRiBzdHJ1Y3R1cmU7IEVMRiBqdXN0IHVzZXMgRWxmMzJfSGFsZi4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhcgkJdnNfdmVyc1syXTsKK30KKyNpZmRlZiBfX0dOVUNfXworICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNlbmRpZgorICBFbGZfRXh0ZXJuYWxfVmVyc3ltOworCisvKiBTdHJ1Y3R1cmUgZm9yIHN5bWluZm8gc2VjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyCQlzaV9ib3VuZHRvWzJdOworICB1bnNpZ25lZCBjaGFyCQlzaV9mbGFnc1syXTsKK30gRWxmX0V4dGVybmFsX1N5bWluZm87CisKKyNlbmRpZiAvKiBfRUxGX0VYVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2ZyMzAuaCBiL2luY2x1ZGUvZWxmL2ZyMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjNiMDUyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvZnIzMC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEZSMzAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FTEZfRlIzMF9ICisjZGVmaW5lIF9FTEZfRlIzMF9ICisKKyNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCisKKy8qIFJlbG9jYXRpb25zLiAgKi8KK1NUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9mcjMwX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwX05PTkUsIDApCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwXzgsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwXzIwLCAyKQorICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8zMiwgMykKKyAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfNDgsIDQpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwXzZfSU5fNCwgNSkKKyAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOF9JTl84LCA2KQorICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X0lOXzgsIDcpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEwX0lOXzgsIDgpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwXzlfUENSRUwsIDkpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwXzEyX1BDUkVMLCAxMCkKKyAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfR05VX1ZUSU5IRVJJVCwgMTEpCisgIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVEVOVFJZLCAxMikKKyAgRU1QVFlfUkVMT0MgIChSX0ZSMzBfbWF4KQorRU5EX1JFTE9DX05VTUJFUlMKKworI2VuZGlmIC8qIF9FTEZfRlIzMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9ocHBhLmggYi9pbmNsdWRlL2VsZi9ocHBhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1MmUyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL2hwcGEuaApAQCAtMCwwICsxLDE4NyBAQAorLyogSFBQQSBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgSFBQQSBFTEYgQUJJLiAgTm90ZQorICAgdGhhdCBtb3N0IG9mIHRoaXMgaXMgbm90IGFjdHVhbGx5IGltcGxlbWVudGVkIGJ5IEJGRC4gICovCisKKyNpZm5kZWYgX0VMRl9IUFBBX0gKKyNkZWZpbmUgX0VMRl9IUFBBX0gKKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKworLyogVGFyZ2V0IHByb2Nlc3NvciBJRHMgdG8gYmUgcGxhY2VkIGluIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgZmxhZ3MKKyAgIGZpZWxkLiAgTm90ZSB0aGVzZSBuYW1lcyBhcmUgc2hhcmVkIHdpdGggU09NLCBhbmQgdGhlcmVmb3JlIGRvIG5vdAorICAgZm9sbG93IEVMRiBuYW1pbmcgY29udmVudGlvbnMuICAqLworCisvKiBQQSAxLjAgYmlnIGVuZGlhbi4gICovCisjaWZuZGVmIENQVV9QQV9SSVNDMV8wCisjZGVmaW5lIENQVV9QQV9SSVNDMV8wCQkweDAwMDAwMjBiCisjZW5kaWYKKworLyogUEEgMS4xIGJpZyBlbmRpYW4uICAqLworI2lmbmRlZiBDUFVfUEFfUklTQzFfMQorI2RlZmluZSBDUFVfUEFfUklTQzFfMQkJMHgwMDAwMDIxMAorI2VuZGlmCisKKy8qIFBBIDEuMCBsaXR0bGUgZW5kaWFuICh1bnN1cHBvcnRlZCkgaXMgMHgwMDAwMDI4Yi4gICovCisvKiBQQSAxLjEgbGl0dGxlIGVuZGlhbiAodW5zdXBwb3J0ZWQpIGlzIDB4MDAwMDAyOTAuICAqLworCisvKiBUcmFwIG51bGwgYWRkcmVzcyBkZXJlZmVyZW5jZXMuICAqLworI2RlZmluZSBFTEZfUEFSSVNDX1RSQVBOSUwJMHgwMDAxMDAwMAorCisvKiAuUEFSSVNDLmFyY2hleHQgc2VjdGlvbiBpcyBwcmVzZW50LiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0VYVAkJMHgwMDAyMDAwMAorCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCisKKy8qIEhvbGRzIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBhIHRhYmxlIG9mIHBvaW50ZXJzIHRvIGV4dGVybmFsCisgICBkYXRhLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19HT1QJCVNIVF9MT1BST0MrMAorCisvKiBOb25sb2FkYWJsZSBzZWN0aW9uIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gaW4gYXJjaGl0ZWN0dXJlCisgICBleHRlbnNpb25zIHVzZWQgYnkgdGhlIGNvZGUuICAqLworI2RlZmluZSBTSFRfUEFSSVNDX0FSQ0gJCVNIVF9MT1BST0MrMQorCisvKiBTZWN0aW9uIGluIHdoaWNoICRnbG9iYWwkIGlzIGRlZmluZWQuICAqLworI2RlZmluZSBTSFRfUEFSSVNDX0dMT0JBTAlTSFRfTE9QUk9DKzIKKworLyogU2VjdGlvbiBob2xkaW5nIG1pbGxpY29kZSByb3V0aW5lcyAobXVsLCBkaXYsIHJlbSwgZHluY2FsbCwgZXRjLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19NSUxMSQlTSFRfTE9QUk9DKzMKKworLyogU2VjdGlvbiBob2xkaW5nIHVud2luZCBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IGRlYnVnZ2Vycy4gICovCisjZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECVNIVF9MT1BST0MrNAorCisvKiBTZWN0aW9uIGhvbGRpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19QTFQJCVNIVF9MT1BST0MrNQorCisvKiBTaG9ydCBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19TREFUQQlTSFRfTE9QUk9DKzYKKyNkZWZpbmUgU0hUX1BBUklTQ19TQlNTCQlTSFRfTE9QUk9DKzcKKworLyogT3B0aW9uYWwgc2VjdGlvbiBob2xkaW5nIGFyZ3VtZW50IGxvY2F0aW9uL3JlbG9jYXRpb24gaW5mby4gICovCisjZGVmaW5lIFNIVF9QQVJJU0NfU1lNRVhUTglTSFRfTE9QUk9DKzgKKworLyogT3B0aW9uIHNlY3Rpb24gZm9yIGxpbmtlciBzdHVicy4gICovCisjZGVmaW5lIFNIVF9QQVJJU0NfU1RVQlMJU0hUX0xPUFJPQys5CisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KKworLyogVGhpcyBzZWN0aW9uIGlzIG5lYXIgdGhlIGdsb2JhbCBkYXRhIHBvaW50ZXIgYW5kIHRodXMgYWxsb3dzIHNob3J0CisgICBhZGRyZXNzaW5nIG1vZGVzIHRvIGJlIHVzZWQuICAqLworI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUICAgICAgICAweDIwMDAwMDAwCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBzeW1ib2wgdHlwZXMuICAqLworCisvKiBNaWxsaWNvZGUgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLworI2RlZmluZSBTVFRfUEFSSVNDX01JTExJQ09ERQlTVFRfTE9QUk9DKzAKKworCisvKiBFTEYvSFBQQSByZWxvY2F0aW9uIHR5cGVzICovCisKKyNpbmNsdWRlICJyZWxvYy1tYWNyb3MuaCIKKworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmMzJfaHBwYV9yZWxvY190eXBlKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KKyAgICAgCisgICAgIC8qIFRoZXNlIHJlbG9jYXRpb24gdHlwZXMgZG8gc2ltcGxlIGJhc2UgKyBvZmZzZXQgcmVsb2NhdGlvbnMuICAqLworCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMzIsICAweDAxKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjIxTCwgMHgwMikKKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN1IsIDB4MDMpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTdGLCAweDA0KQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0UiwgMHgwNikKKworICAgIC8qIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24gdHlwZXMKKyAgICAgICBUeXBpY2FsbHkgdXNlZCBmb3IgY2FsbHMuCisgICAgICAgTm90ZSBQQ1JFTDE3QyBhbmQgUENSRUwxN0YgZGlmZmVyIG9ubHkgaW4gb3ZlcmZsb3cgaGFuZGxpbmcuCisgICAgICAgUENSRUwxN0MgbmV2ZXIgcmVwb3J0cyBhIHJlbG9jYXRpb24gZXJyb3IuCisKKyAgICAgICBXaGVuIHN1cHBvcnRpbmcgYXJndW1lbnQgcmVsb2NhdGlvbnMsIGZ1bmN0aW9uIGNhbGxzIG11c3QgYmUKKyAgICAgICBhY2NvbXBhbmllZCBieSBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgCisgICAgICAgY2FycmllZCBpbiB0aGUgdGVuIGhpZ2gtb3JkZXIgYml0cyBvZiB0aGUgYWRkZW5kIGZpZWxkLiAgVGhlIHJlbWFpbmluZworICAgICAgIDIyIGJpdHMgb2Ygb2YgdGhlIGFkZGVuZCBmaWVsZCBhcmUgc2lnbi1leHRlbmRlZCB0byBmb3JtIHRoZSBBZGRlbmQuCisKKyAgICAgICBOb3RlIHRoZSBjb2RlIHRvIGJ1aWxkIGFyZ3VtZW50IHJlbG9jYXRpb25zIGRlcGVuZHMgb24gdGhlIAorICAgICAgIGFkZGVuZCBiZWluZyB6ZXJvLiAgQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGxpbWl0YXRpb24gaXMgR0FTCisgICAgICAgY2FuIG5vdCBwZXJmb3JtIHJlbG9jYXRpb24gcmVkdWN0aW9ucyBmb3IgZnVuY3Rpb24gc3ltYm9scy4gICovCisgICAgIAorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMjFMLCAweDBhKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdSLCAweDBiKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdGLCAweDBjKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTdDLCAweDBkKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRSLCAweDBlKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTRGLCAweDBmKQorCisgICAgLyogRFAtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gICovCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwyMUwsIDB4MTIpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNFIsIDB4MTYpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNEYsIDB4MTcpCisKKyAgICAvKiBEYXRhIGxpbmthZ2UgdGFibGUgKERMVCkgcmVsb2NhdGlvbiB0eXBlcworCisgICAgICAgU09NIERMVF9SRUwgZml4dXAgcmVxdWVzdHMgYXJlIHVzZWQgdG8gZm9yIHN0YXRpYyBkYXRhIHJlZmVyZW5jZXMKKyAgICAgICBmcm9tIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUgd2l0aGluIHNoYXJlZCBsaWJyYXJpZXMuICBUaGV5IGFyZQorICAgICAgIHNpbWlsYXIgdG8gdGhlIEdPVCByZWxvY2F0aW9uIHR5cGVzIGluIHNvbWUgU1ZSNCBpbXBsZW1lbnRhdGlvbnMuICAqLworCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMjFMLCAweDFhKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0UiwgMHgxZSkKKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNEYsIDB4MWYpCisKKyAgICAvKiBETFQgaW5kaXJlY3QgcmVsb2NhdGlvbiB0eXBlcyAgKi8KKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQyMUwsIDB4MjIpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMTRSLCAweDI2KQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RiwgMHgyNykKKworICAgIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gIFVnaC4gIFRoZXNlIGltcGx5IGxvdHMgb2Ygc3RhdGUgKi8KKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRVRCQVNFLCAgICAweDI4KQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwzMiwgIDB4MjkpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDIxTCwgMHgyYSkKKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTdSLCAweDJiKQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxN0YsIDB4MmMpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0UiwgMHgyZSkKKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRGLCAweDJmKQorCisgICAgLyogU2VnbWVudCByZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19URVhUUkVMMzIsIDB4MzEpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfREFUQVJFTDMyLCAweDM5KQorCisgICAgLyogUGxhYmVsIHJlbG9jYXRpb24gdHlwZXMuICAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDMyLCAgMHg0MSkKKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTEFCRUwyMUwsIDB4NDIpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExBQkVMMTRSLCAweDQ2KQorCisgICAgLyogUExUIHJlbG9jYXRpb25zLiAgKi8KKyAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRJTkQyMUwsIDB4ODIpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUSU5EMTRSLCAweDg2KQorICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVElORDE0RiwgMHg4NykKKworICAgIC8qIE1pc2MgcmVsb2NhdGlvbiB0eXBlcy4gICovCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQ09QWSwgICAgIDB4ODgpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR0xPQl9EQVQsIDB4ODkpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfSk1QX1NMT1QsIDB4OGEpCisgICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUkVMQVRJVkUsIDB4OGIpCisgICAgIAorICAgICBFTVBUWV9SRUxPQyAoUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKK0VORF9SRUxPQ19OVU1CRVJTCisKKyNpZm5kZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCit0eXBlZGVmIGVudW0gZWxmMzJfaHBwYV9yZWxvY190eXBlIGVsZjMyX2hwcGFfcmVsb2NfdHlwZTsKKyNlbmRpZgorCisjZW5kaWYgLyogX0VMRl9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2kzODYuaCBiL2luY2x1ZGUvZWxmL2kzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTlmMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvaTM4Ni5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGl4ODYgRUxGIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FTEZfSTM4Nl9ICisjZGVmaW5lIF9FTEZfSTM4Nl9ICisKKyNpbmNsdWRlICJyZWxvYy1tYWNyb3MuaCIKKworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2kzODZfcmVsb2NfdHlwZSkKKyAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9OT05FLCAgICAgIDApCS8qIE5vIHJlbG9jICovCisgICAgIFJFTE9DX05VTUJFUiAoUl8zODZfMzIsICAgICAgICAxKQkvKiBEaXJlY3QgMzIgYml0ICAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDMzIsICAgICAgMikJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisgICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UMzIsICAgICAzKQkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisgICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUExUMzIsCSAgICA0KQkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9DT1BZLAkgICAgNSkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dMT0JfREFULCAgNikJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0pVTVBfU0xPVCwgNykJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1JFTEFUSVZFLCAgOCkJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVE9GRiwgICAgOSkJLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KKyAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1RQQywgICAgMTApCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCisgICAgIEZBS0VfUkVMT0MgICAoRklSU1RfSU5WQUxJRF9SRUxPQywgMTEpCisgICAgIEZBS0VfUkVMT0MgICAoTEFTVF9JTlZBTElEX1JFTE9DLCAgMTkpCisgICAgIFJFTE9DX05VTUJFUiAoUl8zODZfMTYsICAgICAgIDIwKQorICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDMTYsICAgICAyMSkKKyAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl84LAkgICAyMikKKyAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QQzgsICAgICAgMjMpCisgICAgIFJFTE9DX05VTUJFUiAoUl8zODZfbWF4LAkgICAyNCkKKyAgICAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCisgICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZUSU5IRVJJVCwgMjUwKQorICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dOVV9WVEVOVFJZLCAyNTEpCitFTkRfUkVMT0NfTlVNQkVSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2ludGVybmFsLmggYi9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjgxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzEyIEBACisvKiBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCisgICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCisgICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKKyAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KKyAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKKyAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCisgICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLworCisKKy8qIE5PVEUgdGhhdCB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBub3Qga2VwdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhcgorICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gc29tZSBjYXNlcyB0aGV5J3ZlIGJlZW4gcmVvcmRlcmVkIGZvciBtb3JlIG9wdGltYWwKKyAgIHBhY2tpbmcgdW5kZXIgdmFyaW91cyBjaXJjdW1zdGFuY2VzLiAgKi8KKworI2lmbmRlZiBfRUxGX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0VMRl9JTlRFUk5BTF9ICisKKy8qIEVMRiBIZWFkZXIgKi8KKworI2RlZmluZSBFSV9OSURFTlQJMTYJCS8qIFNpemUgb2YgZV9pZGVudFtdICovCisKK3R5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9laGRyIHsKKyAgdW5zaWduZWQgY2hhcgkJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KKyAgYmZkX3ZtYQkJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBiZmRfc2l6ZV90eXBlCQllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgYmZkX3NpemVfdHlwZQkJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIHVuc2lnbmVkIGxvbmcJCWVfdmVyc2lvbjsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLworICB1bnNpZ25lZCBsb25nCQllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCisgIHVuc2lnbmVkIHNob3J0CWVfdHlwZTsJCQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KKyAgdW5zaWduZWQgc2hvcnQJZV9tYWNoaW5lOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLworICB1bnNpZ25lZCBzaG9ydAllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLworICB1bnNpZ25lZCBzaG9ydAllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KKyAgdW5zaWduZWQgc2hvcnQJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIHVuc2lnbmVkIHNob3J0CWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICB1bnNpZ25lZCBzaG9ydAllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KKyAgdW5zaWduZWQgc2hvcnQJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLworfSBFbGZfSW50ZXJuYWxfRWhkcjsKKworI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCisjZGVmaW5lIEVsZjMyX0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZWhkciBlbGZfaW50ZXJuYWxfZWhkcgorI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9FaGRyIEVsZl9JbnRlcm5hbF9FaGRyCisKKy8qIFByb2dyYW0gaGVhZGVyICovCisKK3N0cnVjdCBlbGZfaW50ZXJuYWxfcGhkciB7CisgIHVuc2lnbmVkIGxvbmcJcF90eXBlOwkJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KKyAgdW5zaWduZWQgbG9uZwlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLworICBiZmRfdm1hCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLworICBiZmRfdm1hCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBiZmRfdm1hCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgYmZkX3ZtYQlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCisgIGJmZF92bWEJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KKyAgYmZkX3ZtYQlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIEVsZl9JbnRlcm5hbF9QaGRyOworI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCisjZGVmaW5lIEVsZjMyX0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcGhkciBlbGZfaW50ZXJuYWxfcGhkcgorI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9QaGRyIEVsZl9JbnRlcm5hbF9QaGRyCisKKy8qIFNlY3Rpb24gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyIHsKKyAgdW5zaWduZWQgaW50CXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgdW5zaWduZWQgaW50CXNoX3R5cGU7CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KKyAgYmZkX3ZtYQlzaF9mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCisgIGJmZF92bWEJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLworICBiZmRfc2l6ZV90eXBlCXNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KKyAgYmZkX3NpemVfdHlwZQlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCisgIHVuc2lnbmVkIGxvbmcJc2hfbGluazsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLworICB1bnNpZ25lZCBsb25nCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgZmlsZV9wdHIJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLworICB1bnNpZ25lZCBpbnQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KKworICAvKiBUaGUgaW50ZXJuYWwgcmVwIGFsc28gaGFzIHNvbWUgY2FjaGVkIGluZm8gYXNzb2NpYXRlZCB3aXRoIGl0LiAqLworICBhc2VjdGlvbiAqCWJmZF9zZWN0aW9uOwkJLyogQXNzb2NpYXRlZCBCRkQgc2VjdGlvbi4gICovCisgIFBUUgkJY29udGVudHM7CQkvKiBTZWN0aW9uIGNvbnRlbnRzLiAgKi8KK30gRWxmX0ludGVybmFsX1NoZHI7CisKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgorI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCisjZGVmaW5lIGVsZjY0X2ludGVybmFsX3NoZHIgZWxmX2ludGVybmFsX3NoZHIKKyNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU2hkciBFbGZfSW50ZXJuYWxfU2hkcgorCisvKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KKworc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0geworICBiZmRfdm1hCXN0X3ZhbHVlOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLworICBiZmRfdm1hCXN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCisgIHVuc2lnbmVkIGxvbmcJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCisgIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCisgIHVuc2lnbmVkIHNob3J0IHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfc3ltIEVsZl9JbnRlcm5hbF9TeW07CisKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KKyNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KKyNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KKworLyogTm90ZSBzZWdtZW50cyAqLworCit0eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfbm90ZSB7CisgIHVuc2lnbmVkIGxvbmcJbmFtZXN6OwkJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KKyAgdW5zaWduZWQgbG9uZwlkZXNjc3o7CQkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCisgIHVuc2lnbmVkIGxvbmcJdHlwZTsJCQkvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLworICBjaGFyICoJbmFtZWRhdGE7CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KKyAgY2hhciAqCWRlc2NkYXRhOwkJLyogU3RhcnQgb2YgdGhlIGRlc2MgZGF0YSAqLworICBiZmRfdm1hCWRlc2Nwb3M7CQkvKiBGaWxlIG9mZnNldCBvZiB0aGUgZGVzY2RhdGEgKi8KK30gRWxmX0ludGVybmFsX05vdGU7CisjZGVmaW5lIEVsZjMyX0ludGVybmFsX05vdGUJRWxmX0ludGVybmFsX05vdGUKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfbm90ZQllbGZfaW50ZXJuYWxfbm90ZQorCisvKiBSZWxvY2F0aW9uIEVudHJpZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3JlbCB7CisgIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KKyAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLworICBiZmRfdm1hCXJfaW5mbzsJCS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KK30gRWxmX0ludGVybmFsX1JlbDsKKworI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAorI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAorI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAorI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAorCit0eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsYSB7CisgIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KKyAgYmZkX3ZtYQlyX2luZm87CQkvKiBJbmRleCBhbmQgVHlwZSBvZiByZWxvY2F0aW9uICovCisgIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCit9IEVsZl9JbnRlcm5hbF9SZWxhOworCisjZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbGEgZWxmX2ludGVybmFsX3JlbGEKKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQorI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWxhIEVsZl9JbnRlcm5hbF9SZWxhCisjZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKKworLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfZHluIHsKKyAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLworICBiZmRfdm1hIGRfdGFnOwkJLyogZW50cnkgdGFnIHZhbHVlICovCisgIHVuaW9uIHsKKyAgICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCisgICAgYmZkX3ZtYQlkX3ZhbDsKKyAgICBiZmRfdm1hCWRfcHRyOworICB9IGRfdW47Cit9IEVsZl9JbnRlcm5hbF9EeW47CisKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KKyNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KKyNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KKworLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLworCit0eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGVmIHsKKyAgdW5zaWduZWQgc2hvcnQgdmRfdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdmRfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdmRfbmR4OwkvKiBWZXJzaW9uIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdmRfY250OwkvKiBOdW1iZXIgb2YgdmVyZGF1eCBlbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgbG9uZwkgdmRfaGFzaDsJLyogSGFzaCBvZiBuYW1lLiAgKi8KKyAgdW5zaWduZWQgbG9uZwkgdmRfYXV4OwkvKiBPZmZzZXQgdG8gdmVyZGF1eCBlbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgbG9uZwkgdmRfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVyZGVmLiAgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6CisgICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KKyAgYmZkCQkJICAgICAgKnZkX2JmZDsJCS8qIEJGRC4gICovCisgIGNvbnN0IGNoYXIJCSAgICAgICp2ZF9ub2RlbmFtZTsJLyogVmVyc2lvbiBuYW1lLiAgKi8KKyAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgICp2ZF9uZXh0ZGVmOwkvKiB2ZF9uZXh0IGFzIHBvaW50ZXIuICAqLworICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkX2F1eHB0cjsJLyogdmRfYXV4IGFzIHBvaW50ZXIuICAqLworICB1bnNpZ25lZCBpbnQJCSAgICAgICB2ZF9leHBfcmVmbm87CS8qIFVzZWQgYnkgdGhlIGxpbmtlci4gICovCit9IEVsZl9JbnRlcm5hbF9WZXJkZWY7CisKKy8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggeworICB1bnNpZ25lZCBsb25nIHZkYV9uYW1lOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIG5hbWUuICAqLworICB1bnNpZ25lZCBsb25nIHZkYV9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkYXV4LiAgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6CisgICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KKyAgY29uc3QgY2hhciAqdmRhX25vZGVuYW1lOwkJCS8qIHZkYV9uYW1lIGFzIHBvaW50ZXIuICAqLworICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkYV9uZXh0cHRyOwkvKiB2ZGFfbmV4dCBhcyBwb2ludGVyLiAgKi8KK30gRWxmX0ludGVybmFsX1ZlcmRhdXg7CisKKy8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkIHsKKyAgdW5zaWduZWQgc2hvcnQgdm5fdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdm5fY250OwkvKiBOdW1iZXIgb2YgdmVybmF1eCBlbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgbG9uZwkgdm5fZmlsZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBsaWJyYXJ5IG5hbWUuICAqLworICB1bnNpZ25lZCBsb25nCSB2bl9hdXg7CS8qIE9mZnNldCB0byB2ZXJuYXV4IGVudHJpZXMuICAqLworICB1bnNpZ25lZCBsb25nCSB2bl9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJuZWVkLiAgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6CisgICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KKyAgYmZkCQkJICAgICAgKnZuX2JmZDsJCS8qIEJGRC4gICovCisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5fZmlsZW5hbWU7CS8qIHZuX2ZpbGUgYXMgcG9pbnRlci4gICovCisgIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5fYXV4cHRyOwkvKiB2bl9hdXggYXMgcG9pbnRlci4gICovCisgIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmVlZCAqdm5fbmV4dHJlZjsJLyogdm5fbmV4dHJlZiBhcyBwb2ludGVyLiAgKi8KK30gRWxmX0ludGVybmFsX1Zlcm5lZWQ7CisKKy8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4IHsKKyAgdW5zaWduZWQgbG9uZwkgdm5hX2hhc2g7CS8qIEhhc2ggb2YgZGVwZW5kZW5jeSBuYW1lLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdm5hX2ZsYWdzOwkvKiBGbGFncyAoVkVSX0ZMR18qKS4gICovCisgIHVuc2lnbmVkIHNob3J0IHZuYV9vdGhlcjsJLyogVW51c2VkLiAgKi8KKyAgdW5zaWduZWQgbG9uZwkgdm5hX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgdG8gdmVyc2lvbiBuYW1lLiAgKi8KKyAgdW5zaWduZWQgbG9uZwkgdm5hX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5hdXguICAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKKyAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLworICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnZuYV9ub2RlbmFtZTsJLyogdm5hX25hbWUgYXMgcG9pbnRlci4gICovCisgIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5hX25leHRwdHI7CS8qIHZuYV9uZXh0IGFzIHBvaW50ZXIuICAqLworfSBFbGZfSW50ZXJuYWxfVmVybmF1eDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBhCisgICBzdGFuZGFyZCBFTEYgc3RydWN0dXJlOyBFTEYganVzdCB1c2VzIEVsZjMyX0hhbGYuICAqLworCit0eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyc3ltIHsKKyAgdW5zaWduZWQgc2hvcnQgdnNfdmVyczsKK30gRWxmX0ludGVybmFsX1ZlcnN5bTsKKworLyogU3RydWN0dXJlIGZvciBzeW1pbmZvIHNlY3Rpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW50IAlzaV9ib3VuZHRvOworICB1bnNpZ25lZCBzaG9ydCBpbnQJc2lfZmxhZ3M7Cit9IEVsZl9JbnRlcm5hbF9TeW1pbmZvOworCisKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGF1eCBlbGZfaW50ZXJuYWxfdmVyZGF1eAorI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4CisjZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5lZWQgZWxmX2ludGVybmFsX3Zlcm5lZWQKKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAorI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJuYXV4IGVsZl9pbnRlcm5hbF92ZXJuYXV4CisjZGVmaW5lIGVsZjY0X2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKKyNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KKyNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KKworI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgorI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgorI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkYXV4IEVsZl9JbnRlcm5hbF9WZXJkYXV4CisjZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKKyNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmVlZCBFbGZfSW50ZXJuYWxfVmVybmVlZAorI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCisjZGVmaW5lIEVsZjMyX0ludGVybmFsX1Zlcm5hdXggRWxmX0ludGVybmFsX1Zlcm5hdXgKKyNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAorI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQorI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQorI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvIEVsZl9JbnRlcm5hbF9TeW1pbmZvCisjZGVmaW5lIEVsZjY0X0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBob3cgc2VjdGlvbnMgc2hvdWxkIGJlIGFzc2lnbmVkCisgICB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KKworc3RydWN0IGVsZl9zZWdtZW50X21hcAoreworICAvKiBOZXh0IHByb2dyYW0gc2VnbWVudC4gICovCisgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm5leHQ7CisgIC8qIFByb2dyYW0gc2VnbWVudCB0eXBlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBwX3R5cGU7CisgIC8qIFByb2dyYW0gc2VnbWVudCBmbGFncy4gICovCisgIHVuc2lnbmVkIGxvbmcgcF9mbGFnczsKKyAgLyogUHJvZ3JhbSBzZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MuICAqLworICBiZmRfdm1hIHBfcGFkZHI7CisgIC8qIFdoZXRoZXIgdGhlIHBfZmxhZ3MgZmllbGQgaXMgdmFsaWQ7IGlmIG5vdCwgdGhlIGZsYWdzIGFyZSBiYXNlZAorICAgICBvbiB0aGUgc2VjdGlvbiBmbGFncy4gICovCisgIHVuc2lnbmVkIGludCBwX2ZsYWdzX3ZhbGlkIDogMTsKKyAgLyogV2hldGhlciB0aGUgcF9wYWRkciBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgcGh5c2ljYWwgYWRkcmVzcworICAgICBpcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBsbWEgdmFsdWVzLiAgKi8KKyAgdW5zaWduZWQgaW50IHBfcGFkZHJfdmFsaWQgOiAxOworICAvKiBXaGV0aGVyIHRoaXMgc2VnbWVudCBpbmNsdWRlcyB0aGUgZmlsZSBoZWFkZXIuICAqLworICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfZmlsZWhkciA6IDE7CisgIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLworICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfcGhkcnMgOiAxOworICAvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgKG1heSBiZSAwKS4gICovCisgIHVuc2lnbmVkIGludCBjb3VudDsKKyAgLyogU2VjdGlvbnMuICBBY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGluIGNvdW50IGZpZWxkLiAgKi8KKyAgYXNlY3Rpb24gKnNlY3Rpb25zWzFdOworfTsKKworI2VuZGlmIC8qIF9FTEZfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTMyci5oIGIvaW5jbHVkZS9lbGYvbTMyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzdkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9tMzJyLmgKQEAgLTAsMCArMSw2NiBAQAorLyogTTMyUiBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0VMRl9NMzJSX0gKKyNkZWZpbmUgX0VMRl9NMzJSX0gKKworI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKKworLyogUmVsb2NhdGlvbnMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX20zMnJfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSX00zMlJfTk9ORSwgMCkKKyAgUkVMT0NfTlVNQkVSIChSX00zMlJfMTYsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9NMzJSXzMyLCAyKQorICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8yNCwgMykKKyAgUkVMT0NfTlVNQkVSIChSX00zMlJfMTBfUENSRUwsIDQpCisgIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE4X1BDUkVMLCA1KQorICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8yNl9QQ1JFTCwgNikKKyAgUkVMT0NfTlVNQkVSIChSX00zMlJfSEkxNl9VTE8sIDcpCisgIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfU0xPLCA4KQorICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9MTzE2LCA5KQorICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9TREExNiwgMTApCisgIFJFTE9DX05VTUJFUiAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIDExKQorICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRFTlRSWSwgMTIpCisgIEVNUFRZX1JFTE9DICAoUl9NMzJSX21heCkKK0VORF9SRUxPQ19OVU1CRVJTCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGluZGljZXMuICBUaGVzZSBzZWN0aW9ucyBkbyBub3QgYWN0dWFsbHkKKyAgIGV4aXN0LiAgU3ltYm9scyB3aXRoIGEgc3Rfc2huZHggZmllbGQgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlc2UKKyAgIHZhbHVlcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nLiAgKi8KKworLyogU21hbGwgY29tbW9uIHN5bWJvbC4gICovCisjZGVmaW5lIFNITl9NMzJSX1NDT01NT04JMHhmZjAwCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLiAgKi8KKworLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHN1ZmZpY2llbnQgcmVsb2NzIHRvIGJlIHJlbGF4ZWQuCisgICBXaGVuIHJlbGF4aW5nLCBldmVuIHJlbG9jcyBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRoZSBhc3NlbWJsZXIgY291bGQKKyAgIGNvbXBsZXRlIG11c3QgYmUgcHJlc2VudCBiZWNhdXNlIHJlbGF4aW5nIG1heSBjYXVzZSB0aGUgYnJhbmNoIHRhcmdldCB0bworICAgbW92ZS4gICovCisjZGVmaW5lIFNIRl9NMzJSX0NBTl9SRUxBWAkweDEwMDAwMDAwCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCisKKy8qIFR3byBiaXQgbTMyciBhcmNoaXRlY3R1cmUgZmllbGQuICAqLworI2RlZmluZSBFRl9NMzJSX0FSQ0gJCTB4MzAwMDAwMDAKKworLyogbTMyciBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NMzJSX0FSQ0gJCTB4MDAwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tNjhrLmggYi9pbmNsdWRlL2VsZi9tNjhrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzMWNkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9tNjhrLmgKQEAgLTAsMCArMSw1NiBAQAorLyogTUM2OGsgRUxGIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FTEZfTTY4S19ICisjZGVmaW5lIF9FTEZfTTY4S19ICisKKyNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCisKKy8qIFJlbG9jYXRpb24gdHlwZXMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX202OGtfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSXzY4S19OT05FLCAwKQkJLyogTm8gcmVsb2MgKi8KKyAgUkVMT0NfTlVNQkVSIChSXzY4S18zMiwgMSkJCS8qIERpcmVjdCAzMiBiaXQgICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfMTYsIDIpCQkvKiBEaXJlY3QgMTYgYml0ICAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLXzgsIDMpCQkvKiBEaXJlY3QgOCBiaXQgICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfUEMzMiwgNCkJCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMTYsIDUpCQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzgsIDYpCQkvKiBQQyByZWxhdGl2ZSA4IGJpdCAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDMyLCA3KQkJLyogMzIgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDE2LCA4KQkJLyogMTYgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDgsIDkpCQkvKiA4IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KKyAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMk8sIDEwKQkvKiAzMiBiaXQgR09UIG9mZnNldCAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDE2TywgMTEpCS8qIDE2IGJpdCBHT1Qgb2Zmc2V0ICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfR09UOE8sIDEyKQkvKiA4IGJpdCBHT1Qgb2Zmc2V0ICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzIsIDEzKQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNiwgMTQpCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcyAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDgsIDE1KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQzMk8sIDE2KQkvKiAzMiBiaXQgUExUIG9mZnNldCAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDE2TywgMTcpCS8qIDE2IGJpdCBQTFQgb2Zmc2V0ICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfUExUOE8sIDE4KQkvKiA4IGJpdCBQTFQgb2Zmc2V0ICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfQ09QWSwgMTkpCQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfR0xPQl9EQVQsIDIwKQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfSk1QX1NMT1QsIDIxKQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisgIFJFTE9DX05VTUJFUiAoUl82OEtfUkVMQVRJVkUsIDIyKQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisgIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLworICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dOVV9WVElOSEVSSVQsIDIzKQorICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dOVV9WVEVOVFJZLCAyNCkKKyAgRU1QVFlfUkVMT0MgIChSXzY4S19tYXgpICAgCitFTkRfUkVMT0NfTlVNQkVSUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21jb3JlLmggYi9pbmNsdWRlL2VsZi9tY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzRkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9tY29yZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIE1vdG9yb2xsYSBNQ29yZSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNQ29yZSBFTEYgQUJJLiAqLworI2lmbmRlZiBfRUxGX01PUkVfSAorI2RlZmluZSBfRUxGX01PUkVfSAorCisjaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgorCisvKiBSZWxvY2F0aW9ucy4gICovCitTVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbWNvcmVfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSX01DT1JFX05PTkUsIDApCisgIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9BRERSMzIsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTThCWTQsIDIpCisgIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTTExQlkyLCAzKQorICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU00QlkyLCA0KQorICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUwzMiwgNSkKKyAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyLCA2KQorICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR05VX1ZUSU5IRVJJVCwgNykKKyAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dOVV9WVEVOVFJZLCA4KQorICBFTVBUWV9SRUxPQyAgKFJfTUNPUkVfbWF4KQorRU5EX1JFTE9DX05VTUJFUlMKKworLyogU2VjdGlvbiBBdHRyaWJ1dGVzLiAgKi8KKyNkZWZpbmUgU0hGX01DT1JFX05PUkVBRAkweDgwMDAwMDAwCisKKyNlbmRpZiAvKiBfRUxGX01DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21pcHMuaCBiL2luY2x1ZGUvZWxmL21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY3MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvbWlwcy5oCkBAIC0wLDAgKzEsODYwIEBACisvKiBNSVBTIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+LCBmcm9tCisgICBpbmZvcm1hdGlvbiBpbiB0aGUgU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgTUlQUworICAgUHJvY2Vzc29yIFN1cHBsZW1lbnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNSVBTIEVMRiBBQkkuICBOb3RlCisgICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KKworI2lmbmRlZiBfRUxGX01JUFNfSAorI2RlZmluZSBfRUxGX01JUFNfSAorCisjaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgorCisvKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KK1NUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9taXBzX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX05PTkUsIDApCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTXzE2LCAxKQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU18zMiwgMikKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMMzIsIDMpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTXzI2LCA0KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISTE2LCA1KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19MTzE2LCA2KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HUFJFTDE2LCA3KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19MSVRFUkFMLCA4KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1QxNiwgOSkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEMxNiwgMTApCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTEwxNiwgMTEpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dQUkVMMzIsIDEyKQorICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4LCBhbHRob3VnaCB0aGV5IGFyZSBub3QKKyAgICAgaW4gdGhlIE1JUFMgRUxGIEFCSS4gICovCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDEsIDEzKQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQyLCAxNCkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMywgMTUpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NISUZUNSwgMTYpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NISUZUNiwgMTcpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTXzY0LCAxOCkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0RJU1AsIDE5KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfUEFHRSwgMjApCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9PRlNULCAyMSkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0hJMTYsIDIyKQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfTE8xNiwgMjMpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NVQiwgMjQpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0lOU0VSVF9BLCAyNSkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfSU5TRVJUX0IsIDI2KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ERUxFVEUsIDI3KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISUdIRVIsIDI4KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISUdIRVNULCAyOSkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTF9ISTE2LCAzMCkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTF9MTzE2LCAzMSkKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0NOX0RJU1AsIDMyKQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUwxNiwgMzMpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0FERF9JTU1FRElBVEUsIDM0KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19QSlVNUCwgMzUpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTEdPVCwgMzYpCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0pBTFIsIDM3KQorICBSRUxPQ19OVU1CRVIgKFJfTUlQU19tYXgsIDM4KQorICAvKiBUaGVzZSByZWxvY3MgYXJlIHVzZWQgZm9yIHRoZSBtaXBzMTYuICAqLworICBSRUxPQ19OVU1CRVIgKFJfTUlQUzE2XzI2LCAxMDApCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTMTZfR1BSRUwsIDEwMSkKKyAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCisgIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9WVElOSEVSSVQsIDI1MykKKyAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1ZURU5UUlksIDI1NCkKK0VORF9SRUxPQ19OVU1CRVJTCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCisKKy8qIEF0IGxlYXN0IG9uZSAubm9yZW9yZGVyIGRpcmVjdGl2ZSBhcHBlYXJzIGluIHRoZSBzb3VyY2UuICAqLworI2RlZmluZSBFRl9NSVBTX05PUkVPUkRFUgkweDAwMDAwMDAxCisKKy8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfUElDCQkweDAwMDAwMDAyCisKKy8qIENvZGUgaW4gZmlsZSB1c2VzIHRoZSBzdGFuZGFyZCBjYWxsaW5nIHNlcXVlbmNlIGZvciBjYWxsaW5nCisgICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19DUElDCQkweDAwMDAwMDA0CisKKy8qIENvZGUgaW4gZmlsZSB1c2VzIG5ldyBBQkkgKC1uMzIgb24gSXJpeCA2KS4gICovCisjZGVmaW5lIEVGX01JUFNfQUJJMgkJMHgwMDAwMDAyMAorCisvKiBJbmRpY2F0ZXMgY29kZSBjb21waWxlZCBmb3IgYSA2NC1iaXQgbWFjaGluZSBpbiAzMi1iaXQgbW9kZS4gCisgICAocmVncyBhcmUgMzItYml0cyB3aWRlLikgKi8KKyNkZWZpbmUgRUZfTUlQU18zMkJJVE1PREUgICAgICAgMHgwMDAwMDEwMAorCisvKiBGb3VyIGJpdCBNSVBTIGFyY2hpdGVjdHVyZSBmaWVsZC4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSAkJMHhmMDAwMDAwMAorCisvKiAtbWlwczEgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzEJCTB4MDAwMDAwMDAKKworLyogLW1pcHMyIGNvZGUuICAqLworI2RlZmluZSBFX01JUFNfQVJDSF8yCQkweDEwMDAwMDAwCisKKy8qIC1taXBzMyBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMwkJMHgyMDAwMDAwMAorCisvKiAtbWlwczQgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzQJCTB4MzAwMDAwMDAKKworLyogVGhlIEFCSSBvZiB0aGUgZmlsZS4gIEFsc28gc2VlIEVGX01JUFNfQUJJMiBhYm92ZS4gKi8KKyNkZWZpbmUgRUZfTUlQU19BQkkJCTB4MDAwMEYwMDAKKworLyogVGhlIG9yaWdpbmFsIG8zMiBhYmkuICovCisjZGVmaW5lIEVfTUlQU19BQklfTzMyICAgICAgICAgIDB4MDAwMDEwMDAKKworLyogTzMyIGV4dGVuZGVkIHRvIHdvcmsgb24gNjQgYml0IGFyY2hpdGVjdHVyZXMgKi8KKyNkZWZpbmUgRV9NSVBTX0FCSV9PNjQgICAgICAgICAgMHgwMDAwMjAwMAorCisvKiBFQUJJIGluIDMyIGJpdCBtb2RlICovCisjZGVmaW5lIEVfTUlQU19BQklfRUFCSTMyICAgICAgIDB4MDAwMDMwMDAKKworLyogRUFCSSBpbiA2NCBiaXQgbW9kZSAqLworI2RlZmluZSBFX01JUFNfQUJJX0VBQkk2NCAgICAgICAweDAwMDA0MDAwCisKKworLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCisgICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCisgICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCisKKyNkZWZpbmUgRUZfTUlQU19NQUNICQkweDAwRkYwMDAwCisKKy8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7CisgICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKKyAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLworCisjZGVmaW5lIEVfTUlQU19NQUNIXzM5MDAJMHgwMDgxMDAwMAorCisjZGVmaW5lIEVfTUlQU19NQUNIXzQwMTAJMHgwMDgyMDAwMAorI2RlZmluZSBFX01JUFNfTUFDSF80MTAwCTB4MDA4MzAwMDAKKyNkZWZpbmUgRV9NSVBTX01BQ0hfNDY1MAkweDAwODUwMDAwCisjZGVmaW5lIEVfTUlQU19NQUNIXzQxMTEJMHgwMDg4MDAwMAorCisMCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5CisgICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCisgICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCisKKy8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLiAgSWYKKyAgIHJlbG9jYXRlZCwgYWxpZ25tZW50IG11c3QgYmUgcHJlc2VydmVkLiAgKi8KKyNkZWZpbmUgU0hOX01JUFNfQUNPTU1PTgkweGZmMDAKKworLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIHRleHQgc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLgorICAgT2NjdXIgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIEFscGhhIE9TRi8xIGFuZCBJcml4IDUgZXhlY3V0YWJsZXMuICAqLworI2RlZmluZSBTSE5fTUlQU19URVhUCQkweGZmMDEKKworLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIGRhdGEgc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLgorICAgT2NjdXIgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIEFscGhhIE9TRi8xIGFuZCBJcml4IDUgZXhlY3V0YWJsZXMuICAqLworI2RlZmluZSBTSE5fTUlQU19EQVRBCQkweGZmMDIKKworLyogU21hbGwgY29tbW9uIHN5bWJvbC4gICovCisjZGVmaW5lIFNITl9NSVBTX1NDT01NT04JMHhmZjAzCisKKy8qIFNtYWxsIHVuZGVmaW5lZCBzeW1ib2wuICAqLworI2RlZmluZSBTSE5fTUlQU19TVU5ERUZJTkVECTB4ZmYwNAorDAorLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLworCisvKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSBzZXQgb2YgZHluYW1pYyBzaGFyZWQgb2JqZWN0cyB1c2VkIHdoZW4KKyAgIHN0YXRpY2FsbHkgbGlua2luZy4gICovCisjZGVmaW5lIFNIVF9NSVBTX0xJQkxJU1QJMHg3MDAwMDAwMAorCisvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGlzIGlzLCBidXQgaXQncyB1c2VkIG9uIElyaXggNS4gICovCisjZGVmaW5lIFNIVF9NSVBTX01TWU0JCTB4NzAwMDAwMDEKKworLyogU2VjdGlvbiBjb250YWlucyBsaXN0IG9mIHN5bWJvbHMgd2hvc2UgZGVmaW5pdGlvbnMgY29uZmxpY3Qgd2l0aAorICAgc3ltYm9scyBkZWZpbmVkIGluIHNoYXJlZCBvYmplY3RzLiAgKi8KKyNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwMgorCisvKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSBnbG9iYWwgcG9pbnRlciB0YWJsZS4gICovCisjZGVmaW5lIFNIVF9NSVBTX0dQVEFCCQkweDcwMDAwMDAzCisKKy8qIFNlY3Rpb24gY29udGFpbnMgbWljcm9jb2RlIGluZm9ybWF0aW9uLiAgVGhlIGV4YWN0IGZvcm1hdCBpcworICAgdW5zcGVjaWZpZWQuICAqLworI2RlZmluZSBTSFRfTUlQU19VQ09ERQkJMHg3MDAwMDAwNAorCisvKiBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QKKyAgIGZvcm1hdCBpcyB1bnNwZWNpZmllZC4gIEl0J3MgcHJvYmFibHkgRUNPRkYgc3ltYm9scy4gICovCisjZGVmaW5lIFNIVF9NSVBTX0RFQlVHCQkweDcwMDAwMDA1CisKKy8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLworI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDYKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX1BBQ0tBR0UJMHg3MDAwMDAwNworCisvKiA/Pz8gKi8KKyNkZWZpbmUgU0hUX01JUFNfUEFDS1NZTQkweDcwMDAwMDA4CisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19SRUxECQkweDcwMDAwMDA5CisKKy8qIFNlY3Rpb24gY29udGFpbnMgaW50ZXJmYWNlIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX01JUFNfSUZBQ0UJCTB4NzAwMDAwMGIKKworLyogU2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbiBvZiBjb250ZW50cyBvZiBhbm90aGVyIHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfTUlQU19DT05URU5UCTB4NzAwMDAwMGMKKworLyogU2VjdGlvbiBjb250YWlucyBtaXNjZWxsYW5lb3VzIG9wdGlvbnMuICAqLworI2RlZmluZSBTSFRfTUlQU19PUFRJT05TCTB4NzAwMDAwMGQKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX1NIRFIJCTB4NzAwMDAwMTAKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX0ZERVNDCQkweDcwMDAwMDExCisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19FWFRTWU0JCTB4NzAwMDAwMTIKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX0RFTlNFCQkweDcwMDAwMDEzCisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19QREVTQwkJMHg3MDAwMDAxNAorCisvKiA/Pz8gKi8KKyNkZWZpbmUgU0hUX01JUFNfTE9DU1lNCQkweDcwMDAwMDE1CisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19BVVhTWU0JCTB4NzAwMDAwMTYKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX09QVFNZTQkJMHg3MDAwMDAxNworCisvKiA/Pz8gKi8KKyNkZWZpbmUgU0hUX01JUFNfTE9DU1RSCQkweDcwMDAwMDE4CisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19MSU5FCQkweDcwMDAwMDE5CisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19SRkRFU0MJCTB4NzAwMDAwMWEKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBU1lNCTB4NzAwMDAwMWIKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBSU5TVAkweDcwMDAwMDFjCisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19ERUxUQUNMQVNTCTB4NzAwMDAwMWQKKworLyogRFdBUkYgZGVidWdnaW5nIHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfTUlQU19EV0FSRgkJMHg3MDAwMDAxZQorCisvKiA/Pz8gKi8KKyNkZWZpbmUgU0hUX01JUFNfREVMVEFERUNMCTB4NzAwMDAwMWYKKworLyogTGlzdCBvZiBsaWJyYXJpZXMgdGhlIGJpbmFyeSBkZXBlbmRzIG9uLiAgSW5jbHVkZXMgYSB0aW1lIHN0YW1wLCB2ZXJzaW9uCisgICBudW1iZXIuICAqLworI2RlZmluZSBTSFRfTUlQU19TWU1CT0xfTElCCTB4NzAwMDAwMjAKKworLyogRXZlbnRzIHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJCTB4NzAwMDAwMjEKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURQkweDcwMDAwMDIyCisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19QSVhJRQkJMHg3MDAwMDAyMworCisvKiA/Pz8gKi8KKyNkZWZpbmUgU0hUX01JUFNfWExBVEUJCTB4NzAwMDAwMjQKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX1hMQVRFX0RFQlVHCTB4NzAwMDAwMjUKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX1dISVJMCQkweDcwMDAwMDI2CisKKy8qID8/PyAqLworI2RlZmluZSBTSFRfTUlQU19FSF9SRUdJT04JMHg3MDAwMDAyNworCisvKiA/Pz8gKi8KKyNkZWZpbmUgU0hUX01JUFNfWExBVEVfT0xECTB4NzAwMDAwMjgKKworLyogPz8/ICovCisjZGVmaW5lIFNIVF9NSVBTX1BEUl9FWENFUFRJT04JMHg3MDAwMDAyOQorCisKKy8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX0xJQkxJU1QgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhlCisgICBmb2xsb3dpbmcgc3RydWN0dXJlLiAgVGhlIHNoX2xpbmsgZmllbGQgaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlCisgICBzdHJpbmcgdGFibGUuICBUaGUgc2hfaW5mbyBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlCisgICBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIFN0cmluZyB0YWJsZSBpbmRleCBmb3IgbmFtZSBvZiBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBsX25hbWU7CisgIC8qIFRpbWUgc3RhbXAuICAqLworICB1bnNpZ25lZCBsb25nIGxfdGltZV9zdGFtcDsKKyAgLyogQ2hlY2tzdW0gb2Ygc3ltYm9sIG5hbWVzIGFuZCBjb21tb24gc2l6ZXMuICAqLworICB1bnNpZ25lZCBsb25nIGxfY2hlY2tzdW07CisgIC8qIFN0cmluZyB0YWJsZSBpbmRleCBmb3IgdmVyc2lvbi4gICovCisgIHVuc2lnbmVkIGxvbmcgbF92ZXJzaW9uOworICAvKiBGbGFncy4gICovCisgIHVuc2lnbmVkIGxvbmcgbF9mbGFnczsKK30gRWxmMzJfTGliOworCisvKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiBFbGYzMl9MaWIuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBsX25hbWVbNF07CisgIHVuc2lnbmVkIGNoYXIgbF90aW1lX3N0YW1wWzRdOworICB1bnNpZ25lZCBjaGFyIGxfY2hlY2tzdW1bNF07CisgIHVuc2lnbmVkIGNoYXIgbF92ZXJzaW9uWzRdOworICB1bnNpZ25lZCBjaGFyIGxfZmxhZ3NbNF07Cit9IEVsZjMyX0V4dGVybmFsX0xpYjsKKworLyogVGhlIGxfZmxhZ3MgZmllbGQgb2YgYW4gRWxmMzJfTGliIHN0cnVjdHVyZSBtYXkgY29udGFpbiB0aGUKKyAgIGZvbGxvd2luZyBmbGFncy4gICovCisKKy8qIFJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggYXQgcnVudGltZS4gICovCisjZGVmaW5lIExMX0VYQUNUX01BVENICQkweDAwMDAwMDAxCisKKy8qIElnbm9yZSB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBMTF9JR05PUkVfSU5UX1ZFUgkweDAwMDAwMDAyCisKKy8qIFJlcXVpcmUgbWF0Y2hpbmcgbWlub3IgdmVyc2lvbiBudW1iZXIuICAqLworI2RlZmluZSBMTF9SRVFVSVJFX01JTk9SCTB4MDAwMDAwMDQKKworLyogPz8/ICovCisjZGVmaW5lIExMX0VYUE9SVFMJCTB4MDAwMDAwMDgKKworLyogRGVsYXkgbG9hZGluZyBvZiB0aGlzIGxpYnJhcnkgdW50aWwgcmVhbGx5IG5lZWRlZC4gICovCisjZGVmaW5lIExMX0RFTEFZX0xPQUQJCTB4MDAwMDAwMTAKKworLyogPz8/IERlbHRhIEMrKyBzdHVmZiA/Pz8gKi8KKyNkZWZpbmUgTExfREVMVEEJCTB4MDAwMDAwMjAKKworCisvKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19DT05GTElDVCBpcyBhbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlCisgICAuZHluc3ltIHNlY3Rpb24uICBFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgdHlwZS4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRWxmMzJfQ29uZmxpY3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgRWxmMzJfRXh0ZXJuYWxfQ29uZmxpY3RbNF07CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBFbGY2NF9Db25mbGljdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBFbGY2NF9FeHRlcm5hbF9Db25mbGljdFs4XTsKKworLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfR1BUQUIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaG93CisgICBtdWNoIEdQIHNwYWNlIHdvdWxkIGJlIHJlcXVpcmVkIGZvciBkaWZmZXJlbnQgLUcgYXJndW1lbnRzLiAgVGhpcworICAgaW5mb3JtYXRpb24gaXMgb25seSB1c2VkIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gcHJvdmlkZSBpbmZvcm1hdGl2ZQorICAgc3VnZ2VzdGlvbnMgYXMgdG8gdGhlIGJlc3QgLUcgdmFsdWUgdG8gdXNlLiAgVGhlIHNoX2luZm8gZmllbGQgaXMKKyAgIHRoZSBpbmRleCBvZiB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggdGhpcyBpbmZvcm1hdGlvbiBhcHBsaWVzLiAgVGhlCisgICBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgYW4gYXJyYXkgb2YgdGhlIGZvbGxvd2luZyB1bmlvbi4gIFRoZQorICAgZmlyc3QgZWxlbWVudCB1c2VzIHRoZSBndF9oZWFkZXIgZmllbGQuICBUaGUgcmVtYWluaW5nIGVsZW1lbnRzIHVzZQorICAgdGhlIGd0X2VudHJ5IGZpZWxkLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgICAgeworICAgICAgLyogLUcgdmFsdWUgYWN0dWFsbHkgdXNlZCBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCisgICAgICB1bnNpZ25lZCBsb25nIGd0X2N1cnJlbnRfZ192YWx1ZTsKKyAgICAgIC8qIFVudXNlZC4gICovCisgICAgICB1bnNpZ25lZCBsb25nIGd0X3VudXNlZDsKKyAgICB9IGd0X2hlYWRlcjsKKyAgc3RydWN0CisgICAgeworICAgICAgLyogSWYgdGhpcyAtRyBhcmd1bWVudCBoYXMgYmVlbiB1c2VkLi4uICAqLworICAgICAgdW5zaWduZWQgbG9uZyBndF9nX3ZhbHVlOworICAgICAgLyogLi4udGhpcyBtYW55IEdQIHNlY3Rpb24gYnl0ZXMgd291bGQgYmUgcmVxdWlyZWQuICAqLworICAgICAgdW5zaWduZWQgbG9uZyBndF9ieXRlczsKKyAgICB9IGd0X2VudHJ5OworfSBFbGYzMl9ncHRhYjsKKworLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgRWxmMzJfZ3B0YWIuICAqLworCit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfY3VycmVudF9nX3ZhbHVlWzRdOworICAgICAgdW5zaWduZWQgY2hhciBndF91bnVzZWRbNF07CisgICAgfSBndF9oZWFkZXI7CisgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfZ192YWx1ZVs0XTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfYnl0ZXNbNF07CisgICAgfSBndF9lbnRyeTsKK30gRWxmMzJfRXh0ZXJuYWxfZ3B0YWI7CisKKy8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZworICAgc3RydWN0dXJlLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KKyAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOworICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCisgIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKKyAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLworICBsb25nIHJpX2dwX3ZhbHVlOworfSBFbGYzMl9SZWdJbmZvOworCisvKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgRWxmX1JlZ0luZm8gc3RydWN0dXJlLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgcmlfZ3BybWFza1s0XTsKKyAgdW5zaWduZWQgY2hhciByaV9jcHJtYXNrWzRdWzRdOworICB1bnNpZ25lZCBjaGFyIHJpX2dwX3ZhbHVlWzRdOworfSBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvOworCisvKiBNSVBTIEVMRiAucmVnaW5mbyBzd2FwcGluZyByb3V0aW5lcy4gICovCitleHRlcm4gdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKiwgRWxmMzJfUmVnSW5mbyAqKSk7CitleHRlcm4gdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9SZWdJbmZvICosIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikpOworDAorLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLworCisvKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgZ2xvYmFsIGRhdGEgYXJlYS4gICovCisjZGVmaW5lIFNIRl9NSVBTX0dQUkVMCQkweDEwMDAwMDAwCisKKy8qIFRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbWVyZ2VkLiAgKi8KKyNkZWZpbmUgU0hGX01JUFNfTUVSR0UJCTB4MjAwMDAwMDAKKworLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIDMyIGJpdCBhZGRyZXNzZXMuICAqLworI2RlZmluZSBTSEZfTUlQU19BRERSMzIJCTB4NDAwMDAwMDAKKworLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIDY0IGJpdCBhZGRyZXNzZXMuICAqLworI2RlZmluZSBTSEZfTUlQU19BRERSNjQJCTB4ODAwMDAwMDAKKworLyogVGhpcyBzZWN0aW9uIG1heSBub3QgYmUgc3RyaXBwZWQuICAqLworI2RlZmluZSBTSEZfTUlQU19OT1NUUklQCTB4MDgwMDAwMDAKKworLyogVGhpcyBzZWN0aW9uIGlzIGxvY2FsIHRvIHRocmVhZHMuICAqLworI2RlZmluZSBTSEZfTUlQU19MT0NBTAkJMHgwNDAwMDAwMAorCisvKiBMaW5rZXIgc2hvdWxkIGdlbmVyYXRlIGltcGxpY2l0IHdlYWsgbmFtZXMgZm9yIHRoaXMgc2VjdGlvbi4gICovCisjZGVmaW5lIFNIRl9NSVBTX05BTUVTCQkweDAyMDAwMDAwCisMCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuICAqLworCisvKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gIElkZW50aWZpZXMgb25lIC5yZWdpbmZvIHNlY3Rpb24uICAqLworI2RlZmluZSBQVF9NSVBTX1JFR0lORk8JCTB4NzAwMDAwMDAKKworLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUuICAqLworI2RlZmluZSBQVF9NSVBTX1JUUFJPQwkJMHg3MDAwMDAwMQorCisvKiBPcHRpb25zIChmb3Igd2hhdCA/Pz8pLiAgKi8KKyNkZWZpbmUgUFRfTUlQU19PUFRJT05TCQkweDcwMDAwMDAyCisMCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZHluYW1pYyBhcnJheSB0YWdzLiAgKi8KKworLyogMzIgYml0IHZlcnNpb24gbnVtYmVyIGZvciBydW50aW1lIGxpbmtlciBpbnRlcmZhY2UuICAqLworI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OCTB4NzAwMDAwMDEKKworLyogVGltZSBzdGFtcC4gICovCisjZGVmaW5lIERUX01JUFNfVElNRV9TVEFNUAkweDcwMDAwMDAyCisKKy8qIENoZWNrc3VtIG9mIGV4dGVybmFsIHN0cmluZ3MgYW5kIGNvbW1vbiBzaXplcy4gICovCisjZGVmaW5lIERUX01JUFNfSUNIRUNLU1VNCTB4NzAwMDAwMDMKKworLyogSW5kZXggb2YgdmVyc2lvbiBzdHJpbmcgaW4gc3RyaW5nIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19JVkVSU0lPTgkweDcwMDAwMDA0CisKKy8qIDMyIGJpdHMgb2YgZmxhZ3MuICAqLworI2RlZmluZSBEVF9NSVBTX0ZMQUdTCQkweDcwMDAwMDA1CisKKy8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgc2VnbWVudC4gICovCisjZGVmaW5lIERUX01JUFNfQkFTRV9BRERSRVNTCTB4NzAwMDAwMDYKKworLyogPz8/ICovCisjZGVmaW5lIERUX01JUFNfTVNZTQkJMHg3MDAwMDAwNworCisvKiBBZGRyZXNzIG9mIC5jb25mbGljdCBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19DT05GTElDVAkweDcwMDAwMDA4CisKKy8qIEFkZHJlc3Mgb2YgLmxpYmxpc3Qgc2VjdGlvbi4gICovCisjZGVmaW5lIERUX01JUFNfTElCTElTVAkJMHg3MDAwMDAwOQorCisvKiBOdW1iZXIgb2YgbG9jYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1ROTwkweDcwMDAwMDBhCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAuY29uZmxpY3Qgc2VjdGlvbi4gICovCisjZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTwkweDcwMDAwMDBiCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAubGlibGlzdCBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19MSUJMSVNUTk8JMHg3MDAwMDAxMAorCisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19TWU1UQUJOTwkweDcwMDAwMDExCisKKy8qIEluZGV4IG9mIGZpcnN0IGV4dGVybmFsIGR5bmFtaWMgc3ltYm9sIG5vdCByZWZlcmVuY2VkIGxvY2FsbHkuICAqLworI2RlZmluZSBEVF9NSVBTX1VOUkVGRVhUTk8JMHg3MDAwMDAxMgorCisvKiBJbmRleCBvZiBmaXJzdCBkeW5hbWljIHN5bWJvbCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19HT1RTWU0JCTB4NzAwMDAwMTMKKworLyogTnVtYmVyIG9mIHBhZ2UgdGFibGUgZW50cmllcyBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ISVBBR0VOTwkweDcwMDAwMDE0CisKKy8qIEFkZHJlc3Mgb2YgcnVuIHRpbWUgbG9hZGVyIG1hcCwgdXNlZCBmb3IgZGVidWdnaW5nLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19STERfTUFQCQkweDcwMDAwMDE2CisKKy8qIERlbHRhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTUwkweDcwMDAwMDE3CisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfQ0xBU1MuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05PCTB4NzAwMDAwMTgKKworLyogRGVsdGEgQysrIGNsYXNzIGluc3RhbmNlcy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0UJMHg3MDAwMDAxOQorCisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTwkweDcwMDAwMDFhCisKKy8qIERlbHRhIHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQwkweDcwMDAwMDFiCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfUkVMT0MuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05PCTB4NzAwMDAwMWMKKworLyogRGVsdGEgc3ltYm9scyB0aGF0IERlbHRhIHJlbG9jYXRpb25zIHJlZmVyIHRvLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU0JMHg3MDAwMDAxZAorCisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX1NZTS4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfU1lNX05PCTB4NzAwMDAwMWUKKworLyogRGVsdGEgc3ltYm9scyB0aGF0IGhvbGQgY2xhc3MgZGVjbGFyYXRpb25zLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTQkweDcwMDAwMDIwCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfQ0xBU1NTWU0uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05PCTB4NzAwMDAwMjEKKworLyogRmxhZ3MgaW5kaWNhdGluZyBpbmZvcm1hdGlvbiBhYm91dCBDKysgZmxhdm9yLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19DWFhfRkxBR1MJMHg3MDAwMDAyMgorCisvKiBQaXhpZSBpbmZvcm1hdGlvbiAoPz8/KS4gICovCisjZGVmaW5lIERUX01JUFNfUElYSUVfSU5JVAkweDcwMDAwMDIzCisKKy8qID8/PyAqLworI2RlZmluZSBEVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyNAorCisvKiA/Pz8gKi8KKyNkZWZpbmUgRFRfTUlQU19MT0NBTFBBR0VfR09USURYCTB4NzAwMDAwMjUKKworLyogPz8/ICovCisjZGVmaW5lIERUX01JUFNfTE9DQUxfR09USURYCTB4NzAwMDAwMjYKKworLyogPz8/ICovCisjZGVmaW5lIERUX01JUFNfSElEREVOX0dPVElEWAkweDcwMDAwMDI3CisKKy8qID8/PyAqLworI2RlZmluZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFgJMHg3MDAwMDAyOAorCisvKiBBZGRyZXNzIG9mIGAuTUlQUy5vcHRpb25zJy4gICovCisjZGVmaW5lIERUX01JUFNfT1BUSU9OUwkJMHg3MDAwMDAyOQorCisvKiBBZGRyZXNzIG9mIGAuaW50ZXJmYWNlJy4gICovCisjZGVmaW5lIERUX01JUFNfSU5URVJGQUNFCTB4NzAwMDAwMmEKKworLyogPz8/ICovCisjZGVmaW5lIERUX01JUFNfRFlOU1RSX0FMSUdOCTB4NzAwMDAwMmIKKworLyogU2l6ZSBvZiB0aGUgLmludGVyZmFjZSBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0VfU0laRQkweDcwMDAwMDJjCisKKy8qIFNpemUgb2YgcmxkX3RleHRfcmVzb2x2ZSBmdW5jdGlvbiBzdG9yZWQgaW4gdGhlIEdPVC4gICovCisjZGVmaW5lIERUX01JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSCTB4NzAwMDAwMmQKKworLyogRGVmYXVsdCBzdWZmaXggb2YgRFNPIHRvIGJlIGFkZGVkIGJ5IHJsZCBvbiBkbG9wZW4oKSBjYWxscy4gICovCisjZGVmaW5lIERUX01JUFNfUEVSRl9TVUZGSVgJMHg3MDAwMDAyZQorCisvKiBTaXplIG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBzZWN0aW9uIChPMzIpLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19DT01QQUNUX1NJWkUJMHg3MDAwMDAyZgorCisvKiBHUCB2YWx1ZSBmb3IgYXV4aWxpYXJ5IEdPVHMuICAqLworI2RlZmluZSBEVF9NSVBTX0dQX1ZBTFVFCTB4NzAwMDAwMzAKKworLyogQWRkcmVzcyBvZiBhdXhpbGlhcnkgLmR5bmFtaWMuICAqLworI2RlZmluZSBEVF9NSVBTX0FVWF9EWU5BTUlDCTB4NzAwMDAwMzEKKwwKKy8qIEZsYWdzIHdoaWNoIG1heSBhcHBlYXIgaW4gYSBEVF9NSVBTX0ZMQUdTIGVudHJ5LiAgKi8KKworLyogTm8gZmxhZ3MuICAqLworI2RlZmluZSBSSEZfTk9ORQkJMHgwMDAwMDAwMAorCisvKiBVc2VzIHNob3J0Y3V0IHBvaW50ZXJzLiAgKi8KKyNkZWZpbmUgUkhGX1FVSUNLU1RBUlQJCTB4MDAwMDAwMDEKKworLyogSGFzaCBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIHR3by4gICovCisjZGVmaW5lIFJIRl9OT1RQT1QJCTB4MDAwMDAwMDIKKworLyogSWdub3JlIExEX0xJQlJBUllfUEFUSC4gICovCisjZGVmaW5lIFJIU19OT19MSUJSQVJZX1JFUExBQ0VNRU5UIFwKKwkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgUkhGX05PX01PVkUJCSAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUkhGX1NHSV9PTkxZCQkgICAweDAwMDAwMDEwCisjZGVmaW5lIFJIRl9HVUFSQU5URUVfSU5JVAkgICAweDAwMDAwMDIwCisjZGVmaW5lIFJIRl9ERUxUQV9DX1BMVVNfUExVUwkgICAweDAwMDAwMDQwCisjZGVmaW5lIFJIRl9HVUFSQU5URUVfU1RBUlRfSU5JVCAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUkhGX1BJWElFCQkgICAweDAwMDAwMTAwCisjZGVmaW5lIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQJICAgMHgwMDAwMDIwMAorI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJUCSAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVEVECSAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgUkhGX0NPUkQJCSAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgUkhGX05PX1VOUkVTX1VOREVGCSAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUkhGX1JMRF9PUkRFUl9TQUZFCSAgIDB4MDAwMDQwMDAKKwwKKy8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlCisgICBhcmUgdXNlZCBpbiBhbiBJcml4IDUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLworCisjZGVmaW5lIFNUT19ERUZBVUxUCQkweDAwCisjZGVmaW5lIFNUT19JTlRFUk5BTAkJMHgwMQorI2RlZmluZSBTVE9fSElEREVOCQkweDAyCisjZGVmaW5lIFNUT19QUk9URUNURUQJCTB4MDMKKworLyogVGhpcyB2YWx1ZSBpcyB1c2VkIGZvciBhIG1pcHMxNiAudGV4dCBzeW1ib2wuICAqLworI2RlZmluZSBTVE9fTUlQUzE2CQkweGYwCisMCisvKiBUaGUgNjQtYml0IE1JUFMgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgRWFjaAorICAgcmVsb2NhdGlvbiBlbnRyeSBzcGVjaWZpZXMgdXAgdG8gdGhyZWUgYWN0dWFsIHJlbG9jYXRpb25zLCBhbGwgYXQKKyAgIHRoZSBzYW1lIGFkZHJlc3MuICBUaGUgZmlyc3QgcmVsb2NhdGlvbiB3aGljaCByZXF1aXJlZCBhIHN5bWJvbAorICAgdXNlcyB0aGUgc3ltYm9sIGluIHRoZSByX3N5bSBmaWVsZC4gIFRoZSBzZWNvbmQgcmVsb2NhdGlvbiB3aGljaAorICAgcmVxdWlyZXMgYSBzeW1ib2wgdXNlcyB0aGUgc3ltYm9sIGluIHRoZSByX3NzeW0gZmllbGQuICBJZiBhbGwKKyAgIHRocmVlIHJlbG9jYXRpb25zIHJlcXVpcmUgYSBzeW1ib2wsIHRoZSB0aGlyZCBvbmUgdXNlcyBhIHplcm8KKyAgIHZhbHVlLiAgKi8KKworLyogQW4gZW50cnkgaW4gYSA2NCBiaXQgU0hUX1JFTCBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsKKyAgLyogU3ltYm9sIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgY2hhciByX3N5bVs0XTsKKyAgLyogU3BlY2lhbCBzeW1ib2wuICAqLworICB1bnNpZ25lZCBjaGFyIHJfc3N5bVsxXTsKKyAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCisgIHVuc2lnbmVkIGNoYXIgcl90eXBlM1sxXTsKKyAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIHJfdHlwZTJbMV07CisgIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsKK30gRWxmNjRfTWlwc19FeHRlcm5hbF9SZWw7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCisgIGJmZF92bWEgcl9vZmZzZXQ7CisgIC8qIFN5bWJvbCBpbmRleC4gICovCisgIHVuc2lnbmVkIGxvbmcgcl9zeW07CisgIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX3NzeW07CisgIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIHJfdHlwZTM7CisgIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX3R5cGUyOworICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX3R5cGU7Cit9IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsOworCisvKiBBbiBlbnRyeSBpbiBhIDY0IGJpdCBTSFRfUkVMQSBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsKKyAgLyogU3ltYm9sIGluZGV4LiAgKi8KKyAgdW5zaWduZWQgY2hhciByX3N5bVs0XTsKKyAgLyogU3BlY2lhbCBzeW1ib2wuICAqLworICB1bnNpZ25lZCBjaGFyIHJfc3N5bVsxXTsKKyAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCisgIHVuc2lnbmVkIGNoYXIgcl90eXBlM1sxXTsKKyAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIHJfdHlwZTJbMV07CisgIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsKKyAgLyogQWRkZW5kLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX2FkZGVuZFs4XTsKK30gRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhOworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLworICBiZmRfdm1hIHJfb2Zmc2V0OworICAvKiBTeW1ib2wgaW5kZXguICAqLworICB1bnNpZ25lZCBsb25nIHJfc3ltOworICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCisgIHVuc2lnbmVkIGNoYXIgcl9zc3ltOworICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciByX3R5cGUzOworICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCisgIHVuc2lnbmVkIGNoYXIgcl90eXBlMjsKKyAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCisgIHVuc2lnbmVkIGNoYXIgcl90eXBlOworICAvKiBBZGRlbmQuICAqLworICBiZmRfc2lnbmVkX3ZtYSByX2FkZGVuZDsKK30gRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhOworCisvKiBWYWx1ZXMgZm91bmQgaW4gdGhlIHJfc3N5bSBmaWVsZCBvZiBhIHJlbG9jYXRpb24gZW50cnkuICAqLworCisvKiBObyByZWxvY2F0aW9uLiAgKi8KKyNkZWZpbmUgUlNTX1VOREVGCTAKKworLyogVmFsdWUgb2YgR1AuICAqLworI2RlZmluZSBSU1NfR1AJCTEKKworLyogVmFsdWUgb2YgR1AgaW4gb2JqZWN0IGJlaW5nIHJlbG9jYXRlZC4gICovCisjZGVmaW5lIFJTU19HUDAJCTIKKworLyogQWRkcmVzcyBvZiBsb2NhdGlvbiBiZWluZyByZWxvY2F0ZWQuICAqLworI2RlZmluZSBSU1NfTE9DCQkzCisMCisvKiBBIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiBjb250YWlucyBhIHNlcmllcyBvZiBvcHRpb25zLCBlYWNoIG9mCisgICB3aGljaCBzdGFydHMgd2l0aCB0aGlzIGhlYWRlci4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIFR5cGUgb2Ygb3B0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciBraW5kWzFdOworICAvKiBTaXplIG9mIG9wdGlvbiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgaGVhZGVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzaXplWzFdOworICAvKiBTZWN0aW9uIGluZGV4IG9mIGFmZmVjdGVkIHNlY3Rpb24sIG9yIDAgZm9yIGdsb2JhbCBvcHRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIHNlY3Rpb25bMl07CisgIC8qIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMga2luZCBvZiBvcHRpb24uICAqLworICB1bnNpZ25lZCBjaGFyIGluZm9bNF07Cit9IEVsZl9FeHRlcm5hbF9PcHRpb25zOworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBUeXBlIG9mIG9wdGlvbi4gICovCisgIHVuc2lnbmVkIGNoYXIga2luZDsKKyAgLyogU2l6ZSBvZiBvcHRpb24gZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCisgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKKyAgLyogU2VjdGlvbiBpbmRleCBvZiBhZmZlY3RlZCBzZWN0aW9uLCBvciAwIGZvciBnbG9iYWwgb3B0aW9uLiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgc2VjdGlvbjsKKyAgLyogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBraW5kIG9mIG9wdGlvbi4gICovCisgIHVuc2lnbmVkIGxvbmcgaW5mbzsKK30gRWxmX0ludGVybmFsX09wdGlvbnM7CisKKy8qIE1JUFMgRUxGIG9wdGlvbiBoZWFkZXIgc3dhcHBpbmcgcm91dGluZXMuICAqLworZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbgorICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX09wdGlvbnMgKiwgRWxmX0ludGVybmFsX09wdGlvbnMgKikpOworZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQKKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9PcHRpb25zICosIEVsZl9FeHRlcm5hbF9PcHRpb25zICopKTsKKworLyogVmFsdWVzIHdoaWNoIG1heSBhcHBlYXIgaW4gdGhlIGtpbmQgZmllbGQgb2YgYW4gRWxmX09wdGlvbnMKKyAgIHN0cnVjdHVyZS4gICovCisKKy8qIFVuZGVmaW5lZC4gICovCisjZGVmaW5lIE9ES19OVUxMCTAKKworLyogUmVnaXN0ZXIgdXNhZ2UgYW5kIEdQIHZhbHVlLiAgKi8KKyNkZWZpbmUgT0RLX1JFR0lORk8JMQorCisvKiBFeGNlcHRpb24gcHJvY2Vzc2luZyBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIE9ES19FWENFUFRJT05TCTIKKworLyogU2VjdGlvbiBwYWRkaW5nIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgT0RLX1BBRAkJMworCisvKiBIYXJkd2FyZSB3b3JrYXJvdW5kcyBwZXJmb3JtZWQuICAqLworI2RlZmluZSBPREtfSFdQQVRDSAk0CisKKy8qIEZpbGwgdmFsdWUgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KKyNkZWZpbmUgT0RLX0ZJTEwJNQorCisvKiBSZXNlcnZlZCBzcGFjZSBmb3IgZGVza3RvcCB0b29scy4gICovCisjZGVmaW5lIE9ES19UQUdTCTYKKworLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMsIEFORCBiaXRzIHdoZW4gbWVyZ2luZy4gICovCisjZGVmaW5lIE9ES19IV0FORAk3CisKKy8qIEhhcmR3YXJlIHdvcmthcm91bmRzLCBPUiBiaXRzIHdoZW4gbWVyZ2luZy4gICovCisjZGVmaW5lIE9ES19IV09SCTgKKworLyogR1AgZ3JvdXAgdG8gdXNlIGZvciB0ZXh0L2RhdGEgc2VjdGlvbnMuICAqLworI2RlZmluZSBPREtfR1BfR1JPVVAJOQorCisvKiBJRCBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIE9ES19JREVOVAkxMAorCisvKiBJbiB0aGUgMzIgYml0IEFCSSwgYW4gT0RLX1JFR0lORk8gb3B0aW9uIGlzIGp1c3QgYSBFbGYzMl9SZWdJbmZvCisgICBzdHJ1Y3R1cmUuICBJbiB0aGUgNjQgYml0IEFCSSwgaXQgaXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICBUaGUKKyAgIGluZm8gZmllbGQgb2YgdGhlIG9wdGlvbnMgaGVhZGVyIGlzIG5vdCB1c2VkLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLworICB1bnNpZ25lZCBjaGFyIHJpX2dwcm1hc2tbNF07CisgIC8qIFBhZGRpbmcuICAqLworICB1bnNpZ25lZCBjaGFyIHJpX3BhZFs0XTsKKyAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLworICB1bnNpZ25lZCBjaGFyIHJpX2Nwcm1hc2tbNF1bNF07CisgIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KKyAgdW5zaWduZWQgY2hhciByaV9ncF92YWx1ZVs4XTsKK30gRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLworICB1bnNpZ25lZCBsb25nIHJpX2dwcm1hc2s7CisgIC8qIFBhZGRpbmcuICAqLworICB1bnNpZ25lZCBsb25nIHJpX3BhZDsKKyAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLworICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07CisgIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KKyAgYmZkX3ZtYSByaV9ncF92YWx1ZTsKK30gRWxmNjRfSW50ZXJuYWxfUmVnSW5mbzsKKworLyogTUlQUyBFTEYgcmVnaW5mbyBzd2FwcGluZyByb3V0aW5lcy4gICovCitleHRlcm4gdm9pZCBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4KKyAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKiwgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqKSk7CitleHRlcm4gdm9pZCBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9fb3V0CisgIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICosIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikpOworCisvKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yayBvZiBhbiBPREtfRVhDRVBUSU9OUyBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgT0VYX0ZQVV9NSU4JMHgxZgkvKiBGUEVzIHdoaWNoIG11c3QgYmUgZW5hYmxlZC4gICovCisjZGVmaW5lIE9FWF9GUFVfTUFYCTB4MWYwMAkvKiBGUEVzIHdoaWNoIG1heSBiZSBlbmFibGVkLiAgKi8KKyNkZWZpbmUgT0VYX1BBR0UwCTB4MTAwMDAJLyogUGFnZSB6ZXJvIG11c3QgYmUgbWFwcGVkLiAgKi8KKyNkZWZpbmUgT0VYX1NNTQkJMHgyMDAwMAkvKiBGb3JjZSBzZXF1ZW50aWFsIG1lbW9yeSBtb2RlLiAgKi8KKyNkZWZpbmUgT0VYX0ZQREJVRwkweDQwMDAwCS8qIEZvcmNlIGZsb2F0aW5nLXBvaW50IGRlYnVnIG1vZGUuICAqLworI2RlZmluZSBPRVhfRElTTUlTUwkweDgwMDAwCS8qIERpc21pc3MgaW52YWxpZCBhZGRyZXNzIGZhdWx0cy4gICovCisKKy8qIE1hc2tzIG9mIHRoZSBGUCBleGNlcHRpb25zIGZvciBPRVhfRlBVX01JTiBhbmQgT0VYX0ZQVV9NQVguICAqLworI2RlZmluZSBPRVhfRlBVX0lOVkFMCTB4MTAJLyogSW52YWxpZCBvcGVyYXRpb24gZXhjZXB0aW9uLiAgKi8KKyNkZWZpbmUgT0VYX0ZQVV9ESVYwCTB4MDgJLyogRGl2aXNpb24gYnkgemVybyBleGNlcHRpb24uICAqLworI2RlZmluZSBPRVhfRlBVX09GTE8JMHgwNAkvKiBPdmVyZmxvdyBleGNlcHRpb24uICAqLworI2RlZmluZSBPRVhfRlBVX1VGTE8JMHgwMgkvKiBVbmRlcmZsb3cgZXhjZXB0aW9uLiAgKi8KKyNkZWZpbmUgT0VYX0ZQVV9JTkVYCTB4MDEJLyogSW5leGFjdCBleGNlcHRpb24uICAqLworCisvKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfUEFEIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBPUEFEX1BSRUZJWAkweDAxCisjZGVmaW5lIE9QQURfUE9TVEZJWAkweDAyCisjZGVmaW5lIE9QQURfU1lNQk9MCTB4MDQKKworLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0hXUEFUQ0ggZGVzY3JpcHRvci4gICovCisjZGVmaW5lIE9IV19SNEtFT1AJMHgwMQkvKiBSNDAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SOEtQRkVUQ0gJMHgwMgkvKiBNYXkgbmVlZCBSODAwMCBwcmVmZXRjaCBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SNUtFT1AJMHgwNAkvKiBSNTAwMCBlbmQtb2YtcGFnZSBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SNUtDVlRMCTB4MDgJLyogUjUwMDAgY3Z0Lltkc10ubCBidWcgKGNsZWFuID09IDEpLiAgKi8KKworLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0lERU5UL09ES19HUF9HUk9VUCBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgT0dQX0dST1VQCTB4MDAwMGZmZmYJLyogR1AgZ3JvdXAgbnVtYmVyLiAgKi8KKyNkZWZpbmUgT0dQX1NFTEYJMHhmZmZmMDAwMAkvKiBTZWxmLWNvbnRhaW5lZCBHUCBncm91cHMuICAqLworCisvKiBNYXNrcyBmb3IgdGhlIGluZm8gd29yZCBvZiBhbiBPREtfSFdBTkQvT0RLX0hXT1IgZGVzY3JpcHRvci4gICovCisjZGVmaW5lIE9IV0EwX1I0S0VPUF9DSEVDS0VECTB4MDAwMDAwMDEKKyNkZWZpbmUgT0hXQTBfUjRLRU9QX0NMRUFOCTB4MDAwMDAwMDIKKwwKKworI2VuZGlmIC8qIF9FTEZfTUlQU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tbjEwMjAwLmggYi9pbmNsdWRlL2VsZi9tbjEwMjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyOWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL21uMTAyMDAuaApAQCAtMCwwICsxLDM5IEBACisvKiBNTjEwMjAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMjAwIEVMRiBBQkkuICovCisKKyNpZm5kZWYgX0VMRl9NTjEwMjAwX0gKKyNkZWZpbmUgX0VMRl9NTjEwMjAwX0gKKworI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKKworLyogUmVsb2NhdGlvbnMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAyMDBfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfTk9ORSwgMCkKKyAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMzIsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzE2LCAyKQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF84LCAzKQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8yNCwgNCkKKyAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfUENSRUw4LCA1KQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDE2LCA2KQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDI0LCA3KQorRU5EX1JFTE9DX05VTUJFUlMKKworI2VuZGlmIC8qIF9FTEZfTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmggYi9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhMDc1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL21uMTAzMDAuaApAQCAtMCwwICsxLDUzIEBACisvKiBNTjEwMzAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMzAwIEVMRiBBQkkuICovCisKKyNpZm5kZWYgX0VMRl9NTjEwMzAwX0gKKyNkZWZpbmUgX0VMRl9NTjEwMzAwX0gKKworI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKKworLyogUmVsb2NhdGlvbnMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAzMDBfcmVsb2NfdHlwZSkKKyAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfTk9ORSwgMCkKKyAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMzIsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzE2LCAyKQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF84LCAzKQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDMyLCA0KQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDE2LCA1KQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDgsIDYpCisgIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIDcpCisgIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVEVOVFJZLCA4KQorICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8yNCwgOSkKKyAgRU1QVFlfUkVMT0MgIChSX01OMTAzMDBfTUFYKQorRU5EX1JFTE9DX05VTUJFUlMKKworLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCisgICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCisgICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCisKKyNkZWZpbmUgRUZfTU4xMDMwMF9NQUNICQkweDAwRkYwMDAwCisKKy8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7CisgICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKKyAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLworCisjZGVmaW5lIEVfTU4xMDMwMF9NQUNIX01OMTAzMDAJMHgwMDgxMDAwMAorI2VuZGlmIC8qIF9FTEZfTU4xMDMwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9wcGMuaCBiL2luY2x1ZGUvZWxmL3BwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTE2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi9wcGMuaApAQCAtMCwwICsxLDEyNyBAQAorLyogUFBDIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIEJ5IE1pY2hhZWwgTWVpc3NuZXIsIEN5Z251cyBTdXBwb3J0LCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4sIGZyb20gaW5mb3JtYXRpb24KKyAgIGluIHRoZSBTeXN0ZW0gViBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLCBQb3dlclBDIFByb2Nlc3NvciBTdXBwbGVtZW50CisgICBhbmQgdGhlIFBvd2VyUEMgRW1iZWRkZWQgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSAoZWFiaSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBQUEMgRUxGIEFCSS4gIE5vdGUKKyAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLworCisjaWZuZGVmIF9FTEZfUFBDX0gKKyNkZWZpbmUgX0VMRl9QUENfSAorCisjaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgorCisvKiBSZWxvY2F0aW9ucy4gICovCitTVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfcHBjX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfTk9ORSwgMCkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMzIsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjI0LCAyKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNiwgMykKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfTE8sIDQpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0hJLCA1KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9IQSwgNikKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTQsIDcpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0X0JSVEFLRU4sIDgpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0X0JSTlRBS0VOLCA5KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDI0LCAxMCkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwxNCwgMTEpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTRfQlJUQUtFTiwgMTIpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTRfQlJOVEFLRU4sIDEzKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2LCAxNCkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9MTywgMTUpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfSEksIDE2KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0hBLCAxNykKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFRSRUwyNCwgMTgpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfQ09QWSwgMTkpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfR0xPQl9EQVQsIDIwKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0pNUF9TTE9ULCAyMSkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUxBVElWRSwgMjIpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfTE9DQUwyNFBDLCAyMykKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19VQUREUjMyLCAyNCkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19VQUREUjE2LCAyNSkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwzMiwgMjYpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMzIsIDI3KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVFJFTDMyLCAyOCkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9MTywgMjkpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfSEksIDMwKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0hBLCAzMSkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19TREFSRUwxNiwgMzIpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRiwgMzMpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRl9MTywgMzQpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRl9ISSwgMzUpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfU0VDVE9GRl9IQSwgMzYpCisKKy8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAorICAgaW4gdGhlIFNWUjQgRUxGIEFCSS4gICovCisgIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMzIsIDEwMSkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNiwgMTAyKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0xPLCAxMDMpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfSEksIDEwNCkKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9IQSwgMTA1KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREFJMTYsIDEwNikKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMkkxNiwgMTA3KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEyUkVMLCAxMDgpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTIxLCAxMDkpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX01SS1JFRiwgMTEwKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTRUMxNiwgMTExKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTVF9MTywgMTEyKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTVF9ISSwgMTEzKQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTVF9IQSwgMTE0KQorICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9CSVRfRkxELCAxMTUpCisgIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1JFTFNEQSwgMTE2KQorCisgIC8qIFRoZXNlIGFyZSBHTlUgZXh0ZW5zaW9ucyB0byBlbmFibGUgQysrIHZ0YWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLworICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dOVV9WVElOSEVSSVQsIDI1MykKKyAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTlVfVlRFTlRSWSwgMjU0KQorCisvKiBUaGlzIGlzIGEgcGhvbnkgcmVsb2MgdG8gaGFuZGxlIGFueSBvbGQgZmFzaGlvbmVkIFRPQzE2IHJlZmVyZW5jZXMKKyAgIHRoYXQgbWF5IHN0aWxsIGJlIGluIG9iamVjdCBmaWxlcy4gICovCisgIFJFTE9DX05VTUJFUiAoUl9QUENfVE9DMTYsIDI1NSkKKworICBFTVBUWV9SRUxPQyAoUl9QUENfbWF4KQorRU5EX1JFTE9DX05VTUJFUlMKKworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLworCisjZGVmaW5lCUVGX1BQQ19FTUIJCTB4ODAwMDAwMDAJLyogUG93ZXJQQyBlbWJlZGRlZCBmbGFnICAqLworCisJCQkJCQkvKiBDWUdOVVMgbG9jYWwgYml0cyBiZWxvdyAqLworI2RlZmluZQlFRl9QUENfUkVMT0NBVEFCTEUJMHgwMDAxMDAwMAkvKiBQb3dlclBDIC1tcmVsb2NhdGFibGUgZmxhZyAqLworI2RlZmluZQlFRl9QUENfUkVMT0NBVEFCTEVfTElCCTB4MDAwMDgwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlLWxpYiBmbGFnICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGhlYWRlcnMsIHNoX3R5cGUgZmllbGQgKi8KKworI2RlZmluZSBTSFRfT1JERVJFRAkJU0hUX0hJUFJPQwkvKiBMaW5rIGVkaXRvciBpcyB0byBzb3J0IHRoZSBcCisJCQkJCQkgICBlbnRyaWVzIGluIHRoaXMgc2VjdGlvbiBcCisJCQkJCQkgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBcCisJCQkJCQkgICBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgXAorCQkJCQkJICAgc3ltYm9sIHRhYmxlIGVudHJ5LiAgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MsIHNoX2ZsYWdzIGZpZWxkICovCisKKyNkZWZpbmUgU0hGX0VYQ0xVREUJCTB4ODAwMDAwMDAJLyogTGluayBlZGl0b3IgaXMgdG8gZXhjbHVkZSBcCisJCQkJCQkgICB0aGlzIHNlY3Rpb24gZnJvbSBleGVjdXRhYmxlIFwKKwkJCQkJCSAgIGFuZCBzaGFyZWQgb2JqZWN0cyB0aGF0IGl0IFwKKwkJCQkJCSAgIGJ1aWxkcyB3aGVuIHRob3NlIG9iamVjdHMgXAorCQkJCQkJICAgYXJlIG5vdCB0byBiZSBmdXJodGVyIFwKKwkJCQkJCSAgIHJlbG9jYXRlZC4gICovCisjZW5kaWYgLyogX0VMRl9QUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmggYi9pbmNsdWRlL2VsZi9yZWxvYy1tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYyMjkxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEdlbmVyaWMgcmVsb2NhdGlvbiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSB2YXJpb3VzICouaCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyCisgICBmaWxlcyB0byBlaXRoZXIgZ2VuZXJhdGUgYW4gZW51bSBjb250YWluaW5nIGFsbCB0aGUga25vd24gcmVsb2NhdGlvbnMKKyAgIGZvciB0aGF0IHRhcmdldCwgb3IgaWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzIGRlZmluZWQsIGEgcmVjb2duaXRpb24KKyAgIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBpbnN0ZWFkLiAgKFRoaXMgaXMgdXNlZCBieSBiaW51dGlscy9yZWFkZWxmLmMpCisKKyAgIEdpdmVuIGEgaGVhZGVyIGZpbGUgbGlrZSB0aGlzOgorCisgICAJU1RBUlRfUkVMT0NfTlVNQkVSUyAoZm9vKQorICAgCSAgICBSRUxPQ19OVU1CRVIgKFJfZm9vX05PTkUsICAgIDApCisgICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fMzIsICAgICAgMSkKKyAgIAkgICAgRkFLRV9SRUxPQyAgIChSX2Zvb19pbGxlZ2FsLCAyKQorICAgCSAgICBFTVBUWV9SRUxPQyAgKFJfZm9vX21heCkKKyAgIAlFTkRfUkVMT0NfTlVNQkVSUworCisgICBUaGVuIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBwcm9kdWNlZCBieSBkZWZhdWx0IChpZSBpZgorICAgUkVMT0NfTUFDUk9TX0dFTl9GVU5DIGlzICpub3QqIGRlZmluZWQpLgorCisgICAJZW51bSBmb28KKwl7CisJICBmb28gPSAtMSwKKyAgIAkgIFJfZm9vX05PTkUgPSAwLAorICAgCSAgUl9mb29fMzIgPSAxLAorICAgCSAgUl9mb29faWxsZWdhbCA9IDIsCisgICAJICBSX2Zvb19tYXgKKyAgIAl9OworCisgICBJZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgKmlzKiBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhlCisgICBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQ6CisKKyAgIAlzdGF0aWMgY2hhciAqIGZvbyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7CisgICAJc3RhdGljIGNoYXIgKgorICAgCWZvbyAocnR5cGUpCisgICAJICAgIHVuc2lnbmVkIGxvbmcgcnR5cGU7CisgICAJeworICAgCSAgIHN3aXRjaCAocnR5cGUpCisgICAJICAgeworICAgCSAgIGNhc2UgMDogcmV0dXJuICJSX2Zvb19OT05FIjsKKyAgIAkgICBjYXNlIDE6IHJldHVybiAiUl9mb29fMzIiOworICAgCSAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICAgCSAgIH0KKyAgIAl9CisgICAqLworICAgCisjaWZuZGVmIF9SRUxPQ19NQUNST1NfSAorI2RlZmluZSBfUkVMT0NfTUFDUk9TX0gKKworI2lmZGVmIFJFTE9DX01BQ1JPU19HRU5fRlVOQworCisvKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSByZWxvY2F0aW9uIG51bWJlciBhbmQgcmV0dXJucyB0aGUKKyAgIHN0cmluZyB2ZXJzaW9uIG5hbWUgb2YgdGhlIG5hbWUgb2YgdGhhdCByZWxvY2F0aW9uLiAgSWYKKyAgIHRoZSByZWxvY2F0aW9uIGlzIG5vdCByZWNvZ25pc2VkLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KKworI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgCQkJCVwKK3N0YXRpYyBjb25zdCBjaGFyICogbmFtZSAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHJ0eXBlKSk7IAlcCitzdGF0aWMgY29uc3QgY2hhciAqCQkJCQkJXAorbmFtZSAocnR5cGUpCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIHJ0eXBlOwkJCQkJXAorewkJCQkJCQkJXAorICBzd2l0Y2ggKHJ0eXBlKQkJCQkJCVwKKyAgeworCisjaWZkZWYgX19TVERDX18JCQkJCSAgCisjZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICBjYXNlIG51bWJlciA6IHJldHVybiAjbmFtZSA7CisjZWxzZQorI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgY2FzZSBudW1iZXIgOiByZXR1cm4gIm5hbWUiIDsKKyNlbmRpZgorCisjZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAKKyNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkKKwkJCQkJICAKKyNkZWZpbmUgRU5EX1JFTE9DX05VTUJFUlMJXAorICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOwlcCisgIH0JCQkJXAorfQorCisKKyNlbHNlIC8qIERlZmF1bHQgdG8gZ2VuZXJhdGluZyBlbnVtLiAgKi8KKworLyogU29tZSBjb21waWxlcnMgY2Fubm90IGNvcGUgd2l0aCBhbiBlbnVtIHRoYXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcKKyAgIGNvbW1hLCBzbyBTVEFSVF9SRUxPQ19OVU1CRVJTIGNyZWF0ZXMgYSBmYWtlIHJlbG9jIGVudHJ5LCAoaW5pdGlhbGlzZWQKKyAgIHRvIC0xIHNvIHRoYXQgdGhlIGZpcnN0IHJlYWwgZW50cnkgd2lsbCBzdGlsbCBkZWZhdWx0IHRvIDApLiAgRnVydGhlcgorICAgZW50cmllcyB0aGVuIHByZXBlbmQgYSBjb21tYSB0byB0aGVpciBkZWZpbml0aW9ucywgY3JlYXRpbmcgYSBsaXN0CisgICBvZiBlbnVtZXJhdG9yIGVudHJpZXMgdGhhdCB3aWxsIHNhdGlzZnkgdGhlc2UgY29tcGlsZXJzLiAgKi8KKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgZW51bSBuYW1lIHsgXyMjbmFtZSA9IC0xCisjZWxzZQorI2RlZmluZSBTVEFSVF9SRUxPQ19OVU1CRVJTKG5hbWUpICAgZW51bSBuYW1lIHsgbmFtZSA9IC0xCisjZW5kaWYKKwkJCQkJCQorI2RlZmluZSBSRUxPQ19OVU1CRVIobmFtZSwgbnVtYmVyKSAgLCBuYW1lID0gbnVtYmVyCisjZGVmaW5lIEZBS0VfUkVMT0MobmFtZSwgbnVtYmVyKSAgICAsIG5hbWUgPSBudW1iZXIgCisjZGVmaW5lIEVNUFRZX1JFTE9DKG5hbWUpICAgICAgICAgICAsIG5hbWUgCisjZGVmaW5lIEVORF9SRUxPQ19OVU1CRVJTICAgICAgICAgICB9OworCisjZW5kaWYKKworI2VuZGlmIC8qIFJFTE9DX01BQ1JPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9zaC5oIGIvaW5jbHVkZS9lbGYvc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQ3NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9lbGYvc2guaApAQCAtMCwwICsxLDU1IEBACisvKiBTSCBFTEYgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0VMRl9TSF9ICisjZGVmaW5lIF9FTEZfU0hfSAorCisjaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgorCisvKiBSZWxvY2F0aW9ucy4gICovCisvKiBSZWxvY2F0aW9ucyAyNWZmIGFyZSBHTlUgZXh0ZW5zaW9ucy4KKyAgIDI1Li4zMyBhcmUgdXNlZCBmb3IgcmVsYXhhdGlvbiBhbmQgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBDT0ZGIHVzZXMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NoX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9TSF9OT05FLCAwKQorICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSMzIsIDEpCisgIFJFTE9DX05VTUJFUiAoUl9TSF9SRUwzMiwgMikKKyAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUE4sIDMpCisgIFJFTE9DX05VTUJFUiAoUl9TSF9JTkQxMlcsIDQpCisgIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BMLCA1KQorICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQWiwgNikKKyAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhCUCwgNykKKyAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXLCA4KQorICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOEwsIDkpCisgIEZBS0VfUkVMT0MgKFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQywgMTApCisgIEZBS0VfUkVMT0MgKFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCAyNCkKKyAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDE2LCAyNSkKKyAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDMyLCAyNikKKyAgUkVMT0NfTlVNQkVSIChSX1NIX1VTRVMsIDI3KQorICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09VTlQsIDI4KQorICBSRUxPQ19OVU1CRVIgKFJfU0hfQUxJR04sIDI5KQorICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09ERSwgMzApCisgIFJFTE9DX05VTUJFUiAoUl9TSF9EQVRBLCAzMSkKKyAgUkVMT0NfTlVNQkVSIChSX1NIX0xBQkVMLCAzMikKKyAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDgsIDMzKQorICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZUSU5IRVJJVCwgMzQpCisgIFJFTE9DX05VTUJFUiAoUl9TSF9HTlVfVlRFTlRSWSwgMzUpCisgIEVNUFRZX1JFTE9DIChSX1NIX21heCkKK0VORF9SRUxPQ19OVU1CRVJTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc3BhcmMuaCBiL2luY2x1ZGUvZWxmL3NwYXJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllNGNkZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZWxmL3NwYXJjLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIFNQQVJDIEVMRiBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBCeSBEb3VnIEV2YW5zLCBDeWdudXMgU3VwcG9ydCwgPGRqZUBjeWdudXMuY29tPi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9FTEZfU1BBUkNfSAorI2RlZmluZSBfRUxGX1NQQVJDX0gKKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KKworLyogVGhlc2UgYXJlIGRlZmluZWQgYnkgU3VuLiAgKi8KKworI2RlZmluZSBFRl9TUEFSQ18zMlBMVVNfTUFTSwkweGZmZmYwMAkvKiBiaXRzIGluZGljYXRpbmcgVjgrIHR5cGUgKi8KKyNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTCQkweDAwMDEwMAkvKiBnZW5lcmljIFY4KyBmZWF0dXJlcyAqLworI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMxCTB4MDAwMjAwCS8qIFN1biBVbHRyYVNQQVJDMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX0hBTF9SMQkJMHgwMDA0MDAJLyogSEFMIFIxIGV4dGVuc2lvbnMgKi8KKworI2RlZmluZSBFRl9TUEFSQ19MRURBVEEgICAgICAgICAweDgwMDAwMAkvKiBsaXR0bGUgZW5kaWFuIGRhdGEgKi8KKworLyogVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlIFY5IEFCSS4gICovCisjZGVmaW5lIEVGX1NQQVJDX0VYVF9NQVNLCTB4ZmZmZjAwCS8qIHJlc2VydmVkIGZvciB2ZW5kb3IgZXh0ZW5zaW9ucyAqLworCisvKiBWOSBtZW1vcnkgbW9kZWxzICovCisjZGVmaW5lIEVGX1NQQVJDVjlfTU0JCTB4MwkJLyogbWVtb3J5IG1vZGVsIG1hc2sgKi8KKyNkZWZpbmUgRUZfU1BBUkNWOV9UU08JCTB4MAkJLyogdG90YWwgc3RvcmUgb3JkZXJpbmcgKi8KKyNkZWZpbmUgRUZfU1BBUkNWOV9QU08JCTB4MQkJLyogcGFydGlhbCBzdG9yZSBvcmRlcmluZyAqLworI2RlZmluZSBFRl9TUEFSQ1Y5X1JNTwkJMHgyCQkvKiByZWxheGVkIHN0b3JlIG9yZGVyaW5nICovCisKKy8qIFNlY3Rpb24gaW5kaWNlcy4gICovCisKKyNkZWZpbmUgU0hOX0JFRk9SRQkJMHhmZjAwCQkvKiB1c2VkIHdpdGggU0hGX09SREVSRUQgKi8KKyNkZWZpbmUgU0hOX0FGVEVSCQkweGZmMDEJCS8qIHVzZWQgd2l0aCBTSEZfT1JERVJFRCAqLworCisvKiBTZWN0aW9uIGZsYWdzLiAgKi8KKworI2RlZmluZSBTSEZfRVhDTFVERQkJMHg4MDAwMDAwMAkvKiBleGNsdWRlIGZyb20gbGlua2luZyAqLworI2RlZmluZSBTSEZfT1JERVJFRAkJMHg0MDAwMDAwMAkvKiB0cmVhdCBzaF9saW5rLHNoX2luZm8gc3BlY2lhbGx5ICovCisKKy8qIFN5bWJvbCB0eXBlcy4gICovCisKKyNkZWZpbmUgU1RUX1JFR0lTVEVSCQkxMwkJLyogZ2xvYmFsIHJlZyByZXNlcnZlZCB0byBhcHAuICovCisKKyNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCisKKy8qIFJlbG9jYXRpb24gdHlwZXMuICAqLworU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NwYXJjX3JlbG9jX3R5cGUpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19OT05FLCAwKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfOCwgMSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzE2LCAyKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfMzIsIDMpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQOCwgNCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1AxNiwgNSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1AzMiwgNikKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMzAsIDcpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDIyLCA4KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSEkyMiwgOSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzIyLCAxMCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzEzLCAxMSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPMTAsIDEyKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR09UMTAsIDEzKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR09UMTMsIDE0KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR09UMjIsIDE1KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUEMxMCwgMTYpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQzIyLCAxNykKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dQTFQzMCwgMTgpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19DT1BZLCAxOSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dMT0JfREFULCAyMCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0pNUF9TTE9ULCAyMSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFTEFUSVZFLCAyMikKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBMzIsIDIzKQorCisgIC8qID8/PyBUaGVzZSA2IHJlbG9jcyBhcmUgbmV3IGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICBGb3IgYmluYXJ5CisgICAgIGNvbXBhdGlsaXR5IGluIHRoZSBzcGFyYzY0LWVsZiB0b29sY2hhaW4sIHdlIGxlYXZlIHRoZW0gb3V0LgorICAgICBBIG5vbi1iaW5hcnkgdXB3YXJkIGNvbXBhdGlibGUgY2hhbmdlIGlzIGV4cGVjdGVkIGZvciBzcGFyYzY0LWVsZi4gICovCisjaWZuZGVmIFNQQVJDNjRfT0xEX1JFTE9DUworICAvKiA/Pz8gTmV3IHJlbG9jcyBvbiB0aGUgVWx0cmFTUEFSQy4gIE5vdCBzdXJlIHdoYXQgdGhleSdyZSBmb3IgeWV0LiAgKi8KKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BMVDMyLCAyNCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJUExUMjIsIDI1KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE9QTFQxMCwgMjYpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDMyLCAyNykKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMjIsIDI4KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQxMCwgMjkpCisjZW5kaWYKKworICAvKiB2OSByZWxvY3MgKi8KKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzEwLCAzMCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzExLCAzMSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzY0LCAzMikKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX09MTzEwLCAzMykKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hIMjIsIDM0KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfSE0xMCwgMzUpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MTTIyLCAzNikKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0hIMjIsIDM3KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfSE0xMCwgMzgpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19MTTIyLCAzOSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMTYsIDQwKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AxOSwgNDEpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VTlVTRURfNDIsIDQyKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNywgNDMpCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ181LCA0NCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzYsIDQ1KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDY0LCA0NikKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BMVDY0LCA0NykKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJWDIyLCA0OCkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPWDEwLCA0OSkKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0g0NCwgNTApCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19NNDQsIDUxKQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTDQ0LCA1MikKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFR0lTVEVSLCA1MykKKyAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBNjQsIDU0KQorICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVUExNiwgNTUpCisKKyAgLyogbGl0dGxlIGVuZGlhbiBkYXRhIHJlbG9jcyAqLworICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUkVWMzIsIDU2KQorCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAyNTApCisgIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTlVfVlRFTlRSWSwgMjUxKQorCisgIEVNUFRZX1JFTE9DICAoUl9TUEFSQ19tYXgpCitFTkRfUkVMT0NfTlVNQkVSUworCisvKiBSZWxvY2F0aW9uIG1hY3Jvcy4gICovCisKKyNkZWZpbmUgRUxGNjRfUl9UWVBFX0RBVEEoaW5mbykJCSgoKGJmZF92bWEpIChpbmZvKSA8PCAzMikgPj4gNDApCisjZGVmaW5lIEVMRjY0X1JfVFlQRV9JRChpbmZvKQkJKCgoYmZkX3ZtYSkgKGluZm8pIDw8IDU2KSA+PiA1NikKKyNkZWZpbmUgRUxGNjRfUl9UWVBFX0lORk8oZGF0YSwgdHlwZSkJKCgoYmZkX3ZtYSkgKGRhdGEpIDw8IDgpIFwKKwkJCQkJICsgKGJmZF92bWEpICh0eXBlKSkKKworI2RlZmluZSBEVF9TUEFSQ19SRUdJU1RFUgkweDcwMDAwMDAxCisKKy8qCisgKiBGSVhNRTogTk9UIEFCSSAtLSBHRVQgUklEIE9GIFRISVMKKyAqIERlZmluZXMgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSAucGx0LiAgQ3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZQorICogICAwIC0tIHJlc2VydmVkIHRvIFNJCisgKiAgIDEgLS0gYWJzb2x1dGUgYWRkcmVzcyBpbiAuZ290LnBsdAorICogICAyIC0tIGdvdC1yZWxhdGl2ZSBhZGRyZXNzIGluIC5nb3QucGx0CisgKi8KKworI2RlZmluZSBEVF9TUEFSQ19QTFRGTVQJCTB4NzAwMDAwMDEKKworI2VuZGlmIC8qIF9FTEZfU1BBUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvdjg1MC5oIGIvaW5jbHVkZS9lbGYvdjg1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDNiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VsZi92ODUwLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIFY4NTAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENyZWF0ZWQgYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQgPG1laXNzbmVyQGN5Z251cy5jb20+CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNSVBTIEVMRiBBQkkuICBOb3RlCisgICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KKworI2lmbmRlZiBfRUxGX1Y4NTBfSAorI2RlZmluZSBfRUxGX1Y4NTBfSAorCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLworCisvKiBGb3VyIGJpdCBWODUwIGFyY2hpdGVjdHVyZSBmaWVsZC4gICovCisjZGVmaW5lIEVGX1Y4NTBfQVJDSAkJMHhmMDAwMDAwMAorCisvKiB2ODUwIGNvZGUuICAqLworI2RlZmluZSBFX1Y4NTBfQVJDSAkJMHgwMDAwMDAwMAorCisvKiB2ODUwZSBjb2RlLiAgKi8KKyNkZWZpbmUgRV9WODUwRV9BUkNICQkweDEwMDAwMDAwCisKKy8qIHY4NTBlYSBjb2RlLiAgKi8KKyNkZWZpbmUgRV9WODUwRUFfQVJDSAkJMHgyMDAwMDAwMAorCisKKy8qIEZsYWdzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgKi8KKyNkZWZpbmUgVjg1MF9PVEhFUl9TREEJCTB4MDEJLyogc3ltYm9sIGhhZCBTREEgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgVjg1MF9PVEhFUl9aREEJCTB4MDIJLyogc3ltYm9sIGhhZCBaREEgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgVjg1MF9PVEhFUl9UREEJCTB4MDQJLyogc3ltYm9sIGhhZCBUREEgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgVjg1MF9PVEhFUl9UREFfQllURQkweDA4CS8qIHN5bWJvbCBoYWQgVERBIGJ5dGUgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgVjg1MF9PVEhFUl9FUlJPUgkweDgwCS8qIHN5bWJvbCBoYWQgYW4gZXJyb3IgcmVwb3J0ZWQgKi8KKworLyogVjg1MCByZWxvY2F0aW9ucyAqLworI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKKworU1RBUlRfUkVMT0NfTlVNQkVSUyAodjg1MF9yZWxvY190eXBlKQorICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9OT05FLCAwKQorICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF85X1BDUkVMLCAxKQorICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8yMl9QQ1JFTCwgMikKKyAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfSEkxNl9TLCAzKQorICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9ISTE2LCA0KQorICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9MTzE2LCA1KQorICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8zMiwgNikKKyAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfMTYsIDcpCisgICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzgsIDgpCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQsIDkpCQkvKiBGb3IgbGQuYiwgc3QuYiwgc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQsIDEwKQkJLyogRm9yIGxkLncsIGxkLmgsIGxkLmh1LCBzdC53LCBzdC5oICovCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQsIDExKQkJLyogRm9yIGxkLmIsIHN0LmIsIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLworICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VULCAxMikJCS8qIEZvciBsZC53LCBsZC5oLCBsZC5odSwgc3Qudywgc3QuaCAqLworICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfNl84X09GRlNFVCwgMTMpCQkvKiBGb3Igc3N0LncsIHNsZC53ICovCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV83XzhfT0ZGU0VULCAxNCkJCS8qIEZvciBzc3QuaCwgc2xkLmggKi8KKyAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzdfN19PRkZTRVQsIDE1KQkJLyogRm9yIHNzdC5iLCBzbGQuYiAqLworICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULCAxNikJCS8qIEZvciBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KKy8qIENZR05VUyBMT0NBTCB2ODUwZSAqLworICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfNF81X09GRlNFVCwgMTcpCQkvKiBGb3Igc2xkLmh1ICovCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV80XzRfT0ZGU0VULCAxOCkJCS8qIEZvciBzbGQuYnUgKi8KKyAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwgMTkpCS8qIEZvciBsZC5idSAqLworICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULCAyMCkJLyogRm9yIGxkLmJ1ICovCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX0NBTExUXzZfN19PRkZTRVQsIDIxKQkJLyogRm9yIGNhbGx0ICovCisgICAgIFJFTE9DX05VTUJFUiggUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCwgMjIpCS8qIEZvciBjYWxsdCAqLworLyogRU5EIENZR05VUyBMT0NBTCAqLworICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9HTlVfVlRJTkhFUklULCAyMykKKyAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfR05VX1ZURU5UUlksIDI0KQorCisgICAgIEVNUFRZX1JFTE9DIChSX1Y4NTBfbWF4KQorRU5EX1JFTE9DX05VTUJFUlMKKworDAorLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gaW5kaWNlcy4gIFRoZXNlIHNlY3Rpb25zIGRvIG5vdCBhY3R1YWxseQorICAgZXhpc3QuICBTeW1ib2xzIHdpdGggYSBzdF9zaG5keCBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGVzZQorICAgdmFsdWVzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuICAqLworCisvKiBTbWFsbCBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCisjZGVmaW5lIFNITl9WODUwX1NDT01NT04JMHhmZjAwCisKKy8qIFRpbnkgZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLworI2RlZmluZSBTSE5fVjg1MF9UQ09NTU9OCTB4ZmYwMQorCisvKiBaZXJvIGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KKyNkZWZpbmUgU0hOX1Y4NTBfWkNPTU1PTgkweGZmMDIKKworDAorLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLworCisvKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KKyNkZWZpbmUgU0hUX1Y4NTBfU0NPTU1PTgkweDcwMDAwMDAwCisKKy8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLworI2RlZmluZSBTSFRfVjg1MF9UQ09NTU9OCTB4NzAwMDAwMDEKKworLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCisjZGVmaW5lIFNIVF9WODUwX1pDT01NT04JMHg3MDAwMDAwMgorCisKKyNlbmRpZiAvKiBfRUxGX1Y4NTBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mbG9hdGZvcm1hdC5oIGIvaW5jbHVkZS9mbG9hdGZvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGFjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkZWNsYXJhdGlvbnMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChGTE9BVEZPUk1BVF9IKQorI2RlZmluZSBGTE9BVEZPUk1BVF9IIDEKKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKy8qIEEgZmxvYXRmb3JtYXQgY29uc2lzdHMgb2YgYSBzaWduIGJpdCwgYW4gZXhwb25lbnQgYW5kIGEgbWFudGlzc2EuICBPbmNlIHRoZQorICAgYnl0ZXMgYXJlIGNvbmNhdGVuYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGJ5dGVvcmRlciBmbGFnLCB0aGVuIGVhY2ggb2YgdGhvc2UKKyAgIGZpZWxkcyBpcyBjb250aWd1b3VzLiAgV2UgbnVtYmVyIHRoZSBiaXRzIHdpdGggMCBiZWluZyB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgKGkuZS4gQklUU19CSUdfRU5ESUFOIHR5cGUgbnVtYmVyaW5nKSwgYW5kIHNwZWNpZnkgd2hpY2ggYml0cyBlYWNoIGZpZWxkCisgICBjb250YWlucyB3aXRoIHRoZSAqX3N0YXJ0IGFuZCAqX2xlbiBmaWVsZHMuICAqLworCisvKiBXaGF0IGlzIHRoZSBvcmRlciBvZiB0aGUgYnl0ZXMuICovCisKK2VudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyB7CisKKyAgLyogU3RhbmRhcmQgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgorICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+IDAwIDAwIDgwIGM1IGUwIGZlIDA2IDQyICovCisKKyAgZmxvYXRmb3JtYXRfbGl0dGxlLAorCisgIC8qIFN0YW5kYXJkIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4KKyAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiA0MiAwNiBmZSBlMCBjNSA4MCAwMCAwMCAqLworCisgIGZsb2F0Zm9ybWF0X2JpZywKKworICAvKiBMaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgYnV0IGJpZyBlbmRpYW4gd29yZCBvcmRlci4KKyAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiBlMCBmZSAwNiA0MiAwMCAwMCA4MCBjNSAqLworCisgIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZAorCit9OworCitlbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCB7IGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubyB9OworCitzdHJ1Y3QgZmxvYXRmb3JtYXQKK3sKKyAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIGJ5dGVvcmRlcjsKKyAgdW5zaWduZWQgaW50IHRvdGFsc2l6ZTsJLyogVG90YWwgc2l6ZSBvZiBudW1iZXIgaW4gYml0cyAqLworCisgIC8qIFNpZ24gYml0IGlzIGFsd2F5cyBvbmUgYml0IGxvbmcuICAxIG1lYW5zIG5lZ2F0aXZlLCAwIG1lYW5zIHBvc2l0aXZlLiAgKi8KKyAgdW5zaWduZWQgaW50IHNpZ25fc3RhcnQ7CisKKyAgdW5zaWduZWQgaW50IGV4cF9zdGFydDsKKyAgdW5zaWduZWQgaW50IGV4cF9sZW47CisgIC8qIEFtb3VudCBhZGRlZCB0byAidHJ1ZSIgZXhwb25lbnQuICAweDNmZmYgZm9yIG1hbnkgSUVFRSBleHRlbmRlZHMuICAqLworICB1bnNpZ25lZCBpbnQgZXhwX2JpYXM7CisgIC8qIEV4cG9uZW50IHZhbHVlIHdoaWNoIGluZGljYXRlcyBOYU4uICBUaGlzIGlzIHRoZSBhY3R1YWwgdmFsdWUgc3RvcmVkIGluCisgICAgIHRoZSBmbG9hdCwgbm90IGFkanVzdGVkIGJ5IHRoZSBleHBfYmlhcy4gIFRoaXMgdXN1YWxseSBjb25zaXN0cyBvZiBhbGwKKyAgICAgb25lIGJpdHMuICAqLworICB1bnNpZ25lZCBpbnQgZXhwX25hbjsKKworICB1bnNpZ25lZCBpbnQgbWFuX3N0YXJ0OworICB1bnNpZ25lZCBpbnQgbWFuX2xlbjsKKworICAvKiBJcyB0aGUgaW50ZWdlciBiaXQgZXhwbGljaXQgb3IgaW1wbGljaXQ/ICAqLworICBlbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCBpbnRiaXQ7Cit9OworCisvKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGU7CitleHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlOworCisvKiBmbG9hdGZvcm1hdCBmb3IgQVJNIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGVzIGFuZCBiaWcgZW5kaWFuIHdvcmRzICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkOworCisvKiBmbG9hdGZvcm1hdHMgZm9yIHZhcmlvdXMgZXh0ZW5kZWRzLiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQ7CisKKy8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCisgICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KKyAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KKworZXh0ZXJuIHZvaWQKK2Zsb2F0Zm9ybWF0X3RvX2RvdWJsZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiwgY2hhciAqLCBkb3VibGUgKikpOworCisvKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBGTVQKKyAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICAqLworCitleHRlcm4gdm9pZAorZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosCisJCQkJIGRvdWJsZSAqLCBjaGFyICopKTsKKworI2VuZGlmCS8qIGRlZmluZWQgKEZMT0FURk9STUFUX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZubWF0Y2guaCBiL2luY2x1ZGUvZm5tYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWI3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZubWF0Y2guaApAQCAtMCwwICsxLDcwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK05PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCitCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAcHJlcC5haS5taXQuZWR1LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZglfRk5NQVRDSF9ICisKKyNkZWZpbmUJX0ZOTUFUQ0hfSAkxCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKSB8fCAoZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fKQorI3VuZGVmCV9fUAorI2RlZmluZQlfX1AoYXJncykJYXJncworI2Vsc2UgLyogTm90IEMrKyBvciBBTlNJIEMuICAqLworI3VuZGVmCV9fUAorI2RlZmluZQlfX1AoYXJncykJKCkKKy8qIFdlIGNhbiBnZXQgYXdheSB3aXRob3V0IGRlZmluaW5nIGBjb25zdCcgaGVyZSBvbmx5IGJlY2F1c2UgaW4gdGhpcyBmaWxlCisgICBpdCBpcyB1c2VkIG9ubHkgaW5zaWRlIHRoZSBwcm90b3R5cGUgZm9yIGBmbm1hdGNoJywgd2hpY2ggaXMgZWxpZGVkIGluCisgICBub24tQU5TSSBDIHdoZXJlIGBjb25zdCcgaXMgcHJvYmxlbWF0aWNhbC4gICovCisjZW5kaWYgLyogQysrIG9yIEFOU0kgQy4gICovCisKKworLyogV2UgI3VuZGVmIHRoZXNlIGJlZm9yZSBkZWZpbmluZyB0aGVtIGJlY2F1c2Ugc29tZSBsb3Npbmcgc3lzdGVtcworICAgKEhQLVVYIEEuMDguMDcgZm9yIGV4YW1wbGUpIGRlZmluZSB0aGVzZSBpbiA8dW5pc3RkLmg+LiAgKi8KKyN1bmRlZglGTk1fUEFUSE5BTUUKKyN1bmRlZglGTk1fTk9FU0NBUEUKKyN1bmRlZglGTk1fUEVSSU9ECisKKy8qIEJpdHMgc2V0IGluIHRoZSBGTEFHUyBhcmd1bWVudCB0byBgZm5tYXRjaCcuICAqLworI2RlZmluZQlGTk1fUEFUSE5BTUUJKDEgPDwgMCkgLyogTm8gd2lsZGNhcmQgY2FuIGV2ZXIgbWF0Y2ggYC8nLiAgKi8KKyNkZWZpbmUJRk5NX05PRVNDQVBFCSgxIDw8IDEpIC8qIEJhY2tzbGFzaGVzIGRvbid0IHF1b3RlIHNwZWNpYWwgY2hhcnMuICAqLworI2RlZmluZQlGTk1fUEVSSU9ECSgxIDw8IDIpIC8qIExlYWRpbmcgYC4nIGlzIG1hdGNoZWQgb25seSBleHBsaWNpdGx5LiAgKi8KKworI2lmICFkZWZpbmVkIChfUE9TSVhfQ19TT1VSQ0UpIHx8IF9QT1NJWF9DX1NPVVJDRSA8IDIgfHwgZGVmaW5lZCAoX0dOVV9TT1VSQ0UpCisjZGVmaW5lCUZOTV9GSUxFX05BTUUJRk5NX1BBVEhOQU1FIC8qIFByZWZlcnJlZCBHTlUgbmFtZS4gICovCisjZGVmaW5lCUZOTV9MRUFESU5HX0RJUgkoMSA8PCAzKSAvKiBJZ25vcmUgYC8uLi4nIGFmdGVyIGEgbWF0Y2guICAqLworI2RlZmluZQlGTk1fQ0FTRUZPTEQJKDEgPDwgNCkgLyogQ29tcGFyZSB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLiAgKi8KKyNlbmRpZgorCisvKiBWYWx1ZSByZXR1cm5lZCBieSBgZm5tYXRjaCcgaWYgU1RSSU5HIGRvZXMgbm90IG1hdGNoIFBBVFRFUk4uICAqLworI2RlZmluZQlGTk1fTk9NQVRDSAkxCisKKy8qIE1hdGNoIFNUUklORyBhZ2FpbnN0IHRoZSBmaWxlbmFtZSBwYXR0ZXJuIFBBVFRFUk4sCisgICByZXR1cm5pbmcgemVybyBpZiBpdCBtYXRjaGVzLCBGTk1fTk9NQVRDSCBpZiBub3QuICAqLworZXh0ZXJuIGludCBmbm1hdGNoIF9fUCAoKGNvbnN0IGNoYXIgKl9fcGF0dGVybiwgY29uc3QgY2hhciAqX19zdHJpbmcsCisJCQkgaW50IF9fZmxhZ3MpKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGZubWF0Y2guaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mb3Blbi1iaW4uaCBiL2luY2x1ZGUvZm9wZW4tYmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2OGY2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZm9wZW4tYmluLmgKQEAgLTAsMCArMSwyNyBAQAorLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKKworCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KKworICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAiYmluYXJ5IiBzeXN0ZW1zLCB3aGVyZSB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlCisgICBkaWZmZXJlbnQuICBBbiBleGFtcGxlIGlzIE1lc3MtRG9zZS4gIE1hbnkgVW5peCBzeXN0ZW1zIGNvdWxkIGFsc28KKyAgIGNvcGUgd2l0aCBhICJiIiBpbiB0aGUgc3RyaW5nLCBpbmRpY2F0aW5nIGJpbmFyeSBmaWxlcywgYnV0IHNvbWUgcmVqZWN0IHRoaXMKKyAgIChhbmQgdGhlcmVieSBkb24ndCBjb25mb3JtIHRvIEFOU0kgQywgYnV0IHdoYXQgZWxzZSBpcyBuZXc/KS4KKworICAgVGhpcyBmaWxlIGlzIGRlc2lnbmVkIGZvciBpbmNsdXNpb24gYnkgaG9zdC1kZXBlbmRlbnQgLmggZmlsZXMuICBObworICAgdXNlciBhcHBsaWNhdGlvbiBzaG91bGQgaW5jbHVkZSBpdCBkaXJlY3RseSwgc2luY2UgdGhhdCB3b3VsZCBtYWtlCisgICB0aGUgYXBwbGljYXRpb24gdW5hYmxlIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGJvdGggInNhbWUiIGFuZCAiYmluYXJ5IgorICAgdmFyaWFudCBzeXN0ZW1zLiAgKi8KKworI2RlZmluZSBGT1BFTl9SQgkicmIiCisjZGVmaW5lIEZPUEVOX1dCIAkid2IiCisjZGVmaW5lIEZPUEVOX0FCIAkiYWIiCisjZGVmaW5lIEZPUEVOX1JVQiAJInIrYiIKKyNkZWZpbmUgRk9QRU5fV1VCIAkidytiIgorI2RlZmluZSBGT1BFTl9BVUIgCSJhK2IiCisKKyNkZWZpbmUgRk9QRU5fUlQJInIiCisjZGVmaW5lIEZPUEVOX1dUIAkidyIKKyNkZWZpbmUgRk9QRU5fQVQgCSJhIgorI2RlZmluZSBGT1BFTl9SVVQgCSJyKyIKKyNkZWZpbmUgRk9QRU5fV1VUIAkidysiCisjZGVmaW5lIEZPUEVOX0FVVCAJImErIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mb3Blbi1zYW1lLmggYi9pbmNsdWRlL2ZvcGVuLXNhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM3NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mb3Blbi1zYW1lLmgKQEAgLTAsMCArMSwyNyBAQAorLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKKworCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KKworICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAic2FtZSIgc3lzdGVtcywgd2hlcmUgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZQorICAgdGhlIHNhbWUuICBBbiBleGFtcGxlIGlzIFVuaXguICBNYW55IFVuaXggc3lzdGVtcyBjb3VsZCBhbHNvIGFkZCBhCisgICAiYiIgdG8gdGhlIHN0cmluZywgaW5kaWNhdGluZyBiaW5hcnkgZmlsZXMsIGJ1dCBzb21lIHJlamVjdCB0aGlzCisgICAoYW5kIHRoZXJlYnkgZG9uJ3QgY29uZm9ybSB0byBBTlNJIEMsIGJ1dCB3aGF0IGVsc2UgaXMgbmV3PykuCisKKyAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW5jbHVzaW9uIGJ5IGhvc3QtZGVwZW5kZW50IC5oIGZpbGVzLiAgTm8KKyAgIHVzZXIgYXBwbGljYXRpb24gc2hvdWxkIGluY2x1ZGUgaXQgZGlyZWN0bHksIHNpbmNlIHRoYXQgd291bGQgbWFrZQorICAgdGhlIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIGZvciBib3RoICJzYW1lIiBhbmQgImJpbmFyeSIKKyAgIHZhcmlhbnQgc3lzdGVtcy4gICovCisKKyNkZWZpbmUgRk9QRU5fUkIJInIiCisjZGVmaW5lIEZPUEVOX1dCIAkidyIKKyNkZWZpbmUgRk9QRU5fQUIgCSJhIgorI2RlZmluZSBGT1BFTl9SVUIgCSJyKyIKKyNkZWZpbmUgRk9QRU5fV1VCIAkidysiCisjZGVmaW5lIEZPUEVOX0FVQiAJImErIgorCisjZGVmaW5lIEZPUEVOX1JUCSJyIgorI2RlZmluZSBGT1BFTl9XVCAJInciCisjZGVmaW5lIEZPUEVOX0FUIAkiYSIKKyNkZWZpbmUgRk9QRU5fUlVUIAkicisiCisjZGVmaW5lIEZPUEVOX1dVVCAJIncrIgorI2RlZmluZSBGT1BFTl9BVVQgCSJhKyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tdm1zLmggYi9pbmNsdWRlL2ZvcGVuLXZtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzZiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZvcGVuLXZtcy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIE1hY3JvcyBmb3IgdGhlICd0eXBlJyBwYXJ0IG9mIGFuIGZvcGVuLCBmcmVvcGVuIG9yIGZkb3Blbi4gCisKKwk8UmVhZHxXcml0ZT5bVXBkYXRlXTxCaW5hcnkgZmlsZXx0ZXh0IGZpbGU+CisKKyAgIFRoaXMgdmVyc2lvbiBpcyBmb3IgVk1TIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKKyAgIGRpZmZlcmVudC4KKyAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW5jbHVzaW9uIGJ5IGhvc3QtZGVwZW5kZW50IC5oIGZpbGVzLiAgTm8KKyAgIHVzZXIgYXBwbGljYXRpb24gc2hvdWxkIGluY2x1ZGUgaXQgZGlyZWN0bHksIHNpbmNlIHRoYXQgd291bGQgbWFrZQorICAgdGhlIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIGZvciBib3RoICJzYW1lIiBhbmQgImJpbmFyeSIKKyAgIHZhcmlhbnQgc3lzdGVtcy4gICovCisKKyNkZWZpbmUgRk9QRU5fUkIJInJiIiwicmZtPXZhciIKKyNkZWZpbmUgRk9QRU5fV0IgCSJ3YiIsInJmbT12YXIiCisjZGVmaW5lIEZPUEVOX0FCIAkiYWIiLCJyZm09dmFyIgorI2RlZmluZSBGT1BFTl9SVUIgCSJyK2IiLCJyZm09dmFyIgorI2RlZmluZSBGT1BFTl9XVUIgCSJ3K2IiLCJyZm09dmFyIgorI2RlZmluZSBGT1BFTl9BVUIgCSJhK2IiLCJyZm09dmFyIgorCisjZGVmaW5lIEZPUEVOX1JUCSJyIgorI2RlZmluZSBGT1BFTl9XVCAJInciCisjZGVmaW5lIEZPUEVOX0FUIAkiYSIKKyNkZWZpbmUgRk9QRU5fUlVUIAkicisiCisjZGVmaW5lIEZPUEVOX1dVVCAJIncrIgorI2RlZmluZSBGT1BFTl9BVVQgCSJhKyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2RibS5oIGIvaW5jbHVkZS9nZGJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViYzI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZ2RibS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEdOVSBEQk0gLSBEYXRhQmFzZSBNYW5hZ2VyIGluY2x1ZGUgZmlsZQorICAgQ29weXJpZ2h0IDE5ODksIDE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBQaGlsaXAgQS4gTmVsc29uLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBZb3UgbWF5IGNvbnRhY3QgdGhlIGF1dGhvciBieToKKyAgICAgICBlLW1haWw6ICBwaGlsQHd3dS5lZHUKKyAgICAgIHVzLW1haWw6ICBQaGlsaXAgQS4gTmVsc29uCisgICAgICAgICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBEZXBhcnRtZW50CisgICAgICAgICAgICAgICAgV2VzdGVybiBXYXNoaW5ndG9uIFVuaXZlcnNpdHkKKyAgICAgICAgICAgICAgICBCZWxsaW5naGFtLCBXQSA5ODIyNgorICAgICAgICBwaG9uZTogICgyMDYpIDY3Ni0zMDM1CisgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQYXJhbWV0ZXJzIHRvIGdkYm1fb3BlbiBmb3IgUkVBREVSUywgV1JJVEVSUywgYW5kIFdSSVRFUlMgd2hvCisgICBjYW4gY3JlYXRlIHRoZSBkYXRhYmFzZS4gKi8KKyNkZWZpbmUgIEdEQk1fUkVBREVSICAwCisjZGVmaW5lICBHREJNX1dSSVRFUiAgMQorI2RlZmluZSAgR0RCTV9XUkNSRUFUIDIKKyNkZWZpbmUgIEdEQk1fTkVXREIgICAzCisKKy8qIFBhcmFtZXRlcnMgdG8gZ2RibV9zdG9yZSBmb3Igc2ltcGxlIGluc2VydGlvbiBvciByZXBsYWNlbWVudC4gKi8KKyNkZWZpbmUgIEdEQk1fSU5TRVJUICAwCisjZGVmaW5lICBHREJNX1JFUExBQ0UgMQorCisKKy8qIFRoZSBkYXRhIGFuZCBrZXkgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpkcHRyOworCWludCAgIGRzaXplOworICAgICAgfSBkYXR1bTsKKworCisvKiBUaGUgZmlsZSBpbmZvcm1hdGlvbiBoZWFkZXIuIFRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zLiAqLwordHlwZWRlZiBzdHJ1Y3Qge2ludCBkdW1teVsxMF07fSAqR0RCTV9GSUxFOworCisKKy8qIFRoZXNlIGFyZSB0aGUgcm91dGluZXMhICovCisKK2V4dGVybiBHREJNX0ZJTEUgZ2RibV9vcGVuICgpOworCitleHRlcm4gdm9pZAkgZ2RibV9jbG9zZSAoKTsKKworZXh0ZXJuIGRhdHVtCSBnZGJtX2ZldGNoICgpOworCitleHRlcm4gaW50CSBnZGJtX3N0b3JlICgpOworCitleHRlcm4gaW50CSBnZGJtX2RlbGV0ZSAoKTsKKworZXh0ZXJuIGRhdHVtCSBnZGJtX2ZpcnN0a2V5ICgpOworCitleHRlcm4gZGF0dW0JIGdkYm1fbmV4dGtleSAoKTsKKworZXh0ZXJuIGludAkgZ2RibV9yZW9yZ2FuaXplICgpOworCisKKy8qIGdkYm0gc2VuZHMgYmFjayB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGluIHRoZSB2YXJpYWJsZSBnZGJtX2Vycm5vLiAqLwordHlwZWRlZiBlbnVtIHsJTk9fRVJST1IsCisJCU1BTExPQ19FUlJPUiwKKwkJQkxPQ0tfU0laRV9FUlJPUiwKKwkJRklMRV9PUEVOX0VSUk9SLAorCQlGSUxFX1dSSVRFX0VSUk9SLAorCQlGSUxFX1NFRUtfRVJST1IsCisJCUZJTEVfUkVBRF9FUlJPUiwKKwkJQkFEX01BR0lDX05VTUJFUiwKKwkJRU1QVFlfREFUQUJBU0UsCisJCUNBTlRfQkVfUkVBREVSLAorCSAgICAgICAgQ0FOVF9CRV9XUklURVIsCisJCVJFQURFUl9DQU5UX1JFQ09WRVIsCisJCVJFQURFUl9DQU5UX0RFTEVURSwKKwkJUkVBREVSX0NBTlRfU1RPUkUsCisJCVJFQURFUl9DQU5UX1JFT1JHQU5JWkUsCisJCVVOS05PV05fVVBEQVRFLAorCQlJVEVNX05PVF9GT1VORCwKKwkJUkVPUkdBTklaRV9GQUlMRUQsCisJCUNBTk5PVF9SRVBMQUNFfQorCWdkYm1fZXJyb3I7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dldG9wdC5oIGIvaW5jbHVkZS9nZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjMwNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9nZXRvcHQuaApAQCAtMCwwICsxLDEzMyBAQAorLyogRGVjbGFyYXRpb25zIGZvciBnZXRvcHQuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCisgICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVE9QVF9ICisjZGVmaW5lIF9HRVRPUFRfSCAxCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgorICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKKyAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgorICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKKyAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCisKK2V4dGVybiBjaGFyICpvcHRhcmc7CisKKy8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgorICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKKyAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCisKKyAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCisKKyAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQorICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgorCisgICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0CisgICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KKworZXh0ZXJuIGludCBvcHRpbmQ7CisKKy8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UgYGdldG9wdCcgcHJpbnRzCisgICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLworCitleHRlcm4gaW50IG9wdGVycjsKKworLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4gICovCisKK2V4dGVybiBpbnQgb3B0b3B0OworCisvKiBEZXNjcmliZSB0aGUgbG9uZy1uYW1lZCBvcHRpb25zIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGUgTE9OR19PUFRJT05TIGFyZ3VtZW50IHRvIGdldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKKyAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKKyAgIHplcm8uCisKKyAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6CisgICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKKyAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAorICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorCisgICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAorICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAorICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCisKKyAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KKyAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgb3B0YXJnJywgc2V0IHRoZQorICAgb3B0aW9uJ3MgYGZsYWcnIGZpZWxkIHRvIHplcm8gYW5kIGl0cyBgdmFsJyBmaWVsZCB0byBhIG5vbnplcm8KKyAgIHZhbHVlICh0aGUgZXF1aXZhbGVudCBzaW5nbGUtbGV0dGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGlmIHRoZXJlIGlzCisgICBvbmUpLiAgRm9yIGxvbmcgb3B0aW9ucyB0aGF0IGhhdmUgYSB6ZXJvIGBmbGFnJyBmaWVsZCwgYGdldG9wdCcKKyAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgdmFsJyBmaWVsZC4gICovCisKK3N0cnVjdCBvcHRpb24KK3sKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyAgY29uc3QgY2hhciAqbmFtZTsKKyNlbHNlCisgIGNoYXIgKm5hbWU7CisjZW5kaWYKKyAgLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKKyAgICAgdHlwZSBtaXNtYXRjaGVzIGluIGFsbCB0aGUgY29kZSB0aGF0IGFzc3VtZXMgaXQgaXMgYW4gaW50LiAgKi8KKyAgaW50IGhhc19hcmc7CisgIGludCAqZmxhZzsKKyAgaW50IHZhbDsKK307CisKKy8qIE5hbWVzIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBgaGFzX2FyZycgZmllbGQgb2YgYHN0cnVjdCBvcHRpb24nLiAgKi8KKworI2RlZmluZQlub19hcmd1bWVudAkJMAorI2RlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCisjZGVmaW5lIG9wdGlvbmFsX2FyZ3VtZW50CTIKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworI2lmZGVmIF9fR05VX0xJQlJBUllfXworLyogTWFueSBvdGhlciBsaWJyYXJpZXMgaGF2ZSBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQsIHdpdGgKKyAgIGRpZmZlcmVuY2VzIGluIHRoZSBjb25zdHMsIGluIHN0ZGxpYi5oLiAgVG8gYXZvaWQgY29tcGlsYXRpb24KKyAgIGVycm9ycywgb25seSBwcm90b3R5cGUgZ2V0b3B0IGZvciB0aGUgR05VIEMgbGlicmFyeS4gICovCitleHRlcm4gaW50IGdldG9wdCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMpOworI2Vsc2UgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLworZXh0ZXJuIGludCBnZXRvcHQgKCk7CisjZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCitleHRlcm4gaW50IGdldG9wdF9sb25nIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKnNob3J0b3B0cywKKwkJICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKK2V4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAorCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCisJCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKKworLyogSW50ZXJuYWwgb25seS4gIFVzZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiAgKi8KK2V4dGVybiBpbnQgX2dldG9wdF9pbnRlcm5hbCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAorCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCisJCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kLAorCQkJICAgICBpbnQgbG9uZ19vbmx5KTsKKyNlbHNlIC8qIG5vdCBfX1NURENfXyAqLworZXh0ZXJuIGludCBnZXRvcHQgKCk7CitleHRlcm4gaW50IGdldG9wdF9sb25nICgpOworZXh0ZXJuIGludCBnZXRvcHRfbG9uZ19vbmx5ICgpOworCitleHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKCk7CisjZW5kaWYgLyogX19TVERDX18gKi8KKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIGdldG9wdC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hwLXN5bXRhYi5oIGIvaW5jbHVkZS9ocC1zeW10YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmY1NjY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ocC1zeW10YWIuaApAQCAtMCwwICsxLDE4NzEgQEAKKy8qIERlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIGZvciByZWFkaW5nIGRlYnVnIHN5bWJvbHMgZnJvbSB0aGUKKyAgIG5hdGl2ZSBIUCBDIGNvbXBpbGVyLgorCisgICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAorICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgorCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBIUF9TWU1UQUJfSU5DTFVERUQKKyNkZWZpbmUgSFBfU1lNVEFCX0lOQ0xVREVECisKKy8qIEdlbmVyYWwgaW5mb3JtYXRpb246CisKKyAgIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhbmQgZGVzY3JpYmVzIG9ubHkgdGhlIGRhdGEgc3RydWN0dXJlcworICAgbmVjZXNzYXJ5IHRvIHJlYWQgZGVidWcgc3ltYm9scyBwcm9kdWNlZCBieSB0aGUgSFAgQyBjb21waWxlciwKKyAgIEhQIEFOU0kgQysrIGNvbXBpbGVyLCBhbmQgSFAgRk9SVFJBTiA5MCBjb21waWxlciB1c2luZyB0aGUKKyAgIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuICAKKyAgIChGb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1ZyBmb3JtYXQsIGZ0cCBocHV4LXN5bXRhYi5oIGZyb20KKyAgIGphZ3Vhci5jcy51dGFoLmVkdTovZGlzdCkuCisgICAKKyAgIEFkZGl0aW9uYWwgbm90ZXMgKFJpY2ggVGl0bGUpCisgICBUaGlzIGZpbGUgaXMgYSByZXZlcnNlLWVuZ2luZWVyZWQgdmVyc2lvbiBvZiBhIGZpbGUgY2FsbGVkCisgICAic3ltdGFiLmgiIHdoaWNoIGV4aXN0cyBpbnRlcm5hbCB0byBIUCdzIENvbXB1dGVyIExhbmd1YWdlcyBPcmdhbml6YXRpb24KKyAgIGluIC9DTE8vQ29tcG9uZW50cy9EREUvb2JqL3NvbS9zeW10YWIuaC4gQmVjYXVzZSBIUCdzIHZlcnNpb24gb2YKKyAgIHRoZSBmaWxlIGlzIGNvcHlyaWdodGVkIGFuZCBub3QgZGlzdHJpYnV0ZWQsIGl0IGlzIG5lY2Vzc2FyeSBmb3IKKyAgIEdEQiB0byB1c2UgdGhlIHJldmVyc2UtZW5naW5lZXJlZCB2ZXJzaW9uIHRoYXQgZm9sbG93cy4KKyAgIFdvcmsgd2FzIGRvbmUgYnkgQ3lnbnVzIHRvIHJldmVyc2UtZW5naW5lZXIgdGhlIEMgc3Vic2V0IG9mIHN5bXRhYi5oLgorICAgVGhlIFdEQiBwcm9qZWN0IGhhcyBleHRlbmRlZCB0aGlzIHRvIGFsc28gY29udGFpbiB0aGUgQysrIAorICAgc3ltYm9sIGRlZmluaXRpb25zLCB0aGUgRjkwIHN5bWJvbCBkZWZpbml0aW9ucywgCisgICBhbmQgdGhlIERPQyAoZGVidWdnaW5nLW9wdGltaXplZC1jb2RlKSBzeW1ib2wgZGVmaW5pdGlvbnMuCisgICBJbiBzb21lIGNhc2VzICh0aGUgQysrIHN5bWJvbCBkZWZpbml0aW9ucykKKyAgIEkgaGF2ZSBhZGRlZCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGhlcmUgdGhhdAorICAgZ29lcyBiZXlvbmQgd2hhdCBpcyBzdXBwbGllZCBpbiBIUCdzIHN5bXRhYi5oLiBJZiB3ZSBzb21lZGF5CisgICB1bmlmeSB0aGVzZSBmaWxlcyBhZ2FpbiwgdGhlIGV4dHJhIGNvbW1lbnRzIHNob3VsZCBiZSBtZXJnZWQgYmFjaworICAgaW50byBIUCdzIHN5bXRhYi5oLgorICAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgRGVidWcgc3ltYm9scyBhcmUgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiBhbiB1bmxvYWRhYmxlIHNwYWNlIGNhbGxlZAorICAgJERFQlVHJC4gICRERUJVRyQgY29udGFpbnMgc2V2ZXJhbCBzdWJzcGFjZXMgd2hpY2ggZ3JvdXAgcmVsYXRlZAorICAgZGVidWcgc3ltYm9scy4KKworICAgJEdOVFQkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgdmFyaWFibGVzLCB0eXBlcyBhbmQgY29udGFudHMuCisKKyAgICRMTlRUJCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgcHJvY2VkdXJlcyAoaW5jbHVkaW5nIG5lc3RpbmcpLCBzY29waW5nCisgICBpbmZvcm1hdGlvbiwgbG9jYWwgdmFyaWFibGVzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KKworICAgJFNMVCQgY29udGFpbnMgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gc28gdGhhdCBjb2RlIGFkZHJlc3NlcyBtYXkgYmUKKyAgIG1hcHBlZCB0byBzb3VyY2UgbGluZXMuCisKKyAgICRWVCQgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIGFuZCBjb25zdGFudHMgZm9yIG5hbWVkIG9iamVjdHMgKHZhcmlhYmxlcywKKyAgIHR5cGVkZWZzLCBmdW5jdGlvbnMsIGV0YykuICBTdHJpbmdzIGFyZSBzdG9yZWQgYXMgbnVsbC10ZXJtaW5hdGVkIGNoYXJhY3RlcgorICAgbGlzdHMuICBDb25zdGFudHMgYWx3YXlzIGJlZ2luIG9uIHdvcmQgYm91bmRhcmllcy4gIFRoZSBmaXJzdCBieXRlIG9mCisgICB0aGUgVlQgbXVzdCBiZSB6ZXJvIChhIG51bGwgc3RyaW5nKS4KKworICAgJFhUJCBpcyBub3QgY3VycmVudGx5IHVzZWQgYnkgR0RCLgorCisgICBNYW55IHN0cnVjdHVyZXMgd2l0aGluIHRoZSBzdWJzcGFjZXMgcG9pbnQgdG8gb3RoZXIgc3RydWN0dXJlcyB3aXRoaW4KKyAgIHRoZSBzYW1lIHN1YnNwYWNlLCBvciB0byBzdHJ1Y3R1cmVzIHdpdGhpbiBhIGRpZmZlcmVudCBzdWJzcGFjZS4gIFRoZXNlCisgICBwb2ludGVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBzdHJ1Y3R1cmUgaW5kZXggZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisgICB0aGUgYXBwcm9wcmlhdGUgc3Vic3BhY2UuICAqLworCisvKiBVc2VkIHRvIGRlc2NyaWJlIHdoZXJlIGEgY29uc3RhbnQgaXMgc3RvcmVkLiAgKi8KK2VudW0gbG9jYXRpb25fdHlwZQoreworICBMT0NBVElPTl9JTU1FRElBVEUsCisgIExPQ0FUSU9OX1BUUiwKKyAgTE9DQVRJT05fVlQsCit9OworCisvKiBMYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZGVidWcgZm9ybWF0LiAgV2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZXMKKyAgIHRoaXMgdHlwZSBpcyBsaW1pdGVkIHRvIDQgYml0cyBmb3IgYSBtYXhpbXVtIG9mIDE2IGxhbmd1YWdlcy4gICovCitlbnVtIGhwX2xhbmd1YWdlCit7CisgIEhQX0xBTkdVQUdFX1VOS05PV04sCisgIEhQX0xBTkdVQUdFX0MsCisgIEhQX0xBTkdVQUdFX0Y3NywKKyAgSFBfTEFOR1VBR0VfUEFTQ0FMLAorICBIUF9MQU5HVUFHRV9NT0RDQUwsCisgIEhQX0xBTkdVQUdFX0NPQk9MLAorICBIUF9MQU5HVUFHRV9CQVNJQywKKyAgSFBfTEFOR1VBR0VfQURBLAorICBIUF9MQU5HVUFHRV9DUExVU1BMVVMsCisgIEhQX0xBTkdVQUdFX0RNUEFTQ0FMCit9OworCisKKy8qIEJhc2ljIGRhdGEgdHlwZXMgYXZhaWxhYmxlIGluIHRoaXMgZGVidWcgZm9ybWF0LiAgV2l0aGluIHRoZSBkYXRhCisgICBzdHJ1Y3R1cmVzIHRoaXMgdHlwZSBpcyBsaW1pdGVkIHRvIDUgYml0cyBmb3IgYSBtYXhpbXVtIG9mIDMyIGJhc2ljCisgICBkYXRhIHR5cGVzLiAgKi8KK2VudW0gaHBfdHlwZQoreworICBIUF9UWVBFX1VOREVGSU5FRCwgLyogMCAqLworICBIUF9UWVBFX0JPT0xFQU4sIC8qIDEgKi8KKyAgSFBfVFlQRV9DSEFSLCAvKiAyICovCisgIEhQX1RZUEVfSU5ULCAvKiAzICovCisgIEhQX1RZUEVfVU5TSUdORURfSU5ULCAvKiA0ICovCisgIEhQX1RZUEVfUkVBTCwgLyogNSAqLworICBIUF9UWVBFX0NPTVBMRVgsIC8qIDYgKi8KKyAgSFBfVFlQRV9TVFJJTkcyMDAsIC8qIDcgKi8KKyAgSFBfVFlQRV9MT05HU1RSSU5HMjAwLCAvKiA4ICovCisgIEhQX1RZUEVfVEVYVCwgLyogOSAqLworICBIUF9UWVBFX0ZMQUJFTCwgLyogMTAgKi8KKyAgSFBfVFlQRV9GVE5fU1RSSU5HX1NQRUMsIC8qIDExICovCisgIEhQX1RZUEVfTU9EX1NUUklOR19TUEVDLCAvKiAxMiAqLworICBIUF9UWVBFX1BBQ0tFRF9ERUNJTUFMLCAvKiAxMyAqLworICBIUF9UWVBFX1JFQUxfMzAwMCwgLyogMTQgKi8KKyAgSFBfVFlQRV9NT0RfU1RSSU5HXzMwMDAsIC8qIDE1ICovCisgIEhQX1RZUEVfQU5ZUE9JTlRFUiwgLyogMTYgKi8KKyAgSFBfVFlQRV9HTE9CQUxfQU5ZUE9JTlRFUiwgLyogMTcgKi8KKyAgSFBfVFlQRV9MT0NBTF9BTllQT0lOVEVSLCAvKiAxOCAqLworICBIUF9UWVBFX0NPTVBMRVhTMzAwMCwgLyogMTkgKi8KKyAgSFBfVFlQRV9GVE5fU1RSSU5HX1MzMDBfQ09NUEFULCAvKiAyMCAqLyAKKyAgSFBfVFlQRV9GVE5fU1RSSU5HX1ZBWF9DT01QQVQsIC8qIDIxICovCisgIEhQX1RZUEVfQk9PTEVBTl9TMzAwX0NPTVBBVCwgLyogMjIgKi8KKyAgSFBfVFlQRV9CT09MRUFOX1ZBWF9DT01QQVQsIC8qIDIzICovCisgIEhQX1RZUEVfV0lERV9DSEFSLCAvKiAyNCAqLworICBIUF9UWVBFX0xPTkcsIC8qIDI1ICovCisgIEhQX1RZUEVfVU5TSUdORURfTE9ORywgLyogMjYgKi8KKyAgSFBfVFlQRV9ET1VCTEUsIC8qIDI3ICovCisgIEhQX1RZUEVfVEVNUExBVEVfQVJHLCAvKiAyOCAqLworICBIUF9UWVBFX1ZPSUQgLyogMjkgKi8KK307CisKKy8qIEFuIGltbWVkaWF0ZSBuYW1lIGFuZCB0eXBlIHRhYmxlIGVudHJ5LgorCisgICBleHRlbnNpb24gYW5kIGltbWVkaWF0ZSB3aWxsIGFsd2F5cyBiZSBvbmUuCisgICBnbG9iYWwgd2lsbCBhbHdheXMgYmUgemVyby4KKyAgIGhwX3R5cGUgaXMgdGhlIGJhc2ljIHR5cGUgdGhpcyBlbnRyeSBkZXNjcmliZXMuCisgICBiaXRsZW5ndGggaXMgdGhlIGxlbmd0aCBpbiBiaXRzIGZvciB0aGUgYmFzaWMgdHlwZS4gICovCitzdHJ1Y3QgZG50dHBfaW1tZWRpYXRlCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBpbW1lZGlhdGU6CTE7CisgIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOworICB1bnNpZ25lZCBpbnQgdHlwZTogCQk1OworICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOgkyNDsKK307CisKKy8qIEEgbm9uaW1tZWRpYXRlIG5hbWUgYW5kIHR5cGUgdGFibGUgZW50cnkuCisKKyAgIGV4dGVuc2lvbiB3aWxsIGFsd2F5cyBiZSBvbmUuCisgICBpbW1lZGlhdGUgd2lsbCBhbHdheXMgYmUgemVyby4KKyAgIGlmIGdsb2JhbCBpcyB6ZXJvLCB0aGlzIGVudHJ5IHBvaW50cyBpbnRvIHRoZSBMTlRUCisgICBpZiBnbG9iYWwgaXMgb25lLCB0aGlzIGVudHJ5IHBvaW50cyBpbnRvIHRoZSBHTlRUCisgICBpbmRleCBpcyB0aGUgaW5kZXggd2l0aGluIHRoZSBHTlRUIG9yIExOVFQgZm9yIHRoaXMgZW50cnkuICAqLworc3RydWN0IGRudHRwX25vbmltbWVkaWF0ZQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlOgkxOworICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKKyAgdW5zaWduZWQgaW50IGluZGV4OgkJMjk7Cit9OworCisvKiBBIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIEdOVFQgYW5kIExOVFQgdGFibGVzLiAgSXQgaGFzIHR3bworICAgZm9ybXMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIGJlaW5nIGRlc2NyaWJlZC4KKworICAgVGhlIGltbWVkaWF0ZSBmb3JtIGlzIHVzZWQgZm9yIHNpbXBsZSBlbnRyaWVzIGFuZCBpcyBvbmUKKyAgIHdvcmQuCisKKyAgIFRoZSBub25pbW1lZGlhdGUgZm9ybSBpcyB1c2VkIGZvciBjb21wbGV4IGVudHJpZXMgYW5kIGNvbnRhaW5zCisgICBhbiBpbmRleCBpbnRvIHRoZSBMTlRUIG9yIEdOVFQgd2hpY2ggZGVzY3JpYmVzIHRoZSBlbnRpcmUgdHlwZS4KKworICAgSWYgYSBkbnR0cG9pbnRlciBpcyAtMSwgdGhlbiBpdCBpcyBhIE5JTCBlbnRyeS4gICovCisKKyNkZWZpbmUgRE5UVE5JTCAoLTEpCit0eXBlZGVmIHVuaW9uIGRudHRwb2ludGVyCit7CisgIHN0cnVjdCBkbnR0cF9pbW1lZGlhdGUgICAgZG50dGk7CisgIHN0cnVjdCBkbnR0cF9ub25pbW1lZGlhdGUgZG50dHA7CisgIGludCB3b3JkOworfSBkbnR0cG9pbnRlcjsKKworLyogQW4gaW5kZXggaW50byB0aGUgc291cmNlIGxpbmUgdGFibGUuICBBcyB3aXRoIGRudHRwb2ludGVycywgYSBzbHRwb2ludGVyCisgICBvZiAtMSBpbmRpY2F0ZXMgYSBOSUwgZW50cnkuICAqLworI2RlZmluZSBTTFROSUwgKC0xKQordHlwZWRlZiBpbnQgc2x0cG9pbnRlcjsKKworLyogSW5kZXggaW50byBET0MgKD0gIkRlYnVnZ2luZyBPcHRpbWl6ZWQgQ29kZSIpIGxpbmUgdGFibGUgKi8KKyNkZWZpbmUgTFROSUwgKC0xKQordHlwZWRlZiBpbnQgbHRwb2ludGVyOworCisvKiBJbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KKyNkZWZpbmUgQ1RYVE5JTCAoLTEpCit0eXBlZGVmIGludCBjdHh0cG9pbnRlcjsKKworLyogVW5zaWduZWQgYnl0ZSBvZmZzZXQgaW50byB0aGUgVlQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdnRwb2ludGVyOworCisvKiBBIEROVFQgZW50cnkgKHVzZWQgd2l0aGluIHRoZSBHTlRUIGFuZCBMTlRUKS4KKworICAgRE5UVCBlbnRyaWVzIGFyZSB2YXJpYWJsZSBzaXplZCBvYmplY3RzLCBidXQgYXJlIGFsd2F5cyBhIG11bHRpcGxlCisgICBvZiAzIHdvcmRzICh3ZSBjYWxsIGVhY2ggZ3JvdXAgb2YgMyB3b3JkcyBhICJibG9jayIpLgorCisgICBUaGUgZmlyc3QgYml0IGluIGVhY2ggYmxvY2sgaXMgYW4gZXh0ZW5zaW9uIGJpdC4gIFRoaXMgYml0IGlzIHplcm8KKyAgIGZvciB0aGUgZmlyc3QgYmxvY2sgb2YgYSBETlRUIGVudHJ5LiAgSWYgdGhlIGVudHJ5IHJlcXVpcmVzIG1vcmUKKyAgIHRoYW4gb25lIGJsb2NrLCB0aGVuIHRoaXMgYml0IGlzIHNldCB0byBvbmUgaW4gYWxsIGJsb2NrcyBhZnRlcgorICAgdGhlIGZpcnN0IG9uZS4gICovCisKKy8qIEVhY2ggRE5UVCBlbnRyeSBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIGRlYnVnIHN5bWJvbCAoYmVnaW5uaW5nIG9mCisgICBhIHNvdXJjZSBmaWxlLCBhIGZ1bmN0aW9uLCB2YXJpYWJsZXMsIHN0cnVjdHVyZXMsIGV0Yy4KKworICAgVGhlIHR5cGUgb2YgdGhlIEROVFQgZW50cnkgaXMgc3RvcmVkIGluIHRoZSAia2luZCIgZmllbGQgd2l0aGluIHRoZQorICAgRE5UVCBlbnRyeSBpdHNlbGYuICAqLworCitlbnVtIGRudHRfZW50cnlfdHlwZQoreworICBETlRUX1RZUEVfTklMID0gLTEsCisgIEROVFRfVFlQRV9TUkNGSUxFLAorICBETlRUX1RZUEVfTU9EVUxFLAorICBETlRUX1RZUEVfRlVOQ1RJT04sCisgIEROVFRfVFlQRV9FTlRSWSwKKyAgRE5UVF9UWVBFX0JFR0lOLAorICBETlRUX1RZUEVfRU5ELAorICBETlRUX1RZUEVfSU1QT1JULAorICBETlRUX1RZUEVfTEFCRUwsCisgIEROVFRfVFlQRV9GUEFSQU0sCisgIEROVFRfVFlQRV9TVkFSLAorICBETlRUX1RZUEVfRFZBUiwKKyAgRE5UVF9UWVBFX0hPTEUxLAorICBETlRUX1RZUEVfQ09OU1QsCisgIEROVFRfVFlQRV9UWVBFREVGLAorICBETlRUX1RZUEVfVEFHREVGLAorICBETlRUX1RZUEVfUE9JTlRFUiwKKyAgRE5UVF9UWVBFX0VOVU0sCisgIEROVFRfVFlQRV9NRU1FTlVNLAorICBETlRUX1RZUEVfU0VULAorICBETlRUX1RZUEVfU1VCUkFOR0UsCisgIEROVFRfVFlQRV9BUlJBWSwKKyAgRE5UVF9UWVBFX1NUUlVDVCwKKyAgRE5UVF9UWVBFX1VOSU9OLAorICBETlRUX1RZUEVfRklFTEQsCisgIEROVFRfVFlQRV9WQVJJQU5ULAorICBETlRUX1RZUEVfRklMRSwKKyAgRE5UVF9UWVBFX0ZVTkNUWVBFLAorICBETlRUX1RZUEVfV0lUSCwKKyAgRE5UVF9UWVBFX0NPTU1PTiwKKyAgRE5UVF9UWVBFX0NPQlNUUlVDVCwKKyAgRE5UVF9UWVBFX1hSRUYsCisgIEROVFRfVFlQRV9TQSwKKyAgRE5UVF9UWVBFX01BQ1JPLAorICBETlRUX1RZUEVfQkxPQ0tEQVRBLAorICBETlRUX1RZUEVfQ0xBU1NfU0NPUEUsCisgIEROVFRfVFlQRV9SRUZFUkVOQ0UsCisgIEROVFRfVFlQRV9QVFJNRU0sCisgIEROVFRfVFlQRV9QVFJNRU1GVU5DLAorICBETlRUX1RZUEVfQ0xBU1MsCisgIEROVFRfVFlQRV9HRU5GSUVMRCwKKyAgRE5UVF9UWVBFX1ZGVU5DLAorICBETlRUX1RZUEVfTUVNQUNDRVNTLAorICBETlRUX1RZUEVfSU5IRVJJVEFOQ0UsCisgIEROVFRfVFlQRV9GUklFTkRfQ0xBU1MsCisgIEROVFRfVFlQRV9GUklFTkRfRlVOQywKKyAgRE5UVF9UWVBFX01PRElGSUVSLAorICBETlRUX1RZUEVfT0JKRUNUX0lELAorICBETlRUX1RZUEVfTUVNRlVOQywKKyAgRE5UVF9UWVBFX1RFTVBMQVRFLAorICBETlRUX1RZUEVfVEVNUExBVEVfQVJHLAorICBETlRUX1RZUEVfRlVOQ19URU1QTEFURSwKKyAgRE5UVF9UWVBFX0xJTkssCisgIEROVFRfVFlQRV9EWU5fQVJSQVlfREVTQywKKyAgRE5UVF9UWVBFX0RFU0NfU1VCUkFOR0UsCisgIEROVFRfVFlQRV9CRUdJTl9FWFQsCisgIEROVFRfVFlQRV9JTkxOLAorICBETlRUX1RZUEVfSU5MTl9MSVNULAorICBETlRUX1RZUEVfQUxJQVMsCisgIEROVFRfVFlQRV9ET0NfRlVOQ1RJT04sCisgIEROVFRfVFlQRV9ET0NfTUVNRlVOQywKKyAgRE5UVF9UWVBFX01BWAorfTsKKworLyogRE5UVF9UWVBFX1NSQ0ZJTEU6CisKKyAgIE9uZSBETlRUX1RZUEVfU1JDRklMRSBzeW1ib2wgaXMgb3V0cHV0IGZvciB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UKKyAgIGZpbGUgYW5kIGF0IHRoZSBiZWdpbiBhbmQgZW5kIG9mIGFuIGluY2x1ZGVkIGZpbGUuICBBIEROVFRfVFlQRV9TUkNGSUxFCisgICBlbnRyeSBpcyBhbHNvIG91dHB1dCBiZWZvcmUgZWFjaCBETlRUX1RZUEVfRlVOQyBzeW1ib2wgc28gdGhhdCBkZWJ1Z2dlcnMKKyAgIGNhbiBkZXRlcm1pbmUgd2hhdCBmaWxlIGEgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4uCisKKyAgIExBTkdVQUdFIGRlc2NyaWJlcyB0aGUgc291cmNlIGZpbGUncyBsYW5ndWFnZS4KKworICAgTkFNRSBwb2ludHMgdG8gYW4gVlQgZW50cnkgcHJvdmlkaW5nIHRoZSBzb3VyY2UgZmlsZSdzIG5hbWUuCisKKyAgIE5vdGUgdGhlIG5hbWUgdXNlZCBmb3IgRE5UVF9UWVBFX1NSQ0ZJTEUgZW50cmllcyBhcmUgZXhhY3RseSBhcyBzZWVuCisgICBieSB0aGUgY29tcGlsZXIgKGllIHRoZXkgbWF5IGJlIHJlbGF0aXZlIG9yIGFic29sdXRlKS4gIEMgaW5jbHVkZSBmaWxlcworICAgdmlhIDw+IGluY2x1c2lvbiBtdXN0IHVzZSBhYnNvbHV0ZSBwYXRocy4KKworICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCisgICBtYXkgYmUgZGV0ZXJtaW5lZC4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfc3JjZmlsZQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAgICAvKiBETlRUX1RZUEVfU1JDRklMRSAqLworICB1bnNpZ25lZCBpbnQgbGFuZ3VhZ2U6CTQ7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKKyAgdnRwb2ludGVyIG5hbWU7CisgIHNsdHBvaW50ZXIgYWRkcmVzczsKK307CisKKy8qIEROVFRfVFlQRV9NT0RVTEU6CisKKyAgIEEgRE5UVF9UWVBFX01PRFVMRSBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgdGhlIHN0YXJ0IG9mIGEgcGFzY2FsCisgICBtb2R1bGUgb3IgQyBzb3VyY2UgZmlsZS4gQSBtb2R1bGUgaW5kaWNhdGVzIGEgY29tcGlsYXRpb24gdW5pdAorICAgZm9yIG5hbWUtc2NvcGluZyBwdXJwb3NlczsgaW4gdGhhdCByZWdhcmQgdGhlcmUgc2hvdWxkIGJlIAorICAgYSAxLTEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBHREIgInN5bXRhYiIncyBhbmQgTU9EVUxFIHN5bWJvbCByZWNvcmRzLgorCisgICBFYWNoIEROVFRfVFlQRV9NT0RVTEUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgRE5UVF9UWVBFX0VORCBzeW1ib2wuCisKKyAgIE5BTUUgcG9pbnRzIHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIHRoZSBtb2R1bGUncyBuYW1lLiAgTm90ZSBDCisgICBzb3VyY2UgZmlsZXMgYXJlIGNvbnNpZGVyZWQgbmFtZWxlc3MgbW9kdWxlcy4KKworICAgQUxJQVMgcG9pbnQgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgYSBzZWNvbmRhcnkgbmFtZS4KKworICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCisgICBtYXkgYmUgZGV0ZXJtaW5lZC4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfbW9kdWxlCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkJMTA7IAkvKiBETlRUX1RZUEVfTU9EVUxFICovCisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKKyAgdnRwb2ludGVyIG5hbWU7CisgIHZ0cG9pbnRlciBhbGlhczsKKyAgZG50dHBvaW50ZXIgdW51c2VkMjsKKyAgc2x0cG9pbnRlciBhZGRyZXNzOworfTsKKworLyogRE5UVF9UWVBFX0ZVTkNUSU9OLAorICAgRE5UVF9UWVBFX0VOVFJZLAorICAgRE5UVF9UWVBFX0JMT0NLREFUQSwKKyAgIEROVFRfVFlQRV9NRU1GVU5DOgorCisgICBBIEROVFRfVFlQRV9GVU5DVElPTiBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uOworICAgYSBETlRUX1RZUEVfRU5UUlkgc3ltYm9scyBpcyB1c2VkIGZvciBzZWNvbmRhcnkgZW50cnkgcG9pbnRzLiAgQm90aAorICAgc3ltYm9scyB1c2VkIHRoZSBkbnR0X3R5cGVfZnVuY3Rpb24gc3RydWN0dXJlLgorICAgQSBETlRUX1RZUEVfQkxPQ0tEQVRBIHN5bWJvbCBpcyBlbWl0dGVkIC4uLj8KKyAgIEEgRE5UVF9UWVBFX01FTUZVTkMgc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIGlubGluZWQgbWVtYmVyIGZ1bmN0aW9ucyAoQysrKS4gCisKKyAgIEVhY2ggb2YgRE5UVF9UWVBFX0ZVTkNUSU9OIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQuCisKKyAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSBmdW5jdGlvbiBoYXMgZ2xvYmFsIHNjb3BlLgorCisgICBMQU5HVUFHRSBkZXNjcmliZXMgdGhlIGZ1bmN0aW9uJ3Mgc291cmNlIGxhbmd1YWdlLgorCisgICBPUFRfTEVWRUwgZGVzY3JpYmVzIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZAorICAgd2l0aC4KKworICAgVkFSQVJHUyBpcyBub256ZXJvIGlmIHRoZSBmdW5jdGlvbiB1c2VzIHZhcmFyZ3MuCisKKyAgIE5BTUUgcG9pbnRzIHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIHRoZSBmdW5jdGlvbidzIG5hbWUuCisKKyAgIEFMSUFTIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyBhIHNlY29uZGFyeSBuYW1lIGZvciB0aGUgZnVuY3Rpb24uCisKKyAgIEZJUlNUUEFSQU0gcG9pbnRzIHRvIGEgTE5UVCBlbnRyeSB3aGljaCBkZXNjcmliZXMgdGhlIHBhcmFtZXRlciBsaXN0LgorCisgICBBRERSRVNTIHBvaW50cyB0byBhbiBTTFQgZW50cnkgZnJvbSB3aGljaCBsaW5lIG51bWJlciBhbmQgY29kZSBsb2NhdGlvbnMKKyAgIG1heSBiZSBkZXRlcm1pbmVkLgorCisgICBFTlRSWUFERFIgaXMgdGhlIG1lbW9yeSBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdGhlIHRoZSBmdW5jdGlvbidzIGVudHJ5IHBvaW50CisKKyAgIFJFVFZBTCBwb2ludHMgdG8gYSBMTlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlLgorCisgICBMT1dBRERSIGlzIHRoZSBsb3dlc3QgbWVtb3J5IGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uCisKKyAgIEhJQUREUiBpcyB0aGUgaGlnaGVzdCBtZW1vcnkgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvbi4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfZnVuY3Rpb24KK3sKKyAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKKyAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsJLyogRE5UVF9UWVBFX0ZVTkNUSU9OLAorCQkJCSAgICAgICAgICAgRE5UVF9UWVBFX0VOVFJZLAorCQkJCQkgICBETlRUX1RZUEVfQkxPQ0tEQVRBCisJCQkJCSAgIG9yIEROVFRfVFlQRV9NRU1GVU5DICovCisgIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOworICB1bnNpZ25lZCBpbnQgbGFuZ3VhZ2U6CTQ7CisgIHVuc2lnbmVkIGludCBuZXN0X2xldmVsOgk1OworICB1bnNpZ25lZCBpbnQgb3B0X2xldmVsOgkyOworICB1bnNpZ25lZCBpbnQgdmFyYXJnczoJCTE7CisgIHVuc2lnbmVkIGludCBsYW5nX2luZm86CTQ7CisgIHVuc2lnbmVkIGludCBpbmxpbmVkOgkJMTsKKyAgdW5zaWduZWQgaW50IGxvY2FsYWxsb2M6CTE7CisgIHVuc2lnbmVkIGludCBleHBhbnNpb246CTE7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOworICB2dHBvaW50ZXIgbmFtZTsKKyAgdnRwb2ludGVyIGFsaWFzOworICBkbnR0cG9pbnRlciBmaXJzdHBhcmFtOworICBzbHRwb2ludGVyIGFkZHJlc3M7CisgIENPUkVfQUREUiBlbnRyeWFkZHI7CisgIGRudHRwb2ludGVyIHJldHZhbDsKKyAgQ09SRV9BRERSIGxvd2FkZHI7CisgIENPUkVfQUREUiBoaWFkZHI7Cit9OworCisvKiBETlRUX1RZUEVfQkVHSU46CisKKyAgIEEgRE5UVF9UWVBFX0JFR0lOIHN5bWJvbCBpcyBlbWl0dGVkIHRvIGJlZ2luIGEgbmV3IG5lc3RlZCBzY29wZS4KKyAgIEV2ZXJ5IEROVFRfVFlQRV9CRUdJTiBzeW1ib2wgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wuCisKKyAgIENMQVNTRkxBRyBpcyBub256ZXJvIGlmIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiBhIGMrKyBjbGFzcyBkZWZpbml0aW9uLgorCisgICBBRERSRVNTIHBvaW50cyB0byBhbiBTTFQgZW50cnkgZnJvbSB3aGljaCBsaW5lIG51bWJlciBhbmQgY29kZSBsb2NhdGlvbnMKKyAgIG1heSBiZSBkZXRlcm1pbmVkLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9iZWdpbgoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOworICB1bnNpZ25lZCBpbnQgY2xhc3NmbGFnOgkxOworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjA7CisgIHNsdHBvaW50ZXIgYWRkcmVzczsKK307CisKKy8qIEROVFRfVFlQRV9FTkQ6CisKKyAgIEEgRE5UVF9UWVBFX0VORCBzeW1ib2wgaXMgZW1pdHRlZCB3aGVuIGNsb3NpbmcgYSBzY29wZSBzdGFydGVkIGJ5CisgICBhIEROVFRfVFlQRV9NT0RVTEUsIEROVFRfVFlQRV9GVU5DVElPTiwgRE5UVF9UWVBFX1dJVEgsCisgICBETlRUX1RZUEVfQ09NTU9OLCBETlRUX1RZUEVfQkVHSU4sIGFuZCBETlRUX1RZUEVfQ0xBU1NfU0NPUEUgc3ltYm9scy4KKworICAgRU5ES0lORCBkZXNjcmliZXMgd2hhdCB0eXBlIG9mIHNjb3BlIHRoZSBETlRUX1RZUEVfRU5EIGlzIGNsb3NpbmcKKyAgIChvbmUgb2YgdGhlIGFib3ZlIDYga2luZHMpLgorCisgICBDTEFTU0ZMQUcgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBlbmQgb2YgYSBjKysgY2xhc3MgZGVmaW5pdGlvbi4KKworICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCisgICBtYXkgYmUgZGV0ZXJtaW5lZC4KKworICAgQkVHSU5TQ09QRSBwb2ludHMgdG8gdGhlIExOVFQgZW50cnkgd2hpY2ggb3BlbmVkIHRoZSBzY29wZS4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfZW5kCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CisgIHVuc2lnbmVkIGludCBlbmRraW5kOgkJMTA7CisgIHVuc2lnbmVkIGludCBjbGFzc2ZsYWc6CTE7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxMDsKKyAgc2x0cG9pbnRlciBhZGRyZXNzOworICBkbnR0cG9pbnRlciBiZWdpbnNjb3BlOworfTsKKworLyogRE5UVF9UWVBFX0lNUE9SVCBpcyB1bnVzZWQgYnkgR0RCLiAgKi8KKy8qIEROVFRfVFlQRV9MQUJFTCBpcyB1bnVzZWQgYnkgR0RCLiAgKi8KKworLyogRE5UVF9UWVBFX0ZQQVJBTToKKworICAgQSBETlRUX1RZUEVfRlBBUkFNIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBhIGZ1bmN0aW9uIGFyZ3VtZW50LiAgV2hlbgorICAgY2hhaW5lZCB0b2dldGhlciB0aGUgc3ltYm9scyByZXByZXNlbnQgYW4gYXJndW1lbnQgbGlzdCBmb3IgYSBmdW5jdGlvbi4KKworICAgUkVHUEFSQU0gaXMgbm9uemVybyBpZiB0aGlzIHBhcmFtZXRlciB3YXMgcGFzc2VkIGluIGEgcmVnaXN0ZXIuCisKKyAgIElORElSRUNUIGlzIG5vbnplcm8gaWYgdGhpcyBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIKKyAgIChwYXNzIGJ5IHJlZmVyZW5jZSBvciBwYXNzIGJ5IHZhbHVlIGZvciBsYXJnZSBpdGVtcykuCisKKyAgIExPTkdBRERSIGlzIG5vbnplcm8gaWYgdGhlIHBhcmFtZXRlciBpcyBhIDY0Yml0IHBvaW50ZXIuCisKKyAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgcGFyYW1ldGVyJ3MgbmFtZS4KKworICAgTE9DQVRJT04gZGVzY3JpYmVzIHdoZXJlIHRoZSBwYXJhbWV0ZXIgaXMgc3RvcmVkLiAgRGVwZW5kaW5nIG9uIHRoZQorICAgcGFyYW1ldGVyIHR5cGUgTE9DQVRJT04gY291bGQgYmUgYSByZWdpc3RlciBudW1iZXIsIG9yIGFuIG9mZnNldAorICAgZnJvbSB0aGUgc3RhY2sgcG9pbnRlci4KKworICAgVFlQRSBwb2ludHMgdG8gYSBOVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlci4KKworICAgTkVYVFBBUkFNIHBvaW50cyB0byB0aGUgTE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSBuZXh0IHBhcmFtZXRlci4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfZnBhcmFtCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CisgIHVuc2lnbmVkIGludCByZWdwYXJhbToJMTsKKyAgdW5zaWduZWQgaW50IGluZGlyZWN0OgkxOworICB1bnNpZ25lZCBpbnQgbG9uZ2FkZHI6CTE7CisgIHVuc2lnbmVkIGludCBjb3B5cGFyYW06CTE7CisgIHVuc2lnbmVkIGludCBkZmx0OgkJMTsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE2OworICB2dHBvaW50ZXIgbmFtZTsKKyAgaW50IGxvY2F0aW9uOworICBkbnR0cG9pbnRlciB0eXBlOworICBkbnR0cG9pbnRlciBuZXh0cGFyYW07CisgIGludCBtaXNjOworfTsKKworLyogRE5UVF9UWVBFX1NWQVI6CisKKyAgIEEgRE5UVF9UWVBFX1NWQVIgaXMgZW1pdHRlZCB0byBkZXNjcmliZSBhIHZhcmlhYmxlIGluIHN0YXRpYyBzdG9yYWdlLgorCisgICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaGFzIGdsb2JhbCBzY29wZS4KKworICAgSU5ESVJFQ1QgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdC4KKworICAgTE9OR0FERFIgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgaW4gbG9uZyBwb2ludGVyIHNwYWNlLgorCisgICBTVEFUSUNNRU0gaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYSBtZW1iZXIgb2YgYSBjbGFzcy4KKworICAgQV9VTklPTiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhbiBhbm9ueW1vdXMgdW5pb24gbWVtYmVyLgorCisgICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHZhcmlhYmxlJ3MgbmFtZS4KKworICAgTE9DQVRJT04gcHJvdmlkZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGZvciB0aGUgdmFyaWFibGUuCisKKyAgIFRZUEUgaXMgYSBwb2ludGVyIGludG8gZWl0aGVyIHRoZSBHTlRUIG9yIExOVFQgd2hpY2ggZGVzY3JpYmVzCisgICB0aGUgdHlwZSBvZiB0aGlzIHZhcmlhYmxlLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9zdmFyCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CisgIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOworICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6CTE7CisgIHVuc2lnbmVkIGludCBsb25nYWRkcjoJMTsKKyAgdW5zaWduZWQgaW50IHN0YXRpY21lbToJMTsKKyAgdW5zaWduZWQgaW50IGFfdW5pb246CQkxOworICB1bnNpZ25lZCBpbnQgdW51c2VkMTogICAgICAgICAxOworICB1bnNpZ25lZCBpbnQgdGhyZWFkX3NwZWNpZmljOiAxOworICB1bnNpZ25lZCBpbnQgdW51c2VkMjogICAgICAgICAxNDsKKyAgdnRwb2ludGVyIG5hbWU7CisgIENPUkVfQUREUiBsb2NhdGlvbjsKKyAgZG50dHBvaW50ZXIgdHlwZTsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgdW5zaWduZWQgaW50IGRpc3BsYWNlbWVudDsKK307CisKKy8qIEROVFRfVFlQRV9EVkFSOgorCisgICBBIEROVFRfVFlQRV9EVkFSIGlzIGVtaXR0ZWQgdG8gZGVzY3JpYmUgYXV0b21hdGljIHZhcmlhYmxlcyBhbmQgdmFyaWFibGVzCisgICBoZWxkIGluIHJlZ2lzdGVycy4KKworICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGhhcyBnbG9iYWwgc2NvcGUuCisKKyAgIElORElSRUNUIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3QuCisKKyAgIFJFR1ZBUiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBpbiBhIHJlZ2lzdGVyLgorCisgICBBX1VOSU9OIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGFuIGFub255bW91cyB1bmlvbiBtZW1iZXIuCisKKyAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgdmFyaWFibGUncyBuYW1lLgorCisgICBMT0NBVElPTiBwcm92aWRlcyB0aGUgbWVtb3J5IGFkZHJlc3Mgb3IgcmVnaXN0ZXIgbnVtYmVyIGZvciB0aGUgdmFyaWFibGUuCisKKyAgIFRZUEUgaXMgYSBwb2ludGVyIGludG8gZWl0aGVyIHRoZSBHTlRUIG9yIExOVFQgd2hpY2ggZGVzY3JpYmVzCisgICB0aGUgdHlwZSBvZiB0aGlzIHZhcmlhYmxlLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9kdmFyCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CisgIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOworICB1bnNpZ25lZCBpbnQgaW5kaXJlY3Q6CTE7CisgIHVuc2lnbmVkIGludCByZWd2YXI6CQkxOworICB1bnNpZ25lZCBpbnQgYV91bmlvbjoJCTE7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKKyAgdnRwb2ludGVyIG5hbWU7CisgIGludCBsb2NhdGlvbjsKKyAgZG50dHBvaW50ZXIgdHlwZTsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKK307CisKKy8qIEROVFRfVFlQRV9DT05TVDoKKworICAgQSBETlRUX1RZUEVfQ09OU1Qgc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIHByb2dyYW0gY29uc3RhbnRzLgorCisgICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgY29uc3RhbnQgaGFzIGdsb2JhbCBzY29wZS4KKworICAgSU5ESVJFQ1QgaXMgbm9uemVybyBpZiB0aGUgY29uc3RhbnQgaXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdC4KKworICAgTE9DQVRJT05fVFlQRSBkZXNjcmliZXMgd2hlcmUgdG8gZmluZCB0aGUgY29uc3RhbnQncyB2YWx1ZQorICAgKGluIHRoZSBWVCwgbWVtb3J5LCBvciBlbWJlZGRlZCBpbiBhbiBpbnN0cnVjdGlvbikuCisKKyAgIENMQVNTTUVNIGlzIG5vbnplcm8gaWYgdGhlIGNvbnN0YW50IGlzIGEgbWVtYmVyIG9mIGEgY2xhc3MuCisKKyAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgY29uc3RhbnQncyBuYW1lLgorCisgICBMT0NBVElPTiBwcm92aWRlcyB0aGUgbWVtb3J5IGFkZHJlc3MsIHJlZ2lzdGVyIG51bWJlciBvciBwb2ludGVyCisgICBpbnRvIHRoZSBWVCBmb3IgdGhlIGNvbnN0YW50J3MgdmFsdWUuCisKKyAgIFRZUEUgaXMgYSBwb2ludGVyIGludG8gZWl0aGVyIHRoZSBHTlRUIG9yIExOVFQgd2hpY2ggZGVzY3JpYmVzCisgICB0aGUgdHlwZSBvZiB0aGlzIHZhcmlhYmxlLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9jb25zdAoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOworICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKKyAgdW5zaWduZWQgaW50IGluZGlyZWN0OgkxOworICB1bnNpZ25lZCBpbnQ6CQkJMzsKKyAgdW5zaWduZWQgaW50IGNsYXNzbWVtOgkxOworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTU7CisgIHZ0cG9pbnRlciBuYW1lOworICBDT1JFX0FERFIgbG9jYXRpb247CisgIGRudHRwb2ludGVyIHR5cGU7CisgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgIHVuc2lnbmVkIGludCBkaXNwbGFjZW1lbnQ7Cit9OworCisvKiBETlRUX1RZUEVfVFlQRURFRiBhbmQgRE5UVF9UWVBFX1RBR0RFRjoKKworICAgVGhlIHNhbWUgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgdHlwZWRlZnMgYW5kIHRhZ2RlZnMuCisKKyAgIEROVFRfVFlQRV9UWVBFREVGUyBhcmUgYXNzb2NpYXRlZCB3aXRoIEMgInR5cGVkZWZzIi4KKworICAgRE5UVF9UWVBFX1RBR0RFRnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBDICJzdHJ1Y3QiLCAidW5pb24iLCBhbmQgImVudW0iCisgICB0YWdzLCB3aGljaCBtYXkgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGEgdHlwZWRlZiBpbiB0aGUgc2FtZSBzY29wZS4KKyAgIEFsc28gdGhleSBhcmUgYXNzb2NpYXRlZCB3aXRoIEMrKyAiY2xhc3MiIHRhZ3MsIHdoaWNoIGltcGxpY2l0bHkgaGF2ZSAKKyAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNsYXNzIHR5cGUuCisKKyAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSB0eXBlZGVmL3RhZ2RlZiBoYXMgZ2xvYmFsIHNjb3BlLgorCisgICBUWVBFSU5GTyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBmdWxsIHR5cGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisgICBmb3IgYSB0YWcuICAodXN1YWxseSAxLCBidXQgY2FuIGJlIHplcm8gZm9yIG9wYXF1ZSB0eXBlcyBpbiBDKS4KKworICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSBjb25zdGFudCdzIG5hbWUuCisKKyAgIFRZUEUgcG9pbnRzIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUgZm9yIHRoZSB0eXBlZGVmL3RhZ2RlZiBpbiB0aGUKKyAgIEdOVFQgb3IgTE5UVC4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfdHlwZQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAgICAvKiBETlRUX1RZUEVfVFlQRURFRiBvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEROVFRfVFlQRV9UQUdERUYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7CisgIHVuc2lnbmVkIGludCB0eXBlaW5mbzoJMTsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE5OworICB2dHBvaW50ZXIgbmFtZTsKKyAgZG50dHBvaW50ZXIgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8qIFVuZGVybHlpbmcgdHlwZSwgd2hpY2ggZm9yIFRBR0RFRidzIG1heSBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRE5UVF9UWVBFX1NUUlVDVCwgRE5UVF9UWVBFX1VOSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRE5UVF9UWVBFX0VOVU0sIG9yIEROVFRfVFlQRV9DTEFTUy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGb3IgVFlQRURFRidzIG90aGVyIHVuZGVybHlpbmcgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFyZSBhbHNvIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCisvKiBETlRUX1RZUEVfUE9JTlRFUjoKKworICAgVXNlZCB0byBkZXNjcmliZSBhIHBvaW50ZXIgdG8gYW4gdW5kZXJseWluZyB0eXBlLgorCisgICBQT0lOVFNUTyBpcyBhIHBvaW50ZXIgaW50byB0aGUgR05UVCBvciBMTlRUIGZvciB0aGUgdHlwZSB3aGljaCB0aGlzCisgICBwb2ludGVyIHBvaW50cyB0by4KKworICAgQklUTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBvaW50ZXIgKG5vdCB0aGUgdW5kZXJseWluZyB0eXBlKS4gKi8KKworc3RydWN0IGRudHRfdHlwZV9wb2ludGVyCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKKyAgZG50dHBvaW50ZXIgcG9pbnRzdG87CisgIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Cit9OworCisKKy8qIEROVFRfVFlQRV9FTlVNOgorCisgICBVc2VkIHRvIGRlc2NyaWJlIGVudW1lcmF0ZWQgdHlwZXMuCisKKyAgIEZJUlNUTUVNIGlzIGEgcG9pbnRlciB0byBhIEROVFRfVFlQRV9NRU1FTlVNIGluIHRoZSBHTlRUL0xOVFQgd2hpY2gKKyAgIGRlc2NyaWJlcyB0aGUgZmlyc3QgbWVtYmVyIChhbmQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBjaGFpbiBvZgorICAgbWVtYmVycykuCisKKyAgIEJJVExFTkdUSCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBob2xkIHRoZSB2YWx1ZXMgb2YgdGhlIGVudW0ncworICAgbWVtYmVycy4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfZW51bQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJMTA7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKKyAgZG50dHBvaW50ZXIgZmlyc3RtZW07CisgIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Cit9OworCisvKiBETlRUX1RZUEVfTUVNRU5VTQorCisgICBVc2VkIHRvIGRlc2NyaWJlIG1lbWJlcnMgb2YgYW4gZW51bWVyYXRlZCB0eXBlLgorCisgICBDTEFTU01FTSBpcyBub256ZXJvIGlmIHRoaXMgbWVtYmVyIGlzIHBhcnQgb2YgYSBjbGFzcy4KKworICAgTkFNRSBwb2ludHMgaW50byB0aGUgVlQgZm9yIHRoZSBuYW1lIG9mIHRoaXMgbWVtYmVyLgorCisgICBWQUxVRSBpcyB0aGUgdmFsdWUgb2YgdGhpcyBlbnVtZXJhdGlvbiBtZW1iZXIuCisKKyAgIE5FWFRNRU0gcG9pbnRzIHRvIHRoZSBuZXh0IEROVFRfVFlQRV9NRU1FTlVNIGluIHRoZSBjaGFpbi4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfbWVtZW51bQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJMTA7CisgIHVuc2lnbmVkIGludCBjbGFzc21lbToJMTsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIwOworICB2dHBvaW50ZXIgbmFtZTsKKyAgdW5zaWduZWQgaW50IHZhbHVlOworICBkbnR0cG9pbnRlciBuZXh0bWVtOworfTsKKworLyogRE5UVF9UWVBFX1NFVAorCisgICBVc2VkIHRvIGRlc2NyaWJlIFBBU0NBTCAic2V0IiB0eXBlLgorCisgICBERUNMQVJBVElPTiBkZXNjcmliZXMgdGhlIGJpdHBhY2tpbmcgb2YgdGhlIHNldC4KKworICAgU1VCVFlQRSBwb2ludHMgdG8gYSBETlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhlIG1lbWJlcnMuCisKKyAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgc2V0LiAgKi8gCisKK3N0cnVjdCBkbnR0X3R5cGVfc2V0Cit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkxMDsKKyAgdW5zaWduZWQgaW50IGRlY2xhcmF0aW9uOgkyOworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTk7CisgIGRudHRwb2ludGVyIHN1YnR5cGU7CisgIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Cit9OworCisvKiBETlRUX1RZUEVfU1VCUkFOR0UKKworICAgVXNlZCB0byBkZXNjcmliZSBzdWJyYW5nZSB0eXBlLgorCisgICBEWU5fTE9XIGRlc2NyaWJlcyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHN1YnJhbmdlOgorCisgICAgIDAwIGZvciBhIGNvbnN0YW50IGxvd2VyIGJvdW5kIChmb3VuZCBpbiBMT1dCT1VORCkuCisKKyAgICAgMDEgZm9yIGEgZHluYW1pYyBsb3dlciBib3VuZCB3aXRoIHRoZSBsb3dlciBib3VuZCBmb3VuZCBpbiB0aGUgdGhlCisgICAgIG1lbW9yeSBhZGRyZXNzIHBvaW50ZWQgdG8gYnkgTE9XQk9VTkQuCisKKyAgICAgMTAgZm9yIGEgZHluYW1pYyBsb3dlciBib3VuZCBkZXNjcmliZWQgYnkgYW4gdmFyaWFibGUgZm91bmQgaW4gdGhlCisgICAgIEROVFQvTE5UVCAoTE9XQk9VTkQgd291bGQgYmUgYSBwb2ludGVyIGludG8gdGhlIEROVFQvTE5UVCkuCisKKyAgIERZTl9ISUdIIGlzIHNpbWlsYXIgdG8gRFlOX0xPVywgZXhjZXB0IGl0IGRlc2NyaWJlcyB0aGUgdXBwZXIgYm91bmQuCisKKyAgIFNVQlRZUEUgcG9pbnRzIHRvIHRoZSB0eXBlIG9mIHRoZSBzdWJyYW5nZS4KKworICAgQklUTEVOR1RIIGlzIHRoZSBsZW5ndGggaW4gYml0cyBuZWVkZWQgdG8gZGVzY3JpYmUgdGhlIHN1YnJhbmdlJ3MKKyAgIHZhbHVlcy4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfc3VicmFuZ2UKK3sKKyAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKKyAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOworICB1bnNpZ25lZCBpbnQgZHluX2xvdzoJCTI7CisgIHVuc2lnbmVkIGludCBkeW5faGlnaDoJMjsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OworICBpbnQgbG93Ym91bmQ7CisgIGludCBoaWdoYm91bmQ7CisgIGRudHRwb2ludGVyIHN1YnR5cGU7CisgIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Cit9OworCisvKiBETlRUX1RZUEVfQVJSQVkKKworICAgVXNlZCB0byBkZXNjcmliZSBhbiBhcnJheSB0eXBlLgorCisgICBERUNMQVJBVElPTiBkZXNjcmliZXMgdGhlIGJpdCBwYWNraW5nIHVzZWQgaW4gdGhlIGFycmF5LgorCisgICBBUlJBWUlTQllURVMgaXMgbm9uemVybyBpZiB0aGUgZmllbGQgaW4gYXJyYXlsZW5ndGggZGVzY3JpYmVzIHRoZQorICAgbGVuZ3RoIGluIGJ5dGVzIHJhdGhlciB0aGFuIGluIGJpdHMuICBBIHZhbHVlIG9mIHplcm8gaXMgdXNlZCB0bworICAgZGVzY3JpYmUgYW4gYXJyYXkgd2l0aCBzaXplIDIqKjMyLgorCisgICBFTEVNSVNCWVRFUyBpcyBub256ZXJvIGlmIHRoZSBsZW5ndGggaWYgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheQorICAgaXMgZGVzY3JpYmVzIGluIGJ5dGVzIHJhdGhlciB0aGFuIGJpdHMuICBBIHZhbHVlIG9mIHplcm8gaXMgdXNlZAorICAgdG8gYW4gZWxlbWVudCB3aXRoIHNpemUgMioqMzIuCisKKyAgIEVMRU1PUkRFUiBpcyBub256ZXJvIGlmIHRoZSBlbGVtZW50cyBhcmUgaW5kZXhlZCBpbiBpbmNyZWFzaW5nIG9yZGVyLgorCisgICBKVVNUSUZJRUQgaWYgdGhlIGVsZW1lbnRzIGFyZSBsZWZ0IGp1c3RpZmllZCB0byBpbmRleCB6ZXJvLgorCisgICBBUlJBWUxFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KKworICAgSU5ERVhUWVBFIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSB0eXBlIHVzZWQgdG8gaW5kZXggdGhlIGFycmF5LgorCisgICBFTEVNVFlQRSBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgdHlwZSBmb3IgdGhlIGFycmF5IGVsZW1lbnRzLgorCisgICBFTEVNTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSAoaW5jbHVkaW5nCisgICBhbnkgcGFkZGluZykuCisKKyAgIE11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgcmVwcmVzZW50ZWQgYnkgRUxFTVRZUEUgcG9pbnRpbmcgdG8KKyAgIGFub3RoZXIgRE5UVF9UWVBFX0FSUkFZLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9hcnJheQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJMTA7CisgIHVuc2lnbmVkIGludCBkZWNsYXJhdGlvbjoJMjsKKyAgdW5zaWduZWQgaW50IGR5bl9sb3c6CQkyOworICB1bnNpZ25lZCBpbnQgZHluX2hpZ2g6CTI7CisgIHVuc2lnbmVkIGludCBhcnJheWlzYnl0ZXM6CTE7CisgIHVuc2lnbmVkIGludCBlbGVtaXNieXRlczoJMTsKKyAgdW5zaWduZWQgaW50IGVsZW1vcmRlcjoJMTsKKyAgdW5zaWduZWQgaW50IGp1c3RpZmllZDoJMTsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTExOworICB1bnNpZ25lZCBpbnQgYXJyYXlsZW5ndGg7CisgIGRudHRwb2ludGVyIGluZGV4dHlwZTsKKyAgZG50dHBvaW50ZXIgZWxlbXR5cGU7CisgIHVuc2lnbmVkIGludCBlbGVtbGVuZ3RoOworfTsKKworLyogRE5UVF9UWVBFX1NUUlVDVAorCisgICBETlRUX1RZUEVfU1RSVUNUIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBDIHN0cnVjdHVyZS4KKworICAgREVDTEFSQVRJT04gZGVzY3JpYmVzIHRoZSBiaXRwYWNraW5nIHVzZWQuCisKKyAgIEZJUlNURklFTEQgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgIChlYWNoIGZpZWxkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBmaWVsZCwgd2FsayB0aGUgbGlzdAorICAgdG8gYWNjZXNzIGFsbCBmaWVsZHMgb2YgdGhlIHN0cnVjdHVyZSkuCisKKyAgIFZBUlRBR0ZJRUxEIGFuZCBWQVJMSVNUIGFyZSB1c2VkIGZvciBQYXNjYWwgdmFyaWFudCByZWNvcmRzLgorCisgICBCSVRMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBiaXRzLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKKyAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOworICB1bnNpZ25lZCBpbnQgZGVjbGFyYXRpb246CTI7CisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOTsKKyAgZG50dHBvaW50ZXIgZmlyc3RmaWVsZDsKKyAgZG50dHBvaW50ZXIgdmFydGFnZmllbGQ7CisgIGRudHRwb2ludGVyIHZhcmxpc3Q7CisgIHVuc2lnbmVkIGludCBiaXRsZW5ndGg7Cit9OworCisvKiBETlRUX1RZUEVfVU5JT04KKworICAgRE5UVF9UWVBFX1VOSU9OIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBDIHVuaW9uLgorCisgICBGSVJTVEZJRUxEIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpZWxkIGNoYWluLgorCisgICBCSVRMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIHVuaW9uIGluIGJpdHMuICAqLworCitzdHJ1Y3QgZG50dF90eXBlX3VuaW9uCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOgkxMDsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOworICBkbnR0cG9pbnRlciBmaXJzdGZpZWxkOworICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOworfTsKKworLyogRE5UVF9UWVBFX0ZJRUxECisKKyAgIEROVFRfVFlQRV9GSUVMRCBkZXNjcmliZXMgb25lIGZpZWxkIGluIGEgc3RydWN0dXJlIG9yIHVuaW9uCisgICBvciBDKysgY2xhc3MuCisKKyAgIFZJU0lCSUxJVFkgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQKKyAgIChmb3IgYysrLiAgcHVibGljID0gMCwgcHJvdGVjdGVkID0gMSwgcHJpdmF0ZSA9IDIpLgorCisgICBBX1VOSU9OIGlzIG5vbnplcm8gaWYgdGhpcyBmaWVsZCBpcyBhIG1lbWJlciBvZiBhbiBhbm9ueW1vdXMgdW5pb24uCisKKyAgIFNUQVRJQ01FTSBpcyBub256ZXJvIGlmIHRoaXMgZmllbGQgaXMgYSBzdGF0aWMgbWVtYmVyIG9mIGEgdGVtcGxhdGUuCisKKyAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCisKKyAgIEJJVE9GRlNFVCBnaXZlcyB0aGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gYml0cyBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgIG9mIHRoZSBzdHJ1Y3R1cmUgb3IgdW5pb24gdGhpcyBmaWVsZCBpcyBhIG1lbWJlciBvZi4KKworICAgVFlQRSBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgdHlwZSBkZXNjcmliaW5nIHRoaXMgZmllbGQuCisKKyAgIEJJVExFTkdUSCBpcyB0aGUgc2l6ZSBvZiB0aGUgZW50cnkgaW4gYml0cy4KKworICAgTkVYVEZJRUxEIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBjaGFpbi4gICovCisKK3N0cnVjdCBkbnR0X3R5cGVfZmllbGQKK3sKKyAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKKyAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOworICB1bnNpZ25lZCBpbnQgdmlzaWJpbGl0eToJMjsKKyAgdW5zaWduZWQgaW50IGFfdW5pb246CQkxOworICB1bnNpZ25lZCBpbnQgc3RhdGljbWVtOgkxOworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7CisgIHZ0cG9pbnRlciBuYW1lOworICB1bnNpZ25lZCBpbnQgYml0b2Zmc2V0OworICBkbnR0cG9pbnRlciB0eXBlOworICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOworICBkbnR0cG9pbnRlciBuZXh0ZmllbGQ7Cit9OworCisvKiBETlRUX1RZUEVfVkFSSUFOVCBpcyB1bnVzZWQgYnkgR0RCLiAgKi8KKy8qIEROVFRfVFlQRV9GSUxFIGlzIHVudXNlZCBieSBHREIuICAqLworCisvKiBETlRUX1RZUEVfRlVOQ1RZUEUKKworICAgSSB0aGluayB0aGlzIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBmdW5jdGlvbiB0eXBlIChlLmcuLCB3b3VsZAorICAgYmUgZW1pdHRlZCBhcyBwYXJ0IG9mIGEgZnVuY3Rpb24tcG9pbnRlciBkZXNjcmlwdGlvbikuCisKKyAgIFZBUkFSR1MgaXMgbm9uemVybyBpZiB0aGlzIGZ1bmN0aW9uIHVzZXMgdmFyYXJncy4KKworICAgRklSU1RQQVJBTSBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHBhcmFtZXRlcgorICAgY2hhaW4uCisKKyAgIFJFVFZBTCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KKworc3RydWN0IGRudHRfdHlwZV9mdW5jdHlwZQoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOworICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOworICB1bnNpZ25lZCBpbnQgdmFyYXJnczoJCTE7CisgIHVuc2lnbmVkIGludCBpbmZvOgkJNDsKKyAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE2OworICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOworICBkbnR0cG9pbnRlciBmaXJzdHBhcmFtOworICBkbnR0cG9pbnRlciByZXR2YWw7Cit9OworCisvKiBETlRUX1RZUEVfV0lUSCBpcyBlbWl0dGVkIGJ5IEMrKyB0byBpbmRpY2F0ZSAid2l0aCIgc2NvcGluZyBzZW1hbnRpY3MuCisgICAoUHJvYmFibHkgYWxzbyBlbWl0dGVkIGJ5IFBBU0NBTCB0byBzdXBwb3J0ICJ3aXRoIi4uLikuCisgICAKKyAgIEMrKyBleGFtcGxlOiBTYXkgIm1lbWZ1bmMiIGlzIGEgbWV0aG9kIG9mIGNsYXNzICJjIiwgYW5kIHNheQorICAgIm0iIGlzIGEgZGF0YSBtZW1iZXIgb2YgY2xhc3MgImMiLiBUaGVuIGZyb20gd2l0aGluICJtZW1mdW5jIiwKKyAgIGl0IGlzIGxlZ2FsIHRvIHJlZmVyZW5jZSAibSIgZGlyZWN0bHkgKGUuZy4geW91IGRvbid0IGhhdmUgdG8KKyAgIHNheSAidGhpcy0+bSIuIFRoZSBzeW1ib2wgdGFibGUgaW5kaWNhdGVzCisgICB0aGlzIGJ5IGVtaXR0aW5nIGEgRE5UVF9UWVBFX1dJVEggc3ltYm9sIHdpdGhpbiB0aGUgZnVuY3Rpb24gIm1lbWZ1bmMiLAorICAgcG9pbnRpbmcgdG8gdGhlIHR5cGUgc3ltYm9sIGZvciBjbGFzcyAiYyIuCisgCisgICBJbiBHREIsIHRoaXMgc3ltYm9sIHJlY29yZCBpcyB1bm5lY2Vzc2FyeSwgCisgICBiZWNhdXNlIEdEQidzIHN5bWJvbCBsb29rdXAgYWxnb3JpdGhtCisgICBpbmZlcnMgdGhlICJ3aXRoIiBzZW1hbnRpY3Mgd2hlbiBpdCBzZWVzIGEgInRoaXMiIGFyZ3VtZW50IHRvIHRoZSBtZW1iZXIKKyAgIGZ1bmN0aW9uLiBTbyBHREIgY2FuIHNhZmVseSBpZ25vcmUgdGhlIEROVFRfVFlQRV9XSVRIIHJlY29yZC4KKworICAgQSBETlRUX1RZUEVfV0lUSCBoYXMgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbCAKKyAqLworCitzdHJ1Y3QgZG50dF90eXBlX3dpdGggeworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOyAgICAvKiBhbHdheXMgemVybyAqLworICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAgIC8qIGFsd2F5cyBETlRUX1RZUEVfV0lUSCAqLworICB1bnNpZ25lZCBpbnQgYWRkcnR5cGU6ICAJMjsgICAgLyogMCA9PiBTVEFUVFlQRSAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxID0+IERZTlRZUEUgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgPT4gUkVHVFlQRSAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGluZGlyZWN0OiAJMTsgICAgLyogMSA9PiBwb2ludGVyIHRvIG9iamVjdCAgICAgICAqLworICB1bnNpZ25lZCBpbnQgbG9uZ2FkZHI6ICAJMTsgICAgLyogMSA9PiBpbiBsb25nIHBvaW50ZXIgc3BhY2UgICAqLworICB1bnNpZ25lZCBpbnQgbmVzdGxldmVsOiAJNjsgICAgLyogIyBvZiBuZXN0aW5nIGxldmVscyBiYWNrICAgICAqLworICB1bnNpZ25lZCBpbnQgZG9jX3JhbmdlczogCTE7ICAgIC8qIDEgPT4gbG9jYXRpb24gaXMgcmFuZ2UgbGlzdCAgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDogICAJMTA7CisgIGxvbmcgbG9jYXRpb247ICAgICAgIAkJICAgICAgLyogd2hlcmUgc3RvcmVkIChhbGxvY2F0ZWQpICAgICAqLworICBzbHRwb2ludGVyIGFkZHJlc3M7CisgIGRudHRwb2ludGVyIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIHR5cGUgb2Ygd2l0aCBleHByZXNzaW9uICAgICAgKi8KKyAgdnRwb2ludGVyIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgLyogbmFtZSBvZiB3aXRoIGV4cHJlc3Npb24gICAgICAqLworICB1bnNpZ25lZCBsb25nICBvZmZzZXQ7ICAgICAgICAgICAgICAvKiBieXRlIG9mZnNldCBmcm9tIGxvY2F0aW9uICAgICovCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8qIEROVFRfVFlQRV9DT01NT04gaXMgdW5zdXBwb3J0ZWQgYnkgR0RCLiAgKi8KKy8qIEEgRE5UVF9UWVBFX0NPTU1PTiBzeW1ib2wgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wgKi8KKworLyogRE5UVF9UWVBFX0NPQlNUUlVDVCBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLworLyogRE5UVF9UWVBFX1hSRUYgaXMgdW5zdXBwb3J0ZWQgYnkgR0RCLiAgKi8KKy8qIEROVFRfVFlQRV9TQSBpcyB1bnN1cHBvcnRlZCBieSBHREIuICAqLworLyogRE5UVF9UWVBFX01BQ1JPIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQiAqLworCisvKiBETlRUX1RZUEVfQkxPQ0tEQVRBIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgRE5UVF9UWVBFX0ZVTkNUSU9OICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBDKysgc3BlY2lmaWMgU09NIHJlY29yZHMgKi8KKworLyogIFRoZSBwdXJwb3NlIG9mIHRoZSBETlRUX1RZUEVfQ0xBU1NfU0NPUEUgaXMgdG8gYnJhY2tldCBDKysgbWV0aG9kcworICAgIGFuZCBpbmRpY2F0ZSB0aGUgbWV0aG9kIG5hbWUgYmVsb25ncyBpbiB0aGUgImNsYXNzIHNjb3BlIiByYXRoZXIKKyAgICB0aGFuIGluIHRoZSBtb2R1bGUgdGhleSBhcmUgYmVpbmcgZGVmaW5lZCBpbi4gRm9yIGV4YW1wbGU6CisKKyAgICBjbGFzcyBjIHsKKyAgICAuLi4KKyAgICB2b2lkIG1lbWZ1bmMoKTsgLy8gbWVtYmVyIGZ1bmN0aW9uCisgICAgfTsKKworICAgIHZvaWQgYzo6bWVtZnVuYygpICAgLy8gZGVmaW5pdGlvbiBvZiBjbGFzcyBjJ3MgIm1lbWZ1bmMiCisgICAgeworICAgIC4uLgorICAgIH0KKworICAgIG1haW4oKQorICAgIHsKKyAgICAuLi4KKyAgICB9CisKKyAgICBJbiB0aGUgYWJvdmUsIHRoZSBuYW1lICJtZW1mdW5jIiBpcyBub3QgZGlyZWN0bHkgdmlzaWJsZSBmcm9tICJtYWluIi4KKyAgICBJLmUuLCB5b3UgaGF2ZSB0byBzYXkgImJyZWFrIGM6Om1lbWZ1bmMiLgorICAgIElmIGl0IHdlcmUgYSBub3JtYWwgZnVuY3Rpb24gKG5vdCBhIG1ldGhvZCksIGl0IHdvdWxkIGJlIHZpc2libGUKKyAgICB2aWEgdGhlIHNpbXBsZSAiYnJlYWsgbWVtZnVuYyIuIFNpbmNlICJtZW1mdW5jIiBvdGhlcndpc2UgbG9va3MKKyAgICBsaWtlIGEgbm9ybWFsIEZVTkNUSU9OIGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZSBicmFja2V0aW5nCisgICAgQ0xBU1NfU0NPUEUgaXMgd2hhdCBpcyB1c2VkIHRvIGluZGljYXRlIGl0IGlzIHJlYWxseSBhIG1ldGhvZC4KKyAgICAKKworICAgQSBETlRUX1RZUEVfQ0xBU1NfU0NPUEUgc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sIAorKi8KKworc3RydWN0IGRudHRfdHlwZV9jbGFzc19zY29wZSB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9DTEFTU19TQ09QRSAqLworICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgICAgMjE7IAorICBzbHRwb2ludGVyIGFkZHJlc3MgICAgICAgICA7ICAgIC8qIHBvaW50ZXIgdG8gU0xUIGVudHJ5ICovCisgIGRudHRwb2ludGVyIHR5cGUgICAgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgdHlwZSBETlRUICovCit9OworCisvKiBDKysgcmVmZXJlbmNlIHBhcmFtZXRlci4KKyAgIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyByZWNvcmQgaXMgdGhlIHNhbWUgYXMgRE5UVF9UWVBFX1BPSU5URVIgLSAKKyAgIHJlZmVyIHRvIHN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlci4KKyAqLworCisvKiBUaGUgbmV4dCB0d28gZGVzY3JpYmUgQysrIHBvaW50ZXItdG8tZGF0YS1tZW1iZXIgdHlwZSwgYW5kIAorICAgcG9pbnRlci10by1tZW1iZXItZnVuY3Rpb24gdHlwZSwgcmVzcGVjdGl2ZWx5LgorICAgRE5UVF9UWVBFX1BUUk1FTSBhbmQgRE5UVF9UWVBFX1BUUk1FTUZVTkMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgCisgKi8KKworc3RydWN0IGRudHRfdHlwZV9wdHJtZW0geworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfUFRSTUVNICovCisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOworICBkbnR0cG9pbnRlciBwb2ludHN0bwkgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCisgIGRudHRwb2ludGVyIG1lbXR5cGUgCSAgICAgOyAgICAgLyogdHlwZSBvZiBtZW1iZXIgICAgICAgICAgICAgICAgKi8KK307CisKK3N0cnVjdCBkbnR0X3R5cGVfcHRybWVtZnVuYyB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9QVFJNRU1GVU5DICovCisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOworICBkbnR0cG9pbnRlciBwb2ludHN0bwkgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCisgIGRudHRwb2ludGVyIG1lbXR5cGUgCSAgICAgOyAgICAgLyogdHlwZSBvZiBtZW1iZXIgICAgICAgICAgICAgICAgKi8KK307CisKKy8qIFRoZSBETlRUX1RZUEVfQ0xBU1Mgc3ltYm9sIGlzIGVtaXR0ZWQgdG8gZGVzY3JpYmUgYSBjbGFzcyB0eXBlLgorICogIm1lbWJlcmxpc3QiIHBvaW50cyB0byBhIGNoYWluZWQgbGlzdCBvZiBGSUVMRCBvciBHRU5GSUVMRCByZWNvcmRzCisgKiBpbmRpY2F0aW5nIHRoZSBjbGFzcyBtZW1iZXJzLiAicGFyZW50bGlzdCIgcG9pbnRzIHRvIGEgY2hhaW5lZCBsaXN0CisgKiBvZiBJTkhFUklUQU5DRSByZWNvcmRzIGluZGljYXRpbmcgY2xhc3NlcyBmcm9tIHdoaWNoIHdlIGluaGVyaXQKKyAqIGZpZWxkcy4KKyAqLworCitzdHJ1Y3QgZG50dF90eXBlX2NsYXNzIAoreworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7ICAgICAvKiBhbHdheXMgMCAqLworICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0NMQVNTICovCisgIHVuc2lnbmVkIGludCBhYnN0cmFjdDogICAgMTsgICAgIC8qIGlzIHRoaXMgYW4gYWJzdHJhY3QgY2xhc3M/ICAgICovCisgIHVuc2lnbmVkIGludCBjbGFzc19kZWNsOiAgMjsgICAgIC8qIDA9Y2xhc3MsMT11bmlvbiwyPXN0cnVjdCAgICAgICovCisgIHVuc2lnbmVkIGludCBleHBhbnNpb246ICAgMTsgICAgIC8qIDE9dGVtcGxhdGUgZXhwYW5zaW9uICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgICAxNzsgICAgIAorICBkbnR0cG9pbnRlciBtZW1iZXJsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgW0dFTl1GSUVMRHMgKi8KKyAgdW5zaWduZWQgbG9uZyB2dGJsX2xvYyAgICAgOyAgICAgLyogb2Zmc2V0IGluIG9iaiBvZiBwdHIgdG8gdnRibCAgKi8KKyAgZG50dHBvaW50ZXIgcGFyZW50bGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfSU5IRVJJVEFOQ0UgbGlzdCAgICAgKi8KKyAgdW5zaWduZWQgbG9uZyBiaXRsZW5ndGggICAgOyAgICAgLyogdG90YWwgYXQgdGhpcyBsZXZlbCAgICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgaWRlbnRsaXN0ICAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIGNsYXNzIGlkZW50J3MgKi8KKyAgZG50dHBvaW50ZXIgZnJpZW5kbGlzdCAgICAgOyAgICAgLyogcHRyIHRvIEtfRlJJRU5EIGxpc3QgICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgdGVtcGxhdGVwdHIgICAgOyAgICAgLyogcHRyIHRvIHRlbXBsYXRlICAgICAgICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgbmV4dGV4cCAgICAgICAgOyAgICAgLyogcHRyIHRvIG5leHQgZXhwYW5zaW9uICAgICAgICAgKi8KK307CisKKy8qIENsYXNzIG1lbWJlcnMgYXJlIGluZGljYXRlZCB2aWEgZWl0aGVyIHRoZSBGSUVMRCByZWNvcmQgKGZvcgorICAgZGF0YSBtZW1iZXJzLCBzYW1lIGFzIGZvciBDIHN0cnVjdCBmaWVsZHMpLCBvciBieSB0aGUgR0VORklFTEQgcmVjb3JkCisgICAoZm9yIG1lbWJlciBmdW5jdGlvbnMpLgorICovCisKK3N0cnVjdCBkbnR0X3R5cGVfZ2VuZmllbGQgeworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfR0VORklFTEQgKi8KKyAgdW5zaWduZWQgaW50IHZpc2liaWxpdHk6ICAyOyAgICAgLyogcHViID0gMCwgcHJvdCA9IDEsIHByaXYgPSAyICAgKi8KKyAgdW5zaWduZWQgaW50IGFfdW5pb246ICAgICAxOyAgICAgLyogMSA9PiBhbm9ueW1vdXMgdW5pb24gbWVtYmVyICAgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMTg7CisgIGRudHRwb2ludGVyIGZpZWxkCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBmaWVsZCBvciBxdWFsaWZpZXIgKi8KKyAgZG50dHBvaW50ZXIgbmV4dGZpZWxkICAgICAgOyAgICAgLyogcG9pbnRlciB0byBuZXh0IGZpZWxkICAgICAgICAgKi8KK307CisKKy8qIEMrKyB2aXJ0dWFsIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3QgZG50dF90eXBlX3ZmdW5jIHsKKyAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLworICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1ZGVU5DICovCisgIHVuc2lnbmVkIGludCBwdXJlOiAgICAgICAgMTsgICAgIC8qIHB1cmUgdmlydHVhbCBmdW5jdGlvbiA/ICAgICAgICovCisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIwOworICBkbnR0cG9pbnRlciBmdW5jcHRyICAgICAgICA7ICAgICAvKiBwb2ludHMgdG8gRlVOQ1RJT04gc3ltYm9sICAgICAqLworICB1bnNpZ25lZCBsb25nIHZ0Ymxfb2Zmc2V0ICA7ICAgICAvKiBvZmZzZXQgaW50byB2dGJsIGZvciB2aXJ0dWFsICAqLworfTsKKworLyogTm90IHByZWNpc2VseSBzdXJlIHdoYXQgdGhpcyBpcyBpbnRlbmRlZCBmb3IgLSBEREUgaWdub3JlcyBpdCAqLworCitzdHJ1Y3QgZG50dF90eXBlX21lbWFjY2VzcyB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9NRU1BQ0NFU1MgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7CisgIGRudHRwb2ludGVyIGNsYXNzcHRyCSAgICAgOyAgICAgLyogcG9pbnRlciB0byBiYXNlIGNsYXNzICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgZmllbGQgICAgICAgICAgOyAgICAgLyogcG9pbnRlciBmaWVsZCAgICAgICAgICAgICAgICAgKi8KK307CisKKy8qIFRoZSBETlRUX1RZUEVfSU5IRVJJVEFOQ0UgcmVjb3JkIGRlc2NyaWJlcyBkZXJpdmVkIGNsYXNzZXMuCisgKiBJbiBwYXJ0aWN1bGFyLCB0aGUgInBhcmVudGxpc3QiIGZpZWxkIG9mIHRoZSBDTEFTUyByZWNvcmQgcG9pbnRzCisgKiB0byBhIGxpc3Qgb2YgSU5IRVJJVEFOQ0UgcmVjb3JkcyBmb3IgY2xhc3NlcyBmcm9tIHdoaWNoIHdlIAorICogaW5oZXJpdCBtZW1iZXJzLgorICovCisKK3N0cnVjdCBkbnR0X3R5cGVfaW5oZXJpdGFuY2UgeworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfSU5IRVJJVEFOQ0UgKi8KKyAgdW5zaWduZWQgaW50IFZpcnR1YWw6ICAgICAxOyAgICAgLyogdmlydHVhbCBiYXNlIGNsYXNzID8gICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IHZpc2liaWxpdHk6ICAyOyAgICAgLyogcHViID0gMCwgcHJvdCA9IDEsIHByaXYgPSAyICAgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMTg7CisgIGRudHRwb2ludGVyIGNsYXNzbmFtZSAgICAgIDsgICAgIC8qIGZpcnN0IHBhcmVudCBjbGFzcywgaWYgYW55ICAgICovCisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ICAgICAgIDsgICAgIC8qIG9mZnNldCB0byBzdGFydCBvZiBiYXNlIGNsYXNzICovCisgIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBLX0lOSEVSSVRBTkNFICovCisgIHVuc2lnbmVkIGxvbmcgZnV0dXJlWzJdICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgICovCit9OworCisvKiBDKysgImZyaWVuZCIgY2xhc3NlcyAuLi4gKi8KKworc3RydWN0IGRudHRfdHlwZV9mcmllbmRfY2xhc3MgeworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfRlJJRU5EX0NMQVNTICovCisgIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOworICBkbnR0cG9pbnRlciBjbGFzc3B0ciAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLworICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBuZXh0IEROVFRfRlJJRU5EICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGRudHRfdHlwZV9mcmllbmRfZnVuYyB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9GUklFTkRfRlVOQyAqLworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKKyAgZG50dHBvaW50ZXIgZnVuY3B0ciAgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBmdW5jdGlvbiAgICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgY2xhc3NwdHIgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogbmV4dCBETlRUX0ZSSUVORCAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgbG9uZyBmdXR1cmVbMl0gICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAgKi8KK307CisKKy8qIERERSBhcHBlYXJzIHRvIGlnbm9yZSB0aGUgRE5UVF9UWVBFX01PRElGSUVSIHJlY29yZC4KKyAqIEl0IGNvdWxkIHBlcmhhcHMgYmUgdXNlZCB0byBnaXZlIGJldHRlciAicHR5cGUiIG91dHB1dCBpbiBHREI7CisgKiBvdGhlcndpc2UgaXQgaXMgcHJvYmFibHkgc2FmZSBmb3IgR0RCIHRvIGlnbm9yZSBpdCBhbHNvLgorICovCisKK3N0cnVjdCBkbnR0X3R5cGVfbW9kaWZpZXIgeworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfTU9ESUZJRVIgKi8KKyAgdW5zaWduZWQgaW50IG1fY29uc3Q6ICAgICAxOyAgICAgLyogY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IG1fc3RhdGljOiAgICAxOyAgICAgLyogc3RhdGljICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IG1fdm9pZDogICAgICAxOyAgICAgLyogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IG1fdm9sYXRpbGU6ICAxOyAgICAgLyogdm9sYXRpbGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IG1fZHVwbGljYXRlOiAxOyAgICAgLyogZHVwbGljYXRlICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMTY7CisgIGRudHRwb2ludGVyIHR5cGUgICAgICAgICAgIDsgICAgIC8qIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgZnV0dXJlICAgICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgICovCit9OworCisvKiBJJ20gbm90IHN1cmUgd2hhdCB0aGlzIHdhcyBpbnRlbmRlZCBmb3IgLSBEREUgaWdub3JlcyBpdCAqLworCitzdHJ1Y3QgZG50dF90eXBlX29iamVjdF9pZCB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9PQkpFQ1RfSUQgKi8KKyAgdW5zaWduZWQgaW50IGluZGlyZWN0OiAgICAxOyAgICAgLyogSXMgb2JqZWN0X2lkZW50IGFkZHIgb2YgYWRkcj8gKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjA7CisgIHVuc2lnbmVkIGxvbmcgb2JqZWN0X2lkZW50IDsgICAgIC8qIG9iamVjdCBpZGVudGlmaWVyICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ICAgICAgIDsgICAgIC8qIG9mZnNldCB0byBzdGFydCBvZiBiYXNlIGNsYXNzICovCisgIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBLX09CSkVDVF9JRCAgICovCisgIHVuc2lnbmVkIGxvbmcgc2Vnb2Zmc2V0ICAgIDsgICAgIC8qIGZvciBsaW5rZXIgZml4dXAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgZnV0dXJlICAgICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgICovCit9OworCisvKiBObyBzZXBhcmF0ZSBkbnR0X3R5cGVfbWVtZnVuYzsgc2FtZSBhcyBkbnR0X3R5cGVfZnVuYyAqLworCisvKiBTeW1ib2wgcmVjb3JkcyB0byBzdXBwb3J0IHRlbXBsYXRlcy4gVGhlc2Ugb25seSBnZXQgdXNlZAorICogaW4gRERFJ3MgImRlc2NyaWJlIiBvdXRwdXQgKGxpa2UgR0RCJ3MgInB0eXBlIikuCisgKi8KKworLyogVGhlIFRFTVBMQVRFIHJlY29yZCBpcyB0aGUgaGVhZGVyIGZvciBhIHRlbXBsYXRlLWNsYXNzLgorICogTGlrZSB0aGUgQ0xBU1MgcmVjb3JkLCBhIFRFTVBMQVRFIHJlY29yZCBoYXMgYSBtZW1iZXJsaXN0IHRoYXQKKyAqIHBvaW50cyB0byBhIGxpc3Qgb2YgdGVtcGxhdGUgbWVtYmVycy4gSXQgYWxzbyBoYXMgYW4gYXJnbGlzdAorICogcG9pbnRpbmcgdG8gYSBsaXN0IG9mIFRFTVBMQVRFX0FSRyByZWNvcmRzLgorICovCisKK3N0cnVjdCBkbnR0X3R5cGVfdGVtcGxhdGUgeworICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfVEVNUExBVEUgKi8KKyAgdW5zaWduZWQgaW50IGFic3RyYWN0OiAgICAxOyAgICAgLyogaXMgdGhpcyBhbiBhYnN0cmFjdCBjbGFzcz8gICAgKi8KKyAgdW5zaWduZWQgaW50IGNsYXNzX2RlY2w6ICAyOyAgICAgLyogMD1jbGFzcywxPXVuaW9uLDI9c3RydWN0ICAgICAgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMTg7CisgIGRudHRwb2ludGVyIG1lbWJlcmxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBLX1tHRU5dRklFTERzICovCisgIGxvbmcgdW51c2VkMiAgICAgICAgICAgICAgIDsgICAgIC8qIG9mZnNldCBpbiBvYmogb2YgcHRyIHRvIHZ0YmwgICovCisgIGRudHRwb2ludGVyIHBhcmVudGxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBLX0lOSEVSSVRBTkNFIGxpc3QgICAgICovCisgIHVuc2lnbmVkIGxvbmcgYml0bGVuZ3RoICAgIDsgICAgIC8qIHRvdGFsIGF0IHRoaXMgbGV2ZWwgICAgICAgICAgICovCisgIGRudHRwb2ludGVyIGlkZW50bGlzdCAgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBjbGFzcyBpZGVudCdzICovCisgIGRudHRwb2ludGVyIGZyaWVuZGxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBLX0ZSSUVORCBsaXN0ICAgICAgICAgICovCisgIGRudHRwb2ludGVyIGFyZ2xpc3QgICAgICAgIDsgICAgIC8qIHB0ciB0byBhcmd1bWVudCBsaXN0ICAgICAgICAgICovCisgIGRudHRwb2ludGVyIGV4cGFuc2lvbnMgICAgIDsgICAgIC8qIHB0ciB0byBleHBhbnNpb24gbGlzdCAgICAgICAgICovCit9OworCisvKiBUZW1wbGF0ZS1jbGFzcyBhcmd1bWVudHMgYXJlIGEgbGlzdCBvZiBURU1QTF9BUkcgcmVjb3JkcworICogY2hhaW5lZCB0b2dldGhlci4gVGhlICJuYW1lIiBmaWVsZCBpcyB0aGUgbmFtZSBvZiB0aGUgZm9ybWFsLgorICogRS5nLjoKKyAqIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBxIHsgLi4uIH07CisgKiBUaGVuICJUIiBpcyB0aGUgbmFtZSBvZiB0aGUgZm9ybWFsIGFyZ3VtZW50LgorICovCitzdHJ1Y3QgZG50dF90eXBlX3RlbXBsX2FyZyB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9URU1QTF9BUkcgKi8KKyAgdW5zaWduZWQgaW50IHVzYWdldHlwZTogICAxOyAgICAgLyogMCB0eXBlLW5hbWUgMSBleHByZXNzaW9uICAgICAqLworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMDsKKyAgdnRwb2ludGVyIG5hbWUgICAgICAgICAgICAgOyAgICAgLyogbmFtZSBvZiBhcmd1bWVudCAgICAgICAgICAgICAqLworICBkbnR0cG9pbnRlciB0eXBlICAgICAgICAgICA7ICAgICAvKiBmb3Igbm9uIHR5cGUgYXJndW1lbnRzICAgICAgICovCisgIGRudHRwb2ludGVyIG5leHRhcmcgICAgICAgIDsgICAgIC8qIE5leHQgYXJndW1lbnQgaWYgYW55ICAgICAgICAgKi8KKyAgbG9uZyBmdXR1cmVbMl0gICAgICAgICAgICAgOyAgICAgLyogcGFkZGluZyB0byAzLXdvcmQgYmxvY2sgZW5kICAqLworfTsKKworLyogRlVOQ19URU1QTEFURSByZWNvcmRzIGFyZSBzb3J0IG9mIGxpa2UgRlVOQ1RJT04sIGJ1dCBhcmUgZW1pdHRlZAorICogZm9yIHRlbXBsYXRlIG1lbWJlciBmdW5jdGlvbnMuIEUuZy4sCisgKiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgcSB7IAorICAgICAgLi4uCisgICAgICB2b2lkIGYoKTsKKyAgICAgIC4uLiAKKyAgIH07CisgKiBXaXRoaW4gdGhlIGxpc3Qgb2YgRklFTERzL0dFTkZJRUxEcyBkZWZpbmluZyB0aGUgbWVtYmVyIGxpc3QKKyAqIG9mIHRoZSB0ZW1wbGF0ZSAicSIsICJmIiB3b3VsZCBhcHBlYXIgYXMgYSBGVU5DX1RFTVBMQVRFLgorICogV2UnbGwgYWxzbyBzZWUgaW5zdGFuY2VzIG9mIEZVTkNUSU9OICJmIiByZWNvcmRzIGZvciBlYWNoIAorICogaW5zdGFudGlhdGlvbiBvZiB0aGUgdGVtcGxhdGUuCisgKi8KKworc3RydWN0IGRudHRfdHlwZV9mdW5jX3RlbXBsYXRlIHsKKyAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLworICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0ZVTkNfVEVNUExBVEUgKi8KKyAgdW5zaWduZWQgaW50IHB1YmxpYzogICAgICAxOyAgICAgLyogMSA9PiBnbG9iYWxseSB2aXNpYmxlICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgbGFuZ3VhZ2U6ICAgIDQ7ICAgICAvKiB0eXBlIG9mIGxhbmd1YWdlICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCBsZXZlbDogICAgICAgNTsgICAgIC8qIG5lc3RpbmcgbGV2ZWwgKHRvcCBsZXZlbCA9IDApKi8KKyAgdW5zaWduZWQgaW50IG9wdGltaXplOiAgICAyOyAgICAgLyogbGV2ZWwgb2Ygb3B0aW1pemF0aW9uICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgdmFyYXJnczogICAgIDE7ICAgICAvKiBlbGxpcHNlcy4gIFBhc2NhbC84MDAgbGF0ZXIgICovIAorICB1bnNpZ25lZCBpbnQgaW5mbzogICAgICAgIDQ7ICAgICAvKiBsYW5nLXNwZWNpZmljIHN0dWZmOyBGX3h4eHggICovCisgIHVuc2lnbmVkIGludCBpbmxpbmVkOiAgICAgMTsKKyAgdW5zaWduZWQgaW50IGxvY2FsbG9jOiAgICAxOyAgICAgLyogMCBhdCB0b3AsIDEgYXQgZW5kIG9mIGJsb2NrICAqLworICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgICAgIDI7CisgIHZ0cG9pbnRlciBuYW1lICAgICAgICAgICAgIDsgICAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gICAgICAgICAgICAgKi8KKyAgdnRwb2ludGVyIGFsaWFzICAgICAgICAgICAgOyAgICAgLyogYWx0ZXJuYXRlIG5hbWUsIGlmIGFueSAgICAgICAqLworICBkbnR0cG9pbnRlciBmaXJzdHBhcmFtICAgICA7ICAgICAvKiBmaXJzdCBGUEFSQU0sIGlmIGFueSAgICAgICAgICovCisgIGRudHRwb2ludGVyIHJldHZhbCAgICAgICAgIDsgICAgIC8qIHJldHVybiB0eXBlLCBpZiBhbnkgICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgYXJnbGlzdCAgICAgICAgOyAgICAgLyogcHRyIHRvIGFyZ3VtZW50IGxpc3QgICAgICAgICAqLworfTsKKworLyogTElOSyBpcyBhcHBhcmVudGx5IGludGVuZGVkIHRvIGxpbmsgdG9nZXRoZXIgZnVuY3Rpb24gdGVtcGxhdGUKKyAqIGRlZmluaXRpb25zIHdpdGggdGhlaXIgaW5zdGFudGlhdGlvbnMuIEhvd2V2ZXIsIGl0IGlzIG5vdCBjbGVhcgorICogd2h5IHRoaXMgd291bGQgYmUgbmVlZGVkLCBleGNlcHQgdG8gcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gb24KKyAqIGEgInB0eXBlIiBjb21tYW5kLiBBbmQgYXMgZmFyIGFzIEkgY2FuIHRlbGwsIGFDQyBkb2VzIG5vdCAKKyAqIGdlbmVyYXRlIHRoaXMgcmVjb3JkLgorICovCisKK3N0cnVjdCBkbnR0X3R5cGVfbGluayB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KKyAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9MSU5LICovCisgIHVuc2lnbmVkIGludCBsaW5rS2luZDogICAgNDsgICAgIC8qIGFsd2F5cyBMSU5LX1VOS05PV04gICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMTc7CisgIGxvbmcgZnV0dXJlMSAgICAgICAgICAgICAgIDsgICAgIC8qIGV4cGFuc2lvbiAgICAgICAgICAgICAgICAgICAgKi8KKyAgZG50dHBvaW50ZXIgcHRyMSAgICAgICAgICAgOyAgICAgLyogbGluayBmcm9tIHRlbXBsYXRlICAgICAgICAgICAqLworICBkbnR0cG9pbnRlciBwdHIyICAgICAgICAgICA7ICAgICAvKiB0byBleHBhbnNpb24gICAgICAgICAgICAgICAgICovCisgIGxvbmcgZnV0dXJlWzJdICAgICAgICAgICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgKi8KK307CisKKy8qIGVuZCBvZiBDKysgc3BlY2lmaWMgU09NJ3MgKi8KKworLyogRE5UVF9UWVBFX0RZTl9BUlJBWV9ERVNDIGlzIHVudXNlZCBieSBHREIgKi8KKy8qIEROVFRfVFlQRV9ERVNDX1NVQlJBTkdFIGlzIHVudXNlZCBieSBHREIgKi8KKy8qIEROVFRfVFlQRV9CRUdJTl9FWFQgaXMgdW51c2VkIGJ5IEdEQiAqLworLyogRE5UVF9UWVBFX0lOTE4gaXMgdW51c2VkIGJ5IEdEQiAqLworLyogRE5UVF9UWVBFX0lOTE5fTElTVCBpcyB1bnVzZWQgYnkgR0RCICovCisvKiBETlRUX1RZUEVfQUxJQVMgaXMgdW51c2VkIGJ5IEdEQiAqLworCitzdHJ1Y3QgZG50dF90eXBlX2RvY19mdW5jdGlvbiB7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246IDE7ICAgLyogYWx3YXlzIHplcm8gICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBpbnQga2luZDogICAgIDEwOyAgIC8qIEtfRE9DX0ZVTkNUSU9OIG9yICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLX0RPQ19NRU1GVU5DICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCBnbG9iYWw6ICAgIDE7ICAgLyogMSA9PiBnbG9iYWxseSB2aXNpYmxlICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgbGFuZ3VhZ2U6ICA0OyAgIC8qIHR5cGUgb2YgbGFuZ3VhZ2UgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOiAgICAgNTsgICAvKiBuZXN0aW5nIGxldmVsICh0b3AgbGV2ZWwgPSAwKSovCisgIHVuc2lnbmVkIGludCBvcHRpbWl6ZTogIDI7ICAgLyogbGV2ZWwgb2Ygb3B0aW1pemF0aW9uICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgdmFyYXJnczogICAxOyAgIC8qIGVsbGlwc2VzLiAgUGFzY2FsLzgwMCBsYXRlciAgKi8KKyAgdW5zaWduZWQgaW50IGluZm86ICAgICAgNDsgICAvKiBsYW5nLXNwZWNpZmljIHN0dWZmOyBGX3h4eHggICovCisgIHVuc2lnbmVkIGludCBpbmxpbmVkOiAgIDE7CisgIHVuc2lnbmVkIGludCBsb2NhbGxvYzogIDE7ICAgLyogMCBhdCB0b3AsIDEgYXQgZW5kIG9mIGJsb2NrICAqLworICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOiAxOyAgIC8qIDEgPSBmdW5jdGlvbiBleHBhbnNpb24gICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGRvY19jbG9uZTogMTsKKyAgdnRwb2ludGVyIG5hbWU7ICAgICAgICAgICAgICAvKiBuYW1lIG9mIGZ1bmN0aW9uICAgICAgICAgICAgICovCisgIHZ0cG9pbnRlciBhbGlhczsgICAgICAgICAgICAgLyogYWx0ZXJuYXRlIG5hbWUsIGlmIGFueSAgICAgICAqLworICBkbnR0cG9pbnRlciBmaXJzdHBhcmFtOyAgICAgIC8qIGZpcnN0IEZQQVJBTSwgaWYgYW55ICAgICAgICAgKi8KKyAgc2x0cG9pbnRlciBhZGRyZXNzOyAgICAgICAgICAvKiBjb2RlIGFuZCB0ZXh0IGxvY2F0aW9ucyAgICAgICovCisgIENPUkVfQUREUiBlbnRyeWFkZHI7ICAgICAgICAgLyogYWRkcmVzcyBvZiBlbnRyeSBwb2ludCAgICAgICAqLworICBkbnR0cG9pbnRlciByZXR2YWw7ICAgICAgICAgIC8qIHJldHVybiB0eXBlLCBpZiBhbnkgICAgICAgICAgKi8KKyAgQ09SRV9BRERSIGxvd2FkZHI7ICAgICAgICAgICAvKiBsb3dlc3QgYWRkcmVzcyBvZiBmdW5jdGlvbiAgICovCisgIENPUkVfQUREUiBoaWFkZHI7ICAgICAgICAgICAgLyogaGlnaGVzdCBhZGRyZXNzIG9mIGZ1bmN0aW9uICAqLworICBkbnR0cG9pbnRlciBpbmxpbmVfbGlzdDsgICAgIC8qIHBvaW50ZXIgdG8gZmlyc3QgaW5saW5lICAgICovCisgIGx0cG9pbnRlciBsdF9vZmZzZXQ7ICAgICAgICAgLyogc3RhcnQgb2YgZnJhZy9jcCBsaW5lIHRhYmxlICAqLworICBjdHh0cG9pbnRlciBjdHh0X29mZnNldDsgICAgIC8qIHN0YXJ0IG9mIGNvbnRleHQgdGFibGUgZm9yIHRoaXMgcm91dGluZSAqLworfTsKKworLyogRE5UVF9UWVBFX0RPQ19NRU1GVU5DIGlzIHVudXNlZCBieSBHREIgKi8KKworLyogRE5UVF9UWVBFX0dFTkVSSUMgYW5kIEROVFRfVFlQRV9CTE9DSyBhcmUgY29udmllbmNlIHN0cnVjdHVyZXMKKyAgIHNvIHdlIGNhbiBleGFtaW5lIGEgRE5UVCBlbnRyeSBpbiBhIGdlbmVyaWMgZmFzaGlvbi4gICovCitzdHJ1Y3QgZG50dF90eXBlX2dlbmVyaWMKK3sKKyAgdW5zaWduZWQgaW50IHdvcmRbOV07Cit9OworCitzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrCit7CisgIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7CisgIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAgICAgIDEwOworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7CisgIHVuc2lnbmVkIGludCB3b3JkWzJdOworfTsKKworLyogT25lIGVudHJ5IGluIGEgRE5UVCAoZWl0aGVyIHRoZSBMTlRUIG9yIEdOVFQpLiAgCisgKiBUaGlzIGlzIGEgdW5pb24gb2YgdGhlIGFib3ZlIDYwIG9yIHNvIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KKyAqLwordW5pb24gZG50dGVudHJ5Cit7CisgIHN0cnVjdCBkbnR0X3R5cGVfc3JjZmlsZSBkc2ZpbGU7CisgIHN0cnVjdCBkbnR0X3R5cGVfbW9kdWxlIGRtb2R1bGU7CisgIHN0cnVjdCBkbnR0X3R5cGVfZnVuY3Rpb24gZGZ1bmM7CisgIHN0cnVjdCBkbnR0X3R5cGVfZnVuY3Rpb24gZGVudHJ5OworICBzdHJ1Y3QgZG50dF90eXBlX2JlZ2luIGRiZWdpbjsKKyAgc3RydWN0IGRudHRfdHlwZV9lbmQgZGVuZDsKKyAgc3RydWN0IGRudHRfdHlwZV9mcGFyYW0gZGZwYXJhbTsKKyAgc3RydWN0IGRudHRfdHlwZV9zdmFyIGRzdmFyOworICBzdHJ1Y3QgZG50dF90eXBlX2R2YXIgZGR2YXI7CisgIHN0cnVjdCBkbnR0X3R5cGVfY29uc3QgZGNvbnN0OworICBzdHJ1Y3QgZG50dF90eXBlX3R5cGUgZHR5cGU7CisgIHN0cnVjdCBkbnR0X3R5cGVfdHlwZSBkdGFnOworICBzdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIgZHB0cjsKKyAgc3RydWN0IGRudHRfdHlwZV9lbnVtIGRlbnVtOworICBzdHJ1Y3QgZG50dF90eXBlX21lbWVudW0gZG1lbWJlcjsKKyAgc3RydWN0IGRudHRfdHlwZV9zZXQgZHNldDsKKyAgc3RydWN0IGRudHRfdHlwZV9zdWJyYW5nZSBkc3VicjsKKyAgc3RydWN0IGRudHRfdHlwZV9hcnJheSBkYXJyYXk7CisgIHN0cnVjdCBkbnR0X3R5cGVfc3RydWN0IGRzdHJ1Y3Q7CisgIHN0cnVjdCBkbnR0X3R5cGVfdW5pb24gZHVuaW9uOworICBzdHJ1Y3QgZG50dF90eXBlX2ZpZWxkIGRmaWVsZDsKKyAgc3RydWN0IGRudHRfdHlwZV9mdW5jdHlwZSBkZnVuY3R5cGU7CisgIHN0cnVjdCBkbnR0X3R5cGVfd2l0aCBkd2l0aDsKKyAgc3RydWN0IGRudHRfdHlwZV9mdW5jdGlvbiBkYmxvY2tkYXRhOworICBzdHJ1Y3QgZG50dF90eXBlX2NsYXNzX3Njb3BlIGRjbGFzc19zY29wZTsKKyAgc3RydWN0IGRudHRfdHlwZV9wb2ludGVyIGRyZWZlcmVuY2U7CisgIHN0cnVjdCBkbnR0X3R5cGVfcHRybWVtIGRwdHJtZW07CisgIHN0cnVjdCBkbnR0X3R5cGVfcHRybWVtZnVuYyBkcHRybWVtZnVuYzsKKyAgc3RydWN0IGRudHRfdHlwZV9jbGFzcyBkY2xhc3M7CisgIHN0cnVjdCBkbnR0X3R5cGVfZ2VuZmllbGQgZGdlbmZpZWxkOworICBzdHJ1Y3QgZG50dF90eXBlX3ZmdW5jIGR2ZnVuYzsKKyAgc3RydWN0IGRudHRfdHlwZV9tZW1hY2Nlc3MgZG1lbWFjY2VzczsKKyAgc3RydWN0IGRudHRfdHlwZV9pbmhlcml0YW5jZSBkaW5oZXJpdGFuY2U7CisgIHN0cnVjdCBkbnR0X3R5cGVfZnJpZW5kX2NsYXNzIGRmcmllbmRfY2xhc3M7CisgIHN0cnVjdCBkbnR0X3R5cGVfZnJpZW5kX2Z1bmMgZGZyaWVuZF9mdW5jOworICBzdHJ1Y3QgZG50dF90eXBlX21vZGlmaWVyIGRtb2RpZmllcjsKKyAgc3RydWN0IGRudHRfdHlwZV9vYmplY3RfaWQgZG9iamVjdF9pZDsKKyAgc3RydWN0IGRudHRfdHlwZV90ZW1wbGF0ZSBkdGVtcGxhdGU7CisgIHN0cnVjdCBkbnR0X3R5cGVfdGVtcGxfYXJnIGR0ZW1wbF9hcmc7CisgIHN0cnVjdCBkbnR0X3R5cGVfZnVuY190ZW1wbGF0ZSBkZnVuY190ZW1wbGF0ZTsKKyAgc3RydWN0IGRudHRfdHlwZV9saW5rIGRsaW5rOworICBzdHJ1Y3QgZG50dF90eXBlX2RvY19mdW5jdGlvbiBkZG9jZnVuYzsKKyAgc3RydWN0IGRudHRfdHlwZV9nZW5lcmljIGRnZW5lcmljOworICBzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrIGRibG9jazsKK307CisKKy8qIFNvdXJjZSBsaW5lIGVudHJ5IHR5cGVzLiAgKi8KK2VudW0gc2x0dHlwZQoreworICBTTFRfTk9STUFMLAorICBTTFRfU1JDRklMRSwKKyAgU0xUX01PRFVMRSwKKyAgU0xUX0ZVTkNUSU9OLAorICBTTFRfRU5UUlksCisgIFNMVF9CRUdJTiwKKyAgU0xUX0VORCwKKyAgU0xUX1dJVEgsCisgIFNMVF9FWElULAorICBTTFRfQVNTSVNULAorICBTTFRfTUFSS0VSLAorICBTTFRfQ0xBU1NfU0NPUEUsCisgIFNMVF9JTkxOLAorICBTTFRfTk9STUFMX09GRlNFVCwKK307CisKKy8qIEEgbm9ybWFsIHNvdXJjZSBsaW5lIGVudHJ5LiAgU2ltcGx5IHByb3ZpZGVzIGEgbWFwcGluZyBvZiBhIHNvdXJjZQorICAgbGluZSBudW1iZXIgdG8gYSBjb2RlIGFkZHJlc3MuCisKKyAgIFNMVERFU0Mgd2lsbCBhbHdheXMgYmUgU0xUX05PUk1BTCBvciBTTFRfRVhJVC4gICovCisKK3N0cnVjdCBzbHRfbm9ybWFsCit7CisgIHVuc2lnbmVkIGludCBzbHRkZXNjOgk0OworICB1bnNpZ25lZCBpbnQgbGluZToJMjg7CisgIENPUkVfQUREUiBhZGRyZXNzOworfTsKKworc3RydWN0IHNsdF9ub3JtYWxfb2ZmCit7CisgIHVuc2lnbmVkIGludCBzbHRkZXNjOgk0OworICB1bnNpZ25lZCBpbnQgb2Zmc2V0Ogk2OworICB1bnNpZ25lZCBpbnQgbGluZToJMjI7CisgIENPUkVfQUREUiBhZGRyZXNzOworfTsKKworLyogQSBzcGVjaWFsIHNvdXJjZSBsaW5lIGVudHJ5LiAgUHJvdmlkZXMgYSBtYXBwaW5nIG9mIGEgZGVjbGFyYXRpb24KKyAgIHRvIGEgbGluZSBudW1iZXIuICBUaGVzZSBlbnRyaWVzIHBvaW50IGJhY2sgaW50byB0aGUgRE5UVCB3aGljaAorICAgcmVmZXJlbmNlcyB0aGVtLiAgKi8KKworc3RydWN0IHNsdF9zcGVjaWFsCit7CisgIHVuc2lnbmVkIGludCBzbHRkZXNjOgk0OworICB1bnNpZ25lZCBpbnQgbGluZToJMjg7CisgIGRudHRwb2ludGVyIGJhY2twdHI7Cit9OworCisvKiBVc2VkIHRvIGRlc2NyaWJlIG5lc3RpbmcuCisKKyAgIEZvciBuZXN0ZWQgbGFuZ3VhZ2VzLCBhbiBzbHRfYXNzaXN0IGVudHJ5IG11c3QgZm9sbG93IGVhY2ggU0xUX0ZVTkMKKyAgIGVudHJ5IGluIHRoZSBTTFQuICBUaGUgYWRkcmVzcyBmaWVsZCB3aWxsIHBvaW50IGZvcndhcmQgdG8gdGhlCisgICBmaXJzdCBzbHRfbm9ybWFsIGVudHJ5IHdpdGhpbiB0aGUgZnVuY3Rpb24ncyBzY29wZS4gICovCisKK3N0cnVjdCBzbHRfYXNzaXN0Cit7CisgIHVuc2lnbmVkIGludCBzbHRkZXNjOgk0OworICB1bnNpZ25lZCBpbnQgdW51c2VkOgkyODsKKyAgc2x0cG9pbnRlciBhZGRyZXNzOworfTsKKworc3RydWN0IHNsdF9nZW5lcmljCit7CisgIHVuc2lnbmVkIGludCB3b3JkWzJdOworfTsKKwordW5pb24gc2x0ZW50cnkKK3sKKyAgc3RydWN0IHNsdF9ub3JtYWwgc25vcm07CisgIHN0cnVjdCBzbHRfbm9ybWFsX29mZiBzbm9ybW9mZjsKKyAgc3RydWN0IHNsdF9zcGVjaWFsIHNzcGVjOworICBzdHJ1Y3Qgc2x0X2Fzc2lzdCBzYXNzdDsKKyAgc3RydWN0IHNsdF9nZW5lcmljIHNnZW5lcmljOworfTsKKworLyogICRMSU5FUyQgZGVjbGFyYXRpb25zCisgKiAgVGhpcyBpcyB0aGUgbGluZSB0YWJsZSB1c2VkIGZvciBvcHRpbWl6ZWQgY29kZSwgd2hpY2ggaXMgb25seSBwcmVzZW50IAorICogIGluIHRoZSBuZXcgJFBST0dSQU1fSU5GTyQgZGVidWcgc3BhY2UuICAKKyAqLworCisjZGVmaW5lIERTVF9MTl9FU0NBUEVfRkxBRzEgICAxNQorI2RlZmluZSBEU1RfTE5fRVNDQVBFX0ZMQUcyICAgMTQKKyNkZWZpbmUgRFNUX0xOX0NUWF9TUEVDMSAgICAgIDEzICAKKyNkZWZpbmUgRFNUX0xOX0NUWF9TUEVDMiAgICAgIDEyCisKKy8qCisgIEVzY2FwZSBmdW5jdGlvbiBjb2RlczoKKyovCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X2xuX3BhZCwgICAgICAgICAgLyogcGFkIGJ5dGUgKi8KKyAgICBkc3RfbG5fZXNjYXBlXzEsICAgICAvKiByZXNlcnZlZCAqLworICAgIGRzdF9sbl9kcGMxX2RsbjEsICAgIC8qIDEgYnl0ZSBsaW5lIGRlbHRhLCAxIGJ5dGUgcGMgZGVsdGEgKi8KKyAgICBkc3RfbG5fZHBjMl9kbG4yLCAgICAvKiAyIGJ5dGVzIGxpbmUgZGVsdGEsIDIgYnl0ZXMgcGMgZGVsdGEgKi8KKyAgICBkc3RfbG5fcGM0X2xuNCwgICAgICAvKiA0IGJ5dGVzIEFCU09MVVRFIGxpbmUgbnVtYmVyLCA0IGJ5dGVzIEFCU09MVVRFIHBjICovCisgICAgZHN0X2xuX2RwYzBfZGxuMSwgICAgLyogMSBieXRlIGxpbmUgZGVsdGEsIHBjIGRlbHRhID0gMCAqLworICAgIGRzdF9sbl9sbl9vZmZfMSwgICAgIC8qIHN0YXRlbWVudCBlc2NhcGUsIHN0bXQgIyA9IDEgKDJuZCBzdG10IG9uIGxpbmUpICovCisgICAgZHN0X2xuX2xuX29mZiwgICAgICAgLyogc3RhdGVtZW50IGVzY2FwZSwgc3RtdCAjID0gbmV4dCBieXRlICovCisgICAgZHN0X2xuX2VudHJ5LCAgICAgICAgLyogZW50cnkgZXNjYXBlLCBuZXh0IGJ5dGUgaXMgZW50cnkgbnVtYmVyICovCisgICAgZHN0X2xuX2V4aXQsICAgICAgICAgLyogZXhpdCBlc2NhcGUgKi8KKyAgICBkc3RfbG5fc3RtdF9lbmQsICAgICAvKiBnYXAgZXNjYXBlLCA0IGJ5dGVzIHBjIGRlbHRhICovCisgICAgZHN0X2xuX3N0bXRfY3AsICAgICAgLyogY3VycmVudCBzdG10IGlzIGEgY3JpdGljYWwgcG9pbnQgKi8KKyAgICBkc3RfbG5fZXNjYXBlXzEyLCAgICAvKiByZXNlcnZlZCAqLworICAgIGRzdF9sbl9lc2NhcGVfMTMsICAgIC8qIHRoaXMgaXMgYW4gZXhjZXB0aW9uIHNpdGUgcmVjb3JkICovCisgICAgZHN0X2xuX254dF9ieXRlLCAgICAgLyogbmV4dCBieXRlIGNvbnRhaW5zIHRoZSByZWFsIGVzY2FwZSBjb2RlICovCisgICAgZHN0X2xuX2VuZCwgICAgICAgICAgLyogZW5kIGVzY2FwZSwgZmluYWwgZW50cnkgZm9sbG93cyAqLworICAgIGRzdF9sbl9lc2NhcGUxX0VORF9PRl9FTlVNCisgICAgfQorICAgIGRzdF9sbl9lc2NhcGUxX3Q7CisKK3R5cGVkZWYgZW51bQorICAgIHsKKyAgICBkc3RfbG5fY3R4XzEsICAgICAgICAvKiBuZXh0IGJ5dGUgZGVzY3JpYmVzIGNvbnRleHQgc3dpdGNoIHdpdGggNS1iaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIHRoZSBpbWFnZSB0YWJsZSBhbmQgMy1iaXQgcnVuIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBydW4gbGVuZ3RoIGlzIDAsIGVuZCB3aXRoIGFub3RoZXIgY3h0IHNwZWNpZmllciBvciBjdHhfZW5kICovCisgICAgZHN0X2xuX2N0eF8yLCAgICAgICAgLyogbmV4dCAyIGJ5dGVzIHN3aXRjaCBjb250ZXh0OiAxMyBiaXQgaW5kZXgsIDMgYml0IHJ1biBsZW5ndGggKi8KKyAgICBkc3RfbG5fY3R4XzQsICAgICAgICAvKiBuZXh0IDQgYnl0ZXMgc3dpdGNoIGNvbnRleHQ6IDI5IGJpdCBpbmRleCwgMyBiaXQgcnVuIGxlbmd0aCAqLworICAgIGRzdF9sbl9jdHhfZW5kLCAgICAgIC8qIGVuZCBjdXJyZW50IGNvbnRleHQgKi8KKyAgICBkc3RfbG5fY29sX3J1bl8xLCAgICAvKiBuZXh0IGJ5dGUgaXMgY29sdW1uIHBvc2l0aW9uIG9mIHN0YXJ0IG9mIG5leHQgc3RhdGVtZW50LCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyBieXRlIGlzIGxlbmd0aCBvZiBzdGF0ZW1lbnQgKi8KKyAgICBkc3RfbG5fY29sX3J1bl8yLCAgICAvKiBuZXh0IDIgYnl0ZXMgaXMgY29sdW1uIHBvc2l0aW9uIG9mIHN0YXJ0IG9mIG5leHQgc3RhdGVtZW50LCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyAyIGJ5dGVzIGlzIGxlbmd0aCBvZiBzdGF0ZW1lbnQgKi8KKyAgICBkc3RfbG5faW5pdF9iYXNlMSwgICAvKiBuZXh0IDQgYnl0ZXMgYXJlIGFic29sdXRlIFBDLCBmb2xsb3dlZCBieSAxIGJ5dGUgb2YgbGluZSBudW1iZXIgKi8KKyAgICBkc3RfbG5faW5pdF9iYXNlMiwgICAvKiBuZXh0IDQgYnl0ZXMgYXJlIGFic29sdXRlIFBDLCBmb2xsb3dlZCBieSAyIGJ5dGVzIG9mIGxpbmUgbnVtYmVyICovCisgICAgZHN0X2xuX2luaXRfYmFzZTMsICAgLyogbmV4dCA0IGJ5dGVzIGFyZSBhYnNvbHV0ZSBQQywgZm9sbG93ZWQgYnkgMyBieXRlcyBvZiBsaW5lIG51bWJlciAqLworICAgIGRzdF9sbl9lc2NhcGUyX0VORF9PRl9FTlVNCisgICAgfQorICAgIGRzdF9sbl9lc2NhcGUyX3Q7ICAgICAgICAgICAKKwordHlwZWRlZiB1bmlvbgorICAgIHsKKyAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBwY19kZWx0YSA6IDQ7ICAgICAgLyogNCBiaXQgcGMgZGVsdGEgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgbG5fZGVsdGEgOiA0OyAgICAgIC8qIDQgYml0IGxpbmUgbnVtYmVyIGRlbHRhICovCisgICAgICAgIH0KKyAgICAgICAgZGVsdGE7CisKKyAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBlc2NfZmxhZyA6IDQ7ICAgICAgLyogYWxpYXMgZm9yIHBjX2RlbHRhICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBlc2NfY29kZSA6IDQ7ICAgICAgLyogZXNjYXBlIGZ1bmN0aW9uIGNvZGUgKGRzdF9sbl9lc2NhcGUxX3QsIG9yIC4uLjJfdCAqLworICAgICAgICB9CisgICAgICAgIGVzYzsKKworICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCAgICAgIGVzY19mbGFnIDogNDsgICAgICAvKiBkc3RfbG5fY3R4X3NwZWMxLCBvciBkc3RfbG5fY3R4X3NwZWMyICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgIHJ1bl9sZW5ndGggOiAyOyAgICAgIAorICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBjdHhfaW5kZXggOiAyOyAgICAgIC8qIC4uLnNwZWMyIGNvbnRhaW5zIGluZGV4OyAgLi4uc3BlYzEsIGluZGV4IC0gNCAqLworICAgICAgICB9CisgICAgICAgIGN0eF9zcGVjOworCisgICAgY2hhciAgICAgICAgICAgICAgIHNkYXRhOyAgICAgICAgICAgICAgIC8qIHNpZ25lZCBkYXRhIGJ5dGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICAgICAgdWRhdGE7ICAgICAgICAgICAgICAgLyogdW5zaWduZWQgZGF0YSBieXRlICovCisgICAgfQorICAgIGRzdF9sbl9lbnRyeV90LAorICAgICpkc3RfbG5fZW50cnlfcHRyX3Q7CisKKy8qIFdhcm5pbmc6IGFsdGhvdWdoIHRoZSBhYm92ZSB1bmlvbiBvY2N1cGllcyBvbmx5IDEgYnl0ZSB0aGUgY29tcGlsZXIgdHJlYXRzCisgKiBpdCBhcyBoYXZpbmcgc2l6ZSAyICh0aGUgbWluaW11bSBzaXplIG9mIGEgc3RydWN0KS4gIFRoZXJlZm9yZSBhIHNlcXVlbmNlIG9mCisgKiBkc3RfbG5fZW50cnlfdCdzIGNhbm5vdCBiZSBkZXNjcmliZWQgYXMgYW4gYXJyYXksIGFuZCB3YWxraW5nIHRocm91Z2ggc3VjaCBhCisgKiBzZXF1ZW5jZSByZXF1aXJlcyBjb252b2x1dGVkIGNvZGUgc3VjaCBhcworICogICAgICBsbl9wdHIgPSAoZHN0X2xuX2VudHJ5X3B0cl90KSAoY2hhciopIGxuX3B0ciArIDEKKyAqIFdlIHJlZ3JldCB0aGUgaW5jb252ZW5pZW5jZS4gKi8KKworLyogU3RydWN0dXJlIGZvciBpbnRlcnByZXRpbmcgdGhlIGJ5dGUgZm9sbG93aW5nIGEgZHN0X2xuX2N0eDEgZW50cnkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDFfaW5kZXggOiA1OyAgICAgIC8qIDUgYml0IGluZGV4IGludG8gY29udGV4dCB0YWJsZSAqLworICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4MV9ydW5fbGVuZ3RoIDogMzsgLyogMyBiaXQgcnVuIGxlbmd0aCAqLworfSBkc3RfbG5fY3R4MV90LAorICAqZHN0X2xuX2N0eDFfcHRyX3Q7CisKKy8qIFN0cnVjdHVyZSBmb3IgaW50ZXJwcmV0aW5nIHRoZSBieXRlcyBmb2xsb3dpbmcgYSBkc3RfbG5fY3R4MiBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4Ml9pbmRleCA6IDEzOyAgICAgLyogMTMgYml0IGluZGV4IGludG8gY29udGV4dCB0YWJsZSAqLworICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4Ml9ydW5fbGVuZ3RoIDogMzsgLyogMyBiaXQgcnVuIGxlbmd0aCAqLworfSBkc3RfbG5fY3R4Ml90LAorICAqZHN0X2xuX2N0eDJfcHRyX3Q7CisKKy8qIFN0cnVjdHVyZSBmb3IgaW50ZXJwcmV0aW5nIHRoZSBieXRlcyBmb2xsb3dpbmcgYSBkc3RfbG5fY3R4NCBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4NF9pbmRleCA6IDI5OyAgICAgLyogMjkgYml0IGluZGV4IGludG8gY29udGV4dCB0YWJsZSAqLworICAgIHVuc2lnbmVkICBpbnQgICAgICAgICAgY3R4NF9ydW5fbGVuZ3RoIDogMzsgLyogMyBiaXQgcnVuIGxlbmd0aCAqLworfSBkc3RfbG5fY3R4NF90LAorICAqZHN0X2xuX2N0eDRfcHRyX3Q7CisKKworLyogIFBYREIgZGVmaW5pdGlvbnMuCisgKgorICogUFhEQiBpcyBhIHBvc3QtcHJvY2Vzc29yIHdoaWNoIHRha2VzIHRoZSBleGVjdXRhYmxlIGZpbGUKKyAqIGFuZCBtYXNzYWdlcyB0aGUgZGVidWcgaW5mb3JtYXRpb24gc28gdGhhdCB0aGUgZGVidWdnZXIgbWF5CisgKiBzdGFydCB1cCBhbmQgcnVuIG1vcmUgZWZmaWNpZW50bHkuICBTb21lIG9mIHRoZSB0YXNrcworICogcGVyZm9ybWVkIGJ5IFBYREIgYXJlOgorICoKKyAqIG8gICBSZW1vdmUgZHVwbGljYXRlIGdsb2JhbCB0eXBlIGFuZCB2YXJpYWJsZSBpbmZvcm1hdGlvbgorICogICAgIGZyb20gdGhlIEdOVFQsCisgKgorICogbyAgIEFwcGVuZCB0aGUgR05UVCBvbnRvIHRoZSBlbmQgb2YgdGhlIExOVFQgYW5kIHBsYWNlIGJvdGgKKyAqICAgICBiYWNrIGluIHRoZSBMTlRUIHNlY3Rpb24sCisgKgorICogbyAgIEJ1aWxkIHF1aWNrIGxvb2stdXAgdGFibGVzIChkZXNjcmlwdGlvbiBmb2xsb3dzKSBmb3IKKyAqICAgICBmaWxlcywgcHJvY2VkdXJlcywgbW9kdWxlcywgYW5kIHBhcmFncmFwaHMgKGZvciBDb2JvbCksCisgKiAgICAgcGxhY2luZyB0aGVzZSBpbiB0aGUgR05UVCBzZWN0aW9uLAorICoKKyAqIG8gICBSZWNvbnN0cnVjdCB0aGUgaGVhZGVyIGFwcGVhcmluZyBpbiB0aGUgaGVhZGVyIHNlY3Rpb24KKyAqICAgICB0byBhY2Nlc3MgdGhpcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgInF1aWNrIGxvb2stdXAiIHRhYmxlcyBhcmUgaW4gdGhlICRHTlRUJCBzdWItc3BhY2UsIGluCisgKiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICoKKyAqICAgICBQcm9jZWR1cmVzICAgIC1zb3J0ZWQgYnkgYWRkcmVzcworICogICAgIFNvdXJjZSBmaWxlcyAgLXNvcnRlZCBieSBhZGRyZXNzIChvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgY29kZSBmcm9tIHJvdXRpbmVzKQorICogICAgIE1vZHVsZXMgICAgICAgLXNvcnRlZCBieSBhZGRyZXNzCisgKiAgICAgQ2xhc3NlcyAgICAgICAtPHVuc29ydGVkPz4KKyAqICAgICBBZGRyZXNzIEFsaWFzIC1zb3J0ZWQgYnkgaW5kZXggPD8+CisgKiAgICAgT2JqZWN0IElEcyAgICAtc29ydGVkIGJ5IG9iamVjdCBpZGVudGlmaWVyCisgKgorICogTW9zdCBxdWljayBlbnRyaWVzIGhhdmUgKDAtYmFzZWQpIGluZGljZXMgaW50byB0aGUgTE5UVCB0YWJsZXMgdG8KKyAqIHRoZSBmdWxsIGVudHJpZXMgZm9yIHRoZSBpdGVtIGl0IGRlc2NyaWJlcy4KKyAqCisgKiBUaGUgcG9zdC1QWERCIGhlYWRlciBpcyBpbiB0aGUgJEhFQURFUiQgc3ViLXNwYWNlLiAgQWxhcywgaXQKKyAqIG9jY3VycyBpbiBkaWZmZXJlbnQgZm9ybXMsIGRlcGVuZGluZyBvbiB0aGUgb3B0aW1pemF0aW9uIGxldmVsCisgKiBpbiB0aGUgY29tcGlsYXRpb24gc3RlcCBhbmQgd2hldGhlciBQWERCIHdhcyBydW4gb3Igbm90LiBUaGUKKyAqIHdvcnN0IHBhcnQgaXMgdGhlIGZvcm1zIGFyZW4ndCBzZWxmLWRlc2NyaWJpbmcsIHNvIHdlJ2xsIGhhdmUKKyAqIHRvIGdyb3ZlbCBpbiB0aGUgYml0cyB0byBmaWd1cmUgb3V0IHdoYXQga2luZCB3ZSdyZSBsb29raW5nIGF0CisgKiAoc2VlIGhwX2dldF9oZWFkZXIgaW4gaHAtcHN5bXRhYi1yZWFkLmMpLgorICovCisKKy8qIFBYREIgdmVyc2lvbnMKKyAqLworI2RlZmluZSBQWERCX1ZFUlNJT05fQ1BMVVNQTFVTCTEKKyNkZWZpbmUgUFhEQl9WRVJTSU9OXzdfNAkyCisjZGVmaW5lIFBYREJfVkVSU0lPTl9DUFBfMzAJMworI2RlZmluZSBQWERCX1ZFUlNJT05fRERFXzNfMkEJNAorI2RlZmluZSBQWERCX1ZFUlNJT05fRERFXzNfMgk1CisjZGVmaW5lIFBYREJfVkVSU0lPTl9EREVfNF8wCTYKKworI2RlZmluZSBQWERCX1ZFUlNJT05fMl8xCTEKKworLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gRE9DIGluZm8KKyAqIGJ1dCB0aGUgZXhlY3V0YWJsZSBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYiAodGhlIGVhc3kKKyAqIGNhc2UsIGZyb20gImNjIC1nIikuCisgKi8KK3R5cGVkZWYgc3RydWN0IFBYREJfc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgIHBkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGZ1bmN0aW9uIGxvb2stdXAgdGFibGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGZkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGZpbGUgbG9vay11cCB0YWJsZSAqLworICAgIGludCAgICAgICAgICAgICAgbWRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbW9kdWxlIGxvb2stdXAgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIHB4ZGJlZCA6IDE7ICAgLyogMSA9PiBmaWxlIGhhcyBiZWVuIHByZXByb2Nlc3NlZCAgICAgICovCisgICAgdW5zaWduZWQgaW50ICAgICBiaWdoZHIgOiAxOyAgIC8qIDEgPT4gdGhpcyBoZWFkZXIgY29udGFpbnMgJ3RpbWUnIHdvcmQgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIHNhX2hlYWRlciA6IDE7LyogMSA9PiBjcmVhdGVkIGJ5IFNBIHZlcnNpb24gb2YgcHhkYiAqLworCQkJICAgICAgICAgICAvKiAgIHVzZWQgZm9yIHZlcnNpb24gY2hlY2sgaW4geGRiICovCisgICAgdW5zaWduZWQgaW50ICAgICBpbmxpbmVkOiAxOyAgIC8qIG9uZSBvciBtb3JlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gaW5saW5lZCAqLworICAgIHVuc2lnbmVkIGludCAgICAgc3BhcmU6MTI7CisgICAgc2hvcnQgICAgICAgICAgICB2ZXJzaW9uOyAgICAgIC8qIHB4ZGIgaGVhZGVyIHZlcnNpb24gKi8KKyAgICBpbnQgICAgICAgICAgICAgIGdsb2JhbHM7ICAgICAgLyogaW5kZXggaW50byB0aGUgRE5UVCB3aGVyZSBHTlRUIGJlZ2lucyAqLworICAgIHVuc2lnbmVkIGludCAgICAgdGltZTsgICAgICAgICAvKiBtb2RpZnkgdGltZSBvZiBmaWxlIGJlZm9yZSBiZWluZyBweGRiZWQgKi8KKyAgICBpbnQgICAgICAgICAgICAgIHBnX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGxhYmVsIGxvb2stdXAgdGFibGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGZ1bmN0aW9uczsgICAgLyogYWN0dWFsIG51bWJlciBvZiBmdW5jdGlvbnMgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGZpbGVzOyAgICAgICAgLyogYWN0dWFsIG51bWJlciBvZiBmaWxlcyAqLworICAgIGludCAgICAgICAgICAgICAgY2RfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gY2xhc3MgbG9vay11cCB0YWJsZSAqLworICAgIGludCAgICAgICAgICAgICAgYWFfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gYWRkciBhbGlhcyBsb29rLXVwIHRhYmxlICovCisgICAgaW50ICAgICAgICAgICAgICBvaV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBvYmplY3QgaWQgbG9vay11cCB0YWJsZSAqLworfSBQWERCX2hlYWRlciwgKlBYREJfaGVhZGVyX3B0cjsKKworLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gRE9DIGluZm8gYW5kIHRoZQorICogZXhlY3V0YWJsZSBoYXMgTk9UIGJlZW4gcHJvY2Vzc2VkIGJ5IHB4ZGIuCisgKi8KK3R5cGVkZWYgc3RydWN0IFhEQl9oZWFkZXJfc3RydWN0IHsKKyAgICBsb25nIGdudHRfbGVuZ3RoOyAKKyAgICBsb25nIGxudHRfbGVuZ3RoOyAKKyAgICBsb25nIHNsdF9sZW5ndGg7IAorICAgIGxvbmcgdnRfbGVuZ3RoOyAKKyAgICBsb25nIHh0X2xlbmd0aDsgCit9IFhEQl9oZWFkZXI7CisKKy8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIERPQyBpbmZvIGFuZCB0aGUKKyAqIGV4ZWN1dGFibGUgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IHB4ZGIuCisgKi8KK3R5cGVkZWYgc3RydWN0IERPQ19pbmZvX1BYREJfaGVhZGVyX3N0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGludCB4ZGJfaGVhZGVyOiAxOyAJICAgIC8qIGJpdCBzZXQgaWYgdGhpcyBpcyBwb3N0LTMuMSB4ZGIgKi8gCisgICAgICAgIHVuc2lnbmVkIGludCBkb2NfaGVhZGVyOiAxOyAgICAgICAgIC8qIGJpdCBzZXQgaWYgdGhpcyBpcyBkb2Mtc3R5bGUgaGVhZGVyKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHZlcnNpb246IDg7ICAgICAgICAgICAgLyogdmVyc2lvbiBvZiBweGRiIHNlZSBkZWZpbmVzCisJCQkJCSAgICAgKiBQWERCX1ZFUlNJT05fKiBpbiB0aGlzIGZpbGUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHJlc2VydmVkX2Zvcl9mbGFnczogMTY7LyogZm9yIGZ1dHVyZSB1c2U7IC0tIG11c3QgYmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzZXQgdG8gemVybyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGhhc19hdXhfcGRfdGFibGU6IDE7ICAgLyogJEdOVFQkIGhhcyBhdXggUEQgdGFibGUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGhhc19leHByX3RhYmxlOiAxOyAgICAgLyogc3BhY2UgaGFzICRFWFBSJCAqLyAgICAgICAKKyAgICAgICAgdW5zaWduZWQgaW50IGhhc19yYW5nZV90YWJsZTogMTsgICAgLyogc3BhY2UgaGFzICRSQU5HRSQgKi8gICAgICAgCisgICAgICAgIHVuc2lnbmVkIGludCBoYXNfY29udGV4dF90YWJsZTogMTsgIC8qIHNwYWNlIGhhcyAkU1JDX0NUWFQkICovICAgIAorICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2xpbmVzX3RhYmxlOiAxOyAgICAvKiBzcGFjZSBjb250YWlucyBhICRMSU5FUyQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCBoYXNfbHRfb2Zmc2V0X21hcDogMTsgIC8qIHNwYWNlIGNvbnRhaW5zIGFuIGx0X29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGUgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGluIHRoZSBQWERCX2hlYWRlciBpbiAkREVCVUckICovCisgICAgICAgIGludCAgICAgIHBkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGZ1bmN0aW9uIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgaW50ICAgICAgZmRfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gZmlsZSBsb29rLXVwIHRhYmxlICovCisgICAgICAgIGludCAgICAgIG1kX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG1vZHVsZSBsb29rLXVwIHRhYmxlICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgcHhkYmVkIDogMTsgICAvKiAxID0+IGZpbGUgaGFzIGJlZW4gcHJlcHJvY2Vzc2VkICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICBiaWdoZHIgOiAxOyAgIC8qIDEgPT4gdGhpcyBoZWFkZXIgY29udGFpbnMgJ3RpbWUnIHdvcmQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICBzYV9oZWFkZXIgOiAxOy8qIDEgPT4gY3JlYXRlZCBieSBTQSB2ZXJzaW9uIG9mIHB4ZGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHVzZWQgZm9yIHZlcnNpb24gY2hlY2sgaW4geGRiICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgaW5saW5lZDogMTsgICAvKiBvbmUgb3IgbW9yZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIGlubGluZWQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICBzcGFyZSA6IDI4OworICAgICAgICBpbnQgICAgICBnbG9iYWxzOyAgICAgIC8qIGluZGV4IGludG8gdGhlIEROVFQgd2hlcmUgR05UVCBiZWdpbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICB0aW1lOyAgICAgICAgIC8qIG1vZGlmeSB0aW1lIG9mIGZpbGUgYmVmb3JlIGJlaW5nIHB4ZGJlZCAqLworICAgICAgICBpbnQgICAgICBwZ19lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBsYWJlbCBsb29rLXVwIHRhYmxlICovCisgICAgICAgIGludCAgICAgIGZ1bmN0aW9uczsgICAgLyogYWN0dWFsIG51bWJlciBvZiBmdW5jdGlvbnMgKi8KKyAgICAgICAgaW50ICAgICAgZmlsZXM7ICAgICAgICAvKiBhY3R1YWwgbnVtYmVyIG9mIGZpbGVzICovCisgICAgICAgIGludCAgICAgIGNkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGNsYXNzIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgaW50ICAgICAgYWFfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gYWRkciBhbGlhcyBsb29rLXVwIHRhYmxlICovCisgICAgICAgIGludCAgICAgIG9pX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG9iamVjdCBpZCBsb29rLXVwIHRhYmxlICovCit9IERPQ19pbmZvX1BYREJfaGVhZGVyOworCisvKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBET0MgaW5mbyBhbmQgdGhlCisgKiBleGVjdXRhYmxlIGhhcyBOT1QgYmVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRE9DX2luZm9faGVhZGVyX3N0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGludCB4ZGJfaGVhZGVyOiAxOyAJLyogYml0IHNldCBpZiB0aGlzIGlzIHBvc3QtMy4xIHhkYiAqLyAKKyAgICAgICAgdW5zaWduZWQgaW50IGRvY19oZWFkZXI6IDE7ICAgICAvKiBiaXQgc2V0IGlmIHRoaXMgaXMgZG9jLXN0eWxlIGhlYWRlciovCisgICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOiA4OyAgICAgICAgICAgICAvKiB2ZXJzaW9uIG9mIGRlYnVnL2hlYWRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC4gRm9yIDEwLjAgdGhlIHZhbHVlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSAxLiBGb3IgIkRhdmlzIiB0aGUKKwkJCQkJCXZhbHVlIGlzIDIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRfZm9yX2ZsYWdzOiAxODsgLyogZm9yIGZ1dHVyZSB1c2U7IC0tIG11c3QgYmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gemVybyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCBoYXNfcmFuZ2VfdGFibGU6IDE7ICAgICAvKiBzcGFjZSBjb250YWlucyBhICRSQU5HRSQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciB2YXJpYWJsZSByYW5nZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGhhc19jb250ZXh0X3RhYmxlOiAxOyAgICAgLyogc3BhY2UgY29udGFpbnMgYSAkQ1RYVCQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNwYWNlIGZvciBjb250ZXh0L2lubGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgaGFzX2xpbmVzX3RhYmxlOiAxOyAgICAgLyogc3BhY2UgY29udGFpbnMgYSAkTElORVMkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgaGFzX2x0X29mZnNldF9tYXA6IDE7ICAgLyogc3BhY2UgY29udGFpbnMgYW4gbHRfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBsb25nICAgZ250dF9sZW5ndGg7ICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KKyAgICAgICAgbG9uZyAgIGxudHRfbGVuZ3RoOyAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCisgICAgICAgIGxvbmcgICBzbHRfbGVuZ3RoOyAgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLworICAgICAgICBsb25nICAgdnRfbGVuZ3RoOyAgICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KKyAgICAgICAgbG9uZyAgIHh0X2xlbmd0aDsgICAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCisgICAgICAgIGxvbmcgICBjdHh0X2xlbmd0aDsgIC8qIHByZXNlbnQgb25seSBpZiB2ZXJzaW9uID49IDIgKi8KKyAgICAgICAgbG9uZyAgIHJhbmdlX2xlbmd0aDsgIC8qIHByZXNlbnQgb25seSBpZiB2ZXJzaW9uID49IDIgKi8KKyAgICAgICAgbG9uZyAgIGV4cHJfbGVuZ3RoOyAgLyogcHJlc2VudCBvbmx5IGlmIHZlcnNpb24gPj0gMiAqLworCit9IERPQ19pbmZvX2hlYWRlcjsKKwordHlwZWRlZiB1bmlvbiBHZW5lcmljRGVidWdIZWFkZXJfdW5pb24KK3sKKyAgIFBYREJfaGVhZGVyICAgICAgICAgIG5vX2RvYzsKKyAgIERPQ19pbmZvX1BYREJfaGVhZGVyIGRvYzsKKyAgIFhEQl9oZWFkZXIgICAgICAgICAgIG5vX3B4ZGJfbm9fZG9jOworICAgRE9DX2luZm9faGVhZGVyICAgICAgbm9fcHhkYl9kb2M7Cit9IEdlbmVyaWNEZWJ1Z0hlYWRlcjsKKworCisvKiAgUHJvY2VkdXJlIERlc2NyaXB0b3I6CisgKgorICogIEFuIGVsZW1lbnQgb2YgdGhlIHByb2NlZHVyZSBxdWljayBsb29rLXVwIHRhYmxlCisgKi8KK3R5cGVkZWYgc3RydWN0IHF1aWNrX3Byb2NlZHVyZSB7CisgICAgICAgIGxvbmcgICAgICAgICAgICAgaXN5bTsJCS8qIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgc3ltYm9sKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGZvciBwcm9jZWR1cmUgaW4gJExOVFQkLCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBpLmUuIHRoZSBwcm9jZWR1cmUgaXRzZWxmICAqLworICAgICAgICBDT1JFX0FERFIJIGFkclN0YXJ0OwkvKiBtZW1vcnkgYWRyIG9mIHN0YXJ0IG9mIHByb2MJKi8KKyAgICAgICAgQ09SRV9BRERSCSBhZHJFbmQ7CS8qIG1lbW9yeSBhZHIgb2YgZW5kIG9mIHByb2MJKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgCSpzYkFsaWFzOwkvKiBhbGlhcyBuYW1lIG9mIHByb2NlZHVyZQkqLworICAgICAgICBjaGFyICAgICAgICAgICAgKnNiUHJvYzsJLyogcmVhbCBuYW1lIG9mIHByb2NlZHVyZQkqLworICAgICAgICBDT1JFX0FERFIJIGFkckJwOwkJLyogYWRkcmVzcyBvZiBlbnRyeSBicmVha3BvaW50ICAqLworICAgICAgICBDT1JFX0FERFIJIGFkckV4aXRCcDsJLyogYWRkcmVzcyBvZiBleGl0IGJyZWFrcG9pbnQgICAqLworCWludCAgICAgICAgICAgICAgaWNkOyAgICAgICAgICAgLyogbWVtYmVyIG9mIHRoaXMgY2xhc3MgKGluZGV4KSAqLwkKKwl1bnNpZ25lZCBpbnQJIGlwZDsJCS8qIGluZGV4IG9mIHRlbXBsYXRlIGZvciB0aGlzICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGZ1bmN0aW9uIChpbmRleCkgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludAkgdW51c2VkOiAgICA1OworICAgICAgICB1bnNpZ25lZCBpbnQJIG5vX2x0X29mZnNldDogMTsvKiBubyBlbnRyeSBpbiBsdF9vZmZzZXQgdGFibGUgKi8KKyAgICAgICAgdW5zaWduZWQgaW50CSBmVGVtcGxhdGU6IDE7CS8qIGZ1bmN0aW9uIHRlbXBsYXRlCQkqLworICAgICAgICB1bnNpZ25lZCBpbnQJIGZFeHBhbnNpb246IDE7CS8qIGZ1bmN0aW9uIGV4cGFuc2lvbgkJKi8KKwl1bnNpZ25lZCBpbnQJIGxpbmtlZAkgIDogMTsJLyogbGlua2VkIHdpdGggb3RoZXIgZXhwYW5zaW9ucwkqLworCXVuc2lnbmVkIGludAkgZHVwbGljYXRlOiAxOyAgLyogY2xvbmUgb2YgYW5vdGhlciBwcm9jZWR1cmUgICAqLworCXVuc2lnbmVkIGludAkgb3ZlcmxvYWRlZDoxOyAgLyogb3ZlcmxvYWRlZCBmdW5jdGlvbiAgICAgICAgICAqLworCXVuc2lnbmVkIGludAkgbWVtYmVyOiAgICAxOyAgLyogY2xhc3MgbWVtYmVyIGZ1bmN0aW9uICAgICAgICAqLworCXVuc2lnbmVkIGludAkgY29uc3RydWN0b3I6MTsgLyogY29uc3RydWN0b3IgZnVuY3Rpb24gICAgICAgICAqLworCXVuc2lnbmVkIGludAkgZGVzdHJ1Y3RvcjoxOyAgLyogZGVzdHJ1Y3RvciBmdW5jdGlvbiAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgU3RhdGljOiAgICAxOyAgLyogc3RhdGljIGZ1bmN0aW9uICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgVmlydHVhbDogICAxOyAgLyogdmlydHVhbCBmdW5jdGlvbiAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgY29uc3RhbnQ6ICAxOyAgLyogY29uc3RhbnQgZnVuY3Rpb24gICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgcHVyZTogICAgICAxOyAgLyogcHVyZSAodmlydHVhbCkgZnVuY3Rpb24gICAgICAqLworCXVuc2lnbmVkIGludCAgICAgbGFuZ3VhZ2U6ICA0OyAgLyogcHJvY2VkdXJlJ3MgbGFuZ3VhZ2UgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgaW5saW5lZDogICAxOyAgLyogZnVuY3Rpb24gaGFzIGJlZW4gaW5saW5lZCAgICAqLworCXVuc2lnbmVkIGludCAgICAgT3BlcmF0b3I6ICAxOyAgLyogb3BlcmF0b3IgZnVuY3Rpb24gICAgICAgICAgICAqLworCXVuc2lnbmVkIGludAkgc3R1YjogICAgICAxOyAgLyogYm9keWxlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQJIG9wdGltaXplOiAgMjsJLyogb3B0aW1pemF0aW9uIGxldmVsICAgCSovCisgICAgICAgIHVuc2lnbmVkIGludAkgbGV2ZWw6ICAgICA1OwkvKiBuZXN0aW5nIGxldmVsICh0b3A9MCkJKi8KK30gcXVpY2tfcHJvY2VkdXJlX2VudHJ5LCAqcXVpY2tfcHJvY2VkdXJlX2VudHJ5X3B0cjsKKworLyogIFNvdXJjZSBGaWxlIERlc2NyaXB0b3I6CisgKgorICogIEFuIGVsZW1lbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHF1aWNrIGxvb2stdXAgdGFibGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcXVpY2tfc291cmNlIHsKKyAgICAgICAgbG9uZwkgICAgICAgaXN5bTsJCS8qIDAtYmFzZWQgaW5kZXggaW4gJExOVFQkIG9mICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGZpcnN0IHN5bWJvbCBmb3IgdGhpcyBmaWxlICAgICovCisgICAgICAgIENPUkVfQUREUiAgICAgIGFkclN0YXJ0OwkvKiBtZW0gYWRyIG9mIHN0YXJ0IG9mIGZpbGUncyBjb2RlICovCisgICAgICAgIENPUkVfQUREUiAgICAgIGFkckVuZDsJCS8qIG1lbSBhZHIgb2YgZW5kIG9mIGZpbGUncyBjb2RlICAgKi8KKyAgICAgICAgY2hhcgkgICAgICAqc2JGaWxlOwkJLyogbmFtZSBvZiBzb3VyY2UgZmlsZQkJICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgZkhhc0RlY2w6IDE7CS8qIGRvIHdlIGhhdmUgYSAuZCBmaWxlPwkgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBmV2FybmVkOiAgMTsJLyogaGF2ZSB3YXJuZWQgYWJvdXQgYWdlIHByb2JsZW1zPyAqLworCXVuc2lnbmVkIGludCAgIGZTcmNmaWxlOiAxOyAgICAgLyogMCA9PiBpbmNsdWRlIDE9PiBzb3VyY2UgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbG5NYWM7CQkvKiBsaW5lcyBpbiBmaWxlICgwIGlmIGRvbid0IGtub3cpICovCisgICAgICAgIGludAkgICAgICAgaXBkOwkJLyogMC1iYXNlZCBpbmRleCBvZiBmaXJzdCBwcm9jZWR1cmUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgaW4gdGhpcyBmaWxlLCBpbiB0aGUgcXVpY2sgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGxvb2stdXAgdGFibGUgb2YgcHJvY2VkdXJlcyAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgKnJnTG47CQkvKiBsaW5lIHBvaW50ZXIgYXJyYXksIGlmIGFueQkgICAqLworfSBxdWlja19maWxlX2VudHJ5LCAqcXVpY2tfZmlsZV9lbnRyeV9wdHI7CisKKy8qICBNb2R1bGUgRGVzY3JpcHRvcjoKKyAqCisgKiAgQW4gZWxlbWVudCBvZiB0aGUgbW9kdWxlIHF1aWNrIHJlZmVyZW5jZSB0YWJsZQorICovCit0eXBlZGVmIHN0cnVjdCBxdWlja19tb2R1bGUgeworICAgICAgICBsb25nICAgICAgICAgICAgIGlzeW07CQkgICAvKiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0ICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBzeW1ib2wgZm9yIG1vZHVsZSAgICAgICAqLworICAgICAgICBDT1JFX0FERFIJIGFkclN0YXJ0OwkgICAvKiBhZHIgb2Ygc3RhcnQgb2YgbW9kLgkqLworICAgICAgICBDT1JFX0FERFIJIGFkckVuZDsJICAgLyogYWRyIG9mIGVuZCBvZiBtb2QuCSovCisgICAgICAgIGNoYXIJICAgICAgICAqc2JBbGlhczsJICAgLyogYWxpYXMgbmFtZSBvZiBtb2R1bGUgICAJKi8KKyAgICAgICAgY2hhcgkgICAgICAgICpzYk1vZDsJCSAgIC8qIHJlYWwgbmFtZSBvZiBtb2R1bGUJKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICBpbXBvcnRzOiAgICAgICAxOyAvKiBtb2R1bGUgaGF2ZSBhbnkgaW1wb3J0cz8gICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgdmFyc19pbl9mcm9udDogMTsgLyogbW9kdWxlIGdsb2JhbHMgaW4gZnJvbnQ/ICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHZhcnNfaW5fZ2FwczogIDE7IC8qIG1vZHVsZSBnbG9iYWxzIGluIGdhcHM/ICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICBsYW5ndWFnZTogICAgICA0OyAvKiB0eXBlIG9mIGxhbmd1YWdlICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgdW51c2VkICAgICAgOiAyNTsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgICB1bnVzZWQyOwkgICAvKiBzcGFjZSBmb3IgZnV0dXJlIHN0dWZmCSovCit9IHF1aWNrX21vZHVsZV9lbnRyeSwgKnF1aWNrX21vZHVsZV9lbnRyeV9wdHI7CisKKy8qICBBdXhpbGlhcnkgUHJvY2VkdXJlIERlc2NyaXB0b3I6CisgKgorICogIEFuIGVsZW1lbnQgb2YgdGhlIGF1eGlsaWFyeSBwcm9jZWR1cmUgcXVpY2sgbG9vay11cCB0YWJsZQorICovCit0eXBlZGVmIHN0cnVjdCBxdWlja19hdXhfcHJvY2VkdXJlIHsKKyAgICAgICAgbG9uZwkgaXN5bV9pbmxuOwkvKiBzdGFydCBvbiBpbmxpbmUgbGlzdCBmb3IgcHJvYyAqLworCWxvbmcgICAgIHNwYXJlOworfSBxdWlja19hdXhfcHJvY2VkdXJlX2VudHJ5LCAqcXVpY2tfYXV4X3Byb2NlZHVyZV9lbnRyeV9wdHI7CisKKy8qICBQYXJhZ3JhcGggRGVzY3JpcHRvcjoKKyAqCisgKiAgQW4gZWxlbWVudCBvZiB0aGUgcGFyYWdyYXBoIHF1aWNrIGxvb2stdXAgdGFibGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcXVpY2tfcGFyYWdyYXBoIHsKKyAgICAgICAgbG9uZyAgICAgICAgICAgICBpc3ltOyAgICAgICAvKiBmaXJzdCBzeW1ib2wgZm9yIGxhYmVsIChpbmRleCkgICovCisgICAgICAgIENPUkVfQUREUiAgICAgICAgYWRyU3RhcnQ7ICAgLyogbWVtb3J5IGFkciBvZiBzdGFydCBvZiBsYWJlbCAgICAqLworICAgICAgICBDT1JFX0FERFIgICAgICAgIGFkckVuZDsgICAgIC8qIG1lbW9yeSBhZHIgb2YgZW5kIG9mIGxhYmVsICAgICAgKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgICpzYkxhYjsgICAgICAvKiBuYW1lIG9mIGxhYmVsICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICAgaW5zdDsgICAgICAgLyogVXNlZCBpbiB4ZGIgdG8gc3RvcmUgaW5zdCBAIGJwICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHNlY3Q6ICAgIDE7IC8qIHRydWUgPSBzZWN0aW9uLCBmYWxzZSA9IHBhcmFnLiAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICB1bnVzZWQ6IDMxOyAvKiBmdXR1cmUgdXNlICAgICAgICAgICAgICAgICAgICAgICovCit9IHF1aWNrX3BhcmFncmFwaF9lbnRyeSwgKnF1aWNrX3BhcmFncmFwaF9lbnRyeV9wdHI7CisKKy8qCisgKiAgQ2xhc3MgRGVzY3JpcHRvcjoKKyAqCisgKiAgQW4gZWxlbWVudCBvZiB0aGUgY2xhc3MgcXVpY2sgbG9vay11cCB0YWJsZQorICovCit0eXBlZGVmIHN0cnVjdCBxdWlja19jbGFzcyB7CisgICAgICAgIGNoYXIJICAgICAgICAgKnNiQ2xhc3M7CS8qIG5hbWUgb2YgY2xhc3MJICAgICAgICAqLworICAgICAgICBsb25nICAgICAgICAgICAgICBpc3ltOyAgICAgICAgIC8qIGNsYXNzIHN5bWJvbCAodGFnKSAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQJICB0eXBlIDogMjsJLyogMD1jbGFzcywgMT11bmlvbiwgMj1zdHJ1Y3QgICAqLworCXVuc2lnbmVkIGludAkgIGZUZW1wbGF0ZSA6IDE7LyogY2xhc3MgdGVtcGxhdGUgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludAkgIGV4cGFuc2lvbiA6IDE7LyogdGVtcGxhdGUgZXhwYW5zaW9uICAgICAgICAgICAqLworCXVuc2lnbmVkIGludAkgIHVudXNlZCAgICA6Mjg7CisJc2x0cG9pbnRlciAgICAgICAgbG93c2NvcGU7CS8qIGJlZ2lubmluZyBvZiBkZWZpbmVkIHNjb3BlICAgKi8KKwlzbHRwb2ludGVyICAgICAgICBoaXNjb3BlOwkvKiBlbmQgb2YgZGVmaW5lZCBzY29wZSAgICAgICAgICovCit9IHF1aWNrX2NsYXNzX2VudHJ5LCAqcXVpY2tfY2xhc3NfZW50cnlfcHRyOworCisvKiAgQWRkcmVzcyBBbGlhcyBFbnRyeQorICoKKyAqICBBbiBlbGVtZW50IG9mIHRoZSBhZGRyZXNzIGFsaWFzIHF1aWNrIGxvb2stdXAgdGFibGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcXVpY2tfYWxpYXMgeworCUNPUkVfQUREUiAgICAgICBsb3c7CisJQ09SRV9BRERSICAgICAgIGhpZ2g7CisJaW50ICAgICAgICAgICAgIGluZGV4OworCXVuc2lnbmVkIGludAl1bnVzZWQgOiAzMTsKKwl1bnNpZ25lZCBpbnQJYWx0ZXJuYXRlIDogMTsJLyogYWx0ZXJuYXRlIHVubmFtZWQgYWxpYXNlcz8gICAqLworfSBxdWlja19hbGlhc19lbnRyeSwgKnF1aWNrX2FsaWFzX2VudHJ5X3B0cjsKKworLyogIE9iamVjdCBJZGVudGlmaWNhdGlvbiBFbnRyeQorICoKKyAqICBBbiBlbGVtZW50IG9mIHRoZSBvYmplY3QgaWRlbnRpZmljYXRpb24gcXVpY2sgbG9vay11cCB0YWJsZQorICovCisKK3R5cGVkZWYgc3RydWN0IHF1aWNrX29ial9JRCB7CisJQ09SRV9BRERSICAgIG9ial9pZGVudDsJCS8qIGNsYXNzIGlkZW50aWZpZXIgICAgICAgICAqLworCWxvbmcgICAgICAgICBpc3ltOwkJLyogY2xhc3Mgc3ltYm9sICAgICAgICAgICAgICovCisJbG9uZyAgICAgICAgIG9mZnNldDsJCS8qIG9mZnNldCB0byBvYmplY3Qgc3RhcnQgICAqLworfSBxdWlja19vYmpfSURfZW50cnksICpxdWlja19vYmpfSURfZW50cnlfcHRyOworCisKKyNlbmRpZiAvKiBIUF9TWU1UQUJfSU5DTFVERUQgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pZWVlLmggYi9pbmNsdWRlL2llZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWRlMzlkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9pZWVlLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qIElFRUUgU3RhbmRhcmQgNjk1LTE5ODAgIlVuaXZlcnNhbCBGb3JtYXQgZm9yIE9iamVjdCBNb2R1bGVzIiBoZWFkZXIgZmlsZQorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLworCisjZGVmaW5lIE5fV19WQVJJQUJMRVMgOAorI2RlZmluZSBNb2R1bGVfQmVnaW5uaW5nIDB4ZTAKKwordHlwZWRlZiBzdHJ1Y3QgaWVlZV9tb2R1bGUgeworICBjaGFyICpwcm9jZXNzb3I7CisgIGNoYXIgKm1vZHVsZV9uYW1lOworfSBpZWVlX21vZHVsZV9iZWdpbl90eXBlOworCisjZGVmaW5lIEFkZHJlc3NfRGVzY3JpcHRvciAweGVjCit0eXBlZGVmIHN0cnVjdCBpZWVlX2FkZHJlc3MgeworYmZkX3ZtYSBudW1iZXJfb2ZfYml0c19tYXU7CisgYmZkX3ZtYSBudW1iZXJfb2ZfbWF1c19pbl9hZGRyZXNzOworCisgIHVuc2lnbmVkIGNoYXIgYnl0ZV9vcmRlcjsKKyNkZWZpbmUgSUVFRV9MSVRUTEUgMHhjYworI2RlZmluZSBJRUVFX0JJRyAweGNkCit9IGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX3R5cGU7CisKK3R5cGVkZWYgdW5pb24gaWVlZV93X3ZhcmlhYmxlIHsKKyAgZmlsZV9wdHIgb2Zmc2V0W05fV19WQVJJQUJMRVNdOworICBzdHJ1Y3QgeworICAgIGZpbGVfcHRyIGV4dGVuc2lvbl9yZWNvcmQ7CisgICAgZmlsZV9wdHIgZW52aXJvbm1lbnRhbF9yZWNvcmQ7CisgICAgZmlsZV9wdHIgc2VjdGlvbl9wYXJ0OworICAgIGZpbGVfcHRyIGV4dGVybmFsX3BhcnQ7CisgICAgZmlsZV9wdHIgZGVidWdfaW5mb3JtYXRpb25fcGFydDsKKyAgICBmaWxlX3B0ciBkYXRhX3BhcnQ7CisgICAgZmlsZV9wdHIgdHJhaWxlcl9wYXJ0OworICAgIGZpbGVfcHRyIG1lX3JlY29yZDsKKyAgfSByOworfSBpZWVlX3dfdmFyaWFibGVfdHlwZTsKKworCisKKworCit0eXBlZGVmIGVudW0gaWVlZV9yZWNvcmQKK3sgCisgIGllZWVfbnVtYmVyX3N0YXJ0X2VudW0gPSAweDAwLAorICBpZWVlX251bWJlcl9lbmRfZW51bT0weDdmLAorICBpZWVlX251bWJlcl9yZXBlYXRfc3RhcnRfZW51bSA9IDB4ODAsCisgIGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSA9IDB4ODgsCisgIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW0gPSAweDg0LAorICBpZWVlX251bWJlcl9yZXBlYXRfM19lbnVtID0gMHg4MywKKyAgaWVlZV9udW1iZXJfcmVwZWF0XzJfZW51bSA9IDB4ODIsCisgIGllZWVfbnVtYmVyX3JlcGVhdF8xX2VudW0gPSAweDgxLAorICBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSA9IDB4ZTAsCisgIGllZWVfbW9kdWxlX2VuZF9lbnVtID0gMHhlMSwKKyAgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSA9IDB4ZGUsCisgIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8yX2VudW0gPSAweGRmLAorICBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtID0gMHhlNiwKKyAgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtID0gMHhlNywKKyAgaWVlZV9leHRlcm5hbF9zeW1ib2xfZW51bSA9IDB4ZTgsCisgIGllZWVfY29tbWEgPSAweDkwLAorICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtID0gMHhlOSwKKyAgaWVlZV9zZXRfY3VycmVudF9zZWN0aW9uX2VudW0gPSAweGU1LAorICBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtID0gMHhlYywKKyAgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gPSAweGVkLAorICBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0gPSAweGU0LAorCisgIGllZWVfdmFyaWFibGVfQV9lbnVtID0gMHhjMSwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9CX2VudW0gPSAweGMyLAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX0NfZW51bSA9IDB4YzMsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfRF9lbnVtID0gMHhjNCwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9FX2VudW0gPSAweGM1LAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX0ZfZW51bSA9IDB4YzYsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfR19lbnVtID0gMHhjNywJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9IX2VudW0gPSAweGM4LAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX0lfZW51bSA9IDB4YzksCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfSl9lbnVtID0gMHhjYSwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9LX2VudW0gPSAweGNiLAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX0xfZW51bSA9IDB4Y2MsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfTV9lbnVtID0gMHhjZCwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9OX2VudW0gPSAweGNlLAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX09fZW51bSA9IDB4Y2YsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfUF9lbnVtID0gMHhkMCwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9RX2VudW0gPSAweGQxLAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX1JfZW51bSA9IDB4ZDIsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfU19lbnVtID0gMHhkMywJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9UX2VudW0gPSAweGQ0LAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX1VfZW51bSA9IDB4ZDUsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfVl9lbnVtID0gMHhkNiwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9XX2VudW0gPSAweGQ3LAkJCSAgICAgICAgICAgICAgIAorICBpZWVlX3ZhcmlhYmxlX1hfZW51bSA9IDB4ZDgsCQkJICAgICAgICAgICAgICAgCisgIGllZWVfdmFyaWFibGVfWV9lbnVtID0gMHhkOSwJCQkgICAgICAgICAgICAgICAKKyAgaWVlZV92YXJpYWJsZV9aX2VudW0gPSAweGRhLAorICBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bSA9IDB4YTUsCisgIGllZWVfZnVuY3Rpb25fbWludXNfZW51bSA9IDB4YTYsCisgIGllZWVfZnVuY3Rpb25fc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYSwKKyAgaWVlZV9mdW5jdGlvbl9zaWduZWRfY2xvc2VfYl9lbnVtID0gMHhiYiwKKworICBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtID0gMHhiYywKKyAgaWVlZV9mdW5jdGlvbl91bnNpZ25lZF9jbG9zZV9iX2VudW0gPSAweGJkLAorCisgIGllZWVfZnVuY3Rpb25fZWl0aGVyX29wZW5fYl9lbnVtID0gMHhiZSwKKyAgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtID0gMHhiZiwKKyAgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0gPSAweGRiLAorCisgIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtID0gMHhlMiwKKyAgaWVlZV9zZWN0aW9uX3NpemVfZW51bSA9IDB4ZTJkMywKKyAgaWVlZV9waHlzaWNhbF9yZWdpb25fc2l6ZV9lbnVtID0gMHhlMmMxLAorICBpZWVlX3JlZ2lvbl9iYXNlX2FkZHJlc3NfZW51bSA9IDB4ZTJjMiwKKyAgaWVlZV9tYXVfc2l6ZV9lbnVtID0gMHhlMmM2LAorICBpZWVlX21fdmFsdWVfZW51bSA9IDB4ZTJjZCwKKyAgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtID0gMHhlMmNjLAorICBpZWVlX2Fzbl9yZWNvcmRfZW51bSA9IDB4ZTJjZSwKKyAgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtID0gMHhlMmQyLAorICBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSA9IDB4ZTJjNywKKyAgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSA9IDB4ZTJkNywKKyAgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID0gMHhlMmQwLAorICBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtID0gMHhlMmM5LAorICBpZWVlX25uX3JlY29yZCA9IDB4ZjAsCisgIGllZWVfYXRfcmVjb3JkX2VudW0gPSAweGYxLAorICBpZWVlX3R5X3JlY29yZF9lbnVtID0gMHhmMiwKKyAgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPSAweGYxYzksCisgIGllZWVfYXRuX3JlY29yZF9lbnVtID0gMHhmMWNlLAorICBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX3JlY29yZF9lbnVtID0gMHhmMWQ4LAorICBpZWVlX3dlYWtfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW09IDB4ZjQsCisgIGllZWVfcmVwZWF0X2RhdGFfZW51bSA9IDB4ZjcsCisgIGllZWVfYmJfcmVjb3JkX2VudW0gPSAweGY4LAorICBpZWVlX2JlX3JlY29yZF9lbnVtID0gMHhmOQorfSBpZWVlX3JlY29yZF9lbnVtX3R5cGU7CisJCSAKKwordHlwZWRlZiBzdHJ1Y3QgaWVlZV9zZWN0aW9uIHsKKyAgdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7CisgIHVuc2lnbmVkIGludCBzZWN0aW9uX3R5cGU7CisgIGNoYXIgKnNlY3Rpb25fbmFtZTsKKyAgdW5zaWduZWQgaW50IHBhcmVudF9zZWN0aW9uX2luZGV4OworICB1bnNpZ25lZCBpbnQgc2libGluZ19zZWN0aW9uX2luZGV4OworICB1bnNpZ25lZCBpbnQgY29udGV4dF9pbmRleDsKK30gaWVlZV9zZWN0aW9uX3R5cGU7CisjZGVmaW5lIElFRUVfUkVGRVJFTkNFX0JBU0UgMTEKKyNkZWZpbmUgSUVFRV9QVUJMSUNfQkFTRSAzMgorI2RlZmluZSBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UgMQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYmliZXJ0eS5oIGIvaW5jbHVkZS9saWJpYmVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMxMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saWJpYmVydHkuaApAQCAtMCwwICsxLDE4MCBAQAorLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBsaWJpYmVydHkuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LCAxOTk0LgorCisgICBUaGUgbGliaWJlcnR5IGxpYnJhcnkgcHJvdmlkZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZQorICAgbWlzc2luZyBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiAgV2UgZG8gbm90IGRlY2xhcmUgdGhvc2UgaGVyZSwKKyAgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG9uIG9wZXJhdGluZworICAgc3lzdGVtcyB0aGF0IGRvIHN1cHBvcnQgdGhvc2UgZnVuY3Rpb25zLiAgSW4gdGhpcyBmaWxlIHdlIG9ubHkKKyAgIGRlY2xhcmUgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBsaWJpYmVydHkuICAqLworCisjaWZuZGVmIExJQklCRVJUWV9ICisjZGVmaW5lIExJQklCRVJUWV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKy8qIEJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nLiAgQWxsb2NhdGVzIG1lbW9yeSB1c2luZworICAgbWFsbG9jLiAgVXNlIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCisKK2V4dGVybiBjaGFyICoqYnVpbGRhcmd2IFBBUkFNUyAoKGNoYXIgKikpOworCisvKiBGcmVlIGEgdmVjdG9yIHJldHVybmVkIGJ5IGJ1aWxkYXJndi4gICovCisKK2V4dGVybiB2b2lkIGZyZWVhcmd2IFBBUkFNUyAoKGNoYXIgKiopKTsKKworLyogRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gQWxsb2NhdGVzIG1lbW9yeSB1c2luZyBtYWxsb2MuICBVc2UKKyAgIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCisKK2V4dGVybiBjaGFyICoqZHVwYXJndiBQQVJBTVMgKChjaGFyICoqKSk7CisKKworLyogUmV0dXJuIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGggbmFtZS4gIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYQorICAgcHJvdG90eXBlIGhlcmUgYmVjYXVzZSB0aGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5CisgICBhY3Jvc3MgZGlmZmVyZW50IHN5c3RlbXMsIHNvbWV0aW1lcyBhcyAiY2hhciAqIiBhbmQgc29tZXRpbWVzIGFzCisgICAiY29uc3QgY2hhciAqIiAqLworCisjaWYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fICkgfHwgZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQorZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworI2Vsc2UKK2V4dGVybiBjaGFyICpiYXNlbmFtZSAoKTsKKyNlbmRpZgorCisvKiBDb25jYXRlbmF0ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHN0cmluZ3MsIHVwIHRvIChjaGFyICopIE5VTEwuCisgICBBbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIHhtYWxsb2MuICAqLworCitleHRlcm4gY2hhciAqY29uY2F0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7CisKKy8qIENoZWNrIHdoZXRoZXIgdHdvIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4gICovCisKK2V4dGVybiBpbnQgZmRtYXRjaCBQQVJBTVMgKChpbnQgZmQxLCBpbnQgZmQyKSk7CisKKy8qIEdldCB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIHByb2Nlc3MgaGFzIHJ1biwgaW4gbWljcm9zZWNvbmRzLiAgKi8KKworZXh0ZXJuIGxvbmcgZ2V0X3J1bl90aW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogQ2hvb3NlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIHNjcmF0Y2ggZmlsZXMuICAqLworCitleHRlcm4gY2hhciAqY2hvb3NlX3RlbXBfYmFzZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmaWxsZWQgd2l0aCBzcGFjZXMuICBBbGxvY2F0ZXMgdXNpbmcgbWFsbG9jLiAgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYWNlcyBQQVJBTVMgKChpbnQgY291bnQpKTsKKworLyogUmV0dXJuIHRoZSBtYXhpbXVtIGVycm9yIG51bWJlciBmb3Igd2hpY2ggc3RyZXJyb3Igd2lsbCByZXR1cm4gYQorICAgc3RyaW5nLiAgKi8KKworZXh0ZXJuIGludCBlcnJub19tYXggUEFSQU1TICgodm9pZCkpOworCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUgKGUuZy4sIHN0cmVycm5vIChFSU5WQUwpIHJldHVybnMKKyAgICJFSU5WQUwiKS4gICovCisKK2V4dGVybiBjb25zdCBjaGFyICpzdHJlcnJubyBQQVJBTVMgKChpbnQpKTsKKworLyogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUsIHJldHVybiB0aGUgdmFsdWUuICAqLworCitleHRlcm4gaW50IHN0cnRvZXJybm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKy8qIEFOU0kncyBzdHJlcnJvcigpLCBidXQgbW9yZSByb2J1c3QuICAqLworCitleHRlcm4gY2hhciAqeHN0cmVycm9yIFBBUkFNUyAoKGludCkpOworCisvKiBSZXR1cm4gdGhlIG1heGltdW0gc2lnbmFsIG51bWJlciBmb3Igd2hpY2ggc3Ryc2lnbmFsIHdpbGwgcmV0dXJuIGEKKyAgIHN0cmluZy4gICovCisKK2V4dGVybiBpbnQgc2lnbm9fbWF4IFBBUkFNUyAoKHZvaWQpKTsKKworLyogUmV0dXJuIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nIGZvciBhIHNpZ25hbCBudW1iZXIKKyAgIChlLmcuLCBzdHJzaWduYWwgKFNJR0hVUCkgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAiSGFuZ3VwIikuICAqLworLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGFzIGl0IGNhbiBjb25mbGljdCB3aXRoIG9uZSBpbiBzeXN0ZW0gaGVhZGVycy4KKyAgIFdlIHN0aWxsIGRvY3VtZW50IGl0cyBleGlzdGVuY2UgdGhvdWdoLiAgKi8KKworLypleHRlcm4gY29uc3QgY2hhciAqc3Ryc2lnbmFsIFBBUkFNUyAoKGludCkpOyovCisKKy8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHNpZ25hbCBudW1iZXIgKGUuZy4sIHN0cnNpZ25vIChTSUdIVVApIHJldHVybnMKKyAgICJTSUdIVVAiKS4gICovCisKK2V4dGVybiBjb25zdCBjaGFyICpzdHJzaWdubyBQQVJBTVMgKChpbnQpKTsKKworLyogR2l2ZW4gdGhlIG5hbWUgb2YgYSBzaWduYWwsIHJldHVybiBpdHMgbnVtYmVyLiAgKi8KKworZXh0ZXJuIGludCBzdHJ0b3NpZ25vIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIHJ1biBieSB4ZXhpdC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLiAgKi8KKworZXh0ZXJuIGludCB4YXRleGl0IFBBUkFNUyAoKHZvaWQgKCpmbikgKHZvaWQpKSk7CisKKy8qIEV4aXQsIGNhbGxpbmcgYWxsIHRoZSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHhhdGV4aXQuICAqLworCisjaWZuZGVmIF9fR05VQ19fCitleHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSk7CisjZWxzZQordm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CisjZW5kaWYKKworLyogU2V0IHRoZSBwcm9ncmFtIG5hbWUgdXNlZCBieSB4bWFsbG9jLiAgKi8KKworZXh0ZXJuIHZvaWQgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCisvKiBBbGxvY2F0ZSBtZW1vcnkgd2l0aG91dCBmYWlsLiAgSWYgbWFsbG9jIGZhaWxzLCB0aGlzIHdpbGwgcHJpbnQgYQorICAgbWVzc2FnZSB0byBzdGRlcnIgKHVzaW5nIHRoZSBuYW1lIHNldCBieSB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUsCisgICBpZiBhbnkpIGFuZCB0aGVuIGNhbGwgeGV4aXQuICAqLworCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisvKiBHZXQgYSBkZWZpbml0aW9uIGZvciBzaXplX3QuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitleHRlcm4gUFRSIHhtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CisKKy8qIFJlYWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbC4gIFRoaXMgd29ya3MgbGlrZSB4bWFsbG9jLgorCisgICBGSVhNRTogV2UgZG8gbm90IGRlY2xhcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzCisgICB4bWFsbG9jLiAgKi8KKworZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworCisvKiBBbGxvY2F0ZSBtZW1vcnkgd2l0aG91dCBmYWlsIGFuZCBzZXQgaXQgdG8gemVyby4gIFRoaXMgd29ya3MgbGlrZQorICAgeG1hbGxvYy4gICovCisKK2V4dGVybiBQVFIgeGNhbGxvYyBQQVJBTVMgKChzaXplX3QsIHNpemVfdCkpOworCisvKiBDb3B5IGEgc3RyaW5nIGludG8gYSBtZW1vcnkgYnVmZmVyIHdpdGhvdXQgZmFpbC4gICovCisKK2V4dGVybiBjaGFyICp4c3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCisvKiBoZXggY2hhcmFjdGVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLworCisjZGVmaW5lIF9oZXhfYXJyYXlfc2l6ZSAyNTYKKyNkZWZpbmUgX2hleF9iYWQJOTkKK2V4dGVybiBjaGFyIF9oZXhfdmFsdWVbX2hleF9hcnJheV9zaXplXTsKK2V4dGVybiB2b2lkIGhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKKyNkZWZpbmUgaGV4X3AoYykJKGhleF92YWx1ZSAoYykgIT0gX2hleF9iYWQpCisvKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG5vdGUgd2VsbDogU29tZSBjb2RlIHJlbGllcyBvbiBzaWRlIGVmZmVjdHMgaW4KKyAgIHRoZSBhcmd1bWVudCBiZWluZyBwZXJmb3JtZWQgZXhhY3RseSBvbmNlLiAgKi8KKyNkZWZpbmUgaGV4X3ZhbHVlKGMpCShfaGV4X3ZhbHVlWyh1bnNpZ25lZCBjaGFyKSAoYyldKQorCisvKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBwZXhlY3V0ZSByb3V0aW5lLiAgKi8KKworI2RlZmluZSBQRVhFQ1VURV9GSVJTVCAgIDEKKyNkZWZpbmUgUEVYRUNVVEVfTEFTVCAgICAyCisjZGVmaW5lIFBFWEVDVVRFX09ORSAgICAgKFBFWEVDVVRFX0ZJUlNUICsgUEVYRUNVVEVfTEFTVCkKKyNkZWZpbmUgUEVYRUNVVEVfU0VBUkNIICA0CisjZGVmaW5lIFBFWEVDVVRFX1ZFUkJPU0UgOAorCisvKiBFeGVjdXRlIGEgcHJvZ3JhbS4gICovCisKK2V4dGVybiBpbnQgcGV4ZWN1dGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICogY29uc3QgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgY2hhciAqKiwgaW50KSk7CisKKy8qIFdhaXQgZm9yIHBleGVjdXRlIHRvIGZpbmlzaC4gICovCisKK2V4dGVybiBpbnQgcHdhaXQgUEFSQU1TICgoaW50LCBpbnQgKiwgaW50KSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCSUJFUlRZX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9DaGFuZ2VMb2cgYi9pbmNsdWRlL21wdy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiYWQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbXB3L0NoYW5nZUxvZwpAQCAtMCwwICsxLDYxIEBACitUdWUgRmViIDI3IDEyOjIzOjA0IDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIG1wdy5oIChIQVZFX1ZQUklOVEYpOiBBZGQgYW5kIGRlZmluZSB0byBoYXZlIHRoZSB2YWx1ZSAxLgorCitGcmkgRGVjIDI5IDE0OjQwOjQ2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LmggKEhBVkVfU1RETElCX0gsIGV0Yyk6IERlZmluZSB0byBoYXZlIHRoZSB2YWx1ZSAxLgorCShIQVZFX0ZDTlRMX0gpOiBEZWZpbmUuCisKK01vbiBEZWMgMTEgMTU6Mzk6MDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHcuaCAob3BlbiwgYWNjZXNzKTogRGVmaW5lIGFzIG1wd19vcGVuIGFuZCBtcHdfYWNjZXNzLgorCitUaHUgTm92ICA5IDE1OjM4OjM3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3Lmg6IEluY2x1ZGUgdW5peC5oIGlmIFVTRV9NV19IRUFERVJTLCBvdGhlcndpc2UgaW5jbHVkZQorCXZhcmlvdXMgb3JpZ2luYWwgTVBXIGluY2x1ZGUgZmlsZXMgKGlvY3RsLmgsIGV0YykuCisJKEVJTyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KKwkqIHN5cy9pb2N0bC5oOiBSZW1vdmUsIG5vdCBuZWVkZWQuCisKK1dlZCBPY3QgMjUgMTI6MzA6NDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHcuaDogRG9uJ3QgaW5jbHVkZSBlcnJuby5oIG9yIGlvY3RsLmguCisJKEVOT0VOVCwgRUFDQ0VTLCBFTk9TWVMpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisJKGZkb3Blbik6IERlY2xhcmUgaWYgX19TVERDX18uCisJKFJfT0ssIFdfT0ssIFhfT0spOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisKK1R1ZSBTZXAgMjYgMTQ6NTc6MjEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHcuaDogTmV3IGZpbGUsIHVuaXZlcnNhbGx5IHVzZWZ1bCBNUFcgaG9zdCBkZWZpbml0aW9ucy4KKwlNYW55IG9mIHRoZXNlIHVzZWQgdG8gbGl2ZSBpbiBiZmQvaG9zdHMvbXB3LmguCisJKiBncnAuaDogUmVtb3ZlIFJDUyBjb21tZW50LgorCSogc3lzL2lvY3RsLmg6IEFkZCBhIGNvbW1lbnQgbGluZS4KKworV2VkIERlYyAxNCAxMzoxMjoxNCAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNwaW4uaDogTmV3IGZpbGUsIGN1cnNvciBzcGlubmluZyBmb3IgcHJvZ3Jlc3MuCisKK1RodSBKdW4gMzAgMTU6MzI6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBmY250bC5oIChvcGVuKTogQWxsb3cgb3B0aW9uYWwgdGhpcmQgYXJnLgorCitUaHUgQXByIDE0IDEyOjU0OjUxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogZGlyLmgsIGRpcmVudC5oLCBmY250bC5oLCBncnAuaCwgcHdkLmgsIHN0YXQuaDogTmV3IGZpbGVzLgorCSogc3lzL2lvY3RsLmg6IE5ldyBmaWxlLgorCitNb24gRmViIDIxIDA5OjQ0OjQ1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogc3lzL3N0YXQuaCAoc3RydWN0IHN0YXQpOiBOZXcgZmllbGQgc3RfcnNpemUuCisJKFNfSUZNVCwgZXRjKTogVXNlIGRpZmZlcmVudCBiaXQgcG9zaXRpb25zLgorCShmc3RhdCk6IEFkZCBwYXJhbWV0ZXIgbmFtZXMgdG8gcHJvdG90eXBlLgorCitNb24gSmFuIDMxIDE5OjMwOjE2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiBOZXcgZmlsZS4KKwkqIHV0aW1lLmgsIHZhcmFyZ3MuaDogTmV3IGZpbGVzLCBzaW11bGF0ZWQgUG9zaXguCisJKiBzeXMve2ZpbGUscGFyYW0scmVzb3VyY2Usc3RhdCx0aW1lLHR5cGVzfS5oOiBOZXcgZmlsZXMsIG1vcmUKKwlzaW11bGF0ZWQgUG9zaXguCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvUkVBRE1FIGIvaW5jbHVkZS9tcHcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTkyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wdy9SRUFETUUKQEAgLTAsMCArMSBAQAorVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgaW5jbHVkZSBmaWxlcyB0aGF0IGhlbHAgaW1pdGF0ZSBQb3NpeCBpbiBNUFcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9kaXIuaCBiL2luY2x1ZGUvbXB3L2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Y2NkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wdy9kaXIuaApAQCAtMCwwICsxLDIzIEBACisvKiBUaGUgPGRpci5oPiBoZWFkZXIgZ2l2ZXMgdGhlIGxheW91dCBvZiBhIGRpcmVjdG9yeS4gKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgX0RJUl9ICisjZGVmaW5lIF9ESVJfSAorCisjaWZuZGVmIF9UWVBFU19ICQkvKiBub3QgcXVpdGUgcmlnaHQgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjZGVmaW5lCURJUkJMS1NJWgk1MTIJLyogc2l6ZSBvZiBkaXJlY3RvcnkgYmxvY2sgKi8KKworI2lmbmRlZiBESVJTSVoKKyNkZWZpbmUJRElSU0laCTE0CisjZW5kaWYKKworc3RydWN0IGRpcmVjdCB7CisgIGlub190IGRfaW5vOworICBjaGFyIGRfbmFtZVtESVJTSVpdOworfTsKKworI2VuZGlmIC8qIF9ESVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZGlyZW50LmggYi9pbmNsdWRlL21wdy9kaXJlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODAwMGIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvZGlyZW50LmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfX2RpcmVudF9oCisjZGVmaW5lIF9fZGlyZW50X2gKKworI2luY2x1ZGUgInN5cy9kaXIuaCIKKworc3RydWN0IGRpcmVudCB7CisgIGxvbmcgZF9pbm87CQkJLyogaW5vZGUgbnVtYmVyIG9mIGVudHJ5ICovCisgIG9mZl90CWRfb2ZmOwkJCS8qIG9mZnNldCBvZiBkaXNrIGRpcmVjdG9yeSBlbnRyeSAqLworICB1bnNpZ25lZCBzaG9ydCBkX3JlY2xlbjsJLyogbGVuZ3RoIG9mIHRoaXMgcmVjb3JkICovCisgIGNoYXIgZF9uYW1lWzFdOwkJLyogbmFtZSBvZiBmaWxlICovCit9OworCisvKgorI2RlZmluZQlESVJFTlRCQVNFU0laRSBcCisJKCgoc3RydWN0IGRpcmVudCAqKSAwKS0+ZF9uYW1lIC0gKGNoYXIgKikgMCkKKyNkZWZpbmUJRElSRU5UU0laRShuYW1lbGVuKSBcCisJKChESVJFTlRCQVNFU0laRSArIChuYW1lbGVuKSArIE5CUFcpICYgfihOQlBXIC0gMSkpCisqLworCisvKiBmcm9tIE1pcHMgcG9zaXgvZGlyZW50LmggKi8KKworLyoKKyN1bmRlZiByZXdpbmRkaXIKKyovCisKK2V4dGVybiBESVIgKm9wZW5kaXIoKTsKK2V4dGVybiBzdHJ1Y3QgZGlyZW50ICpyZWFkZGlyKCk7CitleHRlcm4gdm9pZAkJcmV3aW5kZGlyKCk7CitleHRlcm4gaW50CQljbG9zZWRpcigpOworCisjZW5kaWYgLyogISBfX2RpcmVudF9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9mY250bC5oIGIvaW5jbHVkZS9tcHcvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDk5OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvZmNudGwuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIEZDbnRsLmggLS0gZmFjY2VzcygpLCBmY250bCgpLCBhbmQgb3BlbigpIG1vZGUgZmxhZ3MKKyAqCisgKiBQb3J0aW9ucyBjb3B5cmlnaHQgQW1lcmljYW4gVGVsZXBob25lICYgVGVsZWdyYXBoCisgKiBVc2VkIHdpdGggcGVybWlzc2lvbiwgQXBwbGUgQ29tcHV0ZXIgSW5jLiAoMTk4NSwxOTg4LDE5OTAsMTk5MikKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfX0ZDTlRMX18KKyNkZWZpbmUgX19GQ05UTF9fCisKKyNpZm5kZWYgX19UWVBFU19fCisjaW5jbHVkZSA8VHlwZXMuaD4KKyNlbmRpZgorCisvKgorICoJRm9yIHVzZSBieSBsc2VlaygpOgorICovCisKKyNpZm5kZWYgX19TVERJT19fCQkJLyogdGhlc2UgZGVmbnMgZXhhY3RseSBwYXJhbGxlZCBpbiBTdGRJTy5oIGZvciBmc2VlaygpICovCisjZGVmaW5lIFNFRUtfQ1VSCTEKKyNkZWZpbmUgU0VFS19FTkQJMgorI2RlZmluZSBTRUVLX1NFVAkwCisjZW5kaWYKKworLyoKKyAqIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIGdlbmVyYWwgdXNlCisgKi8KKyAJCQkJCS8qICdkJyA9PiAiZGlyZWN0b3J5IiBvcHMgKi8KKyNkZWZpbmUgRl9ERUxFVEUJCSgoJ2QnPDw4KXwweDAxKQorI2RlZmluZSBGX1JFTkFNRQkJKCgnZCc8PDgpfDB4MDIpCisKKy8qCisgKiBtb3JlIGZhY2Nlc3MoKSBjb21tYW5kczsgZm9yIHVzZSBvbmx5IGJ5IE1QVyB0b29scworICovCisgCisjZGVmaW5lIEZfT1BFTiAJCQkoKCdkJzw8OCl8MHgwMCkJCS8qIHJlc2VydmVkIGZvciBvcGVyYXRpbmcgc3lzdGVtIHVzZSAqLworCQkJCQkvKiAnZScgPT4gImVkaXRvciIgb3BzICovCisjZGVmaW5lIEZfR1RBQklORk8gCQkoKCdlJzw8OCl8MHgwMCkJCS8qIGdldCB0YWIgb2Zmc2V0IGZvciBmaWxlICovCQorI2RlZmluZSBGX1NUQUJJTkZPIAkJKCgnZSc8PDgpfDB4MDEpCQkvKiBzZXQgCSIJIgkJIgkiICAqLworI2RlZmluZSBGX0dGT05USU5GTwkJKCgnZSc8PDgpfDB4MDIpCQkvKiBnZXQgZm9udCBudW1iZXIgYW5kIHNpemUgZm9yIGZpbGUgKi8KKyNkZWZpbmUgRl9TRk9OVElORk8JCSgoJ2UnPDw4KXwweDAzKQkJLyogc2V0IAkiCQkiCSIJIgkiCSIgCSAqLworI2RlZmluZSBGX0dQUklOVFJFQwkJKCgnZSc8PDgpfDB4MDQpCQkvKiBnZXQgcHJpbnQgcmVjb3JkIGZvciBmaWxlICovCisjZGVmaW5lIEZfU1BSSU5UUkVDCQkoKCdlJzw8OCl8MHgwNSkJCS8qIHNldCAJIgkJIgkiCSIgCSAqLworI2RlZmluZSBGX0dTRUxJTkZPIAkJKCgnZSc8PDgpfDB4MDYpCQkvKiBnZXQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIGZvciBmaWxlICovCisjZGVmaW5lIEZfU1NFTElORk8gCQkoKCdlJzw8OCl8MHgwNykJCS8qIHNldAkJIgkJIgkJIgkJIiAqLworI2RlZmluZSBGX0dXSU5JTkZPIAkJKCgnZSc8PDgpfDB4MDgpCQkvKiBnZXQgY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KKyNkZWZpbmUgRl9TV0lOSU5GTyAJCSgoJ2UnPDw4KXwweDA5KQkJLyogc2V0CSIJCSIJCSIgCSAgICovCisjZGVmaW5lIEZfR1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEEpCQkvKiBnZXQgc2Nyb2xsIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEZfU1NDUk9MTElORk8JKCgnZSc8PDgpfDB4MEIpCQkvKiBzZXQgICAgIiAgIAkJIiAgCSAgKi8KKyNkZWZpbmUgRl9HTUFSS0VSCQkoKCdlJzw8OCl8MHgwRCkJCS8qIEdldCBNYXJrZXIgKi8KKyNkZWZpbmUgRl9TTUFSS0VSCQkoKCdlJzw8OCl8MHgwQykJCS8qIFNldCAgICIgCSAgKi8KKyNkZWZpbmUgRl9HU0FWRU9OQ0xPU0UJKCgnZSc8PDgpfDB4MEYpCQkvKiBHZXQgU2F2ZSBvbiBjbG9zZSAqLworI2RlZmluZSBGX1NTQVZFT05DTE9TRQkoKCdlJzw8OCl8MHgwRSkJCS8qIFNldCAgICIJICIJICIgCSAqLworCisvKgorICoJYXJndW1lbnQgc3RydWN0dXJlcyB1c2VkIGJ5IHZhcmlvdXMgZmFjY2VzcygpIGNvbW1hbmRzCisgKi8KKyAKK3N0cnVjdCBNYXJrRWxlbWVudCB7CisJaW50CQkJCXN0YXJ0OwkJCS8qIHN0YXJ0IHBvc2l0aW9uIG9mIG1hcmsgKi8KKwlpbnQJCQkJZW5kOwkJCS8qIGVuZCBwb3NpdGlvbiAqLworCXVuc2lnbmVkIGNoYXIJY2hhckNvdW50OwkJLyogbnVtYmVyIG9mIGNoYXJzIGluIG1hcmsgbmFtZSAqLworCWNoYXIJCQluYW1lWzY0XTsJCS8qIG1hcmsgbmFtZSAqLworfSA7CQkJCQkJCQkJLyogbm90ZTogbWFya2VyIG5hbWVzIG1heSBiZSB1cCB0byA2NCBjaGFyYWN0ZXJzIGxvbmcgKi8KKworI2lmbmRlZiBfX2NwbHVzcGx1cwordHlwZWRlZiBzdHJ1Y3QgTWFya0VsZW1lbnQgTWFya0VsZW1lbnQ7CisjZW5kaWYKKworc3RydWN0IFNlbGVjdGlvblJlY29yZCB7CisJbG9uZwlzdGFydGluZ1BvczsKKwlsb25nCWVuZGluZ1BvczsKKwlsb25nCWRpc3BsYXlUb3A7Cit9OworCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIHN0cnVjdCBTZWxlY3Rpb25SZWNvcmQgU2VsZWN0aW9uUmVjb3JkOworI2VuZGlmCisKKworLyoKKyAqIE1vZGUgdmFsdWVzIGFjY2Vzc2libGUgdG8gb3BlbigpCisgKi8KKyNkZWZpbmUgT19SRE9OTFkJCSAwIAkJLyogQml0cyAwIGFuZCAxIGFyZSB1c2VkIGludGVybmFsbHkgKi8KKyNkZWZpbmUgT19XUk9OTFkJCSAxIAkJLyogVmFsdWVzIDAuLjIgYXJlIGhpc3RvcmljYWwgKi8KKyNkZWZpbmUgT19SRFdSIAkJCSAyCQkvKiBOT1RFOiBpdCBnb2VzIDAsIDEsIDIsICohKiA4LCAxNiwgMzIsIC4uLiAqLworI2RlZmluZSBPX0FQUEVORAkoMTw8IDMpCQkvKiBhcHBlbmQgKHdyaXRlcyBndWFyYW50ZWVkIGF0IHRoZSBlbmQpICovCisjZGVmaW5lIE9fUlNSQyAJCSgxPDwgNCkJCS8qIE9wZW4gdGhlIHJlc291cmNlIGZvcmsgKi8KKyNkZWZpbmUgT19BTElBUwkJKDE8PCA1KQkJLyogT3BlbiBhbGlhcyBmaWxlICovCisjZGVmaW5lIE9fQ1JFQVQJCSgxPDwgOCkJCS8qIE9wZW4gd2l0aCBmaWxlIGNyZWF0ZSAqLworI2RlZmluZSBPX1RSVU5DCQkoMTw8IDkpCQkvKiBPcGVuIHdpdGggdHJ1bmNhdGlvbiAqLworI2RlZmluZSBPX0VYQ0wgCQkoMTw8MTApIAkvKiB3LyBPX0NSRUFUOiAgRXhjbHVzaXZlICJjcmVhdGUtb25seSIgKi8KKyNkZWZpbmUgT19CSU5BUlkJKDE8PDExKSAJLyogT3BlbiBhcyBhIGJpbmFyeSBzdHJlYW0gKi8KKyNkZWZpbmUgT19OUkVTT0xWRQkoMTw8MTQpCQkvKiBEb24ndCByZXNvbHZlIGFueSBhbGlhc2VzICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqCQlmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK2ludCAgY2xvc2UoaW50KTsKK2ludCAgY3JlYXQoY29uc3QgY2hhciopOworaW50CSBkdXAoaW50IGZpbGVkZXMpOwkJLyogT0JTT0xFVEU6IGZjbnRsKGZpbGVkZXMsIEZfRFVQRkQsIDApIGlzIHByZWZlcnJlZCAqLworaW50CSBmYWNjZXNzKGNoYXIqLCB1bnNpZ25lZCBpbnQsIGxvbmcqKTsKK2ludCAgZmNudGwoaW50LCB1bnNpZ25lZCBpbnQsIGludCk7Citsb25nIGxzZWVrKGludCwgbG9uZywgaW50KTsKK2ludCAgb3Blbihjb25zdCBjaGFyKiwgaW50LCAuLi4pOworaW50ICByZWFkKGludCwgY2hhciosIHVuc2lnbmVkKTsKK2ludCAgdW5saW5rKGNoYXIqKTsKK2ludCAgd3JpdGUoaW50LCBjb25zdCBjaGFyKiwgdW5zaWduZWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKgorICogZmNudGwoKSBjb21tYW5kcworICovCisjZGVmaW5lIEZfRFVQRkQgMAkgICAvKiBEdXBsaWNhdGUgZmlsZXMgKGZpbGUgZGVzY3JpcHRvcikgKi8KKworI2VuZGlmIF9fRkNOVExfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZ3JwLmggYi9pbmNsdWRlL21wdy9ncnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWYyYzZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvZ3JwLmgKQEAgLTAsMCArMSwxMCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJzeXMvdHlwZXMuaCIKKworc3RydWN0IGdyb3VwIHsKKyAgY2hhciAqZ3JfbmFtZTsKKyAgZ2lkX3QgZ3JfZ2lkOworICBjaGFyICpncl9wYXNzd2Q7CisgIGNoYXIgKipncl9tZW07Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvbXB3LmggYi9pbmNsdWRlL21wdy9tcHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODcwMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvbXB3LmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIE1hYyBNUFcgaG9zdC1zcGVjaWZpYyBkZWZpbml0aW9ucy4gKi8KKworI2lmbmRlZglfX0lOQ0xVREVfTVBXX0gKKyNkZWZpbmUgX19JTkNMVURFX01QV19ICisKKyNpZm5kZWYgTVBXCisjZGVmaW5lIE1QVworI2VuZGlmCisKKy8qIE1QVyBDIGlzIGJhc2ljYWxseSBBTlNJLCBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgX19TVERDX18sCisgICBub3IgZG9lcyBpdCBhbGxvdyBfX1NURENfXyB0byBiZSAjZGVmaW5lZC4gKi8KKworI2lmbmRlZiBBTE1PU1RfU1REQworI2RlZmluZSBBTE1PU1RfU1REQworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9USU1FX0ggMQorCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisKKyNkZWZpbmUgSEFWRV9TVERERUZfSCAxCisKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKyNkZWZpbmUgSEFWRV9TVERBUkdfSCAxCisKKyNkZWZpbmUgSEFWRV9WUFJJTlRGIDEKKworI2lmZGVmIFVTRV9NV19IRUFERVJTCisKKyNpbmNsdWRlIDx1bml4Lmg+CisKKyNlbHNlCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQorCisjaWZuZGVmCU9fQUNDTU9ERQorI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCisjZW5kaWYKKworI2lmbmRlZiBmaWxlbm8KKyNkZWZpbmUgZmlsZW5vKGZwKSAoKGZwKS0+X2ZpbGUpCisjZW5kaWYKKworLyogc3RkaW8uaCBkb2VzIG5vdCBkZWZpbmUgdGhpcyBpZiBfX1NURENfXywgc28gZGVmaW5lIGhlcmUuICovCisKKyNpZmRlZiBfX1NURENfXworRklMRSAqZmRvcGVuKGludCBmaWxkZXMsIGNvbnN0IGNoYXIgKm1vZGUpOworI2VuZGlmCisKKyNlbmRpZiAvKiBVU0VfTVdfSEVBREVSUyAqLworCisvKiBBZGQgZXJzYXR6IGRlZmluaXRpb25zLCBmb3Igc3lzdGVtcyB0aGF0IGxhY2sgdGhlbS4gICovCisKKyNpZm5kZWYgRUlPCisjZGVmaW5lIEVJTyA5NgorI2VuZGlmCisjaWZuZGVmIEVOT0VOVAorI2RlZmluZSBFTk9FTlQgOTcKKyNlbmRpZgorI2lmbmRlZiBFQUNDRVMKKyNkZWZpbmUgRUFDQ0VTIDk4CisjZW5kaWYKKyNpZm5kZWYgRU5PU1lTCisjZGVmaW5lIEVOT1NZUyA5OQorI2VuZGlmCisKKyNpZm5kZWYgUl9PSworI2RlZmluZSBSX09LIDQKKyNkZWZpbmUgV19PSyAyCisjZGVmaW5lIFhfT0sgMQorI2VuZGlmCisKKy8qIEJpbmFyeSBmaWxlcyBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJpc3RpY3M7IGZvciBpbnN0YW5jZSwgbm8gY3IvbmwKKyAgIHRyYW5zbGF0aW9uLiAqLworCisjZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4KKworI2luY2x1ZGUgPHNwaW4uaD4KKworI2lmZGVmIE1QV19DCisjdW5kZWYgIF9fUFRSX1RPX0lOVAorI2RlZmluZSBfX1BUUl9UT19JTlQoUCkgKChpbnQpKFApKQorI3VuZGVmIF9fSU5UX1RPX1BUUgorI2RlZmluZSBfX0lOVF9UT19QVFIoUCkgKChjaGFyICopKFApKQorI2VuZGlmIC8qIE1QV19DICovCisKKyNkZWZpbmUgTk9fRkNOVEwKKworaW50IGZzdGF0ICgpOworCitGSUxFICptcHdfZm9wZW4gKCk7CitpbnQgbXB3X2ZzZWVrICgpOworaW50IG1wd19mcmVhZCAoKTsKK2ludCBtcHdfZndyaXRlICgpOworaW50IG1wd19hY2Nlc3MgKCk7CitpbnQgbXB3X29wZW4gKCk7CitpbnQgbXB3X2NyZWF0ICgpOwordm9pZCBtcHdfYWJvcnQgKHZvaWQpOworCisvKiBNYXAgdGhlc2Ugc3RhbmRhcmQgZnVuY3Rpb25zIHRvIGltcHJvdmVkIHZlcnNpb25zIGluIGxpYmliZXJ0eS4gKi8KKworI2RlZmluZSBmb3BlbiBtcHdfZm9wZW4KKyNkZWZpbmUgZnNlZWsgbXB3X2ZzZWVrCisjZGVmaW5lIGZyZWFkIG1wd19mcmVhZAorI2RlZmluZSBmd3JpdGUgbXB3X2Z3cml0ZQorI2RlZmluZSBvcGVuIG1wd19vcGVuCisjZGVmaW5lIGFjY2VzcyBtcHdfYWNjZXNzCisjZGVmaW5lIGNyZWF0IG1wd19jcmVhdAorI2RlZmluZSBhYm9ydCBtcHdfYWJvcnQKKworI2RlZmluZSBQT1NJWF9VVElNRQorCisjZGVmaW5lIExPU0lOR19UT1RBTExZCisKKy8qIERlZmluZSB0aGlzIHNvIHRoYXQgZmlsZXMgd2lsbCBiZSBjbG9zZWQgYmVmb3JlIGJlaW5nIHVubGlua2VkLiAqLworCisjZGVmaW5lIENMT1NFX0JFRk9SRV9VTkxJTksKKworI2VuZGlmIC8qIF9fSU5DTFVERV9NUFdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvcHdkLmggYi9pbmNsdWRlL21wdy9wd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRmYjcwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvcHdkLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfX3B3ZF9oCisjZGVmaW5lIF9fcHdkX2gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitzdHJ1Y3QgcGFzc3dkIHsKKyAgY2hhciAqcHdfbmFtZTsKKyAgdWlkX3QgcHdfdWlkOworICBnaWRfdCBwd19naWQ7CisgIGNoYXIgKnB3X2RpcjsKKyAgY2hhciAqcHdfc2hlbGw7CisgIGNoYXIgKnB3X3Bhc3N3ZDsKK307CisKKyNlbmRpZiAvKiAhIF9fcHdkX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3NwaW4uaCBiL2luY2x1ZGUvbXB3L3NwaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdkMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvc3Bpbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIFByb2dyZXNzIG1hY3JvcyB0aGF0IHVzZSBTcGluQ3Vyc29yIGluIE1QVy4KKyAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfU1BJTl9ICisjZGVmaW5lIF9TUElOX0gKKworLyogRm9yIE1QVywgcHJvZ3Jlc3MgbWFjcm9zIGp1c3QgbmVlZCB0byAic3BpbiB0aGUgY3Vyc29yIiBmcmVxdWVudGx5LAorICAgcHJlZmVyYWJseSBzZXZlcmFsIHRpbWVzIHBlciBzZWNvbmQgb24gYSA2OEsgTWFjLiAgKi8KKworLyogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIG1lZXRpbmcgdGhlIGdvYWwsIGRlZmluZSB0aGlzIG1hY3JvCisgICBhbmQgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IG9mIHNwaW5uaW5nIHdpbGwgYmUgY29sbGVjdGVkIGFuZAorICAgZGlzcGxheWVkLiAgKi8KKworI2RlZmluZSBTUElOX01FQVNVUkVNRU5UCisKKyNpbmNsdWRlIDxDdXJzb3JDdGwuaD4KKworLyogUHJvZ3JhbXMgdXNlIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbGVuZ3RoeQorICAgYWN0aXZpdHkuICBTVFIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBhY3Rpdml0eSwgd2hpbGUgTgorICAgaW5kaWNhdGVzIHRoZSBleHBlY3RlZCBkdXJhdGlvbiwgaW4gdW5zcGVjaWZpZWQgdW5pdHMuICBJZiBOIGlzCisgICB6ZXJvLCB0aGVuIHRoZSBleHBlY3RlZCB0aW1lIHRvIGNvbXBsZXRpb24gaXMgdW5rbm93bi4gICovCisKKyN1bmRlZiBTVEFSVF9QUk9HUkVTUworI2RlZmluZSBTVEFSVF9QUk9HUkVTUyhTVFIsTikgbXB3X3N0YXJ0X3Byb2dyZXNzIChTVFIsIE4sIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKy8qIFByb2dyYW1zIHVzZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSBvbiBhCisgICBsZW5ndGh5IGFjdGl2aXR5LiAgKi8KKworI3VuZGVmIFBST0dSRVNTCisjaWZkZWYgU1BJTl9NRUFTVVJFTUVOVAorI2RlZmluZSBQUk9HUkVTUyhYKSBtcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKFgsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisjZWxzZQorI2RlZmluZSBQUk9HUkVTUyhYKSBtcHdfcHJvZ3Jlc3MgKFgpOworI2VuZGlmIAorCisvKiBQcm9ncmFtcyB1c2UgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgbGVuZ3RoeSBhY3Rpdml0eS4KKyAgIFNUUiBtdXN0IG1hdGNoIGEgU1RSIHBhc3NlZCB0byBTVEFSVF9QUk9HUkVTUyBwcmV2aW91c2x5LiAgKi8KKworI3VuZGVmIEVORF9QUk9HUkVTUworI2RlZmluZSBFTkRfUFJPR1JFU1MoU1RSKSBtcHdfZW5kX3Byb2dyZXNzIChTVFIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKK2V4dGVybiB2b2lkIG1wd19zdGFydF9wcm9ncmVzcyAoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgbXB3X3Byb2dyZXNzIChpbnQpOworCitleHRlcm4gdm9pZCBtcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKGludCwgY2hhciAqLCBpbnQpOworCitleHRlcm4gdm9pZCBtcHdfZW5kX3Byb2dyZXNzIChjaGFyICosIGNoYXIgKiwgaW50KTsKKworI2VuZGlmIC8qIF9TUElOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N0YXQuaCBiL2luY2x1ZGUvbXB3L3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdiOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvc3RhdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIFRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGRlZmluZXMgYSBzdHJ1Y3QgdGhhdCBpcyB1c2VkIGluIHRoZSBzdGF0KCkgYW5kCisgKiBmc3RhdCBmdW5jdGlvbnMuICBUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3QgY29tZXMgZnJvbSB0aGUgaS1ub2RlIG9mCisgKiBzb21lIGZpbGUuICBUaGVzZSBjYWxscyBhcmUgdGhlIG9ubHkgYXBwcm92ZWQgd2F5IHRvIGluc3BlY3QgaS1ub2Rlcy4KKyAqLworCisjaWZuZGVmIF9TVEFUX0gKKyNkZWZpbmUgX1NUQVRfSAorCisjaWZuZGVmIF9UWVBFU19ICQkvKiBub3QgcXVpdGUgcmlnaHQgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCitzdHJ1Y3Qgc3RhdCB7CisgIGRldl90IHN0X2RldjsJCQkvKiBtYWpvci9taW5vciBkZXZpY2UgbnVtYmVyICovCisgIGlub190IHN0X2lubzsJCQkvKiBpLW5vZGUgbnVtYmVyICovCisgIG1vZGVfdCBzdF9tb2RlOwkJLyogZmlsZSBtb2RlLCBwcm90ZWN0aW9uIGJpdHMsIGV0Yy4gKi8KKyAgc2hvcnQgaW50IHN0X25saW5rOwkJLyogIyBsaW5rczsgVEVNUE9SQVJZIEhBQ0s6IHNob3VsZCBiZSBubGlua190Ki8KKyAgdWlkX3Qgc3RfdWlkOwkJCS8qIHVpZCBvZiB0aGUgZmlsZSdzIG93bmVyICovCisgIHNob3J0IGludCBzdF9naWQ7CQkvKiBnaWQ7IFRFTVBPUkFSWSBIQUNLOiBzaG91bGQgYmUgZ2lkX3QgKi8KKyAgZGV2X3Qgc3RfcmRldjsKKyAgb2ZmX3Qgc3Rfc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworICB0aW1lX3Qgc3RfYXRpbWU7CQkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisgIHRpbWVfdCBzdF9tdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBkYXRhIG1vZGlmaWNhdGlvbiAqLworICB0aW1lX3Qgc3RfY3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgZmlsZSBzdGF0dXMgY2hhbmdlICovCit9OworCisvKiBUcmFkaXRpb25hbCBtYXNrIGRlZmluaXRpb25zIGZvciBzdF9tb2RlLiAqLworI2RlZmluZSBTX0lGTVQgIDAxNzAwMDAJCS8qIHR5cGUgb2YgZmlsZSAqLworI2RlZmluZSBTX0lGUkVHIDAxMDAwMDAJCS8qIHJlZ3VsYXIgKi8KKyNkZWZpbmUgU19JRkJMSyAwMDYwMDAwCQkvKiBibG9jayBzcGVjaWFsICovCisjZGVmaW5lIFNfSUZESVIgMDA0MDAwMCAgCS8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBTX0lGQ0hSIDAwMjAwMDAJCS8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lIFNfSUZJRk8gMDAxMDAwMAkJLyogdGhpcyBpcyBhIEZJRk8gKi8KKyNkZWZpbmUgU19JU1VJRCAwMDA0MDAwCQkvKiBzZXQgdXNlciBpZCBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUgU19JU0dJRCAwMDAyMDAwCQkvKiBzZXQgZ3JvdXAgaWQgb24gZXhlY3V0aW9uICovCisJCQkJLyogbmV4dCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBTX0lTVlRYICAgMDEwMDAJCS8qIHNhdmUgc3dhcHBlZCB0ZXh0IGV2ZW4gYWZ0ZXIgdXNlICovCisKKy8qIFBPU0lYIG1hc2tzIGZvciBzdF9tb2RlLiAqLworI2RlZmluZSBTX0lSV1hVICAgMDA3MDAJCS8qIG93bmVyOiAgcnd4LS0tLS0tICovCisjZGVmaW5lIFNfSVJVU1IgICAwMDQwMAkJLyogb3duZXI6ICByLS0tLS0tLS0gKi8KKyNkZWZpbmUgU19JV1VTUiAgIDAwMjAwCQkvKiBvd25lcjogIC13LS0tLS0tLSAqLworI2RlZmluZSBTX0lYVVNSICAgMDAxMDAJCS8qIG93bmVyOiAgLS14LS0tLS0tICovCisKKyNkZWZpbmUgU19JUldYRyAgIDAwMDcwCQkvKiBncm91cDogIC0tLXJ3eC0tLSAqLworI2RlZmluZSBTX0lSR1JQICAgMDAwNDAJCS8qIGdyb3VwOiAgLS0tci0tLS0tICovCisjZGVmaW5lIFNfSVdHUlAgICAwMDAyMAkJLyogZ3JvdXA6ICAtLS0tdy0tLS0gKi8KKyNkZWZpbmUgU19JWEdSUCAgIDAwMDEwCQkvKiBncm91cDogIC0tLS0teC0tLSAqLworCisjZGVmaW5lIFNfSVJXWE8gICAwMDAwNwkJLyogb3RoZXJzOiAtLS0tLS1yd3ggKi8KKyNkZWZpbmUgU19JUk9USCAgIDAwMDA0CQkvKiBvdGhlcnM6IC0tLS0tLXItLSAqLyAKKyNkZWZpbmUgU19JV09USCAgIDAwMDAyCQkvKiBvdGhlcnM6IC0tLS0tLS13LSAqLworI2RlZmluZSBTX0lYT1RIICAgMDAwMDEJCS8qIG90aGVyczogLS0tLS0tLS14ICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHRlc3Qgc3RfbW9kZSAoZnJvbSBQT1NJWCBTZWMuIDUuNi4xLjEuICovCisjZGVmaW5lIFNfSVNSRUcobSkJKChtICYgU19JRk1UKSA9PSBTX0lGUkVHKQkvKiBpcyBhIHJlZyBmaWxlICovCisjZGVmaW5lIFNfSVNESVIobSkJKChtICYgU19JRk1UKSA9PSBTX0lGRElSKQkvKiBpcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBTX0lTQ0hSKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRkNIUikJLyogaXMgYSBjaGFyIHNwZWMgKi8KKyNkZWZpbmUgU19JU0JMSyhtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZCTEspCS8qIGlzIGEgYmxvY2sgc3BlYyAqLworI2RlZmluZSBTX0lTRklGTyhtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZJRk8pCS8qIGlzIGEgcGlwZS9GSUZPICovCisKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcy4gKi8KKyNpZm5kZWYgX0FOU0lfSAorI2luY2x1ZGUgPGFuc2kuaD4KKyNlbmRpZgorCitfUFJPVE9UWVBFKCBpbnQgY2htb2QsIChjb25zdCBjaGFyICpfcGF0aCwgaW50IF9tb2RlKQkJCSk7CitfUFJPVE9UWVBFKCBpbnQgZnN0YXQsIChpbnQgX2ZpbGRlcywgc3RydWN0IHN0YXQgKl9idWYpCQkJKTsKK19QUk9UT1RZUEUoIGludCBta2RpciwgKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX21vZGUpCQkJKTsKK19QUk9UT1RZUEUoIGludCBta2ZpZm8sIChjb25zdCBjaGFyICpfcGF0aCwgaW50IF9tb2RlKQkJCSk7CitfUFJPVE9UWVBFKCBpbnQgc3RhdCAsIChjb25zdCBjaGFyICpfcGF0aCwgc3RydWN0IHN0YXQgKl9idWYpCQkpOworX1BST1RPVFlQRSggbW9kZV90IHVtYXNrLCAoaW50IF9jbWFzaykJCQkJCSk7CisKKyNlbmRpZiAvKiBfU1RBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvZmlsZS5oIGIvaW5jbHVkZS9tcHcvc3lzL2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE4YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvc3lzL2ZpbGUuaApAQCAtMCwwICsxIEBACisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL3BhcmFtLmggYi9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE4YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvc3lzL3BhcmFtLmgKQEAgLTAsMCArMSBAQAorLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5NDM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX1NZU19SRVNPVVJDRV9IX18KKyNkZWZpbmUgX19TWVNfUkVTT1VSQ0VfSF9fCisKK3N0cnVjdCBydXNhZ2UgeworICBzdHJ1Y3QgdGltZXZhbCBydV91dGltZTsKKyAgc3RydWN0IHRpbWV2YWwgcnVfc3RpbWU7Cit9OworCisjZW5kaWYgLyogX19TWVNfUkVTT1VSQ0VfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvc3RhdC5oIGIvaW5jbHVkZS9tcHcvc3lzL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVjNzJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvc3lzL3N0YXQuaApAQCAtMCwwICsxLDQ0IEBACisvKiBJbWl0YXRpb24gc3lzL3N0YXQuaC4gKi8KKworI2lmbmRlZiBfX1NZU19TVEFUX0hfXworI2RlZmluZSBfX1NZU19TVEFUX0hfXworCisjaW5jbHVkZSAgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIDx0aW1lLmg+CisKK3N0cnVjdCBzdGF0IHsKKyAgZGV2X3QgICBzdF9kZXY7CisgIGlub190ICAgc3RfaW5vOworICBtb2RlX3QgIHN0X21vZGU7CisgIHNob3J0ICAgc3Rfbmxpbms7CisgIHVpZF90ICAgc3RfdWlkOworICBnaWRfdCAgIHN0X2dpZDsKKyAgZGV2X3QgICBzdF9yZGV2OworICBvZmZfdCAgIHN0X3NpemU7CisgIG9mZl90ICAgc3RfcnNpemU7CisgIHRpbWVfdCAgc3RfYXRpbWU7CisgIGludCAgICAgc3Rfc3BhcmUxOworICB0aW1lX3QgIHN0X210aW1lOworICBpbnQgICAgIHN0X3NwYXJlMjsKKyAgdGltZV90ICBzdF9jdGltZTsKKyAgaW50ICAgICBzdF9zcGFyZTM7CisgIGxvbmcgICAgc3RfYmxrc2l6ZTsKKyAgbG9uZyAgICBzdF9ibG9ja3M7CisgIGxvbmcgICAgc3Rfc3BhcmU0WzJdOworfTsKKworI2RlZmluZSBTX0lGTVQJMDE3MDAwMEwKKyNkZWZpbmUgU19JRkRJUgkwMDQwMDAwTAorI2RlZmluZSBTX0lGUkVHIDAxMDAwMDBMCisjZGVmaW5lIFNfSVJFQUQgICAgMDQwMAorI2RlZmluZSBTX0lXUklURSAgIDAyMDAKKyNkZWZpbmUgU19JRVhFQyAgICAwMTAwCisKKyNkZWZpbmUgU19JRklGTyAwMTAwMDAgIC8qIEZJRk8gc3BlY2lhbCAqLworI2RlZmluZSBTX0lGQ0hSIDAyMDAwMCAgLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKyNkZWZpbmUgU19JRkJMSyAwMzAwMDAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KKworaW50IHN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpOworaW50IGZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpOworCisjZW5kaWYgLyogX19TWVNfU1RBVF9IX19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvdGltZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU0ODUyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvc3lzL3RpbWUuaApAQCAtMCwwICsxLDEzIEBACisvKiBJbWl0YXRpb24gc3lzL3RpbWUuaC4gKi8KKworI2lmbmRlZiBfX1NZU19USU1FX0hfXworI2RlZmluZSBfX1NZU19USU1FX0hfXworCisjaW5jbHVkZSA8dGltZS5oPgorCitzdHJ1Y3QgdGltZXZhbCB7CisgIGxvbmcgdHZfc2VjOworICBsb25nIHR2X3VzZWM7Cit9OworCisjZW5kaWYgLyogX19TWVNfVElNRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oIGIvaW5jbHVkZS9tcHcvc3lzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkOWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qIEltaXRhdGlvbiBzeXMvdHlwZXMuaC4gKi8KKworI2lmbmRlZiBfX1NZU19UWVBFU19IX18KKyNkZWZpbmUgX19TWVNfVFlQRVNfSF9fCisKKyNpbmNsdWRlIDxUeXBlcy5oPgorCit0eXBlZGVmIHNob3J0IGRldl90OwordHlwZWRlZiBzaG9ydCBpbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZ2lkX3Q7Cit0eXBlZGVmIGxvbmcgb2ZmX3Q7CisKKyNlbmRpZiAvKiBfX1NZU19UWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3V0aW1lLmggYi9pbmNsdWRlL21wdy91dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmY2NmYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvdXRpbWUuaApAQCAtMCwwICsxLDcgQEAKKworc3RydWN0IHV0aW1idWYgeworICB0aW1lX3QgYWN0aW1lOworICB0aW1lX3QgbW9kdGltZTsKK307CisKK2ludCB1dGltZSAoY2hhciAqLCBzdHJ1Y3QgdXRpbWJ1ZiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaCBiL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I5ZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tcHcvdmFyYXJncy5oCkBAIC0wLDAgKzEsOSBAQAorLyogdmFyYXJncy5oLiAqLworI2lmbmRlZiBfX3ZhX2xpc3RfXworI2RlZmluZSBfX3ZhX2xpc3RfXwordHlwZWRlZiBjaGFyICp2YV9saXN0OworI2VuZGlmCisjZGVmaW5lIHZhX2RjbCBpbnQgdmFfYWxpc3Q7CisjZGVmaW5lIHZhX3N0YXJ0KGxpc3QpIGxpc3QgPSAoY2hhciAqKSAmdmFfYWxpc3QKKyNkZWZpbmUgdmFfZW5kKGxpc3QpCisjZGVmaW5lIHZhX2FyZyhsaXN0LG1vZGUpICgobW9kZSAqKShsaXN0ICs9IHNpemVvZihtb2RlKSkpWy0xXQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vQ2hhbmdlTG9nIGIvaW5jbHVkZS9ubG0vQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWEzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sbS9DaGFuZ2VMb2cKQEAgLTAsMCArMSw4MyBAQAorRnJpIE1heSAgNiAxMzozMTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGV4dGVybmFsLmggKG5sbU5BTUUoRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcikpOiBBZGQgbGVuZ3RoLAorCWRhdGFPZmZzZXQsIGFuZCBkYXRhU3RhbXAgZmllbGQuCisJKG5sbU5BTUUoRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpKTogUmVtb3ZlLgorCSogaW50ZXJuYWwuaCAoTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIpOiBBZGQgaGRyTGVuZ3RoLAorCWRhdGFPZmZzZXQsIGRhdGFTdGFtcCBhbmQgaGRyIGZpZWxkcy4KKworRnJpIEFwciAyMiAxMToxMjozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGV4dGVybmFsLmggKHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2N5Z251c19leHRfaGVhZGVyKSk6IFJlbmFtZQorCWZyb20gbmxtTkFNRShleHRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIpLiAgQ2hhbmdlIHN0YW1wIGZpZWxkCisJdG8gOCBieXRlcy4gIEFkZCBieXRlcyBmaWVsZC4KKwkqIGludGVybmFsLmggKG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcik6IFJlbmFtZSBmcm9tCisJbmxtX2ludGVybmFsX2N5Z251c19zZWN0aW9uX2hlYWRlci4gIENoYW5nZSBzdGFtcCBmaWVsZCB0byA4CisJYnl0ZXMuCisKK1RodSBBcHIgMjEgMTE6NTc6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oIChzdHJ1Y3QgbmxtX2ludGVybmFsX2N5Z251c19zZWN0aW9uX2hlYWRlcik6IERlZmluZS4KKwkqIGV4dGVybmFsLmggKHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2N5Z251c19zZWN0aW9uX2hlYWRlcik6CisJRGVmaW5lLgorCitXZWQgQXByIDIwIDE0OjI3OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogaW50ZXJuYWwuaCAoc3RydWN0IG5sbV9pbnRlcm5hbF9jdXN0b21faGVhZGVyKTogUmVtb3ZlCisJZGVidWdSZWNPZmZzZXQgYW5kIGRlYnVnUmVjTGVuZ3RoIGZpZWxkcy4gIEFkZCBkYXRhIGZpZWxkLgorCSogZXh0ZXJuYWwuaCAoc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3VzdG9tX2hlYWRlcikpOiBSZW1vdmUKKwlkZWJ1Z1JlY09mZnNldCBhbmQgZGVidWdSZWNMZW5ndGggZmllbGRzLgorCitNb24gRmViICA3IDA4OjI4OjQwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oOiBDaGFuZ2UgSE9TVF82NF9CSVQgdG8gQkZEX0hPU1RfNjRfQklULgorCitUaHUgRGVjICAyIDE0OjE0OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogYWxwaGEtZXh0Lmg6IE5ldyBmaWxlIGRlc2NyaWJpbmcgZm9ybWF0cyBvZiBpbmZvcm1hdGlvbiBpbiBBbHBoYQorCU5ldFdhcmUgZmlsZXMuCisJKiBjb21tb24uaDogRGVmaW5lIHNvbWUgbm9uLWV4dGVybmFsIEFscGhhIGluZm9ybWF0aW9uLgorCitXZWQgTm92IDE3IDE3OjM4OjU4IDE5OTMgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQorCisJKiBleHRlcm5hbC5oOiBEb24ndCBkZWZpbmUgZXh0ZXJuYWxfZml4ZWRfaGVhZGVyIGhlcmUuCisJKiBpMzg2LWV4dC5oLCBzcGFyYzMyLWV4dC5oOiBOZXcgaGVhZGVyIGZpbGVzIHRvIGRlZmluZQorCWV4dGVybmFsX2ZpeGVkX2hlYWRlciBmb3IgcGFydGljdWxhciBDUFUncy4KKworV2VkIE9jdCAyNyAxMTo0NTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGludGVybmFsLmggKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpOiBBZGRlZCBmaWVsZHMKKwlzaGFyZWREZWJ1Z1JlY29yZE9mZnNldCBhbmQgc2hhcmVkRGVidWdSZWNvcmRDb3VudC4KKwkqIGV4dGVybmFsLmggKE5sbU5BTUUoRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKSk6IExpa2V3aXNlLgorCisJKiBjb21tb24uaCAoTkxNX1NJR05BVFVSRSk6IERvIG5vdCBkZWZpbmUgKGl0J3MgZGlmZmVyZW50IGZvciBlYWNoCisJYmFja2VuZCkuCisKK1R1ZSBBdWcgMzEgMTM6MjQ6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBpbnRlcm5hbC5oOiBDaGFuZ2UgbGVuZ3RoIGZpZWxkcyBvZiB0eXBlIGNoYXIgdG8gdHlwZSB1bnNpZ25lZAorCWNoYXIuCisKK1NhdCBKdWwgMzEgMDI6MTI6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb21tb24uaCAoTkxNX0hJQklULCBOTE1fSEVBREVSX1ZFUlNJT04pOiBEZWZpbmUuCisKK1RodSBKdWwgMjIgMTY6MDk6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbW1vbi5oIChOTE1fQ0FUKiwgTkxNX0FSQ0hfU0laRSwgTkxNX1RBUkdFVF9MT05HX1NJWkUsCisJTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUsIE5MTV9OQU1FLCBObG1OQU1FLCBubG1OQU1FKTogIE5ldworCW1hY3Jvcy4KKwkqIGV4dGVybmFsLmggKFRBUkdFVF9MT05HX1NJWkUsIFRBUkdFVF9BRERSRVNTX1NJWkUpOiBSZW1vdmUKKwltYWNyb3MsIGNvbnZlcnQgdXNhZ2VzIHRvIE5MTV8gZXF1aXZhbGVudHMuCisJKiBleHRlcm5hbC5oOiAgVXNlIG5sbU5BTUUgYW5kIE5sbU5BTUUgbWFjcm9zIHRvIGRlcml2ZSBib3RoCisJMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucy4KKworTW9uIEp1bCAxOSAyMjoxMjo0MCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogKGNvbW1vbi5oLCBleHRlcm5hbC5oLCBpbnRlcm5hbC5oKTogIE5ldyBmaWxlcyBmb3IgTkxNL05ldFdhcmUKKwlzdXBwb3J0LgorCisMCitMb2NhbCBWYXJpYWJsZXM6Cit2ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCitFbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9hbHBoYS1leHQuaCBiL2luY2x1ZGUvbmxtL2FscGhhLWV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTk5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sbS9hbHBoYS1leHQuaApAQCAtMCwwICsxLDE2NiBAQAorLyogQWxwaGEgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBbiBBbHBoYSBOTE0gc3RhcnRzIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfcHJlZml4X2hlYWRlcgoreworICAvKiBNYWdpYyBudW1iZXIuICBNdXN0IGJlIE5MTTMyX0FMUEhBX01BR0lDLiAgKi8KKyAgdW5zaWduZWQgY2hhciBtYWdpY1s0XTsKKyAgLyogRm9ybWF0IGRlc2NyaXB0b3IuICBDdXJyZW50IHZhbHVlIGlzIDIuICAqLworICB1bnNpZ25lZCBjaGFyIGZvcm1hdFs0XTsKKyAgLyogU2l6ZSBvZiBwcmVmaXggaGVhZGVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzaXplWzRdOworICAvKiBQYWRkaW5nLiAgKi8KKyAgdW5zaWduZWQgY2hhciBwYWQxWzRdOworICAvKiBNb3JlIGZpZWxkcyBtYXkgYmUgYWRkZWQgbGF0ZXIsIHN1cHBvc2VkbHkuICAqLworfTsKKworLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiBhbiBBbHBoYSBOTE0gcmVsb2MuICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuCisgICBBbHBoYSBFQ09GRiByZWxvYy4gICovCisKK3N0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9yZWxvYworeworICB1bnNpZ25lZCBjaGFyIHJfdmFkZHJbOF07CisgIHVuc2lnbmVkIGNoYXIgcl9zeW1uZHhbNF07CisgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzRdOworfTsKKworLyogQ29uc3RhbnRzIHRvIHVucGFjayB0aGUgcl9iaXRzIGZpZWxkIG9mIGEgcmVsb2MuICAqLworCisjZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgorI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAorCisjZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKKworI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCisjZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKKworI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKKyNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3CisjZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgorI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCisjZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMworI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5CisKKyNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCisjZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCisKKy8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCisKK3R5cGVkZWYgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgoreworCisgIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KKyAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KKworICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07CisKKyAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKKyAgICAgaXMgNC4gKi8KKworICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07CisKKyAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAorICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQorICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKKyAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQorICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCisKKyAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKKworICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KKworICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCisgICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKKyAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCisKKyAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQorICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQorICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCisKKyAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCisKKyAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgorICAgICBOTE1MSU5LLiAqLworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKKworICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLworICAgICAKKyAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07CisKKyAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKKworICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KKworICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOworCisgIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKKworICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOworCit9IE5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL2NvbW1vbi5oIGIvaW5jbHVkZS9ubG0vY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2NTUwYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxtL2NvbW1vbi5oCkBAIC0wLDAgKzEsMTI0IEBACisvKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKKyAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLworCisvKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KKyAgIFRoZSBOTE1fQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQworICAgcHJlcHJvY2Vzc29ycy4gIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBvciAiNjRfIiBhcmUgbm90IGEgdmFsaWQKKyAgIHByZXByb2Nlc3NpbmcgdG9rZW5zLCBhbmQgd2UgZG9uJ3Qgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwKKyAgICJubG1fMzJfIikuICBUaGUgWE5MTV9DQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlIGlubmVyIE5MTV9DQVQgbWFjcm9zCisgICB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuICBUaGVuIHRoZQorICAgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCisKKyNpZmRlZiBTQUJFUgorIyAgZGVmaW5lIE5MTV9DQVQoYSxiKQkJYSMjYgorIyAgZGVmaW5lIE5MTV9DQVQzKGEsYixjKQlhIyNiIyNjCisjICBkZWZpbmUgTkxNX0NBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAorI2Vsc2UKKyMgIGlmZGVmIF9fU1REQ19fCisjICAgIGRlZmluZSBOTE1fQ0FUKGEsYikJYSMjYgorIyAgICBkZWZpbmUgTkxNX0NBVDMoYSxiLGMpCWEjI2IjI2MKKyMgICAgZGVmaW5lIFhOTE1fQ0FUMihhLGIpCU5MTV9DQVQoYSxiKQorIyAgICBkZWZpbmUgTkxNX0NBVDQoYSxiLGMsZCkJWE5MTV9DQVQyKE5MTV9DQVQoYSxiKSxOTE1fQ0FUKGMsZCkpCisjICBlbHNlCisjICAgIGRlZmluZSBOTE1fQ0FUKGEsYikJYS8qKi9iCisjICAgIGRlZmluZSBOTE1fQ0FUMyhhLGIsYykJYS8qKi9iLyoqL2MKKyMgICAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKKyMgIGVuZGlmCisjZW5kaWYKKworLyogSWYgTkxNX0FSQ0hfU0laRSBpcyBub3QgZGVmaW5lZCwgZGVmYXVsdCB0byAzMi4gIE5MTV9BUkNIX1NJWkUgaXMKKyAgIG9wdGlvbmFsbHkgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24uICovCisKKyNpZm5kZWYgTkxNX0FSQ0hfU0laRQorIyAgZGVmaW5lIE5MTV9BUkNIX1NJWkUJCQkzMgorI2VuZGlmCisKKyNpZiBOTE1fQVJDSF9TSVpFID09IDMyCisjICBkZWZpbmUgTkxNX1RBUkdFVF9MT05HX1NJWkUJCTQKKyMgIGRlZmluZSBOTE1fVEFSR0VUX0FERFJFU1NfU0laRQk0CisjICBkZWZpbmUgTkxNX05BTUUoeCx5KQkJCU5MTV9DQVQ0KHgsMzIsXyx5KQorIyAgZGVmaW5lIE5MTV9ISUJJVAkJCSgoKGJmZF92bWEpIDEpIDw8IDMxKQorI2VuZGlmCisjaWYgTkxNX0FSQ0hfU0laRSA9PSA2NAorIyAgZGVmaW5lIE5MTV9UQVJHRVRfTE9OR19TSVpFCQk4CisjICBkZWZpbmUgTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUJOAorIyAgZGVmaW5lIE5MTV9OQU1FKHgseSkJCQlOTE1fQ0FUNCh4LDY0LF8seSkKKyMgIGRlZmluZSBOTE1fSElCSVQJCQkoKChiZmRfdm1hKSAxKSA8PCA2MykKKyNlbmRpZgorCisjZGVmaW5lIE5sbU5BTUUoWCkJCU5MTV9OQU1FKE5sbSxYKQorI2RlZmluZSBubG1OQU1FKFgpCQlOTE1fTkFNRShubG0sWCkKKworLyogR2l2ZSBuYW1lcyB0byB0aGluZ3MgdGhhdCBzaG91bGQgbm90IGNoYW5nZS4gKi8KKworI2RlZmluZSBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSAkJMTI3CisjZGVmaW5lIE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RICQk3MQorI2RlZmluZSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSAkJNzEKKyNkZWZpbmUgTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEgJMjU1CisjZGVmaW5lIE5MTV9PVEhFUl9EQVRBX0xFTkdUSCAJCQk0MDAJCS8qIEZJWE1FICovCisjZGVmaW5lIE5MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RICQk1CisjZGVmaW5lIE5MTV9TSUdOQVRVUkVfU0laRQkJCTI0CisjZGVmaW5lIE5MTV9IRUFERVJfVkVSU0lPTgkJCTQKKyNkZWZpbmUgTkxNX01PRFVMRV9OQU1FX1NJWkUJCQkxNAorI2RlZmluZSBOTE1fREVGQVVMVF9TVEFDS1NJWkUJCQkoOCAqIDEwMjQpCisMCisvKiBBbHBoYSBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGluIGEgc2VwYXJhdGUgQWxwaGEKKyAgIGhlYWRlciBmaWxlLCBidXQgaXQgY2FuJ3QgZ28gaW4gYWxwaGEtZXh0LmggYmVjYXVzZSBzb21lIG9mIGl0IGlzCisgICBuZWVkZWQgYnkgbmxtY29udi5jLiAgKi8KKworLyogTWFnaWMgbnVtYmVyIGluIEFscGhhIHByZWZpeCBoZWFkZXIuICAqLworI2RlZmluZSBOTE0zMl9BTFBIQV9NQUdJQyAoMHg4MzU2MTg0MCkKKworLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhbiBBbHBoYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLworI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAorI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEKKyNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkyCisjZGVmaW5lIEFMUEhBX1JfR1BSRUwzMgkJMworI2RlZmluZSBBTFBIQV9SX0xJVEVSQUwJCTQKKyNkZWZpbmUgQUxQSEFfUl9MSVRVU0UJCTUKKyNkZWZpbmUgQUxQSEFfUl9HUERJU1AJCTYKKyNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTcKKyNkZWZpbmUgQUxQSEFfUl9ISU5UCQk4CisjZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk5CisjZGVmaW5lIEFMUEhBX1JfU1JFTDMyCSAgICAgICAxMAorI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkgICAgICAgMTEKKyNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICSAgICAgICAxMgorI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFICAgICAgIDEzCisjZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkgICAgICAgMTQKKyNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUICAgICAxNQorI2RlZmluZSBBTFBIQV9SX0dQVkFMVUUJICAgICAgIDE2CisjZGVmaW5lIEFMUEhBX1JfTldfUkVMT0MgICAgICAyNTAKKworLyogQSBsb2NhbCByZWxvYywgb3RoZXIgdGhhbiBBTFBIQV9SX0dQRElTUCBvciBBTFBIQV9SX0lHTk9SRSwgbXVzdCBiZQorICAgYWdhaW5zdCBvbmUgb2YgdGhlc2Ugc3ltYm9sIGluZGljZXMuICAqLworI2RlZmluZSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQJMQorI2RlZmluZSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEEJMworCisvKiBBbiBBTFBIQV9SX05XX1JFTE9DIGhhcyBvbmUgb2YgdGhlc2UgdmFsdWVzIGluIHRoZSBzaXplIGZpZWxkLiAgSWYKKyAgIGl0IGlzIFNFVEdQLCB0aGUgcl92YWRkciBmaWVsZCBob2xkcyB0aGUgR1AgdmFsdWUgdG8gdXNlLiAgSWYgaXQgaXMKKyAgIExJVEEsIHRoZSByX3ZhZGRyIGZpZWxkIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSAubGl0YSBzZWN0aW9uIGFuZAorICAgdGhlIHJfc3ltbmR4IGZpZWxkIGhvbGRzIHRoZSBzaXplIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgQUxQSEFfUl9OV19SRUxPQ19TRVRHUAkxCisjZGVmaW5lIEFMUEhBX1JfTldfUkVMT0NfTElUQQkyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9leHRlcm5hbC5oIGIvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzdhNWJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaApAQCAtMCwwICsxLDE3NCBAQAorLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBOTE0gc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCisgICB0aGF0IGRlc2NyaWJlIGhvdyBOTE0gaXMgcmVwcmVzZW50ZWQgZXh0ZXJuYWxseSBieSB0aGUgQkZEIGxpYnJhcnkuCisgICBJLkUuIGl0IGRlc2NyaWJlcyB0aGUgaW4tZmlsZSByZXByZXNlbnRhdGlvbiBvZiBOTE0uICBJdCByZXF1aXJlcworICAgdGhlIG5sbS9jb21tb24uaCBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBwb3J0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8KKyAgIGJvdGggdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMuCisKKyAgIE5vdGUgdGhhdCBhbiBOTE0gaGVhZGVyIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOgorCisgICAoMSkJQSBmaXhlZCBsZW5ndGggaGVhZGVyIHRoYXQgaGFzIHNwZWNpZmljIGZpZWxkcyBvZiBrbm93biBsZW5ndGgsCisJYXQgc3BlY2lmaWMgb2Zmc2V0cyBpbiB0aGUgZmlsZS4gCisKKyAgICgyKSAgQSB2YXJpYWJsZSBsZW5ndGggaGVhZGVyIHRoYXQgaGFzIHNwZWNpZmljIGZpZWxkcyBpbiBhIHNwZWNpZmljCisgICAgICAgIG9yZGVyLCBidXQgc29tZSBmaWVsZHMgbWF5IGJlIHZhcmlhYmxlIGxlbmd0aC4KKworICAgKDMpCUEgYXV4aWxpYXJ5IGhlYWRlciB0aGF0IGhhcyB2YXJpb3VzIG9wdGlvbmFsIGZpZWxkcyBpbiBubyBzcGVjaWZpYworICAgICAgICBvcmRlci4gIFRoZXJlIGlzIG5vIHdheSB0byBpZGVudGlmeSB0aGUgZW5kIG9mIHRoZSBhdXhpbGlhcnkgaGVhZGVycworCWV4Y2VwdCBieSBmaW5kaW5nIGEgaGVhZGVyIHdpdGhvdXQgYSByZWNvZ25pemVkICdzdGFtcCcuCisKKyAgIFRoZSBleGFjdCBmb3JtYXQgb2YgdGhlIGZpeGVkIGxlbmd0aCBoZWFkZXIgdW5mb3J0dW5hdGVseSB2YXJpZXMKKyAgIGZyb20gb25lIE5MTSB0YXJnZXQgdG8gYW5vdGhlciwgZHVlIHRvIHBhZGRpbmcuICBFYWNoIHRhcmdldAorICAgZGVmaW5lcyB0aGUgY29ycmVjdCBleHRlcm5hbCBmb3JtYXQgaW4gYSBzZXBhcmF0ZSBoZWFkZXIgZmlsZS4KKworKi8KKyAgIAorLyogTkxNIEhlYWRlciAqLworCisvKiBUaGUgdmVyc2lvbiBoZWFkZXIgaXMgb25lIG9mIHRoZSBvcHRpb25hbCBhdXhpbGlhcnkgaGVhZGVycyBhbmQKKyAgIGZvbGxvd3MgdGhlIGZpeGVkIGxlbmd0aCBhbmQgdmFyaWFibGUgbGVuZ3RoIE5MTSBoZWFkZXJzLiAqLworCit0eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX3ZlcnNpb25faGVhZGVyKQoreworCisgIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiVmVSc0lvTiMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KKyAgY2hhciBzdGFtcFs4XTsKKworICB1bnNpZ25lZCBjaGFyIG1ham9yVmVyc2lvbltOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBtaW5vclZlcnNpb25bTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgcmV2aXNpb25bTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgeWVhcltOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBtb250aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBkYXlbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCit9IE5sbU5BTUUoRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpOworCisKK3R5cGVkZWYgc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY29weXJpZ2h0X2hlYWRlcikKK3sKKworICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkNvUHlSaUdoVD0iIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KKworICBjaGFyIHN0YW1wWzEwXTsKKworICB1bnNpZ25lZCBjaGFyIGNvcHlyaWdodE1lc3NhZ2VMZW5ndGhbMV07CisKKyAgLyogVGhlcmUgaXMgYSB2YXJpYWJsZSBsZW5ndGggZmllbGQgaGVyZSBjYWxsZWQgJ2NvcHlyaWdodE1lc3NhZ2UnCisgICAgIHRoYXQgaXMgdGhlIGxlbmd0aCBzcGVjaWZpZWQgYnkgY29weXJpZ2h0TWVzc2FnZUxlbmd0aC4gKi8KKworfSBObG1OQU1FKEV4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIpOworCisKK3R5cGVkZWYgc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyKQoreworCisgIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiTWVTc0FnRXMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KKworICBjaGFyIHN0YW1wWzhdOworCisgIHVuc2lnbmVkIGNoYXIgbGFuZ3VhZ2VJRFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBtZXNzYWdlRmlsZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBtZXNzYWdlRmlsZUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBtZXNzYWdlQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgaGVscEZpbGVPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgaGVscEZpbGVMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgUlBDRGF0YU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBSUENEYXRhTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHNoYXJlZENvZGVPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgc2hhcmVkQ29kZUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBzaGFyZWREYXRhT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHNoYXJlZERhdGFMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHNoYXJlZFJlbG9jYXRpb25GaXh1cENvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgc2hhcmVkUHVibGljc09mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBzaGFyZWRQdWJsaWNzQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGVidWdSZWNvcmRPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGVidWdSZWNvcmRDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBzaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldFtOTE1fVEFSR0VUX0FERFJFU1NfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciBTaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0W05MTV9UQVJHRVRfQUREUkVTU19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHByb2R1Y3RJRFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciByZXNlcnZlZDBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQxW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMltOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgdW5zaWduZWQgY2hhciByZXNlcnZlZDNbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkNVtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKK30gTmxtTkFNRShFeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpOworCisKK3R5cGVkZWYgc3RydWN0IG5sbU5BTUUoZXh0ZXJuYWxfY3VzdG9tX2hlYWRlcikKK3sKKworICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN1U3RIZUFkIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCisgIGNoYXIgc3RhbXBbOF07CisKKyAgLyogTGVuZ3RoIG9mIHRoaXMgaGVhZGVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBsZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOworCisgIC8qIE9mZnNldCB0byBkYXRhLiAgKi8KKyAgdW5zaWduZWQgY2hhciBkYXRhT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKKworICAvKiBMZW5ndGggb2YgZGF0YS4gICovCisgIHVuc2lnbmVkIGNoYXIgZGF0YUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CisKKyAgLyogU3RhbXAgZm9yIHRoaXMgY3VzdG9tZXIgaGVhZGVyLS13ZSByZWNvZ25pemUgIkN5R25Vc0V4Ii4gICovCisgIGNoYXIgZGF0YVN0YW1wWzhdOworCit9IE5sbU5BTUUoRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9pMzg2LWV4dC5oIGIvaW5jbHVkZS9ubG0vaTM4Ni1leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzNhZDJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG0vaTM4Ni1leHQuaApAQCAtMCwwICsxLDExNiBAQAorLyogaTM4NiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbmxtMzJfaTM4Nl9leHRlcm5hbF9maXhlZF9oZWFkZXIKK3sKKworICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCisgICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCisKKyAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbMjRdOworCisgIC8qIFRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIuICBBdCB0aGlzIHRpbWUsIHRoZSBoaWdoZXN0IHZlcnNpb24gbnVtYmVyCisgICAgIGlzIDQuICovCisKKyAgdW5zaWduZWQgY2hhciB2ZXJzaW9uWzRdOworCisgIC8qIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUsIHdoaWNoIG11c3QgYmUgYSBET1MgbmFtZSAoMS04IGNoYXJhY3RlcnMgZm9sbG93ZWQKKyAgICAgYnkgYSBwZXJpb2QgYW5kIGEgMS0zIGNoYXJhY3RlciBleHRlbnNpb24pLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKKyAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCisgICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKKyAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlTmFtZVsxNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCisgICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKKyAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCisKKyAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQorICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQorICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCisKKyAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCisKKyAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgorICAgICBOTE1MSU5LLiAqLworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKKworICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLworICAgICAKKyAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07CisKKyAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKKworICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KKworICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOworCisgIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKKworICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOworCit9IE5sbTMyX2kzODZfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaCBiL2luY2x1ZGUvbmxtL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyN2RjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxtL2ludGVybmFsLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKKyAgIHRoYXQgZGVzY3JpYmUgaG93IE5MTSBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KKyAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgTkxNLiAgSXQgcmVxdWlyZXMKKyAgIHRoZSBubG0vY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCisgICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLworICAgCisjaWYgMAorCisvKiBUeXBlcyB1c2VkIGJ5IHZhcmlvdXMgc3RydWN0dXJlcywgZnVuY3Rpb25zLCBldGMuICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9BZGRyOwkvKiBVbnNpZ25lZCBwcm9ncmFtIGFkZHJlc3MgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9PZmY7CS8qIFVuc2lnbmVkIGZpbGUgb2Zmc2V0ICovCit0eXBlZGVmIAkgbG9uZwlObG0zMl9Td29yZDsJLyogU2lnbmVkIGxhcmdlIGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9Xb3JkOwkvKiBVbnNpZ25lZCBsYXJnZSBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CU5sbTMyX0hhbGY7CS8qIFVuc2lnbmVkIG1lZGl1bSBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJTmxtMzJfQ2hhcjsJLyogVW5zaWduZWQgdGlueSBpbnRlZ2VyICovCisKKyNpZmRlZiBCRkRfSE9TVF82NF9CSVQKK3R5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUCU5sbTY0X0FkZHI7Cit0eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9PZmY7Cit0eXBlZGVmICAgICAgICAgIEJGRF9IT1NUXzY0X0JJVAlObG02NF9TeHdvcmQ7Cit0eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9Yd29yZDsKKyNlbmRpZgordHlwZWRlZiAgICAgICAgICBsb25nCQlObG02NF9Td29yZDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJTmxtNjRfV29yZDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCU5sbTY0X0hhbGY7CisKKyNlbmRpZiAvKiAwICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmb3JtIG9mIHRoZSBwb3J0aW9uIG9mIHRoZSBOTE0KKyAgIGhlYWRlciB0aGF0IGlzIGZpeGVkIGxlbmd0aC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgoreworICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCisgICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCisKKyAgY2hhciBzaWduYXR1cmVbTkxNX1NJR05BVFVSRV9TSVpFXTsKKworICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgorICAgICBpcyA0LiAqLworCisgIGxvbmcgdmVyc2lvbjsKKworICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCisgICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKKyAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCisgICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKKyAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLworCisgIGNoYXIgbW9kdWxlTmFtZVtOTE1fTU9EVUxFX05BTUVfU0laRV07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIGZpbGVfcHRyIGNvZGVJbWFnZU9mZnNldDsKKworICAvKiBUaGUgc2l6ZSBvZiB0aGUgY29kZSBpbWFnZSwgaW4gYnl0ZXMuICovCisKKyAgYmZkX3NpemVfdHlwZSBjb2RlSW1hZ2VTaXplOworCisgIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGF0YSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KKworICBmaWxlX3B0ciBkYXRhSW1hZ2VPZmZzZXQ7CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLworCisgIGJmZF9zaXplX3R5cGUgZGF0YUltYWdlU2l6ZTsKKworICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKKyAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAorICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KKworICBiZmRfc2l6ZV90eXBlIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCisgICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KKworICBmaWxlX3B0ciBjdXN0b21EYXRhT2Zmc2V0OworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCisKKyAgYmZkX3NpemVfdHlwZSBjdXN0b21EYXRhU2l6ZTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgorICAgICBOTE1MSU5LLiAqLworCisgIGZpbGVfcHRyIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQ7CisKKyAgLyogVGhlIG51bWJlciBvZiBtb2R1bGUgZGVwZW5kZW5jaWVzIGF0IHRoZSBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LiAqLworCisgIGxvbmcgbnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXM7CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGZpeHVwIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KKworICBmaWxlX3B0ciByZWxvY2F0aW9uRml4dXBPZmZzZXQ7CisgIGxvbmcgbnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOworICBmaWxlX3B0ciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQ7CisgIGxvbmcgbnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXM7CisgIGZpbGVfcHRyIHB1YmxpY3NPZmZzZXQ7CisgIGxvbmcgbnVtYmVyT2ZQdWJsaWNzOworICBmaWxlX3B0ciBkZWJ1Z0luZm9PZmZzZXQ7CisgIGxvbmcgbnVtYmVyT2ZEZWJ1Z1JlY29yZHM7CisgIGZpbGVfcHRyIGNvZGVTdGFydE9mZnNldDsKKyAgZmlsZV9wdHIgZXhpdFByb2NlZHVyZU9mZnNldDsKKyAgZmlsZV9wdHIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQ7CisgIGxvbmcgbW9kdWxlVHlwZTsKKyAgbG9uZyBmbGFnczsKK30gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcjsKKworI2RlZmluZSBubG0zMl9pbnRlcm5hbF9maXhlZF9oZWFkZXIgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgorI2RlZmluZSBObG0zMl9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcgorI2RlZmluZSBubG02NF9pbnRlcm5hbF9maXhlZF9oZWFkZXIgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgorI2RlZmluZSBObG02NF9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcgorCisvKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgcG9ydGlvbnMgb2YgdGhlIE5MTSBoZWFkZXIgdGhhdCBhcmUgZWl0aGVyCisgICB2YXJpYWJsZSBpbiBzaXplIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiwgb3IgZWxzZSBhcmUgbm90IGF0IGEKKyAgIGZpeGVkIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIE5MTSBoZWFkZXIgZHVlIHRvIHByZWNlZGluZworICAgdmFyaWFibGUgc2l6ZWQgZmllbGRzLgorCisgICBOb3RlIHRoYXQgYWxsIHRoZSBmaWVsZHMgbXVzdCBleGlzdCBpbiB0aGUgZXh0ZXJuYWwgaGVhZGVyLCBhbmQgaW4KKyAgIHRoZSBvcmRlciB1c2VkIGhlcmUgKHRoZSBzYW1lIG9yZGVyIGlzIHVzZWQgaW4gdGhlIGludGVybmFsIGZvcm0KKyAgIGZvciBjb25zaXN0ZW5jeSwgbm90IG91dCBvZiBuZWNlc3NpdHkpLiAqLworCit0eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCit7CisKKyAgLyogVGhlIGRlc2NyaXB0aW9uTGVuZ3RoIGZpZWxkIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4KKyAgICAgZGVzY3JpcHRpb25UZXh0LCBleGNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvci4gIFRoZSBkZXNjcmlwdGlvblRleHQKKyAgICAgZmllbGQgY29udGFpbnMgdGhlIE5MTSBkZXNjcmlwdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBERVNDUklQVElPTgorICAgICBrZXl3b3JkIGluIE5MTUxJTksgcGx1cyB0aGUgbnVsbCBieXRlIHRlcm1pbmF0b3IuICBUaGUgZGVzY3JpcHRpb25UZXh0CisgICAgIGNhbiBiZSB1cCB0byBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCBjaGFyYWN0ZXJzLiAqLworICAgICAKKyAgdW5zaWduZWQgY2hhciBkZXNjcmlwdGlvbkxlbmd0aDsKKyAgY2hhciBkZXNjcmlwdGlvblRleHRbTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEggKyAxXTsKKworICAvKiBUaGUgc3RhY2tTaXplIGZpZWxkIGNvbnRhaW5zIHRoZSBzaXplIG9mIHRoZSBzdGFjayBpbiBieXRlcywgYXMKKyAgICAgc3BlY2lmaWVkIGJ5IHRoZSBTVEFDSyBvciBTVEFDS1NJWkUga2V5d29yZCBpbiBOTE1MSU5LLiAgSWYgbm8gc2l6ZQorICAgICBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIE5MTV9ERUZBVUxUX1NUQUNLU0laRS4gKi8KKyAgICAgCisgIGxvbmcgc3RhY2tTaXplOworCisgIC8qIFRoZSByZXNlcnZlZCBmaWVsZCBpcyBpbmNsdWRlZCBvbmx5IGZvciBjb21wbGV0ZW5lc3MuICBJdCBzaG91bGQgY29udGFpbgorICAgICB6ZXJvLiAqLworCisgIGxvbmcgcmVzZXJ2ZWQ7CisKKyAgLyogVGhpcyBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIHNob3VsZCBjb250YWluICIgTE9ORyIgKG5vdGUgbGVhZGluZworICAgICBzcGFjZSksIGFuZCBpcyB1bnVzZWQuICovCisKKyAgY2hhciBvbGRUaHJlYWROYW1lW05MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RIXTsKKworICAvKiBUaGUgc2NyZWVuTmFtZUxlbmd0aCBmaWVsZCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgdGV4dCBzdG9yZWQKKyAgICAgaW4gdGhlIHNjcmVlbk5hbWUgZmllbGQsIGV4Y2x1ZGluZyB0aGUgbnVsbCBieXRlIHRlcm1pbmF0b3IuICBUaGUKKyAgICAgc2NyZWVuTmFtZSBmaWVsZCBjb250YWlucyB0aGUgc2NyZWVuIG5hbWUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBTQ1JFRU5OQU1FCisgICAgIGtleXdvcmQgaW4gTkxNTElOSywgYW5kIGNhbiBiZSB1cCB0byBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSAorICAgICBjaGFyYWN0ZXJzLiAqLworCisgIHVuc2lnbmVkIGNoYXIgc2NyZWVuTmFtZUxlbmd0aDsKKyAgY2hhciBzY3JlZW5OYW1lW05MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIICsgMV07CisKKyAgLyogVGhlIHRocmVhZE5hbWVMZW5ndGggZmllbGQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHRleHQgc3RvcmVkCisgICAgIGluIHRoZSB0aHJlYWROYW1lIGZpZWxkLCBleGNsdWRpbmcgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlCisgICAgIHRocmVhZE5hbWUgZmllbGQgY29udGFpbnMgdGhlIHRocmVhZCBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgVEhSRUFETkFNRQorICAgICBrZXl3b3JkIGluIE5MTUxJTkssIGFuZCBjYW4gYmUgdXAgdG8gTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgKKyAgICAgY2hhcmFjdGVycy4gKi8KKworICB1bnNpZ25lZCBjaGFyIHRocmVhZE5hbWVMZW5ndGg7CisgIGNoYXIgdGhyZWFkTmFtZVtOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCArIDFdOworCit9IE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXI7CisKKyNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyIG5sbV9pbnRlcm5hbF92YXJpYWJsZV9oZWFkZXIKKyNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIKKyNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyIG5sbV9pbnRlcm5hbF92YXJpYWJsZV9oZWFkZXIKKyNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIKKworLyogVGhlIHZlcnNpb24gaGVhZGVyIGlzIG9uZSBvZiB0aGUgb3B0aW9uYWwgYXV4aWxpYXJ5IGhlYWRlcnMgYW5kCisgICBmb2xsb3dzIHRoZSBmaXhlZCBsZW5ndGggYW5kIHZhcmlhYmxlIGxlbmd0aCBOTE0gaGVhZGVycy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCit7CisgIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiVmVSc0lvTiMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KKyAgY2hhciBzdGFtcFs4XTsKKyAgbG9uZyBtYWpvclZlcnNpb247CisgIGxvbmcgbWlub3JWZXJzaW9uOworICBsb25nIHJldmlzaW9uOworICBsb25nIHllYXI7CisgIGxvbmcgbW9udGg7CisgIGxvbmcgZGF5OworfSBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXI7CisKKyNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCisjZGVmaW5lIE5sbTMyX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcgorI2RlZmluZSBubG02NF9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlciBubG1faW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIKKyNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyCisKK3R5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyCit7CisgIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ29QeVJpR2hUPSIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLworICBjaGFyIHN0YW1wWzEwXTsKKyAgdW5zaWduZWQgY2hhciBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOworICBjaGFyIGNvcHlyaWdodE1lc3NhZ2VbTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEhdOworfSBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcjsKKworI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyIG5sbV9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyCisjZGVmaW5lIE5sbTMyX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIKKyNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlciBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgorI2RlZmluZSBObG02NF9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCisKK3R5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKK3sKKyAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJNZVNzQWdFcyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLworICBjaGFyIHN0YW1wWzhdOworICBsb25nIGxhbmd1YWdlSUQ7CisgIGZpbGVfcHRyIG1lc3NhZ2VGaWxlT2Zmc2V0OworICBiZmRfc2l6ZV90eXBlIG1lc3NhZ2VGaWxlTGVuZ3RoOworICBsb25nIG1lc3NhZ2VDb3VudDsKKyAgZmlsZV9wdHIgaGVscEZpbGVPZmZzZXQ7CisgIGJmZF9zaXplX3R5cGUgaGVscEZpbGVMZW5ndGg7CisgIGZpbGVfcHRyIFJQQ0RhdGFPZmZzZXQ7CisgIGJmZF9zaXplX3R5cGUgUlBDRGF0YUxlbmd0aDsKKyAgZmlsZV9wdHIgc2hhcmVkQ29kZU9mZnNldDsKKyAgYmZkX3NpemVfdHlwZSBzaGFyZWRDb2RlTGVuZ3RoOworICBmaWxlX3B0ciBzaGFyZWREYXRhT2Zmc2V0OworICBiZmRfc2l6ZV90eXBlIHNoYXJlZERhdGFMZW5ndGg7CisgIGZpbGVfcHRyIHNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldDsKKyAgbG9uZyBzaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudDsKKyAgZmlsZV9wdHIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQ7CisgIGxvbmcgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudDsKKyAgZmlsZV9wdHIgc2hhcmVkUHVibGljc09mZnNldDsKKyAgbG9uZyBzaGFyZWRQdWJsaWNzQ291bnQ7CisgIGZpbGVfcHRyIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0OworICBsb25nIHNoYXJlZERlYnVnUmVjb3JkQ291bnQ7CisgIGJmZF92bWEgU2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQ7CisgIGJmZF92bWEgU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldDsKKyAgbG9uZyBwcm9kdWN0SUQ7CisgIGxvbmcgcmVzZXJ2ZWQwOworICBsb25nIHJlc2VydmVkMTsKKyAgbG9uZyByZXNlcnZlZDI7CisgIGxvbmcgcmVzZXJ2ZWQzOworICBsb25nIHJlc2VydmVkNDsKKyAgbG9uZyByZXNlcnZlZDU7Cit9IE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXI7CisKKyNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKKyNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIKKyNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKKyNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIKKworLyogVGhlIGZvcm1hdCBvZiBhIGN1c3RvbSBoZWFkZXIgYXMgc3RvcmVkIGludGVybmFsbHkgaXMgZGlmZmVyZW50CisgICBmcm9tIHRoZSBleHRlcm5hbCBmb3JtYXQuICBUaGlzIGlzIGhvdyB3ZSBzdG9yZSBhIGN1c3RvbSBoZWFkZXIKKyAgIHdoaWNoIHdlIGRvIG5vdCByZWNvZ25pemUuICAqLworCit0eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgoreworICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN1U3RIZUFkIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCisgIGNoYXIgc3RhbXBbOF07CisgIGJmZF9zaXplX3R5cGUgaGRyTGVuZ3RoOworICBmaWxlX3B0ciBkYXRhT2Zmc2V0OworICBiZmRfc2l6ZV90eXBlIGRhdGFMZW5ndGg7CisgIGNoYXIgZGF0YVN0YW1wWzhdOworICBQVFIgaGRyOworfSBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcjsKKworI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jdXN0b21faGVhZGVyIG5sbV9pbnRlcm5hbF9jdXN0b21faGVhZGVyCisjZGVmaW5lIE5sbTMyX0ludGVybmFsX0N1c3RvbV9IZWFkZXIgTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIKKyNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfY3VzdG9tX2hlYWRlciBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgorI2RlZmluZSBObG02NF9JbnRlcm5hbF9DdXN0b21fSGVhZGVyIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCisKKy8qIFRoZSBpbnRlcm5hbCBDeWdudXMgaGVhZGVyIGlzIHdyaXR0ZW4gb3V0IGV4dGVybmFsbHkgYXMgYSBjdXN0b20KKyAgIGhlYWRlci4gIFdlIGRvbid0IHRyeSB0byByZXBsaWNhdGUgdGhhdCBzdHJ1Y3R1cmUgaGVyZS4gICovCisKK3R5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcgoreworICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN5R25Vc0V4IiBpbiB0aGUgc3RhbXAgZmllbGQuICovCisgIGNoYXIgc3RhbXBbOF07CisgIC8qIEZpbGUgbG9jYXRpb24gb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgZmlsZV9wdHIgb2Zmc2V0OworICAvKiBMZW5ndGggb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyAgYmZkX3NpemVfdHlwZSBsZW5ndGg7Cit9IE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcjsKKworI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlciBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKKyNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyCisjZGVmaW5lIG5sbTY0X2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyIG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcgorI2RlZmluZSBObG02NF9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlciBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL3BwYy1leHQuaCBiL2luY2x1ZGUvbmxtL3BwYy1leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFlMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG0vcHBjLWV4dC5oCkBAIC0wLDAgKzEsMTYzIEBACisvKiBQb3dlclBDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KKyAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgT0xERk9STUFUCisKKy8qIFRoZSBmb3JtYXQgb2YgYSBQb3dlclBDIE5MTSBjaGFuZ2VkLiAgVGhlc2Ugc3RydWN0dXJlcyBhcmUgb25seQorICAgdXNlZCBpbiB0aGUgb2xkIGZvcm1hdC4gICovCisKKy8qIEEgUG93ZXJQQyBOTE0gc3RhcnRzIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyCit7CisgIC8qIFNpZ25hdHVyZS4gIE11c3QgYmUgIkFwcGxlTkxNIi4gICovCisgIGNoYXIgc2lnbmF0dXJlWzhdOworICAvKiBWZXJzaW9uIG51bWJlci4gIEN1cnJlbnQgdmFsdWUgaXMgMS4gICovCisgIHVuc2lnbmVkIGNoYXIgaGVhZGVyVmVyc2lvbls0XTsKKyAgLyogPz8uICBTaG91bGQgYmUgc2V0IHRvIDAuICAqLworICB1bnNpZ25lZCBjaGFyIG9yaWdpbnNbNF07CisgIC8qIEZpbGUgY3JlYXRpb24gZGF0ZSBpbiBzdGFuZGFyZCBVbml4IHRpbWUgZm9ybWF0IChzZWNvbmRzIHNpbmNlCisgICAgIDEvMS83MCkuICAqLworICB1bnNpZ25lZCBjaGFyIGRhdGVbNF07Cit9OworCisjZGVmaW5lIE5MTTMyX1BPV0VSUENfU0lHTkFUVVJFICJBcHBsZU5MTSIKKyNkZWZpbmUgTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTiAxCisKKy8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgYSBQb3dlclBDIE5MTSByZWxvYy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgYW4KKyAgIFhDT0ZGIGR5bmFtaWMgcmVsb2MuICAqLworCitzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9yZWxvYworeworICAvKiBBZGRyZXNzLiAgKi8KKyAgdW5zaWduZWQgY2hhciBsX3ZhZGRyWzRdOworICAvKiBTeW1ib2wgdGFibGUgaW5kZXguICBUaGlzIGlzIDAgZm9yIC50ZXh0IGFuZCAxIGZvciAuZGF0YS4gIDIKKyAgICAgbWVhbnMgLmJzcywgYnV0IEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB1c2VkLiAgSW4gWENPRkYsIGxhcmdlcgorICAgICBudW1iZXJzIGFyZSBpbmRpY2VzIGludG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBidXQgdGhleSBhcmUKKyAgICAgcHJlc3VtYWJseSBub3QgdXNlZCBpbiBhbiBOTE0uICAqLworICB1bnNpZ25lZCBjaGFyIGxfc3ltbmR4WzRdOworICAvKiBSZWxvY2F0aW9uIHR5cGUuICAqLworICB1bnNpZ25lZCBjaGFyIGxfcnR5cGVbMl07CisgIC8qIFNlY3Rpb24gbnVtYmVyIGJlaW5nIHJlbG9jYXRlZC4gICovCisgIHVuc2lnbmVkIGNoYXIgbF9yc2Vjbm1bMl07Cit9OworCisjZW5kaWYgLyogT0xERk9STUFUICovCisKKy8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCisKK3R5cGVkZWYgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfZml4ZWRfaGVhZGVyCit7CisKKyAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgorICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLworCisgIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlWzI0XTsKKworICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgorICAgICBpcyA0LiAqLworCisgIHVuc2lnbmVkIGNoYXIgdmVyc2lvbls0XTsKKworICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCisgICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uKS4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCisgICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcworICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCisgICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KKworICB1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVbMTRdOworCisgIC8qIFBhZGRpbmcgdG8gbWFrZSBpdCBjb21lIG91dCBjb3JyZWN0LiAqLworCisgIHVuc2lnbmVkIGNoYXIgcGFkMVsyXTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCisKKyAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLworCisgIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCisKKyAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLworCisgIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKKworICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKKyAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAorICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KKworICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCisgICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCisgICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KKworICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOworCisgIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KKyAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCisgICAgIE5MTUxJTksuICovCisKKyAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOworCisgIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOworCisgIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCisgICAgIAorICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKKworICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOworCisgIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLworCisgIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07CisKKyAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOworCisgIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07CisKK30gTmxtMzJfcG93ZXJwY19FeHRlcm5hbF9GaXhlZF9IZWFkZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9zcGFyYzMyLWV4dC5oIGIvaW5jbHVkZS9ubG0vc3BhcmMzMi1leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGViMmRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG0vc3BhcmMzMi1leHQuaApAQCAtMCwwICsxLDEyMCBAQAorLyogU1BBUkMgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3VwcG9ydCBmb3IgQkZELgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoZSBleHRlcm5hbCBmb3JtYXQgb2YgdGhlIGZpeGVkIGhlYWRlci4gICovCisKK3R5cGVkZWYgc3RydWN0IG5sbTMyX3NwYXJjX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgoreworCisgIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KKyAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KKworICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07CisKKyAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKKyAgICAgaXMgNC4gKi8KKworICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07CisKKyAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAorICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQorICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKKyAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQorICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCisKKyAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKKworICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KKworICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KKworICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07CisKKyAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCisgICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKKyAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCisKKyAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQorICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQorICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCisKKyAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCisKKyAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgorICAgICBOTE1MSU5LLiAqLworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKKworICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKKworICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLworICAgICAKKyAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07CisKKyAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKKworICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07CisKKyAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07CisKKyAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KKworICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOworCisgIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKKworICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOworCisgIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKKworICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOworCit9IE5sbTMyX3NwYXJjX0V4dGVybmFsX0ZpeGVkX0hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2FzeXMuaCBiL2luY2x1ZGUvb2FzeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdkMjUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vYXN5cy5oCkBAIC0wLDAgKzEsMTUyIEBACisvKiBPYXN5cyBvYmplY3QgZm9ybWF0IGhlYWRlciBmaWxlIGZvciBCRkQuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gICovCisKKyNkZWZpbmUgT0FTWVNfTUFYX1NFQ19DT1VOVCAxNgorLyogKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCBvYXN5c19hcmNoaXZlX2hlYWRlciB7CisgIHVuc2lnbmVkIGludCAgdmVyc2lvbjsKKyAgY2hhciBjcmVhdGVfZGF0ZVsxMl07CisgIGNoYXIgcmV2aXNpb25fZGF0ZVsxMl07CisgIHVuc2lnbmVkIGludCBtb2RfY291bnQ7CisgIGZpbGVfcHRyIG1vZF90Ymxfb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgc3ltX3RibF9zaXplOworICB1bnNpZ25lZCBpbnQgc3ltX2NvdW50OworICBmaWxlX3B0ciBzeW1fdGJsX29mZnNldDsKKyAgdW5zaWduZWQgaW50IHhyZWZfY291bnQ7CisgIGZpbGVfcHRyIHhyZWZfbHN0X29mZnNldDsKK30gb2FzeXNfYXJjaGl2ZV9oZWFkZXJfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXIgeworICBiZmRfYnl0ZSB2ZXJzaW9uWzRdOworICBiZmRfYnl0ZSBjcmVhdGVfZGF0ZVsxMl07CisgIGJmZF9ieXRlIHJldmlzaW9uX2RhdGVbMTJdOworICBiZmRfYnl0ZSBtb2RfY291bnRbNF07CisgIGJmZF9ieXRlIG1vZF90Ymxfb2Zmc2V0WzRdOworICBiZmRfYnl0ZSBzeW1fdGJsX3NpemVbNF07CisgIGJmZF9ieXRlIHN5bV9jb3VudFs0XTsKKyAgYmZkX2J5dGUgc3ltX3RibF9vZmZzZXRbNF07CisgIGJmZF9ieXRlIHhyZWZfY291bnRbNF07CisgIGJmZF9ieXRlIHhyZWZfbHN0X29mZnNldFs0XTsKK30gb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXJfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfbW9kdWxlX3RhYmxlIHsKKyAgaW50IG1vZF9udW1iZXI7CisgIGNoYXIgbW9kX2RhdGVbMTJdOworICB1bnNpZ25lZCBpbnQgbW9kX3NpemU7CisgIHVuc2lnbmVkIGludCBkZXBfY291bnQ7CisgIHVuc2lnbmVkIGludCBkZXBlZV9jb3VudDsKKyAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CisgIHVuc2lnbmVkIGludCBzZWN0X2NvdW50OworICBjaGFyICptb2R1bGVfbmFtZTsKKyAgdW5zaWduZWQgaW50IG1vZHVsZV9uYW1lX3NpemU7Cit9IG9hc3lzX21vZHVsZV90YWJsZV90eXBlOworCisKK3R5cGVkZWYgc3RydWN0IG9hc3lzX2V4dG1vZHVsZV90YWJsZV9hIHsKKyAgYmZkX2J5dGUgbW9kX251bWJlcls0XTsKKyAgYmZkX2J5dGUgbW9kX2RhdGVbMTJdOworICBiZmRfYnl0ZSBtb2Rfc2l6ZVs0XTsKKyAgYmZkX2J5dGUgZGVwX2NvdW50WzRdOworICBiZmRfYnl0ZSBkZXBlZV9jb3VudFs0XTsKKyAgYmZkX2J5dGUgc2VjdF9jb3VudFs0XTsKKyAgYmZkX2J5dGUgZmlsZV9vZmZzZXRbNF07CisgIGJmZF9ieXRlIG1vZF9uYW1lWzMyXTsKK30gb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYV90eXBlOworCit0eXBlZGVmIHN0cnVjdCBvYXN5c19leHRtb2R1bGVfdGFibGVfYiB7CisgIGJmZF9ieXRlIG1vZF9udW1iZXJbNF07CisgIGJmZF9ieXRlIG1vZF9kYXRlWzEyXTsKKyAgYmZkX2J5dGUgbW9kX3NpemVbNF07CisgIGJmZF9ieXRlIGRlcF9jb3VudFs0XTsKKyAgYmZkX2J5dGUgZGVwZWVfY291bnRbNF07CisgIGJmZF9ieXRlIHNlY3RfY291bnRbNF07CisgIGJmZF9ieXRlIGZpbGVfb2Zmc2V0WzRdOworICBiZmRfYnl0ZSBtb2RfbmFtZV9sZW5ndGhbNF07Cit9IG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2JfdHlwZTsKKworCit0eXBlZGVmIGVudW0gb2FzeXNfcmVjb3JkIHsKKyAgb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtID0gMCwKKyAgb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bSA9IDEsCisgIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bSA9IDIsCisgIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bSA9IDMsCisgIG9hc3lzX3JlY29yZF9pc19uYW1lZF9zZWN0aW9uX2VudW0gPSA0LAorICBvYXN5c19yZWNvcmRfaXNfY29tX2VudW0gPSA1LAorICBvYXN5c19yZWNvcmRfaXNfZGVidWdfZW51bSA9IDYsCisgIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW0gPSA3LAorICBvYXN5c19yZWNvcmRfaXNfZGVidWdfZmlsZV9lbnVtID0gOCwKKyAgb2FzeXNfcmVjb3JkX2lzX21vZHVsZV9lbnVtID0gOSwKKyAgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0gPSAxMAorfSBvYXN5c19yZWNvcmRfZW51bV90eXBlOworCisgIAorCit0eXBlZGVmIHN0cnVjdCBvYXN5c19yZWNvcmRfaGVhZGVyIHsKKyAgdW5zaWduZWQgY2hhciBsZW5ndGg7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tfc3VtOworICB1bnNpZ25lZCBjaGFyIHR5cGU7CisgIHVuc2lnbmVkIGNoYXIgZmlsbDsKK30gb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlOworCit0eXBlZGVmIHN0cnVjdCBvYXN5c19kYXRhX3JlY29yZCB7CisgIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7CisgIHVuc2lnbmVkIGNoYXIgcmVsYjsKKyAgYmZkX2J5dGUgYWRkcls0XTsKKyAgLyogbWF4aW11bSB0b3RhbCBzaXplIG9mIGRhdGEgcmVjb3JkIGlzIDI1NSBieXRlcyAqLworICBiZmRfYnl0ZSBkYXRhWzI0Nl07Cit9IG9hc3lzX2RhdGFfcmVjb3JkX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IG9hc3lzX2hlYWRlcl9yZWNvcmQgeworICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOworICB1bnNpZ25lZCBjaGFyIHZlcnNpb25fbnVtYmVyOworICB1bnNpZ25lZCBjaGFyIHJldl9udW1iZXI7CisgIGNoYXIgbW9kdWxlX25hbWVbMjYtNl07CisgIGNoYXIgZGVzY3JpcHRpb25bNjQtMjZdOworfSBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGU7CisKKyNkZWZpbmUgT0FTWVNfVkVSU0lPTl9OVU1CRVIgMAorI2RlZmluZSBPQVNZU19SRVZfTlVNQkVSIDAKKwordHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfc3ltYm9sX3JlY29yZCB7CisgIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7CisgIHVuc2lnbmVkIGNoYXIgcmVsYjsKKyAgYmZkX2J5dGUgdmFsdWVbNF07CisgIGJmZF9ieXRlIHJlZm5vWzJdOworICBjaGFyIG5hbWVbNjRdOworfSBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGU7CisKKyNkZWZpbmUgUkVMT0NBVElPTl9QQ1JFTF9CSVQgMHg4MAorI2RlZmluZSBSRUxPQ0FUSU9OXzMyQklUX0JJVCAweDQwCisjZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9CSVRTIDB4MzAKKyNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX0FCUyAweDAwCisjZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9SRUwgMHgxMAorI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfVU5EIDB4MjAKKyNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX0NPTSAweDMwCisjZGVmaW5lIFJFTE9DQVRJT05fU0VDVF9CSVRTIDB4MGYKKwordHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfc2VjdGlvbl9yZWNvcmQgeworICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOworICB1bnNpZ25lZCBjaGFyIHJlbGI7CisgIGJmZF9ieXRlIHZhbHVlWzRdOworICBiZmRfYnl0ZSB2bWFbNF07CisgIGJmZF9ieXRlIGZpbGxbM107Cit9IG9hc3lzX3NlY3Rpb25fcmVjb3JkX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IG9hc3lzX2VuZF9yZWNvcmQgeworICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOworICB1bnNpZ25lZCBjaGFyIHJlbGI7CisgIGJmZF9ieXRlIGVudHJ5WzRdOworICBiZmRfYnl0ZSBmaWxsWzJdOworICBiZmRfYnl0ZSB6ZXJvOworfSBvYXN5c19lbmRfcmVjb3JkX3R5cGU7CisKK3R5cGVkZWYgdW5pb24gb2FzeXNfcmVjb3JkX3VuaW9uIHsKKyAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgb2FzeXNfZGF0YV9yZWNvcmRfdHlwZSBkYXRhOworICBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlIHNlY3Rpb247CisgIG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSBzeW1ib2w7CisgIG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSBmaXJzdDsKKyAgb2FzeXNfZW5kX3JlY29yZF90eXBlIGVuZDsKKyAgYmZkX2J5dGUgcGFkWzI1Nl07Cit9IG9hc3lzX3JlY29yZF91bmlvbl90eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYmphbGxvYy5oIGIvaW5jbHVkZS9vYmphbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDUxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29iamFsbG9jLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIG9iamFsbG9jLmggLS0gcm91dGluZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvYmplY3RzCisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNvbHV0aW9ucy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgT0JKQUxMT0NfSAorI2RlZmluZSBPQkpBTExPQ19ICisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorCisvKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBzcGFjZSBmb3IgYW4gb2JqZWN0LiAgVGhlIGFzc3VtcHRpb24gaXMKKyAgIHRoYXQgdGhlIG9iamVjdCB3aWxsIHdhbnQgdG8gYWxsb2NhdGUgc3BhY2UgYXMgaXQgZ29lcyBhbG9uZywgYnV0CisgICB3aWxsIG5ldmVyIHdhbnQgdG8gZnJlZSBhbnkgcGFydGljdWxhciBibG9jay4gIFRoZXJlIGlzIGEgZnVuY3Rpb24KKyAgIHRvIGZyZWUgYSBibG9jaywgd2hpY2ggYWxzbyBmcmVlcyBhbGwgbW9yZSByZWNlbnRseSBhbGxvY2F0ZWQKKyAgIGJsb2Nrcy4gIFRoZXJlIGlzIGFsc28gYSBmdW5jdGlvbiB0byBmcmVlIGFsbCB0aGUgYWxsb2NhdGVkIHNwYWNlLgorCisgICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgc3BlY2lhbGl6YXRpb24gb2Ygb2JzdGFja3MuICBUaGUgbWFpbgorICAgZGlmZmVyZW5jZSBpcyB0aGF0IGEgYmxvY2sgbWF5IG5vdCBiZSBhbGxvY2F0ZWQgYSBiaXQgYXQgYSB0aW1lLgorICAgQW5vdGhlciBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlc2Ugcm91dGluZXMgYXJlIGFsd2F5cyBidWlsdCBvbiB0b3AKKyAgIG9mIG1hbGxvYywgYW5kIGFsd2F5cyBwYXNzIGFuIG1hbGxvYyBmYWlsdXJlIGJhY2sgdG8gdGhlIGNhbGxlciwKKyAgIHVubGlrZSBtb3JlIHJlY2VudCB2ZXJzaW9ucyBvZiBvYnN0YWNrcy4gICovCisKKy8qIFRoaXMgaXMgd2hhdCBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUgbG9va3MgbGlrZS4gIENhbGxlcnMgc2hvdWxkIG5vdAorICAgcmVmZXIgdG8gdGhlc2UgZmllbGRzLCBub3Igc2hvdWxkIHRoZXkgYWxsb2NhdGUgdGhlc2Ugc3RydWN0dXJlCisgICB0aGVtc2VsdmVzLiAgSW5zdGVhZCwgdGhleSBzaG91bGQgb25seSBjcmVhdGUgdGhlbSB2aWEKKyAgIG9iamFsbG9jX2luaXQsIGFuZCBvbmx5IGFjY2VzcyB0aGVtIHZpYSB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MKKyAgIGxpc3RlZCBiZWxvdy4gIFRoZSBzdHJ1Y3R1cmUgaXMgb25seSBkZWZpbmVkIGhlcmUgc28gdGhhdCB3ZSBjYW4KKyAgIGFjY2VzcyBpdCB2aWEgbWFjcm9zLiAgKi8KKworc3RydWN0IG9iamFsbG9jCit7CisgIGNoYXIgKmN1cnJlbnRfcHRyOworICB1bnNpZ25lZCBpbnQgY3VycmVudF9zcGFjZTsKKyAgUFRSIGNodW5rczsKK307CisKKy8qIFdvcmsgb3V0IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLworCitzdHJ1Y3Qgb2JqYWxsb2NfYWxpZ24geyBjaGFyIHg7IGRvdWJsZSBkOyB9OworCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjaWZuZGVmIG9mZnNldG9mCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKyNkZWZpbmUgT0JKQUxMT0NfQUxJR04gXAorICAoKHB0cmRpZmZfdCkgKChjaGFyICopICYoKHN0cnVjdCBvYmphbGxvY19hbGlnbiAqKSAwKS0+ZCAtIChjaGFyICopIDApKQorI2Vsc2UKKyNkZWZpbmUgT0JKQUxMT0NfQUxJR04gXAorICAoKGxvbmcpICgoY2hhciAqKSAmKChzdHJ1Y3Qgb2JqYWxsb2NfYWxpZ24gKikgMCktPmQgLSAoY2hhciAqKSAwKSkKKyNlbmRpZgorCisvKiBDcmVhdGUgYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgUmV0dXJucyBOVUxMIGlmIG1hbGxvYyBmYWlscy4gICovCisKK2V4dGVybiBzdHJ1Y3Qgb2JqYWxsb2MgKm9iamFsbG9jX2NyZWF0ZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEFsbG9jYXRlIHNwYWNlIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgUmV0dXJucyBOVUxMIGlmIG1hbGxvYworICAgZmFpbHMuICAqLworCitleHRlcm4gUFRSIF9vYmphbGxvY19hbGxvYyBQQVJBTVMgKChzdHJ1Y3Qgb2JqYWxsb2MgKiwgdW5zaWduZWQgbG9uZykpOworCisvKiBUaGUgbWFjcm8gdmVyc2lvbiBvZiBvYmphbGxvY19hbGxvYy4gIFdlIG9ubHkgZGVmaW5lIHRoaXMgaWYgdXNpbmcKKyAgIGdjYywgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSB0byBldmFsdWF0ZSB0aGUgYXJndW1lbnRzCisgICBtdWx0aXBsZSB0aW1lcywgb3IgdXNlIGEgdGVtcG9yYXJ5IGZpZWxkIGFzIG9ic3RhY2suaCBkb2VzLiAgKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKworLyogTmV4dFN0ZXAgMi4wIGNjIGlzIHJlYWxseSBnY2MgMS45MyBidXQgaXQgZGVmaW5lcyBfX0dOVUNfXyA9IDIgYW5kCisgICBkb2VzIG5vdCBpbXBsZW1lbnQgX19leHRlbnNpb25fXy4gIEJ1dCB0aGF0IGNvbXBpbGVyIGRvZXNuJ3QgZGVmaW5lCisgICBfX0dOVUNfTUlOT1JfXy4gICovCisjaWYgX19HTlVDX18gPCAyIHx8IChfX05lWFRfXyAmJiAhX19HTlVDX01JTk9SX18pCisjZGVmaW5lIF9fZXh0ZW5zaW9uX18KKyNlbmRpZgorCisjZGVmaW5lIG9iamFsbG9jX2FsbG9jKG8sIGwpCQkJCQkJXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisgICh7IHN0cnVjdCBvYmphbGxvYyAqX19vID0gKG8pOwkJCQkJXAorICAgICB1bnNpZ25lZCBsb25nIF9fbGVuID0gKGwpOwkJCQkJCVwKKyAgICAgaWYgKF9fbGVuID09IDApCQkJCQkJCVwKKyAgICAgICBfX2xlbiA9IDE7CQkJCQkJCVwKKyAgICAgX19sZW4gPSAoX19sZW4gKyBPQkpBTExPQ19BTElHTiAtIDEpICZ+IChPQkpBTExPQ19BTElHTiAtIDEpOwlcCisgICAgIChfX2xlbiA8PSBfX28tPmN1cnJlbnRfc3BhY2UJCQkJCVwKKyAgICAgID8gKF9fby0+Y3VycmVudF9wdHIgKz0gX19sZW4sCQkJCQlcCisJIF9fby0+Y3VycmVudF9zcGFjZSAtPSBfX2xlbiwJCQkJCVwKKwkgKFBUUikgKF9fby0+Y3VycmVudF9wdHIgLSBfX2xlbikpCQkJCVwKKyAgICAgIDogX29iamFsbG9jX2FsbG9jIChfX28sIF9fbGVuKSk7IH0pCisKKyNlbHNlIC8qICEgX19HTlVDX18gKi8KKworI2RlZmluZSBvYmphbGxvY19hbGxvYyhvLCBsKSBfb2JqYWxsb2NfYWxsb2MgKChvKSwgKGwpKQorCisjZW5kaWYgLyogISBfX0dOVUNfXyAqLworCisvKiBGcmVlIGFuIGVudGlyZSBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLworCitleHRlcm4gdm9pZCBvYmphbGxvY19mcmVlIFBBUkFNUyAoKHN0cnVjdCBvYmphbGxvYyAqKSk7CisKKy8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgYnkgb2JqYWxsb2NfYWxsb2MuICBUaGlzIGFsc28gZnJlZXMgYWxsIG1vcmUKKyAgIHJlY2VudGx5IGFsbG9jYXRlZCBibG9ja3MuICAqLworCitleHRlcm4gdm9pZCBvYmphbGxvY19mcmVlX2Jsb2NrIFBBUkFNUyAoKHN0cnVjdCBvYmphbGxvYyAqLCBQVFIpKTsKKworI2VuZGlmIC8qIE9CSkFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2JzdGFjay5oIGIvaW5jbHVkZS9vYnN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlOTY3NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb2JzdGFjay5oCkBAIC0wLDAgKzEsNTkzIEBACisvKiBvYnN0YWNrLmggLSBvYmplY3Qgc3RhY2sgbWFjcm9zCisgICBDb3B5cmlnaHQgKEMpIDE5ODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKworICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KKyAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogU3VtbWFyeToKKworQWxsIHRoZSBhcHBhcmVudCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSBtYWNyb3MuIFRoZSBpZGVhCitpcyB0aGF0IHlvdSB3b3VsZCB1c2UgdGhlc2UgcHJlLXRlc3RlZCBtYWNyb3MgdG8gc29sdmUgYQordmVyeSBzcGVjaWZpYyBzZXQgb2YgcHJvYmxlbXMsIGFuZCB0aGV5IHdvdWxkIHJ1biBmYXN0LgorQ2F1dGlvbjogbm8gc2lkZS1lZmZlY3RzIGluIGFyZ3VtZW50cyBwbGVhc2UhISBUaGV5IG1heSBiZQorZXZhbHVhdGVkIE1BTlkgdGltZXMhIQorCitUaGVzZSBtYWNyb3Mgb3BlcmF0ZSBhIHN0YWNrIG9mIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdGFydHMgbGlmZQorc21hbGwsIGFuZCBtYXkgZ3JvdyB0byBtYXR1cml0eS4gIChDb25zaWRlciBidWlsZGluZyBhIHdvcmQgc3lsbGFibGUKK2J5IHN5bGxhYmxlLikgIEFuIG9iamVjdCBjYW4gbW92ZSB3aGlsZSBpdCBpcyBncm93aW5nLiAgT25jZSBpdCBoYXMKK2JlZW4gImZpbmlzaGVkIiBpdCBuZXZlciBjaGFuZ2VzIGFkZHJlc3MgYWdhaW4uICBTbyB0aGUgInRvcCBvZiB0aGUKK3N0YWNrIiBpcyB0eXBpY2FsbHkgYW4gaW1tYXR1cmUgZ3Jvd2luZyBvYmplY3QsIHdoaWxlIHRoZSByZXN0IG9mIHRoZQorc3RhY2sgaXMgb2YgbWF0dXJlLCBmaXhlZCBzaXplIGFuZCBmaXhlZCBhZGRyZXNzIG9iamVjdHMuCisKK1RoZXNlIHJvdXRpbmVzIGdyYWIgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSwgdXNpbmcgYSBmdW5jdGlvbiB5b3UKK3N1cHBseSwgY2FsbGVkIGBvYnN0YWNrX2NodW5rX2FsbG9jJy4gIE9uIG9jY2FzaW9uLCB0aGV5IGZyZWUgY2h1bmtzLAorYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19mcmVlJy4gIFlvdSBtdXN0IGRlZmluZSB0aGVtIGFuZCBkZWNsYXJlCit0aGVtIGJlZm9yZSB1c2luZyBhbnkgb2JzdGFjayBtYWNyb3MuCisKK0VhY2ggaW5kZXBlbmRlbnQgc3RhY2sgaXMgcmVwcmVzZW50ZWQgYnkgYSBgc3RydWN0IG9ic3RhY2snLgorRWFjaCBvZiB0aGUgb2JzdGFjayBtYWNyb3MgZXhwZWN0cyBhIHBvaW50ZXIgdG8gc3VjaCBhIHN0cnVjdHVyZQorYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorCitPbmUgbW90aXZhdGlvbiBmb3IgdGhpcyBwYWNrYWdlIGlzIHRoZSBwcm9ibGVtIG9mIGdyb3dpbmcgY2hhciBzdHJpbmdzCitpbiBzeW1ib2wgdGFibGVzLiAgVW5sZXNzIHlvdSBhcmUgImZhc2Npc3QgcGlnIHdpdGggYSByZWFkLW9ubHkgbWluZCIKKy0tR29zcGVyJ3MgaW1tb3J0YWwgcXVvdGUgZnJvbSBIQUtNRU0gaXRlbSAxNTQsIG91dCBvZiBjb250ZXh0LS15b3UKK3dvdWxkIG5vdCBsaWtlIHRvIHB1dCBhbnkgYXJiaXRyYXJ5IHVwcGVyIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgeW91cgorc3ltYm9scy4KKworSW4gcHJhY3RpY2UgdGhpcyBvZnRlbiBtZWFucyB5b3Ugd2lsbCBidWlsZCBtYW55IHNob3J0IHN5bWJvbHMgYW5kIGEKK2ZldyBsb25nIHN5bWJvbHMuICBBdCB0aGUgdGltZSB5b3UgYXJlIHJlYWRpbmcgYSBzeW1ib2wgeW91IGRvbid0IGtub3cKK2hvdyBsb25nIGl0IGlzLiAgT25lIHRyYWRpdGlvbmFsIG1ldGhvZCBpcyB0byByZWFkIGEgc3ltYm9sIGludG8gYQorYnVmZmVyLCByZWFsbG9jKClhdGluZyB0aGUgYnVmZmVyIGV2ZXJ5IHRpbWUgeW91IHRyeSB0byByZWFkIGEgc3ltYm9sCit0aGF0IGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBUaGlzIGlzIGJlYXV0LCBidXQgeW91IHN0aWxsIHdpbGwKK3dhbnQgdG8gY29weSB0aGUgc3ltYm9sIGZyb20gdGhlIGJ1ZmZlciB0byBhIG1vcmUgcGVybWFuZW50CitzeW1ib2wtdGFibGUgZW50cnkgc2F5IGFib3V0IGhhbGYgdGhlIHRpbWUuCisKK1dpdGggb2JzdGFja3MsIHlvdSBjYW4gd29yayBkaWZmZXJlbnRseS4gIFVzZSBvbmUgb2JzdGFjayBmb3IgYWxsIHN5bWJvbAorbmFtZXMuICBBcyB5b3UgcmVhZCBhIHN5bWJvbCwgZ3JvdyB0aGUgbmFtZSBpbiB0aGUgb2JzdGFjayBncmFkdWFsbHkuCitXaGVuIHRoZSBuYW1lIGlzIGNvbXBsZXRlLCBmaW5hbGl6ZSBpdC4gIFRoZW4sIGlmIHRoZSBzeW1ib2wgZXhpc3RzIGFscmVhZHksCitmcmVlIHRoZSBuZXdseSByZWFkIG5hbWUuCisKK1RoZSB3YXkgd2UgZG8gdGhpcyBpcyB0byB0YWtlIGEgbGFyZ2UgY2h1bmssIGFsbG9jYXRpbmcgbWVtb3J5IGZyb20KK2xvdyBhZGRyZXNzZXMuICBXaGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3ltYm9sIGluIHRoZSBjaHVuayB5b3UganVzdAorYWRkIGNoYXJzIGFib3ZlIHRoZSBjdXJyZW50ICJoaWdoIHdhdGVyIG1hcmsiIGluIHRoZSBjaHVuay4gIFdoZW4geW91CitoYXZlIGZpbmlzaGVkIGFkZGluZyBjaGFycywgYmVjYXVzZSB5b3UgZ290IHRvIHRoZSBlbmQgb2YgdGhlIHN5bWJvbCwKK3lvdSBrbm93IGhvdyBsb25nIHRoZSBjaGFycyBhcmUsIGFuZCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBvYmplY3QuCitNb3N0bHkgdGhlIGNoYXJzIHdpbGwgbm90IGJ1cnN0IG92ZXIgdGhlIGhpZ2hlc3QgYWRkcmVzcyBvZiB0aGUgY2h1bmssCitiZWNhdXNlIHlvdSB3b3VsZCB0eXBpY2FsbHkgZXhwZWN0IGEgY2h1bmsgdG8gYmUgKHNheSkgMTAwIHRpbWVzIGFzCitsb25nIGFzIGFuIGF2ZXJhZ2Ugb2JqZWN0LgorCitJbiBjYXNlIHRoYXQgaXNuJ3QgY2xlYXIsIHdoZW4gd2UgaGF2ZSBlbm91Z2ggY2hhcnMgdG8gbWFrZSB1cAordGhlIG9iamVjdCwgVEhFWSBBUkUgQUxSRUFEWSBDT05USUdVT1VTIElOIFRIRSBDSFVOSyAoZ3VhcmFudGVlZCkKK3NvIHdlIGp1c3QgcG9pbnQgdG8gaXQgd2hlcmUgaXQgbGllcy4gIE5vIG1vdmluZyBvZiBjaGFycyBpcworbmVlZGVkIGFuZCB0aGlzIGlzIHRoZSBzZWNvbmQgd2luOiBwb3RlbnRpYWxseSBsb25nIHN0cmluZ3MgbmVlZAorbmV2ZXIgYmUgZXhwbGljaXRseSBzaHVmZmxlZC4gT25jZSBhbiBvYmplY3QgaXMgZm9ybWVkLCBpdCBkb2VzIG5vdAorY2hhbmdlIGl0cyBhZGRyZXNzIGR1cmluZyBpdHMgbGlmZXRpbWUuCisKK1doZW4gdGhlIGNoYXJzIGJ1cnN0IG92ZXIgYSBjaHVuayBib3VuZGFyeSwgd2UgYWxsb2NhdGUgYSBsYXJnZXIKK2NodW5rLCBhbmQgdGhlbiBjb3B5IHRoZSBwYXJ0bHkgZm9ybWVkIG9iamVjdCBmcm9tIHRoZSBlbmQgb2YgdGhlIG9sZAorY2h1bmsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGxhcmdlciBjaHVuay4gIFdlIHRoZW4gY2Fycnkgb24KK2FjY3JldGluZyBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIG9iamVjdCBhcyB3ZSBub3JtYWxseSB3b3VsZC4KKworQSBzcGVjaWFsIG1hY3JvIGlzIHByb3ZpZGVkIHRvIGFkZCBhIHNpbmdsZSBjaGFyIGF0IGEgdGltZSB0byBhCitncm93aW5nIG9iamVjdC4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgcmVnaXN0ZXIgdmFyaWFibGVzLCB3aGljaAorYnJlYWsgdGhlIG9yZGluYXJ5ICdncm93dGgnIG1hY3JvLgorCitTdW1tYXJ5OgorCVdlIGFsbG9jYXRlIGxhcmdlIGNodW5rcy4KKwlXZSBjYXJ2ZSBvdXQgb25lIG9iamVjdCBhdCBhIHRpbWUgZnJvbSB0aGUgY3VycmVudCBjaHVuay4KKwlPbmNlIGNhcnZlZCwgYW4gb2JqZWN0IG5ldmVyIG1vdmVzLgorCVdlIGFyZSBmcmVlIHRvIGFwcGVuZCBkYXRhIG9mIGFueSBzaXplIHRvIHRoZSBjdXJyZW50bHkKKwkgIGdyb3dpbmcgb2JqZWN0LgorCUV4YWN0bHkgb25lIG9iamVjdCBpcyBncm93aW5nIGluIGFuIG9ic3RhY2sgYXQgYW55IG9uZSB0aW1lLgorCVlvdSBjYW4gcnVuIG9uZSBvYnN0YWNrIHBlciBjb250cm9sIGJsb2NrLgorCVlvdSBtYXkgaGF2ZSBhcyBtYW55IGNvbnRyb2wgYmxvY2tzIGFzIHlvdSBkYXJlLgorCUJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyBpdCwgeW91IGNhbiBgdW53aW5kJyBhbiBvYnN0YWNrCisJICBiYWNrIHRvIGEgcHJldmlvdXMgc3RhdGUuIChZb3UgbWF5IHJlbW92ZSBvYmplY3RzIG11Y2gKKwkgIGFzIHlvdSB3b3VsZCB3aXRoIGEgc3RhY2suKQorKi8KKworCisvKiBEb24ndCBkbyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1vcmUgdGhhbiBvbmNlLiAgKi8KKworI2lmbmRlZiBfT0JTVEFDS19ICisjZGVmaW5lIF9PQlNUQUNLX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisMCisvKiBXZSB1c2Ugc3VidHJhY3Rpb24gb2YgKGNoYXIgKikgMCBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gaW50CisgICBiZWNhdXNlIG9uIHdvcmQtYWRkcmVzc2FibGUgbWFjaGluZXMgYSBzaW1wbGUgY2FzdCB0byBpbnQKKyAgIG1heSBpZ25vcmUgdGhlIGJ5dGUtd2l0aGluLXdvcmQgZmllbGQgb2YgdGhlIHBvaW50ZXIuICAqLworCisjaWZuZGVmIF9fUFRSX1RPX0lOVAorIyBkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoUCkgLSAoY2hhciAqKSAwKQorI2VuZGlmCisKKyNpZm5kZWYgX19JTlRfVE9fUFRSCisjIGRlZmluZSBfX0lOVF9UT19QVFIoUCkgKChQKSArIChjaGFyICopIDApCisjZW5kaWYKKworLyogV2UgbmVlZCB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC4gIElmIF9fUFRSRElGRl9UWVBFX18gaXMKKyAgIGRlZmluZWQsIGFzIHdpdGggR05VIEMsIHVzZSB0aGF0OyB0aGF0IHdheSB3ZSBkb24ndCBwb2xsdXRlIHRoZQorICAgbmFtZXNwYWNlIHdpdGggPHN0ZGRlZi5oPidzIHN5bWJvbHMuICBPdGhlcndpc2UsIGlmIDxzdGRkZWYuaD4gaXMKKyAgIGF2YWlsYWJsZSwgaW5jbHVkZSBpdCBhbmQgdXNlIHB0cmRpZmZfdC4gIEluIHRyYWRpdGlvbmFsIEMsIGxvbmcgaXMKKyAgIHRoZSBiZXN0IHRoYXQgd2UgY2FuIGRvLiAgKi8KKworI2lmZGVmIF9fUFRSRElGRl9UWVBFX18KKyMgZGVmaW5lIFBUUl9JTlRfVFlQRSBfX1BUUkRJRkZfVFlQRV9fCisjZWxzZQorIyBpZmRlZiBIQVZFX1NURERFRl9ICisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGRlZmluZSBQVFJfSU5UX1RZUEUgcHRyZGlmZl90CisjIGVsc2UKKyMgIGRlZmluZSBQVFJfSU5UX1RZUEUgbG9uZworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSAorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoRnJvbSksIChOKSkKKyNlbHNlCisjIGlmZGVmIG1lbWNweQorIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgbWVtY3B5ICgoVG8pLCAoRnJvbSksIChOKSkKKyMgZWxzZQorIyAgZGVmaW5lIF9vYnN0YWNrX21lbWNweShUbywgRnJvbSwgTikgYmNvcHkgKChGcm9tKSwgKFRvKSwgKE4pKQorIyBlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBfb2JzdGFja19jaHVuawkJLyogTGl2ZXMgYXQgZnJvbnQgb2YgZWFjaCBjaHVuay4gKi8KK3sKKyAgY2hhciAgKmxpbWl0OwkJCS8qIDEgcGFzdCBlbmQgb2YgdGhpcyBjaHVuayAqLworICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnByZXY7CS8qIGFkZHJlc3Mgb2YgcHJpb3IgY2h1bmsgb3IgTlVMTCAqLworICBjaGFyCWNvbnRlbnRzWzRdOwkJLyogb2JqZWN0cyBiZWdpbiBoZXJlICovCit9OworCitzdHJ1Y3Qgb2JzdGFjawkJLyogY29udHJvbCBjdXJyZW50IG9iamVjdCBpbiBjdXJyZW50IGNodW5rICovCit7CisgIGxvbmcJY2h1bmtfc2l6ZTsJCS8qIHByZWZlcnJlZCBzaXplIHRvIGFsbG9jYXRlIGNodW5rcyBpbiAqLworICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOwkvKiBhZGRyZXNzIG9mIGN1cnJlbnQgc3RydWN0IG9ic3RhY2tfY2h1bmsgKi8KKyAgY2hhcgkqb2JqZWN0X2Jhc2U7CQkvKiBhZGRyZXNzIG9mIG9iamVjdCB3ZSBhcmUgYnVpbGRpbmcgKi8KKyAgY2hhcgkqbmV4dF9mcmVlOwkJLyogd2hlcmUgdG8gYWRkIG5leHQgY2hhciB0byBjdXJyZW50IG9iamVjdCAqLworICBjaGFyCSpjaHVua19saW1pdDsJCS8qIGFkZHJlc3Mgb2YgY2hhciBhZnRlciBjdXJyZW50IGNodW5rICovCisgIFBUUl9JTlRfVFlQRSB0ZW1wOwkJLyogVGVtcG9yYXJ5IGZvciBzb21lIG1hY3Jvcy4gICovCisgIGludCAgIGFsaWdubWVudF9tYXNrOwkJLyogTWFzayBvZiBhbGlnbm1lbnQgZm9yIGVhY2ggb2JqZWN0LiAqLworI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKyAgLyogVGhlc2UgcHJvdG90eXBlcyB2YXJ5IGJhc2VkIG9uIGB1c2VfZXh0cmFfYXJnJywgYW5kIHdlIHVzZQorICAgICBjYXN0cyB0byB0aGUgcHJvdG90eXBlbGVzcyBmdW5jdGlvbiB0eXBlIGluIGFsbCBhc3NpZ25tZW50cywKKyAgICAgYnV0IGhhdmluZyBwcm90b3R5cGVzIGhlcmUgcXVpZXRzIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLworICBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqY2h1bmtmdW4pICh2b2lkICosIGxvbmcpOworICB2b2lkICgqZnJlZWZ1bikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopOworICB2b2lkICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KKyNlbHNlCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKCk7IC8qIFVzZXIncyBmY24gdG8gYWxsb2NhdGUgYSBjaHVuay4gICovCisgIHZvaWQgKCpmcmVlZnVuKSAoKTsJCS8qIFVzZXIncyBmdW5jdGlvbiB0byBmcmVlIGEgY2h1bmsuICAqLworICBjaGFyICpleHRyYV9hcmc7CQkvKiBmaXJzdCBhcmcgZm9yIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgKi8KKyNlbmRpZgorICB1bnNpZ25lZCB1c2VfZXh0cmFfYXJnOjE7CS8qIGNodW5rIGFsbG9jL2RlYWxsb2MgZnVuY3MgdGFrZSBleHRyYSBhcmcgKi8KKyAgdW5zaWduZWQgbWF5YmVfZW1wdHlfb2JqZWN0OjE7LyogVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjdXJyZW50CisJCQkJICAgY2h1bmsgY29udGFpbnMgYSB6ZXJvLWxlbmd0aCBvYmplY3QuICBUaGlzCisJCQkJICAgcHJldmVudHMgZnJlZWluZyB0aGUgY2h1bmsgaWYgd2UgYWxsb2NhdGUKKwkJCQkgICBhIGJpZ2dlciBjaHVuayB0byByZXBsYWNlIGl0LiAqLworICB1bnNpZ25lZCBhbGxvY19mYWlsZWQ6MTsJLyogTm8gbG9uZ2VyIHVzZWQsIGFzIHdlIG5vdyBjYWxsIHRoZSBmYWlsZWQKKwkJCQkgICBoYW5kbGVyIG9uIGVycm9yLCBidXQgcmV0YWluZWQgZm9yIGJpbmFyeQorCQkJCSAgIGNvbXBhdGliaWxpdHkuICAqLworfTsKKworLyogRGVjbGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIHdlIHVzZTsgdGhleSBhcmUgaW4gb2JzdGFjay5jLiAgKi8KKworI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KK2V4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAorCQkJICAgIHZvaWQgKigqKSAobG9uZyksIHZvaWQgKCopICh2b2lkICopKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCisJCQkgICAgIHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSwKKwkJCSAgICAgdm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICopOworI2Vsc2UKK2V4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rICgpOworZXh0ZXJuIHZvaWQgX29ic3RhY2tfZnJlZSAoKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKCk7CitleHRlcm4gaW50IF9vYnN0YWNrX2JlZ2luXzEgKCk7CitleHRlcm4gaW50IF9vYnN0YWNrX21lbW9yeV91c2VkICgpOworI2VuZGlmCisMCisjaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworCisvKiBEbyB0aGUgZnVuY3Rpb24tZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3RzCisgICBidXQgYmVmb3JlIGRlZmluaW5nIHRoZSBtYWNyb3MuICAqLworCit2b2lkIG9ic3RhY2tfaW5pdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOworCit2b2lkICogb2JzdGFja19hbGxvYyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKKwordm9pZCAqIG9ic3RhY2tfY29weSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmFkZHJlc3MsIGludCBzaXplKTsKK3ZvaWQgKiBvYnN0YWNrX2NvcHkwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOworCit2b2lkIG9ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmJsb2NrKTsKKwordm9pZCBvYnN0YWNrX2JsYW5rIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOworCit2b2lkIG9ic3RhY2tfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKK3ZvaWQgb2JzdGFja19ncm93MCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEsIGludCBzaXplKTsKKwordm9pZCBvYnN0YWNrXzFncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGFfY2hhcik7Cit2b2lkIG9ic3RhY2tfcHRyX2dyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKK3ZvaWQgb2JzdGFja19pbnRfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhKTsKKwordm9pZCAqIG9ic3RhY2tfZmluaXNoIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7CisKK2ludCBvYnN0YWNrX29iamVjdF9zaXplIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7CisKK2ludCBvYnN0YWNrX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKK3ZvaWQgb2JzdGFja19tYWtlX3Jvb20gKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Cit2b2lkIG9ic3RhY2tfMWdyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhX2NoYXIpOwordm9pZCBvYnN0YWNrX3B0cl9ncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICpkYXRhKTsKK3ZvaWQgb2JzdGFja19pbnRfZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOwordm9pZCBvYnN0YWNrX2JsYW5rX2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7CisKK3ZvaWQgKiBvYnN0YWNrX2Jhc2UgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKK3ZvaWQgKiBvYnN0YWNrX25leHRfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOworaW50IG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKK2ludCBvYnN0YWNrX2NodW5rX3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKK2ludCBvYnN0YWNrX21lbW9yeV91c2VkIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7CisKKyNlbmRpZiAvKiBfX1NURENfXyAqLworCisvKiBOb24tQU5TSSBDIGNhbm5vdCByZWFsbHkgc3VwcG9ydCBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZXNlIG1hY3JvcywKKyAgIHNvIHdlIGRvIG5vdCBkZWNsYXJlIHRoZW0uICAqLworCisvKiBFcnJvciBoYW5kbGVyIGNhbGxlZCB3aGVuIGBvYnN0YWNrX2NodW5rX2FsbG9jJyBmYWlsZWQgdG8gYWxsb2NhdGUKKyAgIG1vcmUgbWVtb3J5LiAgVGhpcyBjYW4gYmUgc2V0IHRvIGEgdXNlciBkZWZpbmVkIGZ1bmN0aW9uLiAgVGhlCisgICBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0LiAgKi8KKyNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCitleHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICh2b2lkKTsKKyNlbHNlCitleHRlcm4gdm9pZCAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOworI2VuZGlmCisKKy8qIEV4aXQgdmFsdWUgdXNlZCB3aGVuIGBwcmludF9hbmRfYWJvcnQnIGlzIHVzZWQuICAqLworZXh0ZXJuIGludCBvYnN0YWNrX2V4aXRfZmFpbHVyZTsKKwwKKy8qIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG9iamVjdCBiZWluZyBhbGxvY2F0ZWQgb3IgdG8gYmUgYWxsb2NhdGVkIG5leHQuCisgICBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3QgYmUgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdAorICAgYmVjYXVzZSBhIG5ldyBjaHVuayBtaWdodCBiZSBuZWVkZWQgdG8gaG9sZCB0aGUgZmluYWwgc2l6ZS4gICovCisKKyNkZWZpbmUgb2JzdGFja19iYXNlKGgpICgoaCktPm9iamVjdF9iYXNlKQorCisvKiBTaXplIGZvciBhbGxvY2F0aW5nIG9yZGluYXJ5IGNodW5rcy4gICovCisKKyNkZWZpbmUgb2JzdGFja19jaHVua19zaXplKGgpICgoaCktPmNodW5rX3NpemUpCisKKy8qIFBvaW50ZXIgdG8gbmV4dCBieXRlIG5vdCB5ZXQgYWxsb2NhdGVkIGluIGN1cnJlbnQgY2h1bmsuICAqLworCisjZGVmaW5lIG9ic3RhY2tfbmV4dF9mcmVlKGgpCSgoaCktPm5leHRfZnJlZSkKKworLyogTWFzayBzcGVjaWZ5aW5nIGxvdyBiaXRzIHRoYXQgc2hvdWxkIGJlIGNsZWFyIGluIGFkZHJlc3Mgb2YgYW4gb2JqZWN0LiAgKi8KKworI2RlZmluZSBvYnN0YWNrX2FsaWdubWVudF9tYXNrKGgpICgoaCktPmFsaWdubWVudF9tYXNrKQorCisvKiBUbyBwcmV2ZW50IHByb3RvdHlwZSB3YXJuaW5ncyBwcm92aWRlIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QgaW4KKyAgIHN0YW5kYXJkIEMgdmVyc2lvbi4gICovCisjaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworCisjIGRlZmluZSBvYnN0YWNrX2luaXQoaCkgXAorICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLCBcCisJCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQorCisjIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCisJCSAgKHZvaWQgKigqKSAobG9uZykpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQorCisjIGRlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbihoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuKSBcCisgIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKKwkJICAgICh2b2lkICooKikgKGxvbmcpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKHZvaWQgKikpIChmcmVlZnVuKSkKKworIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCisgIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAorCQkgICAgKHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSkgKGNodW5rZnVuKSwgXAorCQkgICAgKHZvaWQgKCopICh2b2lkICosIHZvaWQgKikpIChmcmVlZnVuKSwgKGFyZykpCisKKyMgZGVmaW5lIG9ic3RhY2tfY2h1bmtmdW4oaCwgbmV3Y2h1bmtmdW4pIFwKKyAgKChoKSAtPiBjaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSh2b2lkICosIGxvbmcpKSAobmV3Y2h1bmtmdW4pKQorCisjIGRlZmluZSBvYnN0YWNrX2ZyZWVmdW4oaCwgbmV3ZnJlZWZ1bikgXAorICAoKGgpIC0+IGZyZWVmdW4gPSAodm9pZCAoKikodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIChuZXdmcmVlZnVuKSkKKworI2Vsc2UKKworIyBkZWZpbmUgb2JzdGFja19pbml0KGgpIFwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgMCwgMCwgXAorCQkgICh2b2lkICooKikgKCkpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAoKSkgb2JzdGFja19jaHVua19mcmVlKQorCisjIGRlZmluZSBvYnN0YWNrX2JlZ2luKGgsIHNpemUpIFwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAwLCBcCisJCSAgKHZvaWQgKigqKSAoKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICgpKSBvYnN0YWNrX2NodW5rX2ZyZWUpCisKKyMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pIFwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAorCQkgICAgKHZvaWQgKigqKSAoKSkgKGNodW5rZnVuKSwgKHZvaWQgKCopICgpKSAoZnJlZWZ1bikpCisKKyMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4sIGFyZykgXAorICBfb2JzdGFja19iZWdpbl8xICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKKwkJICAgICh2b2lkICooKikgKCkpIChjaHVua2Z1biksICh2b2lkICgqKSAoKSkgKGZyZWVmdW4pLCAoYXJnKSkKKworIyBkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAorICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKCkpIChuZXdjaHVua2Z1bikpCisKKyMgZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCisgICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSgpKSAobmV3ZnJlZWZ1bikpCisKKyNlbmRpZgorCisjZGVmaW5lIG9ic3RhY2tfMWdyb3dfZmFzdChoLGFjaGFyKSAoKigoaCktPm5leHRfZnJlZSkrKyA9IGFjaGFyKQorCisjZGVmaW5lIG9ic3RhY2tfYmxhbmtfZmFzdChoLG4pICgoaCktPm5leHRfZnJlZSArPSAobikpCisKKyNkZWZpbmUgb2JzdGFja19tZW1vcnlfdXNlZChoKSBfb2JzdGFja19tZW1vcnlfdXNlZCAoaCkKKwwKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKy8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAorICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQorICAgX19HTlVDX01JTk9SX18uICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fTmVYVF9fICYmICFfX0dOVUNfTUlOT1JfXykKKyMgIGRlZmluZSBfX2V4dGVuc2lvbl9fCisjIGVuZGlmCisKKy8qIEZvciBHTlUgQywgaWYgbm90IC10cmFkaXRpb25hbCwKKyAgIHdlIGNhbiBkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGNvbXB1dGUgYWxsIGFyZ3Mgb25seSBvbmNlCisgICB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIHZhcmlhYmxlLgorICAgQWxzbywgd2UgY2FuIGF2b2lkIHVzaW5nIHRoZSBgdGVtcCcgc2xvdCwgdG8gbWFrZSBmYXN0ZXIgY29kZS4gICovCisKKyMgZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoT0JTVEFDSykJCQkJCVwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJXAorICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgICAodW5zaWduZWQpIChfX28tPm5leHRfZnJlZSAtIF9fby0+b2JqZWN0X2Jhc2UpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX3Jvb20oT0JTVEFDSykJCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgICAgKHVuc2lnbmVkKSAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oT0JTVEFDSyxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICBpZiAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKE9CU1RBQ0spCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgICAgKF9fby0+Y2h1bmstPnByZXYgPT0gMCAmJiBfX28tPm5leHRfZnJlZSAtIF9fby0+Y2h1bmstPmNvbnRlbnRzID09IDApOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2dyb3coT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBfX2xlbiA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCisgICBfb2JzdGFja19tZW1jcHkgKF9fby0+bmV4dF9mcmVlLCAoY2hhciAqKSAod2hlcmUpLCBfX2xlbik7CQlcCisgICBfX28tPm5leHRfZnJlZSArPSBfX2xlbjsJCQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19ncm93MChPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIF9fbGVuICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbiArIDEpOwkJCQlcCisgICBfb2JzdGFja19tZW1jcHkgKF9fby0+bmV4dF9mcmVlLCAoY2hhciAqKSAod2hlcmUpLCBfX2xlbik7CQlcCisgICBfX28tPm5leHRfZnJlZSArPSBfX2xlbjsJCQkJCQlcCisgICAqKF9fby0+bmV4dF9mcmVlKSsrID0gMDsJCQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja18xZ3JvdyhPQlNUQUNLLGRhdHVtKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIDEgPiBfX28tPmNodW5rX2xpbWl0KQkJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIDEpOwkJCQkJXAorICAgKihfX28tPm5leHRfZnJlZSkrKyA9IChkYXR1bSk7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworLyogVGhlc2UgYXNzdW1lIHRoYXQgdGhlIG9ic3RhY2sgYWxpZ25tZW50IGlzIGdvb2QgZW5vdWdoIGZvciBwb2ludGVycyBvciBpbnRzLAorICAgYW5kIHRoYXQgdGhlIGRhdGEgYWRkZWQgc28gZmFyIHRvIHRoZSBjdXJyZW50IG9iamVjdAorICAgc2hhcmVzIHRoYXQgbXVjaCBhbGlnbm1lbnQuICAqLworCisjIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBzaXplb2YgKHZvaWQgKikgPiBfX28tPmNodW5rX2xpbWl0KQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKHZvaWQgKikpOwkJCQlcCisgICAqKCh2b2lkICoqKV9fby0+bmV4dF9mcmVlKSsrID0gKCh2b2lkICopZGF0dW0pOwkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2ludF9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGludCkgPiBfX28tPmNodW5rX2xpbWl0KQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKGludCkpOwkJCQlcCisgICAqKChpbnQgKilfX28tPm5leHRfZnJlZSkrKyA9ICgoaW50KWRhdHVtKTsJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChoLGFwdHIpICgqKCh2b2lkICoqKSAoaCktPm5leHRfZnJlZSkrKyA9ICh2b2lkICopYXB0cikKKyMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3dfZmFzdChoLGFpbnQpICgqKChpbnQgKikgKGgpLT5uZXh0X2ZyZWUpKysgPSAoaW50KSBhaW50KQorCisjIGRlZmluZSBvYnN0YWNrX2JsYW5rKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgIGlmIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUgPCBfX2xlbikJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKKyAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2FsbG9jKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIG9ic3RhY2tfYmxhbmsgKF9faCwgKGxlbmd0aCkpOwkJCQkJXAorICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfY29weShPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIG9ic3RhY2tfZ3JvdyAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKKyAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAorICAgb2JzdGFja19ncm93MCAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKKyAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQorCisvKiBUaGUgbG9jYWwgdmFyaWFibGUgaXMgbmFtZWQgX19vMSB0byBhdm9pZCBhIG5hbWUgY29uZmxpY3QKKyAgIHdoZW4gb2JzdGFja19ibGFuayBpcyBjYWxsZWQuICAqLworIyBkZWZpbmUgb2JzdGFja19maW5pc2goT0JTVEFDSykgIAkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbzEgPSAoT0JTVEFDSyk7CQkJCQlcCisgICB2b2lkICp2YWx1ZTsJCQkJCQkJCVwKKyAgIHZhbHVlID0gKHZvaWQgKikgX19vMS0+b2JqZWN0X2Jhc2U7CQkJCQlcCisgICBpZiAoX19vMS0+bmV4dF9mcmVlID09IHZhbHVlKQkJCQkJXAorICAgICBfX28xLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwkJCQkJXAorICAgX19vMS0+bmV4dF9mcmVlCQkJCQkJCVwKKyAgICAgPSBfX0lOVF9UT19QVFIgKChfX1BUUl9UT19JTlQgKF9fbzEtPm5leHRfZnJlZSkrX19vMS0+YWxpZ25tZW50X21hc2spXAorCQkgICAgICYgfiAoX19vMS0+YWxpZ25tZW50X21hc2spKTsJCQlcCisgICBpZiAoX19vMS0+bmV4dF9mcmVlIC0gKGNoYXIgKilfX28xLT5jaHVuawkJCQlcCisgICAgICAgPiBfX28xLT5jaHVua19saW1pdCAtIChjaGFyICopX19vMS0+Y2h1bmspCQkJXAorICAgICBfX28xLT5uZXh0X2ZyZWUgPSBfX28xLT5jaHVua19saW1pdDsJCQkJXAorICAgX19vMS0+b2JqZWN0X2Jhc2UgPSBfX28xLT5uZXh0X2ZyZWU7CQkJCQlcCisgICB2YWx1ZTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19mcmVlKE9CU1RBQ0ssIE9CSikJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICB2b2lkICpfX29iaiA9IChPQkopOwkJCQkJCQlcCisgICBpZiAoX19vYmogPiAodm9pZCAqKV9fby0+Y2h1bmsgJiYgX19vYmogPCAodm9pZCAqKV9fby0+Y2h1bmtfbGltaXQpICBcCisgICAgIF9fby0+bmV4dF9mcmVlID0gX19vLT5vYmplY3RfYmFzZSA9IF9fb2JqOwkJCQlcCisgICBlbHNlIChvYnN0YWNrX2ZyZWUpIChfX28sIF9fb2JqKTsgfSkKKwwKKyNlbHNlIC8qIG5vdCBfX0dOVUNfXyBvciBub3QgX19TVERDX18gKi8KKworIyBkZWZpbmUgb2JzdGFja19vYmplY3Rfc2l6ZShoKSBcCisgKHVuc2lnbmVkKSAoKGgpLT5uZXh0X2ZyZWUgLSAoaCktPm9iamVjdF9iYXNlKQorCisjIGRlZmluZSBvYnN0YWNrX3Jvb20oaCkJCVwKKyAodW5zaWduZWQpICgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUpCisKKyMgZGVmaW5lIG9ic3RhY2tfZW1wdHlfcChoKSBcCisgKChoKS0+Y2h1bmstPnByZXYgPT0gMCAmJiAoaCktPm5leHRfZnJlZSAtIChoKS0+Y2h1bmstPmNvbnRlbnRzID09IDApCisKKy8qIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBfb2JzdGFja19uZXdjaHVuayBpcyBlbmNsb3NlZCBpbiAoLi4uLCAwKQorICAgc28gdGhhdCB3ZSBjYW4gYXZvaWQgaGF2aW5nIHZvaWQgZXhwcmVzc2lvbnMKKyAgIGluIHRoZSBhcm1zIG9mIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uLgorICAgQ2FzdGluZyB0aGUgdGhpcmQgb3BlcmFuZCB0byB2b2lkIHdhcyB0cmllZCBiZWZvcmUsCisgICBidXQgc29tZSBjb21waWxlcnMgd29uJ3QgYWNjZXB0IGl0LiAgKi8KKworIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oaCxsZW5ndGgpCQkJCQlcCisoIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCisgICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCksIDApIDogMCkpCisKKyMgZGVmaW5lIG9ic3RhY2tfZ3JvdyhoLHdoZXJlLGxlbmd0aCkJCQkJCVwKKyggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSwJCQlcCisgIF9vYnN0YWNrX21lbWNweSAoKGgpLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIChoKS0+dGVtcCksCVwKKyAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wKQorCisjIGRlZmluZSBvYnN0YWNrX2dyb3cwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAorICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wICsgMSksIDApIDogMCksCQkJXAorICBfb2JzdGFja19tZW1jcHkgKChoKS0+bmV4dF9mcmVlLCAoY2hhciAqKSAod2hlcmUpLCAoaCktPnRlbXApLAlcCisgIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcCwJCQkJCQlcCisgICooKGgpLT5uZXh0X2ZyZWUpKysgPSAwKQorCisjIGRlZmluZSBvYnN0YWNrXzFncm93KGgsZGF0dW0pCQkJCQkJXAorKCAoKChoKS0+bmV4dF9mcmVlICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIDEpLCAwKSA6IDApLAkJCQlcCisgICgqKChoKS0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coaCxkYXR1bSkJCQkJCVwKKyggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoY2hhciAqKSA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGNoYXIgKikpLCAwKSA6IDApLAkJXAorICAoKigoY2hhciAqKikgKCgoaCktPm5leHRfZnJlZSs9c2l6ZW9mKGNoYXIgKikpLXNpemVvZihjaGFyICopKSkgPSAoKGNoYXIgKikgZGF0dW0pKSkKKworIyBkZWZpbmUgb2JzdGFja19pbnRfZ3JvdyhoLGRhdHVtKQkJCQkJXAorKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChpbnQpID4gKGgpLT5jaHVua19saW1pdCkJCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGludCkpLCAwKSA6IDApLAkJCVwKKyAgKCooKGludCAqKSAoKChoKS0+bmV4dF9mcmVlKz1zaXplb2YoaW50KSktc2l6ZW9mKGludCkpKSA9ICgoaW50KSBkYXR1bSkpKQorCisjIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93X2Zhc3QoaCxhcHRyKSAoKigoY2hhciAqKikgKGgpLT5uZXh0X2ZyZWUpKysgPSAoY2hhciAqKSBhcHRyKQorIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCisKKyMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoaCxsZW5ndGgpCQkJCQlcCisoIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCisgICgoKGgpLT5jaHVua19saW1pdCAtIChoKS0+bmV4dF9mcmVlIDwgKGgpLT50ZW1wKQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCksIDApIDogMCksCQkJXAorICAoKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wKSkKKworIyBkZWZpbmUgb2JzdGFja19hbGxvYyhoLGxlbmd0aCkJCQkJCVwKKyAob2JzdGFja19ibGFuayAoKGgpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCisgKG9ic3RhY2tfZ3JvdyAoKGgpLCAod2hlcmUpLCAobGVuZ3RoKSksIG9ic3RhY2tfZmluaXNoICgoaCkpKQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorIChvYnN0YWNrX2dyb3cwICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfZmluaXNoKGgpICAJCQkJCQlcCisoICgoaCktPm5leHRfZnJlZSA9PSAoaCktPm9iamVjdF9iYXNlCQkJCQlcCisgICA/ICgoKGgpLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxKSwgMCkJCQkJCVwKKyAgIDogMCksCQkJCQkJCQlcCisgIChoKS0+dGVtcCA9IF9fUFRSX1RPX0lOVCAoKGgpLT5vYmplY3RfYmFzZSksCQkJCVwKKyAgKGgpLT5uZXh0X2ZyZWUJCQkJCQkJXAorICAgID0gX19JTlRfVE9fUFRSICgoX19QVFJfVE9fSU5UICgoaCktPm5leHRfZnJlZSkrKGgpLT5hbGlnbm1lbnRfbWFzaykJXAorCQkgICAgJiB+ICgoaCktPmFsaWdubWVudF9tYXNrKSksCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSAtIChjaGFyICopIChoKS0+Y2h1bmsJCQkJXAorICAgID4gKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspCQkJCVwKKyAgID8gKChoKS0+bmV4dF9mcmVlID0gKGgpLT5jaHVua19saW1pdCkgOiAwKSwJCQkJXAorICAoaCktPm9iamVjdF9iYXNlID0gKGgpLT5uZXh0X2ZyZWUsCQkJCQlcCisgIF9fSU5UX1RPX1BUUiAoKGgpLT50ZW1wKSkKKworIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCisjICBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKKyggKGgpLT50ZW1wID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKKyAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKKyAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCisJICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAorICAgOiAoKChvYnN0YWNrX2ZyZWUpICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSwgMCkpKQorIyBlbHNlCisjICBkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKKyggKGgpLT50ZW1wID0gKGNoYXIgKikgKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKKyAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKKyAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCisJICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAorICAgOiAoX29ic3RhY2tfZnJlZSAoKGgpLCAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCkpKQorIyBlbmRpZgorCisjZW5kaWYgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30JLyogQysrICovCisjZW5kaWYKKworI2VuZGlmIC8qIG9ic3RhY2suaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nIGIvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmMzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxODczIEBACisxOTk5LTA0LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoQ0dFTl9BVFRSKTogRGVsZXRlIG1lbWJlciBudW1fbm9uYm9vbHMuCisJKENHRU5fQVRUUl9UWVBFKTogVXBkYXRlLgorCShDR0VOX0FUVFJfTUFTSyk6IE51bWJlciBib29sZWFucyBzdGFydGluZyBhdCAwLgorCShDR0VOX0FUVFJfVkFMVUUpOiBVcGRhdGUuCisJKENHRU5fSU5TTl9BVFRSKTogVXBkYXRlLgorCitNb24gQXByIDEyIDIzOjQzOjI3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaHBwYS5oIChmbXB5ZmFkZCwgZm1weW5mYWRkLCBmbmVnLCBmbmVnYWJzKTogTmV3IFBBMi4wCisJaW5zdHJ1Y3Rpb25zLgorCitUdWUgTWFyIDIzIDExOjI0OjM4IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaHBwYS5oIChiYiwgYnZiKTogVHdlYWsgb3Bjb2RlL21hc2suCisKKworMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fSVNBLENHRU5fTUFDSCk6IE5ldyB0eXBlZGVmcy4KKwkoc3RydWN0IGNnZW5fY3B1X2Rlc2MpOiBSZW5hbWUgbWVtYmVyIG1hY2ggdG8gbWFjaHMuICBOZXcgbWVtYmVyIGlzYXMuCisJTmV3IG1lbWJlcnMgd29yZF9iaXRzaXplLGRlZmF1bHRfaW5zbl9iaXRzaXplLGJhc2VfaW5zbi1iaXRzaXplLAorCW1pbl9pbnNuX2JpdHNpemUsbWF4X2luc25fYml0c2l6ZSxpc2FfdGFibGUsbWFjaF90YWJsZSxyZWJ1aWxkX3RhYmxlcy4KKwlEZWxldGUgbWVtYmVyIG1heF9pbnNuX3NpemUuCisJKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOiBOZXcgZW51bS4KKwkoY3B1X29wZW4pOiBVcGRhdGUgcHJvdG90eXBlLgorCShjcHVfb3Blbl8xKTogRGVjbGFyZS4KKwkoY2dlbl9zZXRfY3B1KTogRGVsZXRlLgorCisxOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoQ0dFTl9IV19UQUJMRSk6IERlbGV0ZSBgbnVtX2luaXRfZW50cmllcycgbWVtYmVyLgorCShDR0VOX09QRVJBTkRfTklMKTogTmV3IG1hY3JvLgorCShDR0VOX09QRVJBTkQpOiBOZXcgbWVtYmVyIGB0eXBlJy4KKwkoQGFyY2hAX2NnZW5fb3BlcmFuZF90YWJsZSk6IERlbGV0ZSBkZWNsLgorCShDR0VOX09QRVJBTkRfSU5ERVgsQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9PUEVSQU5EX0VOVFJZKTogRGVsZXRlLgorCShDR0VOX09QRVJBTkRfVEFCTEUpOiBOZXcgc3RydWN0LgorCShjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUsY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0pOiBEZWNsYXJlLgorCShDR0VOX09QSU5TVCk6IFBvaW50ZXIgdG8gb3BlcmFuZCB0YWJsZSBlbnRyeSByZXBsYWNlZCB3aXRoIGVudW0uCisJKENHRU5fQ1BVX1RBQkxFKTogTmV3IG1lbWJlciBgaXNhJy4gIENoYW5nZSBtZW1iZXIgYG9wZXJhbmRfdGFibGUnLAorCW5vdyBhIENHRU5fT1BFUkFORF9UQUJMRS4gIEFkZCBDR0VOX0NQVV9ERVNDIGFyZyB0bworCXtnZXQsc2V0fV97aW50LHZtYX1fb3BlcmFuZC4KKwkoQGFyY2hAX2NnZW5fY3B1X29wZW4pOiBOZXcgYXJnIGBpc2EnLgorCShjZ2VuX3NldF9jcHUpOiBEaXR0by4KKworRnJpIEZlYiAyNiAwMjozNjo0NSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBpMzg2Lmg6IEZpbGwgaW4gY21vdiBhbmQgZmNtb3YgYWx0ZXJuYXRlcy4gIEFkZCBmY29taSBzaG9ydCBmb3Jtcy4KKworMTk5OS0wMi0yNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKGVudW0gY2dlbl9hc21fdHlwZSk6IEFkZCBDR0VOX0FTTV9OT05FLgorCShDR0VOX0hXX0VOVFJZKTogRGVsZXRlIG1lbWJlciBgbmV4dCcuICBDaGFuZ2UgdHlwZSBvZiBgdHlwZScgdG8KKwllbnVtIGNnZW5faHdfdHlwZS4KKwkoQ0dFTl9IV19UQUJMRSk6IE5ldyBzdHJ1Y3QuCisJKGh3X3RhYmxlKTogRGVsZXRlIGRlY2xhcmF0aW9uLgorCShDR0VOX09QRVJBTkQpOiBDaGFuZ2UgbWVtYmVyIGh3IHRvIGh3X3R5cGUsIGNoYW5nZSB0eXBlIGZyb20gcG9pbnRlcgorCXRvIHRhYmxlIGVudHJ5IHRvIGVudW0uCisJKENHRU5fT1BJTlNUKTogRGl0dG8uCisJKENHRU5fQ1BVX1RBQkxFKTogQ2hhbmdlIG1lbWJlciBod19saXN0IHRvIGh3X3RhYmxlLgorCitTYXQgRmViIDEzIDE0OjEzOjQ0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGFscGhhLmggKEFYUF9PUENPREVfRVY2KTogTmV3LgorCShBWFBfT1BDT0RFX05PUEFMKTogSW5jbHVkZSBpdC4KKworMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fQ1BVX0RFU0MpOiBSZW5hbWVkIGZyb20gQ0dFTl9PUENPREVfREVTQy4KKwlBbGwgdXNlcyB1cGRhdGVkLiAgTmV3IG1lbWJlcnMgaW50X2luc25fcCwgbWF4X2luc25fc2l6ZSwKKwlwYXJzZV9vcGVyYW5kLGluc2VydF9vcGVyYW5kLGV4dHJhY3Rfb3BlcmFuZCxwcmludF9vcGVyYW5kLAorCXNpemVvZl9maWVsZHMsc2V0X2ZpZWxkc19iaXRzaXplLGdldF9pbnRfb3BlcmFuZCxzZXRfaW50X29wZXJhbmQsCisJZ2V0X3ZtYV9vcGVyYW5kLHNldF92bWFfb3BlcmFuZCxwYXJzZV9oYW5kbGVycyxpbnNlcnRfaGFuZGxlcnMsCisJZXh0cmFjdF9oYW5kbGVycyxwcmludF9oYW5kbGVycy4KKwkoQ0dFTl9BVFRSKTogQ2hhbmdlIHR5cGUgb2YgbnVtX25vbmJvb2xzIHRvIHVuc2lnbmVkIGludC4KKwkoQ0dFTl9BVFRSX0JPT0xfT0ZGU0VUKTogTmV3IG1hY3JvLgorCShDR0VOX0FUVFJfTUFTSyk6IFN1YnRyYWN0IGl0IHRvIGNvbXB1dGUgYml0IG51bWJlci4KKwkoQ0dFTl9BVFRSX1ZBTFVFKTogUmVkbyBib29sL25vbmJvb2wgYXR0ciBjYWxjdWxhdGlvbi4KKwkoY2dlbl9vcGNvZGVfaGFuZGxlcik6IFJlbmFtZWQgZnJvbSBjZ2VuX2Jhc2UuCisJKENHRU5fSFdfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX0hXX0FUVFIsIGFsbCB1c2VzIHVwZGF0ZWQuCisJKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fT1BFUkFORF9BVFRSLAorCWFsbCB1c2VzIHVwZGF0ZWQuCisJKENHRU5fT1BFUkFORF9JTkRFWCk6IFJld3JpdGUgdG8gdXNlIHRhYmxlIGVudHJ5LCBub3QgZ2xvYmFsLgorCShlbnVtIGNnZW5fb3BpbnN0X3R5cGUpOiBSZW5hbWVkIGZyb20gY2dlbl9vcGVyYW5kX2luc3RhbmNlX3R5cGUuCisJKENHRU5fSUZMRF9BVFRSX1ZBTFVFKTogUmVuYW1lZCBmcm9tIENHRU5fSUZMRF9BVFRSLCBhbGwgdXNlcyB1cGRhdGVkLgorCShDR0VOX09QQ09ERSxDR0VOX0lCQVNFKTogTmV3IHR5cGVzLgorCShDR0VOX0lOU04pOiBSZXdyaXRlLgorCShDR0VOX3tBU00sRElTfV9IQVNIKik6IERlbGV0ZS4KKwkoaW5pdF9vcGNvZGVfdGFibGUsaW5pdF9pYmxkX3RhYmxlKTogRGVjbGFyZS4KKwkoQ0dFTl9JTlNOX0FUVFIpOiBOZXcgdHlwZS4KKworTW9uIEZlYiAgMSAyMTowOToxNCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKyAKKyAgICAgICAgKiBpMzg2LmggKGRfU3VmLCB4X1N1Ziwgc2xkX1N1Ziwgc2xkeF9TdWYsIGJ3bGRfU3VmKTogIERlZmluZS4KKyAgICAgICAgKHhfRlAsIGRfRlAsIGRsc19GUCwgc2xkeF9GUCk6ICBEZWZpbmUuCisgICAgICAgIENoYW5nZSAqU3VmIGRlZmluaXRpb25zIHRvIGluY2x1ZGUgeCBhbmQgZCBzdWZmaXhlcy4KKyAgICAgICAgKG1vdnN4KTogIFVzZSB3X1N1ZiBhbmQgYl9TdWYuCisgICAgICAgIChtb3Z6eCk6ICBMaWtld2lzZS4KKyAgICAgICAgKG1vdnMpOiAgVXNlIGJ3bGRfU3VmLgorICAgICAgICAoZmxkKTogIENoYW5nZSBvcmRlcmluZy4gIFVzZSBzbGRfRlAuCisgICAgICAgIChmaWxkKTogIEFkZCBJbnRlbCBTeW50YXggZXF1aXZhbGVudCBvZiBmaWxkcS4KKyAgICAgICAgKGZzdCk6ICBVc2Ugc2xkX0ZQLgorICAgICAgICAoZmlzdCk6ICBVc2Ugc2xkX0ZQLgorICAgICAgICAoZnN0cCk6ICBVc2Ugc2xkX0ZQLiAgQWRkIHhfRlAgdmVyc2lvbi4KKyAgICAgICAgKGZpc3RwKTogIExMb25nTWVtIHZlcnNpb24gZm9yIEludGVsIFN5bnRheC4KKyAgICAgICAgKGZjb20sIGZjb21wKTogIFVzZSBzbGRfRlAuCisgICAgICAgIChmYWRkLCBmaWFkZCwgZnN1Yik6ICBVc2Ugc2xkX0ZQLgorICAgICAgICAoZnN1YnIpOiAgVXNlIHNsZF9GUC4KKyAgICAgICAgKGZtdWwsIGZpbXVsLCBmZHZpLCBmaWRpdiwgZmRpdnIpOiAgVXNlIHNsZF9GUC4KKworMTk5OS0wMS0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKGVudW0gY2dlbl9tb2RlKTogQWRkIENHRU5fTU9ERV9UQVJHRVRfTUFYLCBDR0VOX01PREVfSU5ULAorCUNHRU5fTU9ERV9VSU5ULgorCitTYXQgSmFuIDE2IDAxOjI5OjI1IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaHBwYS5oIChidik6IEZpeCBtYXNrLgorCisxOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoQ0dFTl9BVFRSX1ZBTFVFX1RZUEUpOiBOZXcgdHlwZWRlZi4KKwkoQ0dFTl9BVFRSKTogVXNlIGl0LgorCShDR0VOX0FUVFJfVFlQRSxDR0VOX0FUVFJfRU5UUlkpOiBEaXR0by4KKwkoQ0dFTl9BVFRSX1RBQkxFKTogTmV3IG1lbWJlciBkZmF1bHQuCisKKzE5OTgtMTItMzAgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKE1JUFMxNl9JTlNOX0JSQU5DSCk6IE5ldy4KKworV2VkIERlYyAgOSAxMDozODo0OCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCVRoZSBmb2xsb3dpbmcgaXMgcGFydCBvZiBhIGNoYW5nZSBtYWRlIGJ5IEVkaXRoIEVwc3RlaW4KKyAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbgorIAljaGFuZ2VzIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KKworCSogaHBwYS5oIChjb21wbGV0ZXJfY2hhcnMpOiBsaXN0IG9mIGNoYXJzIHRvIG5vdCBwdXQgYSBzcGFjZQorIAlhZnRlci4KKworU3VuIERlYyAgNiAxMzoyMTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFBlcm1pdCB3IHN1ZmZpeCBvbiBwcm9jZXNzb3IgY29udHJvbCBhbmQKKyAJc3RhdHVzIHdvcmQgaW5zdHJ1Y3Rpb25zLgorCisxOTk4LTExLTMwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoc3RydWN0IGNnZW5faHdfZW50cnkpOiBEZWxldGUgY29uc3Qgb24gYXR0cnMgbWVtYmVyLgorCShzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5KTogRGl0dG8uCisJKHN0cnVjdCBjZ2VuX29wZXJhbmQpOiBEaXR0by4KKwkoQ0dFTl9JRkxEKTogTmV3IHR5cGVkZWYsIHdpdGggYXNzb2NpYXRlZCBhY2Nlc3MgbWFjcm9zLgorCShDR0VOX0lGTVQpOiBOZXcgdHlwZWRlZiwgd2l0aCBhc3NvY2lhdGVkIGFjY2VzcyBtYWNyb3MuCisJKENHRU5fSUZNVCk6IFJlbmFtZWQgZnJvbSBDR0VOX0ZPUk1BVC4gIE5ldyBtZW1iZXIgYGlmbGRzJy4KKwkoQ0dFTl9JVkFMVUUpOiBOZXcgdHlwZWRlZi4KKwkoc3RydWN0IGNnZW5faW5zbik6IERlbGV0ZSBjb25zdCBvbiBzeW50YXgsYXR0cnMgbWVtYmVycy4KKwlgZm9ybWF0JyBub3cgcG9pbnRzIHRvIGZvcm1hdCBkYXRhLiAgVHlwZSBvZiBgdmFsdWUnIGlzIG5vdworCUNHRU5fSVZBTFVFLgorCShzdHJ1Y3QgY2dlbl9vcGNvZGVfdGFibGUpOiBOZXcgbWVtYmVyIGlmbGRfdGFibGUuCisKKzE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY2dlbi5oIChjZ2VuX2V4dHJhY3RfZm4pOiBVcGRhdGUgdHlwZSBvZiBgYmFzZV9pbnNuJyBhcmcuCisJKENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyBtZW1iZXIgYGF0dHJzJy4KKwkoQ0dFTl9PUEVSQU5EX0lOU1RBTkNFX3tBVFRSUyxBVFRSfSk6IE5ldyBtYWNyb3MuCisJKGNnZW5fZGlzX2xvb2t1cF9pbnNuKTogVXBkYXRlIHR5cGUgb2YgYGJhc2VfaW5zbicgYXJnLgorCShjZ2VuX29wY29kZV90YWJsZSk6IFVwZGF0ZSB0eXBlIG9mIGRpc19oYXNoIGZuLgorCShleHRyYWN0X29wZXJhbmQpOiBVcGRhdGUgdHlwZSBvZiBgaW5zbl92YWx1ZScgYXJnLgorCitUaHUgT2N0IDI5IDExOjM4OjM2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoQ0dFTl9WRVJTSU9OX3tNQUpPUixNSU5PUixGSVhMRVZFTH0pOiBEZWxldGUuCisKK1R1ZSBPY3QgMjcgMDg6NTc6NTkgMTk5OCAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaCAoSU5TTl9NVUxUKTogQWRkZWQuCisKK1R1ZSBPY3QgMjAgMTE6MzE6MzQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LmggKE1BWF9NTkVNX1NJWkUpOiBSZW5hbWUgZnJvbSBNQVhfT1BDT0RFX1NJWkUuCisKK01vbiBPY3QgMTkgMTI6NTA6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoQ0dFTl9JTlNOX0lOVCk6IE5ldyB0eXBlZGVmLgorCShDR0VOX0lOVF9JTlNOX1ApOiBSZW5hbWVkIGZyb20gQ0dFTl9JTlRfSU5TTi4KKwkoQ0dFTl9JTlNOX0JZVEVTKTogUmVuYW1lZCBmcm9tIGNnZW5faW5zbl90LgorCShDR0VOX0lOU05fQllURVNfUFRSKTogTmV3IHR5cGVkZWYuCisJKENHRU5fRVhUUkFDVF9JTkZPKTogTmV3IHR5cGVkZWYuCisJKGNnZW5faW5zZXJ0X2ZuLGNnZW5fZXh0cmFjdF9mbik6IFVwZGF0ZS4KKwkoY2dlbl9vcGNvZGVfdGFibGUpOiBOZXcgbWVtYmVyIGBpbnNuX2VuZGlhbicuCisJKGFzc2VtYmxlX2luc24sbG9va3VwX2luc24sbG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogVXBkYXRlLgorCShpbnNlcnRfb3BlcmFuZCxleHRyYWN0X29wZXJhbmQpOiBVcGRhdGUuCisJKGNnZW5fZ2V0X2luc25fdmFsdWUsY2dlbl9wdXRfaW5zbl92YWx1ZSk6IEFkZCBwcm90b3R5cGVzLgorCitGcmkgT2N0ICA5IDEzOjM4OjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fQVRUUl9CT09MUyk6IE5ldyBtYWNyby4KKwkoc3RydWN0IENHRU5fSFdfRU5UUlkpOiBOZXcgbWVtYmVyIGBhdHRycycuCisJKENHRU5fSFdfQVRUUik6IE5ldyBtYWNyby4KKwkoc3RydWN0IENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyBtZW1iZXIgYG5hbWUnLgorCShDR0VOX0lOU05fSU5WQUxJRF9QKTogTmV3IG1hY3JvLgorCitNb24gT2N0ICA1IDAwOjIxOjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaHBwYS5oOiBBZGQgImZpZCIuCisJCitTdW4gT2N0ICA0IDIxOjAwOjAwIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCUZyb20gUm9iZXJ0IEFuZHJldyBEYWxlIDxyb2JAbmIubmV0PgorCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIEFNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zLgorCShBTURfM0ROT1dfT1BDT0RFKTogRGVmaW5lLgorCitUdWUgU2VwIDIyIDE3OjUzOjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGQzMHYuaCAoRUlUSEVSX0JVVF9QUkVGRVJfTVUpOiBEZWZpbmUuCisKK01vbiBBdWcgMTAgMTQ6MDk6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2dlbi5oIChjZ2VuX2luc24pOiAjaWYgMCBvdXQgZWxlbWVudCBgY2R4Jy4KKworTW9uIEF1ZyAgMyAxMjoyMTo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCU1vdmUgYWxsIGdsb2JhbCBzdGF0ZSBkYXRhIGludG8gb3Bjb2RlIHRhYmxlIHN0cnVjdCwgYW5kIHRyZWF0CisJb3Bjb2RlIHRhYmxlIGFzIHNvbWV0aGluZyB0aGF0IGlzICJvcGVuZWQvY2xvc2VkIi4KKwkqIGNnZW4uaCAoQ0dFTl9PUENPREVfREVTQyk6IE5ldyB0eXBlLgorCShhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KKwkoY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbik6IEFkZCBwcm90b3R5cGUuCisJKGNnZW5fY3VycmVudF9tYWNoaW5lLGNnZW5fY3VycmVudF9lbmRpYW4pOiBEZWxldGUuCisJKENHRU5fT1BDT0RFX1RBQkxFKTogTmV3IG1lbWJlcnMgbWFjaCxlbmRpYW4sb3BlcmFuZF90YWJsZSwKKwlwYXJzZV9vcGVyYW5kX2ZuLGFzbV9oYXNoX3RhYmxlLGFzbV9oYXNoX3RhYmxlX2VudHJpZXMsCisJZGlzX2hhc2hfdGFibGUsZGlzX2hhc2hfdGFibGVfZW50cmllcy4KKwkob3Bjb2RlX29wZW4sb3Bjb2RlX2Nsb3NlKTogQWRkIHByb3RvdHlwZXMuCisKKwkqIGNnZW4uaCAoY2dlbl9pbnNuKTogTmV3IGVsZW1lbnQgYGNkeCcuCisKK1RodSBKdWwgMzAgMjE6NDQ6MjUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZDMwdi5oIChGTEFHX0xLUik6IE5ldyBmbGFnIGZvciAibGVmdC1raWxscy1yaWdodCIgaW5zdHJ1Y3Rpb25zLgorCitUdWUgSnVsIDI4IDEwOjU5OjA3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC5oOiBBZGQgIm5vX21hdGNoX29wZXJhbmRzIiBmaWVsZCBmb3IgaW5zdHJ1Y3Rpb25zLgorCShNTjEwMzAwX01BWF9PUEVSQU5EUyk6IERlZmluZS4KKworRnJpIEp1bCAyNCAxMTo0NDoyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IERlY2xhcmUuCisKK1R1ZSBKdWwgMjEgMTM6MTI6MTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoQ0dFTl9WRVJTSU9OX3tNQUpPUixNSU5PUixGSVhMRVZFTH0pOiBEZWZpbmUuCisJKGNnZW5faW5zZXJ0X2ZuLGNnZW5fZXh0cmFjdF9mbik6IE5ldyBhcmcgYHBjJy4KKwkoZ2V0X29wZXJhbmQscHV0X29wZXJhbmQpOiBSZXBsYWNlZCB3aXRoIGdldF97aW50LHZtYX1fb3BlcmFuZCwKKwlzZXRfe2ludCx2bWF9X29wZXJhbmQuCisKK0ZyaSBKdW4gMjYgMTE6MDk6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmg6IEFkZCAibWFjaGluZSIgZmllbGQgZm9yIGluc3RydWN0aW9ucy4KKwkoTU4xMDMsIEFNMzApOiBEZWZpbmUgbWFjaGluZSB0eXBlcy4KKwkKK0ZyaSBKdW4gMTkgMTY6MDk6MDkgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2Lmg6IFVzZSBGUCwgbm90IHNsX1N1ZiwgZm9yIGZ4c2F2ZSBhbmQgZnhyc3Rvci4KKworMTk5OC0wNi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGkzODYuaDogQWRkIHN1cHBvcnQgZm9yIGZ4c2F2ZSwgZnhyc3Rvciwgc3lzZW50ZXIgYW5kIHN5c2V4aXQuCisKK1NhdCBKdW4gMTMgMTE6MzE6MzUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgZ2VuZXJhbCBmb3JtIG9mIGFhZCBhbmQgYWFtLiAgQWRkIHVkMmEKKwlhbmQgdWQyYi4KKwkoaTM4Nl9yZWd0YWIpOiBBbGxvdyBjcjAuLjcsIGRiMC4uNywgZHIwLi43LCB0cjAuLjcsIG5vdCBqdXN0CisJdGhvc2UgdGhhdCBoYXBwZW4gdG8gYmUgaW1wbGVtZW50ZWQgb24gcGVudGl1bXMuCisKK1R1ZSBKdW4gIDkgMTI6MTY6MDEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2Lmg6IENoYW5nZSBvY2N1cmVuY2VzIG9mIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCisJSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZS4gIEZsYWcgYWRkcmVzcyBhbmQgZGF0YSBzaXplIHByZWZpeGVzCisJd2l0aCBTaXplMTZ8SWdub3JlU2l6ZSBvciBTaXplMzJ8SWdub3JlU2l6ZS4KKworTW9uIEp1biAgOCAxMjoxNTo1MiAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGkzODYuaCAoUkVQTkUpOiBSZW5hbWUgdG8gUkVQTkVfUFJFRklYX09QQ09ERS4KKwkoUkVQRSk6IFJlbmFtZSB0byBSRVBFX1BSRUZJWF9PUENPREUuCisJKGkzODZfcmVndGFiX2VuZCk6IFJlbW92ZS4KKwkoaTM4Nl9wcmVmaXh0YWIsIGkzODZfcHJlZml4dGFiX2VuZCk6IFJlbW92ZS4KKwkoaTM4Nl9vcHRhYik6IFVzZSBOVUxMIGFzIHNlbnRpbmVsIHJhdGhlciB0aGFuICIiIHRvIHN1aXQgcmV3cml0ZQorCW9mIG1kX2JlZ2luLgorCShNQVhfT1BDT0RFX1NJWkUpOiBEZWZpbmUuCisJKGkzODZfb3B0YWJfZW5kKTogUmVtb3ZlLgorCShzbF9TdWYpOiBEZWZpbmUuCisJKHNsX0ZQKTogVXNlIHNsX1N1Zi4KKworCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWxsb3cgMTYgYml0IGRpc3BsYWNlbWVudCBmb3IgYG1vdgorCW1lbSxhY2MnLiAgQ29tYmluZSAxNiBhbmQgMzIgYml0IGZvcm1zIG9mIHZhcmlvdXMgaW5zbnMuICBBbGxvdyAxNgorCWJpdCBmb3JtIG9mIGxqbXAuICBBZGQgSXNQcmVmaXggbW9kaWZpZXIgdG8gcHJlZml4ZXMuICBBZGQgYWRkcjMyLAorCWRhdGEzMiwgZHdvcmQsIGFuZCBhZHdvcmQgcHJlZml4ZXMuCisJKGkzODZfcmVndGFiKTogQWRkIEJhc2VJbmRleCBtb2RpZmllciB0byB2YWxpZCAxNiBiaXQgYmFzZS9pbmRleAorCXJlZ3MuCisKK0ZyaSBKdW4gIDUgMjM6NDI6NDMgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LmggKGkzODZfcmVndGFiKTogUmVtb3ZlIEJhc2VJbmRleCBtb2RpZmllciBmcm9tIGVzcC4KKworCSogaTM4Ni5oOiBBbGxvdyBgbCcgc3VmZml4IG9uIGZsZCwgZnN0LCBmc3RwLCBmY29tLCBmY29tcCB3aXRoCisJcmVnaXN0ZXIgb3BlcmFuZHMsIGJlY2F1c2UgdGhpcyBpcyBhIGNvbW1vbiBpZGlvbS4gIEZsYWcgdGhlbSB3aXRoCisJYSB3YXJuaW5nLiAgQWxsb3cgaWxsZWdhbCBmYWRkcCwgZnN1YnAsIGZzdWJycCwgZm11bHAsIGZkaXZwLAorCWZkaXZycCBiZWNhdXNlIGdjYyBlcnJvbmVvdXNseSBnZW5lcmF0ZXMgdGhlbS4gIEFsc28gZmxhZyB3aXRoIGEKKwl3YXJuaW5nLgorCisJKiBpMzg2Lmg6IEFkZCBzdWZmaXggbW9kaWZpZXJzIHRvIG1vc3QgaW5zbnMsIGFuZCB0aWdodGVyIG9wZXJhbmQKKwljaGVja3MgaW4gc29tZSBjYXNlcy4gIEZpeCBhIG51bWJlciBvZiBVbml4V2FyZSBjb21wYXRpYmlsaXR5CisJaXNzdWVzIHdpdGggZmxvYXQgaW5zbnMuICBNZXJnZSBzb21lIGZsb2F0aW5nIHBvaW50IG9wY29kZXMsIHVzaW5nCisJbmV3IEZsb2F0TUYgbW9kaWZpZXIuCisJKFdPUkRfUFJFRklYX09QQ09ERSk6IFJlbmFtZSB0byBEQVRBX1BSRUZJWF9PUENPREUgZm9yCisJY29uc2lzdGVuY3kuCisKKwkqIGkzODYuaDogQ2hhbmdlIG9jY3VyZW5jZSBvZiBTaG9ydGZvcm1XIHRvIFd8U2hvcnRGb3JtLiAgQWRkCisJSWdub3JlRGF0YVNpemUgd2hlcmUgYXBwcm9wcmlhdGUuCisKK1dlZCBKdW4gIDMgMTg6Mjg6NDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2Lmg6IChvbmVfYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogUmVtb3ZlLgorCSh0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzKTogUmVtb3ZlLgorCShpMzg2X3JlZ3RhYik6IEFkZCBCYXNlSW5kZXggdG8gMzIgYml0IHJlZ3MgcmVnX3R5cGUuCisKK0ZyaSBNYXkgMTUgMTU6NTk6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJlbmFtZWQgZnJvbSBjZ2VuX2h3X2xvb2t1cC4KKwkoY2dlbl9od19sb29rdXBfYnlfbnVtKTogRGVjbGFyZS4KKworVGh1IE1heSAgNyAwOToyNzo1OCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKE9QX3tTSCxNQVNLfV9DT0RFMik6IEFkZGVkICJxIiBvcGVyYW5kIGZvcm1hdCBmb3IgbG93ZXIKKwl0ZW4gYml0cyBvZiBNSVBTIElTQTEgImJyZWFrIiBpbnN0cnVjdGlvbiwgYW5kIGZvciAic2RiYnAiCisKK1RodSBNYXkgIDcgMDI6MTQ6MDggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoY2dlbl9hc21faW5pdF9wYXJzZSk6IERlbGV0ZS4KKwkoY2dlbl9zYXZlX2ZpeHVwcyxjZ2VuX3Jlc3RvcmVfZml4dXBzLGNnZW5fc3dhcF9maXh1cHMpOiBEZWxldGUuCisJKGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlcixjZ2VuX2FzbV9maW5pc2hfaW5zbik6IERlbGV0ZS4KKworTW9uIEFwciAyNyAxMDoxMzoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5oIChDR0VOX0FUVFJfVFlQRSk6IERlbGV0ZSBgY29uc3QnLCBtb3ZlZCB0byB1c2VzLgorCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFVwZGF0ZSBwcm90b3R5cGUuCisJKGNnZW5faW5zbik6IE5ldyBtZW1iZXJzIG51bSwgZGF0YS4KKwkoQ0dFTl9JTlNOX1RBQkxFKTogTWVtYmVycyBhc21faGFzaCwgYXNtX2hhc2hfdGFibGVfc2l6ZSwKKwlkaXNfaGFzaCwgZGlzX2hhc2hfdGFibGVfc2l6ZSBtb3ZlZCB0byAuLi4KKwkoQ0dFTl9PUENPREVfVEFCTEUpLiAgSGVyZS4gIFJlbmFtZWQgZnJvbSBDR0VOX09QQ09ERV9EQVRBLgorCUFsbCB1c2VzIHVwZGF0ZWQuICBOZXcgbWVtYmVycyBhc21faGFzaF9wLCBkaXNfaGFzaF9wLgorCShDR0VOX01JTlNOX0VYUEFOU0lPTik6IE5ldyBzdHJ1Y3QuCisJKGNnZW5fZXhwYW5kX21hY3JvX2luc24pOiBEZWNsYXJlLgorCShjZ2VuX21hY3JvX2luc25fY291bnQpOiBEZWNsYXJlLgorCShnZXRfaW5zbl9vcGVyYW5kcyk6IFVwZGF0ZSBwcm90b3R5cGUuCisJKGxvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IERlY2xhcmUuCisKK1R1ZSBBcHIgMjEgMTc6MTE6MzIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LmggKGkzODZfb3B0YWIpOiBDaGFuZ2UgaWNscktsdWRnZSBhbmQgaW11bEtsdWRnZSB0bworCXJlZ0tsdWRnZS4gIEFkZCBvcGVyYW5kcyB0eXBlcyBmb3Igc3RyaW5nIGluc3RydWN0aW9ucy4KKworTW9uIEFwciAyMCAxNDo0MDoyOSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGkzODYuaCAoWCk6IFJlbmFtZWQgZnJvbSBgWl8nIHRvIHByZXNlcnZlIGZvcm1hdHRpbmcgb2Ygb3Bjb2RlCisJdGFibGUuCisKK1N1biBBcHIgMTkgMTM6NTQ6MDYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBpMzg2LmggKFpfKTogUmVuYW1lZCBmcm9tIGBfJyB0byBhdm9pZCBjbGFzaCB3aXRoIGNvbW1vbiBhbGlhcworCWZvciBgZ2V0dGV4dCcuCisKK0ZyaSBBcHIgIDMgMTI6MDQ6NDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2Lmg6IFJlbW92ZSBOb01vZHJtIGZsYWcgZnJvbSBhbGwgaW5zbnM6IGl0J3MgbmV2ZXIgY2hlY2tlZC4KKwlBZGQgSXNTdHJpbmcgZmxhZyB0byBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgorCShJU19TVFJJTkcpOiBEb24ndCBkZWZpbmUuCisJKExPQ0tfUFJFRklYX09QQ09ERSwgQ1NfUFJFRklYX09QQ09ERSwgRFNfUFJFRklYX09QQ09ERSk6IERlZmluZS4KKwkoRVNfUFJFRklYX09QQ09ERSwgRlNfUFJFRklYX09QQ09ERSwgR1NfUFJFRklYX09QQ09ERSk6IERlZmluZS4KKwkoU1NfUFJFRklYX09QQ09ERSk6IERlZmluZS4KKworTW9uIE1hciAzMCAyMTozMTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGkzODYuaDogUmV2ZXJ0IE1hcmNoIDI0IHBhdGNoOyBubyBtb3JlIExpbmVhckFkZHJlc3MuCisKK01vbiBNYXIgMzAgMTA6MjU6NTQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LmggKGkzODZfb3B0YWIpOiBSZW1vdmUgZndhaXQgKDliKSBmcm9tIGFsbCBmbG9hdGluZyBwb2ludAorCWluc3RydWN0aW9ucywgYW5kIGluc3RlYWQgYWRkIEZXYWl0IG9wY29kZSBtb2RpZmllci4gIEFkZCBzaG9ydAorCWZvcm0gb2YgZmxkZW52IGFuZCBmc3RlbnYuCisJKEZXQUlUX09QQ09ERSk6IERlZmluZS4KKworCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQ2hhbmdlIHNlY29uZCBvcGVyYW5kIGNvbnN0cmFpbnQgb2YgYG1vdgorCXNyZWcscmVnfG1lbScgaW5zdHJ1Y3Rpb24gZnJvbSBSZWcxNnxNZW0gdG8gV29yZFJlZ3xXb3JkTWVtIHRvCisJYWxsb3cgbGVnYWwgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgYG1vdmwgJWdzLCVlc2knCisKK0ZyaSBNYXIgMjcgMTg6MzA6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBoODMwMC5oOiBWYXJpb3VzIGNoYW5nZXMgdG8gZnVsbHkgYnJhY2tldCBpbml0aWFsaXplcnMuCisKK1R1ZSBNYXIgMjQgMTg6MzI6NDcgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgorCisJKiBpMzg2Lmg6IFNldCBMaW5lYXJBZGRyZXNzIGZvciBsaWR0IGFuZCBsZ2R0LgorCitNb24gTWFyICAyIDEwOjQ0OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fQk9PTF9BVFRSKTogTmV3IG1hY3JvLgorCitUaHUgRmViIDI2IDE1OjU0OjMxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LmggKEZMQUdfREVMQVkpOiBOZXcgZmxhZyBmb3IgZGVsYXllZCBicmFuY2hlcy9qdW1wcy4KKworTW9uIEZlYiAyMyAxMDozODoyMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5oIChDR0VOX0NBVDMpOiBEZWxldGUuICBVc2UgQ09OQ0FUMyBub3cuCisJKGNnZW5faW5zbik6IFJlY29yZCBzeW50YXggYW5kIGZvcm1hdCBlbnRyaWVzIGhlcmUsIHJhdGhlciB0aGFuCisJc2VwYXJhdGVseS4KKworVHVlIEZlYiAxNyAyMTo0Mjo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fU1lOVEFYX01BS0VfRklFTEQpOiBOZXcgbWFjcm8uCisKK1R1ZSBGZWIgMTcgMTY6MDA6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAoY2dlbl9pbnNlcnRfZm4pOiBDaGFuZ2UgdHlwZSBvZiByZXN1bHQgdG8gY29uc3QgY2hhciAqLgorCShjZ2VuX3BhcnNlX3tzaWduZWQsdW5zaWduZWR9X2ludGVnZXIpOiBEZWxldGUgbWluLG1heCBhcmd1bWVudHMuCisJKENHRU5fe0lOU04sS0VZV09SRCxPUEVSQU5EfV9OQk9PTF9BVFRSUyk6IFJlbmFtZWQgZnJvbSAuLi5fTUFYX0FUVFJTLgorCitUaHUgRmViIDEyIDE4OjMwOjQxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaCAobG9va3VwX2luc24pOiBOZXcgYXJndW1lbnQgYWxpYXNfcC4KKworVGh1IEZlYiAxMiAwMzo0MTowMCAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCitGaXggcmFjIHRvIGFjY2VwdCBvbmx5IGEwOgorCSogZDEwdi5oIChPUEVSQU5EX0FDQyk6IFNwbGl0IGludG86CisJKE9QRVJBTkRfQUNDMCwgT1BFUkFORF9BQ0MxKSAuCisJKE9QRVJBTkRfR1BSKTogRGVmaW5lLgorCitXZWQgRmViIDExIDE3OjMxOjUzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fRklFTERTKTogRGVmaW5lIGhlcmUuCisJKENHRU5fSFdfRU5UUlkpOiBOZXcgbWVtYmVyIGB0eXBlJy4KKwkoaHdfbGlzdCk6IERlbGV0ZSBkZWNsLgorCShlbnVtIGNnZW5fbW9kZSk6IERlY2xhcmUuCisJKENHRU5fT1BFUkFORCk6IE5ldyBtZW1iZXIgYGh3Jy4KKwkoZW51bSBjZ2VuX29wZXJhbmRfaW5zdGFuY2VfdHlwZSk6IERlY2xhcmUuCisJKENHRU5fT1BFUkFORF9JTlNUQU5DRSk6IE5ldyB0eXBlLgorCShDR0VOX0lOU04pOiBOZXcgbWVtYmVyIGBvcGVyYW5kcycuCisJKENHRU5fT1BDT0RFX0RBVEEpOiBNYWtlIGh3X2xpc3QgY29uc3QuCisJKGdldF9pbnNuX29wZXJhbmRzLGxvb2t1cF9pbnNuKTogQWRkIHByb3RvdHlwZXMgZm9yLgorCitUdWUgRmViICAzIDE3OjExOjIzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLmggKENHRU5fSU5TTl9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfSU5TTl9BVFRSUy4KKwkoQ0dFTl9IV19FTlRSWSk6IE1vdmUgYG5leHQnIGVudHJ5IHRvIGVuZCBvZiBzdHJ1Y3QuCisJKENHRU5fS0VZV09SRF9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfS0VZV09SRF9BVFRSUy4KKwkoQ0dFTl9PUEVSQU5EX01BWF9BVFRSUyk6IFJlbmFtZWQgZnJvbSBDR0VOX01BWF9PUEVSQU5EX0FUVFJTLgorCitNb24gRmViICAyIDE5OjE5OjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY2dlbi5oOiBDb3JyZWN0IHR5cG8gaW4gY29tbWVudCBlbmQgbWFya2VyLgorCitNb24gRmViICAyIDE3OjEwOjM4IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+CisKKwkqIHRpYzMwLmg6IE5ldyBmaWxlLgorCitUaHUgSmFuIDIyIDE3OjU0OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNnZW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGNnZW5fc2F2ZV9maXh1cHMoKSwKKwljZ2VuX3Jlc3RvcmVfZml4dXBzKCksIGFuZCBjZ2VuX3N3YXBfZml4dXBzKCkuICBDaGFuZ2UgcHJvdG90eXBlCisJb2YgY2dlbl9hc21fZmluaXNoX2luc24oKSB0byByZXR1cm4gYSBjaGFyICouCisKK1dlZCBKYW4gMTQgMTc6MjE6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY2dlbi5oOiBGb3JtYXR0aW5nIGNoYW5nZXMgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKworTW9uIEphbiAxMiAxMTozNzozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi5oICgqKTogQ2xlYW4gdXAgcGFzcyBvdmVyIGBzdHJ1Y3QgZm9vJyB1c2FnZS4KKwkoQ0dFTl9BVFRSKTogTWFrZSB1bnNpZ25lZCBjaGFyLgorCShDR0VOX0FUVFJfVFlQRSk6IFVwZGF0ZS4KKwkoQ0dFTl9BVFRSX3tFTlRSWSxUQUJMRX0pOiBOZXcgdHlwZXMuCisJKGNnZW5fYmFzZSk6IE1vdmUgbWVtYmVyIGBhdHRycycgdG8gY2dlbl9pbnNuLgorCShDR0VOX0tFWVdPUkQpOiBOZXcgbWVtYmVyIGBudWxsX2VudHJ5Jy4KKwkoQ0dFTl97U1lOVEFYLEZPUk1BVH0pOiBOZXcgdHlwZXMuCisJKGNnZW5faW5zbik6IEZvcm1hdCBhbmQgc3ludGF4IHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuCisKK1R1ZSBEZWMgMTYgMTU6MTU6NTIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYuaCAoZDMwdl9vcGNvZGUpOiBSZW9yZGVyIGZsYWdzIHNvbWV3aGF0LCBhZGQgbmV3IGZsYWdzIGZvcgorCTIgd29yZCBsb2FkL3N0b3JlLCBBRERwcHAvU1VCcHBwLCAxNi8zMiBiaXQgbXVsdGlwbHkuICBNYWtlCisJZmxhZ3Nfe3VzZWQsc2V0fSBsb25nLgorCShkMzB2X29wZXJhbmQpOiBNYWtlIGZsYWdzIGZpZWxkIGxvbmcuCisKK01vbiBEZWMgIDEgMTI6MjQ6NDQgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGsuaDogRml4IGNvbW1lbnQgZGVzY3JpYmluZyBvcGVyYW5kIHR5cGVzLgorCitTdW4gTm92IDIzIDIyOjMxOjI3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LmggKFNIT1JUX0NNUFUpOiBBZGQgY2FzZSBmb3IgY21wdSBpbnN0cnVjdGlvbiwgYW5kIG1vdmUKKwlldmVyeXRoaW5nIGVsc2UgYWZ0ZXIgZG93bi4KKworVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBkMTB2LmggKE9QRVJBTkRfRkxBRyk6IFNwbGl0IGludG86CisJKE9QRVJBTkRfRkZMQUcsIE9QRVJBTkRfQ0ZMQUcpIC4KKworVGh1IE5vdiAxMyAxMTowNDoyNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBDaGFuZ2VkIGNvbW1lbnRzIHRvIHJlZmxlY3QgbmV3CisJZmllbGQgdXNhZ2UuCisKK0ZyaSBPY3QgMjQgMjI6MzY6MjAgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaDogQWRkZWQgdG8gY29tbWVudHMgYSBxdWljay1yZWYgbGlzdCBvZiBhbGwgYXNzaWduZWQKKwlvcGVyYW5kIHR5cGUgY2hhcmFjdGVycy4KKwkoT1Bfe01BU0ssU0h9X1BFUkZSRUcpOiBOZXcgbWFjcm9zLgorCitXZWQgT2N0IDIyIDE3OjI4OjMzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHNwYXJjLmg6IEFkZCAnXycgYW5kICcvJyBmb3IgdjlhIGFzcidzLgorCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1PgorCitUdWUgT2N0IDE0IDEzOjIyOjI5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaDgzMDAuaDogQml0IG9wcyB3aXRoIGFic29sdXRlIGFkZHJlc3NlcyBub3QgaW4gdGhlIDggYml0CisJYXJlYSBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgYmFzZSBtb2RlbCAoSDgvMzAwKS4KKworVGh1IFNlcCAyNSAxMzowMzo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGsuaDogUmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgYCBvcGVyYW5kIHNwZWNpZmllci4KKworV2VkIFNlcCAyNCAxOTowMDozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGsuaDogRG9jdW1lbnQgcSBhbmQgdiBvcGVyYW5kIHNwZWNpZmllcnMuCisKK01vbiBTZXAgMTUgMTg6Mjg6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5oIChzdHJ1Y3Qgdjg1MF9vcGNvZGUpOiBBZGQgcHJvY2Vzc29ycyBmaWVsZC4KKwkoUFJPQ0VTU09SX1Y4NTAsIFBST0NFU1NPUl9BTEwpOiBOZXcgYml0IGNvbnN0YW50cy4KKwkoUFJPQ0VTU09SX1Y4NTBFLCBQUk9DRVNTT1JfTk9UX1Y4NTApOiBOZXcgYml0IGNvbnN0YW50cy4KKwkoUFJPQ0VTU09SX1Y4NTBFQSk6IE5ldyBiaXQgY29uc3RhbnRzLgorCitNb24gU2VwIDE1IDExOjI5OjQzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJTWVyZ2UgY2hhbmdlcyBmcm9tIE1hcnRpbiBIdW50OgorCisJKiBkMzB2Lmg6IEFsbG93IHVwIHRvIDY0IGNvbnRyb2wgcmVnaXN0ZXJzLiBBZGQKKwlTSE9SVF9BNVMgZm9ybWF0LgorCisJKiBkMzB2LmggKExPTkdfRGIpOiBOZXcgZm9ybSBmb3IgZGVsYXllZCBicmFuY2hlcy4KKworCSogZDMwdi5oOiAoTE9OR19EYik6IE5ldyBmb3JtIGZvciByZXBlYXRpLgorCisJKiBkMzB2LmggKFNIT1JUX0QyQik6IE5ldyBmb3JtLgorCisJKiBkMzB2LmggKFNIT1JUX0EyKTogTmV3IGZvcm0uCisKKwkqIGQzMHYuaCAoT1BFUkFORF8yUkVHKTogQWRkIG5ldyBvcGVyYW5kIHRvIGluZGljYXRlIDIKKwlyZWdpc3RlcnMgYXJlIHVzZWQuICBOZWVkZWQgZm9yIFZMSVcgb3B0aW1pemF0aW9uLgorCitNb24gU2VwICA4IDE0OjA1OjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4uaDogTW92ZSBhc3NlbWJsZXIgaW50ZXJmYWNlIHNlY3Rpb24KKwl1cCBzbyBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IGlzIGRlZmluZWQgZm9yIGNnZW5fcGFyc2VfYWRkcmVzcy4KKwkoY2dlbl9wYXJzZV9hZGRyZXNzKTogVXBkYXRlIHByb3RvdHlwZS4KKworVHVlIFNlcCAgMiAxNTozMjozMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB2ODUwLmggKFY4NTBfT1BSRUFORF9BREpVU1RfU0hPUlRfTUVNT1JZKTogUmVtb3ZlZC4KKworVHVlIEF1ZyAyNiAxMjoyMTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGkzODYuaCAodHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IENvcnJlY3QgYmFzZSByZWdpc3RlciA1IGluCisJbW9kZXMgMSBhbmQgMiB0byBiZSBzcyByYXRoZXIgdGhhbiBkcy4gIEZyb20gR2FicmllbCBQYXViZXJ0CisJPHBhdWJlcnRAaXJhbS5lcz4uCisKKwkqIGkzODYuaDogU2V0IHVkMiB0byAweDBmMGIuICBGcm9tIEdhYnJpZWwgUGF1YmVydAorCTxwYXViZXJ0QGlyYW0uZXM+LgorCisJKiBpMzg2Lmg6IENvbW1lbnQgZml4ZXMgZm9yIGZpY29tW3BdP3tzLGx9IGZyb20gR2FicmllbCBQYXViZXJ0CisJPHBhdWJlcnRAaXJhbS5lcz4uCisKKwkqIGkzODYuaCAoSlVNUF9PTl9DWF9aRVJPKTogVW5jb21tZW50IChkZWZpbmUgYWdhaW4pLgorCShKVU1QX09OX0VDWF9aRVJPKTogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgbWFjcm8uCisKK0ZyaSBBdWcgMjIgMTA6Mzg6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5oIChWODUwX05PVF9SMCk6IE5ldyBmbGFnLgorCitNb24gQXVnIDE4IDExOjA1OjU4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogUmVtb3ZlIGZsYWdzIGZpZWxkLgorCitXZWQgQXVnIDEzIDE4OjQ1OjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogQWRkIGZsYWdzIGZpZWxkLgorCShzdHJ1Y3Qgdjg1MF9vcGVyYW5kKTogRXh0ZW5kIG1lYW5pbmcgb2YgJ2JpdHMnIGFuZCAnc2hpZnQnCisJZmllbGRzLgorCShWODUwRV9JTlNUUlVDVElPTiwgVjg1MEVBX0lOU1RSVUNUSU9OKTogTmV3IGZsYWdzLgorCShWODUwRV9QVVNIX1BPUCwgVjg1MEVfSU1NRURJQVRFMTYsIFY4NTBFX0lNTUVESUFURTMyKTogTmV3IGZsYWdzLgorCitGcmkgQXVnICA4IDE2OjU4OjQyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGFyYy5oOiBOZXcgZmlsZS4KKworVGh1IEp1bCAyNCAyMToxNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChzcGFyY19vcGNvZGVzKTogRGVjbGFyZSBhcyBjb25zdC4KKworVGh1IEp1bCAxMCAxMjo1MzoyNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoRlBfUywgRlBfRCk6IERlZmluZS4gIEJpdG1hc2tzIGluZGljYXRpbmcgaWYgYW4gaW5zbgorCXVzZXMgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcmVzb3VyY2VzLgorCShJTlNOX05PX0lTQSwgSU5TTl9JU0ExKTogRGVmaW5lLgorCShjcHUgc3BlY2lmaWMgSU5TTiBtYWNyb3MpOiBUd2VhayBpbnRvIGJpdG1hc2tzIG91dHNpZGUgdGhlIHJhbmdlCisJb2YgSU5TTl9JU0EgZmllbGQuCisKK01vbiBKdW4gMTYgMTQ6MTA6MDAgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogaTM4Ni5oOiBGaXggcGFuZCBvcGNvZGUuCisKK01vbiBKdW4gIDIgMTE6MzU6MDkgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaDogV2lkZW4gSU5TTl9JU0EgYW5kIG1vdmUgaXQgdG8gYSBtb3JlIGNvbnZlbmllbnQKKwliaXQgcG9zaXRpb24uICBBZGQgSU5TTl8zOTAwLgorCitUdWUgTWF5IDIwIDExOjI1OjI5IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKHN0cnVjdCBtaXBzX29wY29kZSk6IGFkZGVkIG5ldyBmaWVsZCBtZW1iZXJzaGlwLgorCitNb24gTWF5IDEyIDE2OjI2OjUwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwkqIGkzODYuaCAobW92ZCk6IG9ubHkgUmVnMzIgaXMgYWxsb3dlZC4KKworCSogaTM4Ni5oOiBhZGQgZmNvbXAgYW5kIHVkMi4gIEZyb20gV2F5bmUgU2NvdHQKKwk8d3Njb3R0QGljaGlwcy5pbnRlbC5jb20+LgorCitNb24gTWF5ICA1IDE3OjE2OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBBZGQgTU1YIGluc3RydWN0aW9ucy4KKworTW9uIE1heSAgNSAxMjo0NToxOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBpMzg2Lmg6IFJlbW92ZSBXIG1vZGlmaWVyIGZyb20gY29uZGl0aW9uYWwgbW92ZSBpbnN0cnVjdGlvbnMuCisKK01vbiBBcHIgMTQgMTQ6NTY6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2Lmg6IENoYW5nZSB0aGUgb3Bjb2RlcyBmb3IgZnN1YnAsIGZzdWJycCwgZmRpdnAsIGFuZCBmZGl2cnAKKwl3aXRoIG5vIGFyZ3VtZW50cyB0byBtYXRjaCB0aGF0IGdlbmVyYXRlZCBieSB0aGUgVW5peFdhcmUKKwlhc3NlbWJsZXIuCisKK1RodSBBcHIgMTAgMTQ6MzU6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2dlbi5oICg8Y3B1Pl9jZ2VuX2Fzc2VtYmxlX2luc24pOiBOZXcgYXJnIGZvciBlcnJtc2cuCisJKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbik6IERlY2xhcmUuCisJKGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kKTogRGVjbGFyZS4KKwkoY2dlbl9wYXJzZV9vcGVyYW5kKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3BhcnNlX29wZXJhbmQsCisJbmV3IGFyZ3VtZW50IGB3YW50Jy4KKwkoZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0KTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX3Jlc3VsdC4KKwkoZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZSk6IE5ldyBlbnVtLgorCitTYXQgQXByICA1IDEzOjE0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBSZXZlcnQgbGFzdCBwYXRjaCBmb3IgdGhlIE5PTl9CUk9LRU5fT1BDT0RFUyBjYXNlcy4KKworRnJpIEFwciAgNCAxMTo0NjoxMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLmg6IE5ldyBmaWxlLgorCitGcmkgQXByICA0IDE0OjAyOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBDb3JyZWN0IG9wY29kZSB2YWx1ZXMgZm9yIGZzdWJwLCBmc3VicnAsIGZkaXZwLCBhbmQKKwlmZGl2cnAuCisKK1R1ZSBNYXIgMjUgMjI6NTc6MjYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogdjg1MC5oIChleHRyYWN0KTogIE1ha2UgdW5zaWduZWQuCisKK01vbiBNYXIgMjQgMTQ6Mzg6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2Lmg6IEFkZCBpY2xyLgorCitUaHUgTWFyIDIwIDE5OjQ5OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBDaGFuZ2UgRFcgdG8gVyBmb3IgY21weGNoZyBhbmQgeGFkZCwgc2luY2UgdGhleSBkb24ndAorCXRha2UgYSBkaXJlY3Rpb24gYml0LgorCitTYXQgTWFyIDE1IDE5OjAzOjI5IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgorCisJKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBVc2UgZnVsbCBwcm90b3R5cGUuCisKK0ZyaSBNYXIgMTQgMTU6MjI6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzcGFyYy5oOiBJbmNsdWRlIDxhbnNpZGVjbC5oPi4gIFVwZGF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgdG8KKwl1c2UgcHJvdG90eXBlcywgYW5kIHRvIHVzZSBjb25zdCB3aGVuIGFwcHJvcHJpYXRlLgorCitUaHUgTWFyICA2IDE0OjE4OjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVMQVgpOiBEZWZpbmUuCisKK01vbiBGZWIgMjQgMTU6MTU6NTYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYuaDogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0bworCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KKworU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaDogQWRkIG1hY3JvcyBmb3IgY29wMCwgY29wMSBjb3AyIGFuZCBjb3AzLgorCUNoYW5nZSBtaXBzX29wY29kZXMgZnJvbSBjb25zdCBhcnJheSB0byBhIHBvaW50ZXIsCisJYW5kIGNoYW5nZSBiZmRfbWlwc19udW1fb3Bjb2RlcyBmcm9tIGNvbnN0IGludCB0byBpbnQsCisJc28gdGhhdCB3ZSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1pcHMgb3Bjb2RlcyB0YWJsZQorCWR5bmFtaWNhbGx5LgorCitGcmkgRmViIDIxIDE2OjM0OjE4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMzB2LmggKEZMQUdfWCk6IFJlbW92ZSB1bnVzZWQgZmxhZy4KKworVHVlIEZlYiAxOCAxNzozNzoyMCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDMwdi5oOiBOZXcgZmlsZS4KKworRnJpIEZlYiAxNCAxMzoxNjoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAuaCAoUERTX05BTUUpOiBNYWNybyB0byBhY2Nlc3MgbmFtZSBmaWVsZCBvZiBwcmVkZWZpbmVkIHN5bWJvbHMuCisJKFBEU19WQUxVRSk6IE1hY3JvIHRvIGFjY2VzcyB2YWx1ZSBmaWVsZCBvZiBwcmVkZWZpbmVkIHN5bWJvbHMuCisJKHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wpOiBBZGQgcHJvdG90eXBlLgorCitNb24gRmViIDEwIDEwOjMyOjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oICh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoCisJY2hhbmdlIGluIGZ1bmN0aW9uLCBhZGRlZCBjbGFzcyBwYXJhbWV0ZXIuCisKK1RodSBGZWIgIDYgMTc6MzA6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfRU5ETUFTSyk6IEFkZCBmb3IgZmxhZ2dpbmcgVEljODAKKwllbmRtYXNrIGZpZWxkcywgd2hpY2ggYXJlIHNvbWV3aGF0IHdlaXJkIGluIHRoYXQgMCBhbmQgMzIgYXJlCisJdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lLgorCitUaHUgSmFuIDMwIDEzOjQ2OjE4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oOiBDaGFuZ2UgYWxsIHRoZSBPUEVSQU5EIGRlZmluZXMgdG8gdXNlIHRoZSBmb3JtICgxIDw8IFgpCisJcmF0aGVyIHRoYW4gYSBjb25zdGFudCB0aGF0IGlzIDIqKlguICBSZW9yZGVyIHRoZW0gdG8gcHV0IGJpdHMgZm9yCisJb3BlcmFuZHMgdGhhdCBoYXZlIHN5bWJvbGljIG5hbWVzIGluIHRoZSB1cHBlciBiaXRzLCBzbyB0aGV5IGNhbgorCWJlIHBhY2tlZCBpbnRvIGFuIGludCB3aGVyZSB0aGUgbG93ZXIgYml0cyBjb250YWluIHRoZSB2YWx1ZSB0aGF0CisJY29ycmVzcG9uZHMgdG8gdGhhdCBzeW1ib2xpYyBuYW1lLgorCShwcmVkZWZpbmVkX3N5bWJvKTogQWRkIHN0cnVjdC4KKwkodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVjbGFyZSBhcnJheSBvZiB0cmFuc2xhdGlvbnMuCisJKHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWNsYXJlIHNpemUgb2YgdGhhdCBhcnJheS4KKwkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogRGVjbGFyZSBmdW5jdGlvbi4KKwkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogRGVjbGFyZSBmdW5jdGlvbi4KKworV2VkIEphbiAyOSAwOTozNzoyNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAuaCAoTU4xMDIwMF9PUEVSQU5EX1JFTEFYKTogRGVmaW5lLgorCitTYXQgSmFuIDE4IDE1OjE4OjU5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oIChUSUM4MF9OT19SMF9ERVNUKTogQWRkIGZvciBvcGNvZGVzIHdoZXJlIHIwIGNhbm5vdAorCWJlIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKworVGh1IEphbiAxNiAyMDo0ODo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAuaCAoc3RydWN0IHRpYzgwX29wY29kZSk6IENoYW5nZSAiZm9ybWF0IiBmaWVsZCB0byAiZmxhZ3MiLgorCShGTVRfVU5VU0VELCBGTVRfU0ksIEZNVF9MSSwgRk1UX1JFRyk6IERlbGV0ZS4KKwkoVElDODBfVkVDVE9SKTogRGVmaW5lIGEgZmxhZyBiaXQgZm9yIHRoZSBmbGFncy4gIFRoaXMgb25lIG1lYW5zCisJdGhhdCB0aGUgb3Bjb2RlIGNhbiBoYXZlIHR3byB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIGluIGEgc2luZ2xlCisJMzIgYml0IHdvcmQgYW5kIHdlIGhhdmUgdG8gZW5jb2RlL2RlY29kZSBib3RoLgorCitUdWUgSmFuIDE0IDE5OjM3OjA5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX1BDUkVMKTogUmVuYW1lZCBmcm9tCisJVElDODBfT1BFUkFORF9SRUxBVElWRSBmb3IgUEMgcmVsYXRpdmUuCisJKFRJQzgwX09QRVJBTkRfQkFTRVJFTCk6IE5ldyBmbGFnIGJpdCBmb3IgcmVnaXN0ZXIKKwliYXNlIHJlbGF0aXZlLgorCitNb24gSmFuIDEzIDE1OjU2OjM4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0ZMT0FUKTogQWRkIGZvciBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4KKworTW9uIEphbiAgNiAxMDo1MToxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAuaCAoVElDODBfT1BFUkFORF9TQ0FMRUQpOiBPcGVyYW5kIG1heSBoYXZlIG9wdGlvbmFsCisJIjpzIiBtb2RpZmllciBmb3Igc2NhbGluZy4KKworU3VuIEphbiAgNSAxMjoxMjoxOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAuaCAoVElDODBfT1BFUkFORF9NX1NJKTogQWRkIG9wZXJhbmQgbW9kaWZpZXIgZm9yICI6bSIuCisJKFRJQzgwX09QRVJBTkRfTV9MSSk6IERpdHRvCisKK1NhdCBKYW4gIDQgMTk6MDI6NDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfQklUTlVNKTogUmVuYW1lZCBmcm9tIFRJQzgwX09QRVJBTkRfQ0NfU1ouCisJKFRJQzgwX09QRVJBTkRfQ0MpOiBOZXcgZGVmaW5lIGZvciBjb25kaXRpb24gY29kZSBvcGVyYW5kLgorCShUSUM4MF9PUEVSQU5EX0NSKTogTmV3IGRlZmluZSBmb3IgY29udHJvbCByZWdpc3RlciBvcGVyYW5kLgorCitGcmkgSmFuICAzIDE2OjIyOjIzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oIChzdHJ1Y3QgdGljODBfb3Bjb2RlKTogTmFtZSBjaGFuZ2VkLgorCShzdHJ1Y3QgdGljODBfb3Bjb2RlKTogUmVtb3ZlIGZvcm1hdCBmaWVsZC4KKwkoc3RydWN0IHRpYzgwX29wZXJhbmQpOiBBZGQgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucy4KKwkoVElDODBfT1BFUkFORF8qKTogUmVtb3ZlIG9sZCBib2d1cyB2YWx1ZXMsIHN0YXJ0IGFkZGluZyBuZXcKKwljb3JyZWN0IG9uZXMuCisJKEZNVF8qKTogRGl0dG8uCisKK1R1ZSBEZWMgMzEgMTU6MDU6NDEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiB2ODUwLmggKFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZKTogTmV3IGZsYWcgdG8gYWRqdXN0CisJdHlwZSBJViBpbnN0cnVjdGlvbiBvZmZzZXRzLgorCitGcmkgRGVjIDI3IDIyOjIzOjEwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC5oOiBOZXcgZmlsZS4KKworV2VkIERlYyAxOCAxMDowNjozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAuaCAoTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spOiBEZWZpbmUuCisKK1NhdCBEZWMgMTQgMTA6NDg6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+CisKKwkqIG1uMTAyMDAuaDogRml4IGNvbW1lbnQsIG1uMTAyMDBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgorCSogbW4xMDMwMC5oOiBGaXggY29tbWVudCwgbW4xMDMwMF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCisJKiB2ODUwLmg6IEZpeCBjb21tZW50LCB2ODUwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KKworTW9uIERlYyAgOSAxNjo0NTozOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAuaDogRmxlc2ggb3V0IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIG5lZWRlZCBieQorCXRoZSBtbjEwMjAwIGFzc2VtYmxlciAmIGRpc2Fzc2VtYmxlci4KKworVHVlIE5vdiAyNiAxMDo0Njo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1pcHMuaDogQWRkIG1pcHMxNiBkZWZpbml0aW9ucy4KKworTW9uIE5vdiAyNSAxNzo1Njo1NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KKworCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgPCwgPiwgbSwgbiwgbyBhbmQgcCBvcGVyYW5kIHNwZWNpZmllcnMuCisKK1dlZCBOb3YgMjAgMTA6NTk6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9QQ1JFTCk6IERlZmluZS4KKwkoTU4xMDMwMF9PUEVSQU5EX01FTUFERFIpOiBEZWZpbmUuCisKK1R1ZSBOb3YgMTkgMTM6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCk6IERlZmluZS4KKworV2VkIE5vdiAgNiAxMzo0MTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1NQTElUKTogRGVmaW5lLgorCitUdWUgTm92ICA1IDEzOjI2OjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQpOiBEZWZpbmUuCisKK01vbiBOb3YgIDQgMTI6NTI6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCk6IERlZmluZS4KKworRnJpIE5vdiAgMSAxMDozMTowMiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogYWxwaGEuaDogRG9uJ3QgaW5jbHVkZSAiYmZkLmgiOyBwcml2YXRlIHJlbG9jYXRpb24gdHlwZXMgYXJlIG5vdworIAluZWdhdGl2ZSB0byBtaW5pbWl6ZSBwcm9ibGVtcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMuICBPcmdhbml6ZQorIAlpbnN0cnVjdGlvbiBzdWJzZXRzIGJ5IEFNQVNLIGV4dGVuc2lvbnMgYW5kIFBBTGNvZGUKKyAJaW1wbGVtZW50YXRpb24uCisJKHN0cnVjdCBhbHBoYV9vcGVyYW5kKTogTW92ZSBmbGFncyBzbG90IGZvciBiZXR0ZXIgcGFja2luZy4KKworVHVlIE9jdCAyOSAxMjoxOToxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHY4NTAuaCAoVjg1MF9PUEVSQU5EX1JFTEFYKTogTmV3IG9wZXJhbmQgZmxhZy4KKworVGh1IE9jdCAxMCAxNDoyOToxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAuaCAoRk1UXyopOiBNb3ZlIG9wZXJhbmQgZm9ybWF0IGRlZmluaXRpb25zCisJaGVyZS4KKworVHVlIE9jdCAgOCAxNDo0ODowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1BBUkVOKTogRGVmaW5lLgorCitNb24gT2N0ICA3IDE2OjUyOjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC5oIChtbjEwMzAwX29wY29kZSk6IEFkZCAiZm9ybWF0IiBmaWVsZC4KKwkoTU4xMDMwMF9PUEVSQU5EXyopOiBEZWZpbmUuCisKK1RodSBPY3QgIDMgMTA6MzM6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEweDAwLmg6IERlbGV0ZS4KKwkqIG1uMTAyMDAuaCwgbW4xMDMwMC5oOiBOZXcgZmlsZXMuCisKK1dlZCBPY3QgIDIgMjE6MzE6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEweDAwLmg6IE5ldyBmaWxlLgorCitGcmkgU2VwIDI3IDE4OjI2OjQ2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHY4NTAuaDogIEFkZCBuZXcgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGluc3RydWN0aW9uIHVzZXMgYSBQQworCWRpc3BsYWNlbWVudC4KKworRnJpIFNlcCAxMyAxNDo1ODoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGg4MzAwLmggKHN0bWFjKTogQWRkIG1pc3NpbmcgaW5zdHJ1Y3Rpb24uCisKK1NhdCBBdWcgMzEgMTY6MDI6MDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB2ODUwLmggKHY4NTBfb3Bjb2RlKTogUmVtb3ZlICJzaXplIiBmaWVsZC4gIEFkZCAibWVtb3AiCisJZmllbGQuCisKK0ZyaSBBdWcgMjMgMTA6Mzk6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB2ODUwLmggKFY4NTBfT1BFUkFORF9FUCk6IERlZmluZS4KKworCSogdjg1MC5oICh2ODUwX29wY29kZSk6IEFkZCBzaXplIGZpZWxkLgorCitUaHUgQXVnIDIyIDE2OjUxOjI1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogdjg1MC5oICh2ODUwX29wZXJhbmRzKTogQWRkIGluc2VydCBhbmQgZXh0cmFjdCBmaWVsZHMsIHBvaW50ZXJzCisgCXRvIGZ1bmN0aW9ucyB1c2VkIHRvIGhhbmRsZSB1bnVzdWFsIG9wZXJhbmQgZW5jb2RpbmcuCisJKFY4NTBfT1BFUkFORF9SRUcsIFY4NTBfT1BFUkFORF9TUkcsIFY4NTBfT1BFUkFORF9DQywKKyAJVjg1MF9PUEVSQU5EX1NJR05FRCk6IERlZmluZWQuCisKK1dlZCBBdWcgMjEgMTc6NDU6MTAgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiB2ODUwLmggKHY4NTBfb3BlcmFuZHMpOiBBZGQgZmxhZ3MgZmllbGQuCisJKE9QRVJBTkRfUkVHLCBPUEVSQU5EX05VTSk6IERlZmluZWQuCisKK1R1ZSBBdWcgMjAgMTQ6NTI6MDIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiB2ODUwLmg6IE5ldyBmaWxlLgorCitGcmkgQXVnIDE2IDE0OjQ0OjE1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogbWlwcy5oIChPUF9TSF9MT0NDLCBPUF9TSF9ISUNDLCBPUF9NQVNLX0NDLCBPUF9TSF9DT1AxTk9STSwKKyAJT1BfTUFTS19DT1AxTk9STSwgT1BfU0hfQ09QMVNQRUMsIE9QX01BU0tfQ09QMVNQRUMsCisgCU9QX01BU0tfQ09QMVNDTFIsIE9QX01BU0tfQ09QMUNNUCwgT1BfU0hfQ09QMUNNUCwgT1BfU0hfRk9STUFULAorIAlPUF9NQVNLX0ZPUk1BVCwgT1BfU0hfVFJVRSwgT1BfTUFTS19UUlVFLCBPUF9TSF9HRSwgT1BfTUFTS19HRSwKKyAJT1BfU0hfVU5TSUdORUQsIE9QX01BU0tfVU5TSUdORUQsIE9QX1NIX0hJTlQsIE9QX01BU0tfSElOVCk6CisgCURlZmluZWQuCisKK0ZyaSBBdWcgMTYgMDA6MTU6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBocHBhLmggKHBpdGxiLCBwaXRsYmUsIGlpdGxiYSwgaWl0bGJwLCBmaWMsIGZpY2UpOiBBY2NlcHQKKwlhIDMgYml0IHNwYWNlIGlkIGluc3RlYWQgb2YgYSAyIGJpdCBzcGFjZSBpZC4KKworVGh1IEF1ZyAxNSAxMzoxMTo0NiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi5oOiBBZGQgc29tZSBhZGRpdGlvbmFsIGRlZmluZXMgdG8gc3VwcG9ydCB0aGUKKyAJYXNzZW1ibGVyIGluIGRldGVybWluaW5nIHdoaWNoIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwuCisKK1R1ZSBBdWcgIDYgMTE6MTM6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBoODMwMC5oIChTTik6IERlZmluZS4KKwkoZWVwbW92LmIpOiBSZW5hbWVkIGZyb20gImVlcG1vdiIKKwkobm9wLCBicHQsIHJ0ZSwgcnRzLCBzbGVlcCwgY2xybWFjKTogVGhlc2UgaGF2ZSBubyBzaXplIGFzc29jaWF0ZWQKKwl3aXRoIHRoZW0uCisKK0ZyaSBKdWwgMjYgMTE6NDc6MTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYuaCAoT1BFUkFORF9TSElGVCk6IE5ldyBvcGVyYW5kIGZsYWcuCisKK1RodSBKdWwgMjUgMTI6MDY6MjIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYuaDogQ2hhbmdlcyBmb3IgZGl2cywgcGFyYWxsZWwtb25seSBpbnN0cnVjdGlvbnMsIGFuZAorIAlzaWduZWQgbnVtYmVycy4KKworTW9uIEp1bCAyMiAxMToyMToxNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi5oIChwZF9yZWcpOiBEZWZpbmUuIFB1dHRpbmcgdGhlIGRlZmluaXRpb24gaGVyZSBhbGxvd3MKKwl0aGUgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgdG8gc2hhcmUgdGhlIHNhbWUgc3RydWN0LgorCitNb24gSnVsIDIyIDEyOjE1OjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTk2MC5oIChpOTYwX29wY29kZXMpOiAiaGFsdCIgdGFrZXMgYW4gYXJndW1lbnQuICBGcm9tIFN0ZXBoZW4KKwlXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmNvbT4uCisKK1dlZCBKdWwgMTcgMTQ6NDY6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYuaDogTmV3IGZpbGUuCisKK1RodSBKdWwgMTEgMTI6MDk6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBoODMwMC5oIChiYW5kLCBiY2xyKTogRm9yY2UgaGlnaCBiaXQgb2YgaW1tZWRpYXRlIG5pYmJsZSB0byB6ZXJvLgorCitXZWQgSnVsICAzIDE0OjMwOjEyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworIAkqIG02OGsuaCAobWNmNTIwMCk6IE5ldyBtYWNyby4KKwlEb2N1bWVudCBuYW1lcyBvZiBjb2xkZmlyZSBjb250cm9sIHJlZ2lzdGVycy4KKworVHVlIEp1bCAgMiAyMzowNTo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGg4MzAwLmggKFNSQ19JTl9EU1QpOiBEZWZpbmUuCisKKwkqIGg4MzAwLmggKFVOT1AzKTogTWFyayB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBpbiB0aGlzIGluc24KKwlhcyBhIHNvdXJjZSBvcGVyYW5kLCBub3QgYSBkZXN0aW5hdGlvbiBvcGVyYW5kLgorCShTSElGVF8yLCBTSElGVF9JTU0pOiBSZW1vdmUuICBFbGltaW5hdGUgYWxsIHJlZmVyZW5jZXMuCisJKFVOT1AzKTogQ2hhbmdlIFNISUZUX0lNTSB0byBJTU0gZm9yIEg4L1MgYml0b3BzLiAgTWFyaworCXJlZ2lzdGVyIG9wZXJhbmQgd2l0aCBTUkNfSU5fRFNULgorCitGcmkgSnVuIDIxIDEzOjUyOjE3IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBhbHBoYS5oOiBOZXcgZmlsZS4KKworVGh1IEp1biAyMCAxNTowMjo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJzNmsuaDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCisKK1dlZCBKdW4gMTkgMTU6Mjk6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2Lmg6IENvcnJlY3Qgb3Bjb2RlIHZhbHVlcyBmb3IgZmFkZHAsIGZzdWJwLCBmc3VicnAsIGZtdWxwLAorCWZkaXZwLCBhbmQgZmRpdnJwLiAgQWRkIGZmcmVlcC4KKworVHVlIEp1biAxOCAxNjowNjowMCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogaDgzMDAuaDogUmVvcmRlciB2YXJpb3VzICNkZWZpbmVzIGZvciByZWFkYWJpbGl0eS4KKwkoQUJTMzJTUkMsIEFCUzMyRFNULCBEU1AzMkxJU1QsIEFCUzMyTElTVCwgQTMyTElTVCk6IERlZmluZS4KKwkoQklUT1ApOiBBY2NlcHQgYWRkaXRpb25hbCAodW51c2VkKSBhcmd1bWVudC4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKEVCSVRPUCk6IExpa2V3aXNlLgorCShPX0xBU1QpOiBCdW1wLgorCShsZGMsIHN0YywgbW92YiwgbW92dywgbW92bCk6IFVzZSAzMmJpdCBvZmZzZXRzIGFuZCBhYnNvbHV0ZXMuCisKKwkqIGg4MzAwLmggKEVYUiwgU0hJRlRfMiwgTUFDUkVHLCBTSElGVF9JTU0sIFJESU5DKTogRGVmaW5lLgorCShPX1RBUywgT19DTFJNQUMsIE9fTERNQUMsIE9fTUFDLCBPX0xETSwgT19TVE0pOiBEZWZpbmUuCisJKEJJVE9QLCBFQklUT1ApOiBIYW5kbGUgbmV3IEg4L1MgYWRkcmVzc2luZyBtb2RlcyBmb3IKKwliaXQgaW5zbnMuCisJKFVOT1AzKTogSGFuZGxlIG5ldyBzaGlmdC9yb3RhdGUgaW5zbnMgb24gdGhlIEg4L1MuCisJKGluc25zIHVzaW5nIGV4cik6IE5ldyBpbnN0cnVjdGlvbnMuCisJKHRhcywgbWFjLCBsZG1hYywgY2xybWFjLCBsZG0sIHN0bSk6IE5ldyBpbnN0cnVjdGlvbnMuCisKK1RodSBNYXkgMjMgMTY6NTY6NDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBoODMwMC5oIChhZGQubCk6IFVuZG8gQXByIDV0aCBjaGFuZ2UuICBUaGUgbWFudWFsIEkgaGFkCisJd2FzIGluY29ycmVjdC4KKworTW9uIE1heSAgNiAyMzozODoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGg4MzAwLmggKFNUQVJUKTogUmVtb3ZlLgorCShNRU1SRUxBWCk6IERlZmluZS4gIE1hcmsgYWJzb2x1dGUgbWVtb3J5IG9wZXJhbmRzIGluIG1vdi5iLCBtb3YudworCWFuZCBtb3YubCBpbnNucyB0aGF0IGNhbiBiZSByZWxheGVkLgorCitUdWUgQXByIDMwIDE4OjMwOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBSZW1vdmUgQWJzMzIgZnJvbSBsY2FsbC4KKworTW9uIEFwciAyMiAxNzowOToyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLmggKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1ApOiBOZXcgbWFjcm8uCisJKFNMQ1BPUCk6IE5ldyBtYWNyby4KKwlNYXJrIFgsWSBvcGNvZGUgbGV0dGVycyBhcyBpbiB1c2UuCisKK1RodSBBcHIgMTEgMTc6Mjg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChGX0ZMT0FULCBGX0ZCUik6IERlZmluZS4KKworRnJpIEFwciAgNSAxNjo1NTozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGg4MzAwLmggKEFCUzhNRU0pOiBSZW5hbWVkIGZyb20gQUJTTU9WLiAgUmVtb3ZlIEFCU01PVgorCWZyb20gYWxsIGluc25zLgorCShBQlM4U1JDLEFCUzhEU1QpOiBBZGQgQUJTOE1FTS4KKwkoYWRkLmwpOiBGaXggcmVnK3JlZyB2YXJpYW50LgorCShlZXBtb3Yudyk6IFJlbmFtZWQgZnJvbSBlZXBtb3Z3LgorCShsZGMsc3RjKTogRml4IG1hbnkgY2FzZXMuCisKK1N1biBNYXIgMzEgMTM6MzA6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMuaCAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyk6IE5ldyBtYWNyby4KKworVGh1IE1hciAgNyAxNTowODoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogc3BhcmMuaCAoTyk6IE1hcmsgb3BlcmFuZCBsZXR0ZXIgYXMgaW4gdXNlLgorCitUdWUgRmViIDIwIDIwOjQ2OjIxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fc3BhcmNsZXRfY3ByZWcpOiBEZWNsYXJlLgorCU1hcmsgb3BlcmFuZCBsZXR0ZXJzIHVVIGFzIGluIHVzZS4KKworTW9uIEZlYiAxOSAwMTo1OTowOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKTogQWRkIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVULgorCShzcGFyY19vcGNvZGVfYXJjaCk6IERlbGV0ZSBtZW1iZXIgYGNvbmZsaWN0cycuICBBZGQgYHN1cHBvcnRlZCcuCisJKFNQQVJDX09QQ09ERV9TVVBQT1JURUQpOiBOZXcgbWFjcm8uCisJKFNQQVJDX09QQ09ERV9DT05GTElDVF9QKTogUmV3cml0ZS4KKwkoRl9OT1RWOSk6IERlbGV0ZS4KKworRnJpIEZlYiAxNiAxMjoyMzozNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCkgTWFrZSByZXR1cm4gdHlwZSBpbgorCWRlY2xhcmF0aW9uIGNvbnNpc3RlbnQgd2l0aCByZXR1cm4gdHlwZSBpbiBkZWZpbml0aW9uLgorCitXZWQgRmViIDE0IDE4OjE0OjExIDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUmVtb3ZlIERhdGEzMiBmcm9tIHB1c2hmIGFuZCBwb3BmLgorCitUaHUgRmViICA4IDE0OjI3OjIxIDE5OTYgIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPgorCisJKiBpMzg2LmggKGkzODZfcmVndGFiKTogQWRkIDgwNDg2IHRlc3QgcmVnaXN0ZXJzLgorCitNb24gRmViICA1IDE4OjM1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTk2MC5oIChJX0hYKTogRGVmaW5lLgorCShpOTYwX29wY29kZXMpOiBBZGQgSFggaW5zdHJ1Y3Rpb24uCisKK01vbiBKYW4gMjkgMTI6NDM6MzkgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGkzODYuaDogRml4IHdhaXRpbmcgZm9ybXMgb2YgZmluaXQsIGZzdGVudiwgZnNhdmUsIGZzdHN3LCBmc3RjdywKKwlhbmQgZmNsZXguCisKK1dlZCBKYW4gMjQgMjI6MzY6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLmggKGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsKTogUmVwbGFjZXMgc3BhcmNfYXJjaGl0ZWN0dXJlLgorCShTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCk6IFJlbmFtZWQgZnJvbSBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AuCisJKGJmZF8qIGRlZmluZXMpOiBEZWxldGUuCisJKHNwYXJjX29wY29kZV9hcmNocyk6IFJlcGxhY2VzIGFyY2hpdGVjdHVyZV9wbmFtZS4KKwkoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogRGVjbGFyZS4KKwkoTlVNT1BDT0RFUyk6IERlbGV0ZS4KKworTW9uIEphbiAyMiAwODoyNDozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogc3BhcmMuaCAoZW51bSBzcGFyY19hcmNoaXRlY3R1cmUpOiBBZGQgdjlhLgorCShBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1ApOiBVcGRhdGUuCisKK1RodSBEZWMgMjggMTM6Mjc6NTMgMTk5NSAgSm9obiBIYXNzZXkgIDxoYXNzZXlAcnRwLmRnLmNvbT4KKworCSogaTM4Ni5oOiBBZGRlZCBQZW50aXVtIFBybyBpbnN0cnVjdGlvbnMuCisKK1RodSBOb3YgIDIgMjI6NTk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLmg6IERvY3VtZW50IG5ldyAnVycgb3BlcmFuZCBwbGFjZS4KKworVHVlIE9jdCAyNCAxMDo0OToxMCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGhwcGEuaDogQWRkIGxjaSBhbmQgc3luY2RtYSBpbnN0cnVjdGlvbnMuCisKK01vbiBPY3QgMjMgMTE6MDk6MTYgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+CisKKwkqIG1pcHMuaDogQWRkZWQgSU5TTl80MTAwIGZsYWcgdG8gbWFyayBORUMgVlI0MTAwIHNwZWNpZmljCisgCWluc3RydWN0aW9ucy4KKworTW9uIE9jdCAxNiAxMDoyODoxNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwYy5oIChQUENfT1BDT0RFX3tDT01NT04sQU5ZfSk6IE5ldyBvcGNvZGUgZmxhZ3MgZm9yCisJYXNzZW1ibGVyJ3MgLW1jb20gYW5kIC1tYW55IHN3aXRjaGVzLgorCitXZWQgT2N0IDExIDE2OjU2OjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBpMzg2Lmg6IEZpeCBjbXB4Y2hnOGIgZXh0ZW5zaW9uIG9wY29kZSBkZXNjcmlwdGlvbi4KKworVGh1IE9jdCAgNSAxODowMzozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogaTM4Ni5oOiBBZGQgUGVudGl1bSBpbnN0cnVjdGlvbnMgd3Jtc3IsIHJkdHNjLCByZG1zciwgY21weGNoZzhiLAorCWFuZCByZWdpc3RlciBjcjQuCisKK1R1ZSBTZXAgMTkgMTU6MjY6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLmg6IENoYW5nZSBjb21tZW50OiBzcGxpdCB0eXBlIFAgaW50byB0eXBlcyAwLCAxIGFuZCAyLgorCitXZWQgQXVnIDMwIDEzOjUwOjU1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9wcmVmZXRjaCk6IERlY2xhcmUuCisKK1R1ZSBBdWcgMjkgMTU6MzQ6NTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3thc2ksbWVtYmFyfSk6IERlY2xhcmUuCisKK1dlZCBBdWcgIDIgMTg6MzI6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrbXJpLmg6IFJlbW92ZS4KKworCSogbTY4ay5oOiBNb3ZlIHRhYmxlcyBpbnRvIG9wY29kZXMvbTY4ay1vcGMuYywgbGVhdmluZyBqdXN0IHRoZQorCWRlY2xhcmF0aW9ucy4gIFJlbW92ZSBGX0FMSUFTIGFuZCBmbGFnIGZpZWxkIG9mIHN0cnVjdAorCW02OGtfb3Bjb2RlLiAgQ2hhbmdlIGFyY2ggZmllbGQgb2Ygc3RydWN0IG02OGtfb3Bjb2RlIHRvIHVuc2lnbmVkCisJaW50LiAgTWFrZSBuYW1lIGFuZCBhcmdzIGZpZWxkcyBvZiBzdHJ1Y3QgbTY4a19vcGNvZGUgY29uc3QuCisKK1dlZCBBdWcgIDIgMDg6MTY6NDYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMuaCAoRl9OT1RWOSk6IERlZmluZS4KKworVHVlIEp1bCAxMSAxNDoyMDo0MiAxOTk1ICBKZWZmIFNwaWVnZWwgIDxqZWZmc0Bsc2lsLmNvbT4KKworCSogbWlwcy5oIChJTlNOXzQwMTApOiBEZWZpbmUuCisKK1dlZCBKdW4gMjEgMTg6NDk6NTEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbTY4ay5oIChUQkwxKTogUmV2ZXJzZSBzZW5zZSBvZiAicm91bmQiIGFyZ3VtZW50IGluIHJlc3VsdC4KKworCUNoYW5nZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKKwkqIG02OGsuaDogRml4IGFyZ3VtZW50IGRlc2NyaXB0aW9ucyBvZiBjb3Byb2Nlc3NvcgorCWluc3RydWN0aW9ucyB0byBhbGxvdyBvbmx5IGFsdGVyYWJsZSBvcGVyYW5kcyB3aGVyZSBhcHByb3ByaWF0ZS4KKwlbIU5PX0RFRkFVTFRfU0laRVNdOiBBbiBvbWl0dGVkIHNpemUgZGVmYXVsdHMgdG8gYHcnLgorCShtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIG1vcmUgYWxpYXNlcy4KKworRnJpIEFwciAxNCAyMjoxNTozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBtNjhrLmg6IEFkZGVkIGV4cGxjaXRseSBzaG9ydC1zaXplZCBjb25kaXRpb25hbCBicmFuY2hlcywgYW5kIGEKKwlidW5jaCBvZiBhbGlhc2VzIChmbW92KiwgZnRlc3QqLCB0ZGl2dWwpIHRvIHN1cHBvcnQgZ2NjJ3MKKwlzdnI0LWJhc2VkIGNvbmZpZ3VyYXRpb25zLgorCitNb24gTWFyIDEzIDIxOjMwOjAxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwlNb24gRmViIDI3IDA4OjM2OjM5IDE5OTUgIEJyeWFuIEZvcmQgIDxiYWZvcmRAY3MudXRhaC5lZHU+CisJKiBpMzg2Lmg6IGFkZGVkIG1pc3NpbmcgRGF0YTE2L0RhdGEzMiBmbGFncyB0byBhIGZldyBpbnN0cnVjdGlvbnMuCisKK1dlZCBNYXIgIDggMTU6MTk6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKE9QX01BU0tfRlIsIE9QX1NIX0ZSKTogRGVmaW5lLgorCShPUF9NQVNLX0JDQywgT1BfU0hfQkNDKTogRGVmaW5lLgorCShPUF9NQVNLX1BSRUZYLCBPUF9TSF9QUkVGWCk6IERlZmluZS4KKwkoT1BfTUFTS19DQ0MsIE9QX1NIX0NDQyk6IERlZmluZS4KKwkoSU5TTl9SRUFEX0ZQUl9SKTogRGVmaW5lLgorCShJTlNOX1JGRSk6IERlbGV0ZS4KKworV2VkIE1hciAgOCAwMzoxMzoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBtNjhrLmggKGVudW0gbTY4a19hcmNoaXRlY3R1cmUpOiBEZWxldGVkLgorCShzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMpOiBOZXcgdHlwZS4KKwkobTY4a19vcGNvZGVzKTogTm93IGNvbnN0LiAgRGVsZXRlZCBvcGNvZGUgYWxpYXNlcyB3aXRoIGV4YWN0bHkKKwltYXRjaGluZyBjb25zdHJhaW50cywgdmFsdWVzIGFuZCBmbGFncy4gIEFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcywKKwl0aGUgTU9UT1JPTEFfU1lOVEFYX09OTFkgYW5kIE1JVF9TWU5UQVhfT05MWSBtYWNyb3MsIHdoaWNoIHNvIGZhcgorCWFzIEkga25vdyB3ZXJlIG5ldmVyIHVzZWQsIG5vdyBtYXkgbmVlZCByZS1leGFtaW5pbmcuCisJKG51bW9wY29kZXMpOiBOb3cgY29uc3QuCisJKG02OGtfb3Bjb2RlX2FsaWFzZXMsIG51bWFsaWFzZXMpOiBOZXcgdmFyaWFibGVzLgorCShlbmRvcCk6IERlbGV0ZWQuCisJW0RPTlRfREVGSU5FX1RBQkxFXTogRGVjbGFyZSBudW1vcGNvZGVzLCBudW1hbGlhc2VzLCBhbmQKKwltNjhrX29wY29kZV9hbGlhc2VzOyB1cGRhdGUgZGVjbGFyYXRpb24gb2YgbTY4a19vcGNvZGVzLgorCitNb24gTWFyICA2IDEwOjAyOjAwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLmggKGRlbGF5X3R5cGUpOiBEZWxldGUgdW51c2VkIGVudW1lcmF0aW9uLgorCShwYV9vcGNvZGUpOiBSZXBsYWNlIHVudXNlZCBkZWxheWVkIGZpZWxkIHdpdGggYW4gYXJjaGl0ZWN0dXJlCisJZmllbGQuCisJKHBhX29wY29kZXMpOiBNYXJrIGVhY2ggaW5zdHJ1Y3Rpb24gYXMgZWl0aGVyIFBBMS4wIG9yIFBBMS4xLgorCitGcmkgTWFyICAzIDE2OjEwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChJTlNOX0lTQTQpOiBEZWZpbmUuCisKK0ZyaSBGZWIgMjQgMTk6MTM6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmggKE1fRExBX0FCLCBNX0RMSSk6IERlZmluZS4KKworVGh1IEZlYiAyMyAxNzozMzowOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS5oIChmc3R3eCk6IEZpeCBzaW5nbGUtYml0IGVycm9yLgorCitXZWQgRmViIDE1IDEyOjE5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5oIChNX1VMRCwgTV9VTERfQSwgTV9VU0QsIE1fVVNEX0EpOiBEZWZpbmUuCisKK01vbiBGZWIgIDYgMTA6MzU6MjMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBpMzg2Lmg6IGFkZGVkIGNwdWlkIGluc3RydWN0aW9uICwgYW5kIGRyWzAtN10gYWxpYXNlcyBmb3IgdGhlCisJICBkZWJ1ZyByZWdpc3RlcnMuICBGcm9tIENoYXJsZXMgSGFubnVtIChteWNyb2Z0QG5ldGJzZC5vcmcpLgorCitNb24gRmViICA2IDAzOjMxOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwlDaGFuZ2VzIGZyb20gQnJ5YW4gRm9yZCA8YmFmb3JkQHNjaGlyZi5jcy51dGFoLmVkdT4gZm9yIDE2LWJpdAorCWkzODYgc3VwcG9ydDoKKwkqIGkzODYuaCAoTU9WX0FYX0RJU1AzMik6IE5ldyBtYWNyby4KKwkoaTM4Nl9vcHRhYik6IEFkZGVkIERhdGExNiBhbmQgRGF0YTMyIGFzIG5lZWRlZC4gIEFkZGVkICJ3IiBmb3JtcworCW9mIHNldmVyYWwgY2FsbC9yZXR1cm4gaW5zdHJ1Y3Rpb25zLgorCShBRERSX1BSRUZJWF9PUENPREUpOiBOZXcgbWFjcm8uCisKK01vbiBKYW4gMjMgMTY6NDU6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCVNhdCBKYW4gMjEgMTc6NTA6MzggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIC4uL2luY2x1ZGUvb3Bjb2RlL3ZheC5oIChzdHJ1Y3Qgdm90X3dvdCwgZmllbGQgYGFyZ3MnKTogIG1ha2UKKwlpdCBwb2ludGVyIHRvIGNvbnN0IGNoYXI7CisJKHN0cnVjdCB2b3QsIGZpZWxkIGBuYW1lJyk6ICBkaXR0by4KKworVGh1IEphbiAxOSAxNDo0Nzo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiB2YXguaDogU3VwcGx5IGFuZCBwcm9wZXJseSBncm91cCBhbGwgdmFsdWVzIGluIGVuZCBzZW50aW5lbC4KKworVHVlIEphbiAxNyAxMDo1NTozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIG1pcHMuaCAoSU5TTl9JU0EsIElOU05fNDY1MCk6IERlZmluZS4KKworV2VkIE9jdCAxOSAxMzozNDoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGEyOWsuaDogQWRkIG9wZXJhbmQgdHlwZSAnSScgZm9yIGBpbnYnIGFuZCBgaXJldGludicuICBPbgorCXN5c3RlbXMgd2l0aCBhIHNlcGFyYXRlIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlLCBzdWNoIGFzIHRoZQorCTI5MDQwLCB0aGVzZSBpbnN0cnVjdGlvbnMgdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudC4KKworV2VkIFNlcCAxNCAxNzo0NDoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoSU5TTl9TVE9SRV9NRU1PUlkpOiBDb3JyZWN0IHZhbHVlIHRvIG5vdCBjb25mbGljdCB3aXRoCisJSU5TTl9UUkFQLgorCitUdWUgU2VwICA2IDExOjM5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChJTlNOX1NUT1JFX01FTU9SWSk6IERlZmluZS4KKworVGh1IEp1bCAyOCAxOToyODowNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBzcGFyYy5oOiBEb2N1bWVudCBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KKworVHVlIEp1bCAyNiAxNzo0ODowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBpOTYwLmggKElfQ1gyKTogTmV3IGluc3RydWN0aW9uIGNhdGVnb3J5LiAgSXQgaW5jbHVkZXMKKwlpbnN0cnVjdGlvbnMgYXZhaWxhYmxlIG9uIEN4IGFuZCBKeCBwcm9jZXNzb3JzLgorCShJX0pYKTogTmV3IGluc3RydWN0aW9uIGNhdGVnb3J5LCBmb3IgSlgtb25seSBpbnN0cnVjdGlvbnMuCisJKGk5NjBfb3Bjb2Rlcyk6IFB1dCBlc2hybyBhbmQgc3lzY3RsIGluIElfQ1gyIGNhdGVnb3J5LiAgQWRkZWQKKwlKeC1vbmx5IGluc3RydWN0aW9ucywgaW4gSV9KWCBjYXRlZ29yeS4KKworV2VkIEp1bCAxMyAxODo0Mzo0NyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBuczMyay5oIChlbmRvcCk6IE1hZGUgcG9pbnRlciBjb25zdCB0b28uCisKK1N1biBKdWwgMTAgMTE6MDE6MDkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCisKKwkqIG5zMzJrLmg6IERyb3AgUSBvcGVyYW5kIHR5cGUgYXMgdGhlcmUgaXMgbm8gY29ycmVjdCB1c2UKKwlmb3IgaXQuIEFkZCBJIGFuZCBaIG9wZXJhbmQgdHlwZXMgd2hpY2ggYWxsb3cgYmV0dGVyIGNoZWNraW5nLgorCitUaHUgSnVsICA3IDEyOjM0OjQ4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmggKHhvci5sKSA6Zml4IGJpdCBwYXR0ZXJuLgorCShMXzIpOiBOZXcgc2l6ZSBvZiBvcGVyYW5kLgorCSh0cmFwYSk6IFVzZSBpdC4KKworRnJpIEp1biAxMCAxNjozODoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG02OGsuaDogTW92ZSAidHJhcCIgYmVmb3JlICJ0cGNjIiB0byBjaGFuZ2UgZGlzYXNzZW1ibHkuCisKK0ZyaSBKdW4gIDMgMTU6NTc6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaDogSW5jbHVkZSB2OSBkZWZpbml0aW9ucy4KKworVGh1IEp1biAgMiAxMjoyMzoxNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBtNjhrLmggKG02ODA2MCk6IERlZmluZWQuCisJKG02ODA0MHVwLCBtZmxvYXQsIG1tbXUpOiBJbmNsdWRlIGl0LgorCShzdHJ1Y3QgbTY4a19vcGNvZGUpOiBXaWRlbiBgYXJjaCcgZmllbGQuCisJKG02OGtfb3Bjb2Rlcyk6IFVwZGF0ZWQgZm9yIE02ODA2MC4gIFJlbW92ZWQgY29tbWVudHMgdGhhdCB3ZXJlCisJaW5zdHJ1Y3Rpb25zIGNvbW1lbnRlZCBvdXQgYnkgIkpGIiB5ZWFycyBhZ28uCisKK1RodSBBcHIgMjggMTg6MzE6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogbTY4ay5oIChzdHJ1Y3QgbTY4a19vcGNvZGUpOiBTaG9ydGVuIGBhcmNoJyBmaWVsZCB0byA4IGJpdHMsIGFuZAorCWFkZCBhIG9uZS1iaXQgYGZsYWdzJyBmaWVsZC4KKwkoRl9BTElBUyk6IE5ldyBtYWNyby4KKworV2VkIEFwciAyNyAxMToyOTo1MiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBoODMwMC5oIChkZWMsIGluYyk6IEdldCBlbmNvZGluZyByaWdodC4KKworTW9uIEFwciAgNCAxMzoxMjo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHBwYy5oIChzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kKTogUmVtb3ZlZCBzaWduZWRwIGZpZWxkOyBqdXN0IHVzZQorCWEgZmxhZyBpbnN0ZWFkLgorCShQUENfT1BFUkFORF9TSUdORUQpOiBEZWZpbmUuCisJKFBQQ19PUEVSQU5EX1NJR05PUFQpOiBEZWZpbmUuCisKK1RodSBNYXIgMzEgMTk6MzQ6MDggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oIChJU19KVU1QX09OX0VDWF9aRVJPLCAiamN4eiIgcGF0dGVybik6IE9wZXJhbmQgc2l6ZQorCXByZWZpeCBpcyAweDY2LCBub3QgMHg2Ny4gIFBhdGNoIGZyb20gSC5KLiBMdSAoaGx1QG55bmV4c3QuY29tKS4KKworVGh1IE1hciAgMyAxNTo1MTowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBpMzg2Lmg6IFJldmVyc2UgbGFzdCBjaGFuZ2UuICBJdCdsbCBiZSBoYW5kbGVkIGluIGdhcyBpbnN0ZWFkLgorCitUaHUgRmViIDI0IDE1OjI5OjA1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGkzODYuaCAoc2FyKTogRGlzYWJsZWQgdGhlIHR3by1vcGVyYW5kIEltbTEgZm9ybSwgc2luY2UgaXQgd2FzCisJc2xvd2VyIG9uIHRoZSA0ODYgYW5kIHVzZWQgdGhlIGltcGxpY2l0IHNoaWZ0IGNvdW50IGRlc3BpdGUgdGhlCisJZXhwbGljaXQgb3BlcmFuZC4gIFRoZSBvbmUtb3BlcmFuZCBmb3JtIGlzIHN0aWxsIGF2YWlsYWJsZSB0byBnZXQKKwl0aGUgc2hvcnRlciBmb3JtIHdpdGggdGhlIGltcGxpY2l0IHNoaWZ0IGNvdW50LgorCitUaHUgRmViIDE3IDEyOjI3OjUyIDE5OTQgIFRvcmJqb3JuIEdyYW5sdW5kICAodGVnZUBtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGhwcGEuaDogRml4IHR5cG8gaW4gZnN0d3MgYXJnIHN0cmluZy4KKworV2VkIEZlYiAgOSAyMToyMzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHBwYy5oIChzdHJ1Y3QgcG93ZXJwY19vcGNvZGUpOiBNYWtlIG9wZXJhbmRzIGZpZWxkIHVuc2lnbmVkLgorCitNb24gRmViICA3IDE5OjE0OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcHBjLmggKFBQQ19PUENPREVfNjAxKTogRGVmaW5lLgorCitGcmkgRmViICA0IDIzOjQzOjUwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLmggKGFkZGIpOiBVc2UgJ0AnIGZvciBhZGRiIGFuZCBhZGRpYiBwc2V1ZG8gb3BzLgorCShzbyB3ZSBjYW4gZGV0ZXJtaW5lIHZhbGlkIGNvbXBsZXRlcnMgZm9yIGJvdGggYWRkYiBhbmQgYWRkYlt0Zl0uKQorCisJKiBocHBhLmggKHhtcHl1KTogTm8gZmxvYXRpbmcgcG9pbnQgZm9ybWF0IHNwZWNpZmllciBmb3IgdGhlCisJeG1weXUgaW5zdHJ1Y3Rpb24uCisKK0ZyaSBGZWIgIDQgMjM6MzY6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBwcGMuaCAoUFBDX09QRVJBTkRfTkVYVCk6IERlZmluZS4KKwkoUFBDX09QRVJBTkRfTkVHQVRJVkUpOiBDaGFuZ2UgdmFsdWUgdG8gbWFrZSByb29tIGZvciBhYm92ZS4KKwkoc3RydWN0IHBvd2VycGNfbWFjcm8pOiBEZWZpbmUuCisJKHBvd2VycGNfbWFjcm9zLCBwb3dlcnBjX251bV9tYWNyb3MpOiBEZWNsYXJlLgorCitGcmkgSmFuIDIxIDE5OjEzOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcHBjLmg6IE5ldyBmaWxlLiAgSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLgorCitNb24gSmFuIDE3IDAwOjE0OjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLmg6IE1vcmUgbWlub3IgdGVtcGxhdGUgZml4ZXMgZm9yIHNmdSBhbmQgY29wciAodG8gYWxsb3cKKwlmb3IgZWFzaWVyIGRpc2Fzc2VtYmx5KS4KKworCSogaHBwYS5oOiBGaXggdGVtcGxhdGVzIGZvciBhbGwgdGhlIHNmdSBhbmQgY29wciBpbnN0cnVjdGlvbnMuCisKK1dlZCBEZWMgMTUgMTU6MTI6NDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oIChwdXNoKTogUGVybWl0IEltbTE2IG9wZXJhbmQgdG9vLgorCitTYXQgRGVjIDExIDE2OjE0OjA2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiAgaDgzMDAuaCAoYW5kYyk6IEV4aXN0cyBpbiBiYXNlIGFyY2guCisKK1dlZCBEZWMgIDEgMTI6MTU6MzIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIEZyb20gSGlzYXNoaSBNSU5BTUlOTyA8bWluYW1pbm9Ac3JhbWhjLnNyYS5jby5qcD4KKwkqIGhwcGEuaDogI3VuZGVmIE5PTkUgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBoaXV4IGluY2x1ZGUgZmlsZXMuCisKK1N1biBOb3YgMjEgMjI6MDY6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEuaDogQWRkIEZQIHF1YWR3b3JkIHN0b3JlIGluc3RydWN0aW9ucy4KKworV2VkIE5vdiAxNyAxNzoxMzoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaDogKE1fSl9BKTogQWRkZWQuCisJKE1fTEEpOiBSZW1vdmVkLgorCitNb24gTm92ICA4IDEyOjEyOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChPUF9NQVNLX0NBQ0hFLCBPUF9TSF9DQUNIRSk6IERlZmluZS4gIEZyb20gVGVkIExlbW9uCisJPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4uCisKK1N1biBOb3YgIDcgMDA6MzA6MTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEuaDogSW1tZWRpYXRlIGZpZWxkIGluIHByb2JlaSBpbnN0cnVjdGlvbnMgaXMgdW5zaWduZWQsCisJbm90IGxvdy1zaWduIGV4dGVuZGVkLgorCitXZWQgTm92ICAzIDEwOjMwOjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtODhrLmggKFJSSTEwTUFTSyk6IENoYW5nZSBmcm9tIDB4ZmMwMGZmZTAgdG8gMHhmYzAwZmMwMC4KKworVHVlIE5vdiAgMiAxMjo0MTozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oOiBBZGQgImZ4Y2giIHdpdGhvdXQgb3BlcmFuZC4KKworTW9uIE5vdiAgMSAxODoxMzowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoTV9KQUxfMSwgTV9KQUxfMiwgTV9KQUxfQSk6IEFkZGVkLgorCitTYXQgT2N0ICAyIDIyOjI2OjExIDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEuaDogQWRkIGdmdyBhbmQgZ2ZyIHRvIHRoZSBvcGNvZGUgdGFibGUuCisKK1dlZCBTZXAgMjkgMTY6MjM6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBtODhrLmg6IGV4dGVuZGVkIHRvIGhhbmRsZSBtODgxMTAuCisKK1R1ZSBTZXAgMjggMTk6MTk6MDggMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS5oIChiZSwgYmxlKTogVXNlIG9wZXJhbmQgdHlwZSAneicgdG8gZGVub3RlIGFic29sdXRlIGJyYW5jaAorCWFkZHJlc3Nlcy4KKworVHVlIFNlcCAxNCAxNDowNDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGk5NjAuaCAoaTk2MF9vcGNvZGVzKTogUHJvcGVybHkgYnJhY2tldCBpbml0aWFsaXplcnMuCisKK01vbiBTZXAgMTMgMTI6NTA6NTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBtODhrLmggKEJPRkxBRyk6IHJld3JpdGUgdG8gYXZvaWQgbmVzdGVkIGNvbW1lbnQuCisKK01vbiBTZXAgMTMgMTU6NDY6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtNjhrLmggKHR3byk6IFByb3RlY3Qgc2Vjb25kIGFyZ3VtZW50IHdpdGggcGFyZW50aGVzZXMuCisKK0ZyaSBTZXAgMTAgMTY6Mjk6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGRlZCBuZXcgaW5zdHJ1Y3Rpb24gInJzbSIgKGZvciBpMzg2c2wpLgorCURlbGV0ZWQgb2xkIGluL291dCBpbnN0cnVjdGlvbnMgaW4gIiNpZiAwIiBzZWN0aW9uLgorCitUaHUgU2VwICA5IDE3OjQyOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUHJvcGVybHkgYnJhY2tldCBpbml0aWFsaXplcnMuCisKK1dlZCBBdWcgMjUgMTM6NTA6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBocHBhLmggKHBhX29wY29kZSk6IFVzZSAnfCcgZm9yIG1vdmIgYW5kIG1vdmliIGluc25zLiAgKEZyb20KKwlKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1KS4KKworTW9uIEF1ZyAyMyAxNjo1NTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGkzODYuaCAobGNhbGwpOiBBY2NlcHQgSW1tMzIgb3BlcmFuZCBhbHNvLgorCitNb24gQXVnIDIzIDEyOjQzOjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChNX0FCU1UpOiBSZW1vdmVkIChhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCBudW1iZXI/PykuCisJKE1fREFCUyk6IEFkZGVkLgorCitUaHUgQXVnIDE5IDE1OjA4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oIChJTlNOXyopOiBDaGFuZ2VkIHZhbHVlcy4gIFJlbW92ZWQgdW51c2VkIGRlZmluaXRpb25zLgorCUFkZGVkIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZLCBJTlNOX0lTQTIgYW5kIElOU05fSVNBMy4gIFNwbGl0CisJSU5TTl9MT0FEX0RFTEFZIGludG8gSU5TTl9MT0FEX01FTU9SWV9ERUxBWSBhbmQKKwlJTlNOX0xPQURfQ09QUk9DX0RFTEFZLiAgU3BsaXQgSU5TTl9DT1BST0NfREVMQVkgaW50bworCUlOU05fQ09QUk9DX01PVkVfREVMQVkgYW5kIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWS4KKwkoTV8qKTogQWRkZWQgbmV3IHZhbHVlcyBmb3IgcjYwMDAgYW5kIHI0MDAwIG1hY3Jvcy4KKwkoQU5ZX0RFTEFZKTogUmVtb3ZlZC4KKworV2VkIEF1ZyAxOCAxNTozNzo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMuaDogQWRkZWQgTV9MSV9TIGFuZCBNX0xJX1NTLgorCitUdWUgQXVnIDE3IDA3OjA4OjA4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmg6IEdldCBzb21lIHJhcmUgbW92LmJzIGNvcnJlY3QuCisKK1RodSBBdWcgIDUgMDk6MTU6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNwYXJjLmg6IERvbid0IGRlZmluZSBjb25zdCBvdXJzZWxmOyByZWx5IG9uIGFuc2lkZWNsLmggaGF2aW5nCisJYmVlbiBpbmNsdWRlZC4KKworRnJpIEp1bCAzMCAxODo0MToxMSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaCAoRl9KU1IsIEZfVU5CUiwgRl9DT05EQlIpOiAgQWRkIG5ldyBmbGFncyB0byBtYXJrCisJanVtcCBpbnN0cnVjdGlvbnMsIGZvciB1c2UgaW4gZGlzYXNzZW1ibGVycy4KKworVGh1IEp1bCAyMiAwNzoyNToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG04OGsuaDogTWFrZSBiaXRmaWVsZHMganVzdCB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGxvbmcgb3IKKwl1bnNpZ25lZCBzaG9ydC4KKworV2VkIEp1bCAyMSAxMTo1NTozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogaHBwYS5oOiBOZXcgYXJndW1lbnQgdHlwZSAneScuICBVc2UgaW4gdmFyaW91cyBmbG9hdCBpbnN0cnVjdGlvbnMuCisKK01vbiBKdWwgMTkgMTc6MTc6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGhwcGEuaCAoYnJlYWspOiBGaXJzdCBpbW1lZGlhdGUgZmllbGQgaXMgdW5zaWduZWQuCisKKwkqIGhwcGEuaDogQWRkIHJmaXIgaW5zdHJ1Y3Rpb24uCisKK1N1biBKdWwgMTggMTY6Mjg6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBtaXBzLmg6IFNwbGl0IHRoZSBhY3R1YWwgdGFibGUgb3V0IGludG8gLi4vLi4vb3Bjb2Rlcy9taXBzLW9wYy5jLgorCitGcmkgSnVsIDE2IDA5OjU5OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy5oOiBSZXdvcmtlZCB0aGUgaGF6YXJkIGluZm9ybWF0aW9uIHNvbWV3aGF0LCBhbmQgZml4ZWQgc29tZQorCWJ1Z3MgaW4gdGhlIGluc3RydWN0aW9uIGhhemFyZCBkZXNjcmlwdGlvbnMuCisKK1RodSBKdWwgMTUgMTI6NDI6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtODhrLmg6IENvcnJlY3RlZCBhIGNvdXBsZSBvZiBvcGNvZGVzLgorCitUdWUgSnVsICA2IDE1OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy5oOiBSZXBsYWNlZCB3aXRoIHZlcnNpb24gZnJvbSBSYWxwaCBDYW1wYmVsbCBhbmQgT1NGLiAgVGhlCisJbmV3IHZlcnNpb24gaW5jbHVkZXMgaW5zdHJ1Y3Rpb24gaGF6YXJkIGluZm9ybWF0aW9uLCBidXQgaXMKKwlvdGhlcndpc2UgcmVhc29uYWJseSBzaW1pbGFyLgorCitUaHUgSnVsICAxIDIwOjM2OjE3IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmg6IEZpeCB0eXBvIGluIFVOT1AzIChhZmZlY3RlZCBzaFthbF1bbHJdLmwpLgorCitGcmkgSnVuIDExIDE4OjM4OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJUGF0Y2hlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6CisJKiBocHBhLmg6IENsZWFuIHVwIHNvbWUgb2YgdGhlIE9MRF9UQUJMRSwgbm9uLU9MRF9UQUJMRSBicmFpbmRhbWFnZS4KKwlNYWtlIHRoZSB0YWJsZXMgYmUgdGhlIHNhbWUgZm9yIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOgorCSJiYiIsICJhZGRiW3RmXSIsICJhZGRpYlt0Zl0iLCAiYWRkIiwgImFkZFtsb2NdIiwgImFkZGNvIiwKKwkic2hbMTIzXWFkZCIsICJzaFsxMjNdYWRkW2xvXSIsICJzdWIiLCAic3ViW29idF0iLCAic3ViW2J0XW8iLAorCSJkcyIsICJjb21jbHIiLCAiYWRkaSIsICJhZGRpW290XSIsICJhZGRpdG8iLCAic3ViaSIsICJzdWJpbyIsCisJImNvbWljbHIiLCAiZmFkZCIsICJmc3ViIiwgImZtcHkiLCAiZmRpdiIsICJmc3FydCIsICJmYWJzIiwKKwkiZnJuZCIsICJmY3B5IiwgImZjbnZmZiIsICJmY252eGYiLCAiZmNudmZ4IiwgImZjbnZmeHQiLAorCSJmY21wIiwgYW5kICJmdGVzdCIuCisKKwkqIGhwcGEuaDogTWFrZSBuZXcgYW5kIG9sZCB0YWJsZXMgdGhlIHNhbWUgZm9yICJicmVhayIsICJtdGN0bCIsCisJIm1mY3RsIiwgImJiIiwgInNzbSIsICJyc20iLCAieG1weXUiLCAiZm1weWFkZCIsICJmbXB5c3ViIi4KKwlGaXggdHlwbyBpbiBsYXN0IHBhdGNoLiAgQ29sbGFwc2Ugc2V2ZXJhbCAjaWZkZWZzIGludG8gYQorCXNpbmdsZSAjaWZkZWYuCisKKwkqIGhwcGEuaDogRGVsZXRlIHJlbWFpbmluZyBPTERfVEFCTEUgY29kZS4gIEJyaW5nIHNvbWUKKwlvZiB0aGUgY29tbWVudHMgdXAtdG8tZGF0ZS4KKworCSogaHBwYS5oOiBVcGRhdGUgImZyZWUgbGlzdCIgb2YgbGV0dGVycyBhbmQgdXBkYXRlCisJY29tbWVudHMgZGVzY3JpYmluZyBlYWNoIGxldHRlcidzIGZ1bmN0aW9uLgorCitGcmkgSnVuICA0IDE1OjQxOjM3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmg6IGNoZWNrcG9pbnQsIGluY2x1ZGVzIEg4LzMwMC1IIG9wY29kZXMuCisKK1RodSBKdW4gIDMgMTU6NDI6NTkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogUGF0Y2hlcyBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgorCSogaHBwYS5oOiBSZXdvcmsgc2luZ2xlIHByZWNpc2lvbiBGUAorCWluc3RydWN0aW9ucyBzbyB0aGF0IHRoZXkgY29ycmVjdGx5IGRpc2Fzc2VtYmxlIGNvZGUKKwlQQTEuMSBjb2RlLgorCitUaHUgTWF5IDI3IDE5OjIxOjIyIDE5OTMgIEJydWNlIEJhdW1hbiAgKGJvb3RAb3NmLm9yZykKKworCSogaTM4Ni5oIChpMzg2X29wdGFiLCBtb3YgcGF0dGVybik6IFJlbW92ZSBNZW0xNiByZXN0cmljdGlvbiBmcm9tCisJbW92IHRvIGFsbG93IGluc3RydWN0aW9ucyBsaWtlIG1vdiBzcyx4eXooZWN4KSB0byBhc3NlbWJsZS4KKworVHVlIE1heSAyNSAwMDozOTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogaHBwYS5oOiBVc2UgbmV3IHZlcnNpb24gZnJvbSBVdGFoIGlmIE9MRF9UQUJMRSBpc24ndCBkZWZpbmVkOworCWdkYiB3aWxsIGRlZmluZSBpdCBmb3Igbm93LgorCitNb24gTWF5IDI0IDE1OjIwOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaDogRG9uJ3QgZW5kIGVudW1lcmF0b3IgbGlzdCB3aXRoIGNvbW1hLgorCitGcmkgTWF5IDE0IDE1OjE1OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogQmFzZWQgb24gcGF0Y2hlcyBmcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6CisJKiBtaXBzLmggKE9QX01BU0tfQ09QWiwgT1BfU0hfQ09QWik6IERlZmluZS4KKwkoImJjMnQiKTogQ29ycmVjdCB0eXBvLgorCSgiW2xzXXdjWzAyM10iKTogVXNlIFQgcmF0aGVyIHRoYW4gdC4KKwkoImNbMDEyM10iKTogRGVmaW5lIGdlbmVyYWwgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgorCitNb24gTWF5IDEwIDA2OjAyOjI1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBtNjhrLmg6IE1vdmUgc3BsaXQgcG9pbnQgZm9yIGdjYyBjb21waWxhdGlvbiBtb3JlIHRvd2FyZHMKKwltaWRkbGUuCisKK0ZyaSBBcHIgIDkgMTM6MjY6MTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHJzNmsuaDogQ2xlYW4gdXAgaW5zdHJ1Y3Rpb25zIGZvciBwcmltYXJ5IG9wY29kZSAxOSAobWFueSB3ZXJlCisJc2ltcGx5IHdyb25nLCBpY3MsIHJmaSwgJiByZnN2YyB3ZXJlIG1pc3NpbmcpLgorCUFkZCAiYSIgdG8gb3ByX2V4dCBmb3IgImJiIi4gIERvYyBmaXguCisKK1RodSBNYXIgMTggMTM6NDU6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBpMzg2Lmg6ICA0ODYgZXh0ZW5zaW9ucyBmcm9tIEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkuCisJKiBtaXBzLmg6ICBBZGQgY2FzdHMsIHRvIHN1cHByZXNzIHdhcm5pbmdzIGFib3V0IHNoaWZ0aW5nIHRvbyBtdWNoLgorCSogbTY4ay5oOiAgRG9jdW1lbnQgdGhlIHBsYWNlbWVudCBjb2RlICc5Jy4KKworVGh1IEZlYiAxOCAwMjowMzoxNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogbTY4ay5oIChCUkVBS19VUF9CSUdfREVDTCwgQU5EX09USEVSX1BBUlQpOiAgQWRkIGtsdWRnZSB3aGljaAorCWFsbG93cyBjYWxsZXJzIHRvIGJyZWFrIHVwIHRoZSBsYXJnZSBpbml0aWFsaXplZCBzdHJ1Y3QgZnVsbCBvZgorCW9wY29kZXMgaW50byB0d28gaGFsZi1zaXplZCBvbmVzLiAgVGhpcyBwZXJtaXRzIEdDQyB0byBjb21waWxlCisJdGhpcyBtb2R1bGUsIHNpbmNlIGl0IHRha2VzIGV4cG9uZW50aWFsIHNwYWNlIGZvciBpbml0aWFsaXplcnMuCisJKG51bW9wY29kZXMsIGVuZG9wKTogIFJldmlzZSB0byB1c2UgQU5EX09USEVSX1BBUlQgaW4gc2l6ZSBjYWxjcy4KKworVGh1IEZlYiAgNCAwMjowNjo1NiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYTI5ay5oOiAgUmVtb3ZlIFJDUyBjcnVkLCB1cGRhdGUgR1BMIHRvIHYyLCB1cGRhdGUgY29weXJpZ2h0cy4KKwkqIGNvbnZleC5oOiAgQWRkZWQsIGZyb20gR0RCJ3MgY29udngtb3Bjb2RlLmguICBBZGRlZCBDT05TVCB0byBhbGwKKwlpbml0aWFsaXplZCBzdHJ1Y3RzIGluIGl0LgorCitUaHUgSmFuIDI4IDIxOjMyOjIyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJRGVsdGEgODggY2hhbmdlcyBpbnNwaXJlZCBieSBDYXJsIEdyZWNvLCA8Y2dyZWNvQENyZWlnaHRvbi5FZHU+OgorCSogbTg4ay5oIChQTUVNKTogIEF2b2lkIHByZXZpb3VzIGRlZmluaXRpb24gZnJvbSA8c3lzL3BhcmFtLmg+LgorCShBTkQpOiAgQ2hhbmdlIHRvIEFORF8gdG8gYXZvaWQgYW5zaWRlY2wuaCBgQU5EJyBjb25mbGljdC4KKworU2F0IEphbiAyMyAxODoxMDo0OSBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCisKKwkqIG1pcHMuaDogZG9jdW1lbnQgImkiIGFuZCAiaiIgb3BlcmFuZHMgY29ycmVjdGx5LgorCitUaHUgSmFuICA3IDE1OjU4OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy5oOiBSZW1vdmVkIGVuZGlhbm5lc3MgZGVwZW5kZW5jeS4KKworU3VuIEphbiAgMyAxNDoxMzozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaDgzMDAuaDogaW5jbHVkZSBpbmZvIG9uIG51bWJlciBvZiBjeWNsZXMgcGVyIGluc3RydWN0aW9uLgorCitNb24gRGVjIDIxIDIxOjI5OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGhwcGEuaDogIE1vdmUgaGFuZHkgYWxpYXNlcyB0byB0aGUgZnJvbnQuICBGaXggbWFza3MgZm9yIGV4dHJhY3QKKwlhbmQgZGVwb3NpdCBpbnN0cnVjdGlvbnMuCisKK1NhdCBEZWMgMTIgMTY6MDk6NDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBpMzg2Lmg6IGFjY2VwdCBzaGxkIGFuZCBzaHJkIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgc2hpZnQKKwljb3VudCBhcmd1bWVudCwgd2hpY2ggaXMgYWx3YXlzICVjbC4KKworRnJpIE5vdiAyNyAxNzoxMzoxOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm4gYXQgY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oIChpMzg2X29wdGFiX2VuZCwgaTM4Nl9yZWd0YWJfZW5kKTogTm93IGNvbnN0LgorCShvbmVfYnl0ZV9zZWdtZW50X2RlZmF1bHRzLCB0d29fYnl0ZV9zZWdtZW50X2RlZmF1bHRzLAorCWkzODZfcHJlZml4dGFiX2VuZCk6IERpdHRvLgorCitNb24gTm92IDIzIDEwOjQ3OjI1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiB2YXguaCAoYmIqKTogVXNlICJ2IiAoYml0ZmllbGQgdHlwZSksIG5vdCAiYSIgKGFkZHJlc3Mgb3BlcmFuZCkKKwlmb3Igb3BlcmFuZCAyOyBmcm9tIEpvaG4gQ2FyciwgamZjQGRzZy5kZWMuY29tLgorCitXZWQgTm92ICA0IDA3OjM2OjQ5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBtNjhrLmg6IERlZmluZSBGSVhFRF9TSVpFX0JSQU5DSCwgc28gYnNyIGFuZCBicmEgaW5zdHJ1Y3Rpb25zCisJYWx3YXlzIHVzZSAxNi1iaXQgb2Zmc2V0cy4gIE1ha2VzIGNhbGN1bGF0ZWQtc2l6ZSBqdW1wIHRhYmxlcworCWZlYXNpYmxlLgorCitGcmkgT2N0IDE2IDIyOjUyOjQzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBpMzg2Lmg6IEZpeCBvbmUtb3BlcmFuZCBmb3JtcyBvZiBpbiogYW5kIG91dCogcGF0dGVybnMuCisKK1R1ZSBTZXAgMjIgMTQ6MDg6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBtNjhrLmg6IEFkZGVkIENQVTMyIHN1cHBvcnQuCisKK1R1ZSBTZXAgMjIgMDA6Mzg6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG1pcHMuaCAoYnJlYWspOiAgRGlzYXNzZW1ibGUgdGhlIGFyZ3VtZW50LiAgUGF0Y2ggZnJvbQorCWpvbmF0aGFuQGNzLnN0YW5mb3JkLmVkdSAoSm9uYXRoYW4gU3RvbmUpLgorCitXZWQgU2VwICA5IDExOjI1OjI4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbTY4ay5oOiBtZXJnZWQgTW90b3JvbGEgYW5kIE1JVCBzeW50YXguCisKK1RodSBTZXAgIDMgMDk6MzM6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIG02OGsuaCAocG1vdmUpOiBtYWtlIHRoZSB0ZXN0cyBsZXNzIHN0cmljdCwgdGhlIDY4ayBib29rIGlzCisJd3JvbmcuCisKK1R1ZSBBdWcgMjUgMjM6MjU6MTkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBtNjhrLmggKG02OGVjMDMwKTogRGVmaW5lZCBhcyBhbGlhcyBmb3IgNjgwMzAuCisJKG02OGtfb3Bjb2Rlcyk6IE5ldyB0eXBlIGNoYXJhY3RlcnMgIjMiIGZvciA2ODAzMCBNTVUgcmVncyBhbmQgInQiCisJZm9yIGltbWVkaWF0ZSAwLTcgYWRkZWQuICBTZXQgdXAgc29tZSBvcGNvZGVzIChwdGVzdCwgYmtwdCkgdG8gdXNlCisJdGhlbS4gIFRpZ2h0ZW5lZCBkZXNjcmlwdGlvbiBvZiAiZm1vdmV4IiB0byBkaXN0aW5ndWlzaCBpdCBmcm9tCisJc29tZSAicG1vdmUiIGVuY29kaW5ncy4gIEFkZGVkICJwbW92ZSIgZm9yIDY4MDMwIE1NVSByZWdzLCBjbGVhbmVkCisJdXAgZGVzY3JpcHRpb25zIHRoYXQgY2xhaW1lZCB2ZXJzaW9ucyB3ZXJlIGF2YWlsYWJsZSBmb3IgY2hpcHMgbm90CisJc3VwcG9ydGluZyB0aGVtLiAgQWRkZWQgInBtb3ZlZmQiLgorCitNb24gQXVnIDI0IDEyOjA0OjUxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBtNjhrLmg6IGZpeCB3aGVyZSB0aGUgLiBnb2VzIGluIGRpdnVsbAorCitXZWQgQXVnIDE5IDExOjIyOjI0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbTY4ay5oOiB0aGUgY2FzMiBpbnN0cnVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZSB3cml0dGVuIHdpdGgKKwlpbmRpcmVjdGlvbiBvbiB0aGUgbGFzdCB0d28gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZSBlaXRoZXIgZGF0YSBvcgorCWFkZHJlc3MgcmVnaXN0ZXJzLiAgQWRkZWQgYSBuZXcgb3BlcmFuZCB0eXBlICdyJyB3aGljaCBhY2NlcHRzCisJZWl0aGVyIHJlZ2lzdGVyIHR5cGUuICBBZGRlZCBuZXcgY2FzZXMgZm9yIGNhczJsIGFuZCBjYXMydyB3aGljaAorCXVzZSB0aGVtLiAgQ29ycmVjdGVkIG1hc2tzIGZvciBjYXMyIHdoaWNoIGZhaWxlZCB0byByZWNvZ25pemUgdXNlCisJb2YgYWRkcmVzcyByZWdpc3Rlci4KKworRnJpIEF1ZyAxNCAxNDoyMDozOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogbTY4ay5oOiAgTWVyZ2VkIGluIHBhdGNoZXMgKG1vc3RseSBtNjgwNDAtc3BlY2lmaWMpIGZyb20KKwlDb2xpbiBTbWl0aCA8Y29saW5Ad3JzLmNvbT4uCisKKwkqIG02OGsuaDogIE1lcmdlZCBtNjhrbXJpLmggYW5kIG02OGsuaCAodXNpbmcgdGhlIGZvcm1lciBhcyBhCisJYmFzZSkuICBBbHNvIGNsZWFuZWQgdXAgZHVwbGljYXRlcywgcmUtb3JkZXJlZCBpbnN0cnVjdGlvbnMgZm9yCisJdGhlIHNha2Ugb2YgZGlzLWFzc2VtYmxpbmcgKHNvIGFsaWFzZXMgY29tZSBhZnRlciBzdGFuZGFyZCBuYW1lcykuCisJKiBtNjhrbXJpLmg6IE5vdyBqdXN0IGRlZmluZXMgc29tZSBtYWNyb3MsIGFuZCAjaW5jbHVkZXMgbTY4ay5oLgorCitXZWQgQXVnIDEyIDE2OjM4OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBtNjhrbXJpLmg6IGFkZGVkIHZhcmlvdXMgb3Bjb2Rlcy4gTW92ZWQgamJ4eCB0byBieHhlcy4gRmlsbGVkIGluCisJYWxsIG1pc3NpbmcgLnMKKworTW9uIEF1ZyAxMCAyMzoyMjozMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaDogTW92ZWQgdGFibGVzIHRvIEJGRCBsaWJyYXJ5LgorCisJKiBpMzg2LmggKGkzODZfb3B0YWIpOiBBZGQgZmlsZHEsIGZpc3RwcSBhbGlhc2VzIHVzZWQgYnkgZ2NjLgorCitTdW4gSnVuIDI4IDEzOjI5OjAzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBoODMwMC5oOiAgRmluaXNoIGZpbGxpbmcgaW4gYWxsIHRoZSBob2xlcyBpbiB0aGUgb3Bjb2RlIHRhYmxlLAorCXNvIHRoYXQgdGhlIEx1Y2lkIEMgY29tcGlsZXIgY2FuIGRpZ2VzdCB0aGlzIGFzIHdlbGwuLi4KKworRnJpIEp1biAyNiAyMToyNzoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oOiAgQWRkIHNldGMsIHNldG5jLCBhZGRyMTYsIGRhdGExNiwgcmVweiwgcmVwbnogYWxpYXNlcy4KKwlGaXggb3Bjb2RlcyBvbiB2YXJpb3VzIHNpemVzIG9mIGZpbGQvZmlzdCBpbnN0cnVjdGlvbnMKKwkoMTZiaXQ9bm8gc3VmZml4LCAzMmJpdD0ibCIgc3VmZml4LCA2NGJpdD0ibGwiIHN1ZmZpeCkuCisJVXNlIHRhYnMgdG8gaW5kZW50IGZvciBjb21tZW50cy4gIEZpeGVzIHN1Z2dlc3RlZCBieSBNaW5oIFRyYW4tTGUuCisKK1RodSBKdW4gMjUgMTY6MTM6MjYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaDgzMDAuaDogIEZpbGwgaW4gYWxsIHRoZSBob2xlcyBpbiB0aGUgb3Bjb2RlIHRhYmxlIHNvIHRoYXQgdGhlCisJbG9zaW5nIEhQVVggQyBjb21waWxlciBjYW4gZGlnZXN0IHRoaXMuLi4KKworVGh1IEp1biAxMSAxMjoxNToyNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwcy5oOiAgRml4IGRlY29kaW5nIG9mIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc29tZXdoYXQuCisJKEZpeCBieSBFcmljIEFuZGVyc29uLCAzamVhbkBtYWFzLW5lb3Rlay5hcmMubmFzYS5nb3YuKQorCitUaHUgTWF5IDI4IDExOjE3OjQ0IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaDogQWRkIG5ldyBhcmNoaXRlY3R1cmUgdmFyaWFudCBzcGFyY2xpdGU7IGFkZCBpdHMgc2NhbgorCWFuZCBkaXZzY2Mgb3Bjb2Rlcy4gIERlZmluZSBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AgbWFjcm8uCisKK1R1ZSBNYXkgIDUgMTQ6MjM6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBtaXBzLmg6ICBBZGQgc29tZSBtb3JlIG9wY29kZSBzeW5vbnltcyAoZnJvbSBGcmFuayBZZWxsaW4sCisJZnlAbHVjaWQuY29tKS4KKworVGh1IEFwciAxNiAxODoyNToyNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogcnM2ay5oOiAgTmV3IHZlcnNpb24gZnJvbSBJQk0gKE1ldGluKS4KKworVGh1IEFwciAgOSAwMDozMToxOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIHJzNmsuaDogRml4IGluY29ycmVjdCBleHRlbmRlZCBvcGNvZGUgZm9yIGluc3RydWN0aW9ucyBgZm0nCisgICAgICAgIGFuZCBgZmQnLiAgKEZyb20gbWV0aW5AaWJtcGEuYXdkcGEuaWJtLmNvbSAoTWV0aW4gRy4gT3ppc2lrKS4pCisKK1R1ZSBBcHIgIDcgMTM6Mzg6NDcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcnM2ay5oOiAgTW92ZSBmcm9tIC4uLy4uL2dkYi9yczZrLW9wY29kZS5oLgorCitGcmkgQXByICAzIDExOjMwOjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBtNjhrLmggKG9uZSwgdHdvKTogIENhc3QgbWFjcm8gYXJncyB0byB1bnNpZ25lZCB0byBzdXBwcmVzcworCWNvbXBsYWludHMgZnJvbSBjb21waWxlciBhbmQgbGludCBhYm91dCBpbnRlZ2VyIG92ZXJmbG93IGR1cmluZworCXNoaWZ0LgorCitTdW4gTWFyIDI5IDEyOjIyOjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzcGFyYy5oIChPUCk6ICBBdm9pZCBzaWduZWQgb3ZlcmZsb3cgd2hlbiBzaGlmdGluZyB0byBoaWdoIG9yZGVyIGJpdC4KKworRnJpIE1hciAgNiAwMDoyMjozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwcy5oOiAgTWFrZSBiaXRmaWVsZCBsYXlvdXQgZGVwZW5kIG9uIHRoZSBIT1NUIGNvbXBpbGVyLAorCW5vdCBvbiB0aGUgVEFSR0VUIHN5c3RlbS4KKworRnJpIEZlYiAyMSAwMToyOTo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogaTM4Ni5oOiBhZGRlZCBpbmIsIGludywgb3V0Yiwgb3V0dyBvcGNvZGVzLCBhZGRlZCBhdHQgc3ludGF4IGZvcgorCSAgc2NtcCwgc2xvZCwgc21vdiwgc3NjYSwgc3N0by4gIEN1cnRlc3kgTWluaCBUcmFuLUxlCisJICA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4uCisKK1RodSBKYW4gMzAgMDc6MzE6NDQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGg4MzAwLmg6IHR1cm5lZCBvcF90eXBlIGVudW0gaW50byAjZGVmaW5lIGxpc3QKKworVGh1IEphbiAzMCAwMTowNzoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaDogIFJlbW92ZSAiY3lwcmVzcyIgYXJjaGl0ZWN0dXJlLiAgUmVtb3ZlICJmaXRveCIgYW5kCisJc2ltaWxhciBpbnN0cnVjdGlvbnMgLS0gdGhleSd2ZSBiZWVuIHJlbmFtZWQgdG8gImZpdG9xIiwgZXRjLgorCVJFQUxMWSBmaXggdHN1YmNjdHYuICBGaXggImZjbXBlcSIgYW5kICJmY21wcSIgd2hpY2ggaGFkIHdyb25nCisJbnVtYmVyIG9mIGFyZ3VtZW50cy4KKwkqIGg4MzAwLmg6ICBSZW1vdmUgZXh0cmEgOyB3aGljaCBwcm9kdWNlcyBjb21waWxlciB3YXJuaW5nLgorCitUdWUgSmFuIDI4IDIyOjU5OjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLmg6ICBmaXggb3Bjb2RlIGZvciB0c3ViY2N0di4KKworVHVlIEphbiAgNyAxNzoxOTozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaDogZmJhIGFuZCBjYmEgYXJlIG5vdyBhbGlhc2VzIGZvciBmYiBhbmQgY2IgcmVzcGVjdGl2ZWx5LgorCitGcmkgRGVjIDI3IDEwOjU1OjUwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBzcGFyYy5oIChub3ApOiAgTWFkZSB0aGUgJ2xvc2UnIGZpZWxkIGJlIGV2ZW4gdGlnaHRlciwKKwlzbyBvbmx5IGEgc3RhbmRhcmQgJ25vcCcgaXMgZGlzYXNzZW1ibGVkIGFzIGEgbm9wLgorCitTdW4gRGVjIDIyIDEyOjE4OjE4IDE5OTEgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgY3lnbnVzLmNvbSkKKworCSogc3BhcmMuaCAobm9wKTogQWRkIFJEX0dPIHRvIGBsb3NlJyBzbyB0aGF0IG9ubHkgJWcwIGluIGRlc3QgaXMKKwlkaXNhc3NlbWJsZWQgYXMgYSBub3AuCisKK1R1ZSBEZWMgMTAgMDA6MjI6MjAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBzcGFyYy5oOiBmaXggYSB0eXBvLgorCitTYXQgTm92IDMwIDIwOjQwOjUxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBhMjlrLmgsIGFybS5oLCBoODMwMC5oLCAgaTM4Ni5oLCAgaTg2MC5oLCBpOTYwLmggLCBtNjhrLmgsCisJbTg4ay5oLCBtaXBzLmggLCBucDEuaCwgbnMzMmsuaCwgcG4uaCwgcHlyLmgsIHNwYXJjLmgsIHRhaG9lLmgsCisJdmF4LmgsIENoYW5nZUxvZzogcmVuYW1lZCBmcm9tIC4uLzxmb28+LW9wY29kZS5oCisKKwwKK0xvY2FsIFZhcmlhYmxlczoKK3ZlcnNpb24tY29udHJvbDogbmV2ZXIKK0VuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaCBiL2luY2x1ZGUvb3Bjb2RlL2EyOWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJlMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvYTI5ay5oCkBAIC0wLDAgKzEsMjg1IEBACisvKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgQU1EIDI5MDAwIGZhbWlseS4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworc3RydWN0IGEyOWtfb3Bjb2RlIHsKKyAgLyogTmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBjaGFyICpuYW1lOworCisgIC8qIE9wY29kZSB3b3JkICovCisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworCisgIC8qIEEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggZGVzY3JpYmUgdGhlIG9wZXJhbmRzLgorICAgICBWYWxpZCBjaGFyYWN0ZXJzIGFyZToKKyAgICAgLCAgICAgICAgSXRzZWxmLiAgVGhlIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBhc3NlbWJseSBjb2RlLgorICAgICBhICAgICAgICBSQS4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyA4LTE1IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgYiAgICAgICAgUkIuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgMC03IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgYyAgICAgICAgUkMuICBUaGUgcmVnaXN0ZXIgbnVtYmVyIGlzIGluIGJpdHMgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uLgorICAgICBpICAgICAgICBBbiBpbW1lZGlhdGUgb3BlcmFuZCBpcyBpbiBiaXRzIDAtNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgIHggICAgICAgIEJpdHMgMC03IGFuZCAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGJpdHMgMC03IGFuZCA4LTE1CisgICAgICAgICAgICAgIChyZXNwZWN0aXZlbHkpIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgICAgaCAgICAgICAgU2FtZSBhcyB4IGJ1dCB0aGUgaW5zdHJ1Y3Rpb24gY29udGFpbnMgYml0cyAxNi0zMSBvZiB0aGUKKyAgICAgICAgICAgICAgaW1tZWRpYXRlIG9wZXJhbmQuCisgICAgIFggICAgICAgIFNhbWUgYXMgeCBidXQgYml0cyAxNi0zMSBvZiB0aGUgc2lnbmVkIGltbWVkaWF0ZSBvcGVyYW5kCisgICAgICAgICAgICAgIGFyZSBzZXQgdG8gMSAodGh1cyB0aGUgb3BlcmFuZCBpcyBhbHdheXMgbmVnYXRpdmUpLgorICAgICBQLEEgICAgICBCaXRzIDAtNyBhbmQgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBiaXRzIDItOSBhbmQgMTAtMTcKKyAgICAgICAgICAgICAgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgorCSAgICAgIFA9UEMtcmVsYXRpdmUsIHNpZ24tZXh0ZW5kZWQgdG8gMzIgYml0cy4KKwkgICAgICBBPUFic29sdXRlLCB6ZXJvLWV4dGVuZGVkIHRvIDMyIGJpdHMuCisgICAgIGUgICAgICAgIENFIGJpdCAoYml0IDIzKSBmb3IgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLgorICAgICBuICAgICAgICBDb250cm9sIGZpZWxkIChiaXRzIDE2LTIyKSBmb3IgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLgorICAgICB2ICAgICAgICBJbW1lZGlhdGUgb3BlcmFuZCBpbiBiaXRzIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgICAgICAgICAgKHVzZWQgZm9yIHRyYXAgbnVtYmVycykuCisgICAgIHMgICAgICAgIFNBLiAgU3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG51bWJlciBpbiBiaXRzIDgtMTUKKyAgICAgICAgICAgICAgb2YgdGhlIGluc3RydWN0aW9uLgorICAgICB1ICAgICAgICBVSS0tYml0IDcgb2YgdGhlIGluc3RydWN0aW9uLgorICAgICByICAgICAgICBSTkQtLWJpdHMgNC02IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgZCAgICAgICAgRkQtLWJpdHMgMi0zIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgZiAgICAgICAgRlMtLWJpdHMgMC0xIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgSQkgICAgICBJRC0tYml0cyAxNi0xNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisKKyAgICAgRXh0ZW5zaW9ucyBmb3IgMjkwNTA6CisKKyAgICAgZAkgICAgICBGTVQtLWJpdHMgMi0zIG9mIHRoZSBpbnN0cnVjdGlvbiAobm90IHJlYWxseSBuZXcpLgorICAgICBmCSAgICAgIEFDTi0tYml0cyAwLTEgb2YgdGhlIGluc3RydWN0aW9uIChub3QgcmVhbGx5IG5ldykuCisgICAgIEYJICAgICAgRlVOQy0tU3BlY2lhbCBmdW5jdGlvbiBpbiBiaXRzIDE4LTIxIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgQwkgICAgICBBQ04tLWJpdHMgMTYtMTcgc3BlY2lmeWluZyB0aGUgYWNjdW1sYXRvciByZWdpc3Rlci4gICovCisgIGNoYXIgKmFyZ3M7Cit9OworCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUCisjZW5kaWYgLyogQ09OU1QgKi8KKworc3RhdGljIENPTlNUIHN0cnVjdCBhMjlrX29wY29kZSBhMjlrX29wY29kZXNbXSA9Cit7CisKK3sgImFkZCIsIDB4MTQwMDAwMDAsICJjLGEsYiIgfSwKK3sgImFkZCIsIDB4MTUwMDAwMDAsICJjLGEsaSIgfSwKK3sgImFkZGMiLCAweDFjMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJhZGRjIiwgMHgxZDAwMDAwMCwgImMsYSxpIiB9LAoreyAiYWRkY3MiLCAweDE4MDAwMDAwLCAiYyxhLGIiIH0sCit7ICJhZGRjcyIsIDB4MTkwMDAwMDAsICJjLGEsaSIgfSwKK3sgImFkZGN1IiwgMHgxYTAwMDAwMCwgImMsYSxiIiB9LAoreyAiYWRkY3UiLCAweDFiMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJhZGRzIiwgMHgxMDAwMDAwMCwgImMsYSxiIiB9LAoreyAiYWRkcyIsIDB4MTEwMDAwMDAsICJjLGEsaSIgfSwKK3sgImFkZHUiLCAweDEyMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJhZGR1IiwgMHgxMzAwMDAwMCwgImMsYSxpIiB9LAoreyAiYW5kIiwgMHg5MDAwMDAwMCwgImMsYSxiIiB9LAoreyAiYW5kIiwgMHg5MTAwMDAwMCwgImMsYSxpIiB9LAoreyAiYW5kbiIsIDB4OWMwMDAwMDAsICJjLGEsYiIgfSwKK3sgImFuZG4iLCAweDlkMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJhc2VxIiwgMHg3MDAwMDAwMCwgInYsYSxiIiB9LAoreyAiYXNlcSIsIDB4NzEwMDAwMDAsICJ2LGEsaSIgfSwKK3sgImFzZ2UiLCAweDVjMDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2dlIiwgMHg1ZDAwMDAwMCwgInYsYSxpIiB9LAoreyAiYXNnZXUiLCAweDVlMDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2dldSIsIDB4NWYwMDAwMDAsICJ2LGEsaSIgfSwKK3sgImFzZ3QiLCAweDU4MDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2d0IiwgMHg1OTAwMDAwMCwgInYsYSxpIiB9LAoreyAiYXNndHUiLCAweDVhMDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2d0dSIsIDB4NWIwMDAwMDAsICJ2LGEsaSIgfSwKK3sgImFzbGUiLCAweDU0MDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2xlIiwgMHg1NTAwMDAwMCwgInYsYSxpIiB9LAoreyAiYXNsZXUiLCAweDU2MDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2xldSIsIDB4NTcwMDAwMDAsICJ2LGEsaSIgfSwKK3sgImFzbHQiLCAweDUwMDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2x0IiwgMHg1MTAwMDAwMCwgInYsYSxpIiB9LAoreyAiYXNsdHUiLCAweDUyMDAwMDAwLCAidixhLGIiIH0sCit7ICJhc2x0dSIsIDB4NTMwMDAwMDAsICJ2LGEsaSIgfSwKK3sgImFzbmVxIiwgMHg3MjAwMDAwMCwgInYsYSxiIiB9LAoreyAiYXNuZXEiLCAweDczMDAwMDAwLCAidixhLGkiIH0sCit7ICJjYWxsIiwgMHhhODAwMDAwMCwgImEsUCIgfSwKK3sgImNhbGwiLCAweGE5MDAwMDAwLCAiYSxBIiB9LAoreyAiY2FsbGkiLCAweGM4MDAwMDAwLCAiYSxiIiB9LAoreyAiY2xhc3MiLCAweGU2MDAwMDAwLCAiYyxhLGYiIH0sCit7ICJjbHoiLCAweDA4MDAwMDAwLCAiYyxiIiB9LAoreyAiY2x6IiwgMHgwOTAwMDAwMCwgImMsaSIgfSwKK3sgImNvbnN0IiwgMHgwMzAwMDAwMCwgImEseCIgfSwKK3sgImNvbnN0aCIsIDB4MDIwMDAwMDAsICJhLGgiIH0sCit7ICJjb25zdGh6IiwgMHgwNTAwMDAwMCwgImEsaCIgfSwKK3sgImNvbnN0biIsIDB4MDEwMDAwMDAsICJhLFgiIH0sCit7ICJjb252ZXJ0IiwgMHhlNDAwMDAwMCwgImMsYSx1LHIsZCxmIiB9LAoreyAiY3BieXRlIiwgMHgyZTAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BieXRlIiwgMHgyZjAwMDAwMCwgImMsYSxpIiB9LAoreyAiY3BlcSIsIDB4NjAwMDAwMDAsICJjLGEsYiIgfSwKK3sgImNwZXEiLCAweDYxMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJjcGdlIiwgMHg0YzAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BnZSIsIDB4NGQwMDAwMDAsICJjLGEsaSIgfSwKK3sgImNwZ2V1IiwgMHg0ZTAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BnZXUiLCAweDRmMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJjcGd0IiwgMHg0ODAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BndCIsIDB4NDkwMDAwMDAsICJjLGEsaSIgfSwKK3sgImNwZ3R1IiwgMHg0YTAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BndHUiLCAweDRiMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJjcGxlIiwgMHg0NDAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BsZSIsIDB4NDUwMDAwMDAsICJjLGEsaSIgfSwKK3sgImNwbGV1IiwgMHg0NjAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BsZXUiLCAweDQ3MDAwMDAwLCAiYyxhLGkiIH0sCit7ICJjcGx0IiwgMHg0MDAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BsdCIsIDB4NDEwMDAwMDAsICJjLGEsaSIgfSwKK3sgImNwbHR1IiwgMHg0MjAwMDAwMCwgImMsYSxiIiB9LAoreyAiY3BsdHUiLCAweDQzMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJjcG5lcSIsIDB4NjIwMDAwMDAsICJjLGEsYiIgfSwKK3sgImNwbmVxIiwgMHg2MzAwMDAwMCwgImMsYSxpIiB9LAoreyAiZGFkZCIsIDB4ZjEwMDAwMDAsICJjLGEsYiIgfSwKK3sgImRkaXYiLCAweGY3MDAwMDAwLCAiYyxhLGIiIH0sCit7ICJkZXEiLCAweGViMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJkZ2UiLCAweGVmMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJkZ3QiLCAweGVkMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJkaXYiLCAweDZhMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJkaXYiLCAweDZiMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJkaXYwIiwgMHg2ODAwMDAwMCwgImMsYiIgfSwKK3sgImRpdjAiLCAweDY5MDAwMDAwLCAiYyxpIiB9LAoreyAiZGl2aWRlIiwgMHhlMTAwMDAwMCwgImMsYSxiIiB9LAoreyAiZGl2aWR1IiwgMHhlMzAwMDAwMCwgImMsYSxiIiB9LAoreyAiZGl2bCIsIDB4NmMwMDAwMDAsICJjLGEsYiIgfSwKK3sgImRpdmwiLCAweDZkMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJkaXZyZW0iLCAweDZlMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJkaXZyZW0iLCAweDZmMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJkbWFjIiwgMHhkOTAwMDAwMCwgIkYsQyxhLGIiIH0sCit7ICJkbXNtIiwgMHhkYjAwMDAwMCwgImMsYSxiIiB9LAoreyAiZG11bCIsIDB4ZjUwMDAwMDAsICJjLGEsYiIgfSwKK3sgImRzdWIiLCAweGYzMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJlbXVsYXRlIiwgMHhkNzAwMDAwMCwgInYsYSxiIiB9LAoreyAiZXhieXRlIiwgMHgwYTAwMDAwMCwgImMsYSxiIiB9LAoreyAiZXhieXRlIiwgMHgwYjAwMDAwMCwgImMsYSxpIiB9LAoreyAiZXhodyIsIDB4N2MwMDAwMDAsICJjLGEsYiIgfSwKK3sgImV4aHciLCAweDdkMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJleGh3cyIsIDB4N2UwMDAwMDAsICJjLGEiIH0sCit7ICJleHRyYWN0IiwgMHg3YTAwMDAwMCwgImMsYSxiIiB9LAoreyAiZXh0cmFjdCIsIDB4N2IwMDAwMDAsICJjLGEsaSIgfSwKK3sgImZhZGQiLCAweGYwMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJmZGl2IiwgMHhmNjAwMDAwMCwgImMsYSxiIiB9LAoreyAiZmRtdWwiLCAweGY5MDAwMDAwLCAiYyxhLGIiIH0sCit7ICJmZXEiLCAweGVhMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJmZ2UiLCAweGVlMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJmZ3QiLCAweGVjMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJmbWFjIiwgMHhkODAwMDAwMCwgIkYsQyxhLGIiIH0sCit7ICJmbXNtIiwgMHhkYTAwMDAwMCwgImMsYSxiIiB9LAoreyAiZm11bCIsIDB4ZjQwMDAwMDAsICJjLGEsYiIgfSwKK3sgImZzdWIiLCAweGYyMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJoYWx0IiwgMHg4OTAwMDAwMCwgIiIgfSwKK3sgImluYnl0ZSIsIDB4MGMwMDAwMDAsICJjLGEsYiIgfSwKK3sgImluYnl0ZSIsIDB4MGQwMDAwMDAsICJjLGEsaSIgfSwKK3sgImluaHciLCAweDc4MDAwMDAwLCAiYyxhLGIiIH0sCit7ICJpbmh3IiwgMHg3OTAwMDAwMCwgImMsYSxpIiB9LAoreyAiaW52IiwgMHg5ZjAwMDAwMCwgIkkiIH0sCit7ICJpcmV0IiwgMHg4ODAwMDAwMCwgIiIgfSwKK3sgImlyZXRpbnYiLCAweDhjMDAwMDAwLCAiSSIgfSwKK3sgImptcCIsIDB4YTAwMDAwMDAsICJQIiB9LAoreyAiam1wIiwgMHhhMTAwMDAwMCwgIkEiIH0sCit7ICJqbXBmIiwgMHhhNDAwMDAwMCwgImEsUCIgfSwKK3sgImptcGYiLCAweGE1MDAwMDAwLCAiYSxBIiB9LAoreyAiam1wZmRlYyIsIDB4YjQwMDAwMDAsICJhLFAiIH0sCit7ICJqbXBmZGVjIiwgMHhiNTAwMDAwMCwgImEsQSIgfSwKK3sgImptcGZpIiwgMHhjNDAwMDAwMCwgImEsYiIgfSwKK3sgImptcGkiLCAweGMwMDAwMDAwLCAiYiIgfSwKK3sgImptcHQiLCAweGFjMDAwMDAwLCAiYSxQIiB9LAoreyAiam1wdCIsIDB4YWQwMDAwMDAsICJhLEEiIH0sCit7ICJqbXB0aSIsIDB4Y2MwMDAwMDAsICJhLGIiIH0sCit7ICJsb2FkIiwgMHgxNjAwMDAwMCwgImUsbixhLGIiIH0sCit7ICJsb2FkIiwgMHgxNzAwMDAwMCwgImUsbixhLGkiIH0sCit7ICJsb2FkbCIsIDB4MDYwMDAwMDAsICJlLG4sYSxiIiB9LAoreyAibG9hZGwiLCAweDA3MDAwMDAwLCAiZSxuLGEsaSIgfSwKK3sgImxvYWRtIiwgMHgzNjAwMDAwMCwgImUsbixhLGIiIH0sCit7ICJsb2FkbSIsIDB4MzcwMDAwMDAsICJlLG4sYSxpIiB9LAoreyAibG9hZHNldCIsIDB4MjYwMDAwMDAsICJlLG4sYSxiIiB9LAoreyAibG9hZHNldCIsIDB4MjcwMDAwMDAsICJlLG4sYSxpIiB9LAoreyAibWZhY2MiLCAweGU5MDAwMTAwLCAiYyxkLGYiIH0sCit7ICJtZnNyIiwgMHhjNjAwMDAwMCwgImMscyIgfSwKK3sgIm1mdGxiIiwgMHhiNjAwMDAwMCwgImMsYSIgfSwKK3sgIm10YWNjIiwgMHhlODAxMDAwMCwgImEsZCxmIiB9LAoreyAibXRzciIsIDB4Y2UwMDAwMDAsICJzLGIiIH0sCit7ICJtdHNyaW0iLCAweDA0MDAwMDAwLCAicyx4IiB9LAoreyAibXR0bGIiLCAweGJlMDAwMDAwLCAiYSxiIiB9LAoreyAibXVsIiwgMHg2NDAwMDAwMCwgImMsYSxiIiB9LAoreyAibXVsIiwgMHg2NTAwMDAwMCwgImMsYSxpIiB9LAoreyAibXVsbCIsIDB4NjYwMDAwMDAsICJjLGEsYiIgfSwKK3sgIm11bGwiLCAweDY3MDAwMDAwLCAiYyxhLGkiIH0sCit7ICJtdWx0aXBsdSIsIDB4ZTIwMDAwMDAsICJjLGEsYiIgfSwKK3sgIm11bHRpcGx5IiwgMHhlMDAwMDAwMCwgImMsYSxiIiB9LAoreyAibXVsdG0iLCAweGRlMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJtdWx0bXUiLCAweGRmMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJtdWx1IiwgMHg3NDAwMDAwMCwgImMsYSxiIiB9LAoreyAibXVsdSIsIDB4NzUwMDAwMDAsICJjLGEsaSIgfSwKK3sgIm5hbmQiLCAweDlhMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJuYW5kIiwgMHg5YjAwMDAwMCwgImMsYSxpIiB9LAoreyAibm9wIiwgMHg3MDQwMDEwMSwgIiIgfSwKK3sgIm5vciIsIDB4OTgwMDAwMDAsICJjLGEsYiIgfSwKK3sgIm5vciIsIDB4OTkwMDAwMDAsICJjLGEsaSIgfSwKK3sgIm9yIiwgMHg5MjAwMDAwMCwgImMsYSxiIiB9LAoreyAib3IiLCAweDkzMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJvcm4iLCAweGFhMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJvcm4iLCAweGFiMDAwMDAwLCAiYyxhLGkiIH0sCisKKy8qIFRoZSBkZXNjcmlwdGlvbiBvZiAic2V0aXAiIGluIENoYXB0ZXIgOCAoImluc3RydWN0aW9uIHNldCIpIG9mIHRoZSB1c2VyJ3MKKyAgIG1hbnVhbCBjbGFpbXMgdGhhdCB0aGVzZSBhcmUgYWJzb2x1dGUgcmVnaXN0ZXIgbnVtYmVycy4gIEJ1dCBzZWN0aW9uCisgICA3LjIuMSBleHBsYWlucyB0aGF0IHRoZXkgYXJlIG5vdC4gIFRoZSBsYXR0ZXIgaXMgY29ycmVjdCwgc28gcHJpbnQKKyAgIHRoZXNlIG5vcm1hbGx5ICgibHIwIiwgImxyNSIsIGV0Yy4pLiAgKi8KK3sgInNldGlwIiwgMHg5ZTAwMDAwMCwgImMsYSxiIiB9LAorCit7ICJzbGwiLCAweDgwMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzbGwiLCAweDgxMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJzcXJ0IiwgMHhlNTAwMDAwMCwgImMsYSxmIiB9LAoreyAic3JhIiwgMHg4NjAwMDAwMCwgImMsYSxiIiB9LAoreyAic3JhIiwgMHg4NzAwMDAwMCwgImMsYSxpIiB9LAoreyAic3JsIiwgMHg4MjAwMDAwMCwgImMsYSxiIiB9LAoreyAic3JsIiwgMHg4MzAwMDAwMCwgImMsYSxpIiB9LAoreyAic3RvcmUiLCAweDFlMDAwMDAwLCAiZSxuLGEsYiIgfSwKK3sgInN0b3JlIiwgMHgxZjAwMDAwMCwgImUsbixhLGkiIH0sCit7ICJzdG9yZWwiLCAweDBlMDAwMDAwLCAiZSxuLGEsYiIgfSwKK3sgInN0b3JlbCIsIDB4MGYwMDAwMDAsICJlLG4sYSxpIiB9LAoreyAic3RvcmVtIiwgMHgzZTAwMDAwMCwgImUsbixhLGIiIH0sCit7ICJzdG9yZW0iLCAweDNmMDAwMDAwLCAiZSxuLGEsaSIgfSwKK3sgInN1YiIsIDB4MjQwMDAwMDAsICJjLGEsYiIgfSwKK3sgInN1YiIsIDB4MjUwMDAwMDAsICJjLGEsaSIgfSwKK3sgInN1YmMiLCAweDJjMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzdWJjIiwgMHgyZDAwMDAwMCwgImMsYSxpIiB9LAoreyAic3ViY3MiLCAweDI4MDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzdWJjcyIsIDB4MjkwMDAwMDAsICJjLGEsaSIgfSwKK3sgInN1YmN1IiwgMHgyYTAwMDAwMCwgImMsYSxiIiB9LAoreyAic3ViY3UiLCAweDJiMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJzdWJyIiwgMHgzNDAwMDAwMCwgImMsYSxiIiB9LAoreyAic3ViciIsIDB4MzUwMDAwMDAsICJjLGEsaSIgfSwKK3sgInN1YnJjIiwgMHgzYzAwMDAwMCwgImMsYSxiIiB9LAoreyAic3VicmMiLCAweDNkMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJzdWJyY3MiLCAweDM4MDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzdWJyY3MiLCAweDM5MDAwMDAwLCAiYyxhLGkiIH0sCit7ICJzdWJyY3UiLCAweDNhMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzdWJyY3UiLCAweDNiMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJzdWJycyIsIDB4MzAwMDAwMDAsICJjLGEsYiIgfSwKK3sgInN1YnJzIiwgMHgzMTAwMDAwMCwgImMsYSxpIiB9LAoreyAic3VicnUiLCAweDMyMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzdWJydSIsIDB4MzMwMDAwMDAsICJjLGEsaSIgfSwKK3sgInN1YnMiLCAweDIwMDAwMDAwLCAiYyxhLGIiIH0sCit7ICJzdWJzIiwgMHgyMTAwMDAwMCwgImMsYSxpIiB9LAoreyAic3VidSIsIDB4MjIwMDAwMDAsICJjLGEsYiIgfSwKK3sgInN1YnUiLCAweDIzMDAwMDAwLCAiYyxhLGkiIH0sCit7ICJ4bm9yIiwgMHg5NjAwMDAwMCwgImMsYSxiIiB9LAoreyAieG5vciIsIDB4OTcwMDAwMDAsICJjLGEsaSIgfSwKK3sgInhvciIsIDB4OTQwMDAwMDAsICJjLGEsYiIgfSwKK3sgInhvciIsIDB4OTUwMDAwMDAsICJjLGEsaSIgfSwKKworeyAiIiwgMHgwLCAiIiB9CQkvKiBEdW1teSBlbnRyeSwgbm90IGluY2x1ZGVkIGluIE5VTV9PUENPREVTLiAgVGhpcworCQkJICAgbGV0cyBjb2RlIGV4YW1pbmUgZW50cnkgaSsxIHdpdGhvdXQgY2hlY2tpbmcKKwkJCSAgIGlmIHdlJ3ZlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUuICAqLworfTsKKworQ09OU1QgdW5zaWduZWQgaW50IG51bV9vcGNvZGVzID0gKCgoc2l6ZW9mIGEyOWtfb3Bjb2RlcykgLyAoc2l6ZW9mIGEyOWtfb3Bjb2Rlc1swXSkpIC0gMSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hbHBoYS5oIGIvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMThlYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvYWxwaGEuaApAQCAtMCwwICsxLDIzOCBAQAorLyogYWxwaGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgQWxwaGEgb3Bjb2RlIHRhYmxlCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAorICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIHRhYmxlIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBPUENPREVfQUxQSEFfSAorI2RlZmluZSBPUENPREVfQUxQSEFfSAorCisvKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLworCitzdHJ1Y3QgYWxwaGFfb3Bjb2RlCit7CisgIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKKyAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCisgIHVuc2lnbmVkIG9wY29kZTsKKworICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQorICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKKyAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAorICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLworICB1bnNpZ25lZCBtYXNrOworCisgIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgcHJpbWFyaWx5IHVzZWQgdG8KKyAgICAgaW5kaWNhdGUgc3BlY2lmaWMgcHJvY2Vzc29ycyBhbmQgZW52aXJvbm1lbnRzIHN1cHBvcnQgdGhlCisgICAgIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LiAqLworICB1bnNpZ25lZCBmbGFnczsKKworICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCisgICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKKyAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzRdOworfTsKKworLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQorICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCisgICBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgYWxwaGFfb3Bjb2Rlc1tdOworZXh0ZXJuIGNvbnN0IGludCBhbHBoYV9udW1fb3Bjb2RlczsKKworLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLworCisvKiBDUFUgQXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIEFYUF9PUENPREVfQkFTRSAgMHgwMDAxICAvKiBCYXNlIGFyY2hpdGVjdHVyZSAtLSBhbGwgY3B1cy4gICovCisjZGVmaW5lIEFYUF9PUENPREVfRVY0ICAgMHgwMDAyICAvKiBFVjQgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCisjZGVmaW5lIEFYUF9PUENPREVfRVY1ICAgMHgwMDA0ICAvKiBFVjUgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCisjZGVmaW5lIEFYUF9PUENPREVfRVY2ICAgMHgwMDA4ICAvKiBFVjYgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCisjZGVmaW5lIEFYUF9PUENPREVfQldYICAgMHgwMTAwICAvKiBCeXRlL3dvcmQgZXh0ZW5zaW9uIChhbWFzayBiaXQgMCkuICAqLworI2RlZmluZSBBWFBfT1BDT0RFX0NJWCAgIDB4MDIwMCAgLyogIkNvdW50IiBleHRlbnNpb24gKGFtYXNrIGJpdCAxKS4gICovCisjZGVmaW5lIEFYUF9PUENPREVfTUFYICAgMHgwNDAwICAvKiBNdWx0aW1lZGlhIGV4dGVuc2lvbiAoYW1hc2sgYml0IDgpLiAgKi8KKworI2RlZmluZSBBWFBfT1BDT0RFX05PUEFMICh+KEFYUF9PUENPREVfRVY0fEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfRVY2KSkKKworLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEFYUF9PUChpKQkoKChpKSA+PiAyNikgJiAweDNGKQorCisvKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1ham9yIG9wY29kZXMuICovCisjZGVmaW5lIEFYUF9OT1BTCTB4NDAKKworDAorLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KKworc3RydWN0IGFscGhhX29wZXJhbmQKK3sKKyAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KKyAgaW50IGJpdHM7CisKKyAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgaW50IHNoaWZ0OworCisgIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KKyAgaW50IGRlZmF1bHRfcmVsb2M7CisKKyAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLworICB1bnNpZ25lZCBmbGFnczsKKworICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgorICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCisKKyAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQorICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7CisgICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KKyAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcworICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgorCisgICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKKyAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQorICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCisgICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCisgICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKKyAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcworICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLworICB1bnNpZ25lZCAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCBvcCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKKworICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbworICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCisKKyAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQorICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOworCSBpZiAoKG8tPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKSAhPSAwCisJICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKKwkgICBvcCAtPSAxIDw8IG8tPmJpdHM7CisgICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAorICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgorCisgICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKKyAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgorICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KKyAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQorICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKKyAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCisgIGludCAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKK307CisKKy8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KKyAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgYWxwaGFfb3Bjb2RlcyB0YWJsZS4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCBhbHBoYV9vcGVyYW5kc1tdOworZXh0ZXJuIGNvbnN0IGludCBhbHBoYV9udW1fb3BlcmFuZHM7CisKKy8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgYWxwaGFfb3BlcmFuZC4gICovCisKKy8qIE1hc2sgZm9yIHNlbGVjdGluZyB0aGUgdHlwZSBmb3IgdHlwZWNoZWNrIHB1cnBvc2VzICovCisjZGVmaW5lIEFYUF9PUEVSQU5EX1RZUEVDSEVDS19NQVNLCQkJCQlcCisgIChBWFBfT1BFUkFORF9QQVJFTlMgfCBBWFBfT1BFUkFORF9DT01NQSB8IEFYUF9PUEVSQU5EX0lSIHwJCVwKKyAgIEFYUF9PUEVSQU5EX0ZQUiB8IEFYUF9PUEVSQU5EX1JFTEFUSVZFIHwgQVhQX09QRVJBTkRfU0lHTkVEIHwgCVwKKyAgIEFYUF9PUEVSQU5EX1VOU0lHTkVEKQorCisvKiBUaGlzIG9wZXJhbmQgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIGFzc2VtYmxlciBpbnB1dC4gIFRoaXMKKyAgIGlzIHVzZWQgdG8gc3VwcG9ydCBleHRlbmRlZCBtbmVtb25pY3MsIGZvciB3aGljaCB0d28gb3BlcmFuZHMgZmllbGRzCisgICBhcmUgaWRlbnRpY2FsLiAgVGhlIGFzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUgaW5zZXJ0IGZ1bmN0aW9uIHdpdGgKKyAgIGFueSBvcCB2YWx1ZS4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNhbGwgdGhlIGV4dHJhY3QgZnVuY3Rpb24sCisgICBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSwgYW5kIGNoZWNrIHRoZSB2YWx1ZSBwbGFjZWQgaW4gdGhlIGludmFsaWQKKyAgIGFyZ3VtZW50LiAgKi8KKyNkZWZpbmUgQVhQX09QRVJBTkRfRkFLRQkwMQorCisvKiBUaGUgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbiBzZXBhcmF0ZWQKKyAgIGZyb20gdGhlIHByZXZpb3VzIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBsb2FkIGFuZCBzdG9yZQorICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlICJSYSxkaXNwKFJiKSIuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9QQVJFTlMJMDIKKworLyogVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIFBBUkVOUywgdGhpcyBzdXByZXNzZXMgdGhlIHN1cHJlc3Npb24gb2YKKyAgIHRoZSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgImptcCBSYSwoUmIpLGhpbnQiLiAgKi8KKyNkZWZpbmUgQVhQX09QRVJBTkRfQ09NTUEJMDQKKworLyogVGhpcyBvcGVyYW5kIG5hbWVzIGFuIGludGVnZXIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9JUgkJMDEwCisKKy8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgQVhQX09QRVJBTkRfRlBSCQkwMjAKKworLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKKyAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9SRUxBVElWRQkwNDAKKworLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9TSUdORUQJMDEwMAorCisvKiBUaGlzIG9wZXJhbmQgdGFrZXMgdW5zaWduZWQgdmFsdWVzLiAgVGhpcyBleGlzdHMgcHJpbWFyaWx5IHNvIHRoYXQKKyAgIGEgZmxhZ3MgdmFsdWUgb2YgMCBjYW4gYmUgdHJlYXRlZCBhcyBlbmQtb2YtYXJndW1lbnRzLiAgKi8KKyNkZWZpbmUgQVhQX09QRVJBTkRfVU5TSUdORUQJMDIwMAorCisvKiBTdXByZXNzIG92ZXJmbG93IGRldGVjdGlvbiBvbiB0aGlzIGZpZWxkLiAgVGhpcyBpcyB1c2VkIGZvciBoaW50cy4gKi8KKyNkZWZpbmUgQVhQX09QRVJBTkRfTk9PVkVSRkxPVwkwNDAwCisKKy8qIE1hc2sgZm9yIG9wdGlvbmFsIGFyZ3VtZW50IGRlZmF1bHQgdmFsdWUuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9PUFRJT05BTF9NQVNLIDA3MDAwCisKKy8qIFRoaXMgb3BlcmFuZCBkZWZhdWx0cyB0byB6ZXJvLiAgVGhpcyBpcyB1c2VkIGZvciBqdW1wIGhpbnRzLiAgKi8KKyNkZWZpbmUgQVhQX09QRVJBTkRfREVGQVVMVF9aRVJPIDAxMDAwCisKKy8qIFRoaXMgb3BlcmFuZCBzaG91bGQgZGVmYXVsdCB0byB0aGUgZmlyc3QgKHJlYWwpIG9wZXJhbmQgYW5kIGlzIHVzZWQKKyAgIGluIGNvbmp1bmN0aW9uIHdpdGggQVhQX09QRVJBTkRfT1BUSU9OQUwuICBUaGlzIGFsbG93cworICAgImFuZCAkMCwzLCQwIiB0byBiZSB3cml0dGVuIGFzICJhbmQgJDAsMyIsIGV0Yy4gIEkgZG9uJ3QgbGlrZQorICAgaXQsIGJ1dCBpdCdzIHdoYXQgREVDIGRvZXMuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNUIDAyMDAwCisKKy8qIFNpbWlsYXJseSwgdGhpcyBvcGVyYW5kIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBzZWNvbmQgKHJlYWwpIG9wZXJhbmQuCisgICBUaGlzIGFsbG93cyAibmVnbCAkMCIgaW5zdGVhZCBvZiAibmVnbCAkMCwkMCIuICAqLworI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCAwNDAwMAorCisMCisvKiBSZWdpc3RlciBjb21tb24gbmFtZXMgKi8KKworI2RlZmluZSBBWFBfUkVHX1YwCTAKKyNkZWZpbmUgQVhQX1JFR19UMAkxCisjZGVmaW5lIEFYUF9SRUdfVDEJMgorI2RlZmluZSBBWFBfUkVHX1QyCTMKKyNkZWZpbmUgQVhQX1JFR19UMwk0CisjZGVmaW5lIEFYUF9SRUdfVDQJNQorI2RlZmluZSBBWFBfUkVHX1Q1CTYKKyNkZWZpbmUgQVhQX1JFR19UNgk3CisjZGVmaW5lIEFYUF9SRUdfVDcJOAorI2RlZmluZSBBWFBfUkVHX1MwCTkKKyNkZWZpbmUgQVhQX1JFR19TMQkxMAorI2RlZmluZSBBWFBfUkVHX1MyCTExCisjZGVmaW5lIEFYUF9SRUdfUzMJMTIKKyNkZWZpbmUgQVhQX1JFR19TNAkxMworI2RlZmluZSBBWFBfUkVHX1M1CTE0CisjZGVmaW5lIEFYUF9SRUdfRlAJMTUKKyNkZWZpbmUgQVhQX1JFR19BMAkxNgorI2RlZmluZSBBWFBfUkVHX0ExCTE3CisjZGVmaW5lIEFYUF9SRUdfQTIJMTgKKyNkZWZpbmUgQVhQX1JFR19BMwkxOQorI2RlZmluZSBBWFBfUkVHX0E0CTIwCisjZGVmaW5lIEFYUF9SRUdfQTUJMjEKKyNkZWZpbmUgQVhQX1JFR19UOAkyMgorI2RlZmluZSBBWFBfUkVHX1Q5CTIzCisjZGVmaW5lIEFYUF9SRUdfVDEwCTI0CisjZGVmaW5lIEFYUF9SRUdfVDExCTI1CisjZGVmaW5lIEFYUF9SRUdfUkEJMjYKKyNkZWZpbmUgQVhQX1JFR19QVgkyNworI2RlZmluZSBBWFBfUkVHX1QxMgkyNworI2RlZmluZSBBWFBfUkVHX0FUCTI4CisjZGVmaW5lIEFYUF9SRUdfR1AJMjkKKyNkZWZpbmUgQVhQX1JFR19TUAkzMAorI2RlZmluZSBBWFBfUkVHX1pFUk8JMzEKKworI2VuZGlmIC8qIE9QQ09ERV9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hcmMuaCBiL2luY2x1ZGUvb3Bjb2RlL2FyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTBjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9hcmMuaApAQCAtMCwwICsxLDI3NCBAQAorLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJDLgorICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgYW5kCit0aGUgR05VIEJpbnV0aWxzLgorCitHQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCUlmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogTGlzdCBvZiB0aGUgdmFyaW91cyBjcHUgdHlwZXMuCisgICBUaGUgdGFibGVzIGN1cnJlbnRseSB1c2UgYml0IG1hc2tzIHRvIHNheSB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBvcgorICAgd2hhdGV2ZXIgaXMgc3VwcG9ydGVkIGJ5IGEgcGFydGljdWxhciBjcHUuICBUaGlzIGxldHMgdXMgaGF2ZSBvbmUgZW50cnkKKyAgIGFwcGx5IHRvIHNldmVyYWwgY3B1cy4KKworICAgVGhpcyBkdXBsaWNhdGVzIGJmZF9tYWNoX2FyY194eHguICBGb3Igbm93IEkgd2lzaCB0byBpc29sYXRlIHRoaXMgZnJvbSBiZmQKKyAgIGFuZCBiZmQgZnJvbSB0aGlzLiAgQWxzbyBub3RlIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgYml0IHZhbHVlcyBhcyB3ZSB3YW50CisgICB0byBhbGxvdyBmb3IgdGhpbmdzIGF2YWlsYWJsZSBvbiBtb3JlIHRoYW4gb25lIEFSQyAoYnV0IG5vdCBuZWNlc3NhcmlseSBhbGwKKyAgIEFSQ3MpLiAgKi8KKworLyogVGhlIGBiYXNlJyBjcHUgbXVzdCBiZSAwICh0YWJsZSBlbnRyaWVzIGFyZSBvbWl0dGVkIGZvciB0aGUgYmFzZSBjcHUpLgorICAgVGhlIGNwdSB0eXBlIGlzIHRyZWF0ZWQgaW5kZXBlbmRlbnRseSBvZiBlbmRpYW5uZXNzLgorICAgVGhlIGNvbXBsZXRlIGBtYWNoJyBudW1iZXIgaW5jbHVkZXMgZW5kaWFubmVzcy4KKyAgIFRoZXNlIHZhbHVlcyBhcmUgaW50ZXJuYWwgdG8gb3Bjb2Rlcy9iZmQvYmludXRpbHMvZ2FzLiAgKi8KKyNkZWZpbmUgQVJDX01BQ0hfQkFTRSAwCisjZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDEgMQorI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQyIDIKKyNkZWZpbmUgQVJDX01BQ0hfVU5VU0VENCA0CisvKiBBZGRpdGlvbmFsIGNwdSB2YWx1ZXMgY2FuIGJlIGluc2VydGVkIGhlcmUgYW5kIEFSQ19NQUNIX0JJRyBtb3ZlZCBkb3duLiAgKi8KKyNkZWZpbmUgQVJDX01BQ0hfQklHIDgKKworLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlLiAgKi8KKyNkZWZpbmUgQVJDX01BQ0hfQ1BVX01BU0sgNworLyogTWFzayBvZiBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVjb3JkIGNwdSB0eXBlICsgZW5kaWFubmVzcy4gICovCisjZGVmaW5lIEFSQ19NQUNIX01BU0sgMTUKKworLyogVHlwZSB0byBkZW5vdGUgYW4gQVJDIGluc3RydWN0aW9uIChhdCBsZWFzdCBhIDMyIGJpdCB1bnNpZ25lZCBpbnQpLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IGFyY19pbnNuOworCitzdHJ1Y3QgYXJjX29wY29kZSB7CisgIGNoYXIgKnN5bnRheDsJCQkvKiBzeW50YXggb2YgaW5zbiAqLworICB1bnNpZ25lZCBsb25nIG1hc2ssIHZhbHVlOwkvKiByZWNvZ25pemUgaW5zbiBpZiAob3AmbWFzayk9PXZhbHVlICovCisgIGludCBmbGFnczsJCQkvKiB2YXJpb3VzIGZsYWcgYml0cyAqLworCisvKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLworCisvKiBSZXR1cm4gQ1BVIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KKyNkZWZpbmUgQVJDX09QQ09ERV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQorLyogUmV0dXJuIE1BQ0ggbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLworI2RlZmluZSBBUkNfT1BDT0RFX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCisvKiBGaXJzdCBvcGNvZGUgZmxhZyBiaXQgYXZhaWxhYmxlIGFmdGVyIG1hY2hpbmUgbWFzay4gICovCisjZGVmaW5lIEFSQ19PUENPREVfRkxBR19TVEFSVCAoKEFSQ19NQUNIX01BU0sgKyAxKSA8PCAwKQorLyogVGhpcyBpbnNuIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyNkZWZpbmUgQVJDX09QQ09ERV9DT05EX0JSQU5DSCAoQVJDX09QQ09ERV9GTEFHX1NUQVJUKQorCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBhc3NlbWJseSBhbmQgZGlzYXNzZW1ibHkuICBFYWNoIGluc24gaXMKKyAgICAgb24gYSBsaXN0IG9mIHJlbGF0ZWQgaW5zbnMgKHNhbWUgZmlyc3QgbGV0dGVyIGZvciBhc3NlbWJseSwgc2FtZSBpbnNuIGNvZGUKKyAgICAgZm9yIGRpc2Fzc2VtYmx5KS4gICovCisgIHN0cnVjdCBhcmNfb3Bjb2RlICpuZXh0X2FzbTsJLyogTmV4dCBpbnN0cnVjdGlvbiB0byB0cnkgZHVyaW5nIGFzc2VtYmx5LiAgKi8KKyAgc3RydWN0IGFyY19vcGNvZGUgKm5leHRfZGlzOwkvKiBOZXh0IGluc3RydWN0aW9uIHRvIHRyeSBkdXJpbmcgZGlzYXNzZW1ibHkuICAqLworCisgIC8qIE1hY3JvcyB0byBjcmVhdGUgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgbGlzdHMuICAqLworI2RlZmluZSBBUkNfSEFTSF9PUENPREUoc3RyaW5nKSBcCisgICgoc3RyaW5nKVswXSA+PSAnYScgJiYgKHN0cmluZylbMF0gPD0gJ3onID8gKHN0cmluZylbMF0gLSAnYScgOiAyNikKKyNkZWZpbmUgQVJDX0hBU0hfSUNPREUoaW5zbikgXAorICAoKHVuc2lnbmVkIGludCkgKGluc24pID4+IDI3KQorCisgIC8qIE1hY3JvcyB0byBhY2Nlc3MgYG5leHRfYXNtJywgYG5leHRfZGlzJyBzbyB1c2VycyBuZWVkbid0IGNhcmUgYWJvdXQgdGhlCisgICAgIHVuZGVybHlpbmcgbWVjaGFuaXNtLiAgKi8KKyNkZWZpbmUgQVJDX09QQ09ERV9ORVhUX0FTTShvcCkgKChvcCktPm5leHRfYXNtKQorI2RlZmluZSBBUkNfT1BDT0RFX05FWFRfRElTKG9wKSAoKG9wKS0+bmV4dF9kaXMpCit9OworCitzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgeworICBjaGFyICpuYW1lOwkJCS8qIGVnOiAiZXEiICovCisgIHNob3J0IHZhbHVlOwkJCS8qIGVnOiAxICovCisgIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KKyAgdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHZhcmlvdXMgZmxhZyBiaXRzICovCisKKy8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCisKKy8qIFJldHVybiBDUFUgbnVtYmVyLCBnaXZlbiBmbGFnIGJpdHMuICAqLworI2RlZmluZSBBUkNfT1BWQUxfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKKy8qIFJldHVybiBNQUNIIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KKyNkZWZpbmUgQVJDX09QVkFMX01BQ0goYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX01BU0spCit9OworCitzdHJ1Y3QgYXJjX29wZXJhbmQgeworICAvKiBPbmUgb2YgdGhlIGluc24gZm9ybWF0IGNoYXJzLiAgKi8KKyAgdW5zaWduZWQgY2hhciBmbXQ7CisKKyAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kIChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyKS4gICovCisgIHVuc2lnbmVkIGNoYXIgYml0czsKKworICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG9yCisgICAgIHRoZSBtb2RpZmllcidzIGZsYWcgYml0IChtYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzaGlmdDsKKworICAvKiBWYXJpb3VzIGZsYWcgYml0cy4gICovCisgIGludCBmbGFnczsKKworLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KKworLyogVGhpcyBvcGVyYW5kIGlzIGEgc3VmZml4IHRvIHRoZSBvcGNvZGUuICAqLworI2RlZmluZSBBUkNfT1BFUkFORF9TVUZGSVggMQorCisvKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgorICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCisjZGVmaW5lIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCAyCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKKyAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0ggNAorCisvKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKKyAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBBUkNfT1BFUkFORF9BRERSRVNTIDgKKworLyogVGhpcyBvcGVyYW5kIGlzIGEgbG9uZyBpbW1lZGlhdGUgdmFsdWUuICAqLworI2RlZmluZSBBUkNfT1BFUkFORF9MSU1NIDB4MTAKKworLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLworI2RlZmluZSBBUkNfT1BFUkFORF9TSUdORUQgMHgyMAorCisvKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKKyAgIHJhbmdlIG9mIHZhbHVlcy4gIFRoYXQgaXMsIGlmIGJpdHMgaXMgMTYsIGl0IHRha2VzIGFueSB2YWx1ZSBmcm9tCisgICAtMHg4MDAwIHRvIDB4ZmZmZi4gICovCisjZGVmaW5lIEFSQ19PUEVSQU5EX1NJR05PUFQgMHg0MAorCisvKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKKyAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKKyAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQorICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCisgICBvcGVyYW5kLiAgKi8KKyNkZWZpbmUgQVJDX09QRVJBTkRfTkVHQVRJVkUgMHg4MAorCisvKiBUaGlzIG9wZXJhbmQgZG9lc24ndCByZWFsbHkgZXhpc3QuICBUaGUgcHJvZ3JhbSB1c2VzIHRoZXNlIG9wZXJhbmRzCisgICBpbiBzcGVjaWFsIHdheXMuICAqLworI2RlZmluZSBBUkNfT1BFUkFORF9GQUtFIDB4MTAwCisKKy8qIE1vZGlmaWVyIHZhbHVlcy4gICovCisvKiBBIGRvdCBpcyByZXF1aXJlZCBiZWZvcmUgYSBzdWZmaXguICBFZzogLmxlICAqLworI2RlZmluZSBBUkNfTU9EX0RPVCAweDEwMDAKKworLyogQSBub3JtYWwgcmVnaXN0ZXIgaXMgYWxsb3dlZCAobm90IHVzZWQsIGJ1dCBoZXJlIGZvciBjb21wbGV0ZW5lc3MpLiAgKi8KKyNkZWZpbmUgQVJDX01PRF9SRUcgMHgyMDAwCisKKy8qIEFuIGF1eGlsaWFyeSByZWdpc3RlciBuYW1lIGlzIGV4cGVjdGVkLiAgKi8KKyNkZWZpbmUgQVJDX01PRF9BVVhSRUcgMHg0MDAwCisKKy8qIFN1bSBvZiBhbGwgQVJDX01PRF9YWFggYml0cy4gICovCisjZGVmaW5lIEFSQ19NT0RfQklUUyAweDcwMDAKKworLyogTm9uLXplcm8gaWYgdGhlIG9wZXJhbmQgdHlwZSBpcyByZWFsbHkgYSBtb2RpZmllci4gICovCisjZGVmaW5lIEFSQ19NT0RfUChYKSAoKFgpICYgQVJDX01PRF9CSVRTKQorCisgIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCisgICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KKworICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCisgICAgICAgICBpIHw9IChwICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OworICAgICAoSSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIE8gaXMgYSBwb2ludGVyIHRvCisgICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgT1AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKKyAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KKworICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCisgICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKKyAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgorICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZworICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCisgICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQuCisKKyAgICAgUkVHIGlzIG5vbi1OVUxMIHdoZW4gaW5zZXJ0aW5nIGEgcmVnaXN0ZXIgdmFsdWUuICAqLworCisgIGFyY19pbnNuICgqaW5zZXJ0KSBQQVJBTVMgKChhcmNfaW5zbiBpbnNuLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kLCBpbnQgbW9kcywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnLCBsb25nIHZhbHVlLAorCQkJICAgICAgY29uc3QgY2hhciAqKmVycm1zZykpOworCisgIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCisgICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KKworICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCisgICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7CisJIGlmICgoby0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdORUQpICE9IDAKKwkgICAgICYmIChvcCAmICgxIDw8IChvLT5iaXRzIC0gMSkpKSAhPSAwKQorCSAgIG9wIC09IDEgPDwgby0+Yml0czsKKyAgICAgKEkgaXMgdGhlIGluc3RydWN0aW9uLCBPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIE9QCisgICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCisKKyAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQorICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCisgICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bworICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCisgICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQorICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgorCisgICAgIElOU04gaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byBgYXJjX2luc24ncy4gIFRoZSBmaXJzdCBlbGVtZW50IGlzCisgICAgIHRoZSBpbnNuLCB0aGUgc2Vjb25kIGlzIHRoZSBsaW1tIGlmIHByZXNlbnQuCisKKyAgICAgT3BlcmFuZHMgdGhhdCBoYXZlIGEgcHJpbnRhYmxlIGZvcm0gbGlrZSByZWdpc3RlcnMgYW5kIHN1ZmZpeGVzIGhhdmUKKyAgICAgdGhlaXIgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIHBvaW50ZXIgc3RvcmVkIGluIE9QVkFMLiAgKi8KKworICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgoYXJjX2luc24gKmluc24sCisJCQkgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQsCisJCQkgICBpbnQgbW9kcywgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqb3B2YWwsCisJCQkgICBpbnQgKmludmFsaWQpKTsKK307CisKKy8qIEJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIGNwdSB3ZSBoYXZlLgorICAgVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCB0byBhcmNfaW5pdF9vcGNvZGVfdGFibGVzLgorICAgQXQgcHJlc2VudCwgYWxsIHRoZXJlIGlzIGlzIHRoZSBjcHUgdHlwZS4gICovCisKKy8qIENQVSBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLworI2RlZmluZSBBUkNfSEFWRV9DUFUoYml0cykgKChiaXRzKSAmIEFSQ19NQUNIX0NQVV9NQVNLKQorLyogTUFDSCBudW1iZXIsIGdpdmVuIHZhbHVlIHBhc3NlZCB0byBgYXJjX2luaXRfb3Bjb2RlX3RhYmxlcycuICAqLworI2RlZmluZSBBUkNfSEFWRV9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQorCisvKiBTcGVjaWFsIHJlZ2lzdGVyIHZhbHVlczogICovCisjZGVmaW5lIEFSQ19SRUdfU0hJTU1fVVBEQVRFIDYxCisjZGVmaW5lIEFSQ19SRUdfU0hJTU0gNjMKKyNkZWZpbmUgQVJDX1JFR19MSU1NIDYyCisKKy8qIE5vbi16ZXJvIGlmIFJFRyBpcyBhIGNvbnN0YW50IG1hcmtlci4gICovCisjZGVmaW5lIEFSQ19SRUdfQ09OU1RBTlRfUChSRUcpICgoUkVHKSA+PSA2MSkKKworLyogUG9zaXRpb25zIGFuZCBtYXNrcyBvZiB2YXJpb3VzIGZpZWxkczogICovCisjZGVmaW5lIEFSQ19TSElGVF9SRUdBIDIxCisjZGVmaW5lIEFSQ19TSElGVF9SRUdCIDE1CisjZGVmaW5lIEFSQ19TSElGVF9SRUdDIDkKKyNkZWZpbmUgQVJDX01BU0tfUkVHIDYzCisKKy8qIERlbGF5IHNsb3QgdHlwZXMuICAqLworI2RlZmluZSBBUkNfREVMQVlfTk9ORSAwCS8qIG5vIGRlbGF5IHNsb3QgKi8KKyNkZWZpbmUgQVJDX0RFTEFZX05PUk1BTCAxCS8qIGRlbGF5IHNsb3QgaW4gYm90aCBjYXNlcyAqLworI2RlZmluZSBBUkNfREVMQVlfSlVNUCAyCS8qIGRlbGF5IHNsb3Qgb25seSBpZiBicmFuY2ggdGFrZW4gKi8KKworLyogTm9uLXplcm8gaWYgWCB3aWxsIGZpdCBpbiBhIHNpZ25lZCA5IGJpdCBmaWVsZC4gICovCisjZGVmaW5lIEFSQ19TSElNTV9DT05TVF9QKHgpICgobG9uZykgKHgpID49IC0yNTYgJiYgKGxvbmcpICh4KSA8PSAyNTUpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgYXJjX29wZXJhbmRzW107CitleHRlcm4gY29uc3QgaW50IGFyY19vcGVyYW5kX2NvdW50OworZXh0ZXJuIC8qY29uc3QqLyBzdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdOworZXh0ZXJuIGNvbnN0IGludCBhcmNfb3Bjb2Rlc19jb3VudDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW107CitleHRlcm4gY29uc3QgaW50IGFyY19zdWZmaXhlc19jb3VudDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3JlZ19uYW1lc1tdOworZXh0ZXJuIGNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50OworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYXJjX29wZXJhbmRfbWFwW107CisKKy8qIFV0aWxpdHkgZm5zIGluIGFyYy1vcGMuYy4gICovCitpbnQgYXJjX2dldF9vcGNvZGVfbWFjaCBQQVJBTVMgKChpbnQsIGludCkpOworLyogYGFyY19vcGNvZGVfaW5pdF90YWJsZXMnIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBgYXJjX3h4eF9zdXBwb3J0ZWQnLiAgKi8KK3ZvaWQgYXJjX29wY29kZV9pbml0X3RhYmxlcyBQQVJBTVMgKChpbnQpKTsKK3ZvaWQgYXJjX29wY29kZV9pbml0X2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkIGFyY19vcGNvZGVfaW5pdF9leHRyYWN0IFBBUkFNUyAoKHZvaWQpKTsKK2NvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICphcmNfb3Bjb2RlX2xvb2t1cF9hc20gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Citjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqYXJjX29wY29kZV9sb29rdXBfZGlzIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworaW50IGFyY19vcGNvZGVfbGltbV9wIFBBUkFNUyAoKGxvbmcgKikpOworY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICphcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICp0eXBlLCBpbnQgdmFsdWUpKTsKK2ludCBhcmNfb3Bjb2RlX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqKSk7CitpbnQgYXJjX29wdmFsX3N1cHBvcnRlZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvYXJtLmggYi9pbmNsdWRlL29wY29kZS9hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzA4N2ViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvYXJtLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qIEFSTSBvcGNvZGUgbGlzdC4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgorCitHREIgYW5kIEdBUyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHREIgYW5kIEdBUyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHREIgb3IgR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiB0eXBlcyBvZiBpbnN0cnVjdGlvbiAoZW5jb2RlZCBpbiBiaXRzIDI2IGFuZCAyNyBvZiB0aGUgaW5zdHJ1Y3Rpb24pICovCisKKyNkZWZpbmUgVFlQRV9BUklUSE1FVElDCQkwCisjZGVmaW5lIFRZUEVfTERSX1NUUgkJMQorI2RlZmluZSBUWVBFX0JMT0NLX0JSQU5DSAkyCisjZGVmaW5lIFRZUEVfU1dJCQkzCisKKy8qIGJpdCAyNSBkZWNpZGVzIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgYSBibG9jayBtb3ZlIG9yIGEgYnJhbmNoICovCisjZGVmaW5lIFNVQlRZUEVfQkxPQ0sJCTAKKyNkZWZpbmUgU1VCVFlQRV9CUkFOQ0gJCTEKKworLyogY29kZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zICovCisKKyNkZWZpbmUgT1BDT0RFX0FORAkwCisjZGVmaW5lIE9QQ09ERV9FT1IJMQorI2RlZmluZSBPUENPREVfU1VCCTIKKyNkZWZpbmUgT1BDT0RFX1JTQgkzCisjZGVmaW5lIE9QQ09ERV9BREQJNAorI2RlZmluZSBPUENPREVfQURDCTUKKyNkZWZpbmUgT1BDT0RFX1NCQwk2CisjZGVmaW5lIE9QQ09ERV9SU0MJNworI2RlZmluZSBPUENPREVfVFNUCTgKKyNkZWZpbmUgT1BDT0RFX1RFUQk5CisjZGVmaW5lIE9QQ09ERV9DTVAJMTAKKyNkZWZpbmUgT1BDT0RFX0NNTgkxMQorI2RlZmluZSBPUENPREVfT1JSCTEyCisjZGVmaW5lIE9QQ09ERV9NT1YJMTMKKyNkZWZpbmUgT1BDT0RFX0JJQwkxNAorI2RlZmluZSBPUENPREVfTVZOCTE1CisKKy8qIGNvbmRpdGlvbiBjb2RlcyAqLworCisjZGVmaW5lIENPTkRfRVEJCTAKKyNkZWZpbmUgQ09ORF9ORQkJMQorI2RlZmluZSBDT05EX0NTCQkyCisjZGVmaW5lIENPTkRfQ0MJCTMKKyNkZWZpbmUgQ09ORF9NSQkJNAorI2RlZmluZSBDT05EX1BMCQk1CisjZGVmaW5lIENPTkRfVlMJCTYKKyNkZWZpbmUgQ09ORF9WQwkJNworI2RlZmluZSBDT05EX0hJCQk4CisjZGVmaW5lIENPTkRfTFMJCTkKKyNkZWZpbmUgQ09ORF9HRQkJMTAKKyNkZWZpbmUgQ09ORF9MVAkJMTEKKyNkZWZpbmUgQ09ORF9HVAkJMTIKKyNkZWZpbmUgQ09ORF9MRQkJMTMKKyNkZWZpbmUgQ09ORF9BTAkJMTQKKyNkZWZpbmUgQ09ORF9OVgkJMTUKKworLyogRGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgYW4gQVJNIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KKworc3RydWN0IGdlbmVyaWNfZm10IHsKKyAgICB1bnNpZ25lZCByZXN0CToyNTsJLyogdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9uICovCisgICAgdW5zaWduZWQgc3VidHlwZQk6MTsJLyogdXNlZCB0byBkZWNpZGUgYmV0d2VlbiBibG9jayBhbmQgYnJhbmNoICovCisgICAgdW5zaWduZWQgdHlwZQk6MjsJLyogb25lIG9mIFRZUEVfKiAqLworICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLworfTsKKworc3RydWN0IGFyaXRoX2ZtdCB7CisgICAgdW5zaWduZWQgb3BlcmFuZDIJOjEyOwkvKiAjbm4gb3Igcm4gb3Igcm4gc2hpZnQgI20gb3Igcm4gc2hpZnQgcm0gKi8KKyAgICB1bnNpZ25lZCBkZXN0CTo0OwkvKiBwbGFjZSB3aGVyZSB0aGUgYW5zd2VyIGdvZXMgKi8KKyAgICB1bnNpZ25lZCBvcGVyYW5kMQk6NDsJLyogZmlyc3Qgb3BlcmFuZCB0byBpbnN0cnVjdGlvbiAqLworICAgIHVuc2lnbmVkIHNldAk6MTsJLyogPT0gMSBtZWFucyBzZXQgcHJvY2Vzc29yIGZsYWdzICovCisgICAgdW5zaWduZWQgb3Bjb2RlCTo0OwkvKiBvbmUgb2YgT1BDT0RFXyogZGVmaW5lZCBhYm92ZSAqLworICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiBvcGVyYW5kMiBpcyBhbiBpbW1lZGlhdGUgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0FSSVRITUVUSUMgKi8KKyAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KK307CisKK3N0cnVjdCBsZHJfc3RyX2ZtdCB7CisgICAgdW5zaWduZWQgb2Zmc2V0CToxMjsJLyogI25uIG9yIHJuIG9yIHJuIHNoaWZ0ICNtICovCisgICAgdW5zaWduZWQgcmVnCTo0OwkvKiBkZXN0aW5hdGlvbiBmb3IgTERSLCBzb3VyY2UgZm9yIFNUUiAqLworICAgIHVuc2lnbmVkIGJhc2UJOjQ7CS8qIGJhc2UgcmVnaXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBpc19sb2FkCToxOwkvKiA9PSAxIGZvciBMRFIgKi8KKyAgICB1bnNpZ25lZCB3cml0ZWJhY2sJOjE7CS8qID09IDEgbWVhbnMgd3JpdGUgYmFjayAoYmFzZStvZmZzZXQpIGludG8gYmFzZSAqLworICAgIHVuc2lnbmVkIGJ5dGUJOjE7CS8qID09IDEgbWVhbnMgYnl0ZSBhY2Nlc3MgZWxzZSB3b3JkICovCisgICAgdW5zaWduZWQgdXAJCToxOwkvKiA9PSAxIG1lYW5zIGFkZCBvZmZzZXQgZWxzZSBzdWJ0cmFjdCBpdCAqLworICAgIHVuc2lnbmVkIHByZV9pbmRleAk6MTsJLyogPT0gMSBtZWFucyBbYSxiXSBmb3JtIGVsc2UgW2FdLGIgZm9ybSAqLworICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiA9PSAwIG1lYW5zIGltbWVkaWF0ZSBvZmZzZXQgKi8KKyAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0xEUl9TVFIgKi8KKyAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KK307CisKK3N0cnVjdCBibG9ja19mbXQgeworICAgIHVuc2lnbmVkIG1hc2sJOjE2OwkvKiByZWdpc3RlciBtYXNrICovCisgICAgdW5zaWduZWQgYmFzZQk6NDsJLyogcmVnaXN0ZXIgdXNlZCBhcyBiYXNlIG9mIG1vdmUgKi8KKyAgICB1bnNpZ25lZCBpc19sb2FkCToxOwkvKiA9PSAxIGZvciBMRE0gKi8KKyAgICB1bnNpZ25lZCB3cml0ZWJhY2sJOjE7CS8qID09IDEgbWVhbnMgdXBkYXRlIGJhc2UgYWZ0ZXIgbW92ZSAqLworICAgIHVuc2lnbmVkIHNldAk6MTsJLyogPT0gMSBtZWFucyBzZXQgZmxhZ3MgaW4gcGMgaWYgaW5jbHVkZWQgaW4gbWFzayAqLworICAgIHVuc2lnbmVkIGluY3JlbWVudAk6MTsJLyogPT0gMSBtZWFucyBpbmNyZW1lbnQgYmFzZSByZWdpc3RlciAqLworICAgIHVuc2lnbmVkIGJlZm9yZQk6MTsJLyogPT0gMSBtZWFucyBpbmMvZGVjIGJlZm9yZSBlYWNoIG1vdmUgKi8KKyAgICB1bnNpZ25lZCBpc19ibG9jawk6MTsJLyogPT0gU1VCVFlQRV9CTE9DSyAqLworICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfQkxPQ0tfQlJBTkNIICovCisgICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCit9OworCitzdHJ1Y3QgYnJhbmNoX2ZtdCB7CisgICAgdW5zaWduZWQgZGVzdAk6MjQ7CS8qIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggKi8KKyAgICB1bnNpZ25lZCBsaW5rCToxOwkvKiBicmFuY2ggd2l0aCBsaW5rIChmdW5jdGlvbiBjYWxsKSAqLworICAgIHVuc2lnbmVkIGlzX2JyYW5jaAk6MTsJLyogPT0gU1VCVFlQRV9CUkFOQ0ggKi8KKyAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX0JMT0NLX0JSQU5DSCAqLworICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLworfTsKKworI2RlZmluZSBST1VORF9OCQkwCisjZGVmaW5lIFJPVU5EX1AJCTEKKyNkZWZpbmUgUk9VTkRfTQkJMgorI2RlZmluZSBST1VORF9aCQkzCisKKyNkZWZpbmUgRkxPQVQyX01WRgkwCisjZGVmaW5lIEZMT0FUMl9NTkYJMQorI2RlZmluZSBGTE9BVDJfQUJTCTIKKyNkZWZpbmUgRkxPQVQyX1JORAkzCisjZGVmaW5lIEZMT0FUMl9TUVQJNAorI2RlZmluZSBGTE9BVDJfTE9HCTUKKyNkZWZpbmUgRkxPQVQyX0xHTgk2CisjZGVmaW5lIEZMT0FUMl9FWFAJNworI2RlZmluZSBGTE9BVDJfU0lOCTgKKyNkZWZpbmUgRkxPQVQyX0NPUwk5CisjZGVmaW5lIEZMT0FUMl9UQU4JMTAKKyNkZWZpbmUgRkxPQVQyX0FTTgkxMQorI2RlZmluZSBGTE9BVDJfQUNTCTEyCisjZGVmaW5lIEZMT0FUMl9BVE4JMTMKKworI2RlZmluZSBGTE9BVDNfQURGCTAKKyNkZWZpbmUgRkxPQVQzX01VRgkxCisjZGVmaW5lIEZMT0FUM19TVUYJMgorI2RlZmluZSBGTE9BVDNfUlNGCTMKKyNkZWZpbmUgRkxPQVQzX0RWRgk0CisjZGVmaW5lIEZMT0FUM19SREYJNQorI2RlZmluZSBGTE9BVDNfUE9XCTYKKyNkZWZpbmUgRkxPQVQzX1JQVwk3CisjZGVmaW5lIEZMT0FUM19STUYJOAorI2RlZmluZSBGTE9BVDNfRk1MCTkKKyNkZWZpbmUgRkxPQVQzX0ZEVgkxMAorI2RlZmluZSBGTE9BVDNfRlJECTExCisjZGVmaW5lIEZMT0FUM19QT0wJMTIKKworc3RydWN0IGZsb2F0Ml9mbXQgeworICAgIHVuc2lnbmVkIG9wZXJhbmQyCTozOwkvKiBzZWNvbmQgb3BlcmFuZCAqLworICAgIHVuc2lnbmVkIGltbWVkCToxOwkvKiA9PSAxIGlmIHNlY29uZCBvcGVyYW5kIGlzIGEgY29uc3RhbnQgKi8KKyAgICB1bnNpZ25lZCBwYWQxCToxOwkvKiA9PSAwICovCisgICAgdW5zaWduZWQgcm91bmRpbmcJOjI7CS8qIFJPVU5EXyogKi8KKyAgICB1bnNpZ25lZCBpc19kb3VibGUJOjE7CS8qID09IDEgaWYgcHJlY2lzaW9uIGlzIGRvdWJsZSAob25seSBpZiBub3QgZXh0ZW5kZWQpICovCisgICAgdW5zaWduZWQgcGFkMgk6NDsJLyogPT0gMSAqLworICAgIHVuc2lnbmVkIGRlc3QJOjM7CS8qIGRlc3RpbmF0aW9uICovCisgICAgdW5zaWduZWQgaXNfMl9vcAk6MTsJLyogPT0gMSBpZiAyIG9wZXJhbmQgaW5zICovCisgICAgdW5zaWduZWQgb3BlcmFuZDEJOjM7CS8qIGZpcnN0IG9wZXJhbmQgKG9ubHkgb2YgaXNfMl9vcCA9PSAwKSAqLworICAgIHVuc2lnbmVkIGlzX2V4dGVuZGVkIDoxOwkvKiA9PSAxIGlmIHByZWNpc2lvbiBpcyBleHRlbmRlZCAqLworICAgIHVuc2lnbmVkIG9wY29kZQk6NDsJLyogRkxPQVQyXyogb3IgRkxPQVQzXyogZGVwZW5kaW5nIG9uIGlzXzJfb3AgKi8KKyAgICB1bnNpZ25lZCBtdXN0X2JlXzIJOjI7CS8qID09IDIgKi8KKyAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX1NXSSAqLworICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIENPTkRfKiAqLworfTsKKworc3RydWN0IHN3aV9mbXQgeworICAgIHVuc2lnbmVkIGFyZ3VtZW50CToyNDsJLyogYXJndW1lbnQgdG8gU1dJIChzeXNjYWxsIG51bWJlcikgKi8KKyAgICB1bnNpZ25lZCBtdXN0X2JlXzMJOjI7CS8qID09IDMgKi8KKyAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiA9PSBUWVBFX1NXSSAqLworICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLworfTsKKwordW5pb24gaW5zbl9mbXQgeworICAgIHN0cnVjdCBnZW5lcmljX2ZtdAlnZW5lcmljOworICAgIHN0cnVjdCBhcml0aF9mbXQJYXJpdGg7CisgICAgc3RydWN0IGxkcl9zdHJfZm10CWxkcl9zdHI7CisgICAgc3RydWN0IGJsb2NrX2ZtdAlibG9jazsKKyAgICBzdHJ1Y3QgYnJhbmNoX2ZtdAlicmFuY2g7CisgICAgc3RydWN0IHN3aV9mbXQJc3dpOworICAgIHVuc2lnbmVkIGxvbmcJaW5zOworfTsKKworc3RydWN0IG9wY29kZSB7CisgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWFzazsJLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KKyAgICBjaGFyICphc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLworfTsKKworLyogZm9ybWF0IG9mIHRoZSBhc3NlbWJsZXIgc3RyaW5nIDoKKyAgIAorICAgJSUJCQklCisgICAlPGJpdGZpZWxkPmQJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBkZWNpbWFsCisgICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKKyAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCisgICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhbiBmcCByZWdpc3RlcgorICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCisgICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KKyAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgorICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCisgICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKKyAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KKyAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgorICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1CisgICAlbwkJCXByaW50IG9wZXJhbmQyIChpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgKyBzaGlmdCkKKyAgICVhCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRyL3N0ciBpbnN0cnVjdGlvbgorICAgJWIJCQlwcmludCBicmFuY2ggZGVzdGluYXRpb24KKyAgICVBCQkJcHJpbnQgYWRkcmVzcyBmb3IgbGRjL3N0Yy9sZGYvc3RmIGluc3RydWN0aW9uCisgICAlbQkJCXByaW50IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbS9zdG0gaW5zdHJ1Y3Rpb24KKyovCisKK3N0YXRpYyBzdHJ1Y3Qgb3Bjb2RlIG9wY29kZXNbXSA9IHsKKyAgICAvKiBBUk0gaW5zdHJ1Y3Rpb25zICovCisgICAgMHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCUyMCdzICUxMi0xNXIsICUxNi0xOXIsICUwLTNyIiwKKyAgICAweDAwMjAwMDkwLCAweDBmZTAwMGYwLCAibWxhJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciIsCisgICAgMHgwMDAwMDAwMCwgMHgwZGUwMDAwMCwgImFuZCVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAorICAgIDB4MDAyMDAwMDAsIDB4MGRlMDAwMDAsICJlb3IlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKKyAgICAweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCisgICAgMHgwMDYwMDAwMCwgMHgwZGUwMDAwMCwgInJzYiVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAorICAgIDB4MDA4MDAwMDAsIDB4MGRlMDAwMDAsICJhZGQlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKKyAgICAweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCisgICAgMHgwMGMwMDAwMCwgMHgwZGUwMDAwMCwgInNiYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAorICAgIDB4MDBlMDAwMDAsIDB4MGRlMDAwMDAsICJyc2MlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKKyAgICAweDAxMDAwMDAwLCAweDBkZTAwMDAwLCAidHN0JWMlcCAlMTYtMTlyLCAlbyIsCisgICAgMHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVjJXAgJTE2LTE5ciwgJW8iLAorICAgIDB4MDE0MDAwMDAsIDB4MGRlMDAwMDAsICJjbXAlYyVwICUxNi0xOXIsICVvIiwKKyAgICAweDAxNjAwMDAwLCAweDBkZTAwMDAwLCAiY21uJWMlcCAlMTYtMTlyLCAlbyIsCisgICAgMHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAorICAgIDB4MDFhMDAwMDAsIDB4MGRlMDAwMDAsICJtb3YlYyUyMCdzICUxMi0xNXIsICVvIiwKKyAgICAweDAxYzAwMDAwLCAweDBkZTAwMDAwLCAiYmljJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCisgICAgMHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biVjJTIwJ3MgJTEyLTE1ciwgJW8iLAorICAgIDB4MDQwMDAwMDAsIDB4MGMxMDAwMDAsICJzdHIlYyUyMidiICUxMi0xNXIsICVhIiwKKyAgICAweDA0MTAwMDAwLCAweDBjMTAwMDAwLCAibGRyJWMlMjInYiAlMTItMTVyLCAlYSIsCisgICAgMHgwODAwMDAwMCwgMHgwZTEwMDAwMCwgInN0bSVjJTIzP2lkJTI0P2JhICUxNi0xOXIlMjJgISwgJW0iLAorICAgIDB4MDgxMDAwMDAsIDB4MGUxMDAwMDAsICJsZG0lYyUyMz9pZCUyND9iYSAlMTYtMTlyJTIyYCEsICVtJTIyJ14iLAorICAgIDB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJWMlMjQnbCAlYiIsCisgICAgMHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgInN3aSVjICUwLTIzeCIsCisgICAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCisgICAgMHgwZTAwMDEwMCwgMHgwZmYwOGYxMCwgImFkZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTEwMDEwMCwgMHgwZmYwOGYxMCwgIm11ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTIwMDEwMCwgMHgwZmYwOGYxMCwgInN1ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTMwMDEwMCwgMHgwZmYwOGYxMCwgInJzZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTQwMDEwMCwgMHgwZmYwOGYxMCwgImR2ZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTUwMDEwMCwgMHgwZmYwOGYxMCwgInJkZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTYwMDEwMCwgMHgwZmYwOGYxMCwgInBvdyVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTcwMDEwMCwgMHgwZmYwOGYxMCwgInJwdyVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTgwMDEwMCwgMHgwZmYwOGYxMCwgInJtZiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTkwMDEwMCwgMHgwZmYwOGYxMCwgImZtbCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZWEwMDEwMCwgMHgwZmYwOGYxMCwgImZkdiVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZWIwMDEwMCwgMHgwZmYwOGYxMCwgImZyZCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZWMwMDEwMCwgMHgwZmYwOGYxMCwgInBvbCVjJVAlUiAlMTItMTRmLCAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZTAwODEwMCwgMHgwZmYwOGYxMCwgIm12ZiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTEwODEwMCwgMHgwZmYwOGYxMCwgIm1uZiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTIwODEwMCwgMHgwZmYwOGYxMCwgImFicyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTMwODEwMCwgMHgwZmYwOGYxMCwgInJuZCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTQwODEwMCwgMHgwZmYwOGYxMCwgInNxdCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTUwODEwMCwgMHgwZmYwOGYxMCwgImxvZyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTYwODEwMCwgMHgwZmYwOGYxMCwgImxnbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTcwODEwMCwgMHgwZmYwOGYxMCwgImV4cCVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTgwODEwMCwgMHgwZmYwOGYxMCwgInNpbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTkwODEwMCwgMHgwZmYwOGYxMCwgImNvcyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZWEwODEwMCwgMHgwZmYwOGYxMCwgInRhbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZWIwODEwMCwgMHgwZmYwOGYxMCwgImFzbiVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZWMwODEwMCwgMHgwZmYwOGYxMCwgImFjcyVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZWQwODEwMCwgMHgwZmYwOGYxMCwgImF0biVjJVAlUiAlMTItMTRmLCAlMC0zZiIsCisgICAgMHgwZTAwMDExMCwgMHgwZmYwMGYxZiwgImZsdCVjJVAlUiAlMTYtMThmLCAlMTItMTVyIiwKKyAgICAweDBlMTAwMTEwLCAweDBmZmYwZjk4LCAiZml4JWMlUiAlMTItMTVyLCAlMC0yZiIsCisgICAgMHgwZTIwMDExMCwgMHgwZmZmMGZmZiwgIndmcyVjICUxMi0xNXIiLAorICAgIDB4MGUzMDAxMTAsIDB4MGZmZjBmZmYsICJyZnMlYyAlMTItMTVyIiwKKyAgICAweDBlNDAwMTEwLCAweDBmZmYwZmZmLCAid2ZjJWMgJTEyLTE1ciIsCisgICAgMHgwZTUwMDExMCwgMHgwZmZmMGZmZiwgInJmYyVjICUxMi0xNXIiLAorICAgIDB4MGU5MGYxMTAsIDB4MGZmOGZmZjAsICJjbWYlYyAlMTYtMThmLCAlMC0zZiIsCisgICAgMHgwZWIwZjExMCwgMHgwZmY4ZmZmMCwgImNuZiVjICUxNi0xOGYsICUwLTNmIiwKKyAgICAweDBlZDBmMTEwLCAweDBmZjhmZmYwLCAiY21mZSVjICUxNi0xOGYsICUwLTNmIiwKKyAgICAweDBlZjBmMTEwLCAweDBmZjhmZmYwLCAiY25mZSVjICUxNi0xOGYsICUwLTNmIiwKKyAgICAweDBjMDAwMTAwLCAweDBlMTAwZjAwLCAic3RmJWMlUSAlMTItMTRmLCAlQSIsCisgICAgMHgwYzEwMDEwMCwgMHgwZTEwMGYwMCwgImxkZiVjJVEgJTEyLTE0ZiwgJUEiLAorICAgIC8qIEdlbmVyaWMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCisgICAgMHgwZTAwMDAwMCwgMHgwZjAwMDAxMCwgImNkcCVjICU4LTExZCwgJTIwLTIzZCwgY3IlMTItMTVkLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAorICAgIDB4MGUwMDAwMTAsIDB4MGYxMDAwMTAsICJtcmMlYyAlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCisgICAgMHgwZTEwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjICU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKKyAgICAweDBjMDAwMDAwLCAweDBlMTAwMDAwLCAic3RjJWMlMjJgbCAlOC0xMWQsIGNyJTEyLTE1ZCwgJUEiLAorICAgIDB4MGMxMDAwMDAsIDB4MGUxMDAwMDAsICJsZGMlYyUyMmBsICU4LTExZCwgY3IlMTItMTVkLCAlQSIsCisgICAgLyogdGhlIHJlc3QgKi8KKyAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAidW5kZWZpbmVkIGluc3RydWN0aW9uICUwLTMxeCIsCit9OworI2RlZmluZSBOX09QQ09ERVMJKHNpemVvZiBvcGNvZGVzIC8gc2l6ZW9mIG9wY29kZXNbMF0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9jZ2VuLmggYi9pbmNsdWRlL29wY29kZS9jZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1NDJhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaApAQCAtMCwwICsxLDEzODAgQEAKKy8qIEhlYWRlciBmaWxlIGZvciB0YXJnZXRzIHVzaW5nIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQgdGhlIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBDR0VOX0gKKyNkZWZpbmUgQ0dFTl9ICisKKy8qID8/PyBUaGlzIGZpbGUgcmVxdWlyZXMgYmZkLmggYnV0IG9ubHkgdG8gZ2V0IGJmZF92bWEuCisgICBTZWVtcyBsaWtlIGFuIGF3ZnVsIGxvdCB0byByZXF1aXJlIGp1c3QgdG8gZ2V0IHN1Y2ggYSBmdW5kYW1lbnRhbCB0eXBlLgorICAgUGVyaGFwcyB0aGUgZGVmaW5pdGlvbiBvZiBiZmRfdm1hIGNhbiBiZSBtb3ZlZCBvdXRzaWRlIG9mIGJmZC5oLgorICAgT3IgcGVyaGFwcyBvbmUgY291bGQgZHVwbGljYXRlIGl0cyBkZWZpbml0aW9uIGluIGFub3RoZXIgZmlsZS4KKyAgIFVudGlsIHN1Y2ggdGltZSwgdGhpcyBmaWxlIGNvbmRpdGlvbmFsbHkgY29tcGlsZXMgZGVmaW5pdGlvbnMgdGhhdCByZXF1aXJlCisgICBiZmRfdm1hIHVzaW5nIEJGRF9WRVJTSU9OLiAgKi8KKworLyogRW51bXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLgorICAgQWxsb3cgdGhlbSB0byBiZSB1c2VkIGluIHN0cnVjdCBkZWZpbml0aW9ucywgZXZlbiB0aG91Z2ggdGhlIGVudW0gbXVzdAorICAgYmUgZGVmaW5lZCBlbHNld2hlcmUuCisgICBJZiBDR0VOX0FSQ0ggaXNuJ3QgZGVmaW5lZCwgdGhpcyBmaWxlIGlzIGJlaW5nIGluY2x1ZGVkIGJ5IHNvbWV0aGluZyBvdGhlcgorICAgdGhhbiA8YXJjaD4tZGVzYy5oLiAgKi8KKworLyogUHJlcGVuZCB0aGUgYXJjaCBuYW1lLCBkZWZpbmVkIGluIDxhcmNoPi1kZXNjLmgsIGFuZCBfY2dlbl8gdG8gc3ltYm9sIFMuCisgICBUaGUgbGFjayBvZiBzcGFjZXMgaW4gdGhlIGFyZyBsaXN0IGlzIGltcG9ydGFudCBmb3Igbm9uLXN0ZGMgc3lzdGVtcy4KKyAgIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSA8YXJjaD4tZGVzYy5oLgorICAgSXQgY2FuIGJlIGluY2x1ZGVkIGluZGVwZW5kZW50bHkgb2YgPGFyY2g+LWRlc2MuaCwgaW4gd2hpY2ggY2FzZSB0aGUgYXJjaAorICAgZGVwZW5kZW50IHBvcnRpb25zIHdpbGwgYmUgZGVjbGFyZWQgYXMgInVua25vd25fY2dlbl9mb28iLiAgKi8KKworI2lmbmRlZiBDR0VOX1NZTQorI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzICh1bmtub3duLF9jZ2VuXyxzKQorI2VuZGlmCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RhdGljICh1bmNoYW5naW5nKSBwaWVjZXMgYW5kIGFzIG11Y2ggb3RoZXIgc3R1ZmYKKyAgIGFzIHdlIGNhbiByZWFzb25hYmx5IHB1dCBoZXJlLiAgSXQncyBnZW5lcmFsbHkgY2xlYW5lciB0byBwdXQgc3R1ZmYgaGVyZQorICAgcmF0aGVyIHRoYW4gaGF2aW5nIGl0IG1hY2hpbmUgZ2VuZXJhdGVkIGlmIHBvc3NpYmxlLiAgKi8KKworLyogVGhlIGFzc2VtYmxlciBzeW50YXggaXMgbWFkZSB1cCBvZiBleHByZXNzaW9ucyAoZHVoLi4uKS4KKyAgIEF0IHRoZSBsb3dlc3QgbGV2ZWwgdGhlIHZhbHVlcyBhcmUgbW5lbW9uaWNzLCByZWdpc3RlciBuYW1lcywgbnVtYmVycywgZXRjLgorICAgQWJvdmUgdGhhdCBhcmUgc3ViZXhwcmVzc2lvbnMsIGlmIGFueSAoYW4gZXhhbXBsZSBtaWdodCBiZSB0aGUKKyAgICJlZmZlY3RpdmUgYWRkcmVzcyIgaW4gbTY4ayBjcHVzKS4gIFN1YmV4cHJlc3Npb25zIGFyZSB3aXAuCisgICBBdCB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgYXJlIHRoZSBpbnNucyB0aGVtc2VsdmVzLiAgQWJvdmUgdGhhdCBhcmUKKyAgIHBzZXVkby1pbnNucywgc3ludGhldGljIGluc25zLCBhbmQgbWFjcm9zLCBpZiBhbnkuICAqLworDAorLyogTG90cyBvZiBjcHUncyBoYXZlIGEgZml4ZWQgaW5zbiBzaXplLCBvciBvbmUgd2hpY2ggcmFyZWx5IGNoYW5nZXMsCisgICBhbmQgaXQncyBnZW5lcmFsbHkgZWFzaWVyIHRvIGhhbmRsZSB0aGVzZSBieSB0cmVhdGluZyB0aGUgaW5zbiBhcyBhbgorICAgaW50ZWdlciB0eXBlLCByYXRoZXIgdGhhbiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgU28gd2UgYWxsb3cgdGFyZ2V0cworICAgdG8gY29udHJvbCB0aGlzLiAgV2hlbiBhbiBpbnRlZ2VyIHR5cGUgdGhlIHZhbHVlIGlzIGluIGhvc3QgYnl0ZSBvcmRlciwKKyAgIHdoZW4gYW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0aGUgdmFsdWUgaXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBDR0VOX0lOU05fSU5UOworI2lmIENHRU5fSU5UX0lOU05fUAordHlwZWRlZiBDR0VOX0lOU05fSU5UIENHRU5fSU5TTl9CWVRFUzsKK3R5cGVkZWYgQ0dFTl9JTlNOX0lOVCAqQ0dFTl9JTlNOX0JZVEVTX1BUUjsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKkNHRU5fSU5TTl9CWVRFUzsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqQ0dFTl9JTlNOX0JZVEVTX1BUUjsKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgQ0dFTl9JTkxJTkUgX19pbmxpbmVfXworI2Vsc2UKKyNkZWZpbmUgQ0dFTl9JTkxJTkUKKyNlbmRpZgorCitlbnVtIGNnZW5fZW5kaWFuCit7CisgIENHRU5fRU5ESUFOX1VOS05PV04sCisgIENHRU5fRU5ESUFOX0xJVFRMRSwKKyAgQ0dFTl9FTkRJQU5fQklHCit9OworCisvKiBGb3J3YXJkIGRlY2wuICAqLworCit0eXBlZGVmIHN0cnVjdCBjZ2VuX2luc24gQ0dFTl9JTlNOOworCisvKiBPcGFxdWUgcG9pbnRlciB2ZXJzaW9uIGZvciB1c2UgYnkgZXh0ZXJuYWwgd29ybGQuICAqLworCit0eXBlZGVmIHN0cnVjdCBjZ2VuX2NwdV9kZXNjICpDR0VOX0NQVV9ERVNDOworDAorLyogQXR0cmlidXRlcy4KKyAgIEF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdmFyaW91cyByYW5kb20gdGhpbmdzIGFzc29jaWF0ZWQgd2l0aAorICAgYW4gb2JqZWN0IChpZmllbGQsIGhhcmR3YXJlLCBvcGVyYW5kLCBpbnNuLCB3aGF0ZXZlcikgYW5kIGFyZSBzcGVjaWZpZWQKKyAgIGFzIG5hbWUvdmFsdWUgcGFpcnMuCisgICBJbnRlZ2VyIGF0dHJpYnV0ZXMgY29tcHV0ZWQgYXQgY29tcGlsZSB0aW1lIGFyZSBjdXJyZW50bHkgYWxsIHRoYXQncworICAgc3VwcG9ydGVkLCB0aG91Z2ggYWRkaW5nIHN0cmluZyBhdHRyaWJ1dGVzIGFuZCBydW4tdGltZSBjb21wdXRhdGlvbiBpcworICAgc3RyYWlnaHRmb3J3YXJkLiAgSW50ZWdlciBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBhbHdheXMgaG9zdCBpbnQncworICAgKHNpZ25lZCBvciB1bnNpZ25lZCkuICBGb3IgcG9ydGFiaWxpdHksIHRoaXMgbWVhbnMgMzIgYml0cy4KKyAgIEludGVnZXIgYXR0cmlidXRlcyBhcmUgZnVydGhlciBjYXRlZ29yaXplZCBhcyBib29sZWFuLCBiaXRzZXQsIGludGVnZXIsCisgICBhbmQgZW51bSB0eXBlcy4gIEJvb2xlYW4gYXR0cmlidXRlcyBhcHBlYXIgZnJlcXVlbnRseSBlbm91Z2ggdGhhdCB0aGV5J3JlCisgICByZWNvcmRlZCBpbiBvbmUgaG9zdCBpbnQuICBUaGlzIGxpbWl0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYm9vbGVhbgorICAgYXR0cmlidXRlcyB0byAzMiwgdGhvdWdoIHRoYXQncyBhICpsb3QqIG9mIGF0dHJpYnV0ZXMuICAqLworCisvKiBUeXBlIG9mIGF0dHJpYnV0ZSB2YWx1ZXMuICAqLworCit0eXBlZGVmIGludCBDR0VOX0FUVFJfVkFMVUVfVFlQRTsKKworLyogU3RydWN0IHRvIHJlY29yZCBhdHRyaWJ1dGUgaW5mb3JtYXRpb24uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBCb29sZWFuIGF0dHJpYnV0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYm9vbDsKKyAgLyogTm9uLWJvb2xlYW4gaW50ZWdlciBhdHRyaWJ1dGVzLiAgKi8KKyAgQ0dFTl9BVFRSX1ZBTFVFX1RZUEUgbm9uYm9vbFsxXTsKK30gQ0dFTl9BVFRSOworCisvKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhdHRyaWJ1dGVzIHdpdGggTiBub24tYm9vbGVhbiBlbnRyaWVzLgorICAgVGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygbm9uLWJvb2xlYW4gYXR0cmlidXRlcy4KKyAgIFRoZXJlIGlzIGEgbWF4aW11bSBvZiAzMiBib29sZWFuIGF0dHJpYnV0ZXMgKHNpbmNlIHRoZXkgYXJlIGFsbCByZWNvcmRlZAorICAgaW4gb25lIGhvc3QgaW50KS4gICovCisKKyNkZWZpbmUgQ0dFTl9BVFRSX1RZUEUobikgXAorc3RydWN0IHsgdW5zaWduZWQgaW50IGJvb2w7IFwKKwkgQ0dFTl9BVFRSX1ZBTFVFX1RZUEUgbm9uYm9vbFsobikgPyAobikgOiAxXTsgfQorCisvKiBSZXR1cm4gdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gICovCisKKyNkZWZpbmUgQ0dFTl9BVFRSX0JPT0xTKGEpICgoYSktPmJvb2wpCisKKy8qIE5vbi1ib29sZWFuIGF0dHJpYnV0ZSBudW1iZXJzIGFyZSBvZmZzZXQgYnkgdGhpcyBtdWNoLiAgKi8KKworI2RlZmluZSBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUIDMyCisKKy8qIEdpdmVuIGEgYm9vbGVhbiBhdHRyaWJ1dGUgbnVtYmVyLCByZXR1cm4gaXRzIG1hc2suICAqLworCisjZGVmaW5lIENHRU5fQVRUUl9NQVNLKGF0dHIpICgxIDw8IChhdHRyKSkKKworLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiBib29sZWFuIGF0dHJpYnV0ZSBBVFRSIGluIEFUVFJTLiAgKi8KKworI2RlZmluZSBDR0VOX0JPT0xfQVRUUihhdHRycywgYXR0cikgKChDR0VOX0FUVFJfTUFTSyAoYXR0cikgJiAoYXR0cnMpKSAhPSAwKQorCisvKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gQVRUUl9UQUJMRSBmb3IgT0JKLgorICAgT0JKIGlzIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IHRoYXQgaGFzIHRoZSBhdHRyaWJ1dGVzCisgICAoPz8/IG5vdCB1c2VkIGF0IHByZXNlbnQgYnV0IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgcHVycG9zZXMgLSBldmVudHVhbGx5CisgICB0aGUgZ29hbCBpcyB0byBhbGxvdyByZWNvcmRpbmcgYXR0cmlidXRlcyBpbiBzb3VyY2UgZm9ybSBhbmQgY29tcHV0aW5nCisgICB0aGVtIGxhemlseSBhdCBydW50aW1lLCBub3Qgc3VyZSBvZiB0aGUgZGV0YWlscyB5ZXQpLiAgKi8KKworI2RlZmluZSBDR0VOX0FUVFJfVkFMVUUob2JqLCBhdHRyX3RhYmxlLCBhdHRyKSBcCisoKHVuc2lnbmVkIGludCkgKGF0dHIpIDwgQ0dFTl9BVFRSX05CT09MX09GRlNFVCBcCisgPyAoKENHRU5fQVRUUl9CT09MUyAoYXR0cl90YWJsZSkgJiBDR0VOX0FUVFJfTUFTSyAoYXR0cikpICE9IDApIFwKKyA6ICgoYXR0cl90YWJsZSktPm5vbmJvb2xbKGF0dHIpIC0gQ0dFTl9BVFRSX05CT09MX09GRlNFVF0pKQorCisvKiBBdHRyaWJ1dGUgbmFtZS92YWx1ZSB0YWJsZXMuCisgICBUaGVzZSBhcmUgdXNlZCB0byBhc3Npc3QgcGFyc2luZyBvZiBkZXNjcmlwdGlvbnMgYXQgcnVuLXRpbWUuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICogbmFtZTsKKyAgQ0dFTl9BVFRSX1ZBTFVFX1RZUEUgdmFsdWU7Cit9IENHRU5fQVRUUl9FTlRSWTsKKworLyogRm9yIGVhY2ggZG9tYWluIChpZmxkLGh3LG9wZXJhbmQsaW5zbiksIGxpc3Qgb2YgYXR0cmlidXRlcy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKiBuYW1lOworICBjb25zdCBDR0VOX0FUVFJfRU5UUlkgKiBkZmF1bHQ7CisgIGNvbnN0IENHRU5fQVRUUl9FTlRSWSAqIHZhbHM7Cit9IENHRU5fQVRUUl9UQUJMRTsKKwwKKy8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgorICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KKyAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOworCisgIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCisgICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KKyAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCisgIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKKworICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLworICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKKyAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7Cit9IENHRU5fSVNBOworCisvKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBUaGUgYXJndW1lbnQgdG8gYmZkX2FyY2hfaW5mby0+c2Nhbi4gICovCisgIGNvbnN0IGNoYXIgKmJmZF9uYW1lOworICAvKiBvbmUgb2YgZW51bSBtYWNoX2F0dHIgKi8KKyAgaW50IG51bTsKK30gQ0dFTl9NQUNIOworDAorLyogUGFyc2UgcmVzdWx0IChhbHNvIGV4dHJhY3Rpb24gcmVzdWx0KS4KKworICAgVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGFuIGluc24gaXMgc3RvcmVkIGhlcmUuCisgICBUbyBnZW5lcmF0ZSB0aGUgYWN0dWFsIGluc24sIHRoaXMgaXMgcGFzc2VkIHRvIHRoZSBpbnNlcnQgaGFuZGxlci4KKyAgIFdoZW4gcHJpbnRpbmcgYW4gaW5zbiwgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW9uIGlzIHN0b3JlZCBoZXJlLgorICAgVG8gcHJpbnQgdGhlIGluc24sIHRoaXMgaXMgcGFzc2VkIHRvIHRoZSBwcmludCBoYW5kbGVyLgorCisgICBJdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCBzbyB3ZSBkb24ndCBkZWZpbmUgaXQgaGVyZSwKKyAgIGJ1dCB3ZSBkbyBuZWVkIGEgZm9yd2FyZCBkZWNsIGZvciB0aGUgaGFuZGxlciBmbnMuCisKKyAgIFRoZXJlIGlzIG9uZSBtZW1iZXIgZm9yIGVhY2ggcG9zc2libGUgZmllbGQgaW4gdGhlIGluc24uCisgICBUaGUgdHlwZSBkZXBlbmRzIG9uIHRoZSBmaWVsZC4KKyAgIEFsc28gcmVjb3JkZWQgaGVyZSBpcyB0aGUgY29tcHV0ZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGZvciBhcmNoaXRlY3R1cmVzCisgICB3aGVyZSBpdCB2YXJpZXMuCisqLworCit0eXBlZGVmIHN0cnVjdCBjZ2VuX2ZpZWxkcyBDR0VOX0ZJRUxEUzsKKworLyogVG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuLCBhcyByZWNvcmRlZCBpbiB0aGUgYGZpZWxkcycgc3RydWN0LiAgKi8KKy8qID8/PyBUaGUgZmllbGQgaW5zZXJ0IGhhbmRsZXIgaGFzIGxvdHMgb2Ygb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uCisgICBpZiBpdCBldmVyIGdldHMgaW5saW5lZC4gIE9uIGFyY2hpdGVjdHVyZXMgd2hlcmUgaW5zbnMgYWxsIGhhdmUgdGhlIHNhbWUKKyAgIHNpemUsIG1heSB3aXNoIHRvIGRldGVjdCB0aGF0IGFuZCBtYWtlIHRoaXMgbWFjcm8gYSBjb25zdGFudCAtIHRvIGFsbG93CisgICBmdXJ0aGVyIG9wdGltaXphdGlvbnMuICAqLworCisjZGVmaW5lIENHRU5fRklFTERTX0JJVFNJWkUoZmllbGRzKSAoKGZpZWxkcyktPmxlbmd0aCkKKwwKKy8qIEV4dHJhY3Rpb24gc3VwcG9ydCBmb3IgdmFyaWFibGUgbGVuZ3RoIGluc24gc2V0cy4gICovCisKKy8qIFdoZW4gZGlzYXNzZW1ibGluZyB3ZSBkb24ndCBrbm93IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBhdCB0aGUgc3RhcnQuCisgICBTbyB0aGUgZmlyc3QgQ0dFTl9CQVNFX0lOU05fU0laRSBieXRlcyBhcmUgcmVhZCBhdCB0aGUgc3RhcnQgYW5kIHRoZSByZXN0CisgICBhcmUgcmVhZCB3aGVuIG5lZWRlZC4gIFRoaXMgc3RydWN0IGNvbnRyb2xzIHRoaXMuICBJdCBpcyBiYXNpY2FsbHkgdGhlCisgICBkaXNhc3NlbWJsZV9pbmZvIHN0dWZmLCBleGNlcHQgdGhhdCB3ZSBwcm92aWRlIGEgY2FjaGUgZm9yIHZhbHVlcyBhbHJlYWR5CisgICByZWFkIChzaW5jZSBieXRlcyBjYW4gdHlwaWNhbGx5IGJlIHJlYWQgc2V2ZXJhbCB0aW1lcyB0byBmZXRjaCBtdWx0aXBsZQorICAgb3BlcmFuZHMgdGhhdCBtYXkgYmUgaW4gdGhlbSksIGFuZCB0aGF0IGV4dHJhY3Rpb24gb2YgZmllbGRzIGlzIG5lZWRlZAorICAgaW4gY29udGV4dHMgb3RoZXIgdGhhbiBkaXNhc3NlbWJseS4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogQSBwb2ludGVyIHRvIHRoZSBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdC4KKyAgICAgV2UgZG9uJ3QgcmVxdWlyZSBkaXMtYXNtLmggc28gd2UgdXNlIFBUUiBmb3IgdGhlIHR5cGUgaGVyZS4KKyAgICAgSWYgTlVMTCwgQllURVMgaXMgZnVsbCBvZiB2YWxpZCBkYXRhIChWQUxJRCA9PSAtMSkuICAqLworICBQVFIgZGlzX2luZm87CisgIC8qIFBvaW50cyB0byBhIHdvcmtpbmcgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZS4gICovCisgIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXM7CisgIC8qIE1hc2sgb2YgYnl0ZXMgdGhhdCBhcmUgdmFsaWQgaW4gSU5TTl9CWVRFUy4gICovCisgIHVuc2lnbmVkIGludCB2YWxpZDsKK30gQ0dFTl9FWFRSQUNUX0lORk87CisMCisvKiBBc3NvY2lhdGVkIHdpdGggZWFjaCBpbnNuIG9yIGV4cHJlc3Npb24gaXMgYSBzZXQgb2YgImhhbmRsZXJzIiBmb3IKKyAgIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyBsaWtlIHBhcnNpbmcsIHByaW50aW5nLCBldGMuICBUaGVzZSByZXF1aXJlIGEgYmZkX3ZtYQorICAgdmFsdWUgdG8gYmUgcGFzc2VkIGFyb3VuZCBidXQgd2UgZG9uJ3Qgd2FudCBhbGwgYXBwbGljYXRpb25zIHRvIG5lZWQgYmZkLmguCisgICBTbyB0aGlzIHN0dWZmIGlzIG9ubHkgcHJvdmlkZWQgaWYgYmZkLmggaGFzIGJlZW4gaW5jbHVkZWQuICAqLworCisvKiBQYXJzZSBoYW5kbGVyLgorICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KKyAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgorICAgU1RSUCBpcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSB0ZXh0IGJlaW5nIHBhcnNlZC4KKyAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QgaW4gd2hpY2ggdGhlIHJlc3VsdHMgYXJlIHBsYWNlZC4KKyAgIElmIHRoZSBleHByZXNzaW9uIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQsICpTVFJQIGlzIHVwZGF0ZWQuCisgICBJZiBub3QgaXQgaXMgbGVmdCBhbG9uZS4KKyAgIFRoZSByZXN1bHQgaXMgTlVMTCBpZiBzdWNjZXNzIG9yIGFuIGVycm9yIG1lc3NhZ2UuICAqLwordHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2VfZm4pCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCisJICAgICAgY29uc3QgY2hhciAqKnN0cnBfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOworCisvKiBJbnNlcnQgaGFuZGxlci4KKyAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCisgICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHBhcnNlZC4KKyAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QgZnJvbSB3aGljaCB0aGUgdmFsdWVzCisgICBhcmUgZmV0Y2hlZC4KKyAgIElOU05QIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgaW5zbi4KKyAgIFBDIGlzIHRoZSBwYyB2YWx1ZSBvZiB0aGUgaW5zbi4KKyAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLworCisjaWZkZWYgQkZEX1ZFUlNJT04KK3R5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX2luc2VydF9mbikKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKKwkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgQ0dFTl9JTlNOX0JZVEVTX1BUUiBpbnNucF8sCisJICAgICAgYmZkX3ZtYSBwY18pKTsKKyNlbHNlCit0eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9pbnNlcnRfZm4pICgpOworI2VuZGlmCisKKy8qIEV4dHJhY3QgaGFuZGxlci4KKyAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCisgICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHBhcnNlZC4KKyAgIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGNvbnRyb2xsaW5nIGV4dHJhY3Rpb24KKyAgIChvbmx5IHVzZWQgZm9yIHZhcmlhYmxlIGxlbmd0aCBpbnNucykuCisgICBFWF9JTkZPIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBmb3IgY29udHJvbGxpbmcgcmVhZGluZyBvZiBmdXJ0aGVyCisgICBieXRlcyBmb3IgdGhlIGluc24uCisgICBCQVNFX0lOU04gaXMgdGhlIGZpcnN0IENHRU5fQkFTRV9JTlNOX1NJWkUgYnl0ZXMgKGhvc3Qgb3JkZXIpLgorICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBpbiB3aGljaCB0aGUgcmVzdWx0cyBhcmUgcGxhY2VkLgorICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgorICAgVGhlIHJlc3VsdCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMgb3IgemVybyBpZiBub3QgcmVjb2duaXplZC4gICovCisKKyNpZmRlZiBCRkRfVkVSU0lPTgordHlwZWRlZiBpbnQgKGNnZW5fZXh0cmFjdF9mbikKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKKwkgICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mb18sIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuXywKKwkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKKyNlbHNlCit0eXBlZGVmIGludCAoY2dlbl9leHRyYWN0X2ZuKSAoKTsKKyNlbmRpZgorCisvKiBQcmludCBoYW5kbGVyLgorICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KKyAgIElORk8gaXMgYSBwb2ludGVyIHRvIHRoZSBkaXNhc3NlbWJseSBpbmZvLgorICAgRWc6IGRpc2Fzc2VtYmxlX2luZm8uICBJdCdzIGRlZmluZWQgYXMgYFBUUicgc28gdGhpcyBmaWxlIGNhbiBiZSBpbmNsdWRlZAorICAgd2l0aG91dCBkaXMtYXNtLmguCisgICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHByaW50ZWQuCisgICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0LgorICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgorICAgTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGluc24sIGluIGJpdHMuICAqLworCisjaWZkZWYgQkZEX1ZFUlNJT04KK3R5cGVkZWYgdm9pZCAoY2dlbl9wcmludF9mbikKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSIGluZm9fLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAorCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXywgaW50IGxlbl8pKTsKKyNlbHNlCit0eXBlZGVmIHZvaWQgKGNnZW5fcHJpbnRfZm4pICgpOworI2VuZGlmCisKKy8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLgorCisgICBJbmRpY2VzIGludG8gdGhlIGhhbmRsZXIgdGFibGVzLgorICAgV2UgY291bGQgdXNlIHBvaW50ZXJzIGhlcmUgaW5zdGVhZCwgYnV0IDkwJSBvZiB0aGVtIGFyZSBnZW5lcmFsbHkgaWRlbnRpY2FsCisgICBhbmQgdGhhdCdzIGEgbG90IG9mIHJlZHVuZGFudCBkYXRhLiAgTWFraW5nIHRoZXNlIHVuc2lnbmVkIGNoYXIgaW5kaWNlcworICAgaW50byB0YWJsZXMgb2YgcG9pbnRlcnMgc2F2ZXMgYSBiaXQgb2Ygc3BhY2UuCisgICBVc2luZyBpbmRpY2VzIGFsc28ga2VlcHMgYXNzZW1ibGVyIGNvZGUgb3V0IG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kCisgICB2aWNlIHZlcnNhLiAgKi8KKworc3RydWN0IGNnZW5fb3Bjb2RlX2hhbmRsZXIKK3sKKyAgdW5zaWduZWQgY2hhciBwYXJzZSwgaW5zZXJ0LCBleHRyYWN0LCBwcmludDsKK307CisMCisvKiBBc3NlbWJsZXIgaW50ZXJmYWNlLgorCisgICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBhc3NlbWJsZXIgaXMgaW50ZW5kZWQgdG8gYmUgY2xlYW4gaW4gdGhlIHNlbnNlIHRoYXQKKyAgIGxpYm9wY29kZXMuYSBpcyBhIHN0YW5kYWxvbmUgZW50aXR5IGFuZCBjb3VsZCBiZSB1c2VkIHdpdGggYW55IGFzc2VtYmxlci4KKyAgIE5vdCB0aGF0IG9uZSB3b3VsZCBuZWNlc3NhcmlseSB3YW50IHRvIGRvIHRoYXQgYnV0IHJhdGhlciB0aGF0IGl0IGhlbHBzCisgICBrZWVwIGEgY2xlYW4gaW50ZXJmYWNlLiAgVGhlIGludGVyZmFjZSB3aWxsIG9idmlvdXNseSBiZSBzbGFudGVkIHRvd2FyZHMKKyAgIEdBUywgYnV0IGF0IGxlYXN0IGl0J3MgYSBzdGFydC4KKyAgID8/PyBOb3RlIHRoYXQgb25lIHBvc3NpYmxlIHVzZXIgb2YgdGhlIGFzc2VtYmxlciBiZXNpZGVzIEdBUyBpcyBHREIuCisKKyAgIFBhcnNpbmcgaXMgY29udHJvbGxlZCBieSB0aGUgYXNzZW1ibGVyIHdoaWNoIGNhbGxzCisgICBDR0VOX1NZTSAoYXNzZW1ibGVfaW5zbikuICBJZiBpdCBjYW4gcGFyc2UgYW5kIGJ1aWxkIHRoZSBlbnRpcmUgaW5zbgorICAgaXQgZG9lc24ndCBjYWxsIGJhY2sgdG8gdGhlIGFzc2VtYmxlci4gIElmIGl0IG5lZWRzL3dhbnRzIHRvIGNhbGwgYmFjaworICAgdG8gdGhlIGFzc2VtYmxlciwgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGlzIGNhbGxlZCB3aGljaCBjYW4gZWl0aGVyCisKKyAgIC0gcmV0dXJuIGEgbnVtYmVyIHRvIGJlIGluc2VydGVkIGluIHRoZSBpbnNuCisgICAtIHJldHVybiBhICJyZWdpc3RlciIgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQKKyAgICAgKHRoZSByZWdpc3RlciBtaWdodCBub3QgYmUgYSByZWdpc3RlciBwZXIgcGUpCisgICAtIHF1ZXVlIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIGEgbWFya2VyIHNheWluZyB0aGUgZXhwcmVzc2lvbiBoYXMgYmVlbgorICAgICBxdWV1ZWQgKGVnOiBhIGZpeC11cCkKKyAgIC0gcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGUgZXhwcmVzc2lvbiB3YXNuJ3QgcmVjb2duaXphYmxlCisKKyAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGZvciBzdWNjZXNzLgorICAgVGhlIHBhcnNlZCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGJmZF92bWEgKi4gICovCisKKy8qIFZhbHVlcyBmb3IgaW5kaWNhdGluZyB3aGF0IHRoZSBjYWxsZXIgd2FudHMuICAqLworCitlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlCit7CisgIENHRU5fUEFSU0VfT1BFUkFORF9JTklULAorICBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwKKyAgQ0dFTl9QQVJTRV9PUEVSQU5EX0FERFJFU1MKK307CisKKy8qIFZhbHVlcyBmb3IgaW5kaWNhdGluZyB3aGF0IHdhcyBwYXJzZWQuICAqLworCitlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQKK3sKKyAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIsCisgIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUkVHSVNURVIsCisgIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUVVFVUVELAorICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SCit9OworCisjaWZkZWYgQkZEX1ZFUlNJT04gLyogRG9uJ3QgcmVxdWlyZSBiZmQuaCB1bm5lY2Vzc2FyaWx5LiAgKi8KK3R5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsCisJICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZSwgY29uc3QgY2hhciAqKiwgaW50LCBpbnQsCisJICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICosIGJmZF92bWEgKikpOworI2Vsc2UKK3R5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pICgpOworI2VuZGlmCisKKy8qIFNldCB0aGUgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGNhbGxiYWNrLiAgKi8KKworZXh0ZXJuIHZvaWQgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbgorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4pKTsKKworLyogQ2FsbGVkIGJlZm9yZSB0cnlpbmcgdG8gbWF0Y2ggYSB0YWJsZSBlbnRyeSB3aXRoIHRoZSBpbnNuLiAgKi8KKworZXh0ZXJuIHZvaWQgY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOworDAorLyogT3BlcmFuZCB2YWx1ZXMgKGtleXdvcmRzLCBpbnRlZ2Vycywgc3ltYm9scywgZXRjLikgICovCisKKy8qIFR5cGVzIG9mIGFzc2VtYmxlciBlbGVtZW50cy4gICovCisKK2VudW0gY2dlbl9hc21fdHlwZQoreworICBDR0VOX0FTTV9OT05FLCBDR0VOX0FTTV9LRVlXT1JELCBDR0VOX0FTTV9NQVgKK307CisKKyNpZm5kZWYgQ0dFTl9BUkNICitlbnVtIGNnZW5faHdfdHlwZSB7IENHRU5fSFdfTUFYIH07CisjZW5kaWYKKworLyogTGlzdCBvZiBoYXJkd2FyZSBlbGVtZW50cy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7CisgIGVudW0gY2dlbl9od190eXBlIHR5cGU7CisgIC8qIFRoZXJlIGlzIGN1cnJlbnRseSBubyBleGFtcGxlIHdoZXJlIGJvdGggaW5kZXggc3BlY3MgYW5kIHZhbHVlIHNwZWNzCisgICAgIGFyZSByZXF1aXJlZCwgc28gZm9yIG5vdyBib3RoIGFyZSBjbHVtcGVkIHVuZGVyICJhc21fZGF0YSIuICAqLworICBlbnVtIGNnZW5fYXNtX3R5cGUgYXNtX3R5cGU7CisgIFBUUiBhc21fZGF0YTsKKyNpZm5kZWYgQ0dFTl9IV19OQk9PTF9BVFRSUworI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIDEKKyNlbmRpZgorICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9IV19OQk9PTF9BVFRSUykgYXR0cnM7CisjZGVmaW5lIENHRU5fSFdfQVRUUlMoaHcpICgmKGh3KS0+YXR0cnMpCit9IENHRU5fSFdfRU5UUlk7CisKKy8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBIVy4gICovCisKKyNkZWZpbmUgQ0dFTl9IV19BVFRSX1ZBTFVFKGh3LCBhdHRyKSBcCitDR0VOX0FUVFJfVkFMVUUgKChodyksIENHRU5fSFdfQVRUUlMgKGh3KSwgKGF0dHIpKQorCisvKiBUYWJsZSBvZiBoYXJkd2FyZSBlbGVtZW50cyBmb3Igc2VsZWN0ZWQgbWFjaCwgY29tcHV0ZWQgYXQgcnVudGltZS4KKyAgIGVudW0gY2dlbl9od190eXBlIGlzIGFuIGluZGV4IGludG8gdGhpcyB0YWJsZSAoc3BlY2lmaWNhbGx5IGBlbnRyaWVzJykuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFBvaW50ZXIgdG8gbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIGFsbCBjb21waWxlZCBpbiBlbnRyaWVzLiAgKi8KKyAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdF9lbnRyaWVzOworICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KKyAgLyogQXJyYXkgb2YgYWxsIGVudHJpZXMsIGluaXRpYWwgYW5kIHJ1bi10aW1lIGFkZGVkLiAgKi8KKyAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmVudHJpZXM7CisgIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBgZW50cmllcycuICAqLworICB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisgIC8qIEZvciBub3csIHhyZWFsbG9jIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBuZXcgZW50cnkgaXMgYWRkZWQgYXQgcnVudGltZS4KKyAgICAgPz8/IE1heSB3aXNoIHRvIGtlZXAgdHJhY2sgb2Ygc29tZSBzbG9wIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvCisgICAgIHhyZWFsbG9jLCBleGNlcHQgdGhhdCB0aGVyZSdzIHVubGlrZWx5IHRvIGJlIG1hbnkgYW5kIG5vdCBleHBlY3RlZCB0byBiZQorICAgICBpbiBzcGVlZCBjcml0aWNhbCBjb2RlLiAgKi8KK30gQ0dFTl9IV19UQUJMRTsKKworZXh0ZXJuIGNvbnN0IENHRU5fSFdfRU5UUlkgKiBjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIGNvbnN0IENHRU5fSFdfRU5UUlkgKiBjZ2VuX2h3X2xvb2t1cF9ieV9udW0KKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50KSk7CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhpbmdzIGxpa2UgcmVnaXN0ZXIgbmFtZXMsIGV0Yy4gICovCisKK3R5cGVkZWYgc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeQoreworICAvKiBOYW1lIChhcyBpbiByZWdpc3RlciBuYW1lKS4gICovCisgIGNoYXIgKiBuYW1lOworCisgIC8qIFZhbHVlIChhcyBpbiByZWdpc3RlciBudW1iZXIpLgorICAgICBUaGUgdmFsdWUgY2Fubm90IGJlIC0xIGFzIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSAibm90IGZvdW5kIi4KKyAgICAgSURFQTogSGF2ZSAiRlVOQ1RJT04iIGF0dHJpYnV0ZT8gW2Z1bmN0aW9uIGlzIGNhbGxlZCB0byBmZXRjaCB2YWx1ZV0uICAqLworICBpbnQgdmFsdWU7CisKKyAgLyogQXR0cmlidXRlcy4KKyAgICAgVGhpcyBzaG91bGQsIGJ1dCB0ZWNobmljYWxseSBuZWVkbid0LCBhcHBlYXIgbGFzdC4gIEl0IGlzIGEgdmFyaWFibGUgc2l6ZWQKKyAgICAgYXJyYXkgaW4gdGhhdCBvbmUgYXJjaGl0ZWN0dXJlIG1heSBoYXZlIDEgbm9uYm9vbCBhdHRyaWJ1dGUgYW5kIGFub3RoZXIKKyAgICAgbWF5IGhhdmUgbW9yZS4gIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZQorICAgICBuZWVkbid0IGNhcmUuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZAorICAgICBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLCBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlCisgICAgIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvIGF3YXkgYW55d2F5LiAgKi8KKyAgLyogPz8/IE1vdmluZyB0aGlzIGxhc3Qgc2hvdWxkIGJlIGRvbmUgYnkgdHJlYXRpbmcga2V5d29yZHMgbGlrZSBpbnNuIGxpc3RzCisgICAgIGFuZCBtb3ZpbmcgdGhlIGBuZXh0JyBmaWVsZHMgaW50byBhIENHRU5fS0VZV09SRF9MSVNUIHN0cnVjdC4gICovCisgIC8qIEZJWE1FOiBOb3QgdXNlZCB5ZXQuICAqLworI2lmbmRlZiBDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMKKyNkZWZpbmUgQ0dFTl9LRVlXT1JEX05CT09MX0FUVFJTIDEKKyNlbmRpZgorICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9LRVlXT1JEX05CT09MX0FUVFJTKSBhdHRyczsKKworICAvKiA/Pz8gUHV0dGluZyB0aGVzZSBoZXJlIG1lYW5zIGNvbXBpbGVkIGluIGVudHJpZXMgY2FuJ3QgYmUgY29uc3QuCisgICAgIE5vdCBhIHJlYWxseSBiaWcgZGVhbCwgYnV0IHNvbWV0aGluZyB0byBjb25zaWRlci4gICovCisgIC8qIE5leHQgbmFtZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KKyAgc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeSAqbmV4dF9uYW1lOworICAvKiBOZXh0IHZhbHVlIGhhc2ggdGFibGUgZW50cnkuICAqLworICBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5ICpuZXh0X3ZhbHVlOworfSBDR0VOX0tFWVdPUkRfRU5UUlk7CisKKy8qIFRvcCBsZXZlbCBzdHJ1Y3QgZm9yIGRlc2NyaWJpbmcgYSBzZXQgb2YgcmVsYXRlZCBrZXl3b3JkcworICAgKGUuZy4gcmVnaXN0ZXIgbmFtZXMpLgorCisgICBUaGlzIHN0cnVjdCBzdXBwb3J0cyBydW4tdGltZSBlbnRyeSBvZiBuZXcgdmFsdWVzLCBhbmQgaGFzaGVkIGxvb2t1cHMuICAqLworCit0eXBlZGVmIHN0cnVjdCBjZ2VuX2tleXdvcmQKK3sKKyAgLyogUG9pbnRlciB0byBpbml0aWFsIFtjb21waWxlZCBpbl0gdmFsdWVzLiAgKi8KKyAgQ0dFTl9LRVlXT1JEX0VOVFJZICppbml0X2VudHJpZXM7CisgIAorICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBgaW5pdF9lbnRyaWVzJy4gICovCisgIHVuc2lnbmVkIGludCBudW1faW5pdF9lbnRyaWVzOworICAKKyAgLyogSGFzaCB0YWJsZSB1c2VkIGZvciBuYW1lIGxvb2t1cC4gICovCisgIENHRU5fS0VZV09SRF9FTlRSWSAqKm5hbWVfaGFzaF90YWJsZTsKKyAgCisgIC8qIEhhc2ggdGFibGUgdXNlZCBmb3IgdmFsdWUgbG9va3VwLiAgKi8KKyAgQ0dFTl9LRVlXT1JEX0VOVFJZICoqdmFsdWVfaGFzaF90YWJsZTsKKyAgCisgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoX3RhYmxlcy4gICovCisgIHVuc2lnbmVkIGludCBoYXNoX3RhYmxlX3NpemU7CisgIAorICAvKiBQb2ludGVyIHRvIG51bGwga2V5d29yZCAiIiBlbnRyeSBpZiBwcmVzZW50LiAgKi8KKyAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpudWxsX2VudHJ5OworfSBDR0VOX0tFWVdPUkQ7CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBzZWFyY2hpbmcuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBUYWJsZSBiZWluZyBzZWFyY2hlZC4gICovCisgIGNvbnN0IENHRU5fS0VZV09SRCAqdGFibGU7CisgIAorICAvKiBTcGVjaWZpY2F0aW9uIG9mIHdoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yLiAgKi8KKyAgY29uc3QgY2hhciAqc3BlYzsKKyAgCisgIC8qIEN1cnJlbnQgaW5kZXggaW4gaGFzaCB0YWJsZS4gICovCisgIHVuc2lnbmVkIGludCBjdXJyZW50X2hhc2g7CisgIAorICAvKiBDdXJyZW50IGVsZW1lbnQgaW4gY3VycmVudCBoYXNoIGNoYWluLiAgKi8KKyAgQ0dFTl9LRVlXT1JEX0VOVFJZICpjdXJyZW50X2VudHJ5OworfSBDR0VOX0tFWVdPUkRfU0VBUkNIOworCisvKiBMb29rdXAgYSBrZXl3b3JkIGZyb20gaXRzIG5hbWUuICAqLworCitjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmNnZW5fa2V5d29yZF9sb29rdXBfbmFtZQorICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqKSk7CisKKy8qIExvb2t1cCBhIGtleXdvcmQgZnJvbSBpdHMgdmFsdWUuICAqLworCitjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUKKyAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIGludCkpOworCisvKiBBZGQgYSBrZXl3b3JkLiAgKi8KKwordm9pZCBjZ2VuX2tleXdvcmRfYWRkIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBDR0VOX0tFWVdPUkRfRU5UUlkgKikpOworCisvKiBLZXl3b3JkIHNlYXJjaGluZy4KKyAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgZXZlcnkga2V5d29yZCwgb3IgYSBzdWJzZXQuICAqLworCitDR0VOX0tFWVdPUkRfU0VBUkNIIGNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdAorICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqKSk7Citjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dAorICBQQVJBTVMgKChDR0VOX0tFWVdPUkRfU0VBUkNIICopKTsKKworLyogT3BlcmFuZCB2YWx1ZSBzdXBwb3J0IHJvdXRpbmVzLiAgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2Vfa2V5d29yZAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBDR0VOX0tFWVdPUkQgKiwgbG9uZyAqKSk7CisjaWZkZWYgQkZEX1ZFUlNJT04gLyogRG9uJ3QgcmVxdWlyZSBiZmQuaCB1bm5lY2Vzc2FyaWx5LiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIGludCwgbG9uZyAqKSk7CitleHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIGludCwgdW5zaWduZWQgbG9uZyAqKSk7CitleHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9hZGRyZXNzCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIGludCwgaW50LAorCSAgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqLCBiZmRfdm1hICopKTsKK2V4dGVybiBjb25zdCBjaGFyICpjZ2VuX3ZhbGlkYXRlX3NpZ25lZF9pbnRlZ2VyCisgICAgIFBBUkFNUyAoKGxvbmcsIGxvbmcsIGxvbmcpKTsKK2V4dGVybiBjb25zdCBjaGFyICpjZ2VuX3ZhbGlkYXRlX3Vuc2lnbmVkX2ludGVnZXIKKyAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOworI2VuZGlmCisMCisvKiBPcGVyYW5kIG1vZGVzLiAgKi8KKworLyogPz8/IFRoaXMgZHVwbGljYXRlcyB0aGUgdmFsdWVzIGluIGFyY2guaC4gIFJldmlzaXQuCisgICBUaGVzZSBob3dldmVyIG5lZWQgdGhlIENHRU5fIHByZWZpeCBbYXMgZG9lcyBldmVyeXRoaW5nIGluIHRoaXMgZmlsZV0uICAqLworLyogPz8/IFRhcmdldHMgbWF5IG5lZWQgdG8gYWRkIHRoZWlyIG93biBtb2RlcyBzbyB3ZSBtYXkgd2lzaCB0byBtb3ZlIHRoaXMKKyAgIHRvIDxhcmNoPi1vcGMuaCwgb3IgYWRkIGEgaG9vay4gICovCisKK2VudW0gY2dlbl9tb2RlIHsKKyAgQ0dFTl9NT0RFX1ZPSUQsIC8qID8/PyByZW5hbWUgc2ltdWxhdG9yJ3MgVk0gdG8gVk9JRD8gKi8KKyAgQ0dFTl9NT0RFX0JJLCBDR0VOX01PREVfUUksIENHRU5fTU9ERV9ISSwgQ0dFTl9NT0RFX1NJLCBDR0VOX01PREVfREksCisgIENHRU5fTU9ERV9VQkksIENHRU5fTU9ERV9VUUksIENHRU5fTU9ERV9VSEksIENHRU5fTU9ERV9VU0ksIENHRU5fTU9ERV9VREksCisgIENHRU5fTU9ERV9TRiwgQ0dFTl9NT0RFX0RGLCBDR0VOX01PREVfWEYsIENHRU5fTU9ERV9URiwKKyAgQ0dFTl9NT0RFX1RBUkdFVF9NQVgsCisgIENHRU5fTU9ERV9JTlQsIENHRU5fTU9ERV9VSU5ULAorICBDR0VOX01PREVfTUFYCit9OworCisvKiBGSVhNRTogVW50aWwgc2ltdWxhdG9yIGlzIHVwZGF0ZWQuICAqLworCisjZGVmaW5lIENHRU5fTU9ERV9WTSBDR0VOX01PREVfVk9JRAorDAorLyogT3BlcmFuZHMuICAqLworCisjaWZuZGVmIENHRU5fQVJDSAorZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7IENHRU5fT1BFUkFORF9NQVggfTsKKyNlbmRpZgorCisvKiAibmlsIiBpbmRpY2F0b3IgZm9yIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlICovCisjZGVmaW5lIENHRU5fT1BFUkFORF9OSUwgQ0dFTl9PUEVSQU5EX01BWAorCisvKiBUaGlzIHN0cnVjdCBkZWZpbmVzIGVhY2ggZW50cnkgaW4gdGhlIG9wZXJhbmQgdGFibGUuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBOYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLworICBjaGFyICpuYW1lOworCisgIC8qIE9wZXJhbmQgdHlwZS4gICovCisgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgdHlwZTsKKworICAvKiBUaGUgaGFyZHdhcmUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcGVyYW5kLiAgKi8KKyAgZW51bSBjZ2VuX2h3X3R5cGUgaHdfdHlwZTsKKworICAvKiBGSVhNRTogV2UgZG9uJ3QgeWV0IHJlY29yZCBpZmllbGQgZGVmaW5pdGlvbnMsIHdoaWNoIHdlIHNob3VsZC4KKyAgICAgV2hlbiB3ZSBkbyBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGRlbGV0ZSBzdGFydC9sZW5ndGggKHNpbmNlIHRoZXkgd2lsbAorICAgICBiZSBkdXBsaWNhdGVkIGluIHRoZSBpZmllbGQncyBkZWZpbml0aW9uKSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYQorICAgICBwb2ludGVyIHRvIHRoZSBpZmllbGQgZW50cnkuICAqLworCisgIC8qIEJpdCBwb3NpdGlvbi4KKyAgICAgVGhpcyBpcyBqdXN0IGEgaGludCwgYW5kIG1heSBiZSB1bnVzZWQgaW4gbW9yZSBjb21wbGV4IG9wZXJhbmRzLgorICAgICBNYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBzdGFydDsKKworICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuCisgICAgIFRoaXMgaXMganVzdCBhIGhpbnQsIGFuZCBtYXkgYmUgdW51c2VkIGluIG1vcmUgY29tcGxleCBvcGVyYW5kcy4KKyAgICAgTWF5IGJlIHVudXNlZCBmb3IgYSBtb2RpZmllci4gICovCisgIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOworCisjaWYgMCAvKiA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgcmVsb2NzIHRlbmQgdG8gZ2V0IHRvbyBjb21wbGljYXRlZCwKKwkgYW5kIEFCSSBkZXBlbmRlbnQsIGZvciBzaW1wbGUgdGFibGUgbG9va3VwcyB0byB3b3JrLiAgKi8KKyAgLyogSWRlYWxseSB0aGlzIHdvdWxkIGJlIHRoZSBpbnRlcm5hbCAoZXh0ZXJuYWw/KSByZWxvYyB0eXBlLiAgKi8KKyAgaW50IHJlbG9jX3R5cGU7CisjZW5kaWYKKworICAvKiBBdHRyaWJ1dGVzLgorICAgICBUaGlzIHNob3VsZCwgYnV0IHRlY2huaWNhbGx5IG5lZWRuJ3QsIGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZAorICAgICBhcnJheSBpbiB0aGF0IG9uZSBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlcgorICAgICBtYXkgaGF2ZSBtb3JlLiAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlCisgICAgIG5lZWRuJ3QgY2FyZSwgbm93IG9yIHRvbW9ycm93LiAgVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZWNvcmQKKyAgICAgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybSwgZXZhbHVhdGUgdGhlbSBhdCBydW4tdGltZSwgYW5kIGNhY2hlIHRoZQorICAgICB2YWx1ZXMsIHNvIHRoaXMgd29ycnkgd2lsbCBnbyBhd2F5IGFueXdheS4gICovCisjaWZuZGVmIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUworI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgMQorI2VuZGlmCisgIENHRU5fQVRUUl9UWVBFIChDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMpIGF0dHJzOworI2RlZmluZSBDR0VOX09QRVJBTkRfQVRUUlMob3BlcmFuZCkgKCYob3BlcmFuZCktPmF0dHJzKQorfSBDR0VOX09QRVJBTkQ7CisKKy8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBPUEVSQU5ELiAgKi8KKworI2RlZmluZSBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRShvcGVyYW5kLCBhdHRyKSBcCitDR0VOX0FUVFJfVkFMVUUgKChvcGVyYW5kKSwgQ0dFTl9PUEVSQU5EX0FUVFJTIChvcGVyYW5kKSwgKGF0dHIpKQorCisvKiBUYWJsZSBvZiBvcGVyYW5kcyBmb3Igc2VsZWN0ZWQgbWFjaC9pc2EsIGNvbXB1dGVkIGF0IHJ1bnRpbWUuCisgICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIGlzIGFuIGluZGV4IGludG8gdGhpcyB0YWJsZSAoc3BlY2lmaWNhbGx5CisgICBgZW50cmllcycpLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBQb2ludGVyIHRvIG51bGwgdGVybWluYXRlZCB0YWJsZSBvZiBhbGwgY29tcGlsZWQgaW4gZW50cmllcy4gICovCisgIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdF9lbnRyaWVzOworICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KKyAgLyogQXJyYXkgb2YgYWxsIGVudHJpZXMsIGluaXRpYWwgYW5kIHJ1bi10aW1lIGFkZGVkLiAgKi8KKyAgY29uc3QgQ0dFTl9PUEVSQU5EICoqZW50cmllczsKKyAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGBlbnRyaWVzJy4gICovCisgIHVuc2lnbmVkIGludCBudW1fZW50cmllczsKKyAgLyogRm9yIG5vdywgeHJlYWxsb2MgaXMgY2FsbGVkIGVhY2ggdGltZSBhIG5ldyBlbnRyeSBpcyBhZGRlZCBhdCBydW50aW1lLgorICAgICA/Pz8gTWF5IHdpc2ggdG8ga2VlcCB0cmFjayBvZiBzb21lIHNsb3AgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KKyAgICAgeHJlYWxsb2MsIGV4Y2VwdCB0aGF0IHRoZXJlJ3MgdW5saWtlbHkgdG8gYmUgbWFueSBhbmQgbm90IGV4cGVjdGVkIHRvIGJlCisgICAgIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuICAqLworfSBDR0VOX09QRVJBTkRfVEFCTEU7CisKK2V4dGVybiBjb25zdCBDR0VOX09QRVJBTkQgKiBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKSk7CitleHRlcm4gY29uc3QgQ0dFTl9PUEVSQU5EICogY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0KKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50KSk7CisMCisvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIGluc3RhbmNlcy4KKworICAgRm9yIGVhY2ggaW5zdHJ1Y3Rpb24sIGEgbGlzdCBvZiB0aGUgaGFyZHdhcmUgZWxlbWVudHMgdGhhdCBhcmUgcmVhZCBhbmQKKyAgIHdyaXR0ZW4gYXJlIHJlY29yZGVkLiAgKi8KKworLyogVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlLiAgKi8KKworZW51bSBjZ2VuX29waW5zdF90eXBlIHsKKyAgLyogRW5kIG9mIHRhYmxlIG1hcmtlci4gICovCisgIENHRU5fT1BJTlNUX0VORCA9IDAsCisgIENHRU5fT1BJTlNUX0lOUFVULCBDR0VOX09QSU5TVF9PVVRQVVQKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIElucHV0IG9yIG91dHB1dCBpbmRpY2F0b3IuICAqLworICBlbnVtIGNnZW5fb3BpbnN0X3R5cGUgdHlwZTsKKworICAvKiBOYW1lIG9mIG9wZXJhbmQuICAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBoYXJkd2FyZSBlbGVtZW50IHJlZmVyZW5jZWQuICAqLworICBlbnVtIGNnZW5faHdfdHlwZSBod190eXBlOworCisgIC8qIFRoZSBtb2RlIGluIHdoaWNoIHRoZSBvcGVyYW5kIGlzIGJlaW5nIHVzZWQuICAqLworICBlbnVtIGNnZW5fbW9kZSBtb2RlOworCisgIC8qIFRoZSBvcGVyYW5kIHRhYmxlIGVudHJ5IENHRU5fT1BFUkFORF9OSUwgaWYgdGhlcmUgaXMgbm9uZQorICAgICAoaS5lLiBhbiBleHBsaWNpdCBoYXJkd2FyZSByZWZlcmVuY2UpLiAgKi8KKyAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBvcF90eXBlOworCisgIC8qIElmIGBvcGVyYW5kJyBpcyAibmlsIiwgdGhlIGluZGV4IChlLmcuIGludG8gYXJyYXkgb2YgcmVnaXN0ZXJzKS4gICovCisgIGludCBpbmRleDsKKworICAvKiBBdHRyaWJ1dGVzLgorICAgICA/Pz8gVGhpcyBwZXJoYXBzIHNob3VsZCBiZSBhIHJlYWwgYXR0cmlidXRlIHN0cnVjdCBidXQgdGhlcmUncworICAgICBubyBjdXJyZW50IG5lZWQsIHNvIHdlIHNhdmUgYSBiaXQgb2Ygc3BhY2UgYW5kIGp1c3QgaGF2ZSBhIHNldCBvZgorICAgICBmbGFncy4gIFRoZSBpbnRlcmZhY2UgaXMgc3VjaCB0aGF0IHRoaXMgY2FuIGVhc2lseSBiZSBtYWRlIGF0dHJpYnV0ZXMKKyAgICAgc2hvdWxkIGl0IHByb3ZlIHVzZWZ1bC4gICovCisgIHVuc2lnbmVkIGludCBhdHRyczsKKyNkZWZpbmUgQ0dFTl9PUElOU1RfQVRUUlMob3BpbnN0KSAoKG9waW5zdCktPmF0dHJzKQorLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIE9QSU5TVC4gICovCisjZGVmaW5lIENHRU5fT1BJTlNUX0FUVFIob3BpbnN0LCBhdHRyKSBcCisoKENHRU5fT1BJTlNUX0FUVFJTIChvcGluc3QpICYgKGF0dHIpKSAhPSAwKQorLyogT3BlcmFuZCBpcyBjb25kaXRpb25hbGx5IHJlZmVyZW5jZWQgKHJlYWQvd3JpdHRlbikuICAqLworI2RlZmluZSBDR0VOX09QSU5TVF9DT05EX1JFRiAxCit9IENHRU5fT1BJTlNUOworDAorLyogU3ludGF4IHN0cmluZy4KKworICAgRWFjaCBpbnNuIGZvcm1hdCBhbmQgc3ViZXhwcmVzc2lvbiBoYXMgb25lIG9mIHRoZXNlLgorCisgICBUaGUgc3ludGF4ICJzdHJpbmciIGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgKG4gPiAwICYmIG4gPCAxMjgpLCBhbmQgb3BlcmFuZAorICAgdmFsdWVzIChuID49IDEyOCksIGFuZCBpcyB0ZXJtaW5hdGVkIGJ5IDAuICBPcGVyYW5kIHZhbHVlcyBhcmUgMTI4ICsgaW5kZXgKKyAgIGludG8gdGhlIG9wZXJhbmQgdGFibGUuICBUaGUgb3BlcmFuZCB0YWJsZSBkb2Vzbid0IGV4aXN0IGluIEMsIHBlciBzZSwgYXMKKyAgIHRoZSBkYXRhIGlzIHJlY29yZGVkIGluIHRoZSBwYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBzd2l0Y2ggc3RhdGVtZW50cy4gKi8KKworI2lmbmRlZiBDR0VOX01BWF9TWU5UQVhfQllURVMKKyNkZWZpbmUgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTIDE2CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBzeW50YXhbQ0dFTl9NQVhfU1lOVEFYX0JZVEVTXTsKK30gQ0dFTl9TWU5UQVg7CisKKyNkZWZpbmUgQ0dFTl9TWU5UQVhfU1RSSU5HKHN5bikgKHN5bi0+c3ludGF4KQorI2RlZmluZSBDR0VOX1NZTlRBWF9DSEFSX1AoYykgKChjKSA8IDEyOCkKKyNkZWZpbmUgQ0dFTl9TWU5UQVhfQ0hBUihjKSAoYykKKyNkZWZpbmUgQ0dFTl9TWU5UQVhfRklFTEQoYykgKChjKSAtIDEyOCkKKyNkZWZpbmUgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRChjKSAoKGMpICsgMTI4KQorCisvKiA/Pz8gSSBjYW4ndCBjdXJyZW50bHkgdGhpbmsgb2YgYW55IGNhc2Ugd2hlcmUgdGhlIG1uZW1vbmljIGRvZXNuJ3QgY29tZQorICAgZmlyc3QgW2FuZCBpZiBvbmUgZXZlciBkb2Vzbid0IGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlcyB3aWxsIGJlIHRyaWNreV0uCisgICBIb3dldmVyLCB3ZSB0cmVhdCBtbmVtb25pY3MgYXMganVzdCBhbm90aGVyIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgorICAgQSB2YWx1ZSBvZiAxIG1lYW5zICJ0aGlzIGlzIHdoZXJlIHRoZSBtbmVtb25pYyBhcHBlYXJzIi4gIDEgaXNuJ3QKKyAgIHNwZWNpYWwgb3RoZXIgdGhhbiBpdCdzIGEgbm9uLXByaW50YWJsZSBBU0NJSSBjaGFyLiAgKi8KKworI2RlZmluZSBDR0VOX1NZTlRBWF9NTkVNT05JQyAgICAgICAxCisjZGVmaW5lIENHRU5fU1lOVEFYX01ORU1PTklDX1AoY2gpICgoY2gpID09IENHRU5fU1lOVEFYX01ORU1PTklDKQorDAorLyogSW5zdHJ1Y3Rpb24gZmllbGRzLgorCisgICA/Pz8gV2UgY3VycmVudGx5IGRvbid0IGFsbG93IGFkZGluZyBmaWVsZHMgYXQgcnVuLXRpbWUuCisgICBFYXN5IHRvIGZpeCB3aGVuIG5lZWRlZC4gICovCisKK3R5cGVkZWYgc3RydWN0IGNnZW5faWZsZCB7CisgIC8qIEVudW0gb2YgaWZpZWxkLiAgKi8KKyAgaW50IG51bTsKKyNkZWZpbmUgQ0dFTl9JRkxEX05VTShmKSAoKGYpLT5udW0pCisKKyAgLyogTmFtZSBvZiB0aGUgZmllbGQsIGRpc3Rpbmd1aXNoZXMgaXQgZnJvbSBhbGwgb3RoZXIgZmllbGRzLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyNkZWZpbmUgQ0dFTl9JRkxEX05BTUUoZikgKChmKS0+bmFtZSkKKworICAvKiBEZWZhdWx0IG9mZnNldCwgaW4gYml0cywgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gdG8gdGhlIHdvcmQKKyAgICAgY29udGFpbmluZyB0aGUgZmllbGQuICAqLworICBpbnQgd29yZF9vZmZzZXQ7CisjZGVmaW5lIENHRU5fSUZMRF9XT1JEX09GRlNFVChmKSAoKGYpLT53b3JkX29mZnNldCkKKworICAvKiBEZWZhdWx0IGxlbmd0aCBvZiB0aGUgd29yZCBjb250YWluaW5nIHRoZSBmaWVsZC4gICovCisgIGludCB3b3JkX3NpemU7CisjZGVmaW5lIENHRU5fSUZMRF9XT1JEX1NJWkUoZikgKChmKS0+d29yZF9zaXplKQorCisgIC8qIERlZmF1bHQgc3RhcnRpbmcgYml0IG51bWJlci4KKyAgICAgV2hldGhlciBsc2I9MCBvciBtc2I9MCBpcyBkZXRlcm1pbmVkIGJ5IENHRU5fSU5TTl9MU0IwX1AuICAqLworICBpbnQgc3RhcnQ7CisjZGVmaW5lIENHRU5fSUZMRF9TVEFSVChmKSAoKGYpLT5zdGFydCkKKworICAvKiBMZW5ndGggb2YgdGhlIGZpZWxkLCBpbiBiaXRzLiAgKi8KKyAgaW50IGxlbmd0aDsKKyNkZWZpbmUgQ0dFTl9JRkxEX0xFTkdUSChmKSAoKGYpLT5sZW5ndGgpCisKKyNpZm5kZWYgQ0dFTl9JRkxEX05CT09MX0FUVFJTCisjZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAxCisjZW5kaWYKKyAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSUZMRF9OQk9PTF9BVFRSUykgYXR0cnM7CisjZGVmaW5lIENHRU5fSUZMRF9BVFRSUyhmKSAoJihmKS0+YXR0cnMpCit9IENHRU5fSUZMRDsKKworLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIElGTEQuICAqLworI2RlZmluZSBDR0VOX0lGTERfQVRUUl9WQUxVRShpZmxkLCBhdHRyKSBcCitDR0VOX0FUVFJfVkFMVUUgKChpZmxkKSwgQ0dFTl9JRkxEX0FUVFJTIChpZmxkKSwgKGF0dHIpKQorDAorLyogSW5zdHJ1Y3Rpb24gZGF0YS4gICovCisKKy8qIEluc3RydWN0aW9uIGZvcm1hdHMuCisKKyAgIEluc3RydWN0aW9ucyBhcmUgZ3JvdXBlZCBieSBmb3JtYXQuICBBc3NvY2lhdGVkIHdpdGggYW4gaW5zdHJ1Y3Rpb24gaXMgaXRzCisgICBmb3JtYXQuICBFYWNoIGluc24ncyBvcGNvZGUgdGFibGUgZW50cnkgY29udGFpbnMgYSBmb3JtYXQgdGFibGUgZW50cnkuCisgICA/Pz8gVGhlcmUgaXMgdXN1YWxseSB2ZXJ5IGZldyBmb3JtYXRzIGNvbXBhcmVkIHdpdGggdGhlIG51bWJlciBvZiBpbnNucywKKyAgIHNvIG9uZSBjYW4gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBvcGNvZGUgdGFibGUgYnkgcmVjb3JkaW5nIHRoZSBmb3JtYXQgdGFibGUKKyAgIGFzIGEgc2VwYXJhdGUgZW50aXR5LiAgR2l2ZW4gdGhhdCB3ZSBjdXJyZW50bHkgZG9uJ3QsIGZvcm1hdCB0YWJsZSBlbnRyaWVzCisgICBhcmUgYWxzbyBkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIG9wZXJhbmRzLiAgVGhpcyBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlCisgICB0YWJsZSwgYnV0IHJlZHVjZXMgdGhlIG51bWJlciBvZiB0YWJsZXMuICBJdCdzIGFsbCBtaW51dGlhZSBhbnl3YXkgc28gaXQKKyAgIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBbYXQgdGhpcyBwb2ludCBpbiB0aW1lXS4KKworICAgPz8/IFN1cHBvcnQgZm9yIHZhcmlhYmxlIGxlbmd0aCBJU0EncyBpcyB3aXAuICAqLworCisvKiBBY2NvbXBhbnlpbmcgZWFjaCBpZm9ybWF0IGRlc2NyaXB0aW9uIGlzIGEgbGlzdCBvZiBpdHMgZmllbGRzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBDR0VOX0lGTEQgKmlmbGQ7CisjZGVmaW5lIENHRU5fSUZNVF9JRkxEX0lGTEQoaWkpICgoaWkpLT5pZmxkKQorfSBDR0VOX0lGTVRfSUZMRDsKKworI2lmbmRlZiBDR0VOX01BWF9JRk1UX09QRVJBTkRTCisjZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgMQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIExlbmd0aCB0aGF0IE1BU0sgYW5kIFZBTFVFIGhhdmUgYmVlbiBjYWxjdWxhdGVkIHRvCisgICAgIFtWQUxVRSBpcyByZWNvcmRlZCBlbHNld2hlcmVdLgorICAgICBOb3JtYWxseSBpdCBpcyBiYXNlX2luc25fYml0c2l6ZS4gIE9uIFtWXUxJVyBhcmNoaXRlY3R1cmVzIHdoZXJlIHRoZSBiYXNlCisgICAgIGluc24gc2l6ZSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgYW4gaW5zbiwgdGhpcyBmaWVsZCBpcyBsZXNzIHRoYW4KKyAgICAgYmFzZV9pbnNuX2JpdHNpemUuICAqLworICB1bnNpZ25lZCBjaGFyIG1hc2tfbGVuZ3RoOworI2RlZmluZSBDR0VOX0lGTVRfTUFTS19MRU5HVEgoaWZtdCkgKChpZm10KS0+bWFza19sZW5ndGgpCisKKyAgLyogVG90YWwgbGVuZ3RoIG9mIGluc3RydWN0aW9uLCBpbiBiaXRzLiAgKi8KKyAgdW5zaWduZWQgY2hhciBsZW5ndGg7CisjZGVmaW5lIENHRU5fSUZNVF9MRU5HVEgoaWZtdCkgKChpZm10KS0+bGVuZ3RoKQorCisgIC8qIE1hc2sgdG8gYXBwbHkgdG8gdGhlIGZpcnN0IE1BU0tfTEVOR1RIIGJpdHMuCisgICAgIEVhY2ggaW5zbidzIHZhbHVlIGlzIHN0b3JlZCB3aXRoIHRoZSBpbnNuLgorICAgICBUaGUgZmlyc3Qgc3RlcCBpbiByZWNvZ25pemluZyBhbiBpbnNuIGZvciBkaXNhc3NlbWJseSBpcworICAgICAob3Bjb2RlICYgbWFzaykgPT0gdmFsdWUuICAqLworICBDR0VOX0lOU05fSU5UIG1hc2s7CisjZGVmaW5lIENHRU5fSUZNVF9NQVNLKGlmbXQpICgoaWZtdCktPm1hc2spCisKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLgorICAgICArMSBmb3IgdHJhaWxpbmcgTlVMTC4gICovCisgIENHRU5fSUZNVF9JRkxEIGlmbGRzW0NHRU5fTUFYX0lGTVRfT1BFUkFORFMgKyAxXTsKKyNkZWZpbmUgQ0dFTl9JRk1UX0lGTERTKGlmbXQpICgoaWZtdCktPmlmbGRzKQorfSBDR0VOX0lGTVQ7CisKKy8qIEluc3RydWN0aW9uIHZhbHVlcy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIFRoZSBvcGNvZGUgcG9ydGlvbiBvZiB0aGUgYmFzZSBpbnNuLiAgKi8KKyAgQ0dFTl9JTlNOX0lOVCBiYXNlX3ZhbHVlOworCisjaWZkZWYgQ0dFTl9NQVhfRVhUUkFfT1BDT0RFX09QRVJBTkRTCisgIC8qIEV4dHJhIG9wY29kZSB2YWx1ZXMgYmV5b25kIGJhc2VfdmFsdWUuICAqLworICB1bnNpZ25lZCBsb25nIGlmaWVsZF92YWx1ZXNbQ0dFTl9NQVhfRVhUUkFfT1BDT0RFX09QRVJBTkRTXTsKKyNlbmRpZgorfSBDR0VOX0lWQUxVRTsKKworLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLgorICAgVGhpcyBjb250YWlucyB0aGUgc3ludGF4IGFuZCBmb3JtYXQgZGF0YSBvZiBhbiBpbnN0cnVjdGlvbi4gICovCisKKy8qID8/PyBTb21lIHBvcnRzIGFscmVhZHkgaGF2ZSBhbiBvcGNvZGUgdGFibGUgeWV0IHN0aWxsIG5lZWQgdG8gdXNlIHRoZSByZXN0CisgICBvZiB3aGF0IGNnZW5faW5zbiBoYXMuICBQbHVzIGtlZXBpbmcgdGhlIG9wY29kZSBkYXRhIHdpdGggdGhlIG9wZXJhbmQKKyAgIGluc3RhbmNlIGRhdGEgY2FuIGNyZWF0ZSBhIHByZXR0eSBiaWcgZmlsZS4gIFNvIHdlIGtlZXAgdGhlbSBzZXBhcmF0ZWx5LgorICAgTm90IHN1cmUgdGhpcyBpcyBhIGdvb2QgaWRlYSBpbiB0aGUgbG9uZyBydW4uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBJbmRpY2VzIGludG8gcGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlciB0YWJsZXMuICAqLworICBzdHJ1Y3QgY2dlbl9vcGNvZGVfaGFuZGxlciBoYW5kbGVyczsKKyNkZWZpbmUgQ0dFTl9PUENPREVfSEFORExFUlMob3BjKSAoJiAob3BjKS0+aGFuZGxlcnMpCisKKyAgLyogU3ludGF4IHN0cmluZy4gICovCisgIENHRU5fU1lOVEFYIHN5bnRheDsKKyNkZWZpbmUgQ0dFTl9PUENPREVfU1lOVEFYKG9wYykgKCYgKG9wYyktPnN5bnRheCkKKworICAvKiBGb3JtYXQgZW50cnkuICAqLworICBjb25zdCBDR0VOX0lGTVQgKmZvcm1hdDsKKyNkZWZpbmUgQ0dFTl9PUENPREVfRk9STUFUKG9wYykgKChvcGMpLT5mb3JtYXQpCisjZGVmaW5lIENHRU5fT1BDT0RFX01BU0tfQklUU0laRShvcGMpIENHRU5fSUZNVF9NQVNLX0xFTkdUSCAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQorI2RlZmluZSBDR0VOX09QQ09ERV9CSVRTSVpFKG9wYykgQ0dFTl9JRk1UX0xFTkdUSCAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQorI2RlZmluZSBDR0VOX09QQ09ERV9JRkxEUyhvcGMpIENHRU5fSUZNVF9JRkxEUyAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQorCisgIC8qIEluc3RydWN0aW9uIG9wY29kZSB2YWx1ZS4gICovCisgIENHRU5fSVZBTFVFIHZhbHVlOworI2RlZmluZSBDR0VOX09QQ09ERV9WQUxVRShvcGMpICgmIChvcGMpLT52YWx1ZSkKKyNkZWZpbmUgQ0dFTl9PUENPREVfQkFTRV9WQUxVRShvcGMpIChDR0VOX09QQ09ERV9WQUxVRSAob3BjKS0+YmFzZV92YWx1ZSkKKyNkZWZpbmUgQ0dFTl9PUENPREVfQkFTRV9NQVNLKG9wYykgQ0dFTl9JRk1UX01BU0sgKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKK30gQ0dFTl9PUENPREU7CisKKy8qIEluc3RydWN0aW9uIGF0dHJpYnV0ZXMuCisgICBUaGlzIGlzIG1hZGUgYSBwdWJsaXNoZWQgdHlwZSBhcyBhcHBsaWNhdGlvbnMgY2FuIGNhY2hlIGEgcG9pbnRlciB0bworICAgdGhlIGF0dHJpYnV0ZXMgZm9yIHNwZWVkLiAgKi8KKworI2lmbmRlZiBDR0VOX0lOU05fTkJPT0xfQVRUUlMKKyNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIDEKKyNlbmRpZgordHlwZWRlZiBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9JTlNOX05CT09MX0FUVFJTKSBDR0VOX0lOU05fQVRUUl9UWVBFOworCisvKiBFbnVtIG9mIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBhdHRyaWJ1dGVzLiAgKi8KKworI2lmbmRlZiBDR0VOX0FSQ0gKKy8qID8/PyBOdW1iZXJzIGhlcmUgYXJlIHJlY29yZGVkIGluIHR3byBwbGFjZXMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKKyAgQ0dFTl9JTlNOX0FMSUFTID0gMAorfSBDR0VOX0lOU05fQVRUUjsKKyNlbmRpZgorCisvKiBUaGlzIHN0cnVjdCBkZWZpbmVzIGVhY2ggZW50cnkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogRWFjaCByZWFsIGluc3RydWN0aW9uIGlzIGVudW1lcmF0ZWQuICAqLworICAvKiA/Pz8gVGhpcyBtYXkgZ28gYXdheSBpbiB0aW1lLiAgKi8KKyAgaW50IG51bTsKKyNkZWZpbmUgQ0dFTl9JTlNOX05VTShpbnNuKSAoKGluc24pLT5iYXNlLT5udW0pCisKKyAgLyogTmFtZSBvZiBlbnRyeSAodGhhdCBkaXN0aW5ndWlzaGVzIGl0IGZyb20gYWxsIG90aGVyIGVudHJpZXMpLiAgKi8KKyAgLyogPz8/IElmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzLCB0cnkgdG8gcHJpbnQgZnVsbCBtbmVtb25pYy4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisjZGVmaW5lIENHRU5fSU5TTl9OQU1FKGluc24pICgoaW5zbiktPmJhc2UtPm5hbWUpCisKKyAgLyogTW5lbW9uaWMuICBUaGlzIGlzIHVzZWQgd2hlbiBwYXJzaW5nIGFuZCBwcmludGluZyB0aGUgaW5zbi4KKyAgICAgSW4gdGhlIGNhc2Ugb2YgaW5zbnMgdGhhdCBoYXZlIG9wZXJhbmRzIG9uIHRoZSBtbmVtb25pY3MsIHRoaXMgaXMKKyAgICAgb25seSB0aGUgY29uc3RhbnQgcGFydC4gIEUuZy4gZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBvZiBhbiBgYWRkJyBpbnNuLAorICAgICB3aGVyZSB0aGUgZnVsbCBtbmVtb25pYyBpcyBhZGRlcSwgYWRkbmUsIGV0Yy4sIGFuZCB0aGUgY29uZGl0aW9uIGlzCisgICAgIHRyZWF0ZWQgYXMgYW4gb3BlcmFuZCwgdGhpcyBpcyBvbmx5ICJhZGQiLiAgKi8KKyAgY29uc3QgY2hhciAqbW5lbW9uaWM7CisjZGVmaW5lIENHRU5fSU5TTl9NTkVNT05JQyhpbnNuKSAoKGluc24pLT5iYXNlLT5tbmVtb25pYykKKworICAvKiBUb3RhbCBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24sIGluIGJpdHMuICAqLworICBpbnQgYml0c2l6ZTsKKyNkZWZpbmUgQ0dFTl9JTlNOX0JJVFNJWkUoaW5zbikgKChpbnNuKS0+YmFzZS0+Yml0c2l6ZSkKKworI2lmIDAgLyogPz8/IERpc2FibGVkIGZvciBub3cgYXMgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZW1iZWRkZWQgbmV3bGluZXMKKwkgYW5kIHRoZSB0YWJsZSBpcyBhbHJlYWR5IHByZXR0eSBiaWcuICBTaG91bGQgcGVyaGFwcyBiZSBtb3ZlZAorCSB0byBhIGZpbGUgb2YgaXRzIG93bi4gICovCisgIC8qIFNlbWFudGljcywgYXMgUlRMLiAgKi8KKyAgLyogPz8/IFBsYWluIHRleHQgb3IgYnl0ZWNvZGVzPyAgKi8KKyAgLyogPz8/IE5vdGUgdGhhdCB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBjb3VsZCBiZSBjb21wdXRlZCBhdCBydW4tdGltZQorICAgICBpZiB3ZSBwYXJzZSB0aGlzIGFuZCBjYWNoZSB0aGUgcmVzdWx0cy4gIFNvbWV0aGluZyB0byBldmVudHVhbGx5IGRvLiAgKi8KKyAgY29uc3QgY2hhciAqcnR4OworI2RlZmluZSBDR0VOX0lOU05fUlRYKGluc24pICgoaW5zbiktPmJhc2UtPnJ0eCkKKyNlbmRpZgorCisgIC8qIEF0dHJpYnV0ZXMuCisgICAgIFRoaXMgbXVzdCBhcHBlYXIgbGFzdC4gIEl0IGlzIGEgdmFyaWFibGUgc2l6ZWQgYXJyYXkgaW4gdGhhdCBvbmUKKyAgICAgYXJjaGl0ZWN0dXJlIG1heSBoYXZlIDEgbm9uYm9vbCBhdHRyaWJ1dGUgYW5kIGFub3RoZXIgbWF5IGhhdmUgbW9yZS4KKyAgICAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIG5lZWRuJ3QKKyAgICAgY2FyZS4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sCisgICAgIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28KKyAgICAgYXdheSBhbnl3YXkuICAqLworICBDR0VOX0lOU05fQVRUUl9UWVBFIGF0dHJzOworI2RlZmluZSBDR0VOX0lOU05fQVRUUlMoaW5zbikgKCYoaW5zbiktPmJhc2UtPmF0dHJzKQorLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIElOU04uICAqLworI2RlZmluZSBDR0VOX0lOU05fQVRUUl9WQUxVRShpbnNuLCBhdHRyKSBcCitDR0VOX0FUVFJfVkFMVUUgKChpbnNuKSwgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgKGF0dHIpKQorfSBDR0VOX0lCQVNFOworCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyB0aGUgImludmFsaWQiIGluc24gbWFya2VyLiAgKi8KKworI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRF9QKGluc24pIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pID09IDApCisKKy8qIE1haW4gc3RydWN0IGNvbnRhaW4gaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24uCisgICBCQVNFIGlzIGFsd2F5cyBwcmVzZW50LCB0aGUgcmVzdCBpcyBwcmVzZW50IG9ubHkgaWYgYXNrZWQgZm9yLiAgKi8KKworc3RydWN0IGNnZW5faW5zbgoreworICAvKiA/Pz8gTWF5IGJlIG9mIHVzZSB0byBwdXQgYSB0eXBlIGluZGljYXRvciBoZXJlLgorICAgICBUaGVuIHRoaXMgc3RydWN0IGNvdWxkIGRpZmZlcmVudCBpbmZvIGZvciBkaWZmZXJlbnQgY2xhc3NlcyBvZiBpbnNucy4gICovCisgIC8qID8/PyBBIHNwZWVkdXAgY2FuIGJlIGhhZCBieSBtb3ZpbmcgYGJhc2UnIGludG8gdGhpcyBzdHJ1Y3QuCisgICAgIE1heWJlIGxhdGVyLiAgKi8KKyAgY29uc3QgQ0dFTl9JQkFTRSAqYmFzZTsKKyAgY29uc3QgQ0dFTl9PUENPREUgKm9wY29kZTsKKyAgY29uc3QgQ0dFTl9PUElOU1QgKm9waW5zdDsKK307CisKKy8qIEluc3RydWN0aW9uIGxpc3RzLgorICAgVGhpcyBpcyB1c2VkIGZvciBhZGRpbmcgbmV3IGVudHJpZXMgYW5kIGZvciBjcmVhdGluZyB0aGUgaGFzaCBsaXN0cy4gICovCisKK3R5cGVkZWYgc3RydWN0IGNnZW5faW5zbl9saXN0Cit7CisgIHN0cnVjdCBjZ2VuX2luc25fbGlzdCAqbmV4dDsKKyAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworfSBDR0VOX0lOU05fTElTVDsKKworLyogVGFibGUgb2YgaW5zdHJ1Y3Rpb25zLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgQ0dFTl9JTlNOICppbml0X2VudHJpZXM7CisgIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLworICB1bnNpZ25lZCBpbnQgbnVtX2luaXRfZW50cmllczsKKyAgQ0dFTl9JTlNOX0xJU1QgKm5ld19lbnRyaWVzOworfSBDR0VOX0lOU05fVEFCTEU7CisKKy8qIFJldHVybiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpbmNsdWRlcyBhbnkgYWRkZWQgYXQgcnVuLXRpbWUuICAqLworCitleHRlcm4gaW50IGNnZW5faW5zbl9jb3VudCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7CitleHRlcm4gaW50IGNnZW5fbWFjcm9faW5zbl9jb3VudCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7CisKKy8qIE1hY3JvcyB0byBhY2Nlc3MgdGhlIG90aGVyIGluc24gZWxlbWVudHMgbm90IHJlY29yZGVkIGluIENHRU5fSUJBU0UuICAqLworCisvKiBGZXRjaCBJTlNOJ3Mgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4gICovCisvKiA/Pz8gRG9lc24ndCBoYW5kbGUgaW5zbnMgYWRkZWQgYXQgcnVudGltZS4gICovCisjZGVmaW5lIENHRU5fSU5TTl9PUEVSQU5EUyhpbnNuKSAoKGluc24pLT5vcGluc3QpCisKKy8qIFJldHVybiBJTlNOJ3Mgb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX09QQ09ERShpbnNuKSAoKGluc24pLT5vcGNvZGUpCisKKy8qIFJldHVybiBJTlNOJ3MgaGFuZGxlciBkYXRhLiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX0hBTkRMRVJTKGluc24pIENHRU5fT1BDT0RFX0hBTkRMRVJTIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKKworLyogUmV0dXJuIElOU04ncyBzeW50YXguICAqLworI2RlZmluZSBDR0VOX0lOU05fU1lOVEFYKGluc24pIENHRU5fT1BDT0RFX1NZTlRBWCAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCisKKy8qIFJldHVybiBzaXplIG9mIGJhc2UgbWFzayBpbiBiaXRzLiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX01BU0tfQklUU0laRShpbnNuKSBcCisgIENHRU5fT1BDT0RFX01BU0tfQklUU0laRSAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCisKKy8qIFJldHVybiBtYXNrIG9mIGJhc2UgcGFydCBvZiBJTlNOLiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX0JBU0VfTUFTSyhpbnNuKSBcCisgIENHRU5fT1BDT0RFX0JBU0VfTUFTSyAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCisKKy8qIFJldHVybiB2YWx1ZSBvZiBiYXNlIHBhcnQgb2YgSU5TTi4gICovCisjZGVmaW5lIENHRU5fSU5TTl9CQVNFX1ZBTFVFKGluc24pIFwKKyAgQ0dFTl9PUENPREVfQkFTRV9WQUxVRSAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCisMCisvKiBNYWNybyBpbnN0cnVjdGlvbnMuCisgICBNYWNybyBpbnNucyBhcmVuJ3QgcmVhbCBpbnNucywgdGhleSBtYXAgdG8gb25lIG9yIG1vcmUgcmVhbCBpbnNucy4KKyAgIEUuZy4gQW4gYXJjaGl0ZWN0dXJlJ3MgIm5vcCIgaW5zbiBtYXkgYWN0dWFsbHkgYmUgYW4gIm12IHIwLHIwIiBvcgorICAgc29tZSBzdWNoLgorCisgICBNYWNybyBpbnNucyBjYW4gZXhwYW5kIHRvIG5vdGhpbmcgKGUuZy4gYSBub3AgdGhhdCBpcyBvcHRpbWl6ZWQgYXdheSkuCisgICBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS1pbnNuIG1hY3JvcyB0aGF0IGJ1aWxkIGEgY29uc3RhbnQgaW4gYSByZWdpc3Rlci4KKyAgIE9mIGNvdXJzZSB0aGlzIGlzbid0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCisKKyAgIEFzc2VtYmx5IG9mIG1hY3JvLWluc25zIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLiAgRGlzYXNzZW1ibHkgaXNuJ3QuCisgICBIb3dldmVyLCBkaXNhc3NlbWJseSBvZiBhdCBsZWFzdCBzb21lIGtpbmRzIG9mIG1hY3JvIGluc25zIGlzIGltcG9ydGFudAorICAgaW4gb3JkZXIgdGhhdCB0aGUgZGlzYXNzZW1ibGVkIGNvZGUgcHJlc2VydmUgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBvcmlnaW5hbAorICAgaW5zbi4gIFdoYXQgaXMgYXR0ZW1wdGVkIGhlcmUgaXMgdG8gZGlzYXNzZW1ibGUgYWxsICJzaW1wbGUiIG1hY3JvLWluc25zLAorICAgd2hlcmUgInNpbXBsZSIgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gbWVhbiAiZXhwYW5kcyB0byBvbmUgcmVhbCBpbnNuIi4KKworICAgU2ltcGxlIG1hY3JvLWluc25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoZXkgYXJlIGVtaXR0ZWQgYXMgQUxJQVMncworICAgb2YgcmVhbCBpbnNucy4gIFRoaXMgc2ltcGxpZmllcyB0aGVpciBoYW5kbGluZyBzaW5jZSB0aGVyZSdzIHVzdWFsbHkgbW9yZQorICAgb2YgdGhlbSB0aGFuIGFueSBvdGhlciBraW5kIG9mIG1hY3JvLWluc24sIGFuZCBwcm9wZXIgZGlzYXNzZW1ibHkgb2YgdGhlbQorICAgZmFsbHMgb3V0IGZvciBmcmVlLiAgKi8KKworLyogRm9yIGVhY2ggbWFjcm8taW5zbiB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMsCisgICBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50cy4gIFRoaXMgc3RydWN0dXJlIGlzIGFjY2Vzc2VkIHZpYSB0aGUgYGRhdGEnCisgICBtZW1iZXIgb2YgQ0dFTl9JTlNOLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24geworICAvKiBGdW5jdGlvbiB0byBkbyB0aGUgZXhwYW5zaW9uLgorICAgICBJZiB0aGUgZXhwYW5zaW9uIGZhaWxzIChlLmcuICJubyBtYXRjaCIpIE5VTEwgaXMgcmV0dXJuZWQuCisgICAgIFNwYWNlIGZvciB0aGUgZXhwYW5zaW9uIGlzIG9idGFpbmVkIHdpdGggbWFsbG9jLgorICAgICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgaXQuICAqLworICBjb25zdCBjaGFyICogKCogZm4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiAqLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgaW50ICosCisJCQkgICAgICAgQ0dFTl9PUEVSQU5EICoqKSk7CisjZGVmaW5lIENHRU5fTUlFWFBOX0ZOKGV4KSAoKGV4KS0+Zm4pCisKKyAgLyogSW5zdHJ1Y3Rpb24ocykgdGhlIG1hY3JvIGV4cGFuZHMgdG8uCisgICAgIFRoZSBmb3JtYXQgb2YgU1RSIGlzIGRlZmluZWQgYnkgRk4uCisgICAgIEl0IGlzIHR5cGljYWxseSB0aGUgYXNzZW1ibHkgY29kZSBvZiB0aGUgcmVhbCBpbnNuLCBidXQgaXQgY291bGQgYWxzbyBiZQorICAgICB0aGUgb3JpZ2luYWwgU2NoZW1lIGV4cHJlc3Npb24gb3IgYSB0b2tlbml6ZWQgZm9ybSBvZiBpdCAod2l0aCBGTiBiZWluZworICAgICBhbiBhcHByb3ByaWF0ZSBpbnRlcnByZXRlcikuICAqLworICBjb25zdCBjaGFyICogc3RyOworI2RlZmluZSBDR0VOX01JRVhQTl9TVFIoZXgpICgoZXgpLT5zdHIpCit9IENHRU5fTUlOU05fRVhQQU5TSU9OOworCisvKiBOb3JtYWwgZXhwYW5kZXIuCisgICBXaGVuIHN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IHN0cmluZyB0byBhbm90aGVyCisgICBzdHJpbmcgYW5kIHRoZSBwYXJzZXIgd2lsbCBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5LiAgVGhlIG91dHB1dCBzdHJpbmcKKyAgIG1heSBjb250YWluIGZ1cnRoZXIgbWFjcm8gaW52b2NhdGlvbnMuICAqLworCitleHRlcm4gY29uc3QgY2hhciAqIGNnZW5fZXhwYW5kX21hY3JvX2luc24KKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCisJICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwgQ0dFTl9PUEVSQU5EICoqKSk7CisMCisvKiBUaGUgYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgdGhlIG1uZW1vbmljCisgICAodGhlIGFjdHVhbGx5IGhhc2hpbmcgZG9uZSBpcyB1cCB0byB0aGUgdGFyZ2V0LCBidXQgd2UgcHJvdmlkZSBhIGZldworICAgZXhhbXBsZXMgbGlrZSB0aGUgZmlyc3QgbGV0dGVyIG9yIGEgZnVuY3Rpb24gb2YgdGhlIGVudGlyZSBtbmVtb25pYykuICAqLworCitleHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2FzbV9sb29rdXBfaW5zbgorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKKyNkZWZpbmUgQ0dFTl9BU01fTE9PS1VQX0lOU04oY2QsIHN0cmluZykgY2dlbl9hc21fbG9va3VwX2luc24gKChjZCksIChzdHJpbmcpKQorI2RlZmluZSBDR0VOX0FTTV9ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKKworLyogVGhlIGRpc2Fzc2VtYmxlciBpbnNuIHRhYmxlIGlzIGhhc2hlZCBiYXNlZCBvbiBzb21lIGZ1bmN0aW9uIG9mIG1hY2hpbmUKKyAgIGluc3RydWN0aW9uICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQpLiAgKi8KKworZXh0ZXJuIENHRU5fSU5TTl9MSVNUICogY2dlbl9kaXNfbG9va3VwX2luc24KKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7CisvKiBGSVhNRTogZGVsZXRlIHRoZXNlIHR3byAqLworI2RlZmluZSBDR0VOX0RJU19MT09LVVBfSU5TTihjZCwgYnVmLCB2YWx1ZSkgY2dlbl9kaXNfbG9va3VwX2luc24gKChjZCksIChidWYpLCAodmFsdWUpKQorI2RlZmluZSBDR0VOX0RJU19ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKKwwKKy8qIFRoZSBDUFUgZGVzY3JpcHRpb24uCisgICBBIGNvcHkgb2YgdGhpcyBpcyBjcmVhdGVkIHdoZW4gdGhlIGNwdSB0YWJsZSBpcyAib3BlbmVkIi4KKyAgIEFsbCBnbG9iYWwgc3RhdGUgaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgaGVyZS4KKyAgIEFjY2VzcyBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciAicHVibGljIiBtZW1iZXJzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYworeworICAvKiBCaXRtYXAgb2Ygc2VsZWN0ZWQgbWFjaGluZShzKSAoYSBsYSBCRkQgbWFjaGluZSBudW1iZXIpLiAgKi8KKyAgaW50IG1hY2hzOworCisgIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBpc2EocykuCisgICAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCisgICAgIHByZWNsdWRlZC4gICovCisgIGludCBpc2FzOworCisgIC8qIEN1cnJlbnQgZW5kaWFuLiAgKi8KKyAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47CisjZGVmaW5lIENHRU5fQ1BVX0VORElBTihjZCkgKChjZCktPmVuZGlhbikKKworICAvKiBDdXJyZW50IGluc24gZW5kaWFuLiAgKi8KKyAgZW51bSBjZ2VuX2VuZGlhbiBpbnNuX2VuZGlhbjsKKyNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9FTkRJQU4oY2QpICgoY2QpLT5pbnNuX2VuZGlhbikKKworICAvKiBXb3JkIHNpemUgKGluIGJpdHMpLiAgKi8KKyAgLyogPz8/IE9yIG1heWJlIG1heGltdW0gd29yZCBzaXplIC0gbWlnaHQgd2UgZXZlciBuZWVkIHRvIGFsbG93IGEgY3B1IHRhYmxlCisgICAgIHRvIGJlIG9wZW5lZCBmb3IgYm90aCBzcGFyYzMyL3NwYXJjNjQ/CisgICAgID8/PyBBbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGNyZWF0ZSBhIHRhYmxlIG9mIHNlbGVjdGVkIG1hY2hzIGFuZAorICAgICBsYXppbHkgZmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGVyZS4gICovCisgIHVuc2lnbmVkIGludCB3b3JkX2JpdHNpemU7CisKKyAgLyogSW5kaWNhdG9yIGlmIHNpemVzIGFyZSB1bmtub3duLgorICAgICBUaGlzIGlzIHVzZWQgYnkgZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuX2JpdHNpemUgaWYgdGhlcmUgaXMgYQorICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlbGVjdGVkIGlzYSdzLiAgKi8KKyNkZWZpbmUgQ0dFTl9TSVpFX1VOS05PV04gNjU1MzUKKworICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgorICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KKyAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOworCisgIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCisgICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KKyAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCisgIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKKworICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLworICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKKyAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7CisKKyAgLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KKyAgY29uc3QgQ0dFTl9JU0EgKmlzYV90YWJsZTsKKworICAvKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KKyAgY29uc3QgQ0dFTl9NQUNIICptYWNoX3RhYmxlOworCisgIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KKyAgQ0dFTl9IV19UQUJMRSBod190YWJsZTsKKworICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLworICBjb25zdCBDR0VOX0lGTEQgKmlmbGRfdGFibGU7CisKKyAgLyogT3BlcmFuZHMuICAqLworICBDR0VOX09QRVJBTkRfVEFCTEUgb3BlcmFuZF90YWJsZTsKKworICAvKiBNYWluIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KKyAgQ0dFTl9JTlNOX1RBQkxFIGluc25fdGFibGU7CisjZGVmaW5lIENHRU5fQ1BVX0lOU05fVEFCTEUoY2QpICgmIChjZCktPmluc25fdGFibGUpCisKKyAgLyogTWFjcm8gaW5zdHJ1Y3Rpb25zIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgYW5kIGFyZSBjb21iaW5lZCB3aXRoIHJlYWwKKyAgICAgaW5zbnMgZHVyaW5nIGhhc2ggdGFibGUgY29tcHV0YXRpb24uICAqLworICBDR0VOX0lOU05fVEFCTEUgbWFjcm9faW5zbl90YWJsZTsKKworICAvKiBDb3B5IG9mIENHRU5fSU5UX0lOU05fUC4gICovCisgIGludCBpbnRfaW5zbl9wOworCisgIC8qIENhbGxlZCB0byByZWJ1aWxkIHRoZSB0YWJsZXMgYWZ0ZXIgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLiAgKi8KKyAgdm9pZCAoKnJlYnVpbGRfdGFibGVzKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7CisKKyAgLyogT3BlcmFuZCBwYXJzZXIgY2FsbGJhY2suICAqLworICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gKiBwYXJzZV9vcGVyYW5kX2ZuOworCisgIC8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGNvdmVyIGZucyBmb3Igb3BlcmFuZHMuICAqLworICBjb25zdCBjaGFyICogKCpwYXJzZV9vcGVyYW5kKQorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IGNoYXIgKiosCisJICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKKyNpZmRlZiBCRkRfVkVSU0lPTgorICBjb25zdCBjaGFyICogKCppbnNlcnRfb3BlcmFuZCkKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywKKwkgICAgICBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hIHBjXykpOworICBpbnQgKCpleHRyYWN0X29wZXJhbmQpCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKKwkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKKyAgdm9pZCAoKnByaW50X29wZXJhbmQpCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgUFRSIGluZm9fLCBDR0VOX0ZJRUxEUyAqIGZpZWxkc18sCisJICAgICAgdm9pZCBjb25zdCAqYXR0cnNfLCBiZmRfdm1hIHBjXywgaW50IGxlbmd0aF8pKTsKKyNlbHNlCisgIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKSAoKTsKKyAgaW50ICgqZXh0cmFjdF9vcGVyYW5kKSAoKTsKKyAgdm9pZCAoKnByaW50X29wZXJhbmQpICgpOworI2VuZGlmCisjZGVmaW5lIENHRU5fQ1BVX1BBUlNFX09QRVJBTkQoY2QpICgoY2QpLT5wYXJzZV9vcGVyYW5kKQorI2RlZmluZSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORChjZCkgKChjZCktPmluc2VydF9vcGVyYW5kKQorI2RlZmluZSBDR0VOX0NQVV9FWFRSQUNUX09QRVJBTkQoY2QpICgoY2QpLT5leHRyYWN0X29wZXJhbmQpCisjZGVmaW5lIENHRU5fQ1BVX1BSSU5UX09QRVJBTkQoY2QpICgoY2QpLT5wcmludF9vcGVyYW5kKQorCisgIC8qIFNpemUgb2YgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KKyAgdW5zaWduZWQgaW50IHNpemVvZl9maWVsZHM7CisjZGVmaW5lIENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMoY2QpICgoY2QpLT5zaXplb2ZfZmllbGRzKQorCisgIC8qIFNldCB0aGUgYml0c2l6ZSBmaWVsZC4gICovCisgIHZvaWQgKCpzZXRfZmllbGRzX2JpdHNpemUpIFBBUkFNUyAoKENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgc2l6ZV8pKTsKKyNkZWZpbmUgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFKGNkKSAoKGNkKS0+c2V0X2ZpZWxkc19iaXRzaXplKQorCisgIC8qIENHRU5fRklFTERTIGFjY2Vzc29ycy4gICovCisgIGludCAoKmdldF9pbnRfb3BlcmFuZCkKKyAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7CisgIHZvaWQgKCpzZXRfaW50X29wZXJhbmQpCisgICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IHZhbHVlXykpOworI2lmZGVmIEJGRF9WRVJTSU9OCisgIGJmZF92bWEgKCpnZXRfdm1hX29wZXJhbmQpCisgICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOworICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKQorICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgdmFsdWVfKSk7CisjZWxzZQorICBsb25nICgqZ2V0X3ZtYV9vcGVyYW5kKSAoKTsKKyAgdm9pZCAoKnNldF92bWFfb3BlcmFuZCkgKCk7CisjZW5kaWYKKyNkZWZpbmUgQ0dFTl9DUFVfR0VUX0lOVF9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X2ludF9vcGVyYW5kKQorI2RlZmluZSBDR0VOX0NQVV9TRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfaW50X29wZXJhbmQpCisjZGVmaW5lIENHRU5fQ1BVX0dFVF9WTUFfT1BFUkFORChjZCkgKChjZCktPmdldF92bWFfb3BlcmFuZCkKKyNkZWZpbmUgQ0dFTl9DUFVfU0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+c2V0X3ZtYV9vcGVyYW5kKQorCisgIC8qIEluc3RydWN0aW9uIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLiAgKi8KKyAgLyogRklYTUU6IG1ha2UgdGhlc2UgdHlwZXMgdXBwZXJjYXNlLiAgKi8KKyAgY2dlbl9wYXJzZV9mbiAqIGNvbnN0ICpwYXJzZV9oYW5kbGVyczsKKyAgY2dlbl9pbnNlcnRfZm4gKiBjb25zdCAqaW5zZXJ0X2hhbmRsZXJzOworICBjZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCAqZXh0cmFjdF9oYW5kbGVyczsKKyAgY2dlbl9wcmludF9mbiAqIGNvbnN0ICpwcmludF9oYW5kbGVyczsKKyNkZWZpbmUgQ0dFTl9QQVJTRV9GTihjZCwgaW5zbikgICAoY2QtPnBhcnNlX2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wYXJzZV0pCisjZGVmaW5lIENHRU5fSU5TRVJUX0ZOKGNkLCBpbnNuKSAgKGNkLT5pbnNlcnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmluc2VydF0pCisjZGVmaW5lIENHRU5fRVhUUkFDVF9GTihjZCwgaW5zbikgKGNkLT5leHRyYWN0X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5leHRyYWN0XSkKKyNkZWZpbmUgQ0dFTl9QUklOVF9GTihjZCwgaW5zbikgICAoY2QtPnByaW50X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wcmludF0pCisKKyAgLyogUmV0dXJuIG5vbi16ZXJvIGlmIGluc24gc2hvdWxkIGJlIGFkZGVkIHRvIGhhc2ggdGFibGUuICAqLworICBpbnQgKCogYXNtX2hhc2hfcCkgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKKworICAvKiBBc3NlbWJsZXIgaGFzaCBmdW5jdGlvbi4gICovCisgIHVuc2lnbmVkIGludCAoKiBhc21faGFzaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYXNzZW1ibGVyIGhhc2ggdGFibGUuICAqLworICB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfc2l6ZTsKKworICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCisgIGludCAoKiBkaXNfaGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOworCisgIC8qIERpc2Fzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KKyAgdW5zaWduZWQgaW50ICgqIGRpc19oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKKworICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBkaXNhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCisgIHVuc2lnbmVkIGludCBkaXNfaGFzaF9zaXplOworCisgIC8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KKyAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKKyAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7CisKKyAgLyogRGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLworICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOworICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKK30gQ0dFTl9DUFVfVEFCTEU7CisKKy8qIHdpcCAqLworI2lmbmRlZiBDR0VOX1dPUkRfRU5ESUFOCisjZGVmaW5lIENHRU5fV09SRF9FTkRJQU4oY2QpIENHRU5fQ1BVX0VORElBTiAoY2QpCisjZW5kaWYKKyNpZm5kZWYgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOCisjZGVmaW5lIENHRU5fSU5TTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKQorI2VuZGlmCisMCisvKiBQcm90b3R5cGVzIG9mIG1ham9yIGZ1bmN0aW9ucy4gICovCisvKiBGSVhNRTogTW92ZSBtb3JlIENHRU5fU1lNLWRlZmluZWQgZnVuY3Rpb25zIGludG8gQ0dFTl9DUFVfREVTQy4KKyAgIE5vdCB0aGUgaW5pdCBmbnMgdGhvdWdoLCBhcyB0aGF0IHdvdWxkIGRyYWcgaW4gdGhpbmdzIHRoYXQgbWlnaHRuJ3QgYmUKKyAgIHVzZWQgYW5kIG1pZ2h0IG5vdCBldmVuIGV4aXN0LiAgKi8KKworLyogQXJndW1lbnQgdHlwZXMgdG8gY3B1X29wZW4uICAqLworCitlbnVtIGNnZW5fY3B1X29wZW5fYXJnIHsKKyAgQ0dFTl9DUFVfT1BFTl9FTkQsCisgIC8qIFNlbGVjdCBpbnN0cnVjdGlvbiBzZXQocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLworICBDR0VOX0NQVV9PUEVOX0lTQVMsCisgIC8qIFNlbGVjdCBtYWNoaW5lKHMpLCBhcmcgaXMgYml0bWFwIG9yIDAgbWVhbmluZyAidW5zcGVjaWZpZWQiLiAgKi8KKyAgQ0dFTl9DUFVfT1BFTl9NQUNIUywKKyAgLyogU2VsZWN0IG1hY2hpbmUsIGFyZyBpcyBtYWNoJ3MgYmZkIG5hbWUuCisgICAgIE11bHRpcGxlIG1hY2hpbmVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgcmVwZWF0ZWQgdXNlLiAgKi8KKyAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNILAorICAvKiBTZWxlY3QgZW5kaWFuLCBhcmcgaXMgQ0dFTl9FTkRJQU5fKi4gICovCisgIENHRU5fQ1BVX09QRU5fRU5ESUFOCit9OworCisvKiBPcGVuIGEgY3B1IGRlc2NyaXB0b3IgdGFibGUgZm9yIHVzZS4KKyAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgorICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQorICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCisKK2V4dGVybiBDR0VOX0NQVV9ERVNDIENHRU5fU1lNIChjcHVfb3BlbikgKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcsIC4uLik7CisKKy8qIENvdmVyIGZuIHRvIGhhbmRsZSBzaW1wbGUgY2FzZS4gICovCisKK2V4dGVybiBDR0VOX0NQVV9ERVNDIENHRU5fU1lNIChjcHVfb3Blbl8xKSBQQVJBTVMgKChjb25zdCBjaGFyICptYWNoX25hbWVfLAorCQkJCQkJICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuXykpOworCisvKiBDbG9zZSBpdC4gICovCisKK2V4dGVybiB2b2lkIENHRU5fU1lNIChjcHVfY2xvc2UpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKKworLyogSW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlIGZvciB1c2UuCisgICBDYWxsZWQgYnkgaW5pdF9hc20vaW5pdF9kaXMuICAqLworCitleHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGNvZGVfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7CisKKy8qIEluaXRpYWxpemUgdGhlIGlibGQgdGFibGUgZm9yIHVzZS4KKyAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCisKK2V4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2libGRfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7CisKKy8qIEluaXRpYWxpemUgYW4gY3B1IHRhYmxlIGZvciBhc3NlbWJsZXIgb3IgZGlzYXNzZW1ibGVyIHVzZS4KKyAgIFRoZXNlIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNwdV9vcGVuLiAgKi8KKworZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfYXNtKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7CitleHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9kaXMpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKKworLyogSW5pdGlhbGl6ZSB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBmb3IgdXNlLiAgKi8KKworZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfb3BpbnN0X3RhYmxlKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDIGNkXykpOworCisvKiBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbi4gICovCisKK2V4dGVybiBjb25zdCBDR0VOX0lOU04gKiBDR0VOX1NZTSAoYXNzZW1ibGVfaW5zbikKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0ZJRUxEUyAqLAorCSAgICAgIENHRU5fSU5TTl9CWVRFU19QVFIsIGNoYXIgKiopKTsKKworZXh0ZXJuIGNvbnN0IENHRU5fS0VZV09SRCBDR0VOX1NZTSAob3BlcmFuZF9tYWNoKTsKK2V4dGVybiBpbnQgQ0dFTl9TWU0gKGdldF9tYWNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworLyogT3BlcmFuZCBpbmRleCBjb21wdXRhdGlvbi4gICovCitleHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfaW5zbgorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiBpbnNuXywKKwkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKKwkgICAgICBpbnQgbGVuZ3RoXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCBhbGlhc19wXykpOworZXh0ZXJuIHZvaWQgY2dlbl9nZXRfaW5zbl9vcGVyYW5kcworICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiBpbnNuXywKKwkgICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50ICppbmRpY2VzXykpOworZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCisJICAgICAgQ0dFTl9JTlNOX0lOVCBpbnRfdmFsdWVfLCB1bnNpZ25lZCBjaGFyICpieXRlc192YWx1ZV8sCisJICAgICAgaW50IGxlbmd0aF8sIGludCAqaW5kaWNlc18sIENHRU5fRklFTERTICpmaWVsZHNfKSk7CisKKy8qIENvdmVyIGZucyB0byBiZmRfZ2V0L3NldC4gICovCisKK2V4dGVybiBDR0VOX0lOU05fSU5UIGNnZW5fZ2V0X2luc25fdmFsdWUKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIGNnZW5fcHV0X2luc25fdmFsdWUKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgdW5zaWduZWQgY2hhciAqLCBpbnQsIENHRU5fSU5TTl9JTlQpKTsKKworLyogUmVhZCBpbiBhIGNwdSBkZXNjcmlwdGlvbiBmaWxlLgorICAgPz8/IEZvciBmdXR1cmUgY29uY2VybnMsIGluY2x1ZGluZyBhZGRpbmcgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBhc3NlbWJsZXIvCisgICBkaXNhc3NlbWJsZXIgYXQgcnVuLXRpbWUuICAqLworCitleHRlcm4gY29uc3QgY2hhciAqIGNnZW5fcmVhZF9jcHVfZmlsZQorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICogZmlsZW5hbWVfKSk7CisKKyNlbmRpZiAvKiBDR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oIGIvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZWViYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oCkBAIC0wLDAgKzEsMTcxMSBAQAorLyogSW5mb3JtYXRpb24gZm9yIGluc3RydWN0aW9uIGRpc2Fzc2VtYmx5IG9uIHRoZSBDb252ZXguCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmCUNPTlNUCisjZGVmaW5lCUNPTlNUCisjZW5kaWYJLyogQ09OU1QgKi8KKworI2RlZmluZSB4eHggMAorI2RlZmluZSBycnIgMQorI2RlZmluZSByciAyCisjZGVmaW5lIHJ4ciAzCisjZGVmaW5lIHIgNAorI2RlZmluZSBub3BzIDUKKyNkZWZpbmUgbnIgNgorI2RlZmluZSBwY3JlbCA3CisjZGVmaW5lIGxyIDgKKyNkZWZpbmUgcnhsIDkKKyNkZWZpbmUgcmxyIDEwCisjZGVmaW5lIHJybCAxMQorI2RlZmluZSBpbWwgMTIKKyNkZWZpbmUgaW1yIDEzCisjZGVmaW5lIGExciAxNAorI2RlZmluZSBhMWwgMTUKKyNkZWZpbmUgYTJyIDE2CisjZGVmaW5lIGEybCAxNworI2RlZmluZSBhMyAxOAorI2RlZmluZSBhNCAxOQorI2RlZmluZSBhNSAyMAorI2RlZmluZSBWIDEKKyNkZWZpbmUgUyAyCisjZGVmaW5lIFZNIDMKKyNkZWZpbmUgQSA0CisjZGVmaW5lIFZMIDUKKyNkZWZpbmUgVlMgNgorI2RlZmluZSBWTFMgNworI2RlZmluZSBQU1cgOAorLyogUHJldmVudCBhbiBlcnJvciBkdXJpbmcgIm1ha2UgZGVwZW5kIi4gICovCisjaWYgIWRlZmluZWQgKFBDKQorI2RlZmluZSBQQyA5CisjZW5kaWYKKyNkZWZpbmUgSVRSIDEwCisjZGVmaW5lIFZWIDExCisjZGVmaW5lIElUU1IgMTIKKyNkZWZpbmUgVE9DIDEzCisjZGVmaW5lIENJUiAxNAorI2RlZmluZSBUVFIgMTUKKyNkZWZpbmUgVk1VIDE2CisjZGVmaW5lIFZNTCAxNworI2RlZmluZSBJQ1IgMTgKKyNkZWZpbmUgVENQVSAxOQorI2RlZmluZSBDUFVJRCAyMAorI2RlZmluZSBUSUQgMjEKKworQ09OU1QgY2hhciAqb3BbXSA9IHsKKyAgIiIsCisgICJ2MFwwdjFcMHYyXDB2M1wwdjRcMHY1XDB2NlwwdjciLAorICAiczBcMHMxXDBzMlwwczNcMHM0XDBzNVwwczZcMHM3IiwKKyAgInZtIiwKKyAgInNwXDBhMVwwYTJcMGEzXDBhNFwwYTVcMGFwXDBmcCIsCisgICJ2bCIsCisgICJ2cyIsCisgICJ2bHMiLAorICAicHN3IiwKKyAgInBjIiwKKyAgIml0ciIsCisgICJ2diIsCisgICJpdHNyIiwKKyAgInRvYyIsCisgICJjaXIiLAorICAidHRyIiwKKyAgInZtdSIsCisgICJ2bWwiLAorICAiaWNyIiwKKyAgInRjcHUiLAorICAiY3B1aWQiLAorICAidGlkIiwKK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDBbXSA9IHsKKyAgezAsMCxycnIsVixTLFN9LAkvKiBtb3YgKi8KKyAgezAsMCxycnIsUyxTLFZ9LAkvKiBtb3YgKi8KKyAgezEsMSxycnIsVixWLFZ9LAkvKiBtZXJnLnQgKi8KKyAgezIsMSxycnIsVixWLFZ9LAkvKiBtYXNrLnQgKi8KKyAgezEsMixycnIsVixTLFZ9LAkvKiBtZXJnLmYgKi8KKyAgezIsMixycnIsVixTLFZ9LAkvKiBtYXNrLmYgKi8KKyAgezEsMSxycnIsVixTLFZ9LAkvKiBtZXJnLnQgKi8KKyAgezIsMSxycnIsVixTLFZ9LAkvKiBtYXNrLnQgKi8KKyAgezMsMyxycnIsVixWLFZ9LAkvKiBtdWwucyAqLworICB7Myw0LHJycixWLFYsVn0sCS8qIG11bC5kICovCisgIHs0LDMscnJyLFYsVixWfSwJLyogZGl2LnMgKi8KKyAgezQsNCxycnIsVixWLFZ9LAkvKiBkaXYuZCAqLworICB7MywzLHJycixWLFMsVn0sCS8qIG11bC5zICovCisgIHszLDQscnJyLFYsUyxWfSwJLyogbXVsLmQgKi8KKyAgezQsMyxycnIsVixTLFZ9LAkvKiBkaXYucyAqLworICB7NCw0LHJycixWLFMsVn0sCS8qIGRpdi5kICovCisgIHs1LDAscnJyLFYsVixWfSwJLyogYW5kICovCisgIHs2LDAscnJyLFYsVixWfSwJLyogb3IgKi8KKyAgezcsMCxycnIsVixWLFZ9LAkvKiB4b3IgKi8KKyAgezgsMCxycnIsVixWLFZ9LAkvKiBzaGYgKi8KKyAgezUsMCxycnIsVixTLFZ9LAkvKiBhbmQgKi8KKyAgezYsMCxycnIsVixTLFZ9LAkvKiBvciAqLworICB7NywwLHJycixWLFMsVn0sCS8qIHhvciAqLworICB7OCwwLHJycixWLFMsVn0sCS8qIHNoZiAqLworICB7OSwzLHJycixWLFYsVn0sCS8qIGFkZC5zICovCisgIHs5LDQscnJyLFYsVixWfSwJLyogYWRkLmQgKi8KKyAgezEwLDMscnJyLFYsVixWfSwJLyogc3ViLnMgKi8KKyAgezEwLDQscnJyLFYsVixWfSwJLyogc3ViLmQgKi8KKyAgezksMyxycnIsVixTLFZ9LAkvKiBhZGQucyAqLworICB7OSw0LHJycixWLFMsVn0sCS8qIGFkZC5kICovCisgIHsxMCwzLHJycixWLFMsVn0sCS8qIHN1Yi5zICovCisgIHsxMCw0LHJycixWLFMsVn0sCS8qIHN1Yi5kICovCisgIHs5LDUscnJyLFYsVixWfSwJLyogYWRkLmIgKi8KKyAgezksNixycnIsVixWLFZ9LAkvKiBhZGQuaCAqLworICB7OSw3LHJycixWLFYsVn0sCS8qIGFkZC53ICovCisgIHs5LDgscnJyLFYsVixWfSwJLyogYWRkLmwgKi8KKyAgezksNSxycnIsVixTLFZ9LAkvKiBhZGQuYiAqLworICB7OSw2LHJycixWLFMsVn0sCS8qIGFkZC5oICovCisgIHs5LDcscnJyLFYsUyxWfSwJLyogYWRkLncgKi8KKyAgezksOCxycnIsVixTLFZ9LAkvKiBhZGQubCAqLworICB7MTAsNSxycnIsVixWLFZ9LAkvKiBzdWIuYiAqLworICB7MTAsNixycnIsVixWLFZ9LAkvKiBzdWIuaCAqLworICB7MTAsNyxycnIsVixWLFZ9LAkvKiBzdWIudyAqLworICB7MTAsOCxycnIsVixWLFZ9LAkvKiBzdWIubCAqLworICB7MTAsNSxycnIsVixTLFZ9LAkvKiBzdWIuYiAqLworICB7MTAsNixycnIsVixTLFZ9LAkvKiBzdWIuaCAqLworICB7MTAsNyxycnIsVixTLFZ9LAkvKiBzdWIudyAqLworICB7MTAsOCxycnIsVixTLFZ9LAkvKiBzdWIubCAqLworICB7Myw1LHJycixWLFYsVn0sCS8qIG11bC5iICovCisgIHszLDYscnJyLFYsVixWfSwJLyogbXVsLmggKi8KKyAgezMsNyxycnIsVixWLFZ9LAkvKiBtdWwudyAqLworICB7Myw4LHJycixWLFYsVn0sCS8qIG11bC5sICovCisgIHszLDUscnJyLFYsUyxWfSwJLyogbXVsLmIgKi8KKyAgezMsNixycnIsVixTLFZ9LAkvKiBtdWwuaCAqLworICB7Myw3LHJycixWLFMsVn0sCS8qIG11bC53ICovCisgIHszLDgscnJyLFYsUyxWfSwJLyogbXVsLmwgKi8KKyAgezQsNSxycnIsVixWLFZ9LAkvKiBkaXYuYiAqLworICB7NCw2LHJycixWLFYsVn0sCS8qIGRpdi5oICovCisgIHs0LDcscnJyLFYsVixWfSwJLyogZGl2LncgKi8KKyAgezQsOCxycnIsVixWLFZ9LAkvKiBkaXYubCAqLworICB7NCw1LHJycixWLFMsVn0sCS8qIGRpdi5iICovCisgIHs0LDYscnJyLFYsUyxWfSwJLyogZGl2LmggKi8KKyAgezQsNyxycnIsVixTLFZ9LAkvKiBkaXYudyAqLworICB7NCw4LHJycixWLFMsVn0sCS8qIGRpdi5sICovCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxW10gPSB7CisgIHsxMSwwLHh4eCwwLDAsMH0sCS8qIGV4aXQgKi8KKyAgezEyLDAsYTMsMCwwLDB9LAkvKiBqbXAgKi8KKyAgezEzLDIsYTMsMCwwLDB9LAkvKiBqbXBpLmYgKi8KKyAgezEzLDEsYTMsMCwwLDB9LAkvKiBqbXBpLnQgKi8KKyAgezE0LDIsYTMsMCwwLDB9LAkvKiBqbXBhLmYgKi8KKyAgezE0LDEsYTMsMCwwLDB9LAkvKiBqbXBhLnQgKi8KKyAgezE1LDIsYTMsMCwwLDB9LAkvKiBqbXBzLmYgKi8KKyAgezE1LDEsYTMsMCwwLDB9LAkvKiBqbXBzLnQgKi8KKyAgezE2LDAsYTMsMCwwLDB9LAkvKiB0YWMgKi8KKyAgezE3LDAsYTFyLEEsMCwwfSwJLyogbGRlYSAqLworICB7MTgsOCxhMWwsVkxTLDAsMH0sCS8qIGxkLmwgKi8KKyAgezE4LDksYTFsLFZNLDAsMH0sCS8qIGxkLnggKi8KKyAgezE5LDAsYTMsMCwwLDB9LAkvKiB0YXMgKi8KKyAgezIwLDAsYTMsMCwwLDB9LAkvKiBwc2hlYSAqLworICB7MjEsOCxhMmwsVkxTLDAsMH0sCS8qIHN0LmwgKi8KKyAgezIxLDksYTJsLFZNLDAsMH0sCS8qIHN0LnggKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezIyLDAsYTMsMCwwLDB9LAkvKiBjYWxsICovCisgIHsyMywwLGEzLDAsMCwwfSwJLyogY2FsbHMgKi8KKyAgezI0LDAsYTMsMCwwLDB9LAkvKiBjYWxscSAqLworICB7MjUsMCxhMXIsQSwwLDB9LAkvKiBwZm9yayAqLworICB7MjYsNSxhMnIsUywwLDB9LAkvKiBzdGUuYiAqLworICB7MjYsNixhMnIsUywwLDB9LAkvKiBzdGUuaCAqLworICB7MjYsNyxhMnIsUywwLDB9LAkvKiBzdGUudyAqLworICB7MjYsOCxhMnIsUywwLDB9LAkvKiBzdGUubCAqLworICB7MTgsNSxhMXIsQSwwLDB9LAkvKiBsZC5iICovCisgIHsxOCw2LGExcixBLDAsMH0sCS8qIGxkLmggKi8KKyAgezE4LDcsYTFyLEEsMCwwfSwJLyogbGQudyAqLworICB7MjcsNyxhMXIsQSwwLDB9LAkvKiBpbmNyLncgKi8KKyAgezIxLDUsYTJyLEEsMCwwfSwJLyogc3QuYiAqLworICB7MjEsNixhMnIsQSwwLDB9LAkvKiBzdC5oICovCisgIHsyMSw3LGEycixBLDAsMH0sCS8qIHN0LncgKi8KKyAgezI3LDgsYTFyLFMsMCwwfSwJLyogaW5jci5sICovCisgIHsxOCw1LGExcixTLDAsMH0sCS8qIGxkLmIgKi8KKyAgezE4LDYsYTFyLFMsMCwwfSwJLyogbGQuaCAqLworICB7MTgsNyxhMXIsUywwLDB9LAkvKiBsZC53ICovCisgIHsxOCw4LGExcixTLDAsMH0sCS8qIGxkLmwgKi8KKyAgezIxLDUsYTJyLFMsMCwwfSwJLyogc3QuYiAqLworICB7MjEsNixhMnIsUywwLDB9LAkvKiBzdC5oICovCisgIHsyMSw3LGEycixTLDAsMH0sCS8qIHN0LncgKi8KKyAgezIxLDgsYTJyLFMsMCwwfSwJLyogc3QubCAqLworICB7MTgsNSxhMXIsViwwLDB9LAkvKiBsZC5iICovCisgIHsxOCw2LGExcixWLDAsMH0sCS8qIGxkLmggKi8KKyAgezE4LDcsYTFyLFYsMCwwfSwJLyogbGQudyAqLworICB7MTgsOCxhMXIsViwwLDB9LAkvKiBsZC5sICovCisgIHsyMSw1LGEycixWLDAsMH0sCS8qIHN0LmIgKi8KKyAgezIxLDYsYTJyLFYsMCwwfSwJLyogc3QuaCAqLworICB7MjEsNyxhMnIsViwwLDB9LAkvKiBzdC53ICovCisgIHsyMSw4LGEycixWLDAsMH0sCS8qIHN0LmwgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDJbXSA9IHsKKyAgezI4LDUscnIsQSxBLDB9LAkvKiBjdnR3LmIgKi8KKyAgezI4LDYscnIsQSxBLDB9LAkvKiBjdnR3LmggKi8KKyAgezI5LDcscnIsQSxBLDB9LAkvKiBjdnRiLncgKi8KKyAgezMwLDcscnIsQSxBLDB9LAkvKiBjdnRoLncgKi8KKyAgezI4LDUscnIsUyxTLDB9LAkvKiBjdnR3LmIgKi8KKyAgezI4LDYscnIsUyxTLDB9LAkvKiBjdnR3LmggKi8KKyAgezI5LDcscnIsUyxTLDB9LAkvKiBjdnRiLncgKi8KKyAgezMwLDcscnIsUyxTLDB9LAkvKiBjdnRoLncgKi8KKyAgezI4LDMscnIsUyxTLDB9LAkvKiBjdnR3LnMgKi8KKyAgezMxLDcscnIsUyxTLDB9LAkvKiBjdnRzLncgKi8KKyAgezMyLDMscnIsUyxTLDB9LAkvKiBjdnRkLnMgKi8KKyAgezMxLDQscnIsUyxTLDB9LAkvKiBjdnRzLmQgKi8KKyAgezMxLDgscnIsUyxTLDB9LAkvKiBjdnRzLmwgKi8KKyAgezMyLDgscnIsUyxTLDB9LAkvKiBjdnRkLmwgKi8KKyAgezMzLDMscnIsUyxTLDB9LAkvKiBjdnRsLnMgKi8KKyAgezMzLDQscnIsUyxTLDB9LAkvKiBjdnRsLmQgKi8KKyAgezM0LDAscnIsQSxBLDB9LAkvKiBsZHBhICovCisgIHs4LDAsbnIsQSwwLDB9LAkvKiBzaGYgKi8KKyAgezE4LDYsbnIsQSwwLDB9LAkvKiBsZC5oICovCisgIHsxOCw3LG5yLEEsMCwwfSwJLyogbGQudyAqLworICB7MzMsNyxycixTLFMsMH0sCS8qIGN2dGwudyAqLworICB7MjgsOCxycixTLFMsMH0sCS8qIGN2dHcubCAqLworICB7MzUsMSxycixTLFMsMH0sCS8qIHBsYy50ICovCisgIHszNiwwLHJyLFMsUywwfSwJLyogdHpjICovCisgIHszNyw2LHJyLEEsQSwwfSwJLyogZXEuaCAqLworICB7MzcsNyxycixBLEEsMH0sCS8qIGVxLncgKi8KKyAgezM3LDYsbnIsQSwwLDB9LAkvKiBlcS5oICovCisgIHszNyw3LG5yLEEsMCwwfSwJLyogZXEudyAqLworICB7MzcsNSxycixTLFMsMH0sCS8qIGVxLmIgKi8KKyAgezM3LDYscnIsUyxTLDB9LAkvKiBlcS5oICovCisgIHszNyw3LHJyLFMsUywwfSwJLyogZXEudyAqLworICB7MzcsOCxycixTLFMsMH0sCS8qIGVxLmwgKi8KKyAgezM4LDYscnIsQSxBLDB9LAkvKiBsZXUuaCAqLworICB7MzgsNyxycixBLEEsMH0sCS8qIGxldS53ICovCisgIHszOCw2LG5yLEEsMCwwfSwJLyogbGV1LmggKi8KKyAgezM4LDcsbnIsQSwwLDB9LAkvKiBsZXUudyAqLworICB7MzgsNSxycixTLFMsMH0sCS8qIGxldS5iICovCisgIHszOCw2LHJyLFMsUywwfSwJLyogbGV1LmggKi8KKyAgezM4LDcscnIsUyxTLDB9LAkvKiBsZXUudyAqLworICB7MzgsOCxycixTLFMsMH0sCS8qIGxldS5sICovCisgIHszOSw2LHJyLEEsQSwwfSwJLyogbHR1LmggKi8KKyAgezM5LDcscnIsQSxBLDB9LAkvKiBsdHUudyAqLworICB7MzksNixucixBLDAsMH0sCS8qIGx0dS5oICovCisgIHszOSw3LG5yLEEsMCwwfSwJLyogbHR1LncgKi8KKyAgezM5LDUscnIsUyxTLDB9LAkvKiBsdHUuYiAqLworICB7MzksNixycixTLFMsMH0sCS8qIGx0dS5oICovCisgIHszOSw3LHJyLFMsUywwfSwJLyogbHR1LncgKi8KKyAgezM5LDgscnIsUyxTLDB9LAkvKiBsdHUubCAqLworICB7NDAsNixycixBLEEsMH0sCS8qIGxlLmggKi8KKyAgezQwLDcscnIsQSxBLDB9LAkvKiBsZS53ICovCisgIHs0MCw2LG5yLEEsMCwwfSwJLyogbGUuaCAqLworICB7NDAsNyxucixBLDAsMH0sCS8qIGxlLncgKi8KKyAgezQwLDUscnIsUyxTLDB9LAkvKiBsZS5iICovCisgIHs0MCw2LHJyLFMsUywwfSwJLyogbGUuaCAqLworICB7NDAsNyxycixTLFMsMH0sCS8qIGxlLncgKi8KKyAgezQwLDgscnIsUyxTLDB9LAkvKiBsZS5sICovCisgIHs0MSw2LHJyLEEsQSwwfSwJLyogbHQuaCAqLworICB7NDEsNyxycixBLEEsMH0sCS8qIGx0LncgKi8KKyAgezQxLDYsbnIsQSwwLDB9LAkvKiBsdC5oICovCisgIHs0MSw3LG5yLEEsMCwwfSwJLyogbHQudyAqLworICB7NDEsNSxycixTLFMsMH0sCS8qIGx0LmIgKi8KKyAgezQxLDYscnIsUyxTLDB9LAkvKiBsdC5oICovCisgIHs0MSw3LHJyLFMsUywwfSwJLyogbHQudyAqLworICB7NDEsOCxycixTLFMsMH0sCS8qIGx0LmwgKi8KKyAgezksNyxycixTLEEsMH0sCS8qIGFkZC53ICovCisgIHs4LDAscnIsQSxBLDB9LAkvKiBzaGYgKi8KKyAgezAsMCxycixBLEEsMH0sCS8qIG1vdiAqLworICB7MCwwLHJyLFMsQSwwfSwJLyogbW92ICovCisgIHswLDcscnIsUyxTLDB9LAkvKiBtb3YudyAqLworICB7OCwwLHJyLFMsUywwfSwJLyogc2hmICovCisgIHswLDAscnIsUyxTLDB9LAkvKiBtb3YgKi8KKyAgezAsMCxycixBLFMsMH0sCS8qIG1vdiAqLworICB7NSwwLHJyLEEsQSwwfSwJLyogYW5kICovCisgIHs2LDAscnIsQSxBLDB9LAkvKiBvciAqLworICB7NywwLHJyLEEsQSwwfSwJLyogeG9yICovCisgIHs0MiwwLHJyLEEsQSwwfSwJLyogbm90ICovCisgIHs1LDAscnIsUyxTLDB9LAkvKiBhbmQgKi8KKyAgezYsMCxycixTLFMsMH0sCS8qIG9yICovCisgIHs3LDAscnIsUyxTLDB9LAkvKiB4b3IgKi8KKyAgezQyLDAscnIsUyxTLDB9LAkvKiBub3QgKi8KKyAgezQwLDMscnIsUyxTLDB9LAkvKiBsZS5zICovCisgIHs0MCw0LHJyLFMsUywwfSwJLyogbGUuZCAqLworICB7NDEsMyxycixTLFMsMH0sCS8qIGx0LnMgKi8KKyAgezQxLDQscnIsUyxTLDB9LAkvKiBsdC5kICovCisgIHs5LDMscnIsUyxTLDB9LAkvKiBhZGQucyAqLworICB7OSw0LHJyLFMsUywwfSwJLyogYWRkLmQgKi8KKyAgezEwLDMscnIsUyxTLDB9LAkvKiBzdWIucyAqLworICB7MTAsNCxycixTLFMsMH0sCS8qIHN1Yi5kICovCisgIHszNywzLHJyLFMsUywwfSwJLyogZXEucyAqLworICB7MzcsNCxycixTLFMsMH0sCS8qIGVxLmQgKi8KKyAgezQzLDYscnIsQSxBLDB9LAkvKiBuZWcuaCAqLworICB7NDMsNyxycixBLEEsMH0sCS8qIG5lZy53ICovCisgIHszLDMscnIsUyxTLDB9LAkvKiBtdWwucyAqLworICB7Myw0LHJyLFMsUywwfSwJLyogbXVsLmQgKi8KKyAgezQsMyxycixTLFMsMH0sCS8qIGRpdi5zICovCisgIHs0LDQscnIsUyxTLDB9LAkvKiBkaXYuZCAqLworICB7OSw2LHJyLEEsQSwwfSwJLyogYWRkLmggKi8KKyAgezksNyxycixBLEEsMH0sCS8qIGFkZC53ICovCisgIHs5LDYsbnIsQSwwLDB9LAkvKiBhZGQuaCAqLworICB7OSw3LG5yLEEsMCwwfSwJLyogYWRkLncgKi8KKyAgezksNSxycixTLFMsMH0sCS8qIGFkZC5iICovCisgIHs5LDYscnIsUyxTLDB9LAkvKiBhZGQuaCAqLworICB7OSw3LHJyLFMsUywwfSwJLyogYWRkLncgKi8KKyAgezksOCxycixTLFMsMH0sCS8qIGFkZC5sICovCisgIHsxMCw2LHJyLEEsQSwwfSwJLyogc3ViLmggKi8KKyAgezEwLDcscnIsQSxBLDB9LAkvKiBzdWIudyAqLworICB7MTAsNixucixBLDAsMH0sCS8qIHN1Yi5oICovCisgIHsxMCw3LG5yLEEsMCwwfSwJLyogc3ViLncgKi8KKyAgezEwLDUscnIsUyxTLDB9LAkvKiBzdWIuYiAqLworICB7MTAsNixycixTLFMsMH0sCS8qIHN1Yi5oICovCisgIHsxMCw3LHJyLFMsUywwfSwJLyogc3ViLncgKi8KKyAgezEwLDgscnIsUyxTLDB9LAkvKiBzdWIubCAqLworICB7Myw2LHJyLEEsQSwwfSwJLyogbXVsLmggKi8KKyAgezMsNyxycixBLEEsMH0sCS8qIG11bC53ICovCisgIHszLDYsbnIsQSwwLDB9LAkvKiBtdWwuaCAqLworICB7Myw3LG5yLEEsMCwwfSwJLyogbXVsLncgKi8KKyAgezMsNSxycixTLFMsMH0sCS8qIG11bC5iICovCisgIHszLDYscnIsUyxTLDB9LAkvKiBtdWwuaCAqLworICB7Myw3LHJyLFMsUywwfSwJLyogbXVsLncgKi8KKyAgezMsOCxycixTLFMsMH0sCS8qIG11bC5sICovCisgIHs0LDYscnIsQSxBLDB9LAkvKiBkaXYuaCAqLworICB7NCw3LHJyLEEsQSwwfSwJLyogZGl2LncgKi8KKyAgezQsNixucixBLDAsMH0sCS8qIGRpdi5oICovCisgIHs0LDcsbnIsQSwwLDB9LAkvKiBkaXYudyAqLworICB7NCw1LHJyLFMsUywwfSwJLyogZGl2LmIgKi8KKyAgezQsNixycixTLFMsMH0sCS8qIGRpdi5oICovCisgIHs0LDcscnIsUyxTLDB9LAkvKiBkaXYudyAqLworICB7NCw4LHJyLFMsUywwfSwJLyogZGl2LmwgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDNbXSA9IHsKKyAgezMyLDMscnIsVixWLDB9LAkvKiBjdnRkLnMgKi8KKyAgezMxLDQscnIsVixWLDB9LAkvKiBjdnRzLmQgKi8KKyAgezMzLDQscnIsVixWLDB9LAkvKiBjdnRsLmQgKi8KKyAgezMyLDgscnIsVixWLDB9LAkvKiBjdnRkLmwgKi8KKyAgezAsMCxycmwsUyxTLFZNfSwJLyogbW92ICovCisgIHswLDAscmxyLFMsVk0sU30sCS8qIG1vdiAqLworICB7MCwwLDAsMCwwLDB9LAorICB7NDQsMCxycixTLFMsMH0sCS8qIGxvcCAqLworICB7MzYsMCxycixWLFYsMH0sCS8qIHR6YyAqLworICB7NDQsMCxycixWLFYsMH0sCS8qIGxvcCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7NDIsMCxycixWLFYsMH0sCS8qIG5vdCAqLworICB7OCwwLHJyLFMsViwwfSwJLyogc2hmICovCisgIHszNSwxLHJyLFYsViwwfSwJLyogcGxjLnQgKi8KKyAgezQ1LDIscnIsVixWLDB9LAkvKiBjcHJzLmYgKi8KKyAgezQ1LDEscnIsVixWLDB9LAkvKiBjcHJzLnQgKi8KKyAgezM3LDMscnIsVixWLDB9LAkvKiBlcS5zICovCisgIHszNyw0LHJyLFYsViwwfSwJLyogZXEuZCAqLworICB7NDMsMyxycixWLFYsMH0sCS8qIG5lZy5zICovCisgIHs0Myw0LHJyLFYsViwwfSwJLyogbmVnLmQgKi8KKyAgezM3LDMscnIsUyxWLDB9LAkvKiBlcS5zICovCisgIHszNyw0LHJyLFMsViwwfSwJLyogZXEuZCAqLworICB7NDMsMyxycixTLFMsMH0sCS8qIG5lZy5zICovCisgIHs0Myw0LHJyLFMsUywwfSwJLyogbmVnLmQgKi8KKyAgezQwLDMscnIsVixWLDB9LAkvKiBsZS5zICovCisgIHs0MCw0LHJyLFYsViwwfSwJLyogbGUuZCAqLworICB7NDEsMyxycixWLFYsMH0sCS8qIGx0LnMgKi8KKyAgezQxLDQscnIsVixWLDB9LAkvKiBsdC5kICovCisgIHs0MCwzLHJyLFMsViwwfSwJLyogbGUucyAqLworICB7NDAsNCxycixTLFYsMH0sCS8qIGxlLmQgKi8KKyAgezQxLDMscnIsUyxWLDB9LAkvKiBsdC5zICovCisgIHs0MSw0LHJyLFMsViwwfSwJLyogbHQuZCAqLworICB7MzcsNSxycixWLFYsMH0sCS8qIGVxLmIgKi8KKyAgezM3LDYscnIsVixWLDB9LAkvKiBlcS5oICovCisgIHszNyw3LHJyLFYsViwwfSwJLyogZXEudyAqLworICB7MzcsOCxycixWLFYsMH0sCS8qIGVxLmwgKi8KKyAgezM3LDUscnIsUyxWLDB9LAkvKiBlcS5iICovCisgIHszNyw2LHJyLFMsViwwfSwJLyogZXEuaCAqLworICB7MzcsNyxycixTLFYsMH0sCS8qIGVxLncgKi8KKyAgezM3LDgscnIsUyxWLDB9LAkvKiBlcS5sICovCisgIHs0MCw1LHJyLFYsViwwfSwJLyogbGUuYiAqLworICB7NDAsNixycixWLFYsMH0sCS8qIGxlLmggKi8KKyAgezQwLDcscnIsVixWLDB9LAkvKiBsZS53ICovCisgIHs0MCw4LHJyLFYsViwwfSwJLyogbGUubCAqLworICB7NDAsNSxycixTLFYsMH0sCS8qIGxlLmIgKi8KKyAgezQwLDYscnIsUyxWLDB9LAkvKiBsZS5oICovCisgIHs0MCw3LHJyLFMsViwwfSwJLyogbGUudyAqLworICB7NDAsOCxycixTLFYsMH0sCS8qIGxlLmwgKi8KKyAgezQxLDUscnIsVixWLDB9LAkvKiBsdC5iICovCisgIHs0MSw2LHJyLFYsViwwfSwJLyogbHQuaCAqLworICB7NDEsNyxycixWLFYsMH0sCS8qIGx0LncgKi8KKyAgezQxLDgscnIsVixWLDB9LAkvKiBsdC5sICovCisgIHs0MSw1LHJyLFMsViwwfSwJLyogbHQuYiAqLworICB7NDEsNixycixTLFYsMH0sCS8qIGx0LmggKi8KKyAgezQxLDcscnIsUyxWLDB9LAkvKiBsdC53ICovCisgIHs0MSw4LHJyLFMsViwwfSwJLyogbHQubCAqLworICB7NDMsNSxycixWLFYsMH0sCS8qIG5lZy5iICovCisgIHs0Myw2LHJyLFYsViwwfSwJLyogbmVnLmggKi8KKyAgezQzLDcscnIsVixWLDB9LAkvKiBuZWcudyAqLworICB7NDMsOCxycixWLFYsMH0sCS8qIG5lZy5sICovCisgIHs0Myw1LHJyLFMsUywwfSwJLyogbmVnLmIgKi8KKyAgezQzLDYscnIsUyxTLDB9LAkvKiBuZWcuaCAqLworICB7NDMsNyxycixTLFMsMH0sCS8qIG5lZy53ICovCisgIHs0Myw4LHJyLFMsUywwfSwJLyogbmVnLmwgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDRbXSA9IHsKKyAgezQ2LDAsbm9wcywwLDAsMH0sCS8qIG5vcCAqLworICB7NDcsMCxwY3JlbCwwLDAsMH0sCS8qIGJyICovCisgIHs0OCwyLHBjcmVsLDAsMCwwfSwJLyogYnJpLmYgKi8KKyAgezQ4LDEscGNyZWwsMCwwLDB9LAkvKiBicmkudCAqLworICB7NDksMixwY3JlbCwwLDAsMH0sCS8qIGJyYS5mICovCisgIHs0OSwxLHBjcmVsLDAsMCwwfSwJLyogYnJhLnQgKi8KKyAgezUwLDIscGNyZWwsMCwwLDB9LAkvKiBicnMuZiAqLworICB7NTAsMSxwY3JlbCwwLDAsMH0sCS8qIGJycy50ICovCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ1W10gPSB7CisgIHs1MSw1LHJyLFYsViwwfSwJLyogbGR2aS5iICovCisgIHs1MSw2LHJyLFYsViwwfSwJLyogbGR2aS5oICovCisgIHs1MSw3LHJyLFYsViwwfSwJLyogbGR2aS53ICovCisgIHs1MSw4LHJyLFYsViwwfSwJLyogbGR2aS5sICovCisgIHsyOCwzLHJyLFYsViwwfSwJLyogY3Z0dy5zICovCisgIHszMSw3LHJyLFYsViwwfSwJLyogY3Z0cy53ICovCisgIHsyOCw4LHJyLFYsViwwfSwJLyogY3Z0dy5sICovCisgIHszMyw3LHJyLFYsViwwfSwJLyogY3Z0bC53ICovCisgIHs1Miw1LHJ4cixWLFYsMH0sCS8qIHN0dmkuYiAqLworICB7NTIsNixyeHIsVixWLDB9LAkvKiBzdHZpLmggKi8KKyAgezUyLDcscnhyLFYsViwwfSwJLyogc3R2aS53ICovCisgIHs1Miw4LHJ4cixWLFYsMH0sCS8qIHN0dmkubCAqLworICB7NTIsNSxyeHIsUyxWLDB9LAkvKiBzdHZpLmIgKi8KKyAgezUyLDYscnhyLFMsViwwfSwJLyogc3R2aS5oICovCisgIHs1Miw3LHJ4cixTLFYsMH0sCS8qIHN0dmkudyAqLworICB7NTIsOCxyeHIsUyxWLDB9LAkvKiBzdHZpLmwgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDZbXSA9IHsKKyAgezUzLDAscixBLDAsMH0sCS8qIGxkc2RyICovCisgIHs1NCwwLHIsQSwwLDB9LAkvKiBsZGtkciAqLworICB7NTUsMyxyLFMsMCwwfSwJLyogbG4ucyAqLworICB7NTUsNCxyLFMsMCwwfSwJLyogbG4uZCAqLworICB7NTYsMCxub3BzLDAsMCwwfSwJLyogcGF0dSAqLworICB7NTcsMCxyLEEsMCwwfSwJLyogcGF0ZSAqLworICB7NTgsMCxub3BzLDAsMCwwfSwJLyogcGljaCAqLworICB7NTksMCxub3BzLDAsMCwwfSwJLyogcGxjaCAqLworICB7MCwwLGxyLFBTVyxBLDB9LAkvKiBtb3YgKi8KKyAgezAsMCxyeGwsQSxQU1csMH0sCS8qIG1vdiAqLworICB7MCwwLGxyLFBDLEEsMH0sCS8qIG1vdiAqLworICB7NjAsMCxyLFMsMCwwfSwJLyogaWRsZSAqLworICB7MCwwLGxyLElUUixTLDB9LAkvKiBtb3YgKi8KKyAgezAsMCxyeGwsUyxJVFIsMH0sCS8qIG1vdiAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLHJ4bCxTLElUU1IsMH0sCS8qIG1vdiAqLworICB7NjEsMCxub3BzLDAsMCwwfSwJLyogcnRucSAqLworICB7NjIsMCxub3BzLDAsMCwwfSwJLyogY2ZvcmsgKi8KKyAgezYzLDAsbm9wcywwLDAsMH0sCS8qIHJ0biAqLworICB7NjQsMCxub3BzLDAsMCwwfSwJLyogd2ZvcmsgKi8KKyAgezY1LDAsbm9wcywwLDAsMH0sCS8qIGpvaW4gKi8KKyAgezY2LDAsbm9wcywwLDAsMH0sCS8qIHJ0bmMgKi8KKyAgezY3LDMscixTLDAsMH0sCS8qIGV4cC5zICovCisgIHs2Nyw0LHIsUywwLDB9LAkvKiBleHAuZCAqLworICB7NjgsMyxyLFMsMCwwfSwJLyogc2luLnMgKi8KKyAgezY4LDQscixTLDAsMH0sCS8qIHNpbi5kICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHs2OSwzLHIsUywwLDB9LAkvKiBjb3MucyAqLworICB7NjksNCxyLFMsMCwwfSwJLyogY29zLmQgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezcwLDcscixBLDAsMH0sCS8qIHBzaC53ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHs3MSw3LHIsQSwwLDB9LAkvKiBwb3AudyAqLworICB7MCwwLDAsMCwwLDB9LAorICB7NzAsNyxyLFMsMCwwfSwJLyogcHNoLncgKi8KKyAgezcwLDgscixTLDAsMH0sCS8qIHBzaC5sICovCisgIHs3MSw3LHIsUywwLDB9LAkvKiBwb3AudyAqLworICB7NzEsOCxyLFMsMCwwfSwJLyogcG9wLmwgKi8KKyAgezcyLDAsbm9wcywwLDAsMH0sCS8qIGVuaSAqLworICB7NzMsMCxub3BzLDAsMCwwfSwJLyogZHNpICovCisgIHs3NCwwLG5vcHMsMCwwLDB9LAkvKiBia3B0ICovCisgIHs3NSwwLG5vcHMsMCwwLDB9LAkvKiBtc3luYyAqLworICB7NzYsMCxyLFMsMCwwfSwJLyogbXNraSAqLworICB7NzcsMCxyLFMsMCwwfSwJLyogeG10aSAqLworICB7MCwwLHJ4bCxTLFZWLDB9LAkvKiBtb3YgKi8KKyAgezc4LDAsbm9wcywwLDAsMH0sCS8qIHRzdHZ2ICovCisgIHswLDAsbHIsVlMsQSwwfSwJLyogbW92ICovCisgIHswLDAscnhsLEEsVlMsMH0sCS8qIG1vdiAqLworICB7MCwwLGxyLFZMLEEsMH0sCS8qIG1vdiAqLworICB7MCwwLHJ4bCxBLFZMLDB9LAkvKiBtb3YgKi8KKyAgezAsNyxscixWUyxTLDB9LAkvKiBtb3YudyAqLworICB7MCw3LHJ4bCxTLFZTLDB9LAkvKiBtb3YudyAqLworICB7MCw3LGxyLFZMLFMsMH0sCS8qIG1vdi53ICovCisgIHswLDcscnhsLFMsVkwsMH0sCS8qIG1vdi53ICovCisgIHs3OSwwLHIsQSwwLDB9LAkvKiBkaWFnICovCisgIHs4MCwwLG5vcHMsMCwwLDB9LAkvKiBwYmtwdCAqLworICB7ODEsMyxyLFMsMCwwfSwJLyogc3FydC5zICovCisgIHs4MSw0LHIsUywwLDB9LAkvKiBzcXJ0LmQgKi8KKyAgezgyLDAsbm9wcywwLDAsMH0sCS8qIGNhc3IgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezgzLDMscixTLDAsMH0sCS8qIGF0YW4ucyAqLworICB7ODMsNCxyLFMsMCwwfSwJLyogYXRhbi5kICovCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ3W10gPSB7CisgIHs4NCw1LHIsViwwLDB9LAkvKiBzdW0uYiAqLworICB7ODQsNixyLFYsMCwwfSwJLyogc3VtLmggKi8KKyAgezg0LDcscixWLDAsMH0sCS8qIHN1bS53ICovCisgIHs4NCw4LHIsViwwLDB9LAkvKiBzdW0ubCAqLworICB7ODUsMCxyLFYsMCwwfSwJLyogYWxsICovCisgIHs4NiwwLHIsViwwLDB9LAkvKiBhbnkgKi8KKyAgezg3LDAscixWLDAsMH0sCS8qIHBhcml0eSAqLworICB7MCwwLDAsMCwwLDB9LAorICB7ODgsNSxyLFYsMCwwfSwJLyogbWF4LmIgKi8KKyAgezg4LDYscixWLDAsMH0sCS8qIG1heC5oICovCisgIHs4OCw3LHIsViwwLDB9LAkvKiBtYXgudyAqLworICB7ODgsOCxyLFYsMCwwfSwJLyogbWF4LmwgKi8KKyAgezg5LDUscixWLDAsMH0sCS8qIG1pbi5iICovCisgIHs4OSw2LHIsViwwLDB9LAkvKiBtaW4uaCAqLworICB7ODksNyxyLFYsMCwwfSwJLyogbWluLncgKi8KKyAgezg5LDgscixWLDAsMH0sCS8qIG1pbi5sICovCisgIHs4NCwzLHIsViwwLDB9LAkvKiBzdW0ucyAqLworICB7ODQsNCxyLFYsMCwwfSwJLyogc3VtLmQgKi8KKyAgezkwLDMscixWLDAsMH0sCS8qIHByb2QucyAqLworICB7OTAsNCxyLFYsMCwwfSwJLyogcHJvZC5kICovCisgIHs4OCwzLHIsViwwLDB9LAkvKiBtYXgucyAqLworICB7ODgsNCxyLFYsMCwwfSwJLyogbWF4LmQgKi8KKyAgezg5LDMscixWLDAsMH0sCS8qIG1pbi5zICovCisgIHs4OSw0LHIsViwwLDB9LAkvKiBtaW4uZCAqLworICB7OTAsNSxyLFYsMCwwfSwJLyogcHJvZC5iICovCisgIHs5MCw2LHIsViwwLDB9LAkvKiBwcm9kLmggKi8KKyAgezkwLDcscixWLDAsMH0sCS8qIHByb2QudyAqLworICB7OTAsOCxyLFYsMCwwfSwJLyogcHJvZC5sICovCisgIHszNSwyLGxyLFZNLFMsMH0sCS8qIHBsYy5mICovCisgIHszNSwxLGxyLFZNLFMsMH0sCS8qIHBsYy50ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXR4W10gPSB7CisgIHswLDAsMCwwLDAsMH0sCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQxYVtdID0geworICB7OTEsMCxpbXIsQSwwLDB9LAkvKiBoYWx0ICovCisgIHs5MiwwLGE0LDAsMCwwfSwJLyogc3lzYyAqLworICB7MTgsNixpbXIsQSwwLDB9LAkvKiBsZC5oICovCisgIHsxOCw3LGltcixBLDAsMH0sCS8qIGxkLncgKi8KKyAgezUsMCxpbXIsQSwwLDB9LAkvKiBhbmQgKi8KKyAgezYsMCxpbXIsQSwwLDB9LAkvKiBvciAqLworICB7NywwLGltcixBLDAsMH0sCS8qIHhvciAqLworICB7OCwwLGltcixBLDAsMH0sCS8qIHNoZiAqLworICB7OSw2LGltcixBLDAsMH0sCS8qIGFkZC5oICovCisgIHs5LDcsaW1yLEEsMCwwfSwJLyogYWRkLncgKi8KKyAgezEwLDYsaW1yLEEsMCwwfSwJLyogc3ViLmggKi8KKyAgezEwLDcsaW1yLEEsMCwwfSwJLyogc3ViLncgKi8KKyAgezMsNixpbXIsQSwwLDB9LAkvKiBtdWwuaCAqLworICB7Myw3LGltcixBLDAsMH0sCS8qIG11bC53ICovCisgIHs0LDYsaW1yLEEsMCwwfSwJLyogZGl2LmggKi8KKyAgezQsNyxpbXIsQSwwLDB9LAkvKiBkaXYudyAqLworICB7MTgsNyxpbWwsVkwsMCwwfSwJLyogbGQudyAqLworICB7MTgsNyxpbWwsVlMsMCwwfSwJLyogbGQudyAqLworICB7MCwwLDAsMCwwLDB9LAorICB7OCw3LGltcixTLDAsMH0sCS8qIHNoZi53ICovCisgIHs5MywwLGE1LDAsMCwwfSwJLyogdHJhcCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MzcsNixpbXIsQSwwLDB9LAkvKiBlcS5oICovCisgIHszNyw3LGltcixBLDAsMH0sCS8qIGVxLncgKi8KKyAgezM4LDYsaW1yLEEsMCwwfSwJLyogbGV1LmggKi8KKyAgezM4LDcsaW1yLEEsMCwwfSwJLyogbGV1LncgKi8KKyAgezM5LDYsaW1yLEEsMCwwfSwJLyogbHR1LmggKi8KKyAgezM5LDcsaW1yLEEsMCwwfSwJLyogbHR1LncgKi8KKyAgezQwLDYsaW1yLEEsMCwwfSwJLyogbGUuaCAqLworICB7NDAsNyxpbXIsQSwwLDB9LAkvKiBsZS53ICovCisgIHs0MSw2LGltcixBLDAsMH0sCS8qIGx0LmggKi8KKyAgezQxLDcsaW1yLEEsMCwwfSwJLyogbHQudyAqLworfTsKKworQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWJbXSA9IHsKKyAgezE4LDQsaW1yLFMsMCwwfSwJLyogbGQuZCAqLworICB7MTgsMTAsaW1yLFMsMCwwfSwJLyogbGQudSAqLworICB7MTgsOCxpbXIsUywwLDB9LAkvKiBsZC5sICovCisgIHsxOCw3LGltcixTLDAsMH0sCS8qIGxkLncgKi8KKyAgezUsMCxpbXIsUywwLDB9LAkvKiBhbmQgKi8KKyAgezYsMCxpbXIsUywwLDB9LAkvKiBvciAqLworICB7NywwLGltcixTLDAsMH0sCS8qIHhvciAqLworICB7OCwwLGltcixTLDAsMH0sCS8qIHNoZiAqLworICB7OSw2LGltcixTLDAsMH0sCS8qIGFkZC5oICovCisgIHs5LDcsaW1yLFMsMCwwfSwJLyogYWRkLncgKi8KKyAgezEwLDYsaW1yLFMsMCwwfSwJLyogc3ViLmggKi8KKyAgezEwLDcsaW1yLFMsMCwwfSwJLyogc3ViLncgKi8KKyAgezMsNixpbXIsUywwLDB9LAkvKiBtdWwuaCAqLworICB7Myw3LGltcixTLDAsMH0sCS8qIG11bC53ICovCisgIHs0LDYsaW1yLFMsMCwwfSwJLyogZGl2LmggKi8KKyAgezQsNyxpbXIsUywwLDB9LAkvKiBkaXYudyAqLworICB7OSwzLGltcixTLDAsMH0sCS8qIGFkZC5zICovCisgIHsxMCwzLGltcixTLDAsMH0sCS8qIHN1Yi5zICovCisgIHszLDMsaW1yLFMsMCwwfSwJLyogbXVsLnMgKi8KKyAgezQsMyxpbXIsUywwLDB9LAkvKiBkaXYucyAqLworICB7NDAsMyxpbXIsUywwLDB9LAkvKiBsZS5zICovCisgIHs0MSwzLGltcixTLDAsMH0sCS8qIGx0LnMgKi8KKyAgezM3LDYsaW1yLFMsMCwwfSwJLyogZXEuaCAqLworICB7MzcsNyxpbXIsUywwLDB9LAkvKiBlcS53ICovCisgIHszOCw2LGltcixTLDAsMH0sCS8qIGxldS5oICovCisgIHszOCw3LGltcixTLDAsMH0sCS8qIGxldS53ICovCisgIHszOSw2LGltcixTLDAsMH0sCS8qIGx0dS5oICovCisgIHszOSw3LGltcixTLDAsMH0sCS8qIGx0dS53ICovCisgIHs0MCw2LGltcixTLDAsMH0sCS8qIGxlLmggKi8KKyAgezQwLDcsaW1yLFMsMCwwfSwJLyogbGUudyAqLworICB7NDEsNixpbXIsUywwLDB9LAkvKiBsdC5oICovCisgIHs0MSw3LGltcixTLDAsMH0sCS8qIGx0LncgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDBbXSA9IHsKKyAgezEwLDMscnJyLFMsVixWfSwJLyogc3ViLnMgKi8KKyAgezEwLDQscnJyLFMsVixWfSwJLyogc3ViLmQgKi8KKyAgezQsMyxycnIsUyxWLFZ9LAkvKiBkaXYucyAqLworICB7NCw0LHJycixTLFYsVn0sCS8qIGRpdi5kICovCisgIHsxMCwxMSxycnIsUyxWLFZ9LAkvKiBzdWIucy5mICovCisgIHsxMCwxMixycnIsUyxWLFZ9LAkvKiBzdWIuZC5mICovCisgIHs0LDExLHJycixTLFYsVn0sCS8qIGRpdi5zLmYgKi8KKyAgezQsMTIscnJyLFMsVixWfSwJLyogZGl2LmQuZiAqLworICB7MywxMSxycnIsVixWLFZ9LAkvKiBtdWwucy5mICovCisgIHszLDEyLHJycixWLFYsVn0sCS8qIG11bC5kLmYgKi8KKyAgezQsMTEscnJyLFYsVixWfSwJLyogZGl2LnMuZiAqLworICB7NCwxMixycnIsVixWLFZ9LAkvKiBkaXYuZC5mICovCisgIHszLDExLHJycixWLFMsVn0sCS8qIG11bC5zLmYgKi8KKyAgezMsMTIscnJyLFYsUyxWfSwJLyogbXVsLmQuZiAqLworICB7NCwxMSxycnIsVixTLFZ9LAkvKiBkaXYucy5mICovCisgIHs0LDEyLHJycixWLFMsVn0sCS8qIGRpdi5kLmYgKi8KKyAgezUsMixycnIsVixWLFZ9LAkvKiBhbmQuZiAqLworICB7NiwyLHJycixWLFYsVn0sCS8qIG9yLmYgKi8KKyAgezcsMixycnIsVixWLFZ9LAkvKiB4b3IuZiAqLworICB7OCwyLHJycixWLFYsVn0sCS8qIHNoZi5mICovCisgIHs1LDIscnJyLFYsUyxWfSwJLyogYW5kLmYgKi8KKyAgezYsMixycnIsVixTLFZ9LAkvKiBvci5mICovCisgIHs3LDIscnJyLFYsUyxWfSwJLyogeG9yLmYgKi8KKyAgezgsMixycnIsVixTLFZ9LAkvKiBzaGYuZiAqLworICB7OSwxMSxycnIsVixWLFZ9LAkvKiBhZGQucy5mICovCisgIHs5LDEyLHJycixWLFYsVn0sCS8qIGFkZC5kLmYgKi8KKyAgezEwLDExLHJycixWLFYsVn0sCS8qIHN1Yi5zLmYgKi8KKyAgezEwLDEyLHJycixWLFYsVn0sCS8qIHN1Yi5kLmYgKi8KKyAgezksMTEscnJyLFYsUyxWfSwJLyogYWRkLnMuZiAqLworICB7OSwxMixycnIsVixTLFZ9LAkvKiBhZGQuZC5mICovCisgIHsxMCwxMSxycnIsVixTLFZ9LAkvKiBzdWIucy5mICovCisgIHsxMCwxMixycnIsVixTLFZ9LAkvKiBzdWIuZC5mICovCisgIHs5LDEzLHJycixWLFYsVn0sCS8qIGFkZC5iLmYgKi8KKyAgezksMTQscnJyLFYsVixWfSwJLyogYWRkLmguZiAqLworICB7OSwxNSxycnIsVixWLFZ9LAkvKiBhZGQudy5mICovCisgIHs5LDE2LHJycixWLFYsVn0sCS8qIGFkZC5sLmYgKi8KKyAgezksMTMscnJyLFYsUyxWfSwJLyogYWRkLmIuZiAqLworICB7OSwxNCxycnIsVixTLFZ9LAkvKiBhZGQuaC5mICovCisgIHs5LDE1LHJycixWLFMsVn0sCS8qIGFkZC53LmYgKi8KKyAgezksMTYscnJyLFYsUyxWfSwJLyogYWRkLmwuZiAqLworICB7MTAsMTMscnJyLFYsVixWfSwJLyogc3ViLmIuZiAqLworICB7MTAsMTQscnJyLFYsVixWfSwJLyogc3ViLmguZiAqLworICB7MTAsMTUscnJyLFYsVixWfSwJLyogc3ViLncuZiAqLworICB7MTAsMTYscnJyLFYsVixWfSwJLyogc3ViLmwuZiAqLworICB7MTAsMTMscnJyLFYsUyxWfSwJLyogc3ViLmIuZiAqLworICB7MTAsMTQscnJyLFYsUyxWfSwJLyogc3ViLmguZiAqLworICB7MTAsMTUscnJyLFYsUyxWfSwJLyogc3ViLncuZiAqLworICB7MTAsMTYscnJyLFYsUyxWfSwJLyogc3ViLmwuZiAqLworICB7MywxMyxycnIsVixWLFZ9LAkvKiBtdWwuYi5mICovCisgIHszLDE0LHJycixWLFYsVn0sCS8qIG11bC5oLmYgKi8KKyAgezMsMTUscnJyLFYsVixWfSwJLyogbXVsLncuZiAqLworICB7MywxNixycnIsVixWLFZ9LAkvKiBtdWwubC5mICovCisgIHszLDEzLHJycixWLFMsVn0sCS8qIG11bC5iLmYgKi8KKyAgezMsMTQscnJyLFYsUyxWfSwJLyogbXVsLmguZiAqLworICB7MywxNSxycnIsVixTLFZ9LAkvKiBtdWwudy5mICovCisgIHszLDE2LHJycixWLFMsVn0sCS8qIG11bC5sLmYgKi8KKyAgezQsMTMscnJyLFYsVixWfSwJLyogZGl2LmIuZiAqLworICB7NCwxNCxycnIsVixWLFZ9LAkvKiBkaXYuaC5mICovCisgIHs0LDE1LHJycixWLFYsVn0sCS8qIGRpdi53LmYgKi8KKyAgezQsMTYscnJyLFYsVixWfSwJLyogZGl2LmwuZiAqLworICB7NCwxMyxycnIsVixTLFZ9LAkvKiBkaXYuYi5mICovCisgIHs0LDE0LHJycixWLFMsVn0sCS8qIGRpdi5oLmYgKi8KKyAgezQsMTUscnJyLFYsUyxWfSwJLyogZGl2LncuZiAqLworICB7NCwxNixycnIsVixTLFZ9LAkvKiBkaXYubC5mICovCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQxW10gPSB7CisgIHswLDAsMCwwLDAsMH0sCisgIHs5NCwwLGEzLDAsMCwwfSwJLyogdHN0ICovCisgIHs5NSwwLGEzLDAsMCwwfSwJLyogbGNrICovCisgIHs5NiwwLGEzLDAsMCwwfSwJLyogdWxrICovCisgIHsxNywwLGExcixTLDAsMH0sCS8qIGxkZWEgKi8KKyAgezk3LDAsYTFyLEEsMCwwfSwJLyogc3Bhd24gKi8KKyAgezk4LDAsYTFyLEEsMCwwfSwJLyogbGRjbXIgKi8KKyAgezk5LDAsYTJyLEEsMCwwfSwJLyogc3RjbXIgKi8KKyAgezEwMCwwLGExcixBLDAsMH0sCS8qIHBvcHIgKi8KKyAgezEwMSwwLGEycixBLDAsMH0sCS8qIHBzaHIgKi8KKyAgezEwMiw3LGExcixBLDAsMH0sCS8qIHJjdnIudyAqLworICB7MTAzLDcsYTJyLEEsMCwwfSwJLyogbWF0bS53ICovCisgIHsxMDQsNyxhMnIsQSwwLDB9LAkvKiBzbmRyLncgKi8KKyAgezEwNCw4LGEycixTLDAsMH0sCS8qIHNuZHIubCAqLworICB7MTAyLDgsYTFyLFMsMCwwfSwJLyogcmN2ci5sICovCisgIHsxMDMsOCxhMnIsUywwLDB9LAkvKiBtYXRtLmwgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezEwNSw3LGEycixBLDAsMH0sCS8qIHB1dHIudyAqLworICB7MTA1LDgsYTJyLFMsMCwwfSwJLyogcHV0ci5sICovCisgIHsxMDYsNyxhMXIsQSwwLDB9LAkvKiBnZXRyLncgKi8KKyAgezEwNiw4LGExcixTLDAsMH0sCS8qIGdldHIubCAqLworICB7MjYsMTMsYTJyLFMsMCwwfSwJLyogc3RlLmIuZiAqLworICB7MjYsMTQsYTJyLFMsMCwwfSwJLyogc3RlLmguZiAqLworICB7MjYsMTUsYTJyLFMsMCwwfSwJLyogc3RlLncuZiAqLworICB7MjYsMTYsYTJyLFMsMCwwfSwJLyogc3RlLmwuZiAqLworICB7MTA3LDcsYTJyLEEsMCwwfSwJLyogbWF0ci53ICovCisgIHsxMDgsNyxhMnIsQSwwLDB9LAkvKiBtYXQudyAqLworICB7MTA5LDcsYTFyLEEsMCwwfSwJLyogZ2V0LncgKi8KKyAgezExMCw3LGExcixBLDAsMH0sCS8qIHJjdi53ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHsxMTEsNyxhMXIsQSwwLDB9LAkvKiBpbmMudyAqLworICB7MTEyLDcsYTJyLEEsMCwwfSwJLyogcHV0LncgKi8KKyAgezExMyw3LGEycixBLDAsMH0sCS8qIHNuZC53ICovCisgIHsxMDcsOCxhMnIsUywwLDB9LAkvKiBtYXRyLmwgKi8KKyAgezEwOCw4LGEycixTLDAsMH0sCS8qIG1hdC5sICovCisgIHsxMDksOCxhMXIsUywwLDB9LAkvKiBnZXQubCAqLworICB7MTEwLDgsYTFyLFMsMCwwfSwJLyogcmN2LmwgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezExMSw4LGExcixTLDAsMH0sCS8qIGluYy5sICovCisgIHsxMTIsOCxhMnIsUywwLDB9LAkvKiBwdXQubCAqLworICB7MTEzLDgsYTJyLFMsMCwwfSwJLyogc25kLmwgKi8KKyAgezE4LDEzLGExcixWLDAsMH0sCS8qIGxkLmIuZiAqLworICB7MTgsMTQsYTFyLFYsMCwwfSwJLyogbGQuaC5mICovCisgIHsxOCwxNSxhMXIsViwwLDB9LAkvKiBsZC53LmYgKi8KKyAgezE4LDE2LGExcixWLDAsMH0sCS8qIGxkLmwuZiAqLworICB7MjEsMTMsYTJyLFYsMCwwfSwJLyogc3QuYi5mICovCisgIHsyMSwxNCxhMnIsViwwLDB9LAkvKiBzdC5oLmYgKi8KKyAgezIxLDE1LGEycixWLDAsMH0sCS8qIHN0LncuZiAqLworICB7MjEsMTYsYTJyLFYsMCwwfSwJLyogc3QubC5mICovCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQyW10gPSB7CisgIHsyOCw1LHJyLFYsViwwfSwJLyogY3Z0dy5iICovCisgIHsyOCw2LHJyLFYsViwwfSwJLyogY3Z0dy5oICovCisgIHsyOSw3LHJyLFYsViwwfSwJLyogY3Z0Yi53ICovCisgIHszMCw3LHJyLFYsViwwfSwJLyogY3Z0aC53ICovCisgIHsyOCwxMyxycixWLFYsMH0sCS8qIGN2dHcuYi5mICovCisgIHsyOCwxNCxycixWLFYsMH0sCS8qIGN2dHcuaC5mICovCisgIHsyOSwxNSxycixWLFYsMH0sCS8qIGN2dGIudy5mICovCisgIHszMCwxNSxycixWLFYsMH0sCS8qIGN2dGgudy5mICovCisgIHszMSw4LHJyLFYsViwwfSwJLyogY3Z0cy5sICovCisgIHszMiw3LHJyLFYsViwwfSwJLyogY3Z0ZC53ICovCisgIHszMywzLHJyLFYsViwwfSwJLyogY3Z0bC5zICovCisgIHsyOCw0LHJyLFYsViwwfSwJLyogY3Z0dy5kICovCisgIHszMSwxNixycixWLFYsMH0sCS8qIGN2dHMubC5mICovCisgIHszMiwxNSxycixWLFYsMH0sCS8qIGN2dGQudy5mICovCisgIHszMywxMSxycixWLFYsMH0sCS8qIGN2dGwucy5mICovCisgIHsyOCwxMixycixWLFYsMH0sCS8qIGN2dHcuZC5mICovCisgIHsxMTQsMCxycixTLFMsMH0sCS8qIGVuYWwgKi8KKyAgezgsNyxycixTLFMsMH0sCS8qIHNoZi53ICovCisgIHsxMTUsMCxycixTLFMsMH0sCS8qIGVuYWcgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezI4LDQscnIsUyxTLDB9LAkvKiBjdnR3LmQgKi8KKyAgezMyLDcscnIsUyxTLDB9LAkvKiBjdnRkLncgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezExNiwzLHJyLFMsUywwfSwJLyogZnJpbnQucyAqLworICB7MTE2LDQscnIsUyxTLDB9LAkvKiBmcmludC5kICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHsxMTYsMyxycixWLFYsMH0sCS8qIGZyaW50LnMgKi8KKyAgezExNiw0LHJyLFYsViwwfSwJLyogZnJpbnQuZCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MTE2LDExLHJyLFYsViwwfSwJLyogZnJpbnQucy5mICovCisgIHsxMTYsMTIscnIsVixWLDB9LAkvKiBmcmludC5kLmYgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezgxLDMscnIsVixWLDB9LAkvKiBzcXJ0LnMgKi8KKyAgezgxLDQscnIsVixWLDB9LAkvKiBzcXJ0LmQgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezgxLDExLHJyLFYsViwwfSwJLyogc3FydC5zLmYgKi8KKyAgezgxLDEyLHJyLFYsViwwfSwJLyogc3FydC5kLmYgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDNbXSA9IHsKKyAgezMyLDExLHJyLFYsViwwfSwJLyogY3Z0ZC5zLmYgKi8KKyAgezMxLDEyLHJyLFYsViwwfSwJLyogY3Z0cy5kLmYgKi8KKyAgezMzLDEyLHJyLFYsViwwfSwJLyogY3Z0bC5kLmYgKi8KKyAgezMyLDE2LHJyLFYsViwwfSwJLyogY3Z0ZC5sLmYgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezM2LDIscnIsVixWLDB9LAkvKiB0emMuZiAqLworICB7NDQsMixycixWLFYsMH0sCS8qIGxvcC5mICovCisgIHsxMTcsMixycixWLFYsMH0sCS8qIHhwbmQuZiAqLworICB7NDIsMixycixWLFYsMH0sCS8qIG5vdC5mICovCisgIHs4LDIscnIsUyxWLDB9LAkvKiBzaGYuZiAqLworICB7MzUsMTcscnIsVixWLDB9LAkvKiBwbGMudC5mICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHszNywxMSxycixWLFYsMH0sCS8qIGVxLnMuZiAqLworICB7MzcsMTIscnIsVixWLDB9LAkvKiBlcS5kLmYgKi8KKyAgezQzLDExLHJyLFYsViwwfSwJLyogbmVnLnMuZiAqLworICB7NDMsMTIscnIsVixWLDB9LAkvKiBuZWcuZC5mICovCisgIHszNywxMSxycixTLFYsMH0sCS8qIGVxLnMuZiAqLworICB7MzcsMTIscnIsUyxWLDB9LAkvKiBlcS5kLmYgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezQwLDExLHJyLFYsViwwfSwJLyogbGUucy5mICovCisgIHs0MCwxMixycixWLFYsMH0sCS8qIGxlLmQuZiAqLworICB7NDEsMTEscnIsVixWLDB9LAkvKiBsdC5zLmYgKi8KKyAgezQxLDEyLHJyLFYsViwwfSwJLyogbHQuZC5mICovCisgIHs0MCwxMSxycixTLFYsMH0sCS8qIGxlLnMuZiAqLworICB7NDAsMTIscnIsUyxWLDB9LAkvKiBsZS5kLmYgKi8KKyAgezQxLDExLHJyLFMsViwwfSwJLyogbHQucy5mICovCisgIHs0MSwxMixycixTLFYsMH0sCS8qIGx0LmQuZiAqLworICB7MzcsMTMscnIsVixWLDB9LAkvKiBlcS5iLmYgKi8KKyAgezM3LDE0LHJyLFYsViwwfSwJLyogZXEuaC5mICovCisgIHszNywxNSxycixWLFYsMH0sCS8qIGVxLncuZiAqLworICB7MzcsMTYscnIsVixWLDB9LAkvKiBlcS5sLmYgKi8KKyAgezM3LDEzLHJyLFMsViwwfSwJLyogZXEuYi5mICovCisgIHszNywxNCxycixTLFYsMH0sCS8qIGVxLmguZiAqLworICB7MzcsMTUscnIsUyxWLDB9LAkvKiBlcS53LmYgKi8KKyAgezM3LDE2LHJyLFMsViwwfSwJLyogZXEubC5mICovCisgIHs0MCwxMyxycixWLFYsMH0sCS8qIGxlLmIuZiAqLworICB7NDAsMTQscnIsVixWLDB9LAkvKiBsZS5oLmYgKi8KKyAgezQwLDE1LHJyLFYsViwwfSwJLyogbGUudy5mICovCisgIHs0MCwxNixycixWLFYsMH0sCS8qIGxlLmwuZiAqLworICB7NDAsMTMscnIsUyxWLDB9LAkvKiBsZS5iLmYgKi8KKyAgezQwLDE0LHJyLFMsViwwfSwJLyogbGUuaC5mICovCisgIHs0MCwxNSxycixTLFYsMH0sCS8qIGxlLncuZiAqLworICB7NDAsMTYscnIsUyxWLDB9LAkvKiBsZS5sLmYgKi8KKyAgezQxLDEzLHJyLFYsViwwfSwJLyogbHQuYi5mICovCisgIHs0MSwxNCxycixWLFYsMH0sCS8qIGx0LmguZiAqLworICB7NDEsMTUscnIsVixWLDB9LAkvKiBsdC53LmYgKi8KKyAgezQxLDE2LHJyLFYsViwwfSwJLyogbHQubC5mICovCisgIHs0MSwxMyxycixTLFYsMH0sCS8qIGx0LmIuZiAqLworICB7NDEsMTQscnIsUyxWLDB9LAkvKiBsdC5oLmYgKi8KKyAgezQxLDE1LHJyLFMsViwwfSwJLyogbHQudy5mICovCisgIHs0MSwxNixycixTLFYsMH0sCS8qIGx0LmwuZiAqLworICB7NDMsMTMscnIsVixWLDB9LAkvKiBuZWcuYi5mICovCisgIHs0MywxNCxycixWLFYsMH0sCS8qIG5lZy5oLmYgKi8KKyAgezQzLDE1LHJyLFYsViwwfSwJLyogbmVnLncuZiAqLworICB7NDMsMTYscnIsVixWLDB9LAkvKiBuZWcubC5mICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ0W10gPSB7CisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ1W10gPSB7CisgIHs1MSwxMyxycixWLFYsMH0sCS8qIGxkdmkuYi5mICovCisgIHs1MSwxNCxycixWLFYsMH0sCS8qIGxkdmkuaC5mICovCisgIHs1MSwxNSxycixWLFYsMH0sCS8qIGxkdmkudy5mICovCisgIHs1MSwxNixycixWLFYsMH0sCS8qIGxkdmkubC5mICovCisgIHsyOCwxMSxycixWLFYsMH0sCS8qIGN2dHcucy5mICovCisgIHszMSwxNSxycixWLFYsMH0sCS8qIGN2dHMudy5mICovCisgIHsyOCwxNixycixWLFYsMH0sCS8qIGN2dHcubC5mICovCisgIHszMywxNSxycixWLFYsMH0sCS8qIGN2dGwudy5mICovCisgIHs1MiwxMyxyeHIsVixWLDB9LAkvKiBzdHZpLmIuZiAqLworICB7NTIsMTQscnhyLFYsViwwfSwJLyogc3R2aS5oLmYgKi8KKyAgezUyLDE1LHJ4cixWLFYsMH0sCS8qIHN0dmkudy5mICovCisgIHs1MiwxNixyeHIsVixWLDB9LAkvKiBzdHZpLmwuZiAqLworICB7NTIsMTMscnhyLFMsViwwfSwJLyogc3R2aS5iLmYgKi8KKyAgezUyLDE0LHJ4cixTLFYsMH0sCS8qIHN0dmkuaC5mICovCisgIHs1MiwxNSxyeHIsUyxWLDB9LAkvKiBzdHZpLncuZiAqLworICB7NTIsMTYscnhyLFMsViwwfSwJLyogc3R2aS5sLmYgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDZbXSA9IHsKKyAgezAsMCxyeGwsUyxDSVIsMH0sCS8qIG1vdiAqLworICB7MCwwLGxyLENJUixTLDB9LAkvKiBtb3YgKi8KKyAgezAsMCxscixUT0MsUywwfSwJLyogbW92ICovCisgIHswLDAsbHIsQ1BVSUQsUywwfSwJLyogbW92ICovCisgIHswLDAscnhsLFMsVFRSLDB9LAkvKiBtb3YgKi8KKyAgezAsMCxscixUVFIsUywwfSwJLyogbW92ICovCisgIHsxMTgsMCxub3BzLDAsMCwwfSwJLyogY3Ryc2wgKi8KKyAgezExOSwwLG5vcHMsMCwwLDB9LAkvKiBjdHJzZyAqLworICB7MCwwLHJ4bCxTLFZNVSwwfSwJLyogbW92ICovCisgIHswLDAsbHIsVk1VLFMsMH0sCS8qIG1vdiAqLworICB7MCwwLHJ4bCxTLFZNTCwwfSwJLyogbW92ICovCisgIHswLDAsbHIsVk1MLFMsMH0sCS8qIG1vdiAqLworICB7MCwwLHJ4bCxTLElDUiwwfSwJLyogbW92ICovCisgIHswLDAsbHIsSUNSLFMsMH0sCS8qIG1vdiAqLworICB7MCwwLHJ4bCxTLFRDUFUsMH0sCS8qIG1vdiAqLworICB7MCwwLGxyLFRDUFUsUywwfSwJLyogbW92ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHsxMjAsMCxub3BzLDAsMCwwfSwJLyogc3RvcCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLHJ4bCxTLFRJRCwwfSwJLyogbW92ICovCisgIHswLDAsbHIsVElELFMsMH0sCS8qIG1vdiAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorfTsKKworQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0N1tdID0geworICB7ODQsMTMscixWLDAsMH0sCS8qIHN1bS5iLmYgKi8KKyAgezg0LDE0LHIsViwwLDB9LAkvKiBzdW0uaC5mICovCisgIHs4NCwxNSxyLFYsMCwwfSwJLyogc3VtLncuZiAqLworICB7ODQsMTYscixWLDAsMH0sCS8qIHN1bS5sLmYgKi8KKyAgezg1LDIscixWLDAsMH0sCS8qIGFsbC5mICovCisgIHs4NiwyLHIsViwwLDB9LAkvKiBhbnkuZiAqLworICB7ODcsMixyLFYsMCwwfSwJLyogcGFyaXR5LmYgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezg4LDEzLHIsViwwLDB9LAkvKiBtYXguYi5mICovCisgIHs4OCwxNCxyLFYsMCwwfSwJLyogbWF4LmguZiAqLworICB7ODgsMTUscixWLDAsMH0sCS8qIG1heC53LmYgKi8KKyAgezg4LDE2LHIsViwwLDB9LAkvKiBtYXgubC5mICovCisgIHs4OSwxMyxyLFYsMCwwfSwJLyogbWluLmIuZiAqLworICB7ODksMTQscixWLDAsMH0sCS8qIG1pbi5oLmYgKi8KKyAgezg5LDE1LHIsViwwLDB9LAkvKiBtaW4udy5mICovCisgIHs4OSwxNixyLFYsMCwwfSwJLyogbWluLmwuZiAqLworICB7ODQsMTEscixWLDAsMH0sCS8qIHN1bS5zLmYgKi8KKyAgezg0LDEyLHIsViwwLDB9LAkvKiBzdW0uZC5mICovCisgIHs5MCwxMSxyLFYsMCwwfSwJLyogcHJvZC5zLmYgKi8KKyAgezkwLDEyLHIsViwwLDB9LAkvKiBwcm9kLmQuZiAqLworICB7ODgsMTEscixWLDAsMH0sCS8qIG1heC5zLmYgKi8KKyAgezg4LDEyLHIsViwwLDB9LAkvKiBtYXguZC5mICovCisgIHs4OSwxMSxyLFYsMCwwfSwJLyogbWluLnMuZiAqLworICB7ODksMTIscixWLDAsMH0sCS8qIG1pbi5kLmYgKi8KKyAgezkwLDEzLHIsViwwLDB9LAkvKiBwcm9kLmIuZiAqLworICB7OTAsMTQscixWLDAsMH0sCS8qIHByb2QuaC5mICovCisgIHs5MCwxNSxyLFYsMCwwfSwJLyogcHJvZC53LmYgKi8KKyAgezkwLDE2LHIsViwwLDB9LAkvKiBwcm9kLmwuZiAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorfTsKKworQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MFtdID0geworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MTAsMTgscnJyLFMsVixWfSwJLyogc3ViLnMudCAqLworICB7MTAsMTkscnJyLFMsVixWfSwJLyogc3ViLmQudCAqLworICB7NCwxOCxycnIsUyxWLFZ9LAkvKiBkaXYucy50ICovCisgIHs0LDE5LHJycixTLFYsVn0sCS8qIGRpdi5kLnQgKi8KKyAgezMsMTgscnJyLFYsVixWfSwJLyogbXVsLnMudCAqLworICB7MywxOSxycnIsVixWLFZ9LAkvKiBtdWwuZC50ICovCisgIHs0LDE4LHJycixWLFYsVn0sCS8qIGRpdi5zLnQgKi8KKyAgezQsMTkscnJyLFYsVixWfSwJLyogZGl2LmQudCAqLworICB7MywxOCxycnIsVixTLFZ9LAkvKiBtdWwucy50ICovCisgIHszLDE5LHJycixWLFMsVn0sCS8qIG11bC5kLnQgKi8KKyAgezQsMTgscnJyLFYsUyxWfSwJLyogZGl2LnMudCAqLworICB7NCwxOSxycnIsVixTLFZ9LAkvKiBkaXYuZC50ICovCisgIHs1LDEscnJyLFYsVixWfSwJLyogYW5kLnQgKi8KKyAgezYsMSxycnIsVixWLFZ9LAkvKiBvci50ICovCisgIHs3LDEscnJyLFYsVixWfSwJLyogeG9yLnQgKi8KKyAgezgsMSxycnIsVixWLFZ9LAkvKiBzaGYudCAqLworICB7NSwxLHJycixWLFMsVn0sCS8qIGFuZC50ICovCisgIHs2LDEscnJyLFYsUyxWfSwJLyogb3IudCAqLworICB7NywxLHJycixWLFMsVn0sCS8qIHhvci50ICovCisgIHs4LDEscnJyLFYsUyxWfSwJLyogc2hmLnQgKi8KKyAgezksMTgscnJyLFYsVixWfSwJLyogYWRkLnMudCAqLworICB7OSwxOSxycnIsVixWLFZ9LAkvKiBhZGQuZC50ICovCisgIHsxMCwxOCxycnIsVixWLFZ9LAkvKiBzdWIucy50ICovCisgIHsxMCwxOSxycnIsVixWLFZ9LAkvKiBzdWIuZC50ICovCisgIHs5LDE4LHJycixWLFMsVn0sCS8qIGFkZC5zLnQgKi8KKyAgezksMTkscnJyLFYsUyxWfSwJLyogYWRkLmQudCAqLworICB7MTAsMTgscnJyLFYsUyxWfSwJLyogc3ViLnMudCAqLworICB7MTAsMTkscnJyLFYsUyxWfSwJLyogc3ViLmQudCAqLworICB7OSwyMCxycnIsVixWLFZ9LAkvKiBhZGQuYi50ICovCisgIHs5LDIxLHJycixWLFYsVn0sCS8qIGFkZC5oLnQgKi8KKyAgezksMjIscnJyLFYsVixWfSwJLyogYWRkLncudCAqLworICB7OSwyMyxycnIsVixWLFZ9LAkvKiBhZGQubC50ICovCisgIHs5LDIwLHJycixWLFMsVn0sCS8qIGFkZC5iLnQgKi8KKyAgezksMjEscnJyLFYsUyxWfSwJLyogYWRkLmgudCAqLworICB7OSwyMixycnIsVixTLFZ9LAkvKiBhZGQudy50ICovCisgIHs5LDIzLHJycixWLFMsVn0sCS8qIGFkZC5sLnQgKi8KKyAgezEwLDIwLHJycixWLFYsVn0sCS8qIHN1Yi5iLnQgKi8KKyAgezEwLDIxLHJycixWLFYsVn0sCS8qIHN1Yi5oLnQgKi8KKyAgezEwLDIyLHJycixWLFYsVn0sCS8qIHN1Yi53LnQgKi8KKyAgezEwLDIzLHJycixWLFYsVn0sCS8qIHN1Yi5sLnQgKi8KKyAgezEwLDIwLHJycixWLFMsVn0sCS8qIHN1Yi5iLnQgKi8KKyAgezEwLDIxLHJycixWLFMsVn0sCS8qIHN1Yi5oLnQgKi8KKyAgezEwLDIyLHJycixWLFMsVn0sCS8qIHN1Yi53LnQgKi8KKyAgezEwLDIzLHJycixWLFMsVn0sCS8qIHN1Yi5sLnQgKi8KKyAgezMsMjAscnJyLFYsVixWfSwJLyogbXVsLmIudCAqLworICB7MywyMSxycnIsVixWLFZ9LAkvKiBtdWwuaC50ICovCisgIHszLDIyLHJycixWLFYsVn0sCS8qIG11bC53LnQgKi8KKyAgezMsMjMscnJyLFYsVixWfSwJLyogbXVsLmwudCAqLworICB7MywyMCxycnIsVixTLFZ9LAkvKiBtdWwuYi50ICovCisgIHszLDIxLHJycixWLFMsVn0sCS8qIG11bC5oLnQgKi8KKyAgezMsMjIscnJyLFYsUyxWfSwJLyogbXVsLncudCAqLworICB7MywyMyxycnIsVixTLFZ9LAkvKiBtdWwubC50ICovCisgIHs0LDIwLHJycixWLFYsVn0sCS8qIGRpdi5iLnQgKi8KKyAgezQsMjEscnJyLFYsVixWfSwJLyogZGl2LmgudCAqLworICB7NCwyMixycnIsVixWLFZ9LAkvKiBkaXYudy50ICovCisgIHs0LDIzLHJycixWLFYsVn0sCS8qIGRpdi5sLnQgKi8KKyAgezQsMjAscnJyLFYsUyxWfSwJLyogZGl2LmIudCAqLworICB7NCwyMSxycnIsVixTLFZ9LAkvKiBkaXYuaC50ICovCisgIHs0LDIyLHJycixWLFMsVn0sCS8qIGRpdi53LnQgKi8KKyAgezQsMjMscnJyLFYsUyxWfSwJLyogZGl2LmwudCAqLworfTsKKworQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0MVtdID0geworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MjYsMjAsYTJyLFMsMCwwfSwJLyogc3RlLmIudCAqLworICB7MjYsMjEsYTJyLFMsMCwwfSwJLyogc3RlLmgudCAqLworICB7MjYsMjIsYTJyLFMsMCwwfSwJLyogc3RlLncudCAqLworICB7MjYsMjMsYTJyLFMsMCwwfSwJLyogc3RlLmwudCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MTgsMjAsYTFyLFYsMCwwfSwJLyogbGQuYi50ICovCisgIHsxOCwyMSxhMXIsViwwLDB9LAkvKiBsZC5oLnQgKi8KKyAgezE4LDIyLGExcixWLDAsMH0sCS8qIGxkLncudCAqLworICB7MTgsMjMsYTFyLFYsMCwwfSwJLyogbGQubC50ICovCisgIHsyMSwyMCxhMnIsViwwLDB9LAkvKiBzdC5iLnQgKi8KKyAgezIxLDIxLGEycixWLDAsMH0sCS8qIHN0LmgudCAqLworICB7MjEsMjIsYTJyLFYsMCwwfSwJLyogc3Qudy50ICovCisgIHsyMSwyMyxhMnIsViwwLDB9LAkvKiBzdC5sLnQgKi8KK307CisKK0NPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDJbXSA9IHsKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezI4LDIwLHJyLFYsViwwfSwJLyogY3Z0dy5iLnQgKi8KKyAgezI4LDIxLHJyLFYsViwwfSwJLyogY3Z0dy5oLnQgKi8KKyAgezI5LDIyLHJyLFYsViwwfSwJLyogY3Z0Yi53LnQgKi8KKyAgezMwLDIyLHJyLFYsViwwfSwJLyogY3Z0aC53LnQgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezMxLDIzLHJyLFYsViwwfSwJLyogY3Z0cy5sLnQgKi8KKyAgezMyLDIyLHJyLFYsViwwfSwJLyogY3Z0ZC53LnQgKi8KKyAgezMzLDE4LHJyLFYsViwwfSwJLyogY3Z0bC5zLnQgKi8KKyAgezI4LDE5LHJyLFYsViwwfSwJLyogY3Z0dy5kLnQgKi8KKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezAsMCwwLDAsMCwwfSwKKyAgezExNiwxOCxycixWLFYsMH0sCS8qIGZyaW50LnMudCAqLworICB7MTE2LDE5LHJyLFYsViwwfSwJLyogZnJpbnQuZC50ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHs4MSwxOCxycixWLFYsMH0sCS8qIHNxcnQucy50ICovCisgIHs4MSwxOSxycixWLFYsMH0sCS8qIHNxcnQuZC50ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQzW10gPSB7CisgIHszMiwxOCxycixWLFYsMH0sCS8qIGN2dGQucy50ICovCisgIHszMSwxOSxycixWLFYsMH0sCS8qIGN2dHMuZC50ICovCisgIHszMywxOSxycixWLFYsMH0sCS8qIGN2dGwuZC50ICovCisgIHszMiwyMyxycixWLFYsMH0sCS8qIGN2dGQubC50ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHszNiwxLHJyLFYsViwwfSwJLyogdHpjLnQgKi8KKyAgezQ0LDEscnIsVixWLDB9LAkvKiBsb3AudCAqLworICB7MTE3LDEscnIsVixWLDB9LAkvKiB4cG5kLnQgKi8KKyAgezQyLDEscnIsVixWLDB9LAkvKiBub3QudCAqLworICB7OCwxLHJyLFMsViwwfSwJLyogc2hmLnQgKi8KKyAgezM1LDI0LHJyLFYsViwwfSwJLyogcGxjLnQudCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MzcsMTgscnIsVixWLDB9LAkvKiBlcS5zLnQgKi8KKyAgezM3LDE5LHJyLFYsViwwfSwJLyogZXEuZC50ICovCisgIHs0MywxOCxycixWLFYsMH0sCS8qIG5lZy5zLnQgKi8KKyAgezQzLDE5LHJyLFYsViwwfSwJLyogbmVnLmQudCAqLworICB7MzcsMTgscnIsUyxWLDB9LAkvKiBlcS5zLnQgKi8KKyAgezM3LDE5LHJyLFMsViwwfSwJLyogZXEuZC50ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHs0MCwxOCxycixWLFYsMH0sCS8qIGxlLnMudCAqLworICB7NDAsMTkscnIsVixWLDB9LAkvKiBsZS5kLnQgKi8KKyAgezQxLDE4LHJyLFYsViwwfSwJLyogbHQucy50ICovCisgIHs0MSwxOSxycixWLFYsMH0sCS8qIGx0LmQudCAqLworICB7NDAsMTgscnIsUyxWLDB9LAkvKiBsZS5zLnQgKi8KKyAgezQwLDE5LHJyLFMsViwwfSwJLyogbGUuZC50ICovCisgIHs0MSwxOCxycixTLFYsMH0sCS8qIGx0LnMudCAqLworICB7NDEsMTkscnIsUyxWLDB9LAkvKiBsdC5kLnQgKi8KKyAgezM3LDIwLHJyLFYsViwwfSwJLyogZXEuYi50ICovCisgIHszNywyMSxycixWLFYsMH0sCS8qIGVxLmgudCAqLworICB7MzcsMjIscnIsVixWLDB9LAkvKiBlcS53LnQgKi8KKyAgezM3LDIzLHJyLFYsViwwfSwJLyogZXEubC50ICovCisgIHszNywyMCxycixTLFYsMH0sCS8qIGVxLmIudCAqLworICB7MzcsMjEscnIsUyxWLDB9LAkvKiBlcS5oLnQgKi8KKyAgezM3LDIyLHJyLFMsViwwfSwJLyogZXEudy50ICovCisgIHszNywyMyxycixTLFYsMH0sCS8qIGVxLmwudCAqLworICB7NDAsMjAscnIsVixWLDB9LAkvKiBsZS5iLnQgKi8KKyAgezQwLDIxLHJyLFYsViwwfSwJLyogbGUuaC50ICovCisgIHs0MCwyMixycixWLFYsMH0sCS8qIGxlLncudCAqLworICB7NDAsMjMscnIsVixWLDB9LAkvKiBsZS5sLnQgKi8KKyAgezQwLDIwLHJyLFMsViwwfSwJLyogbGUuYi50ICovCisgIHs0MCwyMSxycixTLFYsMH0sCS8qIGxlLmgudCAqLworICB7NDAsMjIscnIsUyxWLDB9LAkvKiBsZS53LnQgKi8KKyAgezQwLDIzLHJyLFMsViwwfSwJLyogbGUubC50ICovCisgIHs0MSwyMCxycixWLFYsMH0sCS8qIGx0LmIudCAqLworICB7NDEsMjEscnIsVixWLDB9LAkvKiBsdC5oLnQgKi8KKyAgezQxLDIyLHJyLFYsViwwfSwJLyogbHQudy50ICovCisgIHs0MSwyMyxycixWLFYsMH0sCS8qIGx0LmwudCAqLworICB7NDEsMjAscnIsUyxWLDB9LAkvKiBsdC5iLnQgKi8KKyAgezQxLDIxLHJyLFMsViwwfSwJLyogbHQuaC50ICovCisgIHs0MSwyMixycixTLFYsMH0sCS8qIGx0LncudCAqLworICB7NDEsMjMscnIsUyxWLDB9LAkvKiBsdC5sLnQgKi8KKyAgezQzLDIwLHJyLFYsViwwfSwJLyogbmVnLmIudCAqLworICB7NDMsMjEscnIsVixWLDB9LAkvKiBuZWcuaC50ICovCisgIHs0MywyMixycixWLFYsMH0sCS8qIG5lZy53LnQgKi8KKyAgezQzLDIzLHJyLFYsViwwfSwJLyogbmVnLmwudCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorfTsKKworQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NFtdID0geworICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorICB7MCwwLDAsMCwwLDB9LAorfTsKKworQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NVtdID0geworICB7NTEsMjAscnIsVixWLDB9LAkvKiBsZHZpLmIudCAqLworICB7NTEsMjEscnIsVixWLDB9LAkvKiBsZHZpLmgudCAqLworICB7NTEsMjIscnIsVixWLDB9LAkvKiBsZHZpLncudCAqLworICB7NTEsMjMscnIsVixWLDB9LAkvKiBsZHZpLmwudCAqLworICB7MjgsMTgscnIsVixWLDB9LAkvKiBjdnR3LnMudCAqLworICB7MzEsMjIscnIsVixWLDB9LAkvKiBjdnRzLncudCAqLworICB7MjgsMjMscnIsVixWLDB9LAkvKiBjdnR3LmwudCAqLworICB7MzMsMjIscnIsVixWLDB9LAkvKiBjdnRsLncudCAqLworICB7NTIsMjAscnhyLFYsViwwfSwJLyogc3R2aS5iLnQgKi8KKyAgezUyLDIxLHJ4cixWLFYsMH0sCS8qIHN0dmkuaC50ICovCisgIHs1MiwyMixyeHIsVixWLDB9LAkvKiBzdHZpLncudCAqLworICB7NTIsMjMscnhyLFYsViwwfSwJLyogc3R2aS5sLnQgKi8KKyAgezUyLDIwLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi50ICovCisgIHs1MiwyMSxyeHIsUyxWLDB9LAkvKiBzdHZpLmgudCAqLworICB7NTIsMjIscnhyLFMsViwwfSwJLyogc3R2aS53LnQgKi8KKyAgezUyLDIzLHJ4cixTLFYsMH0sCS8qIHN0dmkubC50ICovCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ2W10gPSB7CisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCit9OworCitDT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQ3W10gPSB7CisgIHs4NCwyMCxyLFYsMCwwfSwJLyogc3VtLmIudCAqLworICB7ODQsMjEscixWLDAsMH0sCS8qIHN1bS5oLnQgKi8KKyAgezg0LDIyLHIsViwwLDB9LAkvKiBzdW0udy50ICovCisgIHs4NCwyMyxyLFYsMCwwfSwJLyogc3VtLmwudCAqLworICB7ODUsMSxyLFYsMCwwfSwJLyogYWxsLnQgKi8KKyAgezg2LDEscixWLDAsMH0sCS8qIGFueS50ICovCisgIHs4NywxLHIsViwwLDB9LAkvKiBwYXJpdHkudCAqLworICB7MCwwLDAsMCwwLDB9LAorICB7ODgsMjAscixWLDAsMH0sCS8qIG1heC5iLnQgKi8KKyAgezg4LDIxLHIsViwwLDB9LAkvKiBtYXguaC50ICovCisgIHs4OCwyMixyLFYsMCwwfSwJLyogbWF4LncudCAqLworICB7ODgsMjMscixWLDAsMH0sCS8qIG1heC5sLnQgKi8KKyAgezg5LDIwLHIsViwwLDB9LAkvKiBtaW4uYi50ICovCisgIHs4OSwyMSxyLFYsMCwwfSwJLyogbWluLmgudCAqLworICB7ODksMjIscixWLDAsMH0sCS8qIG1pbi53LnQgKi8KKyAgezg5LDIzLHIsViwwLDB9LAkvKiBtaW4ubC50ICovCisgIHs4NCwxOCxyLFYsMCwwfSwJLyogc3VtLnMudCAqLworICB7ODQsMTkscixWLDAsMH0sCS8qIHN1bS5kLnQgKi8KKyAgezkwLDE4LHIsViwwLDB9LAkvKiBwcm9kLnMudCAqLworICB7OTAsMTkscixWLDAsMH0sCS8qIHByb2QuZC50ICovCisgIHs4OCwxOCxyLFYsMCwwfSwJLyogbWF4LnMudCAqLworICB7ODgsMTkscixWLDAsMH0sCS8qIG1heC5kLnQgKi8KKyAgezg5LDE4LHIsViwwLDB9LAkvKiBtaW4ucy50ICovCisgIHs4OSwxOSxyLFYsMCwwfSwJLyogbWluLmQudCAqLworICB7OTAsMjAscixWLDAsMH0sCS8qIHByb2QuYi50ICovCisgIHs5MCwyMSxyLFYsMCwwfSwJLyogcHJvZC5oLnQgKi8KKyAgezkwLDIyLHIsViwwLDB9LAkvKiBwcm9kLncudCAqLworICB7OTAsMjMscixWLDAsMH0sCS8qIHByb2QubC50ICovCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCisgIHswLDAsMCwwLDAsMH0sCit9OworCitjaGFyICpsb3BbXSA9IHsKKyAgIm1vdiIsCS8qIDAgKi8KKyAgIm1lcmciLAkvKiAxICovCisgICJtYXNrIiwJLyogMiAqLworICAibXVsIiwJLyogMyAqLworICAiZGl2IiwJLyogNCAqLworICAiYW5kIiwJLyogNSAqLworICAib3IiLAkvKiA2ICovCisgICJ4b3IiLAkvKiA3ICovCisgICJzaGYiLAkvKiA4ICovCisgICJhZGQiLAkvKiA5ICovCisgICJzdWIiLAkvKiAxMCAqLworICAiZXhpdCIsCS8qIDExICovCisgICJqbXAiLAkvKiAxMiAqLworICAiam1waSIsCS8qIDEzICovCisgICJqbXBhIiwJLyogMTQgKi8KKyAgImptcHMiLAkvKiAxNSAqLworICAidGFjIiwJLyogMTYgKi8KKyAgImxkZWEiLAkvKiAxNyAqLworICAibGQiLAkvKiAxOCAqLworICAidGFzIiwJLyogMTkgKi8KKyAgInBzaGVhIiwJLyogMjAgKi8KKyAgInN0IiwJLyogMjEgKi8KKyAgImNhbGwiLAkvKiAyMiAqLworICAiY2FsbHMiLAkvKiAyMyAqLworICAiY2FsbHEiLAkvKiAyNCAqLworICAicGZvcmsiLAkvKiAyNSAqLworICAic3RlIiwJLyogMjYgKi8KKyAgImluY3IiLAkvKiAyNyAqLworICAiY3Z0dyIsCS8qIDI4ICovCisgICJjdnRiIiwJLyogMjkgKi8KKyAgImN2dGgiLAkvKiAzMCAqLworICAiY3Z0cyIsCS8qIDMxICovCisgICJjdnRkIiwJLyogMzIgKi8KKyAgImN2dGwiLAkvKiAzMyAqLworICAibGRwYSIsCS8qIDM0ICovCisgICJwbGMiLAkvKiAzNSAqLworICAidHpjIiwJLyogMzYgKi8KKyAgImVxIiwJLyogMzcgKi8KKyAgImxldSIsCS8qIDM4ICovCisgICJsdHUiLAkvKiAzOSAqLworICAibGUiLAkvKiA0MCAqLworICAibHQiLAkvKiA0MSAqLworICAibm90IiwJLyogNDIgKi8KKyAgIm5lZyIsCS8qIDQzICovCisgICJsb3AiLAkvKiA0NCAqLworICAiY3BycyIsCS8qIDQ1ICovCisgICJub3AiLAkvKiA0NiAqLworICAiYnIiLAkvKiA0NyAqLworICAiYnJpIiwJLyogNDggKi8KKyAgImJyYSIsCS8qIDQ5ICovCisgICJicnMiLAkvKiA1MCAqLworICAibGR2aSIsCS8qIDUxICovCisgICJzdHZpIiwJLyogNTIgKi8KKyAgImxkc2RyIiwJLyogNTMgKi8KKyAgImxka2RyIiwJLyogNTQgKi8KKyAgImxuIiwJLyogNTUgKi8KKyAgInBhdHUiLAkvKiA1NiAqLworICAicGF0ZSIsCS8qIDU3ICovCisgICJwaWNoIiwJLyogNTggKi8KKyAgInBsY2giLAkvKiA1OSAqLworICAiaWRsZSIsCS8qIDYwICovCisgICJydG5xIiwJLyogNjEgKi8KKyAgImNmb3JrIiwJLyogNjIgKi8KKyAgInJ0biIsCS8qIDYzICovCisgICJ3Zm9yayIsCS8qIDY0ICovCisgICJqb2luIiwJLyogNjUgKi8KKyAgInJ0bmMiLAkvKiA2NiAqLworICAiZXhwIiwJLyogNjcgKi8KKyAgInNpbiIsCS8qIDY4ICovCisgICJjb3MiLAkvKiA2OSAqLworICAicHNoIiwJLyogNzAgKi8KKyAgInBvcCIsCS8qIDcxICovCisgICJlbmkiLAkvKiA3MiAqLworICAiZHNpIiwJLyogNzMgKi8KKyAgImJrcHQiLAkvKiA3NCAqLworICAibXN5bmMiLAkvKiA3NSAqLworICAibXNraSIsCS8qIDc2ICovCisgICJ4bXRpIiwJLyogNzcgKi8KKyAgInRzdHZ2IiwJLyogNzggKi8KKyAgImRpYWciLAkvKiA3OSAqLworICAicGJrcHQiLAkvKiA4MCAqLworICAic3FydCIsCS8qIDgxICovCisgICJjYXNyIiwJLyogODIgKi8KKyAgImF0YW4iLAkvKiA4MyAqLworICAic3VtIiwJLyogODQgKi8KKyAgImFsbCIsCS8qIDg1ICovCisgICJhbnkiLAkvKiA4NiAqLworICAicGFyaXR5IiwJLyogODcgKi8KKyAgIm1heCIsCS8qIDg4ICovCisgICJtaW4iLAkvKiA4OSAqLworICAicHJvZCIsCS8qIDkwICovCisgICJoYWx0IiwJLyogOTEgKi8KKyAgInN5c2MiLAkvKiA5MiAqLworICAidHJhcCIsCS8qIDkzICovCisgICJ0c3QiLAkvKiA5NCAqLworICAibGNrIiwJLyogOTUgKi8KKyAgInVsayIsCS8qIDk2ICovCisgICJzcGF3biIsCS8qIDk3ICovCisgICJsZGNtciIsCS8qIDk4ICovCisgICJzdGNtciIsCS8qIDk5ICovCisgICJwb3ByIiwJLyogMTAwICovCisgICJwc2hyIiwJLyogMTAxICovCisgICJyY3ZyIiwJLyogMTAyICovCisgICJtYXRtIiwJLyogMTAzICovCisgICJzbmRyIiwJLyogMTA0ICovCisgICJwdXRyIiwJLyogMTA1ICovCisgICJnZXRyIiwJLyogMTA2ICovCisgICJtYXRyIiwJLyogMTA3ICovCisgICJtYXQiLAkvKiAxMDggKi8KKyAgImdldCIsCS8qIDEwOSAqLworICAicmN2IiwJLyogMTEwICovCisgICJpbmMiLAkvKiAxMTEgKi8KKyAgInB1dCIsCS8qIDExMiAqLworICAic25kIiwJLyogMTEzICovCisgICJlbmFsIiwJLyogMTE0ICovCisgICJlbmFnIiwJLyogMTE1ICovCisgICJmcmludCIsCS8qIDExNiAqLworICAieHBuZCIsCS8qIDExNyAqLworICAiY3Ryc2wiLAkvKiAxMTggKi8KKyAgImN0cnNnIiwJLyogMTE5ICovCisgICJzdG9wIiwJLyogMTIwICovCit9OworCitjaGFyICpyb3BbXSA9IHsKKyAgIiIsCS8qIDAgKi8KKyAgIi50IiwJLyogMSAqLworICAiLmYiLAkvKiAyICovCisgICIucyIsCS8qIDMgKi8KKyAgIi5kIiwJLyogNCAqLworICAiLmIiLAkvKiA1ICovCisgICIuaCIsCS8qIDYgKi8KKyAgIi53IiwJLyogNyAqLworICAiLmwiLAkvKiA4ICovCisgICIueCIsCS8qIDkgKi8KKyAgIi51IiwJLyogMTAgKi8KKyAgIi5zLmYiLAkvKiAxMSAqLworICAiLmQuZiIsCS8qIDEyICovCisgICIuYi5mIiwJLyogMTMgKi8KKyAgIi5oLmYiLAkvKiAxNCAqLworICAiLncuZiIsCS8qIDE1ICovCisgICIubC5mIiwJLyogMTYgKi8KKyAgIi50LmYiLAkvKiAxNyAqLworICAiLnMudCIsCS8qIDE4ICovCisgICIuZC50IiwJLyogMTkgKi8KKyAgIi5iLnQiLAkvKiAyMCAqLworICAiLmgudCIsCS8qIDIxICovCisgICIudy50IiwJLyogMjIgKi8KKyAgIi5sLnQiLAkvKiAyMyAqLworICAiLnQudCIsCS8qIDI0ICovCit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvZDEwdi5oIGIvaW5jbHVkZS9vcGNvZGUvZDEwdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzRjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9kMTB2LmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qIGQxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgRDEwViBvcGNvZGUgdGFibGUKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKSwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBEMTBWX0gKKyNkZWZpbmUgRDEwVl9ICisKKy8qIEZvcm1hdCBTcGVjaWZpZXIgKi8KKyNkZWZpbmUgRk0wMAkwCisjZGVmaW5lIEZNMDEJMHg0MDAwMDAwMAorI2RlZmluZSBGTTEwCTB4ODAwMDAwMDAKKyNkZWZpbmUgRk0xMQkweEMwMDAwMDAwCisKKyNkZWZpbmUgTk9QIDB4NWUwMAorI2RlZmluZSBPUENPREVfRElWUwkweDE0MDAyODAwCisKKy8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQxMHZfb3Bjb2RlLiAgKi8KKworc3RydWN0IGQxMHZfb3Bjb2RlCit7CisgIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogdGhlIG9wY29kZSBmb3JtYXQgKi8KKyAgaW50IGZvcm1hdDsKKworICAvKiBUaGVzZSBudW1iZXJzIHdlcmUgcGlja2VkIHNvIHdlIGNhbiBkbyBpZiggaSAmIFNIT1JUX09QQ09ERSkgKi8KKyNkZWZpbmUgU0hPUlRfT1BDT0RFIDEKKyNkZWZpbmUgTE9OR19PUENPREUgIDgKKyNkZWZpbmUgU0hPUlRfMgkgICAgIDEJCS8qIHNob3J0IHdpdGggMiBvcGVyYW5kcyAqLworI2RlZmluZSBTSE9SVF9CCSAgICAgMwkJLyogc2hvcnQgd2l0aCA4LWJpdCBicmFuY2ggKi8KKyNkZWZpbmUgTE9OR19CCSAgICAgOAkJLyogbG9uZyB3aXRoIDE2LWJpdCBicmFuY2ggKi8KKyNkZWZpbmUgTE9OR19MICAgICAgIDEwCQkvKiBsb25nIHdpdGggMyBvcGVyYW5kcyAqLworI2RlZmluZSBMT05HX1IgICAgICAgMTIJCS8qIHJlc2VydmVkICovCisKKyAgLyoganVzdCBhIHBsYWNlaG9sZGVyIGZvciB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb25zICovCisgIC8qIGZvciBleGFtcGxlLCAiYnJhIiB3aWxsIGJlIGEgZmFrZSBmb3IgImJyYS5zIiBhbmQgYnJhLmwiICovCisgIC8qIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgZm9sbG93IGluIHRoZSBvcGNvZGUgdGFibGUuICAqLworI2RlZmluZSBPUENPREVfRkFLRSAgMzIKKworICAvKiB0aGUgbnVtYmVyIG9mIGN5Y2xlcyAqLworICBpbnQgY3ljbGVzOworCisgIC8qIHRoZSBleGVjdXRpb24gdW5pdChzKSB1c2VkICovCisgIGludCB1bml0OworI2RlZmluZSBFSVRIRVIJMAorI2RlZmluZSBJVQkxCisjZGVmaW5lIE1VCTIKKyNkZWZpbmUgQk9USAkzCisKKyAgLyogZXhlY3V0aW9uIHR5cGU7IHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwgKi8KKyAgLyogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlY2lkZSBpZiB0d28gaW5zdHJ1Y3Rpb25zICovCisgIC8qIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCAqLworICBpbnQgZXhlY190eXBlOworI2RlZmluZSBQQVJPTkxZIDEJLyogcGFyYWxsZWwgb25seSAqLworI2RlZmluZSBTRVEJMgkvKiBtdXN0IGJlIHNlcXVlbnRpYWwgKi8KKyNkZWZpbmUgUEFSCTQJLyogbWF5IGJlIHBhcmFsbGVsICovCisjZGVmaW5lIEJSQU5DSF9MSU5LIDgJLyogc3Vicm91dGluZSBjYWxsLiAgbXVzdCBiZSBhbGlnbmVkICovCisjZGVmaW5lIFJNRU0gICAgIDE2CS8qIHJlYWRzIG1lbW9yeSAqLworI2RlZmluZSBXTUVNICAgICAzMgkvKiB3cml0ZXMgbWVtb3J5ICovCisjZGVmaW5lIFJGMCAgICAgIDY0CS8qIHJlYWRzIGYwICovCisjZGVmaW5lIFdGMCAgICAgMTI4CS8qIG1vZGlmaWVzIGYwICovCisjZGVmaW5lIFdDQVIgICAgMjU2CS8qIHdyaXRlIENhcnJ5ICovCisjZGVmaW5lIEJSQU5DSCAgNTEyCS8qIGJyYW5jaCwgbm8gbGluayAqLworCisgIC8qIHRoZSBvcGNvZGUgKi8KKyAgbG9uZyBvcGNvZGU7CisKKyAgLyogbWFzay4gIGlmKCAoaSAmIG1hc2spID09IG9wY29kZSApIHRoZW4gbWF0Y2ggKi8KKyAgbG9uZyBtYXNrOworCisgIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKKyAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAorICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCisgIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbNl07Cit9OworCisvKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCisgICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKKyAgIGluc3RydWN0aW9ucy4gICovCitleHRlcm4gY29uc3Qgc3RydWN0IGQxMHZfb3Bjb2RlIGQxMHZfb3Bjb2Rlc1tdOworZXh0ZXJuIGNvbnN0IGludCBkMTB2X251bV9vcGNvZGVzOworCisvKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQxMHZfb3BlcmFuZC4gICovCitzdHJ1Y3QgZDEwdl9vcGVyYW5kCit7CisgIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCisgIGludCBiaXRzOworCisgIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCisgIGludCBzaGlmdDsKKworICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCisgIGludCBmbGFnczsKK307CisKKy8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KKyAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgZDEwdl9vcGNvZGVzIHRhYmxlLiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMTB2X29wZXJhbmQgZDEwdl9vcGVyYW5kc1tdOworCisvKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IGQxMHZfb3BlcmFuZC4gICovCisKKy8qIHRoZSBvcGVyYW5kIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9FVkVOCSgxKQorCisvKiB0aGUgb3BlcmFuZCBtdXN0IGJlIGFuIG9kZCBudW1iZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9PREQJKDIpCQorCisvKiB0aGlzIGlzIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlcjsgaXQgd2lsbCBiZSBtb2RpZmllZCAqLworLyogdGhpcyBpcyB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9ERVNUCSg0KQorCisvKiBudW1iZXIgb3Igc3ltYm9sICovCisjZGVmaW5lIE9QRVJBTkRfTlVNCSg4KQorCisvKiBhZGRyZXNzIG9yIGxhYmVsICovCisjZGVmaW5lIE9QRVJBTkRfQUREUgkoMHgxMCkKKworLyogcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9SRUcJKDB4MjApCisKKy8qIHBvc3RpbmNyZW1lbnQgKyAgKi8KKyNkZWZpbmUgT1BFUkFORF9QTFVTCSgweDQwKQorCisvKiBwb3N0ZGVjcmVtZW50IC0gICovCisjZGVmaW5lIE9QRVJBTkRfTUlOVVMJKDB4ODApCisKKy8qIEAgICovCisjZGVmaW5lIE9QRVJBTkRfQVRTSUdOCSgweDEwMCkKKworLyogQCggICovCisjZGVmaW5lIE9QRVJBTkRfQVRQQVIJKDB4MjAwKQorCisvKiBhY2N1bXVsYXRvciAwICovCisjZGVmaW5lIE9QRVJBTkRfQUNDMAkoMHg0MDApCisKKy8qIGFjY3VtdWxhdG9yIDEgKi8KKyNkZWZpbmUgT1BFUkFORF9BQ0MxCSgweDgwMCkKKworLyogZjAgLyBmMSBmbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lIE9QRVJBTkRfRkZMQUcJKDB4MTAwMCkKKworLyogYyBmbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lIE9QRVJBTkRfQ0ZMQUcJKDB4MjAwMCkKKworLyogY29udHJvbCByZWdpc3RlciAgKi8KKyNkZWZpbmUgT1BFUkFORF9DT05UUk9MCSgweDQwMDApCisKKy8qIHByZWRlY3JlbWVudCBtb2RlICdALXNwJyAgKi8KKyNkZWZpbmUgT1BFUkFORF9BVE1JTlVTCSgweDgwMDApCisKKy8qIHNpZ25lZCBudW1iZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9TSUdORUQJKDB4MTAwMDApCisKKy8qIHNwZWNpYWwgYWNjdW11bGF0b3Igc2hpZnRzIG5lZWQgYSA0LWJpdCBudW1iZXIgKi8KKy8qIDEgPD0geCA8PSAxNiAqLworI2RlZmluZSBPUEVSQU5EX1NISUZUCSgweDIwMDAwKQorCisvKiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9HUFIJKDB4NDAwMDApCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KK3N0cnVjdCBwZF9yZWcKK3sKKyAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCisgIGNoYXIgKnBuYW1lOwkJLyogbmFtZSB0byBwcmludCBmb3IgdGhpcyByZWdpc3RlciAqLworICBpbnQgdmFsdWU7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHBkX3JlZyBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW107CitpbnQgZDEwdl9yZWdfbmFtZV9jbnQoKTsKKworLyogYW4gZXhwcmVzc2lvblMgb25seSBoYXMgb25lIHJlZ2lzdGVyIHR5cGUsIHNvIHdlIGZha2UgaXQgKi8KKy8qIGJ5IHNldHRpbmcgaGlnaCBiaXRzIHRvIGluZGljYXRlIHR5cGUgKi8KKyNkZWZpbmUgUkVHSVNURVJfTUFTSwkweEZGCisKKyNlbmRpZiAvKiBEMTBWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODI4ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvZDMwdi5oCkBAIC0wLDAgKzEsMjczIEBACisvKiBkMzB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIEQzMFYgb3Bjb2RlIHRhYmxlCisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSksIEN5Z251cyBTb2x1dGlvbnMKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBEMzBWX0gKKyNkZWZpbmUgRDMwVl9ICisKKyNkZWZpbmUgTk9QIDB4MDBGMDAwMDAKKworLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLworc3RydWN0IHBkX3JlZworeworICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KKyAgY2hhciAqcG5hbWU7CQkvKiBuYW1lIHRvIHByaW50IGZvciB0aGlzIHJlZ2lzdGVyICovCisgIGludCB2YWx1ZTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdOworaW50IHJlZ19uYW1lX2NudCgpOworCisvKiB0aGUgbnVtYmVyIG9mIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1BWF9DT05UUk9MX1JFRwk2NAorCisvKiBkZWZpbmUgdGhlIGZvcm1hdCBzcGVjaWZpZXJzICovCisjZGVmaW5lIEZNMDAJMAorI2RlZmluZSBGTTAxCTB4ODAwMDAwMDAKKyNkZWZpbmUgRk0xMAkweDgwMDAwMDAwMDAwMDAwMDBMTAorI2RlZmluZSBGTTExCTB4ODAwMDAwMDA4MDAwMDAwMExMCisKKy8qIGRlZmluZSB0aGUgb3Bjb2RlIGNsYXNzZXMgKi8KKyNkZWZpbmUgQlJBCTAKKyNkZWZpbmUgTE9HSUMJMQorI2RlZmluZSBJTUVNCTIKKyNkZWZpbmUgSUFMVTEJNAorI2RlZmluZSBJQUxVMgk1CisKKy8qIGRlZmluZSB0aGUgZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlcyAqLworI2RlZmluZSBFQ0NfQUwJMAkvKiBBTHdheXMgKGRlZmF1bHQpICovCisjZGVmaW5lIEVDQ19UWAkxCS8qIEYwPVRydWUsIEYxPURvbid0IGNhcmUgKi8KKyNkZWZpbmUgRUNDX0ZYCTIJLyogRjA9RmFsc2UsIEYxPURvbid0IGNhcmUgKi8KKyNkZWZpbmUgRUNDX1hUCTMJLyogRjA9RG9uJ3QgY2FyZSwgRjE9VHJ1ZSAqLworI2RlZmluZSBFQ0NfWEYJNAkvKiBGMD1Eb24ndCBjYXJlLCBGMT1GYWxzZSAqLworI2RlZmluZSBFQ0NfVFQJNQkvKiBGMD1UcnVlLCBGMT1UcnVlICovCisjZGVmaW5lIEVDQ19URgk2CS8qIEYwPVRydWUsIEYxPUZhbHNlICovCisjZGVmaW5lIEVDQ19SRVNFUlZFRAk3CS8qIHJlc2VydmVkICovCisjZGVmaW5lIEVDQ19NQVgJRUNDX1JFU0VSVkVECisKK2V4dGVybiBjb25zdCBjaGFyICpkMzB2X2VjY19uYW1lc1tdOworCisvKiBjb25kaXRpb24gY29kZSB0YWJsZSBmb3IgQ01QIGFuZCBDTVBVICovCitleHRlcm4gY29uc3QgY2hhciAqZDMwdl9jY19uYW1lc1tdOworCisvKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMzB2X29wY29kZS4gICovCitzdHJ1Y3QgZDMwdl9vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiB0aGUgb3Bjb2RlICovCisgIGludCBvcDE7CS8qIGZpcnN0IHBhcnQsICJJQUxVMSIgZm9yIGV4YW1wbGUgKi8KKyAgaW50IG9wMjsJLyogdGhlIHJlc3Qgb2YgdGhlIG9wY29kZSAqLworCisgIC8qIG9wY29kZSBmb3JtYXQocykuICBUaGVzZSBudW1iZXJzIGNvcnJlc3BvbmQgdG8gZW50cmllcyAqLworICAvKiBpbiB0aGUgZDMwdl9mb3JtYXRfdGFibGUgKi8KKyAgdW5zaWduZWQgY2hhciBmb3JtYXRbNF07CisKKyNkZWZpbmUgU0hPUlRfTQkJMQorI2RlZmluZSBTSE9SVF9NMgk1CS8qIGZvciBsZDJ3IGFuZCBzdDJ3ICovCisjZGVmaW5lIFNIT1JUX0EJCTkKKyNkZWZpbmUgU0hPUlRfQjEJMTEKKyNkZWZpbmUgU0hPUlRfQjIJMTIKKyNkZWZpbmUgU0hPUlRfQjMJMTMKKyNkZWZpbmUgU0hPUlRfQjNiCTE1CisjZGVmaW5lIFNIT1JUX0QxCTE3CisjZGVmaW5lIFNIT1JUX0QyCTE5CisjZGVmaW5lIFNIT1JUX0QyQgkyMQorI2RlZmluZSBTSE9SVF9VCQkyMwkvKiB1bmFyeSBTSE9SVF9BLiAgQUJTIGZvciBleGFtcGxlICovCisjZGVmaW5lIFNIT1JUX0YJCTI1CS8qIFNIT1JUX0Egd2l0aCBmbGFnIHJlZ2lzdGVycyAqLworI2RlZmluZSBTSE9SVF9BRgkyNwkvKiBTSE9SVF9BIHdpdGggb25seSB0aGUgZmlyc3QgcmVnaXN0ZXIgYSBmbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lIFNIT1JUX1QJCTI5CS8qIGZvciB0cmFwIGluc3RydWN0aW9uICovCisjZGVmaW5lIFNIT1JUX0E1CTMwCS8qIFNIT1JUX0Egd2l0aCBhIDUtYml0IGltbWVkaWF0ZSBpbnN0ZWFkIG9mIDYgKi8KKyNkZWZpbmUgU0hPUlRfQ01QCTMyCS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QY2MgKi8KKyNkZWZpbmUgU0hPUlRfQ01QVQkzNAkvKiBzcGVjaWFsIGZvcm0gZm9yIENNUFVjYyAqLworI2RlZmluZSBTSE9SVF9BMQkzNgkvKiBzcGVjaWFsIGZvcm0gb2YgU0hPUlRfQSBmb3IgTUFDYSBvcGNvZGVzIHdoZXJlIGE9MSAqLworI2RlZmluZSBTSE9SVF9BQQkzOAkvKiBTSE9SVF9BIHdpdGggdGhlIGZpcnN0IHJlZ2lzdGVyIGFuIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIFNIT1JUX1JBCTQwCS8qIFNIT1JUX0Egd2l0aCB0aGUgc2Vjb25kIHJlZ2lzdGVyIGFuIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIFNIT1JUX01PRElOQwk0MgkKKyNkZWZpbmUgU0hPUlRfTU9EREVDCTQzCisjZGVmaW5lIFNIT1JUX0MxCTQ0CisjZGVmaW5lIFNIT1JUX0MyCTQ1CisjZGVmaW5lIFNIT1JUX1VGCTQ2CisjZGVmaW5lIFNIT1JUX0EyCTQ3CisjZGVmaW5lIFNIT1JUX0E1Uwk0OQorI2RlZmluZSBTSE9SVF9OT05FCTUxCS8qIG5vIG9wZXJhbmRzICovCisjZGVmaW5lIExPTkcJCTUyCisjZGVmaW5lIExPTkdfVQkJNTMJLyogdW5hcnkgTE9ORyAqLworI2RlZmluZSBMT05HX0FGCQk1NAkvKiBMT05HIHdpdGggdGhlIGZpcnN0IHJlZ2lzdGVyIGEgZmxhZyByZWdpc3RlciAqLworI2RlZmluZSBMT05HX0NNUAk1NQkvKiBzcGVjaWFsIGZvcm0gZm9yIENNUGNjIGFuZCBDTVBVY2MgKi8KKyNkZWZpbmUgTE9OR19NCQk1NgkvKiBNZW1vcnkgbG9uZyBmb3IgbGRiLCBzdGIgKi8KKyNkZWZpbmUgTE9OR19NMgkJNTcJLyogTWVtb3J5IGxvbmcgZm9yIGxkMncsIHN0MncgKi8KKyNkZWZpbmUgTE9OR18yCQk1OAkvKiBMT05HIHdpdGggMiBvcGVyYW5kczsgYnJhdG56ICovCisjZGVmaW5lIExPTkdfMmIJCTU5CS8qIExPTkdfMiB3aXRoIG1vZGlmaWVyIG9mIDMgKi8KKyNkZWZpbmUgTE9OR19ECQk2MAkvKiBmb3IgREJSQUkqLworI2RlZmluZSBMT05HX0RiCQk2MQkvKiBmb3IgcmVwZWF0aSovCisKKyAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KKyAgaW50IHVuaXQ7CisjZGVmaW5lIEVJVEhFUgkwCisjZGVmaW5lIElVCTEKKyNkZWZpbmUgTVUJMgorI2RlZmluZSBFSVRIRVJfQlVUX1BSRUZFUl9NVSAzCisKKyAgLyogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlY2lkZSBpZiB0d28gaW5zdHJ1Y3Rpb25zICovCisgIC8qIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCAqLworICBsb25nIGZsYWdzX3VzZWQ7CisgIGxvbmcgZmxhZ3Nfc2V0OworI2RlZmluZSBGTEFHXzAJCSgxTDw8MCkKKyNkZWZpbmUgRkxBR18xCQkoMUw8PDEpCisjZGVmaW5lIEZMQUdfMgkJKDFMPDwyKQorI2RlZmluZSBGTEFHXzMJCSgxTDw8MykKKyNkZWZpbmUgRkxBR180CQkoMUw8PDQpCQkvKiBTIChzYXR1cmF0aW9uKSAqLworI2RlZmluZSBGTEFHXzUJCSgxTDw8NSkJCS8qIFYgKG92ZXJmbG93KSAqLworI2RlZmluZSBGTEFHXzYJCSgxTDw8NikJCS8qIFZBIChhY2N1bXVsYXRlZCBvdmVyZmxvdykgKi8KKyNkZWZpbmUgRkxBR183CQkoMUw8PDcpCQkvKiBDIChjYXJyeS9ib3Jyb3cpICovCisjZGVmaW5lIEZMQUdfU00JCSgxTDw8OCkJCS8qIFNNIChzdGFjayBtb2RlKSAqLworI2RlZmluZSBGTEFHX1JQCQkoMUw8PDkpCQkvKiBSUCAocmVwZWF0IGVuYWJsZSkgKi8KKyNkZWZpbmUgRkxBR19DT05UUk9MCSgxTDw8MTApCS8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEZMQUdfQTAJCSgxTDw8MTEpCS8qIEEwICovCisjZGVmaW5lIEZMQUdfQTEJCSgxTDw8MTIpCS8qIEExICovCisjZGVmaW5lIEZMQUdfSk1QCSgxTDw8MTMpCS8qIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoICovCisjZGVmaW5lIEZMQUdfSlNSCSgxTDw8MTQpCS8qIHN1YnJvdXRpbmUgY2FsbC4gIG11c3QgYmUgYWxpZ25lZCAqLworI2RlZmluZSBGTEFHX01FTQkoMUw8PDE1KQkvKiByZWFkcy93cml0ZXMgbWVtb3J5ICovCisjZGVmaW5lIEZMQUdfMldPUkQJKDFMPDwxNikJLyogMiB3b3JkLzQgYnl0ZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkxBR19NVUwxNgkoMUw8PDE3KQkvKiAxNiBiaXQgbXVsdGlwbHkgKi8KKyNkZWZpbmUgRkxBR19NVUwzMgkoMUw8PDE4KQkvKiAzMiBiaXQgbXVsdGlwbHkgKi8KKyNkZWZpbmUgRkxBR19BRERTVUJwcHAJKDFMPDwxOSkJLyogQUREcHBwIG9yIFNVQnBwcCAqLworI2RlZmluZSBGTEFHX0RFTEFZCSgxTDw8MjApCS8qIFRoaXMgaXMgYSBkZWxheWVkIGJyYW5jaCBvciBqdW1wICovCisjZGVmaW5lIEZMQUdfTEtSCSgxTDw8MjEpCS8qIGluc24gaW4gbGVmdCBzbG90IGtpbGxzIHJpZ2h0IHNsb3QgKi8KKyNkZWZpbmUgRkxBR19DVlZBCShGTEFHXzV8RkxBR182fEZMQUdfNykKKyNkZWZpbmUgRkxBR19DCQlGTEFHXzcKKyNkZWZpbmUgRkxBR19BTEwJKEZMQUdfMCB8IFwKKwkJCSBGTEFHXzEgfCBcCisJCQkgRkxBR18yIHwgXAorCQkJIEZMQUdfMyB8IFwKKwkJCSBGTEFHXzQgfCBcCisJCQkgRkxBR181IHwgXAorCQkJIEZMQUdfNiB8IFwKKwkJCSBGTEFHXzcgfCBcCisJCQkgRkxBR19TTSB8IFwKKwkJCSBGTEFHX1JQIHwgXAorCQkJIEZMQUdfQ09OVFJPTCkKKworICBpbnQgcmVsb2NfZmxhZzsKKyNkZWZpbmUgUkVMT0NfUENSRUwJMQorI2RlZmluZSBSRUxPQ19BQlMJMgorfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wY29kZSBkMzB2X29wY29kZV90YWJsZVtdOworZXh0ZXJuIGNvbnN0IGludCBkMzB2X251bV9vcGNvZGVzOworCisvKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3BlcmFuZC4gICovCitzdHJ1Y3QgZDMwdl9vcGVyYW5kCit7CisgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkICovCisgIGludCBsZW5ndGg7CisKKyAgLyogVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KKyAgaW50IGJpdHM7CisKKyAgLyogcG9zaXRpb24gcmVsYXRpdmUgdG8gUmEgKi8KKyAgaW50IHBvc2l0aW9uOworCisgIC8qIHN5bnRheCBmbGFncy4gICovCisgIGxvbmcgZmxhZ3M7Cit9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wZXJhbmQgZDMwdl9vcGVyYW5kX3RhYmxlW107CisKKy8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KKworLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KKy8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCisjZGVmaW5lIE9QRVJBTkRfREVTVAkoMSkKKworLyogbnVtYmVyIG9yIHN5bWJvbCAqLworI2RlZmluZSBPUEVSQU5EX05VTQkoMikKKworLyogYWRkcmVzcyBvciBsYWJlbCAqLworI2RlZmluZSBPUEVSQU5EX0FERFIJKDQpCisKKy8qIHJlZ2lzdGVyICovCisjZGVmaW5lIE9QRVJBTkRfUkVHCSg4KQorCisvKiBwb3N0aW5jcmVtZW50ICsgICovCisjZGVmaW5lIE9QRVJBTkRfUExVUwkoMHgxMCkKKworLyogcG9zdGRlY3JlbWVudCAtICAqLworI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDIwKQorCisvKiBzaWduZWQgbnVtYmVyICovCisjZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDQwKQorCisvKiB0aGlzIG9wZXJhbmQgbXVzdCBiZSBzaGlmdGVkIGxlZnQgYnkgMyAqLworI2RlZmluZSBPUEVSQU5EX1NISUZUCSgweDgwKQorCisvKiBmbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lIE9QRVJBTkRfRkxBRwkoMHgxMDApCisKKy8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCisjZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHgyMDApCisKKy8qIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIE9QRVJBTkRfQUNDCSgweDQwMCkKKworLyogQCAgKi8KKyNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4ODAwKQorCisvKiBAKCAgKi8KKyNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgxMDAwKQorCisvKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCisjZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHgyMDAwKQorCisvKiB0aGlzIG9wZXJhbmQgY2hhbmdlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZSAqLworLyogZm9yIGV4YW1wbGUsIENQTWNjLCBDTVBVY2MgKi8KKyNkZWZpbmUgT1BFUkFORF9OQU1FCSgweDQwMDApCisKKy8qIGZha2Ugb3BlcmFuZCBmb3IgbXZ0c3lzIGFuZCBtdmZzeXMgKi8KKyNkZWZpbmUgT1BFUkFORF9TUEVDSUFMCSgweDgwMDApCisKKy8qIGxldCB0aGUgb3B0aW1pemVyIGtub3cgdGhhdCB0d28gcmVnaXN0ZXJzIGFyZSBhZmZlY3RlZCAqLworI2RlZmluZSBPUEVSQU5EXzJSRUcJKDB4MTAwMDApCisKKy8qIFRoZSBmb3JtYXQgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfZm9ybWF0LiAgKi8KK3N0cnVjdCBkMzB2X2Zvcm1hdAoreworICBpbnQJZm9ybTsJCS8qIFNIT1JUX0EsIExPTkcsIGV0YyAqLworICBpbnQJbW9kaWZpZXI7CS8qIHR3byBiaXQgbW9kaWZpZXIgZm9sbG93aW5nIG9wY29kZSAqLworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzVdOworfTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZDMwdl9mb3JtYXQgZDMwdl9mb3JtYXRfdGFibGVbXTsKKworCisvKiBhbiBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGJ5IGFuIG9wY29kZSBhbmQgYSBmb3JtYXQgKi8KKy8qIGZvciBleGFtcGxlLCAiYWRkIiBoYXMgb25lIG9wY29kZSwgYnV0IHRocmVlIGRpZmZlcmVudCAqLworLyogZm9ybWF0cywgMiBTSE9SVF9BIGZvcm1zIGFuZCBhIExPTkcgZm9ybS4gKi8KK3N0cnVjdCBkMzB2X2luc24KK3sKKyAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcDsJLyogcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlICovCisgIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm9ybTsJLyogcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZm9ybWF0IHRhYmxlICovCisgIGludCBlY2M7CQkJLyogZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlICovCit9OworCisvKiBhbiBleHByZXNzaW9uUyBvbmx5IGhhcyBvbmUgcmVnaXN0ZXIgdHlwZSwgc28gd2UgZmFrZSBpdCAqLworLyogYnkgc2V0dGluZyBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgdHlwZSAqLworI2RlZmluZSBSRUdJU1RFUl9NQVNLCTB4RkYKKworI2VuZGlmIC8qIEQzMFZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwNWU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEg4LTMwMAorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCisgICAKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlciBhbmQgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGFzIGEgc2VxdWVuY2Ugb2YgbmliYmxlcy4KKyAgIElmIHRoZSBuaWJibGUgaGFzIHZhbHVlIDE1IG9yIGxlc3MgdGhlbiB0aGUgcmVwcmVzZW50YXRpb24gaXMgY29tcGxldGUuCisgICBPdGhlcndpc2UsIHdlIHJlY29yZCB3aGF0IGl0IGNvbnRhaW5zIHdpdGggc2V2ZXJhbCBmbGFncy4gICovCisKK3R5cGVkZWYgaW50IG9wX3R5cGU7CisKKyNkZWZpbmUgSGV4MAkwCisjZGVmaW5lIEhleDEgCTEKKyNkZWZpbmUgSGV4MiAJMgorI2RlZmluZSBIZXgzIAkzCisjZGVmaW5lIEhleDQgCTQKKyNkZWZpbmUgSGV4NSAJNQorI2RlZmluZSBIZXg2IAk2CisjZGVmaW5lIEhleDcgCTcKKyNkZWZpbmUgSGV4OCAJOAorI2RlZmluZSBIZXg5IAk5CisjZGVmaW5lIEhleEEgCTEwCisjZGVmaW5lIEhleEIgCTExCisjZGVmaW5lIEhleEMgCTEyCisjZGVmaW5lIEhleEQgCTEzCisjZGVmaW5lIEhleEUgCTE0CisjZGVmaW5lIEhleEYgCTE1CisKKyNkZWZpbmUgTF84CQkweDAxCisjZGVmaW5lIExfMTYJCTB4MDIKKyNkZWZpbmUgTF8zMgkJMHgwNAorI2RlZmluZSBMX1AgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBMXzI0CQkweDEwCisjZGVmaW5lIE1FTVJFTEFYIAkweDIwCQkJLyogbW92ZSBpbnNuIHdoaWNoIG1heSByZWxheCAqLyAKKyNkZWZpbmUgU1JDICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRFNUICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBSRUcJCTB4MTAwCisjZGVmaW5lIEVYUgkJMHgyMDAKKyNkZWZpbmUgTUFDUkVHCQkweDgwMAorI2RlZmluZSBTUkNfSU5fRFNUCTB4NDAwCisjZGVmaW5lIElNTQkJMHgxMDAwCisjZGVmaW5lIERJU1AJCTB4MjAwMAorI2RlZmluZSBJTkQJCTB4NDAwMAorI2RlZmluZSBJTkMJCTB4ODAwMAorI2RlZmluZSBERUMJCTB4MTAwMDAKKyNkZWZpbmUgTF8zCQkweDIwMDAwCisjZGVmaW5lIEtCSVQgCQkweDQwMDAwCisjZGVmaW5lIERCSVQgICAgICAgICAgICAweDgwMDAwCisjZGVmaW5lIERJU1BSRUcgICAgICAgICAweDEwMDAwMAorI2RlZmluZSBJR05PUkUgCQkweDIwMDAwMAorI2RlZmluZSBFICAgICAgCQkweDQwMDAwMAkJLyogRklYTUU6IGVuZCBvZiBuaWJibGUgc2VxdWVuY2U/ICovCisjZGVmaW5lIExfMgkJMHg4MDAwMDAKKyNkZWZpbmUgQjMwICAJCTB4MTAwMDAwMCAJCS8qIGJpdCAzIG11c3QgYmUgbG93ICovCisjZGVmaW5lIEIzMSAgCQkweDIwMDAwMDAJCS8qIGJpdCAzIG11c3QgYmUgaGlnaCAqLworI2RlZmluZSBDQ1IJCTB4NDAwMDAwMAorI2RlZmluZSBBQlMgICAgICAgICAgICAgMHg4MDAwMDAwCisjZGVmaW5lIEFCU0pNUAkJMHgxMDAwMDAwMCAgCisjZGVmaW5lIEFCUzhNRU0gICAgICAgICAweDIwMDAwMDAwCQorI2RlZmluZSBQQ1JFTCAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBNRU1JTkQgICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIElNTTMgCQlJTU18TF8zCisjZGVmaW5lIElNTTIgCQlJTU18TF8yCisKKyNkZWZpbmUgU0laRQkJKExfMnxMXzN8TF84fExfMTZ8TF8zMnxMX1B8TF8yNCkKKyNkZWZpbmUgTU9ERQkJKFJFR3xJTU18RElTUHxJTkR8SU5DfERFQ3xDQ1J8QUJTfE1FTUlORHxFWFIpCisKKyNkZWZpbmUgUkQ4IAkJKERTVHxMXzh8UkVHKQorI2RlZmluZSBSRDE2IAkJKERTVHxMXzE2fFJFRykKKyNkZWZpbmUgUkQzMiAJCShEU1R8TF8zMnxSRUcpCisjZGVmaW5lIFJTOCAJCShTUkN8TF84fFJFRykKKyNkZWZpbmUgUlMxNiAJCShTUkN8TF8xNnxSRUcpCisjZGVmaW5lIFJTMzIJCShTUkN8TF8zMnxSRUcpCisKKyNkZWZpbmUgUlNQIAkJKFNSQ3xMX1B8UkVHKQorI2RlZmluZSBSRFAgCQkoRFNUfExfUHxSRUcpCisKKyNkZWZpbmUgSU1NOCAJCShJTU18U1JDfExfOCkKKyNkZWZpbmUgSU1NMTYgCQkoSU1NfFNSQ3xMXzE2KQorI2RlZmluZSBJTU0zMiAJCShJTU18U1JDfExfMzIpCisKKyNkZWZpbmUgQUJTOFNSQyAJKFNSQ3xBQlN8TF84fEFCUzhNRU0pCisjZGVmaW5lIEFCUzhEU1QJCShEU1R8QUJTfExfOHxBQlM4TUVNKQorCisjZGVmaW5lIERJU1A4IAkJKFBDUkVMfExfOCkKKyNkZWZpbmUgRElTUDE2IAkJKFBDUkVMfExfMTYpCisKKyNkZWZpbmUgRElTUDhTUkMJKERJU1B8TF84fFNSQykKKyNkZWZpbmUgRElTUDE2U1JDCShESVNQfExfMTZ8U1JDKQorCisjZGVmaW5lIERJU1A4RFNUCShESVNQfExfOHxEU1QpCisjZGVmaW5lIERJU1AxNkRTVAkoRElTUHxMXzE2fERTVCkKKworI2RlZmluZSBBQlMxNlNSQyAJKFNSQ3xBQlN8TF8xNikKKyNkZWZpbmUgQUJTMTZEU1QgCShEU1R8QUJTfExfMTYpCisjZGVmaW5lIEFCUzI0U1JDIAkoU1JDfEFCU3xMXzI0KQorI2RlZmluZSBBQlMyNERTVCAJKERTVHxBQlN8TF8yNCkKKyNkZWZpbmUgQUJTMzJTUkMgCShTUkN8QUJTfExfMzIpCisjZGVmaW5lIEFCUzMyRFNUIAkoRFNUfEFCU3xMXzMyKQorCisjZGVmaW5lIFJEREVDIAkJKERTVHxERUMpCisjZGVmaW5lIFJTSU5DIAkJKFNSQ3xJTkMpCisjZGVmaW5lIFJESU5DCQkoRFNUfElOQykKKworI2RlZmluZSBSRElORCAJCShEU1R8SU5EKQorI2RlZmluZSBSU0lORCAJCShTUkN8SU5EKQorCisjaWYgMQorI2RlZmluZSBPUjggUlM4CQkvKiA/Pz8gT1IgYXMgaW4gT25lIFJlZ2lzdGVyPyAqLworI2RlZmluZSBPUjE2IFJTMTYKKyNkZWZpbmUgT1IzMiBSUzMyCisjZWxzZQorI2RlZmluZSBPUjggUkQ4CisjZGVmaW5lIE9SMTYgUkQxNgorI2RlZmluZSBPUjMyIFJEMzIKKyNlbmRpZgorCitzdHJ1Y3QgY29kZSAKK3sKKyAgb3BfdHlwZSBuaWJbMzBdOworfTsKKworc3RydWN0IGFyZyAKK3sKKyAgb3BfdHlwZSBuaWJbM107Cit9OworCitzdHJ1Y3QgaDhfb3Bjb2RlIAoreworICBpbnQgaG93OworICBpbnQgaW5iYXNlOworICBpbnQgdGltZTsKKyAgY2hhciAqbmFtZTsKKyAgc3RydWN0IGFyZyBhcmdzOworICBzdHJ1Y3QgY29kZSBkYXRhOworICBpbnQgbGVuZ3RoOworICBpbnQgbm9wZXJhbmRzOworICBpbnQgaWR4OworICBpbnQgc2l6ZTsKK307CisKKyNpZmRlZiBERUZJTkVfVEFCTEUKKworI2RlZmluZSBCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCit7IGNvZGUsIDEsIDIsIG5hbWUsCXt7aW1tLFJEOCxFfX0sCXt7b3AwMCwgb3AwMSwgaW1tLCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sXAoreyBjb2RlLCAxLCA2LCBuYW1lLAl7e2ltbSxSRElORCxFfX0se3tvcDEwLCBvcDExLCBCMzB8UkRJTkQsIDAsIG9wMDAsb3AwMSwgaW1tLCAwLCBFfX0sIDAsIDAsIDAsIDB9LFwKK3sgY29kZSwgMSwgNiwgbmFtZSwJe3tpbW0sQUJTOERTVCxFfX0se3tvcDIwLCBvcDIxLCBBQlM4RFNULCBJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH1cCisseyBjb2RlLCAwLCA2LCBuYW1lLAl7e2ltbSxBQlMxNkRTVCxFfX0se3sweDYsMHhhLDB4MSxvcDMwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9LFwKK3sgY29kZSwgMCwgNiwgbmFtZSwJe3tpbW0sQUJTMzJEU1QsRX19LHt7MHg2LDB4YSwweDMsb3AzMCxBQlMzMkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsIG9wMDAsb3AwMSwgaW1tLCAwLEV9fSwgMCwgMCwgMCwgMH0KKworCisjZGVmaW5lIEVCSVRPUChjb2RlLCBpbW0sIG5hbWUsIG9wMDAsIG9wMDEsb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMClcCisgICBCSVRPUChjb2RlLGltbSwgbmFtZSwgb3AwMCsxLCBvcDAxLCBvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKSxcCisgICBCSVRPUChjb2RlLFJTOCwgIG5hbWUsIG9wMDAsIG9wMDEsIG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApCisKKyNkZWZpbmUgV1RXT1AoY29kZSxuYW1lLCBvcDEsIG9wMikgXAoreyBjb2RlLCAxLCAyLCBuYW1lLCB7e1JTMTYsIFJEMTYsIEV9fSwge3sgb3AxLCBvcDIsIFJTMTYsIFJEMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KKworI2RlZmluZSBCUkFOQ0goY29kZSwgbmFtZSwgb3ApIFwKK3sgY29kZSwgMSwgNCxuYW1lLHt7RElTUDgsRSwwfX0sIHt7IDB4NCwgb3AsIERJU1A4LCBJR05PUkUsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKK3sgY29kZSwgMCwgNixuYW1lLHt7RElTUDE2LEUsMH19LCB7eyAweDUsIDB4OCwgb3AsIDB4MCwgRElTUDE2LCBJR05PUkUsIElHTk9SRSwgSUdOT1JFLCBFLDB9fSwgMCwgMCwgMCwgMH0gCisKKyNkZWZpbmUgU09QKGNvZGUsIHgsbmFtZSkgXAore2NvZGUsIDEsIHgsICBuYW1lIAorCisjZGVmaW5lIE5FV19TT1AoY29kZSwgaW4seCxuYW1lKSBcCit7Y29kZSwgaW4sIHgsICBuYW1lIAorI2RlZmluZSBFT1AgICwwLDAsMCB9CisKKyNkZWZpbmUgVFdPT1AoY29kZSwgbmFtZSwgb3AxLCBvcDIsb3AzKSBcCit7IGNvZGUsMSwgMixuYW1lLCB7e0lNTTgsIFJEOCwgRX19LAl7eyBvcDEsIFJEOCwgSU1NOCwgSUdOT1JFLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LFwKK3sgY29kZSwgMSwgMixuYW1lLCB7e1JTOCwgUkQ4LCBFfX0sCXt7IG9wMiwgb3AzLCBSUzgsIFJEOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSAKKworI2RlZmluZSBVTk9QKGNvZGUsbmFtZSwgb3AxLCBvcDIpIFwKK3sgY29kZSwgMSwgMiwgbmFtZSwge3tPUjgsIEUsIDB9fSwge3sgb3AxLCBvcDIsIDAsIE9SOCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfQorCisjZGVmaW5lIFVOT1AzKGNvZGUsIG5hbWUsIG9wMSwgb3AyLCBvcDMpIFwKK3sgTyhjb2RlLFNCKSwgMSwgMiwgbmFtZSwge3tPUjgsICBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyswLCBPUjgsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCit7IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7T1IxNiwgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMSwgT1IxNiwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoreyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e09SMzIsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzMsIE9SMzJ8QjMwLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9IFwKKyx7IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7SU1NLCBPUjggfCBTUkNfSU5fRFNULCAgRX19LCB7e29wMSwgb3AyLCBvcDMrNCwgT1I4IHwgU1JDX0lOX0RTVCwgIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKK3sgTyhjb2RlLFNXKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMTYgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys1LCBPUjE2IHwgU1JDX0lOX0RTVCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoreyBPKGNvZGUsU0wpLCAwLCAyLCBuYW1lLCB7e0lNTSwgT1IzMiB8IFNSQ19JTl9EU1QsIEV9fSwge3tvcDEsIG9wMiwgb3AzKzcsIE9SMzIgfCBTUkNfSU5fRFNUfEIzMCAsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KKworCisjZGVmaW5lIElNTTMyTElTVCBJTU0zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKKyNkZWZpbmUgSU1NMjRMSVNUIElNTTI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKKyNkZWZpbmUgSU1NMTZMSVNUIElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFCisjZGVmaW5lIEExNkxJU1QgTF8xNixJR05PUkUsSUdOT1JFLElHTk9SRQorI2RlZmluZSBESVNQMjRMSVNUIERJU1B8TF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCisjZGVmaW5lIERJU1AzMkxJU1QgRElTUHxMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQorI2RlZmluZSBBQlMyNExJU1QgQUJTfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQorI2RlZmluZSBBQlMzMkxJU1QgQUJTfExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCisjZGVmaW5lIEEyNExJU1QgTF8yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCisjZGVmaW5lIEEzMkxJU1QgTF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKKyNkZWZpbmUgUFJFRklYMzIgMHgwLDB4MSwweDAsMHgwCisjZGVmaW5lIFBSRUZJWExEQyAweDAsMHgxLDB4NCwweDAKKworCisjZGVmaW5lIE8ob3AsIHNpemUpIChvcCo0K3NpemUpCisKKyNkZWZpbmUgT19SRUNPTVBJTEUgMAorI2RlZmluZSBPX0FERCAgMQorI2RlZmluZSBPX0FERFggMgorI2RlZmluZSBPX0FORCAgMworI2RlZmluZSBPX0JBTkQgNAorI2RlZmluZSBPX0JSQSAgNQorI2RlZmluZSBPX0JSTiAgNgorI2RlZmluZSBPX0JISSAgNworI2RlZmluZSBPX0JMUyAgOAorI2RlZmluZSBPX0JDQyAgOQorI2RlZmluZSBPX0JDUyAgMTAKKyNkZWZpbmUgT19CTkUgIDExICAKKyNkZWZpbmUgT19CVkMgIDEyCisjZGVmaW5lIE9fQlZTICAxMworI2RlZmluZSBPX0JQTCAgMTQKKyNkZWZpbmUgT19CTUkgIDE1CisjZGVmaW5lIE9fQkdFICAxNgorI2RlZmluZSBPX0JMVCAgMTcKKyNkZWZpbmUgT19CR1QgIDE4CisjZGVmaW5lIE9fQkxFICAxOQorI2RlZmluZSBPX0FOREMgMjAKKyNkZWZpbmUgT19CRVEgMjEKKyNkZWZpbmUgT19CQ0xSIDIyCisjZGVmaW5lIE9fQklBTkQgMjMKKyNkZWZpbmUgT19CSUxEIDI0CisjZGVmaW5lIE9fQklPUiAyNQorI2RlZmluZSBPX0JJWE9SIDI2CisjZGVmaW5lIE9fQklTVCAyNworI2RlZmluZSBPX0JMRCAyOAorI2RlZmluZSBPX0JOT1QgMjkKKyNkZWZpbmUgT19CU0VUIDMwCisjZGVmaW5lIE9fQlNSIDMxCisjZGVmaW5lIE9fQlhPUiAzMgorI2RlZmluZSBPX0NNUCAzMworI2RlZmluZSBPX0RBQSAzNAorI2RlZmluZSBPX0RBUyAzNQorI2RlZmluZSBPX0RFQyAzNgorI2RlZmluZSBPX0RJVlUgMzcKKyNkZWZpbmUgT19ESVZTIDM4CisjZGVmaW5lIE9fSU5DIDM5CisjZGVmaW5lIE9fTERDIDQwCisjZGVmaW5lIE9fTU9WX1RPX01FTSA0MQorI2RlZmluZSBPX09SIDQyCisjZGVmaW5lIE9fUk9UTCA0MworI2RlZmluZSBPX1JPVFIgNDQKKyNkZWZpbmUgT19ST1RYTCA0NQorI2RlZmluZSBPX1JPVFhSIDQ2CisjZGVmaW5lIE9fQlBUIDQ3CisjZGVmaW5lIE9fU0hBTCA0OAorI2RlZmluZSBPX1NIQVIgNDkKKyNkZWZpbmUgT19TSExMIDUwCisjZGVmaW5lIE9fU0hMUiA1MQorI2RlZmluZSBPX1NVQiAgNTIKKyNkZWZpbmUgT19TVUJTIDUzCisjZGVmaW5lIE9fVFJBUEEgNTQKKyNkZWZpbmUgT19YT1IgNTUKKyNkZWZpbmUgT19YT1JDIDU2CisjZGVmaW5lIE9fQk9SIDU3CisjZGVmaW5lIE9fQlNUIDU4CisjZGVmaW5lIE9fQlRTVCA1OQorI2RlZmluZSBPX0VFUE1PViA2MAorI2RlZmluZSBPX0VYVFMgNjEKKyNkZWZpbmUgT19FWFRVIDYyCisjZGVmaW5lIE9fSk1QIDYzCisjZGVmaW5lIE9fSlNSIDY0CisjZGVmaW5lIE9fTVVMVSA2NQorI2RlZmluZSBPX01VTFMgNjYKKyNkZWZpbmUgT19OT1AgNjcKKyNkZWZpbmUgT19OT1QgNjgKKyNkZWZpbmUgT19PUkMgNjkKKyNkZWZpbmUgT19SVEUgNzAKKyNkZWZpbmUgT19TVEMgNzEKKyNkZWZpbmUgT19TVUJYIDcyCisjZGVmaW5lIE9fTkVHIDczCisjZGVmaW5lIE9fUlRTIDc0CisjZGVmaW5lIE9fU0xFRVAgNzUKKyNkZWZpbmUgT19JTEwgNzYKKyNkZWZpbmUgT19BRERTIDc3CisjZGVmaW5lIE9fU1lTQ0FMTCA3OAorI2RlZmluZSBPX01PVl9UT19SRUcgNzkKKyNkZWZpbmUgT19UQVMgODAKKyNkZWZpbmUgT19DTFJNQUMgODIKKyNkZWZpbmUgT19MRE1BQyA4MworI2RlZmluZSBPX01BQyA4NAorI2RlZmluZSBPX0xETSA4NQorI2RlZmluZSBPX1NUTSA4NgorI2RlZmluZSBPX1NUTUFDIDg3CisjZGVmaW5lIE9fTEFTVCA4OAorI2RlZmluZSBTQiAwCisjZGVmaW5lIFNXIDEKKyNkZWZpbmUgU0wgMgorI2RlZmluZSBTTiAzCisKKworLyogRklYTUU6IExvdHMgb2YgaW5zbnMgaGF2ZSAiRSwgMCwgMCwgMCwgMCIgaW4gdGhlIG5pYmJsZSBjb2RlIHNlcXVlbmNlcy4KKyAgIE1ldGhpbmtzIHRoZSB6ZXJvZXMgYXJlbid0IG5lY2Vzc2FyeS4gIE9uY2UgY29uZmlybWVkLCBudWtlICdlbS4gICovCisKK3N0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdID0gCit7CisgIFRXT09QKE8oT19BREQsU0IpLCJhZGQuYiIsIDB4OCwgMHgwLDB4OCksCisgIAorICBORVdfU09QKE8oT19BREQsU1cpLDEsMiwiYWRkLnciKSx7e1JTMTYsUkQxNixFfX0se3sweDAsMHg5LFJTMTYsUkQxNixFfX0gRU9QLAorICBORVdfU09QKE8oT19BREQsU1cpLDAsNCwiYWRkLnciKSx7e0lNTTE2LFJEMTYsRX19LHt7MHg3LDB4OSwweDEsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAorICBORVdfU09QKE8oT19BREQsU0wpLDAsMiwiYWRkLmwiKSx7e1JTMzIsUkQzMixFIH19LCB7ezB4MCwweEEsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fQURELFNMKSwwLDYsImFkZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fQUREUyxTTCksMSwyLCJhZGRzIiksIHt7S0JJVCxSRFAsRX19LCAgIHt7MHgwLDB4QixLQklULFJEUCxFLDAsMCwwLDB9fSBFT1AsCisKKyAgVFdPT1AoTyhPX0FERFgsU0IpLCJhZGR4IiwweDksMHgwLDB4RSksCisgIFRXT09QKE8oT19BTkQsU0IpLCAiYW5kLmIiLDB4RSwweDEsMHg2KSwKKworICBORVdfU09QKE8oT19BTkQsU1cpLDAsMiwiYW5kLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NixSUzE2LFJEMTYsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDQsImFuZC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCisgIAorICBORVdfU09QKE8oT19BTkQsU0wpLDAsNiwiYW5kLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg2LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAorICBORVdfU09QKE8oT19BTkQsU0wpLDAsMiwiYW5kLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg2LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCisKKyAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAorICBORVdfU09QKE8oT19BTkRDLFNCKSwxLDIsImFuZGMiKSwge3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDYsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAorCisgIEJJVE9QKE8oT19CQU5ELFNCKSwgSU1NM3xCMzAsImJhbmQiLDB4NywweDYsMHg3LDB4QywweDcsMHhFLDB4MCksCisgIEJSQU5DSChPKE9fQlJBLFNCKSwiYnJhIiwweDApLAorICBCUkFOQ0goTyhPX0JSQSxTQiksImJ0IiwweDApLAorICBCUkFOQ0goTyhPX0JSTixTQiksImJybiIsMHgxKSwKKyAgQlJBTkNIKE8oT19CUk4sU0IpLCJiZiIsMHgxKSwKKyAgQlJBTkNIKE8oT19CSEksU0IpLCJiaGkiLDB4MiksCisgIEJSQU5DSChPKE9fQkxTLFNCKSwiYmxzIiwweDMpLAorICBCUkFOQ0goTyhPX0JDQyxTQiksImJjYyIsMHg0KSwKKyAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiaHMiLDB4NCksCisgIEJSQU5DSChPKE9fQkNTLFNCKSwiYmNzIiwweDUpLAorICBCUkFOQ0goTyhPX0JDUyxTQiksImJsbyIsMHg1KSwKKyAgQlJBTkNIKE8oT19CTkUsU0IpLCJibmUiLDB4NiksCisgIEJSQU5DSChPKE9fQkVRLFNCKSwiYmVxIiwweDcpLAorICBCUkFOQ0goTyhPX0JWQyxTQiksImJ2YyIsMHg4KSwKKyAgQlJBTkNIKE8oT19CVlMsU0IpLCJidnMiLDB4OSksCisgIEJSQU5DSChPKE9fQlBMLFNCKSwiYnBsIiwweEEpLAorICBCUkFOQ0goTyhPX0JNSSxTQiksImJtaSIsMHhCKSwKKyAgQlJBTkNIKE8oT19CR0UsU0IpLCJiZ2UiLDB4QyksCisgIEJSQU5DSChPKE9fQkxULFNCKSwiYmx0IiwweEQpLAorICBCUkFOQ0goTyhPX0JHVCxTQiksImJndCIsMHhFKSwKKyAgQlJBTkNIKE8oT19CTEUsU0IpLCJibGUiLDB4RiksCisKKyAgRUJJVE9QKE8oT19CQ0xSLFNCKSxJTU0zfEIzMCwiYmNsciIsIDB4NiwweDIsMHg3LDB4RCwweDcsMHhGLDB4OCksCisgIEJJVE9QKE8oT19CSUFORCxTQiksSU1NM3xCMzEsImJpYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAorICBCSVRPUChPKE9fQklMRCxTQiksIElNTTN8QjMxLCJiaWxkIiwgMHg3LDB4NywweDcsMHhDLDB4NywweEUsMHgwKSwKKyAgQklUT1AoTyhPX0JJT1IsU0IpLCBJTU0zfEIzMSwiYmlvciIsIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCisgIEJJVE9QKE8oT19CSVNULFNCKSwgSU1NM3xCMzEsImJpc3QiLCAweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAorICBCSVRPUChPKE9fQklYT1IsU0IpLElNTTN8QjMxLCJiaXhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKKyAgQklUT1AoTyhPX0JMRCxTQiksICBJTU0zfEIzMCwiYmxkIiwgIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCisgIEVCSVRPUChPKE9fQk5PVCxTQiksSU1NM3xCMzAsImJub3QiLCAweDYsMHgxLDB4NywweEQsMHg3LDB4RiwweDgpLAorICBCSVRPUChPKE9fQk9SLFNCKSwgIElNTTN8QjMwLCJib3IiLCAgMHg3LDB4NCwweDcsMHhDLDB4NywweEUsMHgwKSwKKyAgRUJJVE9QKE8oT19CU0VULFNCKSxJTU0zfEIzMCwiYnNldCIsIDB4NiwweDAsMHg3LDB4RCwweDcsMHhGLDB4OCksCisKKyAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDgsRSwwfX0se3sgMHg1LDB4NSxESVNQOCxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAorICBTT1AoTyhPX0JTUixTQiksNiwiYnNyIikse3tESVNQMTYsRSwwfX0se3sgMHg1LDB4QywweDAsMHgwLERJU1AxNixJR05PUkUsSUdOT1JFLElHTk9SRSxFLDAsMCwwLDB9fSBFT1AsCisgIEJJVE9QKE8oT19CU1QsU0IpLCBJTU0zfEIzMCwiYnN0IiwweDYsMHg3LDB4NywweEQsMHg3LDB4RiwweDgpLAorICBFQklUT1AoTyhPX0JUU1QsU0IpLCBJTU0zfEIzMCwiYnRzdCIsMHg2LDB4MywweDcsMHhDLDB4NywweEUsMHgwKSwKKyAgQklUT1AoTyhPX0JYT1IsU0IpLCBJTU0zfEIzMCwiYnhvciIsMHg3LDB4NSwweDcsMHhDLDB4NywweEUsMHgwKSwKKworICBUV09PUChPKE9fQ01QLFNCKSwgImNtcC5iIiwweEEsMHgxLDB4QyksCisgIFdUV09QKE8oT19DTVAsU1cpLCAiY21wLnciLDB4MSwweEQpLAorCisgIE5FV19TT1AoTyhPX0NNUCxTVyksMSwyLCJjbXAudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDEsMHhELFJTMTYsUkQxNixFfX0gRU9QLAorICBORVdfU09QKE8oT19DTVAsU1cpLDAsNCwiY21wLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHgyLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKKworICBORVdfU09QKE8oT19DTVAsU0wpLDAsNiwiY21wLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgyLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAorICBORVdfU09QKE8oT19DTVAsU0wpLDAsMiwiY21wLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MSwweEYsQjMxfFJTMzIsQjMwfFJEMzIsRX19IEVPUCwKKworICBVTk9QKE8oT19EQUEsU0IpLCAiZGFhIiwweDAsMHhGKSwKKyAgVU5PUChPKE9fREFTLFNCKSwgImRhcyIsMHgxLDB4RiksCisgIFVOT1AoTyhPX0RFQyxTQiksICJkZWMuYiIsMHgxLDB4QSksCisKKyAgTkVXX1NPUChPKE9fREVDLCBTVyksMCwyLCJkZWMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgxLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCisgIE5FV19TT1AoTyhPX0RFQywgU0wpLDAsMiwiZGVjLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MSwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKKworICBORVdfU09QKE8oT19ESVZVLFNCKSwxLDYsImRpdnh1LmIiKSwge3tSUzgsUkQxNixFfX0sIHt7MHg1LDB4MSxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKKyAgTkVXX1NPUChPKE9fRElWVSxTVyksMCwyMCwiZGl2eHUudyIpLHt7UlMxNixSRDMyLEV9fSx7ezB4NSwweDMsUlMxNixCMzB8UkQzMixFfX1FT1AsCisgICAgCisgIE5FV19TT1AoTyhPX0RJVlMsU0IpLDAsMjAsImRpdnhzLmIiKSAse3tSUzgsUkQxNixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDEsUlM4LFJEMTYsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fRElWUyxTVyksMCwwMiwiZGl2eHMudyIpICx7e1JTMTYsUkQzMixFIH19LHt7MHgwLDB4MSwweEQsMHgwLDB4NSwweDMsUlMxNixCMzB8UkQzMixFfX0gRU9QLAorCisgIE5FV19TT1AoTyhPX0VFUE1PVixTQiksMSw1MCwiZWVwbW92LmIiKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4NSwweEMsMHg1LDB4OSwweDgsMHhGLEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fRUVQTU9WLFNXKSwwLDUwLCJlZXBtb3YudyIpLHt7RSwwLDB9fSx7ezB4NywweEIsMHhELDB4NCwweDUsMHg5LDB4OCwweEYsRX19IEVPUCwKKyAgICAKKyAgTkVXX1NPUChPKE9fRVhUUyxTVyksMCwyLCJleHRzLnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4RCxPUjE2LEUgICB9fUVPUCwKKyAgTkVXX1NPUChPKE9fRVhUUyxTTCksMCwyLCJleHRzLmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4RixPUjMyfEIzMCxFICAgfX1FT1AsCisKKyAgTkVXX1NPUChPKE9fRVhUVSxTVyksMCwyLCJleHR1LnciKSx7e09SMTYsRSwwfX0se3sweDEsMHg3LDB4NSxPUjE2LEUgICB9fUVPUCwKKyAgTkVXX1NPUChPKE9fRVhUVSxTTCksMCwyLCJleHR1LmwiKSx7e09SMzIsRSwwfX0se3sweDEsMHg3LDB4NyxPUjMyfEIzMCxFICAgfX1FT1AsCisgICAgCisgIFVOT1AoTyhPX0lOQyxTQiksICJpbmMiLDB4MCwweEEpLAorCisgIE5FV19TT1AoTyhPX0lOQyxTVyksMCwyLCJpbmMudyIpICx7e0RCSVQsUkQxNixFIH19LHt7MHgwLDB4QiwweDV8REJJVCxSRDE2LEV9fSBFT1AsCisgIE5FV19TT1AoTyhPX0lOQyxTTCksMCwyLCJpbmMubCIpICx7e0RCSVQsUkQzMixFIH19LHt7MHgwLDB4QiwweDd8REJJVCxSRDMyfEIzMCxFfX0gRU9QLAorCisgIFNPUChPKE9fSk1QLFNCKSw0LCJqbXAiKSx7e1JTSU5ELEUsMH19LHt7MHg1LDB4OSxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAorICBTT1AoTyhPX0pNUCxTQiksNiwiam1wIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4QSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAorICBTT1AoTyhPX0pNUCxTQiksOCwiam1wIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4QixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKKworICBTT1AoTyhPX0pTUixTQiksNiwianNyIikse3tTUkN8UlNJTkQsRSwwfX0sIHt7MHg1LDB4RCxCMzB8UlNJTkQsMHgwLEUsMCwwLDAsMH19RU9QLAorICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8QUJTSk1QLEUsMH19LHt7MHg1LDB4RSxTUkN8QUJTSk1QLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAorICBTT1AoTyhPX0pTUixTQiksOCwianNyIikse3tTUkN8TUVNSU5ELEUsMH19LHt7MHg1LDB4RixTUkN8TUVNSU5ELElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKKworICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LENDUixFfX0sICAgICAgICAge3sgMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LENDUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgwLE9SOCxFLDAsMCwwLDB9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsQ0NSLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHgwLDB4MCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCisgIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzMyU1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCisgIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsQ0NSLEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixDQ1IsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4MiwweDAsU1JDfERJU1AzMkxJU1QsRX19RU9QLAorICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lOQyxDQ1IsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAorCisgIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e0lNTTgsRVhSLEV9fSwgICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NyxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7T1I4LEVYUixFfX0sICAgICAgICAgIHt7IDB4MCwweDMsMHgxLE9SOCxFLDAsMCwwLDB9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMTZTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAorICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxFWFIsRX19LCAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweGIsMHgyLDB4MCxTUkN8QUJTMzJMSVNULEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8xNixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhmLEIzMHxESVNQUkVHLDAsRElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7RElTUHxTUkN8TF8zMixFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhkLEIzMHxSU0lOQywweDAsRX19RU9QLAorICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tSU0lORCxFWFIsRX19LCAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMwfFJESU5ELDB4MCxFfX0gRU9QLAorCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCU3xTUkN8TF8xNnxNRU1SRUxBWCxSRDgsRX19LCAge3sgMHg2LDB4QSwweDAsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTE2TElTVCxFfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0FCU3xTUkN8TF8zMnxNRU1SRUxBWCxSRDgsRSB9fSwge3sgMHg2LDB4QSwweDIsUkQ4LFNSQ3xBQlN8TUVNUkVMQVh8QTMyTElTVCxFIH19RU9QLAorICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTfExfMTZ8TUVNUkVMQVh8RFNULEV9fSwgICAgIHt7IDB4NiwweEEsMHg4LFJTOCxEU1R8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAorICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDYsIm1vdi5iIikse3tSUzgsQUJTfERTVHxMXzMyfE1FTVJFTEFYLEUgfX0sICAgIHt7IDB4NiwweEEsMHhBLFJTOCxEU1R8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKKyAgICAKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUHxMXzMyfFNSQyxSRDgsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweDIsUkQ4LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1B8TF8zMnxEU1QsRX19LCAge3sgMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QSwweEEsUlM4LERTVHxESVNQMzJMSVNULEV9fUVPUCwKKworCisKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwyLCJtb3YuYiIpLHt7UlM4LFJEOCxFfX0sCSAgICB7eyAweDAsMHhDLFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e0lNTTgsUkQ4LEV9fSwgICAgICAgICAgIHt7IDB4RixSRDgsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e1JTSU5ELFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsQjMwfFJTSU5ELFJEOCxFLDAsMCwwLDB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7RElTUDE2U1JDLFJEOCxFfX0sICAgICAge3sgMHg2LDB4RSxCMzB8RElTUFJFRyxSRDgsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSw2LCJtb3YuYiIpLHt7UlNJTkMsUkQ4LEV9fSwgICAgICAgICAge3sgMHg2LDB4QyxCMzB8UlNJTkMsUkQ4LEUsMCwwLDAsMH19RU9QLAorCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNCwibW92LmIiKSx7e0FCUzhTUkMsUkQ4LEV9fSwgICAgICAgIHt7IDB4MixSRDgsQUJTOFNSQyxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxSRElORCxFfX0sICAgICAgICAgIHt7IDB4NiwweDgsUkRJTkR8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LERJU1AxNkRTVCxFfX0sICAgICAge3sgMHg2LDB4RSxESVNQUkVHfEIzMSxSUzgsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LFJEREVDfEIzMSxFfX0sICAgICAge3sgMHg2LDB4QyxSRERFQ3xCMzEsUlM4LEUsMCwwLDAsMH19RU9QLAorCisgIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNCwibW92LmIiKSx7e1JTOCxBQlM4RFNULEV9fSwgICAgICAgIHt7IDB4MyxSUzgsQUJTOERTVCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCisKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRElORCxFfX0sICAgICAgICB7eyAweDYsMHg5LFJESU5EfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAorICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQfExfMzJ8U1JDLFJEMTYsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLFJEMTYsU1JDfERJU1AzMkxJU1QsRX19RU9QLAorICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LERJU1B8TF8zMnxEU1QsRX19LHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLFJTMTYsRFNUfERJU1AzMkxJU1QsRX19RU9QLAorICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlN8TF8zMnxNRU1SRUxBWHxTUkMsUkQxNixFIH19LHt7IDB4NiwweEIsMHgyLFJEMTYsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAorICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCU3xMXzMyfE1FTVJFTEFYfERTVCxFIH19LHt7IDB4NiwweEIsMHhBLFJTMTYsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAorICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDIsIm1vdi53Iikse3tSUzE2LFJEMTYsRX19LCAgICAgICAgIHt7IDB4MCwweEQsUlMxNiwgUkQxNixFLDAsMCwwLDB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7SU1NMTYsUkQxNixFfX0sICAgICAgICB7eyAweDcsMHg5LDB4MCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw0LCJtb3YudyIpLHt7UlNJTkQsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHg5LEIzMHxSU0lORCxSRDE2LEUsMCwwLDAsMH19RU9QLAorICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tESVNQMTZTUkMsUkQxNixFfX0sICAgIHt7IDB4NiwweEYsQjMwfERJU1BSRUcsUkQxNixESVNQMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAorICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tSU0lOQyxSRDE2LEV9fSwgICAgICAgIHt7IDB4NiwweEQsQjMwfFJTSU5DLFJEMTYsRSwwLDAsMCwwfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNiwibW92LnciKSx7e0FCUzE2U1JDLFJEMTYsRX19LCAgICAge3sgMHg2LDB4QiwweDAsUkQxNixBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCisKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQMTZEU1QsRX19LCAgICB7eyAweDYsMHhGLERJU1BSRUd8QjMxLFJTMTYsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixSRERFQyxFfX0sICAgICAgICB7eyAweDYsMHhELFJEREVDfEIzMSxSUzE2LEUsMCwwLDAsMH19RU9QLAorICBTT1AoTyhPX01PVl9UT19NRU0sU1cpLDYsIm1vdi53Iikse3tSUzE2LEFCUzE2RFNULEV9fSwgICAgIHt7IDB4NiwweEIsMHg4LFJTMTYsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAorCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e0lNTTMyLFJEMzIsRX19LCAgICAgICAge3sgMHg3LDB4QSwweDAsQjMwfFJEMzIsSU1NMzJMSVNULEV9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwyLCJtb3YubCIpLHt7UlMzMixSRDMyLEV9fSwgICAgICAgICB7eyAweDAsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAorCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNCwibW92LmwiKSx7e1JTSU5ELFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSU0lORHxCMzAsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAorICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQMTZTUkMsUkQzMixFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzAsQjMwfFJEMzIsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0RJU1B8TF8zMnxTUkMsUkQzMixFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzB8RElTUFJFRywweDAsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfERJU1AzMkxJU1QsRSB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7UlNJTkMsUkQzMixFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELEIzMHxSU0lOQyxCMzB8UkQzMixFLDAsMCwwLDAgfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzE2U1JDLFJEMzIsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDAsQjMwfFJEMzIsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7QUJTMzJTUkN8TUVNUkVMQVgsUkQzMixFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4MixCMzB8UkQzMixTUkN8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRJTkQsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4OSxSRElORHxCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAorICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1AxNkRTVCxFfX0sICAgIHt7IFBSRUZJWDMyLDB4NiwweEYsRElTUFJFR3xCMzEsQjMwfFJTMzIsRElTUDE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsRElTUHxMXzMyfERTVCxFfX0se3sgUFJFRklYMzIsMHg3LDB4OCxCMzF8RElTUFJFRywweDAsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfERJU1AzMkxJU1QsRSB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixSRERFQyxFfX0sICAgICAgICB7eyBQUkVGSVgzMiwweDYsMHhELFJEREVDfEIzMSxCMzB8UlMzMixFLDAsMCwwLDAgfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMTZEU1QsRX19LCAgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDgsQjMwfFJTMzIsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRSB9fUVPUCwKKyAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixBQlMzMkRTVHxNRU1SRUxBWCxFIH19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhCLDB4QSxCMzB8UlMzMixEU1R8TUVNUkVMQVh8QUJTMzJMSVNULEUgfX1FT1AsCisKKyAgU09QKE8oT19NT1ZfVE9fUkVHLFNCKSwxMCwibW92ZnBlIikse3tBQlMxNlNSQyxSRDgsRX19LHt7IDB4NiwweEEsMHg0LFJEOCxBQlMxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCisgIFNPUChPKE9fTU9WX1RPX01FTSxTQiksMTAsIm1vdnRwZSIpLHt7UlM4LEFCUzE2RFNULEV9fSx7eyAweDYsMHhBLDB4QyxSUzgsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAorCisgIE5FV19TT1AoTyhPX01VTFUsU0IpLDEsMTQsIm11bHh1LmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHg1LDB4MCxSUzgsUkQxNixFLDAsMCwwLDB9fUVPUCwKKyAgTkVXX1NPUChPKE9fTVVMVSxTVyksMCwxNCwibXVseHUudyIpLHt7UlMxNixSRDMyLEV9fSx7eyAweDUsMHgyLFJTMTYsQjMwfFJEMzIsRSwwLDAsMCwwfX1FT1AsCisKKyAgTkVXX1NPUChPKE9fTVVMUyxTQiksMCwyMCwibXVseHMuYiIpLHt7UlM4LFJEMTYsRX19LCB7eyAweDAsMHgxLDB4YywweDAsMHg1LDB4MCxSUzgsUkQxNixFfX1FT1AsCisgIE5FV19TT1AoTyhPX01VTFMsU1cpLDAsMjAsIm11bHhzLnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDIsUlMxNixCMzB8UkQzMixFfX1FT1AsCisgIAorICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KKyAgTkVXX1NPUChPKE9fTkVHLFNCKSwxLDIsIm5lZy5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4OCxPUjgsRSwwLDAsMCwwfX1FT1AsCisgIE5FV19TT1AoTyhPX05FRyxTVyksMCwyLCJuZWcudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDksT1IxNixFfX1FT1AsCisgIE5FV19TT1AoTyhPX05FRyxTTCksMCwyLCJuZWcubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweEIsQjMwfE9SMzIsRX19RU9QLAorICAgIAorICBORVdfU09QKE8oT19OT1AsU04pLDEsMiwibm9wIikse3tFLDAsMH19LHt7IDB4MCwweDAsMHgwLDB4MCxFLDAsMCwwLDB9fUVPUCwKKworICAvKiA/Pz8gVGhpcyBjYW4gdXNlIFVOT1AzLiAgKi8KKyAgTkVXX1NPUChPKE9fTk9ULFNCKSwxLDIsIm5vdC5iIikse3sgT1I4LEUsIDB9fSx7eyAweDEsMHg3LDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCisgIE5FV19TT1AoTyhPX05PVCxTVyksMCwyLCJub3QudyIpLHt7IE9SMTYsRSwwfX0se3sgMHgxLDB4NywweDEsT1IxNixFfX1FT1AsCisgIE5FV19TT1AoTyhPX05PVCxTTCksMCwyLCJub3QubCIpLHt7IE9SMzIsRSwwfX0se3sgMHgxLDB4NywweDMsQjMwfE9SMzIsRX19RU9QLAorCisgIFRXT09QKE8oT19PUiwgU0IpLCJvci5iIiwweEMsMHgxLDB4NCksCisgIE5FV19TT1AoTyhPX09SLFNXKSwwLDQsIm9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg0LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fT1IsU1cpLDAsMiwib3IudyIpLHt7UlMxNixSRDE2LEUgfX0se3sweDYsMHg0LFJTMTYsUkQxNixFfX0gRU9QLAorCisgIE5FV19TT1AoTyhPX09SLFNMKSwwLDYsIm9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg0LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAorICBORVdfU09QKE8oT19PUixTTCksMCwyLCJvci5sIikse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg0LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCisKKyAgTkVXX1NPUChPKE9fT1JDLFNCKSwxLDIsIm9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCisgIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHgwLDB4NCxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKKworICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwxLDYsInBvcC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHg3LE9SMTYsRSwwLDAsMCwwfX1FT1AsCisgIE5FV19TT1AoTyhPX01PVl9UT19SRUcsU0wpLDAsNiwicG9wLmwiKSx7e09SMzIsRSwwfX0se3sgUFJFRklYMzIsMHg2LDB4RCwweDcsT1IzMnxCMzAsRSwwLDAsMCwwfX1FT1AsCisgIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU1cpLDEsNiwicHVzaC53Iikse3tPUjE2LEUsMH19LHt7IDB4NiwweEQsMHhGLE9SMTYsRSwwLDAsMCwwfX1FT1AsCisgIE5FV19TT1AoTyhPX01PVl9UT19NRU0sU0wpLDAsNiwicHVzaC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHhGLE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAorCisgIFVOT1AzKE9fUk9UTCwgICJyb3RsIiwgMHgxLDB4MiwweDgpLAorICBVTk9QMyhPX1JPVFIsICAicm90ciIsIDB4MSwweDMsMHg4KSwKKyAgVU5PUDMoT19ST1RYTCwgInJvdHhsIiwweDEsMHgyLDB4MCksCisgIFVOT1AzKE9fUk9UWFIsICJyb3R4ciIsMHgxLDB4MywweDApLAorCisgIFNPUChPKE9fQlBULFNOKSwgIDEwLCJicHQiKSx7e0UsMCwwfX0se3sgMHg3LDB4QSwweEYsMHhGLEUsMCwwLDAsMH19RU9QLAorICBTT1AoTyhPX1JURSxTTiksICAxMCwicnRlIikse3tFLDAsMH19LHt7IDB4NSwweDYsMHg3LDB4MCxFLDAsMCwwLDB9fUVPUCwKKyAgU09QKE8oT19SVFMsU04pLCAgIDgsInJ0cyIpLHt7RSwwLDB9fSx7eyAweDUsMHg0LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCisKKyAgVU5PUDMoT19TSEFMLCAgInNoYWwiLDB4MSwweDAsMHg4KSwKKyAgVU5PUDMoT19TSEFSLCAgInNoYXIiLDB4MSwweDEsMHg4KSwKKyAgVU5PUDMoT19TSExMLCAgInNobGwiLDB4MSwweDAsMHgwKSwKKyAgVU5PUDMoT19TSExSLCAgInNobHIiLDB4MSwweDEsMHgwKSwKKworICBTT1AoTyhPX1NMRUVQLFNOKSwyLCJzbGVlcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgxLDB4OCwweDAsRSwwLDAsMCwwfX0gRU9QLAorCisgIE5FV19TT1AoTyhPX1NUQyxTQiksIDEsMiwic3RjIikse3tDQ1IsUkQ4LEV9fSx7eyAweDAsMHgyLDB4MCxSRDgsRSwwLDAsMCwwfX0gRU9QLAorCisgIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixSU0lORCxFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMXxSRElORCwweDAsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMTYsRX19LHt7UFJFRklYTERDLDB4NiwweEYsQjMxfERJU1BSRUcsMCxEU1R8RElTUHxMXzE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLERJU1B8RFNUfExfMzIsRX19LHt7UFJFRklYTERDLDB4NywweDgsQjMwfERJU1BSRUcsMCwweDYsMHhCLDB4QSwweDAsRFNUfERJU1AzMkxJU1QsRX19RU9QLAorICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUkRERUMsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4RCxCMzF8UkRERUMsMHgwLEV9fUVPUCwKKworICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsQUJTMTZTUkMsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDgsMHgwLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzMyU1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHhBLDB4MCxEU1R8QUJTMzJMSVNULEV9fUVPUCwKKworICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7RVhSLFJEOCxFfX0se3sgMHgwLDB4MiwweDEsUkQ4LEUsMCwwLDAsMH19IEVPUCwKKworICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsUlNJTkQsRX19LCAgICAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCisgIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzE2LEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCisgIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixESVNQfERTVHxMXzMyLEV9fSx7ezB4MCwweDEsMHg0LDB4MSwweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKKyAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJEREVDLEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCisKKyAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLEFCUzE2U1JDLEV9fSwgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCisgIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMzMlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCisKKyAgU09QKE8oT19TVUIsU0IpLDIsInN1Yi5iIikse3tSUzgsUkQ4LEV9fSx7eyAweDEsMHg4LFJTOCxSRDgsRSwwLDAsMCwwfX1FT1AsCisKKyAgTkVXX1NPUChPKE9fU1VCLFNXKSwxLDIsInN1Yi53Iikse3tSUzE2LFJEMTYsRSB9fSwgIHt7MHgxLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fU1VCLFNXKSwwLDQsInN1Yi53Iikse3tJTU0xNixSRDE2LEUgfX0sIHt7MHg3LDB4OSwweDMsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAorICBORVdfU09QKE8oT19TVUIsU0wpLDAsMiwic3ViLmwiKSAse3tSUzMyLFJEMzIsRSB9fSwge3sweDEsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCisgIE5FV19TT1AoTyhPX1NVQixTTCksMCw2LCJzdWIubCIpLCB7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHgzLEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAorCisgIFNPUChPKE9fU1VCUyxTTCksMiwic3VicyIpLHt7S0JJVCxSRFAsRX19LHt7IDB4MSwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX1FT1AsCisgIFRXT09QKE8oT19TVUJYLFNCKSwic3VieCIsMHhCLDB4MSwweEUpLAorCisgIE5FV19TT1AoTyhPX1RSQVBBLFNCKSwwLDIsInRyYXBhIikse3sgSU1NMixFfX0sICB7ezB4NSwweDcsSU1NMixJR05PUkUsRSAgfX1FT1AsCisgIE5FV19TT1AoTyhPX1RBUyxTQiksMCwyLCJ0YXMiKSx7e1JTSU5ELEV9fSwgIHt7MHgwLDB4MSwweGUsMHgwLDB4NywweGIsQjMwfFJTSU5ELDB4YyxFICB9fUVPUCwKKworICBUV09PUChPKE9fWE9SLCBTQiksInhvciIsMHhELDB4MSwweDUpLAorCisgIE5FV19TT1AoTyhPX1hPUixTVyksMCw0LCJ4b3IudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDUsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAorICBORVdfU09QKE8oT19YT1IsU1cpLDAsMiwieG9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NSxSUzE2LFJEMTYsRX19IEVPUCwKKworICBORVdfU09QKE8oT19YT1IsU0wpLDAsNiwieG9yLmwiKSx7e0lNTTMyLFJEMzIsRSB9fSx7ezB4NywweEEsMHg1LEIzMHxSRDMyLElNTTMyTElTVCxFfX0gRU9QLAorICBORVdfU09QKE8oT19YT1IsU0wpLDAsMiwieG9yLmwiKSAse3tSUzMyLFJEMzIsRSB9fSx7ezB4MCwweDEsMHhGLDB4MCwweDYsMHg1LEIzMHxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCisKKyAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LENDUixFfX0se3sgMHgwLDB4NSxJTU04LElHTk9SRSxFLDAsMCwwLDB9fUVPUCwKKyAgU09QKE8oT19YT1JDLFNCKSwyLCJ4b3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCisKKyAgTkVXX1NPUChPKE9fQ0xSTUFDLFNOKSwxLDIsImNscm1hYyIpLHt7RSwgMCwgMH19LHt7MHgwLDB4MSwweGEsMHgwLEV9fSBFT1AsCisgIE5FV19TT1AoTyhPX01BQyxTTCksMSwyLCJtYWMiKSx7e1JTSU5DLFJESU5DLEV9fSx7ezB4MCwweDEsMHg2LDB4MCwweDYsMHhkLEIzMHxSU0lOQyxCMzB8UkRJTkMsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fTERNQUMsU0wpLDEsMiwibGRtYWMiKSx7e1JTMzIsTUFDUkVHLEV9fSx7ezB4MCwweDMsTUFDUkVHLFJTMzIsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fU1RNQUMsU0wpLDEsMiwic3RtYWMiKSx7e01BQ1JFRyxSRDMyLEV9fSx7ezB4MCwweDIsTUFDUkVHLFJEMzIsRX19IEVPUCwKKyAgTkVXX1NPUChPKE9fTERNLFNMKSwwLDYsImxkbS5sIikse3tSU0lOQywgUlMzMiwgRX19LHt7IDB4MCwweDEsSUdOT1JFLDB4MCwweDYsMHhELDB4NyxJR05PUkUsRX19RU9QLAorICBORVdfU09QKE8oT19TVE0sU0wpLDAsNiwic3RtLmwiKSx7e1JTMzIsIFJEREVDLCBFfX0se3sweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweEYsSUdOT1JFLEV9fUVPUCwKKyAgeyAwIH0KK307CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBoOF9vcGNvZGUgaDhfb3Bjb2Rlc1tdIDsKKyNlbmRpZgorCisKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9ocHBhLmggYi9pbmNsdWRlL29wY29kZS9ocHBhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjY2I2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL2hwcGEuaApAQCAtMCwwICsxLDQ4NiBAQAorLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIFBBLVJJU0MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBkaXNhc3NlbWJsZXIuCisKK0dBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKKyNkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIG9mIGFuIG9wY29kZSB0YWJsZSBlbnRyeS4KKyAqLworCisvKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGRlbGF5IHNsb3QgbnVsbGlmaWNhdGlvbjogbm9ybWFsIHdoaWNoIGlzCisgKiBjb250cm9sZWQgYnkgdGhlIG51bGxpZmljYXRpb24gYml0LCBhbmQgY29uZGl0aW9uYWwsIHdoaWNoIGRlcGVuZHMKKyAqIG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJyYW5jaCBhbmQgaXRzIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqCisgKiBOT05FIGlzIHVuZm9ydHVuYXRlbHkgI2RlZmluZWQgaW4gdGhlIGhpdXggc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAKKyAqICN1bmRlZiBpdCBhd2F5LgorICovCisjdW5kZWYgTk9ORQorc3RydWN0IHBhX29wY29kZQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4uLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBtYXNrOwkvKiAuLi4gaW4gdGhlc2UgYml0cy4gKi8KKyAgICBjaGFyICphcmdzOworICAgIGVudW0gcGFfYXJjaCBhcmNoOworfTsKKworCisvKgorICAgQWxsIGhwcGEgb3Bjb2RlcyBhcmUgMzIgYml0cy4KKworICAgVGhlIG1hdGNoIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBhCisgICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKKyAgIG9mIHRoYXQgb3Bjb2RlLgorCisgICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyCisgICBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KKworICAgQml0IHBvc2l0aW9ucyBpbiB0aGlzIGRlc2NyaXB0aW9uIGZvbGxvdyBIUCB1c2FnZSBvZiBsc2IgPSAzMSwKKyAgICJhdCIgaXMgbHNiIG9mIGZpZWxkLgorCisgICBJbiB0aGUgYXJncyBmaWVsZCwgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggZXhhY3RseToKKworCScrLCgpICcKKworICAgSW4gdGhlIGFyZ3MgZmllbGQsIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgdW51c2VkOgorCisJJyAgIiMkJSAgICAqKy0gLi8gICAgICAgICAgOjsgICAgJworCScgICAgICAgICAgICAgICAgICAgICAgICAgIFtcXSAgJworCScgICAgICAgICAgICAgICAgICAgICAgICAgIHsgfSAnCisKKyAgIEhlcmUgYXJlIGFsbCB0aGUgY2hhcmFjdGVyczoKKworCScgISIjJCUmJygpKistLC4vMDEyMzQ1Njc4OTo7PD0+P0AnCisJJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl8nCisJJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9ficKKworS2luZHMgb2Ygb3BlcmFuZHM6CisgICB4ICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTUuCisgICBiICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMTAuCisgICB0ICAgIGludGVnZXIgcmVnaXN0ZXIgZmllbGQgYXQgMzEuCisgICB5ICAgIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGZpZWxkIGF0IDMxCisgICA1ICAgIDUgYml0IGltbWVkaWF0ZSBhdCAxNS4KKyAgIHMgICAgMiBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE3LgorICAgUyAgICAzIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTguCisgICBjICAgIGluZGV4ZWQgbG9hZCBjb21wbGV0ZXIuCisgICBDICAgIHNob3J0IGxvYWQgYW5kIHN0b3JlIGNvbXBsZXRlci4KKyAgIFkJU3RvcmUgQnl0ZXMgU2hvcnQgY29tcGxldGVyCisgICA8ICAgIG5vbi1uZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucy4KKyAgIGEJY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb25zCisgICBkICAgIG5vbi1uZWdhdGVkIGFkZCBjb25kaXRpb25zCisgICAmICAgIGxvZ2ljYWwgaW5zdHJ1Y3Rpb24gY29uZGl0aW9ucworICAgVSAgICB1bml0IGluc3RydWN0aW9uIGNvbmRpdGlvbnMKKyAgID4gICAgc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMuCisgICB+ICAgIGJ2YixiYiBjb25kaXRpb25zCisgICBWICAgIDUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQorICAgaSAgICAxMSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCisgICBqICAgIDE0IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKKyAgIGsgICAgMjEgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQorICAgbgludWxsaWZpY2F0aW9uIGZvciBicmFuY2ggaW5zdHJ1Y3Rpb25zCisgICBOCW51bGxpZmljYXRpb24gZm9yIHNwb3AgYW5kIGNvcHIgaW5zdHJ1Y3Rpb25zCisgICB3ICAgIDEyIGJpdCBicmFuY2ggZGlzcGxhY2VtZW50CisgICBXICAgIDE3IGJpdCBicmFuY2ggZGlzcGxhY2VtZW50IChQQyByZWxhdGl2ZSkKKyAgIHogICAgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKGp1c3QgYSBudW1iZXIsIG5vdCBhbiBhZGRyZXNzKQorCitBbHNvIHRoZXNlOgorCisgICBwICAgIDUgYml0IHNoaWZ0IGNvdW50IGF0IDI2ICh0byBzdXBwb3J0IHRoZSBTSEQgaW5zdHJ1Y3Rpb24pIGVuY29kZWQgYXMKKyAgICAgICAgMzEtcAorICAgUCAgICA1IGJpdCBiaXQgcG9zaXRpb24gYXQgMjYKKyAgIFQgICAgNSBiaXQgZmllbGQgbGVuZ3RoIGF0IDMxIChlbmNvZGVkIGFzIDMyLVQpCisgICBBICAgIDEzIGJpdCBpbW1lZGlhdGUgYXQgMTggKHRvIHN1cHBvcnQgdGhlIEJSRUFLIGluc3RydWN0aW9uKQorICAgXglsaWtlIGIsIGJ1dCBkZXNjcmliZXMgYSBjb250cm9sIHJlZ2lzdGVyCisgICBaICAgIFN5c3RlbSBDb250cm9sIENvbXBsZXRlciAodG8gc3VwcG9ydCBMUEEsIExIQSwgZXRjLikKKyAgIEQgICAgMjYgYml0IGltbWVkaWF0ZSBhdCAzMSAodG8gc3VwcG9ydCB0aGUgRElBRyBpbnN0cnVjdGlvbikKKworICAgZiAgICAzIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgaWRlbnRpZmllciBhdCAyNQorICAgTyAgICAyMCBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDE1IGJpdHMgYXQgMjAKKyAgICAgICAgYW5kIDUgYml0cyBhdCAzMQorICAgbyAgICAxNSBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBhdCAyMAorICAgMiAgICAyMiBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDE3IGJpdHMgYXQgMjAKKyAgICAgICAgYW5kIDUgYml0cyBhdCAzMQorICAgMSAgICAxNSBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDEwIGJpdHMgYXQgMjAKKyAgICAgICAgYW5kIDUgYml0cyBhdCAzMQorICAgMCAgICAxMCBiaXQgU3BlY2lhbCBGdW5jdGlvbiBVbml0IG9wZXJhdGlvbiBzcGxpdCBiZXR3ZWVuIDUgYml0cyBhdCAyMAorICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCisgICB1ICAgIDMgYml0IGNvcHJvY2Vzc29yIHVuaXQgaWRlbnRpZmllciBhdCAyNQorICAgRiAgICBTb3VyY2UgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgQ29tcGxldGVyIGVuY29kZWQgMiBiaXRzIGF0IDIwCisgICBJICAgIFNvdXJjZSBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAxIGJpdHMgYXQgMjAKKwkoZm9yIDB4ZSBmb3JtYXQgRlAgaW5zdHJ1Y3Rpb25zKQorICAgRyAgICBEZXN0aW5hdGlvbiBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAyIGJpdHMgYXQgMTgKKyAgIE0gICAgRmxvYXRpbmctUG9pbnQgQ29tcGFyZSBDb25kaXRpb25zIChlbmNvZGVkIGFzIDUgYml0cyBhdCAzMSkKKyAgID8gICAgbm9uLW5lZ2F0ZWQvbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbnMuCisgICBAICAgIG5vbi1uZWdhdGVkL25lZ2F0ZWQgYWRkIGNvbmRpdGlvbnMuCisgICAhICAgIG5vbi1uZWdhdGVkIGFkZCBjb25kaXRpb25zLgorCisgICBzICAgIDIgYml0IHNwYWNlIHNwZWNpZmllciBhdCAxNy4KKyAgIGIgICAgcmVnaXN0ZXIgZmllbGQgYXQgMTAuCisgICByCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMSAoZm9yIHRoZSBicmVhayBpbnN0cnVjdGlvbikKKwkodmVyeSBzaW1pbGFyIHRvIFYgYWJvdmUsIGV4Y2VwdCB0aGUgdmFsdWUgaXMgdW5zaWduZWQgaW5zdGVhZCBvZgorCWxvd19zaWduX2V4dCkKKyAgIFIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDE1IChmb3IgdGhlIHNzbSwgcnNtLCBwcm9iZWkgaW5zdHJ1Y3Rpb25zKQorCShzYW1lIGFzIHIgYWJvdmUsIGV4Y2VwdCB0aGUgdmFsdWUgaXMgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24pCisgICBRCTUgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAxMCAoYSBiaXQgcG9zaXRpb24gc3BlY2lmaWVkIGluCisJdGhlIGJiIGluc3RydWN0aW9uLiBJdCdzIHRoZSBzYW1lIGFzIHIgYWJvdmUsIGV4Y2VwdCB0aGUKKyAgICAgICAgdmFsdWUgaXMgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24pCisgICB8CXNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb25zIHdoZW4gdXNlZCBpbiBhIGNvbmRpdGlvbmFsIGJyYW5jaAorCitBbmQgdGhlc2UgKFBKSCkgZm9yIFBBLTg5IEYuUC4gcmVnaXN0ZXJzIGFuZCBpbnN0cnVjdGlvbnM6CisKKyAgIHYgICAgYSAndCcgb3BlcmFuZCB0eXBlIGV4dGVuZGVkIHRvIGhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzLgorICAgRSAgICBhICdiJyBvcGVyYW5kIHR5cGUgZXh0ZW5kZWQgdG8gaGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMuCisgICBYICAgIGFuICd4JyBvcGVyYW5kIHR5cGUgZXh0ZW5kZWQgdG8gaGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMuCisgICBKICAgIGEgJ2InIG9wZXJhbmQgdHlwZSBmdXJ0aGVyIGV4dGVuZGVkIHRvIGhhbmRsZSBleHRyYSAxLjEgcmVnaXN0ZXJzCisgICBLICAgIGEgJ3gnIG9wZXJhbmQgdHlwZSBmdXJ0aGVyIGV4dGVuZGVkIHRvIGhhbmRsZSBleHRyYSAxLjEgcmVnaXN0ZXJzCisgICA0ICAgIGEgdmFyaWF0aW9uIG9mIHRoZSAnYicgb3BlcmFuZCB0eXBlIGZvciAnZm1weWFkZCcgYW5kICdmbXB5c3ViJworICAgNiAgICBhIHZhcmlhdGlvbiBvZiB0aGUgJ3gnIG9wZXJhbmQgdHlwZSBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKKyAgIDcgICAgYSB2YXJpYXRpb24gb2YgdGhlICd0JyBvcGVyYW5kIHR5cGUgZm9yICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInCisgICA4ICAgIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDIwICh1c2VkIGluICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInKQorICAgOSAgICA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAyNSAodXNlZCBpbiAnZm1weWFkZCcgYW5kICdmbXB5c3ViJykKKyAgIEggICAgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQgYXQgMjYgZm9yICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInCisgICAgICAgICh2ZXJ5IHNpbWlsYXIgdG8gJ0YnKQorKi8KKworCisvKiBMaXN0IG9mIGNoYXJhY3RlcnMgbm90IHRvIHB1dCBhIHNwYWNlIGFmdGVyLiAgTm90ZSB0aGF0CisgICAiLCIgaXMgaW5jbHVkZWQsIGFzIHRoZSAic3BvcE4iIG9wZXJhdGlvbnMgdXNlIGxpdGVyYWwKKyAgIGNvbW1hcyBpbiB0aGVpciBjb21wbGV0ZXIgc2VjdGlvbnMuICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29tcGxldGVyX2NoYXJzID0gIixDY1k8Pj8hQCsmVX5GZkdISU5uT29aTWFkdXwvPTAxMjMlZSRtfSI7CisKKy8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGlzIHRhYmxlIGlzIHNpZ25pZmljYW50OgorCisgICAqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUKKyAgIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCisKKyAgICogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYV9vcGNvZGUgcGFfb3Bjb2Rlc1tdID0KK3sKKworCisvKiBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCisKK3sgImIiLAkJMHhlODAwMDAwMCwgMHhmZmUwZTAwMCwgIm5XIiwgcGExMH0sIC8qIGJsIGZvbyxyMCAqLworeyAibGRpIiwJMHgzNDAwMDAwMCwgMHhmZmUwYzAwMCwgImoseCIsIHBhMTB9LAkvKiBsZG8gdmFsKHIwKSxyICovCit7ICJjb21pYiIsIAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLCAiP241LGIsdyIsIHBhMTB9LCAvKiBjb21pYnt0Zn0qLworeyAiY29tYiIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bngsYix3IiwgcGExMH0sIC8qIGNvbWJ7dGZ9ICovCit7ICJhZGRiIiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwgIkBueCxiLHciLCBwYTEwfSwgLyogYWRkYnt0Zn0gKi8KK3sgImFkZGliIiwJMHhhNDAwMDAwMCwgMHhmYzAwMDAwMCwgIkBuNSxiLHciLCBwYTEwfSwgLyogYWRkaWJ7dGZ9Ki8KK3sgIm5vcCIsICAgICAgICAweDA4MDAwMjQwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sICAgICAgLyogb3IgMCwwLDAgKi8KK3sgImNvcHkiLCAgICAgICAweDA4MDAwMjQwLCAweGZmZTBmZmUwLCAieCx0IiwgcGExMH0sICAgLyogb3IgciwwLHQgKi8KK3sgIm10c2FyIiwgICAgICAweDAxNjAxODQwLCAweGZmZTBmZmZmLCAieCIsIHBhMTB9LCAvKiBtdGN0bCByLGNyMTEgKi8KKworLyogTG9hZHMgYW5kIFN0b3JlcyBmb3IgaW50ZWdlciByZWdpc3RlcnMuICAqLworeyAibGR3IiwgICAgICAgIDB4NDgwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTB9LAoreyAibGR3IiwgICAgICAgIDB4NDgwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwfSwKK3sgImxkaCIsICAgICAgICAweDQ0MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKK3sgImxkaCIsICAgICAgICAweDQ0MDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCit7ICJsZGIiLCAgICAgICAgMHg0MDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMH0sCit7ICJsZGIiLCAgICAgICAgMHg0MDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTB9LAoreyAic3R3IiwgICAgICAgIDB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTB9LAoreyAic3R3IiwgICAgICAgIDB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwfSwKK3sgInN0aCIsICAgICAgICAweDY0MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwfSwKK3sgInN0aCIsICAgICAgICAweDY0MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMH0sCit7ICJzdGIiLCAgICAgICAgMHg2MDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCit7ICJzdGIiLCAgICAgICAgMHg2MDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoreyAibGR3bSIsICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTB9LAoreyAibGR3bSIsICAgICAgIDB4NGMwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwfSwKK3sgInN0d20iLCAgICAgICAweDZjMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwfSwKK3sgInN0d20iLCAgICAgICAweDZjMDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMH0sCit7ICJsZHd4IiwgICAgICAgMHgwYzAwMDA4MCwgMHhmYzAwMWZjMCwgImN4KHMsYiksdCIsIHBhMTB9LAoreyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeChiKSx0IiwgcGExMH0sCit7ICJsZGh4IiwgICAgICAgMHgwYzAwMDA0MCwgMHhmYzAwMWZjMCwgImN4KHMsYiksdCIsIHBhMTB9LAoreyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeChiKSx0IiwgcGExMH0sCit7ICJsZGJ4IiwgICAgICAgMHgwYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4KHMsYiksdCIsIHBhMTB9LAoreyAibGRieCIsICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeChiKSx0IiwgcGExMH0sCit7ICJsZHdheCIsICAgICAgMHgwYzAwMDE4MCwgMHhmYzAwZGZjMCwgImN4KGIpLHQiLCBwYTEwfSwKK3sgImxkY3d4IiwgICAgICAweDBjMDAwMWMwLCAweGZjMDAxZmMwLCAiY3gocyxiKSx0IiwgcGExMH0sCit7ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4KGIpLHQiLCBwYTEwfSwKK3sgImxkd3MiLAkweDBjMDAxMDgwLCAweGZjMDAxZmMwLCAiQzUocyxiKSx0IiwgcGExMH0sCit7ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKK3sgImxkaHMiLAkweDBjMDAxMDQwLCAweGZjMDAxZmMwLCAiQzUocyxiKSx0IiwgcGExMH0sCit7ICJsZGhzIiwJMHgwYzAwMTA0MCwgMHhmYzAwMWZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKK3sgImxkYnMiLAkweDBjMDAxMDAwLCAweGZjMDAxZmMwLCAiQzUocyxiKSx0IiwgcGExMH0sCit7ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKK3sgImxkd2FzIiwJMHgwYzAwMTE4MCwgMHhmYzAwZGZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKK3sgImxkY3dzIiwJMHgwYzAwMTFjMCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoreyAibGRjd3MiLAkweDBjMDAxMWMwLCAweGZjMDAxZmMwLCAiQzUoYiksdCIsIHBhMTB9LAoreyAic3R3cyIsCTB4MGMwMDEyODAsIDB4ZmMwMDFmYzAsICJDeCxWKHMsYikiLCBwYTEwfSwKK3sgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiQ3gsVihiKSIsIHBhMTB9LAoreyAic3RocyIsCTB4MGMwMDEyNDAsIDB4ZmMwMDFmYzAsICJDeCxWKHMsYikiLCBwYTEwfSwKK3sgInN0aHMiLAkweDBjMDAxMjQwLCAweGZjMDAxZmMwLCAiQ3gsVihiKSIsIHBhMTB9LAoreyAic3RicyIsCTB4MGMwMDEyMDAsIDB4ZmMwMDFmYzAsICJDeCxWKHMsYikiLCBwYTEwfSwKK3sgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3gsVihiKSIsIHBhMTB9LAoreyAic3R3YXMiLAkweDBjMDAxMzgwLCAweGZjMDBkZmMwLCAiQ3gsVihiKSIsIHBhMTB9LAoreyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiWXgsVihzLGIpIiwgcGExMH0sCit7ICJzdGJ5cyIsCTB4MGMwMDEzMDAsIDB4ZmMwMDFmYzAsICJZeCxWKGIpIiwgcGExMH0sCisKKy8qIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuICAqLworeyAibGRvIiwJMHgzNDAwMDAwMCwgMHhmYzAwYzAwMCwgImooYikseCIsIHBhMTB9LAoreyAibGRpbCIsCTB4MjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIiLCBwYTEwfSwKK3sgImFkZGlsIiwJMHgyODAwMDAwMCwgMHhmYzAwMDAwMCwgImssYiIsIHBhMTB9LAorCisvKiBCcmFuY2hpbmcgaW5zdHJ1Y3Rpb25zLiAqLworeyAiYmwiLAkJMHhlODAwMDAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwfSwKK3sgImdhdGUiLAkweGU4MDAyMDAwLCAweGZjMDBlMDAwLCAiblcsYiIsIHBhMTB9LAoreyAiYmxyIiwJMHhlODAwNDAwMCwgMHhmYzAwZTAwMSwgIm54LGIiLCBwYTEwfSwKK3sgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJueChiKSIsIHBhMTB9LAoreyAiYnYiLAkJMHhlODAwYzAwMCwgMHhmYzAwZmZmZCwgIm4oYikiLCBwYTEwfSwKK3sgImJlIiwJCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsICJueihTLGIpIiwgcGExMH0sCit7ICJibGUiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLCAibnooUyxiKSIsIHBhMTB9LAoreyAibW92YiIsCTB4YzgwMDAwMDAsIDB4ZmMwMDAwMDAsICJ8bngsYix3IiwgcGExMH0sCit7ICJtb3ZpYiIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsICJ8bjUsYix3IiwgcGExMH0sCit7ICJjb21idCIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI8bngsYix3IiwgcGExMH0sCit7ICJjb21iZiIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsICI8bngsYix3IiwgcGExMH0sCit7ICJjb21pYnQiLAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLCAiPG41LGIsdyIsIHBhMTB9LAoreyAiY29taWJmIiwJMHg4YzAwMDAwMCwgMHhmYzAwMDAwMCwgIjxuNSxiLHciLCBwYTEwfSwKK3sgImFkZGJ0IiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwgIiFueCxiLHciLCBwYTEwfSwKK3sgImFkZGJmIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwgIiFueCxiLHciLCBwYTEwfSwKK3sgImFkZGlidCIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbjUsYix3IiwgcGExMH0sCit7ICJhZGRpYmYiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLCAiIW41LGIsdyIsIHBhMTB9LAoreyAiYmIiLAkJMHhjNDAwNDAwMCwgMHhmYzAwNDAwMCwgIn5ueCxRLHciLCBwYTEwfSwgCit7ICJidmIiLAkweGMwMDA0MDAwLCAweGZmZTA0MDAwLCAifm54LHciLCBwYTEwfSwKKworLyogQ29tcHV0YXRpb24gSW5zdHJ1Y3Rpb25zICovCisKK3sgImFkZCIsICAgICAgICAweDA4MDAwNjAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCit7ICJhZGRsIiwgICAgICAgMHgwODAwMGEwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoreyAiYWRkbyIsICAgICAgIDB4MDgwMDBlMDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKK3sgImFkZGMiLCAgICAgICAweDA4MDAwNzAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCit7ICJhZGRjbyIsICAgICAgMHgwODAwMGYwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoreyAic2gxYWRkIiwgICAgIDB4MDgwMDA2NDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKK3sgInNoMWFkZGwiLCAgICAweDA4MDAwYTQwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCit7ICJzaDFhZGRvIiwgICAgMHgwODAwMGU0MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoreyAic2gyYWRkIiwgICAgIDB4MDgwMDA2ODAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKK3sgInNoMmFkZGwiLCAgICAweDA4MDAwYTgwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCit7ICJzaDJhZGRvIiwgICAgMHgwODAwMGU4MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoreyAic2gzYWRkIiwgICAgIDB4MDgwMDA2YzAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKK3sgInNoM2FkZGwiLCAgICAweDA4MDAwYWMwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCit7ICJzaDNhZGRvIiwgICAgMHgwODAwMGVjMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoreyAic3ViIiwgICAgICAgIDB4MDgwMDA0MDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKK3sgInN1Ym8iLCAgICAgICAweDA4MDAwYzAwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCit7ICJzdWJiIiwgICAgICAgMHgwODAwMDUwMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoreyAic3ViYm8iLCAgICAgIDB4MDgwMDBkMDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKK3sgInN1YnQiLCAgICAgICAweDA4MDAwNGMwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCit7ICJzdWJ0byIsICAgICAgMHgwODAwMGNjMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoreyAiZHMiLCAgICAgICAgIDB4MDgwMDA0NDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKK3sgImNvbWNsciIsICAgICAweDA4MDAwODgwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCit7ICJvciIsICAgICAgICAgMHgwODAwMDI0MCwgMHhmYzAwMGZlMCwgIiZ4LGIsdCIsIHBhMTB9LAoreyAieG9yIiwgICAgICAgIDB4MDgwMDAyODAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKK3sgImFuZCIsICAgICAgICAweDA4MDAwMjAwLCAweGZjMDAwZmUwLCAiJngsYix0IiwgcGExMH0sCit7ICJhbmRjbSIsICAgICAgMHgwODAwMDAwMCwgMHhmYzAwMGZlMCwgIiZ4LGIsdCIsIHBhMTB9LAoreyAidXhvciIsICAgICAgIDB4MDgwMDAzODAsIDB4ZmMwMDBmZTAsICJVeCxiLHQiLCBwYTEwfSwKK3sgInVhZGRjbSIsICAgICAweDA4MDAwOTgwLCAweGZjMDAwZmUwLCAiVXgsYix0IiwgcGExMH0sCit7ICJ1YWRkY210IiwgICAgMHgwODAwMDljMCwgMHhmYzAwMGZlMCwgIlV4LGIsdCIsIHBhMTB9LAoreyAiZGNvciIsICAgICAgIDB4MDgwMDBiODAsIDB4ZmMxZjBmZTAsICJVYix0IiwgICBwYTEwfSwKK3sgImlkY29yIiwgICAgICAweDA4MDAwYmMwLCAweGZjMWYwZmUwLCAiVWIsdCIsICAgcGExMH0sCit7ICJhZGRpIiwgICAgICAgMHhiNDAwMDAwMCwgMHhmYzAwMDgwMCwgImRpLGIseCIsIHBhMTB9LAoreyAiYWRkaW8iLCAgICAgIDB4YjQwMDA4MDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKK3sgImFkZGl0IiwgICAgICAweGIwMDAwMDAwLCAweGZjMDAwODAwLCAiZGksYix4IiwgcGExMH0sCit7ICJhZGRpdG8iLCAgICAgMHhiMDAwMDgwMCwgMHhmYzAwMDgwMCwgImRpLGIseCIsIHBhMTB9LAoreyAic3ViaSIsICAgICAgIDB4OTQwMDAwMDAsIDB4ZmMwMDA4MDAsICJhaSxiLHgiLCBwYTEwfSwKK3sgInN1YmlvIiwgICAgICAweDk0MDAwODAwLCAweGZjMDAwODAwLCAiYWksYix4IiwgcGExMH0sCit7ICJjb21pY2xyIiwgICAgMHg5MDAwMDAwMCwgMHhmYzAwMDgwMCwgImFpLGIseCIsIHBhMTB9LAorCisvKiBFeHRyYWN0IGFuZCBEZXBvc2l0IEluc3RydWN0aW9ucyAqLworCit7ICJ2c2hkIiwgICAgICAgMHhkMDAwMDAwMCwgMHhmYzAwMWZlMCwgIj54LGIsdCIsIHBhMTB9LAoreyAic2hkIiwgICAgICAgIDB4ZDAwMDA4MDAsIDB4ZmMwMDFjMDAsICI+eCxiLHAsdCIsIHBhMTB9LAoreyAidmV4dHJ1IiwgICAgIDB4ZDAwMDEwMDAsIDB4ZmMwMDFmZTAsICI+YixULHgiLCBwYTEwfSwKK3sgInZleHRycyIsICAgICAweGQwMDAxNDAwLCAweGZjMDAxZmUwLCAiPmIsVCx4IiwgcGExMH0sCit7ICJleHRydSIsICAgICAgMHhkMDAwMTgwMCwgMHhmYzAwMWMwMCwgIj5iLFAsVCx4IiwgcGExMH0sCit7ICJleHRycyIsICAgICAgMHhkMDAwMWMwMCwgMHhmYzAwMWMwMCwgIj5iLFAsVCx4IiwgcGExMH0sCit7ICJ6dmRlcCIsICAgICAgMHhkNDAwMDAwMCwgMHhmYzAwMWZlMCwgIj54LFQsYiIsIHBhMTB9LAoreyAidmRlcCIsICAgICAgIDB4ZDQwMDA0MDAsIDB4ZmMwMDFmZTAsICI+eCxULGIiLCBwYTEwfSwKK3sgInpkZXAiLCAgICAgICAweGQ0MDAwODAwLCAweGZjMDAxYzAwLCAiPngscCxULGIiLCBwYTEwfSwKK3sgImRlcCIsICAgICAgICAweGQ0MDAwYzAwLCAweGZjMDAxYzAwLCAiPngscCxULGIiLCBwYTEwfSwKK3sgInp2ZGVwaSIsICAgICAweGQ0MDAxMDAwLCAweGZjMDAxZmUwLCAiPjUsVCxiIiwgcGExMH0sCit7ICJ2ZGVwaSIsICAgICAgMHhkNDAwMTQwMCwgMHhmYzAwMWZlMCwgIj41LFQsYiIsIHBhMTB9LAoreyAiemRlcGkiLCAgICAgIDB4ZDQwMDE4MDAsIDB4ZmMwMDFjMDAsICI+NSxwLFQsYiIsIHBhMTB9LAoreyAiZGVwaSIsICAgICAgIDB4ZDQwMDFjMDAsIDB4ZmMwMDFjMDAsICI+NSxwLFQsYiIsIHBhMTB9LAorCisvKiBTeXN0ZW0gQ29udHJvbCBJbnN0cnVjdGlvbnMgKi8KKworeyAiYnJlYWsiLCAgICAgIDB4MDAwMDAwMDAsIDB4ZmMwMDFmZTAsICJyLEEiLCBwYTEwfSwKK3sgInJmaSIsICAgICAgICAweDAwMDAwYzAwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCit7ICJyZmlyIiwgICAgICAgMHgwMDAwMGNhMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTF9LAoreyAic3NtIiwgICAgICAgIDB4MDAwMDBkNjAsIDB4ZmZlMGZmZTAsICJSLHQiLCBwYTEwfSwKK3sgInJzbSIsICAgICAgICAweDAwMDAwZTYwLCAweGZmZTBmZmUwLCAiUix0IiwgcGExMH0sCit7ICJtdHNtIiwgICAgICAgMHgwMDAwMTg2MCwgMHhmZmUwZmZmZiwgIngiLCBwYTEwfSwKK3sgImxkc2lkIiwgICAgICAweDAwMDAxMGEwLCAweGZjMWYzZmUwLCAiKHMsYiksdCIsIHBhMTB9LAoreyAibGRzaWQiLCAgICAgIDB4MDAwMDEwYTAsIDB4ZmMxZjNmZTAsICIoYiksdCIsIHBhMTB9LAoreyAibXRzcCIsICAgICAgIDB4MDAwMDE4MjAsIDB4ZmZlMDFmZmYsICJ4LFMiLCBwYTEwfSwKK3sgIm10Y3RsIiwgICAgICAweDAwMDAxODQwLCAweGZjMDBmZmZmLCAieCxeIiwgcGExMH0sCit7ICJtZnNwIiwgICAgICAgMHgwMDAwMDRhMCwgMHhmZmZmMWZlMCwgIlMsdCIsIHBhMTB9LAoreyAibWZjdGwiLCAgICAgIDB4MDAwMDA4YTAsIDB4ZmMxZmZmZTAsICJeLHQiLCBwYTEwfSwKK3sgInN5bmMiLCAgICAgICAweDAwMDAwNDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCit7ICJzeW5jZG1hIiwgICAgMHgwMDEwMDQwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LAoreyAicHJvYmVyIiwgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmZTAsICIocyxiKSx4LHQiLCBwYTEwfSwKK3sgInByb2JlciIsICAgICAweDA0MDAxMTgwLCAweGZjMDAzZmUwLCAiKGIpLHgsdCIsIHBhMTB9LAoreyAicHJvYmVyaSIsICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmZTAsICIocyxiKSxSLHQiLCBwYTEwfSwKK3sgInByb2JlcmkiLCAgICAweDA0MDAzMTgwLCAweGZjMDAzZmUwLCAiKGIpLFIsdCIsIHBhMTB9LAoreyAicHJvYmV3IiwgICAgIDB4MDQwMDExYzAsIDB4ZmMwMDNmZTAsICIocyxiKSx4LHQiLCBwYTEwfSwKK3sgInByb2JldyIsICAgICAweDA0MDAxMWMwLCAweGZjMDAzZmUwLCAiKGIpLHgsdCIsIHBhMTB9LAoreyAicHJvYmV3aSIsICAgIDB4MDQwMDMxYzAsIDB4ZmMwMDNmZTAsICIocyxiKSxSLHQiLCBwYTEwfSwKK3sgInByb2Jld2kiLCAgICAweDA0MDAzMWMwLCAweGZjMDAzZmUwLCAiKGIpLFIsdCIsIHBhMTB9LAoreyAibHBhIiwgICAgICAgIDB4MDQwMDEzNDAsIDB4ZmMwMDNmYzAsICJaeChzLGIpLHQiLCBwYTEwfSwKK3sgImxwYSIsICAgICAgICAweDA0MDAxMzQwLCAweGZjMDAzZmMwLCAiWngoYiksdCIsIHBhMTB9LAoreyAibGhhIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmYzAsICJaeChzLGIpLHQiLCBwYTEwfSwKK3sgImxoYSIsICAgICAgICAweDA0MDAxMzAwLCAweGZjMDAzZmMwLCAiWngoYiksdCIsIHBhMTB9LAoreyAibGNpIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmZTAsICJ4KHMsYiksdCIsIHBhMTB9LAoreyAibGNpIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmZTAsICJ4KGIpLHQiLCBwYTEwfSwKK3sgInBkdGxiIiwgICAgICAweDA0MDAxMjAwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoreyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoreyAicGl0bGIiLCAgICAgIDB4MDQwMDAyMDAsIDB4ZmMwMDFmZGYsICJaeChTLGIpIiwgcGExMH0sCit7ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgIlp4KGIpIiwgcGExMH0sCit7ICJwZHRsYmUiLCAgICAgMHgwNDAwMTI0MCwgMHhmYzAwM2ZkZiwgIlp4KHMsYikiLCBwYTEwfSwKK3sgInBkdGxiZSIsICAgICAweDA0MDAxMjQwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTEwfSwKK3sgInBpdGxiZSIsICAgICAweDA0MDAwMjQwLCAweGZjMDAxZmRmLCAiWngoUyxiKSIsIHBhMTB9LAoreyAicGl0bGJlIiwgICAgIDB4MDQwMDAyNDAsIDB4ZmMwMDFmZGYsICJaeChiKSIsIHBhMTB9LAoreyAiaWR0bGJhIiwgICAgIDB4MDQwMDEwNDAsIDB4ZmMwMDNmZmYsICJ4LChzLGIpIiwgcGExMH0sCit7ICJpZHRsYmEiLCAgICAgMHgwNDAwMTA0MCwgMHhmYzAwM2ZmZiwgIngsKGIpIiwgcGExMH0sCit7ICJpaXRsYmEiLCAgICAgMHgwNDAwMDA0MCwgMHhmYzAwMWZmZiwgIngsKFMsYikiLCBwYTEwfSwKK3sgImlpdGxiYSIsICAgICAweDA0MDAwMDQwLCAweGZjMDAxZmZmLCAieCwoYikiLCBwYTEwfSwKK3sgImlkdGxicCIsICAgICAweDA0MDAxMDAwLCAweGZjMDAzZmZmLCAieCwocyxiKSIsIHBhMTB9LAoreyAiaWR0bGJwIiwgICAgIDB4MDQwMDEwMDAsIDB4ZmMwMDNmZmYsICJ4LChiKSIsIHBhMTB9LAoreyAiaWl0bGJwIiwgICAgIDB4MDQwMDAwMDAsIDB4ZmMwMDFmZmYsICJ4LChTLGIpIiwgcGExMH0sCit7ICJpaXRsYnAiLCAgICAgMHgwNDAwMDAwMCwgMHhmYzAwMWZmZiwgIngsKGIpIiwgcGExMH0sCit7ICJwZGMiLCAgICAgICAgMHgwNDAwMTM4MCwgMHhmYzAwM2ZkZiwgIlp4KHMsYikiLCBwYTEwfSwKK3sgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTEwfSwKK3sgImZkYyIsICAgICAgICAweDA0MDAxMjgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoreyAiZmRjIiwgICAgICAgIDB4MDQwMDEyODAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoreyAiZmljIiwgICAgICAgIDB4MDQwMDAyODAsIDB4ZmMwMDFmZGYsICJaeChTLGIpIiwgcGExMH0sCit7ICJmaWMiLCAgICAgICAgMHgwNDAwMDI4MCwgMHhmYzAwMWZkZiwgIlp4KGIpIiwgcGExMH0sCit7ICJmZGNlIiwgICAgICAgMHgwNDAwMTJjMCwgMHhmYzAwM2ZkZiwgIlp4KHMsYikiLCBwYTEwfSwKK3sgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTEwfSwKK3sgImZpY2UiLCAgICAgICAweDA0MDAwMmMwLCAweGZjMDAxZmRmLCAiWngoUyxiKSIsIHBhMTB9LAoreyAiZmljZSIsICAgICAgIDB4MDQwMDAyYzAsIDB4ZmMwMDFmZGYsICJaeChiKSIsIHBhMTB9LAoreyAiZGlhZyIsICAgICAgIDB4MTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJEIiwgcGExMH0sCisKKy8qIGdmdyBhbmQgZ2ZyIGFyZSBub3QgaW4gdGhlIEhQIFBBIDEuMSBtYW51YWwsIGJ1dCB0aGV5IGFyZSBpbiBlaXRoZXIKKyAgIHRoZSBUaW1leCBGUFUgb3IgdGhlIE11c3RhbmcgRVJTIChub3Qgc3VyZSB3aGljaCkgbWFudWFsLiAgKi8KK3sgImdmdyIsCTB4MDQwMDE2ODAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMX0sCit7ICJnZnciLAkweDA0MDAxNjgwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTExfSwKK3sgImdmciIsCTB4MDQwMDFhODAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMX0sCit7ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiWngoYikiLCBwYTExfSwKKworLyogRmxvYXRpbmcgUG9pbnQgQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCisgIAoreyAiZmxkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFmODAsICJjeChzLGIpLHYiLCBwYTEwfSwKK3sgImZsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZjgwLCAiY3goYiksdiIsIHBhMTB9LAoreyAiZmxkZHgiLCAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHkiLCBwYTEwfSwKK3sgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3goYikseSIsIHBhMTB9LAoreyAiZnN0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFmODAsICJjdix4KHMsYikiLCBwYTEwfSwKK3sgImZzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZjgwLCAiY3YseChiKSIsIHBhMTB9LAoreyAiZnN0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeSx4KHMsYikiLCBwYTEwfSwKK3sgImZzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChiKSIsIHBhMTB9LAoreyAiZnN0cXgiLCAgICAgIDB4M2MwMDAyMDAsIDB4ZmMwMDFmYzAsICJjeSx4KHMsYikiLCBwYTEwfSwKK3sgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChiKSIsIHBhMTB9LAoreyAiZmxkd3MiLCAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFmODAsICJDNShzLGIpLHYiLCBwYTEwfSwKK3sgImZsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZjgwLCAiQzUoYiksdiIsIHBhMTB9LAoreyAiZmxkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFmYzAsICJDNShzLGIpLHkiLCBwYTEwfSwKK3sgImZsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZmMwLCAiQzUoYikseSIsIHBhMTB9LAoreyAiZnN0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFmODAsICJDdiw1KHMsYikiLCBwYTEwfSwKK3sgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiQ3YsNShiKSIsIHBhMTB9LAoreyAiZnN0ZHMiLCAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFmYzAsICJDeSw1KHMsYikiLCBwYTEwfSwKK3sgImZzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShiKSIsIHBhMTB9LAoreyAiZnN0cXMiLCAgICAgIDB4M2MwMDEyMDAsIDB4ZmMwMDFmYzAsICJDeSw1KHMsYikiLCBwYTEwfSwKK3sgImZzdHFzIiwgICAgICAweDNjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShiKSIsIHBhMTB9LAoreyAiZmFkZCIsICAgICAgIDB4MzAwMDA2MDAsIDB4ZmMwMGU3ZTAsICJGRSxYLHYiLCBwYTEwfSwKK3sgImZhZGQiLCAgICAgICAweDM4MDAwNjAwLCAweGZjMDBlNzIwLCAiSUosSyx2IiwgcGExMH0sCit7ICJmc3ViIiwgICAgICAgMHgzMDAwMjYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoreyAiZnN1YiIsICAgICAgIDB4MzgwMDI2MDAsIDB4ZmMwMGU3MjAsICJJSixLLHYiLCBwYTEwfSwKK3sgImZtcHkiLCAgICAgICAweDMwMDA0NjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCit7ICJmbXB5IiwgICAgICAgMHgzODAwNDYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoreyAiZmRpdiIsICAgICAgIDB4MzAwMDY2MDAsIDB4ZmMwMGU3ZTAsICJGRSxYLHYiLCBwYTEwfSwKK3sgImZkaXYiLCAgICAgICAweDM4MDA2NjAwLCAweGZjMDBlNzIwLCAiSUosSyx2IiwgcGExMH0sCit7ICJmc3FydCIsICAgICAgMHgzMDAwODAwMCwgMHhmYzFmZTdlMCwgIkZFLHYiLCBwYTEwfSwKK3sgImZzcXJ0IiwgICAgICAweDM4MDA4MDAwLCAweGZjMWZlNzIwLCAiRkosdiIsIHBhMTB9LAoreyAiZmFicyIsICAgICAgIDB4MzAwMDYwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGExMH0sCit7ICJmYWJzIiwgICAgICAgMHgzODAwNjAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTEwfSwKK3sgImZyZW0iLCAgICAgICAweDMwMDA4NjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCit7ICJmcmVtIiwgICAgICAgMHgzODAwODYwMCwgMHhmYzAwZTcyMCwgIkZKLEssdiIsIHBhMTB9LAoreyAiZnJuZCIsICAgICAgIDB4MzAwMGEwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGExMH0sCit7ICJmcm5kIiwgICAgICAgMHgzODAwYTAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTEwfSwKK3sgImZjcHkiLCAgICAgICAweDMwMDA0MDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoreyAiZmNweSIsICAgICAgIDB4MzgwMDQwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCit7ICJmY252ZmYiLCAgICAgMHgzMDAwMDIwMCwgMHhmYzFmODdlMCwgIkZHRSx2IiwgcGExMH0sCit7ICJmY252ZmYiLCAgICAgMHgzODAwMDIwMCwgMHhmYzFmODcyMCwgIkZHSix2IiwgcGExMH0sCit7ICJmY252eGYiLCAgICAgMHgzMDAwODIwMCwgMHhmYzFmODdlMCwgIkZHRSx2IiwgcGExMH0sCit7ICJmY252eGYiLCAgICAgMHgzODAwODIwMCwgMHhmYzFmODcyMCwgIkZHSix2IiwgcGExMH0sCit7ICJmY252ZngiLCAgICAgMHgzMDAxMDIwMCwgMHhmYzFmODdlMCwgIkZHRSx2IiwgcGExMH0sCit7ICJmY252ZngiLCAgICAgMHgzODAxMDIwMCwgMHhmYzFmODcyMCwgIkZHSix2IiwgcGExMH0sCit7ICJmY252Znh0IiwgICAgMHgzMDAxODIwMCwgMHhmYzFmODdlMCwgIkZHRSx2IiwgcGExMH0sCit7ICJmY252Znh0IiwgICAgMHgzODAxODIwMCwgMHhmYzFmODcyMCwgIkZHSix2IiwgcGExMH0sCit7ICJmbXB5ZmFkZCIsICAgMHhiODAwMDAwMCwgMHhmYzAwMDAyMCwgIkZFLFgsMyx2IiwgcGEyMH0sCit7ICJmbXB5bmZhZGQiLCAgMHhiODAwMDAyMCwgMHhmYzAwMDAyMCwgIkZFLFgsMyx2IiwgcGEyMH0sCit7ICJmbmVnIiwgICAgICAgMHgzMDAwYzAwMCwgMHhmYzFmZTdlMCwgIkZFLHYiLCBwYTIwfSwKK3sgImZuZWciLCAgICAgICAweDM4MDBjMDAwLCAweGZjMWZlNzIwLCAiRkosdiIsIHBhMjB9LAoreyAiZm5lZ2FicyIsICAgIDB4MzAwMGUwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGEyMH0sCit7ICJmbmVnYWJzIiwgICAgMHgzODAwZTAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTIwfSwKK3sgImZjbXAiLCAgICAgICAweDMwMDAwNDAwLCAweGZjMDBlN2UwLCAiRk1FLFgiLCBwYTEwfSwKK3sgImZjbXAiLCAgICAgICAweDM4MDAwNDAwLCAweGZjMDBlNzIwLCAiSU1KLEsiLCBwYTEwfSwKK3sgInhtcHl1IiwJMHgzODAwNDcwMCwgMHhmYzAwZTcyMCwgIkUsWCx2IiwgcGExMX0sCit7ICJmbXB5YWRkIiwJMHgxODAwMDAwMCwgMHhmYzAwMDAwMCwgIkg0LDYsNyw5LDgiLCBwYTExfSwKK3sgImZtcHlzdWIiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLCAiSDQsNiw3LDksOCIsIHBhMTF9LAoreyAiZnRlc3QiLCAgICAgIDB4MzAwMDI0MjAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwfSwKK3sgImZpZCIsICAgICAgICAweDMwMDAwMDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMX0sCisKKworLyogQXNzaXN0IEluc3RydWN0aW9ucyAqLworCit7ICJzcG9wMCIsICAgICAgMHgxMDAwMDAwMCwgMHhmYzAwMDYwMCwgImYsT04iLCBwYTEwfSwKK3sgInNwb3AxIiwgICAgICAweDEwMDAwMjAwLCAweGZjMDAwNjAwLCAiZixvTnQiLCBwYTEwfSwKK3sgInNwb3AyIiwgICAgICAweDEwMDAwNDAwLCAweGZjMDAwNjAwLCAiZiwxTmIiLCBwYTEwfSwKK3sgInNwb3AzIiwgICAgICAweDEwMDAwNjAwLCAweGZjMDAwNjAwLCAiZiwwTngsYiIsIHBhMTB9LAoreyAiY29wciIsICAgICAgIDB4MzAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ1LDJOIiwgcGExMH0sCit7ICJjbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChzLGIpLHQiLCBwYTEwfSwKK3sgImNsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZTAwLCAidWN4KGIpLHQiLCBwYTEwfSwKK3sgImNsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4KHMsYiksdCIsIHBhMTB9LAoreyAiY2xkZHgiLCAgICAgIDB4MmMwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3goYiksdCIsIHBhMTB9LAoreyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChzLGIpIiwgcGExMH0sCit7ICJjc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWUwMCwgInVjdCx4KGIpIiwgcGExMH0sCit7ICJjc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjdCx4KHMsYikiLCBwYTEwfSwKK3sgImNzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZTAwLCAidWN0LHgoYikiLCBwYTEwfSwKK3sgImNsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KHMsYiksdCIsIHBhMTB9LAoreyAiY2xkd3MiLCAgICAgIDB4MjQwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1QzUoYiksdCIsIHBhMTB9LAoreyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1QzUocyxiKSx0IiwgcGExMH0sCit7ICJjbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWUwMCwgInVDNShiKSx0IiwgcGExMH0sCit7ICJjc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KHMsYikiLCBwYTEwfSwKK3sgImNzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZTAwLCAidUN0LDUoYikiLCBwYTEwfSwKK3sgImNzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidUN0LDUocyxiKSIsIHBhMTB9LAoreyAiY3N0ZHMiLCAgICAgIDB4MmMwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Q3QsNShiKSIsIHBhMTB9LAorfTsKKworI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIHBhX29wY29kZXMpLyhzaXplb2YgcGFfb3Bjb2Rlc1swXSkpCisKKy8qIFNLViAxMi8xOC85Mi4gQWRkZWQgc29tZSBkZW5vdGF0aW9ucyBmb3IgdmFyaW91cyBvcGVyYW5kcy4gKi8KKworI2RlZmluZSBQQV9JTU0xMV9BVF8zMSAnaScKKyNkZWZpbmUgUEFfSU1NMTRfQVRfMzEgJ2onCisjZGVmaW5lIFBBX0lNTTIxX0FUXzMxICdrJworI2RlZmluZSBQQV9ESVNQMTIgJ3cnCisjZGVmaW5lIFBBX0RJU1AxNyAnVycKKworI2RlZmluZSBOX0hQUEFfT1BFUkFORF9GT1JNQVRTIDUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2kzODYuaCBiL2luY2x1ZGUvb3Bjb2RlL2kzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhmZWNlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCkBAIC0wLDAgKzEsMTA2MyBAQAorLyogb3Bjb2RlL2kzODYuaCAtLSBJbnRlbCA4MDM4NiBvcGNvZGUgdGFibGUKKyAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUgVW5peFdhcmUgYXNzZW1ibGVyLCBhbmQgcHJvYmFibHkgb3RoZXIgQVQmVCBkZXJpdmVkIGl4ODYgVW5peAorICAgYXNzZW1ibGVycywgZ2VuZXJhdGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHdpdGggcmV2ZXJzZWQKKyAgIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIGluIGNlcnRhaW4gY2FzZXMuICBVbmZvcnR1bmF0ZWx5LAorICAgZ2NjIGFuZCBwb3NzaWJseSBtYW55IG90aGVyIHByb2dyYW1zIHVzZSB0aGlzIHJldmVyc2VkIHN5bnRheCwgc28KKyAgIHdlJ3JlIHN0dWNrIHdpdGggaXQuCisKKyAgIGVnLiBgZnN1YiAlc3QoMyksJXN0JyByZXN1bHRzIGluIHN0IDwtIHN0IC0gc3QoMykgYXMgZXhwZWN0ZWQsIGJ1dAorICAgYGZzdWIgJXN0LCVzdCgzKScgcmVzdWx0cyBpbiBzdCgzKSA8LSBzdCAtIHN0KDMpLCByYXRoZXIgdGhhbgorICAgdGhlIGV4cGVjdGVkIHN0KDMpIDwtIHN0KDMpIC0gc3QgIQorCisgICBUaGlzIGhhcHBlbnMgd2l0aCBhbGwgdGhlIG5vbi1jb21tdXRhdGl2ZSBhcml0aG1ldGljIGZsb2F0aW5nIHBvaW50CisgICBvcGVyYXRpb25zIHdpdGggdHdvIHJlZ2lzdGVyIG9wZXJhbmRzLCB3aGVyZSB0aGUgc291cmNlIHJlZ2lzdGVyIGlzCisgICAlc3QsIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyAlc3QoaSkuICBMb29rIGZvciBGbG9hdERSIGJlbG93LiAgKi8KKworI2lmbmRlZiBVTklYV0FSRV9DT01QQVQKKy8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgorICAgbm9uLWJyb2tlbiBvcGNvZGVzIGF0IHlvdXIgcGVyaWwuICBnY2MgZ2VuZXJhdGVzIFVuaXhXYXJlCisgICBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIFVOSVhXQVJFX0NPTVBBVCAxCisjZW5kaWYKKworCitzdGF0aWMgY29uc3QgdGVtcGxhdGUgaTM4Nl9vcHRhYltdID0geworCisjZGVmaW5lIFggTm9uZQorI2RlZmluZSBSZXZlcnNlTW9kcm0gKFJldmVyc2VSZWdSZWdtZW18TW9kcm0pCisjZGVmaW5lIE5vU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgYl9TdWYgKE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgd19TdWYgKE5vX2JTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9fZFN1ZikKKyNkZWZpbmUgYndfU3VmIChOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQorI2RlZmluZSBibF9TdWYgKE5vX3dTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCisjZGVmaW5lIHdsX1N1ZiAoTm9fYlN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgc2xfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fZFN1ZnxOb194U3VmKQorI2RlZmluZSBzbGRfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9feFN1ZikKKyNkZWZpbmUgc2xkeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZikKKyNkZWZpbmUgYndsX1N1ZiAoTm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCisjZGVmaW5lIGJ3bGRfU3VmIChOb19zU3VmfE5vX3hTdWYpCisjZGVmaW5lIEZQIChOb1N1ZnxJZ25vcmVTaXplKQorI2RlZmluZSBsX0ZQIChsX1N1ZnxJZ25vcmVTaXplKQorI2RlZmluZSBkX0ZQIChkX1N1ZnxJZ25vcmVTaXplKQorI2RlZmluZSB4X0ZQICh4X1N1ZnxJZ25vcmVTaXplKQorI2RlZmluZSBzbF9GUCAoc2xfU3VmfElnbm9yZVNpemUpCisjZGVmaW5lIHNsZF9GUCAoc2xkX1N1ZnxJZ25vcmVTaXplKQorI2RlZmluZSBzbGR4X0ZQIChzbGR4X1N1ZnxJZ25vcmVTaXplKQorI2lmIFVOSVhXQVJFX0NPTVBBVAorI2RlZmluZSBGbG9hdERSIEZsb2F0RAorI2Vsc2UKKyNkZWZpbmUgRmxvYXREUiAoRmxvYXREfEZsb2F0UikKKyNlbmRpZgorCisvKiBtb3ZlIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBNT1ZfQVhfRElTUDMyIDB4YTAKK3sgIm1vdiIsICAgMiwJMHhhMCwgWCwgYndsX1N1ZnxEfFcsCQkJeyBEaXNwMTZ8RGlzcDMyLCBBY2MsIDAgfSB9LAoreyAibW92IiwgICAyLAkweDg4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKK3sgIm1vdiIsICAgMiwJMHhiMCwgWCwgYndsX1N1ZnxXfFNob3J0Rm9ybSwJCXsgSW1tLCBSZWcsIDAgfSB9LAoreyAibW92IiwgICAyLAkweGM2LCBYLCBid2xfU3VmfFd8TW9kcm0sCQl7IEltbSwgUmVnfEFueU1lbSwgMCB9IH0sCisvKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFjY2VwdCBXb3JkUmVnIHNvIHRoYXQgYSBzZWdtZW50IHJlZ2lzdGVyCisgICBjYW4gYmUgY29waWVkIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCBhbmQgdmljZSB2ZXJzYSwgd2l0aG91dCB1c2luZyBhCisgICBzaXplIHByZWZpeC4gIFdoZW4gbW92aW5nIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCB0aGUgdXBwZXIgMTYgYml0cworICAgYXJlIHNldCB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHZhbHVlIChvbiB0aGUgUGVudGl1bSBQcm8sCisgICB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSBpcyB6ZXJvKS4gICovCit7ICJtb3YiLCAgIDIsCTB4OGMsIFgsIHdsX1N1ZnxNb2RybSwJCQl7IFNSZWczfFNSZWcyLCBXb3JkUmVnfFdvcmRNZW0sIDAgfSB9LAoreyAibW92IiwgICAyLAkweDhlLCBYLCB3bF9TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW0sIFNSZWczfFNSZWcyLCAwIH0gfSwKKy8qIG1vdmUgdG8vZnJvbSBjb250cm9sIGRlYnVnIHJlZ2lzdGVycyAqLworeyAibW92IiwgICAyLCAweDBmMjAsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBDb250cm9sLCBSZWczMiwgMH0gfSwKK3sgIm1vdiIsICAgMiwgMHgwZjIxLCBYLCBsX1N1ZnxEfE1vZHJtfElnbm9yZVNpemUsCXsgRGVidWcsIFJlZzMyLCAwfSB9LAoreyAibW92IiwgICAyLCAweDBmMjQsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBUZXN0LCBSZWczMiwgMH0gfSwKKworLyogbW92ZSB3aXRoIHNpZ24gZXh0ZW5kICovCisvKiAibW92c2JsIiAmICJtb3ZzYnciIG11c3Qgbm90IGJlIHVuaWZpZWQgaW50byAibW92c2IiIHRvIGF2b2lkCisgICBjb25mbGljdCB3aXRoIHRoZSAibW92cyIgc3RyaW5nIG1vdmUgaW5zdHJ1Y3Rpb24uICAqLworeyJtb3ZzYmwiLCAyLCAweDBmYmUsIFgsIE5vU3VmfFJldmVyc2VNb2RybSwJeyBSZWc4fEJ5dGVNZW0sIFJlZzMyLCAwfSB9LAoreyJtb3ZzYnciLCAyLCAweDBmYmUsIFgsIE5vU3VmfFJldmVyc2VNb2RybSwJeyBSZWc4fEJ5dGVNZW0sIFJlZzE2LCAwfSB9LAoreyJtb3Zzd2wiLCAyLCAweDBmYmYsIFgsIE5vU3VmfFJldmVyc2VNb2RybSwJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCisvKiBJbnRlbCBTeW50YXggKi8KK3sibW92c3giLCAgMiwgMHgwZmJmLCBYLCB3X1N1ZnxSZXZlcnNlTW9kcm18SWdub3JlU2l6ZSwgICAgeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCit7Im1vdnN4IiwgIDIsIDB4MGZiZSwgWCwgYl9TdWZ8UmV2ZXJzZU1vZHJtLCAgICB7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKKworLyogbW92ZSB3aXRoIHplcm8gZXh0ZW5kICovCit7Im1vdnpiIiwgIDIsIDB4MGZiNiwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBSZWc4fEJ5dGVNZW0sIFdvcmRSZWcsIDB9IH0sCit7Im1vdnp3bCIsIDIsIDB4MGZiNywgWCwgTm9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKKy8qIEludGVsIFN5bnRheCAqLworeyJtb3Z6eCIsICAyLCAweDBmYjcsIFgsIHdfU3VmfFJldmVyc2VNb2RybXxJZ25vcmVTaXplLCAgeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCit7Im1vdnp4IiwgIDIsIDB4MGZiNiwgWCwgYl9TdWZ8UmV2ZXJzZU1vZHJtLCAgIHsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAorCisvKiBwdXNoIGluc3RydWN0aW9ucyAqLworeyJwdXNoIiwgICAxLAkweDUwLCBYLCB3bF9TdWZ8U2hvcnRGb3JtLAl7IFdvcmRSZWcsMCwwIH0gfSwKK3sicHVzaCIsICAgMSwJMHhmZiwgNiwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIDAsIDAgfSB9LAoreyJwdXNoIiwgICAxLAkweDZhLCBYLCB3bF9TdWYsCQl7IEltbThTLCAwLCAwfSB9LAoreyJwdXNoIiwgICAxLAkweDY4LCBYLCB3bF9TdWYsCQl7IEltbTE2fEltbTMyLCAwLCAwfSB9LAoreyJwdXNoIiwgICAxLAkweDA2LCBYLCB3bF9TdWZ8U2VnMlNob3J0Rm9ybSwJeyBTUmVnMiwwLDAgfSB9LAoreyJwdXNoIiwgICAxLCAweDBmYTAsIFgsIHdsX1N1ZnxTZWczU2hvcnRGb3JtLAl7IFNSZWczLDAsMCB9IH0sCisvKiBwdXNoIGFsbCAqLworeyJwdXNoYSIsICAwLAkweDYwLCBYLCB3bF9TdWYsCQl7IDAsIDAsIDAgfSB9LAorCisvKiBwb3AgaW5zdHJ1Y3Rpb25zICovCit7InBvcCIsCSAgIDEsCTB4NTgsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywwLDAgfSB9LAoreyJwb3AiLAkgICAxLAkweDhmLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCisjZGVmaW5lIFBPUF9TRUdfU0hPUlQgMHgwNworeyJwb3AiLAkgICAxLAkweDA3LCBYLCB3bF9TdWZ8U2VnMlNob3J0Rm9ybSwJeyBTUmVnMiwwLDAgfSB9LAoreyJwb3AiLAkgICAxLCAweDBmYTEsIFgsIHdsX1N1ZnxTZWczU2hvcnRGb3JtLAl7IFNSZWczLDAsMCB9IH0sCisvKiBwb3AgYWxsICovCit7InBvcGEiLCAgIDAsCTB4NjEsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMCB9IH0sCisKKy8qIHhjaGcgZXhjaGFuZ2UgaW5zdHJ1Y3Rpb25zCisgICB4Y2hnIGNvbW11dGVzOiAgd2UgYWxsb3cgYm90aCBvcGVyYW5kIG9yZGVycyAqLworeyJ4Y2hnIiwgICAyLAkweDkwLCBYLCB3bF9TdWZ8U2hvcnRGb3JtLAl7IFdvcmRSZWcsIEFjYywgMCB9IH0sCit7InhjaGciLCAgIDIsCTB4OTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgQWNjLCBXb3JkUmVnLCAwIH0gfSwKK3sieGNoZyIsICAgMiwJMHg4NiwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCit7InhjaGciLCAgIDIsCTB4ODYsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCBSZWcsIDAgfSB9LAorCisvKiBpbi9vdXQgZnJvbSBwb3J0cyAqLworeyJpbiIsCSAgIDIsCTB4ZTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgQWNjLCAwIH0gfSwKK3siaW4iLAkgICAyLAkweGVjLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgQWNjLCAwIH0gfSwKK3siaW4iLAkgICAxLAkweGU0LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIDAsIDAgfSB9LAoreyJpbiIsCSAgIDEsCTB4ZWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCAwLCAwIH0gfSwKK3sib3V0IiwJICAgMiwJMHhlNiwgWCwgYndsX1N1ZnxXLAkJeyBBY2MsIEltbTgsIDAgfSB9LAoreyJvdXQiLAkgICAyLAkweGVlLCBYLCBid2xfU3VmfFcsCQl7IEFjYywgSW5PdXRQb3J0UmVnLCAwIH0gfSwKK3sib3V0IiwJICAgMSwJMHhlNiwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCAwLCAwIH0gfSwKK3sib3V0IiwJICAgMSwJMHhlZSwgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAorCisvKiBsb2FkIGVmZmVjdGl2ZSBhZGRyZXNzICovCit7ImxlYSIsCSAgIDIsIDB4OGQsICAgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwIH0gfSwKKworLyogbG9hZCBzZWdtZW50IHJlZ2lzdGVycyBmcm9tIG1lbW9yeSAqLworeyJsZHMiLAkgICAyLAkweGM1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImxlcyIsCSAgIDIsCTB4YzQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3sibGZzIiwJICAgMiwgMHgwZmI0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImxncyIsCSAgIDIsIDB4MGZiNSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJsc3MiLAkgICAyLCAweDBmYjIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKKworLyogZmxhZ3MgcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zICovCit7ImNsYyIsCSAgIDAsCTB4ZjgsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKK3siY2xkIiwJICAgMCwJMHhmYywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoreyJjbGkiLAkgICAwLAkweGZhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCit7ImNsdHMiLCAgIDAsIDB4MGYwNiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoreyJjbWMiLAkgICAwLAkweGY1LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCit7ImxhaGYiLCAgIDAsCTB4OWYsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKK3sic2FoZiIsICAgMCwJMHg5ZSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoreyJwdXNoZiIsICAwLAkweDljLCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCit7InBvcGYiLCAgIDAsCTB4OWQsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKK3sic3RjIiwJICAgMCwJMHhmOSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoreyJzdGQiLAkgICAwLAkweGZkLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCit7InN0aSIsCSAgIDAsCTB4ZmIsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKKworLyogYXJpdGhtZXRpYyAqLworeyJhZGQiLAkgICAyLAkweDAwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCit7ImFkZCIsCSAgIDIsCTB4ODMsIDAsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYWRkIiwJICAgMiwJMHgwNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKK3siYWRkIiwJICAgMiwJMHg4MCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKKworeyJpbmMiLAkgICAxLAkweDQwLCBYLCB3bF9TdWZ8U2hvcnRGb3JtLAl7IFdvcmRSZWcsIDAsIDB9IH0sCit7ImluYyIsCSAgIDEsCTB4ZmUsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAorCit7InN1YiIsCSAgIDIsCTB4MjgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKK3sic3ViIiwJICAgMiwJMHg4MywgNSwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoreyJzdWIiLAkgICAyLAkweDJjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoreyJzdWIiLAkgICAyLAkweDgwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAorCit7ImRlYyIsCSAgIDEsCTB4NDgsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKK3siZGVjIiwJICAgMSwJMHhmZSwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCisKK3sic2JiIiwJICAgMiwJMHgxOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoreyJzYmIiLAkgICAyLAkweDgzLCAzLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCit7InNiYiIsCSAgIDIsCTB4MWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCit7InNiYiIsCSAgIDIsCTB4ODAsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCisKK3siY21wIiwJICAgMiwJMHgzOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoreyJjbXAiLAkgICAyLAkweDgzLCA3LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCit7ImNtcCIsCSAgIDIsCTB4M2MsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCit7ImNtcCIsCSAgIDIsCTB4ODAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCisKK3sidGVzdCIsICAgMiwJMHg4NCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMH0gfSwKK3sidGVzdCIsICAgMiwJMHg4NCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKK3sidGVzdCIsICAgMiwJMHhhOCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKK3sidGVzdCIsICAgMiwJMHhmNiwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKKworeyJhbmQiLAkgICAyLAkweDIwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCit7ImFuZCIsCSAgIDIsCTB4ODMsIDQsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYW5kIiwJICAgMiwJMHgyNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKK3siYW5kIiwJICAgMiwJMHg4MCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKKworeyJvciIsCSAgIDIsCTB4MDgsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKK3sib3IiLAkgICAyLAkweDgzLCAxLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCit7Im9yIiwJICAgMiwJMHgwYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKK3sib3IiLAkgICAyLAkweDgwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAorCit7InhvciIsCSAgIDIsCTB4MzAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKK3sieG9yIiwJICAgMiwJMHg4MywgNiwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoreyJ4b3IiLAkgICAyLAkweDM0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoreyJ4b3IiLAkgICAyLAkweDgwLCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAorCisvKiBpY2xyIHdpdGggMSBvcGVyYW5kIGlzIHJlYWxseSB4b3Igd2l0aCAyIG9wZXJhbmRzLiAqLworeyJjbHIiLAkgICAxLAkweDMwLCBYLCBid2xfU3VmfFd8TW9kcm18cmVnS2x1ZGdlLAl7IFJlZywgMCwgMCB9IH0sCisKK3siYWRjIiwJICAgMiwJMHgxMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoreyJhZGMiLAkgICAyLAkweDgzLCAyLCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCit7ImFkYyIsCSAgIDIsCTB4MTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCit7ImFkYyIsCSAgIDIsCTB4ODAsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCisKK3sibmVnIiwJICAgMSwJMHhmNiwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCit7Im5vdCIsCSAgIDEsCTB4ZjYsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAorCit7ImFhYSIsCSAgIDAsCTB4MzcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKK3siYWFzIiwJICAgMCwJMHgzZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoreyJkYWEiLAkgICAwLAkweDI3LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCit7ImRhcyIsCSAgIDAsCTB4MmYsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKK3siYWFkIiwJICAgMCwgMHhkNTBhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCit7ImFhZCIsCSAgIDEsICAgMHhkNSwgWCwgTm9TdWYsCQkJeyBJbW04UywgMCwgMH0gfSwKK3siYWFtIiwJICAgMCwgMHhkNDBhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCit7ImFhbSIsCSAgIDEsICAgMHhkNCwgWCwgTm9TdWYsCQkJeyBJbW04UywgMCwgMH0gfSwKKworLyogY29udmVyc2lvbiBpbnNucyAqLworLyogY29udmVyc2lvbjoJaW50ZWwgbmFtaW5nICovCit7ImNidyIsCSAgIDAsCTB4OTgsIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKK3siY3dkZSIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAoreyJjd2QiLAkgICAwLAkweDk5LCBYLCBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCit7ImNkcSIsCSAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKKy8qICBhdHQgbmFtaW5nICovCit7ImNidHciLCAgIDAsCTB4OTgsIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKK3siY3d0bCIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAoreyJjd3RkIiwgICAwLAkweDk5LCBYLCBOb1N1ZnxTaXplMTYsCQl7IDAsIDAsIDB9IH0sCit7ImNsdGQiLCAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUzMiwJCXsgMCwgMCwgMH0gfSwKKworLyogV2FybmluZyEgdGhlIG11bC9pbXVsIChvcGNvZGUgMHhmNikgbXVzdCBvbmx5IGhhdmUgMSBvcGVyYW5kISAgVGhleSBhcmUKKyAgIGV4cGFuZGluZyA2NC1iaXQgbXVsdGlwbGllcywgYW5kICpjYW5ub3QqIGJlIHNlbGVjdGVkIHRvIGFjY29tcGxpc2gKKyAgICdpbXVsICVlYngsICVlYXgnIChvcGNvZGUgMHgwZmFmIG11c3QgYmUgdXNlZCBpbiB0aGlzIGNhc2UpCisgICBUaGVzZSBtdWx0aXBsaWVzIGNhbiBvbmx5IGJlIHNlbGVjdGVkIHdpdGggc2luZ2xlIG9wZXJhbmQgZm9ybXMuICAqLworeyJtdWwiLAkgICAxLAkweGY2LCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKK3siaW11bCIsICAgMSwJMHhmNiwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCit7ImltdWwiLCAgIDIsIDB4MGZhZiwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImltdWwiLCAgIDMsCTB4NmIsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZ30gfSwKK3siaW11bCIsICAgMywJMHg2OSwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBJbW0xNnxJbW0zMiwgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAorLyogaW11bCB3aXRoIDIgb3BlcmFuZHMgbWltaWNzIGltdWwgd2l0aCAzIGJ5IHB1dHRpbmcgdGhlIHJlZ2lzdGVyIGluCisgICBib3RoIGkucm0ucmVnICYgaS5ybS5yZWdtZW0gZmllbGRzLiAgcmVnS2x1ZGdlIGVuYWJsZXMgdGhpcworICAgdHJhbnNmb3JtYXRpb24uICAqLworeyJpbXVsIiwgICAyLAkweDZiLCBYLCB3bF9TdWZ8TW9kcm18cmVnS2x1ZGdlLHsgSW1tOFMsIFdvcmRSZWcsIDB9IH0sCit7ImltdWwiLCAgIDIsCTB4NjksIFgsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW0xNnxJbW0zMiwgV29yZFJlZywgMH0gfSwKKworeyJkaXYiLAkgICAxLAkweGY2LCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKK3siZGl2IiwJICAgMiwJMHhmNiwgNiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKK3siaWRpdiIsICAgMSwJMHhmNiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCit7ImlkaXYiLCAgIDIsCTB4ZjYsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCBBY2MsIDB9IH0sCisKK3sicm9sIiwJICAgMiwJMHhkMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InJvbCIsCSAgIDIsCTB4YzAsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoreyJyb2wiLAkgICAyLAkweGQyLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKK3sicm9sIiwJICAgMSwJMHhkMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCisKK3sicm9yIiwJICAgMiwJMHhkMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InJvciIsCSAgIDIsCTB4YzAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoreyJyb3IiLAkgICAyLAkweGQyLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKK3sicm9yIiwJICAgMSwJMHhkMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCisKK3sicmNsIiwJICAgMiwJMHhkMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InJjbCIsCSAgIDIsCTB4YzAsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoreyJyY2wiLAkgICAyLAkweGQyLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKK3sicmNsIiwJICAgMSwJMHhkMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCisKK3sicmNyIiwJICAgMiwJMHhkMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InJjciIsCSAgIDIsCTB4YzAsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoreyJyY3IiLAkgICAyLAkweGQyLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKK3sicmNyIiwJICAgMSwJMHhkMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCisKK3sic2FsIiwJICAgMiwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InNhbCIsCSAgIDIsCTB4YzAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoreyJzYWwiLAkgICAyLAkweGQyLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKK3sic2FsIiwJICAgMSwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCit7InNobCIsCSAgIDIsCTB4ZDAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoreyJzaGwiLAkgICAyLAkweGMwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKK3sic2hsIiwJICAgMiwJMHhkMiwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InNobCIsCSAgIDEsCTB4ZDAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAorCit7InNobGQiLCAgIDMsIDB4MGZhNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCit7InNobGQiLCAgIDMsIDB4MGZhNSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBTaGlmdENvdW50LCBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW19IH0sCit7InNobGQiLCAgIDIsIDB4MGZhNSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCisKK3sic2hyIiwJICAgMiwJMHhkMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InNociIsCSAgIDIsCTB4YzAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoreyJzaHIiLAkgICAyLAkweGQyLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKK3sic2hyIiwJICAgMSwJMHhkMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCisKK3sic2hyZCIsICAgMywgMHgwZmFjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKK3sic2hyZCIsICAgMywgMHgwZmFkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKK3sic2hyZCIsICAgMiwgMHgwZmFkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKKworeyJzYXIiLAkgICAyLAkweGQwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKK3sic2FyIiwJICAgMiwJMHhjMCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCit7InNhciIsCSAgIDIsCTB4ZDIsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoreyJzYXIiLAkgICAxLAkweGQwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKKworLyogY29udHJvbCB0cmFuc2ZlciBpbnN0cnVjdGlvbnMgKi8KK3siY2FsbCIsICAgMSwJMHhlOCwgWCwgd2xfU3VmfEp1bXBEd29yZCwJeyBEaXNwMTZ8RGlzcDMyLCAwLCAwfSB9LAoreyJjYWxsIiwgICAxLAkweGZmLCAyLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbXxKdW1wQWJzb2x1dGUsIDAsIDB9IH0sCisvKiBJbnRlbCBTeW50YXggKi8KK3siY2FsbCIsICAgMiwgMHg5YSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoreyJsY2FsbCIsICAyLAkweDlhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCit7ImxjYWxsIiwgIDEsCTB4ZmYsIDMsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKKworI2RlZmluZSBKVU1QX1BDX1JFTEFUSVZFIDB4ZWIKK3siam1wIiwJICAgMSwJMHhlYiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam1wIiwJICAgMSwJMHhmZiwgNCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW18SnVtcEFic29sdXRlLCAwLCAwfSB9LAorLyogSW50ZWwgU3ludGF4ICovCit7ImptcCIsICAgMiwJMHhlYSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoreyJqbXAiLCAgIDEsCTB4ZmYsIDUsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKK3sibGptcCIsICAgMiwJMHhlYSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoreyJsam1wIiwgICAxLAkweGZmLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCisKK3sicmV0IiwJICAgMCwJMHhjMywgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAoreyJyZXQiLAkgICAxLAkweGMyLCBYLCB3bF9TdWYsCQl7IEltbTE2LCAwLCAwfSB9LAoreyJscmV0IiwgICAwLAkweGNiLCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCit7ImxyZXQiLCAgIDEsCTB4Y2EsIFgsIHdsX1N1ZiwJCXsgSW1tMTYsIDAsIDB9IH0sCit7ImVudGVyIiwgIDIsCTB4YzgsIFgsIHdsX1N1ZiwJCXsgSW1tMTYsIEltbTgsIDB9IH0sCit7ImxlYXZlIiwgIDAsCTB4YzksIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKKworLyogY29uZGl0aW9uYWwganVtcHMgKi8KK3siam8iLAkgICAxLAkweDcwLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoreyJqbm8iLAkgICAxLAkweDcxLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoreyJqYiIsCSAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpjIiwJICAgMSwJMHg3MiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5hZSIsICAgMSwJMHg3MiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5iIiwJICAgMSwJMHg3MywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5jIiwJICAgMSwJMHg3MywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siamFlIiwJICAgMSwJMHg3MywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siamUiLAkgICAxLAkweDc0LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoreyJqeiIsCSAgIDEsCTB4NzQsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpuZSIsCSAgIDEsCTB4NzUsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpueiIsCSAgIDEsCTB4NzUsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpiZSIsCSAgIDEsCTB4NzYsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpuYSIsCSAgIDEsCTB4NzYsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpuYmUiLCAgIDEsCTB4NzcsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImphIiwJICAgMSwJMHg3NywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3sianMiLAkgICAxLAkweDc4LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoreyJqbnMiLAkgICAxLAkweDc5LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoreyJqcCIsCSAgIDEsCTB4N2EsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpwZSIsCSAgIDEsCTB4N2EsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpucCIsCSAgIDEsCTB4N2IsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpwbyIsCSAgIDEsCTB4N2IsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCit7ImpsIiwJICAgMSwJMHg3YywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5nZSIsICAgMSwJMHg3YywgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5sIiwJICAgMSwJMHg3ZCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siamdlIiwJICAgMSwJMHg3ZCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siamxlIiwJICAgMSwJMHg3ZSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5nIiwJICAgMSwJMHg3ZSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siam5sZSIsICAgMSwJMHg3ZiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKK3siamciLAkgICAxLAkweDdmLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAorCisvKiBqY3h6IHZzLiBqZWN4eiBpcyBjaG9zZW4gb24gdGhlIGJhc2lzIG9mIHRoZSBhZGRyZXNzIHNpemUgcHJlZml4LiAgKi8KK3siamN4eiIsICAgMSwJMHhlMywgWCwgTm9TdWZ8SnVtcEJ5dGV8U2l6ZTE2LCB7IERpc3AsIDAsIDB9IH0sCit7ImplY3h6IiwgIDEsCTB4ZTMsIFgsIE5vU3VmfEp1bXBCeXRlfFNpemUzMiwgeyBEaXNwLCAwLCAwfSB9LAorCisvKiBUaGUgbG9vcCBpbnN0cnVjdGlvbnMgYWxzbyB1c2UgdGhlIGFkZHJlc3Mgc2l6ZSBwcmVmaXggdG8gc2VsZWN0CisgICAlY3ggcmF0aGVyIHRoYW4gJWVjeCBmb3IgdGhlIGxvb3AgY291bnQsIHNvIHRoZSBgdycgZm9ybSBvZiB0aGVzZQorICAgaW5zdHJ1Y3Rpb25zIGVtaXQgYW4gYWRkcmVzcyBzaXplIHByZWZpeCByYXRoZXIgdGhhbiBhIGRhdGEgc2l6ZQorICAgcHJlZml4LiAgKi8KK3sibG9vcCIsICAgMSwJMHhlMiwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCit7Imxvb3B6IiwgIDEsCTB4ZTEsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoreyJsb29wZSIsICAxLAkweGUxLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKK3sibG9vcG56IiwgMSwJMHhlMCwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCit7Imxvb3BuZSIsIDEsCTB4ZTAsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAorCisvKiBzZXQgYnl0ZSBvbiBmbGFnIGluc3RydWN0aW9ucyAqLworeyJzZXRvIiwgICAxLCAweDBmOTAsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldG5vIiwgIDEsIDB4MGY5MSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0YiIsICAgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRjIiwgICAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldG5hZSIsIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bmIiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRuYyIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldGFlIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0ZSIsICAgMSwgMHgwZjk0LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXR6IiwgICAxLCAweDBmOTQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldG5lIiwgIDEsIDB4MGY5NSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bnoiLCAgMSwgMHgwZjk1LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRiZSIsICAxLCAweDBmOTYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldG5hIiwgIDEsIDB4MGY5NiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bmJlIiwgMSwgMHgwZjk3LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRhIiwgICAxLCAweDBmOTcsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldHMiLCAgIDEsIDB4MGY5OCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bnMiLCAgMSwgMHgwZjk5LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRwIiwgICAxLCAweDBmOWEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldHBlIiwgIDEsIDB4MGY5YSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bnAiLCAgMSwgMHgwZjliLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRwbyIsICAxLCAweDBmOWIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldGwiLCAgIDEsIDB4MGY5YywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bmdlIiwgMSwgMHgwZjljLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRubCIsICAxLCAweDBmOWQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldGdlIiwgIDEsIDB4MGY5ZCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0bGUiLCAgMSwgMHgwZjllLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoreyJzZXRuZyIsICAxLCAweDBmOWUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCit7InNldG5sZSIsIDEsIDB4MGY5ZiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKK3sic2V0ZyIsICAgMSwgMHgwZjlmLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAorCisvKiBzdHJpbmcgbWFuaXB1bGF0aW9uICovCit7ImNtcHMiLCAgIDAsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKK3siY21wcyIsICAgMiwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFueU1lbSwgMH0gfSwKK3sic2NtcCIsICAgMCwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoreyJzY21wIiwgICAyLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQW55TWVtLCAwfSB9LAoreyJpbnMiLAkgICAwLAkweDZjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCit7ImlucyIsCSAgIDIsCTB4NmMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgSW5PdXRQb3J0UmVnLCBBbnlNZW18RXNTZWcsIDB9IH0sCit7Im91dHMiLCAgIDAsCTB4NmUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKK3sib3V0cyIsICAgMiwJMHg2ZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEluT3V0UG9ydFJlZywgMH0gfSwKK3sibG9kcyIsICAgMCwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoreyJsb2RzIiwgICAxLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKK3sibG9kcyIsICAgMiwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFjYywgMH0gfSwKK3sic2xvZCIsICAgMCwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoreyJzbG9kIiwgICAxLAkweGFjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKK3sic2xvZCIsICAgMiwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFjYywgMH0gfSwKK3sibW92cyIsICAgMCwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoreyJtb3ZzIiwgICAyLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQW55TWVtfEVzU2VnLCAwfSB9LAoreyJzbW92IiwgICAwLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCit7InNtb3YiLCAgIDIsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBbnlNZW18RXNTZWcsIDB9IH0sCit7InNjYXMiLCAgIDAsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKK3sic2NhcyIsICAgMSwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCit7InNjYXMiLCAgIDIsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBY2MsIDB9IH0sCit7InNzY2EiLCAgIDAsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKK3sic3NjYSIsICAgMSwJMHhhZSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCit7InNzY2EiLCAgIDIsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBY2MsIDB9IH0sCit7InN0b3MiLCAgIDAsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKK3sic3RvcyIsICAgMSwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCit7InN0b3MiLCAgIDIsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQWNjLCBBbnlNZW18RXNTZWcsIDB9IH0sCit7InNzdG8iLCAgIDAsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKK3sic3N0byIsICAgMSwJMHhhYSwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIDAsIDB9IH0sCit7InNzdG8iLCAgIDIsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQWNjLCBBbnlNZW18RXNTZWcsIDB9IH0sCit7InhsYXQiLCAgIDAsCTB4ZDcsIFgsIGJfU3VmfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCit7InhsYXQiLCAgIDEsCTB4ZDcsIFgsIGJfU3VmfElzU3RyaW5nLAl7IEFueU1lbSwgMCwgMH0gfSwKKworLyogYml0IG1hbmlwdWxhdGlvbiAqLworeyJic2YiLAkgICAyLCAweDBmYmMsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJic3IiLAkgICAyLCAweDBmYmQsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJidCIsCSAgIDIsIDB4MGZhMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCit7ImJ0IiwJICAgMiwgMHgwZmJhLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYnRjIiwJICAgMiwgMHgwZmJiLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYnRjIiwJICAgMiwgMHgwZmJhLCA3LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYnRyIiwJICAgMiwgMHgwZmIzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYnRyIiwJICAgMiwgMHgwZmJhLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYnRzIiwJICAgMiwgMHgwZmFiLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKK3siYnRzIiwJICAgMiwgMHgwZmJhLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKKworLyogaW50ZXJydXB0cyAmIG9wLiBzeXMgaW5zbnMgKi8KKy8qIFNlZSBnYXMvY29uZmlnL3RjLWkzODYuYyBmb3IgY29udmVyc2lvbiBvZiAnaW50ICQzJyBpbnRvIHRoZSBzcGVjaWFsCisgICBpbnQgMyBpbnNuLiAqLworI2RlZmluZSBJTlRfT1BDT0RFIDB4Y2QKKyNkZWZpbmUgSU5UM19PUENPREUgMHhjYworeyJpbnQiLAkgICAxLAkweGNkLCBYLCBOb1N1ZiwJCQl7IEltbTgsIDAsIDB9IH0sCit7ImludDMiLCAgIDAsCTB4Y2MsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKK3siaW50byIsICAgMCwJMHhjZSwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoreyJpcmV0IiwgICAwLAkweGNmLCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCisvKiBpMzg2c2wsIGk0ODZzbCwgbGF0ZXIgNDg2LCBhbmQgUGVudGl1bSAqLworeyJyc20iLAkgICAwLCAweDBmYWEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKKworeyJib3VuZCIsICAyLAkweDYyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRNZW0sIDB9IH0sCisKK3siaGx0IiwJICAgMCwJMHhmNCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAorLyogbm9wIGlzIGFjdHVhbGx5ICd4Y2hnbCAlZWF4LCAlZWF4JyAqLworeyJub3AiLAkgICAwLAkweDkwLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCisKKy8qIHByb3RlY3Rpb24gY29udHJvbCAqLworeyJhcnBsIiwgICAyLAkweDYzLCBYLCBOb1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTYsIFJlZzE2fFNob3J0TWVtLCAwfSB9LAoreyJsYXIiLAkgICAyLCAweDBmMDIsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJsZ2R0IiwgICAxLCAweDBmMDEsIDIsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKK3sibGlkdCIsICAgMSwgMHgwZjAxLCAzLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCit7ImxsZHQiLCAgIDEsIDB4MGYwMCwgMiwgTm9TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAoreyJsbXN3IiwgICAxLCAweDBmMDEsIDYsIE5vU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKK3sibHNsIiwJICAgMiwgMHgwZjAzLCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3sibHRyIiwJICAgMSwgMHgwZjAwLCAzLCBOb1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCisKK3sic2dkdCIsICAgMSwgMHgwZjAxLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCit7InNpZHQiLCAgIDEsIDB4MGYwMSwgMSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoreyJzbGR0IiwgICAxLCAweDBmMDAsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwfSB9LAoreyJzbXN3IiwgICAxLCAweDBmMDEsIDQsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwfSB9LAoreyJzdHIiLAkgICAxLCAweDBmMDAsIDEsIE5vU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKKworeyJ2ZXJyIiwgICAxLCAweDBmMDAsIDQsIE5vU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKK3sidmVydyIsICAgMSwgMHgwZjAwLCA1LCBOb1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCisKKy8qIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLworCisvKiBsb2FkICovCit7ImZsZCIsCSAgIDEsIDB4ZDljMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KK3siZmxkIiwJICAgMSwJMHhkOSwgMCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGZsb2F0L2RvdWJsZSAqLworeyJmbGQiLAkgICAxLCAweGQ5YzAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKKy8qIEludGVsIFN5bnRheCAqLworeyJmbGQiLCAgICAxLAkweGRiLCA1LCB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGVmbG9hdCAqLworeyJmaWxkIiwgICAxLAkweGRmLCAwLCBzbF9TdWZ8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCisvKiBJbnRlbCBTeW50YXggKi8KK3siZmlsZCIsICAxLAkweGRmLCA1LCBkX1N1ZnxJZ25vcmVTaXplfE1vZHJtLHsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCit7ImZpbGRxIiwgIDEsCTB4ZGYsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KK3siZmlsZGxsIiwgMSwJMHhkZiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLworeyJmbGR0IiwgICAxLAkweGRiLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBlZmxvYXQgKi8KK3siZmJsZCIsICAgMSwJMHhkZiwgNCwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gYmNkICovCisKKy8qIHN0b3JlIChubyBwb3ApICovCit7ImZzdCIsCSAgIDEsIDB4ZGRkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KK3siZnN0IiwJICAgMSwJMHhkOSwgMiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGZsb2F0L2RvdWJsZSAqLworeyJmc3QiLAkgICAxLCAweGRkZDAsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKK3siZmlzdCIsICAgMSwJMHhkZiwgMiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHdvcmQoMTYpL2R3b3JkKDMyKSAqLworCisvKiBzdG9yZSAod2l0aCBwb3ApICovCit7ImZzdHAiLCAgIDEsIDB4ZGRkOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwgLyogcmVnaXN0ZXIgKi8KK3siZnN0cCIsICAgMSwJMHhkOSwgMywgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGZsb2F0L2RvdWJsZSAqLworeyJmc3RwIiwgICAxLCAweGRkZDgsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKKy8qIEludGVsIFN5bnRheCAqLworeyJmc3RwIiwgICAxLAkweGRiLCA3LCB4X0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGVmbG9hdCAqLworeyJmaXN0cCIsICAxLAkweGRmLCAzLCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KKy8qIEludGVsIFN5bnRheCAqLworeyJmaXN0cCIsIDEsCTB4ZGYsIDcsIGRfRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLworeyJmaXN0cHEiLCAxLAkweGRmLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCit7ImZpc3RwbGwiLDEsCTB4ZGYsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KK3siZnN0cHQiLCAgMSwJMHhkYiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gZWZsb2F0ICovCit7ImZic3RwIiwgIDEsCTB4ZGYsIDYsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGJjZCAqLworCisvKiBleGNoYW5nZSAlc3Q8bj4gd2l0aCAlc3QwICovCit7ImZ4Y2giLCAgIDEsIDB4ZDljOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKK3siZnhjaCIsICAgMCwgMHhkOWM5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ4Y2ggJXN0KDEpICovCisKKy8qIGNvbXBhcmlzb24gKHdpdGhvdXQgcG9wKSAqLworeyJmY29tIiwgICAxLCAweGQ4ZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCit7ImZjb20iLCAgIDAsIDB4ZDhkMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmY29tICVzdCgxKSAqLworeyJmY29tIiwgICAxLAkweGQ4LCAyLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSBmbG9hdC9kb3VibGUgKi8KK3siZmNvbSIsICAgMSwgMHhkOGQwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCit7ImZpY29tIiwgIDEsCTB4ZGUsIDIsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gd29yZC9kd29yZCAqLworCisvKiBjb21wYXJpc29uICh3aXRoIHBvcCkgKi8KK3siZmNvbXAiLCAgMSwgMHhkOGQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmY29tcCIsICAwLCAweGQ4ZDksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmNvbXAgJXN0KDEpICovCit7ImZjb21wIiwgIDEsCTB4ZDgsIDMsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIGZsb2F0L2RvdWJsZSAqLworeyJmY29tcCIsICAxLCAweGQ4ZDgsIFgsIGxfRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgMCwgMH0gfSwKK3siZmljb21wIiwgMSwJMHhkZSwgMywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSB3b3JkL2R3b3JkICovCit7ImZjb21wcCIsIDAsIDB4ZGVkOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGNvbXBhcmUgJXN0MCwgJXN0MSAmIHBvcCAyICovCisKKy8qIHVub3JkZXJlZCBjb21wYXJpc29uICh3aXRoIHBvcCkgKi8KK3siZnVjb20iLCAgMSwgMHhkZGUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmdWNvbSIsICAwLCAweGRkZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZnVjb20gJXN0KDEpICovCit7ImZ1Y29tcCIsIDEsIDB4ZGRlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKK3siZnVjb21wIiwgMCwgMHhkZGU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ1Y29tcCAlc3QoMSkgKi8KK3siZnVjb21wcCIsMCwgMHhkYWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogdWNvbXBhcmUgJXN0MCwgJXN0MSAmIHBvcCB0d2ljZSAqLworCit7ImZ0c3QiLCAgIDAsIDB4ZDllNCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIHRlc3QgJXN0MCAqLworeyJmeGFtIiwgICAwLCAweGQ5ZTUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBleGFtaW5lICVzdDAgKi8KKworLyogbG9hZCBjb25zdGFudHMgaW50byAlc3QwICovCit7ImZsZDEiLCAgIDAsIDB4ZDllOCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIDEuMCAqLworeyJmbGRsMnQiLCAwLCAweGQ5ZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cyKDEwKSAqLworeyJmbGRsMmUiLCAwLCAweGQ5ZWEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cyKGUpICovCit7ImZsZHBpIiwgIDAsIDB4ZDllYiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIHBpICovCit7ImZsZGxnMiIsIDAsIDB4ZDllYywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxvZzEwKDIpICovCit7ImZsZGxuMiIsIDAsIDB4ZDllZCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIGxuKDIpICovCit7ImZsZHoiLCAgIDAsIDB4ZDllZSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qICVzdDAgPC0tIDAuMCAqLworCisvKiBhcml0aG1ldGljICovCisKKy8qIGFkZCAqLworeyJmYWRkIiwgICAyLCAweGQ4YzAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdEQsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmYWRkIiwgICAxLCAweGQ4YzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIGFsaWFzIGZvciBmYWRkICVzdChpKSwgJXN0ICovCisjaWYgVU5JWFdBUkVfQ09NUEFUCit7ImZhZGQiLCAgIDAsIDB4ZGVjMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmYWRkcCAqLworI2VuZGlmCit7ImZhZGQiLCAgIDEsCTB4ZDgsIDAsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCit7ImZpYWRkIiwgIDEsCTB4ZGUsIDAsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCisKK3siZmFkZHAiLCAgMiwgMHhkZWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKK3siZmFkZHAiLCAgMSwgMHhkZWMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmYWRkcCIsICAwLCAweGRlYzEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmFkZHAgJXN0LCAlc3QoMSkgKi8KK3siZmFkZHAiLCAgMiwgMHhkZWMwLCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKKworLyogc3VidHJhY3QgKi8KK3siZnN1YiIsICAgMiwgMHhkOGUwLCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCit7ImZzdWIiLCAgIDEsIDB4ZDhlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKKyNpZiBVTklYV0FSRV9DT01QQVQKK3siZnN1YiIsICAgMCwgMHhkZWUxLCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZzdWJwICovCisjZW5kaWYKK3siZnN1YiIsICAgMSwJMHhkOCwgNCwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwKK3siZmlzdWIiLCAgMSwJMHhkZSwgNCwgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAorCisjaWYgVU5JWFdBUkVfQ09NUEFUCit7ImZzdWJwIiwgIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCit7ImZzdWJwIiwgIDEsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKK3siZnN1YnAiLCAgMCwgMHhkZWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZzdWJwIiwgIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCisjZWxzZQoreyJmc3VicCIsICAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoreyJmc3VicCIsICAxLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCit7ImZzdWJwIiwgIDAsIDB4ZGVlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAorI2VuZGlmCisKKy8qIHN1YnRyYWN0IHJldmVyc2UgKi8KK3siZnN1YnIiLCAgMiwgMHhkOGU4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCit7ImZzdWJyIiwgIDEsIDB4ZDhlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKKyNpZiBVTklYV0FSRV9DT01QQVQKK3siZnN1YnIiLCAgMCwgMHhkZWU5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZzdWJycCAqLworI2VuZGlmCit7ImZzdWJyIiwgIDEsCTB4ZDgsIDUsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCit7ImZpc3ViciIsIDEsCTB4ZGUsIDUsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKKworI2lmIFVOSVhXQVJFX0NPTVBBVAoreyJmc3VicnAiLCAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoreyJmc3VicnAiLCAxLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCit7ImZzdWJycCIsIDAsIDB4ZGVlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmc3VicnAiLCAyLCAweGRlZTgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAorI2Vsc2UKK3siZnN1YnJwIiwgMiwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKK3siZnN1YnJwIiwgMSwgMHhkZWUwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmc3VicnAiLCAwLCAweGRlZTEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKKyNlbmRpZgorCisvKiBtdWx0aXBseSAqLworeyJmbXVsIiwgICAyLCAweGQ4YzgsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdEQsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmbXVsIiwgICAxLCAweGQ4YzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCisjaWYgVU5JWFdBUkVfQ09NUEFUCit7ImZtdWwiLCAgIDAsIDB4ZGVjOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmbXVscCAqLworI2VuZGlmCit7ImZtdWwiLCAgIDEsCTB4ZDgsIDEsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCit7ImZpbXVsIiwgIDEsCTB4ZGUsIDEsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCisKK3siZm11bHAiLCAgMiwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKK3siZm11bHAiLCAgMSwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmbXVscCIsICAwLCAweGRlYzksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZm11bHAiLCAgMiwgMHhkZWM4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKKworLyogZGl2aWRlICovCit7ImZkaXYiLCAgIDIsIDB4ZDhmMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmZGl2IiwgICAxLCAweGQ4ZjAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCisjaWYgVU5JWFdBUkVfQ09NUEFUCit7ImZkaXYiLCAgIDAsIDB4ZGVmMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmZGl2cCAqLworI2VuZGlmCit7ImZkaXYiLCAgIDEsCTB4ZDgsIDYsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCit7ImZpZGl2IiwgIDEsCTB4ZGUsIDYsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCisKKyNpZiBVTklYV0FSRV9DT01QQVQKK3siZmRpdnAiLCAgMiwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKK3siZmRpdnAiLCAgMSwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmZGl2cCIsICAwLCAweGRlZjEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZmRpdnAiLCAgMiwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKKyNlbHNlCit7ImZkaXZwIiwgIDIsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCit7ImZkaXZwIiwgIDEsIDB4ZGVmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKK3siZmRpdnAiLCAgMCwgMHhkZWY5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCisjZW5kaWYKKworLyogZGl2aWRlIHJldmVyc2UgKi8KK3siZmRpdnIiLCAgMiwgMHhkOGY4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXREUiwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCit7ImZkaXZyIiwgIDEsIDB4ZDhmOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKKyNpZiBVTklYV0FSRV9DT01QQVQKK3siZmRpdnIiLCAgMCwgMHhkZWY5LCBYLCBGUHxVZ2gsCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZkaXZycCAqLworI2VuZGlmCit7ImZkaXZyIiwgIDEsCTB4ZDgsIDcsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCit7ImZpZGl2ciIsIDEsCTB4ZGUsIDcsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKKworI2lmIFVOSVhXQVJFX0NPTVBBVAoreyJmZGl2cnAiLCAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoreyJmZGl2cnAiLCAxLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCit7ImZkaXZycCIsIDAsIDB4ZGVmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmZGl2cnAiLCAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAorI2Vsc2UKK3siZmRpdnJwIiwgMiwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKK3siZmRpdnJwIiwgMSwgMHhkZWYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmZGl2cnAiLCAwLCAweGRlZjEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKKyNlbmRpZgorCit7ImYyeG0xIiwgIDAsIDB4ZDlmMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmeWwyeCIsICAwLCAweGQ5ZjEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZnB0YW4iLCAgMCwgMHhkOWYyLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZwYXRhbiIsIDAsIDB4ZDlmMywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmeHRyYWN0IiwwLCAweGQ5ZjQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZnByZW0xIiwgMCwgMHhkOWY1LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZkZWNzdHAiLDAsIDB4ZDlmNiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmaW5jc3RwIiwwLCAweGQ5ZjcsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZnByZW0iLCAgMCwgMHhkOWY4LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZ5bDJ4cDEiLDAsIDB4ZDlmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmc3FydCIsICAwLCAweGQ5ZmEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZnNpbmNvcyIsMCwgMHhkOWZiLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZybmRpbnQiLDAsIDB4ZDlmYywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmc2NhbGUiLCAwLCAweGQ5ZmQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZnNpbiIsICAgMCwgMHhkOWZlLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZjb3MiLCAgIDAsIDB4ZDlmZiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmY2hzIiwgICAwLCAweGQ5ZTAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKK3siZmFicyIsICAgMCwgMHhkOWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCisKKy8qIHByb2Nlc3NvciBjb250cm9sICovCit7ImZuaW5pdCIsIDAsIDB4ZGJlMywgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmaW5pdCIsICAwLCAweGRiZTMsIFgsIEZQfEZXYWl0LAkJeyAwLCAwLCAwfSB9LAoreyJmbGRjdyIsICAxLAkweGQ5LCA1LCBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCit7ImZuc3RjdyIsIDEsCTB4ZDksIDcsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKK3siZnN0Y3ciLCAgMSwJMHhkOSwgNywgRlB8RldhaXR8TW9kcm0sCXsgU2hvcnRNZW0sIDAsIDB9IH0sCit7ImZuc3RzdyIsIDEsIDB4ZGZlMCwgWCwgRlAsCQkJeyBBY2MsIDAsIDB9IH0sCit7ImZuc3RzdyIsIDEsCTB4ZGQsIDcsIEZQfE1vZHJtLAkJeyBTaG9ydE1lbSwgMCwgMH0gfSwKK3siZm5zdHN3IiwgMCwgMHhkZmUwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCit7ImZzdHN3IiwgIDEsIDB4ZGZlMCwgWCwgRlB8RldhaXQsCQl7IEFjYywgMCwgMH0gfSwKK3siZnN0c3ciLCAgMSwJMHhkZCwgNywgRlB8RldhaXR8TW9kcm0sCXsgU2hvcnRNZW0sIDAsIDB9IH0sCit7ImZzdHN3IiwgIDAsIDB4ZGZlMCwgWCwgRlB8RldhaXQsCQl7IDAsIDAsIDB9IH0sCit7ImZuY2xleCIsIDAsIDB4ZGJlMiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoreyJmY2xleCIsICAwLCAweGRiZTIsIFgsIEZQfEZXYWl0LAkJeyAwLCAwLCAwfSB9LAorLyogU2hvcnQgZm9ybXMgb2YgZmxkZW52LCBmc3RlbnYgdXNlIGRhdGEgc2l6ZSBwcmVmaXguCisgICBGSVhNRTogQXJlIHRoZXNlIHRoZSByaWdodCBzdWZmaXhlcz8gICovCit7ImZuc3RlbnYiLDEsCTB4ZDksIDYsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCit7ImZzdGVudiIsIDEsCTB4ZDksIDYsIHNsX1N1ZnxGV2FpdHxNb2RybSwJeyBMTG9uZ01lbSwgMCwgMH0gfSwKK3siZmxkZW52IiwgMSwJMHhkOSwgNCwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKK3siZm5zYXZlIiwgMSwJMHhkZCwgNiwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKK3siZnNhdmUiLCAgMSwJMHhkZCwgNiwgc2xfU3VmfEZXYWl0fE1vZHJtLAl7IExMb25nTWVtLCAwLCAwfSB9LAoreyJmcnN0b3IiLCAxLAkweGRkLCA0LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAorCit7ImZmcmVlIiwgIDEsIDB4ZGRjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKKy8qIFA2OmZyZWUgc3QoaSksIHBvcCBzdCAqLworeyJmZnJlZXAiLCAxLCAweGRmYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCit7ImZub3AiLCAgIDAsIDB4ZDlkMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAorI2RlZmluZSBGV0FJVF9PUENPREUgMHg5YgoreyJmd2FpdCIsICAwLAkweDliLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCisKKy8qCisgIG9wY29kZSBwcmVmaXhlczsgd2UgYWxsb3cgdGhlbSBhcyBzZXBlcmF0ZSBpbnNucyB0b28KKyovCisjZGVmaW5lIEFERFJfUFJFRklYX09QQ09ERSAweDY3Cit7ImFkZHIxNiIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCit7ImFkZHIzMiIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCit7ImF3b3JkIiwgIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCit7ImFkd29yZCIsIDAsCTB4NjcsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCisjZGVmaW5lIERBVEFfUFJFRklYX09QQ09ERSAweDY2Cit7ImRhdGExNiIsIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCit7ImRhdGEzMiIsIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCit7IndvcmQiLCAgIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUxNnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCit7ImR3b3JkIiwgIDAsCTB4NjYsIFgsIE5vU3VmfElzUHJlZml4fFNpemUzMnxJZ25vcmVTaXplLAl7IDAsIDAsIDB9IH0sCisjZGVmaW5lIExPQ0tfUFJFRklYX09QQ09ERSAweGYwCit7ImxvY2siLCAgIDAsCTB4ZjAsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCit7IndhaXQiLCAgIDAsICAgMHg5YiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgQ1NfUFJFRklYX09QQ09ERSAweDJlCit7ImNzIiwJICAgMCwJMHgyZSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgRFNfUFJFRklYX09QQ09ERSAweDNlCit7ImRzIiwJICAgMCwJMHgzZSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgRVNfUFJFRklYX09QQ09ERSAweDI2Cit7ImVzIiwJICAgMCwJMHgyNiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgRlNfUFJFRklYX09QQ09ERSAweDY0Cit7ImZzIiwJICAgMCwJMHg2NCwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgR1NfUFJFRklYX09QQ09ERSAweDY1Cit7ImdzIiwJICAgMCwJMHg2NSwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgU1NfUFJFRklYX09QQ09ERSAweDM2Cit7InNzIiwJICAgMCwJMHgzNiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKKyNkZWZpbmUgUkVQTkVfUFJFRklYX09QQ09ERSAweGYyCisjZGVmaW5lIFJFUEVfUFJFRklYX09QQ09ERSAgMHhmMworeyJyZXAiLAkgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoreyJyZXBlIiwgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoreyJyZXB6IiwgICAwLAkweGYzLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoreyJyZXBuZSIsICAwLAkweGYyLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoreyJyZXBueiIsICAwLAkweGYyLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAorCisvKiA0ODYgZXh0ZW5zaW9ucyAqLworCit7ImJzd2FwIiwgICAxLCAweDBmYzgsIFgsIE5vU3VmfFNob3J0Rm9ybSwJeyBSZWczMiwwLDAgfSB9LAoreyJ4YWRkIiwgICAgMiwgMHgwZmMwLCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKK3siY21weGNoZyIsIDIsIDB4MGZiMCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCit7ImludmQiLCAgICAwLCAweDBmMDgsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoreyJ3YmludmQiLCAgMCwgMHgwZjA5LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKK3siaW52bHBnIiwgIDEsIDB4MGYwMSwgNywgTm9TdWZ8TW9kcm0sCQl7IEFueU1lbSwgMCwgMH0gfSwKKworLyogNTg2IGFuZCBsYXRlIDQ4NiBleHRlbnNpb25zICovCit7ImNwdWlkIiwgICAwLCAweDBmYTIsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAorCisvKiBQZW50aXVtIGV4dGVuc2lvbnMgKi8KK3sid3Jtc3IiLCAgIDAsIDB4MGYzMCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCit7InJkdHNjIiwgICAwLCAweDBmMzEsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoreyJyZG1zciIsICAgMCwgMHgwZjMyLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKK3siY21weGNoZzhiIiwxLDB4MGZjNywgMSwgTm9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoreyJzeXNlbnRlciIsIDAsIDB4MGYzNCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCit7InN5c2V4aXQiLCAgMCwgMHgwZjM1LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKK3siZnhzYXZlIiwgICAxLAkweDBmYWUsIDAsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKK3siZnhyc3RvciIsICAxLAkweDBmYWUsIDEsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKKworLyogUGVudGl1bSBQcm8gZXh0ZW5zaW9ucyAqLworeyJyZHBtYyIsICAgMCwgMHgwZjMzLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKKworeyJ1ZDIiLAkgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLworeyJ1ZDJhIiwgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogYWxpYXMgZm9yIHVkMiAqLworeyJ1ZDJiIiwgICAgMCwgMHgwZmI5LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogMm5kLiBvZmZpY2lhbCB1bmRlZmluZWQgaW5zdHIuICovCisKK3siY21vdm8iLCAgIDIsIDB4MGY0MCwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZubyIsICAyLCAweDBmNDEsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92YiIsICAgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdmMiLCAgIDIsIDB4MGY0MiwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZuYWUiLCAyLCAweDBmNDIsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92YWUiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdm5jIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZuYiIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92ZSIsICAgMiwgMHgwZjQ0LCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdnoiLCAgIDIsIDB4MGY0NCwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZuZSIsICAyLCAweDBmNDUsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92bnoiLCAgMiwgMHgwZjQ1LCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdmJlIiwgIDIsIDB4MGY0NiwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZuYSIsICAyLCAweDBmNDYsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92YSIsICAgMiwgMHgwZjQ3LCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdm5iZSIsIDIsIDB4MGY0NywgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZzIiwgICAyLCAweDBmNDgsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92bnMiLCAgMiwgMHgwZjQ5LCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdnAiLCAgIDIsIDB4MGY0YSwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZucCIsICAyLCAweDBmNGIsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92bCIsICAgMiwgMHgwZjRjLCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdm5nZSIsIDIsIDB4MGY0YywgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZnZSIsICAyLCAweDBmNGQsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92bmwiLCAgMiwgMHgwZjRkLCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdmxlIiwgIDIsIDB4MGY0ZSwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCit7ImNtb3ZuZyIsICAyLCAweDBmNGUsIFgsIHdsX1N1ZnxSZXZlcnNlTW9kcm0sCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoreyJjbW92ZyIsICAgMiwgMHgwZjRmLCBYLCB3bF9TdWZ8UmV2ZXJzZU1vZHJtLAl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKK3siY21vdm5sZSIsIDIsIDB4MGY0ZiwgWCwgd2xfU3VmfFJldmVyc2VNb2RybSwJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCisKK3siZmNtb3ZiIiwgIDIsIDB4ZGFjMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZuYWUiLDIsIDB4ZGFjMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZlIiwgIDIsIDB4ZGFjOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZiZSIsIDIsIDB4ZGFkMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZuYSIsIDIsIDB4ZGFkMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3Z1IiwgIDIsIDB4ZGFkOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZhZSIsIDIsIDB4ZGJjMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZuYiIsIDIsIDB4ZGJjMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZuZSIsIDIsIDB4ZGJjOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZhIiwgIDIsIDB4ZGJkMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZuYmUiLDIsIDB4ZGJkMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKK3siZmNtb3ZudSIsIDIsIDB4ZGJkOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKKworeyJmY29taSIsICAgMiwgMHhkYmYwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmY29taSIsICAgMCwgMHhkYmYxLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgMCwgMCwgMH0gfSwKK3siZmNvbWkiLCAgIDEsIDB4ZGJmMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmdWNvbWkiLCAgMiwgMHhkYmU4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmdWNvbWkiLCAgMCwgMHhkYmU5LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgMCwgMCwgMH0gfSwKK3siZnVjb21pIiwgIDEsIDB4ZGJlOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmY29taXAiLCAgMiwgMHhkZmYwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmY29tcGkiLCAgMiwgMHhkZmYwLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmY29tcGkiLCAgMCwgMHhkZmYxLCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgMCwgMCwgMH0gfSwKK3siZmNvbXBpIiwgIDEsIDB4ZGZmMCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoreyJmdWNvbWlwIiwgMiwgMHhkZmU4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmdWNvbXBpIiwgMiwgMHhkZmU4LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoreyJmdWNvbXBpIiwgMCwgMHhkZmU5LCBYLCBOb1N1ZnxTaG9ydEZvcm0sCXsgMCwgMCwgMH0gfSwKK3siZnVjb21waSIsIDEsIDB4ZGZlOCwgWCwgTm9TdWZ8U2hvcnRGb3JtLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAorCisvKiBNTVggaW5zdHJ1Y3Rpb25zLiAgKi8KKworeyJlbW1zIiwgICAgIDAsIDB4MGY3NywgWCwgTm9TdWYsCQl7IDAsIDAsIDAgfSB9LAoreyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgTm9TdWZ8TW9kcm0sCQl7IFJlZzMyfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7Im1vdmQiLCAgICAgMiwgMHgwZjdlLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YLCBSZWczMnxMb25nTWVtLCAwIH0gfSwKK3sibW92cSIsICAgICAyLCAweDBmNmYsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sibW92cSIsICAgICAyLCAweDBmN2YsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVgsIFJlZ01NWHxMb25nTWVtLCAwIH0gfSwKK3sicGFja3NzZHciLCAyLCAweDBmNmIsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFja3Nzd2IiLCAyLCAweDBmNjMsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZGIiLCAgICAyLCAweDBmZmMsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZHciLCAgICAyLCAweDBmZmQsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZHNiIiwgICAyLCAweDBmZWMsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZHN3IiwgICAyLCAweDBmZWQsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFkZHVzdyIsICAyLCAweDBmZGQsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFuZCIsICAgICAyLCAweDBmZGIsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGNtcGVxYiIsICAyLCAweDBmNzQsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGNtcGVxdyIsICAyLCAweDBmNzUsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGNtcGd0YiIsICAyLCAweDBmNjQsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGNtcGd0dyIsICAyLCAweDBmNjUsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicG1hZGR3ZCIsICAyLCAweDBmZjUsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicG11bGh3IiwgICAyLCAweDBmZTUsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicG9yIiwJICAgICAyLCAweDBmZWIsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicHNsbHciLCAgICAyLCAweDBmZjEsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIE5vU3VmfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoreyJwc2xsZCIsICAgIDIsIDB4MGZmMiwgWCwgTm9TdWZ8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwc2xsZCIsICAgIDIsIDB4MGY3MiwgNiwgTm9TdWZ8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCit7InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzbGxxIiwgICAgMiwgMHgwZjczLCA2LCBOb1N1ZnxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKK3sicHNyYXciLCAgICAyLCAweDBmZTEsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIE5vU3VmfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoreyJwc3JhZCIsICAgIDIsIDB4MGZlMiwgWCwgTm9TdWZ8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwc3JhZCIsICAgIDIsIDB4MGY3MiwgNCwgTm9TdWZ8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCit7InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzcmx3IiwgICAgMiwgMHgwZjcxLCAyLCBOb1N1ZnxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKK3sicHNybGQiLCAgICAyLCAweDBmZDIsIFgsIE5vU3VmfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIE5vU3VmfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoreyJwc3JscSIsICAgIDIsIDB4MGZkMywgWCwgTm9TdWZ8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwc3JscSIsICAgIDIsIDB4MGY3MywgMiwgTm9TdWZ8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCit7InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzdWJ3IiwgICAgMiwgMHgwZmY5LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzdWJkIiwgICAgMiwgMHgwZmZhLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzdWJzdyIsICAgMiwgMHgwZmU5LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzdWJ1c2IiLCAgMiwgMHgwZmQ4LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB1bnBja2hidyIsMiwgMHgwZjY4LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB1bnBja2h3ZCIsMiwgMHgwZjY5LCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB1bnBja2xidyIsMiwgMHgwZjYwLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB1bnBja2x3ZCIsMiwgMHgwZjYxLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InB4b3IiLCAgICAgMiwgMHgwZmVmLCBYLCBOb1N1ZnxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCisKKyAgCisvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBBTURfM0ROT1dfT1BDT0RFIDB4MGYwZgorCit7InByZWZldGNoIiwgMSwgMHgwZjBkLAkgICAwLCBOb1N1ZnxNb2RybSwJeyBCeXRlTWVtLCAwLCAwIH0gfSwKK3sicHJlZmV0Y2h3IiwxLCAweDBmMGQsCSAgIDEsIE5vU3VmfE1vZHJtLAl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoreyJmZW1tcyIsICAgIDAsIDB4MGYwZSwJICAgWCwgTm9TdWYsCQl7IDAsIDAsIDAgfSB9LAoreyJwYXZndXNiIiwgIDIsIDB4MGYwZiwgMHhiZiwgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBmMmlkIiwgICAgMiwgMHgwZjBmLCAweDFkLCBOb1N1ZnxNb2RybSwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGZhY2MiLCAgICAyLCAweDBmMGYsIDB4YWUsIE5vU3VmfE1vZHJtLAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwZmFkZCIsICAgIDIsIDB4MGYwZiwgMHg5ZSwgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBmY21wZXEiLCAgMiwgMHgwZjBmLCAweGIwLCBOb1N1ZnxNb2RybSwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGZjbXBnZSIsICAyLCAweDBmMGYsIDB4OTAsIE5vU3VmfE1vZHJtLAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwZmNtcGd0IiwgIDIsIDB4MGYwZiwgMHhhMCwgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBmbWF4IiwgICAgMiwgMHgwZjBmLCAweGE0LCBOb1N1ZnxNb2RybSwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGZtaW4iLCAgICAyLCAweDBmMGYsIDB4OTQsIE5vU3VmfE1vZHJtLAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwZm11bCIsICAgIDIsIDB4MGYwZiwgMHhiNCwgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBmcmNwIiwgICAgMiwgMHgwZjBmLCAweDk2LCBOb1N1ZnxNb2RybSwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGZyY3BpdDEiLCAyLCAweDBmMGYsIDB4YTYsIE5vU3VmfE1vZHJtLAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwZnJjcGl0MiIsIDIsIDB4MGYwZiwgMHhiNiwgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBmcnNxaXQxIiwgMiwgMHgwZjBmLCAweGE3LCBOb1N1ZnxNb2RybSwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGZyc3FydCIsICAyLCAweDBmMGYsIDB4OTcsIE5vU3VmfE1vZHJtLAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwZnN1YiIsICAgIDIsIDB4MGYwZiwgMHg5YSwgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCit7InBmc3ViciIsICAgMiwgMHgwZjBmLCAweGFhLCBOb1N1ZnxNb2RybSwJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKK3sicGkyZmQiLCAgICAyLCAweDBmMGYsIDB4MGQsIE5vU3VmfE1vZHJtLAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoreyJwbXVsaHJ3IiwgIDIsIDB4MGYwZiwgMHhiNywgTm9TdWZ8TW9kcm0sCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCisKK3tOVUxMLCAwLCAwLCAwLCAwLCB7IDAsIDAsIDB9IH0JLyogc2VudGluZWwgKi8KK307CisjdW5kZWYgWAorI3VuZGVmIFJldmVyc2VNb2RybQorI3VuZGVmIE5vU3VmCisjdW5kZWYgYl9TdWYKKyN1bmRlZiB3X1N1ZgorI3VuZGVmIGxfU3VmCisjdW5kZWYgYndfU3VmCisjdW5kZWYgYmxfU3VmCisjdW5kZWYgd2xfU3VmCisjdW5kZWYgc2xfU3VmCisjdW5kZWYgYndsX1N1ZgorI3VuZGVmIEZQCisjdW5kZWYgbF9GUAorI3VuZGVmIHNsX0ZQCisKKyNkZWZpbmUgTUFYX01ORU1fU0laRSAxNgkvKiBmb3IgcGFyc2luZyBpbnNuIG1uZW1vbmljcyBmcm9tIGlucHV0ICovCisKKworLyogMzg2IHJlZ2lzdGVyIHRhYmxlICovCisKK3N0YXRpYyBjb25zdCByZWdfZW50cnkgaTM4Nl9yZWd0YWJbXSA9IHsKKyAgLyogOCBiaXQgcmVncyAqLworICB7ImFsIiwgUmVnOHxBY2MsIDB9LAorICB7ImNsIiwgUmVnOHxTaGlmdENvdW50LCAxfSwKKyAgeyJkbCIsIFJlZzgsIDJ9LAorICB7ImJsIiwgUmVnOCwgM30sCisgIHsiYWgiLCBSZWc4LCA0fSwKKyAgeyJjaCIsIFJlZzgsIDV9LAorICB7ImRoIiwgUmVnOCwgNn0sCisgIHsiYmgiLCBSZWc4LCA3fSwKKyAgLyogMTYgYml0IHJlZ3MgKi8KKyAgeyJheCIsIFJlZzE2fEFjYywgMH0sCisgIHsiY3giLCBSZWcxNiwgMX0sCisgIHsiZHgiLCBSZWcxNnxJbk91dFBvcnRSZWcsIDJ9LAorICB7ImJ4IiwgUmVnMTZ8QmFzZUluZGV4LCAzfSwKKyAgeyJzcCIsIFJlZzE2LCA0fSwKKyAgeyJicCIsIFJlZzE2fEJhc2VJbmRleCwgNX0sCisgIHsic2kiLCBSZWcxNnxCYXNlSW5kZXgsIDZ9LAorICB7ImRpIiwgUmVnMTZ8QmFzZUluZGV4LCA3fSwKKyAgLyogMzIgYml0IHJlZ3MgKi8KKyAgeyJlYXgiLCBSZWczMnxCYXNlSW5kZXh8QWNjLCAwfSwKKyAgeyJlY3giLCBSZWczMnxCYXNlSW5kZXgsIDF9LAorICB7ImVkeCIsIFJlZzMyfEJhc2VJbmRleCwgMn0sCisgIHsiZWJ4IiwgUmVnMzJ8QmFzZUluZGV4LCAzfSwKKyAgeyJlc3AiLCBSZWczMiwgNH0sCisgIHsiZWJwIiwgUmVnMzJ8QmFzZUluZGV4LCA1fSwKKyAgeyJlc2kiLCBSZWczMnxCYXNlSW5kZXgsIDZ9LAorICB7ImVkaSIsIFJlZzMyfEJhc2VJbmRleCwgN30sCisgIC8qIHNlZ21lbnQgcmVnaXN0ZXJzICovCisgIHsiZXMiLCBTUmVnMiwgMH0sCisgIHsiY3MiLCBTUmVnMiwgMX0sCisgIHsic3MiLCBTUmVnMiwgMn0sCisgIHsiZHMiLCBTUmVnMiwgM30sCisgIHsiZnMiLCBTUmVnMywgNH0sCisgIHsiZ3MiLCBTUmVnMywgNX0sCisgIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCisgIHsiY3IwIiwgQ29udHJvbCwgMH0sCisgIHsiY3IxIiwgQ29udHJvbCwgMX0sCisgIHsiY3IyIiwgQ29udHJvbCwgMn0sCisgIHsiY3IzIiwgQ29udHJvbCwgM30sCisgIHsiY3I0IiwgQ29udHJvbCwgNH0sCisgIHsiY3I1IiwgQ29udHJvbCwgNX0sCisgIHsiY3I2IiwgQ29udHJvbCwgNn0sCisgIHsiY3I3IiwgQ29udHJvbCwgN30sCisgIC8qIGRlYnVnIHJlZ2lzdGVycyAqLworICB7ImRiMCIsIERlYnVnLCAwfSwKKyAgeyJkYjEiLCBEZWJ1ZywgMX0sCisgIHsiZGIyIiwgRGVidWcsIDJ9LAorICB7ImRiMyIsIERlYnVnLCAzfSwKKyAgeyJkYjQiLCBEZWJ1ZywgNH0sCisgIHsiZGI1IiwgRGVidWcsIDV9LAorICB7ImRiNiIsIERlYnVnLCA2fSwKKyAgeyJkYjciLCBEZWJ1ZywgN30sCisgIHsiZHIwIiwgRGVidWcsIDB9LAorICB7ImRyMSIsIERlYnVnLCAxfSwKKyAgeyJkcjIiLCBEZWJ1ZywgMn0sCisgIHsiZHIzIiwgRGVidWcsIDN9LAorICB7ImRyNCIsIERlYnVnLCA0fSwKKyAgeyJkcjUiLCBEZWJ1ZywgNX0sCisgIHsiZHI2IiwgRGVidWcsIDZ9LAorICB7ImRyNyIsIERlYnVnLCA3fSwKKyAgLyogdGVzdCByZWdpc3RlcnMgKi8KKyAgeyJ0cjAiLCBUZXN0LCAwfSwKKyAgeyJ0cjEiLCBUZXN0LCAxfSwKKyAgeyJ0cjIiLCBUZXN0LCAyfSwKKyAgeyJ0cjMiLCBUZXN0LCAzfSwKKyAgeyJ0cjQiLCBUZXN0LCA0fSwKKyAgeyJ0cjUiLCBUZXN0LCA1fSwKKyAgeyJ0cjYiLCBUZXN0LCA2fSwKKyAgeyJ0cjciLCBUZXN0LCA3fSwKKyAgLyogZmxvYXQgcmVnaXN0ZXJzICovCisgIHsic3QoMCkiLCBGbG9hdFJlZ3xGbG9hdEFjYywgMH0sCisgIHsic3QiLCBGbG9hdFJlZ3xGbG9hdEFjYywgMH0sCisgIHsic3QoMSkiLCBGbG9hdFJlZywgMX0sCisgIHsic3QoMikiLCBGbG9hdFJlZywgMn0sCisgIHsic3QoMykiLCBGbG9hdFJlZywgM30sCisgIHsic3QoNCkiLCBGbG9hdFJlZywgNH0sCisgIHsic3QoNSkiLCBGbG9hdFJlZywgNX0sCisgIHsic3QoNikiLCBGbG9hdFJlZywgNn0sCisgIHsic3QoNykiLCBGbG9hdFJlZywgN30sCisgIHsibW0wIiwgUmVnTU1YLCAwfSwKKyAgeyJtbTEiLCBSZWdNTVgsIDF9LAorICB7Im1tMiIsIFJlZ01NWCwgMn0sCisgIHsibW0zIiwgUmVnTU1YLCAzfSwKKyAgeyJtbTQiLCBSZWdNTVgsIDR9LAorICB7Im1tNSIsIFJlZ01NWCwgNX0sCisgIHsibW02IiwgUmVnTU1YLCA2fSwKKyAgeyJtbTciLCBSZWdNTVgsIDd9Cit9OworCisjZGVmaW5lIE1BWF9SRUdfTkFNRV9TSVpFIDgJLyogZm9yIHBhcnNpbmcgcmVnaXN0ZXIgbmFtZXMgZnJvbSBpbnB1dCAqLworCisvKiBzZWdtZW50IHN0dWZmICovCitzdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGNzID0geyAiY3MiLCAweDJlIH07CitzdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGRzID0geyAiZHMiLCAweDNlIH07CitzdGF0aWMgY29uc3Qgc2VnX2VudHJ5IHNzID0geyAic3MiLCAweDM2IH07CitzdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGVzID0geyAiZXMiLCAweDI2IH07CitzdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGZzID0geyAiZnMiLCAweDY0IH07CitzdGF0aWMgY29uc3Qgc2VnX2VudHJ5IGdzID0geyAiZ3MiLCAweDY1IH07CisKKy8qIGVuZCBvZiBvcGNvZGUvaTM4Ni5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pODYwLmggYi9pbmNsdWRlL29wY29kZS9pODYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYmQyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaApAQCAtMCwwICsxLDQ5MSBAQAorLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIGk4NjAuCisgICBDb3B5cmlnaHQgKEMpIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgZGlzYXNzZW1ibGVyLgorCitHQVMvR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0FTL0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZChfX1NURENfXykgJiYgIWRlZmluZWQoY29uc3QpCisjZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuCisgKi8KK3N0cnVjdCBpODYwX29wY29kZQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdW5zaWduZWQgbG9uZyBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0LiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvc2U7CS8qIEJpdHMgdGhhdCBtdXN0IG5vdCBiZSBzZXQuICAqLworICAgIGNvbnN0IGNoYXIgKmFyZ3M7CisgICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgcG9zc2libGUgZXhwYW5kLWluc3RydWN0aW9uLiAgKi8KKyAgICBjaGFyIGV4cGFuZDsKK307CisKK2VudW0gZXhwYW5kX3R5cGUKK3sKKyAgICBFX01PViA9IDEsIEVfQUREUiwgRV9VMzIsIEVfQU5ELCBFX1MzMiwgRV9ERUxBWQorfTsKKworLyoKKyAgIEFsbCBpODYwIG9wY29kZXMgYXJlIDMyIGJpdHMsIGV4Y2VwdCBmb3IgdGhlIHBzZXVkb2luc3RydWN0aW9ucworICAgYW5kIHRoZSBvcGVyYXRpb25zIHV0aWxpemluZyBhIDMyLWJpdCBhZGRyZXNzIGV4cHJlc3Npb24sIGFuCisgICB1bnNpZ25lZCAzMi1iaXQgY29uc3RhbnQsIG9yIGEgc2lnbmVkIDMyLWJpdCBjb25zdGFudC4KKyAgIFRoZXNlIG9wY29kZXMgYXJlIGV4cGFuZGVkIGludG8gYSB0d28taW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZm9yCisgICBhbnkgc2l0dWF0aW9uIHdoZXJlIHRoZSBpbW1lZGlhdGUgb3BlcmFuZCBkb2VzIG5vdCBmaXQgaW4gMzIgYml0cy4KKyAgIEluIHRoZSBjYXNlIG9mIHRoZSBhZGQgYW5kIHN1YnRyYWN0IG9wZXJhdGlvbnMgdGhlIGV4cGFuc2lvbiBpcworICAgdG8gYSB0aHJlZS1pbnN0cnVjdGlvbiBzZXF1ZW5jZSAoZXg6IG9yaCwgb3IsIGFkZHMpLiAgSW4gY2FzZXMKKyAgIHdoZXJlIHRoZSBhZGRyZXNzIGlzIHRvIGJlIHJlbG9jYXRlZCwgdGhlIGluc3RydWN0aW9uIGlzCisgICBleHBhbmRlZCB0byBoYW5kbGUgdGhlIHdvcnNlIGNhc2UsIHRoaXMgY291bGQgYmUgb3B0aW1pemVkIGF0CisgICB0aGUgZmluYWwgbGluayBpZiB0aGUgYWN0dWFsIGFkZHJlc3Mgd2VyZSBrbm93bi4KKworICAgVGhlIHBzZXVkb2luc3RydWN0aW9ucyBhcmU6ICBtb3YsIGZtb3YsIHBtb3YsIG5vcCwgYW5kIGZub3AuCisgICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIGEgb25lIG9yIHR3byBpbnN0cnVjdGlvbgorICAgc2VxdWVuY2Ugb2Ygb3RoZXIgb3BlcmF0aW9ucy4KKworICAgVGhlIG1hdGNoIGNvbXBvbmVudCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBhCisgICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKKyAgIG9mIHRoYXQgb3Bjb2RlLgorCisgICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyCisgICBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KKworS2luZHMgb2Ygb3BlcmFuZHM6CisgICAjICAgIE51bWJlciB1c2VkIGJ5IG9wdGltaXplci4gIEl0IGlzIGlnbm9yZWQuCisgICAxICAgIHNyYzEgaW50ZWdlciByZWdpc3Rlci4KKyAgIDIgICAgc3JjMiBpbnRlZ2VyIHJlZ2lzdGVyLgorICAgZCAgICBkZXN0IHJlZ2lzdGVyLgorICAgYwljdHJscmVnIGNvbnRyb2wgcmVnaXN0ZXIuCisgICBpICAgIDE2IGJpdCBpbW1lZGlhdGUuCisgICBJICAgIDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQuCisgICA1ICAgIDUgYml0IGltbWVkaWF0ZS4KKyAgIGwgICAgbGJyb2ZmIDI2IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCisgICByICAgIHNicm9mZiAxNiBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgorICAgcwlzcGxpdCAxNiBiaXQgaW1tZWRpYXRlLgorICAgUwlzcGxpdCAxNiBiaXQgaW1tZWRpYXRlLCBhbGlnbmVkLgorICAgZSAgICBzcmMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgorICAgZiAgICBzcmMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgorICAgZyAgICBkZXN0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgorCisqLworCisvKiBUaGUgb3JkZXIgb2YgdGhlIG9wY29kZXMgaW4gdGhpcyB0YWJsZSBpcyBzaWduaWZpY2FudDoKKyAgIAorICAgKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0IGJlCisgICBjb25zZWN1dGl2ZS4gIElmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgorCisgICAqIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIG5vdCBjYXJlIGFib3V0IHRoZSBvcmRlciBvZiB0aGUgb3Bjb2Rlcy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgaTg2MF9vcGNvZGUgaTg2MF9vcGNvZGVzW10gPQoreworCisvKiBSRUctRm9ybWF0IEluc3RydWN0aW9ucyAqLworeyAibGQuYyIsCTB4MzAwMDAwMDAsIDB4Y2MwMDAwMDAsICJjLGQiLCAwIH0sCS8qIGxkLmMgY3NyYzIsaWRlc3QgKi8KK3sgImxkLmIiLAkweDAwMDAwMDAwLCAweGZjMDAwMDAwLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5iIGlzcmMxKGlzcmMyKSxpZGVzdCAqLworeyAibGQuYiIsCTB4MDQwMDAwMDAsIDB4ZjgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQuYiAjY29uc3QoaXNyYzIpLGlkZXN0ICovCit7ICJsZC5zIiwJMHgxMDAwMDAwMCwgMHhlYzAwMDAwMSwgIjEoMiksZCIsIDAgfSwJLyogbGQucyBpc3JjMShpc3JjMiksaWRlc3QgKi8KK3sgImxkLnMiLAkweDE0MDAwMDAxLCAweGU4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLnMgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLworeyAibGQubCIsCTB4MTAwMDAwMDEsIDB4ZWMwMDAwMDAsICIxKDIpLGQiLCAwIH0sCS8qIGxkLmwgaXNyYzEoaXNyYzIpLGlkZXN0ICovCit7ICJsZC5sIiwJMHgxNDAwMDAwMSwgMHhlODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5sICNjb25zdChpc3JjMiksaWRlc3QgKi8KKworeyAic3QuYyIsCTB4MzgwMDAwMDAsIDB4YzQwMDAwMDAsICIxLGMiLCAwIH0sCS8qIHN0LmMgaXNyYzFuaSxjc3JjMiAqLworeyAic3QuYiIsCTB4MGMwMDAwMDAsIDB4ZjAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QuYiBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KK3sgInN0LnMiLAkweDFjMDAwMDAwLCAweGUwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LnMgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCit7ICJzdC5sIiwJMHgxYzAwMDAwMSwgMHhlMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5sIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLworCit7ICJpeGZyIiwJMHgwODAwMDAwMCwgMHhmNDAwMDAwMCwgIjEsZyIsIDAgfSwJLyogaXhmciBpc3JjMW5pLGZkZXN0ICovCisKK3sgImZsZC5sIiwJMHgyMDAwMDAwMiwgMHhkYzAwMDAwMSwgIjEoMiksZyIsIDAgfSwJLyogZmxkLmwgaXNyYzEoaXNyYzIpLGZkZXN0ICovCit7ICJmbGQubCIsCTB4MjQwMDAwMDIsIDB4ZDgwMDAwMDEsICJpKDIpLGciLCBFX0FERFIgfSwJLyogZmxkLmwgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLworeyAiZmxkLmwiLAkweDIwMDAwMDAzLCAweGRjMDAwMDAwLCAiMSgyKSsrLGciLCAwIH0sCS8qIGZsZC5sIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCit7ICJmbGQubCIsCTB4MjQwMDAwMDMsIDB4ZDgwMDAwMDAsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBmbGQubCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KK3sgImZsZC5kIiwJMHgyMDAwMDAwMCwgMHhkYzAwMDAwNywgIjEoMiksZyIsIDAgfSwJLyogZmxkLmQgaXNyYzEoaXNyYzIpLGZkZXN0ICovCit7ICJmbGQuZCIsCTB4MjQwMDAwMDAsIDB4ZDgwMDAwMDcsICJpKDIpLGciLCBFX0FERFIgfSwJLyogZmxkLmQgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLworeyAiZmxkLmQiLAkweDIwMDAwMDAxLCAweGRjMDAwMDA2LCAiMSgyKSsrLGciLCAwIH0sCS8qIGZsZC5kIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCit7ICJmbGQuZCIsCTB4MjQwMDAwMDEsIDB4ZDgwMDAwMDYsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBmbGQuZCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KK3sgImZsZC5xIiwJMHgyMDAwMDAwNCwgMHhkYzAwMDAwMywgIjEoMiksZyIsIDAgfSwJLyogZmxkLnEgaXNyYzEoaXNyYzIpLGZkZXN0ICovCit7ICJmbGQucSIsCTB4MjQwMDAwMDQsIDB4ZDgwMDAwMDMsICJpKDIpLGciLCBFX0FERFIgfSwJLyogZmxkLnEgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLworeyAiZmxkLnEiLAkweDIwMDAwMDA1LCAweGRjMDAwMDAyLCAiMSgyKSsrLGciLCAwIH0sCS8qIGZsZC5xIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCit7ICJmbGQucSIsCTB4MjQwMDAwMDUsIDB4ZDgwMDAwMDIsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBmbGQucSAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KKworeyAicGZsZC5sIiwJMHg2MDAwMDAwMCwgMHg5YzAwMDAwMywgIjEoMiksZyIsIDAgfSwJLyogcGZsZC5sIGlzcmMxKGlzcmMyKSxmZGVzdCAqLworeyAicGZsZC5sIiwJMHg2NDAwMDAwMCwgMHg5ODAwMDAwMywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBwZmxkLmwgI2NvbnN0KGlzcmMyKSxmZGVzdCAqLworeyAicGZsZC5sIiwJMHg2MDAwMDAwMSwgMHg5YzAwMDAwMiwgIjEoMikrKyxnIiwgMCB9LAkvKiBwZmxkLmwgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KK3sgInBmbGQubCIsCTB4NjQwMDAwMDEsIDB4OTgwMDAwMDIsICJpKDIpKyssZyIsIEVfQUREUiB9LAkvKiBwZmxkLmwgI2NvbnN0KGlzcmMyKSsrLGZkZXN0ICovCit7ICJwZmxkLmQiLAkweDYwMDAwMDAwLCAweDljMDAwMDA3LCAiMSgyKSxnIiwgMCB9LAkvKiBwZmxkLmQgaXNyYzEoaXNyYzIpLGZkZXN0ICovCit7ICJwZmxkLmQiLAkweDY0MDAwMDAwLCAweDk4MDAwMDA3LCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIHBmbGQuZCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCit7ICJwZmxkLmQiLAkweDYwMDAwMDAxLCAweDljMDAwMDA2LCAiMSgyKSsrLGciLCAwIH0sCS8qIHBmbGQuZCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLworeyAicGZsZC5kIiwJMHg2NDAwMDAwMSwgMHg5ODAwMDAwNiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIHBmbGQuZCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KKworeyAiZnN0LmwiLAkweDI4MDAwMDAyLCAweGQ0MDAwMDAxLCAiZywxKDIpIiwgMCB9LAkvKiBmc3QubCBmZGVzdCxpc3JjMShpc3JjMikgKi8KK3sgImZzdC5sIiwJMHgyYzAwMDAwMiwgMHhkMDAwMDAwMSwgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBmc3QubCBmZGVzdCwjY29uc3QoaXNyYzIpICovCit7ICJmc3QubCIsCTB4MjgwMDAwMDMsIDB4ZDQwMDAwMDAsICJnLDEoMikrKyIsIDAgfSwJLyogZnN0LmwgZmRlc3QsaXNyYzEoaXNyYzIpKysgKi8KK3sgImZzdC5sIiwJMHgyYzAwMDAwMywgMHhkMDAwMDAwMCwgImcsaSgyKSsrIiwgRV9BRERSIH0sCS8qIGZzdC5sIGZkZXN0LCNjb25zdChpc3JjMikrKyAqLworeyAiZnN0LmQiLAkweDI4MDAwMDAwLCAweGQ0MDAwMDA3LCAiZywxKDIpIiwgMCB9LAkvKiBmc3QuZCBmZGVzdCxpc3JjMShpc3JjMikgKi8KK3sgImZzdC5kIiwJMHgyYzAwMDAwMCwgMHhkMDAwMDAwNywgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBmc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpICovCit7ICJmc3QuZCIsCTB4MjgwMDAwMDEsIDB4ZDQwMDAwMDYsICJnLDEoMikrKyIsIDAgfSwJLyogZnN0LmQgZmRlc3QsaXNyYzEoaXNyYzIpKysgKi8KK3sgImZzdC5kIiwJMHgyYzAwMDAwMSwgMHhkMDAwMDAwNiwgImcsaSgyKSsrIiwgRV9BRERSIH0sCS8qIGZzdC5kIGZkZXN0LCNjb25zdChpc3JjMikrKyAqLworCit7ICJwc3QuZCIsCTB4M2MwMDAwMDAsIDB4YzAwMDAwMDcsICJnLGkoMikiLCBFX0FERFIgfSwJLyogcHN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSAqLworeyAicHN0LmQiLAkweDNjMDAwMDAxLCAweGMwMDAwMDA2LCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogcHN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCisKK3sgImFkZHUiLAkweDgwMDAwMDAwLCAweDdjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFkZHUgaXNyYzEsaXNyYzIsaWRlc3QgKi8KK3sgImFkZHUiLAkweDg0MDAwMDAwLCAweDc4MDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBhZGR1ICNjb25zdCxpc3JjMixpZGVzdCAqLworeyAiYWRkcyIsCTB4OTAwMDAwMDAsIDB4NmMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYWRkcyBpc3JjMSxpc3JjMixpZGVzdCAqLworeyAiYWRkcyIsCTB4OTQwMDAwMDAsIDB4NjgwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIGFkZHMgI2NvbnN0LGlzcmMyLGlkZXN0ICovCit7ICJzdWJ1IiwJMHg4ODAwMDAwMCwgMHg3NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzdWJ1IGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJzdWJ1IiwJMHg4YzAwMDAwMCwgMHg3MDAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogc3VidSAjY29uc3QsaXNyYzIsaWRlc3QgKi8KK3sgInN1YnMiLAkweDk4MDAwMDAwLCAweDY0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHN1YnMgaXNyYzEsaXNyYzIsaWRlc3QgKi8KK3sgInN1YnMiLAkweDljMDAwMDAwLCAweDYwMDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBzdWJzICNjb25zdCxpc3JjMixpZGVzdCAqLworCit7ICJzaGwiLAkweGEwMDAwMDAwLCAweDVjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNobCBpc3JjMSxpc3JjMixpZGVzdCAqLworeyAic2hsIiwJMHhhNDAwMDAwMCwgMHg1ODAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBzaGwgI2NvbnN0LGlzcmMyLGlkZXN0ICovCit7ICJzaHIiLAkweGE4MDAwMDAwLCAweDU0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNociBpc3JjMSxpc3JjMixpZGVzdCAqLworeyAic2hyIiwJMHhhYzAwMDAwMCwgMHg1MDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBzaHIgI2NvbnN0LGlzcmMyLGlkZXN0ICovCit7ICJzaHJkIiwJMHhiMDAwMDAwMCwgMHg0YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaHJkIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJzaHJhIiwJMHhiODAwMDAwMCwgMHg0NDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBzaHJhIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJzaHJhIiwJMHhiYzAwMDAwMCwgMHg0MDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBzaHJhICNjb25zdCxpc3JjMixpZGVzdCAqLworCit7ICJtb3YiLAkweGEwMDAwMDAwLCAweDVjMDBmODAwLCAiMixkIiwgMCB9LAkvKiBzaGwgcjAsaXNyYzIsaWRlc3QgKi8KK3sgIm1vdiIsCTB4OTQwMDAwMDAsIDB4NjllMDAwMDAsICJpLGQiLCBFX01PViB9LAkvKiBhZGRzICNjb25zdCxyMCxpZGVzdCAqLworeyAibm9wIiwJMHhhMDAwMDAwMCwgMHg1ZmZmZjgwMCwgIiIsIDAgfSwJLyogc2hsIHIwLHIwLHIwICovCit7ICJmbm9wIiwJMHhiMDAwMDAwMCwgMHg0ZmZmZjgwMCwgIiIsIDAgfSwJLyogc2hyZCByMCxyMCxyMCAqLworCit7ICJ0cmFwIiwJMHg0NDAwMDAwMCwgMHhiODAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB0cmFwIGlzcmMxbmksaXNyYzIsaWRlc3QgKi8KKworeyAiZmx1c2giLAkweDM0MDAwMDAwLCAweGM4MWYwMDAxLCAiaSgyKSIsIEVfQUREUiB9LAkvKiBmbHVzaCAjY29uc3QoaXNyYzIpICovCit7ICJmbHVzaCIsCTB4MzQwMDAwMDEsIDB4YzgxZjAwMDAsICJpKDIpKysiLCBFX0FERFIgfSwJLyogZmx1c2ggI2NvbnN0KGlzcmMyKSsrICovCisKK3sgImFuZCIsCTB4YzAwMDAwMDAsIDB4M2MwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJhbmQiLAkweGM0MDAwMDAwLCAweDM4MDAwMDAwLCAiaSwyLGQiLCBFX0FORCB9LAkvKiBhbmQgI2NvbnN0LGlzcmMyLGlkZXN0ICovCit7ICJhbmRoIiwJMHhjODAwMDAwMCwgMHgzNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmRoIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJhbmRoIiwJMHhjYzAwMDAwMCwgMHgzMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiBhbmRoICNjb25zdCxpc3JjMixpZGVzdCAqLworeyAiYW5kbm90IiwJMHhkMDAwMDAwMCwgMHgyYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmRub3QgaXNyYzEsaXNyYzIsaWRlc3QgKi8KK3sgImFuZG5vdCIsCTB4ZDQwMDAwMDAsIDB4MjgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIGFuZG5vdCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KK3sgImFuZG5vdGgiLAkweGQ4MDAwMDAwLCAweDI0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZG5vdGggaXNyYzEsaXNyYzIsaWRlc3QgKi8KK3sgImFuZG5vdGgiLAkweGRjMDAwMDAwLCAweDIwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIGFuZG5vdGggI2NvbnN0LGlzcmMyLGlkZXN0ICovCit7ICJvciIsCQkweGUwMDAwMDAwLCAweDFjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIG9yIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJvciIsCQkweGU0MDAwMDAwLCAweDE4MDAwMDAwLCAiaSwyLGQiLCBFX1UzMiB9LAkvKiBvciAjY29uc3QsaXNyYzIsaWRlc3QgKi8KK3sgIm9yaCIsCTB4ZTgwMDAwMDAsIDB4MTQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogb3JoIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJvcmgiLAkweGVjMDAwMDAwLCAweDEwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIG9yaCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KK3sgInhvciIsCTB4ZjAwMDAwMDAsIDB4MGMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogeG9yIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJ4b3IiLAkweGY0MDAwMDAwLCAweDA4MDAwMDAwLCAiaSwyLGQiLCBFX1UzMiB9LAkvKiB4b3IgI2NvbnN0LGlzcmMyLGlkZXN0ICovCit7ICJ4b3JoIiwJMHhmODAwMDAwMCwgMHgwNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB4b3JoIGlzcmMxLGlzcmMyLGlkZXN0ICovCit7ICJ4b3JoIiwJMHhmYzAwMDAwMCwgMHgwMDAwMDAwMCwgImksMixkIiwgMCB9LAkvKiB4b3JoICNjb25zdCxpc3JjMixpZGVzdCAqLworCit7ICJidGUiLAkweDU4MDAwMDAwLCAweGE0MDAwMDAwLCAiMSwyLHMiLCAwIH0sCS8qIGJ0ZSBpc3JjMXMsaXNyYzIsc2Jyb2ZmICovCit7ICJidGUiLAkweDVjMDAwMDAwLCAweGEwMDAwMDAwLCAiNSwyLHMiLCAwIH0sCS8qIGJ0ZSAjY29uc3Q1LGlzcmMyLHNicm9mZiAqLworeyAiYnRuZSIsCTB4NTAwMDAwMDAsIDB4YWMwMDAwMDAsICIxLDIscyIsIDAgfSwJLyogYnRuZSBpc3JjMXMsaXNyYzIsc2Jyb2ZmICovCit7ICJidG5lIiwJMHg1NDAwMDAwMCwgMHhhODAwMDAwMCwgIjUsMixzIiwgMCB9LAkvKiBidG5lICNjb25zdDUsaXNyYzIsc2Jyb2ZmICovCit7ICJibGEiLAkweGI0MDAwMDAwLCAweDQ4MDAwMDAwLCAiMSwyLHMiLCBFX0RFTEFZIH0sCS8qIGJsYSBpc3JjMXMsaXNyYzIsc2Jyb2ZmICovCit7ICJicmkiLAkweDQwMDAwMDAwLCAweGJjMDAwMDAwLCAiMSIsIEVfREVMQVkgfSwJLyogYnJpIGlzcmMxbmkgKi8KKworLyogQ29yZSBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0ICovCit7ICJsb2NrIiwJMHg0YzAwMDAwMSwgMHhiMDAwMDAxZSwgIiIsIDAgfSwJLyogbG9jayBzZXQgQkwgaW4gZGlyYmFzZSAqLworeyAiY2FsbGkiLAkweDRjMDAwMDAyLCAweGIwMDAwMDFkLCAiMSIsIEVfREVMQVkgfSwJLyogY2FsbGkgaXNyYzFuaSAqLworeyAiaW50b3ZyIiwJMHg0YzAwMDAwNCwgMHhiMDAwMDAxYiwgIiIsIDAgfSwJLyogaW50b3ZyIHRyYXAgb24gaW50ZWdlciBvdmVyZmxvdyAqLworeyAidW5sb2NrIiwJMHg0YzAwMDAwNywgMHhiMDAwMDAxOCwgIiIsIDAgfSwJLyogdW5sb2NrIGNsZWFyIEJMIGluIGRpcmJhc2UgKi8KKworLyogQ1RSTC1Gb3JtYXQgSW5zdHJ1Y3Rpb25zICovCit7ICJiciIsCQkweDY4MDAwMDAwLCAweDk0MDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYnIgbGJyb2ZmICovCit7ICJjYWxsIiwJMHg2YzAwMDAwMCwgMHg5MDAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGNhbGwgbGJyb2ZmICovCit7ICJiYyIsCQkweDcwMDAwMDAwLCAweDhjMDAwMDAwLCAibCIsIDAgfSwJLyogYmMgbGJyb2ZmICovCit7ICJiYy50IiwJMHg3NDAwMDAwMCwgMHg4ODAwMDAwMCwgImwiLCBFX0RFTEFZIH0sCS8qIGJjLnQgbGJyb2ZmICovCit7ICJibmMiLAkweDc4MDAwMDAwLCAweDg0MDAwMDAwLCAibCIsIDAgfSwJLyogYm5jIGxicm9mZiAqLworeyAiYm5jLnQiLAkweDdjMDAwMDAwLCAweDgwMDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYm5jLnQgbGJyb2ZmICovCisKKy8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZmFtLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInIycDEuc3MiLAkweDQ4MDAwNDAwLCAweGI0MDAwM2ZmLCAiZSxmLGciLCAwIH0sCit7ICJyMnAxLnNkIiwJMHg0ODAwMDQ4MCwgMHhiNDAwMDM3ZiwgImUsZixnIiwgMCB9LAoreyAicjJwMS5kZCIsCTB4NDgwMDA1ODAsIDB4YjQwMDAyN2YsICJlLGYsZyIsIDAgfSwKK3sgInIycHQuc3MiLAkweDQ4MDAwNDAxLCAweGI0MDAwM2ZlLCAiZSxmLGciLCAwIH0sCit7ICJyMnB0LnNkIiwJMHg0ODAwMDQ4MSwgMHhiNDAwMDM3ZSwgImUsZixnIiwgMCB9LAoreyAicjJwdC5kZCIsCTB4NDgwMDA1ODEsIDB4YjQwMDAyN2UsICJlLGYsZyIsIDAgfSwKK3sgInIyYXAxLnNzIiwJMHg0ODAwMDQwMiwgMHhiNDAwMDNmZCwgImUsZixnIiwgMCB9LAoreyAicjJhcDEuc2QiLAkweDQ4MDAwNDgyLCAweGI0MDAwMzdkLCAiZSxmLGciLCAwIH0sCit7ICJyMmFwMS5kZCIsCTB4NDgwMDA1ODIsIDB4YjQwMDAyN2QsICJlLGYsZyIsIDAgfSwKK3sgInIyYXB0LnNzIiwJMHg0ODAwMDQwMywgMHhiNDAwMDNmYywgImUsZixnIiwgMCB9LAoreyAicjJhcHQuc2QiLAkweDQ4MDAwNDgzLCAweGI0MDAwMzdjLCAiZSxmLGciLCAwIH0sCit7ICJyMmFwdC5kZCIsCTB4NDgwMDA1ODMsIDB4YjQwMDAyN2MsICJlLGYsZyIsIDAgfSwKK3sgImkycDEuc3MiLAkweDQ4MDAwNDA0LCAweGI0MDAwM2ZiLCAiZSxmLGciLCAwIH0sCit7ICJpMnAxLnNkIiwJMHg0ODAwMDQ4NCwgMHhiNDAwMDM3YiwgImUsZixnIiwgMCB9LAoreyAiaTJwMS5kZCIsCTB4NDgwMDA1ODQsIDB4YjQwMDAyN2IsICJlLGYsZyIsIDAgfSwKK3sgImkycHQuc3MiLAkweDQ4MDAwNDA1LCAweGI0MDAwM2ZhLCAiZSxmLGciLCAwIH0sCit7ICJpMnB0LnNkIiwJMHg0ODAwMDQ4NSwgMHhiNDAwMDM3YSwgImUsZixnIiwgMCB9LAoreyAiaTJwdC5kZCIsCTB4NDgwMDA1ODUsIDB4YjQwMDAyN2EsICJlLGYsZyIsIDAgfSwKK3sgImkyYXAxLnNzIiwJMHg0ODAwMDQwNiwgMHhiNDAwMDNmOSwgImUsZixnIiwgMCB9LAoreyAiaTJhcDEuc2QiLAkweDQ4MDAwNDg2LCAweGI0MDAwMzc5LCAiZSxmLGciLCAwIH0sCit7ICJpMmFwMS5kZCIsCTB4NDgwMDA1ODYsIDB4YjQwMDAyNzksICJlLGYsZyIsIDAgfSwKK3sgImkyYXB0LnNzIiwJMHg0ODAwMDQwNywgMHhiNDAwMDNmOCwgImUsZixnIiwgMCB9LAoreyAiaTJhcHQuc2QiLAkweDQ4MDAwNDg3LCAweGI0MDAwMzc4LCAiZSxmLGciLCAwIH0sCit7ICJpMmFwdC5kZCIsCTB4NDgwMDA1ODcsIDB4YjQwMDAyNzgsICJlLGYsZyIsIDAgfSwKK3sgInJhdDFwMi5zcyIsCTB4NDgwMDA0MDgsIDB4YjQwMDAzZjcsICJlLGYsZyIsIDAgfSwKK3sgInJhdDFwMi5zZCIsCTB4NDgwMDA0ODgsIDB4YjQwMDAzNzcsICJlLGYsZyIsIDAgfSwKK3sgInJhdDFwMi5kZCIsCTB4NDgwMDA1ODgsIDB4YjQwMDAyNzcsICJlLGYsZyIsIDAgfSwKK3sgIm0xMmFwbS5zcyIsCTB4NDgwMDA0MDksIDB4YjQwMDAzZjYsICJlLGYsZyIsIDAgfSwKK3sgIm0xMmFwbS5zZCIsCTB4NDgwMDA0ODksIDB4YjQwMDAzNzYsICJlLGYsZyIsIDAgfSwKK3sgIm0xMmFwbS5kZCIsCTB4NDgwMDA1ODksIDB4YjQwMDAyNzYsICJlLGYsZyIsIDAgfSwKK3sgInJhMXAyLnNzIiwJMHg0ODAwMDQwYSwgMHhiNDAwMDNmNSwgImUsZixnIiwgMCB9LAoreyAicmExcDIuc2QiLAkweDQ4MDAwNDhhLCAweGI0MDAwMzc1LCAiZSxmLGciLCAwIH0sCit7ICJyYTFwMi5kZCIsCTB4NDgwMDA1OGEsIDB4YjQwMDAyNzUsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnR0cGEuc3MiLAkweDQ4MDAwNDBiLCAweGI0MDAwM2Y0LCAiZSxmLGciLCAwIH0sCit7ICJtMTJ0dHBhLnNkIiwJMHg0ODAwMDQ4YiwgMHhiNDAwMDM3NCwgImUsZixnIiwgMCB9LAoreyAibTEydHRwYS5kZCIsCTB4NDgwMDA1OGIsIDB4YjQwMDAyNzQsICJlLGYsZyIsIDAgfSwKK3sgImlhdDFwMi5zcyIsCTB4NDgwMDA0MGMsIDB4YjQwMDAzZjMsICJlLGYsZyIsIDAgfSwKK3sgImlhdDFwMi5zZCIsCTB4NDgwMDA0OGMsIDB4YjQwMDAzNzMsICJlLGYsZyIsIDAgfSwKK3sgImlhdDFwMi5kZCIsCTB4NDgwMDA1OGMsIDB4YjQwMDAyNzMsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnRwbS5zcyIsCTB4NDgwMDA0MGQsIDB4YjQwMDAzZjIsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnRwbS5zZCIsCTB4NDgwMDA0OGQsIDB4YjQwMDAzNzIsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnRwbS5kZCIsCTB4NDgwMDA1OGQsIDB4YjQwMDAyNzIsICJlLGYsZyIsIDAgfSwKK3sgImlhMXAyLnNzIiwJMHg0ODAwMDQwZSwgMHhiNDAwMDNmMSwgImUsZixnIiwgMCB9LAoreyAiaWExcDIuc2QiLAkweDQ4MDAwNDhlLCAweGI0MDAwMzcxLCAiZSxmLGciLCAwIH0sCit7ICJpYTFwMi5kZCIsCTB4NDgwMDA1OGUsIDB4YjQwMDAyNzEsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnRwYS5zcyIsCTB4NDgwMDA0MGYsIDB4YjQwMDAzZjAsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnRwYS5zZCIsCTB4NDgwMDA0OGYsIDB4YjQwMDAzNzAsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnRwYS5kZCIsCTB4NDgwMDA1OGYsIDB4YjQwMDAyNzAsICJlLGYsZyIsIDAgfSwKKworLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmc20ucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicjJzMS5zcyIsCTB4NDgwMDA0MTAsIDB4YjQwMDAzZWYsICJlLGYsZyIsIDAgfSwKK3sgInIyczEuc2QiLAkweDQ4MDAwNDkwLCAweGI0MDAwMzZmLCAiZSxmLGciLCAwIH0sCit7ICJyMnMxLmRkIiwJMHg0ODAwMDU5MCwgMHhiNDAwMDI2ZiwgImUsZixnIiwgMCB9LAoreyAicjJzdC5zcyIsCTB4NDgwMDA0MTEsIDB4YjQwMDAzZWUsICJlLGYsZyIsIDAgfSwKK3sgInIyc3Quc2QiLAkweDQ4MDAwNDkxLCAweGI0MDAwMzZlLCAiZSxmLGciLCAwIH0sCit7ICJyMnN0LmRkIiwJMHg0ODAwMDU5MSwgMHhiNDAwMDI2ZSwgImUsZixnIiwgMCB9LAoreyAicjJhczEuc3MiLAkweDQ4MDAwNDEyLCAweGI0MDAwM2VkLCAiZSxmLGciLCAwIH0sCit7ICJyMmFzMS5zZCIsCTB4NDgwMDA0OTIsIDB4YjQwMDAzNmQsICJlLGYsZyIsIDAgfSwKK3sgInIyYXMxLmRkIiwJMHg0ODAwMDU5MiwgMHhiNDAwMDI2ZCwgImUsZixnIiwgMCB9LAoreyAicjJhc3Quc3MiLAkweDQ4MDAwNDEzLCAweGI0MDAwM2VjLCAiZSxmLGciLCAwIH0sCit7ICJyMmFzdC5zZCIsCTB4NDgwMDA0OTMsIDB4YjQwMDAzNmMsICJlLGYsZyIsIDAgfSwKK3sgInIyYXN0LmRkIiwJMHg0ODAwMDU5MywgMHhiNDAwMDI2YywgImUsZixnIiwgMCB9LAoreyAiaTJzMS5zcyIsCTB4NDgwMDA0MTQsIDB4YjQwMDAzZWIsICJlLGYsZyIsIDAgfSwKK3sgImkyczEuc2QiLAkweDQ4MDAwNDk0LCAweGI0MDAwMzZiLCAiZSxmLGciLCAwIH0sCit7ICJpMnMxLmRkIiwJMHg0ODAwMDU5NCwgMHhiNDAwMDI2YiwgImUsZixnIiwgMCB9LAoreyAiaTJzdC5zcyIsCTB4NDgwMDA0MTUsIDB4YjQwMDAzZWEsICJlLGYsZyIsIDAgfSwKK3sgImkyc3Quc2QiLAkweDQ4MDAwNDk1LCAweGI0MDAwMzZhLCAiZSxmLGciLCAwIH0sCit7ICJpMnN0LmRkIiwJMHg0ODAwMDU5NSwgMHhiNDAwMDI2YSwgImUsZixnIiwgMCB9LAoreyAiaTJhczEuc3MiLAkweDQ4MDAwNDE2LCAweGI0MDAwM2U5LCAiZSxmLGciLCAwIH0sCit7ICJpMmFzMS5zZCIsCTB4NDgwMDA0OTYsIDB4YjQwMDAzNjksICJlLGYsZyIsIDAgfSwKK3sgImkyYXMxLmRkIiwJMHg0ODAwMDU5NiwgMHhiNDAwMDI2OSwgImUsZixnIiwgMCB9LAoreyAiaTJhc3Quc3MiLAkweDQ4MDAwNDE3LCAweGI0MDAwM2U4LCAiZSxmLGciLCAwIH0sCit7ICJpMmFzdC5zZCIsCTB4NDgwMDA0OTcsIDB4YjQwMDAzNjgsICJlLGYsZyIsIDAgfSwKK3sgImkyYXN0LmRkIiwJMHg0ODAwMDU5NywgMHhiNDAwMDI2OCwgImUsZixnIiwgMCB9LAoreyAicmF0MXMyLnNzIiwJMHg0ODAwMDQxOCwgMHhiNDAwMDNlNywgImUsZixnIiwgMCB9LAoreyAicmF0MXMyLnNkIiwJMHg0ODAwMDQ5OCwgMHhiNDAwMDM2NywgImUsZixnIiwgMCB9LAoreyAicmF0MXMyLmRkIiwJMHg0ODAwMDU5OCwgMHhiNDAwMDI2NywgImUsZixnIiwgMCB9LAoreyAibTEyYXNtLnNzIiwJMHg0ODAwMDQxOSwgMHhiNDAwMDNlNiwgImUsZixnIiwgMCB9LAoreyAibTEyYXNtLnNkIiwJMHg0ODAwMDQ5OSwgMHhiNDAwMDM2NiwgImUsZixnIiwgMCB9LAoreyAibTEyYXNtLmRkIiwJMHg0ODAwMDU5OSwgMHhiNDAwMDI2NiwgImUsZixnIiwgMCB9LAoreyAicmExczIuc3MiLAkweDQ4MDAwNDFhLCAweGI0MDAwM2U1LCAiZSxmLGciLCAwIH0sCit7ICJyYTFzMi5zZCIsCTB4NDgwMDA0OWEsIDB4YjQwMDAzNjUsICJlLGYsZyIsIDAgfSwKK3sgInJhMXMyLmRkIiwJMHg0ODAwMDU5YSwgMHhiNDAwMDI2NSwgImUsZixnIiwgMCB9LAoreyAibTEydHRzYS5zcyIsCTB4NDgwMDA0MWIsIDB4YjQwMDAzZTQsICJlLGYsZyIsIDAgfSwKK3sgIm0xMnR0c2Euc2QiLAkweDQ4MDAwNDliLCAweGI0MDAwMzY0LCAiZSxmLGciLCAwIH0sCit7ICJtMTJ0dHNhLmRkIiwJMHg0ODAwMDU5YiwgMHhiNDAwMDI2NCwgImUsZixnIiwgMCB9LAoreyAiaWF0MXMyLnNzIiwJMHg0ODAwMDQxYywgMHhiNDAwMDNlMywgImUsZixnIiwgMCB9LAoreyAiaWF0MXMyLnNkIiwJMHg0ODAwMDQ5YywgMHhiNDAwMDM2MywgImUsZixnIiwgMCB9LAoreyAiaWF0MXMyLmRkIiwJMHg0ODAwMDU5YywgMHhiNDAwMDI2MywgImUsZixnIiwgMCB9LAoreyAibTEydHNtLnNzIiwJMHg0ODAwMDQxZCwgMHhiNDAwMDNlMiwgImUsZixnIiwgMCB9LAoreyAibTEydHNtLnNkIiwJMHg0ODAwMDQ5ZCwgMHhiNDAwMDM2MiwgImUsZixnIiwgMCB9LAoreyAibTEydHNtLmRkIiwJMHg0ODAwMDU5ZCwgMHhiNDAwMDI2MiwgImUsZixnIiwgMCB9LAoreyAiaWExczIuc3MiLAkweDQ4MDAwNDFlLCAweGI0MDAwM2UxLCAiZSxmLGciLCAwIH0sCit7ICJpYTFzMi5zZCIsCTB4NDgwMDA0OWUsIDB4YjQwMDAzNjEsICJlLGYsZyIsIDAgfSwKK3sgImlhMXMyLmRkIiwJMHg0ODAwMDU5ZSwgMHhiNDAwMDI2MSwgImUsZixnIiwgMCB9LAoreyAibTEydHNhLnNzIiwJMHg0ODAwMDQxZiwgMHhiNDAwMDNlMCwgImUsZixnIiwgMCB9LAoreyAibTEydHNhLnNkIiwJMHg0ODAwMDQ5ZiwgMHhiNDAwMDM2MCwgImUsZixnIiwgMCB9LAoreyAibTEydHNhLmRkIiwJMHg0ODAwMDU5ZiwgMHhiNDAwMDI2MCwgImUsZixnIiwgMCB9LAorCisvKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZtYW0ucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAibXIycDEuc3MiLAkweDQ4MDAwMDAwLCAweGI0MDAwN2ZmLCAiZSxmLGciLCAwIH0sCit7ICJtcjJwMS5zZCIsCTB4NDgwMDAwODAsIDB4YjQwMDA3N2YsICJlLGYsZyIsIDAgfSwKK3sgIm1yMnAxLmRkIiwJMHg0ODAwMDE4MCwgMHhiNDAwMDY3ZiwgImUsZixnIiwgMCB9LAoreyAibXIycHQuc3MiLAkweDQ4MDAwMDAxLCAweGI0MDAwN2ZlLCAiZSxmLGciLCAwIH0sCit7ICJtcjJwdC5zZCIsCTB4NDgwMDAwODEsIDB4YjQwMDA3N2UsICJlLGYsZyIsIDAgfSwKK3sgIm1yMnB0LmRkIiwJMHg0ODAwMDE4MSwgMHhiNDAwMDY3ZSwgImUsZixnIiwgMCB9LAoreyAibXIybXAxLnNzIiwJMHg0ODAwMDAwMiwgMHhiNDAwMDdmZCwgImUsZixnIiwgMCB9LAoreyAibXIybXAxLnNkIiwJMHg0ODAwMDA4MiwgMHhiNDAwMDc3ZCwgImUsZixnIiwgMCB9LAoreyAibXIybXAxLmRkIiwJMHg0ODAwMDE4MiwgMHhiNDAwMDY3ZCwgImUsZixnIiwgMCB9LAoreyAibXIybXB0LnNzIiwJMHg0ODAwMDAwMywgMHhiNDAwMDdmYywgImUsZixnIiwgMCB9LAoreyAibXIybXB0LnNkIiwJMHg0ODAwMDA4MywgMHhiNDAwMDc3YywgImUsZixnIiwgMCB9LAoreyAibXIybXB0LmRkIiwJMHg0ODAwMDE4MywgMHhiNDAwMDY3YywgImUsZixnIiwgMCB9LAoreyAibWkycDEuc3MiLAkweDQ4MDAwMDA0LCAweGI0MDAwN2ZiLCAiZSxmLGciLCAwIH0sCit7ICJtaTJwMS5zZCIsCTB4NDgwMDAwODQsIDB4YjQwMDA3N2IsICJlLGYsZyIsIDAgfSwKK3sgIm1pMnAxLmRkIiwJMHg0ODAwMDE4NCwgMHhiNDAwMDY3YiwgImUsZixnIiwgMCB9LAoreyAibWkycHQuc3MiLAkweDQ4MDAwMDA1LCAweGI0MDAwN2ZhLCAiZSxmLGciLCAwIH0sCit7ICJtaTJwdC5zZCIsCTB4NDgwMDAwODUsIDB4YjQwMDA3N2EsICJlLGYsZyIsIDAgfSwKK3sgIm1pMnB0LmRkIiwJMHg0ODAwMDE4NSwgMHhiNDAwMDY3YSwgImUsZixnIiwgMCB9LAoreyAibWkybXAxLnNzIiwJMHg0ODAwMDAwNiwgMHhiNDAwMDdmOSwgImUsZixnIiwgMCB9LAoreyAibWkybXAxLnNkIiwJMHg0ODAwMDA4NiwgMHhiNDAwMDc3OSwgImUsZixnIiwgMCB9LAoreyAibWkybXAxLmRkIiwJMHg0ODAwMDE4NiwgMHhiNDAwMDY3OSwgImUsZixnIiwgMCB9LAoreyAibWkybXB0LnNzIiwJMHg0ODAwMDAwNywgMHhiNDAwMDdmOCwgImUsZixnIiwgMCB9LAoreyAibWkybXB0LnNkIiwJMHg0ODAwMDA4NywgMHhiNDAwMDc3OCwgImUsZixnIiwgMCB9LAoreyAibWkybXB0LmRkIiwJMHg0ODAwMDE4NywgMHhiNDAwMDY3OCwgImUsZixnIiwgMCB9LAoreyAibXJtdDFwMi5zcyIsCTB4NDgwMDAwMDgsIDB4YjQwMDA3ZjcsICJlLGYsZyIsIDAgfSwKK3sgIm1ybXQxcDIuc2QiLAkweDQ4MDAwMDg4LCAweGI0MDAwNzc3LCAiZSxmLGciLCAwIH0sCit7ICJtcm10MXAyLmRkIiwJMHg0ODAwMDE4OCwgMHhiNDAwMDY3NywgImUsZixnIiwgMCB9LAoreyAibW0xMm1wbS5zcyIsCTB4NDgwMDAwMDksIDB4YjQwMDA3ZjYsICJlLGYsZyIsIDAgfSwKK3sgIm1tMTJtcG0uc2QiLAkweDQ4MDAwMDg5LCAweGI0MDAwNzc2LCAiZSxmLGciLCAwIH0sCit7ICJtbTEybXBtLmRkIiwJMHg0ODAwMDE4OSwgMHhiNDAwMDY3NiwgImUsZixnIiwgMCB9LAoreyAibXJtMXAyLnNzIiwJMHg0ODAwMDAwYSwgMHhiNDAwMDdmNSwgImUsZixnIiwgMCB9LAoreyAibXJtMXAyLnNkIiwJMHg0ODAwMDA4YSwgMHhiNDAwMDc3NSwgImUsZixnIiwgMCB9LAoreyAibXJtMXAyLmRkIiwJMHg0ODAwMDE4YSwgMHhiNDAwMDY3NSwgImUsZixnIiwgMCB9LAoreyAibW0xMnR0cG0uc3MiLDB4NDgwMDAwMGIsIDB4YjQwMDA3ZjQsICJlLGYsZyIsIDAgfSwKK3sgIm1tMTJ0dHBtLnNkIiwweDQ4MDAwMDhiLCAweGI0MDAwNzc0LCAiZSxmLGciLCAwIH0sCit7ICJtbTEydHRwbS5kZCIsMHg0ODAwMDE4YiwgMHhiNDAwMDY3NCwgImUsZixnIiwgMCB9LAoreyAibWltdDFwMi5zcyIsCTB4NDgwMDAwMGMsIDB4YjQwMDA3ZjMsICJlLGYsZyIsIDAgfSwKK3sgIm1pbXQxcDIuc2QiLAkweDQ4MDAwMDhjLCAweGI0MDAwNzczLCAiZSxmLGciLCAwIH0sCit7ICJtaW10MXAyLmRkIiwJMHg0ODAwMDE4YywgMHhiNDAwMDY3MywgImUsZixnIiwgMCB9LAoreyAibW0xMnRwbS5zcyIsCTB4NDgwMDAwMGQsIDB4YjQwMDA3ZjIsICJlLGYsZyIsIDAgfSwKK3sgIm1tMTJ0cG0uc2QiLAkweDQ4MDAwMDhkLCAweGI0MDAwNzcyLCAiZSxmLGciLCAwIH0sCit7ICJtbTEydHBtLmRkIiwJMHg0ODAwMDE4ZCwgMHhiNDAwMDY3MiwgImUsZixnIiwgMCB9LAoreyAibWltMXAyLnNzIiwJMHg0ODAwMDAwZSwgMHhiNDAwMDdmMSwgImUsZixnIiwgMCB9LAoreyAibWltMXAyLnNkIiwJMHg0ODAwMDA4ZSwgMHhiNDAwMDc3MSwgImUsZixnIiwgMCB9LAoreyAibWltMXAyLmRkIiwJMHg0ODAwMDE4ZSwgMHhiNDAwMDY3MSwgImUsZixnIiwgMCB9LAorCisvKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZtc20ucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAibXIyczEuc3MiLAkweDQ4MDAwMDEwLCAweGI0MDAwN2VmLCAiZSxmLGciLCAwIH0sCit7ICJtcjJzMS5zZCIsCTB4NDgwMDAwOTAsIDB4YjQwMDA3NmYsICJlLGYsZyIsIDAgfSwKK3sgIm1yMnMxLmRkIiwJMHg0ODAwMDE5MCwgMHhiNDAwMDY2ZiwgImUsZixnIiwgMCB9LAoreyAibXIyc3Quc3MiLAkweDQ4MDAwMDExLCAweGI0MDAwN2VlLCAiZSxmLGciLCAwIH0sCit7ICJtcjJzdC5zZCIsCTB4NDgwMDAwOTEsIDB4YjQwMDA3NmUsICJlLGYsZyIsIDAgfSwKK3sgIm1yMnN0LmRkIiwJMHg0ODAwMDE5MSwgMHhiNDAwMDY2ZSwgImUsZixnIiwgMCB9LAoreyAibXIybXMxLnNzIiwJMHg0ODAwMDAxMiwgMHhiNDAwMDdlZCwgImUsZixnIiwgMCB9LAoreyAibXIybXMxLnNkIiwJMHg0ODAwMDA5MiwgMHhiNDAwMDc2ZCwgImUsZixnIiwgMCB9LAoreyAibXIybXMxLmRkIiwJMHg0ODAwMDE5MiwgMHhiNDAwMDY2ZCwgImUsZixnIiwgMCB9LAoreyAibXIybXN0LnNzIiwJMHg0ODAwMDAxMywgMHhiNDAwMDdlYywgImUsZixnIiwgMCB9LAoreyAibXIybXN0LnNkIiwJMHg0ODAwMDA5MywgMHhiNDAwMDc2YywgImUsZixnIiwgMCB9LAoreyAibXIybXN0LmRkIiwJMHg0ODAwMDE5MywgMHhiNDAwMDY2YywgImUsZixnIiwgMCB9LAoreyAibWkyczEuc3MiLAkweDQ4MDAwMDE0LCAweGI0MDAwN2ViLCAiZSxmLGciLCAwIH0sCit7ICJtaTJzMS5zZCIsCTB4NDgwMDAwOTQsIDB4YjQwMDA3NmIsICJlLGYsZyIsIDAgfSwKK3sgIm1pMnMxLmRkIiwJMHg0ODAwMDE5NCwgMHhiNDAwMDY2YiwgImUsZixnIiwgMCB9LAoreyAibWkyc3Quc3MiLAkweDQ4MDAwMDE1LCAweGI0MDAwN2VhLCAiZSxmLGciLCAwIH0sCit7ICJtaTJzdC5zZCIsCTB4NDgwMDAwOTUsIDB4YjQwMDA3NmEsICJlLGYsZyIsIDAgfSwKK3sgIm1pMnN0LmRkIiwJMHg0ODAwMDE5NSwgMHhiNDAwMDY2YSwgImUsZixnIiwgMCB9LAoreyAibWkybXMxLnNzIiwJMHg0ODAwMDAxNiwgMHhiNDAwMDdlOSwgImUsZixnIiwgMCB9LAoreyAibWkybXMxLnNkIiwJMHg0ODAwMDA5NiwgMHhiNDAwMDc2OSwgImUsZixnIiwgMCB9LAoreyAibWkybXMxLmRkIiwJMHg0ODAwMDE5NiwgMHhiNDAwMDY2OSwgImUsZixnIiwgMCB9LAoreyAibWkybXN0LnNzIiwJMHg0ODAwMDAxNywgMHhiNDAwMDdlOCwgImUsZixnIiwgMCB9LAoreyAibWkybXN0LnNkIiwJMHg0ODAwMDA5NywgMHhiNDAwMDc2OCwgImUsZixnIiwgMCB9LAoreyAibWkybXN0LmRkIiwJMHg0ODAwMDE5NywgMHhiNDAwMDY2OCwgImUsZixnIiwgMCB9LAoreyAibXJtdDFzMi5zcyIsCTB4NDgwMDAwMTgsIDB4YjQwMDA3ZTcsICJlLGYsZyIsIDAgfSwKK3sgIm1ybXQxczIuc2QiLAkweDQ4MDAwMDk4LCAweGI0MDAwNzY3LCAiZSxmLGciLCAwIH0sCit7ICJtcm10MXMyLmRkIiwJMHg0ODAwMDE5OCwgMHhiNDAwMDY2NywgImUsZixnIiwgMCB9LAoreyAibW0xMm1zbS5zcyIsCTB4NDgwMDAwMTksIDB4YjQwMDA3ZTYsICJlLGYsZyIsIDAgfSwKK3sgIm1tMTJtc20uc2QiLAkweDQ4MDAwMDk5LCAweGI0MDAwNzY2LCAiZSxmLGciLCAwIH0sCit7ICJtbTEybXNtLmRkIiwJMHg0ODAwMDE5OSwgMHhiNDAwMDY2NiwgImUsZixnIiwgMCB9LAoreyAibXJtMXMyLnNzIiwJMHg0ODAwMDAxYSwgMHhiNDAwMDdlNSwgImUsZixnIiwgMCB9LAoreyAibXJtMXMyLnNkIiwJMHg0ODAwMDA5YSwgMHhiNDAwMDc2NSwgImUsZixnIiwgMCB9LAoreyAibXJtMXMyLmRkIiwJMHg0ODAwMDE5YSwgMHhiNDAwMDY2NSwgImUsZixnIiwgMCB9LAoreyAibW0xMnR0c20uc3MiLDB4NDgwMDAwMWIsIDB4YjQwMDA3ZTQsICJlLGYsZyIsIDAgfSwKK3sgIm1tMTJ0dHNtLnNkIiwweDQ4MDAwMDliLCAweGI0MDAwNzY0LCAiZSxmLGciLCAwIH0sCit7ICJtbTEydHRzbS5kZCIsMHg0ODAwMDE5YiwgMHhiNDAwMDY2NCwgImUsZixnIiwgMCB9LAoreyAibWltdDFzMi5zcyIsCTB4NDgwMDAwMWMsIDB4YjQwMDA3ZTMsICJlLGYsZyIsIDAgfSwKK3sgIm1pbXQxczIuc2QiLAkweDQ4MDAwMDljLCAweGI0MDAwNzYzLCAiZSxmLGciLCAwIH0sCit7ICJtaW10MXMyLmRkIiwJMHg0ODAwMDE5YywgMHhiNDAwMDY2MywgImUsZixnIiwgMCB9LAoreyAibW0xMnRzbS5zcyIsCTB4NDgwMDAwMWQsIDB4YjQwMDA3ZTIsICJlLGYsZyIsIDAgfSwKK3sgIm1tMTJ0c20uc2QiLAkweDQ4MDAwMDlkLCAweGI0MDAwNzYyLCAiZSxmLGciLCAwIH0sCit7ICJtbTEydHNtLmRkIiwJMHg0ODAwMDE5ZCwgMHhiNDAwMDY2MiwgImUsZixnIiwgMCB9LAoreyAibWltMXMyLnNzIiwJMHg0ODAwMDAxZSwgMHhiNDAwMDdlMSwgImUsZixnIiwgMCB9LAoreyAibWltMXMyLnNkIiwJMHg0ODAwMDA5ZSwgMHhiNDAwMDc2MSwgImUsZixnIiwgMCB9LAoreyAibWltMXMyLmRkIiwJMHg0ODAwMDE5ZSwgMHhiNDAwMDY2MSwgImUsZixnIiwgMCB9LAorCisKK3sgImZtdWwuc3MiLAkweDQ4MDAwMDIwLCAweGI0MDAwN2RmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAiZm11bC5zZCIsCTB4NDgwMDAwYTAsIDB4YjQwMDA3NWYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmbXVsLmRkIiwJMHg0ODAwMDFhMCwgMHhiNDAwMDY1ZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmbXVsLnNzIiwJMHg0ODAwMDQyMCwgMHhiNDAwMDNkZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJwZm11bC5zZCIsCTB4NDgwMDA0YTAsIDB4YjQwMDAzNWYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZtdWwuZGQiLAkweDQ4MDAwNWEwLCAweGI0MDAwMjVmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmbXVsMy5kZCIsCTB4NDgwMDA1YTQsIDB4YjQwMDAyNWIsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwzLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgImZtbG93LmRkIiwJMHg0ODAwMDFhMSwgMHhiNDAwMDY1ZSwgImUsZixnIiwgMCB9LAkvKiBmbWxvdy5kZCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAiZnJjcC5zcyIsCTB4NDgwMDAwMjIsIDB4YjQwMDA3ZGQsICJmLGciLCAwIH0sCS8qIGZyY3AucCBmc3JjMixmZGVzdCAqLworeyAiZnJjcC5zZCIsCTB4NDgwMDAwYTIsIDB4YjQwMDA3NWQsICJmLGciLCAwIH0sCS8qIGZyY3AucCBmc3JjMixmZGVzdCAqLworeyAiZnJjcC5kZCIsCTB4NDgwMDAxYTIsIDB4YjQwMDA2NWQsICJmLGciLCAwIH0sCS8qIGZyY3AucCBmc3JjMixmZGVzdCAqLworeyAiZnJzcXIuc3MiLAkweDQ4MDAwMDIzLCAweGI0MDAwN2RjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCit7ICJmcnNxci5zZCIsCTB4NDgwMDAwYTMsIDB4YjQwMDA3NWMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KK3sgImZyc3FyLmRkIiwJMHg0ODAwMDFhMywgMHhiNDAwMDY1YywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLworeyAiZmFkZC5zcyIsCTB4NDgwMDAwMzAsIDB4YjQwMDA3Y2YsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmYWRkLnNkIiwJMHg0ODAwMDBiMCwgMHhiNDAwMDc0ZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgImZhZGQuZGQiLAkweDQ4MDAwMWIwLCAweGI0MDAwNjRmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZhZGQuc3MiLAkweDQ4MDAwNDMwLCAweGI0MDAwM2NmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmYWRkLnNkIiwJMHg0ODAwMDRiMCwgMHhiNDAwMDM0ZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJwZmFkZC5kZCIsCTB4NDgwMDA1YjAsIDB4YjQwMDAyNGYsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAiZnN1Yi5zcyIsCTB4NDgwMDAwMzEsIDB4YjQwMDA3Y2UsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmc3ViLnNkIiwJMHg0ODAwMDBiMSwgMHhiNDAwMDc0ZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgImZzdWIuZGQiLAkweDQ4MDAwMWIxLCAweGI0MDAwNjRlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZzdWIuc3MiLAkweDQ4MDAwNDMxLCAweGI0MDAwM2NlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmc3ViLnNkIiwJMHg0ODAwMDRiMSwgMHhiNDAwMDM0ZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJwZnN1Yi5kZCIsCTB4NDgwMDA1YjEsIDB4YjQwMDAyNGUsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAiZml4LnNzIiwJMHg0ODAwMDAzMiwgMHhiNDAwMDdjZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KK3sgImZpeC5zZCIsCTB4NDgwMDAwYjIsIDB4YjQwMDA3NGQsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCit7ICJmaXguZGQiLAkweDQ4MDAwMWIyLCAweGI0MDAwNjRkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLworeyAicGZpeC5zcyIsCTB4NDgwMDA0MzIsIDB4YjQwMDAzY2QsICJlLGciLCAwIH0sCS8qIHBmaXgucCBmc3JjMSxmZGVzdCAqLworeyAicGZpeC5zZCIsCTB4NDgwMDA0YjIsIDB4YjQwMDAzNGQsICJlLGciLCAwIH0sCS8qIHBmaXgucCBmc3JjMSxmZGVzdCAqLworeyAicGZpeC5kZCIsCTB4NDgwMDA1YjIsIDB4YjQwMDAyNGQsICJlLGciLCAwIH0sCS8qIHBmaXgucCBmc3JjMSxmZGVzdCAqLworeyAiZmFtb3Yuc3MiLAkweDQ4MDAwMDMzLCAweGI0MDAwN2NjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCit7ICJmYW1vdi5kcyIsCTB4NDgwMDAxMzMsIDB4YjQwMDA2Y2MsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KK3sgImZhbW92LnNkIiwJMHg0ODAwMDBiMywgMHhiNDAwMDc0YywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLworeyAiZmFtb3YuZGQiLAkweDQ4MDAwMWIzLCAweGI0MDAwNjRjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCit7ICJwZmFtb3Yuc3MiLAkweDQ4MDAwNDMzLCAweGI0MDAwM2NjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLworeyAicGZhbW92LmRzIiwJMHg0ODAwMDUzMywgMHhiNDAwMDJjYywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KK3sgInBmYW1vdi5zZCIsCTB4NDgwMDA0YjMsIDB4YjQwMDAzNGMsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCit7ICJwZmFtb3YuZGQiLAkweDQ4MDAwNWIzLCAweGI0MDAwMjRjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLworLyogcGZndCBoYXMgUiBiaXQgY2xlYXJlZDsgcGZsZSBoYXMgUiBiaXQgc2V0ICovCit7ICJwZmd0LnNzIiwJMHg0ODAwMDQzNCwgMHhiNDAwMDNjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmZ3Quc2QiLAkweDQ4MDAwNDM0LCAweGI0MDAwM2NiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZndC5kZCIsCTB4NDgwMDA1MzQsIDB4YjQwMDAyY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCisvKiBwZmd0IGhhcyBSIGJpdCBjbGVhcmVkOyBwZmxlIGhhcyBSIGJpdCBzZXQgKi8KK3sgInBmbGUuc3MiLAkweDQ4MDAwNGI0LCAweGI0MDAwMzRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZsZS5zZCIsCTB4NDgwMDA0YjQsIDB4YjQwMDAzNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJwZmxlLmRkIiwJMHg0ODAwMDViNCwgMHhiNDAwMDI0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgImZ0cnVuYy5zcyIsCTB4NDgwMDAwM2EsIDB4YjQwMDA3YzUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCit7ICJmdHJ1bmMuc2QiLAkweDQ4MDAwMGJhLCAweGI0MDAwNzQ1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLworeyAiZnRydW5jLmRkIiwJMHg0ODAwMDFiYSwgMHhiNDAwMDY0NSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KK3sgInBmdHJ1bmMuc3MiLAkweDQ4MDAwNDNhLCAweGI0MDAwM2M1LCAiZSxnIiwgMCB9LAkvKiBwZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KK3sgInBmdHJ1bmMuc2QiLAkweDQ4MDAwNGJhLCAweGI0MDAwMzQ1LCAiZSxnIiwgMCB9LAkvKiBwZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KK3sgInBmdHJ1bmMuZGQiLAkweDQ4MDAwNWJhLCAweGI0MDAwMjQ1LCAiZSxnIiwgMCB9LAkvKiBwZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KK3sgImZ4ZnIiLAkweDQ4MDAwMDQwLCAweGI0MDAwN2JmLCAiZSxkIiwgMCB9LAkvKiBmeGZyIGZzcmMxLGlkZXN0ICovCit7ICJmaWFkZC5zcyIsCTB4NDgwMDAwNDksIDB4YjQwMDA3YjYsICJlLGYsZyIsIDAgfSwJLyogZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAiZmlhZGQuZGQiLAkweDQ4MDAwMWM5LCAweGI0MDAwNjM2LCAiZSxmLGciLCAwIH0sCS8qIGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmaWFkZC5zcyIsCTB4NDgwMDA0NDksIDB4YjQwMDAzYjYsICJlLGYsZyIsIDAgfSwJLyogcGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmaWFkZC5kZCIsCTB4NDgwMDA1YzksIDB4YjQwMDAyMzYsICJlLGYsZyIsIDAgfSwJLyogcGZpYWRkLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgImZpc3ViLnNzIiwJMHg0ODAwMDA0ZCwgMHhiNDAwMDdiMiwgImUsZixnIiwgMCB9LAkvKiBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmaXN1Yi5kZCIsCTB4NDgwMDAxY2QsIDB4YjQwMDA2MzIsICJlLGYsZyIsIDAgfSwJLyogZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZpc3ViLnNzIiwJMHg0ODAwMDQ0ZCwgMHhiNDAwMDNiMiwgImUsZixnIiwgMCB9LAkvKiBwZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAicGZpc3ViLmRkIiwJMHg0ODAwMDVjZCwgMHhiNDAwMDIzMiwgImUsZixnIiwgMCB9LAkvKiBwZmlzdWIudyBmc3JjMSxmc3JjMixmZGVzdCAqLworeyAiZnpjaGtsIiwJMHg0ODAwMDA1NywgMHhiNDAwMDdhOCwgImUsZixnIiwgMCB9LAkvKiBmemNoa2wgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmemNoa2wiLAkweDQ4MDAwNDU3LCAweGI0MDAwM2E4LCAiZSxmLGciLCAwIH0sCS8qIHBmemNoa2wgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgImZ6Y2hrcyIsCTB4NDgwMDAwNWYsIDB4YjQwMDA3YTAsICJlLGYsZyIsIDAgfSwJLyogZnpjaGtzIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJwZnpjaGtzIiwJMHg0ODAwMDQ1ZiwgMHhiNDAwMDNhMCwgImUsZixnIiwgMCB9LAkvKiBwZnpjaGtzIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmYWRkcCIsCTB4NDgwMDAwNTAsIDB4YjQwMDA3YWYsICJlLGYsZyIsIDAgfSwJLyogZmFkZHAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmYWRkcCIsCTB4NDgwMDA0NTAsIDB4YjQwMDAzYWYsICJlLGYsZyIsIDAgfSwJLyogcGZhZGRwIGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmYWRkeiIsCTB4NDgwMDAwNTEsIDB4YjQwMDA3YWUsICJlLGYsZyIsIDAgfSwJLyogZmFkZHogZnNyYzEsZnNyYzIsZmRlc3QgKi8KK3sgInBmYWRkeiIsCTB4NDgwMDA0NTEsIDB4YjQwMDAzYWUsICJlLGYsZyIsIDAgfSwJLyogcGZhZGR6IGZzcmMxLGZzcmMyLGZkZXN0ICovCit7ICJmb3JtIiwJMHg0ODAwMDA1YSwgMHhiNDAwMDdhNSwgImUsZyIsIDAgfSwJLyogZm9ybSBmc3JjMSxmZGVzdCAqLworeyAicGZvcm0iLAkweDQ4MDAwNDVhLCAweGI0MDAwM2E1LCAiZSxnIiwgMCB9LAkvKiBwZm9ybSBmc3JjMSxmZGVzdCAqLworCisvKiBGbG9hdGluZyBwb2ludCBwc2V1ZG8taW5zdHJ1Y3Rpb25zICovCit7ICJmbW92LnNzIiwJMHg0ODAwMDA0OSwgMHhiN2UwMDdiNiwgImUsZyIsIDAgfSwJLyogZmlhZGQuc3MgZnNyYzEsZjAsZmRlc3QgKi8KK3sgImZtb3YuZGQiLAkweDQ4MDAwMWM5LCAweGI3ZTAwNjM2LCAiZSxnIiwgMCB9LAkvKiBmaWFkZC5kZCBmc3JjMSxmMCxmZGVzdCAqLworeyAiZm1vdi5zZCIsCTB4NDgwMDAwYjAsIDB4YjdlMDA3NGYsICJlLGciLCAwIH0sCS8qIGZhZGQuc2QgZnNyYzEsZjAsZmRlc3QgKi8KK3sgImZtb3YuZHMiLAkweDQ4MDAwMTMwLCAweGI3ZTAwNmNmLCAiZSxnIiwgMCB9LAkvKiBmYWRkLmRzIGZzcmMxLGYwLGZkZXN0ICovCit7ICJwZm1vdi5kcyIsCTB4NDgwMDA1MzAsIDB4YjczMDAyY2YsICJlLGciLCAwIH0sCS8qIHBmYWRkLmRzIGZzcmMxLGYwLGZkZXN0ICovCit7ICJwZm1vdi5kZCIsCTB4NDgwMDA1YzksIDB4YjdlMDAyMzYsICJlLGciLCAwIH0sCS8qIHBmaWFkZC5kZCBmc3JjMSxmMCxmZGVzdCAqLworCisKK307CisKKyNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBpODYwX29wY29kZXMpLyhzaXplb2YgaTg2MF9vcGNvZGVzWzBdKSkKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pOTYwLmggYi9pbmNsdWRlL29wY29kZS9pOTYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyZmMzMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaApAQCAtMCwwICsxLDUwOSBAQAorLyogQmFzaWMgODA5NjAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KKyAqCisgKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KKyAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6CisgKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCisgKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCisgKgorICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKKyAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCisgKgorICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQorICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCisgKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCisgKgorICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKKyAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgorICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgorICogYXBwcm9wcmlhdGUuCisgKi8gCisKKyNkZWZpbmUgQ1RSTAkwCisjZGVmaW5lIENPQlIJMQorI2RlZmluZSBDT0oJMgorI2RlZmluZSBSRUcJMworI2RlZmluZSBNRU0xCTQKKyNkZWZpbmUgTUVNMgk1CisjZGVmaW5lIE1FTTQJNgorI2RlZmluZSBNRU04CTcKKyNkZWZpbmUgTUVNMTIJOAorI2RlZmluZSBNRU0xNgk5CisjZGVmaW5lIEZCUkEJMTAKKyNkZWZpbmUgQ0FMTEoJMTEKKworLyogTWFza3MgZm9yIHRoZSBtb2RlIGJpdHMgaW4gUkVHIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgTTEJCTB4MDgwMAorI2RlZmluZSBNMgkJMHgxMDAwCisjZGVmaW5lIE0zCQkweDIwMDAKKworLyogR2VuZXJhdGUgdGhlIDEyLWJpdCBvcGNvZGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiBieSBwbGFjaW5nIHRoZSAKKyAqIGhpZ2ggOCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMgMjQtMzEsIHRoZSBsb3cgNCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMKKyAqIDctMTAuCisgKi8KKworI2RlZmluZSBSRUdfT1BDKG9wYykJKChvcGMgJiAweGZmMCkgPDwgMjApIHwgKChvcGMgJiAweGYpIDw8IDcpCisKKy8qIEdlbmVyYXRlIGEgdGVtcGxhdGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbjogIHBsYWNlIHRoZSBvcGNvZGUgYml0cworICogaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBhbmQgT1IgaW4gbW9kZSBiaXRzIGZvciB0aGUgb3BlcmFuZHMgdGhhdCB3aWxsIG5vdAorICogYmUgdXNlZC4gIEkuZS4sCisgKgkJc2V0IG0xPTEsIGlmIHNyYzEgd2lsbCBub3QgYmUgdXNlZAorICoJCXNldCBtMj0xLCBpZiBzcmMyIHdpbGwgbm90IGJlIHVzZWQKKyAqCQlzZXQgbTM9MSwgaWYgZHN0ICB3aWxsIG5vdCBiZSB1c2VkCisgKgorICogU2V0dGluZyB0aGUgInVudXNlZCIgbW9kZSBiaXRzIHRvIDEgc3BlZWRzIHVwIGluc3RydWN0aW9uIGV4ZWN1dGlvbighKS4KKyAqIFRoZSBpbmZvcm1hdGlvbiBpcyBhbHNvIHVzZWZ1bCB0byB1cyBiZWNhdXNlIHNvbWUgMS1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKKyAqIHVzZSB0aGUgc3JjMSBmaWVsZCwgb3RoZXJzIHRoZSBkc3QgZmllbGQ7IGFuZCBzb21lIDItb3BlcmFuZCBSRUcgaW5zdHJ1Y3Rpb25zCisgKiB1c2Ugc3JjMS9zcmMyLCBvdGhlcnMgc3JjMS9kc3QuICBUaGUgc2V0IG1vZGUgYml0cyBlbmFibGUgdXMgdG8gZGlzdGluZ3Vpc2guCisgKi8KKyNkZWZpbmUgUl8wKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yIHwgTTMgKQkvKiBObyBvcGVyYW5kcyAgICAgICovCisjZGVmaW5lIFJfMShvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgfCBNMyApCS8qIDEgb3BlcmFuZDogc3JjMSAgKi8KKyNkZWZpbmUgUl8xRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTEgfCBNMiApCS8qIDEgb3BlcmFuZDogZHN0ICAgKi8KKyNkZWZpbmUgUl8yKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMyApCQkvKiAyIG9wczogc3JjMS9zcmMyICovCisjZGVmaW5lIFJfMkQob3BjKQkoIFJFR19PUEMob3BjKSB8IE0yICkJCS8qIDIgb3BzOiBzcmMxL2RzdCAgKi8KKyNkZWZpbmUgUl8zKG9wYykJKCBSRUdfT1BDKG9wYykgKQkJLyogMyBvcGVyYW5kcyAgICAgICAqLworCisvKiBERVNDUklQVE9SIEJZVEVTIEZPUiBSRUdJU1RFUiBPUEVSQU5EUworICoKKyAqIEludGVycHJldCBuYW1lcyBhcyBmb2xsb3dzOgorICoJUjogICBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgb25seQorICoJUlM6ICBnbG9iYWwsIGxvY2FsLCBvciAoaWYgdGFyZ2V0IGFsbG93cykgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciBvbmx5CisgKglSTDogIGdsb2JhbCBvciBsb2NhbCByZWdpc3Rlciwgb3IgaW50ZWdlciBsaXRlcmFsCisgKglSU0w6IGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyOworICoJCW9yIGludGVnZXIgbGl0ZXJhbAorICoJRjogICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3RlcgorICoJRkw6ICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3Rlcjsgb3IgbGl0ZXJhbCAoaW5jbHVkaW5nCisgKgkJZmxvYXRpbmcgcG9pbnQpCisgKgorICogQSBudW1iZXIgYXBwZW5kZWQgdG8gYSBuYW1lIGluZGljYXRlcyB0aGF0IHJlZ2lzdGVycyBtdXN0IGJlIGFsaWduZWQsCisgKiBhcyBmb2xsb3dzOgorICoJMjogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgMgorICoJNDogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNAorICovCisKKyNkZWZpbmUgU0ZSCTB4MTAJCS8qIE1hc2sgZm9yIHRoZSAic2ZyLU9LIiBiaXQgKi8KKyNkZWZpbmUgTElUCTB4MDgJCS8qIE1hc2sgZm9yIHRoZSAibGl0ZXJhbC1PSyIgYml0ICovCisjZGVmaW5lIEZQCTB4MDQJCS8qIE1hc2sgZm9yICJmbG9hdGluZy1wb2ludC1PSyIgYml0ICovCisKKy8qIFRoaXMgbWFjcm8gb3JzIHRoZSBiaXRzIHRvZ2V0aGVyLiAgTm90ZSB0aGF0ICdhbGlnbicgaXMgYSBtYXNrCisgKiBmb3IgdGhlIGxvdyAwLCAxLCBvciAyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYXBwcm9wcmlhdGUuCisgKi8KKyNkZWZpbmUgT1AoYWxpZ24sbGl0LGZwLHNmcikJKCBhbGlnbiB8IGxpdCB8IGZwIHwgc2ZyICkKKworI2RlZmluZSBSCU9QKCAwLCAwLCAgIDAsICAwICAgKQorI2RlZmluZSBSUwlPUCggMCwgMCwgICAwLCAgU0ZSICkKKyNkZWZpbmUgUkwJT1AoIDAsIExJVCwgMCwgIDAgICApCisjZGVmaW5lIFJTTAlPUCggMCwgTElULCAwLCAgU0ZSICkKKyNkZWZpbmUgRglPUCggMCwgMCwgICBGUCwgMCAgICkKKyNkZWZpbmUgRkwJT1AoIDAsIExJVCwgRlAsIDAgICApCisjZGVmaW5lIFIyCU9QKCAxLCAwLCAgIDAsICAwICAgKQorI2RlZmluZSBSTDIJT1AoIDEsIExJVCwgMCwgIDAgICApCisjZGVmaW5lIEYyCU9QKCAxLCAwLCAgIEZQLCAwICAgKQorI2RlZmluZSBGTDIJT1AoIDEsIExJVCwgRlAsIDAgICApCisjZGVmaW5lIFI0CU9QKCAzLCAwLCAgIDAsICAwICAgKQorI2RlZmluZSBSTDQJT1AoIDMsIExJVCwgMCwgIDAgICApCisjZGVmaW5lIEY0CU9QKCAzLCAwLCAgIEZQLCAwICAgKQorI2RlZmluZSBGTDQJT1AoIDMsIExJVCwgRlAsIDAgICApCisKKyNkZWZpbmUgTQkweDdmCS8qIE1lbW9yeSBvcGVyYW5kIChNRU1BICYgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb25zKSAqLworCisvKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlZ2lzdGVyIG9wZXJhbmQgZGVzY3JpcHRvciBieXRlICdvZCcuCisgKi8KKyNkZWZpbmUgU0ZSX09LKG9kKQkob2QgJiBTRlIpCS8qIFRSVUUgaWYgc2ZyIG9wZXJhbmQgYWxsb3dlZCAqLworI2RlZmluZSBMSVRfT0sob2QpCShvZCAmIExJVCkJLyogVFJVRSBpZiBsaXRlcmFsIG9wZXJhbmQgYWxsb3dlZCAqLworI2RlZmluZSBGUF9PSyhvZCkJKG9kICYgRlApCS8qIFRSVUUgaWYgZmxvYXRpbmctcG9pbnQgb3AgYWxsb3dlZCAqLworI2RlZmluZSBSRUdfQUxJR04ob2QsbikJKChvZCAmIDB4MyAmIG4pID09IDApCisJCQkJCS8qIFRSVUUgaWYgcmVnICNuIGlzIHByb3Blcmx5IGFsaWduZWQgKi8KKyNkZWZpbmUgTUVNT1Aob2QpCShvZCA9PSBNKQkvKiBUUlVFIGlmIG9wZXJhbmQgaXMgYSBtZW1vcnkgb3BlcmFuZCovCisKKy8qIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGk4MDk2MCBpbnN0cnVjdGlvbiAqLworc3RydWN0IGk5NjBfb3Bjb2RlIHsKKwlsb25nIG9wY29kZTsJLyogMzIgYml0cywgY29uc3RhbnQgZmllbGRzIGZpbGxlZCBpbiwgcmVzdCB6ZXJvZWQgKi8KKwljaGFyICpuYW1lOwkvKiBBc3NlbWJsZXIgbW5lbW9uaWMJCQkJICAgKi8KKwlzaG9ydCBpY2xhc3M7CS8qIENsYXNzOiBzZWUgI2RlZmluZXMgYmVsb3cJCQkgICAqLworCWNoYXIgZm9ybWF0OwkvKiBSRUcsIENPQlIsIENUUkwsIE1FTW4sIENPSiwgRkJSQSwgb3IgQ0FMTEoJICAgKi8KKwljaGFyIG51bV9vcHM7CS8qIE51bWJlciBvZiBvcGVyYW5kcwkJCQkgICAqLworCWNoYXIgb3BlcmFuZFszXTsvKiBPcGVyYW5kIGRlc2NyaXB0b3JzOyBzYW1lIG9yZGVyIGFzIGFzc2VtYmxlciBpbnN0ciAqLworfTsKKworLyogQ2xhc3NlcyBvZiA5NjAgaW50cnVjdGlvbnM6CisgKgktIGVhY2ggaW5zdHJ1Y3Rpb24gZmFsbHMgaW50byBvbmUgY2xhc3MuCisgKgktIGVhY2ggdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBvbmUgb3IgbW9yZSBjbGFzc2VzLgorICoKKyAqIEVBQ0ggQ09OU1RBTlQgTVVTVCBDT05UQUlOIDEgQU5EIE9OTFkgMSBTRVQgQklUITogIHNlZSB0YXJnX2hhc19pY2xhc3MoKS4KKyAqLworI2RlZmluZSBJX0JBU0UJMHgwMQkvKiA4MDk2MCBiYXNlIGluc3RydWN0aW9uIHNldAkqLworI2RlZmluZSBJX0NYCTB4MDIJLyogODA5NjBDeCBpbnN0cnVjdGlvbgkJKi8KKyNkZWZpbmUgSV9ERUMJMHgwNAkvKiBEZWNpbWFsIGluc3RydWN0aW9uCQkqLworI2RlZmluZSBJX0ZQCTB4MDgJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24JKi8KKyNkZWZpbmUgSV9LWAkweDEwCS8qIDgwOTYwS3ggaW5zdHJ1Y3Rpb24JCSovCisjZGVmaW5lIElfTUlMCTB4MjAJLyogTWlsaXRhcnkgaW5zdHJ1Y3Rpb24JCSovCisjZGVmaW5lIElfQ0FTSU0JMHg0MAkvKiBDQSBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24JKi8KKyNkZWZpbmUgSV9DWDIJMHg4MAkvKiBDeC9KeC9IeCBpbnN0cnVjdGlvbnMJKi8KKyNkZWZpbmUgSV9KWAkweDEwMAkvKiBKeC9IeCBpbnN0cnVjdGlvbgkJKi8KKyNkZWZpbmUgSV9IWAkweDIwMAkvKiBIeCBpbnN0cnVjdGlvbnMJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJVEFCTEUgT0YgaTk2MCBJTlNUUlVDVElPTiBERVNDUklQVElPTlMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgaTk2MF9vcGNvZGVzW10gPSB7CisKKwkvKiBpZiBhIENUUkwgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQsIGl0J3MgYWx3YXlzIGEgZGlzcGxhY2VtZW50ICovCisKKwkvKiBjYWxsaiBkZWZhdWx0PT0nY2FsbCcgKi8KKwl7IDB4MDkwMDAwMDAsCSJjYWxsaiIsCUlfQkFTRSwJQ0FMTEosIAkxLCB7IDAsIDAsIDAgfSB9LAorCXsgMHgwODAwMDAwMCwJImIiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MDkwMDAwMDAsCSJjYWxsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJeyAweDBhMDAwMDAwLAkicmV0IiwJCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCisJeyAweDBiMDAwMDAwLAkiYmFsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJeyAweDEwMDAwMDAwLAkiYm5vIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJLyogYmYgc2FtZSBhcyBibm8gKi8KKwl7IDB4MTAwMDAwMDAsCSJiZiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAorCS8qIGJydSBzYW1lIGFzIGJubyAqLworCXsgMHgxMDAwMDAwMCwJImJydSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAorCXsgMHgxMTAwMDAwMCwJImJnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJLyogYnJnIHNhbWUgYXMgYmcgKi8KKwl7IDB4MTEwMDAwMDAsCSJicmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MTIwMDAwMDAsCSJiZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAorCS8qIGJyZSBzYW1lIGFzIGJlICovCisJeyAweDEyMDAwMDAwLAkiYnJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJeyAweDEzMDAwMDAwLAkiYmdlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJLyogYnJnZSBzYW1lIGFzIGJnZSAqLworCXsgMHgxMzAwMDAwMCwJImJyZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MTQwMDAwMDAsCSJibCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAorCS8qIGJybCBzYW1lIGFzIGJsICovCisJeyAweDE0MDAwMDAwLAkiYnJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJeyAweDE1MDAwMDAwLAkiYm5lIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJLyogYnJsZyBzYW1lIGFzIGJuZSAqLworCXsgMHgxNTAwMDAwMCwJImJybGciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MTYwMDAwMDAsCSJibGUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKKwkvKiBicmxlIHNhbWUgYXMgYmxlICovCisJeyAweDE2MDAwMDAwLAkiYnJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAorCXsgMHgxNzAwMDAwMCwJImJvIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJLyogYnQgc2FtZSBhcyBibyAqLworCXsgMHgxNzAwMDAwMCwJImJ0IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCisJLyogYnJvIHNhbWUgYXMgYm8gKi8KKwl7IDB4MTcwMDAwMDAsCSJicm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MTgwMDAwMDAsCSJmYXVsdG5vIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKKwkvKiBmYXVsdGYgc2FtZSBhcyBmYXVsdG5vICovCisJeyAweDE4MDAwMDAwLAkiZmF1bHRmIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MTkwMDAwMDAsCSJmYXVsdGciLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAorCXsgMHgxYTAwMDAwMCwJImZhdWx0ZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCisJeyAweDFiMDAwMDAwLAkiZmF1bHRnZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCisJeyAweDFjMDAwMDAwLAkiZmF1bHRsIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MWQwMDAwMDAsCSJmYXVsdG5lIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MWUwMDAwMDAsCSJmYXVsdGxlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKKwl7IDB4MWYwMDAwMDAsCSJmYXVsdG8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAorCS8qIGZhdWx0dCBzeW4gZm9yIGZhdWx0byAqLworCXsgMHgxZjAwMDAwMCwJImZhdWx0dCIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCisKKwl7IDB4MDEwMDAwMDAsCSJzeXNjYWxsIiwJSV9DQVNJTSxDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKKworCS8qIElmIGEgQ09CUiAob3IgQ09KKSBoYXMgMyBvcGVyYW5kcywgdGhlIGxhc3Qgb25lIGlzIGFsd2F5cyBhCisJICogZGlzcGxhY2VtZW50IGFuZCBkb2VzIG5vdCBhcHBlYXIgZXhwbGljaXRseSBpbiB0aGUgdGFibGUuCisJICovCisKKwl7IDB4MjAwMDAwMDAsCSJ0ZXN0bm8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyAweDIxMDAwMDAwLAkidGVzdGciLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyAweDIyMDAwMDAwLAkidGVzdGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyAweDIzMDAwMDAwLAkidGVzdGdlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAorCXsgMHgyNDAwMDAwMCwJInRlc3RsIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAorCXsgMHgyNTAwMDAwMCwJInRlc3RuZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKKwl7IDB4MjYwMDAwMDAsCSJ0ZXN0bGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyAweDI3MDAwMDAwLAkidGVzdG8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyAweDMwMDAwMDAwLAkiYmJjIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzMTAwMDAwMCwJImNtcG9iZyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzMjAwMDAwMCwJImNtcG9iZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzMzAwMDAwMCwJImNtcG9iZ2UiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKKwl7IDB4MzQwMDAwMDAsCSJjbXBvYmwiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKKwl7IDB4MzUwMDAwMDAsCSJjbXBvYm5lIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDM2MDAwMDAwLAkiY21wb2JsZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzNzAwMDAwMCwJImJicyIsCQlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKKwl7IDB4MzgwMDAwMDAsCSJjbXBpYm5vIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDM5MDAwMDAwLAkiY21waWJnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDNhMDAwMDAwLAkiY21waWJlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDNiMDAwMDAwLAkiY21waWJnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzYzAwMDAwMCwJImNtcGlibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzZDAwMDAwMCwJImNtcGlibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKKwl7IDB4M2UwMDAwMDAsCSJjbXBpYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDNmMDAwMDAwLAkiY21waWJvIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDMxMDAwMDAwLAkiY21wb2pnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKKwl7IDB4MzIwMDAwMDAsCSJjbXBvamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzMzAwMDAwMCwJImNtcG9qZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzNDAwMDAwMCwJImNtcG9qbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDM1MDAwMDAwLAkiY21wb2puZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDM2MDAwMDAwLAkiY21wb2psZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDM4MDAwMDAwLAkiY21waWpubyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDM5MDAwMDAwLAkiY21waWpnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKKwl7IDB4M2EwMDAwMDAsCSJjbXBpamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzYjAwMDAwMCwJImNtcGlqZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAorCXsgMHgzYzAwMDAwMCwJImNtcGlqbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDNkMDAwMDAwLAkiY21waWpuZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDNlMDAwMDAwLAkiY21waWpsZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCisJeyAweDNmMDAwMDAwLAkiY21waWpvIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKKworCXsgMHg4MDAwMDAwMCwJImxkb2IiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCisJeyAweDgyMDAwMDAwLAkic3RvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgUiwgIE0sICAwIH0gfSwKKwl7IDB4ODQwMDAwMDAsCSJieCIsCQlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKKwl7IDB4ODUwMDAwMDAsCSJiYWx4IiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAorCXsgMHg4NjAwMDAwMCwJImNhbGx4IiwJSV9CQVNFLAlNRU0xLAkxLCB7IE0sICAwLCAgMCB9IH0sCisJeyAweDg4MDAwMDAwLAkibGRvcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKKwl7IDB4OGEwMDAwMDAsCSJzdG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAorCXsgMHg4YzAwMDAwMCwJImxkYSIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKKwl7IDB4OTAwMDAwMDAsCSJsZCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgTSwgIFIsICAwIH0gfSwKKwl7IDB4OTIwMDAwMDAsCSJzdCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgUiwgIE0sICAwIH0gfSwKKwl7IDB4OTgwMDAwMDAsCSJsZGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IE0sICBSMiwgMCB9IH0sCisJeyAweDlhMDAwMDAwLAkic3RsIiwJCUlfQkFTRSwJTUVNOCwJMiwgeyBSMiwgTSwgIDAgfSB9LAorCXsgMHhhMDAwMDAwMCwJImxkdCIsCQlJX0JBU0UsCU1FTTEyLAkyLCB7IE0sICBSNCwgMCB9IH0sCisJeyAweGEyMDAwMDAwLAkic3R0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgUjQsIE0sICAwIH0gfSwKKwl7IDB4YjAwMDAwMDAsCSJsZHEiLAkJSV9CQVNFLAlNRU0xNiwJMiwgeyBNLCAgUjQsIDAgfSB9LAorCXsgMHhiMjAwMDAwMCwJInN0cSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IFI0LCBNLCAgMCB9IH0sCisJeyAweGMwMDAwMDAwLAkibGRpYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKKwl7IDB4YzIwMDAwMDAsCSJzdGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAorCXsgMHhjODAwMDAwMCwJImxkaXMiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IE0sICBSLCAgMCB9IH0sCisJeyAweGNhMDAwMDAwLAkic3RpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgUiwgIE0sICAwIH0gfSwKKworCXsgUl8zKDB4NTgwKSwJIm5vdGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NTgxKSwJImFuZCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU4MiksCSJhbmRub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU4MyksCSJzZXRiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU4NCksCSJub3RhbmQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU4NiksCSJ4b3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1ODcpLAkib3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1ODgpLAkibm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NTg5KSwJInhub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzJEKDB4NThhKSwJIm5vdCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAorCXsgUl8zKDB4NThiKSwJIm9ybm90IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1OGMpLAkiY2xyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1OGQpLAkibm90b3IiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU4ZSksCSJuYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NThmKSwJImFsdGVyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1OTApLAkiYWRkbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU5MSksCSJhZGRpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NTkyKSwJInN1Ym8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1OTMpLAkic3ViaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU5OCksCSJzaHJvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NTlhKSwJInNocmRpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1OWIpLAkic2hyaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDU5YyksCSJzaGxvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NTlkKSwJInJvdGF0ZSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NTllKSwJInNobGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzIoMHg1YTApLAkiY21wbyIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKKwl7IFJfMigweDVhMSksCSJjbXBpIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAorCXsgUl8yKDB4NWEyKSwJImNvbmNtcG8iLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKKwl7IFJfMigweDVhMyksCSJjb25jbXBpIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCisJeyBSXzMoMHg1YTQpLAkiY21waW5jbyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NWE1KSwJImNtcGluY2kiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDVhNiksCSJjbXBkZWNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg1YTcpLAkiY21wZGVjaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8yKDB4NWFjKSwJInNjYW5ieXRlIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCisJeyBSXzIoMHg1YWUpLAkiY2hrYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCisJeyBSXzMoMHg1YjApLAkiYWRkYyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDViMiksCSJzdWJjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8yRCgweDVjYyksCSJtb3YiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKKwl7IFJfMkQoMHg1ZGMpLAkibW92bCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDIsUjIsIDAgfSB9LAorCXsgUl8yRCgweDVlYyksCSJtb3Z0IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMNCxSNCwgMCB9IH0sCisJeyBSXzJEKDB4NWZjKSwJIm1vdnEiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKKwl7IFJfMygweDYxMCksCSJhdG1vZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUiB9IH0sCisJeyBSXzMoMHg2MTIpLAkiYXRhZGQiLAlJX0JBU0UsCVJFRywJMywgeyBSUywgUlNMLFJTIH0gfSwKKwl7IFJfMkQoMHg2NDApLAkic3BhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCisJeyBSXzJEKDB4NjQxKSwJInNjYW5iaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAorCXsgUl8zKDB4NjQ1KSwJIm1vZGFjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg2NTApLAkibW9kaWZ5IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKKwl7IFJfMygweDY1MSksCSJleHRyYWN0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKKwl7IFJfMygweDY1NCksCSJtb2R0YyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NjU1KSwJIm1vZHBjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKKwl7IFJfMSgweDY2MCksCSJjYWxscyIsCUlfQkFTRSwJUkVHLAkxLCB7IFJTTCwgMCwgMCB9IH0sCisJeyBSXzAoMHg2NmIpLAkibWFyayIsCQlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKKwl7IFJfMCgweDY2YyksCSJmbWFyayIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAorCXsgUl8wKDB4NjZkKSwJImZsdXNocmVnIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCisJeyBSXzAoMHg2NmYpLAkic3luY2YiLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKKwl7IFJfMygweDY3MCksCSJlbXVsIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUjIgfSB9LAorCXsgUl8zKDB4NjcxKSwJImVkaXYiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJMMixSUyB9IH0sCisJeyBSXzJEKDB4NjcyKSwJImN2dGFkciIsCUlfQ0FTSU0sUkVHLCAJMiwgeyBSTCwgUjIsIDAgfSB9LAorCXsgUl8zKDB4NzAxKSwJIm11bG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3MDgpLAkicmVtbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDcwYiksCSJkaXZvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NzQxKSwJIm11bGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3NDgpLAkicmVtaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDc0OSksCSJtb2RpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NzRiKSwJImRpdmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisKKwkvKiBGbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMgKi8KKworCXsgUl8yRCgweDY3NCksCSJjdnRpciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCisJeyBSXzJEKDB4Njc1KSwJImN2dGlsciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCisJeyBSXzMoMHg2NzYpLAkic2NhbGVybCIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwyLEYyIH0gfSwKKwl7IFJfMygweDY3NyksCSJzY2FsZXIiLAlJX0ZQLAlSRUcsCTMsIHsgUkwsIEZMLCBGIH0gfSwKKwl7IFJfMygweDY4MCksCSJhdGFuciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAorCXsgUl8zKDB4NjgxKSwJImxvZ2VwciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAorCXsgUl8zKDB4NjgyKSwJImxvZ3IiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCisJeyBSXzMoMHg2ODMpLAkicmVtciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKKwl7IFJfMigweDY4NCksCSJjbXBvciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRkwsIDAgfSB9LAorCXsgUl8yKDB4Njg1KSwJImNtcHIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCisJeyBSXzJEKDB4Njg4KSwJInNxcnRyIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKKwl7IFJfMkQoMHg2ODkpLAkiZXhwciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAorCXsgUl8yRCgweDY4YSksCSJsb2dibnIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAorCXsgUl8yRCgweDY4YiksCSJyb3VuZHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAorCXsgUl8yRCgweDY4YyksCSJzaW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCisJeyBSXzJEKDB4NjhkKSwJImNvc3IiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKKwl7IFJfMkQoMHg2OGUpLAkidGFuciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAorCXsgUl8xKDB4NjhmKSwJImNsYXNzciIsCUlfRlAsCVJFRywJMSwgeyBGTCwgMCwgMCB9CX0sCisJeyBSXzMoMHg2OTApLAkiYXRhbnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAorCXsgUl8zKDB4NjkxKSwJImxvZ2VwcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCisJeyBSXzMoMHg2OTIpLAkibG9ncmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCisJeyBSXzMoMHg2OTMpLAkicmVtcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCisJeyBSXzIoMHg2OTQpLAkiY21wb3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAorCXsgUl8yKDB4Njk1KSwJImNtcHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAorCXsgUl8yRCgweDY5OCksCSJzcXJ0cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKKwl7IFJfMkQoMHg2OTkpLAkiZXhwcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKKwl7IFJfMkQoMHg2OWEpLAkibG9nYm5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAorCXsgUl8yRCgweDY5YiksCSJyb3VuZHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCisJeyBSXzJEKDB4NjljKSwJInNpbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCisJeyBSXzJEKDB4NjlkKSwJImNvc3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCisJeyBSXzJEKDB4NjllKSwJInRhbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCisJeyBSXzEoMHg2OWYpLAkiY2xhc3NybCIsCUlfRlAsCVJFRywJMSwgeyBGTDIsIDAsIDAgfSB9LAorCXsgUl8yRCgweDZjMCksCSJjdnRyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCisJeyBSXzJEKDB4NmMxKSwJImN2dHJpbCIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUjIsIDAgfSB9LAorCXsgUl8yRCgweDZjMiksCSJjdnR6cmkiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIsIDAgfSB9LAorCXsgUl8yRCgweDZjMyksCSJjdnR6cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCisJeyBSXzJEKDB4NmM5KSwJIm1vdnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKKwl7IFJfMkQoMHg2ZDkpLAkibW92cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKKwl7IFJfMkQoMHg2ZTEpLAkibW92cmUiLAlJX0ZQLAlSRUcsCTIsIHsgRkw0LEY0LCAwIH0gfSwKKwl7IFJfMygweDZlMiksCSJjcHlzcmUiLAlJX0ZQLAlSRUcsCTMsIHsgRkw0LEZMNCxGNCB9IH0sCisJeyBSXzMoMHg2ZTMpLAkiY3B5cnNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKKwl7IFJfMygweDc4YiksCSJkaXZyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAorCXsgUl8zKDB4NzhjKSwJIm11bHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCisJeyBSXzMoMHg3OGQpLAkic3ViciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKKwl7IFJfMygweDc4ZiksCSJhZGRyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAorCXsgUl8zKDB4NzliKSwJImRpdnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAorCXsgUl8zKDB4NzljKSwJIm11bHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAorCXsgUl8zKDB4NzlkKSwJInN1YnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAorCXsgUl8zKDB4NzlmKSwJImFkZHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAorCisJLyogVGhlc2UgYXJlIHRoZSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgRWFjaCBhY3R1YWxseQorCSAqIGdlbmVyYXRlcyAyIGJyYW5jaCBpbnN0cnVjdGlvbnM6ICB0aGUgZmlyc3QgYSBDVFJMIGluc3RydWN0aW9uIHdpdGgKKwkgKiB0aGUgaW5kaWNhdGVkIG9wY29kZSwgYW5kIHRoZSBzZWNvbmQgYSAnYm5vJy4KKwkgKi8KKworCXsgMHgxMjAwMDAwMCwJImJydWUiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCisJeyAweDExMDAwMDAwLAkiYnJ1ZyIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKKwl7IDB4MTMwMDAwMDAsCSJicnVnZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAorCXsgMHgxNDAwMDAwMCwJImJydWwiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCisJeyAweDE2MDAwMDAwLAkiYnJ1bGUiLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKKwl7IDB4MTUwMDAwMDAsCSJicnVsZyIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAorCisKKwkvKiBEZWNpbWFsIGluc3RydWN0aW9ucyAqLworCisJeyBSXzMoMHg2NDIpLAkiZGFkZGMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NjQzKSwJImRzdWJjIiwJSV9ERUMsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMkQoMHg2NDQpLAkiZG1vdnQiLAlJX0RFQywJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCisKKworCS8qIEtYIGV4dGVuc2lvbnMgKi8KKworCXsgUl8yKDB4NjAwKSwJInN5bm1vdiIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCisJeyBSXzIoMHg2MDEpLAkic3lubW92bCIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCisJeyBSXzIoMHg2MDIpLAkic3lubW92cSIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCisJeyBSXzJEKDB4NjE1KSwJInN5bmxkIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKKworCisJLyogTUMgZXh0ZW5zaW9ucyAqLworCisJeyBSXzMoMHg2MDMpLAkiY21wc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKKwl7IFJfMygweDYwNCksCSJtb3Zxc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKKwl7IFJfMygweDYwNSksCSJtb3ZzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAorCXsgUl8yRCgweDYxMyksCSJpbnNwYWNjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCisJeyBSXzJEKDB4NjE0KSwJImxkcGh5IiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCisJeyBSXzMoMHg2MTcpLAkiZmlsbCIsCQlJX01JTCwJUkVHLAkzLCB7IFIsICBSTCwgUkwgfSB9LAorCXsgUl8yRCgweDY0NiksCSJjb25kcmVjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCisJeyBSXzJEKDB4NjU2KSwJInJlY2VpdmUiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKKwl7IFJfMygweDY2MiksCSJzZW5kIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSIH0gfSwKKwl7IFJfMSgweDY2MyksCSJzZW5kc2VydiIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyBSXzEoMHg2NjQpLAkicmVzdW1wcmNzIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKKwl7IFJfMSgweDY2NSksCSJzY2hlZHByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAorCXsgUl8wKDB4NjY2KSwJInNhdmVwcmNzIiwJSV9NSUwsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKKwl7IFJfMSgweDY2OCksCSJjb25kd2FpdCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyBSXzEoMHg2NjkpLAkid2FpdCIsCQlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAorCXsgUl8xKDB4NjZhKSwJInNpZ25hbCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCisJeyBSXzFEKDB4NjczKSwJImxkdGltZSIsCUlfTUlMLAlSRUcsCTEsIHsgUjIsIDAsIDAgfQl9LAorCisKKwkvKiBDWCBleHRlbnNpb25zICovCisKKwl7IFJfMygweDVkOCksCSJlc2hybyIsCUlfQ1gyLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg2MzApLAkic2RtYSIsCQlJX0NYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCisJeyBSXzMoMHg2MzEpLAkidWRtYSIsCQlJX0NYLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCisJeyBSXzMoMHg2NTkpLAkic3lzY3RsIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKKworCisJLyogSnggZXh0ZW5zaW9ucy4gICovCisJeyBSXzMoMHg3ODApLAkiYWRkb25vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NzkwKSwJImFkZG9nIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2EwKSwJImFkZG9lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2IwKSwJImFkZG9nZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdjMCksCSJhZGRvbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdkMCksCSJhZGRvbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZTApLAkiYWRkb2xlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2YwKSwJImFkZG9vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NzgxKSwJImFkZGlubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDc5MSksCSJhZGRpZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdhMSksCSJhZGRpZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdiMSksCSJhZGRpZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3YzEpLAkiYWRkaWwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZDEpLAkiYWRkaW5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2UxKSwJImFkZGlsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdmMSksCSJhZGRpbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKworCXsgUl8yRCgweDVhZCksCSJic3dhcCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKKworCXsgUl8yKDB4NTk0KSwJImNtcG9iIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAorCXsgUl8yKDB4NTk1KSwJImNtcGliIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAorCXsgUl8yKDB4NTk2KSwJImNtcG9zIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAorCXsgUl8yKDB4NTk3KSwJImNtcGlzIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAorCisJeyBSXzMoMHg3ODQpLAkic2Vsbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3OTQpLAkic2VsZyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3YTQpLAkic2VsZSIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3YjQpLAkic2VsZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3YzQpLAkic2VsbCIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZDQpLAkic2VsbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZTQpLAkic2VsbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZjQpLAkic2VsbyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisKKwl7IFJfMygweDc4MiksCSJzdWJvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3OTIpLAkic3Vib2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3YTIpLAkic3Vib2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3YjIpLAkic3Vib2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2MyKSwJInN1Ym9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2QyKSwJInN1Ym9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdlMiksCSJzdWJvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZjIpLAkic3Vib28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ODMpLAkic3ViaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4NzkzKSwJInN1YmlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2EzKSwJInN1YmllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2IzKSwJInN1YmlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdjMyksCSJzdWJpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKKwl7IFJfMygweDdkMyksCSJzdWJpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzMoMHg3ZTMpLAkic3ViaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCXsgUl8zKDB4N2YzKSwJInN1YmlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAorCisJeyBSXzMoMHg2NWMpLAkiZGNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCisJeyBSXzMoMHg2NWIpLAkiaWNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCisJeyBSXzJEKDB4NjU4KSwJImludGN0bCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKKwl7IFJfMCgweDViNCksCSJpbnRkaXMiLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCisJeyBSXzAoMHg1YjUpLAkiaW50ZW4iLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCisJeyBSXzAoMHg2NWQpLAkiaGFsdCIsCQlJX0pYLAlSRUcsCTEsIHsgUlNMLCAgMCwgMCB9IH0sCisKKwkvKiBIeCBleHRlbnNpb25zLiAgKi8KKwl7IDB4YWMwMDAwMDAsCSJkY2ludmEiLAlJX0hYLAlNRU0xLAkxLCB7ICAgTSwgIDAsIDAgfSB9LAorCisJLyogRU5EIE9GIFRBQkxFICovCisKKwl7IDAsCQlOVUxMLAkJMCwJMCwJMCwgeyAwLCAwLCAwIH0JfQorfTsKKworIC8qIGVuZCBvZiBpOTYwLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tNjhrLmggYi9pbmNsdWRlL29wY29kZS9tNjhrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiM2Y5NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL202OGsuaApAQCAtMCwwICsxLDMxNSBAQAorLyogT3Bjb2RlIHRhYmxlIGhlYWRlciBmb3IgbTY4MFswMTIzNF0wL202ODg4WzEyXS9tNjg4NTEuCisgICBDb3B5cmlnaHQgMTk4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQordGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisxLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQord2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCit3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGVzZSBhcmUgdXNlZCBhcyBiaXQgZmxhZ3MgZm9yIHRoZSBhcmNoIGZpZWxkIGluIHRoZSBtNjhrX29wY29kZQorICAgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUJX202OGtfdW5kZWYgIDAKKyNkZWZpbmUJbTY4MDAwICAweDAwMQorI2RlZmluZQltNjgwMDggIG02ODAwMCAvKiBzeW5vbnltIGZvciAtbTY4MDAwLiAgb3RoZXJ3aXNlIHVudXNlZC4gKi8KKyNkZWZpbmUJbTY4MDEwICAweDAwMgorI2RlZmluZQltNjgwMjAgIDB4MDA0CisjZGVmaW5lCW02ODAzMCAgMHgwMDgKKyNkZWZpbmUgbTY4ZWMwMzAgbTY4MDMwIC8qIHNpbWlsYXIgZW5vdWdoIHRvIC1tNjgwMzAgdG8gaWdub3JlIGRpZmZlcmVuY2VzOworCQkJICAgZ2FzIHdpbGwgZGVhbCB3aXRoIHRoZSBmZXcgZGlmZmVyZW5jZXMuICAqLworI2RlZmluZQltNjgwNDAgIDB4MDEwCisvKiB0aGVyZSBpcyBubyA2ODA1MCAqLworI2RlZmluZSBtNjgwNjAgIDB4MDIwCisjZGVmaW5lCW02ODg4MSAgMHgwNDAKKyNkZWZpbmUJbTY4ODgyICBtNjg4ODEgLyogc3lub255bSBmb3IgLW02ODg4MS4gIG90aGVyd2lzZSB1bnVzZWQuICovCisjZGVmaW5lCW02ODg1MSAgMHgwODAKKyNkZWZpbmUgY3B1MzIJMHgxMDAJLyogZS5nLiwgNjgzMzIgKi8KKyNkZWZpbmUgbWNmNTIwMCAweDIwMAorCisgLyogaGFuZHkgYWxpYXNlcyAqLworI2RlZmluZQltNjgwNDB1cCAgKG02ODA0MCB8IG02ODA2MCkKKyNkZWZpbmUJbTY4MDMwdXAgIChtNjgwMzAgfCBtNjgwNDB1cCkKKyNkZWZpbmUJbTY4MDIwdXAgIChtNjgwMjAgfCBtNjgwMzB1cCkKKyNkZWZpbmUJbTY4MDEwdXAgIChtNjgwMTAgfCBjcHUzMiB8IG02ODAyMHVwKQorI2RlZmluZQltNjgwMDB1cCAgKG02ODAwMCB8IG02ODAxMHVwKQorCisjZGVmaW5lCW1mbG9hdCAgKG02ODg4MSB8IG02ODg4MiB8IG02ODA0MCB8IG02ODA2MCkKKyNkZWZpbmUJbW1tdSAgICAobTY4ODUxIHwgbTY4MDMwIHwgbTY4MDQwIHwgbTY4MDYwKQorCisvKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlLiAgKi8KKworc3RydWN0IG02OGtfb3Bjb2RlCit7CisgIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisgIC8qIFRoZSBtYXNrIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCisgIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CisgIC8qIFRoZSBhcmd1bWVudHMuICAqLworICBjb25zdCBjaGFyICphcmdzOworICAvKiBUaGUgYXJjaGl0ZWN0dXJlcyB3aGljaCBzdXBwb3J0IHRoaXMgb3Bjb2RlLiAgKi8KKyAgdW5zaWduZWQgaW50IGFyY2g7Cit9OworCisvKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlIGFsaWFzLiAgKi8KKworc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzCit7CisgIC8qIFRoZSBhbGlhcyBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqYWxpYXM7CisgIC8qIFRoZSBpbnN0cnVjdGlvbiBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbGlhcy4gICovCisgIGNvbnN0IGNoYXIgKnByaW1hcnk7Cit9OworCisvKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMgYmVjYXVzZSB0aGF0IGlzIHRoZQorICAgbW9zdCBhbnkgb2YgdGhlbSBuZWVkLiAgVGhlIGFjdHVhbCBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMKKyAgIGFsd2F5cyBhdCBsZWFzdCAyIGJ5dGVzLCBhbmQgaXMgYXMgbXVjaCBsb25nZXIgYXMgbmVjZXNzYXJ5IHRvIGhvbGQKKyAgIHRoZSBvcGVyYW5kcyBpdCBoYXMuCisKKyAgIFRoZSBtYXRjaCBmaWVsZCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBwYXJ0aWN1bGFyCisgICBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQKKyAgIG9wY29kZS4KKworICAgVGhlIGFyZ3MgZmllbGQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0d28gY2hhcmFjdGVycyBmb3IgZWFjaAorICAgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgZmlyc3Qgc3BlY2lmaWVzIHRoZSBraW5kIG9mCisgICBvcGVyYW5kOyB0aGUgc2Vjb25kLCB0aGUgcGxhY2UgaXQgaXMgc3RvcmVkLiAgKi8KKworLyogS2luZHMgb2Ygb3BlcmFuZHM6CisgICBDaGFyYWN0ZXJzIHVzZWQ6IEFhQkNjRGRGZklKa0xsTW1uT29wUXFSclNzVHRVVnZXWFlaMDEyM3wqfiU7QCEmJD8vPD4jXistCisKKyAgIEQgIGRhdGEgcmVnaXN0ZXIgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCisgICBBICBhZGRyZXNzIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgorICAgYSAgYWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KKyAgIFIgIGVpdGhlciBraW5kIG9mIHJlZ2lzdGVyLiAgU3RvcmVkIGFzIDQgYml0cy4KKyAgIHIgIGVpdGhlciBraW5kIG9mIHJlZ2lzdGVyIGluZGlyZWN0IG9ubHkuICBTdG9yZWQgYXMgNCBiaXRzLgorICAgICAgQXQgdGhlIG1vbWVudCwgdXNlZCBvbmx5IGZvciBjYXMyIGluc3RydWN0aW9uLgorICAgRiAgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb25seS4gICBTdG9yZWQgYXMgMyBiaXRzLgorICAgTyAgYW4gb2Zmc2V0IChvciB3aWR0aCk6IGltbWVkaWF0ZSBkYXRhIDAtMzEgb3IgZGF0YSByZWdpc3Rlci4KKyAgICAgIFN0b3JlZCBhcyA2IGJpdHMgaW4gc3BlY2lhbCBmb3JtYXQgZm9yIEJGLi4uIGluc25zLgorICAgKyAgYXV0b2luY3JlbWVudCBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cyAobnVtYmVyIG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVyKS4KKyAgIC0gIGF1dG9kZWNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCisgICBRICBxdWljayBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyAzIGJpdHMuCisgICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIDEgLi4gOC4KKyAgIE0gIG1vdmVxIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGFzIDggYml0cy4KKyAgICAgIFRoaXMgbWF0Y2hlcyBhbiBpbW1lZGlhdGUgb3BlcmFuZCBvbmx5IHdoZW4gdmFsdWUgaXMgaW4gcmFuZ2UgLTEyOC4uMTI3CisgICBUICB0cmFwIHZlY3RvciBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA0IGJpdHMuCisKKyAgIGsgIEstZmFjdG9yIGZvciBmbW92ZS5wIGluc3RydWN0aW9uLiAgIFN0b3JlZCBhcyBhIDctYml0IGNvbnN0YW50IG9yCisgICAgICBhIHRocmVlIGJpdCByZWdpc3RlciBvZmZzZXQsIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4KKworICAgIyAgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgaW4gc3BlY2lhbCBwbGFjZXMgKGIsIHcgb3IgbCkKKyAgICAgIHdoaWNoIHNheSBob3cgbWFueSBiaXRzIHRvIHN0b3JlLgorICAgXiAgaW1tZWRpYXRlIGRhdGEgZm9yIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4gICBTcGVjaWFsIHBsYWNlcworICAgICAgYXJlIG9mZnNldCBieSAyIGJ5dGVzIGZyb20gJyMnLi4uCisgICBCICBwYy1yZWxhdGl2ZSBhZGRyZXNzLCBjb252ZXJ0ZWQgdG8gYW4gb2Zmc2V0CisgICAgICB0aGF0IGlzIHRyZWF0ZWQgYXMgaW1tZWRpYXRlIGRhdGEuCisgICBkICBkaXNwbGFjZW1lbnQgYW5kIHJlZ2lzdGVyLiAgU3RvcmVzIHRoZSByZWdpc3RlciBhcyAzIGJpdHMKKyAgICAgIGFuZCBzdG9yZXMgdGhlIGRpc3BsYWNlbWVudCBpbiB0aGUgZW50aXJlIHNlY29uZCB3b3JkLgorCisgICBDICB0aGUgQ0NSLiAgTm8gbmVlZCB0byBzdG9yZSBpdDsgdGhpcyBpcyBqdXN0IGZvciBmaWx0ZXJpbmcgdmFsaWRpdHkuCisgICBTICB0aGUgU1IuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgorICAgVSAgdGhlIFVTUC4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCisKKyAgIEkgIENvcHJvY2Vzc29yIElELiAgIE5vdCBwcmludGVkIGlmIDEuICAgVGhlIENvcHJvY2Vzc29yIElEIGlzIGFsd2F5cworICAgICAgZXh0cmFjdGVkIGZyb20gdGhlICdkJyBmaWVsZCBvZiB3b3JkIG9uZSwgd2hpY2ggbWVhbnMgdGhhdCBhbiBleHRlbmRlZAorICAgICAgY29wcm9jZXNzb3Igb3Bjb2RlIGNhbiBiZSBza2lwcGVkIHVzaW5nIHRoZSAnaScgcGxhY2UsIGlmIG5lZWRlZC4KKworICAgcyAgU3lzdGVtIENvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3Nvci4KKworICAgSiAgTWlzYyByZWdpc3RlciBmb3IgbW92ZWMgaW5zdHJ1Y3Rpb24sIHN0b3JlZCBpbiAnaicgZm9ybWF0LgorCVBvc3NpYmxlIHZhbHVlczoKKwkweDAwMAlTRkMJU291cmNlIEZ1bmN0aW9uIENvZGUgcmVnCVs2MCwgNDAsIDMwLCAyMCwgMTBdCisJMHgwMDEJREZDCURhdGEgRnVuY3Rpb24gQ29kZSByZWcJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCisJMHgwMDIJQ0FDUglDYWNoZSBDb250cm9sIFJlZ2lzdGVyCQlbNjAsIDQwLCAzMCwgMjBdCisJMHgwMDMJVEMJTU1VIFRyYW5zbGF0aW9uIENvbnRyb2wJCVs2MCwgNDBdCisJMHgwMDQJSVRUMAlJbnN0cnVjdGlvbiBUcmFuc3BhcmVudAorCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCisJMHgwMDUJSVRUMQlJbnN0cnVjdGlvbiBUcmFuc3BhcmVudAorCQkJCVRyYW5zbGF0aW9uIHJlZyAxCVs2MCwgNDBdCisJMHgwMDYJRFRUMAlEYXRhIFRyYW5zcGFyZW50CisJCQkJVHJhbnNsYXRpb24gcmVnIDAJWzYwLCA0MF0KKwkweDAwNwlEVFQxCURhdGEgVHJhbnNwYXJlbnQKKwkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQorCTB4MDA4CUJVU0NSCUJ1cyBDb250cm9sIFJlZ2lzdGVyCQlbNjBdCisJMHg4MDAJVVNQCVVzZXIgU3RhY2sgUG9pbnRlcgkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KKwkweDgwMQlWQlIJVmVjdG9yIEJhc2UgcmVnCQkJWzYwLCA0MCwgMzAsIDIwLCAxMF0KKwkweDgwMglDQUFSCUNhY2hlIEFkZHJlc3MgUmVnaXN0ZXIJCVsgICAgICAgIDMwLCAyMF0KKwkweDgwMwlNU1AJTWFzdGVyIFN0YWNrIFBvaW50ZXIJCVsgICAgNDAsIDMwLCAyMF0KKwkweDgwNAlJU1AJSW50ZXJydXB0IFN0YWNrIFBvaW50ZXIJCVsgICAgNDAsIDMwLCAyMF0KKwkweDgwNQlNTVVTUglNTVUgU3RhdHVzIHJlZwkJCVsgICAgNDBdCisJMHg4MDYJVVJQCVVzZXIgUm9vdCBQb2ludGVyCQlbNjAsIDQwXQorCTB4ODA3CVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KKwkweDgwOAlQQ1IJUHJvY2Vzc29yIENvbmZpZ3VyYXRpb24gcmVnCVs2MF0KKwkweEMwMAlST01CQVIJUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlcglbNTIwWF0KKwkweEMwNAlSQU1CQVIwCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KKwkweEMwNQlSQU1CQVIxCVJBTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMAlbNTIwWF0KKwkweEMwRglNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCisKKyAgICBMICBSZWdpc3RlciBsaXN0IG9mIHRoZSB0eXBlIGQwLWQ3L2EwLWE3IGV0Yy4KKyAgICAgICAoTmV3ISAgSW1wcm92ZWQhICBDYW4gYWxzbyBob2xkIGZwMC1mcDcsIGFzIHdlbGwhKQorICAgICAgIFRoZSBhc3NlbWJsZXIgdHJpZXMgdG8gc2VlIGlmIHRoZSByZWdpc3RlcnMgbWF0Y2ggdGhlIGluc24gYnkKKyAgICAgICBsb29raW5nIGF0IHdoZXJlIHRoZSBpbnNuIHdhbnRzIHRoZW0gc3RvcmVkLgorCisgICAgbCAgUmVnaXN0ZXIgbGlzdCBsaWtlIEwsIGJ1dCB3aXRoIGFsbCB0aGUgYml0cyByZXZlcnNlZC4KKyAgICAgICBVc2VkIGZvciBnb2luZyB0aGUgb3RoZXIgd2F5LiAuIC4KKworICAgIGMgIGNhY2hlIGlkZW50aWZpZXIgd2hpY2ggbWF5IGJlICJuYyIgZm9yIG5vIGNhY2hlLCAiaWMiCisgICAgICAgZm9yIGluc3RydWN0aW9uIGNhY2hlLCAiZGMiIGZvciBkYXRhIGNhY2hlLCBvciAiYmMiCisgICAgICAgZm9yIGJvdGggY2FjaGVzLiAgVXNlZCBpbiBjaW52IGFuZCBjcHVzaC4gIEFsd2F5cworICAgICAgIHN0b3JlZCBpbiBwb3NpdGlvbiAiZCIuCisKKyBUaGUgcmVtYWluZGVyIGFyZSBhbGwgc3RvcmVkIGFzIDYgYml0cyB1c2luZyBhbiBhZGRyZXNzIG1vZGUgYW5kIGEKKyByZWdpc3RlciBudW1iZXI7IHRoZXkgZGlmZmVyIGluIHdoaWNoIGFkZHJlc3NpbmcgbW9kZXMgdGhleSBtYXRjaC4KKworICAgKiAgYWxsCQkJCQkobW9kZXMgMC02LDcuMC00KQorICAgfiAgYWx0ZXJhYmxlIG1lbW9yeQkJCQkobW9kZXMgMi02LDcuMCw3LjEpCisgICAJCQkJCQkobm90IDAsMSw3LjItNCkKKyAgICUgIGFsdGVyYWJsZQkJCQkJKG1vZGVzIDAtNiw3LjAsNy4xKQorCQkJCQkJKG5vdCA3LjItNCkKKyAgIDsgIGRhdGEJCQkJCShtb2RlcyAwLDItNiw3LjAtNCkKKwkJCQkJCShub3QgMSkKKyAgIEAgIGRhdGEsIGJ1dCBub3QgaW1tZWRpYXRlCQkJKG1vZGVzIDAsMi02LDcuMC0zKQorCQkJCQkJKG5vdCAxLDcuNCkKKyAgICEgIGNvbnRyb2wJCQkJCShtb2RlcyAyLDUsNiw3LjAtMykKKwkJCQkJCShub3QgMCwxLDMsNCw3LjQpCisgICAmICBhbHRlcmFibGUgY29udHJvbAkJCQkobW9kZXMgMiw1LDYsNy4wLDcuMSkKKwkJCQkJCShub3QgMCwxLDcuMi00KQorICAgJCAgYWx0ZXJhYmxlIGRhdGEJCQkJKG1vZGVzIDAsMi02LDcuMCw3LjEpCisJCQkJCQkobm90IDEsNy4yLTQpCisgICA/ICBhbHRlcmFibGUgY29udHJvbCwgb3IgZGF0YSByZWdpc3RlcgkobW9kZXMgMCwyLDUsNiw3LjAsNy4xKQorCQkJCQkJKG5vdCAxLDMsNCw3LjItNCkKKyAgIC8gIGNvbnRyb2wsIG9yIGRhdGEgcmVnaXN0ZXIJCQkobW9kZXMgMCwyLDUsNiw3LjAtMykKKwkJCQkJCShub3QgMSwzLDQsNy40KQorICAgPiAgKnNhdmUgb3BlcmFuZHMJCQkJKG1vZGVzIDIsNCw1LDYsNy4wLDcuMSkKKwkJCQkJCShub3QgMCwxLDMsNy4yLTQpCisgICA8ICAqcmVzdG9yZSBvcGVyYW5kcwkJCQkobW9kZXMgMiwzLDUsNiw3LjAtMykKKwkJCQkJCShub3QgMCwxLDQsNy40KQorCisgICBjb2xkZmlyZSBtb3ZlIG9wZXJhbmRzOgorICAgbSAgCQkJCQkJKG1vZGVzIDAtNCkKKyAgIG4JCQkJCQkobW9kZXMgNSw3LjIpCisgICBvCQkJCQkJKG1vZGVzIDYsNy4wLDcuMSw3LjMsNy40KQorICAgcAkJCQkJCShtb2RlcyAwLTUpCisKKyAgIGNvbGRmaXJlIGJzZXQvYmNsci9idHN0L211bHNsL211bHVsIG9wZXJhbmRzOgorICAgcQkJCQkJCShtb2RlcyAwLDItNSkKKyAgIHYJCQkJCQkobW9kZXMgMCwyLTUsNy4wLDcuMSkKKyovCisKKy8qIEZvciB0aGUgNjg4NTE6ICovCisvKgorICAgSSBkaWRuJ3QgdXNlIG11Y2ggaW1hZ2luYXRpb24gaW4gY2hvb3NpbmcgdGhlIAorICAgZm9sbG93aW5nIGNvZGVzLCBzbyBtYW55IG9mIHRoZW0gYXJlbid0IHZlcnkKKyAgIG1uZW1vbmljLiAtcmFiCisKKyAgIDAgIDMyIGJpdCBwbW11IHJlZ2lzdGVyCisJUG9zc2libGUgdmFsdWVzOgorCTAwMAlUQwlUcmFuc2xhdGlvbiBDb250cm9sIFJlZ2lzdGVyICg2ODAzMCwgNjg4NTEpCisKKyAgIDEgIDE2IGJpdCBwbW11IHJlZ2lzdGVyCisJMTExCUFDCUFjY2VzcyBDb250cm9sICg2ODg1MSkKKworICAgMiAgOCBiaXQgcG1tdSByZWdpc3RlcgorCTEwMAlDQUwJQ3VycmVudCBBY2Nlc3MgTGV2ZWwgKDY4ODUxKQorCTEwMQlWQUwJVmFsaWRhdGUgQWNjZXNzIExldmVsICg2ODg1MSkKKwkxMTAJU0NDCVN0YWNrIENoYW5nZSBDb250cm9sICg2ODg1MSkKKworICAgMyAgNjgwMzAtb25seSBwbW11IHJlZ2lzdGVycyAoMzIgYml0KQorCTAxMAlUVDAJVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gcmVnIDAKKwkJCShha2EgQWNjZXNzIENvbnRyb2wgcmVnIDAgLS0gQUMwIC0tIG9uIDY4ZWMwMzApCisJMDExCVRUMQlUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiByZWcgMQorCQkJKGFrYSBBY2Nlc3MgQ29udHJvbCByZWcgMSAtLSBBQzEgLS0gb24gNjhlYzAzMCkKKworICAgVyAgd2lkZSBwbW11IHJlZ2lzdGVycworCVBvc3NpYmxlIHZhbHVlczoKKwkwMDEJRFJQCURtYSBSb290IFBvaW50ZXIgKDY4ODUxKQorCTAxMAlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIgKDY4MDMwLCA2ODg1MSkKKwkwMTEJQ1JQCUNwdSBSb290IFBvaW50ZXIgKDY4MDMwLCA2ODg1MSkKKworICAgZglmdW5jdGlvbiBjb2RlIHJlZ2lzdGVyICg2ODAzMCwgNjg4NTEpCisJMAlTRkMKKwkxCURGQworCisgICBWCVZBTCByZWdpc3RlciBvbmx5ICg2ODg1MSkKKworICAgWAlCQUR4LCBCQUN4ICgxNiBiaXQpCisJMTAwCUJBRAlCcmVha3BvaW50IEFja25vd2xlZGdlIERhdGEgKDY4ODUxKQorCTEwMQlCQUMJQnJlYWtwb2ludCBBY2tub3dsZWRnZSBDb250cm9sICg2ODg1MSkKKworICAgWQlQU1IgKDY4ODUxKSAoTU1VU1Igb24gNjgwMzApIChBQ1VTUiBvbiA2OGVjMDMwKQorICAgWglQQ1NSICg2ODg1MSkKKworICAgfAltZW1vcnkgCQkobW9kZXMgMi02LCA3LiopCisKKyAgIHQgIGFkZHJlc3MgdGVzdCBsZXZlbCAoNjgwMzAgb25seSkKKyAgICAgIFN0b3JlZCBhcyAzIGJpdHMsIHJhbmdlIDAtNy4KKyAgICAgIEFsc28gdXNlZCBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBub3cuCisKKyovCisKKy8qIFBsYWNlcyB0byBwdXQgYW4gb3BlcmFuZCwgZm9yIG5vbi1nZW5lcmFsIG9wZXJhbmRzOgorICAgcyAgc291cmNlLCBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLgorICAgZCAgZGVzdCwgc2hpZnRlZCA5IGluIGZpcnN0IHdvcmQKKyAgIDEgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDEyCisgICAyICBzZWNvbmQgd29yZCwgc2hpZnRlZCA2CisgICAzICBzZWNvbmQgd29yZCwgc2hpZnRlZCAwCisgICA0ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDEyCisgICA1ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDYKKyAgIDYgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgMAorICAgNyAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNworICAgOCAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMTAKKyAgIDkgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDUKKyAgIEQgIHN0b3JlIGluIGJvdGggcGxhY2UgMSBhbmQgcGxhY2UgMzsgZm9yIGRpdnVsIGFuZCBkaXZzbC4KKyAgIEIgIGZpcnN0IHdvcmQsIGxvdyBieXRlLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKKyAgIFcgIHNlY29uZCB3b3JkIChlbnRpcmUpLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKKyAgIEwgIHNlY29uZCBhbmQgdGhpcmQgd29yZHMgKGVudGlyZSksIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cworICAgICAgKGFsc28gb3ZlcmxvYWRlZCBmb3IgbW92ZTE2KQorICAgYiAgc2Vjb25kIHdvcmQsIGxvdyBieXRlCisgICB3ICBzZWNvbmQgd29yZCAoZW50aXJlKSBbdmFyaWFibGUgd29yZC9sb25nIGJyYW5jaCBvZmZzZXQgZm9yIGRicmFdCisgICBXICBzZWNvbmQgd29yZCAoZW50aXJlKSAobXVzdCBiZSBzaWduZWQgMTYgYml0IHZhbHVlKQorICAgbCAgc2Vjb25kIGFuZCB0aGlyZCB3b3JkIChlbnRpcmUpCisgICBnICB2YXJpYWJsZSBicmFuY2ggb2Zmc2V0IGZvciBicmEgYW5kIHNpbWlsYXIgaW5zdHJ1Y3Rpb25zLgorICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGRlcGVuZHMgb24gdGhlIG1hZ25pdHVkZSBvZiBvZmZzZXQuCisgICB0ICBzdG9yZSBpbiBib3RoIHBsYWNlIDcgYW5kIHBsYWNlIDg7IGZvciBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zCisgICBjICBicmFuY2ggb2Zmc2V0IGZvciBjcEJjYyBvcGVyYXRpb25zLgorICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGlzIHdvcmQgdHdvIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgemVybywKKyAgICAgIGFuZCB3b3JkcyB0d28gYW5kIHRocmVlIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgb25lLgorICAgaSAgSW5jcmVtZW50IGJ5IHR3bywgdG8gc2tpcCBvdmVyIGNvcHJvY2Vzc29yIGV4dGVuZGVkIG9wZXJhbmRzLiAgIE9ubHkKKyAgICAgIHdvcmtzIHdpdGggdGhlICdJJyBmb3JtYXQuCisgICBrICBEeW5hbWljIEstZmFjdG9yIGZpZWxkLiAgIEJpdHMgNi00IG9mIHdvcmQgMiwgdXNlZCBhcyBhIHJlZ2lzdGVyIG51bWJlci4KKyAgICAgIEFsc28gdXNlZCBmb3IgZHluYW1pYyBmbW92ZW0gaW5zdHJ1Y3Rpb24uCisgICBDICBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBjb25zdGFudCAtIDcgYml0cy4gIEFsc28gdXNlZCBmb3Igc3RhdGljCisgICAgICBLLWZhY3RvcnMuLi4KKyAgIGogIE1vdmVjIHJlZ2lzdGVyICMsIHN0b3JlZCBpbiAxMiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4KKworIFBsYWNlcyB0byBwdXQgb3BlcmFuZCwgZm9yIGdlbmVyYWwgb3BlcmFuZHM6CisgICBkICBkZXN0aW5hdGlvbiwgc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZAorICAgYiAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyBvbmUgYnl0ZQorICAgdyAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyB0d28gYnl0ZXMKKyAgIGwgIHNvdXJjZSwgYXQgbG93IGJpdCBvZiBmaXJzdCB3b3JkLCBhbmQgaW1tZWRpYXRlIHVzZXMgZm91ciBieXRlcworICAgcyAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQuCisgICAgICBVc2VkIHNvbWV0aW1lcyBpbiBjb250ZXh0cyB3aGVyZSBpbW1lZGlhdGUgaXMgbm90IGFsbG93ZWQgYW55d2F5LgorICAgZiAgc2luZ2xlIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgNCBieXRlcworICAgRiAgZG91YmxlIHByZWNpc2lvbiBmbG9hdCwgbG93IGJpdCBvZiAxc3Qgd29yZCwgaW1tZWRpYXRlIHVzZXMgOCBieXRlcworICAgeCAgZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyAxMiBieXRlcworICAgcCAgcGFja2VkIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyAxMiBieXRlcworKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSBtNjhrX29wY29kZXNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGVfYWxpYXMgbTY4a19vcGNvZGVfYWxpYXNlc1tdOworCitleHRlcm4gY29uc3QgaW50IG02OGtfbnVtb3Bjb2RlcywgbTY4a19udW1hbGlhc2VzOworCisvKiBlbmQgb2YgbTY4ay1vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbTg4ay5oIGIvaW5jbHVkZS9vcGNvZGUvbTg4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2ZhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9tODhrLmgKQEAgLTAsMCArMSw5MjMgQEAKKy8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBtb3Rvcm9sYSA4OGsgZmFtaWx5LgorICAgQ29weXJpZ2h0IDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICoJCQlEaXNhc3NlbWJsZXIgSW5zdHJ1Y3Rpb24gVGFibGUKKyAqCisgKglUaGUgZmlyc3QgZmllbGQgb2YgdGhlIHRhYmxlIGlzIHRoZSBvcGNvZGUgZmllbGQuIElmIGFuIG9wY29kZQorICoJaXMgc3BlY2lmaWVkIHdoaWNoIGhhcyBhbnkgbm9uLW9wY29kZSBiaXRzIG9uLCBhIHN5c3RlbSBlcnJvcgorICoJd2lsbCBvY2N1ciB3aGVuIHRoZSBzeXN0ZW0gYXR0ZW1wdHMgdGhlIGluc3RhbGwgaXQgaW50byB0aGUKKyAqCWluc3RydWN0aW9uIHRhYmxlLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZQorICoJaW5zdHJ1Y3Rpb24gbW5lbW9uaWMuIEVhY2ggb3BlcmFuZCBpcyBzcGVjaWZpZWQgYnkgb2Zmc2V0LCB3aWR0aCwKKyAqCWFuZCB0eXBlLiBUaGUgb2Zmc2V0IGlzIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudAorICoJYml0IG9mIHRoZSBvcGVyYW5kIHdpdGggYml0IDAgYmVpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZgorICoJdGhlIGluc3RydWN0aW9uLiBUaGUgd2lkdGggaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeQorICoJdGhlIG9wZXJhbmQuIFRoZSB0eXBlIHNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorICoJdGhlIG9wZXJhbmQuIFRoZSB2YWxpZCBmb3JtYXRzIGFyZTogcmVnaXN0ZXIsIHJlZ2lzdGVyIGluZGlyZWN0LAorICoJaGV4IGNvbnN0YW50LCBhbmQgYml0IGZpZWxkIHNwZWNpZmljYXRpb24uICBUaGUgbGFzdCBmaWVsZCBpcyBhCisgKglwb2ludGVyIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBsaW5rZWQgbGlzdC4gIFRoZXNlIHBvaW50ZXJzCisgKglhcmUgaW5pdGlhbGl6ZWQgYnkgaW5pdF9kaXNhc20oKS4KKyAqCisgKgkJCQlTdHJ1Y3R1cmUgRm9ybWF0CisgKgorICogICAgICAgc3RydWN0IElOU1RBQiB7CisgKiAgICAgICAgICBVUElOVCBvcGNvZGU7CisgKiAgICAgICAgICBjaGFyICptbmVtb25pYzsKKyAqICAgICAgICAgIHN0cnVjdCBPUFNQRUMgb3AxLG9wMixvcDM7CisgKiAgICAgICAgICBzdHJ1Y3QgU0lNX0ZMQUdTIGZsZ3M7CisgKiAgICAgICAgICBzdHJ1Y3QgSU5TVEFCICpuZXh0OworICogICAgICAgfQorICoKKyAqICAgICAgIHN0cnVjdCBPUFNQRUMgeworICogICAgICAgICAgVVBJTlQgb2Zmc2V0OjU7CisgKiAgICAgICAgICBVUElOVCB3aWR0aDo2OworICogICAgICAgICAgVVBJTlQgdHlwZTo1OworICogICAgICAgfQorICoKKyAqCQkJCVJldmlzaW9uIEhpc3RvcnkKKyAqCisgKglSZXZpc2lvbiAxLjAJMTEvMDgvODUJQ3JlYXRpb24gZGF0ZQorICoJCSAxLjEJMDIvMDUvODYJVXBkYXRlZCBpbnN0cnVjdGlvbiBtbmVtb25pYyB0YWJsZSBNRAorICoJCSAxLjIJMDYvMTYvODYJVXBkYXRlZCBTSU1fRkxBR1MgZm9yIGZsb2F0aW5nIHBvaW50CisgKgkJIDEuMwkwOS8yMC84NglVcGRhdGVkIGZvciBuZXcgZW5jb2RpbmcKKyAqCQkgCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCBmcm9tIE1vdG9yb2xhIGRpc2Fzc2VtYmxlcgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBuZWVkZWQgdG8gYnVpbGQgdGhlIE04ODAwMAorICogc2ltdWxhdG9yLiAgSXQgaXMgdGhlIG1haW4gaW5jbHVkZSBmaWxlLCBjb250YWluaW5nIGFsbCB0aGUKKyAqIHN0cnVjdHVyZXMsIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZXhjZXB0IGZvciB0aGUgZmxvYXRpbmcgcG9pbnQKKyAqIGluc3RydWN0aW9uIHNldC4KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBmbGFnIGluZm9ybXMgdGhlIFNpbXVsYXRvciBhcyB0byB3aGF0IHR5cGUgb2YgYnl0ZSBvcmRlcmluZworICogd2lsbCBiZSB1c2VkLiBGb3IgaW5zdGFuY2UsIGEgQk9GTEFHID0gMSBpbmRpY2F0ZXMgYSBERUMgVkFYIGFuZCBJQk0gdHlwZQorICogb2Ygb3JkZXJpbmcgc2hhbGwgYmUgdXNlZC4KKyovCisKKy8qICMgZGVmaW5lICAgICBCT0ZMQUcgICAxICovICAgICAgICAgICAgICAgICAgICAgICAvKiBCWVRFIE9SREVSSU5HIEZMQUcgKi8KKworLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgcHJpbWFyeSBvcGNvZGUgZmllbGQgb2YgdGhlIGluc3RydWN0aW9uLAorICogdGhlIGRlc3RpbmF0aW9uIGZpZWxkLCB0aGUgc291cmNlIDEgYW5kIHNvdXJjZSAyIGZpZWxkcy4KKyAqLworIyBkZWZpbmUgICAgT1AgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygb3Bjb2RlIGZpZWxkICovCisjIGRlZmluZSAgICBERVNUICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBkZXN0aW5hdGlvbiAgKi8KKyMgZGVmaW5lICAgIFNPVVJDRTEgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHNvdXJjZTEgICAgICAqLworIyBkZWZpbmUgICAgU09VUkNFMiAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMiAgICAgICovCisKKyMgZGVmaW5lICAgIFJFR3MgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICAqLworCisjIGRlZmluZSAgICBXT1JEICAgIGxvbmcKKyMgZGVmaW5lICAgIEZMQUcgICAgdW5zaWduZWQKKyMgZGVmaW5lICAgIFNUQVRFICAgc2hvcnQKKworIyBkZWZpbmUgICAgVFJVRSAgICAgMQorIyBkZWZpbmUgICAgRkFMU0UgICAgMAorCisjIGRlZmluZSAgICBSRUFEICAgICAwCisjIGRlZmluZSAgICBXUklURSAgICAxCisKKy8qIFRoZSBuZXh0IGZvdXIgZXF1YXRlcyBkZWZpbmUgdGhlIHByaW9yaXRpZXMgdGhhdCB0aGUgdmFyaW91cyBjbGFzc2VzCisgKiBvZiBpbnN0cnVjdGlvbnMgaGF2ZSByZWdhcmRpbmcgd3JpdGluZyByZXN1bHRzIGJhY2sgaW50byByZWdpc3RlcnMgYW5kCisgKiBzaWduYWxsaW5nIGV4Y2VwdGlvbnMuCisgKi8KKy8qIFBNRU0gaXMgYWxzbyBkZWZpbmVkIGluIDxzeXMvcGFyYW0uaD4gb24gRGVsdGEgODgncy4gIFNpZ2ghICAqLworI3VuZGVmIFBNRU0KKworIyBkZWZpbmUgICAgUElOVCAgMCAgIC8qIEludGVnZXIgUHJpb3JpdHkgKi8KKyMgZGVmaW5lICAgIFBGTFQgIDEgICAvKiBGbG9hdGluZyBQb2ludCBQcmlvcml0eSAqLworIyBkZWZpbmUgICAgUE1FTSAgMiAgIC8qIE1lbW9yeSBQcmlvcml0eSAqLworIyBkZWZpbmUgICAgTkEgICAgMyAgIC8qIE5vdCBBcHBsaWNhYmxlLCBpbnN0cnVjdGlvbiBkb2VzbnQgd3JpdGUgdG8gcmVncyAqLworIyBkZWZpbmUgICAgSElQUkkgMyAgIC8qIGhpZ2hlc3Qgb2YgdGhlc2UgcHJpb3JpdGllcyAqLworCisvKiBUaGUgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXJzIGFyZSBhbiBhcnRpZmljaWFsIG1lY2hhbmlzbSB0byBzcGVlZCB1cAorICogc2ltdWxhdG9yIGV4ZWN1dGlvbi4gIEluIHRoZSByZWFsIHByb2Nlc3NvciwgYW4gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIKKyAqIGlzIDMyIGJpdHMgd2lkZS4gIEluIHRoZSBzaW11bGF0b3IsIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gaXMga2VwdCBpbgorICogYSBzdHJ1Y3R1cmUgZmllbGQgY2FsbGVkIHJhd29wLCBhbmQgdGhlIGluc3RydWN0aW9uIGlzIHBhcnRpYWxseSBkZWNvZGVkLAorICogYW5kIHNwbGl0IGludG8gdmFyaW91cyBmaWVsZHMgYW5kIGZsYWdzIHdoaWNoIG1ha2UgdXAgdGhlIG90aGVyIGZpZWxkcworICogb2YgdGhlIHN0cnVjdHVyZS4KKyAqIFRoZSBwYXJ0aWFsIGRlY29kZSBpcyBkb25lIHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgaW5pdGlhbGx5IGxvYWRlZAorICogaW50byBzaW11bGF0b3IgbWVtb3J5LiAgVGhlIHNpbXVsYXRvciBjb2RlIG1lbW9yeSBpcyBub3QgYW4gYXJyYXkgb2YKKyAqIDMyIGJpdCB3b3JkcywgYnV0IGlzIGFuIGFycmF5IG9mIGluc3RydWN0aW9uIHJlZ2lzdGVyIHN0cnVjdHVyZXMuCisgKiBZZXMgdGhpcyB3YXN0ZXMgbWVtb3J5LCBidXQgaXQgZXhlY3V0ZXMgbXVjaCBxdWlja2VyLgorICovCisKK3N0cnVjdCBJUl9GSUVMRFMgeworCQkgICAgdW5zaWduZWQgICAgICAgIG9wOk9QLAorCQkJCSAgICBkZXN0OiBERVNULAorCQkJCSAgICBzcmMxOiBTT1VSQ0UxLAorCQkJCSAgICBzcmMyOiBTT1VSQ0UyOworCQkJICAgICAgaW50ICAgbHRuY3ksCisJCQkJICAgIGV4dGltZSwKKwkJCQkgICAgd2JfcHJpOyAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5ICAgICAqLworCQkgICAgdW5zaWduZWQgICAgICAgIGltbV9mbGFnczoyLC8qIGltbWVkaWF0ZSBzaXplICAgICAgICAgKi8KKwkJCQkgICAgcnMxX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLworCQkJCSAgICByczJfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCisJCQkJICAgIHJzZF91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZS9kZXN0LiB1c2VkICovCisJCQkJICAgIGNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgICAgICAqLworCQkJCSAgICB1X2ZsYWc6MSwgICAvKiB1cHBlciBoYWxmIHdvcmQgKi8KKwkJCQkgICAgbl9mbGFnOjEsICAgLyogZXhlY3V0ZSBuZXh0ICAgICovCisJCQkJICAgIHdiX2ZsYWc6MSwgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KKwkJCQkgICAgZGVzdF82NDoxLCAgLyogZGVzdCBzaXplICAgICAgICovCisJCQkJICAgIHMxXzY0OjEsICAgIC8qIHNvdXJjZSAxIHNpemUgICAqLworCQkJCSAgICBzMl82NDoxLCAgICAvKiBzb3VyY2UgMiBzaXplICAgKi8KKwkJCQkgICAgc2NhbGVfZmxhZzoxLCAvKiBzY2FsZWQgcmVnaXN0ZXIgKi8KKwkJCQkgICAgYnJrX2ZsZzoxOworICAgICAgICAgICAgICAgICB9OworCitzdHJ1Y3QJbWVtX3NlZ3MgeworCXN0cnVjdCBtZW1fd3JkICpzZWc7CQkJLyogcG9pbnRlciAocmV0dXJuZWQgYnkgY2FsbG9jKSB0byBzZWdtZW50ICovCisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsJCQkvKiBiYXNlIGxvYWQgYWRkcmVzcyBmcm9tIGZpbGUgaGVhZGVycyAqLworCXVuc2lnbmVkIGxvbmcgZW5kYWRkcjsJCQkvKiBFbmRpbmcgYWRkcmVzcyBvZiBzZWdtZW50ICovCisJaW50CSAgICAgIGZsYWdzOwkJCS8qIHNlZ21lbnQgY29udHJvbCBmbGFncyAobm9uZSBkZWZpbmVkIDEyLzUvODYpICovCit9OworCisjZGVmaW5lCU1BWFNFR1MJCSgxMCkJCQkvKiBtYXggbnVtYmVyIG9mIHNlZ21lbnQgYWxsb3dlZCAqLworI2RlZmluZQlNRU1TRUdTSVpFCShzaXplb2Yoc3RydWN0IG1lbV9zZWdzKSkvKiBzaXplIG9mIG1lbV9zZWdzIHN0cnVjdHVyZSAqLworCisKKyNkZWZpbmUgQlJLX1JECQkoMHgwMSkJCQkvKiBicmVhayBvbiBtZW1vcnkgcmVhZCAqLworI2RlZmluZSBCUktfV1IJCSgweDAyKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSB3cml0ZSAqLworI2RlZmluZSBCUktfRVhFQwkoMHgwNCkJCQkvKiBicmVhayBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUJQlJLX0NOVAkJKDB4MDgpCQkJLyogYnJlYWsgb24gdGVybWluYWwgY291bnQgKi8KKworCitzdHJ1Y3QJbWVtX3dyZCB7CisJc3RydWN0IElSX0ZJRUxEUyBvcGNvZGU7CQkvKiBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24gYnJlYWsgZG93biAqLworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyAgbDsJCS8qIG1lbW9yeSBlbGVtZW50IGJyZWFrIGRvd24gKi8KKwkJdW5zaWduZWQgc2hvcnQgc1syXTsKKwkJdW5zaWduZWQgY2hhciAgY1s0XTsKKwl9IG1lbTsKK307CisKKyNkZWZpbmUJTUVNV1JEU0laRQkoc2l6ZW9mKHN0cnVjdCBtZW1fd3JkKSkJLyogc2l6ZSBvZiBlYWNoIDMyIGJpdCBtZW1vcnkgbW9kZWwgKi8KKworLyogRXh0ZXJuYWwgZGVjbGFyYXRpb25zICovCisKK2V4dGVybglzdHJ1Y3QgbWVtX3NlZ3MgbWVtb3J5W107CitleHRlcm4Jc3RydWN0IFBST0NFU1NPUiBtNzgwMDA7CisKK3N0cnVjdCAgUFJPQ0VTU09SICAgeworCSAgICAgdW5zaWduZWQgV09SRAorCQkJICAgIGlwLCAgICAgICAgICAvKiBleGVjdXRlIGluc3RydWN0aW9uIHBvaW50ZXIgKi8KKwkJCSAgICB2YnIsICAgICAgICAgLyogdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKi8KKwkJCSAgICBwc3I7ICAgICAgICAgLyogcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAqLworCisJCSAgICBXT1JEICAgIFMxYnVzLCAvKiBzb3VyY2UgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMyYnVzLCAvKiBzb3VyY2UgMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERidXMsICAvKiBkZXN0aW5hdGlvbiAqLworCQkJICAgIERBYnVzLCAvKiBkYXRhIGFkZHJlc3MgYnVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxVLAorCQkJICAgIFJlZ3NbUkVHc10sICAgICAgIC8qIGRhdGEgcmVnaXN0ZXJzICovCisJCQkgICAgdGltZV9sZWZ0W1JFR3NdLCAgLyogbWF4IGNsb2NrcyBiZWZvcmUgcmVnIGlzIGF2YWlsYWJsZSAqLworCQkJICAgIHdiX3ByaVtSRUdzXSwgICAgIC8qIHdyaXRlYmFjayBwcmlvcml0eSBvZiByZWcgKi8KKwkJCSAgICBTRlUwX3JlZ3NbUkVHc10sICAvKiBpbnRlZ2VyIHVuaXQgY29udHJvbCByZWdzICovCisJCQkgICAgU0ZVMV9yZWdzW1JFR3NdLCAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdzICovCisJCQkgICAgU2NvcmVib2FyZFtSRUdzXSwKKwkJCSAgICBWYnI7CisJICAgIHVuc2lnbmVkIFdPUkQgICBzY29yZWJvYXJkLAorCQkJICAgIFBzdywKKwkJCSAgICBUcHN3OworCQkgICAgRkxBRyAgIGp1bXBfcGVuZGluZzoxOyAgIC8qIHdhaXRpbmcgZm9yIGEganVtcCBpbnN0ci4gKi8KKyAgICAgICAgICAgICAgICAgICAgfTsKKworIyBkZWZpbmUgICAgaTI2Yml0ICAgICAgMSAgICAvKiBzaXplIG9mIGltbWVkaWF0ZSBmaWVsZCAqLworIyBkZWZpbmUgICAgaTE2Yml0ICAgICAgMgorIyBkZWZpbmUgICAgaTEwYml0ICAgICAgMworCisvKiBEZWZpbml0aW9ucyBmb3IgZmllbGRzIGluIHBzciAqLworCisjIGRlZmluZSBtb2RlICAzMQorIyBkZWZpbmUgcmJvICAgMzAKKyMgZGVmaW5lIHNlciAgIDI5CisjIGRlZmluZSBjYXJyeSAyOAorIyBkZWZpbmUgc2Y3bSAgMTEKKyMgZGVmaW5lIHNmNm0gIDEwCisjIGRlZmluZSBzZjVtICAgOQorIyBkZWZpbmUgc2Y0bSAgIDgKKyMgZGVmaW5lIHNmM20gICA3CisjIGRlZmluZSBzZjJtICAgNgorIyBkZWZpbmUgc2YxbSAgIDUKKyMgZGVmaW5lIG1hbSAgICA0CisjIGRlZmluZSBpbm0gICAgMworIyBkZWZpbmUgZXhtICAgIDIKKyMgZGVmaW5lIHRybSAgICAxCisjIGRlZmluZSBvdmZtICAgMAorCisjZGVmaW5lCSAgICBNT0RFTUFTSyAgICgxPDwobW9kZS0xKSkKKyMgZGVmaW5lICAgIFNJTEVOVCAgICAgMCAgIC8qIHNpbXVsYXRlIHdpdGhvdXQgb3V0cHV0IHRvIGNydCAqLworIyBkZWZpbmUgICAgVkVSQk9TRSAgICAxICAgLyogc2ltdWxhdGUgaW4gdmVyYm9zZSBtb2RlICovCisjIGRlZmluZSAgICBQUl9JTlNUUiAgIDIgICAvKiBvbmx5IHByaW50IGluc3RydWN0aW9ucyAqLworCisjIGRlZmluZSAgICBSRVNFVCAgICAgIDE2IC8qIHJlc2V0IHBoYXNlICovCisKKyMgZGVmaW5lICAgIFBIQVNFMSAgICAgMCAgLyogZGF0YSBwYXRoIHBoYXNlcyAqLworIyBkZWZpbmUgICAgUEhBU0UyICAgICAxCisKKy8qIHRoZSAxIGNsb2NrIG9wZXJhdGlvbnMgKi8KKworIyBkZWZpbmUgICAgQUREVSAgICAgICAgMQorIyBkZWZpbmUgICAgQUREQyAgICAgICAgMgorIyBkZWZpbmUgICAgQUREVUMgICAgICAgMworIyBkZWZpbmUgICAgQUREICAgICAgICAgNAorCisjIGRlZmluZSAgICBTVUJVICAgIEFERCsxCisjIGRlZmluZSAgICBTVUJCICAgIEFERCsyCisjIGRlZmluZSAgICBTVUJVQiAgIEFERCszCisjIGRlZmluZSAgICBTVUIgICAgIEFERCs0CisKKyMgZGVmaW5lICAgIEFORF8gICAgQUREKzUKKyMgZGVmaW5lICAgIE9SICAgICAgQUREKzYKKyMgZGVmaW5lICAgIFhPUiAgICAgQUREKzcKKyMgZGVmaW5lICAgIENNUCAgICAgQUREKzgKKworLyogdGhlIExPQURTICovCisKKyMgZGVmaW5lICAgIExEQUIgICAgQ01QKzEKKyMgZGVmaW5lICAgIExEQUggICAgQ01QKzIKKyMgZGVmaW5lICAgIExEQSAgICAgQ01QKzMKKyMgZGVmaW5lICAgIExEQUQgICAgQ01QKzQKKworIyBkZWZpbmUgICAgTERCICAgTERBRCsxCisjIGRlZmluZSAgICBMREggICBMREFEKzIKKyMgZGVmaW5lICAgIExEICAgIExEQUQrMworIyBkZWZpbmUgICAgTEREICAgTERBRCs0CisjIGRlZmluZSAgICBMREJVICBMREFEKzUKKyMgZGVmaW5lICAgIExESFUgIExEQUQrNgorCisvKiB0aGUgU1RPUkVTICovCisKKyMgZGVmaW5lICAgIFNUQiAgICBMREhVKzEKKyMgZGVmaW5lICAgIFNUSCAgICBMREhVKzIKKyMgZGVmaW5lICAgIFNUICAgICBMREhVKzMKKyMgZGVmaW5lICAgIFNURCAgICBMREhVKzQKKworLyogdGhlIGV4Y2hhbmdlICovCisKKyMgZGVmaW5lICAgIFhNRU1CVSBMREhVKzUKKyMgZGVmaW5lICAgIFhNRU0gICBMREhVKzYKKworLyogdGhlIGJyYW5jaGVzICovCisjIGRlZmluZSAgICBKU1IgICAgU1REKzEKKyMgZGVmaW5lICAgIEJTUiAgICBTVEQrMgorIyBkZWZpbmUgICAgQlIgICAgIFNURCszCisjIGRlZmluZSAgICBKTVAgICAgU1REKzQKKyMgZGVmaW5lICAgIEJCMSAgICBTVEQrNQorIyBkZWZpbmUgICAgQkIwICAgIFNURCs2CisjIGRlZmluZSAgICBSVE4gICAgU1REKzcKKyMgZGVmaW5lICAgIEJDTkQgICBTVEQrOAorCisvKiB0aGUgVFJBUFMgKi8KKyMgZGVmaW5lICAgIFRCMSAgICBCQ05EKzEKKyMgZGVmaW5lICAgIFRCMCAgICBCQ05EKzIKKyMgZGVmaW5lICAgIFRDTkQgICBCQ05EKzMKKyMgZGVmaW5lICAgIFJURSAgICBCQ05EKzQKKyMgZGVmaW5lICAgIFRCTkQgICBCQ05EKzUKKworLyogdGhlIE1JU0MgaW5zdHJ1Y3Rpb25zICovCisjIGRlZmluZSAgICBNVUwgICAgIFRCTkQgKyAxCisjIGRlZmluZSAgICBESVYgICAgIE1VTCAgKzIKKyMgZGVmaW5lICAgIERJVlUgICAgTVVMICArMworIyBkZWZpbmUgICAgTUFTSyAgICBNVUwgICs0CisjIGRlZmluZSAgICBGRjAgICAgIE1VTCAgKzUKKyMgZGVmaW5lICAgIEZGMSAgICAgTVVMICArNgorIyBkZWZpbmUgICAgQ0xSICAgICBNVUwgICs3CisjIGRlZmluZSAgICBTRVQgICAgIE1VTCAgKzgKKyMgZGVmaW5lICAgIEVYVCAgICAgTVVMICArOQorIyBkZWZpbmUgICAgRVhUVSAgICBNVUwgICsxMAorIyBkZWZpbmUgICAgTUFLICAgICBNVUwgICsxMQorIyBkZWZpbmUgICAgUk9UICAgICBNVUwgICsxMgorCisvKiBjb250cm9sIHJlZ2lzdGVyIG1hbmlwdWxhdGlvbnMgKi8KKworIyBkZWZpbmUgICAgTERDUiAgICBST1QgICsxCisjIGRlZmluZSAgICBTVENSICAgIFJPVCAgKzIKKyMgZGVmaW5lICAgIFhDUiAgICAgUk9UICArMworCisjIGRlZmluZSAgICBGTERDUiAgICBST1QgICs0CisjIGRlZmluZSAgICBGU1RDUiAgICBST1QgICs1CisjIGRlZmluZSAgICBGWENSICAgICBST1QgICs2CisKKworIyBkZWZpbmUgICAgTk9QICAgICBYQ1IgKzEKKworLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCisKKyMgZGVmaW5lICAgIEZBREQgICAgTk9QICsxCisjIGRlZmluZSAgICBGU1VCICAgIE5PUCArMgorIyBkZWZpbmUgICAgRk1VTCAgICBOT1AgKzMKKyMgZGVmaW5lICAgIEZESVYgICAgTk9QICs0CisjIGRlZmluZSAgICBGU1FSVCAgIE5PUCArNQorIyBkZWZpbmUgICAgRkNNUCAgICBOT1AgKzYKKyMgZGVmaW5lICAgIEZJUCAgICAgTk9QICs3CisjIGRlZmluZSAgICBGTFQgICAgIE5PUCArOAorIyBkZWZpbmUgICAgSU5UICAgICBOT1AgKzkKKyMgZGVmaW5lICAgIE5JTlQgICAgTk9QICsxMAorIyBkZWZpbmUgICAgVFJOQyAgICBOT1AgKzExCisjIGRlZmluZSAgICBGTERDICAgTk9QICsxMgorIyBkZWZpbmUgICAgRlNUQyAgIE5PUCArMTMKKyMgZGVmaW5lICAgIEZYQyAgICBOT1AgKzE0CisKKyMgZGVmaW5lIFVFWFQoc3JjLG9mZix3aWQpICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpPj4ob2ZmKSkgJiAoKDE8PCh3aWQpKSAtIDEpKQorIyBkZWZpbmUgU0VYVChzcmMsb2ZmLHdpZCkgKCgoKChpbnQpKHNyYykpPDwoMzItKChvZmYpKyh3aWQpKSkpID4+KDMyLSh3aWQpKSkgKQorIyBkZWZpbmUgTUFLRShzcmMsb2ZmLHdpZCkgXAorICAoKCgodW5zaWduZWQgaW50KShzcmMpKSAmICgoMTw8KHdpZCkpIC0gMSkpIDw8IChvZmYpKQorCisjIGRlZmluZSBvcHdvcmQobikgKHVuc2lnbmVkIGxvbmcpIChtZW1hZGRyLT5tZW0ubCkKKworLyogIENvbnN0YW50cyBhbmQgTWFza3MgKi8KKworI2RlZmluZSBTRlUwICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgU0ZVMSAgICAgICAweDg0MDAwMDAwCisjZGVmaW5lIFNGVTcgICAgICAgMHg5YzAwMDAwMAorI2RlZmluZSBSUkkxMCAgICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgUlJSICAgICAgICAweGY0MDAwMDAwCisjZGVmaW5lIFNGVU1BU0sgICAgMHhmYzAwZmZlMAorI2RlZmluZSBSUlJNQVNLICAgIDB4ZmMwMGZmZTAKKyNkZWZpbmUgUlJJMTBNQVNLICAweGZjMDBmYzAwCisjZGVmaW5lIERFRk1BU0sgICAgMHhmYzAwMDAwMAorI2RlZmluZSBDVFJMICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgQ1RSTE1BU0sgICAweGZjMDBmODAwCisKKy8qIE9wZXJhbmRzIHR5cGVzICovCisKK2VudW0gb3BlcmFuZF90eXBlIHsKKyAgSEVYID0gMSwKKyAgUkVHID0gMiwKKyAgQ09OVCA9IDMsCisgIElORCA9IDMsCisgIEJGID0gNCwKKyAgUkVHU0MgPSA1ICAgIC8qIHNjYWxlZCByZWdpc3RlciAqLywKKyAgQ1JSRUcgPSA2ICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8sCisgIEZDUlJFRyA9IDcgICAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLywKKyAgUENSRUwgPSA4LAorICBDT05ETUFTSyA9IDksCisgIFhSRUcgPSAxMCwgLyogZXh0ZW5kZWQgcmVnaXN0ZXIgKi8KKyAgREVDID0gMTEsIC8qIGRlY2ltYWwgKi8KK307CisKKy8qIEhhc2hpbmcgU3BlY2lmaWNhdGlvbiAqLworCisjZGVmaW5lIEhBU0hWQUwgICAgIDc5CisKKy8qIFR5cGUgZGVmaW5pdGlvbnMgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKKworLyogU3RydWN0dXJlIHRlbXBsYXRlcyAqLworCisjaWYgbmV2ZXIKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVuc2lnbmVkIGludCBvZmZzZXQ6NTsKKyAgIHVuc2lnbmVkIGludCB3aWR0aDo2OworICAgdW5zaWduZWQgaW50IHR5cGU6NTsKK30gT1BTUEVDOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICB1bnNpZ25lZCBpbnQgd2lkdGg7CisgICBlbnVtIG9wZXJhbmRfdHlwZSB0eXBlOworfSBPUFNQRUM7CisKKwlzdHJ1Y3QgU0lNX0ZMQUdTIHsKKwkgICAgICBpbnQgIGx0bmN5LCAgIC8qIGxhdGVuY3kgKG1heCBudW1iZXIgb2YgY2xvY2tzIG5lZWRlZCB0byBleGVjdXRlKSAqLworCQkgIGV4dGltZSwgICAvKiBleGVjdXRpb24gdGltZSAobWluIG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCisJCSAgd2JfcHJpOyAgIC8qIHdyaXRlYmFjayBzbG90IHByaW9yaXR5ICovCisgICB1bnNpZ25lZCAgICAgICAgIG9wOk9QLCAgIC8qIHNpbXVsYXRvciB2ZXJzaW9uIG9mIG9wY29kZSAqLworCSAgICAgaW1tX2ZsYWdzOjIsICAgLyogMTAsMTYgb3IgMjYgYml0IGltbWVkaWF0ZSBmbGFncyAqLworCSAgICAgIHJzMV91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLworCSAgICAgIHJzMl91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDIgdXNlZCAqLworCSAgICAgIHJzZF91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QgdXNlZCAqLworCQljX2ZsYWc6MSwgICAvKiBjb21wbGVtZW50ICovCisJCXVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLworCQluX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgKi8KKwkgICAgICAgd2JfZmxhZzoxLCAgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KKwkgICAgICAgZGVzdF82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gZGVzdCAqLworCQkgczFfNjQ6MSwgICAvKiBkb3VibGUgcHJlY2lzaW9uIHNvdXJjZSAxICovCisJCSBzMl82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDIgKi8KKwkgICAgc2NhbGVfZmxhZzoxOyAgIC8qIHJlZ2lzdGVyIGlzIHNjYWxlZCAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSU5TVFJVQ1RBQiB7CisgICB1bnNpZ25lZCBpbnQgIG9wY29kZTsKKyAgIGNoYXIgICAgICAgICAgKm1uZW1vbmljOworICAgT1BTUEVDICAgICAgICBvcDEsb3AyLG9wMzsKKyAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKKyAgIHN0cnVjdCBJTlNUUlVDVEFCICAgICpuZXh0OworfSBJTlNUQUI7CisMCisKKyNkZWZpbmUgTk9fT1BFUkFORCB7MCwwLDB9CisKKy8qIE9wY29kZSAgICAgTW5lbW9uaWMgICAgICAgT3AgMSBTcGVjICAgICBPcCAyIFNwZWMgICAgT3AgMyBTcGVjICAgICAgICAgU2ltZmxhZ3MgICAgICAgICAgICAgTmV4dCAgKi8KKworc3RhdGljIElOU1RBQiAgaW5zdHJ1Y3Rpb25zW10gPSB7CisgIHsweGY0MDBjODAwLCJqc3IgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDBjYzAwLCJqc3IubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDBjMDAwLCJqbXAgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDBjNDAwLCJqbXAubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGM4MDAwMDAwLCJic3IgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGNjMDAwMDAwLCJic3IubiAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGMwMDAwMDAwLCJiciAgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGM0MDAwMDAwLCJici5uICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGQwMDAwMDAwLCJiYjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGQ0MDAwMDAwLCJiYjAubiAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGQ4MDAwMDAwLCJiYjEgICAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGRjMDAwMDAwLCJiYjEubiAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDBkMDAwLCJ0YjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIwICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDBkODAwLCJ0YjEgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIxICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGU4MDAwMDAwLCJiY25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MiwyLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGVjMDAwMDAwLCJiY25kLm4gICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MSwxLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDBlODAwLCJ0Y25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDEwLEhFWH0sIHsyLDIsTkEsVENORCwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY4MDAwMDAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCwxNixIRVh9ICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgIGkxMGJpdCwxLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDBmODAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgICAgICAgMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDBmYzAwLCJydGUgICAgICAgICAiLE5PX09QRVJBTkQgICAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsUlRFICwgICAgICAgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDFjMDAwMDAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREIgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxYzAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREIgICAgICwgICAgMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDBjMDAwMDAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAwYzAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREJVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDE4MDAwMDAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREggICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxODAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxYTAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCisgIHsweDA4MDAwMDAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREhVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAwODAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAwYTAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCisgIHsweDE0MDAwMDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMRCAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxNDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxNjAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCisgIHsweDEwMDAwMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREQgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxMjAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCisgIHsweGY0MDAxNTAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAxNzAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCisgIHsweDJjMDAwMDAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RCICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAyYzAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RCICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDI4MDAwMDAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RIICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAyODAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAyYTAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCisgIHsweDI0MDAwMDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1QgICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAyNDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDI2MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAorICB7MHgyMDAwMDAwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNURCAgICAgICxpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDAyMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1REICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDIyMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAorICB7MHhmNDAwMjUwMCwic3QudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDAyNzAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKKy8qICBtODgxMDAgb25seToKKyAgezB4MDAwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU1CVSAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICovCisgIHsweGY0MDAwMDAwLCJ4bWVtLmJ1ICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKy8qICBtODgxMDAgb25seToKKyAgezB4MDQwMDAwMDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU0gICAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICovCisgIHsweGY0MDAwNDAwLCJ4bWVtICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDA2MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAorICB7MHhmNDAwMDUwMCwieG1lbS51c3IgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDAwNzAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKKy8qIG04ODEwMCBvbmx5OgorICB7MHhmNDAwM2UwMCwibGRhLmIgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCisgKi8KKyAgezB4ZjQwMDNlMDAsImxkYS54ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUgsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAorICB7MHhmNDAwM2EwMCwibGRhLmggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCisgIHsweGY0MDAzNjAwLCJsZGEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREEgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDMyMDAsImxkYS5kICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUQsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAorCisgIHsweDgwMDA0MDAwLCJsZGNyICAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LENSUkVHfSAgLE5PX09QRVJBTkQgICAgLHsxLDEsUElOVCxMRENSLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODAwMDgwMDAsInN0Y3IgICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULFNUQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4MDAwYzAwMCwieGNyICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LENSUkVHfSx7MSwxLFBJTlQsWENSLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisKKyAgezB4ZjQwMDYwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNjIwMCwiYWRkdS5jaSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA2MTAwLCJhZGR1LmNvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDYzMDAsImFkZHUuY2lvICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNjQwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA2NjAwLCJzdWJ1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDY1MDAsInN1YnUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNjcwMCwic3VidS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA2ODAwLCJkaXZ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszMiwzMixQSU5ULERJVlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNjkwMCwiZGl2dS5kICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9LCBOVUxMIH0sCisgIHsweGY0MDA2ZTAwLCJtdWxzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKKyAgezB4ZjQwMDZjMDAsIm11bHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsNCxQSU5ULE1VTCwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNzAwMCwiYWRkICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA3MjAwLCJhZGQuY2kgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDcxMDAsImFkZC5jbyAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNzMwMCwiYWRkLmNpbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA3NDAwLCJzdWIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDc2MDAsInN1Yi5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNzUwMCwic3ViLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA3NzAwLCJzdWIuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDc4MDAsImRpdnMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWICwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwN2MwMCwiY21wICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQ01QLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisKKyAgezB4NjAwMDAwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg2NDAwMDAwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisKKyAgezB4NjgwMDAwMDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMyLDMyLFBJTlQsRElWVSwgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg2YzAwMDAwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7NCwxLFBJTlQsTVVMLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDcwMDAwMDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBREQsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4NzQwMDAwMDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFNVQiwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg3ODAwMDAwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVYsICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDdjMDAwMDAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxDTVAsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKworICB7MHhmNDAwNDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQU5EXyAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA0NDAwLCJhbmQuYyAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDU4MDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE9SICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwNWMwMCwib3IuYyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA1MDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxYT1IgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDU0MDAsInhvci5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg0MDAwMDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQU5EXyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDQ0MDAwMDAwLCJhbmQudSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4NTgwMDAwMDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE9SICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg1YzAwMDAwMCwib3IudSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDUwMDAwMDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxYT1IgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4NTQwMDAwMDAsInhvci51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg0ODAwMDAwMCwibWFzayAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsTUFTSyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDRjMDAwMDAwLCJtYXNrLnUgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMGVjMDAsImZmMCAgICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezEsMSxQSU5ULEZGMCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwZTgwMCwiZmYxICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYxICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGYwMDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxDTFIgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjAwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULFNFVCAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmMDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsRVhUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGYwMDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFRVICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjAwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULE1BSyAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmMDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsUk9UICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTFIgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNFVCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsRVhUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweGY0MDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFRVICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ZjQwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE1BSyAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHhmNDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsUk9UICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCisKKyAgezB4ODQwMDI4MDAsImZhZGQuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMjg4MCwiZmFkZC5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAyYTAwLCJmYWRkLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDJhODAsImZhZGQuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMjgyMCwiZmFkZC5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAyOGEwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDJhMjAsImZhZGQuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMmFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAzMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs1LDEsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDMwODAsImZzdWIuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMzIwMCwiZnN1Yi5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAzMjgwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDMwMjAsImZzdWIuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMzBhMCwiZnN1Yi5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAzMjIwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDMyYTAsImZzdWIuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMDAwMCwiZm11bC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAwMDgwLCJmbXVsLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDAyMDAsImZtdWwuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMDI4MCwiZm11bC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAwMDIwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDAwYTAsImZtdWwuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMDIyMCwiZm11bC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAwMmEwLCJmbXVsLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDcwMDAsImZkaXYuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMwLDMwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwNzA4MCwiZmRpdi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCisgIHsweDg0MDA3MjAwLCJmZGl2LnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDcyODAsImZkaXYuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwNzAyMCwiZmRpdi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDA3MGEwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDcyMjAsImZkaXYuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwNzJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCisgIHsweDg0MDA3ODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDc4MjAsImZzcXJ0LnNkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwNzg4MCwiZnNxcnQuZHMgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDA3OGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDM4MDAsImZjbXAuc3MgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMzg4MCwiZmNtcC5zZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAzYTAwLCJmY21wLmRzICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDNhODAsImZjbXAuZGQgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwMjAwMCwiZmx0LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDAyMDIwLCJmbHQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDQ4MDAsImludC5zICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwNDg4MCwiaW50LmQgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDA1MDAwLCJuaW50LnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODQwMDUwODAsIm5pbnQuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAorICB7MHg4NDAwNTgwMCwidHJuYy5zICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsVFJOQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDg0MDA1ODgwLCJ0cm5jLmQgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKKworICB7MHg4MDAwNDgwMCwiZmxkY3IgICAgICAgIix7MjEsNSxSRUd9ICAsezUsNixGQ1JSRUd9ICxOT19PUEVSQU5EICAgLCB7MSwxLFBGTFQsRkxEQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCisgIHsweDgwMDA4ODAwLCJmc3RjciAgICAgICAiLHsxNiw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGU1RDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKKyAgezB4ODAwMGM4MDAsImZ4Y3IgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezUsNixGQ1JSRUd9ICwgezEsMSxQRkxULEZYQyAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBuZXcgZm9yIHRoZSA4ODExMC4gKi8KKworICB7MHg4NDAwYWFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGFhODAsImZhZGQuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhYWMwLCJmYWRkLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYWEyMCwiZmFkZC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGFhMDAsImZhZGQuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhYTQwLCJmYWRkLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYWIyMCwiZmFkZC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGFiMDAsImZhZGQuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhYjQwLCJmYWRkLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYThhMCwiZmFkZC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGE4ODAsImZhZGQuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhOGMwLCJmYWRkLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYTgyMCwiZmFkZC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGE4MDAsImZhZGQuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhODQwLCJmYWRkLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYTkyMCwiZmFkZC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGE5MDAsImZhZGQuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhOTQwLCJmYWRkLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYWNhMCwiZmFkZC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGFjODAsImZhZGQueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhY2MwLCJmYWRkLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYWMyMCwiZmFkZC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGFjMDAsImZhZGQueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhYzQwLCJmYWRkLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYWQyMCwiZmFkZC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGFkMDAsImZhZGQueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBhZDQwLCJmYWRkLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg0MDBiYTgwLCJmY21wLnNkZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiYTAwLCJmY21wLnNkcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiYjAwLCJmY21wLnNkeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiODgwLCJmY21wLnNzZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiODAwLCJmY21wLnNzcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiOTAwLCJmY21wLnNzeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiYzgwLCJmY21wLnN4ZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiYzAwLCJmY21wLnN4cyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiZDAwLCJmY21wLnN4eCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODQwMGJhYTAsImZjbXB1LnNkZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGJhMjAsImZjbXB1LnNkcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGJiMjAsImZjbXB1LnNkeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGI4YTAsImZjbXB1LnNzZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGI4MjAsImZjbXB1LnNzcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGI5MjAsImZjbXB1LnNzeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGJjYTAsImZjbXB1LnN4ZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGJjMjAsImZjbXB1LnN4cyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGJkMjAsImZjbXB1LnN4eCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4NDAwMDgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDA4ODAsImZjdnQuZHMgICAgICIsezIxLDUsUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODQwMDg4ODAsImZjdnQuZHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg4YzAsImZjdnQuZHggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg4MjAsImZjdnQuc2QgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg4NDAsImZjdnQuc3ggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg5MjAsImZjdnQueGQgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg5MDAsImZjdnQueHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4NDAwZjJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGYyODAsImZkaXYuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmMmMwLCJmZGl2LmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjIyMCwiZmRpdi5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGYyMDAsImZkaXYuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmMjQwLCJmZGl2LmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjMyMCwiZmRpdi5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGYzMDAsImZkaXYuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmMzQwLCJmZGl2LmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjBhMCwiZmRpdi5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGYwODAsImZkaXYuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmMGMwLCJmZGl2LnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjAyMCwiZmRpdi5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGYwMDAsImZkaXYuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmMDQwLCJmZGl2LnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjEyMCwiZmRpdi5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGYxMDAsImZkaXYuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmMTQwLCJmZGl2LnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjRhMCwiZmRpdi54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGY0ODAsImZkaXYueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmNGMwLCJmZGl2LnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjQyMCwiZmRpdi54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGY0MDAsImZkaXYueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmNDQwLCJmZGl2LnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjUyMCwiZmRpdi54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGY1MDAsImZkaXYueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmNTQwLCJmZGl2Lnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg0MDAyMjIwLCJmbHQuZHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDIyMDAsImZsdC5zcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwMjI0MCwiZmx0LnhzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODQwMDgyYTAsImZtdWwuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4MjgwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODJjMCwiZm11bC5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDgyMjAsImZtdWwuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4MjAwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODI0MCwiZm11bC5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDgzMjAsImZtdWwuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4MzAwLCJmbXVsLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODM0MCwiZm11bC5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDgwYTAsImZtdWwuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4MDgwLCJmbXVsLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODBjMCwiZm11bC5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDgwMjAsImZtdWwuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4MDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODA0MCwiZm11bC5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDgxMjAsImZtdWwuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4MTAwLCJmbXVsLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODE0MCwiZm11bC5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg0YTAsImZtdWwueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4NDgwLCJmbXVsLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODRjMCwiZm11bC54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg0MjAsImZtdWwueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4NDAwLCJmbXVsLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODQ0MCwiZm11bC54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMDg1MjAsImZtdWwueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA4NTAwLCJmbXVsLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwODU0MCwiZm11bC54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4NDAwZjhhMCwiZnNxcnQuZGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGY4YzAsImZzcXJ0LmR4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGY4NDAsImZzcXJ0LnN4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZjkyMCwiZnNxcnQueGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBmOTAwLCJmc3FydC54cyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGY5NDAsImZzcXJ0Lnh4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg0MDBiMmEwLCJmc3ViLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjI4MCwiZnN1Yi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGIyYzAsImZzdWIuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiMjIwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjIwMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGIyNDAsImZzdWIuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiMzIwLCJmc3ViLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjMwMCwiZnN1Yi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGIzNDAsImZzdWIuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiMGEwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjA4MCwiZnN1Yi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGIwYzAsImZzdWIuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiMDIwLCJmc3ViLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjAwMCwiZnN1Yi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGIwNDAsImZzdWIuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiMTIwLCJmc3ViLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjEwMCwiZnN1Yi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGIxNDAsImZzdWIuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiNGEwLCJmc3ViLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjQ4MCwiZnN1Yi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGI0YzAsImZzdWIueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiNDIwLCJmc3ViLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjQwMCwiZnN1Yi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGI0NDAsImZzdWIueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBiNTIwLCJmc3ViLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwYjUwMCwiZnN1Yi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGI1NDAsImZzdWIueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODQwMGZjMDAsImlsbG9wIiwgezAsMixERUN9LCBOT19PUEVSQU5ELCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4NDAwYzgwMCwiaW50LnNzICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBjODgwLCJpbnQuc2QgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGM5MDAsImludC5zeCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDA0MDAwMDAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDAwMDAwMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDNjMDAwMDAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ZjAwMDE0MDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMTAwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAxODAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDE1MDAsImxkLnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMTEwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAxOTAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHhmMDAwMTYwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDEyMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAxYTAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMTcwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDEzMDAsImxkLmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAxYjAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg0MDBjMDAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGMwODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwNDIwMCwibW92LnMgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDA0MjgwLCJtb3YuZCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGMzMDAsIm1vdiAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHhmNDAwNmQwMCwibXVsdS5kICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4NDAwZDA4MCwibmludC5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBkMDAwLCJuaW50LnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODQwMGQxMDAsIm5pbnQuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg4MDAyMDIwLCJwYWRkLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMjA0MCwicGFkZC5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDIwNjAsInBhZGQgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODgwMDIxZTAsInBhZGRzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDAyMWEwLCJwYWRkcy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMjFjMCwicGFkZHMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDIwZTAsInBhZGRzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDAyMGEwLCJwYWRkcy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMjBjMCwicGFkZHMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDIxNjAsInBhZGRzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDAyMTIwLCJwYWRkcy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMjE0MCwicGFkZHMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4ODAwMzg2MCwicGNtcCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4ODAwMDAwMCwicG11bCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4ODAwNjI2MCwicHBhY2suMTYgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDYyNDAsInBwYWNrLjE2LmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDA2NDYwLCJwcGFjay4zMiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwNjQyMCwicHBhY2suMzIuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDY0NDAsInBwYWNrLjMyLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDA2MTYwLCJwcGFjay44ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg4MDA3MjAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7NSw2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwNzgwMCwicHJvdCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHg4ODAwMzAyMCwicHN1Yi5iICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDMwNDAsInBzdWIuaCAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDAzMDYwLCJwc3ViICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweDg4MDAzMWUwLCJwc3Vicy5zICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMzFhMCwicHN1YnMucy5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDMxYzAsInBzdWJzLnMuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDAzMGUwLCJwc3Vicy51ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMzBhMCwicHN1YnMudS5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDMwYzAsInBzdWJzLnUuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg4MDAzMTYwLCJwc3Vicy51cyAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwMzEyMCwicHN1YnMudXMuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ODgwMDMxNDAsInBzdWJzLnVzLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODgwMDY4MDAsInB1bnBrLm4gICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4ODAwNjgyMCwicHVucGsuYiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4MzQwMDAwMDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4MzAwMDAwMDAsInN0LmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4MzgwMDAwMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHhmNDAwMmM4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjQwMDI4ODAsInN0Lmgud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjQwMDJkODAsInN0LmIudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGY0MDAyOTgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjQwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ZjAwMDI0MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyMTAwLCJzdC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyNTAwLCJzdC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDI1ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjQ4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyODAwLCJzdC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDI5MDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjk4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyODgwLCJzdC54Lnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworICB7MHhmNDAwMmY4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMmU4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMjM4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMmI4MCwic3QuaC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMmE4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMjc4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmNDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorCisgIHsweGYwMDAyNjAwLCJzdCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjIwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDIzMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDI3MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDJhMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweGYwMDAyYjAwLCJzdC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHhmMDAwMmI4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKyAgezB4ZjAwMDJhODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisKKyAgezB4ODQwMGQ4ODAsInRybmMuc2QgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAorICB7MHg4NDAwZDgwMCwidHJuYy5zcyAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCisgIHsweDg0MDBkOTAwLCJ0cm5jLnN4ICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKKworfTsKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGZpbGwtY29sdW1uOiAxMzEKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oIGIvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYThjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9taXBzLmgKQEAgLTAsMCArMSw3MjMgQEAKKy8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgorICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9NSVBTX0hfCisjZGVmaW5lIF9NSVBTX0hfCisKKy8qIFRoZXNlIGFyZSBiaXQgbWFza3MgYW5kIHNoaWZ0IGNvdW50cyB0byB1c2UgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCisgICBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24uICBUbyByZXRyaWV2ZSB0aGUgWCBmaWVsZCBvZiBhbgorICAgaW5zdHJ1Y3Rpb24sIHVzZSB0aGUgZXhwcmVzc2lvbgorCShpID4+IE9QX1NIX1gpICYgT1BfTUFTS19YCisgICBUbyBzZXQgdGhlIHNhbWUgZmllbGQgKHRvIGopLCB1c2UKKwlpID0gKGkgJn4gKE9QX01BU0tfWCA8PCBPUF9TSF9YKSkgfCAoaiA8PCBPUF9TSF9YKQorCisgICBNYWtlIHN1cmUgeW91IHVzZSBmaWVsZHMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnN0cnVjdGlvbiwKKyAgIG9mIGNvdXJzZS4gIAorCisgICBUaGUgJ2knIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIElNTUVESUFURS4gIAorCisgICBUaGUgJ2onIGZvcm1hdCB1c2VzIE9QIGFuZCBUQVJHRVQuCisKKyAgIFRoZSAncicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCwgUkQsIFNIQU1UIGFuZCBGVU5DVC4KKworICAgVGhlICdiJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBERUxUQS4KKworICAgVGhlIGZsb2F0aW5nIHBvaW50ICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuCisKKyAgIFRoZSBmbG9hdGluZyBwb2ludCAncicgZm9ybWF0IHVzZXMgT1AsIEZNVCwgRlQsIEZTLCBGRCBhbmQgRlVOQ1QuCisKKyAgIEEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB1c2VzIE9QLCBDT0RFIGFuZCBTUEVDICgxMCBiaXRzIG9mIHRoZQorICAgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBhcmUgbm90IGRlZmluZWQ7IEthbmUgc2F5cyB0aGUgYnJlYWtwb2ludAorICAgY29kZSBmaWVsZCBpbiBCUkVBSyBpcyAyMCBiaXRzOyB5ZXQgTUlQUyBhc3NlbWJsZXJzIGFuZCBkZWJ1Z2dlcnMKKyAgIG9ubHkgdXNlIHRlbiBiaXRzKS4gIEFuIG9wdGlvbmFsIHR3by1vcGVyYW5kIGZvcm0gb2YgYnJlYWsvc2RiYnAKKyAgIGFsbG93cyB0aGUgbG93ZXIgdGVuIGJpdHMgdG8gYmUgc2V0IHRvby4KKworICAgVGhlIHN5c2NhbGwgaW5zdHJ1Y3Rpb24gdXNlcyBTWVNDQUxMLgorCisgICBUaGUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdXNlIENPUFouICAqLworCisjZGVmaW5lIE9QX01BU0tfT1AJCTB4M2YKKyNkZWZpbmUgT1BfU0hfT1AJCTI2CisjZGVmaW5lIE9QX01BU0tfUlMJCTB4MWYKKyNkZWZpbmUgT1BfU0hfUlMJCTIxCisjZGVmaW5lIE9QX01BU0tfRlIJCTB4MWYKKyNkZWZpbmUgT1BfU0hfRlIJCTIxCisjZGVmaW5lIE9QX01BU0tfRk1UCQkweDFmCisjZGVmaW5lIE9QX1NIX0ZNVAkJMjEKKyNkZWZpbmUgT1BfTUFTS19CQ0MJCTB4NworI2RlZmluZSBPUF9TSF9CQ0MJCTE4CisjZGVmaW5lIE9QX01BU0tfQ09ERQkJMHgzZmYKKyNkZWZpbmUgT1BfU0hfQ09ERQkJMTYKKyNkZWZpbmUgT1BfTUFTS19DT0RFMgkJMHgzZmYKKyNkZWZpbmUgT1BfU0hfQ09ERTIJCTYKKyNkZWZpbmUgT1BfTUFTS19SVAkJMHgxZgorI2RlZmluZSBPUF9TSF9SVAkJMTYKKyNkZWZpbmUgT1BfTUFTS19GVAkJMHgxZgorI2RlZmluZSBPUF9TSF9GVAkJMTYKKyNkZWZpbmUgT1BfTUFTS19DQUNIRQkJMHgxZgorI2RlZmluZSBPUF9TSF9DQUNIRQkJMTYKKyNkZWZpbmUgT1BfTUFTS19SRAkJMHgxZgorI2RlZmluZSBPUF9TSF9SRAkJMTEKKyNkZWZpbmUgT1BfTUFTS19GUwkJMHgxZgorI2RlZmluZSBPUF9TSF9GUwkJMTEKKyNkZWZpbmUgT1BfTUFTS19QUkVGWAkJMHgxZgorI2RlZmluZSBPUF9TSF9QUkVGWAkJMTEKKyNkZWZpbmUgT1BfTUFTS19DQ0MJCTB4NworI2RlZmluZSBPUF9TSF9DQ0MJCTgKKyNkZWZpbmUgT1BfTUFTS19TWVNDQUxMCQkweGZmZmZmCisjZGVmaW5lIE9QX1NIX1NZU0NBTEwJCTYKKyNkZWZpbmUgT1BfTUFTS19TSEFNVAkJMHgxZgorI2RlZmluZSBPUF9TSF9TSEFNVAkJNgorI2RlZmluZSBPUF9NQVNLX0ZECQkweDFmCisjZGVmaW5lIE9QX1NIX0ZECQk2CisjZGVmaW5lIE9QX01BU0tfVEFSR0VUCQkweDNmZmZmZmYKKyNkZWZpbmUgT1BfU0hfVEFSR0VUCQkwCisjZGVmaW5lIE9QX01BU0tfQ09QWgkJMHgxZmZmZmZmCisjZGVmaW5lIE9QX1NIX0NPUFoJCTAKKyNkZWZpbmUgT1BfTUFTS19JTU1FRElBVEUJMHhmZmZmCisjZGVmaW5lIE9QX1NIX0lNTUVESUFURQkJMAorI2RlZmluZSBPUF9NQVNLX0RFTFRBCQkweGZmZmYKKyNkZWZpbmUgT1BfU0hfREVMVEEJCTAKKyNkZWZpbmUgT1BfTUFTS19GVU5DVAkJMHgzZgorI2RlZmluZSBPUF9TSF9GVU5DVAkJMAorI2RlZmluZSBPUF9NQVNLX1NQRUMJCTB4M2YKKyNkZWZpbmUgT1BfU0hfU1BFQwkJMAorI2RlZmluZSBPUF9TSF9MT0NDICAgICAgICAgICAgICA4ICAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCisjZGVmaW5lIE9QX1NIX0hJQ0MgICAgICAgICAgICAgIDE4ICAgICAgLyogRlAgY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgT1BfTUFTS19DQyAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIE9QX1NIX0NPUDFOT1JNICAgICAgICAgIDI1ICAgICAgLyogTm9ybWFsIENPUDEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgT1BfTUFTS19DT1AxTk9STSAgICAgICAgMHgxICAgICAvKiBhIHNpbmdsZSBiaXQgKi8KKyNkZWZpbmUgT1BfU0hfQ09QMVNQRUMgICAgICAgICAgMjEgICAgICAvKiBDT1AxIGVuY29kaW5ncyAqLworI2RlZmluZSBPUF9NQVNLX0NPUDFTUEVDICAgICAgICAweGYKKyNkZWZpbmUgT1BfTUFTS19DT1AxU0NMUiAgICAgICAgMHg0CisjZGVmaW5lIE9QX01BU0tfQ09QMUNNUCAgICAgICAgIDB4MworI2RlZmluZSBPUF9TSF9DT1AxQ01QICAgICAgICAgICA0CisjZGVmaW5lIE9QX1NIX0ZPUk1BVCAgICAgICAgICAgIDIxICAgICAgLyogRlAgc2hvcnQgZm9ybWF0IGZpZWxkICovCisjZGVmaW5lIE9QX01BU0tfRk9STUFUICAgICAgICAgIDB4NworI2RlZmluZSBPUF9TSF9UUlVFICAgICAgICAgICAgICAxNgorI2RlZmluZSBPUF9NQVNLX1RSVUUgICAgICAgICAgICAweDEKKyNkZWZpbmUgT1BfU0hfR0UgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgT1BfTUFTS19HRSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBPUF9TSF9VTlNJR05FRCAgICAgICAgICAxNgorI2RlZmluZSBPUF9NQVNLX1VOU0lHTkVEICAgICAgICAweDEKKyNkZWZpbmUgT1BfU0hfSElOVCAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgT1BfTUFTS19ISU5UICAgICAgICAgICAgMHgxZgorI2RlZmluZSBPUF9TSF9NTUkgICAgICAgICAgICAgICAwICAgICAgIC8qIE11bHRpbWVkaWEgKHBhcmFsbGVsKSBvcCAqLworI2RlZmluZSBPUF9NQVNLX01NSSAgICAgICAgICAgICAweDNmIAorI2RlZmluZSBPUF9TSF9NTUlTVUIgICAgICAgICAgICA2CisjZGVmaW5lIE9QX01BU0tfTU1JU1VCICAgICAgICAgIDB4MWYKKyNkZWZpbmUgT1BfTUFTS19QRVJGUkVHCQkweDFmCS8qIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KKyNkZWZpbmUgT1BfU0hfUEVSRlJFRwkJMQorCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLiAgKi8KKworc3RydWN0IG1pcHNfb3Bjb2RlCit7CisgIC8qIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCisgIGNvbnN0IGNoYXIgKmFyZ3M7CisgIC8qIFRoZSBiYXNpYyBvcGNvZGUgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIFdoZW4gYXNzZW1ibGluZywgdGhpcworICAgICBvcGNvZGUgaXMgbW9kaWZpZWQgYnkgdGhlIGFyZ3VtZW50cyB0byBwcm9kdWNlIHRoZSBhY3R1YWwgb3Bjb2RlCisgICAgIHRoYXQgaXMgdXNlZC4gIElmIHBpbmZvIGlzIElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyAwLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBtYXRjaDsKKyAgLyogSWYgcGluZm8gaXMgbm90IElOU05fTUFDUk8sIHRoZW4gdGhpcyBpcyBhIGJpdCBtYXNrIGZvciB0aGUKKyAgICAgcmVsZXZhbnQgcG9ydGlvbnMgb2YgdGhlIG9wY29kZSB3aGVuIGRpc2Fzc2VtYmxpbmcuICBJZiB0aGUKKyAgICAgYWN0dWFsIG9wY29kZSBhbmRlZCB3aXRoIHRoZSBtYXRjaCBmaWVsZCBlcXVhbHMgdGhlIG9wY29kZSBmaWVsZCwKKyAgICAgdGhlbiB3ZSBoYXZlIGZvdW5kIHRoZSBjb3JyZWN0IGluc3RydWN0aW9uLiAgSWYgcGluZm8gaXMKKyAgICAgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGZpZWxkIGlzIHRoZSBtYWNybyBpZGVudGlmaWVyLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBtYXNrOworICAvKiBGb3IgYSBtYWNybywgdGhpcyBpcyBJTlNOX01BQ1JPLiAgT3RoZXJ3aXNlLCBpdCBpcyBhIGNvbGxlY3Rpb24KKyAgICAgb2YgYml0cyBkZXNjcmliaW5nIHRoZSBpbnN0cnVjdGlvbiwgbm90YWJseSBhbnkgcmVsZXZhbnQgaGF6YXJkCisgICAgIGluZm9ybWF0aW9uLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBwaW5mbzsKKyAgLyogQSBjb2xsZWN0aW9uIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24gc2V0cyBvZiB3aGljaCB0aGlzCisgICAgIGluc3RydWN0aW9uIG9yIG1hY3JvIGlzIGEgbWVtYmVyLiAqLworICB1bnNpZ25lZCBsb25nIG1lbWJlcnNoaXA7Cit9OworCisvKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KKyAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCisgICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncworICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0CisgICB3aGVuIGRpc2Fzc2VtYmxpbmcuCisKKyAgIEVhY2ggb2YgdGhlc2UgY2hhcmFjdGVycyBjb3JyZXNwb25kcyB0byBhIG1hc2sgZmllbGQgZGVmaW5lZCBhYm92ZS4KKworICAgIjwiIDUgYml0IHNoaWZ0IGFtb3VudCAoT1BfKl9TSEFNVCkKKyAgICI+IiBzaGlmdCBhbW91bnQgYmV0d2VlbiAzMiBhbmQgNjMsIHN0b3JlZCBhZnRlciBzdWJ0cmFjdGluZyAzMiAoT1BfKl9TSEFNVCkKKyAgICJhIiAyNiBiaXQgdGFyZ2V0IGFkZHJlc3MgKE9QXypfVEFSR0VUKQorICAgImIiIDUgYml0IGJhc2UgcmVnaXN0ZXIgKE9QXypfUlMpCisgICAiYyIgMTAgYml0IGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFKQorICAgImQiIDUgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNwZWNpZmllciAoT1BfKl9SRCkKKyAgICJoIiA1IGJpdCBwcmVmeCBoaW50IChPUF8qX1BSRUZYKQorICAgImkiIDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKE9QXypfSU1NRURJQVRFKQorICAgImoiIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIChPUF8qX0RFTFRBKQorICAgImsiIDUgYml0IGNhY2hlIG9wY29kZSBpbiB0YXJnZXQgcmVnaXN0ZXIgcG9zaXRpb24gKE9QXypfQ0FDSEUpCisgICAibyIgMTYgYml0IHNpZ25lZCBvZmZzZXQgKE9QXypfREVMVEEpCisgICAicCIgMTYgYml0IFBDIHJlbGF0aXZlIGJyYW5jaCB0YXJnZXQgYWRkcmVzcyAoT1BfKl9ERUxUQSkKKyAgICJxIiAxMCBiaXQgZXh0cmEgYnJlYWtwb2ludCBjb2RlIChPUF8qX0NPREUyKQorICAgInIiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgdGFyZ2V0IChPUF8qX1JTKQorICAgInMiIDUgYml0IHNvdXJjZSByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUlMpCisgICAidCIgNSBiaXQgdGFyZ2V0IHJlZ2lzdGVyIChPUF8qX1JUKQorICAgInUiIDE2IGJpdCB1cHBlciAxNiBiaXRzIG9mIGFkZHJlc3MgKE9QXypfSU1NRURJQVRFKQorICAgInYiIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfUlMpCisgICAidyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGJvdGggdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9SVCkKKyAgICJDIiAyNSBiaXQgY29wcm9jZXNzb3IgZnVuY3Rpb24gY29kZSAoT1BfKl9DT1BaKQorICAgIkIiIDIwIGJpdCBzeXNjYWxsIGZ1bmN0aW9uIGNvZGUgKE9QXypfU1lTQ0FMTCkKKyAgICJ4IiBhY2NlcHQgYW5kIGlnbm9yZSByZWdpc3RlciBuYW1lCisgICAieiIgbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyCisKKyAgIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uczoKKyAgICJEIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9GRCkKKyAgICJNIiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlIChPUF8qX0NDQykgKG9ubHkgdXNlZCBmb3IgbWlwczQgYW5kIHVwKQorICAgIk4iIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAoT1BfKl9CQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKKyAgICJTIiA1IGJpdCBmcyBzb3VyY2UgMSByZWdpc3RlciAoT1BfKl9GUykKKyAgICJUIiA1IGJpdCBmdCBzb3VyY2UgMiByZWdpc3RlciAoT1BfKl9GVCkKKyAgICJSIiA1IGJpdCBmciBzb3VyY2UgMyByZWdpc3RlciAoT1BfKl9GUikKKyAgICJWIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GUykKKyAgICJXIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GVCkKKworICAgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgorICAgIkUiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKKyAgICJHIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SRCkKKyAgICJQIiA1IGJpdCBwZXJmb3JtYW5jZS1tb25pdG9yIHJlZ2lzdGVyIChPUF8qX1BFUkZSRUcpCisKKyAgIE1hY3JvIGluc3RydWN0aW9uczoKKyAgICJBIiBHZW5lcmFsIDMyIGJpdCBleHByZXNzaW9uCisgICAiSSIgMzIgYml0IGltbWVkaWF0ZQorICAgIkYiIDY0IGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpbiAucmRhdGEKKyAgICJMIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDgKKyAgICJmIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKKyAgICJsIiAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLmxpdDQKKworICAgT3RoZXI6CisgICAiKCkiIHBhcmVucyBzdXJyb3VuZGluZyBvcHRpb25hbCB2YWx1ZQorICAgIiwiICBzZXBhcmF0ZXMgb3BlcmFuZHMKKworICAgQ2hhcmFjdGVycyB1c2VkIHNvIGZhciwgZm9yIHF1aWNrIHJlZmVyZW5jZSB3aGVuIGFkZGluZyBtb3JlOgorICAgIjw+KCksIgorICAgIkFCQ0RFRkdJTE1OU1RSVlciCisgICAiYWJjZGZoaWprbG9wcXJzdHV2d3h6IgorKi8KKworLyogVGhlc2UgYXJlIHRoZSBiaXRzIHdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIHBpbmZvIGZpZWxkIG9mIGFuCisgICBpbnN0cnVjdGlvbnMsIGlmIGl0IGlzIG5vdCBlcXVhbCB0byBJTlNOX01BQ1JPLiAgKi8KKworLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JELiAgKi8KKyNkZWZpbmUgSU5TTl9XUklURV9HUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDEKKy8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCisjZGVmaW5lIElOU05fV1JJVEVfR1BSX1QgICAgICAgICAgICAweDAwMDAwMDAyCisvKiBNb2RpZmllcyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgMzEuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0dQUl8zMSAgICAgICAgICAgMHgwMDAwMDAwNAorLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRkQuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9EICAgICAgICAgICAgMHgwMDAwMDAwOAorLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9TICAgICAgICAgICAgMHgwMDAwMDAxMAorLyogTW9kaWZpZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0ZQUl9UICAgICAgICAgICAgMHgwMDAwMDAyMAorLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JTLiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgICAgIDB4MDAwMDAwNDAKKy8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SVC4gICovCisjZGVmaW5lIElOU05fUkVBRF9HUFJfVCAgICAgICAgICAgICAweDAwMDAwMDgwCisvKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUy4gICovCisjZGVmaW5lIElOU05fUkVBRF9GUFJfUyAgICAgICAgICAgICAweDAwMDAwMTAwCisvKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GVC4gICovCisjZGVmaW5lIElOU05fUkVBRF9GUFJfVCAgICAgICAgICAgICAweDAwMDAwMjAwCisvKiBSZWFkcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUi4gICovCisjZGVmaW5lIElOU05fUkVBRF9GUFJfUgkJICAgIDB4MDAwMDA0MDAKKy8qIE1vZGlmaWVzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KKyNkZWZpbmUgSU5TTl9XUklURV9DT05EX0NPREUgICAgICAgIDB4MDAwMDA4MDAKKy8qIFJlYWRzIGNvcHJvY2Vzc29yIGNvbmRpdGlvbiBjb2RlLiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0NPTkRfQ09ERSAgICAgICAgIDB4MDAwMDEwMDAKKy8qIFRMQiBvcGVyYXRpb24uICAqLworI2RlZmluZSBJTlNOX1RMQiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorLyogUmVhZHMgY29wcm9jZXNzb3IgcmVnaXN0ZXIgb3RoZXIgdGhhbiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCisjZGVmaW5lIElOU05fQ09QICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisvKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KKyNkZWZpbmUgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSAgICAgIDB4MDAwMDgwMDAKKy8qIEluc3RydWN0aW9uIGxvYWRzIHZhbHVlIGZyb20gY29wcm9jZXNzb3IsIHJlcXVpcmluZyBkZWxheS4gICovCisjZGVmaW5lIElOU05fTE9BRF9DT1BST0NfREVMQVkJICAgIDB4MDAwMTAwMDAKKy8qIEluc3RydWN0aW9uIGhhcyB1bmNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheSBzbG90LiAgKi8KKyNkZWZpbmUgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZICAgIDB4MDAwMjAwMDAKKy8qIEluc3RydWN0aW9uIGhhcyBjb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCisjZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfREVMQVkgICAgICAweDAwMDQwMDAwCisvKiBDb25kaXRpb25hbCBicmFuY2ggbGlrZWx5OiBpZiBicmFuY2ggbm90IHRha2VuLCBpbnNuIG51bGxpZmllZC4gICovCisjZGVmaW5lIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZCSAgICAweDAwMDgwMDAwCisvKiBNb3ZlcyB0byBjb3Byb2Nlc3NvciByZWdpc3RlciwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KKyNkZWZpbmUgSU5TTl9DT1BST0NfTU9WRV9ERUxBWSAgICAgIDB4MDAxMDAwMDAKKy8qIExvYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGZyb20gbWVtb3J5LCByZXF1aXJpbmcgZGVsYXkuICAqLworI2RlZmluZSBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkgICAgMHgwMDIwMDAwMAorLyogUmVhZHMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0hJCQkgICAgMHgwMDQwMDAwMAorLyogUmVhZHMgdGhlIExPIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0xPCQkgICAgMHgwMDgwMDAwMAorLyogTW9kaWZpZXMgdGhlIEhJIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgSU5TTl9XUklURV9ISQkJICAgIDB4MDEwMDAwMDAKKy8qIE1vZGlmaWVzIHRoZSBMTyByZWdpc3Rlci4gICovCisjZGVmaW5lIElOU05fV1JJVEVfTE8JCSAgICAweDAyMDAwMDAwCisvKiBUYWtlcyBhIHRyYXAgKGVhc2llciB0byBrZWVwIG91dCBvZiBkZWxheSBzbG90KS4gICovCisjZGVmaW5lIElOU05fVFJBUCAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisvKiBJbnN0cnVjdGlvbiBzdG9yZXMgdmFsdWUgaW50byBtZW1vcnkuICAqLworI2RlZmluZSBJTlNOX1NUT1JFX01FTU9SWQkgICAgMHgwODAwMDAwMAorLyogSW5zdHJ1Y3Rpb24gdXNlcyBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KKyNkZWZpbmUgRlBfUwkJCSAgICAweDEwMDAwMDAwCisvKiBJbnN0cnVjdGlvbiB1c2VzIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuICAqLworI2RlZmluZSBGUF9ECQkJICAgIDB4MjAwMDAwMDAKKy8qIEluc3RydWN0aW9uIGlzIHBhcnQgb2YgdGhlIHR4MzkncyBpbnRlZ2VyIG11bHRpcGx5IGZhbWlseS4gICAgKi8KKyNkZWZpbmUgSU5TTl9NVUxUICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKy8qIEluc3RydWN0aW9uIHN5bmNocm9uaXplIHNoYXJlZCBtZW1vcnkuICAqLworI2RlZmluZSBJTlNOX1NZTkMJCSAgICAweDgwMDAwMDAwCisKKy8qIEluc3RydWN0aW9uIGlzIGFjdHVhbGx5IGEgbWFjcm8uICBJdCBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUKKyAgIGRpc2Fzc2VtYmxlciwgYW5kIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IGJ5IHRoZSBhc3NlbWJsZXIuICAqLworI2RlZmluZSBJTlNOX01BQ1JPICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorCisKKworCisKKy8qIE1JUFMgSVNBIGZpZWxkLS1DUFUgbGV2ZWwgYXQgd2hpY2ggaW5zbiBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBJTlNOX0lTQQkJICAgIDB4MDAwMDAwMEYKKy8qIEFuIGluc3RydWN0aW9uIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIGFueSBiYXNpYyBNSVBTIElTQS4KKyAgIChpZSBpdCBpcyBhIGNoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24pICAqLworI2RlZmluZSBJTlNOX05PX0lTQQkJICAgIDB4MDAwMDAwMDAKKy8qIE1JUFMgSVNBIDEgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOX0lTQTEJCSAgICAweDAwMDAwMDAxCisvKiBNSVBTIElTQSAyIGluc3RydWN0aW9uIChSNjAwMCBvciBSNDAwMCkuICAqLworI2RlZmluZSBJTlNOX0lTQTIJCSAgICAweDAwMDAwMDAyCisvKiBNSVBTIElTQSAzIGluc3RydWN0aW9uIChSNDAwMCkuICAqLworI2RlZmluZSBJTlNOX0lTQTMJCSAgICAweDAwMDAwMDAzCisvKiBNSVBTIElTQSA0IGluc3RydWN0aW9uIChSODAwMCkuICAqLworI2RlZmluZSBJTlNOX0lTQTQJCSAgICAweDAwMDAwMDA0CisKKy8qIENoaXAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYXJlIGJpdG1hc2tzLiAgKi8KKy8qIE1JUFMgUjQ2NTAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOXzQ2NTAJCSAgICAweDAwMDAwMDEwCisvKiBMU0kgUjQwMTAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOXzQwMTAJCSAgICAweDAwMDAwMDIwCisvKiBORUMgVlI0MTAwIGluc3RydWN0aW9uLiAqLworI2RlZmluZSBJTlNOXzQxMDAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorLyogVG9zaGliYSBSMzkwMCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIElOU05fMzkwMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisKKworLyogVGhpcyBpcyBhIGxpc3Qgb2YgbWFjcm8gZXhwYW5kZWQgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIF9JIGFwcGVuZGVkIG1lYW5zIGltbWVkaWF0ZQorICogX0EgYXBwZW5kZWQgbWVhbnMgYWRkcmVzcworICogX0FCIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3Mgd2l0aCBiYXNlIHJlZ2lzdGVyCisgKiBfRCBhcHBlbmRlZCBtZWFucyA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKKyAqIF9TIGFwcGVuZGVkIG1lYW5zIDMyIGJpdCBmbG9hdGluZyBwb2ludCBjb25zdGFudAorICovCitlbnVtIHsKKyAgICBNX0FCUywKKyAgICBNX0FERF9JLAorICAgIE1fQUREVV9JLAorICAgIE1fQU5EX0ksCisgICAgTV9CRVEsCisgICAgTV9CRVFfSSwKKyAgICBNX0JFUUxfSSwKKyAgICBNX0JHRSwKKyAgICBNX0JHRUwsCisgICAgTV9CR0VfSSwKKyAgICBNX0JHRUxfSSwKKyAgICBNX0JHRVUsCisgICAgTV9CR0VVTCwKKyAgICBNX0JHRVVfSSwKKyAgICBNX0JHRVVMX0ksCisgICAgTV9CR1QsCisgICAgTV9CR1RMLAorICAgIE1fQkdUX0ksCisgICAgTV9CR1RMX0ksCisgICAgTV9CR1RVLAorICAgIE1fQkdUVUwsCisgICAgTV9CR1RVX0ksCisgICAgTV9CR1RVTF9JLAorICAgIE1fQkxFLAorICAgIE1fQkxFTCwKKyAgICBNX0JMRV9JLAorICAgIE1fQkxFTF9JLAorICAgIE1fQkxFVSwKKyAgICBNX0JMRVVMLAorICAgIE1fQkxFVV9JLAorICAgIE1fQkxFVUxfSSwKKyAgICBNX0JMVCwKKyAgICBNX0JMVEwsCisgICAgTV9CTFRfSSwKKyAgICBNX0JMVExfSSwKKyAgICBNX0JMVFUsCisgICAgTV9CTFRVTCwKKyAgICBNX0JMVFVfSSwKKyAgICBNX0JMVFVMX0ksCisgICAgTV9CTkUsCisgICAgTV9CTkVfSSwKKyAgICBNX0JORUxfSSwKKyAgICBNX0RBQlMsCisgICAgTV9EQUREX0ksCisgICAgTV9EQUREVV9JLAorICAgIE1fRERJVl8zLAorICAgIE1fRERJVl8zSSwKKyAgICBNX0RESVZVXzMsCisgICAgTV9ERElWVV8zSSwKKyAgICBNX0RJVl8zLAorICAgIE1fRElWXzNJLAorICAgIE1fRElWVV8zLAorICAgIE1fRElWVV8zSSwKKyAgICBNX0RMQV9BQiwKKyAgICBNX0RMSSwKKyAgICBNX0RNVUwsCisgICAgTV9ETVVMX0ksIAorICAgIE1fRE1VTE8sCisgICAgTV9ETVVMT19JLCAKKyAgICBNX0RNVUxPVSwKKyAgICBNX0RNVUxPVV9JLCAKKyAgICBNX0RSRU1fMywKKyAgICBNX0RSRU1fM0ksCisgICAgTV9EUkVNVV8zLAorICAgIE1fRFJFTVVfM0ksCisgICAgTV9EU1VCX0ksCisgICAgTV9EU1VCVV9JLAorICAgIE1fRFNVQlVfSV8yLAorICAgIE1fSl9BLAorICAgIE1fSkFMXzEsCisgICAgTV9KQUxfMiwKKyAgICBNX0pBTF9BLAorICAgIE1fTF9ET0IsCisgICAgTV9MX0RBQiwKKyAgICBNX0xBX0FCLAorICAgIE1fTEJfQSwKKyAgICBNX0xCX0FCLAorICAgIE1fTEJVX0EsCisgICAgTV9MQlVfQUIsCisgICAgTV9MRF9BLAorICAgIE1fTERfT0IsCisgICAgTV9MRF9BQiwKKyAgICBNX0xEQzFfQUIsCisgICAgTV9MREMyX0FCLAorICAgIE1fTERDM19BQiwKKyAgICBNX0xETF9BQiwKKyAgICBNX0xEUl9BQiwKKyAgICBNX0xIX0EsCisgICAgTV9MSF9BQiwKKyAgICBNX0xIVV9BLAorICAgIE1fTEhVX0FCLAorICAgIE1fTEksCisgICAgTV9MSV9ELAorICAgIE1fTElfREQsCisgICAgTV9MSV9TLAorICAgIE1fTElfU1MsCisgICAgTV9MTF9BQiwKKyAgICBNX0xMRF9BQiwKKyAgICBNX0xTX0EsCisgICAgTV9MV19BLAorICAgIE1fTFdfQUIsCisgICAgTV9MV0MwX0EsCisgICAgTV9MV0MwX0FCLAorICAgIE1fTFdDMV9BLAorICAgIE1fTFdDMV9BQiwKKyAgICBNX0xXQzJfQSwKKyAgICBNX0xXQzJfQUIsCisgICAgTV9MV0MzX0EsCisgICAgTV9MV0MzX0FCLAorICAgIE1fTFdMX0EsCisgICAgTV9MV0xfQUIsCisgICAgTV9MV1JfQSwKKyAgICBNX0xXUl9BQiwKKyAgICBNX0xXVV9BQiwKKyAgICBNX01VTCwKKyAgICBNX01VTF9JLCAKKyAgICBNX01VTE8sCisgICAgTV9NVUxPX0ksIAorICAgIE1fTVVMT1UsCisgICAgTV9NVUxPVV9JLCAKKyAgICBNX05PUl9JLAorICAgIE1fT1JfSSwKKyAgICBNX1JFTV8zLAorICAgIE1fUkVNXzNJLAorICAgIE1fUkVNVV8zLAorICAgIE1fUkVNVV8zSSwKKyAgICBNX1JPTCwKKyAgICBNX1JPTF9JLAorICAgIE1fUk9SLAorICAgIE1fUk9SX0ksCisgICAgTV9TX0RBLAorICAgIE1fU19ET0IsCisgICAgTV9TX0RBQiwKKyAgICBNX1NfUywKKyAgICBNX1NDX0FCLAorICAgIE1fU0NEX0FCLAorICAgIE1fU0RfQSwKKyAgICBNX1NEX09CLAorICAgIE1fU0RfQUIsCisgICAgTV9TREMxX0FCLAorICAgIE1fU0RDMl9BQiwKKyAgICBNX1NEQzNfQUIsCisgICAgTV9TRExfQUIsCisgICAgTV9TRFJfQUIsCisgICAgTV9TRVEsCisgICAgTV9TRVFfSSwKKyAgICBNX1NHRSwKKyAgICBNX1NHRV9JLAorICAgIE1fU0dFVSwKKyAgICBNX1NHRVVfSSwKKyAgICBNX1NHVCwKKyAgICBNX1NHVF9JLAorICAgIE1fU0dUVSwKKyAgICBNX1NHVFVfSSwKKyAgICBNX1NMRSwKKyAgICBNX1NMRV9JLAorICAgIE1fU0xFVSwKKyAgICBNX1NMRVVfSSwKKyAgICBNX1NMVF9JLAorICAgIE1fU0xUVV9JLAorICAgIE1fU05FLAorICAgIE1fU05FX0ksCisgICAgTV9TQl9BLAorICAgIE1fU0JfQUIsCisgICAgTV9TSF9BLAorICAgIE1fU0hfQUIsCisgICAgTV9TV19BLAorICAgIE1fU1dfQUIsCisgICAgTV9TV0MwX0EsCisgICAgTV9TV0MwX0FCLAorICAgIE1fU1dDMV9BLAorICAgIE1fU1dDMV9BQiwKKyAgICBNX1NXQzJfQSwKKyAgICBNX1NXQzJfQUIsCisgICAgTV9TV0MzX0EsCisgICAgTV9TV0MzX0FCLAorICAgIE1fU1dMX0EsCisgICAgTV9TV0xfQUIsCisgICAgTV9TV1JfQSwKKyAgICBNX1NXUl9BQiwKKyAgICBNX1NVQl9JLAorICAgIE1fU1VCVV9JLAorICAgIE1fU1VCVV9JXzIsCisgICAgTV9URVFfSSwKKyAgICBNX1RHRV9JLAorICAgIE1fVEdFVV9JLAorICAgIE1fVExUX0ksCisgICAgTV9UTFRVX0ksCisgICAgTV9UTkVfSSwKKyAgICBNX1RSVU5DV0QsCisgICAgTV9UUlVOQ1dTLAorICAgIE1fVUxELAorICAgIE1fVUxEX0EsCisgICAgTV9VTEgsCisgICAgTV9VTEhfQSwKKyAgICBNX1VMSFUsCisgICAgTV9VTEhVX0EsCisgICAgTV9VTFcsCisgICAgTV9VTFdfQSwKKyAgICBNX1VTSCwKKyAgICBNX1VTSF9BLAorICAgIE1fVVNXLAorICAgIE1fVVNXX0EsCisgICAgTV9VU0QsCisgICAgTV9VU0RfQSwKKyAgICBNX1hPUl9JLAorICAgIE1fQ09QMCwKKyAgICBNX0NPUDEsCisgICAgTV9DT1AyLAorICAgIE1fQ09QMywKKyAgICBNX05VTV9NQUNST1MKK307CisKKworLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCisgICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCisgICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCisgICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCisgICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCisgICByZWdpc3RlcnMuCisKKyAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQorICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXM7CitleHRlcm4gc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXM7CitleHRlcm4gaW50IGJmZF9taXBzX251bV9vcGNvZGVzOworI2RlZmluZSBOVU1PUENPREVTIGJmZF9taXBzX251bV9vcGNvZGVzCisKKwwKKy8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBhZGRzIGRlZmluaXRpb25zIGZvciB0aGUgbWlwczE2IFRpbnlSSVNDCisgICBwcm9jZXNzb3IuICAqLworCisvKiBUaGVzZSBhcmUgdGhlIGJpdG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdXNlZCBmb3IgdGhlIGRpZmZlcmVudAorICAgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgT3RoZXIgdGhhbiBPUCwgbm8gbWFza3MgYXJlCisgICBwcm92aWRlZCBmb3IgdGhlIGZpeGVkIHBvcnRpb25zIG9mIGFuIGluc3RydWN0aW9uLCBzaW5jZSB0aGV5IGFyZQorICAgbm90IG5lZWRlZC4KKworICAgVGhlIEkgZm9ybWF0IHVzZXMgSU1NMTEuCisKKyAgIFRoZSBSSSBmb3JtYXQgdXNlcyBSWCBhbmQgSU1NOC4KKworICAgVGhlIFJSIGZvcm1hdCB1c2VzIFJYLCBhbmQgUlkuCisKKyAgIFRoZSBSUkkgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgSU1NNS4KKworICAgVGhlIFJSUiBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBSWi4KKworICAgVGhlIFJSSV9BIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTQuCisKKyAgIFRoZSBTSElGVCBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBTSEFNVC4KKworICAgVGhlIEk4IGZvcm1hdCB1c2VzIElNTTguCisKKyAgIFRoZSBJOF9NT1ZSMzIgZm9ybWF0IHVzZXMgUlkgYW5kIFJFR1IzMi4KKworICAgVGhlIElSX01PVjMyUiBmb3JtYXQgdXNlcyBSRUczMlIgYW5kIE1PVjMyWi4KKworICAgVGhlIEk2NCBmb3JtYXQgdXNlcyBJTU04LgorCisgICBUaGUgUkk2NCBmb3JtYXQgdXNlcyBSWSBhbmQgSU1NNS4KKyAgICovCisKKyNkZWZpbmUgTUlQUzE2T1BfTUFTS19PUAkweDFmCisjZGVmaW5lIE1JUFMxNk9QX1NIX09QCQkxMQorI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTExCTB4N2ZmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTExCTAKKyNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWAkweDcKKyNkZWZpbmUgTUlQUzE2T1BfU0hfUlgJCTgKKyNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU04CTB4ZmYKKyNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NOAkwCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfUlkJMHg3CisjZGVmaW5lIE1JUFMxNk9QX1NIX1JZCQk1CisjZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNQkweDFmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTUJMAorI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JaCTB4NworI2RlZmluZSBNSVBTMTZPUF9TSF9SWgkJMgorI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTQJMHhmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTQJMAorI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFR1IzMgkweDFmCisjZGVmaW5lIE1JUFMxNk9QX1NIX1JFR1IzMgkwCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfUkVHMzJSCTB4MWYKKyNkZWZpbmUgTUlQUzE2T1BfU0hfUkVHMzJSCTMKKyNkZWZpbmUgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIoaSkgKCgoKGkpID4+IDUpICYgNykgfCAoKGkpICYgMHgxOCkpCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfTU9WRTMyWgkweDcKKyNkZWZpbmUgTUlQUzE2T1BfU0hfTU9WRTMyWgkwCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNgkweDNmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTYJNQorCisvKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KKyAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCisgICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncworICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0CisgICB3aGVuIGRpc2Fzc2VtYmxpbmcuCisKKyAgICJ5IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWSkKKyAgICJ4IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWCkKKyAgICJ6IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWikKKyAgICJaIiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9NT1ZFMzJaKQorICAgInYiIDMgYml0IHNhbWUgcmVnaXN0ZXIgYXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoTUlQUzE2T1BfKl9SWCkKKyAgICJ3IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlkpCisgICAiMCIgemVybyByZWdpc3RlciAoJDApCisgICAiUyIgc3RhY2sgcG9pbnRlciAoJHNwIG9yICQyOSkKKyAgICJQIiBwcm9ncmFtIGNvdW50ZXIKKyAgICJSIiByZXR1cm4gYWRkcmVzcyByZWdpc3RlciAoJHJhIG9yICQzMSkKKyAgICJYIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFR1IzMikKKyAgICJZIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFRzMyUikKKyAgICI2IiA2IGJpdCB1bnNpZ25lZCBicmVhayBjb2RlIChNSVBTMTZPUF8qX0lNTTYpCisgICAiYSIgMjYgYml0IGp1bXAgYWRkcmVzcworICAgImUiIDExIGJpdCBleHRlbnNpb24gdmFsdWUKKyAgICJsIiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBpbnN0cnVjdGlvbgorICAgIkwiIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgaW5zdHJ1Y3Rpb24KKworICAgVGhlIHJlbWFpbmluZyBjb2RlcyBtYXkgYmUgZXh0ZW5kZWQuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIG5vdGVkLAorICAgdGhlIGZ1bGwgZXh0ZW5kZWQgb3BlcmFuZCBpcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUuCisgICAiPCIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JaKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKKyAgICI+IiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlgpIChmdWxsIDUgYml0IHVuc2lnbmVkKQorICAgIlsiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCisgICAiXSIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA2IGJpdCB1bnNpZ25lZCkKKyAgICI0IiA0IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU00KSAoZnVsbCAxNSBiaXQgc2lnbmVkKQorICAgIjUiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKKyAgICJIIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAyIChNSVBTMTZPUF8qX0lNTTUpCisgICAiVyIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU01KQorICAgIkQiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NNSkKKyAgICJqIiA1IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU01KQorICAgIjgiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkKKyAgICJWIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA0IChNSVBTMTZPUF8qX0lNTTgpCisgICAiQyIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU04KQorICAgIlUiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkgKGZ1bGwgMTYgYml0IHVuc2lnbmVkKQorICAgImsiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCisgICAiSyIgOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKKyAgICJwIiA4IGJpdCBjb25kaXRpb25hbCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU04KQorICAgInEiIDExIGJpdCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU0xMSkKKyAgICJBIiA4IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogNCAoTUlQUzE2T1BfKl9JTU04KQorICAgIkIiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA4IChNSVBTMTZPUF8qX0lNTTUpCisgICAiRSIgNSBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NNSkKKyAgICovCisKKy8qIEZvciB0aGUgbWlwczE2LCB3ZSB1c2UgdGhlIHNhbWUgb3Bjb2RlIHRhYmxlIGZvcm1hdCBhbmQgYSBmZXcgb2YKKyAgIHRoZSBzYW1lIGZsYWdzLiAgSG93ZXZlciwgbW9zdCBvZiB0aGUgZmxhZ3MgYXJlIGRpZmZlcmVudC4gICovCisKKy8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JYLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWAkJICAgIDB4MDAwMDAwMDEKKy8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWQkJICAgIDB4MDAwMDAwMDIKKy8qIE1vZGlmaWVzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JaLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfWgkJICAgIDB4MDAwMDAwMDQKKy8qIE1vZGlmaWVzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfVAkJICAgIDB4MDAwMDAwMDgKKy8qIE1vZGlmaWVzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCisjZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1NQCQkgICAgMHgwMDAwMDAxMAorLyogTW9kaWZpZXMgdGhlIFJBICgkMzEpIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfMzEJCSAgICAweDAwMDAwMDIwCisvKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHMzJSLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kJCSAgICAweDAwMDAwMDQwCisvKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCisjZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWAkJICAgIDB4MDAwMDAwODAKKy8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JZLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9ZCQkgICAgMHgwMDAwMDEwMAorLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfTU9WRTMyWi4gICovCisjZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWgkJICAgIDB4MDAwMDAyMDAKKy8qIFJlYWRzIHRoZSBUICgkMjQpIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9UCQkgICAgMHgwMDAwMDQwMAorLyogUmVhZHMgdGhlIFNQICgkMjkpIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9TUAkJICAgIDB4MDAwMDA4MDAKKy8qIFJlYWRzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCisjZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfMzEJCSAgICAweDAwMDAxMDAwCisvKiBSZWFkcyB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9QQwkJICAgIDB4MDAwMDIwMDAKKy8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SRUdSMzIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX0dQUl9YCQkgICAgMHgwMDAwNDAwMAorLyogSXMgYSBicmFuY2ggaW5zbi4gKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fQlJBTkNIICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisvKiBUaGUgZm9sbG93aW5nIGZsYWdzIGhhdmUgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBtaXBzMTYgb3Bjb2RlCisgICB0YWJsZToKKyAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQorICAgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQorICAgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkgKG5ldmVyIHVzZWQpCisgICBJTlNOX1JFQURfSEkKKyAgIElOU05fUkVBRF9MTworICAgSU5TTl9XUklURV9ISQorICAgSU5TTl9XUklURV9MTworICAgSU5TTl9UUkFQCisgICBJTlNOX0lTQTMKKyAgICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwczE2X29wY29kZXNbXTsKK2V4dGVybiBjb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKKworI2VuZGlmIC8qIF9NSVBTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmYTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL21uMTAyMDAuaApAQCAtMCwwICsxLDExMCBAQAorLyogbW4xMDIwMC5oIC0tIEhlYWRlciBmaWxlIGZvciBNYXRzdXNoaXRhIDEwMjAwIG9wY29kZSB0YWJsZQorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEplZmYgTGF3LCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE1OMTAyMDBfSAorI2RlZmluZSBNTjEwMjAwX0gKKworLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUuICAqLworCitzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAorICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisKKyAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKKyAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCisgICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKKyAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBvcGNvZGUuICAqLworICB1bnNpZ25lZCBjaGFyIGZvcm1hdDsKKworICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCisgICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKKyAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOworfTsKKworLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQorICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCisgICBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSBtbjEwMjAwX29wY29kZXNbXTsKK2V4dGVybiBjb25zdCBpbnQgbW4xMDIwMF9udW1fb3Bjb2RlczsKKworDAorLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMjAwX29wZXJhbmQuICAqLworCitzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kCit7CisgIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCisgIGludCBiaXRzOworCisgIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCisgIGludCBzaGlmdDsKKworICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCisgIGludCBmbGFnczsKK307CisKKy8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KKyAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgbW4xMDIwMF9vcGNvZGVzIHRhYmxlLiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgbW4xMDIwMF9vcGVyYW5kc1tdOworCisvKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IG1uMTAyMDBfb3BlcmFuZC4gICovCisjZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9EUkVHIDB4MQorCisjZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9BUkVHIDB4MgorCisjZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QU1cgMHg0CisKKyNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX01EUiAweDgKKworI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIDB4MTAKKworI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUFJPTU9URSAweDIwCisKKyNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BBUkVOIDB4NDAKKworI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUkVQRUFURUQgMHg4MAorCisjZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCAweDEwMAorCisjZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLIDB4MjAwCisKKyNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIDB4NDAwCisKKyNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX01FTUFERFIgMHg4MDAKKworI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUkVMQVggMHgxMDAwCisKKyNkZWZpbmUgRk1UXzEgMQorI2RlZmluZSBGTVRfMiAyCisjZGVmaW5lIEZNVF8zIDMKKyNkZWZpbmUgRk1UXzQgNAorI2RlZmluZSBGTVRfNSA1CisjZGVmaW5lIEZNVF82IDYKKyNkZWZpbmUgRk1UXzcgNworI2VuZGlmIC8qIE1OMTAyMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oIGIvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTRiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qIG1uMTAzMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDMwMCBvcGNvZGUgdGFibGUKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBNTjEwMzAwX0gKKyNkZWZpbmUgTU4xMDMwMF9ICisKKy8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAzMDBfb3Bjb2RlLiAgKi8KKworI2RlZmluZSBNTjEwMzAwX01BWF9PUEVSQU5EUyA4CitzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAorICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisKKyAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKKyAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCisgICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKKyAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIC8qIEEgYml0bWFzay4gIEZvciBlYWNoIG9wZXJhbmQsIG5vbnplcm8gaWYgaXQgbXVzdCBub3QgaGF2ZSB0aGUgc2FtZQorICAgICByZWdpc3RlciBzcGVjaWZpY2F0aW9uIGFzIGFsbCBvdGhlciBvcGVyYW5kcyB3aXRoIGEgbm9uemVybyBiaXQgaW4KKyAgICAgdGhpcyBmbGFnLiAgaWUgMHg4MSB3b3VsZCBpbmRpY2F0ZSB0aGF0IG9wZXJhbmRzIDcgYW5kIDAgbXVzdCBub3QKKyAgICAgbWF0Y2guICBOb3RlIHRoYXQgd2UgY291bnQgb3BlcmFuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZXkgYXBwZWFyCisgICAgIGluIHRoZSBvcGVyYW5kcyBzcGVjaWZpY2F0aW9uIGJlbG93LiAgKi8KKyAgdW5zaWduZWQgaW50IG5vX21hdGNoX29wZXJhbmRzOworCisgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBvcGNvZGUuICAqLworICB1bnNpZ25lZCBjaGFyIGZvcm1hdDsKKworICAvKiBCaXRtYXNrIGluZGljYXRpbmcgd2hhdCBjcHUgdmFyaWFudHMgdGhpcyBvcGNvZGUgaXMgYXZhaWxhYmxlIG9uLgorICAgICBXZSBhc3N1bWUgbW4xMDMwMCBiYXNlIG9wY29kZXMgYXJlIGF2YWlsYWJsZSBldmVyeXdoZXJlLCBzbyB3ZSBvbmx5CisgICAgIGhhdmUgdG8gbm90ZSBvcGNvZGVzIHdoaWNoIGFyZSBhdmFpbGFibGUgb24gb3RoZXIgdmFyaWFudHMuICAqLworICB1bnNpZ25lZCBpbnQgbWFjaGluZTsKKworICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCisgICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKKyAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKK307CisKKy8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKKyAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgorICAgaW5zdHJ1Y3Rpb25zLiAgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXM7CisKKwwKKy8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kLiAgKi8KKworc3RydWN0IG1uMTAzMDBfb3BlcmFuZAoreworICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLworICBpbnQgYml0czsKKworICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBpbnQgc2hpZnQ7CisKKyAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLworICBpbnQgZmxhZ3M7Cit9OworCisvKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCisgICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAzMDBfb3Bjb2RlcyB0YWJsZS4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kIG1uMTAzMDBfb3BlcmFuZHNbXTsKKworLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRFJFRyAweDEKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfQVJFRyAweDIKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1AgMHg0CisKKyNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BTVyAweDgKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTURSIDB4MTAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIDB4MjAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSAweDQwCisKKyNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BBUkVOIDB4ODAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQgMHgxMDAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQgMHgyMDAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgMHg0MDAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QgMHg4MDAKKworI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUENSRUwgMHgxMDAwCisKKyNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX01FTUFERFIgMHgyMDAwCisKKyNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIDB4NDAwMAorCisKKy8qIE9wY29kZSBGb3JtYXRzLiAgKi8KKyNkZWZpbmUgRk1UX1MwIDEKKyNkZWZpbmUgRk1UX1MxIDIKKyNkZWZpbmUgRk1UX1MyIDMKKyNkZWZpbmUgRk1UX1M0IDQKKyNkZWZpbmUgRk1UX1M2IDUKKyNkZWZpbmUgRk1UX0QwIDYKKyNkZWZpbmUgRk1UX0QxIDcKKyNkZWZpbmUgRk1UX0QyIDgKKyNkZWZpbmUgRk1UX0Q0IDkKKyNkZWZpbmUgRk1UX0Q1IDEwCisKKy8qIFZhcmlhbnRzIG9mIHRoZSBtbjEwMzAwIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBvcGNvZGVzLiAgKi8KKyNkZWZpbmUgTU4xMDMgMzAwCisjZGVmaW5lIEFNMzAgIDMwMAorCisKKyNlbmRpZiAvKiBNTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25wMS5oIGIvaW5jbHVkZS9vcGNvZGUvbnAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzYWRjNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL25wMS5oCkBAIC0wLDAgKzEsNDIyIEBACisvKiBQcmludCBHT1VMRCBOUEwgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitzdHJ1Y3QgZ2xkX29wY29kZQoreworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBsb25nIG9wY29kZTsKKyAgdW5zaWduZWQgbG9uZyBtYXNrOworICBjaGFyICphcmdzOworICBpbnQgbGVuZ3RoOworfTsKKworLyogV2Ugc3RvcmUgZm91ciBieXRlcyBvZiBvcGNvZGUgZm9yIGFsbCBvcGNvZGVzIGJlY2F1c2UgdGhhdAorICAgaXMgdGhlIG1vc3QgYW55IG9mIHRoZW0gbmVlZC4gIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uCisgICBpcyBhbHdheXMgYXQgbGVhc3QgMiBieXRlcywgYW5kIGF0IG1vc3QgZm91ci4gIFRoZSBsZW5ndGggb2YgdGhlCisgICBpbnN0cnVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3Bjb2RlLgorCisgICBUaGUgbWFzayBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2gKKyAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQorICAgb2YgdGhhdCBvcGNvZGUuCisKKyAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMKKyAgIHRoYXQgYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLiAqLworCisvKiBLaW5kcyBvZiBvcGVyYW5kczoKKyAgIHIgIFJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCisgICBSICBSZWdpc3RlciBpbiBzZWNvbmQgZmllbGQKKyAgIGIgIEJhc2UgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKKyAgIEIgIEJhc2UgcmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCisgICB2ICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKKyAgIFYgIFZlY3RvciByZWdpc3RlciBpbiBmaXJzdCBmaWVsZAorICAgQSAgT3B0aW9uYWwgYWRkcmVzcyByZWdpc3RlciAoYmFzZSByZWdpc3RlcikKKyAgIFggIE9wdGlvbmFsIGluZGV4IHJlZ2lzdGVyCisgICBJICBJbW1lZGlhdGUgZGF0YSAoMTZiaXRzIHNpZ25lZCkKKyAgIE8gIE9mZnNldCBmaWVsZCAoMTZiaXRzIHNpZ25lZCkKKyAgIGggIE9mZnNldCBmaWVsZCAoMTViaXRzIHNpZ25lZCkKKyAgIGQgIE9mZnNldCBmaWVsZCAoMTRiaXRzIHNpZ25lZCkKKyAgIFMgIFNoaWZ0IGNvdW50IGZpZWxkCisKKyAgIGFueSBvdGhlciBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGFzIGlzLi4uCisqLworCisvKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgdGhpcyBhcnJheSBiZSBzb3J0ZWQgYXMgZm9sbG93czoKKyAgIGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZSBjb25zZWN1dGl2ZS4KKyAgIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMKKyAgIG11c3QgYmUgY29uc2VjdXRpdmUuCisgKi8KK3N0cnVjdCBnbGRfb3Bjb2RlIGdsZF9vcGNvZGVzW10gPQoreworeyAibGIiLAkJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsbmIiLAkweGI4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImxicyIsCTB4ZWMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibGgiLAkJMHhiNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCit7ICJsbmgiLAkweGI4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImx3IiwJCTB4YjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibG53IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsZCIsCQkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImxuZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAibGkiLAkJMHhmODAwMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCit7ICJscGEiLAkweDUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImxhIiwJCTB4NTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibGFiciIsCTB4NTgwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoreyAibGJwIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsaHAiLAkweDkwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImx3cCIsCTB4OTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibGRwIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJzdWFiciIsCTB4NTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoreyAibGYiLAkJMHhiYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsZmJyIiwJMHhiYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCit7ICJsd2JyIiwJMHg1YzAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCit7ICJzdGIiLAkweGQ0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAic3R3IiwJMHhkNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RmYnIiLAkweGRjMDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKK3sgInN0d2JyIiwJMHg1NDAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCit7ICJ6bWIiLAkweGQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInptaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAiem13IiwJMHhkODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJ6bWQiLAkweGQ4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgInN0YnAiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN0aHAiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgInN0d3AiLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN0ZHAiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImxpbCIsCTB4ZjgwYjAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEQiLAkJNCB9LAoreyAibHdzbDEiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImx3c2wyIiwJMHhmYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsd3NsMyIsCTB4ZmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAorCit7ICJsdmIiLAkweGIwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKK3sgImx2aCIsCTB4YjAwMDAwMDEsCTB4ZmMwODAwMDEsCSJ2LHhPQSxYIiwJNCB9LAoreyAibHZ3IiwJMHhiMDAwMDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCit7ICJsdmQiLAkweGIwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKK3sgImxpdiIsCTB4M2MwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAibGl2ZiIsCTB4M2MwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAic3R2YiIsCTB4ZDAwODAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoreyAic3R2aCIsCTB4ZDAwMDAwMDEsCTB4ZmMwODAwMDEsCSJ2LHhPQSxYIiwJNCB9LAoreyAic3R2dyIsCTB4ZDAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoreyAic3R2ZCIsCTB4ZDAwMDAwMDIsCTB4ZmMwODAwMDIsCSJ2LHhPQSxYIiwJNCB9LAorCit7ICJ0cnIiLAkweDJjMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInRybiIsCTB4MmMwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHJuZCIsCTB4MmMwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHJhYnMiLAkweDJjMDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInRyYWJzZCIsCTB4MmMwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ4Y3IiLAkweDI4MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImN4Y3IiLAkweDJjMDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImN4Y3JkIiwJMHgyYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCit7ICJ0cmJyIiwJMHgyODAzMDAwMCwJMHhmYzBmMDAwMCwJImIsUiIsCQkyIH0sCit7ICJ4Y2JyIiwJMHgyODAyMDAwMCwJMHhmYzBmMDAwMCwJImIsQiIsCQkyIH0sCit7ICJ0YnJiciIsCTB4MjgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAorCit7ICJ0cnZ2IiwJMHgyODA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJ0cnZ2biIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAidHJ2dm5kIiwJMHgyYzBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJ0cnZhYiIsCTB4MmMwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAidHJ2YWJkIiwJMHgyYzBmMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJjbXB2IiwJMHgxNDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJleHB2IiwJMHgxNDA3MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJtcnZ2bHQiLAkweDEwMDMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgIm1ydnZsZSIsCTB4MTAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAibXJ2dmd0IiwJMHgxNDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJtcnZ2Z2UiLAkweDE0MDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgIm1ydnZlcSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAibXJ2dm5lIiwJMHgxMDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJtcnZybHQiLAkweDEwMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgIm1ydnJsZSIsCTB4MTAwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAibXJ2cmd0IiwJMHgxNDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJtcnZyZ2UiLAkweDE0MGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgIm1ydnJlcSIsCTB4MTAwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAibXJ2cm5lIiwJMHgxNDBmMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJ0cnZyIiwJMHgxNDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJ0cnJ2IiwJMHgxNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCisKK3sgImJ1IiwJCTB4NDAwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImJucyIsCTB4NzAwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImJuY28iLAkweDcwODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJiZ2UiLAkweDcxMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJibmUiLAkweDcxODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJidW5nZSIsCTB4NzIwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImJ1bmxlIiwJMHg3Mjg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAiYmd0IiwJMHg3MzA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAiYm5hbnkiLAkweDczODgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJicyIJLAkweDcwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJiY28iLAkweDcwODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJibHQiLAkweDcxMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJiZXEiLAkweDcxODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJidWdlIiwJMHg3MjAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAiYnVsdCIsCTB4NzI4MDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImJsZSIsCTB4NzMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImJhbnkiLAkweDczODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJicmxuayIsCTB4NDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiYmliIiwJMHg0ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJiaWgiLAkweDQ4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImJpdyIsCTB4NGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiYmlkIiwJMHg0YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJiaXZiIiwJMHg2MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJiaXZoIiwJMHg2MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJiaXZ3IiwJMHg2NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJiaXZkIiwJMHg2NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJidnNiIiwJMHg2ODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJidnNoIiwJMHg2ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJidnN3IiwJMHg2YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJidnNkIiwJMHg2YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCisKK3sgImNhbWIiLAkweDgwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImNhbWgiLAkweDgwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImNhbXciLAkweDgwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImNhbWQiLAkweDgwMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImNhciIsCTB4MTAwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiY2FyZCIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiY2kiLAkJMHhmODA1MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCit7ICJjaGtibmQiLAkweDVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKKworeyAiY2F2diIsCTB4MTAwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAiY2F2ciIsCTB4MTAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAiY2F2dmQiLAkweDEwMDkwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgImNhdnJkIiwJMHgxMDBiMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCisKK3sgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiYW5pIiwJMHhmODA4MDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCit7ICJvcm1iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJvcm1oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCit7ICJvcm13IiwJMHhiODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJvcm1kIiwJMHhiODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJvcnIiLAkweDA4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgIm9pIiwJCTB4ZjgwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJlb2kiLAkweGY4MGEwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKKworeyAiYW52diIsCTB4MDQwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAiYW52ciIsCTB4MDQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAib3J2diIsCTB4MDgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAib3J2ciIsCTB4MDgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAiZW92diIsCTB4MGMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAiZW92ciIsCTB4MGMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAorCit7ICJzYWN6IiwJMHgxMDBjMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzbGEiLAkweDFjNDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKK3sgInNsbCIsCTB4MWM2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoreyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzbGFkIiwJMHgyMDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzbGxkIiwJMHgyMDYwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzcmEiLAkweDFjMDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKK3sgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoreyAic3JjIiwJMHgyNDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzcmxkIiwJMHgyMDIwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzZGEiLAkweDNjMDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInNkbCIsCTB4M2MwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAic2RjIiwJMHgzYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzZGFkIiwJMHgzYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzZGxkIiwJMHgzYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCisKK3sgInN2ZGEiLAkweDNjMDcwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgInN2ZGwiLAkweDNjMDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgInN2ZGMiLAkweDNjMDUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgInN2ZGFkIiwJMHgzYzBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJzdmRsZCIsCTB4M2MwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAorCit7ICJzYm0iLAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKK3sgInpibSIsCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoreyAidGJtIiwJMHhhODA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCit7ICJpbmNtYiIsCTB4YTAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImluY21oIiwJMHhhMDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAiaW5jbXciLAkweGE0MDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJpbmNtZCIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgInNibWQiLAkweDdjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInpibWQiLAkweDdjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInRibWQiLAkweDc4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKKworeyAic3NtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCit7ICJ6c20iLAkweDljMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKK3sgInRzbSIsCTB4OTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAorCit7ICJhZG1iIiwJMHhjODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJhZG1oIiwJMHhjODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCit7ICJhZG13IiwJMHhjODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJhZG1kIiwJMHhjODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJhZHIiLAkweDM4MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImFybWIiLAkweGU4MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFybWgiLAkweGU4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImFybXciLAkweGU4MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFybWQiLAkweGU4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImFkaSIsCTB4ZjgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAic3VtYiIsCTB4Y2MwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3VtaCIsCTB4Y2MwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAic3VtdyIsCTB4Y2MwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3VtZCIsCTB4Y2MwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAic3VyIiwJMHgzYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzdWkiLAkweGY4MDIwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKK3sgIm1wbWIiLAkweGMwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgIm1wbWgiLAkweGMwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgIm1wbXciLAkweGMwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgIm1wciIsCTB4MzgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAibXByZCIsCTB4M2MwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAibXBpIiwJMHhmODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCit7ICJkdm1iIiwJMHhjNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJkdm1oIiwJMHhjNDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCit7ICJkdm13IiwJMHhjNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJkdnIiLAkweDM4MGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImR2aSIsCTB4ZjgwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAiZXhzIiwJMHgzODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCisKK3sgImFkdnYiLAkweDMwMDAwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgImFkdnZkIiwJMHgzMDA4MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJhZHJ2IiwJMHgzNDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJhZHJ2ZCIsCTB4MzQwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAic3V2diIsCTB4MzAwMTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAic3V2dmQiLAkweDMwMDkwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgInN1cnYiLAkweDM0MDEwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgInN1cnZkIiwJMHgzNDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJtcHZ2IiwJMHgzMDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJtcHJ2IiwJMHgzNDAyMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCisKK3sgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImFkcmZ3IiwJMHgzODAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAic3VyZnciLAkweGUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN1cmZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJzdXJmdyIsCTB4MzgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgIm1wcmZ3IiwJMHgzODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAicmZ3IiwJMHhlNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJyZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgInJyZnciLAkweDBjMGUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCit7ICJycmZkIiwJMHgwYzBmMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAorCit7ICJhZHZ2ZnciLAkweDMwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgImFkdnZmZCIsCTB4MzAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAiYWRydmZ3IiwJMHgzNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJhZHJ2ZmQiLAkweDM0MGMwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgInN1dnZmdyIsCTB4MzAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAic3V2dmZkIiwJMHgzMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJzdXJ2ZnciLAkweDM0MDUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKK3sgInN1cnZmZCIsCTB4MzQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAibXB2dmZ3IiwJMHgzMDA2MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJtcHZ2ZmQiLAkweDMwMGUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgIm1wcnZmdyIsCTB4MzQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoreyAibXBydmZkIiwJMHgzNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCit7ICJydmZ3IiwJMHgzMDA3MDAwMCwJMHhmYzBmMDAwMCwJInYiLAkJMiB9LAoreyAicnZmZCIsCTB4MzAwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKKworeyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiY2ZwZHMiLAkweDNjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKKworeyAiZmx0dnciLAkweDA4MGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgImZsdHZkIiwJMHgwODBmMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCit7ICJmaXh2dyIsCTB4MDgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoreyAiZml4dmQiLAkweDA4MGUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKK3sgImNmcHZkcyIsCTB4MGMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAorCit7ICJvcnZybiIsCTB4MDAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoreyAiYW5kdnJuIiwJMHgwMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJmcnN0ZXEiLAkweDA0MDkwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKK3sgInNpZ21hIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJzaWdtYWQiLAkweDBjMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKK3sgInNpZ21mIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJzaWdtZmQiLAkweDA4MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKK3sgInByb2RmIiwJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJwcm9kZmQiLAkweDA0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKK3sgIm1heHYiLAkweDEwMDgwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKK3sgIm1heHZkIiwJMHgxMDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJtaW52IiwJMHgxNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCit7ICJtaW52ZCIsCTB4MTQwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAorCit7ICJscHNkIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAibGRjIiwJMHhmMDA4MDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAic3BtIiwJMHgwNDBjMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAicnBtIiwJMHgwNDBkMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAidHJpdHIiLAkweDAwMDcwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCit7ICJ0cnJpdCIsCTB4MDAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKK3sgInJwc3d0IiwJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAiZXhyIiwJMHhmODA3MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQk0IH0sCit7ICJoYWx0IiwJMHgwMDAwMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCit7ICJ3YWl0IiwJMHgwMDAxMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCit7ICJub3AiLAkweDAwMDIwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgImVpYWUiLAkweDAwMDMwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgImVmYWUiLAkweDAwMGQwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgImRpYWUiLAkweDAwMGUwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgImRmYWUiLAkweDAwMGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgInNwdmMiLAkweGY4MDYwMDAwLAkweGZjMGYwMDAwLAkicixULE4iLAk0IH0sCit7ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKK3sgInNldGNwdSIsCTB4MDAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKK3sgImNtYyIsCTB4MDAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKK3sgInRycmN1IiwJMHgwMDA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAiYXR0bmlvIiwJMHgwMDA1MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCit7ICJmdWRpdCIsCTB4MjgwODAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoreyAiYnJlYWsiLAkweDI4MDkwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgImZyenNzIiwJMHgyODBhMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCit7ICJyaXBpIiwJMHgwNDA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ4Y3AiLAkweDA0MDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCit7ICJibG9jayIsCTB4MDQwNjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoreyAidW5ibG9jayIsCTB4MDQwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoreyAidHJzYyIsCTB4MDgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHNjciIsCTB4MDgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZnEiLAkJMHgwNDA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAiZmx1cHRlIiwJMHgyYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAicnZpdSIsCTB4MDQwZjAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoreyAibGRlbCIsCTB4MjgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAibGR1IiwJMHgyODBkMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzdGRlY2MiLAkweDI4MGIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInRycGMiLAkweDA4MDQwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCit7ICJ0cGNyIiwJMHgwODA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAiZ2hhbHQiLAkweDBjMDUwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCit7ICJncnVuIiwJMHgwYzA0MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCit7ICJ0bXByIiwJMHgyYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ0cm1wIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCisKK3sgInRycnZlIiwJMHgyODA2MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoreyAidHJ2ZXIiLAkweDI4MDcwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCit7ICJ0cnZsciIsCTB4MjgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKKworeyAibGlua2ZsIiwJMHgxODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJsaW5rYmwiLAkweDE4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImxpbmtmcCIsCTB4MTgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAibGlua2JwIiwJMHgxODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJsaW5rcGwiLAkweDE4MDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInVsaW5rbCIsCTB4MTgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidWxpbmtwIiwJMHgxODA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ1bGlua3RsIiwJMHgxODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ1bGlua3RwIiwJMHgxODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit9OworCitpbnQgbnVtb3Bjb2RlcyA9IHNpemVvZihnbGRfb3Bjb2RlcykgLyBzaXplb2YoZ2xkX29wY29kZXNbMF0pOworCitzdHJ1Y3QgZ2xkX29wY29kZSAqZW5kb3AgPSBnbGRfb3Bjb2RlcyArIHNpemVvZihnbGRfb3Bjb2RlcykgLworCQkgCQlzaXplb2YoZ2xkX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbnMzMmsuaCBiL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiYjhiOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKQEAgLTAsMCArMSw0OTEgQEAKKy8qIG5zMzJrLW9wY29kZS5oIC0tIE9wY29kZSB0YWJsZSBmb3IgTmF0aW9uYWwgU2VtaSAzMmsgcHJvY2Vzc29yCisgICBDb3B5cmlnaHQgKEMpIDE5ODcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCisKK0dBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaWZkZWYgU0VRVUVOVF9DT01QQVRBQklMSVRZCisjZGVmaW5lIERFRl9NT0RFQyAyMAorI2RlZmluZSBERUZfTU9ERUwgMjEKKyNlbmRpZgorCisjaWZuZGVmIERFRl9NT0RFQworI2RlZmluZSBERUZfTU9ERUMgMjAKKyNlbmRpZgorCisjaWZuZGVmIERFRl9NT0RFTAorI2RlZmluZSBERUZfTU9ERUwgMjAKKyNlbmRpZgorLyoKKyAgIEFmdGVyIGRlY2lkaW5nIHRoZSBpbnN0cnVjdGlvbiBlbnRyeSAodmlhIGhhc2guYykgdGhlIGluc3RydWN0aW9uIHBhcnNlcgorICAgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIG9wZXJhbmRzIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgcmVxdWlyZWQgc2V0CisgICBnaXZlbiBpbiB0aGUgZW50cnkgb3BlcmFuZGZpZWxkLiBFdmVyeSBvcGVyYW5kIHdpbGwgcmVzdWx0IGluIGEgY2hhbmdlIGluCisgICB0aGUgb3Bjb2RlIG9yIHRoZSBhZGRpdGlvbiBvZiBkYXRhIHRvIHRoZSBvcGNvZGUuCisgICBUaGUgb3BlcmFuZHMgaW4gdGhlIHNvdXJjZSBpbnN0cnVjdGlvbiBhcmUgY2hlY2tlZCBmb3IgaW5jb25zaXN0ZW50CisgICBzZW1hbnRpY3MuCisgCisJRiA6IDMyIGJpdCBmbG9hdAlnZW5lcmFsIGZvcm0KKwlMIDogNjQgYml0IGZsb2F0CSAgICAiCisJQiA6IGJ5dGUJCSAgICAiCisJVyA6IHdvcmQJCSAgICAiCisJRCA6IGRvdWJsZS13b3JkCQkgICAgIgorCUEgOiBkb3VibGUtd29yZAkJZ2VuLWFkZHJlc3MtZm9ybSBpZSBubyByZWdzLCBubyBpbW1lZGlhdGUKKwlJIDogaW50ZWdlciB3cml0ZWFibGUgICBnZW4gaW50IGV4Y2VwdCBpbW1lZGlhdGUgKEEgKyByZWcpCisJWiA6IGZsb2F0aW5nIHdyaXRlYWJsZQlnZW4gZmxvYXQgZXhjZXB0IGltbWVkaWF0ZSAoWiArIGZyZWcpCisJZCA6IGRpc3BsYWNlbWVudAorCWIgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICBhY2IKKwlwIDogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAgYnIgYmNvbmQgYnNyIGN4cAorCXEgOiBxdWljaworCWkgOiBpbW1lZGlhdGUgKDggYml0cykKKwkgICAgVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBuczMyayBvcGVyYW5kdHlwZSwgaXQgaXMgdXNlZCB0byBidWlsZAorCSAgICBpbnN0cnVjdGlvbnMgbGlrZSAgICBzdmMgYXJnMSxhcmcyCisJICAgIFN2YyBpcyB0aGUgaW5zdHJ1Y3Rpb24gU3VwZXJWaXNvckNhbGwgYW5kIGlzIHNvbWV0aW1lcyB1c2VkIHRvCisJICAgIGNhbGwgT1Mtcm91dGluZXMgZnJvbSB1c2VybW9kZS4gU29tZSBhcmdzIG1pZ2h0IGJlIGhhbmR5IQorCXIgOiByZWdpc3RlciBudW1iZXIgKDMgYml0cykKKwlPIDogc2V0Y2ZnIGluc3RydWN0aW9uIG9wdGlvbnNsaXN0CisJQyA6IGNpbnYgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKKwlTIDogc3RyaW5naW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKKwlVIDogcmVnaXN0ZXJsaXN0CXNhdmUsZW50ZXIKKwl1IDogcmVnaXN0ZXJsaXN0CXJlc3RvcmUsZXhpdAorCU0gOiBtbXUgcmVnaXN0ZXIKKwlQIDogY3B1IHJlZ2lzdGVyCisJZyA6IDM6cmQgb3BlcmFuZCBvZiBpbnNzIG9yIGV4dHMgaW5zdHJ1Y3Rpb24KKwlHIDogNDp0aCBvcGVyYW5kIG9mIGluc3Mgb3IgZXh0cyBpbnN0cnVjdGlvbgorCSAgICBUaG9zZSBvcGVyYW5kcyBhcmUgZW5jb2RlZCBpbiB0aGUgc2FtZSBieXRlLgorCSAgICBUaGlzIGJ5dGUgaXMgcGxhY2VkIGxhc3QgaW4gdGhlIGluc3RydWN0aW9uLgorCWYgOiBvcGVyYW5kIG9mIHNmc3IKKwlIIDogc2VxdWVudC1oYWNrIGZvciBic3IgKFdhcm5pbmcpCisKK2NvbHVtbgkxIAlpbnN0cnVjdGlvbnMKKwkyIAludW1iZXIgb2YgYml0cyBpbiBvcGNvZGUuCisJMyAJbnVtYmVyIG9mIGJpdHMgaW4gb3Bjb2RlIGV4cGxpY2l0bHkKKwkJZGV0ZXJtaW5lZCBieSB0aGUgaW5zdHJ1Y3Rpb24gdHlwZS4KKwk0IAlvcGNvZGVzZWVkLCB0aGUgbnVtYmVyIHdlIGJ1aWxkIG91ciBvcGNvZGUKKwkJZnJvbS4KKwk1IAlvcGVyYW5kdHlwZXMsIHVzZWQgYnkgb3BlcmFuZHBhcnNlci4KKwk2IAlzaXplIGluIGJ5dGVzIG9mIGltbWVkaWF0ZQorKi8KK3N0cnVjdCBuczMya19vcGNvZGUgeworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBjaGFyIG9wY29kZV9pZF9zaXplOyAvKiBub3QgdXNlZCBieSB0aGUgYXNzZW1ibGVyICovCisgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX3NpemU7CisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlX3NlZWQ7CisgIGNoYXIgKm9wZXJhbmRzOworICB1bnNpZ25lZCBjaGFyIGltX3NpemU7CS8qIG5vdCB1c2VkIGJ5IGRpc3Nhc3NlbWJsZXIgKi8KKyAgY2hhciAqZGVmYXVsdF9hcmdzOwkJLyogZGVmYXVsdCB0byB0aG9zZSBhcmdzIHdoZW4gbm9uZSBnaXZlbiAqLworICBjaGFyIGRlZmF1bHRfbW9kZWM7CQkvKiBkZWZhdWx0IHRvIHRoaXMgYWRkci1tb2RlIHdoZW4gYW1iaWdvdXMKKwkJCQkgICBpZSB3aGVuIHRoZSBhcmd1bWVudCBvZiBhIGdlbmVyYWwgYWRkci1tb2RlCisJCQkJICAgaXMgYSBwbGFpbiBjb25zdGFudCAqLworICBjaGFyIGRlZmF1bHRfbW9kZWw7CQkvKiBpcyBhIHBsYWluIGxhYmVsICovCit9OworCisjaWZkZWYgY29tbWVudAorLyogVGhpcyBzZWN0aW9uIHdhcyBmcm9tIHRoZSBnZGIgdmVyc2lvbiBvZiB0aGlzIGZpbGUuICovCisKKyNpZm5kZWYgbnMzMmtfb3Bjb2RlVAorI2RlZmluZSBuczMya19vcGNvZGVUIGludAorI2VuZGlmIC8qIG5vIG5zMzJrX29wY29kZVQgKi8KKworc3RydWN0IG5vdF93b3QJCQkvKiBuczMyayBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KKwkJCQkvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLworeworICBpbnQgb2JpdHM7CQkvKiBudW1iZXIgb2Ygb3Bjb2RlIGJpdHMgKi8KKyAgaW50IGliaXRzOwkJLyogbnVtYmVyIG9mIGluc3RydWN0aW9uIGJpdHMgKi8KKyAgbnMzMmtfb3Bjb2RlVAljb2RlOwkvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLworICBjaGFyICphcmdzOwkJLyogaG93IHRvIGNvbXBpbGUgc2FpZCBvcGNvZGUgKi8KK307CisKK3N0cnVjdCBub3QJCQkvKiBuczMyayBvcGNvZGUgdGV4dCAqLworeworICBjaGFyICogICAgICAgICAgICBuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCisgIHN0cnVjdCBub3Rfd290ICAgIGRldGFpbDsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLworfTsKKworLyogSW5zdHJ1Y3Rpb25zIGxvb2sgbGlrZSB0aGlzOgorICAgIAorICAgYmFzaWMgaW5zdHJ1Y3Rpb24tLTEsIDIsIG9yIDMgYnl0ZXMKKyAgIGluZGV4IGJ5dGUgZm9yIG9wZXJhbmQgQSwgaWYgb3BlcmFuZCBBIGlzIGluZGV4ZWQtLTEgYnl0ZQorICAgaW5kZXggYnl0ZSBmb3Igb3BlcmFuZCBCLCBpZiBvcGVyYW5kIEIgaXMgaW5kZXhlZC0tMSBieXRlCisgICBhZGRyZXNzaW5nIGV4dGVuc2lvbiBmb3Igb3BlcmFuZCBBCisgICBhZGRyZXNzaW5nIGV4dGVuc2lvbiBmb3Igb3BlcmFuZCBCCisgICBpbXBsaWVkIG9wZXJhbmRzCisKKyAgIE9wZXJhbmQgQSBpcyB0aGUgb3BlcmFuZCBsaXN0ZWQgZmlyc3QgaW4gdGhlIGZvbGxvd2luZyBvcGNvZGUgdGFibGUuCisgICBPcGVyYW5kIEIgaXMgdGhlIG9wZXJhbmQgbGlzdGVkIHNlY29uZCBpbiB0aGUgZm9sbG93aW5nIG9wY29kZSB0YWJsZS4KKyAgIEFsbCBpbnN0cnVjdGlvbnMgaGF2ZSBhdCBtb3N0IDIgZ2VuZXJhbCBvcGVyYW5kcywgc28gdGhpcyBpcyBlbm91Z2guCisgICBUaGUgaW1wbGllZCBvcGVyYW5kcyBhcmUgYXNzb2NpYXRlZCB3aXRoIG9wZXJhbmRzIG90aGVyIHRoYW4gQSBhbmQgQi4KKworICAgRWFjaCBvcGVyYW5kIGhhcyBhIGRpZ2l0IGFuZCBhIGxldHRlci4KKyAgIAorICAgVGhlIGRpZ2l0IGdpdmVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UuICBUaGUgbGV0dGVyLAorICAgb25lIG9mIHRoZSBmb2xsb3dpbmcsIHRlbGxzIHVzIHdoYXQga2luZCBvZiBvcGVyYW5kIGl0IGlzLiAgKi8KKworLyogRiA6IDMyIGJpdCBmbG9hdAorICogTCA6IDY0IGJpdCBmbG9hdAorICogQiA6IGJ5dGUKKyAqIFcgOiB3b3JkCisgKiBEIDogZG91YmxlLXdvcmQKKyAqIEkgOiBpbnRlZ2VyIG5vdCBpbW1lZGlhdGUKKyAqIFogOiBmbG9hdGluZyBub3QgaW1tZWRpYXRlCisgKiBkIDogZGlzcGxhY2VtZW50CisgKiBxIDogcXVpY2sKKyAqIGkgOiBpbW1lZGlhdGUgKDggYml0cykKKyAqIHIgOiByZWdpc3RlciBudW1iZXIgKDMgYml0cykKKyAqIHAgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCisqLworCisKKyNlbmRpZiAvKiBjb21tZW50ICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3Bjb2RlIG5zMzJrX29wY29kZXNbXT0KK3sKKyAgeyAiYWJzZiIsCTE0LDI0LAkweDM1YmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFic2wiLAkxNCwyNCwJMHgzNGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhYnNiIiwJMTQsMjQsCTB4MzA0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYWJzdyIsCTE0LDI0LAkweDMxNGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFic2QiLAkxNCwyNCwJMHgzMzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhY2JiIiwJIDcsMTYsCTB4NGMsCSIySTFxM3AiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhY2J3IiwJIDcsMTYsCTB4NGQsCSIySTFxM3AiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhY2JkIiwJIDcsMTYsCTB4NGYsCSIySTFxM3AiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhZGRmIiwJMTQsMjQsCTB4MDFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYWRkbCIsCTE0LDI0LAkweDAwYmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZGIiLAkgNiwxNiwJMHgwMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYWRkdyIsCSA2LDE2LAkweDAxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhZGRkIiwJIDYsMTYsCTB4MDMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZGNiIiwJIDYsMTYsCTB4MTAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZGN3IiwJIDYsMTYsCTB4MTEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZGNkIiwJIDYsMTYsCTB4MTMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZHBiIiwJMTQsMjQsCTB4M2M0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYWRkcHciLAkxNCwyNCwJMHgzZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhZGRwZCIsCTE0LDI0LAkweDNmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZHFiIiwJIDcsMTYsCTB4MGMsCSIySTFxIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZHF3IiwJIDcsMTYsCTB4MGQsCSIySTFxIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZHFkIiwJIDcsMTYsCTB4MGYsCSIySTFxIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkZHIiLAkgNiwxNiwJMHgyNywJIjFBMkkiLAkJNCwJIiIsCTIxLDIxCX0sCisgIHsgImFkanNwYiIsCTExLDE2LAkweDA1N2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhZGpzcHciLAkxMSwxNiwJMHgwNTdkLAkiMVciLCAJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFkanNwZCIsCTExLDE2LAkweDA1N2YsCSIxRCIsIAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYW5kYiIsCSA2LDE2LAkweDI4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhbmR3IiwJIDYsMTYsCTB4MjksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFuZGQiLAkgNiwxNiwJMHgyYiwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYXNoYiIsCTE0LDI0LAkweDA0NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImFzaHciLAkxNCwyNCwJMHgwNTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJhc2hkIiwJMTQsMjQsCTB4MDc0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYmVxIiwJIDgsOCwJMHgwYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorICB7ICJibmUiLAkgOCw4LAkweDFhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCisgIHsgImJjcyIsCSA4LDgsCTB4MmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKKyAgeyAiYmNjIiwJIDgsOCwJMHgzYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorICB7ICJiaGkiLAkgOCw4LAkweDRhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCisgIHsgImJscyIsCSA4LDgsCTB4NWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKKyAgeyAiYmd0IiwJIDgsOCwJMHg2YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorICB7ICJibGUiLAkgOCw4LAkweDdhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCisgIHsgImJmcyIsCSA4LDgsCTB4OGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKKyAgeyAiYmZjIiwJIDgsOCwJMHg5YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorICB7ICJibG8iLAkgOCw4LAkweGFhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCisgIHsgImJocyIsCSA4LDgsCTB4YmEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKKyAgeyAiYmx0IiwJIDgsOCwJMHhjYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorICB7ICJiZ2UiLAkgOCw4LAkweGRhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCisgIHsgImJ1dCIsCSA4LDgsCTB4ZWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKKyAgeyAiYnVmIiwJIDgsOCwJMHhmYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorICB7ICJiaWNiIiwJIDYsMTYsCTB4MDgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImJpY3ciLAkgNiwxNiwJMHgwOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYmljZCIsCSA2LDE2LAkweDBiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJiaWNwc3JiIiwJMTEsMTYsCTB4MTdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYmljcHNydyIsCTExLDE2LAkweDE3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImJpc3BzcmIiLAkxMSwxNiwJMHgzN2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJiaXNwc3J3IiwJMTEsMTYsCTB4MzdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiYnB0IiwJIDgsOCwJMHhmMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJiciIsCSA4LDgsCTB4ZWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKKyNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKKyAgeyAiYnNyIiwJIDgsOCwJMHgwMiwJIjFIIiwJCTAsCSIiLAkyMSwyMQl9LAorI2Vsc2UKKyAgeyAiYnNyIiwJIDgsOCwJMHgwMiwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAorI2VuZGlmCisgIHsgImNhc2ViIiwJMTEsMTYsCTB4NzdjLAkiMUIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY2FzZXciLAkxMSwxNiwJMHg3N2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjYXNlZCIsCTExLDE2LAkweDc3ZiwJIjFEIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNiaXRiIiwJMTQsMjQsCTB4MDg0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY2JpdHciLAkxNCwyNCwJMHgwOTRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjYml0ZCIsCTE0LDI0LAkweDBiNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNiaXRpYiIsCTE0LDI0LAkweDBjNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNiaXRpdyIsCTE0LDI0LAkweDBkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNiaXRpZCIsCTE0LDI0LAkweDBmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNoZWNrYiIsCTExLDI0LAkweDBlZSwJIjJBM0IxciIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNoZWNrdyIsCTExLDI0LAkweDFlZSwJIjJBM1cxciIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNoZWNrZCIsCTExLDI0LAkweDNlZSwJIjJBM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNpbnYiLAkxNCwyNCwJMHgyNzFlLAkiMkQxQyIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjbXBmIiwJMTQsMjQsCTB4MDliZSwJIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY21wbCIsCTE0LDI0LAkweDA4YmUsCSIxTDJMIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcGIiLAkgNiwxNiwJMHgwNCwJIjFCMkIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY21wdyIsCSA2LDE2LAkweDA1LAkiMVcyVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjbXBkIiwJIDYsMTYsCTB4MDcsCSIxRDJEIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcG1iIiwJMTQsMjQsCTB4MDRjZSwJIjFBMkEzYiIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcG13IiwJMTQsMjQsCTB4MDVjZSwJIjFBMkEzYiIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcG1kIiwJMTQsMjQsCTB4MDdjZSwJIjFBMkEzYiIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcHFiIiwJIDcsMTYsCTB4MWMsCSIyQjFxIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcHF3IiwJIDcsMTYsCTB4MWQsCSIyVzFxIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcHFkIiwJIDcsMTYsCTB4MWYsCSIyRDFxIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcHNiIiwJMTYsMjQsCTB4MDQwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY21wc3ciLAkxNiwyNCwJMHgwNTBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjbXBzZCIsCTE2LDI0LAkweDA3MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNtcHN0IiwJMTYsMjQsCTB4ODQwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY29tYiIsCTE0LDI0LAkweDM0NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImNvbXciLAkxNCwyNCwJMHgzNTRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjb21kIiwJMTQsMjQsCTB4Mzc0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiY3Z0cCIsCTExLDI0LAkweDAzNmUsCSIyQTNEMXIiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJjeHAiLAkgOCw4LAkweDIyLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCisgIHsgImN4cGQiLAkxMSwxNiwJMHgwN2YsCSIxQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJkZWliIiwJMTQsMjQsCTB4MmNjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZGVpdyIsCTE0LDI0LAkweDJkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImRlaWQiLAkxNCwyNCwJMHgyZmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJkaWEiLAkgOCw4LAkweGMyLAkiIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImRpdmYiLAkxNCwyNCwJMHgyMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJkaXZsIiwJMTQsMjQsCTB4MjBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZGl2YiIsCTE0LDI0LAkweDNjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImRpdnciLAkxNCwyNCwJMHgzZGNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJkaXZkIiwJMTQsMjQsCTB4M2ZjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZW50ZXIiLAkgOCw4LAkweDgyLAkiMVUyZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJleGl0IiwJIDgsOCwJMHg5MiwJIjF1IiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImV4dGIiLAkxMSwyNCwJMHgwMmUsCSIySTNCMXI0ZCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImV4dHciLAkxMSwyNCwJMHgxMmUsCSIySTNXMXI0ZCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImV4dGQiLAkxMSwyNCwJMHgzMmUsCSIySTNEMXI0ZCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImV4dHNiIiwJMTQsMjQsCTB4MGNjZSwJIjFJMkk0RzNnIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZXh0c3ciLAkxNCwyNCwJMHgwZGNlLAkiMUkySTRHM2ciLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJleHRzZCIsCTE0LDI0LAkweDBmY2UsCSIxSTJJNEczZyIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImZmc2IiLAkxNCwyNCwJMHgwNDZlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJmZnN3IiwJMTQsMjQsCTB4MDU2ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZmZzZCIsCTE0LDI0LAkweDA3NmUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImZsYWciLAkgOCw4LAkweGQyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImZsb29yZmIiLAkxNCwyNCwJMHgzYzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJmbG9vcmZ3IiwJMTQsMjQsCTB4M2QzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZmxvb3JmZCIsCTE0LDI0LAkweDNmM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImZsb29ybGIiLAkxNCwyNCwJMHgzODNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJmbG9vcmx3IiwJMTQsMjQsCTB4MzkzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiZmxvb3JsZCIsCTE0LDI0LAkweDNiM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImliaXRiIiwJMTQsMjQsCTB4Mzg0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiaWJpdHciLAkxNCwyNCwJMHgzOTRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJpYml0ZCIsCTE0LDI0LAkweDNiNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluZGV4YiIsCTExLDI0LAkweDQyZSwJIjJCM0IxciIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluZGV4dyIsCTExLDI0LAkweDUyZSwJIjJXM1cxciIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluZGV4ZCIsCTExLDI0LAkweDcyZSwJIjJEM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluc2IiLAkxMSwyNCwJMHgwYWUsCSIyQjNJMXI0ZCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluc3ciLAkxMSwyNCwJMHgxYWUsCSIyVzNJMXI0ZCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluc2QiLAkxMSwyNCwJMHgzYWUsCSIyRDNJMXI0ZCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImluc3NiIiwJMTQsMjQsCTB4MDhjZSwJIjFCMkk0RzNnIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAiaW5zc3ciLAkxNCwyNCwJMHgwOWNlLAkiMVcySTRHM2ciLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJpbnNzZCIsCTE0LDI0LAkweDBiY2UsCSIxRDJJNEczZyIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImpzciIsCTExLDE2LAkweDY3ZiwJIjFBIiwJCTQsCSIiLAkyMSwyMQl9LAorICB7ICJqdW1wIiwJMTEsMTYsCTB4MjdmLAkiMUEiLAkJNCwJIiIsCTIxLDIxCX0sCisgIHsgImxmc3IiLAkxOSwyNCwJMHgwMGYzZSwiMUQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibG1yIiwJMTUsMjQsCTB4MGIxZSwJIjJEMU0iLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibHByYiIsCSA3LDE2LAkweDZjLAkiMkIxUCIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJscHJ3IiwJIDcsMTYsCTB4NmQsCSIyVzFQIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImxwcmQiLAkgNywxNiwJMHg2ZiwJIjJEMVAiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibHNoYiIsCTE0LDI0LAkweDE0NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImxzaHciLAkxNCwyNCwJMHgxNTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJsc2hkIiwJMTQsMjQsCTB4MTc0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibWVpYiIsCTE0LDI0LAkweDI0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1laXciLAkxNCwyNCwJMHgyNWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtZWlkIiwJMTQsMjQsCTB4MjdjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW9kYiIsCTE0LDI0LAkweDM4Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vZHciLAkxNCwyNCwJMHgzOWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb2RkIiwJMTQsMjQsCTB4M2JjZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92ZiIsCTE0LDI0LAkweDA1YmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vdmwiLAkxNCwyNCwJMHgwNGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZiIiwJIDYsMTYsCTB4MTQsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vdnciLAkgNiwxNiwJMHgxNSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92ZCIsCSA2LDE2LAkweDE3LAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZiZiIsCTE0LDI0LAkweDA0M2UsCSIxQjJaIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vdndmIiwJMTQsMjQsCTB4MDUzZSwJIjFXMloiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92ZGYiLAkxNCwyNCwJMHgwNzNlLAkiMUQyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZibCIsCTE0LDI0LAkweDAwM2UsCSIxQjJaIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vdndsIiwJMTQsMjQsCTB4MDEzZSwJIjFXMloiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92ZGwiLAkxNCwyNCwJMHgwMzNlLAkiMUQyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZmbCIsCTE0LDI0LAkweDFiM2UsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vdmxmIiwJMTQsMjQsCTB4MTYzZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92bWIiLAkxNCwyNCwJMHgwMGNlLAkiMUEyQTNiIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92bXciLAkxNCwyNCwJMHgwMWNlLAkiMUEyQTNiIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92bWQiLAkxNCwyNCwJMHgwM2NlLAkiMUEyQTNiIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92cWIiLAkgNywxNiwJMHg1YywJIjJJMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92cXciLAkgNywxNiwJMHg1ZCwJIjJJMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92cWQiLAkgNywxNiwJMHg1ZiwJIjJJMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92c2IiLAkxNiwyNCwJMHgwMDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZzdyIsCTE2LDI0LAkweDAxMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm1vdnNkIiwJMTYsMjQsCTB4MDMwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibW92c3QiLAkxNiwyNCwJMHg4MDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZzdWIiLAkxNCwyNCwJMHgwY2FlLAkiMUEyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZzdXciLAkxNCwyNCwJMHgwZGFlLAkiMUEyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3ZzdWQiLAkxNCwyNCwJMHgwZmFlLAkiMUEyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z1c2IiLAkxNCwyNCwJMHgxY2FlLAkiMUEyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z1c3ciLAkxNCwyNCwJMHgxZGFlLAkiMUEyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z1c2QiLAkxNCwyNCwJMHgxZmFlLAkiMUEyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z4YmQiLAkxNCwyNCwJMHgxY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z4d2QiLAkxNCwyNCwJMHgxZGNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z4YnciLAkxNCwyNCwJMHgxMGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z6YmQiLAkxNCwyNCwJMHgxOGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z6d2QiLAkxNCwyNCwJMHgxOWNlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtb3Z6YnciLAkxNCwyNCwJMHgxNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtdWxmIiwJMTQsMjQsCTB4MzFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibXVsbCIsCTE0LDI0LAkweDMwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm11bGIiLAkxNCwyNCwJMHgyMGNlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJtdWx3IiwJMTQsMjQsCTB4MjFjZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibXVsZCIsCTE0LDI0LAkweDIzY2UsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm5lZ2YiLAkxNCwyNCwJMHgxNWJlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJuZWdsIiwJMTQsMjQsCTB4MTRiZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibmVnYiIsCTE0LDI0LAkweDIwNGUsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm5lZ3ciLAkxNCwyNCwJMHgyMTRlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJuZWdkIiwJMTQsMjQsCTB4MjM0ZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibm9wIiwJIDgsOCwJMHhhMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJub3RiIiwJMTQsMjQsCTB4MjQ0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibm90dyIsCTE0LDI0LAkweDI1NGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm5vdGQiLAkxNCwyNCwJMHgyNzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJvcmIiLAkgNiwxNiwJMHgxOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAib3J3IiwJIDYsMTYsCTB4MTksCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgIm9yZCIsCSA2LDE2LAkweDFiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJxdW9iIiwJMTQsMjQsCTB4MzBjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicXVvdyIsCTE0LDI0LAkweDMxY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInF1b2QiLAkxNCwyNCwJMHgzM2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyZHZhbCIsCTE5LDI0LAkweDAwMzFlLCIxQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyZW1iIiwJMTQsMjQsCTB4MzRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicmVtdyIsCTE0LDI0LAkweDM1Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInJlbWQiLAkxNCwyNCwJMHgzN2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyZXN0b3JlIiwJIDgsOCwJMHg3MiwJIjF1IiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInJldCIsCSA4LDgsCTB4MTIsCSIxZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyZXRpIiwJIDgsOCwJMHg1MiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyZXR0IiwJIDgsOCwJMHg0MiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInJvdGIiLAkxNCwyNCwJMHgwMDRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyb3R3IiwJMTQsMjQsCTB4MDE0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicm90ZCIsCTE0LDI0LAkweDAzNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInJvdW5kZmIiLAkxNCwyNCwJMHgyNDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyb3VuZGZ3IiwJMTQsMjQsCTB4MjUzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicm91bmRmZCIsCTE0LDI0LAkweDI3M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInJvdW5kbGIiLAkxNCwyNCwJMHgyMDNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJyb3VuZGx3IiwJMTQsMjQsCTB4MjEzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicm91bmRsZCIsCTE0LDI0LAkweDIzM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInJ4cCIsCSA4LDgsCTB4MzIsCSIxZCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZXFiIiwJMTEsMTYsCTB4M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZXF3IiwJMTEsMTYsCTB4M2QsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZXFkIiwJMTEsMTYsCTB4M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbmViIiwJMTEsMTYsCTB4YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbmV3IiwJMTEsMTYsCTB4YmQsCSIxVyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbmVkIiwJMTEsMTYsCTB4YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzY3NiIiwJMTEsMTYsCTB4MTNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2NzdyIsCTExLDE2LAkweDEzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNjc2QiLAkxMSwxNiwJMHgxM2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzY2NiIiwJMTEsMTYsCTB4MWJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2NjdyIsCTExLDE2LAkweDFiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNjY2QiLAkxMSwxNiwJMHgxYmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzaGliIiwJMTEsMTYsCTB4MjNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2hpdyIsCTExLDE2LAkweDIzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNoaWQiLAkxMSwxNiwJMHgyM2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbHNiIiwJMTEsMTYsCTB4MmJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2xzdyIsCTExLDE2LAkweDJiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNsc2QiLAkxMSwxNiwJMHgyYmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZ3RiIiwJMTEsMTYsCTB4MzNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2d0dyIsCTExLDE2LAkweDMzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNndGQiLAkxMSwxNiwJMHgzM2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbGViIiwJMTEsMTYsCTB4M2JjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2xldyIsCTExLDE2LAkweDNiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNsZWQiLAkxMSwxNiwJMHgzYmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZnNiIiwJMTEsMTYsCTB4NDNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2ZzdyIsCTExLDE2LAkweDQzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNmc2QiLAkxMSwxNiwJMHg0M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZmNiIiwJMTEsMTYsCTB4NGJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2ZjdyIsCTExLDE2LAkweDRiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNmY2QiLAkxMSwxNiwJMHg0YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbG9iIiwJMTEsMTYsCTB4NTNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2xvdyIsCTExLDE2LAkweDUzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNsb2QiLAkxMSwxNiwJMHg1M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzaHNiIiwJMTEsMTYsCTB4NWJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2hzdyIsCTExLDE2LAkweDViZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNoc2QiLAkxMSwxNiwJMHg1YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzbHRiIiwJMTEsMTYsCTB4NjNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2x0dyIsCTExLDE2LAkweDYzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNsdGQiLAkxMSwxNiwJMHg2M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZ2ViIiwJMTEsMTYsCTB4NmJjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2dldyIsCTExLDE2LAkweDZiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNnZWQiLAkxMSwxNiwJMHg2YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdXRiIiwJMTEsMTYsCTB4NzNjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic3V0dyIsCTExLDE2LAkweDczZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInN1dGQiLAkxMSwxNiwJMHg3M2YsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdWZiIiwJMTEsMTYsCTB4N2JjLAkiMUIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic3VmdyIsCTExLDE2LAkweDdiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInN1ZmQiLAkxMSwxNiwJMHg3YmYsCSIxRCIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzYXZlIiwJIDgsOCwJMHg2MiwJIjFVIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNiaXRiIiwgICAgMTQsMjQsCTB4MTg0ZSwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2JpdHciLAkxNCwyNCwJMHgxOTRlLAkiMVcyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzYml0ZCIsCTE0LDI0LAkweDFiNGUsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNiaXRpYiIsCTE0LDI0LAkweDFjNGUsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNiaXRpdyIsCTE0LDI0LAkweDFkNGUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNiaXRpZCIsCTE0LDI0LAkweDFmNGUsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNldGNmZyIsCTE1LDI0LAkweDBiMGUsCSIxTyIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzZnNyIiwJMTQsMjQsCTB4MzczZSwJIjFmIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNrcHNiIiwJMTYsMjQsCTB4MGMwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2twc3ciLAkxNiwyNCwJMHgwZDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJza3BzZCIsCTE2LDI0LAkweDBmMGUsICIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNrcHN0IiwJMTYsMjQsCTB4OGMwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic21yIiwJMTUsMjQsCTB4MGYxZSwJIjJJMU0iLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic3ByYiIsCSA3LDE2LAkweDJjLAkiMkkxUCIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzcHJ3IiwJIDcsMTYsCTB4MmQsCSIySTFQIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNwcmQiLAkgNywxNiwJMHgyZiwJIjJJMVAiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic3ViZiIsCTE0LDI0LAkweDExYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInN1YmwiLAkxNCwyNCwJMHgxMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdWJiIiwJIDYsMTYsCTB4MjAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInN1YnciLAkgNiwxNiwJMHgyMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic3ViZCIsCSA2LDE2LAkweDIzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdWJjYiIsCSA2LDE2LAkweDMwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdWJjdyIsCSA2LDE2LAkweDMxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdWJjZCIsCSA2LDE2LAkweDMzLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJzdWJwYiIsCTE0LDI0LAkweDJjNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInN1YnB3IiwJMTQsMjQsCTB4MmQ0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic3VicGQiLAkxNCwyNCwJMHgyZjRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorI2lmZGVmIE5TMzJLX1NWQ19JTU1FRF9PUEVSQU5EUworICB7ICJzdmMiLAkgOCw4LAkweGUyLAkiMmkxaSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LCAvKiBub3QgcmVhbGx5LCBidXQgc29tZSB1bml4IHVzZXMgaXQgKi8KKyNlbHNlCisgIHsgInN2YyIsCSA4LDgsCTB4ZTIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyNlbmRpZgorICB7ICJ0Yml0YiIsCSA2LDE2LAkweDM0LAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ0Yml0dyIsCSA2LDE2LAkweDM1LAkiMVcyQSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ0Yml0ZCIsCSA2LDE2LAkweDM3LAkiMUQyQSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ0cnVuY2ZiIiwJMTQsMjQsCTB4MmMzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAidHJ1bmNmdyIsCTE0LDI0LAkweDJkM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInRydW5jZmQiLAkxNCwyNCwJMHgyZjNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ0cnVuY2xiIiwJMTQsMjQsCTB4MjgzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAidHJ1bmNsdyIsCTE0LDI0LAkweDI5M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInRydW5jbGQiLAkxNCwyNCwJMHgyYjNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ3YWl0IiwJIDgsOCwJMHhiMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ3cnZhbCIsCTE5LDI0LAkweDAwNzFlLCIxQSIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJ4b3JiIiwJIDYsMTYsCTB4MzgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInhvcnciLAkgNiwxNiwJMHgzOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAieG9yZCIsCSA2LDE2LAkweDNiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorICB7ICJkb3RmIiwJMTQsMjQsICAweDBkZmUsICIxRjJGIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgImRvdGwiLAkxNCwyNCwgIDB4MGNmZSwgIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibG9nYmYiLAkxNCwyNCwgIDB4MTVmZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAibG9nYmwiLAkxNCwyNCwgIDB4MTRmZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicG9seWYiLAkxNCwyNCwgIDB4MDlmZSwgIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAicG9seWwiLAkxNCwyNCwgIDB4MDhmZSwgIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKKyAgeyAic2NhbGJmIiwJMTQsMjQsICAweDExZmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCisgIHsgInNjYWxibCIsCTE0LDI0LCAgMHgxMGZlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBudW1vcGNvZGVzPXNpemVvZihuczMya19vcGNvZGVzKS9zaXplb2YobnMzMmtfb3Bjb2Rlc1swXSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3Bjb2RlICpjb25zdCBlbmRvcCA9IG5zMzJrX29wY29kZXMrc2l6ZW9mKG5zMzJrX29wY29kZXMpL3NpemVvZihuczMya19vcGNvZGVzWzBdKTsKKworI2RlZmluZSBNQVhfQVJHUyA0CisjZGVmaW5lIEFSR19MRU4gNTAKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcG4uaCBiL2luY2x1ZGUvb3Bjb2RlL3BuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1OWEyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL3BuLmgKQEAgLTAsMCArMSwyODIgQEAKKy8qIFByaW50IEdPVUxEIFBOIChQb3dlck5vZGUpIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworc3RydWN0IGdsZF9vcGNvZGUKK3sKKyAgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgY2hhciAqYXJnczsKKyAgaW50IGxlbmd0aDsKK307CisKKy8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKKyAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgorICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQorICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KKworICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCisgICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKKyAgIG9mIHRoYXQgb3Bjb2RlLgorCisgICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCisgICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KKworLyogS2luZHMgb2Ygb3BlcmFuZHM6CisgICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAorICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCisgICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCisgICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAorICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCisgICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKKyAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCisgICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgorICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCisgICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCisgICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCisgICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCisgICBTICBTaGlmdCBjb3VudCBmaWVsZAorCisgICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgorKi8KKworLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6CisgICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCisgICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCisgICBtdXN0IGJlIGNvbnNlY3V0aXZlLgorICovCitzdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KK3sKK3sgImFibSIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoreyAiYWJyIiwJMHgxODA4MDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCit7ICJhY2kiLAkweGZjNzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKK3sgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFkaSIsCTB4YzgwMTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAiYWRtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiYWRtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAiYWRtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAiYWRtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiYWRyZnciLAkweDM4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImFkcm0iLAkweDM4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImFpIiwgCTB4ZmMwMzAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKK3sgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiYXJtYiIsCTB4ZTgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiYXJtZCIsCTB4ZTgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAiYXJtaCIsCTB4ZTgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAiYXJtdyIsCTB4ZTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiYmNmIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJIkkseE9BLFgiLAk0IH0sCit7ICJiY3QiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKK3sgImJlaSIsCTB4MDAwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoreyAiYmZ0IiwJMHhmMDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAiYmliIiwJMHhmNDAwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoreyAiYmlkIiwJMHhmNDYwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoreyAiYmloIiwJMHhmNDIwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoreyAiYml3IiwJMHhmNDQwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoreyAiYmwiLCAJMHhmODgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAiYnN1YiIsCTB4NWMwODAwMDAsCTB4ZmY4ZjAwMDAsCSIiLAkJMiB9LAoreyAiYnN1Ym0iLAkweDI4MDgwMDAwLAkweGZjMDgwMDAwLAkiIiwJCTQgfSwKK3sgImJ1IiwgCTB4ZWMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKK3sgImNhbGwiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKK3sgImNhbGxtIiwJMHg1YzA4MDAwMCwJMHhmZjg4MDAwMCwJIiIsCQk0IH0sCit7ICJjYW1iIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJjYW1kIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJjYW1oIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCit7ICJjYW13IiwJMHg5MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIueE9BLFgiLAk0IH0sCit7ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgImNkIiwgCTB4ZmMwNjAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoreyAiY2VhIiwJMHgwMDBmMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCit7ICJjaSIsIAkweGM4MDUwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKK3sgImNtYyIsCTB4MDQwYTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKK3sgImNtbWIiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImNtbWQiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImNtbWgiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImNtbXciLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImNtciIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZGFjaSIsCTB4ZmM3ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoreyAiZGFlIiwJMHgwMDBlMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCit7ICJkYWkiLAkweGZjMDQwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCit7ICJkY2kiLAkweGZjNmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKK3sgImRpIiwgCTB4ZmMwMTAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKK3sgImR2ZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImR2ZnciLAkweGU0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImR2aSIsCTB4YzgwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJkdnJmZCIsCTB4MzgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJNCB9LAoreyAiZHZyZnciLAkweDM4MDQwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImVhZSIsCTB4MDAwODAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoreyAiZWNpIiwJMHhmYzY3MDAwMCwJMHhmYzdmODA4MCwJInIsSSIsCQk0IH0sCit7ICJlY3djcyIsCTB4ZmM0ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoreyAiZWkiLCAJMHhmYzAwMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoreyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJlb3JtIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJlcyIsIAkweDAwMDQwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCit7ICJleG0iLAkweGE4MDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCit7ICJleHIiLAkweGM4MDcwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCit7ICJleHJyIiwJMHhjODA3MDAwMiwJMHhmYzdmMDAwMiwJInIiLAkJMiB9LAoreyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiZ3JpbyIsCTB4ZmMzZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoreyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoreyAiaGlvIiwJMHhmYzM3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCit7ICJqd2NzIiwJMHhmYTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoreyAibGEiLCAJMHg1MDAwMDAwMCwJMHhmYzAwMDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsYWJyIiwJMHg1ODA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCit7ICJsYiIsIAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImxjcyIsIAkweDAwMDMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCit7ICJsZCIsIAkweGFjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImxlYXIiLCAJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsZiIsIAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImxmYnIiLCAJMHhjYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCit7ICJsaCIsIAkweGFjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImxpIiwgCTB4YzgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAibG1hcCIsCTB4MmMwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKK3sgImxtYiIsCTB4YjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibG1kIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJsbWgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgImxtdyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibG5iIiwJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJsbmQiLAkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgImxuaCIsCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAibG53IiwJMHhiNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJscHNkIiwJMHhmOTgwMDAwMCwJMHhmZjg4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJscHNkY20iLAkweGZhODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgImx3IiwgCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibHdiciIsIAkweDVjMDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKK3sgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgIm1waSIsCTB4YzgwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoreyAibXBtYiIsCTB4YzAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibXBtaCIsCTB4YzAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAibXBtdyIsCTB4YzAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAibXByIiwJMHgzODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAibXByZnciLAkweDM4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgIm5vcCIsCTB4MDAwMjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoreyAib3JtYiIsCTB4ODgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAib3JtZCIsCTB4ODgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAib3JtaCIsCTB4ODgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAib3JtdyIsCTB4ODgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJvcnJtIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKK3sgInJldHVybiIsCTB4MjgwZTAwMDAsCTB4ZmM3ZjAwMDAsCSIiLAkJMiB9LAoreyAicmkiLCAJMHhmYzAyMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoreyAicm5kIiwJMHgwMDA1MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoreyAicnBzd3QiLAkweDA0MGIwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCit7ICJyc2NobmwiLAkweGZjMmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKK3sgInJzY3RsIiwJMHhmYzQ3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCit7ICJyd2NzIiwJMHgwMDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzYWN6IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzYm0iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKK3sgInNiciIsCTB4MTgwMDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJNCB9LAoreyAic2VhIiwJMHgwMDBkMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCit7ICJzZXRjcHUiLAkweDJjMDkwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCit7ICJzaW8iLAkweGZjMTcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKK3sgInNpcHUiLAkweDAwMGEwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKK3sgInNsYSIsCTB4MWM0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoreyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoreyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKK3sgInNsbGQiLAkweDIwNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKK3sgInNtYyIsCTB4MDQwNzAwMDAsCTB4ZmMwNzAwMDAsCSIiLAkJMiB9LAoreyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCit7ICJzcmMiLAkweDI0MDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKK3sgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoreyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoreyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RmYnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKK3sgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RtYiIsCTB4ZDgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RtZCIsCTB4ZDgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RtaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RtdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3RwaW8iLAkweGZjMjcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKK3sgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAic3R3YnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKK3sgInN1YWJyIiwJMHg1ODAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCit7ICJzdWZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJzdWZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCit7ICJzdWkiLAkweGM4MDIwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKK3sgInN1bWIiLAkweGJjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN1bWQiLAkweGJjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKK3sgInN1bWgiLAkweGJjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgInN1bXciLAkweGJjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKK3sgInN1cmZ3IiwJMHgzODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzdXJtIiwJMHgzYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJzdmMiLAkweGM4MDYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTQgfSwKK3sgInRibSIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoreyAidGJyIiwJMHgxODBjMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCit7ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCit7ICJ0Y2NyIiwJMHgyODA0MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCit7ICJ0ZCIsIAkweGZjMDUwMDAwLAkweGZjMDcwMDAwLAkicixmIiwJCTQgfSwKK3sgInRpbyIsCTB4ZmMxZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoreyAidG1hcHIiLAkweDJjMGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInRwY2JyIiwJMHgyODBjMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoreyAidHJiciIsCTB4MmMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoreyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ0cmNjIiwJMHgyODA1MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCit7ICJ0cmNtIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCit7ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInRybm0iLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInRyciIsCTB4MmMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHJybSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHJzYyIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAidHJzdyIsCTB4MjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKK3sgInRzY3IiLAkweDJjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInVlaSIsCTB4MDAwNzAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoreyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoreyAid2N3Y3MiLAkweGZjNWYwMDAwLAkweGZjN2Y4MDAwLAkiIiwJCTQgfSwKK3sgInd3Y3MiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKK3sgInhjYnIiLAkweDI4MDIwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKK3sgInhjciIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAieGNybSIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoreyAiemJtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCit7ICJ6YnIiLAkweDE4MDQwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKK3sgInptYiIsCTB4ZjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAiem1kIiwJMHhmODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCit7ICJ6bWgiLAkweGY4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKK3sgInptdyIsCTB4ZjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoreyAienIiLCAJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAorfTsKKworaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKKworc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KKwkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BwYy5oIGIvaW5jbHVkZS9vcGNvZGUvcHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllM2IyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL3BwYy5oCkBAIC0wLDAgKzEsMjQ4IEBACisvKiBwcGMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUKKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFBQQ19ICisjZGVmaW5lIFBQQ19ICisKKy8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KKworc3RydWN0IHBvd2VycGNfb3Bjb2RlCit7CisgIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKKyAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworCisgIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCisgICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQorICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90CisgICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKKyAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgZGVmaW5lZCB2YWx1ZXMKKyAgICAgYXJlIGxpc3RlZCBiZWxvdy4gICovCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQorICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0CisgICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KKyAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKK307CisKKy8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKKyAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgorICAgaW5zdHJ1Y3Rpb25zLiAgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXM7CisKKy8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUuICAqLworCisvKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9QUEMgKDAxKQorCisvKiBPcGNvZGUgaXMgZGVmaW5lZCBmb3IgdGhlIFBPV0VSIChSUy82MDAwKSBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSICgwMikKKworLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUjIgKFJpb3MgMikgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjIgKDA0KQorCisvKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDMyIGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV8zMiAoMDEwKQorCisvKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV82NCAoMDIwKQorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBNb3Rvcm9sYSBQb3dlclBDIDYwMSBwcm9jZXNzb3IuICBUaGUgNjAxCisgICBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgYWxsIFBvd2VyUEMgKFBQQ19PUENPREVfUFBDKSBpbnN0cnVjdGlvbnMsCisgICBidXQgaXQgYWxzbyBzdXBwb3J0cyBtYW55IGFkZGl0aW9uYWwgUE9XRVIgaW5zdHJ1Y3Rpb25zLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV82MDEgKDA0MCkKKworLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBpbiBib3RoIHRoZSBQb3dlciBhbmQgUG93ZXJQQyBhcmNoaXRlY3R1cmVzCisgICAoaWUsIGNvbXBpbGVyJ3MgLW1jcHU9Y29tbW9uIG9yIGFzc2VtYmxlcidzIC1tY29tKS4gICovCisjZGVmaW5lIFBQQ19PUENPREVfQ09NTU9OICgwMTAwKQorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGZvciBhbnkgUG93ZXIgb3IgUG93ZXJQQyBwbGF0Zm9ybSAodGhpcyBpcworICAgZm9yIHRoZSBhc3NlbWJsZXIncyAtbWFueSBvcHRpb24sIGFuZCBpdCBlbGltaW5hdGVzIGR1cGxpY2F0ZXMpLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9BTlkgKDAyMDApCisKKy8qIEEgbWFjcm8gdG8gZXh0cmFjdCB0aGUgbWFqb3Igb3Bjb2RlIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBQUENfT1AoaSkgKCgoaSkgPj4gMjYpICYgMHgzZikKKwwKKy8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kLiAgKi8KKworc3RydWN0IHBvd2VycGNfb3BlcmFuZAoreworICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLworICBpbnQgYml0czsKKworICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBpbnQgc2hpZnQ7CisKKyAgLyogSW5zZXJ0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICBUbyBpbnNlcnQgYW4KKyAgICAgb3BlcmFuZCB2YWx1ZSBpbnRvIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgorCisgICAgIElmIGl0IGlzIE5VTEwsIGV4ZWN1dGUKKyAgICAgICAgIGkgfD0gKG9wICYgKCgxIDw8IG8tPmJpdHMpIC0gMSkpIDw8IG8tPnNoaWZ0OworICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIG8gaXMgYSBwb2ludGVyIHRvCisgICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AgaXMgdGhlIG9wY29kZSB2YWx1ZTsgdGhpcyBhc3N1bWVzIHR3b3MKKyAgICAgY29tcGxlbWVudCBhcml0aG1ldGljKS4KKworICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCisgICAgIGluc3RydWN0aW9uIGFuZCB0aGUgb3BlcmFuZCB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSBuZXcgdmFsdWUKKyAgICAgb2YgdGhlIGluc3RydWN0aW9uLiAgSWYgdGhlIEVSUk1TRyBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlbiBpZgorICAgICB0aGUgb3BlcmFuZCB2YWx1ZSBpcyBpbGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgc2V0IHRvIGEgd2FybmluZworICAgICBzdHJpbmcgKHRoZSBvcGVyYW5kIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gYW55IGNhc2UpLiAgSWYgdGhlCisgICAgIG9wZXJhbmQgdmFsdWUgaXMgbGVnYWwsICpFUlJNU0cgd2lsbCBiZSB1bmNoYW5nZWQgKG1vc3Qgb3BlcmFuZHMKKyAgICAgY2FuIGFjY2VwdCBhbnkgdmFsdWUpLiAgKi8KKyAgdW5zaWduZWQgbG9uZyAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKKwkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7CisKKyAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KKyAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgorCisgICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKKyAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKKwkgaWYgKChvLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMAorCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCisJICAgb3AgLT0gMSA8PCBvLT5iaXRzOworICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKKyAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KKworICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCisgICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKKyAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCisgICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KKyAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCisgICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLworICBsb25nICgqZXh0cmFjdCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgaW50ICppbnZhbGlkKSk7CisKKyAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLworICB1bnNpZ25lZCBsb25nIGZsYWdzOworfTsKKworLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQorICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBwb3dlcnBjX29wY29kZXMgdGFibGUuICAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCBwb3dlcnBjX29wZXJhbmRzW107CisKKy8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kLiAgKi8KKworLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9TSUdORUQgKDAxKQorCisvKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKKyAgIHJhbmdlIG9mIHZhbHVlcyB3aGVuIHJ1bm5pbmcgaW4gMzIgYml0IG1vZGUuICBUaGF0IGlzLCBpZiBiaXRzIGlzCisgICAxNiwgaXQgdGFrZXMgYW55IHZhbHVlIGZyb20gLTB4ODAwMCB0byAweGZmZmYuICBJbiA2NCBiaXQgbW9kZSwKKyAgIHRoaXMgZmxhZyBpcyBpZ25vcmVkLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfU0lHTk9QVCAoMDIpCisKKy8qIFRoaXMgb3BlcmFuZCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBpbiB0aGUgYXNzZW1ibGVyIGlucHV0LiAgVGhpcworICAgaXMgdXNlZCB0byBzdXBwb3J0IGV4dGVuZGVkIG1uZW1vbmljcyBzdWNoIGFzIG1yLCBmb3Igd2hpY2ggdHdvCisgICBvcGVyYW5kcyBmaWVsZHMgYXJlIGlkZW50aWNhbC4gIFRoZSBhc3NlbWJsZXIgc2hvdWxkIGNhbGwgdGhlCisgICBpbnNlcnQgZnVuY3Rpb24gd2l0aCBhbnkgb3AgdmFsdWUuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjYWxsCisgICB0aGUgZXh0cmFjdCBmdW5jdGlvbiwgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUsIGFuZCBjaGVjayB0aGUgdmFsdWUKKyAgIHBsYWNlZCBpbiB0aGUgdmFsaWQgYXJndW1lbnQuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9GQUtFICgwNCkKKworLyogVGhlIG5leHQgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbgorICAgc2VwYXJhdGVkIGZyb20gdGhpcyBvbmUgYnkgYSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGxvYWQgYW5kCisgICBzdG9yZSBpbnN0cnVjdGlvbnMgd2hpY2ggd2FudCB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UKKyAgICAgICByZWcsZGlzcGxhY2VtZW50KHJlZykKKyAgICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX1BBUkVOUyAoMDEwKQorCisvKiBUaGlzIG9wZXJhbmQgbWF5IHVzZSB0aGUgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBDUiBmaWVsZHMsIHdoaWNoCisgICBhcmUKKyAgICAgICBsdCAgMAlndCAgMQllcSAgMglzbyAgMwl1biAgMworICAgICAgIGNyMCAwCWNyMSAxCWNyMiAyCWNyMyAzCisgICAgICAgY3I0IDQJY3I1IDUJY3I2IDYJY3I3IDcKKyAgIFRoZXNlIG1heSBiZSBjb21iaW5lZCBhcml0aG1ldGljYWxseSwgYXMgaW4gY3IyKjQrZ3QuICBUaGVzZSBhcmUKKyAgIG9ubHkgc3VwcG9ydGVkIG9uIHRoZSBQb3dlclBDLCBub3QgdGhlIFBPV0VSLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfQ1IgKDAyMCkKKworLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyIHVzZXMgdGhpcyB0byBwcmludAorICAgcmVnaXN0ZXIgbmFtZXMgd2l0aCBhIGxlYWRpbmcgJ3InLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfR1BSICgwNDApCisKKy8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgVGhlIGRpc2Fzc2VtYmxlcgorICAgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdmJy4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX0ZQUiAoMDEwMCkKKworLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKKyAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9SRUxBVElWRSAoMDIwMCkKKworLyogVGhpcyBvcGVyYW5kIGlzIGFuIGFic29sdXRlIGJyYW5jaCBhZGRyZXNzLiAgVGhlIGRpc2Fzc2VtYmxlcgorICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX0FCU09MVVRFICgwNDAwKQorCisvKiBUaGlzIG9wZXJhbmQgaXMgb3B0aW9uYWwsIGFuZCBpcyB6ZXJvIGlmIG9taXR0ZWQuICBUaGlzIGlzIHVzZWQgZm9yCisgICB0aGUgb3B0aW9uYWwgQkYgYW5kIEwgZmllbGRzIGluIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gIFRoZQorICAgYXNzZW1ibGVyIG11c3QgY291bnQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZW1haW5pbmcgb24gdGhlIGxpbmUsCisgICBhbmQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZW1haW5pbmcgZm9yIHRoZSBvcGNvZGUsIGFuZCBkZWNpZGUKKyAgIHdoZXRoZXIgdGhpcyBvcGVyYW5kIGlzIHByZXNlbnQgb3Igbm90LiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQKKyAgIHByaW50IHRoaXMgb3BlcmFuZCBvdXQgb25seSBpZiBpdCBpcyBub3QgemVyby4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX09QVElPTkFMICgwMTAwMCkKKworLyogVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCB3aXRoIFBQQ19PUEVSQU5EX09QVElPTkFMLiAgSWYgdGhpcyBvcGVyYW5kCisgICBpcyBvbWl0dGVkLCB0aGVuIGZvciB0aGUgbmV4dCBvcGVyYW5kIHVzZSB0aGlzIG9wZXJhbmQgdmFsdWUgcGx1cworICAgMSwgaWdub3JpbmcgdGhlIG5leHQgb3BlcmFuZCBmaWVsZCBmb3IgdGhlIG9wY29kZS4gIFRoaXMgd3JldGNoZWQKKyAgIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIFBvd2VyIHJvdGF0ZSBpbnN0cnVjdGlvbnMgY2FuIHRha2UKKyAgIGVpdGhlciA0IG9yIDUgb3BlcmFuZHMuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBwcmludCB0aGlzIG9wZXJhbmQKKyAgIG91dCByZWdhcmRsZXNzIG9mIHRoZSBQUENfT1BFUkFORF9PUFRJT05BTCBmaWVsZC4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX05FWFQgKDAyMDAwKQorCisvKiBUaGlzIG9wZXJhbmQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUKKyAgIHB1cnBvc2VzIG9mIG92ZXJmbG93IGNoZWNraW5nIChpLmUuLCB0aGUgbm9ybWFsIG1vc3QgbmVnYXRpdmUKKyAgIG51bWJlciBpcyBkaXNhbGxvd2VkIGFuZCBvbmUgbW9yZSB0aGFuIHRoZSBub3JtYWwgbW9zdCBwb3NpdGl2ZQorICAgbnVtYmVyIGlzIGFsbG93ZWQpLiAgVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgZm9yIGEgc2lnbmVkCisgICBvcGVyYW5kLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfTkVHQVRJVkUgKDA0MDAwKQorDAorLyogVGhlIFBPV0VSIGFuZCBQb3dlclBDIGFzc2VtYmxlcnMgdXNlIGEgZmV3IG1hY3Jvcy4gIFdlIGtlZXAgdGhlbQorICAgd2l0aCB0aGUgb3BlcmFuZHMgdGFibGUgZm9yIHNpbXBsaWNpdHkuICBUaGUgbWFjcm8gdGFibGUgaXMgYW4KKyAgIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX21hY3JvLiAgKi8KKworc3RydWN0IHBvd2VycGNfbWFjcm8KK3sKKyAgLyogVGhlIG1hY3JvIG5hbWUuICAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgdGhlIG1hY3JvIHRha2VzLiAgKi8KKyAgdW5zaWduZWQgaW50IG9wZXJhbmRzOworCisgIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaAorICAgICBzcGVjaWZpYyBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9ucy4gIFRoZSB2YWx1ZXMgYXJlIHRoZQorICAgICBzYW1lIGFzIHRob3NlIGZvciB0aGUgc3RydWN0IHBvd2VycGNfb3Bjb2RlIGZsYWdzIGZpZWxkLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAvKiBBIGZvcm1hdCBzdHJpbmcgdG8gdHVybiB0aGUgbWFjcm8gaW50byBhIG5vcm1hbCBpbnN0cnVjdGlvbi4KKyAgICAgRWFjaCAlTiBpbiB0aGUgc3RyaW5nIGlzIHJlcGxhY2VkIHdpdGggb3BlcmFuZCBudW1iZXIgTiAoemVybworICAgICBiYXNlZCkuICAqLworICBjb25zdCBjaGFyICpmb3JtYXQ7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gcG93ZXJwY19tYWNyb3NbXTsKK2V4dGVybiBjb25zdCBpbnQgcG93ZXJwY19udW1fbWFjcm9zOworCisjZW5kaWYgLyogUFBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3B5ci5oIGIvaW5jbHVkZS9vcGNvZGUvcHlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2MzJiOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL3B5ci5oCkBAIC0wLDAgKzEsMjg3IEBACisvKiBweXJhbWlkLm9wY29kZS5oIC0tIGdkYiBpbml0aWFsIGF0dGVtcHQuICovCisKKy8qIHB5cmFtaWQgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzCisgICBwYXJ0aWN1bGFyIG9wY29kZSAqLworCitzdHJ1Y3QgcHlyX2RhdHVtCit7CisgIGNoYXIgICAgICAgICAgICAgIG5hcmdzOworICBjaGFyICogICAgICAgICAgICBhcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLworICB1bnNpZ25lZCBsb25nICAgICBtYXNrOwkvKiBCaXQgdmVjdG9yOiB3aGljaCBvcGVyYW5kIG1vZGVzIGFyZSB2YWxpZAorCQkJCSAgIGZvciB0aGlzIG9wY29kZSAqLworICB1bnNpZ25lZCBjaGFyICAgICBjb2RlOwkvKiBvcC1jb2RlIChhbHdheXMgNig/KSBiaXRzICovCit9OworCit0eXBlZGVmIHN0cnVjdCBweXJfaW5zbl9mb3JtYXQgeworICAgIHVuc2lnbmVkIGludCBtb2RlIDo0OworICAgIHVuc2lnbmVkIGludCBvcGVyYXRvciA6ODsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXhfc2NhbGUgOjI7CisgICAgdW5zaWduZWQgaW50IGluZGV4X3JlZyA6NjsKKyAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZF8xIDo2OworICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzI6NjsKK30gcHlyX2luc25fZm9ybWF0OworCQorCisvKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMuCisgICBQeXJhbWlkIGlzIHN1ZmZpY2llbnRseSBSSVNDeSB0aGF0OgorICAgICAgLSBpbnNucyBhcmUgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiB3b3JkczsKKyAgICAgIC0gdGhlIGxlbmd0aCBvZiBhbnkgaW5zbiBjYW4gYmUgdG9sZCBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mCisgICAgICAgIHRoZSBpbnNuLiAoaWUsIGlmIHRoZXJlIGFyZSB6ZXJvLCBvbmUsIG9yIHR3byB3b3JkcyBvZgorCWltbWVkaWF0ZSBvcGVyYW5kL29mZnNldCkuCisKKyAgIAorICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKKyAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZiBvcGVyYW5kOworICAgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gKi8KKworLyogS2luZHMgb2Ygb3BlcmFuZHM6CisgICBtYXNrCSBhc3NlbWJsZXIgc3ludGF4CWRlc2NyaXB0aW9uCisgICAweDAwMDE6ICBtb3Z3IFJuLFJuCQlyZWdpc3RlciB0byByZWdpc3RlcgorICAgMHgwMDAyOiAgbW92dyBLLFJuCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKKyAgIDB4MDAwNDogIG1vdncgSSxSbgkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKKyAgIDB4MDAwODogIG1vdncgKFJuKSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgorICAgCSAgICBtb3Z3IChSbilbeF0sUm4JcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKKyAgIDB4MDAxMDogIG1vdncgSShSbiksUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCisgICAJICAgIG1vdncgSShSbilbeF0sUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0LCBpbmRleGVkLCB0byByZWdpc3RlcgorCisgICAweDAwMjA6ICBtb3Z3IFJuLChSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgICAgICAgCisgICAweDAwNDA6ICBtb3Z3IEssKFJuKQkJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0ICAgICAgICAgCisgICAweDAwODA6ICBtb3Z3IEksKFJuKQkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgCisgICAweDAxMDA6ICBtb3Z3IChSbiksKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCAgICAgICAKKyAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAorICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAorICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAorCisgICAweDA0MDA6ICBtb3Z3IFJuLEkoUm4pCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAorICAgMHgwODAwOiAgbW92dyBLLEkoUm4pCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKKyAgIDB4MTAwMDogIG1vdncgSSxJKFJuKQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKKyAgIDB4MTAwMDogIG1vdncgKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKKyAgIDB4MTAwMDogIG1vdncgSShSbiksSShSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0CisgICAJCQkJCStvZmZzZXQKKyAgIDB4MDAwMDogIChpcnJlZ3VsYXIpCQk/Pz8KKyAgIAorCisgICBFYWNoIGluc24gaGFzIGEgZm91ci1iaXQgZmllbGQgZW5jb2RpbmcgdGhlIHR5cGUocykgb2YgaXRzIG9wZXJhbmRzLgorKi8KKworLyogU29tZSBjb21tb24gY29tYmluYXRpb25zCisgICAqLworCisvKiB0aGUgZmlyc3QgNSwoMHgxfDB4MnwweDR8MHg4fDB4MTApIGllICgxfDJ8NHw4fDE2KSwgaWUgKCAzMiAtMSkqLworI2RlZmluZSBHRU5fVE9fUkVHICgzMSkKKworI2RlZmluZQlVTktOT1dOICgodW5zaWduZWQgbG9uZyktMSkKKyNkZWZpbmUgQU5ZIChHRU5fVE9fUkVHIHwgKEdFTl9UT19SRUcgPDwgNSkgfCAoR0VOX1RPX1JFRyA8PCAxNSkpCisKKyNkZWZpbmUgQ09OVkVSVCAoMXw4fDB4MTB8MHgyMHwweDIwMCkKKworI2RlZmluZSBLX1RPX1JFRyAoMikKKyNkZWZpbmUgSV9UT19SRUcgKDQpCisjZGVmaW5lIE5PVEtfVE9fUkVHIChHRU5fVE9fUkVHICYgfktfVE9fUkVHKQorI2RlZmluZSBOT1RJX1RPX1JFRyAoR0VOX1RPX1JFRyAmIH5JX1RPX1JFRykKKworLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6CisgICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCisgICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCisgICBtdXN0IGJlIGNvbnNlY3V0aXZlLgorICovCisKK3N0cnVjdCBweXJfb3Bjb2RlCQkvKiBweXIgb3Bjb2RlIHRleHQgKi8KK3sKKyAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLworICBzdHJ1Y3QgcHlyX2RhdHVtICBkYXR1bTsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLworfTsKKworI2RlZmluZSBweXJfaG93IGFyZ3MKKyNkZWZpbmUgcHlyX25hcmdzIG5hcmdzCisjZGVmaW5lIHB5cl9tYXNrIG1hc2sKKyNkZWZpbmUgcHlyX25hbWUgbmFtZQorCitzdHJ1Y3QgcHlyX29wY29kZSBweXJfb3Bjb2Rlc1tdID0KK3sKKyAgeyJtb3ZiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MTF9LCB9LAorICB7Im1vdmgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMn0gfSwKKyAgeyJtb3Z3IiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTB9IH0sCisgIHsibW92bCIsCXsgMiwgIiIsIEFOWSwJCQkweDEzfSB9LAorICB7Im1uZWd3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTR9IH0sCisgIHsibW5lZ2YiLAl7IDIsICIiLCAweDEsCQkJMHgxNX0gfSwKKyAgeyJtbmVnZCIsCXsgMiwgIiIsIDB4MSwJCQkweDE2fSB9LAorICB7Im1jb213IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTd9IH0sCisgIHsibWFic3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxOH0gfSwKKyAgeyJtYWJzZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE5fSB9LAorICB7Im1hYnNkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWF9IH0sCisgIHsibXRzdHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxY30gfSwKKyAgeyJtdHN0ZiIsCXsgMiwgIiIsIDB4MSwJCQkweDFkfSB9LAorICB7Im10c3RkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWV9IH0sCisgIHsibW92YSIsCXsgMiwgIiIsIDB4OHwweDEwLAkJMHgxZn0gfSwKKyAgeyJtb3Z6YnciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMH0gfSwKKyAgeyJtb3Z6aHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMX0gfSwKKwkJCQkvKiAyIGluc25zIG91dCBvZiBvcmRlciBoZXJlICovCisgIHsibW92YmwiLAl7IDIsICIiLCAxLAkJCTB4NGZ9IH0sCisgIHsiZmlsYmwiLAl7IDIsICIiLCAxLAkJCTB4NGV9IH0sCisKKyAgeyJjdnRidyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDIyfSB9LAorICB7ImN2dGh3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjN9IH0sCisgIHsiY3Z0d2IiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNH0gfSwKKyAgeyJjdnR3aCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI1fSB9LAorICB7ImN2dHdmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjZ9IH0sCisgIHsiY3Z0d2QiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyN30gfSwKKyAgeyJjdnRmdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI4fSB9LAorICB7ImN2dGZkIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjl9IH0sCisgIHsiY3Z0ZHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyYX0gfSwKKyAgeyJjdnRkZiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJifSB9LAorCisgIHsiYWRkdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQwfSB9LAorICB7ImFkZHdjIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDF9IH0sCisgIHsic3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQyfSB9LAorICB7InN1YndiIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDN9IH0sCisgIHsicnN1YnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NH0gfSwKKyAgeyJtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDV9IH0sCisgIHsiZW11bCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ3fSB9LAorICB7InVtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDZ9IH0sCisgIHsiZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ4fSB9LAorICB7ImVkaXYiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0YX0gfSwKKyAgeyJyZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRifSB9LAorICB7InVkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDl9IH0sCisgIHsibW9kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRjfSB9LAorICB7InVtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGR9IH0sCisKKworICB7ImFkZGYiLAl7IDIsICIiLCAxLAkJCTB4NTB9IH0sCisgIHsiYWRkZCIsCXsgMiwgIiIsIDEsCQkJMHg1MX0gfSwKKyAgeyJzdWJmIiwJeyAyLCAiIiwgMSwJCQkweDUyfSB9LAorICB7InN1YmQiLAl7IDIsICIiLCAxLAkJCTB4NTN9IH0sCisgIHsibXVsZiIsCXsgMiwgIiIsIDEsCQkJMHg1Nn0gfSwKKyAgeyJtdWxkIiwJeyAyLCAiIiwgMSwJCQkweDU3fSB9LAorICB7ImRpdmYiLAl7IDIsICIiLCAxLAkJCTB4NTh9IH0sCisgIHsiZGl2ZCIsCXsgMiwgIiIsIDEsCQkJMHg1OX0gfSwKKworCisgIHsiY21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYxfSB9LAorICB7ImNtcGgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Mn0gfSwKKyAgeyJjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjB9IH0sCisgIHsidWNtcGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Nn0gfSwKKyAgLyogV0hZIG5vICJ1Y21waCI/Pz8gKi8KKyAgeyJ1Y21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY1fSB9LAorICB7InhjaHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwZn0gfSwKKworCisgIHsiYW5kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMwfSB9LAorICB7Im9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMxfSB9LAorICB7InhvcnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzMn0gfSwKKyAgeyJiaWN3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzN9IH0sCisgIHsibHNobHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzOH0gfSwKKyAgeyJhc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNhfSB9LAorICB7ImFzaGxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2N9IH0sCisgIHsiYXNocnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzYn0gfSwKKyAgeyJhc2hybCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNkfSB9LAorICB7InJvdGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2V9IH0sCisgIHsicm90cnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZn0gfSwKKworICAvKiBwdXNoIGFuZCBwb3AgaW5zbnMgYXJlICJnb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCisgIHsicHVzaHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgwY30gfSwKKyAgeyJwb3B3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MGR9IH0sCisgIHsicHVzaGEiLAl7IDIsICIiLCAoMHg4fDB4MTApLAkJMHgwZX0gfSwKKworICB7ImJpdHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MzV9IH0sCisgIHsiYml0Y3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNn0gfSwKKyAgLyogc29tZSBraW5kIG9mIGlicmEvZGJyYSBpbnNucz8/Ki8KKyAgeyJpY21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY3fSB9LAorICB7ImRjbXB3IiwJeyAyLCAiIiwgKDF8NHwweDIwfDB4ODB8MHg0MDB8MHgxMDAwKSwJMHg2OX0gfSwvKkZJWE1FKi8KKyAgeyJhY21wdyIsCXsgMiwgIiIsIDEsCQkJMHg2Yn0gfSwKKworICAvKiBDYWxsIGlzIHdyaXR0ZW4gYXMgYSAxLW9wIGluc24sIGJ1dCBpcyBhbHdheXMgKGRpcylhc3NlbWJsZWQgYXMgYSAyLW9wCisgICAgIGluc24gd2l0aCBhIDJuZCBvcCBvZiB0cjE0LiAgIFRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIHRvIGdyb2sgdGhpcy4gICovCisgIHsiY2FsbCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAorICB7ImNhbGwiLAl7IDEsICIiLCBHRU5fVE9fUkVHLAkJMHgwNH0gfSwKKworICB7ImNhbGxrIiwJeyAxLCAiIiwgVU5LTk9XTiwJCTB4MDZ9IH0sLyogc3lzdGVtIGNhbGw/Ki8KKyAgLyogUmV0IGlzIHVzdWFsbHkgd3JpdHRlbiBhcyBhIDAtb3AgaW5zbiwgYnV0IGdldHMgZGlzYXNzZW1ibGVkIGFzIGEKKyAgICAgMS1vcCBpbnNuLiBUaGUgb3BlcmFuZCBpcyBhbHdheXMgdHIxNS4gKi8KKyAgeyJyZXQiLAl7IDAsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKKyAgeyJyZXQiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKKyAgeyJhZHNmIiwJeyAyLCAiIiwgKDF8Mnw0KSwJCTB4MDh9IH0sCisgIHsicmV0ZCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBhfSB9LAorICB7ImJ0YyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAxfSB9LAorICB7ImJmYyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAyfSB9LAorICAvKiBDYXJlZnVsOiBoYWx0IGlzIDB4MDAwMDAwMDAuIEp1bXAgbXVzdCBoYXZlIHNvbWUgb3RoZXIgKG1vZGU/KWJpdCBzZXQ/PyAqLworICB7Imp1bXAiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKKyAgeyJidHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHhmMDB9IH0sCisgIC8qIHJlYWQgY29udHJvbC1zdGFjayBwb2ludGVyIGlzIGFub3RoZXIgMS1vci0yIG9wZXJhbmQgaW5zbi4gKi8KKyAgeyJyY3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDFmfSB9LAorICB7InJjc3AiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0KK307CisKKy8qIGVuZDogcHlyYW1pZC5vcGNvZGUuaCAqLworLyogT25lIGRheSBJIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSB0aW1lIHRvIGZpbmQgb3V0IHdoYXQgb3BlcmFuZHMKKyAgIGFyZSB2YWxpZCBmb3IgdGhlc2UgaW5zbnMsIGFuZCBndWVzcyBhdCB3aGF0IHRoZXkgbWVhbi4KKworICAgSSBjYW4ndCBpbWFnaW5lIHdoYXQgdGhlICJJPz8/IiBpbnNucyAoaWdsb2IsIGV0YykgZG8uCisKKyAgIHRoZSBhcml0aG1ldGljLXNvdW5kaW5nIGluc25zIGVuZGluZyBpbiAicCIgc291bmQgYXdmdWxseSBsaWtlIEJDRAorICAgYXJpdGhtZXRpYyBpbnNuczoKKyAgIAlkc2hscCAtPiBEZWNpbWFsIFNIaWZ0IExlZnQgUGFja2VkCisJZHNocnAgLT4gRGVjaW1hbCBTSGlmdCBSaWdodCBQYWNrZWQKKyAgIGFuZCBjdnRscCB3b3VsZCBiZSBjb252ZXJ0IGxvbmcgdG8gcGFja2VkLgorICAgSSBoYXZlIG5vIGlkZWEgaG93IHRoZSBvcGVyYW5kcyBhcmUgaW50ZXJwcmV0ZWQ7IGJ1dCBoYXZpbmcgdGhlbSBiZQorICAgYSBsb25nIHJlZ2lzdGVyIHdpdGggKGFkZHJlc3MsIGxlbmd0aCkgb2YgYW4gaW4tbWVtb3J5IHBhY2tlZCBCQ0Qgb3BlcmFuZAorICAgd291bGQgbm90IGJlIHN1cnByaXNpbmcuCisgICBUaGV5IGFyZSB1bmxpa2VseSB0byBiZSBhIHBhY2tlZCBiY2Qgc3RyaW5nOiA2NCBiaXRzIG9mIGxvbmcgZ2l2ZQorICAgaXMgb25seSAxNSBkaWdpdHMrc2lnbiwgd2hpY2ggaXNuJ3QgZW5vdWdoIGZvciBDT0JPTC4KKyAqLyAKKyNpZiAwCisgIHsid2NzcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlIGNzcD8qLworICAvKiBUaGUgT1N4IE9wZXJhdGluZyBTeXN0ZW0gUG9ydGluZyBHdWlkZSBjbGFpbXMgU1NMIGRvZXMgdGhpbmdzCisgICAgIHdpdGggdHIxMiAoYSByZWdpc3RlciByZXNlcnZlZCB0byBpdCkgdG8gZG8gd2l0aCBzdGF0aWMgYmxvY2stc3RydWN0dXJlCisgICAgIHJlZmVyZW5jZXMuICBTU0w9U2V0IFN0YXRpYyBMaW5rPyAgSXQncyAiR29pbmcgYXdheSBuZXh0IHJlbGVhc2UiLiAqLworICB7InNzbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7ImNjbXBzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsibGNkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsidWVtdWwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp1bnNpZ25lZCBlbXVsKi8KKyAgeyJzcmYiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypHaWRnZXQgdGltZT8/PyovCisgIHsibW5lZ3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgL21vdmUtbmVnIHBoeXM/Ki8KKyAgeyJsZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHBoeXM/Ki8KKyAgeyJsZHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsibGRiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsic3RwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsic3R0aSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7InN0YiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7InN0dSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7ImFkZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKKyAgeyJzdWJwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsibXVscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7ImRpdnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKKyAgeyJkc2hscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAgLyogZGVjIHNobCBwYWNrZWQ/ICovCisgIHsiZHNocnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogZGVjIHNociBwYWNrZWQ/ICovCisgIHsibW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKm1vdmUgKHN0cmluZz8pPyovCisgIHsiY21wcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgcGh5cz8qLworICB7ImNtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY21wIChzdHJpbmc/KT8qLworICB7ImN2dGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGN2dCBsb25nIHRvIHA/PyovCisgIHsiY3Z0cGwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IHAgdG8gbD8/Ki8KKyAgeyJkaW50ciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyBpbnRyID8qLworICB7InJwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiByZWFkIHBoeXMgd29yZD8qLworICB7IndwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBwaHlzIHdvcmQ/Ki8KKyAgeyJjbW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7InJzdWJ3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsiYmljcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNsciBiaXQgaW4gcHN3PyAqLworICB7ImJpc3BzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBzZXQgYml0IGluIHBzdz8gKi8KKyAgeyJlaW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogPz8gP2lvID8gKi8KKyAgeyJjYWxscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjYWxsIHBoeXM/Ki8KKyAgeyJjYWxsciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7ImxwY3h0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbG9hZCBwcm9jIGNvbnRleHQqLworICB7InJlaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJldCBmcm9tIGludHJwdCovCisgIHsicnBvcnQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXBvcnQ/Ki8KKyAgeyJydG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmVhZC10aW1lLW9mLWRheT8qLworICB7InNzaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAorICB7InZ0cGEiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp2aXJ0LXRvLXBoeXMtYWRkcj8qLworICB7IndpY2wiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogd3JpdGUgaWNsID8gKi8KKyAgeyJ3cG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlLXBvcnQ/Ki8KKyAgeyJ3dG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtdGltZS1vZi1kYXk/Ki8KKyAgeyJmbGljIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsiaWdsb2IiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBnbG9iYWw/ICovCisgIHsiaXBoeXMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaHlzaWNhbD8gKi8KKyAgeyJpcGlkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgcGlkPyAqLworICB7Iml2ZWN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgdmVjdG9yPyAqLworICB7ImxhbXN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisgIHsidGlvIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmggYi9pbmNsdWRlL29wY29kZS9zcGFyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTU5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL29wY29kZS9zcGFyYy5oCkBAIC0wLDAgKzEsMjQwIEBACisvKiBEZWZpbml0aW9ucyBmb3Igb3Bjb2RlIHRhYmxlIGZvciB0aGUgc3BhcmMuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZAordGhlIEdOVSBCaW51dGlscy4KKworR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLglJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorCisvKiBUaGUgU1BBUkMgb3Bjb2RlIHRhYmxlIChhbmQgb3RoZXIgcmVsYXRlZCBkYXRhKSBpcyBkZWZpbmVkIGluCisgICB0aGUgb3Bjb2RlcyBsaWJyYXJ5IGluIHNwYXJjLW9wYy5jLiAgSWYgeW91IGNoYW5nZSBhbnl0aGluZyBoZXJlLCBtYWtlCisgICBzdXJlIHlvdSBmaXggdXAgdGhhdCBmaWxlLCBhbmQgdmljZSB2ZXJzYS4gICovCisKKyAvKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKKyAgICBpbnN0cnVjdGlvbidzIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGFyZ3MuICBUaGlzIHdvdWxkIG1ha2UgZ2FzIGZhc3RlciwgcGluc24KKyAgICBzbG93ZXIsIGJ1dCB3b3VsZCBtZXNzIHVwIHNvbWUgbWFjcm9zIGEgYml0LiAgeG94b3JpY2guICovCisKKy8qIExpc3Qgb2YgaW5zdHJ1Y3Rpb24gc2V0cyB2YXJpYXRpb25zLgorICAgVGhlc2UgdmFsdWVzIGFyZSBzdWNoIHRoYXQgZWFjaCBlbGVtZW50IGlzIGVpdGhlciBhIHN1cGVyc2V0IG9mIGEKKyAgIHByZWNlZGluZyBlYWNoIG9uZSBvciB0aGV5IGNvbmZsaWN0IGluIHdoaWNoIGNhc2UgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1AKKyAgIHJldHVybnMgbm9uLXplcm8uCisgICBUaGUgdmFsdWVzIGFyZSBpbmRpY2VzIGludG8gYHNwYXJjX29wY29kZV9hcmNocycgZGVmaW5lZCBpbiBzcGFyYy1vcGMuYy4KKyAgIERvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgdXBkYXRpbmcgc3BhcmMtb3BjLmMuICAqLworCitlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB7CisgIFNQQVJDX09QQ09ERV9BUkNIX1Y2ID0gMCwKKyAgU1BBUkNfT1BDT0RFX0FSQ0hfVjcsCisgIFNQQVJDX09QQ09ERV9BUkNIX1Y4LAorICBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCwKKyAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFLAorICAvKiB2OSB2YXJpYW50cyBtdXN0IGFwcGVhciBsYXN0ICovCisgIFNQQVJDX09QQ09ERV9BUkNIX1Y5LAorICBTUEFSQ19PUENPREVfQVJDSF9WOUEsIC8qIHY5IHdpdGggdWx0cmFzcGFyYyBhZGRpdGlvbnMgKi8KKyAgU1BBUkNfT1BDT0RFX0FSQ0hfQkFEIC8qIGVycm9yIHJldHVybiBmcm9tIHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCAqLworfTsKKworLyogVGhlIGhpZ2hlc3QgYXJjaGl0ZWN0dXJlIGluIHRoZSB0YWJsZS4gICovCisjZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX01BWCAoU1BBUkNfT1BDT0RFX0FSQ0hfQkFEIC0gMSkKKworLyogR2l2ZW4gYW4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwsIHJldHVybiB0aGUgYml0bWFzayB0byB1c2UgaW4KKyAgIGluc24gZW5jb2RpbmcvZGVjb2RpbmcuICAqLworI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVNLKGFyY2gpICgxIDw8IChhcmNoKSkKKworLyogR2l2ZW4gYSB2YWxpZCBzcGFyY19vcGNvZGVfYXJjaF92YWwsIHJldHVybiBub24temVybyBpZiBpdCdzIHY5LiAgKi8KKyNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUChhcmNoKSAoKGFyY2gpID49IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQorCisvKiBUYWJsZSBvZiBjcHUgdmFyaWFudHMuICAqLworCitzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggeworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBNYXNrIG9mIHNwYXJjX29wY29kZV9hcmNoX3ZhbCdzIHN1cHBvcnRlZC4KKyAgICAgRUc6IEZvciB2NyB0aGlzIHdvdWxkIGJlCisgICAgIChTUEFSQ19PUENPREVfQVJDSF9NQVNLICguLi5fVjYpIHwgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y3KSkuCisgICAgIFRoZXNlIGFyZSBzaG9ydCdzIGJlY2F1c2Ugc3BhcmNfb3Bjb2RlLmFyY2hpdGVjdHVyZSBpcy4gICovCisgIHNob3J0IHN1cHBvcnRlZDsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggc3BhcmNfb3Bjb2RlX2FyY2hzW107CisKKy8qIEdpdmVuIGFyY2hpdGVjdHVyZSBuYW1lLCBsb29rIHVwIGl0J3Mgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIHZhbHVlLiAgKi8KK2V4dGVybiBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKy8qIFJldHVybiB0aGUgYml0bWFzayBvZiBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcyBmb3IgQVJDSC4gICovCisjZGVmaW5lIFNQQVJDX09QQ09ERV9TVVBQT1JURUQoQVJDSCkgKHNwYXJjX29wY29kZV9hcmNoc1tBUkNIXS5zdXBwb3J0ZWQpCisKKy8qIE5vbi16ZXJvIGlmIEFSQ0gxIGNvbmZsaWN0cyB3aXRoIEFSQ0gyLgorICAgSUU6IEFSQ0gxIGFzIGEgc3VwcG9ydGVkIGJpdCBzZXQgdGhhdCBBUkNIMiBkb2Vzbid0LCBhbmQgdmljZSB2ZXJzYS4gICovCisjZGVmaW5lIFNQQVJDX09QQ09ERV9DT05GTElDVF9QKEFSQ0gxLCBBUkNIMikgXAorKCgoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDEpICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDIpKSBcCisgICE9IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSkgXAorICYmICgoU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDEpICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAoQVJDSDIpKSBcCisgICAgICE9IFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkpCisKKy8qIFN0cnVjdHVyZSBvZiBhbiBvcGNvZGUgdGFibGUgZW50cnkuICAqLworCitzdHJ1Y3Qgc3BhcmNfb3Bjb2RlIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgbG9uZyBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0LiAqLworICB1bnNpZ25lZCBsb25nIGxvc2U7CS8qIEJpdHMgdGhhdCBtdXN0IG5vdCBiZSBzZXQuICovCisgIGNvbnN0IGNoYXIgKmFyZ3M7CisgIC8qIFRoaXMgd2FzIGNhbGxlZCAiZGVsYXllZCIgaW4gdmVyc2lvbnMgYmVmb3JlIHRoZSBmbGFncy4gKi8KKyAgY2hhciBmbGFnczsKKyAgc2hvcnQgYXJjaGl0ZWN0dXJlOwkvKiBCaXRtYXNrIG9mIHNwYXJjX29wY29kZV9hcmNoX3ZhbCdzLiAgKi8KK307CisKKyNkZWZpbmUJRl9ERUxBWUVECTEJLyogRGVsYXllZCBicmFuY2ggKi8KKyNkZWZpbmUJRl9BTElBUwkJMgkvKiBBbGlhcyBmb3IgYSAicmVhbCIgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUJRl9VTkJSCQk0CS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoICovCisjZGVmaW5lCUZfQ09OREJSCTgJLyogQ29uZGl0aW9uYWwgYnJhbmNoICovCisjZGVmaW5lCUZfSlNSCQkxNgkvKiBTdWJyb3V0aW5lIGNhbGwgKi8KKyNkZWZpbmUgRl9GTE9BVAkJMzIJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gKG5vdCBhIGJyYW5jaCkgKi8KKyNkZWZpbmUgRl9GQlIJCTY0CS8qIEZsb2F0aW5nIHBvaW50IGJyYW5jaCAqLworLyogRklYTUU6IEFkZCBGX0FOQUNIUk9OSVNUSUMgZmxhZyBmb3IgdjkuICAqLworCisvKgorCitBbGwgc3BhcmMgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgYHNldCcgaW5zdHJ1Y3Rpb24gKHJlYWxseSBhCittYWNybyksIHdoaWNoIGlzIDY0IGJpdHMuIEl0IGlzIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UuCisKK1RoZSBtYXRjaCBjb21wb25lbnQgaXMgYSBtYXNrIHNheWluZyB3aGljaCBiaXRzIG11c3QgbWF0Y2ggYSBwYXJ0aWN1bGFyCitvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQgb3Bjb2RlLgorCitUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgY2hhcmFjdGVyIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlCitpbnN0cnVjdGlvbi4KKworS2luZHMgb2Ygb3BlcmFuZHM6CisJIwlOdW1iZXIgdXNlZCBieSBvcHRpbWl6ZXIuCUl0IGlzIGlnbm9yZWQuCisJMQlyczEgcmVnaXN0ZXIuCisJMglyczIgcmVnaXN0ZXIuCisJZAlyZCByZWdpc3Rlci4KKwllCWZyczEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCisJdglmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCisJVglmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgorCWYJZnJzMiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KKwlCCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KKwlSCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCisJZwlmcnNkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgorCUgJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgorCUoJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KKwliCWNyczEgY29wcm9jZXNzb3IgcmVnaXN0ZXIKKwljCWNyczIgY29wcm9jZXNzb3IgcmVnaXN0ZXIKKwlECWNyc2QgY29wcm9jZXNzb3IgcmVnaXN0ZXIKKwltCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByZAorCU0JYWx0ZXJuYXRlIHNwYWNlIHJlZ2lzdGVyIChhc3IpIGluIHJzMQorCWgJMjIgaGlnaCBiaXRzLgorCVgJNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCisJWQk2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUKKwlLCU1FTUJBUiBtYXNrICg3IGJpdHMpLiAodjkpCisJagkxMCBiaXQgSW1tZWRpYXRlLiAodjkpCisJSQkxMSBiaXQgSW1tZWRpYXRlLiAodjkpCisJaQkxMyBiaXQgSW1tZWRpYXRlLgorCW4JMjIgYml0IGltbWVkaWF0ZS4KKwlrCTIrMTQgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4gKHY5KQorCUcJMTkgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4gKHY5KQorCWwJMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KKwlMCTMwIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCisJYQlBbm51bC4JVGhlIGFubnVsIGJpdCBpcyBzZXQuCisJQQlBbHRlcm5hdGUgYWRkcmVzcyBzcGFjZS4gU3RvcmVkIGFzIDggYml0cy4KKwlDCUNvcHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgorCUYJZmxvYXRpbmcgcG9pbnQgc3RhdGUgcmVnaXN0ZXIuCisJcAlQcm9jZXNzb3Igc3RhdGUgcmVnaXN0ZXIuCisJTglCcmFuY2ggcHJlZGljdCBjbGVhciAiLHBuIiAodjkpCisJVAlCcmFuY2ggcHJlZGljdCBzZXQgIixwdCIgKHY5KQorCXoJJWljYy4gKHY5KQorCVoJJXhjYy4gKHY5KQorCXEJRmxvYXRpbmcgcG9pbnQgcXVldWUuCisJcglTaW5nbGUgcmVnaXN0ZXIgdGhhdCBpcyBib3RoIHJzMSBhbmQgcmQuCisJTwlTaW5nbGUgcmVnaXN0ZXIgdGhhdCBpcyBib3RoIHJzMiBhbmQgcmQuCisJUQlDb3Byb2Nlc3NvciBxdWV1ZS4KKwlTCVNwZWNpYWwgY2FzZS4KKwl0CVRyYXAgYmFzZSByZWdpc3Rlci4KKwl3CVdpbmRvdyBpbnZhbGlkIG1hc2sgcmVnaXN0ZXIuCisJeQlZIHJlZ2lzdGVyLgorCXUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJkIHBvc2l0aW9uCisJVQlzcGFyY2xldCBjb3Byb2Nlc3NvciByZWdpc3RlcnMgaW4gcnMxIHBvc2l0aW9uCisJRQklY2NyLiAodjkpCisJcwklZnBycy4gKHY5KQorCVAJJXBjLiAgKHY5KQorCVcJJXRpY2suCSh2OSkKKwlvCSVhc2kuICh2OSkKKwk2CSVmY2MwLiAodjkpCisJNwklZmNjMS4gKHY5KQorCTgJJWZjYzIuICh2OSkKKwk5CSVmY2MzLiAodjkpCisJIQlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJkICh2OSkKKwk/CVByaXZpbGVnZWQgUmVnaXN0ZXIgaW4gcnMxICh2OSkKKwkqCVByZWZldGNoIGZ1bmN0aW9uIGNvbnN0YW50LiAodjkpCisJeAlPUEYgZmllbGQgKHY5IGltcGRlcCkuCisJMAkzMi82NCBiaXQgaW1tZWRpYXRlIGZvciBzZXQgb3Igc2V0eCAodjkpIGluc25zCisJXwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcmQgKHY5YSkKKwkvCUFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciBpbiByczEgKHY5YSkKKworVGhlIGZvbGxvd2luZyBjaGFycyBhcmUgdW51c2VkOiAobm90ZTogLFtdIGFyZSB1c2VkIGFzIHB1bmN0dWF0aW9uKQorWzM0NV0KKworKi8KKworI2RlZmluZSBPUDIoeCkJCSgoKHgpJjB4NykgPDwgMjIpIC8qIG9wMiBmaWVsZCBvZiBmb3JtYXQyIGluc25zICovCisjZGVmaW5lIE9QMyh4KQkJKCgoeCkmMHgzZikgPDwgMTkpIC8qIG9wMyBmaWVsZCBvZiBmb3JtYXQzIGluc25zICovCisjZGVmaW5lIE9QKHgpCQkoKHVuc2lnbmVkKSgoeCkmMHgzKSA8PCAzMCkgLyogb3AgZmllbGQgb2YgYWxsIGluc25zICovCisjZGVmaW5lIE9QRih4KQkJKCgoeCkmMHgxZmYpIDw8IDUpIC8qIG9wZiBmaWVsZCBvZiBmbG9hdCBpbnNucyAqLworI2RlZmluZSBPUEZfTE9XNSh4KQlPUEYoKHgpJjB4MWYpIC8qIHY5ICovCisjZGVmaW5lIEYzRih4LCB5LCB6KQkoT1AoeCkgfCBPUDMoeSkgfCBPUEYoeikpIC8qIGZvcm1hdDMgZmxvYXQgaW5zbnMgKi8KKyNkZWZpbmUgRjNJKHgpCQkoKCh4KSYweDEpIDw8IDEzKSAvKiBpbW1lZGlhdGUgZmllbGQgb2YgZm9ybWF0IDMgaW5zbnMgKi8KKyNkZWZpbmUgRjIoeCwgeSkJKE9QKHgpIHwgT1AyKHkpKSAvKiBmb3JtYXQgMiBpbnNucyAqLworI2RlZmluZSBGMyh4LCB5LCB6KQkoT1AoeCkgfCBPUDMoeSkgfCBGM0koeikpIC8qIGZvcm1hdDMgaW5zbnMgKi8KKyNkZWZpbmUgRjEoeCkJCShPUCh4KSkKKyNkZWZpbmUgRElTUDMwKHgpCSgoeCkmMHgzZmZmZmZmZikKKyNkZWZpbmUgQVNJKHgpCQkoKCh4KSYweGZmKSA8PCA1KSAvKiBhc2kgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLworI2RlZmluZSBSUzIoeCkJCSgoeCkmMHgxZikgLyogcnMyIGZpZWxkICovCisjZGVmaW5lIFNJTU0xMyh4KQkoKHgpJjB4MWZmZikgLyogc2ltbTEzIGZpZWxkICovCisjZGVmaW5lIFJEKHgpCQkoKCh4KSYweDFmKSA8PCAyNSkgLyogZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGQgKi8KKyNkZWZpbmUgUlMxKHgpCQkoKCh4KSYweDFmKSA8PCAxNCkgLyogcnMxIGZpZWxkICovCisjZGVmaW5lIEFTSV9SUzIoeCkJKFNJTU0xMyh4KSkKKyNkZWZpbmUgTUVNQkFSKHgpCSgoeCkmMHg3ZikKKyNkZWZpbmUgU0xDUE9QKHgpCSgoKHgpJjB4N2YpIDw8IDYpIC8qIHNwYXJjbGV0IGNwb3AgKi8KKworI2RlZmluZSBBTk5VTAkoMTw8MjkpCisjZGVmaW5lIEJQUkVECSgxPDwxOSkJLyogdjkgKi8KKyNkZWZpbmUJSU1NRUQJRjNJKDEpCisjZGVmaW5lIFJEX0cwCVJEKH4wKQorI2RlZmluZQlSUzFfRzAJUlMxKH4wKQorI2RlZmluZQlSUzJfRzAJUlMyKH4wKQorCitleHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSBzcGFyY19vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IHNwYXJjX251bV9vcGNvZGVzOworCitleHRlcm4gaW50IHNwYXJjX2VuY29kZV9hc2kgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX2FzaSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiBpbnQgc3BhcmNfZW5jb2RlX21lbWJhciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK2V4dGVybiBjb25zdCBjaGFyICpzcGFyY19kZWNvZGVfbWVtYmFyIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfcHJlZmV0Y2ggUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX3ByZWZldGNoIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGludCkpOworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogZmlsbC1jb2x1bW46IDEzMQorICogY29tbWVudC1jb2x1bW46IDAKKyAqIEVuZDoKKyAqLworCisvKiBlbmQgb2Ygc3BhcmMuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvdGFob2UuaCBiL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjZWUyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBQb3J0ZWQgYnkgdGhlIFN0YXRlIFVuaXZlcnNpdHkgb2YgTmV3IFlvcmsgYXQgQnVmZmFsbyBieSB0aGUgRGlzdHJpYnV0ZWQKKyAqIENvbXB1dGVyIFN5c3RlbXMgTGFiLCBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UsIDE5OTEuCisgKi8KKworI2lmbmRlZiB0YWhvZV9vcGNvZGVUCisjZGVmaW5lIHRhaG9lX29wY29kZVQgaW50CisjZW5kaWYgLyogbm8gdGFob2Vfb3Bjb2RlVCAqLworCitzdHJ1Y3Qgdm90X3dvdCAgICAgICAgICAgICAgICAgIC8qIHRhaG9lIG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLworeworICBjaGFyICogICAgICAgICAgICBhcmdzOyAgICAgICAvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLworICB0YWhvZV9vcGNvZGVUICAgICAgIGNvZGU7ICAgICAvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLworfTsKKworc3RydWN0IHZvdCAgICAgICAgICAgICAgICAgICAgICAvKiB0YWhvZSBvcGNvZGUgdGV4dCAqLworeworICBjaGFyICogICAgICAgICAgICBuYW1lOyAgICAgICAvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCisgIHN0cnVjdCB2b3Rfd290ICAgIGRldGFpbDsgICAgIC8qIHJlc3Qgb2Ygb3Bjb2RlIHRhYmxlICAgICAgICAgIFtkYXR1bV0gKi8KK307CisKKyNkZWZpbmUgdm90X2hvdyBhcmdzCisjZGVmaW5lIHZvdF9jb2RlIGNvZGUKKyNkZWZpbmUgdm90X2RldGFpbCBkZXRhaWwKKyNkZWZpbmUgdm90X25hbWUgbmFtZQorCitzdGF0aWMgc3RydWN0IHZvdAordm90c3Ryc1tdID0KK3sKK3sgICAgImhhbHQiLAl7IiIsCQkJMHgwMAl9IH0sCit7ICAgICJzaW5mIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHgwNSAgICB9IH0sCit7ICAgICJsZGYiLCAgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHgwNiAgICB9IH0sCit7ICAgICJsZGQiLCAgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHgwNyAgICB9IH0sCit7ICAgICJhZGRiMiIsCXsicmJtYiIsCQkweDA4CX0gfSwKK3sgICAgIm1vdmIiLAl7InJid2IiLAkJMHgwOQl9IH0sCit7ICAgICJhZGR3MiIsCXsicndtdyIsCQkweDBhCX0gfSwKK3sgICAgIm1vdnciLAl7InJ3d3ciLAkJMHgwYgl9IH0sCit7ICAgICJhZGRsMiIsCXsicmxtbCIsCQkweDBjCX0gfSwKK3sgICAgIm1vdmwiLAl7InJsd2wiLAkJMHgwZAl9IH0sCit7ICAgICJiYnMiLAl7InJsdmxidyIsCQkweDBlCX0gfSwKK3sgICAgIm5vcCIsICAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDEwICAgIH0gfSwKK3sgICAgImJyYiIsCXsiYmIiLAkJCTB4MTEJfSB9LAoreyAgICAiYnJ3IiwJeyJidyIsCQkJMHgxMwl9IH0sCit7ICAgICJjb3NmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHgxNSAgICB9IH0sCit7ICAgICJsbmYiLCAgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHgxNiAgICB9IH0sCit7ICAgICJsbmQiLCAgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHgxNyAgICB9IH0sCit7ICAgICJhZGRiMyIsCXsicmJyYndiIiwJCTB4MTgJfSB9LAoreyAgICAiY21wYiIsCXsicmJ3YiIsCQkweDE5CX0gfSwgCit7ICAgICJhZGR3MyIsCXsicndyd3d3IiwJCTB4MWEJfSB9LAoreyAgICAiY21wdyIsCXsicnd3dyIsCQkweDFiCX0gfSwKK3sgICAgImFkZGwzIiwJeyJybHJsd2wiLAkJMHgxYwl9IH0sCit7ICAgICJjbXBsIiwJeyJybHdsIiwJCTB4MWQJfSB9LAoreyAgICAiYmJjIiwJeyJybHZsYnciLAkJMHgxZQl9IH0sCit7ICAgICJyZWkiLAl7IiIsCQkJMHgyMAl9IH0sCit7ICAgICJibmVxIiwJeyJiYiIsCQkJMHgyMQl9IH0sCit7ICAgICJibmVxdSIsCXsiYmIiLAkJCTB4MjEJfSB9LAoreyAgICAiY3Z0d2wiLAl7InJ3d2wiLAkJMHgyMwl9IH0sCit7ICAgICJzdGYiLCAgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHgyNiAgICB9IH0sCit7ICAgICJzdGQiLCAgICAgeyJ3cSIsICAgICAgICAgICAgICAgICAgMHgyNyAgICB9IH0sCit7ICAgICJzdWJiMiIsCXsicmJtYiIsCQkweDI4CX0gfSwKK3sgICAgIm1jb21iIiwJeyJyYndiIiwJCTB4MjkJfSB9LAoreyAgICAic3VidzIiLAl7InJ3bXciLAkJMHgyYQl9IH0sCit7ICAgICJtY29tdyIsCXsicnd3dyIsCQkweDJiCX0gfSwKK3sgICAgInN1YmwyIiwgICB7InJsbWwiLCAgICAgICAgICAgICAgICAweDJjICAgIH0gfSwKK3sgICAgIm1jb21sIiwgICB7InJsd2wiLCAgICAgICAgICAgICAgICAweDJkICAgIH0gfSwKK3sgICAgImVtdWwiLAl7InJscmxybHdxIiwJCTB4MmUJfSB9LAoreyAgICAiYW9ibHNzIiwJeyJybG1sYnciLAkJMHgyZgl9IH0sCit7ICAgICJicHQiLAl7IiIsCQkJMHgzMAl9IH0sCit7ICAgICJiZXFsIiwJeyJiYiIsCQkJMHgzMQl9IH0sCit7ICAgICJiZXFsdSIsCXsiYmIiLAkJCTB4MzEJfSB9LAoreyAgICAiY3Z0d2IiLAl7InJ3d2IiLAkJMHgzMwl9IH0sCit7ICAgICJsb2dmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHgzNSAgICB9IH0sCit7ICAgICJjbXBmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHgzNiAgICB9IH0sCit7ICAgICJjbXBkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHgzNyAgICB9IH0sCit7ICAgICJzdWJiMyIsCXsicmJyYndiIiwJCTB4MzgJfSB9LAoreyAgICAiYml0YiIsCXsicmJyYiIsCQkweDM5CX0gfSwKK3sgICAgInN1YnczIiwJeyJyd3J3d3ciLAkJMHgzYQl9IH0sCit7ICAgICJiaXR3IiwJeyJyd3J3IiwJCTB4M2IJfSB9LAoreyAgICAic3VibDMiLAl7InJscmx3bCIsCQkweDNjCX0gfSwKK3sgICAgImJpdGwiLAl7InJscmwiLAkJMHgzZAl9IH0sCit7ICAgICJlZGl2IiwJeyJybHJxd2x3bCIsCQkweDNlCX0gfSwKK3sgICAgImFvYmxlcSIsCXsicmxtbGJ3IiwJCTB4M2YJfSB9LAoreyAgICAicmV0IiwJeyIiLAkJCTB4NDAJfSB9LAoreyAgICAiYmd0ciIsCXsiYmIiLAkJCTB4NDEJfSB9LAoreyAgICAic3FydGYiLCAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NDUgICAgfSB9LAoreyAgICAiY21wZjIiLCAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NDYgICAgfSB9LAoreyAgICAiY21wZDIiLCAgIHsicnFycSIsICAgICAgICAgICAgICAgIDB4NDcgICAgfSB9LAoreyAgICAic2hsbCIsICAgIHsicmJybHdsIiwgICAgICAgICAgICAgIDB4NDggICAgfSB9LAoreyAgICAiY2xyYiIsCXsid2IiLAkJCTB4NDkJfSB9LAoreyAgICAic2hscSIsCXsicmJycXdxIiwJCTB4NGEJfSB9LAoreyAgICAiY2xydyIsCXsid3ciLAkJCTB4NGIJfSB9LAoreyAgICAibXVsbDIiLAl7InJsbWwiLAkJMHg0Ywl9IH0sCit7ICAgICJjbHJsIiwJeyJ3bCIsCQkJMHg0ZAl9IH0sCit7ICAgICJzaGFsIiwgICAgeyJyYnJsd2wiLAkJMHg0ZQl9IH0sCit7ICAgICJibGVxIiwJeyJiYiIsCQkJMHg1MQl9IH0sCit7ICAgICJleHBmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg1NSAgICB9IH0sCit7ICAgICJ0c3RmIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg1NiAgICB9IH0sCit7ICAgICJ0c3RkIiwgICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg1NyAgICB9IH0sCit7ICAgICJzaHJsIiwgICAgeyJyYnJsd2wiLAkJMHg1OAl9IH0sCit7ICAgICJ0c3RiIiwJeyJyYiIsCQkJMHg1OQl9IH0sCit7ICAgICJzaHJxIiwgICAgeyJyYnJxd3EiLAkJMHg1YQl9IH0sCit7ICAgICJ0c3R3IiwJeyJydyIsCQkJMHg1Ygl9IH0sCit7ICAgICJtdWxsMyIsCXsicmxybHdsIiwJCTB4NWMJfSB9LAoreyAgICAidHN0bCIsCXsicmwiLAkJCTB4NWQJfSB9LAoreyAgICAic2hhciIsCXsicmJybHdsIiwJCTB4NWUJfSB9LAoreyAgICAiYmJzc2kiLAl7InJsbWxidyIsCQkweDVmCX0gfSwKK3sgICAgImxkcGN0eCIsCXsiIiwJCQkweDYwCX0gfSwKK3sgICAgInB1c2hkIiwgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDY3ICAgIH0gfSwKK3sgICAgImluY2IiLAl7Im1iIiwJCQkweDY5CX0gfSwKK3sgICAgImluY3ciLAl7Im13IiwJCQkweDZiCX0gfSwKK3sgICAgImRpdmwyIiwJeyJybG1sIiwJCTB4NmMJfSB9LAoreyAgICAiaW5jbCIsCXsibWwiLAkJCTB4NmQJfSB9LAoreyAgICAiY3Z0bGIiLAl7InJsd2IiLAkJMHg2Zgl9IH0sCit7ICAgICJzdnBjdHgiLAl7IiIsCQkJMHg3MAl9IH0sCit7ICAgICJqbXAiLAl7ImFiIiwJCQkweDcxCX0gfSwKK3sgICAgImN2bGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDc2ICAgIH0gfSwKK3sgICAgImN2bGQiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDc3ICAgIH0gfSwKK3sgICAgImRlY2IiLAl7Im1iIiwJCQkweDc5CX0gfSwKK3sgICAgImRlY3ciLAl7Im13IiwJCQkweDdiCX0gfSwKK3sgICAgImRpdmwzIiwJeyJybHJsd2wiLAkJMHg3Ywl9IH0sCit7ICAgICJkZWNsIiwJeyJtbCIsCQkJMHg3ZAl9IH0sCit7ICAgICJjdnRsdyIsCXsicmx3dyIsCQkweDdmCX0gfSwKK3sgICAgImJnZXEiLAl7ImJiIiwJCQkweDgxCX0gfSwKK3sgICAgIm1vdnMyIiwJeyJhYmFiIiwJCTB4ODIJfSB9LAoreyAgICAiY3ZmbCIsICAgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4ODYgICAgfSB9LAoreyAgICAiY3ZkbCIsICAgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4ODcgICAgfSB9LAoreyAgICAib3JiMiIsCXsicmJtYiIsCQkweDg4CX0gfSwKK3sgICAgImN2dGJsIiwJeyJyYndsIiwJCTB4ODkJfSB9LAoreyAgICAib3J3MiIsCXsicndtdyIsCQkweDhhCX0gfSwKK3sgICAgImJpc3BzdyIsCXsicnciLAkJCTB4OGIJfSB9LAoreyAgICAib3JsMiIsICAgIHsicmxtbCIsICAgICAgICAgICAgICAgIDB4OGMgICAgfSB9LAoreyAgICAiYWR3YyIsCXsicmxtbCIsCQkweDhkCX0gfSwKK3sgICAgImFkZGEiLCAJeyJybG1sIiwJCTB4OGUJfSB9LAoreyAgICAiYmxzcyIsCXsiYmIiLAkJCTB4OTEJfSB9LAoreyAgICAiY21wczIiLCAgIHsiYWJhYiIsCQkweDkyCX0gfSwKK3sgICAgImxkZmQiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDk3ICAgIH0gfSwKK3sgICAgIm9yYjMiLAl7InJicmJ3YiIsCQkweDk4CX0gfSwKK3sgICAgImN2dGJ3IiwJeyJyYnd3IiwJCTB4OTkJfSB9LAoreyAgICAib3J3MyIsICAgCXsicndyd3d3IiwJCTB4OWEJfSB9LAoreyAgICAiYmljcHN3IiwJeyJydyIsCQkJMHg5Ygl9IH0sCit7ICAgICJvcmwzIiwgICAgeyJybHJsd2wiLCAgICAgICAgICAgICAgMHg5YyAgICB9IH0sCit7ICAgICJzYndjIiwJeyJybG1sIiwJCTB4OWQJfSB9LAoreyAgICAic3ViYSIsICAgIHsicmxtbCIsICAgICAgICAgICAgICAgIDB4OWUgICAgfSB9LAoreyAgICAiYmd0cnUiLAl7ImJiIiwJCQkweGExCX0gfSwKK3sgICAgImN2ZGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweGE2ICAgIH0gfSwKK3sgICAgImFuZGIyIiwgICB7InJibWIiLAkJMHhhOCAgICB9IH0sCit7ICAgICJtb3Z6YmwiLAl7InJid2wiLAkJMHhhOQl9IH0sCit7ICAgICJhbmR3MiIsICAgeyJyd213IiwJCTB4YWEgICAgfSB9LAoreyAgICAibG9hZHIiLCAgIHsicndhbCIsCQkweGFiCX0gfSwKK3sgICAgImFuZGwyIiwgICB7InJsbWwiLAkJMHhhYyAgICB9IH0sCit7ICAgICJtdHByIiwJeyJybHJsIiwJCTB4YWQJfSB9LAoreyAgICAiZmZzIiwJeyJybHdsIiwJCTB4YWUJfSB9LAoreyAgICAiYmxlcXUiLAl7ImJiIiwJCQkweGIxCX0gfSwKK3sgICAgIm5lZ2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweGI2ICAgIH0gfSwKK3sgICAgIm5lZ2QiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweGI3ICAgIH0gfSwKK3sgICAgImFuZGIzIiwgICB7InJicmJ3YiIsICAgICAgICAgICAgICAweGI4ICAgIH0gfSwKK3sgICAgIm1vdnpidyIsCXsicmJ3dyIsCQkweGI5CX0gfSwKK3sgICAgImFuZHczIiwgICB7InJ3cnd3dyIsCQkweGJhICAgIH0gfSwKK3sgICAgInN0b3JlciIsICB7InJ3YWwiLCAgICAgICAgICAgICAgICAweGJiICAgIH0gfSwKK3sgICAgImFuZGwzIiwgICB7InJscmx3bCIsCQkweGJjICAgIH0gfSwKK3sgICAgIm1mcHIiLAl7InJsd2wiLAkJMHhiZAl9IH0sCit7ICAgICJmZmMiLAl7InJsd2wiLAkJMHhiZQl9IH0sCit7ICAgICJjYWxscyIsCXsicmJhYiIsCQkweGJmCX0gfSwKK3sgICAgInByb2JlciIsCXsicmJhYnJsIiwJCTB4YzAJfSB9LAoreyAgICAiYnZjIiwJeyJiYiIsCQkJMHhjMQl9IH0sCit7ICAgICJtb3ZzMyIsCXsiYWJhYnJ3IiwJCTB4YzIJfSB9LAoreyAgICAibW92endsIiwJeyJyd3dsIiwJCTB4YzMJfSB9LAoreyAgICAiYWRkZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4YzYgICAgfSB9LAoreyAgICAiYWRkZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4YzcgICAgfSB9LAoreyAgICAieG9yYjIiLCAgIHsicmJtYiIsICAgICAgICAgICAgICAgIDB4YzggICAgfSB9LAoreyAgICAibW92b2IiLCAgIHsicmJ3YiIsICAgICAgICAgICAgICAgIDB4YzkgICAgfSB9LAoreyAgICAieG9ydzIiLCAgIHsicndtdyIsICAgICAgICAgICAgICAgIDB4Y2EgICAgfSB9LAoreyAgICAibW92b3ciLCAgIHsicnd3dyIsICAgICAgICAgICAgICAgIDB4Y2IJfSB9LAoreyAgICAieG9ybDIiLAl7InJsbWwiLCAgICAgICAgICAgICAgICAweGNjICAgIH0gfSwKK3sgICAgIm1vdnBzbCIsICB7IndsIiwgICAgICAgICAgICAgICAgICAweGNkICAgIH0gfSwKK3sgICAgImtjYWxsIiwgICB7InJ3IiwJCQkweGNmCX0gfSwKK3sgICAgInByb2JldyIsICB7InJiYWJybCIsCQkweGQwCX0gfSwKK3sgICAgImJ2cyIsICAgICB7ImJiIiwJCQkweGQxCX0gfSwKK3sgICAgImNtcHMzIiwgICB7ImFiYWJydyIsCQkweGQyCX0gfSwKK3sgICAgInN1YmYiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGQ2ICAgIH0gfSwKK3sgICAgInN1YmQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweGQ3ICAgIH0gfSwKK3sgICAgInhvcmIzIiwJeyJyYnJid2IiLAkJMHhkOAl9IH0sCit7ICAgICJwdXNoYiIsICAgeyJyYiIsCQkJMHhkOQl9IH0sCit7ICAgICJ4b3J3MyIsCXsicndyd3d3IiwJCTB4ZGEJfSB9LAoreyAgICAicHVzaHciLCAgIHsicnciLCAJCQkweGRiCX0gfSwKK3sgICAgInhvcmwzIiwJeyJybHJsd2wiLAkJMHhkYwl9IH0sCit7ICAgICJwdXNobCIsCXsicmwiLAkJCTB4ZGQJfSB9LAoreyAgICAiaW5zcXVlIiwJeyJhYmFiIiwJCTB4ZTAJfSB9LAoreyAgICAiYmNzIiwJeyJiYiIsCQkJMHhlMQl9IH0sCit7ICAgICJiZ2VxdSIsCXsiYmIiLAkJCTB4ZTEJfSB9LAoreyAgICAibXVsZiIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZTYgICAgfSB9LAoreyAgICAibXVsZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZTcgICAgfSB9LAoreyAgICAibW5lZ2IiLAl7InJid2IiLAkJMHhlOAl9IH0sCit7ICAgICJtb3ZhYiIsCXsiYWJ3bCIsCQkweGU5CX0gfSwKK3sgICAgIm1uZWd3IiwJeyJyd3d3IiwJCTB4ZWEJfSB9LAoreyAgICAibW92YXciLAl7ImF3d2wiLAkJMHhlYgl9IH0sCit7ICAgICJtbmVnbCIsCXsicmx3bCIsCQkweGVjCX0gfSwKK3sgICAgIm1vdmFsIiwJeyJhbHdsIiwJCTB4ZWQJfSB9LAoreyAgICAicmVtcXVlIiwJeyJhYiIsICAJCTB4ZjAJfSB9LAoreyAgICAiYmNjIiwJeyJiYiIsCQkJMHhmMQl9IH0sCit7ICAgICJibHNzdSIsCXsiYmIiLAkJCTB4ZjEJfSB9LAoreyAgICAiZGl2ZiIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZjYgICAgfSB9LAoreyAgICAiZGl2ZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZjcgICAgfSB9LAoreyAgICAibW92YmxrIiwgIHsiYWxhbHJ3IiwgICAgICAgICAgICAgIDB4ZjgJfSB9LAoreyAgICAicHVzaGFiIiwJeyJhYiIsCQkJMHhmOQl9IH0sCit7ICAgICJwdXNoYXciLAl7ImF3IiwJCQkweGZiCX0gfSwKK3sgICAgImNhc2VsIiwJeyJybHJscmwiLAkJMHhmYwl9IH0sCit7ICAgICJwdXNoYWwiLAl7ImFsIiwJCQkweGZkCX0gfSwKK3sgICAgImNhbGxmIiwJeyJyYmFiIiwJCTB4ZmUJfSB9LAoreyAgICAgICIiICAgICAgICwgICAiIiAgICAgICAgICB9IC8qIGVtcHR5IGlzIGVuZCBzZW50aW5lbCAqLworCit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvdGljMzAuaCBiL2luY2x1ZGUvb3Bjb2RlL3RpYzMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwMDI3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvb3Bjb2RlL3RpYzMwLmgKQEAgLTAsMCArMSw2OTEgQEAKKy8qIHRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEMzMCBvcGNvZGUgdGFibGUKKyAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZJWE1FOiBUaGUgb3Bjb2RlIHRhYmxlIHNob3VsZCBiZSBpbiBvcGNvZGVzL3RpYzMwLW9wYy5jLCBub3QgaW4gYQorICAgaGVhZGVyIGZpbGUuICAqLworCisjaWZuZGVmIF9UTVMzMjBfSF8KKyNkZWZpbmUgX1RNUzMyMF9IXworCitzdHJ1Y3QgX3JlZ2lzdGVyCit7CisgIGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOworICB1bnNpZ25lZCBjaGFyIHJlZ3R5cGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXIgcmVnOworCisjZGVmaW5lIFJFR19SbiAgICAweDAxCisjZGVmaW5lIFJFR19BUm4gICAweDAyCisjZGVmaW5lIFJFR19EUCAgICAweDAzCisjZGVmaW5lIFJFR19PVEhFUiAweDA0CisKK3N0YXRpYyBjb25zdCByZWcgdGljMzBfcmVndGFiW10gPSB7CisgIHsgInIwIiwgMHgwMCwgUkVHX1JuIH0sCisgIHsgInIxIiwgMHgwMSwgUkVHX1JuIH0sCisgIHsgInIyIiwgMHgwMiwgUkVHX1JuIH0sCisgIHsgInIzIiwgMHgwMywgUkVHX1JuIH0sCisgIHsgInI0IiwgMHgwNCwgUkVHX1JuIH0sCisgIHsgInI1IiwgMHgwNSwgUkVHX1JuIH0sCisgIHsgInI2IiwgMHgwNiwgUkVHX1JuIH0sCisgIHsgInI3IiwgMHgwNywgUkVHX1JuIH0sCisgIHsgImFyMCIsMHgwOCwgUkVHX0FSbiB9LAorICB7ICJhcjEiLDB4MDksIFJFR19BUm4gfSwKKyAgeyAiYXIyIiwweDBBLCBSRUdfQVJuIH0sCisgIHsgImFyMyIsMHgwQiwgUkVHX0FSbiB9LAorICB7ICJhcjQiLDB4MEMsIFJFR19BUm4gfSwKKyAgeyAiYXI1IiwweDBELCBSRUdfQVJuIH0sCisgIHsgImFyNiIsMHgwRSwgUkVHX0FSbiB9LAorICB7ICJhcjciLDB4MEYsIFJFR19BUm4gfSwKKyAgeyAiZHAiLCAweDEwLCBSRUdfRFAgfSwKKyAgeyAiaXIwIiwweDExLCBSRUdfT1RIRVIgfSwKKyAgeyAiaXIxIiwweDEyLCBSRUdfT1RIRVIgfSwKKyAgeyAiYmsiLCAweDEzLCBSRUdfT1RIRVIgfSwKKyAgeyAic3AiLCAweDE0LCBSRUdfT1RIRVIgfSwKKyAgeyAic3QiLCAweDE1LCBSRUdfT1RIRVIgfSwKKyAgeyAiaWUiLCAweDE2LCBSRUdfT1RIRVIgfSwKKyAgeyAiaWYiLCAweDE3LCBSRUdfT1RIRVIgfSwKKyAgeyAiaW9mIiwweDE4LCBSRUdfT1RIRVIgfSwKKyAgeyAicnMiLCAweDE5LCBSRUdfT1RIRVIgfSwKKyAgeyAicmUiLCAweDFBLCBSRUdfT1RIRVIgfSwKKyAgeyAicmMiLCAweDFCLCBSRUdfT1RIRVIgfSwKKyAgeyAiUjAiLCAweDAwLCBSRUdfUm4gfSwKKyAgeyAiUjEiLCAweDAxLCBSRUdfUm4gfSwKKyAgeyAiUjIiLCAweDAyLCBSRUdfUm4gfSwKKyAgeyAiUjMiLCAweDAzLCBSRUdfUm4gfSwKKyAgeyAiUjQiLCAweDA0LCBSRUdfUm4gfSwKKyAgeyAiUjUiLCAweDA1LCBSRUdfUm4gfSwKKyAgeyAiUjYiLCAweDA2LCBSRUdfUm4gfSwKKyAgeyAiUjciLCAweDA3LCBSRUdfUm4gfSwKKyAgeyAiQVIwIiwweDA4LCBSRUdfQVJuIH0sCisgIHsgIkFSMSIsMHgwOSwgUkVHX0FSbiB9LAorICB7ICJBUjIiLDB4MEEsIFJFR19BUm4gfSwKKyAgeyAiQVIzIiwweDBCLCBSRUdfQVJuIH0sCisgIHsgIkFSNCIsMHgwQywgUkVHX0FSbiB9LAorICB7ICJBUjUiLDB4MEQsIFJFR19BUm4gfSwKKyAgeyAiQVI2IiwweDBFLCBSRUdfQVJuIH0sCisgIHsgIkFSNyIsMHgwRiwgUkVHX0FSbiB9LAorICB7ICJEUCIsIDB4MTAsIFJFR19EUCB9LAorICB7ICJJUjAiLDB4MTEsIFJFR19PVEhFUiB9LAorICB7ICJJUjEiLDB4MTIsIFJFR19PVEhFUiB9LAorICB7ICJCSyIsIDB4MTMsIFJFR19PVEhFUiB9LAorICB7ICJTUCIsIDB4MTQsIFJFR19PVEhFUiB9LAorICB7ICJTVCIsIDB4MTUsIFJFR19PVEhFUiB9LAorICB7ICJJRSIsIDB4MTYsIFJFR19PVEhFUiB9LAorICB7ICJJRiIsIDB4MTcsIFJFR19PVEhFUiB9LAorICB7ICJJT0YiLDB4MTgsIFJFR19PVEhFUiB9LAorICB7ICJSUyIsIDB4MTksIFJFR19PVEhFUiB9LAorICB7ICJSRSIsIDB4MUEsIFJFR19PVEhFUiB9LAorICB7ICJSQyIsIDB4MUIsIFJFR19PVEhFUiB9LAorICB7ICIiLCAgIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHJlZyAqY29uc3QgdGljMzBfcmVndGFiX2VuZAorICA9IHRpYzMwX3JlZ3RhYiArIHNpemVvZih0aWMzMF9yZWd0YWIpL3NpemVvZih0aWMzMF9yZWd0YWJbMF0pOworCisvKiBJbmRpcmVjdCBBZGRyZXNzaW5nIE1vZGVzIE1vZGlmaWNhdGlvbiBGaWVsZHMgKi8KKy8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBEaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgUHJlRGlzcF9BZGQgICAgICAgIDB4MDAKKyNkZWZpbmUgUHJlRGlzcF9TdWIgICAgICAgIDB4MDEKKyNkZWZpbmUgUHJlRGlzcF9BZGRfTW9kICAgIDB4MDIKKyNkZWZpbmUgUHJlRGlzcF9TdWJfTW9kICAgIDB4MDMKKyNkZWZpbmUgUG9zdERpc3BfQWRkX01vZCAgIDB4MDQKKyNkZWZpbmUgUG9zdERpc3BfU3ViX01vZCAgIDB4MDUKKyNkZWZpbmUgUG9zdERpc3BfQWRkX0NpcmMgIDB4MDYKKyNkZWZpbmUgUG9zdERpc3BfU3ViX0NpcmMgIDB4MDcKKy8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjAgKi8KKyNkZWZpbmUgUHJlSVIwX0FkZCAgICAgICAgIDB4MDgKKyNkZWZpbmUgUHJlSVIwX1N1YiAgICAgICAgIDB4MDkKKyNkZWZpbmUgUHJlSVIwX0FkZF9Nb2QgICAgIDB4MEEKKyNkZWZpbmUgUHJlSVIwX1N1Yl9Nb2QgICAgIDB4MEIKKyNkZWZpbmUgUG9zdElSMF9BZGRfTW9kICAgIDB4MEMKKyNkZWZpbmUgUG9zdElSMF9TdWJfTW9kICAgIDB4MEQKKyNkZWZpbmUgUG9zdElSMF9BZGRfQ2lyYyAgIDB4MEUKKyNkZWZpbmUgUG9zdElSMF9TdWJfQ2lyYyAgIDB4MEYKKy8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjEgKi8KKyNkZWZpbmUgUHJlSVIxX0FkZCAgICAgICAgIDB4MTAKKyNkZWZpbmUgUHJlSVIxX1N1YiAgICAgICAgIDB4MTEKKyNkZWZpbmUgUHJlSVIxX0FkZF9Nb2QgICAgIDB4MTIKKyNkZWZpbmUgUHJlSVIxX1N1Yl9Nb2QgICAgIDB4MTMKKyNkZWZpbmUgUG9zdElSMV9BZGRfTW9kICAgIDB4MTQKKyNkZWZpbmUgUG9zdElSMV9TdWJfTW9kICAgIDB4MTUKKyNkZWZpbmUgUG9zdElSMV9BZGRfQ2lyYyAgIDB4MTYKKyNkZWZpbmUgUG9zdElSMV9TdWJfQ2lyYyAgIDB4MTcKKy8qIEluZGlyZWN0IEFkZHJlc3NpbmcgKFNwZWNpYWwgQ2FzZXMpICovCisjZGVmaW5lIEluZGlyZWN0T25seSAgICAgICAweDE4CisjZGVmaW5lIFBvc3RJUjBfQWRkX0JpdFJldiAweDE5CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqc3ludGF4OworICB1bnNpZ25lZCBjaGFyIG1vZGZpZWxkOworICB1bnNpZ25lZCBjaGFyIGRpc3BsYWNlbWVudDsKK30gaW5kX2FkZHJfdHlwZTsKKworI2RlZmluZSBJTVBMSUVEX0RJU1AgIDB4MDEKKyNkZWZpbmUgRElTUF9SRVFVSVJFRCAweDAyCisjZGVmaW5lIE5PX0RJU1AgICAgICAgMHgwMworCitzdGF0aWMgY29uc3QgaW5kX2FkZHJfdHlwZSB0aWMzMF9pbmRhZGRyX3RhYltdID0geworICB7ICIqK2FyIiwgICAgICAgUHJlRGlzcF9BZGQsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKKyAgeyAiKi1hciIsICAgICAgIFByZURpc3BfU3ViLCAgICAgICAgSU1QTElFRF9ESVNQIH0sCisgIHsgIiorK2FyIiwgICAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIElNUExJRURfRElTUCB9LAorICB7ICIqLS1hciIsICAgICAgUHJlRGlzcF9TdWJfTW9kLCAgICBJTVBMSUVEX0RJU1AgfSwKKyAgeyAiKmFyKysiLCAgICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCisgIHsgIiphci0tIiwgICAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIElNUExJRURfRElTUCB9LAorICB7ICIqYXIrKyUiLCAgICAgUG9zdERpc3BfQWRkX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKKyAgeyAiKmFyLS0lIiwgICAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgSU1QTElFRF9ESVNQIH0sCisgIHsgIiorYXIoKSIsICAgICBQcmVEaXNwX0FkZCwgICAgICAgIERJU1BfUkVRVUlSRUQgfSwKKyAgeyAiKi1hcigpIiwgICAgIFByZURpc3BfU3ViLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAorICB7ICIqKythcigpIiwgICAgUHJlRGlzcF9BZGRfTW9kLCAgICBESVNQX1JFUVVJUkVEIH0sCisgIHsgIiotLWFyKCkiLCAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKKyAgeyAiKmFyKysoKSIsICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgRElTUF9SRVFVSVJFRCB9LAorICB7ICIqYXItLSgpIiwgICAgUG9zdERpc3BfU3ViX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCisgIHsgIiphcisrKCklIiwgICBQb3N0RGlzcF9BZGRfQ2lyYywgIERJU1BfUkVRVUlSRUQgfSwKKyAgeyAiKmFyLS0oKSUiLCAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAorICB7ICIqK2FyKGlyMCkiLCAgUHJlSVIwX0FkZCwgICAgICAgICBOT19ESVNQIH0sCisgIHsgIiotYXIoaXIwKSIsICBQcmVJUjBfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKKyAgeyAiKisrYXIoaXIwKSIsIFByZUlSMF9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAorICB7ICIqLS1hcihpcjApIiwgUHJlSVIwX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCisgIHsgIiphcisrKGlyMCkiLCBQb3N0SVIwX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKKyAgeyAiKmFyLS0oaXIwKSIsIFBvc3RJUjBfU3ViX01vZCwgICAgTk9fRElTUCB9LAorICB7ICIqYXIrKyhpcjApJSIsUG9zdElSMF9BZGRfQ2lyYywgICBOT19ESVNQIH0sCisgIHsgIiphci0tKGlyMCklIixQb3N0SVIwX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKKyAgeyAiKithcihpcjEpIiwgIFByZUlSMV9BZGQsICAgICAgICAgTk9fRElTUCB9LAorICB7ICIqLWFyKGlyMSkiLCAgUHJlSVIxX1N1YiwgICAgICAgICBOT19ESVNQIH0sCisgIHsgIiorK2FyKGlyMSkiLCBQcmVJUjFfQWRkX01vZCwgICAgIE5PX0RJU1AgfSwKKyAgeyAiKi0tYXIoaXIxKSIsIFByZUlSMV9TdWJfTW9kLCAgICAgTk9fRElTUCB9LAorICB7ICIqYXIrKyhpcjEpIiwgUG9zdElSMV9BZGRfTW9kLCAgICBOT19ESVNQIH0sCisgIHsgIiphci0tKGlyMSkiLCBQb3N0SVIxX1N1Yl9Nb2QsICAgIE5PX0RJU1AgfSwKKyAgeyAiKmFyKysoaXIxKSUiLFBvc3RJUjFfQWRkX0NpcmMsICAgTk9fRElTUCB9LAorICB7ICIqYXItLShpcjEpJSIsUG9zdElSMV9TdWJfQ2lyYywgICBOT19ESVNQIH0sCisgIHsgIiphciIsICAgICAgICBJbmRpcmVjdE9ubHksICAgICAgIE5PX0RJU1AgfSwKKyAgeyAiKmFyKysoaXIwKWIiLFBvc3RJUjBfQWRkX0JpdFJldiwgTk9fRElTUCB9LAorICB7ICIiLCAgICAgICAgICAgMCwwIH0KK307CisKK3N0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlICpjb25zdCB0aWMzMF9pbmRhZGRydGFiX2VuZAorICA9IHRpYzMwX2luZGFkZHJfdGFiICsgc2l6ZW9mKHRpYzMwX2luZGFkZHJfdGFiKS9zaXplb2YodGljMzBfaW5kYWRkcl90YWJbMF0pOworCisvKiBQb3NzaWJsZSBvcGVyYW5kIHR5cGVzICovCisvKiBSZWdpc3RlciB0eXBlcyAqLworI2RlZmluZSBSbiAgICAgICAweDAwMDEKKyNkZWZpbmUgQVJuICAgICAgMHgwMDAyCisjZGVmaW5lIERQUmVnICAgIDB4MDAwNAorI2RlZmluZSBPdGhlclJlZyAweDAwMDgKKy8qIEFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLworI2RlZmluZSBEaXJlY3QgICAweDAwMTAKKyNkZWZpbmUgSW5kaXJlY3QgMHgwMDIwCisjZGVmaW5lIEltbTE2ICAgIDB4MDA0MAorI2RlZmluZSBEaXNwICAgICAweDAwODAKKyNkZWZpbmUgSW1tMjQgICAgMHgwMTAwCisjZGVmaW5lIEFiczI0ICAgIDB4MDIwMAorLyogMyBvcGVyYW5kIGFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLworI2RlZmluZSBvcDNUMSAgICAweDA0MDAKKyNkZWZpbmUgb3AzVDIgICAgMHgwODAwCisvKiBJbnRlcnJ1cHQgdmVjdG9yICovCisjZGVmaW5lIElWZWN0b3IgIDB4MTAwMAorLyogTm90IHJlcXVpcmVkICovCisjZGVmaW5lIE5vdFJlcSAgIDB4MjAwMAorCisjZGVmaW5lIEdBZGRyMSAgIFJuIHwgRGlyZWN0IHwgSW5kaXJlY3QgfCBJbW0xNgorI2RlZmluZSBHQWRkcjIgICBHQWRkcjEgfCBBbGxSZWcKKyNkZWZpbmUgVEFkZHIxICAgb3AzVDEgfCBSbiB8IEluZGlyZWN0CisjZGVmaW5lIFRBZGRyMiAgIG9wM1QyIHwgUm4gfCBJbmRpcmVjdAorI2RlZmluZSBSZWcgICAgICBSbiB8IEFSbgorI2RlZmluZSBBbGxSZWcgICBSZWcgfCBEUFJlZyB8IE90aGVyUmVnCisKK3R5cGVkZWYgc3RydWN0IF90ZW1wbGF0ZQoreworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7IC8qIGhvdyBtYW55IG9wZXJhbmRzICovCisgIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlICovCisgIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KKyAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKKyAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKKworICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KKyNkZWZpbmUgQWRkcmVzc01vZGUgMHgwMDYwMDAwMAorI2RlZmluZSBQQ1JlbCAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIFN0YWNrT3AgICAgIDB4MDAxRjAwMDAKKyNkZWZpbmUgUm90YXRlICAgICAgU3RhY2tPcAorICAKKyAgLyogb3BlcmFuZF90eXBlc1tpXSBkZXNjcmliZXMgdGhlIHR5cGUgb2Ygb3BlcmFuZCBpLiAgVGhpcyBpcyBtYWRlCisgICAgIGJ5IE9SJ2luZyB0b2dldGhlciBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGUgbWFza3MuICAoZS5nLgorICAgICAnb3BlcmFuZF90eXBlc1tpXSA9IFJlZ3xJbW0nIHNwZWNpZmllcyB0aGF0IG9wZXJhbmQgaSBjYW4gYmUKKyAgICAgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KKyAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbM107CisgIC8qIFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIHR5cGUgb2YgYW4gaW1tZWRpYXRlIGFyZ3VtZW50IHRvIGFuIGluc3RydWN0aW9uLiAqLworICBpbnQgaW1tX2FyZ190eXBlOworI2RlZmluZSBJbW1fTm9uZSAgMAorI2RlZmluZSBJbW1fRmxvYXQgMQorI2RlZmluZSBJbW1fU0ludCAgMgorI2RlZmluZSBJbW1fVUludCAgMworfQordGVtcGxhdGU7CisKK3N0YXRpYyBjb25zdCB0ZW1wbGF0ZSB0aWMzMF9vcHRhYltdID0geworICB7ICJhYnNmIiAgICwyLDB4MDAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAiYWJzaSIgICAsMiwweDAwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImFkZGMiICAgLDIsMHgwMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJhZGRjMyIgICwzLDB4MjAwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgImFkZGYiICAgLDIsMHgwMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJhZGRmMyIgICwzLDB4MjA4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCisgIHsgImFkZGkiICAgLDIsMHgwMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJhZGRpMyIgICwzLDB4MjEwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgImFuZCIgICAgLDIsMHgwMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAorICB7ICJhbmQzIiAgICwzLDB4MjE4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgImFuZG4iICAgLDIsMHgwMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAorICB7ICJhbmRuMyIgICwzLDB4MjIwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgImFzaCIgICAgLDIsMHgwMzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJhc2gzIiAgICwzLDB4MjI4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgImIiICAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJidSIgICAgICwxLDB4NjgwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmxvIiAgICAsMSwweDY4MDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJscyIgICAgLDEsMHg2ODAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJiaGkiICAgICwxLDB4NjgwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmhzIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJlcSIgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibmUiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmx0IiAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJsZSIgICAgLDEsMHg2ODA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJiZ3QiICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmdlIiAgICAsMSwweDY4MEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJ6IiAgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibnoiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYnAiICAgICAsMSwweDY4MDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJuIiAgICAgLDEsMHg2ODA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibm4iICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm52IiAgICAsMSwweDY4MEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJ2IiAgICAgLDEsMHg2ODBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibnVmIiAgICwxLDB4NjgwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYnVmIiAgICAsMSwweDY4MEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJuYyIgICAgLDEsMHg2ODA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJiYyIgICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm5sdiIgICAsMSwweDY4MTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJsdiIgICAgLDEsMHg2ODExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibmx1ZiIgICwxLDB4NjgxMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmx1ZiIgICAsMSwweDY4MTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJ6dWYiICAgLDEsMHg2ODE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJiZCIgICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYnVkIiAgICAsMSwweDY4MjAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJsb2QiICAgLDEsMHg2ODIxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibHNkIiAgICwxLDB4NjgyMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmhpZCIgICAsMSwweDY4MjMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJoc2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJiZXFkIiAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm5lZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJsdGQiICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibGVkIiAgICwxLDB4NjgyODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmd0ZCIgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJnZWQiICAgLDEsMHg2ODJBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJiemQiICAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm56ZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJwZCIgICAgLDEsMHg2ODI5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibmQiICAgICwxLDB4NjgyNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm5uZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJudmQiICAgLDEsMHg2ODJDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJidmQiICAgICwxLDB4NjgyRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm51ZmQiICAsMSwweDY4MkUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJ1ZmQiICAgLDEsMHg2ODJGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibmNkIiAgICwxLDB4NjgyNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYmNkIiAgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJubHZkIiAgLDEsMHg2ODMwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJibHZkIiAgICwxLDB4NjgzMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYm5sdWZkIiAsMSwweDY4MzIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImJsdWZkIiAgLDEsMHg2ODMzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJienVmZCIgICwxLDB4NjgzNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiYnIiICAgICAsMSwweDYwMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImJyZCIgICAgLDEsMHg2MTAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsIiAgICwxLDB4NjIwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbHUiICAsMSwweDcwMDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxsbyIgLDEsMHg3MDAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsbHMiICwxLDB4NzAwMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbGhpIiAsMSwweDcwMDMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxocyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsZXEiICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbG5lIiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxsdCIgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsbGUiICwxLDB4NzAwODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbGd0IiAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxnZSIgLDEsMHg3MDBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxseiIgICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbG56IiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxwIiAgLDEsMHg3MDA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsbiIgICwxLDB4NzAwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbG5uIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxudiIgLDEsMHg3MDBDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsdiIgICwxLDB4NzAwRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbG51ZiIsMSwweDcwMEUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGx1ZiIgLDEsMHg3MDBGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsbmMiICwxLDB4NzAwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbGMiICAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxubHYiLDEsMHg3MDEwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsbHYiICwxLDB4NzAxMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY2FsbG5sdWYiLDEsMHg3MDEyMDAwMCxQQ1JlbCwgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImNhbGxsdWYiLDEsMHg3MDEzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJjYWxsenVmIiwxLDB4NzAxNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAiY21wZiIgICAsMiwweDA0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImNtcGYzIiAgLDIsMHgyMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJjbXBpIiAgICwyLDB4MDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAiY21waTMiICAsMiwweDIzODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGIiICAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ1IiAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsbyIgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJscyIgICAsMiwweDZDMDIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJoaSIgICAsMiwweDZDMDMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJocyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJlcSIgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuZSIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsdCIgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsZSIgICAsMiwweDZDMDgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJndCIgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJnZSIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ6IiAgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJueiIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJwIiAgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuIiAgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJubiIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJudiIgICAsMiwweDZDMEMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ2IiAgICAsMiwweDZDMEQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJudWYiICAsMiwweDZDMEUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ1ZiIgICAsMiwweDZDMEYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuYyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJjIiAgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJubHYiICAsMiwweDZDMTAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsdiIgICAsMiwweDZDMTEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJubHVmIiAsMiwweDZDMTIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsdWYiICAsMiwweDZDMTMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ6dWYiICAsMiwweDZDMTQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJkIiAgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ1ZCIgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsb2QiICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsc2QiICAsMiwweDZDMjIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJoaWQiICAsMiwweDZDMjMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJoc2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJlcWQiICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuZWQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsdGQiICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsZWQiICAsMiwweDZDMjgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJndGQiICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJnZWQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ6ZCIgICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuemQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJwZCIgICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuZCIgICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJubmQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJudmQiICAsMiwweDZDMkMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ2ZCIgICAsMiwweDZDMkQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJudWZkIiAsMiwweDZDMkUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ1ZmQiICAsMiwweDZDMkYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJuY2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJjZCIgICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJubHZkIiAsMiwweDZDMzAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsdmQiICAsMiwweDZDMzEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJubHVmZCIsMiwweDZDMzIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJsdWZkIiAsMiwweDZDMzMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZGJ6dWZkIiAsMiwweDZDMzQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAiZml4IiAgICAsMiwweDA1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgQWxsUmVnLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJmbG9hdCIgICwyLDB4MDU4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBSbiwgMCB9LCBJbW1fU0ludCB9LAorICB7ICJpYWNrIiAgICwxLDB4MUIwMDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImlkbGUiICAgLDAsMHgwNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImlkbGUyIiAgLDAsMHgwNjAwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLworICB7ICJsZGUiICAgICwyLDB4MDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmIiAgICAsMiwweDA3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZnUiICAgLDIsMHg0MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZsbyIgICwyLDB4NDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmbHMiICAsMiwweDQxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZmhpIiAgLDIsMHg0MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZocyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmZXEiICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZm5lIiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZsdCIgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmbGUiICAsMiwweDQ0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZmd0IiAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZnZSIgICwyLDB4NDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmeiIgICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZm56IiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZwIiAgICwyLDB4NDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmbiIgICAsMiwweDQzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZm5uIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZudiIgICwyLDB4NDYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmdiIgICAsMiwweDQ2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZm51ZiIgLDIsMHg0NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZ1ZiIgICwyLDB4NDc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmbmMiICAsMiwweDQyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZmMiICAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZubHYiICwyLDB4NDgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmbHYiICAsMiwweDQ4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZm5sdWYiLDIsMHg0OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJsZGZsdWYiICwyLDB4NDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibGRmenVmIiAsMiwweDRBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkZmkiICAgLDIsMHgwNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIFJuLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgImxkaSIgICAgLDIsMHgwODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGl1IiAgICwyLDB4NTAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpbG8iICAsMiwweDUwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaWxzIiAgLDIsMHg1MTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGloaSIgICwyLDB4NTE4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpaHMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaWVxIiAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGluZSIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpbHQiICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaWxlIiAgLDIsMHg1NDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGlndCIgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpZ2UiICAsMiwweDU1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaXoiICAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGlueiIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpcCIgICAsMiwweDU0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaW4iICAgLDIsMHg1MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGlubiIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpbnYiICAsMiwweDU2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaXYiICAgLDIsMHg1NjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGludWYiICwyLDB4NTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpdWYiICAsMiwweDU3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaW5jIiAgLDIsMHg1MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGljIiAgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpbmx2IiAsMiwweDU4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaWx2IiAgLDIsMHg1ODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGlubHVmIiwyLDB4NTkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAibGRpbHVmIiAsMiwweDU5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgImxkaXp1ZiIgLDIsMHg1QTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJsZGlpIiAgICwyLDB4MDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCBBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAibGRtIiAgICAsMiwweDA5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgImxkcCIgICAgLDIsMHgwODcwMDAwMCwwLCAgICAgICAgICAgeyBBYnMyNHxEaXJlY3QsIERQUmVnfE5vdFJlcSwgMCB9LCBJbW1fVUludCB9LAorICB7ICJsb3Bvd2VyIiwwLDB4MTA4MDAwMDEsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KKyAgeyAibHNoIiAgICAsMiwweDA5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCisgIHsgImxzaDMiICAgLDMsMHgyNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKKyAgeyAibWF4c3BlZWQiLDAsMHgxMDgwMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCisgIHsgIm1weWYiICAgLDIsMHgwQTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJtcHlmMyIgICwzLDB4MjQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCisgIHsgIm1weWkiICAgLDIsMHgwQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJtcHlpMyIgICwzLDB4MjUwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgIm5lZ2IiICAgLDIsMHgwQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAorICB7ICJuZWdmIiAgICwyLDB4MEI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAibmVnaSIgICAsMiwweDBDMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgIm5vcCIgICAgLDEsMHgwQzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWd8SW5kaXJlY3R8Tm90UmVxLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgIm5vcm0iICAgLDIsMHgwRDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LCAvKkNoZWNrIGFub3RoZXIgc291cmNlKi8KKyAgeyAibm90IiAgICAsMiwweDBEODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCisgIHsgIm9yIiAgICAgLDIsMHgxMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAorICB7ICJvcjMiICAgICwzLDB4MjU4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgInBvcCIgICAgLDEsMHgwRTIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAicG9wZiIgICAsMSwweDBFQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInB1c2giICAgLDEsMHgwRjIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAicHVzaGYiICAsMSwweDBGQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGkiICAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGl1IiAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlsbyIgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlscyIgLDAsMHg3ODAyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGloaSIgLDAsMHg3ODAzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlocyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGllcSIgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGluZSIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlsdCIgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlsZSIgLDAsMHg3ODA4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlndCIgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlnZSIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGl6IiAgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlueiIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlwIiAgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGluIiAgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlubiIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGludiIgLDAsMHg3ODBDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGl2IiAgLDAsMHg3ODBEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGludWYiLDAsMHg3ODBFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGl1ZiIgLDAsMHg3ODBGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGluYyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGljIiAgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlubHYiLDAsMHg3ODEwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlsdiIgLDAsMHg3ODExMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlubHVmIiwwLDB4NzgxMjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGlsdWYiLDAsMHg3ODEzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldGl6dWYiLDAsMHg3ODE0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHMiICAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHN1IiAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNsbyIgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNscyIgLDAsMHg3ODgyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNoaSIgLDAsMHg3ODgzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNocyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNlcSIgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNuZSIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNsdCIgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNsZSIgLDAsMHg3ODg4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNndCIgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNnZSIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHN6IiAgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNueiIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNwIiAgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNuIiAgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNubiIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNudiIgLDAsMHg3ODhDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHN2IiAgLDAsMHg3ODhEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNudWYiLDAsMHg3ODhFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHN1ZiIgLDAsMHg3ODhGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNuYyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNjIiAgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNubHYiLDAsMHg3ODkwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNsdiIgLDAsMHg3ODkxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNubHVmIiwwLDB4Nzg5MjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHNsdWYiLDAsMHg3ODkzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJldHN6dWYiLDAsMHg3ODk0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJuZCIgICAgLDIsMHgxMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJyb2wiICAgICwxLDB4MTFFMDAwMDEsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJvbGMiICAgLDEsMHgxMjYwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAicm9yIiAgICAsMSwweDEyRTBGRkZGLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAorICB7ICJyb3JjIiAgICwxLDB4MTM2MEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInJwdGIiICAgLDEsMHg2NDAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAorICB7ICJycHRzIiAgICwxLDB4MTM5QjAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCAwLCAwIH0sIEltbV9VSW50IH0sCisgIHsgInNpZ2kiICAgLDAsMHgxNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInN0ZiIgICAgLDIsMHgxNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJzdGZpIiAgICwyLDB4MTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgUm4sIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fRmxvYXQgfSwKKyAgeyAic3RpIiAgICAsMiwweDE1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCisgIHsgInN0aWkiICAgLDIsMHgxNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWcsIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fU0ludCB9LAorICB7ICJzdWJiIiAgICwyLDB4MTY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAic3ViYjMiICAsMywweDI2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAorICB7ICJzdWJjIiAgICwyLDB4MTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKKyAgeyAic3ViZiIgICAsMiwweDE3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCisgIHsgInN1YmYzIiAgLDMsMHgyNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKKyAgeyAic3ViaSIgICAsMiwweDE4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgInN1YmkzIiAgLDMsMHgyNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKKyAgeyAic3VicmIiICAsMiwweDE4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCisgIHsgInN1YnJmIiAgLDIsMHgxOTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAorICB7ICJzdWJyaSIgICwyLDB4MTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKKyAgeyAic3dpIiAgICAsMCwweDY2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcCIgICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcHUiICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGxvIiAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGxzIiAsMSwweDc0ODIwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGhpIiAsMSwweDc0ODMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGhzIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGVxIiAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG5lIiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGx0IiAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGxlIiAsMSwweDc0ODgwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGd0IiAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGdlIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcHoiICAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG56IiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcHAiICAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG4iICAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG5uIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG52IiAsMSwweDc0OEMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcHYiICAsMSwweDc0OEQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG51ZiIsMSwweDc0OEUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcHVmIiAsMSwweDc0OEYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG5jIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGMiICAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG5sdiIsMSwweDc0OTAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGx2IiAsMSwweDc0OTEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcG5sdWYiLDEsMHg3NDkyMDAyMCwwLCAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcGx1ZiIsMSwweDc0OTMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHJhcHp1ZiIsMSwweDc0OTQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKKyAgeyAidHN0YiIgICAsMiwweDFBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCisgIHsgInRzdGIzIiAgLDIsMHgyNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCAwIH0sIEltbV9Ob25lIH0sCisgIHsgInhvciIgICAgLDIsMHgxQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAorICB7ICJ4b3IzIiAgICwzLDB4MjgwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCisgIHsgIiIgICAgICAgLDAsMHgwMDAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHRlbXBsYXRlICpjb25zdCB0aWMzMF9vcHRhYl9lbmQgPQorICB0aWMzMF9vcHRhYiArIHNpemVvZih0aWMzMF9vcHRhYikvc2l6ZW9mKHRpYzMwX29wdGFiWzBdKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpuYW1lOworICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMTsKKyAgdW5zaWduZWQgaW50IG9wZXJhbmRzXzI7CisgIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKKyAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbMl1bM107CisgIC8qIFdoaWNoIG9wZXJhbmQgZml0cyBpbnRvIHdoaWNoIHBhcnQgb2YgdGhlIGZpbmFsIG9wY29kZSB3b3JkLiAqLworICBpbnQgb3BvcmRlcjsKK30gcGFydGVtcGxhdGU7CisKKy8qIG9wb3JkZXIgZGVmaW5lcyAtIG5vdCB2ZXJ5IGRlc2NyaXB0aXZlLiAqLworI2RlZmluZSBPT180b3AxICAgMAorI2RlZmluZSBPT180b3AyICAgMQorI2RlZmluZSBPT180b3AzICAgMgorI2RlZmluZSBPT181b3AxICAgMworI2RlZmluZSBPT181b3AyICAgNAorI2RlZmluZSBPT19QRmllbGQgNQorCitzdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgdGljMzBfcGFyb3B0YWJbXSA9IHsKKyAgeyAicV9hYnNmX3N0ZiIsICAgMiwyLDB4QzgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzRvcDEgfSwKKyAgeyAicV9hYnNpX3N0aSIsICAgMiwyLDB4Q0EwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzRvcDEgfSwKKyAgeyAicV9hZGRmM19zdGYiLCAgMywyLDB4Q0MwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT181b3AxIH0sCisgIHsgInFfYWRkaTNfc3RpIiwgIDMsMiwweENFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNW9wMSB9LAorICB7ICJxX2FuZDNfc3RpIiwgICAzLDIsMHhEMDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzVvcDEgfSwKKyAgeyAicV9hc2gzX3N0aSIsICAgMywyLDB4RDIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT181b3AyIH0sCisgIHsgInFfZml4X3N0aSIsICAgIDIsMiwweEQ0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT180b3AxIH0sCisgIHsgInFfZmxvYXRfc3RmIiwgIDIsMiwweEQ2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT180b3AxIH0sCisgIHsgInFfbGRmX2xkZiIsICAgIDIsMiwweEM0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKKwlPT180b3AyIH0sCisgIHsgInFfbGRmX3N0ZiIsICAgIDIsMiwweEQ4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT180b3AxIH0sCisgIHsgInFfbGRpX2xkaSIsICAgIDIsMiwweEM2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKKwlPT180b3AyIH0sCisgIHsgInFfbGRpX3N0aSIsICAgIDIsMiwweERBMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT180b3AxIH0sCisgIHsgInFfbHNoM19zdGkiLCAgIDMsMiwweERDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNW9wMiB9LAorICB7ICJxX21weWYzX2FkZGYzIiwzLDMsMHg4MDAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCisgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKKyAgeyAicV9tcHlmM19zdGYiLCAgMywyLDB4REUwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT181b3AxIH0sCisgIHsgInFfbXB5ZjNfc3ViZjMiLDMsMywweDg0MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCisgIHsgInFfbXB5aTNfYWRkaTMiLDMsMywweDg4MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCisgIHsgInFfbXB5aTNfc3RpIiwgIDMsMiwweEUwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNW9wMSB9LAorICB7ICJxX21weWkzX3N1YmkzIiwzLDMsMHg4QzAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAorICB7ICJxX25lZ2Zfc3RmIiwgICAyLDIsMHhFMjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNG9wMSB9LAorICB7ICJxX25lZ2lfc3RpIiwgICAyLDIsMHhFNDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNG9wMSB9LAorICB7ICJxX25vdF9zdGkiLCAgICAyLDIsMHhFNjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNG9wMSB9LAorICB7ICJxX29yM19zdGkiLCAgICAzLDIsMHhFODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzVvcDEgfSwKKyAgeyAicV9zdGZfc3RmIiwgICAgMiwyLDB4QzAwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzRvcDMgfSwKKyAgeyAicV9zdGlfc3RpIiwgICAgMiwyLDB4QzIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzRvcDMgfSwKKyAgeyAicV9zdWJmM19zdGYiLCAgMywyLDB4RUEwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKKwlPT181b3AyIH0sCisgIHsgInFfc3ViaTNfc3RpIiwgIDMsMiwweEVDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCisJT09fNW9wMiB9LAorICB7ICJxX3hvcjNfc3RpIiwgICAzLDIsMHhFRTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAorCU9PXzVvcDEgfSwKKyAgeyAiIiwgICAgICAgICAgICAgMCwwLDB4MDAwMDAwMDAsIHsgeyAwLCAwLCAwIH0sIHsgMCwgMCwgMCB9IH0sIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHBhcnRlbXBsYXRlICpjb25zdCB0aWMzMF9wYXJvcHRhYl9lbmQgPQorICB0aWMzMF9wYXJvcHRhYiArIHNpemVvZih0aWMzMF9wYXJvcHRhYikvc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiWzBdKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWM4MC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTliYzMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvdGljODAuaApAQCAtMCwwICsxLDI3NyBAQAorLyogdGljODAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVEkgVE1TMzIwQzgwIChNVikgb3Bjb2RlIHRhYmxlCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSksIEN5Z251cyBTdXBwb3J0CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQordGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisxLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQord2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCit3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVElDODBfSAorI2RlZmluZSBUSUM4MF9ICisKKy8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wY29kZS4gICovCisKK3N0cnVjdCB0aWM4MF9vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KKworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIG9wZXJhbmRzCisgICAgIGFyZSB6ZXJvZXMuICAqLworCisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworCisgIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhIG1hc2sKKyAgICAgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZSBvcGNvZGUKKyAgICAgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90IG1hdGNoIChhbmQgYXJlCisgICAgIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCisKKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIC8qIFNwZWNpYWwgcHVycG9zZSBmbGFncyBmb3IgdGhpcyBvcGNvZGUuICovCisKKyAgdW5zaWduZWQgY2hhciBmbGFnczsKKworICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlIG9wZXJhbmQKKyAgICAgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QgYXBwZWFyIGluCisgICAgIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICBGSVhNRTogQWRqdXN0IHNpemUgdG8KKyAgICAgbWF0Y2ggYWN0dWFsIHJlcXVpcmVtZW50cyB3aGVuIFRJYzgwIHN1cHBvcnQgaXMgY29tcGxldGUgKi8KKworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOworfTsKKworLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZSBpbgorICAgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyIGluc3RydWN0aW9ucy4KKyAgIEZJWE1FOiBUaGlzIGlzbid0IGN1cnJlbnRseSB0cnVlLiAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IHRpYzgwX251bV9vcGNvZGVzOworCisMCisvKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHRpYzgwX29wZXJhbmQuICAqLworCitzdHJ1Y3QgdGljODBfb3BlcmFuZAoreworICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLworCisgIGludCBiaXRzOworCisgIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCisKKyAgaW50IHNoaWZ0OworCisgIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCisgICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KKworICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCisgICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKKyAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bworICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCisgICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCisKKyAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQorICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCisgICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKKyAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKKyAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQorICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCisgICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCisKKyAgdW5zaWduZWQgbG9uZyAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKKwkJCQkgICBjb25zdCBjaGFyICoqZXJybXNnKSk7CisKKyAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KKyAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgorCisgICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKKyAgICAgICAgIG9wID0gKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKKwkgaWYgKChvLT5mbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCisJICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKKwkgICBvcCAtPSAxIDw8IG8tPmJpdHM7CisgICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAorICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgorCisgICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKKyAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgorICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KKyAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQorICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKKyAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCisKKyAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqaW52YWxpZCkpOworCisgIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KKworICB1bnNpZ25lZCBsb25nIGZsYWdzOworfTsKKworLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQorICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSB0aWM4MF9vcGNvZGVzIHRhYmxlLiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kIHRpYzgwX29wZXJhbmRzW107CisKKwwKKy8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgdGljODBfb3BlcmFuZC4KKworICAgTm90ZSB0aGF0IGZsYWdzIGZvciBhbGwgcHJlZGVmaW5lZCBzeW1ib2xzLCBzdWNoIGFzIHRoZSBnZW5lcmFsIHB1cnBvc2UKKyAgIHJlZ2lzdGVycyAoZXg6IHIxMCksIGNvbnRyb2wgcmVnaXN0ZXJzIChleDogRlBTVCksIGNvbmRpdGlvbiBjb2RlcyAoZXg6CisgICBlcTAuYiksIGJpdCBudW1iZXJzIChleDogZ3QuYiksIGV0YyBhcmUgbGFyZ2UgZW5vdWdoIHRoYXQgdGhleSBjYW4gYmUKKyAgIG9yJ2QgaW50byBhbiBpbnQgd2hlcmUgdGhlIGxvd2VyIGJpdHMgY29udGFpbiB0aGUgYWN0dWFsIG51bWVyaWMgdmFsdWUKKyAgIHRoYXQgY29ycmVwb25kcyB0byB0aGlzIHByZWRlZmluZWQgc3ltYm9sLiAgVGhpcyB3YXkgYSBzaW5nbGUgaW50IGNhbgorICAgY29udGFpbiBib3RoIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGFuZCBpdCdzIHR5cGUuCisgKi8KKworLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gZXZlbiByZWdpc3RlciBudW1iZXIuICBGbG9hdGluZyBwb2ludCBudW1iZXJzCisgICBmb3IgZXhhbXBsZSBhcmUgc3RvcmVkIGluIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXJzLiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfRVZFTgkoMSA8PCAwKQorCisvKiBUaGlzIG9wZXJhbmQgbXVzdCBiZSBhbiBvZGQgcmVnaXN0ZXIgbnVtYmVyIGFuZCBtdXN0IGJlIG9uZSBncmVhdGVyIHRoYW4KKyAgIHRoZSByZWdpc3RlciBudW1iZXIgb2YgdGhlIHByZXZpb3VzIG9wZXJhbmQuICBJLkUuIHRoZSBzZWNvbmQgcmVnaXN0ZXIgaW4KKyAgIGFuIGV2ZW4vb2RkIHJlZ2lzdGVyIHBhaXIuICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9PREQJKDEgPDwgMSkKKworLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfU0lHTkVECSgxIDw8IDIpCisKKy8qIFRoaXMgb3BlcmFuZCBtYXkgYmUgZWl0aGVyIGEgcHJlZGVmaW5lZCBjb25zdGFudCBuYW1lIG9yIGEgbnVtZXJpYyB2YWx1ZS4KKyAgIEFuIGV4YW1wbGUgd291bGQgYmUgYSBjb25kaXRpb24gY29kZSBsaWtlICJlcTAuYiIgd2hpY2ggaGFzIHRoZSBudW1lcmljCisgICB2YWx1ZSAweDIuICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9OVU0JKDEgPDwgMykKKworLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuIHNlcGFyYXRlZAorICAgZnJvbSB0aGUgcHJldmlvdXMgb25lIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHZhcmlvdXMKKyAgIGluc3RydWN0aW9ucywgbGlrZSB0aGUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLCB3aGljaCB3YW50CisgICB0aGVpciBvcGVyYW5kcyB0byBsb29rIGxpa2UgImRpc3BsYWNlbWVudChyZWcpIiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfUEFSRU5TCSgxIDw8IDQpCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBhIFBDIHJlbGF0aXZlIGJyYW5jaCBvZmZzZXQuICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cworICAgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHRoZSBvZmZzZXRzIGFyZSB0YWtlbiBhcyB3b3JkCisgICBvZmZzZXRzLiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfUENSRUwJKDEgPDwgNSkKKworLyogVGhpcyBmbGFnIGlzIGEgaGludCB0byB0aGUgZGlzYXNzZW1ibGVyIGZvciB1c2luZyBoZXggYXMgdGhlIHByZWZlcmVkCisgICBwcmludGluZyBmb3JtYXQsIGV2ZW4gZm9yIHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGltbWVkaWF0ZSB2YWx1ZXMuCisgICBOb3JtYWxseSB2YWx1ZXMgaW4gdGhlIHJhbmdlIC05OTkgdG8gOTk5IGFyZSBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsCisgICB2YWx1ZXMgYW5kIG90aGVyIHZhbHVlcyBhcmUgcHJpbnRlZCBpbiBoZXguICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9CSVRGSUVMRAkoMSA8PCA2KQorCisvKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTcgaW4gYSBzaG9ydAorICAgaW1tZWRpYXRlIGZvcm0gaW5zdHJ1Y3Rpb24uICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9NX1NJCSgxIDw8IDcpCisKKy8qIFRoaXMgb3BlcmFuZCBtYXkgaGF2ZSBhICI6bSIgbW9kaWZpZXIgc3BlY2lmaWVkIGJ5IGJpdCAxNSBpbiBhIGxvbmcKKyAgIGltbWVkaWF0ZSBvciByZWdpc3RlciBmb3JtIGluc3RydWN0aW9uLiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9MSQkoMSA8PCA4KQorCisvKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOnMiIG1vZGlmaWVyIHNwZWNpZmllZCBpbiBiaXQgMTEgaW4gYSBsb25nCisgICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KKworI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NDQUxFRAkoMSA8PCA5KQorCisvKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfRkxPQVQJKDEgPDwgMTApCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBhbiBieXRlIG9mZnNldCBmcm9tIGEgYmFzZSByZWxvY2F0aW9uLiBUaGUgbG93ZXIKKyB0d28gYml0cyBvZiB0aGUgZmluYWwgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIGlnbm9yZWQgd2hlbiB0aGUgdmFsdWUgaXMKKyB3cml0dGVuIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIuICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9CQVNFUkVMCSgxIDw8IDExKQorCisvKiBUaGlzIG9wZXJhbmQgaXMgYW4gImVuZG1hc2siIGZpZWxkIGZvciBhIHNoaWZ0IGluc3RydWN0aW9uLgorICAgSXQgaXMgdHJlYXRlZCBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGhhdmUgdmFsdWVzIG9mIDAtMzIsCisgICB3aGVyZSAwIGFuZCAzMiByZXN1bHQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGUgYXNzZW1ibGVyCisgICBtdXN0IGJlIGFibGUgdG8gYWNjZXB0IGJvdGggZW5kbWFzayB2YWx1ZXMuICBUaGlzIGRpc2Fzc2VtYmxlcgorICAgaGFzIG5vIHdheSBvZiBrbm93aW5nIGZyb20gdGhlIGluc3RydWN0aW9uIHdoaWNoIHZhbHVlIHdhcyAKKyAgIGdpdmVuIGF0IGFzc2VtYmx5IHRpbWUsIHNvIGl0IGp1c3QgdXNlcyAnMCcuICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9FTkRNQVNLCSgxIDw8IDEyKQorCisvKiBUaGlzIG9wZXJhbmQgaXMgb25lIG9mIHRoZSAzMiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgorICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ3InLiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfR1BSCSgxIDw8IDI3KQorCisvKiBUaGlzIG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3Rlci4KKyAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdhJy4gKi8KKworI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZQQQkoIDEgPDwgMjgpCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgorICAgc3ltYm9saWMgKGxpa2UgIkVJRiIsICJFUEMiLCBldGMpLgorICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfQ1IJKDEgPDwgMjkpCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBhIGNvbmRpdGlvbiBjb2RlLCBlaXRoZXIgbnVtZXJpYyBvcgorICAgc3ltYm9saWMgKGxpa2UgImVxMC5iIiwgIm5lMC53IiwgZXRjKS4KKyAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KKworI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NDCSgxIDw8IDMwKQorCisvKiBUaGlzIG9wZXJhbmQgaXMgYSBiaXQgbnVtYmVyLCBlaXRoZXIgbnVtZXJpYyBvcgorICAgc3ltYm9saWMgKGxpa2UgImVxLmIiLCAib3IuZiIsIGV0YykuCisgICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuCisgICBOb3RlIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIGluc3RydWN0aW9uIGluIDEncyBjb21wbGVtZW50IHJlbGF0aXZlCisgICB0byB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBtYW51YWwuICovCisKKyNkZWZpbmUgVElDODBfT1BFUkFORF9CSVROVU0JKDEgPDwgMzEpCisKKy8qIFRoaXMgbWFzayBpcyB1c2VkIHRvIHN0cmlwIG9wZXJhbmQgYml0cyBmcm9tIGFuIGludCB0aGF0IGNvbnRhaW5zCisgICBib3RoIG9wZXJhbmQgYml0cyBhbmQgYSBudW1lcmljIHZhbHVlIGluIHRoZSBsc2JzLiAqLworCisjZGVmaW5lIFRJQzgwX09QRVJBTkRfTUFTSwkoVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0ZQQSB8IFRJQzgwX09QRVJBTkRfQ1IgfCBUSUM4MF9PUEVSQU5EX0NDIHwgVElDODBfT1BFUkFORF9CSVROVU0pCisKKwwKKy8qIEZsYWcgYml0cyBmb3IgdGhlIHN0cnVjdCB0aWM4MF9vcGNvZGUgZmxhZ3MgZmllbGQuICovCisKKyNkZWZpbmUgVElDODBfVkVDVE9SCQkwMQkvKiBJcyBhIHZlY3RvciBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBUSUM4MF9OT19SMF9ERVNUCTAyCS8qIFJlZ2lzdGVyIHIwIGNhbm5vdCBiZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCisKKwwKKy8qIFRoZSBvcGNvZGVzIGxpYnJhcnkgY29udGFpbnMgYSB0YWJsZSB0aGF0IGFsbG93cyB0cmFuc2xhdGlvbiBmcm9tIHByZWRlZmluZWQKKyAgIHN5bWJvbCBuYW1lcyB0byBudW1lcmljIHZhbHVlcywgYW5kIHZpY2UgdmVyc2EuICovCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgc3ltYm9scy4gICovCisKK3N0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbAoreworICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KKyAgaW50IHZhbHVlOworfTsKKworI2RlZmluZSBQRFNfTkFNRShwZHNwKSAoKHBkc3ApIC0+IG5hbWUpCisjZGVmaW5lIFBEU19WQUxVRShwZHNwKSAoKHBkc3ApIC0+IHZhbHVlKQorCitleHRlcm4gY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdOwkvKiBUcmFuc2xhdGlvbiBhcnJheSAqLworZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzOwkJCQkvKiBIb3cgbWFueSBtZW1iZXJzIGluIHRoZSBhcnJheSAqLworCitjb25zdCBjaGFyICp0aWM4MF92YWx1ZV90b19zeW1ib2wgUEFSQU1TICgoaW50IHZhbCwgaW50IGNsYXNzKSk7CS8qIFRyYW5zbGF0ZSB2YWx1ZSB0byBzeW1ib2xpYyBuYW1lICovCitpbnQgdGljODBfc3ltYm9sX3RvX3ZhbHVlIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBjbGFzcykpOwkJLyogVHJhbnNsYXRlIHN5bWJvbGljIG5hbWUgdG8gdmFsdWUgKi8KKworY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKK3RpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICopKTsKKworI2VuZGlmIC8qIFRJQzgwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaCBiL2luY2x1ZGUvb3Bjb2RlL3Y4NTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODkxNmYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvdjg1MC5oCkBAIC0wLDAgKzEsMTY2IEBACisvKiB2ODUwLmggLS0gSGVhZGVyIGZpbGUgZm9yIE5FQyBWODUwIG9wY29kZSB0YWJsZQorICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEouVC4gQ29ua2xpbiwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBWODUwX0gKKyNkZWZpbmUgVjg1MF9ICisKKy8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHY4NTBfb3Bjb2RlLiAgKi8KKworc3RydWN0IHY4NTBfb3Bjb2RlCit7CisgIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKKyAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCisgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOworCisgIC8qIFRoZSBvcGNvZGUgbWFzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVGhpcyBpcyBhCisgICAgIG1hc2sgY29udGFpbmluZyBvbmVzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBtdXN0IG1hdGNoIHRoZQorICAgICBvcGNvZGUgZmllbGQsIGFuZCB6ZXJvZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG5lZWQgbm90CisgICAgIG1hdGNoIChhbmQgYXJlIHByZXN1bWFibHkgZmlsbGVkIGluIGJ5IG9wZXJhbmRzKS4gICovCisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCisgICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKKyAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOworCisgIC8qIFdoaWNoIChpZiBhbnkpIG9wZXJhbmQgaXMgYSBtZW1vcnkgb3BlcmFuZC4gICovCisgIHVuc2lnbmVkIGludCBtZW1vcDsKKworICAvKiBUYXJnZXQgcHJvY2Vzc29yKHMpLiAgQSBiaXQgZmllbGQgb2YgcHJvY2Vzc29ycyB3aGljaCBzdXBwb3J0CisgICAgIHRoaXMgaW5zdHJ1Y3Rpb24uICBOb3RlIGEgYml0IGZpZWxkIGlzIHVzZWQgYXMgc29tZSBpbnN0cnVjdGlvbnMKKyAgICAgYXJlIGF2YWlsYWJsZSBvbiBtdWx0aXBsZSwgZGlmZmVyZW50IHByb2Nlc3NvciB0eXBlcywgd2hlcmVhcworICAgICBvdGhlciBpbnN0cnVjdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIG9uZSBzcGVjaWZpYyB0eXBlLiAgKi8KKyAgdW5zaWduZWQgaW50IHByb2Nlc3NvcnM7Cit9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBwcm9jZXNzb3JzIGZpZWxkIGluIHRoZSB2ODUwX29wY29kZSBzdHJ1Y3R1cmUuICAqLworI2RlZmluZSBQUk9DRVNTT1JfVjg1MAkJKDEgPDwgMCkJCS8qIEp1c3QgdGhlIFY4NTAuICAqLworI2RlZmluZSBQUk9DRVNTT1JfQUxMCQktMQkJCS8qIEFueSBwcm9jZXNzb3IuICAqLworI2RlZmluZSBQUk9DRVNTT1JfVjg1MEUJCSgxIDw8IDEpCQkvKiBKdXN0IHRoZSBWODUwRS4gKi8KKyNkZWZpbmUgUFJPQ0VTU09SX05PVF9WODUwCSh+IFBST0NFU1NPUl9WODUwKQkvKiBBbnkgcHJvY2Vzc29yIGV4Y2VwdCB0aGUgVjg1MC4gICovCisjZGVmaW5lIFBST0NFU1NPUl9WODUwRUEJKDEgPDwgMikJCS8qIEp1c3QgdGhlIFY4NTBFQS4gKi8KKworLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQorICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCisgICBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2ODUwX29wY29kZSB2ODUwX29wY29kZXNbXTsKK2V4dGVybiBjb25zdCBpbnQgdjg1MF9udW1fb3Bjb2RlczsKKworDAorLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB2ODUwX29wZXJhbmQuICAqLworCitzdHJ1Y3Qgdjg1MF9vcGVyYW5kCit7CisgIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCisgIC8qIElmIHRoaXMgdmFsdWUgaXMgLTEgdGhlbiB0aGUgb3BlcmFuZCdzIGJpdHMgYXJlIGluIGEgZGlzY29udGlub3VzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCisgIGludCBiaXRzOworCisgIC8qIChiaXRzID49IDApOiAgSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgLyogKGJpdHMgPT0gLTEpOiBCaXQgbWFzayBvZiB0aGUgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCisgIGludCBzaGlmdDsKKworICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgorICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCisKKyAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQorICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7CisgICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KKyAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcworICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgorCisgICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKKyAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQorICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCisgICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCisgICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKKyAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcworICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLworICB1bnNpZ25lZCBsb25nICgqIGluc2VydCkgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnN0cnVjdGlvbiwgbG9uZyBvcCwKKwkJCQkgICBjb25zdCBjaGFyICoqIGVycm1zZykpOworCisgIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCisgICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KKworICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCisgICAgICAgICBvcCA9IG8tPmJpdHMgPT0gLTEgPyAoKGkpICYgby0+c2hpZnQpIDogKChpKSA+PiBvLT5zaGlmdCkgJiAoKDEgPDwgby0+Yml0cykgLSAxKTsKKwkgaWYgKG8tPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKKwkgICAgIG9wID0gKG9wIDw8ICgzMiAtIG8tPmJpdHMpKSA+PiAoMzIgLSBvLT5iaXRzKTsKKyAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uLCBvIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wCisgICAgIGlzIHRoZSByZXN1bHQ7IHRoaXMgYXNzdW1lcyB0d29zIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCisKKyAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQorICAgICBpbnN0cnVjdGlvbiB2YWx1ZS4gIEl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZC4gIElmCisgICAgIHRoZSBJTlZBTElEIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCAqSU5WQUxJRCB3aWxsIGJlIHNldCB0bworICAgICBub24temVybyBpZiB0aGlzIG9wZXJhbmQgdHlwZSBjYW4gbm90IGFjdHVhbGx5IGJlIGV4dHJhY3RlZCBmcm9tCisgICAgIHRoaXMgb3BlcmFuZCAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoKS4gIElmIHRoZQorICAgICBvcGVyYW5kIGlzIHZhbGlkLCAqSU5WQUxJRCB3aWxsIG5vdCBiZSBjaGFuZ2VkLiAgKi8KKyAgdW5zaWduZWQgbG9uZyAoKiBleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKiBpbnZhbGlkKSk7CisKKyAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLworICBpbnQgZmxhZ3M7Cit9OworCisvKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCisgICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIHY4NTBfb3Bjb2RlcyB0YWJsZS4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kIHY4NTBfb3BlcmFuZHNbXTsKKworLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCB2ODUwX29wZXJhbmQuICAqLworCisvKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVjg1MF9PUEVSQU5EX1JFRwkweDAxCisKKy8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIHN5c3RlbSByZWdpc3RlciAqLworI2RlZmluZSBWODUwX09QRVJBTkRfU1JHCTB4MDIKKworLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgY29uZGl0aW9uIGNvZGUgdXNlZCBpbiB0aGUgc2V0ZiBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBWODUwX09QRVJBTkRfQ0MJCTB4MDQKKworLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMgKi8KKyNkZWZpbmUgVjg1MF9PUEVSQU5EX1NJR05FRAkweDA4CisKKy8qIFRoaXMgb3BlcmFuZCBpcyB0aGUgZXAgcmVnaXN0ZXIuICAqLworI2RlZmluZSBWODUwX09QRVJBTkRfRVAJCTB4MTAKKworLyogVGhpcyBvcGVyYW5kIGlzIGEgUEMgZGlzcGxhY2VtZW50ICovCisjZGVmaW5lIFY4NTBfT1BFUkFORF9ESVNQCTB4MjAKKworLyogVGhpcyBpcyBhIHJlbGF4YWJsZSBvcGVyYW5kLiAgIE9ubHkgdXNlZCBmb3IgRDktPkQyMiBicmFuY2ggcmVsYXhpbmcKKyAgIHJpZ2h0IG5vdy4gIFdlIG1heSBuZWVkIG90aGVycyBpbiB0aGUgZnV0dXJlIChvciBtYXliZSBoYW5kbGUgdGhlbSBsaWtlCisgICBwcm9tb3RlZCBvcGVyYW5kcyBvbiB0aGUgbW4xMDMwMD8pICAqLworI2RlZmluZSBWODUwX09QRVJBTkRfUkVMQVgJMHg0MAorCisvKiBUaGUgcmVnaXN0ZXIgc3BlY2lmaWVkIG11c3Qgbm90IGJlIHIwICovCisjZGVmaW5lIFY4NTBfTk9UX1IwCSAgICAgICAgMHg4MAorCisvKiBDWUdOVVMgTE9DQUwgdjg1MGUgKi8KKy8qIHB1c2gvcG9wIHR5cGUgaW5zdHJ1Y3Rpb24sIFY4NTBFIHNwZWNpZmljLiAgKi8KKyNkZWZpbmUgVjg1MEVfUFVTSF9QT1AJCTB4MTAwCisKKy8qIDE2IGJpdCBpbW1lZGlhdGUgZm9sbG93cyBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLworI2RlZmluZSBWODUwRV9JTU1FRElBVEUxNgkweDIwMAorCisvKiAzMiBiaXQgaW1tZWRpYXRlIGZvbGxvd3MgaW5zdHJ1Y3Rpb24sIFY4NTBFIHNwZWNpZmljLiAgKi8KKyNkZWZpbmUgVjg1MEVfSU1NRURJQVRFMzIJMHg0MDAKKworI2VuZGlmIC8qIFY4NTBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvdmF4LmggYi9pbmNsdWRlL29wY29kZS92YXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FmZWJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vcGNvZGUvdmF4LmgKQEAgLTAsMCArMSwzODIgQEAKKy8qIFZheCBvcGNkZSBsaXN0LgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KKworR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiB2YXhfb3Bjb2RlVAorI2RlZmluZSB2YXhfb3Bjb2RlVCBpbnQKKyNlbmRpZiAvKiBubyB2YXhfb3Bjb2RlVCAqLworCitzdHJ1Y3Qgdm90X3dvdAkJCS8qIHZheCBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KKwkJCQkvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLworeworICBjb25zdCBjaGFyICAgICAgICphcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLworICB2YXhfb3Bjb2RlVCAgICAgICBjb2RlOwkvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLworfTsKKworc3RydWN0IHZvdAkJCS8qIHZheCBvcGNvZGUgdGV4dCAqLworeworICBjb25zdCBjaGFyICAgICAgICpuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCisgIHN0cnVjdCB2b3Rfd290ICAgIGRldGFpbDsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLworfTsKKworI2RlZmluZSB2b3RfaG93IGFyZ3MKKyNkZWZpbmUgdm90X2NvZGUgY29kZQorI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAorI2RlZmluZSB2b3RfbmFtZSBuYW1lCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90Cit2b3RzdHJzW10gPQoreworeyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKK3sgICAgIm5vcCIsCXsiIiwJCQkweDAxCX0gfSwKK3sgICAgInJlaSIsCXsiIiwJCQkweDAyCX0gfSwKK3sgICAgImJwdCIsCXsiIiwJCQkweDAzCX0gfSwKK3sgICAgInJldCIsCXsiIiwJCQkweDA0CX0gfSwKK3sgICAgInJzYiIsCXsiIiwJCQkweDA1CX0gfSwKK3sgICAgImxkcGN0eCIsCXsiIiwJCQkweDA2CX0gfSwKK3sgICAgInN2cGN0eCIsCXsiIiwJCQkweDA3CX0gfSwKK3sgICAgImN2dHBzIiwJeyJyd2FicndhYiIsCQkweDA4CX0gfSwKK3sgICAgImN2dHNwIiwJeyJyd2FicndhYiIsCQkweDA5CX0gfSwKK3sgICAgImluZGV4IiwJeyJybHJscmxybHJsd2wiLAkweDBhCX0gfSwKK3sgICAgImNyYyIsCXsiYWJybHJ3YWIiLAkJMHgwYgl9IH0sCit7ICAgICJwcm9iZXIiLAl7InJicndhYiIsCQkweDBjCX0gfSwKK3sgICAgInByb2JldyIsCXsicmJyd2FiIiwJICAgICAgICAweDBkCX0gfSwKK3sgICAgImluc3F1ZSIsCXsiYWJhYiIsCQkweDBlCX0gfSwKK3sgICAgInJlbXF1ZSIsCXsiYWJ3bCIsCQkweDBmCX0gfSwKK3sgICAgImJzYmIiLAl7ImJiIiwJCQkweDEwCX0gfSwKK3sgICAgImJyYiIsCXsiYmIiLAkJCTB4MTEJfSB9LAoreyAgICAiYm5lcSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoreyAgICAiYm5lcXUiLAl7ImJiIiwJCQkweDEyCX0gfSwKK3sgICAgImJlcWwiLAl7ImJiIiwJCQkweDEzCX0gfSwKK3sgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgxMwl9IH0sCit7ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHgxNAl9IH0sCit7ICAgICJibGVxIiwJeyJiYiIsCQkJMHgxNQl9IH0sCit7ICAgICJqc2IiLAl7ImFiIiwJCQkweDE2CX0gfSwKK3sgICAgImptcCIsCXsiYWIiLAkJCTB4MTcJfSB9LAoreyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4MTgJfSB9LAoreyAgICAiYmxzcyIsCXsiYmIiLAkJCTB4MTkJfSB9LAoreyAgICAiYmd0cnUiLAl7ImJiIiwJCQkweDFhCX0gfSwKK3sgICAgImJsZXF1IiwJeyJiYiIsCQkJMHgxYgl9IH0sCit7ICAgICJidmMiLAl7ImJiIiwJCQkweDFjCX0gfSwKK3sgICAgImJ2cyIsCXsiYmIiLAkJCTB4MWQJfSB9LAoreyAgICAiYmNjIiwJeyJiYiIsCQkJMHgxZQl9IH0sCit7ICAgICJiZ2VxdSIsCXsiYmIiLAkJCTB4MWUJfSB9LAoreyAgICAiYmxzc3UiLAl7ImJiIiwJCQkweDFmCX0gfSwKK3sgICAgImJjcyIsCXsiYmIiLAkJCTB4MWYJfSB9LAoreyAgICAiYWRkcDQiLAl7InJ3YWJyd2FiIiwJCTB4MjAJfSB9LAoreyAgICAiYWRkcDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjEJfSB9LAoreyAgICAic3VicDQiLAl7InJ3YWJyd2FiIiwJCTB4MjIJfSB9LAoreyAgICAic3VicDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjMJfSB9LAoreyAgICAiY3Z0cHQiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNAl9IH0sCit7ICAgICJtdWxwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI1CX0gfSwKK3sgICAgImN2dHRwIiwJeyJyd2FiYWJyd2FiIiwJCTB4MjYJfSB9LAoreyAgICAiZGl2cCIsCXsicndhYnJ3YWJyd2FiIiwJMHgyNwl9IH0sCit7ICAgICJtb3ZjMyIsCXsicndhYmFiIiwJCTB4MjgJfSB9LAoreyAgICAiY21wYzMiLAl7InJ3YWJhYiIsCQkweDI5CX0gfSwKK3sgICAgInNjYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJhCX0gfSwKK3sgICAgInNwYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJiCX0gfSwKK3sgICAgIm1vdmM1IiwJeyJyd2FicmJyd2FiIiwJCTB4MmMJfSB9LAoreyAgICAiY21wYzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyZAl9IH0sCit7ICAgICJtb3Z0YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZQl9IH0sCit7ICAgICJtb3Z0dWMiLAl7InJ3YWJyYmFicndhYiIsCTB4MmYJfSB9LAoreyAgICAiYnNidyIsCXsiYnciLAkJCTB4MzAJfSB9LAoreyAgICAiYnJ3IiwJeyJidyIsCQkJMHgzMQl9IH0sCit7ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDMyCX0gfSwKK3sgICAgImN2dHdiIiwJeyJyd3diIiwJCTB4MzMJfSB9LAoreyAgICAibW92cCIsCXsicndhYmFiIiwJCTB4MzQJfSB9LAoreyAgICAiY21wcDMiLAl7InJ3YWJhYiIsCQkweDM1CX0gfSwKK3sgICAgImN2dHBsIiwJeyJyd2Fid2wiLAkJMHgzNgl9IH0sCit7ICAgICJjbXBwNCIsCXsicndhYnJ3YWIiLAkJMHgzNwl9IH0sCit7ICAgICJlZGl0cGMiLAl7InJ3YWJhYmFiIiwJCTB4MzgJfSB9LAoreyAgICAibWF0Y2hjIiwJeyJyd2FicndhYiIsCQkweDM5CX0gfSwKK3sgICAgImxvY2MiLAl7InJicndhYiIsCQkweDNhCX0gfSwKK3sgICAgInNrcGMiLAl7InJicndhYiIsCQkweDNiCX0gfSwKK3sgICAgIm1vdnp3bCIsCXsicnd3bCIsCQkweDNjCX0gfSwKK3sgICAgImFjYnciLAl7InJ3cndtd2J3IiwJCTB4M2QJfSB9LAoreyAgICAibW92YXciLAl7ImF3d2wiLAkJMHgzZQl9IH0sCit7ICAgICJwdXNoYXciLAl7ImF3IiwJCQkweDNmCX0gfSwKK3sgICAgImFkZGYyIiwJeyJyZm1mIiwJCTB4NDAJfSB9LAoreyAgICAiYWRkZjMiLAl7InJmcmZ3ZiIsCQkweDQxCX0gfSwKK3sgICAgInN1YmYyIiwJeyJyZm1mIiwJCTB4NDIJfSB9LAoreyAgICAic3ViZjMiLAl7InJmcmZ3ZiIsCQkweDQzCX0gfSwKK3sgICAgIm11bGYyIiwJeyJyZm1mIiwJCTB4NDQJfSB9LAoreyAgICAibXVsZjMiLAl7InJmcmZ3ZiIsCQkweDQ1CX0gfSwKK3sgICAgImRpdmYyIiwJeyJyZm1mIiwJCTB4NDYJfSB9LAoreyAgICAiZGl2ZjMiLAl7InJmcmZ3ZiIsCQkweDQ3CX0gfSwKK3sgICAgImN2dGZiIiwJeyJyZndiIiwJCTB4NDgJfSB9LAoreyAgICAiY3Z0ZnciLAl7InJmd3ciLAkJMHg0OQl9IH0sCit7ICAgICJjdnRmbCIsCXsicmZ3bCIsCQkweDRhCX0gfSwKK3sgICAgImN2dHJmbCIsCXsicmZ3bCIsCQkweDRiCX0gfSwKK3sgICAgImN2dGJmIiwJeyJyYndmIiwJCTB4NGMJfSB9LAoreyAgICAiY3Z0d2YiLAl7InJ3d2YiLAkJMHg0ZAl9IH0sCit7ICAgICJjdnRsZiIsCXsicmx3ZiIsCQkweDRlCX0gfSwKK3sgICAgImFjYmYiLAl7InJmcmZtZmJ3IiwJCTB4NGYJfSB9LAoreyAgICAibW92ZiIsCXsicmZ3ZiIsCQkweDUwCX0gfSwKK3sgICAgImNtcGYiLAl7InJmcmYiLAkJMHg1MQl9IH0sCit7ICAgICJtbmVnZiIsCXsicmZ3ZiIsCQkweDUyCX0gfSwKK3sgICAgInRzdGYiLAl7InJmIiwJCQkweDUzCX0gfSwKK3sgICAgImVtb2RmIiwJeyJyZnJicmZ3bHdmIiwJCTB4NTQJfSB9LAoreyAgICAicG9seWYiLAl7InJmcndhYiIsCQkweDU1CX0gfSwKK3sgICAgImN2dGZkIiwJeyJyZndkIiwJCTB4NTYJfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1NyBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KK3sgICAgImFkYXdpIiwJeyJyd213IiwJCTB4NTgJfSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1OSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWEgaXMgbm90IGRlZmluZWQgeWV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDViIGlzIG5vdCBkZWZpbmVkIHlldCAqLworeyAgICAiaW5zcWhpIiwJeyJhYmFxIiwJCTB4NWMJfSB9LAoreyAgICAiaW5zcXRpIiwJeyJhYmFxIiwJCTB4NWQJfSB9LAoreyAgICAicmVtcWhpIiwJeyJhcXdsIiwJCTB4NWUJfSB9LAoreyAgICAicmVtcXRpIiwJeyJhcXdsIiwJCTB4NWYJfSB9LAoreyAgICAiYWRkZDIiLAl7InJkbWQiLAkJMHg2MAl9IH0sCit7ICAgICJhZGRkMyIsCXsicmRyZHdkIiwJCTB4NjEJfSB9LAoreyAgICAic3ViZDIiLAl7InJkbWQiLAkJMHg2Mgl9IH0sCit7ICAgICJzdWJkMyIsCXsicmRyZHdkIiwJCTB4NjMJfSB9LAoreyAgICAibXVsZDIiLAl7InJkbWQiLAkJMHg2NAl9IH0sCit7ICAgICJtdWxkMyIsCXsicmRyZHdkIiwJCTB4NjUJfSB9LAoreyAgICAiZGl2ZDIiLAl7InJkbWQiLAkJMHg2Ngl9IH0sCit7ICAgICJkaXZkMyIsCXsicmRyZHdkIiwJCTB4NjcJfSB9LAoreyAgICAiY3Z0ZGIiLAl7InJkd2IiLAkJMHg2OAl9IH0sCit7ICAgICJjdnRkdyIsCXsicmR3dyIsCQkweDY5CX0gfSwKK3sgICAgImN2dGRsIiwJeyJyZHdsIiwJCTB4NmEJfSB9LAoreyAgICAiY3Z0cmRsIiwJeyJyZHdsIiwJCTB4NmIJfSB9LAoreyAgICAiY3Z0YmQiLAl7InJid2QiLAkJMHg2Ywl9IH0sCit7ICAgICJjdnR3ZCIsCXsicnd3ZCIsCQkweDZkCX0gfSwKK3sgICAgImN2dGxkIiwJeyJybHdkIiwJCTB4NmUJfSB9LAoreyAgICAiYWNiZCIsCXsicmRyZG1kYnciLAkJMHg2Zgl9IH0sCit7ICAgICJtb3ZkIiwJeyJyZHdkIiwJCTB4NzAJfSB9LAoreyAgICAiY21wZCIsCXsicmRyZCIsCQkweDcxCX0gfSwKK3sgICAgIm1uZWdkIiwJeyJyZHdkIiwJCTB4NzIJfSB9LAoreyAgICAidHN0ZCIsCXsicmQiLAkJCTB4NzMJfSB9LAoreyAgICAiZW1vZGQiLAl7InJkcmJyZHdsd2QiLAkJMHg3NAl9IH0sCit7ICAgICJwb2x5ZCIsCXsicmRyd2FiIiwJCTB4NzUJfSB9LAoreyAgICAiY3Z0ZGYiLAl7InJkd2YiLAkJMHg3Ngl9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDc3IGlzIG5vdCBkZWZpbmVkIHlldCAqLworeyAgICAiYXNobCIsCXsicmJybHdsIiwJCTB4NzgJfSB9LAoreyAgICAiYXNocSIsCXsicmJycXdxIiwJCTB4NzkJfSB9LAoreyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHg3YQl9IH0sCit7ICAgICJlZGl2IiwJeyJybHJxd2x3bCIsCQkweDdiCX0gfSwKK3sgICAgImNscmQiLAl7IndkIiwJCQkweDdjCX0gfSwKK3sgICAgImNscmciLAl7IndnIiwJCQkweDdjCX0gfSwKK3sgICAgImNscnEiLAl7IndkIiwJCQkweDdjCX0gfSwKK3sgICAgIm1vdnEiLAl7InJxd3EiLAkJMHg3ZAl9IH0sCit7ICAgICJtb3ZhcSIsCXsiYXF3bCIsCQkweDdlCX0gfSwKK3sgICAgIm1vdmFkIiwJeyJhZHdsIiwJCTB4N2UJfSB9LAoreyAgICAicHVzaGFxIiwJeyJhcSIsCQkJMHg3Zgl9IH0sCit7ICAgICJwdXNoYWQiLAl7ImFkIiwJCQkweDdmCX0gfSwKK3sgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4ODAJfSB9LAoreyAgICAiYWRkYjMiLAl7InJicmJ3YiIsCQkweDgxCX0gfSwKK3sgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4ODIJfSB9LAoreyAgICAic3ViYjMiLAl7InJicmJ3YiIsCQkweDgzCX0gfSwKK3sgICAgIm11bGIyIiwJeyJyYm1iIiwJCTB4ODQJfSB9LAoreyAgICAibXVsYjMiLAl7InJicmJ3YiIsCQkweDg1CX0gfSwKK3sgICAgImRpdmIyIiwJeyJyYm1iIiwJCTB4ODYJfSB9LAoreyAgICAiZGl2YjMiLAl7InJicmJ3YiIsCQkweDg3CX0gfSwKK3sgICAgImJpc2IyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoreyAgICAiYmlzYjMiLAl7InJicmJ3YiIsCQkweDg5CX0gfSwKK3sgICAgImJpY2IyIiwJeyJyYm1iIiwJCTB4OGEJfSB9LAoreyAgICAiYmljYjMiLAl7InJicmJ3YiIsCQkweDhiCX0gfSwKK3sgICAgInhvcmIyIiwJeyJyYm1iIiwJCTB4OGMJfSB9LAoreyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweDhkCX0gfSwKK3sgICAgIm1uZWdiIiwJeyJyYndiIiwJCTB4OGUJfSB9LAoreyAgICAiY2FzZWIiLAl7InJicmJyYiIsCQkweDhmCX0gfSwKK3sgICAgIm1vdmIiLAl7InJid2IiLAkJMHg5MAl9IH0sCit7ICAgICJjbXBiIiwJeyJyYnJiIiwJCTB4OTEJfSB9LAoreyAgICAibWNvbWIiLAl7InJid2IiLAkJMHg5Mgl9IH0sCit7ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4OTMJfSB9LAoreyAgICAiY2xyYiIsCXsid2IiLAkJCTB4OTQJfSB9LAoreyAgICAidHN0YiIsCXsicmIiLAkJCTB4OTUJfSB9LAoreyAgICAiaW5jYiIsCXsibWIiLAkJCTB4OTYJfSB9LAoreyAgICAiZGVjYiIsCXsibWIiLAkJCTB4OTcJfSB9LAoreyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg5OAl9IH0sCit7ICAgICJjdnRidyIsCXsicmJ3dyIsCQkweDk5CX0gfSwKK3sgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweDlhCX0gfSwKK3sgICAgIm1vdnpidyIsCXsicmJ3dyIsCQkweDliCX0gfSwKK3sgICAgInJvdGwiLAl7InJicmx3bCIsCQkweDljCX0gfSwKK3sgICAgImFjYmIiLAl7InJicmJtYmJ3IiwJCTB4OWQJfSB9LAoreyAgICAibW92YWIiLAl7ImFid2wiLAkJMHg5ZQl9IH0sCit7ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweDlmCX0gfSwKK3sgICAgImFkZHcyIiwJeyJyd213IiwJCTB4YTAJfSB9LAoreyAgICAiYWRkdzMiLAl7InJ3cnd3dyIsCQkweGExCX0gfSwKK3sgICAgInN1YncyIiwJeyJyd213IiwJCTB4YTIJfSB9LAoreyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweGEzCX0gfSwKK3sgICAgIm11bHcyIiwJeyJyd213IiwJCTB4YTQJfSB9LAoreyAgICAibXVsdzMiLAl7InJ3cnd3dyIsCQkweGE1CX0gfSwKK3sgICAgImRpdncyIiwJeyJyd213IiwJCTB4YTYJfSB9LAoreyAgICAiZGl2dzMiLAl7InJ3cnd3dyIsCQkweGE3CX0gfSwKK3sgICAgImJpc3cyIiwJeyJyd213IiwJCTB4YTgJfSB9LAoreyAgICAiYmlzdzMiLAl7InJ3cnd3dyIsCQkweGE5CX0gfSwKK3sgICAgImJpY3cyIiwJeyJyd213IiwJCTB4YWEJfSB9LAoreyAgICAiYmljdzMiLAl7InJ3cnd3dyIsCQkweGFiCX0gfSwKK3sgICAgInhvcncyIiwJeyJyd213IiwJCTB4YWMJfSB9LAoreyAgICAieG9ydzMiLAl7InJ3cnd3dyIsCQkweGFkCX0gfSwKK3sgICAgIm1uZWd3IiwJeyJyd3d3IiwJCTB4YWUJfSB9LAoreyAgICAiY2FzZXciLAl7InJ3cndydyIsCQkweGFmCX0gfSwKK3sgICAgIm1vdnciLAl7InJ3d3ciLAkJMHhiMAl9IH0sCit7ICAgICJjbXB3IiwJeyJyd3J3IiwJCTB4YjEJfSB9LAoreyAgICAibWNvbXciLAl7InJ3d3ciLAkJMHhiMgl9IH0sCit7ICAgICJiaXR3IiwJeyJyd3J3IiwJCTB4YjMJfSB9LAoreyAgICAiY2xydyIsCXsid3ciLAkJCTB4YjQJfSB9LAoreyAgICAidHN0dyIsCXsicnciLAkJCTB4YjUJfSB9LAoreyAgICAiaW5jdyIsCXsibXciLAkJCTB4YjYJfSB9LAoreyAgICAiZGVjdyIsCXsibXciLAkJCTB4YjcJfSB9LAoreyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHhiOAl9IH0sCit7ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweGI5CX0gfSwKK3sgICAgInBvcHIiLAl7InJ3IiwJCQkweGJhCX0gfSwKK3sgICAgInB1c2hyIiwJeyJydyIsCQkJMHhiYgl9IH0sCit7ICAgICJjaG1rIiwJeyJydyIsCQkJMHhiYwl9IH0sCit7ICAgICJjaG1lIiwJeyJydyIsCQkJMHhiZAl9IH0sCit7ICAgICJjaG1zIiwJeyJydyIsCQkJMHhiZQl9IH0sCit7ICAgICJjaG11IiwJeyJydyIsCQkJMHhiZgl9IH0sCit7ICAgICJhZGRsMiIsCXsicmxtbCIsCQkweGMwCX0gfSwKK3sgICAgImFkZGwzIiwJeyJybHJsd2wiLAkJMHhjMQl9IH0sCit7ICAgICJzdWJsMiIsCXsicmxtbCIsCQkweGMyCX0gfSwKK3sgICAgInN1YmwzIiwJeyJybHJsd2wiLAkJMHhjMwl9IH0sCit7ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweGM0CX0gfSwKK3sgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHhjNQl9IH0sCit7ICAgICJkaXZsMiIsCXsicmxtbCIsCQkweGM2CX0gfSwKK3sgICAgImRpdmwzIiwJeyJybHJsd2wiLAkJMHhjNwl9IH0sCit7ICAgICJiaXNsMiIsCXsicmxtbCIsCQkweGM4CX0gfSwKK3sgICAgImJpc2wzIiwJeyJybHJsd2wiLAkJMHhjOQl9IH0sCit7ICAgICJiaWNsMiIsCXsicmxtbCIsCQkweGNhCX0gfSwKK3sgICAgImJpY2wzIiwJeyJybHJsd2wiLAkJMHhjYgl9IH0sCit7ICAgICJ4b3JsMiIsCXsicmxtbCIsCQkweGNjCX0gfSwKK3sgICAgInhvcmwzIiwJeyJybHJsd2wiLAkJMHhjZAl9IH0sCit7ICAgICJtbmVnbCIsCXsicmx3bCIsCQkweGNlCX0gfSwKK3sgICAgImNhc2VsIiwJeyJybHJscmwiLAkJMHhjZgl9IH0sCit7ICAgICJtb3ZsIiwJeyJybHdsIiwJCTB4ZDAJfSB9LAoreyAgICAiY21wbCIsCXsicmxybCIsCQkweGQxCX0gfSwKK3sgICAgIm1jb21sIiwJeyJybHdsIiwJCTB4ZDIJfSB9LAoreyAgICAiYml0bCIsCXsicmxybCIsCQkweGQzCX0gfSwKK3sgICAgImNscmYiLAl7IndmIiwJCQkweGQ0CX0gfSwKK3sgICAgImNscmwiLAl7IndsIiwJCQkweGQ0CX0gfSwKK3sgICAgInRzdGwiLAl7InJsIiwJCQkweGQ1CX0gfSwKK3sgICAgImluY2wiLAl7Im1sIiwJCQkweGQ2CX0gfSwKK3sgICAgImRlY2wiLAl7Im1sIiwJCQkweGQ3CX0gfSwKK3sgICAgImFkd2MiLAl7InJsbWwiLAkJMHhkOAl9IH0sCit7ICAgICJzYndjIiwJeyJybG1sIiwJCTB4ZDkJfSB9LAoreyAgICAibXRwciIsCXsicmxybCIsCQkweGRhCX0gfSwKK3sgICAgIm1mcHIiLAl7InJsd2wiLAkJMHhkYgl9IH0sCit7ICAgICJtb3Zwc2wiLAl7IndsIiwJCQkweGRjCX0gfSwKK3sgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCit7ICAgICJtb3ZhbCIsCXsiYWx3bCIsCQkweGRlCX0gfSwKK3sgICAgIm1vdmFmIiwJeyJhZndsIiwJCTB4ZGUJfSB9LAoreyAgICAicHVzaGFsIiwJeyJhbCIsCQkJMHhkZgl9IH0sCit7ICAgICJwdXNoYWYiLAl7ImFmIiwJCQkweGRmCX0gfSwKK3sgICAgImJicyIsCXsicmx2YmJiIiwJCTB4ZTAJfSB9LAoreyAgICAiYmJjIiwJeyJybHZiYmIiLAkJMHhlMQl9IH0sCit7ICAgICJiYnNzIiwJeyJybHZiYmIiLAkJMHhlMgl9IH0sCit7ICAgICJiYmNzIiwJeyJybHZiYmIiLAkJMHhlMwl9IH0sCit7ICAgICJiYnNjIiwJeyJybHZiYmIiLAkJMHhlNAl9IH0sCit7ICAgICJiYmNjIiwJeyJybHZiYmIiLAkJMHhlNQl9IH0sCit7ICAgICJiYnNzaSIsCXsicmx2YmJiIiwJCTB4ZTYJfSB9LAoreyAgICAiYmJjY2kiLAl7InJsdmJiYiIsCQkweGU3CX0gfSwKK3sgICAgImJsYnMiLAl7InJsYmIiLAkJMHhlOAl9IH0sCit7ICAgICJibGJjIiwJeyJybGJiIiwJCTB4ZTkJfSB9LAoreyAgICAiZmZzIiwJeyJybHJidmJ3bCIsCQkweGVhCX0gfSwKK3sgICAgImZmYyIsCXsicmxyYnZid2wiLAkJMHhlYgl9IH0sCit7ICAgICJjbXB2IiwJeyJybHJidmJybCIsCQkweGVjCX0gfSwKK3sgICAgImNtcHp2IiwJeyJybHJidmJybCIsCQkweGVkCX0gfSwKK3sgICAgImV4dHYiLAl7InJscmJ2YndsIiwJCTB4ZWUJfSB9LAoreyAgICAiZXh0enYiLAl7InJscmJ2YndsIiwJCTB4ZWYJfSB9LAoreyAgICAiaW5zdiIsCXsicmxybHJidmIiLAkJMHhmMAl9IH0sCit7ICAgICJhY2JsIiwJeyJybHJsbWxidyIsCQkweGYxCX0gfSwKK3sgICAgImFvYmxzcyIsCXsicmxtbGJiIiwJCTB4ZjIJfSB9LAoreyAgICAiYW9ibGVxIiwJeyJybG1sYmIiLAkJMHhmMwl9IH0sCit7ICAgICJzb2JnZXEiLAl7Im1sYmIiLAkJMHhmNAl9IH0sCit7ICAgICJzb2JndHIiLAl7Im1sYmIiLAkJMHhmNQl9IH0sCit7ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweGY2CX0gfSwKK3sgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4ZjcJfSB9LAoreyAgICAiYXNocCIsCXsicmJyd2FicmJyd2FiIiwJMHhmOAl9IH0sCit7ICAgICJjdnRscCIsCXsicmxyd2FiIiwJCTB4ZjkJfSB9LAoreyAgICAiY2FsbGciLAl7ImFiYWIiLAkJMHhmYQl9IH0sCit7ICAgICJjYWxscyIsCXsicmxhYiIsCQkweGZiCX0gfSwKK3sgICAgInhmYyIsCXsiIiwJCQkweGZjCX0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCit7ICAgICJjdnRkaCIsCXsicmR3aCIsCQkweDMyZmQJfSB9LAoreyAgICAiY3Z0Z2YiLAl7InJnd2giLAkJMHgzM2ZkCX0gfSwKK3sgICAgImFkZGcyIiwJeyJyZ21nIiwJCTB4NDBmZAl9IH0sCit7ICAgICJhZGRnMyIsCXsicmdyZ3dnIiwJCTB4NDFmZAl9IH0sCit7ICAgICJzdWJnMiIsCXsicmdtZyIsCQkweDQyZmQJfSB9LAoreyAgICAic3ViZzMiLAl7InJncmd3ZyIsCQkweDQzZmQJfSB9LAoreyAgICAibXVsZzIiLAl7InJnbWciLAkJMHg0NGZkCX0gfSwKK3sgICAgIm11bGczIiwJeyJyZ3Jnd2ciLAkJMHg0NWZkCX0gfSwKK3sgICAgImRpdmcyIiwJeyJyZ21nIiwJCTB4NDZmZAl9IH0sCit7ICAgICJkaXZnMyIsCXsicmdyZ3dnIiwJCTB4NDdmZAl9IH0sCit7ICAgICJjdnRnYiIsCXsicmd3YiIsCQkweDQ4ZmQJfSB9LAoreyAgICAiY3Z0Z3ciLAl7InJnd3ciLAkJMHg0OWZkCX0gfSwKK3sgICAgImN2dGdsIiwJeyJyZ3dsIiwJCTB4NGFmZAl9IH0sCit7ICAgICJjdnRyZ2wiLAl7InJnd2wiLAkJMHg0YmZkCX0gfSwKK3sgICAgImN2dGJnIiwJeyJyYndnIiwJCTB4NGNmZAl9IH0sCit7ICAgICJjdnR3ZyIsCXsicnd3ZyIsCQkweDRkZmQJfSB9LAoreyAgICAiY3Z0bGciLAl7InJsd2ciLAkJMHg0ZWZkCX0gfSwKK3sgICAgImFjYmciLAl7InJncmdtZ2J3IiwJCTB4NGZmZAl9IH0sCit7ICAgICJtb3ZnIiwJeyJyZ3dnIiwJCTB4NTBmZAl9IH0sCit7ICAgICJjbXBnIiwJeyJyZ3JnIiwJCTB4NTFmZAl9IH0sCit7ICAgICJtbmVnZyIsCXsicmd3ZyIsCQkweDUyZmQJfSB9LAoreyAgICAidHN0ZyIsCXsicmciLAkJCTB4NTNmZAl9IH0sCit7ICAgICJlbW9kZyIsCXsicmdyd3Jnd2x3ZyIsCQkweDU0ZmQJfSB9LAoreyAgICAicG9seWciLAl7InJncndhYiIsCQkweDU1ZmQJfSB9LAoreyAgICAiY3Z0Z2giLAl7InJnd2giLAkJMHg1NmZkCX0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCit7ICAgICJhZGRoMiIsCXsicmhtaCIsCQkweDYwZmQJfSB9LAoreyAgICAiYWRkaDMiLAl7InJocmh3aCIsCQkweDYxZmQJfSB9LAoreyAgICAic3ViaDIiLAl7InJobWgiLAkJMHg2MmZkCX0gfSwKK3sgICAgInN1YmgzIiwJeyJyaHJod2giLAkJMHg2M2ZkCX0gfSwKK3sgICAgIm11bGgyIiwJeyJyaG1oIiwJCTB4NjRmZAl9IH0sCit7ICAgICJtdWxoMyIsCXsicmhyaHdoIiwJCTB4NjVmZAl9IH0sCit7ICAgICJkaXZoMiIsCXsicmhtaCIsCQkweDY2ZmQJfSB9LAoreyAgICAiZGl2aDMiLAl7InJocmh3aCIsCQkweDY3ZmQJfSB9LAoreyAgICAiY3Z0aGIiLAl7InJod2IiLAkJMHg2OGZkCX0gfSwKK3sgICAgImN2dGh3IiwJeyJyaHd3IiwJCTB4NjlmZAl9IH0sCit7ICAgICJjdnRobCIsCXsicmh3bCIsCQkweDZhZmQJfSB9LAoreyAgICAiY3Z0cmhsIiwJeyJyaHdsIiwJCTB4NmJmZAl9IH0sCit7ICAgICJjdnRiaCIsCXsicmJ3aCIsCQkweDZjZmQJfSB9LAoreyAgICAiY3Z0d2giLAl7InJ3d2giLAkJMHg2ZGZkCX0gfSwKK3sgICAgImN2dGxoIiwJeyJybHdoIiwJCTB4NmVmZAl9IH0sCit7ICAgICJhY2JoIiwJeyJyaHJobWhidyIsCQkweDZmZmQJfSB9LAoreyAgICAibW92aCIsCXsicmh3aCIsCQkweDcwZmQJfSB9LAoreyAgICAiY21waCIsCXsicmhyaCIsCQkweDcxZmQJfSB9LAoreyAgICAibW5lZ2giLAl7InJod2giLAkJMHg3MmZkCX0gfSwKK3sgICAgInRzdGgiLAl7InJoIiwJCQkweDczZmQJfSB9LAoreyAgICAiZW1vZGgiLAl7InJocndyaHdsd2giLAkJMHg3NGZkCX0gfSwKK3sgICAgInBvbHloIiwJeyJyaHJ3YWIiLAkJMHg3NWZkCX0gfSwKK3sgICAgImN2dGhnIiwJeyJyaHdnIiwJCTB4NzZmZAl9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLworeyAgICAiY2xyaCIsCXsid2giLAkJCTB4N2NmZAl9IH0sCit7ICAgICJjbHJvIiwJeyJ3byIsCQkJMHg3Y2ZkCX0gfSwKK3sgICAgIm1vdm8iLAl7InJvd28iLAkJMHg3ZGZkCX0gfSwKK3sgICAgIm1vdmFoIiwJeyJhaHdsIiwJCTB4N2VmZAl9IH0sCit7ICAgICJtb3ZhbyIsCXsiYW93bCIsCQkweDdlZmQJfSB9LAoreyAgICAicHVzaGFoIiwJeyJhaCIsCQkJMHg3ZmZkCX0gfSwKK3sgICAgInB1c2hhbyIsCXsiYW8iLAkJCTB4N2ZmZAl9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLworeyAgICAiY3Z0ZmgiLAl7InJmd2giLAkJMHg5OGZkCX0gfSwKK3sgICAgImN2dGZnIiwJeyJyZndnIiwJCTB4OTlmZAl9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLworeyAgICAiY3Z0aGYiLAl7InJod2YiLAkJMHhmNmZkCX0gfSwKK3sgICAgImN2dGhkIiwJeyJyaHdkIiwJCTB4ZjdmZAl9IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLworeyAgICAiYnVnbCIsCXsicmwiLAkJCTB4ZmRmZgl9IH0sCit7ICAgICJidWd3IiwJeyJydyIsCQkJMHhmZWZmCX0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCisKK3sgICAgICAiIiwJeyIiLCAwfSB9CQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KKworfTsJCQkJLyogdm90c3RycyAqLworCisvKiBlbmQ6IHZheC5vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vczlrLmggYi9pbmNsdWRlL29zOWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJlZWQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9vczlrLmgKQEAgLTAsMCArMSwxNjkgQEAKKyNpZiAhZGVmaW5lZChfTU9EVUxFX0gpCisjZGVmaW5lIF9NT0RVTEVfSAorCisvKiBPUy05MDAwIGkzODYgbW9kdWxlIGhlYWRlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBfTVBGMzg2CisKKy8qIHNpemVvZiBjb21tb24gaGVhZGVyIGxlc3MgcGFyaXR5IGZpZWxkICovCisjZGVmaW5lIE5fTV9QQVJJVFkgIChzaXplb2YobWhfY29tKS1zaXplb2YodW5pc2duZWQgc2hvcnQpKQorI2RlZmluZSBPTERfTV9QQVJJVFkgNDYKKyNkZWZpbmUgTV9QQVJJVFkgTl9NX1BBUklUWQorCisjaWZkZWYgX01QRjY4SworI2RlZmluZSBNT0RTWU5DIDB4NGFmZCAgICAgIC8qIG1vZHVsZSBoZWFkZXIgc3luYyBjb2RlIGZvciA2ODB4MCBwcm9jZXNzb3JzICovCisjZW5kaWYKKworI2lmZGVmIF9NUEYzODYKKyNkZWZpbmUgTU9EU1lOQyAweDRhZmMgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgODAzODYgcHJvY2Vzc29ycyAqLworI2VuZGlmCisKKyNkZWZpbmUgTU9EUkVWCTEJCQkvKiBtb2R1bGUgZm9ybWF0IHJldmlzaW9uIDEgKi8KKyNkZWZpbmUgQ1JDQ09OCTB4ODAwZmUzCS8qIGNyYyBwb2x5bm9taWFsIGNvbnN0YW50ICovCisKKy8qIE1vZHVsZSBhY2Nlc3MgcGVybWlzc2lvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgTVBfT1dORVJfUkVBRAkweDAwMDEKKyNkZWZpbmUgTVBfT1dORVJfV1JJVEUJMHgwMDAyCisjZGVmaW5lIE1QX09XTkVSX0VYRUMJMHgwMDA0CisjZGVmaW5lIE1QX0dST1VQX1JFQUQJMHgwMDEwCisjZGVmaW5lIE1QX0dST1VQX1dSSVRFCTB4MDAyMAorI2RlZmluZSBNUF9HUk9VUF9FWEVDCTB4MDA0MAorI2RlZmluZSBNUF9XT1JMRF9SRUFECTB4MDEwMAorI2RlZmluZSBNUF9XT1JMRF9XUklURQkweDAyMDAKKyNkZWZpbmUgTVBfV09STERfRVhFQwkweDA0MDAKKyNkZWZpbmUgTVBfV09STERfQUNDRVNTCTB4MDc3NworI2RlZmluZSBNUF9PV05FUl9NQVNLCTB4MDAwZgorI2RlZmluZSBNUF9HUk9VUF9NQVNLCTB4MDBmMAorI2RlZmluZSBNUF9XT1JMRF9NQVNLCTB4MGYwMAorI2RlZmluZSBNUF9TWVNUTV9NQVNLCTB4ZjAwMAorCisvKiBNb2R1bGUgVHlwZS9MYW5ndWFnZSB2YWx1ZXMgKi8KKyNkZWZpbmUgTVRfQU5ZCQkwCisjZGVmaW5lIE1UX1BST0dSQU0JMHgwMDAxCisjZGVmaW5lIE1UX1NVQlJPVVQJMHgwMDAyCisjZGVmaW5lIE1UX01VTFRJCTB4MDAwMworI2RlZmluZSBNVF9EQVRBCQkweDAwMDQKKyNkZWZpbmUgTVRfVFJBUExJQgkweDAwMGIKKyNkZWZpbmUgTVRfU1lTVEVNCTB4MDAwYworI2RlZmluZSBNVF9GSUxFTUFOCTB4MDAwZAorI2RlZmluZSBNVF9ERVZEUlZSCTB4MDAwZSAKKyNkZWZpbmUgTVRfREVWREVTQwkweDAwMGYKKyNkZWZpbmUgTVRfTUFTSwkJMHhmZjAwCisKKyNkZWZpbmUgTUxfQU5ZCQkwCisjZGVmaW5lIE1MX09CSkVDVAkxCisjZGVmaW5lIE1MX0lDT0RFCTIKKyNkZWZpbmUgTUxfUENPREUJMworI2RlZmluZSBNTF9DQ09ERQk0CisjZGVmaW5lIE1MX0NCTENPREUJNQorI2RlZmluZSBNTF9GUlROQ09ERQk2CisjZGVmaW5lIE1MX01BU0sJCTB4MDBmZgorCisjZGVmaW5lIG1rdHlwZWxhbmcodHlwZSxsYW5nKQkoKCh0eXBlKTw8OCl8KGxhbmcpKQorCisvKiBNb2R1bGUgQXR0cmlidXRlIHZhbHVlcyAqLworI2RlZmluZSBNQV9SRUVOVAkweDgwCisjZGVmaW5lIE1BX0dIT1NUCTB4NDAKKyNkZWZpbmUgTUFfU1VQRVIJMHgyMAorI2RlZmluZSBNQV9NQVNLCQkweGZmMDAKKyNkZWZpbmUgTVJfTUFTSwkJMHgwMGZmCisKKyNkZWZpbmUgbWthdHRyZXZzKGF0dHIsIHJldnMpCSgoKGF0dHIpPDw4KXwocmV2cykpCisKKyNkZWZpbmUgbV91c2VyIG1fb3duZXIuZ3JwX3Vzci51c3IKKyNkZWZpbmUgbV9ncm91cCBtX293bmVyLmdycF91c3IuZ3JwCisjZGVmaW5lIG1fZ3JvdXBfdXNlciBtX293bmVyLmdyb3VwX3VzZXIKKworLyogbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyBtb2R1bGUgaGVhZGVyIGZpZWxkcyAqLworI2RlZmluZSBNT0ROQU1FKG1vZCkgKCh1X2NoYXIqKSgodV9jaGFyKiltb2QgKyAoKE1oX2NvbSltb2QpLT5tX25hbWUpKQorI2lmIDAKKy8qIEFwcGVhcnMgbm90IHRvIGJlIHVzZWQsIGFuZCB0aGUgdV9pbnQzMiB0eXBlZGVmIGlzIGdvbmUgKGJlY2F1c2UgaXQKKyAgIGNvbmZsaWN0ZWQgd2l0aCBhIE1hY2ggaGVhZGVyLiAgKi8KKyNkZWZpbmUgTU9EU0laRShtb2QpICgodV9pbnQzMikoKE1oX2NvbSltb2QpLT5tX3NpemUpCisjZW5kaWYgLyogMCAqLworI2RlZmluZSBNSENPTV9CWVRFU19TSVpFIDgwCisjZGVmaW5lIE5fQkFETUFHKGEpICgoKGEpLmFfaW5mbykgIT0gTU9EU1lOQykKKwordHlwZWRlZiBzdHJ1Y3QgbWhfY29tIHsKKyAgLyogc3luYyBieXRlcyAoJDRhZmMpLiAgKi8KKyAgdW5zaWduZWQgY2hhciBtX3N5bmNbMl07CisgIHVuc2lnbmVkIGNoYXIgbV9zeXNyZXZbMl07CQkvKiBzeXN0ZW0gcmV2aXNpb24gY2hlY2sgdmFsdWUgKi8KKyAgdW5zaWduZWQgY2hhcgorICAgIG1fc2l6ZVs0XTsJCQkvKiBtb2R1bGUgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCisgICAgbV9vd25lcls0XTsJCS8qIGdyb3VwL3VzZXIgaWQgKi8KKyAgdW5zaWduZWQgY2hhcgorICAgIG1fbmFtZVs0XTsJCQkvKiBvZmZzZXQgdG8gbW9kdWxlIG5hbWUgKi8KKyAgdW5zaWduZWQgY2hhcgorICAgIG1fYWNjZXNzWzJdLAkJLyogYWNjZXNzIHBlcm1pc3Npb25zICovCisgICAgbV90eWxhblsyXSwJCS8qIHR5cGUvbGFuZyAqLworICAgIG1fYXR0cmV2WzJdLAkJLyogcmV2L2F0dHIgKi8KKyAgICBtX2VkaXRbMl07CQkJLyogZWRpdGlvbiAqLworICB1bnNpZ25lZCBjaGFyCisgICAgbV9uZWVkc1s0XSwJCS8qIG1vZHVsZSBoYXJkd2FyZSByZXF1aXJlbWVudHMgZmxhZ3MuIChyZXNlcnZlZCkgKi8KKyAgICBtX3VzYWdlWzRdLAkJLyogY29tbWVudCBzdHJpbmcgb2Zmc2V0ICovCisgICAgbV9zeW1ib2xbNF0sCQkvKiBzeW1ib2wgdGFibGUgb2Zmc2V0ICovCisgICAgbV9leGVjWzRdLAkJCS8qIG9mZnNldCB0byBleGVjdXRpb24gZW50cnkgcG9pbnQgKi8KKyAgICBtX2V4Y3B0WzRdLAkJLyogb2Zmc2V0IHRvIGV4Y2VwdGlvbiBlbnRyeSBwb2ludCAqLworICAgIG1fZGF0YVs0XSwJCQkvKiBkYXRhIHN0b3JhZ2UgcmVxdWlyZW1lbnQgKi8KKyAgICBtX3N0YWNrWzRdLAkJLyogc3RhY2sgc2l6ZSAqLworICAgIG1faWRhdGFbNF0sCQkvKiBvZmZzZXQgdG8gaW5pdGlhbGl6ZWQgZGF0YSAqLworICAgIG1faWRyZWZbNF0sCQkvKiBvZmZzZXQgdG8gZGF0YSByZWZlcmVuY2UgbGlzdHMgKi8KKyAgICBtX2luaXRbNF0sCQkJLyogaW5pdGlhbGl6YXRpb24gcm91dGluZSBvZmZzZXQgKi8KKyAgICBtX3Rlcm1bNF07CQkJLyogdGVybWluYXRpb24gcm91dGluZSBvZmZzZXQgKi8KKyAgdW5zaWduZWQgY2hhcgorICAgIG1faWRlbnRbMl07CQkvKiBpZGVudCBjb2RlIGZvciBpZGVudCBwcm9ncmFtICovCisgIGNoYXIKKyAgICBtX3NwYXJlWzhdOwkvKiByZXNlcnZlZCBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyCisgICAgbV9wYXJpdHlbMl07IAkJLyogaGVhZGVyIHBhcml0eSAqLworfSBtaF9jb20sKk1oX2NvbTsKKworLyogRXhlY3V0YWJsZSBtZW1vcnkgbW9kdWxlICovCit0eXBlZGVmIG1oX2NvbSAqTWhfZXhlYyxtaF9leGVjOworCisvKiBEYXRhIG1lbW9yeSBtb2R1bGUgKi8KK3R5cGVkZWYgbWhfY29tICpNaF9kYXRhLG1oX2RhdGE7CisKKy8qIEZpbGUgbWFuYWdlciBtZW1vcnkgbW9kdWxlICovCit0eXBlZGVmIG1oX2NvbSAqTWhfZm1hbixtaF9mbWFuOworCisvKiBkZXZpY2UgZHJpdmVyIG1vZHVsZSAqLwordHlwZWRlZiBtaF9jb20gKk1oX2RydnIsbWhfZHJ2cjsKKworLyogdHJhcCBoYW5kbGVyIG1vZHVsZSAqLwordHlwZWRlZgltaF9jb20gbWhfdHJhcCwgKk1oX3RyYXA7CisKKy8qIERldmljZSBkZXNjcmlwdG9yIG1vZHVsZSAqLwordHlwZWRlZgltaF9jb20gKk1oX2RldixtaF9kZXY7CisKKy8qIENvbmZpZ3VyYXRpb24gbW9kdWxlICovCit0eXBlZGVmIG1oX2NvbSAqTWhfY29uZmlnLCBtaF9jb25maWc7CisKKyNpZiAwIAorCisjaWYgIWRlZmluZWQoX01PRERJUl9IKQorLyogZ28gZ2V0IF9vc19mbW9kIChhbmQgb3RoZXJzKSAqLworI2luY2x1ZGUgPG1vZGRpci5oPgorI2VuZGlmCisKK2Vycm9yX2NvZGUgX29zX2NyYyh2b2lkICosIHVfaW50MzIsIGludCAqKTsKK2Vycm9yX2NvZGUgX29zX2RhdG1vZChjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9kYXRhICoqKTsKK2Vycm9yX2NvZGUgX29zX2dldF9tb2RkaXIodm9pZCAqLCB1X2ludDMyICopOworZXJyb3JfY29kZSBfb3NfaW5pdGRhdGEobWhfY29tICosIHZvaWQgKik7CitlcnJvcl9jb2RlIF9vc19saW5rKGNoYXIgKiosIG1oX2NvbSAqKiwgdm9pZCAqKiwgdV9pbnQxNiAqLCB1X2ludDE2ICopOworZXJyb3JfY29kZSBfb3NfbGlua20obWhfY29tICosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKK2Vycm9yX2NvZGUgX29zX2xvYWQoY2hhciAqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyKTsKK2Vycm9yX2NvZGUgX29zX21rbW9kdWxlKGNoYXIgKiwgdV9pbnQzMiwgdV9pbnQxNiAqLCB1X2ludDE2ICosIHVfaW50MzIsIHZvaWQgKiosIG1oX2NvbSAqKiwgdV9pbnQzMik7CitlcnJvcl9jb2RlIF9vc19tb2RhZGRyKHZvaWQgKiwgbWhfY29tICoqKTsKK2Vycm9yX2NvZGUgX29zX3NldGNyYyhtaF9jb20gKik7CitlcnJvcl9jb2RlIF9vc19zbGluayh1X2ludDMyLCBjaGFyICosIHZvaWQgKiosIHZvaWQgKiosIG1oX2NvbSAqKik7CitlcnJvcl9jb2RlIF9vc19zbGlua20odV9pbnQzMiwgbWhfY29tICosIHZvaWQgKiosIHZvaWQgKiopOworZXJyb3JfY29kZSBfb3NfdW5saW5rKG1oX2NvbSAqKTsKK2Vycm9yX2NvZGUgX29zX3VubG9hZChjaGFyICosIHVfaW50MzIpOworZXJyb3JfY29kZSBfb3NfdGxpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCBtaF90cmFwICoqLCB2b2lkICosIHVfaW50MzIpOworZXJyb3JfY29kZSBfb3NfdGxpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICosIHVfaW50MzIpOworZXJyb3JfY29kZSBfb3NfaW9kZWwobWhfY29tICopOworZXJyb3JfY29kZSBfb3Nfdm1vZHVsKG1oX2NvbSAqLCBtaF9jb20gKiwgdV9pbnQzMik7CisjZW5kaWYgLyogMCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvZ3Jlc3MuaCBiL2luY2x1ZGUvcHJvZ3Jlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgzMThhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wcm9ncmVzcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIERlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIHByb2dyZXNzIG1hY3Jvcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGRlZmF1bHQgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIGludGVuZGVkIHRvIGJlIHJlcGxhY2VkIGJ5IHJlYWwKKyAgIGRlZmluaXRpb25zLCBpZiBidWlsZGluZyB0aGUgdG9vbHMgZm9yIGFuIGludGVyYWN0aXZlIHByb2dyYW1taW5nCisgICBlbnZpcm9ubWVudC4gICovCisKKyNpZm5kZWYgX1BST0dSRVNTX0gKKyNkZWZpbmUgX1BST0dSRVNTX0gKKworI2lmbmRlZiBTVEFSVF9QUk9HUkVTUworI2RlZmluZSBTVEFSVF9QUk9HUkVTUyhTVFIsTikKKyNlbmRpZgorCisjaWZuZGVmIFBST0dSRVNTCisjZGVmaW5lIFBST0dSRVNTKFgpCisjZW5kaWYKKworI2lmbmRlZiBFTkRfUFJPR1JFU1MKKyNkZWZpbmUgRU5EX1BST0dSRVNTKFNUUikKKyNlbmRpZgorCisjZW5kaWYgLyogX1BST0dSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cgYi9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JlZ3MvQ2hhbmdlTG9nCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlbW90ZS1zaW0uaCBiL2luY2x1ZGUvcmVtb3RlLXNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JlbW90ZS1zaW0uaApAQCAtMCwwICsxLDMyMSBAQAorLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzaW11bGF0b3IgYW5kIGdkYi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKFJFTU9URV9TSU1fSCkKKyNkZWZpbmUgUkVNT1RFX1NJTV9IIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGlzIGZpbGUgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHN0YW5kLWFsb25lIHNpbXVsYXRvcnMsIHNvIGlzb2xhdGUgdGhpcworICAgZmlsZSBmcm9tIGdkYi4gICovCisKKy8qIFBpY2sgdXAgQ09SRV9BRERSX1RZUEUgaWYgZGVmaW5lZCAoZnJvbSBnZGIpLCBvdGhlcndpc2UgdXNlIHNhbWUgdmFsdWUgYXMKKyAgIGdkYiBkb2VzICh1bnNpZ25lZCBpbnQgLSBmcm9tIGRlZnMuaCkuICAqLworCisjaWZuZGVmIENPUkVfQUREUl9UWVBFCit0eXBlZGVmIHVuc2lnbmVkIGludCBTSU1fQUREUjsKKyNlbHNlCit0eXBlZGVmIENPUkVfQUREUl9UWVBFIFNJTV9BRERSOworI2VuZGlmCisKKworLyogU2VtaS1vcGFxdWUgdHlwZSB1c2VkIGFzIHJlc3VsdCBvZiBzaW1fb3BlbiBhbmQgcGFzc2VkIGJhY2sgdG8gYWxsCisgICBvdGhlciByb3V0aW5lcy4gICJkZXNjIiBpcyBzaG9ydCBmb3IgImRlc2NyaXB0b3IiLgorICAgSXQgaXMgdXAgdG8gZWFjaCBzaW11bGF0b3IgdG8gZGVmaW5lIGBzaW1fc3RhdGUnLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2ltX3N0YXRlICpTSU1fREVTQzsKKworCisvKiBWYWx1ZXMgZm9yIGBraW5kJyBhcmcgdG8gc2ltX29wZW4uICAqLworCit0eXBlZGVmIGVudW0geworICBTSU1fT1BFTl9TVEFOREFMT05FLCAvKiBzaW11bGF0b3IgdXNlZCBzdGFuZGFsb25lIChydW4uYykgKi8KKyAgU0lNX09QRU5fREVCVUcgICAgICAgLyogc2ltdWxhdG9yIHVzZWQgYnkgZGVidWdnZXIgKGdkYikgKi8KK30gU0lNX09QRU5fS0lORDsKKworCisvKiBSZXR1cm4gY29kZXMgZnJvbSB2YXJpb3VzIGZ1bmN0aW9ucy4gICovCisKK3R5cGVkZWYgZW51bSB7CisgIFNJTV9SQ19GQUlMID0gMCwKKyAgU0lNX1JDX09LID0gMSwKKyAgU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVCA9IDIsCisgIFNJTV9SQ19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTID0gMywKKyAgU0lNX1JDX0RVUExJQ0FURV9CUkVBS1BPSU5UID0gNAorfSBTSU1fUkM7CisKKworLyogVGhlIGJmZCBzdHJ1Y3QsIGFzIGFuIG9wYXF1ZSB0eXBlLiAgKi8KKworc3RydWN0IF9iZmQ7CisKKworLyogTWFpbiBzaW11bGF0b3IgZW50cnkgcG9pbnRzLiAgKi8KKworCisvKiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBzaW11bGF0b3IgaW5zdGFuY2UuCisKKyAgIChUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzaW11bGF0b3IgaXMgc2VsZWN0ZWQgZnJvbSB0aGUKKyAgIGdkYiBjb21tYW5kIGxpbmUuKQorCisgICBLSU5EIHNwZWNpZmllcyBob3cgdGhlIHNpbXVsYXRvciBzaGFsbCBiZSB1c2VkLiAgQ3VycmVudGx5IHRoZXJlCisgICBhcmUgb25seSB0d28ga2luZHM6IHN0YW5kLWFsb25lIGFuZCBkZWJ1Zy4KKworICAgQ0FMTEJBQ0sgc3BlY2lmaWVzIGEgc3RhbmRhcmQgaG9zdCBjYWxsYmFjayAoZGVmaW5lZCBpbiBjYWxsYmFjay5oKS4KKworICAgQUJGRCwgd2hlbiBub24gTlVMTCwgZGVzaWduYXRlcyBhIHRhcmdldCBwcm9ncmFtLiAgVGhlIHByb2dyYW0gaXMKKyAgIG5vdCBsb2FkZWQuCisKKyAgIEFSR1YgaXMgYSBzdGFuZGFyZCBBUkdWIHBvaW50ZXIgc3VjaCBhcyB0aGF0IHBhc3NlZCBmcm9tIHRoZQorICAgY29tbWFuZCBsaW5lLiAgVGhlIHN5bnRheCBvZiB0aGUgYXJndW1lbnQgbGlzdCBpcyBpcyBhc3N1bWVkIHRvIGJlCisgICBgYFNJTS1QUk9HIHsgU0lNLU9QVElPTiB9IFsgVEFSR0VULVBST0dSQU0geyBUQVJHRVQtT1BUSU9OIH0gXScnLgorICAgVGhlIHRyYWlsaW5nIFRBUkdFVC1QUk9HUkFNIGFuZCBhcmdzIGFyZSBvbmx5IHZhbGlkIGZvciBhCisgICBzdGFuZC1hbG9uZSBzaW11bGF0b3IuCisKKyAgIE9uIHN1Y2Nlc3MsIHRoZSByZXN1bHQgaXMgYSBub24gTlVMTCBkZXNjcmlwdG9yIHRoYXQgc2hhbGwgYmUKKyAgIHBhc3NlZCB0byB0aGUgb3RoZXIgc2ltX2ZvbyBmdW5jdGlvbnMuICBXaGlsZSB0aGUgc2ltdWxhdG9yCisgICBjb25maWd1cmF0aW9uIGNhbiBiZSBwYXJhbWV0ZXJpemVkIGJ5IChpbiBkZWNyZWFzaW5nIHByZWNlZGVuY2UpCisgICBBUkdWJ3MgU0lNLU9QVElPTiwgQVJHVidzIFRBUkdFVC1QUk9HUkFNIGFuZCB0aGUgQUJGRCBhcmd1bWVudCwgdGhlCisgICBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIHRoZSBzaW11bGF0b3Igc2hhbGwgbm90IGRlcGVuZGVudCBvbiB0aGUKKyAgIHByZXNlbmNlIG9mIGFueSBvZiB0aGVzZSBhcmd1bWVudHMvb3B0aW9ucy4KKworICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBUaGUgY3JlYXRlZCBzaW11bGF0b3Igc2hhbGwgYmUgc3VmZmljaWVudGx5CisgICBpbml0aWFsaXplZCB0byBoYW5kbGUsIHdpdGggb3V0IHJlc3RyaWN0aW9ucyBhbnkgY2xpZW50IHJlcXVlc3RzCisgICAoaW5jbHVkaW5nIG1lbW9yeSByZWFkcy93cml0ZXMsIHJlZ2lzdGVyIGZldGNoL3N0b3JlcyBhbmQgYQorICAgcmVzdW1lKS4KKworICAgUHJvY2VzcyBzaW11bGF0b3I6IHRoYXQgcHJvY2VzcyBpcyBub3QgY3JlYXRlZCB1bnRpbCBhIGNhbGwgdG8KKyAgIHNpbV9jcmVhdGVfaW5mZXJpb3IuICBGSVhNRTogV2hhdCBzaG91bGQgdGhlIHN0YXRlIG9mIHRoZSBzaW11bGF0b3IKKyAgIGJlPyAqLworCitTSU1fREVTQyBzaW1fb3BlbiBQQVJBTVMgKChTSU1fT1BFTl9LSU5EIGtpbmQsIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqY2FsbGJhY2ssIHN0cnVjdCBfYmZkICphYmZkLCBjaGFyICoqYXJndikpOworCisKKy8qIERlc3RvcnkgYSBzaW11bGF0b3IgaW5zdGFuY2UuCisKKyAgIFFVSVRUSU5HIGlzIG5vbi16ZXJvIGlmIHdlIGNhbm5vdCBoYW5nIG9uIGVycm9ycy4KKworICAgVGhpcyBtYXkgaW52b2x2ZSBmcmVlaW5nIHRhcmdldCBtZW1vcnkgYW5kIGNsb3NpbmcgYW55IG9wZW4gZmlsZXMKKyAgIGFuZCBtbWFwJ2QgYXJlYXMuICBZb3UgY2Fubm90IGFzc3VtZSBzaW1fa2lsbCBoYXMgYWxyZWFkeSBiZWVuCisgICBjYWxsZWQuICovCisKK3ZvaWQgc2ltX2Nsb3NlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcXVpdHRpbmcpKTsKKworCisvKiBMb2FkIHByb2dyYW0gUFJPRyBpbnRvIHRoZSBzaW11bGF0b3JzIG1lbW9yeS4KKworICAgSWYgQUJGRCBpcyBub24tTlVMTCwgdGhlIGJmZCBmb3IgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQuCisgICBUaGUgcmVzdWx0IGlzIGEgcmV0dXJuIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzLgorCisgICBIYXJkd2FyZSBzaW11bGF0b3I6IE5vcm1hbGx5LCBlYWNoIHByb2dyYW0gc2VjdGlvbiBpcyB3cml0dGVuIGludG8KKyAgIG1lbW9yeSBhY2NvcmRpbmcgdG8gdGhhdCBzZWN0aW9ucyBMTUEgdXNpbmcgcGh5c2ljYWwgKGRpcmVjdCkKKyAgIGFkZHJlc3NpbmcuICBUaGUgZXhjZXB0aW9uIGJlaW5nIHN5c3RlbXMsIHN1Y2ggYXMgUFBDL0NIUlAsIHdoaWNoCisgICBzdXBwb3J0IG1vcmUgY29tcGxpY2F0ZWQgcHJvZ3JhbSBsb2FkZXJzLiAgQSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24KKyAgIHNob3VsZCBub3QgZWZmZWN0IHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIHJlZ2lzdGVycy4gIE11bHRpcGxlCisgICBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBwZXJtaXR0ZWQgYW5kIGhhdmUgYW4gYWNjdW11bGF0aXZlCisgICBlZmZlY3QuCisKKyAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIG1heSBiZSBpZ25vcmVkLgorCisgICBGSVhNRTogTW9zdCBoYXJkd2FyZSBzaW11bGF0b3JzIGxvYWQgdGhlIGltYWdlIGF0IHRoZSBWTUEgdXNpbmcKKyAgIHZpcnR1YWwgYWRkcmVzc2luZy4KKworICAgRklYTUU6IEZvciBzb21lIGhhcmR3YXJlIHRhcmdldHMsIGJlZm9yZSBhIGxvYWRlZCBwcm9ncmFtIGNhbiBiZQorICAgZXhlY3V0ZWQsIGl0IHJlcXVpcmVzIHRoZSBtYW5pcHVsYXRpb24gb2YgVk0gcmVnaXN0ZXJzIGFuZCB0YWJsZXMuCisgICBTdWNoIG1hbmlwdWxhdGlvbiBzaG91bGQgcHJvYmFibHkgKD8pIG9jY3VyZSBpbgorICAgc2ltX2NyZWF0ZV9pbmZlcmlvci4gKi8KKworU0lNX1JDIHNpbV9sb2FkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpwcm9nLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgaW50IGZyb21fdHR5KSk7CisKKworLyogUHJlcGFyZSB0byBydW4gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLgorCisgICBBQkZELCBpZiBub3QgTlVMTCwgcHJvdmlkZXMgaW5pdGlhbCBwcm9jZXNzb3Igc3RhdGUgaW5mb3JtYXRpb24uCisgICBBUkdWIGFuZCBFTlYsIGlmIG5vbiBOVUxMLCBhcmUgTlVMTCB0ZXJtaW5hdGVkIGxpc3RzIG9mIHBvaW50ZXJzLgorCisgICBIYXJkd2FyZSBzaW11bGF0b3I6IFRoaXMgZnVuY3Rpb24gc2hhbGwgaW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc29yCisgICByZWdpc3RlcnMgdG8gYSBrbm93biB2YWx1ZS4gIFRoZSBwcm9ncmFtIGNvdW50ZXIgYW5kIHBvc3NpYmx5IHN0YWNrCisgICBwb2ludGVyIHNoYWxsIGJlIHNldCB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIEFCRkQgKG9yCisgICBoYXJkd2FyZSByZXNldCBkZWZhdWx0cykuICBBUkdWIGFuZCBFTlYsIGRlcGVuZGFudCBvbiB0aGUgdGFyZ2V0CisgICBBQkksIG1heSBiZSB3cml0dGVuIHRvIG1lbW9yeS4KKworICAgUHJvY2VzcyBzaW11bGF0b3I6IEFmdGVyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBhIG5ldyBwcm9jZXNzCisgICBpbnN0YW5jZSBzaGFsbCBleGlzdC4gVGhlIFRFWFQsIERBVEEsIEJTUyBhbmQgc3RhY2sgcmVnaW9ucyBzaGFsbAorICAgYWxsIGJlIGluaXRpYWxpemVkLCBBUkdWIGFuZCBFTlYgc2hhbGwgYmUgd3JpdHRlbiB0byBwcm9jZXNzCisgICBhZGRyZXNzIHNwYWNlIChhY2NvcmRpbmcgdG8gdGhlIGFwcGxpY2FibGUgQUJJKSBhbmQgdGhlIHByb2dyYW0KKyAgIGNvdW50ZXIgYW5kIHN0YWNrIHBvaW50ZXIgc2V0IGFjY29yZGluZ2x5LiAqLworCitTSU1fUkMgc2ltX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChTSU1fREVTQyBzZCwgc3RydWN0IF9iZmQgKmFiZmQsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52KSk7CisKKworLyogRmV0Y2ggTEVOR1RIIGJ5dGVzIG9mIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSdzIG1lbW9yeS4gIFN0YXJ0IGZldGNoCisgICBhdCB2aXJ0dWFsIGFkZHJlc3MgTUVNIGFuZCBzdG9yZSBpbiBCVUYuICBSZXN1bHQgaXMgbnVtYmVyIG9mIGJ5dGVzCisgICByZWFkLCBvciB6ZXJvIGlmIGVycm9yLiAgKi8KKworaW50IHNpbV9yZWFkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOworCisKKy8qIFN0b3JlIExFTkdUSCBieXRlcyBmcm9tIEJVRiBpbnRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbSdzCisgICBtZW1vcnkuIFN0b3JlIGJ5dGVzIHN0YXJ0aW5nIGF0IHZpcnR1YWwgYWRkcmVzcyBNRU0uIFJlc3VsdCBpcworICAgbnVtYmVyIG9mIGJ5dGVzIHdyaXRlLCBvciB6ZXJvIGlmIGVycm9yLiAgKi8KKworaW50IHNpbV93cml0ZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKKworCisvKiBGZXRjaCByZWdpc3RlciBSRUdOTyBzdG9yaW5nIGl0cyByYXcgKHRhcmdldCBlbmRpYW4pIHZhbHVlIGluIHRoZQorICAgTEVOR1RIIGJ5dGUgYnVmZmVyIEJVRi4gIFJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlZ2lzdGVyIG9yCisgICB6ZXJvIGlmIFJFR05PIGlzIG5vdCBhcHBsaWNhYmxlLgorCisgICBMZWdhY3kgaW1wbGVtZW50YXRpb25zIGlnbm9yZSBMRU5HVEggYW5kIGFsd2F5cyByZXR1cm4gLTEuCisKKyAgIElmIExFTkdUSCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiBSRUdOTyBubyBkYXRhIGlzIHRyYW5zZmVyZWQKKyAgICh0aGUgYWN0dWFsIHJlZ2lzdGVyIHNpemUgaXMgc3RpbGwgcmV0dXJuZWQpLiAqLworCitpbnQgc2ltX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOworCisKKy8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PIGZyb20gdGhlIHJhdyAodGFyZ2V0IGVuZGlhbikgdmFsdWUgaW4gQlVGLgorICAgUmV0dXJuIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIgb3IgemVybyBpZiBSRUdOTyBpcyBub3QKKyAgIGFwcGxpY2FibGUuCisKKyAgIExlZ2FjeSBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIExFTkdUSCBhbmQgYWx3YXlzIHJldHVybiAtMS4KKworICAgSWYgTEVOR1RIIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIG9mIFJFR05PIG5vIGRhdGEgaXMgdHJhbnNmZXJlZAorICAgKHRoZSBhY3R1YWwgcmVnaXN0ZXIgc2l6ZSBpcyBzdGlsbCByZXR1cm5lZCkuICovCisKK2ludCBzaW1fc3RvcmVfcmVnaXN0ZXIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCByZWdubywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7CisKKworLyogUHJpbnQgd2hhdGV2ZXIgc3RhdGlzdGljcyB0aGUgc2ltdWxhdG9yIGhhcyBjb2xsZWN0ZWQuCisKKyAgIFZFUkJPU0UgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgbXVzdCBhbHdheXMgYmUgemVyby4gICovCisKK3ZvaWQgc2ltX2luZm8gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCB2ZXJib3NlKSk7CisKKworLyogUnVuIChvciByZXN1bWUpIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4gICovCisKK3ZvaWQgc2ltX3Jlc3VtZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHN0ZXAsIGludCBzaWdnbmFsKSk7CisKKworLyogQXN5bmNocm9ub3VzIHJlcXVlc3QgdG8gc3RvcCB0aGUgc2ltdWxhdGlvbi4KKyAgIEEgbm9uemVybyByZXR1cm4gaW5kaWNhdGVzIHRoYXQgdGhlIHNpbXVsYXRvciBpcyBhYmxlIHRvIGhhbmRsZQorICAgdGhlIHJlcXVlc3QgKi8KKworaW50IHNpbV9zdG9wIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7CisKKworLyogRmV0Y2ggdGhlIFJFQVNPTiB3aHkgdGhlIHByb2dyYW0gc3RvcHBlZC4KKworICAgU0lNX0VYSVRFRDogVGhlIHByb2dyYW0gaGFzIHRlcm1pbmF0ZWQuIFNJR1JDIGluZGljYXRlcyB0aGUgdGFyZ2V0CisgICBkZXBlbmRhbnQgZXhpdCBzdGF0dXMuCisKKyAgIFNJTV9TVE9QUEVEOiBUaGUgcHJvZ3JhbSBoYXMgc3RvcHBlZC4gIFNJR1JDIHVzZXMgdGhlIGhvc3QncyBzaWduYWwKKyAgIG51bWJlcmluZyBhcyBhIHdheSBvZiBpZGVudGlmeWluZyB0aGUgcmVhb246IHByb2dyYW0gaW50ZXJydXB0ZWQgYnkKKyAgIHVzZXIgdmlhIGEgc2ltX3N0b3AgcmVxdWVzdCAoU0lHSU5UKTsgYSBicmVha3BvaW50IGluc3RydWN0aW9uCisgICAoU0lHVFJBUCk7IGEgY29tcGxldGVkIHNpbmdsZSBzdGVwIChTSUdUUkFQKTsgYW4gaW50ZXJuYWwgZXJyb3IKKyAgIGNvbmRpdGlvbiAoU0lHQUJSVCk7IGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKFNJR0lMTCk7IEFjY2VzcyB0byBhbgorICAgdW5kZWZpbmVkIG1lbW9yeSByZWdpb24gKFNJR1NFR1YpOyBNaXMtYWxpZ25lZCBtZW1vcnkgYWNjZXNzCisgICAoU0lHQlVTKS4KKworICAgU0lNX1NJR05BTExFRDogVGhlIHByb2dyYW0gaGFzIHN0b3BwZWQuIFRoZSBzaW11bGF0b3IgaGFzCisgICBlbmNvdW50ZXJlZCB0YXJnZXQgY29kZSB0aGF0IHJlcXVpcmVzIHRoZSAoSE9TVCkgc2lnbmFsIFNJR1JDIHRvIGJlCisgICBkZWxpdmVyZWQgdG8gdGhlIHNpbXVsYXRlZCBwcm9ncmFtLiAgRXg6IGBraWxsIChnZXRwaWQgKCksCisgICBUQVJHRVRfU0lHeHh4KScuICBXaGVyZSBUQVJHRVRfU0lHeHh4IGhhcyBiZWVuIHRyYW5zbGF0ZWQgaW50byBhCisgICBob3N0IHNpZ25hbC4gIEZJWE1FOiBUaGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUuLgorCisgICBTSU1fUlVOTklORywgU0lNX1BPTExJTkc6IFRoZSByZXR1cm4gb2Ygb25lIG9mIHRoZXNlIHZhbHVlcworICAgaW5kaWNhdGVzIGEgcHJvYmxlbSBpbnRlcm5hbCB0byB0aGUgc2ltdWxhdG9yLiAqLworCitlbnVtIHNpbV9zdG9wIHsgc2ltX3J1bm5pbmcsIHNpbV9wb2xsaW5nLCBzaW1fZXhpdGVkLCBzaW1fc3RvcHBlZCwgc2ltX3NpZ25hbGxlZCB9OworCit2b2lkIHNpbV9zdG9wX3JlYXNvbiBQQVJBTVMgKChTSU1fREVTQyBzZCwgZW51bSBzaW1fc3RvcCAqcmVhc29uLCBpbnQgKnNpZ3JjKSk7CisKKworLyogUGFzc3RocnUgZm9yIG90aGVyIGNvbW1hbmRzIHRoYXQgdGhlIHNpbXVsYXRvciBtaWdodCBzdXBwb3J0LgorICAgU2ltdWxhdG9ycyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGFueSBjb21iaW5hdGlvbiBvZiBOVUxMCisgICBvciBlbXB0eSBDTUQuICovCisKK3ZvaWQgc2ltX2RvX2NvbW1hbmQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKmNtZCkpOworCisvKiBDYWxsIHRoZXNlIGZ1bmN0aW9ucyB0byBzZXQgYW5kIGNsZWFyIGJyZWFrcG9pbnRzIGF0IEFERFIuICovCisKK1NJTV9SQyBzaW1fc2V0X2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKK1NJTV9SQyBzaW1fY2xlYXJfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOworU0lNX1JDIHNpbV9jbGVhcl9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBicmVha3BvaW50cy4gKi8KKworU0lNX1JDIHNpbV9lbmFibGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgYWRkcikpOworU0lNX1JDIHNpbV9kaXNhYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKK1NJTV9SQyBzaW1fZW5hYmxlX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOworU0lNX1JDIHNpbV9kaXNhYmxlX2FsbF9icmVha3BvaW50cyBQQVJBTVMgKChTSU1fREVTQyBzZCkpOworDAorCisvKiBQcm92aWRlIHNpbXVsYXRvciB3aXRoIGEgZGVmYXVsdCAoZ2xvYmFsKSBob3N0X2NhbGxiYWNrX3N0cnVjdC4KKyAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgorICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCisgICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKKyAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLworCit2b2lkIHNpbV9zZXRfY2FsbGJhY2tzIFBBUkFNUyAoKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqKSk7CisKKworLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5IGFycmF5LgorICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCisgICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KKyAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcworICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCisKK3ZvaWQgc2ltX3NpemUgUEFSQU1TICgoaW50IGkpKTsKKworCisvKiBSdW4gYSBzaW11bGF0aW9uIHdpdGggdHJhY2luZyBlbmFibGVkLgorICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCisgICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KKyAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcworICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCisKK2ludCBzaW1fdHJhY2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKKworCisvKiBDb25maWd1cmUgdGhlIHNpemUgb2YgdGhlIHByb2ZpbGUgYnVmZmVyLgorICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCisgICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KKyAgIFRoaXMgcHJvY2VkdXJlIGRvZXMgbm90IHRha2UgYSBTSU1fREVTQyBhcmd1bWVudCBhcyBpdCBpcworICAgdXNlZCBiZWZvcmUgc2ltX29wZW4uICovCisKK3ZvaWQgc2ltX3NldF9wcm9maWxlX3NpemUgUEFSQU1TICgoaW50IG4pKTsKKworCisvKiBLaWxsIHRoZSBydW5uaW5nIHByb2dyYW0uCisgICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KKyAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgorICAgVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSByZXBsYWNlZCBhcyBwYXJ0IG9mIHRoZSBpbnRyb2R1Y3Rpb24gb2YKKyAgIG11bHRpLWNwdSBzaW11bGF0b3JzLiAqLworCit2b2lkIHNpbV9raWxsIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoUkVNT1RFX1NJTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zcGxheS10cmVlLmggYi9pbmNsdWRlL3NwbGF5LXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI4ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zcGxheS10cmVlLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgorICAgCitHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6CisKKyAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgorICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAKKworICAgVGhlIG1ham9yIGZlYXR1cmUgb2Ygc3BsYXkgdHJlZXMgaXMgdGhhdCBhbGwgYmFzaWMgdHJlZSBvcGVyYXRpb25zCisgICBhcmUgYW1vcnRpemVkIE8obG9nIG4pIHRpbWUgZm9yIGEgdHJlZSB3aXRoIG4gbm9kZXMuICAqLworCisjaWZuZGVmIF9TUExBWV9UUkVFX0gKKyNkZWZpbmUgX1NQTEFZX1RSRUVfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorCisvKiBVc2UgdHlwZWRlZnMgZm9yIHRoZSBrZXkgYW5kIGRhdGEgdHlwZXMgdG8gZmFjaWxpdGF0ZSBjaGFuZ2luZworICAgdGhlc2UgdHlwZXMsIGlmIG5lY2Vzc2FyeS4gIFRoZXNlIHR5cGVzIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgd2lkZQorICAgdGhhdCBhbnkgcG9pbnRlciBvciBzY2FsYXIgY2FuIGJlIGNhc3QgdG8gdGhlc2UgdHlwZXMsIGFuZCB0aGVuCisgICBjYXN0IGJhY2ssIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzcGxheV90cmVlX2tleTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc3BsYXlfdHJlZV92YWx1ZTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgYSBub2RlIGluIHRoZSB0cmVlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWVfbm9kZSAqc3BsYXlfdHJlZV9ub2RlOworCisvKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGNvbXBhcmVzIHR3byBzcGxheS10cmVlIGtleXMuICBUaGUKKyAgIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdmFsdWVzIGFzIGZvciBxc29ydC4gICovCit0eXBlZGVmIGludCAoKnNwbGF5X3RyZWVfY29tcGFyZV9mbikgUEFSQU1TKChzcGxheV90cmVlX2tleSwgc3BsYXlfdHJlZV9rZXkpKTsKKworLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCisgICB3aXRoIHRoZSBrZXkuICAqLwordHlwZWRlZiB2b2lkICgqc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5KSk7CisKKy8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBkZWFsbG9jYXRlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZAorICAgd2l0aCB0aGUgdmFsdWUuICAqLwordHlwZWRlZiB2b2lkICgqc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV92YWx1ZSkpOworCisvKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSB0cmVlLiAgKi8KK3R5cGVkZWYgaW50ICgqc3BsYXlfdHJlZV9mb3JlYWNoX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfbm9kZSwgdm9pZCopKTsKKworLyogVGhlIG5vZGVzIGluIHRoZSBzcGxheSB0cmVlLiAgKi8KK3N0cnVjdCBzcGxheV90cmVlX25vZGUKK3sKKyAgLyogVGhlIGtleS4gICovCisgIHNwbGF5X3RyZWVfa2V5IGtleTsKKworICAvKiBUaGUgdmFsdWUuICAqLworICBzcGxheV90cmVlX3ZhbHVlIHZhbHVlOworCisgIC8qIFRoZSBsZWZ0IGFuZCByaWdodCBjaGlsZHJlbiwgcmVzcGVjdGl2ZWx5LiAgKi8KKyAgc3BsYXlfdHJlZV9ub2RlIGxlZnQ7CisgIHNwbGF5X3RyZWVfbm9kZSByaWdodDsKK307CisKKy8qIFRoZSBzcGxheSB0cmVlIGl0c2VsZi4gICovCit0eXBlZGVmIHN0cnVjdCBzcGxheV90cmVlCit7CisgIC8qIFRoZSByb290IG9mIHRoZSB0cmVlLiAgKi8KKyAgc3BsYXlfdHJlZV9ub2RlIHJvb3Q7CisKKyAgLyogVGhlIGNvbXBhcmlzaW9uIGZ1bmN0aW9uLiAgKi8KKyAgc3BsYXlfdHJlZV9jb21wYXJlX2ZuIGNvbXA7CisKKyAgLyogVGhlIGRlYWxsb2NhdGUta2V5IGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCisgIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiBkZWxldGVfa2V5OworCisgIC8qIFRoZSBkZWFsbG9jYXRlLXZhbHVlIGZ1bmN0aW9uLiAgTlVMTCBpZiBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4gICovCisgIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZTsKK30gKnNwbGF5X3RyZWU7CisKK2V4dGVybiBzcGxheV90cmVlIHNwbGF5X3RyZWVfbmV3ICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWVfY29tcGFyZV9mbiwKKwkJCQkJICAgICAgICBzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4sCisJCQkJCSAgICAgICAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4pKTsKK2V4dGVybiB2b2lkIHNwbGF5X3RyZWVfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUpKTsKK2V4dGVybiB2b2lkIHNwbGF5X3RyZWVfaW5zZXJ0ICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCisJCQkJCSAgICAgICAgc3BsYXlfdHJlZV9rZXksCisJCQkJCSAgICAgICAgc3BsYXlfdHJlZV92YWx1ZSkpOworZXh0ZXJuIHNwbGF5X3RyZWVfbm9kZSBzcGxheV90cmVlX2xvb2t1cCAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKKwkJCQkJICAgICAgICBzcGxheV90cmVlX2tleSkpOworZXh0ZXJuIGludCBzcGxheV90cmVlX2ZvcmVhY2ggICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKKwkJCQkJICAgICAgICBzcGxheV90cmVlX2ZvcmVhY2hfZm4sCisJCQkJCSAgICAgICAgdm9pZCopKTsKK2V4dGVybiBpbnQgc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgICAgICBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LAorCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKK2V4dGVybiBpbnQgc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzICBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LAorCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKKwkJCQkJICAgICAgIAorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9TUExBWV9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3ltY2F0LmggYi9pbmNsdWRlL3N5bWNhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWZhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3N5bWNhdC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIFN5bWJvbCBjb25jYXRlbmF0aW9uIHV0aWxpdGllcy4KKworICAgQ29weXJpZ2h0IChDKSAxOTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgU1lNX0NBVF9ICisjZGVmaW5lIFNZTV9DQVRfSAorCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKEFMTU9TVF9TVERDKQorI2RlZmluZSBDT05DQVQyKGEsYikJIGEjI2IKKyNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEjI2IjI2MKKyNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhIyNiIyNjIyNkCisjZGVmaW5lIFNUUklOR1gocykgI3MKKyNlbHNlCisjZGVmaW5lIENPTkNBVDIoYSxiKQkgYS8qKi9iCisjZGVmaW5lIENPTkNBVDMoYSxiLGMpCSBhLyoqL2IvKiovYworI2RlZmluZSBDT05DQVQ0KGEsYixjLGQpIGEvKiovYi8qKi9jLyoqL2QKKyNkZWZpbmUgU1RSSU5HWChzKSAiPyIKKyNlbmRpZgorCisjZGVmaW5lIFhDT05DQVQyKGEsYikgICAgIENPTkNBVDIoYSxiKQorI2RlZmluZSBYQ09OQ0FUMyhhLGIsYykgICBDT05DQVQzKGEsYixjKQorI2RlZmluZSBYQ09OQ0FUNChhLGIsYyxkKSBDT05DQVQ0KGEsYixjLGQpCisKKyNkZWZpbmUgWFNUUklORyhzKSBTVFJJTkdYKHMpIAorCisjZW5kaWYgU1lNX0NBVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3dhaXQuaCBiL2luY2x1ZGUvd2FpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2M5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3dhaXQuaApAQCAtMCwwICsxLDYzIEBACisvKiBEZWZpbmUgaG93IHRvIGFjY2VzcyB0aGUgaW50IHRoYXQgdGhlIHdhaXQgc3lzdGVtIGNhbGwgc3RvcmVzLgorICAgVGhpcyBoYXMgYmVlbiBjb21wYXRpYmxlIGluIGFsbCBVbml4IHN5c3RlbXMgc2luY2UgdGltZSBpbW1lbW9yaWFsLAorICAgYnV0IHZhcmlvdXMgd2VsbC1tZWFuaW5nIHBlb3BsZSBoYXZlIGRlZmluZWQgdmFyaW91cyBkaWZmZXJlbnQKKyAgIHdvcmRzIGZvciB0aGUgc2FtZSBvbGQgYml0cyBpbiB0aGUgc2FtZSBvbGQgaW50IChzb21ldGltZXMgY2xhaW1lZAorICAgdG8gYmUgYSBzdHJ1Y3QpLiAgV2UganVzdCBrbm93IGl0J3MgYW4gaW50IGFuZCB3ZSB1c2UgdGhlc2UgbWFjcm9zCisgICB0byBhY2Nlc3MgdGhlIGJpdHMuICAqLworCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCBlcXVpdmFsZW50bHkgdG8gdGhlaXIgZGVmaW5pdGlvbnMKKyAgIGluIFBPU0lYLjEuICBXZSBmYWlsIHRvIGRlZmluZSBXTk9IQU5HIGFuZCBXVU5UUkFDRUQsIHdoaWNoIFBPU0lYLjEKKyAgIDxzeXMvd2FpdC5oPiBkZWZpbmVzLCBzaW5jZSBvdXIgY29kZSBkb2VzIG5vdCB1c2Ugd2FpdHBpZCgpLiAgV2UKKyAgIGFsc28gZmFpbCB0byBkZWNsYXJlIHdhaXQoKSBhbmQgd2FpdHBpZCgpLiAgKi8gICAKKworI2lmbmRlZglXSUZFWElURUQKKyNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCisjZW5kaWYKKworI2lmbmRlZglXSUZTSUdOQUxFRAorI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCisjZW5kaWYKKworI2lmbmRlZglXSUZTVE9QUEVECisjaWZkZWYgSUJNNjAwMAorCisvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgYWJvdmUgY29tbWVudCAoYWJvdXQgYmVpbmcgY29tcGF0aWJsZSBpbiBhbGwgVW5peCAKKyAgIHN5c3RlbXMpIGlzIG5vdCBxdWl0ZSBjb3JyZWN0IGZvciBBSVgsIHNpZ2guICBBbmQgQUlYIDMuMiBjYW4gZ2VuZXJhdGUKKyAgIHN0YXR1cyB3b3JkcyBsaWtlIDB4NTdjIChzaWd0cmFwIHJlY2VpdmVkIGFmdGVyIGxvYWQpLCBhbmQgZ2RiIHdvdWxkCisgICBjaG9rZSBvbiBpdC4gKi8KKworI2RlZmluZSBXSUZTVE9QUEVEKHcpCSgodykmMHg0MCkKKworI2Vsc2UKKyNkZWZpbmUgV0lGU1RPUFBFRCh3KQkoKCh3KSYwMzc3KSA9PSAwMTc3KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZglXRVhJVFNUQVRVUworI2RlZmluZSBXRVhJVFNUQVRVUyh3KQkoKCh3KSA+PiA4KSAmIDAzNzcpIC8qIHNhbWUgYXMgV1JFVENPREUgKi8KKyNlbmRpZgorCisjaWZuZGVmCVdURVJNU0lHCisjZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQorI2VuZGlmCisKKyNpZm5kZWYJV1NUT1BTSUcKKyNkZWZpbmUgV1NUT1BTSUcJV0VYSVRTVEFUVVMKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgbm90IGRlZmluZWQgaW4gUE9TSVgsIGJ1dCBhcmUgdXNlZCBieSBvdXIgcHJvZ3JhbXMuICAqLworCisjZGVmaW5lIFdBSVRUWVBFCWludAorCisjaWZuZGVmCVdDT1JFRFVNUAorI2RlZmluZSBXQ09SRURVTVAodykJKCgodykmMDIwMCkgIT0gMCkKKyNlbmRpZgorCisjaWZuZGVmCVdTRVRFWElUCisjZGVmaW5lIFdTRVRFWElUKHcsc3RhdHVzKSAoKHcpID0gKDAgfCAoKHN0YXR1cykgPDwgOCkpKQorI2VuZGlmCisKKyNpZm5kZWYJV1NFVFNUT1AKKyNkZWZpbmUgV1NFVFNUT1AodyxzaWcpCSAgICgodykgPSAoMDE3NyB8ICgoc2lnKSA8PCA4KSkpCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5zdGFsbC1zaCBiL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTlkZTIzOAotLS0gL2Rldi9udWxsCisrKyBiL2luc3RhbGwtc2gKQEAgLTAsMCArMSwyNTEgQEAKKyMhL2Jpbi9zaAorIworIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKyMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgorIworIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisjIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisjIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisjIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSIke0RPSVRQUk9HLX0iCisKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK3RyYW5zZm9ybWJhc2VuYW1lPSIiCit0cmFuc2Zvcm1fYXJnPSIiCitpbnN0Y21kPSIkbXZwcm9nIgorY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPSIiCitjaGdycGNtZD0iIgorc3RyaXBjbWQ9IiIKK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9IiIKK2RzdD0iIgorZGlyX2FyZz0iIgorCit3aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KKyAgICBjYXNlICQxIGluCisJLWMpIGluc3RjbWQ9IiRjcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1kKSBkaXJfYXJnPXRydWUKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KKwkgICAgdGhlbgorCQlzcmM9JDEKKwkgICAgZWxzZQorCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKKwkJOgorCQlkc3Q9JDEKKwkgICAgZmkKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworICAgIGVzYWMKK2RvbmUKKworaWYgWyB4IiRzcmMiID0geCBdCit0aGVuCisJZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCisJZXhpdCAxCitlbHNlCisJdHJ1ZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KKwlkc3Q9JHNyYworCXNyYz0iIgorCQorCWlmIFsgLWQgJGRzdCBdOyB0aGVuCisJCWluc3RjbWQ9OgorCQljaG1vZGNtZD0iIgorCWVsc2UKKwkJaW5zdGNtZD1ta2RpcgorCWZpCitlbHNlCisKKyMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAorIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKKyMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorCisJaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQorCXRoZW4KKwkJdHJ1ZQorCWVsc2UKKwkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCisJCWV4aXQgMQorCWZpCisJCisJaWYgWyB4IiRkc3QiID0geCBdCisJdGhlbgorCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCisJCWV4aXQgMQorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCisjIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKKworCWlmIFsgLWQgJGRzdCBdCisJdGhlbgorCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAorCWVsc2UKKwkJdHJ1ZQorCWZpCitmaQorCisjIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKK2RzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KKyMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAorCisjIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgoraWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCitkZWZhdWx0SUZTPScJCisnCitJRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgorCitvSUZTPSIke0lGU30iCisjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorSUZTPSclJworc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCitJRlM9IiR7b0lGU30iCisKK3BhdGhjb21wPScnCisKK3doaWxlIFsgJCMgLW5lIDAgXSA7IGRvCisJcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKKwlzaGlmdAorCisJaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7CisgICAgICAgIHRoZW4KKwkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCisJZWxzZQorCQl0cnVlCisJZmkKKworCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCitkb25lCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXQordGhlbgorCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKK2Vsc2UKKworIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCisKKwlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKKwkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQorCWZpCisKKyMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQorCisJaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisKKwlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKKworIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisKKwkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKKworCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgorCisjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKKworIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCisjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKworIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCisJJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKKwkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAorCitmaSAmJgorCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvaW50bC9DaGFuZ2VMb2cgYi9pbnRsL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ZmNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW50bC9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxMDIyIEBACisxOTk3LTA5LTA2IDAyOjEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogaW50bGguaW5zdC5pbjogUmVmb3JtYXQgY29weXJpZ2h0LgorCisxOTk3LTA4LTE5IDE1OjIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFJlbW92ZSB3cm9uZyBjb21tZW50LgorCisxOTk3LTA4LTE2IDAwOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IERvbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gaW5zdGFsbC4KKworMTk5Ny0wOC0wMSAxNDozMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGNhdC1jb21wYXQuYzogRml4IGNvcHlyaWdodC4KKworCSogbG9jYWxlYWxpYXMuYzogRG9uJ3QgZGVmaW5lIHN0cmNociB1bmxlc3MgIUhBVkVfU1RSQ0hSLgorCisJKiBsb2FkbXNnY2F0LmM6IFVwZGF0ZSBjb3B5cmlnaHQuICBGaXggdHlwb3MuCisKKwkqIGwxMG5mbGlzdC5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCisJKF9ubF9tYWtlX2wxMG5mbGlzdCk6IEhhbmRsZSBzcG9uc29yIGFuZCByZXZpc2lvbiBjb3JyZWN0bHkuCisKKwkqIGdldHRleHQuYzogVXBkYXRlIGNvcHlyaWdodC4KKwkqIGdldHRleHQuaDogTGlrZXdpc2UuCisJKiBoYXNoLXN0cmluZy5oOiBMaWtld2lzZS4KKworCSogZmluZGRvbWFpbi5jOiBSZW1vYXZlIGRlYWQgY29kZS4gIERlZmluZSBzdHJjaHIgb25seSBpZgorCSFIQVZFX1NUUkNIUi4KKworCSogZXhwbG9kZW5hbWUuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgorCisJKiBleHBsb2RlbmFtZS5jOiBSZWZvcm1hdCBjb3B5cmlnaHQgdGV4dC4KKwkoX25sX2V4cGxvZGVfbmFtZSk6IEZpeCB0eXBvLgorCisJKiBkY2dldHRleHQuYzogRGVmaW5lIGFuZCB1c2UgX19zZXRfZXJybm8uCisJKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgdXNlIHNldGxvY2FsZSBpZiBIQVZFX0xDX01FU1NBR0VTIGlzCisJbm90IGRlZmluZWQuCisKKwkqIGJpbmR0ZXh0ZG9tLmM6IFByZXR0eSBwcmludGluZy4KKworMTk5Ny0wNS0wMSAwMjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGRjZ2V0dGV4dC5jIChndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IGRlcGVuZCBvbgorCUhBVkVfTENfTUVTU0FHRVMuICBXZSBkb24ndCBuZWVkIHRoZSBtYWNybyBoZXJlLgorCVBhdGNoIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGlsb2cuZnI+LgorCisJKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOiBEb04ndCByZWZlciB0byBIQVZFX1NFVExPQ0FMRV9OVUxMCisJbWFjcm8uICBJbnN0ZWFkIHVzZSBIQVZFX0xPQ0FMRV9OVUxMIGFuZCBkZWZpbmUgaXQgd2hlbiB1c2luZworCWdsaWJjLCBhcyBpbiBkY2dldHRleHQuYy4KKwlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KKworCSogTWFrZWZpbGUuaW4gKENQUEZMQUdTKTogTmV3IHZhcmlhYmxlLiAgUmVwb3J0ZWQgYnkgRnJhbmMsb2lzCisJUGluYXJkLgorCitNb24gTWFyIDEwIDA2OjUxOjE3IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogSW1wbGVtZW50IGhhbmRsaW5nIG9mIGxpYnRvb2wuCisKKwkqIGdldHRleHRQLmg6IENoYW5nZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHVzZSBvZiBnZW5lcmljIGxvd2xldmVsCisJaTE4biBmaWxlIGhhbmRsaW5nLgorCitXZWQgRGVjICA0IDIwOjIxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiB0ZXh0ZG9tYWluLmM6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgYXJndW1lbnRzIG9mIG1lbWNweSBtYWNybworCWRlZmluaXRpb24uCisJKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KKwkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KKwkqIGZpbmRkb21haW4uYzogTGlrZXdpc2UuCisJKiBiaW5kdGV4dGRvbS5jOiBMaWtld2lzZS4KKwlSZXBvcnRlZCBieSBUaG9tYXMgRXNrZW4uCisKK01vbiBOb3YgMjUgMjI6NTc6NTEgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIHRleHRkb21haW4uYzogTW92ZSBkZWZpbml0aW9uIG9mIGBtZW1jcHlgIG1hY3JvIHRvIHJpZ2h0CisJcG9zaXRpb24uCisKK0ZyaSBOb3YgMjIgMDQ6MDE6NTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGZpbmRkb21haW4uYyBbIUhBVkVfU1RSSU5HX0ggJiYgIV9MSUJDXTogRGVmaW5lIG1lbWNweSB1c2luZworIAliY29weSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgorCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCisJKiBsMTBuZmxpc3QuYzogTGlrZXdpc2UuCisJKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KKwkqIHRleHRkb21haW4uYzogTGlrZXdpc2UuCisKK1R1ZSBPY3QgMjkgMTE6MTA6MjcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChsaWJkaXIpOiBDaGFuZ2UgdG8gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YKKyAJcHJlZml4LiAgUmVwb3J0ZWQgYnkgS251dC1I5XZhcmRBa3NuZXMgPGV0b2tuYUBldG8uZXJpY3Nzb24uc2U+LgorCitTYXQgQXVnIDMxIDAzOjA3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBsMTBuZmxpc3QuYyAoX25sX25vcm1hbGl6ZV9jb2Rlc2V0KTogV2UgY29udmVydCB0byBsb3dlciBjYXNlLAorCXNvIGRvbid0IHByZXBlbmQgdXBwZXJjYXNlIGBJU08nIGZvciBvbmx5IG51bWVyaWMgYXJnLgorCitGcmkgSnVsIDE5IDAwOjE1OjQ2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBsMTBuZmxpc3QuYzogTW92ZSBpbmNsdXNpb24gb2YgYXJnei5oLCBjdHlwZS5oLCBzdGRsaWIuaCBhZnRlcgorCWRlZmluaXRpb24gb2YgX0dOVV9TT1VSQ0UuICBQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KKworCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IEZpeCBhbm90aGVyIGJ1ZyB3aXRoIGBmb3InIGxvb3AgYW5kCisJZW1wdHkgYXJndW1lbnRzLiAgUGF0Y2ggYnkgSmltIE1leWVyaW5nLiAgQ29ycmVjdCBuYW1lIG9zCisJdW5pbnN0YWxsZWQgZmlsZXM6IG5vIGludGwtIHByZWZpeCBhbnltb3JlLgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogQWdhaW4gd29yayBhcm91bmQgc2hlbGxzIHdoaWNoCisJY2Fubm90IGhhbmRsZSBtcHR5IGZvciBsaXN0LiAgUmVwb3J0ZWQgYnkgSmltIE1leWVyaW5nLgorCitTYXQgSnVsIDEzIDE4OjExOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFNwbGl0IGdvYWwuICBOb3cgZGVwZW5kIG9uIGluc3RhbGwtZXhlYworICAgICAgICBhbmQgaW5zdGFsbC1kYXRhLgorCShpbnN0YWxsLWV4ZWMsIGluc3RhbGwtZGF0YSk6IE5ldyBnb2Fscy4gIENyZWF0ZWQgZnJvbSBmb3JtZXIKKwlpbnN0YWxsIGdvYWwuCisJUmVwb3J0ZWQgYnkgS2FybCBCZXJyeS4KKworU2F0IEp1biAyMiAwNDo1ODoxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE1LSU5TVEFMTERJUlMpOiBOZXcgdmFyaWFibGUuICBQYXRoIHRvCisgICAgICAgIG1raW5zdGFsbGRpcnMgc2NyaXB0LgorCShpbnN0YWxsKTogdXNlIE1LSU5TVEFMTERJUlMgdmFyaWFibGUgb3IgaWYgdGhlIHNjcmlwdCBpcyBub3QgcHJlc2VudAorCXRyeSB0byBmaW5kIGl0IGluIHRoZSAkdG9wX3NjcmRpcikuCisKK1dlZCBKdW4gMTkgMDI6NTY6NTYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+CisKKwkqIGwxMG5mbGlzdC5jOiBMaW51eCBsaWJjICpwYXJ0bHkqIGluY2x1ZGVzIHRoZSBhcmd6XyogZnVuY3Rpb25zLgorCUdyci4gIFdvcmsgYXJvdW5kIGJ5IHJlbmFtaW5nIHRoZSBzdGF0aWMgdmVyc2lvbiBhbmQgdXNlIG1hY3JvcworCWZvciByZW5hbWluZy4KKworVHVlIEp1biAxOCAyMDoxMToxNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgcHJlc2VuY2UgdGVzdCBtYWNyb3Mgb2YgX19hcmd6XyogZnVuY3Rpb25zLgorCisJKiBsMTBuZmxpc3QuYzogSW5jbHVkZSA8YXJnei5oPiBiYXNlZCBvbiB0ZXN0IG9mIGl0IGluc3RlYWQgd2hlbgorCV9fYXJnel8qIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLgorCVJlcG9ydGVkIGJ5IEFuZHJlYXMgU2Nod2FiLgorCitUaHUgSnVuIDEzIDE1OjE3OjQ0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBleHBsb2RlbmFtZS5jLCBsMTBuZmxpc3QuYzogRGVmaW5lIE5VTEwgZm9yIGR1bWIgc3lzdGVtcy4KKworVHVlIEp1biAxMSAxNzowNToxMyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oIChkY2dldHRleHQpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUKKwlyZXN1bHQgdG8gX19yZXN1bHQgdG8gcHJldmVudCBuYW1lIGNsYXNoLgorCisJKiBsMTBuZmxpc3QuYywgbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmM6IERlZmluZSBfR05VX1NPVVJDRSB0bworICAgICAgICBnZXQgcHJvdG90eXBlIGZvciBzdHBjcHkgYW5kIHN0cmNhc2VjbXAuCisKKwkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaDogTW92ZSBkZWNsYXJhdGlvbiBvZgorCWBfbmxfbXNnX2NhdF9jbnRyJyBvdXRzaWRlIF9fZXh0ZW5zaW9uX18gYmxvY2sgdG8gcHJldmVudCB3YXJuaW5nCisJZnJvbSBnY2MncyAtV25lc3RlZC1leHRlcm4gb3B0aW9uLgorCitGcmkgSnVuICA3IDAxOjU4OjAwIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSBjb21tZW50LgorCitUaHUgSnVuICA2IDE3OjI4OjE3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFdvcmsgYXJvdW5kIGZvciBhbm90aGVyIEJ1Z2xpeCBzdHVwaWRpdHkuCisJQWx3YXlzIHVzZSBhbiBgZWxzZScgY2xvc2UgZm9yIGBpZidzLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgorCisJKiBNYWtlZmlsZS5pbiAoaW50bGguaW5zdCk6IENvcnJlY3QgdHlwbyBpbiBwaG9ueSBydWxlLgorCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KKworVGh1IEp1biAgNiAwMTo0OTo1MiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogZGNnZXR0ZXh0LmMgKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJpYWJsZSBhbGxvY2FfbGlzdCB0bworCWJsb2NrX2xpc3QgYXMgdGhlIG1hY3JvIGNhbGxzIGFzc3VtZS4KKwlQYXRjaCBieSBFcmljIEJhY2t1cy4KKworCSogbG9jYWxlYWxpYXMuYyBbIUhBVkVfQUxMT0NBXTogRGVmaW5lIGFsbG9jYSBhcyBtYWNybyB1c2luZworICAgICAgICBtYWxsb2MuCisJKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJyaWFiZSBhbGxvY2FfbGlzdCB0byBibG9ja19saXN0IGFzIHRoZQorCW1hY3JvIGNhbGxzIGFzc3VtZS4KKwlQYXRjaCBieSBFcmljIEJhY2t1cy4KKworCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgY29uZGl0aW9uYWwgZm9yIDxhcmd6Lmg+IGluY2x1c2lvbi4KKwlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KKworCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQCwgbm90CisgICAgICAgIGFsbC1AVVNFX05MU0AuCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaW50bGguaW5zdCBjb21lcyBmcm9tIGxvY2FsIGRpciwgbm90CisgICAgICAgICQoc3JjZGlyKS4KKworCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBTcGVjaWFsIGhhbmRsaW5nIG9mIHRoaXMgZ29hbC4gIElmCisJdXNlZCBpbiBnZXR0ZXh0LCB0aGlzIGlzIHJlYWxseSBhIHJ1bCB0byBjb25zdHJ1Y3QgdGhpcyBmaWxlLiAgSWYKKwl1c2VkIGluIGFueSBvdGhlciBwYWNrYWdlIGl0IGlzIGRlZmluZWQgYXMgYSAuUEhPTlkgcnVsZSB3aXRoCisJZW1wdHkgYm9keS4KKworCSogZmluZGRvbWFpbi5jOiBFeHRyYWN0IGxvY2FsZSBmaWxlIGluZm9ybWF0aW9uIGhhbmRsaW5nIGludG8KKwlsMTBuZmlsZS5jLiAgUmVuYW1lIGxvY2FsIHN0cGNweV9fIGZ1bmN0aW9uIHRvIHN0cGNweS4KKworCSogZGNnZXR0ZXh0LmMgKHN0cGNweSk6IEFkZCBsb2NhbCBkZWZpbml0aW9uLgorCisJKiBsMTBuZmxpc3QuYzogU29sdmUgc29tZSBwb3J0YWJpbGl0eSBwcm9ibGVtcy4gIFBhdGNoZXMgcGFydGx5IGJ5CisJVGhvbWFzIEVza2VuLiAgQWRkIGxvY2FsIGRlZmluaXRpb24gb2Ygc3RwY3B5LgorCitUdWUgSnVuICA0IDAyOjQ3OjQ5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBpbnRsaC5pbnN0LmluOiBEb24ndCBkZXBlbmQgaW5jbHVkaW5nIDxsb2NhbGUuaD4gb24KKwlIQVZFX0xPQ0FMRV9ILiAgSW5zdGVhZCBjb25maWd1cmUgbXVzdCByZXdyaXRlIHRoaXMgZmlpbGUKKwlkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgY29uZmlndXJlIHJ1bi4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBsaWJpbnRsLmluc3QgaXMgbm93IGNhbGxlZCBpbnRsaC5pbnN0LgorCUFkZCBydWxlcyBmb3IgdXBkYXRpbmcgaW50bGguaW5zdCBmcm9tIGludGxoLmluc3QuaW4uCisKKwkqIGxpYmludGwuaW5zdDogUmVuYW1lZCB0byBpbnRsaC5pbnN0LmluLgorCisJKiBsb2NhbGVhbGlhcy5jLCBkY2dldHRleHQuYyBbX19HTlVDX19dOiBEZWZpbmUgSEFWRV9BTExPQ0EgdG8gMQorICAgICAgICBiZWNhdXNlIGdjYyBoYXMgX19idWl0bGluX2FsbG9jYS4KKwlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KKworTW9uIEp1biAgMyAwMDozMjoxNiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGxjaGVjayk6IE5ldyBnb2FsIHRvIGZ1bGZpbGwgbmVlZHMgb2YKKyAgICAgICAgYXV0b21ha2UncyBkaXN0Y2hlY2suCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVvcmRlciBjb21tYW5kcyBzbyB0aGF0IFZFUlNJT04gaXMKKyAgICAgICAgZm91bmQuCisKKwkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKTogTm93IHVzZSBzdWJkaXJlY3RvcnkgaW50bC8gaW4KKyAgICAgICAgQGRhdGFkaXJAL2dldHRleHQuCisJKENPTVNSQ1MpOiBBZGQgbDEwbmZpbGUuYy4KKwkoT0JKRUNUUyk6IEFkZCBsMTBuZmlsZS5vLgorCShESVNURklMRVMpOiBSZW5hbWUgdG8gRElTVEZJTEUubm9ybWFsLiAgUmVtb3ZlICQoRElTVEZJTEVTLmNvbW1vbikuCisJKERJU1RGSUxFLmdldHRleHQpOiBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KKwkoYWxsLWdldHRleHQpOiBSZW1vdmUgZ29hbC4KKwkoaW5zdGFsbCk6IElmICQoUEFDS0FHRSkgPSBnZXR0ZXh0IGluc3RhbGwsIG90aGVyd29zZSBkbyBub3RoaW5nLiAgTm8KKwlwYWNrYWdlIGJ1dCBnZXR0ZXh0IGl0c2VsZiBzaG91bGQgaW5zdGFsbCBsaWJpbnRsLmggKyBoZWFkZXJzLgorCShkaXN0KTogRXh0ZW5kIGdvYWwgdG8gd29yayBmb3IgZ2V0dGV4dCwgdG9vLgorCShkaXN0LWdldHRleHQpOiBSZW1vdmUgZ29hbC4KKworCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBtYWNybyBhbGxvY2EgYnkgdXNpbmcgbWFsbG9jLgorCitTdW4gSnVuICAyIDE3OjMzOjA2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFBhcmFtZXRlciBpcyBub3cgY29tZXMgZnJvbQorICAgICAgICBmaW5kX2wxMG5maWxlLgorCitTYXQgSnVuICAxIDAyOjIzOjAzIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBsMTBuZmxpc3QuYyAoX19hcmd6X25leHQpOiBBZGQgZGVmaW5pdGlvbi4KKworCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nIGFsbG9jYQorCWNvZGUuICBVc2UgbmV3IGwxMG5maWxlIGhhbmRsaW5nLgorCisJKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZworICAgICAgICBhbGxvY2EgY29kZS4KKworCSogbDEwbmZsaXN0LmM6IEluaXRpYWwgcmV2aXNpb24uCisKK1R1ZSBBcHIgIDIgMTg6NTE6MTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0KTogTmV3IGdvYWwuICBTYW1lIGFzIGFsbC15ZXMuCisKK1RodSBNYXIgMjggMjM6MDE6MjIgMTk5NiAgS2FybCBFaWNod2FsZGVyICA8a2VAa2UuY2VudHJhbC5kZT4KKworCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOiBEZWZpbmUgdXNpbmcgQGRhdGFkaXJALgorCitUdWUgTWFyIDI2IDEyOjM5OjE0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGZpbmRkb21haW4uYzogSW5jbHVkZSA8Y3R5cGUuaD4uICBSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KKworU2F0IE1hciAyMyAwMjowMDozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6IFJlbmFtZSB0byBzdHBjcHlfXyB0byBwcmV2ZW50IGNsYXNoaW5nCisgICAgICAgIHdpdGggZXh0ZXJuYWwgZGVjbGFyYXRpb24uCisKK1NhdCBNYXIgIDIgMDA6NDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKGFsbC1ubyk6IFJlbmFtZSBmcm9tIGFsbF9uby4KKworU2F0IEZlYiAxNyAwMDoyNTo1OSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBnZXR0ZXh0UC5oIFtsb2FkZWRfZG9tYWluXTogQXJyYXkgYHN1Y2Nlc3NvcicgbXVzdCBub3cgY29udGFpbiB1cAorICAgICAgICB0byA2MyBlbGVtZW50cyAoYmVjYXVzZSBvZiBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbikuCisKKwkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uLgorCitUaHUgRmViIDE1IDA0OjM5OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChhbGwpOiBEZWZpbmUgdG8gYGFsbC1AVVNFX05MU0AnLgorCShhbGwteWVzLCBhbGxfbm8pOiBOZXcgZ29hbHMuICBgYWxsLW5vJyBpcyBub29wLCBgYWxsLXllcycKKwlpcyBmb3JtZXIgYWxsLgorCitNb24gSmFuIDE1IDIxOjQ2OjAxIDE5OTYgIEhvd2FyZCBHYXlsZSAgPGhvd2FyZEBoYWwuY29tPgorCisJKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKTogSW5jcmVtZW50IHN0cmluZyBwb2ludGVycyBpbiBsb29wCisgICAgICAgIG9mIHN0cmNhc2VjbXAgcmVwbGFjZW1lbnQuCisKK0ZyaSBEZWMgMjkgMjE6MTY6MzQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogV2hvIGNvbW1lbnRlZCB0aGlzIGdvYWwgb3V0ID8gOi0pCisKK0ZyaSBEZWMgMjkgMTU6MDg6MTYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFNhdmUgYGVycm5vJy4gIEZhaWxpbmcgc3lzdGVtIGNhbGxzCisJc2hvdWxkIG5vdCBlZmZlY3QgaXQgYmVjYXVzZSBhIG1pc3NpbmcgY2F0YWxvZyBpcyBubyBlcnJvci4KKwlSZXBvcnRlZCBieSBIYXJhbGQgSzxvOj5uaWcgPGtvZW5pZ0B0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGU+LgorCitUdWUgRGVjIDE5IDIyOjA5OjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEV4cGxpY2l0bHkgdXNlICQoU0hFTEwpIGZvciBydW5uaW5nCisgICAgICAgIHNoZWxsIHNjcmlwdHMuCisKK0ZyaSBEZWMgMTUgMTc6MzQ6NTkgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IE9ubHkgaW5zdGFsbCBsaWJyYXJ5IGFuZCBoZWFkZXIgd2hlbgorCXdlIHVzZSB0aGUgb3duIGltcGxlbWVudGF0aW9uLiAgRG9uJ3QgZG8gaXQgd2hlbiB1c2luZyB0aGUKKwlzeXN0ZW0ncyBnZXR0ZXh0IG9yIGNhdGdldHMgZnVuY3Rpb25zLgorCisJKiBkY2dldHRleHQuYyAoZmluZF9tc2cpOiBNdXN0IG5vdCBzd2FwIGRvbWFpbi0+aGFzaF9zaXplIGhlcmUuCisKK1NhdCBEZWMgIDkgMTY6MjQ6MzcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbG9jYWxlYWxpYXMuYywgbGliaW50bC5pbnN0LCBsaWJnZXR0ZXh0LmgsIGhhc2gtc3RyaW5nLmgsCisJZ2V0dGV4dFAuaCwgZmluZGRvbWFpbi5jLCBkY2dldHRleHQuYywgY2F0LWNvbXBhdC5jOgorCVVzZSBQQVJBTVMgaW5zdGVhZCBvZiBfX1AuICBTdWdnZXN0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCisKK1R1ZSBEZWMgIDUgMTE6Mzk6MTQgMTk5NSAgTGFycnkgU2Nod2ltbWVyICA8cm9zZWJ1ZEBjeWNsb25lLnN0YW5mb3JkLmVkdT4KKworCSogbGliZ2V0dGV4dC5oOiBVc2UgYCNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCknIGluc3RlYWQgb2YgYCNpZgorCSFfTElCSU5UTF9IJyBiZWNhdXNlIFNvbGFyaXMgZGVmaW5lcyBfTElCSU5UTF9IIGFzIGVtcHR5LgorCitNb24gRGVjICA0IDE1OjQyOjA3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6CisJSW5zdGFsbCBsaWJpbnRsLmluc3QgaW5zdGVhZCBvZiBsaWJpbnRsLmguaW5zdGFsbC4KKworU2F0IERlYyAgMiAyMjo1MTozOCAxOTk1ICBNYXJjdXMgRGFuaWVscyAgPG1hcmN1c0BzeXNjLnBkeC5lZHU+CisKKwkqIGNhdC1jb21wYXQuYyAodGV4dGRvbWFpbik6CisJUmV2ZXJzZSBvcmRlciBpbiB3aGljaCBmaWxlcyBhcmUgdHJpZWQgeW91IGxvYWQuICBGaXJzdAorCXRyeSBsb2NhbCBmaWxlLCB3aGVuIHRoaXMgZmFpbGVkIGFic29sdXRlIHBhdGguCisKK1dlZCBOb3YgMjkgMDI6MDM6NTMgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KKworCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6IEFkZCBtaXNzaW5nIHsgfS4KKworU3VuIE5vdiAyNiAxODoyMTo0MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBsaWJpbnRsLmluc3Q6IEFkZCBtaXNzaW5nIF9fUCBkZWZpbml0aW9uLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgorCisJKiBNYWtlZmlsZS5pbjoKKwlBZGQgZHVtbXkgYGFsbCcgYW5kIGBkdmknIGdvYWxzLiAgUmVwb3J0ZWQgYnkgVG9tIFRyb21leS4KKworU2F0IE5vdiAyNSAxNjoxMjowMSAxOTk1ICBGcmFuYyxvaXMgUGluYXJkICA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+CisKKwkqIGhhc2gtc3RyaW5nLmg6IENhcGl0YWxpemUgYXJndW1lbnRzIG9mIG1hY3Jvcy4KKworU2F0IE5vdiAyNSAxMjowMTozNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogUHJldmVudCBmaWxlcyBuYW1lcyBsb25nZXIgdGhhbiAxMworCWNoYXJhY3RlcnMuICBsaWJpbnRsLmguZ2xpYmMtPmxpYmludGwuZ2xpYmMsCisJbGliaW50bC5oLmluc3RhbGwtPmxpYmludGwuaW5zdC4gIFJlcG9ydGVkIGJ5IEpvc2h1YSBSLiBQb3Vsc29uLgorCitTYXQgTm92IDI1IDExOjMxOjEyIDE5OTUgIEVyaWMgQmFja3VzICA8ZXJpY2JAbHNpZC5ocC5jb20+CisKKwkqIGRjZ2V0dGV4dC5jOiBGaXggYnVnIGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCisKK1NhdCBOb3YgMjUgMDI6MzU6MjcgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KKworCSogbGliZ2V0dGV4dC5oOiBTb2xhcmlzIGNjIGRvZXMgbm90IHVuZGVyc3RhbmQKKwkgI2lmICFTWU1CT0wxICYmICFTWU1CT0wyLiAgU2FkCWJ1dCB0cnVlLgorCitUaHUgTm92IDIzIDE2OjIyOjE0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKToKKwlGaXggZm9yIG1hY2hpbmUgd2l0aCA+MzIgYml0IGB1bnNpZ25lZCBsb25nJ3MuCisKKwkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOgorCUZpeCBob3JyaWJsZSBidWcgaW4gbG9vcCBmb3IgYWx0ZXJuYXRpdmUgdHJhbnNsYXRpb24uCisKK1RodSBOb3YgMjMgMDE6NDU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogcG8ydGJsLnNlZC5pbiwgbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKKwlTb21lIGZ1cnRoZXIgc2ltcGxpZmljYXRpb25zIGluIG1lc3NhZ2UgbnVtYmVyIGdlbmVyYXRpb24uCisKK01vbiBOb3YgMjAgMjE6MDg6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbGliaW50bC5oLmdsaWJjOiBVc2UgX19jb25zdCBpbnN0ZWFkIG9mIGNvbnN0IGluIHByb3RvdHlwZXMuCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6CisJSW5zdGFsbCBsaWJpbnRsLmguaW5zdGFsbCBpbnN0ZWFkIG9mIGxpYmludGwuaC4gIFRoaXMKKwlpcyBhIHN0cmlwcGVkLWRvd24gdmVyc2lvbi4gIFN1Z2dlc3RlZCBieSBQZXRlciBNaWxsZXIuCisKKwkqIGxpYmludGwuaC5pbnN0YWxsLCBsaWJpbnRsLmguZ2xpYmM6IEluaXRpYWwgcmV2aXNpb24uCisKKwkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMsIHJlYWRfYWxpYXNfZmlsZSk6CisJUHJvdGVjdCBwcm90b3R5cGVzIGluIHR5cGUgY2FzdHMgYnkgX19QLgorCitUdWUgTm92IDE0IDE2OjQzOjU4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGhhc2gtc3RyaW5nLmg6IENvcnJlY3QgcHJvdG90eXBlIGZvciBoYXNoX3N0cmluZy4KKworU3VuIE5vdiAxMiAxMjo0MjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6IEFkZCBwcm90b3R5cGUuCisKKwkqIGdldHRleHRQLmg6IEZpeCBjb3B5cmlnaHQuCisJKFNXQVApOiBBZGQgcHJvdG90eXBlLgorCitXZWQgTm92ICA4IDIyOjU2OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6IEZvcmdvdCBzaXplb2YuCisJQXZvaWQgY2FsbGluZyAqcHJpbnRmIGZ1bmN0aW9uLiAgVGhpcyBpbnRyb2R1Y2VzIGEgYmlnIG92ZXJoZWFkLgorCVBhdGNoIGJ5IFJvbGFuZCBNY0dyYXRoLgorCitUdWUgTm92ICA3IDE0OjIxOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGZpbmRkb21haW4uYywgY2F0LWNvbXBhdC5jOiBXcm9uZyBpbmRlbnRhdGlvbiBpbiAjaWYgZm9yIHN0cGNweS4KKworCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOgorCURlZmluZSBzdWJzdGl0dXRpb24gZnVuY3Rpb24gbG9jYWwuICBUaGUgbWFjcm8gd2FzIHRvIGZsYWt5LgorCisJKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvLgorCisJKiB4b3Blbi1tc2cuc2VkLCBsaW51eC1tc2cuc2VkOgorCVdoaWxlIGJyaW5naW5nIG1lc3NhZ2UgbnVtYmVyIHRvIHJpZ2h0IHBsYWNlIG9ubHkgYWNjZXB0IGRpZ2l0cy4KKworCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogTm93IHRoYXQgdGhlIGNvdW50ZXIgZG9lcyBub3QgaGF2ZQorCWxlYWRpbmcgMHMgd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgdGhlbS4gIFJlcG9ydGVkIGJ5IE1hcmN1cworCURhbmllbHMuCisKKwkqIE1ha2VmaWxlLmluICguLi9wby9jYXQtaWQtdGJsLm8pOiBVc2UgJCh0b3Bfc3JkaXIpIGluCisJZGVwZW5kZW5jeS4gIFJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgorCisJKiBjYXQtY29tcGF0LmM6IChzdHBjcHkpIFshX0xJQkMgJiYgIUhBVkVfU1RQQ1BZXTogRGVmaW5lIHJlcGxhY2VtZW50LgorCUdlbmVyYWxseSBjbGVhbnVwIHVzaW5nICNpZiBpbnN0ZWFkIG9mICNpZm5kZWYuCisKKwkqIE1ha2VmaWxlLmluOiBDb3JyZWN0IHR5cG9zIGluIGNvbW1lbnQuICBCeSBGcmFuYyxvaXMgUGluYXJkLgorCitNb24gTm92ICA2IDAwOjI3OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IERvbid0IGluc3RhbGwgbGliaW50bC5oIGFuZCBsaWJpbnRsLmEKKwlpZiB3ZSB1c2UgYW4gYXZhaWxhYmxlIGdldHRleHQgaW1wbGVtZW50YXRpb24uCisKK1N1biBOb3YgIDUgMjI6MDI6MDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbGliZ2V0dGV4dC5oOiBGaXggdHlwbzogSEFWRV9DQVRHRVRUUyAtPiBIQVZFX0NBVEdFVFMuICBSZXBvcnRlZAorCWJ5IEZyYW5jLG9pcyBQaW5hcmQuCisKKwkqIGxpYmdldHRleHQuaDogVXNlICNpZiBpbnN0ZWFkIG9mICNpZmRlZi8jaWZuZGVmLgorCisJKiBmaW5kZG9tYWluLmM6CisJQ29tbWVudHMgZGVzY3JpYmluZyB3aGF0IGhhcyB0byBiZSBkb25lIHNob3VsZCBzdGFydCB3aXRoIEZJWE1FLgorCitTdW4gTm92ICA1IDE5OjM4OjAxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBTcGxpdC4gIFVzZSBESVNURklMRVMgd2l0aCBub3JtYWwgbWVhbmluZy4KKwlESVNURklMRVMuY29tbW9uIG5hbWVzIHRoZSBmaWxlcyBjb21tb24gdG8gYm90aCBkaXN0IGdvYWxzLgorCURJU1RGSUxFUy5nZXR0ZXh0IGFyZSB0aGUgZmlsZXMgb25seSBkaXN0cmlidXRlZCBpbiBHTlUgZ2V0dGV4dC4KKworU3VuIE5vdiAgNSAxNzozMjo1NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogQ29ycmVjdCBzZWFyY2hpbmcgaW4gZGVyaXZlZCBsb2NhbGVzLgorCVRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSBhIGNoYW5nZSBpbiBfbmxfZmluZF9tc2cgc2V2ZXJhbCB3ZWVrcworCWFnby4gIEkgcmVhbGx5IGRvbid0IGtub3cgdGhpcyBpcyBzdGlsbCBub3QgZml4ZWQuCisKK1N1biBOb3YgIDUgMTI6NDM6MTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOiBUZXN0IGZvciBGSUxFTkFNRSA9PSBOVUxMLiAgVGhpcworCW1pZ2h0IG1hcmsgYSBzcGVjaWFsIGNvbmRpdGlvbi4KKworCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6IERvbid0IG1ha2UgaWxsZWdhbCBlbnRyeSBhcyBkZWNpZGVkLgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFN1cHByZXNzIGVycm9yIG1lc3NhZ2Ugd2hlbiBsbiBmYWlsZWQuCisJR2V0IGZpbGVzIGZyb20gJChzcmNkaXIpIGV4cGxpY2l0bHkuCisKKwkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IFJlbmFtZSB0byBnZXR0ZXh0X25vb3AuCisKK0ZyaSBOb3YgIDMgMDc6MzY6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6CisJUHJvdGVjdCBhZ2FpbnN0IHdyb25nIGxvY2FsZSBuYW1lcyBieSB0ZXN0aW5nIG1hc2suCisKKwkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IEFkZCBtYWNybyBkZWZpbml0aW9uLgorCUNhcGl0YWxpemUgbWFjcm8gYXJndW1lbnRzLgorCitUaHUgTm92ICAyIDIzOjE1OjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKKwlUZXN0IGZvciBwb2ludGVyICE9IE5VTEwgYmVmb3JlIGFjY2Vzc2luZyB2YWx1ZS4KKwlSZXBvcnRlZCBieSBUb20gVHJvbWV5LgorCisJKiBnZXR0ZXh0LmMgKE5VTEwpOgorCURlZmluZSBhcyAodm9pZCopMCBpbnN0YWQgb2YgMC4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcyBQaW5hcmQuCisKK01vbiBPY3QgMzAgMjE6Mjg6NTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogcG8ydGJsLnNlZC5pbjogU2VyaW91cyB0eXBvIGJ1ZyBmaXhlZCBieSBKaW0gTWV5ZXJpbmcuCisKK1NhdCBPY3QgMjggMjM6MjA6NDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbGliZ2V0dGV4dC5oOiBEaXNhYmxlIGRjZ2V0dGV4dCBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLgorCisJKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKKwlQZXRlciBNaWxsZXIgcmVwb3J0ZWQgdGhhdCB0b2xvd2VyIGluIHNvbWUgc3lzdGVtcyBpcworCWV2ZW4gZHVtYmVyIHRoYW4gSSB0aG91Z2h0LiAgUHJvdGVjdCBjYWxsIGJ5IGBpc3VwcGVyJy4KKworRnJpIE9jdCAyNyAyMjoyMjo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAobGliZGlyLCBpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KKwkoaW5zdGFsbC1zcmMpOiBJbnN0YWxsIGxpYmludGwuYSBhbmQgbGliaW50bC5oIGluIGNvcnJlY3QgZGlycy4KKworRnJpIE9jdCAyNyAyMjowNzoyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEZpeCB0eXBvOiBpbnRybC5jb21wYXQuYyAtPiBpbnRsLWNvbXBhdC5jLgorCisJKiBwbzJ0Ymwuc2VkLmluOiBQYXRjaCBmb3IgYnVnZ3kgU0VEcyBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KKworCSogbG9jYWxlYWxpYXMuYzoKKwlGaXggdHlwbyBhbmQgc3VwZXJmbG91cyB0ZXN0LiAgUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCisKK0ZyaSBPY3QgIDYgMTE6NTI6MDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgorCUNvcnJlY3Qgc29tZSByZW1haW5kZXIgZnJvbSB0aGUgcHJlLUNFTiBzeW50YXguICBOb3cKKwl3ZSBkb24ndCBoYXZlIGEgY29uc3RhbnQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgYW55bW9yZS4KKworV2VkIFNlcCAyNyAyMTo0MToxMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogQWRkIGxpYmludGwuaC5nbGliYy4KKworCSogTWFrZWZpbGUuaW4gKGRpc3QtbGliYyk6IEFkZCBnb2FsIGZvciBwYWNraW5nIHNvdXJjZXMgZm9yIGdsaWJjLgorCShDT01TUkNTLCBDT01IRFJTKTogU3BsaXR0ZWQgdG8gc2VwYXJhdGUgc291cmNlcyBzaGFyZWQgd2l0aCBnbGliYy4KKworCSogbG9hZG1zZ2NhdC5jOiBGb3JnZXQgdG8gY29udGludWUgI2lmIGxpbmUuCisKKwkqIGxvY2FsZWFsaWFzLmM6CisJW19MSUJDXTogUmVuYW1lIHN0cmNhc2VjbXAgdG8gX19zdHJjYXNlY21wIHRvIGtlZXAgQU5TSSBDIG5hbWUKKwlzcGFjZSBjbGVhbi4KKworCSogZGNnZXR0ZXh0LmMsIGZpbmRkb21haW4uYzogQmV0dGVyIGNvbW1lbnQgdG8gbGFzdCBjaGFuZ2UuCisKKwkqIGxvYWRtc2djYXQuYzoKKwlbX0xJQkNdOiBSZW5hbWUgZnN0YXQsIG9wZW4sIGNsb3NlLCByZWFkLCBtbWFwLCBhbmQgbXVubWFwIHRvCisJX19mc3RhdCwgX19vcGVuLCBfX2Nsb3NlLCBfX3JlYWQsIF9fbW1hcCwgYW5kIF9fbXVubWFwIHJlc3AKKwl0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgorCisJKiBmaW5kZG9tYWluLmM6CisJW19MSUJDXTogUmVuYW1lIHN0cGNweSB0byBfX3N0cGNweSB0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgorCisJKiBkY2dldHRleHQuYzoKKwlbX0xJQkNdOiBSZW5hbWUgZ2V0Y2VkIGFuZCBzdHBjcHkgdG8gX19nZXRjd2QgYW5kIF9fc3RwY3B5IHJlc3AgdG8KKwlrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgorCisJKiBsaWJnZXR0ZXh0Lmg6CisJSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgdGhvc2Ugb2xkIFN5c1Ygc3lzdGVtcyBvdXQgdGhlcmUuCisJUmVwb3J0ZWQgYnkgRnJhbmNlc2NvIFBvdG9ydGlgLgorCisJKiBsb2FkbXNnY2F0LmMgKHVzZV9tbWFwKTogRGVmaW5lIGlmIGNvbXBpbGVkIGZvciBnbGliYy4KKworCSogYmluZHRleHRkb20uYzogSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycworCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgorCisJKiBmaW5kZG9tYWluLmM6IEZpeCAyIHRpbWVzIGRlZmllbmQgLT4gZGVmaW5lZC4KKworCSogdGV4dGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCisJY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKKwl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KKworCSogbG9jYWxlYWxpYXMuYywgbG9hZG1zZ2NhdC5jOiBQcmVwYXJlIHRvIGJlIGNvbXBpbGVkIGluIGdsaWJjLgorCisJKiBnZXR0ZXh0LmM6CisJSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgorCUdldCBOVUxMIGZyb20gc3RkZGVmLmggaWYgd2UgY29tcGlsZSBmb3IgZ2xpYmMuCisKKwkqIGZpbmRkb21haW4uYzogSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbgorCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCisJdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCisKKwkqIGRjZ2V0dGV4dC5jOiBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzIHVuY29uZGl0aW9uYWxseQorCWlmIF9MSUJDIGlzIGRlZmluZWQuCisKKwkqIGRnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKKwlsaWJnZXR0ZXh0LmguCisJKGxvY2FsZS5oKTogRG9uJ3QgcmVseSBvbiBIQVZFX0xPQ0FMRV9IIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KKworCSogZGNnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKKwlsaWJnZXR0ZXh0LmguCisJKGdldGN3ZCk6IERvbid0IHJlbHkgb24gSEFWRV9HRVRDV0Qgd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgorCisJKiBiaW5kdGV4dGRvbS5jOgorCUlmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oLgorCitNb24gU2VwIDI1IDIyOjIzOjA2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMpOiBEb24ndCBjYWxsIGJzZWFyY2ggaWYgTk1BUCA8PSAwLgorCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgorCisJKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKKwlTdHJpbmcgdXNlZCBpbiBwdXRlbnYgbXVzdCBub3QgYmUgcmVjeWNsZWQuCisJUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCisKKwkqIGxpYmdldHRleHQuaCAoX19VU0VfR05VX0dFVFRFWFQpOgorCUFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSBHTlUgZ2V0dGV4dAorCWxpYnJhcnkuCisKKwkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgorCUZpeCBidWcgd2l0aCB0aGUgc3RyYW5nZSBzdHBjcHkgcmVwbGFjZW1lbnQuCisJUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgorCitTYXQgU2VwIDIzIDA4OjIzOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGNhdC1jb21wYXQuYzogSW5jbHVkZSA8c3RyaW5nLmg+IGZvciBzdHBjcHkgcHJvdG90eXBlLgorCisJKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgorCVdoaWxlIGV4cGFuZCBzdHJkdXAgY29kZSB0ZW1wb3JhcnkgdmFyaWFibGUgYGNwJyBoaWRlZAorCWhpZ2hlciBsZXZlbCB2YXJpYWJsZSB3aXRoIHNhbWUgbmFtZS4gIFJlbmFtZSB0byBgdHAnLgorCisJKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOgorCUF2b2lkIHdhcm5pbmcgYnkgdXNpbmcgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHN0cmR1cCBjb2RlLgorCisJKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGFwcGxpY2F0aW9uJy4KKworVGh1IFNlcCAyMSAxNTo1MTo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKKwlVc2Ugc3RyY2FzZWNtcCgpIG9ubHkgaWYgYXZhaWxhYmxlLiAgRWxzZSB1c2UKKwlpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZS4KKworCSogaW50bC1jb21wYXQuYzoKKwlXcmFwcGVyIGZ1bmN0aW9ucyBub3cgY2FsbCAqX18gZnVuY3Rpb25zIGluc3RlYWQgb2YgX18qLgorCisJKiBsaWJnZXR0ZXh0Lmg6IERlY2xhcmUgcHJvdG90eXBlcyBmb3IgKl9fIGZ1bmN0aW9ucyBpbnN0ZWFkIGZvciBfXyouCisKKwkqIGNhdC1jb21wYXQuYywgbG9hZG1zZ2NhdC5jOgorCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAorCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKKwlzdGFuZGFsb25lLgorCisJKiBiaW5kdGV4dGRvbS5jOgorCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAorCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKKwlzdGFuZGFsb25lLgorCVJlbmFtZSB0byBiaW5kdGV4dGRvbWFpbl9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCisKKwkqIGRnZXR0ZXh0LmM6CisJUmVuYW1lIGZ1bmN0aW9uIHRvIGRnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KKworCSogZ2V0dGV4dC5jOgorCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAorCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKKwlzdGFuZGFsb25lLgorCUZ1bmN0aW9ucyBub3cgY2FsbGVkIGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgorCisJKiBkY2dldHRleHQuYywgbG9jYWxlYWxpYXMuYywgdGV4dGRvbWFpbi5jLCBmaW5kZG9tYWluLmM6CisJRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0CisJb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAorCXN0YW5kYWxvbmUuCisKK1N1biBTZXAgMTcgMjM6MTQ6NDkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogZmluZGRvbWFpbi5jOiBDb3JyZWN0IHNvbWUgYnVncyBpbiBoYW5kbGluZyBvZiBDRU4gc3RhbmRhcmQKKyAJbG9jYWxlIGRlZmluaXRpb25zLgorCitUaHUgU2VwICA3IDAxOjQ5OjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IENFTiBzeW50YXguCisKKwkqIGdldHRleHRQLmggKGxvYWRlZF9kb21haW4pOiBFeHRlbmQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgdG8gMzEuCisKK1NhdCBBdWcgMTkgMTk6MjU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IFJlbW92ZSBwYXRoIHRvIFgxMSBsb2NhbGUgZGlyLgorCisJKiBNYWtlZmlsZS5pbjogTWFrZSBpbnN0YWxsLXNyYyBkZXBlbmQgb24gaW5zdGFsbC4gIFRoaXMgaGVscHMKKyAJZ2V0dGV4dCB0byBpbnN0YWxsIHRoZSBzb3VyY2VzIGFuZCBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRoZQorIAlpbnN0YWxsIGdvYWwuCisKK1NhdCBBdWcgMTkgMTU6MTk6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IFJlbW92ZSBzdHVmZiBpbnN0YWxsZWQgYnkgaW5zdGFsbC1zcmMuCisKK1R1ZSBBdWcgMTUgMTM6MTM6NTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogVkVSU0lPTi5pbjogSW5pdGlhbCByZXZpc2lvbi4KKworCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6CisJQWRkIFZFUlNJT04gZmlsZS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgZ2V0dGV4dCwgYnV0CisJZm9yIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoaXMgbGlicmFyeS4KKworVHVlIEF1ZyAxNSAwNjoxNjo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBnZXR0ZXh0UC5oIChfbmxfZmluZF9kb21haW4pOgorCU5ldyBwcm90b3R5cGUgYWZ0ZXIgY2hhbmdpbmcgc2VhcmNoIHN0cmF0ZWd5LgorCisJKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6CisJV2Ugbm93IHRyeSBvbmx5IHRvIGZpbmQgYSBzcGVjaWZpZWQgY2F0YWxvZy4gIEZhbGwgYmFjayB0byBvdGhlcgorCWNhdGFsb2dzIGxpc3RlZCBpbiB0aGUgbG9jYWxlIGxpc3QgaXMgbm93IGRvbmUgaW4gX19kY2dldHRleHQuCisKKwkqIGRjZ2V0dGV4dC5jIChfX2RjZ2V0dGV4dCk6CisJTm93IHdlIHByb3ZpZGUgbWVzc2FnZSBmYWxsIGJhY2sgZXZlbiB0byBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgorCUkuZS4gaWYgYSBtZXNzYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gb25lIGxhbmd1YWdlIGFsbCB0aGUgb3RoZXIKKyAJaW4gdGhlIGxvY2FsZSBsaXN0IGEgdHJpZWQuICBGb3JtZXJseSBmYWxsIGJhY2sgd2FzIG9ubHkgcG9zc2libGUKKyAJd2l0aGluIG9uZSBsYW5ndWFnZS4gIEltcGxlbWVudGVkIGJ5IG1vdmluZyBvbmUgbG9vcCBmcm9tCisgCV9ubF9maW5kX2RvbWFpbiB0byBoZXJlLgorCitNb24gQXVnIDE0IDIzOjQ1OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKToKKwlEaXJlY3Rvcnkgd2hlcmUgc291cmNlIG9mIEdOVSBnZXR0ZXh0IGxpYnJhcnkgYXJlIG1hZGUKKwlhdmFpbGFibGUuCisJKElOU1RBTEwsIElOU1RBTExfREFUQSk6IFByb2dyYW1zIHVzZWQgZm9yIGluc3RhbGxpbmcgc291cmNlcy4KKwkoZ2V0dGV4dC1zcmMpOiBOZXcuICBSdWxlIHRvIGluc3RhbGwgR05VIGdldHRleHQgc291cmNlcyBmb3IgdXNlIGluCisJZ2V0dGV4dGl6ZSBzaGVsbCBzY3JpcHQuCisKK1N1biBBdWcgMTMgMTQ6NDA6NDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOgorCVVzZSBtbWFwIGZvciBsb2FkaW5nIG9ubHkgd2hlbiBtdW5tYXAgZnVuY3Rpb24gaXMKKwlhbHNvIGF2YWlsYWJsZS4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgb24gYGFsbCcgZ29hbC4KKworV2VkIEF1ZyAgOSAxMTowNDozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgorCURvIG5vdCBvdmVyd3JpdGUgJ1xuJyB3aGVuIHRlcm1pbmF0aW5nIGFsaWFzIHZhbHVlIHN0cmluZy4KKworCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKKwlIYW5kbGUgbG9uZyBsaW5lcy4gIElnbm9yZSB0aGUgcmVzdCBub3QgZml0dGluZyBpbgorCXRoZSBidWZmZXIgYWZ0ZXIgdGhlIGluaXRpYWwgYGZnZXRzJyBjYWxsLgorCitXZWQgQXVnICA5IDAwOjU0OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGdldHRleHRQLmggKF9ubF9sb2FkX2RvbWFpbik6CisJQWRkIHByb3RvdHlwZSwgcmVwbGFjaW5nIHByb3RvdHlwZSBmb3IgX25sX2xvYWRfbXNnX2NhdC4KKworCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgorCVJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZSBmaWxlbmFtZSBhbmQgZmlsZW5hbWVfbGVuLgorCShleHBhbmRfYWxpYXMpOiBSZW1vdmUgcHJvdG90eXBlIGJlY2F1c2UgZnVuY3Rpb25zIGRvZXMgbm90CisgCWV4aXN0IGFueW1vcmUuCisKKwkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6CisJQ2hhbmdlIHR5cGUgb2YgZm5hbWVfbGVuIHBhcmFtZXRlciB0byBpbnQuCisJKHhtYWxsb2MpOiBBZGQgcHJvdG90eXBlLgorCisJKiBsb2FkbXNnY2F0LmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jLgorCitUdWUgQXVnICA4IDIyOjMwOjM5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKKwlBbGxvdyBhbGlhcyBuYW1lIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGZvdXIgY29tcG9uZW50cy4KKworCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IE5ldyB2YXJpYWJsZS4gIFNldCB0byBwcmVsaW1pbmFyeSB2YWx1ZS4KKwkoU09VUkNFUyk6IEFkZCBsb2NhbGVhbGlhcy5jLgorCShPQkpFQ1RTKTogQWRkIGxvY2FsZWFsaWFzLm8uCisKKwkqIGdldHRleHRQLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9ubF9leHBhbmRfYWxpYXMuCisKKwkqIGZpbmRkb21haW4uYzogQWxpYXNpbmcgaGFuZGxlZCBpbiBpbnRsL2xvY2FsZWFsaWFzLmMuCisKKwkqIGxvY2FsZWFsaWFzLmM6IEFsaWFzaW5nIGZvciBsb2NhbGUgbmFtZXMuCisKKwkqIGJpbmR0ZXh0ZG9tLmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jIGFuZCB4c3RyZHVwLgorCitNb24gQXVnICA3IDIzOjQ3OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBnZXR0ZXh0LnBlcmwgaXMgbm93IGZvdW5kIGluIG1pc2MvLgorCisJKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKKwlDb3JyZWN0IGltcGxlbWVudGF0aW9uLiAgZGlybmFtZSBwYXJhbWV0ZXIgd2FzIG5vdCB1c2VkLgorCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgorCisJKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKToKKwlOZXcgZmllbGRzIGBzdWNjZXNzb3InIGFuZCBgZGVjaWRlZCcgZm9yIG9vLCBsYXp5CisJbWVzc2FnZSBoYW5kbGluZyBpbXBsZW1lbnRhdGlvbi4KKworCSogZGNnZXR0ZXh0LmM6CisJQWRvcHQgZm9yIG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpaW5nLgorICAJTm93IHdlIGNhbiBpbmhlcml0IHRyYW5zbGF0aW9ucyBmcm9tIGxlc3Mgc3BlY2lmaWMgbG9jYWxlcy4KKwkoZmluZF9tc2cpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGxvYWRtc2djYXQuYywgZmluZGRvbWFpbi5jOgorCUNvbXBsZXRlIHJld3JpdGUuICBJbXBsZW1lbnQgb28sIGxhenkgbWVzc2FnZSBoYW5kbGluZyA6LSkuCisgIAlXZSBub3cgaGF2ZSBhbiBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlIGBMQU5HVUFHRScgd2l0aAorIAlhIGhpZ2hlciBwcmlvcml0eSB0aGFuIExDX0FMTCBmb3IgdGhlIExDX01FU1NBR0UgbG9jYWxlLgorICAJSGVyZSB3ZSBjYW4gc2V0IGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2Ygc3BlY2lmaWNhdGlvbnMgZWFjaAorIAlvZiB0aGUgZm9ybSBgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0nLgorCitTYXQgQXVnICA1IDA5OjU1OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGZpbmRkb21haW4uYyAodW5pc3RkLmgpOgorCUluY2x1ZGUgdG8gZ2V0IF9QQ19QQVRIX01BWCBkZWZpbmVkIG9uIHN5c3RlbSBoYXZpbmcgaXQuCisKK0ZyaSBBdWcgIDQgMjI6NDI6MDAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBJbmNsdWRlIHByb3RvdHlwZS4KKworCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBSZW1vdmUgYGNvcHlpbmcgaW5zdGVhZCcgbWVzc2FnZS4KKworV2VkIEF1ZyAgMiAxODo1MjowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAoSUQsIFRBR1MpOiBEbyBub3QgdXNlICReLgorCitUdWUgQXVnICAxIDIwOjA3OjExIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChUQUdTLCBJRCk6IFVzZSAkXiBhcyBjb21tYW5kIGFyZ3VtZW50LgorCShUQUdTKTogR2l2ZSBldGFncyAtbyBvcHRpb24gdCB3cml0ZSB0byBjdXJyZW50IGRpcmVjdG9yeSwKKyAJbm90ICQoc3JjZGlyKS4KKwkoSUQpOiBVc2UgJChzcmNkaXIpIGluc3RlYWQgb3MgJCh0b3Bfc3JjZGlyKS9zcmMuCisJKGRpc3RjbGVhbik6IFJlbW92ZSBJRC4KKworU3VuIEp1bCAzMCAxMTo1MTo0NiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAoZ251bG9jYWxlZGlyKToKKwlOZXcgdmFyaWFibGUsIGFsd2F5cyB1c2luZyBzaGFyZS8gZm9yIGRhdGEgZGlyZWN0b3J5LgorCShERUZTKTogQWRkIEdOVUxPQ0FMRURJUiwgdXNlZCBpbiBmaW5kZG9tYWluLmMuCisKKwkqIGZpbmRkb21haW4uYyAoX25sX2RlZmF1bHRfZGlybmFtZSk6CisJU2V0IHRvIEdOVUxPQ0FMRURJUiwgYmVjYXVzZSBpdCBhbHdheXMgaGFzIHRvIHBvaW50CisJdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBHTlUgZ2V0dGV4dCBMaWJyYXJ5IHdyaXRlcyBpdCB0by4KKworCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOgorCVVuZGVmaW5lIG1hY3JvcyBiZWZvcmUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKworU2F0IEp1bCAyMiAwMToxMDowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBsaWJnZXR0ZXh0LmggKF9MSUJJTlRMX0gpOgorCVByb3RlY3QgZGVmaW5pdGlvbiBpbiBjYXNlIHdoZXJlIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBhcworCWxpYmdldHRleHQuaCBvbiBTb2xhcmlzIG1hY2hpbmVzLiAgQWRkIGNvbW1lbnQgYWJvdXQgdGhpcy4KKworV2VkIEp1bCAxOSAwMjozNjo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluKTogQ29ycmVjdCB0eXBvLgorCitXZWQgSnVsIDE5IDAxOjUxOjM1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGRjZ2V0dGV4dC5jIChkY2dldHRleHQpOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fZGNnZXR0ZXh0LgorCisJKiBkZ2V0dGV4dC5jIChkZ2V0dGV4dCk6IE5vdyBjYWxsZWQgX19kZ2V0dGV4dCBhbmQgY2FsbHMKKyAJX19kY2dldHRleHQuCisKKwkqIGdldHRleHQuYyAoZ2V0dGV4dCk6CisJRnVuY3Rpb24gbm93IGNhbGxlZCBfX2dldHRleHQgYW5kIGNhbGxzIF9fZGdldHRleHQuCisKKwkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX190ZXh0ZG9tYWluLgorCisJKiBiaW5kdGV4dGRvbS5jIChiaW5kdGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQKKyAJX19iaW5kdGV4dGRvbWFpbi4KKworCSogaW50bC1jb21wYXQuYzogSW5pdGlhbCByZXZpc2lvbi4KKworCSogTWFrZWZpbGUuaW4gKFNPVVJDRVMpOiBBZGQgaW50bC1jb21wYXQuYy4KKwkoT0JKRUNUUyk6IFdlIGFsd2F5cyBjb21waWxlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAgCU9CSkVDVFMgY29udGFpbnMgYWxsIG9iamVjdHMgYnV0IGNhdC1jb21wYXQubywgLi4vcG8vY2F0LWlmLXRibC5vLAorIAlhbmQgaW50bC1jb21wYXQuby4KKyAgCShHRVRUT0JKUyk6IENvbnRhaW5zIG5vdyBvbmx5IGludGwtY29tcGF0Lm8uCisKKwkqIGxpYmdldHRleHQuaDoKKwlSZS1pbmNsdWRlIHByb3RlY3Rpb24gbWF0Y2hlcyBkdWFsaXN0aWMgY2hhcmFjdGVyIG9mIGxpYmdldHRleHQuaC4KKwlGb3IgYWxsIGZ1bmN0aW9ucyBpbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGRlZmluZSBfXyBjb3VudGVyIHBhcnQuCisKKwkqIGZpbmRkb21haW4uYyAoc3RyY2hyKTogRGVmaW5lIGFzIGluZGV4IGlmIG5vdCBmb3VuZCBpbiBDIGxpYnJhcnkuCisJKF9ubF9maW5kX2RvbWFpbik6IEZvciByZWxhdGl2ZSBwYXRocyBwYXN0ZSAvIGluIGJldHdlZW4uCisKK1R1ZSBKdWwgMTggMTY6Mzc6NDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogbG9hZG1zZ2NhdC5jLCBmaW5kZG9tYWluLmM6IEFkZCBpbmNsdXNpb24gb2Ygc3lzL3R5cGVzLmguCisKKwkqIHhvcGVuLW1zZy5zZWQ6IEZpeCBidWcgd2l0aCBgbXNnc3RyICIiJyBsaW5lcy4KKwlBIGxpdHRsZSBiaXQgYmV0dGVyIGNvbW1lbnRzLgorCitUdWUgSnVsIDE4IDAxOjE4OjI3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluOgorCXBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCBhcmUgbm93IGZvdW5kIGluIC4uL21pc2MuCisKKwkqIHBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCwgZWxpc3AtY29tcDoKKwlNb3ZlZCB0byAuLi9taXNjLy4KKworCSogbGliZ2V0dGV4dC5oLCBnZXR0ZXh0UC5oLCBnZXR0ZXh0Lmg6IFVuaWZvcm0gdGVzdCBmb3IgX19TVERDX18uCisKK1N1biBKdWwgMTYgMjI6MzM6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTEwsIElOU1RBTExfREFUQSk6IE5ldyB2YXJpYWJsZXMuCisJKGluc3RhbGwtZGF0YSwgdW5pbnN0YWxsKTogSW5zdGFsbC91bmluc3RhbGwgLmVsYyBmaWxlLgorCisJKiBwby1tb2RlLmVsIChJbnN0YWxsYXRpb24gY29tbWVudCk6CisJQWRkIC5wb3ggYXMgcG9zc2libGUgZXh0ZW5zaW9uIG9mIC5wbyBmaWxlcy4KKworU3VuIEp1bCAxNiAxMzoyMzoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBlbGlzcC1jb21wOiBDb21wbGV0ZSBuZXcgdmVyc2lvbiBieSBGcmFuYyxvaXM6IFRoaXMgZG9lcyBub3QKKyAJZmFpbCB3aGVuIG5vdCBjb21waWxpbmcgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisKK1N1biBKdWwgMTYgMDA6MTI6MTcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKC4uL3BvL2NhdC1pZC10Ymwubyk6CisJVXNlICQoTUFLRSkgaW5zdGVhZCBvZiBtYWtlIGZvciByZWN1cnNpdmUgbWFrZS4KKworCSogTWFrZWZpbGUuaW4gKC5lbC5lbGMpOiBVc2UgJChTSEVMTCkgaW5zdGVhZCBvZiAvYmluL3NoLgorCShpbnN0YWxsLWV4ZWMpOiBBZGQgbWlzc2luZyBkdW1teSBnb2FsLgorCShpbnN0YWxsLWRhdGEsIHVuaW5zdGFsbCk6IEAgaW4gbXVsdGktbGluZSBzaGVsbCBjb21tYW5kIGF0CisgCWJlZ2lubmluZywgbm90IGluIGZyb250IG9mIGVjaG8uICBSZXBvcnRlZCBieSBFcmljIEJhY2t1cy4KKworU2F0IEp1bCAxNSAwMDoyMToyOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKKwlSZW5hbWUgbGliZ2V0dGV4dC5wZXJsIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMKKwlmaWxlIHN5c3RlbXMuCisKKwkqIGdldHRleHQucGVybDoKKyAJUmVuYW1lIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMgZmlsZSBzeXN0ZW1zLgorCitUaHUgSnVsIDEzIDIzOjE3OjIwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIGNhdC1jb21wYXQuYzogSWYgIVNURENfSEVBREVSUyB0cnkgdG8gaW5jbHVkZSBtYWxsb2MuaC4KKworVGh1IEp1bCAxMyAyMDo1NTowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBwbzJ0Ymwuc2VkLmluOiBQcmV0dHkgcHJpbnRpbmcuCisKKwkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6CisJQ29ycmVjdCBidWdzIHdpdGggaGFuZGxpbmcgc3Vic3RpdHV0ZSBmbGFncyBpbiBicmFuY2hlcy4KKworCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgorCU9sZCBLJlIgY29tcGlsZXJzIGRvbid0IHVuZGVyIHN0YW5kIGB1bnNpZ25lZCBjaGFyJy4KKworCSogZ2V0dGV4dC5oIChubHNfdWludDMyKToKKwlTb21lIG9sZCBLJlIgY29tcGlsZXJzIChlZyBIUCkgZG9uJ3QgdW5kZXJzdGFuZCBgdW5zaWduZWQgaW50Jy4KKworCSogY2F0LWNvbXBhdC5jIChtc2dfdG9fY2F0X2lkKTogRGUtQU5TSS1meSBwcm90b3R5cGVzLgorCitUaHUgSnVsIDEzIDAxOjM0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluIChFTENGSUxFUyk6IE5ldyB2YXJpYWJsZS4KKwkoRElTVEZJTEVTKTogQWRkIGVsaXNwLWNvbXAuCisJQWRkIGltcGxpY2l0IHJ1bGUgZm9yIC5lbCAtPiAuZWxjIGNvbXBpbGF0aW9uLgorCShpbnN0YWxsLWRhdGEpOiBpbnN0YWxsICRFTENGSUxFUworCShjbGVhbik6IHJlbmFtZWQgcG8tdG8tdGJsIGFuZCBwby10by1tc2cgdG8gcG8ydGJsIGFuZCBwbzJtc2cgcmVzcC4KKworCSogZWxpc3AtY29tcDogSW5pdGlhbCByZXZpc2lvbgorCitXZWQgSnVsIDEyIDE2OjE0OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIE1ha2VmaWxlLmluOgorCWNhdC1pZC10YmwuYyBpcyBub3cgZm91bmQgaW4gcG8vLiAgVGhpcyBlbmFibGVzIHVzIHRvIHVzZSBhbiBpZGVudGljYWwKKwlpbnRsLyBkaXJlY3RvcnkgaW4gYWxsIHBhY2thZ2VzLgorCisJKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogaGFzaGluZyBkb2VzIG5vdCB3b3JrIGZvciB0YWJsZSBzaXplIDw9IDIuCisKKwkqIHRleHRkb21haW4uYzogZml4IHR5cG8gKCNpZiBkZWYgLT4gI2lmIGRlZmluZWQpCisKK1R1ZSBKdWwgMTEgMTg6NDQ6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KKworCSogTWFrZWZpbGUuaW4gKHN0YW1wLWNhdC1pZCk6IHVzZSB0b3Bfc3JjZGlyIHRvIGFkZHJlc3Mgc291cmNlIGZpbGVzCisJKERJU1RGSUxFUyxkaXN0Y2xlYW4pOiBtb3ZlIHR1cGRhdGUucGVybCB0byBzcmMvCisKKwkqIHBvLXRvLXRibC5zZWQuaW46CisJYWRkIGFkZGl0aW9uYWwganVtcCB0byBjbGVhciBjaGFuZ2UgZmxhZyB0byByZWNvZ25pemUgbXVsdGlsaW5lIHN0cmluZ3MKKworVHVlIEp1bCAxMSAwMTozMjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiB0ZXh0ZG9tYWluLmM6IFByb3RlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oIGFuZCBzdHJpbmcuaC4KKworCSogbG9hZG1zZ2NhdC5jOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBzdGRsaWIuaC4KKworCSogbGliZ2V0dGV4dC5oOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBsb2NhbGUuaC4KKwlBbGxvdyB1c2UgaW4gQysrIHByb2dyYW1zLgorCURlZmluZSBOVUxMIGlzIG5vdCBoYXBwZW5lZCBhbHJlYWR5LgorCisJKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogc2hpcCBwby10by10Ymwuc2VkLmluIGluc3RlYWQgb2YKKwlwby10by10Ymwuc2VkLgorCShkaXN0Y2xlYW4pOiByZW1vdmUgcG8tdG8tdGJsLnNlZCBhbmQgdHVwZGF0ZS5wZXJsLgorCisJKiB0dXBkYXRlLnBlcmwuaW46IFN1YnN0aXR1dGUgUGVybCBwYXRoIGV2ZW4gaW4gZXhlYyBsaW5lLgorCURvbid0IGluY2x1ZGUgZW50cmllcyB3aXRob3V0IHRyYW5zbGF0aW9uIGZyb20gb2xkIC5wbyBmaWxlLgorCitUdWUgSnVsICA0IDAwOjQxOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIHR1cGRhdGUucGVybC5pbjogdXNlICJVcGRhdGVkOiAiIGluIG1zZ2lkICIiLgorCisJKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvIChMT0NBTERJUiAtPiBMT0NBTEVESVIpLgorIAlEZWZpbmUgZ2V0ZW52IGlmICFfX1NURENfXy4KKworCSogYmluZHRleHRkb20uYzogUHJvdGVjdCBzdGRsaWIuaCBhbmQgc3RyaW5nLmggaW5jbHVzaW9uLgorIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCisKKwkqIGZpbmRkb21haW4uYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCisgCURlZmluZSBmcmVlIGlmICFfX1NURENfXy4KKworCSogY2F0LWNvbXBhdC5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KKworTW9uIEp1bCAgMyAyMzo1NjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBNYWtlZmlsZS5pbjogVXNlIExPQ0FMRURJUiBpbnN0ZWFkIG9mIERFRl9NU0dfRE9NX0RJUi4KKwlSZW1vdmUgdW5uZWVkZWQgJChzcmNkaXIpIGZyb20gTWFrZWZpbGUuaW4gZGVwZW5kZW5jeS4KKworCSogbWFrZWxpbmtzOiBBZGQgY29weXJpZ2h0IGFuZCBzaG9ydCBkZXNjcmlwdGlvbi4KKworCSogcG8tbW9kZS5lbDogTGFzdCB2ZXJzaW9uIGZvciAwLjcuCisKKwkqIHR1cGRhdGUucGVybC5pbjogRml4IGRpZSBtZXNzYWdlLgorCisJKiBkY2dldHRleHQuYzogUHJvdGVjdCBpbmNsdWRlIG9mIHN0cmluZy5oLgorCisJKiBnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdGRsaWIuaCBhbmQgZnVydGhlciB0cmllcyB0byBnZXQgTlVMTC4KKworCSogZmluZGRvbWFpbi5jOiBTb21lIGNvcnJlY3Rpb25zIGluIGluY2x1ZGVzLgorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBQcnVuZSBsaXN0IGNvcnJlY3QgcGF0aCB0byBNYWtlZmlsZS5pbi4KKworCSogcG8tdG8tdGJsLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCisKKwkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6IEFkb3B0IGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgorCitTdW4gSnVsICAyIDIzOjU1OjAzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+CisKKwkqIHR1cGRhdGUucGVybC5pbjogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KKworU3VuIEp1bCAgMiAwMjowNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCisJKiBGaXJzdCBvZmZpY2lhbCByZWxlYXNlLiAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBjb2RlCisJbmVlZGVkIHRvIGludGVybmF0aW9uYWxpemUgb3duIHBhY2thZ2VzLiAgSXQgcHJvdmlkZXMgZnVuY3Rpb25zCisJd2hpY2ggYWxsb3cgdG8gdXNlIHRoZSBYL09wZW4gY2F0Z2V0cyBmdW5jdGlvbiB3aXRoIGFuIGludGVyZmFjZQorCWxpa2UgdGhlIFVuaWZvcnVtIGdldHRleHQgZnVuY3Rpb24uICBGb3Igc3lzdGVtIHdoaWNoIGRvZXMgbm90CisJaGF2ZSBuZWl0aGVyIG9mIHRob3NlIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQuCmRpZmYgLS1naXQgYS9pbnRsL0NoYW5nZUxvZy5DeWdudXMgYi9pbnRsL0NoYW5nZUxvZy5DeWdudXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzMmRhNgotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvQ2hhbmdlTG9nLkN5Z251cwpAQCAtMCwwICsxLDMwIEBACitUdWUgTWF5IDI2IDE4OjI5OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCitTdW4gTWF5IDEwIDIyOjM1OjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworICAgICAgICAqIHBvL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgorCitTdW4gQXByIDE5IDE5OjIwOjAwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWx0LgorCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0xJTktfRklMRVMgc28gdGhhdCA8bGliaW50bC5oPiB3aWxsCisJYWx3YXlzIGV4aXN0LgorCitGcmkgTWFyIDI3IDE2OjM3OjI1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWx0IHdpdGggbmV3IGN5Z2V0dGV4dC5tNC4KKworV2VkIE1hciAyNSAxNTowMDoxNCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgY29uZmlnLmggZnJvbSBjb25maWcuaW4uCisJKiBjb25maWcuaC5pbjogUmVtb3ZlZC4KKwkqIGNvbmZpZy5pbjogTmV3IGZpbGUuCisKKwkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZS4KKworCSogY29uZmlndXJlLmluLCBjb25maWd1cmUsIGFjY29uZmlnLmgsIGFjbG9jYWwubTQ6IE5ldyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluIChPQkpFQ1RTKTogRGVwZW5kIG9uIGNvbmZpZy5oLCBub3QgLi4vY29uZmlnLmguCisJKE1ha2VmaWxlKTogUmVidWlsZCBNYWtlZmlsZSBoZXJlLCBub3QgaW4gYC4uJy4KKwpkaWZmIC0tZ2l0IGEvaW50bC9NYWtlZmlsZS5pbiBiL2ludGwvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2NDdkZQotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyMTQgQEAKKyMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBpbiBHTlUgTkxTIFV0aWxpdGllcy4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitQQUNLQUdFID0gQFBBQ0tBR0VACitWRVJTSU9OID0gQFZFUlNJT05ACisKK1NIRUxMID0gL2Jpbi9zaAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAordG9wX2J1aWxkZGlyID0gLi4KK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitsaWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKK2luY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQorZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQorZ2V0dGV4dHNyY2RpciA9IEBkYXRhZGlyQC9nZXR0ZXh0L2ludGwKK2FsaWFzcGF0aCA9ICQobG9jYWxlZGlyKTouCitzdWJkaXIgPSBpbnRsCisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACisKK2wgPSBAbEAKKworQVIgPSBhcgorQ0MgPSBAQ0NACitMSUJUT09MID0gQExJQlRPT0xACitSQU5MSUIgPSBAUkFOTElCQAorCitERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtREdOVUxPQ0FMRURJUj1cIiQoZ251bG9jYWxlZGlyKVwiIFwKKy1ETE9DQUxFX0FMSUFTX1BBVEg9XCIkKGFsaWFzcGF0aClcIiBAREVGU0AKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ0ZMQUdTID0gQENGTEFHU0AKK0xERkxBR1MgPSBATERGTEFHU0AKKworQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKKworSEVBREVSUyA9ICQoQ09NSERSUykgbGliZ2V0dGV4dC5oIGxvYWRpbmZvLmgKK0NPTUhEUlMgPSBnZXR0ZXh0LmggZ2V0dGV4dFAuaCBoYXNoLXN0cmluZy5oCitTT1VSQ0VTID0gJChDT01TUkNTKSBpbnRsLWNvbXBhdC5jIGNhdC1jb21wYXQuYworQ09NU1JDUyA9IGJpbmR0ZXh0ZG9tLmMgZGNnZXR0ZXh0LmMgZGdldHRleHQuYyBnZXR0ZXh0LmMgXAorZmluZGRvbWFpbi5jIGxvYWRtc2djYXQuYyBsb2NhbGVhbGlhcy5jIHRleHRkb21haW4uYyBsMTBuZmxpc3QuYyBcCitleHBsb2RlbmFtZS5jCitPQkpFQ1RTID0gQElOVExPQkpTQCBiaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZ2V0dGV4dC4kbG8gXAorZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIHRleHRkb21haW4uJGxvIGwxMG5mbGlzdC4kbG8gXAorZXhwbG9kZW5hbWUuJGxvCitDQVRPQkpTID0gY2F0LWNvbXBhdC4kbG8gLi4vcG8vY2F0LWlkLXRibC4kbG8KK0dFVFRPQkpTID0gaW50bC1jb21wYXQuJGxvCitESVNURklMRVMuY29tbW9uID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBcCit4b3Blbi1tc2cuc2VkICQoSEVBREVSUykgJChTT1VSQ0VTKQorRElTVEZJTEVTLm5vcm1hbCA9IFZFUlNJT04KK0RJU1RGSUxFUy5nZXR0ZXh0ID0gbGliaW50bC5nbGliYyBpbnRsaC5pbnN0LmluCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLm8gLmxvCisuYy5vOgorCSQoQ09NUElMRSkgJDwKKy5jLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkPAorCitJTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKQorCithbGw6IGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExACisKK2FsbC15ZXM6IGxpYmludGwuJGxhIGludGxoLmluc3QKK2FsbC1ubzoKK2luc3RhbGwtaW5mbzoKKworbGliaW50bC5hOiAkKE9CSkVDVFMpCisJcm0gLWYgJEAKKwkkKEFSKSBjcnUgJEAgJChPQkpFQ1RTKQorCSQoUkFOTElCKSAkQAorCitsaWJpbnRsLmxhOiAkKE9CSkVDVFMpCisJJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAkKExERkxBR1MpIC1vICRAICQoT0JKRUNUUykgXAorCQkgICAtdmVyc2lvbi1pbmZvIDE6MCAtcnBhdGggJChsaWJkaXIpCisKKy4uL3BvL2NhdC1pZC10YmwuJGxvOiAuLi9wby9jYXQtaWQtdGJsLmMgJCh0b3Bfc3JjZGlyKS9wby8kKFBBQ0tBR0UpLnBvdAorCWNkIC4uL3BvICYmICQoTUFLRSkgY2F0LWlkLXRibC4kbG8KKworY2hlY2s6IGFsbAorCisjIFRoaXMgaW5zdGFsbGF0aW9uIGdvYWwgaXMgb25seSB1c2VkIGluIEdOVSBnZXR0ZXh0LiAgUGFja2FnZXMgd2hpY2gKKyMgb25seSB1c2UgdGhlIGxpYnJhcnkgc2hvdWxkIHVzZSBpbnN0YWxsIGluc3RlYWQuCisKKyMgV2UgbXVzdCBub3QgaW5zdGFsbCB0aGUgbGliaW50bC5oL2xpYmludGwuYSBmaWxlcyBpZiB3ZSBhcmUgb24gYQorIyBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCisjIHNlcGFyYXRlIGxpYnJhcnkgb3IgdXNlIHRoZSBjYXRnZXRzIGludGVyZmFjZS4gIEEgc3BlY2lhbCBjYXNlIGlzCisjIHdoZXJlIGNvbmZpZ3VyZSBmb3VuZCBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCisjIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQorIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCitpbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCitpbnN0YWxsLWV4ZWM6IGFsbAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiIFwKKwkgICAmJiB0ZXN0ICdASU5UTE9CSlNAJyA9ICckKEdFVFRPQkpTKSc7IHRoZW4gXAorCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICAgJChNS0lOU1RBTExESVJTKSAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAorCSAgZmk7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSBpbnRsaC5pbnN0ICQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCisJICAkKElOU1RBTExfREFUQSkgbGliaW50bC5hICQobGliZGlyKS9saWJpbnRsLmE7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKK2luc3RhbGwtZGF0YTogYWxsCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAorCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCisJICBlbHNlIFwKKwkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgIGZpOyBcCisJICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKGdldHRleHRzcmNkaXIpL1ZFUlNJT047IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5jb21tb24pIjsgXAorCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCisjIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCitpbnN0YWxsY2hlY2s6CisKK3VuaW5zdGFsbDoKKwlkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICBybSAtZiAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCWRvbmUKKworaW5mbyBkdmk6CisKKyQoT0JKRUNUUyk6IGNvbmZpZy5oIGxpYmdldHRleHQuaAorYmluZHRleHRkb20uJGxvIGZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBsb2FkaW5mby5oCitkY2dldHRleHQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBoYXNoLXN0cmluZy5oIGxvYWRpbmZvLmgKKwordGFnczogVEFHUworCitUQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKKwloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCisKK2lkOiBJRAorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpCisJaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIG1raWQgLWYkJGhlcmUvSUQgJChIRUFERVJTKSAkKFNPVVJDRVMpCisKKworbW9zdGx5Y2xlYW46CisJcm0gLWYgKi5hICoubyAqLmxvIGNvcmUgY29yZS4qCisKK2NsZWFuOiBtb3N0bHljbGVhbgorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgSUQgVEFHUyBwbzJtc2cuc2VkIHBvMnRibC5zZWQgbGliaW50bC5oIGNvbmZpZy5sb2cKKworbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisKKworIyBHTlUgZ2V0dGV4dCBuZWVkcyBub3QgY29udGFpbiB0aGUgZmlsZSBgVkVSU0lPTicgYnV0IGNvbnRhaW5zIHNvbWUKKyMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KK2Rpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCitkaXN0IGRpc3RkaXI6IE1ha2VmaWxlICQoRElTVEZJTEVTKQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gZ2V0dGV4dDsgdGhlbiBcCisJICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKKwllbHNlIFwKKwkgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCisJZmk7IFwKKwlmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pICQkYWRkaXRpb25hbDsgZG8gXAorCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCWRvbmUKKworZGlzdC1saWJjOgorCXRhciB6Y3ZmIGludGwtZ2xpYmMudGFyLmd6ICQoQ09NU1JDUykgJChDT01IRFJTKSBsaWJpbnRsLmguZ2xpYmMKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIFRoZSBkZXBlbmRlbmN5IGZvciBpbnRsaC5pbnN0IGlzIGRpZmZlcmVudCBpbiBnZXR0ZXh0IGFuZCBhbGwgb3RoZXIKKyMgcGFja2FnZXMuICBCZWNhdXNlIHdlIGNhbm5vdCB5b3UgR05VIG1ha2UgZmVhdHVyZXMgd2UgaGF2ZSB0byBzb2x2ZQorIyB0aGUgcHJvYmxlbSB3aGlsZSByZXdyaXRpbmcgTWFrZWZpbGUuaW4uCitAR1RfWUVTQGludGxoLmluc3Q6IGludGxoLmluc3QuaW4gLi4vY29uZmlnLnN0YXR1cworQEdUX1lFU0AJY2QgLi4gXAorQEdUX1lFU0AJJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gXAorQEdUX1lFU0AJICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKK0BHVF9OT0AuUEhPTlk6IGludGxoLmluc3QKK0BHVF9OT0BpbnRsaC5pbnN0OgorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9pbnRsL2FjY29uZmlnLmggYi9pbnRsL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmODFmOAotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvYWNjb25maWcuaApAQCAtMCwwICsxLDE0IEBACisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9pbnRsL2FjbG9jYWwubTQgYi9pbnRsL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvYWNsb2NhbC5tNApAQCAtMCwwICsxLDM4NyBAQAorZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjMKKworZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CitkbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgorCitBQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAorW0FDX1BSRVJFUShbMi4xMl0pCitBQ19DT05GSUdfSEVBREVSKFskMV0pCitkbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KK2RubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKK2RubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCitkbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCitBQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCitpZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCis8PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAorPDxhbV9pbmR4PTEKK2ZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KKyAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgorICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgorICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4CisgICAgOzsKKyAgZXNhYworICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKK2RvbmU8PD4+ZG5sPj4pCitjaGFuZ2VxdW90ZShbLF0pKV0pCisKKworIyBzZXJpYWwgMQorCitBQ19ERUZVTihBTV9QUk9HX0lOU1RBTEwsCitbQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKK0FDX1NVQlNUKElOU1RBTExfU0NSSVBUKWRubAorXSkKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworQUNfREVGVU4oQ1lfV0lUSF9OTFMsCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKKyAgICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKKyAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICAgIEFDX1NVQlNUKFVTRV9OTFMpCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUykKKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCisgICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAorICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCisgICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0CisgICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKKyAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCisJZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCisJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCisJICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKKwkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKKwkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAorCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCisJCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKKwkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKKwkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhUKQorCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCisJCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQorCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKKwkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCisJCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCisJCSAgW0NBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKKwkJICBbQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWJdKQorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJXSkKKworCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgorICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgorCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCisJICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCisJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KKyAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKKwkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQorICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKyAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCisgICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCisgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKKwlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgorCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIEFDX01TR19SRVNVTFQoCisJICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcworICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKKyAgICBkbmwgaW4gY29uZmlndXJlLmluLgorICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgorICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCisgICAgZG9uZQorCisgICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCisgICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCisgICAgQUNfU1VCU1QoQ0FUQUxPR1MpCisgICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQorICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQorICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQorICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCisgICAgQUNfU1VCU1QoSU5UTERFUFMpCisgICAgQUNfU1VCU1QoSU5UTExJQlMpCisgICAgQUNfU1VCU1QoSU5UTE9CSlMpCisgICAgQUNfU1VCU1QoUE9GSUxFUykKKyAgICBBQ19TVUJTVChQT1NVQikKKyAgXSkKKworQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCisgIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAorICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAorCisgICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCisgICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQorICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIEFDX0RFRklORShIQVZFX1NUUENQWSkKKyAgIGZpCisKKyAgIEFNX0xDX01FU1NBR0VTCisgICBDWV9XSVRIX05MUworCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKKyAgICAgZmkKKworICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KKyAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQorICAgICBmaQorICAgZmkKKworICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKKyAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcworICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgorICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCisgICBlbHNlCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKKy8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKKyAgIGZpCisgICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQorCisgICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCisgICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKKyAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0CisgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCisKKwkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCisgICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KKwkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KKyAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAorCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCisgICBmaQorCisgICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcworICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAorICAgZG5sIHBhY2thZ2VzLgorICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIEFDX1NVQlNUKEdUX05PKQorICAgQUNfU1VCU1QoR1RfWUVTKQorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQorCisgICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KKyAgIGw9CisgICBBQ19TVUJTVChsKQorCisgICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAorICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5CisgICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KKyAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICBdKQorCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCitkbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCitkbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCitBQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAorWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKK0FDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAorW2Nhc2UgIlskXSQxIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgWyQzXTsgdGhlbgorCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2RubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCitkbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KK2lmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCitdKWRubAorICA7OworZXNhY10pZG5sCiskMT0iJGFjX2N2X3BhdGhfJDEiCitpZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChbJF0kMSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitBQ19TVUJTVCgkMSlkbmwKK10pCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCisgIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAorICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCisgICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUykKKyAgICBmaQorICBmaV0pCisKZGlmZiAtLWdpdCBhL2ludGwvYmluZHRleHRkb20uYyBiL2ludGwvYmluZHRleHRkb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmNiOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaW50bC9iaW5kdGV4dGRvbS5jCkBAIC0wLDAgKzEsMTk5IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmluZHRleHRkb21haW4oMykgZnVuY3Rpb24KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX01BTExPQ19ICisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgZWxzZQordm9pZCBmcmVlICgpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgaWZuZGVmIG1lbWNweQorIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorI2VuZGlmCisjaW5jbHVkZSAiZ2V0dGV4dC5oIgorI2luY2x1ZGUgImdldHRleHRQLmgiCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOworCisvKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucy4gICovCitleHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisKKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBCSU5EVEVYVERPTUFJTiBfX2JpbmR0ZXh0ZG9tYWluCisjIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQorI2Vsc2UKKyMgZGVmaW5lIEJJTkRURVhURE9NQUlOIGJpbmR0ZXh0ZG9tYWluX18KKyNlbmRpZgorCisvKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KK2NoYXIgKgorQklORFRFWFRET01BSU4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCisgICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Cit7CisgIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOworCisgIC8qIFNvbWUgc2FuaXR5IGNoZWNrcy4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwgfHwgZG9tYWlubmFtZVswXSA9PSAnXDAnKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCisgICAgeworICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOworICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKKwkvKiBXZSBmb3VuZCBpdCEgICovCisJYnJlYWs7CisgICAgICBpZiAoY29tcGFyZSA8IDApCisJeworCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KKwkgIGJpbmRpbmcgPSBOVUxMOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoZGlybmFtZSA9PSBOVUxMKQorICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KKyAgICByZXR1cm4gYmluZGluZyA9PSBOVUxMID8gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZSA6IGJpbmRpbmctPmRpcm5hbWU7CisKKyAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCisJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKwkgb2xkIGJpbmRpbmcuICAqLworICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgYmluZGluZy0+ZGlybmFtZSkgIT0gMCkKKwl7CisJICBjaGFyICpuZXdfZGlybmFtZTsKKworCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKKwkgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOworCSAgZWxzZQorCSAgICB7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisJICAgICAgbmV3X2Rpcm5hbWUgPSBzdHJkdXAgKGRpcm5hbWUpOworCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKyNlbHNlCisJICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOworCSAgICAgIG5ld19kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCSAgICAgIG1lbWNweSAobmV3X2Rpcm5hbWUsIGRpcm5hbWUsIGxlbik7CisjZW5kaWYKKwkgICAgfQorCisJICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBfbmxfZGVmYXVsdF9kaXJuYW1lKQorCSAgICBmcmVlIChiaW5kaW5nLT5kaXJuYW1lKTsKKworCSAgYmluZGluZy0+ZGlybmFtZSA9IG5ld19kaXJuYW1lOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiAgKi8KKyAgICAgIHNpemVfdCBsZW47CisgICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQorCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld19iaW5kaW5nKSk7CisKKyAgICAgIGlmIChuZXdfYmluZGluZyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisgICAgICBuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9IHN0cmR1cCAoZG9tYWlubmFtZSk7CisgICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgICBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKKyAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworICAgICAgaWYgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBsZW4pOworI2VuZGlmCisKKyAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCisJbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOworICAgICAgZWxzZQorCXsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKwkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKKwkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisJICBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKKwkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lID09IE5VTEwpCisJICAgIHJldHVybiBOVUxMOworCSAgbWVtY3B5IChuZXdfYmluZGluZy0+ZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKKyNlbmRpZgorCX0KKworICAgICAgLyogTm93IGVucXVldWUgaXQuICAqLworICAgICAgaWYgKF9ubF9kb21haW5fYmluZGluZ3MgPT0gTlVMTAorCSAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZG9tYWluX2JpbmRpbmdzLT5kb21haW5uYW1lKSA8IDApCisJeworCSAgbmV3X2JpbmRpbmctPm5leHQgPSBfbmxfZG9tYWluX2JpbmRpbmdzOworCSAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IG5ld19iaW5kaW5nOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsKKwkgIHdoaWxlIChiaW5kaW5nLT5uZXh0ICE9IE5VTEwKKwkJICYmIHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+bmV4dC0+ZG9tYWlubmFtZSkgPiAwKQorCSAgICBiaW5kaW5nID0gYmluZGluZy0+bmV4dDsKKworCSAgbmV3X2JpbmRpbmctPm5leHQgPSBiaW5kaW5nLT5uZXh0OworCSAgYmluZGluZy0+bmV4dCA9IG5ld19iaW5kaW5nOworCX0KKworICAgICAgYmluZGluZyA9IG5ld19iaW5kaW5nOworICAgIH0KKworICByZXR1cm4gYmluZGluZy0+ZGlybmFtZTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fYmluZHRleHRkb21haW4sIGJpbmR0ZXh0ZG9tYWluKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9jYXQtY29tcGF0LmMgYi9pbnRsL2NhdC1jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdkOTAxCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9jYXQtY29tcGF0LmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIENvbXBhdGliaWxpdHkgY29kZSBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKK2NoYXIgKmdldGVudiAoKTsKKyMgaWZkZWYgSEFWRV9NQUxMT0NfSAorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTkxfVFlQRVNfSAorIyBpbmNsdWRlIDxubF90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKKyAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAorICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKKyAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCisgICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKKyAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKKyNlbmRpZgorCisvKiBUaGUgY2F0YWxvZyBkZXNjcmlwdG9yLiAgKi8KK3N0YXRpYyBubF9jYXRkIGNhdGFsb2cgPSAobmxfY2F0ZCkgLTE7CisKKy8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZy4gICovCitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2NhdGFsb2dfbmFtZVtdID0gIm1lc3NhZ2VzIjsKKworLyogTmFtZSBvZiBjdXJyZW50bHkgdXNlZCBjYXRhbG9nLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjYXRhbG9nX25hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKKworLyogR2V0IElEIGZvciBnaXZlbiBzdHJpbmcuICBJZiBub3QgZm91bmQgcmV0dXJuIC0xLiAgKi8KK3N0YXRpYyBpbnQgbXNnX3RvX2NhdF9pZCBQQVJBTVMgKChjb25zdCBjaGFyICptc2cpKTsKKworLyogU3Vic3RpdHV0aW9uIGZvciBzeXN0ZW1zIGxhY2tpbmcgdGhpcyBmdW5jdGlvbiBpbiB0aGVpciBDIGxpYnJhcnkuICAqLworI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKK3N0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7CisjZW5kaWYKKworCisvKiBTZXQgY3VycmVudGx5IHVzZWQgZG9tYWluL2NhdGFsb2cuICAqLworY2hhciAqCit0ZXh0ZG9tYWluIChkb21haW5uYW1lKQorICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworeworICBubF9jYXRkIG5ld19jYXRhbG9nOworICBjaGFyICpuZXdfbmFtZTsKKyAgc2l6ZV90IG5ld19uYW1lX2xlbjsKKyAgY2hhciAqbGFuZzsKKworI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTIFwKKyAgICAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKKyAgbGFuZyA9IHNldGxvY2FsZSAoTENfTUVTU0FHRVMsIE5VTEwpOworI2Vsc2UKKyAgbGFuZyA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICBsYW5nID0gZ2V0ZW52ICgiTENfTUVTU0FHRVMiKTsKKyAgICAgIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQorCWxhbmcgPSBnZXRlbnYgKCJMQU5HIik7CisgICAgfQorI2VuZGlmCisgIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQorICAgIGxhbmcgPSAiQyI7CisKKyAgLyogU2VlIHdoZXRoZXIgbmFtZSBvZiBjdXJyZW50bHkgdXNlZCBkb21haW4gaXMgYXNrZWQuICAqLworICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQorICAgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7CisKKyAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKKyAgICBkb21haW5uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7CisKKyAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgKi8KKyAgbmV3X25hbWVfbGVuID0gc2l6ZW9mIChMT0NBTEVESVIpIC0gMSArIDEgKyBzdHJsZW4gKGxhbmcpCisJCSArIHNpemVvZiAoIi9MQ19NRVNTQUdFUy8iKSAtIDEgKyBzaXplb2YgKFBBQ0tBR0UpIC0gMQorCQkgKyBzaXplb2YgKCIuY2F0Iik7CisKKyAgbmV3X25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKG5ld19uYW1lX2xlbik7CisgIGlmIChuZXdfbmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cmNweSAobmV3X25hbWUsIFBBQ0tBR0UpOworICBuZXdfY2F0YWxvZyA9IGNhdG9wZW4gKG5ld19uYW1lLCAwKTsKKworICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQorICAgIHsKKyAgICAgIC8qIE5MU1BBVEggc2VhcmNoIGRpZG4ndCB3b3JrLCB0cnkgYWJzb2x1dGUgcGF0aCAqLworICAgICAgc3ByaW50ZiAobmV3X25hbWUsICIlcy8lcy9MQ19NRVNTQUdFUy8lcy5jYXQiLCBMT0NBTEVESVIsIGxhbmcsCisJICAgICAgIFBBQ0tBR0UpOworICAgICAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7CisKKyAgICAgIGlmIChuZXdfY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCisJeworCSAgZnJlZSAobmV3X25hbWUpOworCSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKKwl9CisgICAgfQorCisgIC8qIENsb3NlIG9sZCBjYXRhbG9nLiAgKi8KKyAgaWYgKGNhdGFsb2cgIT0gKG5sX2NhdGQpIC0xKQorICAgIGNhdGNsb3NlIChjYXRhbG9nKTsKKyAgaWYgKGNhdGFsb2dfbmFtZSAhPSBkZWZhdWx0X2NhdGFsb2dfbmFtZSkKKyAgICBmcmVlICgoY2hhciAqKSBjYXRhbG9nX25hbWUpOworCisgIGNhdGFsb2cgPSBuZXdfY2F0YWxvZzsKKyAgY2F0YWxvZ19uYW1lID0gbmV3X25hbWU7CisKKyAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKK30KKworY2hhciAqCitiaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKKyAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKyAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKK3sKKyNpZiBIQVZFX1NFVEVOViB8fCBIQVZFX1BVVEVOVgorICBjaGFyICpvbGRfdmFsLCAqbmV3X3ZhbCwgKmNwOworICBzaXplX3QgbmV3X3ZhbF9sZW47CisKKyAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgaGVyZSBidXQgdG8gYmUgY29tcGF0aWJsZSBkbyBpdC4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgSWYgd2UgdXNlIHNldGVudiB3ZSBkb24ndCBuZWVkCisgICAgIHRoZSBmaXJzdCBieXRzIGZvciBOTFNQQVRIPSwgYnV0IHdoeSBjb21wbGljYXRlIHRoZSBjb2RlIGZvciB0aGlzCisgICAgIHBlYW51dHMuICAqLworICBuZXdfdmFsX2xlbiA9IHNpemVvZiAoIk5MU1BBVEg9IikgLSAxICsgc3RybGVuIChkaXJuYW1lKQorCQkrIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKKworICBvbGRfdmFsID0gZ2V0ZW52ICgiTkxTUEFUSCIpOworICBpZiAob2xkX3ZhbCA9PSBOVUxMIHx8IG9sZF92YWxbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICBvbGRfdmFsID0gTlVMTDsKKyAgICAgIG5ld192YWxfbGVuICs9IDEgKyBzaXplb2YgKExPQ0FMRURJUikgLSAxCisJICAgICAgICAgICAgICsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOworICAgIH0KKyAgZWxzZQorICAgIG5ld192YWxfbGVuICs9IHN0cmxlbiAob2xkX3ZhbCk7CisKKyAgbmV3X3ZhbCA9IChjaGFyICopIG1hbGxvYyAobmV3X3ZhbF9sZW4pOworICBpZiAobmV3X3ZhbCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisjIGlmIEhBVkVfU0VURU5WCisgIGNwID0gbmV3X3ZhbDsKKyMgZWxzZQorICBjcCA9IHN0cGNweSAobmV3X3ZhbCwgIk5MU1BBVEg9Iik7CisjIGVuZGlmCisKKyAgY3AgPSBzdHBjcHkgKGNwLCBkaXJuYW1lKTsKKyAgY3AgPSBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdDoiKTsKKworICBpZiAob2xkX3ZhbCA9PSBOVUxMKQorICAgIHsKKyMgaWYgX19TVERDX18KKyAgICAgIHN0cGNweSAoY3AsIExPQ0FMRURJUiAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOworIyBlbHNlCisKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgTE9DQUxFRElSKTsKKyAgICAgIHN0cGNweSAoY3AsICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7CisjIGVuZGlmCisgICAgfQorICBlbHNlCisgICAgc3RwY3B5IChjcCwgb2xkX3ZhbCk7CisKKyMgaWYgSEFWRV9TRVRFTlYKKyAgc2V0ZW52ICgiTkxTUEFUSCIsIG5ld192YWwsIDEpOworICBmcmVlIChuZXdfdmFsKTsKKyMgZWxzZQorICBwdXRlbnYgKG5ld192YWwpOworICAvKiBEbyAqbm90KiBmcmVlIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB3ZSBqdXN0IGVudGVyZWQuICBJdCBpcyB1c2VkCisgICAgIGZyb20gbm93IG9uLiAgICovCisjIGVuZGlmCisKKyNlbmRpZgorCisgIHJldHVybiAoY2hhciAqKSBkb21haW5uYW1lOworfQorCisjdW5kZWYgZ2V0dGV4dAorY2hhciAqCitnZXR0ZXh0IChtc2cpCisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgaW50IG1zZ2lkOworCisgIGlmIChtc2cgPT0gTlVMTCB8fCBjYXRhbG9nID09IChubF9jYXRkKSAtMSkKKyAgICByZXR1cm4gKGNoYXIgKikgbXNnOworCisgIC8qIEdldCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBjYXRhbG9nLiAgV2UgYWx3YXlzIHVzZSBzZXQgbnVtYmVyIDEuCisgICAgIFRoZSBtZXNzYWdlIElEIGlzIGNvbXB1dGVkIGJ5IHRoZSBmdW5jdGlvbiBgbXNnX3RvX2NhdF9pZCcKKyAgICAgd2hpY2ggd29ya3Mgb24gdGhlIHRhYmxlIGdlbmVyYXRlZCBieSBgcG8tdG8tdGJsJy4gICovCisgIG1zZ2lkID0gbXNnX3RvX2NhdF9pZCAobXNnKTsKKyAgaWYgKG1zZ2lkID09IC0xKQorICAgIHJldHVybiAoY2hhciAqKSBtc2c7CisKKyAgcmV0dXJuIGNhdGdldHMgKGNhdGFsb2csIDEsIG1zZ2lkLCAoY2hhciAqKSBtc2cpOworfQorCisvKiBMb29rIHRocm91Z2ggdGhlIHRhYmxlIGBfbXNnX3RibCcgd2hpY2ggaGFzIGBfbXNnX3RibF9sZW5ndGgnIGVudHJpZXMKKyAgIGZvciB0aGUgb25lIGVxdWFsIHRvIG1zZy4gIElmIGl0IGlzIGZvdW5kIHJldHVybiB0aGUgSUQuICBJbiBjYXNlIHdoZW4KKyAgIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kIHJldHVybiAtMS4gICovCitzdGF0aWMgaW50Cittc2dfdG9fY2F0X2lkIChtc2cpCisgICAgIGNvbnN0IGNoYXIgKm1zZzsKK3sKKyAgaW50IGNudDsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IF9tc2dfdGJsX2xlbmd0aDsgKytjbnQpCisgICAgaWYgKHN0cmNtcCAobXNnLCBfbXNnX3RibFtjbnRdLl9tc2cpID09IDApCisgICAgICByZXR1cm4gX21zZ190YmxbY250XS5fbXNnX251bWJlcjsKKworICByZXR1cm4gLTE7Cit9CisKKworLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisKKy8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCisgICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcworICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKKyAgIHRvIGJlIGRlZmluZWQuICAqLworI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKK3N0YXRpYyBjaGFyICoKK3N0cGNweSAoZGVzdCwgc3JjKQorICAgICBjaGFyICpkZXN0OworICAgICBjb25zdCBjaGFyICpzcmM7Cit7CisgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKyAgICAvKiBEbyBub3RoaW5nLiAqLyA7CisgIHJldHVybiBkZXN0IC0gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWcuaW4gYi9pbnRsL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkwNDliCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9jb25maWcuaW4KQEAgLTAsMCArMSwxMjggQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLworI3VuZGVmIGlubGluZQorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLworI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpIGxpYnJhcnkgKC1saSkuICAqLworI3VuZGVmIEhBVkVfTElCSQpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWd1cmUgYi9pbnRsL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDFlZWEwCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9jb25maWd1cmUKQEAgLTAsMCArMSwyOTUwIEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9ZGdldHRleHQuYworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU2MjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjE2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDYzMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjU0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njc3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzgzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3OTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODE3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODIyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKKyAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCisgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9CisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODQ2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CisgIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLU8yIgorICBmaQorZWxzZQorICBHQ0M9CisgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg3NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5MDM6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkyNDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTI5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5NTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTcyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk5MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTAzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMDM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTExMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTQzOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTc2OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjExOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIxNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI0NDogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjQ5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWYgSEFWRV9BTExPQ0FfSAorIyAgaW5jbHVkZSA8YWxsb2NhLmg+CisjIGVsc2UKKyMgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgZWxzZQorIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EubworICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMwNDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzM0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM4OTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzOTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDQxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQ0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0ODA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0ODUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTUzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTU0MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MDk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzE0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzQ5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzU0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3Nzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MDY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4MTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODY4OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4NzMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkwMTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTIxOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NDA6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE5NDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk2NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxOTcyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5OTU6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDAzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAzMDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDM1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE5NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI2NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MjU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0NTM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQ0NAJSRDQyVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkbmxzX2N2X2hlYWRlcl9saWJndCIKK2FjX2Rlc3RzPSIkbmxzX2N2X2hlYWRlcl9pbnRsIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCit0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWd1cmUuaW4gYi9pbnRsL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmE5YzI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW50bC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxMCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX0lOSVQoZGdldHRleHQuYykKK0FNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQorCitBTV9QUk9HX0lOU1RBTEwKK0NZX0dOVV9HRVRURVhUCitBQ19MSU5LX0ZJTEVTKCRubHNfY3ZfaGVhZGVyX2xpYmd0LCAkbmxzX2N2X2hlYWRlcl9pbnRsKQorCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9pbnRsL2RjZ2V0dGV4dC5jIGIvaW50bC9kY2dldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzE2YmZkCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9kY2dldHRleHQuYwpAQCAtMCwwICsxLDU5MyBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgZWxzZQorIyAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICBlbHNlCisjICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmbmRlZiBlcnJubworZXh0ZXJuIGludCBlcnJubzsKKyNlbmRpZgorI2lmbmRlZiBfX3NldF9lcnJubworIyBkZWZpbmUgX19zZXRfZXJybm8odmFsKSBlcnJubyA9ICh2YWwpCisjZW5kaWYKKworI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorY2hhciAqZ2V0ZW52ICgpOworIyBpZmRlZiBIQVZFX01BTExPQ19ICisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgZWxzZQordm9pZCBmcmVlICgpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQworIyBpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgIGRlZmluZSBfR05VX1NPVVJDRQkxCisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCisjIGlmbmRlZiBzdHJjaHIKKyMgIGRlZmluZSBzdHJjaHIgaW5kZXgKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHQuaCIKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdldHRleHQuaCIKKyNlbmRpZgorI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworI2lmZGVmIF9MSUJDCisvKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKKyAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KKyMgZGVmaW5lIGdldGN3ZCBfX2dldGN3ZAorIyBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5CisjZWxzZQorIyBpZiAhZGVmaW5lZCBIQVZFX0dFVENXRAorY2hhciAqZ2V0d2QgKCk7CisjICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSBnZXR3ZCAoYnVmKQorIyBlbHNlCitjaGFyICpnZXRjd2QgKCk7CisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX1NUUENQWQorc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBbW91bnQgdG8gaW5jcmVhc2UgYnVmZmVyIHNpemUgYnkgaW4gZWFjaCB0cnkuICAqLworI2RlZmluZSBQQVRIX0lOQ1IgMzIKKworLyogVGhlIGZvbGxvd2luZyBpcyBmcm9tIHBhdGhtYXguaC4gICovCisvKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKKyAgIFBBVEhfTUFYIGJ1dCBtaWdodCBjYXVzZSByZWRlZmluaXRpb24gd2FybmluZ3Mgd2hlbiBzeXMvcGFyYW0uaCBpcworICAgbGF0ZXIgaW5jbHVkZWQgKGFzIG9uIE1PUkUvQlNEIDQuMykuICAqLworI2lmIGRlZmluZWQoX1BPU0lYX1ZFUlNJT04pIHx8IChkZWZpbmVkKEhBVkVfTElNSVRTX0gpICYmICFkZWZpbmVkKF9fR05VQ19fKSkKKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfUE9TSVhfUEFUSF9NQVgKKyMgZGVmaW5lIF9QT1NJWF9QQVRIX01BWCAyNTUKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoX1BDX1BBVEhfTUFYKQorIyBkZWZpbmUgUEFUSF9NQVggKHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkgPCAxID8gMTAyNCA6IHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkpCisjZW5kaWYKKworLyogRG9uJ3QgaW5jbHVkZSBzeXMvcGFyYW0uaCBpZiBpdCBhbHJlYWR5IGhhcyBiZWVuLiAgKi8KKyNpZiBkZWZpbmVkKEhBVkVfU1lTX1BBUkFNX0gpICYmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiAhZGVmaW5lZChNQVhQQVRITEVOKQorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KKyNlbmRpZgorCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZgorCisvKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgorICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgIHNldHRpbmcgb2YgYGxvY2FsJy4nJworICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKKyAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAorICAgc3lzdGVtIChlLmcuIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAorI2VuZGlmCisKKy8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgZG9tYWluIHVzZWQgZm9yIGdldHRleHQoMykgcHJpb3IgYW55IGNhbGwgdG8KKyAgIHRleHRkb21haW4oMykuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBpcyAibWVzc2FnZXMiLiAgKi8KK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSA9ICJtZXNzYWdlcyI7CisKKy8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KK2NvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47CisKKy8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gR05VTE9DQUxFRElSOworCisvKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKKyAgIGNhbGxzLiAgKi8KK3N0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworc3RhdGljIGNoYXIgKmZpbmRfbXNnIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkKSk7CitzdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnkpKTsKK3N0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnksCisJCQkJCQkgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKSk7CisKKworLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworI2lmZGVmIEhBVkVfQUxMT0NBCisvKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KKyMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCisjIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCisjZWxzZQorc3RydWN0IGJsb2NrX2xpc3QKK3sKKyAgdm9pZCAqYWRkcmVzczsKKyAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Cit9OworIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAorICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKKyAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKKyAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKKyAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAorICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCisgICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCisgICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKKyAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyB1bmRlZiBhbGxvY2EKKyMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKKyNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLworCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENHRVRURVhUIGRjZ2V0dGV4dF9fCisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworY2hhciAqCitEQ0dFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKKyAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKyAgICAgY29uc3QgY2hhciAqbXNnaWQ7CisgICAgIGludCBjYXRlZ29yeTsKK3sKKyNpZm5kZWYgSEFWRV9BTExPQ0EKKyAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOworI2VuZGlmCisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKKyAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7CisgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKKyAgY29uc3QgY2hhciAqY2F0ZWdvcnl2YWx1ZTsKKyAgY2hhciAqZGlybmFtZSwgKnhkb21haW5uYW1lOworICBjaGFyICpzaW5nbGVfbG9jYWxlOworICBjaGFyICpyZXR2YWw7CisgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOworCisgIC8qIElmIG5vIHJlYWwgTVNHSUQgaXMgZ2l2ZW4gcmV0dXJuIE5VTEwuICAqLworICBpZiAobXNnaWQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBJZiBET01BSU5OQU1FIGlzIE5VTEwsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZWZhdWx0IGRvbWFpbi4gIElmCisgICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQorICAgICBkZWZpbnRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIC8qIEZpcnN0IGZpbmQgbWF0Y2hpbmcgYmluZGluZy4gICovCisgIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCisgICAgeworICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOworICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKKwkvKiBXZSBmb3VuZCBpdCEgICovCisJYnJlYWs7CisgICAgICBpZiAoY29tcGFyZSA8IDApCisJeworCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KKwkgIGJpbmRpbmcgPSBOVUxMOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoYmluZGluZyA9PSBOVUxMKQorICAgIGRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOworICBlbHNlIGlmIChiaW5kaW5nLT5kaXJuYW1lWzBdID09ICcvJykKKyAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLworICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7CisgICAgICBzaXplX3QgcGF0aF9tYXg7CisgICAgICBjaGFyICpyZXQ7CisKKyAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkKSBQQVRIX01BWDsKKyAgICAgIHBhdGhfbWF4ICs9IDI7CQkvKiBUaGUgZ2V0Y3dkIGRvY3Mgc2F5IHRvIGRvIHRoaXMuICAqLworCisgICAgICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKKyAgICAgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7CisKKyAgICAgIF9fc2V0X2Vycm5vICgwKTsKKyAgICAgIHdoaWxlICgocmV0ID0gZ2V0Y3dkIChkaXJuYW1lLCBwYXRoX21heCkpID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKQorCXsKKwkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKKwkgIGRpcm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHBhdGhfbWF4ICsgZGlybmFtZV9sZW4pOworCSAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKKwkgIF9fc2V0X2Vycm5vICgwKTsKKwl9CisKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKwl7CisJICAvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCisJICAgICBlcnJvciBidXQgc2ltcGx5IHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcuICAqLworCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKwkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKKwl9CisKKyAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKKyAgICB9CisKKyAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KKyAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOworICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOworCisgIHhkb21haW5uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5bmFtZSkKKwkJCQkgKyBzdHJsZW4gKGRvbWFpbm5hbWUpICsgNSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOworCisgIHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHN0cGNweSAoeGRvbWFpbm5hbWUsIGNhdGVnb3J5bmFtZSksICIvIiksCisJCSAgZG9tYWlubmFtZSksCisJICAiLm1vIik7CisKKyAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KKyAgc2luZ2xlX2xvY2FsZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeXZhbHVlKSArIDEpOworICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOworCisKKyAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCisgICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aCB0cmFuc2xhdGlvbi4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KKyAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCisJKytjYXRlZ29yeXZhbHVlOworICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKKwkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KKwkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCisJICAgICB3aWxsIHRha2UgcGxhY2UuICAqLworCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKKwkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7CisJICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQorCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7CisJICAqY3AgPSAnXDAnOworCX0KKworICAgICAgLyogSWYgdGhlIGN1cnJlbnQgbG9jYWxlIHZhbHVlIGlzIEMgKG9yIFBPU0lYKSB3ZSBkb24ndCBsb2FkIGEKKwkgZG9tYWluLiAgUmV0dXJuIHRoZSBNU0dJRC4gICovCisgICAgICBpZiAoc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiQyIpID09IDAKKwkgIHx8IHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIlBPU0lYIikgPT0gMCkKKwl7CisJICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CisJICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOworCSAgcmV0dXJuIChjaGFyICopIG1zZ2lkOworCX0KKworCisgICAgICAvKiBGaW5kIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlCisJIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KKyAgICAgIGRvbWFpbiA9IF9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgc2luZ2xlX2xvY2FsZSwgeGRvbWFpbm5hbWUpOworCisgICAgICBpZiAoZG9tYWluICE9IE5VTEwpCisJeworCSAgcmV0dmFsID0gZmluZF9tc2cgKGRvbWFpbiwgbXNnaWQpOworCisJICBpZiAocmV0dmFsID09IE5VTEwpCisJICAgIHsKKwkgICAgICBpbnQgY250OworCisJICAgICAgZm9yIChjbnQgPSAwOyBkb21haW4tPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQorCQl7CisJCSAgcmV0dmFsID0gZmluZF9tc2cgKGRvbWFpbi0+c3VjY2Vzc29yW2NudF0sIG1zZ2lkKTsKKworCQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgaWYgKHJldHZhbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworCSAgICAgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7CisJICAgICAgcmV0dXJuIHJldHZhbDsKKwkgICAgfQorCX0KKyAgICB9CisgIC8qIE5PVFJFQUNIRUQgKi8KK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOworI2VuZGlmCisKKworc3RhdGljIGNoYXIgKgorZmluZF9tc2cgKGRvbWFpbl9maWxlLCBtc2dpZCkKKyAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGU7CisgICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworeworICBzaXplX3QgdG9wLCBhY3QsIGJvdHRvbTsKKyAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKKworICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPT0gMCkKKyAgICBfbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlKTsKKworICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7CisKKyAgLyogTG9jYXRlIHRoZSBNU0dJRCBhbmQgaXRzIHRyYW5zbGF0aW9uLiAgKi8KKyAgaWYgKGRvbWFpbi0+aGFzaF9zaXplID4gMiAmJiBkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCisgICAgeworICAgICAgLyogVXNlIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KKyAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7CisgICAgICBubHNfdWludDMyIGhhc2hfdmFsID0gaGFzaF9zdHJpbmcgKG1zZ2lkKTsKKyAgICAgIG5sc191aW50MzIgaWR4ID0gaGFzaF92YWwgJSBkb21haW4tPmhhc2hfc2l6ZTsKKyAgICAgIG5sc191aW50MzIgaW5jciA9IDEgKyAoaGFzaF92YWwgJSAoZG9tYWluLT5oYXNoX3NpemUgLSAyKSk7CisgICAgICBubHNfdWludDMyIG5zdHIgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKKworICAgICAgaWYgKG5zdHIgPT0gMCkKKwkvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KKwlyZXR1cm4gTlVMTDsKKworICAgICAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5sZW5ndGgpID09IGxlbgorCSAgJiYgc3RyY21wIChtc2dpZCwKKwkJICAgICBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkgICAgICAgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ub2Zmc2V0KSkgPT0gMCkKKwlyZXR1cm4gKGNoYXIgKikgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJCSAgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQorCSAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOworCSAgZWxzZQorCSAgICBpZHggKz0gaW5jcjsKKworCSAgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOworCSAgaWYgKG5zdHIgPT0gMCkKKwkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCisJICAgIHJldHVybiBOVUxMOworCisJICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLmxlbmd0aCkgPT0gbGVuCisJICAgICAgJiYgc3RyY21wIChtc2dpZCwKKwkJCSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkJICAgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ub2Zmc2V0KSkKKwkgICAgICAgICA9PSAwKQorCSAgICByZXR1cm4gKGNoYXIgKikgZG9tYWluLT5kYXRhCisJICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbbnN0ciAtIDFdLm9mZnNldCk7CisJfQorICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKworICAvKiBOb3cgd2UgdHJ5IHRoZSBkZWZhdWx0IG1ldGhvZDogIGJpbmFyeSBzZWFyY2ggaW4gdGhlIHNvcnRlZAorICAgICBhcnJheSBvZiBtZXNzYWdlcy4gICovCisgIGJvdHRvbSA9IDA7CisgIHRvcCA9IGRvbWFpbi0+bnN0cmluZ3M7CisgIHdoaWxlIChib3R0b20gPCB0b3ApCisgICAgeworICAgICAgaW50IGNtcF92YWw7CisKKyAgICAgIGFjdCA9IChib3R0b20gKyB0b3ApIC8gMjsKKyAgICAgIGNtcF92YWwgPSBzdHJjbXAgKG1zZ2lkLCBkb21haW4tPmRhdGEKKwkJCSAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCSAgICBkb21haW4tPm9yaWdfdGFiW2FjdF0ub2Zmc2V0KSk7CisgICAgICBpZiAoY21wX3ZhbCA8IDApCisJdG9wID0gYWN0OworICAgICAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCisJYm90dG9tID0gYWN0ICsgMTsKKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisKKyAgLyogSWYgYW4gdHJhbnNsYXRpb24gaXMgZm91bmQgcmV0dXJuIHRoaXMuICAqLworICByZXR1cm4gYm90dG9tID49IHRvcCA/IE5VTEwgOiAoY2hhciAqKSBkb21haW4tPmRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkgICAgIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ub2Zmc2V0KTsKK30KKworCisvKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGxvY2FsZSBDQVRFR09SWS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitjYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSkKKyAgICAgaW50IGNhdGVnb3J5OworeworICBjb25zdCBjaGFyICpyZXR2YWw7CisKKyAgc3dpdGNoIChjYXRlZ29yeSkKKyAgeworI2lmZGVmIExDX0NPTExBVEUKKyAgY2FzZSBMQ19DT0xMQVRFOgorICAgIHJldHZhbCA9ICJMQ19DT0xMQVRFIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX0NUWVBFCisgIGNhc2UgTENfQ1RZUEU6CisgICAgcmV0dmFsID0gIkxDX0NUWVBFIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX01PTkVUQVJZCisgIGNhc2UgTENfTU9ORVRBUlk6CisgICAgcmV0dmFsID0gIkxDX01PTkVUQVJZIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX05VTUVSSUMKKyAgY2FzZSBMQ19OVU1FUklDOgorICAgIHJldHZhbCA9ICJMQ19OVU1FUklDIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX1RJTUUKKyAgY2FzZSBMQ19USU1FOgorICAgIHJldHZhbCA9ICJMQ19USU1FIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX01FU1NBR0VTCisgIGNhc2UgTENfTUVTU0FHRVM6CisgICAgcmV0dmFsID0gIkxDX01FU1NBR0VTIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX1JFU1BPTlNFCisgIGNhc2UgTENfUkVTUE9OU0U6CisgICAgcmV0dmFsID0gIkxDX1JFU1BPTlNFIjsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIExDX0FMTAorICBjYXNlIExDX0FMTDoKKyAgICAvKiBUaGlzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlIGJ1dCBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGFueSBvdGhlcgorICAgICAgIHZhbHVlLiAgKi8KKyAgICByZXR2YWwgPSAiTENfQUxMIjsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIC8qIElmIHlvdSBoYXZlIGEgYmV0dGVyIGlkZWEgZm9yIGEgZGVmYXVsdCB2YWx1ZSBsZXQgbWUga25vdy4gICovCisgICAgcmV0dmFsID0gIkxDX1hYWCI7CisgIH0KKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpCisgICAgIGludCBjYXRlZ29yeTsKKyAgICAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOworeworICBjb25zdCBjaGFyICpyZXR2YWw7CisKKyAgLyogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIGBMQU5HVUFHRScgZW52aXJvbm1lbnQKKyAgICAgdmFyaWFibGUuICBUaGlzIGlzIGEgR05VIGV4dGVuc2lvbi4gICovCisgIHJldHZhbCA9IGdldGVudiAoIkxBTkdVQUdFIik7CisgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKyAgICByZXR1cm4gcmV0dmFsOworCisgIC8qIGBMQU5HVUFHRScgaXMgbm90IHNldC4gIFNvIHdlIGhhdmUgdG8gcHJvY2VlZCB3aXRoIHRoZSBQT1NJWAorICAgICBtZXRob2RzIG9mIGxvb2tpbmcgdG8gYExDX0FMTCcsIGBMQ194eHgnLCBhbmQgYExBTkcnLiAgT24gc29tZQorICAgICBzeXN0ZW1zIHRoaXMgY2FuIGJlIGRvbmUgYnkgdGhlIGBzZXRsb2NhbGUnIGZ1bmN0aW9uIGl0c2VsZi4gICovCisjaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCisgIHJldHVybiBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKTsKKyNlbHNlCisgIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJ3cml0ZXMgYWxsIG90aGVyLiAgKi8KKyAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7CisgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKyAgICByZXR1cm4gcmV0dmFsOworCisgIC8qIE5leHQgY29tZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgY2F0ZWdvcnkuICAqLworICByZXR2YWwgPSBnZXRlbnYgKGNhdGVnb3J5bmFtZSk7CisgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKyAgICByZXR1cm4gcmV0dmFsOworCisgIC8qIExhc3QgcG9zc2liaWxpdHkgaXMgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLworICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7CisgIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKKyAgICByZXR1cm4gcmV0dmFsOworCisgIC8qIFdlIHVzZSBDIGFzIHRoZSBkZWZhdWx0IGRvbWFpbi4gIFBPU0lYIHNheXMgdGhpcyBpcyBpbXBsZW1lbnRhdGlvbgorICAgICBkZWZpbmVkLiAgKi8KKyAgcmV0dXJuICJDIjsKKyNlbmRpZgorfQorCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKKyAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCisgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQorICAgdG8gYmUgZGVmaW5lZC4gICovCisjaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQorc3RhdGljIGNoYXIgKgorc3RwY3B5IChkZXN0LCBzcmMpCisgICAgIGNoYXIgKmRlc3Q7CisgICAgIGNvbnN0IGNoYXIgKnNyYzsKK3sKKyAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorICAgIC8qIERvIG5vdGhpbmcuICovIDsKKyAgcmV0dXJuIGRlc3QgLSAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2RnZXR0ZXh0LmMgYi9pbnRsL2RnZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkZTY3NwotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvZGdldHRleHQuYwpAQCAtMCwwICsxLDU5IEBACisvKiBkZ2V0dGV4dC5jIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9MT0NBTEVfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAorI2Vsc2UKKyMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KKyMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXworI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLworY2hhciAqCitER0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQpCisgICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworeworICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19kZ2V0dGV4dCwgZGdldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2V4cGxvZGVuYW1lLmMgYi9pbnRsL2V4cGxvZGVuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjNDZlOQotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvZXhwbG9kZW5hbWUuYwpAQCAtMCwwICsxLDE4MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJsb2FkaW5mby5oIgorCisvKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KKyNpZm5kZWYgTlVMTAorIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCisjICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyMgZWxzZQorIyAgZGVmaW5lIE5VTEwgMAorIyBlbmRpZgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworaW50CitfbmxfZXhwbG9kZV9uYW1lIChuYW1lLCBsYW5ndWFnZSwgbW9kaWZpZXIsIHRlcnJpdG9yeSwgY29kZXNldCwKKwkJICBub3JtYWxpemVkX2NvZGVzZXQsIHNwZWNpYWwsIHNwb25zb3IsIHJldmlzaW9uKQorICAgICBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICoqbGFuZ3VhZ2U7CisgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllcjsKKyAgICAgY29uc3QgY2hhciAqKnRlcnJpdG9yeTsKKyAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQ7CisgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQ7CisgICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsOworICAgICBjb25zdCBjaGFyICoqc3BvbnNvcjsKKyAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uOworeworICBlbnVtIHsgdW5kZWNpZGVkLCB4cGcsIGNlbiB9IHN5bnRheDsKKyAgY2hhciAqY3A7CisgIGludCBtYXNrOworCisgICptb2RpZmllciA9IE5VTEw7CisgICp0ZXJyaXRvcnkgPSBOVUxMOworICAqY29kZXNldCA9IE5VTEw7CisgICpub3JtYWxpemVkX2NvZGVzZXQgPSBOVUxMOworICAqc3BlY2lhbCA9IE5VTEw7CisgICpzcG9uc29yID0gTlVMTDsKKyAgKnJldmlzaW9uID0gTlVMTDsKKworICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKKyAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKKyAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCisgIG1hc2sgPSAwOworICBzeW50YXggPSB1bmRlY2lkZWQ7CisgICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKKyAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ18nICYmIGNwWzBdICE9ICdAJworCSAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnKQorICAgICsrY3A7CisKKyAgaWYgKCpsYW5ndWFnZSA9PSBjcCkKKyAgICAvKiBUaGlzIGRvZXMgbm90IG1ha2Ugc2Vuc2U6IGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQuICBVc2UKKyAgICAgICB0aGlzIGVudHJ5IGFzIGl0IGlzIHdpdGhvdXQgZXhwbG9kaW5nLiAgUGVyaGFwcyBpdCBpcyBhbiBhbGlhcy4gICovCisgICAgY3AgPSBzdHJjaHIgKCpsYW5ndWFnZSwgJ1wwJyk7CisgIGVsc2UgaWYgKGNwWzBdID09ICdfJykKKyAgICB7CisgICAgICAvKiBOZXh0IGlzIHRoZSB0ZXJyaXRvcnkuICAqLworICAgICAgY3BbMF0gPSAnXDAnOworICAgICAgKnRlcnJpdG9yeSA9ICsrY3A7CisKKyAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcuJyAmJiBjcFswXSAhPSAnQCcKKwkgICAgICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQorCSsrY3A7CisKKyAgICAgIG1hc2sgfD0gVEVSUklUT1JZOworCisgICAgICBpZiAoY3BbMF0gPT0gJy4nKQorCXsKKwkgIC8qIE5leHQgaXMgdGhlIGNvZGVzZXQuICAqLworCSAgc3ludGF4ID0geHBnOworCSAgY3BbMF0gPSAnXDAnOworCSAgKmNvZGVzZXQgPSArK2NwOworCisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnQCcpCisJICAgICsrY3A7CisKKwkgIG1hc2sgfD0gWFBHX0NPREVTRVQ7CisKKwkgIGlmICgqY29kZXNldCAhPSBjcCAmJiAoKmNvZGVzZXQpWzBdICE9ICdcMCcpCisJICAgIHsKKwkgICAgICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gX25sX25vcm1hbGl6ZV9jb2Rlc2V0ICgqY29kZXNldCwKKwkJCQkJCQkgICBjcCAtICpjb2Rlc2V0KTsKKwkgICAgICBpZiAoc3RyY21wICgqY29kZXNldCwgKm5vcm1hbGl6ZWRfY29kZXNldCkgPT0gMCkKKwkJZnJlZSAoKGNoYXIgKikgKm5vcm1hbGl6ZWRfY29kZXNldCk7CisJICAgICAgZWxzZQorCQltYXNrIHw9IFhQR19OT1JNX0NPREVTRVQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChjcFswXSA9PSAnQCcgfHwgKHN5bnRheCAhPSB4cGcgJiYgY3BbMF0gPT0gJysnKSkKKyAgICB7CisgICAgICAvKiBOZXh0IGlzIHRoZSBtb2RpZmllci4gICovCisgICAgICBzeW50YXggPSBjcFswXSA9PSAnQCcgPyB4cGcgOiBjZW47CisgICAgICBjcFswXSA9ICdcMCc7CisgICAgICAqbW9kaWZpZXIgPSArK2NwOworCisgICAgICB3aGlsZSAoc3ludGF4ID09IGNlbiAmJiBjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcrJworCSAgICAgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKKwkrK2NwOworCisgICAgICBtYXNrIHw9IFhQR19NT0RJRklFUiB8IENFTl9BVURJRU5DRTsKKyAgICB9CisKKyAgaWYgKHN5bnRheCAhPSB4cGcgJiYgKGNwWzBdID09ICcrJyB8fCBjcFswXSA9PSAnLCcgfHwgY3BbMF0gPT0gJ18nKSkKKyAgICB7CisgICAgICBzeW50YXggPSBjZW47CisKKyAgICAgIGlmIChjcFswXSA9PSAnKycpCisJeworIAkgIC8qIE5leHQgaXMgc3BlY2lhbCBhcHBsaWNhdGlvbiAoQ0VOIHN5bnRheCkuICAqLworCSAgY3BbMF0gPSAnXDAnOworCSAgKnNwZWNpYWwgPSArK2NwOworCisJICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQorCSAgICArK2NwOworCisJICBtYXNrIHw9IENFTl9TUEVDSUFMOworCX0KKworICAgICAgaWYgKGNwWzBdID09ICcsJykKKwl7CisgCSAgLyogTmV4dCBpcyBzcG9uc29yIChDRU4gc3ludGF4KS4gICovCisJICBjcFswXSA9ICdcMCc7CisJICAqc3BvbnNvciA9ICsrY3A7CisKKwkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJykKKwkgICAgKytjcDsKKworCSAgbWFzayB8PSBDRU5fU1BPTlNPUjsKKwl9CisKKyAgICAgIGlmIChjcFswXSA9PSAnXycpCisJeworIAkgIC8qIE5leHQgaXMgcmV2aXNpb24gKENFTiBzeW50YXgpLiAgKi8KKwkgIGNwWzBdID0gJ1wwJzsKKwkgICpyZXZpc2lvbiA9ICsrY3A7CisKKwkgIG1hc2sgfD0gQ0VOX1JFVklTSU9OOworCX0KKyAgICB9CisKKyAgLyogRm9yIENFTiBzeW50YXggdmFsdWVzIGl0IG1pZ2h0IGJlIGltcG9ydGFudCB0byBoYXZlIHRoZQorICAgICBzZXBhcmF0b3IgY2hhcmFjdGVyIGluIHRoZSBmaWxlIG5hbWUsIG5vdCBmb3IgWFBHIHN5bnRheC4gICovCisgIGlmIChzeW50YXggPT0geHBnKQorICAgIHsKKyAgICAgIGlmICgqdGVycml0b3J5ICE9IE5VTEwgJiYgKCp0ZXJyaXRvcnkpWzBdID09ICdcMCcpCisJbWFzayAmPSB+VEVSUklUT1JZOworCisgICAgICBpZiAoKmNvZGVzZXQgIT0gTlVMTCAmJiAoKmNvZGVzZXQpWzBdID09ICdcMCcpCisJbWFzayAmPSB+WFBHX0NPREVTRVQ7CisKKyAgICAgIGlmICgqbW9kaWZpZXIgIT0gTlVMTCAmJiAoKm1vZGlmaWVyKVswXSA9PSAnXDAnKQorCW1hc2sgJj0gflhQR19NT0RJRklFUjsKKyAgICB9CisKKyAgcmV0dXJuIG1hc2s7Cit9CmRpZmYgLS1naXQgYS9pbnRsL2ZpbmRkb21haW4uYyBiL2ludGwvZmluZGRvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODVkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRsL2ZpbmRkb21haW4uYwpAQCAtMCwwICsxLDE4OSBAQAorLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9NQUxMT0NfSAorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjIGVsc2UKK3ZvaWQgZnJlZSAoKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGlmbmRlZiBtZW1jcHkKKyMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCisjIGVuZGlmCisjZW5kaWYKKyNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKKyMgaWZuZGVmIHN0cmNocgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dC5oIgorI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKy8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCitzdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOworCisKKy8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKKyAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5CisgICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCitzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKK19ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgbG9jYWxlLCBkb21haW5uYW1lKQorICAgICBjb25zdCBjaGFyICpkaXJuYW1lOworICAgICBjaGFyICpsb2NhbGU7CisgICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Cit7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKKyAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CisgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOworICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7CisgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7CisgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKKyAgY29uc3QgY2hhciAqc3BlY2lhbDsKKyAgY29uc3QgY2hhciAqc3BvbnNvcjsKKyAgY29uc3QgY2hhciAqcmV2aXNpb247CisgIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOworICBpbnQgbWFzazsKKworICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKKworCQlsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQorCisgICAgIGFuZCBzaXggcGFydHMgZm9yIHRoZSBDRU4gc3ludGF4OgorCisJbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bK2F1ZGllbmNlXVsrc3BlY2lhbF1bLFtzcG9uc29yXVtfcmV2aXNpb25dXQorCisgICAgIEJlc2lkZSB0aGUgZmlyc3QgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmIHRoZQorICAgICBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCisgICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0IHdpbGwgYmUgc3RyaXBwZWQgb2YgYWNjb3JkaW5nIHRvCisgICAgIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisJCSgxKSByZXZpc2lvbgorCQkoMikgc3BvbnNvcgorCQkoMykgc3BlY2lhbAorCQkoNCkgY29kZXNldAorCQkoNSkgbm9ybWFsaXplZCBjb2Rlc2V0CisJCSg2KSB0ZXJyaXRvcnkKKwkJKDcpIGF1ZGllbmNlL21vZGlmaWVyCisgICAqLworCisgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMgbG9jYWxlIGVudHJ5IHRoZXJlIGhhcyB0bworICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLworICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCisJCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIDAsIGxvY2FsZSwgTlVMTCwgTlVMTCwKKwkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMgbG9jYWxlLiAgKi8KKyAgICAgIGludCBjbnQ7CisKKyAgICAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKKwlfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7CisKKyAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCisJeworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKKwkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKKworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKKwkgICAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuIGNudCA+PSAwID8gcmV0dmFsIDogTlVMTDsKKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICB9CisKKyAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKKyAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCisgICAgIGRvbmUuICAqLworICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7CisgIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7CisgICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisgICAgICBpZiAobG9jYWxlID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKKyAgICB9CisKKyAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0CisgICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCisgICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLworICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKKwkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0LCAmc3BlY2lhbCwKKwkJCSAgICZzcG9uc29yLCAmcmV2aXNpb24pOworCisgIC8qIENyZWF0ZSBhbGwgcG9zc2libGUgbG9jYWxlIGVudHJpZXMgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RlZCBpbgorICAgICBnZW5lcmFsaXphdGlvbi4gICovCisgIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKKwkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgbWFzaywgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwKKwkJCSAgICAgICBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAorCQkJICAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBkb21haW5uYW1lLCAxKTsKKyAgaWYgKHJldHZhbCA9PSBOVUxMKQorICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCisgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOworICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCisgICAgeworICAgICAgaW50IGNudDsKKyAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKwl7CisJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQorCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KKyAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCisgICAgZnJlZSAobG9jYWxlKTsKKworICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0LmMgYi9pbnRsL2dldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM2ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9nZXR0ZXh0LmMKQEAgLTAsMCArMSw3MCBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dCgzKSBmdW5jdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIF9fbmVlZF9OVUxMCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWZkZWYgU1REQ19IRUFERVJTCisjICBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLworIyBlbHNlCisjICBpZmRlZiBIQVZFX1NUUklOR19ICisjICAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBlbHNlCisjICAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEdFVFRFWFQgX19nZXR0ZXh0CisjIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgR0VUVEVYVCBnZXR0ZXh0X18KKyMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KK2NoYXIgKgorR0VUVEVYVCAobXNnaWQpCisgICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworeworICByZXR1cm4gREdFVFRFWFQgKE5VTEwsIG1zZ2lkKTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZ2V0dGV4dCwgZ2V0dGV4dCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dC5oIGIvaW50bC9nZXR0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0YjllMwotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvZ2V0dGV4dC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBJbnRlcm5hbCBoZWFkZXIgZm9yIEdOVSBnZXR0ZXh0IGludGVybmF0aW9uYWxpemF0aW9uIGZ1bmN0aW9ucworICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVFRFWFRfSAorI2RlZmluZSBfR0VUVEVYVF9IIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBIQVZFX0xJTUlUU19IIHx8IF9MSUJDCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQuICAqLworI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQorI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1CisKKy8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KKyNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKKworLyogVGhlIGZvbGxvd2luZyBjb250b3J0aW9ucyBhcmUgYW4gYXR0ZW1wdCB0byB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yCisgICB0byBkZXRlcm1pbmUgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIDMyIGJpdHMgd2lkZS4gIEFuCisgICBhbHRlcm5hdGl2ZSBhcHByb2FjaCBpcyB0byB1c2UgYXV0b2NvbmYncyBBQ19DSEVDS19TSVpFT0YgbWFjcm8sIGJ1dAorICAgZG9pbmcgdGhhdCB3b3VsZCByZXF1aXJlIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29tcGlsZSBhbmQgKnJ1bioKKyAgIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZS4gIExvY2FsbHkgcnVubmluZyBjcm9zcy1jb21waWxlZCBleGVjdXRhYmxlcworICAgaXMgdXN1YWxseSBub3QgcG9zc2libGUuICAqLworCisjaWYgX19TVERDX18KKyMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgNDI5NDk2NzI5NVUKKyNlbHNlCisjIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDB4RkZGRkZGRkYKKyNlbmRpZgorCisvKiBJZiBVSU5UX01BWCBpc24ndCBkZWZpbmVkLCBhc3N1bWUgaXQncyBhIDMyLWJpdCB0eXBlLgorICAgVGhpcyBzaG91bGQgYmUgdmFsaWQgZm9yIGFsbCBzeXN0ZW1zIEdOVSBjYXJlcyBhYm91dCBiZWNhdXNlCisgICB0aGF0IGRvZXNuJ3QgaW5jbHVkZSAxNi1iaXQgc3lzdGVtcywgYW5kIG9ubHkgbW9kZXJuIHN5c3RlbXMKKyAgICh0aGF0IGNlcnRhaW5seSBoYXZlIDxsaW1pdHMuaD4pIGhhdmUgNjQrLWJpdCBpbnRlZ3JhbCB0eXBlcy4gICovCisKKyNpZm5kZWYgVUlOVF9NQVgKKyMgZGVmaW5lIFVJTlRfTUFYIFVJTlRfTUFYXzMyX0JJVFMKKyNlbmRpZgorCisjaWYgVUlOVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBubHNfdWludDMyOworI2Vsc2UKKyMgaWYgVVNIUlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgbmxzX3VpbnQzMjsKKyMgZWxzZQorIyAgaWYgVUxPTkdfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBubHNfdWludDMyOworIyAgZWxzZQorICAvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgaW50ZW5kZWQgdG8gdGhyb3cgYW4gZXJyb3IuICBVc2luZyAjZXJyb3IgaXMKKyAgICAgbm90IHBvcnRhYmxlIGVub3VnaC4gICovCisgICJDYW5ub3QgZGV0ZXJtaW5lIHVuc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUuIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIEhlYWRlciBmb3IgYmluYXJ5IC5tbyBmaWxlIGZvcm1hdC4gICovCitzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIKK3sKKyAgLyogVGhlIG1hZ2ljIG51bWJlci4gICovCisgIG5sc191aW50MzIgbWFnaWM7CisgIC8qIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0LiAgKi8KKyAgbmxzX3VpbnQzMiByZXZpc2lvbjsKKyAgLyogVGhlIG51bWJlciBvZiBzdHJpbmdzIHBhaXJzLiAgKi8KKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KKyAgbmxzX3VpbnQzMiBvcmlnX3RhYl9vZmZzZXQ7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRpb24gc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKKyAgLyogU2l6ZSBvZiBoYXNoaW5nIHRhYmxlLiAgKi8KKyAgbmxzX3VpbnQzMiBoYXNoX3RhYl9zaXplOworICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaGluZyBlbnRyeS4gICovCisgIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OworfTsKKworc3RydWN0IHN0cmluZ19kZXNjCit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KKyAgbmxzX3VpbnQzMiBsZW5ndGg7CisgIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCisgIG5sc191aW50MzIgb2Zmc2V0OworfTsKKworLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisKKyNlbmRpZgkvKiBnZXR0ZXh0LmggICovCmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHRQLmggYi9pbnRsL2dldHRleHRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZDU1MgotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvZ2V0dGV4dFAuaApAQCAtMCwwICsxLDczIEBACisvKiBIZWFkZXIgZGVzY3JpYmluZyBpbnRlcm5hbHMgb2YgZ2V0dGV4dCBsaWJyYXJ5CisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX0dFVFRFWFRQX0gKKyNkZWZpbmUgX0dFVFRFWFRQX0gKKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworI2lmbmRlZiBQQVJBTVMKKyMgaWYgX19TVERDX18KKyMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncworIyBlbHNlCisjICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXCisjIGRlZmluZSBXKGZsYWcsIGRhdGEpICgoZmxhZykgPyBTV0FQIChkYXRhKSA6IChkYXRhKSkKKyNlbmRpZgorCisKK3N0YXRpYyBubHNfdWludDMyIFNXQVAgUEFSQU1TICgobmxzX3VpbnQzMiBpKSk7CisKK3N0YXRpYyBpbmxpbmUgbmxzX3VpbnQzMgorU1dBUCAoaSkKKyAgICAgbmxzX3VpbnQzMiBpOworeworICByZXR1cm4gKGkgPDwgMjQpIHwgKChpICYgMHhmZjAwKSA8PCA4KSB8ICgoaSA+PiA4KSAmIDB4ZmYwMCkgfCAoaSA+PiAyNCk7Cit9CisKKworc3RydWN0IGxvYWRlZF9kb21haW4KK3sKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgaW50IG11c3Rfc3dhcDsKKyAgbmxzX3VpbnQzMiBuc3RyaW5nczsKKyAgc3RydWN0IHN0cmluZ19kZXNjICpvcmlnX3RhYjsKKyAgc3RydWN0IHN0cmluZ19kZXNjICp0cmFuc190YWI7CisgIG5sc191aW50MzIgaGFzaF9zaXplOworICBubHNfdWludDMyICpoYXNoX3RhYjsKK307CisKK3N0cnVjdCBiaW5kaW5nCit7CisgIHN0cnVjdCBiaW5kaW5nICpuZXh0OworICBjaGFyICpkb21haW5uYW1lOworICBjaGFyICpkaXJuYW1lOworfTsKKworc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZGlybmFtZSwKKwkJCQkJCSBjaGFyICpfX2xvY2FsZSwKKwkJCQkJCSBjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKK3ZvaWQgX25sX2xvYWRfZG9tYWluIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluKSk7CisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisjZW5kaWYgLyogZ2V0dGV4dFAuaCAgKi8KZGlmZiAtLWdpdCBhL2ludGwvaGFzaC1zdHJpbmcuaCBiL2ludGwvaGFzaC1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjZlODQxCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9oYXNoLXN0cmluZy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEltcGxlbWVudHMgYSBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9WQUxVRVNfSAorIyBpbmNsdWRlIDx2YWx1ZXMuaD4KKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZm5kZWYgUEFSQU1TCisjIGlmIF9fU1REQ19fCisjICBkZWZpbmUgUEFSQU1TKEFyZ3MpIEFyZ3MKKyMgZWxzZQorIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSAoKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdlIGFzc3VtZSB0byBoYXZlIGB1bnNpZ25lZCBsb25nIGludCcgdmFsdWUgd2l0aCBhdCBsZWFzdCAzMiBiaXRzLiAgKi8KKyNkZWZpbmUgSEFTSFdPUkRCSVRTIDMyCisKKworLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKKyAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKKyAgIDE5ODYsIDE5ODcgQmVsbCBUZWxlcGhvbmUgTGFib3JhdG9yaWVzLCBJbmMuXSAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fc3RyX3BhcmFtKSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworaGFzaF9zdHJpbmcgKHN0cl9wYXJhbSkKKyAgICAgY29uc3QgY2hhciAqc3RyX3BhcmFtOworeworICB1bnNpZ25lZCBsb25nIGludCBodmFsLCBnOworICBjb25zdCBjaGFyICpzdHIgPSBzdHJfcGFyYW07CisKKyAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHN0cmluZy4gICovCisgIGh2YWwgPSAwOworICB3aGlsZSAoKnN0ciAhPSAnXDAnKQorICAgIHsKKyAgICAgIGh2YWwgPDw9IDQ7CisgICAgICBodmFsICs9ICh1bnNpZ25lZCBsb25nKSAqc3RyKys7CisgICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZykgMHhmIDw8IChIQVNIV09SREJJVFMgLSA0KSk7CisgICAgICBpZiAoZyAhPSAwKQorCXsKKwkgIGh2YWwgXj0gZyA+PiAoSEFTSFdPUkRCSVRTIC0gOCk7CisJICBodmFsIF49IGc7CisJfQorICAgIH0KKyAgcmV0dXJuIGh2YWw7Cit9CmRpZmYgLS1naXQgYS9pbnRsL2ludGwtY29tcGF0LmMgYi9pbnRsL2ludGwtY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZWZhMAotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvaW50bC1jb21wYXQuYwpAQCAtMCwwICsxLDc2IEBACisvKiBpbnRsLWNvbXBhdC5jIC0gU3R1YiBmdW5jdGlvbnMgdG8gY2FsbCBnZXR0ZXh0IGZ1bmN0aW9ucyBmcm9tIEdOVSBnZXR0ZXh0CisgICBMaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmdldHRleHQuaCIKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisKKyN1bmRlZiBnZXR0ZXh0CisjdW5kZWYgZGdldHRleHQKKyN1bmRlZiBkY2dldHRleHQKKyN1bmRlZiB0ZXh0ZG9tYWluCisjdW5kZWYgYmluZHRleHRkb21haW4KKworCitjaGFyICoKK2JpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKQorICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworICAgICBjb25zdCBjaGFyICpkaXJuYW1lOworeworICByZXR1cm4gYmluZHRleHRkb21haW5fXyAoZG9tYWlubmFtZSwgZGlybmFtZSk7Cit9CisKKworY2hhciAqCitkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkKKyAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKKyAgICAgY29uc3QgY2hhciAqbXNnaWQ7CisgICAgIGludCBjYXRlZ29yeTsKK3sKKyAgcmV0dXJuIGRjZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOworfQorCisKK2NoYXIgKgorZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKQorICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworICAgICBjb25zdCBjaGFyICptc2dpZDsKK3sKKyAgcmV0dXJuIGRnZXR0ZXh0X18gKGRvbWFpbm5hbWUsIG1zZ2lkKTsKK30KKworCitjaGFyICoKK2dldHRleHQgKG1zZ2lkKQorICAgICBjb25zdCBjaGFyICptc2dpZDsKK3sKKyAgcmV0dXJuIGdldHRleHRfXyAobXNnaWQpOworfQorCisKK2NoYXIgKgordGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKKyAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKK3sKKyAgcmV0dXJuIHRleHRkb21haW5fXyAoZG9tYWlubmFtZSk7Cit9CmRpZmYgLS1naXQgYS9pbnRsL2ludGxoLmluc3QuaW4gYi9pbnRsL2ludGxoLmluc3QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMzIzYwotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvaW50bGguaW5zdC5pbgpAQCAtMCwwICsxLDExMSBAQAorLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9MSUJJTlRMX0gKKyNkZWZpbmUgX0xJQklOVExfSAkxCisKK0BJTkNMVURFX0xPQ0FMRV9IQAorCisvKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKyAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLworI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisKKyNpZm5kZWYgUEFSQU1TCisjIGlmIF9fU1REQ19fCisjICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKKyMgZWxzZQorIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCitleHRlcm4gY2hhciAqZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7CisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpkZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQkJaW50IF9fY2F0ZWdvcnkpKTsKKworCisvKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKyAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCisgICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KK2V4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOworCisvKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KK2V4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKKworCisvKiBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgKi8KKyNpZiBkZWZpbmVkIF9fT1BUSU1JWkVECisvKiBUaGVzZSBtdXN0IGJlIGEgbWFjcm8uICBJbmxpbmVkIGZ1bmN0aW9ucyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZQorICAgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBwcmVkaWNhdGUgaW4gZGNnZXR0ZXh0IHdvdWxkIGFsd2F5cyByZXR1cm4KKyAgIGZhbHNlLiAgKi8KKworIyBkZWZpbmUgZ2V0dGV4dChtc2dpZCkgZGdldHRleHQgKChjaGFyICopIDAsIG1zZ2lkKQorCisjIGRlZmluZSBkZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCkJCQkJCSAgICAgIFwKKyAgZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpCisKKyMgaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcpCisvKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAorICAgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYWxsCisgICB0cmFuc2xhdGlvbnMuICAqLworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCisjICBkZWZpbmUgZGNnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkLCBjYXRlZ29yeSkJCQkgICAgICBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7CQkJCQkJCQkJICAgICAgXAorICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAorICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKG1zZ2lkKSkJCQkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisJIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCisJIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAorCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCisJICAgewkJCQkJCQkJICAgICAgXAorCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCisJICAgICAgIChkY2dldHRleHQpICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkJICAgICAgXAorCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAorCSAgIH0JCQkJCQkJCSAgICAgIFwKKwkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCisgICAgICAgfQkJCQkJCQkJICAgICAgXAorICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICAgX19yZXN1bHQgPSAoZGNnZXR0ZXh0KSAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJICAgICAgXAorICAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKKyAgICB9KSkKKyMgZW5kaWYKKyNlbmRpZiAvKiBPcHRpbWl6aW5nLiAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBsaWJpbnRsLmggKi8KZGlmZiAtLWdpdCBhL2ludGwvbDEwbmZsaXN0LmMgYi9pbnRsL2wxMG5mbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmJjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRsL2wxMG5mbGlzdC5jCkBAIC0wLDAgKzEsNDA5IEBACisvKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncworICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGlmbmRlZiBfR05VX1NPVVJDRQorIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGlmbmRlZiBtZW1jcHkKKyMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCisjIGVuZGlmCisjZW5kaWYKKyNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKKyMgaWZuZGVmIHN0cmNocgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKKyMgaW5jbHVkZSA8YXJnei5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxvYWRpbmZvLmgiCisKKy8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLworI2lmbmRlZiBOVUxMCisjIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KKyMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQorIyBlbHNlCisjICBkZWZpbmUgTlVMTCAwCisjIGVuZGlmCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQorI2Vsc2UKKyMgaWZuZGVmIEhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIERlZmluZSBmdW5jdGlvbiB3aGljaCBhcmUgdXN1YWxseSBub3QgYXZhaWxhYmxlLiAgKi8KKworI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX0NPVU5UCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBBUkdaLiAgKi8KK3N0YXRpYyBzaXplX3QgYXJnel9jb3VudF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pKTsKKworc3RhdGljIHNpemVfdAorYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCisgICAgIGNvbnN0IGNoYXIgKmFyZ3o7CisgICAgIHNpemVfdCBsZW47Cit7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7CisgICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKKyAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgcmV0dXJuIGNvdW50OworfQorIyB1bmRlZiBfX2FyZ3pfY291bnQKKyMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQorI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KKworI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQorLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncworICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLworc3RhdGljIHZvaWQgYXJnel9zdHJpbmdpZnlfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKSk7CisKK3N0YXRpYyB2b2lkCithcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKKyAgICAgY2hhciAqYXJnejsKKyAgICAgc2l6ZV90IGxlbjsKKyAgICAgaW50IHNlcDsKK3sKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKKyAgICAgIGFyZ3ogKz0gcGFydF9sZW47CisgICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOworICAgICAgaWYgKGxlbiA+IDApCisJKmFyZ3orKyA9IHNlcDsKKyAgICB9Cit9CisjIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKKyMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQorI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCisKKyNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCitzdGF0aWMgY2hhciAqYXJnel9uZXh0X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLAorCQkJCSAgY29uc3QgY2hhciAqZW50cnkpKTsKKworc3RhdGljIGNoYXIgKgorYXJnel9uZXh0X18gKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkKKyAgICAgY2hhciAqYXJnejsKKyAgICAgc2l6ZV90IGFyZ3pfbGVuOworICAgICBjb25zdCBjaGFyICplbnRyeTsKK3sKKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKKyAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7CisKKyAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7CisgICAgfQorICBlbHNlCisgICAgaWYgKGFyZ3pfbGVuID4gMCkKKyAgICAgIHJldHVybiBhcmd6OworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworfQorIyB1bmRlZiBfX2FyZ3pfbmV4dAorIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCisjZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCisKKworLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KK3N0YXRpYyBpbnQgcG9wIFBBUkFNUyAoKGludCB4KSk7CisKK3N0YXRpYyBpbmxpbmUgaW50Citwb3AgKHgpCisgICAgIGludCB4OworeworICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCisgIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKKyAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOworICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7CisgIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7CisKKyAgcmV0dXJuIHg7Cit9CisKKwwKK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgorX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgbWFzaywgbGFuZ3VhZ2UsCisJCSAgICB0ZXJyaXRvcnksIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCisJCSAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIGRvX2FsbG9jYXRlKQorICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdDsKKyAgICAgY29uc3QgY2hhciAqZGlybGlzdDsKKyAgICAgc2l6ZV90IGRpcmxpc3RfbGVuOworICAgICBpbnQgbWFzazsKKyAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CisgICAgIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKKyAgICAgY29uc3QgY2hhciAqY29kZXNldDsKKyAgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OworICAgICBjb25zdCBjaGFyICptb2RpZmllcjsKKyAgICAgY29uc3QgY2hhciAqc3BlY2lhbDsKKyAgICAgY29uc3QgY2hhciAqc3BvbnNvcjsKKyAgICAgY29uc3QgY2hhciAqcmV2aXNpb247CisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZG9fYWxsb2NhdGU7Cit7CisgIGNoYXIgKmFic19maWxlbmFtZTsKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbGFzdCA9IE5VTEw7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKKyAgY2hhciAqY3A7CisgIHNpemVfdCBlbnRyaWVzOworICBpbnQgY250OworCisgIC8qIEFsbG9jYXRlIHJvb20gZm9yIHRoZSBmdWxsIGZpbGUgbmFtZS4gICovCisgIGFic19maWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlybGlzdF9sZW4KKwkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKKwkJCQkgICsgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwCisJCQkJICAgICA/IHN0cmxlbiAodGVycml0b3J5KSArIDEgOiAwKQorCQkJCSAgKyAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAorCQkJCSAgICAgPyBzdHJsZW4gKGNvZGVzZXQpICsgMSA6IDApCisJCQkJICArICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDAKKwkJCQkgICAgID8gc3RybGVuIChub3JtYWxpemVkX2NvZGVzZXQpICsgMSA6IDApCisJCQkJICArICgoKG1hc2sgJiBYUEdfTU9ESUZJRVIpICE9IDAKKwkJCQkgICAgICB8fCAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCkKKwkJCQkgICAgID8gc3RybGVuIChtb2RpZmllcikgKyAxIDogMCkKKwkJCQkgICsgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDAKKwkJCQkgICAgID8gc3RybGVuIChzcGVjaWFsKSArIDEgOiAwKQorCQkJCSAgKyAoKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKKwkJCQkgICAgICB8fCAobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKKwkJCQkgICAgID8gKDEgKyAoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAorCQkJCQkgICAgID8gc3RybGVuIChzcG9uc29yKSArIDEgOiAwKQorCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAorCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCisJCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOworCisgIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR2YWwgPSBOVUxMOworICBsYXN0ID0gTlVMTDsKKworICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KKyAgbWVtY3B5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3QsIGRpcmxpc3RfbGVuKTsKKyAgX19hcmd6X3N0cmluZ2lmeSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0X2xlbiwgJzonKTsKKyAgY3AgPSBhYnNfZmlsZW5hbWUgKyAoZGlybGlzdF9sZW4gLSAxKTsKKyAgKmNwKysgPSAnLyc7CisgIGNwID0gc3RwY3B5IChjcCwgbGFuZ3VhZ2UpOworCisgIGlmICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICdfJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgdGVycml0b3J5KTsKKyAgICB9CisgIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQorICAgIHsKKyAgICAgICpjcCsrID0gJy4nOworICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKKyAgICB9CisgIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCisgICAgeworICAgICAgKmNwKysgPSAnLic7CisgICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7CisgICAgfQorICBpZiAoKG1hc2sgJiAoWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgcGFydCBvZiBib3RoIHN5bnRhY2VzIGJ1dCBoYXMgZGlmZmVyZW50CisJIGxlYWRpbmcgY2hhcmFjdGVycy4gIEZvciBDRU4gd2UgdXNlIGArJywgZWxzZSBgQCcuICAqLworICAgICAgKmNwKysgPSAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCA/ICcrJyA6ICdAJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOworICAgIH0KKyAgaWYgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDApCisgICAgeworICAgICAgKmNwKysgPSAnKyc7CisgICAgICBjcCA9IHN0cGNweSAoY3AsIHNwZWNpYWwpOworICAgIH0KKyAgaWYgKChtYXNrICYgKENFTl9TUE9OU09SIHwgQ0VOX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICcsJzsKKyAgICAgIGlmICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwKQorCWNwID0gc3RwY3B5IChjcCwgc3BvbnNvcik7CisgICAgICBpZiAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCisJeworCSAgKmNwKysgPSAnXyc7CisJICBjcCA9IHN0cGNweSAoY3AsIHJldmlzaW9uKTsKKwl9CisgICAgfQorCisgICpjcCsrID0gJy8nOworICBzdHBjcHkgKGNwLCBmaWxlbmFtZSk7CisKKyAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5CisgICAgIGF2YWlsYWJsZS4gICovCisgIGxhc3QgPSBOVUxMOworICBmb3IgKHJldHZhbCA9ICpsMTBuZmlsZV9saXN0OyByZXR2YWwgIT0gTlVMTDsgcmV0dmFsID0gcmV0dmFsLT5uZXh0KQorICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCisgICAgICB7CisJaW50IGNvbXBhcmUgPSBzdHJjbXAgKHJldHZhbC0+ZmlsZW5hbWUsIGFic19maWxlbmFtZSk7CisJaWYgKGNvbXBhcmUgPT0gMCkKKwkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KKwkgIGJyZWFrOworCWlmIChjb21wYXJlIDwgMCkKKwkgIHsKKwkgICAgLyogSXQncyBub3QgaW4gdGhlIGxpc3QuICAqLworCSAgICByZXR2YWwgPSBOVUxMOworCSAgICBicmVhazsKKwkgIH0KKworCWxhc3QgPSByZXR2YWw7CisgICAgICB9CisKKyAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCisgICAgeworICAgICAgZnJlZSAoYWJzX2ZpbGVuYW1lKTsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgIHJldHZhbCA9IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCisgICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpICsgKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pCisJCQkJKiAoMSA8PCBwb3AgKG1hc2spKQorCQkJCSogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7CisgIGlmIChyZXR2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR2YWwtPmZpbGVuYW1lID0gYWJzX2ZpbGVuYW1lOworICByZXR2YWwtPmRlY2lkZWQgPSAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgIT0gMQorCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCisJCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7CisgIHJldHZhbC0+ZGF0YSA9IE5VTEw7CisKKyAgaWYgKGxhc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR2YWwtPm5leHQgPSAqbDEwbmZpbGVfbGlzdDsKKyAgICAgICpsMTBuZmlsZV9saXN0ID0gcmV0dmFsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHZhbC0+bmV4dCA9IGxhc3QtPm5leHQ7CisgICAgICBsYXN0LT5uZXh0ID0gcmV0dmFsOworICAgIH0KKworICBlbnRyaWVzID0gMDsKKyAgLyogSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgdGhlIFJFVFZBTCBlbnRyeSBjb3JyZXNwb25kcyBub3QgdG8KKyAgICAgYSByZWFsIGZpbGUuICBTbyB3ZSBoYXZlIHRvIHVzZSB0aGUgRElSTElTVCBzZXBhcmF0aW9uIG1lY2hhbmlzbQorICAgICBvZiB0aGUgaW5uZXIgbG9vcC4gICovCisgIGNudCA9IF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pID09IDEgPyBtYXNrIC0gMSA6IG1hc2s7CisgIGZvciAoOyBjbnQgPj0gMDsgLS1jbnQpCisgICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAorCSYmICgoY250ICYgQ0VOX1NQRUNJRklDKSA9PSAwIHx8IChjbnQgJiBYUEdfU1BFQ0lGSUMpID09IDApCisJJiYgKChjbnQgJiBYUEdfQ09ERVNFVCkgPT0gMCB8fCAoY250ICYgWFBHX05PUk1fQ09ERVNFVCkgPT0gMCkpCisgICAgICB7CisJLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCisJY2hhciAqZGlyID0gTlVMTDsKKworCXdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQorCSAgICAgICAhPSBOVUxMKQorCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQorCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLCBjbnQsCisJCQkJICBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAorCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKwkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7CisgICAgICB9CisgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXNdID0gTlVMTDsKKworICByZXR1cm4gcmV0dmFsOworfQorDAorLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAorICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KKyAgIG5hbWVzLiAgKi8KK2NvbnN0IGNoYXIgKgorX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb2Rlc2V0LCBuYW1lX2xlbikKKyAgICAgY29uc3QgY2hhciAqY29kZXNldDsKKyAgICAgc2l6ZV90IG5hbWVfbGVuOworeworICBpbnQgbGVuID0gMDsKKyAgaW50IG9ubHlfZGlnaXQgPSAxOworICBjaGFyICpyZXR2YWw7CisgIGNoYXIgKndwOworICBzaXplX3QgY250OworCisgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQorICAgIGlmIChpc2FsbnVtIChjb2Rlc2V0W2NudF0pKQorICAgICAgeworCSsrbGVuOworCisJaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCisJICBvbmx5X2RpZ2l0ID0gMDsKKyAgICAgIH0KKworICByZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKChvbmx5X2RpZ2l0ID8gMyA6IDApICsgbGVuICsgMSk7CisKKyAgaWYgKHJldHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvbmx5X2RpZ2l0KQorCXdwID0gc3RwY3B5IChyZXR2YWwsICJpc28iKTsKKyAgICAgIGVsc2UKKwl3cCA9IHJldHZhbDsKKworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCisJaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCisJICAqd3ArKyA9IHRvbG93ZXIgKGNvZGVzZXRbY250XSk7CisJZWxzZSBpZiAoaXNkaWdpdCAoY29kZXNldFtjbnRdKSkKKwkgICp3cCsrID0gY29kZXNldFtjbnRdOworCisgICAgICAqd3AgPSAnXDAnOworICAgIH0KKworICByZXR1cm4gKGNvbnN0IGNoYXIgKikgcmV0dmFsOworfQorCisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisvKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQorICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKKyAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCisgICB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqCitzdHBjcHkgKGRlc3QsIHNyYykKKyAgICAgY2hhciAqZGVzdDsKKyAgICAgY29uc3QgY2hhciAqc3JjOworeworICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisgICAgLyogRG8gbm90aGluZy4gKi8gOworICByZXR1cm4gZGVzdCAtIDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvbGliZ2V0dGV4dC5oIGIvaW50bC9saWJnZXR0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0ZGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvbGliZ2V0dGV4dC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU29sYXJpcykgd2Ugc29tZXRpbWVzIGhhdmUgdG8gaW5jbHVkZQorICAgdGhlIHN5c3RlbXMgbGliaW50bC5oIGFzIHdlbGwgYXMgdGhpcyBmaWxlIHdlIGhhdmUgbW9yZSBjb21wbGV4CisgICBpbmNsdWRlIHByb3RlY3Rpb24gYWJvdmUuICBCdXQgdGhlIHN5c3RlbXMgaGVhZGVyIG1pZ2h0IHBlcmhhcHMgYWxzbworICAgZGVmaW5lIF9MSUJJTlRMX0ggYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIHByb3RlY3QgdGhlIGRlZmluaXRpb24gaGVyZS4gICovCisKKyNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkgfHwgIWRlZmluZWQgKF9MSUJHRVRURVhUX0gpCisjaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpCisjIGRlZmluZSBfTElCSU5UTF9ICTEKKyNlbmRpZgorI2RlZmluZSBfTElCR0VUVEVYVF9ICTEKKworLyogV2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSB0aGUgR05VCisgICBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0LiAgKi8KKyNkZWZpbmUgX19VU0VfR05VX0dFVFRFWFQgMQorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBIQVZFX0xPQ0FMRV9ICisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZm5kZWYgUEFSQU1TCisjIGlmIF9fU1REQ19fCisjICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKKyMgZWxzZQorIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorIyBpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fR05VQ19fCisjICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyMgZWxzZQorIyAgZGVmaW5lIE5VTEwgKDApCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFIQVZFX0xDX01FU1NBR0VTCisvKiBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpCisgICBmdW5jdGlvbi4gIEJ1dCBzb21lIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoaXMgZGVmaW5lZC4gIERlZmluZSBpdAorICAgdG8gYSBkZWZhdWx0IHZhbHVlLiAgKi8KKyMgZGVmaW5lIExDX01FU1NBR0VTICgtMSkKKyNlbmRpZgorCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4gIERlcml2ZWQgZnJvbQorICAgSmltIE1leWVyaW5nJ3MgbGliaW50bC5oLiAgKi8KK3N0cnVjdCBfbXNnX2VudAoreworICBjb25zdCBjaGFyICpfbXNnOworICBpbnQgX21zZ19udW1iZXI7Cit9OworCisKKyNpZiBIQVZFX0NBVEdFVFMKKy8qIFRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHkgYnkgcG8tdG8tdGJsLnNlZAorICAgZ2VuZXJhdGVkIGZpbGUgYGNhdC1pZC10YmwuYycuICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBfbXNnX2VudCBfbXNnX3RibFtdOworZXh0ZXJuIGludCBfbXNnX3RibF9sZW5ndGg7CisjZW5kaWYKKworCisvKiBGb3IgYXV0b21hdGljYWwgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcyBzb21ldGltZXMgbm8gcmVhbAorICAgdHJhbnNsYXRpb24gaXMgbmVlZGVkLiAgSW5zdGVhZCB0aGUgc3RyaW5nIGl0c2VsZiBpcyB0aGUgcmVzdWx0LiAgKi8KKyNkZWZpbmUgZ2V0dGV4dF9ub29wKFN0cikgKFN0cikKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCitleHRlcm4gY2hhciAqZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7CitleHRlcm4gY2hhciAqZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLworZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkpOworZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSBjb25zdCBjaGFyICpfX21zZ2lkKSk7CisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpkY2dldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorCQkJCWludCBfX2NhdGVnb3J5KSk7CitleHRlcm4gY2hhciAqZGNnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKKworCisvKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKyAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCisgICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KK2V4dGVybiBjaGFyICp0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOworZXh0ZXJuIGNoYXIgKnRleHRkb21haW5fXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKKworLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCisgICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCitleHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7CitleHRlcm4gY2hhciAqYmluZHRleHRkb21haW5fXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOworCisjaWYgRU5BQkxFX05MUworCisvKiBTb2xhcmlzIDIuMyBoYXMgdGhlIGdldHRleHQgZnVuY3Rpb24gYnV0IGRjZ2V0dGV4dCBpcyBtaXNzaW5nLgorICAgU28gd2Ugb21pdCB0aGlzIG9wdGltaXphdGlvbiBmb3IgU29sYXJpcyAyLjMuICBCVFcsIFNvbGFyaXMgMi40CisgICBoYXMgZGNnZXR0ZXh0LiAgKi8KKyMgaWYgIUhBVkVfQ0FUR0VUUyAmJiAoIUhBVkVfR0VUVEVYVCB8fCBIQVZFX0RDR0VUVEVYVCkKKworIyAgZGVmaW5lIGdldHRleHQoTXNnaWQpCQkJCQkJICAgICAgXAorICAgICBkZ2V0dGV4dCAoTlVMTCwgTXNnaWQpCisKKyMgIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkJCQkJCSAgICAgIFwKKyAgICAgZGNnZXR0ZXh0IChEb21haW5uYW1lLCBNc2dpZCwgTENfTUVTU0FHRVMpCisKKyMgIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3CisvKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGxvYWRtc2djYXQuYy4gIFdlIG5lZWQgYSBzaWduLAorICAgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYWxsCisgICB0cmFuc2xhdGlvbnMuICAqLworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCisjICAgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpCQkJICAgICAgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoewkJCQkJCQkJCSAgICAgIFwKKyAgICAgY2hhciAqX19yZXN1bHQ7CQkJCQkJCSAgICAgIFwKKyAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChNc2dpZCkpCQkJCQkgICAgICBcCisgICAgICAgewkJCQkJCQkJICAgICAgXAorCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAorCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKKwkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAorCSAgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAorCSAgICAgICBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKKwkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKKwkgICB9CQkJCQkJCQkgICAgICBcCisJIF9fcmVzdWx0ID0gX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAorICAgICAgIH0JCQkJCQkJCSAgICAgIFwKKyAgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgIF9fcmVzdWx0ID0gZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCisgICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICAgIH0pKQorIyAgZW5kaWYKKyMgZW5kaWYKKworI2Vsc2UKKworIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKE1zZ2lkKQorIyBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpIChNc2dpZCkKKyMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpIChNc2dpZCkKKyMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCisKKyNlbmRpZgorCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2xpYmludGwuZ2xpYmMgYi9pbnRsL2xpYmludGwuZ2xpYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YjhmOQotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvbGliaW50bC5nbGliYwpAQCAtMCwwICsxLDExMSBAQAorLyogbGliZ2V0dGV4dC5oIC0tIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgorQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCitDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlci4KK1RoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbGliZ2V0dGV4dC5oIGluIHRoZSBHTlUgZ2V0dGV4dCBwYWNrYWdlLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCSU5UTF9ICisjZGVmaW5lIF9MSUJJTlRMX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2RlZmluZSBfX25lZWRfTlVMTAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKyAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLworI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisKK19fQkVHSU5fREVDTFMKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCitleHRlcm4gY2hhciAqZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKK2V4dGVybiBjaGFyICpfX2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX21zZ2lkKSk7CisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpkZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKK2V4dGVybiBjaGFyICpfX2RnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkKSk7CisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgbG9jYWxlLiAgKi8KK2V4dGVybiBjaGFyICpkY2dldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKK2V4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7CisKKworLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCitleHRlcm4gY2hhciAqdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOworZXh0ZXJuIGNoYXIgKl9fdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOworCisvKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KK2V4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSk7CitleHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgICAgX19jb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKKworCisvKiBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gYWJvdmUuICAqLworI2lmIGRlZmluZWQgX19PUFRJTUlaRUQKKy8qIFRoZXNlIG11c3QgYmUgYSBtYWNyby4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCisgICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgorICAgZmFsc2UuICAqLworCisjIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoTlVMTCwgbXNnaWQpCisKKyMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKQkJCQkJICAgICAgXAorICBkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUykKKworIyBpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNykKKyMgIGRlZmluZSBkY2dldHRleHQoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgIGNoYXIgKnJlc3VsdDsJCQkJCQkJICAgICAgXAorICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKG1zZ2lkKSkJCQkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisJIGV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsJCQkJCSAgICAgIFwKKwkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKKwkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCisJIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKKwkgICB7CQkJCQkJCQkgICAgICBcCisJICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKKwkgICAgICAgX19kY2dldHRleHQgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CQkgICAgICBcCisJICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCisJICAgfQkJCQkJCQkJICAgICAgXAorCSByZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCisgICAgICAgfQkJCQkJCQkJICAgICAgXAorICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICAgcmVzdWx0ID0gX19kY2dldHRleHQgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CSAgICAgIFwKKyAgICAgcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICAgIH0pKQorIyBlbmRpZgorI2VuZGlmIC8qIE9wdGltaXppbmcuICovCisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9saW51eC1tc2cuc2VkIGIvaW50bC9saW51eC1tc2cuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MThlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRsL2xpbnV4LW1zZy5zZWQKQEAgLTAsMCArMSwxMDAgQEAKKyMgcG8ybXNnLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gTGludXggc3R5bGUgLm1zZyBmaWxlCisjIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIworIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKyMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCisjCisxIHsKKyAgaVwKKyRzZXQgMSAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwbzJtc2cuc2VkCisgIGgKKyAgcy8uKi8wLworICB4Cit9CisjCisjIE1pdGNoJ3Mgb2xkIGNhdGFsb2cgZm9ybWF0IGRvZXMgbm90IGFsbG93IGNvbW1lbnRzLgorIworIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCisjCisvXm1zZ2lkLyB7CisgIHMvbXNnaWRbIAldKiIvLworIworIyBUaGlzIGRvZXMgbm90IHdvcmsgbm93IHdpdGggdGhlIG5ldyBmb3JtYXQuCisjIC8iJC8hIHsKKyMgICBzL1xcJC8vCisjICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCisjIH0KKyAgeAorIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKKyMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+CisgIHRkCisjIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCisjIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KKyAgOmQKKyAgcy85XChfKlwpJC9fXDEvCisgIHRkCisjIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgorICBzL15cKF8qXCkkLzBcMS8KKyMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgorICBzLzhcKF8qXCkkLzlcMS8KKyAgcy83XChfKlwpJC84XDEvCisgIHMvNlwoXypcKSQvN1wxLworICBzLzVcKF8qXCkkLzZcMS8KKyAgcy80XChfKlwpJC81XDEvCisgIHMvM1woXypcKSQvNFwxLworICBzLzJcKF8qXCkkLzNcMS8KKyAgcy8xXChfKlwpJC8yXDEvCisgIHMvMFwoXypcKSQvMVwxLworIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgorICBzL18vMC9nCisgIHgKKyAgRworICBzL1woLipcKSJcblwoWzAtOV0qXCkvJCAjXDIgT3JpZ2luYWwgTWVzc2FnZTooXDEpL3AKK30KKyMKKyMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucworIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCisjIGVhY2ggbWVzc2FnZSB3ZSBhc3NpZ24gdGhlbSB0byB0aGUgbWVzc2FnZXMuCisjIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQorIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgorIyBvZiBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYmUgY2hhbmdlZC4pCisjCisvXm1zZ3N0ci8geworICBzL21zZ3N0clsgCV0qIlwoLipcKSIvIyBcMS8KKyMgQ2xlYXIgc3Vic3RpdHV0aW9uIGZsYWcuCisgIHRiCisjIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgorICA6YgorICBOCisjIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KKyAgcy9cKC4qXG5cKSJcKC4qXCkiL1wxXDIvCisjIFllcywgdGhlbiBicmFuY2guCisgIHRhCisgIFAKKyAgRAorIyBOb3RlIHRoYXQgRCBpbmNsdWRlcyBhIGp1bXAgdG8gdGhlIHN0YXJ0ISEKKyMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KKyAgOmEKKyAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCisgIFAKKyMgV2UgY2Fubm90IHVzZSBEIGhlcmUuCisgIHMvLipcblwoLipcKS9cMS8KKyAgdGIKK30KK2QKZGlmZiAtLWdpdCBhL2ludGwvbG9hZGluZm8uaCBiL2ludGwvbG9hZGluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdjMmViCi0tLSAvZGV2L251bGwKKysrIGIvaW50bC9sb2FkaW5mby5oCkBAIC0wLDAgKzEsNTggQEAKKyNpZm5kZWYgUEFSQU1TCisjIGlmIF9fU1REQ19fCisjICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKKyMgZWxzZQorIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIEVuY29kaW5nIG9mIGxvY2FsZSBuYW1lIHBhcnRzLiAgKi8KKyNkZWZpbmUgQ0VOX1JFVklTSU9OCQkxCisjZGVmaW5lIENFTl9TUE9OU09SCQkyCisjZGVmaW5lIENFTl9TUEVDSUFMCQk0CisjZGVmaW5lIFhQR19OT1JNX0NPREVTRVQJOAorI2RlZmluZSBYUEdfQ09ERVNFVAkJMTYKKyNkZWZpbmUgVEVSUklUT1JZCQkzMgorI2RlZmluZSBDRU5fQVVESUVOQ0UJCTY0CisjZGVmaW5lIFhQR19NT0RJRklFUgkJMTI4CisKKyNkZWZpbmUgQ0VOX1NQRUNJRklDCShDRU5fUkVWSVNJT058Q0VOX1NQT05TT1J8Q0VOX1NQRUNJQUx8Q0VOX0FVRElFTkNFKQorI2RlZmluZSBYUEdfU1BFQ0lGSUMJKFhQR19DT0RFU0VUfFhQR19OT1JNX0NPREVTRVR8WFBHX01PRElGSUVSKQorCisKK3N0cnVjdCBsb2FkZWRfbDEwbmZpbGUKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGludCBkZWNpZGVkOworCisgIGNvbnN0IHZvaWQgKmRhdGE7CisKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbmV4dDsKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqc3VjY2Vzc29yWzFdOworfTsKKworCitleHRlcm4gY29uc3QgY2hhciAqX25sX25vcm1hbGl6ZV9jb2Rlc2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvZGVzZXQsCisJCQkJCQkgIHNpemVfdCBuYW1lX2xlbikpOworCitleHRlcm4gc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCitfbmxfbWFrZV9sMTBuZmxpc3QgUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCisJCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLCBpbnQgbWFzaywKKwkJCSAgICBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAorCQkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsCisJCQkgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAorCQkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAorCQkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorCQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZG9fYWxsb2NhdGUpKTsKKworCitleHRlcm4gY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7CisKK2V4dGVybiBpbnQgX25sX2V4cGxvZGVfbmFtZSBQQVJBTVMgKChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCisJCQkJICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXIsCisJCQkJICAgICBjb25zdCBjaGFyICoqdGVycml0b3J5LAorCQkJCSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQsCisJCQkJICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0LAorCQkJCSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWwsCisJCQkJICAgICBjb25zdCBjaGFyICoqc3BvbnNvciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbikpOwpkaWZmIC0tZ2l0IGEvaW50bC9sb2FkbXNnY2F0LmMgYi9pbnRsL2xvYWRtc2djYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2U5MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW50bC9sb2FkbXNnY2F0LmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qIExvYWQgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCkgfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0LmgiCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCisgICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KKyMgZGVmaW5lIGZzdGF0ICBfX2ZzdGF0CisjIGRlZmluZSBvcGVuICAgX19vcGVuCisjIGRlZmluZSBjbG9zZSAgX19jbG9zZQorIyBkZWZpbmUgcmVhZCAgIF9fcmVhZAorIyBkZWZpbmUgbW1hcCAgIF9fbW1hcAorIyBkZWZpbmUgbXVubWFwIF9fbXVubWFwCisjZW5kaWYKKworLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAorICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKKyAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLworaW50IF9ubF9tc2dfY2F0X2NudHIgPSAwOworCisKKy8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKKyAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KK3ZvaWQKK19ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpCisgICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOworeworICBpbnQgZmQ7CisgIHN0cnVjdCBzdGF0IHN0OworICBzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKmRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xOworI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKyAgICB8fCBkZWZpbmVkIF9MSUJDCisgIGludCB1c2VfbW1hcCA9IDA7CisjZW5kaWYKKyAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKKworICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7CisgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKKworICAvKiBJZiB0aGUgcmVjb3JkIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGxvY2FsZSB0aGUgRklMRU5BTUUKKyAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCisgICAgIHN5bnRheC4gICovCisgIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KKyAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgaWYgKGZkID09IC0xKQorICAgIHJldHVybjsKKworICAvKiBXZSBtdXN0IGtub3cgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuICAqLworICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDAKKyAgICAgICYmIHN0LnN0X3NpemUgPCAob2ZmX3QpIHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSkKKyAgICB7CisgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCisgICAgICBjbG9zZSAoZmQpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKyAgICB8fCBkZWZpbmVkIF9MSUJDCisgIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gbG9hZCB0aGUgZmlsZS4gIElmIG1tYXAoKSBpcyBhdmFpbGFibGUgd2UgdHJ5CisgICAgIHRoaXMgZmlyc3QuICBJZiBub3QgYXZhaWxhYmxlIG9yIGl0IGZhaWxlZCB3ZSB0cnkgdG8gbG9hZCBpdC4gICovCisgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwKKwkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgaWYgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKKyAgICB7CisgICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCisgICAgICBjbG9zZSAoZmQpOworICAgICAgdXNlX21tYXAgPSAxOworICAgIH0KKyNlbmRpZgorCisgIC8qIElmIHRoZSBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIChpLmUuIG1tYXAnZWQpIHdlIHRyeSB0byBsb2FkCisgICAgIGl0IG1hbnVhbGx5LiAgKi8KKyAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKKyAgICB7CisgICAgICBvZmZfdCB0b19yZWFkOworICAgICAgY2hhciAqcmVhZF9wdHI7CisKKyAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc3Quc3Rfc2l6ZSk7CisgICAgICBpZiAoZGF0YSA9PSBOVUxMKQorCXJldHVybjsKKworICAgICAgdG9fcmVhZCA9IHN0LnN0X3NpemU7CisgICAgICByZWFkX3B0ciA9IChjaGFyICopIGRhdGE7CisgICAgICBkbworCXsKKwkgIGxvbmcgaW50IG5iID0gKGxvbmcgaW50KSByZWFkIChmZCwgcmVhZF9wdHIsIHRvX3JlYWQpOworCSAgaWYgKG5iID09IC0xKQorCSAgICB7CisJICAgICAgY2xvc2UgKGZkKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgcmVhZF9wdHIgKz0gbmI7CisJICB0b19yZWFkIC09IG5iOworCX0KKyAgICAgIHdoaWxlICh0b19yZWFkID4gMCk7CisKKyAgICAgIGNsb3NlIChmZCk7CisgICAgfQorCisgIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCisgICAgIGNhdGFsb2cgZmlsZS4gICovCisgIGlmIChkYXRhLT5tYWdpYyAhPSBfTUFHSUMgJiYgZGF0YS0+bWFnaWMgIT0gX01BR0lDX1NXQVBQRUQpCisgICAgeworICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLworI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKKyAgICB8fCBkZWZpbmVkIF9MSUJDCisgICAgICBpZiAodXNlX21tYXApCisJbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc3Quc3Rfc2l6ZSk7CisgICAgICBlbHNlCisjZW5kaWYKKwlmcmVlIChkYXRhKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZG9tYWluX2ZpbGUtPmRhdGEKKyAgICA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKKyAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKKyAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKKyAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7CisKKyAgLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF2YWlsYWJsZSB0YWJsZXMuICAqLworICBzd2l0Y2ggKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5yZXZpc2lvbikpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOworICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKKwkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKKyAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQorCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKKyAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOworICAgICAgZG9tYWluLT5oYXNoX3RhYiA9IChubHNfdWludDMyICopCisJKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldmlzaW9uLiAgKi8KKyNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCisgICAgfHwgZGVmaW5lZCBfTElCQworICAgICAgaWYgKHVzZV9tbWFwKQorCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOworICAgICAgZWxzZQorI2VuZGlmCisJZnJlZSAoZGF0YSk7CisgICAgICBmcmVlIChkb21haW4pOworICAgICAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBTaG93IHRoYXQgb25lIGRvbWFpbiBpcyBjaGFuZ2VkLiAgVGhpcyBtaWdodCBtYWtlIHNvbWUgY2FjaGVkCisgICAgIHRyYW5zbGF0aW9ucyBpbnZhbGlkLiAgKi8KKyAgKytfbmxfbXNnX2NhdF9jbnRyOworfQpkaWZmIC0tZ2l0IGEvaW50bC9sb2NhbGVhbGlhcy5jIGIvaW50bC9sb2NhbGVhbGlhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZDkxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRsL2xvY2FsZWFsaWFzLmMKQEAgLTAsMCArMSwzNzggQEAKKy8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMKKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjIGRlZmluZSBIQVZFX0FMTE9DQSAxCisjZWxzZQorIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgaW5jbHVkZSA8YWxsb2NhLmg+CisjIGVsc2UKKyMgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgZWxzZQorIyAgIGlmbmRlZiBhbGxvY2EKK2NoYXIgKmFsbG9jYSAoKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCitjaGFyICpnZXRlbnYgKCk7CisjIGlmZGVmIEhBVkVfTUFMTE9DX0gKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyBlbHNlCit2b2lkIGZyZWUgKCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGlmbmRlZiBfR05VX1NPVVJDRQorIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGlmbmRlZiBtZW1jcHkKKyMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCisjIGVuZGlmCisjZW5kaWYKKyNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKKyMgaWZuZGVmIHN0cmNocgorIyAgZGVmaW5lIHN0cmNociBpbmRleAorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0LmgiCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBkZWZpbmUgc3RyY2FzZWNtcCBfX3N0cmNhc2VjbXAKKyNlbmRpZgorCisKKy8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAorICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KKyNpZmRlZiBIQVZFX0FMTE9DQQorLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCisjIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLworIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLworI2Vsc2UKK3N0cnVjdCBibG9ja19saXN0Cit7CisgIHZvaWQgKmFkZHJlc3M7CisgIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OworfTsKKyMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKKyAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCisgICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCisgICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCisgICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKKyAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAorICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAorICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCisgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCisgICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgdW5kZWYgYWxsb2NhCisjIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCisjZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KKworCitzdHJ1Y3QgYWxpYXNfbWFwCit7CisgIGNvbnN0IGNoYXIgKmFsaWFzOworICBjb25zdCBjaGFyICp2YWx1ZTsKK307CisKKworc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcDsKK3N0YXRpYyBzaXplX3Qgbm1hcCA9IDA7CitzdGF0aWMgc2l6ZV90IG1heG1hcCA9IDA7CisKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKSk7CitzdGF0aWMgdm9pZCBleHRlbmRfYWxpYXNfdGFibGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGludCBhbGlhc19jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCisJCQkJICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKSk7CisKKworY29uc3QgY2hhciAqCitfbmxfZXhwYW5kX2FsaWFzIChuYW1lKQorICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOworICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7CisgIHNpemVfdCBhZGRlZDsKKworICBkbworICAgIHsKKyAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKKworICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7CisKKyAgICAgIGlmIChubWFwID4gMCkKKwlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAorCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKKwkJCQkJICAgICAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwKKwkJCQkJCQkJIGNvbnN0IHZvaWQgKikpCisJCQkJCQkpIGFsaWFzX2NvbXBhcmUpOworICAgICAgZWxzZQorCXJldHZhbCA9IE5VTEw7CisKKyAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLworICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQorCXJldHVybiByZXR2YWwtPnZhbHVlOworCisgICAgICAvKiBQZXJoYXBzIHdlIGNhbiBmaW5kIGFub3RoZXIgYWxpYXMgZmlsZS4gICovCisgICAgICBhZGRlZCA9IDA7CisgICAgICB3aGlsZSAoYWRkZWQgPT0gMCAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnKQorCXsKKwkgIGNvbnN0IGNoYXIgKnN0YXJ0OworCisJICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gPT0gJzonKQorCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOworCSAgc3RhcnQgPSBsb2NhbGVfYWxpYXNfcGF0aDsKKworCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJzonKQorCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOworCisJICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKKwkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKKwl9CisgICAgfQorICB3aGlsZSAoYWRkZWQgIT0gMCk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHNpemVfdAorcmVhZF9hbGlhc19maWxlIChmbmFtZSwgZm5hbWVfbGVuKQorICAgICBjb25zdCBjaGFyICpmbmFtZTsKKyAgICAgaW50IGZuYW1lX2xlbjsKK3sKKyNpZm5kZWYgSEFWRV9BTExPQ0EKKyAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOworI2VuZGlmCisgIEZJTEUgKmZwOworICBjaGFyICpmdWxsX2ZuYW1lOworICBzaXplX3QgYWRkZWQ7CisgIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOworCisgIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOworICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGZ1bGxfZm5hbWUpOworICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOworICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7CisKKyAgZnAgPSBmb3BlbiAoZnVsbF9mbmFtZSwgInIiKTsKKyAgaWYgKGZwID09IE5VTEwpCisgICAgeworICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGFkZGVkID0gMDsKKyAgd2hpbGUgKCFmZW9mIChmcCkpCisgICAgeworICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCisJIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKKwkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90CisJICAgIGJlIHRoYXQgbG9uZworICAgICAgICovCisgICAgICBjaGFyIGJ1ZltCVUZTSVpdOworICAgICAgY2hhciAqYWxpYXM7CisgICAgICBjaGFyICp2YWx1ZTsKKyAgICAgIGNoYXIgKmNwOworCisgICAgICBpZiAoZmdldHMgKGJ1ZiwgQlVGU0laLCBmcCkgPT0gTlVMTCkKKwkvKiBFT0YgcmVhY2hlZC4gICovCisJYnJlYWs7CisKKyAgICAgIGNwID0gYnVmOworICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKKwkrK2NwOworCisgICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLworICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQorCXsKKwkgIGFsaWFzID0gY3ArKzsKKwkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCisJICAgICsrY3A7CisJICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCisJICBpZiAoY3BbMF0gIT0gJ1wwJykKKwkgICAgKmNwKysgPSAnXDAnOworCisJICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLworCSAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKKwkgICAgKytjcDsKKworCSAgaWYgKGNwWzBdICE9ICdcMCcpCisJICAgIHsKKwkgICAgICBjaGFyICp0cDsKKwkgICAgICBzaXplX3QgbGVuOworCisJICAgICAgdmFsdWUgPSBjcCsrOworCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCisJCSsrY3A7CisJICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KKwkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKKwkJeworCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKKwkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCisJCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcbicgd2hpY2ggZG8gbm90IG92ZXJ3cml0ZSBoZXJlLiAgKi8KKwkJICAqY3ArKyA9ICdcMCc7CisJCSAgKmNwID0gJ1xuJzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCisJCSpjcCsrID0gJ1wwJzsKKworCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKKwkJZXh0ZW5kX2FsaWFzX3RhYmxlICgpOworCisJICAgICAgLyogV2UgY2Fubm90IGRlcGVuZCBvbiBzdHJkdXAgYXZhaWxhYmxlIGluIHRoZSBsaWJjLiAgU2lnaCEgICovCisJICAgICAgbGVuID0gc3RybGVuIChhbGlhcykgKyAxOworCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCSAgICAgIGlmICh0cCA9PSBOVUxMKQorCQl7CisJCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworCQkgIHJldHVybiBhZGRlZDsKKwkJfQorCSAgICAgIG1lbWNweSAodHAsIGFsaWFzLCBsZW4pOworCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IHRwOworCisJICAgICAgbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOworCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCSAgICAgIGlmICh0cCA9PSBOVUxMKQorCQl7CisJCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworCQkgIHJldHVybiBhZGRlZDsKKwkJfQorCSAgICAgIG1lbWNweSAodHAsIHZhbHVlLCBsZW4pOworCSAgICAgIG1hcFtubWFwXS52YWx1ZSA9IHRwOworCisJICAgICAgKytubWFwOworCSAgICAgICsrYWRkZWQ7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQorCSB0aGUgcmVzdCBvZiB0aGUgbGluZS4gICovCisgICAgICB3aGlsZSAoc3RyY2hyIChjcCwgJ1xuJykgPT0gTlVMTCkKKwl7CisJICBjcCA9IGJ1ZjsKKwkgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQorCSAgICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKKwkgICAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCisJICAgICpjcCA9ICdcbic7CisJfQorICAgIH0KKworICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCisgICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KKyAgZmNsb3NlIChmcCk7CisKKyAgaWYgKGFkZGVkID4gMCkKKyAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAorCSAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkpIGFsaWFzX2NvbXBhcmUpOworCisgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyAgcmV0dXJuIGFkZGVkOworfQorCisKK3N0YXRpYyB2b2lkCitleHRlbmRfYWxpYXNfdGFibGUgKCkKK3sKKyAgc2l6ZV90IG5ld19zaXplOworICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOworCisgIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOworICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgbWFsbG9jIChuZXdfc2l6ZQorCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKKyAgaWYgKG5ld19tYXAgPT0gTlVMTCkKKyAgICAvKiBTaW1wbHkgZG9uJ3QgZXh0ZW5kOiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvcmUuICAqLworICAgIHJldHVybjsKKworICBtZW1jcHkgKG5ld19tYXAsIG1hcCwgbm1hcCAqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpOworCisgIGlmIChtYXhtYXAgIT0gMCkKKyAgICBmcmVlIChtYXApOworCisgIG1hcCA9IG5ld19tYXA7CisgIG1heG1hcCA9IG5ld19zaXplOworfQorCisKK3N0YXRpYyBpbnQKK2FsaWFzX2NvbXBhcmUgKG1hcDEsIG1hcDIpCisgICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDE7CisgICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDI7Cit7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSQ0FTRUNNUAorICByZXR1cm4gc3RyY2FzZWNtcCAobWFwMS0+YWxpYXMsIG1hcDItPmFsaWFzKTsKKyNlbHNlCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMS0+YWxpYXM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMi0+YWxpYXM7CisgIHVuc2lnbmVkIGNoYXIgYzEsIGMyOworCisgIGlmIChwMSA9PSBwMikKKyAgICByZXR1cm4gMDsKKworICBkbworICAgIHsKKyAgICAgIC8qIEkga25vdyB0aGlzIHNlZW1zIHRvIGJlIG9kZCBidXQgdGhlIHRvbG93ZXIoKSBmdW5jdGlvbiBpbgorCSBzb21lIHN5c3RlbXMgbGliYyBjYW5ub3QgaGFuZGxlIG5vbmFscGhhIGNoYXJhY3RlcnMuICAqLworICAgICAgYzEgPSBpc3VwcGVyICgqcDEpID8gdG9sb3dlciAoKnAxKSA6ICpwMTsKKyAgICAgIGMyID0gaXN1cHBlciAoKnAyKSA/IHRvbG93ZXIgKCpwMikgOiAqcDI7CisgICAgICBpZiAoYzEgPT0gJ1wwJykKKwlicmVhazsKKyAgICAgICsrcDE7CisgICAgICArK3AyOworICAgIH0KKyAgd2hpbGUgKGMxID09IGMyKTsKKworICByZXR1cm4gYzEgLSBjMjsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvaW50bC9wbzJ0Ymwuc2VkLmluIGIvaW50bC9wbzJ0Ymwuc2VkLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmNjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbnRsL3BvMnRibC5zZWQuaW4KQEAgLTAsMCArMSwxMDIgQEAKKyMgcG8ydGJsLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gbG9va3VwIHRhYmxlIGZvciBjYXRnZXRzCisjIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworMSB7CisgIGlcCisvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBwbzJ0Ymwuc2VkIGZyb20gQFBBQ0tBR0UgTkFNRUAucG90LiAgKi9cCitcCisjaWYgSEFWRV9DT05GSUdfSFwKKyMgaW5jbHVkZSA8Y29uZmlnLmg+XAorI2VuZGlmXAorXAorI2luY2x1ZGUgImxpYmdldHRleHQuaCJcCitcCitjb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKKyAgaAorICBzLy4qLzAvCisgIHgKK30KKyMKKyMgV3JpdGUgbXNnaWQgZW50cmllcyBpbiBDIGFycmF5IGZvcm0uCisjCisvXm1zZ2lkLyB7CisgIHMvbXNnaWRbIAldKlwoIi4qIlwpLyAge1wxLworICB0YgorIyBBcHBlbmQgdGhlIG5leHQgbGluZQorICA6YgorICBOCisjIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KKyAgcy9cKC4qXCkiXChcblwpIlwoLioiXCkvXDFcMlwzLworIyBZZXMsIHRoZW4gYnJhbmNoLgorICB0YQorIyBCZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBmaWxlIGNvcnJlY3RseSBmb3JtZWQgdGhlIGxpbmUKKyMganVzdCByZWFkIGNhbm5vdCBiZSBhZ2FpbiBiZSBhIG1zZ2lkIGxpbmUuICBTbyBpdCdzIHNhZmUgdG8gaWdub3JlCisjIGl0LgorICBzL1woLipcKVxuLiovXDEvCisgIGJjCisjIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCisgIDphCisgIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLworICBQCisjIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgorICBzLy4qXG5cKC4qXCkvXDEvCisjIFNvbWUgYnVnZ3kgc2VkcyBkbyBub3QgY2xlYXIgdGhlIGBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBzaW5jZSBsYXN0IGBgdCcnJworIyBmbGFnIG9uIGBOJywgc28gd2UgZG8gYSBgdCcgaGVyZSB0byBjbGVhciBpdC4KKyAgdGIKKyMgTm90IHJlYWNoZWQKKyAgOmMKKyAgeAorIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKKyMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+CisgIHRkCisjIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCisjIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KKyAgOmQKKyAgcy85XChfKlwpJC9fXDEvCisgIHRkCisjIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgorICBzL15cKF8qXCkkLzBcMS8KKyMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgorICBzLzhcKF8qXCkkLzlcMS8KKyAgcy83XChfKlwpJC84XDEvCisgIHMvNlwoXypcKSQvN1wxLworICBzLzVcKF8qXCkkLzZcMS8KKyAgcy80XChfKlwpJC81XDEvCisgIHMvM1woXypcKSQvNFwxLworICBzLzJcKF8qXCkkLzNcMS8KKyAgcy8xXChfKlwpJC8yXDEvCisgIHMvMFwoXypcKSQvMVwxLworIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgorICBzL18vMC9nCisgIHgKKyAgRworICBzL1woLipcKVxuXChbMC05XSpcKS9cMSwgXDJ9LC8KKyAgcy9cKC4qXCkiJC9cMS8KKyAgcAorfQorIworIyBMYXN0IGxpbmUuCisjCiskIHsKKyAgaVwKK307XAorCisgIGcKKyAgcy8wKlwoLipcKS9pbnQgX21zZ190YmxfbGVuZ3RoID0gXDE7L3AKK30KK2QKZGlmZiAtLWdpdCBhL2ludGwvdGV4dGRvbWFpbi5jIGIvaW50bC90ZXh0ZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkOTM0MAotLS0gL2Rldi9udWxsCisrKyBiL2ludGwvdGV4dGRvbWFpbi5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgaWZuZGVmIG1lbWNweQorIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCitleHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdOworCisvKiBEZWZhdWx0IHRleHQgZG9tYWluIGluIHdoaWNoIGVudHJpZXMgZm9yIGdldHRleHQoMykgYXJlIHRvIGJlIGZvdW5kLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIFRFWFRET01BSU4gX190ZXh0ZG9tYWluCisjIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQorI2Vsc2UKKyMgZGVmaW5lIFRFWFRET01BSU4gdGV4dGRvbWFpbl9fCisjZW5kaWYKKworLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCisgICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgorICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCitjaGFyICoKK1RFWFRET01BSU4gKGRvbWFpbm5hbWUpCisgICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Cit7CisgIGNoYXIgKm9sZDsKKworICAvKiBBIE5VTEwgcG9pbnRlciByZXF1ZXN0cyB0aGUgY3VycmVudCBzZXR0aW5nLiAgKi8KKyAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisKKyAgb2xkID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisKKyAgLyogSWYgZG9tYWluIG5hbWUgaXMgdGhlIG51bGwgc3RyaW5nIHNldCB0byBkZWZhdWx0IGRvbWFpbiAibWVzc2FnZXMiLiAgKi8KKyAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJworICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKKyAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOworICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBtYWxsb2MgZmFpbHMgYF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluJworCSB3aWxsIGJlIE5VTEwuICBUaGlzIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHNvIHNpZ25hbHMgd2UKKwkgYXJlIG91dCBvZiBjb3JlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKyAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKKyNlbHNlCisgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7CisgICAgICBjaGFyICpjcCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKyAgICAgIGlmIChjcCAhPSBOVUxMKQorCW1lbWNweSAoY3AsIGRvbWFpbm5hbWUsIGxlbik7CisgICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IGNwOworI2VuZGlmCisgICAgfQorCisgIGlmIChvbGQgIT0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pCisgICAgZnJlZSAob2xkKTsKKworICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCit3ZWFrX2FsaWFzIChfX3RleHRkb21haW4sIHRleHRkb21haW4pOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL3hvcGVuLW1zZy5zZWQgYi9pbnRsL3hvcGVuLW1zZy5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzBiYgotLS0gL2Rldi9udWxsCisrKyBiL2ludGwveG9wZW4tbXNnLnNlZApAQCAtMCwwICsxLDEwNCBAQAorIyBwbzJtc2cuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBYL09wZW4gc3R5bGUgLm1zZyBmaWxlCisjIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIworIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKyMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCisjCisxIHsKKyAgaVwKKyRzZXQgMSAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwbzJtc2cuc2VkCisgIGgKKyAgcy8uKi8wLworICB4Cit9CisjCisjIFdlIGNvcHkgYWxsIGNvbW1lbnRzIGludG8gdGhlIC5tc2cgZmlsZS4gIFBlcmhhcHMgdGhleSBjYW4gaGVscC4KKyMKKy9eIy8gcy9eI1sgCV0qLyQgL3AKKyMKKyMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgorIworL15tc2dpZC8geworIyBEb2VzIG5vdCB3b3JrIG5vdworIyAgLyIkLyEgeworIyAgICBzL1xcJC8vCisjICAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLworIyAgfQorICBzL15tc2dpZFsgCV0qIlwoLipcKSIkLyQgT3JpZ2luYWwgTWVzc2FnZTogXDEvCisgIHAKK30KKyMKKyMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucworIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCisjIGVhY2ggbWVzc2FnZSB3ZSBhc3NpZ24gdGhlbSB0byB0aGUgbWVzc2FnZXMuCisjIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQorIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgorIyBvZiBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYmUgY2hhbmdlZC4pCisjCisvXm1zZ3N0ci8geworICBzL21zZ3N0clsgCV0qIlwoLipcKSIvXDEvCisgIHgKKyMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5CisjIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgorICB0ZAorIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgorIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCisgIDpkCisgIHMvOVwoXypcKSQvX1wxLworICB0ZAorIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KKyAgcy9eXChfKlwpJC8wXDEvCisjIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KKyAgcy84XChfKlwpJC85XDEvCisgIHMvN1woXypcKSQvOFwxLworICBzLzZcKF8qXCkkLzdcMS8KKyAgcy81XChfKlwpJC82XDEvCisgIHMvNFwoXypcKSQvNVwxLworICBzLzNcKF8qXCkkLzRcMS8KKyAgcy8yXChfKlwpJC8zXDEvCisgIHMvMVwoXypcKSQvMlwxLworICBzLzBcKF8qXCkkLzFcMS8KKyMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KKyAgcy9fLzAvZworICB4CisjIEJyaW5nIHRoZSBsaW5lIGluIHRoZSBmb3JtYXQgYDxudW1iZXI+IDxtZXNzYWdlPicKKyAgRworICBzL15bXlxuXSokLyYgLworICBzL1woLipcKVxuXChbMC05XSpcKS9cMiBcMS8KKyMgQ2xlYXIgZmxhZyBmcm9tIGxhc3Qgc3Vic3RpdHV0aW9uLgorICB0YgorIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KKyAgOmIKKyAgTgorIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgYSBjb250aW51YXRpb24gbGluZS4KKyAgcy9cKC4qXG5cKSJcKC4qXCkiL1wxXDIvCisjIFllcywgdGhlbiBicmFuY2guCisgIHRhCisgIFAKKyAgRAorIyBOb3RlIHRoYXQgYEQnIGluY2x1ZGVzIGEganVtcCB0byB0aGUgc3RhcnQhIQorIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgorICA6YQorICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KKyAgUAorIyBXZSBjYW5ub3QgdXNlIHRoZSBzZWQgY29tbWFuZCBgRCcgaGVyZQorICBzLy4qXG5cKC4qXCkvXDEvCisgIHRiCit9CitkCmRpZmYgLS1naXQgYS9sZC9DaGFuZ2VMb2cgYi9sZC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwMmRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL0NoYW5nZUxvZwpAQCAtMCwwICsxLDg5MzMgQEAKKzE5OTktMDQtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCAoT1RIRVJfQlNTX1NZTUJPTFMpOiBEZWZpbmUuCisJKE9USEVSX0JTU19FTkRfU1lNQk9MUyk6IERlZmluZS4KKworCSogc2NyaXB0dGVtcGwvbWNvcmVwZS5zYzogTmV3IGZpbGU6IER1cGxpY3RlIG9mIHBlLnNjIHdpdGggc3RhY2sKKwlzZWN0aW9uIGFkZGVkLgorCisxOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KKworMTk5OS0wNC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogRGVmaW5lIHRvCisJZ2VuZXJhdGUgX3N0YWNrIHNlY3Rpb24uCisKKzE5OTktMDQtMTIgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgorCisJKiBlbXVscGFyYW1zL2FybWVsZl9saW51eC5zaDogTmV3IGZpbGUuICBTdXBwb3J0IGZvciBBUk0gCisJR05VL0xpbnV4IEVMRiBBQkkuCisJKiBlbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoOiBOZXcgZmlsZS4gQVBDUy0yNiB2ZXJzaW9uIG9mIGFib3ZlLgorCSogY29uZmlndXJlLnRndDogRm9yIGFybSotKi1saW51eC1nbnUqLCBzZXQgZGVmYXVsdCBlbXVsYXRpb24gdG8KKwlgYXJtZWxmX2xpbnV4JywgYW5kIGFsc28gaW5jbHVkZSBgYXJtZWxmX2xpbnV4MjYnIGFuZCBgYXJtZWxmJy4KKwkqIE1ha2VmaWxlLmFtOiBBZGQgcnVsZXMgdG8gbWFrZSBlYXJtbGludXguYyBhbmQgZWFybWxpbnV4MjYuYy4KKwkoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybWxpbnV4Lm8gYW5kIGVhcm1saW51eDI2Lm8uCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVsZl9pMzg2X2JlLm8uCisJKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1iZW9zKik6IFVzZSBpdC4KKwkqIGVtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2g6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KKwkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgorCSogc3lzZGVwLmggKGVudmlyb24pOiBEZWNsYXJlIGlmIG5lZWRlZC4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgorCisxOTk5LTA0LTExICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBsZGdyYW0ueSAobGRncmFtX3ZlcnNfY3VycmVudF9sYW5nKTogTmV3LgorCSh2ZXJzX2RlZm5zKTogQWNjZXB0IGBleHRlcm4gImxhbmciIHsgfScgc3ludGF4LgorCSogbGRsZXgubCAodmVyc19ub2RlX25lc3RpbmcpOiBOZXcuCisJKFZfSURFTlRJRklFUik6IEFjY2VwdCAuIGFuZCAkIGluIHN5bWJvbHMuCisJKFZFUlNfTk9ERSk6IEFjY2VwdCBgZXh0ZXJuICJsYW5nIiB7IH0nIHRva2Vucy4gIE5lc3QgVkVSU19OT0RFIHN0YXRlcy4KKwkqIGxkbGFuZy5jIChsYW5nX25ld192ZXJzX3JlZ2V4KTogTmV3IGBsYW5nJyBhcmd1bWVudC4gIFVwZGF0ZSBjYWxsZXJzLgorCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jKTogTmV3IGZ1bmN0aW9uLgorCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXMpOiBOZXcgZnVuY3Rpb24uCisJKGxhbmdfdmVyc19tYXRjaF9sYW5nX2phdmEpOiBOZXcgZnVuY3Rpb24uCisJKGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pOiBGaXggaXRlcmF0aW9uLiAgRG9uJ3QgZnJlZQorCXNlY3Rpb24gY29udGVudHMsIGFzIGl0IGlzIHN0aWxsIGluIHVzZSBieSB0aGUgcGF0dGVybnMuCisKKzE5OTktMDQtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtYWluKTogSW5pdCBsaW5rX2luZm8ubm9fdW5kZWZpbmVkLgorCSogbGV4c3VwLmM6IEFkZCBjb21tYW5kLWxpbmUgb3B0aW9uIC0tbm8tdW5kZWZpbmVkLgorCisxOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KKwkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCQorCSogZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoOiBOZXcgZmlsZTogIERlZmluaXRpb25zIGZvciBtY29yZS1lbGYKKwl0YXJnZXQuIAorCSogZW11bHBhcmFtcy9tY29yZXBlLnNoOiBOZXcgZmlsZTogIERlZmluaXRpb25zIGZvciBtY29yZS1wZQorCXRhcmdldC4gIAorCisxOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KKworCSogbGQuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCisJKiBsZG1haW4uYyAobWFpbik6IERvbid0IHBhc3MgTENfTUVTU0FHRVMgdG8gc2V0bG9jYWxlIGlmIHRoZQorCXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQuCisKKzE5OTktMDQtMDYgIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KKworCSogbGRtYWluLmggKGRlbWFuZ2xpbmcpOiBEZWNsYXJlLgorCSogbGRtYWluLmMgKGRlbWFuZ2xpbmcpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShtYWluKTogSW5pdGlhbGl6ZSBkZW1hbmdsaW5nLgorCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IGRlbWFuZ2xlIHN5bWJvbCBpZiAhIGRlbWFuZ2xpbmcuCisJKiBsZXhzdXAuYyAobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6IEhhbmRsZSAtLWRlbWFuZ2xlIGFuZAorCS0tbm8tZGVtYW5nbGUuCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWRlbWFuZ2xlLy0tbm8tZGVtYW5nbGUuCisKKwkqIGxkbGV4LmwgKFZfSURFTlRJRklFUik6IEFsbG93ICcuJyBpbiBzeW1ib2wuCisKKzE5OTktMDQtMDUgIENocmlzIFRvcmVrICA8dG9yZWtAQlNESS5DT00+CisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IENoZWNrIHRoYXQKKwlhIHNoYXJlZCBsaWJyYXJ5IHJlYWxseSBleGlzdHMsIGF2b2lkaW5nIGJyb2tlbiBzeW1saW5rcy4KKworCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBHZW5lcmF0ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIGlmCisJd2UgY2FuJ3QgZmluZCBhIC1sIGZpbGUuCisKKzE5OTktMDQtMDUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChpMzg2LSotcGUpOiBhZGQgdGFyZ19leHRyYV9vZmlsZXMgZm9yIG90aGVyIFBFCisJdGFyZ2V0cyAoaTM4Ni1wZSBhbmQgaTM4Ni13aW5udCkKKworMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+CisKKwkqIGRlZmZpbGVwLnk6IEluY2x1ZGUgInN5c2RlcC5oIiBhbmQgImxkbWlzYy5oIi4KKwkoZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLiAgUmVtb3ZlCisJdW51c2VkIGxvY2FscyBzaF9yZXNlcnZlLCBzaF9jb21taXQsIGFuZCBqLgorCShkZWZfdW5nZXRjKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgorCShkZWZfbGV4KTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIG9mIHx8IHdpdGhpbiAmJi4KKwkqIGRlZmZpbGUuaCAoZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkqIHBlLWRsbC5jOiBJbmNsdWRlIDx0aW1lLmg+LCA8Y3R5cGUuaD4sIGFuZCAibGRlbXVsLmgiLgorCShnZW5lcmF0ZV9lZGF0YSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgaS4KKwkocXVvdGVwdXQpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgorCShwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBGaXggdHlwZSBpbiBmb3JtYXQgc3RyaW5nLgorCShxdWlja19zeW1ib2wpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGJsaGUuCisJKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgorCShwZV9wcm9jZXNzX2ltcG9ydF9kZWZzKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgYXJfaGVhZCwgYXJfdGFpbCwKKwlhbmQgbi4KKwkocGVfYXMxNik6IENvbW1lbnQgb3V0LgorCisxOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KKworCSogY29uZmlndXJlLnRndDogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0LgorCisxOTk5LTAzLTMxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybV9lcG9jX3BlLm8KKwlBZGQgYnVpbGQgcnVsZSBhbmQgZGVwZW5kZW5jaWVzIGZvciBlYXJtX2Vwb2NfcGUuYy4KKworCSogZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaDogTmV3IGZpbGUuCisKKwkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCAndGFyZ19leHRyYV9vZmlsZXMnIGZvciBBUk0gYmFzZWQgUEUKKwl0YXJnZXRzLiAKKworMTk5OS0wMy0zMSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+CisKKwkqIGNvbmZpZ3VyZS50Z3Q6IE1hdGNoIGBhcm0qLSotbGludXgtZ251Kicgbm90CisgCWBhcm12Ki0qLWxpbnV4LWdudScuCisKKzE5OTktMDMtMjYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgdGhlIC5laF9mcmFtZSBhbmQgLmdjY19leGNlcHRfdGFibGUKKwlzZWN0aW9ucyBpbiB0aGUgZGF0YSBzZWdtZW50LgorCitGcmkgTWFyIDI2IDEyOjA1OjUxIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisJKiBsZC5oICh3aWxkY2FyZF9zcGVjKTogQWRkIGV4Y2x1ZGVfbmFtZS4KKyAgICAgICAgKiBsZGdyYW0ueSAoRVhDTFVERV9GSUxFKTogTmV3IHRva2VuLgorCSh3aWxkY2FyZF9zcGVjKTogU2V0IGV4Y2x1ZGVfbmFtZS4KKwkoZmlsZV9OQU1FX2xpc3QpOiBSZWNvZ25pemUgRVhDTFVERV9GSUxFLgorICAgICAgICAqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBDaGVjayBmb3IgZXhjbHVkZWQgZmlsZXMuCisJKHByaW50X3dpbGRfc3RhdGVtZW50KTogUHJpbnQgZXhjbHVkZWQgZmlsZXMuCisJKGxhbmdfYWRkX3dpbGQpOiBOZXcgYXJndW1lbnQgZXhjbHVkZV9maWxlbmFtZS4KKwlTZXQgZXhjbHVkZV9maWxlbmFtZS4KKwkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUpOiAgQWRkIGV4Y2x1ZGVfZmlsZW5hbWUuCisJKiBsZGxleC5sOiBOZXcgdG9rZW4gRVhDTFVERV9GSUxFLgorCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiAgQWRkIGFyZ3VtZW50IHRvIGxhbmdfYWRkX3dpbGQuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKENUT1IsIERUT1IpOiAgRXhjbHVkZSBjcnRlbmQubyBmcm9tIGN0b3Igd2lsZGNhcmQuCisJUmVvcmRlciBzb3J0ZWQgYW5kIHVuc29ydGVkIGN0b3JzLgorCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChDVE9SLCBEVE9SKTogTGlrZXdpc2UuCisJCisxOTk5LTAzLTI2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19nY19zZWN0aW9ucyk6IElmIGVudHJ5X3N5bWJvbCBpcyBub3QgZGVmaW5lZCwKKwlkZWZhdWx0IHRvICJzdGFydCIuCisKKzE5OTktMDMtMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGV4cGxpY2l0IHBsYWNlbWVudHMgZm9yIHRoZSAuZWhfZnJhbWUKKwlhbmQgLmdjY19leGNlcHRfdGFibGUgc2VjdGlvbnMuIAorCitXZWQgTWFyICAzIDA5OjEzOjM0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY2xtPgorIAorICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogUmVtb3ZlIC5lbmQuY3RvcnMgYW5kIC5lbmQuZHRvcnMKKyAgICAgICAgc2VjdGlvbnMuICBSZW9yZGVyIC5jdG9ycyBzZWN0aW9uIGVudHJpZXMuCisgICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCisgICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCisgICAgICAgICogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KKworMTk5OS0wMi0yNiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtYWluKTogV3JvbmcgZXJyb3IgbXNnIGZvciAtciBhbmQgLS1tcGM4NjBjMC4KKworMTk5OS0wMi0yNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMpOiBSZW1vdmUgZXh0cmFuZW91cworCWJhY2tzbGFzaC4gCisKK1RodSBGZWIgMjUgMTU6MDc6MjQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3QgZ2F0aGVyIC5jdG9yIGFuZCAuZHRvciBzZWN0aW9ucworICAgICAgICBmb3IgcmVsb2NhdGVhYmxlIGxpbmtzLgorCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCisJKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KKwkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCisgICAgICAgIAorMTk5OS0wMi0yMiAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+CisKKwkqIGxkaW50LnRleGluZm86IHJlbW92ZSBleHRyYW5lb3VzIHJpZ2h0IGJyYWNlLgorCSogbGRtYWluLmMgKG1haW4pOiBpbml0aWFsaXplIGFuZCBjaGVjayBvcHRpb24gIm1wYzg2MGMwIi4KKwkqIGxleHN1cC5jIChsZF9vcHRpb25zLCBwYXJzZV9hcmdzKTogYWRkIG9wdGlvbiAibXBjODYwYzAiLgorCitXZWQgRmViIDE3IDEyOjEwOjA2IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgorCisJKiBtcHctZWxmbWlwcy5jIChnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uKTogUmVtb3ZlIHNwZWNpYWwKKwkucmVnaW5mbyBzZWN0aW9uIGhhbmRsaW5nLiAKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBMaWtld2lzZS4KKwkqIGVtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCAoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbW92ZWQKKwkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCAoSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyk6IFJlbW92ZWQKKworMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCVBhdGNoIGZyb206IFNjb3R0IEJhbWJyb3VnaCA8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgorCQorCSogY29uZmlndXJlLnRndDogQWRkZWQgYXJtdiotKi1saW51eC1nbnUgdG8gJHRhcmdfZW11bAorCXJlY29nbml0aW9uLiAKKworV2VkIEZlYiAxNyBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+CisgCisgICAgICAgICogZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCisgICAgICAgIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucywKKyAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCisgICAgICAgIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlZmluZSB0aGVtIHRvIHVzZSB0aGUKKyAgICAgICAgb2xkIEFCSSB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zLgorCitUdWUgRmViIDE2IDE2OjQ4OjE5IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBDaGFuZ2UgQU1fUFJPR19JTlNUQUxMCisJdG8gQUNfUFJPR19JTlNUQUxMLiAgQ2hhbmdlIEFNX0VYRUVYVCB0byBBQ19FWEVFWFQuCisJKiBNYWtlZmlsZS5hbSAoZWFybWVsZl9vYWJpLmMpOiBDaGFuZ2VzIHNwYWNlcyB0byB0YWIuCisJKiBhY2NvbmZpZy5oOiBSZW1vdmUuCisJKiBhY2xvY2FsLm00OiBSZWJ1aWxkLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK01vbiBGZWIgMTUgMTg6MjE6NDggMTk5OSAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+CisKKwkqIGxkZXhwLmggKHN0cnVjdCBldHJlZV92YWx1ZV90eXBlKTogQ2hhbmdlIHZhbGlkIG9udG8gdmFsaWRfcC4KKworCSogbGRleHAuYyAobmV3X2Ficyk6IERpdHRvLgorCShuZXdfcmVsLCBuZXdfcmVsX2Zyb21fc2VjdGlvbiwgZm9sZF9iaW5hcnksIGludmFsaWQsIGZvbGRfbmFtZSwKKyAJZXhwX2ZvbGRfdHJlZSwgZXhwX2Jpbm9wLCBleHBfdHJpbm9wLCBzdGF0X2FsbG9jLAorIAlleHBfZ2V0X2Fic19pbnQpOiBEaXR0bworCisJKiBsZGxhbmcuYyAocHJpbnRfYXNzaWdubWVudCwgbGFuZ19zaXplX3NlY3Rpb25zLAorCWxhbmdfZG9fYXNzaWdubWVudHMpOiBEaXR0by4KKwkKKzE5OTktMDItMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKTogTmV3IGZ1bmN0aW9uOiBDaGVjaworCWFkZHJlc3NlcyBhc3NpZ25lZCB0byBzZWN0aW9uIGZvciBvdmVybGFwcy4KKwkobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzIGlmIHN1aXRhYmxlLgorCisJKiBsZC5oOiBBZGQgbmV3IGJvb2xlYW4gZmllbGQgdG8gYXJnc190eXBlIHN0cnVjdHVyZToKKwknY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMnLgorCisJKiBsZG1haW4uYzogSW5pdGlhbGlzZSBjaGVja19zZWN0aW9uX2FkZHJlc3NlcyBmaWVsZCB0byB0cnVlLgorCisJKiBsZXhzdXAuYzogQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS1uby1jaGVjay1zZWN0aW9ucycgYW5kCisJJy0tY2hlY2stc2VjdGlvbnMnLgorCisJKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0tY2hlY2stc2VjdGlvbnMnCisJYW5kICctLW5vLWNoZWNrLXNlY3Rpb25zJy4KKworMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCisKK1dlZCBGZWIgIDMgMTk6NDE6MDEgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBKdXN0IHNldCBTRUNfS0VFUCBvbmNlLiAgQ2hlY2sgZm9yCisJYW4gb3duZXIgb2YgYSBzZWN0aW9uIGJlZm9yZSB1c2luZyBpdCB0byBsb29rIHVwIGEgcmVsb2MgdHlwZS4KKwlEb24ndCBzZXQgU0VDX0tFRVAgZm9yIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgorCitNb24gRmViICAxIDExOjM5OjQ2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogTWFrZWZpbGUuYW0gKGVhcm1lbGZfb2FiaS5vKTogIE5ldy4KKyAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCisgICAgICAgICogY29uZmlndXJlLnRndCAoYXJtLSotb2FiaSk6ICBOZXcuCisgICAgICAgICh0aHVtYi0qLW9hYmkpOiAgTmV3LgorICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2g6ICBOZXcuCisgICAgICAgICogZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtOiAgTmV3LgorCisxOTk5LTAxLTMxIDE3OjU3OjMxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAtZmxlYWRpbmctdW5kZXJzY29yZXMKKwlzd2l0Y2ggaW4gYWxsIGxpbmtlciBnZW5lcmF0ZWQgc3ltYm9scy4KKworCSogY29uZmlndXJlLnRndCAocG93ZXJwY3ssbGV9Ki0qLXZ4d29ya3MpOiBBZGQgYXMgYWxpYXNlcyBmb3IKKwlwb3dlcnBjeyxsZX0tKi1lYWJpLgorCitXZWQgSmFuIDIwIDE3OjAxOjQ4IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotc29sYXJpczIqKTogTmV3IHRhcmdldC4gIEZyb20gUGF2ZWwKKwlSb3NraW4gPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPi4KKworMTk5OS0wMS0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENvdW50IGxvYWRhYmxlIHNlY3Rpb25zIGFzCisgICAgICAgICAgY29udHJpYnV0aW5nIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQuCisKKzE5OTktMDEtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBPbmx5IHVwZGF0ZSB0aGUgY3VycmVudAorICAgICAgICAgIGFkZHJlc3Mgb2YgYSByZWdpb24gaWYgdGhlIHNlY3Rpb24ganVzdCBwbGFjZWQgaW50byBpdCBpcyBhbgorICAgICAgICAgIGFsbG9jYXRlZCBzZWN0aW9uLgorCisxOTk5LTAxLTEyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogUmVwbGFjZSBlZnIzMC5vIHdpdGggZWVsZjMyZnIzMC5vLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisKKwkqIGNvbmZpZ3VyZS50Z3Q6IFJlcGxhY2UgZnIzMCB3aXRoIGVsZjMyZnIzMC4KKworCSogZW11bHBhcmFtcy9lbGYzMmZyMzAuc2g6IE5ldyBmaWxlOiBSZXBsYWNlcyBmcjMwLnNoLCBhbmQgdXNlcworCWdlbmVyaWMgZWxmLnNjIHNjcmlwdC4gIEFsc28gcmVwbGFjZXMgdGhlIC5zdGFjayBzZWN0aW9uIHdpdGggYQorCXVzZXIgZGVmaW5hYmxlIHN5bWJvbCBfX3N0YWNrLgorCisxOTk5LTAxLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9mcjMwLnNjOiBGaWxsIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3aXRoIE5PUAorCXBhdHRlcm4uIAorCisxOTk5LTAxLTAzICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGNoZWNrLURFSkFHTlUpOiBObyBsb25nZXIgcHJvdmlkZSBIT1NUSU5HX0VNVSwKKwlIT1NUSU5HX0NSVDAsIEhPU1RJTkdfTElCUzsgdGhlIHRlc3Qgc3VpdGUgY2FuIGV4dHJhY3QgdGhlbSBmcm9tCisJY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZ3VyZS50Z3Qgbm93LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKzE5OTgtMTItMjcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncywgY2FzZSBPUFRJT05fUlBBVEgpOiBBdm9pZCBhZGRpbmcgZHVwbGljYXRlCisJZWxlbWVudHMgdG8gcnBhdGguCisKK1RodSBEZWMgMTAgMTE6MTI6MjggMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgorCisJKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgcGUtZGxsLm8gYW5kIGRlZmZpbGVwLm8uCisJKEFMTF9FTVVMX0VYVFJBX09GSUxFUyk6IE5ldyB2YXJpYWJsZS4gIFB1dCB0aGVtIGhlcmUgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZS5pbjogU2V0IEVNVUxfRVhUUkFfT0ZJTEVTIHRvICQoQUxMX0VNVUxfRVhUUkFfT0ZJTEVTKQorCWlmIGNvbmZpZ3VyaW5nIHdpdGggYWxsIHRhcmdldHMuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgorCisJKiBlbXVsdGVtcGwvcGUuZW0gKHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwKTogTWFrZSBzdGF0aWMuCisJKHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzKTogUmVtb3ZlZCwgdW51c2VkLgorCShwZV9kZWZfZmlsZSwgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nLCBwZV9kbGxfa2lsbF9hdHMsCisJcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyk6IERvbid0IGluaXRpYWxpemUgdGhlbSwgdGhpcyBmaWxlIG1heSBiZQorCWNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLgorCSogcGUtZGxsLmMgKHBlX2RlZl9maWxlLCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcsCisJcGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMsIHBlX2RsbF9raWxsX2F0cywKKwlwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKTogRGVmaW5lIGFuZCBpbml0aWFsaXplIHRoZW0gaGVyZSBpbnN0ZWFkLgorCShnZW5lcmF0ZV9yZWxvYyk6IEZpeCBhbGxvY2F0aW9uIG9mIHJlbG9jX2FkZHJlc3NlcyBhcnJheSB0byB1c2UKKwliZmRfdm1hIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIEZpeCBlbGVtZW50IHNpemUgaW4gcXNvcnQgY2FsbC4KKwkocmVsb2Nfc29ydCk6IENvbXBhcmUgcG9pbnRlcnMgdG8gYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkCisJbG9uZy4KKworTW9uIERlYyAgNyAyMToxMDowOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPGouai52YW5kZXJoZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KKworCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotbWluZ3czMiopOiBBZGQgY3lnd2luIHRhcmdldCBzcGVjaWZpYworCWZpbGVzLgorCitTdW4gRGVjICA2IDE2OjMzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKKwk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KKworMTk5OC0xMi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9mcjMwLnNoIChURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgVEVYVF9TVEFSVF9BRERSCisJZnJvbSAweDEwMDAwMCB0byAweDEwMDAwIHNvIHRoYXQgaXQgZml0cyBpbiAyMCBiaXRzLgorCitTYXQgTm92IDI4IDIyOjMyOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRlbXVsLmggKGxkZW11bF9yZWNvZ25pemVkX2ZpbGUpOiBEZWNsYXJlLgorCitTYXQgTm92IDI4IDIyOjMwOjU1IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbGRsYW5nLmMgKGxhbmdfYWRkX3dpbGQpOiBEb24ndCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW5wdXQKKwlmaWxlIGlmIHRoZSBmaWxlbmFtZSBpcyBhIHdpbGRjYXJkIHBhdHRlcm4uCisKKzE5OTgtMTEtMjUgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgorCisJKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogbmV3IGhvb2sgInJlY29nbml6ZWRfZmlsZSIKKwkqIGxkZW11bC5jIChsZGVtdWxfcmVjb2duaXplZF9maWxlKTogbmV3IGZ1bmN0aW9uLCBuZXcgaG9vaworCSogbGRpbnQudGV4aW5mbzogZG9jdW1lbnQgbmV3IGhvb2suCisJKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogY2FsbCByZWNvZ25pemVkX2hvb2sgZm9yIGFsbCBvYmplY3RzIHdlCisJZG8gcmVjb2duaXplLCBpbiBjYXNlIHRoZSBlbXVsYXRpb24gbmVlZHMgdG8gaGFuZGxlIHRoZW0KKwlzcGVjaWFsbHkuICBQRSBETExzIHVzZSB0aGlzLgorCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IHRha2Ugb3V0IGhhY2sgYW5kIGRlYnVnCisJcHJpbnRmcworCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9yZWNvZ25pemVkX2ZpbGUpOiBuZXcgZnVuY3Rpb24KKwkoZ2xkX2k0ODZfdW5yZWNvZ25pemVkX2ZpbGUpOiB0YWtlIG91dCBoYWNrCisKKzE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgorCisJKiBwZS1kbGwuYyAoZmlsbF9lZGF0YSk6IGZpbGwgaW4gdGltZXN0YW1wCisJKG1ha2VfaGVhZCk6IG5hbWUgb2JqZWN0IGZpbGVzIHNlcXVlbnRpYWxseSB0byBlbnN1cmUKKwl0aGV5IGxpbmsgaW4gdGhlIHJpZ2h0IG9yZGVyLgorCShtYWtlX3RhaWwpOiBzYW1lIGhlcmUKKwkocGVfcHJvY2Vzc19pbXBvcnRfZGVmcyk6IHVzZSBzZXF1ZW50aWFsIG5hbWVzIGZvciBiZmRzIHRvIGVuc3VyZQorCXByb3BlciBsaW5rIG9yZGVyLgorCShwZV9pbXBsaWVkX2ltcG9ydF9kbGwpOiBuZXcgZnVuY3Rpb247IGhhbmRsZXMgbGlua2luZyBkaXJlY3RseQorCWFnYWluc3QgRExMcyBieSBzaW11bGF0aW5nIElNUE9SVFMgZGlyZWN0aXZlcy4gICogZW11bHRlbXBsL3BlLmVtCisJKGdsZF9pMzg2cGVfYmVmb3JlX3BhcnNlKTogaGFjayBiZmQgdG8gbm90IHJlY29nbml6ZSAuZGxsIGZpbGVzCisJdmlhIGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjaworCisxOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4NnBlX3BhcnNlX2FyZ3MpOiBDb25kaXRpb25hbGl6ZSBjYWxsIHRvCisJcGVfZGxsX2FkZF9leGNsdWRlcworCitNb24gTm92IDIzIDE0OjM2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoYWZ0ZXJfcGFyc2UpOiBPbmx5IGNyZWF0ZSBhbiB1bmRlZmluZWQgZW50cnkKKwlzeW1ib2wgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZC4KKworMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZwZV9hZnRlcl9vcGVuKTogY2FsbAorCXBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMKKwkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBjYWxjdWxhdGUgQkFTRSBmcm9tCisJcGVfZGF0YSwgb25seSBwcmludCBpZiBhY3R1YWxseSBzZXQuICBQcmludCB2ZXJzaW9uIG9ubHkgaWYKKwlzZXQuCisJKHNhdmVfcmVsb2NzKTogc2F2ZSByZWxvY3MgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KKwkobWFrZV9vbmUpOiBzdXBwb3J0IGludGVybmFsL2V4dGVybmFsIGRpZmZlcmVudCBuYW1lcy4KKwkocGVfZGxsX2dlbmVyYXRlX2ltcGxpYik6IHN1cHBvcnQgbmV3IG1ha2Vfb25lCisJKHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMpOiBuZXcgZnVuY3Rpb247IGhhbmRsZXMgSU1QT1JUCisJZGlyZWN0aXZlcyBpbiAuZGVmIGZpbGVzLgorCitGcmkgTm92IDIwIDEzOjA2OjQ5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBDb3BlIHdpdGggZW1wdHkgc3ltYm9sIG5hbWVzLgorCitUaHUgTm92IDE5IDEzOjMxOjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBBZGQgcHJvdmlzaW9uIG9mICdfZW5kJyBzeW1ib2wuCisKK1dlZCBOb3YgMTggMTg6MTg6NDMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndDogY2hhbmdlIHJlZnMgZnJvbSBjeWd3aW4zMiogdG8gY3lnd2luKi4KKwkqIGFjbG9jYWwubTQ6IHJlZ2VuZXJhdGUKKwkqIGNvbmZpZ3VyZS5pbjogZG9uJ3QgbmVlZCB0byBjYWxsIEFNX0NZR1dJTjMyLgorCSogY29uZmlndXJlOiByZWdlbmVyYXRlCisKK01vbiBOb3YgMTYgMjI6MTQ6MDcgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfZmluaXNoKTogZ2VuZXJhdGUgaW1wb3J0IGxpYnJhcnkKKwkqIGRlZmZpbGUuaDogYWRkIGhpbnQgbWVtYmVyLgorCSogcGUtZGxsLmMgKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBOZXcgZnVuY3Rpb24gd2l0aCBoZWxwZXJzOworIAlnZW5lcmF0ZXMgdGhlIGltcG9ydCBsaWJyYXJ5IGRpcmVjdGx5IGZyb20gdGhlIGV4cG9ydCB0YWJsZS4KKwkoZmlsbF9lZGF0YSk6IHJlbWVtYmVyIHRoZSBhY3R1YWwgaGludCBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5LgorCitTYXQgTm92IDE0IDE0OjM2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQuMTogU29tZSBjbGVhbnVwcyBmcm9tIE5PS1VCSSBIaXJvdGFrYSA8aG5va3ViaUB5eXkub3IuanA+LgorCitUaHUgTm92IDEyIDE5OjIxOjU3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogcG8vbGQucG90OiBSZWdlbmVyYXRlZC4KKwkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KKworV2VkIE5vdiAxMSAxODoxMDoxNSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KKworCSogcGUtZGxsLmMgKGdlbmVyYXRlX3JlbG9jKTogZG9uJ3Qgb3V0cHV0IFBFIHJlbG9jcyBmb3Igc2VjdGlvbnMKKyAJdGhhdCB3b24ndCBiZSBsb2FkZWQuCisKK1dlZCBOb3YgMTEgMTM6NDQ6NTQgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIHBlLWRsbC5jIChmaWxsX2VkYXRhKTogZG9uJ3Qgc3RyaXAgdW5kZXJzY29yZXMKKworVHVlIE5vdiAxMCAyMToyODoxOSAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KKworCSogbGQudGV4aW5mbzogYWRkZWQgaTM4NnBlIG9wdGlvbiBzdW1tYXJ5CisKK1R1ZSBOb3YgMTAgMTc6NTM6MTcgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogcHJvcGVybHkgbm90ZSB1bmRlZmluZWQgZXhwb3J0ZWQKKyAJc3ltYm9scywgY2xlYW4gdXAgb2xkIGNvZGUuCisJKHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSk6IGRvbid0IGNyYXNoIGlmIHBlX2RlZl9maWxlIGlzIE5VTEwKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfcGFyc2VfYXJncyk6IGFkZAorIAkoZW4vZGlzKWFibGUtc3RkY2FsbC1maXh1cHMKKwkocGVfZml4dXBfc3RkY2FsbHMpOiB3YXJuIGFib3V0IHN0ZGNhbGwgZml4dXBzCisJKGdsZF9pMzg2X3VucmVjb2duaXplZF9maWxlKTogbWFrZSBleHBvcnRlZCBzeW1ib2xzIHVuZGVmcyBzbyB0aGF0CisgCWFyY2hpdmUgbWVtYmVycyBnZXQgcHVsbGVkIGluCisKK1R1ZSBOb3YgMTAgMTQ6NTA6NTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBBZGQgS0VFUCBhdHRyaWJ1dGUgdG8gLmluaXQsCisgICAgICAgIC5maW5pLCAuZHRvcnMgYW5kIC5jdG9ycy4gIEFkZCAuZGF0YSBhbmQgLnRleHQKKyAgICAgICAgd2lsZGNhcmRzIHRvIHN1cHBvcnQgc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24uCisKK01vbiBOb3YgIDkgMjI6NTI6NTAgMTk5OCAgREogRGVsb3JpZSAgPGRqQGluZHkuZGVsb3JpZS5jb20+CisKKwkqIGRlZmZpbGVwLnk6IHByb3Blcmx5IGhhbmRsZSByZWxvY3Mgd2l0aCBtdWx0aXBsZSBkZWZfZmlsZXMsCisJY2FjaGUgaW1wb3J0IG1vZHVsZSBuYW1lcworCitNb24gTm92ICA5IDIyOjQ0OjU4IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgorCisJKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IGRvbid0IGFzc3VtZSBleHBvcnRzIHdvbid0IG1vdmUKKwlkdXJpbmcgYSByZWFsbG9jCisKK01vbiBOb3YgIDkgMTY6NDE6MzAgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIHBlLWRsbC5jOiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKKwkqIGRlZmZpbGUuaDogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCisJKiBkZWZmaWxlcC55OiBOZXcgZmlsZTsgZGlyZWN0IHN1cHBvcnQgZm9yIFBFIERMTHMKKwkqIGVtdWx0ZW1wbC9wZS5lbTogYWRkIGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCisJKiBjb25maWd1cmUudGd0OiBhbGxvdyB0YXJnZXQtc3BlY2lmaWMgZXh0cmEgZmlsZXMKKwkqIGNvbmZpZ3VyZS5pbjogYWxsb3cgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCisJKiBsZGxhbmcuYyAobGFuZ19hZGRfYXNzaWdubWVudCk6IHJldHVybiB0aGUgYXNzaWdubWVudCBzbyB0aGF0CisgCW9uZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBsYXRlciBiYXNlZCBvbiB0aGUgb2JqZWN0IGZpbGVzIChwZS1kbGwKKyAJREVGIGZpbGVzIGRvIHRoaXMpCisJKiBsZGludC50ZXhpbmZvOiBhZGQgc2VjdGlvbiBmb3IgZW11bGF0aW9uIHdhbGt0aHJvdWdoCisJKiBNYWtlZmlsZS5hbTogYWRkIG5ldyBmaWxlcyBhbmQgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X2xpc3Rfb3B0aW9ucyk6IGxpc3QgZGxsLXNwZWNpZmljCisJb3B0aW9ucy4KKwkqIHBlLWRsbC5jIChwcm9jZXNzX2RlZl9maWxlKTogYXV0by1leHBvcnQgZXZlcnl0aGluZyBpZgorCW5vdGhpbmcgaXMgb3RoZXJ3aXNlIGV4cG9ydGVkLgorCQorV2VkIE5vdiAgNCAxNjozOToxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbTogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgorCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIEZSMzAgdGFyZ2V0LgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBlbXVscGFyYW1zL2ZyMzAuc2g6IE5ldyBmaWxlLgorCSogc2NyaXB0dGVtcC9mcjMwLnNjOiBOZXcgZmlsZS4KKwkKK01vbiBOb3YgIDIgMTQ6NDc6MTUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBsZG1haW4uYyAobWFpbik6ICBEb24ndCByZXBvcnQgZXJyb3IgZm9yIGR5bmFtaWMgbGlua3MgYW5kCisgICAgICAgIC0tZ2Mtc2VjdGlvbnMuCisKKzE5OTgtMTAtMjYgMTY6MDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IENoYW5nZSB0ZXh0IG9mIC1PIHRvIE9wdGltaXplIG91dHB1dCBmaWxlIi4KKwkocGFyc2VfYXJncyk6IFNldCBsaW5rX2luZm8ub3B0aW1pemUgYmFzZWQgb24gLU8gYXJndW1lbnQuCisJKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLm9wdGltemUgdG8gZmFsc2UuCisJKiBsZC50ZXhpbmZvOiBEZXNjcmliZSAtTyBvcHRpb24uCisJKiBsZC4xOiBMaWtld2lzZS4KKworTW9uIE9jdCAxMiAxNDoyOTo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNb3ZlIC5zYnNzIGFuZCAuc2NvbW1vbiBzZWN0aW9ucyBpbnRvIHRoZWlyCisJb3duIHNlZ21lbnQsIHNvIHRoYXQgdGhleSBjYW4gYmUgbmV4dCB0byB0aGUgLmJzcyBzZWN0aW9uIGFuZCBzbworCWluaXRpYWxpc2VkIGJ5IHRoZSBzYW1lIHBpZWNlIG9mIGNvZGUuCisKK0ZyaSBPY3QgIDkgMTU6NTk6NTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6ICBNZXJnZSAuc2RhdGEuKiBldGMgc2VjdGlvbnMuCisgICAgICAgICogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogIFNldCBTRUNfS0VFUCBmb3IKKyAgICAgICAgY3RvciBzZWN0aW9ucy4KKworTW9uIE9jdCAgNSAwOTo0MDo0MyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGxkbWFpbi5jIChtYWluKTogIEVycm9yIGlmIC0tZ2Mtc2VjdGlvbnMgYW5kCisgICAgICAgIGR5YW5taWMgbGlua2luZy4KKyAgICAgICAgKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiAgQWRkIEtFRVAgYXR0cmlidXRlIHRvIC5pbml0LAorICAgICAgICAuZmluaSwgLmR0b3JzIGFuZCAuY3RvcnMuICBBZGQgLmRhdGEgYW5kIC50ZXh0CisgICAgICAgIHdpbGRjYXJkcyB0byBzdXBwb3J0IHNlY3Rpb24gZ2FyYmFnZSBjb2xsZWN0aW9uLgorCitXZWQgU2VwIDMwIDExOjE5OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IFJlbmFtZSAuY2FsbF90YWJsZSBzZWN0aW9uIHRvCisJLmNhbGxfdGFibGVfZGF0YSBhbmQgY3JlYXRlIGEgbmV3IHNlY3Rpb24gY2FsbGVkCisJLmNhbGxfdGFibGVfdGV4dC4KKworU3VuIFNlcCAyMCAwMDo0MzoyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGFsaWdubWVudCBhdCB0aGUgZW5kIG9mIHRoZSAuYnNzCisJc2VjdGlvbiwgc28gdGhhdCBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgbWVtc2l6ZSBvZiB0aGUgc2VnbWVudC4KKworRnJpIFNlcCAxOCAxMzo0Mjo0MiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkX3BsYWNlX29ycGhhbik6IERvbid0IHByb2Nlc3MgZm9yCisgICAgICAgIHNlY3Rpb25zIHdpdGggU0VDX0VYQ0xVREUgZmxhZy4KKworRnJpIFNlcCAgNCAwOToyNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKFRFWFRfU0laRSk6IEluY3JlYXNlZCB0byAyMDAwSy4KKwkoREFUQV9TSVpFKTogSW5jcmVhc2VkIHRvIDIwMDBLLgorCitUaHUgU2VwICAzIDE3OjMwOjU4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoVEVNUExBVEVfTkFNRSk6IFVzZSBlbGYzMi4KKworTW9uIEF1ZyAzMSAwMTowNjowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIE1ha2VmaWxlLmFtOiAgQ2hhbmdlIGFybWVsZi5zYyB0byBlbGYuc2MKKyAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCisKK01vbiBBdWcgMzEgMTE6MTI6MDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogIENoYW5nZSBTQ1JJUFRfTkFNRSB0bworICAgICAgICBlbGYuICBDaGFuZ2UgVEVYVF9TVEFSVF9BRERSIHRvIDB4ODAwMC4gIERlZmluZQorICAgICAgICBPVEhFUl9URVhUX1NFQ1RJT05TLCBPVEhFUl9CU1NfU1lNQk9MUyBhbmQKKyAgICAgICAgT1RIRVJfQlNTX0VORF9TWU1CT0xTLgorICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZi5zYzogIE1vZGlmeSB0byB1c2UKKyAgICAgICAgT1RIRVJfQlNTX0VORF9TWU1CT0xTLgorICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIFJlbW92ZSBmaWxlLgorCitUdWUgQXVnIDE4IDEyOjA1OjM0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogZW11bHRlbXBsL2FybWVsZi5lbSAoZ2xkX2FybWVsZl9iZWZvcmVfYWxsb2NhdGlvbik6CisgICAgICAgIEFkZCBiZmRfIHByZWZpeCB0byBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgorICAgICAgICBhbmQgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucy4KKyAgICAgICAgKGdsZF9hcm1lbGZfYWZ0ZXJfb3Blbik6IEFkZCBiZmRfIHByZWZpeCB0bworICAgICAgICBlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLgorCitGcmkgQXVnIDE0IDE1OjM0OjI5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGxkZ3JhbS55OiBJbmNsdWRlICJsZGN0b3IuaCIuCisJKHN0YXRlbWVudCk6IEFjY2VwdCBTT1JUIGFyb3VuZCBDT05TVFJVQ1RPUlMuCisJKiBsZGN0b3IuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCisJKGNvbnN0cnVjdG9yc19zb3J0ZWQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShjdG9yX3ByaW8sIGN0b3JfY21wKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKGxkY3Rvcl9idWlsZF9zZXRzKTogU29ydCBjb25zdHJ1Y3RvcnMgaWYgcmVxdWVzdGVkLgorCSogbGRjdG9yLmggKGNvbnN0cnVjdG9yc19zb3J0ZWQpOiBEZWNsYXJlLgorCSogbGRsYW5nLmMgKHByaW50X3N0YXRlbWVudCk6IFByaW50IHNvcnRlZCBDT05TVFJVQ1RPUlMKKwljb3JyZWN0bHkuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzb3J0IGFyb3VuZCBDT05TVFJVQ1RPUlMuCisJKiBsZC50ZXhpbmZvIChPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkcyk6IERvY3VtZW50IFNPUlQKKyAJKENPTlNUUlVDVE9SUykuCisKK1RodSBBdWcgMTMgMTI6MjA6MzkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiAgRGVmaW5lIFRFTVBMQVRFX05BTUUgdG8gYXJtZWxmLgorICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgSW5jbHVkZSAuZ2x1ZV83dCBhbmQgLmdsdWU3CisgICAgICAgc2VjdGlvbnMuCisgICAgICAgKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBOZXcgZmlsZS4KKworVGh1IEF1ZyAxMyAxMjo1Mjo0NSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChsZC5kdmkpOiBVc2UgIiBpbnN0ZWFkIG9mICcgZm9yIE1BS0VJTkZPLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1R1ZSBBdWcgMTEgMTY6MTc6MDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBDaGFuZ2UgdGV4dCBzdGFydCBhZGRyZXNzCisgICAgICAgIGJhY2sgdG8gemVyby4KKworVHVlIEF1ZyAxMSAxMDowMToxMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVtdWxwYXJtcy9tbjEwMjAwLnNoIChNQVhfUEFHRVNJWkUpOiBEZWZpbmUgdG8gMS4KKwkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoIChNQVhfUEFHRVNJWkUpOiBEZWZpbmUgdG8gMS4KKworU3VuIEF1ZyAgOSAyMDozMToyNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIFNldCB0ZXh0IHN0YXJ0IGFkZHJlc3MgdG8KKyAgICAgICAgMHg4MDAwLiAgQWRkIF9fYnNzX2VuZCBkZWZpbml0aW9uLgorCitTYXQgQXVnICAxIDExOjQ3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgTmV3IGZpbGUuCisgICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6IFNldCBTQ1JJUFRfTkFNRSB0byBlbGZhcm0uCisKK0ZyaSBKdWwgMzEgMTU6NTY6MTYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogTmV3IGZpbGUuCisgICAgICAgICogY29uZmlndXJlLnRndDogIFJlY29nbml6ZSB0aHVtYi1lbGYgYW5kIGFybS1lbGYuCisgICAgICAgICogTWFrZWZpbGUuYW0gKGVhcm1lbGYubyk6IE5ldy4KKyAgICAgICAgKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworRnJpIEp1bCAyNCAxMjowMDo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCByZW1vdmUgdGhlIGZpbGUgYmVmb3JlCisJY2hlY2tpbmcgd2hldGhlciAkKGJpbmRpcikgPT0gJCh0b29sZGlyKS9iaW4uICBGcm9tIE1hY2llagorCVcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGNvbmZpZ3VyZS50Z3Q6IFJlY29nbml6ZSBoOFszNV0wMCotY29mZiogYXMgd2VsbCBhcyAtaG1zKi4KKworVGh1IEp1bCAyMyAxMToxNToxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IElmIEFMSUdOTUVOVCBpcyBkZWZpbmVkLCB1c2UgaXQgdG8gc2V0CisJYWxpZ25tZW50IG9mIGVuZCBzeW1ib2wuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IExpa2V3aXNlLgorCSogZW11bHBhcmFtcy9zdW40LnNoIChBTElHTk1FTlQpOiBEZWZpbmUuCisJKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChBTElHTk1FTlQpOiBEZWZpbmUuCisJKiBsZGludC50ZXhpbmZvIChlbXVsYXRpb24gcGFyYW1ldGVycyk6IERvY3VtZW50IEFMSUdOTUVOVC4KKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgbWlzc2luZyBicmVhayBzdGF0ZW1lbnQuCisKKwkqIGxkbGFuZy5jIChsYW5nX2djX3NlY3Rpb25zXzEpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaCB0bworCWF2b2lkIHdhcm5pbmdzLgorCitUdWUgSnVsIDE0IDE1OjQyOjE3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGk/ODYtKi1iZW9ze3BlLGVsZix9Kik6IFJlY29nbml6ZS4KKwkqIE1ha2VmaWxlLmFtIChlaTM4NmJlb3Mubyk6IE5ldy4KKwkqIGVtdWxwYXJhbXMvaTM4NmJlb3Muc2g6IE5ldyBmaWxlLgorCSogZW11bHRlbXBsL2Jlb3MuZW0sIHNjcmlwdHRlbXBsL2kzODZiZW9zLnNjOiBOZXcgZmlsZS4KKworVHVlIEp1bCAxNCAxNTozNTo0MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBsZXhzdXAuYzogTmV3IG9wdGlvbiAtLXZlcnNpb24tZXhwb3J0cy1zZWN0aW9uLgorCSogbGQuaCAoc3RydWN0IGFyZ3NfdHlwZSk6IEFkZCB2ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbi4KKwkqIGxkbGFuZy5jIChsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGl0LgorCitNb24gSnVsIDEzIDEzOjIwOjIzIDE5OTggIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHRyYW5zbWV0YS5jb20+CisKKwkqIGxkbGV4Lmw6IEFjY2VwdCBBU1NFUlQuCisJKiBsZGdyYW0ueSAoZXhwKTogQWRkIEFTU0VSVF9LIGNhc2UuCisJKiBsZGV4cC5oIChub2RlX3R5cGUpOiBBZGQgZXRyZWVfYXNzZXJ0IHRvIG5vZGVfY2xhc3MgZW51bS4KKwkoZXRyZWVfdHlwZSk6IEFkZCBhc3NlcnRfcyBmaWVsZC4KKwkoZXhwX2Fzc2VydCk6IERlY2xhcmUuCisJKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogSGFuZGxlIGV0cmVlX2Fzc2VydC4KKwkoZXhwX2Fzc2VydCk6IE5ldyBmdW5jdGlvbi4KKwkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfYXNzZXJ0LgorCSogbGQudGV4aW5mbyAoTWlzY2VsbGFuZW91cyBDb21tYW5kcyk6IERvY3VtZW50IEFTU0VSVC4KKworV2VkIEp1bCAgOCAxNDowMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZ3JhbS55OiBDaGFuZ2UgTUFYIHRvIE1BWF9LIGFuZCBNSU4gdG8gTUlOX0ssIHRvIGF2b2lkCisJY29uZmxpY3RzIHdpdGggc3lzdGVtIGhlYWRlciBmaWxlcy4gIENoYW5nZSBhbGwgdXNlcy4KKworCSogTWFrZWZpbGUuYW0gKE1BSU5UQUlORVJDTEVBTkZJTEVTKTogRGVmaW5lLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1R1ZSBKdWwgIDcgMTg6MDM6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAobGR2ZXIudGV4aSk6IE5ldyB0YXJnZXQuCisJKGxkLmluZm8sIGxkLmR2aSk6IERlcGVuZCB1cG9uIGxkdmVyLnRleGkuCisJKiBsZC50ZXhpbmZvOiBJbmNsdWRlIGxkdmVyLnRleGkuICBNZW50aW9uIHZlcnNpb24gbnVtYmVyIG9uIHRpdGxlCisJcGFnZSBhbmQgaW4gdG9wIG5vZGUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEp1bCAgNiAxNDo1NToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXNvbGFyaXMqKTogTmV3IHRhcmdldC4KKworRnJpIEp1bCAgMyAxNDoxOTowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBEb24ndCBnZXQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaWYgdGhlCisJc2VjdGlvbiBpcyBkaXNjYXJkZWQuCisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2UgU09SVCB0byBzb3J0IHNlY3Rpb25zIGFwcHJvcHJpYXRlbHkuCisJKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfYnlfZmlsZV9uYW1lKTogUmVtb3ZlLgorCShzb3J0X2J5X3NlY3Rpb25fbmFtZSk6IFJlbW92ZS4KKwkoc29ydF9zZWN0aW9uc18xLCBzb3J0X3NlY3Rpb25zKTogUmVtb3ZlLgorCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBEb24ndCBjYWxsCisJc29ydF9zZWN0aW9ucy4KKwkoaG9sZF9zZWN0aW9uLCBob2xkX3NlY3Rpb25fbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgorCShob2xkX3VzZSwgaG9sZF90ZXh0LCBob2xkX3JkYXRhLCBob2xkX2RhdGEsIGhvbGRfYnNzKTogTGlrZXdpc2UuCisJKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXdyaXRlLiAgTG9vayBmb3IgYSBnb29kCisJcGxhY2UgdG8gcHV0IHRoZSBzZWN0aW9uLiAgQWxpZ24gdGhlIHNlY3Rpb24uICBTb3J0IHRoZSBpbnB1dAorCXNlY3Rpb25zIGJ5IG5hbWUuCisJKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKworCSogbGRsYW5nLmMgKHdpbGRfc29ydCk6IFdoZW4gc29ydGluZyBieSBmaWxlIG5hbWUsIHNvcnQgYnkgYXJjaGl2ZQorCW5hbWUgZmlyc3QuCisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IERvbid0IGNhbGwKKwlsZGxhbmdfYWRkX3VuZGVmLgorCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgbmV3IGFmdGVyX3BhcnNlIGZ1bmN0aW9uCisJcmF0aGVyIHRoYW4gYWZ0ZXJfcGFyc2VfZGVmYXVsdC4KKworCSogbGRncmFtLnkgKGV4dGVybl9uYW1lX2xpc3QpOiBEbyBub3QgcmVxdWlyZSBzeW1ib2xzIHRvIGJlCisJc2VwYXJhdGVkIGJ5IGNvbW1hcy4KKwkoaWZpbGVfcDEpOiBBZGQgRVhURVJOLgorCSogbGRsZXgubDogQWNjZXB0IEVYVEVSTiBpbiBCT1RIIGFuZCBTQ1JJUFQgbW9kZSBhcyB3ZWxsIGFzIE1SSQorCW1vZGUuCisJKiBsZC50ZXhpbmZvIChPcHRpb25zKTogTWVudGlvbiB0aGF0IEVYVEVSTiBpcyBlcXVpdmFsZW50IHRvIC11LgorCShNaXNjZWxsYW5lb3VzIENvbW1hbmRzKTogRG9jdW1lbnQgRVhURVJOLgorCitXZWQgSnVsICAxIDE5OjQwOjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uIDxydGhAY3lnbnVzLmNvbT4KKworCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGdjX3NlY3Rpb25zLgorCSogbGRncmFtLnkgKGxkZ3JhbV9oYWRfa2VlcCwgS0VFUCk6IE5ldy4KKwkoaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXApOiBSZW5hbWUgZnJvbSBvbGQgaW5wdXRfc2VjdGlvbl9zcGVjLgorCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBOZXcuICBSZWNvZ25pemUgS0VFUC4KKwkqIGxkbGFuZy5jICh3aWxkX3NlY3Rpb24pOiBIYW5kbGUga2VlcCBzZWN0aW9ucy4KKwkobGFuZ19nY193aWxkX3NlY3Rpb24sIGxhbmdfZ2Nfd2lsZF9maWxlLCBsYW5nX2djX3dpbGQpOiBOZXcuCisJKGxhbmdfZ2Nfc2VjdGlvbnNfMSwgbGFuZ19nY19zZWN0aW9ucyk6IE5ldy4KKwkobGFuZ19wcm9jZXNzKTogSW52b2tlIGxhbmdfZ2Nfc2VjdGlvbnMuCisJKGxhbmdfYWRkX3dpbGQpOiBBZGQga2VlcCBhcmd1bWVudC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwkqIGxkbGFuZy5oIChsYW5nX3dpbGRfc3RhdGVtZW50X3N0cnVjdCk6IEFkZCBrZWVwX3NlY3Rpb25zLgorCSogbGRsZXgubCAoS0VFUCk6IE1hdGNoIGl0LgorCSogbGRtYWluLmMgKG1haW4pOiBFcnJvciBvbiAtciBhbmQgLS1nYy1zZWN0aW9ucy4KKwkqIGxleHN1cC5jOiBBZGQgLS1nYy1zZWN0aW9ucy4KKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNZXJnZSAudGV4dC4qIGV0YyBzZWN0aW9ucyBhcHByb3ByaWF0ZWx5LgorCU1hcmsgc3RhcnR1cCBzZWN0aW9ucyB3aXRoIEtFRVAuCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgorCisJKiBsZC50ZXhpbmZvOiBVcGRhdGUgZm9yIC0tZ2Mtc2VjdGlvbnMgYW5kIEtFRVAuCisKK1dlZCBKdWwgIDEgMTU6MjE6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBQZXRlciBKb3JkYW4gPHBqb3JkYW5AY2hsYS51c2MuZWR1PjoKKwkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBDb3JyZWN0IGNvbnN0cnVjdG9yIGhhbmRsaW5nIGZvciAtdS4KKworVHVlIEp1biAyMyAxNToxNzoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlIGxkc2NyaXB0cyBzdWJkaXJlY3RvcnkuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVHVlIEp1biAyMyAxNToxNzowNCAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQorCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworU3VuIEp1biAyMSAyMzo1NToxNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGxkLnRleGluZm86IE5vdGUgdGhhdCAtcmVsYXggbWF5IG1ha2Ugc3ltYm9saWMgZGVidWdnaW5nCisJaW1wb3NzaWJsZSBvbiBzb21lIHBsYXRmb3Jtcy4KKworVHVlIEp1biAxNiAxMjo1MToxMyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBNYWtlZmlsZS5hbSAoTWFrZWZpbGUpOiBSZW1vdmUgdGFyZ2V0LgorCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisJKiBjb25maWd1cmUuaG9zdCAocG93ZXJwYyotKi1saW51eC1nbnUqKTogTmV3IGhvc3QuCisKK0ZyaSBKdW4gMTIgMTc6Mzg6MDcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoSU5QVVRfRklMRVMpOiBPcHRpb25hbCBJTlBVVCBzcGVjLgorCisJKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBDaGFuZ2UgdG9wIG9mCisJc3RhY2sgdG8gOE1CLgorCitGcmkgSnVuIDEyIDE5OjMzOjE3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEhGSUxFUyk6IFJlbW92ZSBjb25maWcuaC4KKwkoRU1VTEFUSU9OX09GSUxFUywgUE9URklMRVMpOiBNb3ZlIHBhdGNoIG9mIE1heSAxNCBmcm9tCisJTWFrZWZpbGUuaW4gdG8gTWFrZWZpbGUuYW0uCisJKGVhcm1jb2ZmLmMpOiBEZXBlbmQgdXBvbiBhcm1jb2ZmLmVtLCBub3QgZ2VuZXJpYy5lbS4KKwkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBDb3JyZWN0IG1pc3NwZWxsaW5nIGluICQoUEFDS0FHRSkuCisJKCQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCk6IFBhc3MgLUMgdG8gJChYR0VUVEVYVCkuCisJKiBNYWtlZmlsZS5pbiwgcG8vUE9URklMRVMuaW4sIHBvL2xkLnBvdDogUmVidWlsZC4KKworRnJpIEp1biAxMiAxMzo0MzoxNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCisJKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KKworVHVlIEp1biAgOSAwOTozNjo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBBZGQgQ09OU1QgdHlwZSBtb2RpZmllciB0byBkZWNsYXJhdGlvbgorCW9mICdzZW5kJy4KKworRnJpIEp1biAgNSAxODoxOTo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFNldAorCWNvbmZpZy5oYXNfc2hhcmVkIHRvIHRydWUuCisJKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6CisJTGlrZXdpc2UuCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6CisJTGlrZXdpc2UuCisKK1R1ZSBKdW4gIDIgMTI6NTU6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBJZiB0aGUgZW50cnkgc3ltYm9sIGlzIG5vdCBmb3VuZCwgdHJ5CisJcGFyc2luZyBpdCBhcyBhIG51bWJlci4KKwkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBEb2N1bWVudCB0aGlzLgorCitNb24gSnVuICAxIDE0OjAxOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQudGV4aW5mbyAoSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMpOiBEb2N1bWVudCBTT1JUIGtleXdvcmQuCisKK01vbiBNYXkgMTggMTI6NDI6NTMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBOZXcgbWVtYmVyIGhhc19zaGFyZWQuCisJKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgaXQuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFNldCBpdC4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVHJlYXQgLXNoYXJlZCBhcyBlcnJvciBpZiBub3Qgc3VwcG9ydGVkLgorCitNb24gTWF5IDE4IDEzOjE0OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gSmFzb24gTWVycmlsbCA8amFzb25AY3lnbnVzLmNvbT46CisJKiBsZGxhbmcuYyAod2lsZF9zb3J0KTogQ29ycmVjdCBvcmRlciBvZiBzb3J0LgorCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgKmNydGJlZ2luLm8gYmVmb3JlIG90aGVyIC5jdG9ycyBhbmQKKwkuZHRvcnMuCisJKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KKwkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KKworRnJpIE1heSAxNSAwMDoyMjozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBrZXl3b3JkIFNPUlQuCisJKiBsZGdyYW0ueSAoY3VycmVudF9maWxlKTogQ2hhbmdlIHRvIHN0cnVjdCB3aWxkY2FyZF9zcGVjLgorCSgldW5pb24pOiBBZGQgbmV3IGZpZWxkcyBjbmFtZSBhbmQgd2lsZGNhcmQuCisJKHdpbGRjYXJkX25hbWUsIHdpbGRjYXJkX3NwZWMpOiBOZXcgbm9udGVybWluYWxzLgorCShmaWxlX05BTUVfbGlzdCk6IFVzZSB3aWxkY2FyZF9zcGVjLgorCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBDaGFuZ2UgY3VycmVudF9maWxlIHVzYWdlLgorCSogbGQuaCAoc3RydWN0IHdpbGRjYXJkX3NwZWMpOiBEZWZpbmUuCisJKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkcworCXNlY3Rpb25zX3NvcnRlZCBhbmQgZmlsZW5hbWVzX3NvcnRlZC4KKwkobGFuZ19hZGRfd2lsZCk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KKwkqIGxkbGFuZy5jICh3aWxkX3NvcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh3aWxkX3NlY3Rpb24pOiBVc2Ugd2lsZF9zb3J0LgorCShwcmludF93aWxkX3N0YXRlbWVudCk6IFByaW50IHNvcnRpbmcgaW5mb3JtYXRpb24uCisJKGxhbmdfYWRkX3dpbGQpOiBBZGQgbmV3IHBhcmFtZXRlcnMgc2VjdGlvbnNfc29ydGVkIGFuZAorCWZpbGVuYW1lc19zb3J0ZWQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IFVwZGF0ZSBjYWxscyB0byBsYW5nX2FkZF93aWxkLgorCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBTb3J0IC5jdG9ycy4qIGFuZCAuZHRvcnMuKiBieSBzZWN0aW9uIG5hbWUuCisJKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBMaWtld2lzZS4KKwkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KKworVGh1IE1heSAxNCAxODozOToxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUuCisKK1RodSBNYXkgMTQgMTQ6NTE6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGRlbXVsLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucy4KKwkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIG5ldyBmaWVsZDogbGlzdF9vcHRpb25zLgorCSogbGRlbXVsLmMgKGxkZW11bF9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBDYWxsIHRoZQorCWxpc3Rfb3B0aW9ucyBmaWVsZCBvZiB0aGUgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGZvciBlYWNoCisJc3VwcG9ydGVkIGVtdWxhdGlvbiwgaWYgc3VjaCBhIGZ1bmN0aW9uIGlzIHByZXNlbnQuCisJKiBsZXhzdXAuYyAoaGVscCk6IENhbGwgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMuCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF88Pl9saXN0X29wdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBEZXNjcmliZQorCXRoZSBwZSBlbXVsYXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisJKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoZ2xkPD5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLgorCURlc2NyaWJlICB0aGUgYXJtY29mZiBlbXVsYXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisKKwkqIGVtdWx0ZW1wbC9wZS5lbTogQWRkIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb246CisJLS1zdXBwb3J0LW9sZC1jb2RlLgorCSogZW11bHRlbXBsL2FybWNvZmYuZW06IERpdHRvLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhlIC0tc3VwcG9ydC1vbGQtY29kZSBvcHRpb24uCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgZW11bGF0aW9uIGZpbGVzIGZvciBQT1RGSUxFUy5pbiB0YXJnZXQuCisJKiBlbXVsdGVtcGwvcGUuZW06IEludGVybmF0aW9uYWxpc2Ugc3VpdGFibGUgc3RyaW5ncy4KKwkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBJbnRlcm5hdGlvbmFsaXNlIHN1aXRhYmxlIHN0cmluZ3MuCisJKiBwby9QT1RGSUxFUy5pbjogUmVidWlsdC4KKworU3VuIE1heSAxMCAyMjozNjozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKyAgICAgICAgKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgorCitUdWUgQXByIDI4IDE5OjE4OjMwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogbGRtYWluLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgorCSogbGQuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCisJKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgorCitNb24gQXByIDI3IDExOjU2OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogbGQudGV4aW5mbyAoT3B0aW9ucykgWy1ycGF0aC1saW5rXTogTWVudGlvbiBsZC5zby5jb25mLgorCisJQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46CisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsb2JhbF92ZXJjaGVja19uZWVkZWQpOiBOZXcgZmlsZSBzdGF0aWMKKwl2YXJpYWJsZS4KKwkoZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IENoZWNrIGZvciBzaGFyZWQgbGlicmFyaWVzCisJdHdpY2UsIG9uY2Ugd2l0aCBmb3JjZSBzZXQgdG8gMCBhbmQgb25jZSB3aXRoIGl0IHNldCB0byAxLgorIAkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZik6IEFkZCBmb3JjZSBwYXJhbWV0ZXIuCisJQ2hhbmdlIGFsbCBjYWxsZXJzLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTGlrZXdpc2UuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBMaWtld2lzZS4gIElmIG5vdCBmb3JjZSwgY2hlY2sKKwl3aGV0aGVyIHRoZSBsaWJyYXJpZXMgbmVlZHMgYW55IGluY29tcGF0aWJsZSB2ZXJzaW9ucy4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCitXZWQgQXByIDIyIDE2OjAxOjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KKworV2VkIEFwciAyMiAxMjo0MDo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogQWRkICQoSU5UTExJQlMpIHRvIExJQklCRVJUWSB3aGVuCisJaW52b2tpbmcgcnVudGVzdC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZSAtbCBvcHRpb25zIGludG8gLS1saWJyYXJ5IG9wdGlvbnMKKwl0byBhdm9pZCBjb25mdXNpb24gYmV0d2VlbiAtbGkgYW5kIC1saWJyYXJ5LgorCisJKiBsZC50ZXhpbmZvIChNRU1PUlkpOiBDbGFyaWZ5IHVzZSBvZiA+UkVHSU9OLgorCitUdWUgQXByIDIxIDIzOjEyOjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+CisKKwkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQorCXN0cmluZ3MuCisJKiBsZC5oOiBBZGRlZCBnZXR0ZXh0LXJlbGF0ZWQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCisJKiBsZG1haW4uYzogQ2FsbCBzZXRsb2NhbGUsIGJpbmR0ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluLgorCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAorCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCisJKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCisJcG8vTWFrZWZpbGUuICBVc2UgQU1fUFJPR19MRVguCisJKFRESVJTKTogQUNfU1VCU1QgZWFybHkgb24sIHRvIGF2b2lkIGhhdmluZyB2YWx1ZSBzcGxpdCB3aGVuIGl0CisJaGFwcGVucyB0byBjcm9zcyBsaW5lIDkwIG9mIHRoZSBnZW5lcmF0ZWQgc2VkIHNjcmlwdC4KKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogTmV3IG1hY3JvLgorCShQT1RGSUxFUyk6IExpa2V3aXNlLgorCShwby9QT1RGSUxFUy5pbik6IE5ldyB0YXJnZXQuCisJKGxkX25ld19MREFERCk6IEFkZGVkIElOVExMSUJTLgorCShsZF9uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgSU5UTERFUFMuCisJKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgorCitUdWUgQXByIDIxIDIzOjA3OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQudGV4aW5mbyAoU2ltcGxlIEV4YW1wbGUpOiBSZXdyaXRlIGEgZmV3IHRoaW5ncyBhcyBzdWdnZXN0ZWQKKwlieSBOaWNrIENsaWZ0b24gPG5pY2tjQGN5Z251cy5jb20+LgorCShQUk9WSURFKTogTGlrZXdpc2UuCisKK1R1ZSBBcHIgMjEgMDk6NTU6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtOiBSZW5hbWUgZXh0ZXJuYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMKKwl0byBjb25mb3JtIHRvIEJGRCBuYW1pbmcgY29udmVudGlvbnMuICBBZGQgY29kZSB0byBfYWZ0ZXJfb3BlbigpCisJZnVuY3Rpb24gdG8gb2J0YWluIGEgYmZkIGZvciB1c2UgYnkgdGhlIGludGVyd29ya2luZyBjb2RlLgorCisJKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogUmVuYW1lIGV4dGVybmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zCisJdG8gY29uZm9ybSB0byBCRkQgbmFtaW5nIGNvbnZlbnRpb25zLiAgQWRkIG5ldyBfYWZ0ZXJfb3BlbigpCisJZnVuY3Rpb24gdG8gb2J0YWluIGEgYmZkIGZvciB1c2UgYnkgdGhlIGludGVyd29ya2luZyBjb2RlLgorCitTdW4gQXByIDE5IDE5OjIzOjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpIFtjYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bV06CisJVXBkYXRlIGRvdCBhbmQgdGhlIGRlZmF1bHQgbWVtb3J5IHNlY3Rpb24gZXZlbiB3aGVuIHJlbGF4aW5nLgorCitTYXQgQXByIDE4IDE4OjQxOjEyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBNYW5pcHVsYXRlIHRoZSBzZWN0aW9uJ3MgY29va2VkIHNpemUKKwlyYXRoZXIgdGhhbiBpdHMgcmF3IHNpemUuCisKK1R1ZSBBcHIgIDcgMTM6MzU6MjkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFRFU1RCRkRMSUIpOiBOZXcuICBEZWZpbmVkIGFuZCBzdWJzdGl0dXRlZC4KKwkqIE1ha2VmaWxlLmFtIChURVNUQkZETElCKTogQ2hhbmdlZCB0byBAVEVTVEJGRExJQkAuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitNb24gQXByICA2IDE1OjMzOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGxkLmluZm8pOiBJbnZva2UgbWFrZWluZm8gd2l0aCAtSSBvcHRpb25zIGRpcmVjdGx5CisJcmF0aGVyIHRoYW4gcmVseWluZyBvbiBkZWZhdWx0IHJ1bGUuICBEb24ndCBkZXBlbmQgdXBvbgorCWJmZHN1bW0udGV4aS4KKwkobGQuZHZpKTogTGlrZXdpc2UuCisJKGJmZHN1bW0udGV4aSk6IFJlbW92ZSB0YXJnZXQuCisJKENMRUFORklMRVMpOiBUYWtlIGJmZHN1bW0udGV4aSBvdXQgb2YgdmFsdWUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworU3VuIEFwciAgNSAxMzowNzo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBVc2Ugc2hlbGwgdmFyaWFibGVzIHRvIGF2b2lkIGRlcGVuZGluZyB1cG9uCisJaG93ICQgaXMgaGFuZGxlZCB3aGVuIGV4cGFuZGluZyBhIHNoZWxsIHN1YnN0aXR1dGlvbi4KKworRnJpIEFwciAgMyAwMDo1Njo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQWRkIGxkLmxvZyBhbmQgbGQuc3VtLgorCShESVNUQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogY29uZmlndXJlLmluOiBQdXQgdGhlIHRkaXJzIGluIGEgZmlsZSBhbmQgdXNlIEFDX1NVQlNUX0ZJTEUsCisJcmF0aGVyIHRoYW4gaW4gYSBzaGVsbCB2YXJpYWJsZSBhbmQgdXNpbmcgQUNfU1VCU1QuCisJKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBSZW1vdmUgbGRzY3JpcHRzLiAgQWRkIHRkaXJzLgorIAkoZGlzdGNsZWFuLWxvY2FsKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIGxkLnRleGluZm86IENvbXBsZXRlbHkgcmV3cml0ZSBsaW5rZXIgc2NyaXB0IGRvY3VtZW50YXRpb24uCisKK01vbiBNYXIgMzAgMTI6NDc6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCisKK1NhdCBNYXIgMjggMTY6NDg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IFJlbW92ZSB0bXBkaXIuCisJKG1vc3RseWNsZWFuLWxvY2FsKTogTmV3IHRhcmdldCB0byByZW1vdmUgdG1wZGlyLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6CisJKiBsZGNyZWYuYyAob3V0cHV0X2NyZWYpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCisJKiBsZGZpbGUuYyAobGRmaWxlX2FkZF9hcmNoKTogTGlrZXdpc2UuCisJKiBsZGxhbmcuYyAobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24pOiBMaWtld2lzZS4KKwkqIGxleHN1cC5jIChPUFRJT05fQ09VTlQpOiBMaWtld2lzZS4KKwkocGFyc2VfYXJncyk6IExpa2V3aXNlLgorCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOgorCUxpa2V3aXNlLgorCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogTGlrZXdpc2UuCisJKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IEluaXRpYWxpemUgdmFyaWFibGVzIHRvIGF2b2lkIHdhcm5pbmdzLgorCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogTGlrZXdpc2UuCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBMaWtld2lzZS4KKwkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6CisJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCisKKwkqIE1ha2VmaWxlLmFtIChNT1NUTFlDTEVBTkZJTEVTKTogQ29ycmVjdCBuYW1lICh3YXMKKwlNT1NUQ0xFQU5GSUxFUykuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworRnJpIE1hciAyNyAxNjozOToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogUHV0CisJQVJNIGNvZGUgaW5zaWRlIGlmZGVmIFRBUkdFVF9JU19hcm1wZS4KKworV2VkIE1hciAyNSAxMTozNDoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgIDxoamxAZ251Lm9yZz46CisJKiBNYWtlZmlsZS5hbSAoTERESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUuCisJKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogc2NyaXB0dGVtcGwvcGUuc2M6IE9ubHkgaW5jbHVkZSAuaWRhdGFcJFswLTddIGluIC5pZGF0YSB3aGVuCisJcmVsb2NhdGluZy4KKworVHVlIE1hciAyNCAxNTo1OToyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLnRleHQpOiBBZGQgLmdsdWVfNyBhbmQgLmdsdWVfN3Qgc2VjdGlvbnMgdG8KKwlob2xkIEFybS9UaHVtYiBzdHVicy4KKworCSogZW11bHRlbXBsL3BlLmVtIChnbGRfcGVfYmVmb3JlX2FsbG9jYXRpb24pOiBDYWxsCisJYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGZvciBBUk0vVGh1bWIgdGFyZ2V0cykgaW4gb3JkZXIgdG8KKwlnYXRoZXIgaW50ZXJ3b3JraW5nIHN0YiBpbmZvcm1hdGlvbi4KKworTW9uIE1hciAyMyAxODo1NDoxNSAxOTk4ICBKb2VsIFNoZXJyaWxsICA8am9lbEBPQVJjb3JwLmNvbT4KKworCSogY29uZmlndXJlLnRndDogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCisKK0ZyaSBNYXIgMjAgMTk6MTc6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KKworVGh1IE1hciAxOSAxNDo1NDo0NSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wZS5zYzogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIC5kYXRhJG5vY29weQorCXNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEgb24gZm9yay4gIFRoZSBsaW5rZXIgdXNlZCB0bworCWluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0CisJYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBUaGUgZml4IGlzIHRvIHJlbmFtZSB0aGUKKwlzZWN0aW9uCSIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIKKwlfX2RhdGFfZW5kX18uCisKK1dlZCBNYXIgMTggMDk6NDI6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCisKK1N1biBNYXIgIDggMjM6MzQ6MTQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAoc3BhcmNsaXRlKi0qLWVsZik6IEFkZGVkLgorCitNb24gTWFyICAyIDE5OjI0OjA4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgdGhlIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbiBpcworCSpkZWZhdWx0Kiwgc2VlIGlmIHRoZXJlIGlzIGEgbWVtb3J5IHJlZ2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQuCisKK1RodSBGZWIgMjYgMTc6MDk6NTMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFkZCBzdXBwb3J0IGZvciAuZWl0X3Ygc2VjdGlvbiBhbmQgcHV0CisJaXQgYXQgMHhmZmZmZjAyMC4KKwkqIGVtdWxwYXJhbXMvZDMwdntlbGYsX28sX2V9LnNoOiBEaXR0by4KKworTW9uIEZlYiAyMyAxNzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IFBlcm1pdCB0aGUgd2lsZGNhcmQgdG8gaW5jbHVkZQorCWEgdHJhaWxpbmcgJyonIHdoZW4gc29ydGluZyBncm91cGVkIHNlY3Rpb25zLgorCSogc2NyaXB0dGVtcGwvcGUuc2M6IEluY2x1ZGUgZ3JvdXBlZCBzZWN0aW9ucyB1c2luZyBOQU1FXCQqLiAgT25seQorCWluY2x1ZGUgdGhlbSB3aGVuIHJlbG9jYXRpbmcuCisKK1dlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgorCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgorCitGcmkgRmViIDEzIDE1OjI0OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCisJKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KKworVGh1IEZlYiAxMiAxNDoxMDo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWxpZ24gdGhlIF9lbmQgc3ltYm9sIGFjY29yZGluZyB0byB0aGUgRUxGCisgCWZvcm1hdCBzaXplLiAgRnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT4uCisKKwlOZXRCU0QgcGF0Y2hlcyBmcm9tIEdvcmRvbiBXLiBSb3NzIDxnd3JAbWMuY29tPjoKKwkqIGNvbmZpZ3VyZS5ob3N0IChhbHBoYSotKi1uZXRic2QqKTogTmV3IGhvc3QuCisJKiBjb25maWd1cmUudGd0IChhbHBoYSotKi1uZXRic2QqLCBwb3dlcnBjLSotbmV0YnNkKik6IE5ldworCXRhcmdldHMuCisKKwkqIGxleHN1cC5jIChoZWxwKTogVXBkYXRlIGJ1Zy1nbnUtdXRpbHMgYWRkcmVzcy4KKwkqIGxkLnRleGluZm8gKEJ1ZyBSZXBvcnRpbmcpOiBMaWtld2lzZS4KKworVHVlIEZlYiAxMCAxODowNTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXYXJuIGlmIHNvbWUgbWVtb3J5IHJlZ2lvbnMgd2VyZQorCWRlZmluZWQsIGJ1dCBhIGxvYWRhYmxlIHNlY3Rpb24gaXMgZ29pbmcgaW50byB0aGUgZGVmYXVsdCBtZW1vcnkKKwlyZWdpb24uCisKK1R1ZSBGZWIgMTAgMTY6MTc6MjAgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgorCisJKiBsZGxleC5sIChWX0lERU5USUZJRVIpOiBBbGxvdyAnLicgYXMgc3ltYm9sIHByZWZpeC4KKworVHVlIEZlYiAxMCAxNTowOTo0NSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChNYWtlZmlsZSk6IEFkZCB0YXJnZXQsIGZvciBkZXBlbmRlbmNpZXMgb24KKwljb25maWd1cmUuaG9zdCBhbmQgY29uZmlndXJlLnRndC4KKwkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUudGd0OiBDaGFuZ2UgLWxpbnV4KiB0byAtbGludXgtZ251Ki4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitNb24gRmViICA5IDEzOjQ0OjQwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAoLnN0YWNrKTogTW92ZSBzdGFjayB0byAweDAwLi43RkZFLgorCisJKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFJFQURPTkxZX1NUQVJUX0FERFIpOiBSZWFkIG9ubHkgc2VjdGlvbgorIAltb3ZlZCB0byAweDAwLi4uLi40LgorCitTYXQgRmViICA3IDE1OjQxOjI2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCisKK1RodSBGZWIgIDUgMTI6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wZS5zYzogUmVtb3ZlICR7UkVMT0NBVElORy0wfSBmcm9tIGFsbCBzZWN0aW9ucy4KKwlGcm9tIFRob21hcyBkZSBMZWxsaXMgPHRkZWxAd3JzLmNvbT4uCisKKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKworV2VkIEZlYiAgNCAxMzowMjozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChsZF9uZXdfTERBREQpOiBSZW1vdmUgQExFWExJQkAuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworTW9uIEZlYiAgMiAxOTozNDo1NCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgorCisJQWRkIHRtczMyMGMzMCBzdXBwb3J0OgorCSogY29uZmlndXJlLnRndCAodGljMzAtKi0qYW91dCosIHRpYzMwLSotKmNvZmYqKTogTmV3IHRhcmdldHMuCisJKiBlbXVscGFyYW1zL3RpYzMwYW91dC5zaDogTmV3IGZpbGUuCisJKiBlbXVscGFyYW1zL3RpYzMwY29mZi5zaDogTmV3IGZpbGUuCisJKiBzY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2M6IE5ldyBmaWxlLgorCSogc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBldGljMzBhb3V0Lm8gYW5kCisJZXRpYzMwY29mZi5vLgorCShldGljMzBhb3V0LmMsIGV0aWMzMGNvZmYuYyk6IE5ldyB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK01vbiBGZWIgIDIgMTQ6MTA6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogQ29ycmVjdCBIT1NUSU5HX0NSVDAgaW4gYWxwaGEqLSotbGludXgqIGNhc2UgdG8KKwlhY2NlcHQgZWl0aGVyIGxkLnNvIG9yIGxkLWxpbnV4LnNvLgorCitGcmkgSmFuIDMwIDE5OjE2OjI4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtICh7Q0MsQ1hYfV9GT1JfVEFSR0VUKTogQ2hhbmdlIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKKwl0byB0cmFuc2Zvcm0uCisJKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KKworRnJpIEphbiAzMCAxOToxNToxNyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFB1dCAuZHluc2JzcyBpbiAuc2Jzcy4KKworRnJpIEphbiAzMCAxMTo0Mzo0OSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBNYWtlZmlsZS5hbSAoZWVsZjMyYnNtaXAuYywgZWVsZjMybHNtaXAuYyk6IE5ldyB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1RodSBKYW4gMjkgMTY6MDQ6MjEgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKwkqIGxkZmlsZS5jIChzbGFzaCk6IFNldCB0byBiYWNrc2xhc2ggaWYgX1dJTjMyIGJ1dCBub3QKKwlfX0NZR1dJTjMyX18uCisJKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogSWYgX19NU0RPU19fIG9yIF9XSU4zMiwgYWNjZXB0IGEKKwlsZWFkaW5nIGJhY2tzbGFzaCBvciBhIGxlYWRpbmcgeDogYXMgYW4gYWJzb2x1dGUgcGF0aC4KKwkobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogVXNlIHNsYXNoIHJhdGhlciB0aGFuIC8gd2hlbgorCWdlbmVyYXRpbmcgbmFtZSB0byB0cnkuCisJKiBsZXhzdXAuYyAoUEFUSF9TRVBBUkFUT1IpOiBEZWZpbmUuCisJKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBVc2UgUEFUSF9TRVBBUkFUT1IgcmF0aGVyIHRoYW4gJzonLgorCitXZWQgSmFuIDI4IDE0OjA2OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEVMRlNJWkUpOiA2NAorCShURVhUX1NUQVJUX0FERFIpOiBSb3VuZCBvZmYsIHNpbmNlIFNJWkVPRl9IRUFERVJTIGlzIGFkZGVkIGxhdGVyLgorCShEQVRBX1BMVCk6IE5lZWRlZCBieSB2OSBhYmkuCisKK1dlZCBKYW4gMjggMTY6Mzc6MjcgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogTmV3IGVudHJ5LgorCitXZWQgSmFuIDI4IDE1OjUxOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBPbmx5IGluY2x1ZGUgbGlua29uY2Ugc2VjdGlvbnMgaW4gZmluYWwKKwlzZWN0aW9ucyB3aGVuIHJlbG9jYXRpbmcuCisKK1dlZCBKYW4gMjggMTQ6MTA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQWRkIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGVzIG9mCisJaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gYSBsaW5rIG1hcC4KKworCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gTERFTVVMQVRJT04gaW4gZGVzY3JpcHRpb24gb2YgLW0uCisJKEVudmlyb25tZW50KTogTWVudGlvbiBMREVNVUxBVElPTi4KKworCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IENsYXJpZnkgLS1leHBvcnQtZHluYW1pYyBhIGJpdC4KKworVGh1IEphbiAyMiAxNjowNzoyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBsZGxleC5sICg8U0NSSVBUPntXSUxEQ0hBUn0qKTogVGFrZSBjYXJlIGZvciB0aGUgY29tbWVudHMgdGhpcworCXBhdHRlcm4gY291bGQgbWF0Y2guCisKK1dlZCBKYW4gMjEgMjI6MjY6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IFdoZW4gZG9pbmcKKwlhIHJlbG9jYXRlYWJsZSBsaW5rLCBzZXQgdGhlIGltYWdlIGJhc2UgdG8gMCwgYW5kIGRvbid0IGRlZmluZSB0aGUKKwl2YXJpb3VzIHN5bWJvbHMuCisJKiBlbXVscGFyYW1zL2kzODZwZS5zaCAoUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCisJKiBzY3JpcHR0ZW1wbC9wZS5zYzogU3dhcCB0aGUgLmRhdGEgYW5kIC5ic3Mgc2VjdGlvbnMgc28gdGhhdAorCS5kYXRhIGNvbWVzIGZpcnN0LiAgSWYgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdXNlCisJUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHN0YXJ0IHRoZQorCXNlY3Rpb25zIGF0IDAsIGFuZCBkb24ndCBkZWZpbmUgYW55IHN5bWJvbHMuCisKKwkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9kZWZhdWx0KTogQ29ycmVjdCBwYXJlbnRoaXNpemF0aW9uIG9mCisJZXhwcmVzc2lvbi4KKworV2VkIEphbiAyMSAyMToyMDozMiAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogRG9uJ3QgaW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3lzL3N0YXQuaAorCWhlcmU7IHRoZXkgYXJlIGluY2x1ZGVkIGFscmVhZHkgdmlhIHN5c2RlcC5oLgorCitUdWUgSmFuICA2IDEzOjQwOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IERvbid0IGV4cGxpY2l0bHkgc2V0IC5kYXRhIGFuZCAuYnNzIHN0YXJ0LgorCitGcmkgSmFuICAyIDIwOjE1OjM3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBsZGdyYW0ueSAoYXR0cmlidXRlc19vcHQpOiBQYXNzIHJlZ2lvbiBwb2ludGVyIHRvCisJbGFuZ19zZXRfZmxhZ3MsIG5vdCAmcmVnaW9uLT5mbGFncy4KKworCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X2RlZmF1bHQpOiBOZXcgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBhCisJZGVmYXVsdCBtZW1vcnkgcmVnaW9uIGZvciBhIHNlY3Rpb24gaWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQuCisJKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBaZXJvIGZsYWdzLCBub3RfZmxhZ3MgZmllbGQuCisJKGxhbmdfbWFweyxfZmxhZ3N9KTogUHJpbnQgYXR0cmlidXRlIGZsYWdzIGluIG1lbW9yeSBtYXAuCisJKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENhbGwgbGFuZ19tZW1vcnlfZGVmYXVsdCB0byBnZXQgZGVmYXVsdAorCW1lbW9yeSByZWdpb24uCisJKGxhbmdfc2V0X2ZsYWdzKTogSW1wbGVtZW50IGF0dHJpYnV0ZSBmbGFncyBmb3IgcmVhbC4gIFRha2UgbmV3CisJYXJndW1lbnQgdG8gZ2l2ZSB0aGUgZmxhZ3Mgd2UgYXJlIHRvIHNraXAgZm9yIHRoaXMgcmVnaW9uLgorCisJKiBsZGxhbmcuaCAobWVtb3J5X3JlZ2lvbl9zdHJ1Y3QpOiBBZGQgbm90X2ZsYWdzIGZpZWxkLCBtYWtlIGJvdGgKKwlmbGFncyBmaWVsZHMgZmxhZ3dvcmQgdHlwZS4KKwkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZSk6IE1ha2UgZmxhZ3MgZmllbGQgZmxhZ3dvcmQgdHlwZS4KKwkobGFuZ19zZXRfZmxhZ3MpOiBVcGRhdGUgcHJvdG90eXBlIHRvIG1hdGNoIG5ldyBjYWxsaW5nIHNlcXVlbmNlLgorCShsYW5nX21lbW9yeV9yZWdpb25fZGVmYXVsdCk6IEFkZCBwcm90b3R5cGUuCisKKwkqIGVtdWxwYXJhbXMvZDMwdntfZSxfbyxlbGZ9LnNoICh7VEVYVCxEQVRBLEVNRU19X0RFRl9TRUNUSU9OKToKKwlEZWZpbmUgd2hldGhlciBvciBub3QgdGhlIHJlZ2lvbiBnZXRzIGRlZmF1bHQgc2VjdGlvbnMsIGFuZCBpZiBzbywKKwl3aGF0IHNlY3Rpb25zLgorCisJKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjIChNRU1PUlkpOiBTZXQgdXAgd2hpY2ggb2YgdGhlIHJlZ2lvbnMgZ2V0CisJZGVmYXVsdCBzZWN0aW9ucy4KKworVGh1IEphbiAgMSAyMjo1ODowNCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoLmVoX2ZyYW1lKTogTGluayBpbnRvIHRoZSBkYXRhIHNlY3Rpb24uCisKK1RodSBKYW4gIDEgMTg6MDQ6NTEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IEZpeCB0eXBvLgorCSogc2NyaXB0dGVtcGwvaDgzMDBzLnNjOiBMaWtld2lzZS4KKworU3VuIERlYyAyMSAxMjo1MTo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IERvbid0IGNyYXNoIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhCisJc2VjdGlvbiB3aXRoIG5vIG91dHB1dCBzZWN0aW9uLCBzdWNoIGFzIGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4KKworV2VkIERlYyAxNyAxMjoxNDoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogS2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gdGhlIG9wdGlvbgorCXBhcnNpbmcgYmVmb3JlIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MsIHNvIHRoYXQgd2UgZG9uJ3QgY2FsbCBpdAorCW11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGFyZ3VtZW50IGFuZCBjb25mdXNlIHRoZSBnZXRvcHQKKwlpbnRlcm5hbHMuCisKK1RodSBEZWMgMTEgMDk6MDA6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtZWxmLSopOiBSZW5hbWUgZDMwdmVsZl9lIHRvIGQzMHZfZSBhbmQKKwlkMzB2ZWxmX28gdG8gZDMwdl9vIHRvIHdvcmsgaW4gRE9TIGVudmlyb25tZW50cy4KKwkqIE1ha2VmaWxlLnthbSxpbn06IERpdHRvLgorCisJKiBlbXVscGFyYW1zL2QzMHZfe28sZX06IFJlbmFtZSBmcm9tIGQzMHZlbGZfe28sZX0uCisJKiBlbXVscGFyYW1zL2QzMHZlbGZfe28sZX06IERlbGV0ZWQuCisKK1dlZCBEZWMgMTAgMTc6NDA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogQWRkIGdsdWUgc2VjdGlvbnMgKGNvZGUgdGFrZW4gZnJvbSBBcm0KKwlicmFuY2gpLgorCisJKiBlbXVscGFyYW1zL2FybWNvZmYuc2ggKFRFTVBMQVRFX05BTUUpOiBTZXQgdG8gYXJtY29mZi4KKworCSogZW11bHRlbXBsL2FybWNvZmYuZW06IE5ldyBmaWxlLCBpbXBvcnRlZCBmcm9tIEFybSBicmFuY2guCisKK1dlZCBEZWMgMTAgMTQ6MTA6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFkZCAucmVsIGFuZCAucmVsYSBzZWN0aW9ucyBmb3IgYWxsCisJZGVmaW5lZCBzZWN0aW9ucy4gIFNldCB1cCBfX3tELEN9VE9SX3tMSVNULEVORH1fXy4gIEFkZCBvbmNoaXAgYW5kCisJZXh0ZXJuYWwgbWVtb3J5IHNlY3Rpb25zIGZvciByb2RhdGEuICBEZWxldGUgLnN0cmluZywgLnJvZGF0YTEsCisJYW5kIC5kYXRhMSBzZWN0aW9ucy4KKworVHVlIERlYyAgOSAxNToyODoxNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IEFkZCBPY3QgMjMgY2hhbmdlcyB0byBNYWtlZmlsZS5pbiBoZXJlLgorCisJKiBNYWtlZmlsZS57YW0saW59OiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWQxMHZlbGYuby4KKworCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGV0aWM4MGNvZmYuby4KKworCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGVkMzB2ZWxmeyxfZSxfb30uby4KKwkoZWQzMHZlbGZfZS5jKTogTGlrZSBkMzB2ZWxmLCBleGNlcHQgLnRleHQvLmRhdGEvZXRjIGFsd2F5cyBnbyBpbgorCWV4dGVybmFsIG1lbW9yeS4KKwkoZWQzMHZlbGZfby5jKTogTGlrZSBkMzB2ZWxmLCBleGNlcHQgLnRleHQvLmRhdGEvZXRjIGFsd2F5cyBnbyBpbgorCW9uY2hpcCBtZW1vcnkuCisKKwkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoU1RBQ0tfU1RBUlRfQUREUik6IFRvcCBvZiBkZWZhdWx0CisJc3RhY2suCisJKHtURVhULERBVEEsRU1FTX1fU0laRSk6IFNpemVzIG9mIHRoZSAzIG1lbW9yeSBhcmVhcy4KKwkoe1RFWFQsREFUQSxCU1N9X01FTU9SWSk6IFdoaWNoIG1lbW9yeSByZWdpb24gLnRleHQsIC5kYXRhLCBhbmQKKwkuYnNzIHNob3VsZCBnbyBpbi4KKworCSogZW11bHBhcmFtcy9kMzB2ZWxmX3tlLG99LnNoOiBOZXcgZmlsZXMgdG8gYmUgZXhwbGljaXQgd2hldGhlcgorCS50ZXh0LCAuZGF0YSwgZXRjIGdvIGluIGV4dGVybmFsIG1lbW9yeSBvciBvbmNoaXAgbWVtb3J5LgorCisJKiBjb25maWd1cmUudGd0IChkMzB2LSotKmV4dCopOiBOZXcgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0CisJLnRleHQsIC5kYXRhLCBldGMuIGluIGV4dGVybmFsIG1lbW9yeS4KKwkoZDMwdi0qLSpvbmNoaXAqKTogTmV3IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdCAudGV4dCwgLmRhdGEsCisJZXRjLiBpbiBvbmNoaXAgbWVtb3J5LgorCShkMzB2LSotKik6IEFkZCBkMzB2ZWxmX3tlLG99IGVtdWxhdGlvbnMuCisKKwkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IEFsbG93IC50ZXh0LCAuZGF0YSwgLmJzcyB0byBiZSBwdXQgaW4KKwllaXRoZXIgdGhlIG9uY2hpcCB0ZXh0L2RhdGEgYXJlYXMgb3IgdGhlIGV4dGVybmFsIG1lbW9yeSBhcmVhLgorCShNRU1PUlkpOiBHZXQgc2l6ZXMgZnJvbSBkMzB2ZWxmLnNoLgorCSguZXtkYXRhLHRleHQsYnNzfSk6IFB1dCBzZWN0aW9ucyBpbiB0aGUgZXh0ZXJuYWwgbWVtb3J5IHJlZ2lvbi4KKwkoLnN0ZXh0KTogUHV0IHNlY3Rpb24gaW4gdGhlIG9uY2hpcCB0ZXh0IHJlZ2lvbi4KKwkoLnN7ZGF0YSxic3N9KTogUHV0IHNlY3Rpb25zIGluIHRoZSBvbmNoaXAgZGF0YSByZWdpb24uCisJKF9fc3RhY2spOiBBc3NpZ24gZnJvbSAke1NUQUNLX1NUQVJUX0FERFJ9LgorCSgudGV4dCk6IFB1dCBpbiAke1RFWFRfTUVNT1JZfSBtZW1vcnkgcmVnaW9uLgorCSguZGF0YXssMX0vLnN0cmluZ3MvLnJvZGF0YXssMX0pOiBQdXQgaW4gJHtEQVRBX01FTU9SWX0gbWVtb3J5CisJcmVnaW9uLgorCSguYnNzKTogUHV0IGluICR7QlNTX01FTU9SWX0gbWVtb3J5IHJlZ2lvbi4KKworVHVlIERlYyAgMiAxMDoxNDo0NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KKworU2F0IE5vdiAyMiAxNToyMzoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGV4Lmw6IERvbid0IGRlZmluZSBoZXhfbW9kZS4gIENvcnJlY3QgbnVtYmVyIHJlZ2V4cCB0byBub3QKKwlhY2NlcHQgaGV4IGRpZ2l0cyB3aXRob3V0IGEgbGVhZGluZyAkIG9yIDB4LiAgSGFuZGxlIGxlYWRpbmcgJAorCWNvcnJlY3RseS4gIFBhc3MgMCByYXRoZXIgdGhhbiBoZXhfbW9kZSB0byBiZmRfc2Nhbl92bWEuCisJKiBsZGxleC5oIChoZXhfbW9kZSk6IERvbid0IGRlY2xhcmUuCisKK1N1biBOb3YgMTYgMjA6MTY6NDUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaCAoe0RBVEEsRU1FTX1fU1RBUlRfQUREUik6IERlZmluZSBhcyBzdGFydAorCW9mIGludGVybmFsIGRhdGEgYXJlYSBhbmQgZXh0ZXJuYWwgbWVtb3J5IG9uIGNoaXAuCisKKwkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IERlZmluZSBhIE1FTU9SWSByZWdpb24gdGhhdCBkZXNjcmliZXMKKwl0aGUgMyByZWdpb25zIG9mIG1lbW9yeSBvbiB0aGUgY2hpcC4gIFB1dCAudGV4dC8uaW5pdC8uZmluaSBpbnRvCisJdGhlIHRleHQgbWVtb3J5IHJlZ2lvbiwgcHV0IG90aGVyIHNlZ21lbnRzIGludG8gdGhlIGRhdGEgbWVtb3J5CisJcmVnaW9uLiAgQWRkIG1vcmUgb2YgdGhlIHN0YW5kYXJkIGVsZiBzZWN0aW9ucy4gIERlZmF1bHQgX19zdGFjaworCXRvIGJlIDB4MjAwMDgwMDAsIHdoaWNoIGlzIDEgYnl0ZSBiZXlvbmQgZW5kIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisJcmVnaW9uLgorCitUaHUgTm92IDEzIDEzOjQ1OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IE1ha2UgRnJlZUJTRCBhIGkzODZic2QKKyAJdmFyaWFudC4KKworU3VuIE5vdiAgMiAxNDo1MTozNiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBjb25maWd1cmUuaG9zdCAoYWxwaGEqLSotbGludXgqKTogQ29ycmVjdCBIT1NUSU5HX0NSVDAuICBTZXQKKwlIT1NUSU5HX0xJQlMuCisKK1RodSBPY3QgMzAgMTI6MjU6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgd2Fybl9taXNtYXRjaCBmaWVsZC4KKwkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSB3YXJuX21pc21hdGNoIGZpZWxkLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1uby13YXJuLW1pc21hdGNoIG9wdGlvbi4KKwkqIGxkbGFuZy5jIChpZ25vcmVfYmZkX2Vycm9yKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobGFuZ19jaGVjayk6IElmIHdhcm5fbWlzbWF0Y2ggaXMgZmFsc2UsIGRvbid0IHdhcm4gYWJvdXQKKwltaXNtYXRjaGVkIGlucHV0IGZpbGVzLgorCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgbmV3IG9wdGlvbi4KKworVGh1IE9jdCAyMyAxNDozODoxOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBSZW5hbWUgbGlua2VyIHN5bWJvbCAnX3N0YWNrJyB0byAnX19zdGFjaycKKwl0byBhdm9pZCBjb25mbGljdHMgd2l0aCBDIGNvZGUgd2hpY2ggaXMgZGVmaW5pbmcgYSB2YXJpYWJsZSBjYWxsZWQKKwknc3RhY2snLgorCitUaHUgT2N0IDIzIDAwOjU3OjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBNb3ZlIGVlbGY2NF9zcGFyYy5vIC4uLgorCShBTExfNjRfRU1VTEFUSU9OUyk6IC4uLiBoZXJlLgorCShlZWxmNjRfc3BhcmMuYyk6IFRlbXBsYXRlIHNob3VsZCBiZSBlbGYzMiBub3QgZ2VuZXJpYy4KKwkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKFRFTVBMQVRFX05BTUUpOiBOZXcgZGVmaW5pdGlvbi4KKworVGh1IE9jdCAyMyAwMDo0NDoyMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndDogQWRkIHNwYXJjNjQtKi1saW51eCouCisJKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQsIE5PUCk6IE5ldy4KKworV2VkIE9jdCAyMiAxMToyOToyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLmVoX2ZyYW1lIGluIC5yZGF0YS4KKworRnJpIE9jdCAxNyAwMDowMDoxMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBPbmx5IGNoZWNrIGdsb2JhbHM8PT5sb2NhbHMsCisJc2luY2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIGV4cG9ydCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKKwlzeW1ib2wuCisKK1dlZCBPY3QgMTUgMTQ6NTI6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5zdGFiIGFuZCAuc3RhYnN0ciBzZWN0aW9ucyBhdCBlbmQuCisKK1dlZCBPY3QgIDggMTI6Mzc6MDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCwgY29uZmlndXJlLmhvc3Q6IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsKKwljb25maWcuZ3Vlc3Mgbm93IHJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgorCitGcmkgT2N0ICAzIDE0OjIzOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IERvbid0IHRyZWF0CisJLXMgYW5kIC11IGFzIC1zdGF0aWMgYW5kIC11bml4LgorCitUaHUgT2N0ICAyIDE4OjQwOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFJld3JpdGUgZmxhZyBoYW5kbGluZyBmb3IgY2xhcml0eS4gIElmIHdlCisgCWFyZSBub3QgYWRkaW5nIHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uLCBhbmQgU0VDX1JFQURPTkxZIGlzIGNsZWFyCisgCW9uIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhlbiBkb24ndCBjb3B5IGl0IGZyb20gdGhlIGlucHV0IHNlY3Rpb24uCisgIAlJZiBTRUNfUkVBRE9OTFkgaXMgbm90IHNldCBvbiB0aGUgaW5wdXQgc2VjdGlvbiwgdGhlbiBjbGVhciBpdCBvbgorIAl0aGUgb3V0cHV0IHNlY3Rpb24uCisKKwkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLXNnaS1pcml4WzU2XSopOiBVc2UgZWxmMzJic21pcCByYXRoZXIgdGhhbgorCWVsZjMyYm1pcC4KKwkobWlwcyplbC0qLWxpbnV4Kik6IENoYW5nZSBlbGYzMmxtaXAgdG8gZWxmMzJsc21pcCBhbmQgZWxmMzJibWlwCisJdG8gZWxmMzJic21pcC4KKwkobWlwcyotKi1saW51eCopOiBMaWtld2lzZS4KKwkqIGVtdWxwYXJhbXMvZWxmMzJic21pcC5zaDogTmV3IGZpbGU7IGp1c3QgbGlrZSBlbGYzMmJtaXAuc2gsIGJ1dAorCXNldHRpbmcgRU5UUlkgdG8gX19zdGFydC4KKwkqIGVtdWxwYXJhbXMvZWxmMzJsc21pcC5zaDogTmV3IGZpbGU7IGp1c3QgbGlrZSBlbGYzMmxtaXAuc2gsIGJ1dAorCXNldHRpbmcgRU5UUlkgdG8gX19zdGFydC4KKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWx3YXlzIHNldCBFTlRSWSB0byBfc3RhcnQgaWYgaXQgd2FzIG5vdAorCWFscmVhZHkgc2V0LgorCitXZWQgT2N0ICAxIDE2OjQxOjAwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoUk9aREFUQV9TVEFSVF9BRERSLCBST1NEQVRBX1NUQVJUX0FERFIpOiBOZXcKKwlWYXJpYWJsZXMuCisKKwkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1vdmUgcmVhZCBvbmx5IGFyZWFzIG91dCBvZiB6ZXJvIGFuZCBzbWFsbAorCWRhdGEgc2VjdGlvbnMgYW5kIGludG8gdGhlaXIgb3duIHNlY3Rpb25zLgorCitXZWQgU2VwIDI0IDE2OjU5OjE1IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgorCisgICAgICAgICogY29uZmlndXJlLnRndCAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLWVsZiouCisKK1dlZCBTZXAgMjQgMTE6MzM6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC50ZXhpbmZvIChTZWN0aW9uIE9wdGlvbnMpOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgTk9MT0FECisJZGlyZWN0aXZlLgorCisJKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK01vbiBTZXAgMjIgMTc6MjQ6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogUmV2ZXJ0IHBhdGNoIG9mIFNlcHRlbWJlciAzLgorCitXZWQgU2VwIDE3IDE2OjQ1OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtLCBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIGV2ODUwLmMKKwkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgdjg1MCB0YXJnZXQuCisKK1dlZCBTZXAgMTcgMTY6NDM6MzkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy92ODUwLnNoIChDQUxMX1RBQkxFX1NUQVJUX0FERFIpOiBOZXcgZW50cnkuCisJKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBBZGQgY2FsbCB0YWJsZSBkYXRhIGFyZWEKKworTW9uIFNlcCAxNSAxMToyOToxMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCU1lcmdlIGNoYW5nZSBmcm9tIE1hcnRpbiBIdW50OgorCisJKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBQdXQgLnJvZGF0YSBpbiB0aGUgLnRleHQgc2VjdGlvbi4KKworVHVlIFNlcCAgOSAwNzo0OTo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBSZW1vdmUgZXh0cmFuZW91cworCWluaXRpYWxpemF0aW9uIG9mIHAuCisKK1RodSBTZXAgIDQgMDk6MDM6MzMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSW4KKwlleHByZXNzaW9uIHByb2R1Y2VkIGZvciAtYnBUIGFuZCAtYnBEIG9wdGlvbnMsIGFsaWduIHRvIGEgMzIgYnl0ZQorCWJvdW5kYXJ5IHJhdGhlciB0aGFuIGFuIDggYnl0ZSBib3VuZGFyeS4KKwkqIHNjcmlwdHRlbXBsL2FpeC5zYzogUHV0IC50b2Nic3MgYXQgc3RhcnQgb2YgLmJzcyBzZWN0aW9uLgorCisJKiBsZG1pc2MuaCwgbGRtaXNjLmMsIGxkY3JlZi5jOiBSZW5hbWUgZmluZm8gdG8gbGZpbmZvLCB0byBhdm9pZAorCWZ1bmN0aW9uIG5hbWUgY29uZmxpY3Qgd2l0aCBBSVggNC4yIHVuaXN0ZC5oIGhlYWRlciBmaWxlLgorCitXZWQgU2VwICAzIDE1OjEyOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IENsZWFyIFNFQ19IQVNfQ09OVEVOVFMgZnJvbSBhCisJbm9sb2FkX3NlY3Rpb24uCisKK0ZyaSBBdWcgMjkgMDA6MzI6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAobGRfbmV3X0RFUEVOREVOQ0lFUyk6IFJlbW92ZSBATEVYTElCQC4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitUaHUgQXVnIDI4IDEwOjEyOjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGFyYy0qLWVsZiopOiBSZWNvZ25pemUuCisJKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFyY2VsZi5vLgorCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCisJKiBlbXVscGFyYW1zL2FyY2VsZi5zaDogTmV3IGZpbGUuCisKK1dlZCBBdWcgMjAgMTE6MTQ6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAod2lsZGNhcmRwKTogRG9uJ3QgbGV0IGEgYmFja3NsYXNoIGJ5IGl0c2VsZiBjYXVzZSBhCisJcGF0dGVybiB0byBiZSB0cmVhdGVkIGFzIGEgd2lsZGNhcmQgcGF0dGVybi4KKworCSogbGRncmFtLnkgKGF0eXBlKTogQWNjZXB0IHBhcmVudGhlc2VzIHdpdGggbm8gdHlwZS4KKworCSogbGQudGV4aW5mbyAoU2VjdGlvbiBEZWZpbml0aW9uKTogQ2xhcmlmeSB1c2Ugb2Ygd2hpdGVzcGFjZS4KKwkoU2VjdGlvbiBQbGFjZW1lbnQpOiBMaWtld2lzZS4KKworTW9uIEF1ZyAxOCAxMToxMjowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KKworTW9uIEF1ZyAxOCAxMToxMjowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KKworU2F0IEF1ZyAgOSAwMDo0MjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChsZC5pbmZvKTogQ2hhbmdlIGRlcGVuZGVuY3kgZnJvbQorCSQoQkZERElSKS9kb2MvYmZkc3VtbS50ZXhpIHRvIGJmZHN1bW0udGV4aS4KKwkobGQuZHZpKTogTGlrZXdpc2UuCisJKGJmZHN1bW0udGV4aSk6IE5ldyB0YXJnZXQuCisJKENMRUFORklMRVMpOiBBZGQgYmZkc3VtbS50ZXhpLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKwkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgorCSogYWNpbmNsdWRlLm00OiBOZXcgZmlsZSwgZnJvbSBvbGQgYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuICBSZW1vdmUKKwlzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKKwlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQUNfUFJPR19ZQUNDLAorCUFDX1BST0dfTEVYLCBhbmQgQUNfREVDTF9ZWVRFWFQuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKKwlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIERvbid0IGNhbGwgQ1lfQ1lHV0lOMzIgb3IgQ1lfRVhFRVhULgorCSogY29uZmlndXJlLmhvc3Q6IERvbid0IHNldCBITERGTEFHUywgSExERU5WLCBvciBSUEFUSF9FTlZWQVIuCisJKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCisJKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KKwkqIGxkdmVyLmMgKGxkX3Byb2dyYW1fdmVyc2lvbik6IFNldCBsZF9wcm9ncmFtX3ZlcnNpb24gZnJvbQorCVZFUlNJT04uCisJKiBsZGdyYW0ueSwgbGRsZXgubDogUmVwbGFjZSBWRVJTSU9OIHdpdGggVkVSU0lPTksuCisJKiBNYWtlZmlsZS5pbjogTm93IGJ1aWx0IHdpdGggYXV0b21ha2UuCisJKiBhY2xvY2FsLm00OiBOb3cgYnVpbHQgd2l0aCBhY2xvY2FsLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisKK01vbiBKdWwgMjggMTk6MDQ6NTAgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCisgICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KKyAgICAgICAgKiBNYWtlZmlsZS5pbjogQWRkICQoRVhFRVhUKSB0byBleGVjdXRhYmxlLgorCitUdWUgSnVsIDIyIDE4OjUwOjM4IDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KKworCSogZW11bHBhcmFtcy9pMzg2Z28zMi5zaCAoT1VUUFVUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1nbzMyIi4KKwkoU0VHTUVOVF9TSVpFKTogU2V0IHRvIDB4MjAwLgorCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IFJld3JpdGUuCisJKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKik6IE5ldyB0YXJnZXQuCisKK01vbiBKdWwgIDcgMTI6Mzk6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBNYW5mcmVkIEhvbGxzdGVpbiA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT46CisJKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LSotbGludXgqbGliYzEqKTogUmVuYW1lZCBmcm9tCisJaVszNDU2XTg2LSotbGludXgqLgorCShpWzM0NTZdODYtKi1saW51eCopOiBOZXcgaG9zdC4KKworVGh1IEp1biAyNiAxMzo1NDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBQdXQgLnJzcmMgYWZ0ZXIgLnJlbG9jLiAgUHV0IGlucHV0IC5yc3JjCisJc2VjdGlvbnMgaW4gdGhlIG91dHB1dCAucnNyYyBzZWN0aW9uLgorCitXZWQgSnVuIDI1IDEyOjQ4OjQxIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4KmxpYmMxKik6IFJlbmFtZWQgZnJvbQorCWBtNjgqLSotbGludXgqJy4KKwkobTY4Ki0qLWxpbnV4Kik6IE5ldyBjb25maWd1cmF0aW9uIGZvciB1c2Ugd2l0aCBHTlUgbGliYyAyLgorCitNb24gSnVuIDE2IDE5OjE4OjIxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQ29ycmVjdCAucmVsYS5zZGF0YSBlbnRyaWVzLgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFB1dCB0aGUgUExUIGJldHdlZW4gdGhlIHNtYWxsIGFuZCBsYXJnZQorCUJTUyBzZWdtZW50cy4KKwkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFRFWFRfU1RBUlRfQUREUik6IFRoZSBBQkkgc2F5cyBgQQorCXByb2dyYW0gYmFzZSBvZiAweDAyMDAwMDAwIGlzIHJlY29tbWVuZGVkLi4uJyBiZWNhdXNlIG90aGVyd2lzZQorCXNoYXJlZCBsaWJyYXJpZXMgYXJlIGxlc3MgZWZmaWNpZW50LiAgV2UgdXNlIDB4MDE4MDAwMDAgYmVjYXVzZQorCW90aGVyd2lzZSBpdCdzIGltcG9zc2libGUgdG8gYnJhbmNoIHRvIGxvY2F0aW9uIDAsIGZvciBpbnN0YW5jZSBpZgorCXlvdSBoYXZlIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KKworTW9uIEp1biAxNiAxMjo0OTozNiAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgorCisJKiBsZGxhbmcuYyAobGFuZ19wbGFjZV91bmRlZmluZWRzKTogQWRkIFxuIGluIGVpbmZvIGNhbGwuCisJKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IExpa2V3aXNlLgorCSogbGRsZXgubDogTGlrZXdpc2UuCisJKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBMaWtld2lzZS4KKwkqIGVtdWx0ZW1wbC9taXBzZWNvZmYuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOgorCUxpa2V3aXNlLgorCShjaGVja19zZWN0aW9ucyk6IExpa2V3aXNlLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8kJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgorCUxpa2V3aXNlLgorCSogbXB3LWVwcGNtYWMuYyAoZ2xkcHBjbWFjb3NfcmVhZF9maWxlKTogTGlrZXdpc2UuCisJKiBtcHctaWR0bWlwcy5jIChnbGRtaXBzaWR0X2FmdGVyX29wZW4pOiBMaWtld2lzZS4KKwkoY2hlY2tfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkoZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCisKKwkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX21vZGUpOiBSZW1vdmUgdW51c2VkIGVpbmZvIGFyZ3VtZW50LgorCitGcmkgSnVuICA2IDIzOjQ3OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvcGUuc2M6IEFkZCB6ZXJvZXMgYWZ0ZXIgLmlkYXRhJDMgdG8gbWFyayB0aGUgZW5kIG9mCisJdGhlIGltcG9ydCBsaXN0LgorCitUaHUgTWF5IDI5IDEzOjEzOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRG9uJ3QKKwljcmFzaCBpZiBhbiBvdXRwdXQgc2VjdGlvbiBoYXMgbm8gQkZEIHNlY3Rpb24uCisKK0ZyaSBNYXkgMjMgMTU6MjM6MjUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogQWRkIGVudHJ5IGZvciB0aGUgbmV3ICJ0YXNrLWxpbmsiIG9wdGlvbi4KKwkocGFyc2VfYXJncyk6IEhhbmRsZSB0aGUgInRhc2stbGluayIgb3B0aW9uLgorCShPUFRJT05fVEFTS19MSU5LKTogQWRkIGRlZmluZS4KKworV2VkIE1heSAyMSAxNzo0NDoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtYWluKTogQ29ycmVjdCBjaGVjayBvZiBmY2xvc2UgcmV0dXJuIHZhbHVlIHdoZW4KKwloYW5kbGluZyAtLWZvcmNlLWV4ZS1zdWZmaXguCisKK1RodSBNYXkgMTUgMTE6MzU6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBBZGQgdGVzdCBvZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlCisJY2FsbCB0byBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSgpLgorCitNb24gTWF5IDEyIDIzOjIyOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogUmVtb3ZlLgorCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBTZXQgRU5UUlkgYmFzZWQgb24gdGFyZ2V0LiAgUGVybWl0CisJVEVYVF9EWU5BTUlDIHRvIGNvbnRyb2wgLmR5bmFtaWMgc2VnbWVudC4gIFBlcm1pdAorCVNITElCX1RFWFRfU1RBUlRfQUREUiB0byBzZXQgc3RhcnQgb2Ygc2hhcmVkIG9iamVjdC4gIFN1cHBvcnQKKwlJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TLiAgUHV0IC5zdHViIGluIC50ZXh0LiAgT25seSBwdXQKKwkuZ251LmxpbmtvbmNlLnQqIGluIC50ZXh0IHdoZW4gcmVsb2NhdGluZy4gIFN1cHBvcnQKKwlPVEhFUl9URVhUX1NFQ1RJT05TLiAgU3VwcG9ydCBTSExJQl9EQVRBX0FERFIgYXMgd2VsbCBhcworCURBVEFfQUREUi4gIFN1cHBvcnQgT1RIRVJfR09UX1NZTUJPTFMgYW5kIE9USEVSX0dPVF9TRUNUSU9OUy4KKwkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gZWxmLgorCShEQVRBX0FERFIpOiBEb24ndCBzZXQuCisJKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW5hbWUgZnJvbSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUy4KKwkoT1RIRVJfVEVYVF9TRUNUSU9OUyk6IFNldC4KKwkoT1RIRVJfR09UX1NFQ1RJT05TKTogUmVuYW1lIGZyb20gT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TLgorCShNQUNISU5FKTogU2V0IHRvIGVtcHR5IHN0cmluZy4KKwkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogTGlrZXdpc2UuCisJKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2g6IExpa2V3aXNlLgorCSogZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoOiBMaWtld2lzZS4KKwkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoOiBMaWtld2lzZS4gIEFsc286CisJKFRFWFRfRFlOQU1JQyk6IFNldC4KKwkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwcy5zaDogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbiAoZWVsZjMyYm1pcHMuYyk6IERlcGVuZCB1cG9uIGVsZi5zYyByYXRoZXIgdGhhbgorCWVsZm1pcHMuc2MuCisJKGVlbGYzMmVibWlwcy5jLCBlZWxmMzJlbG1pcHMuYywgZWVsZjMybG1pcC5jKTogTGlrZXdpc2UuCisKK01vbiBNYXkgMTIgMTE6MTE6MDYgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3QgYWxpZ24gdGhlIGRhdGEgc2VnbWVudCBvbiB0aGUgbmV4dCA4CisJYnl0ZSBib3VuZGFyeSwgaW5zdGVhZCBsZXQgdGhlIGxpbmtlciB1c2Ugd2hhdGV2ZXIgdGhlIGluZGl2aWR1YWwKKwlzZWN0aW9ucyByZXF1aXJlLgorCitGcmkgTWF5ICA5IDE3OjQ1OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotZ251Kik6IERvbid0IGluY2x1ZGUgTWFjaCBzdXBwb3J0LgorCitUdWUgTWF5ICA2IDEzOjIxOjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gU2VhbiBNY05laWwgPHNlYW5AbWNuZWlsLmNvbT46CisJKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfYnlfZmlsZV9uYW1lKTogU29ydCBieSBhcmNoaXZlIG5hbWUKKwlmaXJzdC4KKwkoc29ydF9zZWN0aW9ucyk6IFNvcnQgYWxsIHNlY3Rpb25zLCBub3QganVzdCBzZWN0aW9ucyBpbiB0aGUgc2FtZQorCWFyY2hpdmUuCisKK01vbiBNYXkgIDUgMTg6MTk6NTUgMTk5NyAgUGhpbGlwIEJsdW5kZWxsICA8cGpiMjdAY2FtLmFjLnVrPgorCisJKiBjb25maWd1cmUudGd0LCBjb25maWd1cmUuaG9zdDogY29wZSB3aXRoICcqLSotbGludXgtZ251YW91dCcKKwl0YXJnZXRzLgorCitGcmkgTWF5ICAyIDE1OjU0OjI4IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgKC50ZXh0KTogQWRkIGEgbGVhZGluZyB1bmRlcnNjb3JlIHRvCisJX197RCxDfVRPUl97TElTVCxFTkR9X18gZGVmaW5hdGlvbnMuICBSZWFycmFuZ2UgdGhlIG9yZGVyIG9mIGl0ZW1zCisJaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBNb3ZlIC5jb25zdCwgLmN0b3JzLCAuZHRvcnMgaW50byBzZXBhcmF0ZQorCXNlY3Rpb25zLgorCitXZWQgQXByIDMwIDEyOjIzOjIxIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KKworCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAoX18uaW5pdHAuZW5kLCBfZXRleHQpOiBBZGRlZCB3aGl0ZXNwYWNlCisJYXJvdW5kIGFzc2lnbm1lbnQgb2YgY3VycmVudCBsb2NhdGlvbiBwb2ludGVyLgorCitUaHUgQXByIDE3IDEzOjA3OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogTWFrZSBzdXJlIHRoZSBzZXQgaXMgYWxpZ25lZAorCWFwcHJvcHJpYXRlbHkuCisKK1R1ZSBBcHIgMTUgMTM6MTk6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCisJKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgorCShpbnN0YWxsKTogRGVwZW5kIHVwb24gbGQubmV3IGFuZCBpbnN0YWxsZGlycy4gIFVzZQorCSQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nCisJJChJTlNUQUxMX1hGT1JNKSBhbmQgJChJTlNUQUxMX1hGT1JNMSkuCisJKGluc3RhbGxkaXJzKTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbC1pbmZvKTogUnVuIG1raW5zdGFsbGRpcnMuCisKK01vbiBBcHIgMTQgMTI6MDY6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCisKKwlGcm9tIFRob21hcyBHcmFpY2hlbiA8Z3JhaWNoZW5AcnpwZC5kZT46CisJKiBjb25maWd1cmUuaW46IFVzZSAke0NPTkZJR19TSEVMTH0gd2hlbiBydW5uaW5nICRhY19jb25maWdfc3ViLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgQXByICA0IDExOjQyOjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuCisJKHNvcnRfc2VjdGlvbnNfMSk6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuIGFsbG9jYS4KKworCSogbGRsZXgubDogUmVjb2duaXplIFNRVUFELgorCSogbGRncmFtLnkgKGxlbmd0aCk6IEFkZCBTUVVBRC4KKwkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IFVzZSBTUVVBRCBmb3IgYSBzaWduZWQgOCBieXRlCisJcmVsb2MuCisJKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBIYW5kbGUgU1FVQUQuCisJKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgorCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIFNRVUFEIHRvIHRhYmxlLgorCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIFNRVUFELgorCSogbGQudGV4aW5mbyAoU2VjdGlvbiBEYXRhIEV4cHJlc3Npb25zKTogRG9jdW1lbnQgU1FVQUQuCisKK1RodSBBcHIgIDMgMTM6MTk6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBTZXQgdG8gMi44LjEuCisKKwkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOC4KKworV2VkIEFwciAgMiAxMTo1NToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1wdy1pZHRtaXBzLmM6IFJlbmFtZSBmcm9tIG1wdy1lbWlwc2lkdC5jLgorCSogbXB3LWVsZm1pcHMuYzogUmVuYW1lIGZyb20gbXB3LWVtaXBzZWxmLmMuCisJKiBtcHctY29uZmlnLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCisKKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIGxhbmdfY2hlY2sgaW1tZWRpYXRlbHkgYWZ0ZXIKKwlvcGVuaW5nIHRoZSBpbnB1dCBmaWxlcywgcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgbGluay4KKworTW9uIE1hciAzMSAyMzo0NDowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoaW5pdCk6IEZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXIuCisJKHNldF9wZV9zdGFja19oZWFwKTogUmVtb3ZlIGxvY2FscyBiZWdpbl9jb21taXQgYW5kIGVuZC4KKwkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgcHRyLgorCitNb24gTWFyIDMxIDE2OjM1OjUxIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgorCisgICAgICAgICogY29uZmlndXJlLnRndCAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KKworRnJpIE1hciAyOCAxNToyOToyMyAxOTk3ICBILkouIEx1IDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwlDb250cmlidXRlZCBieSBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGNhaXAucnV0Z2Vycy5lZHU+OgorCSogY29uZmlndXJlLnRndCAoc3BhcmMqLSotbGludXhhb3V0Kik6IE5ldyB0YXJnZXQuCisJKHNwYXJjKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCisJKiBlbXVscGFyYW1zL3NwYXJjbGludXguc2g6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVzcGFyY2xpbnV4Lm8uCisJKGVzcGFyY2xpbnV4LmMpOiBOZXcgdGFyZ2V0LgorCitGcmkgTWFyIDI4IDE0OjMwOjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1PjoKKwkqIGNvbmZpZ3VyZS50Z3Q6IFNldCB0YXJnX2V4dHJhX2VtdWxzIGZvciBtaXBzKmVsLSotbGludXgqIGFuZAorCW1pcHMqLSotbGludXgqLiAgVXNlIGVsZjMyYm1pcCBhbmQgZWxmMzJsbWlwLCBub3QgZWxmMzJlYm1pcCBhbmQKKwllbGYzMmVsbWlwLgorCitUaHUgTWFyIDI3IDE3OjE0OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUgaW4gdmVyc2lvbgorCW1lc3NhZ2UuCisKK0ZyaSBNYXIgMjEgMTI6Mjg6NDEgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogZW11bHBhcmFtcy9kZWx0YTY4LnNoIChPVVRQVVRfRk9STUFUKTogU2V0IHRvICJjb2ZmLW02OGstc3lzdiIuCisKK1R1ZSBNYXIgMTggMTE6MTY6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisKKwkqIGVtdWx0ZW1wbC9haXguZW06IEluY2x1ZGUgIm9ic3RhY2suaCIuCisKK01vbiBNYXIgMTcgMTk6MjY6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYzogSW5jbHVkZSAib2JzdGFjay5oIi4KKworU2F0IE1hciAxNSAyMzoyMzo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWJlb3MqKTogVXNlIGFpeHBwYyBmb3IgdGFyZ19lbXVsLgorCitTYXQgTWFyIDE1IDE4OjEwOjM4IDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgorCisJKiBsZGVtdWwuaCAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IFVzZSBmdWxsIHByb3RvdHlwZS4KKwkqIGxkbGFuZy5jIChwcmludF9vbmVfc3ltYm9sKTogQWRkIGRlY2xhcmF0aW9uLgorCSogbGRsYW5nLmggKGRwcmludF9zdGF0ZW1lbnRzKTogRGVjbGFyZS4KKwkqIGxkbWFpbi5jIChyZW1vdmVfb3V0cHV0KTogRGVjbGFyZS4KKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBEZWNsYXJlLgorCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogRGVjbGFyZS4KKwkoc3BsaXRfc2VjdGlvbnMpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUuCisJKiBtcmkuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KKwkobXJpX2FsaWFzKTogVXNlIHhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgorCitGcmkgTWFyIDE0IDIxOjMwOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogQ2hhbmdlIGhhbmRsaW5nIG9mIGRhdGEgYXJlYSB3aGVuCisJZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5IHRvIG5vdCBza2lwIGEgbGFyZ2UgYmxvY2sgb2YgbWVtb3J5LgorCUZyb20gUGVyIEZvZ2Vsc3Ryb20gPHBlZm9AY3ZzLm9wZW5ic2Qub3JnPi4KKworV2VkIE1hciAxMiAyMTozMzowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtdWx0aXBsZV9kZWZpbml0aW9uKTogT25seSBza2lwIHRoZSB3YXJuaW5nIGlmIHRoZQorCW91dHB1dCBzZWN0aW9uIGlzIGFic29sdXRlIHdoZW4gdGhlIGlucHV0IHNlY3Rpb24gaXMgbm90CisJYWJzb2x1dGUuCisKKwkqIGxkbGV4Lmw6IEFjY2VwdCB3aGl0ZXNwYWNlIGluIFZFUlNfU1RBUlQgc3RhdGUuICBXYXJuIGFib3V0CisJaW52YWxpZCBjaGFyYWN0ZXJzIGluIFZFUlNfKiBzdGF0ZXMuCisKK1R1ZSBNYXIgMTEgMTM6NTE6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBEb24ndCBsZXQgYQorCXRyYWlsaW5nIHNwYWNlIGxlYWQgdXMgdG8gdGhpbmsgdGhhdCB0aGVyZSBpcyBhIHplcm8gYWRkcmVzcy4KKworU3VuIE1hciAgOSAyMzowNjozNSAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgorCisJKiBsZGdyYW0ueSAodmVyc19ub2RlKTogQ29ycmVjdCB0eXBvIG9mICcoJyAgZm9yICd7Jy4KKworRnJpIE1hciAgNyAxODo0MDoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjIChFTlRSWSk6IEVudHJ5IHN5bWJvbCBpcyBfX3N0YXJ0CisJcmF0aGVyIHRoYW4gX3N0YXJ0LgorCShfX2VkYXRhKTogRGVmaW5lIHRoaXMgcmF0aGVyIHRoYW4gImVkYXRhIi4KKwkoX19lbmQpOiBEZWZpbmUgdGhpcyByYXRoZXIgdGhhbiAiZW5kIi4KKworVHVlIE1hciAgNCAxNzoxODozNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAodGljODAtKi0qKTogQWxsb3cgZHJvcHBpbmcgb2YgLWNvZmYuCisKK1N1biBNYXIgIDIgMjI6NTk6NDkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChsZC5kdmkpOiBTZXQgTUFLRUlORk8gZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgd2VsbAorCWFzIFRFWElOUFVUUy4gIE5lZWRlZCBmb3IgYnVpbGRpbmcgaW4gc2VwYXJhdGUgYnVpbGQgZGlyLgorCSogbGRpbnQudGV4aW5mbyAoU0NSSVBUX05BTUUpOiBGaXggdHlwby4KKwkqIGVtdWxwYXJhbXMvdGljODBjb2ZmLnNoOiBSZXdyaXRlIHRvIGluY2x1ZGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbgorCWFib3V0IGVhY2ggc2hlbGwgdmFyaWFibGUgdGhhdCBpcyBzZXQgKG9yIG5vdCBzZXQpLgorCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjOiBDb21wbGV0ZSByZXdyaXRlLgorCitGcmkgRmViIDI4IDE3OjQyOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQuCisJKiBNYWtlZmlsZS5pbiAobGRtYWluLm8pOiBEZWZpbmUgVEFSR0VUIHdoZW4gY29tcGlsaW5nLgorCitUaHUgRmViIDI3IDExOjQxOjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBpbml0aWFsaXplIGxpbmtfaW5mby5scHJlZml4IG9yCisJbGlua19pbmZvLmxwcmVmaXhfbGVuLgorCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfYmVmb3JlX3BhcnNlKTogTGlrZXdpc2UuCisKKwkqIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBSZW1vdmUuCisJKiBlbXVscGFyYW1zL204OGtiY3Muc2ggKFRFTVBMQVRFX05BTUUpOiBEb24ndCBzZXQuCisJKiBNYWtlZmlsZS5pbiAoZW04OGtiY3MuYyk6IERlcGVuZCB1cG9uIGdlbmVyaWMuZW0gcmF0aGVyIHRoYW4KKwltODhrYmNzLmVtLgorCisJKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IFBhc3Mgbm9sb2FkX3NlY3Rpb24sIG5vdCBTRUNfTkVWRVJfTE9BRCwKKwl0byBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4gIEZyb20gTWFyayBSYXNpbgorCTxtYXJrLnJhc2luQHRlbHJhZC5jby5pbD4uCisKK1dlZCBGZWIgMjYgMTE6NTE6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQ2xlYXIgU0VDX0lTX0NPTU1PTiBmcm9tIGNvbW1vbgorCXNlY3Rpb24uCisKK1R1ZSBGZWIgMjUgMjA6Mzg6MTEgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbiAoZW1pcHNsbmV3cy5jKTogTmV3IHRhcmdldC4KKwkqIGVtdWxwYXJhbXMvbWlwc2xuZXdzLnNoOiBOZXcgZmlsZS4KKworVHVlIEZlYiAyNSAxNjowNDowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoaG9sZF9pbnRlcnApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBQdXQgbG9hZGFibGUgLm5vdGUgc2VjdGlvbnMKKwlhZnRlciBob2xkX2ludGVycC4gIENob29zZSBhIHVuaXF1ZSBvdXRwdXQgc2VjdGlvbiBuYW1lLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRG9uJ3Qgc2V0IGhvbGRfdXNlIGlmIHRoZQorCVNFQ19MT0FEIG9yIFNFQ19BTExPQyBmbGFncyBkaWZmZXIuICBTZXQgaG9sZF9pbnRlcnAuCisKK01vbiBGZWIgMjQgMTg6MTY6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgorCSogbGRsZXgubCAoVl9UQUcsIFZfSURFTlRJRklFUik6IE5ldyBtYWNyb3MuCisJKFZFUlNfU1RBUlQsIFZFUlNfU0NSSVBULCBWRVJTX05PREUpOiBOZXcgc3RhdGVzIHRvIHBhcnNlIHZlcnNpb24KKwlpbmZvcm1hdGlvbi4KKwkobGRsZXhfdmVyc2lvbl9zY3JpcHQsIGxkbGV4X3ZlcnNpb25fZmlsZSk6IE5ldyBmdW5jdGlvbnMuCisJKiBsZGxleC5oIChlbnVtIGlucHV0X2VudW0pOiBBZGQgaW5wdXRfdmVyc2lvbl9zY3JpcHQuCisJKGxkbGV4X3ZlcnNpb25fc2NyaXB0KTogRGVjbGFyZS4KKwkobGRsZXhfdmVyc2lvbl9maWxlKTogRGVjbGFyZS4KKwkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgZGVmbGlzdCwgdmVyc3ltcywgYW5kIHZlcnNub2RlLgorCShWRVJTX1RBRywgVkVSU19JREVOVElGSUVSKTogTmV3IHRlcm1pbmFscy4KKwkoR0xPQkFMLCBMT0NBTCwgVkVSU0lPTiwgSU5QVVRfVkVSU0lPTl9TQ1JJUFQpOiBOZXcgdGVybWluYWxzLgorCShmaWxlKTogQWNjZXB0IElOUFVUX1ZFUlNJT05fU0NSSVBULgorCShpZmlsZV9wMSk6IEFjY2VwdCB2ZXJzaW9uLgorCSh2ZXJzaW9uX3NjcmlwdF9maWxlKTogTmV3IG5vbnRlcm1pbmFsLgorCSh2ZXJzaW9uLCB2ZXJzX25vZGVzLCB2ZXJzX25vZGUpOiBMaWtld2lzZS4KKwkodmVyZGVwLCB2ZXJzX3RhZywgdmVyX2RlZm5zKTogTGlrZXdpc2UuCisJKiBsZGxhbmcuYyAobGFuZ19lbGZfdmVyc2lvbl9pbmZvKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkobGFuZ19uZXdfdmVyc19yZWdleCk6IE5ldyBmdW5jdGlvbi4KKwkobGFuZ19uZXdfdmVyc19ub2RlKTogTmV3IGZ1bmN0aW9uLgorCSh2ZXJzaW9uX2luZGV4KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBOZXcgZnVuY3Rpb24uCisJKGxhbmdfYWRkX3ZlcnNfZGVwZW5kKTogTmV3IGZ1bmN0aW9uLgorCSogbGRsYW5nLmggKGxhbmdfZWxmX3ZlcnNpb25faW5mbyk6IERlY2xhcmUuCisJKGxhbmdfbmV3X3ZlcnNfcmVnZXgsIGxhbmdfbmV3X3ZlcnNfbm9kZSk6IERlY2xhcmUuCisJKGxhbmdfYWRkX3ZlcnNfZGVwZW5kLCBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSk6IERlY2xhcmUuCisJKiBsZXhzdXAuYyAoT1BUSU9OX1ZFUlNJT05fU0NSSVBUKTogRGVmaW5lLgorCShsZF9vcHRpb25zKTogQWRkICJ2ZXJzaW9uLXNjcmlwdCIuCisJKHBhcnNlX2FyZ3MpOiBIYW5kbGUgT1BUSU9OX1ZFUlNJT05fU0NSSVBULgorCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6CisJUGFzcyBsYW5nX2VsZl92ZXJzaW9uX2luZm8gdG8gc2l6ZV9keW5hbWljX3NlY3Rpb25zLgorCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLmdudS52ZXJzaW9uIHNlY3Rpb25zLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgc3ltYm9sIHZlcnNpb25pbmcuCisKK0ZyaSBGZWIgMjEgMTc6Mzc6NTEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChlZDMwdmVsZi5jKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS50Z3QgKGQzMHYtKi0qKTogTmV3IHRhcmdldC4KKwkqIGVtdWxwYXJhbXMvZDMwdmVsZi5zaDogTmV3IGZpbGUuCisJKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBOZXcgZmlsZS4KKworRnJpIEZlYiAxNCAxODoyODozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLnRleGluZm8gKE9wdGlvbiBDb21tYW5kcyk6IERvY3VtZW50IHRoZSBJTkNMVURFIGNvbW1hbmQuCisKK1RodSBGZWIgMTMgMjA6MzE6MzcgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEJGRF9ORUVEX0RFQ0xBUkFUSU9OIG9uIGdldGVudi4KKwkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fR0VURU5WKTogTmV3IG1hY3JvLgorCSogc3lzZGVwLmggKGdldGVudik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCisJKiBsZGVtdWwuYyAobGRfZW11bF9kZWZhdWx0X3RhcmdldCk6IERvIG5vdCBjYXN0IGdldGVudiByZXR1cm4KKwl2YWx1ZS4KKwkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKworVHVlIEZlYiAxMSAxNTozNDoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFdoZW4gcmVsb2NhdGluZywgcHV0IC5taXBzMTYuZm4uKiBhbmQKKwkubWlwczE2LmNhbGwuKiBpbiAudGV4dC4KKworU3VuIEZlYiAgOSAxODowOToxMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy90aWM4MGNvZmYuc2g6IE5ldyAoZHVtbXkpIGZpbGUgZm9yIFRJYzgwLgorCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjOiBOZXcgKGR1bW15KSBmaWxlIGZvciBUSWM4MC4KKwkqIE1ha2VmaWxlLmluIChldGljODBjb2ZmLmMpOiBBZGQgdGFyZ2V0IGFuZCBydWxlIHRvIGJ1aWxkIGl0LgorCSogY29uZmlndXJlLnRndCAodGljODAtKi1jb2ZmKTogU2V0IHRhcmdfZW11bCB0byB0aWM4MGNvZmYuCisKK0ZyaSBKYW4gMzEgMTM6MTY6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTZWFyY2ggZm9yCisJIi5zbyIgaW4gdGhlIG5hbWUsIG5vdCAiLnNvLiIuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBBY2NlcHQgYSBwbGFpbiAuc28gZmlsZS4KKworCSogTWFrZWZpbGUuaW4gKGxkLmluZm8pOiBBZGQgLUkkKHNyY2RpcikuICBGcm9tIEFsYW4gTW9kcmEKKwk8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgorCitUaHUgSmFuIDMwIDExOjMxOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3N1bm9zLmVtOiBJbmNsdWRlIDxjdHlwZS5oPi4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNraXAgdGhlIGRpcmVjdG9yeSBuYW1lIHdoZW4KKwlzZWFyY2hpbmcgZm9yICIuc28uIi4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IE1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJyYXJ5IG5hbWUKKwloYXMgYSB2ZXJzaW9uIG51bWJlciwgYW5kIHRoYXQgb25seSB2ZXJzaW9uIG51bWJlcnMgZm9sbG93IC5zby4KKworV2VkIEphbiAyOSAxODoxNTowMCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wZS5zYzoKKwkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjOiBhZGQgKiguZ2NjX2V4Y2VwdF90YWJsZSkgdG8gdGhlIHRleHQKKwlzZWN0aW9uIHNvIFdpbjMyIGV4ZWN1dGFibGVzIGFyZSB2YWxpZC4KKworTW9uIEphbiAyNyAxMjoyODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IGxpbmtvbmNlIHJlbG9jIHNlY3Rpb24gaW4gb3RoZXIKKyAJYXBwcm9wcmlhdGUgcmVsb2Mgc2VjdGlvbnMuCisJKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBBZGQgbGlua29uY2Ugc3VwcG9ydC4KKwkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCisKK0ZyaSBKYW4gMjQgMTA6NDQ6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbXVscGFybXMvbW4xMDIwMC5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IE1vdmUgdGhlCisJc3RhY2sgdXAgdG8gMHg4MDAwMC4KKwkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogTGlrZXdpc2UuCisKK1R1ZSBKYW4gMjEgMTI6MTE6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IFVzZSBQUk9WSURFCisJdG8gZGVmaW5lIGBfc3RhY2snLgorCitUaHUgSmFuIDE2IDE3OjA3OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQuaCAoYXJnc190eXBlKTogUmVuYW1lIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgdG8KKwlhdXhpbGlhcnlfZmlsdGVycywgYW5kIG1ha2UgaXQgY2hhciAqKi4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1mIGJ5IHNldHRpbmcgdXAgYW4gYXJyYXkuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlCisJbmV3IG5hbWUgb2YgYXV4aWxpYXJ5X2ZpbHRlcnMuCisKKwkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBJbXByb3ZlIGRvY3VtZW50YXRpb24gb2YgLS1maWx0ZXIgYW5kCisJLS1hdXhpbGlhcnkuCisKK1R1ZSBKYW4gMTQgMTU6NDQ6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQ2xhcmlmeSB0aGF0IHRoZSBub3JtYWwgdXNhZ2UgaXMgLVQuCisJKENvbW1hbmRzKTogTGlrZXdpc2UuCisKK1RodSBKYW4gIDkgMTE6MjY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBDb3JyZWN0IG1hc2sgdXNlZCBmb3IgLmRhdGEgYWRkcmVzcy4KKworV2VkIEphbiAgOCAxNToxNDo1OSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvcGUuZW06IG1ha2UgZGVmYXVsdCBleGVjdXRhYmxlIGEuZXhlIGluc3RlYWQgb2YKKwlhLm91dAorCitGcmkgSmFuICAzIDE3OjMzOjM0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1vdmUgLmdvdCBjbG9zZXIgdG8gLnNkYXRhIGFuZCAuc2JzcyBieQorCXNoaWZ0aW5nIC5wbHQgYmFjay4gIFJ1bW91ciBoYXMgaXQgdGhhdCB0aGUgTmV0QlNEIGxkLnNvIGRlcGVuZHMKKwlvbiAuZHluYW1pYyBiZWluZyBhZnRlciAuZ290LCBzbyB3ZSBsZWF2ZSB0aGF0LgorCitGcmkgSmFuICAzIDE0OjA0OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgorIAkobWFpbnRhaW5lci1jbGVhbik6IERvIHJlbW92ZSBjb25maWdkb2MudGV4aS4KKworCSogbGQudGV4aW5mbyAoT3BlcmF0b3JzKTogUmVtb3ZlICdAJyBmcm9tIEBzbWFsbGV4bXBsZSBpbiBjb21tZW50CisJdG8gYXZvaWQgY29uZnVzaW5nIHRleGkycm9mZi4KKworRnJpIEphbiAgMyAxMToyNzowMiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC56ZGF0YSk6IEFkZCAuemNvbW1vbiBzZWN0aW9uLgorCSgudGRhdGEpOiBBZGQgLnRjb21tb24gYW5kIC50Y29tbW9uX2J5dGUgc2VjdGlvbnMuCisKK1RodSBKYW4gIDIgMTg6MTQ6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChtaXBzKmVsLSotbGludXgqLCBtaXBzKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgorCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogVXNlIF9fc3RhcnQgYXMgdGhlIGVudHJ5IGFkZHJlc3MgZm9yCisJbWlwcyotKi1saW51eCouCisKK1R1ZSBEZWMgMzEgMTQ6NDg6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgorCisJKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmlsdGVyX3NobGliIGFuZCBhdXhpbGlhcnlfZmlsdGVyX3NobGliCisJZmllbGRzLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1hdXhpbGlhcnkvLWYgYW5kCisJLS1maWx0ZXIvLUYuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKKwlQYXNzIGZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYiB0bworCXNpemVfZHluYW1pY19zZWN0aW9ucy4KKwkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KKworTW9uIERlYyAzMCAxMzo1NTo1NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC50ZGF0YSkgQWRkIC50YnNzIGFuZCAudGJ5dGUgc2VjdGlvbnMuCisKK1dlZCBEZWMgMTggMjI6NTc6MzUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KKworRnJpIERlYyAxMyAxNDowODo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE1ha2Ugc3VyZSBfX3tlLGd9cCBzdGFydCByZWxhdGl2ZSB0byB0aGUKKwl7cyx0fWRhdGEgc2VjdGlvbnMuICBEbyBub3QgZW1pdCBhbnkgbGlua2VyIGdlbmVyYXRlZCBzeW1ib2xzIGlmCisJLXIuICBVc2Uge1RFWFQse1osUyxUfURBVEF9X1NUQVJUX0FERFIgdmFyaWFibGVzIHRvIGluaXRpYWxpemUKKwl3aGVyZSB0aGUgZGlmZmVyZW50IHNlY3Rpb25zIGdvLiAgQ2hhbmdlIHNvbWUgd2hpdGVzcGFjZS4KKworCSogZW11bHBhcmFtcy92ODUwLnNoICh7VEVYVCx7WixTLFR9REFUQX1fU1RBUlRfQUREUik6IERlZmluZQorCWFwcHJvcHJpYXRlbHkuICBSZW1vdmUgY3J1ZCBub3QgdXNlZCBhbnltb3JlLgorCitGcmkgRGVjIDEzIDEwOjE5OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVtbjEwMjAwLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgorCSogY29uZmlndXJlLnRndDogSGFuZGxlIG1uMTAyMDAuCisJKiBlbXVscGFybXMvbW4xMDIwMC5zaDogTmV3IGZpbGUuCisKK1RodSBEZWMgMTIgMTc6MDQ6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogSW5jbHVkZSA8Y3R5cGUuaD4uCisgCShnbGQ5NjBfc2V0X291dHB1dF9hcmNoKTogR2V0IHRoZSBtYWNoaW5lIHR5cGUgZnJvbSB0aGUgLUEgb3B0aW9uCisJaWYgdGhlcmUgaXMgb25lLCByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgY29yZS4KKworU2F0IERlYyAgNyAxMDowNzo1MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoOiBIYW5kbGUgbGVhZGluZyB1bmRlcnNjb3Jlcy4KKworVGh1IERlYyAgNSAxMzo0NTo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE9ubHkKKwlzZXQgaG9sZF9yZWwgaWYgU0VDX0FMTE9DIGlzIHNldC4KKworVHVlIERlYyAgMyAxMToyOToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogU2V0IHRoZSBvdXRwdXRfb2Zmc2V0IGFzIHdlbGwKKwlhcyB0aGUgb3V0cHV0X3NlY3Rpb24gd2hlbiBvbmx5IHJlYWRpbmcgc3ltYm9scyBmcm9tIGEgZmlsZS4KKworTW9uIERlYyAgMiAxMTo0Mzo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvKi5zaDogTWFrZSBzdXJlIHRoYXQgZWFjaCBzZXQgb2YgcGFyYW1ldGVycyB3aGljaAorCXVzZXMgdGhlIGVsZi5zYyBzY3JpcHQgc2V0cyBNQUNISU5FLgorCitXZWQgTm92IDI3IDAzOjIyOjA1IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmeyxtaXBzLHBwY30uc2M6IEFkZCB0aGUgcmVtYWluaW5nIERXQVJGIHNlY3Rpb25zLgorCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCisJKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBMaWtld2lzZS4KKworVHVlIE5vdiAyNiAxNjo1ODozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCisKK01vbiBOb3YgMjUgMTI6MTc6NTUgMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IEFkZCBjYXNlCisJZm9yIGJmZF92bWEgdG8gaW5pdCBsb29wLgorCitNb24gTm92IDI1IDA5OjU1OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZW11bHBhcm1zL21uMTAzMDAuc2g6IFJlbW92ZSBib2d1cyAnXycgcHJlZml4IGZvcgorCWVudHJ5IHN5bWJvbCBhbmQgY3Rvci9kdG9yIHN0dWZmLgorCitGcmkgTm92IDE1IDEzOjAwOjE4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVtbjEwMzAwLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgorCSogY29uZmlndXJlLnRndDogSGFuZGxlIG1uMTAzMDAuCisJKiBlbXVscGFybXMvbW4xMDMwMC5zaDogTmV3IGZpbGUuCisKK1R1ZSBOb3YgIDUgMTA6NTc6NTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoUkVBRE9OTFlfU1RBUlRfQUREUik6IENoYW5nZWQgdG8gMHgyMDAwMDA0LgorCShFTUJFRERFRCk6IERlZmluZS4KKworRnJpIE5vdiAgMSAxMDowMToyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLnRleGluZm86IEFkZCBzZWN0aW9uIG9uIHJlcG9ydGluZyBidWdzLgorCisJKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogTWFrZSBzdXJlIHRoZSBldGV4dCBhbmQgX19DVE9SX0xJU1RfXworCXN5bWJvbHMgYXJlIGNvcnJlY3RseSBhbGlnbmVkLgorCitUaHUgT2N0IDMxIDA5OjI4OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2NyaXB0ZW1wbC92ODUwLnNjICh6ZGF0YSk6IEhhbmRsZSByZXN6ZGF0YSwgcm9temRhdGEgYW5kCisJcm9temJzcyB0b28uCisKK1R1ZSBPY3QgMjkgMTI6MzM6MDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogQ2hhbmdlcyBuZWVkZWQgZm9yIEQxMFYtRVZBIGJvYXJkLgorCVNldCBURVhUX1NUQVJUX0FERFIgdG8gMHgxMDAwMDAwLiBTZXQgUkVBRE9OTFlfU1RBUlRfQUREUiB0bworCTB4MjAwMDAwMC4KKworCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogIEZpeCBjYWxjdWxhdGlvbiBvZiAudGV4dC4gIENoYW5nZQorCS5zdGFjayB0byBzdGFydCBhdCAweDIwMDdmZmUuCisKK01vbiBPY3QgMjggMTU6Mzc6MDAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAoc3BhcmNsZXQqLSotYW91dCopOiBEZWxldGUsIHVzZSBzcGFyYyotKi1hb3V0Ki4KKworV2VkIE9jdCAyMyAxNjoxNzoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNjcmlwdGVtcGwvdjg1MC5zYyAoemRhdGEpOiBGaXggdHlwbyAienJvZGF0YSIgLT4gInJvemRhdGEiLgorCisJKiBzY3JpcHRlbXBsL3Y4NTAuc2MgKHpkYXRhKTogTWFrZSBzdXJlIHRoaXMgc3RheXMKKwlpbiBsby1tZW1vcnkuCisKK1R1ZSBPY3QgMjIgMTE6MzY6NDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC92ODUwLnNjIChfX2VwKTogUHV0IGl0IGF0IHRoZSBzdGFydAorCW9mIHRoZSB0ZGEgc2VjdGlvbi4KKworCSogc2NyaXB0ZW1wbC92ODUwLnNjOiBNb3ZlIGFsbCAibm9ybWFsIiBzZWN0aW9ucyBpbnRvCisJdGhlIGV4dGVybmFsIG1lbW9yeSByZWdpb24gKDB4MTAwMDAwIC0gMHgyMDAwMDApLgorCitNb24gT2N0IDIxIDE3OjE2OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+CisKKwkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IENsb25lIGZyb20gZWxmLnNjLCBtb3ZlIC50ZXh0IHRvCisJMHgxMDAwMCwgc28gdGhhdCBpcyBtb3JlIHJvb20gZm9yIGRhdGEuCisKKwkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoVEVYVF9TVEFSVF9BRERSKTogTm93IDB4MTAwMDAwLgorCShSRUFET05MWV9TVEFSVF9BRERSKTogTm93IDB4MC4KKwkoU0NSSVBUX05BTUUpOiBOb3cgZWxmZDEwdi4KKworCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBEZXBlbmQgb24gZWxmZDEwdi5zYywgbm90IGVsZi5zYy4KKworRnJpIE9jdCAxOCAyMjoxMjo0OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL20zMnJlbGYuc2gJKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSBmcm9tIDAgdG8gMHgxMDAuCisKK0ZyaSBPY3QgMTggMTU6NDM6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZWVsZjY0YWxwaGEuby4KKwkoQUxMXzY0X0VNVUxBVElPTlMpOiBOZXcgdmFyaWFibGUuCisJKiBjb25maWd1cmUuaW46IEFjY2VwdCAtLWVuYWJsZS02NC1iaXQtYmZkIG9wdGlvbi4gIElmIGl0IGlzIHNldAorCXdpdGggLS1lbmFibGUtdGFyZ2V0cz1hbGwsIGluY2x1ZGUgQUxMXzY0X0VNVUxBVElPTlMgaW4KKwlFTVVMQVRJT05fT0ZJTEVTLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgT2N0IDE4IDEyOjU4OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoX19ncCwgX19lcCk6IERlZmluZS4KKworVGh1IE9jdCAxNyAxODoxNDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLnRleGluZm86IFRyeSB0byBjb25zaXN0ZW50bHkgdXNlIGEgc2luZ2xlIG9yIGEgZG91YmxlIGRhc2gKKwlmb3IgZWFjaCBvcHRpb24uCisKK1RodSBPY3QgMTcgMTA6MTc6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChFTUJFRERFRCk6IERlZmluZS4KKworVGh1IE9jdCAxNyAxMDo1Njo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKC56ZGF0YSk6IEFkZCB0aGlzIGJlZm9yZSAudGV4dC4KKwkoLnNkYXRhKTogQWxzbyBpbmNsdWRlIC5yb3NkYXRhIGFzIHBhcnQgb2YgdGhlIC5zZGF0YS4KKwkoLnRkYXRhKTogSW5jbHVkZSB0aGlzIGp1c3QgYmVmb3JlIC5zZGF0YS4KKworCSogZW11bHBhcm1zL3Y4NTAuc2ggKFNDUklQVF9OQU1FKTogVXNlICJ2ODUwIiBub3QgImVsZiIuCisJKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBXcmFwIHNjcmlwdCB3aXRoIGEgImNhdCA8PCBFT0YiLgorCitXZWQgT2N0IDE2IDIzOjEwOjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTmV3IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBWODUwLgorCSogTWFrZWZpbGUuaW46IFVzZSBpdC4KKworVGh1IE9jdCAxMCAxNzo1NzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaDogRGVmaW5lIF9ncCBpbiBPVEhFUl9HT1RfU1lNQk9MUywgbm90CisJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TLgorCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBMaWtld2lzZS4KKworV2VkIE9jdCAgOSAxNDozNjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fc2VjdGlvbl9hbGlnbiBmaWVsZC4KKwkqIGxleHN1cC5jIChPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOKTogRGVmaW5lLgorCShsZF9vcHRpb25zKTogQWRkIC0td2Fybi1zZWN0aW9uLWFsaWduLgorCShwYXJzZV9hcmdzKTogSGFuZGxlIC0td2Fybi1zZWN0aW9uLWFsaWduLgorCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHdhcm5fc2VjdGlvbl9hbGlnbiwgd2FybiBpZgorCXRoZSBzdGFydCBvZiBhIHNlY3Rpb24gY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50LgorCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13YXJuLXNlY3Rpb24tYWxpZ24uCisJKiBsZC50ZXhpbmZvOiBDaGFuZ2Ugc29tZSBzaW5nbGUgZGFzaGVzIHRvIGRvdWJsZSBkYXNoZXMuCisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IFJlY29yZCBlbnRyeSBzeW1ib2wgZm9yIGVhY2gKKwlzdWJzeXN0ZW0gdHlwZS4gIElmZGVmIG91dCBvczIgdHlwZS4gIFJlY29nbml6ZSBhIHZlcnNpb24gbnVtYmVyLgorCitUdWUgT2N0ICA4IDEyOjA3OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfc3Vic3lzdGVtKTogV2hlbiBzZXR0aW5nIHRoZSBzdWJzeXN0ZW0KKwl0byB3aW5kb3dzLCBzZXQgdGhlIGVudHJ5IHBvaW50LgorCisJKiBNYWtlZmlsZS5pbiAobGRsZXguYyk6IERvbid0IHBhc3MgYW55IG9wdGlvbnMgdG8gJChMRVgpLgorCitNb24gT2N0ICA3IDE3OjI5OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gLnNvIGV4dGVuc2lvbnMgZm9yIHNoYXJlZAorCWxpYnJhcmllcy4KKworU3VuIE9jdCAgNiAyMjozNTozNiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZnssbWlwcyxwcGN9LnNjOiBBZGQgRFdBUkYgMiBzZWN0aW9ucy4KKworRnJpIE9jdCAgNCAxODo0OTozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBPbmx5IHNldCB0aGUgYWRkcmVzcyBvZiAudGV4dCBpZgorCVJFTE9DQVRJTkcuCisKK0ZyaSBPY3QgIDQgMTA6NTk6NTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggKHtCSUcsTElUVExFfV9PVVRQVVRfRk9STUFUKTogRGVmaW5lLgorCSogc2NyaXB0dGVtcGwvYW91dC5zYyAoe0JJRyxMSVRUTEV9X09VVFBVVF9GT1JNQVQpOiBQcm92aWRlIGRlZmF1bHQuCisJKE9VVFBVVF9GT1JNQVQpOiBTdXBwb3J0IGJpLWVuZGlhbiB0YXJnZXRzLgorCitUaHUgT2N0ICAzIDEzOjUyOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZm5tYXRjaC5oLCBmbm1hdGNoLmM6IFJlbW92ZSAobm93IGluIGxpYmliZXJ0eSkuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKENGSUxFUyk6IFJlbW92ZSBmbm1hdGNoLmMuCisJKEhGSUxFUyk6IFJlbW92ZSBmbm1hdGNoLmguCisJKE9GSUxFUyk6IFJlbW92ZSBmbm1hdGNoLm8uCisKK1RodSBPY3QgIDMgMTU6NDE6MjQgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KKworV2VkIE9jdCAgMiAyMzo0NToyNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogZW11bHRtcGwvcGUuZW06IGluY3JlYXNlIHNpemUgb2Ygc3RhY2sgcmVzZXJ2ZSB0byAweDIwMDAwMDAKKyAgICAgICAgKG5lY2Vzc2FyeSBpbiBvcmRlciB0byBjb21waWxlIHBhcnNlLmMgaW4gZ2NjIHNvdXJjZXMgdW5kZXIgTlQpCisKK1dlZCBPY3QgIDIgMTQ6NDk6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEZpeCB0eXBvIGluIC0tcnBhdGgtbGluayBkZXNjcmlwdGlvbi4KKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFN1Z2dlc3QKKwktLXJwYXRoIGlmIGEgbmVlZGVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLgorCitUdWUgT2N0ICAxIDE2OjE3OjMzIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgorCisJKiBjb25maWd1cmUudGd0IChtaXBzKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcyotKi1lbGYqLgorCitUdWUgT2N0ICAxIDE1OjUwOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEdpdmUgbW9yZSBkZXRhaWwgb24gLWwgb3B0aW9uLgorCisJKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBIYW5kbGUgQ1JFQVRFX1NITElCIHRoZSBzYW1lIHdheSB0aGF0CisJZWxmLnNjIGRvZXMsIHNvIHRoYXQgZ2xpYmMgd29ya3MgYmV0dGVyLgorCisJKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBOZXcgdmFyaWFibGUuCisJKGxkdmVyc2lvbik6IFVzZSBpdC4KKwkqIGxkdmVyLmggKGxkX3Byb2dyYW1fdmVyc2lvbik6IERlY2xhcmUuCisJKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEhhbmRsZSAtLWRsbC12ZXJib3NlIGxpa2UgLS12ZXJib3NlLCBub3QKKwktLXZlcnNpb24uICBDaGFuZ2UgLS12ZXJzaW9uIGhhbmRsaW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VCisJc3RhbmRhcmRzLgorCShoZWxwKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgorCitNb24gU2VwIDMwIDEyOjE0OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChlbTMycmVsZi5jKTogQWRkIHJ1bGUgZm9yLgorCSogY29uZmlndXJlLnRndCAobTMyci0qLSopOiBSZWNvZ25pemUuCisJKiBlbXVscGFyYW1zL20zMnJlbGYuc2g6IE5ldyBmaWxlLgorCitUaHUgU2VwIDI2IDEzOjU4OjQ3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkOiBBZGQgc3ltYm9saWMgZG91YmxlcXVvdGluZyB0byBsZG1haW4gY29tcGlsZSBlZGl0LgorCSogbXB3LWNvbmZpZy5pbjogQWRkIG1pcHMtKi0qIGNhc2UgYXMgbWlwcy1lbGYsIGFuZCB1c2UgbW9yZQorCXdpbGRjYXJkcyBpbiBtYXRjaGluZy4KKwkqIG1wdy1lbWlwc2VsZi5jOiBOZXcgZmlsZSwgcHJlZ2VuZXJhdGVkIG1pcHMgZWxmIGVtdWxhdGlvbi4KKworVHVlIFNlcCAxNyAxMjoxODoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkaW50LnRleGluZm86IFJld3JvdGUuCisKKwkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBjYXNlcyBmb3IgTUlQUyA1MDAwIGxpa2UgTUlQUyA0MzAwLgorCitNb24gU2VwIDE2IDE3OjU1OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogT25seSBkZWZpbmUgc3ltYm9scyBpZiBSRUxPQ0FUSU5HLiAgRml4CisJc3ludGF4IGVycm9yIG9uIF9fZW5kX18gbGluZS4KKworCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogRm9yIC1OIG9yIC1uLCBkb24ndCBhbGlnbiAuZGF0YS4gIEZyb20KKyAJQ2hyaXMgSGFkbGV5IDxDaHJpc3RvcGhlci5IYWRsZXlAY2wuY2FtLmFjLnVrPgorCitTdW4gU2VwIDE1IDIyOjA5OjU2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZW11bHBhcm1zL3Y4NTAuc2g6IEZpeCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TLgorCitTdW4gU2VwIDE1IDEwOjM4OjE2IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZW11bHBhcm1zL2QxMHYuc2g6IFNldCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TIHRvIHB1dAorCXN0YWNrIGF0IHRvcCBvZiBzaW11bGF0b3IgbWVtb3J5LgorCitGcmkgU2VwIDEzIDE1OjQ5OjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsZXgubCAoU1lNQk9MQ0hBUk4pOiBBZGQgJCwgXywgYW5kIH4uCisKK1dlZCBTZXAgMTEgMjM6MzA6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IENoZWNrIGZvciAtbWlwczQgbGlrZSAtbWlwczEsIGV0LiBhbC4KKworVGh1IFNlcCAgNSAxNToyNDoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogQWNjZXB0IGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnQKKwlhcyB0aGUgUFRSIGFyZ3VtZW50LiAgSWYgdGhlIGZpbGUgaXMgc3ltYm9scyBvbmx5LCBkaXNjYXJkIGFsbAorCWlucHV0IHNlY3Rpb25zLgorCShsZGxhbmdfYWRkX2ZpbGUpOiBQYXNzIGVudHJ5IHRvIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KKworV2VkIFNlcCAgNCAxNTo1Mzo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGFscGhhLSotZ251Kik6IE5ldyB0YXJnZXQuICBGcm9tIEZpbGEgS29sb2RueQorCTxmaWxhQGliaS5jb20+LgorCitUdWUgU2VwICAzIDAwOjUyOjU0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZW11bHBhcm1zL3Y4NTAuc2g6IFNldCBPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TCisKK1N1biBTZXAgIDEgMjE6NDg6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBlbXVscGFybXMvdjg1MC5zaDogU2V0IEVNQkVEREVELgorCitGcmkgQXVnIDMwIDIyOjMwOjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZW11bHBhcm1zL3Y4NTAuc2g6IEVudHJ5IHN5bWJvbCBpcyAiX3N0YXJ0IiwgdHdlYWsKKwljdG9yL2R0b3Igc3VwcG9ydC4KKworRnJpIEF1ZyAzMCAxODozMjozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKHNoLSotZWxmKik6IE5ldyB0YXJnZXQuCisJKiBlbXVscGFyYW1zL3NoZWxmLnNoOiBOZXcgZmlsZS4KKwkqIGVtdWxwYXJhbXMvc2hsZWxmLnNoOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlc2hlbGYubyBhbmQgZXNobGVsZi5vLgorCShlc2hlbGYuYywgZXNobGVsZi5jKTogTmV3IHRhcmdldHMuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIEVNQkVEREVEIGlzIGRlZmluZWQsIHRoZW4gZG9uJ3QgYWRkCisJU0laRU9GX0hFQURFUlMgdG8gVEVYVF9TVEFSVF9BRERSLiAgRXhwYW5kIENUT1JfU1RBUlQgYW5kIENUT1JfRU5ECisJYXJvdW5kIC5jdG9ycywgYW5kIERUT1JfU1RBUlQgYW5kIERUT1JfRU5EIGFyb3VuZCAuZHRvcnMuICBFeHBhbmQKKwlPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TIGlmIFJFTE9DQVRJTkcuCisKK1RodSBBdWcgMjkgMTY6NTc6NDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUue2hvc3QsdGd0fSAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0KKwlwcm8uCisKK01vbiBBdWcgMjYgMTI6NTg6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGdyYW0ueSAoc2VjdGlvbik6IEFkZCBvcHRfbm9jcm9zc3JlZnM7IHBhc3MgdmFsdWUgdG8KKwlsYW5nX2VudGVyX292ZXJsYXkuCisJKG9wdF9ub2Nyb3NzcmVmcyk6IE5ldyBub250ZXJtaW5hbC4KKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBOT0NST1NTUkVGUyBrZXl3b3JkIGluIEVYUFJFU1NJT04gbW9kZS4KKwkqIGxkbGFuZy5jIChvdmVybGF5X25vY3Jvc3NyZWZzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobGFuZ19lbnRlcl9vdmVybGF5KTogQWRkIG5vY3Jvc3NyZWZzIHBhcmFtZXRlci4KKwkobGFuZ19sZWF2ZV9vdmVybGF5KTogT25seSBhZGQgbm9jcm9zc3JlZnMgaWYgb3ZlcmxheV9ub2Nyb3NzcmVmcworCWlzIHNldC4gIEluaXRpYWxpemUgb3ZlcmxheV9ub2Nyb3NzcmVmcy4KKwkqIGxkbGFuZy5oIChsYW5nX2VudGVyX292ZXJsYXkpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBsZC50ZXhpbmZvIChPdmVybGF5cyk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgorCisJKiBsZHZlci5jIChsZHZlcnNpb24pOiBQcmludCBHTlUgbGQgaW4gdGhlIHZlcnNpb24gbWVzc2FnZS4KKworVGh1IEF1ZyAyMiAxNzoxMDo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERU5WLgorCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhMREVOVi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCisJKCQoTERfUFJPRykpOiBVc2UgJChITERFTlYpLgorCitUaHUgQXVnIDIyIDE2OjI5OjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGV2ODUwLmMpOiBOZXcgdGFyZ2V0LgorCSogY29uZmlndXJlLnRndCAodjg1MC0qLSopOiBOZXcgdGFyZ2V0LgorCSogZW11bHBhcmFtcy92ODUwLnNoOiBOZXcgZmlsZS4KKworVGh1IEF1ZyAyMiAxMToxNjowMiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgdG8gY29tcGlsZXIgZWRpdC4KKworV2VkIEF1ZyAyMSAxMToyNjozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IC5nbnUubGlua29uY2UqIHNlY3Rpb25zIGluIGFwcHJvcHJpYXRlCisJY29udGFpbmluZyBzZWN0aW9ucy4KKworTW9uIEF1ZyAxOSAxMzowMTo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGZubWF0Y2guYzogSW5jbHVkZSBzeXNkZXAuaC4KKworTW9uIEF1ZyAxOSAxMToyODoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGdlbnNjcmlwdHMuc2g6IFVuZG8gOC8xNiBjaGFuZ2UuCisKKwkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaCAoTUFDSElORSk6IEV4cGxpY2l0bHkgc2V0IHRvIG5vdGhpbmcuCisKK0ZyaSBBdWcgMTYgMTk6MTg6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBnZW5zY3JpcHRzLnNoOiBFeHBsaWNpdGx5IHJlc2V0IGFueSBzaGVsbCB2YXJpYWJsZXMgc2V0IG9yIHVzZWQKKwlieSB0aGUgdmFyaW91cyAuc2Mgc2NyaXB0cyB0byBhbGxvdyBpbmFkdmVydGFudCB1c2Ugb2YgdGhlc2UKKwluYW1lcyBhcyBub3JtYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJ5IHRoZSBwZXJzb24gcnVubmluZworCWNvbmZpZ3VyZS4KKworCSogTWFrZWZpbGUuaW4gKGVkMTB2ZWxmLmMpOiBVc2UgdGRpcl9kMTB2LCBub3QgdGRpcl9hcmNlbGYuCisKK0ZyaSBBdWcgMTYgMTQ6MTU6NDEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjIChfX2Jzc19zdGFydF9fLCBfX2Jzc19lbmRfXywKKyAJX19kYXRhX3N0YXJ0X18sIF9fZGF0YV9lbmRfXyk6IEFkZGVkIHRvIGtlZXAgaW4gc3luYy4gd2l0aCB0aGUKKyAJZGVmYXVsdCBBUk0gY3J0MC5zLiBBZGRlZCBfX0NUT1JfTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIHN1cHBvcnQuCisKK1RodSBBdWcgIDggMTQ6MjQ6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGNyZWYuYyAoY2hlY2tfcmVsb2NfcmVmcyk6IElmIGluZm8tPnNhbWUsIGxvb2sgZm9yIGFueSBzeW1ib2wKKwlkZWZpbmVkIGluIGluZm8tPmRlZnNlYywgbm90IGp1c3QgdGhlIHNlY3Rpb24gc3ltYm9sLgorCitXZWQgQXVnICA3IDE0OjQwOjQ4IDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFRF9ERUNMQVJBVElPTiBvbiBzdHJzdHIgYW5kIHNicmsuCisJKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KKwkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisJKiBzeXNkZXAuaCAoc3Ryc3RyKTogRGVjbGFyZSBpZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUi4KKwkqIGxkbWFpbi5jIChzYnJrKTogRGVjbGFyZSBpZiBIQVZFX1NCUksgYW5kCisJTkVFRF9ERUNMQVJBVElPTl9TQlJLLgorCisJKiBsZGxhbmcuYyAobGFuZ19yZWNvcmRfcGhkcnMpOiBDYXN0IHhtYWxsb2MgYW5kIHhyZWFsbG9jIHJldHVybi4KKworTW9uIEF1ZyAgNSAxNjoyNjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBPVkVSTEFZLgorCSogbGRncmFtLnk6IEFkZCBzZWN0aW9uX3BoZHIgZmllbGQgdG8gJXVuaW9uLgorCShzZWN0aW9uKTogSGFuZGxlIHBoZHJfb3B0IHJlc3VsdC4gIEFkZCBPVkVSTEFZIGNhc2UuCisJKG9wdF9leHBfd2l0aG91dF90eXBlKTogTmV3IG5vbnRlcm1pbmFsLgorCShwaGRyX29wdCk6IFJldHVybiBsaXN0IG9mIHBoZHJzLgorCShvdmVybGF5X3NlY3Rpb24pOiBOZXcgbm9udGVybWluYWwuCisJKiBsZGxhbmcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCisJKGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQWRkIHBoZHJzIHBhcmFtZXRlci4KKwlDaGFuZ2UgYWxsIGNhbGxlcnMuCisJKGxhbmdfc2VjdGlvbl9pbl9waGRyKTogUmVtb3ZlLgorCShvdmVybGF5X3ZtYSwgb3ZlcmxheV9sbW4sIG92ZXJsYXlfbWF4KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKHN0cnVjdCBvdmVybGF5X2xpc3QpOiBEZWZpbmUuCisJKG92ZXJsYXlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGxhbmdfZW50ZXJfb3ZlcmxheSwgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb25zLgorCShsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiwgbGFuZ19sZWF2ZV9vdmVybGF5KTogTmV3IGZ1bmN0aW9ucy4KKwkqIGxkbGFuZy5oIChsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFVwZGF0ZQorCWRlY2xhcmF0aW9uIGZvciBuZXcgcGFyYW1ldGVyLgorCShsYW5nX3NlY3Rpb25faW5fcGhkcik6IERvbid0IGRlY2xhcmUuCisJKGxhbmdfZW50ZXJfb3ZlcmxheSwgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24pOiBEZWNsYXJlLgorCShsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiwgbGFuZ19sZWF2ZV9vdmVybGF5KTogRGVjbGFyZS4KKwkqIGxkLnRleGluZm8gKE92ZXJsYXlzKTogTmV3IG5vZGUgdW5kZXIgU0VDVElPTlMsIGRvY3VtZW50aW5nCisJb3ZlcmxheXMuCisKKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBNQVggYW5kIE1JTi4KKwkqIGxkZ3JhbS55IChNQVgsIE1JTik6IE5ldyB0ZXJtaW5hbHMuCisJKGV4cCk6IFJlY29nbml6ZSBNQVggYW5kIE1JTi4KKwkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogSGFuZGxlIE1BWCBhbmQgTUlOLgorCSogbGQudGV4aW5mbyAoQXJpdGhtZXRpYyBGdW5jdGlvbnMpOiBEb2N1bWVudCBNQVggYW5kIE1JTi4KKworCSogbGQudGV4aW5mbyAoUEhEUlMpOiBVc2UgQGNpbmRleCwgbm90IEBraW5kZXgsIGZvciBwcm9ncmFtIGhlYWRlcgorCWluZGV4IGVudHJpZXMuCisKKwkqIGxkZ3JhbS55IChTSVpFT0YsIEFERFIpOiBEbyBub3Qgc3BlY2lmeSB0eXBlLgorCisJKiBsZGNyZWYuYyAoY2hlY2tfbm9jcm9zc3JlZik6IFNraXAgc3ltYm9scyB3aXRoIG5vIG91dHB1dAorCXNlY3Rpb25zLgorCitGcmkgQXVnICAyIDE0OjU3OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRncmFtLnkgKExPQURBRERSKTogTmV3IHRlcm1pbmFsLgorCShleHApOiBIYW5kbGUgTE9BREFERFIuCisJKiBsZGxleC5sOiBSZWNvZ25pemUgTE9BREFERFIuCisJKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBBZGQgTE9BREFERFIuCisJKGZvbGRfbmFtZSk6IEltcGxlbWVudCBMT0FEQUREUi4KKwkqIGxkbGFuZy5jIChleHBfaW5pdF9vcyk6IFRyZWF0IExPQURBRERSIGxpa2UgQUREUi4KKwkqIGxkLnRleGluZm8gKEFyaXRobWV0aWMgRnVuY3Rpb25zKTogRG9jdW1lbnQgTE9BREFERFIuCisKK1RodSBBdWcgIDEgMTI6NTI6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC5oIChjaGVja19ub2Nyb3NzcmVmcyk6IERlY2xhcmUuCisJKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZik6IERlZmluZS4KKwkoc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMpOiBEZWZpbmUuCisJKG5vY3Jvc3NyZWZfbGlzdCk6IERlY2xhcmUuCisJKGxhbmdfYWRkX25vY3Jvc3NyZWYpOiBEZWNsYXJlLgorCSogbGRsZXgubDogUmVjb2duaXplIE5PQ1JPU1NSRUZTIGtleXdvcmQuCisJKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIG5vY3Jvc3NyZWYgZmllbGQuCisJKE5PQ1JPU1NSRUZTKTogTmV3IHRlcm1pbmFsLgorCShpZmlsZV9wMSk6IFJlY29nbml6ZSBOT0NST1NTUkVGUy4KKwkobm9jcm9zc3JlZl9saXN0KTogTmV3IG5vbnRlcm1pbmFsLgorCSogbGRsYW5nLmMgKG5vY3Jvc3NyZWZfbGlzdCk6IERlZmluZS4KKwkobGFuZ19hZGRfbm9jcm9zc3JlZik6IE5ldyBmdW5jdGlvbi4KKwkqIGxkbWFpbi5jIChtYWluKTogSWYgbm9jcm9zc3JlZl9saXN0IGlzIG5vdCBOVUxMLCBjYWxsCisJY2hlY2tfbm9jcm9zc3JlZnMuCisJKHdhcm5pbmdfY2FsbGJhY2spOiBGcmVlIHN5bWJvbHMgaWYgdGhlcmUgaXMgbm8gcGxhY2UgdG8gc3RvcmUKKwl0aGVtLgorCShub3RpY2UpOiBDYWxsIGFkZF9jcmVmIGlmIG5vY3Jvc3NyZWZfbGlzdCBpcyBub3QgTlVMTC4KKwkqIGxkY3JlZi5jOiBJbmNsdWRlICJsZGV4cC5oIiBhbmQgImxkbGFuZy5oIi4KKwkoY2hlY2tfbm9jcm9zc3JlZnMpOiBOZXcgZnVuY3Rpb24uCisJKGNoZWNrX25vY3Jvc3NyZWYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvKTogRGVmaW5lLgorCShjaGVja19yZWZzLCBjaGVja19yZWxvY19yZWZzKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisJKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCBOT0NST1NTUkVGUy4KKworCSogbGQudGV4aW5mbyAoU2VjdGlvbiBQbGFjZW1lbnQpOiBJbXByb3ZlIHRoZSB3b3JkaW5nIG9mIHRoZQorCXdpbGRjYXJkIGRvY3VtZW50YXRpb24uICBNZW50aW9uIHRoYXQgd2lsZGNhcmRzIGFyZSBvbmx5IHNlYXJjaGVkCisJZm9yIG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCBpbiB0aGUgZmlsZSBzeXN0ZW0uCisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE1vdmUKKwlkZWZpbml0aW9uIG9mIGxpYl9wYXRoIGluc2lkZSBjb25kaXRpb24gd2hlcmUgaXQgaXMgdXNlZC4KKworV2VkIEp1bCAzMSAxMzoxNzoxMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworIAkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogTm93IHdvcmtzIHdpdGggZWxmLnNjLgorCitXZWQgSnVsIDMxIDExOjUyOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIHZhbmlsbGEuCisKK1R1ZSBKdWwgMzAgMTQ6NDY6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQWRkIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUgcmVzdWx0CisJdmFsdWUgd2hlbiBjb21wdXRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBzZWN0aW9uLgorCisJKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgY3JlZiBmaWVsZC4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU2V0IGNvbW1hbmRfbGluZS5jcmVmLgorCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayBjb21tYW5kX2xpbmUuY3JlZiByYXRoZXIgdGhhbgorCWxpbmtfaW5mby5ub3RpY2VfYWxsLgorCShub3RpY2UpOiBMaWtld2lzZS4KKworCSogbGRjcmVmLmMgKG91dHB1dF9vbmVfY3JlZik6IERvbid0IGNyYXNoIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQKKwlpbiBhIHNlY3Rpb24gd2l0aG91dCBhbiBvd25lci4KKworTW9uIEp1bCAyOSAxNzoyMzozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGZubWF0Y2guaCwgZm5tYXRjaC5jOiBOZXcgZmlsZXMuCisJKiBsZGxleC5sOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb24gb2YgRklMRU5BTUUuICBBZGQgZGVmaW5pdGlvbgorCW9mIFdJTERDSEFSLiAgSW4gU0NSSVBUIG1vZGUsIGFjY2VwdCBhbnkgc2VxdWVuY2Ugb2YgV0lMRENIQVIgYXMgYQorCU5BTUUuCisJKiBsZGdyYW0ueSAoZmlsZV9OQU1FX2xpc3QpOiBBY2NlcHQgJyonIGFuZCAnPycgc3BlY2lhbGx5LgorCShpbnB1dF9zZWN0aW9uX3NwZWMpOiBBY2NlcHQgJz8nIHNwZWNpYWxseS4KKwkoc3RhdGVtZW50KTogQ2hhbmdlIGV4cCB0byBtdXN0YmVfZXhwIGluIGxlbmd0aCBhbmQgRklMTCBjYXNlcy4KKwkoc2VjdGlvbik6IENhbGwgbGRsZXhfc2NyaXB0IGJlZm9yZSBzZWN0aW9uIHN0YXRlbWVudHMsIGFuZCBjYWxsCisJbGRsZXhfcG9wc3RhdGUgYWZ0ZXIgdGhlbS4KKwkqIGxkbGFuZy5jOiBJbmNsdWRlICJmbm1hdGNoLmgiLgorCSh3aWxkY2FyZHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh3aWxkX3NlY3Rpb24pOiBQZXJtaXQgdGhlIHNlY3Rpb24gbmFtZSB0byBiZSBhIHdpbGRjYXJkLgorCSh3aWxkX2ZpbGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIHdpbGQuCisJKHdpbGQpOiBDYWxsIHdpbGRfZmlsZS4gIFBlcm1pdCB0aGUgZmlsZSBuYW1lIHRvIGJlIGEgd2lsZGNhcmQuCisJKG9wZW5faW5wdXRfYmZkcyk6IERvbid0IGNhbGwgbG9va3VwX25hbWUgZm9yIGEgd2lsZGNhcmQgcGF0dGVybi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKENGSUxFUyk6IEFkZCBmbm1hdGNoLmMuCisJKEhGSUxFUyk6IEFkZCBmbm1hdGNoLmguCisJKE9GSUxFUyk6IEFkZCBmbm1hdGNoLm8uCisJKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGF0IGZpbGUgYW5kIHNlY3Rpb24gbmFtZXMgY2FuIG5vdyBiZQorCXdpbGRjYXJkIHBhdHRlcm5zLgorCisJKiBsZGxhbmcuYyAobGFuZ19wbGFjZV9vcnBoYW5zKTogQ29ycmVjdCBjb25kaXRpb246IHBsYWNlIGEgY29tbW9uCisJc2VjdGlvbiBpZiBub3QgcmVsb2NhdGVhYmxlIG9yIGlmIGNvbW1vbiBkZWZpbml0aW9ucyBhcmUgZm9yY2VkLgorCitXZWQgSnVsIDI0IDEyOjE2OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFNDUklQVF9OQU1FKTogQ2hhbmdlIHRvIGVsZi4KKworV2VkIEp1bCAyNCAxMzozODoyMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgorCisJKiBjb25maWd1cmUudGd0IChkMTB2LSotKik6IERvbid0IHJlcXVpcmUgdGhlIC1lbGYsIGFsbG93IHBsYWluIGQxMHYuCisKK1R1ZSBKdWwgMjMgMTA6MzY6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS50Z3QgKGQxMHYtKi1lbGYqKTogTmV3IHRhcmdldC4KKwkqIGVtdWxwYXJhbXMvZDEwdmVsZi5zaDogTmV3IGZpbGUuCisKK1RodSBKdWwgMTggMTY6MjU6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChzcGFyYyotKi1zeXN2NCopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBbmRyZXcgR2llcnRoCisJPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KKworCSogY29uZmlndXJlLmhvc3Q6IENoYW5nZSBpcml4NSB0byBpcml4WzU2XSouCisJKiBjb25maWd1cmUudGd0OiBMaWtld2lzZS4KKworV2VkIEp1bCAxNyAxMDo1Mjo0NiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X3NlY3Rpb25zKTogUGF5IGF0dGVudGlvbiB0byByZXR1cm4gY29kZS4KKworCSogbGRtaXNjLmMgKGRlbWFuZ2xlKTogUmVtb3ZlIGFsbCBwcmVmaXggJy4ncyBmcm9tIGEgbmFtZS4KKworTW9uIEp1bCAxNSAxMTo0OTo0OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSb3VuZAorIAl0aGUgdmFsdWUgb2YgX19zdGFydF9TRUNOQU1FIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlCisgCXNlY3Rpb24gdG8gYmUgcGxhY2VkLgorCitUdWUgSnVsICA5IDEyOjA5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAobWlwcyplbC0qLWVsZiopOiBVc2UgZWxmMzJlbG1pcC4KKwkobWlwcyotKi1lbGYqKTogVXNlIGVsZjMyZWJtaXAuCisJKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoRU1CRURERUQpOiBEb24ndCBkZWZpbmUuCisJKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaCAoRU1CRURERUQpOiBEb24ndCBkZWZpbmUuCisJKiBlbXVscGFyYW1zL2VsZjMyZWxtaXAuc2g6IE5ldyBmaWxlOyBjb3B5IG9mIGVsZjMybG1pcC5zaCB3aXRoCisJRU1CRURERUQgZGVmaW5lZC4KKwkqIGVtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaDogTmV3IGZpbGU7IGNvcHkgb2YgZWxmMzJibWlwLnNoIHdpdGgKKwlFTUJFRERFRCBkZWZpbmVkLgorCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIChFTUJFRERFRCk6IERlZmluZS4KKwkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCAoRU1CRURERUQpOiBEZWZpbmUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMyZWJtaXAubyBlZWxmMzJlbG1pcC5vLgorCShlZWxmMzJlYm1pcC5jLCBlZWxmMzJlbG1pcC5jKTogTmV3IHRhcmdldHMuCisKK1RodSBKdWwgIDQgMTI6MDE6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZHZlci5jIChsZHZlcnNpb24pOiBTZXQgdmVyc2lvbiB0byBjeWdudXMtMi43LjEuCisKKwkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KKworCSogZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoOiBSZW5hbWUgZnJvbSBwYzUzMm1hY2hhb3V0LnNoIHRvIGF2b2lkCisJU3lzdGVtIFYgZmlsZSBuYW1lIGxpbWl0YXRpb25zLgorCSogY29uZmlndXJlLnRndCAobmMzMmstcGM1MzItbWFjaCosIG5zMzJrLXBjNTMyLXV4Kik6IFVzZQorCXBjNTMybWFjaGEgcmF0aGVyIHRoYW4gcGM1MzJtYWNoYW91dC4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IENoYW5nZSBlcGM1MzJtYWNoYW91dC5vIHRvCisJZXBjNTMybWFjaGEuby4KKwkoZXBjNTMybWFjaGEuYyk6IFJlbmFtZSB0YXJnZXQgZnJvbSBlcGM1MzJtYWNoYW91dC5jLgorCitXZWQgSnVsICAzIDExOjQwOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogVXNlICV1LCBub3QgJXgsIHRvIHByaW50CisJZmlsbCB2YWx1ZS4KKworU3VuIEp1biAzMCAxMToxNjo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1lcHBjbWFjLmM6IFVwZGF0ZSB0byByZWZsZWN0IE1heSAyMyBjaGFuZ2UgdG8gYWl4LmVtLgorCitUaHUgSnVuIDI3IDE0OjAzOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogUHV0IHRoZSAuc2EKKwlmaWxlIGp1c3QgYmVmb3JlIHRoZSAuc28gZmlsZSwgcmF0aGVyIHRoYW4ganVzdCBhZnRlci4KKworCSogY29uZmlndXJlLmhvc3Q6IFVzZSAtcHJpbnQtZmlsZS1uYW1lPUZJTEUgcmF0aGVyIHRoYW4gcGlwaW5nCisJLXByaW50LWxpYmdjYy1maWxlLW5hbWUgdGhyb3VnaCBzZWQuCisJKGlbMzQ1XTg2Ki0qLXNjbyosIGlbMzQ1XTg2LSotaXNjKik6IENyZWF0ZSBjcnRiZWdpbi5vIGFuZAorCWNydGVuZC5vIGZpbGVzLCBpbiBjYXNlIGdjYyBkb2Vzbid0IHVzZSB0aGVtLgorCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNydGJlZ2luLm8gYW5kIGNydGVuZC5vLgorCitXZWQgSnVuIDI2IDE1OjU3OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAobWlwcyotZGVjLW9zZiopOiBOZXcgdGFyZ2V0LgorCitUdWUgSnVuIDI1IDIyOjE1OjI5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAorCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisJKGRvY2Rpcik6IFJlbW92ZWQuCisJKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCisJKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCitNb24gSnVuIDI0IDE4OjQ4OjE2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjIChfR0xPQkFMX09GRlNFVF9UQUJMRV8pOiBEb24ndCBkbyBhCisJUFJPVklERSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNpbmNlIGl0IG5lZWRzIHRvIGJlIGF0IGEKKwlub24tZml4ZWQgbG9jYXRpb24uCisKK01vbiBKdW4gMjQgMTc6NTU6MzEgMTk5NiAgSm91a2UgTnVtYW4gIDxqbnVtYW5AYmF6aXMubmw+CisKKwkqIGxkbGFuZy5oIChlbnVtIHNlY3Rpb25fdHlwZSk6IERlZmluZS4KKwkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSBsb2FkYWJsZSBmaWVsZC4gIEFkZAorCXNlY3R5cGUgZmllbGQuCisJKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hhbmdlIGZsYWdzIHBhcmFtZXRlciBpbgorCXByb3RvdHlwZSB0byBzZWN0eXBlLgorCSogbGRncmFtLnkgKHR5cGViaXRzKTogUmVtb3ZlLgorCShzZWN0eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkob3B0X2F0KTogVXNlIHNlY3R5cGUgcmF0aGVyIHRoYW4gdHlwZWJpdHMuCisJKHR5cGUpOiBTZXQgc2VjdHlwZSByYXRoZXIgdGhhbiB0eXBlYml0cy4KKwkoYXR5cGUpOiBMaWtld2lzZS4KKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBEU0VDVCwgQ09QWSwgSU5GTywgYW5kIE9WRVJMQVkgaW4KKwlFWFBSRVNTSU9OIG1vZGUuCisJKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogU2V0IHNlY3R5cGUKKwlmaWVsZCByYXRoZXIgdGhhbiBsb2FkYWJsZSBmaWVsZC4KKwkod2lsZF9kb2l0KTogQ2hlY2sgc2VjdHlwZSByYXRoZXIgdGhhbiBsb2FkYWJsZS4KKwkobGFuZ19yZWNvcmRfcGhkcnMpOiBMaWtld2lzZS4KKwkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZW5hbWUgZmxhZ3MgcGFyYW1ldGVyIHRvCisJc2VjdHlwZS4gIFNldCBzZWN0eXBlIGZpZWxkIHJhdGhlciB0aGFuIGxvYWRhYmxlIGZpZWxkLiAgU2V0IGZsYWdzCisJZmllbGQgYmFzZWQgb24gc2VjdHlwZS4KKworTW9uIEp1biAyNCAxMjowMDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRm9yY2UgLnN0YWIqIGFuZCAuY29tbWVudCBzZWN0aW9ucyB0byBzdGFydAorCWF0IDAuCisKKwkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAorCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgorCitGcmkgSnVuIDIxIDE3OjQwOjU2IDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+CisKKwkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgorCitGcmkgSnVuIDIxIDEzOjA1OjUxIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWxpbnV4ZWNvZmYqKTogTmV3IHRhcmdldC4KKwkoYWxwaGEtKi1saW51eCopOiBVc2UgZWxmNjRhbHBoYS4KKwkqIGVtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaDogTmV3IGZpbGUuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW06IElmIEVMRlNJWkUgaXMgbm90IHNldCwgc2V0IGl0IHRvIDMyLiAgVXNlCisJJHtFTEZTSVpFfSByYXRoZXIgdGhhbiAzMiB3aGVuIGNhbGxpbmcgQkZEIHJvdXRpbmVzLgorCShob2xkX3JvZGF0YSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFVzZSBob2xkX3JvZGF0YSBmb3IgYQorCXJlYWRvbmx5IHNlY3Rpb24gdGhhdCBpcyBub3QgY29kZS4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IFNldCBob2xkX3JvZGF0YS4gIERvbid0IHVzZQorCWEgLnJlbCBzZWN0aW9uIHVubGVzcyBpdHMgYmZkX3NlY3Rpb24gZmllbGQgaXMgbm90IE5VTEwuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjY0YWxwaGEuby4KKwkoZWVsZjY0YWxwaGEuYyk6IE5ldyB0YXJnZXQuCisKK0ZyaSBKdW4gMjEgMTI6NDU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZG1pc2MuYyAodmZpbmZvKTogQ29ycmVjdCBoYW5kbGluZyBvZiAwIGluICVXIGNhc2UuCisKK1RodSBKdW4gMjAgMTM6NTU6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQWRkIGVub3VnaCBzdXBwb3J0IHRvIHVuZGVyc3RhbmQgdGhlIGdjYyBzdnIzLmlmaWxlIHNjcmlwdDoKKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBCTE9DSyBhbmQgR1JPVVAgaW4gRVhQUkVTU0lPTiBjb250ZXh0LiAgQWRkCisJQklORCBrZXl3b3JkLgorCSogbGRncmFtLnk6IEFkZCBCSU5EIHRva2VuLgorCShzZWN0aW9uKTogUmVjb2duaXplIEdST1VQLgorCShvcHRfZXh0X3dpdGhfdHlwZSk6IFJlY29nbml6ZSBhIGNvdXBsZSBvZiBjYXNlcyBvZiBCSU5ELgorCSogbGRsYW5nLmMgKGluaXRfb3MpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBzZWN0aW9uIGlzIGFscmVhZHkKKwlpbml0aWFsaXplZC4gIENhbGwgZXhwX2luaXRfb3Mgb24gYWRkcl90cmVlIGZpZWxkLgorCShleHBfaW5pdF9vcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMpOiBDYWxsIGV4cF9pbml0X29zIG9uIGFzc2lnbm1lbnQKKwlleHByZXNzaW9uLgorCShsYW5nX3BsYWNlX29ycGhhbnMpOiBDaGVjayBmb3IgY29tbW9uIHNlY3Rpb25zIGJ5IG5hbWUgQ09NTU9OCisJcmF0aGVyIHRoYW4gYnkgY29tbW9uX3NlY3Rpb24gZmllbGQuICBEb24ndCB3YXJuIGFib3V0IGFic2VuY2Ugb2YKKwlbQ09NTU9OXSBjb21tYW5kLgorCisJKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IFJlbW92ZSB1c2VsZXNzIGZpZWxkcworCWNvbW1vbl9zZWN0aW9uLCBjb21tb25fb3V0cHV0X3NlY3Rpb24sIGFuZCBjb21wbGFpbmVkLCBhcyB3ZWxsIGFzCisJYWxsIHJlZmVyZW5jZXMgdG8gdGhlbS4KKworCSogbGRleHAuYzogUmVpbmRlbnQgYSBsb3Qgb2YgY29kZS4KKwkoZXhwX2ZvbGRfdHJlZSk6IENhbGwgRkFJTCByYXRoZXIgdGhhbiBlaW5mbyBpbiBkZWZhdWx0IGNhc2UuCisKK1dlZCBKdW4gMTkgMTE6NDA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdCAobTg4Ki0qLWRndXgqKTogUXVvdGUgSE9TVElOR19DUlQwLiAgRnJvbQorCTxyYW5kYWxsLmhyb25AbWVkYXBoaXMuY29tPi4KKworVHVlIEp1biAxOCAxNTo1MzowOSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvaDgzMDBzLnNjOiBOZXcgZmlsZSBmb3IgSDgvUy4KKwkqIGVtdWxwYXJhcm1zL2g4MzAwcy5zaDogTmV3IGZpbGUgZm9yIEg4L1MuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgSDgvUy4KKwkoZV9oODMwMHMuYyk6IEFkZCBkZXBlbmRlbmNpZXMuCisJKiBjb25maWd1cmUudGd0OiBBZGQgSDgvUyB0byB0YXJnX2V4dHJhX2VtdWxzLgorCitUdWUgSnVuIDE4IDE3OjU1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAoaVszNDVdODYqLSotaXNjKik6IE5ldyB0YXJnZXQuICBGcm9tCisJPHVkZGVib3JnQGNhcm1lbi5zZT4uCisKK1dlZCBKdW4gMTIgMTI6NDY6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZXhzdXAuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgorIAkocGFyc2VfYXJncyk6IENvcHkgdGhlIC1ZIGFyZ3VtZW50IGludG8gbWVtb3J5LgorIAkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IERvbid0IHB1dCB0aGUgJzonIGJhY2sgaW50byB0aGUgZGlyZWN0b3J5CisJbGlzdC4KKworRnJpIEp1biAgNyAxMToyNzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogSW5jbHVkZSBsaWJpYmVydHkuaC4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uIHRvIGFkZAorCUxEX0xJQlJBUllfUEFUSCB0byB0aGUgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCisJKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEFkZCBuZXcgc2V0X3N5bWJvbHMgcm91dGluZS4KKworVGh1IEp1biAgNiAxMTo1MDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChPVEhFUl9HT1RfU1lNQk9MUyk6IFVzZSBBTElHTigxNikKKwlyYXRoZXIgdGhhbiAuIHdoZW4gY29tcHV0aW5nIF9ncCB2YWx1ZS4gIEZyb20gUGVyIEZvZ2Vsc3Ryb20uCisJKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaCAoT1RIRVJfR09UX1NZTUJPTFMpOiBMaWtld2lzZS4KKworCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBjbG9zZSBhbmQgdW5saW5rIHRoZSBmaWxlIG9uIGVycm9yLCBzaW5jZQorCXJlbW92ZV9vdXRwdXQgd2lsbCBkbyBpdCBhbnlob3cuCisJKiBsZGxhbmcuYyAob3Blbl9vdXRwdXQpOiBTZXQgYm9vbGVhbiB2YXJpYWJsZSB0byB0cnVlLCBub3QgMS4KKworV2VkIEp1biAgNSAxODozNDoxNCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGVtdWxwYXJhbXMve2VsZjMyYjQzMDAuc2gsZWxmMzJsNDMwMC5zaH0gKFNDUklQVF9OQU1FKTogVXNlCisJZWxmbWlwcyBpbnN0ZWFkIG9mIGVsZi4KKworVHVlIEp1biAgNCAxODo0MzowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkY3JlZi5jOiBOZXcgZmlsZS4KKwkqIGxkLmggKGFkZF9jcmVmLCBvdXRwdXRfY3JlZik6IERlY2xhcmUuCisJKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbm90aWNlX2FsbCBmaWVsZC4gIElmIGl0IGlzIHNldCBhdAorCWVuZCBvZiBsaW5rLCBjYWxsIG91dHB1dF9jcmVmLgorCShub3RpY2UpOiBSZW5hbWUgZnJvbSBub3RpY2VfeXN5bS4gIENoZWNrIG5vdGljZV9hbGwuCisJKiBsZG1pc2MuYyAoZmluZm8pOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuCisJKiBsZG1pc2MuaCAoZmluZm8pOiBEZWNsYXJlLgorCSogbGV4c3VwLmMgKE9QVElPTl9DUkVGKTogRGVmaW5lLgorCShsZF9vcHRpb25zKTogQWRkICJjcmVmIi4KKwkocGFyc2VfYXJncyk6IEhhbmRsZSBPUFRJT05fQ1JFRi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKwkoQ0ZJTEVTKTogQWRkIGxkY3JlZi5jLgorCShPRklMRVMpOiBBZGQgbGRjcmVmLm8uCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWNyZWYuCisKK1R1ZSBKdW4gIDQgMTI6MTI6MjUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KKworRnJpIE1heSAzMSAxMjo0MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IERvbid0IGFzc3VtZSB0aGF0IGEKKwl3aWxkX3N0YXRlbWVudCBoYXMgYSBzZWN0aW9uIG5hbWUuCisKK1dlZCBNYXkgMjkgMTM6MTM6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBRdW90ZSB0ZXN0IC16IGFyZ3VtZW50LgorCisJKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IHRoZSBDT05TVFJVQ1RPUlMgY29tbWFuZC4KKworVGh1IE1heSAyMyAxNjowNzo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IEluaXRpYWxpemUKKwlmaWxlLCBub3QgaW1wZmlsZS4KKworV2VkIE1heSAyMiAxMTozMTozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERvbid0IGNvcHkgb3ZlciBTRUNfTElOS197T05DRSxEVVBMSUNBVEVTfQorCWlmIGZpbmFsIGxpbmsuCisJKiBlbXVsdGVtcGwvcGUuZW0gKHNmdW5jKTogUmVuYW1lZCB0byBzb3J0X2J5X2ZpbGVfbmFtZS4KKwkoc29ydF9ieV9zZWN0aW9uX25hbWUsIHNvcnRfc2VjdGlvbnNfMSk6IE5ldyBmdW5jdGlvbnMuCisJKHNvcnRfc2VjdGlvbnMpOiBPbmx5IHNvcnQgYnkgZmlsZSBuYW1lIHNlY3Rpb25zIGluIC5pZGF0YS4KKwlBZGQgIkdyb3VwZWQgU2VjdGlvbnMiIHN1cHBvcnQuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJld3JpdGUgdG8gc3VwcG9ydCBHcm91cGVkCisJU2VjdGlvbnMuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBEZWxldGUuCisJKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLnRleHQsLmRhdGEsLnJkYXRhKTogQWRkICooLmZvb1wkKS4KKwkoLkNSVCwucnNyYyk6IFJld3JpdGUgdG8gdXNlIEdyb3VwZWQgU2VjdGlvbiBzdXBwb3J0LgorCitUdWUgTWF5IDIxIDE0OjMxOjQ4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWVwcGNtYWMuYzogVXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBhaXguZW0uCisKK1N1biBNYXkgMTkgMTY6NTk6NDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChkcHJpbnRfc3RhdGVtZW50KTogU3RvcCBwcmludGluZyBhdCBlbmQgb2YgbGlzdC4KKworU2F0IE1heSAxOCAxMzoxMjowNSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJU3VwcG9ydCBmb3IgLS1mb3JjZS1leGUtc3VmZml4CisJKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZm9yY2VfZXhlX3N1ZmZpeC4KKwkqIGxkLnRleGluZm86IEFkZCBkb2N1bWVudGF0aW9uLgorCSogbGRtYWluLmMgKG1haW4pOiAgQWRkIHN1cHBvcnQgZm9yIG9wdGlvbi4KKwkqIGxleHN1cC5jIChPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCk6IE5ldy4KKwkobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6ICBBZGQgc3VwcG9ydCBmb3Igb3B0aW9uLgorCitXZWQgTWF5IDE1IDEyOjUwOjI1IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtIChzZXRfcGVfdmFsdWUpOiBQYXNzIDAgbm90IDE2IHRvIHN0cnRvdWwgY2FsbC4KKworRnJpIE1heSAxMCAxNjoyODo0NCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoX19zdGFjayk6IE1ha2UgX19zdGFjayAwIGlmIGl0IHdhcworCXJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLgorCitUaHUgTWF5ICA5IDA4OjUyOjIzIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMve2VsZjMyYm1pcC5zaCxlbGYzMmxtaXAuc2gsbWlwc2lkdC5zaCxtaXBzaWR0bC5zaH06CisJU2V0IGEgbmV3IHZhcmlhYmxlIHRvIHNpZ25pZnkgaWYgdGhlIGZpbmFsIHRhcmdldCBpcyBhbiBlbWJlZGRlZAorCXN5c3RlbS4KKwkqIHNjcmlwdHRlbXBsL3ttaXBzLnNjLGVsZm1pcHMuc2N9OiBEb24ndCBhZGQgU0laRU9GX0hFQURFUlMgdG8KKwkudGV4dCBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLgorCitUdWUgTWF5ICA3IDEwOjU2OjExIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBOZXcgZnVuY3Rpb24uCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCisJKGhvbGRfe3NlY3Rpb24sdXNlLHRleHQscmRhdGEsZGF0YX0pOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXBkYXRlIG9ycGhhbiBmaWVsZC4KKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBXaGl0ZXNwYWNlIGNsZWFudXAuICBTZW1pY29sb24gdXNhZ2UgY2xlYW51cC4KKwkoSU5JVCxGSU5JKTogRGVsZXRlLCB1bnVzZWQuCisJKC50ZXh0KTogRG9jdW1lbnQgb3JwaGFuIC50ZXh0LmZvbyBzZWN0aW9ucy4KKwkoLnJkYXRhKTogRG9jdW1lbnQgb3JwaGFuIC5yZGF0YS5mb28gc2VjdGlvbnMuCisJKC5kYXRhKTogRG9jdW1lbnQgb3JwaGFuIC5kYXRhLmZvbyBzZWN0aW9ucy4KKworVHVlIE1heSAgNyAxMTozNTo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBQbGFjZSAiLnRpbnkiIHNlY3Rpb25zIHJpZ2h0CisJYWZ0ZXIgIi5kYXRhIiBzZWN0aW9ucy4KKwkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogUGxhY2UgIi50aW55IiBzZWN0aW9ucyBpbnRvCisJdGhlICJ0aW55IiBtZW1vcnkgcmVnaW9uLCAweGZmODAwMCB0aHJvdWdoIDB4ZmZmZjAwLgorCisJKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogU2V0IHRoZSBlbnRyeSBwb2ludCB0byB0aGUgdmFsdWUgb2YKKwkiX3N0YXJ0IiByYXRoZXIgdGhhbiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudC4KKwkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCisKKwkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBQbGFjZSAucm9kYXRhIHNlY3Rpb25zIGJlZm9yZSAudGV4dAorCXNlY3Rpb25zIGluIG1haW4gcmFtLgorCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KKworTW9uIE1heSAgNiAyMzozMjozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogVXNlICJlaWdodCIsIG5vdCAiZWlnaHRiaXQiIGZvciB0aGUKKwk4LWJpdCByZWdpb24gYW5kIDgtYml0IHNlY3Rpb25zLgorCitXZWQgTWF5ICAxIDE3OjUwOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogRml4IHR5cG9zLgorCitNb24gQXByIDI5IDIwOjMxOjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjICguZW5kanVuayk6IERlZmluZSBfX2VuZF9fLgorCitNb24gQXByIDI5IDE3OjA1OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxvbmdlc3Rfc2VjdGlvbl9uYW1lKTogUmVtb3ZlLgorCShTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCk6IERlZmluZS4KKwkocHJpbnRfc2l6ZSwgcHJpbnRfYWxpZ25tZW50LCBwcmludF9maWxsLCBwcmludF9zZWN0aW9uKTogUmVtb3ZlLgorCShwcmludF9mbGFncyk6IFJlbW92ZS4KKwkobGFuZ19tYXApOiBSZXdyaXRlLgorCShwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBSZXdyaXRlLgorCShwcmludF9hc3NpZ25tZW50KTogUmV3cml0ZS4KKwkocHJpbnRfb25lX3N5bWJvbCk6IFJld3JpdGUuCisJKHByaW50X2lucHV0X3NlY3Rpb24pOiBSZXdyaXRlLgorCShwcmludF9maWxsX3N0YXRlbWVudCk6IFJld3JpdGUuCisJKHByaW50X2RhdGFfc3RhdGVtZW50KTogUmV3cml0ZS4KKwkocHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShwcmludF9yZWxvY19zdGF0ZW1lbnQpOiBSZXdyaXRlLgorCShwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IFJld3JpdGUuCisJKHByaW50X3dpbGRfc3RhdGVtZW50KTogUmV3cml0ZS4KKwkocHJpbnRfc3RhdGVtZW50X2xpc3QpOiBDbGVhbiB1cC4KKwkocHJpbnRfc3RhdGVtZW50KTogQ2xlYW4gdXAuICBTb21lIG1pbm9yIG91dHB1dCBjaGFuZ2VzLgorCShwcmludF9zdGF0ZW1lbnRzKTogQ2xlYW4gdXAuCisJKGxvYWRfc3ltYm9scyk6IFB1dCBhbm90aGVyIC0gYmVmb3JlIC13aG9sZS1hcmNoaXZlLgorCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBDaGFuZ2UgZXRyZWVfdmFsdWUgYW5kIGV0cmVlX3JlbCB0bworCXByaW50IDB4IGFuZCB0byBvbWl0IGxlYWRpbmcgemVyb2VzLiAgRm9yIGV0cmVlX3JlbCwgdXNlICVCIHRvCisJcHJpbnQgdGhlIEJGRC4gIEZvciBldHJlZV9hc3NpZ24sIHJlbW92ZSB0aGUgc3BhY2UgYWZ0ZXIgdGhlCisJZGVzdGluYXRpb24gbmFtZS4KKwkqIGxkd3JpdGUuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgorCShjbG9uZV9zZWN0aW9uKTogQ2FsbCB4c3RyZHVwLCBub3Qgc3RyZHVwLgorCShsZHdyaXRlKTogRG9uJ3QgcHJpbnQgYW55IG1hcCBpbmZvcm1hdGlvbi4KKwkocHJpbnRfc3ltYm9sX3RhYmxlLCBwcmludF9maWxlX3N0dWZmLCBwcmludF9zeW1ib2wpOiBSZW1vdmUuCisJKiBsZG1haW4uYyAobWFpbik6IENhbGwgbGFuZ19tYXAgd2hlbiBhcHByb3ByaWF0ZS4KKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBBZGQgc3VwcG9ydCBmb3IgJVcuCisJKHByaW50X2FkZHJlc3MpOiBSZW1vdmUuCisJKiBsZG1pc2MuaCAocHJpbnRfYWRkcmVzcyk6IERvbid0IGRlY2xhcmUuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisKK01vbiBBcHIgMjkgMTA6Mjk6MDcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNvbmZpZ3VyZS5ob3N0IChtNjgqLSotbGludXgqKTogQWRkIC1keW5hbWljLWxpbmtlciB0bworIAlIT1NUSU5HX0NSVDAuICBTZWFyY2ggLWxnY2MgYm90aCBiZWZvcmUgYW5kIGFmdGVyIC1sYyBpbgorIAlIT1NUSU5HX0xJQlMuICBMb29rIGZvciBjcnR7YmVnaW4sZW5kfS5vIGluIHRoZSBjb21waWxlciBkaXJlY3RvcnkKKyAJYXQgZmlyc3QuCisJKGlbMzQ1XTg2LSotbGludXgqKTogTG9vayBmb3IgY3J0e2JlZ2luLGVuZH0ubyBpbiB0aGUgY29tcGlsZXIKKwlkaXJlY3RvcnkgYXQgZmlyc3QuCisKK0ZyaSBBcHIgMjYgMTQ6NDI6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZG1pc2MuaCAoZGVtYW5nbGUpOiBEZWNsYXJlLgorCSogbGRtaXNjLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4gIEluY2x1ZGUgZGVtYW5nbGUuaCB3aXRoICIiLAorIAlub3QgPD4uCisJKGRlbWFuZ2xlKTogTWFrZSBub24tc3RhdGljLiAgUmVtb3ZlIHJlbW92ZV91bmRlcnNjb3JlIHBhcmFtdGVyLgorCUFsd2F5cyByZXR1cm4gYW4gYWxsb2NhdGVkIHN0cmluZy4KKwkodmZpbmZvKTogRnJlZSByZXN1bHQgb2YgZGVtYW5nbGUuICBBZGQgY2FzZSAnRycuICBVc2UgJVQgdG8gcHJpbnQKKwlmdW5jdGlvbm5hbWUsIHJhdGhlciB0aGFuIGNhbGxpbmcgZGVtYW5nbGUuICBQcmludCBhIGNvbG9uIGJldHdlZW4KKwl0aGUgQkZEKHNlY3Rpb24rb2Zmc2V0KSBhbmQgdGhlIGxpbmUgbnVtYmVyLgorCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBJbXByb3ZlIGZvcm1hdCBvZiBhcmNoaXZlCisJaW5mb3JtYXRpb24gaW4gbWFwIGZpbGUuCisJKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogRG9uJ3QgcHJpbnQgYW55dGhpbmcgdG8gdGhlIG1hcCBmaWxlLgorCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEltcHJvdmUgZm9ybWF0IG9mIGNvbW1vbiBzeW1ib2wKKwlpbmZvcm1hdGlvbiBpbiBtYXAgZmlsZS4KKwkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IElmIHByb2R1Y2luZyBhIG1hcCBmaWxlLCBwcmludCBzZXQKKwlpbmZvcm1hdGlvbi4KKwkqIGxkd3JpdGUuYyAocHJpbnRfc3ltYm9sX3RhYmxlKTogUHJpbnQgYSBuZXdsaW5lIGJlZm9yZSB0aGUKKwloZWFkZXIgaW4gdGhlIG1hcCBmaWxlLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCisJKiBsZG1pc2MuYyAodmZpbmZvKTogUmVpbmRlbnQuCisKK01vbiBBcHIgMjIgMTI6MDc6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSWYgX2Nvb2tlZF9zaXplIGlzIG5vdCAwLCB0aGVuCisJZG9uJ3QgY2xvYmJlciBpdCB3aGVuIG5vdCByZWxheGluZy4KKworCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBSZW1vdmUgdHJhZGl0aW9uYWxfZm9ybWF0IGZpZWxkLgorCSogbGRtYWluLmMgKG1haW4pOiBVc2UgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCByYXRoZXIgdGhhbgorCWNvbmZpZy50cmFkaXRpb25hbF9mb3JtYXQuCisJKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogTGlrZXdpc2UuCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgorCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IExpa2V3aXNlLgorCSogbXB3LWVwcGNtYWMuYyAoZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyk6IExpa2V3aXNlLgorCisJKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRGlzY2FyZCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgd2UgYXJlCisJc3RyaXBwaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKworCSogZW11bHBhcmFtcy96ODAwMi5zaCAoQVJDSCk6IFNldCB0byB6ODAwMiwgbm90IHo4ay4KKworVHVlIEFwciAxNiAxNjozODozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogQ29ycmVjdCBoYW5kbGluZyBvZiBzdWJ0cmFjdGlvbiB3aXRoCisJYWJzb2x1dGUgdmFsdWVzLgorCShmb2xkX25hbWUpOiBQZXJtaXQgc3ltYm9scyBpbiBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bS4KKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogT25seSBQUk9WSURFIF9fc3RhY2sgd2hlbiBSRUxPQ0FUSU5HLiAgVW5kbworCWFjY2lkZW50YWwgY2hhbmdlcyBpbiBsYXN0IHBhdGNoLgorCitUdWUgQXByIDE2IDEwOjI1OjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAocG93ZXJwYyotKi17c3lzdixsaW51eH0pOiBBZGQgYWxpYXNlcy4KKwkocG93ZXJwY2xlKi0qLXtzeXN2LHNvbGFyaXN9KTogRGl0dG8uCisKK01vbiBBcHIgMTUgMTQ6NTA6NTYgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogQWRkIFBST1ZJREUgKF9fc3RhY2sgPSAwKSBzbyBJIGNhbiB1c2UgaXQKKwlpbiBtNjhrL2NydDAuUyB3aXRob3V0IHRoaW5ncyBibG93aW5nIHVwLgorCitGcmkgQXByIDEyIDE2OjQwOjU2IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBSZW1vdmUgZGVmYXVsdCBhZGRyZXNzIGZvciAuZGF0YSBzbworCS50ZXh0LCAuZGF0YSwgYW5kIC5ic3MgYXJlIGFsbCBzZXF1ZW50aWFsLgorCitUaHUgQXByIDExIDEyOjA1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IFJlbW92ZSByZWdpb25zIGFuZCBzaW1wbGlmeS4KKworV2VkIEFwciAxMCAxNDo0MTo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBBZGQgdGhlICI4LWJpdCBhcmVhIiBpbiB0aGUgdXBwZXIgMjU2CisJYnl0ZXMgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuICBQdXQgZGF0YSBmcm9tIHRoZSAiLmVpZ2h0IiBzZWN0aW9ucworCWludG8gdGhlIDgtYml0IGFyZWEuCisJKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgorCitUdWUgQXByICA5IDE0OjEwOjQyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgorCVBhc3MgJEFSQ0ggdG8gbGRmaWxlX3NldF9vdXRwdXRfYXJjaCBpbnN0ZWFkIG9mIHNldHRpbmcKKwlsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSBkaXJlY3RseS4KKworVHVlIEFwciAgOSAxNDoyMjoxNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLmluaXQsLmZpbmkpOiBQdXQgLmluaXQsIC5maW5pIHNlY3Rpb24KKwluZXh0IHRvIC50ZXh0LiAgUHV0IF9ldGV4dCBhZnRlciAudGV4dCwgLmluaXQsIC5maW5pLCBhbmQKKwkucm9kYXRheywyfSBzZWN0aW9ucy4KKworVHVlIEFwciAgOSAxMjoxODo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLnRleGluZm86IFJlYXJyYW5nZSBvcHRpb24gZG9jdW1lbnRhdGlvbi4KKworCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBOZXcgc3RhdGljIGFycmF5LgorCShwYXJzZV9hcmdzKTogQnVpbGQgc2hvcnRvcHRzIGFuZCBsb25nb3B0cyBmcm9tIGxkX29wdGlvbnMgYXJyYXkuCisJKGhlbHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogbGR2ZXIuaCAoaGVscCk6IERvbid0IGRlY2xhcmUuCisJKiBsZHZlci5jIChsZHZlcnNpb24pOiBSZWluZGVudC4KKwkoaGVscCk6IFJlbW92ZS4KKworCSogbGQudGV4aW5mbywgbGQuMTogTWVudGlvbiAtRSBhcyBhIHN5bm9ueW0gZm9yIC1leHBvcnQtZHluYW1pYy4KKworTW9uIEFwciAgOCAxMTo1NjoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogV2hlbiBjaGVja2luZyBmb3IgYSBuYXRpdmUgZW11bGF0aW9uLCBjaGVjaworCXRoYXQgdGhlIGN1cnJlbnQgZW11bGF0aW9uIGlzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbi4KKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgorCWRpcmVjdG9yaWVzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCAtRSBhcyBhIHN5bm9ueW0gZm9yIC1leHBvcnQtZHluYW1pYywKKwlmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4KKworRnJpIEFwciAgNSAxNDozMDoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZik6IE5ldworCXN0YXRpYyBmdW5jdGlvbiwgaWYgJHtob3N0fSA9ICR7dGFyZ2V0fS4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IENhbGwgY2hlY2tfbGRfc29fY29uZiB0byBmaW5kIGEKKwluZWVkZWQgc2hhcmVkIGxpYnJhcnkgaWYgJHtob3N0fSA9ICRbdGFyZ2V0fS4KKworCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotbGludXgqKTogQWRkIC1keW5hbWljLWxpbmtlciB0bworCUhPU1RJTkdfQ1JUMC4gIFNlYXJjaCAtbGdjYyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgLWxjIGluCisJSE9TVElOR19MSUJTLgorCisJKiBjb25maWd1cmUudGd0OiBBZGQgaVszNDVdODYtKi1mcmVlYnNkZWxmKiB0YXJnZXQ7IGZyb20gSm9obgorCVBvbHN0cmEgPGpkcEBwb2xzdHJhLmNvbT4uCisKK0ZyaSBBcHIgIDUgMTg6MTE6MjUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBlbXVscGFyYW1zL2VsZjMye2IsbH00MzAwLnNoIChNQUNISU5FKTogQWRkIGV4cGxpY2l0CisgCWFyY2hpdGVjdHVyZSBudW1iZXIuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSAkTUFDSElORSBkZWZpbml0aW9uIGlmIHByZXNlbnQuCisJKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogRm9yY2UgNDEwMCBidWlsZCB0byB1c2Ugc2FtZQorIAl0ZW1wbGF0ZSBhcyA0MzAwLgorCitNb24gQXByICAxIDE3OjM1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoYW5nZSByZWdpb24gY2hlY2sgdG8gaGFuZGxlCisJcmVnaW9ucyB3aGljaCBlbmQgYXQgdGhlIGhpZ2hlc3QgcG9zc2libGUgYWRkcmVzcyBjb3JyZWN0bHkuCisJRnJvbSBSb2xhbmQgV2ViZXIgPHJvd2ViZXJAaXJhLnVrYS5kZT4uCisKKwkqIGxkbGFuZy5jIChzZWN0aW9uX2FscmVhZHlfbGlua2VkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkod2lsZF9kb2l0KTogRGlzY2FyZCBzZWN0aW9ucyB3aXRoIFNFQ19FWENMVURFIHNldCBpZiBub3QgZG9pbmcgYQorCXJlbG9jYXRlYWJsZSBsaW5rLiAgRG9uJ3Qgd29ycnkgYWJvdXQgc2VjdGlvbiBiZWluZyBOVUxMLCBzaW5jZSBpdAorCW5ldmVyIHNob3VsZCBiZS4gIERvbid0IGNhbGwgaW5pdF9vcyB1bmxlc3MgdGhlIHNlY3Rpb24gaXMgZ29pbmcKKwl0byBiZSBhZGRlZC4KKwkobGRsYW5nX2FkZF9maWxlKTogQ2FsbCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIGZvciBlYWNoIHNlY3Rpb24uCisJKiBsZG1haW4uYyAobXVsdGlwbGVfZGVmaW5pdGlvbik6IERvbid0IHdhcm4gYWJvdXQgbXVsdGlwbGUKKwlkZWZpbml0aW9ucyBpbiBzZWN0aW9ucyB3aGljaCBhcmUgYmVpbmcgZGlzY2FyZGVkLgorCitTdW4gTWFyIDMxIDAwOjMwOjQ3IDE5OTYgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3twcGNwZS5zYywgcGUuc2N9ICguanVuayk6IFJlbW92ZSBhbmQgdXNlIC9ESVNDQVJELy4KKwkqIGVtdWx0ZW1wbC9wZS5lbSAoaW5pdCk6IFJlbW92ZSBzcGVjaWFsIGNhc2UgUFBDIGNvZGUuCisKK0ZyaSBNYXIgMjkgMDA6MDE6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogTWFrZSB2ZWN0b3JzIHNlY3Rpb24gMHhjNCBieXRlcyBsb25nCisJc28gYXMgbm90IHRvIG92ZXJ3cml0ZSB0aGUgbWFnaWMgc3lzY2FsbCBlbnRyeSBhdCAweGM0LgorCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KKworVGh1IE1hciAyOCAxMTowNTo0NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChzcGFyYzY0LSotc29sYXJpczIqKTogRGVsZXRlLgorCVN0aWNrIHdpdGggc3BhcmMtKi1zb2xhcmlzMiouCisKK1dlZCBNYXIgMjcgMTI6MzM6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC5oIChESVNDQVJEX1NFQ1RJT05fTkFNRSk6IERlZmluZSB0byAiL0RJU0NBUkQvIi4KKwkqIGxkbGFuZy5jIChpbml0X29zKTogRmFpbCBvbiBhbiBhdHRlbXB0IHRvIGluaXRpYWxpemUgYW55IHNlY3Rpb24KKwluYW1lZCBESVNDQVJEX1NFQ1RJT05fTkFNRS4KKwkod2lsZF9kb2l0KTogRGlzY2FyZCBpbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byBhbiBvdXRwdXQgc2VjdGlvbgorCW5hbWVkIERJU0NBUkRfU0VDVElPTl9OQU1FLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdXNlIG9mIC9ESVNDQVJELy4KKworCSogbGRsYW5nLmM6IEZpeCBzb21lIGluZGVudGF0aW9uIGFuZCBjb21tZW50cy4KKworVHVlIE1hciAyNiAxODoxNDo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZS4KKworVGh1IE1hciAyMSAxMzoxNzozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLnRleGluZm86IEZpeCBhIGNvdXBsZSBvZiBpbmRleGluZyBlbnRyaWVzLiAgTWVudGlvbiB0aGF0CisJLS12ZXJib3NlIGRpc3BsYXlzIGJ1aWx0aW4gbGlua2VyIHNjcmlwdHMuCisKKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBjYXNlICdJJzogSWYgdGhlIGZpbGUgaXMgbm90IGluIGFuIGFyY2hpdmUsCisJYW5kIHRoZSBsb2NhbCBzeW1ib2wgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZW5hbWUsIHByaW50IHRoZQorCWZpbGVuYW1lIGFzIHdlbGwuCisKKwlQYXRjaGVzIGZyb20gSm9obiBQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+IGZvciBGcmVlQlNEIEVMRjoKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogLUJzaGFyZWFibGUgaXMgYSBzeW5vbnltIGZvciAtc2hhcmVkLgorCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogTWFrZSB0aGUgc2FtZQorCWFzIFRFWFRfU1RBUlRfQUREUi4KKworV2VkIE1hciAyMCAxODoxODoyNSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbGQudGV4aW5mbzogRml4IHR5cG9zLiAgVXNlIEBweHJlZiBvbmx5IGluc2lkZSBwYXJlbnRoZXNlcy4KKworV2VkIE1hciAyMCAxNjo1NjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChhZGRfd3JhcCk6IE5ldyBmdW5jdGlvbi4KKwkqIGxkbWFpbi5oIChhZGRfd3JhcCk6IERlY2xhcmUuCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENhbGwgYWRkX3dyYXAuCisKK1R1ZSBNYXIgMTkgMTY6NDQ6MjAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3QgKHNwYXJjKi0qLXNvbGFyaXMyKiBob3N0KTogQWNjZXB0IGFueSBzcGFyYyB2YXJpYW50LgorCitXZWQgTWFyIDEzIDE3OjQ3OjMxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IENoYW5nZSBuYW1lIG9mIHBhZ2UgemVybyBtZW1vcnkKKwlmcm9tICJudWxsIiB0byAidmVjdG9ycyIuICBDcmVhdGUgYW4gb3V0cHV0IHNlY3Rpb24gZm9yCisJdmVjdG9ycy4gIEFkZCBjb21tZW50cyBvbiBob3cgdG8gZXhwbGljaXRseSBwbGFjZSBpdGVtcworCWluIHRoZSB2ZWN0b3IgdGFibGUuCisJKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgorCitXZWQgTWFyIDEzIDEyOjQwOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2xuazk2MC5lbSAobWFjaGluZV90YWJsZSk6IEFkZCBqeCBhbmQgaHguCisKKwkqIGdlbnNjcmlwdHMuc2g6IERvbid0IHVzZSAkezk6LXh4fSwgc2luY2UgVWx0cml4IC9iaW4vc2ggZG9lc24ndAorCXN1cHBvcnQgaXQuCisKK1R1ZSBNYXIgMTIgMTI6NDM6NTkgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1Aa29hbGEuYXpzdGFybmV0LmNvbT4KKworCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9tdWx0aXBsZV9ncCBmaWVsZC4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0td2Fybi1tdWx0aXBsZS1ncC4KKwkqIGxkbWFpbi5jICh3YXJuaW5nX2NhbGxiYWNrKTogU3VwcHJlc3MgbXVsdGlwbGUgZ3AgdmFsdWVzIHdhcm5pbmcKKwlpZiAtLXdhcm5fbXVsdGlwbGVfZ3Agd2FzIG5vdCB1c2VkLgorCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13YXJuLW11bHRpcGxlLWdwLgorCitUdWUgTWFyIDEyIDEyOjAyOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS13cmFwLgorCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby53cmFwX2hhc2guCisJKiBsZGV4cC5jIChmb2xkX25hbWUpOiBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCBpbiBERUZJTkVECisJYW5kIE5BTUUgY2FzZXMuCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdyYXAuCisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KKworCURvbid0IGRvIFN1bk9TIHN0eWxlIGR5bmFtaWMgbGlua2luZyBmb3Igc3BhcmMtYW91dDoKKwkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjNjQtKi1hb3V0Kik6IFVzZSBzcGFyY2FvdXQsIG5vdCBzdW40LgorCShzcGFyY2xpdGUqLWZ1aml0c3UtKiwgc3BhcmMqLSotYW91dCk6IExpa2V3aXNlLgorCShzcGFyYyotd3JzLXZ4d29ya3MqKTogTGlrZXdpc2UuCisJKiBlbXVscGFyYW1zL3NwYXJjYW91dC5zaDogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXNwYXJjYW91dC5vLgorCShlc3BhcmNhb3V0LmMpOiBOZXcgdGFyZ2V0LgorCitXZWQgTWFyICA2IDE2OjA2OjUyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguc2RhdGEyLCAuc2JzczIpOiBJbXBsZW1lbnQgRmViIDIgY2hhbmdlCisgCWluIGEgZGlmZmVyZW50IG1hbm5lciB0byB3b3JrIGFyb3VuZCBkaWZmZXJlbmNlcyBpbiBzaGVsbCB2YXJpYWJsZQorIAlleHBhbnNpb24uCisKK1dlZCBNYXIgIDYgMTg6MDg6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGVtdWwuaCAobGRlbXVsX3VucmVjb2duaXplZF9maWxlKTogRGVjbGFyZS4KKwkobGRlbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHVucmVjb2duaXplZF9maWxlIGZpZWxkLgorCSogbGRlbXVsLmMgKGxkZW11bF91bnJlY29nbml6ZWRfZmlsZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBJZiBhIGZpbGUgY2FuIG5vdCBiZSByZWNvZ25pemVkLCBjYWxsCisJbGRlbXVsX3VucmVjb2duaXplZF9maWxlIGJlZm9yZSB0cnlpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LgorCSogYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSk6IE5ldyBzdGF0aWMKKwlmdW5jdGlvbi4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogVXNlIEZPUEVOX1JULCBub3QgInIiLgorCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIHVucmVjb2duaXplZF9maWxlLgorCitNb24gTWFyICA0IDE0OjExOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKHdpbGQpOiBIYW5kbGUgZm9vLmEoLnRleHQpIGJ5IG1hcHBpbmcgZWFjaCBpbmNsdWRlZAorCW1lbWJlciBvZiBmb28uYSBzZXBhcmF0ZWx5LiAgRnJvbSBKb3VrZSBOdW1hbiA8am51bWFuQGJhemlzLm5sPi4KKworRnJpIE1hciAgMSAxMDoyNDo1OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKKwlTZWFyY2ggdHJpbmFyeS5jb25kIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0cmluYXJ5LmxocyB0d2ljZS4KKworVHVlIEZlYiAyNyAxNTowODo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KKwkoQFRESVJTQCk6IEVkaXQgb3V0LCBjYW4ndCB1c2UgZ2Vuc2NyaXB0cy4KKworVHVlIEZlYiAyNyAxNTowOToyMSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogY29uZmlndXJlLnRndCAobTY4ay0qLWxpbnV4YW91dCosIG02OGstKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KKwkqIGVtdWxwYXJhbXMvbTY4a2xpbnV4LnNoOiBOZXcgZmlsZS4KKwkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgorCUNhbGwgYmZkXyR7RU1VTEFUSU9OX05BTUV9X3NpemVfZHluYW1pY19zZWN0aW9ucyBpbnN0ZWFkIG9mCisJYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucy4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbTY4a2xpbnV4Lm8uCisJKGVtNjhrbGludXguYyk6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4YW91dCosIG02OCotKi1saW51eCopOiBOZXcgaG9zdHMuCisKK1R1ZSBGZWIgMjcgMTI6NTU6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBTb3J0IGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLgorCUZpbGwgaW4gbWlzc2luZyBlbnRyaWVzLgorCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtLW5vLXdob2xlLWFyY2hpdmUuCisJKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IEFkZCB3aG9sZV9hcmNoaXZlIGZpZWxkLgorCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFNldCB3aG9sZV9hcmNoaXZlIGZpZWxkLgorCShsb2FkX3N5bWJvbHMpOiBDaGVjayBpbnB1dCBmaWxlIHNwZWNpZmljIHdob2xlX2FyY2hpdmUgZmllbGQKKwlyYXRoZXIgdGhhbiBnbG9iYWwgdmFyaWFibGUuCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLW5vLXdob2xlLWFyY2hpdmUuCisKK1R1ZSBGZWIgMjAgMTY6MDc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0OiBDb3JyZWN0IGdsZGk5NjAgdG8gZ2xkOTYwLgorCitNb24gRmViIDE5IDExOjE2OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBDaGVjaworCXRoZSBTT05BTUUgaWYgaXQgaXMgYXZhaWxhYmxlLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IFVzZSB0aGUgU09OQU1FLCBub3QgdGhlCisJZmlsZW5hbWUsIHdoZW4gY2hlY2tpbmcgZm9yIGNvbmZsaWN0aW5nIGxpYnJhcnkgdmVyc2lvbnMuICBEb24ndAorCWFzc3VtZSB0aGF0IHRoZSBzdWZmaXggaXMgb25seSBudW1iZXJzIGFuZCBkb3RzLgorCisJKiBsZC50ZXhpbmZvOiBNZW50aW9uIHRoYXQgLVIgY2FuIGJlIHVzZWQgZm9yIC1ycGF0aC4KKworU3VuIEZlYiAxOCAxNTowNToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKKwl0cnlpbmcgdG8gdXNlIC1ycGF0aC4KKworVGh1IEZlYiAxNSAxMzo1ODowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGV4cGxpY2l0IHN1YnN0aXR1dGlvbiBvZiBDRkxBR1M7IGF1dG9jb25mCisJZG9lcyBpdCBhbnlob3cuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoTERGTEFHUyk6IFNldCB0byBATERGTEFHU0AuCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBjb25maWd1cmUuaG9zdC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGNvbmZpZ3VyZS5ob3N0OiBSZW1vdmUgZ28zMiBob3N0LCBzaW5jZSBpdCBzaG91bGQgbm8gbG9uZ2VyIGJlCisJbmVjZXNzYXJ5LiAgRG9uJ3Qgc2V0IENDIGZvciByb21wIGhvc3QuCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRG9uJ3Qgc2tpcCBhIHBhZ2UgaW4gdmlydHVhbCBtZW1vcnkgc3BhY2UgaWYKKwl0aGUgdGV4dCBzZWdtZW50IGVuZHMgZXhhY3RseSBvbiBhIHBhZ2UgYm91bmRhcnkuCisKKwkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWd1cmUuaG9zdDogU2V0IFJQQVRIX0VOVlZBUi4KKwkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCisJKGNoZWNrKTogVXNlICQoUlBBVEhfRU5WVkFSKSByYXRoZXIgdGhhbiBMRF9MSUJSQVJZX1BBVEguCisKK1dlZCBGZWIgMTQgMTg6NDk6MDEgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBjb25maWd1cmUuaW46IFJlZG8gZW11bGF0aW9uIGhhbmRsaW5nIHNvIHRoYXQgZWFjaCBlbXVsYXRpb24KKwlzZWFyY2hlcyB0aGUgY29ycmVjdCB0b29sIGRpcmVjdG9yeSwgYmFzZWQgb24gdGhlIHRhcmdldCBhbGlhcy4KKwlGb3IgZXhhbXBsZSwgImNvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPW02OGstY29mZiBpMzg2LWxpbnV4IgorCXdpbGwgc2VhcmNoIC91c3IvbG9jYWwvaTM4Ni1saW51eC9saWIgZm9yIGxpbnV4IGFuZAorCS91c3IvbG9jYWwvbTY4ay1jb2ZmL2xpYiBmb3IgbTY4ay1jb2ZmLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLnRndDogQWRkIHNwZWNpYWwgdGRpciBzZXR0aW5ncyBmb3IgTGludXguCisJKiBNYWtlZmlsZS5pbjogQWRkIEBURElSU0AuICBQYXNzICIkKHRkaXJfRU1VTCkiIHRvICR7R0VOU0NSSVBUU30KKwlmb3IgZWFjaCBlRU1VTC5jIHRhcmdldC4KKwkqIGdlbnNjcmlwdHMuc2g6IEFjY2VwdCBzcGVjaWZpYyBhbGlhcyBhcyA5dGggYXJndW1lbnQsIGFuZCB1c2UgaXQKKwlpbiBMSUJfUEFUSC4KKworV2VkIEZlYiAxNCAxNjozODozNiAxOTk2ICBNYXJ0aW4gQW5hbnRoYXJhbWFuICA8bWFydGluQG1haWwuaW1lY2gudW5pLWR1aXNidXJnLmRlPgorCisJKiBsZGxhbmcuYyAobGFuZ19zZXRfc3RhcnRvZik6IERvbid0IGRvIGFueXRoaW5nIGZvciBhCisJcmVsb2NhdGVhYmxlIGxpbmsuCisKKwkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2ZpbGUpOiBDYWxsIG1yaV9kcmF3X3RyZWUuCisJKiBtcmkuYyAobXJpX2RyYXdfdHJlZSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIERvbid0IGJvdGhlciB0bworCWNyZWF0ZSBtZW1vcnkgcmVnaW9ucy4KKwkobXJpX2xvYWQpOiBEb24ndCBjYWxsIG1yaV9kcmF3X3RyZWUuCisJKiBtcmkuaCAobXJpX2RyYXdfdHJlZSk6IERlY2xhcmUuCisKKwkqIGNvbmZpZ3VyZS50Z3QgKG02OCotKi1wc29zKTogTmV3IHRhcmdldC4KKwkqIGVtdWxwYXJhbXMvbTY4a3Bzb3Muc2g6IE5ldyBmaWxlLgorCSogc2NyaXB0dGVtcGwvcHNvcy5zYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW02OGtwc29zLm8uCisJKGVtNjhrcHNvcy5jKTogTmV3IHRhcmdldC4KKworV2VkIEZlYiAxNCAxMTowOToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKCotKi1pZWVlKik6IE5ldyB0YXJnZXQ7IHVzZSB2YW5pbGxhLgorCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6IFN0cmlwCisJYDpmb28nIGZyb20gJHtBUkNIfS4KKworVHVlIEZlYiAxMyAxNTo1ODo1OCAxOTk2ICBCcnlhbiBGb3JkICA8YmFmb3JkQHNuYWtlLmNzLnV0YWguZWR1PgorCisJKiBzY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2M6IERvbid0IHBhZCB0aGUgLnRleHQgc2VjdGlvbi4gIFB1dAorCS5yb2RhdGEgaW4gLmRhdGEuCisKK1R1ZSBGZWIgMTMgMTQ6MDQ6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IFdhcm4gaWYKKwlpdCBsb29rcyBsaWtlIHdlIG1pZ2h0IGJlIGxpbmtpbmcgaW4gdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKKwlzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgQmFzZWQgb24gYSBwYXRjaCBmcm9tIEggSiBMdSA8aGpsQHpvb20uY29tPi4KKworVGh1IEZlYiAgOCAxOToyNTo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB3aGVuIGEKKwlwYWRkaW5nIHN0YXRlbWVudCBpcyBlbmNvdW50ZXJlZC4KKworV2VkIEZlYiAgNyAxNDowMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgLS1lbmFibGUtc2hhcmVkLiAgQ2hhbmdlIHRoZSB2YWx1ZSBvZgorCUJGRExJQiB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IG9uIFN1bk9TLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlndXJlLmhvc3Q6IElmIHVzaW5nIGEgc2hhcmVkIEJGRCBsaWJyYXJ5LCB0cnkgdG8gcGFzcyBhCisJcmVhc29uYWJsZSAtcnBhdGggb3B0aW9uIHdoZW4gbGlua2luZy4KKwkqIE1ha2VmaWxlLmluIChCRkRMSUIpOiBTZXQgdG8gQEJGRExJQkAuCisKK1R1ZSBGZWIgIDYgMTI6Mjk6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggKEFSQ0gpOiBDaGFuZ2UgdG8gYHNwYXJjOnY5Jy4KKwkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtOiBTdHJpcCBgOmZvbycgZnJvbSAke0FSQ0h9LgorCitNb24gRmViICA1IDE2OjI1OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgorCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46CisJKiBjb25maWd1cmUuaW4gKEhMREZMQUdTKTogTmV3IHN1YnN0aXR1dGlvbi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSExERkxBR1Mgb24gU3VuT1MuCisJKiBNYWtlZmlsZS5pbiAoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKEJGRERFUCk6IE5ldyB2YXJpYWJsZS4KKwkoQkZETElCKTogQ2hhbmdlIHRvIC1MLi4vYmZkIC1sYmZkLgorCSgkKExEX1BST0cpKTogRGVwZW5kIHVwb24gJChCRkRERVApIHJhdGhlcm4gdGhhbiAkKEJGRExJQikuICBVc2UKKwkkKEhMREZMQUdTKSBpbiBsaW5rLgorCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgorCitGcmkgRmViICAyIDE5OjI2OjI1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+CisKKwkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLnNkYXRhMiwgLnNic3MyKTogUHV0IC5zZGF0YTIgYW5kIC5zYnNzCisJaW4gdGhlIHJlYWQtb25seSBzZWN0aW9uLCBub3QgcmVhZC93cml0ZSB1bmxlc3Mgd2UgYXJlIG1ha2luZyBhCisJc2hhcmVkIGxpYnJhcnkuCisJKC5kZWJ1ZyopOiBBZGQgZHdhcmYgZGVidWcgc2VjdGlvbnMuCisJKC5yZWxhLntzZGF0YSosc2Jzcyp9KTogQWRkIHNlY3Rpb25zLgorCitGcmkgRmViICAyIDE2OjUwOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitUaHUgRmViICAxIDEwOjUwOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIHRvIDB4ODA0ODAwMCwKKwlmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LgorCisJKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogQ29ycmVjdCBoYW5kbGluZyBvZiBBQlNPTFVURS4KKworV2VkIEphbiAzMSAxNzozMDoxOSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChpWzM0NV04Ni0qLWN5Z3dpbjMyLCBwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KKwkqIGVtdWx0ZW1wbC9wZS5lbSAoZGVmaW5mbyBpbml0KTogTWFrZSB0aGUgZGVmYXVsdCBzdGFjayByZXNlcnZlCisJb2YgYSBQUEMgbGFyZ2VyLgorCitXZWQgSmFuIDMxIDE0OjM0OjIzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBjb25maWd1cmUudGd0IChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgorCSogZW11bHBhcmFtcy9tNjhrYXV4LnNoOiBOZXcgZmlsZS4KKwkqIHNjcmlwdHRlbXBsL202OGthdXguc2M6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtNjhrYXV4Lm8uCisJKGVtNjhrYXV4LmMpOiBOZXcgdGFyZ2V0LgorCitUdWUgSmFuIDMwIDEzOjE4OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IElnbm9yZQorCS1ibm9lbnRyeSwgc2luY2UgdGhlIHJpZ2h0IHRoaW5nIHRlbmRzIHRvIGhhcHBlbiBhbnlob3cuCisKK01vbiBKYW4gMjkgMTI6Mjk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtZXhwb3J0LWR5bmFtaWMuCisKK0ZyaSBKYW4gMjYgMTE6MTE6NTUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogQ2hlY2sgZm9yIG5hdGl2ZSBjb21waWxlIGJ5IGNvbXBhcmluZworCSR7dGFyZ2V0fSBhbmQgJHtob3N0fS4KKworVGh1IEphbiAyNSAxNjo0Njo1OCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGVtdWxwYXJhbXMve2VsZjMyYjQzMDAuc2gsIGVsZjMybDQzMDAuc2h9OiBDaGFuZ2VkCisgCVRFWFRfU1RBUlRfQUREUiB0byBhbGxvdyB1c2Ugb24gSURUIGFuZCBQTU9OIHN5c3RlbXMuCisKK1dlZCBKYW4gMjQgMjA6NTk6NDAgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6CisJY29ycmVjdCBzcGVsbGluZy4KKworV2VkIEphbiAyNCAxNjo1OToxOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAoc3BhcmM2NC0qLXNvbGFyaXMyKik6IE5ldyBjb25maWd1cmF0aW9uLgorCShzcGFyYzY0LSotYW91dCopOiBSZW5hbWVkIGZyb20gc3BhcmM2NCouCisKK01vbiBKYW4gMjIgMTM6MDE6MzUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIE1ha2VmaWxlLmluIChHRU5TQ1JJUFRTKTogUGFzcyBAaG9zdEAgQHRhcmdldEAgQHRhcmdldF9hbGlhc0AuCisJKiBnZW5zY3JpcHRzLnNoOiBTZXQgaG9zdCwgdGFyZ2V0IGFuZCB0YXJnZXRfYWxpYXMgdmFyaWFibGVzLgorCUNoZWNrIGZvciBuYXRpdmUgY29tcGlsZSBieSBjb21wYXJpbmcgJHt0YXJnZXR9IGFuZCAke2hvc3R9LgorCSogZW11bHRlbXBsL2VsZjMyLmVtOiBMaWtld2lzZS4KKwkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFRlc3QgJHt0YXJnZXR9LCBub3QgJHt0YXJnZXRfYWxpYXN9LgorCitNb24gSmFuIDIyIDExOjAzOjIzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZWZpbmUgZWFiaSBzdXBwb3J0IHRvIGJldHRlciBzdXBwb3J0CisJLnNkYXRhLCAuc2RhdGEyLCAuc2JzcywgZXRjLiBzZWN0aW9ucy4KKworVHVlIEphbiAxNiAxNToxNjo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZ3JhbS55ICgldW5pb24pOiBBZGQgcGhkciBmaWVsZC4KKwkocGhkcik6IFVzZSBwaGRyX3F1YWxpZmllcnMgcmF0aGVyIHRoYW4gb3B0X2hkcnMgYW5kIG9wdF9hdC4KKwkocGhkcl9xdWFsaWZpZXJzKTogTmV3IG5vbnRlcm1pbmFsLiAgQWRkIHN1cHBvcnQgZm9yIEZMQUdTLgorCShvcHRfaGRycywgaGRyKTogUmVtb3ZlLgorCShwaGRyX3ZhbCk6IE5ldyBub250ZXJtaW5hbC4KKwkqIGxkbGFuZy5jIChsYW5nX25ld19waGRyKTogUmVwbGFjZSBoZHJzIHBhcmFtZXRlciB3aXRoIGZpbGVoZHIKKwlhbmQgcGhkcnMgcGFyYW1ldGVycy4gIEFkZCBmbGFncyBwYXJhbWV0ZXIuCisJKGxhbmdfcmVjb3JkX3BoZHJzKTogVXBkYXRlIGZvciBjaGFuZ2VzIHRvIGxhbmdfcGhkci4gIFBhc3MgZmxhZ3MKKwl0byBiZmRfcmVjb3JkX3BoZHIuCisJKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfcGhkcik6IFJlcGxhY2UgaGRycyBmaWVsZCB3aXRoIGZpbGVoZHIgYW5kCisJcGhkcnMgZmllbGRzLiAgQWRkIGZsYWdzIGZpZWxkLgorCShMQU5HX1BIRFJfRklMRUhEUiwgTEFOR19QSERSX1BIRFJTKTogUmVtb3ZlLgorCShsYW5nX25ld19waGRyKTogVXBkYXRlIGRlY2xhcmF0aW9uLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgRkxBR1MuCisKK01vbiBKYW4gMTUgMTU6MDc6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKKwlEb24ndCBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgYmVjYXVzZSBvZiBhbiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCisJX19HTE9CQUxfT0ZGU0VUX1RBQkxFXy4KKworCUFkZCBzb21lIElyaXggNSBzdXBwb3J0LCBtb3N0bHkgZnJvbSBLYXp1bW90byBLb2ppbWEKKyAgICAgICAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPjoKKwkqIGVtdWxwYXJhbXMvZWxmMzJibWlwLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byBlbGZtaXBzLgorCShTSExJQl9URVhUX1NUQVJUX0FERFIpOiBEZWZpbmUuCisJKE9USEVSX0dPVF9TWU1CT0xTKTogRGVmaW5lLgorCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBSZW1vdmUgaW5pdGlhbGl6YXRpb24gb2YgX2dwLgorCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBEb24ndCBkZWZpbmUuCisJKERZTkFNSUNfTElOSyk6IERvbid0IGRlZmluZS4KKwkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoOiBTYW1lIGNoYW5nZXMgYXMgZWxmMzJibWlwLnNoLgorCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaG9zdCAobWlwcyotZGVjLWJzZCopOiBDaGFuZ2UgbWlwcyB0byBtaXBzKi4KKwkobWlwcyotc2dpLWlyaXg0Kik6IExpa2V3aXNlLgorCShtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IGVudHJ5LgorCSogTWFrZWZpbGUuaW4gKGVlbGYzMmJtaXAuYyk6IERlcGVuZCB1cG9uIGVsZm1pcHMuc2MgcmF0aGVyIHRoYW4KKwllbGYuc2MuCisJKGVlbGYzMmxtaXAuYyk6IExpa2V3aXNlLgorCitTYXQgSmFuIDEzIDA5OjQxOjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZW1vdmUgc3VwcG9ydCBmb3IgLnJlbC4qIHNlY3Rpb25zLiAgQWRkCisJLnJlbGEuZ290Lm5lZyBzZWN0aW9uLgorCitGcmkgSmFuIDEyIDE0OjU2OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvc2guc2M6IE9ubHkgYnVpbGQgY29uc3RydWN0b3JzIHdoZW4gQ09OU1RSVUNUSU5HLgorCisJKiBsZG1pc2MuYzogSW5jbHVkZSA8c3RkYXJnLmg+IHJhdGhlciB0aGFuIDx2YXJhcmdzLmg+IGlmCisJQU5TSV9QUk9UT1RZUEVTIGlzIGRlZmluZWQuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZgorCVdJTkRPV1NfTlQuICBWYXJpb3VzIGluZGVuZGF0aW9uIGZpeGVzLgorCSh2ZmluZm8pOiBDaGFuZ2UgZm10IHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCisJKGluZm9fbXNnKTogV3JpdGUgPHN0ZGFyZy5oPiB2ZXJzaW9uLgorCShlaW5mbywgbWluZm8sIGZpbmZvKTogTGlrZXdpc2UuCisJKGluZm9fYXNzZXJ0KTogQ2hhbmdlIGZpbGUgcGFyYW1ldGVyIHRvIGNvbnN0IGNoYXIgKi4KKwkqIGxkbWlzYy5oIChlaW5mbywgbWluZm8sIGluZm9fbXNnKTogSWYgQU5TSV9QUk9UT1RZUEVTIGlzCisJZGVmaW5lZCwgdXNlIGEgcmVhbCBwcm90b3R5cGUuCisJKGluZm9fYXNzZXJ0KTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICouCisKK0ZyaSBKYW4gMTIgMTM6Mjk6NTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuc2RhdGEyLy5zYnNzMiwgZXRjLiAgQWRkCisJaW4gb2xkIHN1cHBvcnQgdGhhdCAyLjcuMiBuZWVkcywgYnV0IHRoZSBjdXJyZW50IGNvbXBpbGVyIGRvZXMKKwlub3QuCisKKwkqIE1ha2VmaWxlLmluIChlZWxmMzJ7LGx9cHBjLmMpOiBGaXggdXAgZGVwZW5kZW5jaWVzIHRvIHVzZSB0aGUKKwljb3JyZWN0IExpbmtlciBzY3JpcHQgdGVtcGxhdGUuCisKKwkqIGVtdWxwYXJhbXMvZWxmMzJ7LGx9cHBjLnNoIChURVhUX1NUQVJUX0FERFIpOiBTZXQgdG8gMHg0MDAwMCwKKwlub3QgMHg0MDAwMDAuCisJKERBVEFfQUREUixOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEZWxldGUuCisKK1R1ZSBKYW4gIDkgMTU6NTM6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogUHV0IC5yY29uc3QgcmlnaHQgYWZ0ZXIgLnJkYXRhLgorCitGcmkgSmFuICA1IDE0OjA3OjQ1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKKwlzb3J0IHVzaW5nIHJpZ2h0IHBvaW50ZXIuCisKK0ZyaSBKYW4gIDUgMTI6MjU6NDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IFJlbW92ZSBzdXBwb3J0IGZvciBjcmVhdGluZyBzcGVjaWFsCisJbGFiZWxzIGZvciBlYWJpIHNlY3Rpb24gYmVnaW4vZW5kIGhlcmUuICBUaGUgY29tcGlsZXIgbm93IHVzZXMKKwljcnR7aSxufS5vIHRvIGNyZWF0ZSB0aGVzZSBzeW1ib2xzLgorCitUaHUgSmFuICA0IDE3OjA4OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmhvc3Q6IENoYW5nZSBleGlzdGluZyBMaW51eCBIT1NUSU5HX0NSVDAgdG8gYmUgdXNlZAorCWZvciBhLm91dCBvbmx5LCBhbmQgcHV0IGluIGFwcHJvcHJpYXRlIEhPU1RJTkdfQ1JUMCBhbmQKKwlIT1NUSU5HX0xJQlMgdmFsdWVzIGZvciBMaW51eCBFTEYuCisKK1RodSBKYW4gIDQgMTI6MDI6MDUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFVzZSBhbGwgNjRLIGZvciByYW0uCisJKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IERlZmluZSAyNTZLIHJhbSBzaXplLgorCitUaHUgRGVjIDIxIDE1OjU3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBQYXNzCisJZXhwb3J0X2RlZmluZXMgYXMgdHJ1ZSB0byBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIGlmIC11bml4CisJd2FzIHVzZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciAtYkUgd2FzIHVzZWQuCisKK1R1ZSBEZWMgMTkgMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogT25seSBzZXQKKwlyZWxvY2F0ZWFibGUgYmVmb3JlIGNhbGxpbmcgbGRjdG9yX2J1aWxkX3NldHMgaWYgdGhlIG91dHB1dCBmaWxlCisJaXMgaW4gYW4gWENPRkYgZm9ybWF0LgorCitGcmkgRGVjIDE1IDE2OjM0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogV2hlbiBoYW5kbGluZyBhIGRhdGEgc3RhdGVtZW50LCBpZgorCXRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyB1bmtub3duLCB1c2UgdGhlIGVuZGlhbm5lc3MKKwlvZiB0aGUgaW5wdXQgZmlsZS4KKworVHVlIERlYyAxMiAxMzo1NTo0MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW46IFJlY29nbml6ZSBtaXBzLSotKiBhcyBlcXVpdmFsZW50IHRvCisJbWlwcy1pZHQtZWNvZmYuCisJKiBtcHctZXBwY21hY29zLmM6IFJlbmFtZSB0byBzaG9ydGVyIG1wdy1lcHBjbWFjLmMuCisJKiBtcHctbGQucjogQWRkIHZlcnNpb24gcmVzb3VyY2VzLgorCShjZnJnKTogVXNlIHN5bWJvbGljIGluc3RlYWQgb2YgbGl0ZXJhbCBuYW1lIGZvciBleGVjdXRhYmxlLgorCitNb24gRGVjIDExIDE1OjEzOjQxIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYyAoRklOSSk6IE1vdmVkIHRoZSAucmVsb2Mgc2VjdGlvbi4KKworV2VkIERlYyAgNiAxNDozMzo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAocHJpbnRfc3RhdGVtZW50eyxzfSk6IERlbGV0ZSBkdXBsaWNhdGUgcHJvdG90eXBlLgorCShwcmludF9zdGF0ZW1lbnRfbGlzdCk6IFJlbmFtZWQgZnJvbSBwcmludF9zdGF0ZW1lbnQuICBBbGwgY2FsbGVycworCXVwZGF0ZWQuCisJKHByaW50X3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbiB0byBwcmludCBqdXN0IG9uZSBzdGF0ZW1lbnQuCisJKHByaW50X3tkYXRhLHJlbG9jLHBhZGRpbmd9X3N0YXRlbWVudCk6IERvbid0IGNyYXNoIGlmCisJb3V0cHV0X3NlY3Rpb24gPT0gTlVMTC4KKwkoZHByaW50X3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbi4KKworCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGaXgKKwljYWxsIHRvIHNvcnRfc2VjdGlvbnMuCisKK1dlZCBEZWMgIDYgMTQ6NTk6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvYWl4LmVtICh1bml4X2xkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZSAtdW5peC4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZiB1bml4X2xkLCBwYXNzCisJZ2MgYXMgZmFsc2UgYW5kIGV4cG9ydF9kZWZpbmVkcyBhcyB0cnVlIHRvIHNpemVfZHluYW1pY19zZWN0aW9ucy4KKworCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IFBlcm1pdCBhc3NpZ25tZW50cyB0byBkb3QgaW4gdGhlIGZpbmFsCisJcGhhc2UgaWYgdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBhYnNfb3V0cHV0X3NlY3Rpb24uCisKKworVHVlIERlYyAgNSAwOTo0OTozOSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEZpeCBjYWxsCisJdG8gc29ydF9zZWN0aW9ucy4KKworRnJpIERlYyAgMSAxNjo0ODozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZ3JhbS55IChQSERSUyk6IE5ldyB0b2tlbi4KKwkoaWZpbGVfcDEpOiBBY2NlcHQgcGhkcnMuCisJKHNlY3Rpb24pOiBBY2NlcHQgcGhkcl9vcHQgYXQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uLgorCShwaGRyX29wKTogTmV3IG5vbnRlcm1pbmFsLgorCShwaGRycywgcGhkcl9saXN0LCBwaGRyLCBwaGRyX3R5cGUsIG9wdF9oZHJzLCBoZHIpOiBMaWtld2lzZS4KKwkqIGxkbGV4Lmw6IEFjY2VwdCBQSERSUy4KKwkqIGxkbGFuZy5oIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QpOiBEZWZpbmUuCisJKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBBZGQgcGhkcnMgZmllbGQuCisJKHN0cnVjdCBsYW5nX3BoZHIpOiBEZWZpbmUuCisJKExBTkdfUEhEUl9GSUxFSERSLCBMQU5HX1BIRFJfUEhEUlMpOiBEZWZpbmUuCisJKGxhbmdfbmV3X3BoZHIpOiBEZWNsYXJlLgorCSogbGRsYW5nLmMgKGxhbmdfcGhkcl9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogSW5pdGlhbGl6ZSBwaGRycyBmaWVsZC4KKwkobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX3JlY29yZF9waGRycy4KKwkobGFuZ19uZXdfcGhkcik6IE5ldyBmdW5jdGlvbi4KKwkobGFuZ19zZWN0aW9uX2luX3BoZHIpOiBOZXcgZnVuY3Rpb24uCisJKGxhbmdfcmVjb3JkX3BoZHJzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkqIGxkLnRleGluZm86IERvY3VtZW50IFBIRFJTLgorCitUaHUgTm92IDMwIDEzOjE0OjMwIDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYzogTW92ZWQgLmVkYXRhIGludG8gaXRzIG93biBzZWN0aW9uIHRvCisJZXhwb3NlIGl0LgorCitUaHUgTm92IDMwIDExOjMyOjM0IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgorCisJKiBjb25maWd1cmUuaG9zdCAobTY4Ki1tb3Rvcm9sYS1zeXN2KTogRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQKKwlIT1NUSU5HX0xJQlMgZm9yIHRlc3RpbmcuCisJKG04OCotbW90b3JvbGEtc3lzdjMpOiBEZWZpbmUgSE9TVElOR19DUlQwIGFuZCBIT1NUSU5HX0xJQlMgZm9yCisJdGVzdGluZy4KKworVHVlIE5vdiAyOCAxMjoxNDo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogU2V0IGNvbmZpZy5keW5hbWljX2xpbmsgdG8gZmFsc2UgZm9yIC1OCisJYW5kIC1uLgorCitNb24gTm92IDI3IDEzOjEyOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi43LgorCitGcmkgTm92IDI0IDE4OjM1OjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBUd28gLmp1bmsncyBpcyB0b28gbXVjaCBqdW5rLgorCitUdWUgTm92IDIxIDE2OjE0OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCisJKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl9GUkVFIGluIEBUT1BAIHNlY3Rpb24uCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KKworCSogbGRtYWluLmMgKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogRG9uJ3Qgd2FybiBhYm91dCBCRkRfUkVMT0NfQ1RPUgorCWJlaW5nIHVuc3VwcG9ydGVkIGlmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmsgYW5kIHRoZSBpbnB1dAorCUJGRCBzdXBwb3J0cyBpdCwgc2luY2UgbGRjdG9yX2J1aWxkX3NldHMgY2FuIGNvcGUgd2l0aCB0aGF0IGNhc2UuCisKK0ZyaSBOb3YgMTcgMTY6MjM6MTUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbWFjb3MqKTogTmV3IHRhcmdldC4KKwkqIGVtdWxwYXJhbXMvcHBjbWFjb3Muc2g6IE5ldyBmaWxlLCBQb3dlck1hYyBlbXVsYXRpb24uCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXBwY21hY29zLm8uCisJKGVwcGNtYWNvcy5jKTogTmV3IHRhcmdldC4KKwkqIG1wdy1lcHBjbWFjb3MuYzogVXBkYXRlLgorCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBhdHRlbXB0cyB0byB1c2Uge0dFTlNDUklQVFN9LgorCitGcmkgTm92IDE3IDEwOjM3OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgQGhvc3RAIGFuZCBAdGFyZ2V0QCwgbm90CisJJChob3N0X2Nhbm9uaWNhbCkgYW5kICQodGFyZ2V0X2Nhbm9uaWNhbCkuCisJKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCisKK1RodSBOb3YgMTYgMTE6MjM6NDIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvcGUuc2MgKC5lbmRqdW5rKTogTW92ZSBkZWZpbml0aW9uIG9mIGBlbmQnIHRvIGhlcmUKKwlzbyB0aGUgbWFsbG9jIGhlYXAgYmVnaW5zIGF0IGEgc2FuZSBwbGFjZS4KKworVGh1IE5vdiAxNiAwMzowOTozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCVZlcnNpb24gMi42IHJlbGVhc2VkLgorCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlIHRvIDIuNi4KKworCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogRGVsZXRlIGxkZW11bC1saXN0LmggaGVyZSwgYnV0IG5vdAorCSQoR0VORVJBVEVEXypGSUxFUyksIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZXRhaW5lZCBieSBkaXN0Y2xlYW4uCisJKG1haW50YWluZXItY2xlYW4sIHJlYWxjbGVhbik6IERlbGV0ZSB0aGVtIGhlcmUuCisKK1R1ZSBOb3YgMTQgMTc6MDg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogT3BlbiB0aGUKKwliYXNlIGZpbGUgd2l0aCBGT1BFTl9XQiwgbm90ICJ3Ii4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogVXNlIHRoZQorCWVudmlyb25tZW50IHZhcmlhYmxlIExEX1JVTl9QQVRIIGlmIG5laXRoZXIgLXJwYXRoIG5vciAtcnBhdGgtbGluaworCXdlcmUgdXNlZC4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBVc2UgdGhlIGVudmlyb25tZW50CisJdmFyaWFibGUgTERfUlVOX1BBVEggaWYgLXJwYXRoIHdhcyBub3QgdXNlZC4KKwkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IExEX1JVTl9QQVRILgorCitUaHUgTm92ICA5IDEzOjA5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IFJlY29nbml6ZQorCS1ibCBhbmQgLWJsb2FkbWFwIG9wdGlvbnMuCisKKwkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogSWYgYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0LAorCXJlcG9ydCBhIGJldHRlciBlcnJvci4KKworCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQKKwluZXcgbG9jYWwgdmFyaWFibGUgc3BlY2lhbF9zZWN0aW9ucywgYW5kIHBhc3MgaXQgdG8KKwlzaXplX2R5bmFtaWNfc2VjdGlvbnMuICBMb29rIHRocm91Z2ggdGhlIHJlc3VsdHMsIGFuZCBtb3ZlIHRoZQorCXNlY3Rpb25zIGFyb3VuZCBpbiB0aGUgbWFwcGluZyBzbyB0aGF0IHRoZXkgYXJlIGRlZmluZWQgY29ycmVjdGx5LgorCitXZWQgTm92ICA4IDExOjQwOjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRlbXVsLmMgKGxkZW11bF9kZWZhdWx0X3RhcmdldCk6IENhc3QgZ2V0ZW52IHJldHVybiB2YWx1ZS4KKworVHVlIE5vdiAgNyAxMToxNTozNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9wcGNwZS5zaCAoQVJDSCk6IE5ldyBmaWxlIGZvciBQb3dlclBDIFBvcnRhYmxlCisJRXhlY3V0YWJsZSBzdXBwb3J0LgorCSogc2NyaXB0dGVtcGwvcHBjcGUuc2M6IE5ldyBmaWxlIGZvciBQb3dlclBDIFBvcnRhYmxlIEV4ZWN1dGFibGUKKwlzdXBwb3J0LgorCisJKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkZWQgcG93ZXJwY2xlLXBlIHRhcmdldC4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVwcGNwZS5vIHRhcmdldC4KKworCSogZW11bHRlbXBsL3BlLmVtIChUQVJHRVRfSVNfcHBjcGUpOiBmaWxlIHRhaWxvcmluZyBtYWNybworCShnbGRfJF9iZWZvcmVfYWxsb2NhdGlvbik6IGFkZGVkIGhvb2tzIGZvciB0b2MgY29uc3RydWN0aW9uIGJhc2VkCisJb24gdGhlIGFib3ZlIG1hY3JvLgorCitUdWUgTm92ICA3IDExOjQ3OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQudGV4aW5mbzogVGhlIGxpbmtlciBkb2VzIG5vdCB1c2UgX21haW4gYXMgYW4gZW50cnkgcG9pbnQuCisKK1R1ZSBOb3YgIDcgMTE6NDY6MTEgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2MgKC5kYXRhKTogQ2FsY3VsYXRlIG5leHQgYm91bmRhcnkgbW9kdWxvCisJMHgyMDAwIG5vdCAweDIwMC4KKworTW9uIE5vdiAgNiAxMDo1OToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHRlc3QgZm9yIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkLgorCSogc3lzZGVwLmg6IERlY2xhcmUgZnJlZSBpZiBuZWNlc3NhcnkuICBJbmNsdWRlICJhbnNpZGVjbC5oIi4KKwkqIGFjY29uZmlnLmg6IEV4cGxhaW4gTkVFRF9ERUNMQVJBVElPTl9GUkVFLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVGFrZSBCOjogb3V0IG9mIHNob3J0b3B0cy4KKworU3VuIE5vdiAgNSAwMzowODoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9pMzg2bmJzZC5zaCAoRVhFQ1VUQUJMRV9TWU1CT0xTKTogU2V0IF9fRFlOQU1JQyB0byAwCisJZm9yIG5vdywgYXMgd2l0aCBtNjhrNGtic2QsIHVudGlsIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZ2V0cworCWRvbmUuCisKKwkqIGNvbmZpZ3VyZS5ob3N0OiBGb3IgaTM4NiBCU0QgdmFyaWFudHMsIGNydDAubyBsaXZlcyBpbgorCS91c3IvbGliLiAgKFRydWUgZm9yIE5ldEJTRCBhdCBsZWFzdCwgdW5jb25maXJtZWQgZm9yIG90aGVycy4pCisKK1dlZCBOb3YgIDEgMTU6NDI6NDUgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+CisKKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZGVsdGE2OC5vLgorCShlZGVsdGE2OC5jKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS50Z3QgKG02OCotbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgorCSogZW11bHBhcmFtcy9kZWx0YTY4LnNoOiBOZXcgZmlsZS4KKwkqIHNjcmlwdHRlbXBsL2RlbHRhNjguc2M6IE5ldyBmaWxlLgorCisJKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBIYW5kbGUgLmluaXQgYW5kIC5maW5pLiAgQ2hhbmdlIHNlY3Rpb24KKwlhZGRyZXNzZXMuCisKK1dlZCBOb3YgIDEgMTE6NDE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9jb21tYW5kKTogQWNjZXB0ICcsJyBhcyB3ZWxsIGFzICc9JyBpbgorCUFMSUdOIGFuZCBBTElHTk1PRCBzdGF0ZW1lbnRzLgorCisJKiBlbXVsdGVtcGwvYWl4LmVtOiBJbmNsdWRlIGxkZ3JhbS5oLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSGFuZGxlIC1wRCBhbmQgLXBULCBhcyB1c2VkIG9uCisJQUlYIDQuMS4KKwkqIE1ha2VmaWxlLmluICgkKEVNVUxBVElPTl9PRklMRVMpKTogRGVwZW5kIHVwb24gbGRncmFtLmguCisKK1R1ZSBPY3QgMzEgMTg6MjI6MjQgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KKworCSogY29uZmlndXJlLmhvc3QgKGFscGhhLSotbGludXgqKTogTmV3IGhvc3QuCisJKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCisKK1R1ZSBPY3QgMzEgMTI6MzY6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvYWl4LmVtIChleHBvcnRfZmlsZXMpOiBSZW1vdmUuCisJKGltcG9ydF9maWxlcyk6IE1ha2Ugc3RhdGljLgorCShzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0KTogRGVmaW5lLgorCShleHBvcnRfc3ltYm9scyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBIYW5kbGUgYW4gaW5pdGlhbCAtYiBvcHRpb24KKwljb3JyZWN0bHkuICBDYWxsIHJlYWRfZmlsZSBmb3IgYW4gZXhwb3J0IGZpbGUuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbAorCWJmZF94Y29mZl9leHBvcnRfc3ltYm9sIGZvciBlYWNoIGV4cG9ydCBzeW1ib2wsIHJhdGhlciB0aGFuCisJY2FsbGluZyByZWFkX2ZpbGUgZm9yIGVhY2ggZXhwb3J0IGZpbGUuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IEZvciBhbiBleHBvcnQgZmlsZSwgbWFrZSB0aGUKKwlleHBvcnRlZCBzeW1ib2xzIHVuZGVmaW5lZCwgYW5kIHN0b3JlIHRoZW0gb24gdGhlIGV4cG9ydF9zeW1ib2xzCisJbGlzdC4KKworU2F0IE9jdCAyOCAwMDoxMDowMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKToKKwlEb24ndCBoYW5nIGlmIGxhc3Qgb3B0aW9uIGlzIHVucmVjb2duaXNlZC4KKwkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogSW5zZXJ0IGNyZWF0ZWQKKwlzeW1ib2xzIGludG8gQUJTIG91dHB1dCBzZWN0aW9uLgorCitGcmkgT2N0IDI3IDE4OjAzOjE3IDE5OTUgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+CisKKwkqICBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTmV0QlNECisJbTY4azRrIGFyY2guCisJKGVtNjhrNGtuYnNkLmMpOiBOZXcgcnVsZS4KKworCSogY29uZmlndXJlLnRndDogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIE5ldEJTRCBtNjhrNGsgYXJjaC4KKworCSogZ2Vuc2NyaXB0cy5zaCwgbGRpbnQudGV4aW5mbywKKwllbXVscGFyYW1zL3thMjlrLGFybWFvdXRiLGFybWFvdXRsLGNvZmZfc3BhcmMsZWJtb24yOWssZ2xkOTYwLAorCWdsZDk2MGNvZmYsZ28zMixoODMwMCxoODMwMGgsaDg1MDAsaDg1MDBiLGg4NTAwYyxoODUwMG0saDg1MDBzLAorCWhwMzAwYnNkLGhwM2hwdXgsaHBwYWVsZi5zaCxpMzg2YW91dCxpMzg2YnNkLGkzODZjb2ZmLGkzODZnbzMyLAorCWkzODZsaW51eCxpMzg2bHlueCxpMzg2bmJzZCxsbms5NjAsbTY4a2FvdXQsbTY4a2NvZmYsbTY4a2x5bngsCisJbTg4a2JjcyxtaXBzYmlnLG1pcHNic2QsbWlwc2lkdCxtaXBzaWR0bCxtaXBzbGl0LG5ld3MsbnMzMmtuYnNkLAorCXBjNTMybWFjaGFvdXQscmlzY2l4LHNhMjkyMDAsc2gsc2hsLHNwYXJjbHlueCxzcGFyY25ic2QsCisJc3QyMDAwLHN1bjMsc3VuNCx2YW5pbGxhLHZheCx2c3RhLHc2NSx6ODAwMSx6ODAwMn0uc2g6IENoYW5nZWQKKwlQQUdFX1NJWkUgdG8gVEFSR0VUX1BBR0VfU0laRS4KKworCSogZW11bHBhcmFtcy9tNjhrbmJzZC5oOiBEaXR0by4KKwkoVEVYVF9TVEFSVF9BRERSLCBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBXZSBoYXZlIDhLIHBhZ2VzaXplLgorCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBIYXJkY29kZSBfX0RZTkFNSUMgdG8gemVybyBmb3IgdGhlIHRpbWUKKwliZWluZy4KKworCSogZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoOiBOZXcgZmlsZS4KKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRXhwYW5kIEVYRUNVVEFCTEVfU1lNQk9MUyBpZiByZWxvY2F0aW5nLgorCitGcmkgT2N0IDI3IDE3OjU5OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2FpeC5lbTogSW5jbHVkZSBsZGN0b3IuaC4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbCBmaW5kX3JlbG9jcy4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIG5ldyBhZnRlcl9vcGVuIGZ1bmN0aW9uLgorCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBVc2UgQ09OU1RSVUNUT1JTIGluIC5kYXRhLgorCSogbGRjdG9yLmMgKHN0cnVjdCBzZXRfaW5mbyk6IE1vdmUgZGVmaW5pdGlvbiBpbnRvIGxkY3Rvci5oLgorCShzdHJ1Y3Qgc2V0X2VsZW1lbnQpOiBMaWtld2lzZS4KKwkoc2V0cyk6IE1ha2Ugbm9uLXN0YXRpYy4KKwkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgbmFtZSBwYXJhbWV0ZXIuICBTYXZlIGl0IGluIHRoZSBuZXcKKwlzZXQgZWxlbWVudC4KKwkobGRjdG9yX2J1aWxkX3NldHMpOiBBdm9pZCBiZWluZyBjYWxsZWQgdHdpY2UuICBQYXNzIHNldCBlbGVtZW50CisJbmFtZSB0byBsYW5nX2FkZF9yZWxvYy4KKwkqIGxkY3Rvci5oIChzdHJ1Y3Qgc2V0X2luZm8pOiBNb3ZlIGRlZmluaXRpb24gaGVyZSBmcm9tIGxkY3Rvci5jLgorCShzdHJ1Y3Qgc2V0X2VsZW1lbnQpOiBMaWtld2lzZS4gIEFkZCBuZXcgZmllbGQgbmFtZS4KKwkoc2V0cyk6IERlY2xhcmUuCisJKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRGVjbGFyZSBuZXcgbmFtZSBwYXJhbWV0ZXIuCisJKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBEb24ndCBpbnNpc3QgdGhhdCBlaXRoZXIgbmFtZSBvcgorCXNlY3Rpb24gYmUgTlVMTCBpbiBhIGxhbmdfcmVsb2Nfc3RhdGVtZW50LgorCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBQYXNzIE5VTEwgdG8gbGRjdG9yX2FkZF9uZXdfc2V0X2VudHJ5IGZvcgorCW5ldyBuYW1lIHBhcmFtZXRlci4KKwkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBQYXNzIG5hbWUgdG8gbGRjdG9yX2FkZF9uZXdfc2V0X2VudHJ5IGZvcgorCW5ldyBuYW1lIHBhcmFtZXRlci4KKworCSogbGRtaXNjLmMgKGRlbWFuZ2xlKTogRml4IGluZGVudGF0aW9uLiAgUmVtb3ZlIGEgbGVhZGluZyBwZXJpb2QuCisKK1RodSBPY3QgMjYgMjI6MjI6NDkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluOiBBZGQgUG93ZXJNYWMgdGFyZ2V0IHN1cHBvcnQsIGdlbmVyYXRlIGNvbmZpZy5oLgorCSogbWFjLWxkLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2VzLgorCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgZWRpdHMgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgorCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KKwkqIG1wdy1lcHBjbWFjb3MuYzogUHJlYnVpbHQgdmVyc2lvbiBvZiBQb3dlck1hYyBsaW5raW5nIHNjcmlwdC4KKworVGh1IE9jdCAyNiAxNDoxMToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBUcmVhdAorCS1zdGF0aWMgYXMgYSBzeW5vbnltIGZvciAtYm5zby4KKworCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBNb3ZlIHNwZWNpYWwgc3ltYm9scyBpbnNpZGUgc2VjdGlvbnMuCisJQWx3YXlzIHN0YXJ0IC5kYXRhIGF0IDAuCisKK1dlZCBPY3QgMjUgMTE6NTI6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0c3R1ZmYpOiAgQWxzbyBtYWtlIGluZm8uCisJKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gZGVsZXRlICouaW5mbyouCisKK1dlZCBPY3QgMjUgMTE6Mjc6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvYWl4LmVtOiBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBBSVggbGlua2VyIG9wdGlvbnMsCisJZm9yIEFJWCBpbXBvcnQgYW5kIGV4cG9ydCBmaWxlcywgYW5kIGZvciBBSVggc2hhcmVkIG9iamVjdHMuCisJKiBzY3JpcHR0ZW1wbC9haXguc2M6IEFkZCAucGFkLiAgUHV0IC5kcyBqdXN0IGJlZm9yZSB0aGUgVE9DLgorCisJKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbmV3IGZpZWxkIGxpbmtfaW5mby5zdGF0aWNfbGluay4KKworCSogbGRtYWluLmMgKGFkZF9rZWVwc3ltc19maWxlKTogQWRkIFxuIGF0IGVuZCBvZiBlaW5mbyBjYWxscy4KKwkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBMaWtld2lzZS4KKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBMaWtld2lzZS4KKwkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IExpa2V3aXNlLgorCisJKiBsZC50ZXhpbmZvOiBUaGUgTVJJIEFMSUdOIGRpcmVjdGl2ZSBpcyBzdXBwb3J0ZWQuCisKK01vbiBPY3QgMjMgMTE6NDY6NDMgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+CisKKwkqIGVtdWxwYXJhbXMvZWxmMzJ2cjQzMDAuc2g6IERlbGV0ZWQuCisJKiBlbXVscGFyYW1zL2VsZjMydnI0MzAwZWwuc2g6IERlbGV0ZWQuCisJKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2g6IEFkZGVkLgorCSogZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoOiBBZGRlZC4KKwkqIGNvbmZpZ3VyZS50Z3QsIE1ha2VmaWxlLmluOiBVcGRhdGVkIHRoZSBidWlsZCB0byB1c2UgdGhlCisgCW5ldyA4LjMgdW5pcXVlIG5hbWVzLgorCitUaHUgT2N0IDE5IDE3OjQxOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGVudHJ5X3N5bWJvbCk6IE1ha2Ugbm9uLXN0YXRpYy4KKwkqIGxkbGFuZy5oIChlbnRyeV9zeW1ib2wpOiBEZWNsYXJlLgorCisJKiBsZGxleC5sOiBUcmVhdCBQUk9WSURFIGFzIGEga2V5d29yZCBpbiBleHByZXNzaW9uIHN0YXRlLgorCitXZWQgT2N0IDE4IDE3OjM0OjA2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjICguYnNzKTogTW92ZSB0byBiZSBhZnRlciAudGV4dAorCitUdWUgT2N0IDE3IDEyOjIyOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKKwlTZWFyY2ggdHJpbmFyeS5jb25kIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0cmluYXJ5LmxocyB0d2ljZS4gIEZyb20KKwlsaW5saUBpaHAuUEh5cy5ldGh6LkNILgorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBNb3ZlCisJZGlyZWN0b3J5IHNlYXJjaGluZyBjb2RlIGludG8gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpci4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGV4dHJhY3RlZAorCWZyb20gZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zby4KKwkoZ2xvYmFsX25lZWRlZCwgZ2xvYmFsX2ZvdW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSBuZXcgYWZ0ZXJfb3BlbiBmdW5jdGlvbi4KKwkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLXJwYXRoLWxpbmsgb24gU3VuT1MuCisKKwkqIE1ha2VmaWxlLmluIChlZWxmMzJwcGMuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QgZ2VuZXJpYy5lbS4KKwkoZWVsZjMybHBwYy5jKTogTGlrZXdpc2UuCisJKiBlbXVscGFyYW1zL2VsZjMybHBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KKwkoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lIGFzIHllcy4KKworTW9uIE9jdCAxNiAxOToxMToxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogU3RydWN0IGJmZF9lbGZfbGlua19uZWVkZWRfbGlzdCBpcyBub3cgbmFtZWQKKwliZmRfbGlua19uZWVkZWQtbGlzdDsgbWFrZSBhcHByb3ByaWF0ZSBjaGFuZ2VzLgorCisJKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSBhaXhwcGMuCisJKHJzNjAwMC0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgYWl4cnM2LgorCSogZW11bHBhcmFtcy9haXhwcGMuc2gsIGVtdWxwYXJhbXMvYWl4cnM2LnNoOiBOZXcgZmlsZXMuCisJKiBlbXVsdGVtcGwvYWl4LmVtOiBOZXcgZmlsZS4KKwkqIHNjcmlwdHRlbXBsL2FpeC5zYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFpeHBwYy5vIGFuZCBlYWl4cnM2Lm8uCisJKGVhaXhwcGMuYywgZWFpeHJzNi5jKTogTmV3IHRhcmdldHMuCisKK0ZyaSBPY3QgMTMgMTQ6MDA6MzcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcC9wZS5zYyAoLnJlbG9jKTogTW92ZSB0byB0aGUgZW5kLgorCitUdWUgT2N0IDEwIDE3OjUzOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogRG9uJ3QgdHJ5IHRvIHVzZSBhbiBlbnRyeV9zeW1ib2wgZnJvbSBhCisJc2VjdGlvbiB3aGljaCB3YXMgbm90IGxpbmtlZCBpbnRvIHRoZSBmaW5hbCBvdXRwdXQuCisKK1R1ZSBPY3QgMTAgMTA6MTc6MjIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEZpeAorCWZhdGFsIHR5cG9zLgorCitUdWUgT2N0IDEwIDAxOjAxOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQuaCAoYXJnc190eXBlKTogQWRkIHJwYXRoX2xpbmsgZmllbGQuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBTZWFyY2ggZm9yCisJcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGluIHJwYXRoX2xpbmsgcGF0aC4gIE9ubHkgc2VhcmNoCisJTERfTElCUkFSWV9QQVRIIHdoZW4gY29uZmlndXJlZCBuYXRpdmUuCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtcnBhdGgtbGluay4KKwkqIGxkLjEsIGxkLnRleGluZm86IERvY3VtZW50IC1ycGF0aC1saW5rLgorCitTYXQgT2N0ICA3IDE3OjA3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogRG9uJ3QKKwlib3RoZXIgc2VhcmNoaW5nIGZvciBuZWVkZWQgbGlicmFyaWVzIHVubGVzcyBkb2luZyBhIGZpbmFsIGxpbmsuCisKK0ZyaSBPY3QgIDYgMTY6MjY6MTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBsZC9sZC4xOiBGaXggZm9ybWF0dGluZyBidWdzLgorCitXZWQgT2N0ICA0IDE3OjM3OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRleHAuYyAoZXhwX2dldF9hYnNfaW50KTogUmV0dXJuIGJmZF92bWEsIG5vdCBpbnQuCisJKiBsZGV4cC5oIChleHBfZ2V0X2Fic19pbnQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogVXNlIGZwcmludGZfdm1hIHRvCisJcHJpbnQgcmV0dXJuIHZhbHVlIG9mIGV4cF9nZXRfYWJzX2ludC4KKworTW9uIE9jdCAgMiAxMzo1NjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xvYmFsX3N0YXQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBDYWxsIHN0YXRfbmVlZGVkIHRvIG1ha2Ugc3VyZQorCXRoYXQgdGhlIGZpbGUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgdW5kZXIgYW5vdGhlciBuYW1lLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisKK0ZyaSBTZXAgMjkgMTI6MDA6MTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjOiBTdGFydCAudGV4dCBhdCAweDgwMDAuCisJU3RhcnQgLmRhdGEgYXQgMHg0MDAwMC4KKworRnJpIFNlcCAyOSAxMTowOTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBJZgorCWNvbW1hbmRfbGluZS5ycGF0aCBpcyBzZXQsIHVzZSBpdCwgcmF0aGVyIHRoYW4gdGhlIC1MIG9wdGlvbnMsIHRvCisJYnVpbGQgdGhlIHJ1bGVzIHNlY3Rpb24uCisJKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB0aGlzIHVzZSBvZiAtcnBhdGguCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRG9uJ3Qgc2V0IGxpbmtfaW5mby5zaGFyZWQgZm9yIC1hc3NlcnQKKwlwdXJlLXRleHQuICBQYXNzIHRydWUsIG5vdCAxLCB0byBsYW5nX2FkZF9lbnRyeS4KKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZmluZF9hc3NpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShmb3VuZF9hc3NpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFJlbmFtZSBsb2NhbCBoIHRvIGhkeW4uCisJSWYgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBubyBzdGFydCBzeW1ib2wgd2FzIHNwZWNpZmllZCBvbgorCXRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGVyZSBhcmUgYW55IHVuZGVmaW5lZCBzeW1ib2xzLCBzZXQKKwlsaW5rX2luZm8uc2hhcmVkLiAgSWYgbGlua19pbmZvLnNoYXJlZCBpcyBzZXQsIHNldCB0aGUgYWRkcmVzcyBvZgorCXRoZSAudGV4dCBzZWN0aW9uIHRvIDB4MjAuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk6IFJlbmFtZSBmcm9tCisJZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudC4gIElmIGZpbmRfYXNzaWduIGlzCisJc2V0LCB0aGVuIGp1c3Qgc2V0IGZvdW5kX2Fzc2lnbiBiYXNlZCBvbiB3aGV0aGVyIGFuIGFzc2lnbm1lbnQgaXMKKwlmb3VuZCB0byBmaW5kX2Fzc2lnbi4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCk6IERvbid0IHVzZSBhIHNwZWNpYWwgc2NyaXB0IHdoZW4KKwlwcm9kdWNpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogUmVtb3ZlLgorCSogc2NyaXB0dGVtcGwvYW91dC5zYzogUmVtb3ZlIENSRUFURV9TSExJQiB0ZXN0cy4KKwkqIGxkbGFuZy5jIChlbnRyeV9mcm9tX2NtZGxpbmUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBjbWRsaW5lIHBhcmFtZXRlciBmcm9tIGludCB0byBib29sZWFuLgorCVVzZSBnbG9iYWwgZW50cnlfZnJvbV9jbWRsaW5lIHJhdGhlciB0aGFuIGZ1bmN0aW9uIHN0YXRpYworCWZyb21fY21kbGluZS4KKwkqIGxkbGFuZy5oIChlbnRyeV9mcm9tX2NtZGxpbmUpOiBEZWNsYXJlLgorCShsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiBzZWNvbmQgcGFyYW1ldGVyIGZyb20gaW50CisJdG8gYm9vbGVhbi4KKwkqIGxkZ3JhbS55OiBQYXNzIGZhbHNlLCBub3QgMCwgdG8gbGFuZ19hZGRfZW50cnkuCisKK1RodSBTZXAgMjggMTI6MzQ6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC5oIChwYXJzaW5nX2RlZnN5bSk6IERlY2xhcmUuCisJKiBsZGxleC5oIChsZXhfc3RyaW5nKTogRGVjbGFyZS4KKwkqIGxkbGV4LmwgKGxleF9zdHJpbmcpOiBEZWZpbmUuCisJKiBsZXhzdXAuYyAocGFyc2luZ19kZWZzeW0pOiBEZWZpbmUuCisJKHBhcnNlX2FyZ3MpOiBJbiBPUFRJT05fREVGU1lNIGNhc2UsIHNldCBsZXhfc3RyaW5nIGJlZm9yZSBjYWxsaW5nCisJbGV4X3JlZGlyZWN0LCBhbmQgY2xlYXIgaXQgYWZ0ZXIgY2FsbGluZyB5eXBhcnNlLiAgU2V0CisJcGFyc2luZ19kZWZzeW0gYXJvdW5kIGNhbGwgdG8geXlwYXJzZS4KKwkqIGxkbWFpbi5jIChtYWluKTogU2V0IGxleF9zdHJpbmcgYmVmb3JlIGNhbGxpbmcgbGV4X3JlZGlyZWN0LCBhbmQKKwljbGVhciBpdCBhZnRlciBjYWxsaW5nIHl5cGFyc2UuCisJKiBsZG1pc2MuYyAodmZpbmZvKTogRm9yICVTLCBoYW5kbGUgLS1kZWZzeW0gYXJndW1lbnRzIGFuZCBidWlsdAorCWluIGxpbmtlciBzY3JpcHRzIGNvcnJlY3RseS4KKworCSogc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBBZGQgLmN0b3JzLy5kdG9ycyBoYW5kbGluZyBsaWtlIG90aGVyCisJQ09GRiB0YXJnZXRzLCBhbGxvd2luZyBmb3IgdGhlIGxlYWRpbmcgdW5kZXJzY29yZSB1c2VkIG9uIFNQQVJDCisJQ09GRi4KKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLWFzc2VydC4KKwkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgorCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KTogVXNlIHRoZQorCXNoYXJlZCBsaWJyYXJ5IHNjcmlwdCB3aGVuIGFwcHJvcHJpYXRlLgorCSogc2NyaXB0dGVtcGwvYW91dC5zYzogSWYgQ1JFQVRFX1NITElCIGlzIHNldCwgc3RhcnQgdGhlIC50ZXh0CisJc2VjdGlvbiBhdCBTSVpFT0ZfSEVBREVSUy4KKworVGh1IFNlcCAyOCAwMTo0MDozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGRlbmViLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChlYXJtY29mZi5jKTogQnVpbGQuCisJKiBjb25maWd1cmUudGd0IChhcm0tKi1jb2ZmKTogTmV3IHRhcmdldAorCSogZW11bHBhcm1zL2FybWNvZmYuc2g6IE5ldyBmaWxlLgorCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogTmV3IGZpbGUuCisKK1R1ZSBTZXAgMjYgMTA6NTk6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogUmVtb3ZlIC5kYXRhMjsgbm8gbG9uZ2VyIG5lZWRlZC4KKworRnJpIFNlcCAyMiAxODowOTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZmlsZS5jIChsZGZpbGVfc2V0X291dHB1dF9hcmNoKTogTWFrZSBhcmNoIGNvbnN0LgorCitUaHUgU2VwIDIxIDE3OjU1OjI0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBDb3JyZWN0bHkgbG9jYXRlIF9fYnNzX3N0YXJ0IGF0IHRoZQorCWJlZ2lubmluZyBvZiB0aGUgLmJzcyBhcmVhLCBub3QgYXQgdGhlIGVuZCBvZiBkYXRhLiAgQWRkCisJX19zYnNzX3tzdGFydCxlbmR9IHN5bWJvbHMuCisKK1dlZCBTZXAgMjAgMTI6Mjk6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFF1b3RlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkuCisJKENYWF9GT1JfVEFSR0VULCBpbnN0YWxsKTogTGlrZXdpc2UuCisKK01vbiBTZXAgMTggMTQ6NTM6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJQmFzZWQgb24gcGF0Y2hlcyBieSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46CisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IFJlbW92ZSBicm9rZW5zZWQgc3R1ZmYuCisJKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCisJKGluc3RhbGwpOiBMaWtld2lzZS4KKwkoR0VORVJBVEVEX0hGSUxFUyk6IFJlbW92ZSBjb25maWcuaC4KKwkoLmRlcCk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgorCitNb24gU2VwIDE4IDE0OjM5OjM4IDE5OTUgIEFybmUgSC4gSnV1bCAgPGFybmVqQHB2di51bml0Lm5vPgorCisJKiBjb25maWd1cmUudGd0IChtaXBzKi1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCisKK0ZyaSBTZXAgMTUgMjA6MDE6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0IChtODgqLSotZGd1eCopOiBGaXggYW5vdGhlciBzaGVsbCBzeW50YXggZXJyb3IuCisKK0ZyaSBTZXAgMTUgMjM6Mjg6MDUgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWJzZCopOiBGaXggc2hlbGwgc3ludGF4IGVycm9yLgorCitUaHUgU2VwIDEyIDEyOjUwOjQ5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXAvcGUuc2M6ICBBbGxvdyBib3RoIHNwZWxsaW5ncyBvZiAuY3RvcnMvLmR0b3JzLgorCVN0YXJ0IC50ZXh0IHNlY3Rpb24gb24gdGhlIHJpZ2h0IGJvdW5kYXJ5LiBBbHdheXMgYWxpZ24KKwlzdGFicy4KKworVHVlIFNlcCAxMiAxMjoyNDoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KKworCSogbGRtYWluLmMgKHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8pOiBEZWZpbmUuCisJKHdhcm5pbmdfY2FsbGJhY2spOiBBZGQgbmV3IHBhcmFtZXRlciBzeW1ib2wuICBDYWxsCisJd2FybmluZ19maW5kX3JlbG9jIHRvIHRyeSB0byBmaW5kIHRoZSBzZWN0aW9uIGFuZCBWTUEuCisJKHdhcm5pbmdfZmluZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKKwlQYXNzIE5VTEwgYXMgc3ltYm9sIHBhcmFtZXRlciB0byB3YXJuaW5nIGNhbGxiYWNrLgorCisJKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IC1MIG9wdGlvbi4KKworCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCisJKHRvcG93ZXIpOiBMaWtld2lzZS4gIEFsc28sIHJlaW5kZW50LgorCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgorCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IEFkZAorCWNhc3QgdG8gYXZvaWQgd2FybmluZy4KKworRnJpIFNlcCAgOCAxNjozMjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogRGVwZW5kIHVwb24gY29uZmlndXJlLnRndC4KKworCSogbGRlbXVsLmggKGxkZW11bF9zZXRfc3ltYm9scyk6IERlY2xhcmUuCisJKGxkZW11bF9wYXJzZV9hcmdzKTogRGVjbGFyZS4KKwkqIGxkZW11bC5jIChsZGVtdWxfcGFyc2VfYXJncyk6IEZpeCBpbmRlbnRhdGlvbi4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9ESVJFTlQuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogVXNlIGF1dG9jb25mIHJlY29tbWVuZCBtZWNoYW5pc20gdG8gZGVmaW5lCisJRElSIGFuZCBzdHJ1Y3QgZGlyZW50LgorCisJKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWJzZCopOiBOZXcgY2FzZS4KKworCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LXNlcXVlbnQtcHR4KiB8IGlbMzQ1XTg2LXNlcXVlbnQtc3lzdiopCisJTmV3IGNhc2UuCisJKiBjb25maWd1cmUudGd0IChpWzM0NV04Ni0qLXB0eCopOiBOZXcgY2FzZS4KKworVGh1IFNlcCAgNyAxMDo0ODoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KKwlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCisJY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KKwljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCisKKwkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXN1bm9zNjQqKTogUmVtb3ZlLgorCSogbGRsYW5nLmMgKGxhbmdfbWFwKTogQ2hlY2sgQkZENjQsIG5vdCBIT1NUXzY0X0JJVC4KKworCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IHdhcm4gYWJvdXQgbW92aW5nIHRoZSBsb2NhdGlvbgorCWNvdW50ZXIgYmFja3dhcmQgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24uCisKK1dlZCBTZXAgIDYgMTQ6NDI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJld3JpdGUgdG8gdXNlIGF1dG9jb25mLgorCSogY29uZmlndXJlLmhvc3Q6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLnRndDogTmV3IGZpbGUuCisJKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9jb25mLgorCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWcuaC5pbjogTmV3IGZpbGUsIGJ1aWx0IGJ5IGF1dG9oZWFkZXIuCisJKiBzeXNkZXAuaDogTmV3IGZpbGUuCisJKiBsZC5oOiBJbmNvcnBvcmF0ZSBvbGQgY29udGVudHMgb2YgY29uZmlnLmguCisJKiBjb25maWcuaDogUmVtb3ZlLgorCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyBmb3IgbmV3IGNvbmZpZ3VyZSBzY3JpcHQuICBBbHNvOgorCShDQ19GT1JfQlVJTEQpOiBSZW1vdmUuCisJKGxkbWFpbi5vKTogRG9uJ3QgYm90aGVyIHRvIGVuc3VyZSB0aGF0IEVNVUwgaXMgbm9uLWVtcHR5LgorCShkZXAuc2VkKTogVXNlIEBTUkNESVJALCBub3QgQHNyY2RpckAuCisJKiBkZXAtaW4uc2VkOiBVc2UgQFNSQ0RJUkAsIG5vdCBAc3JjZGlyQC4KKwkqIGdlbnNjcmlwdHMuc2g6IENyZWF0ZSBsZHNjcmlwdHMgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisJKiBsZGVtdWwuYywgbGV4c3VwLmMsIG1wdy1lbWlwc2lkdC5jOiBEb24ndCBpbmNsdWRlICJjb25maWcuaCIuCisJKiBtcHctZXNoLmMsIGVtdWx0ZW1wLyouZW06IExpa2V3aXNlLgorCSogbGRtYWluLmM6IExpa2V3aXNlLiAgSW5jbHVkZSA8Y3R5cGUuaD4uICBEb24ndCB0cnkgdG8gc2V0CisJSEFWRV9TQlJLIGhlcmUuCisJKiBjb25maWcvKi5tdCwgY29uZmlnLyoubWg6IFJlbW92ZS4KKworVHVlIFNlcCAgNSAxNDo1NToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBUcmVhdCBuczMyay1wYzUzMi11eCogbGlrZSBuczMyay1wYzUzMi1tYWNoKiwgYW5kCisJbnMzMmstcGM1MzItbGl0ZXMqIGxpa2UgbnMzMmstcGM1MzItbmV0YnNkKi4gIEZyb20gSWFuIERhbGwuCisKK0ZyaSBTZXAgIDEgMjI6Mjk6NTIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvcGUuc2M6IEZpeCB0eXBvIGluIHNwZWxsaW5nIG9mIC5jdG9ycy8uZHRvcnMuCisKK0ZyaSBTZXAgIDEgMTM6MTM6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZG1haW4uYyAod2FybmluZ19jYWxsYmFjayk6IEFkZCBhYmZkLCBzZWN0aW9uLCBhbmQgYWRkcmVzcworCXBhcmFtZXRlcnMuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKKwlDaGFuZ2UgY2FsbCB0byB3YXJuaW5nIGFjY29yZGluZ2x5LgorCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IElmIG5vdAorCXJlbG9jYXRlYWJsZSBhbmQgbm90IHNoYXJlZCwgcHV0IC5nbnUud2FybmluZy5TWU1CT0wgc2VjdGlvbnMgaW50bworCXRoZSAudGV4dCBzZWN0aW9uLgorCitGcmkgU2VwICAxIDA4OjM1OjE2IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIG1pcHMqdnI0MzAwLWlkdC1lbGYqIGFuZAorICAgICAgICBtaXBzKnZyNDMwMGVsLWlkdC1lbGYqIHRhcmdldHMuCisJKiBNYWtlZmlsZS5pbjogQWRkZWQgZWVsZjMydnI0MzAwKiB0YXJnZXRzLgorCSogZW11bHBhcmFtcy97ZWxmMzJ2cjQzMDAuc2gsIGVsZjMydnI0MzAwZWwuc2h9OiBBZGRlZC4KKwkqIGNvbmZpZy97bWlwcy12cjQzMDAubXQsIG1pcHMtdnI0MzAwZWwubXR9OiBBZGRlZC4KKworRnJpIFNlcCAgMSAxMDo1MTo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2EyOWsuc2M6IEZpeCB0byBiZSByZWFzb25hYmxlLiAgRnJvbSBCcmVuZGFuIEtlaG9lCisJPGJyZW5kYW5AY3lnbnVzLmNvbT4uCisKK1RodSBBdWcgMzEgMTY6Mzc6MDcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogbGRlbXVsLmMgKGxkZW11bF9wYXJzZV9hcmdzKTogTmV3LgorCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBwYXJzZV9hcmdzLgorCSogbGV4c3VwLmMgKGFsbCBwZSBzdHVmZik6IE1vdmVkIGludG8gcGUuZW0KKwkocGFyc2VfYXJncyk6IENhbGwgZW11bGF0aW9uIGFyZyBwYXJzZXIuCisJKiBlbXVsdGVtcGwvcGUuZW0gKHBhcnNlX2FyZ3MpOiBoYW5kbGUgUEUgc3BlY2ZpYyBhcmdzLgorCitUaHUgQXVnIDMxIDE3OjAxOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBEb24ndCB1c2UgdGhlIGZpcnN0IHJlZ2lvbgorCWFzIHRoZSBkZWZhdWx0IHJlZ2lvbi4gIENyZWF0ZSBhIG5ldyByZWdpb24gaW5zdGVhZC4KKworVHVlIEF1ZyAyOSAxNDoyMTo0MSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBsZGVtdWwuYyAobGRlbXVsX3NldF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgorCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBzZXRfc3ltYm9scy4KKwkqIGxkbWFpbi5jIChtYWluKTogQWRkIGNhbGwgdG8gbGRlbXVsX3NldF9zeW1ib2xzLgorCSogbGV4c3VwLmMgKHNldF9wZV92YWx1ZSk6IE5ldyBhcmdzLgorCShzZXRfcGVfbmFtZSk6IE5ldy4KKwkocGFyc2VfYXJncyk6IENvcGUgd2l0aCBuZXcgc2V0X3BlX3ZhbHVlIGFyZ3MuCisJKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgorCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgc2V0X3N5bWJvbHMuCisJKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIG5ldyBzeW1ib2xzLgorCitUaHUgQXVnIDI0IDE4OjEyOjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBEb24ndCBjYWxsIHNldF9kZWZhdWx0X2Rpcmxpc3QgZm9yIC1PLgorCUZvciAtWSwgaWdub3JlIGEgbGVhZGluZyBgUCwnLCBhbmQgb25seSBjYWxsIHNldF9kZWZhdWx0X2Rpcmxpc3QKKwlhZnRlciBwcm9jZXNzaW5nIGFsbCB0aGUgb3RoZXIgYXJndW1lbnRzLgorCitUdWUgQXVnIDIyIDA3OjM2OjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBLZWVwIC5lZGF0YSwgZG9uJ3QgYmFzZSBzdGFicyBhdCAwLgorCSogZW11bHBhcmFtcy9hcm1wZS5zaDogUnVuIFBFIHNjcmlwdC4KKworTW9uIEF1ZyAyMSAxODozMDo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBsZG1haW4uYyAobWFpbik6IFJlbW92ZSBQRSBzdHVmZi4KKwkqIGxleHN1cC5jIChvcHRpb25zKTogTG9hZCBtb3JlIFBFIG9wdGlvbnMuCisJKHNldF9wZV92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KKworVGh1IEF1ZyAxNyAxMzozNTo0OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisKKwkqIGVtdWx0ZW1wbC97YXJtcGUuc2MsIGkzODZwZS5zY306IERlbGV0ZWQuCisJKiBlbXVsdGVtcGwvcGUuc2M6IE5ldyBmaWxlIHBlcmZvcm1zIGdlbmVyaWMgUEUgc3VwcG9ydCBhbmQgc29ydHMKKwlhcmNoaXZlIG1lbWJlcnMuCisJKiBlbXVscGFyYW1zL3thcm1wZS5zaCxpMzg2cGUuc2h9OiBVc2UgbmV3IGZpbGUuCisJKiBzY3JpcHR0ZW1wbC97YXJtcGUuc2MsIGkzODZwZS5zY306IERlbGV0ZWQKKwkqIHNjcmlwdHRlbXBsL3BlLnNjOiBOZXcuCisJKiBNYWtlZmlsZS5pbjogVXNlIG5ldyBmaWxlcy4KKworVGh1IEF1ZyAxNyAxNDo0NjozNCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9oODUwMHMuc2MgKC5yZGF0YSk6IEFsbCBkYXRhIG11c3QgZ28gaW4gZGF0YSBzZWdtZW50LgorCSguc3RyaW5ncywuY3RvcnMsLmR0b3JzKTogTGlrZXdpc2UuCisKK1dlZCBBdWcgMTYgMTE6Mzg6NTkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IEFsd2F5cyBzdGFydCBjb2RlIGF0IDB4NDAxMDAwLCBldmVuCisJaWYgLXIuCisJKiBsZHdyaXRlLmMgKHN0cmR1cCk6IE5ldyBleHRlcm4gZGVjbGFyYXRpb24uCisJKiBsZGdyYW0ueSAoYXR5cGUpOiBOZXcgcnVsZSB0byBjbGFyaWZ5IHR5cGUgcGFyc2luZy4KKwkqIGxkbGFuZy5jIChpbml0X29zKTogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgY29kZS4KKwkobGFuZ19zaXplX3NlY3Rpb25zKTogU2V0IFNFQ19BTExPQyBhbmQgU0VDX0xPQUQgYml0cworCXVubGVzcyB0b2xkIG5vdCB0byBieSB0aGUgbGluayBzY3JpcHQuCisKK1dlZCBBdWcgMTYgMTE6NDU6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19zZXRfc3RhcnRvZik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGxhbmdfcHJvY2Vzcyk6IENhbGwgaXQuCisKKwkqIGxkZ3JhbS55OiBUd2VhayBjYXNlc3ltbGlzdCB0byBhdm9pZCBiaXNvbiBlcnJvcnMuCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC1oIGFzIGEgc3lub255bSBmb3IgLS1zb25hbWUsIGZvcgorCVNvbGFyaXMgY29tcGF0aWJpbGl0eS4KKworVHVlIEF1ZyAxNSAxNzozMToxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZ3JhbS55IChZWURFQlVHKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgorCShDQVNFLCBFWFRFUk4sIFNUQVJUKTogTmV3IHRva2Vucy4KKwkobXJpX3NjcmlwdF9jb21tYW5kKTogSGFuZGxlIENBU0UsIEVYVEVSTiwgSU5DTFVERSwgU1RBUlQuCisJKGNhc2VzeW1saXN0KTogTmV3IG5vbnRlcm1pbmFsLgorCShleHRlcm5fbmFtZV9saXN0KTogTmV3IG5vbnRlcm1pbmFsLgorCSogbGRsZXgubDogQWNjZXB0IGxvd2VyIGNhc2UgdHJhaWxpbmcgYmFzZSBzcGVjaWZpZXJzLiAgRG9uJ3QKKwlpZ25vcmUgdGhlIGZpcnN0IGRpZ2l0IHdoZW4gdGhlIGJhc2UgaXMgYSBzdWZmaXguICBBY2NlcHQgbWFueQorCUVYUFJFU1NJT04gc3RhdGUgdG9rZW5zIGluIE1SSSBzdGF0ZS4gIFN1cHBvcnQgTVJJIGNvbnRpbnVhdGlvbgorCWxpbmVzIGFuZCBNUkkgc2VtaWNvbG9uIGNvbW1lbnRzLiAgQWNjZXB0IGFsbCBNUkkga2V5d29yZHMgaW4KKwlsb3dlciBjYXNlLiAgQWRkIENBU0UsIEVYVEVSTiwgYW5kIFNUQVJUIE1SSSBrZXl3b3Jkcy4KKworVHVlIEF1ZyAgOCAxOToxNDo1OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFVzZSB4bWFsbG9jCisJaW5zdGVhZCBvZiBhbGxvY2EuCisKK1R1ZSBBdWcgIDggMTU6MjQ6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBEb24ndCB1c2UKKwkkci8uLi9nY2MveGdjYyB1bmxlc3MgaXQgaXMgcHJlc2VudC4KKworVGh1IEF1ZyAgMyAxMTo1NjoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBPbmx5IHB1dCAuY3RvcnMgYW5kIC5kdG9ycyBpbiAudGV4dAorCXdoZW4gQ09OU1RSVUNUSU5HLgorCSogc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvbncuc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvc2EyOTIwMC5zYzogTGlrZXdpc2UuCisJKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IExpa2V3aXNlLgorCitGcmkgSnVsIDI4IDEyOjAyOjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMve3o4MDAxLnNoLCB6ODAwMi5zaH06IEZpeCB0eXBvLgorCitUaHUgSnVsIDI3IDIxOjA2OjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbGludXhvbGRsZCk6IFRyZWF0IGxpa2UgbGludXhhb3V0Ki4KKworVGh1IEp1bCAyNyAxNToyNjoyOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9pMzg2cGUuc2M6IENvcGUgd2l0aCBjb25zdHJ1Y3RvcnMuCisJKiBzY3JpcHR0ZW1wbC96OGtzaW0uc2M6IERlbGV0ZWQuCisJKiBzY3JpcHR0ZW1wbC96ODAwMC5zYzogUmVzdXJyZWN0ZWQgYXMgdGhpcywgYnV0CisJY2FuIGhhbmRsZSB6ODAwMSBhbmQgejgwMDIgZm9ybWF0cy4KKwkqIGVtdWxwYXJhbXMvejhrc2ltLnNoOiBEZWxldGVkLgorCSogZW11bHBhcmFtcy97ejgwMDEuc2gsIHo4MDAyLnNofTogTmV3IGZpbGVzLgorCSogY29uZmlnL3o4a3NpbS5tdDogRGVsZXRlZAorCSogY29uZmlnL3o4ay1jb2ZmLm10OiBOZXcsIGdlbmVyYXRlcyBib3RoIGVtdWxhdGlvbnMuCisKK1R1ZSBKdWwgMjUgMTQ6NTM6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZG1pc2MuYyAodmZpbmZvKTogSW4gJUMgYW5kICVEIGNhc2UsIGFsd2F5cyBwcmludCB0aGUgQkZEIHVzaW5nCisJJUIsIGluIGNhc2UgaXQgaXMgaW4gYW4gYXJjaGl2ZS4KKworTW9uIEp1bCAyNCAxNToyMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIHJlc2V0X21lbW9yeV9yZWdpb25zIGZvciBlYWNoCisJcmVsYXhhdGlvbiBwYXNzLgorCitGcmkgSnVsIDIxIDIyOjQ5OjQ0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IEFkZCBzdXBwb3J0IGZvciAuc2RhdGEsIC5zYnNzLCBhbmQKKwlfU0RBX0JBU0UuCisKK1RodSBKdWwgMjAgMTY6MjY6NTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IEFsbG9jYXRlIHNldF9uYW1lIGluIHN0YWNrCisJZnJhbWUsIHJhdGhlciB0aGFuIGFsd2F5cyBjYWxsaW5nIGFsbG9jYSB3aXRoIGEgZml4ZWQgc2l6ZS4KKworV2VkIEp1bCAxOSAxNjoyMTo0MyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL2FybXBlLnNoIChPVVRQVVRfRk9STUFUKTogQ2hhbmdlIHRvIHBlaS1hcm0tbGl0dGxlLgorCShMSVRUTEVfT1VUUFVUX0ZPUk1BVCwgQklHX09VVFBVVF9GT1JNQVQpOiBEZWZpbmUuCisKK01vbiBKdWwgMTcgMTM6NTc6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBTZXQgdGhlIGFsaWdubWVudCBvZiB0aGUgY2xvbmUKKwlzZWN0aW9uIHRvIHRoYXQgb2YgdGhlIHNlY3Rpb24gYmVpbmcgY2xvbmVkLgorCisJKiBsZHdyaXRlLmMgKHNwbGl0X3NlY3Rpb25zKTogRG9uJ3Qgc3BsaXQgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24KKwlpbnRvIGEgbmV3IG91dHB1dCBzZWN0aW9uLgorCitTYXQgSnVsIDE1IDAwOjI2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgorCShHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUgYXMgeWVzLgorCitGcmkgSnVsIDE0IDEyOjExOjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL21pcHNlY29mZi5lbSAoY2hlY2tfc2VjdGlvbnMpOiBVc2UgJVAsIG5vdCAlRi4KKworCSogbGR2ZXIuYyAoaGVscCk6IFVwZGF0ZSBsaXN0IG9mIG9wdGlvbnMgdG8gbWF0Y2ggY3VycmVudGx5CisJc3VwcG9ydGVkIGxpc3QuCisKK1RodSBKdWwgMTMgMTM6NTI6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvbG5rOTYwLmVtIChsZF9sbms5NjBfZW11bGF0aW9uKTogSW5pdGlhbGl6ZQorCWFmdGVyX29wZW4gZmllbGQuCisKKwkqIGxkZXhwLmMgKGV4cF9pbnRvcCk6IERvbid0IGNhc3Qgc3RhdF9hbGxvYyBhcmcgdG8gYmZkX3NpemVfdHlwZTsKKwlpdCB0YWtlcyBhIHNpemVfdCBhbnlob3cuCisJKGV4cF9iaW5vcCk6IExpa2V3aXNlLgorCShleHBfdHJpbm9wKTogTGlrZXdpc2UuCisJKGV4cF91bm9wKTogTGlrZXdpc2UuCisJKGV4cF9uYW1lb3ApOiBMaWtld2lzZS4KKwkoZXhwX2Fzc29wKTogTGlrZXdpc2UuCisJKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCk6IExpa2V3aXNlLgorCShpbml0X29zKTogTGlrZXdpc2UuCisJKGxkbGFuZ19hZGRfdW5kZWYpOiBMaWtld2lzZS4KKwkoaW5zZXJ0X3BhZCk6IExpa2V3aXNlLgorCSogbGRmaWxlLmMgKGxkZmlsZV9hZGRfYXJjaCk6IERvbid0IGNhc3QgeG1hbGxvYyBhcmcgdG8KKwliZmRfc2l6ZV90eXBlLgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJdCdzIGVhcm1hb3V0Yi5vLCBub3QgZWFybW91dGIuby4KKworV2VkIEp1bCAxMiAxMTozMjoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZW11bC5oIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlciB0bworCWRlY2xhcmF0aW9uLgorCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIgdG8KKwlvcGVuX2R5bmFtaWNfYXJjaGl2ZSBlbnRyeSBwb2ludC4KKwkqIGxkZW11bC5jIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBBZGQgc2VhcmNoIHBhcmFtZXRlci4KKwkqIGxkZmlsZS5jIChsZGZpbGVfdHJ5X29wZW5fYmZkKTogUmVuYW1lIGZyb20gdHJ5X29wZW5fYmZkLCBhbmQKKwltYWtlIG5vbi1zdGF0aWMuICBDaGFuZ2UgYWxsIGNhbGxlcnMgdG8gdXNlIG5ldyBuYW1lLgorCShsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IE1ha2Ugc3RhdGljLiAgSWYgZW50cnkgaXMgZHluYW1pYywgY2FsbAorCWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZS4KKwkobGRmaWxlX29wZW5fZmlsZSk6IERvbid0IGNhbGwgbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlLgorCSogbGRmaWxlLmggKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogRG9uJ3QgZGVjbGFyZS4KKwkobGRmaWxlX3RyeV9vcGVuX2JmZCk6IERlY2xhcmUuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKKwlBY2NlcHQgc2VhcmNoIHBhcmFtZXRlci4gIERvbid0IHNlYXJjaCBmb3IgYSBsaWJyYXJ5LCBqdXN0IGxvb2sgaW4KKwlhIHNpbmdsZSBwbGFjZS4KKwkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgorCUxpa2V3aXNlLgorCitUdWUgSnVsIDExIDE2OjQ0OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IERvbid0IGJhc2Ugc2NyaXB0IGRpcmVjdG9yeSBvbgorCWN1cnJlbnQgZGlyZWN0b3J5LgorCitUdWUgSnVsIDExIDEyOjI5OjAyIDE5OTUgIFJpY2sgU2xhZGtleSAgPGpyc0B3b3JsZC5zdGQuY29tPgorCisJKiBsZG1pc2MuYyAodmZpbmZvKTogRG9uJ3QgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIGlmIGl0IGlzbid0CisJbWVhbmluZ2Z1bC4KKworTW9uIEp1bCAxMCAxMzozODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIGZpZWxkIHdhcm5fY29uc3RydWN0b3JzLgorCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBXYXJuIGlmIGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycy4KKwkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBMaWtld2lzZS4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC13YXJuLWNvbnN0cnVjdG9ycy4KKwkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC13YXJuLWNvbnN0cnVjdG9ycy4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBEb24ndAorCWdldCBjb25mdXNlZCBieSBkaXJlY3RvcnkgbmFtZXMgaWYgd2Ugc2VhcmNoZWQgZm9yIHRoZSBmaWxlLgorCisJQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT46CisJKiBsZGxhbmcuaCAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSk6IEFkZCBuZXcgZmllbGQgZHluYW1pYy4KKwkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBTZXQgZHluYW1pYyBmcm9tIGNvbmZpZy5keW5hbWljX2xpbmsuCisJKiBsZGZpbGUuYzogSW5jbHVkZSBiZmRsaW5rLmguCisJKGxkZmlsZV9vcGVuX2ZpbGUpOiBDaGVjayBkeW5hbWljIGZpZWxkIG9mIGVudHJ5LCBub3QgZ2xvYmFsCisJZHluYW1pY19saW5rIGZpZWxkLiAgRG9uJ3QgZG8gYSBkeW5hbWljIHNlYXJjaCB3aGVuIGRvaW5nIGEKKwlyZWxvY2F0ZWFibGUgbGluay4KKwkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3Qgd2FybiBhYm91dCBkeW5hbWljX2xpbmsgZm9yIGEKKwlyZWxvY2F0ZWFibGUgbGluay4KKwkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFNraXAgZmlsZSBpZgorCWR5bmFtaWMgaXMgZmFsc2UuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogQWx3YXlzCisJbG9vcCBvdmVyIGlucHV0IGZpbGVzLgorCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtQnN0YXRpYywgLUJkeW5hbWljLCAtQnNoYXJlZCwgYW5kCisJLXNoYXJlZC4KKworTW9uIEp1bCAxMCAxMzoyOTo0MyAxOTk1ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYWliLmNvbT4KKworCSogbGRtYWluLmMgKG1haW4pOiBTZXQgbGlua19pbmZvLnN5bWJvbGljIHRvIGZhbHNlLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLUJzeW1ib2xpYy4KKworV2VkIEp1bCAgNSAwMDoxMjoxMSAxOTk1ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKEhBVkVfU0JSSyk6ICBEZWZpbmUgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0CisJc3BlY2lmaWMgc3lzdGVtcyB0aGF0IGFyZSBrbm93biB0byBub3Qgc3VwcG9ydCBzYnJrLgorCShtYWluKTogIFVzZSBIQVZFX1NCUksgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBzYnJrLgorCitUdWUgSnVsICA0IDEyOjU1OjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50KToKKwlIYW5kbGUgZXRyZWVfcHJvdmlkZS4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbG9iYWxfbmVlZGVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoZ2xvYmFsX2ZvdW5kKTogTGlrZXdpc2UuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkKTogTGlrZXdpc2UuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBMaWtld2lzZS4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogTGlrZXdpc2UuCisJKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFJlcGxhY2UgYWZ0ZXJfb3Blbl9kZWZhdWx0IHdpdGgKKwlnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLgorCitNb24gSnVsICAzIDE0OjI2OjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLXdpbjMyKTogTmV3IHRhcmdldC4KKworTW9uIEp1bCAgMyAxNDozOToyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogTGV0IC1HIGVpdGhlciBzZXQgdGhlIHNtYWxsIGRhdGEgc2l6ZSBvcgorCWJlIGVxdWl2YWxlbnQgdG8gLS1zaGFyZWQsIGRlcGVuZGluZyBvbiB0aGUgbmV4dCBhcmd1bWVudC4gIEFjY2VwdAorCWFuZCBpZ25vcmUgLXogZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KKworU3VuIEp1bCAgMiAxNzo1MjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2FzdCBmb3BlbiByZXN1bHQgdG8gUFRSIGJlZm9yZSBzdG9yaW5nCisJaXQgaW4gbGlua19pbmZvLmJhc2VfZmlsZS4gIEZpeCBpbmRlbnRhdGlvbi4KKworV2VkIEp1biAyOCAxNzoxMToyNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBsZG1haW4uYyAobWFpbik6IEFsd2F5cyBpbml0aWFsaXplIFBFIGluZm8gaW4gbGlua19pbmZvLgorCSogbGV4c3VwLmMgKE9QVElPTl9CQVNFX0ZJTEUpOiBOZXcgb3B0aW9uLgorCShwYXJzZV9hcmdzKTogSGFuZGxlIG5ldyBvcHRpb24uCisJKiBlbXVscGFyYW1zL2FybXBlLnNoOiBPdXRwdXQgcGVpLgorCSogZW11bHRlbXBsL2kzODZwZS5lbTogQWRkIG5ld2xpbmUgdG8gZW5kLgorCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IENoYW5nZSBvdXRwdXQgYW5kIHF1b3RlIHRoZSAkcy4KKwkqIHNjcmlwdHRlbXBsL2kzODZwZS5zYzogQ2hhbmdlIG91dHB1dCBhbmQgcXVvdGUgdGhlICRzLgorCitUaHUgSnVuIDIyIDE5OjU1OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgorCisJKiBjb25maWd1cmUuaW4gKGkzODYtKi1tc2RvcyosIGkzODYtKi1tb3NzKik6IE5ldyB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgaTM4Nm1zZG9zLm8uCisJKGkzODZtc2Rvcy5vKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZy9pMzg2LW1zZG9zLm10OiBDcmVhdGVkLgorCSogZW11bHBhcmFtcy9pMzg2bXNkb3Muc2g6IENyZWF0ZWQuCisJKiBzY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2M6IENyZWF0ZWQuCisKK1RodSBKdW4gMjIgMTU6MDY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5maXh1cCk6IEFkZCBzdXBwb3J0IGZvciBhIC5maXh1cCBzZWN0aW9uCisJdGhhdCBjb250YWlucyBwb2ludGVycyB0byBiZSByZWxvY2F0ZWQuCisKK1R1ZSBKdW4gMjAgMTc6NDc6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctZXNoLmM6IE5ldyBmaWxlLCBtb2RpZmllZCBmb3IgTVBXIGZyb20gZXNoLmMuCisJKiBzY3JpcHR0ZW1wbC9zaC5zYzogUmVmb3JtYXR0ZWQgdG8gc2ltcGxpZnkgTVBXaWZpY2F0aW9uLAorCXVzZSAqKCkgdG8gY29uY2F0IHN0YWIgc2VjdGlvbnMgaW5zdGVhZCBvZiBbXS4KKworVGh1IEp1biAxNSAwODo0ODoxNiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBzY3JpcHR0ZW1wbC9hcm1wZS5zYzogQWRkIGNvbnN0cnVjdG9yIHN1cHBvcnQuCisKK1R1ZSBKdW4gMTMgMDk6MTE6MjAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6ICBBbnkgc2VjdGlvbiB3aXRoIGEgREFUQQorCXN0YXRlbWVudCBoYXMgY29udGVudHMuCisKK1N1biBKdW4gMTEgMTU6MjA6NDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogZW11bHBhcmFtcy9tNjhrZWxmLnNoIChOT1ApOiBEZWZpbmUuCisJKERZTkFNSUNfTElOSyk6IERvbid0IGRlZmluZS4KKwkoVEVYVF9TVEFSVF9BRERSKTogU2V0IHRvIDB4ODAwMDAwMDA7IHRoZSBleHRyYSAweDEwMCBmb3IgaGVhZGVycworCXdpbGwgY29tZSBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0LgorCitUaHUgSnVuICA4IDE0OjE3OjMzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvYXJtcGUuc2gsIHNjcmlwdGVtcGwvYXJtcGUuc2M6IEFkZCBlbmQgYW5kIHN0YWNrLgorCitNb24gSnVuICA1IDAyOjE2OjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWdudSopOiBVc2UgR05VIGVsZiBjb25maWcuCisKK1RodSBNYXkgMjUgMTE6NDk6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJRnJvbSBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCSogTWFrZWZpbGUuaW46IEZpeHVwIG1vcmUgZ290Y2hhcyBmcm9tIHJlbmFtaW5nIGVsZjMycHBjbGUgdG8KKwllbGYzMmxwcGMuCisKK1dlZCBNYXkgMjQgMTE6MjM6MjEgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCUFkZCBzdXBwb3J0IGZvciBBUk0tUEUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgYXJtcGUubworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJtcGUuCisJKiBjb25maWcvYXJtLXBlLm10OiBOZXcgZmlsZS4KKwkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IE5ldyBmaWxlLgorCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IE5ldyBmaWxlLgorCisKK01vbiBNYXkgMjIgMTU6MTk6MjYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGg4MzAwaC0qLWhtcyk6IERlbGV0ZWQKKwkqIGNvbmZpZy9jZi1oODMwMGgubXQ6IERlbGV0ZWQuCisKK1RodSBNYXkgMTggMDQ6MjY6MTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgorCisJV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKKworCUZyb20gRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlYXJtb3V0W2xiXS5vCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhcm17LGVbbGJdLSotYW91dC4KKwkqIGNvbmZpZy9hcm1bbGJdLWFvdXQubXQ6IE5ldyBmaWxlcy4KKwkqIGVtdWxwYXJhbXMvYXJtYW91dFtsYl0uc2g6IE5ldyBmaWxlcy4KKwkqIHNjcmlwdHRlbXBsL2FybWFvdXQuc2M6IE5ldyBmaWxlLgorCitUdWUgTWF5IDE2IDE4OjI3OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3BwY2xlLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMybHBwYywgbm90IGVsZjMycHBjbGUsIHRvCisJYmUgdW5pcXVlIGluIDggY2hhcmFjdGVycyBmb3IgRE9TLgorCisJKiBlbXVscGFyYW1zL2VsZjMybHBwYy5zaDogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBlbGYzMnBwY2xlLnNoLgorCSogZW11bHBhcmFtcy9lbGYzMnBwY2xlLnNoOiBEZWxldGVkLgorCitGcmkgTWF5IDEyIDExOjAzOjU1IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisJCQkgIFRvbSBHcmllc3QgPGdyaWVzdEBjcy55YWxlLmVkdT4KKworCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgZXhlY3V0YWJsZXMgKGVnIE5ULCB3aW4zMikKKworCSogTWFrZWZpbGUuaW4gKGNvbmZpZ3VyZS5pbiwgZWkzODZwZSk6IEFkZCBzdXBwb3J0LgorCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIFBFIGFyZ3VtZW50IGluZm8uCisJKiBsZHdyaXRlLmMgKHByaW50X2ZpbGVfc3R1ZmYpOiBEb24ndCBwcmludCBvdXQgLmRyZWN0dmUKKwlhbmQgLmRlYnVnIHNlY3Rpb24gaW5mby4KKwkqIGxleHN1cC5jIChzZXRfc3Vic3lzdGVtLCBzZXRfc3RhY2tfaGVhcCwgT1BUSU9OX0hFQVAsCisJIE9QVElPTl9TVUJTWVNURU0sIHBhcnNlX2FyZ3NtIHNldF9zdWJzeXN0ZW0sIHNldF9zdGFja19oZWFwKToKKwkgSGFuZGxlIG5ldyBhcmd1bWVudHMuCisJKiBjb25maWcvaTM4Ni1wZS5tdCwgZW11bHRlbXBsL2kzODZwZS5lbSwgc2NyaXB0dGVtcGwvaTM4NnBlLnNjOgorCU5ldyBmaWxlcworCitXZWQgTWF5IDEwIDE4OjM3OjU5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjOiAgUmVtb3ZlIC5QQVJJU0MudW53aW5kIHNlY3Rpb24gZnJvbSB0ZXh0CisJc2VnbWVudC4gIFRoaXMgYWxsb3dzIGxkIC1yIHRvIHByZXNlcnZlIHVud2luZCBzZWN0aW9ucy4KKworVHVlIE1heSAgOSAxNzoxOTo1NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMycHBjbGUuby4KKwkoZWVsZjMycHBjbGUuYyk6IFN1cHBvcnQgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4KKworCSogY29uZmlnL3BwY2xlLWVsZjMyLm10OiBOZXcgZmlsZSBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDLgorCSogZW11bHBhcmFtcy9lbGYzMnBwY2xlLnNoOiBEaXR0by4KKworV2VkIE1heSAgMyAxMjo1NjozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hlY2sKKwlzdWJzZWN0aW9uX2FsaWdubWVudCwgaW5zdGVhZCBvZiBjaGVja2luZyBzZWN0aW9uX2FsaWdubWVudCB0d2ljZS4KKwlOb3RpY2VkIGJ5IEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KKworVHVlIE1heSAgMiAxNjozNjowNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLWxpdGVzKik6IEhhbmRsZSBsaWtlIGhwcGEqLSotKmVsZiouCisKK01vbiBBcHIgMjQgMTk6MjE6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IEJlZm9yZSBkb2luZyBhbnl0aGluZywgcmVzZXQgdGhlIGVycm9yCisJY29kZS4gIElmIGJmZF9maW5hbF9saW5rIHJldHVybnMgYW4gZXJyb3IsIGJ1dCB0aGUgZXJyb3IgY29kZSBpcworCXVuc2V0LCBkb24ndCBpc3N1ZSBhbiBleHRyYSBtZXNzYWdlLiAgQXNzdW1lIGEgY29ycmVjdCBlcnJvcgorCW1lc3NhZ2Ugd2FzIGFscmVhZHkgc2V0LgorCitGcmkgQXByIDE0IDE2OjMxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtNjhrZWxmLm8uCisJKGVtNjhrZWxmLm8pOiBOZXcgdGFyZ2V0LgorCSogY29uZmlnL202OGstZWxmLm10LCBlbXVscGFyYW1zL202OGtlbGYuc2g6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0gZm9yIG02OCotKi1lbGYuCisKK1R1ZSBBcHIgMTEgMTI6MDI6MDMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCisJKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKKworCSogbXB3LWNvbmZpZy5pbiAoaTM4Ni11bmtub3duLWFvdXQpOiBDaGFuZ2UgdG8gaTM4Ni11bmtub3duLWdvMzIuCisJKGkzODYtdW5rbm93bi1jb2ZmKTogUmVtb3ZlLgorCShzaC1oaXRhY2hpLWhtcyk6IE5ldyB0YXJnZXQuCisJKGVtdWxhdGlvbl9vZmlsZXMpOiBTZXQgY29ycmVjdGx5IGZvciBlYWNoIHRhcmdldC4KKwkodmVyc2lvbiwgVERFRklORVMpOiBBZGQgdG8gbWFrZWZpbGUgZnJhZ21lbnQuCisJKiBtcHctbWFrZS5pbiAoQklTT04pOiBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbi4KKwkoZW1fKi5jKTogUmVwbGFjZSB3aXRoIGUqLmMgZXZlcnl3aGVyZS4KKwkobGRncmFtLmgpOiBTZXBhcmF0ZSBhY3Rpb24gZnJvbSBsZGdyYW0uYyBnZW5lcmF0aW9uLgorCShMRF9QUk9HKTogRGVwZW5kIG9uIFZlcnNpb24uci4KKwkoVmVyc2lvbi5yKTogZ2VuZXJhdGUgZnJvbSB2ZXJzaW9uIGluZm8uCisJKiBtcHctZW1pcHNpZHQuYzogTmV3IGZpbGUsIG1vZGlmaWVkIGZvciBNUFcgZnJvbSBlbWlwc2lkdC5jLgorCisJKiBtcHctY29uZmlnLmluIChtNjhrLWFwcGxlLW1hY29zLCBwcGMtYXBwbGUtbWFjb3MsCisgICAgICAgIGkzODYtdW5rbm93bi1hb3V0LCBpMzg2LXVua25vd24tY29mZik6IE5ldyB0YXJnZXRzLgorCShtNjhrLWFvdXQsIG02OGstY29mZik6IFJlbW92ZSB0YXJnZXRzLgorCShtay50bXApOiBBZGQgZGVmaW5pdGlvbiBvZiBFTVVMLgorCisJKiBtcHctY29uZmlnLmluIChlbXVsbmFtZSk6IFNldCBiYXNlZCBvbiB0YXJnZXQuCisJKGxkZW11bC1saXN0LmgpOiBDb25zdHJ1Y3QuCisJKiBtcHctbWFrZS5pbiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbCk6IERlcGVuZCBvbiBpbnN0YWxsLW9ubHkuCisKKwkqIG1wdy1tYWtlLmluIChiaW5kaXIpOiBGaXggcGF0aG5hbWUuCisJKGluc3RhbGwpOiBNb3ZlIGhlcmUgZnJvbSBtcHctYnVpbGQuaW4uCisKKwkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudC4KKwkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50LgorCShUaGlzIGZpbGUgaXMgc2VtaS1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIE1ha2VmaWxlLmluLikKKwkqIGxkZmlsZS5jIChzbGFzaCk6IElmIE1QVywgc2V0IHRvIGA6Jy4KKwkqIGxkbGV4LmwgKFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVEKTogSWYgTVBXLCBzZXQgdGhpcyB0bworCXByZXZlbnQgcmVkZWZpbml0aW9uIGVycm9ycy4KKworVHVlIEFwciAgNCAxNzo1NToxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BiYW5nLmhhY2suY29tPgorCisJKiBsZHdyaXRlLmMgKGNsb25lX3NlY3Rpb24pOiBBbGlnbiBjbG9uZSBzZWN0aW9ucyBvbiBldmVuCisJYm91bmRhcmllcy4KKworVGh1IE1hciAzMCAxNDozMjoyNiAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGxpbnV4IHRvIGRlZmF1bHQgdG8gZWxmLiAgVXNpbmcKKwlpWzM0NV04Ni0qLWxpbnV4YW91dCB3aWxsIGJ1aWxkIGEgbGlua2VyIHdoaWNoIGRlZmF1bHRzIHRvIGEub3V0LgorCSogY29uZmlnL2kzODYtbGFvdXQubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1saW51eC5tdC4KKwkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGVsZi5tdC4KKwkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IFJlbW92ZS4KKworVGh1IE1hciAzMCAxMzowOTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtYWluKTogSWYgb3BlbmluZyB0aGUgbWFwIGZpbGUgZmFpbHMsIGNhbGwKKyAgICAgICAgYmZkX3NldF9lcnJvciBiZWZvcmUgY2FsbGluZyBlaW5mby4KKworCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgdGhlIC1uby1rZWVwLW1lbW9yeSBvcHRpb24uCisKK01vbiBNYXIgMjcgMTE6MTA6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZG1haW4uYyAobWFpbik6IFJldmVydCBwYXRjaCBvZiBNYXJjaCAxMCwgc2luY2UgdGhlIFNWUjQgbGlua2VyCisJZG9lcyBtYXJrIHNoYXJlZCBsaWJyYXJpZXMgYXMgZXhlY3V0YWJsZS4KKworVHVlIE1hciAyMSAxNToxNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IENoYW5nZSBwb3dlciB0byBpbnQuICBQYXNzIGxhcmdlciB2YWx1ZXMKKwliZWZvcmUgc21hbGxlciB2YWx1ZXMuCisJKGxhbmdfb25lX2NvbW1vbik6IFRyZWF0IGluZm8gYXMgaW50ICouICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yCisJbGFzdCB2YWx1ZSwgc2luY2UgaXQgaXMgbm93IHplcm8uCisKK1NhdCBNYXIgMTggMDE6NDk6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogQW4gZW1wdHkgYXJjaGl2ZSBpcyBPSy4KKworRnJpIE1hciAxNyAxNjoxNTozMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChwcm9ncmVzcy5oKTogSW5jbHVkZS4KKwkobWFpbik6IENhbGwgU1RBUlRfUFJPR1JFU1MgYW5kIEVORF9QUk9HUkVTUy4KKworVGh1IE1hciAxNiAxNzoxNzozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBNb3ZlIF9HT1QyX0VORF8gYWZ0ZXIgdGhlIC5jdG9ycyBhbmQKKwkuZHRvcnMgc2VjdGlvbnMsIHNvIHRoYXQgdGhlc2UgcG9pbnRlcnMgZ2V0IHJlbG9jYXRlZCBhbHNvLgorCURlZmluZSB0aGUgc3ltYm9scyBfX3tDLER9VE9SX3tMSVNULEVORH1fXyB0byBtYXJrIHRoZSBiZWdpbm5pbmcKKwlhbmQgZW5kIG9mIHRoZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuCisKK1RodSBNYXIgMTYgMTM6NTk6MTQgMTk5NSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KKworCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IElmIHdob2xlX2FyY2hpdmUgaXMgdHJ1ZSBhbmQgRU5UUlkKKwlkZXNjcmliZXMgYW4gYXJjaGl2ZSwgY2FsbCBiZmRfbGlua19hZGRfc3ltYm9scyBvbiBlYWNoIG1lbWJlci4KKwkqIGxkbWFpbi5jICh3aG9sZV9hcmNoaXZlKTogTmV3IHZhcmlhYmxlLgorCShtYWluKTogSW5pdGlhbGl6ZSBpdCB0byBmYWxzZS4KKwkqIGxkbWFpbi5oOiBEZWNsYXJlIHdob2xlX2FyY2hpdmUuCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEdyb2sgLS13aG9sZS1hcmNoaXZlIHN3aXRjaC4KKwkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2hvbGUtYXJjaGl2ZS4KKworVGh1IE1hciAxNiAxMTozODo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdlbnNjcmlwdHMuc2ggKEVNVUxBVElPTl9OQU1FKTogU2V0IExJQl9QQVRIIHRvIGVtcHR5IHdoZW4gbm90CisJdXNpbmcgdGhlIGRlZmF1bHQgZW11bGF0aW9uLgorCisJKiBjb25maWcvZGd1eC5taCAoSE9TVElOR19FTVUpOiBVc2UgLW0gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHNldAorCUxERU1VTEFUSU9OLgorCSogY29uZmlnL2hwcGFlbGYubWggKEhPU1RJTkdfRU1VKTogTGlrZXdpc2UuCisKK1R1ZSBNYXIgMTQgMTI6Mjg6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTZXQgZm9yY2VfbWFqCisJZm9yIC1sYy5OLiAgRnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+LgorCitGcmkgTWFyIDEwIDE0OjQzOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBzZXQgRVhFQ19QIGlmIGxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LgorCisJKiBsZGxleC5sOiBSZXR1cm4gLWxGSUxFTkFNRSBhcyB0aGUgdG9rZW4gTE5BTUUuCisJKiBsZGdyYW0ueTogQWRkIHRva2VuIExOQU1FLgorCShpbnB1dF9saXN0KTogVHJlYXQgTE5BTUUgbGlrZSBOQU1FLCBidXQgcGFzcyBpdCB0bworCWxhbmdfYWRkX2lucHV0X2ZpbGUgYXMgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bS4KKwkqIGxkLnRleGluZm86IERvY3VtZW50IHVzaW5nIC1sRklMRU5BTUUgaW4gSU5QVVQuCisKK1RodSBNYXIgIDkgMTI6MjE6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IElmIHRoZSBhcmNoaXRlY3R1cmVzIGFyZSBjb21wYXRpYmxlIGNhbGwKKwliZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSB0byBsZXQgdGhlIGJhY2tlbmQgZG8gYWRkaXRpb25hbAorCWNoZWNrcy4KKworVHVlIE1hciAgNyAwMDo1MzowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX21vZGUpOiBJZiBlbXVsYXRpb24gbm90IHJlY29nbml6ZWQsIGxpc3QKKwlhbGwgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCisKK01vbiBNYXIgIDYgMTQ6MDM6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGVtdWwuYyAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IE5ldyBmdW5jdGlvbi4KKwkqIGxkZW11bC5oIChsZGVtdWxfbGlzdF9lbXVsYXRpb25zKTogRGVjbGFyZS4KKwkqIGxkdmVyLmMgKGhlbHApOiBMaXN0IHN1cHBvcnRlZCB0YXJnZXRzIGFuZCBlbXVsYXRpb25zLgorCitGcmkgTWFyICAzIDE1OjQwOjM2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYyAoLmRlYnVnKTogUmVsb2NhdGUgdG8gYWRkcmVzcyAwLgorCSguZGVidWdfc3JjaW5mbywgLmRlYnVnX2FyYW5nZXMsIC5kZWJ1Z19wdWJuYW1lcywKKwkuZGVidWdfc2ZuYW1lcywgLmxpbmUpOiBMaWtld2lzZS4KKworRnJpIE1hciAgMyAxNzowNzoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoaG9sZF9yZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBQbGFjZSByZWFkb25seSBzZWN0aW9ucyB3aXRoCisJY29udGVudHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAiLnJlbCIgYWZ0ZXIgaG9sZF9yZWwuICBSZW1vdmUgdGhlCisJYXNzZXJ0aW9uIHdoaWNoIGNoZWNrZWQgZm9yIHVucGxhY2VkIC5yZWwgc2VjdGlvbnMuICBEb24ndCB0cnkgdG8KKwlzb3J0IHRoZSBzZWN0aW9uIGludG8gcGxhY2UgaWYgcGxhY2UtPmJmZF9zZWN0aW9uIGlzIE5VTEwuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBTZXQgaG9sZF9yZWwgdG8gdGhlIGZpcnN0CisJc2VjdGlvbiBiZWdpbm5pbmcgd2l0aCAiLnJlbCIuCisKK1RodSBNYXIgIDIgMTQ6MzQ6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRG9jIG5vdGUgZnJvbSBwaWVycmVAcGhpLmxhLnRjZS5jb20gKFBpZXJyZSBXaWxsYXJkKToKKwkqIGxkLnRleGluZm86IC1YIGFuZCAteCB3b3JrIGV2ZW4gaWYgLXMgb3IgLVMgYXJlIG5vdCBzcGVjaWZpZWQuCisJKiBsZC4xOiBTaW1pbGFyIGNoYW5nZS4KKworV2VkIE1hciAgMSAxMzo1MToxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCAoQ09GRl9DVE9SUyk6IERlZmluZS4KKwkqIHNjcmlwdHRlbXBsL2k5NjAuc2M6IFVzZSBDT0ZGX0NUT1JTIGlmIENPTlNUUlVDVElORy4KKworVHVlIEZlYiAyOCAxMjo0Mjo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1saW51eGVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtbGVsZi4KKwkoaVszNDVdODYtKi1nbnVlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWdlbGYuCisJKiBjb25maWcvaTM4Ni1sZWxmLm10OiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9pMzg2LWdlbGYubXQ6IE5ldyBmaWxlLgorCitUdWUgRmViIDI4IDEwOjI3OjU0IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBNYXRjaCBvbiBtaXBzLWVjb2ZmLCBhbmQgZGVmYXVsdCB0byB0aGUgSURUCisJY29uZmlndXJhdGlvbi4KKworRnJpIEZlYiAxNyAxMzowNjo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLmdvdDEgYW5kIC5nb3QyIHNlY3Rpb25zLgorCU9mZnNldCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gMzI3NjggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEdPVCBhcmVhCisJdG8gZG91YmxlIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KKworVGh1IEZlYiAgOSAxODoyOTo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG8gcmVjdXJzaXZlIGRlbGV0aW9uLCBzaW5jZSBsZHNjcmlwdHMKKwlpcyBhIGRpcmVjdG9yeS4KKworVGh1IEZlYiAgOSAxMTozODoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtYWluKTogSWYgdHJhY2VfZmlsZV90cmllcyBpcyB0cnVlLCBhbmQgd2UgYXJlIHVzaW5nCisJYW4gaW50ZXJuYWwgbGlua2VyIHNjcmlwdCwgcHJpbnQgb3V0IHRoZSBzY3JpcHQuCisJKiBsZGZpbGUuYyAodHJ5X29wZW4pOiBSZWluZGVudCBmdW5jdGlvbi4gIE1ha2UgdGhlIG1lc3NhZ2VzIGFib3V0CisJb3BlbmluZyBzY3JpcHQgZmlsZXMgbW9yZSBpbmZvcm1hdGl2ZS4KKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBGb3IgLVYsIGNhbGwgbGR2ZXJzaW9uIHdpdGggMSwgbm90IDAuCisJKiBsZC50ZXhpbmZvLCBsZC4xOiBVcGRhdGUgYWNjb3JkaW5nbHkuCisKK1dlZCBGZWIgIDggMTc6MzQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogQWRqdXN0IHJlZmVyZW5jZXMgdG8gY29tbW9uIHN5bWJvbAorCWluZm9ybWF0aW9uIGZvciBuZXcgc3RydWN0dXJlLgorCitNb24gRmViICA2IDEyOjE3OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRtYWluLmMgKHVuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgc2VjdGlvbiBiZWluZyBOVUxMLgorCisJKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBIYW5kbGUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLgorCSogbGRleHAuYyAoZm9sZF9uYW1lKTogTGlrZXdpc2UuCisJKiBsZGxhbmcuYyAocHJpbnRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgorCShsYW5nX2ZpbmlzaCk6IExpa2V3aXNlLgorCSogbGRtYWluLmMgKG11bHRpcGxlX2NvbW1vbik6IExpa2V3aXNlLgorCSogbGR3cml0ZS5jIChwcmludF9zeW1ib2wpOiBMaWtld2lzZS4gIEFsc28sIGJmZF9saW5rX2hhc2hfd2VhaworCXJlbmFtZWQgdG8gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsuCisKKwkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIGNvcnJlY3RseQorCXdoZW4gLW4gb3IgLU4gaXMgdXNlZC4gIFBhdGNoIGZyb20gQ2hyaXMgRyBEZW1ldHJpb3UKKwk8Q2hyaXNfR19EZW1ldHJpb3VATEFHQVZVTElOLlBETC5DUy5DTVUuRURVPi4KKwkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFNpbWlsYXIgY2hhbmdlLgorCitUdWUgSmFuIDMxIDE2OjIwOjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDbGFyaWZ5IGVycm9yIG1lc3NhZ2Ugd2hlbiB1c2VyCisJc3BlY2lmaWVkIHN0YXJ0IGFkZHIgY29uZmxpY3RzIHdpdGggcmVnaW9uLiAgRml4IHJlc2V0dGluZyBvZgorCXJlZ2lvbiBwb2ludGVyLgorCitUdWUgSmFuIDMxIDEyOjM3OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGRleHAuYyAoZm9sZF9uYW1lKTogSW4gY2FzZSBOQU1FLCBwZXJtaXQgYW4gYWJzb2x1dGUgc3ltYm9sCisJaW4gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0uCisKK01vbiBKYW4gMzAgMTE6MzM6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVwZW5kIHVwb24gY2xlYW4uICBEb24ndCBib3RoZXIgdG8KKwlyZW1vdmUgZmlsZXMgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGJ5IGNsZWFuLiAgRnJvbSBwYXRjaCBieQorCWFsYW5AU1BSSS5MZXZlbHMuVW5pU0EuRWR1LkF1IChBbGFuIE1vZHJhKS4KKworRnJpIEphbiAyNyAxNjoyNzozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGb3IKKwlhIE1JUFMgdGFyZ2V0LCBjbG9iYmVyIHRoZSBzaXplIG9mIGFsbCBidXQgdGhlIGZpcnN0IGlucHV0CisJLnJlZ2luZm8gc2VjdGlvbiB0byBiZSAwLCBzbyB0aGF0IGxhbmdfc2l6ZV9zZWN0aW9ucyBzZXRzIHRoZQorCWNvcnJlY3Qgc2l6ZSBmb3IgdGhlIG91dHB1dCAucmVnaW5mbyBzZWN0aW9uLgorCitUaHUgSmFuIDI2IDE5OjUzOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6CisJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpcy4KKworVGh1IEphbiAyNiAxMjozMzowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYWJpLgorCisJKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IE5ldyBmaWxlIGZvciBQb3dlclBDIGVtYmVkZGVkIEFCSQorCXN1cHBvcnQuCisKKwkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFNDUklQVF9OQU1FKTogVXNlIGVsZnBwYy5zYyBpbnN0ZWFkIG9mCisJZWxmLnNjLCB3aGljaCBkZWZpbmVzIHNvbWUgbmV3IHN5bWJvbHMgUG93ZXJQQyBlbGYgbmVlZHMuCisKK1R1ZSBKYW4gMjQgMTA6MzI6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBEb24ndCBkdW1wIGNvcmUgaWYgYQorCWNvbnN0cnVjdG9yIGVudHJ5IGlzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgorCitNb24gSmFuIDIzIDEzOjU4OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWdudSopOiBTZXQgbGRfdGFyZ2V0IHRvIGkzODYtZ251LgorCSogY29uZmlnL2kzODYtZ251Lm10OiBOZXcgZmlsZS4gIEluY2x1ZGUgRUxGIHN1cHBvcnQuCisKK1RodSBKYW4gMTkgMTY6MjI6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYKKwl0aGVyZSBhcmUgYW55IGlucHV0IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZywgdHJlYXQgdGhlbSBhcworCWNvbnRhaW5pbmcgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZCBieSB0aGUgbGlua2VyLCBhbmQKKwljbG9iYmVyIHRoZSBzaXplIHNvIHRoYXQgdGhlIG1lc3NhZ2UgaXMgbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQKKwlmaWxlLgorCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBQdXQgLmdudS53YXJuaW5nIHNlY3Rpb25zIGludG8gdGhlIC50ZXh0CisJc2VjdGlvbi4KKworU3VuIEphbiAxNSAxNjo0NTowMCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogY29uZmlndXJlLmluICh3NjUtKi0qKTogTmV3IHRhcmdldC4KKwkqIE1ha2VmaWxlLmluOiBVcGRhdGUuCisJKiBzY3JpcHR0ZW1wbC93NjUuc2M6IE5ldy4KKwkqIGNvbmZpZy9jb2ZmLXc2NS5tdDogTmV3LgorCitUaHUgSmFuIDEyIDAxOjMyOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxhbmdfcGxhY2Vfb3JwaGFucyk6IERvbid0IGlnbm9yZSBmaWxlcyB3aXRoCisJanVzdF9zeW1zX2ZsYWcgc2V0LiAgSW5zdGVhZCwgcHV0IGFsbCB0aGVpciBzZWN0aW9ucyBpbgorCWJmZF9hYnNfc2VjdGlvbl9wdHIsIHVzaW5nIHRoZSBzZWN0aW9uIFZNQSBhcyB0aGUgb3V0cHV0X29mZnNldC4KKworV2VkIEphbiAxMSAyMjo1OTowOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBEb24ndCB1c2UgYGNvbnN0JyB3aXRoIHR5cGVkZWYKKwluYW1lIGByZWxvY19ob3d0b190eXBlJywgc2luY2UgaXQncyBub3cgZGVmaW5lZCB0byBiZSBjb25zdC4KKwkqIGxkbGFuZy5jIChsYW5nX2FkZF9yZWxvYyk6IERpdHRvLgorCSogbGRsYW5nLmggKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUsIGxhbmdfYWRkX3JlbG9jKTogRGl0dG8uCisKK1dlZCBKYW4gMTEgMTE6MjQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IEFkZGluZyBvciBzdWJ0cmFjdGluZyBhbiBhYnNvbHV0ZSB2YWx1ZQorCXRvIGEgcmVsYXRpdmUgdmFsdWUgZG9lcyBub3QgcmVxdWlyZSBmb3JjaW5nIHRoZSByZWxhdGl2ZSB2YWx1ZSB0bworCWJlIGFic29sdXRlLiAgQWxzbywgcmVpbmRlbnQgZnVuY3Rpb24uCisKK1dlZCBEZWMgMjggMjI6MDU6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQ3JlYXRlIGEgc3ltYm9sIHdpdGggdGhlCisJc2FtZSBuYW1lIGFzIHRoZSBzZWN0aW9uLgorCitNb24gRGVjIDE5IDE0OjAyOjEzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGxkLmggKHNwbGl0X2J5X3JlbG9jLCBzcGxpdF9ieV9maWxlKTogTmV3IGZsYWdzLgorCSogbGR3cml0ZS5jICAoY2xvbmVfc2VjdGlvbiwgc3BsaXRfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVbmRlcnN0YW5kIG5ldyBzcGxpdCBvcHRpb25zLgorCitGcmkgRGVjICA5IDE3OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNb3ZlIC5jdG9ycyBhbmQgLmR0b3JzIGZyb20gLnRleHQgc2VnbWVudCB0bworCS5kYXRhIHNlZ21lbnQuICBUaGV5IG11c3QgYmUgd3JpdGFibGUgd2hlbiBjcmVhdGluZyBhIHNoYXJlZAorCWxpYnJhcnkuICBGcm9tIEguSi4gTHUgPGhqbEBueW5leHN0LmNvbT4uCisKK0ZyaSBEZWMgIDIgMTQ6MDk6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KKworCSogZW11bHRlbXBsL21pcG9zZWNvZmYuZW06IE5ldyBmaWxlLgorCSogZW11bHBhcmFtcy9taXBzaWR0LnNoIChURU1QTEFURV9OQU1FKTogU2V0IHRvIG1pcHNlY29mZi4KKwkqIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2ggKFRFTVBMQVRFX05BTUUpOiBMaWtld2lzZS4KKwkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFB1dCAucmVsLnNkYXRhIHNlY3Rpb25zIGluIC50ZXh0LCBhbmQKKwlwcm92aWRlIF9fcnVudGltZV9yZWxvY19zdGFydCBhbmQgX19ydW50aW1lX3JlbG9jX3N0b3AgaWYgdGhleSBhcmUKKwl1c2VkLiAgIEFsaWduIF9mZGF0YSB0byBhIDE2IGJ5dGUgYm91bmRhcnkuCisJKiBNYWtlZmlsZS5pbiAoZW1pcHNpZHQuYyk6IERlcGVuZCB1cG9uIG1pcHNlY29mZi5lbSByYXRoZXIgdGhhbgorCWdlbmVyaWMuZW0uCisJKGVtaXBzaWR0bC5jKTogTGlrZXdpc2UuCisJKGNoZWNrKTogUGFzcyBDQ19GT1JfSE9TVCBhbmQgQ0ZMQUdTX0ZPUl9IT1NUIHRvIHJ1bnRlc3QuCisKKwkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgZW1iZWRkZWRfcmVsb2NzLgorCSogbGRlbXVsLmggKGxkZW11bF9hZnRlcl9vcGVuLCBhZnRlcl9vcGVuX2RlZmF1bHQpOiBEZWNsYXJlLgorCShsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkIGFmdGVyX29wZW4uCisJKiBsZGVtdWwuYyAobGRlbXVsX2FmdGVyX29wZW4pOiBOZXcgZnVuY3Rpb24uCisJKGFmdGVyX29wZW5fZGVmYXVsdCk6IE5ldyBmdW5jdGlvbi4KKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDYWxsIGxkZW11bF9hZnRlcl9vcGVuLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1lbWJlZGRlZC1yZWxvY3MuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUKKwluZXcgYWZ0ZXJfb3BlbiBmaWVsZCB0byBhZnRlcl9vcGVuX2RlZmF1bHQuCisJKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSwgZW11bHRlbXBsL2dsZDk2MC5lbTogTGlrZXdpc2UuCisJKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2hwcGFlbGYuZW06IExpa2V3aXNlLgorCSogZW11bHRlbXBsL2xpbnV4LmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogTGlrZXdpc2UuCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0sIGVtdWx0ZW1wbC92YW5pbGxhLmVtOiBMaWtld2lzZS4KKwkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLWVtYmVkZGVkLXJlbG9jcy4KKworV2VkIE5vdiAyMyAyMjowNDo0NyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIGVzaGwuby4KKwkqIGNvbmZpZy9jb2ZmLXNoLm10OiBBZGQgc2hsIGVtdWxhdGlvbi4KKworVHVlIE5vdiAyMiAxMTo1NTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRmlsbCAudGV4dCBzZWN0aW9uIHdpdGggTk9QUy4gIEZyb20gRXJpYworCVlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPi4KKworVGh1IE5vdiAxNyAxNDozOTo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwlQYXRjaGVzIGZyb20gcGlya2VyQGVpdW5peC50dXdpZW4uYWMuYXQgKE1hcnRpbiBQaXJrZXIpLgorCSogY29uZmlnL2kzODZsaW51eC5taDogTmV3IGZpbGU7IHNldCBIT1NUSU5HX0NSVDAuCisJKiBnZW5zY3JpcHRzLnNoOiBEb24ndCBwdXQgJHtsaWJkaXJ9IGluIExJQl9QQVRIIGlmIGl0IGlzCisJL3Vzci9saWIsIHNpbmNlIHRoYXQgaXMgYWxyZWFkeSBpbiBMSUJfUEFUSC4KKworV2VkIE5vdiAxNiAxMDowMzowMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoLnRleHQpOiBIYW5kbGUgYSB1c2UgcmRlZmluZWQgdGV4dCBzdGFydAorCWFkZHJlc3MuCisJKC5kYXRhLCAuYnNzKTogSWYgIi1OIiwgdGhlbiBwbGFjZSB0aGUgZGF0YS9ic3MganVzdCBhZnRlciB0aGUgZW5kCisJb2YgdGhlIC50ZXh0IHNlY3Rpb24gcmF0aGVyIHRoYW4gYXQgdGhlIGRlZmF1bHQgMHg0MDAwMDAwMC4KKworCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoLnRleHQpOiBQbGFjZSB1bndpbmQgZGVzY3JpcHRvcnMgaW4gdGhlCisJdGV4dCBzZWdtZW50LgorCitTYXQgTm92IDEyIDE1OjU1OjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCVBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhaWIuY29tPjoKKwkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IERvbid0IHdhcm4gaWYgZW50cnkgc3ltYm9sIG5vdCBmb3VuZAorCXdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBXYXJuIGlmCisJYXR0ZW1wdGluZyB0byBwbGFjZSBhbiBvcnBoYW5lZCByZWxvY2F0aW9uIHNlY3Rpb24gd2hlbiBnZW5lcmF0aW5nCisJYSBkeW5hbWljYWxseSBsaW5rZWQgb2JqZWN0LgorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBFTlRSWSgke0VOVFJZfSksIGFuZCBkZWZhdWx0ICR7RU5UUll9IHRvCisJX3N0YXJ0LgorCitGcmkgTm92IDExIDE0OjI3OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIGV4cG9ydF9keW5hbWljLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1leHBvcnQtZHluYW1pYy4KKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgorCVBhc3MgZXhwb3J0X2R5bmFtaWMgYXJndW1lbnQgdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucy4KKworV2VkIE5vdiAgOSAxMjo0NzoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBTZXQgU0VDX0FMTE9DIGluIGFueSBzZWN0aW9uIHdoZXJlCisJd2UgYWxsb2NhdGUgY29tbW9uIHN5bWJvbHMuCisKK1R1ZSBOb3YgIDggMTc6NTA6NDMgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFpYi5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5yZWwuaW5pdCwgLnJlbGEuaW5pdCwgLnJlbC5maW5pLCBhbmQKKwkucmVsYS5maW5pIHRvIHRoZSBsaXN0IG9mIC5yZWwqIHNlY3Rpb25zLgorCitUdWUgTm92ICA4IDE3OjQ3OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IEFkZCBuZXcgYXJndW1lbnQgcGxhY2UuICBPbmx5IGFjY2VwdAorCWxpbmtlciBzY3JpcHRzIGlmIHBsYWNlIGlzIG5vdCBOVUxMLiAgUHV0IGNvbW1hbmRzIGZvdW5kIGluIGFuCisJYXNzdW1lZCBsaW5rZXIgc2NyaXB0IGludG8gcGxhY2UuCisJKGxvb2t1cF9uYW1lKTogUGFzcyBOVUxMIGFzIHBsYWNlIGFyZ3VtZW50IHRvIGxvYWRfc3ltYm9scy4KKwkob3Blbl9pbnB1dF9iZmRzKTogSW4gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSBjYXNlLCBwYXNzIGEgcGxhY2UKKwlhcmd1bWVudCB0byBsb2FkX3N5bWJvbHMsIGFuZCBzdG9yZSBhbnkgbmV3IHN0YXRlbWVudHMgYWZ0ZXIgdGhlCisJY3VycmVudCBvbmUuCisKK01vbiBOb3YgIDcgMTU6NTM6MDIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQnVtcCB0byAyLjUuMy4KKworRnJpIE5vdiAgNCAxNToxMToyNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZSpuYnNkLmMpOiBGaXggdHlwbyBpbiBkZXBlbmRlbmNpZXMuCisKK1RodSBOb3YgIDMgMTk6MzU6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogQWRkIG1pc3NpbmcgImVsc2UgdHJ1ZSIgY2xhdXNlLgorCisJKiBlbXVscGFyYW1zL3ZheC5zaCAoT1VUUFVUX0ZPUk1BVCk6IFVzZSAiYS5vdXQiLgorCisJKiBzY3JpcHR0ZW1wbC9nbzMyY29mZi5zYzogQ2hhbmdlcyBmcm9tIERKIERlbG9yaWU6IENoYW5nZSBkZWZhdWx0CisJZW50cnkgcG9pbnQgdG8gInN0YXJ0Ii4gIEFsaWduIGF0IGVuZCBvZiBlYWNoIHNlY3Rpb24gdG8gMHgyMDAuCisJU3RhcnQgLnRleHQgc2VjdGlvbiAweDEwMDAgbGF0ZXIuICBBZGQgX2V0ZXh0LCBfZWRhdGEsIF9lbmQKKwlzeW1ib2xzLgorCitXZWQgTm92ICAyIDEyOjE3OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRG9uJ3QgcGVybWl0IGEgc2V0IHRvIGJlCisJY29tcG9zZWQgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuCisJKGxkY3Rvcl9idWlsZF9zZXRzKTogSWYgdGhlIG91dHB1dCBmb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKwlyZWxvYywgYW5kIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0cnkgZ2V0dGluZworCXRoZSByZWxvYyBmcm9tIHRoZSBpbnB1dCBmb3JtYXQuCisKK1R1ZSBOb3YgIDEgMTA6MzA6MTkgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbTY4a25ic2Quby4KKwkgIChlbTY4a25ic2QuYyk6IE5ldyB0YXJnZXQuCisKKwkqIGNvbmZpZy9tNjhrLW5ic2QubXQ6IE5ldyBmaWxlLgorCSogZW11bHBhcmFtcy9tNjhrbmJzZC5zaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW4gKG02OCotKi1uZXRic2QqKTogVXNlIGFib3ZlIGNvbmZpZ3MuCisKK01vbiBPY3QgMzEgMTk6MzU6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBJZiB3ZSBmaW5kIGFuCisJYXBwcm9wcmlhdGVseSBuYW1lZCBzdGF0aWMgbGlicmFyeSwgc3RvcCB0aGUgc2VhcmNoIGF0IHRoYXQKKwlkaXJlY3RvcnkuCisKK1dlZCBPY3QgMjYgMTM6NTk6MTIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlaTM4Nm5ic2QubywgZW5zMzJrbmJzZC5vCisJICBhbmQgZXNwYXJjbmJzZC5vOyBzb3J0ZWQgZW50cmllcy4KKyAgICAgICAgICAoZWkzODZuYnNkLmMsZW5zMzJrbmJzZC5jLGVzcGFyY25ic2QuYyk6IE5ldyB0YXJnZXRzLgorCisJKiBjb25maWcvbmV0YnNkNTMyLm10OiBSZW1vdmVkLgorCSogZW11bHBhcmFtcy9uZXRic2Q1MzIuc2g6IFJlbW92ZWQuCisKKwkqIGNvbmZpZy97aTM4Ni1uYnNkLm10LG5zMzJrLW5ic2QubXQsc3BhcmMtbmJzZC5tdH06IE5ldyBmaWxlcy4KKwkqIGVtdWxwYXJhbXMve2kzODZuYnNkLnNoLG5zMzJrbmJzZC5zaCxzcGFyY25ic2Quc2h9OiBOZXcgZmlsZXMuCisJKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbmV0YnNkKiwgbnMzMmstcGM1MzItbmV0YnNkKiwKKwkgIHNwYXJjKi0qLW5ldGJzZCopOiBVc2UgYWJvdmUgY29uZmlncy4KKworVHVlIE9jdCAyNSAxMTo0NzoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGxkbWFpbi5jIChtdWx0aXBsZV9jb21tb24pOiBPbmUgb2YgdGhlIHR5cGVzIG1heSBub3cgYmUKKwliZmRfbGlua19oYXNoX2luZGlyZWN0LiAgVGhlIG9sZCBCRkQgYXJndW1lbnQgbWF5IGJlIE5VTEwuCisKK1RodSBPY3QgMjAgMjI6MDE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCAqIGF0IHRoZSBlbmQgb2YgbTY4ay1ocC1ocHV4LgorCitUdWUgT2N0IDE4IDE1OjU4OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbGRsZXgubDogQ2FzdCBhc3NpZ25tZW50IHRvIHl5X2NoX2J1ZiBmaWVsZCB0byBjaGFyICosIG5vdCB0bworCVlZX0NIQVIgKi4KKworTW9uIE9jdCAxNyAxNDo1MzoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL253LnNjOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQKKwkgIGRlZmluZSBfX0NUT1JfX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgorCitGcmkgT2N0IDE0IDE0OjM1OjM4IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2bncubyBhbmQgZXBwY253Lm8uCisJICAoZWkzODZudy5jLCBlcHBjbncuYyk6IE5ldyB0YXJnZXRzLgorCisJKiBjb25maWcve2kzODYscHBjfS1udy5tdCwgZW11bHBhcmFtcy97aTM4NixwcGN9bncuc2gsCisJICBzY3JpcHR0ZW1wbC9udy5zYzogTmV3IGZpbGVzLCBmb3IgaTM4NiBhbmQgcG93ZXJwYyBuZXR3YXJlLgorCisJKiBjb25maWd1cmUuaW46IENoYW5nZWQgbmV0d2FyZSBsZF90YXJnZXQgbmFtZSB0byBiZSB7aTM4NixwcGN9LW53CisJICBpbnN0ZWFkIG9mIHtpMzg2LHBwY30tZWxmLgorCisgCSogY29uZmlndXJlLmluIChzcGFyYyotKi1uZXR3YXJlKTogUmVtb3ZlZC4gIFRoZXJlIGlzIG5vIHN1Y2gKKwkgIHRoaW5nIGFueW1vcmUuCisKKwkqIGxkaW50LnRleGluZm86IE1vdmUgbWlzcGxhY2VkIGBAZW5kIGlmdGV4Jy4KKworRnJpIE9jdCAxNCAxMjowMjoxOCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWNAYWliLmNvbSkKKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgLnJlbC5jdG9ycywgLnJlbGEuY3RvcnMsIC5yZWwuZHRvcnMsIGFuZAorCS5yZWxhLmR0b3JzIHRvIHRoZSBsaXN0IG9mIC5yZWwqIHNlY3Rpb25zLgorCitUaHUgT2N0IDEzIDE0OjE2OjI3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNS4KKwkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgorCisJKiBjb25maWd1cmUuaW4gKGFsbF90YXJnZXRzKTogSGFuZGxlIGkzODYtbGludXgqLgorCitUaHUgT2N0IDEzIDExOjI0OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogU2V0IF9ldGV4dCBhbmQgX19ldGV4dCB0byAuLCBub3QKKwkke0RBVEFfQUxJR05NRU5UfS4gIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFN1bk9TLCBhbmQsIHdpdGggbHVjaywKKwl3aWxsIG5vdCBicmVhayBhbnkgb3RoZXIgc3lzdGVtLiAgRnJvbSBFcmljIFZhbGV0dGUKKwk8ZXZAY2hvcnVzLmZyPi4KKworV2VkIE9jdCAxMiAxNjoyMjo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIC1WIHRvIGJlIGEgc3lub255bSBmb3IgLXYuICBBZGQKKwktLXZlcmJvc2UgdG8gZ2V0IHRoZSBvbGQgLVYgYmVoYXZpb3VyLgorCSogbGQuMSwgbGQudGV4aW5mbzogRG9jdW1lbnQgdGhpcyBjaGFuZ2UuCisKK1R1ZSBTZXAgMjcgMTQ6NTY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlbW92ZQorCWFzc2VydGlvbiwgc2luY2UgaXQgY291bGQgZmFpbCB3aXRoIGEgdXNlciBkZWZpbmVkIGxpbmtlciBzY3JpcHQuCisKKwkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IEZvciBERUZJTkVEIGNhc2UsIGRvbid0IHRyeSB0byBsb29rIHVwIHRoZQorCW5hbWUgaW4gdGhlIGhhc2ggdGFibGUgZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS0tdGhlIGhhc2ggdGFibGUgZG9lcworCW5vdCBldmVuIGV4aXN0IGF0IHRoYXQgcG9pbnQsIG11Y2ggbGVzcyBoYXZlIHRoZSByaWdodCB2YWx1ZS4KKworCSogTWFrZWZpbGUuaW4gKENDKTogRGVmaW5lLgorCShDWFgpOiBNb3ZlIGRlZmluaXRpb24sIGNoYW5nZSBmcm9tIGcrKyB0byBnY2MuCisJKEVYUEVDVCwgUlVOVEVTVCk6IENvcHkgZGVmaW5pdGlvbnMgZnJvbSB0b3AgbGV2ZWwgTWFrZWZpbGUuaW4uCisJKFJVTlRFU1RfQ0MsIFJVTlRFU1RfQ0ZMQUdTKTogUmVtb3ZlLgorCShSVU5URVNUX0NYWCwgUlVOVEVTVF9DWFhGTEFHUyk6IFJlbW92ZS4KKwkoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBDb3B5IGZyb20gdG9wIGxldmVsIE1ha2VmaWxlLmluLgorCSguY2Mubyk6IENvbW1lbnQgb3V0LgorCSh0ZXN0ZGlyKTogUmVtb3ZlLgorCShzaXRlLmV4cCk6IERvbid0IGNyZWF0ZSB0ZXN0ZGlyIG9yIHNldCB0bXBkaXIuCisJKGNoZWNrKTogUnVuIGNoZWNrcyBldmVuIGlmIG5vdCBydW5uaW5nIG5hdGl2ZS4gIFVzZSBDQ19GT1JfVEFSR0VUCisJaW5zdGVhZCBvZiBSVU5URVNUX0NDLCBhbmQgbGlrZXdpc2UgZm9yIENYWC4KKwkoY2R0ZXN0IHRhcmdldHMpOiBDb21tZW50IG91dC4KKwkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSE9TVElOR19MSUJTKTogT25seSBtZW50aW9uIGNydGVuZC5vIG9uY2UuCisJKiBjZHRlc3QtYmFyLmNjLCBjZHRlc3QtZm9vLmNjLCBjZHRlc3QtZm9vLmg6IFJlbW92ZS4KKwkqIGNkdGVzdC1tYWluLmNjLCBjZHRlc3QuZXhwOiBSZW1vdmUuCisKK01vbiBTZXAgMjYgMTE6NDA6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaDogUmVuYW1lIGZyb20gZWxmMzJtaXBiLnNoIHRvIGF2b2lkIERPUworCWZpbGUgbmFtaW5nIHByb2JsZW1zLgorCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2g6IFJlbmFtZSBmcm9tIGVsZjMybWlwbC5zaC4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IFJlbmFtZSBlZWxmMzJtaXBiLm8gdG8KKwllZWxmMzJibWlwLm8gYW5kIGVlbGYzMm1pcGwubyB0byBlZWxmMzJsbWlwLm8uCisJKGVlbGYzMmJtaXAuYyk6IFJlbmFtZSBmcm9tIGVlbGYzMm1pcGIuYy4gIFVzZSBlbGYzMmJtaXAuc2guCisJKGVlbGYzMmxtaXAuYyk6IFJlbmFtZSBmcm9tIGVlbGYzMm1pcGwuYy4gIFVzZSBlbGYzMmxtaXAuc2guCisJKiBjb25maWcvbWlwc2ItZWxmMzIubXQgKEVNVUwpOiBVc2UgZWxmMzJibWlwLCBub3QgZWxmMzJtaXBiLgorCSogY29uZmlnL21pcHNsLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMybG1pcCwgbm90IGVsZjMybWlwbC4KKworCSogZ2Vuc2NyaXB0cy5zaDogQWx3YXlzIHNlYXJjaCAvdXNyL2xvY2FsL1RBUkdFVC9saWIuCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgLU4gaXMgc2V0LCBmb3JjZSBEQVRBX0FERFIgdG8gYmUgIi4iLgorCitGcmkgU2VwIDIzIDE1OjA1OjQ5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGkzODYtYnNkaSogdGFyZ2V0cyBsaWtlIGkzODYtYnNkLgorCitGcmkgU2VwIDIzIDAwOjA2OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgLWEgZm9yIEhQL1VYCisJY29tcGF0aWJpbGl0eS4KKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiAtYyB0YWtlcyBhbiBhcmd1bWVudC4KKworVHVlIFNlcCAyMCAxNDozNToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBuZXcgZmllbGQgZW5kaWFuLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLUVCIGFuZCAtRUwgYnkgc2V0dGluZworCWNvbW1hbmRfbGluZS5lbmRpYW4uCisJKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBBY2NlcHQgT1VUUFVUX0ZPUk1BVCB3aXRoIHRocmVlIGFyZ3VtZW50cy4KKwkqIGxkbGFuZy5jIChsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KTogQWRkIGFyZ3VtZW50cyBiaWcgYW5kIGxpdHRsZS4KKwlJZiBjb21tYW5kX2xpbmUuZW5kaWFuIGlzIHNldCwgdXNlIGl0IHRvIHNlbGVjdCBiaWcgb3IgbGl0dGxlCisJcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgorCSogbGRsYW5nLmggKGxhbmdfYWRkX291dHB1dF9mb3JtYXQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaDogRGVmaW5lIEJJR19PVVRQVVRfRk9STUFUIGFuZAorCUxJVFRMRV9PVVRQVVRfRk9STUFULgorCSogZW11bHBhcmFtcy9lbGYzMm1pcGwuc2g6IExpa2V3aXNlLgorCSogZW11bHBhcmFtcy9taXBzYmlnLnNoOiBMaWtld2lzZS4KKwkqIGVtdWxwYXJhbXMvbWlwc2JzZC5zaDogTGlrZXdpc2UuCisJKiBlbXVscGFyYW1zL21pcHNpZHQuc2g6IExpa2V3aXNlLgorCSogZW11bHBhcmFtcy9taXBzaWR0bC5zaDogTGlrZXdpc2UuCisJKiBlbXVscGFyYW1zL21pcHNsaXQuc2g6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBEZWZpbmUgQklHX09VVFBVVF9GT1JNQVQgYW5kCisJTElUVExFX09VVFBVVF9GT1JNQVQgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIFBhc3MgdGhlbSB0bworCU9VVFBVVF9GT1JNQVQuCisJKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBQYXNzIEJJR19PVVRQVVRfRk9STUFUIGFuZAorCUxJVFRMRV9PVVRQVVRfRk9STUFUIHRvIE9VVFBVVF9GT1JNQVQuCisJKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBMaWtld2lzZS4KKworCSogTWFrZWZpbGUuaW4gKGxkZ3JhbS5oKTogTWFrZSBzZXBhcmF0ZSB0YXJnZXQgZnJvbSBsZGdyYW0uYywKKwlkZXBlbmRpbmcgdXBvbiBsZGdyYW0uYywgc28gdGhhdCBhIHBhcmFsbGVsIG1ha2UgZG9lcyBub3QgdHJ5IHRvCisJYnVpbGQgYm90aCBhdCBvbmNlLgorCisJKiBjb25maWd1cmUuaW4gKG1pcHMqZWwtZWxmKik6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWVsZjMybWlwYi5vIGFuZCBlZWxmMzJtaXBsLm8uCisJKGVlbGYzMm1pcGwuYyk6IE5ldyB0YXJnZXQuCisKKwkqIGNvbmZpZy9taXBzbC1lbGYzMi5tdDogTmV3IGZpbGUuCisJKiBlbXVscGFyYW1zL2VsZjMybWlwbC5zaDogTmV3IGZpbGUuCisKK0ZyaSBTZXAgMTYgMTI6MTY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAobWFpbik6IFJhdGhlciB0aGFuIHByb2hpYml0aW5nIGxkIC1yIC1zLCB0cmVhdCBpdCBhcworCWxkIC1yIC1TIC14LgorCitUaHUgU2VwIDE1IDEzOjA1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGRtaXNjLmMgKHZmaW5mbyk6IFByaW50IEJGRCBmaWxlIG5hbWUgYXMgd2VsbCBhcyBmaWxlIG5hbWUKKwlyZXR1cm5lZCBieSBmaW5kX25lYXJlc3RfbGluZSwgaW4gY2FzZSB0aGUgZmlsZSBuYW1lIGlzIHNvbWV0aGluZworCXVuaGVscGZ1bCBzdWNoIGFzIGEgLmggZmlsZS4gIEhhbmRsZSAldS4KKworV2VkIFNlcCAxNCAxMjo0OToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6IE1ha2Ugc3VyZSBvdXRwdXQgc3RhdGVtZW50CisJaGFzIGFuIGF0dGFjaGVkIGJmZF9zZWN0aW9uIGJlZm9yZSB0cnlpbmcgdG8gZGVyZWZlcmVuY2UgaXQuCisKK1dlZCBTZXAgMTQgMTI6NDg6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBuZXcgZmllbGQgd2Fybl9vbmNlLgorCSogbGRtYWluLmMgKHVuZGVmaW5lZF9zeW1ib2wpOiBIYW5kbGUgLXdhcm4tb25jZS4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC13YXJuLW9uY2UuCisJKiBsZC50ZXhpbmZvIChPcHRpb25zKTogRG9jdW1lbnQgLXdhcm4tb25jZS4KKwkqIGxkLjE6IExpa2V3aXNlLgorCisJKiBsZG1pc2MuYyAodmZpbmZvKTogSGFuZGxlICVEIGFzICVDLCBidXQgbmV2ZXIgcHJpbnQgdGhlIGZ1bmN0aW9uCisJbmFtZS4gIEZvciAlQywgcHJpbnQgdGhlIGZ1bmN0aW9uIG5hbWUgb24gYSBzZXBhcmF0ZSBsaW5lLCB0byBrZWVwCisJdGhlIGxlbmd0aCBvZiBlcnJvciBtZXNzYWdlcyB1bmRlciBjb250cm9sLgorCSogbGRtYWluLmMgKG11bHRpcGxlX2RlZmluaXRpb24pOiBVc2UgJUQgZm9yIGBgZmlyc3QgZGVmaW5lZAorCWhlcmUuJycKKwkodW5kZWZpbmVkX3N5bWJvbCk6IFVzZSAlRCBmb3IgYGBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzCisJZm9sbG93JycuCisKKwkqIGxkbWlzYy5jIChtdWx0aXBsZV93YXJuKTogUmVtb3ZlOyBubyBsb25nZXIgdXNlZC4KKwkqIGxkbWlzYy5oIChtdWx0aXBsZV93YXJuKTogRG9uJ3QgZGVjbGFyZS4KKworVHVlIFNlcCAxMyAyMDo0Nzo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUHJpbnQgYWxsIGxpbmVzCisJdG8gdGhlIG1hcCBmaWxlLgorCitUdWUgU2VwIDEzIDE2OjMwOjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IENoZWNrIGZvciBhcmNoaXZlIGJlZm9yZSBvYmplY3QuICBVc2UKKwliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMsIGFuZCwgaWYgYW1iaWd1b3VzLCBwcmludCBhIGxpc3Qgb2YKKwltYXRjaGluZyBmb3JtYXRzLiAgSWYgZmlsZSBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQsIHRyZWF0IGZpbGUgYXMKKwlhIGxpbmtlciBzY3JpcHQuCisJKiBsZGdyYW0ueSAoeXllcnJvcik6IElmIGFzc3VtaW5nIGFuIG9iamVjdCBmaWxlIGlzIGEgc2NyaXB0LAorCW1lbnRpb24gdGhhdC4gIFR3ZWFrIHRoZSBmb3JtYXQgb2YgdGhlIGVycm9yIG1lc3NhZ2VzLgorCSogbGRsZXgubCAobGV4X3dhcm5faW52YWxpZCk6IElmIGFzc3VtaW5nIGFuIG9iamVjdCBpcyBhIHNjcmlwdCwKKwlndWVzcyB0aGF0IHRoaXMgaXMgbm90IGFjdHVhbGx5IGEgc2NyaXB0LCBhbmQganVzdCByZXBvcnQgdGhhdCB0aGUKKwlmaWxlIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQuCisJKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQWRtaXQgdGhhdCAtKCBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZS4KKwlBZGQgbm90ZSB0aGF0IHVucmVjb2duaXplZCBvYmplY3QgZmlsZXMgYXJlIG5vdyB0cmVhdGVkIGFzIGxpbmtlcgorCXNjcmlwdHMuCisKKwkqIGxkZmlsZS5jIChsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOiBNYWtlIGNvbnN0LgorCShsZGZpbGVfYXNzdW1lZF9zY3JpcHQpOiBOZXcgdmFyaWFibGUuCisJKHRyeV9vcGVuKTogQ2hhbmdlIGFyZ3VtZW50cyB0eXBlcyB0byBjb25zdC4KKwkobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogTGlrZXdpc2UuCisJKGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSk6IExpa2V3aXNlLiAgQWxzbywgc2V0IGxpbmVubyB0byAxLgorCSogbGRmaWxlLmg6IFVwZGF0ZSBkZWNsYXJhdGlvbnMgZm9yIGxkZmlsZS5jIGNoYW5nZXMuCisJKiBsZGxleC5sOiBJbmNsdWRlIDxjdHlwZS5oPi4KKwkoZmlsZV9uYW1lX3N0YWNrKTogQ2hhbmdlIHRvIGJlIGNvbnN0IGNoYXIgKi4KKwkobGluZW5vX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkoPDxFT0Y+Pik6IFNldCBsaW5lbm8gYXMgd2VsbCBhcyBsZGZpbGVfaW5wdXRfZmlsZW5hbWUuCisJKGxleF9wdXNoX2ZpbGUpOiBNYWtlIG5hbWUgYXJndW1lbnQgY29uc3QuICBJbml0aWFsaXplCisJbGluZW5vX3N0YWNrIGVudHJ5LgorCShsZXhfcmVkaXJlY3QpOiBJbml0aWFsaXplIGxpbmVub19zdGFjayBlbnRyeS4KKwkobGV4X3dhcm5faW52YWxpZCk6IEhhbmRsZSBub24gcHJpbnRhYmxlIGNoYXJhY3RlcnMgbmljZWx5LgorCSogbGRsZXguaCAobGV4X3B1c2hfZmlsZSk6IERlY2xhcmUgc2Vjb25kIGFyZ3VtZW50IGFzIGNvbnN0LgorCisJKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBSZWNvZ25pemUgR1JPVVAuCisJKiBsZGxleC5sOiBSZWNvZ25pemUgR1JPVVAuCisJKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCBHUk9VUC4KKworTW9uIFNlcCAxMiAxNzowNDoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tNjhrbHlueC5taDogTmV3IGZpbGUuCisKK01vbiBTZXAgMTIgMDE6NTA6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBBZGQgbmV3bGluZXMgdG8gdGhlIGVycm9yIG1lc3NhZ2VzLgorCitTYXQgU2VwIDEwIDE2OjA1OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODZseW54Lm1oOiBOZXcgZmlsZS4KKwkqIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBEb24ndCBwdXQgLmN0b3JzIGFuZCAuZHRvcnMgaW4gLnRleHQKKwl1bmxlc3MgQ09OU1RSVUNUSU5HLgorCitUaHUgU2VwICA4IDEzOjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCisJKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZSBhcyB5ZXMuCisJKERZTkFNSUNfTElOSyk6IERlZmluZSBhcyBmYWxzZS4KKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKKwlJbml0aWFsaXplIGNvbmZpZy5keW5hbWljX2xpbmsgdG8gRFlOQU1JQ19MSU5LIGlmIGl0IGlzIGRlZmluZWQuCisJKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IFJlc2V0IHN0YXRfcHRyIGF0IGVuZC4KKwkqIE1ha2VmaWxlLmluIChlZWxmMzJtaXBiLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSByYXRoZXIgdGhhbgorCWdlbmVyaWMuZW0uCisKK1RodSBTZXAgIDggMTY6MzA6MzcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworICAgICAgICAqIHNjcmlwdHRlbXBsL2g4NTAwYi5zYzogUHV0IHJkYXRhIHN0dWZmIGludG8gb3duIHNlZ21lbnQuCisKK1RodSBTZXAgIDggMTM6MjU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBEb24ndCBkZWZpbmU7CisJLmdvdCBzZWN0aW9uIGlzIG5vdyBleHBsaWNpdGx5IGhhbmRsZWQgaW4gZWxmLnNjLgorCitXZWQgU2VwICA3IDEzOjA4OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IFJlZG8gc2NyaXB0IHRvIHNldCAuIG91dHNpZGUgb2Ygc2VjdGlvbnMKKwlhbmQgbm90IGJvdGhlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgc2VjdGlvbiBhZGRyZXNzZXMuCisJRXhwbGljaXRseSBwbGFjZSAuc2RhdGEgc2VjdGlvbi4KKworVHVlIFNlcCAgNiAyMzo1MTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBQdXQgLmJzcyBpbiBkYXRhIHNlZ21lbnQuCisKKwkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBDaGFuZ2UgLnN0YWIgYW5kIC5zdGFic3RyIHRvIHVzZSBhIFZNQSBvZgorCTAsIGFuZCB0byBvbmx5IGJlIG1hcmtlZCBhcyBOT0xPQUQgaWYgcmVsb2NhdGluZy4KKwkqIHNjcmlwdHRlbXBsL2g4NTAwLnNjLCBzY3JpcHR0ZW1wbC9oODUwMGIuc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvaDg1MDBjLnNjLCBzY3JpcHR0ZW1wbC9oODUwMG0uc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvaDg1MDBzLnNjLCBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogTGlrZXdpc2UuCisJKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYywgc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MsIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBMaWtld2lzZS4KKwkqIHNjcmlwdHRlbXBsL3NoLnNjLCBzY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2M6IExpa2V3aXNlLgorCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBMaWtld2lzZS4KKworU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCAoZGlzYWJsZWQpIHRoZSBBUk0vUklTQ2lYLgorCSogY29uZmlnL3Jpc2NpeC5tdCwgZW11bHBhcmFtcy9yaXNjaXguc2gsIHNjcmlwdHRlbXBsL3Jpc2NpeC5zYzoKKwlOZXcgZmlsZXMuCisKK1R1ZSBBdWcgMzAgMTE6NDg6MDggMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQorCisJKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgZmllbGQgc29uYW1lLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLXNvbmFtZSBhcmd1bWVudC4KKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogSW4gY2FsbCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAorCXBhc3Mgc29uYW1lLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXNvbmFtZS4KKworTW9uIEF1ZyAyOSAxNToyMTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogRG9uJ3QgdHJ5IHRvIHNldCB0aGUgYXJjaGl0ZWN0dXJlIGlmIHRoZQorCWlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIGluY29tcGF0aWJsZS4gIEp1c3Qgd2Fybi4KKworV2VkIEF1ZyAyNCAxMjo1MjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCisKK1N1biBBdWcgMjEgMTY6MTc6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbXVscGFyYW1zL2hwM2hwdXguc2g6IERlZmluZSBfX0RZTkFNSUMgdG8gYmUgMC4KKworVGh1IEF1ZyAxOCAxNTozNzo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwlNYWtlIHRoZSBFTEYgbGlua2VyIGhhbmRsZSBvcnBoYW5lZCBzZWN0aW9ucyByZWFzb25hYmx5LiAgQWxzbywKKwlkZWZpbmUgX19zdGFydF9TRUNOQU1FIGFuZCBfX3N0b3BfU0VDTkFNRSBhcm91bmQgc2VjdGlvbnMgd2hvc2UKKwluYW1lcyBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gQywgZm9yIHRoZSBiZW5lZml0IG9mIHN5bWJvbCBzZXRzIGluCisJZ2xpYmMuCisJKiBsZGVtdWwuaCAobGRlbXVsX3BsYWNlX29ycGhhbik6IERlY2xhcmUuCisJKGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUpOiBBZGQgcGxhY2Vfb3JwaGFuIGZpZWxkLgorCSogbGRlbXVsLmMgKGxkZW11bF9wbGFjZV9vcnBoYW4pOiBOZXcgZnVuY3Rpb24uCisJKiBsZGxhbmcuaCAod2lsZF9kb2l0KTogRGVjbGFyZS4KKwkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBNYWtlIG5vbnN0YXRpYy4KKwkobGFuZ19wbGFjZV9vcnBoYW5zKTogQ2FsbCBsZGVtdWxfcGxhY2Vfb3JwaGFuLgorCSogZW11bHRlbXBsL2VsZjMyLmVtOiBJbmNsdWRlIDxjdHlwZS5oPiBhbmQgImxkZ3JhbS5oIi4KKwkoaG9sZF9zZWN0aW9uLCBob2xkX3VzZSwgaG9sZF90ZXh0LCBob2xkX2RhdGEsIGhvbGRfYnNzKTogTmV3CisJc3RhdGljIHZhcmlhYmxlcy4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IEluaXRpYWxpemUgcGxhY2Vfb3JwaGFuIGZpZWxkLgorCitUdWUgQXVnIDE2IDAwOjE3OjIwIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogQWRkIC5saW51eC1keW5hbWljIGFmdGVyIC5kYXRhLgorCitUdWUgQXVnIDE2IDAwOjA4OjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpIFRyZWF0IC0tZGxsLXZlcmJvc2UgYXMgLS12ZXJzaW9uLCBmb3IKKwlMaW51eCBjb21wYXRpYmlsaXR5LiAgRnJvbSBoamxAbnluZXhzdC5jb20gKEguSi4gTHUpLgorCitNb24gQXVnIDE1IDE3OjE3OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGRleHAuaCAoZXhwX2dldF9hYnNfaW50KTogRGVjbGFyZS4KKworU2F0IEF1ZyAgNiAwMTo0NTozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6ICBIYW5kbGUgY29tcGxleCBBVCdzIGJldHRlci4KKwkqIGxkZXhwLmMgKGV4cF9nZXRfYWJzX2ludCk6ICBOZXcgZnVuY3Rpb24uCisKK0ZyaSBBdWcgIDUgMjA6NTU6NTUgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBhZGQgaTk2MC1uaW5keS1jb2ZmIHN1cHBvcnQuCisKK1RodSBBdWcgIDQgMTQ6NDU6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBsZGxleC5sICh5eV9jcmVhdGVfc3RyaW5nX2J1ZmZlcik6IEhhbmRsZSBjaGFuZ2UgdG8gaW50ZXJuYWwKKwlpbnRlcmZhY2UgaW4gZmxleCAyLjQuNy4KKworVHVlIEF1ZyAgMiAxMTo1MjowNiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCisKKwkqIGVtdWx0ZW1wbC9saW51eC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hZGRyZXNzX3N0YXRlbWVudCk6CisJTmV3IGZ1bmN0aW9uOyBhZGQgMHgyMCB0byBhbnkgdXNlIG9mIC1UdGV4dC4KKwkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBOZXcKKwlmdW5jdGlvbi4KKwkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIHRoZSBuZXcgZnVuY3Rpb24KKwlnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cy4KKworTW9uIEF1ZyAgMSAxNTo1MDo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IFJlZG8gc2NyaXB0IHRvIHNldCAuIG91dHNpZGUgb2Ygc2VjdGlvbnMKKwlhbmQgbm90IGJvdGhlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgc2VjdGlvbiBhZGRyZXNzZXMuCisKK1R1ZSBKdWwgMjYgMTE6MDI6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IENvcHkgc2V2ZXJhbCBtb3JlIHJlbG9jYXRpb24gc2VjdGlvbnMgaW50bworCXRoZSBvdXRwdXQuICBQdXQgLmdvdC5wbHQgc2VjdGlvbnMgaW50byAuZ290LgorCitGcmkgSnVsIDIyIDEyOjE1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgUFJPVklERSB0byBkZWZpbmUgZXRleHQsIGVkYXRhLCBhbmQgZW5kLgorCisJQWRkIGEgbmV3IHNjcmlwdCBvcGVyYXRvciwgUFJPVklERSwgdG8gZGVmaW5lIGEgc3ltYm9sIG9ubHkgaWYgaXQKKwlpcyBuZWVkZWQuCisJKiBsZGdyYW0ueSAoUFJPVklERSk6IE5ldyB0b2tlbi4KKwkoYXNzaWdubWVudCk6IEFjY2VwdCBQUk9WSURFLgorCSogbGRsZXgubCAoUFJPVklERSk6IE5ldyB0b2tlbi4KKwkqIGxkZXhwLmggKG5vZGVfdHlwZSk6IEFkZCBldHJlZV9wcm92aWRlIHRvIG5vZGVfY2xhc3MgZW51bS4KKwkoZXhwX3Byb3ZpZGUpOiBEZWNsYXJlLgorCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IEhhbmRsZSBldHJlZV9wcm92aWRlLgorCShleHBfcHJvdmlkZSk6IE5ldyBmdW5jdGlvbi4KKwkoZXhwX3ByaW50X3RyZWUpOiBIYW5kbGUgZXRyZWVfcHJvdmlkZS4KKwkqIGxkLnRleGluZm86IERvY3VtZW50IFBST1ZJREUuCisKKwkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IFBhc3MgZGVzaXJlZCBhbGlnbm1lbnQgdG8KKyAgICAgICAgbGFuZ19vbmVfY29tbW9uIGFzIHBvd2VyIG9mIHR3by4KKwkobGFuZ19vbmVfY29tbW9uKTogR2V0IGNvbW1vbiBzeW1ib2wgYWxpZ25tZW50IGZyb20gbGlua2VyIGhhc2gKKwl0YWJsZSBlbnRyeS4gIFRyZWF0IGRlc2lyZWQgYWxpZ25tZW50IGFzIGEgcG93ZXIgb2YgdHdvLgorCisJKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogQXR0YWNoIGFsbCBzZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsCisJbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4gIElmIHRoZXJlIGlzIG5vIG5hbWUsIGF0dGFjaCBhbGwgc2VjdGlvbnMKKwlldmVuIGlmIHRoZSBTRUNfSVNfQ09NTU9OIGZsYWcgaXMgc2V0LgorCitXZWQgSnVsIDIwIDE1OjQ5OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIHJwYXRoLgorCSogbGV4c3VwLmMgKFNfSVNESVIpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KKwkocGFyc2VfYXJncyk6IEFkZCBzdXBwb3J0IGZvciAtcnBhdGguICBJZiAtUiBpcyB1c2VkIHRvIG5hbWUgYQorCWRpcmVjdG9yeSwgdHJlYXQgaXQgYXMgLXJwYXRoIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKKwlQYXNzIGNvbW1hbmRfbGluZS5ycGF0aCB0byBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zLgorCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbW1hbmRfbGluZS5ycGF0aCB0byBOVUxMLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgLXJwYXRoIG9wdGlvbi4KKworU3VuIEp1bCAxMCAwMDozMzoyNCAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKKworCSogZW11bHBhcmFtcy9wYzUzMm1hY2hhb3V0LnNoOiBOZXcgZmlsZS4gUGM1MzIgbWFjaCBzY3JpcHQKKwlwYXJhbWV0ZXJzLgorCisJKiBlbXVscGFyYW1zL25ldGJzZDUzMi5zaDogTmV3IGZpbGUuIE5ldGJzZCA1MzIgc2NyaXB0IHBhcmFtZXRlcnMuCisKKwkqIGNvbmZpZy9wYzUzMm1hY2gubXQ6IE5ldyBmaWxlLiBQYzUzMiBtYWNoIHRhcmdldCBzdXBwb3J0LgorCisJKiBjb25maWcvcGM1MzJtYWNoLm1oOiBOZXcgZmlsZS4gUGM1MzIgbWFjaCBob3N0IHN1cHBvcnQuCisKKwkqIGNvbmZpZy9uZXRic2Q1MzIubXQ6IE5ldyBmaWxlLiBOZXRic2QgNTMyIHRhcmdldCBzdXBwb3J0LgorCisJKiBjb25maWd1cmUuaW46IEFkZCBuczMyay1wYzUzMi1tYWNoIGFuZCBuczMyay1wYzUzMi1uZXRic2Qgc3VwcG9ydC4KKworCSogTWFrZWZpbGUuaW46IEFkZCBlcGNtYWNoYW91dC5jIGRlcGVuZGVuY3kgYW5kIGVuZXRic2Q1MzIuYworCWRlcGVuZGVuY3kuCisKK0ZyaSBKdWwgIDggMTA6NTc6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlCisJYmZkX2Fic19zZWN0aW9uX3B0ciwgbm90ICZiZmRfYWJzX3NlY3Rpb24uCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQ2hhbmdlZCAicmV0YWluLXN5bWJvbHMtZmlsZSIgZnJvbQorCW5vX2FyZ3VtZW50IHRvIHJlcXVpcmVkX2FyZ3VtZW50LiAgRnJvbSBkam0uCisKK1RodSBKdWwgIDcgMTI6Mjk6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEV4cGxpY2l0bHkgbWVudGlvbiAuc3RhYiBhbmQgLnN0YWJzdHIKKwlzZWN0aW9ucyB0byBmb3JjZSBhIFZNQSBvZiAwOyBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlCisJbm90IGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIHN0eWxlLgorCitNb24gSnVsICA0IDE5OjM1OjQ1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjIChfX3N0YWNrX3plcm8pOiBEb24ndCBkZWZpbmUgdGhpcyBuYW1lLAorCWl0IHdhcyBmb3IgdGhlIEhQVVggZHluYW1pYyBsb2FkZXIncyB1c2UgYW5kIGl0IGNyZWF0ZXMgcHJvYmxlbXMKKwl3aXRoIEVMRiBHREIuCisKK0ZyaSBKdWwgIDEgMTI6NTM6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGxkbGFuZy5jIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTm8gbG9uZ2VyIHN0YXRpYy4gIERlbGV0ZSBkZWNsLgorCSogbGRsYW5nLmggKGxhbmdfZG9fYXNzaWdubWVudHMpOiBQdXQgZXh0ZXJuYWwgZGVjbCBoZXJlLgorCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IE1pbm9yIGNsZWFudXBzIHRocm91Z2hvdXQgZmlsZS4KKwkoaHBwYV9lbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBSZXdyaXRlLgorCShocHBhZWxmX2ZpbmlzaCk6IFJld3JpdGUuCisKK1dlZCBKdW4gMjkgMTY6NTA6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWcvc29sYXJpczIubWggKE5BVElWRV9MSUJfRElSUyk6IERlZmluZSBhcyAvdXNyL2Njcy9saWIuCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC1Cc3RhdGljIGFuZCAtQmR5bmFtaWMuICBEbyBub3QKKwlhY2NlcHQgcGxhaW4gLUIuCisJKiBsZC50ZXhpbmZvOiAtQnN0YXRpYyBpcyBub3QgaWdub3JlZC4KKworVHVlIEp1biAyOCAxMjoxMzozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGxkbGV4Lmw6IFJlY29nbml6ZSBcciB0aGUgc2FtZSBhcyBcbi4KKworVGh1IEp1biAyMyAxNzo1MzowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIHNoYXJlZCBsaWJyYXJpZXMsIGZyb20gRXJpYworCVlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisJKiBnZW5zY3JpcHRzLnNoOiBJZiB0aGUgZW11bGF0aW9uIHBhcmFtZXRlciBmaWxlIHNldHMKKyAgICAgICAgR0VORVJBVEVfU0hMSUJfU0NSSVBULCBnZW5lcmF0ZSBhIC54cyBzY3JpcHQgZmlsZSB3aXRoCisJQ1JFQVRFX1NITElCIGRlZmluZWQuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQpOiBJZgorCWxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LCB1c2UgdGhlIC54cyBzY3JpcHQgZmlsZS4KKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSWYgQ1JFQVRFX1NITElCIGlzIHNldCwgZG9uJ3QgY3JlYXRlIGEKKwkuaW50ZXJwIHNlY3Rpb24sIGFuZCBkb24ndCBpbmNsdWRlIFRFWFRfU1RBUlRfQUREUiBpbiB0aGUgc3RhcnRpbmcKKwlhZGRyZXNzIG9mIHRoZSBmaXJzdCBzZWN0aW9uLgorCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogTGlrZXdpc2UuCisJKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIChHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUuCisKK1RodSBKdW4gMjMgMTI6NTI6MjIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgorCitXZWQgSnVuIDIyIDEzOjQyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IG9wdGlvbnMgLSggLSkgd2l0aAorCXN5bm9ueW1zIC0tc3RhcnQtZ3JvdXAgLS1lbmQtZ3JvdXAuCisJKiBsZGxhbmcuaCAoZW51bSBzdGF0ZW1lbnRfZW51bSk6IEFkZCBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLgorCShsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlKTogRGVmaW5lIG5ldyBzdHJ1Y3QuCisJKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpOiBBZGQgZ3JvdXBfc3RhdGVtZW50IGZpZWxkLgorCShsYW5nX2VudGVyX2dyb3VwLCBsYW5nX2xlYXZlX2dyb3VwKTogRGVjbGFyZS4KKwkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIpOiBIYW5kbGUKKwlsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLgorCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zLCBwcmludF9zdGF0ZW1lbnQpOiBMaWtld2lzZS4KKwkobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCisJKG9wZW5faW5wdXRfYmZkcyk6IENvbXBsZXRlbHkgcmV3cml0ZS4gIE5vdyBkb2VzIGl0cyBvd24gbG9vcGluZywKKwlyYXRoZXIgdGhhbiB1c2luZyBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEhhbmRsZSBncm91cHMuCisJKGxhbmdfcHJvY2Vzcyk6IFVwZGF0ZSBjYWxsIHRvIG9wZW5faW5wdXRfYmZkcy4KKwkocHJpbnRfZ3JvdXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShsYW5nX2VudGVyX2dyb3VwLCBsYW5nX2xlYXZlX2dyb3VwKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCisJKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IElmIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KKwlvcGVuZWQsIGp1c3QgcmV0dXJuIHJhdGhlciB0aGFuIHRha2luZyBhbiBhc3NlcnRpb24gZmFpbHVyZS4KKwkqIGxkdmVyLmMgKGhlbHApOiBNZW50aW9uIG5ldyBvcHRpb25zLgorCSogbGQudGV4aW5mbzogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCisKKwkqIGxkbGFuZy5jIChlbmRfb2ZfZGF0YV9zZWN0aW9uX3N0YXRlbWVudF9saXN0KTogRG9uJ3QgZGVmaW5lLgorCShsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IERvbid0IHNldCBvYnNvbGV0ZSB2YXJpYWJsZQorCWVuZF9vZl9kYXRhX3NlY3Rpb25fc3RhdGVtZW50X2xpc3QuCisKKwkqIHNjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjOiBEb24ndCBwdXQgJHtEQVRBX0FMSUdOTUVOVH0gaW5zaWRlIGFuCisJQUxJR04uCisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBBZGp1c3QgY3VycmVudCByZWdpb24gYWRkcmVzcworCWV2ZW4gZm9yIHNlY3Rpb25zIHdpdGggYW4gZXhwbGljaXQgYWRkcmVzcy4gIEZyb20KKwlyYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoIENhbXBiZWxsKS4KKworCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IFNldCB0byAwLgorCUZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCisKKwkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IExldCBzZWN0aW9ucyBhbGlnbiB0byB0aGVpciBuYXR1cmFsCisJYm91bmRhcmllcy4KKworVHVlIEp1biAyMSAxMToyNzowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX2luaXQpOiBVc2UgbmV3IGJmZF9hYnNfc2VjdGlvbl9wdHIsIG5vdAorCSZiZmRfYWJzX3NlY3Rpb24uCisJKGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YpOiBMaWtld2lzZS4KKwkobGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZik6IExpa2V3aXNlLgorCShsYW5nX3NpemVfc2VjdGlvbnMpOiBVc2UgYmZkX2lzX2Fic19zZWN0aW9uIHRvIGNoZWNrIGZvciB0aGUKKwlhYnNvbHV0ZSBzZWN0aW9uLiAgRG9uJ3QgdHJ5IHRvIHNldCB0aGUgVk1BIG9yIG91dHB1dF9vZmZzZXQgb3IKKwlzaXplIG9mIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgorCSogbGRtYWluLmMgKG5vdGljZV95c3ltKTogVXNlIGJmZF9pc191bmRfc2VjdGlvbiB0byBjaGVjayBmb3IgdGhlCisJdW5kZWZpbmVkIHNlY3Rpb24uCisKK1RodSBKdW4gMTYgMjI6NDg6NDEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2M6IFBsYWNlIC5kYXRhIGFuZCAuYnNzIGF0IDB4NDAwMDAwMDAKKwl3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGFibGUgb2JqZWN0cy4KKworVGh1IEp1biAxNiAxNDoyNToyMiAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCisKKwkqIGVtdWx0ZW1wbC9saW51eC5lbTogTmV3IGZpbGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIGxpbmtpbmcKKwlhZ2FpbnN0IExpbnV4IHNoYXJlZCBsaWJyYXJpZXMuCisJKiBjb25maWcvaTM4Ni1saW51eC5tdCAoZWkzODZsaW51eC5jKTogRGVwZW5kIHVwb24gbGludXguZW0uCisJKiBlbXVscGFyYW1zL2kzODZsaW51eC5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBsaW51eC4KKworVGh1IEp1biAxNiAxMjoyMjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIC1zaGFyZWQgdG8gbG9uZ29wdHMsIGFuZCBoYW5kbGUgaXQuCisJKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLnNoYXJlZCB0byBmYWxzZS4gIEdpdmUKKwllcnJvciBpZiBsaW5rX2luZm8ucmVsb2NhdGVhYmxlIGFuZCBsaW5rX2luZm8uc2hhcmVkIGFyZSBib3RoIHNldC4KKworCSogY29uZmlndXJlLmluOiBJZiBFTVVMX0VYVFJBKiBpcyBkZWZpbmVkIGluIGEgY29uZmlnIGZpbGUsIHRyZWF0CisJaXQgYXMgbmFtaW5nIGFuIGVtdWxhdGlvbiB0byBiZSBhZGRlZCB0byBFTVVMQVRJT05fT0ZJTEVTLgorCSogY29uZmlnL2kzODYtbGludXgubXQgKEVNVUxfRVhUUkExKTogRGVmaW5lIGFzIGVsZl9pMzg2LgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCisJKEFMTF9FTVVMQVRJT05TKTogQWRkIGVpMzg2bGludXgubywgZWVsZjMyX3NwYXJjLm8sCisJZWVsZjY0X3NwYXJjLm8uICBSZW1vdmUgJChPVEhFUl9FTVVMQVRJT05TKS4KKwkoZWkzODZsaW51eC5jLCBlZWxmMzJfc3BhcmMuYywgZWVsZjY0X3NwYXJjLmMpOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgorCShlaTM4NmxpbnV4LmMpOiBSZW1vdmU7IG5vdyBpbiBNYWtlZmlsZS5pbi4KKwkqIGNvbmZpZy9pMzg2LWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvbTY4ay1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgorCSogY29uZmlnL3NwYXJjLWx5bngubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcvc3BhcmM2NC1lbGYubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCisJKGVlbGY2NF9zcGFyYy5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCisJKiBjb25maWcvc3VuNHNvbDIubXQgKE9USEVSX0VNVUxBVElPTlMpOiBEb24ndCBkZWZpbmUuCisJKGVlbGYzMl9zcGFyYy5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCisKKwkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogRG9uJ3QgY3Jhc2ggaWYgZXRyZWVfcmVsIHNlY3Rpb24gaGFzCisJbm8gb3duZXItLWl0IG1pZ2h0IGJlIGJmZF9hYnNfc2VjdGlvbi4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKKwk8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCisKKwkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IExldCBzZWN0aW9ucyBhbGlnbiB0byB0aGVpciBuYXR1cmFsCisJYm91bmRhcmllcy4KKworV2VkIEp1biAxNSAwMTo1NDo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkZW11bC5oIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBEZWNsYXJlLgorCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIG5ldyBmaWVsZCBvcGVuX2R5bmFtaWNfYXJjaGl2ZS4KKwkqIGxkZW11bC5jOiBJbmNsdWRlIGxkZXhwLmggYW5kIGxkbGFuZy5oLgorCShsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24uCisJKiBsZGZpbGUuaCAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBEZWNsYXJlLgorCSogbGRmaWxlLmM6IEluY2x1ZGUgbGRlbXVsLmguCisJKHRyeV9vcGVuX2JmZCk6IFJlbmFtZSBmcm9tIGNhY2hlX2JmZF9vcGVuci4gIFJldHVybiBib29sZWFuCisJYXJndW1lbnQsIG5vdCBiZmQgKi4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBSZW5hbWUgZnJvbSBvcGVuX2EuICBSZXR1cm4gYm9vbGVhbgorCWFyZ3VtZW50LCBub3QgYmZkICouICBDbGVhbiB1cC4gIENoYW5nZSBhbGwgY2FsbGVycy4KKwkobGRmaWxlX29wZW5fZmlsZSk6IElmIGRvaW5nIGEgZHluYW1pYyBsaW5rLCBjYWxsCisJbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoZSBleHRlbnNpb24gb2YKKwlhIGR5bmFtaWMgb2JqZWN0IGlzICIuc28iLgorCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6CisJTmV3IGZ1bmN0aW9uLgorCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIG9wZW5fZHluYW1pY19hcmNoaXZlCisJZmllbGQuCisJKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IExpa2V3aXNlLgorCisJKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IElnbm9yZSAtbTQ4NiBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSWdub3JlIC1xbWFnaWMgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkuCisJQWNjZXB0IC1zdGF0aWMgYXMgYSBzeW5vbnltIGZvciAtbm9uX3NoYXJlZC4KKworCUxldCB0aGUgdXNlciBjaGFuZ2UgdGhlIGR5bmFtaWMgbGlua2VyIHVzZWQgYnkgRUxGIGNvZGUuCisJKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGludGVycHJldGVyLgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgZHluYW1pYy1saW5rZXIgdG8gbG9uZ29wdHMsIGFuZAorCWhhbmRsZSBpdC4KKwkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgdG8gTlVMTC4KKwkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBHZXQKKwl0aGUgRUxGIGJhY2tlbmQgdG8gcmV0dXJuIHRoZSAuaW50ZXJwIHNlY3Rpb24uICBJZgorCWNvbW1hbmRfbGluZS5pbnRlcnByZXRlciBpcyBub3QgTlVMTCwgc2V0IHRoZSBjb250ZW50cyBvZiAuaW50ZXJwCisJdG8gaXQuCisJKiBsZC50ZXhpbmZvOiBNZW50aW9uIC1keW5hbWljLWxpbmtlci4KKworCSogY29uZmlnL3N1bjRzb2wyLm10IChlZWxmMzJfc3BhcmMuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QKKwlnZW5lcmljLmVtLgorCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNvcnQgb3V0IHRoZSBvcHRpb24gbWFjcm9zIGFuZCBjaGFuZ2UgdGhlCisJZGVmaW5pdGlvbnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIGEgbmV3IG9wdGlvbi4KKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRGVmaW5lIF9fZXRleHQgYW5kIF9fZWRhdGEgdG8gZ28gYWxvbmcgd2l0aAorCV9ldGV4dCBhbmQgX2VkYXRhLgorCisJKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBuZXcgZmllbGQgdHJhZGl0aW9uYWxfZm9ybWF0LgorCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgdHJhZGl0aW9uYWwtZm9ybWF0IHRvIGxvbmdvcHRzLCBhbmQKKwloYW5kbGUgaXQuCisJKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29uZmlnLnRyYWRpdGlvbmFsX2Zvcm1hdCB0byBmYWxzZS4KKwkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiBTZXQgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpbiBCRkQKKwlmbGFncyBvZiBvdXRwdXRfYmZkIGFjY29yZGluZyB0byBjb25maWcudHJhZGl0aW9uYWxfZm9ybWF0LgorCSogbGR2ZXIuYyAoaGVscCk6IE1lbnRpb24gLXRyYWRpdGlvbmFsLWZvcm1hdC4KKwkqIGxkLnRleGluZm86IERvY3VtZW50IC10cmFkaXRpb25hbC1mb3JtYXQuCisKK1R1ZSBKdW4gMTQgMjM6MTA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZGN0b3IuYyAobGRjdG9yX2FkZF9lbnRyeSk6IEFkZCBlbnRyaWVzIHRvIGEgc2V0IGluIHRoZSBvcmRlcgorCXRoZXkgYXJlIGVuY291bnRlcmVkLgorCitUdWUgSnVuIDE0IDE4OjA1OjA5IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKKworCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKFRFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAweDEwMDAuCisJKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERlZmluZSBhcyAweDIwLgorCitNb24gSnVuIDEzIDE1OjQ2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IERlZmluZSBfZnRleHQsIF9ldGV4dCBhbmQgX2ZkYXRhIGluc3RlZCBvZgorCV9GVEVYVCwgX0VURVhUIGFuZCBfRkRBVEEuICBEb250IGRlZmluZSBfRU5ELgorCisJKiBsZGZpbGUuYyAob3Blbl9hKTogSWYgdGhpcyBpcyBub3QgYW4gYXJjaGl2ZSwgdHJ5IHRvIG9wZW4gaXQgaW4KKwl0aGUgY3VycmVudCBkaXJlY3RvcnkgYmVmb3JlIHNlYXJjaGluZyBmb3IgaXQuCisKKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVHJlYXQgLWkgYXMgYSBzeW5vbnltIGZvciAtci4KKworCSogbGRncmFtLnkgKGV4cCk6IFRyZWF0IEJMT0NLIGFzIGEgc3lub255bSBmb3IgQUxJR04sIHNvIHRoYXQKKwlCTE9DSyB3b3JrcyBpbiBhIHNlY3Rpb24gYWRkcmVzcyBhcyBkb2N1bWVudGVkLgorCisJKiBsZGdyYW0ueSAoWVlERUJVRyk6IERvbid0IGRlZmluZS4KKworRnJpIEp1biAxMCAxNjo0NTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGVtdWx0ZW1wbC9nbGQ5NjAuZW06IFBhc3MgZmFsc2UgZm9yIG5ldyBhcmd1bWVudCB0bworCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgorCSogZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9sbms5NjAuZW06IExpa2V3aXNlLgorCisJKiBlbXVsdGVtcGwvc3Vub3MuZW06IE9ubHkgbG9vayBmb3IgLnNvIGZpbGVzIGlmIGRvaW5nIGEgZHluYW1pYworCWxpbmsuCisKK1RodSBKdW4gIDkgMDg6MzU6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBBZGQgQ09OU1RSVUNUT1JTIHRvIC5kYXRhLgorCitUaHUgSnVuICA5IDA2OjUyOjI5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogRGVsZXRlIGxkLm5ldyBkZXBlbmRlbmN5IHNvIHRoYXQgYSByZWdyZXNzaW9uCisJICB0ZXN0IGRvZXNuJ3QgdHJpZ2dlciBhIHJlYnVpbGQgb2YgdGhlIGxpbmtlci4KKworVGh1IEp1biAgOSAwMDoxNzoyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zKTogRm9yIGxhbmdfYWRkcmVzcywgY2FsbAorCWluaXRfb3MgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBjYWxsZWQuCisKK1RodSBKdW4gIDIgMTc6MjQ6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQWRkIHN1cHBvcnQgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuCisJKiBhb3V0LnNjOiBEb24ndCBkZWZpbmUgX19EWU5BTUlDIGhlcmUuICBBZGQgbmV3IHNlY3Rpb25zIHVzZWQgYnkKKwlzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGNvZGUuCisJKiBlbXVsdGVtcGwvc3Vub3MuZW06IE5ldyBmaWxlLgorCSogZW11bHBhcmFtcy9zdW40LnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIHN1bm9zLgorCSogZW11bHBhcmFtcy9zdW4zLnNoIChURU1QTEFURV9OQU1FKTogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbiAoZXN1bjQuYyk6IERlcGVuZCB1cG9uIHN1bm9zLmVtLCBub3QgZ2VuZXJpYy5lbS4KKwkoZXN1bjMuYyk6IExpa2V3aXNlLgorCisJKiBsZGxhbmcuYzogTWlub3IgZm9ybWF0dGluZyBjbGVhbnVwcy4KKwkobGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlKTogTmV3IGZ1bmN0aW9uLgorCSogbGRsYW5nLmggKGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSk6IERlY2xhcmUuCisKKwkqIGxkZmlsZS5oIChzZWFyY2hfZGlyc190eXBlKTogTW92ZSBmcm9tIGxkZmlsZS5jLCBhbmQgYWRkIGNtZGxpbmUKKwlmaWVsZC4KKwkoc2VhcmNoX2hlYWQpOiBEZWNsYXJlLgorCShsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCk6IEFkZCBuZXcgY21kbGluZSBhcmd1bWVudCBpbiBwcm90b3R5cGUuCisJKiBsZGZpbGUuYyAoc2VhcmNoX2hlYWQpOiBNYWtlIG5vbi1zdGF0aWMuCisJKHNlYXJjaF9kaXJzX3R5cGUpOiBNb3ZlIHRvIGxkZmlsZS5oLgorCShsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCk6IEFjY2VwdCBjbWRsaW5lIGFyZ3VtZW50LCBhbmQgc2F2ZSBpdC4KKwkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUGFzcyB0cnVlIGZvciBuZXcgY21kbGluZSBhcmd1bWVudCBvZgorCWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoLgorCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogTGlrZXdpc2UuCisJKiBsZG1haW4uYyAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyKTogUGFzcyBmYWxzZSBmb3IgbmV3IGNtZGxpbmUKKwlhcmd1bWVudCBvZiBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KKwkqIGxkZ3JhbS55IChpZmlsZV9wMSk6IExpa2V3aXNlLgorCitXZWQgSnVuICAxIDE0OjI0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgZmllbGRzIHN1YmZpbGVzLAorCXRvdGFsX3NpemUsIHN1cGVyZmlsZSBhbmQgY2hhaW4uCisJKiBsZGZpbGUuYyAob3Blbl9hKTogRG9uJ3QgY2xlYXIgc2VhcmNoX2RpcnNfZmxhZy4KKwkobGRmaWxlX29wZW5fZmlsZSk6IERvbid0IHRyeSB0byBvcGVuIHN1cGVyZmlsZS4gIEFzc2VydCB0aGF0IGZpbGUKKwloYXMgbm90IGFscmVhZHkgYmVlbiBvcGVuZWQuCisJKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdXBlcmZpbGUuCisJKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IERvbid0IGluaXRpYWxpemUgc3ViZmlsZXMgb3IKKwljaGFpbiBvciBzdXBlcmZpbGUuICBJbml0aWFsaXplIHNlYXJjaF9kaXJzX2ZsYWcgdG8gZmFsc2UuCisKK0ZyaSBNYXkgMjcgMTI6MjU6MzMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQ2hhbmdlZCB2ZXJzaW9uIHRvICJjeWdudXMtMi40LjEiLgorCisJQ2hhbmdlcyBmcm9tIGJpbnV0aWxzLTIuNCByZWxlYXNlOgorCisJKiBnZW5zY3JpcHRzLnNoIChSRUxPQ0FUSU5HLCBDT05TVFJVQ1RJTkcpOiBXaGVuIHNldHRpbmcKKwl2YXJpYWJsZXMsIHVzZSB3aGl0ZXNwYWNlLCBzbyBzY3JpcHRzIGRvbid0IGJyZWFrLgorCisJKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTLCBDRkxBR1MpOiBEZWxldGVkLgorCisJKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogRmluZCBlbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCBpbiAke3NyY2Rpcn0uCisKKwkqIGNkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KKwkqIE1ha2VmaWxlLmluOiBOb3RlZCBjaGFuZ2UuCisKKwkqIHNjcmlwdHRlbXBsL2EyOWsuc2M6IERvbid0IGluY2x1ZGUgL2xhYjMvdTMvLi4uLi9zZWdtZW50cy5vOyBJCisJZG9uJ3Qga25vdyB3aGVyZSB0aGF0J3Mgc3VwcG9zZWQgdG8gY29tZSBmcm9tLCBvciB3aHkgaXQncworCW5lY2Vzc2FyeS4KKworCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQorCisJKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCisJKiBlbXVscGFyYS9nbzMyLnNoOiBzZXQgdG8gY29mZi1nbzMyIG5vdCBhb3V0CisJKiBlbXVsdGVtcC9nZW5lcmljLmVtOiBzdHJlbmd0aC1yZWR1Y2UgdGhlIHN0cnVjdHVyZSBvZgorCSAgdGhpcyBzaGVsbCBzY3JpcHQsIHNpbmNlIHRoZSBvbmx5IGF2YWlsYWJsZSBzaGVsbCBmb3IKKwkgIERPUyBjYW4ndCBoYW5kbGUgY29tcGxleCBzeW50YXguCisJKiBlbXVsdGVtcC9zdHJpbmdpZnkuc2VkOiBmb3IgInNlZCAtZiIgaW5zdGVhZCBvZiBpbmxpbmUuCisJKiBtYWtlZmlsZS5pbjogZGVwZW5kIG9uIHN0cmluZ2lmeS5zZWQgYXMgd2VsbCBhcyBnZW5zY3JpcHRzLnNoCisJKiBzY3JpcHR0ZW1wL2dvMzJjb2ZmLnNjOiBjb3JyZWN0IGZvciBkamdwcCAxLjExJ3MgQ09GRiBmb3JtYXQKKwkqIGdlbnNjcmlwdHMuc2g6IGVtcHR5IHZhcmlhYmxlcyBhcmVuJ3QgYWx3YXlzIGNvbnNpZGVyZWQgInNldCIsCisJICBzbyBzZXQgdGhlbSB0byAieSIgaW5zdGVhZC4KKworRnJpIE1heSAyNyAwMTowODoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChlbnRyeV9zeW1ib2wpOiBNYWtlIHN0YXRpYy4KKwkobGFuZ19hZGRfZW50cnkpOiBBZGQgY21kbGluZSBhcmd1bWVudC4KKwkqIGxkbGFuZy5oIChsYW5nX2FkZF9lbnRyeSk6IENoYW5nZSBwcm90b3R5cGUuCisJKiBsZGdyYW0ueSAoc3RhdGVtZW50X2FueXdoZXJlKTogQ2hhbmdlIGxhbmdfYWRkX2VudHJ5IGNhbGwuCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgorCitUdWUgTWF5IDI0IDE2OjEzOjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2ggKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TKTogRG9uJ3QgZ2l2ZQorCS5yZWdpbmZvIGFuIGFkZHJlc3MuCisJKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IERvbid0IGdpdmUgLmxpdDQgb3IgLmxpdDggYW4gYWRkcmVzcy4KKwkoT1RIRVJfU0VDVElPTlMpOiBEZWZpbmUgZm9yIC5ncHRhYi5zZGF0YSBhbmQgLmdwdGFiLnNic3MuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBPVEhFUl9TRUNUSU9OUyBhdCBlbmQgb2Ygc2NyaXB0LgorCitUaHUgTWF5IDE5IDEzOjMxOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUFkZCBzdXBwb3J0IGZvciBFTEYgc2hhcmVkIGxpYnJhcmllcy4KKwkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIGZpZWxkIGR5bmFtaWNfbGluay4KKwkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb25maWcuZHluYW1pY19saW5rIHRvIGZhbHNlLiAgV2FybgorCW9uIGF0dGVtcHRzIHRvIHVzZSAtciB3aXRoIC1yZWxheCwgLWNhbGxfc2hhcmVkIG9yIC1zLgorCSogbGV4c3VwLmMgKGxvbmdvcHRzKTogU2VwYXJhdGUgT1BUSU9OX0NBTExfU0hBUkVEIGZyb20KKwlPUFRJT05fTk9OX1NIQVJFRC4gIEFkZCBPUFRJT05fSUdOT1JFLiAgQWRqdXN0IG1hY3JvIHZhbHVlcworCWFjY29yZGluZ2x5LiAgQWRkICJkeSIgYW5kICJub25fc2hhcmVkIiBvcHRpb25zLiAgQ2hhbmdlICJReSIgdG8KKwlPUFRJT05fSUdOT1JFIGZvciBub3cuICBIYW5kbGUgT1BUSU9OX0NBTExfU0hBUkVEIGFuZAorCU9QVElPTl9OT05fU0hBUkVEIGJ5IHNldHRpbmcgZHluYW1pY19saW5rIGZpZWxkIGFjY29yZGluZ2x5LgorCUhhbmRsZSBPUFRJT05fSUdOT1JFIGJ5IGlnbm9yaW5nIGl0LiAgQ2xlYXIgZHluYW1pY19saW5rIGZpZWxkIGZvcgorCS1yIGFuZCAtVXIuCisJKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fZmlsZSk6IElmIGNvbmZpZy5keW5hbWljX2xpbmsgaXMgdHJ1ZSwgdHJ5CisJb3BlbmluZyBhIGZpbGUgd2l0aCBhIC5zbyBleHRlbnNpb24gZmlyc3QuCisJKiBlbXVsdGVtcGwvZWxmMzIuZW06IE5ldyBmaWxlLgorCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIHRvIDB4MTAwMDAuCisJKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IExpa2V3aXNlLgorCShURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgorCShEQVRBX1BMVCk6IERlZmluZS4KKwkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBwbGFjZW1lbnQgZm9yIG5ldyBkeW5hbWljIHNlY3Rpb25zLgorCURvbid0IHVzZSBDUkVBVEVfT0JKRUNUX1NZTUJPTFMuICBEZWZpbmUgX2V0ZXh0LCBfZWRhdGEgYW5kIF9lbmQKKwlvdXRzaWRlIG9mIGFueSBzZWN0aW9uLiAgRG9uJ3QgdXNlIEFMSUdOKDgpOyBqdXN0IGxldCBvbmUgc2VjdGlvbgorCVZNQSBmb2xsb3cgYW5vdGhlci4gIFB1dCAuZHluYnNzIGluIC5ic3MuICBEb24ndCBtZW50aW9uIGRlYnVnZ2luZworCXNlY3Rpb25zOyB0aGV5J2xsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGFueWhvdy4KKwkqIE1ha2VmaWxlLmluIChlZWxmX2kzODYuYyk6IERlcGVuZCB1cG9uIGVsZjMyLmVtLCBub3QgZ2VuZXJpYy5lbS4KKworV2VkIE1heSAxOCAxMDoxNTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVkaXJlY3Qgb3V0cHV0IG9mIGxuIHRvIC9kZXYvbnVsbC4KKworTW9uIE1heSAxNiAxMzozNTowOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IENoYW5nZSBhbGwgcmVmZXJlbmNlcyBvZgorCS5ocHBhX2xpbmtlcl9zdHVicyB0byAuUEFSSVNDLnN0dWJzLgorCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYzogTGlrZXdpc2UuCisKK0ZyaSBNYXkgMTMgMTM6MDA6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogQ2hhbmdlIGBgbm8gYXR0YWNoZWQKKwlvdXRwdXQgc2VjdGlvbicnIG1lc3NhZ2Ugc2xpZ2h0bHkuCisJKGxhbmdfZG9fYXNzaWdubWVudHMpOiBEb24ndCByZWN1cnNlIGRvd24gaWYgdGhlcmUgaXMgbm8gcmVhbAorCXNlY3Rpb24uCisKKwkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChPVEhFUl9FTVVMQVRJT05TKTogQ2hhbmdlIGVtXyB0byBlIHRvCisJbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gZW11bGF0aW9uIHRlbXBsYXRlcy4KKwkqIGNvbmZpZy9pMzg2LWx5bngubXQsIGNvbmZpZy9tNjhrLWx5bngubXQ6IExpa2V3aXNlLgorCSogY29uZmlnL3NwYXJjLWx5bngubXQsIGNvbmZpZy9zdW40c29sMi5tdDogTGlrZXdpc2UuCisKK1dlZCBNYXkgMTEgMTg6MTY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogVXBkYXRlZCB2ZXJzaW9uIG51bWJlci4KKworCSogY2R0ZXN0LWZvby5jYzogVXNlIGV4cGxpY2l0ICIjcHJhZ21hIGltcGxlbWVudGF0aW9uIi4KKwkqIGNkdGVzdC1iYXIuY2M6IFJlbmFtZWQgZnJvbSBjZHRlc3QtZnVuYy5jYy4KKwkqIE1ha2VmaWxlLmluOiBSZWZlcmVuY2VzIHRvIGNkdGVzdC1mdW5jLm8gY2hhbmdlZCB0bworCWNkdGVzdC1iYXIuby4KKworV2VkIE1heSAxMSAxNjoyNDoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlEb24ndCBjcmVhdGUgdW5uZWNlc3Nhcnkgb3V0cHV0IHNlY3Rpb25zLgorCSogbGRsYW5nLmMgKG91dF9iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSk6IFJlbW92ZS4KKwkod2lsZF9zZWN0aW9uKTogQ2FsbCBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSByYXRoZXIgdGhhbgorCW91cl9iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZS4gIERvbid0IGNhbGwgd2lsZF9kb2l0IGlmIHRoZXJlIGlzIG5vCisJc2VjdGlvbi4KKwkobGFuZ19jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IFJlbW92ZS4KKwkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyk6IEZvciBzZXZlcmFsIGNhc2VzLCBjYWxsIGluaXRfb3MgaWYKKwlpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjYWxsZWQuCisJKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIG91dHB1dCBzZWN0aW9uIHdhcyBub3QgY3JlYXRlZCwgc2tpcCBpdC4KKwkobGFuZ19wcm9jZXNzKTogRG9uJ3QgY2FsbCBsYW5fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMuCisJKGxhbmdfcGxhY2Vfb3JwaGFucyk6IFNraXAgZmlsZXMgd2l0aCBqdXN0X3N5bXNfZmxhZ3Mgc2V0IHRvIHRydWUuCisJKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBjaGFuZ2UuCisKK1R1ZSBNYXkgMTAgMTQ6MzE6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogRG9uJ3QgYm90aGVyIGluaXRpYWxpemluZyB0aGUgdm1hIGFuZAorCXNlY3Rpb24gc2l6ZS4gIERvbid0IHNwZWNpYWwgY2FzZSBTRUNfU0hBUkVEX0xJQlJBUlkuCisJKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEhhbmRsZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSBzZWN0aW9ucworCXNwZWNpYWxseS4KKworRnJpIE1heSAgNiAxMjoyNDoyNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBjb25maWcvZ28zMi5taCA6IE5ldyBmaWxlIGZvciBYZ28zMlguCisKK0ZyaSBNYXkgIDYgMTU6MTU6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fY29tbWFuZF9maWxlKTogU2V0IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbAorCWJlZm9yZSBjYWxsaW5nIGVpbmZvLCBzaW5jZSB3ZSBhcmUgcmVwb3J0aW5nIGFuIGZvcGVuIGZhaWx1cmUuCisJRnJvbSBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KKworCSogY29uZmlndXJlLmluOiBVc2UgImUiIHJhdGhlciB0aGFuICJlbV8iIGFzIHByZWZpeCBmb3IKKwllbXVsYXRpb25zLgorCitGcmkgTWF5ICA2IDAxOjA4OjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQorCisJKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogVXNlICJlIiByYXRoZXIgdGhhbiAiZW1fIiBhcyBwcmVmaXggZm9yCisJZmlsZW5hbWUuCisJKiBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvZ2xkOTYwYy5lbSwgZW11bHRlbXBsL2xuazk2MC5lbSwKKwllbXVsdGVtcGwvaHBwYWVsZi5lbSwgZW11bHRlbXBsL204OGtiY3MuZW0sIGVtdWx0ZW1wbC92YW5pbGxhLmVtOgorCURpdHRvLgorCSogTWFrZWZpbGUuaW46IENoYW5nZWQgYWxsIGdlbmVyYXRlZCBmaWxlIG5hbWVzLgorCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIE1ha2VmaWxlLCBub3QgY29uZmlnLnN0YXR1cy4gIENoYW5nZWQKKwlzZWQgcGF0dGVybnMgdG8gaGFuZGxlIG5ldyBmaWxlbmFtZXMuCisKKwkqIGNvbmZpZy9taXBzbC1pZHQubXQ6IFJlbmFtZWQgZnJvbSBtaXBzLWlkdGwubXQuCisJKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgorCitUaHUgTWF5ICA1IDE1OjA3OjMyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEb24ndCB1c2UgIiQ8KiIsIGl0IGRvZXNuJ3QgYWx3YXlzCisJd29yay4gIEluc3RlYWQsIGNoZWNrIGJ1aWxkIGRpciBhbmQgJHNyY2RpciBleHBsaWNpdGx5LCBhbmQgdXNlCisJYGVjaG8nIHRvIGdldCBhbGwgdGhlIGZpbGVuYW1lcy4KKworCSogY29uZmlndXJlLmluIChoODMwMGgtKi1obXMpOiBDaGFuZ2VkIGxkX3RhcmdldCBuYW1lIHRvCisJY2YtaDgzMDBoLgorCSogY29uZmlnL2NmLWg4MzAwaC5tdDogUmVuYW1lZCBmcm9tIGNvZmYtaDgzMDBoLm10LCB0byBtYWtlIGl0CisJdW5pcXVlIGluIDguMy4KKworCSogY29uZmlnL2k5NjBjb2ZmLm10OiBOZXcgZmlsZS4KKwkqIGVtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaDogTmV3IGZpbGUuCisJKiBlbXVsdGVtcGwvZ2xkOTYwYy5lbTogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW4gKGk5NjAtKi12eHdvcmtzNSogZXhjZXB0IC12eHdvcmtzNS4wKik6IFVzZQorCWk5NjBjb2ZmIGNvbmZpZ3VyYXRpb24uCisJKiBNYWtlZmlsZS5pbiAoZW1fZ2xkOTYwY29mZi5jKTogQWRkZWQgZGVwZW5kZW5jaWVzLCBidWlsZCBydWxlLgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZW1fZGVsdGE2OC5vLCBzaW5jZSB0aGUKKwljb2RlIGlzbid0IGluY2x1ZGVkIGluIEZTRiByZWxlYXNlcywgYW5kIGl0IGNhbiBzdGlsbCBiZQorCWV4cGxpY2l0bHkgc2VsZWN0ZWQuCisJKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlLmJhayBhbmQgdG1wZGlyLgorCShTVEFHRVNUVUZGKTogUmVtb3ZlZCAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykuCisJKG1vc3RseWNsZWFuKTogRGVsZXRlIHRoZW0gZXhwbGljaXRseSBoZXJlLiAgQWxzbyByZW1vdmUgdG1wZGlyLgorCisJUGF0Y2hlcyBmcm9tIFJhbHBoIENhbXBiZWxsOgorCSogY29uZmlnL21pcHNic2QubWg6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKGVtX21pcHNic2QuYyk6IFVzZSBtaXBzYnNkLnNjLCBub3QgYW91dC5zYy4KKwkqIHNjcmlwdHRlbXBsL21pcHNic2Quc2M6IERvbid0IGRlZmluZSBfX0RZTkFNSUMuCisJKiBlbXVscGFyYW1zL21pcHNic2Quc2ggKE9VVFBVVF9GT1JNQVQpOiBGaXggbmFtZSB0byBoYXZlIGBhLm91dCcKKwlpbnN0ZWFkIG9mIGBhb3V0Jy4KKworCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IFRyZWF0IGxpa2UgaTM4Ni0qLW1hY2gqLgorCitXZWQgTWF5ICA0IDExOjU5OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsubXQgKEVNVUwpOiBTZXQgdG8gbTY4a2FvdXQuCisJKiBlbXVscGFyYW1zL202OGthb3V0LnNoOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9tNjhrYW91dC5vLgorCShlbV9tNjhrYW91dC5jKTogTmV3IHRhcmdldC4KKworCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIGRvdCBtb3ZlcyBiZWNhdXNlIG9mIGFuCisJYXNzaWdubWVudCwgZG9uJ3QgdHJ5IHRvIGluc2VydCBhIHBhZCBpbnRvIHRoZSBhYnNvbHV0ZSBvdXRwdXQKKwlzZWN0aW9uLCBqdXN0IGNoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdCBtZW1vcnkgcmVnaW9uCisJaW5zdGVhZC4KKworCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNkdGVzdC50bXAsIGNkdGVzdC11ciwKKwljZHRlc3QtdXIub3V0LCBhbmQgY2R0ZXN0LXVyLnRtcC4KKworV2VkIEFwciAyNyAxNjowMzozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL3NhMjkyMDAuc2M6IEFsaWduIGFsbCBzZWN0aW9ucyB0byBmb3VyIGJ5dGUKKwlib3VuZGFyaWVzLgorCitXZWQgQXByIDI3IDEwOjQ4OjAzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFN1cHBvcnQgZm9yIGdvMzIgY29mZi4KKwkqIGNvbmZpZy9pMzg2LWdvMzIubXQ6IE5ldyBmaWxlCisJKiBlbXVscGFyYW1zL2kzODZnbzMyLnNoOiBOZXcgZmlsZQorCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2M6IE5ldyBmaWxlCisKK1R1ZSBBcHIgMjYgMTc6MjA6MDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZW1fbTY4a2x5bnguYywgZW1faTM4Nmx5bnguYywgZW1fc3BhcmNseW54LmMpOiBVc2UKKwlMeW54LXNwZWNpZmljIHNjcmlwdCB0ZW1wbGF0ZXMuCisJKiBjb25maWd1cmUuaW4gKHNwYXJjbGl0ZSotKi1jb2ZmKTogVXNlIGNvZmYtc3BhcmMuCisJKiBlbXVscGFyYW1zL2kzODZseW54LnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBpMzg2bHlueC4KKwkqIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoIChTQ1JJUFRfTkFNRSk6IFNldCB0byBzcGFyY2x5bnguCisJKEVOVFJZKTogU2V0IHRvIF9fbWFpbi4KKwkqIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBOZXcgZmlsZSwgc2NyaXB0IGZvciBJMzg2IEx5bnguCisJKiBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogQWRkIGluc2VydGlvbiBvZiBjdG9yL2R0b3Igc2VjdGlvbnMuCisJKiBzY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2M6IE5ldyBmaWxlLCBzY3JpcHQgZm9yIHVTcGFyYyBMeW54LgorCitUdWUgQXByIDI2IDEyOjQxOjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogRm9yY2UgX2dwIGFuZCAubGl0OCB0byBiZSBhbGlnbmVkIHRvIGEgMTYKKwlieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZSBnbG9iYWwgY29uc3RydWN0b3JzIGRvIG5vdCB0YWtlIHVwIGFuCisJZXZlbiAxNiBieXRlcy4KKworCSogY29uZmlnL2kzODZ2NC5taCAoSE9TVElOR19DUlQwKTogSWYgLi4vZ2NjL2NydGJlZ2luLm8gZG9lcyBub3QKKwlleGlzdCwgZ2V0IGNydGJlZ2luIGJhc2VkIG9uIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZS4KKwkoSE9TVElOR19MSUJTKTogU2ltaWxhciBjaGFuZ2UgZm9yIC4uL2djYy9jcnRlbmQuby4KKworTW9uIEFwciAyNSAxNToyNzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIG5vIGFkZHJlc3MgaXMgZ2l2ZW4gZm9yIGEKKwlzZWN0aW9uLCBhbGlnbiBpdCBhY2NvcmRpbmcgdG8gaXRzIHJlcXVpcmVtZW50cy4KKworVGh1IEFwciAyMSAxNzoyNDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZ2RvYy50ZXhpLgorCitUdWUgQXByIDE5IDEyOjEyOjE1IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBZGQgaVszNF04Ni0qLWJzZDM4NiB0byB0aGUgcGF0dGVybnMgcmVjb2duaXplZC4KKworRnJpIEFwciAxNSAxNDozNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QgdGhlCisJcG9zaXRpb24gb2YgYSBwYWRkaW5nIHN0YXRlbWVudCwgYW5kIGFkanVzdCBkb3QgYWNjb3JkaW5nbHkuCisKK01vbiBBcHIgMTEgMTc6Mzc6MDkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoRVhQRUNULCBSVU5URVNUKTogU2V0IHRoZXNlIGZvciB0aGUgY2hlY2sgZ29hbC4KKworTW9uIEFwciAxMSAxMjozMjo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBJZiByZWxvY2F0aW5nLCBkb24ndCBwdXQgLmluaXQgYW5kCisJLmZpbmkgc2VjdGlvbnMgaW50byAudGV4dDsga2VlcCB0aGVtIHNlcGFyYXRlLgorCSogY29uZmlnL2kzODZzY28ubWggKEhPU1RJTkdfQ1JUMCk6IElmIC4uL2djYy9jcnRiZWdpbi5vIGRvZXMgbm90CisJZXhpc3QsIGdldCBjcnRiZWdpbiBiYXNlZCBvbiBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWUuCisJKEhPU1RJTkdfTElCUyk6IFNpbWlsYXIgY2hhbmdlIGZvciAuLi9nY2MvY3J0ZW5kLm8uCisKK01vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCisKK1dlZCBBcHIgIDYgMDA6MDk6MzcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qZWxmKik6IERvbid0IHJlcXVpcmUgIi1ocC0iIGZvciB0aGUKKwltYW51ZmFjdHVyZXIuCisKKwkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2ZpbmlzaCk6IE9ubHkgcmVzaXplIHNlY3Rpb25zCisJaWYgYnVpbGRpbmcgYSBmaW5hbCBleGVjdXRhYmxlLgorCitUdWUgQXByICA1IDEyOjE3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGJmZF9jbG9zZS4KKworVGh1IE1hciAzMSAxODowNzowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBDbGVhbiB1cCBzZWN0aW9uIGFsaWdubWVudCB0byBlbnN1cmUgdGhhdAorCXNlY3Rpb25zIG5ldmVyIG92ZXJsYXAgd2hlbiB1c2luZyAtci4KKworV2VkIE1hciAzMCAxNTo1MToxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBDaGFuZ2Ugc3ltYm9sIHJlYWRpbmcgc2xpZ2h0bHkgZm9yIHJlY2VudCBCRkQKKwljaGFuZ2VzOiBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHJlbmFtZWQgYW5kIHJldHVybnMgbG9uZywKKwliZmRfY2Fub25pY2FsaXplX3N5bXRhYiByZXR1cm5zIGxvbmcsIGNoZWNrIGZvciBlcnJvciBpbmRpY2F0aW9ucy4KKworRnJpIE1hciAyNSAxNzoyMDowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChwcmludF9pbnB1dF9zZWN0aW9uKTogRm9yIHNlY3Rpb24gc2l6ZSwgdXNlCisJX2Nvb2tlZF9zaXplIGlmIGl0IGlzIG5vbi16ZXJvLCBzaXplIG90aGVyd2lzZS4KKwkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogTGlrZXdpc2UuCisJKGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZSAoY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkuCisKK1RodSBNYXIgMjQgMTU6MjA6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogQWRkIG5ldyBhcmd1bWVudCBhZGRfdG9fbGlzdC4gIERvbid0IHNldAorCXJlYWwgdG8gdHJ1ZSBmb3IgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtLiAgQ2xlYXIgdGhlX2JmZC4KKwkobGFuZ19hZGRfaW5wdXRfZmlsZSk6IFBhc3MgdHJ1ZSB0byBuZXdfYWZpbGUgZm9yIGFkZF90b19saXN0LgorCShsb29rdXBfbmFtZSk6IFJlbW92ZSBmb3JjZV9sb2FkIGFyZ3VtZW50LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KKwlQYXNzIGZhbHNlIHRvIG5ld19hZmlsZSBmb3IgYWRkX3RvX2xpc3QuICBTcGxpdCBsb2FkaW5nIG9mIHN5bWJvbHMKKwlvdXQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbi4KKwkobG9hZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uIHNwbGl0IG91dCBvZiBsb29rdXBfbmFtZS4gIERvbid0IGxvYWQKKwl0aGUgc3ltYm9scyBpZiB0aGV5IGFyZSBhbHJlYWR5IGxvYWRlZC4KKwkob3Blbl9pbnB1dF9iZmRzKTogRm9yIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0gY2FsbCBsb2FkX3N5bWJvbHMKKwlyYXRoZXIgdGhhbiBsb29rdXBfbmFtZS4KKwkobGFuZ19wcm9jZXNzKTogUGFzcyBhYnNfb3V0cHV0X3NlY3Rpb24gcmF0aGVyIHRoYW4gTlVMTCB0bworCWxhbmdfc2l6ZV9zZWN0aW9ucy4KKwkobGFuZ19zdGFydHVwKTogU2V0IHJlYWwgZmllbGQgb2YgZmlyc3RfZmlsZSB0byB0cnVlLgorCitXZWQgTWFyIDIzIDE0OjE1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKGhhZF9yZWxheCk6IFJlbW92ZWQuCisJKHJlbGF4X2FnYWluKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hhbmdlIGNhbGwgdG8gYmZkX3JlbGF4X3NlY3Rpb24gdG8KKwljb3JyZXNwb25kIHRvIEJGRCBjaGFuZ2VzLiAgU2V0IHJlbGF4X2FnYWluIGFwcHJvcHJpYXRlbHkuCisJKGxhbmdfcHJvY2Vzcyk6IFJlbW92ZSAjaWYgMCBjb2RlLiAgV2hlbiByZWxheGluZywga2VlcCBjYWxsaW5nCisJbGFuZ19kb19hc3NpZ25tZW50cyBhbmQgbGFuZ19zaXplX3NlY3Rpb25zIHVudGlsIHJlbGF4X2FnYWluCisJYmVjb21lcyBmYWxzZS4KKworCSogZW11bHRlbXAvZ2xkOTYwLmVtOiBJbmNsdWRlIGxpYmliZXJ0eS5oCisJKGdsZDk2MF9iZWZvcmVfcGFyc2UpOiBQYXNzIE5VTEwgYXMgZmluYWwgYXJndW1lbnQgdG8gY29uY2F0LgorCitUdWUgTWFyIDIyIDEzOjA4OjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogRm9yY2UgX2VuZCBhbmQgX19lbmQgdG8gYmUgYWxpZ25lZCB0byBhCisJZm91ciBieXRlIGJvdW5kYXJ5LgorCisJKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtIGJ5CisJYnVpbGRpbmcgYSBiZmRfZGF0YV9saW5rX29yZGVyLCByYXRoZXIgdGhhbiBieSBzZXR0aW5nIHRoZSBzZWN0aW9uCisJY29udGVudHMgaW1tZWRpYXRlbHkuCisKK01vbiBNYXIgMjEgMTg6Mjg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQ2hhbmdlcyB0byBtYWtlIC1VciB3b3JrIGFnYWluLgorCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBOb3cgdGFrZXMgcmVsb2MgYXJndW1lbnQgcmF0aGVyIHRoYW4KKwliaXRzaXplLiAgQ2hlY2sgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyBoZXJlLiAgSWYgYW4gbmV3IGhhc2gKKwl0YWJsZSBlbnRyeSBpcyBjcmVhdGVkLCBtYXJrIGl0IGFzIHVuZGVmaW5lZC4KKwkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBObyBsb25nZXIgdGFrZXMgYml0c2l6ZSBhcmd1bWVudC4gIFBhc3MKKwlCRkRfUkVMT0NfQ1RPUiB0byBsZGN0b3JfYWRkX3NldF9lbnRyeSwgYnV0IGZpcnN0IG1ha2Ugc3VyZSB0aGUKKwlCRkQgYmFja2VuZCBzdXBwb3J0cyBpdC4KKwkocmVsb2Nfb3ZlcmZsb3cpOiBIYW5kbGUgYSBOVUxMIGFiZmQgYXJndW1lbnQuCisJKHJlbG9jX2Rhbmdlcm91cywgdW5hdHRhY2hlZF9yZWxvYyk6IExpa2V3aXNlLgorCSogbGRjdG9yLmM6IEluY2x1ZGUgbGRtYWluLmguCisJKHN0cnVjdCBzZXRfaW5mbyk6IENoYW5nZSBiaXRzaXplIGZpZWxkIHRvIHJlbG9jLgorCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IE5vdyB0YWtlcyByZWxvYyBhcmd1bWVudCByYXRoZXIgdGhhbgorCWJpdHNpemUuICBEb24ndCBib3RoZXIgdG8gY2hlY2sgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyBoZXJlLgorCShsZGN0b3JfYnVpbGRfc2V0cyk6IEdldCB0aGUgc2l6ZSBmcm9tIHRoZSByZWxvYyBob3d0by4gIElmCisJZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBjYWxsIGxhbmdfYWRkX3JlbG9jIHJhdGhlciB0aGFuCisJbGFuZ19hZGRfZGF0YS4KKwkqIGxkY3Rvci5oIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byB1c2UgcmVsb2MKKwlpbnN0ZWFkIG9mIGJpdHNpemUuCisJKiBsZGxhbmcuaCAoc3RhdGVtZW50X2VudW0pOiBBZGQgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bS4KKwkobGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSk6IE5ldyBzdHJ1Y3R1cmUuCisJKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpOiBBZGQgcmVsb2Nfc3RhdGVtZW50IGZpZWxkLgorCShsYW5nX2FkZF9yZWxvYyk6IERlY2xhcmUgbmV3IGZ1bmN0aW9uLgorCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcik6IEhhbmRsZQorCWxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0uCisJKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMsIHByaW50X3N0YXRlbWVudCk6IExpa2V3aXNlLgorCShsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KKwkocHJpbnRfcmVsb2Nfc3RhdGVtZW50KTogTmV3IGZ1bmN0aW9uLgorCShsYW5nX2FkZF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KKwkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLgorCisJKiBNYWtlZmlsZS5pbiAoY2R0ZXN0Lm91dCwgY2R0ZXN0LXVyLm8pOiBOZXcgdGFyZ2V0cy4KKwkoY2R0ZXN0LXVyLCBjZHRlc3QtdXIub3V0KTogTmV3IHRhcmdldHMuCisJKGNoZWNrLWNkdGVzdCk6IE5vdyBhbHNvIGNoZWNrIHRoYXQgLVVyIHdvcmtzIGNvcnJlY3RseS4KKworCSogc2NyaXB0dGVtcC9hbHBoYS5zYzogQWxpZ24gYWxsIHNlY3Rpb25zIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4KKworVGh1IE1hciAxNyAxMjo0NTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBNb3ZlIGxhbmdfY29tbW9uIGNhbGwgYmVmb3JlCisJbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucywgdG8gZW5zdXJlIHRoYXQgYW55IGFsaWdubWVudAorCWNvbnN0cmFpbnRzIHNldCBieSBjb21tb24gc3ltYm9scyBhcmUgY29waWVkIG92ZXIgdG8gdGhlIG91dHB1dAorCXNlY3Rpb25zLgorCitGcmkgTWFyIDExIDIyOjE3OjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERvbid0IGRlZmluZS4KKwkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogUmVuYW1lIC50b2MgdG8gLmdvdC4KKwkqIE1ha2VmaWxlLmluIChlbV9lbGYzMnBwYy5jKTogRGVwZW5kIHVwb24gZ2VuZXJpYy5lbSwgbm90IHBwYy5lbS4KKwkqIGVtdWx0ZW1wbC9wcGMuZW06IFJlbW92ZSB1Z2x5IHN0dWIgY29kZTsgdHVybnMgb3V0IG5vdCB0byBiZQorCW5lZWRlZCBmb3IgRUxGLgorCitUdWUgTWFyICA4IDA0OjIyOjI3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODZic2QubWg6IE5ldyBmaWxlLgorCitNb24gTWFyICA3IDE1OjIzOjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmLnNjOiBQZXJtaXQgVEVYVF9TVEFSVF9TWU1CT0xTIGFuZCBEQVRBX1NUQVJUX1NZTUJPTFMgdG8gYmUKKwlkZWZpbmVkLgorCSogZW11bHBhcmFtcy9lbGYzMm1pcGIucyAoVEVYVF9TVEFSVF9TWU1CT0xTKTogRGVmaW5lIF9mdGV4dC4KKwkoREFUQV9TVEFSVF9TWU1CT0xTKTogRGVmaW5lIF9mZGF0YS4KKworTW9uIEZlYiAyOCAxMDo1OToxNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChjYXQpOiBEZWZpbmUgdXNpbmcgQU5TSSBzdHlsZSBpZiBBTE1PU1RfU1REQyBkZWZpbmVkLgorCitTdW4gRmViIDI3IDE2OjI5OjM4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9maW5pc2gpOiBVcGRhdGUgY29tbWVudHMuICBUaGlzCisJd29ya3MgYWdhaW4uICBBdHRhY2ggc29tZSBvdXRwdXQgc3ltYm9scyB0byB0aGUgc3R1YiBmaWxlIGJmZC4KKworCSogZW11bHRlbXBsL2hwcGFlbGYuZW06IEluY2x1ZGUgZWxmMzItaHBwYS5oLgorCShmaWxlX2NoYWluKTogQWRkIGRlY2wuCisJKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IERlbGV0ZSBkZWNsLgorCShocHBhZWxmX2ZpbmlzaCk6IFJlZW5hYmxlIGNvZGUuICBEbyBub3QgcGFzcyBzeW1ib2xzCisJZG93biB0byBocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24uCisKK1NhdCBGZWIgMjYgMTA6NTg6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAod3JpdGVfbWFwKTogRG9uJ3QgZGVmaW5lLiAgUmVtb3ZlZCBhbGwgcmVmZXJlbmNlcy4KKwlKdXN0IHVzZSBtYXBfZmlsZSBvciBtYXBfZmlsZW5hbWUgaW5zdGVhZC4KKwkoYWRkX2FyY2hpdmVfZWxlbWVudCk6IFVzZSBtaW5mbyB0byB3cml0ZSBtYXAgaW5mb3JtYXRpb24sIG5vdAorCWluZm9fbXNnLgorCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IFVzZSBmcHJpbnRmIHRvIHdyaXRlIG1hcCBpbmZvcm1hdGlvbiwgbm90CisJaW5mb19tc2cuCisJKiBsZG1haW4uaCAod3JpdGVfbWFwKTogRG9uJ3QgZGVjbGFyZS4KKwkqIGxkZ3JhbS55IChtcmlfc2NyaXB0X2NvbW1hbmQpOiBSZW1vdmVkIHJlZmVyZW5jZSB0byB3cml0ZV9tYXAuCisJKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogTGlrZXdpc2UuCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExpa2V3aXNlLgorCitGcmkgRmViIDI1IDE5OjEyOjAzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBGb3JjZSBhbGwgc2VjdGlvbnMgdG8gYmUgYWxpZ25lZC4KKworCSogbGRncmFtLnkgKHNlY3Rpb24pOiBSZXZlcnNlIHRoZSBvcmRlciBvZiBtZW1zcGVjX29wdCBhbmQKKwlmaWxsX29wdCB0byBhdm9pZCBhbiBhbWJpZ3VpdHkgd2hlbiBib3RoIGFyZSB1c2VkLgorCSogbGQudGV4aW5mbzogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKworCSogbGRncmFtLnk6IE1vdmUgaW5jbHVkZSBvZiBsZGxleC5oIGJhY2sgd2l0aCBvdGhlciBpbmNsdWRlcy4KKwkqIGxkbGV4LmggKGlucHV0X3R5cGUpOiBEb24ndCBpbml0aWFsaXplIGVudW0gY29uc3RhbnRzIHRvCisJcGFydGljdWxhciB2YWx1ZXMuCisJKiBsZGxleC5sOiBVc2UgYSBzd2l0Y2ggdG8gcmV0dXJuIHRoZSByaWdodCB0b2tlbiBiYXNlZCBvbgorCWlucHV0X3R5cGUsIHJhdGhlciB0aGFuIGtub3dpbmcgdGhhdCBpbnB1dF90eXBlIGhhcyBhIHZhbHVlIGJhc2VkCisJb24gYSB0b2tlbiB0eXBlLgorCisJKiBsZGdyYW0ueSAoZGlybGlzdF9wdHIpOiBSZW1vdmVkOyBub3QgdXNlZC4KKwkqIGxleHN1cC5jOiBJbmNsdWRlIGxkdmVyLmguCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCisKK0ZyaSBGZWIgMjUgMTg6NTU6NTQgMTk5NCAgVGVkIExlbW9uICAobWVsbG9uQHBlcHBlci5uY2QuY29tKQorCisJKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBkb24ndCBjYWxsIGJmZF9zZXRfZ3Bfc2l6ZS4KKwkobGRsYW5nX2FkZF9maWxlKTogY2FsbCBpdCBoZXJlIGluc3RlYWQuCisKK0ZyaSBGZWIgMjUgMTg6MTM6NDYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBsZGdyYW0ueTogSW5jbHVkZSBsZGxleC5oIGFmdGVyICV0b2tlbiBkZWNscywgZm9yIGJ5YWNjLgorCitGcmkgRmViIDI1IDEwOjQ3OjI1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgICAgICogZW11bHRlbXBsL2hwcGFlbGYuZW06IEZpcnN0IGF0dGVtcHQgdG8gY2xlYW4gdGhpcyBmaWxlIHVwLgorCUFkZCBjb21tZW50cyBpbiBzZXZlcmFsIGZ1bmN0aW9ucyBhcyB0byB0aGVpciBwdXJwb3NlIGFuZAorCWhvdyB0aGV5IGZ1bmN0aW9uIChvciBteSBjdXJyZW50IGJlc3QgZ3Vlc3MpLiAgQ2xlYW4gdXAgaG9ycmlibGUKKwlzcGFjaW5nIGFuZCBpbmRlbnRpb24gdGhhdCBuZXZlciBzaG91bGQgaGF2ZSBiZWVuIGFjY2VwdGVkIGluIHRoZQorCWZpcnN0IHBsYWNlLiAgQWRkIEZJWE1FcyBmb3IgaXNzdWVzIHdoaWNoIG5lZWQgdG8gYmUgcmVzb2x2ZWQuCisJRGlzYWJsZSBsaW5rZXItc3R1YiBnZW5lcmF0aW9uIHVudGlsIGl0IGdldHMgZml4ZWQuICBUaGlzIGFsbG93cworCXRoZSBsaW5rZXIgdG8gYXQgbGVhc3Qgd29yayBvbiBzaW1wbGUgY29kZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKworCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IE5vIGxvbmdlciBzdGF0aWMgKFBBIEVMRiBjYWxscworCWl0IHZpYSBocHBhZWxmX2ZpbmlzaCkuICBQcm90b3R5cGUgbW92ZWQgaW50byBsZGxhbmcuaC4KKwkobGFuZ19wcm9jZXNzKTogTW92ZSBwcm9ibGVtYXRpYyBleHRyYSBjYWxsIHRvIGxhbmdfc2l6ZV9zZWN0aW9ucworCWludG8gdGhlIFBBIEVMRiBzcGVjaWZpYyBjb2RlLgorCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfZmluaXNoKTogRXh0cmEgY2FsbCB0bworCWxhbmdfc2l6ZV9zZWN0aW9ucyBtb3ZlZCBoZXJlLgorCitUaHUgRmViIDI0IDE2OjQ3OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotZWxmKik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtZWxmMzIuCisJKiBjb25maWcvcHBjLWVsZjMyLm10OiBOZXcgZmlsZS4KKwkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2g6IE5ldyBmaWxlLgorCSogZW11bHRlbXBsL3BwYy5lbTogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9lbGYzMnBwYy5vLgorCShlbV9lbGYzMnBwYy5jKTogTmV3IHRhcmdldDsgdXNlcyBlbGYzMnBwYy5zaCwgcHBjLmVtIGFuZCBlbGYuc2MuCisJKEVNVUxBVElPTl9PRklMRVMpOiBBZGRlZCBkZXBlbmRlbmNpZXMgb24gbGRleHAuaCBhbmQgbGRsYW5nLmguCisKK1RodSBGZWIgMjQgMTI6Mjc6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFVzZSBzeW1ib2xpYyBudW1iZXJzIGZvciBsb25nIG9wdGlvbnMuCisJRml4IG1pc3VuZGVyc3RhbmRpbmcgaW4gLVkgYW5kIC1jYWxsX3NoYXJlZCBldCBhbC4KKworCVVzZSBnZXRvcHQgaW5zdGVhZCBvZiBsZXggYW5kIHlhY2MgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZS4KKworCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IERvY3VtZW50IGNoYW5nZXMgdG8gb3B0aW9uIHN5bnRheC4KKwkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzLgorCSogbGR2ZXIuYyAoaGVscCk6IFR3ZWFrIGRhc2hlcyBpbiB1c2FnZSBtZXNzYWdlLgorCSogbGRncmFtLnkgKCV1bmlvbik6IFJlbW92ZSB1bnVzZWQgbWVtYmVycy4KKwlSZW1vdmUgJXRva2VucyBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbnM7IGFkZCBvbmVzIGZvciBpbnB1dCB0eXBlcy4KKwkoY29tbWFuZF9saW5lKTogUnVsZXMgcmVtb3ZlZC4KKwkoZmlsZSk6IEluc3RlYWQgb2YgY29tbWFuZCBsaW5lLCByZWNvZ25pemUgYW4KKwlpbnB1dCB0eXBlIGluZGljYXRvciwgdGhlbiB1c2UgdGhlIG5vbnRlcm1pbmFsIGZvciB0aGF0IHR5cGUuCisJKGRlZnN5bV9leHByKTogTmV3IG5vbnRlcm1pbmFsIGZyb20gY29kZSBmb3JtZXJseSBpbiBjb21tYW5kX2xpbmUuCisJKiBsZGxleC5oOiBEZWNsYXJlIHBhcnNlciBpbnB1dCB0eXBlIGVudW0gYW5kIHZhcmlhYmxlLgorCURvbid0IGRlY2xhcmUgcGFyc2VfbGluZS4KKwkqIGxkbGV4Lmw6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLiAgTWFrZSBzb21lIHVzZWQgb25lcyBzdGF0aWMKKwlhbmQgY29tbWVudCB0aGVtLgorCShDT01NQU5EKTogU3RhcnQgc3RhdGUgYW5kIGl0cyBydWxlcyByZW1vdmVkLgorCUF0IHN0YXJ0IG9mIHl5bGV4LCByZXR1cm4gaW5wdXQgc3RhdGUgdG9rZW4gaWYgYXQgc3RhcnQgb2YgaW5wdXQuCisJKGxleF9yZWRpcmVjdCk6IERvbid0IG5lZWQgdG8gc2V0IHl5b3V0LgorCShsZGxleF9jb21tYW5kKTogRnVuY3Rpb24gcmVtb3ZlZC4KKwkqIGxkbWFpbi5jIChtYWluKTogSW5zdGVhZCBvZiBjYWxsaW5nIHBhcnNlX2xpbmUsIHNldCB1cCB0aGUKKwlyZWRpcmVjdGlvbnMgYW5kIGNhbGwgeXlwYXJzZSBkaXJlY3RseS4KKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBJZiB0aGVyZSdzIG5vIGlucHV0IGZpbGVuYW1lLCBwcmludCBub3RoaW5nLCBub3QKKwkiY29tbWFuZCBsaW5lIi4KKwkqIGxleHN1cC5jOiBSZW1vdmUgI2lmIDAnZCBjb2RlLgorCShwYXJzZV9saW5lKTogRnVuY3Rpb24gcmVtb3ZlZC4KKwkocGFyc2VfYXJncyk6IFJld3JpdGUgdG8gdXNlIGdldG9wdF9sb25nX29ubHkuCisJKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBOZXcgZnVuY3Rpb24gZnJvbSBjb2RlIGZvcm1lcmx5IGluCisJbGRncmFtLnk6Y29tbWFuZF9saW5lLgorCShzZXRfc2VjdGlvbl9zdGFydCk6IE5ldyBmdW5jdGlvbi4KKwkqIGVtdWx0ZW1wbC9nZW5lcmljLmVtLCBlbXVsdGVtcGwvZ2xkOTYwLmVtLCBlbXVsdGVtcGwvaHBwYWVsZi5lbSwKKwllbXVsdGVtcGwvbG5rOTYwLmVtLCBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogRG9uJ3QgZW5jbG9zZQorCWNvbXBpbGVkLWluIGxpbmsgc2NyaXB0cyBpbiAieyIgYW5kICJ9IiwgYXMgdGhlIGdyYW1tYXIgbm8gbG9uZ2VyCisJd2FudHMgdGhlbSB0byBiZS4KKworVGh1IEZlYiAyNCAwODo0MzoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChsZC5kdmkpOiBEZXBlbmQgb24gY29uZmlnZG9jLnRleGksIGJ1dCBkb24ndAorCXJlcXVpcmUgdGhhdCBpdCBiZSBpbiAkKHNyY2RpcikuCisKK1R1ZSBGZWIgMjIgMDk6MjE6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogT25seSBhbGlnbiBzZWN0aW9uIHRvIGFsaWdubWVudAorCXJlcXVpcmVkIGJ5IGxpbmtlciBzY3JpcHQsIG5vdCB0byBtYXhpbXVtIGFsaWdubWVudCBvZiBpbnB1dAorCXNlY3Rpb25zLgorCisJKiBsZGxhbmcuaCAobGFyZ2VzdF9zZWN0aW9uKTogRG9uJ3QgZGVjbGFyZS4KKwkqIGxkbGFuZy5jIChsYXJnZXN0X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCisJKHNpemVfaW5wdXRfc2VjdGlvbik6IERvbid0IHNldCBsYXJnZXN0X3NlY3Rpb247IG5vdCB1c2VkLgorCitNb24gRmViIDIxIDE1OjE1OjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IFBhc3MgTlVMTCBhcyBsYXN0IGFyZ3VtZW50IHRvIGNvbmNhdC4KKworVGh1IEZlYiAxNyAxNTo1MToyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jLCBsZG1haW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KKworCSogbGRtaXNjLmggKGNvbmNhdCk6IERvbid0IGRlY2xhcmUuCisJKiBsZG1pc2MuYyAoY29uY2F0KTogRG9uJ3QgZGVmaW5lOyBqdXN0IHVzZSB0aGUgb25lIGluIGxpYmliZXJ0eS4KKworCSogbGQuaCAoYXNfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmVtb3ZlZDsgbm90IHVzZWQuCisKK1RodSBGZWIgMTcgMDk6MzI6MTQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYywgbGRtYWluLmMsIGxkbWlzYy5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQKKwliZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCisKK1R1ZSBGZWIgMTUgMjA6MTQ6NTMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSWYgdGhlIGNvb2tlZCBzaXplIG9mIHRoZSBzZWN0aW9uCisJaGFzIGJlZW4gc2V0LCB1c2UgaXQsIGZvciBkZXRlcm1pbmluZyBsaW5rX29yZGVyIHNpemUuCisJKGxkd3JpdGUpOiBJbiB0aGUgZXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgaWYgYmZkX2ZpbmFsX2xpbmsgZmFpbHMsCisJaW5kaWNhdGUgdGhhdCBpdCB3YXMgaW4gZmFjdCB0aGUgZmluYWwgbGluayBzdGVwIHRoYXQgZmFpbGVkLgorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2xlYXIgYmZkX2Vycm9yIGJlZm9yZSBjYWxsaW5nCisJYmZkX3JlbGF4X3NlY3Rpb24sIGluIGNhc2UgaXQgcmV0dXJucyBmYWxzZSBidXQgZG9lc24ndCBmbGFnIGFuCisJZXJyb3IuICBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgaW5kaWNhdGUgd2hpY2ggb25lIGl0IGlzIGluIHRoZQorCWVycm9yIG1lc3NhZ2UuCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gbGQuaW5mbywgYW5kIHVzZSAiJDwqIiBzbworCWl0J2xsIGdldCBwaWNrZWQgdXAgZnJvbSAkKHNyY2RpcikgaWYgYXBwcm9wcmlhdGUuCisKK1R1ZSBGZWIgMTUgMTY6MzI6MDQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBPbmx5IHBhZCAudGV4dCBpZiBQQURfVEVYVCBpcyBzZXQuCisJKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChQQURfVEVYVCk6IFNldCBQQURfVEVYVC4KKworRnJpIEZlYiAxMSAxNzowMjo0OSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGV4LmwgKGNvbW1lbnQpOiBJbmNyZW1lbnQgbGluZSBudW1iZXIgd2hlbiBuZXdsaW5lIGlzIHJlYWQuCisKK0ZyaSBGZWIgMTEgMTc6MzY6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBUYWtlIG5ldyBhcmd1bWVudCwgZm9yY2VfbG9hZC4gIElmIHRydWUsCisJcmVsb2FkIHRoZSBmaWxlIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCisJKHdpbGQpOiBDYWxsIGxvb2t1cF9uYW1lIHdpdGggZm9yY2VfbG9hZCBhcmd1bWVudCBvZiAwLgorCShvcGVuX2lucHV0X2JmZHMpOiBDYWxsIGxvb2t1cF9uYW1lIHdpdGggZm9yY2VfbG9hZCBhcmd1bWVudCBvZiAxLgorCShwcmludF9zeW1ib2wpOiBSZW1vdmUgZGVjbGFyYXRpb24gb2Ygbm9uLWV4aXN0ZW50IGZ1bmN0aW9uLgorCShwcmludF9vbmVfc3ltYm9sKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYgZW5kLgorCitUaHUgRmViIDEwIDExOjUyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKG1haW4pOiBVc2UgJWxkIHdoZW4gcHJpbnRpbmcgbG9uZyB2YWx1ZXMuCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTW92ZSBfZWRhdGEgYWZ0ZXIgdGhlIC5zZGF0YSBzZWN0aW9uLgorCVBlcm1pdCBPVEhFUl9CU1NfU1lNQk9MUyB0byBiZSBkZWZpbmVkLgorCSogZW11bHBhcmFtcy9lbGYzMm1pcGIucyAoT1RIRVJfQlNTX1NZTUJPTFMpOiBEZWZpbmUgX2Zic3MuCisKK01vbiBGZWIgIDcgMTY6MzE6MTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIFJlbmFtZSBhbGwgImhwcGFvc2YiIGZpbGVzIHRvICJocHBhZWxmIi4KKwkqIENoYW5nZSBhbGwgIm9zZiIgcmVmZXJlbmNlcyB0byAiZWxmIiBpbiBocHBhZWxmIGZpbGVzLgorCSogTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KKworU3VuIEZlYiAgNiAyMDozMTo1NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCB4YXRleGl0LCBub3QgYXRleGl0LgorCUNhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLgorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2hlY2sgaWYgYmZkX3JlbGF4X3NlY3Rpb24gc2V0CisJYmZkX2Vycm5vLgorCitTYXQgRmViICA1IDAzOjU0OjM0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZW11bHRlbXBsL2xuazk2MC5lbSAoYXBwZW5kKSwgZW11bHRlbXBsL2hwcGFvc2YuZW0KKwkoaHBwYW9zZl9maW5pc2gpOiBDYWxsIHhtYWxsb2MsIG5vdCBsZG1hbGxvYy4KKwkqIGxkbWFpbi5jIChwcmVzZXJ2ZV9vdXRwdXQpOiBGdW5jdGlvbiByZW1vdmVkLgorCShtYWluKTogRG8gaXQgaGVyZSBpbnN0ZWFkLgorCitGcmkgRmViICA0IDIzOjAyOjE5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBsZGxhbmcuaCAoTEFOR19GT1JfRUFDSF97SU5QVVQsT1VUUFVUfV9TRUNUSU9OKTogRGVsZXRlICh1bnVzZWQpCisJR05VIEMgc3BlY2lmaWMgbWFjcm9zLgorCisJKiBlbXVsdGVtcGwvaHBwYW9zZi5lbSAoaHBwYW9zZl9maW5pc2gpOiBFeHBhbmQgdGhlIG9ubHkgcmVtYWluaW5nCisJY2FsbCB0byBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NFQ1RJT04uCisKK0ZyaSBGZWIgIDQgMTY6MjY6MDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZG1pc2MuYyAobGRtYWxsb2MsIHhtYWxsb2MsIGxkcmVhbGxvYywgeHJlYWxsb2MpOiBGdW5jdGlvbnMKKwlkZWxldGVkOyB3aWxsIHVzZSBsaWJpYmVydHkgdmVyc2lvbnMgaW5zdGVhZC4KKwkqIGxkY3Rvci5jIGxkZmlsZS5jIGxkbGFuZy5jIGxkbWFpbi5jIGxkbWlzYy5jIGxkbWlzYy5oIGxleHN1cC5jCisJbXJpLmMgTWFrZWZpbGUuaW46IENoYW5nZSBjYWxsZXJzLgorCisJKiBsZG1pc2MuYyAodmZpbmZvKTogUmVtb3ZlIGNsZWFudXAgY29kZS4KKwkqIGxkbWFpbi5jIChyZW1vdmVfb3V0cHV0KTogUHV0IGl0IGhlcmUgKG5ldyBmdW5jdGlvbikuCisJKHByZXNlcnZlX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KKwkobWFpbik6IFJlZ2lzdGVyIHJlbW92ZV9vdXRwdXQgYW5kIHByZXNlcnZlX291dHB1dCB3aXRoIGF0ZXhpdC4KKwkqIGxkbWFpbi5jIGxkZ3JhbS55OiBDYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4KKwkqIGxkbWlzYy5oOiBEZWNsYXJlIHhleGl0LgorCitGcmkgRmViICA0IDE1OjE5OjAxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBMb3RzIG9mIG5ldyBIOC81MDAgbWVtb3J5IG1vZGVscy4KKworU3VuIEphbiAzMCAxNDozMzo0MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBsZGxleC5sOiBSZW1vdmVkIGR1cGxpY2F0ZSBydWxlcy4KKwkoeXl3cmFwKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24sIG5lZWRlZCB3aXRoIHNvbWUgdmVyc2lvbnMgb2YKKwlmbGV4LgorCitGcmkgSmFuIDI4IDA5OjEyOjU2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRtaXNjLmMgKHZmaW5mbyk6IEZvciBgJUknLCBpZiB0aGUgZmlsZSBpcyBpbiBhbiBhcmNoaXZlLCBwcmludAorCXRoZSBhcmNoaXZlIGZpbGVuYW1lIHRvby4KKworCSogbGRsZXgubDogQWRkIHJ1bGUgdG8gY2F0Y2ggaW52YWxpZCBpbnB1dCBjaGFyYWN0ZXJzIGluc3RlYWQgb2YKKwlwcmludGluZyB0aGVtLiAgSW5jbHVkZSAibGRtYWluLmgiIGZvciBwcm9ncmFtX25hbWUgZGVjbC4KKwkobGV4X3dhcm5faW52YWxpZCk6IE5ldyBmdW5jdGlvbi4KKwkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeS4KKworRnJpIEphbiAyOCAxMjo1ODo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEb24ndCBib3RoZXIgcnVubmluZyBhbnkgdGVzdHMgb2YKKwljcm9zcy1saW5rZXIgdW50aWwgdGhlIHRlc3Qgc3VpdGUgbm8gbG9uZ2VyIGFzc3VtZXMgbmF0aXZlIG1vZGUuCisKK1RodSBKYW4gMjcgMTc6MTk6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKHByaW50X29uZV9zeW1ib2wsIHByaW50X2lucHV0X3NlY3Rpb24pOiAgUHJpbnQKKwlnbG9iYWwgc3ltYm9scyBpbiBzeW1ib2wgdGFibGUgYWdhaW4uCisKK1RodSBKYW4gMjcgMTI6MzU6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyBsZG1haW4uaCBsZGdyYW0ueTogSWYgLXYgLVYgb3IgLS12ZXJzaW9uIHdhcyBnaXZlbiwKKwlleGl0IHN1Y2Nlc3NmdWxseSBpbnN0ZWFkIG9mIGNvbXBsYWluaW5nIGlmIG5vIGlucHV0IGZpbGVzIGFyZQorCWdpdmVuLgorCitUdWUgSmFuIDI1IDEzOjE5OjQxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEZvcm1hdCB2YXJpYWJsZSBkZWZpbml0aW9ucyBjb25zaXN0ZW50bHkuCisJKExEX1BST0cpOiBSZW1vdmUgdW5uZWNlc3NhcnkgdmFyaWFibGVzIGZyb20gbGluayBjb21tYW5kLAorCWNoYW5nZSB2YXJpYWJsZSBMT0FETElCRVMgdG8gRVhUUkFMSUJTLgorCisJKiBsZG1haW4uYyAobWFpbik6IENvbXB1dGUgYW5kIGRpc3BsYXkgdG90YWwgZXhlY3V0aW9uIHRpbWUuCisJKiBsZC50ZXhpbmZvICgtc3RhdHMpOiBEb2N1bWVudCB0aGUgb3B0aW9uLgorCitNb24gSmFuIDI0IDEyOjU2OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKHJlbG9jX292ZXJmbG93KTogQWRkZWQgbmFtZSwgcmVsb2NfbmFtZSBhbmQgYWRkZW5kCisJYXJndW1lbnRzLgorCisJKiBsZGxhbmcuYyAobG9va3VwX25hbWUpOiBTZXQgQkZEIEdQIHNpemUgdG8gLUcgYXJndW1lbnQgdmFsdWUKKwlhZnRlciBvcGVuaW5nIEJGRC4KKworCSogbGRsYW5nLmMgKHJlbGF4aW5nKTogUmVtb3ZlZCBnbG9iYWwgdmFyaWFibGUuCisJKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHRoZSBjYW5vbmljYWwgc3ltYm9scyBoYXZlIG5vdCBhbHJlYWR5CisJYmVlbiByZWFkIGluLCByZWFkIHRoZW0gaW4gYmVmb3JlIHJlbGF4aW5nLgorCSogbGRsYW5nLmggKHJlbGF4aW5nKTogUmVtb3ZlZCBkZWNsYXJhdGlvbi4KKworRnJpIEphbiAyMSAwMDo0NDo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBJbml0aWFsaXplIGxvYWRlZCBmaWVsZCB0byBmYWxzZS4KKwkobG9va3VwX25hbWUpOiBJZiBmaWxlIHdhcyBhbHJlYWR5IGxvYWRlZCwgZG9uJ3QgY2FsbCB0aGUKKwlhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBhZ2Fpbi4KKworV2VkIEphbiAxOSAxMzo1NzowMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkLnRleGluZm86IENsYXJpZnkgd2hhdCAtVCBvcHRpb24gZG9lcy4KKworVHVlIEphbiAxOCAxNjoxODoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBEb24ndCB1c2UgQ1JFQVRFX09CSkVDVF9TWU1CT0xTLCB0aGF0J3MKKwlmb3IgYS5vdXQuCisKK1R1ZSBKYW4gMTEgMTM6MjI6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAoYWRkX2FyY2hpdmVfZWxlbWVudCk6IElmIHRyYWNlX2ZpbGVzIG9yCisJdHJhY2VfZmlsZV90cmllcywgcHJpbnQgZmlsZSBuYW1lLgorCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogTGlrZXdpc2UuCisJKGxkbGFuZ19hZGRfZmlsZSk6IERvbid0IHB1dCBmaWxlcyBvbiBpbnB1dF9iZmRzIGxpc3QgaW4gcmV2ZXJzZQorCW9yZGVyLgorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IENvcnJlY3QgdHlwby4KKworTW9uIEphbiAxMCAxOTo0OTowNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkZ3JhbS55LCBsZGxleC5sOiBNYWtlIHRoZSBzcGFjZSBiZXR3ZWVuIC1lLCAtdSwgYW5kIC15IGFuZAorCXRoZWlyIGFyZ3VtZW50cyBvcHRpb25hbCwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIEdOVSBsZC4KKworRnJpIEphbiAgNyAyMDowMDoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5jOiBEZWZpbmUgX19ic3Nfc3RhcnQgYmVmb3JlIHRoZSAuc2JzcyBzZWN0aW9uLgorCitUaHUgSmFuICA2IDAwOjEzOjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKGFkZF90b19zZXQpOiBBZGQgYml0c2l6ZSBhcmd1bWVudC4KKwkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24uCisJKGxpbmtfY2FsbGJhY2tzKTogQWRkIGNvbnN0cnVjdG9yX2NhbGxiYWNrLgorCSogbGRjdG9yLmMgKHN0cnVjdCBzZXRfaW5mbyk6IEFkZCBiaXRzaXplIGZpZWxkLgorCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IEFkZCBiaXRzaXplIGFyZ3VtZW50LgorCShsZGN0b3JfYnVpbGRfc2V0cyk6IEJhc2UgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBzZXQgb24KKwl0aGUgYml0c2l6ZSwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIExPTkcuCisJKiBsZGN0b3IuaCAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgYml0c2l6ZSB0byBkZWNsYXJhdGlvbi4KKworCSogbGQuaCAoUVVBRF9TSVpFKTogRGVmaW5lLgorCSogbGRncmFtLnkgKFFVQUQpOiBOZXcgdG9rZW4uCisJKGxlbmd0aCk6IEhhbmRsZSBpdC4KKwkqIGxkbGV4Lmw6IFJldHVybiBRVUFELgorCSogbGV4c3VwLmMgKGtleXdvcmRzKTogQWRkIFFVQUQuCisJKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgUVVBRC4KKwkqIGxkbGFuZy5jIChwcmludF9kYXRhX3N0YXRlbWVudCk6IEhhbmRsZSBRVUFELgorCShsYW5nX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KKwkobGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgorCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIFFVQUQgdG8gdGFibGUuCisJKiBsZC50ZXhpbmZvOiBEZXNjcmliZSBRVUFELgorCisJKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogRG9uJ3QgY3JlYXRlIC5saXQ0IG9yIC5zZGF0YSBzZWN0aW9ucywKKwlzaW5jZSB0aGUgQWxwaGEgZG9lc24ndCB1c2UgdGhlbS4KKworV2VkIEphbiAgNSAxNzo0MjoxNiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBDb21tZW50IHRoZSBtZW1iZXJzLgorCitTYXQgSmFuICAxIDEzOjM5OjMxIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFZTVGEgbWljcm8ta2VybmVsLgorCSogY29uZmlnL3ZzdGEubXQsIGVtdWxwYXJhbXMvdnN0YS5zaDogTmV3IGZpbGVzIGZvciBWU1RhLgorCitTYXQgSmFuICAxIDEwOjUzOjM1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvYW91dC5zYzogUGFkIC50ZXh0IHRvIERBVEFfQUxJR05NRU5UIGlmIHJlbG9jYXRpbmc7CisJbmVlZGVkIGZvciBpMzg2bWFjaC4gIChTaG91bGQgYmUgYSBuby1vcCBvbiBvdGhlciBzeXN0ZW1zLikKKworCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoU0VHTUVOVF9TSVpFKTogRml4IGFnYWluLgorCShQQUdFX1NJWkUpOiBEb24ndCBkZWZpbmU7IG5vdCB1c2VkLgorCitGcmkgRGVjIDMxIDE2OjEyOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRncmFtLnkgKHl5ZXJyb3IpOiBNYWtlIGFyZ3VtZW50IGNvbnN0IGNoYXIgKiwgYW5kIGFjdHVhbGx5CisJcHJpbnQgaXQgb3V0IHJhdGhlciB0aGFuIGFzc3VtaW5nIGl0IGlzIGEgc3ludGF4IGVycm9yLgorCSogbGRtaXNjLmg6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiB5eWVycm9yLgorCSogbGRlbXVsLmMsIGxkd3JpdGUuYzogQWRkIC8qQVJHU1VTRUQqLyBhcyBhcHByb3ByaWF0ZS4KKworRnJpIERlYyAzMSAxMTozNzoyOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IERvbid0IGluY2x1ZGUKKwlleGVjIGhlYWRlciBvZmZzZXQsIHNpbmNlIHRoZSBleGVjIGhlYWRlciBpc24ndCBsb2FkZWQuCisJKFBBR0VfU0laRSwgU0VHTUVOVF9TSVpFKTogQWdyZWUgd2l0aCBiZmQvaTM4Nm1hY2gzLmMuCisKK1RodSBEZWMgMzAgMTM6MDE6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJQSBtYWpvciByZXdyaXRlIHRvIG1vdmUgdGhlIGJ1bGsgb2YgdGhlIGxpbmtlciBpbnRvIEJGRCBzbyB0aGF0CisJbW9yZSBlZmZpY2llbnQgYmFja2VuZCBjb2RlIGNhbiBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyBvYmplY3QKKwlmaWxlcy4KKwkqIGxkZXJyb3IuYywgbGRlcnJvci5oLCBsZGluZHIuYywgbGRpbmRyLmgsIGxkc3ltLmMsIGxkc3ltLmgsCisJbGR3YXJuLmMsIGxkd2Fybi5oLCByZWxheC5jLCByZWxheC5oOiBSZW1vdmVkLgorCSogbGRjdG9yLmMsIGxkY3Rvci5oOiBDb21wbGV0ZSByZXdyaXRlLgorCSogbGR3cml0ZS5jLCBsZHdyaXRlLmg6IENvbXBsZXRlIHJld3JpdGUuCisJKiBsZC5oIChzdHJpcF9zeW1ib2xzX3R5cGUsIHN0cmlwX3N5bWJvbHMpOiBSZW1vdmVkLiAgVXNlCisJbGlua19pbmZvLnN0cmlwIGluc3RlYWQuICBDaGFuZ2VkIGFsbCB1c2VzLgorCShkaXNjYXJkX2xvY2Fsc190eXBlLCBkaXNjYXJkX2xvY2Fscyk6IFJlbW92ZWQuICBVc2UKKwlsaW5rX2luZm8uZGlzY2FyZCBpbnN0ZWFkLiAgQ2hhbmdlZCBhbGwgdXNlcy4KKwkobGRfY29uZmlnX3R5cGUpOiBSZW1vdmVkIHJlbG9jYXRlYWJsZV9vdXRwdXQgZmllbGQ7IHVzZQorCWxpbmtfaW5mby5yZWxvY2F0ZWFibGUgaW5zdGVhZDsgY2hhbmdlZCBhbGwgdXNlcy4gIEFkZGVkIHN0YXRzCisJZmllbGQuCisJKHNldF9hc3ltYm9sX2NoYWluLCBnZXRfYXN5bWJvbF9jaGFpbiwgZ2V0X2xvYWRlcl9zeW1ib2wsCisJc2V0X2xvYWRlcl9zeW1ib2wpOiBSZW1vdmVkLgorCSogbGRleHAuaCAobm9kZV9jbGFzcyk6IEFkZGVkIGV0cmVlX3JlbC4KKwkoZXRyZWVfdHlwZSk6IEFkZGVkIHJlbCBmaWVsZC4KKwkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEJyYWNrZXRlZCB0YWJsZSBpbml0aWFsaXphdGlvbi4KKwkoZXhwX3JlbG9wKTogTmV3IGZ1bmN0aW9uLgorCShmb2xkX25hbWUpOiBVc2UgbGlua2VyIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gbGRzeW0gZnVuY3Rpb25zLgorCShleHBfZm9sZF90cmVlKTogTGlrZXdpc2UuICBBbHNvLCBoYW5kbGUgZXRyZWVfcmVsIGNhc2UuCisJKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX3JlbC4KKwkqIGxkZ3JhbS55IChzdHJpcF9zeW1ib2xzLCBkaXNjYXJkX2xvY2Fscyk6IFJlbW92ZWQuCisJKE9QVElPTl9zdGF0cywgT1BUSU9OX25vX2tlZXBfbWVtb3J5KTogTmV3IHRva2Vucy4gIEhhbmRsZSB0aGVtLgorCShSRUwpOiBOZXcgdG9rZW4uICBEb2VzIG5vdCBhcHBlYXIgaW4gZ3JhbW1hciwgYnV0IG5lZWRlZCBmb3IKKwlleHByZXNzaW9uIGNvZGUuCisJKGZpbGUpOiBEb24ndCBjYWxsIGxhbmdfZmluYWw7IGl0J3MgY2FsbGVkIGJ5IG1haW4gYW55aG93LgorCSogbGRsZXgubDogQWNjZXB0IC1zdGF0cyBhbmQgLW5vLWtlZXAtbWVtb3J5IG9wdGlvbnMuCisJKiBsZGxhbmcuaCAoZmlsbF90eXBlKTogTWFrZSB1bnNpZ25lZCBpbnQsIG5vdCB1bnNpZ25lZCBzaG9ydC4KKwkqIGxkbGFuZy5jOiBDb25zaXN0ZW50bHkgdXNlIGZpbGxfdHlwZSBmb3IgZmlsbCBhcmd1bWVudC4KKwkobGFuZ19pbml0X3NjcmlwdF9maWxlLCBzY3JpcHRfZmlsZSk6IFJlbW92ZWQuCisJKGNyZWF0ZV9vYmplY3Rfc3ltYm9scyk6IFJlbW92ZWQuICBVc2UKKwlsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gaW5zdGVhZC4gIENoYW5nZWQgYWxsCisJdXNlcy4KKwkobGFuZ19hZGRfa2VlcHN5bXNfZmlsZSk6IFJlbW92ZWQuCisJKGxvb2t1cF9uYW1lKTogQ2FsbCBiZmRfbGlua19hZGRfc3ltYm9scyBpbnN0ZWFkIG9mCisJbGRtYWluX29wZW5fZmlsZV9yZWFkX3N5bWJvbC4KKwkod2lsZCk6IERvbid0IGl0ZXJhdGUgb3ZlciBzY3JpcHRfZmlsZS4KKwkob3Blbl9vdXRwdXQpOiBDcmVhdGUgbGluayBoYXNoIHRhYmxlLgorCShsYW5nX3BsYWNlX3VuZGVmaW5lZHMpOiBSZXdyb3RlLgorCShsYW5nX3NpemVfc2VjdGlvbnMpOiBIYW5kbGUgcmVsYXhpbmcgKGRvZXNuJ3Qgd29yayB5ZXQpLgorCShsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBSZW1vdmVkLgorCShsYW5nX2ZpbmlzaCk6IFVzZSBsaW5rIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gbGRzeW0gZnVuY3Rpb25zLgorCShsYW5nX2NvbW1vbik6IFJld3JvdGUuCisJKGxhbmdfb25lX2NvbW1vbik6IE5ldyBmdW5jdGlvbi4KKwkobGRsYW5nX2FkZF9maWxlKTogQWRkIGZpbGUgdG8gbGlua19pbmZvLmlucHV0X2JmZHMgbGlzdC4gIFNldAorCXVzcmRhdGEuCisJKGNyZWF0ZV9zeW1ib2wpOiBSZW1vdmVkLgorCShsYW5nX3Byb2Nlc3MpOiBEb24ndCBjYWxsIGxhbmdfaW5pdF9zY3JpcHRfZmlsZS4gIENhbGwKKwlsZGN0b3JfYnVpbGRfc2V0cyByYXRoZXIgdGhhbiBmaW5kX2NvbnN0cnVjdG9ycy4gIERvbid0IGNhbGwKKwlsYW5nX3JlbG9jYXRlX2dsb2JhbHMuCisJKGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YpOiBSZXdyb3RlLgorCShsYW5nX2Fic19zeW1ib2xfYXRfZW5kX29mKTogUmV3cm90ZS4KKwkqIGxkbWFpbi5jIChoYWRfeSk6IFJlbW92ZWQuCisJKGxwcmVmaXgsIGxwcmVmaXhfbGVuKTogUmVtb3ZlZDsgdXNlIGxpbmtfaW5mbyBmaWVsZHMgaW5zdGVhZC4KKwlDaGFuZ2VkIGFsbCB1c2VzLgorCShtdWx0aXBsZV9kZWZfY291bnQsIGNvbW1vbnNfcGVuZGluZywgdW5kZWZpbmVkX2dsb2JhbF9zeW1fY291bnQsCisJdG90YWxfc3ltYm9sc19zZWVuLCB0b3RhbF9maWxlc19zZWVuKTogUmVtb3ZlZC4KKwkobGlua19jYWxsYmFja3MsIGxpbmtfaW5mbyk6IE5ldyB2YXJpYWJsZXMuCisJKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby4gIERvbid0IGNhbGwgaW5pdF9iZmRfZXJyb3JfdmVjdG9yIG9yCisJbGRzeW1faW5pdC4gIERvbid0IHNldCBub3cgdW51c2VkIHZhcmlhYmxlcy4gIEhhbmRsZSAtc3RhdHMuCisJKGdldF9lbXVsYXRpb24pOiBSZW1vdmVkIG9ic29sZXRlIGFuZCBub25mdW5jdGlvbmFsIEdOVTk2MCBjb2RlLgorCShhZGRfeXN5bSk6IFJld3JvdGUuCisJKHJlYWRfZW50cnlfc3ltYm9scywgcmVmaXplLCBlbnRlcl9nbG9iYWxfcmVmLCBlbnRlcl9maWxlX3N5bWJvbHMsCisJc2VhcmNoX2xpYnJhcnksIGdudTk2MF9jaGVja19mb3JtYXQsIGRlY29kZV9saWJyYXJ5X3N1YmZpbGUsCisJbGluZWFyX2xpYnJhcnksIHN5bWRlZl9saWJyYXJ5LCBjbGVhcl9zeW1zLCBzdWJmaWxlX3dhbnRlZF9wKToKKwlSZW1vdmVkLgorCShhZGRfa2VlcHN5bXNfZmlsZSwgYWRkX2FyY2hpdmVfZWxlbWVudCwgbXVsdGlwbGVfZGVmaW5pdGlvbiwKKwltdWx0aXBsZV9jb21tb24sIGFkZF90b19zZXQsIHdhcm5pbmdfY2FsbGJhY2ssIHVuZGVmaW5lZF9zeW1ib2wsCisJcmVsb2Nfb3ZlcmZsb3csIHJlbG9jX2Rhbmdlcm91cywgdW5hdHRhY2hlZF9yZWxvYywgbm90aWNlX3lzeW0pOgorCU5ldyBmdW5jdGlvbnMuCisJKiBsZG1pc2MuYyAodmZpbmZvKTogQWNjZXB0IGEgc3RyaW5nIGZvciAlVCwgbm90IGEgc3ltYm9sLiAgRG9uJ3QKKwlyZXF1aXJlIHN5bWJvbHMgZm9yICVDOyBsb29rIHRoZW0gdXAgaW5zdGVhZC4KKwkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtOiBQYXNzIGxpbmtfaW5mbyB0bworCWhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KKwkoQ0ZJTEVTKTogUmVtb3ZlZCBsZGVycm9yLmMsIGxkaW5kci5jLCBsZHN5bS5jLCBsZHdhcm4uYywgYW5kCisJcmVsYXguYy4KKwkoSEZJTEVTKTogUmVtb3ZlZCBsZGVycm9yLmgsIGxkaW5kci5oLCBsZHN5bS5oLCBsZHdhcm4uaCwgYW5kCisJcmVsYXguaC4KKwkoRU1VTEFUSU9OX09GSUxFUyk6IERlcGVuZCBvbiBiZmRsaW5rLmgsIGxkbWFpbi5oLCBsZGV4cC5oLAorCWxkbGFuZy5oIGFuZCBsZGN0b3IuaC4KKworCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiBEb24ndCBkZXBlbmQgb24gbGRncmFtLmguICBSZW1vdmUKKwlkZWNsYXJhdGlvbnMgb2YgZnJlZSBhbmQgbWFsbG9jIGZyb20gZmxleCBvdXRwdXQuICBDaGFuZ2UgbWFsbG9jCisJdG8gbGRtYWxsb2MgaW4gZmxleCBvdXRwdXQuCisKK1RodSBEZWMgMTYgMjE6MTk6NTcgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGxkbWFpbi5jIChscHJlZml4KTogQ2hhbmdlIGRlZmF1bHQgZnJvbSBhIGNoYXIgdG8gYSBzdHJpbmcKKwl3aXRoIG9ubHkgb25lIGNoYXJhY3Rlci4KKwkobHByZWZpeF9sZW4pOiBTZXQgZGVmYXVsdCB0byBvbmUuCisKKwkqIGxkbWFpbi5oIChscHJlZml4X2xlbik6IERlY2xhcmUuCisKKwkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogVXNlIHN0cm5jbXAgcmF0aGVyIHRoYW4gYSBjaGFyYWN0ZXIKKwljb21wYXJpc29uIGZvciBscHJlZml4LgorCisJKiBlbXVsdG1wbC9tODhrYmNzLmVtIChiZWZvcmVfcGFyc2UpOiBTZXQgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KKwljb3JyZWN0bHkuCisKKwkqIGVtdWx0bXBsL2hwcGFvc2YuZW06IEluY2x1ZGUgbGRleHAuaC4KKwkoYmVmb3JlX3BhcnNlKTogU2V0IGxwcmVmaXggYW5kIGxwcmVmaXhfbGVuIGNvcnJlY3RseS4KKworVHVlIERlYyAxNCAxNzoxOTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbGV4Lmg6IERvbid0IGRlY2xhcmUgeXl3cmFwIGlmIGl0IGlzIGEgbWFjcm8uCisJKiBsZGxleC5sOiBJbmNsdWRlIHN5c2RlcC5oLgorCSogbGRsYW5nLmMgKGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciwKKwlsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCk6IEZvcmdvdCB0byB1c2UgUEFSQU1TLgorCitNb24gRGVjIDEzIDE0OjMwOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZGVkIC5QSE9OWSB0YXJnZXRzIHdoZXJlIGFwcHJvcHJpYXRlLiAgQWRkZWQgc29tZQorCWNvbW1lbnRzLiAgQWxzbzoKKwkoZ2NjbGliZGlyLCB2ZXJzaW9uKTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLgorCShERVApOiBOZXcgdmFyaWFibGUsIHNldCB0byBta2RlcC4KKwkoQUxMX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4gIFVzZWQgaW4gLmMubyB0YXJnZXQuCisJKENGSUxFUywgSEZJTEVTLCBHRU5FUkFURURfQ0ZJTEVTLCBHRU5FUkFURURfSEZJTEVTKTogTmV3CisJdmFyaWFibGVzLgorCShIRUFERVJTLCBNQU5TT1VSQ0VTLCBMRENTT1VSQ0VTLCBHRU5FUkFURURfU09VUkNFUywKKwlHRU5FUkFURURfSEVBREVSUywgTERTT1VSQ0VTLCBCRkRfU09VUkNFUywgU09VUkNFUyk6IFJlbW92ZWQKKwltb3N0bHkgb2Jzb2xldGUgdmFyaWFibGVzLiAgQWRqdXN0ZWQgcmVtYWluaW5nIHVzZXMuCisJKERFRl9FTVVMKTogUmVtb3ZlZCB2YXJpYWJsZS4KKwkobGRtYWluLm8pOiBIYW5kbGUgdW5kZWZpbmVkIEVNVUwgZXJyb3IgY29ycmVjdGx5LgorCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIGNvbmZpZy5zdGF0dXMgcmF0aGVyIHRoYW4gTWFrZWZpbGUuCisJQ3JlYXRlIHZpYSB0ZW1wb3JhcnkgZmlsZS4KKwkodmVyOTYwLmMsIHJvbGwsIG1ha2UpOiBSZW1vdmVkIG9ic29sZXRlIHRhcmdldHMuCisJKC5kZXAsIC5kZXAxLCBkZXAuc2VkLCBkZXAsIGRlcC1pbik6IE5ldyB0YXJnZXRzLiAgVXNlZCB0byByZWJ1aWxkCisJZGVwZW5kZW5jaWVzLgorCSogZGVwLWluLnNlZDogTmV3IGZpbGUsIHVzZWQgd2hlbiByZWJ1aWxkaW5nIGRlcGVuZGVuY2llcy4KKworU2F0IERlYyAxMSAxNDo0Mzo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGRlbmViLmN5Z251cy5jb20pCisKKwlNYWRlIG1hbnkgY2hhbmdlcyB0byBlbGltaW5hdGUgZ2NjIHdhcm5pbmdzLiAgTWFkZSB2YXJpb3VzCisJY29zbWV0aWMgY2hhbmdlcywgZGVjbGFyZWQgdmFyaW91cyB0aGluZ3MgaW4gaGVhZGVyIGZpbGVzLCByZW1vdmVkCisJdmFyaW91cyBleHRlcm4gZGVjbGFyYXRpb25zIGZyb20gLmMgZmlsZXMuICBObyBzdWJzdGFudGl2ZQorCWNoYW5nZXMuCisKKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBJZmRlZiBvdXQgZmluYWwgY2FsbCB0bworCWxhbmdfc2l6ZV9zZWN0aW9ucyBhZ2FpbiAocmV2ZXJ0aW5nIGNoYW5nZSBvZiBOb3ZlIDIpLCBzaW5jZSBpdAorCWJyZWFrcyB0aGUgU3VuNCBsaW5rZXIuCisKK1RodSBEZWMgIDIgMTY6MzE6NDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGFscGhhLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEuCisKK1dlZCBEZWMgIDEgMTQ6MDQ6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogR3JvdXAgdGFyZ2V0cyBieSBDUFUuICBNZXJnZSBzb21lIG02OGsgdGFyZ2V0CisJZW50cmllcyB3aXRoIGRpZmZlcmVudCBDUFUgc3BlY3MgdGhhdCB1c2UgdGhlIHNhbWUgbGRfdGFyZ2V0CisJdmFsdWVzLgorCisJKiBjb25maWd1cmUuaW46IEFkZCBzcGFyYyotKi1jb2ZmLgorCSogY29uZmlnL2NvZmYtc3BhcmMubXQsIGVtdWxwYXJhbXMvY29mZl9zcGFyYy5zaDogTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2NvZmZfc3BhcmMuby4KKwkoZW1fY29mZl9zcGFyYy5jKTogQWRkIGRlcGVuZGVuY2llcyBhbmQgYnVpbGQgcnVsZXMuCisKKwkqIGxkbWlzYy5jIChlcnJubywgc3lzX25lcnIsIHN5c19lcnJsaXN0KTogRG9uJ3QgZGVjbGFyZS4KKworV2VkIERlYyAgMSAxMjoxOTo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkZ3JhbS55IChPUFRJT05fY2FsbF9zaGFyZWQsIE9QVElPTl9ub25fc2hhcmVkLCBPUFRJT05fT3ZhbCk6CisJTmV3IHRva2Vucy4KKwkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIHRoZW0gKGZvciBub3cpLgorCSogbGRsZXgubCAoPENPTU1BTkQ+KTogSGFuZGxlIC1ub25fc2hhcmVkLCAtY2FsbF9zaGFyZWQsIGFuZCAtT24KKwl3aGVyZSBuIGlzIGEgbnVtYmVyLgorCitNb24gTm92IDIyIDE0OjE0OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBJZiBtZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aGljaCBpcworCW5vdCBpbiBiZmRfY29tX3NlY3Rpb24sIGNyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgQkZEIHNvIHRoYXQgaXQKKwljYW4gYmUgcGxhY2VkIGluIHRoZSByaWdodCBvdXRwdXQgc2VjdGlvbi4KKworRnJpIE5vdiAxOSAxNDoxMjozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg1Kik6IE5ldyB0YXJnZXQuICBVc2UgbWlwc2ItZWxmMzIuCisJKiBlbXVscGFyYW1zL2VsZjMybWlwc2Iuc2ggKERBVEFfQUREUik6IERlZmluZS4KKwkoT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMpOiBEZWZpbmUgZm9yIC5yZWdpbmZvLgorCShFWEVDVVRBQkxFX1NZTUJPTFMpOiBEZWZpbmUgZm9yIF9EWU5BTUlDX0xJTksuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSBFWEVDVVRBQkxFX1NZTUJPTFMgd2hlbiBub3QgcmVsb2NhdGluZy4KKwlNb3ZlIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TIGFmdGVyIGFsbCB0aGUgb3RoZXIgcmVhZG9ubHkKKwlzZWN0aW9ucy4gIERvbid0IHVzZSBEQVRBX0FERFIgdHdpY2UuCisKKwkqIGxkbWFpbi5jIChlbnRlcl9maWxlX3N5bWJvbHMpOiBSZW1vdmVkIGR1cGxpY2F0ZSB0ZXN0cyBvZiBwLiAgSWYKKwlwIGlzIGluIGEgY29tbW9uIHNlY3Rpb24sIG1ha2Ugc3VyZSB0aGUgQkZEIGhhcyBhIHNlY3Rpb24gb2YgdGhhdAorCW5hbWUuCisKKwkqIGxkbGFuZy5jIChsYW5nX2NvbW1vbik6IEFkZCBuZXdsaW5lIHRvIGVycm9yIG1lc3NhZ2UuCisKK1RodSBOb3YgMTEgMTU6NTQ6NDEgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBlbXVscGFyYW1zL202OGtseW54LnNoIChTQ1JJUFRfTkFNRSk6IERlZmluZSB0byB1c2UgYQorCUx5bngtc3BlY2lmaWMgc2NyaXB0IGluc3RlYWQgb2YgbTY4a2NvZmYuCisJKE9VVFBVVF9GT1JNQVQpOiBEZWZpbmUgYXMgImNvZmYtbTY4ay1seW54Ii4KKwkoRU5UUlkpOiBEZWZpbmUgYXMgX19tYWluLgorCShURVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMC4KKwkoUEFHRV9TSVpFKTogRGVmaW5lIGFzIDB4MTAwMC4KKwkqIGVtdWxwYXJhbXMvaTM4Nmx5bnguc2gsIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoOiBGaXggY29tbWVudC4KKwkqIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBOZXcgZmlsZS4KKworTW9uIE5vdiAgOCAxMjowMDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uKTogSWdub3JlIC1taXBzMSwgLW1pcHMyIGFuZCAtbWlwczMKKwlhcmd1bWVudHMgcmF0aGVyIHRoYW4gdHJlYXRpbmcgdGhlbSBhcyBlbXVsYXRpb24gbmFtZXMuCisKK0ZyaSBOb3YgIDUgMDk6MDI6NTIgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFN1cHBvcnQgeDg2IHVuaXh3YXJlIGFuZCBuZXR3YXJlIHBsdXMgZ2VuZXJpYyBuZXR3YXJlLgorCitGcmkgTm92ICA1IDIxOjQ3OjU1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoVEVYVF9TVEFSVF9BRERSLCBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOgorCUNvcnJlY3QgdmFsdWVzICg/KS4KKworV2VkIE5vdiAgMyAxNToxMDoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IGRlbGV0ZSBkdmkgb3IgaW5mbyBmaWxlcy4KKwkobGQuaW5mbyk6IFVwZGF0ZSBkZXBlbmRlbmN5IGxpc3QuCisJKGxkLmR2aSk6IERpdHRvLiAgRXh0ZW5kIFRFWElOUFVUUyB0byBnZXQgYmZkc3VtbS50ZXhpLgorCitXZWQgTm92ICAzIDEyOjA3OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKGxhbmdfYWRkX291dHB1dCk6IFRha2UgbmV3IGFyZywgRlJPTV9TQ1JJUFQuCisJU2V0IG91dHB1dF9maWxlbmFtZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuCisJKG9wZW5fb3V0cHV0KTogRG9uJ3Qgc2V0IG91dHB1dF9maWxlbmFtZS4KKwkobGFuZ19maW5hbCk6IENyZWF0ZSB0aGUgbmV3IG5vZGUgaGVyZS4KKwkqIGxkbGFuZy5jLCBsZGxhbmcuaCwgbGRncmFtLnksIG1yaS5jOiBwYXNzIEZST01fU0NSSVBULgorCitUdWUgTm92ICAyIDE1OjQ1OjUxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgCUZyb20gUGV0ZSBIb29nZW5ib29tIChob29nZW5AY3MudXRhaC5lZHUpOgorCisJKiBzY3JpcHR0ZW1wbC9ocHBhb3NmLnNjOiAoX19fc3RhY2tfemVybywgZXRleHQsIF9ldGV4dCwKKwllZGF0YSwgX2VkYXRhLCBlbmQpOiBBZGQgZGVmaW5pdGlvbnMgb2YgdGhlc2Ugc3ltYm9scy4KKwkoX19lbmQpOiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2wuCisJKF9fZGF0YV9zdGFydCk6IE1vdmUgZGVmaW5pdGlvbiBvZiB0aGlzIHN5bWJvbC4KKworCSogZW11bHRlbXBsL2hwcGFvc2YuZW06ICBWYXJpb3VzIGZpeGVzIGFuZCBzdXBwb3J0IGZvciBsaW5rZXIgc3R1YgorCWdlbmVyYXRpb24uCisJKGhwcGFvc2ZfZmluaXNoLCBocHBhb3NmX3NlYXJjaF9mb3JfcGFkZGluZ19zdGF0ZW1lbnRzLAorCWhwcGFvc2ZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBOZXcgZnVuY3Rpb25zIGluCisJc3VwcG9ydCBvZiBsaW5rZXIgc3R1YiBnZW5lcmF0aW9uLgorCShsZF9ocHBhb3NmX2VtdWxhdGlvbik6ICBSZWRlZmluZSB0byBpbmNsdWRlIG5ldworCWVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lcy4KKworCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IFJlLWVuYWJsZSBsYXN0IGNhbGwgbGFuZ19zaXplX3NlY3Rpb25zLgorCVBhc3MgYWJzX291dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIE5VTEwgdG8gYXZvaWQgaW52YWxpZGF0aW5nCisJYWJzb2x1dGUgc3ltYm9scy4KKworVGh1IE9jdCAyOCAyMToxNjo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9pMzg2bWFjaC5vLgorCShlbV9pMzg2bWFjaC5jKTogTmV3IHJ1bGUuCisJKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1tYWNoKik6IE5ldyBjYXNlLgorCSogY29uZmlnL2kzODYtbWFjaC5tdDogTmV3IGZpbGUuCisJKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoOiBOZXcgZmlsZS4KKworRnJpIE9jdCAyOSAxNDo1NTowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGxkLmggKGZsYWdfaXNfKik6IFJlbW92ZWQgbWFjcm9zLgorCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpLCBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6CisJQ29uc2lzdGVudGx5IGNoZWNrIHRoZSBCRkQgc3ltYm9sIGZsYWdzIGRpcmVjdGx5LCByYXRoZXIgdGhhbgorCXVzaW5nIGZpbGVfaXNfKiBtYWNyb3MuCisKK1RodSBPY3QgMjggMTk6MDg6NDIgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLWx5bnhvcyopOiBOZXcgdGFyZ2V0LgorCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBlbV9zcGFyY2x5bnguYy4KKwkoQUxMX0VNVUxBVElPTlMpOiBBZGQgTHlueCBlbXVsYXRpb25zLgorCSogY29uZmlnL3NwYXJjLWx5bngubXQ6IE5ldyBmaWxlLgorCSogZW11bHBhcmFtcy9zcGFyY2x5bnguc2g6IE5ldyBmaWxlLgorCSogc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBOZXcgZmlsZS4KKworVGh1IE9jdCAyOCAxMzo1MDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBmb3IgJChFTVVMQVRJT05fT0ZJTEVTKS4KKworTW9uIE9jdCAyNSAxNjowOToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHJlbGF4LmMgKHdyaXRlX3JlbGF4KTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZWNsZXRfbGluay4KKworTW9uIE9jdCAyNSAwOTozMToyMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlKTogTmV3IHZhcmlhYmxlLgorCShvcGVuX291dHB1dCk6IFNldCBpdCBhZnRlciBiZmQgb3BlbiBzdWNjZWVkcy4KKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBUZXN0IGl0LgorCisJQ2hhbmdlcyBmcm9tIFBldGVyIEhvb2dlbmJvb20sIGhvb2dlbkBjcy51dGFoLmVkdToKKworCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBTZXQgdGhlIEJTRl9GSUxFIGZsYWcgZm9yIG9iamVjdAorCXN5bWJvbHMuCisKKwkqIGxkZW11bC5jOiBTdXBwb3J0IHdhcyBhZGRlZCB0byBhbGxvdyBlbXVsYXRpb24tc3BlY2lmaWMKKwlwcm9jZXNzaW5nIHRvIG9jY3VyLiAgVGhpcyBzdXBwb3J0IHdhcyBhZGRlZCBwcmltYXJpbHkgZm9yIGxpbmtlcgorCXN0dWIgZ2VuZXJhdGlvbiBpbiB0aGUgZWxmMzItaHBwYSBnbGQuCisJKGxkZW11bF9maW5pc2gsIGxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6ICBOZXcKKwlmdW5jdGlvbnMuCisJKiBsZGVtdWwuaDogU3VwcG9ydCB3YXMgYWRkZWQgdG8gYWxsb3cgZW11bGF0aW9uLXNwZWNpZmljCisJcHJvY2Vzc2luZyB0byBvY2N1ci4gKEFzIGRlc2NyaWJlZCBhYm92ZS4pICBBZGRlZCBmaW5pc2ggYW5kCisJY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgZmllbGRzIHRvCisJbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IHN0cnVjdHVyZS4KKwkqIGxkbGFuZy5jOiBBZGQgY2FsbHMgdG8gZW11bGF0aW9uLXNwZWNpZmljIHJvdXRpbmVzLgorCShsYW5nX3Byb2Nlc3MpOiAgQWRkIGNhbGwgdG8KKwlsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgZnVuY3Rpb24uCisJKGxhbmdfcHJvY2Vzcyk6ICBBZGQgY2FsbCB0byBhIGVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lIChhbmQKKwlzb21lIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGNhbGwpLgorCitGcmkgT2N0IDIyIDIwOjU0OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBtaXBzKi0gaW5zdGVhZCBvZiBtaXBzLSwgbWlwcyplbCBjaGFuZ2VzCisKK1R1ZSBPY3QgMTkgMTU6NDY6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGFscGhhLSotb3NmKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS5tdC4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX2FscGhhLm8uCisJKGVtX2FscGhhLmMpOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEuc2ggYW5kIGFscGhhLnNjLgorCSogY29uZmlnL2FscGhhb3NmLm1oIChOQVRJVkVfTElCX0RJUlMsIEhPU1RJTkdfQ1JUMCk6IERlZmluZS4KKwkqIGNvbmZpZy9hbHBoYS5tdDogTmV3IGZpbGUuCisJKiBlbXVscGFyYW1zL2FscGhhLnNoOiBOZXcgZmlsZS4KKwkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBOZXcgZmlsZS4KKworRnJpIE9jdCAxNSAwMjoyMDowNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2NvbW1vbik6IEFMSUdOX04gY2FuJ3QgaGFuZGxlCisJdHlwZXMgb2YgZGlmZmVyZW50IHNpemVzIChlZzogNjQgYW5kIDMyIGJpdHMpLCBzbyBjb2VyY2UuCisJKiBsZC5oIChBTElHTl9OKTogQWRkIHdhcm5pbmcgYWJvdXQgdXNhZ2UuCisKK1dlZCBPY3QgMTMgMTY6MDI6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAoZW50ZXJfZ2xvYmFsX3JlZik6IEp1c3QgaWdub3JlIGFueSB3ZWFrIHN5bWJvbCBmb3IKKwl3aGljaCB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBjaGVja2luZyBpbgorCXNldmVyYWwgZGlmZmVyZW50IHBsYWNlcyB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgd2Vhay4KKworVHVlIE9jdCAxMiAxNzozMDo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVsZiopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwc2ItZWxmMzIuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE9ubHkgdXNlIE9USEVSX1JFQURPTkxZX1NFQ1RJT05TIGFuZAorCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyBpZiByZWxvY2F0aW5nLiAgU2hlbGwgdmFyaWFibGVzIGFyZSBub3QKKwlleHBhbmRlZCB3aXRoaW4gdGhlbS4KKwkqIGNvbmZpZy9taXBzYi1lbGYzMi5tdDogTmV3IGZpbGUuCisJKiBlbXVscGFyYW1zL2VsZjMybWlwYi5zaDogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoZW1fZWxmMzJtaXBiLmMpOiBOZXcgdGFyZ2V0LgorCitUaHUgU2VwIDMwIDE3OjAwOjM2IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogbGRncmFtLnk6IEluIGlucHV0X2xpc3QsIGNoYW5nZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtIHRvCisJbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0gc28gb2JqZWN0cyBicm91Z2h0IGluIHVzaW5nCisJSU5QVVQoKSBkbyBhIHBhdGggbG9va3VwLgorCitUdWUgU2VwIDI4IDEzOjMxOjIzIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgTHlueCBsZF90YXJnZXQgdG8gYmUge2kzODYsbTY4a30tbHlueAorCWluc3RlYWQgb2Yge2kzODYsbTY4a30tY29mZi4KKwkqIE1ha2VmaWxlLmluIChlbV9pMzg2bHlueC5jLCBlbV9tNjhrbHlueC5jKTogTmV3IHRhcmdldHMuCisJKiBjb25maWcvaTM4Ni1seW54Lm10OiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9tNjhrLWx5bngubXQ6IE5ldyBmaWxlLgorCSogZW11bHBhcmFtcy9pMzg2bHlueC5zaDogTmV3IGZpbGUuCisJKiBlbXVscGFyYW1zL202OGtseW54LnNoOiBOZXcgZmlsZS4KKworCSogc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IE1ha2UgRU5UUlkgZ2V0IGl0cyB2YWx1ZSBmcm9tICR7RU5UUll9LAorCWJ1dCBkZWZhdWx0aW5nIHRvIF9zdGFydC4KKworCSogbGRlbXVsLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkbWlzYy5jLCBsZG1pc2MuaCwKKwlsZHN5bS5jLCBsZHdhcm4uYzogUmVuYW1lIGluZm8gdG8gaW5mb19tc2csIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKKwlMeW54T1MgbGliYy4KKworVGh1IFNlcCAyMyAxNDo1MTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zb2xhcmlzMi5taDogTmV3IGZpbGUuICBEZWZpbmUgSE9TVElOR19DUlQwIGFuZAorCUhPU1RJTkdfTElCUyBmb3IgdGVzdGluZy4KKworRnJpIFNlcCAxNyAxNzo1MjoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwlGaW5pc2ggdXAgc3VwcG9ydCBmb3IgaTM4Ni1zeXN2NCAod2l0aG91dCBzaGFyZWQgbGlicmFyaWVzKToKKwkqIGxkLmggKGZsYWdfaXNfd2Vhayk6IERlZmluZS4KKwkqIGxkbGFuZy5jIChwcmludF9zeW1ib2wpOiBNZW50aW9uIHdoZXRoZXIgc3ltYm9sIGlzIHdlYWsuCisJKHByaW50X2lucHV0X3NlY3Rpb24pOiBQcmludCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFscy4KKwkqIGxkbWFpbi5jIChyZWZpemUpOiBEbyBub3QgemVybyBvdXQgQlNGX1dFQUsgZmxhZy4KKwkoZW50ZXJfZ2xvYmFsX3JlZik6IERvIG5vdCB3YXJuIGlmIGEgd2VhayBzeW1ib2wgcmVkZWZpbmVzIGEKKwlnbG9iYWwgc3ltYm9sLiAgRG8gbm90IGxldCBhIHdlYWsgc3ltYm9sIHJlZGVmaW5lIGEgY29tbW9uIHN5bWJvbC4KKwkoZW50ZXJfZmlsZV9zeW1ib2xzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbCBzeW1ib2xzLgorCShzdWJmaWxlX3dhbnRlZF9wKTogRG8gbm90IHB1bGwgaW4gYW4gb2JqZWN0IGZpbGUgZnJvbSBhIGFyY2hpdmUKKwlqdXN0IHRvIHJlc29sdmUgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgorCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IG5lZWRsZXNzbHkgbWFsbG9jIHNwYWNlIGFmdGVyIGEgZmF0YWwKKwllcnJvcjsgdGhlIGVycm9yIG1pZ2h0IGJlIHRoYXQgbWFsbG9jIGhhcyBydW4gb3V0IG9mIHNwYWNlLgorCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgZ2xvYmFsLgorCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc3lzdjQqLCBpWzM0XTg2LSotZWxmKik6IE5ldyB0YXJnZXRzOworCXVzZSBpMzg2LWVsZi4KKwkqIGNvbmZpZy9pMzg2djQubWg6IE5ldyBmaWxlOyBzZXQgTkFUSVZFX0xJQl9ESVJTIHRvIC91c3IvY2NzL2xpYi4KKwkqIGNvbmZpZy9pMzg2LWVsZi5tdDogTmV3IGZpbGU7IHNldCBFTVVMIHRvIGVsZl9pMzg2LgorCSogZW11bHBhcmFtcy9lbGZfaTM4Ni5zaDogTmV3IGZpbGUuCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFVzZSAke05PUH0gYXMgZmlsbGVyIChkZWZhdWx0cyB0byAwKS4KKwkqIE1ha2VmaWxlLmluIChOQVRJVkVfTElCX0RJUlMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCisJKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtX2VsZl9pMzg2Lm8uCisJKEdFTlNDUklQVFMpOiBQYXNzIE5BVElWRV9MSUJfRElSUyBhcyBzaXh0aCBhcmd1bWVudC4KKwkoZW1fZWxmX2kzODYuYyk6IE5ldyB0YXJnZXQsIGxpa2Ugb3RoZXIgZW1fKi5jIHRhcmdldHMuCisJKCQoTERfUFJPRykpOiBQYXNzICQoQ0ZMQUdTKSB0byAkKENDKS4KKwkqIGdlbnNjcmlwdHMuc2g6IEFjY2VwdCBOQVRJVkVfTElCX0RJUlMgYXMgc2l4dGggYXJndW1lbnQuICBJZgorCW5vbmVtcHR5LCBhbmQgY29uZmlndXJlZCBmb3IgbmF0aXZlLCBhZGQgaXQgdG8gTElCX1BBVEguCisKK0ZyaSBTZXAgMTcgMTM6MDc6MzkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC97aDgzMDAuc2MsaDg1MDAuc2MsaTM4NmNvZmYuc2MsbTY4a2NvZmYuc2Msc2guc2N9OgorCUFkZGVkIHN0YXRlbWVudHMgdG8gcGFzcyBzdGFiIGFuZCBzdGFic3RyIHNlY3Rpb25zIHRocm91Z2ggYW5kCisJbWFyayB0aGVtIGFzIE5PTE9BRCwgd2hpY2ggbWFrZXMgR0RCIGhhcHBpZXIuCisKK1dlZCBTZXAgMTUgMTY6MDI6MjkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFjY2VwdCBtNjhrLWx5bngtbHlueG9zIGNvbmZpZy4KKworCSogTWFrZWZpbGUuaW46IFVzZSAkKFNIRUxMKSB0byBydW4gZ2Vuc2NyaXB0cy5zaC4KKworU3VuIFNlcCAxMiAxNjowNDo0MCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9jb2ZmLWg4MzAwLm10OiBBZGQgRU1VTD1oODMwMGguCisKKwkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBzZXRfc2NyaXB0c19kaXIgYWZ0ZXIgYXJndiBoYXMgYmVlbiBwcm9jZXNzZWQuCisKK0ZyaSBTZXAgMTAgMDk6MzY6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IENoYW5nZWQgQ1hYIGJhY2sgdG8gZysrLgorCitGcmkgU2VwIDEwIDA5OjM0OjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBGaXhlZCBSVU5URVNUKiBDWFggQ1hYRkxBR1MgbWFjcm9zIGFuZCBjaGVjayBydWxlLgorCitGcmkgU2VwIDEwIDA3OjI2OjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBVc2Ugc2hlbGwgd2lsZGNhcmRzLgorCitUdWUgU2VwICA3IDE4OjA0OjU0IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgYWRkIFRFWElOUFVUUyB2YXJpYWJsZSBhbmQgdXNlIGl0IGluIGxkLmR2aSB0YXJnZXQKKworRnJpIFNlcCAgMyAxNjo0Njo0MSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBsZC50ZXhpbmZvOiByZS1lbmFibGUgaW5jbHVkZWQgY29uZmlnIGZpbGU7IGNvbmRpdGlvbmFsaXplIGRvYworCWZvciAtb2Zvcm1hdCB0byBpbnRlcmFjdCBwcm9wZXJseSB3aXRoIFNpbmdsZUZvcm1hdCBkb2MgY29uZmlnCisJdmFyOyByZW5hbWUgQHVwL0Bkb3duIHRvIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLgorCitXZWQgQXVnIDI1IDE2OjI5OjU2IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwLgorCitUdWUgQXVnIDI0IDE4OjQ5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCUZyb20gUGV0ZXIgSG9vZ2VuYm9vbSA8aG9vZ2VuQHNoYWZlci5jcy51dGFoLmVkdT46CisJKiBlbXVsdGVtcGwvaHBwYW9zZi5lbSAobGRfaHBwYW9zZl9lbXVsYXRpb24pOiBDb3JyZWN0IG5hbWUgZm9yIFBBCisJRUxGIGVtdWxhdGlvbiBpcyAiZWxmMzItaHBwYSIgbm90ICJlbGYtYmlnIi4KKwkoaHBwYW9zZl9iZWZvcmVfcGFyc2UpOiBSZW1vdmUgdW5uZWVkZWQgcHJvY2Vzc2luZyBvZiBlbnZpcm9ubWVudAorCXZhcmlhYmxlcy4KKwkqIHNjcmlwdHRlbXBsL2hwcGFvc2Yuc2M6IEluY2x1ZGUgLmhwcGFfbGlua2VyX3N0dWJzIHNlY3Rpb25zIGluCisJLnRleHQgc2VnbWVudCBvZiBvdXRwdXQgZmlsZS4KKwkqIGVtdWxwYXJhbXMvaHBwYW9zZi5zaCAoT1VUUFVUX0ZPUk1BVCk6IFVzZSBlbGYzMi1ocHBhLgorCitUdWUgQXVnIDI0IDE2OjE3OjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogbGQuaDogZGVmaW5lIEJZVEVfU0laRSwgU0hPUlRfU0laRSwgYW5kIExPTkdfU0laRSB3aGljaCBhcmUgbm8KKwkgIGxvbmdlciBpbiBiZmQuaC4KKworCSogbGRsYW5nLmMsIGxkLmg6IHVwZGF0ZWQgY29weXJpZ2h0LgorCitUdWUgQXVnIDE3IDE1OjIyOjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0LCBsYW5nX2NoZWNrKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCisJYmZkX3NldF9hcmNoX21hY2guCisKK1R1ZSBBdWcgMTcgMDc6MDI6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvaDg1MDAuc2M6IFN0YXJ0IGFsbCBzZWN0aW9ucyBpbiBhIGRpZmZlcmVudCBzZWdtZW50LgorCSogc2NyaXB0dGVtcGwvejhrc2ltLnNjOiBIYW5kbGUgY29uc3RydWN0b3JzCisKK1RodSBBdWcgMTIgMTY6MDU6MzcgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworICAgICAgICAqIE1ha2VmaWxlLmluOiByZXZlcnQgZWFybGllciBjaGFuZ2VzIGJhY2sgdG8gZXhlY3V0ZSBydW50ZXN0CisgICAgICAgICAgd2l0aCBtYWtlIGNoZWNrLiBjZHRlc3QgYW5kIGJvb3RzdHJhcCBub3cgZnVuY3Rpb24gYXMgdGhleQorCSAgZGlkIHdpdGhpbiB0aGUgTWFrZWZpbGUuCisKK1RodSBBdWcgMTIgMTA6MjA6MDUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogCVVwZGF0ZSBkZXBlbmRlbmNpZXMuCisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IEVNVUxBVElPTl9PRklMRVMgaW4gTWFrZWZpbGUgYmFzZWQgb24KKwktLXdpdGgtdGFyZ2V0cyBvcHRpb24uCisKK1RodSBBdWcgMTIgMDg6NTI6MjkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGNoZWNrIHRhcmdldHMgcmVpbXBsZW1lbnRlZCB0byBvbGQgd2F5LgorCitXZWQgQXVnIDExIDA4OjI2OjExIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODZ2Lm1oLCBjb25maWcvaXJpeDQubWg6IFVzZSBnY2MKKwktcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSByYXRoZXIgdGhhbiAkKGxpYmRpcikvbGliZ2NjLmEuCisJKiBjb25maWcvaTM4NnNjby5taDogTmV3IGZpbGU7IGNvcHkgb2YgaTM4NnYubWggdG8gY29ycmVzcG9uZCB0bworCWJmZC9jb25maWd1cmUuaG9zdCBjaGFuZ2UuCisKK01vbiBBdWcgIDkgMTQ6MjU6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEhhbmRsZSAubGluZSBhbmQgLmRlYnVnKiBzZWN0aW9ucy4KKworCSogbGRsZXgubDogVXNlIGJmZF9zY2FuX3ZtYSwgbm90IHN0cnRvdWwuCisKK0ZyaSBBdWcgIDYgMDg6NTc6MzkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGV4cC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsIGxleHN1cC5jLCBsZG1haW4uYywgbGRlbXVsLmM6CisJUmVtb3ZlIGluaXRhbCBjYXBzIGluIHNvbWUgZXJyb3IgbWVzc2FnZXMsIGNoYW5nZSAiY2FuJ3QiIHRvCisJImNhbm5vdCIsIGFkZCBtaXNzaW5nIGNvbG9ucy4KKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBQcmludCAiJSUiIGFzIGEgc2luZ2xlICUuCisJRm9yICclJyBmb2xsb3dlZCBieSB1bnJlY29nbml6ZWQgY2hhcmFjdGVyLCBwcmludCB0aGVtIGJvdGgKKwl2ZXJiYXRpbSBpbnN0ZWFkIG9mIGV4cGVjdGluZyBhIGNoYXIgKiBhcmcuCisJRm9yICclQycsIGRvbid0IHB1dCB0aGUgZnVuY3Rpb24gbmFtZSBpbiBwYXJlbnMuCisKKwkqIGxkZXhwLmMgKGludmFsaWQpOiBQYXNzICIlJSIsIG5vdCAiJSAiLgorCitGcmkgQXVnICA2IDE0OjMxOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogQWx3YXlzIGRlZmluZSBfZnRleHQsIF9mZGF0YSwgX2Zic3MuCisJKEJTU19WQVIpOiBSZW1vdmVkOyBub3cgYWx3YXlzIGRlZmluZSBfZmJzcy4KKwkqIGVtdWxwYXJhbXMvbWlwc2lkdC5zaCwgZW11bHBhcmFtcy9taXBzaWR0bC5zaCAoQlNTX1ZBUik6CisJUmVtb3ZlZC4KKworVGh1IEF1ZyAgNSAxNTo1NToxOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogejhrLWNvZmYgaXMgdGhlIHNhbWUgYXMgejhrLXNpbQorCitXZWQgQXVnICA0IDIxOjAwOjE4IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCisKKwkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBuZXcgZmlsZQorCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogbmV3IGZpbGUKKwkqIHRlc3RzdWl0ZS9sZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogbmV3IGZpbGUKKwkqIE1ha2VmaWxlLmluOiBhZGQgZGVqYWdudSBzdXBwb3J0IGZvciBtYWtlIGNoZWNrCisKK1dlZCBBdWcgIDQgMTc6NTI6MzIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGxleC5sIChjb21tZW50KTogQWRkIG1pc3NpbmcgbmV3bGluZSBpbiBtZXNzYWdlLgorCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IERpdHRvLgorCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERpdHRvLgorCitUdWUgQXVnICAzIDEwOjU3OjQxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRncmFtLnksIGxkbGV4LmwsIG1yaS5jLCBsZHdyaXRlLmM6IENoYW5nZSBtdWx0aXBsZSBjb21tb25zCisJaW50byBleHRlcm5zLgorCisJKiBsZG1pc2MuYyAobXVsdGlwbGVfd2Fybik6IE5ldyBmdW5jdGlvbi4KKwkqIGxkbWlzYy5oOiBEZWNsYXJlIGl0LgorCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpOiBDYWxsIGl0LgorCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgd2Fybl9jb21tb24uCisJKiBsZGxleC5sLCBsZGdyYW0ueTogU2V0IGl0IHdpdGggLXdhcm4tY29tbW9uIG9wdGlvbi4KKwkqIGxkdmVyLmMgKGhlbHApOiBEb2N1bWVudCBpdC4KKworTW9uIEF1ZyAgMiAxMjowNDozNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIGhvb2tzIGZvciAuc2RhdGEsIC5zYnNzLCBhbmQKKwl0YXJnZXQtc3BlY2lmaWMgc2VjdGlvbnMsIGFuZCBmb3IgY2hhbmdpbmcgZGF0YSBzZWN0aW9uIHZtYS4KKworTW9uIEp1bCAyNiAxNDowMDowMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbGRncmFtLnkgKE9QVElPTl9ReSwgT1BUSU9OX1ksIE9QVElPTl9kbiwgT1BUSU9OX1lQKTogTmV3CisJdGVybWluYWxzLCBmb3IgU29sYXJpcy4KKwkoZGlybGlzdF9wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IG5ldyBvcHRpb25zLgorCisJKiBsZGxleC5sOiBBY2NlcHQgY29tbWFuZC1saW5lIG9wdGlvbnMgIi1ReSIsICItZG4iLCAiLVkiLCBhbmQKKwkiLVlQLC4uLiIuCisKKwkqIGNvbmZpZy9zdW40c29sMi5tdDogUGFzcyBlbXVsYXRpb24gbmFtZSB3aXRob3V0ICIuc2giLgorCisJKiBlbXVscGFyYW1zL2VsZjMyX3NwYXJjLmM6IFJlbmFtZWQgZnJvbSBlbGYzMi1zcGFyYy5jLgorCSogY29uZmlnL3N1bjRzb2wyLm10IChlbV9lbGYzMl9zcGFyYy5jKTogQWRqdXN0ZWQgYWNjb3JkaW5nbHkuCisKK0ZyaSBKdWwgMjMgMTM6NTE6MDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBzdXBwb3J0IGZvciAuaW5pdCwgLmZpbmksIC5jdG9ycywKKwkuZHRvcnMsIC5kYXRhMSwgLnJvZGF0YTEgc2VjdGlvbnMsIGluc3RlYWQgb2YgY29tYmluaW5nIHRoZW0gaW50bworCW90aGVyIHNlY3Rpb25zLiAgRm9yIGAtcicsIHNldCBhbGwgc2VjdGlvbiBzdGFydCBhZGRyZXNzZXMgdG8KKwl6ZXJvLgorCisJKiBlbXVscGFyYW1zL2VsZjMyLXNwYXJjLnNoIChURVhUX1NUQVJUX0FERFIsCisJTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogVmFsdWUgc2hvdWxkIGJlIDB4MTAxMDAuCisJKE1BWFBBR0VTSVpFKTogUmVuYW1lZCBmcm9tIFBBR0VfU0laRS4KKworV2VkIEp1bCAyMSAxNDoyODo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGdlbnNjcmlwdHMuc2g6IElmIHRoaXMgaXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uLCBzZXQKKwlDT01QSUxFX0lOLgorCSogZW11bHRlbXBsLyouZW06IFVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb21waWxlIGluIHRoZQorCXNjcmlwdHMuCisKKwkqIE1ha2VmaWxlLmluIChHRU5TQ1JJUFRTKTogUGFzcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24gbmFtZSB0bworCWdlbnNjcmlwdHMuc2guICBQYXNzIHRoZSBjdXJyZW50IGVtdWxhdGlvbiBuYW1lIHdpdGhvdXQgIi5zaCIgb24KKwl0aGUgZW5kLgorCSogZ2Vuc2NyaXB0cy5zaDogVGFrZSBhbiBkZWZhdWx0IGVtdWxhdGlvbiBhcmcuCisJVXNlIHRoZSBjdXJyZW50IGVtdWxhdGlvbiBuYW1lIGFzIEVNVUxBVElPTl9OQU1FLgorCU1ha2UgZGVmYXVsdCBsaWIgcGF0aCBmb3IgY3Jvc3MtY29tcGlsaW5nICc6Jywgbm90IG51bGwuCisJKiBlbXVscGFyYW1zLyouc2g6IERvbid0IHNldCBFTVVMQVRJT05fTkFNRS4KKwkqIGxkZW11bC5jIChsZGVtdWxfZ2V0X3NjcmlwdCk6IFRha2UgaXNmaWxlIGFyZy4KKwlQYXNzIGl0IHRvIGVtdWxhdGlvbidzIGdldF9zY3JpcHQgZnVuY3Rpb24uCisJKiBsZGVtdWwuaDogQWRqdXN0IGdldF9zY3JpcHQgcHJvdG90eXBlcy4KKwkqIGxkZmlsZS5jIChsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUpOiBSZW5hbWVkIGZyb20gZmluZF9hX25hbWUuCisJTm8gbG9uZ2VyIHN0YXRpYy4KKwkqIGxkZmlsZS5oOiBEZWNsYXJlIGl0LgorCSogbGRncmFtLnk6IEFjY2VwdCBhIHNjcmlwdCBvbiB0aGUgY29tbWFuZCBsaW5lIGFnYWluLAorCWZvciBwYXJzaW5nIGNvbXBpbGVkLWluIHNjcmlwdHMuCisJKiBsZG1haW4uYyAobWFpbik6IElmIGxkIHNjcmlwdCBpcyBhIGZpbGUsIHBhcnNlIGl0IGFzIGEgLVQKKwlvcHRpb24sIG90aGVyd2lzZSBwYXJzZSBpdCBkaXJlY3RseS4KKwkqIGVtdWx0ZW1wbC8qLmVtICgqZ2V0X3NjcmlwdCk6IFJldHVybiB0aGUgc2NyaXB0cyB0aGVtc2VsdmVzIGlmCisJdGhpcyBpcyB0aGUgZGVmYXVsdCBlbXVsYXRpb247IG90aGVyd2lzZSByZXR1cm4gdGhlaXIgZmlsZSBuYW1lcy4KKwkqIGVtdWx0ZW1wbC9tODhrYmNzLmVtOiBOZXcgZmlsZSwgdG8gdGFrZSBtODhrYmNzICNpZmRlZiBvdXQgb2YKKwlnZW5lcmljLmVtLgorCSogZW11bHBhcmFtcy9tODhrYmNzLnNoOiBVc2UgaXQuCisKKwkqIGxkLmggKGxkX2NvbmZpZ190eXBlOjp1bml4X3JlbG9jYXRlKTogUmVtb3ZlIHVudXNlZCBlbGVtZW50LgorCitUdWUgSnVsIDIwIDEyOjAxOjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogRGVsZXRlIGVtX2kzODZsaW51eC5vIChmb3Igd2hpY2gKKwl0aGVyZSdzIG5vIGNoYW5nZSBsb2cgZW50cnkgeWV0LCB0c2sgdHNrKSBmcm9tIHRoZSBsaXN0IG9mCisJZW11bGF0aW9ucyBjb21waWxlZCBpbiB1bnRpbCBNYXJrIGdldHMgYXJvdW5kIHRvIGNoZWNraW5nIGluCisJZW11bHBhcmFtcy9pMzg2bGludXguc2guCisJKGxkZW11bC1saXN0LmgpOiBEZXBlbmQgb24gTWFrZWZpbGUsIHNvIGlmIEVNVUxBVElPTl9PRklMRVMgaXMKKwljaGFuZ2VkLCB0aGlzIGZpbGUgZ2V0cyB1cGRhdGVkLgorCitGcmkgSnVsIDE2IDE0OjE0OjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGRncmFtLnkgKE9QVElPTl9MZmlsZSk6IE5ldyB0b2tlbi4KKwkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBPUFRJT05fTCBOQU1FICh3aGl0ZXNwYWNlIGFmdGVyIC1MKS4KKwkqIGxkbGV4LmwgKDxDT01NQU5EPik6IEFjY2VwdCAtTCB3aXRob3V0IEZJTEVOQU1FLgorCitGcmkgSnVsIDE2IDEzOjQ0OjI2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogaDgvMzAwaCBzdXBwb3J0IG5lZWRzIG93biAubXQgZmlsZS4KKwljb25maWcvY29mZi1oODMwMGgubXQ6IE5ldyBmaWxlLgorCitUaHUgSnVsIDE1IDEyOjQ0OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmM6IERvbid0IGluY2x1ZGUgc3lzL3N0YXQuaDsgaXQgYWxyZWFkeSBnb3QgaW5jbHVkZWQKKwlzb21ld2hlcmUgYWxvbmcgdGhlIHdheS4KKworVGh1IEp1bCAxNSAxNDo0MzozNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIGg4MzAwaCBzdXBwb3J0LgorCWVtdWxwYXJhbXMvaDgzMDBoLnNoOiBOZXcgZmlsZS4KKwlzY3JpcHR0ZW1wbC9oODMwMGguc2M6IE5ldyBmaWxlLgorCitUaHUgSnVsIDE1IDEyOjQ0OjM1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJbiBlcnJvciBtZXNzYWdlLCB1c2UgdGhlIG5hbWUgdGhlCisJdXNlciBnYXZlIChlLmcuLCAiLWxjIiksIHJhdGhlciB0aGFuIHRoZSBiYXNlIGZpbGUgbmFtZS4KKworCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IGFzc2lnbiBhbiBpbnQgdG8gYW4gZW51bS4KKworCSogbGRtYWluLltjaF06IFJlbW92ZSBpbml0aWFsIFFfIGZyb20gZnVuY3Rpb24gbmFtZXMuCisJKiBsZGV4cC5jLCBsZGluZHIuYywgbGRsYW5nLmM6IENoYW5nZSBjYWxsZXJzLgorCisJKiBsZGZpbGUuYywgbGRtYWluLmMsIGxkZ3JhbS55OiBSZW5hbWUgb3B0aW9uX3YgdG8gdHJhY2VfZmlsZV90cmllcy4KKworCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IE1vdmUgbG9hZGluZyBvZiBkZWZhdWx0IHNjcmlwdCBmcm9tCisJaGVyZSB0byBtYWluLiAgQWRkIGEgIi8iIHRvIHN0YXJ0IG9mIHNjcmlwdCBuYW1lIHRvIHByZXZlbnQKKwlmaW5kaW5nIGl0IGluICIuIiBmaXJzdC4KKworCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IERvbid0IGxvb2sgaW4gIi4iIGZpcnN0LgorCisJKiBsZGdyYW0ueSwgbGRsYW5nLmMsIGxkc3ltLmM6IFJlbW92ZSB0cmFjZXMgb2YgdW51c2VkIHZhcgorCW9wdGlvbl9sb25nbWFwLgorCitUaHUgSnVsIDE1IDEwOjU1OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVtX204OGtiY3MuYyk6IENvcnJlY3QgZGVwZW5kZW5jeS4KKwkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2M6IEl0J3MgQVJDSCwgbm90IGFyY2guICBSZW1vdmVkIFRBUkdFVAorCXN0YXRlbWVudC4gIENoYW5nZWQgT1VUUFVUX0ZPUk1BVCB0byB1c2UgJHtPVVRQVVRfRk9STUFUfS4KKwkqIGVtdWxwYXJhbXMvbTg4a2Jjcy5zaDogSXQncyBjb2ZmLW04OGtiY3MsIG5vdCBtODhrYmNzLgorCitXZWQgSnVsIDE0IDIxOjQyOjUzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRmaWxlLmMgKGxkbGFuZ19vcGVuX2ZpbGUsIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSksCisJbWFpbi5jIChtYWluKTogUHJpbnQgdGhlIGVycm5vIHN0cmluZyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKworVHVlIEp1bCAxMyAyMDowMDozMCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFjY2VwdCBoODMwMGggZm9yIHRhcmdldCBjcHUuCisKKwkqIGxkbWlzYy5jICh2ZmluZm8pOiBIYXZlIGRlbWFuZ2xlIHJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgaWYKKwlwcmVzZW50IChkZW1hbmdsZSBpcyBzbWFydCBlbm91Z2ggdG8ga25vdyB3aGV0aGVyIHRvIGRvIGl0IG9yIG5vdCkuCisKK01vbiBKdWwgMTIgMTE6NDU6NDggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAoc2V0X3NjcmlwdHNfZGlyKTogQ2hlY2sgLiBhbmQgPGxkIGJpbiBkaXI+Ly4uL2xpYiBmb3IKKwlsZHNjcmlwdHMsIGFzIHdlbGwgYXMgPGxkIGJpbiBkaXI+IGFuZCBTQ1JJUFRESVIuCisKKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBVc2Ugc2l6ZW9mIGluc3RlYWQgb2YgbWFnaWMgY29uc3RhbnQuCisKKwkqIGxkbWFpbi5jIChnZXRfZW11bGF0aW9uLCBjaGVja19mb3Jfc2NyaXB0c19kaXIsCisJc2V0X3NjcmlwdHNfZGlyKTogIE5ldyBmdW5jdGlvbnMuCisJKG1haW4pOiBDYWxsIHRoZW0uCisKK01vbiBKdWwgMTIgMTA6NTc6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIHNjcmlwdHRlbXBsL2VsZi5zYzogSW5jbHVkZSAuaW5pdCwgLmZpbmksIC5yb2RhdGEgc2VjdGlvbnMuCisJQ3JlYXRlIHN5bWJvbCAiZW5kIiBpbnN0ZWFkIG9mICJfX2VuZCIuICBDb21tZW50IG91dCBzb21lIHBhcnRzCisJdGhhdCBtYXkgbm90IGJlIG5lZWRlZCAoeWV0KSBmb3IgZWxmLgorCisJKiBjb25maWd1cmUuaW46IEFjY2VwdCBzcGFyYy1lbGYgYW5kIHNwYXJjLXNvbGFyaXMyIGNvbmZpZ3MuCisKK1RodSBKdWwgIDggMTU6MzM6MzIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlICQoT1RIRVJfRU1VTEFUSU9OUykuCisKKwkqIGxkbWlzYy5oIChlaW5mbywgbWluZm8sIGluZm8pOiBEb24ndCBib3RoZXIgd2l0aCBQQVJBTVMgbWFjcm8KKwl3aGVuIG5vIHByb3RvdHlwZSBpcyBiZWluZyBzdXBwbGllZC4KKwkobGRtYWxsb2MsIGxkcmVhbGxvYyk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4KKworCSogbGRtaXNjLmMgKGZpbmZvKTogTmV3IGZ1bmN0aW9uLCBhY2NlcHRzIEZJTEUqIGFyZ3VtZW50LgorCSh2ZmluZm8sIGNhc2UgJ3YnKTogTmV3IGZvcm1hdCBjaGFyYWN0ZXI7IGRpc3BsYXlzIGJmZF92bWEgaW4gaGV4CisJd2l0aG91dCBsZWFkaW5nIHplcm9zLgorCSh2ZmluZm8sIGNhc2VzICdSJyBhbmQgJ0MnKTogVXNlIGZpbmZvKCV2KSB3aGVuIGRpc3BsYXlpbmcgYQorCWJmZF92bWEgdmFsdWUsIGluc3RlYWQgb2YgZnByaW50ZigleCkgd2hpY2ggd29uJ3QgaG9sZCBhIGxvbmcgbG9uZworCXZhbHVlLgorCShjb25jYXQsIGJ1eXN0cmluZyk6IFN0cmluZyBsZW5ndGhzIGFyZSBzaXplX3QuCisJKGxkbWFsbG9jLCBsZHJlYWxsb2MsIHhyZWFsbG9jKTogU2l6ZSBhcmd1bWVudCBpcyBub3cgc2l6ZV90LgorCisJKiBsZGxhbmcuYyAobmV3X3N0YXRlbWVudCk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4gIEFkZGVkCisJZm9yd2FyZCBkZWNsYXJhdGlvbiB3aXRoIHByb3RvdHlwZS4KKworVGh1IEp1bCAgOCAxMDo1Mzo0NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkZ3JhbS55IChPUFRJT05fdik6IERvbid0IHR1cm4gb24gdmVyYm9zZSBvdXRwdXQuCisKK1dlZCBKdWwgIDcgMTc6MTA6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBsZGxleC5sOiBHZXQgcmlkIG9mIGxvY2FsIHR5cGVkZWYgZm9yIGJmZF92bWEhICBHZXQgaXQgZnJvbQorCWJmZC5oIGluc3RlYWQuCisKK1dlZCBKdWwgIDcgMTE6MzM6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgYXMgJCh0b29sZGlyKS9iaW4vZ2xkOworCWNvbGxlY3QyIGRvZXNuJ3QgbG9vayBmb3IgZ2xkIGFueSBtb3JlIGFueWhvdy4KKworTW9uIEp1bCAgNSAxNDoyOTo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBTa2lwIGluZGlyZWN0IHN5bWJvbHMsIHdoaWNoCisJbm93IGhhdmUgYSBub24gTlVMTCBzcmVmc19jaGFpbi4KKworCSogY29uZmlnL2hwMzAwaHB1eC5tdDogVXNlIGVtdWxhdGlvbiBocDNocHV4IHJhdGhlciB0aGFuCisJaHAzMDBocHV4LCBzaW5jZSB0aGUgbGF0dGVyIGRvZXMgbm90IGV4aXN0LgorCitGcmkgSnVsICAyIDE4OjA2OjA1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogZ2Vuc2NyaXB0cy5zaDogUHV0IHRoZSBzY3JpcHRzIGluIHRoZSBsZHNjcmlwdHMgZGlyZWN0b3J5LCBub3QKKwllbXVsYXRpb25zLgorCSogY29uZmlndXJlLmluIChsZHNjcmlwdHMpOiBNYWtlLCBpbnN0ZWFkIG9mIGVtdWxhdGlvbnMuCisJKiBNYWtlZmlsZS5pbiAoc2NyaXB0ZGlyKTogVGFrZSBvZmYgdGhlICJsZCIgcGFydC4KKwkoaW5zdGFsbCwgY2xlYW4sIGRpc3RjbGVhbik6IFVzZSBsZHNjcmlwdHMsIG5vdCBlbXVsYXRpb25zLgorCUluIHRlc3RzLCBkb24ndCBwYXNzIC1MZW11bGF0aW9ucy4KKwlEb24ndCBwYXNzIHRvb2xkaXIvbGliIHRvIGdlbnNjcmlwdHMuc2guCisJKiBnZW5zY3JpcHRzLnNoOiBEb24ndCB0YWtlIHRvb2xkaXIvbGliIGFyZy4KKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBBZGQgImxkc2NyaXB0cy8iIHRvIHRoZSBuYW1lIG9mIHRoZQorCWRlZmF1bHQgc2NyaXB0IGZpbGUuCisKK0ZyaSBKdWwgIDIgMTc6MTM6MzUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IEFkZCAudG9ycyBzZWN0aW9uIGZvciBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycy4KKworVGh1IEp1bCAgMSAxNjozODo0NSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWcvY29mZi1oODMwMC5tdDogRU1VTD1oODMwMGhtcyAtPiBoODMwMC4KKworV2VkIEp1biAzMCAxNTo0NTo1NSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICgueS5jKTogc2tpcCBkZWZhdWx0IC55LmMgcnVsZXMuIGdudSBtYWtlIGNhbiBub3cKKwkgIHJ1biBpbiBwYXJhbGxlbCB3aXRob3V0IGNvbGxpZGluZyBvbiB5YWNjJ3Mgc3RhdGljIGZpbGUgbmFtZXMuCisJICBXaXRob3V0IHRoZSBzdHViIHJ1bGUsIG1ha2Ugd2lsbCB0cnkgdG8gc3RhcnQgdHdvIHlhY2MncworCSAgY29uY3VycmVudGx5IHdoaWNoIGZhaWxzIGJlY2F1c2Ugb2YgeWFjYydzIHN0YXRpYyBmaWxlIG5hbWVzLgorCitUdWUgSnVuIDI5IDEyOjIwOjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBEb24ndCBkdW1wIGNvcmUgaWYgdGhlcmUgYXJlIG5vCisJc3ltYm9scy4KKworTW9uIEp1biAyOCAxMjoyMjoxMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGdlbnNjcmlwdHMuc2ggKExJQl9QQVRIKTogT25seSBhZGQgL3Vzci9sb2NhbC9saWIgaWYgaXQncworCWRpZmZlcmVudCBmcm9tIGxpYmRpci4KKworCSogTWFrZWZpbGUuaW4gKHNjcmlwdGRpcik6IEJhc2Ugb24gdG9vbGRpciwgbm90IGRhdGFkaXIuCisKK1NhdCBKdW4gMjYgMTI6MDM6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZHZlci5jIChoZWxwKTogTmV3IGZ1bmN0aW9uLgorCSogbGR2ZXIuaDogRGVjbGFyZSBpdC4KKwkqIGxkbGV4LmwsIGxkZ3JhbS55OiBSZWNvZ25pemUgbmV3IG9wdGlvbnMgLS1oZWxwIGFuZCAtLXZlcnNpb24uCisKK01vbiBKdW4gMjEgMjA6Mzk6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IERvbid0IG5lZWQgLi4vaW5jbHVkZSBhbnkgbW9yZS4KKworTW9uIEp1biAyMSAxNjozODozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGV4LmwsIGxkZ3JhbS55OiBTdXBwb3J0IG5ldyAtb2Zvcm1hdCBvcHRpb24uCisJUmVtb3ZlIGF0dGVtcHQgYXQgc3VwcG9ydGluZyBzY3JpcHQgZnJhZ21lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUuCisJKiBsZGxhbmcuYyAobGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCk6IFRha2UgbmV3IGFyZywgRlJPTV9TQ1JJUFQuCisJKiBtcmkuYyAobXJpX2Zvcm1hdCksIGxkZ3JhbS55OiBDaGFuZ2UgY2FsbGVycy4KKwkqIGxkbGFuZy5oOiBDaGFuZ2UgcHJvdG90eXBlLgorCitUaHUgSnVuIDE3IDE2OjUzOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAoem9vQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KKwl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCisKK1RodSBKdW4gMTcgMTQ6MzM6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGdyYW0ueTogVHdlYWsgZ3JhbW1hciB0byBtYWtlIHJlcG9ydGluZyBvZiBpbnZhbGlkIG9wdGlvbnMgd29yay4KKworCSogTWFrZWZpbGUuaW4gKC5jYy5vKTogUmVzdG9yZSAuU1VGRklYRVMgZW50cnkgZm9yIC5jYworCWFuZCAuY2MubyBydWxlLgorCitXZWQgSnVuIDE2IDExOjQ1OjMyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2NvbW1hbmQpOiBEb24ndCB0cnkgLmxkIGV4dGVuc2lvbi4KKwlJdCB3YXNuJ3QgZG9jdW1lbnRlZCAob3IgbGlrZWx5IHVzZWQpIGFuZCB3YXN0ZXMgdGltZS4KKwkodHJ5X29wZW4pOiBJZiBFWFRFTiBpcyBlbXB0eSwgZG9uJ3QgdHJ5IGl0LgorCisJKiBsZGN0b3IuYywgbGRlcnJvci5jLCBsZGV4cC5jLCBsZGZpbGUuYywgbGRpbmRyLmMsIGxkbGFuZy5jLAorCWxkbGV4LmwsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRzeW0uYywgbGR2ZXIuYywgbGR3YXJuLmMsCisJbGR3cml0ZS5jLCBsZXhzdXAuYywgbXJpLmMsIHJlbGF4LmM6IFJlcGxhY2UgREVGVU4gbWFjcm8gY2FsbHMKKwl3aXRoIG5vcm1hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisKKwkqIE1vdmUgKi5lbSB0byBlbXVsdGVtcGwvKi5lbS4gIE1vdmUgKi5zaCB0byBlbXVscGFyYW1zLyouc2guCisJTW92ZSAqLnNjLXNoIHRvIHNjcmlwdHRlbXBsLyouc2MuCisJKiB7ZW11bHRlbXBsLGVtdWxwYXJhbXMsc2NyaXB0dGVtcGx9L1JFQURNRTogTmV3IGZpbGVzLgorCSogc2guZW0sIHN0MjAwMC5lbSwgejhrc2ltLmVtLCBoODMwMGhtcy5lbSwgaDg1MDBobXMuZW06IEZpbGVzCisJcmVtb3ZlZCwgcmVwbGFjZWQgd2l0aCBnZW5lcmljLmVtLgorCSogaDgzMDAuc2gsIGg4NTAwLnNoLCBoODMwMC5zYywgaDg1MDAuc2M6IFJlbmFtZWQgZnJvbQorCSBoOFszNV0wMGhtcy5zW2NoXS4gIENoYW5nZSB0aGVpciBjb250ZW50cyB0byBvbWl0IHRoZSAiaG1zIi4KKworCSogKi5lbSAoKl9nZXRfc2NyaXB0KTogUmV0dXJuIHNjcmlwdCBuYW1lIGluc3RlYWQgb2Ygc2NyaXB0IGNvbnRlbnRzLgorCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IENoYW5nZSBjYWxsZXIuCisKKwkqIGxkbGV4LmwsIGxkZ3JhbS55OiBSZWNvZ25pemUgLW0gb3B0aW9uLgorCUNoZWNrIGZvciBpbnB1dCBmaWxlcyBhZnRlciAqYWxsKiBvcHRpb25zIGluIGdyYW1tYXIuCisJKiBsZG1haW4uYyAobWFpbik6IENoZWNrIGZvciAtbSBvcHRpb25zLiAgQWRkIGRlZmF1bHQgZGlyZWN0b3J5CisJZm9yIC1tLgorCisJKiBta3NjcmlwdC5jOiBGaWxlIHJlbW92ZWQuCisJKiBnZW5zY3JpcHRzLnNoOiBUYWtlIHR3byBtb3JlIHBhcmFtZXRlcnMsIHRvb2xkaXJsaWIgYW5kIGxpYmRpciwKKwl0byBhZGQgdG8gdGhlIGRlZmF1bHQgTElCX1BBVEguCisJTG9vayBmb3IgaW5wdXQgZmlsZXMgaW4gdGhlIG5ldyBzdWJkaXJlY3Rvcmllcy4KKwlDcmVhdGUgdGhlIHNjcmlwdHMgaW4gZW11bGF0aW9ucyBzdWJkaXJlY3RvcnkgYW5kIGRvbid0IGZpbHRlcgorCXRoZW0gdGhyb3VnaCBta3NjcmlwdC4KKwkqIGNvbmZpZ3VyZS5pbjogTWFrZSB0aGUgZW11bGF0aW9ucyBzdWJkaXJlY3RvcnkuCisKKwkqIE1ha2VmaWxlLmluOiBBY2NvdW50IGZvciBhbGwgb2YgdGhlIGFib3ZlIGNoYW5nZXMuCisJUmVtb3ZlIHVudXNlZCAuU1VGRklYRVMuICBHZXQgbGliZ2NjLmEgcGF0aCB3aXRoIGdjYworCS1wcmludC1saWJnY2MtZmlsZS1uYW1lIGluc3RlYWQgb2YgJChsaWJkaXIpL2xpYmdjYy5hLgorCVB1dCBDRkxBR1MgbGFzdCBpbiB0aGUgY29tcGlsYXRpb24gcnVsZXMuCisJQWRkIC1JLi4vYmZkIHRvIElOQ0xVREVTIHNvIHN5c2RlcC5oIGlzIGZvdW5kLgorCitUdWUgSnVuIDE1IDIzOjA0OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogTG9vayBpbiAuLi9pbmNsdWRlLCBub3QgLi4vYmZkLgorCisJKiBhb3V0LnNjLXNoOiBBZGQgU0hMSUJfUEFUSCBsaWtlIFNUQUNLWkVSTy4gIE1ha2UgU1RBQ0taRVJPCisJZGVwZW5kZW50IG9uIFJFTE9DQVRJTkcsIG5vdCBSRUxPQ0FUSU9OLgorCSogaHAzaHB1eC5zaCAoU0hMSUJfUEFUSCk6IERlZmluZSBpdC4KKworTW9uIEp1biAxNCAxOTowNjoxNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkZmlsZS5jICh0cnlfb3Blbik6IElmIG9wZW5pbmcgd2l0aG91dCB0aGUgZXh0ZW5zaW9uIGZhaWxzLAorCXRyeSB3aXRoIHRoZSBleHRlbnNpb24gZXZlbiBpZiAtdiBvciAtViB3YXMgZ2l2ZW4uCisJaGFkX3NjcmlwdCBpcyBpbXBvcnRlZCAoZnJvbSBsZGdyYW0ueSksIG5vdCBleHBvcnRlZC4KKworTW9uIEp1biAxNCAxNjoyNjoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQsIHVzZSBJTlNUQUxMX1hGT1JNCisKK1RodSBKdW4gMTAgMTQ6MDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsZGV4cC5jIChleHBfZm9sZF90cmVlKTogRG9uJ3QgbG9zZSB0aGUgb2xkIGZsYWcgYml0cy4KKwkqIGxkZ3JhbS55IChzdGF0ZW1lbnRfbGlzdF9vcHQpOiBOZXcgbm9udGVybWluYWwsIGVpdGhlciBlbXB0eSBvcgorCXN0YXRlbWVudF9saXN0LgorCShzZWN0aW9uKTogVXNlIHN0YXRlbWVudF9saXN0X29wdCwgbm90IHN0YXRlbWVudF9saXN0LgorCSogbTY4a2NvZmYuc2Mtc2g6IEdhdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFuZCBkZWZpbmUKKwlfX0NUT1JfTElTVF9fIGFuZCBfX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCisJKiBzYTI5MjAwLnNjLXNoOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgZGVmaW5lCisJX19fQ1RPUl9MSVNUX18gYW5kIF9fX0RUT1JfTElTVF9fIGFwcHJvcHJpYXRlbHkuCisKK01vbiBKdW4gIDcgMTI6NTM6MjggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCisJKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgorCitGcmkgSnVuICA0IDE2OjE4OjI0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbW92ZSBpbnN0YWxsOmFsbCBhbmQgaW5zdGFsbC1pbmZvOmluZm8KKwlkZXBlbmRlbmNpZXMgKHRoZXNlIGNhdXNlIHNvbWUgc3B1cmlvdXMgcmVidWlsZHMgYXQgJ21ha2UgaW5zdGFsbCcKKyAgICAgICAgdGltZSkKKworRnJpIEp1biAgNCAwODo1MDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmZsKik6IE5ldyB0YXJnZXQ7IHVzZSBtaXBzLWlkdGwuCisJKG1pcHMtaWR0LWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KKwkqIGNvbmZpZy9taXBzLWlkdGwubXQ6IE5ldyBmaWxlOyB1c2UgRU1VTCBvZiBtaXBzaWR0bC4KKwkqIG1pcHNpZHRsLnNoOiBOZXcgZmlsZTsgbGlrZSBtaXBzaWR0LnNoLCBidXQgbGl0dGxlIGVuZGlhbi4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNpZHRsLm8uCisKKwkqIGNvbmZpZy9zdW4zLm1oIChIT1NUSU5HX0xJQlMsIEhPU1RJTkdfRU1VKTogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQKKwlpbmNvcnJlY3QgZGVmaW5pdGlvbnMuCisKK1R1ZSBKdW4gIDEgMTQ6NTY6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6ICBXcml0ZSBCU0ZfQ09OU1RSVUNUT1IKKwlzeW1ib2xzLCB1bmxlc3Mgc3RyaXBwaW5nLgorCitUdWUgTWF5IDI1IDE1OjM0OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGNvbmZpZ3VyZSBsb29rcyBmb3IgIyMjIywgc28gcmVtb3ZlIGxpbmVzIHdpdGggbWFueQorCScjJyBjaGFyYWN0ZXJzLgorCSogY29uZmlnL2lyaXg0Lm1oLCBjb25maWcvaTM4NnYubWg6IE5ldyBmaWxlczsgc2V0IEhPU1RJTkdfQ1JUMAorCWFuZCBIT1NUSU5HX0xJQlMgY29ycmVjdGx5IHNvIHRoYXQgYGBtYWtlIGNoZWNrJycgd2lsbCB3b3JrLgorCitUaHUgTWF5IDIwIDEzOjU2OjE2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBkZW5lYi5jeWdudXMuY29tKQorCisJKiBtaXBzLnNjLXNoOiAgRGVmaW5lIF9ldGV4dCwgX2VkYXRhLCBhbmQgX2VuZCwgaW4gYWRkaXRpb24KKwl0byBldGV4dCwgZWRhdGEsIGFuZCBlbmQuICBOZWVkZWQgZm9yIElSSVggNC4wLjVGLgorCVBhdGNoIGZyb20gbXdwQGljb25peC5vei5hdSAoTWljaGFlbCBQYWRkb24pLgorCisJKiBWZXJzaW9uIDIuMi4xIHJlbGVhc2VkLgorCitUaHUgTWF5IDIwIDExOjQyOjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogbWlwc2JzZC5zYy1zaDogUmVuYW1lZCBmcm9tIGFvdXQtbWlwc2JzZC5zYy1zaC4KKwkqIG1pcHNic2Quc2ggKEVNVUxBVElPTl9OQU1FKTogVXNlIG5ldyBmaWxlIG5hbWUuCisKK1R1ZSBNYXkgMTggMTc6MTA6MjQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTERESVNUU1RVRkYpOiBSZW1vdmUgbGQubW0gc2luY2Ugd2UgY2FuJ3QgYnVpbGQgaXQKKwlwcm9wZXJseSByaWdodCBub3cuCisKKwkqIFZlcnNpb24gMi4yIHJlbGVhc2VkLgorCitNb24gTWF5IDE3IDE1OjM3OjI4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBsZHZlci5jIChsZHZlcnNpb24pOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMi4KKworTW9uIE1heSAxNyAxMjo0NDozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogTkVXUzogIE5ldyBmaWxlLgorCitGcmkgTWF5IDE0IDExOjI2OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy5zYy1zaDogRG9uJ3QgZGVmaW5lIEJTU19WQVIgdW5sZXNzIHJlbG9jYXRpbmcuCisKK1dlZCBNYXkgMTIgMTM6MzM6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobWtzY3JpcHQubywgbWtzY3JpcHQpOiBCdWlsZCBta3NjcmlwdCB2aWEKKwlta3NjcmlwdC5vLCByYXRoZXIgdGhhbiBkaXJlY3RseSBmcm9tIG1rc2NyaXB0LmMuCisKK1R1ZSBNYXkgIDQgMjE6NTg6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IExvb2sgZm9yICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IHJlbGF0aXZlIHRvCisJJHtzcmNkaXJ9LCBub3QgcmVsYXRpdmUgdG8gYnVpbGQgZGlyZWN0b3J5LgorCisJKiBocHBhb3NmLmVtLCBocHBhb3NmLnNjLXNoLCBocHBhb3NmLnNoOiBOZXcgZmlsZXMuCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBocHBhKi1ocC1vc2YuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBJbmNsdWRlIGhwcGFvc2YgZW11bGF0aW9uLgorCShlbV9ocHBhb3NmLmMpOiBCdWlsZCBpdC4KKwkqIGNvbmZpZy9ocHBhb3NmLm1oLCBocHBhb3NmLm10OiBOZXcgZmlsZXMuCisKKwkqIGxkLmggKEFMSUdOX04pOiBSZW5hbWVkIGZyb20gQUxJR04sIGJlY2F1c2UgdGhhdCBjb25mbGljdGVkIHdpdGgKKwlzb21lIHN5c3RlbSBoZWFkZXIgZmlsZXMuICBBbGwgdXNlcyBjaGFuZ2VkLgorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpMzg2LWFpeCBjb25maWd1cmF0aW9ucyBhcyBpMzg2LWNvZmYKKwl0YXJnZXRzLgorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBtNjgqLSotaHB1eC4KKwkqIGFvdXQuc2Mtc2g6IElmIFNUQUNLWkVSTyBhbmQgUkVMT0NBVElORyBhcmUgYm90aCBkZWZpbmVkLCBvdXRwdXQKKwl0aGUgdmFsdWUgb2YgU1RBQ0taRVJPLgorCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSBocDMwMC1ocHV4IGVtdWxhdGlvbi4KKwkoZW1faHAzaHB1eC5jKTogQnVpbGQgaXQuCisJKiBocDNocHV4LnNoLCBjb25maWcvaHAzMDBocHV4Lm10OiBOZXcgZmlsZXMuCisKK1R1ZSBNYXkgIDQgMTI6Mzc6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLnNjLXNoOiBQdXQgY29uc3RydWN0b3JzIGluIHRoZSAuZGF0YSBzZWN0aW9uLgorCSogTWFrZWZpbGUuaW4gKGNkdGVzdCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gbGQubmV3LgorCitNb24gTWF5ICAzIDE5OjQzOjM5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikgdG8gbWF0Y2ggRlNGLgorCSogdmF4LnNoLCBjb25maWcvdmF4Lm10LCBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOgorCVN1cHBvcnQgVkFYIFVsdHJpeCBhbmQgQlNELgorCitNb24gQXByIDI2IDE4OjM1OjQ3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzaC5lbSwgc2guc2gsIHNoLnNjLXNoOiBOZXcgZmlsZXMgc3VwcG9ydGluZyBIaXRhY2hpIFNILgorCitXZWQgQXByIDE0IDIxOjAxOjUxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBsZGxhbmcuaCAoc3RydWN0IG1lbW9yeV9yZWdpb24pOiAgQ2hhbmdlIGBsZW5ndGgnIGFuZAorCWBvbGRfbGVuZ3RoJyBmaWVsZHMgdG8gYmZkX3NpemVfdHlwZS4gIEVsaW1pbmF0ZSB1c2Ugb2YgYmZkX29mZnNldC4KKwkqIGxkbGFuZy5jLCBtcmkuYzogIENvcnJlc3BvbmRpbmcgY2hhbmdlcywgcGx1cyBsaW50LgorCitUaHUgQXByICA4IDIyOjA4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBGb3IgYWxsIGkzODYgdGFyZ2V0cywgYWNjZXB0IGk0ODYgYXMgd2VsbC4KKworTW9uIEFwciAgNSAxNzozMzozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBQcmVzZXJ2ZSBhbGwgZmxhZ3MgZm9yIGEKKwlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbi4KKwkoc2l6ZV9pbnB1dF9zZWN0aW9uKTogQ29uc2lkZXIgYW55IFNFQ19IQVNfQ09OVEVOVFMgc2VjdGlvbiB3aGVuCisJY29tcHV0aW5nIGxhcmdlc3Rfc2VjdGlvbi4KKworRnJpIEFwciAgMiAxNDozMzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBJbml0aWFsaXplIGFsbAorCWZpZWxkcyBvZiBuZXdseSBjcmVhdGVkIHN0cnVjdHVyZS4KKworV2VkIE1hciAzMSAxODoxOToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxkbWFpbi5jIChnX3N3aXRjaF92YWx1ZSk6IE5ldyB2YXJpYWJsZS4KKwkqIGxkZ3JhbS55IChPUFRJT05fRywgT1BUSU9OX0d2YWwpOiBOZXcgdG9rZW5zLgorCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IC1HIGFuZCBzZXQgZ19zd2l0Y2hfdmFsdWUuCisJKiBsZGxleC5sIChDT01NQU5EKTogQWNjZXB0IC1HLgorCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0KTogQ2FsbCBiZmRfc2V0X2dwX3NpemUgb24gbmV3IEJGRC4KKworVHVlIE1hciAzMCAwOTo0MDoyNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCVN1cHBvcnQgZm9yIGxpbmtpbmcgYW5kIGxvYWRpbmcgYXQgZGlmZmVyZW50IHBsYWNlczoKKworCSogbGRsZXgubDogQWRkICJBVCIga2V5d29yZC4KKwkqIGxkZ3JhbS55OiBDbGVhbnVwLCBhbmQgcGFyc2UgQVQuCisJKiBsZGxhbmcuYyAocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUHJpbnQgb3V0cHV0IGFkZHJlc3MKKwlvZiBzZWN0aW9uIGluIG1hcC4gKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEZpbGwgc2VjdGlvbnMnIGxtYSB3aXRoCisJbG9hZCBhZGRyZXNzLgorCSogbGRsYW5nLmggKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBBZGQgbG9hZF9iYXNlCisJaW5mb3JtYXRpb24uCisKKwkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiBLZWVwIG1vcmUgaW5mb3JtYXRpb24gaW4gdGhlIGFsaWFzCisJc3ltYm9sIGNoYWluLgorCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6ICBEb24ndCBpbmhlcml0IE5FVkVSX0xPQUQgc2VjdGlvbgorCWF0dHJpYnV0ZSBmcm9tIGFuIGlucHV0IHNlY3Rpb24uCisJKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBDb21tb24gc2VjdGlvbiBpcyBORVZFUl9MT0FEIGJ5CisJZGVmYXVsdC4gKFFfZW50ZXJfZmlsZV9zeW1ib3MpOiBJbmRpcmVjdCBzeW1ib2xzIG5vdyBhcmUga25vd24gYnkKKwl0aGVpciBzZWN0aW9uLCBub3QgYSBzcGVjaWFsIHN5bWJvbCBmbGFnLgorCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBJbmRpcmVjdCBzeW1ib2xzIGFyZW4ndCBsb2NhbC4KKwkod3JpdGVfZmlsZV9nbG9iYWxzKTogV3JpdGUgdGhlIG1hcHBpbmcgZm9yIGFuIGluZGlyZWN0IHN5bWJvbC4KKwkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogV2hlbiBmb3JjZWQgdG8gd3JpdGUgYSBORVZFUl9MT0FEIHNlY3Rpb24sCisJZmlsbCBpdCB3aXRoIHplcm9zLgorCitUdWUgTWFyIDIzIDEzOjI0OjEwIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGxkLnRleGluZm86ICBjaGFuZ2VzIGZvciBxMQorCitUdWUgTWFyIDIzIDAwOjEzOjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgdGFyZ2V0LCBkZWZpbmUgJiB1c2UgVEVYSTJEVkksIGFkZCBpbnN0YWxsY2hlY2sKKworTW9uIE1hciAgOCAyMDozMDozNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW5hbWUgSE9TVF9DQyB0byBDQ19GT1JfQlVJTEQKKworVGh1IE1hciAgNCAxMjo0NDozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG1pcHMuc2Mtc2g6IEFkZGVkIHZhcmlhYmxlcyB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhCisJc3BlY2lmaWMgZW11bGF0aW9uLgorCSogbWlwc2lkdC5zaDogTmV3IGZpbGU7IGVtdWxhdGlvbiBmb3IgSURUIE1JUFMgYm9hcmQuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzaWR0Lm8uCisJKGVtX21pcHNpZHQuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNpZHQuc2ggYW5kIG1pcHMuc2Mtc2guCisJKiBjb25maWcvbWlwcy1pZHQubXQ6IE5ldyBmaWxlOyBzZXRzIEVNVUwgdG8gbWlwc2lkdC4KKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmYpOiBOZXcgdGFyZ2V0OyB1c2VzIG1pcHMtaWR0LgorCitTYXQgRmViIDI3IDAwOjAwOjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogYW91dC1taXBzYnNkLnNjLXNoLCBtaXBzYnNkLnNoOiBOZXcgZmlsZXMgZnJvbSBSYWxwaCBDYW1wYmVsbCwKKwlyYWxwaGNAcHlyYW1pZC5jb20uCisJKiBpMzg2YnNkLnNoLCBjb25maWcvaTM4NmJzZC5tdDogTmV3IGZpbGVzLgorCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogQWRkZWQgc3VwcG9ydCBmb3IgbWlwc2JzZCBhbmQgMzg2YnNkLgorCitUaHUgRmViIDI1IDE1OjMzOjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbXJpLmM6ICBBZGQgZXh0ZXJuIGRlY2xhcmF0aW9uIG9mIHN0cmR1cC4KKwkqIGxkc3ltLmMgKEtFRVAgbWFjcm8pOiAgQWRkIHNwYWNlcyBhcm91bmQgJz0nIGZvciB0aGUKKwlzYWtlIG9mIG9sZCAoZS5nLiBQQ0MpIGNvbXBpbGVycy4KKworV2VkIEZlYiAyNCAxOTo0OTozMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMi4xLgorCitGcmkgRmViIDEyIDA4OjA5OjExIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGdyYW0ueTogYWxsb3cgc2VjdGlvbiB0eXBlcyB3aXRob3V0IGFkZHJlc3MgIGV4cHJlc3Npb25zLgorCSogbGRsYW5nLmMgKGxhbmdfcmVsb2NhdGVfZ2xvYmFscyk6IGF2b2lkIHBvc3NpYmxlIGhhbmcgd2l0aAorCXVuZGVmaW5lZCBidXQgdW5yZWZlcmVuY2VkIHN5bWJvbHMuCisJKiByZWxheC5jIChyZWxheF9zZWN0aW9uKTogZG9uJ3QgY29tcGxhaW4gaWYgdGhlIHNjcmlwdCBmaWxlIGlzbid0CisJcmVsYXhhYmxlIGJ1dCAtcmVsYXggaXMgc2V0CisKK1RodSBGZWIgMTggMTc6NTg6NDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGdvMzIgaXMgdGhlIDNyZCBwYXJ0IG9mIHRoZSB0cmlwbGUsIG5vdCB0aGUgMm5kCisKK1dlZCBGZWIgIDMgMDk6MDU6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzYmlnLnNoOiBOZXcgZmlsZS4gIEJpZyBlbmRpYW4gTUlQUyBlbXVsYXRpb24uCisJKiBjb25maWcvbWlwcy1iaWcubXQ6IE5ldyBmaWxlLiAgVXNlIG1pcHNiaWcgZW11bGF0aW9uLgorCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4Kik6IFVzZSB0YXJnZXQgbWlwcy1iaWcuCisJKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzYmlnLm8uCisJKGVtX21pcHNiaWcuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNiaWcuc2guCisKK1R1ZSBGZWIgIDIgMTE6MzI6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLnNjLXNoOiBQdXQgLnNjb21tb24gc2VjdGlvbnMgaW50byAuc2JzcyBzZWN0aW9uLgorCisJKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IFByZXNlcnZlIHNlY3Rpb24gb2YgY29tbW9uIHN5bWJvbHMsCisJcmF0aGVyIHRoYW4gYWx3YXlzIHB1dHRpbmcgdGhlbSBpbiBiZmRfY29tX3NlY3Rpb24uCisJKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBJZiBhIGNvbW1vbiBzeW1ib2wgaXMgbm90IGluCisJYmZkX2NvbV9zZWN0aW9uLCBwdXQgaW4gYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUsIHJhdGhlciB0aGFuCisJYWx3YXlzIHB1dHRpbmcgaXQgaW4gc2VjdGlvbiBDT01NT04uCisKK0ZyaSBKYW4gMjkgMDk6NTc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAoc3ViZmlsZV93YW50ZWRfcCk6IElmIHdlIGFscmVhZHkgaGF2ZSBhIGNvbW1vbgorCWRlZmluaXRpb24gb2YgYSBzeW1ib2wsIGRvbid0IG5lY2Vzc2FyaWx5IHB1bGwgaW4gYW4gb2JqZWN0IGZpbGUKKwl0aGF0IHByb3ZpZGVzIGEgbm9uLWNvbW1vbiBkZWZpbml0aW9uLgorCisJKiBsZGxleC5sIChDT01NQU5EKTogQWNjZXB0IC1FQiBhbmQgLUVMIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsCisJcmV0dXJuaW5nIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMLiAgZ2NjIHBhc3NlcyB0aGVzZSB0byBhIE1JUFMKKwlsaW5rZXIuCisJKiBsZGdyYW0ueSAoT1BUSU9OX0VCLCBPUFRJT05fRUwpOiBOZXcgdG9rZW5zLgorCShjb21tYW5kX2xpbmVfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgT1BUSU9OX0VCIGFuZCBPUFRJT05fRUwuCisKK1RodSBKYW4gMjggMTU6MTI6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSAkKHRvb2xkaXIpL2Jpbi9nbGQgYmVmb3JlIGNyZWF0aW5nCisJdGhlIGxpbmsgdG8gaXQuCisKK1R1ZSBKYW4gMjYgMTE6NDk6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBsZG1haW4uYywgbGRzeW0uYzogVXNlIG5ldyBiZmRfaXNfY29tX3NlY3Rpb24gbWFjcm8gcmF0aGVyIHRoYW4KKwljaGVja2luZyBmb3IgZXF1YWxpdHkgdG8gYmZkX2NvbV9zZWN0aW9uLgorCitGcmkgSmFuIDIyIDE0OjIyOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy5zYy1zaDogTmV3IGZpbGUuICBVbHRyaXgsIGFuZCBob3BlZnVsbHkgb3RoZXIgTUlQUyBFQ09GRgorCXRhcmdldHMsIGxpbmtlciBzY3JpcHQuCisJKiBtaXBzbGl0LnNoOiBOZXcgZmlsZS4gIExpdHRsZSBlbmRpYW4gTUlQUyBlbXVsYXRpb24uCisJKiBjb25maWcvbWlwcy1saXQubXQ6IE5ldyBmaWxlLiAgVXNlIG1pcHNsaXQgZW11bGF0aW9uLgorCSogY29uZmlndXJlLmluIChtaXBzLWRlYy11bHRyaXgqKTogVXNlIHRhcmdldCBtaXBzLWxpdC4KKwkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGVtX21pcHNsaXQuby4KKwkoZW1fbWlwc2xpdC5jKTogTmV3IHRhcmdldC4gIFVzZXMgbWlwc2xpdC5zaC4KKworVGh1IEphbiAxNCAxNTozMDoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBsZCBhcyBib3RoICQodG9vbGRpcikvYmluL2xkIGFuZAorCSQodG9vbGRpcikvYmluL2dsZCwgc28gdGhhdCBnY2MgY2FuIGZpbmQgaXQgd2l0aCBvciB3aXRob3V0CisJY29sbGVjdDIuCisKK01vbiBKYW4gMTEgMTg6NTA6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBsZHdyaXRlLmM6IFJlbW92ZWQgcGVyZm9ybV9yZWxvY2F0aW9uLCBjb3B5X2FuZF9yZWxvY2F0ZSwgYW5kCisJd3JpdGVfbm9yZWwuICBBbGwgbGlua2luZyBpcyBub3cgZG9uZSB2aWEgd3JpdGVfcmVsYXguICBDYWxsCisJbGRzeW1fd3JpdGUgYmVmb3JlIGNhbGxpbmcgd3JpdGVfcmVsYXguCisJKiByZWxheC5jOiBBZGRlZCBjb3B5cmlnaHQuCisJKHdyaXRlX3JlbGF4KTogUmVuYW1lZCBmcm9tIHdyaXRlX3JlbGF4bm9yZWwuICBBZGRlZCByZWxvY2F0ZWFibGUKKwlhcmd1bWVudC4gIHNlY2xldF9kdW1wIHJlbmFtZWQgdG8gYmZkX3NlY2xldF9saW5rLgorCSogcmVsYXguaDogQWRkZWQgY29weXJpZ2h0LgorCitNb24gSmFuIDExIDE1OjQxOjU2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAoZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSk6IFBhdGNoIGZyb20KKwlob29nZW5Ac2hhZmVyLmNzLnV0YWguZWR1LCBkb24ndCByZXJlYWQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgorCitGcmkgSmFuICA4IDE4OjA0OjMzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3Z4d29ya3M5NjAubXQgcmVuYW1lZCB0byBjb25maWcvaTk2MC5tdAorCisJKiBjb25maWd1cmUuaW46IHNwYXJjLWFvdXQgZW11bGF0ZXMgYSBzdW40LCBhcyBkb2VzCisJc3BhcmMqLXZ4d29ya3MsIGk5NjAtbmluZHkgdXNlcyBnbGQ5NjAgZW11bGF0aW9uCisKK0ZyaSBKYW4gIDggMTQ6Mzk6MDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkgRml4IHN1cHBvcnQgZm9yIE5PTE9BRCwgYWRkIElOQ0xVREUKKwkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpOiBwYXNzIGZpbGUgbmFtZSB0bworCWxleF9wdXNoX2ZpbGUuCisJKiBsZGxleC5sLCBsZGdyYW0ueTogdGlkeSB1cCwgcGFyc2UgSU5DTFVERSBhbmQgTk9MT0FECisJKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogbWFrZSBvdXRwdXQgc2VjdGlvbnMgaW5oZXJpdCBORVZFUl9MT0FECisJYXR0cmlidXRlLgorCitUaHUgSmFuICA3IDEwOjIyOjE5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oOiBubyBtb3JlIGRlZmF1bHQgZW11bGF0aW9uLiAgTWFrZSB0aGUgbGFjaworCW9mIGVtdWxhdGlvbiBhIGNvbXBpbGUgdGltZSBlcnJvcgorCitXZWQgSmFuICA2IDAxOjA4OjM3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pc2UgYWxsIHNwYXJjbGl0ZSB2YXJpYW50cywgbm90IGp1c3QgJ3NwYXJjbGl0ZScKKworTW9uIERlYyAyOCAxMToxNTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG02OGtjb2ZmLnNjLXNoOiBkZWZpbmUgX2VuZCBhcyB3ZWxsIGFzIGVuZCwgZm9yIGNvbnNpc3RlbmN5IHdpdGgKKwlhb3V0LnNjLXNoLgorCisJKiBjb25maWd1cmUuaW46IGFjY2VwdCAqLWVyaWNzc29uLW9zZSBmb3IgYW55IG02OGsgQ1BVLgorCisJKiBsZHdyaXRlLmMgKHdyaXRlX3JlbCk6IGRvbid0IGFsd2F5cyBzZXQgU0VDX0hBU19DT05URU5UUyBmbGFnCisJZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uCisKK01vbiBEZWMgMjEgMTY6MDY6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBsZGV4cC5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkc3ltLmMsIGxkd2Fybi5jOiAgVXNlIG5ldworCW1hY3JvIGJmZF9hc3ltYm9sX2JmZCBhcyBhcHByb3ByaWF0ZS4KKwkqIE1ha2VmaWxlLmluOiAgVW4tZHVwbGljYXRlIGxkbGV4LmMgZGVwZW5kZW5jeS4KKwkqIGNvbmRpZ3VyZS5pbjogIFJlcGxhY2UgbXlfaG9zdCBjYXNlIHRhYmxlIGJ5IHNvdXJjaW5nCisJLi4vYmZkL2NvbmZpZ3VyZS5ob3N0LiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlIGRlZmF1bHQuCisJKiBsZG1pc2MuYzogIENoYW5nZSBsb2dpYyBmb3IgQysrIG5hbWUgZGVtYW5nbGluZzogIFRoZXJlIGlzCisJbm8gaW5pdGlhbCAnXycgdG8gcmVtb3ZlIGZyb20gc3RhYi1kZXJpdmVkIGZ1bmN0aW9uIG5hbWVzLgorCitTdW4gRGVjIDEzIDE2OjMxOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYyAobGFuZ19pbml0X3NjcmlwdF9maWxlKTogZG9uJ3QgYXR0YWNoIHRoZSBvdXRwdXQgZmlsZQorCXNlY3Rpb25zIHRvIHRoZSBzY3JpcHQgZmlsZS4KKworV2VkIERlYyAgOSAwODozODowNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKwkqIGxkbGFuZy5jICh3aWxkKTogcnVuIGV4cGFuc2lvbiBsb29wIG92ZXIgY29tbWFuZCBsaW5lIGJmZCB0b28uCisJKGxhbmdfaW5pX3NjcmlwdF9maWxlKTogaW5pdGlhbGl6ZSBtb3JlIHBhcnRzIG9mIHRoZSBjb21tYW5kIGxpbmUKKwliZmQuCisJKiBsZGxleC5sOiBmaXggREVGSU5FRCBzdGFydCBzdGF0ZXMuCisKK01vbiBEZWMgIDcgMDg6NDM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisJIC15IHN1cHBvcnQKKwkqIGxkLnRleGluZm86IG5ldyBkb2MuCisJKiBsZGdyYW0ueSwgbGRsZXgubDogdW5kZXJzdGFuZCAteTxzeW1ib2w+CisJKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBpZiBoYWQgLXksIGxvb2t1cCBzeW1ib2wgYW5kCisJcHJpbnQgaW5mby4gKGFkZF95c3ltKTogbmV3IGZ1bmN0aW9uLgorCSogbGRzeW0uaDogKGxkc3ltX3R5cGUpOiBuZXcgZGVmaW5lIFNZTV9ZLgorCitTYXQgTm92IDIxIDAzOjE1OjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBsZGN0b3IuaCwgbGRlcnJvci5oLCBsZGV4cC5oLCBsZGZpbGUuaCwgbGRpbmRyLmgsIGxkbGFuZy5jLAorCWxkbGFuZy5oLCBsZGxleC5oLCBsZG1haW4uaCwgbGRtaXNjLmgsIGxkc3ltLmgsIGxkdmVyLmgsIGxkd2Fybi5oLAorCWxkd3JpdGUuaCwgcmVsYXguaDogIFJlcGxhY2UgYWxsIHVzZXMgb2YgRVhGVU4gYW5kIFBST1RPIGFuc2ktZ2x1ZQorCW1hY3JvcyB3aXRoIFBBUkFNUy4gIFJlY3JlYXRpb25hbCBjbGVhbnVwLiAgVXBkYXRlIGNvcHlyaWdodHMuCisKK1R1ZSBOb3YgMTAgMDA6MjM6MzcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcGFzcyBkb3duIHRoZSBiZmQgc291cmNlIGRpcmVjdG9yeSBmb3IgaW5jbHVkZXMKKworVGh1IE5vdiAgNSAxNTo0MTo1NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBkb24ndCBjaGFuZ2Ugc2l6ZSBhbmQgYWRkcmVzcyBmb3IKKwlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbnMgcmF0aGVyIHRoYW4gZm9yIFNFQ19ORVZFUl9MT0FECisJc2VjdGlvbnMuCisKK1RodSBOb3YgIDUgMTE6MzM6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogcmUtZW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIGRhdGFfc3RhdGVtZW50cworCWluIHNjcmlwdHMsIG1ha2VzIGNvdW50ZWQgY29udHJ1Y3RvciBsaXN0cyB3b3JrIGFnYWluLgorCitUaHUgTm92ICA1IDA1OjQzOjAxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBsZGVtdWwuaDogIFJlbW92ZSB1c2VzIG9mIFNERUYgYW5kIFBST1RPIG1hY3JvcyAodXNlIFBBUkFNUykuCisKK1R1ZSBPY3QgMjAgMTA6NTY6MDYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtNjhrY29mZi5zYy1zaDogZG9uJ3QgdXNlIGluaXRpYWwgdW5kZXJzY29yZXMgZm9yIGV0ZXh0LCBlZGF0YQorCWFuZCBlbmQuCisKK01vbiBPY3QgMTkgMDk6NDU6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBTdXBwb3J0IGZvciBpMzg2LXN5c3YuCisJY29uZmlndXJlLmluOiBjaGVjayBmb3IgaTM4Ni0qLXN5c3YqIGFuZCBpMzg2LSotc2NvKi4KKwlpMzg2Y29mZi5zYy1zaDogcmV3cm90ZSB0byBzdXBwb3J0IFNWUjMgYnkgZGVmYXVsdC4KKwlsZGN0b3IuYyAoZmluZF9jb25zdHJ1Y3RvcnMpOiBwcmVzZXJ2ZSBzdGF0X3B0ci4KKwlsZGxhbmcuYyAod2lsZF9kb2l0KTogaW5pdGlhbGl6ZSB2bWEgYW5kIHNpemUgb2YgbmV3IG91dHB1dAorCXNlY3Rpb24gdG8gY29ycmVzcG9uZGluZyBpbnB1dCBzZWN0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IKKwlzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgorCShsYW5nX3NpemVfc2VjdGlvbnMpOiBkb24ndCBtb2RpZnkgdm1hIGFuZCBzaXplIG9mIHNlY3Rpb25zIHdoaWNoCisJYXJlIG5ldmVyIGxvYWRlZCAoZm9yIHNoYXJlZCBsaWJyYXJpZXMpLgorCWxkd3JpdGUuYyAoY29weV9hbmRfcmVsb2NhdGUpOiBjb3B5IHRoZSBjb250ZW50cyBvZiBhbnkgc2VjdGlvbgorCXdoaWNoIGhhcyBjb250ZW50cywgbm90IGp1c3Qgc2VjdGlvbnMgd2hpY2ggYXJlIGxvYWRlZCAoZm9yIHNoYXJlZAorCWxpYnJhcmllcykuCisKK1RodSBPY3QgMTUgMTU6MjA6MjYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChzaXplX2lucHV0X3NlY3Rpb24pOiBjb3VudCB0aGUgc2l6ZXMgb2YgYWxsIHNlY3Rpb25zCisgICAgICAgIHdlIGFsbG9jYXRlLgorCitUaHUgT2N0ICA4IDA5OjA1OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZG1pc2MuYyAoZGVtYW5nbGUsdmZpbmZvKTogdXNlIHRoZSBuZXcgdW5kZXJzY29yZSBpbiBiZmQgdG8KKwl0byBkZW1hbmdsZSBzeW1ib2xzIGJldHRlcgorCitUdWUgT2N0ICA2IDEzOjA4OjU0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogZG9uJ3Qgd2FybiBpZiAtZSBzdGFydCBzeW1ib2wgZG9lcyBub3QKKwlleGlzdCB3aGVuIGxpbmtpbmcgd2l0aCAtci4KKworTW9uIE9jdCAgNSAxNDowNzozNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFvdXQuc2Mtc2gsIG02OGtjb2ZmLnNjLXNoOiBzZXQgX19ic3Nfc3RhcnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCS5ic3Mgc2VnbWVudC4KKworTW9uIE9jdCAgNSAwODo1NToxNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKGxpbmVhcl9saWJyYXJ5KTogZG9uJ3QgZXZlbiB0aGluayBhYm91dCBwcm9jZXNzaW5nCisJYW4gb2JqZWN0IGZpbGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gZG9uZQorCitUaHUgT2N0ICAxIDIzOjE0OjU5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiB0aGUgaHA5MDAwLzMwMCBjb25maWcgZmlsZSBpcyBub3cgaHAzMDAKKworV2VkIFNlcCAzMCAwNzozNDowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3o4a3NpbS5tdDogbmV3IGZpbGUKKworRnJpIFNlcCAyNSAxMzo0OTo1MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3lyaWF0aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobGRleHAubywgbGRjdG9yLm8sIGxkbGFuZy5vLCBsZG1haW4ubywgbGR3cml0ZS5vLAorCWxleHN1cC5vLCBtcmkubywgcmVsYXgubyk6IEluZGljYXRlIGRlcGVuZGVuY2Ugb24gbGRncmFtLmguCisKKwkqIGxkLmggKHN0cmlwX3N5bWJvbHNfdHlwZSk6IEFkZCB2YWx1ZSBTVFJJUF9TT01FLgorCSogbGRncmFtLnkgKE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFKTogTmV3IHRlcm1pbmFsIHRva2VuLgorCSogbGRsYW5nLmMgKGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCisJKiBsZGxleC5sOiBIYW5kbGUgIi1yZXRhaW4tc3ltYm9scy1maWxlIi4KKwkqIGxkc3ltLmMgKGtlZXBzeW1zX2ZpbGUsIGtlcHRfc3ltcyk6IE5ldyB2YXJzLgorCShwcm9jZXNzX2tlZXBzeW1zKTogTmV3IGZ1bmN0aWhvbjsgcmVhZHMgZmlsZSwgbWFya3Mgc3ltYm9scyBmb3IKKwlzYXZpbmcuCisJKHdyaXRlX2ZpbGVfbG9jYWxzKTogRmlsZSBzeW1ib2xzIHNob3VsZCBhbHdheXMgYmUga2VwdC4KKwkobGRzeW1fd3JpdGUpOiBXYXJuIGFib3V0ICItcmV0YWluLXN5bWJvbHMtZmlsZSIgb3ZlcnJpZGluZyAiLVMiCisJYW5kICItcyIuICBQcm9jZXNzIHJldGFpbi1zeW1ib2xzIGZpbGUgYmVmb3JlIHNldHRpbmcgc3ltdGFiLgorCSogbGRzeW0uaCAoU1lNX0tFRVApOiBOZXcgZmxhZyBmb3IgbGRzeW1fdHlwZSBmbGFncy4KKwkoa2VlcHN5bXNfZmlsZSwga2VwdF9zeW1zKTogRGVjbGFyZSB0aGVtLgorCisJKiBsZG1haW4uYyAobWFpbik6IE5vbi1mYXRhbCBlcnJvcnMgc2hvdWxkIHN0aWxsIGNhdXNlIG5vbi16ZXJvCisJZXhpdCBzdGF0dXMgZXZlbiB3aXRoIC1yLgorCitGcmkgU2VwIDI1IDExOjA4OjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aGUgejhrCisJKiB6OGtzaW0uZW0sIHo4a3NpbS5zYy1zaCwgejhrc2ltLnNoOiBuZXcgZmlsZXMKKwkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IG1vZGlmaWVkIHRvIHJlZmxlY3QgYWJvdmUKKworCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiB3aGVuIGxpbmtpbmcgY29uZmxpY3RpbmcgYXJjaGl0ZWN0dXJlcywKKwltYWtlIHRoZSBvdXRwdXQgZmlsZSByZWZsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgYmFkIGlucHV0cy4KKworVHVlIFNlcCAxNSAxNTozNTozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgbGQgaW4KKwkkKHRvb2xkaXIpL2Jpbi4KKworRnJpIFNlcCAxMSAxMDoyNDoyMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogbW9kaWZpZWQgdG8gc3VwcG9ydCBpMzg2LWNvZmYKKwkqIGkzODZjb2ZmLnNoOiBuZXcgZmlsZQorCitXZWQgU2VwICA5IDExOjUyOjU4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIG02OGtjb2ZmLnNoLCBtNjhrY29mZi5zYy1zaCwgY29uZmlnL202OGstY29mZi5tdDoKKwlhZGRlZCBtNjhrLWNvZmYgZW11bGF0aW9uIG1vZGUsIHN0b2xlbiBmcm9tIGEyOWsgZW11bGF0aW9uLgorCUFsbW9zdCBjZXJ0YWlubHkgd3JvbmcsIGJ1dCBwZXJoYXBzIGJldHRlciB0aGFuIHN1bjMuCisKK1RodSBTZXAgIDMgMTQ6MTk6MzAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgTWFrZWZpbGUuZG9zLCBnZW5lcmljLmVtLCBnZW5zY3JpcHRzLnNoLAorCWdsZDk2MC5lbSwgaDgzMDBobXMuZW0sIGg4MzAweHJheS5lbSwgbG5rOTYwLmVtLCBzdDIwMDAuZW0sCisJdmFuaWxsYS5lbTogIFJlbmFtZSBhbGwgKGdlbmVyYXRlZCkgbGRfXyouYyBmaWxlcyB0byBlbV8uYy4KKwlUaGlzIGlzIG9uZSBjaGFyYWN0ZXIgc2hvcnRlciwgYW5kIGxldHMgcGVvcGxlIGJ1aWxkIG9uCisJU1ZSMyBzeXN0ZW0uIChsZF9faDgzMDB4cmF5Lltjb10gd2FzIHRoZSBraWxsZXIgdGhlcmU7CisJaDgzMDB4cmF5LnNjLXNoIGlzIGFsc28gb3ZlcmxvbmcsIGJ1dCBzZWVtcyBoYXJtbGVzcy4pCisJQmFzZWQgb24gYSBwYXRjaCBmcm9tIEpvbmF0aGFuIFJ5c2hwYW4gPGhpdGFjaGkhYW1pdG8ham9uPi4KKwkqIE1ha2VmaWxlLmluIChjbGVhbik6ICBGaXggdHlwbyBtb3N0Y2xlYW4gLT4gbW9zdGx5Y2xlYW4uCisJKiBjb25maWd1cmUuaW46ICBBZGQgaG9zdCBpc2MuCisKKwkqIGxkdmVyLmM6ICBDYWxsIGl0IHZlcnNpb24gMi4wLgorCitXZWQgU2VwICAyIDAwOjIxOjMzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuYzogIEJ1bXAgdG8gdmVyc2lvbiAwLjk4LgorCSogVE9ETzogIE5ldyBmaWxlLgorCisJKiBNYWtlZmlsZS5pbjogIEFkZGVkIG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIHJlYWxjbGVhbiBydWxlcy4KKworVHVlIFNlcCAgMSAyMzo0MjoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGxkbWlzYy5jICh4cmVhbGxvYyk6ICBOZXcgKG5lZWRlZCBieSAuLi9saWJpYmVydHkvY3BsdXMuZGVtLmMpLgorCSogbGRsZXgubDogTW92ZWQgY29tbWVudCgpIHRvIGVuZCwgc2luY2Ugc29tZSBjb21waWxlcnMKKwlvdGhlcndpc2UgaGF2ZSBwcm9ibGVtcyB3aXRoIGlucHV0KCkgdXNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4KKworVHVlIFNlcCAgMSAxNzo0NTo1MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgU29sYXJpcyAyIGFuZCBJcml4IDQgaG9zdCBzdXBwb3J0LgorCitNb24gQXVnIDMxIDE5OjI3OjExIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbW92ZSAtUyBmbGFnIGZyb20gdGhlIEZMRVggZGVmaW5pdGlvbgorCisJKiBjb25maWd1cmUuaW46IHJld3JvdGUsIHVzaW5nIG5ldyBzdHlsZSBjYXNlIHN0YXRlbWVudC4gIHVzZQorCW02OGsubXQgZm9yIG02OGstYW91dCBzeXN0ZW1zCisKK1N1biBBdWcgMzAgMjE6Mzg6NTMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogbWFwICJsZCIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KKwlpbnN0YWxsaW5nLgorCitTdW4gQXVnIDMwIDE4OjEyOjEzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmM6ICBSZW1vdmVkLiAgVXNlIHRoZSB2ZXJzaW9uIGluIGxpYmliZXJ0eSBub3cuCisJKiBsZG1pc2MuYzogIFVzZSBuZXcgbGliaWJlcnR5IHZlcnNpb24gb2YgY3BsdXNfZGVtYW5nbGUoKS4KKworVGh1IEF1ZyAyNyAxNjozODo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGdsZDk2MC5lbSAoZ2xkOTYwX2Nob29zZV90YXJnZXQpOiBkZWZhdWx0IHRvIGxpdHRsZSBlbmRpYW4sIG5vdAorCWJpZyBlbmRpYW4uCisKK1dlZCBBdWcgMjYgMTc6Mjg6NTEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBkb24ndCBwYXNzIG51bGwgcG9pbnRlcnMgd2hlbgorCWFic19vdXRwdXRfc2VjdGlvbiBpcyB3aGF0IGlzIHJlcXVpcmVkLgorCSogbGR3cml0ZS5jIChsZHdyaXRlKTogdXNlIG1hbGxvYyB0byBhbGxvY2F0ZSB0aGUgbGFyZ2VzdCBzcGFjZQorCXVzZWQsIGFuZCBwYXNzIHRoYXQgZG93bi4KKwkqIHJlbGF4LmMscmVsYXguaCAod3JpdGVfcmVsYXhub3JlbCk6IHVzZSB0aGUgcGFzc2VkIG1hbGxvYyBhcmVhIHJhdGhlcgorCXRoYW4gYWxsb2NhLgorCitNb24gQXVnIDI0IDE0OjQyOjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluLCBjb25maWcvb3NlNjgubXQ6IHJlbmFtZWQgT1NFIHRvIG9zZS4KKworVGh1IEF1ZyAyMCAxOTo1NToyMiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiBSZW9yZGVyIGNoZWNrIGZvciBjb21tb24gb3IKKwl1bmRlZmluZWQgc3ltYm9scyBzbyB0aGF0IGl0IHdvcmtzLgorCitUdWUgQXVnIDE4IDEzOjQxOjM2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBhY2NlcHQgYWxsIG02OEsgZmFtaWx5IG1lbWJlcnMuCisKKwkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KKworVGh1IEF1ZyAxMyAxMTo0OTozNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRsZXgubDogbm93IHBhcnNlcyBjb21tZW50IGNvcnJlY3RseSwgYWRkZWQgfiB0byBhY2NlcHRhYmxlCisJY2hhcnMgaW4gZmlsZW5hbWVzCisKKwkqIGxkZXhwLmMgKGV4cF91bm9wKTogcGFzcyBkb3duIGFic19vdXRwdXRfc2VjdGlvbiAtIG5vdyBjYW4gaGF2ZQorCXVuYXJ5IC12ZSBjb25zdGFudHMuCisKKwkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IHdhcm4gd2hlbiBhbiBlbnRyeSBzeW1ib2wgc3VwcGxpZWQgb24KKwl0aGUgY29tbWFuZCBsaW5lIGNhbid0IGJlIGZvdW5kLgorCitGcmkgQXVnICA3IDEyOjMxOjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuaDogYWRkIG5ldyBmaWVsZCAibG9hZGFibGUiIHRvIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KKwkqIGxkbGFuZy5jIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXApOiBpbml0aWxpemUgbmV3CisJZmllbGQuICh3aWxkX2RvaXQpOiBpZiBuZXcgZmllbGQgaXMgbm90IHNldCwgdGhlbiBzdG9wIG91dHB1dAorCXNlY3Rpb24gZnJvbSBiZWluZyBsb2FkYWJsZS4KKwkobGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBzZXQgdGhlIGZpZWxkIGZyb20gdGhlCisJTk9MT0FEIGtleXdvcmQKKwkqIGxkZ3JhbS55OiBuZXcgc3luYXggZm9yIE5PTE9BRC4gUmVtb3ZlcyBhIHNoaWZ0L3JlZHVjZSB0b28uCisJKiBoODMwMGhtcy5zYy1zaCwgaDgzMDBobXMuZW06IGdldCAtciByaWdodC4KKworVGh1IEF1ZyAgNiAxODozNToyMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGxkaW50LnRleGluZm86ICBOZXcgaW50ZXJuYWxzIG1hbnVhbCAoYmVnaW5uaW5ncyB0aGVyZW9mKS4KKwkqIFBPUlRJTkc6ICBSZW1vdmVkLCBtZXJnZWQgaW50byBsZGludC50ZXhpbmZvLgorCitUdWUgQXVnICA0IDIxOjEyOjI5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY2R0ZXN0LW1haW4uY2MsIGNkdGVzdC1mdW5jLmNjLCBjZHRlc3QtZm9vLmgsIGNkdGVzdC1mb28uY2MsCisJY2R0ZXN0LmV4cDogIEEgdGVzdCBwcm9ncmFtIChjb3BpZWQgZnJvbSBsaWJnKysvdGVzdC1pbnN0YWxsKQorCXRoYXQgdGVzdHMgdGhhdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGhhbmRsZWQKKwljb3JycmVjdGx5LgorCitNb24gQXVnICAzIDE0OjU4OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpbnN0YWxsIGZyb20gbGQubmV3LCByZW5hbWluZyBkdXJpbmcgdGhlCisJY29weSwgb3IgZWxzZSB0aGUgbmV4dCAnbWFrZSBpbnN0YWxsJyBuZWVkcyB0byByZS1saW5rIGxkLgorCitNb24gSnVsIDIwIDAzOjM3OjA2IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBnZW5lcmFsaXNlIGhwIHJlY29nbml0aW9uIChmcm9tIHNlZikuCisKK1NhdCBKdWwgMTggMTQ6NDY6MDQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBic2QgYW5kIGhwdXggaHBwYSBjb25maWd1cmF0aW9ucy4KKwllcnJvciBtZXNzYWdlcyBlY2hvIHRvIHN0ZGVyciwgbm90IHN0ZG91dAorCitGcmkgSnVsIDE3IDIyOjA2OjExIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuZG9zLCBnbGQuMSwgbGQudGV4aW5mbywgbGRlbXVsLmMsIGxkZmlsZS5jLCBsZGxhbmcuYywKKwkgIGxkbWlzYy5jOiByZW1vdmVkIHJjc2lkJ3MuCisKK1R1ZSBKdWwgMTQgMDg6MzQ6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChsYW5nX21hcCk6IHByaW50IGNoYW5nZXMgaW4gc2l6ZXMgZHVlIHRvIHJlbGF4aW5nCisJKHNpemVfaW5wdXRfc2VjdGlvbik6IG1haW50YWluIHRoZSBkZWx0YSBpbmZvcm1hdGlvbi4KKwkqIGxkbGFuZy5oOiBhZGQgbmV3IGZpZWxkIHRvIHN0cnVjdCB0byBjb250YWluIGRlbHRhIGluZm8uCisJKiByZWxheC5jICAocmVsYXhfc2VjdGlvbik6IGNvbXBsYWluIGlmIGlucHV0IG5vdCByZWxheGFibGUuCisJKiBsZGxleC5sIDogYWRkICdfJywgJywnIGFuZCAnJCcgdG8gY2hhcnMgd2hpY2ggY2FuIGFwcGVhciBhdCB0aGUKKwlzdGFydCBvZiBhIGZpbGVuYW1lCisKK01vbiBKdWwgMTMgMTc6MzM6MDAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbWFpbi5jKG1haW4pOiBwcmV2ZW50IC1yIGFuZCAtcmVsYXggZnJvbSBiZWluZyBvbiBhdCB0aGUgc2FtZQorCXRpbWUuCisKK1dlZCBKdWwgIDEgMTc6NTE6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbWFpbi5jIChRX2VudGVyX2dsb2JhbF9yZWYpLCBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogZml4IGZvcgorCWFsaWFzaW5nIHByb2JsZW1zCisKKworVGh1IEp1biAxOCAwOTozODo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaDgzMDBobXMuZW0sIGg4MzAwaG1zLnNjLXNoOiAgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciAtcgorCSogbGRleHAuYzogIGxpbnQKKwkqIGxkbGFuZy5jKG9wZW5fb3V0cHV0KTogc2V0IHRoZSB0YXJnZXQgYXJjaCBhbmQgbWFjaGluZSBhcyBzb29uCisJYXMgd2UgY2FuLiAobGFuZ19zaXplX3NlY3Rpb25zKTogdXNlIG5ldyBtYWNyb3MgZm9yIHNldHRpbmcgdm1hCisJKiBsZHdyaXRlLmM6IGxpbnQKKworTW9uIEp1biAxNSAwODo0Nzo0MyAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKG15X3RhcmdldCk6IEFjY2VwdCBtNjgwPzAgZm9yIHdycyBhcyB2eHdvcmtzNjguCisJQWxzbyBkZWxldGVkIGFuIHVucmVhY2hhYmxlIHBhdGggdG8gd3JzLgorCitXZWQgTWF5IDI3IDIzOjI0OjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogdXNlIC1kIHRlc3QgZm9yICR0b29sZGlyIGJlZm9yZQorCWluc3RhbGxpbmcgbGQgdGhlcmUgc28gdGhhdCAkdG9vbGRpciBjYW4gYmUgaW5oZXJpdGVkIGZyb20KKwl0b3AtbGV2ZWwgTWFrZWZpbGUuCisKK1dlZCBNYXkgMjcgMTY6NTY6NDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBsZGxhbmcuYzogIFR3byBub24tc3Vic3RhbnRpYWwgY2hhbmdlcyBmb3IgdGhlIHNha2Ugb2YKKwl0aGUgb2xkIFBvcnRhYmxlIEMgQ29tcGlsZXIuCisKK1dlZCBNYXkgMjcgMTU6MTU6NTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBsZGdyYW0ueSwgbGRsZXgubDogcGFyc2UgQUJTT0xVVEUKKwkqIGxkZXhwLmM6IGFkZCBzdXBwb3J0IGZvciBBQlNPTFVURQorCitXZWQgTWF5IDI3IDEzOjA3OjIwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBBZGRlZCBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBIT1NUSU5HX0NSVDAsCisJSE9TVElOR19MSUJTLCBhbmQgSE9TVElOR19FTVUsIGJhc2VkIG9uIHRob3NlIGluIGNvbmZpZy8qLm1oLgorCSogY29uZmlnLyoubWg6ICBNaXNjZWxsYW5lb3VzIGNsZWFuLXVwOiAgUmVtb3ZlZCBkZWZpbml0aW9ucworCW9mIFlBQ0MgKHNpbmNlIGl0IGlzIG5vdCBsb25nZXIgdXNlZCBpbiB0aGUgTWFrZWZpbGUpLgorCVJlbW92ZSBIT1NUSU5HXyogZGVmaW5pdGlvbnMgdGhhdCBhcmUgc3Vic3VtZWQgYnkgdGhlCisJb25lcyBhZGRlZCB0byBNYWtlZmlsZS5pbi4gIFJlbW92ZWQgbW9zdCBkZWZpbml0aW9ucyBvZiBDQy4KKwkqIGNvbmZpZy97c3BhcmMsbmV3cyxocDMwMGJzZCxkZWNzdGF0aW9ufS5taDogIFJlbW92ZWQ7CisJVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQuCisKK0ZyaSBNYXkgMjIgMTM6NDc6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgVXNlIHNyY2RpciBpbnN0ZWFkIG9mIFZQQVRIIGluIGxkZ3JhbS9sZGxleAorCXJ1bGVzLCBzaW5jZSB0aGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgZGlzdHJpYnV0aW9uLgorCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiAgRG9uJ3QgcmUtZGlyZWN0IG91dHB1dCwgc2luY2UgdGhhdAorCWxlYXZlcyBhIGJvZ3VzIG91dHB1dCBmaWxlcyBpZiBpdCBmYWlscy4KKworCSogY29uZmlnL3NwYXJjLm1oOiAgRml4IEhPU1RJTkdfTElCUyBzbyBpdCBoYXMgYSBjaGFuY2Ugb2Ygd29ya2luZy4KKwkqIGxkbGV4LmM6ICBGaXggc29tZSB1bm5lY2Vzc2FyeSBmbGV4LXNwZWNpZmljLWlzbXMuCisKK0ZyaSBNYXkgIDggMTE6NDk6NDMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkZ3JhbS55OiBtb3ZlIHNwdXJpb3VzIHNlbWljb2xvbgorCSogbGRleHAuaDogZml4IHByb3RvdHlwZQorCitUaHUgTWF5ICA3IDE3OjAxOjEyIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGxkLnRleGluZm86IHJlZmVyZW5jZXMgdG8gbGlua2VyIG5vdyBzYXkgImxkIiBub3QgImdsZCIuCisKK1dlZCBNYXkgIDYgMTM6MjY6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwljaGFuZ2VkIGNhbGxpbmcgY29udmVudGlvbiBmb3IgUV9lbnRlcl9nbG9iYWxfcmVmCisJKiBsZGV4cC5jLCBsZGxhbmcuYywgbGRtYWluLmM6IHJlZmxlY3QgdGhpcworCSogbGR2ZXIuYzogYnVtcCB2ZXJzaW9uIHRvIDEuOTcuMQorCSogbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IHdoZW4gYW4gZWRpY3QgZGVjbGFyaW5nIGFuIGluZGlyZWN0CisJc3ltYm9sIGlzIGZvdW5kLCBtYWtlIHN1cmUgdGhhdCBhbnkgaWRlYXMgYWJvdXQgdGhlIHN5bWJvbCBiZWluZworCWNvbW1vbiBhcmUgY2hhbmdlZCBpZiBpdCBub3cga25vd24gdG8gYmUgZGVmaW5lZC4KKwkqIGxkbWFpbi5jIChsaW5lYXJfbGlicmFyeSk6IGNvbXBsYWluIG9uY2UgaWYgYXJjaGl2ZSBpc24ndAorCXJhbmxpYmJlZC4KKwkqIGxkbGFuZy5oLCBsZGxhbmcuYzogbWFrZSByb29tIGZvciBhbmQgaW5pdGlhbGl6ZSB0aGUgY29tcGxhaW4KKwlvbmNlIGZpZWxkLgorCitXZWQgTWF5ICA2IDExOjA3OjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHVzZSBmbGV4ICYgYmlzb24gZnJvbSAuLi8gaWYgdGhleSBleGlzdC4KKworVHVlIE1heSAgNSAxNzo0NzozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVsYXguYyAoYnVpbGRfaXQpOiBkb24ndCBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUgZm9yCisJc3R1ZmYgaWYgLVIgZmxhZyBhcHBseXMgdG8gaXQuCisJKiBsZGZpbGUuYzogbWVyZ2UgaW4gVk1TIGZpbGVuYW1lIHN1cHBvcnQKKwkqIGxkbWFpbi5jIChtYWluKTogdGFrZSBvdXQgLi8gZnJvbSBsaWJyYXJ5IHBhdGgsIGFuZCBjbG9zZSBmaWxlCisJYmVmb3JlIHVubGlua2luZy4gTWFrZSBtdWx0aXBsZSBkZWZzIG9mIGEgc3ltYm9sIGNyZWF0ZSBhbgorCXVuZXhlY2FibGUgZmlsZS4KKwkqIGxkbWlzYy5jOiBmYXRhbCBlcnJvc3JzIGRlbGV0ZSBvdXRwdXQgZmlsZQorCitUdWUgTWF5ICA1IDE0OjA1OjA1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuYzogIEluY3JlYXNlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTcsIGZvciBjb25zaXN0ZW5jeQorCXdpdGggLi4vYmludXRpbHMuCisKK1R1ZSBNYXkgIDUgMTI6MTI6MjQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBGTEVYIC0+IExFWC4KKworCSogbGQudGV4aW5mbzoge30gLT4gQHtAfS4KKworTW9uIE1heSAgNCAxNzo1Mjo0MSAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBsZC50ZXhpbmZvOiBkZXNjcmliZSBhbHRlcm5hdGUsIE1SSS1jb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzCisJKGFuZCBhc3NvY2lhdGVkIGNoYW5nZSBpbiAtYyBvcHRpb24sIG5vdyB1c2VkIGZvciB0aGVzZSBzY3JpcHRzKQorCitNb24gTWF5ICA0IDE2OjEwOjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZHZlci5jOiBCdW1wZWQgdmVyc2lvbiB0byAxLjk2IC0gbmV3IHJlbGVhc2UsIHJlc3luYyB3aXRoIHRoZQorCWJmZCB0b28gIy4KKwkqIGxkZXhwLmMsIGxkbGFuZy5jOiBub3cgYnVpbGQgbWVtb3J5IHNoYXBlIHRyZWUgaW4gb2JzdGFja3MKKwlyYXRoZXIgdGhhbiB3aXRoIHJhdyBtYWxsb2MsIG1ha2VzIGl0IGVhc2llciB0byB0cmFjayB3aGVyZSBtZW1vcnkKKwlpcyBnb2luZy4KKwkqIGxkc3ltLmgsIGxkc3ltLmM6IGNyZWF0ZSBvYnN0YWNrIGZvciBhbGwgZ2xvYmFsIHN5bWJvbHMgdG9vLgorCSogbGR3cml0ZS5jIChsZHdyaXRlKTogbW92ZWQgbWFsbG9jIHNvIG9ubHkgdXNlZCB3aGVuIG5lZWRlZC4KKwkqIHNhMjkyMDAtc2Muc2g6IGFkZGVkIHN1cHBvcnQgZm9yIC5saXQsIGRhdGExIGFuZCBkYXRhMiBzZWN0aW9ucy4KKworCitGcmkgTWF5ICAxIDE4OjE3OjUyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWcvc3BhcmMubWg6IHVzZSAuLi9nY2MvbGliZ2NjLmEgb24gY2hlY2sgaWYgaXQgZXhpc3RzLgorCisJKiBNYWtlZmlsZS5pbjogdXNlIGJvb3RzdHJhcCBmb3IgY2hlY2suCisKK0ZyaSBNYXkgIDEgMTM6MDM6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkZ3JhbS55LCBsZGxleC5jLCBtcmkuYzogYWRkZWQgbW9yZSBjb21wYXRpYmxlIHdvcmRzOyBCQVNFLCBBTElBUyBhbmQKKwlQVUJMSUMuCisJKiBNYWtlZmlsZS5pbjogbm93IHVzZSBmbGV4LCBub3QgbGV4CisJKiBsZGxleC5sLCBsZGxhbmcuYywgbGRjdG9yLmM6IGxpbnQKKworV2VkIEFwciAyMiAxMjo0ODo0MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRsZXgubDogYWRkZWQgQ01ERklMRU5BTUVDSEFSIHN0YXRlIHNvIHRoYXQgeW91IGNhbiBsZXgKKwlkaWZmZXJlbnQgc29ydHMgb2YgZmlsZW5hbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhhbiBpbiBhIHNjcmlwdC4KKworTW9uIEFwciAyMCAyMjozNzowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRoZQorCSAgbWFrZSBjb21tYW5kIGxpbmUuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgorCitGcmkgQXByIDE3IDA4OjU3OjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiByZWxheC5jOiBhZGRlZCBoYW5kbGluZyBmb3IgbmV3ICJwYWRkaW5nIiBzZWNsZXQgdHlwZSwgdXNlZCB0bworCWZpbGwgb3V0IGdhcHMgYmV0d2VlbiBzZWN0aW9uLgorCSogbGRncmFtLnksIGxkbGV4Lmw6IG5vdyAtZGVmc3ltIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgZG9uZQorCXByb3Blcmx5LgorCitXZWQgQXByIDE1IDIxOjIwOjA3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHRoZSB0b29sZGlyIGNvcHkgb2YgbGQgZ29lcyBkaXJlY3RseSBpbiB0b29sZGlyLgorCitXZWQgQXByIDE1IDE2OjA5OjMzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBtcmkuYywgbGRncmFtLnksIGxkbGV4Lmw6IGFkZGVkIHN1cHBvcnQgZm9yIG1pbmltYWwgc3RyYW5nZSBsaW5rCisJc2NyaXB0cy4KKworVGh1IEFwciAgOSAwNTo1MjowMiAxOTkyICBLZW4gUmFlYnVybiAgKFJhZWJ1cm5AQ3lnbnVzLkNPTSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBJbnN0YWxsIHNlY29uZCBjb3B5IGluICQodG9vbGRpcikvYmluCisJd2l0aG91dCAkKHByb2dyYW1fcHJlZml4KSwgc2luY2UgdGhhdCdzIHdoYXQgZ2NjIGV4cGVjdHMuCisKK1NhdCBBcHIgIDQgMTc6NDQ6MDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGV4LmwsIGxkZ3JhbS55LCBsZGxleC5oOiBSZXdyb3RlIGxleGVyLiBOb3cgaXQncyBtdWNoIG5pY2VyLgorCSogaDgzMDAqOiBmaXggYml0IHJvdCBhbmQgYWRkIHN1cHBvcnQgZm9yIGg4MzAweHJheSB0YXJnZXQKKwkqIGdvMzIuc2g6IHRhcmdldCBlbXVsYXRpb24gZm9yIGdvMzIuCisKK01vbiBNYXIgMTYgMTQ6NTM6MjkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcnRsLmN5Z251cy5jb20pCisKKwkqIGdsZDk2MC5lbSwgaTk2MC5zYy1zaC4gRml4IGk5NjAgYml0IHJvdAorCitGcmkgTWFyIDEzIDE5OjQ3OjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogaW5zdGFsbCBtYW4gcGFnZS4KKworRnJpIE1hciAxMyAwODoyMzo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LTxmb28+IHJlbmFtZWQgdG8gPGZvbz4ubXQKKwkqIGNvbmZpZy9taC08Zm9vPiByZW5hbWVkIHRvIDxmb28+Lm10CisJKiBjb25maWd1cmUuaW4gY2hhbmdlZCB0byByZWZsZWN0IHRoaXMKKwkqIGdlbnNjcmlwdHMuc2ggbm93IG1ha2UgLnhibiBmaWxlcyByYXRoZXIgdGhhbiAueE4gZmlsZXMKKworU2F0IE1hciAgNyAwMzo0MDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuaDogZml4IGRlY2wgb2YgbGR2ZXJzaW9uLgorCitGcmkgTWFyICA2IDIyOjAwOjM1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgorCitGcmkgTWFyICA2IDA2OjU5OjA0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsZG1haW4uYyAoUV9lbnRlcl9maWxlX3N5bWJvbHMpOiBub3cgYWxpYXNlcyB3b3JrIGFnYWluCisKK1RodSBNYXIgIDUgMjE6Mzk6MjkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4KKworVGh1IE1hciAgNSAxNjo1NTo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogbGRleHAuYyAoZXhwX3ByaW50X3RyZWUpOiBkb24ndCB0cnkgYW5kIGZvbGxvdyBudWxsIHBvaW50ZXJzCisJYXJvdW5kLgorCSogbGRncmFtLnk6IHJlbW92ZSAxMSBzaGlmdCByZWR1Y2UgZXJyb3JzCisKK1R1ZSBNYXIgIDMgMTU6NDY6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCisKK0ZyaSBGZWIgMjggMDg6MTc6NDUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGxkbGFuZy5jIChzaXplX2lucHV0X3NlY3Rpb24pOiBkb24ndCBtb3ZlIGFic29sdXRlIHNlY3Rpb25zCisJYXJvdW5kIQorCisKK1RodSBGZWIgMjcgMDk6MjA6NDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jOiB5ZXQgYW5vdGhlciBjb3B5IG9mIHRoaXMgLSBtYXliZSBpdCBzaG91bGQgZ28gaW50bworCWxpYmliZXJ0eSA/CisJKiBsZGdyYW0ueTogbm93IC1WIGFuZCAtdiBoYXZlIGRpZmZlcmVudCBhY3Rpb25zCisJKiBsZHZlci5jOiBpZiAtViwgcHJpbnRzIGxpc3Qgb2YgZW11bGF0aW9ucyBjb21waWxlZCBpbgorCSogbGRtaXNjLmM6IHN1cHBvcnQgZm9yIGNwbHVzIGRlbWFuZ2xpbmcKKworCitXZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAorCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCisJICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KKworVGh1IEZlYiAyMCAxNzo0Mzo0NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgbWtzY3JpcHQgcnVsZSBpbnRvIG9uZSBmb3IgLi9ta3NjcmlwdAorCShmb3IgdGhlIHNha2Ugb2YgbWFrZXMgdGhhdCBkb24ndCByZWFsaXplIHRoZXkncmUgdGhlIHNhbWUpLgorCSogUE9SVElORzogIEFkZCBtb3JlIGRldGFpbHMuCisJKiBnZW5zY3JpcHRzLnNoOiAgQWRkIG1vcmUgdGFpbG9yYWJpbGl0eSBvZiBEQVRBX0FMSUdOTUVOVC4KKworTW9uIEZlYiAxNyAxMjowNDozNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGFuZCBuZXcgZmlsZXMgaHAzMDBic2Quc2gsIGNvbmZpZy9taC1ocDMwMGJzZCwKKwljb25maWcvbXQtaHAzMDBic2Q6ICBOZXcgcG9ydCB0byBocDMwMCBydW5uaW5nIEJTRC4KKworU2F0IEZlYiAxNSAxMzo1OTo1NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCU1ham9yIHJld3JpdGUgb2YgaG93IGxkIGlzIGNvbmZpZ3VyZWQuICBUaGUgbWFqb3IgaWRlYQorCWlzIHRvIHVzZSBzaGVsbCBzY3JpcHRzIHRvIGdlbmVyYXRlIGV2ZXJ5dGhpbmcuCisJKiBnZW5lcmljLmVtIHJlcGxhY2VzIGxkdGVtcGxhdGUuCisJKiBPdGhlciAqLmVtIGZpbGVzIHJlcGxhY2UgdmFyaW91cyAqLmMgZmlsZXMuCisJQSAqLmVtIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcKKwlsZF9fKi5jIGZpbGUgdGhhdCBpbXBsZW1lbnRzIGFuIGVtdWxhdGlvbi4gIFRoaXMgaXMgdXN1YWxseQorCWEgc3RyYWlnaHQgJ2NhdCcgb2YgYSBoZXJlLWRvY3VtZW50LCBwb3NzaWJseSB3aXRoIHN1YnN0aXR1dGlvbnMuCisJKiBTY3JpcHQgZmlsZXMgKCouc2MpIGFyZSBwbGFjZXMgYnkgKi5zYy1zaCBzY3JpcHRzLgorCUFnYWluLCB0aGVzZSBhcmUgc2ltcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCAnY2F0JworCWhlcmUtZG9jdW1lbnRzLCB1c3VhbGx5IHdpdGggc29tZSBzdWJzdGl0dXRpb25zLgorCVRoZSBvdXRwdXQgYSAqLnNjLXNoIGlzIGEgc2NyaXB0IGZpbGUuCisJKiBFYWNoIGVtdWxhdGlvbiBpcyBkZWZpbmVkIGJ5IGEgc2hvcnQgc2hlbGwgc2NyaXB0IHdpdGgKKwlleHRlbnNpb24gKi5zaCB0aGF0IHNwZWNpZmllcyB0aGUgZW11bGF0aW9uLXNwZWNpZmljCisJcGFyYW1ldGVycyAoc3VjaCBhcyB0aGUgbmFtZSBvZiB0aGUgKi5zaC1zYyBhbmQgKi5lbQorCWZpbGVzIHRvIHVzZSkuCisJKiBnZW5zY3JpcHQuc2ggaXMgdGhlIG1hc3RlciBzaGVsbCBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZQorCWFuIGVtdWxhdGlvbi4gIEl0IGlzIHBhc3NlZCB2YXJpb3VzIGFyZ3VtZW50LCBpbmNsdWRpbmcKKwl0aGUgbmFtZSBhIHRoZSBlbXVsYXRpb24tc3BlY2lpYyAqLnNoIGZpbGUgdGhhdCBpdAorCSJzb3VyY2VzIiB0byBzZXQgdmFyaWFibGVzIHRvIGVtdWxhdGlvbi1zcGVjaWZjIHBhcmFtZXRlcnMuCisJKiBjb25maWcvbXQtZm9vOiAgQ2hhbmdlZCBFTVVMPUdMREZPT19FTVVMQVRJT05fTkFNRQorCXRvIEVNVUw9Zm9vLiAoVGhlIEdMREZPT19FTVVMQVRJT05fTkFNRXMgaGF2ZSBiZWUgcmVtb3ZlZC4pCisJKiBjb25maWcvbWgtZm9vOiAgUmVuYW1lIExERU1VTEFUSU9OIG5hbWVzIGFzIGFwcHJvcHJpYXRlCisJKHVzdWFsbHkgJ2dsZGZvbycgLT4gcGxhaW4gJ2ZvbycpLgorCSogbGR3cml0ZS5jOiAgRml4ZWQgYSB0eXBvIGluIGEgY29tbWVudC4KKwkqIE1ha2VmaWxlLmluOiAgTWFqb3IgY2hhbmdlcy4gIFJlbW92ZWQgc29tZSB0aGUgc2VkCisJbWFnaWMgdG8gY29udmVydHMgc2NyaXB0cywgc2luY2UgdGhhdCBpcyBub3cgaGFuZGxlZAorCWJ5IGdlbnNjcmlwdHMuc2ggYW5kIHRoZSAqLnNjLXNoIHNjaXB0IGdlbmVyYXRvcnMuCisJKiBjb25maWcuaDogIFJlbW92ZSBhIGJ1bmNoIG9mIG1hY3JvcyBkZWZpbmluZyBlbXVsYXRpb25zCisJYW5kIHRhcmdldHMuICBUaGlzIGJlY29tZXMgb25lIGxlc3MgZmlsZSB0byBlZGl0IHdoZW4KKwlhZGRpbmcgZW11bGF0aW9ucyBvciB0YXJnZXRzLgorCSogbGRlbXVsLmggKHN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiAgQWRkCisJZW11bGF0aW9uX25hbWUgYW5kIHRhcmdldF9uYW1lIGZpZWxkcy4KKwkqIGxkZW11bC5jLCBsZGVtdWwuaDogIERlZmluZSBzb21lIGRlZmF1bHQgZnVuY3Rpb25zIHVzZWQKKwlieSBtb3N0IGVtdWxhdGlvbnMgKGFuZCByZW1vdmUgZnJvbSB0aGUgKi5lbSBzY3JpcHRzKS4KKwkqIGxkZW11bC5jIChsZGVtdWxfY2hvb3NlX3RhcmdldCk6ICBTZWFyY2ggdGhlIG5ldworCWxkX2VtdWxhdGlvbnMgYXJyYXkgdXNpbmcgYSBsb29wIChpbnN0ZWFkIG9mIGEgaGFyZHdpcmVkCisJbmVzdGVkIGlmIHN0YXRlbWVudCkuCisJRGVmaW5lIHRoZSBsZF9lbXVsYXRpb24gZnJvbSB0aGUgYXV0b21hdGljYWxseS1nZWVucmF0ZWQKKwlsZGVtdWwtbGlzdC5oLiAgVGhpcyBtZWFucyB5b3Ugbm8gbG9uZ2VyIGhhdmUgdG8gZWRpdCBsZGVtdWwuYworCXRvIGFkZCBhIG5ldyBlbXVsYXRpb24uCisJKiBsZG1haW4uYzogIFJlcGxhY2Uge0dMRCxMTkt9OTYwX0VNVUxBVElPTl9OQU1FIGJ5CisJdGhlaXIgZXhwYW5zaW9ucywgc2luY2UgdGhlIGZvcm1lciBubyBsb25nZXIgZXhpc3QuCisJKiBQT1JUSU5HOiAgQSB2ZXJ5IHJvdWdoIGZpcnN0IGRyYWZ0IG9mIGEgcG9ydGluZyBndWlkZS4KKworCSogbGRncmFtLnksIGxkbGV4LmwsIGxleHN1cC5jOiBDaGFuZ2VzIHRvIGFsbG93IGFuIGFzc2lnbm1lbnQKKwl0byBiZSB0ZXJtaW5hdGVkIGJ5IGEgbmV3LWxpbmUgKGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgc2VtaWNvbG9uKS4KKworTW9uIEZlYiAxMCAxNjoyMTowMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogbGRleHAuYywgbGRsYW5nLmM6IGFkZGVkIG5ldyBpZGVhICJhYnNfb3V0cHV0X3NlY3Rpb24iLCByZW1vdmVzCisJdGVzdHMgZm9yIE5VTEwgcG9pbnRlcnMgYWxsIG92ZXIgdGhlIHBsYWNlLgorCSogbGRsYW5nLmMgKGxhbmdfcHJvY2Vzcyk6IHJlbWVtYmVyIHRvIHJlbG9jYXRlIGdsb2JhbCBzeW1ib2xzCisJKmFmdGVyKiByZWxheGluZyBoYXMgZG9uZSBpdCBzdHVmZi4KKworVGh1IEZlYiAgNiAxMTo0MDoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LWNvZmYtaDgzMDA6IHVzZSBFTVVMIGxpa2UgZXZlcnl0aGluZyBlbHNlCisJKiBsZGxhbmcuYzogKHByaW50X3BhZGRpbmdfc3RhdGVtZW50KTogcHJpbnQgdGhlIHJpZ2h0IGFkZHJlc3MuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlnLmgsIGxkZW11bC5jOiByZW5hbWVkICBoODMwMGhkcyB0byBoODMwMGhtcworCisKK1R1ZSBGZWIgIDQgMTU6Mjg6MDEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGxkbGV4Lmw6IFB1dCBwYWNrIC1ub2luaGliaXQtZXhlYyBhbmQgLXNvcnQtY29tbW9uCisJKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBwcmludCB0aGUgcmlnaHQgYWRkcmVzcy4KKworVGh1IEphbiAzMCAxNzo1MTo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBUaGUgcnVsZSBmb3IgdGVzdGluZyBsZCBieSByZS1saW5raW5nIGl0c2VsZgorCXZpYSBhbiBpbnRlcm1lZGlhdGUgLXIgbGluayB3YXMgbW92ZWQgdG8gdGhlIGxkMSBydWxlCisJaW5zdGVhZCBvZiB0aGUgbGQyIHJ1bGUuICBUaGlzIGFsbG93cyBsZDIgYW5kIGxkMyB0byBiZSBpZGVudGljYWwsCisJd2hpY2ggYWxsb3dzIHRoZSBib290c3RyYXAgcnVsZSB0byB3b3JrLgorCSogbGRjdG9yLmMgKGZpbmRfY29uc3RydWN0b3JzKTogIERvbid0IGNyZWF0ZSBhIGNvbnN0cnVjdG9yCisJbGlzdCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHdvdWxkIGhhcHBlbiBpZiBsZCBpcworCWludm9rZWQgYnkgY29sbGVjdCkuCisKK1dlZCBKYW4gMjkgMDg6MzU6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1zcGFyYy5oOiBub3cgdXNlcyBsaWJnY2MuYQorCSogbGRtYWluLmM6IHF1aXQgdXNpbmcgZXhpdAorCSogKnNjOiB1c2UgKihDT01NT04pIHJhdGhlciB0aGFuIFtDT01NT05dCisJKiBsZGxleC5sLCBsZXhzdXAuYzogbXVjaCB0aGlua2luZyBtb3ZlZCBmcm9tIC5sIGFuZCBwdXQgaW50byAuYywKKwl0byBhbGxvdyBwcmVwcm9jZXNzaW5nIG9mIC5sIGZpbGUuCisJKiBNYWtlZmlsZS5pbjogTmV3IGxkbGV4LmwgbWFuZ2xpbmcKKwkqIGxkZXhwLmMgKGZvbGRfYmluYXJ5KTogcGVyZm9ybSBleHByZXNzaW9ucyB3aXRoICUgYW5kIC8gaW4KKwlpbnRlZ2VyLgorCSogbGRmaWxlLmMgKG9wZW5fYSk6IG9wZW4gYXJjaGl2ZXMgb24gVk1TIGluIGEgc3BlY2lhbCB3YXkKKworCitUdWUgSmFuIDI4IDEwOjE4OjE2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBsZGdyYW0ueTogbWFwIC1NIGJlaGF2ZSBpbiB0aGUgc2FtZSB3YXkgYXMgLU1hcCAoc2V0cyBmaWxlIG5hbWUKKwl0byBiZSAiLSIuCisJKiBsZHN5bS5jLCBsZGxhbmcuYzogcmVtZW1iZXIgdGhhdCBzaXplIG9mIGEgc2VjdGlvbiBpcyBkZXBlbmRlbnQgb24KKwl3aGV0aGVyIG9yIG5vdCByZWxheGluZyBoYXMgYmVlbiBkb25lLgorCSogbGRtYWluLmM6IGRvbid0IG9wZW4gYSBtYXAgZmlsZSBpZiBpdCBkb2Vzbid0IGhhdmUgYSBuYW1lCisJKiByZWxheC5jOiBhbGwgdGhlIGJyYWlucyBoYXZlIG1vdmVkIGludG8gYmZkLgorCSogbGR3cml0ZS5jOiBhbW1lbmQgY29tbWVudAorCitGcmkgSmFuIDI0IDE0OjIzOjQ2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkZWQgcmVsYXgsIGFsc28gbWFkZSB0aHJlZSBzdGFnZSBnbyB0aHJvdWdoIGEKKwlwYXJ0aWFsIGxpbmsgc3RhZ2UuCisJKiByZWxheC5jIDogYWRkZWQKKwkqIGNvbmZpZy5oOiBpZiBHTlU5NjAgZGVmaW5lZCwgdGhlbiBkZWZhdWx0IGVtdWxhdGlvbiBtb2RlIGlzCisJR0xEOTYwCisJKiBsZGV4cC5oLCBsZGV4cC5jOiBtYXAgdG8gZmlsZSBob29rcworCSogbGRsYW5nLmM6IG1hcCB0byBmaWxlIGhvb2tzCisJKiBsZGdyYW0ueTogYWRkZWQgLU1hcCAtcmVsYXgKKwkqIGxkbGV4Lmw6IGFkZGVkIC1yZWxheCwgLU1hcAorCSogbGRtYWluLmM6IG9wZW4gbWFwIGZpbGUKKwkqIGxkbWlzYy5jOiBzdXBwb3J0IGZvciBtYXAgZmlsZQorCSogbGR3cml0ZS5jOiBuZXcgcmVsYXggbWFnaWMKKworVGh1IERlYyAxOSAxODo0OTo1MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZy90bS0qLmg6ICBDbGVhbiB1cCBtYWtlIG91dHB1dCwgb25seQorCXBhc3MgREVGQVVMVF9FTVVMQVRJT04gdG8gbGRtYWluLmMuCisKK1dlZCBEZWMgMTggMTU6MDI6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMS45NC4KKworVHVlIERlYyAxMCAwNDowNzoyMyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KKworTW9uIERlYyAgOSAxNjoyNjo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBQYXNzIC15IHRvIGJpc29uLiAgKEFnYWluOworCWFjY2lkZW50YWxseSBkZWxldGVkIGJ5IFJpY2guKQorCSogbmV3cy5zYywgbGRnbGQ2OGsuc2M6ICBEZWZpbmUgX19lbmQgYXMgd2VsbCBhcyBfZW5kLgorCitTYXQgRGVjICA3IDE3OjE5OjI2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBsZGluZHIuaDogYWRkZWQgdG8gY29udGFpbiBwcm90b3R5cGVzIG9mIGxkaW5kci5jCisJKiBsZGZpbGUuYzogaW5jbHVkZSBjdHlwZS5oCisJKiBsZG1haW4uYzogaW5jbHVkZSB0aGUgcmVxdXJpZWQgcHJvdG90eXBlIGhlYWRlcnMKKwkqIGxkd3JpdGUuYzogZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGhhcyBiZWVuIHJlbmFtZWQKKwliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCisKK0ZyaSBEZWMgIDYgMjM6Mjk6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcHVudCAiZnVuZGFtZW50YWwiIG1vZGUgYmVjYXVzZSBpdCBicmVha3MgbXkgZW1hY3MKKwkgIG1hY3Jvcy4gIGluc3RhbGwgdXNpbmcgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuICByZW1vdmUKKwkgIHNwYWNlcyBmb2xsb3dpbmcgaHlwaGVucywgYnNkIG1ha2UgY2FuJ3QgY29wZS4gIGFkZGVkCisJICBzdGFuZGFyZHMudGV4dCBzdXBwb3J0IGFuZCBtYWRlIGl0IGxvb2sgbGlrZSBhbGwgdGhlIG90aGVyCisJICBtYWtlZmlsZXMuCisKKwkqIGNvbmZpZ3VyZS5pbjogY29uZmlndXJlIG5vdyBydW5zIGVudGlyZWx5IGluIG9iamRpciBzbyBtYWtlIGZpbGUKKwkgIGV4aXN0ZW5jZSBjaGVja3MgYWdhaW5zdCAke3NyY2Rpcn0uICBNYXJrIHRoaXMgZGlyZWN0b3J5IGFzCisJICB0YXJnZXQgZGVwZW5kZW50LgorCitUaHUgRGVjICA1IDIyOjQ2OjE2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cworCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgorCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KKworV2VkIERlYyAgNCAyMzozNjo1NSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuYzogIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuOTMuCisJKiBNYWtlZmlsZS5pbjogIFBhc3MgLXkgdG8gYmlzb24uCisKK01vbiBOb3YgMjUgMTg6Mjg6NDAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLmg6IGg4IGlzIG5vdyBjb2ZmLCBub3QgaWVlZQorCSogaDgzMDBoZHMuc2M6IHJlZmxlY3QgdGhlIHNhbWUKKworVGh1IE5vdiAxNCAxOTo1NTowOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbGR2ZXIuYyAobGR2ZXJzaW9uKCkpOiAgVXBkYXRlIHRvIDEuOTIuCisJKiBsZGN0b3IuYzogVGhlcmUgYXJlIHR3byBwbGFjZXMgY29uc3RydWN0b3Igc2V0cworCWNhbiBiZSBkZWZpbmVkLiAgT25lIG9mIHRoZW0gY2hlY2tlZCBmb3IgYW4gZXhpc3RpbmcKKwlkdXBsaWNhdGUsIHRoZSBvdGhlciBkaWRuJ3QuICBVbmZvcnR1bmF0ZWx5LCB0aGUgbGF0dGVyCisJd2FzIGNhbGxlZCBhZnRlciB0aGUgZm9ybWVyIC4uLgorCVNvLCBmYWN0b3Igb3V0IGNvZGUgZm9yIGluc2VydGluZyBhIG5ldyBlbGVtZW50IGludG8KKwljb25zdHJ1Y3Rvcl9uYW1lX2xpc3QgKGFmdGVyIGNoZWNraW5nIGZvciBhIGR1cGxpY2F0ZSkKKwlpbnRvIGEgbmV3IGZ1bmN0aW9uIGFkZF9jb25zdHJ1Y3Rvcl9uYW1lLCBhbmQgY2FsbAorCWl0IGZyb20gYm90aCBhZm9yZW1lbnRpb25lZCBwbGFjZXMgKGxkbGFuZ19hZGRfY29uc3RydWN0b3IKKwlhbmQgbGRsYW5nX2NoZWNrX2Zvcl9jb25zdHJ1Y3RvcnMpLgorCitXZWQgTm92IDEzIDE1OjE3OjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlbmFtZSAuYyBmaWxlcyBnZW5lcmF0ZWQgZnJvbSBsZHRlbXBsYXRlCisJdG8gaGF2ZSBuYW1lcyBzdGFydGluZyB3aXRoIGxkX18uICBUaGlzIGhlbHBzICdtYWtlIGNsZWFuJy4KKworVHVlIE5vdiAxMiAxODozNjo1MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogVGFrZSBvdXQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBpbnN0YWxsCisJKiBtODhrYmNzLnNjOiBwdXQgaW4gY29udHJ1Y3RvciBibG9ja3MuCisKK01vbiBOb3YgMTEgMTg6NDc6MzMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGxkbWlzYy5jLCBsZG1pc2MuaDogIFJlLXdyaXRlIGluZm8oKSB0byB0YWtlIGEgZmlsZW5hbWUKKwlwYXJhbWV0ZXIsIGEgZm9ybWF0LCBhbmQgYW4gYXJnIHBvaW50ZXIsIGFuZCByZW5hbWUgaXQgdG8KKwl2ZmluZm8oKS4gIFdyaXRlIGluZm8oKSBpbiB0ZXJtcyBvZiBuZXcgdmZpbmZvKCkuCisJTmV3IGVpbmZvKCkgaXMgdGhlIHNhbWUgYXMgaW5mbygpLCBleGNlcHQgaXQgd3JpdGVzIHRvIHN0ZGVyci4KKwkqIGxkZW11bC5jLCBsZGV4cC5jLCBsZGxhbmcuYywgbGRsbms5NjAuYywgbGRtYWluLmMsIGxkd3JpdGUuYywKKwlsZG1pc2MuYzogIFJlcGxhY2UgImVycm9yIiBjYWxscyB0byBpbmZvKCkgYnkgbmV3IGVpbmZvKCkuCisKK01vbiBOb3YgMTEgMDk6NTc6MzIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCisJKiBsZGxleC5sIGxkZ3JhbS55OiBtYWRlIC1WIG9wdGlvbiBkbyBzYW1lIGFzIC12CisJKiBNYWtlZmlsZS5pbjogQWRkZWQgJChNSU5VU19HKSBmbGFnIHNvIGRlYnVnZ2luZyBjYW4gYmUKKwl0dXJuZWQgb2ZmCisKK1N1biBOb3YgIDMgMTY6Mzc6MzcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCSBpMzg2IGFvdXQgY2hhbmdlcyBmcm9tIEJvYiBLdWt1cmEKKwkqIE1ha2VmaWxlLmluLCBjb25maWcuaDogYWRkZWQgaTM4NmFvdXQgc3VwcG9ydAorCSogY29uZmlndXJlLmluOiBmaXhlZCAvaC17bXlob3N0fSB0eXBvCisJKiBsZGdyYW0ueTogLU1NIG5vdyBnaXZlcyBtb3JlIGJvcmluZyBtYXAuCisJKiBsZGxhbmcuYzogbm93IGRvZXMgRF9QQUdFRCBmbGFnIHRoZSByaWdodCB3YXkuCisJKiBsZHN5bS5jOiAtTU0gZmxhZ3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisKK1N1biBOb3YgIDMgMTU6MDA6MDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEZpeGVkIHR5cG8uICBBbHNvLCBhIGZpeCBmb3IgaHAzMDBic2QuCisJKiBsZGxhbmcuYyAoaW5pdF9vcyk6ICBDb21wZW5zYXRlIGZvciBCRkQgY2hhbmdlLAorCXdoZXJlIGJmZF9tYWtlX3NlY3Rpb24gbm93IHJldHVybnMgTlVMTCBmb3IgYSBkdXBsaWNhdGUKKwlzZWN0aW9uIHJlcXVlc3QsIGluc3RlYWQgb2YgdGhlIG9sZCBzZWN0aW9uLgorCitUaHUgT2N0IDE3IDE1OjI3OjEzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBsZHZlci5jOiBCdW1wIHRvIHZlcnNpb24gMS45MSAoY29uc2lzdGVudCB3aXRoIGJpbnV0aWxzKS4KKworV2VkIE9jdCAxNiAxMjoyNzowOCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oLCBsZC5oLCBsZGVtdWwuYywgbGRleHAuYywgbGRleHAuaCwKKwlsZGdyYW0ueSwgbGRsZXgubCwgbGRsbms5NjAuYywgbGRtYWluLmMsIGxkbWlzYy5jLCBsZG1pc2MuaCwKKwlsZHN5bS5jLCBsZHN5bS5oLCBsZHRlbXBsYXRlLCBsZHZhbmlsbGEuYywgbGR2ZXIuYywgbGR2ZXIuaCwKKwlsZHdhcm4uYywgbGR3YXJuLmgsIGxkd3JpdGUuYywgbGR3cml0ZS5oLCBta3NjcmlwdC5jOgorCUFkZCBvciB1cGRhdGUgY29weXJpZ2h0IG5vdGljZXMuCisKK01vbiBPY3QgMTQgMjM6NTU6MjcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbjogIENoYW5nZWQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBuYW1lIHNjaGVtZQorCXRvIGJlIGNvbnNpc3RlbnQgd2l0aCBnY2MuICBBbHNvIGNoYW5nZWQgJ2luc3RhbGwnLgorCitNb24gT2N0IDE0IDE3OjMwOjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBuZXcgdGFyZ2V0cyBsZC5tbSwgbGQubWUKKworTW9uIE9jdCAxNCAxNzoyNzoyNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGxkdGVtcGxhdGU6ICBOZWVkIHRvIHVzZSBzZXBhcmF0ZSBzY3JpcHRzCisJZm9yIC1uIGFuZCAtTiBvcHRpb25zLiAgWWV0IG1vcmUgY29tcGxpY2F0aW9uLgorCitGcmkgT2N0IDExIDIyOjQwOjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEF2b2lkIHVzaW5nICQ8IGluIGV4cGxpY2l0IE1ha2UgcnVsZXMgKGl0IGRvZXNuJ3QKKwl3b3JrKS4gIEFkZCBzb21lIGxpbmVzIHRvIGF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Z3MuCisKK0ZyaSBPY3QgMTEgMTY6NDI6MjIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIG5ld3Muc2M6IEFkZCBhbGlnbm1lbnQgZm9yIGRhdGEgc2VnbWVudC4KKwkqIGxkdGVtcGxhdGU6IEFkZCAoeWV0IGFub3RoZXIpIHNjcmlwdCB0byBnZXQgZm9yIC1uIG9yIC1OCisJb3B0aW9ucy4gIChUaGVzZSBuZWVkIGRpZmZlcmVudCBhbGlnbm1lbnQgdGhhbiBaTUFHSUMgZmlsZXMuKQorCSogTWFrZWZpbGUuaW46ICBBZGQgc3R1ZmYgZm9yIG5ldyBmb28ueG4gc2NyaXB0cy4KKwlUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IHJlcGxhY2luZyAiQUxJR04oMHguLi4wMCkiIGJ5ICIuIi4KKworRnJpIE9jdCAxMSAxNTo0MzowNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgbGQubXMsIGxkLWluZGV4Lm1zCisJbGQudGV4aW5mbzogcmVtb3ZlIHRhYnMsIG90aGVyIGNsZWFudXBzIGZvciB0ZXhpMnJvZmYKKworRnJpIE9jdCAxMSAxMzo1MTo1NCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbGRtYWluLmMgKG1haW4pOiBNYWtlIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgYmUgdHJ1ZQorCWJ5IGRlZmF1bHQuICBEb24ndCB0aGUgV1BfVEVYVCBhbmQgRF9QQUdFRCBmbGFncyBvZgorCW91dHB1dF9iZmQgaGVyZTsgaXQncyB0b28gbGF0ZSwgc28gc2V0IGl0IHdoZW4gb3V0cHV0X2JmZAorCWlzIGNyZWF0ZWQgKGluIGxkbGFuZy5jKS4gIEFsc28gZml4IHNldHRpbmcgb2YgRVhFQ19QIGZsYWcKKwkqIGxkbGFuZy5jIChsZGxhbmdfb3Blbl9vdXRwdXQpOiAgU2V0IG91dHB1dF9iZmQtPmZsYWdzIGhlcmUuCisJKiBsZGxhbmcuYzogUmVtb3ZlIHNvbWUgZHVwbGljYXRlIGV4dGVybiBkZWNsYXJhdGlvbnMuCisJKiBsZGdyYW0ueTogRml4ZXMgdG8gLU4gYW5kIC1uIG9wdGlvbnMuCisJKiBNYWtlZmlsZS5pbjogIFJlY29nbml6ZSB1cHBlciBjYXNlIGxldHRlcnMgaW4gc2VkIHNjcmlwdAorCXRvIHJlbW92ZSBhc3NpZ25tZW50cyBmcm9tIHNjcmlwdCBmaWxlcy4KKwkqIGxkdGVtcGxhdGU6ICBEb24ndCBhc3N1a21lIHRoYXQgLU4gb3IgLW4gb3B0aW9ucworCWltcGx5IHVzZSBvZiAtciBzY3JpcHQuCisJKiBta3NjcmlwdC5jOiAgVHdlYWtpbmcgdG8gY29ycmVjdGx5IGhhbmRsZSBcbiBhbmQgXFwgaW4gaW5wdXQuCisKK0ZyaSBPY3QgMTEgMTA6Mjk6MjcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQorCisJKiBsZHRlbXBsYXRlOiBpbmNsdWRlIGJmZC5oIGJlZm9yZSBzeXNkZXAuaC4KKworRnJpIE9jdCAxMSAwNDoyNDo0NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KKworCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KKwkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIC4uL2JmZC9ob3N0cy9oLXh4eC5oLgorCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgorCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCisJZ2V0IGRlZmluZWQgZmlyc3QuCisJKiBjb25maWcvOiAgUmVuYW1lIHNvbWUgY29uZmlnIGZpbGVzIHRvIG1hdGNoIHVwIGgtKi5oIG5hbWVzLgorCVJlbW92ZSBhbGwgdGhlIEhPU1RfU1lTIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZyBmaWxlcy4KKworVHVlIE9jdCAgOCAxNjowMDo1NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbGRleHAuaCwgbGRsYW5nLmg6IENoYW5nZSBlbnVtIGJvb2xlYW4gLT4gZW51bSBiZmRfYm9vbGVhbi4KKwkqIGxkdGVtcGxhdGU6IFJlbW92ZSBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCBjYWxsczsKKwlqdXN0IHVzZSB0aGUgU0VBUkNIX0RJUiBjb21tYW5kcyBpbiB0aGUgc2NyaXB0IGZpbGVzLgorCSogTWFrZWZpbGUuaW46IEFkZCBMSUJfUEFUSCBtYWNybywgd2hpY2ggaWYgc2V0IGlzIHVzZWQgdG8gcmVwbGFjZQorCXRoZSBTRUFSQ0hfRElSIGNvbW1hbmRzIGluIHRoZSBzY3JpcHRzICh1c2luZyB1Z2x5IHNlZCBtYWdpYykuCisJVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgZm9yIGNyb3NzLWxpbmtpbmcsIHdoZXJlIHlvdSB3b3VsZAorCXBsYWNlIGxpYmFyaWVzIGluIGEgZGlmZmVyZW50IHBsYWNlIHRoYW4gbmF0aXZlIGxpYnJhcmllcy4KKwlBbHNvLCBlbXVsYXRpb25zIG1hZGUgZnJvbSBsZHRlbXBsYXRlIG5vdyB1c2UgJChzcmNkaXIpLgorCSogbGRnbGRhMjlrLnNjOiAgQ2hhbmdlIFNFQVJDSF9ESVIgY29tbWFuZHMgdG8gYSBjb252ZW50aW9uYWwKKwlmb3JtOyBwZW9wbGUgY2FuIHVzZSB0aGUgTWFrZWZpbGUncyBMSUJfUEFUSCB0byBvdmVycmlkZS4KKworVHVlIE9jdCAgOCAxNDo1MToyMSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZml4IHRhcmdldCBsZC5kdmksIGFkZCB0YXJnZXQgbGQuaW5mbworCWxkLnRleGluZm86IG1ha2UgaW5mbyBmaWxlbmFtZSBsZC5pbmZvCisKK0ZyaSBPY3QgIDQgMjE6NTE6NTggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQXZvaWQgdXNpbmcgJDwgaW4gbm9uLXN1ZmZpeCBydWxlcyAoYnJlYWtzIG9uIFN1bgorCU1ha2UpLgorCSogbGRmaWxlLmMsIGxkbGFuZy5jLCBsZG1haW4uYywgbGR3cml0ZS5jOiAgQ29wZSB3aXRoIHJlbmFtZXMgb2YgYQorCWZldyBCRkQgdHlwZXMgJiBlbnVtcy4KKworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvbGQvTWFrZWZpbGUuYW0gYi9sZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjAyMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NjMgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KKworIyMgRklYTUU6IHdvcmsgYXJvdW5kIGFwcGFyZW50IGF1dG9tYWtlIGJ1Zy4KK0lOVExMSUJTID0gQElOVExMSUJTQAorCitBVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIGRlamFnbnUKKworU1VCRElSUyA9IHBvCisKK3Rvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKKworWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwkKHNyY2RpcikvLi4vYmlzb24vIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCitZRkxBR1MgPSAtZAorTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgZWxzZSBlY2hvIGZsZXggOyBmaWAKKworIyBXZSBwdXQgdGhlIHNjcmlwdHMgaW4gdGhlIGRpcmVjdG9yeSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzLgorIyBXZSBjYW4ndCBwdXQgdGhlIHNjcmlwdHMgaW4gJChkYXRhZGlyKSBiZWNhdXNlIHRoZSBTRUFSQ0hfRElSCisjIGRpcmVjdGl2ZXMgbmVlZCB0byBiZSBkaWZmZXJlbnQgZm9yIG5hdGl2ZSBhbmQgY3Jvc3MgbGlua2Vycy4KK3NjcmlwdGRpciA9ICQodG9vbGRpcikvbGliCisKK0VNVUwgPSBARU1VTEAKK0VNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0AKK0VNVUxfRVhUUkFfT0ZJTEVTID0gQEVNVUxfRVhUUkFfT0ZJTEVTQAorCisjIFNlYXJjaCBwYXRoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGZvciAtbGZvbyBsaWJyYXJpZXMuCisjIElmIExJQl9QQVRIIGlzIGVtcHR5LCB0aGUgb25lcyBpbiB0aGUgc2NyaXB0IChpZiBhbnkpIGFyZSBsZWZ0IGFsb25lLgorIyAoVGhlIGRlZmF1bHQgaXMgdXN1YWxseSAvbGliOi91c3IvbGliOi91c3IvbG9jYWwvbGliLCB1bmxlc3MgYnVpbGRpbmcKKyMgYSBjcm9zcy1saW5rZXIsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgaXMgZW1wdHkuICBTZWUgZ2Vuc2NyaXB0cy5zaC4pCisjIE90aGVyd2lzZSwgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb25lcyBnaXZlbiBpbiBMSUJfUEFUSCwKKyMgd2hpY2ggbWF5IGhhdmUgdGhlIGZvcm06IExJQl9QQVRIPS9saWI6L3Vzci9sb2NhbC9saWIKK0xJQl9QQVRIID0KKworQkFTRURJUiA9ICQoc3JjZGlyKS8uLgorQkZERElSID0gJChCQVNFRElSKS9iZmQKK0lOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQorREVQID0gbWtkZXAKKworIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB0byBidWlsZAorRE9DVkVSID0gZ2VuCisKKyNzdHVmZiBmb3Igc2VsZiBob3N0aW5nIChjYW4gYmUgb3ZlcnJpZGRlbiBpbiBjb25maWcgZmlsZSkuCitIT1NUSU5HX0NSVDAgPSBASE9TVElOR19DUlQwQAorSE9TVElOR19MSUJTID0gQEhPU1RJTkdfTElCU0AKK0hPU1RJTkdfRU1VID0gLW0gJChFTVVMKQorCisjIFNldHVwIHRoZSB0ZXN0aW5nIGZyYW1ld29yaywgaWYgeW91IGhhdmUgb25lCitFWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgXAorCXRoZW4gZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKKwllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCisKK1JVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNyb290fS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IFwKKwl0aGVuIGVjaG8gJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IDsgXAorCWVsc2UgZWNobyBydW50ZXN0IDsgZmlgCisKK1JVTlRFU1RGTEFHUyA9CisKK0NDX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAorICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCisgICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAorICAgIGVsc2UgXAorICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAorICAgIGZpOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDQyk7IFwKKyAgICBlbHNlIFwKKyAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCisgICAgZmk7IFwKKyAgZmlgCisKK0NYWCA9IGdjYworQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAorICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCisgICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAorICAgIGVsc2UgXAorICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAorICAgIGZpOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDWFgpOyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAorICAgIGZpOyBcCisgIGZpYAorCitub2luc3RfUFJPR1JBTVMgPSBsZC1uZXcKK2luZm9fVEVYSU5GT1MgPSBsZC50ZXhpbmZvCitub2luc3RfVEVYSU5GT1MgPSBsZGludC50ZXhpbmZvCittYW5fTUFOUyA9IGxkLjEKKworSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoQkZERElSKSAtSSQoSU5DRElSKSAtSSQodG9wX3NyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgJChIREVGSU5FUykgJChDRkxBR1MpIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKKworQkZETElCID0gLi4vYmZkL2xpYmJmZC5sYQorTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCisKK0FMTF9FTVVMQVRJT05TID0gXAorCWVhMjlrLm8gXAorCWVhaXhwcGMubyBcCisJZWFpeHJzNi5vIFwKKwllYWxwaGEubyBcCisJZWFyY2VsZi5vIFwKKwllYXJtZWxmLm8gXAorCWVhcm1lbGZfb2FiaS5vIFwKKwllYXJtbGludXgubyBcCisJZWFybTI2bGludXgubyBcCisJZWFybWFvdXRiLm8gXAorCWVhcm1hb3V0bC5vIFwKKwllYXJtY29mZi5vIFwKKwllYXJtcGUubyBcCisJZWNvZmZfc3BhcmMubyBcCisJZWQxMHZlbGYubyBcCisJZWQzMHZlbGYubyBcCisJZWQzMHZfZS5vIFwKKwllZDMwdl9vLm8gXAorCWVkZWx0YTY4Lm8gXAorCWVlYm1vbjI5ay5vIFwKKwllZWxmMzJfc3BhcmMubyBcCisJZWVsZjMyYjQzMDAubyBcCisJZWVsZjMyYm1pcC5vIFwKKwllZWxmMzJlYm1pcC5vIFwKKwllZWxmMzJlbG1pcC5vIFwKKwllZWxmMzJsNDMwMC5vIFwKKwllZWxmMzJsbWlwLm8gXAorCWVlbGYzMmxwcGMubyBcCisJZWVsZjMycHBjLm8gXAorCWVlbGZfaTM4Ni5vIFwKKwllZWxmX2kzODZfYmUubyBcCisJZWdsZDk2MC5vIFwKKwllZ2xkOTYwY29mZi5vIFwKKwllZWxmMzJmcjMwLm8gXAorCWVlbGYzMm1jb3JlLm8gXAorCWVnbzMyLm8gXAorCWVoODMwMC5vIFwKKwllaDgzMDBoLm8gXAorCWVoODMwMHMubyBcCisJZWg4NTAwLm8gXAorCWVoODUwMGIubyBcCisJZWg4NTAwYy5vIFwKKwllaDg1MDBtLm8gXAorCWVoODUwMHMubyBcCisJZWhwMzAwYnNkLm8gXAorCWVocDNocHV4Lm8gXAorCWVocHBhZWxmLm8gXAorCWVpMzg2YW91dC5vIFwKKwllaTM4NmJlb3MubyBcCisJZWkzODZic2QubyBcCisJZWkzODZjb2ZmLm8gXAorCWVpMzg2Z28zMi5vIFwKKwllaTM4NmxpbnV4Lm8gXAorCWVpMzg2bHlueC5vIFwKKwllaTM4Nm1hY2gubyBcCisJZWkzODZtb3NzLm8gXAorCWVpMzg2bXNkb3MubyBcCisJZWkzODZuYnNkLm8gXAorCWVpMzg2bncubyBcCisJZWkzODZwZS5vIFwKKwllbG5rOTYwLm8gXAorCWVtNjhrNGtuYnNkLm8gXAorCWVtNjhrYW91dC5vIFwKKwllbTY4a2F1eC5vIFwKKwllbTY4a2NvZmYubyBcCisJZW02OGtlbGYubyBcCisJZW02OGtsaW51eC5vIFwKKwllbTY4a2x5bngubyBcCisJZW02OGtuYnNkLm8gXAorCWVtNjhrcHNvcy5vIFwKKwllbTg4a2Jjcy5vIFwKKwllbWNvcmVwZS5vIFwKKwllbWlwc2JpZy5vIFwKKwllbWlwc2JzZC5vIFwKKwllbWlwc2lkdC5vIFwKKwllbWlwc2lkdGwubyBcCisJZW1pcHNsaXQubyBcCisJZW1pcHNsbmV3cy5vIFwKKwllbmV3cy5vIFwKKwllbnMzMmtuYnNkLm8gXAorCWVwYzUzMm1hY2hhLm8gXAorCWVwcGNtYWNvcy5vIFwKKwllcHBjbncubyBcCisJZXBwY3BlLm8gXAorCWVyaXNjaXgubyBcCisJZXNhMjkyMDAubyBcCisJZXNoLm8gXAorCWVzaGVsZi5vIFwKKwllc2hsZWxmLm8gXAorCWVzaGwubyBcCisJZXNwYXJjYW91dC5vIFwKKwllc3BhcmNsaW51eC5vIFwKKwllc3BhcmNseW54Lm8gXAorCWVzcGFyY25ic2QubyBcCisJZXN0MjAwMC5vIFwKKwllc3VuMy5vIFwKKwllc3VuNC5vIFwKKwlldGljMzBhb3V0Lm8gXAorCWV0aWMzMGNvZmYubyBcCisJZXRpYzgwY29mZi5vIFwKKwlldmFuaWxsYS5vIFwKKwlldmF4Lm8gXAorCWV2c3RhLm8gXAorCWV3NjUubyBcCisJZXo4MDAxLm8gXAorCWV6ODAwMi5vCisKK0FMTF82NF9FTVVMQVRJT05TID0gXAorCWVlbGY2NF9zcGFyYy5vIFwKKwllZWxmNjRhbHBoYS5vCisKK0FMTF9FTVVMX0VYVFJBX09GSUxFUyA9IFwKKwlwZS1kbGwubyBcCisJZGVmZmlsZXAubworCitDRklMRVMgPSBsZGN0b3IuYyBsZGVtdWwuYyBsZGV4cC5jIGxkZmlsZS5jIGxkbGFuZy5jIFwKKwlsZG1haW4uYyBsZG1pc2MuYyBsZHZlci5jIGxkd3JpdGUuYyBsZXhzdXAuYyBcCisJbXJpLmMgbGRjcmVmLmMgcGUtZGxsLmMKKworSEZJTEVTID0gbGQuaCBsZGN0b3IuaCBsZGVtdWwuaCBsZGV4cC5oIGxkZmlsZS5oIFwKKwlsZGxhbmcuaCBsZGxleC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkdmVyLmggXAorCWxkd3JpdGUuaCBtcmkuaCBkZWZmaWxlLmgKKworR0VORVJBVEVEX0NGSUxFUyA9IGxkZ3JhbS5jIGxkbGV4LmMgZGVmZmlsZXAuYworR0VORVJBVEVEX0hGSUxFUyA9IGxkZ3JhbS5oIGxkZW11bC1saXN0LmggZGVmZmlsZXAuaAorCitPRklMRVMgPSBsZGdyYW0ubyBsZGxleC5vIGxleHN1cC5vIGxkbGFuZy5vIG1yaS5vIGxkY3Rvci5vIGxkbWFpbi5vIFwKKwlsZHdyaXRlLm8gbGRleHAubyAgbGRlbXVsLm8gbGR2ZXIubyBsZG1pc2MubyBcCisJbGRmaWxlLm8gbGRjcmVmLm8gJHtFTVVMQVRJT05fT0ZJTEVTfSAke0VNVUxfRVhUUkFfT0ZJTEVTfQorCitTVEFHRVNUVUZGID0gKi5vIGxkc2NyaXB0cy8qIGUqLmMKKworIyBBdCB0aGUgbW9tZW50IHRoaXMgaXMganVzdCBhIGxpc3Qgb2YgdGhvc2UgZW11bGF0aW9uIHRlbXBsYXRlIGZpbGVzCisjIHRoYXQgY29udGFpbiBpbnRlcm5hdGlvbmFsaXNlZCBzdHJpbmdzLgorRU1VTEFUSU9OX0ZJTEVTID0gZW11bHRlbXBsL3BlLmVtIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtCisKK1BPVEZJTEVTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKEVNVUxBVElPTl9GSUxFUykKKworcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKKwlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKKwkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KKworbGRtYWluLm86IGxkbWFpbi5jIGNvbmZpZy5zdGF0dXMKKwkkKENPTVBJTEUpIC1jIC1EREVGQVVMVF9FTVVMQVRJT049JyIkKEVNVUwpIicgLURTQ1JJUFRESVI9JyIkKHNjcmlwdGRpcikiJyAtRFRBUkdFVD0nIkB0YXJnZXRAIicgJChzcmNkaXIpL2xkbWFpbi5jCisKK2xkZW11bC1saXN0Lmg6IE1ha2VmaWxlCisJKGVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gIERPIE5PVCBFRElUISAqLyI7XAorCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKKwkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAorCSAgICBlY2hvICJleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF8kJHtmfV9lbXVsYXRpb247IjsgXAorCWRvbmU7XAorCWVjaG8gIiI7XAorCWVjaG8gIiNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXFwiO1wKKwlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCisJIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKKwkgICAgZWNobyAiICAmbGRfJCR7Zn1fZW11bGF0aW9uLCBcXCI7IFwKKwlkb25lO1wKKwllY2hvICIgIDAiKSA+bGRlbXVsLXRtcC5oCisJbXYgbGRlbXVsLXRtcC5oIGxkZW11bC1saXN0LmgKKworIyBUaGVzZSBhbGwgc3RhcnQgd2l0aCBlIHNvICdtYWtlIGNsZWFuJyBjYW4gZmluZCB0aGVtLgorCitHRU5TQ1JJUFRTID0gJChTSEVMTCkgJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggJHtzcmNkaXJ9ICR7bGliZGlyfSBAaG9zdEAgQHRhcmdldEAgQHRhcmdldF9hbGlhc0AgJHtFTVVMfSAiQE5BVElWRV9MSUJfRElSU0AiCitHRU5fREVQRU5EUyA9ICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICQoc3JjZGlyKS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZAorQFRESVJTQAorCitlYTI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hMjlrLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hMjlrLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhMjlrICIkKHRkaXJfYTI5aykiCitlYWl4cHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHBwYy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFpeHBwYyAiJCh0ZGlyX2FpeHBwYykiCitlYWl4cnM2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHJzNi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFpeHJzNiAiJCh0ZGlyX2FpeHJzNikiCitlYWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWxwaGEuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FscGhhLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhbHBoYSAiJCh0ZGlyX2FscGhhKSIKK2VhcmNlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJjZWxmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFyY2VsZiAiJCh0ZGlyX2FyY2VsZikiCitlYXJtZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFybWVsZiAiJCh0ZGlyX2FybWVsZikiCitlYXJtZWxmX29hYmkuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFybWVsZl9vYWJpICIkKHRkaXJfYXJtZWxmKSIKK2Vhcm1lbGZfbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4ICIkKHRkaXJfYXJtZWxmX2xpbnV4KSIKK2Vhcm1lbGZfbGludXgyNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eDI2ICIkKHRkaXJfYXJtZWxmX2xpbnV4MjYpIgorZWFybWFvdXRiLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRiLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhcm1hb3V0YiAiJCh0ZGlyX2FybWFvdXRiKSIKK2Vhcm1hb3V0bC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0bC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJtYW91dGwgIiQodGRpcl9hcm1hb3V0bCkiCitlYXJtY29mZi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhcm1jb2ZmICIkKHRkaXJfYXJtY29mZikiCitlYXJtcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtcGUuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJtcGUgIiQodGRpcl9hcm1wZSkiCitlY29mZl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGNvZmZfc3BhcmMgIiQodGRpcl9jb2ZmX3NwYXJjKSIKK2VkMTB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QxMHZlbGYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGQxMHZlbGYgIiQodGRpcl9kMTB2KSIKK2VkMzB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZlbGYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGQzMHZlbGYgIiQodGRpcl9kMzB2KSIKK2VkMzB2X28uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9vLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBkMzB2X28gIiQodGRpcl9kMzB2KSIKK2VkMzB2X2UuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9lLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBkMzB2X2UgIiQodGRpcl9kMzB2KSIKK2VkZWx0YTY4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2RlbHRhNjguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGRlbHRhNjggIiQodGRpcl9kZWx0YTY4KSIKK2VlYm1vbjI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVibW9uMjlrICIkKHRkaXJfZWJtb24yOWspIgorZWVsZjMyZnIzMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjMyZnIzMCAiJCh0ZGlyX2ZyMzApIgorZWVsZjMybWNvcmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJtY29yZSAiJCh0ZGlyX21jb3JlKSIKK2VtMzJyZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL20zMnJlbGYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTMycmVsZiAiJCh0ZGlyX20zMnIpIgorZWVsZjMyX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMl9zcGFyYyAiJCh0ZGlyX2VsZjMyX3NwYXJjKSIKK2VlbGYzMmI0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjMyYjQzMDAgIiQodGRpcl9lbGYzMmI0MzAwKSIKK2VlbGYzMmJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXAgIiQodGRpcl9lbGYzMmJtaXApIgorZWVsZjMyYnNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJic21pcCAiJCh0ZGlyX2VsZjMyYnNtaXApIgorZWVsZjMyZWJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJlYm1pcCAiJCh0ZGlyX2VsZjMyZWJtaXApIgorZWVsZjMyZWxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJlbG1pcCAiJCh0ZGlyX2VsZjMyZWxtaXApIgorZWVsZjMybDQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJsNDMwMCAiJCh0ZGlyX2VsZjMybDQzMDApIgorZWVsZjMybG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjMybG1pcCAiJCh0ZGlyX2VsZjMybG1pcCkiCitlZWxmMzJscHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHBwYy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJscHBjICIkKHRkaXJfZWxmMzJscHBjKSIKK2VlbGYzMmxzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjMybHNtaXAgIiQodGRpcl9lbGYzMmxzbWlwKSIKK2VlbGYzMnBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJwcGMgIiQodGRpcl9lbGYzMnBwYykiCitlZWxmNjRhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGY2NGFscGhhICIkKHRkaXJfZWxmNjRhbHBoYSkiCitlZWxmNjRfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjY0X3NwYXJjICIkKHRkaXJfZWxmNjRfc3BhcmMpIgorZWVsZl9pMzg2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGZfaTM4NiAiJCh0ZGlyX2VsZl9pMzg2KSIKK2VlbGZfaTM4Nl9iZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmX2kzODZfYmUgIiQodGRpcl9lbGZfaTM4Nl9iZSkiCitlZ2xkOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBnbGQ5NjAgIiQodGRpcl9nbGQ5NjApIgorZWdsZDk2MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZ2xkOTYwY29mZiAiJCh0ZGlyX2dsZDk2MGNvZmYpIgorZWdvMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ28zMi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZ28zMiAiJCh0ZGlyX2dvMzIpIgorZWg4MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaDgzMDAgIiQodGRpcl9oODMwMCkiCitlaDgzMDBoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwaC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBoLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBoODMwMGggIiQodGRpcl9oODMwMGgpIgorZWg4MzAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMHMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaDgzMDBzICIkKHRkaXJfaDgzMDBzKSIKK2VoODUwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGg4NTAwICIkKHRkaXJfaDg1MDApIgorZWg4NTAwYi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGIuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaDg1MDBiICIkKHRkaXJfaDg1MDBiKSIKK2VoODUwMGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBjLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGg4NTAwYyAiJCh0ZGlyX2g4NTAwYykiCitlaDg1MDBtLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwbS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBtLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBoODUwMG0gIiQodGRpcl9oODUwMG0pIgorZWg4NTAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMHMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaDg1MDBzICIkKHRkaXJfaDg1MDBzKSIKK2VocDMwMGJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaHAzMDBic2QgIiQodGRpcl9ocDMwMGJzZCkiCitlaHAzaHB1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDNocHV4LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBocDNocHV4ICIkKHRkaXJfaHAzaHB1eCkiCitlaHBwYWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocHBhZWxmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9ocHBhZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBocHBhZWxmICIkKHRkaXJfaHBwYWVsZikiCitlaTM4NmFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZhb3V0ICIkKHRkaXJfaTM4NmFvdXQpIgorZWkzODZiZW9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZiZW9zLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9iZW9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4NmJlb3MgIiQodGRpcl9pMzg2YmVvcykiCitlaTM4NmJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2YnNkICIkKHRkaXJfaTM4NmJzZCkiCitlaTM4NmNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2Y29mZiAiJCh0ZGlyX2kzODZjb2ZmKSIKK2VpMzg2Z28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Z28zMi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZnbzMyICIkKHRkaXJfaTM4NmdvMzIpIgorZWkzODZsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bGludXguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2bGludXggIiQodGRpcl9pMzg2bGludXgpIgorZWkzODZseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZseW54LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4Nmx5bnggIiQodGRpcl9pMzg2bHlueCkiCitlaTM4Nm1hY2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZtYWNoICIkKHRkaXJfaTM4Nm1hY2gpIgorZWkzODZtb3NzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtb3NzLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZtb3NzICIkKHRkaXJfaTM4Nm1vc3MpIgorZWkzODZtc2Rvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4Nm1zZG9zICIkKHRkaXJfaTM4Nm1zZG9zKSIKK2VpMzg2bmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4Nm5ic2QgIiQodGRpcl9pMzg2bmJzZCkiCitlaTM4Nm53LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZudy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2bncgIiQodGRpcl9pMzg2bncpIgorZWkzODZwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGUuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4NnBlICIkKHRkaXJfaTM4NnBlKSIKK2Vsbms5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbG5rOTYwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9sbms5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGxuazk2MCAiJCh0ZGlyX2xuazk2MCkiCitlbTY4azRrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrNGtuYnNkICIkKHRkaXJfbTY4azRrbmJzZCkiCitlbTY4a2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG02OGthb3V0ICIkKHRkaXJfbTY4a2FvdXQpIgorZW02OGthdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTY4a2F1eCAiJCh0ZGlyX202OGthdXgpIgorZW02OGtjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtjb2ZmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTY4a2NvZmYgIiQodGRpcl9tNjhrY29mZikiCitlbTY4a2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrZWxmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrZWxmICIkKHRkaXJfbTY4a2VsZikiCitlbTY4a2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtsaW51eC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG02OGtsaW51eCAiJCh0ZGlyX202OGtsaW51eCkiCitlbTY4a2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtseW54LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrbHlueCAiJCh0ZGlyX202OGtseW54KSIKK2VtNjhrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTY4a25ic2QgIiQodGRpcl9tNjhrbmJzZCkiCitlbTY4a3Bzb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wc29zLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrcHNvcyAiJCh0ZGlyX202OGtwc29zKSIKK2VtODhrYmNzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL204OGtiY3Muc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG04OGtiY3MgIiQodGRpcl9tODhrYmNzKSIKK2VtY29yZXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21jb3JlcGUuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWNvcmVwZSAiJCh0ZGlyX21jb3JlcGUpIgorZW1pcHNiaWcuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNiaWcuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG1pcHNiaWcKK2VtaXBzYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNic2Quc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG1pcHNic2QKK2VtaXBzaWR0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHQuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWlwc2lkdCAiJCh0ZGlyX21pcHNpZHQpIgorZW1pcHNpZHRsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHRsLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG1pcHNpZHRsICIkKHRkaXJfbWlwc2lkdGwpIgorZW1pcHNsaXQuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsaXQuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG1pcHNsaXQgIiQodGRpcl9taXBzbGl0KSIKK2VtaXBzbG5ld3MuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWlwc2xuZXdzCitlbW4xMDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMzAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtbjEwMzAwICIkKHRkaXJfbW4xMDMwMCkiCitlbW4xMDIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMjAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtbjEwMjAwICIkKHRkaXJfbW4xMDIwMCkiCitlbmV3cy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9uZXdzLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBuZXdzICIkKHRkaXJfbmV3cykiCitlbnMzMmtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbnMzMmtuYnNkICIkKHRkaXJfbnMzMmtuYnNkKSIKK2VwYzUzMm1hY2hhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHBjNTMybWFjaGEgIiQodGRpcl9wYzUzMm1hY2hhKSIKK2VwcGNtYWNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHBwY21hY29zICIkKHRkaXJfcHBjbWFjb3MpIgorZXBwY253LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY253LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHBwY253ICIkKHRkaXJfcHBjbncpIgorZXBwY3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY3BlLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHBjcGUuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHBwY3BlICIkKHRkaXJfcHBjcGUpIgorZXJpc2NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9yaXNjaXguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHJpc2NpeCAiJCh0ZGlyX3Jpc2NpeCkiCitlc2EyOTIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zYTI5MjAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzYTI5MjAwICIkKHRkaXJfc2EyOTIwMCkiCitlc2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2guc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzaCAiJCh0ZGlyX3NoKSIKK2VzaGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGVsZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc2hlbGYgIiQodGRpcl9zaGVsZikiCitlc2hsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobGVsZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc2hsZWxmICIkKHRkaXJfc2hsZWxmKSIKK2VzaGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc2hsICIkKHRkaXJfc2hsKSIKK2VzcGFyY2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzcGFyY2FvdXQgIiQodGRpcl9zcGFyY2FvdXQpIgorZXNwYXJjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHNwYXJjbGludXggIiQodGRpcl9zcGFyY2xpbnV4KSIKK2VzcGFyY2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHNwYXJjbHlueCAiJCh0ZGlyX3NwYXJjbHlueCkiCitlc3BhcmNuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc3BhcmNuYnNkICIkKHRkaXJfc3BhcmNuYnNkKSIKK2VzdDIwMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3QyMDAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHN0MjAwMCAiJCh0ZGlyX3N0MjAwMCkiCitlc3VuMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW4zLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc3VuMyAiJCh0ZGlyX3N1bjMpIgorZXN1bjQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuNC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHN1bjQgIiQodGRpcl9zdW40KSIKK2V0aWMzMGFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHRpYzMwYW91dCAiJCh0ZGlyX3RpYzMwYW91dCkiCitldGljMzBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSB0aWMzMGNvZmYgIiQodGRpcl90aWMzMGNvZmYpIgorZXRpYzgwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gdGljODBjb2ZmICIkKHRkaXJfdGljODBjb2ZmKSIKK2V2YW5pbGxhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL3ZhbmlsbGEuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHZhbmlsbGEgIiQodGRpcl92YW5pbGxhKSIKK2V2YXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmF4LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSB2YXggIiQodGRpcl92YXgpIgorZXZzdGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdnN0YS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gdnN0YSAiJCh0ZGlyX3ZzdGEpIgorZXY4NTAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdjg1MC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Y4NTAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHY4NTAgIiQodGRpcl92ODUwKSIKK2V3NjUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdzY1LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC93NjUuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHc2NSAiJCh0ZGlyX3c2NSkiCitlejgwMDEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDEuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSB6ODAwMSAiJCh0ZGlyX3o4MDAxKSIKK2V6ODAwMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHo4MDAyICIkKHRkaXJfejgwMDIpIgorCitsZF9uZXdfU09VUkNFUyA9IGxkZ3JhbS55IGxkbGV4LmwgbGV4c3VwLmMgbGRsYW5nLmMgbXJpLmMgbGRjdG9yLmMgbGRtYWluLmMgXAorCWxkd3JpdGUuYyBsZGV4cC5jIGxkZW11bC5jIGxkdmVyLmMgbGRtaXNjLmMgbGRmaWxlLmMgbGRjcmVmLmMKK2xkX25ld19ERVBFTkRFTkNJRVMgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMREVQUykKK2xkX25ld19MREFERCA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQorCisjIFRoZSBnZW5lcmF0ZWQgZW11bGF0aW9uIGZpbGVzIG1vc3RseSBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4KKyQoRU1VTEFUSU9OX09GSUxFUyk6IC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgbGQuaCBsZG1haW4uaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKKyAgbGRjdG9yLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaAorCisjIFRoaXMgaXMgdGhlIHJlYWwgbGliYmZkLmEgY3JlYXRlZCBieSBsaWJ0b29sLgorVEVTVEJGRExJQiA9IEBURVNUQkZETElCQAorCitjaGVjay1ERUpBR05VOiBzaXRlLmV4cAorCXNyY3Jvb3Q9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3Jjcm9vdDsgXAorCXI9YHB3ZGA7IGV4cG9ydCByOyBcCisJRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAorCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCisJICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCisJICBleHBvcnQgVENMX0xJQlJBUlk7IFwKKwlmaTsgXAorCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAorCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3Jjcm9vdH0vdGVzdHN1aXRlIFwKKwkJQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiIENGTEFHUz0iJChDRkxBR1MpIiBcCisJCUNYWD0iJChDWFhfRk9SX1RBUkdFVCkiIENYWEZMQUdTPSIkKENYWEZMQUdTKSIgXAorCQlDQ19GT1JfSE9TVD0iJChDQykiIENGTEFHU19GT1JfSE9TVD0iJChDRkxBR1MpIiBcCisJCU9GSUxFUz0iJChPRklMRVMpIiBCRkRMSUI9IiQoVEVTVEJGRExJQikiIFwKKwkJTElCSUJFUlRZPSIkKExJQklCRVJUWSkgJChJTlRMTElCUykiIFwKKwkJJChSVU5URVNURkxBR1MpOyBcCisJZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKKwlmaQorCisjIFJ1bGVzIGZvciB0ZXN0aW5nIGJ5IHJlbGlua2luZyBsZCBpdHNlbGYuCisjIEEgc2ltaWxhciB0ZXN0IGlzIGluIHRoZSB0ZXN0c3VpdGUuICBUaGlzIHRhcmdldCBpcyBmb3IgZWFzZSBvZiB1c2UKKyMgd2hlbiBwb3J0aW5nIGxkLgorCitsZC1wYXJ0aWFsLm86IGxkLW5ldyQoRVhFRVhUKQorCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkLXBhcnRpYWwubyAtciAkKE9GSUxFUykKK2xkMSQoRVhFRVhUKTogbGQtcGFydGlhbC5vCisJLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSBsZC1wYXJ0aWFsLm8gJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCisKK2xkMS1mdWxsJChFWEVFWFQpOiBsZC1uZXcKKwkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEtZnVsbCQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQorCitsZDIkKEVYRUVYVCk6IGxkMSQoRVhFRVhUKQorCS4vbGQxJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMiQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQorCitsZDMkKEVYRUVYVCk6IGxkMiQoRVhFRVhUKQorCS4vbGQyJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMyQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQorCitib290c3RyYXA6IGxkMyQoRVhFRVhUKQorCWNtcCBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpCisKKy5QSE9OWTogYm9vdHN0cmFwCisKKyMgQSB0ZXN0IHByb2dyYW0gZm9yIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgorIyBUaGlzIHRlc3QgaXMgbm93IGluIHRoZSB0ZXN0c3VpdGUuCisjCisjY2R0ZXN0OiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3CisjCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdCAkKEhPU1RJTkdfQ1JUMCkgXAorIwkgIGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyAkKEhPU1RJTkdfTElCUykKKyMKKyNjZHRlc3Qub3V0OiBjZHRlc3QKKyMJLi9jZHRlc3QgPiBjZHRlc3QudG1wCisjCW12IGNkdGVzdC50bXAgY2R0ZXN0Lm91dAorIworI2NkdGVzdC11ci5vOiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3CisjCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ci5vIC1VciBjZHRlc3QtbWFpbi5vIFwKKyMJICBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vCisjCisjY2R0ZXN0LXVyOiBjZHRlc3QtdXIubworIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIgJChIT1NUSU5HX0NSVDApIGNkdGVzdC11ci5vIFwKKyMJICAkKEhPU1RJTkdfTElCUykKKyMKKyNjZHRlc3QtdXIub3V0OiBjZHRlc3QtdXIKKyMJLi9jZHRlc3QtdXIgPiBjZHRlc3QtdXIudG1wCisjCW12IGNkdGVzdC11ci50bXAgY2R0ZXN0LXVyLm91dAorIworI2NoZWNrLWNkdGVzdDogY2R0ZXN0Lm91dCBjZHRlc3QtdXIub3V0ICQoc3JjZGlyKS9jZHRlc3QuZXhwCisjCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0Lm91dAorIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC11ci5vdXQKKyMKKyMuUEhPTlk6IGNoZWNrLWNkdGVzdAorCisjIEVORCBPRiBDSEVDSyBUQVJHRVRTCisKKyMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCisjIE1hbnVhbCBjb25maWd1cmF0aW9uIGZpbGU7IG5vdCB1c3VhbGx5IGF0dGFjaGVkIHRvIG5vcm1hbCBjb25maWd1cmF0aW9uLAorIyBiZWNhdXNlIGFsbW9zdCBhbGwgY29uZmlncyB1c2UgImdlbiIgdmVyc2lvbiBvZiBtYW51YWwuCisjICBTZXQgRE9DVkVSIGFib3ZlIHRvIGNoYW5nZS4KK2NvbmZpZ2RvYy50ZXhpOgkke0RPQ1ZFUn0tZG9jLnRleGkKKwlsbiAtcyAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKKwkgIHx8IGxuICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAorCSAgfHwgY3AgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpCisKK2xkdmVyLnRleGk6IE1ha2VmaWxlCisJcm0gLWYgJEAKKwllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAorCitsZC5pbmZvOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyAkKHNyY2RpcikvbGQudGV4aW5mbworCitsZC5kdmk6ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKKwlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvOiQkVEVYSU5QVVRTIFwKKwkgIE1BS0VJTkZPPSIkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyIgJChURVhJMkRWSSkgJChzcmNkaXIpL2xkLnRleGluZm8KKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCisKKyMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgbGQxJChFWEVFWFQpIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkgXAorCWxkZW11bC1saXN0LmggY3J0YmVnaW4ubyBjcnRlbmQubyBsZC5sb2cgbGQuc3VtCittb3N0bHljbGVhbi1sb2NhbDoKKwktcm0gLXJmIHRtcGRpcgorQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQorCisuUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKKworaW5zdGFsbC1leGVjLWxvY2FsOiBsZC1uZXckKEVYRUVYVCkKKwkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKSAkKHRvb2xkaXIpL2JpbgorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKKwkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCW49YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCisJaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpIiBdOyB0aGVuIFwKKwkgIHJtIC1mICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCisJICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAorCSAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgbGQtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCisJZmkKKworaW5zdGFsbC1kYXRhLWxvY2FsOgorCSQobWtpbnN0YWxsZGlycykgJChzY3JpcHRkaXIpL2xkc2NyaXB0cworCWZvciBmIGluIGxkc2NyaXB0cy8qOyBkbyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmICQoc2NyaXB0ZGlyKS8kJGYgOyBcCisJZG9uZQorCisjIFN0dWZmIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgZGlzdHJpYnV0aW9uLiAgVGhlIGRpc3RzdHVmZgorIyB0YXJnZXQgaXMgcnVuIGJ5IHRoZSB0YXogdGFyZ2V0IGluIC4uL01ha2VmaWxlLmluLgorTERESVNUU1RVRkYgPSBsZGdyYW0uYyBsZGdyYW0uaCBsZGxleC5jCitkaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KKworRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhaworZGlzdGNsZWFuLWxvY2FsOgorCXJtIC1yZiBsZHNjcmlwdHMKKworIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCisjIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgorLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAorCXJtIC1mIC5kZXAxCisJJChNQUtFKSBERVA9JChERVApIC5kZXAxCisJc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCisKKyMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCisuZGVwMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKKwlybSAtZiAuZGVwMgorCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKKwkkKERFUCkgLWYgLmRlcDIgJChJTkNMVURFUykgJD8KKwkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKKworZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCisJc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCisJCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKKwkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKKworZGVwOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQorCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKKworZGVwLWluOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KKwljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KKwkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorCitkZXAtYW06IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQorCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCisKKy5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KKworIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KKyMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KKworbGRjdG9yLm86IGxkY3Rvci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGN0b3IuaAorbGRlbXVsLm86IGxkZW11bC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGVtdWwuaCBcCisgIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRlbXVsLWxpc3QuaAorbGRleHAubzogbGRleHAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggbGRncmFtLmggbGRsYW5nLmgKK2xkZmlsZS5vOiBsZGZpbGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRncmFtLmggXAorICBsZGxleC5oIGxkZW11bC5oCitsZGxhbmcubzogbGRsYW5nLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCisgIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggbGRsZXguaCBsZG1pc2MuaCBcCisgIGxkY3Rvci5oIGxkZmlsZS5oICQoSU5DRElSKS9mbm1hdGNoLmgKK2xkbWFpbi5vOiBsZG1haW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoSU5DRElSKS9wcm9ncmVzcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCisgIGxkbWlzYy5oIGxkd3JpdGUuaCBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIFwKKyAgbGRsZXguaCBsZGZpbGUuaCBsZGN0b3IuaAorbGRtaXNjLm86IGxkbWlzYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChJTkNESVIpL2RlbWFuZ2xlLmggbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKKyAgbGRncmFtLmggbGRsZXguaCBsZG1haW4uaCBsZGZpbGUuaAorbGR2ZXIubzogbGR2ZXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGR2ZXIuaCBcCisgIGxkZW11bC5oIGxkbWFpbi5oCitsZHdyaXRlLm86IGxkd3JpdGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCisgIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oCitsZXhzdXAubzogbGV4c3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKKyAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaCBsZGxleC5oIGxkZmlsZS5oIFwKKyAgbGR2ZXIuaCBsZGVtdWwuaAorbXJpLm86IG1yaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCisgIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIFwKKyAgbGRtaXNjLmggbXJpLmggbGRncmFtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCitsZGNyZWYubzogbGRjcmVmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBcCisgIGxkbGFuZy5oCitwZS1kbGwubzogcGUtZGxsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAorICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGVtdWwuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKKyAgLi4vYmZkL2xpYmNvZmYuaCBkZWZmaWxlLmgKK2xkZ3JhbS5vOiBsZGdyYW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBsZC5oIGxkZXhwLmggbGR2ZXIuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBcCisgIGxkbWFpbi5oIG1yaS5oIGxkY3Rvci5oIGxkbGV4LmgKK2xkbGV4Lm86IGxkbGV4LmMgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICBsZC5oIGxkZ3JhbS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRsZXguaCBcCisgIGxkbWFpbi5oCitkZWZmaWxlcC5vOiBkZWZmaWxlcC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKKyAgbGQuaCBsZG1pc2MuaCBkZWZmaWxlLmgKKworIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9sZC9NYWtlZmlsZS5pbiBiL2xkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTYxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE1NDYgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKworU0hFTEwgPSBAU0hFTExACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2JpbmRpciA9IEBiaW5kaXJACitzYmluZGlyID0gQHNiaW5kaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2xpYmRpciA9IEBsaWJkaXJACitpbmZvZGlyID0gQGluZm9kaXJACittYW5kaXIgPSBAbWFuZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQorCitERVNURElSID0KKworcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKKwordG9wX2J1aWxkZGlyID0gLgorCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK3RyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK0FTID0gQEFTQAorQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorQ0MgPSBAQ0NACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACitETExUT09MID0gQERMTFRPT0xACitFWEVFWFQgPSBARVhFRVhUQAorRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAorR01PRklMRVMgPSBAR01PRklMRVNACitHTVNHRk1UID0gQEdNU0dGTVRACitHVF9OTyA9IEBHVF9OT0AKK0dUX1lFUyA9IEBHVF9ZRVNACitIREVGSU5FUyA9IEBIREVGSU5FU0AKK0lOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKK0lOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKK0lOVExERVBTID0gQElOVExERVBTQAorSU5UTE9CSlMgPSBASU5UTE9CSlNACitMRCA9IEBMREAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xOX1MgPSBATE5fU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitNU0dGTVQgPSBATVNHRk1UQAorTkFUSVZFX0xJQl9ESVJTID0gQE5BVElWRV9MSUJfRElSU0AKK05NID0gQE5NQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUE9GSUxFUyA9IEBQT0ZJTEVTQAorUE9TVUIgPSBAUE9TVUJACitSQU5MSUIgPSBAUkFOTElCQAorVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACitVU0VfTkxTID0gQFVTRV9OTFNACitVU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorbCA9IEBsQAorCitJTlRMTElCUyA9IEBJTlRMTElCU0AKKworQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251CisKK1NVQkRJUlMgPSBwbworCit0b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCisKK1lBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAorWUZMQUdTID0gLWQKK0xFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCisKKyMgV2UgcHV0IHRoZSBzY3JpcHRzIGluIHRoZSBkaXJlY3RvcnkgJChzY3JpcHRkaXIpL2xkc2NyaXB0cy4KKyMgV2UgY2FuJ3QgcHV0IHRoZSBzY3JpcHRzIGluICQoZGF0YWRpcikgYmVjYXVzZSB0aGUgU0VBUkNIX0RJUgorIyBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZvciBuYXRpdmUgYW5kIGNyb3NzIGxpbmtlcnMuCitzY3JpcHRkaXIgPSAkKHRvb2xkaXIpL2xpYgorCitFTVVMID0gQEVNVUxACitFTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNACitFTVVMX0VYVFJBX09GSUxFUyA9IEBFTVVMX0VYVFJBX09GSUxFU0AKKworIyBTZWFyY2ggcGF0aCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgLWxmb28gbGlicmFyaWVzLgorIyBJZiBMSUJfUEFUSCBpcyBlbXB0eSwgdGhlIG9uZXMgaW4gdGhlIHNjcmlwdCAoaWYgYW55KSBhcmUgbGVmdCBhbG9uZS4KKyMgKFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiwgdW5sZXNzIGJ1aWxkaW5nCisjIGEgY3Jvc3MtbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIGVtcHR5LiAgU2VlIGdlbnNjcmlwdHMuc2guKQorIyBPdGhlcndpc2UsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZXMgZ2l2ZW4gaW4gTElCX1BBVEgsCisjIHdoaWNoIG1heSBoYXZlIHRoZSBmb3JtOiBMSUJfUEFUSD0vbGliOi91c3IvbG9jYWwvbGliCitMSUJfUEFUSCA9IAorCitCQVNFRElSID0gJChzcmNkaXIpLy4uCitCRkRESVIgPSAkKEJBU0VESVIpL2JmZAorSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCitERVAgPSBta2RlcAorCisjIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCitET0NWRVIgPSBnZW4KKworI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KK0hPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACitIT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAorSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCisKKyMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKK0VYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCisJdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAorCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworCitSVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCisJdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKKwllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAorCisKK1JVTlRFU1RGTEFHUyA9IAorCitDQ19GT1JfVEFSR0VUID0gYCBcCisgIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKKyAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAorICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKKyAgICBlbHNlIFwKKyAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKKyAgICBmaTsgXAorICBlbHNlIFwKKyAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCisgICAgICBlY2hvICQoQ0MpOyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAorICAgIGZpOyBcCisgIGZpYAorCisKK0NYWCA9IGdjYworQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAorICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCisgICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAorICAgIGVsc2UgXAorICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAorICAgIGZpOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDWFgpOyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAorICAgIGZpOyBcCisgIGZpYAorCisKK25vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldworaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KK25vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KK21hbl9NQU5TID0gbGQuMQorCitJTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgorCitCRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCitMSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKKworQUxMX0VNVUxBVElPTlMgPSBcCisJZWEyOWsubyBcCisJZWFpeHBwYy5vIFwKKwllYWl4cnM2Lm8gXAorCWVhbHBoYS5vIFwKKwllYXJjZWxmLm8gXAorCWVhcm1lbGYubyBcCisJZWFybWVsZl9vYWJpLm8gXAorCWVhcm1saW51eC5vIFwKKwllYXJtMjZsaW51eC5vIFwKKwllYXJtYW91dGIubyBcCisJZWFybWFvdXRsLm8gXAorCWVhcm1jb2ZmLm8gXAorCWVhcm1wZS5vIFwKKwllY29mZl9zcGFyYy5vIFwKKwllZDEwdmVsZi5vIFwKKwllZDMwdmVsZi5vIFwKKwllZDMwdl9lLm8gXAorCWVkMzB2X28ubyBcCisJZWRlbHRhNjgubyBcCisJZWVibW9uMjlrLm8gXAorCWVlbGYzMl9zcGFyYy5vIFwKKwllZWxmMzJiNDMwMC5vIFwKKwllZWxmMzJibWlwLm8gXAorCWVlbGYzMmVibWlwLm8gXAorCWVlbGYzMmVsbWlwLm8gXAorCWVlbGYzMmw0MzAwLm8gXAorCWVlbGYzMmxtaXAubyBcCisJZWVsZjMybHBwYy5vIFwKKwllZWxmMzJwcGMubyBcCisJZWVsZl9pMzg2Lm8gXAorCWVlbGZfaTM4Nl9iZS5vIFwKKwllZ2xkOTYwLm8gXAorCWVnbGQ5NjBjb2ZmLm8gXAorCWVlbGYzMmZyMzAubyBcCisJZWVsZjMybWNvcmUubyBcCisJZWdvMzIubyBcCisJZWg4MzAwLm8gXAorCWVoODMwMGgubyBcCisJZWg4MzAwcy5vIFwKKwllaDg1MDAubyBcCisJZWg4NTAwYi5vIFwKKwllaDg1MDBjLm8gXAorCWVoODUwMG0ubyBcCisJZWg4NTAwcy5vIFwKKwllaHAzMDBic2QubyBcCisJZWhwM2hwdXgubyBcCisJZWhwcGFlbGYubyBcCisJZWkzODZhb3V0Lm8gXAorCWVpMzg2YmVvcy5vIFwKKwllaTM4NmJzZC5vIFwKKwllaTM4NmNvZmYubyBcCisJZWkzODZnbzMyLm8gXAorCWVpMzg2bGludXgubyBcCisJZWkzODZseW54Lm8gXAorCWVpMzg2bWFjaC5vIFwKKwllaTM4Nm1vc3MubyBcCisJZWkzODZtc2Rvcy5vIFwKKwllaTM4Nm5ic2QubyBcCisJZWkzODZudy5vIFwKKwllaTM4NnBlLm8gXAorCWVsbms5NjAubyBcCisJZW02OGs0a25ic2QubyBcCisJZW02OGthb3V0Lm8gXAorCWVtNjhrYXV4Lm8gXAorCWVtNjhrY29mZi5vIFwKKwllbTY4a2VsZi5vIFwKKwllbTY4a2xpbnV4Lm8gXAorCWVtNjhrbHlueC5vIFwKKwllbTY4a25ic2QubyBcCisJZW02OGtwc29zLm8gXAorCWVtODhrYmNzLm8gXAorCWVtY29yZXBlLm8gXAorCWVtaXBzYmlnLm8gXAorCWVtaXBzYnNkLm8gXAorCWVtaXBzaWR0Lm8gXAorCWVtaXBzaWR0bC5vIFwKKwllbWlwc2xpdC5vIFwKKwllbWlwc2xuZXdzLm8gXAorCWVuZXdzLm8gXAorCWVuczMya25ic2QubyBcCisJZXBjNTMybWFjaGEubyBcCisJZXBwY21hY29zLm8gXAorCWVwcGNudy5vIFwKKwllcHBjcGUubyBcCisJZXJpc2NpeC5vIFwKKwllc2EyOTIwMC5vIFwKKwllc2gubyBcCisJZXNoZWxmLm8gXAorCWVzaGxlbGYubyBcCisJZXNobC5vIFwKKwllc3BhcmNhb3V0Lm8gXAorCWVzcGFyY2xpbnV4Lm8gXAorCWVzcGFyY2x5bngubyBcCisJZXNwYXJjbmJzZC5vIFwKKwllc3QyMDAwLm8gXAorCWVzdW4zLm8gXAorCWVzdW40Lm8gXAorCWV0aWMzMGFvdXQubyBcCisJZXRpYzMwY29mZi5vIFwKKwlldGljODBjb2ZmLm8gXAorCWV2YW5pbGxhLm8gXAorCWV2YXgubyBcCisJZXZzdGEubyBcCisJZXc2NS5vIFwKKwllejgwMDEubyBcCisJZXo4MDAyLm8KKworCitBTExfNjRfRU1VTEFUSU9OUyA9IFwKKwllZWxmNjRfc3BhcmMubyBcCisJZWVsZjY0YWxwaGEubworCisKK0FMTF9FTVVMX0VYVFJBX09GSUxFUyA9IFwKKwlwZS1kbGwubyBcCisJZGVmZmlsZXAubworCisKK0NGSUxFUyA9IGxkY3Rvci5jIGxkZW11bC5jIGxkZXhwLmMgbGRmaWxlLmMgbGRsYW5nLmMgXAorCWxkbWFpbi5jIGxkbWlzYy5jIGxkdmVyLmMgbGR3cml0ZS5jIGxleHN1cC5jIFwKKwltcmkuYyBsZGNyZWYuYyBwZS1kbGwuYworCisKK0hGSUxFUyA9IGxkLmggbGRjdG9yLmggbGRlbXVsLmggbGRleHAuaCBsZGZpbGUuaCBcCisJbGRsYW5nLmggbGRsZXguaCBsZG1haW4uaCBsZG1pc2MuaCBsZHZlci5oIFwKKwlsZHdyaXRlLmggbXJpLmggZGVmZmlsZS5oCisKKworR0VORVJBVEVEX0NGSUxFUyA9IGxkZ3JhbS5jIGxkbGV4LmMgZGVmZmlsZXAuYworR0VORVJBVEVEX0hGSUxFUyA9IGxkZ3JhbS5oIGxkZW11bC1saXN0LmggZGVmZmlsZXAuaAorCitPRklMRVMgPSBsZGdyYW0ubyBsZGxleC5vIGxleHN1cC5vIGxkbGFuZy5vIG1yaS5vIGxkY3Rvci5vIGxkbWFpbi5vIFwKKwlsZHdyaXRlLm8gbGRleHAubyAgbGRlbXVsLm8gbGR2ZXIubyBsZG1pc2MubyBcCisJbGRmaWxlLm8gbGRjcmVmLm8gJHtFTVVMQVRJT05fT0ZJTEVTfSAke0VNVUxfRVhUUkFfT0ZJTEVTfQorCisKK1NUQUdFU1RVRkYgPSAqLm8gbGRzY3JpcHRzLyogZSouYworCisjIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBqdXN0IGEgbGlzdCBvZiB0aG9zZSBlbXVsYXRpb24gdGVtcGxhdGUgZmlsZXMKKyMgdGhhdCBjb250YWluIGludGVybmF0aW9uYWxpc2VkIHN0cmluZ3MuCitFTVVMQVRJT05fRklMRVMgPSBlbXVsdGVtcGwvcGUuZW0gZW11bHRlbXBsL2FybWNvZmYuZW0KKworUE9URklMRVMgPSAkKENGSUxFUykgJChIRklMRVMpICQoRU1VTEFUSU9OX0ZJTEVTKQorCisjIFRoZXNlIGFsbCBzdGFydCB3aXRoIGUgc28gJ21ha2UgY2xlYW4nIGNhbiBmaW5kIHRoZW0uCisKK0dFTlNDUklQVFMgPSAkKFNIRUxMKSAkKHNyY2RpcikvZ2Vuc2NyaXB0cy5zaCAke3NyY2Rpcn0gJHtsaWJkaXJ9IEBob3N0QCBAdGFyZ2V0QCBAdGFyZ2V0X2FsaWFzQCAke0VNVUx9ICJATkFUSVZFX0xJQl9ESVJTQCIKK0dFTl9ERVBFTkRTID0gJChzcmNkaXIpL2dlbnNjcmlwdHMuc2ggJChzcmNkaXIpL2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkCisKK2xkX25ld19TT1VSQ0VTID0gbGRncmFtLnkgbGRsZXgubCBsZXhzdXAuYyBsZGxhbmcuYyBtcmkuYyBsZGN0b3IuYyBsZG1haW4uYyBcCisJbGR3cml0ZS5jIGxkZXhwLmMgbGRlbXVsLmMgbGR2ZXIuYyBsZG1pc2MuYyBsZGZpbGUuYyBsZGNyZWYuYworCitsZF9uZXdfREVQRU5ERU5DSUVTID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTERFUFMpCitsZF9uZXdfTERBREQgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKKworIyBUaGlzIGlzIHRoZSByZWFsIGxpYmJmZC5hIGNyZWF0ZWQgYnkgbGlidG9vbC4KK1RFU1RCRkRMSUIgPSBAVEVTVEJGRExJQkAKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCisKK01PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGxkMSQoRVhFRVhUKSBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpIFwKKwlsZGVtdWwtbGlzdC5oIGNydGJlZ2luLm8gY3J0ZW5kLm8gbGQubG9nIGxkLnN1bQorCitDTEVBTkZJTEVTID0gZGVwLnNlZCAuZGVwIC5kZXAxCisKKyMgU3R1ZmYgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYSBkaXN0cmlidXRpb24uICBUaGUgZGlzdHN0dWZmCisjIHRhcmdldCBpcyBydW4gYnkgdGhlIHRheiB0YXJnZXQgaW4gLi4vTWFrZWZpbGUuaW4uCitMRERJU1RTVFVGRiA9IGxkZ3JhbS5jIGxkZ3JhbS5oIGxkbGV4LmMKKworRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhaworQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSAKK25vaW5zdF9QUk9HUkFNUyA9ICBsZC1uZXckKEVYRUVYVCkKK1BST0dSQU1TID0gICQobm9pbnN0X1BST0dSQU1TKQorCisKK0RFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitMREZMQUdTID0gQExERkxBR1NACitMSUJTID0gQExJQlNACitsZF9uZXdfT0JKRUNUUyA9ICBsZGdyYW0ubyBsZGxleC5vIGxleHN1cC5vIGxkbGFuZy5vIG1yaS5vIGxkY3Rvci5vIFwKK2xkbWFpbi5vIGxkd3JpdGUubyBsZGV4cC5vIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gbGRmaWxlLm8gbGRjcmVmLm8KK2xkX25ld19MREZMQUdTID0gCitMRVhfT1VUUFVUX1JPT1QgPSBATEVYX09VVFBVVF9ST09UQAorTEVYTElCID0gQExFWExJQkAKK0NGTEFHUyA9IEBDRkxBR1NACitDT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAorVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAorVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKK0lORk9fREVQUyA9IGxkLmluZm8KK0RWSVMgPSBsZC5kdmkKK1RFWElORk9TID0gbGQudGV4aW5mbworbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCitNQU5TID0gJChtYW5fTUFOUykKKworTlJPRkYgPSBucm9mZgorRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAorTkVXUyBUT0RPIGFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKK2xkZ3JhbS5jIGxkbGV4LmMKKworCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCitUQVIgPSB0YXIKK0daSVBfRU5WID0gLS1iZXN0CitTT1VSQ0VTID0gJChsZF9uZXdfU09VUkNFUykKK09CSkVDVFMgPSAkKGxkX25ld19PQkpFQ1RTKQorCithbGw6IGFsbC1yZWRpcmVjdAorLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuUyAuYyAuZHZpIC5pbmZvIC5sIC5sbyAubyAucHMgLnMgLnRleGkgLnRleGluZm8gLnR4aSAueQorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00CisJY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKKyQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQorCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorCitjb25maWcuaDogc3RhbXAtaAorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCQlybSAtZiBzdGFtcC1oOyBcCisJCSQoTUFLRSkgc3RhbXAtaDsgXAorCWVsc2UgOjsgZmkKK3N0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAorCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisJQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKKyQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAorCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCisJZWxzZSA6OyBmaQorJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCisJQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCisKK21vc3RseWNsZWFuLWhkcjoKKworY2xlYW4taGRyOgorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBjb25maWcuaAorCittYWludGFpbmVyLWNsZWFuLWhkcjoKKworbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6CisKK2NsZWFuLW5vaW5zdFBST0dSQU1TOgorCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQorCitkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6CisKK21haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisKKy5jLm86CisJJChDT01QSUxFKSAtYyAkPAorCisucy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworLlMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoubyBjb3JlICouY29yZQorCitjbGVhbi1jb21waWxlOgorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCittYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6CisKKy5jLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAorCisucy5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKKworLlMubG86CisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCittYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6CisKK2xkLW5ldyQoRVhFRVhUKTogJChsZF9uZXdfT0JKRUNUUykgJChsZF9uZXdfREVQRU5ERU5DSUVTKQorCUBybSAtZiBsZC1uZXckKEVYRUVYVCkKKwkkKExJTkspICQobGRfbmV3X0xERkxBR1MpICQobGRfbmV3X09CSkVDVFMpICQobGRfbmV3X0xEQUREKSAkKExJQlMpCisubC5jOgorCSQoTEVYKSAkKEFNX0xGTEFHUykgJChMRkxBR1MpICQ8ICYmIG12ICQoTEVYX09VVFBVVF9ST09UKS5jICRACisueS5jOgorCSQoWUFDQykgJChBTV9ZRkxBR1MpICQoWUZMQUdTKSAkPCAmJiBtdiB5LnRhYi5jICQqLmMKKwlpZiB0ZXN0IC1mIHkudGFiLmg7IHRoZW4gXAorCWlmIGNtcCAtcyB5LnRhYi5oICQqLmg7IHRoZW4gcm0gLWYgeS50YWIuaDsgZWxzZSBtdiB5LnRhYi5oICQqLmg7IGZpOyBcCisJZWxzZSA6OyBmaQorbGRncmFtLmg6IGxkZ3JhbS5jCisKKworbGQuaW5mbzogbGQudGV4aW5mbworbGQuZHZpOiBsZC50ZXhpbmZvCisKKworRFZJUFMgPSBkdmlwcworCisudGV4aS5pbmZvOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50ZXhpLmR2aToKKwlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKKwkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8CisKKy50ZXhpOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50ZXhpbmZvLmluZm86CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnRleGluZm86CisJQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KKwkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKKworLnRleGluZm8uZHZpOgorCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAorCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKKworLnR4aS5pbmZvOgorCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCisJJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8CisKKy50eGkuZHZpOgorCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAorCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKKworLnR4aToKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAorLmR2aS5wczoKKwkkKERWSVBTKSAkPCAtbyAkQAorCitpbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKKwlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKKwkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCisJICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKKwkgICAgZWxzZSA6IDsgZmk7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisJQCQoUE9TVF9JTlNUQUxMKQorCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCisJICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKKwkgIGRvbmU7IFwKKwllbHNlIDogOyBmaQorCit1bmluc3RhbGwtaW5mbzoKKwkkKFBSRV9VTklOU1RBTEwpCisJQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaWk9eWVzOyBcCisJZWxzZSBpaT07IGZpOyBcCisJbGlzdD0nJChJTkZPX0RFUFMpJzsgXAorCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAteiAiJGlpIiBcCisJICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAorCWRvbmUKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAorCWRvbmUKKworZGlzdC1pbmZvOiAkKElORk9fREVQUykKKwlsaXN0PSckKElORk9fREVQUyknOyBcCisJZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJZG9uZQorCittb3N0bHljbGVhbi1hbWluZm86CisJLXJtIC1mIGxkLmF1eCBsZC5jcCBsZC5jcHMgbGQuZHZpIGxkLmZuIGxkLmZucyBsZC5reSBsZC5reXMgbGQucHMgXAorCSAgbGQubG9nIGxkLnBnIGxkLnRvYyBsZC50cCBsZC50cHMgbGQudnIgbGQudnJzIGxkLm9wIGxkLnRyIFwKKwkgIGxkLmN2IGxkLmNuCisKK2NsZWFuLWFtaW5mbzoKKworZGlzdGNsZWFuLWFtaW5mbzoKKworbWFpbnRhaW5lci1jbGVhbi1hbWluZm86CisJZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCisJICBybSAtZiAkJGk7IFwKKwkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAorCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCisJICBmaTsgXAorCWRvbmUKK2NsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbworCitpbnN0YWxsLW1hbjE6CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChtYW4xZGlyKQorCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCisJbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAorCSAgY2FzZSAiJCRpIiBpbiBcCisJICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCisJICBlbHNlIGZpbGU9JCRpOyBmaTsgXAorCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCisJICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAorCSAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1tYW4xOgorCUBsaXN0PSckKG1hbjFfTUFOUyknOyBcCisJbDI9JyQobWFuX01BTlMpJzsgZm9yIGkgaW4gJCRsMjsgZG8gXAorCSAgY2FzZSAiJCRpIiBpbiBcCisJICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCisJICBlY2hvICIgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0IjsgXAorCSAgcm0gLWYgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCisJZG9uZQoraW5zdGFsbC1tYW46ICQoTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLW1hbjEKK3VuaW5zdGFsbC1tYW46CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtbWFuMQorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorCitAU0VUX01BS0VACisKK2FsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKK2luc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCittb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAorCWRvbmU7IFwKKwl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCisKK3RhZ3M6IFRBR1MKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKKwkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKKwkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQorCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKyAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisgICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAorCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKKworbW9zdGx5Y2xlYW4tdGFnczoKKworY2xlYW4tdGFnczoKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQKKworbWFpbnRhaW5lci1jbGVhbi10YWdzOgorCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKKworIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgorIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgorIyB0YXJmaWxlLgorZGlzdGNoZWNrOiBkaXN0CisJLXJtIC1yZiAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6CisJbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKKwlta2RpciAkKGRpc3RkaXIpLz1pbnN0CisJZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKKwljZCAkKGRpc3RkaXIpLz1idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKKwktcm0gLXJmICQoZGlzdGRpcikKKwlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAorCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCisJZWNobyAiJCRkYXNoZXMiOyBcCisJZWNobyAiJCRiYW5uZXIiOyBcCisJZWNobyAiJCRkYXNoZXMiCitkaXN0OiBkaXN0ZGlyCisJLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQorCS1ybSAtcmYgJChkaXN0ZGlyKQorZGlzdC1hbGw6IGRpc3RkaXIKKwktY2htb2QgLVIgYStyICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCisJLXJtIC1yZiAkKGRpc3RkaXIpCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwktcm0gLXJmICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpCisJLWNobW9kIDc3NyAkKGRpc3RkaXIpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAorCSAgZmk7IFwKKwlkb25lCisJZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbworCitERUpBVE9PTCA9ICQoUEFDS0FHRSkKKworUlVOVEVTVERFRkFVTFRGTEFHUyA9IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHNyY2Rpcgorc2l0ZS5leHA6IE1ha2VmaWxlCisJQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJworCUB0ZXN0ICEgLWYgc2l0ZS5iYWsgfHwgcm0gLWYgc2l0ZS5iYWsKKwlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKKwlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10CisJQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10CisJQGVjaG8gJ3NldCB0b29sICQoREVKQVRPT0wpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBzcmNkaXIgJChzcmNkaXIpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBvYmpkaXInIGBwd2RgID4+ICRALXQKKwlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAorCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF90cmlwbGV0KScgPj4gJEAtdAorCUBlY2hvICdzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKScgPj4gJEAtdAorCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+ICRALXQKKwlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+ICRALXQKKwlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKKwlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAorCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKKwlAbXYgJEAtdCBzaXRlLmV4cAoraW5mby1hbTogJChJTkZPX0RFUFMpCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorZHZpLWFtOiAkKERWSVMpCitkdmk6IGR2aS1yZWN1cnNpdmUKK2NoZWNrLWFtOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2luc3RhbGxjaGVjay1hbToKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1pbmZvLWFtOiAKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1leGVjLWxvY2FsCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtbG9jYWwKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbgordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKK2FsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CisJJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobWFuZGlyKS9tYW4xCisKKworbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisJLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogImxkbGV4bGxkZ3JhbWhsZGdyYW1jJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mIGxkbGV4bCBsZGdyYW1oIGxkZ3JhbWMgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK21vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwkJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJCW1vc3RseWNsZWFuLWxvY2FsCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIFwKKwkJY2xlYW4tYW1pbmZvIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQorCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2Rpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKKwkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCisJCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtIGRpc3RjbGVhbi1sb2NhbAorCS1ybSAtZiBsaWJ0b29sCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBjb25maWcuc3RhdHVzCisKK21haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCisJCW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAorCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi10YWdzIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1hbQorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBjb25maWcuc3RhdHVzCisKKy5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKK21vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBcCitjbGVhbi1ub2luc3RQUk9HUkFNUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKK21vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCittYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCitjbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWluZm8gXAorbW9zdGx5Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1hbWluZm8gY2xlYW4tYW1pbmZvIFwKK21haW50YWluZXItY2xlYW4tYW1pbmZvIGluc3RhbGwtbWFuMSB1bmluc3RhbGwtbWFuMSBpbnN0YWxsLW1hbiBcCit1bmluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKK2luc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCit1bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCitpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKK21haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCitkaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGNoZWNrLURFSkFHTlUgXAoraW5mby1hbSBpbmZvIGR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBcCitpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1pbmZvIGFsbC1yZWN1cnNpdmUtYW0gaW5zdGFsbC1leGVjLWxvY2FsIFwKK2luc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhLWxvY2FsIGluc3RhbGwtZGF0YS1hbSBcCitpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IFwKK2FsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCitkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCittb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgorCisKK3BvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCisJZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCisJICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCisKK2xkbWFpbi5vOiBsZG1haW4uYyBjb25maWcuc3RhdHVzCisJJChDT01QSUxFKSAtYyAtRERFRkFVTFRfRU1VTEFUSU9OPSciJChFTVVMKSInIC1EU0NSSVBURElSPSciJChzY3JpcHRkaXIpIicgLURUQVJHRVQ9JyJAdGFyZ2V0QCInICQoc3JjZGlyKS9sZG1haW4uYworCitsZGVtdWwtbGlzdC5oOiBNYWtlZmlsZQorCShlY2hvICIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBETyBOT1QgRURJVCEgKi8iO1wKKwlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCisJIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKKwkgICAgZWNobyAiZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfJCR7Zn1fZW11bGF0aW9uOyI7IFwKKwlkb25lO1wKKwllY2hvICIiO1wKKwllY2hvICIjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFxcIjtcCisJZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAorCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCisJICAgIGVjaG8gIiAgJmxkXyQke2Z9X2VtdWxhdGlvbiwgXFwiOyBcCisJZG9uZTtcCisJZWNobyAiICAwIikgPmxkZW11bC10bXAuaAorCW12IGxkZW11bC10bXAuaCBsZGVtdWwtbGlzdC5oCitAVERJUlNACisKK2VhMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2EyOWsuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2EyOWsuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGEyOWsgIiQodGRpcl9hMjlrKSIKK2VhaXhwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cHBjLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYWl4cHBjICIkKHRkaXJfYWl4cHBjKSIKK2VhaXhyczYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWl4cnM2LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYWl4cnM2ICIkKHRkaXJfYWl4cnM2KSIKK2VhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hbHBoYS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWxwaGEuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFscGhhICIkKHRkaXJfYWxwaGEpIgorZWFyY2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcmNlbGYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJjZWxmICIkKHRkaXJfYXJjZWxmKSIKK2Vhcm1lbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJtZWxmICIkKHRkaXJfYXJtZWxmKSIKK2Vhcm1lbGZfb2FiaS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJtZWxmX29hYmkgIiQodGRpcl9hcm1lbGYpIgorZWFybWVsZl9saW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXggIiQodGRpcl9hcm1lbGZfbGludXgpIgorZWFybWVsZl9saW51eDI2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4MjYgIiQodGRpcl9hcm1lbGZfbGludXgyNikiCitlYXJtYW91dGIuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGIuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFybWFvdXRiICIkKHRkaXJfYXJtYW91dGIpIgorZWFybWFvdXRsLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRsLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhcm1hb3V0bCAiJCh0ZGlyX2FybWFvdXRsKSIKK2Vhcm1jb2ZmLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWNvZmYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGFybWNvZmYgIiQodGRpcl9hcm1jb2ZmKSIKK2Vhcm1wZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1wZS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBhcm1wZSAiJCh0ZGlyX2FybXBlKSIKK2Vjb2ZmX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gY29mZl9zcGFyYyAiJCh0ZGlyX2NvZmZfc3BhcmMpIgorZWQxMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDEwdmVsZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZDEwdmVsZiAiJCh0ZGlyX2QxMHYpIgorZWQzMHZlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdmVsZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZDMwdmVsZiAiJCh0ZGlyX2QzMHYpIgorZWQzMHZfby5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X28uc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGQzMHZfbyAiJCh0ZGlyX2QzMHYpIgorZWQzMHZfZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2X2Uuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGQzMHZfZSAiJCh0ZGlyX2QzMHYpIgorZWRlbHRhNjguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZGVsdGE2OC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZGVsdGE2OCAiJCh0ZGlyX2RlbHRhNjgpIgorZWVibW9uMjlrLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VibW9uMjlrLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWJtb24yOWsgIiQodGRpcl9lYm1vbjI5aykiCitlZWxmMzJmcjMwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZnIzMC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJmcjMwICIkKHRkaXJfZnIzMCkiCitlZWxmMzJtY29yZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMm1jb3JlICIkKHRkaXJfbWNvcmUpIgorZW0zMnJlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTMycmVsZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtMzJyZWxmICIkKHRkaXJfbTMycikiCitlZWxmMzJfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjMyX3NwYXJjICIkKHRkaXJfZWxmMzJfc3BhcmMpIgorZWVsZjMyYjQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJiNDMwMCAiJCh0ZGlyX2VsZjMyYjQzMDApIgorZWVsZjMyYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjMyYm1pcCAiJCh0ZGlyX2VsZjMyYm1pcCkiCitlZWxmMzJic21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMmJzbWlwICIkKHRkaXJfZWxmMzJic21pcCkiCitlZWxmMzJlYm1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMmVibWlwICIkKHRkaXJfZWxmMzJlYm1pcCkiCitlZWxmMzJlbG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMmVsbWlwICIkKHRkaXJfZWxmMzJlbG1pcCkiCitlZWxmMzJsNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMmw0MzAwICIkKHRkaXJfZWxmMzJsNDMwMCkiCitlZWxmMzJsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybG1pcC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJsbWlwICIkKHRkaXJfZWxmMzJsbWlwKSIKK2VlbGYzMmxwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMmxwcGMgIiQodGRpcl9lbGYzMmxwcGMpIgorZWVsZjMybHNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmMzJsc21pcCAiJCh0ZGlyX2VsZjMybHNtaXApIgorZWVsZjMycHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMycHBjLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGYzMnBwYyAiJCh0ZGlyX2VsZjMycHBjKSIKK2VlbGY2NGFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZjY0YWxwaGEgIiQodGRpcl9lbGY2NGFscGhhKSIKK2VlbGY2NF9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gZWxmNjRfc3BhcmMgIiQodGRpcl9lbGY2NF9zcGFyYykiCitlZWxmX2kzODYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGVsZl9pMzg2ICIkKHRkaXJfZWxmX2kzODYpIgorZWVsZl9pMzg2X2JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBlbGZfaTM4Nl9iZSAiJCh0ZGlyX2VsZl9pMzg2X2JlKSIKK2VnbGQ5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGdsZDk2MCAiJCh0ZGlyX2dsZDk2MCkiCitlZ2xkOTYwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBnbGQ5NjBjb2ZmICIkKHRkaXJfZ2xkOTYwY29mZikiCitlZ28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbzMyLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBnbzMyICIkKHRkaXJfZ28zMikiCitlaDgzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBoODMwMCAiJCh0ZGlyX2g4MzAwKSIKK2VoODMwMGguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBoLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMGguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGg4MzAwaCAiJCh0ZGlyX2g4MzAwaCkiCitlaDgzMDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwcy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBzLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBoODMwMHMgIiQodGRpcl9oODMwMHMpIgorZWg4NTAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaDg1MDAgIiQodGRpcl9oODUwMCkiCitlaDg1MDBiLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBiLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBoODUwMGIgIiQodGRpcl9oODUwMGIpIgorZWg4NTAwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaDg1MDBjICIkKHRkaXJfaDg1MDBjKSIKK2VoODUwMG0uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBtLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGg4NTAwbSAiJCh0ZGlyX2g4NTAwbSkiCitlaDg1MDBzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwcy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBzLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBoODUwMHMgIiQodGRpcl9oODUwMHMpIgorZWhwMzAwYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwMzAwYnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBocDMwMGJzZCAiJCh0ZGlyX2hwMzAwYnNkKSIKK2VocDNocHV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwM2hwdXguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGhwM2hwdXggIiQodGRpcl9ocDNocHV4KSIKK2VocHBhZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2hwcGFlbGYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2hwcGFlbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGhwcGFlbGYgIiQodGRpcl9ocHBhZWxmKSIKK2VpMzg2YW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4NmFvdXQgIiQodGRpcl9pMzg2YW91dCkiCitlaTM4NmJlb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2Jlb3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2YmVvcyAiJCh0ZGlyX2kzODZiZW9zKSIKK2VpMzg2YnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZic2Quc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZic2QgIiQodGRpcl9pMzg2YnNkKSIKK2VpMzg2Y29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Y29mZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZjb2ZmICIkKHRkaXJfaTM4NmNvZmYpIgorZWkzODZnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZnbzMyLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4NmdvMzIgIiQodGRpcl9pMzg2Z28zMikiCitlaTM4NmxpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZsaW51eCAiJCh0ZGlyX2kzODZsaW51eCkiCitlaTM4Nmx5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZseW54LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2bHlueCAiJCh0ZGlyX2kzODZseW54KSIKK2VpMzg2bWFjaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bWFjaC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4Nm1hY2ggIiQodGRpcl9pMzg2bWFjaCkiCitlaTM4Nm1vc3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gaTM4Nm1vc3MgIiQodGRpcl9pMzg2bW9zcykiCitlaTM4Nm1zZG9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtc2Rvcy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2bXNkb3MgIiQodGRpcl9pMzg2bXNkb3MpIgorZWkzODZuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZuYnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2bmJzZCAiJCh0ZGlyX2kzODZuYnNkKSIKK2VpMzg2bncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm53LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IGkzODZudyAiJCh0ZGlyX2kzODZudykiCitlaTM4NnBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZwZS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBpMzg2cGUgIiQodGRpcl9pMzg2cGUpIgorZWxuazk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9sbms5NjAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2xuazk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbG5rOTYwICIkKHRkaXJfbG5rOTYwKSIKK2VtNjhrNGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGs0a25ic2Quc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG02OGs0a25ic2QgIiQodGRpcl9tNjhrNGtuYnNkKSIKK2VtNjhrYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYW91dC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTY4a2FvdXQgIiQodGRpcl9tNjhrYW91dCkiCitlbTY4a2F1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrYXV4LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrYXV4ICIkKHRkaXJfbTY4a2F1eCkiCitlbTY4a2NvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrY29mZiAiJCh0ZGlyX202OGtjb2ZmKSIKK2VtNjhrZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtlbGYuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG02OGtlbGYgIiQodGRpcl9tNjhrZWxmKSIKK2VtNjhrbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTY4a2xpbnV4ICIkKHRkaXJfbTY4a2xpbnV4KSIKK2VtNjhrbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbHlueC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG02OGtseW54ICIkKHRkaXJfbTY4a2x5bngpIgorZW02OGtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtuYnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtNjhrbmJzZCAiJCh0ZGlyX202OGtuYnNkKSIKK2VtNjhrcHNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrcHNvcy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Bzb3Muc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG02OGtwc29zICIkKHRkaXJfbTY4a3Bzb3MpIgorZW04OGtiY3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbTg4a2JjcyAiJCh0ZGlyX204OGtiY3MpIgorZW1jb3JlcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWNvcmVwZS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BlLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtY29yZXBlICIkKHRkaXJfbWNvcmVwZSkiCitlbWlwc2JpZy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JpZy5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWlwc2JpZworZW1pcHNic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2JzZC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWlwc2JzZAorZW1pcHNpZHQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtaXBzaWR0ICIkKHRkaXJfbWlwc2lkdCkiCitlbWlwc2lkdGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWlwc2lkdGwgIiQodGRpcl9taXBzaWR0bCkiCitlbWlwc2xpdC5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xpdC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gbWlwc2xpdCAiJCh0ZGlyX21pcHNsaXQpIgorZW1pcHNsbmV3cy5jOiAgJChzcmNkaXIpL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBtaXBzbG5ld3MKK2VtbjEwMzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAzMDAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG1uMTAzMDAgIiQodGRpcl9tbjEwMzAwKSIKK2VtbjEwMjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21uMTAyMDAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG1uMTAyMDAgIiQodGRpcl9tbjEwMjAwKSIKK2VuZXdzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL25ld3Muc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IG5ld3MgIiQodGRpcl9uZXdzKSIKK2VuczMya25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBuczMya25ic2QgIiQodGRpcl9uczMya25ic2QpIgorZXBjNTMybWFjaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gcGM1MzJtYWNoYSAiJCh0ZGlyX3BjNTMybWFjaGEpIgorZXBwY21hY29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY21hY29zLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9haXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FpeC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gcHBjbWFjb3MgIiQodGRpcl9wcGNtYWNvcykiCitlcHBjbncuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbncuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gcHBjbncgIiQodGRpcl9wcGNudykiCitlcHBjcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjcGUuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wcGNwZS5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gcHBjcGUgIiQodGRpcl9wcGNwZSkiCitlcmlzY2l4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Jpc2NpeC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gcmlzY2l4ICIkKHRkaXJfcmlzY2l4KSIKK2VzYTI5MjAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NhMjkyMDAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHNhMjkyMDAgIiQodGRpcl9zYTI5MjAwKSIKK2VzaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaC5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHNoICIkKHRkaXJfc2gpIgorZXNoZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoZWxmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzaGVsZiAiJCh0ZGlyX3NoZWxmKSIKK2VzaGxlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsZWxmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzaGxlbGYgIiQodGRpcl9zaGxlbGYpIgorZXNobC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGwuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzaGwgIiQodGRpcl9zaGwpIgorZXNwYXJjYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHNwYXJjYW91dCAiJCh0ZGlyX3NwYXJjYW91dCkiCitlc3BhcmNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc3BhcmNsaW51eCAiJCh0ZGlyX3NwYXJjbGludXgpIgorZXNwYXJjbHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY2x5bnguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NwYXJjbHlueC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc3BhcmNseW54ICIkKHRkaXJfc3BhcmNseW54KSIKK2VzcGFyY25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzcGFyY25ic2QgIiQodGRpcl9zcGFyY25ic2QpIgorZXN0MjAwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdDIwMDAuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc3QyMDAwICIkKHRkaXJfc3QyMDAwKSIKK2VzdW4zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjMuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSBzdW4zICIkKHRkaXJfc3VuMykiCitlc3VuNC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW40LnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gc3VuNCAiJCh0ZGlyX3N1bjQpIgorZXRpYzMwYW91dC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGFvdXQuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gdGljMzBhb3V0ICIkKHRkaXJfdGljMzBhb3V0KSIKK2V0aWMzMGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBjb2ZmLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHRpYzMwY29mZiAiJCh0ZGlyX3RpYzMwY29mZikiCitldGljODBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzgwY29mZi5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSB0aWM4MGNvZmYgIiQodGRpcl90aWM4MGNvZmYpIgorZXZhbmlsbGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmFuaWxsYS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvdmFuaWxsYS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gdmFuaWxsYSAiJCh0ZGlyX3ZhbmlsbGEpIgorZXZheC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YXguc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHZheCAiJCh0ZGlyX3ZheCkiCitldnN0YS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92c3RhLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9CisJJHtHRU5TQ1JJUFRTfSB2c3RhICIkKHRkaXJfdnN0YSkiCitldjg1MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92ODUwLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdjg1MC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gdjg1MCAiJCh0ZGlyX3Y4NTApIgorZXc2NS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy93NjUuc2ggXAorICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3c2NS5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gdzY1ICIkKHRkaXJfdzY1KSIKK2V6ODAwMS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMS5zaCBcCisgICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KKwkke0dFTlNDUklQVFN9IHo4MDAxICIkKHRkaXJfejgwMDEpIgorZXo4MDAyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAyLnNoIFwKKyAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQorCSR7R0VOU0NSSVBUU30gejgwMDIgIiQodGRpcl96ODAwMikiCisKKyMgVGhlIGdlbmVyYXRlZCBlbXVsYXRpb24gZmlsZXMgbW9zdGx5IGhhdmUgdGhlIHNhbWUgZGVwZW5kZW5jaWVzLgorJChFTVVMQVRJT05fT0ZJTEVTKTogLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICBsZC5oIGxkbWFpbi5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAorICBsZGN0b3IuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oCisKK2NoZWNrLURFSkFHTlU6IHNpdGUuZXhwCisJc3Jjcm9vdD1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNyb290OyBcCisJcj1gcHdkYDsgZXhwb3J0IHI7IFwKKwlFWFBFQ1Q9JChFWFBFQ1QpOyBleHBvcnQgRVhQRUNUOyBcCisJaWYgWyAtZiAkKHRvcF9idWlsZGRpcikvLi4vZXhwZWN0L2V4cGVjdCBdOyB0aGVuIFwKKwkgIFRDTF9MSUJSQVJZPWBjZCAkKHRvcF9zcmNkaXIpLy4uL3RjbC9saWJyYXJ5ICYmIHB3ZGA7IFwKKwkgIGV4cG9ydCBUQ0xfTElCUkFSWTsgXAorCWZpOyBcCisJcnVudGVzdD0kKFJVTlRFU1QpOyBcCisJaWYgJChTSEVMTCkgLWMgIiQkcnVudGVzdCAtLXZlcnNpb24iID4gL2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgJCRydW50ZXN0IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHtzcmNyb290fS90ZXN0c3VpdGUgXAorCQlDQz0iJChDQ19GT1JfVEFSR0VUKSIgQ0ZMQUdTPSIkKENGTEFHUykiIFwKKwkJQ1hYPSIkKENYWF9GT1JfVEFSR0VUKSIgQ1hYRkxBR1M9IiQoQ1hYRkxBR1MpIiBcCisJCUNDX0ZPUl9IT1NUPSIkKENDKSIgQ0ZMQUdTX0ZPUl9IT1NUPSIkKENGTEFHUykiIFwKKwkJT0ZJTEVTPSIkKE9GSUxFUykiIEJGRExJQj0iJChURVNUQkZETElCKSIgXAorCQlMSUJJQkVSVFk9IiQoTElCSUJFUlRZKSAkKElOVExMSUJTKSIgXAorCQkkKFJVTlRFU1RGTEFHUyk7IFwKKwllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAorCWZpCisKKyMgUnVsZXMgZm9yIHRlc3RpbmcgYnkgcmVsaW5raW5nIGxkIGl0c2VsZi4KKyMgQSBzaW1pbGFyIHRlc3QgaXMgaW4gdGhlIHRlc3RzdWl0ZS4gIFRoaXMgdGFyZ2V0IGlzIGZvciBlYXNlIG9mIHVzZQorIyB3aGVuIHBvcnRpbmcgbGQuCisKK2xkLXBhcnRpYWwubzogbGQtbmV3JChFWEVFWFQpCisJLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQtcGFydGlhbC5vIC1yICQoT0ZJTEVTKQorbGQxJChFWEVFWFQpOiBsZC1wYXJ0aWFsLm8KKwkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApIGxkLXBhcnRpYWwubyAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKKworbGQxLWZ1bGwkKEVYRUVYVCk6IGxkLW5ldworCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMS1mdWxsJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCisKK2xkMiQoRVhFRVhUKTogbGQxJChFWEVFWFQpCisJLi9sZDEkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQyJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCisKK2xkMyQoRVhFRVhUKTogbGQyJChFWEVFWFQpCisJLi9sZDIkKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQzJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSAkKE9GSUxFUykgJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCisKK2Jvb3RzdHJhcDogbGQzJChFWEVFWFQpCisJY21wIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkKKworLlBIT05ZOiBib290c3RyYXAKKworIyBBIHRlc3QgcHJvZ3JhbSBmb3IgQysrIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuCisjIFRoaXMgdGVzdCBpcyBub3cgaW4gdGhlIHRlc3RzdWl0ZS4KKyMKKyNjZHRlc3Q6IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKKyMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0ICQoSE9TVElOR19DUlQwKSBcCisjCSAgY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vICQoSE9TVElOR19MSUJTKQorIworI2NkdGVzdC5vdXQ6IGNkdGVzdAorIwkuL2NkdGVzdCA+IGNkdGVzdC50bXAKKyMJbXYgY2R0ZXN0LnRtcCBjZHRlc3Qub3V0CisjCisjY2R0ZXN0LXVyLm86IGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyBsZC5uZXcKKyMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyLm8gLVVyIGNkdGVzdC1tYWluLm8gXAorIwkgIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8KKyMKKyNjZHRlc3QtdXI6IGNkdGVzdC11ci5vCisjCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ciAkKEhPU1RJTkdfQ1JUMCkgY2R0ZXN0LXVyLm8gXAorIwkgICQoSE9TVElOR19MSUJTKQorIworI2NkdGVzdC11ci5vdXQ6IGNkdGVzdC11cgorIwkuL2NkdGVzdC11ciA+IGNkdGVzdC11ci50bXAKKyMJbXYgY2R0ZXN0LXVyLnRtcCBjZHRlc3QtdXIub3V0CisjCisjY2hlY2stY2R0ZXN0OiBjZHRlc3Qub3V0IGNkdGVzdC11ci5vdXQgJChzcmNkaXIpL2NkdGVzdC5leHAKKyMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3Qub3V0CisjCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0LXVyLm91dAorIworIy5QSE9OWTogY2hlY2stY2R0ZXN0CisKKyMgRU5EIE9GIENIRUNLIFRBUkdFVFMKKworIyBET0NVTUVOVEFUSU9OIFRBUkdFVFMKKyMgTWFudWFsIGNvbmZpZ3VyYXRpb24gZmlsZTsgbm90IHVzdWFsbHkgYXR0YWNoZWQgdG8gbm9ybWFsIGNvbmZpZ3VyYXRpb24sCisjIGJlY2F1c2UgYWxtb3N0IGFsbCBjb25maWdzIHVzZSAiZ2VuIiB2ZXJzaW9uIG9mIG1hbnVhbC4KKyMgIFNldCBET0NWRVIgYWJvdmUgdG8gY2hhbmdlLgorY29uZmlnZG9jLnRleGk6CSR7RE9DVkVSfS1kb2MudGV4aQorCWxuIC1zICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAorCSAgfHwgbG4gJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCisJICB8fCBjcCAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkKKworbGR2ZXIudGV4aTogTWFrZWZpbGUKKwlybSAtZiAkQAorCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACisKK2xkLmluZm86ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKKwlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jICQoc3JjZGlyKS9sZC50ZXhpbmZvCisKK2xkLmR2aTogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQorCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm86JCRURVhJTlBVVFMgXAorCSAgTUFLRUlORk89IiQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtSSAkKEJGRERJUikvZG9jIiAkKFRFWEkyRFZJKSAkKHNyY2RpcikvbGQudGV4aW5mbworCisjIFdlIHdhbnQgdG8gcmVjb25maWd1cmUgaWYgY29uZmlndXJlLmhvc3Qgb3IgY29uZmlndXJlLnRndCBjaGFuZ2VzLgorY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlndXJlLmhvc3QgJChzcmNkaXIpL2NvbmZpZ3VyZS50Z3QKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCittb3N0bHljbGVhbi1sb2NhbDoKKwktcm0gLXJmIHRtcGRpcgorCisuUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKKworaW5zdGFsbC1leGVjLWxvY2FsOiBsZC1uZXckKEVYRUVYVCkKKwkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKSAkKHRvb2xkaXIpL2JpbgorCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKKwkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCW49YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCisJaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpIiBdOyB0aGVuIFwKKwkgIHJtIC1mICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCisJICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAorCSAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgbGQtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCisJZmkKKworaW5zdGFsbC1kYXRhLWxvY2FsOgorCSQobWtpbnN0YWxsZGlycykgJChzY3JpcHRkaXIpL2xkc2NyaXB0cworCWZvciBmIGluIGxkc2NyaXB0cy8qOyBkbyBcCisJICAkKElOU1RBTExfREFUQSkgJCRmICQoc2NyaXB0ZGlyKS8kJGYgOyBcCisJZG9uZQorZGlzdHN0dWZmOiAkKExERElTVFNUVUZGKSBpbmZvCitkaXN0Y2xlYW4tbG9jYWw6CisJcm0gLXJmIGxkc2NyaXB0cworCisjIFRhcmdldHMgdG8gcmVidWlsZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBNYWtlZmlsZS4KKyMgSGF2ZSB0byBnZXQgcmlkIG9mIC5kZXAxIGhlcmUgc28gdGhhdCAiJD8iIGxhdGVyIGluY2x1ZGVzIGFsbCBvZiAkKENGSUxFUykuCisuZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpIGNvbmZpZy5oCisJcm0gLWYgLmRlcDEKKwkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKKwlzZWQgLWYgZGVwLnNlZCA8LmRlcDEgPi5kZXAKKworIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KKy5kZXAxOiAkKENGSUxFUykgJChHRU5FUkFURURfQ0ZJTEVTKQorCXJtIC1mIC5kZXAyCisJZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgorCSQoREVQKSAtZiAuZGVwMiAkKElOQ0xVREVTKSAkPworCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQorCitkZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKKwlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKKwkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAorCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJworCitkZXA6IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCisJJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQorCitkZXAtaW46IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgorCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCisKK2RlcC1hbTogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCisJJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KKworLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQorCisjIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgorIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgorCitsZGN0b3IubzogbGRjdG9yLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKKyAgbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkY3Rvci5oCitsZGVtdWwubzogbGRlbXVsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZW11bC5oIFwKKyAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGVtdWwtbGlzdC5oCitsZGV4cC5vOiBsZGV4cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBsZGdyYW0uaCBsZGxhbmcuaAorbGRmaWxlLm86IGxkZmlsZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZG1haW4uaCBsZGdyYW0uaCBcCisgIGxkbGV4LmggbGRlbXVsLmgKK2xkbGFuZy5vOiBsZGxhbmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKKyAgbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGxleC5oIGxkbWlzYy5oIFwKKyAgbGRjdG9yLmggbGRmaWxlLmggJChJTkNESVIpL2ZubWF0Y2guaAorbGRtYWluLm86IGxkbWFpbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChJTkNESVIpL3Byb2dyZXNzLmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKKyAgbGRtaXNjLmggbGR3cml0ZS5oIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggXAorICBsZGxleC5oIGxkZmlsZS5oIGxkY3Rvci5oCitsZG1pc2MubzogbGRtaXNjLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKElOQ0RJUikvZGVtYW5nbGUuaCBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggXAorICBsZGdyYW0uaCBsZGxleC5oIGxkbWFpbi5oIGxkZmlsZS5oCitsZHZlci5vOiBsZHZlci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZHZlci5oIFwKKyAgbGRlbXVsLmggbGRtYWluLmgKK2xkd3JpdGUubzogbGR3cml0ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKKyAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmgKK2xleHN1cC5vOiBsZXhzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAorICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZ3JhbS5oIGxkbGV4LmggbGRmaWxlLmggXAorICBsZHZlci5oIGxkZW11bC5oCittcmkubzogbXJpLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKKyAgY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggXAorICBsZG1pc2MuaCBtcmkuaCBsZGdyYW0uaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKK2xkY3JlZi5vOiBsZGNyZWYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIFwKKyAgbGRsYW5nLmgKK3BlLWRsbC5vOiBwZS1kbGwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAorICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAorICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCisgIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oIGxkZW11bC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAuLi9iZmQvbGliY29mZi5oIGRlZmZpbGUuaAorbGRncmFtLm86IGxkZ3JhbS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCisgIGxkLmggbGRleHAuaCBsZHZlci5oIGxkbGFuZy5oIGxkZW11bC5oIGxkZmlsZS5oIGxkbWlzYy5oIFwKKyAgbGRtYWluLmggbXJpLmggbGRjdG9yLmggbGRsZXguaAorbGRsZXgubzogbGRsZXguYyAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCisgIGxkLmggbGRncmFtLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGZpbGUuaCBsZGxleC5oIFwKKyAgbGRtYWluLmgKK2RlZmZpbGVwLm86IGRlZmZpbGVwLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAorICBsZC5oIGxkbWlzYy5oIGRlZmZpbGUuaAorCisjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGQvTkVXUyBiL2xkL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyZTg0NQotLS0gL2Rldi9udWxsCisrKyBiL2xkL05FV1MKQEAgLTAsMCArMSwxOTAgQEAKKy0qLSB0ZXh0IC0qLQorCitDaGFuZ2VzIGluIHZlcnNpb24gMi4xMDoKKworKiBBZGRlZCBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIHNlY3Rpb25zLCBlbmFibGVkIGJ5IC0tZ2Mtc2VjdGlvbnMuIAorICBJdCBkb2VzIHJlcXVpcmUgYSBiaXQgb2YgYmFja2VuZCBzdXBwb3J0OyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXJlCisgIHBwYy1lbGYsIG1pcHMtZWxmLCBhbmQgbW4xMDMwMC1lbGYuICBPdGhlcnMgd2lsbCBpZ25vcmUgdGhlIG9wdGlvbi4KKworKiBBZGRlZCBTT1JUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIHRvIHBlcm1pdCBzb3J0aW5nIHNlY3Rpb25zIGJ5IGZpbGUKKyAgbmFtZSBvciBzZWN0aW9uIG5hbWUuCisKKyogQWRkZWQgRVhURVJOIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGFzIGFuIGVxdWl2YWxlbnQgdG8gdGhlIC11CisgIGNvbW1hbmQtbGluZSBvcHRpb24uCisKKyogQWRkZWQgQVNTRVJUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgorCisqIEFkZGVkIC1PIG9wdGlvbiB0byBvcHRpbWl6ZSBsaW5rZXIgb3V0cHV0IChhcyBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgb25seQorYWZmZWN0cyBFTEYgc2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbikuCisKKyogVGhlIC1lIG9wdGlvbiBub3cgYWNjZXB0cyBhIG51bWJlciBhcyB3ZWxsIGFzIGEgc3ltYm9sIG5hbWUuCisKKyogQWRkZWQgLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZSBvcHRpb25zLgorCitDaGFuZ2VzIGluIHZlcnNpb24gMi45OgorCisqIEFkZGVkIFNRVUFEIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgorCisqIE5ldyBvcHRpb24gLS1uby13YXJuLW1pc21hdGNoLgorCisqIFRoZSBNRU1PUlkgY29tbWFuZCBub3cgcGFyc2VzIHRoZSBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSB3aGVyZSBzZWN0aW9ucyB0aGF0CisgIGFyZSBub3QgcGxhY2VkIGluIGEgc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbiBhcmUgcGxhY2VkLgorCitDaGFuZ2VzIGluIHZlcnNpb24gMi44OgorCisqIExpbmtlciBzY3JpcHRzIG1heSBub3cgY29udGFpbiBzaGVsbCB3aWxkY2FyZCBjaGFyYWN0ZXJzIGZvciBmaWxlIGFuZCBzZWN0aW9uCisgIG5hbWVzLgorCisqIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIHN5bWJvbCB2ZXJzaW9ucyBpbiBFTEYuCisKKyogVGhlIE5PQ1JPU1NSRUZTIGNvbW1hbmQgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgorCisqIFRoZSBMT0FEQUREUiBleHByZXNzaW9uIHdhcyBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KKworKiBNQVggYW5kIE1JTiBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KKworKiBUaGUgT1ZFUkxBWSBjb25zdHJ1Y3Qgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgorCisqIE5ldyBvcHRpb24gLS13YXJuLXNlY3Rpb24tYWxpZ24gdG8gd2FybiB3aGVuIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCisgIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCBvZiBhbiBpbnB1dCBzZWN0aW9uLgorCisqIE5ldyBvcHRpb25zIC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNzoKKworKiBOZXcgb3B0aW9uIC0tY3JlZiB0byBwcmludCBvdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCisKKyogTmV3IG9wdGlvbiAtLXdyYXAgU1lNQk9MLgorCisqIE5ldyBvcHRpb24gLS1uby13aG9sZS1hcmNoaXZlLCB0byB0dXJuIG9mZiB0aGUgZWZmZWN0IG9mIC0td2hvbGUtYXJjaGl2ZS4KKworKiBJbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb24gL0RJU0NBUkQvIGluIHRoZSBsaW5rZXIgc2NyaXB0CisgIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgorCisqIFRoZSBTdW5PUyBhbmQgRUxGIGxpbmtlcnMgbm93IG1lcmdlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCB1c2VzCisgIHRoZSBOX0JJTkNMIGFuZCBOX0VJTkNMIHN0YWIgdHlwZXMuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcKKyAgaW5mb3JtYXRpb24gZ2VuZXJhdGVkLgorCitDaGFuZ2VzIGluIHZlcnNpb24gMi42OgorCisqIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZSBpcyByZXByZXNlbnRhYmxlIGFzIGEgQyBpZGVudGlmaWVyICh0aGlzIGlzIG5vdCB0cnVlCitvZiBtb3N0IEVMRiBzZWN0aW9uIG5hbWVzKSwgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHN5bWJvbHMKK19fc3RhcnRfU0VDTkFNRSBhbmQgX19zdG9wX1NFQ05BTUUsIHdoZXJlIFNFQ05BTUUgaXMgdGhlIHNlY3Rpb24gbmFtZSwgYXQgdGhlCitiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgZ2xpYmMuCisKKyogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lZCAuZ251Lndhcm5pbmcgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQgZmlsZSwgdGhlCitjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgZGlzcGxheWVkIGFzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGUgc2VjdGlvbiBpcworbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdXNlZCBieSBnbGliYy4KKworKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWVkIC5nbnUud2FybmluZy5TWU1CT0wgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQKK2ZpbGUsIGFuZCB0aGUgc3ltYm9sIFNZTUJPTCBpcyByZWZlcmVuY2VkIGJ5IHNvbWUgb2JqZWN0IGZpbGUsIHRoZSBjb250ZW50cyBvZgordGhlIHNlY3Rpb24gYXJlIGRpc3BsYXllZCBhcyBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIHNlY3Rpb24gaXMgbm90IGNvcGllZCBpbnRvCit0aGUgb3V0cHV0IGZpbGUsIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBvciBzaGFyZWQgbGluay4gIFRoaXMgaXMgdXNlZCBieQorZ2xpYmMuCisKKyogTmV3IG9wdGlvbnMgLXNwbGl0LWJ5LXJlbG9jIGFuZCAtc3BsaXQtYnktZmlsZS4KKworKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlIG9uIFNQQVJDIFN1bk9TLiAgSXQgY2FuCithbHNvIGNyZWF0ZSBTUEFSQyBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQsIGxpa2UgdGhlIG5hdGl2ZSBTdW5PUyBsaW5rZXIsCit3aWxsIGRvIHNvIHdoZW5ldmVyIHRoZXJlIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gdGhlIGxpbmsgYW5kIG5laXRoZXIgdGhlIC1lCitub3IgdGhlIC1yIG9wdGlvbiB3YXMgdXNlZC4KKworKiBUaGUgLXJwYXRoIG9wdGlvbiBtYXkgYmUgdXNlZCBvbiBTdW5PUyB0byBzZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUKK3NlYXJjaGVkIGF0IHJ1biB0aW1lLiAgVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb2YgYnVpbGRpbmcgdGhlIGxpc3QgZnJvbSB0aGUKKy1MIG9wdGlvbnMuCisKKyogVGhlIENPRkYgbGlua2VyIG5vdyBjb21iaW5lcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHN0cnVjdHMsIHVuaW9ucywgYW5kCitlbnVtcywgc28gdGhhdCBldmVuIGlmIHRoZSBzYW1lIHR5cGUgaXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBpbnB1dCBmaWxlcyBpdCB3aWxsCitvbmx5IGJlIGRlZmluZWQgb25jZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGUgLS10cmFkaXRpb25hbC1mb3JtYXQgc3dpdGNoIHdpbGwKK3ByZXZlbnQgdGhpcyBvcHRpbWl6YXRpb24uCisKK0NoYW5nZXMgaW4gdmVyc2lvbiAyLjU6CisKKyogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBhZ2FpbnN0IFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuICBJdCBzdGlsbCBjYW4KK25vdCBsaW5rIFN1bk9TIFBJQyAoUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSkgZmlsZXMsIHNvIGl0IGNhbiBub3QgYmUgdXNlZCB0bworZ2VuZXJhdGUgc2hhcmVkIGxpYmFyaWVzLgorCisqIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlIGkzODYKKyhVbml4V2FyZSkgYW5kIFNQQVJDIChTb2xhcmlzKS4gIEl0IGNhbiBhbHNvIGxpbmsgRUxGIFBJQyBmaWxlcywgYW5kIGNhbiBiZQordXNlZCB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzLiAgU2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbiBpcyBub3Qgd2VsbAordGVzdGVkOyBwbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBlbmNvdW50ZXJlZC4gIFRoZSBsaW5rZXIgaXMgbm93IGVuYWJsZWQgZm9yCitTb2xhcmlzIGFnYWluLgorCisqIEVyaWMgWW91bmdkYWxlIGhhcyBjb250cmlidXRlZCBMaW51eCBzdXBwb3J0IGNvZGUsIGluY2x1ZGluZyBsaW5raW5nIGFnYWluc3QKK0xpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgbGlua2VyIHByb2R1Y2VzIExpbnV4IFFNQUdJQyBiaW5hcmllcy4KKworKiBUaGUgRUxGIGJhY2tlbmQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIGNvZGUuICBUbyB1c2UgdGhlIG5ldworRUxGIGxpbmtlciwgZWFjaCBwYXJ0aWN1bGFyIHRhcmdldCByZXF1aXJlcyBhIHJlbG9jYXRpb24gZnVuY3Rpb24uICBTbyBmYXIsCit0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIGkzODYgKFVuaXhXYXJlKSwgU1BBUkMgKFNvbGFyaXMpIE1JUFMgKElyaXgKKzUpLCBhbmQgSFBQQSBFTEYgdGFyZ2V0cy4KKworKiBUaGUgLSggKC0tc3RhcnQtZ3JvdXApIGFuZCAtKSAoLS1lbmQtZ3JvdXApIG9wdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvCitzdXBwb3J0IHNlYXJjaGluZyBhIGdyb3VwIG9mIGFyY2hpdmVzIGFzIHRob3VnaCB0aGV5IHdlcmUgYSBzaW5nbGUgYXJjaGl2ZS4KK1RoaXMgY2FuIGFsc28gYmUgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQsIGFzIEdST1VQICggZmlsZXMgKS4KKworKiBXaGVuIGEgZmlsZSBpcyBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlIGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUKK2l0IGFzIGFuIG9iamVjdCBmaWxlLCB0aGUgbGlua2VyIHdpbGwgbm93IHRyZWF0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdAorZmlsZS4gIEEgbGlua2VyIHNjcmlwdCBuYW1lZCBpbiB0aGlzIHdheSBhdWdtZW50cywgYnV0IGRvZXMgbm90IHJlcGxhY2UsIHRoZQorZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgorCisqIFRoZSAtd2Fybi1vbmNlIG9wdGlvbiB3YXMgYWRkZWQuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBvbmx5IHdhcm4gb25jZSBwZXIKK3VuZGVmaW5lZCBzeW1ib2wsIHJhdGhlciB0aGFuIG9uY2UgcGVyIHJlZmVyZW5jZS4KKworKiBUaGUgQ09GRiBiYWNrZW5kIGhhcyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBjb2RlLiAgQXMgd2l0aCBFTEYsIHRvCit1c2UgdGhlIG5ldyBsaW5rZXIsIGVhY2ggcGFydGljdWxhciB0YXJnZXQgcmVxdWlyZXMgYSByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgU28KK2ZhciwgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciB0aGUgaTM4NiwgbTY4aywgYTI5ayBhbmQgU0ggdGFyZ2V0cy4KKworKiBUaGUgLVYgZmxhZyB3YXMgbWFkZSBhIHN5bm9ueW0gZm9yIC12LCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LiAgVGhlIG9sZCAtVgorYmVoYXZpb3VyIGlzIGF2YWlsYWJsZSB2aWEgLS12ZXJib3NlLgorCitDaGFuZ2VzIGluIHZlcnNpb24gMi40OgorCisqIE5ldyBsaW5rZXIgY29kZSwgYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBUYXlsb3IuICBGb3IgYS5vdXQgYW5kIGVjb2ZmCisgIGZvcm1hdHMgKHNvIGZhciksIHRoaXMgc2hvdWxkIHJlc3VsdCBpbiBjb25zaWRlcmFibGUgc2F2aW5ncyBpbiB0aW1lCisgIGFuZCBtZW1vcnkgdXNlZCB3aGlsZSBsaW5raW5nOyBzbGlnaHRseSBwb29yZXIgcGVyZm9ybWFuY2UgdGhhbgorICBiZWZvcmUgZm9yIGZvcm1hdHMgbm90IGNvbnZlcnRlZCB5ZXQuCisKKyogQ29tbWFuZC1saW5lIHBhcnNpbmcgaXMgbm8gbG9uZ2VyIGRvbmUgd2l0aCBmbGV4LiAgVGhpcyBtZWFucworICBvZGRiYWxsIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzIHdvbid0IGdldCB0cmVhdGVkIGFzIGFyZ3VtZW50CisgIHNlcGFyYXRvcnMuCisKKyogSFAtUEEgRUxGIHN1cHBvcnQsIGJ5IEplZmYgTGF3LiAgKE5vIFNPTSBzdXBwb3J0IHlldC4pCisKKyogTWFjaCBpMzg2IHN1cHBvcnQsIGJ5IERhdmlkIE1hY2tlbnppZS4KKworKiBJcml4IDQgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm93IHN1cHBvcnRlZCAoSXJpeCA1IHVzZXMgRUxGLCBhbmQgRUxGIHNoYXJlZAorICBsaWJyYXJpZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkKS4KKworKiBDT0ZGIHNoYXJlZCBsaWJyYXJpZXMgKGFzIG9uIFNDTykgc2hvdWxkIHdvcmsgYXMgd2VsbC4KKworKiBUaGUgbGlua2VyIGlzIGRpc2FibGVkIGZvciBTb2xhcmlzLiAgKEFjdHVhbGx5LCBpdCB3YXMgaW4gMi4zIGFsc28sIEkganVzdAorICBmb3Jnb3QgdG8gbm90ZSBpdC4pICBTb21lIG9mIHRoZWlyIEMgbGlicmFyeSByb3V0aW5lcyBkb24ndCB3b3JrIHdoZW4KKyAgc3RhdGljYWxseSBsaW5rZWQsIGFuZCB0aGUgR05VIGxpbmtlciBkb2Vzbid0IHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHlldC4KKworQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMzoKKworKiBXZWFrIHN5bWJvbHMgYXJlIG5vdyBzdXBwb3J0ZWQuCisKKyogRUxGIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICBUaGUgbGlua2VyIGhhcyBiZWVuIGJvb3RzdHJhcHBlZCBvbgorICBVbml4V2FyZSBhbmQgU29sYXJpcy4KKworKiBBbHBoYSBPU0YvMSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIChub24gZHluYW1pYyBsaW5raW5nIG9ubHkpLgorCitDaGFuZ2VzIGluIHZlcnNpb24gMi4yOgorCisqIFRoZSBgYmZkJyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVkdWNlIGEub3V0LWZvcm1hdCBzdHJpbmcKKyAgdGFibGUgc2l6ZS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGZpbGVzIGxpbmtlZCBmcm9tIG1hbnkgaW5wdXQKKyAgZmlsZXMgd2l0aCBkdXBsaWNhdGUgc3ltYm9scyAoYC1nJyBkZWJ1Z2dpbmcgcmVjb3Jkcywgb3IgaWRlbnRpY2FsCisgIHN0YXRpYyBzeW1ib2xzKSBzaG91bGQgYmUgbXVjaCBzbWFsbGVyLgorCitDaGFuZ2VzIGluIHZlcnNpb24gMi4xOgorCisqIFRoZSBsZCAteVNZTUJPTCBmbGFnICh0byB0cmFjZSByZWZlcmVuY2VzIHRvIFNZTUJPTCkgaXMgbm93IGltcGxlbWVudGVkLgorCisqIFRoZXJlIGlzIG5vdyBzdXBwb3J0IGZvciB3cml0aW5nIEVDT0ZGIGZpbGVzLCBzbyBsZCBhbmQgdGhlCisgIG90aGVyIHV0aWxpdGllcyBzaG91bGQgd29yayBvbiBSaXNjL1VsdHJpeCBhbmQgSXJpeC4KKworDAorTG9jYWwgdmFyaWFibGVzOgorZmlsbC1jb2x1bW46IDc5CitFbmQ6CmRpZmYgLS1naXQgYS9sZC9SRUFETUUgYi9sZC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0N2QwNAotLS0gL2Rldi9udWxsCisrKyBiL2xkL1JFQURNRQpAQCAtMCwwICsxLDY0IEBACitUaGlzIGlzIHRoZSBHTlUgbGlua2VyLiAgSXQgaXMgZGlzdHJpYnV0ZWQgd2l0aCBvdGhlciAiYmluYXJ5Cit1dGlsaXRpZXMiIHdoaWNoIHNob3VsZCBiZSBpbiAuLi9iaW51dGlscy4gIFNlZSAuLi9iaW51dGlscy9SRUFETUUgZm9yCittb3JlIGdlbmVyYWwgbm90ZXMsIGluY2x1ZGluZyB3aGVyZSB0byBzZW5kIGJ1ZyByZXBvcnRzLgorCitUaGVyZSBhcmUgbWFueSBmZWF0dXJlcyBvZiB0aGUgbGlua2VyOgorCisqIFRoZSBsaW5rZXIgdXNlcyBhIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeSAoLi4vYmZkKQorICB0aGF0IGl0IHVzZXMgdG8gcmVhZCBhbmQgd3JpdGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBoZWxwcworICBpbnN1bGF0ZSB0aGUgbGlua2VyIGl0c2VsZiBmcm9tIHRoZSBmb3JtYXQgb2Ygb2JqZWN0IGZpbGVzLgorCisqIFRoZSBsaW5rZXIgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlCisgIGZvcm1hdHMuICBJdCBjYW4gZXZlbiBoYW5kbGUgbXVsdGlwbGUgZm9ybWF0cyBhdCBvbmNlOgorICBSZWFkIHR3byBpbnB1dCBmb3JtYXRzIGFuZCB3cml0ZSBhIHRoaXJkLgorCisqIFRoZSBsaW5rZXIgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGNyb3NzLWxpbmtpbmcuCisKKyogVGhlIGxpbmtlciBzdXBwb3J0cyBhIGNvbnRyb2wgbGFuZ3VhZ2UuCisKKyogVGhlcmUgaXMgYSB1c2VyIG1hbnVhbCAobGQudGV4aW5mbyksIGFzIHdlbGwgYXMgdGhlCisgIGJlZ2lubmluZ3Mgb2YgYW4gaW50ZXJuYWxzIG1hbnVhbCAobGRpbnQudGV4aW5mbykuCisKK0luc3RhbGxhdGlvbgorPT09PT09PT09PT09CisKK1NlZSAuLi9iaW51dGlscy9SRUFETUUuCisKK0lmIHlvdSB3YW50IHRvIG1ha2UgYSBjcm9zcy1saW5rZXIsIHlvdSBtYXkgd2FudCB0byBzcGVjaWZ5CithIGRpZmZlcmVudCBzZWFyY2ggcGF0aCBvZiAtbGZvbyBsaWJyYXJpZXMgdGhhbiB0aGUgZGVmYXVsdC4KK1lvdSBjYW4gZG8gdGhpcyBieSBzZXR0aW5nIHRoZSBMSUJfUEFUSCB2YXJpYWJsZSBpbiAuL01ha2VmaWxlLgorCitUbyBidWlsZCBqdXN0IHRoZSBsaW5rZXIsIG1ha2UgdGhlIHRhcmdldCBhbGwtbGQgZnJvbSB0aGUgdG9wIGxldmVsCitkaXJlY3RvcnkgKG9uZSBkaXJlY3RvcnkgYWJvdmUgdGhpcyBvbmUpLgorCitQb3J0aW5nIHRvIGEgbmV3IHRhcmdldAorPT09PT09PT09PT09PT09PT09PT09PT0KKworU2VlIHRoZSBsZGludC50ZXhpbmZvIG1hbnVhbC4KKworUmVwb3J0aW5nIGJ1Z3MgZXRjCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU2VlIC4uL2JpbnV0aWxzL1JFQURNRS4KKworS25vd24gcHJvYmxlbXMKKz09PT09PT09PT09PT09CisKK1RoZSBTb2xhcmlzIGxpbmtlciBub3JtYWxseSBleHBvcnRzIGFsbCBkeW5hbWljIHN5bWJvbHMgZnJvbSBhbgorZXhlY3V0YWJsZS4gIFRoZSBHTlUgbGlua2VyIGRvZXMgbm90IGRvIHRoaXMgYnkgZGVmYXVsdC4gIFRoaXMgaXMKK2JlY2F1c2UgdGhlIEdOVSBsaW5rZXIgdHJpZXMgdG8gcHJlc2VudCB0aGUgc2FtZSBpbnRlcmZhY2UgZm9yIGFsbAorc2ltaWxhciB0YXJnZXRzIChpbiB0aGlzIGNhc2UsIGFsbCBuYXRpdmUgRUxGIHRhcmdldHMpLiAgVGhpcyBkb2VzIG5vdAorbWF0dGVyIGZvciBub3JtYWwgcHJvZ3JhbXMsIGJ1dCBpdCBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgZm9yIHByb2dyYW1zCit3aGljaCB0cnkgdG8gZGxvcGVuIGFuIGV4ZWN1dGFibGUsIHN1Y2ggYXMgUEVSTCBvciBUY2wuICBZb3UgY2FuIG1ha2UKK3RoZSBHTlUgbGlua2VyIGV4cG9ydCBhbGwgZHluYW1pYyBzeW1ib2xzIHdpdGggdGhlIC1FIG9yCistLWV4cG9ydC1keW5hbWljIGNvbW1hbmQgbGluZSBvcHRpb24uCisKK0hQL1VYIDkuMDEgaGFzIGEgc2hlbGwgYnVnIHRoYXQgY2F1c2VzIHRoZSBsaW5rZXIgc2NyaXB0cyB0byBiZQorZ2VuZXJhdGVkIGluY29ycmVjdGx5LiAgVGhlIHN5bXB0b20gb2YgdGhpcyBhcHBlYXJzIHRvIGJlICJmYXRhbCBlcnJvcgorLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdyIgZXJyb3IgbWVzc2FnZXMuICBUaGVyZSBhcmUgdmFyaW91cword29ya2Fyb3VuZHMgdG8gdGhpczoKKyAgKiBCdWlsZCBhbmQgaW5zdGFsbCBiYXNoLCBhbmQgYnVpbGQgd2l0aCAibWFrZSBTSEVMTD1iYXNoIi4KKyAgKiBVcGRhdGUgdG8gYSB2ZXJzaW9uIG9mIEhQL1VYIHdpdGggYSB3b3JraW5nIHNoZWxsIChlLmcuLCA5LjA1KS4KKyAgKiBSZXBsYWNlICIoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIiBpbgorICAgIGdlbnNjcmlwdHMuc2ggd2l0aCAic2ggJHtzcmNkaXJ9Li4uIiAobm8gcGFyZW5zKSBhbmQgbWFrZSBzdXJlIHRoZQorICAgIGVtdWxwYXJhbXMgc2NyaXB0IHVzZWQgZXhwb3J0cyBhbnkgc2hlbGwgdmFyaWFibGVzIGl0IHNldHMuCmRpZmYgLS1naXQgYS9sZC9UT0RPIGIvbGQvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNkOThiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1ZvbHVudGVlcnMgdG8gdGFja2xlIHNvbWUgb2YgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSB3ZWxjb21lOgorCitTdXBwb3J0IHRoZSAidHJhZGl0aW9uYWwiIEJTRCAgLUEgZmxhZyAoaW5jcmVtZW50YWwgbG9hZGluZykuCisoVGhlcmUgaXMgYSAtQSBmbGFnIGluIGxkIG5vdywgYnV0IGl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKK2FyY2hpdGVjdHVyZS4gIFRoYXQgc2hvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQuKQorCitTdXBwb3J0IGZvciBkeW5hbWljIGxvYWRpbmcgKGEgbGEgZGxkLCBidXQgYmZkLWJhc2VkKSB3b3VsZCBiZSBuaWNlLgorCitBdm9pZCByZS1vcGVuIChhbmQgcmUtc2Vla2luZykgb3V0cHV0IGJmZCBhbmQgYXJjaGl2ZXMuCmRpZmYgLS1naXQgYS9sZC9hY2luY2x1ZGUubTQgYi9sZC9hY2luY2x1ZGUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMDliOQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2FjaW5jbHVkZS5tNApAQCAtMCwwICsxIEBACitzaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvbGQvYWNsb2NhbC5tNCBiL2xkL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5MzRiMAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2FjbG9jYWwubTQKQEAgLTAsMCArMSwxMTIwIEBACitkbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuNAorCitkbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2RubCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorZG5sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworZG5sIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorZG5sIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CitkbmwgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorZG5sIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCisjIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KKyMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgc2VyaWFsIDEKKworZG5sIFVzYWdlOgorZG5sIEFNX0lOSVRfQVVUT01BS0UocGFja2FnZSx2ZXJzaW9uLCBbbm8tZGVmaW5lXSkKKworQUNfREVGVU4oQU1fSU5JVF9BVVRPTUFLRSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQorUEFDS0FHRT1bJDFdCitBQ19TVUJTVChQQUNLQUdFKQorVkVSU0lPTj1bJDJdCitBQ19TVUJTVChWRVJTSU9OKQorZG5sIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQorZmkKK2lmZWxzZShbJDNdLCwKK0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKK0FDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pKQorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSkKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSkKK2RubCBGSVhNRSBUaGlzIGlzIHRydWx5IGdyb3NzLgorbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlciwgJG1pc3NpbmdfZGlyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbywgJG1pc3NpbmdfZGlyKQorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4KKyMKKworQUNfREVGVU4oQU1fU0FOSVRZX0NIRUNLLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiWyRdKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlYAorICAgZmkKKyAgIGlmIHRlc3QgIlskXSoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiWyRdKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgZmkKKworICAgdGVzdCAiWyRdMiIgPSBjb25mdGVzdGZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworZG5sIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNLCBESVJFQ1RPUlkpCitkbmwgVGhlIHByb2dyYW0gbXVzdCBwcm9wZXJseSBpbXBsZW1lbnQgLS12ZXJzaW9uLgorQUNfREVGVU4oQU1fTUlTU0lOR19QUk9HLAorW0FDX01TR19DSEVDS0lORyhmb3Igd29ya2luZyAkMikKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmICgkMiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICQxPSQyCisgICBBQ19NU0dfUkVTVUxUKGZvdW5kKQorZWxzZQorICAgJDE9IiQzL21pc3NpbmcgJDIiCisgICBBQ19NU0dfUkVTVUxUKG1pc3NpbmcpCitmaQorQUNfU1VCU1QoJDEpXSkKKworCisjIHNlcmlhbCAzNSBBQ19QUk9HX0xJQlRPT0wKK0FDX0RFRlVOKEFDX1BST0dfTElCVE9PTCwKK1tBQ19SRVFVSVJFKFtBQ19MSUJUT09MX1NFVFVQXSlkbmwKKworIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0CitBQ19DQUNIRV9TQVZFCisKKyMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCitDQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKK0xEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKK0RMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCiske0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCiskbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAorfHwgQUNfTVNHX0VSUk9SKFtsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWRdKQorCisjIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCitBQ19DQUNIRV9MT0FECisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCisjIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAorIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KK2V4ZWMgNT4+Li9jb25maWcubG9nCitdKQorCitBQ19ERUZVTihBQ19MSUJUT09MX1NFVFVQLAorW0FDX1BSRVJFUSgyLjEzKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NIQVJFRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCitBQ19SRVFVSVJFKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKK2RubAorCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgorbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKK3Rlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCit0ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgordGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCit0ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICIkaG9zdCIgaW4KKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCisgICAgW0FDX1RSWV9MSU5LKFtdLFtdLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKV0pCisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CisKKyotKi1jeWd3aW4qKQorICBBQ19TWVNfTElCVE9PTF9DWUdXSU4KKyAgOzsKKworZXNhYworCisjIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKKworQUNfQVJHX0VOQUJMRShsaWJ0b29sLWxvY2ssCitbICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmddLAorbmVlZF9sb2Nrcz0kZW5hYmxldmFsLAorbmVlZF9sb2Nrcz15ZXMpCisKK2lmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KKyAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCitmaQorXSkKKworIyBBQ19MSUJUT09MX0RMT1BFTiAtIGNoZWNrIGZvciBkbG9wZW4gc3VwcG9ydAorQUNfREVGVU4oQUNfTElCVE9PTF9ETE9QRU4sIFtsdF9kbG9wZW49eWVzXSkKKworIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBQ19FTkFCTEVfU0hBUkVELAorW2RlZmluZShbQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKHNoYXJlZCwKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCitdKQorCisjIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKK0FDX0RFRlVOKEFDX0RJU0FCTEVfU0hBUkVELAorW0FDX0VOQUJMRV9TSEFSRUQobm8pXSkKKworIyBBQ19FTkFCTEVfU1RBVElDIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX1NUQVRJQ1soREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihBQ19FTkFCTEVfU1RBVElDLAorW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKHN0YXRpYywKK2NoYW5nZXF1b3RlKDw8LCA+PilkbmwKKzw8ICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PT4+QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CitubykgZW5hYmxlX3N0YXRpYz1ubyA7OworKikKKyAgZW5hYmxlX3N0YXRpYz1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3N0YXRpYz1BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFQpZG5sCitdKQorCisjIEFDX0RJU0FCTEVfU1RBVElDIC0gc2V0IHRoZSBkZWZhdWx0IHN0YXRpYyBmbGFnIHRvIC0tZGlzYWJsZS1zdGF0aWMKK0FDX0RFRlVOKEFDX0RJU0FCTEVfU1RBVElDLAorW0FDX0VOQUJMRV9TVEFUSUMobm8pXSkKKworCisjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBmbGFnCisjIFVzYWdlOiBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMWyhERUZBVUxUKV0KKyMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KKyMgICBgeWVzJy4KK0FDX0RFRlVOKEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwsCitbZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Oworbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyopCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjXSwKK2VuYWJsZV9mYXN0X2luc3RhbGw9QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUKWRubAorXSkKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gc2V0IHRoZSBkZWZhdWx0IHRvIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwKK0FDX0RFRlVOKEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMLAorW0FDX0VOQUJMRV9GQVNUX0lOU1RBTEwobm8pXSkKKworCisjIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKK0FDX0RFRlVOKEFDX1BST0dfTEQsCitbQUNfQVJHX1dJVEgoZ251LWxkLAorWyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXV0sCit0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMsIHdpdGhfZ251X2xkPW5vKQorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorYWNfcHJvZz1sZAoraWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQorICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCisgIGNhc2UgIiRhY19wcm9nIiBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorY2hhbmdlcXVvdGUoLClkbmwKKyAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKK2NoYW5nZXF1b3RlKFssXSlkbmwKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZWxzZQorICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRhY19jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorQUNfU1VCU1QoTEQpCitBQ19QUk9HX0xEX0dOVQorXSkKKworQUNfREVGVU4oQUNfUFJPR19MRF9HTlUsCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgYWNfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KK2lmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ251X2xkPW5vCitmaV0pCitdKQorCisjIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKK0FDX0RFRlVOKEFDX1BST0dfTk0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgYWNfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKyAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisgICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisgICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgorCWJyZWFrCisgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCisJYnJlYWsKKyAgICAgIGVsc2UKKwlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCitmaV0pCitOTT0iJGFjX2N2X3BhdGhfTk0iCitBQ19NU0dfUkVTVUxUKFskTk1dKQorQUNfU1VCU1QoTk0pCitdKQorCisjIEFDX1NZU19OTV9QQVJTRSAtIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZAorIyBieSBDIHN5bWJvbCBuYW1lIGZyb20gbm0uCitBQ19ERUZVTihBQ19TWVNfTk1fUEFSU0UsCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUsCitbIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQorCitjaGFuZ2VxdW90ZSgsKWRubAorIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorYWNfc3ltY29kZT0nW0JDREVHUlNUXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCithY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCithY19zeW14ZnJtPSdcMSBcMlwzIFwzJworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCithY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeCopCisgIGFjX3N5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyopCisgIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopCisgIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICA7OworaXJpeCopCisgIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgYWNfc3ltY29kZT0nW0JEVF0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgoraWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisgIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJworZmkKK2NoYW5nZXF1b3RlKFssXSlkbmwKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJGFjX3N5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBhY19waXBlX3dvcmtzPW5vCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKKworICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgIAorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisKKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgorCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkYWNfbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitjaGFuZ2VxdW90ZSgsKWRubAorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9CitjaGFuZ2VxdW90ZShbLF0pZG5sCit7CitFT0YKKwlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKKwljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0CisJICBhY19zYXZlX0xJQlM9IiRMSUJTIgorCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisJICAgIGFjX3BpcGVfd29ya3M9eWVzCisJICBlbHNlCisJICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworCSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCisJICBmaQorCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQworICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICBlbHNlCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KKyAgICBmaQorICAgIGJyZWFrCisgIGVsc2UKKyAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKKworYWNfcmVzdWx0PXllcworaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgICBhY19yZXN1bHQ9bm8KK2ZpCitBQ19NU0dfUkVTVUxUKCRhY19yZXN1bHQpCitdKQorCisjIEFDX1NZU19MSUJUT09MX0NZR1dJTiAtIGZpbmQgdG9vbHMgbmVlZGVkIG9uIGN5Z3dpbgorQUNfREVGVU4oQUNfU1lTX0xJQlRPT0xfQ1lHV0lOLAorW0FDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCitBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCitdKQorCisjIEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSAtIGRvZXMgdGhlIGNvbXBpbGVyIHByZWZpeCBnbG9iYWwgc3ltYm9scworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIHVuZGVyc2NvcmU/CitBQ19ERUZVTihBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUsCitbQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCitBQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9sc10pCitBQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlLAorW2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgordm9pZCBubV90ZXN0X2Z1bmMoKXt9CitpbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKK2lmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICBhY19ubGlzdD1jb25mdGVzdC5ubQorICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgIGVsc2UKKyAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQworICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCitmaQorcm0gLXJmIGNvbmZ0ZXN0KgorXSkKK0FDX01TR19SRVNVTFQoJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSkKK1VTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KK0FDX1NVQlNUKFVTRV9TWU1CT0xfVU5ERVJTQ09SRSlkbmwKK10pCisKKyMgQUNfQ0hFQ0tfTElCTSAtIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKEFDX0NIRUNLX0xJQk0sIFsKK0FDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wpCitBQ19DSEVDS19MSUIobSwgY29zKQorXSkKKworIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKKyMgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSwgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvCisjIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgorIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCisjIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCisjICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCisjIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCitBQ19ERUZVTihBQ19MSUJMVERMX0NPTlZFTklFTkNFLCBbCisgIGNhc2UgIiRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSIgaW4KKyAgbm8pIEFDX01TR19FUlJPUihbdGhpcyBwYWNrYWdlIG5lZWRzIGEgY29udmVuaWVuY2UgbGlibHRkbF0pIDs7CisgICIiKSBlbmFibGVfbHRkbF9jb252ZW5pZW5jZT15ZXMKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSIgOzsKKyAgZXNhYworICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKK10pCisKKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCisjIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnksIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0bworIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKKyMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAorIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAorIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90CisjIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcworIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgorIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCitBQ19ERUZVTihBQ19MSUJMVERMX0lOU1RBTExBQkxFLCBbCisgIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLCBMSUJMVERMPSItbGx0ZGwiLCBbCisgICAgY2FzZSAiJGVuYWJsZV9sdGRsX2luc3RhbGwiIGluCisgICAgbm8pIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKSA7OworICAgICIiKSBlbmFibGVfbHRkbF9pbnN0YWxsPXllcworICAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIgOzsKKyAgICBlc2FjCisgIF0pCisgIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgIT0geCJubyI7IHRoZW4KKyAgICBMSUJMVERMPWlmZWxzZSgkIywxLCQxLFsnJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnXSkvbGlibHRkbC5sYQorICBmaQorXSkKKworZG5sIG9sZCBuYW1lcworQUNfREVGVU4oQU1fUFJPR19MSUJUT09MLCBbaW5kaXIoW0FDX1BST0dfTElCVE9PTF0pXSlkbmwKK0FDX0RFRlVOKEFNX0VOQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRU5BQkxFX1NIQVJFRF0sICRAKV0pZG5sCitBQ19ERUZVTihBTV9FTkFCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0VOQUJMRV9TVEFUSUNdLCAkQCldKWRubAorQUNfREVGVU4oQU1fRElTQUJMRV9TSEFSRUQsIFtpbmRpcihbQUNfRElTQUJMRV9TSEFSRURdLCAkQCldKWRubAorQUNfREVGVU4oQU1fRElTQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRElTQUJMRV9TVEFUSUNdLCAkQCldKWRubAorQUNfREVGVU4oQU1fUFJPR19MRCwgW2luZGlyKFtBQ19QUk9HX0xEXSldKWRubAorQUNfREVGVU4oQU1fUFJPR19OTSwgW2luZGlyKFtBQ19QUk9HX05NXSldKWRubAorQUNfREVGVU4oQU1fU1lTX05NX1BBUlNFLCBbaW5kaXIoW0FDX1NZU19OTV9QQVJTRV0pXSlkbmwKK0FDX0RFRlVOKEFNX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwgW2luZGlyKFtBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkVdKV0pZG5sCitBQ19ERUZVTihBTV9TWVNfTElCVE9PTF9DWUdXSU4sIFtpbmRpcihbQUNfU1lTX0xJQlRPT0xfQ1lHV0lOXSldKWRubAorCisjIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCisKK0FDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCitbQUNfUFJFUkVRKFsyLjEyXSkKK0FDX0NPTkZJR19IRUFERVIoWyQxXSkKK2RubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgorZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKK2RubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KK0FDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKK2lmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKKzw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCis8PGFtX2luZHg9MQorZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbworICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCisgICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+CisgICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKKyAgICA7OworICBlc2FjCisgIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAorZG9uZTw8Pj5kbmw+PikKK2NoYW5nZXF1b3RlKFssXSkpXSkKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworQUNfREVGVU4oQ1lfV0lUSF9OTFMsCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKKyAgICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKKyAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICAgIEFDX1NVQlNUKFVTRV9OTFMpCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQorICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKwlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KKwlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKKwkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAorCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCisJICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKKwkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQorCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCisJCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKKwkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQorCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKwkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAorCQkgIFtDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCisJCSAgW0NBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliXSkKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCV0pCisKKwlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KKyAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KKworICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgorCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKKyAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorICAgICAgICBBQ19TVUJTVChNU0dGTVQpCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisJZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKwlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBBQ19NU0dfUkVTVUxUKAorCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKKyAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCisgICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKENBVEFMT0dTKQorICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKyAgICBBQ19TVUJTVChHTU9GSUxFUykKKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorICAgIEFDX1NVQlNUKElOVExERVBTKQorICAgIEFDX1NVQlNUKElOVExMSUJTKQorICAgIEFDX1NVQlNUKElOVExPQkpTKQorICAgIEFDX1NVQlNUKFBPRklMRVMpCisgICAgQUNfU1VCU1QoUE9TVUIpCisgIF0pCisKK0FDX0RFRlVOKENZX0dOVV9HRVRURVhULAorICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKworICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQorICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQorCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCisgICBmaQorCisgICBBTV9MQ19NRVNTQUdFUworICAgQ1lfV0lUSF9OTFMKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCisgICAgIGZpCisKKyAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCisgICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKKyAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKKworICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQorICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6CisgICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAorICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQorCisJIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcworICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCisJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCisgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKKyAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKKyAgIGRubCBwYWNrYWdlcy4KKyAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICBBQ19TVUJTVChHVF9OTykKKyAgIEFDX1NVQlNUKEdUX1lFUykKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKKworICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCisgICBsPQorICAgQUNfU1VCU1QobCkKKworICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKKyAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQorICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCisgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgXSkKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAorZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKK1sjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIFskM107IHRoZW4KKwlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAorZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCitpZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgorXSlkbmwKKyAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoWyRdJDEpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorQUNfU1VCU1QoJDEpZG5sCitdKQorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAorICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAorICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisJCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCisgICAgZmkKKyAgZmldKQorCisKK2RubCBBTV9QUk9HX0xFWAorZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKK0FDX0RFRlVOKEFNX1BST0dfTEVYLAorW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKK0FDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKK0FDX1BST0dfTEVYCitBQ19ERUNMX1lZVEVYVF0pCisKKyMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgorIyBGcm9tIEppbSBNZXllcmluZworCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKKyAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAorWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKKyAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKKyAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCisgIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCisgIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisgIEFDX1NVQlNUKE1BSU5UKWRubAorXQorKQorCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorCitBQ19ERUZVTihBTV9DT05ESVRJT05BTCwKK1tBQ19TVUJTVCgkMV9UUlVFKQorQUNfU1VCU1QoJDFfRkFMU0UpCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaV0pCisKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZy5pbiBiL2xkL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE1MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvY29uZmlnLmluCkBAIC0wLDAgKzEsMTcxIEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiBsZXggZGVjbGFyZXMgeXl0ZXh0IGFzIGEgY2hhciAqIGJ5IGRlZmF1bHQsIG5vdCBhIGNoYXJbXS4gICovCisjdW5kZWYgWVlURVhUX1BPSU5URVIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRENHRVRURVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NCUksKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVExPQ0FMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ESVJFTlRfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX05ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfRElSX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX05ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSAorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBQQUNLQUdFCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAqLworI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4KKworLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgorCisvKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKKworLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCisKKy8qIERlZmluZSBpZiBnZXRlbnYgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKKworLyogRGVmaW5lIGlmIGVudmlyb24gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FTlZJUk9OCisKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZSBiL2xkL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZDU3M2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvY29uZmlndXJlCkBAIC0wLDAgKzEsNTIxNCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1sZG1haW4uYworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjE1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MzM6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjY4OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcyMTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKKyAgIGZpCisgICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQorICAgZmkKKworICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3Nzg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworCitQQUNLQUdFPWxkCisKK1ZFUlNJT049Mi45LjQKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9CitmaQorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitFT0YKKworCisKK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBQ0xPQ0FMPWFjbG9jYWwKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODM3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPQ09ORj1hdXRvY29uZgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT01BS0U9YXV0b21ha2UKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg2MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIE1BS0VJTkZPPW1ha2VpbmZvCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKK25vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisqKQorICBlbmFibGVfc2hhcmVkPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc2hhcmVkPXllcworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKK25vKSBlbmFibGVfc3RhdGljPW5vIDs7CisqKQorICBlbmFibGVfc3RhdGljPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKK25vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisqKQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMDU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDExMTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTUyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTYxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExODA6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCisgIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmkKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjIzOiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQorICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCisgIGNhc2UgIiRhY19wcm9nIiBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNDc6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorZWxzZQorICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI1MDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisgICAgICBlbHNlCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGFjX2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQordGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyODY6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitpZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCisgIGFjX2N2X3Byb2dfZ251X2xkPXllcworZWxzZQorICBhY19jdl9wcm9nX2dudV9sZD1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMDI6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KKyAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgIGFjX2N2X3BhdGhfTk09IiROTSIKK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKKwlicmVhaworICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgorCWJyZWFrCisgICAgICBlbHNlCisJYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQorZmkKK2ZpCisKK05NPSIkYWNfY3ZfcGF0aF9OTSIKK2VjaG8gIiRhY190IiIkTk0iIDE+JjYKKworCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQwOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9CisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK2FjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgorYWNfc3lteGZybT0nXDEgXDJcMyBcMycKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICBhY19zeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqKQorICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKKyAgOzsKK2hwdXgqKQorICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgOzsKK2lyaXgqKQorICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworc29sYXJpcyopCisgIGFjX3N5bWNvZGU9J1tCRFRdJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2lmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKK2ZpCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgYWNfcGlwZV93b3Jrcz1ubworICBybSAtZiBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQorRU9GCisKKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDAzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KKyAgCisgICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDA3OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KKwltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJGFjX25saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCisKKwkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCitjb25zdCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdF9wdHJfdCBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7CitFT0YKKwlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKKwljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0CisJICBhY19zYXZlX0xJQlM9IiRMSUJTIgorCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisJICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorCSAgICBhY19waXBlX3dvcmtzPXllcworCSAgZWxzZQorCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKKwkgIGZpCisJICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1CisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuYyA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICBlbHNlCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KKyAgICBmaQorICAgIGJyZWFrCisgIGVsc2UKKyAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorCitmaQorCisKK2FjX3Jlc3VsdD15ZXMKK2lmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICAgYWNfcmVzdWx0PW5vCitmaQorZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1MDU6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQoraW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxNzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKyAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCisgICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKKyAgICBlbHNlCisgICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LmMgPiY1CitmaQorcm0gLXJmIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgorVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTQzOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBybSAtZiBjb25mdGVzdGRhdGEKK2lmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCit0aGVuCisgIHJtIC1mIGNvbmZ0ZXN0ZGF0YQorICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgorZWxzZQorICBhY19jdl9wcm9nX0xOX1M9bG4KK2ZpCitmaQorTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKK2lmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KKyAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KK2Vsc2UKKyAgYWNfdG9vbF9wcmVmaXg9CitmaQorCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCitsaWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgordGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKK3Rlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCit0ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKK3Rlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKK3Rlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgIiRob3N0IiBpbgorKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICcjbGluZSAxNTg1ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTMyIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2MDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNjEyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBsdF9jdl9jY19uZWVkc19iZWxmPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKworKi0qLWN5Z3dpbiopCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgoraWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCitmaQorZmkKK0RMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorICBETExUT09MPSJmYWxzZSIKK2ZpCitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTcwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitBUz0iJGFjX2N2X3Byb2dfQVMiCitpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhczsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzQxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCitmaQorZmkKK0FTPSIkYWNfY3ZfcHJvZ19BUyIKK2lmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2Vsc2UKKyAgQVM9ImZhbHNlIgorZmkKK2ZpCisKKworICA7OworCitlc2FjCisKKyMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisgIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAorZWxzZQorICBuZWVkX2xvY2tzPXllcworZmkKKworCitpZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCisgIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgorZmkKKworCisjIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKKworIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KK0NDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAorTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAorRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKKyR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKKyRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCit8fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9CisKKyMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCisKKyMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90CisjIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgorZXhlYyA1Pj4uL2NvbmZpZy5sb2cKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgICAgICAgIDs7CisgIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWMKK2ZpCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjQtYml0LWJmZCBvciAtLWRpc2FibGUtNjQtYml0LWJmZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV82NF9iaXRfYmZkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV82NF9iaXRfYmZkIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgIHdhbnQ2ND10cnVlICA7OworICBubykgICB3YW50NjQ9ZmFsc2UgOzsKKyAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciA2NC1iaXQtYmZkIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitlbHNlCisgIHdhbnQ2ND1mYWxzZQorZmkKKworCisKKworCitpZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9CitmaQoraWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCisjIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkxMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5OTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMjM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDIwMzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNjU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDcwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDc5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwOTg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCitBTExfTElOR1VBUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTk2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyNDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNzY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyOTc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDAxOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0MDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDc2OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0ODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjUyMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTQ5OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1NTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1ODQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1OTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjE3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI2MjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2ODI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNjg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjcxMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjcxNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3Njc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzc1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgxOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI4Mjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg1ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg2MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTExOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTE5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwOTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMwOTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTI3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTMyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxODQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxODkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjQ2OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMyNTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI3OTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjk5OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMTg6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzMjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzMyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNDU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzczOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM4MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0MDg6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzQxMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDQ4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2MDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4MDU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4MzM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM4MzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mzg0MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5MDY6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM5MTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisjZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjZW5kaWYKK3JldHVybiBfX0NZR1dJTl9fOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5MjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jeWd3aW49eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2N5Z3dpbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0Kgorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgorQ1lHV0lOPQordGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5Mzk6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzk0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIF9fTUlOR1czMl9fOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9taW5ndzMyPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9taW5ndzMyPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgorTUlOR1czMj0KK3Rlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk3MDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZXhlZXh0PS5leGUKK2Vsc2UKKyAgcm0gLWYgY29uZnRlc3QqCisgIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9leGVleHQ9CisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7CisgICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiBjb25mdGVzdCoKKyAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubworZmkKK2ZpCisKK0VYRUVYVD0iIgordGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKK2FjX2V4ZWV4dD0kRVhFRVhUCisKKworZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYworZG8KKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwMDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgoraWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK3Rlc3QgLW4gIiRZQUNDIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCisKK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitmb3IgYWNfcHJvZyBpbiBmbGV4IGxleAorZG8KKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgorICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCitpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK3Rlc3QgLW4gIiRMRVgiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkTEVYIiB8fCBMRVg9IiIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IiIKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwNzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgorICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfTEVYPSJmbGV4IgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19MRVgiICYmIGFjX2N2X3Byb2dfTEVYPSJsZXgiCitmaQorZmkKK0xFWD0iJGFjX2N2X3Byb2dfTEVYIgoraWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkTEVYTElCIgordGhlbgorICBjYXNlICIkTEVYIiBpbgorICBmbGV4KikgYWNfbGliPWZsIDs7CisgICopIGFjX2xpYj1sIDs7CisgIGVzYWMKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQxMDk6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWwkYWNfbGliICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQxMTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB5eXdyYXAoKTsKKworaW50IG1haW4oKSB7Cit5eXdyYXAoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIExFWExJQj0iLWwkYWNfbGliIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTUxOiBjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfcm9vdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgVGhlIG1pbmltYWwgbGV4IHByb2dyYW0gaXMganVzdCBhIHNpbmdsZSBsaW5lOiAlJS4gIEJ1dCBzb21lIGJyb2tlbiBsZXhlcworIyAoU29sYXJpcywgSSB0aGluayBpdCB3YXMpIHdhbnQgdHdvICUlIGxpbmVzLCBzbyBhY2NvbW1vZGF0ZSB0aGVtLgorZWNobyAnJSUKKyUlJyB8ICRMRVgKK2lmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KKyAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKK2VsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCisgIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKK2Vsc2UKKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW5ub3QgZmluZCBvdXRwdXQgZnJvbSAkTEVYOyBnaXZpbmcgdXAiIDE+JjI7IGV4aXQgMTsgfQorZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgMT4mNgorTEVYX09VVFBVVF9ST09UPSRhY19jdl9wcm9nX2xleF9yb290CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDE3MjogY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQorIyBkZWZhdWx0IGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKKyMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCithY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubworZWNobyAnZXh0ZXJuIGNoYXIgKnl5dGV4dDsnID4+JExFWF9PVVRQVVRfUk9PVC5jCithY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iJExJQlMgJExFWExJQiIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQxODQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgCitpbnQgbWFpbigpIHsKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxOTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCitybSAtZiAiJHtMRVhfT1VUUFVUX1JPT1R9LmMiCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCitFT0YKKworZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDIxNDogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiID4mNQorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKKyAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KK2ZpCisKKyAgZWNobyAiJGFjX3QiIiRVU0VfTUFJTlRBSU5FUl9NT0RFIiAxPiY2CisgIAorCitpZiB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzOyB0aGVuCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPQorICBNQUlOVEFJTkVSX01PREVfRkFMU0U9JyMnCitlbHNlCisgIE1BSU5UQUlORVJfTU9ERV9UUlVFPScjJworICBNQUlOVEFJTkVSX01PREVfRkFMU0U9CitmaQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgCisKKworLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKKworCisKKworCisKK2ZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDI0ODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQyNTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjQyNTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBzYnJrCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0Mjg3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MjkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2FjX2hlYWRlcl9kaXJlbnQ9bm8KK2ZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MzQ0OiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDM0OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8JGFjX2hkcj4KK2ludCBtYWluKCkgeworRElSICpkaXJwID0gMDsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzU3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisjIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCitpZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MzgyOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1CithY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZGlyICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQzOTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWxkaXIiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NDIzOiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiID4mNQorYWNfbGliX3Zhcj1gZWNobyB4J18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWx4ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ0MzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWx4IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKKworCitjYXNlICIke2hvc3R9IiBpbgorKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOIDEKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ0NzU6IGNoZWNraW5nIHdoZXRoZXIgc3Ryc3RyIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NDgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cnN0cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIiIDE+JjYKK2lmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJzdHIgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDUyMjogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDUyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1Njk6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ1NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyaworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1OTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKK2lmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ2MTY6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NjIxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKK2lmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDY2MzogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDY2OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCitFT0YKKworZmkKKworCisjIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKKworYWxsX3RhcmdldHM9CitFTVVMPQorYWxsX2VtdWxzPQorYWxsX2VtdWxfZXh0cmFzPQorCitybSAtZiB0ZGlycworCitmb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCitkbworICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgorICAgIGFsbF90YXJnZXRzPXRydWUKKyAgZWxzZQorICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgorICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KKwl0YXJnPSRyZXN1bHQKKyAgICBlbHNlCisJdGFyZz0kdGFyZ19hbGlhcworICAgIGZpCisKKyAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0CisKKyAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KKyAgICAgIEVNVUw9JHRhcmdfZW11bAorICAgIGZpCisKKyAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzOyBkbworCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KKwkqIiBlJHtpfS5vICIqKSA7OworCSopCisJICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKKwkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQorCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCisJICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycworCSAgOzsKKwllc2FjCisgICAgZG9uZQorCisgICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbworCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KKwkqIiAke2l9ICIqKSA7OworCSopCisJICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKKwkgIDs7CisJZXNhYworICAgIGRvbmUKKyAgZmkKK2RvbmUKKworCisKK1RESVJTPXRkaXJzCisKKworaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgorICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgorICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJworICBlbHNlCisgICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCisgIGZpCisgIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCitlbHNlCisgIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscworICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCitmaQorCisKKworaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgorICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgorZWxzZQorICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCitmaQorCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVARkZMQUdTQCUkRkZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKK3MlQFZFUlNJT05AJSRWRVJTSU9OJWcKK3MlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKK3MlQEFVVE9DT05GQCUkQVVUT0NPTkYlZworcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCitzJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCitzJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQENDQCUkQ0MlZworcyVATERAJSRMRCVnCitzJUBOTUAlJE5NJWcKK3MlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCitzJUBMTl9TQCUkTE5fUyVnCitzJUBETExUT09MQCUkRExMVE9PTCVnCitzJUBBU0AlJEFTJWcKK3MlQExJQlRPT0xAJSRMSUJUT09MJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworcyVAWUFDQ0AlJFlBQ0MlZworcyVATEVYQCUkTEVYJWcKK3MlQExFWExJQkAlJExFWExJQiVnCitzJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZworcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCitzJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKK3MlQEhPU1RJTkdfQ1JUMEAlJEhPU1RJTkdfQ1JUMCVnCitzJUBIT1NUSU5HX0xJQlNAJSRIT1NUSU5HX0xJQlMlZworcyVATkFUSVZFX0xJQl9ESVJTQCUkTkFUSVZFX0xJQl9ESVJTJWcKK3MlQEVNVUxAJSRFTVVMJWcKKy9AVERJUlNAL3IgJFRESVJTCitzJUBURElSU0AlJWcKK3MlQEVNVUxBVElPTl9PRklMRVNAJSRFTVVMQVRJT05fT0ZJTEVTJWcKK3MlQEVNVUxfRVhUUkFfT0ZJTEVTQCUkRU1VTF9FWFRSQV9PRklMRVMlZworcyVAVEVTVEJGRExJQkAlJFRFU1RCRkRMSUIlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3Rlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCitzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuYmF0IGIvbGQvY29uZmlndXJlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQzYmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvY29uZmlndXJlLmJhdApAQCAtMCwwICsxLDcyIEBACitAZWNobyBvZmYNCitlY2hvIENvbmZpZ3VyaW5nIGxkIGZvciBnbzMyDQorZWNobyBUaGlzIG1ha2VmaWxlIHdpbGwgYmUgYnVpbHQgZm9yIEdOVUlTSCBtYWtlDQorcmVtIFRoaXMgYmF0Y2ggZmlsZSBhc3N1bWVzIGEgdW5peC10eXBlICJzZWQiIHByb2dyYW0NCisNCit1cGRhdGUgLi5cYmZkXGhvc3RzXGdvMzIuaCBzeXNkZXAuaA0KKw0KK2VjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZQ0KK2VjaG8gTE9OR0FSR1MgPSBnY2M6YXIgPj4gTWFrZWZpbGUNCitlY2hvIENDPWdjYyA+PiBNYWtlZmlsZQ0KK2VjaG8gaG9zdF9hbGlhcz1nbzMyID4+IE1ha2VmaWxlDQorZWNobyB0YXJnZXRfYWxpYXM9Z28zMiA+PiBNYWtlZmlsZQ0KKw0KK3VwZGF0ZSAuLi9iZmQvaG9zdHMvZ28zMi5oIHN5c2RlcC5oDQorDQoraWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KKw0KK2VjaG8gInMvXglcJChzcmNkaXIpXC9tb3ZlLWlmLWNoYW5nZS8JdXBkYXRlLwkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvOlwoW14gCV1cKS86IFwxL2cJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL14JXCAqXC5cLy8JZ28zMiAvCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL2BlY2hvIFwkKHNyY2RpcilcLy8vZwkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvIHwgc2VkICdzLFxeXFxcLlwvLCwnYC8vZwkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy9eCWNkIFwkKHNyY2RpcilbIAldKjsvLwkJCSI+PiBjb25maWcuc2VkDQorDQorZWNobyAiL14jIyMjJC8gaVwJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAiQ0MgPSBnY2NcCQkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJFTVVMPWdvMzJcCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIkVNVUxBVElPTl9PRklMRVM9ZWdvMzIubyBlaTM4NmFvdXQubwkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICIvXlNIRUxMICo9LyBkCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvJChTSEVMTCkvc2guZXhlL2cJCQkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICJzLyciL1xcIi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvIicvXFwiL2cJCQkJCSI+PiBjb25maWcuc2VkDQorDQorZWNobyAiL15sZG1haW4ubzogbGRtYWluLmMvLC9maS8gewkJCSI+PiBjb25maWcuc2VkDQorZWNobyAiICBzLzsgKlxcJC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIiAgcy8tRFNDUklQVERJUlteIAldKi8tRFNDUklQVERJUj1cXCIuXFwiLwkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIiAgcy9jb25maWcuc3RhdHVzLy8JCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICIgIC9sZG1haW4ubzovIHAJCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAiICAvKENDKS8gcAkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICIgIGQJCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gIn0JCQkJCQkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICJzL15TSEVMTC4qJC9TSEVMTD1zaC5leGUvCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy9nZW5zY3JpcHRzLnNoL2dlbnNjcmlwdHMuZG9zL2cJCQkiPj4gY29uZmlnLnNlZA0KKw0KK2VjaG8gInMvXmxkZW11bC1saXN0Lmgvbm90LWxkZW11bC1saXN0LmgvCQkiPj4gY29uZmlnLnNlZA0KKw0KK3NlZCAtZSAicy9eXCIvLyIgLWUgInMvXCIkLy8iIC1lICJzL1sgCV0qJC8vIiBjb25maWcuc2VkID4gY29uZmlnMi5zZWQNCitzZWQgLWYgY29uZmlnMi5zZWQgTWFrZWZpbGUuaW4gPj4gTWFrZWZpbGUNCitkZWwgY29uZmlnLnNlZA0KK2RlbCBjb25maWcyLnNlZA0KKw0KK2VjaG8gc2V0IC1hID4gZ2Vuc2NyaXB0cy5kag0KK3NlZCAtZSAiL15bYS16QS1aMC05X10qPS8gcy9eL2V4cG9ydCAvIiAtZSAicy8oLiBcKC4qXCkpL3NoIFwxLyIgLWUgIi9cLmVtLyBkIiBnZW5zY3JpcHRzLnNoID4+IGdlbnNjcmlwdHMuZGoNCit0eXBlIGVtdWx0ZW1wbFxnZW5lcmljLmVtID4+IGdlbnNjcmlwdHMuZGoNCit1cGRhdGUgZ2Vuc2NyaXB0cy5kaiBnZW5zY3JpcHRzLmRvcw0KKw0KK2VjaG8gZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfZ28zMl9lbXVsYXRpb247ID4gbGRlbXVsLWxpc3QuaDINCitlY2hvIGV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlIGxkX2kzODZhb3V0X2VtdWxhdGlvbjsgPj4gbGRlbXVsLWxpc3QuaDINCitlY2hvICNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXD4+bGRlbXVsLWxpc3QuaDINCitlY2hvICAgJmxkX2dvMzJfZW11bGF0aW9uLFw+PmxkZW11bC1saXN0LmgyDQorZWNobyAgICZsZF9pMzg2YW91dF9lbXVsYXRpb24sXD4+bGRlbXVsLWxpc3QuaDINCitlY2hvIDA+PmxkZW11bC1saXN0LmgyDQorDQordXBkYXRlIGxkZW11bC1saXN0LmgyIGxkZW11bC1saXN0LmgNCisNCitpZiBleGlzdCBsZHNjcmlwdHNcZG9zdGVzdCBnb3RvIGxkc2NyaXB0cw0KK21rZGlyIGxkc2NyaXB0cw0KK2RpciA+IGxkc2NyaXB0c1xkb3N0ZXN0DQorOmxkc2NyaXB0cw0KZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS5ob3N0IGIvbGQvY29uZmlndXJlLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlYjMxMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2NvbmZpZ3VyZS5ob3N0CkBAIC0wLDAgKzEsMTcxIEBACisjIFRoaXMgaXMgdGhlIGxpbmtlciBob3N0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCisjIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCisjIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgaG9zdCBzcGVjaWZpYworIyBpbmZvcm1hdGlvbi4KKworIyBUaGlzIGZpbGUgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKKyMgIEhERUZJTkVTCQlob3N0IHNwZWNpZmljIGNvbXBpbGVyIGZsYWdzCisjICBIT1NUSU5HX0NSVDAJCWNydDAubyBmaWxlIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKKyMgIEhPU1RJTkdfTElCUwkJbGlicmFyaWVzIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKKyMgIE5BVElWRV9MSUJfRElSUwlsaWJyYXJ5IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBvbiB0aGlzIGhvc3QKKworSERFRklORVM9CitIT1NUSU5HX0NSVDA9L2xpYi9jcnQwLm8KK0hPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMnCitOQVRJVkVfTElCX0RJUlM9CisKK2Nhc2UgIiR7aG9zdH0iIGluCisKK2FscGhhKi0qLWxpbnV4LWdudSopCisgIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIGBlZ3JlcCAibGRbXiBdKlwuc28iIFxgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPXNwZWNzXGAgfCBzZWQgLWUgInMsLiotZHluYW1pYy1saW5rZXJbIAldWyAJXSpcKC4qL2xkW14gXSouc28uLlwpLiosXDEsImAgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnQxLm9gIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MYGRpcm5hbWUgXGBnY2MgLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCisgIDs7CisKK2FscGhhKi0qLW5ldGJzZCopCisgICMgVGhlIG5ldyBCU0QgYG1ha2UnIGhhcyBhIGJ1ZzogaXQgZG9lc24ndCBwYXNzIGVtcHR5IGFyZ3VtZW50cyBpbgorICAjIHNoZWxsIGNvbW1hbmRzLiAgU28gd2UgbmVlZCB0byBtYWtlIHRoaXMgdmFsdWUgbm9uLWVtcHR5IGluIG9yZGVyCisgICMgZm9yIHRoZSBnZW5zY3JpcHRzLnNoIGNhbGwgdG8gd29yay4gIFRoZXJlJ3Mgbm90aGluZyBtYWdpYyBhYm91dAorICAjIHRoZSB2YWx1ZSBgL2xpYic7IGl0J3MganVzdCBhIGR1bW15LgorICBOQVRJVkVfTElCX0RJUlM9L2xpYgorICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCisgIDs7CisKK2FscGhhKi0qLSopCisgIEhPU1RJTkdfQ1JUMD0vdXNyL2Njcy9saWIvY3J0MC5vCisgIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKKyAgOzsKKworaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqIHwgaVszNDU2XTg2LSotbmV0YnNkKikKKyAgIyBUaGUgbmV3IEJTRCBgbWFrZScgaGFzIGEgYnVnOiBpdCBkb2Vzbid0IHBhc3MgZW1wdHkgYXJndW1lbnRzIGluCisgICMgc2hlbGwgY29tbWFuZHMuICBTbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyB2YWx1ZSBub24tZW1wdHkgaW4gb3JkZXIKKyAgIyBmb3IgdGhlIGdlbnNjcmlwdHMuc2ggY2FsbCB0byB3b3JrLiAgVGhlcmUncyBub3RoaW5nIG1hZ2ljIGFib3V0CisgICMgdGhlIHZhbHVlIGAvbGliJzsgaXQncyBqdXN0IGEgZHVtbXkuCisgIE5BVElWRV9MSUJfRElSUz0vbGliCisgIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KKyAgOzsKKworaVszNDU2XTg2LSotc3lzdjQqKQorICBIT1NUSU5HX0NSVDA9Jy91c3IvY2NzL2xpYi9jcnQxLm8gL3Vzci9jY3MvbGliL2NydGkubyAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvY2NzL2xpYi9jcnRuLm8nCisgIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKKyAgOzsKKworaVszNDU2XTg2LXNlcXVlbnQtcHR4KiB8IGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQorICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MC5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCisgIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCcKKyAgOzsKKworaVszNDU2XTg2LSotc3lzdiopCisgIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBmaWAnCisgIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGZpYCAvbGliL2NydG4ubycKKyAgOzsKKworaVszNDU2XTg2LSotc29sYXJpcyopCisgIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnQxLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0aS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0aS5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGkubzsgZmlgIC91c3IvY2NzL2xpYi92YWx1ZXMtWGEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJworICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydG4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydG4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKKyAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgorICA7OworCitpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKKyAgIyBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIGdjYyBkb2VzIG5vdCB1c2UgY3J0YmVnaW4ubyBhbmQgY3J0ZW5kLm8uCisgICMgSW4gdGhhdCBjYXNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm8gd2lsbCBzaW1wbHkgcHJpbnQKKyAgIyBjcnRiZWdpbi5vLiAgV2UgY3JlYXRlIGR1bW15IGNydGJlZ2luLm8gYW5kIGNydGVuZC5vIGZpbGVzIHRvCisgICMgaGFuZGxlIHRoaXMuCisgIGVjaG8gImludCBkdW1teV9jcnRiZWdpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNydGJlZ2luLmMKKyAgJHtDQ30gLWMgY3J0YmVnaW4uYyAtbyBjcnRiZWdpbi5vCisgIHJtIC1mIGNydGJlZ2luLmMKKyAgZWNobyAiaW50IGR1bW15X2NydGVuZyAoKSB7IHJldHVybiAwOyB9IiA+IGNydGVuZC5jCisgICR7Q0N9IC1jIGNydGVuZC5jIC1vIGNydGVuZC5vCisgIHJtIC1mIGNydGVuZC5jCisgIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC9saWIvY3J0bi5vJworICA7OworCitpWzM0NTZdODYtKi1saW51eCphb3V0KiB8IGlbMzQ1Nl04Ni0qLWxpbnV4b2xkbGQpCisgIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KKyAgOzsKKworaVszNDU2XTg2LSotbGludXgqbGliYzEqKQorICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCisgIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCisgIDs7CisKK2lbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCisgIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIGBmZ3JlcCBsZC1saW51eC5zbyBcYGdjYyAtLXByaW50LWZpbGUtbmFtZT1zcGVjc1xgIHwgc2VkIC1lICJzLC4qLWR5bmFtaWMtbGlua2VyWyAJXVsgCV0qXCguKi9sZC1saW51eC5zby4uXCkuKixcMSwiYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRpLm9gIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJworICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYGdjYyAtLXByaW50LWZpbGUtbmFtZT1saWJjLnNvXGBgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0bi5vYCcKKyAgOzsKKworaVszNDU2XTg2LSotbHlueG9zKikKKyAgSE9TVElOR19DUlQwPS9saWIvaW5pdDEubworICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIC1sbSAvbGliL2luaXRuLm8nCisgIDs7CisKK21pcHMqLWRlYy1ic2QqKQorICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCisgIDs7CisKK21pcHMqLXNnaS1pcml4NCopCisgIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQxLm8KKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAvdXNyL2xpYi9jcnRuLm8nCisgIDs7CisKK21pcHMqLXNnaS1pcml4WzU2XSopCisgIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQxLm8KKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAvdXNyL2xpYi9jcnRuLm8nCisgIDs7CisKK202OCotKi1saW51eCphb3V0KikKKyAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubworICA7OworCittNjgqLSotbGludXgqbGliYzEqKQorICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCisgIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCisgIDs7CisKK202OCotKi1saW51eC1nbnUqKQorICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKKyAgOzsKKworbTY4Ki0qLWx5bnhvcyopCisgIEhPU1RJTkdfQ1JUMD0vbGliL2luaXQxLm8KKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJworICA7OworCittNjgqLW1vdG9yb2xhLXN5c3YpCisgIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDAubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDAubzsgZWxpZiBbIC1mIFxgZ2NjIC1wcmludC1maWxlLW5hbWU9XGBjcnQwLm8gXTsgdGhlbiBlY2hvIFxgZ2NjIC1wcmludC1maWxlLW5hbWU9XGBjcnQwLm87IGVsc2UgZWNobyAvbGliL2NydDAubzsgZmlgJworICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjODgxIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAnCisgIDs7CisKK202OCotc3VuLSopCisgIEhPU1RJTkdfQ1JUMD0nL3Vzci9saWIvY3J0MC5vIC91c3IvbGliL0ZjcnQxLm8gLUwvdXNyL2xpYi9mc29mdC5vJworICA7OworCittODgqLSotZGd1eCopCisgIEhERUZJTkVTPS1EX191c2luZ19ER1VYCisgIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQwLm8gLVgnCisgIEhPU1RJTkdfTElCUz0vdXNyL3NkZS9tODhrYmNzL2xpYi9saWJjLmEKKyAgOzsKKworbTg4Ki1tb3Rvcm9sYS1zeXN2MykKKyAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJworICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCcKKyAgOzsKKworcG93ZXJwYyotKi1saW51eC1nbnUqKQorICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKKyAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKKyAgOzsKKworcm9tcC0qLSopCisgIEhERUZJTkVTPS1ETk9fVkFSQVJHUworICA7OworCitzcGFyYyotKi1zb2xhcmlzMiopCisgIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnQxLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0aS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0aS5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGkubzsgZmlgIC91c3IvY2NzL2xpYi92YWx1ZXMtWGEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJworICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydG4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydG4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKKyAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgorICA7OworCitlc2FjCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuaW4gYi9sZC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzYzFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE1NiBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKK2RubAorQUNfUFJFUkVHKDIuMTMpCitBQ19JTklUKGxkbWFpbi5jKQorCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FNX0lOSVRfQVVUT01BS0UobGQsIDIuOS40KQorCitBTV9QUk9HX0xJQlRPT0wKKworQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAorWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKKyAgICAgICAgICAgIDs7CisgIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWNdKWRubAorQUNfQVJHX0VOQUJMRSg2NC1iaXQtYmZkLAorWyAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcyldLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSAgd2FudDY0PXRydWUgIDs7CisgIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OworICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24pIDs7Citlc2FjXSxbd2FudDY0PWZhbHNlXSlkbmwKKworQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCisKK2lmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgorICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCitmaQoraWYgdGVzdCAteiAiJGhvc3QiIDsgdGhlbgorICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQorZmkKKworIyBob3N0LXNwZWNpZmljIHN0dWZmOgorCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKKworQUxMX0xJTkdVQVM9CitDWV9HTlVfR0VUVEVYVAorCitBQ19FWEVFWFQKKworQUNfUFJPR19ZQUNDCitBTV9QUk9HX0xFWAorCitBTV9NQUlOVEFJTkVSX01PREUKKworLiAke3NyY2Rpcn0vY29uZmlndXJlLmhvc3QKKworQUNfU1VCU1QoSERFRklORVMpCitBQ19TVUJTVChIT1NUSU5HX0NSVDApCitBQ19TVUJTVChIT1NUSU5HX0xJQlMpCitBQ19TVUJTVChOQVRJVkVfTElCX0RJUlMpCisKK0FDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHVuaXN0ZC5oKQorQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKK0FDX0hFQURFUl9ESVJFTlQKKworQkZEX0JJTkFSWV9GT1BFTgorCitCRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCitCRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQorQkZEX05FRURfREVDTEFSQVRJT04oc2JyaykKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKGVudmlyb24pCisKKyMgdGFyZ2V0LXNwZWNpZmljIHN0dWZmOgorCithbGxfdGFyZ2V0cz0KK0VNVUw9CithbGxfZW11bHM9CithbGxfZW11bF9leHRyYXM9CisKK2RubCBXZSBuZWVkIHRvIGdldCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRkaXIgZGVmaW5pdGlvbnMgaW50bworZG5sIE1ha2VmaWxlLiAgV2UgY2FuJ3QgZG8gaXQgdXNpbmcgQUNfU1VCU1QsIGJlY2F1c2UgYXV0b2NvbmYgZG9lcworZG5sIG5vdCBwZXJtaXQgbGl0ZXJhbCBuZXdsaW5lcyBpbiBhbiBBQ19TVUJTVCB2YXJpYWJsZXMuICBTbyB3ZSB1c2UgYQorZG5sIGZpbGUuCitybSAtZiB0ZGlycworCitmb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCitkbworICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgorICAgIGFsbF90YXJnZXRzPXRydWUKKyAgZWxzZQorICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgorICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KKwl0YXJnPSRyZXN1bHQKKyAgICBlbHNlCisJdGFyZz0kdGFyZ19hbGlhcworICAgIGZpCisKKyAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0CisKKyAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KKyAgICAgIEVNVUw9JHRhcmdfZW11bAorICAgIGZpCisKKyAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzOyBkbworCWNhc2UgIiAkYWxsX2VtdWxzICIgaW4KKwkqIiBlJHtpfS5vICIqKSA7OworCSopCisJICBhbGxfZW11bHM9IiRhbGxfZW11bHMgZSR7aX0ubyIKKwkgIGV2YWwgcmVzdWx0PVwkdGRpcl8kaQorCSAgdGVzdCAteiAiJHJlc3VsdCIgJiYgcmVzdWx0PSR0YXJnX2FsaWFzCisJICBlY2hvIHRkaXJfJGk9JHJlc3VsdCA+PiB0ZGlycworCSAgOzsKKwllc2FjCisgICAgZG9uZQorCisgICAgZm9yIGkgaW4gJHRhcmdfZXh0cmFfb2ZpbGVzOyBkbworCWNhc2UgIiAkYWxsX2VtdWxfZXh0cmFzICIgaW4KKwkqIiAke2l9ICIqKSA7OworCSopCisJICBhbGxfZW11bF9leHRyYXM9IiRhbGxfZW11bF9leHRyYXMgJHtpfSIKKwkgIDs7CisJZXNhYworICAgIGRvbmUKKyAgZmkKK2RvbmUKKworQUNfU1VCU1QoRU1VTCkKKworVERJUlM9dGRpcnMKK0FDX1NVQlNUX0ZJTEUoVERJUlMpCisKK2RubCBGSVhNRTogV2Ugd2lsbCBidWlsZCBhIDY0IGJpdCBCRkQgZm9yIGEgNjQgYml0IGhvc3Qgb3IgYSA2NCBiaXQKK2RubCB0YXJnZXQsIGFuZCBpbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQgYWxzbyBidWlsZCB0aGUgNjQgYml0CitkbmwgZW11bGF0aW9ucy4KK2lmIHRlc3QgeCR7YWxsX3RhcmdldHN9ID0geHRydWU7IHRoZW4KKyAgaWYgdGVzdCB4JHt3YW50NjR9ID0geHRydWU7IHRoZW4KKyAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKSAkKEFMTF82NF9FTVVMQVRJT05TKScKKyAgZWxzZQorICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpJworICBmaQorICBFTVVMX0VYVFJBX09GSUxFUz0nJChBTExfRU1VTF9FWFRSQV9PRklMRVMpJworZWxzZQorICBFTVVMQVRJT05fT0ZJTEVTPSRhbGxfZW11bHMKKyAgRU1VTF9FWFRSQV9PRklMRVM9JGFsbF9lbXVsX2V4dHJhcworZmkKK0FDX1NVQlNUKEVNVUxBVElPTl9PRklMRVMpCitBQ19TVUJTVChFTVVMX0VYVFJBX09GSUxFUykKKworaWYgdGVzdCB4JHtlbmFibGVfc3RhdGljfSA9IHhubzsgdGhlbgorICBURVNUQkZETElCPSItLXJwYXRoIC4uL2JmZC8ubGlicyAuLi9iZmQvLmxpYnMvbGliYmZkLnNvIgorZWxzZQorICBURVNUQkZETElCPSIuLi9iZmQvLmxpYnMvbGliYmZkLmEiCitmaQorQUNfU1VCU1QoVEVTVEJGRExJQikKKworQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCitbc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2xkL2NvbmZpZ3VyZS50Z3QgYi9sZC9jb25maWd1cmUudGd0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTU1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9jb25maWd1cmUudGd0CkBAIC0wLDAgKzEsMjQ5IEBACisjIFRoaXMgaXMgdGhlIGxpbmtlciB0YXJnZXQgc3BlY2lmaWMgZmlsZS4gIFRoaXMgaXMgaW52b2tlZCBieSB0aGUKKyMgYXV0b2NvbmYgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuICBQdXR0aW5nIGl0IGluIGEgc2VwYXJhdGUgc2hlbGwKKyMgZmlsZSBsZXRzIHVzIHNraXAgcnVubmluZyBhdXRvY29uZiB3aGVuIG1vZGlmeWluZyB0YXJnZXQgc3BlY2lmaWMKKyMgaW5mb3JtYXRpb24uCisKKyMgVGhpcyBmaWxlIHN3aXRjaGVzIG9uIHRoZSBzaGVsbCB2YXJpYWJsZSAke3Rhcmd9LCBhbmQgc2V0cyB0aGUKKyMgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKKyMgIHRhcmdfZW11bAkJbmFtZSBvZiBsaW5rZXIgZW11bGF0aW9uIHRvIHVzZQorIyAgdGFyZ19leHRyYV9lbXVscwlhZGRpdGlvbmFsIGxpbmtlciBlbXVsYXRpb25zIHRvIHByb3ZpZGUKKyMgIHRhcmdfZXh0cmFfb2ZpbGVzCWFkZGl0aW9uYWwgb2JqZWN0cyBuZWVkZWQgYnkgdGhlIGVtdWxhdGlvbgorCit0YXJnX2V4dHJhX2VtdWxzPQordGFyZ19leHRyYV9vZmlsZXM9CisKK2Nhc2UgIiR7dGFyZ30iIGluCithcm0tZXBvYy1wZSkJCXRhcmdfZW11bD1hcm1fZXBvY19wZSA7CisJCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKK2FybS0qLXBlKQkJdGFyZ19lbXVsPWFybXBlIDsKKwkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OworYXJjLSotZWxmKikJCXRhcmdfZW11bD1hcmNlbGYgOzsKK2QxMHYtKi0qKQkJdGFyZ19lbXVsPWQxMHZlbGYgOzsKK2QzMHYtKi0qZXh0KikJCXRhcmdfZW11bD1kMzB2X2U7IHRhcmdfZXh0cmFfZW11bHM9ImQzMHZlbGYgZDMwdl9vIiA7OworZDMwdi0qLSpvbmNoaXAqKQl0YXJnX2VtdWw9ZDMwdl9vOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2ZWxmIGQzMHZfZSIgOzsKK2QzMHYtKi0qKQkJdGFyZ19lbXVsPWQzMHZlbGY7IHRhcmdfZXh0cmFfZW11bHM9ImQzMHZfZSBkMzB2X28iIDs7CitzcGFyYzY0LSotYW91dCopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKK3NwYXJjNjQtKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjY0X3NwYXJjIDs7CitzcGFyYy1zdW4tc3Vub3M0KikgCXRhcmdfZW11bD1zdW40IDs7CitzcGFyY2xpdGUqLSotZWxmKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKK3NwYXJjbGl0ZSotKi1jb2ZmKQl0YXJnX2VtdWw9Y29mZl9zcGFyYyA7Oworc3BhcmNsaXRlKi1mdWppdHN1LSopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKK3NwYXJjKi0qLWFvdXQpCQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7CitzcGFyYyotKi1jb2ZmKQkJdGFyZ19lbXVsPWNvZmZfc3BhcmMgOzsKK3NwYXJjKi0qLWVsZikJCXRhcmdfZW11bD1lbGYzMl9zcGFyYyA7Oworc3BhcmMqLSotc3lzdjQqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKK3NwYXJjKi0qLWxpbnV4KmFvdXQqKQl0YXJnX2VtdWw9c3BhcmNsaW51eAorCQkJdGFyZ19leHRyYV9lbXVscz0iZWxmMzJfc3BhcmMgc3VuNCIKKwkJCXRkaXJfZWxmMzJfc3BhcmM9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9hb3V0Ly8nYAorCQkJdGRpcl9zdW40PXNwYXJjLXN1bi1zdW5vczQKKwkJCTs7CitzcGFyYzY0LSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjY0X3NwYXJjCisJCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMl9zcGFyYyBzcGFyY2xpbnV4IHN1bjQiCisJCQl0ZGlyX2VsZjMyX3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvNjQvLydgCisJCQl0ZGlyX3NwYXJjbGludXg9JHt0ZGlyX2VsZjMyX3NwYXJjfWFvdXQKKwkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0CisJCQk7Oworc3BhcmMqLSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjCisJCQl0YXJnX2V4dHJhX2VtdWxzPSJzcGFyY2xpbnV4IHN1bjQiCisJCQl0ZGlyX3NwYXJjbGludXg9JHt0YXJnX2FsaWFzfWFvdXQKKwkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0CisJCQk7Oworc3BhcmMqLSotbHlueG9zKikJdGFyZ19lbXVsPXNwYXJjbHlueCA7Oworc3BhcmMqLSotbmV0YnNkKikJdGFyZ19lbXVsPXNwYXJjbmJzZCA7Oworc3BhcmMqLSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKK3NwYXJjKi13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKK3NwYXJjKi0qLXJ0ZW1zKikJdGFyZ19lbXVsPXNwYXJjYW91dCA7OworaTk2MC13cnMtdnh3b3JrczUuMCopCXRhcmdfZW11bD1nbGQ5NjAgOzsKK2k5NjAtd3JzLXZ4d29ya3M1KikJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKK2k5NjAtd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9Z2xkOTYwIDs7CitpOTYwLSotY29mZikJCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7CitpOTYwLWludGVsLW5pbmR5KQl0YXJnX2VtdWw9Z2xkOTYwIDs7CitpOTYwLSotcnRlbXMqKQkJdGFyZ19lbXVsPWdsZDk2MGNvZmYgOzsKK20zMnItKi0qKQkJdGFyZ19lbXVsPW0zMnJlbGYgOzsKK202OCotc3VuLXN1bm9zWzM0XSopCXRhcmdfZW11bD1zdW4zIDs7CittNjgqLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPXN1bjMgOzsKK202OCotZXJpY3Nzb24tb3NlKQl0YXJnX2VtdWw9c3VuMyA7OworbTY4Ki1hcHBsZS1hdXgqKQl0YXJnX2VtdWw9bTY4a2F1eCA7OworKi10YW5kZW0tbm9uZSkJCXRhcmdfZW11bD1zdDIwMDAgOzsKK2lbMzQ1Nl04Ni0qLXZzdGEpCXRhcmdfZW11bD12c3RhIDs7CitpWzM0NTZdODYtZ28zMi1ydGVtcyopCXRhcmdfZW11bD1pMzg2Z28zMiA7OworaVszNDU2XTg2LSotZ28zMikJdGFyZ19lbXVsPWkzODZnbzMyIDs7CitpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKikgdGFyZ19lbXVsPWkzODZnbzMyIDs7CitpWzM0NTZdODYtKi1haXgqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKK2lbMzQ1Nl04Ni0qLXNjbyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OworaVszNDU2XTg2LSotaXNjKikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7CitpWzM0NTZdODYtKi1seW54b3MqKQl0YXJnX2VtdWw9aTM4Nmx5bnggOzsKK2lbMzQ1Nl04Ni0qLWNvZmYpCXRhcmdfZW11bD1pMzg2Y29mZiA7OworaVszNDU2XTg2LSotcnRlbXMqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKK2lbMzQ1Nl04Ni0qLWJzZCkJdGFyZ19lbXVsPWkzODZic2QgOzsKK2lbMzQ1Nl04Ni0qLWJzZDM4NikJdGFyZ19lbXVsPWkzODZic2QgOzsKK2lbMzQ1Nl04Ni0qLWJzZGkqKQl0YXJnX2VtdWw9aTM4NmJzZCA7OworaVszNDU2XTg2LSotYW91dCkJdGFyZ19lbXVsPWkzODZhb3V0IDs7CitpWzM0NTZdODYtKi1saW51eCphb3V0KikJdGFyZ19lbXVsPWkzODZsaW51eAorCQkJdGFyZ19leHRyYV9lbXVscz1lbGZfaTM4NgorCQkJdGRpcl9lbGZfaTM4Nj1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCisJCQk7OworaVszNDU2XTg2LSotbGludXhvbGRsZCkJdGFyZ19lbXVsPWkzODZsaW51eDsgdGFyZ19leHRyYV9lbXVscz1lbGZfaTM4NiA7OworaVszNDU2XTg2LSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2CisJCQl0YXJnX2V4dHJhX2VtdWxzPWkzODZsaW51eAorCQkJdGRpcl9pMzg2bGludXg9JHt0YXJnX2FsaWFzfWFvdXQKKwkJCTs7CitpWzM0NTZdODYtKi1zeXN2NCopCXRhcmdfZW11bD1lbGZfaTM4NiA7OworaVszNDU2XTg2LSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKK2lbMzQ1Nl04Ni0qLXVuaXh3YXJlKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKK2lbMzQ1Nl04Ni0qLXNvbGFyaXMqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKK2lbMzQ1Nl04Ni0qLW5ldGJzZCopCXRhcmdfZW11bD1pMzg2bmJzZCA7OworaVszNDU2XTg2LSotbmV0d2FyZSkJdGFyZ19lbXVsPWkzODZudyA7OworaVszNDU2XTg2LSotZWxmKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7CitpWzM0NTZdODYtKi1mcmVlYnNkZWxmKikgdGFyZ19lbXVsPWVsZl9pMzg2IDs7CitpWzM0NTZdODYtKi1mcmVlYnNkKikJdGFyZ19lbXVsPWkzODZic2QgOzsKK2lbMzQ1Nl04Ni0qLXN5c3YqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKK2lbMzQ1Nl04Ni0qLXB0eCopCXRhcmdfZW11bD1pMzg2Y29mZiA7OworaVszNDU2XTg2LSotbWFjaCopCXRhcmdfZW11bD1pMzg2bWFjaCA7OworaVszNDU2XTg2LSotZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7CitpWzM0NTZdODYtKi1tc2RvcyopCXRhcmdfZW11bD1pMzg2bXNkb3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4NmFvdXQgOzsKK2lbMzQ1Nl04Ni0qLW1vc3MqKQl0YXJnX2VtdWw9aTM4Nm1vc3M7IHRhcmdfZXh0cmFfZW11bHM9aTM4Nm1zZG9zIDs7CitpWzM0NTZdODYtKi13aW5udCopCXRhcmdfZW11bD1pMzg2cGUgOworCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7CitpWzM0NTZdODYtKi1wZSkJCXRhcmdfZW11bD1pMzg2cGUgOworCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7CitpWzM0NTZdODYtKi1jeWd3aW4qKQl0YXJnX2VtdWw9aTM4NnBlIDsKKwkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OworaVszNDU2XTg2LSotbWluZ3czMiopCXRhcmdfZW11bD1pMzg2cGUgOworCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7CitpWzM0NTZdODYtKi1iZW9zcGUqKSAgICB0YXJnX2VtdWw9aTM4NmJlb3MgOzsKK2lbMzQ1Nl04Ni0qLWJlb3MqKQl0YXJnX2VtdWw9ZWxmX2kzODZfYmUgOzsKK204Ki0qLSopCQl0YXJnX2VtdWw9bTg4a2JjcyA7OworYTI5ay0qLXVkaSkJCXRhcmdfZW11bD1zYTI5MjAwIDs7CithMjlrLSotZWJtb24pCQl0YXJnX2VtdWw9ZWJtb24yOWsgOzsKK2EyOWstKi0qKQkJdGFyZ19lbXVsPWEyOWsgOzsKKyMgIGFybS0qLXJpc2NpeCopCQl0YXJnX2VtdWw9cmlzY2l4IDs7Cithcm0tKi1hb3V0IHwgYXJtZWwtKi1hb3V0KSB0YXJnX2VtdWw9YXJtYW91dGwgOzsKK2FybWViLSotYW91dCkJCXRhcmdfZW11bD1hcm1hb3V0YiA7OworYXJtLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Cithcm0tKi1lbGYpCQl0YXJnX2VtdWw9YXJtZWxmIDs7Cithcm0tKi1vYWJpKSAgICAgICAgICAgICB0YXJnX2VtdWw9YXJtZWxmX29hYmkgOzsKK2FybSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9YXJtZWxmX2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPSJhcm1lbGZfbGludXgyNiBhcm1lbGYiOzsKK3N0cm9uZ2FybS0qLWNvZmYpCXRhcmdfZW11bD1hcm1jb2ZmIDs7CitzdHJvbmdhcm0tKi1lbGYpCXRhcmdfZW11bD1hcm1lbGYgOzsKK3RodW1iLSotY29mZikJCXRhcmdfZW11bD1hcm1jb2ZmIDs7Cit0aHVtYi0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKK3RodW1iLSotb2FiaSkgICAgICAgICAgIHRhcmdfZW11bD1hcm1lbGZfb2FiaSA7OwordGh1bWItZXBvYy1wZSkJCXRhcmdfZW11bD1hcm1fZXBvY19wZSA7CisJCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKK3RodW1iLSotcGUpCQl0YXJnX2VtdWw9YXJtcGUgOworCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7CitoODMwMC0qLWhtcyogfCBoODMwMC0qLWNvZmYqKQorCQkJdGFyZ19lbXVsPWg4MzAwOyB0YXJnX2V4dHJhX2VtdWxzPSJoODMwMGggaDgzMDBzIgorCQkJOzsKK2g4NTAwLSotaG1zKiB8IGg4NTAwLSotY29mZiopCisJCQl0YXJnX2VtdWw9aDg1MDAKKwkJCXRhcmdfZXh0cmFfZW11bHM9Img4NTAwcyBoODUwMGIgaDg1MDBtIGg4NTAwYyIKKwkJCTs7CitzaC0qLWVsZiopCQl0YXJnX2VtdWw9c2hlbGYKKwkJCXRhcmdfZXh0cmFfZW11bHM9InNobGVsZiBzaCBzaGwiCisJCQk7Oworc2gtKi0qfHNoLSotcnRlbXMqKQl0YXJnX2VtdWw9c2g7IHRhcmdfZXh0cmFfZW11bHM9c2hsIDs7CittNjhrLXNvbnktKikJCXRhcmdfZW11bD1uZXdzIDs7CittNjhrLWhwLWJzZCopCQl0YXJnX2VtdWw9aHAzMDBic2QgOzsKK202OCotbW90b3JvbGEtc3lzdiopCXRhcmdfZW11bD1kZWx0YTY4IDs7CittNjgqLSotYW91dCkJCXRhcmdfZW11bD1tNjhrYW91dCA7OworbTY4Ki0qLWNvZmYpCQl0YXJnX2VtdWw9bTY4a2NvZmYgOzsKK202OCotKi1lbGYpCQl0YXJnX2VtdWw9bTY4a2VsZiA7OworbTY4Ki0qLWhwdXgqKQkJdGFyZ19lbXVsPWhwM2hwdXggOzsKK202OGstKi1saW51eCphb3V0KikJdGFyZ19lbXVsPW02OGtsaW51eAorCQkJdGFyZ19leHRyYV9lbXVscz1tNjhrZWxmCisJCQl0ZGlyX202OGtlbGY9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9hb3V0Ly8nYAorCQkJOzsKK202OGstKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9bTY4a2VsZgorCQkJdGFyZ19leHRyYV9lbXVscz1tNjhrbGludXgKKwkJCXRkaXJfbTY4a2xpbnV4PWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhhb3V0LydgCisJCQk7OworbTY4Ki0qLWdudSopCQl0YXJnX2VtdWw9bTY4a2VsZiA7OworbTY4Ki0qLWx5bnhvcyopCQl0YXJnX2VtdWw9bTY4a2x5bnggOzsKK202OCotaHAqLW5ldGJzZCopCXRhcmdfZW11bD1tNjhrNGtuYnNkIDs7CittNjgqLSotbmV0YnNkKikJCXRhcmdfZW11bD1tNjhrbmJzZCA7OworbTY4Ki0qLXBzb3MqKQkJdGFyZ19lbXVsPW02OGtwc29zIDs7CittNjgqLSotcnRlbXMqKQkJdGFyZ19lbXVsPW02OGtjb2ZmIDs7CitocHBhKi0qLSplbGYqKQkJdGFyZ19lbXVsPWhwcGFlbGYgOzsKK2hwcGEqLSotbGl0ZXMqKQkJdGFyZ19lbXVsPWhwcGFlbGYgOzsKK2hwcGEqLSotcnRlbXMqKQkJdGFyZ19lbXVsPWhwcGFlbGYgOzsKK3ZheC1kZWMtdWx0cml4KiB8IHZheC1kZWMtYnNkKikgdGFyZ19lbXVsPXZheCA7OworbWlwcyotZGVjLXVsdHJpeCopCXRhcmdfZW11bD1taXBzbGl0IDs7CittaXBzKi1kZWMtb3NmKikJCXRhcmdfZW11bD1taXBzbGl0IDs7CittaXBzKi1zZ2ktaXJpeFs1Nl0qKQl0YXJnX2VtdWw9ZWxmMzJic21pcCA7OworbWlwcyotc2dpLWlyaXgqKQl0YXJnX2VtdWw9bWlwc2JpZyA7OworbWlwcyplbC0qLWVjb2ZmKikJdGFyZ19lbXVsPW1pcHNpZHRsIDs7CittaXBzKi0qLWVjb2ZmKikJCXRhcmdfZW11bD1taXBzaWR0IDs7CittaXBzKi1kZWMtYnNkKikJCXRhcmdfZW11bD1taXBzYnNkIDs7CittaXBzKi1kZWMtbmV0YnNkKikJdGFyZ19lbXVsPWVsZjMybG1pcCA7OworbWlwcyotKi1ic2QqKQkJdGFyZ19lbXVsPW1pcHNiaWcgOzsKK21pcHMqdnI0MzAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OworbWlwcyp2cjQzMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OworbWlwcyp2cjQxMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7CittaXBzKnZyNDEwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7CittaXBzKnZyNTAwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKK21pcHMqdnI1MDAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKK21pcHMqZWwtKi1lbGYqKQkJdGFyZ19lbXVsPWVsZjMyZWxtaXAgOzsKK21pcHMqLSotZWxmKikJCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7CittaXBzKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7CittaXBzKi0qLXZ4d29ya3MqKQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OworbWlwcyplbC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmxzbWlwCisJCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmJzbWlwIG1pcHNsaXQgbWlwc2JpZyIKKwkJCTs7CittaXBzKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMmJzbWlwCisJCQl0YXJnX2V4dHJhX2VtdWxzPSJlbGYzMmxzbWlwIG1pcHNiaWcgbWlwc2xpdCIKKwkJCTs7CittaXBzKi0qLWxuZXdzKikJCXRhcmdfZW11bD1taXBzbG5ld3MgOzsKK21uMTAyMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAyMDAgOzsKK21uMTAzMDAtKi0qKQkJdGFyZ19lbXVsPW1uMTAzMDAgOzsKK2FscGhhKi0qLWxpbnV4ZWNvZmYqKQl0YXJnX2VtdWw9YWxwaGEgdGFyZ19leHRyYV9lbXVscz1lbGY2NGFscGhhCisJCQl0ZGlyX2VsZjY0YWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9lY29mZi8vJ2AKKwkJCTs7CithbHBoYSotKi1saW51eC1nbnUqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWFscGhhCisJCQl0ZGlyX2FscGhhPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvbGludXgvbGludXhlY29mZi8nYAorCQkJOzsKK2FscGhhKi0qLW9zZiopCQl0YXJnX2VtdWw9YWxwaGEgOzsKK2FscGhhKi0qLWdudSopCQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OworYWxwaGEqLSotbmV0d2FyZSopCXRhcmdfZW11bD1hbHBoYSA7OworYWxwaGEqLSotbmV0YnNkKikJdGFyZ19lbXVsPWVsZjY0YWxwaGEgOzsKK3o4ay0qLWNvZmYpIAkJdGFyZ19lbXVsPXo4MDAyOyB0YXJnX2V4dHJhX2VtdWxzPXo4MDAxIDs7CituczMyay1wYzUzMi1tYWNoKiB8IG5zMzJrLXBjNTMyLXV4KikJdGFyZ19lbXVsPXBjNTMybWFjaGEgOzsKK25zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopIHRhcmdfZW11bD1uczMya25ic2QgOzsKK3Bvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLWVhYmkqIHwgcG93ZXJwYy0qLWxpbnV4LWdudSogfCBwb3dlcnBjLSotc3lzdiogXAorICB8IHBvd2VycGMtKi1uZXRic2QqIHwgcG93ZXJwYy0qLXZ4d29ya3MqKQorCXRhcmdfZW11bD1lbGYzMnBwYyA7OworcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgcG93ZXJwY2xlLSotc29sYXJpcyogXAorICB8IHBvd2VycGNsZS0qLXN5c3YqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyopCisJdGFyZ19lbXVsPWVsZjMybHBwYyA7OworcG93ZXJwYy0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMycHBjIDs7Citwb3dlcnBjLSotbWFjb3MqKQl0YXJnX2VtdWw9cHBjbWFjb3MgOzsKK3Bvd2VycGMtKi1uZXR3YXJlKikJdGFyZ19lbXVsPXBwY253IDs7Citwb3dlcnBjbGUtKi1wZSkgICAgICAgICB0YXJnX2VtdWw9cHBjcGUgOzsKK3Bvd2VycGNsZS0qLXdpbm50KikgICAgIHRhcmdfZW11bD1wcGNwZSA7OworcG93ZXJwY2xlLSotY3lnd2luKikgICB0YXJnX2VtdWw9cHBjcGUgOzsKK3Bvd2VycGMtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHBwYyA7OworcG93ZXJwYy0qLWJlb3MqKQl0YXJnX2VtdWw9YWl4cHBjIDs7CityczYwMDAtKi1haXgqKQkJdGFyZ19lbXVsPWFpeHJzNiA7OwordGljMzAtKi0qYW91dCopCQl0YXJnX2VtdWw9dGljMzBhb3V0IDs7Cit0aWMzMC0qLSpjb2ZmKikJCXRhcmdfZW11bD10aWMzMGNvZmYgOzsKK3RpYzgwLSotKikJCXRhcmdfZW11bD10aWM4MGNvZmYgOzsKK3Y4NTAtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKK3Y4NTBlLSotKikJCXRhcmdfZW11bD12ODUwIDs7Cit2ODUwZWEtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKK3c2NS0qLSopCQl0YXJnX2VtdWw9dzY1IDs7CitmcjMwLSotKikJCXRhcmdfZW11bD1lbGYzMmZyMzAgOzsKK21jb3JlLSotcGUpCQl0YXJnX2VtdWw9bWNvcmVwZSA7CisJCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKK21jb3JlLSotZWxmKQkJdGFyZ19lbXVsPWVsZjMybWNvcmUgOzsKKyotKi1hb3V0KQkJdGFyZ19lbXVsPSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfSA7OworKi0qLWNvZmYpCQl0YXJnX2VtdWw9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9IDs7CisqLSotbmV0d2FyZSkJCXRhcmdfZW11bD0ke3RhcmdldF9jcHV9LW53IDs7CisqLSotaWVlZSopCQl0YXJnX2VtdWw9dmFuaWxsYSA7OworCisqKQorICBlY2hvIDI+JjEgIioqKiBsZCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3Rhcmd9IgorICBlY2hvIDI+JjEgIioqKiBzZWUgbGQvY29uZmlndXJlLnRndCBmb3Igc3VwcG9ydGVkIHRhcmdldHMiCisgIGV4aXQgMQorCitlc2FjCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlLmggYi9sZC9kZWZmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2YzFjZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2RlZmZpbGUuaApAQCAtMCwwICsxLDEyMyBAQAorLyogZGVmZmlsZS5oIC0gaGVhZGVyIGZvciAuREVGIGZpbGUgcGFyc2VyCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IERKIERlbG9yaWUgZGpAY3lnbnVzLmNvbQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCisgICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKworLyogREVGIHN0b3JhZ2UgZGVmaW5pdGlvbnMuICBOb3RlIHRoYXQgYW55IG9yZGluYWwgbWF5IGJlIHplcm8sIGFuZAorICAgYW55IHBvaW50ZXIgbWF5IGJlIE5VTEwsIGlmIG5vdCBkZWZpbmVkIGJ5IHRoZSBERUYgZmlsZS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfc2VjdGlvbgorICB7CisgICAgY2hhciAqbmFtZTsJCQkvKiBhbHdheXMgc2V0ICovCisgICAgY2hhciAqY2xhc3M7CQkvKiBtYXkgYmUgTlVMTCAqLworICAgIGNoYXIgZmxhZ19yZWFkLCBmbGFnX3dyaXRlLCBmbGFnX2V4ZWN1dGUsIGZsYWdfc2hhcmVkOworICB9CitkZWZfZmlsZV9zZWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9leHBvcnQKKyAgeworICAgIGNoYXIgKm5hbWU7CQkJLyogYWx3YXlzIHNldCAqLworICAgIGNoYXIgKmludGVybmFsX25hbWU7CS8qIGFsd2F5cyBzZXQsIG1heSA9PSBuYW1lICovCisgICAgaW50IG9yZGluYWw7CQkvKiAtMSBpZiBub3Qgc3BlY2lmaWVkICovCisgICAgaW50IGhpbnQ7CisgICAgY2hhciBmbGFnX3ByaXZhdGUsIGZsYWdfY29uc3RhbnQsIGZsYWdfbm9uYW1lLCBmbGFnX2RhdGE7CisgIH0KK2RlZl9maWxlX2V4cG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfbW9kdWxlCisgIHsKKyAgICBzdHJ1Y3QgZGVmX2ZpbGVfbW9kdWxlICpuZXh0OworICAgIHZvaWQgKnVzZXJfZGF0YTsKKyAgICBjaGFyIG5hbWVbMV07IC8qIGV4dGVuZGVkIHZpYSBtYWxsb2MgKi8KKyAgfQorZGVmX2ZpbGVfbW9kdWxlOworCit0eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9pbXBvcnQKKyAgeworICAgIGNoYXIgKmludGVybmFsX25hbWU7CS8qIGFsd2F5cyBzZXQgKi8KKyAgICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZTsJLyogYWx3YXlzIHNldCAqLworICAgIGNoYXIgKm5hbWU7CQkJLyogbWF5IGJlIE5VTEw7IGVpdGhlciB0aGlzIG9yIG9yZGluYWwgd2lsbCBiZSBzZXQgKi8KKyAgICBpbnQgb3JkaW5hbDsJCS8qIG1heSBiZSAtMSAqLworICB9CitkZWZfZmlsZV9pbXBvcnQ7CisKK3R5cGVkZWYgc3RydWN0IGRlZl9maWxlCisgIHsKKworICAgIC8qIGZyb20gdGhlIE5BTUUgb3IgTElCUkFSWSBjb21tYW5kICovCisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaXNfZGxsOwkJCS8qIC0xIGlmIE5BTUUvTElCUkFSWSBub3QgZ2l2ZW4gKi8KKyAgICBiZmRfdm1hIGJhc2VfYWRkcmVzczsJLyogKGJmZF92bWEpKC0xKSBpZiB1bnNwZWNpZmllZCAqLworCisgICAgLyogZnJvbSB0aGUgREVTQ1JJUFRJT04gY29tbWFuZCAqLworICAgIGNoYXIgKmRlc2NyaXB0aW9uOworCisgICAgLyogZnJvbSB0aGUgU1RBQ0svSEVBUCBjb21tYW5kLCAtMSBpZiB1bnNwZWNpZmllZCAqLworICAgIGludCBzdGFja19yZXNlcnZlLCBzdGFja19jb21taXQ7CisgICAgaW50IGhlYXBfcmVzZXJ2ZSwgaGVhcF9jb21taXQ7CisKKyAgICAvKiBmcm9tIHRoZSBTRUNUSU9OL1NFR01FTlQgY29tbWFuZHMgKi8KKyAgICBpbnQgbnVtX3NlY3Rpb25fZGVmczsKKyAgICBkZWZfZmlsZV9zZWN0aW9uICpzZWN0aW9uX2RlZnM7CisKKyAgICAvKiBmcm9tIHRoZSBFWFBPUlRTIGNvbW1hbmRzICovCisgICAgaW50IG51bV9leHBvcnRzOworICAgIGRlZl9maWxlX2V4cG9ydCAqZXhwb3J0czsKKworICAgIC8qIHVzZWQgYnkgaW1wb3J0cyBmb3IgbW9kdWxlIG5hbWVzICovCisgICAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGVzOworCisgICAgLyogZnJvbSB0aGUgSU1QT1JUUyBjb21tYW5kcyAqLworICAgIGludCBudW1faW1wb3J0czsKKyAgICBkZWZfZmlsZV9pbXBvcnQgKmltcG9ydHM7CisKKyAgICAvKiBmcm9tIHRoZSBWRVJTSU9OIGNvbW1hbmQsIC0xIGlmIG5vdCBzcGVjaWZpZWQgKi8KKyAgICBpbnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjsKKyAgfQorZGVmX2ZpbGU7CisKK2V4dGVybiBkZWZfZmlsZSAqZGVmX2ZpbGVfZW1wdHkgUEFSQU1TICgodm9pZCkpOworCisvKiBhZGRfdG8gbWF5IGJlIE5VTEwuICBJZiBub3QsIHRoaXMgLmRlZiBpcyBhcHBlbmRlZCB0byBpdCAqLworZXh0ZXJuIGRlZl9maWxlICpkZWZfZmlsZV9wYXJzZSBQQVJBTVMgKChjb25zdCBjaGFyICpfZmlsZW5hbWUsCisJCQkJCSBkZWZfZmlsZSAqIF9hZGRfdG8pKTsKKworZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfZnJlZSBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYpKTsKKworZXh0ZXJuIGRlZl9maWxlX2V4cG9ydCAqZGVmX2ZpbGVfYWRkX2V4cG9ydCBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCisJCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9uYW1lLAorCQkJCQkJIGNvbnN0IGNoYXIgKl9pbnRlcm5hbF9uYW1lLAorCQkJCQkJICAgICBpbnQgX29yZGluYWwpKTsKKworZXh0ZXJuIGRlZl9maWxlX2ltcG9ydCAqZGVmX2ZpbGVfYWRkX2ltcG9ydCBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCisJCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9uYW1lLAorCQkJCQkJICAgICBjb25zdCBjaGFyICpfZnJvbSwKKwkJCQkJCSAgICAgaW50IF9vcmRpbmFsLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqX2ltcG9ydGVkX25hbWUpKTsKKworZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCisJCQkJCSAgICBjb25zdCBjaGFyICpwYXJhbSwKKwkJCQkJICAgIGludCBsZW4pKTsKKworI2lmZGVmIERFRl9GSUxFX1BSSU5UCitleHRlcm4gdm9pZCBkZWZfZmlsZV9wcmludCBQQVJBTVMgKChGSUxFICogX2ZpbGUsCisJCQkJICAgIGRlZl9maWxlICogX2RlZikpOworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlcC55IGIvbGQvZGVmZmlsZXAueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWNkZTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZGVmZmlsZXAueQpAQCAtMCwwICsxLDEwMDQgQEAKKyV7IC8qIGRlZmZpbGVwLnkgLSBwYXJzZXIgZm9yIC5kZWYgZmlsZXMgKi8KKworLyogICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImRlZmZpbGUuaCIKKworI2RlZmluZSBUUkFDRSAwCisKKyNkZWZpbmUgUk9VTkRfVVAoYSwgYikgKCgoYSkrKChiKS0xKSkmfigoYiktMSkpCisKKy8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAorICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCisgICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGxkLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IHRoZSB2YXJpYWJsZXMKKyAgIHByb2R1Y2VkIGJ5IHlhY2MuICBJZiBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UKKyAgIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlcgorICAgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KKworI2RlZmluZQl5eW1heGRlcHRoIGRlZl9tYXhkZXB0aAorI2RlZmluZQl5eXBhcnNlCWRlZl9wYXJzZQorI2RlZmluZQl5eWxleAlkZWZfbGV4CisjZGVmaW5lCXl5ZXJyb3IJZGVmX2Vycm9yCisjZGVmaW5lCXl5bHZhbAlkZWZfbHZhbAorI2RlZmluZQl5eWNoYXIJZGVmX2NoYXIKKyNkZWZpbmUJeXlkZWJ1ZwlkZWZfZGVidWcKKyNkZWZpbmUJeXlwYWN0CWRlZl9wYWN0CQorI2RlZmluZQl5eXIxCWRlZl9yMQkJCQorI2RlZmluZQl5eXIyCWRlZl9yMgkJCQorI2RlZmluZQl5eWRlZglkZWZfZGVmCQkKKyNkZWZpbmUJeXljaGsJZGVmX2NoawkJCisjZGVmaW5lCXl5cGdvCWRlZl9wZ28JCQorI2RlZmluZQl5eWFjdAlkZWZfYWN0CQkKKyNkZWZpbmUJeXlleGNhCWRlZl9leGNhCisjZGVmaW5lIHl5ZXJyZmxhZyBkZWZfZXJyZmxhZworI2RlZmluZSB5eW5lcnJzCWRlZl9uZXJycworI2RlZmluZQl5eXBzCWRlZl9wcworI2RlZmluZQl5eXB2CWRlZl9wdgorI2RlZmluZQl5eXMJZGVmX3MKKyNkZWZpbmUJeXlfeXlzCWRlZl95eXMKKyNkZWZpbmUJeXlzdGF0ZQlkZWZfc3RhdGUKKyNkZWZpbmUJeXl0bXAJZGVmX3RtcAorI2RlZmluZQl5eXYJZGVmX3YKKyNkZWZpbmUJeXlfeXl2CWRlZl95eXYKKyNkZWZpbmUJeXl2YWwJZGVmX3ZhbAorI2RlZmluZQl5eWxsb2MJZGVmX2xsb2MKKyNkZWZpbmUgeXlyZWRzCWRlZl9yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLworI2RlZmluZSB5eXRva3MJZGVmX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCisjZGVmaW5lIHl5bGhzCWRlZl95eWxocworI2RlZmluZSB5eWxlbglkZWZfeXlsZW4KKyNkZWZpbmUgeXlkZWZyZWQgZGVmX3l5ZGVmcmVkCisjZGVmaW5lIHl5ZGdvdG8JZGVmX3l5ZGdvdG8KKyNkZWZpbmUgeXlzaW5kZXggZGVmX3l5c2luZGV4CisjZGVmaW5lIHl5cmluZGV4IGRlZl95eXJpbmRleAorI2RlZmluZSB5eWdpbmRleCBkZWZfeXlnaW5kZXgKKyNkZWZpbmUgeXl0YWJsZQkgZGVmX3l5dGFibGUKKyNkZWZpbmUgeXljaGVjawkgZGVmX3l5Y2hlY2sKKworc3RhdGljIGludCBkZWZfbGV4ICgpOworCitzdGF0aWMgdm9pZCBkZWZfZGVzY3JpcHRpb24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBkZWZfZXhwb3J0cyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIGRlZl9oZWFwc2l6ZSBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgZGVmX2ltcG9ydAorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgZGVmX2xpYnJhcnkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGRlZl9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBkZWZfc2VjdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgZGVmX3NlY3Rpb25fYWx0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBkZWZfc3RhY2tzaXplIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBkZWZfdmVyc2lvbiBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgZGVmX2RpcmVjdGl2ZSBQQVJBTVMgKChjaGFyICopKTsKK3N0YXRpYyBpbnQgZGVmX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgZGVmX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIGludCBkZWZfZGVidWc7CitzdGF0aWMgaW50IGRlZl9sZXggUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IGxleF9mb3JjZWRfdG9rZW4gPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKmxleF9wYXJzZV9zdHJpbmcgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKmxleF9wYXJzZV9zdHJpbmdfZW5kID0gMDsKKworJX0KKworJXVuaW9uIHsKKyAgY2hhciAqaWQ7CisgIGludCBudW1iZXI7Cit9OworCisldG9rZW4gTkFNRSwgTElCUkFSWSwgREVTQ1JJUFRJT04sIFNUQUNLU0laRSwgSEVBUFNJWkUsIENPREUsIERBVEEKKyV0b2tlbiBTRUNUSU9OUywgRVhQT1JUUywgSU1QT1JUUywgVkVSU0lPTkssIEJBU0UsIENPTlNUQU5ULCBQUklWQVRFCisldG9rZW4gUkVBRCBXUklURSBFWEVDVVRFIFNIQVJFRCBOT05BTUUgRElSRUNUSVZFCisldG9rZW4gPGlkPiBJRAorJXRva2VuIDxudW1iZXI+IE5VTUJFUgorJXR5cGUgIDxudW1iZXI+IG9wdF9iYXNlIG9wdF9vcmRpbmFsCisldHlwZSAgPG51bWJlcj4gYXR0ciBhdHRyX2xpc3Qgb3B0X251bWJlciBleHBfb3B0X2xpc3QgZXhwX29wdAorJXR5cGUgIDxpZD4gb3B0X25hbWUgb3B0X2VxdWFsX25hbWUgCisKKyUlCisKK3N0YXJ0OiBzdGFydCBjb21tYW5kCisJfCBjb21tYW5kCisJOworCitjb21tYW5kOiAKKwkJTkFNRSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9uYW1lICgkMiwgJDMpOyB9CisJfAlMSUJSQVJZIG9wdF9uYW1lIG9wdF9iYXNlIHsgZGVmX2xpYnJhcnkgKCQyLCAkMyk7IH0KKwl8CURFU0NSSVBUSU9OIElEIHsgZGVmX2Rlc2NyaXB0aW9uICgkMik7fQorCXwJU1RBQ0tTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX3N0YWNrc2l6ZSAoJDIsICQzKTt9CisJfAlIRUFQU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9oZWFwc2l6ZSAoJDIsICQzKTt9CisJfAlDT0RFIGF0dHJfbGlzdCB7IGRlZl9zZWN0aW9uICgiQ09ERSIsICQyKTt9CisJfAlEQVRBIGF0dHJfbGlzdCAgeyBkZWZfc2VjdGlvbiAoIkRBVEEiLCAkMik7fQorCXwJU0VDVElPTlMgc2VjbGlzdAorCXwJRVhQT1JUUyBleHBsaXN0IAorCXwJSU1QT1JUUyBpbXBsaXN0CisJfAlWRVJTSU9OSyBOVU1CRVIgeyBkZWZfdmVyc2lvbiAoJDIsIDApO30KKwl8CVZFUlNJT05LIE5VTUJFUiAnLicgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLCAkNCk7fQorCXwJRElSRUNUSVZFIElEIHsgZGVmX2RpcmVjdGl2ZSAoJDIpO30KKwk7CisKKworZXhwbGlzdDoKKwkJLyogRU1QVFkgKi8KKwl8CWV4cGxpbmUKKwl8CWV4cGxpc3QgZXhwbGluZQorCTsKKworZXhwbGluZToKKwkJSUQgb3B0X2VxdWFsX25hbWUgb3B0X29yZGluYWwgZXhwX29wdF9saXN0CisJCQl7IGRlZl9leHBvcnRzICgkMSwgJDIsICQzLCAkNCk7IH0KKwk7CitleHBfb3B0X2xpc3Q6CisJCWV4cF9vcHQgZXhwX29wdF9saXN0IHsgJCQgPSAkMSB8ICQyOyB9CisJfAl7ICQkID0gMDsgfQorCTsKK2V4cF9vcHQ6CisJCU5PTkFNRQkJeyAkJCA9IDE7IH0KKwl8CUNPTlNUQU5UCXsgJCQgPSAyOyB9CisJfAlEQVRBCQl7ICQkID0gNDsgfQorCXwJUFJJVkFURQkJeyAkJCA9IDg7IH0KKwk7CitpbXBsaXN0OgkKKwkJaW1wbGlzdCBpbXBsaW5lCisJfAlpbXBsaW5lCisJOworCitpbXBsaW5lOgorICAgICAgICAgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgSUQgICAgIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAkNSwgJDcsIC0xKTsgfQorICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAnLicgTlVNQkVSIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAkNSwgIDAsICQ3KTsgfQorICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAgMCwgJDUsIC0xKTsgfQorICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsICQzLCAgMCwgIDAsICQ1KTsgfQorICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsICQxLCAkMywgJDUsIC0xKTsgfQorICAgICAgIHwgICAgICAgSUQgJy4nIElEICAgICAgICAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsICQxLCAgMCwgJDMsIC0xKTsgfQorOworCitzZWNsaXN0OgorCQlzZWNsaXN0IHNlY2xpbmUKKwl8CXNlY2xpbmUKKwk7CisKK3NlY2xpbmU6CisJSUQgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCQxLCAkMik7fQorCXwgSUQgSUQgeyBkZWZfc2VjdGlvbl9hbHQgKCQxLCAkMik7fQorCTsKKworYXR0cl9saXN0OgorCWF0dHJfbGlzdCBvcHRfY29tbWEgYXR0ciB7ICQkID0gJDEgfCAkMzsgfQorCXwgYXR0ciB7ICQkID0gJDE7IH0KKwk7CisKK29wdF9jb21tYToKKwknLCcKKwl8IAorCTsKK29wdF9udW1iZXI6ICcsJyBOVU1CRVIgeyAkJD0kMjt9CisJfAkgICB7ICQkPS0xO30KKwk7CisJCithdHRyOgorCQlSRUFECXsgJCQgPSAxO30KKwl8CVdSSVRFCXsgJCQgPSAyO30JCisJfAlFWEVDVVRFCXsgJCQ9NDt9CisJfAlTSEFSRUQJeyAkJD04O30KKwk7CisKK29wdF9uYW1lOiBJRAkJeyAkJCA9ICQxOyB9CisJfAkJeyAkJCA9IDA7IH0KKwk7CisKK29wdF9vcmRpbmFsOiAKKwkgICdAJyBOVU1CRVIgICAgIHsgJCQgPSAkMjt9CisJfCAgICAgICAgICAgICAgICB7ICQkID0gLTE7fQorCTsKKworb3B0X2VxdWFsX25hbWU6CisgICAgICAgICAgJz0nIElECXsgJCQgPSAkMjsgfQorICAgICAgICB8IAkJeyAkJCA9ICAwOyB9CQkJIAorCTsKKworb3B0X2Jhc2U6IEJBU0UJJz0nIE5VTUJFUgl7ICQkID0gJDM7fQorCXwJeyAkJCA9IDA7fQorCTsKKworCQorCislJQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEZJTEUgKnRoZV9maWxlOworc3RhdGljIGNvbnN0IGNoYXIgKmRlZl9maWxlbmFtZTsKK3N0YXRpYyBpbnQgbGluZW51bWJlcjsKK3N0YXRpYyBkZWZfZmlsZSAqZGVmOworc3RhdGljIGludCBzYXdfbmV3bGluZTsKKworc3RydWN0IGRpcmVjdGl2ZQorICB7CisgICAgc3RydWN0IGRpcmVjdGl2ZSAqbmV4dDsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBsZW47CisgIH07CisKK3N0YXRpYyBzdHJ1Y3QgZGlyZWN0aXZlICpkaXJlY3RpdmVzID0gMDsKKworZGVmX2ZpbGUgKgorZGVmX2ZpbGVfZW1wdHkgKCkKK3sKKyAgZGVmX2ZpbGUgKnJ2ID0gKGRlZl9maWxlICopIHhtYWxsb2MgKHNpemVvZiAoZGVmX2ZpbGUpKTsKKyAgbWVtc2V0IChydiwgMCwgc2l6ZW9mIChkZWZfZmlsZSkpOworICBydi0+aXNfZGxsID0gLTE7CisgIHJ2LT5iYXNlX2FkZHJlc3MgPSAoYmZkX3ZtYSkgKC0xKTsKKyAgcnYtPnN0YWNrX3Jlc2VydmUgPSBydi0+c3RhY2tfY29tbWl0ID0gLTE7CisgIHJ2LT5oZWFwX3Jlc2VydmUgPSBydi0+aGVhcF9jb21taXQgPSAtMTsKKyAgcnYtPnZlcnNpb25fbWFqb3IgPSBydi0+dmVyc2lvbl9taW5vciA9IC0xOworICByZXR1cm4gcnY7Cit9CisKK2RlZl9maWxlICoKK2RlZl9maWxlX3BhcnNlIChmaWxlbmFtZSwgYWRkX3RvKQorICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICAgZGVmX2ZpbGUgKmFkZF90bzsKK3sKKyAgc3RydWN0IGRpcmVjdGl2ZSAqZDsKKworICB0aGVfZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKKyAgZGVmX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisgIGxpbmVudW1iZXIgPSAxOworICBpZiAoIXRoZV9maWxlKQorICAgIHsKKyAgICAgIHBlcnJvciAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoYWRkX3RvKQorICAgIHsKKyAgICAgIGRlZiA9IGFkZF90bzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkZWYgPSBkZWZfZmlsZV9lbXB0eSAoKTsKKyAgICB9CisKKyAgc2F3X25ld2xpbmUgPSAxOworICBpZiAoZGVmX3BhcnNlICgpKQorICAgIHsKKyAgICAgIGRlZl9maWxlX2ZyZWUgKGRlZik7CisgICAgICBmY2xvc2UgKHRoZV9maWxlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmY2xvc2UgKHRoZV9maWxlKTsKKworICBmb3IgKGQgPSBkaXJlY3RpdmVzOyBkOyBkID0gZC0+bmV4dCkKKyAgICB7CisjaWYgVFJBQ0UKKyAgICAgIHByaW50ZiAoIkFkZGluZyBkaXJlY3RpdmUgJTA4eCBgJXMnXG4iLCBkLT5uYW1lLCBkLT5uYW1lKTsKKyNlbmRpZgorICAgICAgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSAoZGVmLCBkLT5uYW1lLCBkLT5sZW4pOworICAgIH0KKworICByZXR1cm4gZGVmOworfQorCit2b2lkCitkZWZfZmlsZV9mcmVlIChkZWYpCisgICAgIGRlZl9maWxlICpkZWY7Cit7CisgIGludCBpOworICBpZiAoIWRlZikKKyAgICByZXR1cm47CisgIGlmIChkZWYtPm5hbWUpCisgICAgZnJlZSAoZGVmLT5uYW1lKTsKKyAgaWYgKGRlZi0+ZGVzY3JpcHRpb24pCisgICAgZnJlZSAoZGVmLT5kZXNjcmlwdGlvbik7CisKKyAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9zZWN0aW9uX2RlZnM7IGkrKykKKwl7CisJICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSkKKwkgICAgZnJlZSAoZGVmLT5zZWN0aW9uX2RlZnNbaV0ubmFtZSk7CisJICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpCisJICAgIGZyZWUgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKTsKKwl9CisgICAgICBmcmVlIChkZWYtPnNlY3Rpb25fZGVmcyk7CisgICAgfQorCisgIGlmIChkZWYtPmV4cG9ydHMpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2V4cG9ydHM7IGkrKykKKwl7CisJICBpZiAoZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUKKwkgICAgICAmJiBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSAhPSBkZWYtPmV4cG9ydHNbaV0ubmFtZSkKKwkgICAgZnJlZSAoZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOworCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5uYW1lKQorCSAgICBmcmVlIChkZWYtPmV4cG9ydHNbaV0ubmFtZSk7CisJfQorICAgICAgZnJlZSAoZGVmLT5leHBvcnRzKTsKKyAgICB9CisKKyAgaWYgKGRlZi0+aW1wb3J0cykKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1faW1wb3J0czsgaSsrKQorCXsKKwkgIGlmIChkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZQorCSAgICAgICYmIGRlZi0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lICE9IGRlZi0+aW1wb3J0c1tpXS5uYW1lKQorCSAgICBmcmVlIChkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7CisJICBpZiAoZGVmLT5pbXBvcnRzW2ldLm5hbWUpCisJICAgIGZyZWUgKGRlZi0+aW1wb3J0c1tpXS5uYW1lKTsKKwl9CisgICAgICBmcmVlIChkZWYtPmltcG9ydHMpOworICAgIH0KKworICB3aGlsZSAoZGVmLT5tb2R1bGVzKQorICAgIHsKKyAgICAgIGRlZl9maWxlX21vZHVsZSAqbSA9IGRlZi0+bW9kdWxlczsKKyAgICAgIGRlZi0+bW9kdWxlcyA9IGRlZi0+bW9kdWxlcy0+bmV4dDsKKyAgICAgIGZyZWUgKG0pOworICAgIH0KKworICBmcmVlIChkZWYpOworfQorCisjaWZkZWYgREVGX0ZJTEVfUFJJTlQKK3ZvaWQKK2RlZl9maWxlX3ByaW50IChmaWxlLCBkZWYpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGRlZl9maWxlICpkZWY7Cit7CisgIGludCBpOworICBmcHJpbnRmIChmaWxlLCAiPj4+PiBkZWZfZmlsZSBhdCAweCUwOHhcbiIsIGRlZik7CisgIGlmIChkZWYtPm5hbWUpCisgICAgZnByaW50ZiAoZmlsZSwgIiAgbmFtZTogJXNcbiIsIGRlZi0+bmFtZSA/IGRlZi0+bmFtZSA6ICIodW5zcGVjaWZpZWQpIik7CisgIGlmIChkZWYtPmlzX2RsbCAhPSAtMSkKKyAgICBmcHJpbnRmIChmaWxlLCAiICBpcyBkbGw6ICVzXG4iLCBkZWYtPmlzX2RsbCA/ICJ5ZXMiIDogIm5vIik7CisgIGlmIChkZWYtPmJhc2VfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgKC0xKSkKKyAgICBmcHJpbnRmIChmaWxlLCAiICBiYXNlIGFkZHJlc3M6IDB4JTA4eFxuIiwgZGVmLT5iYXNlX2FkZHJlc3MpOworICBpZiAoZGVmLT5kZXNjcmlwdGlvbikKKyAgICBmcHJpbnRmIChmaWxlLCAiICBkZXNjcmlwdGlvbjogYCVzJ1xuIiwgZGVmLT5kZXNjcmlwdGlvbik7CisgIGlmIChkZWYtPnN0YWNrX3Jlc2VydmUgIT0gLTEpCisgICAgZnByaW50ZiAoZmlsZSwgIiAgc3RhY2sgcmVzZXJ2ZTogMHglMDh4XG4iLCBkZWYtPnN0YWNrX3Jlc2VydmUpOworICBpZiAoZGVmLT5zdGFja19jb21taXQgIT0gLTEpCisgICAgZnByaW50ZiAoZmlsZSwgIiAgc3RhY2sgY29tbWl0OiAweCUwOHhcbiIsIGRlZi0+c3RhY2tfY29tbWl0KTsKKyAgaWYgKGRlZi0+aGVhcF9yZXNlcnZlICE9IC0xKQorICAgIGZwcmludGYgKGZpbGUsICIgIGhlYXAgcmVzZXJ2ZTogMHglMDh4XG4iLCBkZWYtPmhlYXBfcmVzZXJ2ZSk7CisgIGlmIChkZWYtPmhlYXBfY29tbWl0ICE9IC0xKQorICAgIGZwcmludGYgKGZpbGUsICIgIGhlYXAgY29tbWl0OiAweCUwOHhcbiIsIGRlZi0+aGVhcF9jb21taXQpOworCisgIGlmIChkZWYtPm51bV9zZWN0aW9uX2RlZnMgPiAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKGZpbGUsICIgIHNlY3Rpb24gZGVmczpcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQorCXsKKwkgIGZwcmludGYgKGZpbGUsICIgICAgbmFtZTogYCVzJywgY2xhc3M6IGAlcycsIGZsYWdzOiIsCisJCSAgIGRlZi0+c2VjdGlvbl9kZWZzW2ldLm5hbWUsIGRlZi0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKTsKKwkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3JlYWQpCisJICAgIGZwcmludGYgKGZpbGUsICIgUiIpOworCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfd3JpdGUpCisJICAgIGZwcmludGYgKGZpbGUsICIgVyIpOworCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfZXhlY3V0ZSkKKwkgICAgZnByaW50ZiAoZmlsZSwgIiBYIik7CisJICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19zaGFyZWQpCisJICAgIGZwcmludGYgKGZpbGUsICIgUyIpOworCSAgZnByaW50ZiAoZmlsZSwgIlxuIik7CisJfQorICAgIH0KKworICBpZiAoZGVmLT5udW1fZXhwb3J0cyA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoZmlsZSwgIiAgZXhwb3J0czpcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2V4cG9ydHM7IGkrKykKKwl7CisJICBmcHJpbnRmIChmaWxlLCAiICAgIG5hbWU6IGAlcycsIGludDogYCVzJywgb3JkaW5hbDogJWQsIGZsYWdzOiIsCisJCSAgIGRlZi0+ZXhwb3J0c1tpXS5uYW1lLCBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwKKwkJICAgZGVmLT5leHBvcnRzW2ldLm9yZGluYWwpOworCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX3ByaXZhdGUpCisJICAgIGZwcmludGYgKGZpbGUsICIgUCIpOworCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX2NvbnN0YW50KQorCSAgICBmcHJpbnRmIChmaWxlLCAiIEMiKTsKKwkgIGlmIChkZWYtPmV4cG9ydHNbaV0uZmxhZ19ub25hbWUpCisJICAgIGZwcmludGYgKGZpbGUsICIgTiIpOworCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5mbGFnX2RhdGEpCisJICAgIGZwcmludGYgKGZpbGUsICIgRCIpOworCSAgZnByaW50ZiAoZmlsZSwgIlxuIik7CisJfQorICAgIH0KKworICBpZiAoZGVmLT5udW1faW1wb3J0cyA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoZmlsZSwgIiAgaW1wb3J0czpcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2ltcG9ydHM7IGkrKykKKwl7CisJICBmcHJpbnRmIChmaWxlLCAiICAgIGludDogJXMsIGZyb206IGAlcycsIG5hbWU6IGAlcycsIG9yZGluYWw6ICVkXG4iLAorCQkgICBkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwKKwkJICAgZGVmLT5pbXBvcnRzW2ldLm1vZHVsZSwKKwkJICAgZGVmLT5pbXBvcnRzW2ldLm5hbWUsCisJCSAgIGRlZi0+aW1wb3J0c1tpXS5vcmRpbmFsKTsKKwl9CisgICAgfQorICBpZiAoZGVmLT52ZXJzaW9uX21ham9yICE9IC0xKQorICAgIGZwcmludGYgKGZpbGUsICIgIHZlcnNpb246ICVkLiVkXG4iLCBkZWYtPnZlcnNpb25fbWFqb3IsIGRlZi0+dmVyc2lvbl9taW5vcik7CisgIGZwcmludGYgKGZpbGUsICI8PDw8IGRlZl9maWxlIGF0IDB4JTA4eFxuIiwgZGVmKTsKK30KKyNlbmRpZgorCitkZWZfZmlsZV9leHBvcnQgKgorZGVmX2ZpbGVfYWRkX2V4cG9ydCAoZGVmLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lLCBvcmRpbmFsKQorICAgICBkZWZfZmlsZSAqZGVmOworICAgICBjb25zdCBjaGFyICpleHRlcm5hbF9uYW1lOworICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOworICAgICBpbnQgb3JkaW5hbDsKK3sKKyAgZGVmX2ZpbGVfZXhwb3J0ICplOworICBpbnQgbWF4X2V4cG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9leHBvcnRzLCAzMik7CisgIGlmIChkZWYtPm51bV9leHBvcnRzID49IG1heF9leHBvcnRzKQorICAgIHsKKyAgICAgIG1heF9leHBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1fZXhwb3J0cysxLCAzMik7CisgICAgICBpZiAoZGVmLT5leHBvcnRzKQorCWRlZi0+ZXhwb3J0cyA9IChkZWZfZmlsZV9leHBvcnQgKikgeHJlYWxsb2MgKGRlZi0+ZXhwb3J0cywgbWF4X2V4cG9ydHMgKiBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOworICAgICAgZWxzZQorCWRlZi0+ZXhwb3J0cyA9IChkZWZfZmlsZV9leHBvcnQgKikgeG1hbGxvYyAobWF4X2V4cG9ydHMgKiBzaXplb2YgKGRlZl9maWxlX2V4cG9ydCkpOworICAgIH0KKyAgZSA9IGRlZi0+ZXhwb3J0cyArIGRlZi0+bnVtX2V4cG9ydHM7CisgIG1lbXNldCAoZSwgMCwgc2l6ZW9mIChkZWZfZmlsZV9leHBvcnQpKTsKKyAgaWYgKGludGVybmFsX25hbWUgJiYgIWV4dGVybmFsX25hbWUpCisgICAgZXh0ZXJuYWxfbmFtZSA9IGludGVybmFsX25hbWU7CisgIGlmIChleHRlcm5hbF9uYW1lICYmICFpbnRlcm5hbF9uYW1lKQorICAgIGludGVybmFsX25hbWUgPSBleHRlcm5hbF9uYW1lOworICBlLT5uYW1lID0geHN0cmR1cCAoZXh0ZXJuYWxfbmFtZSk7CisgIGUtPmludGVybmFsX25hbWUgPSB4c3RyZHVwIChpbnRlcm5hbF9uYW1lKTsKKyAgZS0+b3JkaW5hbCA9IG9yZGluYWw7CisgIGRlZi0+bnVtX2V4cG9ydHMrKzsKKyAgcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBkZWZfZmlsZV9tb2R1bGUgKgorZGVmX3N0YXNoX21vZHVsZSAoZGVmLCBuYW1lKQorICAgICBkZWZfZmlsZSAqZGVmOworICAgICBjaGFyICpuYW1lOworeworICBkZWZfZmlsZV9tb2R1bGUgKnM7CisgIGZvciAocz1kZWYtPm1vZHVsZXM7IHM7IHM9cy0+bmV4dCkKKyAgICBpZiAoc3RyY21wIChzLT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgcmV0dXJuIHM7CisgIHMgPSAoZGVmX2ZpbGVfbW9kdWxlICopIHhtYWxsb2MgKHNpemVvZiAoZGVmX2ZpbGVfbW9kdWxlKSArIHN0cmxlbiAobmFtZSkpOworICBzLT5uZXh0ID0gZGVmLT5tb2R1bGVzOworICBkZWYtPm1vZHVsZXMgPSBzOworICBzLT51c2VyX2RhdGEgPSAwOworICBzdHJjcHkgKHMtPm5hbWUsIG5hbWUpOworICByZXR1cm4gczsKK30KKworZGVmX2ZpbGVfaW1wb3J0ICoKK2RlZl9maWxlX2FkZF9pbXBvcnQgKGRlZiwgbmFtZSwgbW9kdWxlLCBvcmRpbmFsLCBpbnRlcm5hbF9uYW1lKQorICAgICBkZWZfZmlsZSAqZGVmOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICptb2R1bGU7CisgICAgIGludCBvcmRpbmFsOworICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOworeworICBkZWZfZmlsZV9pbXBvcnQgKmk7CisgIGludCBtYXhfaW1wb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2ltcG9ydHMsIDE2KTsKKyAgaWYgKGRlZi0+bnVtX2ltcG9ydHMgPj0gbWF4X2ltcG9ydHMpCisgICAgeworICAgICAgbWF4X2ltcG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9pbXBvcnRzKzEsIDE2KTsKKyAgICAgIGlmIChkZWYtPmltcG9ydHMpCisJZGVmLT5pbXBvcnRzID0gKGRlZl9maWxlX2ltcG9ydCAqKSB4cmVhbGxvYyAoZGVmLT5pbXBvcnRzLCBtYXhfaW1wb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7CisgICAgICBlbHNlCisJZGVmLT5pbXBvcnRzID0gKGRlZl9maWxlX2ltcG9ydCAqKSB4bWFsbG9jIChtYXhfaW1wb3J0cyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7CisgICAgfQorICBpID0gZGVmLT5pbXBvcnRzICsgZGVmLT5udW1faW1wb3J0czsKKyAgbWVtc2V0IChpLCAwLCBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOworICBpZiAobmFtZSkKKyAgICBpLT5uYW1lID0geHN0cmR1cCAobmFtZSk7CisgIGlmIChtb2R1bGUpCisgICAgaS0+bW9kdWxlID0gZGVmX3N0YXNoX21vZHVsZShkZWYsIG1vZHVsZSk7CisgIGktPm9yZGluYWwgPSBvcmRpbmFsOworICBpZiAoaW50ZXJuYWxfbmFtZSkKKyAgICBpLT5pbnRlcm5hbF9uYW1lID0geHN0cmR1cCAoaW50ZXJuYWxfbmFtZSk7CisgIGVsc2UKKyAgICBpLT5pbnRlcm5hbF9uYW1lID0gaS0+bmFtZTsKKyAgZGVmLT5udW1faW1wb3J0cysrOworICByZXR1cm4gaTsKK30KKworc3RydWN0Cit7CisgIGNoYXIgKnBhcmFtOworICBpbnQgdG9rZW47Cit9CitkaXJvcHRzW10gPQoreworICB7ICItaGVhcCIsIEhFQVBTSVpFIH0sCisgIHsgIi1zdGFjayIsIFNUQUNLU0laRSB9LAorICB7ICItYXR0ciIsIFNFQ1RJT05TIH0sCisgIHsgIi1leHBvcnQiLCBFWFBPUlRTIH0sCisgIHsgMCwgMCB9Cit9OworCit2b2lkCitkZWZfZmlsZV9hZGRfZGlyZWN0aXZlIChteV9kZWYsIHBhcmFtLCBsZW4pCisgICAgIGRlZl9maWxlICpteV9kZWY7CisgICAgIGNvbnN0IGNoYXIgKnBhcmFtOworICAgICBpbnQgbGVuOworeworICBkZWZfZmlsZSAqc2F2ZV9kZWYgPSBkZWY7CisgIGNvbnN0IGNoYXIgKnBlbmQgPSBwYXJhbSArIGxlbjsKKyAgY29uc3QgY2hhciAqdGVuZCA9IHBhcmFtOworICBpbnQgaTsKKworICBkZWYgPSBteV9kZWY7CisKKyAgd2hpbGUgKHBhcmFtIDwgcGVuZCkKKyAgICB7CisgICAgICB3aGlsZSAocGFyYW0gPCBwZW5kICYmIGlzc3BhY2UgKCpwYXJhbSkpCisJcGFyYW0rKzsKKyAgICAgIGZvciAodGVuZCA9IHBhcmFtICsgMTsKKwkgICB0ZW5kIDwgcGVuZCAmJiAhKGlzc3BhY2UgKHRlbmRbLTFdKSAmJiAqdGVuZCA9PSAnLScpOworCSAgIHRlbmQrKyk7CisKKyAgICAgIGZvciAoaSA9IDA7IGRpcm9wdHNbaV0ucGFyYW07IGkrKykKKwl7CisJICBpbnQgbGVuID0gc3RybGVuIChkaXJvcHRzW2ldLnBhcmFtKTsKKwkgIGlmICh0ZW5kIC0gcGFyYW0gPj0gbGVuCisJICAgICAgJiYgc3RybmNtcCAocGFyYW0sIGRpcm9wdHNbaV0ucGFyYW0sIGxlbikgPT0gMAorCSAgICAgICYmIChwYXJhbVtsZW5dID09ICc6JyB8fCBwYXJhbVtsZW5dID09ICcgJykpCisJICAgIHsKKwkgICAgICBsZXhfcGFyc2Vfc3RyaW5nX2VuZCA9IHRlbmQ7CisJICAgICAgbGV4X3BhcnNlX3N0cmluZyA9IHBhcmFtICsgbGVuICsgMTsKKwkgICAgICBsZXhfZm9yY2VkX3Rva2VuID0gZGlyb3B0c1tpXS50b2tlbjsKKwkgICAgICBzYXdfbmV3bGluZSA9IDA7CisJICAgICAgZGVmX3BhcnNlICgpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBpZiAoIWRpcm9wdHNbaV0ucGFyYW0pCisJeworCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgIGVpbmZvIChfKCJXYXJuaW5nOiAuZHJlY3R2ZSBgJS4qcycgdW5yZWNvZ25pemVkXG4iKSwKKwkJIHRlbmQgLSBwYXJhbSwgcGFyYW0pOworCX0KKyAgICAgIGxleF9wYXJzZV9zdHJpbmcgPSAwOworICAgICAgcGFyYW0gPSB0ZW5kOworICAgIH0KKworICBkZWYgPSBzYXZlX2RlZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUGFyc2VyIENhbGxiYWNrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZGVmX25hbWUgKG5hbWUsIGJhc2UpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGludCBiYXNlOworeworICBpZiAoZGVmLT5uYW1lKQorICAgIGZyZWUgKGRlZi0+bmFtZSk7CisgIGRlZi0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOworICBkZWYtPmJhc2VfYWRkcmVzcyA9IGJhc2U7CisgIGRlZi0+aXNfZGxsID0gMDsKK30KKworc3RhdGljIHZvaWQKK2RlZl9saWJyYXJ5IChuYW1lLCBiYXNlKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgYmFzZTsKK3sKKyAgaWYgKGRlZi0+bmFtZSkKKyAgICBmcmVlIChkZWYtPm5hbWUpOworICBkZWYtPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKKyAgZGVmLT5iYXNlX2FkZHJlc3MgPSBiYXNlOworICBkZWYtPmlzX2RsbCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZfZGVzY3JpcHRpb24gKHRleHQpCisgICAgIGNvbnN0IGNoYXIgKnRleHQ7Cit7CisgIGludCBsZW4gPSBkZWYtPmRlc2NyaXB0aW9uID8gc3RybGVuIChkZWYtPmRlc2NyaXB0aW9uKSA6IDA7CisgIGxlbiArPSBzdHJsZW4gKHRleHQpICsgMTsKKyAgaWYgKGRlZi0+ZGVzY3JpcHRpb24pCisgICAgeworICAgICAgZGVmLT5kZXNjcmlwdGlvbiA9IChjaGFyICopIHhyZWFsbG9jIChkZWYtPmRlc2NyaXB0aW9uLCBsZW4pOworICAgICAgc3RyY2F0IChkZWYtPmRlc2NyaXB0aW9uLCB0ZXh0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkZWYtPmRlc2NyaXB0aW9uID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKKyAgICAgIHN0cmNweSAoZGVmLT5kZXNjcmlwdGlvbiwgdGV4dCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGVmX3N0YWNrc2l6ZSAocmVzZXJ2ZSwgY29tbWl0KQorICAgICBpbnQgcmVzZXJ2ZTsKKyAgICAgaW50IGNvbW1pdDsKK3sKKyAgZGVmLT5zdGFja19yZXNlcnZlID0gcmVzZXJ2ZTsKKyAgZGVmLT5zdGFja19jb21taXQgPSBjb21taXQ7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZfaGVhcHNpemUgKHJlc2VydmUsIGNvbW1pdCkKKyAgICAgaW50IHJlc2VydmU7CisgICAgIGludCBjb21taXQ7Cit7CisgIGRlZi0+aGVhcF9yZXNlcnZlID0gcmVzZXJ2ZTsKKyAgZGVmLT5oZWFwX2NvbW1pdCA9IGNvbW1pdDsKK30KKworc3RhdGljIHZvaWQKK2RlZl9zZWN0aW9uIChuYW1lLCBhdHRyKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgYXR0cjsKK3sKKyAgZGVmX2ZpbGVfc2VjdGlvbiAqczsKKyAgaW50IG1heF9zZWN0aW9ucyA9IFJPVU5EX1VQKGRlZi0+bnVtX3NlY3Rpb25fZGVmcywgNCk7CisgIGlmIChkZWYtPm51bV9zZWN0aW9uX2RlZnMgPj0gbWF4X3NlY3Rpb25zKQorICAgIHsKKyAgICAgIG1heF9zZWN0aW9ucyA9IFJPVU5EX1VQKGRlZi0+bnVtX3NlY3Rpb25fZGVmcysxLCA0KTsKKyAgICAgIGlmIChkZWYtPnNlY3Rpb25fZGVmcykKKwlkZWYtPnNlY3Rpb25fZGVmcyA9IChkZWZfZmlsZV9zZWN0aW9uICopIHhyZWFsbG9jIChkZWYtPnNlY3Rpb25fZGVmcywgbWF4X3NlY3Rpb25zICogc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKKyAgICAgIGVsc2UKKwlkZWYtPnNlY3Rpb25fZGVmcyA9IChkZWZfZmlsZV9zZWN0aW9uICopIHhtYWxsb2MgKG1heF9zZWN0aW9ucyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7CisgICAgfQorICBzID0gZGVmLT5zZWN0aW9uX2RlZnMgKyBkZWYtPm51bV9zZWN0aW9uX2RlZnM7CisgIG1lbXNldCAocywgMCwgc2l6ZW9mIChkZWZfZmlsZV9zZWN0aW9uKSk7CisgIHMtPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKKyAgaWYgKGF0dHIgJiAxKQorICAgIHMtPmZsYWdfcmVhZCA9IDE7CisgIGlmIChhdHRyICYgMikKKyAgICBzLT5mbGFnX3dyaXRlID0gMTsKKyAgaWYgKGF0dHIgJiA0KQorICAgIHMtPmZsYWdfZXhlY3V0ZSA9IDE7CisgIGlmIChhdHRyICYgOCkKKyAgICBzLT5mbGFnX3NoYXJlZCA9IDE7CisKKyAgZGVmLT5udW1fc2VjdGlvbl9kZWZzKys7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZfc2VjdGlvbl9hbHQgKG5hbWUsIGF0dHIpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKmF0dHI7Cit7CisgIGludCBhdmFsID0gMDsKKyAgZm9yICg7ICphdHRyOyBhdHRyKyspCisgICAgeworICAgICAgc3dpdGNoICgqYXR0cikKKwl7CisJY2FzZSAnUic6CisJY2FzZSAncic6CisJICBhdmFsIHw9IDE7CisJICBicmVhazsKKwljYXNlICdXJzoKKwljYXNlICd3JzoKKwkgIGF2YWwgfD0gMjsKKwkgIGJyZWFrOworCWNhc2UgJ1gnOgorCWNhc2UgJ3gnOgorCSAgYXZhbCB8PSA0OworCSAgYnJlYWs7CisJY2FzZSAnUyc6CisJY2FzZSAncyc6CisJICBhdmFsIHw9IDg7CisJICBicmVhazsKKwl9CisgICAgfQorICBkZWZfc2VjdGlvbiAobmFtZSwgYXZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZfZXhwb3J0cyAoZXh0ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCwgZmxhZ3MpCisgICAgIGNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWU7CisgICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7CisgICAgIGludCBvcmRpbmFsOworICAgICBpbnQgZmxhZ3M7Cit7CisgIGRlZl9maWxlX2V4cG9ydCAqZGZlOworCisgIGlmICghaW50ZXJuYWxfbmFtZSAmJiBleHRlcm5hbF9uYW1lKQorICAgIGludGVybmFsX25hbWUgPSBleHRlcm5hbF9uYW1lOworI2lmIFRSQUNFCisgIHByaW50ZiAoImRlZl9leHBvcnRzLCBleHQ9JXMgaW50PSVzXG4iLCBleHRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lKTsKKyNlbmRpZgorCisgIGRmZSA9IGRlZl9maWxlX2FkZF9leHBvcnQgKGRlZiwgZXh0ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCk7CisgIGlmIChmbGFncyAmIDEpCisgICAgZGZlLT5mbGFnX25vbmFtZSA9IDE7CisgIGlmIChmbGFncyAmIDIpCisgICAgZGZlLT5mbGFnX2NvbnN0YW50ID0gMTsKKyAgaWYgKGZsYWdzICYgNCkKKyAgICBkZmUtPmZsYWdfZGF0YSA9IDE7CisgIGlmIChmbGFncyAmIDgpCisgICAgZGZlLT5mbGFnX3ByaXZhdGUgPSAxOworfQorCitzdGF0aWMgdm9pZAorZGVmX2ltcG9ydCAoaW50ZXJuYWxfbmFtZSwgbW9kdWxlLCBkbGxleHQsIG5hbWUsIG9yZGluYWwpCisgICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7CisgICAgIGNvbnN0IGNoYXIgKm1vZHVsZTsKKyAgICAgY29uc3QgY2hhciAqZGxsZXh0OworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgb3JkaW5hbDsKK3sKKyAgY2hhciAqYnVmID0gMDsKKworICBpZiAoZGxsZXh0ICE9IE5VTEwpCisgICAgeworICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChtb2R1bGUpICsgc3RybGVuIChkbGxleHQpICsgMik7CisgICAgICBzcHJpbnRmIChidWYsICIlcy4lcyIsIG1vZHVsZSwgZGxsZXh0KTsKKyAgICAgIG1vZHVsZSA9IGJ1ZjsKKyAgICB9CisKKyAgZGVmX2ZpbGVfYWRkX2ltcG9ydCAoZGVmLCBuYW1lLCBtb2R1bGUsIG9yZGluYWwsIGludGVybmFsX25hbWUpOworICBpZiAoYnVmKQorICAgIGZyZWUgKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZfdmVyc2lvbiAobWFqb3IsIG1pbm9yKQorICAgICBpbnQgbWFqb3I7CisgICAgIGludCBtaW5vcjsKK3sKKyAgZGVmLT52ZXJzaW9uX21ham9yID0gbWFqb3I7CisgIGRlZi0+dmVyc2lvbl9taW5vciA9IG1pbm9yOworfQorCitzdGF0aWMgdm9pZAorZGVmX2RpcmVjdGl2ZSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIHN0cnVjdCBkaXJlY3RpdmUgKmQgPSAoc3RydWN0IGRpcmVjdGl2ZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkaXJlY3RpdmUpKTsKKyAgZC0+bmV4dCA9IGRpcmVjdGl2ZXM7CisgIGRpcmVjdGl2ZXMgPSBkOworICBkLT5uYW1lID0geHN0cmR1cCAoc3RyKTsKKyAgZC0+bGVuID0gc3RybGVuIChzdHIpOworfQorCitzdGF0aWMgaW50CitkZWZfZXJyb3IgKGVycikKKyAgICAgY29uc3QgY2hhciAqZXJyOworeworICBlaW5mbyAoIiVQOiAlczolZDogJXNcbiIsIGRlZl9maWxlbmFtZSwgbGluZW51bWJlciwgZXJyKTsKKworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBMZXhpY2FsIFNjYW5uZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIDAKKworLyogTmV2ZXIgZnJlZWQsIGJ1dCBhbHdheXMgcmV1c2VkIGFzIG5lZWRlZCwgc28gbm8gcmVhbCBsZWFrICovCitzdGF0aWMgY2hhciAqYnVmZmVyID0gMDsKK3N0YXRpYyBpbnQgYnVmbGVuID0gMDsKK3N0YXRpYyBpbnQgYnVmcHRyID0gMDsKKworc3RhdGljIHZvaWQKK3B1dF9idWYgKGMpCisgICAgIGNoYXIgYzsKK3sKKyAgaWYgKGJ1ZnB0ciA9PSBidWZsZW4pCisgICAgeworICAgICAgYnVmbGVuICs9IDUwOwkJLyogb3Zlcmx5IHJlYXNvbmFibGUsIGVoPyAqLworICAgICAgaWYgKGJ1ZmZlcikKKwlidWZmZXIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYnVmZmVyLCBidWZsZW4gKyAxKTsKKyAgICAgIGVsc2UKKwlidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChidWZsZW4gKyAxKTsKKyAgICB9CisgIGJ1ZmZlcltidWZwdHIrK10gPSBjOworICBidWZmZXJbYnVmcHRyXSA9IDA7CQkvKiBub3Qgb3B0aW1hbCwgYnV0IHZlcnkgY29udmVuaWVudCAqLworfQorCitzdGF0aWMgc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCB0b2tlbjsKK30KK3Rva2Vuc1tdID0KK3sKKyAgeyAiQkFTRSIsIEJBU0UgfSwKKyAgeyAiQ09ERSIsIENPREUgfSwKKyAgeyAiQ09OU1RBTlQiLCBDT05TVEFOVCB9LAorICB7ICJEQVRBIiwgREFUQSB9LAorICB7ICJERVNDUklQVElPTiIsIERFU0NSSVBUSU9OIH0sCisgIHsgIkRJUkVDVElWRSIsIERJUkVDVElWRSB9LAorICB7ICJFWEVDVVRFIiwgRVhFQ1VURSB9LAorICB7ICJFWFBPUlRTIiwgRVhQT1JUUyB9LAorICB7ICJIRUFQU0laRSIsIEhFQVBTSVpFIH0sCisgIHsgIklNUE9SVFMiLCBJTVBPUlRTIH0sCisgIHsgIkxJQlJBUlkiLCBMSUJSQVJZIH0sCisgIHsgIk5BTUUiLCBOQU1FIH0sCisgIHsgIk5PTkFNRSIsIE5PTkFNRSB9LAorICB7ICJQUklWQVRFIiwgUFJJVkFURSB9LAorICB7ICJSRUFEIiwgUkVBRCB9LAorICB7ICJTRUNUSU9OUyIsIFNFQ1RJT05TIH0sCisgIHsgIlNFR01FTlRTIiwgU0VDVElPTlMgfSwKKyAgeyAiU0hBUkVEIiwgU0hBUkVEIH0sCisgIHsgIlNUQUNLU0laRSIsIFNUQUNLU0laRSB9LAorICB7ICJWRVJTSU9OIiwgVkVSU0lPTksgfSwKKyAgeyAiV1JJVEUiLCBXUklURSB9LAorICB7IDAsIDAgfQorfTsKKworc3RhdGljIGludAorZGVmX2dldGMgKCkKK3sKKyAgaW50IHJ2OworICBpZiAobGV4X3BhcnNlX3N0cmluZykKKyAgICB7CisgICAgICBpZiAobGV4X3BhcnNlX3N0cmluZyA+PSBsZXhfcGFyc2Vfc3RyaW5nX2VuZCkKKwlydiA9IEVPRjsKKyAgICAgIGVsc2UKKwlydiA9ICpsZXhfcGFyc2Vfc3RyaW5nKys7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcnYgPSBmZ2V0YyAodGhlX2ZpbGUpOworICAgIH0KKyAgaWYgKHJ2ID09ICdcbicpCisgICAgc2F3X25ld2xpbmUgPSAxOworICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQKK2RlZl91bmdldGMgKGMpCisgICAgIGludCBjOworeworICBpZiAobGV4X3BhcnNlX3N0cmluZykKKyAgICB7CisgICAgICBsZXhfcGFyc2Vfc3RyaW5nLS07CisgICAgICByZXR1cm4gYzsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gdW5nZXRjIChjLCB0aGVfZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQKK2RlZl9sZXggKCkKK3sKKyAgaW50IGMsIGksIHE7CisKKyAgaWYgKGxleF9mb3JjZWRfdG9rZW4pCisgICAgeworICAgICAgaSA9IGxleF9mb3JjZWRfdG9rZW47CisgICAgICBsZXhfZm9yY2VkX3Rva2VuID0gMDsKKyNpZiBUUkFDRQorICAgICAgcHJpbnRmICgibGV4OiBmb3JjaW5nIHRva2VuICVkXG4iLCBpKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgIGMgPSBkZWZfZ2V0YyAoKTsKKworICAvKiB0cmltIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICB3aGlsZSAoYyAhPSBFT0YgJiYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykgJiYgc2F3X25ld2xpbmUpCisgICAgYyA9IGRlZl9nZXRjICgpOworCisgIGlmIChjID09IEVPRikKKyAgICB7CisjaWYgVFJBQ0UKKyAgICAgIHByaW50ZiAoImxleDogRU9GXG4iKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChzYXdfbmV3bGluZSAmJiBjID09ICc7JykKKyAgICB7CisgICAgICBkbworCXsKKwkgIGMgPSBkZWZfZ2V0YyAoKTsKKwl9CisgICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKTsKKyAgICAgIGlmIChjID09ICdcbicpCisJcmV0dXJuIGRlZl9sZXggKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIC8qIG11c3QgYmUgc29tZXRoaW5nIGVsc2UgKi8KKyAgc2F3X25ld2xpbmUgPSAwOworCisgIGlmIChpc2RpZ2l0IChjKSkKKyAgICB7CisgICAgICBidWZwdHIgPSAwOworICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIChpc3hkaWdpdCAoYykgfHwgKGMgPT0gJ3gnKSkpCisJeworCSAgcHV0X2J1ZiAoYyk7CisJICBjID0gZGVmX2dldGMgKCk7CisJfQorICAgICAgaWYgKGMgIT0gRU9GKQorCWRlZl91bmdldGMgKGMpOworICAgICAgeXlsdmFsLm51bWJlciA9IHN0cnRvdWwgKGJ1ZmZlciwgMCwgMCk7CisjaWYgVFJBQ0UKKyAgICAgIHByaW50ZiAoImxleDogYCVzJyByZXR1cm5zIE5VTUJFUiAlZFxuIiwgYnVmZmVyLCB5eWx2YWwubnVtYmVyKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIE5VTUJFUjsKKyAgICB9CisKKyAgaWYgKGlzYWxwaGEgKGMpIHx8IHN0cmNociAoIiQ6LV8/IiwgYykpCisgICAgeworICAgICAgYnVmcHRyID0gMDsKKyAgICAgIHdoaWxlIChjICE9IEVPRiAmJiAoaXNhbG51bSAoYykgfHwgc3RyY2hyICgiJDotXz8vQCIsIGMpKSkKKwl7CisJICBwdXRfYnVmIChjKTsKKwkgIGMgPSBkZWZfZ2V0YyAoKTsKKwl9CisgICAgICBpZiAoYyAhPSBFT0YpCisJZGVmX3VuZ2V0YyAoYyk7CisgICAgICBmb3IgKGkgPSAwOyB0b2tlbnNbaV0ubmFtZTsgaSsrKQorCWlmIChzdHJjbXAgKHRva2Vuc1tpXS5uYW1lLCBidWZmZXIpID09IDApCisJICB7CisjaWYgVFJBQ0UKKwkgICAgcHJpbnRmICgibGV4OiBgJXMnIGlzIGEgc3RyaW5nIHRva2VuXG4iLCBidWZmZXIpOworI2VuZGlmCisJICAgIHJldHVybiB0b2tlbnNbaV0udG9rZW47CisJICB9CisjaWYgVFJBQ0UKKyAgICAgIHByaW50ZiAoImxleDogYCVzJyByZXR1cm5zIElEXG4iLCBidWZmZXIpOworI2VuZGlmCisgICAgICB5eWx2YWwuaWQgPSB4c3RyZHVwIChidWZmZXIpOworICAgICAgcmV0dXJuIElEOworICAgIH0KKworICBpZiAoYyA9PSAnXCcnIHx8IGMgPT0gJyInKQorICAgIHsKKyAgICAgIHEgPSBjOworICAgICAgYyA9IGRlZl9nZXRjICgpOworICAgICAgYnVmcHRyID0gMDsKKyAgICAgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9IHEpCisJeworCSAgcHV0X2J1ZiAoYyk7CisJICBjID0gZGVmX2dldGMgKCk7CisJfQorICAgICAgeXlsdmFsLmlkID0geHN0cmR1cCAoYnVmZmVyKTsKKyNpZiBUUkFDRQorICAgICAgcHJpbnRmICgibGV4OiBgJXMnIHJldHVybnMgSURcbiIsIGJ1ZmZlcik7CisjZW5kaWYKKyAgICAgIHJldHVybiBJRDsKKyAgICB9CisKKyAgaWYgKGMgPT0gJz0nIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ0AnIHx8IGMgPT0gJywnKQorICAgIHsKKyNpZiBUUkFDRQorICAgICAgcHJpbnRmICgibGV4OiBgJWMnIHJldHVybnMgaXRzZWxmXG4iLCBjKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgIGlmIChjID09ICdcbicpCisgICAgeworICAgICAgbGluZW51bWJlcisrOworICAgICAgc2F3X25ld2xpbmUgPSAxOworICAgIH0KKworICAvKnByaW50ZiAoImxleDogMHglMDJ4IGlnbm9yZWRcbiIsIGMpOyAqLworICByZXR1cm4gZGVmX2xleCAoKTsKK30KZGlmZiAtLWdpdCBhL2xkL2RlcC1pbi5zZWQgYi9sZC9kZXAtaW4uc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODBlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9kZXAtaW4uc2VkCkBAIC0wLDAgKzEsMTYgQEAKKzpsb29wCisvXFwkL04KKy9cXCQvYiBsb29wCisKK3MhQElOQ0RJUkAhJChJTkNESVIpIWcKK3MhQFNSQ0RJUkAvISFnCitzIVwuXC4vYmZkL2hvc3RzL1teIF0qXC5oICEgIWcKKworcy9cXFxuICovIC9nCisKK3MvICokLy8KK3MvICAqLyAvZworLzokL2QKKworcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKKyAgL2cKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvUkVBRE1FIGIvbGQvZW11bHBhcmFtcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkNmQyNgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvUkVBRE1FCkBAIC0wLDAgKzEsMiBAQAorVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSByZWFkIGJ5IGdlbnNjcmlwdHMuc2ggYXMgc2hlbGwgY29tbWFuZHMuCitUaGV5IHNldCBwYXJhbWV0ZXJzIGZvciB0aGUgZW11bGF0aW9ucy4KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYTI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvYTI5ay5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM4ZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9hMjlrLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9YTI5aworT1VUUFVUX0ZPUk1BVD0iY29mZi1hMjlrLWJpZyIKK1RFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCitBUkNIPWEyOWsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoIGIvbGQvZW11bHBhcmFtcy9haXhwcGMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZTY4NgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCkBAIC0wLDAgKzEsNCBAQAorVEVNUExBVEVfTkFNRT1haXgKK1NDUklQVF9OQU1FPWFpeAorT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCitBUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYWl4cnM2LnNoIGIvbGQvZW11bHBhcmFtcy9haXhyczYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYzNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYWl4cnM2LnNoCkBAIC0wLDAgKzEsNCBAQAorVEVNUExBVEVfTkFNRT1haXgKK1NDUklQVF9OQU1FPWFpeAorT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCitBUkNIPXJzNjAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaCBiL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxOTIzZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKQEAgLTAsMCArMSwzIEBACitTQ1JJUFRfTkFNRT1hbHBoYQorT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlYWxwaGEiCitBUkNIPWFscGhhCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJjZWxmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzljMTcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaApAQCAtMCwwICsxLDExIEBACitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKK0xJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcmMiCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJjIgorVEVYVF9TVEFSVF9BRERSPTB4MAorTUFYUEFHRVNJWkU9MHgxMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCitBUkNIPWFyYworTUFDSElORT0KK0VOVFJZPXN0YXJ0CisjVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2ZmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2gKQEAgLTAsMCArMSw2IEBACitBUkNIPWFybQorU0NSSVBUX05BTUU9cGUKK09VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1saXR0bGUiCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWxpdHRsZSIKK0JJR19PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tYmlnIgorVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhYjZmMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT1hcm1hb3V0CitPVVRQVVRfRk9STUFUPSJhLm91dC1hcm0tYmlnIgorSEVBREVSX1NUQVJUX0FERFI9MHg4MDAwCitURVhUX1NUQVJUX0FERFI9MHg4MDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFJFU1M9MHg4MDAwCitUQVJHRVRfUEFHRV9TSVpFPTMyNzY4CitBUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0bC5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMWYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT1hcm1hb3V0CitPVVRQVVRfRk9STUFUPSJhLm91dC1hcm0tbGl0dGxlIgorSEVBREVSX1NUQVJUX0FERFI9MHg4MDAwCitURVhUX1NUQVJUX0FERFI9MHg4MDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFJFU1M9MHg4MDAwCitUQVJHRVRfUEFHRV9TSVpFPTMyNzY4CitBUkNIPWFybQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZGY3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2gKQEAgLTAsMCArMSw2IEBACitBUkNIPWFybQorU0NSSVBUX05BTUU9YXJtY29mZgorT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tbGl0dGxlIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKK0JJR19PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1iaWciCitURU1QTEFURV9OQU1FPWFybWNvZmYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YjAyYgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoCkBAIC0wLDAgKzEsMjEgQEAKK01BQ0hJTkU9CitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKK0JJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0iCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEVNUExBVEVfTkFNRT1hcm1lbGYKK09USEVSX1RFWFRfU0VDVElPTlM9JyooLmdsdWVfN3QpICooLmdsdWVfNyknCitPVEhFUl9CU1NfU1lNQk9MUz0nX19ic3Nfc3RhcnRfXyA9IC47JworT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7JworCisKK0FSQ0g9YXJtCitNQUNISU5FPQorTUFYUEFHRVNJWkU9MjU2CitFTlRSWT1fc3RhcnQKK0VNQkVEREVEPXllcworCisjIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCisjIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCitPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2Q1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaApAQCAtMCwwICsxLDE3IEBACitBUkNIPWFybQorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKK01BWFBBR0VTSVpFPTB4ODAwMAorVEVNUExBVEVfTkFNRT1hcm1lbGYKKworT1RIRVJfVEVYVF9TRUNUSU9OUz0nKiguZ2x1ZV83dCkgKiguZ2x1ZV83KScKK09USEVSX0JTU19TWU1CT0xTPSdfX2Jzc19zdGFydF9fID0gLjsnCitPVEhFUl9CU1NfRU5EX1NZTUJPTFM9J19ic3NfZW5kX18gPSAuIDsgX19ic3NfZW5kX18gPSAuIDsnCisKKyMgVGhpcyBuZWVkcyB0byBiZSBoaWdoIGVub3VnaCBzbyB0aGF0IHdlIGNhbiBsb2FkIGxkLnNvIGJlbG93IGl0LAorIyB5ZXQgbG93IGVub3VnaCB0byBzdGF5IGF3YXkgZnJvbSB0aGUgbW1hcCBhcmVhIDB4NDAwMDAwMDAuCisjIEFsc28sIGl0IGlzIHNtYWxsIGVub3VnaCBzbyB0aGF0IHJlbG9jcyB3aGljaCBhcmUgcG9pbnRpbmcKKyMgYXQgYWJzb2x1dGUgMCB3aWxsIHN0aWxsIGJlIGZpeGVkIHVwLgorVEVYVF9TVEFSVF9BRERSPTB4MDIwMDAwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNTNkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoCkBAIC0wLDAgKzEsMTYgQEAKK0FSQ0g9YXJtCitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKK0JJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0iCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgorTUFYUEFHRVNJWkU9MHg4MDAwCitURU1QTEFURV9OQU1FPWFybWVsZgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworCisjIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKKyMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSBhdCAweDAxMTAwMDAwLgorIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCisjIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KKyMgVGhlc2UgdmFsdWVzIGdpdmUgdXMgYWJvdXQgMC41TUIgZm9yIGxkLnNvLCAxNi41TUIgZm9yIHVzZXIgCisjIHByb2dyYW1zLCBhbmQgMTVNQiBmb3IgbW1hcCB3aGljaCBzZWVtcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KK1RFWFRfU1RBUlRfQUREUj0weDAwMDgwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc3NTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfb2FiaS5zaApAQCAtMCwwICsxLDIxIEBACitNQUNISU5FPQorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0tb2FiaSIKK0JJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0tb2FiaSIKK0xJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0tb2FiaSIKK1RFWFRfU1RBUlRfQUREUj0weDgwMDAKK1RFTVBMQVRFX05BTUU9YXJtZWxmCitPVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJworT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKK09USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKKyAKKyAKK0FSQ0g9YXJtCitNQUNISU5FPQorTUFYUEFHRVNJWkU9MjU2CitFTlRSWT1fc3RhcnQKK0VNQkVEREVEPXllcworIAorIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQorIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgorT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1wZS5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0NjgwNQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvYXJtcGUuc2gKQEAgLTAsMCArMSw2IEBACitBUkNIPWFybQorU0NSSVBUX05BTUU9cGUKK09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tbGl0dGxlIgorTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tbGl0dGxlIgorQklHX09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tYmlnIgorVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIGIvbGQvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjg1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2NvZmZfc3BhcmMuc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT1zcGFyY2NvZmYKK09VVFBVVF9GT1JNQVQ9ImNvZmYtc3BhcmMiCisjIGZvbGxvd2luZyBhcmUgZHViaW91cyAoYm9ycm93ZWQgZnJvbSBzcGFyYyBseW54KQorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1RFWFRfU1RBUlRfQUREUj0wCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCitBUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2QxMHZlbGYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjZTUxZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaApAQCAtMCwwICsxLDkgQEAKK01BQ0hJTkU9CitTQ1JJUFRfTkFNRT1lbGZkMTB2CitPVVRQVVRfRk9STUFUPSJlbGYzMi1kMTB2IgorVEVYVF9TVEFSVF9BRERSPTB4MDEwMDAwMDAKK1JFQURPTkxZX1NUQVJUX0FERFI9MHgwMDAwMDAwNAorQVJDSD1kMTB2CitNQVhQQUdFU0laRT0zMgorRU1CRURERUQ9dAorVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2ggYi9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGFiNWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9kMzB2X2Uuc2gKQEAgLTAsMCArMSwyMCBAQAorTUFDSElORT0KK1NDUklQVF9OQU1FPWVsZmQzMHYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCitURVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAorREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKK0VNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCitTVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKK0VJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKK1RFWFRfU0laRT02NEsKK0RBVEFfU0laRT0zMksKK0VNRU1fU0laRT04TQorRUlUX1NJWkU9MzIwCitURVhUX01FTU9SWT1lbWVtCitEQVRBX01FTU9SWT1lbWVtCitCU1NfTUVNT1JZPWVtZW0KK1RFWFRfREVGX1NFQ1RJT049IiIKK0RBVEFfREVGX1NFQ1RJT049IiIKK0VNRU1fREVGX1NFQ1RJT049Iihyd3gpIgorQVJDSD1kMzB2CitFTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QzMHZfby5zaCBiL2xkL2VtdWxwYXJhbXMvZDMwdl9vLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmNiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2QzMHZfby5zaApAQCAtMCwwICsxLDIwIEBACitNQUNISU5FPQorU0NSSVBUX05BTUU9ZWxmZDMwdgorT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDMwdiIKK1RFWFRfU1RBUlRfQUREUj0weDAwMDAwMDAwCitEQVRBX1NUQVJUX0FERFI9MHgyMDAwMDAwMAorRU1FTV9TVEFSVF9BRERSPTB4ODAwMDAwMDAKK1NUQUNLX1NUQVJUX0FERFI9MHgyMDAwODAwMAorRUlUX1NUQVJUX0FERFI9MHhmZmZmZjAyMAorVEVYVF9TSVpFPTY0SworREFUQV9TSVpFPTMySworRU1FTV9TSVpFPThNCitFSVRfU0laRT0zMjAKK1RFWFRfTUVNT1JZPXRleHQKK0RBVEFfTUVNT1JZPWRhdGEKK0JTU19NRU1PUlk9ZGF0YQorVEVYVF9ERUZfU0VDVElPTj0iKHgpIgorREFUQV9ERUZfU0VDVElPTj0iKHJ3KSIKK0VNRU1fREVGX1NFQ1RJT049IiIKK0FSQ0g9ZDMwdgorRU1CRURERUQ9dApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9kMzB2ZWxmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWRlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2gKQEAgLTAsMCArMSwyMCBAQAorTUFDSElORT0KK1NDUklQVF9OQU1FPWVsZmQzMHYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCitURVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAorREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKK0VNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCitTVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKK0VJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKK1RFWFRfU0laRT0yMDAwSworREFUQV9TSVpFPTIwMDBLCitFTUVNX1NJWkU9OE0KK0VJVF9TSVpFPTMyMAorVEVYVF9NRU1PUlk9dGV4dAorREFUQV9NRU1PUlk9ZGF0YQorQlNTX01FTU9SWT1kYXRhCitURVhUX0RFRl9TRUNUSU9OPSIoeCkiCitEQVRBX0RFRl9TRUNUSU9OPSIocncpIgorRU1FTV9ERUZfU0VDVElPTj0iIgorQVJDSD1kMzB2CitFTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2ggYi9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjNTkwOQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZGVsdGE2OC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWRlbHRhNjgKK09VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1zeXN2IgorVEVYVF9TVEFSVF9BRERSPTB4MjAwMAorUEFHRV9TSVpFPTB4MTAwMDAwMAorQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VibW9uMjlrLnNoIGIvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMyYmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWVibW9uMjlrCitPVVRQVVRfRk9STUFUPSJjb2ZmLWEyOWstYmlnIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK0FSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlMjMyNgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKQEAgLTAsMCArMSwxMSBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1zcGFyYyIKK1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCitNQVhQQUdFU0laRT0weDEwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMAorQUxJR05NRU5UPTgKK0FSQ0g9c3BhcmMKK01BQ0hJTkU9CitURU1QTEFURV9OQU1FPWVsZjMyCitEQVRBX1BMVD0KK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGY4ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoCkBAIC0wLDAgKzEsMjkgQEAKK1NDUklQVF9OQU1FPWVsZgorT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKK0JJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCitURVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAorTUFYUEFHRVNJWkU9MHg0MDAwMAorSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCitPVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCitPVEhFUl9HT1RfU1lNQk9MUz0nCisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKKycKK09USEVSX0dPVF9TRUNUSU9OUz0nCisgIC5saXQ4IDogeyAqKC5saXQ4KSB9CisgIC5saXQ0IDogeyAqKC5saXQ0KSB9CisnCitURVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKK0RBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JworT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCitFWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKK09USEVSX1NFQ1RJT05TPScKKyAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQorICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9CisnCitBUkNIPW1pcHMKK01BQ0hJTkU9CitURU1QTEFURV9OQU1FPWVsZjMyCitHRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCitEWU5BTUlDX0xJTks9ZmFsc2UKK0VNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzNjNDExCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJtaXAuc2gKQEAgLTAsMCArMSwzMCBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgorQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKK1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKK0RBVEFfQUREUj0weDEwMDAwMDAwCitNQVhQQUdFU0laRT0weDQwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCitTSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAorVEVYVF9EWU5BTUlDPQorSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCitPVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCitPVEhFUl9HT1RfU1lNQk9MUz0nCisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKKycKK09USEVSX0dPVF9TRUNUSU9OUz0nCisgIC5saXQ4IDogeyAqKC5saXQ4KSB9CisgIC5saXQ0IDogeyAqKC5saXQ0KSB9CisnCitURVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKK0RBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JworT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCitPVEhFUl9TRUNUSU9OUz0nCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQorJworQVJDSD1taXBzCitNQUNISU5FPQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjEzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2gKQEAgLTAsMCArMSwzMSBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgorQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKK1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKK0RBVEFfQUREUj0weDEwMDAwMDAwCitNQVhQQUdFU0laRT0weDQwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCitTSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAorVEVYVF9EWU5BTUlDPQorSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCitPVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCitPVEhFUl9HT1RfU1lNQk9MUz0nCisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKKycKK09USEVSX0dPVF9TRUNUSU9OUz0nCisgIC5saXQ4IDogeyAqKC5saXQ4KSB9CisgIC5saXQ0IDogeyAqKC5saXQ0KSB9CisnCitURVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKK0RBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JworT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCitPVEhFUl9TRUNUSU9OUz0nCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQorJworQVJDSD1taXBzCitNQUNISU5FPQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworRU5UUlk9X19zdGFydApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2gKQEAgLTAsMCArMSwyOCBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgorQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKK1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKK01BWFBBR0VTSVpFPTB4NDAwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKK1NITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCitPVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCitPVEhFUl9HT1RfU1lNQk9MUz0nCisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKKycKK09USEVSX0dPVF9TRUNUSU9OUz0nCisgIC5saXQ4IDogeyAqKC5saXQ4KSB9CisgIC5saXQ0IDogeyAqKC5saXQ0KSB9CisnCitURVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKK0RBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JworT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCitPVEhFUl9TRUNUSU9OUz0nCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQorJworQVJDSD1taXBzCitNQUNISU5FPQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwMDhjOAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaApAQCAtMCwwICsxLDI4IEBACitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKK0xJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgorVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAorTUFYUEFHRVNJWkU9MHg0MDAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAorU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKK09USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKK09USEVSX0dPVF9TWU1CT0xTPScKKyAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOworJworT1RIRVJfR09UX1NFQ1RJT05TPScKKyAgLmxpdDggOiB7ICooLmxpdDgpIH0KKyAgLmxpdDQgOiB7ICooLmxpdDQpIH0KKycKK1RFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JworREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCitPVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKK09USEVSX1NFQ1RJT05TPScKKyAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQorICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9CisnCitBUkNIPW1pcHMKK01BQ0hJTkU9CitURU1QTEFURV9OQU1FPWVsZjMyCitHRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCitFTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWJlMWY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoCkBAIC0wLDAgKzEsMTAgQEAKK01BQ0hJTkU9CitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWZyMzAiCitURVhUX1NUQVJUX0FERFI9MHgxMDAwMAorQVJDSD1mcjMwCitNQVhQQUdFU0laRT0yNTYKK0VOVFJZPV9zdGFydAorRU1CRURERUQ9eWVzCitOT1A9MHg5ZmEwCitPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPSdQUk9WSURFIChfX3N0YWNrID0gMHgyMDAwMDApOycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwZGU4OAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaApAQCAtMCwwICsxLDI5IEBACitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKK0xJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgorVEVYVF9TVEFSVF9BRERSPTB4YTAwMjAwMDAKK01BWFBBR0VTSVpFPTB4NDAwMDAKK0lOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JworT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJworT1RIRVJfR09UX1NZTUJPTFM9JworICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7CisnCitPVEhFUl9HT1RfU0VDVElPTlM9JworICAubGl0OCA6IHsgKigubGl0OCkgfQorICAubGl0NCA6IHsgKigubGl0NCkgfQorJworVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCitEQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKK09USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JworRVhFQ1VUQUJMRV9TWU1CT0xTPSdfRFlOQU1JQ19MSU5LID0gMDsnCitPVEhFUl9TRUNUSU9OUz0nCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQorJworQVJDSD1taXBzCitNQUNISU5FPQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworRFlOQU1JQ19MSU5LPWZhbHNlCitFTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzMTJmNAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoCkBAIC0wLDAgKzEsMzAgQEAKK1NDUklQVF9OQU1FPWVsZgorT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKK0JJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCitURVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCitEQVRBX0FERFI9MHgxMDAwMDAwMAorTUFYUEFHRVNJWkU9MHg0MDAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAorU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKK1RFWFRfRFlOQU1JQz0KK0lOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JworT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJworT1RIRVJfR09UX1NZTUJPTFM9JworICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7CisnCitPVEhFUl9HT1RfU0VDVElPTlM9JworICAubGl0OCA6IHsgKigubGl0OCkgfQorICAubGl0NCA6IHsgKigubGl0NCkgfQorJworVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCitEQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKK09USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JworT1RIRVJfU0VDVElPTlM9JworICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9CisgIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KKycKK0FSQ0g9bWlwcworTUFDSElORT0KK1RFTVBMQVRFX05BTUU9ZWxmMzIKK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmZmM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoCkBAIC0wLDAgKzEsOCBAQAorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworU0NSSVBUX05BTUU9ZWxmcHBjCitPVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjbGUiCitURVhUX1NUQVJUX0FERFI9MHg0MDAwMAorTUFYUEFHRVNJWkU9MHg0MDAwMAorQVJDSD1wb3dlcnBjCitNQUNISU5FPQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGM4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2gKQEAgLTAsMCArMSwzMSBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgorQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKK1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKK0RBVEFfQUREUj0weDEwMDAwMDAwCitNQVhQQUdFU0laRT0weDQwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCitTSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAorVEVYVF9EWU5BTUlDPQorSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCitPVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCitPVEhFUl9HT1RfU1lNQk9MUz0nCisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKKycKK09USEVSX0dPVF9TRUNUSU9OUz0nCisgIC5saXQ4IDogeyAqKC5saXQ4KSB9CisgIC5saXQ0IDogeyAqKC5saXQ0KSB9CisnCitURVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKK0RBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JworT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCitPVEhFUl9TRUNUSU9OUz0nCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQorJworQVJDSD1taXBzCitNQUNISU5FPQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworRU5UUlk9X19zdGFydApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDk2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2gKQEAgLTAsMCArMSwyMCBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1iaWciCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtYmlnIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWxpdHRsZSIKK1BBR0VfU0laRT0weDEwMDAKK1RBUkdFVF9QQUdFX1NJWkU9MHg0MDAKK01BWFBBR0VTSVpFPTB4MTAwMAorVEVYVF9TVEFSVF9BRERSPTAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCitBUkNIPW1jb3JlCisjIDEyMTEgPT0gbW92IHIxLHIxCitOT1A9MHgxMjExCitFTUJFRERFRD15ZXMKKworT1RIRVJfQlNTX1NZTUJPTFM9Il9fYnNzX3N0YXJ0X18gPSAuIDsiCitPVEhFUl9CU1NfRU5EX1NZTUJPTFM9Il9fYnNzX2VuZF9fID0gLiA7IgorCisjIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCisjIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCitPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMycHBjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY0MmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaApAQCAtMCwwICsxLDggQEAKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKK1NDUklQVF9OQU1FPWVsZnBwYworT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKK1RFWFRfU1RBUlRfQUREUj0weDAxODAwMDAwCitNQVhQQUdFU0laRT0weDQwMDAwCitBUkNIPXBvd2VycGMKK01BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZiZGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaApAQCAtMCwwICsxLDEyIEBACitTQ1JJUFRfTkFNRT1lbGYKK0VMRlNJWkU9NjQKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK09VVFBVVF9GT1JNQVQ9ImVsZjY0LXNwYXJjIgorVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwCitNQVhQQUdFU0laRT0weDEwMDAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwCitBUkNIPSJzcGFyYzp2OSIKK01BQ0hJTkU9CitEQVRBX1BMVD0KK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKK05PUD0weDAxMDAwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjY0YWxwaGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaApAQCAtMCwwICsxLDE1IEBACitFTlRSWT1fX3N0YXJ0CitTQ1JJUFRfTkFNRT1lbGYKK0VMRlNJWkU9NjQKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK09VVFBVVF9GT1JNQVQ9ImVsZjY0LWFscGhhIgorVEVYVF9TVEFSVF9BRERSPSIweDEyMDAwMDAwMCIKK01BWFBBR0VTSVpFPTB4MTAwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwIgorQVJDSD1hbHBoYQorTUFDSElORT0KK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKK0RBVEFfUExUPQorTk9QPTB4NDdmZjA0MWYKKworT1RIRVJfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmNTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZWxmX2kzODYuc2gKQEAgLTAsMCArMSwxMCBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgorVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKK01BWFBBR0VTSVpFPTB4MTAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKK0FSQ0g9aTM4NgorTUFDSElORT0KK05PUD0weDkwOTAKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzdhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoCkBAIC0wLDAgKzEsMTEgQEAKK1NDUklQVF9OQU1FPWVsZgorT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKK1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCisjU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCitNQVhQQUdFU0laRT0weDEwMDAKK0FSQ0g9aTM4NgorTUFDSElORT0KK05PUD0weDkwOTAKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoIGIvbGQvZW11bHBhcmFtcy9nbGQ5NjAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MWE3OAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCkBAIC0wLDAgKzEsNyBAQAorU0NSSVBUX05BTUU9aTk2MAorT1VUUFVUX0ZPUk1BVD0iIgorVEVYVF9TVEFSVF9BRERSPT8/CitUQVJHRVRfUEFHRV9TSVpFPT8/CitBUkNIPWk5NjAKK1RFTVBMQVRFX05BTUU9Z2xkOTYwCitHTERfU1RZTEU9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjAyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2gKQEAgLTAsMCArMSwxOSBAQAorU0NSSVBUX05BTUU9aTk2MAorT1VUUFVUX0ZPUk1BVD0iIgorVEVYVF9TVEFSVF9BRERSPT8/CitUQVJHRVRfUEFHRV9TSVpFPT8/CitBUkNIPWk5NjAKK1RFTVBMQVRFX05BTUU9Z2xkOTYwYworR0xEX1NUWUxFPTEKK0NPRkZfQ1RPUlM9JworCV9fX0NUT1JfTElTVF9fID0gLjsKKwlMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpCisJKiguY3RvcnMpCisJTE9ORygwKQorCV9fX0NUT1JfRU5EX18gPSAuOworCV9fX0RUT1JfTElTVF9fID0gLjsKKwlMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpCisJKiguZHRvcnMpCisJTE9ORygwKQorCV9fX0RUT1JfRU5EX18gPSAuOworJwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9nbzMyLnNoIGIvbGQvZW11bHBhcmFtcy9nbzMyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzM1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2dvMzIuc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT1nbzMyY29mZgorT1VUUFVUX0ZPUk1BVD0iY29mZi1nbzMyIgorVEVYVF9TVEFSVF9BRERSPTB4MTBhOAorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1NFR01FTlRfU0laRT0weDEwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKK0FSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODMwMC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllYjNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1oODMwMAorT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKK1RFWFRfU1RBUlRfQUREUj0weDgwMDAKK1RBUkdFVF9QQUdFX1NJWkU9MTI4CitBUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDBoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjc5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2g4MzAwaC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWg4MzAwaAorT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKK1RFWFRfU1RBUlRfQUREUj0weDgwMDAKK1RBUkdFVF9QQUdFX1NJWkU9MTI4CitBUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDBzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2I0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWg4MzAwcworT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKK1RFWFRfU1RBUlRfQUREUj0weDgwMDAKK1RBUkdFVF9QQUdFX1NJWkU9MTI4CitBUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRjYTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9oODUwMC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWg4NTAwCitPVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMGIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkM2ZlZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaDg1MDBiLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9aDg1MDBiCitPVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMGMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYTA2NQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9aDg1MDBjCitPVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMG0uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ZjdiNgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9aDg1MDBtCitPVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllMjk0YQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaDg1MDBzLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9aDg1MDBzCitPVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHAzMDBic2Quc2ggYi9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWM1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBic2QiCitURVhUX1NUQVJUX0FERFI9MAorVEFSR0VUX1BBR0VfU0laRT00MDk2CitBUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBiL2xkL2VtdWxwYXJhbXMvaHAzaHB1eC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2JhZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9ocDNocHV4LnNoCkBAIC0wLDAgKzEsOCBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaHAzMDBocHV4IgorVEVYVF9TVEFSVF9BRERSPTAKK1RBUkdFVF9QQUdFX1NJWkU9NDA5NgorQVJDSD1tNjhrCitTVEFDS1pFUk89Il9fX3N0YWNrX3plcm8gPSAweDIwMDA7IF9fRFlOQU1JQyA9IDA7IgorIyBUaGlzIGlzIG5lZWRlZCBmb3IgSFBVWCA5LjA7IGl0IGlzIHVubmVjZXNzYXJ5IGJ1dCBoYXJtbGVzcyBmb3IgOC4wLgorU0hMSUJfUEFUSD0iX19fZGxkX3NobGliX3BhdGggPSAwOyIKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2I4OWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9ocHBhZWxmLnNoCkBAIC0wLDAgKzEsNyBAQAorU0NSSVBUX05BTUU9aHBwYWVsZgorT1VUUFVUX0ZPUk1BVD0iZWxmMzItaHBwYSIKK1RFWFRfU1RBUlRfQUREUj0weDEwMDAKK1RBUkdFVF9QQUdFX1NJWkU9NDA5NgorQVJDSD1ocHBhCitTVEFSVD0iJFNUQVJUJCIKK1RFTVBMQVRFX05BTUU9aHBwYWVsZgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ZTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2gKQEAgLTAsMCArMSw2IEBACitTQ1JJUFRfTkFNRT1hb3V0CitPVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2IgorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1RFWFRfU1RBUlRfQUREUj0wCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCitBUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NmJlb3Muc2ggYi9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2OWRhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoCkBAIC0wLDAgKzEsNSBAQAorQVJDSD1pMzg2CitTQ1JJUFRfTkFNRT1pMzg2YmVvcworT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCitSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKK1RFTVBMQVRFX05BTUU9YmVvcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzBlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2kzODZic2Quc2gKQEAgLTAsMCArMSw2IEBACitTQ1JJUFRfTkFNRT1hb3V0CitPVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2LWJzZCIKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCitURVhUX1NUQVJUX0FERFI9MAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAorQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE3YjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWkzODZjb2ZmCitPVVRQVVRfRk9STUFUPSJjb2ZmLWkzODYiCitURVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAorQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZnbzMyLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWYxNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaApAQCAtMCwwICsxLDggQEAKK1NDUklQVF9OQU1FPWkzODZnbzMyCitPVVRQVVRfRk9STUFUPSJjb2ZmLWdvMzIiCitURVhUX1NUQVJUX0FERFI9MHgxMGE4CitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorU0VHTUVOVF9TSVpFPTB4MjAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCitBUkNIPWkzODYKKwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZsaW51eC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE2NDIyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9pMzg2bGludXguc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT1hb3V0CitPVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2LWxpbnV4IgorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1RFWFRfU1RBUlRfQUREUj0weDEwMjAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCitBUkNIPWkzODYKK1RFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGMxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoCkBAIC0wLDAgKzEsOSBAQAorU0NSSVBUX05BTUU9aTM4Nmx5bngKK09VVFBVVF9GT1JNQVQ9ImNvZmYtaTM4Ni1seW54IgorIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KK0VOVFJZPV9tYWluCisjIGZvbGxvd2luZyBhcmUgZHViaW91cworVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1RFWFRfU1RBUlRfQUREUj0wCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwCitBUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggYi9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2IyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoCkBAIC0wLDAgKzEsNyBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbWFjaDMiCitURVhUX1NUQVJUX0FERFI9MHgxMDAyMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKK1NFR01FTlRfU0laRT0weDEwMDAKK1BBRF9URVhUPXQKK0FSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bW9zcy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlMGUwNQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1vc3Muc2gKQEAgLTAsMCArMSwxMCBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgorVEVYVF9TVEFSVF9BRERSPTB4MDAwMDIwMDAKK01BWFBBR0VTSVpFPTB4MTAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDAwMDIwMDAKK0FSQ0g9aTM4NgorTUFDSElORT0KK05PUD0weDkwOTAKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoCkBAIC0wLDAgKzEsNyBAQAorU0NSSVBUX05BTUU9aTM4Nm1zZG9zCitPVVRQVVRfRk9STUFUPSJtc2RvcyIKK1RFWFRfU1RBUlRfQUREUj0weDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKK1NFR01FTlRfU0laRT0weDEwCitQQURfVEVYVD10CitBUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggYi9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTZhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoCkBAIC0wLDAgKzEsNiBAQAorU0NSSVBUX05BTUU9YW91dAorVEVYVF9TVEFSVF9BRERSPTB4MTAyMAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4Ni1uZXRic2QiCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorQVJDSD1pMzg2CitFWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2bncuc2ggYi9sZC9lbXVscGFyYW1zL2kzODZudy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzBlZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9pMzg2bncuc2gKQEAgLTAsMCArMSw5IEBACitTQ1JJUFRfTkFNRT1udworT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKK1RFWFRfU1RBUlRfQUREUj0weDA4MDAwMDAwCitNQVhQQUdFU0laRT0weDEwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA4MDAwMDAwCitBUkNIPWkzODYKK05PUD0weDkwOTAKK1RFTVBMQVRFX05BTUU9ZWxmMzIKK0dFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2cGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4YThhZAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoCkBAIC0wLDAgKzEsNSBAQAorQVJDSD1pMzg2CitTQ1JJUFRfTkFNRT1wZQorT1VUUFVUX0ZPUk1BVD0icGVpLWkzODYiCitSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0icGUtaTM4NiIKK1RFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoIGIvbGQvZW11bHBhcmFtcy9sbms5NjAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmM2ZjNAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoCkBAIC0wLDAgKzEsNiBAQAorU0NSSVBUX05BTUU9aTk2MAorT1VUUFVUX0ZPUk1BVD0iIgorVEVYVF9TVEFSVF9BRERSPT8/CitUQVJHRVRfUEFHRV9TSVpFPT8/CitBUkNIPWk5NjAKK1RFTVBMQVRFX05BTUU9bG5rOTYwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2ggYi9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NzA1YQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbTMycmVsZi5zaApAQCAtMCwwICsxLDEzIEBACitNQUNISU5FPQorU0NSSVBUX05BTUU9ZWxmCitURU1QTEFURV9OQU1FPWVsZjMyCitPVVRQVVRfRk9STUFUPSJlbGYzMi1tMzJyIgorVEVYVF9TVEFSVF9BRERSPTB4MTAwCitBUkNIPW0zMnIKK01BQ0hJTkU9CitNQVhQQUdFU0laRT0zMgorRU1CRURERUQ9eWVzCisKKyMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKKyMgdG9wIG9mIHNpbXVsYXRvciBtZW1vcnkgKDhNQikuCitPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPSdQUk9WSURFIChfc3RhY2sgPSAweDgwMDAwMCk7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzI0YzBlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCkBAIC0wLDAgKzEsNyBAQAorU0NSSVBUX05BTUU9YW91dAorVEVYVF9TVEFSVF9BRERSPTB4MTAyMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4azRrLW5ldGJzZCIKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCitBUkNIPW02OGsKK0VYRUNVVEFCTEVfU1lNQk9MUz0nX19EWU5BTUlDID0gMDsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGthb3V0LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZhYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaApAQCAtMCwwICsxLDcgQEAKK1NDUklQVF9OQU1FPWFvdXQKK09VVFBVVF9GT1JNQVQ9ImEub3V0LXplcm8tYmlnIgorVEVYVF9TVEFSVF9BRERSPTB4MjAyMAorVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKK1NFR01FTlRfU0laRT0weDIwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCitBUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU4NmNjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9tNjhrYXV4LnNoCkBAIC0wLDAgKzEsOCBAQAorU0NSSVBUX05BTUU9bTY4a2F1eAorT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLWF1eCIKK1NFR01FTlRfU0laRT0weDQwMDAwCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorVEVYVF9TVEFSVF9BRERSPSIkU0VHTUVOVF9TSVpFICsgU0laRU9GX0hFQURFUlMiCitOT05fUEFHRURfVEVYVF9TVEFSVF9BRERSPVNJWkVPRl9IRUFERVJTCitEQVRBX0FMSUdOTUVOVF89IiguICYgKC0kU0VHTUVOVF9TSVpFIHwgJFRBUkdFVF9QQUdFX1NJWkUtMSkpICsgJFNFR01FTlRfU0laRSIKK0FSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxN2MwZAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1tNjhrY29mZgorT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrIgorVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKK0FSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrZWxmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzUyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL202OGtlbGYuc2gKQEAgLTAsMCArMSwxMCBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1tNjhrIgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMDAwMDAKK01BWFBBR0VTSVpFPTB4MjAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPSR7VEVYVF9TVEFSVF9BRERSfQorQVJDSD1tNjhrCitNQUNISU5FPQorTk9QPTB4NGU3NQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2ggYi9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmMzZGFkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9tNjhrbGludXguc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT1hb3V0CitPVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrLWxpbnV4IgorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1RFWFRfU1RBUlRfQUREUj0weDEwMjAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCitBUkNIPW02OGsKK1RFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggYi9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjBmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCkBAIC0wLDAgKzEsOCBAQAorU0NSSVBUX05BTUU9bTY4a2x5bngKK09VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1seW54IgorIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KK0VOVFJZPV9fbWFpbgorIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMKK1RFWFRfU1RBUlRfQUREUj0wCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQyODA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaApAQCAtMCwwICsxLDcgQEAKK1NDUklQVF9OQU1FPWFvdXQKK1RFWFRfU1RBUlRfQUREUj0weDIwMjAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKK09VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGstbmV0YnNkIgorVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKK0FSQ0g9bTY4aworRVhFQ1VUQUJMRV9TWU1CT0xTPSdfX0RZTkFNSUMgPSAwOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggYi9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWI4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL202OGtwc29zLnNoCkBAIC0wLDAgKzEsNiBAQAorU0NSSVBUX05BTUU9cHNvcworT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTY4ayIKK1RFWFRfU1RBUlRfQUREUj0weDIwMDAwCitNQVhQQUdFU0laRT0weDEwMDAKK0FSQ0g9bTY4aworVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoIGIvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjczN2MKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL204OGtiY3Muc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1tODhrYmNzCitPVVRQVVRfRk9STUFUPSJjb2ZmLW04OGtiY3MiCitURVhUX1NUQVJUX0FERFI9Pz8KK1RBUkdFVF9QQUdFX1NJWkU9Pz8KK0FSQ0g9bTg4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoIGIvbGQvZW11bHBhcmFtcy9tY29yZXBlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmFlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2gKQEAgLTAsMCArMSw2IEBACitBUkNIPW1jb3JlCitTQ1JJUFRfTkFNRT1tY29yZXBlCitPVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtYmlnIgorTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1saXR0bGUiCitCSUdfT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWJpZyIKK1RFTVBMQVRFX05BTUU9cGUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmUyOTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoCkBAIC0wLDAgKzEsNiBAQAorU0NSSVBUX05BTUU9bWlwcworT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKK0JJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAorQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNic2Quc2ggYi9sZC9lbXVscGFyYW1zL21pcHNic2Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmYjM1YgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbWlwc2JzZC5zaApAQCAtMCwwICsxLDcgQEAKK1NDUklQVF9OQU1FPW1pcHNic2QKK09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtbGl0dGxlIgorQklHX09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtYmlnIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImEub3V0LW1pcHMtbGl0dGxlIgorVEVYVF9TVEFSVF9BRERSPTB4MTAyMAorVEFSR0VUX1BBR0VfU0laRT00MDk2CitBUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2lkdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE3NmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9taXBzaWR0LnNoCkBAIC0wLDAgKzEsMTEgQEAKK1NDUklQVF9OQU1FPW1pcHMKK09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKK0xJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKK0FSQ0g9bWlwcworRU5UUlk9c3RhcnQKK1RFWFRfU1RBUlRfQUREUj0weGEwMDEyMDAwCitEQVRBX0FERFI9LgorVEVNUExBVEVfTkFNRT1taXBzZWNvZmYKK0VNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzaWR0bC5zaCBiL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNzlkZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbWlwc2lkdGwuc2gKQEAgLTAsMCArMSwxMSBAQAorU0NSSVBUX05BTUU9bWlwcworT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKK0JJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgorTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAorQVJDSD1taXBzCitFTlRSWT1zdGFydAorVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKK0RBVEFfQUREUj0uCitURU1QTEFURV9OQU1FPW1pcHNlY29mZgorRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiMjM0NAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbWlwc2xpdC5zaApAQCAtMCwwICsxLDYgQEAKK1NDUklQVF9OQU1FPW1pcHMKK09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCitCSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKK0xJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKK0FSQ0g9bWlwcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsbmV3cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGJiOTFjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKQEAgLTAsMCArMSw5IEBACitTQ1JJUFRfTkFNRT1taXBzCitPVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgorQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCitBUkNIPW1pcHMKK1RFWFRfU1RBUlRfQUREUj0weDgwMDgwMDAwCitEQVRBX0FERFI9LgorRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2ggYi9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyNDMyMgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaApAQCAtMCwwICsxLDIwIEBACitNQUNISU5FPQorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1tbjEwMjAwIgorVEVYVF9TVEFSVF9BRERSPTB4MAorQVJDSD1tbjEwMjAwCitNQUNISU5FPQorTUFYUEFHRVNJWkU9MQorRU5UUlk9X3N0YXJ0CitFTUJFRERFRD15ZXMKKworIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQorIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgorT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JworCisjIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KKyMgWFhYIFRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGRpc2FwcGVhci4KK0NUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCitDVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCitEVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JworRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoIGIvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTQwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL21uMTAzMDAuc2gKQEAgLTAsMCArMSwyMCBAQAorTUFDSElORT0KK1NDUklQVF9OQU1FPWVsZgorT1VUUFVUX0ZPUk1BVD0iZWxmMzItbW4xMDMwMCIKK1RFWFRfU1RBUlRfQUREUj0weDAKK0FSQ0g9bW4xMDMwMAorTUFDSElORT0KK01BWFBBR0VTSVpFPTEKK0VOVFJZPV9zdGFydAorRU1CRURERUQ9eWVzCisKKyMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKKyMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KK09USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKKworIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCisjIFhYWCBUaGVzZSBzaG91bGQgZGVmaW5pdGVseSBkaXNhcHBlYXIuCitDVE9SX1NUQVJUPSdfX19jdG9ycyA9IC47JworQ1RPUl9FTkQ9J19fX2N0b3JzX2VuZCA9IC47JworRFRPUl9TVEFSVD0nX19fZHRvcnMgPSAuOycKK0RUT1JfRU5EPSdfX19kdG9yc19lbmQgPSAuOycKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbmV3cy5zaCBiL2xkL2VtdWxwYXJhbXMvbmV3cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTBkZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9uZXdzLnNoCkBAIC0wLDAgKzEsNSBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbmV3c29zMyIKK1RFWFRfU1RBUlRfQUREUj0wCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGZkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL25zMzJrbmJzZC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWFvdXQKK1RFWFRfU1RBUlRfQUREUj0weDEwMjAKK09VVFBVVF9GT1JNQVQ9ImEub3V0LW5zMzJrLW5ldGJzZCIKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCitBUkNIPW5zMzJrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggYi9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZDA3OQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaApAQCAtMCwwICsxLDYgQEAKK1NDUklQVF9OQU1FPWFvdXQKK09VVFBVVF9GT1JNQVQ9ImEub3V0LXBjNTMyLW1hY2giCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorVEVYVF9TVEFSVF9BRERSPSIweDEwMDIwIgorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKK0FSQ0g9bnMzMmsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggYi9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjgwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoCkBAIC0wLDAgKzEsNCBAQAorVEVNUExBVEVfTkFNRT1haXgKK1NDUklQVF9OQU1FPWFpeAorT1VUUFVUX0ZPUk1BVD0ieGNvZmYtcG93ZXJtYWMiCitBUkNIPXBvd2VycGMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvcHBjbncuc2ggYi9sZC9lbXVscGFyYW1zL3BwY253LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZWFkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3BwY253LnNoCkBAIC0wLDAgKzEsNyBAQAorU0NSSVBUX05BTUU9bncKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGMiCitURVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCitEQVRBX0FERFI9MHgxMDAwMDAwMAorTUFYUEFHRVNJWkU9MHg0MDAwMAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAorQVJDSD1wb3dlcnBjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY3BlLnNoIGIvbGQvZW11bHBhcmFtcy9wcGNwZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTUyODJkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9wcGNwZS5zaApAQCAtMCwwICsxLDQgQEAKK0FSQ0g9cG93ZXJwYworU0NSSVBUX05BTUU9cHBjcGUKK09VVFBVVF9GT1JNQVQ9InBlaS1wb3dlcnBjbGUiCitURU1QTEFURV9OQU1FPXBlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaCBiL2xkL2VtdWxwYXJhbXMvcmlzY2l4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjZkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPXJpc2NpeAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtcmlzY2l4IgorVEVYVF9TVEFSVF9BRERSPTB4ODAwMAorVEFSR0VUX1BBR0VfU0laRT0weDgwMDAKK0FSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2ggYi9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MmY5MgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPXNhMjkyMDAKK09VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCitURVhUX1NUQVJUX0FERFI9MHg0MDAwNDAwMAorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK0FSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaC5zaCBiL2xkL2VtdWxwYXJhbXMvc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4NDRmYgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvc2guc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1zaAorT1VUUFVUX0ZPUk1BVD0iY29mZi1zaCIKK1RFWFRfU1RBUlRfQUREUj0weDgwMDAKK1RBUkdFVF9QQUdFX1NJWkU9MTI4CitBUkNIPXNoCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NoZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9zaGVsZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWRiNTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zaGVsZi5zaApAQCAtMCwwICsxLDE3IEBACitTQ1JJUFRfTkFNRT1lbGYKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLXNoIgorVEVYVF9TVEFSVF9BRERSPTB4MTAwMAorTUFYUEFHRVNJWkU9MTI4CitBUkNIPXNoCitNQUNISU5FPQorVEVNUExBVEVfTkFNRT1lbGYzMgorR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcworRU1CRURERUQ9eWVzCisKKyMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgorRU5UUlk9c3RhcnQKK0NUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCitDVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCitEVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JworRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JworT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4MzAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGwuc2ggYi9sZC9lbXVscGFyYW1zL3NobC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjBhYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zaGwuc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1zaAorT1VUUFVUX0ZPUk1BVD0iY29mZi1zaGwiCitURVhUX1NUQVJUX0FERFI9MHg4MDAwCitUQVJHRVRfUEFHRV9TSVpFPTEyOAorQVJDSD1zaApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2ggYi9sZC9lbXVscGFyYW1zL3NobGVsZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI3Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2gKQEAgLTAsMCArMSwxNyBAQAorU0NSSVBUX05BTUU9ZWxmCitPVVRQVVRfRk9STUFUPSJlbGYzMi1zaGwiCitURVhUX1NUQVJUX0FERFI9MHgxMDAwCitNQVhQQUdFU0laRT0xMjgKK0FSQ0g9c2gKK01BQ0hJTkU9CitURU1QTEFURV9OQU1FPWVsZjMyCitHRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCitFTUJFRERFRD15ZXMKKworIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCitFTlRSWT1zdGFydAorQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKK0NUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKK0RUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCitEVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCitPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHgzMDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWI5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaApAQCAtMCwwICsxLDggQEAKK1NDUklQVF9OQU1FPWFvdXQKK09VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKK0JJR19PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCitMSVRUTEVfT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3BhcmMtbGl0dGxlIgorVEVYVF9TVEFSVF9BRERSPTB4MjAyMAorVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKK0FSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2NiMGJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaApAQCAtMCwwICsxLDcgQEAKK1NDUklQVF9OQU1FPWFvdXQKK09VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLWxpbnV4IgorVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKK1RFWFRfU1RBUlRfQUREUj0weDEwMjAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCitBUkNIPXNwYXJjCitURU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWIzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaApAQCAtMCwwICsxLDkgQEAKK1NDUklQVF9OQU1FPXNwYXJjbHlueAorT1VUUFVUX0ZPUk1BVD0iY29mZi1zcGFyYy1seW54IgorIyBUaGlzIGlzIHdoYXQgTHlueE9TIC9saWIvaW5pdDEubyB3YW50cy4KK0VOVFJZPV9fbWFpbgorIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCitURVhUX1NUQVJUX0FERFI9MAorTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAorQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdkYWYzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1hb3V0CitURVhUX1NUQVJUX0FERFI9MHgxMDIwCitPVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1uZXRic2QiCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAorQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2ggYi9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk4ODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zdDIwMDAuc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT1zdDIwMDAKK09VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ayIKK1RFWFRfU1RBUlRfQUREUj0weDAKK1RBUkdFVF9QQUdFX1NJWkU9MTI4CitBUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3VuMy5zaCBiL2xkL2VtdWxwYXJhbXMvc3VuMy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjBmNzFmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zdW4zLnNoCkBAIC0wLDAgKzEsOCBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgorVEVYVF9TVEFSVF9BRERSPTB4MjAyMAorVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKK1NFR01FTlRfU0laRT0weDIwMDAwCitOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgyMDAwCitBUkNIPW02OGsKK1RFTVBMQVRFX05BTUU9c3Vub3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3VuNC5zaCBiL2xkL2VtdWxwYXJhbXMvc3VuNC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQyNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy9zdW40LnNoCkBAIC0wLDAgKzEsOCBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgorVEVYVF9TVEFSVF9BRERSPTB4MjAyMAorVEFSR0VUX1BBR0VfU0laRT0weDIwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKK0FMSUdOTUVOVD04CitBUkNIPXNwYXJjCitURU1QTEFURV9OQU1FPXN1bm9zCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGMxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3RpYzMwYW91dC5zaApAQCAtMCwwICsxLDcgQEAKK1NDUklQVF9OQU1FPXRpYzMwYW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtdGljMzAiCitPVVRQVVRfQVJDSD0idG1zMzIwYzMwIgorVEVYVF9TVEFSVF9BRERSPTB4MAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9dG1zMzIwYzMwCitCSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc3OTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT10aWMzMGNvZmYKK09VVFBVVF9GT1JNQVQ9ImNvZmYtdGljMzAiCitPVVRQVVRfQVJDSD0idG1zMzIwYzMwIgorVEVYVF9TVEFSVF9BRERSPTB4MAorVEFSR0VUX1BBR0VfU0laRT0xMjgKK0FSQ0g9dG1zMzIwYzMwCitCSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzgwY29mZi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDcwMzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2gKQEAgLTAsMCArMSw1NiBAQAorIyBUaGlzIGZpbGUgaXMgc291cmNlZCBieSB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQuCisjIFRoZXNlIGFyZSBzaGVsbCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCBsYXRlciBieSBlaXRoZXIgZ2Vuc2NyaXB0cworIyBvciBvbiBvZiB0aGUgc2NyaXB0cyB0aGF0IGl0IHNvdXJjZXMuCisKKyMgVGhlIG5hbWUgb2YgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB0byB1c2UuICBJbiB0aGlzIGNhc2UsIGdlbnNjcmlwdHMKKyMgdXNlcyBzY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKKyMKK1NDUklQVF9OQU1FPXRpYzgwY29mZgorCisjIFRoZSBuYW1lIG9mIHRoZSBlbXVsdGVtcGwgc2NyaXB0IHRvIHVzZS4gIElmIHNldCB0byAidGVtcGxhdGUiIHRoZW4KKyMgZ2Vuc2NyaXB0cy5zaCB3aWxsIHVzZSB0aGUgc2NyaXB0IGVtdWx0ZW1wbC90ZW1wbGF0ZS5lbS4gIElmIG5vdCBzZXQsCisjIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgaXMgImdlbmVyaWMiLgorIworIyBURU1QTEFURV9OQU1FPQorCisjIElmIHRoaXMgaXMgc2V0IHRvIGFuIG5vbmVtcHR5IHN0cmluZywgZ2Vuc2NyaXB0cy5zaCB3aWxsIGludm9rZSB0aGUKKyMgc2NyaXB0dGVtcGwgc2NyaXB0IGFuIGV4dHJhIHRpbWUgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgc2NyaXB0LgorIworIyBHRU5FUkFURV9TSExJQl9TQ1JJUFQ9CisKKyMgVGhlIEJGRCBvdXRwdXQgZm9ybWF0IHRvIHVzZS4gIFRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgd2lsbCB1c2UgaXQgaW4KKyMgYW4gT1VUUFVUX0ZPUk1BVCBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgorIworT1VUUFVUX0ZPUk1BVD0iY29mZi10aWM4MCIKKworIyBUaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSwgc3VjaCBhcworIyAic3BhcmMiLiAgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB3aWxsIG5vcm1hbGx5IHVzZSBpdCBpbiBhbiBPVVRQVVRfQVJDSAorIyBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgorIworQVJDSD10aWM4MAorCisjIFNvbWUgc2NyaXB0dGVtcGwgc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIGVudHJ5IGFkZHJlc3MgaW4gYW4gRU5UUlkKKyMgZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KKyMKKyMgRU5UUlk9CisKKyMgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZQorIyAiLnRleHQiIHNlY3Rpb24uCisjCitURVhUX1NUQVJUX0FERFI9MHgyMDAwMDAwCisKKyMgSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgc2V0cyBURVhUX1NUQVJUX0FERFIgdG8KKyMgaXRzIHZhbHVlIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHR0ZW1wbCBzY3JpcHQgZm9yIHRoZSAtbiBhbmQgLU4KKyMgb3B0aW9ucy4KKyMKKyMgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPQorCisjIFRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIAorIyBEQVRBX0FMSUdOTUVOVCB3aGVuIHJ1bm5pbmcgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdC4KKyMKKyMgU0VHTUVOVF9TSVpFPQorCisjIElmIFNFR01FTlRfU0laRSBpcyBub3QgZGVmaW5lZCwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHVzZXMgdGhpcworIyB0byBkZWZpbmUgaXQuCisjCitUQVJHRVRfUEFHRV9TSVpFPTB4MTAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92ODUwLnNoIGIvbGQvZW11bHBhcmFtcy92ODUwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YmZiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3Y4NTAuc2gKQEAgLTAsMCArMSwxNCBAQAorTUFDSElORT0KK1NDUklQVF9OQU1FPXY4NTAKK09VVFBVVF9GT1JNQVQ9ImVsZjMyLXY4NTAiCitURVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKK1pEQVRBX1NUQVJUX0FERFI9MHgxNjAKK1JPWkRBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgorU0RBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgorUk9TREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCitUREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCitDQUxMX1RBQkxFX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKK0FSQ0g9djg1MAorTUFYUEFHRVNJWkU9MjU2CitFTlRSWT1fc3RhcnQKK0VNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoIGIvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTNiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3ZhbmlsbGEuc2gKQEAgLTAsMCArMSw1IEBACitTQ1JJUFRfTkFNRT12YW5pbGxhCitURVhUX1NUQVJUX0FERFI9Pz8KK1RBUkdFVF9QQUdFX1NJWkU9Pz8KK0FSQ0g9dW5rbm93bgorVEVNUExBVEVfTkFNRT12YW5pbGxhCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3ZheC5zaCBiL2xkL2VtdWxwYXJhbXMvdmF4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODU0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3ZheC5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPWFvdXQKK09VVFBVVF9GT1JNQVQ9ImEub3V0IgorVEVYVF9TVEFSVF9BRERSPTAKK1RBUkdFVF9QQUdFX1NJWkU9MTAyNAorQVJDSD12YXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdnN0YS5zaCBiL2xkL2VtdWxwYXJhbXMvdnN0YS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzYyNDliCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy92c3RhLnNoCkBAIC0wLDAgKzEsOCBAQAorU0NSSVBUX05BTUU9YW91dAorT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4NiIKK1RFWFRfU1RBUlRfQUREUj0weDEwMjAKK1RBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCitTRUdNRU5UX1NJWkU9MHg0MDAwMDAKK05PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKK0FSQ0g9aTM4NgorCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3c2NS5zaCBiL2xkL2VtdWxwYXJhbXMvdzY1LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDJiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVscGFyYW1zL3c2NS5zaApAQCAtMCwwICsxLDUgQEAKK1NDUklQVF9OQU1FPXc2NQorT1VUUFVUX0ZPUk1BVD0iY29mZi13NjUiCitURVhUX1NUQVJUX0FERFI9MHgxMDAwCitUQVJHRVRfUEFHRV9TSVpFPTY0CitBUkNIPXc2NQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy96ODAwMS5zaCBiL2xkL2VtdWxwYXJhbXMvejgwMDEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NDVjMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWxwYXJhbXMvejgwMDEuc2gKQEAgLTAsMCArMSw3IEBACitTQ1JJUFRfTkFNRT16ODAwMAorT1VUUFVUX0ZPUk1BVD0iY29mZi16OGsiCitPVVRQVVRfQVJDSD0iejgwMDEiCitURVhUX1NUQVJUX0FERFI9MHgwCitUQVJHRVRfUEFHRV9TSVpFPTEyOAorQVJDSD16OGsKK0JJRz0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3o4MDAyLnNoIGIvbGQvZW11bHBhcmFtcy96ODAwMi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTliNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHBhcmFtcy96ODAwMi5zaApAQCAtMCwwICsxLDYgQEAKK1NDUklQVF9OQU1FPXo4MDAwCitPVVRQVVRfRk9STUFUPSJjb2ZmLXo4ayIKK09VVFBVVF9BUkNIPSJ6ODAwMiIKK1RFWFRfU1RBUlRfQUREUj0weDAKK1RBUkdFVF9QQUdFX1NJWkU9MTI4CitBUkNIPXo4MDAyCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvUkVBRE1FIGIvbGQvZW11bHRlbXBsL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGVjMGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHRlbXBsL1JFQURNRQpAQCAtMCwwICsxLDMgQEAKK1RoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgc291cmNlZCBieSBnZW5zY3JpcHRzLnNoLCBhZnRlcgorc2V0dGluZyBzb21lIHZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGluLCB0byBwcm9kdWNlCitDIHNvdXJjZSBmaWxlcyB0aGF0IGNvbnRhaW4ganVtcCB0YWJsZXMgZm9yIGVhY2ggZW11bGF0aW9uLgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2FpeC5lbSBiL2xkL2VtdWx0ZW1wbC9haXguZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3ODU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9haXguZW0KQEAgLTAsMCArMSwxMDU0IEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCisKKy8qIEFJWCBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KKyAgIEFJWCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisjaW5jbHVkZSAibGRjdG9yLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZyZWUgUEFSQU1TICgoUFRSKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcworICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7CitzdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOworCisvKiBUaGUgZmlsZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGVhY2ggc2VjdGlvbi4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOworCisvKiBUaGUgbWF4aW11bSBzaXplIHRoZSBzdGFjayBpcyBwZXJtaXR0ZWQgdG8gZ3Jvdy4gIFRoaXMgaXMgc3RvcmVkIGluCisgICB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heHN0YWNrOworCisvKiBUaGUgbWF4aW11bSBkYXRhIHNpemUuICBUaGlzIGlzIHN0b3JlZCBpbiB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heGRhdGE7CisKKy8qIFdoZXRoZXIgdG8gcGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLworc3RhdGljIGludCBnYyA9IDE7CisKKy8qIFRoZSBtb2R1bGUgdHlwZSB0byB1c2UuICAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOworCisvKiBXaGV0aGVyIHRoZSAudGV4dCBzZWN0aW9uIG11c3QgYmUgcmVhZC1vbmx5IChpLmUuLCBubyByZWxvY3MKKyAgIHBlcm1pdHRlZCkuICAqLworc3RhdGljIGludCB0ZXh0cm87CisKKy8qIFdoZXRoZXIgdG8gaW1wbGVtZW50IFVuaXggbGlrZSBsaW5rZXIgc2VtYW50aWNzLiAgKi8KK3N0YXRpYyBpbnQgdW5peF9sZDsKKworLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbXBvcnQgZmlsZSBsaXN0LiAgKi8KKworc3RydWN0IGZpbGVsaXN0Cit7CisgIHN0cnVjdCBmaWxlbGlzdCAqbmV4dDsKKyAgY29uc3QgY2hhciAqbmFtZTsKK307CisKKy8qIExpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZWxpc3QgKmltcG9ydF9maWxlczsKKworLyogTGlzdCBvZiBleHBvcnQgc3ltYm9scyByZWFkIGZyb20gdGhlIGV4cG9ydCBmaWxlcy4gICovCisKK3N0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QKK3sKKyAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbmV4dDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgYm9vbGVhbiBzeXNjYWxsOworfTsKKworc3RhdGljIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmV4cG9ydF9zeW1ib2xzOworCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGRvbmUuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKK3sKKyNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OworI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCisgIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKK30KKworLyogSGFuZGxlIEFJWCBzcGVjaWZpYyBvcHRpb25zLiAgKi8KKworc3RhdGljIGludAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKKyAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7CisgIGludCBpbmR4OworICBpbnQgbG9uZ2luZDsKKyAgaW50IG9wdGM7CisgIGxvbmcgdmFsOworICBjaGFyICplbmQ7CisKKyNkZWZpbmUgT1BUSU9OX0lHTk9SRSAoMzAwKQorI2RlZmluZSBPUFRJT05fQVVUT0lNUCAoT1BUSU9OX0lHTk9SRSArIDEpCisjZGVmaW5lIE9QVElPTl9FUk5PVE9LIChPUFRJT05fQVVUT0lNUCArIDEpCisjZGVmaW5lIE9QVElPTl9FUk9LIChPUFRJT05fRVJOT1RPSyArIDEpCisjZGVmaW5lIE9QVElPTl9FWFBPUlQgKE9QVElPTl9FUk9LICsgMSkKKyNkZWZpbmUgT1BUSU9OX0lNUE9SVCAoT1BUSU9OX0VYUE9SVCArIDEpCisjZGVmaW5lIE9QVElPTl9MT0FETUFQIChPUFRJT05fSU1QT1JUICsgMSkKKyNkZWZpbmUgT1BUSU9OX01BWERBVEEgKE9QVElPTl9MT0FETUFQICsgMSkKKyNkZWZpbmUgT1BUSU9OX01BWFNUQUNLIChPUFRJT05fTUFYREFUQSArIDEpCisjZGVmaW5lIE9QVElPTl9NT0RUWVBFIChPUFRJT05fTUFYU1RBQ0sgKyAxKQorI2RlZmluZSBPUFRJT05fTk9BVVRPSU1QIChPUFRJT05fTU9EVFlQRSArIDEpCisjZGVmaW5lIE9QVElPTl9OT1NUUkNNUENUIChPUFRJT05fTk9BVVRPSU1QICsgMSkKKyNkZWZpbmUgT1BUSU9OX1BEIChPUFRJT05fTk9TVFJDTVBDVCArIDEpCisjZGVmaW5lIE9QVElPTl9QVCAoT1BUSU9OX1BEICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NUUkNNUENUIChPUFRJT05fUFQgKyAxKQorI2RlZmluZSBPUFRJT05fVU5JWCAoT1BUSU9OX1NUUkNNUENUICsgMSkKKworICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworICAgIHsiYmFzaXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCisgICAgeyJiYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCisgICAgeyJiY29tcHJsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJjcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAorICAgIHsiYmNyb3IzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKKyAgICB7ImJFIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAorICAgIHsiYmVybm90b2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAorICAgIHsiYmVyb2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VST0t9LAorICAgIHsiYmVycm1zZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJleHBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCisgICAgeyJiZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCisgICAgeyJiZ2MiLCBub19hcmd1bWVudCwgJmdjLCAxfSwKKyAgICB7ImJoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAorICAgIHsiYmhhbHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCisgICAgeyJiSSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKKyAgICB7ImJpbXBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCisgICAgeyJibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCisgICAgeyJibG9hZG1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCisgICAgeyJibWF4ZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCisgICAgeyJibWF4c3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKKyAgICB7ImJNIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKKyAgICB7ImJtb2R0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKKyAgICB7ImJub2F1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCisgICAgeyJibm9kZWxjc2VjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJub2VudHJ5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAorICAgIHsiYm5vZ2MiLCBub19hcmd1bWVudCwgJmdjLCAwfSwKKyAgICB7ImJuc28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCisgICAgeyJibm9zdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9TVFJDTVBDVH0sCisgICAgeyJibm90ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCisgICAgeyJibnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAorICAgIHsiYnBEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QRH0sCisgICAgeyJicFQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BUfSwKKyAgICB7ImJybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKKyAgICB7ImJTIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCisgICAgeyJic28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAorICAgIHsiYnN0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJDTVBDVH0sCisgICAgeyJidGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAorICAgIHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAorICAgIHsidW5peCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5JWH0sCisgICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorICB9OworCisgIC8qIE9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBBSVggbGlua2VyIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0OiAtZiwKKyAgICAgLVMsIC12LCAtWiwgLWJiaW5kY21kcywgLWJiaW5kZXIsIC1iYmluZG9wdHMsIC1iY2FsbHMsIC1iY2FwcywKKyAgICAgLWJjcm9yMTUsIC1iZGVidWdvcHQsIC1iZGJnLCAtYmRlbGNzZWN0LCAtYmV4PywgLWJmaWxlbGlzdCwgLWJmbCwKKyAgICAgLWJnY2J5cGFzcywgLWJnbGluaywgLWJpbnNlcnQsIC1iaSwgLWJsb2FkbWFwLCAtYmwsIC1ibWFwLCAtYm5sLAorICAgICAtYm5vYmluZCwgLWJub2NvbXBybGQsIC1ibm9jcmxkLCAtYm5vZXJybXNnLCAtYm5vZ2xpbmssCisgICAgIC1ibm9sb2FkbWFwLCAtYm5sLCAtYm5vb2JqcmVvcmRlciwgLWJub3F1aWV0LCAtYm5vcmVvcmRlciwKKyAgICAgLWJub3R5cGNoaywgLWJub3gsIC1icXVpZXQsIC1iUiwgLWJyZW5hbWUsIC1icmVvcmRlciwgLWJ0eXBjaGssCisgICAgIC1ieCwgLWJYLCAtYnhyZWYuICAqLworCisgIC8qIElmIHRoZSBjdXJyZW50IG9wdGlvbiBzdGFydHMgd2l0aCAtYiwgY2hhbmdlIHRoZSBmaXJzdCA6IHRvIGFuID0uCisgICAgIFRoZSBBSVggbGlua2VyIHVzZXMgOiB0byBzZXBhcmF0ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGFyZ3VtZW50OworICAgICBjaGFuZ2luZyBpdCB0byA9IGxldHMgdXMgdHJlYXQgaXQgYXMgYSBnZXRvcHQgb3B0aW9uLiAgKi8KKyAgaW5keCA9IG9wdGluZDsKKyAgaWYgKGluZHggPT0gMCkKKyAgICBpbmR4ID0gMTsKKyAgaWYgKGluZHggPCBhcmdjICYmIHN0cm5jbXAgKGFyZ3ZbaW5keF0sICItYiIsIDIpID09IDApCisgICAgeworICAgICAgY2hhciAqczsKKworICAgICAgZm9yIChzID0gYXJndltpbmR4XTsgKnMgIT0gJ1wwJzsgcysrKQorCXsKKwkgIGlmICgqcyA9PSAnOicpCisJICAgIHsKKwkgICAgICAqcyA9ICc9JzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogV2UgYWRkIHMgYW5kIHUgc28gdG8gdGhlIHNob3J0IG9wdGlvbnMgbGlzdCBzbyB0aGF0IC1zIGFuZCAtdSBvbgorICAgICB0aGUgY29tbWFuZCBsaW5lIGRvIG5vdCBtYXRjaCAtc3RhdGljIGFuZCAtdW5peC4gICovCisKKyAgb3B0ZXJyID0gMDsKKyAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItRDpIOktUOnpzdSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7CisgIG9wdGVyciA9IHByZXZvcHRlcnI7CisKKyAgc3dpdGNoIChvcHRjKQorICAgIHsKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICd1JzoKKyAgICBkZWZhdWx0OgorICAgICAgb3B0aW5kID0gcHJldm9wdGluZDsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSAwOgorICAgICAgLyogTG9uZyBvcHRpb24gd2hpY2gganVzdCBzZXRzIGEgZmxhZy4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0QnOgorICAgICAgdmFsID0gc3RydG9sIChvcHRhcmcsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1EIG51bWJlciAlc1xuIiwgb3B0YXJnKTsKKyAgICAgIGVsc2UgaWYgKHZhbCAhPSAtMSkKKwlsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIGV4cF9pbnRvcCAodmFsKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0gnOgorICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKKyAgICAgIGlmICgqZW5kICE9ICdcMCcKKwkgIHx8ICh2YWwgJiAodmFsIC0gMSkpICE9IDApCisJZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtSCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7CisgICAgICBlbHNlCisJZmlsZV9hbGlnbiA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnSyc6CisgICAgY2FzZSAneic6CisgICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgdXNlIHRoZSBwYWdlIHNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiAgKi8KKyAgICAgIGZpbGVfYWxpZ24gPSA0MDk2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdUJzoKKyAgICAgIC8qIE9uIEFJWCB0aGlzIGlzIHRoZSBzYW1lIGFzIEdOVSBsZCAtVHRleHQuICBXaGVuIHdlIHNlZSAtVAorICAgICAgICAgbnVtYmVyLCB3ZSBhc3N1bWUgdGhlIEFJWCBvcHRpb24gaXMgaW50ZW5kZWQuICBPdGhlcndpc2UsIHdlCisgICAgICAgICBhc3N1bWUgdGhlIHVzdWFsIEdOVSBsZCAtVCBvcHRpb24gaXMgaW50ZW5kZWQuICBXZSBjYW4ndCBqdXN0CisgICAgICAgICBpZ25vcmUgdGhlIEFJWCBvcHRpb24sIGJlY2F1c2UgZ2NjIHBhc3NlcyBpdCB0byB0aGUgbGlua2VyLiAgKi8KKyAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7CisgICAgICBpZiAoKmVuZCAhPSAnXDAnKQorCXsKKwkgIG9wdGluZCA9IHByZXZvcHRpbmQ7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIGV4cF9pbnRvcCAodmFsKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0lHTk9SRToKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fQVVUT0lNUDoKKyAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9FUk5PVE9LOgorICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0VST0s6CisgICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9FWFBPUlQ6CisgICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgKG9wdGFyZywgZmFsc2UpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9JTVBPUlQ6CisgICAgICB7CisJc3RydWN0IGZpbGVsaXN0ICpuOworCXN0cnVjdCBmaWxlbGlzdCAqKmZscHA7CisKKwluID0gKHN0cnVjdCBmaWxlbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpOworCW4tPm5leHQgPSBOVUxMOworCW4tPm5hbWUgPSBvcHRhcmc7CisJZmxwcCA9ICZpbXBvcnRfZmlsZXM7CisJd2hpbGUgKCpmbHBwICE9IE5VTEwpCisJICBmbHBwID0gJigqZmxwcCktPm5leHQ7CisJKmZscHAgPSBuOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9MT0FETUFQOgorICAgICAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUFYREFUQToKKyAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7CisgICAgICBpZiAoKmVuZCAhPSAnXDAnKQorCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhkYXRhIG51bWJlciAlc1xuIiwKKwkgICAgICAgb3B0YXJnKTsKKyAgICAgIGVsc2UKKwltYXhkYXRhID0gdmFsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9NQVhTVEFDSzoKKyAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7CisgICAgICBpZiAoKmVuZCAhPSAnXDAnKQorCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhzdGFjayBudW1iZXIgJXNcbiIsCisJICAgICAgIG9wdGFyZyk7CisgICAgICBlbHNlCisJbWF4c3RhY2sgPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX01PRFRZUEU6CisgICAgICBpZiAoKm9wdGFyZyA9PSAnUycpCisJeworCSAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7CisJICArK29wdGFyZzsKKwl9CisgICAgICBpZiAoKm9wdGFyZyA9PSAnXDAnIHx8IG9wdGFyZ1sxXSA9PSAnXDAnKQorCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgbW9kdWxlIHR5cGUgJXNcbiIsIG9wdGFyZyk7CisgICAgICBlbHNlCisJbW9kdHlwZSA9ICgqb3B0YXJnIDw8IDgpIHwgb3B0YXJnWzFdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9OT0FVVE9JTVA6CisgICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9OT1NUUkNNUENUOgorICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1BEOgorICAgICAgLyogVGhpcyBzZXRzIHRoZSBwYWdlIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8KKyAgICAgICAgIHN0YXJ0IG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZQorICAgICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSwgc28gd2UgbmVlZCB0byBidWlsZCBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgZXhwcmVzc2lvbi4gICovCisgICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wRCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7CisgICAgICBlbHNlCisJeworCSAgZXRyZWVfdHlwZSAqdDsKKworCSAgdCA9IGV4cF9iaW5vcCAoJysnLAorCQkJIGV4cF9pbnRvcCAodmFsKSwKKwkJCSBleHBfYmlub3AgKCcmJywKKwkJCQkgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSwKKwkJCQkgICAgZXhwX2ludG9wICgweGZmZikpKTsKKwkgIHQgPSBleHBfYmlub3AgKCcmJywKKwkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICgzMSkpLAorCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgMzEpKTsKKwkgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgdCk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QVDoKKyAgICAgIC8qIFRoaXMgc2V0IHRoZSBwYWdlIHRoYXQgdGhlIC50ZXh0IHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8gc3RhcnQKKyAgICAgICAgIG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZSBvZmZzZXQKKyAgICAgICAgIHdpdGhpbiB0aGUgZmlsZS4gICovCisgICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wVCBudW1iZXIgJXNcbiIsIG9wdGFyZyk7CisgICAgICBlbHNlCisJeworCSAgZXRyZWVfdHlwZSAqdDsKKworCSAgdCA9IGV4cF9iaW5vcCAoJysnLAorCQkJIGV4cF9pbnRvcCAodmFsKSwKKwkJCSBleHBfbmFtZW9wIChTSVpFT0ZfSEVBREVSUywgTlVMTCkpOworCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAorCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDMxKSksCisJCQkgZXhwX2ludG9wICh+IChiZmRfdm1hKSAzMSkpOworCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCB0KTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1NUUkNNUENUOgorICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9VTklYOgorICAgICAgdW5peF9sZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYSBCRkQKKyAgIG9iamVjdCBvciBhbiBhcmNoaXZlLiAgSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggIyEsIHdlIG11c3QgdHJlYXQgaXQKKyAgIGFzIGFuIGltcG9ydCBmaWxlLiAgVGhpcyBpcyBmb3IgQUlYIGNvbXBhdGliaWxpdHkuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKK3sKKyAgRklMRSAqZTsKKyAgYm9vbGVhbiByZXQ7CisKKyAgZSA9IGZvcGVuIChlbnRyeS0+ZmlsZW5hbWUsIEZPUEVOX1JUKTsKKyAgaWYgKGUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0ID0gZmFsc2U7CisKKyAgaWYgKGdldGMgKGUpID09ICcjJyAmJiBnZXRjIChlKSA9PSAnIScpCisgICAgeworICAgICAgc3RydWN0IGZpbGVsaXN0ICpuOworICAgICAgc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKKworICAgICAgbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKKyAgICAgIG4tPm5leHQgPSBOVUxMOworICAgICAgbi0+bmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKKyAgICAgIGZscHAgPSAmaW1wb3J0X2ZpbGVzOworICAgICAgd2hpbGUgKCpmbHBwICE9IE5VTEwpCisJZmxwcCA9ICYoKmZscHApLT5uZXh0OworICAgICAgKmZscHAgPSBuOworCisgICAgICByZXQgPSB0cnVlOworICAgICAgZW50cnktPmxvYWRlZCA9IHRydWU7CisgICAgfQorCisgIGZjbG9zZSAoZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQoreworICBib29sZWFuIHI7CisgIHN0cnVjdCBzZXRfaW5mbyAqcDsKKworICAvKiBDYWxsIGxkY3Rvcl9idWlsZF9zZXRzLCBhZnRlciBwcmV0ZW5kaW5nIHRoYXQgdGhpcyBpcyBhCisgICAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG8gdGhpcyBiZWNhdXNlIEFJWCByZXF1aXJlcyByZWxvY2F0aW9uCisgICAgIGVudHJpZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHN5bWJvbHMsIGV2ZW4gaW4gYSBmaW5hbAorICAgICBleGVjdXRhYmxlLiAgT2YgY291cnNlLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB3ZSBhcmUKKyAgICAgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlLiAgKi8KKyAgciA9IGxpbmtfaW5mby5yZWxvY2F0ZWFibGU7CisgIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgInhjb2ZmIikgIT0gTlVMTCkKKyAgICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKKyAgbGRjdG9yX2J1aWxkX3NldHMgKCk7CisgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSByOworCisgIC8qIEZvciBlYWNoIHNldCwgcmVjb3JkIHRoZSBzaXplLCBzbyB0aGF0IHRoZSBYQ09GRiBiYWNrZW5kIGNhbgorICAgICBvdXRwdXQgdGhlIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KKyAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQorCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbworCSBub3QgZG8gYW55dGhpbmcuICAqLworICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwljb250aW51ZTsKKworICAgICAgaWYgKHAtPnJlbG9jICE9IEJGRF9SRUxPQ19DVE9SKQorCXsKKwkgIC8qIEhhbmRsZSB0aGlzIGlmIHdlIG5lZWQgdG8uICAqLworCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBzaXplID0gKHAtPmNvdW50ICsgMikgKiA0OworICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcC0+aCwgc2l6ZSkpCisJZWluZm8gKCIlRiVQOiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IGZhaWxlZDogJUVcbiIpOworICAgIH0KK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKKyAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQoreworICBzdHJ1Y3QgZmlsZWxpc3QgKmZsOworICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICplbDsKKyAgY2hhciAqbGlicGF0aDsKKyAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07CisgIGludCBpOworCisgIC8qIEhhbmRsZSB0aGUgaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGlmIGFueS4gICovCisgIGZvciAoZmwgPSBpbXBvcnRfZmlsZXM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCisgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIChmbC0+bmFtZSwgdHJ1ZSk7CisgIGZvciAoZWwgPSBleHBvcnRfc3ltYm9sczsgZWwgIT0gTlVMTDsgZWwgPSBlbC0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZWwtPm5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgaWYgKGggPT0gTlVMTCkKKwllaW5mbyAoIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIG9mIGV4cG9ydCBzeW1ib2wgZmFpbGVkOiAlRVxuIik7CisgICAgICBpZiAoISBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwgZWwtPnN5c2NhbGwpKQorCWVpbmZvICgiJVAlRjogYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wgZmFpbGVkOiAlRVxuIik7CisgICAgfQorCisgIC8qIFRyYWNrIGRvd24gYWxsIHJlbG9jYXRpb25zIGNhbGxlZCBmb3IgYnkgdGhlIGxpbmtlciBzY3JpcHQgKHRoZXNlCisgICAgIGFyZSB0eXBpY2FsbHkgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBlbnRyaWVzIGNyZWF0ZWQgYnkKKyAgICAgQ09OU1RSVUNUT1JTKSBhbmQgbGV0IHRoZSBiYWNrZW5kIGtub3cgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZQorICAgICAubG9hZGVyIHJlbG9jcyBmb3IgdGhlbS4gICovCisgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyk7CisKKyAgLyogV2UgbmVlZCB0byBidWlsZCBMSUJQQVRIIGZyb20gdGhlIC1MIGFyZ3VtZW50cy4gIElmIGFueSAtcnBhdGgKKyAgICAgYXJndW1lbnRzIHdlcmUgdXNlZCwgdGhvdWdoLCB3ZSB1c2UgLXJwYXRoIGluc3RlYWQsIGFzIGEgR05VCisgICAgIGV4dGVuc2lvbi4gICovCisgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKKyAgICBsaWJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOworICBlbHNlIGlmIChzZWFyY2hfaGVhZCA9PSBOVUxMKQorICAgIGxpYnBhdGggPSAoY2hhciAqKSAiIjsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7CisKKyAgICAgIGxlbiA9IHN0cmxlbiAoc2VhcmNoX2hlYWQtPm5hbWUpOworICAgICAgbGlicGF0aCA9IHhtYWxsb2MgKGxlbiArIDEpOworICAgICAgc3RyY3B5IChsaWJwYXRoLCBzZWFyY2hfaGVhZC0+bmFtZSk7CisgICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkLT5uZXh0OyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQorCXsKKwkgIHNpemVfdCBubGVuOworCisJICBubGVuID0gc3RybGVuIChzZWFyY2gtPm5hbWUpOworCSAgbGlicGF0aCA9IHhyZWFsbG9jIChsaWJwYXRoLCBsZW4gKyBubGVuICsgMik7CisJICBsaWJwYXRoW2xlbl0gPSAnOic7CisJICBzdHJjcHkgKGxpYnBhdGggKyBsZW4gKyAxLCBzZWFyY2gtPm5hbWUpOworCSAgbGVuICs9IG5sZW4gKyAxOworCX0KKyAgICB9CisKKyAgLyogTGV0IHRoZSBYQ09GRiBiYWNrZW5kIHNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KKyAgaWYgKCEgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgbGlicGF0aCwKKwkJCQkJIGVudHJ5X3N5bWJvbCwgZmlsZV9hbGlnbiwKKwkJCQkJIG1heHN0YWNrLCBtYXhkYXRhLAorCQkJCQkgZ2MgJiYgISB1bml4X2xkID8gdHJ1ZSA6IGZhbHNlLAorCQkJCQkgbW9kdHlwZSwKKwkJCQkJIHRleHRybyA/IHRydWUgOiBmYWxzZSwKKwkJCQkJIHVuaXhfbGQsCisJCQkJCSBzcGVjaWFsX3NlY3Rpb25zKSkKKyAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7CisKKyAgLyogTG9vayB0aHJvdWdoIHRoZSBzcGVjaWFsIHNlY3Rpb25zLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0CisgICAgIHBsYWNlIGluIHRoZSBsaW5rIG9yZGVyaW5nLiAgVGhpcyBpcyBlc3BlY2lhbGx5IG1hZ2ljLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7CisgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGxzOworICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzOworICAgICAgY29uc3QgY2hhciAqb25hbWU7CisgICAgICBib29sZWFuIHN0YXJ0OworCisgICAgICBzZWMgPSBzcGVjaWFsX3NlY3Rpb25zW2ldOworICAgICAgaWYgKHNlYyA9PSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICAvKiBSZW1vdmUgdGhpcyBzZWN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgorICAgICAgICAgVGhpcyBhc3N1bWVzIHdlIGtub3cgd2hhdCB0aGUgc2NyaXB0IGxvb2tzIGxpa2UuICAqLworICAgICAgaXMgPSBOVUxMOworICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOworICAgICAgaWYgKG9zID09IE5VTEwpCisJZWluZm8gKCIlUCVGOiBjYW4ndCBmaW5kIG91dHB1dCBzZWN0aW9uICVzXG4iLAorCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKKyAgICAgIGZvciAocGxzID0gJm9zLT5jaGlsZHJlbi5oZWFkOyAqcGxzICE9IE5VTEw7IHBscyA9ICYoKnBscyktPm5leHQpCisJeworCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KKwkgICAgICAmJiAoKnBscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCisJICAgIHsKKwkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcGxzOworCSAgICAgICpwbHMgPSAoKnBscyktPm5leHQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSkKKwkgICAgeworCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwd2xzOworCisJICAgICAgZm9yIChwd2xzID0gJigqcGxzKS0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKKwkJICAgKnB3bHMgIT0gTlVMTDsKKwkJICAgcHdscyA9ICYoKnB3bHMpLT5uZXh0KQorCQl7CisJCSAgaWYgKCgqcHdscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCisJCSAgICAgICYmICgqcHdscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCisJCSAgICB7CisJCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwd2xzOworCQkgICAgICAqcHdscyA9ICgqcHdscyktPm5leHQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKGlzICE9IE5VTEwpCisJCWJyZWFrOworCSAgICB9CisJfQkKKworICAgICAgaWYgKGlzID09IE5VTEwpCisJZWluZm8gKCIlUCVGOiBjYW4ndCBmaW5kICVzIGluIG91dHB1dCBzZWN0aW9uXG4iLAorCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc2VjLT5vd25lciwgc2VjKSk7CisKKyAgICAgIC8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBzZWN0aW9uIHNob3VsZCBnby4gICovCisgICAgICBzd2l0Y2ggKGkpCisJeworCWRlZmF1bHQ6IC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisJY2FzZSAwOgorCSAgLyogX3RleHQgKi8KKwkgIG9uYW1lID0gIi50ZXh0IjsKKwkgIHN0YXJ0ID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIC8qIF9ldGV4dCAqLworCSAgb25hbWUgPSAiLnRleHQiOworCSAgc3RhcnQgPSBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIC8qIF9kYXRhICovCisJICBvbmFtZSA9ICIuZGF0YSI7CisJICBzdGFydCA9IHRydWU7CisJICBicmVhazsKKwljYXNlIDM6CisJICAvKiBfZWRhdGEgKi8KKwkgIG9uYW1lID0gIi5kYXRhIjsKKwkgIHN0YXJ0ID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIDQ6CisJY2FzZSA1OgorCSAgLyogX2VuZCBhbmQgZW5kICovCisJICBvbmFtZSA9ICIuYnNzIjsKKwkgIHN0YXJ0ID0gZmFsc2U7CisJICBicmVhazsKKwl9CisKKyAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChvbmFtZSk7CisKKyAgICAgIGlmIChzdGFydCkKKwl7CisJICBpcy0+aGVhZGVyLm5leHQgPSBvcy0+Y2hpbGRyZW4uaGVhZDsKKwkgIG9zLT5jaGlsZHJlbi5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlzLT5oZWFkZXIubmV4dCA9IE5VTEw7CisJICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZvcy0+Y2hpbGRyZW4sCisJCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzLAorCQkJCSAmaXMtPmhlYWRlci5uZXh0KTsKKwl9CisgICAgfQorfQorCisvKiBSZWFkIGFuIGltcG9ydCBvciBleHBvcnQgZmlsZS4gIEZvciBhbiBpbXBvcnQgZmlsZSwgdGhpcyBpcyBjYWxsZWQKKyAgIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiBlbXVsYXRpb24gcm91dGluZS4gIEZvciBhbiBleHBvcnQgZmlsZSwKKyAgIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZV9hcmdzIGVtdWxhdGlvbiByb3V0aW5lLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSAoZmlsZW5hbWUsIGltcG9ydCkKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGJvb2xlYW4gaW1wb3J0OworeworICBzdHJ1Y3Qgb2JzdGFjayAqbzsKKyAgRklMRSAqZjsKKyAgaW50IGxpbmVubzsKKyAgaW50IGM7CisgIGJvb2xlYW4ga2VlcDsKKyAgY29uc3QgY2hhciAqaW1wcGF0aDsKKyAgY29uc3QgY2hhciAqaW1wZmlsZTsKKyAgY29uc3QgY2hhciAqaW1wbWVtYmVyOworCisgIG8gPSAoc3RydWN0IG9ic3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb2JzdGFjaykpOworICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAobywgMCwgMCwgeG1hbGxvYywgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSk7CisKKyAgZiA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUlQpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICBlaW5mbyAoIiVGJXM6ICVFXG4iLCBmaWxlbmFtZSk7CisgICAgfQorCisgIGtlZXAgPSBmYWxzZTsKKworICBpbXBwYXRoID0gTlVMTDsKKyAgaW1wZmlsZSA9IE5VTEw7CisgIGltcG1lbWJlciA9IE5VTEw7CisKKyAgbGluZW5vID0gMDsKKyAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKKyAgICB7CisgICAgICBjaGFyICpzOworICAgICAgY2hhciAqc3ltbmFtZTsKKyAgICAgIGJvb2xlYW4gc3lzY2FsbDsKKyAgICAgIGJmZF92bWEgYWRkcmVzczsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICBpZiAoYyAhPSAnXG4nKQorCXsKKwkgIG9ic3RhY2tfMWdyb3cgKG8sIGMpOworCSAgY29udGludWU7CisJfQorCisgICAgICBvYnN0YWNrXzFncm93IChvLCAnXDAnKTsKKyAgICAgICsrbGluZW5vOworCisgICAgICBzID0gKGNoYXIgKikgb2JzdGFja19iYXNlIChvKTsKKyAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQorCSsrczsKKyAgICAgIGlmICgqcyA9PSAnXDAnCisJICB8fCAqcyA9PSAnKicKKwkgIHx8ICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnICcpCisJICB8fCAoISBpbXBvcnQgJiYgKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKSkKKwl7CisJICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKQorCXsKKwkgIHMgKz0gMjsKKwkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQorCSAgICArK3M7CisJICBpZiAoKnMgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltcHBhdGggPSBOVUxMOworCSAgICAgIGltcGZpbGUgPSBOVUxMOworCSAgICAgIGltcG1lbWJlciA9IE5VTEw7CisJICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnMgPT0gJygnKQorCSAgICBlaW5mbyAoIiVGJXMlZDogIyEgKFttZW1iZXJdKSBpcyBub3Qgc3VwcG9ydGVkIGluIGltcG9ydCBmaWxlc1xuIiwKKwkJICAgZmlsZW5hbWUsIGxpbmVubyk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyIGNzOworCSAgICAgIGNoYXIgKmZpbGU7CisKKwkgICAgICAodm9pZCkgb2JzdGFja19maW5pc2ggKG8pOworCSAgICAgIGtlZXAgPSB0cnVlOworCSAgICAgIGltcHBhdGggPSBzOworCSAgICAgIGZpbGUgPSBOVUxMOworCSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJygnICYmICpzICE9ICdcMCcpCisJCXsKKwkJICBpZiAoKnMgPT0gJy8nKQorCQkgICAgZmlsZSA9IHMgKyAxOworCQkgICsrczsKKwkJfQorCSAgICAgIGlmIChmaWxlICE9IE5VTEwpCisJCXsKKwkJICBmaWxlWy0xXSA9ICdcMCc7CisJCSAgaW1wZmlsZSA9IGZpbGU7CisJCSAgaWYgKGltcHBhdGggPT0gZmlsZSAtIDEpCisJCSAgICBpbXBwYXRoID0gIi8iOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaW1wZmlsZSA9IGltcHBhdGg7CisJCSAgaW1wcGF0aCA9ICIiOworCQl9CisJICAgICAgY3MgPSAqczsKKwkgICAgICAqcyA9ICdcMCc7CisJICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcykpCisJCXsKKwkJICArK3M7CisJCSAgY3MgPSAqczsKKwkJfQorCSAgICAgIGlmIChjcyAhPSAnKCcpCisJCXsKKwkJICBpbXBtZW1iZXIgPSAiIjsKKwkJICBpZiAoY3MgIT0gJ1wwJykKKwkJICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiwKKwkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgKytzOworCQkgIGltcG1lbWJlciA9IHM7CisJCSAgd2hpbGUgKCpzICE9ICcpJyAmJiAqcyAhPSAnXDAnKQorCQkgICAgKytzOworCQkgIGlmICgqcyA9PSAnKScpCisJCSAgICAqcyA9ICdcMCc7CisJCSAgZWxzZQorCQkgICAgZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iLAorCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7CisJCX0KKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgdG8gYmUgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuICAqLworICAgICAgc3ltbmFtZSA9IHM7CisgICAgICBzeXNjYWxsID0gZmFsc2U7CisgICAgICBhZGRyZXNzID0gKGJmZF92bWEpIC0xOworCisgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICdcMCcpCisJKytzOworICAgICAgaWYgKCpzICE9ICdcMCcpCisJeworCSAgY2hhciAqc2U7CisKKwkgICpzKysgPSAnXDAnOworCisJICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKKwkgICAgKytzOworCisJICBzZSA9IHM7CisJICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSAmJiAqc2UgIT0gJ1wwJykKKwkgICAgKytzZTsKKwkgIGlmICgqc2UgIT0gJ1wwJykKKwkgICAgeworCSAgICAgICpzZSsrID0gJ1wwJzsKKwkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkpCisJCSsrc2U7CisJICAgICAgaWYgKCpzZSAhPSAnXDAnKQorCQllaW5mbyAoIiVzJWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQvZXhwb3J0IGZpbGVcbiIsCisJCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKKwkgICAgfQorCisJICBpZiAocyA9PSBzZSkKKwkgICAgeworCSAgICAgIC8qIFRoZXJlIHdhcyBubyBhZGRyZXNzIGFmdGVyIGFsbC4gICovCisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzdmMiKSA9PSAwCisJCSAgIHx8IHN0cmNhc2VjbXAgKHMsICJzeXNjYWxsIikgPT0gMCkKKwkgICAgc3lzY2FsbCA9IHRydWU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyICplbmQ7CisKKwkgICAgICBhZGRyZXNzID0gc3RydG91bCAocywgJmVuZCwgMCk7CisJICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwkJZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiwKKwkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOworCSAgICB9CisJfQorCisgICAgICBpZiAoISBpbXBvcnQpCisJeworCSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbjsKKworCSAgbGRsYW5nX2FkZF91bmRlZiAoc3ltbmFtZSk7CisJICBuID0gKChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICopCisJICAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCkpKTsKKwkgIG4tPm5leHQgPSBleHBvcnRfc3ltYm9sczsKKwkgIG4tPm5hbWUgPSBidXlzdHJpbmcgKHN5bW5hbWUpOworCSAgbi0+c3lzY2FsbCA9IHN5c2NhbGw7CisJICBleHBvcnRfc3ltYm9scyA9IG47CisJfQorICAgICAgZWxzZQorCXsKKwkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHN5bW5hbWUsIGZhbHNlLCBmYWxzZSwKKwkJCQkgICAgdHJ1ZSk7CisJICBpZiAoaCA9PSBOVUxMIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCisJICAgIHsKKwkgICAgICAvKiBXZSBjYW4ganVzdCBpZ25vcmUgYXR0ZW1wdHMgdG8gaW1wb3J0IGFuIHVucmVmZXJlbmNlZAorCQkgc3ltYm9sLiAgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCEgYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsCisJCQkJCSAgICAgYWRkcmVzcywgaW1wcGF0aCwgaW1wZmlsZSwKKwkJCQkJICAgICBpbXBtZW1iZXIpKQorCQllaW5mbyAoIiVYJXM6JWQ6IGZhaWxlZCB0byBpbXBvcnQgc3ltYm9sICVzOiAlRVxuIiwKKwkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIHN5bW5hbWUpOworCSAgICB9CisJfQorCisgICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOworICAgIH0KKworICBpZiAob2JzdGFja19vYmplY3Rfc2l6ZSAobykgPiAwKQorICAgIHsKKyAgICAgIGVpbmZvICgiJXM6JWQ6IHdhcm5pbmc6IGlnbm9yaW5nIHVudGVybWluYXRlZCBsYXN0IGxpbmVcbiIsCisJICAgICBmaWxlbmFtZSwgbGluZW5vKTsKKyAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7CisgICAgfQorCisgIGlmICghIGtlZXApCisgICAgeworICAgICAgb2JzdGFja19mcmVlIChvLCBOVUxMKTsKKyAgICAgIGZyZWUgKG8pOworICAgIH0KK30KKworLyogVGhpcyByb3V0aW5lIHNhdmVzIHVzIGZyb20gd29ycnlpbmcgYWJvdXQgZGVjbGFyaW5nIGZyZWUuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSAocCkKKyAgICAgUFRSIHA7Cit7CisgIGZyZWUgKHApOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKKyAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9va3MgZm9yIHJlbG9jYXRpb25zIGFuZCBhc3NpZ25tZW50cworICAgdG8gc3ltYm9scy4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3JlbG9jcyAocykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKK3sKKyAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0pCisgICAgeworICAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcnM7CisKKyAgICAgIHJzID0gJnMtPnJlbG9jX3N0YXRlbWVudDsKKyAgICAgIGlmIChycy0+bmFtZSA9PSBOVUxMKQorCWVpbmZvICgiJUYlUDogb25seSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIHBlcm1pdHRlZFxuIik7CisgICAgICBpZiAoISBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcnMtPm5hbWUpKQorCWVpbmZvICgiJUYlUDogYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgZmFpbGVkOiAlRVxuIik7CisgICAgfQorCisgIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCisgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKK30KKworLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKKyAgICAgZXRyZWVfdHlwZSAqZXhwOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQorICAgIHsKKyAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6CisgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCisJCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICBpZiAoaCA9PSBOVUxMKQorCWJyZWFrOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKKyAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQorCXsKKwkgIGlmICghIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAorCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQorCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCisJCSAgIGV4cC0+YXNzaWduLmRzdCk7CisJfQorICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV9iaW5hcnk6CisgICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOworICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV90cmluYXJ5OgorICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOworICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7CisgICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV91bmFyeToKKyAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKworaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCit0aGVuCisjIFNjcmlwdHMgY29tcGlsZWQgaW4uCisKKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4KK0VPRgorc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworCitlbHNlCisjIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAxOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7CisgIGVsc2UKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKK30KK0VPRgorCitmaQorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCitzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAoreworICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKKyAgIiR7RU1VTEFUSU9OX05BTUV9IiwKKyAgIiR7T1VUUFVUX0ZPUk1BVH0iLAorICAwLAkvKiBmaW5pc2ggKi8KKyAgMCwJLyogY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKi8KKyAgMCwJLyogb3Blbl9keW5hbWljX2FyY2hpdmUgKi8KKyAgMCwJLyogcGxhY2Vfb3JwaGFuICovCisgIDAsCS8qIHNldF9zeW1ib2xzICovCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlCit9OworRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTVmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVsdGVtcGwvYXJtY29mZi5lbQpAQCAtMCwwICsxLDIyNiBAQAorIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCisjIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLworCisvKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKworc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CitzdGF0aWMgaW50ICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUygoaW50LCBjaGFyICoqKSk7CitzdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zIFBBUkFNUyAoKEZJTEUgKikpOworCisvKiBJZiB0cnVlLCB0aGVuIGludGVyd29ya2luZyBzdHVicyB3aGljaCBzdXBwb3J0IGNhbGxzIHRvIG9sZCwgbm9uLWludGVyd29ya2luZworICAgYXdhcmUgQVJNIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCisKK3N0YXRpYyBpbnQgc3VwcG9ydF9vbGRfY29kZSA9IDA7CisKKyNkZWZpbmUgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUJCTMwMAorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KK3sKKyAgeyJzdXBwb3J0LW9sZC1jb2RlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFfSwKKyAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorfTsKKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyAoZmlsZSkKKyAgICAgRklMRSAqIGZpbGU7Cit7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIikpOworfQorCitzdGF0aWMgaW50CitnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQorICAgICBpbnQgICAgIGFyZ2M7CisgICAgIGNoYXIgKiogYXJndjsKK3sKKyAgaW50ICAgICAgICBsb25naW5kOworICBpbnQgICAgICAgIG9wdGM7CisgIGludCAgICAgICAgcHJldm9wdGluZCA9IG9wdGluZDsKKyAgaW50ICAgICAgICBwcmV2b3B0ZXJyID0gb3B0ZXJyOworICBpbnQgICAgICAgIHdhbnRlcnJvcjsKKyAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7CisKKyAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQorICAgIG9wdGVyciA9IDA7CisgIAorICB3YW50ZXJyb3IgID0gb3B0ZXJyOworICBsYXN0b3B0aW5kID0gb3B0aW5kOworCisgIG9wdGMgICA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItIiwgbG9uZ29wdHMsICYgbG9uZ2luZCk7CisgIG9wdGVyciA9IHByZXZvcHRlcnI7CisKKyAgc3dpdGNoIChvcHRjKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHdhbnRlcnJvcikKKwl4ZXhpdCAoMSk7CisgICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERToKKyAgICAgIHN1cHBvcnRfb2xkX2NvZGUgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgcmV0dXJuIDE7Cit9CisMCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCit7CisjaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCisgIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOworI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0CisgICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKK3sKKyAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCisKKyAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCisgIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCisgIHsKKyAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgICB7CisJaWYgKCEgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCisJICAgIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sIHN1cHBvcnRfb2xkX2NvZGUpKQorCSAgeworCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIpLCBpcy0+ZmlsZW5hbWUpOworCSAgfQorICAgICAgfQorICB9CisKKyAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLworICBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOworfQorCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQoreworICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgeworICAgICAgaWYgKGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQorCWJyZWFrOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCAoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK0VPRgorCitpZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKK3RoZW4KKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKworIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCitzYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAwOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybgorRU9GCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCisKK2Vsc2UKKyMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDE7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOworICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOworICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7CisgIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKKyAgZWxzZQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOworfQorRU9GCisKK2ZpCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCit7CisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKKyAgc3lzbGliX2RlZmF1bHQsCisgIGhsbF9kZWZhdWx0LAorICBhZnRlcl9wYXJzZV9kZWZhdWx0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAorICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCisgIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAorICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAorICAiJHtFTVVMQVRJT05fTkFNRX0iLAorICAiJHtPVVRQVVRfRk9STUFUfSIsCisgIE5VTEwsIC8qIGZpbmlzaCAqLworICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLworICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLworICBOVUxMLCAvKiBwbGFjZSBvcnBoYW4gKi8KKyAgTlVMTCwgLyogc2V0X3N5bWJvbHMgKi8KKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKKyAgTlVMTCwgLyogdW5yZWNvZ25pc2VkIGZpbGUgKi8KKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zCit9OworRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtIGIvbGQvZW11bHRlbXBsL2FybWVsZi5lbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQwOWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHRlbXBsL2FybWVsZi5lbQpAQCAtMCwwICsxLDE2OCBAQAorIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCisjIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLworCisvKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKworc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgKCkKK3sKKyNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KKyAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7CisjZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKKyAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQoreworICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViIHNlY3Rpb24gKi8KKworICAvKiBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUgaW5mb3JtYXRpb24gKi8KKyAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lIG9wdGlvbj8ga3JrQGN5Z251cy5jb20gKi8KKyAgeworICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKKyAgICAgIHsKKwlpZiAoIWJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQorCSAgeworCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIpLCBpcy0+ZmlsZW5hbWUpOworCSAgfQorICAgICAgfQorICB9CisKKyAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLworICBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOworfQorCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQoreworCisgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKKyAgICB7CisgICAgICAvKiBUaGUgaW50ZXJ3b3JraW5nIGJmZCBtdXN0IGJlIHRoZSBsYXN0IG9uZSB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgIGlmICghaXMtPm5leHQpCisgICAgICAgICBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgKGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKworaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCit0aGVuCisjIFNjcmlwdHMgY29tcGlsZWQgaW4uCisKKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4KK0VPRgorc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworCitlbHNlCisjIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAxOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7CisgIGVsc2UKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKK30KK0VPRgorCitmaQorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCitzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAoreworICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKKyAgIiR7RU1VTEFUSU9OX05BTUV9IiwKKyAgIiR7T1VUUFVUX0ZPUk1BVH0iLAorICBOVUxMLCAvKiBmaW5pc2ggKi8KKyAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KKyAgTlVMTCwgLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KKyAgTlVMTCwgLyogcGxhY2Ugb3JwaGFuICovCisgIE5VTEwsIC8qIHNldF9zeW1ib2xzICovCisgIE5VTEwsCisgIE5VTEwsIC8qIHVucmVjb2duaXNlZCBmaWxlICovCisgIE5VTEwKK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUyNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtCkBAIC0wLDAgKzEsMTc1IEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCisKKy8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9CisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9CisKKyNkZWZpbmUgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgXAorCWJmZF9lbGYzMl9hcm1fb2FiaV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKKyNkZWZpbmUgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgXAorCWJmZF9lbGYzMl9hcm1fb2FiaV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKKyNkZWZpbmUgYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKKwliZmRfZWxmMzJfYXJtX29hYmlfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImdldG9wdC5oIgorCisjaW5jbHVkZSAibGQuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKworI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCit7CisjaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCisgIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOworI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0CisgICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKK3sKKyAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCisKKyAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCisgIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCisgIHsKKyAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgICB7CisJaWYgKCFiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmbGlua19pbmZvKSkKKwkgIHsKKwkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgICAgZWluZm8gKF8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiKSwgaXMtPmZpbGVuYW1lKTsKKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KKyAgYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKK30KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKK3sKKworICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgeworICAgICAgLyogVGhlIGludGVyd29ya2luZyBiZmQgbXVzdCBiZSB0aGUgbGFzdCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICBpZiAoIWlzLT5uZXh0KQorICAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IChpc2ZpbGUpCisgICAgIGludCAqaXNmaWxlOworRU9GCisKK2lmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgordGhlbgorIyBTY3JpcHRzIGNvbXBpbGVkIGluLgorCisjIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KK3NjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDA7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuCitFT0YKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKKworZWxzZQorIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMTsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOworICBlbHNlCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Cit9CitFT0YKKworZmkKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKK3sKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAorICBzeXNsaWJfZGVmYXVsdCwKKyAgaGxsX2RlZmF1bHQsCisgIGFmdGVyX3BhcnNlX2RlZmF1bHQsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCisgIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKKyAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCisgIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCisgICIke0VNVUxBVElPTl9OQU1FfSIsCisgICIke09VVFBVVF9GT1JNQVR9IiwKKyAgTlVMTCwgLyogZmluaXNoICovCisgIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCisgIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCisgIE5VTEwsIC8qIHBsYWNlIG9ycGhhbiAqLworICBOVUxMLCAvKiBzZXRfc3ltYm9scyAqLworICBOVUxMLAorICBOVUxMLCAvKiB1bnJlY29nbmlzZWQgZmlsZSAqLworICBOVUxMCit9OworRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYmVvcy5lbSBiL2xkL2VtdWx0ZW1wbC9iZW9zLmVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVsdGVtcGwvYmVvcy5lbQpAQCAtMCwwICsxLDgzNyBAQAorIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCisjIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKyAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZvciBXSU5ET1dTX05UICovCisvKiBUaGUgb3JpZ2luYWwgZmlsZSBnZW5lcmF0ZWQgcmV0dXJuZWQgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cyBkZXBlbmRpbmcKKyAgIG9uIHdoZXRoZXIgY2VydGFpbiBzd2l0Y2hlcyB3ZXJlIHNldCwgYnV0IHRoZXNlIHN3aXRjaGVzIHBlcnRhaW4gdG8gdGhlCisgICBMaW51eCBzeXN0ZW0gYW5kIHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIG9mIGNvZmYuICBJbiB0aGUgTlQgY2FzZSwgd2UKKyAgIG9ubHkgZGV0ZXJtaW5lIGlmIHRoZSBzdWJzeXN0ZW0gaXMgY29uc29sZSBvciB3aW5kb3dzIGluIG9yZGVyIHRvIHNlbGVjdAorICAgdGhlIGNvcnJlY3QgZW50cnkgcG9pbnQgYnkgZGVmYXVsdC4gKi8gCisgIAorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZ3JhbS5oIgorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRsZXguaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZGN0b3IuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKKworI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KKworc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgorICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyBjaGFyICpnbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKikpOworc3RhdGljIGludCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKKworI2lmIDAgLyogYXJndW1lbnQgdG8gcXNvcnQgc28gZG9uJ3QgcHJvdG90eXBlICovCitzdGF0aWMgaW50IHNvcnRfYnlfZmlsZV9uYW1lIFBBUkFNUyAoKHZvaWQgKiwgdm9pZCAqKSk7CitzdGF0aWMgaW50IHNvcnRfYnlfc2VjdGlvbl9uYW1lIFBBUkFNUyAoKHZvaWQgKiwgdm9pZCAqKSk7CisjZW5kaWYKK3N0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqc29ydF9zZWN0aW9uc18xCisgIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiosIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiwgaW50LAorCSAgIGludCAoKikoKSkpOworc3RhdGljIHZvaWQgc29ydF9zZWN0aW9ucyBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKKworc3RhdGljIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIHBlOworc3RhdGljIGludCBkbGw7CisKK2V4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7CisKK3N0YXRpYyB2b2lkCitnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKK3sKKyAgb3V0cHV0X2ZpbGVuYW1lID0gImEuZXhlIjsKKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OworfQorDAorLyogUEUgZm9ybWF0IGV4dHJhIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgKi8KKworLyogVXNlZCBmb3Igc2V0dGluZyBmbGFncyBpbiB0aGUgUEUgaGVhZGVyLiAqLworI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCQkoMzAwICArIDEpCisjZGVmaW5lIE9QVElPTl9ETEwJCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCisjZGVmaW5lIE9QVElPTl9GSUxFX0FMSUdOTUVOVAkJKE9QVElPTl9ETEwgKyAxKQorI2RlZmluZSBPUFRJT05fSU1BR0VfQkFTRQkJKE9QVElPTl9GSUxFX0FMSUdOTUVOVCArIDEpCisjZGVmaW5lIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fSU1BR0VfQkFTRSArIDEpCisjZGVmaW5lIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OCQkoT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04gKyAxKQorI2RlZmluZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9PU19WRVJTSU9OICsgMSkKKyNkZWZpbmUgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCisjZGVmaW5lIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OCQkoT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04gKyAxKQorI2RlZmluZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NSU5PUl9PU19WRVJTSU9OICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UCShPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQorI2RlZmluZSBPUFRJT05fU1RBQ0sgICAgICAgICAgICAgICAgICAgIChPUFRJT05fU0VDVElPTl9BTElHTk1FTlQgKyAxKQorI2RlZmluZSBPUFRJT05fU1VCU1lTVEVNICAgICAgICAgICAgICAgIChPUFRJT05fU1RBQ0sgKyAxKQorI2RlZmluZSBPUFRJT05fSEVBUAkJCShPUFRJT05fU1VCU1lTVEVNICsgMSkKKworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKKyAgLyogUEUgb3B0aW9ucyAqLworICAgIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAorICAgIHsiZGxsIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ETEx9LAorICAgIHsiZmlsZS1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJTEVfQUxJR05NRU5UfSwKKyAgICB7ImhlYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hFQVB9LCAKKyAgICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LCAKKyAgICB7Im1ham9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT059LAorICAgIHsibWFqb3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTn0sCisgICAgeyJtYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT059LAorICAgIHsibWlub3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTn0sCisgICAgeyJtaW5vci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OfSwKKyAgICB7Im1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTn0sCisgICAgeyJzZWN0aW9uLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0VDVElPTl9BTElHTk1FTlR9LAorICAgIHsic3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQUNLfSwKKyAgICB7InN1YnN5c3RlbSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VCU1lTVEVNfSwKKyAgIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KKyAgfTsKKworCisvKiBQRS9XSU4zMjsgYWRkZWQgcm91dGluZXMgdG8gZ2V0IHRoZSBzdWJzeXN0ZW0gdHlwZSwgaGVhcCBhbmQvb3Igc3RhY2sKKyAgIHBhcmFtZXRlcnMgd2hpY2ggbWF5IGJlIGlucHV0IGZyb20gdGhlIGNvbW1hbmQgbGluZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQgKnB0cjsKKyAgaW50IHNpemU7CisgIGludCB2YWx1ZTsKKyAgY2hhciAqc3ltYm9sOworICBpbnQgaW5pdGVkOworfSBkZWZpbmZvOworCisjZGVmaW5lIEQoZmllbGQsc3ltYm9sLGRlZikgIHsmcGUuZmllbGQsc2l6ZW9mKHBlLmZpZWxkKSwgZGVmLCBzeW1ib2wsMH0KKworc3RhdGljIGRlZmluZm8gaW5pdFtdID0KK3sKKyAgLyogaW1hZ2ViYXNlIG11c3QgYmUgZmlyc3QgKi8KKyNkZWZpbmUgSU1BR0VCQVNFT0ZGIDAKKyAgRChJbWFnZUJhc2UsIl9faW1hZ2VfYmFzZV9fIiwgQkVPU19FWEVfSU1BR0VfQkFTRSksCisjZGVmaW5lIERMTE9GRiAxCisgIHsmZGxsLCBzaXplb2YoZGxsKSwgMCwgIl9fZGxsX18ifSwKKyAgRChTZWN0aW9uQWxpZ25tZW50LCJfX3NlY3Rpb25fYWxpZ25tZW50X18iLCBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQpLAorICBEKEZpbGVBbGlnbm1lbnQsIl9fZmlsZV9hbGlnbm1lbnRfXyIsIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCksCisgIEQoTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21ham9yX29zX3ZlcnNpb25fXyIsIDQpLAorICBEKE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19taW5vcl9vc192ZXJzaW9uX18iLCAwKSwKKyAgRChNYWpvckltYWdlVmVyc2lvbiwiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iLCAxKSwKKyAgRChNaW5vckltYWdlVmVyc2lvbiwiX19taW5vcl9pbWFnZV92ZXJzaW9uX18iLCAwKSwKKyAgRChNYWpvclN1YnN5c3RlbVZlcnNpb24sIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDQpLAorICBEKE1pbm9yU3Vic3lzdGVtVmVyc2lvbiwiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgMCksCisgIEQoU3Vic3lzdGVtLCJfX3N1YnN5c3RlbV9fIiwgMyksCisgIEQoU2l6ZU9mU3RhY2tSZXNlcnZlLCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgMHgyMDAwMDAwKSwKKyAgRChTaXplT2ZTdGFja0NvbW1pdCwiX19zaXplX29mX3N0YWNrX2NvbW1pdF9fIiwgMHgxMDAwKSwKKyAgRChTaXplT2ZIZWFwUmVzZXJ2ZSwiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIiwgMHgxMDAwMDApLAorICBEKFNpemVPZkhlYXBDb21taXQsIl9fc2l6ZV9vZl9oZWFwX2NvbW1pdF9fIiwgMHgxMDAwKSwKKyAgRChMb2FkZXJGbGFncywiX19sb2FkZXJfZmxhZ3NfXyIsIDB4MCksCisgIHsgTlVMTCwgMCwgMCwgTlVMTCwgMCB9Cit9OworCisKK3N0YXRpYyB2b2lkCitzZXRfcGVfbmFtZSAobmFtZSwgdmFsKQorICAgICBjaGFyICpuYW1lOworICAgICBsb25nIHZhbDsKK3sKKyAgaW50IGk7CisgIC8qIEZpbmQgdGhlIG5hbWUgYW5kIHNldCBpdC4gKi8KKyAgZm9yIChpID0gMDsgaW5pdFtpXS5wdHI7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChuYW1lLCBpbml0W2ldLnN5bWJvbCkgPT0gMCkKKwl7CisJICBpbml0W2ldLnZhbHVlID0gdmFsOworCSAgaW5pdFtpXS5pbml0ZWQgPSAxOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGFib3J0KCk7Cit9CisKKworc3RhdGljIHZvaWQKK3NldF9wZV9zdWJzeXN0ZW0gKCkKK3sKKyAgY29uc3QgY2hhciAqc3ZlcjsKKyAgaW50IGxlbjsKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgCisgICAgeworICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgIGNvbnN0IGludCB2YWx1ZTsKKyAgICAgIGNvbnN0IGNoYXIgKmVudHJ5OworICAgIH0KKyAgdltdID0KKyAgICB7CisgICAgICB7ICJuYXRpdmUiLCAxLCAiX050UHJvY2Vzc1N0YXJ0dXAiIH0sCisgICAgICB7ICJ3aW5kb3dzIiwgMiwgIl9XaW5NYWluQ1JUU3RhcnR1cCIgfSwKKyAgICAgIHsgInd3aW5kb3dzIiwgMiwgIl93V2luTWFpbkNSVFN0YXJ0dXAiIH0sCisgICAgICB7ICJjb25zb2xlIiwgMywgIl9tYWluQ1JUU3RhcnR1cCIgfSwKKyAgICAgIHsgIndjb25zb2xlIiwgMywgIl93bWFpbkNSVFN0YXJ0dXAiIH0sCisjaWYgMAorICAgICAgLyogVGhlIE1pY3Jvc29mdCBsaW5rZXIgZG9lcyBub3QgcmVjb2duaXplIHRoaXMuICAqLworICAgICAgeyAib3MyIiwgNSwgIiIgfSwKKyNlbmRpZgorICAgICAgeyAicG9zaXgiLCA3LCAiX19fUG9zaXhQcm9jZXNzU3RhcnR1cCJ9LAorICAgICAgeyAwLCAwLCAwIH0KKyAgICB9OworCisgIHN2ZXIgPSBzdHJjaHIgKG9wdGFyZywgJzonKTsKKyAgaWYgKHN2ZXIgPT0gTlVMTCkKKyAgICBsZW4gPSBzdHJsZW4gKG9wdGFyZyk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICplbmQ7CisKKyAgICAgIGxlbiA9IHN2ZXIgLSBvcHRhcmc7CisgICAgICBzZXRfcGVfbmFtZSAoIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCisJCSAgIHN0cnRvdWwgKHN2ZXIgKyAxLCAmZW5kLCAwKSk7CisgICAgICBpZiAoKmVuZCA9PSAnLicpCisJc2V0X3BlX25hbWUgKCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLAorCQkgICAgIHN0cnRvdWwgKGVuZCArIDEsICZlbmQsIDApKTsKKyAgICAgIGlmICgqZW5kICE9ICdcMCcpCisJZWluZm8gKCIlUDogd2FybmluZzogYmFkIHZlcnNpb24gbnVtYmVyIGluIC1zdWJzeXN0ZW0gb3B0aW9uXG4iKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgdltpXS5uYW1lOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKG9wdGFyZywgdltpXS5uYW1lLCBsZW4pID09IDAKKwkgICYmIHZbaV0ubmFtZVtsZW5dID09ICdcMCcpCisJeworCSAgc2V0X3BlX25hbWUgKCJfX3N1YnN5c3RlbV9fIiwgdltpXS52YWx1ZSk7CisKKwkgIC8qIElmIHRoZSBzdWJzeXN0ZW0gaXMgd2luZG93cywgd2UgdXNlIGEgZGlmZmVyZW50IGVudHJ5CisJICAgICBwb2ludC4gIFdlIGFsc28gcmVnaXN0ZXIgdGhlIGVudHJ5IHBvaW50IGFzIGFuIHVuZGVmaW5lZAorCSAgICAgc3ltYm9sLiBmcm9tIGxhbmdfYWRkX2VudHJ5KCkgVGhlIHJlYXNvbiB3ZSBkbworCSAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSB1c2VyCisJICAgICBkb2Vzbid0IGhhdmUgdG8gYmVjYXVzZSB0aGV5IHdvdWxkIGhhdmUgdG8gdXNlIHRoZSAtdQorCSAgICAgc3dpdGNoIGlmIHRoZXkgd2VyZSBzcGVjaWZ5aW5nIGFuIGVudHJ5IHBvaW50IG90aGVyIHRoYW4KKwkgICAgIF9tYWluQ1JUU3RhcnR1cC4gIFNwZWNpZmljYWxseSwgaWYgY3JlYXRpbmcgYSB3aW5kb3dzCisJICAgICBhcHBsaWNhdGlvbiwgZW50cnkgcG9pbnQgX1dpbk1haW5DUlRTdGFydHVwIG11c3QgYmUKKwkgICAgIHNwZWNpZmllZC4gIFdoYXQgSSBoYXZlIGZvdW5kIGZvciBub24gY29uc29sZQorCSAgICAgYXBwbGljYXRpb25zIChlbnRyeSBub3QgX21haW5DUlRTdGFydHVwKSBpcyB0aGF0IHRoZSAub2JqCisJICAgICB0aGF0IGNvbnRhaW5zIG1haW5DUlRTdGFydHVwIGlzIGJyb3VnaHQgaW4gc2luY2UgaXQgaXMKKwkgICAgIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBpbiBsaWJjLmxpYiBhbmQgaXQgaGFzIG90aGVyCisJICAgICBzeW1ib2xzIGluIGl0IHdoaWNoIHdpbGwgYmUgcHVsbGVkIGluIGJ5IHRoZSBsaW5rCisJICAgICBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgYWRkaW5nIC11IHdpdGggdGhlIGVudHJ5IHBvaW50CisJICAgICBuYW1lIHNwZWNpZmllZCBmb3JjZXMgdGhlIGNvcnJlY3QgLm9iaiB0byBiZSB1c2VkLiAgV2UKKwkgICAgIGNhbiBhdm9pZCBtYWtpbmcgdGhlIHVzZXIgZG8gdGhpcyBieSBhbHdheXMgYWRkaW5nIHRoZQorCSAgICAgZW50cnkgcG9pbnQgbmFtZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLiAgKi8KKwkgIGxhbmdfYWRkX2VudHJ5ICh2W2ldLmVudHJ5LCAxKTsKKworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVpbmZvICgiJVAlRjogaW52YWxpZCBzdWJzeXN0ZW0gdHlwZSAlc1xuIiwgb3B0YXJnKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitzZXRfcGVfdmFsdWUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIAoreworICBjaGFyICplbmQ7CisgIHNldF9wZV9uYW1lIChuYW1lLCAgc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKSk7CisgIGlmIChlbmQgPT0gb3B0YXJnKQorICAgIHsKKyAgICAgIGVpbmZvICgiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiwgb3B0YXJnKTsKKyAgICB9CisKKyAgb3B0YXJnID0gZW5kOworfQorCitzdGF0aWMgdm9pZAorc2V0X3BlX3N0YWNrX2hlYXAgKHJlc25hbWUsIGNvbW5hbWUpCisgICAgIGNoYXIgKnJlc25hbWU7CisgICAgIGNoYXIgKmNvbW5hbWU7Cit7CisgIHNldF9wZV92YWx1ZSAocmVzbmFtZSk7CisgIGlmICgqb3B0YXJnID09ICcsJykKKyAgICB7CisgICAgICBvcHRhcmcrKzsKKyAgICAgIHNldF9wZV92YWx1ZSAoY29tbmFtZSk7CisgICAgfQorICBlbHNlIGlmICgqb3B0YXJnKQorICAgIHsKKyAgICAgIGVpbmZvICgiJVAlRjogc3RyYW5nZSBoZXggaW5mbyBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIsIG9wdGFyZyk7CisgICAgfQorfQorCisKKworc3RhdGljIGludAorZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgbG9uZ2luZDsKKyAgaW50IG9wdGM7CisgIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOworICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKKyAgaW50IHdhbnRlcnJvcjsKKyAgc3RhdGljIGludCBsYXN0b3B0aW5kID0gLTE7CisKKyAgaWYgKGxhc3RvcHRpbmQgIT0gb3B0aW5kKQorICAgIG9wdGVyciA9IDA7CisgIHdhbnRlcnJvciA9IG9wdGVycjsKKworICBsYXN0b3B0aW5kID0gb3B0aW5kOworCisgIG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChhcmdjLCBhcmd2LCAiLSIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7CisgIG9wdGVyciA9IHByZXZvcHRlcnI7CisKKyAgc3dpdGNoIChvcHRjKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHdhbnRlcnJvcikKKwl4ZXhpdCAoMSk7CisgICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBPUFRJT05fQkFTRV9GSUxFOgorICAgICAgbGlua19pbmZvLmJhc2VfZmlsZSA9IChQVFIpIGZvcGVuIChvcHRhcmcsIEZPUEVOX1dCKTsKKyAgICAgIGlmIChsaW5rX2luZm8uYmFzZV9maWxlID09IE5VTEwpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iLAorCQkgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7CisJICB4ZXhpdCAoMSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFBFIG9wdGlvbnMgKi8KKyAgICBjYXNlIE9QVElPTl9IRUFQOiAKKyAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIiwgIl9fc2l6ZV9vZl9oZWFwX2NvbW1pdF9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9TVEFDSzogCisgICAgICBzZXRfcGVfc3RhY2tfaGVhcCAoIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAiX19zaXplX29mX3N0YWNrX2NvbW1pdF9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9TVUJTWVNURU06CisgICAgICBzZXRfcGVfc3Vic3lzdGVtICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTjoKKyAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9vc192ZXJzaW9uX18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTjoKKyAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTjoKKyAgICAgIHNldF9wZV92YWx1ZSAoIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9pbWFnZV92ZXJzaW9uX18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX0ZJTEVfQUxJR05NRU5UOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19maWxlX2FsaWdubWVudF9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVDoKKyAgICAgIHNldF9wZV92YWx1ZSAoIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fRExMOgorICAgICAgc2V0X3BlX25hbWUgKCJfX2RsbF9fIiwgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9JTUFHRV9CQVNFOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19pbWFnZV9iYXNlX18iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisMCisvKiBBc3NpZ24gdmFsdWVzIHRvIHRoZSBzcGVjaWFsIHN5bWJvbHMgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGlzCisgICByZWFkLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scygpCit7CisgIC8qIFJ1biB0aHJvdWdoIGFuZCBpbnZlbnQgc3ltYm9scyBmb3IgYWxsIHRoZQorICAgICBuYW1lcyBhbmQgaW5zZXJ0IHRoZSBkZWZhdWx0cy4gKi8KKyAgaW50IGo7CisgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc2F2ZTsKKworICBpZiAoIWluaXRbSU1BR0VCQVNFT0ZGXS5pbml0ZWQpCisgICAgeworICAgICAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisJaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gMDsKKyAgICAgIGVsc2UgaWYgKGluaXRbRExMT0ZGXS52YWx1ZSkKKwlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSBCRU9TX0RMTF9JTUFHRV9CQVNFOworICAgICAgZWxzZQorCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IEJFT1NfRVhFX0lNQUdFX0JBU0U7CisgICAgfQorCisgIC8qIERvbid0IGRvIGFueSBzeW1ib2wgYXNzaWdubWVudHMgaWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuOworCisgIC8qIEdsdWUgdGhlIGFzc2lnbm1lbnRzIGludG8gdGhlIGFicyBzZWN0aW9uICovCisgIHNhdmUgPSBzdGF0X3B0cjsKKworICBzdGF0X3B0ciA9ICYoYWJzX291dHB1dF9zZWN0aW9uLT5jaGlsZHJlbik7CisKKyAgZm9yIChqID0gMDsgaW5pdFtqXS5wdHI7IGorKykKKyAgICB7CisgICAgICBsb25nIHZhbCA9IGluaXRbal0udmFsdWU7CisgICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JyAsaW5pdFtqXS5zeW1ib2wsIGV4cF9pbnRvcCAodmFsKSkpOworICAgICAgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKQorCSooc2hvcnQgKilpbml0W2pdLnB0ciA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoaW50KSkKKwkqKGludCAqKWluaXRbal0ucHRyID0gdmFsOworICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihsb25nKSkKKwkqKGxvbmcgKilpbml0W2pdLnB0ciA9IHZhbDsKKyAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBsb25nIGxvbmcgb3Igb3RoZXIgc3BlY2lhbCB0eXBlLiAgKi8KKyAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoYmZkX3ZtYSkpCisJKihiZmRfdm1hICopaW5pdFtqXS5wdHIgPSB2YWw7CisgICAgICBlbHNlCWFib3J0KCk7CisgICAgfQorICAvKiBSZXN0b3JlIHRoZSBwb2ludGVyLiAqLworICBzdGF0X3B0ciA9IHNhdmU7CisgIAorICBpZiAocGUuRmlsZUFsaWdubWVudCA+CisgICAgICBwZS5TZWN0aW9uQWxpZ25tZW50KQorICAgIHsKKyAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmcsIGZpbGUgYWxpZ25tZW50ID4gc2VjdGlvbiBhbGlnbm1lbnQuXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbigpCit7CisgIC8qIFBhc3MgdGhlIHdhY2t5IFBFIGNvbW1hbmQgbGluZSBvcHRpb25zIGludG8gdGhlIG91dHB1dCBiZmQuCisgICAgIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBkb25lIHZpYSBhIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBieQorICAgICBpbmNsdWRpbmcgYW4gaW50ZXJuYWwgQkZEIGhlYWRlci4gICovCisgIGlmICghY29mZl9kYXRhKG91dHB1dF9iZmQpLT5wZSkKKyAgICB7CisgICAgICBlaW5mbyAoIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iKTsKKyAgICB9CisKKyAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyID0gcGU7CisgIHBlX2RhdGEob3V0cHV0X2JmZCktPmRsbCA9IGluaXRbRExMT0ZGXS52YWx1ZTsKKworfQorDAorLyogQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBxc29ydCBpbiBzb3J0X3NlY3Rpb25zLiAqLworCitzdGF0aWMgaW50Citzb3J0X2J5X2ZpbGVfbmFtZSAoYSwgYikKKyAgICAgdm9pZCAqYTsKKyAgICAgdm9pZCAqYjsKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJhID0gYTsKKyAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnJiID0gYjsKKyAgaW50IGksIGFfc2VjLCBiX3NlYzsKKworICBpID0gc3RyY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZC0+bXlfYXJjaGl2ZS0+ZmlsZW5hbWUsCisJICAgICAgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lKTsKKyAgaWYgKGkgIT0gMCkKKyAgICByZXR1cm4gaTsKKworICBpID0gc3RyY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+ZmlsZW5hbWUsCisJCSAoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+ZmlsZW5hbWUpOworICBpZiAoaSAhPSAwKQorICAgIHJldHVybiBpOworICAvKiB0aGUgdGFpbCBpZGF0YTQvNSBhcmUgdGhlIG9ubHkgb25lcyB3aXRob3V0IHJlbG9jcyB0byBhbgorICAgICBpZGF0YSQ2IHNlY3Rpb24gdW5sZXNzIHdlIGFyZSBpbXBvcnRpbmcgYnkgb3JkaW5hbCwgCisgICAgIHNvIHNvcnQgdGhlbSB0byBsYXN0IHRvIHRlcm1pbmF0ZSB0aGUgSUFUCisgICAgIGFuZCBITlQgcHJvcGVybHkuIGlmIG5vIHJlbG9jIHRoaXMgb25lIGlzIGltcG9ydCBieSBvcmRpbmFsCisgICAgIHNvIHdlIGhhdmUgdG8gc29ydCBieSBzZWN0aW9uIGNvbnRlbnRzICovCisKKyAgaWYgKCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQgKyAoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCkgKQorICAgIHsKKyAgICAgICBpID0gICgoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQgPiAKKwkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50KSA/IC0xIDogMCk7CisgICAgICAgaWYgKCBpICE9IDApCisgICAgICAgICByZXR1cm4gaTsKKworICAgICAgICByZXR1cm4gICgoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQgPiAKKwkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50KSA/IDAgOiAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAgaWYgKCAoc3RyY21wKCAoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDYiKSA9PSAwKSApCisgICAgICAgICAgcmV0dXJuIDA7IC8qIGRvbid0IHNvcnQgLmlkYXRhJDYgb3IgLmlkYXRhJDcgRklYTUUgZGxsdG9vbCBlbGltaW5hdGUgLmlkYXRhJDcgKi8KKworICAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQsIAorICAgICAgICAgKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiwgJmFfc2VjLCAoZmlsZV9wdHIpIDAsIChiZmRfc2l6ZV90eXBlKXNpemVvZihhX3NlYykpKQorICAgICAgICAgICAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmlkYXRhOiAlRVxuIiwKKyAgICAgICAgICAgICAgICAgKCpyYSktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQpOworCisgICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICgoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCwgCisgICAgICAgICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24sICZiX3NlYywgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSlzaXplb2YoYl9zZWMpICkpCisgICAgICAgICAgIGVpbmZvICgiJUYlQjogQ2FuJ3QgcmVhZCBjb250ZW50cyBvZiBzZWN0aW9uIC5pZGF0YTogJUVcbiIsCisgICAgICAgICAgICAgICAgKCpyYiktPmlucHV0X3NlY3Rpb24uaWZpbGUtPnRoZV9iZmQpOworCisgICAgICBpID0gICgoYV9zZWMgPCBiX3NlYykgPyAtMSA6IDApOworICAgICAgaWYgKCBpICE9IDApCisgICAgICAgIHJldHVybiBpOworICAgICAgcmV0dXJuICAoKGFfc2VjIDwgYl9zZWMpID8gMCA6IDEpOworICAgfQorcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NvcnRfYnlfc2VjdGlvbl9uYW1lIChhLCBiKQorICAgICB2b2lkICphOworICAgICB2b2lkICpiOworeworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmEgPSBhOworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmIgPSBiOworICBpbnQgaTsKKyAgaSA9IHN0cmNtcCAoKCpyYSktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwKKwkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUpOworLyogdGhpcyBpcyBhIGhhY2sgdG8gbWFrZSAuc3RhYiBhbmQgLnN0YWJzdHIgbGFzdCwgc28gd2UgZG9uJ3QgaGF2ZQorICAgdG8gZml4IHN0cmlwL29iamNvcHkgZm9yIC5yZWxvYyBzZWN0aW9ucy4KKyAgIEZJWE1FIHN0cmlwcGluZyBpbWFnZXMgd2l0aCBhIC5yc3JjIHNlY3Rpb24gc3RpbGwgbmVlZHMgdG8gYmUgZml4ZWQgKi8KKyAgaWYgKCBpICE9IDApCisgICAgeworICAgICAgaWYgKChzdHJuY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLCAiLnN0YWIiLCA1KSA9PSAwKQorICAgICAgICAgICAmJiAoc3RybmNtcCAoKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgIT0gMCkpCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgcmV0dXJuIGk7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2Ygc29ydF9zZWN0aW9ucyB0byBhIGNvbnRpZ3VvdXMgc3Vic2V0IG9mIGEgbGlzdCBvZiBzZWN0aW9ucy4KKyAgIE5FWFRfQUZURVIgaXMgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3Qgb25lIHRvIHNvcnQuCisgICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbGFzdCBlbGVtZW50J3MgIm5leHQiIHBvaW50ZXIuICAqLworCitzdGF0aWMgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKgorc29ydF9zZWN0aW9uc18xIChzdGFydHB0ciwgbmV4dF9hZnRlciwgY291bnQsIHNvcnRfZnVuYykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnN0YXJ0cHRyLCpuZXh0X2FmdGVyOworICAgICBpbnQgY291bnQ7CisgICAgIGludCAoKnNvcnRfZnVuYykgKCk7Cit7CisgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip2ZWM7CisgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnA7CisgIGludCBpOworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmV0OworCisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiBzdGFydHB0cjsKKworICB2ZWMgPSAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiopCisJIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKSk7CisKKyAgZm9yIChwID0gKnN0YXJ0cHRyLCBpID0gMDsgaSA8IGNvdW50OyBpKyssIHAgPSBwLT5uZXh0KQorICAgIHZlY1tpXSA9IHA7CisKKyAgcXNvcnQgKHZlYywgY291bnQsIHNpemVvZiAodmVjWzBdKSwgc29ydF9mdW5jKTsKKworICAvKiBGaWxsIGluIHRoZSBuZXh0IHBvaW50ZXJzIGFnYWluLiAqLworICAqc3RhcnRwdHIgPSB2ZWNbMF07CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykKKyAgICB2ZWNbaV0tPmhlYWRlci5uZXh0ID0gdmVjW2kgKyAxXTsKKyAgdmVjW2ldLT5oZWFkZXIubmV4dCA9IG5leHRfYWZ0ZXI7CisgIHJldCA9ICZ2ZWNbaV0tPmhlYWRlci5uZXh0OworICBmcmVlICh2ZWMpOworICByZXR1cm4gcmV0OworfQorCisvKiBTb3J0IHRoZSAuaWRhdGFcJGZvbyBpbnB1dCBzZWN0aW9ucyBvZiBhcmNoaXZlcyBpbnRvIGZpbGVuYW1lIG9yZGVyLgorICAgVGhlIHJlYXNvbiBpcyBzbyBkbGx0b29sIGNhbiBhcnJhbmdlIHRvIGhhdmUgdGhlIHBlIGRsbCBpbXBvcnQgaW5mb3JtYXRpb24KKyAgIGdlbmVyYXRlZCBjb3JyZWN0bHkgLSB0aGUgaGVhZCBvZiB0aGUgbGlzdCBnb2VzIGludG8gZGgubywgdGhlIHRhaWwgaW50bworICAgZHQubywgYW5kIHRoZSBndXRzIGludG8gZHNbbm5ubl0uby4gIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUKKyAgIC5pZGF0YSBzZWN0aW9uLgorICAgRklYTUU6IFRoaXMgbWF5IG5vIGxvbmdlciBiZSBuZWNlc3Nhcnkgd2l0aCBncm91cGVkIHNlY3Rpb25zLiAgSW5zdGVhZCBvZgorICAgc29ydGluZyBvbiBkaC5vLCBkc1tubm5uXS5vLCBkdC5vLCBvbmUgY291bGQsIGZvciBleGFtcGxlLCBoYXZlIGRoLm8gdXNlCisgICAuaWRhdGFcJDRoLCBoYXZlIGRzW25ubm5dLm8gdXNlIC5pZGF0YVwkNHNbbm5ubl0sIGFuZCBoYXZlIGR0Lm8gdXNlIC5pZGF0YVwkNHQuCisgICBUaGlzIHdvdWxkIGhhdmUgdG8gYmUgZWxhYm9yYXRlZCB1cG9uIHRvIGhhbmRsZSBtdWx0aXBsZSBkbGwncworICAgW2Fzc3VtaW5nIHN1Y2ggYW4gZWxvYm9yYXRpb24gaXMgcG9zc2libGUgb2YgY291cnNlXS4KKworICAgV2UgYWxzbyBzb3J0IHNlY3Rpb25zIGluICdcJCcgd2lsZCBzdGF0ZW1lbnRzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgdGhlCisgICBwbGFjZV9vcnBoYW5zIHJvdXRpbmUgdG8gaW1wbGVtZW50IGdyb3VwZWQgc2VjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorc29ydF9zZWN0aW9ucyAocykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKK3sKKyAgZm9yICg7IHMgOyBzID0gcy0+bmV4dCkKKyAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQorICAgICAgeworICAgICAgY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgorCXNvcnRfc2VjdGlvbnMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKKwlicmVhazsKKyAgICAgIGNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgorCXsKKwkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwID0gJnMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQ7CisKKwkgIC8qIElzIHRoaXMgdGhlIC5pZGF0YSBzZWN0aW9uPyAgKi8KKwkgIGlmIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUgIT0gTlVMTAorCSAgICAgICYmIHN0cm5jbXAgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgIi5pZGF0YSIsIDYpID09IDApCisJICAgIHsKKwkgICAgICAvKiBTb3J0IHRoZSBjaGlsZHJlbi4gIFdlIHdhbnQgdG8gc29ydCBhbnkgb2JqZWN0cyBpbgorICAgICAgICAgICAgICAgICB0aGUgc2FtZSBhcmNoaXZlLiAgSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBjYXNlIG9mCisgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBhIHNpbmdsZSBhcmNoaXZlIG11bHRpcGxlIHRpbWVzLCB3ZSBzb3J0CisgICAgICAgICAgICAgICAgIGFsbCB0aGUgY2hpbGRyZW4gYnkgYXJjaGl2ZSBuYW1lIGFuZCB0aGVuIGJ5IG9iamVjdAorICAgICAgICAgICAgICAgICBuYW1lLiAgQWZ0ZXIgc29ydGluZyB0aGVtLCB3ZSByZS10aHJlYWQgdGhlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgY2hhaW4uICAqLworCisJICAgICAgd2hpbGUgKCpwKQorCQl7CisJCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhcnQgPSAqcDsKKwkJICBpZiAoc3RhcnQtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCisJCSAgICAgIHx8ICFzdGFydC0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZC0+bXlfYXJjaGl2ZSkKKwkJICAgIHAgPSAmKHN0YXJ0LT5oZWFkZXIubmV4dCk7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICplbmQ7CisJCSAgICAgIGludCBjb3VudDsKKworCQkgICAgICBmb3IgKGVuZCA9IHN0YXJ0LCBjb3VudCA9IDA7CisJCQkgICBlbmQgJiYgZW5kLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bTsKKwkJCSAgIGVuZCA9IGVuZC0+bmV4dCkKKwkJCWNvdW50Kys7CisKKwkJICAgICAgcCA9IHNvcnRfc2VjdGlvbnNfMSAocCwgZW5kLCBjb3VudCwgc29ydF9ieV9maWxlX25hbWUpOworCQkgICAgfQorCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogSWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgZ3JvdXBlZCBzZWN0aW9ucywgc29ydCB0aGVtLgorCSAgICAgVGhlIGxpbmtlciBzY3JpcHQgbXVzdCBleHBsaWNpdGx5IG1lbnRpb24gIiooLmZvb1wkKSIgb3IKKwkgICAgICIqKC5mb29cJCopIi4gIERvbid0IHNvcnQgdGhlbSBpZiBcJCBpcyBub3QgdGhlIGxhc3QKKwkgICAgIGNoYXJhY3RlciAobm90IHN1cmUgaWYgdGhpcyBpcyByZWFsbHkgdXNlZnVsLCBidXQgaXQKKwkgICAgIGFsbG93cyBleHBsaWNpdGx5IG1lbnRpb25pbmcgc29tZSBcJCBzZWN0aW9ucyBhbmQgbGV0dGluZworCSAgICAgdGhlIGxpbmtlciBoYW5kbGUgdGhlIHJlc3QpLiAgKi8KKwkgIGlmIChzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNoYXIgKnEgPSBzdHJjaHIgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwgJ1wkJyk7CisKKwkgICAgICBpZiAocSAhPSBOVUxMCisJCSAgJiYgKHFbMV0gPT0gJ1wwJworCQkgICAgICB8fCAocVsxXSA9PSAnKicgJiYgcVsyXSA9PSAnXDAnKSkpCisJCXsKKwkJICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICplbmQ7CisJCSAgaW50IGNvdW50OworCisJCSAgZm9yIChlbmQgPSAqcCwgY291bnQgPSAwOyBlbmQ7IGVuZCA9IGVuZC0+bmV4dCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGVuZC0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCisJCQlhYm9ydCAoKTsKKwkJICAgICAgY291bnQrKzsKKwkJICAgIH0KKwkJICAodm9pZCkgc29ydF9zZWN0aW9uc18xIChwLCBlbmQsIGNvdW50LCBzb3J0X2J5X3NlY3Rpb25fbmFtZSk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkICAKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCit7CisgIGV4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyOworCisjaWZkZWYgVEFSR0VUX0lTX3BwY3BlCisgIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCisgIHsKKyAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgICB7CisJaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbihpcy0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCisJICB7CisJICAgIGVpbmZvKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzXG4iLCBpcy0+ZmlsZW5hbWUpOworCSAgfQorICAgICAgfQorICB9CisKKyAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLworICBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gKCZsaW5rX2luZm8pOworI2Vsc2UKKyNpZmRlZiBUQVJHRVRfSVNfYXJtcGUKKyAgLyogRklYTUU6IHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIKKyAgICAgc2VjdGlvbi4KKworICAgICBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUKKyAgICAgaW5mb3JtYXRpb24uICBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUKKyAgICAgb3B0aW9uPyAga3JrQGN5Z251cy5jb20gKi8KKyAgeworICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKKyAgICAgIHsKKwlpZiAoIWFybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQorCSAgeworCSAgICBlaW5mbyAoIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiLCBpcy0+ZmlsZW5hbWUpOworCSAgfQorICAgICAgfQorICB9CisKKyAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLworICBhcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7CisjZW5kaWYgLyogVEFSR0VUX0lTX2FybXBlICovCisjZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCisKKyAgc29ydF9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQpOworfQorDAorLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgc2VjdGlvbnMgd2l0aCBhICdcJCcgaW4gdGhlbQorICAgaW50byB0aGUgcmlnaHQgcGxhY2UuICBBbnkgc2VjdGlvbiB3aXRoIGEgJ1wkJyBpbiB0aGVtIChlLmcuIC50ZXh0XCRmb28pCisgICBnZXRzIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb24gd2l0aCBldmVyeXRoaW5nIGZyb20gdGhlICdcJCcgb24gc3RyaXBwZWQKKyAgIChlLmcuIC50ZXh0KS4KKyAgIFNlZSB0aGUgTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQKKyAgIFNwZWNpZmljYXRpb24gNC4xLCBzZWN0aW9uIDQuMiwgR3JvdXBlZCBTZWN0aW9ucy4KKworICAgRklYTUU6IFRoaXMgaXMgbm93IGhhbmRsZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgdXNpbmcgd2lsZGNhcmRzLAorICAgYnV0IEknbSBsZWF2aW5nIHRoaXMgaGVyZSBpbiBjYXNlIHdlIHdhbnQgdG8gZW5hYmxlIGl0IGZvciBzZWN0aW9ucworICAgd2hpY2ggYXJlIG5vdCBtZW50aW9uZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7CisgICAgIGFzZWN0aW9uICpzOworeworICBjb25zdCBjaGFyICpzZWNuYW1lOworICBjaGFyICpvdXRwdXRfc2VjbmFtZSwgKnBzOworICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKKyAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbDsKKworICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBEb24ndCBwcm9jZXNzIGdyb3VwZWQgc2VjdGlvbnMgdW5sZXNzIGRvaW5nIGEgZmluYWwgbGluay4KKyAgICAgSWYgdGhleSdyZSBtYXJrZWQgYXMgQ09NREFUIHNlY3Rpb25zLCB3ZSBkb24ndCB3YW50IC50ZXh0XCRmb28gdG8KKyAgICAgZW5kIHVwIGluIC50ZXh0IGFuZCB0aGVuIGhhdmUgLnRleHQgZGlzYXBwZWFyIGJlY2F1c2UgaXQncyBtYXJrZWQKKyAgICAgbGluay1vbmNlLWRpc2NhcmQuICAqLworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7CisKKyAgLyogRXZlcnl0aGluZyBmcm9tIHRoZSAnXCQnIG9uIGdldHMgZGVsZXRlZCBzbyBkb24ndCBhbGxvdyAnXCQnIGFzIHRoZQorICAgICBmaXJzdCBjaGFyYWN0ZXIuICAqLworICBpZiAoKnNlY25hbWUgPT0gJ1wkJykKKyAgICBlaW5mbyAoIiVQJUY6IHNlY3Rpb24gJXMgaGFzICdcJCcgYXMgZmlyc3QgY2hhcmFjdGVyXG4iLCBzZWNuYW1lKTsKKyAgaWYgKHN0cmNociAoc2VjbmFtZSArIDEsICdcJCcpID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIExvb2sgdXAgdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlIE1pY3Jvc29mdCBzcGVjcyBzYXkgc2VjdGlvbnMgbmFtZXMgaW4KKyAgICAgaW1hZ2UgZmlsZXMgbmV2ZXIgY29udGFpbiBhICdcJCcuICBGb3J0dW5hdGVseSwgbGFuZ18uLi5fbG9va3VwIGNyZWF0ZXMKKyAgICAgdGhlIHNlY3Rpb24gaWYgaXQgZG9lc24ndCBleGlzdC4gICovCisgIG91dHB1dF9zZWNuYW1lID0gYnV5c3RyaW5nIChzZWNuYW1lKTsKKyAgcHMgPSBzdHJjaHIgKG91dHB1dF9zZWNuYW1lICsgMSwgJ1wkJyk7CisgICpwcyA9IDA7CisgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRwdXRfc2VjbmFtZSk7CisKKyAgLyogRmluZCB0aGUgJ1wkJyB3aWxkIHN0YXRlbWVudCBmb3IgdGhpcyBzZWN0aW9uLiAgV2UgY3VycmVudGx5IHJlcXVpcmUgdGhlCisgICAgIGxpbmtlciBzY3JpcHQgdG8gZXhwbGljaXRseSBtZW50aW9uICIqKC5mb29cJCkiLgorICAgICBGSVhNRTogcHBjcGUuc2MgaGFzIC5DUlRcJGZvbyBpbiB0aGUgLnJkYXRhIHNlY3Rpb24uICBBY2NvcmRpbmcgdG8gdGhlCisgICAgIE1pY3Jvc29mdCBkb2NzIHRoaXMgaXNuJ3QgY29ycmVjdCBzbyBpdCdzIG5vdCAoY3VycmVudGx5KSBoYW5kbGVkLiAgKi8KKworICBwc1swXSA9ICdcJCc7CisgIHBzWzFdID0gMDsKKyAgZm9yIChsID0gb3MtPmNoaWxkcmVuLmhlYWQ7IGw7IGwgPSBsLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChsLT5oZWFkZXIudHlwZSA9PSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW0KKwkgICYmIHN0cmNtcCAobC0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCBvdXRwdXRfc2VjbmFtZSkgPT0gMCkKKwlicmVhazsKKyAgICB9CisgIHBzWzBdID0gMDsKKyAgaWYgKGwgPT0gTlVMTCkKKyNpZiAxCisgICAgZWluZm8gKCIlUCVGOiAqKCVzXCQpIG1pc3NpbmcgZnJvbSBsaW5rZXIgc2NyaXB0XG4iLCBvdXRwdXRfc2VjbmFtZSk7CisjZWxzZSAvKiBGSVhNRTogVGhpcyBibG9jayBpcyB1bnRyaWVkLiAgSXQgZXhpc3RzIHRvIGNvbnZleSB0aGUgaW50ZW50LAorCSBzaG91bGQgb25lIGRlY2lkZSB0byBub3QgcmVxdWlyZSAqKC5mb29cJCkgdG8gYXBwZWFyIGluIHRoZSBsaW5rZXIKKwkgc2NyaXB0LiAgKi8KKyAgICB7CisgICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX3dpbGRfc3RhdGVtZW50LAorCQkJCQkJJm9zLT5jaGlsZHJlbik7CisgICAgICBuZXctPnNlY3Rpb25fbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAob3V0cHV0X3NlY25hbWUpICsgMik7CisgICAgICBzcHJpbnRmIChuZXctPnNlY3Rpb25fbmFtZSwgIiVzXCQiLCBvdXRwdXRfc2VjbmFtZSk7CisgICAgICBuZXctPmZpbGVuYW1lID0gTlVMTDsKKyAgICAgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7CisgICAgICBsID0gbmV3OworICAgIH0KKyNlbmRpZgorCisgIC8qIExpbmsgdGhlIGlucHV0IHNlY3Rpb24gaW4gYW5kIHdlJ3JlIGRvbmUgZm9yIG5vdy4KKyAgICAgVGhlIHNlY3Rpb25zIHN0aWxsIGhhdmUgdG8gYmUgc29ydGVkLCBidXQgdGhhdCBoYXMgdG8gd2FpdCB1bnRpbAorICAgICBhbGwgc3VjaCBzZWN0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5IHVzLiAgVGhlIHNvcnRpbmcgaXMgZG9uZSBieQorICAgICBzb3J0X3NlY3Rpb25zLiAgKi8KKyAgd2lsZF9kb2l0ICgmbC0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwwKK3N0YXRpYyBjaGFyICoKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4KK0VPRgorc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCit7CisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKKyAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4sCisgIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKKyAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCisgIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKKyAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAorICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKKyAgIiR7RU1VTEFUSU9OX05BTUV9IiwKKyAgIiR7T1VUUFVUX0ZPUk1BVH0iLAorICBOVUxMLCAvKiBmaW5pc2ggKi8KKyAgTlVMTCwgLyogY3JlYXRlIG91dHB1dCBzZWN0aW9uIHN0YXRlbWVudHMgKi8KKyAgTlVMTCwgLyogb3BlbiBkeW5hbWljIGFyY2hpdmUgKi8KKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAorICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMsCisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzCit9OworRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvZWxmMzIuZW0gYi9sZC9lbXVsdGVtcGwvZWxmMzIuZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ODY3NgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQpAQCAtMCwwICsxLDExNDMgQEAKKyMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQorIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KKyMgVGhpcyBmaWxlIGlzIG5vdyBtaXNuYW1lZCwgYmVjYXVzZSBpdCBzdXBwb3J0cyBib3RoIDMyIGJpdCBhbmQgNjQgYml0CisjIEVMRiBlbXVsYXRpb25zLgordGVzdCAteiAiJHtFTEZTSVpFfSIgJiYgRUxGU0laRT0zMgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLworCisvKiAke0VMRlNJWkV9IGJpdCBFTEYgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9CisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgorICAgRUxGIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQorICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZAorICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkCisgIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjaworICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCisgIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOworc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbgorICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKK3N0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQoreworICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2BlY2hvICR7QVJDSH0gfCBzZWQgLWUgJ3MvOi4qLy8nYDsKKyAgY29uZmlnLmR5bmFtaWNfbGluayA9ICR7RFlOQU1JQ19MSU5LLXRydWV9OworICBjb25maWcuaGFzX3NoYXJlZCA9IGBpZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4gZWNobyB0cnVlIDsgZWxzZSBlY2hvIGZhbHNlIDsgZmlgOworfQorCisvKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IEVMRgorICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNvLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2dsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQorICAgICBjb25zdCBjaGFyICphcmNoOworICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7CisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OworeworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgY2hhciAqc3RyaW5nOworCisgIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQorICAgIHJldHVybiBmYWxzZTsKKworICBmaWxlbmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKKworICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKKwkJCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQorCQkJICAgICArIHN0cmxlbiAoYXJjaCkKKwkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKKworICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7CisKKyAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCisgICAgeworICAgICAgZnJlZSAoc3RyaW5nKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOworCisgIC8qIFdlIGhhdmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGluIHRoZSBsaW5rLiAgVGhlIEVMRgorICAgICBiYWNrZW5kIGxpbmtlciB3aWxsIGNyZWF0ZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgLmR5bmFtaWMKKyAgICAgc2VjdGlvbiBuYW1pbmcgdGhpcyBmaWxlLiAgSWYgdGhpcyBmaWxlIGluY2x1ZGVzIGEgRFRfU09OQU1FCisgICAgIGVudHJ5LCBpdCB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZSBFTEYgbGlua2VyIHdpbGwganVzdCB1c2UKKyAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgYW4gYXJjaGl2ZSBmb3VuZCBieSBzZWFyY2hpbmcsIGxpa2UKKyAgICAgdGhpcyBvbmUsIHRoZSBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGNvbnNpc3Qgb2YganVzdCB0aGUgbmFtZSBvZgorICAgICB0aGUgZmlsZSwgd2l0aG91dCB0aGUgcGF0aCBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbmQgaXQuICBOb3RlCisgICAgIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGR5bmFtaWMgb2JqZWN0OyBhbgorICAgICBhcmNoaXZlIHdpbGwgbmV2ZXIgYmUgcmVmZXJlbmNlZCBieSBhIERUX05FRURFRCBlbnRyeS4KKworICAgICBGSVhNRTogVGhpcyBhcHByb2FjaC0tdXNpbmcgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUtLWlzIG5vdAorICAgICB2ZXJ5IHByZXR0eS4gIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YgYW55dGhpbmcgdGhhdCBpcworICAgICBwcmV0dHksIHRob3VnaC4gICovCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCkKKyAgICAgICYmIChlbnRyeS0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorICAgIHsKKyAgICAgIGNoYXIgKm5lZWRlZF9uYW1lOworCisgICAgICBBU1NFUlQgKGVudHJ5LT5pc19hcmNoaXZlICYmIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKTsKKyAgICAgIG5lZWRlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkKKwkJCQkgICAgICArIHN0cmxlbiAoYXJjaCkKKwkJCQkgICAgICArIHNpemVvZiAibGliLnNvIik7CisgICAgICBzcHJpbnRmIChuZWVkZWRfbmFtZSwgImxpYiVzJXMuc28iLCBmaWxlbmFtZSwgYXJjaCk7CisgICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK0VPRgoraWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCisgIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgorY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKworLyogRm9yIGEgbmF0aXZlIGxpbmtlciwgY2hlY2sgdGhlIGZpbGUgL2V0Yy9sZC5zby5jb25mIGZvciBkaXJlY3RvcmllcworICAgaW4gd2hpY2ggd2UgbWF5IGZpbmQgc2hhcmVkIGxpYnJhcmllcy4gIC9ldGMvbGQuc28uY29uZiBpcyByZWFsbHkKKyAgIG9ubHkgbWVhbmluZ2Z1bCBvbiBMaW51eCwgYnV0IHdlIGNoZWNrIGl0IG9uIG90aGVyIHN5c3RlbXMgYW55aG93LiAgKi8KKworc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZgorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworCitzdGF0aWMgYm9vbGVhbgorZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobmFtZSwgZm9yY2UpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGludCBmb3JjZTsKK3sKKyAgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7CisgIHN0YXRpYyBjaGFyICpsZF9zb19jb25mOworCisgIGlmICghIGluaXRpYWxpemVkKQorICAgIHsKKyAgICAgIEZJTEUgKmY7CisKKyAgICAgIGYgPSBmb3BlbiAoIi9ldGMvbGQuc28uY29uZiIsIEZPUEVOX1JUKTsKKyAgICAgIGlmIChmICE9IE5VTEwpCisJeworCSAgY2hhciAqYjsKKwkgIHNpemVfdCBsZW4sIGFsbG9jOworCSAgaW50IGM7CisKKwkgIGxlbiA9IDA7CisJICBhbGxvYyA9IDEwMDsKKwkgIGIgPSAoY2hhciAqKSB4bWFsbG9jIChhbGxvYyk7CisKKwkgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCisJICAgIHsKKwkgICAgICBpZiAobGVuICsgMSA+PSBhbGxvYykKKwkJeworCQkgIGFsbG9jICo9IDI7CisJCSAgYiA9IChjaGFyICopIHhyZWFsbG9jIChiLCBhbGxvYyk7CisJCX0KKwkgICAgICBpZiAoYyAhPSAnOicKKwkJICAmJiBjICE9ICcgJworCQkgICYmIGMgIT0gJ1x0JworCQkgICYmIGMgIT0gJ1xuJworCQkgICYmIGMgIT0gJywnKQorCQl7CisJCSAgYltsZW5dID0gYzsKKwkJICArK2xlbjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gIT0gJzonKQorCQkgICAgeworCQkgICAgICBiW2xlbl0gPSAnOic7CisJCSAgICAgICsrbGVuOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSA9PSAnOicpCisJICAgIC0tbGVuOworCisJICBpZiAobGVuID4gMCkKKwkgICAgYltsZW5dID0gJ1wwJzsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZyZWUgKGIpOworCSAgICAgIGIgPSBOVUxMOworCSAgICB9CisKKwkgIGZjbG9zZSAoZik7CisKKwkgIGxkX3NvX2NvbmYgPSBiOworCX0KKworICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICBpZiAobGRfc29fY29uZiA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGRfc29fY29uZiwgbmFtZSwgZm9yY2UpOworfQorCitFT0YKKyAgZmkKK2ZpCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCisvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKKyAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkIGFuZCBzdGF0X25lZWRlZCBhbmQgdmVyY2hlY2suICAqLworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfbmVlZGVkOworc3RhdGljIHN0cnVjdCBzdGF0IGdsb2JhbF9zdGF0Oworc3RhdGljIGJvb2xlYW4gZ2xvYmFsX2ZvdW5kOworc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsKK3N0YXRpYyBib29sZWFuIGdsb2JhbF92ZXJjaGVja19mYWlsZWQ7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCit7CisgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKKworICAvKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcyB3aGVuIGRvaW5nIGEgZmluYWwgbGluay4gICovCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlIHx8IGxpbmtfaW5mby5zaGFyZWQpCisgICAgcmV0dXJuOworCisgIC8qIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB3aGljaCBhcHBlYXIgaW4gRFRfTkVFREVEIGVudHJpZXMgaW4KKyAgICAgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rIChvZnRlbiB0aGVyZSB3aWxsIGJlIG5vbmUpLgorICAgICBGb3IgZWFjaCBzdWNoIGZpbGUsIHdlIHdhbnQgdG8gdHJhY2sgZG93biB0aGUgY29ycmVzcG9uZGluZworICAgICBsaWJyYXJ5LCBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlIGluIHRoZSBsaW5rLiAgVGhpcyBpcyB3aGF0CisgICAgIHRoZSBydW50aW1lIGR5bmFtaWMgbGlua2VyIHdpbGwgZG8uICBUcmFja2luZyB0aGUgZmlsZXMgZG93biBoZXJlCisgICAgIHBlcm1pdHMgb25lIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgYW5vdGhlciB3aXRob3V0IHJlcXVpcmluZworICAgICBzcGVjaWFsIGFjdGlvbiBieSB0aGUgcGVyc29uIGRvaW5nIHRoZSBsaW5rLiAgTm90ZSB0aGF0IHRoZQorICAgICBuZWVkZWQgbGlzdCBjYW4gYWN0dWFsbHkgZ3JvdyB3aGlsZSB3ZSBhcmUgc3RlcHBpbmcgdGhyb3VnaCB0aGlzCisgICAgIGxvb3AuICAqLworICBuZWVkZWQgPSBiZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7CisgIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOworICAgICAgaW50IGZvcmNlOworCisgICAgICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBmaWxlLCBza2lwIGl0LiAgKi8KKyAgICAgIGZvciAobGwgPSBuZWVkZWQ7IGxsICE9IGw7IGxsID0gbGwtPm5leHQpCisJaWYgKHN0cmNtcCAobGwtPm5hbWUsIGwtPm5hbWUpID09IDApCisJICBicmVhazsKKyAgICAgIGlmIChsbCAhPSBsKQorCWNvbnRpbnVlOworCisgICAgICAvKiBTZWUgaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZCBpbiB0aGUgbGluayBleHBsaWNpdGx5LiAgKi8KKyAgICAgIGdsb2JhbF9uZWVkZWQgPSBsOworICAgICAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7CisgICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk7CisgICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQorCWNvbnRpbnVlOworCisgICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQorCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKKwkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCisJIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAorCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuCisKKwkgV2Ugc2VhcmNoIHR3aWNlLiAgVGhlIGZpcnN0IHRpbWUsIHdlIHNraXAgb2JqZWN0cyB3aGljaCBtYXkKKwkgaW50cm9kdWNlIHZlcnNpb24gbWlzbWF0Y2hlcy4gIFRoZSBzZWNvbmQgdGltZSwgd2UgZm9yY2UKKwkgdGhlaXIgdXNlLiAgU2VlIGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIGNvbW1lbnQuICAqLworICAgICAgZm9yIChmb3JjZSA9IDA7IGZvcmNlIDwgMjsgZm9yY2UrKykKKwl7CisJICBjb25zdCBjaGFyICpsaWJfcGF0aDsKKwkgIHNpemVfdCBsZW47CisJICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7CisKKwkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGhfbGluaywKKwkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQorCSAgICBicmVhazsKKwkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChjb21tYW5kX2xpbmUucnBhdGgsCisJCQkJCQkgIGwtPm5hbWUsIGZvcmNlKSkKKwkgICAgYnJlYWs7CisJICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAorCSAgICAgICYmIGNvbW1hbmRfbGluZS5ycGF0aCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOworCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwKKwkJCQkJCSAgICAgIGZvcmNlKSkKKwkJYnJlYWs7CisJICAgIH0KK0VPRgoraWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCisgIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgorY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKwkgIGxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7CisJICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUsIGZvcmNlKSkKKwkgICAgYnJlYWs7CitFT0YKKyAgZmkKK2ZpCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCSAgbGVuID0gc3RybGVuIChsLT5uYW1lKTsKKwkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCisJICAgIHsKKwkgICAgICBjaGFyICpmaWxlbmFtZTsKKworCSAgICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCisJCWNvbnRpbnVlOworCSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7CisJICAgICAgc3ByaW50ZiAoZmlsZW5hbWUsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgbC0+bmFtZSk7CisJICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGZpbGVuYW1lLCBmb3JjZSkpCisJCWJyZWFrOworCSAgICAgIGZyZWUgKGZpbGVuYW1lKTsKKwkgICAgfQorCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQorCSAgICBicmVhazsKK0VPRgoraWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCisgIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgorY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKwkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19sZF9zb19jb25mIChsLT5uYW1lLCBmb3JjZSkpCisJICAgIGJyZWFrOworRU9GCisgIGZpCitmaQorY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKwl9CisKKyAgICAgIGlmIChmb3JjZSA8IDIpCisJY29udGludWU7CisKKyAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZCAodHJ5IHVzaW5nIC0tcnBhdGgpXG4iLAorCSAgICAgbC0+bmFtZSwgbC0+YnkpOworICAgIH0KK30KKworLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCisKK3N0YXRpYyBib29sZWFuCitnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lLCBmb3JjZSkKKyAgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgaW50IGZvcmNlOworeworICBjb25zdCBjaGFyICpzOworICBzaXplX3QgbGVuOworCisgIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKKyAgICByZXR1cm4gZmFsc2U7CisgIGxlbiA9IHN0cmxlbiAobmFtZSk7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKKworICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKKyAgICAgIGlmIChzID09IE5VTEwpCisJcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOworCisgICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7CisgICAgICBpZiAocyA9PSBwYXRoKQorCXNzZXQgPSBmaWxlbmFtZTsKKyAgICAgIGVsc2UKKwl7CisJICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7CisJICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7CisJICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKKwl9CisgICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOworCisgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKKwlyZXR1cm4gdHJ1ZTsKKworICAgICAgZnJlZSAoZmlsZW5hbWUpOworCisgICAgICBpZiAoKnMgPT0gJ1wwJykKKwlicmVhazsKKyAgICAgIHBhdGggPSBzICsgMTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOwkgIAorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBuYW1lIGZvciBhIGR5bmFtaWMgb2JqZWN0CisgICBuYW1lZCBieSBhIERUX05FRURFRCBlbnRyeS4gIFRoZSBGT1JDRSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRvIHNraXAgdGhlIGNoZWNrIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAobmFtZSwgZm9yY2UpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGludCBmb3JjZTsKK3sKKyAgYmZkICphYmZkOworCisgIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7CisgIGlmIChhYmZkID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCisgICAgeworICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBvYmplY3Qgd291bGQgaW5jbHVkZSBhbnkgY29uZmxpY3RpbmcgbGlicmFyeQorICAgICB2ZXJzaW9ucy4gIElmIEZPUkNFIGlzIHNldCwgdGhlbiB3ZSBza2lwIHRoaXMgY2hlY2s7IHdlIHVzZSB0aGlzCisgICAgIHRoZSBzZWNvbmQgdGltZSBhcm91bmQsIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGNvbXBhdGlibGUKKyAgICAgaW5zdGFuY2Ugb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKworICBpZiAoISBmb3JjZSkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKKworICAgICAgaWYgKCEgYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCAmbmVlZGVkKSkKKwllaW5mbyAoIiVGJVA6JUI6IGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKKworICAgICAgaWYgKG5lZWRlZCAhPSBOVUxMKQorCXsKKwkgIGdsb2JhbF92ZXJjaGVja19uZWVkZWQgPSBuZWVkZWQ7CisJICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gZmFsc2U7CisJICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTsKKwkgIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQorCSAgICB7CisJICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7CisJICAgICAgLyogUmV0dXJuIGZhbHNlIHRvIGZvcmNlIHRoZSBjYWxsZXIgdG8gbW92ZSBvbiB0byB0cnkKKyAgICAgICAgICAgICAgICAgYW5vdGhlciBmaWxlIG9uIHRoZSBzZWFyY2ggcGF0aC4gICovCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisKKwkgIC8qIEJ1dCB3YWl0ISAgSXQgZ2V0cyBtdWNoIHdvcnNlLiAgT24gTGludXgsIGlmIGEgc2hhcmVkCisgICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCB1c2UgbGliYyBhdCBhbGwsIHdlIGFyZSBzdXBwb3NlZCB0byBza2lwCisgICAgICAgICAgICAgaXQgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIGluIGNhc2Ugd2UgZW5jb3VudGVyIGEgc2hhcmVkCisgICAgICAgICAgICAgbGlicmFyeSBsYXRlciBvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggZG9lcyB1c2UgdGhlCisgICAgICAgICAgICAgdmVyc2lvbiBvZiBsaWJjIHRoYXQgd2Ugd2FudC4gIFRoaXMgaXMgbXVjaCB0b28gaG9ycmlibGUKKyAgICAgICAgICAgICB0byB1c2Ugb24gYW55IHN5c3RlbSBvdGhlciB0aGFuIExpbnV4LiAgKi8KKworRU9GCitjYXNlICR7dGFyZ2V0fSBpbgorICAqLSotbGludXgtZ251KikKKyAgICBjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCSAgeworCSAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7CisKKwkgICAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorCSAgICAgIGlmIChzdHJuY21wIChsLT5uYW1lLCAibGliYy5zbyIsIDcpID09IDApCisJCWJyZWFrOworCSAgICBpZiAobCA9PSBOVUxMKQorCSAgICAgIHsKKwkJKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7CisJCXJldHVybiBmYWxzZTsKKwkgICAgICB9CisJICB9CisKK0VPRgorICAgIDs7Citlc2FjCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCX0KKyAgICB9CisKKyAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KKworICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCisgICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCisgICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcworICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCisgICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKKyAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKKyAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KKworICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKKyAgICBlaW5mbyAoIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIGFiZmQpOworICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKKyAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk7CisgIGlmIChnbG9iYWxfZm91bmQpCisgICAgeworICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKKyAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQorICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCisgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7CisKKyAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLworICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCisgICAgZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQgKHMpCisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Cit7CisgIGlmIChnbG9iYWxfZm91bmQpCisgICAgcmV0dXJuOworCisgIGlmIChzLT5maWxlbmFtZSAhPSBOVUxMCisgICAgICAmJiBzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQorICAgIHsKKyAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqc29uYW1lOworCisgICAgICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOworICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMCisJICAmJiBzdHJjbXAgKHNvbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKKwl7CisJICBnbG9iYWxfZm91bmQgPSB0cnVlOworCSAgcmV0dXJuOworCX0KKyAgICB9CisJICAKKyAgaWYgKHMtPnNlYXJjaF9kaXJzX2ZsYWcKKyAgICAgICYmIHMtPmZpbGVuYW1lICE9IE5VTEwKKyAgICAgICYmIHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmY7CisKKyAgICAgIGYgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKKyAgICAgIGlmIChmICE9IE5VTEwKKwkgICYmIHN0cmNtcCAoZiArIDEsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCisJeworCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorfQorCisvKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IHJ1bm5pbmcgc3RhdCBvbgorICAgdGhlIGZpbGUuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQgKHMpCisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Cit7CisgIHN0cnVjdCBzdGF0IHN0OworICBjb25zdCBjaGFyICpzdWZmaXg7CisgIGNvbnN0IGNoYXIgKnNvbmFtZTsKKyAgY29uc3QgY2hhciAqZjsKKworICBpZiAoZ2xvYmFsX2ZvdW5kKQorICAgIHJldHVybjsKKyAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCisgICAgeworICAgICAgZWluZm8gKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgcy0+dGhlX2JmZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2CisgICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQorICAgIHsKKyAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCisgICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAorICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKKyAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQorICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKKyAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgorICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCisgICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLworCisgIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKKyAgICByZXR1cm47CisgIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKKyAgaWYgKHN1ZmZpeCA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOworCisgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7CisgIGlmIChzb25hbWUgPT0gTlVMTCkKKyAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKKworICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOworICBpZiAoZiAhPSBOVUxMKQorICAgICsrZjsKKyAgZWxzZQorICAgIGYgPSBzb25hbWU7CisKKyAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCisgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIsCisJICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOworfQorCisvKiBPbiBMaW51eCwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQorICAgc2hhcmVkIGxpYnJhcnkgbGlua2VkIGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYmMuICBUaGUKKyAgIGR5bmFtaWMgbGlua2VyIHNvbWVob3cgdGFncyB3aGljaCBsaWJjIHZlcnNpb24gdG8gdXNlIGluCisgICAvZXRjL2xkLnNvLmNhY2hlLCBhbmQsIGJhc2VkIG9uIHRoZSBsaWJjIHRoYXQgaXQgc2VlcyBpbiB0aGUKKyAgIGV4ZWN1dGFibGUsIGNob29zZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gdXNlLgorCisgICBXZSB0cnkgdG8gZG8gYSBzaW1pbGFyIGNoZWNrIGhlcmUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGlzIHNoYXJlZAorICAgbGlicmFyeSBuZWVkcyBhbnkgb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgY29uZmxpY3Qgd2l0aAorICAgbGlicmFyaWVzIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIGl0IGRvZXMsIHdlCisgICBza2lwIGl0LCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBzaGFyZWQgbGlicmFyeSBmYXJ0aGVyIG9uIGRvd24gdGhlCisgICBsaW5rIHBhdGguCisKKyAgIFRoaXMgaXMgY2FsbGVkIHZpYSBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuCisgICBHTE9CQUxfVkVSQ0hFQ0tfTkVFREVEIGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBvYmplY3QKKyAgIHdoaWNoIHdlIGFyIGNoZWNraW5nLiAgVGhpcyBzZXRzIEdMT0JBTF9WRVJDSEVDS19GQUlMRUQgaWYgd2UgZmluZAorICAgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIChzKQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOworeworICBjb25zdCBjaGFyICpzb25hbWUsICpmOworICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7CisKKyAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCisgICAgcmV0dXJuOworICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMCisgICAgICB8fCAoYmZkX2dldF9maWxlX2ZsYWdzIChzLT50aGVfYmZkKSAmIERZTkFNSUMpID09IDApCisgICAgcmV0dXJuOworCisgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7CisgIGlmIChzb25hbWUgPT0gTlVMTCkKKyAgICBzb25hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzLT50aGVfYmZkKTsKKworICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOworICBpZiAoZiAhPSBOVUxMKQorICAgICsrZjsKKyAgZWxzZQorICAgIGYgPSBzb25hbWU7CisKKyAgZm9yIChsID0gZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzdWZmaXg7CisKKyAgICAgIGlmIChzdHJjbXAgKGYsIGwtPm5hbWUpID09IDApCisJeworCSAgLyogUHJvYmFibHkgY2FuJ3QgaGFwcGVuLCBidXQgaXQncyBhbiBlYXN5IGNoZWNrLiAgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKHN0cmNociAobC0+bmFtZSwgJy8nKSAhPSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICBzdWZmaXggPSBzdHJzdHIgKGwtPm5hbWUsICIuc28uIik7CisgICAgICBpZiAoc3VmZml4ID09IE5VTEwpCisJY29udGludWU7CisKKyAgICAgIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKKworICAgICAgaWYgKHN0cm5jbXAgKGYsIGwtPm5hbWUsIHN1ZmZpeCAtIGwtPm5hbWUpID09IDApCisJeworCSAgLyogSGVyZSB3ZSBrbm93IHRoYXQgUyBpcyBhIGR5bmFtaWMgb2JqZWN0IEZPTy5TTy5WRVIxLCBhbmQKKyAgICAgICAgICAgICB0aGUgb2JqZWN0IHdlIGFyZSBjb25zaWRlcmluZyBuZWVkcyBhIGR5bmFtaWMgb2JqZWN0CisgICAgICAgICAgICAgRk9PLlNPLlZFUjIsIGFuZCBWRVIxIGFuZCBWRVIyIGFyZSBkaWZmZXJlbnQuICBUaGlzCisgICAgICAgICAgICAgYXBwZWFycyB0byBiZSBhIHZlcnNpb24gbWlzbWF0Y2gsIHNvIHdlIHRlbGwgdGhlIGNhbGxlcgorICAgICAgICAgICAgIHRvIHRyeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeS4gICovCisJICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gdHJ1ZTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorfQorCisvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAorICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCit7CisgIGNvbnN0IGNoYXIgKnJwYXRoOworICBhc2VjdGlvbiAqc2ludGVycDsKKworICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0CisgICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQorICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLworICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCk7CisKKyAgLyogTGV0IHRoZSBFTEYgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkCisgICAgIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCisgIHJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOworICBpZiAocnBhdGggPT0gTlVMTCkKKyAgICBycGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7CisgIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKKyAgICAgICAgIChvdXRwdXRfYmZkLCBjb21tYW5kX2xpbmUuc29uYW1lLCBycGF0aCwKKwkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiwKKwkgIChjb25zdCBjaGFyICogY29uc3QgKikgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAorCSAgJmxpbmtfaW5mbywgJnNpbnRlcnAsIGxhbmdfZWxmX3ZlcnNpb25faW5mbykpKQorICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKKworICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCisgIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAorICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKKyAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7CisgICAgfQorCisgIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAorICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50CisgICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCisgICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisKKyAgeworICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKKyAgICAgIHsKKwlhc2VjdGlvbiAqczsKKwliZmRfc2l6ZV90eXBlIHN6OworCWNoYXIgKm1zZzsKKwlib29sZWFuIHJldDsKKworCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCisJICBjb250aW51ZTsKKworCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKKwlpZiAocyA9PSBOVUxMKQorCSAgY29udGludWU7CisKKwlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKKwltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOworCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCisJICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iLAorCQkgaXMtPnRoZV9iZmQpOworCW1zZ1tzel0gPSAnXDAnOworCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKKwkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCisJCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCisJCQkJCSAgICAoYmZkX3ZtYSkgMCk7CisJQVNTRVJUIChyZXQpOworCWZyZWUgKG1zZyk7CisKKwkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKKwkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KKwlzLT5fcmF3X3NpemUgPSAwOworICAgICAgfQorICB9Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQorICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAorICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KKyAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQorICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOworeworICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQorICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Cit9CisKKy8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCisgICAgIGV0cmVlX3R5cGUgKmV4cDsKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKKyAgICB7CisgICAgY2FzZSBldHJlZV9wcm92aWRlOgorICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAorCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgaWYgKGggPT0gTlVMTCkKKwlicmVhazsKKworICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgorCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQorCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKKwkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZworCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgorCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAorCSB3aWxsIGRvIG5vIGhhcm0uICAqLworCisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgZXRyZWVfYXNzaWduOgorICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCisJeworCSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKKwkJIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBleHAtPmFzc2lnbi5kc3QsCisJCSAgZXhwLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSA/IHRydWUgOiBmYWxzZSkpKQorCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCisJCSAgIGV4cC0+YXNzaWduLmRzdCk7CisJfQorICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV9iaW5hcnk6CisgICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOworICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV90cmluYXJ5OgorICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOworICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7CisgICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV91bmFyeToKKyAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCisgICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCisKK3N0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKK3N0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKK3N0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9pbnRlcnA7CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK2dsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKKyAgICAgYXNlY3Rpb24gKnM7Cit7CisgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOworICBhc2VjdGlvbiAqc25ldywgKipwcHM7CisgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOworICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOworICBldHJlZV90eXBlICphZGRyZXNzOworICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7CisgIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7CisgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOworCisgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLworICBob2xkX3NlY3Rpb24gPSBzOworICBob2xkX3VzZSA9IE5VTEw7CisgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKKworICBpZiAoaG9sZF91c2UgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgcGxhY2VkIGEgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gICovCisgICAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKKworICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgdGhlbiBhbHdheXMgcHV0IC5nbnUud2FybmluZy5TWU1CT0wKKyAgICAgc2VjdGlvbnMgaW50byB0aGUgLnRleHQgc2VjdGlvbiB0byBnZXQgdGhlbSBvdXQgb2YgdGhlIHdheS4gICovCisgIGlmICghIGxpbmtfaW5mby5zaGFyZWQKKyAgICAgICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQorICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMAorICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCisgICAgeworICAgICAgd2lsZF9kb2l0ICgmaG9sZF90ZXh0LT5jaGlsZHJlbiwgcywgaG9sZF90ZXh0LCBmaWxlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBEZWNpZGUgd2hpY2ggc2VnbWVudCB0aGUgc2VjdGlvbiBzaG91bGQgZ28gaW4gYmFzZWQgb24gdGhlCisgICAgIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gIFdlIHB1dCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucworICAgICByaWdodCBhZnRlciB0aGUgLmludGVycCBzZWN0aW9uLCBzbyB0aGF0IHRoZSBQVF9OT1RFIHNlZ21lbnQgaXMKKyAgICAgc3RvcmVkIHJpZ2h0IGFmdGVyIHRoZSBwcm9ncmFtIGhlYWRlcnMgd2hlcmUgdGhlIE9TIGNhbiByZWFkIGl0CisgICAgIGluIHRoZSBmaXJzdCBwYWdlLiAgKi8KKyAgcGxhY2UgPSBOVUxMOworICBpZiAocy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCisgICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLm5vdGUiLCA0KSA9PSAwCisgICAgICAmJiBob2xkX2ludGVycCAhPSBOVUxMKQorICAgIHBsYWNlID0gaG9sZF9pbnRlcnA7CisgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKKwkgICAmJiBob2xkX2JzcyAhPSBOVUxMKQorICAgIHBsYWNlID0gaG9sZF9ic3M7CisgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAorCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQorICAgIHBsYWNlID0gaG9sZF9kYXRhOworICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKKwkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQorICAgIHBsYWNlID0gaG9sZF9yZWw7CisgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCisJICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCisJICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKKyAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOworICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKKwkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKKyAgICBwbGFjZSA9IGhvbGRfdGV4dDsKKyAgaWYgKHBsYWNlID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIENob29zZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2VjdGlvbi4gIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgdGhlCisgICAgIHNhbWUgc2VjdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUgd2l0aCBkaWZmZXJlbnQKKyAgICAgbG9hZGFibGUgb3IgYWxsb2NhdGVhYmxlIGNoYXJhY3RlcmlzdGljcy4gICovCisgIG91dHNlY25hbWUgPSBzZWNuYW1lOworICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dHNlY25hbWUpICE9IE5VTEwpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICAgIGNoYXIgKm5ld25hbWU7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgbGVuID0gc3RybGVuIChvdXRzZWNuYW1lKTsKKyAgICAgIG5ld25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKKyAgICAgIHN0cmNweSAobmV3bmFtZSwgb3V0c2VjbmFtZSk7CisgICAgICBpID0gMDsKKyAgICAgIGRvCisJeworCSAgc3ByaW50ZiAobmV3bmFtZSArIGxlbiwgIiVkIiwgaSk7CisJICArK2k7CisJfQorICAgICAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKKworICAgICAgb3V0c2VjbmFtZSA9IG5ld25hbWU7CisgICAgfQorCisgIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0CisgICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLworICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSk7CisgIGlmIChzbmV3ID09IE5VTEwpCisgICAgICBlaW5mbyAoIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiwKKwkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOworICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKKwk7CisgICAgICAqcHBzID0gc25ldy0+bmV4dDsKKyAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7CisgICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OworICAgIH0KKworICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KKyAgb2xkID0gc3RhdF9wdHI7CisgIHN0YXRfcHRyID0gJmFkZDsKKyAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKKworICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCisgICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLworICBmb3IgKHBzID0gb3V0c2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCisgICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwcykgJiYgKnBzICE9ICdfJykKKyAgICAgIGJyZWFrOworICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKKyAgICB7CisgICAgICBjaGFyICpzeW1uYW1lOworCisgICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOworICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBvdXRzZWNuYW1lKTsKKyAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAorCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAorCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQorCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7CisgICAgfQorCisgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgYWRkcmVzcyA9IE5VTEw7CisgIGVsc2UKKyAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7CisKKyAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCisJCQkJICAgICAgIChiZmRfdm1hKSAwLAorCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAorCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAorCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKKworICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0c2VjbmFtZSk7CisgIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOworCisgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50CisgICAgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKKyAgc3RhdF9wdHIgPSAmYWRkOworCisgIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQorICAgIHsKKyAgICAgIGNoYXIgKnN5bW5hbWU7CisKKyAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RvcF8iKTsKKyAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0b3BfJXMiLCBvdXRzZWNuYW1lKTsKKyAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAorCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKKyAgICB9CisKKyAgLyogTm93IHN0aWNrIHRoZSBuZXcgc3RhdGVtZW50IGxpc3QgcmlnaHQgYWZ0ZXIgUExBQ0UuICAqLworICAqYWRkLnRhaWwgPSBwbGFjZS0+aGVhZGVyLm5leHQ7CisgIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOworCisgIHN0YXRfcHRyID0gb2xkOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbiAocykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKK3sKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7CisKKyAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCisgICAgcmV0dXJuOworCisgIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKworICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uLT5uYW1lKSA9PSAwCisgICAgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAorICAgICAgJiYgKChob2xkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKKwkgID09IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkpKQorICAgIGhvbGRfdXNlID0gb3M7CisKKyAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCisgICAgaG9sZF90ZXh0ID0gb3M7CisgIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucm9kYXRhIikgPT0gMCkKKyAgICBob2xkX3JvZGF0YSA9IG9zOworICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQorICAgIGhvbGRfZGF0YSA9IG9zOworICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCisgICAgaG9sZF9ic3MgPSBvczsKKyAgZWxzZSBpZiAoaG9sZF9yZWwgPT0gTlVMTAorCSAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCisJICAgJiYgKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKKwkgICAmJiBzdHJuY21wIChvcy0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwKQorICAgIGhvbGRfcmVsID0gb3M7CisgIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuaW50ZXJwIikgPT0gMCkKKyAgICBob2xkX2ludGVycCA9IG9zOworfQorCitzdGF0aWMgY2hhciAqCitnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKworaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCit0aGVuCisjIFNjcmlwdHMgY29tcGlsZWQgaW4uCisKKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9J3MvWyJcXF0vXFwmL2cKK3MvJC9cXG5cXC8KKzFzL14vIi8KKyRzLyQvbiIvCisnCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDA7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7CisgIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7CitFT0YKKworaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54c2A7CitFT0YKK2ZpCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisgIGVsc2UKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Cit9CitFT0YKKworZWxzZQorIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMTsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOworICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzIjsKKyAgZWxzZQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOworfQorRU9GCisKK2ZpCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCit7CisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKKyAgc3lzbGliX2RlZmF1bHQsCisgIGhsbF9kZWZhdWx0LAorICBhZnRlcl9wYXJzZV9kZWZhdWx0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAorICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCisgIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAorICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAorICAiJHtFTVVMQVRJT05fTkFNRX0iLAorICAiJHtPVVRQVVRfRk9STUFUfSIsCisgIE5VTEwsCisgIE5VTEwsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlLAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nZW5lcmljLmVtIGIvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwYzhlYgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9nZW5lcmljLmVtCkBAIC0wLDAgKzEsMTE4IEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCisKKy8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9CisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKK3sKKyNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KKyAgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoImBlY2hvICR7QVJDSH1gIik7CisjZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KK30KKworc3RhdGljIGNoYXIgKgorZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCisgICAgIGludCAqaXNmaWxlOworRU9GCisKK2lmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgordGhlbgorIyBTY3JpcHRzIGNvbXBpbGVkIGluLgorCisjIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KK3NjPSItZiAke3NyY2Rpcn0vZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQiCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDA7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuCitFT0YKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1ICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybicgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4nICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuJyAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJyAgOyBlbHNlIHJldHVybicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK3NlZCAkc2MgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnggICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKK2VjaG8gJzsgfScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gZSR7RU1VTEFUSU9OX05BTUV9LmMKKworZWxzZQorIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMTsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOworICBlbHNlCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Cit9CitFT0YKKworZmkKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKK3sKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlLAorICBzeXNsaWJfZGVmYXVsdCwKKyAgaGxsX2RlZmF1bHQsCisgIGFmdGVyX3BhcnNlX2RlZmF1bHQsCisgIGFmdGVyX29wZW5fZGVmYXVsdCwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAorICAiJHtFTVVMQVRJT05fTkFNRX0iLAorICAiJHtPVVRQVVRfRk9STUFUfSIKK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjAuZW0gYi9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTk4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCkBAIC0wLDAgKzEsMTc2IEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK0dMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogCisgKiBlbXVsYXRlIHRoZSBJbnRlbHMgcG9ydCBvZiAgZ2xkCisgKi8KKworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaW5jbHVkZSAibGQuaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKworI2lmZGVmIEdOVTk2MAorCitzdGF0aWMgdm9pZAorZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCit7CisgIHN0YXRpYyBjaGFyICplbnZfdmFyaWFibGVzW10gPSB7ICJHOTYwTElCIiwgIkc5NjBCQVNFIiwgMCB9OworICBjaGFyICoqcDsKKyAgY2hhciAqZW52IDsKKworICBmb3IgKCBwID0gZW52X3ZhcmlhYmxlczsgKnA7IHArKyApeworICAgIGVudiA9ICAoY2hhciAqKSBnZXRlbnYoKnApOworICAgIGlmIChlbnYpIHsKKyAgICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwKKwkJCQkgICAgICAgIi9saWIvbGliYm91dCIsCisJCQkJICAgICAgIChjb25zdCBjaGFyICopIE5VTEwpLAorCQkJICAgICAgIGZhbHNlKTsKKyAgICB9CisgIH0KKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOworfQorCisjZWxzZQkvKiBub3QgR05VOTYwICovCisKK3N0YXRpYyB2b2lkIGdsZDk2MF9iZWZvcmVfcGFyc2UoKQoreworICBjaGFyICplbnYgOworICBlbnYgPSAgZ2V0ZW52KCJHOTYwTElCIik7CisgIGlmIChlbnYpIHsKKyAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChlbnYsIGZhbHNlKTsKKyAgfQorICBlbnYgPSBnZXRlbnYoIkc5NjBCQVNFIik7CisgIGlmIChlbnYpCisgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LCAiL2xpYiIsIChjb25zdCBjaGFyICopIE5VTEwpLCBmYWxzZSk7CisgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKK30KKworI2VuZGlmCS8qIEdOVTk2MCAqLworCisKK3N0YXRpYyB2b2lkCitnbGQ5NjBfc2V0X291dHB1dF9hcmNoKCkKK3sKKyAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGJmZF9tYWNoX2k5NjBfY29yZSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dsZDk2MF9jaG9vc2VfdGFyZ2V0KCkKK3sKKyNpZmRlZiBHTlU5NjAKKworICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOworICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9CT1VUX0ZPUk1BVCwgMCk7CisKKyNlbHNlCisKKyAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKKyAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKKworICBpZiAoZnJvbV9vdXRzaWRlICE9IChjaGFyICopTlVMTCkKKyAgICByZXR1cm4gZnJvbV9vdXRzaWRlOworCisgIHJldHVybiAiYi5vdXQubGl0dGxlIjsKKworI2VuZGlmCit9CisKK3N0YXRpYyBjaGFyICoKK2dsZDk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKworaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCit0aGVuCisjIFNjcmlwdHMgY29tcGlsZWQgaW4uCisKKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9J3MvWyJcXF0vXFwmL2cKK3MvJC9cXG5cXC8KKzFzL14vIi8KKyRzLyQvbiIvCisnCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDA7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7CisgIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7CisgIGVsc2UKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Cit9CitFT0YKKworZWxzZQorIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMTsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOworICBlbHNlCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Cit9CitFT0YKKworZmkKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9nbGQ5NjBfZW11bGF0aW9uID0gCit7CisgIGdsZDk2MF9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKKyAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAorICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCisgIGdsZDk2MF9zZXRfb3V0cHV0X2FyY2gsCisgIGdsZDk2MF9jaG9vc2VfdGFyZ2V0LAorICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBnbGQ5NjBfZ2V0X3NjcmlwdCwKKyAgIjk2MCIsCisgICIiCit9OworRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbSBiL2xkL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwY2I1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVsdGVtcGwvZ2xkOTYwYy5lbQpAQCAtMCwwICsxLDE5MiBAQAorIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCisjIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisvKiAKKyAqIGVtdWxhdGUgdGhlIEludGVscyBwb3J0IG9mICBnbGQKKyAqLworCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisKKyNpZmRlZiBHTlU5NjAKKworc3RhdGljIHZvaWQKK2dsZDk2MF9iZWZvcmVfcGFyc2UoKQoreworICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKKyAgY2hhciAqKnA7CisgIGNoYXIgKmVudiA7CisKKyAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKKyAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKKyAgICBpZiAoZW52KSB7CisgICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCisJCQkJICAgICAgICIvbGliL2xpYmNvZmYiLAorCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKKwkJCSAgICAgICBmYWxzZSk7CisgICAgfQorICB9CisgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKK30KKworI2Vsc2UJLyogbm90IEdOVTk2MCAqLworCitzdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKK3sKKyAgY2hhciAqZW52IDsKKyAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOworICBpZiAoZW52KSB7CisgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7CisgIH0KKyAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOworICBpZiAoZW52KQorICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwKKwkJCSAgICAgZmFsc2UpOworICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Cit9CisKKyNlbmRpZgkvKiBHTlU5NjAgKi8KKworCitzdGF0aWMgdm9pZAorZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCit7CisgIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSBOVUxMCisgICAgICAmJiAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgIT0gJ1wwJykKKyAgICB7CisgICAgICBjaGFyICpzLCAqczE7CisKKyAgICAgIHMgPSBjb25jYXQgKCJpOTYwOiIsIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lLCAoY2hhciAqKSBOVUxMKTsKKyAgICAgIGZvciAoczEgPSBzOyAqczEgIT0gJ1wwJzsgczErKykKKwlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMSkpCisJICAqczEgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMxKTsKKyAgICAgIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKHMpOworICAgICAgZnJlZSAocyk7CisgICAgfQorCisgIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0ICgpOworfQorCitzdGF0aWMgY2hhciAqCitnbGQ5NjBfY2hvb3NlX3RhcmdldCgpCit7CisjaWZkZWYgR05VOTYwCisKKyAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKKyAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOworCisjZWxzZQorCisgIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7CisgIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7CisKKyAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCisgICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKKworICByZXR1cm4gImNvZmYtSW50ZWwtbGl0dGxlIjsKKworI2VuZGlmCit9CisKK3N0YXRpYyBjaGFyICoKK2dsZDk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKworaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCit0aGVuCisjIFNjcmlwdHMgY29tcGlsZWQgaW4uCisKKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9J3MvWyJcXF0vXFwmL2cKK3MvJC9cXG5cXC8KKzFzL14vIi8KKyRzLyQvbiIvCisnCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDA7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7CisgIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7CisgIGVsc2UKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Cit9CitFT0YKKworZWxzZQorIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMTsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOworICBlbHNlCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Cit9CitFT0YKKworZmkKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9nbGQ5NjBjb2ZmX2VtdWxhdGlvbiA9IAoreworICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAorICBzeXNsaWJfZGVmYXVsdCwKKyAgaGxsX2RlZmF1bHQsCisgIGFmdGVyX3BhcnNlX2RlZmF1bHQsCisgIGFmdGVyX29wZW5fZGVmYXVsdCwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAorICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKKyAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKKyAgZ2xkOTYwX2dldF9zY3JpcHQsCisgICI5NjBjb2ZmIiwKKyAgIiIKK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9ocHBhZWxmLmVtIGIvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjYTExMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9ocHBhZWxmLmVtCkBAIC0wLDAgKzEsMjgzIEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBBbiBlbXVsYXRpb24gZm9yIEhQIFBBLVJJU0MgRUxGIGxpbmtlcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZGN0b3IuaCIKKworLyogU2VjdGlvbiBpbiB3aGljaCB3ZSBidWlsZCBzdHVicy4gICovCitzdGF0aWMgYXNlY3Rpb24gKnN0dWJfc2VjOworc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnN0dWJfZmlsZTsKKworCisvKiBGSVhNRS4gIFRoaXMgZG9lc24ndCBiZWxvbmcgaGVyZS4gICovCitleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW47CisKKy8qIFBlcmZvcm0gc29tZSBlbXVsYXRpb24gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICBGb3IgUEEgRUxGIHdlIHNldAorICAgdXAgdGhlIGxvY2FsIGxhYmVsIHByZWZpeCBhbmQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUuICAqLworCitzdGF0aWMgdm9pZAoraHBwYWVsZl9iZWZvcmVfcGFyc2UgKCkKK3sKKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9ocHBhOworfQorCisvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuICAqLworCitzdGF0aWMgdm9pZAoraHBwYWVsZl9zZXRfb3V0cHV0X2FyY2goKQoreworICB1bnNpZ25lZCBsb25nIG1hY2hpbmUgPSAwOworCisgIGJmZF9zZXRfYXJjaF9tYWNoIChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbWFjaGluZSk7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlIG9wZW5lZC4gIFdlIGNyZWF0ZSBhIG5ldworICAgZmFrZSBpbnB1dCBmaWxlIHRvIGhvbGQgdGhlIHN0dWIgc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitocHBhZWxmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpCit7CisgIHN0dWJfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKCJsaW5rZXIgc3R1YnMiLAorCQkJCSAgIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW0sCisJCQkJICAgTlVMTCk7CisgIHN0dWJfZmlsZS0+dGhlX2JmZCA9IGJmZF9jcmVhdGUgKCJsaW5rZXIgc3R1YnMiLCBvdXRwdXRfYmZkKTsKKyAgaWYgKHN0dWJfZmlsZS0+dGhlX2JmZCA9PSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfYXJjaF9tYWNoIChzdHViX2ZpbGUtPnRoZV9iZmQsCisJCQkgICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAorCQkJICAgICAgYmZkX2dldF9tYWNoIChvdXRwdXRfYmZkKSkpCisgICAgeworICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSBCRkQgJUVcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdHViX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3R1Yl9maWxlLT50aGVfYmZkLCAiLnRleHQiKTsKKyAgLyogRG9uJ3Qgc2V0IFNFQ19SRUxPQyB1bnRpbCB3ZSBhY3R1YWxseSBoYXZlIHJlbG9jYXRpb25zIGluIHRoaXMKKyAgICAgc2VjdGlvbi4gICovCisgIGlmIChzdHViX3NlYyA9PSBOVUxMCisgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3R1Yl9maWxlLT50aGVfYmZkLCBzdHViX3NlYywKKwkJCQkgIChTRUNfSEFTX0NPTlRFTlRTCisJCQkJICAgfCBTRUNfQUxMT0MKKwkJCQkgICB8IFNFQ19MT0FECisJCQkJICAgfCBTRUNfQ09ERQorCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpKQorICAgIHsKKyAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgc3R1YiBzZWN0aW9uOiAlRVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxkbGFuZ19hZGRfZmlsZSAoc3R1Yl9maWxlKTsKK30KKworLyogV2FsayBhbGwgdGhlIGxhbmcgc3RhdGVtZW50cyBzcGxpY2luZyBvdXQgYW55IHBhZGRpbmcgc3RhdGVtZW50cyBmcm9tIAorICAgdGhlIGxpc3QuICAqLworCitzdGF0aWMgdm9pZAoraHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLCBwcmV2KQorICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOworICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHJldjsKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3ByZXYgPSBOVUxMOworICBmb3IgKDsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQorCXsKKworCS8qIFdlIHdhbnQgcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBzZWN0aW9ucy4gICovCisJY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKKwkgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAorCQkJCQkgICAgICZjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOworCSAgYnJlYWs7CisKKwljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06CisJICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KKwkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQsCisJCQkJCSAgICAgJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC4KKwkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQpOworCSAgYnJlYWs7CisKKwkvKiBIdWg/ICBXaGF0IGlzIGEgbGFuZ193aWxkX3N0YXRlbWVudD8gICovCisJY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06CisJICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHMtPndpbGRfc3RhdGVtZW50LgorCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCwKKwkJCQkJICAgICAmcy0+d2lsZF9zdGF0ZW1lbnQuCisJCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkKTsKKwkgIGJyZWFrOworCisJLyogSGVyZSdzIHdoYXQgd2UgYXJlIHJlYWxseSBsb29raW5nIGZvci4gIFNwbGljZSB0aGVzZSBvdXQgb2YKKwkgICB0aGUgbGlzdC4gICovCisJY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06CisJICBpZiAoc3ByZXYpCisJICAgIHNwcmV2LT5oZWFkZXIubmV4dCA9IHMtPmhlYWRlci5uZXh0OworCSAgZWxzZQorCSAgICAqKnByZXYgPSAqczsKKwkgIGJyZWFrOworCisJLyogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSBjYXNlcy4gICovCisJY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgorCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgorCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworCSAgYnJlYWs7CisJfQorICAgICAgc3ByZXYgPSBzOworICAgIH0KK30KKworLyogRmluYWwgZW11bGF0aW9uIHNwZWNpZmljIGNhbGwuICBGb3IgdGhlIFBBIHdlIHVzZSB0aGlzIG9wcG9ydHVuaXR5CisgICB0byBidWlsZCBsaW5rZXIgc3R1YnMuICAqLworCitzdGF0aWMgdm9pZAoraHBwYWVsZl9maW5pc2ggKCkKK3sKKyAgLyogQ2FsbCBpbnRvIHRoZSBCRkQgYmFja2VuZCB0byBkbyB0aGUgcmVhbCB3b3JrLiAgKi8KKyAgaWYgKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyAoc3R1Yl9maWxlLT50aGVfYmZkLCBvdXRwdXRfYmZkLCAmbGlua19pbmZvKQorICAgICAgPT0gZmFsc2UpCisgICAgeworICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IHNpemUgc3R1YiBzZWN0aW9uOiAlRVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgLyogSWYgdGhlIHNpemUgb2YgdGhlIHN0dWIgc2VjdGlvbiBpcyBub256ZXJvLCB0aGVuIHdlIG5lZWQKKyAgICAgdG8gcmVzaXplIHRoZSBzZWN0aW9ucywgcmVjb21wdXRlIHRoZSBhc3NpZ25tZW50cywgYW5kIGZpbmFsbHkKKyAgICAgYnVpbGQgdGhlIHN0dWJzLiAgKi8KKyAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0dWJfZmlsZS0+dGhlX2JmZCwgc3R1Yl9maWxlLT50aGVfYmZkLT5zZWN0aW9ucykgIT0gMCkKKyAgICB7CisgICAgICAvKiBEZWxldGUgYWxsIHRoZSBwYWRkaW5nIHN0YXRlbWVudHMsIHRoZXkncmUgbm8gbG9uZ2VyIHZhbGlkLiAgKi8KKyAgICAgIGhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAoc3RhdF9wdHItPmhlYWQsICZzdGF0X3B0ci0+aGVhZCk7CisgICAgICAKKyAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLworICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7CisgICAgICAKKyAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCisgICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKKyAgICAgIAorICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KKyAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAorCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOworICAgICAgCisgICAgICAvKiBOb3cgYnVpbGQgdGhlIGxpbmtlciBzdHVicy4gICovCisgICAgICBpZiAoZWxmMzJfaHBwYV9idWlsZF9zdHVicyAoc3R1Yl9maWxlLT50aGVfYmZkLCAmbGlua19pbmZvKSA9PSBmYWxzZSkKKwl7CisJICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgYnVpbGQgc3R1YnM6ICVFXG4iKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorfQorCisvKiBUaGUgc2NyaXB0IGl0c2VsZiBnZXRzIGluc2VydGVkIGhlcmUuICAqLworCitzdGF0aWMgY2hhciAqCitocHBhZWxmX2dldF9zY3JpcHQoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK0VPRgorCitpZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKK3RoZW4KKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKworIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCitzYz0ncy9bIlxcXS9cXCYvZworcy8kL1xcblxcLworMXMvXi8iLworJHMvJC9uIi8KKycKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOworICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKKyAgZWxzZQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKK30KK0VPRgorCitlbHNlCisjIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAxOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7CisgIGVsc2UKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKK30KK0VPRgorCitmaQorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCitzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2hwcGFlbGZfZW11bGF0aW9uID0gCit7CisgIGhwcGFlbGZfYmVmb3JlX3BhcnNlLAorICBzeXNsaWJfZGVmYXVsdCwKKyAgaGxsX2RlZmF1bHQsCisgIGFmdGVyX3BhcnNlX2RlZmF1bHQsCisgIGFmdGVyX29wZW5fZGVmYXVsdCwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBocHBhZWxmX3NldF9vdXRwdXRfYXJjaCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBocHBhZWxmX2dldF9zY3JpcHQsCisgICJocHBhZWxmIiwKKyAgImVsZjMyLWhwcGEiLAorICBocHBhZWxmX2ZpbmlzaCwKKyAgaHBwYWVsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9saW51eC5lbSBiL2xkL2VtdWx0ZW1wbC9saW51eC5lbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA4NTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHRlbXBsL2xpbnV4LmVtCkBAIC0wLDAgKzEsMjA4IEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCisKKy8qIExpbnV4IGEub3V0IGVtdWxhdGlvbiBjb2RlIGZvciAke0VNVUxBVElPTl9OQU1FfQorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgorICAgTGludXggc3VwcG9ydCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKworc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQKKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cworICBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgY2hhciAqZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKK3sKKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OworICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKKyAgY29uZmlnLmhhc19zaGFyZWQgPSB0cnVlOworfQorCisvKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IExpbnV4CisgICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc2EuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCisgICAgIGNvbnN0IGNoYXIgKmFyY2g7CisgICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Cit7CisgIGNoYXIgKnN0cmluZzsKKworICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCisJCQkgICAgICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpCisJCQkgICAgICsgc3RybGVuIChhcmNoKQorCQkJICAgICArIHNpemVvZiAiL2xpYi5zYSIpOworCisgIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc2EiLCBzZWFyY2gtPm5hbWUsIGVudHJ5LT5maWxlbmFtZSwgYXJjaCk7CisKKyAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCisgICAgeworICAgICAgZnJlZSAoc3RyaW5nKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOworCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgcm91dGluZSB2aWEKKyAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYWRkcmVzcyBhc3NpZ25tZW50IHRvCisgICAudGV4dCwgYW5kIG1vZGlmaWVzIGl0IHRvIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGhlYWRlcnMuICBUaGlzCisgICBjYXVzZXMgLVR0ZXh0IHRvIG1lYW4gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGhlYWRlciwgcmF0aGVyCisgICB0aGFuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIC50ZXh0LCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIKKyAgIExpbnV4IHRvb2xzLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQgKHMpCisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Cit7CisgIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW0KKyAgICAgICYmIHN0cmNtcCAocy0+YWRkcmVzc19zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAiLnRleHQiKSA9PSAwKQorICAgIHsKKyAgICAgIEFTU0VSVCAocy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzcy0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3ZhbHVlKTsKKyAgICAgIHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3MtPnZhbHVlLnZhbHVlICs9IDB4MjA7CisgICAgfQorfQorCisvKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgb3BlbmluZyB0aGUgaW5wdXQgQkZEJ3MuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKK3sKKyAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQpOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAorICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCit7CisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQorICAgIHJldHVybjsKKworICAvKiBMZXQgdGhlIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZCBieQorICAgICBkeW5hbWljIGxpbmtpbmcuICAqLworICBpZiAoISBiZmRfJHtFTVVMQVRJT05fTkFNRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKKyAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK0VPRgorCitpZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKK3RoZW4KKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKworIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCitzYz0ncy9bIlxcXS9cXCYvZworcy8kL1xcblxcLworMXMvXi8iLworJHMvJC9uIi8KKycKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOworICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKKyAgZWxzZQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKK30KK0VPRgorCitlbHNlCisjIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAxOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7CisgIGVsc2UKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKK30KK0VPRgorCitmaQorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCitzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAoreworICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKKyAgYWZ0ZXJfb3Blbl9kZWZhdWx0LAorICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCisgIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAorICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAorICAiJHtFTVVMQVRJT05fTkFNRX0iLAorICAiJHtPVVRQVVRfRk9STUFUfSIsCisgIE5VTEwsCisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQorfTsKK0VPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2xuazk2MC5lbSBiL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2ZDQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9sbms5NjAuZW0KQEAgLTAsMCArMSwzMjcgQEAKKyMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQorIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KK2NhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKy8qIGludGVsIGNvZmYgbG9hZGVyIGVtdWxhdGlvbiBzcGVjaWZpYyBzdHVmZgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK0dMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworLyojaW5jbHVkZSAiYXJjaHVyZXMuaCIqLworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKwordHlwZWRlZiBzdHJ1Y3QgbGliX2xpc3QgeworICBjaGFyICpuYW1lOworICBzdHJ1Y3QgbGliX2xpc3QgKm5leHQ7Cit9IGxpYl9saXN0X3R5cGU7CisKK3N0YXRpYyBsaWJfbGlzdF90eXBlICpobGxfbGlzdDsKK3N0YXRpYyBsaWJfbGlzdF90eXBlICoqaGxsX2xpc3RfdGFpbCA9ICZobGxfbGlzdDsKKworc3RhdGljIGxpYl9saXN0X3R5cGUgKnN5c2xpYl9saXN0Oworc3RhdGljIGxpYl9saXN0X3R5cGUgKipzeXNsaWJfbGlzdF90YWlsID0gJnN5c2xpYl9saXN0OworCisKK3N0YXRpYyB2b2lkCithcHBlbmQobGlzdCwgbmFtZSkKKyAgICAgbGliX2xpc3RfdHlwZSAqKipsaXN0OworICAgICBjaGFyICpuYW1lOworeworICBsaWJfbGlzdF90eXBlICplbGVtZW50ID0gCisgICAgKGxpYl9saXN0X3R5cGUgKikoeG1hbGxvYyhzaXplb2YobGliX2xpc3RfdHlwZSkpKTsKKworICBlbGVtZW50LT5uYW1lID0gbmFtZTsKKyAgZWxlbWVudC0+bmV4dCA9IChsaWJfbGlzdF90eXBlICopTlVMTDsKKyAgKipsaXN0ID0gZWxlbWVudDsKKyAgKmxpc3QgPSAmZWxlbWVudC0+bmV4dDsKKworfQorCitzdGF0aWMgYm9vbGVhbiBoYWRfaGxsID0gZmFsc2U7CitzdGF0aWMgYm9vbGVhbiBoYWRfaGxsX25hbWUgPSBmYWxzZTsKKworc3RhdGljIHZvaWQKK2xuazk2MF9obGwobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaGFkX2hsbCA9IHRydWU7CisgIGlmIChuYW1lICE9IChjaGFyICopTlVMTCkgeworICAgIGhhZF9obGxfbmFtZSA9IHRydWU7CisgICAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCBuYW1lKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCAKK2xuazk2MF9zeXNsaWIobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgYXBwZW5kKCZzeXNsaWJfbGlzdF90YWlsLG5hbWUpOworfQorCisKKyNpZmRlZiBHTlU5NjAKKworc3RhdGljIHZvaWQgCitsbms5NjBfYmVmb3JlX3BhcnNlKCkKK3sKKyAgc3RhdGljIGNoYXIgKmVudl92YXJpYWJsZXNbXSA9IHsgIkc5NjBMSUIiLCAiRzk2MEJBU0UiLCAwIH07CisgIGNoYXIgKipwOworICBjaGFyICplbnYgOworCisgIGZvciAoIHAgPSBlbnZfdmFyaWFibGVzOyAqcDsgcCsrICl7CisgICAgZW52ID0gIChjaGFyICopIGdldGVudigqcCk7CisgICAgaWYgKGVudikgeworICAgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KGVudiwiL2xpYi9saWJjb2ZmIiwiIiksIGZhbHNlKTsKKyAgICB9CisgIH0KKworICBlbnY9IChjaGFyICopIGdldGVudigiSTk2MEJBU0UiKTsKKyAgaWYgKCBlbnYgKSB7CisgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KGVudiwiL2xpYiIsIiIpLCBmYWxzZSk7CisgIH0KKworICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7CisgIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKK30KKworI2Vsc2UJLyogbm90IEdOVTk2MCAqLworCitzdGF0aWMgdm9pZCAKK2xuazk2MF9iZWZvcmVfcGFyc2UoKQoreworICBjaGFyICpuYW1lID0gZ2V0ZW52KCJJOTYwQkFTRSIpOworCisgIGlmIChuYW1lID09IChjaGFyICopTlVMTCkgeworICAgIG5hbWUgPSBnZXRlbnYoIkc5NjBCQVNFIik7CisgICAgaWYgKG5hbWUgPT0gKGNoYXIgKilOVUxMKSB7CisgICAgICBlaW5mbygiJVAlRiBJOTYwQkFTRSBhbmQgRzk2MEJBU0Ugbm90IHNldFxuIik7CisgICAgfQorICB9CisKKworICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQobmFtZSwiL2xpYiIsIiIpLCBmYWxzZSk7CisgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKKyAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOworfQorCisjZW5kaWYJLyogR05VOTYwICovCisKKworc3RhdGljIHZvaWQKK2FkZF9vbihsaXN0LCBzZWFyY2gpCisgICAgIGxpYl9saXN0X3R5cGUgKmxpc3Q7CisgICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgc2VhcmNoOworeworICB3aGlsZSAobGlzdCkgeworICAgIGxhbmdfYWRkX2lucHV0X2ZpbGUobGlzdC0+bmFtZSwKKwkJCXNlYXJjaCwKKwkJCShjaGFyICopTlVMTCk7CisgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgIH0KK30KK3N0YXRpYyB2b2lkCitsbms5NjBfYWZ0ZXJfcGFyc2UoKQoreworICAvKiBJZiB0aGVyZSBoYXMgYmVlbiBubyBhcmNoLCBkZWZhdWx0IHRvIC1LQiAqLworICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWVbMF0gPT0wKSB7CisgICAgbGRmaWxlX2FkZF9hcmNoKCJLQiIpOworICB9CisKKyAgLyogaWYgdGhlcmUgaGFzIGJlZW4gbm8gaGxsIGxpc3QgdGhlbiBhZGQgb3VyIG93biAqLworICAKKyAgaWYoaGFkX2hsbCAmJiAhaGFkX2hsbF9uYW1lKSB7CisgICAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCJjZyIpOworICAgIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmUgPT0gYmZkX21hY2hfaTk2MF9rYV9zYSB8fAorICAJbGRmaWxlX291dHB1dF9tYWNoaW5lID09IGJmZF9tYWNoX2k5NjBfY2EpIHsKKyAgICAgICAgeworCSAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCJmcGciKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgYWRkX29uKGhsbF9saXN0LCBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtKTsKKyAgYWRkX29uKHN5c2xpYl9saXN0LCBsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSk7Cit9CisKK3N0YXRpYyB2b2lkCitsbms5NjBfYmVmb3JlX2FsbG9jYXRpb24oKQoreworfQorCitzdGF0aWMgdm9pZAorbG5rOTYwX2FmdGVyX2FsbG9jYXRpb24oKQoreworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSBmYWxzZSkgeworICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi50ZXh0IiwiX2V0ZXh0Iik7CisgICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLmRhdGEiLCJfZWRhdGEiKTsKKyAgICBsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKCIuYnNzIiwiX2Jzc19zdGFydCIpOworICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi5ic3MiLCJfZW5kIik7CisgIH0KK30KKworCitzdGF0aWMgc3RydWN0CisgeworICAgdW5zaWduZWQgIGxvbmcgbnVtYmVyOworICAgY2hhciAqbmFtZTsgCisgfQorbWFjaGluZV90YWJsZVtdID0KK3sKKyAgeyBiZmRfbWFjaF9pOTYwX2NvcmUJLCJDT1JFIiB9LAorICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJLQiIgfSwKKyAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwiU0IiIH0sCisgIHsgYmZkX21hY2hfaTk2MF9tYwksIk1DIiB9LAorICB7IGJmZF9tYWNoX2k5NjBfeGEJLCJYQSIgfSwKKyAgeyBiZmRfbWFjaF9pOTYwX2NhCSwiQ0EiIH0sCisgIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksIktBIiB9LAorICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJTQSIgfSwKKyAgeyBiZmRfbWFjaF9pOTYwX2p4CSwiSlgiIH0sCisgIHsgYmZkX21hY2hfaTk2MF9oeAksIkhYIiB9LAorCisgIHsgYmZkX21hY2hfaTk2MF9jb3JlCSwiY29yZSIgfSwKKyAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwia2IiIH0sCisgIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksInNiIiB9LAorICB7IGJmZF9tYWNoX2k5NjBfbWMJLCJtYyIgfSwKKyAgeyBiZmRfbWFjaF9pOTYwX3hhCSwieGEiIH0sCisgIHsgYmZkX21hY2hfaTk2MF9jYQksImNhIiB9LAorICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJrYSIgfSwKKyAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwic2EiIH0sCisgIHsgYmZkX21hY2hfaTk2MF9qeAksImp4IiB9LAorICB7IGJmZF9tYWNoX2k5NjBfaHgJLCJoeCIgfSwKKworICB7IDAsIChjaGFyICopIE5VTEwgfQorfTsKKworc3RhdGljIHZvaWQKK2xuazk2MF9zZXRfb3V0cHV0X2FyY2goKQoreworICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KKyAgdW5zaWduZWQgaW50IGk7CisgIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKKyAgZm9yIChpPSAwOyBtYWNoaW5lX3RhYmxlW2ldLm5hbWUgIT0gKGNoYXIqKU5VTEw7IGkrKykgeworICAgIGlmIChzdHJjbXAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUsbWFjaGluZV90YWJsZVtpXS5uYW1lKT09MCkgeworICAgICAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gbWFjaGluZV90YWJsZVtpXS5udW1iZXI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGxkZmlsZV9vdXRwdXRfbWFjaGluZSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2xuazk2MF9jaG9vc2VfdGFyZ2V0KCkKK3sKKyNpZmRlZiBHTlU5NjAKKworICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9DT0ZGX0ZPUk1BVCwgMCk7CisKKyNlbHNlCisKKyAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKKyAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCisgICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKKyNpZmRlZiBMTks5NjBfTElUVExFCisgIHJldHVybiAiY29mZi1JbnRlbC1saXR0bGUiOworI2Vsc2UKKyAgcmV0dXJuICJjb2ZmLUludGVsLWJpZyI7CisjZW5kaWYKKyNlbmRpZgorCit9CisKK3N0YXRpYyBjaGFyICoKK2xuazk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKworaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCit0aGVuCisjIFNjcmlwdHMgY29tcGlsZWQgaW4uCisKKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9J3MvWyJcXF0vXFwmL2cKK3MvJC9cXG5cXC8KKzFzL14vIi8KKyRzLyQvbiIvCisnCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisgICppc2ZpbGUgPSAwOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOworICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOworICBlbHNlCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOworfQorRU9GCisKK2Vsc2UKKyMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDE7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOworICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOworICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7CisgIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKKyAgZWxzZQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOworfQorRU9GCisKK2ZpCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfbG5rOTYwX2VtdWxhdGlvbiA9IAoreworICBsbms5NjBfYmVmb3JlX3BhcnNlLAorICBsbms5NjBfc3lzbGliLAorICBsbms5NjBfaGxsLAorICBsbms5NjBfYWZ0ZXJfcGFyc2UsCisgIE5VTEwsCQkJLyogYWZ0ZXJfb3BlbiAqLworICBsbms5NjBfYWZ0ZXJfYWxsb2NhdGlvbiwKKyAgbG5rOTYwX3NldF9vdXRwdXRfYXJjaCwKKyAgbG5rOTYwX2Nob29zZV90YXJnZXQsCisgIGxuazk2MF9iZWZvcmVfYWxsb2NhdGlvbiwKKyAgbG5rOTYwX2dldF9zY3JpcHQsCisgICJsbms5NjAiLAorICAiIgorfTsKK0VPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbSBiL2xkL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyMDBjNAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0KQEAgLTAsMCArMSwyMjkgQEAKKyMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQorIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KK2NhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKy8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KKworLyogSGFuZGxlIGVtYmVkZGVkIHJlbG9jcyBmb3IgTUlQUy4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gYmFzZWQgb24gZ2VuZXJpYy5lbS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNoZWNrX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCit7CisjaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCisgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKKyNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuCisgICBXZSBjcmVhdGUgYSAucmVsLnNkYXRhIHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZSB3aXRoIGEgbm9uIHplcm8KKyAgIC5zZGF0YSBzZWN0aW9uLiAgVGhlIEJGRCBiYWNrZW5kIHdpbGwgZmlsbCBpbiB0aGVzZSBzZWN0aW9ucyB3aXRoCisgICBtYWdpYyBudW1iZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24gYXQgcnVuCisgICB0aW1lLiAgVGhpcyB3aWxsIG9ubHkgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIGFsbCB0aGUgaW5wdXQgZmlsZXMKKyAgIGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyAtbWVtYmVkZGVkLXBpYy4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCit7CisgIGJmZCAqYWJmZDsKKworICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCisgICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQorICAgIHJldHVybjsKKworICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpkYXRhc2VjOworCisgICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKKworICAgICAgLyogTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSByZWxvY19jb3VudCBmaWVsZCBoYXMgYWxyZWFkeQorICAgICAgICAgYmVlbiBzZXQgdXAuICBXZSBjb3VsZCBjYWxsIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGJ1dAorICAgICAgICAgdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIGEgbWVtb3J5IGJ1ZmZlciByYXRoZXIgdGhhbiBhIHJlbG9jCisgICAgICAgICBjb3VudC4gIFdlIGRvIG5vdCB3YW50IHRvIGNhbGwgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYywKKyAgICAgICAgIGJlY2F1c2UgYWx0aG91Z2ggaXQgd291bGQgYWx3YXlzIHdvcmsgaXQgd291bGQgZm9yY2UgdXMgdG8KKyAgICAgICAgIHJlYWQgaW4gdGhlIHJlbG9jcyBpbnRvIEJGRCBjYW5vbmljYWwgZm9ybSwgd2hpY2ggd291bGQgd2FzdGUKKyAgICAgICAgIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUgYW5kIG1lbW9yeS4gICovCisgICAgICBpZiAoZGF0YXNlYyAhPSBOVUxMICYmIGRhdGFzZWMtPnJlbG9jX2NvdW50ID4gMCkKKwl7CisJICBhc2VjdGlvbiAqcmVsc2VjOworCisJICByZWxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbC5zZGF0YSIpOworCSAgaWYgKHJlbHNlYyA9PSBOVUxMCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJlbHNlYywKKwkJCQkJICAoU0VDX0FMTE9DCisJCQkJCSAgIHwgU0VDX0xPQUQKKwkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCisJCQkJCSAgIHwgU0VDX0lOX01FTU9SWSkpCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCByZWxzZWMsIDIpCisJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsc2VjLAorCQkJCQkgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KSkKKwkgICAgZWluZm8gKCIlRiVCOiBjYW4gbm90IGNyZWF0ZSAucmVsLnNkYXRhIHNlY3Rpb246ICVFXG4iKTsKKwl9CisKKyAgICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IGFsbCBvdGhlciBkYXRhIHNlY3Rpb25zIGFyZSBlbXB0eSwgYXMgaXMKKyAgICAgICAgIHJlcXVpcmVkIGZvciBlbWJlZGRlZCBQSUMgY29kZS4gICovCisgICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGNoZWNrX3NlY3Rpb25zLCAoUFRSKSBkYXRhc2VjKTsKKyAgICB9Cit9CisKKy8qIENoZWNrIHRoYXQgb2YgdGhlIGRhdGEgc2VjdGlvbnMsIG9ubHkgdGhlIC5zZGF0YSBzZWN0aW9uIGhhcworICAgcmVsb2NzLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitjaGVja19zZWN0aW9ucyAoYWJmZCwgc2VjLCBzZGF0YXNlYykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBQVFIgc2RhdGFzZWM7Cit7CisgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpID09IDAKKyAgICAgICYmIHNlYyAhPSAoYXNlY3Rpb24gKikgc2RhdGFzZWMKKyAgICAgICYmIHNlYy0+cmVsb2NfY291bnQgIT0gMCkKKyAgICBlaW5mbyAoIiVQJVg6IHNlY3Rpb24gJXMgaGFzIHJlbG9jczsgY2FuIG5vdCB1c2UgLS1lbWJlZGRlZC1yZWxvY3NcbiIsCisJICAgYWJmZCwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbiBzaXplcyBhbmQgb2Zmc2V0cyBoYXZlCisgICBiZWVuIHNldC4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGVtYmVkZGVkIHJlbG9jcywgaXQgY2FsbHMgYSBzcGVjaWFsCisgICBCRkQgYmFja2VuZCByb3V0aW5lIHRvIGRvIHRoZSB3b3JrLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX2FsbG9jYXRpb24gKCkKK3sKKyAgYmZkICphYmZkOworCisgIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKKyAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuOworCisgIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCisgICAgeworICAgICAgYXNlY3Rpb24gKmRhdGFzZWMsICpyZWxzZWM7CisgICAgICBjaGFyICplcnJtc2c7CisKKyAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOworCisgICAgICBpZiAoZGF0YXNlYyA9PSBOVUxMIHx8IGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCisJY29udGludWU7CisKKyAgICAgIHJlbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbC5zZGF0YSIpOworICAgICAgQVNTRVJUIChyZWxzZWMgIT0gTlVMTCk7CisKKyAgICAgIGlmICghIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsICZsaW5rX2luZm8sCisJCQkJCQkgICBkYXRhc2VjLCByZWxzZWMsCisJCQkJCQkgICAmZXJybXNnKSkKKwl7CisJICBpZiAoZXJybXNnID09IE5VTEwpCisJICAgIGVpbmZvICgiJUIlWDogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJUVcbiIsCisJCSAgIGFiZmQpOworCSAgZWxzZQorCSAgICBlaW5mbyAoIiVYJUI6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVzXG4iLAorCQkgICBhYmZkLCBlcnJtc2cpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK0VPRgorCitpZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKK3RoZW4KKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKworIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCitzYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAwOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybgorRU9GCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitzZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCitlY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCisKK2Vsc2UKKyMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDE7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOworICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCisgICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOworICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7CisgIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKKyAgZWxzZQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOworfQorRU9GCisKK2ZpCisKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCit7CisgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKKyAgc3lzbGliX2RlZmF1bHQsCisgIGhsbF9kZWZhdWx0LAorICBhZnRlcl9wYXJzZV9kZWZhdWx0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uLAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAorICAiJHtFTVVMQVRJT05fTkFNRX0iLAorICAiJHtPVVRQVVRfRk9STUFUfSIKK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9wZS5lbSBiL2xkL2VtdWx0ZW1wbC9wZS5lbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmViYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHRlbXBsL3BlLmVtCkBAIC0wLDAgKzEsMTEwNCBAQAorIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCisjIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKyAgIENvcHlyaWdodCAxOTk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZvciBXSU5ET1dTX05UICovCisvKiBUaGUgb3JpZ2luYWwgZmlsZSBnZW5lcmF0ZWQgcmV0dXJuZWQgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cyBkZXBlbmRpbmcKKyAgIG9uIHdoZXRoZXIgY2VydGFpbiBzd2l0Y2hlcyB3ZXJlIHNldCwgYnV0IHRoZXNlIHN3aXRjaGVzIHBlcnRhaW4gdG8gdGhlCisgICBMaW51eCBzeXN0ZW0gYW5kIHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIG9mIGNvZmYuICBJbiB0aGUgTlQgY2FzZSwgd2UKKyAgIG9ubHkgZGV0ZXJtaW5lIGlmIHRoZSBzdWJzeXN0ZW0gaXMgY29uc29sZSBvciB3aW5kb3dzIGluIG9yZGVyIHRvIHNlbGVjdAorICAgdGhlIGNvcnJlY3QgZW50cnkgcG9pbnQgYnkgZGVmYXVsdC4gKi8gCisgIAorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZ3JhbS5oIgorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRsZXguaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZGN0b3IuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKKyNpbmNsdWRlICJkZWZmaWxlLmgiCisKKyNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9CisKK3N0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIGJvb2xlYW4gZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgorICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgY2hhciAqZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICopKTsKK3N0YXRpYyBpbnQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKK3N0YXRpYyBpbnQgZGxsOworc3RhdGljIGludCBzdXBwb3J0X29sZF9jb2RlID0gMDsKK2V4dGVybiBkZWZfZmlsZSAqcGVfZGVmX2ZpbGU7CitzdGF0aWMgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICppbWFnZV9iYXNlX3N0YXRlbWVudCA9IDA7CisKK3N0YXRpYyBjaGFyICpwZV9vdXRfZGVmX2ZpbGVuYW1lID0gMDsKK2V4dGVybiBpbnQgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nOworZXh0ZXJuIGludCBwZV9kbGxfa2lsbF9hdHM7CitleHRlcm4gaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXM7CitzdGF0aWMgaW50IHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gLTE7IC8qIDA9ZGlzYWJsZSAxPWVuYWJsZSAqLworc3RhdGljIGNoYXIgKnBlX2ltcGxpYl9maWxlbmFtZSA9IDA7CisKK2V4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7CisKK3N0YXRpYyB2b2lkCitnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKK3sKKyAgb3V0cHV0X2ZpbGVuYW1lID0gImEuZXhlIjsKKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OworI2lmZGVmIFRBUkdFVF9JU19pMzg2cGUKKyAgY29uZmlnLmhhc19zaGFyZWQgPSAxOworI2VuZGlmCit9CisMCisvKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLworCisvKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCisjZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKKyNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKKyNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCisjZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKKyNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKKyNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCisjZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQorI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKKyNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCisjZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQorI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCisjZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCisjZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCisjZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQorI2RlZmluZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERQkJKE9QVElPTl9IRUFQICsgMSkKKyNkZWZpbmUgT1BUSU9OX09VVF9ERUYJCQkoT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUgKyAxKQorI2RlZmluZSBPUFRJT05fRVhQT1JUX0FMTAkJKE9QVElPTl9PVVRfREVGICsgMSkKKyNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNQk9MUwkJKE9QVElPTl9FWFBPUlRfQUxMICsgMSkKKyNkZWZpbmUgT1BUSU9OX0tJTExfQVRTCQkJKE9QVElPTl9FWENMVURFX1NZTUJPTFMgKyAxKQorI2RlZmluZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTCQkoT1BUSU9OX0tJTExfQVRTICsgMSkKKyNkZWZpbmUgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQCShPUFRJT05fU1REQ0FMTF9BTElBU0VTICsgMSkKKyNkZWZpbmUgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKKyNkZWZpbmUgT1BUSU9OX0lNUExJQl9GSUxFTkFNRQkJKE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAgKyAxKQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KK3sKKyAgLyogUEUgb3B0aW9ucyAqLworICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9GSUxFfSwKKyAgeyJkbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTH0sCisgIHsiZmlsZS1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZJTEVfQUxJR05NRU5UfSwKKyAgeyJoZWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUFQfSwgCisgIHsiaW1hZ2UtYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1BR0VfQkFTRX0sCisgIHsibWFqb3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTn0sCisgIHsibWFqb3Itb3MtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfT1NfVkVSU0lPTn0sCisgIHsibWFqb3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKKyAgeyJtaW5vci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OfSwKKyAgeyJtaW5vci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OfSwKKyAgeyJtaW5vci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT059LAorICB7InNlY3Rpb24tYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVH0sCisgIHsic3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQUNLfSwKKyAgeyJzdWJzeXN0ZW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NVQlNZU1RFTX0sCisgIHsic3VwcG9ydC1vbGQtY29kZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VQUE9SVF9PTERfQ09ERX0sCisjaWZkZWYgVEFSR0VUX0lTX2kzODZwZQorICAvKiBnZXRvcHQgYWxsb3dzIGFiYnJldmlhdGlvbnMsIHNvIHdlIGRvIHRoaXMgdG8gc3RvcCBpdCBmcm9tIHRyZWF0aW5nIC1vCisgICAgIGFzIGFuIGFiYnJldmlhdGlvbiBmb3IgdGhpcyBvcHRpb24gKi8KKyAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRfREVGfSwKKyAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRfREVGfSwKKyAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTEx9LAorICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1CT0xTfSwKKyAgeyJraWxsLWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9LSUxMX0FUU30sCisgIHsiYWRkLXN0ZGNhbGwtYWxpYXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NURENBTExfQUxJQVNFU30sCisgIHsiZW5hYmxlLXN0ZGNhbGwtZml4dXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VOQUJMRV9TVERDQUxMX0ZJWFVQfSwKKyAgeyJkaXNhYmxlLXN0ZGNhbGwtZml4dXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUH0sCisgIHsib3V0LWltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QTElCX0ZJTEVOQU1FfSwKKyNlbmRpZgorICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Cit9OworCisKKy8qIFBFL1dJTjMyOyBhZGRlZCByb3V0aW5lcyB0byBnZXQgdGhlIHN1YnN5c3RlbSB0eXBlLCBoZWFwIGFuZC9vciBzdGFjaworICAgcGFyYW1ldGVycyB3aGljaCBtYXkgYmUgaW5wdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHZvaWQgKnB0cjsKKyAgaW50IHNpemU7CisgIGludCB2YWx1ZTsKKyAgY2hhciAqc3ltYm9sOworICBpbnQgaW5pdGVkOworfSBkZWZpbmZvOworCisjZGVmaW5lIEQoZmllbGQsc3ltYm9sLGRlZikgIHsmcGUuZmllbGQsc2l6ZW9mKHBlLmZpZWxkKSwgZGVmLCBzeW1ib2wsMH0KKworc3RhdGljIGRlZmluZm8gaW5pdFtdID0KK3sKKyAgLyogaW1hZ2ViYXNlIG11c3QgYmUgZmlyc3QgKi8KKyNkZWZpbmUgSU1BR0VCQVNFT0ZGIDAKKyAgRChJbWFnZUJhc2UsIl9faW1hZ2VfYmFzZV9fIiwgTlRfRVhFX0lNQUdFX0JBU0UpLAorI2RlZmluZSBETExPRkYgMQorICB7JmRsbCwgc2l6ZW9mKGRsbCksIDAsICJfX2RsbF9fIn0sCisgIEQoU2VjdGlvbkFsaWdubWVudCwiX19zZWN0aW9uX2FsaWdubWVudF9fIiwgUEVfREVGX1NFQ1RJT05fQUxJR05NRU5UKSwKKyAgRChGaWxlQWxpZ25tZW50LCJfX2ZpbGVfYWxpZ25tZW50X18iLCBQRV9ERUZfRklMRV9BTElHTk1FTlQpLAorICBEKE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19tYWpvcl9vc192ZXJzaW9uX18iLCA0KSwKKyAgRChNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWlub3Jfb3NfdmVyc2lvbl9fIiwgMCksCisgIEQoTWFqb3JJbWFnZVZlcnNpb24sIl9fbWFqb3JfaW1hZ2VfdmVyc2lvbl9fIiwgMSksCisgIEQoTWlub3JJbWFnZVZlcnNpb24sIl9fbWlub3JfaW1hZ2VfdmVyc2lvbl9fIiwgMCksCisgIEQoTWFqb3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCA0KSwKKyAgRChNaW5vclN1YnN5c3RlbVZlcnNpb24sIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDApLAorICBEKFN1YnN5c3RlbSwiX19zdWJzeXN0ZW1fXyIsIDMpLAorICBEKFNpemVPZlN0YWNrUmVzZXJ2ZSwiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsIDB4MjAwMDAwMCksCisgIEQoU2l6ZU9mU3RhY2tDb21taXQsIl9fc2l6ZV9vZl9zdGFja19jb21taXRfXyIsIDB4MTAwMCksCisgIEQoU2l6ZU9mSGVhcFJlc2VydmUsIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIsIDB4MTAwMDAwKSwKKyAgRChTaXplT2ZIZWFwQ29tbWl0LCJfX3NpemVfb2ZfaGVhcF9jb21taXRfXyIsIDB4MTAwMCksCisgIEQoTG9hZGVyRmxhZ3MsIl9fbG9hZGVyX2ZsYWdzX18iLCAweDApLAorICB7IE5VTEwsIDAsIDAsIE5VTEwsIDAgfQorfTsKKworc3RhdGljIHZvaWQKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgKGZpbGUpCisgICAgIEZJTEUgKiBmaWxlOworeworICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tYmFzZV9maWxlIDxiYXNlZmlsZT4gICAgICAgICAgICAgR2VuZXJhdGUgYSBiYXNlIGZpbGUgZm9yIHJlbG9jYXRhYmxlIERMTHNcbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLWRsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBpbWFnZSBiYXNlIHRvIHRoZSBkZWZhdWx0IGZvciBETExzXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1maWxlLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICAgICBTZXQgZmlsZSBhbGlnbm1lbnRcbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLWhlYXAgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgIFNldCBpbml0aWFsIHNpemUgb2YgdGhlIGhlYXBcbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLWltYWdlLWJhc2UgPGFkZHJlc3M+ICAgICAgICAgICAgIFNldCBzdGFydCBhZGRyZXNzIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1tYWpvci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1ham9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHZlcnNpb25cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSB2ZXJzaW9uXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1taW5vci1pbWFnZS12ZXJzaW9uIDxudW1iZXI+ICAgICBTZXQgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1taW5vci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyByZXZpc2lvblxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIHJldmlzaW9uXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zZWN0aW9uLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICBTZXQgc2VjdGlvbiBhbGlnbm1lbnRcbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN0YWNrIDxzaXplPiAgICAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHRoZSBpbml0aWFsIHN0YWNrXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdWJzeXN0ZW0gPG5hbWU+Wzo8dmVyc2lvbj5dICAgICBTZXQgcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIFsmIHZlcnNpb25dXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgICAgICAgICAgICAgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iKSk7CisjaWZkZWYgVEFSR0VUX0lTX2kzODZwZQorICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgICAgICAgICAgICAgRXhwb3J0IHN5bWJvbHMgd2l0aCBhbmQgd2l0aG91dCBAbm5cbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgIERvbid0IGxpbmsgX3N5bSB0byBfc3ltQG5uXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1lbmFibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgICBMaW5rIF9zeW0gdG8gX3N5bUBubiB3aXRob3V0IHdhcm5pbmdzXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1leGNsdWRlLXN5bWJvbHMgc3ltLHN5bSwuLi4gICAgICBFeGNsdWRlIHN5bWJvbHMgZnJvbSBhdXRvbWF0aWMgZXhwb3J0XG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGV4cG9ydCBhbGwgZ2xvYmFscyB0byBETExcbiIpKTsKKyAgZnByaW50ZiAoZmlsZSwgXygiICAtLWtpbGwtYXQgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBAbm4gZnJvbSBleHBvcnRlZCBzeW1ib2xzXG4iKSk7CisgIGZwcmludGYgKGZpbGUsIF8oIiAgLS1vdXQtaW1wbGliIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBpbXBvcnQgbGlicmFyeVxuIikpOworICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tb3V0cHV0LWRlZiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgYSAuREVGIGZpbGUgZm9yIHRoZSBidWlsdCBETExcbiIpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorc2V0X3BlX25hbWUgKG5hbWUsIHZhbCkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgbG9uZyB2YWw7Cit7CisgIGludCBpOworICAvKiBGaW5kIHRoZSBuYW1lIGFuZCBzZXQgaXQuICovCisgIGZvciAoaSA9IDA7IGluaXRbaV0ucHRyOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobmFtZSwgaW5pdFtpXS5zeW1ib2wpID09IDApCisJeworCSAgaW5pdFtpXS52YWx1ZSA9IHZhbDsKKwkgIGluaXRbaV0uaW5pdGVkID0gMTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorICBhYm9ydCgpOworfQorCisKK3N0YXRpYyB2b2lkCitzZXRfcGVfc3Vic3lzdGVtICgpCit7CisgIGNvbnN0IGNoYXIgKnN2ZXI7CisgIGludCBsZW47CisgIGludCBpOworICBzdGF0aWMgY29uc3Qgc3RydWN0IAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBjb25zdCBpbnQgdmFsdWU7CisgICAgICBjb25zdCBjaGFyICplbnRyeTsKKyAgICB9CisgIHZbXSA9CisgICAgeworICAgICAgeyAibmF0aXZlIiwgMSwgIl9OdFByb2Nlc3NTdGFydHVwIiB9LAorICAgICAgeyAid2luZG93cyIsIDIsICJfV2luTWFpbkNSVFN0YXJ0dXAiIH0sCisgICAgICB7ICJjb25zb2xlIiwgMywgIl9tYWluQ1JUU3RhcnR1cCIgfSwKKyNpZiAwCisgICAgICAvKiBUaGUgTWljcm9zb2Z0IGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUgdGhpcy4gICovCisgICAgICB7ICJvczIiLCA1LCAiIiB9LAorI2VuZGlmCisgICAgICB7ICJwb3NpeCIsIDcsICJfX19Qb3NpeFByb2Nlc3NTdGFydHVwIn0sCisgICAgICB7IDAsIDAsIDAgfQorICAgIH07CisKKyAgc3ZlciA9IHN0cmNociAob3B0YXJnLCAnOicpOworICBpZiAoc3ZlciA9PSBOVUxMKQorICAgIGxlbiA9IHN0cmxlbiAob3B0YXJnKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKmVuZDsKKworICAgICAgbGVuID0gc3ZlciAtIG9wdGFyZzsKKyAgICAgIHNldF9wZV9uYW1lICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKKwkJICAgc3RydG91bCAoc3ZlciArIDEsICZlbmQsIDApKTsKKyAgICAgIGlmICgqZW5kID09ICcuJykKKwlzZXRfcGVfbmFtZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCisJCSAgICAgc3RydG91bCAoZW5kICsgMSwgJmVuZCwgMCkpOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIikpOworICAgIH0KKworICBmb3IgKGkgPSAwOyB2W2ldLm5hbWU7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RybmNtcCAob3B0YXJnLCB2W2ldLm5hbWUsIGxlbikgPT0gMAorCSAgJiYgdltpXS5uYW1lW2xlbl0gPT0gJ1wwJykKKwl7CisJICBzZXRfcGVfbmFtZSAoIl9fc3Vic3lzdGVtX18iLCB2W2ldLnZhbHVlKTsKKworCSAgbGFuZ19hZGRfZW50cnkgKHZbaV0uZW50cnksIDEpOworCisJICByZXR1cm47CisJfQorICAgIH0KKyAgCisgIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iKSwgb3B0YXJnKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitzZXRfcGVfdmFsdWUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIAoreworICBjaGFyICplbmQ7CisgIAorICBzZXRfcGVfbmFtZSAobmFtZSwgIHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCkpOworICAKKyAgaWYgKGVuZCA9PSBvcHRhcmcpCisgICAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOworCisgIG9wdGFyZyA9IGVuZDsKK30KKworc3RhdGljIHZvaWQKK3NldF9wZV9zdGFja19oZWFwIChyZXNuYW1lLCBjb21uYW1lKQorICAgICBjaGFyICpyZXNuYW1lOworICAgICBjaGFyICpjb21uYW1lOworeworICBzZXRfcGVfdmFsdWUgKHJlc25hbWUpOworICAKKyAgaWYgKCpvcHRhcmcgPT0gJywnKQorICAgIHsKKyAgICAgIG9wdGFyZysrOworICAgICAgc2V0X3BlX3ZhbHVlIChjb21uYW1lKTsKKyAgICB9CisgIGVsc2UgaWYgKCpvcHRhcmcpCisgICAgZWluZm8gKF8oIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iKSwgb3B0YXJnKTsKK30KKworCisKK3N0YXRpYyBpbnQKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGxvbmdpbmQ7CisgIGludCBvcHRjOworICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKKyAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7CisgIGludCB3YW50ZXJyb3I7CisgIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOworCisgIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKKyAgICBvcHRlcnIgPSAwOworICB3YW50ZXJyb3IgPSBvcHRlcnI7CisKKyAgbGFzdG9wdGluZCA9IG9wdGluZDsKKworICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJmxvbmdpbmQpOworICBvcHRlcnIgPSBwcmV2b3B0ZXJyOworCisgIHN3aXRjaCAob3B0YykKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICh3YW50ZXJyb3IpCisJeGV4aXQgKDEpOworICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKKyAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7CisgICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQorCXsKKwkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIiksCisJCSAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKKwkgIHhleGl0ICgxKTsKKwl9CisgICAgICBicmVhazsKKworICAgICAgLyogUEUgb3B0aW9ucyAqLworICAgIGNhc2UgT1BUSU9OX0hFQVA6IAorICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAiX19zaXplX29mX2hlYXBfY29tbWl0X18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX1NUQUNLOiAKKyAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsICJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX1NVQlNZU1RFTToKKyAgICAgIHNldF9wZV9zdWJzeXN0ZW0gKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9vc192ZXJzaW9uX18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX01JTk9SX09TX1ZFUlNJT046CisgICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX29zX3ZlcnNpb25fXyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT046CisgICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT046CisgICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fRklMRV9BTElHTk1FTlQ6CisgICAgICBzZXRfcGVfdmFsdWUgKCJfX2ZpbGVfYWxpZ25tZW50X18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UOgorICAgICAgc2V0X3BlX3ZhbHVlICgiX19zZWN0aW9uX2FsaWdubWVudF9fIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9ETEw6CisgICAgICBzZXRfcGVfbmFtZSAoIl9fZGxsX18iLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX0lNQUdFX0JBU0U6CisgICAgICBzZXRfcGVfdmFsdWUgKCJfX2ltYWdlX2Jhc2VfXyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERToKKyAgICAgIHN1cHBvcnRfb2xkX2NvZGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fT1VUX0RFRjoKKyAgICAgIHBlX291dF9kZWZfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fRVhQT1JUX0FMTDoKKyAgICAgIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9FWENMVURFX1NZTUJPTFM6CisjaWZkZWYgVEFSR0VUX0lTX2kzODZwZQorICAgICAgcGVfZGxsX2FkZF9leGNsdWRlcyAob3B0YXJnKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fS0lMTF9BVFM6CisgICAgICBwZV9kbGxfa2lsbF9hdHMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUFRJT05fU1REQ0FMTF9BTElBU0VTOgorICAgICAgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUDoKKyAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX0RJU0FCTEVfU1REQ0FMTF9GSVhVUDoKKyAgICAgIHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BUSU9OX0lNUExJQl9GSUxFTkFNRToKKyAgICAgIHBlX2ltcGxpYl9maWxlbmFtZSA9IHhzdHJkdXAgKG9wdGFyZyk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAxOworfQorDAorLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcworICAgcmVhZC4gICovCisKK3N0YXRpYyB2b2lkCitnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKK3sKKyAgLyogUnVuIHRocm91Z2ggYW5kIGludmVudCBzeW1ib2xzIGZvciBhbGwgdGhlCisgICAgIG5hbWVzIGFuZCBpbnNlcnQgdGhlIGRlZmF1bHRzLiAqLworICBpbnQgajsKKyAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzYXZlOworCisgIGlmICghaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCkKKyAgICB7CisgICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKKwlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSAwOworICAgICAgZWxzZSBpZiAoaW5pdFtETExPRkZdLnZhbHVlIHx8IGxpbmtfaW5mby5zaGFyZWQpCisJaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRExMX0lNQUdFX0JBU0U7CisgICAgICBlbHNlCisJaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRVhFX0lNQUdFX0JBU0U7CisgICAgfQorCisgIC8qIERvbid0IGRvIGFueSBzeW1ib2wgYXNzaWdubWVudHMgaWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuOworCisgIC8qIEdsdWUgdGhlIGFzc2lnbm1lbnRzIGludG8gdGhlIGFicyBzZWN0aW9uICovCisgIHNhdmUgPSBzdGF0X3B0cjsKKworICBzdGF0X3B0ciA9ICYoYWJzX291dHB1dF9zZWN0aW9uLT5jaGlsZHJlbik7CisKKyAgZm9yIChqID0gMDsgaW5pdFtqXS5wdHI7IGorKykKKyAgICB7CisgICAgICBsb25nIHZhbCA9IGluaXRbal0udmFsdWU7CisgICAgICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKnJ2OworICAgICAgcnYgPSBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JyAsaW5pdFtqXS5zeW1ib2wsIGV4cF9pbnRvcCAodmFsKSkpOworICAgICAgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKQorCSooc2hvcnQgKilpbml0W2pdLnB0ciA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoaW50KSkKKwkqKGludCAqKWluaXRbal0ucHRyID0gdmFsOworICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihsb25nKSkKKwkqKGxvbmcgKilpbml0W2pdLnB0ciA9IHZhbDsKKyAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBsb25nIGxvbmcgb3Igb3RoZXIgc3BlY2lhbCB0eXBlLiAgKi8KKyAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoYmZkX3ZtYSkpCisJKihiZmRfdm1hICopaW5pdFtqXS5wdHIgPSB2YWw7CisgICAgICBlbHNlCWFib3J0KCk7CisgICAgICBpZiAoaiA9PSBJTUFHRUJBU0VPRkYpCisJaW1hZ2VfYmFzZV9zdGF0ZW1lbnQgPSBydjsKKyAgICB9CisgIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCisgIHN0YXRfcHRyID0gc2F2ZTsKKyAgCisgIGlmIChwZS5GaWxlQWxpZ25tZW50ID4KKyAgICAgIHBlLlNlY3Rpb25BbGlnbm1lbnQpCisgICAgeworICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIikpOworICAgIH0KK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmtlciBzY3JpcHQgYW5kIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgaGF2ZSBiZWVuIHJlYWQuICAqLworCitzdGF0aWMgdm9pZAorZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlICgpCit7CisgIC8qIFRoZSBXaW5kb3dzIGxpYnJhcmllcyBhcmUgZGVzaWduZWQgZm9yIHRoZSBsaW5rZXIgdG8gdHJlYXQgdGhlCisgICAgIGVudHJ5IHBvaW50IGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBPdGhlcndpc2UsIHRoZSAub2JqIHRoYXQKKyAgICAgZGVmaW5lcyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0CisgICAgIGVuY291bnRlcmVkIGluIGxpYmMubGliIGFuZCBpdCBoYXMgb3RoZXIgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsCisgICAgIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluayBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgYWN0IGFzCisgICAgIHRob3VnaCB0aGUgdXNlciBzcGVjaWZpZWQgLXUgd2l0aCB0aGUgZW50cnkgcG9pbnQgc3ltYm9sLgorCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBjb21tYW5kIGxpbmUKKyAgICAgb3B0aW9ucyBoYXZlIGJlZW4gcmVhZCwgc28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByaWdodCBlbnRyeQorICAgICBwb2ludC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlCisgICAgIG9wZW5lZCwgc28gcmVnaXN0ZXJpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQgd2lsbCBtYWtlIGEKKyAgICAgZGlmZmVyZW5jZS4gICovCisKKyAgaWYgKGVudHJ5X3N5bWJvbCkKKyAgICBsZGxhbmdfYWRkX3VuZGVmIChlbnRyeV9zeW1ib2wpOworfQorCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnBlX3VuZGVmX2ZvdW5kX3N5bTsKKworc3RhdGljIGJvb2xlYW4KK3BlX3VuZGVmX2NkZWNsX21hdGNoIChoLCBzdHJpbmcpCisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworICBQVFIgc3RyaW5nOworeworICBpbnQgc2wgPSBzdHJsZW4gKHN0cmluZyk7CisgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5zdHJpbmcsIHN0cmluZywgc2wpID09IDAKKyAgICAgICYmIGgtPnJvb3Quc3RyaW5nW3NsXSA9PSAnQCcpCisgIHsKKyAgICBwZV91bmRlZl9mb3VuZF9zeW0gPSBoOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK3BlX2ZpeHVwX3N0ZGNhbGxzICgpCit7CisgIHN0YXRpYyBpbnQgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAwOworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWYsICpzeW07CisgIGNoYXIgKmF0OworICBmb3IgKHVuZGVmID0gbGlua19pbmZvLmhhc2gtPnVuZGVmczsgdW5kZWY7IHVuZGVmPXVuZGVmLT5uZXh0KQorICAgIGlmICh1bmRlZi0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKyAgICB7CisgICAgICBhdCA9IHN0cmNociAodW5kZWYtPnJvb3Quc3RyaW5nLCAnQCcpOworICAgICAgaWYgKGF0KQorICAgICAgeworCS8qIFRoZSBzeW1ib2wgaXMgYSBzdGRjYWxsIHN5bWJvbCwgc28gbGV0J3MgbG9vayBmb3IgYSBjZGVjbAorCSAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlc29sdmUgdG8gdGhhdCAqLworCWNoYXIgKmNuYW1lID0geHN0cmR1cCAodW5kZWYtPnJvb3Quc3RyaW5nKTsKKwlhdCA9IHN0cmNociAoY25hbWUsICdAJyk7CisJKmF0ID0gMDsKKwlzeW0gPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGNuYW1lLCAwLCAwLCAxKTsKKwlpZiAoc3ltICYmIHN5bS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCisJeworCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisJICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOworCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247CisJICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCisJICAgIHsKKwkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAorCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgY25hbWUpOworCSAgICAgIGlmICghIGdhdmVfd2FybmluZ19tZXNzYWdlKQorCQl7CisJCSAgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAxOworCQkgIGVpbmZvKF8oIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIpKTsKKwkJICBlaW5mbyhfKCJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIpKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCS8qIFRoZSBzeW1ib2wgaXMgYSBjZGVjbCBzeW1ib2wsIHNvIHdlIGxvb2sgZm9yIHN0ZGNhbGwKKwkgICBzeW1ib2xzIC0gd2hpY2ggbWVhbnMgc2Nhbm5pbmcgdGhlIHdob2xlIHN5bWJvbCB0YWJsZSAqLworCXBlX3VuZGVmX2ZvdW5kX3N5bSA9IDA7CisJYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHBlX3VuZGVmX2NkZWNsX21hdGNoLAorCQkJCShQVFIpIHVuZGVmLT5yb290LnN0cmluZyk7CisJc3ltID0gcGVfdW5kZWZfZm91bmRfc3ltOworCWlmIChzeW0pCisJeworCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisJICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOworCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247CisJICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCisJICAgIHsKKwkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAorCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgc3ltLT5yb290LnN0cmluZyk7CisJICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCisJCXsKKwkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7CisJCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOworCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOworCQl9CisJICAgIH0KKwl9CisgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKK3sKKyAgLyogUGFzcyB0aGUgd2Fja3kgUEUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0IGJmZC4KKyAgICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGJ5CisgICAgIGluY2x1ZGluZyBhbiBpbnRlcm5hbCBCRkQgaGVhZGVyLiAgKi8KKyAgCisgIGlmICghY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCisgICAgZWluZm8gKF8oIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iKSk7CisKKyAgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOworICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+ZGxsID0gaW5pdFtETExPRkZdLnZhbHVlOworCisjaWZkZWYgVEFSR0VUX0lTX2kzODZwZQorICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXApIC8qIC0xPXdhcm4gb3IgMT1kaXNhYmxlICovCisgICAgcGVfZml4dXBfc3RkY2FsbHMgKCk7CisKKyAgcGVfcHJvY2Vzc19pbXBvcnRfZGVmcyhvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKKyAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCisgICAgcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX0lTX2FybXBlCisgIHsKKyAgICAvKiBGaW5kIGEgQkZEIHRoYXQgY2FuIGhvbGQgdGhlIGludGVyd29ya2luZyBzdHVicy4gICovCisgICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQorICAgICAgeworCWlmIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyAoaXMtPnRoZV9iZmQsICYgbGlua19pbmZvKSkKKwkgIGJyZWFrOworICAgICAgfQorICB9CisjZW5kaWYKK30KKwwKK3N0YXRpYyB2b2lkICAKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCit7CisjaWZkZWYgVEFSR0VUX0lTX3BwY3BlCisgIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCisgIHsKKyAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgICB7CisJaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQorCSAgeworCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiksIGlzLT5maWxlbmFtZSk7CisJICB9CisgICAgICB9CisgIH0KKworICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCisgIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7CisjZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCisKKyNpZmRlZiBUQVJHRVRfSVNfYXJtcGUKKyAgLyogRklYTUU6IHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIKKyAgICAgc2VjdGlvbi4KKworICAgICBIZXJlIHdlIHJ1bW1hZ2UgdGhyb3VnaCB0aGUgZm91bmQgYmZkcyB0byBjb2xsZWN0IGdsdWUKKyAgICAgaW5mb3JtYXRpb24uICBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUKKyAgICAgb3B0aW9uPyAga3JrQGN5Z251cy5jb20gKi8KKyAgeworICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKKyAgICAgIHsKKwlpZiAoISBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KKwkgICAgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbywgc3VwcG9ydF9vbGRfY29kZSkpCisJICB7CisJICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIGZvciBpbnRlcndvcmtpbmciKSwKKwkJICAgaXMtPmZpbGVuYW1lKTsKKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIC8qIFdlIGhhdmUgc2VlbiBpdCBhbGwuIEFsbG9jYXRlIGl0LCBhbmQgY2Fycnkgb24gKi8KKyAgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKKyNlbmRpZiAvKiBUQVJHRVRfSVNfYXJtcGUgKi8KK30KKwwKKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnB1dCBmaWxlIGlzbid0IHJlY29nbml6ZWQgYXMgYSBCRkQuICBXZQorICAgY2hlY2sgaGVyZSBmb3IgLkRFRiBmaWxlcyBhbmQgcHVsbCB0aGVtIGluIGF1dG9tYXRpY2FsbHkuICovCisKK3N0YXRpYyBpbnQKK3Nhd19vcHRpb24oY2hhciAqb3B0aW9uKQoreworICBpbnQgaTsKKyAgZm9yIChpPTA7IGluaXRbaV0ucHRyOyBpKyspCisgICAgaWYgKHN0cmNtcCAoaW5pdFtpXS5zeW1ib2wsIG9wdGlvbikgPT0gMCkKKyAgICAgIHJldHVybiBpbml0W2ldLmluaXRlZDsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sZWFuCitnbGRfJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUoZW50cnkpCisgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OworeworI2lmZGVmIFRBUkdFVF9JU19pMzg2cGUKKyAgY29uc3QgY2hhciAqZXh0ID0gZW50cnktPmZpbGVuYW1lICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpIC0gNDsKKworICBpZiAoc3RyY21wIChleHQsICIuZGVmIikgPT0gMCB8fCBzdHJjbXAgKGV4dCwgIi5ERUYiKSA9PSAwKQorICB7CisgICAgaWYgKHBlX2RlZl9maWxlID09IDApCisgICAgICBwZV9kZWZfZmlsZSA9IGRlZl9maWxlX2VtcHR5ICgpOworICAgIGRlZl9maWxlX3BhcnNlIChlbnRyeS0+ZmlsZW5hbWUsIHBlX2RlZl9maWxlKTsKKyAgICBpZiAocGVfZGVmX2ZpbGUpCisgICAgeworICAgICAgaW50IGksIGJ1Zmxlbj0wLCBsZW47CisgICAgICBjaGFyICpidWY7CisgICAgICBmb3IgKGk9MDsgaTxwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHM7IGkrKykKKwl7CisJICBsZW4gPSBzdHJsZW4ocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7CisJICBpZiAoYnVmbGVuIDwgbGVuKzIpCisJICAgIGJ1ZmxlbiA9IGxlbisyOworCX0KKyAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGJ1Zmxlbik7CisgICAgICBmb3IgKGk9MDsgaTxwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHM7IGkrKykKKwl7CisJICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKwkgIHNwcmludGYoYnVmLCAiXyVzIiwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSk7CisKKwkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGJ1ZiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisJICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwkgICAgZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKKwkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQorCSAgICB7CisJICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOworCSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IE5VTEw7CisJICAgICAgYmZkX2xpbmtfYWRkX3VuZGVmIChsaW5rX2luZm8uaGFzaCwgaCk7CisJICAgIH0KKwl9CisgICAgICBmcmVlIChidWYpOworCisgICAgICAvKiBkZWZfZmlsZV9wcmludCAoc3Rkb3V0LCBwZV9kZWZfZmlsZSk7ICovCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPmlzX2RsbCA9PSAxKQorCWxpbmtfaW5mby5zaGFyZWQgPSAxOworCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPmJhc2VfYWRkcmVzcyAhPSAoYmZkX3ZtYSkoLTEpKQorICAgICAgeworCXBlLkltYWdlQmFzZSA9CisJcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2UgPQorCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IHBlX2RlZl9maWxlLT5iYXNlX2FkZHJlc3M7CisJaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCA9IDE7CisJaWYgKGltYWdlX2Jhc2Vfc3RhdGVtZW50KQorCSAgaW1hZ2VfYmFzZV9zdGF0ZW1lbnQtPmV4cCA9CisJICAgIGV4cF9hc3NvcCAoJz0nLCAiX19pbWFnZV9iYXNlX18iLCBleHBfaW50b3AgKHBlLkltYWdlQmFzZSkpOworICAgICAgfQorCisjaWYgMAorICAgICAgLyogTm90IHN1cmUgaWYgdGhlc2UgKnNob3VsZCogYmUgc2V0ICovCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IgIT0gLTEpCisgICAgICB7CisJcGUuTWFqb3JJbWFnZVZlcnNpb24gPSBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvcjsKKwlwZS5NaW5vckltYWdlVmVyc2lvbiA9IHBlX2RlZl9maWxlLT52ZXJzaW9uX21pbm9yOworICAgICAgfQorI2VuZGlmCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUgIT0gLTEKKwkgICYmICEgc2F3X29wdGlvbiAoIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iKSkKKyAgICAgIHsKKwlwZS5TaXplT2ZTdGFja1Jlc2VydmUgPSBwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZTsKKwlpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX2NvbW1pdCAhPSAtMSkKKwkgIHBlLlNpemVPZlN0YWNrQ29tbWl0ID0gcGVfZGVmX2ZpbGUtPnN0YWNrX2NvbW1pdDsKKyAgICAgIH0KKyAgICAgIGlmIChwZV9kZWZfZmlsZS0+aGVhcF9yZXNlcnZlICE9IC0xCisJICAmJiAhIHNhd19vcHRpb24gKCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iKSkKKyAgICAgIHsKKwlwZS5TaXplT2ZIZWFwUmVzZXJ2ZSA9IHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmU7CisJaWYgKHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdCAhPSAtMSkKKwkgIHBlLlNpemVPZkhlYXBDb21taXQgPSBwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQ7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gZmFsc2U7CisgIAorfQorCitzdGF0aWMgYm9vbGVhbgorZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3JlY29nbml6ZWRfZmlsZShlbnRyeSkKKyAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Cit7CisjaWZkZWYgVEFSR0VUX0lTX2kzODZwZQorICBpZiAoYmZkX2dldF9mb3JtYXQgKGVudHJ5LT50aGVfYmZkKSA9PSBiZmRfb2JqZWN0KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmV4dCA9IGVudHJ5LT5maWxlbmFtZSArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKSAtIDQ7CisgICAgICBpZiAoc3RyY21wIChleHQsICIuZGxsIikgPT0gMCB8fCBzdHJjbXAgKGV4dCwgIi5ETEwiKSA9PSAwKQorCXJldHVybiBwZV9pbXBsaWVkX2ltcG9ydF9kbGwgKGVudHJ5LT5maWxlbmFtZSk7CisgICAgfQorI2VuZGlmCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggKCkKK3sKKyNpZmRlZiBUQVJHRVRfSVNfaTM4NnBlCisgIGlmIChsaW5rX2luZm8uc2hhcmVkKQorICAgIHsKKyAgICAgIHBlX2RsbF9maWxsX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKKyAgICAgIGlmIChwZV9pbXBsaWJfZmlsZW5hbWUpCisJcGVfZGxsX2dlbmVyYXRlX2ltcGxpYiAocGVfZGVmX2ZpbGUsIHBlX2ltcGxpYl9maWxlbmFtZSk7CisgICAgfQorICBpZiAocGVfb3V0X2RlZl9maWxlbmFtZSkKKyAgICBwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUgKHBlX291dF9kZWZfZmlsZW5hbWUpOworI2VuZGlmCit9CisKKwwKKy8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLgorCisgICBXZSB1c2UgdGhpcyB0byBwdXQgc2VjdGlvbnMgaW4gYSByZWFzb25hYmxlIHBsYWNlIGluIHRoZSBmaWxlLCBhbmQKKyAgIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIGFsaWduZWQgYXMgcmVxdWlyZWQuCisKKyAgIFdlIGhhbmRsZSBncm91cGVkIHNlY3Rpb25zIGhlcmUgYXMgd2VsbC4gIEEgc2VjdGlvbiBuYW1lZCAuZm9vJG5uCisgICBnb2VzIGludG8gdGhlIG91dHB1dCBzZWN0aW9uIC5mb28uICBBbGwgZ3JvdXBlZCBzZWN0aW9ucyBhcmUgc29ydGVkCisgICBieSBuYW1lLgorCisgICBHcm91cGVkIHNlY3Rpb25zIGZvciB0aGUgZGVmYXVsdCBzZWN0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUKKyAgIGRlZmF1bHQgbGlua2VyIHNjcmlwdCB1c2luZyB3aWxkY2FyZHMsIGFuZCBhcmUgc29ydGVkIGJ5CisgICBzb3J0X3NlY3Rpb25zLiAgKi8KKworc3RhdGljIGFzZWN0aW9uICpob2xkX3NlY3Rpb247CitzdGF0aWMgY2hhciAqaG9sZF9zZWN0aW9uX25hbWU7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF91c2U7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF90ZXh0Oworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmRhdGE7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOworCisvKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCisgICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7CisgICAgIGFzZWN0aW9uICpzOworeworICBjb25zdCBjaGFyICpzZWNuYW1lOworICBjaGFyICpkb2xsYXI7CisKKyAgaWYgKChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzLT5vd25lciwgcyk7CisKKyAgLyogTG9vayB0aHJvdWdoIHRoZSBzY3JpcHQgdG8gc2VlIHdoZXJlIHRvIHBsYWNlIHRoaXMgc2VjdGlvbi4gICovCisKKyAgaG9sZF9zZWN0aW9uID0gczsKKworICBob2xkX3NlY3Rpb25fbmFtZSA9IHhzdHJkdXAgKHNlY25hbWUpOworICBkb2xsYXIgPSBzdHJjaHIgKGhvbGRfc2VjdGlvbl9uYW1lLCAnJCcpOworICBpZiAoZG9sbGFyICE9IE5VTEwpCisgICAgKmRvbGxhciA9ICdcMCc7CisKKyAgaG9sZF91c2UgPSBOVUxMOworICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik7CisKKyAgaWYgKGhvbGRfdXNlID09IE5VTEwpCisgICAgeworICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcGxhY2U7CisgICAgICBjaGFyICpvdXRzZWNuYW1lOworICAgICAgYXNlY3Rpb24gKnNuZXcsICoqcHBzOworICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpvbGQ7CisgICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOworICAgICAgZXRyZWVfdHlwZSAqYWRkcmVzczsKKworICAgICAgLyogVHJ5IHRvIHB1dCB0aGUgbmV3IG91dHB1dCBzZWN0aW9uIGluIGEgcmVhc29uYWJsZSBwbGFjZSBiYXNlZAorCSBvbiB0aGUgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgKi8KKyAgICAgIHBsYWNlID0gTlVMTDsKKyAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCisJICAmJiBob2xkX2JzcyAhPSBOVUxMKQorCXBsYWNlID0gaG9sZF9ic3M7CisgICAgICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKKwkgICAgICAgJiYgaG9sZF9kYXRhICE9IE5VTEwpCisJcGxhY2UgPSBob2xkX2RhdGE7CisgICAgICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAorCSAgICAgICAmJiAocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKKwkgICAgICAgJiYgaG9sZF9yZGF0YSAhPSBOVUxMKQorCXBsYWNlID0gaG9sZF9yZGF0YTsKKyAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAorCSAgICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKKwlwbGFjZSA9IGhvbGRfdGV4dDsKKworICAgICAgLyogQ2hvb3NlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBzZWN0aW9uLiAgVGhpcyB3aWxsIGJlIG5lZWRlZCBpZgorCSB0aGUgc2FtZSBzZWN0aW9uIG5hbWUgYXBwZWFycyBpbiB0aGUgaW5wdXQgZmlsZSB3aXRoCisJIGRpZmZlcmVudCBsb2FkYWJsZSBvciBhbGxvY2F0ZWFibGUgY2hhcmFjdGVyaXN0aWNzLiAgKi8KKyAgICAgIG91dHNlY25hbWUgPSB4c3RyZHVwIChob2xkX3NlY3Rpb25fbmFtZSk7CisgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dHNlY25hbWUpICE9IE5VTEwpCisJeworCSAgdW5zaWduZWQgaW50IGxlbjsKKwkgIGNoYXIgKm5ld25hbWU7CisJICB1bnNpZ25lZCBpbnQgaTsKKworCSAgbGVuID0gc3RybGVuIChvdXRzZWNuYW1lKTsKKwkgIG5ld25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKKwkgIHN0cmNweSAobmV3bmFtZSwgb3V0c2VjbmFtZSk7CisJICBpID0gMDsKKwkgIGRvCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChuZXduYW1lICsgbGVuLCAiJWQiLCBpKTsKKwkgICAgICArK2k7CisJICAgIH0KKwkgIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmV3bmFtZSkgIT0gTlVMTCk7CisKKwkgIGZyZWUgKG91dHNlY25hbWUpOworCSAgb3V0c2VjbmFtZSA9IG5ld25hbWU7CisJfQorCisgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGZyZWUgT1VUU0VDTkFNRSwgYXMgaXQgbWF5IGdldCBhdHRhY2hlZCB0bworCSB0aGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50LiAgKi8KKworICAgICAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHB1dCBpdCBpbiB0aGUKKwkgcmlnaHQgcGxhY2UuICBUaGlzIHNodWZmbGluZyBpcyB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBsb29rCisJIG5lYXRlci4gICovCisgICAgICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSk7CisgICAgICBpZiAoc25ldyA9PSBOVUxMKQorCWVpbmZvICgiJVAlRjogb3V0cHV0IGZvcm1hdCAlcyBjYW5ub3QgcmVwcmVzZW50IHNlY3Rpb24gY2FsbGVkICVzXG4iLAorCSAgICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBvdXRzZWNuYW1lKTsKKyAgICAgIGlmIChwbGFjZSAhPSBOVUxMICYmIHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQorCXsKKwkgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCisJICAgIDsKKwkgICpwcHMgPSBzbmV3LT5uZXh0OworCSAgc25ldy0+bmV4dCA9IHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dDsKKwkgIHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dCA9IHNuZXc7CisJfQorCisgICAgICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KKyAgICAgIG9sZCA9IHN0YXRfcHRyOworICAgICAgc3RhdF9wdHIgPSAmYWRkOworICAgICAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKKworICAgICAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisJYWRkcmVzcyA9IE5VTEw7CisgICAgICBlbHNlCisJeworCSAgLyogQWxsIHNlY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUgbXVzdCBiZSBhbGlnbmVkIHRvIGEgcGFnZQorCSAgICAgYm91bmRhcnkuICAqLworCSAgYWRkcmVzcyA9IGV4cF91bm9wIChBTElHTl9LLAorCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIpKTsKKwl9CisKKyAgICAgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRzZWNuYW1lLCBhZGRyZXNzLCAwLAorCQkJCQkgICAoYmZkX3ZtYSkgMCwKKwkJCQkJICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKKwkJCQkJICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKKwkJCQkJICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7CisKKyAgICAgIGhvbGRfdXNlID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChvdXRzZWNuYW1lKTsKKworICAgICAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKKwkoKGJmZF92bWEpIDAsICIqZGVmYXVsdCoiLAorCSAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopIE5VTEwpOworCisgICAgICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCisgICAgICBpZiAocGxhY2UgIT0gTlVMTCkKKwl7CisJICAqYWRkLnRhaWwgPSBwbGFjZS0+aGVhZGVyLm5leHQ7CisJICBwbGFjZS0+aGVhZGVyLm5leHQgPSBhZGQuaGVhZDsKKwl9CisKKyAgICAgIHN0YXRfcHRyID0gb2xkOworICAgIH0KKworICBpZiAoZG9sbGFyID09IE5VTEwpCisgICAgd2lsZF9kb2l0ICgmaG9sZF91c2UtPmNoaWxkcmVuLCBzLCBob2xkX3VzZSwgZmlsZSk7CisgIGVsc2UKKyAgICB7CisgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGw7CisgICAgICBib29sZWFuIGZvdW5kX2RvbGxhcjsKKyAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBsaXN0OworCisgICAgICAvKiBUaGUgc2VjdGlvbiBuYW1lIGhhcyBhICckJy4gIFNvcnQgaXQgd2l0aCB0aGUgb3RoZXIgJyQnCisgICAgICAgICBzZWN0aW9ucy4gICovCisKKyAgICAgIGZvdW5kX2RvbGxhciA9IGZhbHNlOworICAgICAgZm9yIChwbCA9ICZob2xkX3VzZS0+Y2hpbGRyZW4uaGVhZDsgKnBsICE9IE5VTEw7IHBsID0gJigqcGwpLT5uZXh0KQorCXsKKwkgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICpsczsKKwkgIGNvbnN0IGNoYXIgKmxuYW1lOworCisJICBpZiAoKCpwbCktPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQorCSAgICBjb250aW51ZTsKKworCSAgbHMgPSAmKCpwbCktPmlucHV0X3NlY3Rpb247CisKKwkgIGxuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGxzLT5pZmlsZS0+dGhlX2JmZCwgbHMtPnNlY3Rpb24pOworCSAgaWYgKHN0cmNociAobG5hbWUsICckJykgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChmb3VuZF9kb2xsYXIpCisJCWJyZWFrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmb3VuZF9kb2xsYXIgPSB0cnVlOworCSAgICAgIGlmIChzdHJjbXAgKHNlY25hbWUsIGxuYW1lKSA8IDApCisJCWJyZWFrOworCSAgICB9CisJfQorCisgICAgICBsYW5nX2xpc3RfaW5pdCAoJmxpc3QpOworICAgICAgd2lsZF9kb2l0ICgmbGlzdCwgcywgaG9sZF91c2UsIGZpbGUpOworICAgICAgaWYgKGxpc3QuaGVhZCAhPSBOVUxMKQorCXsKKwkgIEFTU0VSVCAobGlzdC5oZWFkLT5uZXh0ID09IE5VTEwpOworCSAgbGlzdC5oZWFkLT5uZXh0ID0gKnBsOworCSAgKnBsID0gbGlzdC5oZWFkOworCX0KKyAgICB9CisKKyAgZnJlZSAoaG9sZF9zZWN0aW9uX25hbWUpOworCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbiAocykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKK3sKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7CisKKyAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCisgICAgcmV0dXJuOworCisgIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKworICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uX25hbWUpID09IDAKKyAgICAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCisgICAgICAmJiAoKGhvbGRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKQorCSAgPT0gKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpKSkpCisgICAgaG9sZF91c2UgPSBvczsKKworICBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKKyAgICBob2xkX3RleHQgPSBvczsKKyAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5yZGF0YSIpID09IDApCisgICAgaG9sZF9yZGF0YSA9IG9zOworICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQorICAgIGhvbGRfZGF0YSA9IG9zOworICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCisgICAgaG9sZF9ic3MgPSBvczsKK30KKwwKK3N0YXRpYyBjaGFyICoKK2dsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7CitFT0YKKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKyMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgorc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4KK0VPRgorc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYworCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCit7CisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlLAorICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAorICAiJHtFTVVMQVRJT05fTkFNRX0iLAorICAiJHtPVVRQVVRfRk9STUFUfSIsCisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsIC8qIGZpbmlzaCAqLworICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLworICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLworICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuLAorICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMsCisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzLAorICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUsCisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMsCisgIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9yZWNvZ25pemVkX2ZpbGUKK307CitFT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIGIvbGQvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNmQzZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkCkBAIC0wLDAgKzEsNCBAQAorcy9bIlxcXS9cXCYvZworcy8kL1xcblxcLworMSBzL14vIi8KKyQgcy8kL24iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N1bm9zLmVtIGIvbGQvZW11bHRlbXBsL3N1bm9zLmVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9lbXVsdGVtcGwvc3Vub3MuZW0KQEAgLTAsMCArMSwxMDM3IEBACisjIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KKyMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCitjYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisvKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCisKKy8qIFN1bk9TIGVtdWxhdGlvbiBjb2RlIGZvciAke0VNVUxBVElPTl9OQU1FfQorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgorICAgU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfSVNfJHtFTVVMQVRJT05fTkFNRX0KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisKKyNpZmRlZiBIQVZFX0RJUkVOVF9ICisjIGluY2x1ZGUgPGRpcmVudC5oPgorI2Vsc2UKKyMgZGVmaW5lIGRpcmVudCBkaXJlY3QKKyMgaWZkZWYgSEFWRV9TWVNfTkRJUl9ICisjICBpbmNsdWRlIDxzeXMvbmRpci5oPgorIyBlbmRpZgorIyBpZmRlZiBIQVZFX1NZU19ESVJfSAorIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgorIyBlbmRpZgorIyBpZmRlZiBIQVZFX05ESVJfSAorIyAgaW5jbHVkZSA8bmRpci5oPgorIyBlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cworICBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvCisgIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOworc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gKikpOworc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQKKyAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOworc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY291bnRfbmVlZAorICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkCisgIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOworc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCit7CisgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfJHtBUkNIfTsKKyAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7CisgIGNvbmZpZy5oYXNfc2hhcmVkID0gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCwKKyAgIGJ1dCBiZWZvcmUgdGhlIGxpbmtlciBzY3JpcHQgaGFzIGJlZW4gcmVhZC4gIElmIHRoaXMgaXMgYSBuYXRpdmUKKyAgIGxpbmtlciwgd2UgYWRkIHRoZSBkaXJlY3RvcmllcyBpbiBMRF9MSUJSQVJZX1BBVEggdG8gdGhlIHNlYXJjaAorICAgbGlzdC4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyAoKQoreworRU9GCitpZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KKyAgaWYgWyAieCR7REVGQVVMVF9FTVVMQVRJT059IiA9ICJ4JHtFTVVMQVRJT05fTkFNRX0iIF0gOyB0aGVuCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorICBjb25zdCBjaGFyICplbnY7CisKKyAgZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7CisgIGlmIChlbnYgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpsOworCisgICAgICBsID0geHN0cmR1cCAoZW52KTsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGNoYXIgKmM7CisKKwkgIGMgPSBzdHJjaHIgKGwsICc6Jyk7CisJICBpZiAoYyAhPSBOVUxMKQorCSAgICAqYysrID0gJ1wwJzsKKwkgIGlmICgqbCAhPSAnXDAnKQorCSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAobCwgZmFsc2UpOworCSAgaWYgKGMgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJICBsID0gYzsKKwl9CisgICAgfQorRU9GCisgIGZpCitmaQorY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK30KKworLyogRGVzcGl0ZSB0aGUgbmFtZSwgd2UgdXNlIHRoaXMgcm91dGluZSB0byBzZWFyY2ggZm9yIGR5bmFtaWMKKyAgIGxpYnJhcmllcy4gIE9uIFN1bk9TIHRoaXMgcmVxdWlyZXMgYSBkaXJlY3Rvcnkgc2VhcmNoLiAgV2UgbmVlZCB0bworICAgZmluZCB0aGUgLnNvIGZpbGUgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlci4gIFRoZSB1c2VyIG1heQorICAgcmVzdHJpY3QgdGhlIG1ham9yIHZlcnNpb24gYnkgc2F5aW5nLCBlLmcuLCAtbGMuMS4gIEFsc28sIGlmIHdlCisgICBmaW5kIGEgLnNvIGZpbGUsIHdlIG5lZWQgdG8gbG9vayBmb3IgYSB0aGUgc2FtZSBmaWxlIGFmdGVyCisgICByZXBsYWNpbmcgLnNvIHdpdGggLnNhOyBpZiBpdCBleGlzdHMsIGl0IHdpbGwgYmUgYW4gYXJjaGl2ZSB3aGljaAorICAgcHJvdmlkZSBzb21lIGluaXRpYWxpemF0aW9ucyBmb3IgZGF0YSBzeW1ib2xzLCBhbmQgd2UgbmVlZCB0bworICAgc2VhcmNoIGl0IGFmdGVyIGluY2x1ZGluZyB0aGUgLnNvIGZpbGUuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKK3sKKyAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTsKK30KKworLyogU2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIGEgLnNvIGZpbGUgZm9yIGVhY2ggbGlicmFyeSBzZWFyY2guICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyAoaW5wKQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Cit7CisgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKKyAgY2hhciAqZm91bmQgPSBOVUxMOworICBjaGFyICphbGM7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIGlmICghIGlucC0+c2VhcmNoX2RpcnNfZmxhZworICAgICAgfHwgISBpbnAtPmlzX2FyY2hpdmUKKyAgICAgIHx8ICEgaW5wLT5keW5hbWljKQorICAgIHJldHVybjsKKworICBBU1NFUlQgKHN0cm5jbXAgKGlucC0+bG9jYWxfc3ltX25hbWUsICItbCIsIDIpID09IDApOworCisgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCisgICAgeworICAgICAgYm9vbGVhbiBmb3VuZF9zdGF0aWM7CisKKyAgICAgIGZvdW5kID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoc2VhcmNoLT5uYW1lLCBpbnAtPmZpbGVuYW1lLAorCQkJCQkgICAgICAgJmZvdW5kX3N0YXRpYyk7CisgICAgICBpZiAoZm91bmQgIT0gTlVMTCB8fCBmb3VuZF9zdGF0aWMpCisJYnJlYWs7CisgICAgfQorCisgIGlmIChmb3VuZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGRpZCBub3QgZmluZCBhIG1hdGNoaW5nIC5zbyBmaWxlLiAgVGhpcyBpc24ndCBhbiBlcnJvciwKKwkgc2luY2UgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSBtYXRjaGluZyAuYSBmaWxlLCB3aGljaCB3aWxsIGJlCisJIGZvdW5kIGJ5IHRoZSB1c3VhbCBzZWFyY2guICAqLworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBSZXBsYWNlIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBvbmUgd2UgaGF2ZSBmb3VuZC4gICovCisgIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIHN0cmxlbiAoZm91bmQpICsgMik7CisgIHNwcmludGYgKGFsYywgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBmb3VuZCk7CisgIGlucC0+ZmlsZW5hbWUgPSBhbGM7CisKKyAgLyogVHVybiBvZmYgdGhlIHNlYXJjaF9kaXJzX2ZsYWcgdG8gcHJldmVudCBsZGZpbGVfb3Blbl9maWxlIGZyb20KKyAgICAgc2VhcmNoaW5nIGZvciB0aGlzIGZpbGUgYWdhaW4uICAqLworICBpbnAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKKworICBmcmVlIChmb3VuZCk7CisKKyAgLyogTm93IGxvb2sgZm9yIHRoZSBzYW1lIGZpbGUgbmFtZSwgYnV0IHdpdGggLnNhIGluc3RlYWQgb2YgLnNvLiAgSWYKKyAgICAgZm91bmQsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcy4gICovCisgIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxKTsKKyAgc3RyY3B5IChhbGMsIGlucC0+ZmlsZW5hbWUpOworICBzdHJzdHIgKGFsYyArIHN0cmxlbiAoc2VhcmNoLT5uYW1lKSwgIi5zbyIpWzJdID0gJ2EnOworICBpZiAoc3RhdCAoYWxjLCAmc3QpICE9IDApCisgICAgZnJlZSAoYWxjKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnNhOworCisgICAgICAvKiBBZGQgdGhlIC5zYSBmaWxlIHRvIHRoZSBzdGF0ZW1lbnQgbGlzdCBqdXN0IGJlZm9yZSB0aGUgLnNvCisJIGZpbGUuICBUaGlzIGlzIHJlYWxseSBhIGhhY2suICAqLworICAgICAgc2EgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKKwkgICAgeG1hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOworICAgICAgKnNhID0gKmlucDsKKworICAgICAgaW5wLT5maWxlbmFtZSA9IGFsYzsKKyAgICAgIGlucC0+bG9jYWxfc3ltX25hbWUgPSBhbGM7CisKKyAgICAgIGlucC0+aGVhZGVyLm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKKyAgICAgIGlucC0+bmV4dF9yZWFsX2ZpbGUgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKKyAgICB9Cit9CisKKy8qIFNlYXJjaCBhIGRpcmVjdG9yeSBmb3IgYSAuc28gZmlsZS4gICovCisKK3N0YXRpYyBjaGFyICoKK2dsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKGRpcm5hbWUsIGZpbGVuYW1lLCBmb3VuZF9zdGF0aWMpCisgICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7CisgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgICBib29sZWFuICpmb3VuZF9zdGF0aWM7Cit7CisgIGludCBmb3JjZV9tYWosIGZvcmNlX21pbjsKKyAgY29uc3QgY2hhciAqZG90OworICB1bnNpZ25lZCBpbnQgbGVuOworICBjaGFyICphbGM7CisgIGNoYXIgKmZvdW5kOworICBpbnQgbWF4X21haiwgbWF4X21pbjsKKyAgRElSICpkaXI7CisgIHN0cnVjdCBkaXJlbnQgKmVudHJ5OworICB1bnNpZ25lZCBpbnQgZGlybmFtZWxlbjsKKyAgY2hhciAqZnVsbF9wYXRoOworICBpbnQgc3RhdHZhbDsKKyAgc3RydWN0IHN0YXQgc3Q7CisKKyAgKmZvdW5kX3N0YXRpYyA9IGZhbHNlOworCisgIGZvcmNlX21haiA9IC0xOworICBmb3JjZV9taW4gPSAtMTsKKyAgZG90ID0gc3RyY2hyIChmaWxlbmFtZSwgJy4nKTsKKyAgaWYgKGRvdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOworICAgICAgYWxjID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3JjZV9tYWogPSBhdG9pIChkb3QgKyAxKTsKKworICAgICAgbGVuID0gZG90IC0gZmlsZW5hbWU7CisgICAgICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgICAgIHN0cm5jcHkgKGFsYywgZmlsZW5hbWUsIGxlbik7CisgICAgICBhbGNbbGVuXSA9ICdcMCc7CisgICAgICBmaWxlbmFtZSA9IGFsYzsKKworICAgICAgZG90ID0gc3RyY2hyIChkb3QgKyAxLCAnLicpOworICAgICAgaWYgKGRvdCAhPSBOVUxMKQorCWZvcmNlX21pbiA9IGF0b2kgKGRvdCArIDEpOworICAgIH0KKworICBmb3VuZCA9IE5VTEw7CisgIG1heF9tYWogPSBtYXhfbWluID0gMDsKKworICBkaXIgPSBvcGVuZGlyIChkaXJuYW1lKTsKKyAgaWYgKGRpciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBkaXJuYW1lbGVuID0gc3RybGVuIChkaXJuYW1lKTsKKyAgCisgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyIChkaXIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICBpbnQgZm91bmRfbWFqLCBmb3VuZF9taW47CisKKyAgICAgIGlmIChzdHJuY21wIChlbnRyeS0+ZF9uYW1lLCAibGliIiwgMykgIT0gMAorCSAgfHwgc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMsIGZpbGVuYW1lLCBsZW4pICE9IDApCisJY29udGludWU7CisKKyAgICAgIGlmIChkb3QgPT0gTlVMTAorCSAgJiYgc3RyY21wIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5hIikgPT0gMCkKKwl7CisJICAqZm91bmRfc3RhdGljID0gdHJ1ZTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogV2UgYWNjZXB0IGxpYmZvby5zbyB3aXRob3V0IGEgdmVyc2lvbiBudW1iZXIsIGV2ZW4gdGhvdWdoIHRoZQorICAgICAgICAgbmF0aXZlIGxpbmtlciBkb2VzIG5vdC4gIFRoaXMgaXMgbW9yZSBjb252ZW5pZW50IGZvciBwYWNrYWdlcworICAgICAgICAgd2hpY2gganVzdCBnZW5lcmF0ZSAuc28gZmlsZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIGFzIG9uIEVMRgorICAgICAgICAgc3lzdGVtcy4gICovCisgICAgICBpZiAoc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuc28iLCAzKSAhPSAwKQorCWNvbnRpbnVlOworICAgICAgaWYgKGVudHJ5LT5kX25hbWVbNiArIGxlbl0gPT0gJ1wwJykKKwk7CisgICAgICBlbHNlIGlmIChlbnRyeS0+ZF9uYW1lWzYgKyBsZW5dID09ICcuJworCSAgICAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgZW50cnktPmRfbmFtZVs3ICsgbGVuXSkpCisJOworICAgICAgZWxzZQorCWNvbnRpbnVlOworCisgICAgICBmb3IgKHMgPSBlbnRyeS0+ZF9uYW1lICsgNiArIGxlbjsgKnMgIT0gJ1wwJzsgcysrKQorCWlmICgqcyAhPSAnLicgJiYgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQorCSAgYnJlYWs7CisgICAgICBpZiAoKnMgIT0gJ1wwJykKKwljb250aW51ZTsKKworICAgICAgLyogV2UndmUgZm91bmQgYSAuc28gZmlsZS4gIFdvcmsgb3V0IHRoZSBtYWpvciBhbmQgbWlub3IKKwkgdmVyc2lvbiBudW1iZXJzLiAgKi8KKyAgICAgIGZvdW5kX21haiA9IDA7CisgICAgICBmb3VuZF9taW4gPSAwOworICAgICAgc3NjYW5mIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5zby4lZC4lZCIsCisJICAgICAgJmZvdW5kX21haiwgJmZvdW5kX21pbik7CisKKyAgICAgIGlmICgoZm9yY2VfbWFqICE9IC0xICYmIGZvcmNlX21haiAhPSBmb3VuZF9tYWopCisJICB8fCAoZm9yY2VfbWluICE9IC0xICYmIGZvcmNlX21pbiAhPSBmb3VuZF9taW4pKQorCWNvbnRpbnVlOworCisgICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpbGUgcmVhbGx5IGV4aXN0cyAoaWdub3JlIGJyb2tlbiBzeW1saW5rcykuICAqLworICAgICAgZnVsbF9wYXRoID0geG1hbGxvYyAoZGlybmFtZWxlbiArIDEgKyBzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7CisgICAgICBzcHJpbnRmIChmdWxsX3BhdGgsICIlcy8lcyIsIGRpcm5hbWUsIGVudHJ5LT5kX25hbWUpOworICAgICAgc3RhdHZhbCA9IHN0YXQgKGZ1bGxfcGF0aCwgJnN0KTsKKyAgICAgIGZyZWUgKGZ1bGxfcGF0aCk7CisgICAgICBpZiAoc3RhdHZhbCAhPSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBXZSd2ZSBmb3VuZCBhIG1hdGNoIGZvciB0aGUgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIFNlZQorCSBpZiB0aGlzIGlzIHRoZSB2ZXJzaW9uIHdlIHNob3VsZCB1c2UuICBJZiB0aGUgbWFqb3IgYW5kIG1pbm9yCisJIHZlcnNpb25zIG1hdGNoLCB3ZSB1c2UgdGhlIGxhc3QgZW50cnkgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOworCSBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBob3cgU3VuT1MgZGlzdGluZ3Vpc2hlcyBsaWJjLnNvLjEuOAorCSBmcm9tIGxpYmMuc28uMS44LjEsIGJ1dCBpdCBvdWdodCB0byBzdWZmaWNlLiAgKi8KKyAgICAgIGlmIChmb3VuZCA9PSBOVUxMCisJICB8fCAoZm91bmRfbWFqID4gbWF4X21haikKKwkgIHx8IChmb3VuZF9tYWogPT0gbWF4X21hagorCSAgICAgICYmIChmb3VuZF9taW4gPiBtYXhfbWluCisJCSAgfHwgKGZvdW5kX21pbiA9PSBtYXhfbWluCisJCSAgICAgICYmIHN0cmNtcCAoZW50cnktPmRfbmFtZSwgZm91bmQpID4gMCkpKSkKKwl7CisJICBpZiAoZm91bmQgIT0gTlVMTCkKKwkgICAgZnJlZSAoZm91bmQpOworCSAgZm91bmQgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7CisJICBzdHJjcHkgKGZvdW5kLCBlbnRyeS0+ZF9uYW1lKTsKKwkgIG1heF9tYWogPSBmb3VuZF9tYWo7CisJICBtYXhfbWluID0gZm91bmRfbWluOworCX0KKyAgICB9CisKKyAgY2xvc2VkaXIgKGRpcik7CisKKyAgaWYgKGFsYyAhPSBOVUxMKQorICAgIGZyZWUgKGFsYyk7CisKKyAgcmV0dXJuIGZvdW5kOworfQorCisvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKKyAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKK3N0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKK3sKKyAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOworCisgIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKKyAgICByZXR1cm47CisKKyAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBsZF9uZWVkIGVudHJpZXMgaW4gZHluYW1pYworICAgICBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvCisgICAgIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbAorICAgICB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdCB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsCisgICAgIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZSBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0bworICAgICBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbgorICAgICBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cKKyAgICAgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyBsb29wLiAgKi8KKyAgbmVlZGVkID0gYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7CisgIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOworICAgICAgY29uc3QgY2hhciAqbG5hbWU7CisgICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7CisKKyAgICAgIGxuYW1lID0gbC0+bmFtZTsKKworICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCisgICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQorCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsbmFtZSkgPT0gMCkKKwkgIGJyZWFrOworICAgICAgaWYgKGxsICE9IGwpCisJY29udGludWU7CisKKyAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLworICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7CisgICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKKyAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKKyAgICAgIGlmIChnbG9iYWxfZm91bmQpCisJY29udGludWU7CisKKyAgICAgIGlmIChzdHJuY21wIChsbmFtZSwgIi1sIiwgMikgIT0gMCkKKwl7CisJICBiZmQgKmFiZmQ7CisKKwkgIGFiZmQgPSBiZmRfb3BlbnIgKGxuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOworCSAgaWYgKGFiZmQgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQorCQl7CisJCSAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7CisJCSAgYWJmZCA9IE5VTEw7CisJCX0KKwkgICAgfQorCSAgaWYgKGFiZmQgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCisJCXsKKwkJICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKKwkJICBhYmZkID0gTlVMTDsKKwkJfQorCSAgICB9CisJICBpZiAoYWJmZCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogV2UndmUgZm91bmQgdGhlIG5lZWRlZCBkeW5hbWljIG9iamVjdC4gICovCisJICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQorCQllaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iLAorCQkgICAgIGxuYW1lLCBsLT5ieSk7CisJICAgIH0KKworCSAgY29udGludWU7CisJfQorCisgICAgICBsbmFtZSArPSAyOworCisgICAgICAvKiBXZSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlCisJIGR5bmFtaWMgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCisJIHJwYXRoX2xpbmssIHJwYXRoIG9yIC1MLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiAoaWYgcnBhdGggd2FzIHVzZWQpIHRoZQorCSBsaW5rZXIgc2NyaXB0IExJQl9TRUFSQ0hfRElSUy4gICovCisgICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCisJCQkJCSAgICAgIGxuYW1lKSkKKwljb250aW51ZTsKKyAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKKwl7CisJICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsbmFtZSkpCisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQorCSAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoc2VhcmNoLT5uYW1lLCBsbmFtZSkpCisJICAgICAgYnJlYWs7CisJICBpZiAoc2VhcmNoICE9IE5VTEwpCisJICAgIGNvbnRpbnVlOworCX0KK0VPRgoraWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCisgIGlmIFsgIngke0RFRkFVTFRfRU1VTEFUSU9OfSIgPSAieCR7RU1VTEFUSU9OX05BTUV9IiBdIDsgdGhlbgorY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKKyAgICAgIHsKKwljb25zdCBjaGFyICpsaWJfcGF0aDsKKworCWxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7CisJaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsbmFtZSkpCisJICBjb250aW51ZTsKKyAgICAgIH0KK0VPRgorICBmaQorZmkKK2NhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCisgICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoICE9IE5VTEwpCisJeworCSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKKwkgICAgeworCSAgICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChzZWFyY2gtPm5hbWUsIGxuYW1lKSkKKwkJYnJlYWs7CisJICAgIH0KKwkgIGlmIChzZWFyY2ggIT0gTlVMTCkKKwkgICAgY29udGludWU7CisJfQorCisgICAgICBlaW5mbyAoIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmRcbiIsCisJICAgICBsLT5uYW1lLCBsLT5ieSk7CisgICAgfQorfQorCisvKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2dsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKHBhdGgsIG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGNvbnN0IGNoYXIgKnM7CisKKyAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKQorICAgIHJldHVybiBmYWxzZTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZGlyOworICAgICAgY2hhciAqZGlyY29weTsKKworICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKKyAgICAgIGlmIChzID09IE5VTEwpCisJeworCSAgZGlyY29weSA9IE5VTEw7CisJICBkaXIgPSBwYXRoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkaXJjb3B5ID0gKGNoYXIgKikgeG1hbGxvYyAocyAtIHBhdGggKyAxKTsKKwkgIG1lbWNweSAoZGlyY29weSwgcGF0aCwgcyAtIHBhdGgpOworCSAgZGlyY29weVtzIC0gcGF0aF0gPSAnXDAnOworCSAgZGlyID0gZGlyY29weTsKKwl9CisKKyAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChkaXIsIG5hbWUpKQorCXJldHVybiB0cnVlOworCisgICAgICBpZiAoZGlyY29weSAhPSBOVUxMKQorCWZyZWUgKGRpcmNvcHkpOworCisgICAgICBpZiAocyA9PSBOVUxMKQorCWJyZWFrOworICAgICAgcGF0aCA9IHMgKyAxOworICAgIH0KKworICByZXR1cm4gZmFsc2U7CSAgCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIGRpcmVjdG9yeSBmb3IgYSBuZWVkZWQKKyAgIGR5bmFtaWMgb2JqZWN0LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2dsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGRpciwgbmFtZSkKKyAgICAgY29uc3QgY2hhciAqZGlyOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBjaGFyICpmaWxlOworICBjaGFyICphbGM7CisgIGJvb2xlYW4gaWdub3JlOworICBiZmQgKmFiZmQ7CisKKyAgZmlsZSA9IGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKGRpciwgbmFtZSwgJmlnbm9yZSk7CisgIGlmIChmaWxlID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZGlyKSArIHN0cmxlbiAoZmlsZSkgKyAyKTsKKyAgc3ByaW50ZiAoYWxjLCAiJXMvJXMiLCBkaXIsIGZpbGUpOworICBmcmVlIChmaWxlKTsKKyAgYWJmZCA9IGJmZF9vcGVuciAoYWxjLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOworICBpZiAoYWJmZCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCisgICAgeworICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQorICAgIHsKKyAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvKiBXZSd2ZSBmb3VuZCB0aGUgbmVlZGVkIGR5bmFtaWMgb2JqZWN0LiAgKi8KKworICAvKiBBZGQgdGhpcyBmaWxlIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCisgIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCAmbGlua19pbmZvKSkKKyAgICBlaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIG5lZWRlZCBvYmplY3QgaW4gdGhlIGxpbmsuICBUaGlzCisgICBkb2VzIG5vdCBoYXZlIHRvIGJlIHByZWNpc2UsIGFzIGl0IGRvZXMgbm8gaGFybSB0byBpbmNsdWRlIGEKKyAgIGR5bmFtaWMgb2JqZWN0IG1vcmUgdGhhbiBvbmNlLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCAocykKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKK3sKKyAgaWYgKHMtPmZpbGVuYW1lID09IE5VTEwpCisgICAgcmV0dXJuOworICBpZiAoc3RybmNtcCAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi1sIiwgMikgIT0gMCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChzLT5maWxlbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKKwlnbG9iYWxfZm91bmQgPSB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNuYW1lLCAqbG5hbWU7CisgICAgICBjb25zdCBjaGFyICpzZG90LCAqbGRvdDsKKyAgICAgIGludCBsbWFqLCBsbWluLCBzbWFqLCBzbWluOworCisgICAgICBsbmFtZSA9IGdsb2JhbF9uZWVkZWQtPm5hbWUgKyAyOworCisgICAgICBzbmFtZSA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOworICAgICAgaWYgKHNuYW1lID09IE5VTEwpCisJc25hbWUgPSBzLT5maWxlbmFtZTsKKyAgICAgIGVsc2UKKwkrK3NuYW1lOworCisgICAgICBpZiAoc3RybmNtcCAoc25hbWUsICJsaWIiLCAzKSAhPSAwKQorCXJldHVybjsKKyAgICAgIHNuYW1lICs9IDM7CisKKyAgICAgIGxkb3QgPSBzdHJjaHIgKGxuYW1lLCAnLicpOworICAgICAgaWYgKGxkb3QgPT0gTlVMTCkKKwlsZG90ID0gbG5hbWUgKyBzdHJsZW4gKGxuYW1lKTsKKworICAgICAgc2RvdCA9IHN0cnN0ciAoc25hbWUsICIuc28uIik7CisgICAgICBpZiAoc2RvdCA9PSBOVUxMKQorCXJldHVybjsKKworICAgICAgaWYgKHNkb3QgLSBzbmFtZSAhPSBsZG90IC0gbG5hbWUKKwkgIHx8IHN0cm5jbXAgKGxuYW1lLCBzbmFtZSwgc2RvdCAtIHNuYW1lKSAhPSAwKQorCXJldHVybjsKKworICAgICAgbG1haiA9IGxtaW4gPSAtMTsKKyAgICAgIHNzY2FuZiAobGRvdCwgIi4lZC4lZCIsICZsbWFqLCAmbG1pbik7CisgICAgICBzbWFqID0gc21pbiA9IC0xOworICAgICAgc3NjYW5mIChzZG90LCAiLnNvLiVkLiVkIiwgJnNtYWosICZzbWluKTsKKyAgICAgIGlmICgoc21haiAhPSBsbWFqICYmIHNtYWogIT0gLTEgJiYgbG1haiAhPSAtMSkKKwkgIHx8IChzbWluICE9IGxtaW4gJiYgc21pbiAhPSAtMSAmJiBsbWluICE9IC0xKSkKKwlyZXR1cm47CisKKyAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7CisgICAgfQorfQorCisvKiBXZSBuZWVkIHRvIHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIHBhc3MgaW5mb3JtYXRpb24gYXJvdW5kIHRoZSBjYWxsCisgICB0byBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEljay4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2Fzc2lnbjsKK3N0YXRpYyBib29sZWFuIGZvdW5kX2Fzc2lnbjsKKworLyogV2UgbmVlZCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlcyB0byBwYXNzIGluZm9ybWF0aW9uIGFyb3VuZCB0aGUgY2FsbAorICAgdG8gbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlLiAgSWNrLiAgKi8KKworc3RhdGljIGJmZF9zaXplX3R5cGUgbmVlZF9zaXplOworc3RhdGljIGJmZF9zaXplX3R5cGUgbmVlZF9lbnRyaWVzOworc3RhdGljIGJmZF9ieXRlICpuZWVkX2NvbnRlbnRzOworc3RhdGljIGJmZF9ieXRlICpuZWVkX3BpbmZvOworc3RhdGljIGJmZF9ieXRlICpuZWVkX3BuYW1lczsKKworLyogVGhlIHNpemUgb2Ygb25lIGVudHJ5IGluIHRoZSAubmVlZCBzZWN0aW9uLCBub3QgaW5jbHVkaW5nIHRoZSBmaWxlCisgICBuYW1lLiAgKi8KKworI2RlZmluZSBORUVEX0VOVFJZX1NJWkUgKDE2KQorCisvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAorICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoZHluID0gTlVMTDsKKyAgYXNlY3Rpb24gKnNuZWVkOworICBhc2VjdGlvbiAqc3J1bGVzOworICBhc2VjdGlvbiAqc2R5bjsKKworICAvKiBUaGUgU3VuT1MgbmF0aXZlIGxpbmtlciBjcmVhdGVzIGEgc2hhcmVkIGxpYnJhcnkgd2hlbmV2ZXIgdGhlcmUKKyAgICAgYXJlIGFueSB1bmRlZmluZWQgc3ltYm9scyBpbiBhIGxpbmssIHVubGVzcyAtZSBpcyB1c2VkLiAgVGhpcyBpcworICAgICBwcmV0dHkgd2VpcmQsIGJ1dCB3ZSBhcmUgY29tcGF0aWJsZS4gICovCisgIGlmICghIGxpbmtfaW5mby5zaGFyZWQgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmICEgZW50cnlfZnJvbV9jbWRsaW5lKQorICAgIHsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworICAgICAgCisgICAgICBmb3IgKGggPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzOyBoICE9IE5VTEw7IGggPSBoLT5uZXh0KQorCXsKKwkgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJICAgICAgJiYgaC0+dS51bmRlZi5hYmZkICE9IE5VTEwKKwkgICAgICAmJiAoaC0+dS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDAKKwkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Quc3RyaW5nLCAiX19EWU5BTUlDIikgIT0gMAorCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5zdHJpbmcsICJfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkKKwkgICAgeworCSAgICAgIGZpbmRfYXNzaWduID0gaC0+cm9vdC5zdHJpbmc7CisJICAgICAgZm91bmRfYXNzaWduID0gZmFsc2U7CisJICAgICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk7CisJICAgICAgaWYgKCEgZm91bmRfYXNzaWduKQorCQl7CisJCSAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCisgICAgeworICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7CisKKyAgICAgIC8qIFNldCB0aGUgLnRleHQgc2VjdGlvbiB0byBzdGFydCBhdCAweDIwLCBub3QgMHgyMDIwLiAgRklYTUU6CisgICAgICAgICBUaGlzIGlzIHRvbyBtYWdpY2FsLiAgKi8KKyAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLnRleHQiKTsKKyAgICAgIGlmIChvcy0+YWRkcl90cmVlID09IE5VTEwpCisJb3MtPmFkZHJfdHJlZSA9IGV4cF9pbnRvcCAoMHgyMCk7CisgICAgfQorCisgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgX19EWU5BTUlDIHN5bWJvbC4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCisgICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSB3YW50IHRvIHNldCB0aGUgdmFsdWUgdG8gdGhlIHN0YXJ0IG9mCisgICAgIHRoZSBkeW5hbWljIHNlY3Rpb24gaWYgdGhlcmUgaXMgb25lLCBvciB0byB6ZXJvIGlmIHRoZXJlIGlzbid0CisgICAgIG9uZS4gIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBzeW1ib2wgYmVmb3JlIGNhbGxpbmcKKyAgICAgc2l6ZV9keW5hbWljX3NlY3Rpb25zLCBhbHRob3VnaCB3ZSBjYW4ndCBzZXQgdGhlIHZhbHVlIHVudGlsCisgICAgIGFmdGVyd2FyZC4gICovCisgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgeworICAgICAgaGR5biA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgIl9fRFlOQU1JQyIsIHRydWUsIGZhbHNlLAorCQkJCSAgIGZhbHNlKTsKKyAgICAgIGlmIChoZHluID09IE5VTEwpCisJZWluZm8gKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cDogJUVcbiIpOworICAgICAgaWYgKCEgYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCisJCQkJCSAgICAgICJfX0RZTkFNSUMiKSkKKwllaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byBfX0RZTkFNSUM6ICVFXG4iKTsKKyAgICB9CisKKyAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW55IHZhcmlhYmxlIGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIGxldAorICAgICB0aGUgYmFja2VuZCBsaW5rZXIga25vdyBhYm91dCB0aGVtIGluIGNhc2UgdGhlIHZhcmlhYmxlcyBhcmUKKyAgICAgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KKyAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYXNzaWdubWVudCk7CisKKyAgLyogTGV0IHRoZSBiYWNrZW5kIGxpbmtlciB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zCisgICAgIHJlcXVpcmVkIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCisgIGlmICghIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sICZzZHluLAorCQkJCQkgJnNuZWVkLCAmc3J1bGVzKSkKKyAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7CisKKyAgaWYgKHNuZWVkICE9IE5VTEwpCisgICAgeworICAgICAgLyogU2V0IHVwIHRoZSAubmVlZCBzZWN0aW9uLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGRfbmVlZAorCSBmaWVsZCBpbiBpbmNsdWRlL2FvdXQvc3VuNC5oLiAgKi8KKworICAgICAgbmVlZF9lbnRyaWVzID0gMDsKKyAgICAgIG5lZWRfc2l6ZSA9IDA7CisKKyAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY291bnRfbmVlZCk7CisKKyAgICAgIC8qIFdlIHNob3VsZCBvbmx5IGhhdmUgYSAubmVlZCBzZWN0aW9uIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lCisJIGR5bmFtaWMgb2JqZWN0LiAgKi8KKyAgICAgIEFTU0VSVCAobmVlZF9lbnRyaWVzICE9IDApOworCisgICAgICBzbmVlZC0+X3Jhd19zaXplID0gbmVlZF9zaXplOworICAgICAgc25lZWQtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKG5lZWRfc2l6ZSk7CisKKyAgICAgIG5lZWRfY29udGVudHMgPSBzbmVlZC0+Y29udGVudHM7CisgICAgICBuZWVkX3BpbmZvID0gc25lZWQtPmNvbnRlbnRzOworICAgICAgbmVlZF9wbmFtZXMgPSBzbmVlZC0+Y29udGVudHMgKyBuZWVkX2VudHJpZXMgKiAxNjsKKworICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZCk7CisKKyAgICAgIEFTU0VSVCAoKGJmZF9zaXplX3R5cGUpIChuZWVkX3BuYW1lcyAtIHNuZWVkLT5jb250ZW50cykgPT0gbmVlZF9zaXplKTsKKyAgICB9CisKKyAgaWYgKHNydWxlcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB1cCB0aGUgLnJ1bGVzIHNlY3Rpb24uICBUaGlzIGlzIGp1c3QgYSBQQVRIIGxpa2Ugc3RyaW5nCisJIG9mIHRoZSAtTCBhcmd1bWVudHMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gIFdlIHBlcm1pdCB0aGUKKwkgdXNlciB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcmllcyB1c2luZyB0aGUgLXJwYXRoIGNvbW1hbmQgbGluZQorCSBvcHRpb24uICAqLworICAgICAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCkKKwl7CisJICBzcnVsZXMtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoKTsKKwkgIHNydWxlcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLnJwYXRoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB1bnNpZ25lZCBpbnQgc2l6ZTsKKwkgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKKworCSAgc2l6ZSA9IDA7CisJICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQorCSAgICBpZiAoc2VhcmNoLT5jbWRsaW5lKQorCSAgICAgIHNpemUgKz0gc3RybGVuIChzZWFyY2gtPm5hbWUpICsgMTsKKwkgIHNydWxlcy0+X3Jhd19zaXplID0gc2l6ZTsKKwkgIGlmIChzaXplID4gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKnA7CisKKwkgICAgICBzcnVsZXMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHNpemUpOworCSAgICAgIHAgPSAoY2hhciAqKSBzcnVsZXMtPmNvbnRlbnRzOworCSAgICAgICpwID0gJ1wwJzsKKwkgICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQorCQl7CisJCSAgaWYgKHNlYXJjaC0+Y21kbGluZSkKKwkJICAgIHsKKwkJICAgICAgaWYgKHAgIT0gKGNoYXIgKikgc3J1bGVzLT5jb250ZW50cykKKwkJCSpwKysgPSAnOic7CisJCSAgICAgIHN0cmNweSAocCwgc2VhcmNoLT5uYW1lKTsKKwkJICAgICAgcCArPSBzdHJsZW4gKHApOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFdlIG11c3QgYXNzaWduIGEgdmFsdWUgdG8gX19EWU5BTUlDLiAgSXQgc2hvdWxkIGJlIHplcm8gaWYgd2UgYXJlCisgICAgIG5vdCBkb2luZyBhIGR5bmFtaWMgbGluaywgb3IgdGhlIHN0YXJ0IG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uIGlmCisgICAgIHdlIGFyZSBkb2luZyBvbmUuICAqLworICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQorICAgIHsKKyAgICAgIGhkeW4tPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisgICAgICBoZHluLT51LmRlZi52YWx1ZSA9IDA7CisgICAgICBpZiAoc2R5biAhPSBOVUxMKQorCWhkeW4tPnUuZGVmLnNlY3Rpb24gPSBzZHluOworICAgICAgZWxzZQorCWhkeW4tPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgIH0KK30KKworLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCisgICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGRvZXMgb25lIG9mIHR3byB0aGluZ3M6IGlmIHRoZQorICAgdmFyaWFibGUgZmluZF9hc3NpZ24gaXMgc2V0LCBpdCBzZXRzIGZvdW5kX2Fzc2lnbiBpZiBpdCBmaW5kcyBhbgorICAgYXNzaWdubWVudCB0byB0aGF0IHZhcmlhYmxlOyBvdGhlcndpc2UgaXQgdGVsbHMgdGhlIGJhY2tlbmQgbGlua2VyCisgICBhYm91dCBhbGwgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCisgICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLworCitzdGF0aWMgdm9pZAorZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50IChzKQorICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOworeworICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtCisgICAgICAmJiAoZmluZF9hc3NpZ24gPT0gTlVMTCB8fCAhIGZvdW5kX2Fzc2lnbikpCisgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKK30KKworLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KKworc3RhdGljIHZvaWQKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKKyAgICAgZXRyZWVfdHlwZSAqZXhwOworeworICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQorICAgIHsKKyAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKKyAgICAgIGlmIChmaW5kX2Fzc2lnbiAhPSBOVUxMKQorCXsKKwkgIGlmIChzdHJjbXAgKGZpbmRfYXNzaWduLCBleHAtPmFzc2lnbi5kc3QpID09IDApCisJICAgIGZvdW5kX2Fzc2lnbiA9IHRydWU7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKKwl7CisJICBpZiAoISBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKKwkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKKwkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAorCQkgICBleHAtPmFzc2lnbi5kc3QpOworCX0KKyAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfYmluYXJ5OgorICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKKyAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKKyAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKKyAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOworICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfdW5hcnk6CisgICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIC5uZWVkIHNlY3Rpb24sIGFuZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCisgICBUaGUgYmFja2VuZCB3aWxsIHNldCB0aGUgbGRfbmVlZCBmaWVsZCBvZiB0aGUgZHluYW1pYyBsaW5raW5nCisgICBpbmZvcm1hdGlvbiB0byBwb2ludCB0byB0aGUgLm5lZWQgc2VjdGlvbi4gIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oCisgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9jb3VudF9uZWVkIChpbnApCisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucDsKK3sKKyAgaWYgKGlucC0+dGhlX2JmZCAhPSBOVUxMCisgICAgICAmJiAoaW5wLT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCisgICAgeworICAgICAgKytuZWVkX2VudHJpZXM7CisgICAgICBuZWVkX3NpemUgKz0gTkVFRF9FTlRSWV9TSVpFOworICAgICAgaWYgKCEgaW5wLT5pc19hcmNoaXZlKQorCW5lZWRfc2l6ZSArPSBzdHJsZW4gKGlucC0+ZmlsZW5hbWUpICsgMTsKKyAgICAgIGVsc2UKKwl7CisJICBBU1NFUlQgKGlucC0+bG9jYWxfc3ltX25hbWVbMF0gPT0gJy0nCisJCSAgJiYgaW5wLT5sb2NhbF9zeW1fbmFtZVsxXSA9PSAnbCcpOworCSAgbmVlZF9zaXplICs9IHN0cmxlbiAoaW5wLT5sb2NhbF9zeW1fbmFtZSArIDIpICsgMTsKKwl9CisgICAgfQorfQorCisvKiBGaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgLm5lZWQgc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZCAoaW5wKQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Cit7CisgIGlmIChpbnAtPnRoZV9iZmQgIT0gTlVMTAorICAgICAgJiYgKGlucC0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgYzsKKworICAgICAgLyogVG8gcmVhbGx5IGZpbGwgaW4gdGhlIC5uZWVkIHNlY3Rpb24gY29udGVudHMsIHdlIG5lZWQgdG8ga25vdworCSB0aGUgZmluYWwgZmlsZSBwb3NpdGlvbiBvZiB0aGUgc2VjdGlvbiwgYnV0IHdlIGRvbid0LgorCSBJbnN0ZWFkLCB3ZSB1c2Ugb2Zmc2V0cywgYW5kIHJlbHkgb24gdGhlIEJGRCBiYWNrZW5kIHRvCisJIGZpbmlzaCB0aGUgc2VjdGlvbiB1cCBjb3JyZWN0bHkuICBGSVhNRTogVGFsayBhYm91dCBsYWNrIG9mCisJIHJlZmVyZW50aWFsIGxvY2FsaXR5LiAgKi8KKyAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5lZWRfcG5hbWVzIC0gbmVlZF9jb250ZW50cywgbmVlZF9waW5mbyk7CisgICAgICBpZiAoISBpbnAtPmlzX2FyY2hpdmUpCisJeworCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyA0KTsKKwkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgOCk7CisJICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDEwKTsKKwkgIHN0cmNweSAobmVlZF9wbmFtZXMsIGlucC0+ZmlsZW5hbWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICp2ZXJzdHI7CisJICBpbnQgbWFqLCBtaW47CisKKwkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAweDgwMDAwMDAwLCBuZWVkX3BpbmZvICsgNCk7CisJICBtYWogPSAwOworCSAgbWluID0gMDsKKwkgIHZlcnN0ciA9IHN0cnN0ciAoaW5wLT5maWxlbmFtZSwgIi5zby4iKTsKKwkgIGlmICh2ZXJzdHIgIT0gTlVMTCkKKwkgICAgc3NjYW5mICh2ZXJzdHIsICIuc28uJWQuJWQiLCAmbWFqLCAmbWluKTsKKwkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSBtYWosIG5lZWRfcGluZm8gKyA4KTsKKwkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSBtaW4sIG5lZWRfcGluZm8gKyAxMCk7CisJICBzdHJjcHkgKG5lZWRfcG5hbWVzLCBpbnAtPmxvY2FsX3N5bV9uYW1lICsgMik7CisJfQorCisgICAgICBjID0gKG5lZWRfcGluZm8gLSBuZWVkX2NvbnRlbnRzKSAvIE5FRURfRU5UUllfU0laRTsKKyAgICAgIGlmIChjICsgMSA+PSBuZWVkX2VudHJpZXMpCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyAxMik7CisgICAgICBlbHNlCisJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIChjICsgMSkgKiBORUVEX0VOVFJZX1NJWkUsCisJCSAgICBuZWVkX3BpbmZvICsgMTIpOworCisgICAgICBuZWVkX3BpbmZvICs9IE5FRURfRU5UUllfU0laRTsKKyAgICAgIG5lZWRfcG5hbWVzICs9IHN0cmxlbiAobmVlZF9wbmFtZXMpICsgMTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK2dsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK0VPRgorCitpZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKK3RoZW4KKyMgU2NyaXB0cyBjb21waWxlZCBpbi4KKworIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCitzYz0ncy9bIlxcXS9cXCYvZworcy8kL1xcblxcLworMXMvXi8iLworJHMvJC9uIi8KKycKKworY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOworICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKKyAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCisgICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKKyAgZWxzZQorICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKK30KK0VPRgorCitlbHNlCisjIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorewkJCSAgICAgCisgICppc2ZpbGUgPSAxOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKKyAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7CisgIGVsc2UKKyAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKK30KK0VPRgorCitmaQorCitjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorCitzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAoreworICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCisgIHN5c2xpYl9kZWZhdWx0LAorICBobGxfZGVmYXVsdCwKKyAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKKyAgIiR7RU1VTEFUSU9OX05BTUV9IiwKKyAgIiR7T1VUUFVUX0ZPUk1BVH0iLAorICBOVUxMLCAvKiBmaW5pc2ggKi8KKyAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMsCisgIE5VTEwsIC8qIG9wZW5fZHluYW1pY19saWJyYXJ5ICovCisgIE5VTEwsIC8qIHBsYWNlX29ycGhhbiAqLworICBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scworfTsKK0VPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3ZhbmlsbGEuZW0gYi9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUzNmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZW11bHRlbXBsL3ZhbmlsbGEuZW0KQEAgLTAsMCArMSw2OSBAQAorIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCisjIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgorY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgorLyogQSB2YW5pbGxhIGVtdWxhdGlvbiB3aXRoIG5vIGRlZmF1bHRzCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorCitzdGF0aWMgdm9pZCB2YW5pbGxhX2JlZm9yZV9wYXJzZSgpCit7Cit9CisKK3N0YXRpYyB2b2lkCit2YW5pbGxhX3NldF9vdXRwdXRfYXJjaCgpCit7CisgIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLworICB1bnNpZ25lZCBsb25nICBtYWNoaW5lID0gMDsKKyAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOworfQorCitzdGF0aWMgY2hhciAqCit2YW5pbGxhX2dldF9zY3JpcHQoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK3sKKyAgKmlzZmlsZSA9IDA7CisgIHJldHVybiAiIjsKK30KKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF92YW5pbGxhX2VtdWxhdGlvbiA9IAoreworICB2YW5pbGxhX2JlZm9yZV9wYXJzZSwKKyAgc3lzbGliX2RlZmF1bHQsCisgIGhsbF9kZWZhdWx0LAorICBhZnRlcl9wYXJzZV9kZWZhdWx0LAorICBhZnRlcl9vcGVuX2RlZmF1bHQsCisgIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKKyAgdmFuaWxsYV9zZXRfb3V0cHV0X2FyY2gsCisgIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKKyAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKKyAgdmFuaWxsYV9nZXRfc2NyaXB0LAorICAidmFuaWxsYSIsCisgICJhLm91dC1zdW5vcy1iaWciCit9OworRU9GCmRpZmYgLS1naXQgYS9sZC9nZW4tZG9jLnRleGkgYi9sZC9nZW4tZG9jLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzNjcyNwotLS0gL2Rldi9udWxsCisrKyBiL2xkL2dlbi1kb2MudGV4aQpAQCAtMCwwICsxLDEzIEBACitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBWQVJTOgorQGMgMS4gSW5jbHVzaXZlbmVzcyBvZiB0aGlzIG1hbnVhbAorQHNldCBHRU5FUklDCisKK0BjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcworQHNldCBIODMwMAorQHNldCBJOTYwCisKK0BjIDMuIFByb3BlcnRpZXMgb2YgdGhpcyBjb25maWd1cmF0aW9uCitAY2xlYXIgU2luZ2xlRm9ybWF0CitAc2V0IFVzZXNFbnZWYXJzCitAYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIENPTkZJR1VSQVRJT04gVkFSUworCmRpZmYgLS1naXQgYS9sZC9nZW5zY3JpcHRzLnNoIGIvbGQvZ2Vuc2NyaXB0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZWE1NDAxCi0tLSAvZGV2L251bGwKKysrIGIvbGQvZ2Vuc2NyaXB0cy5zaApAQCAtMCwwICsxLDEzMyBAQAorIyEvYmluL3NoCisjIGdlbnNjcmlwdHMuc2ggLSBnZW5lcmF0ZSB0aGUgbGQtZW11bGF0aW9uLXRhcmdldCBzcGVjaWZpYyBmaWxlcworIworIyBVc2FnZTogZ2Vuc2NyaXB0cy5zaCBzcmNkaXIgbGliZGlyIGhvc3QgdGFyZ2V0IHRhcmdldF9hbGlhcyBcCisjIGRlZmF1bHRfZW11bGF0aW9uIG5hdGl2ZV9saWJfZGlycyB0aGlzX2VtdWxhdGlvbiB0b29sX2RpcgorIworIyBTYW1wbGUgdXNhZ2U6CisjIGdlbnNjcmlwdHMuc2ggL2RqbS9sZC1kZXZvL2Rldm8vbGQgL3Vzci9sb2NhbC9saWIgc3BhcmMtc3VuLXN1bm9zNC4xLjMgXAorIyBzcGFyYy1zdW4tc3Vub3M0LjEuMyBzcGFyYy1zdW4tc3Vub3M0LjEuMyBzdW40ICIiIHN1bjMgc3BhcmMtc3VuLXN1bm9zNC4xLjMKKyMgcHJvZHVjZXMgc3VuMy54IHN1bjMueGJuIHN1bjMueG4gc3VuMy54ciBzdW4zLnh1IGVtX3N1bjMuYworCitzcmNkaXI9JDEKK2xpYmRpcj0kMgoraG9zdD0kMwordGFyZ2V0PSQ0Cit0YXJnZXRfYWxpYXM9JDUKK0RFRkFVTFRfRU1VTEFUSU9OPSQ2CitOQVRJVkVfTElCX0RJUlM9JDcKK0VNVUxBVElPTl9OQU1FPSQ4Cit0b29sX2xpYj1gZWNobyAke2xpYmRpcn0gfCBzZWQgLWUgJ3N8L2xpYiR8fCdgLyR7OS0kdGFyZ2V0X2FsaWFzfS9saWIKKworIyBJbmNsdWRlIHRoZSBlbXVsYXRpb24tc3BlY2lmaWMgcGFyYW1ldGVyczoKKy4gJHtzcmNkaXJ9L2VtdWxwYXJhbXMvJHtFTVVMQVRJT05fTkFNRX0uc2gKKworaWYgdGVzdCAtZCBsZHNjcmlwdHM7IHRoZW4KKyAgdHJ1ZQorZWxzZQorICBta2RpciBsZHNjcmlwdHMKK2ZpCisKKyMgU2V0IHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLCBmb3IgbGlicmFyaWVzIG5hbWVkIGJ5IC1sZm9vLgorIyBJZiBMSUJfUEFUSCBpcyBkZWZpbmVkIChlLmcuLCBieSBNYWtlZmlsZSkgYW5kIG5vbi1lbXB0eSwgaXQgaXMgdXNlZC4KKyMgT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBpcyBzZXQgaGVyZS4KKyMKKyMgVGhlIGZvcm1hdCBpcyB0aGUgdXN1YWwgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQgZGlyZWN0b3JpZXMuCisjIFRvIGZvcmNlIGEgbG9naWNhbGx5IGVtcHR5IExJQl9QQVRILCBkbyBMSUJQQVRIPSI6Ii4KKworaWYgWyAieCR7TElCX1BBVEh9IiA9ICJ4IiBdIDsgdGhlbgorICBpZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KKyAgICBpZiBbICJ4JHtERUZBVUxUX0VNVUxBVElPTn0iID0gIngke0VNVUxBVElPTl9OQU1FfSIgXSA7IHRoZW4KKyAgICAgICMgTmF0aXZlLgorICAgICAgTElCX1BBVEg9L2xpYjovdXNyL2xpYgorICAgICAgaWYgWyAtbiAiJHtOQVRJVkVfTElCX0RJUlN9IiBdOyB0aGVuCisJTElCX1BBVEg9JHtMSUJfUEFUSH06JHtOQVRJVkVfTElCX0RJUlN9CisgICAgICBmaQorICAgICAgaWYgWyAiJHtsaWJkaXJ9IiAhPSAvdXNyL2xpYiBdOyB0aGVuCisJTElCX1BBVEg9JHtMSUJfUEFUSH06JHtsaWJkaXJ9CisgICAgICBmaQorICAgICAgaWYgWyAiJHtsaWJkaXJ9IiAhPSAvdXNyL2xvY2FsL2xpYiBdIDsgdGhlbgorCUxJQl9QQVRIPSR7TElCX1BBVEh9Oi91c3IvbG9jYWwvbGliCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgICMgTmF0aXZlLCBidXQgbm90IGRlZmF1bHQgZW11bGF0aW9uLgorICAgICAgTElCX1BBVEg9CisgICAgZmkKKyAgZWxzZQorICAgICMgQ3Jvc3MuCisgICAgTElCX1BBVEg9CisgIGZpCitmaQorCisjIEFsd2F5cyBzZWFyY2ggJCh0b29sZGlyKS9saWIsIGFrYSAvdXNyL2xvY2FsL1RBUkdFVC9saWIuCitMSUJfUEFUSD0ke0xJQl9QQVRIfToke3Rvb2xfbGlifQorCitMSUJfU0VBUkNIX0RJUlM9YGVjaG8gJHtMSUJfUEFUSH0gfCB0ciAnOicgJyAnIHwgc2VkIC1lICdzL1woW14gXVteIF0qXCkvU0VBUkNIX0RJUihcMSk7L2cnYAorCisjIEdlbmVyYXRlIDUgb3IgNiBzY3JpcHQgZmlsZXMgZnJvbSBhIG1hc3RlciBzY3JpcHQgdGVtcGxhdGUgaW4KKyMgJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNoLiAgV2hpY2ggb25lIG9mIHRoZSA1IG9yIDYKKyMgc2NyaXB0IGZpbGVzIGlzIGFjdHVhbGx5IHVzZWQgZGVwZW5kcyBvbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBnaXZlbgorIyB0byBsZC4gIChTQ1JJUFRfTkFNRSB3YXMgc2V0IGluIHRoZSBlbXVscGFyYW1zX2ZpbGUuKQorIworIyBBIC54IHNjcmlwdCBmaWxlIGlzIHRoZSBkZWZhdWx0IHNjcmlwdC4KKyMgQSAueHIgc2NyaXB0IGlzIGZvciBsaW5raW5nIHdpdGhvdXQgcmVsb2NhdGlvbiAoLXIgZmxhZykuCisjIEEgLnh1IHNjcmlwdCBpcyBsaWtlIC54ciwgYnV0ICpkbyogY3JlYXRlIGNvbnN0cnVjdG9ycyAoLVVyIGZsYWcpLgorIyBBIC54biBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aCAtbiBmbGFnIChtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UpLgorIyBBIC54Ym4gc2NyaXB0IGlzIGZvciBsaW5raW5nIHdpdGggLU4gZmxhZyAobWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlKS4KKyMgQSAueHMgc2NyaXB0IGlzIGZvciBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCB0aGUgLS1zaGFyZWQKKyMgICBmbGFnOyBpdCBpcyBvbmx5IGdlbmVyYXRlZCBpZiAkR0VORVJBVEVfU0hMSUJfU0NSSVBUIGlzIHNldCBieSB0aGUKKyMgICBlbXVsYXRpb24gcGFyYW1ldGVycy4KKworU0VHTUVOVF9TSVpFPSR7U0VHTUVOVF9TSVpFLSR7VEFSR0VUX1BBR0VfU0laRX19CisKKyMgRGV0ZXJtaW5lIERBVEFfQUxJR05NRU5UIGZvciB0aGUgNSB2YXJpYW50cywgdXNpbmcKKyMgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgZW11bHBhcmFtcy88ZW11bGF0aW9uPi5zaCBmaWxlIG9yIGRlZmF1bHQuCisKK0RBVEFfQUxJR05NRU5UXz0iJHtEQVRBX0FMSUdOTUVOVF8tJHtEQVRBX0FMSUdOTUVOVC1BTElHTigke1NFR01FTlRfU0laRX0pfX0iCitEQVRBX0FMSUdOTUVOVF9uPSIke0RBVEFfQUxJR05NRU5UX24tJHtEQVRBX0FMSUdOTUVOVF99fSIKK0RBVEFfQUxJR05NRU5UX049IiR7REFUQV9BTElHTk1FTlRfTi0ke0RBVEFfQUxJR05NRU5ULS59fSIKK0RBVEFfQUxJR05NRU5UX3I9IiR7REFUQV9BTElHTk1FTlRfci0ke0RBVEFfQUxJR05NRU5ULX19IgorREFUQV9BTElHTk1FTlRfdT0iJHtEQVRBX0FMSUdOTUVOVF91LSR7REFUQV9BTElHTk1FTlRfcn19IgorCitMRF9GTEFHPXIKK0RBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfcn0KK0RFRkFVTFRfREFUQV9BTElHTk1FTlQ9IkFMSUdOKCR7U0VHTUVOVF9TSVpFfSkiCisoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKKyAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyCisKK0xEX0ZMQUc9dQorREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF91fQorQ09OU1RSVUNUSU5HPSIgIgorKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCisgIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dQorCitMRF9GTEFHPQorREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF99CitSRUxPQ0FUSU5HPSIgIgorKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCisgIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54CisKK0xEX0ZMQUc9bgorREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9ufQorVEVYVF9TVEFSVF9BRERSPSR7Tk9OUEFHRURfVEVYVF9TVEFSVF9BRERSLSR7VEVYVF9TVEFSVF9BRERSfX0KKyguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAorICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4KKworTERfRkxBRz1OCitEQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX059CisoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKKyAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibgorCitpZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIjsgdGhlbgorICBMRF9GTEFHPXNoYXJlZAorICBEQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3MtJHtEQVRBX0FMSUdOTUVOVF99fQorICBDUkVBVEVfU0hMSUI9IiAiCisgICMgTm90ZSB0aGF0IFRFWFRfU1RBUlRfQUREUiBpcyBzZXQgdG8gTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSLgorICAoLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKKyAgICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHMKK2ZpCisKK3Rlc3QgIiRERUZBVUxUX0VNVUxBVElPTiIgPSAiJEVNVUxBVElPTl9OQU1FIiAmJiBDT01QSUxFX0lOPXRydWUKKworIyBHZW5lcmF0ZSBlJHtFTVVMQVRJT05fTkFNRX0uYy4KKy4gJHtzcmNkaXJ9L2VtdWx0ZW1wbC8ke1RFTVBMQVRFX05BTUUtZ2VuZXJpY30uZW0KZGlmZiAtLWdpdCBhL2xkL2g4LWRvYy50ZXhpIGIvbGQvaDgtZG9jLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjNjJhMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2g4LWRvYy50ZXhpCkBAIC0wLDAgKzEsMTQgQEAKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIFZBUlM6CitAYyAxLiBJbmNsdXNpdmVuZXNzIG9mIHRoaXMgbWFudWFsCitAY2xlYXIgR0VORVJJQworCitAYyAyLiBTcGVjaWZpYyB0YXJnZXQgbWFjaGluZXMKK0BzZXQgSDgzMDAKK0BzZXQgSGl0YWNoaQorQGNsZWFyIEk5NjAKKworQGMgMy4gUHJvcGVydGllcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24KK0BzZXQgU2luZ2xlRm9ybWF0CitAY2xlYXIgVXNlc0VudlZhcnMKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgQ09ORklHVVJBVElPTiBWQVJTCisKZGlmZiAtLWdpdCBhL2xkL2xkLjEgYi9sZC9sZC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTE2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZC4xCkBAIC0wLDAgKzEsMTExNSBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisuXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KKy5USCBsZCAxICIxNyBBdWd1c3QgMTk5MiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgorLmRlIEJQCisuc3AKKy50aSBcLS4yaQorXCgqKgorLi4KKworLlNIIE5BTUUKK2xkIFwtIHRoZSBHTlUgbGlua2VyCisKKy5TSCBTWU5PUFNJUworLmh5IDAKKy5uYQorLlRQCisuQiBsZCAKKy5SQiAiW1x8IiBcLW8gIgorLkkgb3V0cHV0XGMKK1wmXHxdIFxjCisuSSBvYmpmaWxlXGMKK1wmLlx8Llx8LgorLmJyCisuUkIgIltcfCIgXC1BXGMKKy5JIGFyY2hpdGVjdHVyZVxjCitcJlx8XSAKKy5SQiAiW1x8IiAiXC1iXCAiXGMKKy5JIGlucHV0LWZvcm1hdFxjCitcJlx8XSAKKy5SQiAiW1x8IiBcLUJzdGF0aWMgIlx8XSIgIAorLlJCICJbXHwiIFwtQmR5bmFtaWMgIlx8XSIgIAorLlJCICJbXHwiIFwtQnN5bWJvbGljICJcfF0iICAKKy5SQiAiW1x8IiAiXC1jXCAiXGMKKy5JIGNvbW1hbmRmaWxlXGMKK1wmXHxdIAorLlJCICJbXHwiIFwtXC1jcmVmICJcfF0iCisuUkIgIltcfCIgXC1kIHwgXC1kYyB8IFwtZHBcYworXHxdCisuYnIKKy5SQiAiW1x8IiAiXC1kZWZzeW1cICJcYworLkkgc3ltYm9sXGMKK1wmID0gXGMKKy5JIGV4cHJlc3Npb25cYworXCZcfF0KKy5SQiAiW1x8IiBcLVwtZGVtYW5nbGUgIlx8XSIKKy5SQiAiW1x8IiBcLVwtbm9cLWRlbWFuZ2xlICJcfF0iCisuUkIgIltcfCIgIlwtZVwgIlxjCisuSSBlbnRyeVxjCitcJlx8XSAKKy5SQiAiW1x8IiBcLWVtYmVkZGVkXC1yZWxvY3MgIlx8XSIKKy5SQiAiW1x8IiBcLUUgIlx8XSIgCisuUkIgIltcfCIgXC1leHBvcnRcLWR5bmFtaWMgIlx8XSIKKy5SQiAiW1x8IiAiXC1mXCAiXGMKKy5JIG5hbWVcYworXCZcfF0KKy5SQiAiW1x8IiAiXC1cLWF1eGlsaWFyeVwgIlxjCisuSSBuYW1lXGMKK1wmXHxdCisuUkIgIltcfCIgIlwtRlwgIlxjCisuSSBuYW1lXGMKK1wmXHxdCisuUkIgIltcfCIgIlwtXC1maWx0ZXJcICJcYworLkkgbmFtZVxjCitcJlx8XQorLlJCICJbXHwiICJcLWZvcm1hdFwgIlxjCisuSSBpbnB1dC1mb3JtYXRcYworXCZcfF0gCisuUkIgIltcfCIgXC1nICJcfF0iIAorLlJCICJbXHwiIFwtRworLkkgc2l6ZVxjCitcJlx8XQorLlJCICJbXHwiICJcLWhcICJcYworLkkgbmFtZVxjCitcJlx8XQorLlJCICJbXHwiICJcLXNvbmFtZVwgIlxjCisuSSBuYW1lXGMKK1wmXHxdCisuUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKKy5SQiAiW1x8IiBcLWkgIlx8XSIKKy5SQiAiW1x8IiBcLWxcYworLkkgYXJcYworXCZcfF0gCisuUkIgIltcfCIgXC1MXGMKKy5JIHNlYXJjaGRpclxjCitcJlx8XSAKKy5SQiAiW1x8IiBcLU0gIlx8XSIgCisuUkIgIltcfCIgXC1NYXAKKy5JIG1hcGZpbGVcYworXCZcfF0gCisuUkIgIltcfCIgXC1tCisuSSBlbXVsYXRpb25cYworXCZcfF0gCisuUkIgIltcfCIgXC1uIHwgXC1OICJcfF0iIAorLlJCICJbXHwiIFwtbm9pbmhpYml0LWV4ZWMgIlx8XSIgCisuUkIgIltcfCIgXC1ub1wta2VlcFwtbWVtb3J5ICJcfF0iIAorLlJCICJbXHwiIFwtbm9cLXdhcm5cLW1pc21hdGNoICJcfF0iIAorLlJCICJbXHwiIFwtT1xjCisuSSBsZXZlbFxjCitcJlx8XQorLlJCICJbXHwiICJcLW9mb3JtYXRcICJcYworLkkgb3V0cHV0LWZvcm1hdFxjCitcJlx8XSAKKy5SQiAiW1x8IiAiXC1SXCAiXGMKKy5JIGZpbGVuYW1lXGMKK1wmXHxdCisuUkIgIltcfCIgXC1yZWxheCAiXHxdIgorLlJCICJbXHwiIFwtciB8IFwtVXIgIlx8XSIgCisuUkIgIltcfCIgIlwtcnBhdGhcICJcYworLkkgZGlyZWN0b3J5XGMKK1wmXHxdCisuUkIgIltcfCIgIlwtcnBhdGhcLWxpbmtcICJcYworLkkgZGlyZWN0b3J5XGMKK1wmXHxdCisuUkIgIltcfCIgXC1TICJcfF0iIAorLlJCICJbXHwiIFwtcyAiXHxdIiAKKy5SQiAiW1x8IiBcLXNoYXJlZCAiXHxdIiAKKy5SQiAiW1x8IiBcLXNvcnRcLWNvbW1vbiAiXHxdIiAKKy5SQiAiW1x8IiAiXC1zcGxpdFwtYnlcLXJlbG9jXCAiXGMKKy5JIGNvdW50XGMKK1wmXHxdCisuUkIgIltcfCIgXC1zcGxpdFwtYnlcLWZpbGUgIlx8XSIgCisuUkIgIltcfCIgIlwtVFwgIlxjCisuSSBjb21tYW5kZmlsZVxjCitcJlx8XSAgCisuUkIgIltcfCIgIlwtVHRleHRcICJcYworLkkgdGV4dG9yZ1xjCitcJlx8XSAKKy5SQiAiW1x8IiAiXC1UZGF0YVwgIlxjCisuSSBkYXRhb3JnXGMKK1wmXHxdIAorLlJCICJbXHwiICJcLVRic3NcICJcYworLkkgYnNzb3JnXGMKK1wmXHxdCisuUkIgIltcfCIgXC10ICJcfF0iIAorLlJCICJbXHwiICJcLXVcICJcYworLkkgc3ltXGMKK1wmXQorLlJCICJbXHwiIFwtViAiXHxdIgorLlJCICJbXHwiIFwtdiAiXHxdIgorLlJCICJbXHwiIFwtXC12ZXJib3NlICJcfF0iCisuUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKKy5SQiAiW1x8IiBcLXdhcm5cLWNvbW1vbiAiXHxdIiAKKy5SQiAiW1x8IiBcLXdhcm5cLWNvbnN0cnVjdG9ycyAiXHxdIiAKKy5SQiAiW1x8IiBcLXdhcm5cLW11bHRpcGxlXC1ncCAiXHxdIiAKKy5SQiAiW1x8IiBcLXdhcm5cLW9uY2UgIlx8XSIgCisuUkIgIltcfCIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbiAiXHxdIiAKKy5SQiAiW1x8IiBcLVwtd2hvbGVcLWFyY2hpdmUgIlx8XSIgCisuUkIgIltcfCIgXC1cLW5vXC13aG9sZVwtYXJjaGl2ZSAiXHxdIiAKKy5SQiAiW1x8IiAiXC1cLXdyYXBcICJcYworLkkgc3ltYm9sXGMKK1wmXHxdCisuUkIgIltcfCIgXC1YICJcfF0iIAorLlJCICJbXHwiIFwteCAiXHxdIiAKKy5hZCBiCisuaHkgMQorLlNIIERFU0NSSVBUSU9OCitcYworLkIgbGRcYworXCYgY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKK3RoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIE9mdGVuIHRoZSBsYXN0IHN0ZXAgaW4KK2J1aWxkaW5nIGEgbmV3IGNvbXBpbGVkIHByb2dyYW0gdG8gcnVuIGlzIGEgY2FsbCB0byBcYworLkIgbGRcYworXCYuCisKK1xjCisuQiBsZFxjCitcJiBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIAordG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCitUaGlzIG1hbiBwYWdlIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBjb21tYW5kIGxhbmd1YWdlOyBzZWUgdGhlIGBcfFxjCisuQiBsZFxjCitcfCcgZW50cnkgaW4gYFx8XGMKKy5CIGluZm9cYworXHwnLCBvciB0aGUgbWFudWFsCisuSQorbGQ6IHRoZSBHTlUgbGlua2VyCitcJiwgZm9yIGZ1bGwgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsYW5ndWFnZSBhbmQgb24gb3RoZXIgYXNwZWN0cyBvZgordGhlIEdOVSBsaW5rZXIuIAorCitUaGlzIHZlcnNpb24gb2YgXGMKKy5CIGxkXGMKK1wmIHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBCRkQgbGlicmFyaWVzCit0byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgXGMKKy5CIGxkXGMKK1wmIHRvIHJlYWQsIGNvbWJpbmUsIGFuZAord3JpdGUgb2JqZWN0IGZpbGVzIGluIG1hbnkgZGlmZmVyZW50IGZvcm1hdHNcKGVtXCZmb3IgZXhhbXBsZSwgQ09GRiBvcgorXGMKKy5CIGEub3V0XGMKK1wmLiAgRGlmZmVyZW50IGZvcm1hdHMgbWF5IGJlIGxpbmtlZCB0b2dldGhlciB0byBwcm9kdWNlIGFueQorYXZhaWxhYmxlIGtpbmQgb2Ygb2JqZWN0IGZpbGUuICBZb3UgY2FuIHVzZSBgXHxcYworLkIgb2JqZHVtcCBcLWlcYworXHwnIHRvIGdldCBhIGxpc3Qgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgb24gdmFyaW91cyBhcmNoaXRlY3R1cmVzOyBzZWUgCisuQlIgb2JqZHVtcCAoIDEgKS4KKworQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBHTlUgbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCitsaW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KK2V4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCitcYworLkIgbGRcYworXCYgY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycworKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KKworVGhlIEdOVSBsaW5rZXIgXGMKKy5CIGxkXGMKK1wmIGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKK2FuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoreW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSwKK2FuZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKworLlNIIE9QVElPTlMKK1RoZSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgc2VlbSBpbnRpbWlkYXRpbmcsIGJ1dCBpbgorYWN0dWFsIHByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCitGb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIFxjCisuQiBsZFxjCitcJiBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKK29iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bworbGluayBhIGZpbGUgXGMKKy5CIGhlbGxvLm9cYworXCY6Cisuc3AKKy5icgorJFwgbGRcIFwtb1wgb3V0cHV0XCAvbGliL2NydDAub1wgaGVsbG8ub1wgXC1sYworLmJyCisuc3AKK1RoaXMgdGVsbHMgXGMKKy5CIGxkXGMKK1wmIHRvIHByb2R1Y2UgYSBmaWxlIGNhbGxlZCBcYworLkIgb3V0cHV0XGMKK1wmIGFzIHRoZQorcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgXGMKKy5CIC9saWIvY3J0MC5vXGMKK1wmIHdpdGggXGMKKy5CIGhlbGxvLm9cYworXCYgYW5kCit0aGUgbGlicmFyeSBcYworLkIgbGliYy5hXGMKK1wmIHdoaWNoIHdpbGwgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBzZWFyY2gKK2RpcmVjdG9yaWVzLgorCitUaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gXGMKKy5CIGxkXGMKK1wmIG1heSBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyLCBhbmQKK21heSBiZSByZXBlYXRlZCBhdCB3aWxsLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHJlcGVhdGluZyBhbiBvcHRpb24gd2l0aCBhCitkaWZmZXJlbnQgYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKK29jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIGFuCitvcHRpb24uICAKKworVGhlIGV4Y2VwdGlvbnNcKGVtXCZ3aGljaCBtYXkgbWVhbmluZ2Z1bGx5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2VcKGVtXCZhcmUKK1xjCisuQiBcLUFcYworXCYsIFxjCisuQiBcLWJcYworXCYgKG9yIGl0cyBzeW5vbnltIFxjCisuQiBcLWZvcm1hdFxjCitcJiksIFxjCisuQiBcLWRlZnN5bVxjCitcJiwKK1xjCisuQiBcLUxcYworXCYsIFxjCisuQiBcLWxcYworXCYsIFxjCisuQiBcLVJcYworXCYsIGFuZCBcYworLkIgXC11XGMKK1wmLgorCitUaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gYmUgbGlua2VkIHRvZ2V0aGVyLCBzaG93biBhcyBcYworLkkgb2JqZmlsZVxjCitcJiwKK21heSBmb2xsb3csIHByZWNlZGUsIG9yIGJlIG1peGVkIGluIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnM7IHNhdmUgdGhhdAorYW4gXGMKKy5JIG9iamZpbGVcYworXCYgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbiBhbiBvcHRpb24gZmxhZyBhbmQKK2l0cyBhcmd1bWVudC4KKworVXN1YWxseSB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUsIGJ1dCBvdGhlcgorZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB3aXRoIFxjCisuQiBcLWxcYworXCYsCitcYworLkIgXC1SXGMKK1wmLCBhbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgXGMKKy5JIG5vXGMKK1wmIGJpbmFyeSBpbnB1dAorZmlsZXMgYXQgYWxsIGFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQKK2lzc3VlcyB0aGUgbWVzc2FnZSBgXHxcYworLkIgTm8gaW5wdXQgZmlsZXNcYworXHwnLgorCitPcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCit3aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQorb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KKworLlRQCisuQkkgIi1BIiAiYXJjaGl0ZWN0dXJlIgorSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBcYworLkIgbGRcYworXCYsIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKK0ludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgXGMKKy5CIGxkXGMKK1wmIGNvbmZpZ3VyYXRpb24sIHRoZQorXGMKKy5JIGFyY2hpdGVjdHVyZVxjCitcJiBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIHR3by1sZXR0ZXIgbmFtZXMgaWRlbnRpZnlpbmcKK21lbWJlcnMgb2YgdGhlIDk2MCBmYW1pbHk7IHRoZSBvcHRpb24gc3BlY2lmaWVzIHRoZSBkZXNpcmVkIG91dHB1dAordGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55IGluY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzLgorSXQgYWxzbyBtb2RpZmllcyB0aGUgbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8KK3N1cHBvcnQgdGhlIHVzZSBvZiBsaWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyCithcmNoaXRlY3R1cmUsIGJ5IGluY2x1ZGluZyBpbiB0aGUgc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUKK3N0cmluZyBpZGVudGlmeWluZyB0aGUgYXJjaGl0ZWN0dXJlLgorCitGb3IgZXhhbXBsZSwgaWYgeW91ciBcYworLkIgbGRcYworXCYgY29tbWFuZCBsaW5lIGluY2x1ZGVkIGBcfFxjCisuQiBcLUFDQVxjCitcfCcgYXMKK3dlbGwgYXMgYFx8XGMKKy5CIFwtbHRyeVxjCitcfCcsIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAorcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBcYworLkIgXC1MXGMKK1wmKSBmb3IgYSBsaWJyYXJ5IHdpdGgKK3RoZSBuYW1lcworLnNwCisuYnIKK3RyeQorLmJyCitsaWJ0cnkuYQorLmJyCit0cnljYQorLmJyCitsaWJ0cnljYS5hCisuYnIKKy5zcAorCitUaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Cit0d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIGBcfFxjCisuQiBcLUFDQVxjCitcfCcuCisKK0Z1dHVyZSByZWxlYXNlcyBvZiBcYworLkIgbGRcYworXCYgbWF5IHN1cHBvcnQgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGZvcgorb3RoZXIgYXJjaGl0ZWN0dXJlIGZhbWlsaWVzLgorCitZb3UgY2FuIG1lYW5pbmdmdWxseSB1c2UgXGMKKy5CIFwtQVxjCitcJiBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgaWYKK2FuIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCit1c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIFxjCisuQiBcLWwKK3NwZWNpZmllcyBhIGxpYnJhcnkuCisKKy5UUAorLkJJICJcLWIgIiAiaW5wdXQtZm9ybWF0IgorU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzIHRoYXQgZm9sbG93IHRoaXMgb3B0aW9uCitvbiB0aGUgY29tbWFuZCBsaW5lLiAgWW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzCitcYworLkIgbGRcYworXCYgaXMgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYSBkZWZhdWx0IGlucHV0IGZvcm1hdCB0aGUgbW9zdAordXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCisuSSBpbnB1dC1mb3JtYXRcYworXCYgaXMgYSB0ZXh0IHN0cmluZywgdGhlCituYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgCitcYworLkIgXC1mb3JtYXQgXGMKKy5JIGlucHV0LWZvcm1hdFxjCitcJlxjCitcJiBoYXMgdGhlIHNhbWUgZWZmZWN0LCBhcyBkb2VzIHRoZSBzY3JpcHQgY29tbWFuZAorLkJSIFRBUkdFVCAuCisKK1lvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAorYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgXGMKKy5CIFwtYlxjCitcJiB0byBzd2l0Y2ggZm9ybWF0cyBleHBsaWNpdGx5ICh3aGVuCitsaW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyksIGJ5IGluY2x1ZGluZworXGMKKy5CIFwtYiBcYworLkkgaW5wdXQtZm9ybWF0XGMKK1wmXGMKK1wmIGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCitwYXJ0aWN1bGFyIGZvcm1hdC4gIAorCitUaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy5CIEdOVVRBUkdFVFxjCitcJi4gIFlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0Citmb3JtYXQgZnJvbSBhIHNjcmlwdCwgdXNpbmcgdGhlIGNvbW1hbmQgXGMKKy5CIFRBUkdFVFxjCitcJi4KKworLlRQCisuQiBcLUJzdGF0aWMgCitEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgorcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuCisKKy5UUAorLkIgXC1CZHluYW1pYworTGluayBhZ2FpbnN0IGR5bmFtaWMgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24gcGxhdGZvcm1zCitmb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBvcHRpb24gaXMgbm9ybWFsbHkgdGhlCitkZWZhdWx0IG9uIHN1Y2ggcGxhdGZvcm1zLgorCisuVFAKKy5CIFwtQnN5bWJvbGljCitXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0bwordGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzCitwb3NzaWJsZSBmb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlCitkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwKK29uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgorCisuVFAKKy5CSSAiXC1jICIgImNvbW1hbmRmaWxlIgorRGlyZWN0cyBcYworLkIgbGRcYworXCYgdG8gcmVhZCBsaW5rIGNvbW1hbmRzIGZyb20gdGhlIGZpbGUKK1xjCisuSSBjb21tYW5kZmlsZVxjCitcJi4gIFRoZXNlIGNvbW1hbmRzIHdpbGwgY29tcGxldGVseSBvdmVycmlkZSBcYworLkIgbGRcYworXCYncworZGVmYXVsdCBsaW5rIGZvcm1hdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KTsgXGMKKy5JIGNvbW1hbmRmaWxlXGMKK1wmIG11c3QKK3NwZWNpZnkgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIHRhcmdldCBmb3JtYXQuCisKKworWW91IG1heSBhbHNvIGluY2x1ZGUgYSBzY3JpcHQgb2YgbGluayBjb21tYW5kcyBkaXJlY3RseSBpbiB0aGUgY29tbWFuZAorbGluZSBieSBicmFja2V0aW5nIGl0IGJldHdlZW4gYFx8XGMKKy5CIHtcYworXHwnIGFuZCBgXHxcYworLkIgfVxjCitcfCcgY2hhcmFjdGVycy4KKworLlRQCisuQiBcLVwtY3JlZgorT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKK2dlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KK090aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCisuVFAKKy5CIFwtZCAKKy5UUAorLkIgXC1kYworLlRQCisuQiBcLWRwCitUaGVzZSB0aHJlZSBvcHRpb25zIGFyZSBlcXVpdmFsZW50OyBtdWx0aXBsZSBmb3JtcyBhcmUgc3VwcG9ydGVkIGZvcgorY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMuICBVc2UgYW55IG9mIHRoZW0gdG8gbWFrZSBcYworLkIgbGQKK2Fzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMKK3NwZWNpZmllZCAoXGMKKy5CIFwtclxjCitcJikuICBUaGUgc2NyaXB0IGNvbW1hbmQKK1xjCisuQiBGT1JDRV9DT01NT05fQUxMT0NBVElPTlxjCitcJiBoYXMgdGhlIHNhbWUgZWZmZWN0LgorCisuVFAKKy5CSSAiLWRlZnN5bSAiICJzeW1ib2wiICJcZlIgPSBcZlAiIGV4cHJlc3Npb24KK0NyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQorYWRkcmVzcyBnaXZlbiBieSBcYworLkkgZXhwcmVzc2lvblxjCitcJi4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKK3RpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQorbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgXGMKKy5JIGV4cHJlc3Npb25cYworXCYgaW4gdGhpcworY29udGV4dDogeW91IG1heSBnaXZlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQgb3IgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcKK3N5bWJvbCwgb3IgdXNlIFxjCisuQiArXGMKK1wmIGFuZCBcYworLkIgXC1cYworXCYgdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCitjb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgordXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQuCisKKy5UUAorLkIgXC1cLWRlbWFuZ2xlCisuVFAKKy5CIFwtXC1ub1wtZGVtYW5nbGUKK1RoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvcgorbWVzc2FnZXMgYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdAordHJpZXMgdG8gcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwordW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMKK0MrKyBtYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwKK2RlbWFuZ2xlIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkIgQ09MTEVDVF9OT19ERU1BTkdMRQoraXMgc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KKworLlRQCisuQkkgIi1lICIgImVudHJ5IlxjCitcJiAKK1VzZSBcYworLkkgZW50cnlcYworXCYgYXMgdGhlIGV4cGxpY2l0IHN5bWJvbCBmb3IgYmVnaW5uaW5nIGV4ZWN1dGlvbiBvZiB5b3VyCitwcm9ncmFtLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBlbnRyeSBwb2ludC4gIFNlZSB0aGUgYFx8XGMKKy5CIGxkXGMKK1x8JyBlbnRyeSBpbiBgXHxcYworLkIgaW5mb1xjCitcfCcgZm9yIGEKK2Rpc2N1c3Npb24gb2YgZGVmYXVsdHMgYW5kIG90aGVyIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUKK2VudHJ5IHBvaW50LgorCisuVFAKKy5CIFwtZW1iZWRkZWRcLXJlbG9jcworVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gbGlua2luZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLAorZ2VuZXJhdGVkIGJ5IHRoZQorLkIgXC1tZW1iZWRkZWRcLXBpYworb3B0aW9uIHRvIHRoZSBHTlUgY29tcGlsZXIgYW5kIGFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvCitjcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdCBydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoCit3YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyIHZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbgordGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgorCisuVFAKKy5CIFwtRQorLlRQCisuQiBcLWV4cG9ydFwtZHluYW1pYworV2hlbiBjcmVhdGluZyBhbiBFTEYgZmlsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KK05vcm1hbGx5LCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgY29udGFpbnMgb25seSBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkCitieSBhIGR5bmFtaWMgb2JqZWN0LiAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciBzb21lIHVzZXMgb2YKKy5JIGRsb3Blbi4KKworLlRQCisuQkkgIi1mICIgIm5hbWUiCisuVFAKKy5CSSAiLS1hdXhpbGlhcnkgIiAibmFtZSIKK1doZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCit0byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKK3RhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCitzeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QKKy5JIG5hbWUuCisKKy5UUAorLkJJICItRiAiICJuYW1lIgorLlRQCisuQkkgIi0tZmlsdGVyICIgIm5hbWUiCitXaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX0ZJTFRFUiBmaWVsZCB0bwordGhlIHNwZWNpZmllZCBuYW1lLiAgVGhpcyB0ZWxscyB0aGUgZHluYW1pYyBsaW5rZXIgdGhhdCB0aGUgc3ltYm9sIHRhYmxlCitvZiB0aGUgc2hhcmVkIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlciBvbiB0aGUgc3ltYm9sIHRhYmxlIG9mCit0aGUgc2hhcmVkIG9iamVjdAorLkkgbmFtZS4KKworLlRQCisuQkkgIlwtZm9ybWF0ICIgImlucHV0XC1mb3JtYXQiCitTeW5vbnltIGZvciBcYworLkIgXC1iXGMKK1wmIFxjCisuSSBpbnB1dFwtZm9ybWF0XGMKK1wmLgorCisuVFAKKy5CIFwtZworQWNjZXB0ZWQsIGJ1dCBpZ25vcmVkOyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgorCisuVFAKKy5CSSAiXC1HICIgInNpemUiXGMKK1NldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlcgordG8KKy5JIHNpemUKK3VuZGVyIE1JUFMgRUNPRkYuICBJZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgorCisuVFAKKy5CSSAiLWggIiAibmFtZSIKKy5UUAorLkJJICItc29uYW1lICIgIm5hbWUiCitXaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwordGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAord2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCitsaW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKK2ZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCisKKy5UUAorLkIgXC1cLWhlbHAKK1ByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK1RoaXMgb3B0aW9uIGFuZAorLkIgXC1cLXZlcnNpb24KK2JlZ2luIHdpdGggdHdvIGRhc2hlcyBpbnN0ZWFkIG9mIG9uZQorZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBHTlUgcHJvZ3JhbXMuICBUaGUgb3RoZXIgb3B0aW9ucyBzdGFydCB3aXRoCitvbmx5IG9uZSBkYXNoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4KKworLlRQCisuQiBcLWkKK1BlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gXGMKKy5CIFwtclxjCitcJikuCisKKy5UUAorLkJJICJcLWwiICJhciJcYworXCYgCitBZGQgYW4gYXJjaGl2ZSBmaWxlIFxjCisuSSBhclxjCitcJiB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcyAKK29wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgXGMKKy5CIGxkXGMKK1wmIHdpbGwgc2VhcmNoIGl0cworcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBcYworLkIgbGliXGMKKy5JIGFyXGMKK1wmLmFcYworXCYgZm9yIGV2ZXJ5IFxjCisuSSBhcgorc3BlY2lmaWVkLgorCisuVFAKKy5CSSAiXC1MIiAic2VhcmNoZGlyIgorVGhpcyBjb21tYW5kIGFkZHMgcGF0aCBcYworLkkgc2VhcmNoZGlyXGMKK1wmIHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQKK1xjCisuQiBsZFxjCitcJiB3aWxsIHNlYXJjaCBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgorYW55IG51bWJlciBvZiB0aW1lcy4KKworVGhlIGRlZmF1bHQgc2V0IG9mIHBhdGhzIHNlYXJjaGVkICh3aXRob3V0IGJlaW5nIHNwZWNpZmllZCB3aXRoCitcYworLkIgXC1MXGMKK1wmKSBkZXBlbmRzIG9uIHdoYXQgZW11bGF0aW9uIG1vZGUgXGMKKy5CIGxkXGMKK1wmIGlzIHVzaW5nLCBhbmQgaW4KK3NvbWUgY2FzZXMgYWxzbyBvbiBob3cgaXQgd2FzIGNvbmZpZ3VyZWQuICAgIFRoZQorcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUgXGMKKy5CIFNFQVJDSF9ESVIKK2NvbW1hbmQuCisKKy5UUAorLkIgXC1NIAorUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KK2Fib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYworLkIgbGRcYworXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKK2NvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCisKKy5UUAorLkJJICJcLU1hcCAiICJtYXBmaWxlIlxjCitQcmludCB0byB0aGUgZmlsZQorLkkgbWFwZmlsZQorYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KK2Fib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYworLkIgbGRcYworXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKK2NvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCisKKy5UUAorLkJJICJcLW0gIiAiZW11bGF0aW9uIlxjCitFbXVsYXRlIHRoZQorLkkgZW11bGF0aW9uCitsaW5rZXIuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlCisuSSBcLVwtdmVyYm9zZQorb3IKKy5JIFwtVgorb3B0aW9ucy4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCwgd2hpY2ggaXMgdGhlCitzeXN0ZW0gZm9yIHdoaWNoIHlvdSBjb25maWd1cmVkCisuQlIgbGQgLgorCisuVFAKKy5CIFwtTiAKK3NwZWNpZmllcyByZWFkYWJsZSBhbmQgd3JpdGFibGUgXGMKKy5CIHRleHRcYworXCYgYW5kIFxjCisuQiBkYXRhXGMKK1wmIHNlY3Rpb25zLiBJZgordGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peCBzdHlsZSBtYWdpYyBudW1iZXJzLCB0aGUgb3V0cHV0IGlzCittYXJrZWQgYXMgXGMKKy5CIE9NQUdJQ1xjCitcJi4KKworV2hlbiB5b3UgdXNlIHRoZSBgXHxcYworLkIgXC1OXGMKK1wmXHwnIG9wdGlvbiwgdGhlIGxpbmtlciBkb2VzIG5vdCBwYWdlLWFsaWduIHRoZQorZGF0YSBzZWdtZW50LgorCisuVFAKKy5CIFwtbiAKK3NldHMgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBcYworLkIgTk1BR0lDXGMKK1wmIGlzIHdyaXR0ZW4KK2lmIHBvc3NpYmxlLgorCisuVFAKKy5CIFwtbm9pbmhpYml0XC1leGVjCitOb3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKK2Vycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2Vzcy4gIFdpdGggdGhpcyBmbGFnLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAoreW91IHdpc2ggdGhlIG91dHB1dCBmaWxlIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbm9uLWZhdGFsIGVycm9ycy4KKworLlRQCisuQiBcLW5vXC1rZWVwXC1tZW1vcnkKK1RoZSBsaW5rZXIgbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nCit0aGUgc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUKK2xpbmtlciB0byBpbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sCit0YWJsZXMgYXMgbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGxpbmtlciBydW5zIG91dCBvZgorbWVtb3J5IHNwYWNlIHdoaWxlIGxpbmtpbmcgYSBsYXJnZSBleGVjdXRhYmxlLgorCisuVFAKKy5CIFwtbm9cLXdhcm5cLW1pc21hdGNoCitOb3JtYWxseSB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGxpbmsgdG9nZXRoZXIKK2lucHV0IGZpbGVzIHRoYXQgYXJlIG1pc21hdGNoZWQgZm9yIHNvbWUgcmVhc29uLCBwZXJoYXBzIGJlY2F1c2UgdGhleQoraGF2ZSBiZWVuIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgcHJvY2Vzc29ycyBvciBmb3IgZGlmZmVyZW50CitlbmRpYW5uZXNzZXMuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUgbGlua2VyIHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5CitwZXJtaXQgc3VjaCBwb3NzaWJsZSBlcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGgKK2NhcmUsIGluIGNhc2VzIHdoZW4geW91IGhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMKK3RoYXQgdGhlIGxpbmtlciBlcnJvcnMgYXJlIGluYXBwcm9wcmlhdGUuCisKKy5UUAorLkJJICJcLW8gIiAib3V0cHV0IgorLkkgb3V0cHV0XGMKK1wmIGlzIGEgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgXGMKKy5CIGxkXGMKK1wmOyBpZiB0aGlzCitvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgYFx8XGMKKy5CIGEub3V0XGMKK1x8JyBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKK3NjcmlwdCBjb21tYW5kIFxjCisuQiBPVVRQVVRcYworXCYgY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKworLlRQCisuQkkgIlwtTyIgImxldmVsIgorR2VuZXJhdGUgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQgdXNlIHNpZ25pZmljYW50bHkgbW9yZQordGltZSBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IHNob3VsZCBiZSBlbmFibGVkIG9ubHkgZm9yIGdlbmVyYXRpbmcgdGhlCitmaW5hbCBiaW5hcnkuCitcYworLkkgbGV2ZWxcYworXCYgaXMgc3VwcG9zZWQgdG8gYmUgYSBudW1lcmljIHZhbHVlLiAgQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGVuYWJsZXMKK3RoZSBvcHRpbWl6YXRpb25zLgorCisuVFAKKy5CSSAiXC1vZm9ybWF0ICIgIm91dHB1dFwtZm9ybWF0IgorU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvYmplY3QgZmlsZS4KK1lvdSBkb24ndCB1c3VhbGx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzLCBhcworXGMKKy5CIGxkXGMKK1wmIGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAordXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCisuSSBvdXRwdXQtZm9ybWF0XGMKK1wmIGlzIGEgdGV4dCBzdHJpbmcsIHRoZQorbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgQkZEIGxpYnJhcmllcy4gIAorVGhlIHNjcmlwdCBjb21tYW5kCisuQiBPVVRQVVRfRk9STUFUCitjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIGl0LgorCisuVFAKKy5CSSAiXC1SICIgImZpbGVuYW1lIgorUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIFxjCisuSSBmaWxlbmFtZVxjCitcJiwgYnV0IGRvIG5vdAorcmVsb2NhdGUgaXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgb3V0cHV0LiAgVGhpcyBhbGxvd3MgeW91ciBvdXRwdXQgZmlsZQordG8gcmVmZXIgc3ltYm9saWNhbGx5IHRvIGFic29sdXRlIGxvY2F0aW9ucyBvZiBtZW1vcnkgZGVmaW5lZCBpbiBvdGhlcgorcHJvZ3JhbXMuCisKKy5UUAorLkIgXC1yZWxheAorQW4gb3B0aW9uIHdpdGggbWFjaGluZSBkZXBlbmRlbnQgZWZmZWN0cy4gIEN1cnJlbnRseSB0aGlzIG9wdGlvbiBpcyBvbmx5CitzdXBwb3J0ZWQgb24gdGhlIEg4LzMwMC4KKworT24gc29tZSBwbGF0Zm9ybXMsIHVzZSB0aGlzIG9wdGlvbiB0byBwZXJmb3JtIGdsb2JhbCBvcHRpbWl6YXRpb25zIHRoYXQKK2JlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZyBpbiB5b3VyIHByb2dyYW0sIHN1Y2gKK2FzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcgaW5zdHJ1Y3Rpb25zIGluIHRoZQorb3V0cHV0IG9iamVjdCBmaWxlLiAgCisKK09uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIGBcfFxjCisuQiBcLXJlbGF4XGMKK1wmXHwnIGlzIGFjY2VwdGVkLCBidXQgaGFzIG5vIGVmZmVjdC4KKworLlRQCisuQiBcLXIgCitHZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0XChlbVwmaS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KK3R1cm4gc2VydmUgYXMgaW5wdXQgdG8gXGMKKy5CIGxkXGMKK1wmLiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgXGMKKy5JIHBhcnRpYWwKK2xpbmtpbmdcYworXCYuICBBcyBhIHNpZGUgZWZmZWN0LCBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIFVuaXgKK21hZ2ljIG51bWJlcnMsIHRoaXMgb3B0aW9uIGFsc28gc2V0cyB0aGUgb3V0cHV0IGZpbGUncyBtYWdpYyBudW1iZXIgdG8KK1xjCisuQiBPTUFHSUNcYworXCYuCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgorbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIFxjCisuSSB3aWxsIG5vdFxjCitcJiByZXNvbHZlIHJlZmVyZW5jZXMgdG8KK2NvbnN0cnVjdG9yczsgXGMKKy5CIFwtVXJcYworXCYgaXMgYW4gYWx0ZXJuYXRpdmUuIAorCitUaGlzIG9wdGlvbiBkb2VzIHRoZSBzYW1lIGFzIFxjCisuQiBcLWlcYworXCYuCisKKy5UUAorLkIgXC1ycGF0aFwgXGZJZGlyZWN0b3J5CitBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCitsaW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgCisuQiBcLXJwYXRoCithcmd1bWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgcGFzc2VkIHRvIHRoZSBydW50aW1lIGxpbmtlciwgd2hpY2ggdXNlcwordGhlbSB0byBsb2NhdGUgc2hhcmVkIG9iamVjdHMgYXQgcnVudGltZS4gIFRoZQorLkIgXC1ycGF0aAorb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkKK3NoYXJlZCBvYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YKK3RoZQorLkIgXC1ycGF0aFwtbGluaworb3B0aW9uLiAgSWYKKy5CIFwtcnBhdGgKK2lzIG5vdCB1c2VkIHdoZW4gbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZQorZW52aXJvbm1lbnQgdmFyaWFibGUKKy5CIExEX1JVTl9QQVRICit3aWxsIGJlIHVzZWQgaWYgaXQgaXMgZGVmaW5lZC4KKworVGhlCisuQiBcLXJwYXRoCitvcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uIFN1bk9TLCB0aGUgbGlua2VyCit3aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRoIG91dCBvZiBhbGwgdGhlCisuQiBcLUwKK29wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhCisuQiBcLXJwYXRoCitvcHRpb24gaXMgdXNlZCwgdGhlIHJ1bnRpbWUgc2VhcmNoIHBhdGggd2lsbCBiZSBmb3JtZWQgZXhjbHVzaXZlbHkKK3VzaW5nIHRoZQorLkIgXC1ycGF0aAorb3B0aW9ucywgaWdub3JpbmcKK3RoZQorLkIgXC1MCitvcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcgZ2NjLCB3aGljaCBhZGRzIG1hbnkKKy5CIFwtTAorb3B0aW9ucyB3aGljaCBtYXkgYmUgb24gTkZTIG1vdW50ZWQgZmlsZXN5c3RlbXMuCisKKy5UUAorLkIgXC1ycGF0aFwtbGlua1wgXGZJZGlyZWN0b3J5CitXaGVuIHVzaW5nIEVMRiBvciBTdW5PUywgb25lIHNoYXJlZCBsaWJyYXJ5IG1heSByZXF1aXJlIGFub3RoZXIuICBUaGlzCitoYXBwZW5zIHdoZW4gYW4KKy5CIGxkXCBcLXNoYXJlZAorbGluayBpbmNsdWRlcyBhIHNoYXJlZCBsaWJyYXJ5IGFzIG9uZSBvZiB0aGUgaW5wdXQgZmlsZXMuCisKK1doZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAorbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQKK3NoYXJlZCBsaWJyYXJ5IGFuZCBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLCBpZiBpdCBpcyBub3QgaW5jbHVkZWQKK2V4cGxpY2l0bHkuICBJbiBzdWNoIGEgY2FzZSwgdGhlCisuQiBcLXJwYXRoXC1saW5rCitvcHRpb24gc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCisuQiBcLXJwYXRoXC1saW5rCitvcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMgZWl0aGVyIGJ5IHNwZWNpZnlpbmcKK2EgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieSBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCisKK0lmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCit3YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgorCisuVFAKKy5CIFwtUyAKK09taXRzIGRlYnVnZ2VyIHN5bWJvbCBpbmZvcm1hdGlvbiAoYnV0IG5vdCBhbGwgc3ltYm9scykgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCisKKy5UUAorLkIgXC1zIAorT21pdHMgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KKworLlRQCisuQiBcLXNoYXJlZAorQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgYW5kCitTdW5PUyBwbGF0Zm9ybXMgKG9uIFN1bk9TIGl0IGlzIG5vdCByZXF1aXJlZCwgYXMgdGhlIGxpbmtlciB3aWxsCithdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGhlcmUgYXJlIHVuZGVmaW5lZCBzeW1ib2xzCithbmQgdGhlCisuQiBcLWUKK29wdGlvbiBpcyBub3QgdXNlZCkuCisKKy5UUAorLkIgXC1zb3J0XC1jb21tb24KK05vcm1hbGx5LCB3aGVuCisuQiBsZAorcGxhY2VzIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgaW4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9ucywKK2l0IHNvcnRzIHRoZW0gYnkgc2l6ZS4gIEZpcnN0IGNvbWUgYWxsIHRoZSBvbmUgYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbAordGhlIHR3byBieXRlcywgdGhlbiBhbGwgdGhlIGZvdXIgYnl0ZXMsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgZWxzZS4KK1RoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KK2FsaWdubWVudCBjb25zdHJhaW50cy4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoYXQgc29ydGluZy4KKworLlRQCisuQiBcLXNwbGl0XC1ieVwtcmVsb2NcIFxmSWNvdW50CitUcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCitvdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4KKy5JIGNvdW50CityZWxvY2F0aW9ucy4KK1RoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCitjZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCitjYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLgorTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIHdvcmsgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvIG5vdAorc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMuICBUaGUgbGlua2VyIHdpbGwgbm90IHNwbGl0IHVwIGluZGl2aWR1YWwKK2lucHV0IHNlY3Rpb25zIGZvciByZWRpc3RyaWJ1dGlvbiwgc28gaWYgYSBzaW5nbGUgaW5wdXQgc2VjdGlvbgorY29udGFpbnMgbW9yZSB0aGFuCisuSSBjb3VudAorcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0IG1hbnkgcmVsb2NhdGlvbnMuCisKKy5UUAorLkIgXC1zcGxpdFwtYnlcLWZpbGUKK1NpbWlsYXIgdG8KKy5CIFwtc3BsaXRcLWJ5XC1yZWxvYworYnV0IGNyZWF0ZXMgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZS4KKworLlRQCisuQkkgIlwtVGJzcyAiICJvcmciXGMKKy5UUAorLkJJICJcLVRkYXRhICIgIm9yZyJcYworLlRQCisuQkkgIlwtVHRleHQgIiAib3JnIlxjCitVc2UgXGMKKy5JIG9yZ1xjCitcJiBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3JcKGVtXCZyZXNwZWN0aXZlbHlcKGVtXCZ0aGUKK1xjCisuQiBic3NcYworXCYsIFxjCisuQiBkYXRhXGMKK1wmLCBvciB0aGUgXGMKKy5CIHRleHRcYworXCYgc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCitcYworLkkgb3JnXGMKK1wmIG11c3QgYmUgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLgorCisuVFAKKy5CSSAiXC1UICIgImNvbW1hbmRmaWxlIgorRXF1aXZhbGVudCB0byBcYworLkIgXC1jIFxjCisuSSBjb21tYW5kZmlsZVxjCitcJlxjCitcJjsgc3VwcG9ydGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKK290aGVyIHRvb2xzLiAgCisKKy5UUAorLkIgXC10IAorUHJpbnRzIG5hbWVzIG9mIGlucHV0IGZpbGVzIGFzIFxjCisuQiBsZFxjCitcJiBwcm9jZXNzZXMgdGhlbS4KKworLlRQCisuQkkgIlwtdSAiICJzeW0iCitGb3JjZXMgXGMKKy5JIHN5bVxjCitcJiB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLgorVGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbCBtb2R1bGVzIGZyb20KK3N0YW5kYXJkIGxpYnJhcmllcy4gIFxjCisuQiBcLXVcYworXCYgbWF5IGJlIHJlcGVhdGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbgorYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuCisKKy5UUAorLkIgXC1VciAKK0ZvciBhbnl0aGluZyBvdGhlciB0aGFuIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0bworXGMKKy5CIFwtclxjCitcJjogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dFwoZW1cJmkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCit0dXJuIHNlcnZlIGFzIGlucHV0IHRvIFxjCisuQiBsZFxjCitcJi4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIFxjCisuQiBcLVVyCisuSSB3aWxsXGMKK1wmIHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBcYworLkIgXC1yXGMKK1wmLgorCisuVFAKKy5CIFwtXC12ZXJib3NlCitEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKKy5CIGxkCithbmQgbGlzdCB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCitEaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2FuIG5vdCBiZSBvcGVuZWQuCisKKy5UUAorLkIgXC12LCBcLVYKK0Rpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYworLkIgbGRcYworXCYuCitUaGUKKy5CIFwtVgorb3B0aW9uIGFsc28gbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgorCisuVFAKKy5CIFwtXC12ZXJzaW9uCitEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKKy5CIGxkCithbmQgZXhpdC4KKworLlRQCisuQiBcLXdhcm5cLWNvbW1vbgorV2FybiB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBjb21iaW5lZCB3aXRoIGFub3RoZXIgY29tbW9uIHN5bWJvbCBvciB3aXRoCithIHN5bWJvbCBkZWZpbml0aW9uLiAgVW5peCBsaW5rZXJzIGFsbG93IHRoaXMgc29tZXdoYXQgc2xvcHB5IHByYWN0aWNlLAorYnV0IGxpbmtlcnMgb24gc29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QuICBUaGlzIG9wdGlvbiBhbGxvd3MKK3lvdSB0byBmaW5kIHBvdGVudGlhbCBwcm9ibGVtcyBmcm9tIGNvbWJpbmluZyBnbG9iYWwgc3ltYm9scy4KKworLlRQCisuQiBcLXdhcm5cLWNvbnN0cnVjdG9ycworV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEKK2ZldyBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4KK25vdCBkZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgorCisuVFAKKy5CIFwtd2FyblwtbXVsdGlwbGVcLWdwCitXYXJuIGlmIHRoZSBvdXRwdXQgZmlsZSByZXF1aXJlcyBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlciB2YWx1ZXMuICBUaGlzCitvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBjZXJ0YWluIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIEFscGhhLgorCisuVFAKKy5CIFwtd2Fyblwtb25jZQorT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCit3aGljaCByZWZlcnMgdG8gaXQuCisKKy5UUAorLkIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbgorV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKK2FsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgorVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0CitpcywgaWYgdGhlIFNFQ1RJT05TIGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZQorc2VjdGlvbi4KKworLlRQCisuQiBcLVwtd2hvbGVcLWFyY2hpdmUKK0ZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCisuQiBcLVwtd2hvbGVcLWFyY2hpdmUKK29wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpbiB0aGUgbGluaywgcmF0aGVyCit0aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdCBmaWxlcy4gIFRoaXMgaXMKK25vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBmb3JjaW5nCitldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQgbGlicmFyeS4KKworLlRQCisuQiBcLVwtbm9cLXdob2xlXC1hcmNoaXZlCitUdXJuIG9mZiB0aGUgZWZmZWN0IG9mIHRoZQorLkIgXC1cLXdob2xlXC1hcmNoaXZlCitvcHRpb24gZm9yIGFyY2hpdmVzIHdoaWNoIGFwcGVhciBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisuVFAKKy5CSSAiLS13cmFwICIgInN5bWJvbCIKK1VzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIAorLkkgc3ltYm9sLgorQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KKy5JIHN5bWJvbAord2lsbCBiZSByZXNvbHZlZCB0bworLkJJICJfX3dyYXBfIiAic3ltYm9sIi4KK0FueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCisuQkkgIl9fcmVhbF8iICJzeW1ib2wiCit3aWxsIGJlIHJlc29sdmVkIHRvCisuSSBzeW1ib2wuCisKKy5UUAorLkIgXC1YIAorRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCitzeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggYFx8XGMKKy5CIExcYworXHwnLgorCisuVFAKKy5CIFwteAorRGVsZXRlIGFsbCBsb2NhbCBzeW1ib2xzLgorCisuUFAKKworLlNIIEVOVklST05NRU5UCitcYworWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisuQiBsZFxjCitcJiB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcYworLkIgR05VVEFSR0VUXGMKK1wmLgorCitcYworLkIgR05VVEFSR0VUXGMKK1wmIGRldGVybWluZXMgdGhlIGlucHV0LWZpbGUgb2JqZWN0IGZvcm1hdCBpZiB5b3UgZG9uJ3QKK3VzZSBcYworLkIgXC1iXGMKK1wmIChvciBpdHMgc3lub255bSBcYworLkIgXC1mb3JtYXRcYworXCYpLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKK29mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdC4gIElmIHRoZXJlIGlzIG5vCitcYworLkIgR05VVEFSR0VUXGMKK1wmIGluIHRoZSBlbnZpcm9ubWVudCwgXGMKKy5CIGxkXGMKK1wmIHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0CitvZiB0aGUgaG9zdC4gSWYgXGMKKy5CIEdOVVRBUkdFVFxjCitcJiBpcyBzZXQgdG8gXGMKKy5CIGRlZmF1bHRcYworXCYgdGhlbiBCRkQgYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlCitpbnB1dCBmb3JtYXQgYnkgZXhhbWluaW5nIGJpbmFyeSBpbnB1dCBmaWxlczsgdGhpcyBtZXRob2Qgb2Z0ZW4KK3N1Y2NlZWRzLCBidXQgdGhlcmUgYXJlIHBvdGVudGlhbCBhbWJpZ3VpdGllcywgc2luY2UgdGhlcmUgaXMgbm8gbWV0aG9kCitvZiBlbnN1cmluZyB0aGF0IHRoZSBtYWdpYyBudW1iZXIgdXNlZCB0byBmbGFnIG9iamVjdC1maWxlIGZvcm1hdHMgaXMKK3VuaXF1ZS4gIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBmb3IgQkZEIG9uIGVhY2ggc3lzdGVtCitwbGFjZXMgdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQgZm9yIHRoYXQgc3lzdGVtIGZpcnN0IGluIHRoZSBzZWFyY2gtbGlzdCwKK3NvIGFtYmlndWl0aWVzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb252ZW50aW9uLgorCisuUFAKKworLlNIICJTRUUgQUxTTyIKKworLkJSIG9iamR1bXAgKCAxICkKKy5icgorLmJyCisuUkIgImBcfCIgbGQgIlx8JyBhbmQgYFx8IiBiaW51dGlscyAiXHwnIgorZW50cmllcyBpbgorLkIgaW5mb1xjCisuYnIKKy5JIAorbGQ6IHRoZSBHTlUgbGlua2VyXGMKKywgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIFJvbGFuZCBQZXNjaDsKKy5JCitUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYworLCBSb2xhbmQgSC4gUGVzY2guCisKKy5TSCBDT1BZSU5HCitDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKK21hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAordmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCit0cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCit0aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2xkL2xkLmggYi9sZC9sZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYTc0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZC5oCkBAIC0wLDAgKzEsMjI2IEBACisvKiBsZC5oIC0tIGdlbmVyYWwgbGlua2VyIGhlYWRlciBmaWxlCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCisgICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIExEX0gKKyNkZWZpbmUgTERfSAorCisjaWZkZWYgSEFWRV9MT0NBTEVfSAorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX05MUworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQorIyBpZmRlZiBnZXR0ZXh0X25vb3AKKyMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQorIyBlbHNlCisjICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorIyBlbmRpZgorI2Vsc2UKKy8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCisjIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKKyMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQorIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQorIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKKyMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorI2VuZGlmCisKKy8qIExvb2sgaW4gdGhpcyBlbnZpcm9ubWVudCBuYW1lIGZvciB0aGUgbGlua2VyIHRvIHByZXRlbmQgdG8gYmUgKi8KKyNkZWZpbmUgRU1VTEFUSU9OX0VOVklST04gIkxERU1VTEFUSU9OIgorLyogSWYgaW4gdGhlcmUgbG9vayBmb3IgdGhlIHN0cmluZ3M6ICovCisKKy8qIExvb2sgaW4gdGhpcyB2YXJpYWJsZSBmb3IgYSB0YXJnZXQgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdFVF9FTlZJUk9OICJHTlVUQVJHRVQiCisKKy8qIElucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBwdXQgaW4gYSBzZWN0aW9uIG9mIHRoaXMgbmFtZSBhcmUgYWN0dWFsbHkKKyAgIGRpc2NhcmRlZC4gICovCisjZGVmaW5lIERJU0NBUkRfU0VDVElPTl9OQU1FICIvRElTQ0FSRC8iCisKKy8qIEEgd2lsZGNhcmQgc3BlY2lmaWNhdGlvbi4gIFRoaXMgaXMgb25seSB1c2VkIGluIGxkZ3JhbS55LCBidXQgaXQKKyAgIHdpbmRzIHVwIGluIGxkZ3JhbS5oLCBzbyB3ZSBuZWVkIHRvIGRlZmluZSBpdCBvdXRzaWRlLiAgKi8KKworc3RydWN0IHdpbGRjYXJkX3NwZWMKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqZXhjbHVkZV9uYW1lOworICBib29sZWFuIHNvcnRlZDsKK307CisKKy8qIEV4dHJhIGluZm9ybWF0aW9uIHdlIGhvbGQgb24gc2VjdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0ICB1c2VyX3NlY3Rpb25fc3RydWN0Cit7CisgIC8qIFBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gd2hlcmUgdGhpcyBkYXRhIHdpbGwgZ28gKi8KKyAgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqZmlsZTsKK30gc2VjdGlvbl91c2VyZGF0YV90eXBlOworCisKKyNkZWZpbmUgZ2V0X3VzZXJkYXRhKHgpICgoeCktPnVzZXJkYXRhKQorCisjZGVmaW5lIEJZVEVfU0laRQkoMSkKKyNkZWZpbmUgU0hPUlRfU0laRQkoMikKKyNkZWZpbmUgTE9OR19TSVpFCSg0KQorI2RlZmluZSBRVUFEX1NJWkUJKDgpCisKKy8qIEFMSUdOIG1hY3JvIGNoYW5nZWQgdG8gQUxJR05fTiB0byBhdm9pZAkqLworLyogY29uZmxpY3QgaW4gL3Vzci9pbmNsdWRlL21hY2hpbmUvbWFjaHBhcmFtLmggKi8KKy8qIFdBUk5JTkc6IElmIFRISVMgaXMgYSA2NCBiaXQgYWRkcmVzcyBhbmQgQk9VTkRBUlkgaXMgYSAzMiBiaXQgaW50LAorICAgeW91IG11c3QgY29lcmNlIGJvdW5kYXJ5IHRvIHRoZSBzYW1lIHR5cGUgYXMgVEhJUy4KKyAgID8/PyBJcyB0aGVyZSBhIHBvcnRhYmxlIHdheSB0byBhdm9pZCB0aGlzLiAgKi8KKyNkZWZpbmUgQUxJR05fTih0aGlzLCBib3VuZGFyeSkgXAorICAoKCggKHRoaXMpICsgKChib3VuZGFyeSkgLTEpKSAmICh+KChib3VuZGFyeSktMSkpKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogMSA9PiBhc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMgZXZlbiBpZiBgcmVsb2NhdGFibGVfb3V0cHV0Jy4gICovCisgIGJvb2xlYW4gZm9yY2VfY29tbW9uX2RlZmluaXRpb247CisgIGJvb2xlYW4gcmVsYXg7CisKKyAgLyogTmFtZSBvZiBydW50aW1lIGludGVycHJldGVyIHRvIGludm9rZS4gICovCisgIGNoYXIgKmludGVycHJldGVyOworCisgIC8qIE5hbWUgdG8gZ2l2ZSBydW50aW1lIGxpYmFyeSBmcm9tIHRoZSAtc29uYW1lIGFyZ3VtZW50LiAgKi8KKyAgY2hhciAqc29uYW1lOworCisgIC8qIFJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmcm9tIHRoZSAtcnBhdGggYXJndW1lbnQuICAqLworICBjaGFyICpycGF0aDsKKworICAvKiBMaW5rIHRpbWUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZyb20gdGhlIC1ycGF0aC1saW5rCisgICAgIGFyZ3VtZW50LiAgKi8KKyAgY2hhciAqcnBhdGhfbGluazsKKworICAvKiBCaWcgb3IgbGl0dGxlIGVuZGlhbiBhcyBzZXQgb24gY29tbWFuZCBsaW5lLiAgKi8KKyAgZW51bSB7IEVORElBTl9VTlNFVCA9IDAsIEVORElBTl9CSUcsIEVORElBTl9MSVRUTEUgfSBlbmRpYW47CisKKyAgLyogSWYgdHJ1ZSwgZXhwb3J0IGFsbCBzeW1ib2xzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiBhbiBFTEYKKyAgICAgZXhlY3V0YWJsZS4gICovCisgIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7CisKKyAgLyogSWYgdHJ1ZSwgYnVpbGQgTUlQUyBlbWJlZGRlZCBQSUMgcmVsb2NhdGlvbiB0YWJsZXMgaW4gdGhlIG91dHB1dAorICAgICBmaWxlLiAgKi8KKyAgYm9vbGVhbiBlbWJlZGRlZF9yZWxvY3M7CisKKyAgLyogSWYgdHJ1ZSwgZm9yY2UgZ2VuZXJhdGlvbiBvZiBhIGZpbGUgd2l0aCBhIC5leGUgZmlsZS4gKi8KKyAgYm9vbGVhbiBmb3JjZV9leGVfc3VmZml4OworCisgIC8qIElmIHRydWUsIGdlbmVyYXRlIGEgY3Jvc3MgcmVmZXJlbmNlIHJlcG9ydC4gICovCisgIGJvb2xlYW4gY3JlZjsKKworICAvKiBJZiB0cnVlICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIHdhcm4gYWJvdXQgbWlzbWF0Y2hlZCBpbnB1dAorICAgICBmaWxlcy4gICovCisgIGJvb2xlYW4gd2Fybl9taXNtYXRjaDsKKworICAvKiBSZW1vdmUgdW5yZWZlcmVuY2VkIHNlY3Rpb25zPyAgKi8KKyAgYm9vbGVhbiBnY19zZWN0aW9uczsKKworICAvKiBOYW1lIG9mIHNoYXJlZCBvYmplY3Qgd2hvc2Ugc3ltYm9sIHRhYmxlIHNob3VsZCBiZSBmaWx0ZXJlZCB3aXRoCisgICAgIHRoaXMgc2hhcmVkIG9iamVjdC4gIEZyb20gdGhlIC0tZmlsdGVyIG9wdGlvbi4gICovCisgIGNoYXIgKmZpbHRlcl9zaGxpYjsKKworICAvKiBOYW1lIG9mIHNoYXJlZCBvYmplY3QgZm9yIHdob3NlIHN5bWJvbCB0YWJsZSB0aGlzIHNoYXJlZCBvYmplY3QKKyAgICAgaXMgYW4gYXV4aWxpYXJ5IGZpbHRlci4gIEZyb20gdGhlIC0tYXV4aWxpYXJ5IG9wdGlvbi4gICovCisgIGNoYXIgKiphdXhpbGlhcnlfZmlsdGVyczsKKworICAvKiBBIHZlcnNpb24gc3ltYm9sIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHN5bWJvbCBuYW1lcyBmb3VuZCBpbiB0aGUKKyAgICAgLmV4cG9ydHMgc2VjdGlvbnMuICAqLworICBjaGFyICp2ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbjsKKworICAvKiBJZiB0cnVlICh0aGUgZGVmYXVsdCkgY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMsIG9uY2UgY29tcHV0ZSwKKyAgICAgZnBvciBvdmVybGFwcy4gICovCisgIGJvb2xlYW4gY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXM7CisgIAorfSBhcmdzX3R5cGU7CisKK2V4dGVybiBhcmdzX3R5cGUgY29tbWFuZF9saW5lOworCit0eXBlZGVmIGludCB0b2tlbl9jb2RlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IAoreworICBiZmRfc2l6ZV90eXBlIHNwZWNpZmllZF9kYXRhX3NpemU7CisgIGJvb2xlYW4gbWFnaWNfZGVtYW5kX3BhZ2VkOworICBib29sZWFuIG1ha2VfZXhlY3V0YWJsZTsKKworICAvKiBJZiB0cnVlLCBkb2luZyBhIGR5bmFtaWMgbGluay4gICovCisgIGJvb2xlYW4gZHluYW1pY19saW5rOworCisgIC8qIElmIHRydWUsIC1zaGFyZWQgaXMgc3VwcG9ydGVkLiAgKi8KKyAgLyogPz8/IEEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGlzIHBlcmhhcHMgdG8gZGVmaW5lIHRoaXMgaW4gdGhlCisgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBzaW5jZSB0aGlzIGlzIHJlYWxseSBhIHRhcmdldCBkZXBlbmRlbnQKKyAgICAgcGFyYW1ldGVyLiAgKi8KKyAgYm9vbGVhbiBoYXNfc2hhcmVkOworCisgIC8qIElmIHRydWUsIGJ1aWxkIGNvbnN0cnVjdG9ycy4gICovCisgIGJvb2xlYW4gYnVpbGRfY29uc3RydWN0b3JzOworCisgIC8qIElmIHRydWUsIHdhcm4gYWJvdXQgYW55IGNvbnN0cnVjdG9ycy4gICovCisgIGJvb2xlYW4gd2Fybl9jb25zdHJ1Y3RvcnM7CisKKyAgLyogSWYgdHJ1ZSwgd2FybiBhYm91dCBtZXJnaW5nIGNvbW1vbiBzeW1ib2xzIHdpdGggb3RoZXJzLiAgKi8KKyAgYm9vbGVhbiB3YXJuX2NvbW1vbjsKKworICAvKiBJZiB0cnVlLCBvbmx5IHdhcm4gb25jZSBhYm91dCBhIHBhcnRpY3VsYXIgdW5kZWZpbmVkIHN5bWJvbC4gICovCisgIGJvb2xlYW4gd2Fybl9vbmNlOworCisgIC8qIElmIHRydWUsIHdhcm4gaWYgbXVsdGlwbGUgZ2xvYmFsLXBvaW50ZXJzIGFyZSBuZWVkZWQgKEFscGhhCisgICAgIG9ubHkpLiAgKi8KKyAgYm9vbGVhbiB3YXJuX211bHRpcGxlX2dwOworCisgIC8qIElmIHRydWUsIHdhcm4gaWYgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgYW4gb3V0cHV0IHNlY3Rpb24KKyAgICAgY2hhbmdlcyBkdWUgdG8gdGhlIGFsaWdubWVudCBvZiBhbiBpbnB1dCBzZWN0aW9uLiAgKi8KKyAgYm9vbGVhbiB3YXJuX3NlY3Rpb25fYWxpZ247CisKKyAgYm9vbGVhbiBzb3J0X2NvbW1vbjsKKworICBib29sZWFuIHRleHRfcmVhZF9vbmx5OworCisgIGNoYXIgKm1hcF9maWxlbmFtZTsKKyAgRklMRSAqbWFwX2ZpbGU7CisKKyAgYm9vbGVhbiBzdGF0czsKKworICBpbnQgc3BsaXRfYnlfcmVsb2M7CisgIGJvb2xlYW4gc3BsaXRfYnlfZmlsZTsKK30gbGRfY29uZmlnX3R5cGU7CisKK2V4dGVybiBsZF9jb25maWdfdHlwZSBjb25maWc7CisKK3R5cGVkZWYgZW51bQoreworICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0sCisgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLAorICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0KK30gbGFuZ19waGFzZV90eXBlOworCitleHRlcm4gYm9vbGVhbiBoYWRfc2NyaXB0OworZXh0ZXJuIGJvb2xlYW4gZm9yY2VfbWFrZV9leGVjdXRhYmxlOworCisvKiBOb24temVybyBpZiB3ZSBhcmUgcHJvY2Vzc2luZyBhIC0tZGVmc3ltIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCitleHRlcm4gaW50IHBhcnNpbmdfZGVmc3ltOworCitleHRlcm4gaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBhZGRfY3JlZiBQQVJBTVMgKChjb25zdCBjaGFyICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7CitleHRlcm4gdm9pZCBvdXRwdXRfY3JlZiBQQVJBTVMgKChGSUxFICopKTsKK2V4dGVybiB2b2lkIGNoZWNrX25vY3Jvc3NyZWZzIFBBUkFNUyAoKHZvaWQpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZC50ZXhpbmZvIGIvbGQvbGQudGV4aW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdmMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvbGQudGV4aW5mbwpAQCAtMCwwICsxLDQzMDUgQEAKK1xpbnB1dCB0ZXhpbmZvCitAc2V0ZmlsZW5hbWUgbGQuaW5mbworQHN5bmNvZGVpbmRleCBreSBjcAorQGluY2x1ZGUgY29uZmlnZG9jLnRleGkKK0BjIChjb25maWdkb2MudGV4aSBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlKQorQGluY2x1ZGUgbGR2ZXIudGV4aQorCitAYyBAc21hbGxib29rCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIExkOiAobGQpLiAgICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBsaW5rZXIuCitFTkQtSU5GTy1ESVItRU5UUlkKK0BlbmQgZm9ybWF0CitAZW5kIGlmaW5mbworCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgTEQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCisKK0NvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKK3RoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQorcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitAZW5kIGlnbm9yZQorQGVuZCBpZmluZm8KK0BpZnRleAorQGZpbmFsb3V0CitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCitAc2V0dGl0bGUgVXNpbmcgTEQsIHRoZSBHTlUgbGlua2VyCitAdGl0bGVwYWdlCitAdGl0bGUgVXNpbmcgbGQKK0BzdWJ0aXRsZSBUaGUgR05VIGxpbmtlcgorQHNwIDEKK0BzdWJ0aXRsZSBAY29kZXtsZH0gdmVyc2lvbiAyCitAc3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KK0BhdXRob3IgU3RldmUgQ2hhbWJlcmxhaW4KK0BhdXRob3IgSWFuIExhbmNlIFRheWxvcgorQGF1dGhvciBDeWdudXMgU29sdXRpb25zCitAcGFnZQorCitAdGV4Cit7XHBhcnNraXA9MHB0CitcaGZpbGwgQ3lnbnVzIFNvbHV0aW9uc1xwYXIKK1xoZmlsbCBpYW5cQGN5Z251cy5jb20sIGRvY1xAY3lnbnVzLmNvbVxwYXIKK1xoZmlsbCB7XGl0IFVzaW5nIExELCB0aGUgR05VIGxpbmtlcn1ccGFyCitcaGZpbGwgRWRpdGVkIGJ5IEplZmZyZXkgT3NpZXIgKGplZmZyZXlcQGN5Z251cy5jb20pXHBhcgorfQorXGdsb2JhbFxwYXJpbmRlbnQ9MHB0ICUgU3RldmUgbGlrZXMgaXQgdGhpcyB3YXkuCitAZW5kIHRleAorCitAdnNraXAgMHB0IHBsdXMgMWZpbGxsCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgdGl0bGVwYWdlCitAZW5kIGlmdGV4CitAYyBGSVhNRTogVGFsayBhYm91dCBpbXBvcnRhbmNlIG9mICpvcmRlciogb2YgYXJncywgY21kcyB0byBsaW5rZXIhCisKK0BpZmluZm8KK0Bub2RlIFRvcAorQHRvcCBVc2luZyBsZAorVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgQHNje2dudX0gbGlua2VyIGxkIHZlcnNpb24gQHZhbHVle1ZFUlNJT059LgorCitAbWVudQorKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBPdmVydmlldworKiBJbnZvY2F0aW9uOjogICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uCisqIFNjcmlwdHM6OiAgICAgICAgICAgICAgICAgICAgIExpbmtlciBTY3JpcHRzCitAaWZzZXQgR0VORVJJQworKiBNYWNoaW5lIERlcGVuZGVudDo6ICAgICAgICAgICBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcworQGVuZCBpZnNldAorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IEg4MzAwCisqIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCB0aGUgSDgvMzAwCitAZW5kIGlmc2V0CitAaWZzZXQgSGl0YWNoaQorKiBIaXRhY2hpOjogICAgICAgICAgICAgICAgICAgICBsZCBhbmQgb3RoZXIgSGl0YWNoaSBtaWNyb3MKK0BlbmQgaWZzZXQKK0BpZnNldCBJOTYwCisqIGk5NjA6OiAgICAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCitAaWZjbGVhciBTaW5nbGVGb3JtYXQKKyogQkZEOjogICAgICAgICAgICAgICAgICAgICAgICAgQkZECitAZW5kIGlmY2xlYXIKK0BjIEZvbGxvd2luZyBibGFuayBsaW5lIHJlcXVpcmVkIGZvciByZW1haW5pbmcgYnVnIGluIG1ha2VpbmZvIGNvbmRzL21lbnVzCisKKyogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKKyogTVJJOjogICAgICAgICAgICAgICAgICAgICAgICAgTVJJIENvbXBhdGlibGUgU2NyaXB0IEZpbGVzCisqIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4CitAZW5kIG1lbnUKK0BlbmQgaWZpbmZvCisKK0Bub2RlIE92ZXJ2aWV3CitAY2hhcHRlciBPdmVydmlldworCitAY2luZGV4IEBzY3tnbnV9IGxpbmtlcgorQGNpbmRleCB3aGF0IGlzIHRoaXM/CitAY29kZXtsZH0gY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKK3RoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIFVzdWFsbHkgdGhlIGxhc3Qgc3RlcCBpbgorY29tcGlsaW5nIGEgcHJvZ3JhbSBpcyB0byBydW4gQGNvZGV7bGR9LgorCitAY29kZXtsZH0gYWNjZXB0cyBMaW5rZXIgQ29tbWFuZCBMYW5ndWFnZSBmaWxlcyB3cml0dGVuIGluCithIHN1cGVyc2V0IG9mIEFUJlQncyBMaW5rIEVkaXRvciBDb21tYW5kIExhbmd1YWdlIHN5bnRheCwKK3RvIHByb3ZpZGUgZXhwbGljaXQgYW5kIHRvdGFsIGNvbnRyb2wgb3ZlciB0aGUgbGlua2luZyBwcm9jZXNzLgorCitAaWZjbGVhciBTaW5nbGVGb3JtYXQKK1RoaXMgdmVyc2lvbiBvZiBAY29kZXtsZH0gdXNlcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIEJGRCBsaWJyYXJpZXMKK3RvIG9wZXJhdGUgb24gb2JqZWN0IGZpbGVzLiBUaGlzIGFsbG93cyBAY29kZXtsZH0gdG8gcmVhZCwgY29tYmluZSwgYW5kCit3cml0ZSBvYmplY3QgZmlsZXMgaW4gbWFueSBkaWZmZXJlbnQgZm9ybWF0cy0tLWZvciBleGFtcGxlLCBDT0ZGIG9yCitAY29kZXthLm91dH0uICBEaWZmZXJlbnQgZm9ybWF0cyBtYXkgYmUgbGlua2VkIHRvZ2V0aGVyIHRvIHByb2R1Y2UgYW55CithdmFpbGFibGUga2luZCBvZiBvYmplY3QgZmlsZS4gIEB4cmVme0JGRH0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorQGVuZCBpZmNsZWFyCisKK0FzaWRlIGZyb20gaXRzIGZsZXhpYmlsaXR5LCB0aGUgQHNje2dudX0gbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCitsaW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KK2V4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCitAY29kZXtsZH0gY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycworKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KKworQG5vZGUgSW52b2NhdGlvbgorQGNoYXB0ZXIgSW52b2NhdGlvbgorCitUaGUgQHNje2dudX0gbGlua2VyIEBjb2Rle2xkfSBpcyBtZWFudCB0byBjb3ZlciBhIGJyb2FkIHJhbmdlIG9mIHNpdHVhdGlvbnMsCithbmQgdG8gYmUgYXMgY29tcGF0aWJsZSBhcyBwb3NzaWJsZSB3aXRoIG90aGVyIGxpbmtlcnMuICBBcyBhIHJlc3VsdCwKK3lvdSBoYXZlIG1hbnkgY2hvaWNlcyB0byBjb250cm9sIGl0cyBiZWhhdmlvci4KKworQGlmc2V0IFVzZXNFbnZWYXJzCitAbWVudQorKiBPcHRpb25zOjogICAgICAgICAgICAgICAgICAgICBDb21tYW5kIExpbmUgT3B0aW9ucworKiBFbnZpcm9ubWVudDo6ICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudCBWYXJpYWJsZXMKK0BlbmQgbWVudQorCitAbm9kZSBPcHRpb25zCitAc2VjdGlvbiBDb21tYW5kIExpbmUgT3B0aW9ucworQGVuZCBpZnNldAorCitAY2luZGV4IGNvbW1hbmQgbGluZQorQGNpbmRleCBvcHRpb25zCitUaGUgbGlua2VyIHN1cHBvcnRzIGEgcGxldGhvcmEgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMsIGJ1dCBpbiBhY3R1YWwKK3ByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCitAY2luZGV4IHN0YW5kYXJkIFVuaXggc3lzdGVtCitGb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIEBjb2Rle2xkfSBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKK29iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bworbGluayBhIGZpbGUgQGNvZGV7aGVsbG8ub306CisKK0BzbWFsbGV4YW1wbGUKK2xkIC1vIEB2YXJ7b3V0cHV0fSAvbGliL2NydDAubyBoZWxsby5vIC1sYworQGVuZCBzbWFsbGV4YW1wbGUKKworVGhpcyB0ZWxscyBAY29kZXtsZH0gdG8gcHJvZHVjZSBhIGZpbGUgY2FsbGVkIEB2YXJ7b3V0cHV0fSBhcyB0aGUKK3Jlc3VsdCBvZiBsaW5raW5nIHRoZSBmaWxlIEBjb2Rley9saWIvY3J0MC5vfSB3aXRoIEBjb2Rle2hlbGxvLm99IGFuZAordGhlIGxpYnJhcnkgQGNvZGV7bGliYy5hfSwgd2hpY2ggd2lsbCBjb21lIGZyb20gdGhlIHN0YW5kYXJkIHNlYXJjaAorZGlyZWN0b3JpZXMuICAoU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHRoZSBAc2FtcHstbH0gb3B0aW9uIGJlbG93LikKKworVGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIEBjb2Rle2xkfSBtYXkgYmUgc3BlY2lmaWVkIGluIGFueSBvcmRlciwgYW5kCittYXkgYmUgcmVwZWF0ZWQgYXQgd2lsbC4gIFJlcGVhdGluZyBtb3N0IG9wdGlvbnMgd2l0aCBhIGRpZmZlcmVudAorYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKK29jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIHRoYXQKK29wdGlvbi4gIE9wdGlvbnMgd2hpY2ggbWF5IGJlIG1lYW5pbmdmdWxseSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UgYXJlCitub3RlZCBpbiB0aGUgZGVzY3JpcHRpb25zIGJlbG93LgorCitAY2luZGV4IG9iamVjdCBmaWxlcworTm9uLW9wdGlvbiBhcmd1bWVudHMgYXJlIG9iamVjdHMgZmlsZXMgd2hpY2ggYXJlIHRvIGJlIGxpbmtlZCB0b2dldGhlci4KK1RoZXkgbWF5IGZvbGxvdywgcHJlY2VkZSwgb3IgYmUgbWl4ZWQgaW4gd2l0aCBjb21tYW5kLWxpbmUgb3B0aW9ucywKK2V4Y2VwdCB0aGF0IGFuIG9iamVjdCBmaWxlIGFyZ3VtZW50IG1heSBub3QgYmUgcGxhY2VkIGJldHdlZW4gYW4gb3B0aW9uCithbmQgaXRzIGFyZ3VtZW50LgorCitVc3VhbGx5IHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIGF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSwgYnV0IHlvdSBjYW4KK3NwZWNpZnkgb3RoZXIgZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIHVzaW5nIEBzYW1wey1sfSwgQHNhbXB7LVJ9LAorYW5kIHRoZSBzY3JpcHQgY29tbWFuZCBsYW5ndWFnZS4gIElmIEBlbXBoe25vfSBiaW5hcnkgaW5wdXQgZmlsZXMgYXQgYWxsCithcmUgc3BlY2lmaWVkLCB0aGUgbGlua2VyIGRvZXMgbm90IHByb2R1Y2UgYW55IG91dHB1dCwgYW5kIGlzc3VlcyB0aGUKK21lc3NhZ2UgQHNhbXB7Tm8gaW5wdXQgZmlsZXN9LgorCitJZiB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIHRoZSBmb3JtYXQgb2YgYW4gb2JqZWN0IGZpbGUsIGl0IHdpbGwKK2Fzc3VtZSB0aGF0IGl0IGlzIGEgbGlua2VyIHNjcmlwdC4gIEEgc2NyaXB0IHNwZWNpZmllZCBpbiB0aGlzIHdheQorYXVnbWVudHMgdGhlIG1haW4gbGlua2VyIHNjcmlwdCB1c2VkIGZvciB0aGUgbGluayAoZWl0aGVyIHRoZSBkZWZhdWx0CitsaW5rZXIgc2NyaXB0IG9yIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHVzaW5nIEBzYW1wey1UfSkuICBUaGlzIGZlYXR1cmUKK3Blcm1pdHMgdGhlIGxpbmtlciB0byBsaW5rIGFnYWluc3QgYSBmaWxlIHdoaWNoIGFwcGVhcnMgdG8gYmUgYW4gb2JqZWN0CitvciBhbiBhcmNoaXZlLCBidXQgYWN0dWFsbHkgbWVyZWx5IGRlZmluZXMgc29tZSBzeW1ib2wgdmFsdWVzLCBvciB1c2VzCitAY29kZXtJTlBVVH0gb3IgQGNvZGV7R1JPVVB9IHRvIGxvYWQgb3RoZXIgb2JqZWN0cy4gIE5vdGUgdGhhdAorc3BlY2lmeWluZyBhIHNjcmlwdCBpbiB0aGlzIHdheSBzaG91bGQgb25seSBiZSB1c2VkIHRvIGF1Z21lbnQgdGhlIG1haW4KK2xpbmtlciBzY3JpcHQ7IGlmIHlvdSB3YW50IHRvIHVzZSBzb21lIGNvbW1hbmQgdGhhdCBsb2dpY2FsbHkgY2FuIG9ubHkKK2FwcGVhciBvbmNlLCBzdWNoIGFzIHRoZSBAY29kZXtTRUNUSU9OU30gb3IgQGNvZGV7TUVNT1JZfSBjb21tYW5kLCB5b3UKK211c3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzaW5nIHRoZSBAc2FtcHstVH0gb3B0aW9uLgorQHhyZWZ7U2NyaXB0c30uCisKK0ZvciBvcHRpb25zIHdob3NlIG5hbWVzIGFyZSBhIHNpbmdsZSBsZXR0ZXIsCitvcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCit3aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQorb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KKworRm9yIG9wdGlvbnMgd2hvc2UgbmFtZXMgYXJlIG11bHRpcGxlIGxldHRlcnMsIGVpdGhlciBvbmUgZGFzaCBvciB0d28gY2FuCitwcmVjZWRlIHRoZSBvcHRpb24gbmFtZTsgZm9yIGV4YW1wbGUsIEBzYW1wey0tb2Zvcm1hdH0gYW5kCitAc2FtcHstLW9mb3JtYXR9IGFyZSBlcXVpdmFsZW50LiAgQXJndW1lbnRzIHRvIG11bHRpcGxlLWxldHRlciBvcHRpb25zCittdXN0IGVpdGhlciBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgb3B0aW9uIG5hbWUgYnkgYW4gZXF1YWxzIHNpZ24sIG9yIGJlCitnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBvcHRpb24gdGhhdAorcmVxdWlyZXMgdGhlbS4gIEZvciBleGFtcGxlLCBAc2FtcHstLW9mb3JtYXQgc3JlY30gYW5kCitAc2FtcHstLW9mb3JtYXQ9c3JlY30gYXJlIGVxdWl2YWxlbnQuICBVbmlxdWUgYWJicmV2aWF0aW9ucyBvZiB0aGUgbmFtZXMKK29mIG11bHRpcGxlLWxldHRlciBvcHRpb25zIGFyZSBhY2NlcHRlZC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IC1hQHZhcntrZXl3b3JkfQorQGl0ZW0gLWFAdmFye2tleXdvcmR9CitUaGlzIG9wdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuICBUaGUgQHZhcntrZXl3b3JkfQorYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgQHNhbXB7YXJjaGl2ZX0sIEBzYW1we3NoYXJlZH0sIG9yCitAc2FtcHtkZWZhdWx0fS4gIEBzYW1wey1hYXJjaGl2ZX0gaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8KK0BzYW1wey1Cc3RhdGljfSwgYW5kIHRoZSBvdGhlciB0d28ga2V5d29yZHMgYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50Cit0byBAc2FtcHstQmR5bmFtaWN9LiAgVGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgYW55IG51bWJlciBvZiB0aW1lcy4KKworQGlmc2V0IEk5NjAKK0BjaW5kZXggYXJjaGl0ZWN0dXJlcworQGtpbmRleCAtQUB2YXJ7YXJjaH0KK0BpdGVtIC1BQHZhcnthcmNoaXRlY3R1cmV9CitAa2luZGV4IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaH0KK0BpdGVteCAtLWFyY2hpdGVjdHVyZT1AdmFye2FyY2hpdGVjdHVyZX0KK0luIHRoZSBjdXJyZW50IHJlbGVhc2Ugb2YgQGNvZGV7bGR9LCB0aGlzIG9wdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgdGhlCitJbnRlbCA5NjAgZmFtaWx5IG9mIGFyY2hpdGVjdHVyZXMuICBJbiB0aGF0IEBjb2Rle2xkfSBjb25maWd1cmF0aW9uLCB0aGUKK0B2YXJ7YXJjaGl0ZWN0dXJlfSBhcmd1bWVudCBpZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSBpbgordGhlIDk2MCBmYW1pbHksIGVuYWJsaW5nIHNvbWUgc2FmZWd1YXJkcyBhbmQgbW9kaWZ5aW5nIHRoZQorYXJjaGl2ZS1saWJyYXJ5IHNlYXJjaCBwYXRoLiAgQHhyZWZ7aTk2MCwsQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwCitmYW1pbHl9LCBmb3IgZGV0YWlscy4KKworRnV0dXJlIHJlbGVhc2VzIG9mIEBjb2Rle2xkfSBtYXkgc3VwcG9ydCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgZm9yCitvdGhlciBhcmNoaXRlY3R1cmUgZmFtaWxpZXMuCitAZW5kIGlmc2V0CisKK0BpZmNsZWFyIFNpbmdsZUZvcm1hdAorQGNpbmRleCBiaW5hcnkgaW5wdXQgZm9ybWF0CitAa2luZGV4IC1iIEB2YXJ7Zm9ybWF0fQorQGtpbmRleCAtLWZvcm1hdD1AdmFye2Zvcm1hdH0KK0BjaW5kZXggaW5wdXQgZm9ybWF0CitAY2luZGV4IGlucHV0IGZvcm1hdAorQGl0ZW0gLWIgQHZhcntpbnB1dC1mb3JtYXR9CitAaXRlbXggLS1mb3JtYXQ9QHZhcntpbnB1dC1mb3JtYXR9CitAY29kZXtsZH0gbWF5IGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGtpbmQgb2Ygb2JqZWN0CitmaWxlLiAgSWYgeW91ciBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0aGlzIHdheSwgeW91IGNhbiB1c2UgdGhlCitAc2FtcHstYn0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIGlucHV0IG9iamVjdCBmaWxlcwordGhhdCBmb2xsb3cgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIEV2ZW4gd2hlbiBAY29kZXtsZH0gaXMKK2NvbmZpZ3VyZWQgdG8gc3VwcG9ydCBhbHRlcm5hdGl2ZSBvYmplY3QgZm9ybWF0cywgeW91IGRvbid0IHVzdWFsbHkgbmVlZAordG8gc3BlY2lmeSB0aGlzLCBhcyBAY29kZXtsZH0gc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gZXhwZWN0IGFzIGEKK2RlZmF1bHQgaW5wdXQgZm9ybWF0IHRoZSBtb3N0IHVzdWFsIGZvcm1hdCBvbiBlYWNoIG1hY2hpbmUuCitAdmFye2lucHV0LWZvcm1hdH0gaXMgYSB0ZXh0IHN0cmluZywgdGhlIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdAorc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgKFlvdSBjYW4gbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeQorZm9ybWF0cyB3aXRoIEBzYW1we29iamR1bXAgLWl9LikKK0B4cmVme0JGRH0uCisKK1lvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAorYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7LWJ9IHRvIHN3aXRjaCBmb3JtYXRzIGV4cGxpY2l0bHkgKHdoZW4KK2xpbmtpbmcgb2JqZWN0IGZpbGVzIG9mIGRpZmZlcmVudCBmb3JtYXRzKSwgYnkgaW5jbHVkaW5nCitAc2FtcHstYiBAdmFye2lucHV0LWZvcm1hdH19IGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCitwYXJ0aWN1bGFyIGZvcm1hdC4gIAorCitUaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK0Bjb2Rle0dOVVRBUkdFVH0uCitAaWZzZXQgVXNlc0VudlZhcnMKK0B4cmVme0Vudmlyb25tZW50fS4KK0BlbmQgaWZzZXQKK1lvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0IGZvcm1hdCBmcm9tIGEgc2NyaXB0LCB1c2luZyB0aGUgY29tbWFuZAorQGNvZGV7VEFSR0VUfTsgc2VlIEByZWZ7Rm9ybWF0IENvbW1hbmRzfS4KK0BlbmQgaWZjbGVhcgorCitAa2luZGV4IC1jIEB2YXJ7TVJJLWNtZGZpbGV9CitAa2luZGV4IC0tbXJpLXNjcmlwdD1AdmFye01SSS1jbWRmaWxlfQorQGNpbmRleCBjb21wYXRpYmlsaXR5LCBNUkkKK0BpdGVtIC1jIEB2YXJ7TVJJLWNvbW1hbmRmaWxlfQorQGl0ZW14IC0tbXJpLXNjcmlwdD1AdmFye01SSS1jb21tYW5kZmlsZX0KK0ZvciBjb21wYXRpYmlsaXR5IHdpdGggbGlua2VycyBwcm9kdWNlZCBieSBNUkksIEBjb2Rle2xkfSBhY2NlcHRzIHNjcmlwdAorZmlsZXMgd3JpdHRlbiBpbiBhbiBhbHRlcm5hdGUsIHJlc3RyaWN0ZWQgY29tbWFuZCBsYW5ndWFnZSwgZGVzY3JpYmVkIGluCitAcmVme01SSSwsTVJJIENvbXBhdGlibGUgU2NyaXB0IEZpbGVzfS4gIEludHJvZHVjZSBNUkkgc2NyaXB0IGZpbGVzIHdpdGgKK3RoZSBvcHRpb24gQHNhbXB7LWN9OyB1c2UgdGhlIEBzYW1wey1UfSBvcHRpb24gdG8gcnVuIGxpbmtlcgorc2NyaXB0cyB3cml0dGVuIGluIHRoZSBnZW5lcmFsLXB1cnBvc2UgQGNvZGV7bGR9IHNjcmlwdGluZyBsYW5ndWFnZS4KK0lmIEB2YXJ7TVJJLWNtZGZpbGV9IGRvZXMgbm90IGV4aXN0LCBAY29kZXtsZH0gbG9va3MgZm9yIGl0IGluIHRoZSBkaXJlY3Rvcmllcworc3BlY2lmaWVkIGJ5IGFueSBAc2FtcHstTH0gb3B0aW9ucy4KKworQGNpbmRleCBjb21tb24gYWxsb2NhdGlvbgorQGtpbmRleCAtZAorQGtpbmRleCAtZGMKK0BraW5kZXggLWRwCitAaXRlbSAtZCAKK0BpdGVteCAtZGMKK0BpdGVteCAtZHAKK1RoZXNlIHRocmVlIG9wdGlvbnMgYXJlIGVxdWl2YWxlbnQ7IG11bHRpcGxlIGZvcm1zIGFyZSBzdXBwb3J0ZWQgZm9yCitjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4gIFRoZXkgYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzCitldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkICh3aXRoIEBzYW1wey1yfSkuICBUaGUKK3NjcmlwdCBjb21tYW5kIEBjb2Rle0ZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OfSBoYXMgdGhlIHNhbWUgZWZmZWN0LgorQHhyZWZ7TWlzY2VsbGFuZW91cyBDb21tYW5kc30uCisKK0BjaW5kZXggZW50cnkgcG9pbnQsIGZyb20gY29tbWFuZCBsaW5lCitAa2luZGV4IC1lIEB2YXJ7ZW50cnl9CitAa2luZGV4IC0tZW50cnk9QHZhcntlbnRyeX0KK0BpdGVtIC1lIEB2YXJ7ZW50cnl9IAorQGl0ZW14IC0tZW50cnk9QHZhcntlbnRyeX0KK1VzZSBAdmFye2VudHJ5fSBhcyB0aGUgZXhwbGljaXQgc3ltYm9sIGZvciBiZWdpbm5pbmcgZXhlY3V0aW9uIG9mIHlvdXIKK3Byb2dyYW0sIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50LiAgSWYgdGhlcmUgaXMgbm8gc3ltYm9sCituYW1lZCBAdmFye2VudHJ5fSwgdGhlIGxpbmtlciB3aWxsIHRyeSB0byBwYXJzZSBAdmFye2VudHJ5fSBhcyBhIG51bWJlciwKK2FuZCB1c2UgdGhhdCBhcyB0aGUgZW50cnkgYWRkcmVzcyAodGhlIG51bWJlciB3aWxsIGJlIGludGVycHJldGVkIGluCitiYXNlIDEwOyB5b3UgbWF5IHVzZSBhIGxlYWRpbmcgQHNhbXB7MHh9IGZvciBiYXNlIDE2LCBvciBhIGxlYWRpbmcKK0BzYW1wezB9IGZvciBiYXNlIDgpLiAgQHhyZWZ7RW50cnkgUG9pbnR9LCBmb3IgYSBkaXNjdXNzaW9uIG9mIGRlZmF1bHRzCithbmQgb3RoZXIgd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZSBlbnRyeSBwb2ludC4KKworQGNpbmRleCBkeW5hbWljIHN5bWJvbCB0YWJsZQorQGtpbmRleCAtRQorQGtpbmRleCAtLWV4cG9ydC1keW5hbWljCitAaXRlbSAtRQorQGl0ZW14IC0tZXhwb3J0LWR5bmFtaWMKK1doZW4gY3JlYXRpbmcgYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZQorZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaXMgdGhlIHNldCBvZiBzeW1ib2xzCit3aGljaCBhcmUgdmlzaWJsZSBmcm9tIGR5bmFtaWMgb2JqZWN0cyBhdCBydW4gdGltZS4KKworSWYgeW91IGRvIG5vdCB1c2UgdGhpcyBvcHRpb24sIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSB3aWxsIG5vcm1hbGx5Citjb250YWluIG9ubHkgdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUgcmVmZXJlbmNlZCBieSBzb21lIGR5bmFtaWMgb2JqZWN0CittZW50aW9uZWQgaW4gdGhlIGxpbmsuCisKK0lmIHlvdSB1c2UgQGNvZGV7ZGxvcGVufSB0byBsb2FkIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggbmVlZHMgdG8gcmVmZXIKK2JhY2sgdG8gdGhlIHN5bWJvbHMgZGVmaW5lZCBieSB0aGUgcHJvZ3JhbSwgcmF0aGVyIHRoYW4gc29tZSBvdGhlcgorZHluYW1pYyBvYmplY3QsIHRoZW4geW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byB1c2UgdGhpcyBvcHRpb24gd2hlbgorbGlua2luZyB0aGUgcHJvZ3JhbSBpdHNlbGYuCisKK0BjaW5kZXggYmlnLWVuZGlhbiBvYmplY3RzCitAY2luZGV4IGVuZGlhbm5lc3MKK0BraW5kZXggLUVCCitAaXRlbSAtRUIKK0xpbmsgYmlnLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCisKK0BjaW5kZXggbGl0dGxlLWVuZGlhbiBvYmplY3RzCitAa2luZGV4IC1FTAorQGl0ZW0gLUVMCitMaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cy4gIFRoaXMgYWZmZWN0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0LgorCitAa2luZGV4IC1mCitAa2luZGV4IC0tYXV4aWxpYXJ5CitAaXRlbSAtZgorQGl0ZW14IC0tYXV4aWxpYXJ5IEB2YXJ7bmFtZX0KK1doZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCit0byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKK3RhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCitzeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4KKworSWYgeW91IGxhdGVyIGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgdGhpcyBmaWx0ZXIgb2JqZWN0LCB0aGVuLCB3aGVuIHlvdQorcnVuIHRoZSBwcm9ncmFtLCB0aGUgZHluYW1pYyBsaW5rZXIgd2lsbCBzZWUgdGhlIERUX0FVWElMSUFSWSBmaWVsZC4gIElmCit0aGUgZHluYW1pYyBsaW5rZXIgcmVzb2x2ZXMgYW55IHN5bWJvbHMgZnJvbSB0aGUgZmlsdGVyIG9iamVjdCwgaXQgd2lsbAorZmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGRlZmluaXRpb24gaW4gdGhlIHNoYXJlZCBvYmplY3QKK0B2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBvbmUsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZpbml0aW9uCitpbiB0aGUgZmlsdGVyIG9iamVjdC4gIFRoZSBzaGFyZWQgb2JqZWN0IEB2YXJ7bmFtZX0gbmVlZCBub3QgZXhpc3QuCitUaHVzIHRoZSBzaGFyZWQgb2JqZWN0IEB2YXJ7bmFtZX0gbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZQoraW1wbGVtZW50YXRpb24gb2YgY2VydGFpbiBmdW5jdGlvbnMsIHBlcmhhcHMgZm9yIGRlYnVnZ2luZyBvciBmb3IKK21hY2hpbmUgc3BlY2lmaWMgcGVyZm9ybWFuY2UuCisKK1RoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuICBUaGUgRFRfQVVYSUxJQVJZIGVudHJpZXMKK3dpbGwgYmUgY3JlYXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgb24gdGhlIGNvbW1hbmQgbGluZS4KKworQGtpbmRleCAtRgorQGtpbmRleCAtLWZpbHRlcgorQGl0ZW0gLUYgQHZhcntuYW1lfQorQGl0ZW14IC0tZmlsdGVyIEB2YXJ7bmFtZX0KK1doZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfRklMVEVSIGZpZWxkIHRvCit0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wgdGFibGUKK29mIHRoZSBzaGFyZWQgb2JqZWN0IHdoaWNoIGlzIGJlaW5nIGNyZWF0ZWQgc2hvdWxkIGJlIHVzZWQgYXMgYSBmaWx0ZXIKK29uIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4KKworSWYgeW91IGxhdGVyIGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgdGhpcyBmaWx0ZXIgb2JqZWN0LCB0aGVuLCB3aGVuIHlvdQorcnVuIHRoZSBwcm9ncmFtLCB0aGUgZHluYW1pYyBsaW5rZXIgd2lsbCBzZWUgdGhlIERUX0ZJTFRFUiBmaWVsZC4gIFRoZQorZHluYW1pYyBsaW5rZXIgd2lsbCByZXNvbHZlIHN5bWJvbHMgYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlCitmaWx0ZXIgb2JqZWN0IGFzIHVzdWFsLCBidXQgaXQgd2lsbCBhY3R1YWxseSBsaW5rIHRvIHRoZSBkZWZpbml0aW9ucworZm91bmQgaW4gdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfS4gIFRodXMgdGhlIGZpbHRlciBvYmplY3QgY2FuIGJlCit1c2VkIHRvIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgc3ltYm9scyBwcm92aWRlZCBieSB0aGUgb2JqZWN0CitAdmFye25hbWV9LgorCitTb21lIG9sZGVyIGxpbmtlcnMgdXNlZCB0aGUgQGNvZGV7LUZ9IG9wdGlvbiB0aHJvdWdob3V0IGEgY29tcGlsYXRpb24KK3Rvb2xjaGFpbiBmb3Igc3BlY2lmeWluZyBvYmplY3QtZmlsZSBmb3JtYXQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dAorb2JqZWN0IGZpbGVzLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB1c2VzIG90aGVyIG1lY2hhbmlzbXMgZm9yIHRoaXMKK3B1cnBvc2U6IHRoZSBAY29kZXstYn0sIEBjb2Rley0tZm9ybWF0fSwgQGNvZGV7LS1vZm9ybWF0fSBvcHRpb25zLCB0aGUKK0Bjb2Rle1RBUkdFVH0gY29tbWFuZCBpbiBsaW5rZXIgc2NyaXB0cywgYW5kIHRoZSBAY29kZXtHTlVUQVJHRVR9CitlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFRoZSBAc2N7Z251fSBsaW5rZXIgd2lsbCBpZ25vcmUgdGhlIEBjb2Rley1GfQorb3B0aW9uIHdoZW4gbm90IGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LgorCitAa2luZGV4IC1nCitAaXRlbSAtZworSWdub3JlZC4gIFByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCisKK0BraW5kZXggLUcKK0BraW5kZXggLS1ncHNpemUKK0BjaW5kZXggb2JqZWN0IHNpemUKK0BpdGVtIC1HQHZhcnt2YWx1ZX0KK0BpdGVteCAtLWdwc2l6ZT1AdmFye3ZhbHVlfQorU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQIHJlZ2lzdGVyIHRvCitAdmFye3NpemV9LiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgc3VjaCBhcworTUlQUyBFQ09GRiB3aGljaCBzdXBwb3J0cyBwdXR0aW5nIGxhcmdlIGFuZCBzbWFsbCBvYmplY3RzIGludG8gZGlmZmVyZW50CitzZWN0aW9ucy4gIFRoaXMgaXMgaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KKworQGNpbmRleCBydW50aW1lIGxpYnJhcnkgbmFtZQorQGtpbmRleCAtaEB2YXJ7bmFtZX0KK0BraW5kZXggLXNvbmFtZT1AdmFye25hbWV9CitAaXRlbSAtaEB2YXJ7bmFtZX0KK0BpdGVteCAtc29uYW1lPUB2YXJ7bmFtZX0KK1doZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfU09OQU1FIGZpZWxkIHRvCit0aGUgc3BlY2lmaWVkIG5hbWUuICBXaGVuIGFuIGV4ZWN1dGFibGUgaXMgbGlua2VkIHdpdGggYSBzaGFyZWQgb2JqZWN0Cit3aGljaCBoYXMgYSBEVF9TT05BTUUgZmllbGQsIHRoZW4gd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBydW4gdGhlIGR5bmFtaWMKK2xpbmtlciB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgc2hhcmVkIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIERUX1NPTkFNRQorZmllbGQgcmF0aGVyIHRoYW4gdGhlIHVzaW5nIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxpbmtlci4KKworQGtpbmRleCAtaQorQGNpbmRleCBpbmNyZW1lbnRhbCBsaW5rCitAaXRlbSAtaQorUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBsaW5rIChzYW1lIGFzIG9wdGlvbiBAc2FtcHstcn0pLgorCitAY2luZGV4IGFyY2hpdmUgZmlsZXMsIGZyb20gY21kIGxpbmUKK0BraW5kZXggLWxAdmFye2FyY2hpdmV9CitAa2luZGV4IC0tbGlicmFyeT1AdmFye2FyY2hpdmV9CitAaXRlbSAtbEB2YXJ7YXJjaGl2ZX0KK0BpdGVteCAtLWxpYnJhcnk9QHZhcnthcmNoaXZlfQorQWRkIGFyY2hpdmUgZmlsZSBAdmFye2FyY2hpdmV9IHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGxpbmsuICBUaGlzCitvcHRpb24gbWF5IGJlIHVzZWQgYW55IG51bWJlciBvZiB0aW1lcy4gIEBjb2Rle2xkfSB3aWxsIHNlYXJjaCBpdHMKK3BhdGgtbGlzdCBmb3Igb2NjdXJyZW5jZXMgb2YgQGNvZGV7bGliQHZhcnthcmNoaXZlfS5hfSBmb3IgZXZlcnkKK0B2YXJ7YXJjaGl2ZX0gc3BlY2lmaWVkLgorCitPbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcywgQGNvZGV7bGR9IG1heSBhbHNvIHNlYXJjaCBmb3IKK2xpYnJhcmllcyB3aXRoIGV4dGVuc2lvbnMgb3RoZXIgdGhhbiBAY29kZXsuYX0uICBTcGVjaWZpY2FsbHksIG9uIEVMRgorYW5kIFN1bk9TIHN5c3RlbXMsIEBjb2Rle2xkfSB3aWxsIHNlYXJjaCBhIGRpcmVjdG9yeSBmb3IgYSBsaWJyYXJ5IHdpdGgKK2FuIGV4dGVuc2lvbiBvZiBAY29kZXsuc299IGJlZm9yZSBzZWFyY2hpbmcgZm9yIG9uZSB3aXRoIGFuIGV4dGVuc2lvbiBvZgorQGNvZGV7LmF9LiAgQnkgY29udmVudGlvbiwgYSBAY29kZXsuc299IGV4dGVuc2lvbiBpbmRpY2F0ZXMgYSBzaGFyZWQKK2xpYnJhcnkuCisKK1RoZSBsaW5rZXIgd2lsbCBzZWFyY2ggYW4gYXJjaGl2ZSBvbmx5IG9uY2UsIGF0IHRoZSBsb2NhdGlvbiB3aGVyZSBpdCBpcworc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBJZiB0aGUgYXJjaGl2ZSBkZWZpbmVzIGEgc3ltYm9sIHdoaWNoCit3YXMgdW5kZWZpbmVkIGluIHNvbWUgb2JqZWN0IHdoaWNoIGFwcGVhcmVkIGJlZm9yZSB0aGUgYXJjaGl2ZSBvbiB0aGUKK2NvbW1hbmQgbGluZSwgdGhlIGxpbmtlciB3aWxsIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIGZpbGUocykgZnJvbSB0aGUKK2FyY2hpdmUuICBIb3dldmVyLCBhbiB1bmRlZmluZWQgc3ltYm9sIGluIGFuIG9iamVjdCBhcHBlYXJpbmcgbGF0ZXIgb24KK3RoZSBjb21tYW5kIGxpbmUgd2lsbCBub3QgY2F1c2UgdGhlIGxpbmtlciB0byBzZWFyY2ggdGhlIGFyY2hpdmUgYWdhaW4uCisKK1NlZSB0aGUgQGNvZGV7LSh9IG9wdGlvbiBmb3IgYSB3YXkgdG8gZm9yY2UgdGhlIGxpbmtlciB0byBzZWFyY2gKK2FyY2hpdmVzIG11bHRpcGxlIHRpbWVzLgorCitZb3UgbWF5IGxpc3QgdGhlIHNhbWUgYXJjaGl2ZSBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lLgorCitAaWZzZXQgR0VORVJJQworVGhpcyB0eXBlIG9mIGFyY2hpdmUgc2VhcmNoaW5nIGlzIHN0YW5kYXJkIGZvciBVbml4IGxpbmtlcnMuICBIb3dldmVyLAoraWYgeW91IGFyZSB1c2luZyBAY29kZXtsZH0gb24gQUlYLCBub3RlIHRoYXQgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlCitiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuCitAZW5kIGlmc2V0CisKK0BjaW5kZXggc2VhcmNoIGRpcmVjdG9yeSwgZnJvbSBjbWQgbGluZQorQGtpbmRleCAtTEB2YXJ7ZGlyfQorQGtpbmRleCAtLWxpYnJhcnktcGF0aD1AdmFye2Rpcn0KK0BpdGVtIC1MQHZhcntzZWFyY2hkaXJ9IAorQGl0ZW14IC0tbGlicmFyeS1wYXRoPUB2YXJ7c2VhcmNoZGlyfQorQWRkIHBhdGggQHZhcntzZWFyY2hkaXJ9IHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQgQGNvZGV7bGR9IHdpbGwgc2VhcmNoCitmb3IgYXJjaGl2ZSBsaWJyYXJpZXMgYW5kIEBjb2Rle2xkfSBjb250cm9sIHNjcmlwdHMuICBZb3UgbWF5IHVzZSB0aGlzCitvcHRpb24gYW55IG51bWJlciBvZiB0aW1lcy4gIFRoZSBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gdGhlIG9yZGVyCitpbiB3aGljaCB0aGV5IGFyZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIERpcmVjdG9yaWVzIHNwZWNpZmllZAorb24gdGhlIGNvbW1hbmQgbGluZSBhcmUgc2VhcmNoZWQgYmVmb3JlIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzLiAgQWxsCitAY29kZXstTH0gb3B0aW9ucyBhcHBseSB0byBhbGwgQGNvZGV7LWx9IG9wdGlvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhlCitvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9ucyBhcHBlYXIuCisKK0BpZnNldCBVc2VzRW52VmFycworVGhlIGRlZmF1bHQgc2V0IG9mIHBhdGhzIHNlYXJjaGVkICh3aXRob3V0IGJlaW5nIHNwZWNpZmllZCB3aXRoCitAc2FtcHstTH0pIGRlcGVuZHMgb24gd2hpY2ggZW11bGF0aW9uIG1vZGUgQGNvZGV7bGR9IGlzIHVzaW5nLCBhbmQgaW4KK3NvbWUgY2FzZXMgYWxzbyBvbiBob3cgaXQgd2FzIGNvbmZpZ3VyZWQuICBAeHJlZntFbnZpcm9ubWVudH0uCitAZW5kIGlmc2V0CisKK1RoZSBwYXRocyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgaW4gYSBsaW5rIHNjcmlwdCB3aXRoIHRoZQorQGNvZGV7U0VBUkNIX0RJUn0gY29tbWFuZC4gIERpcmVjdG9yaWVzIHNwZWNpZmllZCB0aGlzIHdheSBhcmUgc2VhcmNoZWQKK2F0IHRoZSBwb2ludCBpbiB3aGljaCB0aGUgbGlua2VyIHNjcmlwdCBhcHBlYXJzIGluIHRoZSBjb21tYW5kIGxpbmUuCisKK0BjaW5kZXggZW11bGF0aW9uCitAa2luZGV4IC1tIEB2YXJ7ZW11bGF0aW9ufQorQGl0ZW0gLW1AdmFye2VtdWxhdGlvbn0KK0VtdWxhdGUgdGhlIEB2YXJ7ZW11bGF0aW9ufSBsaW5rZXIuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZQorZW11bGF0aW9ucyB3aXRoIHRoZSBAc2FtcHstLXZlcmJvc2V9IG9yIEBzYW1wey1WfSBvcHRpb25zLgorCitJZiB0aGUgQHNhbXB7LW19IG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlIGVtdWxhdGlvbiBpcyB0YWtlbiBmcm9tIHRoZQorQGNvZGV7TERFTVVMQVRJT059IGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiB0aGF0IGlzIGRlZmluZWQuCisKK090aGVyd2lzZSwgdGhlIGRlZmF1bHQgZW11bGF0aW9uIGRlcGVuZHMgdXBvbiBob3cgdGhlIGxpbmtlciB3YXMKK2NvbmZpZ3VyZWQuCisKK0BjaW5kZXggbGluayBtYXAKK0BraW5kZXggLU0KK0BraW5kZXggLS1wcmludC1tYXAKK0BpdGVtIC1NCitAaXRlbXggLS1wcmludC1tYXAKK1ByaW50IGEgbGluayBtYXAgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIEEgbGluayBtYXAgcHJvdmlkZXMKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1doZXJlIG9iamVjdCBmaWxlcyBhbmQgc3ltYm9scyBhcmUgbWFwcGVkIGludG8gbWVtb3J5LgorQGl0ZW0KK0hvdyBjb21tb24gc3ltYm9scyBhcmUgYWxsb2NhdGVkLgorQGl0ZW0KK0FsbCBhcmNoaXZlIG1lbWJlcnMgaW5jbHVkZWQgaW4gdGhlIGxpbmssIHdpdGggYSBtZW50aW9uIG9mIHRoZSBzeW1ib2wKK3doaWNoIGNhdXNlZCB0aGUgYXJjaGl2ZSBtZW1iZXIgdG8gYmUgYnJvdWdodCBpbi4KK0BlbmQgaXRlbWl6ZQorCitAa2luZGV4IC1uCitAY2luZGV4IHJlYWQtb25seSB0ZXh0CitAY2luZGV4IE5NQUdJQworQGtpbmRleCAtLW5tYWdpYworQGl0ZW0gLW4KK0BpdGVteCAtLW5tYWdpYworU2V0IHRoZSB0ZXh0IHNlZ21lbnQgdG8gYmUgcmVhZCBvbmx5LCBhbmQgbWFyayB0aGUgb3V0cHV0IGFzCitAY29kZXtOTUFHSUN9IGlmIHBvc3NpYmxlLgorCitAa2luZGV4IC1OCitAa2luZGV4IC0tb21hZ2ljCitAY2luZGV4IHJlYWQvd3JpdGUgZnJvbSBjbWQgbGluZQorQGNpbmRleCBPTUFHSUMKK0BpdGVtIC1OIAorQGl0ZW14IC0tb21hZ2ljCitTZXQgdGhlIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMgdG8gYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlLiAgQWxzbywgZG8KK25vdCBwYWdlLWFsaWduIHRoZSBkYXRhIHNlZ21lbnQuICBJZiB0aGUgb3V0cHV0IGZvcm1hdCBzdXBwb3J0cyBVbml4CitzdHlsZSBtYWdpYyBudW1iZXJzLCBtYXJrIHRoZSBvdXRwdXQgYXMgQGNvZGV7T01BR0lDfS4KKworQGtpbmRleCAtbyBAdmFye291dHB1dH0KK0BraW5kZXggLS1vdXRwdXQ9QHZhcntvdXRwdXR9CitAY2luZGV4IG5hbWluZyB0aGUgb3V0cHV0IGZpbGUKK0BpdGVtIC1vIEB2YXJ7b3V0cHV0fQorQGl0ZW14IC0tb3V0cHV0PUB2YXJ7b3V0cHV0fQorVXNlIEB2YXJ7b3V0cHV0fSBhcyB0aGUgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgQGNvZGV7bGR9OyBpZiB0aGlzCitvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgQGZpbGV7YS5vdXR9IGlzIHVzZWQgYnkgZGVmYXVsdC4gIFRoZQorc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUfSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLgorCitAa2luZGV4IC1PIEB2YXJ7bGV2ZWx9CitAY2luZGV4IGdlbmVyYXRpbmcgb3B0aW1pemVkIG91dHB1dAorQGl0ZW0gLU8gQHZhcntsZXZlbH0KK0lmIEB2YXJ7bGV2ZWx9IGlzIGEgbnVtZXJpYyB2YWx1ZXMgZ3JlYXRlciB0aGFuIHplcm8gQGNvZGV7bGR9IG9wdGltaXplcwordGhlIG91dHB1dC4gIFRoaXMgbWlnaHQgdGFrZSBzaWduaWZpY2FudGx5IGxvbmdlciBhbmQgdGhlcmVmb3JlIHByb2JhYmx5CitzaG91bGQgb25seSBiZSBlbmFibGVkIGZvciB0aGUgZmluYWwgYmluYXJ5LgorCitAY2luZGV4IHBhcnRpYWwgbGluaworQGNpbmRleCByZWxvY2F0YWJsZSBvdXRwdXQKK0BraW5kZXggLXIKK0BraW5kZXggLS1yZWxvY2F0ZWFibGUKK0BpdGVtIC1yCitAaXRlbXggLS1yZWxvY2F0ZWFibGUKK0dlbmVyYXRlIHJlbG9jYXRhYmxlIG91dHB1dC0tLWkuZS4sIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCit0dXJuIHNlcnZlIGFzIGlucHV0IHRvIEBjb2Rle2xkfS4gIFRoaXMgaXMgb2Z0ZW4gY2FsbGVkIEBkZm57cGFydGlhbAorbGlua2luZ30uICBBcyBhIHNpZGUgZWZmZWN0LCBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIFVuaXgKK21hZ2ljIG51bWJlcnMsIHRoaXMgb3B0aW9uIGFsc28gc2V0cyB0aGUgb3V0cHV0IGZpbGUncyBtYWdpYyBudW1iZXIgdG8KK0Bjb2Rle09NQUdJQ30uCitAYyA7IHNlZSBAY29kZXstTn0uIAorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgYW4gYWJzb2x1dGUgZmlsZSBpcyBwcm9kdWNlZC4gIFdoZW4KK2xpbmtpbmcgQysrIHByb2dyYW1zLCB0aGlzIG9wdGlvbiBAZW1waHt3aWxsIG5vdH0gcmVzb2x2ZSByZWZlcmVuY2VzIHRvCitjb25zdHJ1Y3RvcnM7IHRvIGRvIHRoYXQsIHVzZSBAc2FtcHstVXJ9LgorCitUaGlzIG9wdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIEBzYW1wey1pfS4KKworQGtpbmRleCAtUiBAdmFye2ZpbGV9CitAa2luZGV4IC0tanVzdC1zeW1ib2xzPUB2YXJ7ZmlsZX0KK0BjaW5kZXggc3ltYm9sLW9ubHkgaW5wdXQKK0BpdGVtIC1SIEB2YXJ7ZmlsZW5hbWV9CitAaXRlbXggLS1qdXN0LXN5bWJvbHM9QHZhcntmaWxlbmFtZX0KK1JlYWQgc3ltYm9sIG5hbWVzIGFuZCB0aGVpciBhZGRyZXNzZXMgZnJvbSBAdmFye2ZpbGVuYW1lfSwgYnV0IGRvIG5vdAorcmVsb2NhdGUgaXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgb3V0cHV0LiAgVGhpcyBhbGxvd3MgeW91ciBvdXRwdXQgZmlsZQordG8gcmVmZXIgc3ltYm9saWNhbGx5IHRvIGFic29sdXRlIGxvY2F0aW9ucyBvZiBtZW1vcnkgZGVmaW5lZCBpbiBvdGhlcgorcHJvZ3JhbXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbiBtb3JlIHRoYW4gb25jZS4KKworRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBFTEYgbGlua2VycywgaWYgdGhlIEBjb2Rley1SfSBvcHRpb24gaXMKK2ZvbGxvd2VkIGJ5IGEgZGlyZWN0b3J5IG5hbWUsIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLCBpdCBpcyB0cmVhdGVkIGFzCit0aGUgQGNvZGV7LXJwYXRofSBvcHRpb24uCisKK0BraW5kZXggLXMKK0BraW5kZXggLS1zdHJpcC1hbGwKK0BjaW5kZXggc3RyaXAgYWxsIHN5bWJvbHMKK0BpdGVtIC1zIAorQGl0ZW14IC0tc3RyaXAtYWxsCitPbWl0IGFsbCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3V0cHV0IGZpbGUuCisKK0BraW5kZXggLVMKK0BraW5kZXggLS1zdHJpcC1kZWJ1ZworQGNpbmRleCBzdHJpcCBkZWJ1Z2dlciBzeW1ib2xzCitAaXRlbSAtUyAKK0BpdGVteCAtLXN0cmlwLWRlYnVnCitPbWl0IGRlYnVnZ2VyIHN5bWJvbCBpbmZvcm1hdGlvbiAoYnV0IG5vdCBhbGwgc3ltYm9scykgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCisKK0BraW5kZXggLXQKK0BraW5kZXggLS10cmFjZQorQGNpbmRleCBpbnB1dCBmaWxlcywgZGlzcGxheWluZworQGl0ZW0gLXQgCitAaXRlbXggLS10cmFjZQorUHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcyBhcyBAY29kZXtsZH0gcHJvY2Vzc2VzIHRoZW0uCisKK0BraW5kZXggLVQgQHZhcntzY3JpcHR9CitAa2luZGV4IC0tc2NyaXB0PUB2YXJ7c2NyaXB0fQorQGNpbmRleCBzY3JpcHQgZmlsZXMKK0BpdGVtIC1UIEB2YXJ7c2NyaXB0ZmlsZX0KK0BpdGVteCAtLXNjcmlwdD1AdmFye3NjcmlwdGZpbGV9CitVc2UgQHZhcntzY3JpcHRmaWxlfSBhcyB0aGUgbGlua2VyIHNjcmlwdC4gIFRoaXMgc2NyaXB0IHJlcGxhY2VzCitAY29kZXtsZH0ncyBkZWZhdWx0IGxpbmtlciBzY3JpcHQgKHJhdGhlciB0aGFuIGFkZGluZyB0byBpdCksIHNvCitAdmFye2NvbW1hbmRmaWxlfSBtdXN0IHNwZWNpZnkgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlCitvdXRwdXQgZmlsZS4gIFlvdSBtdXN0IHVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgYSBjb21tYW5kCit3aGljaCBjYW4gb25seSBhcHBlYXIgb25jZSBpbiBhIGxpbmtlciBzY3JpcHQsIHN1Y2ggYXMgdGhlCitAY29kZXtTRUNUSU9OU30gb3IgQGNvZGV7TUVNT1JZfSBjb21tYW5kLiAgQHhyZWZ7U2NyaXB0c30uICBJZgorQHZhcntzY3JpcHRmaWxlfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIEBjb2Rle2xkfQorbG9va3MgZm9yIGl0IGluIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgYW55IHByZWNlZGluZyBAc2FtcHstTH0KK29wdGlvbnMuICBNdWx0aXBsZSBAc2FtcHstVH0gb3B0aW9ucyBhY2N1bXVsYXRlLgorCitAa2luZGV4IC11IEB2YXJ7c3ltYm9sfQorQGtpbmRleCAtLXVuZGVmaW5lZD1AdmFye3N5bWJvbH0KK0BjaW5kZXggdW5kZWZpbmVkIHN5bWJvbAorQGl0ZW0gLXUgQHZhcntzeW1ib2x9CitAaXRlbXggLS11bmRlZmluZWQ9QHZhcntzeW1ib2x9CitGb3JjZSBAdmFye3N5bWJvbH0gdG8gYmUgZW50ZXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUgYXMgYW4gdW5kZWZpbmVkCitzeW1ib2wuICBEb2luZyB0aGlzIG1heSwgZm9yIGV4YW1wbGUsIHRyaWdnZXIgbGlua2luZyBvZiBhZGRpdGlvbmFsCittb2R1bGVzIGZyb20gc3RhbmRhcmQgbGlicmFyaWVzLiAgQHNhbXB7LXV9IG1heSBiZSByZXBlYXRlZCB3aXRoCitkaWZmZXJlbnQgb3B0aW9uIGFyZ3VtZW50cyB0byBlbnRlciBhZGRpdGlvbmFsIHVuZGVmaW5lZCBzeW1ib2xzLiAgVGhpcworb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEBjb2Rle0VYVEVSTn0gbGlua2VyIHNjcmlwdCBjb21tYW5kLgorCitAa2luZGV4IC1VcgorQGNpbmRleCBjb25zdHJ1Y3RvcnMKK0BpdGVtIC1VciAKK0ZvciBhbnl0aGluZyBvdGhlciB0aGFuIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0bworQHNhbXB7LXJ9OiBpdCBnZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0LS0taS5lLiwgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KK3R1cm4gc2VydmUgYXMgaW5wdXQgdG8gQGNvZGV7bGR9LiAgV2hlbiBsaW5raW5nIEMrKyBwcm9ncmFtcywgQHNhbXB7LVVyfQorQGVtcGh7ZG9lc30gcmVzb2x2ZSByZWZlcmVuY2VzIHRvIGNvbnN0cnVjdG9ycywgdW5saWtlIEBzYW1wey1yfS4KK0l0IGRvZXMgbm90IHdvcmsgdG8gdXNlIEBzYW1wey1Vcn0gb24gZmlsZXMgdGhhdCB3ZXJlIHRoZW1zZWx2ZXMgbGlua2VkCit3aXRoIEBzYW1wey1Vcn07IG9uY2UgdGhlIGNvbnN0cnVjdG9yIHRhYmxlIGhhcyBiZWVuIGJ1aWx0LCBpdCBjYW5ub3QKK2JlIGFkZGVkIHRvLiAgVXNlIEBzYW1wey1Vcn0gb25seSBmb3IgdGhlIGxhc3QgcGFydGlhbCBsaW5rLCBhbmQKK0BzYW1wey1yfSBmb3IgdGhlIG90aGVycy4KKworQGtpbmRleCAtdgorQGtpbmRleCAtVgorQGtpbmRleCAtLXZlcnNpb24KK0BjaW5kZXggdmVyc2lvbgorQGl0ZW0gLXYKK0BpdGVteCAtLXZlcnNpb24KK0BpdGVteCAtVgorRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle2xkfS4gIFRoZSBAY29kZXstVn0gb3B0aW9uIGFsc28KK2xpc3RzIHRoZSBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KKworQGtpbmRleCAteAorQGtpbmRleCAtLWRpc2NhcmQtYWxsCitAY2luZGV4IGRlbGV0aW5nIGxvY2FsIHN5bWJvbHMKK0BpdGVtIC14CitAaXRlbXggLS1kaXNjYXJkLWFsbAorRGVsZXRlIGFsbCBsb2NhbCBzeW1ib2xzLgorCitAa2luZGV4IC1YCitAa2luZGV4IC0tZGlzY2FyZC1sb2NhbHMKK0BjaW5kZXggbG9jYWwgc3ltYm9scywgZGVsZXRpbmcKK0BjaW5kZXggTCwgZGVsZXRpbmcgc3ltYm9scyBiZWdpbm5pbmcKK0BpdGVtIC1YIAorQGl0ZW14IC0tZGlzY2FyZC1sb2NhbHMKK0RlbGV0ZSBhbGwgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMuICBGb3IgbW9zdCB0YXJnZXRzLCB0aGlzIGlzIGFsbCBsb2NhbAorc3ltYm9scyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIEBzYW1we0x9LgorCitAa2luZGV4IC15IEB2YXJ7c3ltYm9sfQorQGtpbmRleCAtLXRyYWNlLXN5bWJvbD1AdmFye3N5bWJvbH0KK0BjaW5kZXggc3ltYm9sIHRyYWNpbmcKK0BpdGVtIC15IEB2YXJ7c3ltYm9sfQorQGl0ZW14IC0tdHJhY2Utc3ltYm9sPUB2YXJ7c3ltYm9sfQorUHJpbnQgdGhlIG5hbWUgb2YgZWFjaCBsaW5rZWQgZmlsZSBpbiB3aGljaCBAdmFye3N5bWJvbH0gYXBwZWFycy4gIFRoaXMKK29wdGlvbiBtYXkgYmUgZ2l2ZW4gYW55IG51bWJlciBvZiB0aW1lcy4gIE9uIG1hbnkgc3lzdGVtcyBpdCBpcyBuZWNlc3NhcnkKK3RvIHByZXBlbmQgYW4gdW5kZXJzY29yZS4KKworVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IGhhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiB5b3VyIGxpbmsgYnV0Citkb24ndCBrbm93IHdoZXJlIHRoZSByZWZlcmVuY2UgaXMgY29taW5nIGZyb20uCisKK0BraW5kZXggLVkgQHZhcntwYXRofQorQGl0ZW0gLVkgQHZhcntwYXRofQorQWRkIEB2YXJ7cGF0aH0gdG8gdGhlIGRlZmF1bHQgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgb3B0aW9uIGV4aXN0cworZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eS4KKworQGtpbmRleCAteiBAdmFye2tleXdvcmR9CitAaXRlbSAteiBAdmFye2tleXdvcmR9CitUaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCisKK0BraW5kZXggLSgKK0BjaW5kZXggZ3JvdXBzIG9mIGFyY2hpdmVzCitAaXRlbSAtKCBAdmFye2FyY2hpdmVzfSAtKQorQGl0ZW14IC0tc3RhcnQtZ3JvdXAgQHZhcnthcmNoaXZlc30gLS1lbmQtZ3JvdXAKK1RoZSBAdmFye2FyY2hpdmVzfSBzaG91bGQgYmUgYSBsaXN0IG9mIGFyY2hpdmUgZmlsZXMuICBUaGV5IG1heSBiZQorZWl0aGVyIGV4cGxpY2l0IGZpbGUgbmFtZXMsIG9yIEBzYW1wey1sfSBvcHRpb25zLgorCitUaGUgc3BlY2lmaWVkIGFyY2hpdmVzIGFyZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIG5vIG5ldyB1bmRlZmluZWQKK3JlZmVyZW5jZXMgYXJlIGNyZWF0ZWQuICBOb3JtYWxseSwgYW4gYXJjaGl2ZSBpcyBzZWFyY2hlZCBvbmx5IG9uY2UgaW4KK3RoZSBvcmRlciB0aGF0IGl0IGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgYSBzeW1ib2wgaW4gdGhhdAorYXJjaGl2ZSBpcyBuZWVkZWQgdG8gcmVzb2x2ZSBhbiB1bmRlZmluZWQgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IGFuCitvYmplY3QgaW4gYW4gYXJjaGl2ZSB0aGF0IGFwcGVhcnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGxpbmtlcgord291bGQgbm90IGJlIGFibGUgdG8gcmVzb2x2ZSB0aGF0IHJlZmVyZW5jZS4gIEJ5IGdyb3VwaW5nIHRoZSBhcmNoaXZlcywKK3RoZXkgYWxsIGJlIHNlYXJjaGVkIHJlcGVhdGVkbHkgdW50aWwgYWxsIHBvc3NpYmxlIHJlZmVyZW5jZXMgYXJlCityZXNvbHZlZC4KKworVXNpbmcgdGhpcyBvcHRpb24gaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgY29zdC4gIEl0IGlzIGJlc3QgdG8gdXNlCitpdCBvbmx5IHdoZW4gdGhlcmUgYXJlIHVuYXZvaWRhYmxlIGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiB0d28gb3IKK21vcmUgYXJjaGl2ZXMuCisKK0BraW5kZXggLWFzc2VydCBAdmFye2tleXdvcmR9CitAaXRlbSAtYXNzZXJ0IEB2YXJ7a2V5d29yZH0KK1RoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIFN1bk9TIGNvbXBhdGliaWxpdHkuCisKK0BraW5kZXggLUJkeW5hbWljCitAa2luZGV4IC1keQorQGtpbmRleCAtY2FsbF9zaGFyZWQKK0BpdGVtIC1CZHluYW1pYworQGl0ZW14IC1keQorQGl0ZW14IC1jYWxsX3NoYXJlZAorTGluayBhZ2FpbnN0IGR5bmFtaWMgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24gcGxhdGZvcm1zCitmb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBvcHRpb24gaXMgbm9ybWFsbHkgdGhlCitkZWZhdWx0IG9uIHN1Y2ggcGxhdGZvcm1zLiAgVGhlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGlzIG9wdGlvbiBhcmUKK2ZvciBjb21wYXRpYmlsaXR5IHdpdGggdmFyaW91cyBzeXN0ZW1zLiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24KK211bHRpcGxlIHRpbWVzIG9uIHRoZSBjb21tYW5kIGxpbmU6IGl0IGFmZmVjdHMgbGlicmFyeSBzZWFyY2hpbmcgZm9yCitAY29kZXstbH0gb3B0aW9ucyB3aGljaCBmb2xsb3cgaXQuCisKK0BraW5kZXggLUJzdGF0aWMKK0BraW5kZXggLWRuCitAa2luZGV4IC1ub25fc2hhcmVkCitAa2luZGV4IC1zdGF0aWMKK0BpdGVtIC1Cc3RhdGljIAorQGl0ZW14IC1kbgorQGl0ZW14IC1ub25fc2hhcmVkCitAaXRlbXggLXN0YXRpYworRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24KK3BsYXRmb3JtcyBmb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhlIGRpZmZlcmVudAordmFyaWFudHMgb2YgdGhpcyBvcHRpb24gYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmFyaW91cyBzeXN0ZW1zLiAgWW91CittYXkgdXNlIHRoaXMgb3B0aW9uIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBjb21tYW5kIGxpbmU6IGl0IGFmZmVjdHMKK2xpYnJhcnkgc2VhcmNoaW5nIGZvciBAY29kZXstbH0gb3B0aW9ucyB3aGljaCBmb2xsb3cgaXQuCisKK0BraW5kZXggLUJzeW1ib2xpYworQGl0ZW0gLUJzeW1ib2xpYworV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBiaW5kIHJlZmVyZW5jZXMgdG8gZ2xvYmFsIHN5bWJvbHMgdG8gdGhlCitkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGlmIGFueS4gIE5vcm1hbGx5LCBpdCBpcyBwb3NzaWJsZQorZm9yIGEgcHJvZ3JhbSBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBsaWJyYXJ5IHRvIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9uCit3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIG9uIEVMRgorcGxhdGZvcm1zIHdoaWNoIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4KKworQGtpbmRleCAtLWNoZWNrLXNlY3Rpb25zCitAa2luZGV4IC0tbm8tY2hlY2stc2VjdGlvbnMKK0BpdGVtIC0tY2hlY2stc2VjdGlvbnMKK0BpdGVtIC0tbm8tY2hlY2stc2VjdGlvbnMKK0Fza3MgdGhlIGxpbmtlciBAZW1waHtub3R9IHRvIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGFmdGVyIHRoZXkgaGF2ZQorYmVlbiBhc3NpZ25lZCB0byBzZWUgaWYgdGhlcmUgYW55IG92ZXJsYXBzLiAgTm9ybWFsbHkgdGhlIGxpbmtlciB3aWxsCitwZXJmb3JtIHRoaXMgY2hlY2ssIGFuZCBpZiBpdCBmaW5kcyBhbnkgb3ZlcmxhcHMgaXQgd2lsbCBwcm9kdWNlCitzdWl0YWJsZSBlcnJvciBtZXNzYWdlcy4gIFRoZSBsaW5rZXIgZG9lcyBrbm93IGFib3V0LCBhbmQgZG9lcyBtYWtlCithbGxvd2FuY2VzIGZvciBzZWN0aW9ucyBpbiBvdmVybGF5cy4gIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBjYW4gYmUKK3Jlc3RvcmVkIGJ5IHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoIEBzYW1wey0tY2hlY2stc2VjdGlvbnN9LgorCitAY2luZGV4IGNyb3NzIHJlZmVyZW5jZSB0YWJsZQorQGtpbmRleCAtLWNyZWYKK0BpdGVtIC0tY3JlZgorT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKK2dlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KK090aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCitUaGUgZm9ybWF0IG9mIHRoZSB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IHNpbXBsZSwgc28gdGhhdCBpdCBtYXkgYmUKK2Vhc2lseSBwcm9jZXNzZWQgYnkgYSBzY3JpcHQgaWYgbmVjZXNzYXJ5LiAgVGhlIHN5bWJvbHMgYXJlIHByaW50ZWQgb3V0LAorc29ydGVkIGJ5IG5hbWUuICBGb3IgZWFjaCBzeW1ib2wsIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGlzIGdpdmVuLiAgSWYgdGhlCitzeW1ib2wgaXMgZGVmaW5lZCwgdGhlIGZpcnN0IGZpbGUgbGlzdGVkIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUKK2RlZmluaXRpb24uICBUaGUgcmVtYWluaW5nIGZpbGVzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sLgorCitAY2luZGV4IHN5bWJvbHMsIGZyb20gY29tbWFuZCBsaW5lCitAa2luZGV4IC0tZGVmc3ltIEB2YXJ7c3ltYm9sfT1AdmFye2V4cH0KK0BpdGVtIC0tZGVmc3ltIEB2YXJ7c3ltYm9sfT1AdmFye2V4cHJlc3Npb259CitDcmVhdGUgYSBnbG9iYWwgc3ltYm9sIGluIHRoZSBvdXRwdXQgZmlsZSwgY29udGFpbmluZyB0aGUgYWJzb2x1dGUKK2FkZHJlc3MgZ2l2ZW4gYnkgQHZhcntleHByZXNzaW9ufS4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKK3RpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQorbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgQHZhcntleHByZXNzaW9ufSBpbiB0aGlzCitjb250ZXh0OiB5b3UgbWF5IGdpdmUgYSBoZXhhZGVjaW1hbCBjb25zdGFudCBvciB0aGUgbmFtZSBvZiBhbiBleGlzdGluZworc3ltYm9sLCBvciB1c2UgQGNvZGV7K30gYW5kIEBjb2Rley19IHRvIGFkZCBvciBzdWJ0cmFjdCBoZXhhZGVjaW1hbAorY29uc3RhbnRzIG9yIHN5bWJvbHMuICBJZiB5b3UgbmVlZCBtb3JlIGVsYWJvcmF0ZSBleHByZXNzaW9ucywgY29uc2lkZXIKK3VzaW5nIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSBmcm9tIGEgc2NyaXB0IChAcHhyZWZ7QXNzaWdubWVudHMsLAorQXNzaWdubWVudDogU3ltYm9sIERlZmluaXRpb25zfSkuICBAZW1waHtOb3RlOn0gdGhlcmUgc2hvdWxkIGJlIG5vIHdoaXRlCitzcGFjZSBiZXR3ZWVuIEB2YXJ7c3ltYm9sfSwgdGhlIGVxdWFscyBzaWduIChgYEBrZXl7PX0nJyksIGFuZAorQHZhcntleHByZXNzaW9ufS4KKworQGNpbmRleCBkZW1hbmdsaW5nLCBmcm9tIGNvbW1hbmQgbGluZQorQGtpbmRleCAtLWRlbWFuZ2xlCitAa2luZGV4IC0tbm8tZGVtYW5nbGUKK0BpdGVtIC0tZGVtYW5nbGUKK0BpdGVteCAtLW5vLWRlbWFuZ2xlCitUaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hldGhlciB0byBkZW1hbmdsZSBzeW1ib2wgbmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMKK2FuZCBvdGhlciBvdXRwdXQuICBXaGVuIHRoZSBsaW5rZXIgaXMgdG9sZCB0byBkZW1hbmdsZSwgaXQgdHJpZXMgdG8KK3ByZXNlbnQgc3ltYm9sIG5hbWVzIGluIGEgcmVhZGFibGUgZmFzaGlvbjogaXQgc3RyaXBzIGxlYWRpbmcKK3VuZGVyc2NvcmVzIGlmIHRoZXkgYXJlIHVzZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCwgYW5kIGNvbnZlcnRzIEMrKworbWFuZ2xlZCBzeW1ib2wgbmFtZXMgaW50byB1c2VyIHJlYWRhYmxlIG5hbWVzLiAgVGhlIGxpbmtlciB3aWxsIGRlbWFuZ2xlCitieSBkZWZhdWx0IHVubGVzcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQHNhbXB7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMKK3NldC4gIFRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisKK0BjaW5kZXggZHluYW1pYyBsaW5rZXIsIGZyb20gY29tbWFuZCBsaW5lCitAa2luZGV4IC0tZHluYW1pYy1saW5rZXIgQHZhcntmaWxlfQorQGl0ZW0gLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9CitTZXQgdGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgbGlua2VyLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgorZ2VuZXJhdGluZyBkeW5hbWljYWxseSBsaW5rZWQgRUxGIGV4ZWN1dGFibGVzLiAgVGhlIGRlZmF1bHQgZHluYW1pYworbGlua2VyIGlzIG5vcm1hbGx5IGNvcnJlY3Q7IGRvbid0IHVzZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUKK2RvaW5nLgorCitAY2luZGV4IE1JUFMgZW1iZWRkZWQgUElDIGNvZGUKK0BraW5kZXggLS1lbWJlZGRlZC1yZWxvY3MKK0BpdGVtIC0tZW1iZWRkZWQtcmVsb2NzCitUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBsaW5raW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsCitnZW5lcmF0ZWQgYnkgdGhlIC1tZW1iZWRkZWQtcGljIG9wdGlvbiB0byB0aGUgQHNje2dudX0gY29tcGlsZXIgYW5kCithc3NlbWJsZXIuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBjcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdAorcnVudGltZSB0byByZWxvY2F0ZSBhbnkgZGF0YSB3aGljaCB3YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyCit2YWx1ZXMuICBTZWUgdGhlIGNvZGUgaW4gdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgorCitAa2luZGV4IC0tZm9yY2UtZXhlLXN1ZmZpeAorQGl0ZW0gIC0tZm9yY2UtZXhlLXN1ZmZpeAorTWFrZSBzdXJlIHRoYXQgYW4gb3V0cHV0IGZpbGUgaGFzIGEgLmV4ZSBzdWZmaXguCisKK0lmIGEgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGZ1bGx5IGxpbmtlZCBvdXRwdXQgZmlsZSBkb2VzIG5vdCBoYXZlIGEKK0Bjb2Rley5leGV9IG9yIEBjb2Rley5kbGx9IHN1ZmZpeCwgdGhpcyBvcHRpb24gZm9yY2VzIHRoZSBsaW5rZXIgdG8gY29weQordGhlIG91dHB1dCBmaWxlIHRvIG9uZSBvZiB0aGUgc2FtZSBuYW1lIHdpdGggYSBAY29kZXsuZXhlfSBzdWZmaXguIFRoaXMKK29wdGlvbiBpcyB1c2VmdWwgd2hlbiB1c2luZyB1bm1vZGlmaWVkIFVuaXggbWFrZWZpbGVzIG9uIGEgTWljcm9zb2Z0CitXaW5kb3dzIGhvc3QsIHNpbmNlIHNvbWUgdmVyc2lvbnMgb2YgV2luZG93cyB3b24ndCBydW4gYW4gaW1hZ2UgdW5sZXNzCitpdCBlbmRzIGluIGEgQGNvZGV7LmV4ZX0gc3VmZml4LgorCitAa2luZGV4IC0tZ2Mtc2VjdGlvbnMKK0BraW5kZXggLS1uby1nYy1zZWN0aW9ucworQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KK0BpdGVtIC0tbm8tZ2Mtc2VjdGlvbnMKK0BpdGVteCAtLWdjLXNlY3Rpb25zCitFbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHVudXNlZCBpbnB1dCBzZWN0aW9ucy4gIEl0IGlzIGlnbm9yZWQgb24KK3RhcmdldHMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGlzIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGlzIG5vdCBjb21wYXRpYmxlCit3aXRoIEBzYW1wey1yfSwgbm9yIHNob3VsZCBpdCBiZSB1c2VkIHdpdGggZHluYW1pYyBsaW5raW5nLiAgVGhlIGRlZmF1bHQKK2JlaGF2aW91ciAob2Ygbm90IHBlcmZvcm1pbmcgdGhpcyBnYXJiYWdlIGNvbGxlY3Rpb24pIGNhbiBiZSByZXN0b3JlZCBieQorc3BlY2lmeWluZyBAc2FtcHstLW5vLWdjLXNlY3Rpb25zfSBvbiB0aGUgY29tbWFuZCBsaW5lLgorCitAY2luZGV4IGhlbHAKK0BjaW5kZXggdXNhZ2UKK0BraW5kZXggLS1oZWxwCitAaXRlbSAtLWhlbHAKK1ByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KKworQGtpbmRleCAtTWFwCitAaXRlbSAtTWFwIEB2YXJ7bWFwZmlsZX0KK1ByaW50IGEgbGluayBtYXAgdG8gdGhlIGZpbGUgQHZhcnttYXBmaWxlfS4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCitAc2FtcHstTX0gb3B0aW9uLCBhYm92ZS4KKworQGNpbmRleCBtZW1vcnkgdXNhZ2UKK0BraW5kZXggLS1uby1rZWVwLW1lbW9yeQorQGl0ZW0gLS1uby1rZWVwLW1lbW9yeQorQGNvZGV7bGR9IG5vcm1hbGx5IG9wdGltaXplcyBmb3Igc3BlZWQgb3ZlciBtZW1vcnkgdXNhZ2UgYnkgY2FjaGluZyB0aGUKK3N5bWJvbCB0YWJsZXMgb2YgaW5wdXQgZmlsZXMgaW4gbWVtb3J5LiAgVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7bGR9IHRvCitpbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sIHRhYmxlcyBhcworbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgQGNvZGV7bGR9IHJ1bnMgb3V0IG9mIG1lbW9yeSBzcGFjZQord2hpbGUgbGlua2luZyBhIGxhcmdlIGV4ZWN1dGFibGUuCisKK0BraW5kZXggLS1uby11bmRlZmluZWQKK0BpdGVtIC0tbm8tdW5kZWZpbmVkCitOb3JtYWxseSB3aGVuIGNyZWF0aW5nIGEgbm9uLXN5bWJvbGljIHNoYXJlZCBsaWJyYXJ5LCB1bmRlZmluZWQgc3ltYm9scworYXJlIGFsbG93ZWQgYW5kIGxlZnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIHJ1bnRpbWUgbG9hZGVyLiAgVGhpcyBvcHRpb24KK2Rpc2FsbG93cyBzdWNoIHVuZGVmaW5lZCBzeW1ib2xzLgorCitAa2luZGV4IC0tbm8td2Fybi1taXNtYXRjaAorQGl0ZW0gLS1uby13YXJuLW1pc21hdGNoCitOb3JtYWxseSBAY29kZXtsZH0gd2lsbCBnaXZlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gbGluayB0b2dldGhlciBpbnB1dAorZmlsZXMgdGhhdCBhcmUgbWlzbWF0Y2hlZCBmb3Igc29tZSByZWFzb24sIHBlcmhhcHMgYmVjYXVzZSB0aGV5IGhhdmUKK2JlZW4gY29tcGlsZWQgZm9yIGRpZmZlcmVudCBwcm9jZXNzb3JzIG9yIGZvciBkaWZmZXJlbnQgZW5kaWFubmVzc2VzLgorVGhpcyBvcHRpb24gdGVsbHMgQGNvZGV7bGR9IHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5IHBlcm1pdCBzdWNoIHBvc3NpYmxlCitlcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggY2FyZSwgaW4gY2FzZXMgd2hlbiB5b3UKK2hhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgbGlua2VyIGVycm9ycyBhcmUKK2luYXBwcm9wcmlhdGUuCisKK0BraW5kZXggLS1uby13aG9sZS1hcmNoaXZlCitAaXRlbSAtLW5vLXdob2xlLWFyY2hpdmUKK1R1cm4gb2ZmIHRoZSBlZmZlY3Qgb2YgdGhlIEBjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uIGZvciBzdWJzZXF1ZW50CithcmNoaXZlIGZpbGVzLgorCitAY2luZGV4IG91dHB1dCBmaWxlIGFmdGVyIGVycm9ycworQGtpbmRleCAtLW5vaW5oaWJpdC1leGVjCitAaXRlbSAtLW5vaW5oaWJpdC1leGVjCitSZXRhaW4gdGhlIGV4ZWN1dGFibGUgb3V0cHV0IGZpbGUgd2hlbmV2ZXIgaXQgaXMgc3RpbGwgdXNhYmxlLgorTm9ybWFsbHksIHRoZSBsaW5rZXIgd2lsbCBub3QgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZSBpZiBpdCBlbmNvdW50ZXJzCitlcnJvcnMgZHVyaW5nIHRoZSBsaW5rIHByb2Nlc3M7IGl0IGV4aXRzIHdpdGhvdXQgd3JpdGluZyBhbiBvdXRwdXQgZmlsZQord2hlbiBpdCBpc3N1ZXMgYW55IGVycm9yIHdoYXRzb2V2ZXIuCisKK0BpZmNsZWFyIFNpbmdsZUZvcm1hdAorQGtpbmRleCAtLW9mb3JtYXQKK0BpdGVtIC0tb2Zvcm1hdCBAdmFye291dHB1dC1mb3JtYXR9CitAY29kZXtsZH0gbWF5IGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGtpbmQgb2Ygb2JqZWN0CitmaWxlLiAgSWYgeW91ciBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0aGlzIHdheSwgeW91IGNhbiB1c2UgdGhlCitAc2FtcHstLW9mb3JtYXR9IG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBiaW5hcnkgZm9ybWF0IGZvciB0aGUgb3V0cHV0CitvYmplY3QgZmlsZS4gIEV2ZW4gd2hlbiBAY29kZXtsZH0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlCitvYmplY3QgZm9ybWF0cywgeW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfQorc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAordXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMgYSB0ZXh0IHN0cmluZywgdGhlCituYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgKFlvdSBjYW4KK2xpc3QgdGhlIGF2YWlsYWJsZSBiaW5hcnkgZm9ybWF0cyB3aXRoIEBzYW1we29iamR1bXAgLWl9LikgIFRoZSBzY3JpcHQKK2NvbW1hbmQgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCwgYnV0Cit0aGlzIG9wdGlvbiBvdmVycmlkZXMgaXQuICBAeHJlZntCRkR9LgorQGVuZCBpZmNsZWFyCisKK0BraW5kZXggLXFtYWdpYworQGl0ZW0gLXFtYWdpYworVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgTGludXggY29tcGF0aWJpbGl0eS4KKworQGtpbmRleCAtUXkKK0BpdGVtIC1ReQorVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LgorCitAa2luZGV4IC0tcmVsYXgKK0BjaW5kZXggc3ludGhlc2l6aW5nIGxpbmtlcgorQGNpbmRleCByZWxheGluZyBhZGRyZXNzaW5nIG1vZGVzCitAaXRlbSAtLXJlbGF4CitBbiBvcHRpb24gd2l0aCBtYWNoaW5lIGRlcGVuZGVudCBlZmZlY3RzLiAgCitAaWZzZXQgR0VORVJJQworVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgb24gYSBmZXcgdGFyZ2V0cy4KK0BlbmQgaWZzZXQKK0BpZnNldCBIODMwMAorQHhyZWZ7SDgvMzAwLCxAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDB9LgorQGVuZCBpZnNldAorQGlmc2V0IEk5NjAKK0B4cmVme2k5NjAsLCBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5fS4KK0BlbmQgaWZzZXQKKworCitPbiBzb21lIHBsYXRmb3JtcywgdGhlIEBzYW1wey0tcmVsYXh9IG9wdGlvbiBwZXJmb3JtcyBnbG9iYWwKK29wdGltaXphdGlvbnMgdGhhdCBiZWNvbWUgcG9zc2libGUgd2hlbiB0aGUgbGlua2VyIHJlc29sdmVzIGFkZHJlc3NpbmcKK2luIHRoZSBwcm9ncmFtLCBzdWNoIGFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcKK2luc3RydWN0aW9ucyBpbiB0aGUgb3V0cHV0IG9iamVjdCBmaWxlLgorCitPbiBzb21lIHBsYXRmb3JtcyB0aGVzZSBsaW5rIHRpbWUgZ2xvYmFsIG9wdGltaXphdGlvbnMgbWF5IG1ha2Ugc3ltYm9saWMKK2RlYnVnZ2luZyBvZiB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgaW1wb3NzaWJsZS4KK0BpZnNldCBHRU5FUklDCitUaGlzIGlzIGtub3duIHRvIGJlCit0aGUgY2FzZSBmb3IgdGhlIE1hdHN1c2hpdGEgTU4xMDIwMCBhbmQgTU4xMDMwMCBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KK0BlbmQgaWZzZXQKKworQGlmc2V0IEdFTkVSSUMKK09uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIEBzYW1wey0tcmVsYXh9IGlzIGFjY2VwdGVkLAorYnV0IGlnbm9yZWQuCitAZW5kIGlmc2V0CisKK0BjaW5kZXggcmV0YWluaW5nIHNwZWNpZmllZCBzeW1ib2xzCitAY2luZGV4IHN0cmlwcGluZyBhbGwgYnV0IHNvbWUgc3ltYm9scworQGNpbmRleCBzeW1ib2xzLCByZXRhaW5pbmcgc2VsZWN0aXZlbHkKK0BpdGVtIC0tcmV0YWluLXN5bWJvbHMtZmlsZSBAdmFye2ZpbGVuYW1lfQorUmV0YWluIEBlbXBoe29ubHl9IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfSwKK2Rpc2NhcmRpbmcgYWxsIG90aGVycy4gIEB2YXJ7ZmlsZW5hbWV9IGlzIHNpbXBseSBhIGZsYXQgZmlsZSwgd2l0aCBvbmUKK3N5bWJvbCBuYW1lIHBlciBsaW5lLiAgVGhpcyBvcHRpb24gaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gZW52aXJvbm1lbnRzCitAaWZzZXQgR0VORVJJQworKHN1Y2ggYXMgVnhXb3JrcykKK0BlbmQgaWZzZXQKK3doZXJlIGEgbGFyZ2UgZ2xvYmFsIHN5bWJvbCB0YWJsZSBpcyBhY2N1bXVsYXRlZCBncmFkdWFsbHksIHRvIGNvbnNlcnZlCitydW4tdGltZSBtZW1vcnkuCisKK0BzYW1wey0tcmV0YWluLXN5bWJvbHMtZmlsZX0gZG9lcyBAZW1waHtub3R9IGRpc2NhcmQgdW5kZWZpbmVkIHN5bWJvbHMsCitvciBzeW1ib2xzIG5lZWRlZCBmb3IgcmVsb2NhdGlvbnMuCisKK1lvdSBtYXkgb25seSBzcGVjaWZ5IEBzYW1wey0tcmV0YWluLXN5bWJvbHMtZmlsZX0gb25jZSBpbiB0aGUgY29tbWFuZAorbGluZS4gIEl0IG92ZXJyaWRlcyBAc2FtcHstc30gYW5kIEBzYW1wey1TfS4KKworQGlmc2V0IEdFTkVSSUMKK0BpdGVtIC1ycGF0aCBAdmFye2Rpcn0KK0BjaW5kZXggcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCitAa2luZGV4IC1ycGF0aAorQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIGlzIHVzZWQgd2hlbgorbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSB3aXRoIHNoYXJlZCBvYmplY3RzLiAgQWxsIEBjb2Rley1ycGF0aH0KK2FyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBwYXNzZWQgdG8gdGhlIHJ1bnRpbWUgbGlua2VyLCB3aGljaCB1c2VzCit0aGVtIHRvIGxvY2F0ZSBzaGFyZWQgb2JqZWN0cyBhdCBydW50aW1lLiAgVGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIGlzCithbHNvIHVzZWQgd2hlbiBsb2NhdGluZyBzaGFyZWQgb2JqZWN0cyB3aGljaCBhcmUgbmVlZGVkIGJ5IHNoYXJlZAorb2JqZWN0cyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBsaW5rOyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbi4gIElmIEBjb2Rley1ycGF0aH0gaXMgbm90IHVzZWQgd2hlbiBsaW5raW5nIGFuCitFTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorQGNvZGV7TERfUlVOX1BBVEh9IHdpbGwgYmUgdXNlZCBpZiBpdCBpcyBkZWZpbmVkLgorCitUaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uCitTdW5PUywgdGhlIGxpbmtlciB3aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRjaCBvdXQgb2YgYWxsIHRoZQorQGNvZGV7LUx9IG9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhIEBjb2Rley1ycGF0aH0gb3B0aW9uIGlzIHVzZWQsIHRoZQorcnVudGltZSBzZWFyY2ggcGF0aCB3aWxsIGJlIGZvcm1lZCBleGNsdXNpdmVseSB1c2luZyB0aGUgQGNvZGV7LXJwYXRofQorb3B0aW9ucywgaWdub3JpbmcgdGhlIEBjb2Rley1MfSBvcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcKK2djYywgd2hpY2ggYWRkcyBtYW55IEBjb2Rley1MfSBvcHRpb25zIHdoaWNoIG1heSBiZSBvbiBORlMgbW91bnRlZAorZmlsZXN5c3RlbXMuCisKK0ZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgRUxGIGxpbmtlcnMsIGlmIHRoZSBAY29kZXstUn0gb3B0aW9uIGlzCitmb2xsb3dlZCBieSBhIGRpcmVjdG9yeSBuYW1lLCByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZSwgaXQgaXMgdHJlYXRlZCBhcwordGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uLgorQGVuZCBpZnNldAorCitAaWZzZXQgR0VORVJJQworQGNpbmRleCBsaW5rLXRpbWUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoCitAa2luZGV4IC1ycGF0aC1saW5rCitAaXRlbSAtcnBhdGgtbGluayBAdmFye0RJUn0KK1doZW4gdXNpbmcgRUxGIG9yIFN1bk9TLCBvbmUgc2hhcmVkIGxpYnJhcnkgbWF5IHJlcXVpcmUgYW5vdGhlci4gIFRoaXMKK2hhcHBlbnMgd2hlbiBhbiBAY29kZXtsZCAtc2hhcmVkfSBsaW5rIGluY2x1ZGVzIGEgc2hhcmVkIGxpYnJhcnkgYXMgb25lCitvZiB0aGUgaW5wdXQgZmlsZXMuCisKK1doZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAorbm9uLXJlbG9jYXRhYmxlIGxpbmssIGl0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gbG9jYXRlIHRoZSByZXF1aXJlZAorc2hhcmVkIGxpYnJhcnkgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIGxpbmssIGlmIGl0IGlzIG5vdCBpbmNsdWRlZAorZXhwbGljaXRseS4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbgorc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCitAY29kZXstcnBhdGgtbGlua30gb3B0aW9uIG1heSBzcGVjaWZ5IGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3J5IG5hbWVzCitlaXRoZXIgYnkgc3BlY2lmeWluZyBhIGxpc3Qgb2YgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucywgb3IgYnkKK2FwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KKworVGhlIGxpbmtlciB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIHBhdGhzIHRvIGxvY2F0ZSByZXF1aXJlZCBzaGFyZWQKK2xpYnJhcmllcy4KK0BlbnVtZXJhdGUKK0BpdGVtCitBbnkgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb25zLgorQGl0ZW0KK0FueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRofSBvcHRpb25zLiAgVGhlIGRpZmZlcmVuY2UKK2JldHdlZW4gQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7LXJwYXRoLWxpbmt9IGlzIHRoYXQgZGlyZWN0b3JpZXMKK3NwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSBleGVjdXRhYmxlIGFuZAordXNlZCBhdCBydW50aW1lLCB3aGVyZWFzIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uIGlzIG9ubHkgZWZmZWN0aXZlCithdCBsaW5rIHRpbWUuCitAaXRlbQorT24gYW4gRUxGIHN5c3RlbSwgaWYgdGhlIEBjb2Rley1ycGF0aH0gYW5kIEBjb2Rle3JwYXRoLWxpbmt9IG9wdGlvbnMKK3dlcmUgbm90IHVzZWQsIHNlYXJjaCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitAY29kZXtMRF9SVU5fUEFUSH0uCitAaXRlbQorT24gU3VuT1MsIGlmIHRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiB3YXMgbm90IHVzZWQsIHNlYXJjaCBhbnkKK2RpcmVjdG9yaWVzIHNwZWNpZmllZCB1c2luZyBAY29kZXstTH0gb3B0aW9ucy4KK0BpdGVtCitGb3IgYSBuYXRpdmUgbGlua2VyLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitAY29kZXtMRF9MSUJSQVJZX1BBVEh9LgorQGl0ZW0KK1RoZSBkZWZhdWx0IGRpcmVjdG9yaWVzLCBub3JtYWxseSBAZmlsZXsvbGlifSBhbmQgQGZpbGV7L3Vzci9saWJ9LgorQGl0ZW0KK0ZvciBhIG5hdGl2ZSBsaW5rZXIgb24gYW4gRUxGIHN5c3RlbSwgaWYgdGhlIGZpbGUgQGZpbGV7L2V0Yy9sZC5zby5jb25mfQorZXhpc3RzLCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBmb3VuZCBpbiB0aGF0IGZpbGUuCitAZW5kIGVudW1lcmF0ZQorCitJZiB0aGUgcmVxdWlyZWQgc2hhcmVkIGxpYnJhcnkgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgaXNzdWUgYQord2FybmluZyBhbmQgY29udGludWUgd2l0aCB0aGUgbGluay4KK0BlbmQgaWZzZXQKKworQGtpbmRleCAtc2hhcmVkCitAa2luZGV4IC1Cc2hhcmVhYmxlCitAaXRlbSAtc2hhcmVkCitAaXRlbXggLUJzaGFyZWFibGUKK0BjaW5kZXggc2hhcmVkIGxpYnJhcmllcworQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYsIFhDT0ZGCithbmQgU3VuT1MgcGxhdGZvcm1zLiAgT24gU3VuT1MsIHRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhCitzaGFyZWQgbGlicmFyeSBpZiB0aGUgQGNvZGV7LWV9IG9wdGlvbiBpcyBub3QgdXNlZCBhbmQgdGhlcmUgYXJlCit1bmRlZmluZWQgc3ltYm9scyBpbiB0aGUgbGluay4KKworQGl0ZW0gLS1zb3J0LWNvbW1vbgorQGtpbmRleCAtLXNvcnQtY29tbW9uCitUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8gc29ydCB0aGUgY29tbW9uIHN5bWJvbHMgYnkgc2l6ZSB3aGVuIGl0CitwbGFjZXMgdGhlbSBpbiB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IHNlY3Rpb25zLiAgRmlyc3QgY29tZSBhbGwgdGhlIG9uZQorYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbCB0aGUgdHdvIGJ5dGVzLCB0aGVuIGFsbCB0aGUgZm91ciBieXRlcywgYW5kIHRoZW4KK2V2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KK2FsaWdubWVudCBjb25zdHJhaW50cy4KKworQGtpbmRleCAtLXNwbGl0LWJ5LWZpbGUKK0BpdGVtIC0tc3BsaXQtYnktZmlsZQorU2ltaWxhciB0byBAY29kZXstLXNwbGl0LWJ5LXJlbG9jfSBidXQgY3JlYXRlcyBhIG5ldyBvdXRwdXQgc2VjdGlvbiBmb3IKK2VhY2ggaW5wdXQgZmlsZS4KKworQGtpbmRleCAtLXNwbGl0LWJ5LXJlbG9jCitAaXRlbSAtLXNwbGl0LWJ5LXJlbG9jIEB2YXJ7Y291bnR9CitUcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCitvdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4gQHZhcntjb3VudH0gcmVsb2NhdGlvbnMuCitUaGlzIGlzIHVzZWZ1bCB3aGVuIGdlbmVyYXRpbmcgaHVnZSByZWxvY2F0YWJsZSBmb3IgZG93bmxvYWRpbmcgaW50bworY2VydGFpbiByZWFsIHRpbWUga2VybmVscyB3aXRoIHRoZSBDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdDsgc2luY2UgQ09GRgorY2Fubm90IHJlcHJlc2VudCBtb3JlIHRoYW4gNjU1MzUgcmVsb2NhdGlvbnMgaW4gYSBzaW5nbGUgc2VjdGlvbi4gIE5vdGUKK3RoYXQgdGhpcyB3aWxsIGZhaWwgdG8gd29yayB3aXRoIG9iamVjdCBmaWxlIGZvcm1hdHMgd2hpY2ggZG8gbm90CitzdXBwb3J0IGFyYml0cmFyeSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgd2lsbCBub3Qgc3BsaXQgdXAgaW5kaXZpZHVhbAoraW5wdXQgc2VjdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uLCBzbyBpZiBhIHNpbmdsZSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5zCittb3JlIHRoYW4gQHZhcntjb3VudH0gcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0CittYW55IHJlbG9jYXRpb25zLgorCitAa2luZGV4IC0tc3RhdHMKK0BpdGVtIC0tc3RhdHMKK0NvbXB1dGUgYW5kIGRpc3BsYXkgc3RhdGlzdGljcyBhYm91dCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBsaW5rZXIsIHN1Y2gKK2FzIGV4ZWN1dGlvbiB0aW1lIGFuZCBtZW1vcnkgdXNhZ2UuCisKK0BraW5kZXggLS10cmFkaXRpb25hbC1mb3JtYXQKK0BjaW5kZXggdHJhZGl0aW9uYWwgZm9ybWF0CitAaXRlbSAtLXRyYWRpdGlvbmFsLWZvcm1hdAorRm9yIHNvbWUgdGFyZ2V0cywgdGhlIG91dHB1dCBvZiBAY29kZXtsZH0gaXMgZGlmZmVyZW50IGluIHNvbWUgd2F5cyBmcm9tCit0aGUgb3V0cHV0IG9mIHNvbWUgZXhpc3RpbmcgbGlua2VyLiAgVGhpcyBzd2l0Y2ggcmVxdWVzdHMgQGNvZGV7bGR9IHRvCit1c2UgdGhlIHRyYWRpdGlvbmFsIGZvcm1hdCBpbnN0ZWFkLgorCitAY2luZGV4IGRieAorRm9yIGV4YW1wbGUsIG9uIFN1bk9TLCBAY29kZXtsZH0gY29tYmluZXMgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlCitzeW1ib2wgc3RyaW5nIHRhYmxlLiAgVGhpcyBjYW4gcmVkdWNlIHRoZSBzaXplIG9mIGFuIG91dHB1dCBmaWxlIHdpdGgKK2Z1bGwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGJ5IG92ZXIgMzAgcGVyY2VudC4gIFVuZm9ydHVuYXRlbHksIHRoZSBTdW5PUworQGNvZGV7ZGJ4fSBwcm9ncmFtIGNhbiBub3QgcmVhZCB0aGUgcmVzdWx0aW5nIHByb2dyYW0gKEBjb2Rle2dkYn0gaGFzIG5vCit0cm91YmxlKS4gIFRoZSBAc2FtcHstLXRyYWRpdGlvbmFsLWZvcm1hdH0gc3dpdGNoIHRlbGxzIEBjb2Rle2xkfSB0byBub3QKK2NvbWJpbmUgZHVwbGljYXRlIGVudHJpZXMuCisKK0BraW5kZXggLVRic3MgQHZhcntvcmd9CitAa2luZGV4IC1UZGF0YSBAdmFye29yZ30KK0BraW5kZXggLVR0ZXh0IEB2YXJ7b3JnfQorQGNpbmRleCBzZWdtZW50IG9yaWdpbnMsIGNtZCBsaW5lCitAaXRlbSAtVGJzcyBAdmFye29yZ30KK0BpdGVteCAtVGRhdGEgQHZhcntvcmd9CitAaXRlbXggLVR0ZXh0IEB2YXJ7b3JnfQorVXNlIEB2YXJ7b3JnfSBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3ItLS1yZXNwZWN0aXZlbHktLS10aGUKK0Bjb2Rle2Jzc30sIEBjb2Rle2RhdGF9LCBvciB0aGUgQGNvZGV7dGV4dH0gc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCitAdmFye29yZ30gbXVzdCBiZSBhIHNpbmdsZSBoZXhhZGVjaW1hbCBpbnRlZ2VyOworZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLCB5b3UgbWF5IG9taXQgdGhlIGxlYWRpbmcKK0BzYW1wezB4fSB1c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCBoZXhhZGVjaW1hbCB2YWx1ZXMuCisKK0BraW5kZXggLS12ZXJib3NlCitAY2luZGV4IHZlcmJvc2UKK0BpdGVtIC0tZGxsLXZlcmJvc2UKK0BpdGVtIC0tdmVyYm9zZQorRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle2xkfSBhbmQgbGlzdCB0aGUgbGlua2VyIGVtdWxhdGlvbnMKK3N1cHBvcnRlZC4gIERpc3BsYXkgd2hpY2ggaW5wdXQgZmlsZXMgY2FuIGFuZCBjYW5ub3QgYmUgb3BlbmVkLiAgRGlzcGxheQordGhlIGxpbmtlciBzY3JpcHQgaWYgdXNpbmcgYSBkZWZhdWx0IGJ1aWx0aW4gc2NyaXB0LgorCitAa2luZGV4IC0tdmVyc2lvbi1zY3JpcHQ9QHZhcnt2ZXJzaW9uLXNjcmlwdGZpbGV9CitAY2luZGV4IHZlcnNpb24gc2NyaXB0LCBzeW1ib2wgdmVyc2lvbnMKK0BpdGVteCAtLXZlcnNpb24tc2NyaXB0PUB2YXJ7dmVyc2lvbi1zY3JpcHRmaWxlfQorU3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZlcnNpb24gc2NyaXB0IHRvIHRoZSBsaW5rZXIuICBUaGlzIGlzIHR5cGljYWxseQordXNlZCB3aGVuIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCithYm91dCB0aGUgdmVyc2lvbiBoZWlyYXJjaHkgZm9yIHRoZSBsaWJyYXJ5IGJlaW5nIGNyZWF0ZWQuICBUaGlzIG9wdGlvbgoraXMgb25seSBtZWFuaW5nZnVsIG9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgorQHhyZWZ7VkVSU0lPTn0uCisKK0BraW5kZXggLS13YXJuLWNvbW9uCitAY2luZGV4IHdhcm5pbmdzLCBvbiBjb21iaW5pbmcgc3ltYm9scworQGNpbmRleCBjb21iaW5pbmcgc3ltYm9scywgd2FybmluZ3Mgb24KK0BpdGVtIC0td2Fybi1jb21tb24KK1dhcm4gd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbW1vbiBzeW1ib2wgb3Igd2l0aAorYSBzeW1ib2wgZGVmaW5pdGlvbi4gIFVuaXggbGlua2VycyBhbGxvdyB0aGlzIHNvbWV3aGF0IHNsb3BweSBwcmFjdGljZSwKK2J1dCBsaW5rZXJzIG9uIHNvbWUgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgZG8gbm90LiAgVGhpcyBvcHRpb24gYWxsb3dzCit5b3UgdG8gZmluZCBwb3RlbnRpYWwgcHJvYmxlbXMgZnJvbSBjb21iaW5pbmcgZ2xvYmFsIHN5bWJvbHMuCitVbmZvcnR1bmF0ZWx5LCBzb21lIEMgbGlicmFyaWVzIHVzZSB0aGlzIHByYWN0aWNlLCBzbyB5b3UgbWF5IGdldCBzb21lCit3YXJuaW5ncyBhYm91dCBzeW1ib2xzIGluIHRoZSBsaWJyYXJpZXMgYXMgd2VsbCBhcyBpbiB5b3VyIHByb2dyYW1zLgorCitUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZ2xvYmFsIHN5bWJvbHMsIGlsbHVzdHJhdGVkIGhlcmUgYnkgQyBleGFtcGxlczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBpbnQgaSA9IDE7CitBIGRlZmluaXRpb24sIHdoaWNoIGdvZXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiB0aGUgb3V0cHV0CitmaWxlLgorCitAaXRlbSBleHRlcm4gaW50IGk7CitBbiB1bmRlZmluZWQgcmVmZXJlbmNlLCB3aGljaCBkb2VzIG5vdCBhbGxvY2F0ZSBzcGFjZS4KK1RoZXJlIG11c3QgYmUgZWl0aGVyIGEgZGVmaW5pdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wgZm9yIHRoZQordmFyaWFibGUgc29tZXdoZXJlLgorCitAaXRlbSBpbnQgaTsKK0EgY29tbW9uIHN5bWJvbC4gIElmIHRoZXJlIGFyZSBvbmx5IChvbmUgb3IgbW9yZSkgY29tbW9uIHN5bWJvbHMgZm9yIGEKK3ZhcmlhYmxlLCBpdCBnb2VzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBvZiB0aGUgb3V0cHV0IGZpbGUuCitUaGUgbGlua2VyIG1lcmdlcyBtdWx0aXBsZSBjb21tb24gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUgaW50byBhCitzaW5nbGUgc3ltYm9sLiAgSWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHNpemVzLCBpdCBwaWNrcyB0aGUgbGFyZ2VzdAorc2l6ZS4gIFRoZSBsaW5rZXIgdHVybnMgYSBjb21tb24gc3ltYm9sIGludG8gYSBkZWNsYXJhdGlvbiwgaWYgdGhlcmUgaXMKK2EgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZSB2YXJpYWJsZS4KK0BlbmQgdGFibGUKKworVGhlIEBzYW1wey0td2Fybi1jb21tb259IG9wdGlvbiBjYW4gcHJvZHVjZSBmaXZlIGtpbmRzIG9mIHdhcm5pbmdzLgorRWFjaCB3YXJuaW5nIGNvbnNpc3RzIG9mIGEgcGFpciBvZiBsaW5lczogdGhlIGZpcnN0IGRlc2NyaWJlcyB0aGUgc3ltYm9sCitqdXN0IGVuY291bnRlcmVkLCBhbmQgdGhlIHNlY29uZCBkZXNjcmliZXMgdGhlIHByZXZpb3VzIHN5bWJvbAorZW5jb3VudGVyZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAgT25lIG9yIGJvdGggb2YgdGhlIHR3byBzeW1ib2xzIHdpbGwgYmUKK2EgY29tbW9uIHN5bWJvbC4KKworQGVudW1lcmF0ZQorQGl0ZW0KK1R1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCitkZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sLgorQHNtYWxsZXhhbXBsZQorQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCisgICBvdmVycmlkZGVuIGJ5IGRlZmluaXRpb24KK0B2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGRlZmluZWQgaGVyZQorQGVuZCBzbWFsbGV4YW1wbGUKKworQGl0ZW0KK1R1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgYSBsYXRlciBkZWZpbml0aW9uIGZvcgordGhlIHN5bWJvbCBpcyBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGNhc2UsCitleGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUgZW5jb3VudGVyZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCitAc21hbGxleGFtcGxlCitAdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGBAdmFye3N5bWJvbH0nCisgICBvdmVycmlkaW5nIGNvbW1vbgorQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIGlzIGhlcmUKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtCitNZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgc2FtZS1zaXplZCBjb21tb24gc3ltYm9sLgorQHNtYWxsZXhhbXBsZQorQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbXVsdGlwbGUgY29tbW9uCisgICBvZiBgQHZhcntzeW1ib2x9JworQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmUKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtCitNZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgbGFyZ2VyIGNvbW1vbiBzeW1ib2wuCitAc21hbGxleGFtcGxlCitAdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gb2YgYEB2YXJ7c3ltYm9sfScKKyAgIG92ZXJyaWRkZW4gYnkgbGFyZ2VyIGNvbW1vbgorQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlCitAZW5kIHNtYWxsZXhhbXBsZQorCitAaXRlbQorTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIHNtYWxsZXIgY29tbW9uIHN5bWJvbC4gIFRoaXMgaXMKK3RoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjYXNlLCBleGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUKK2VuY291bnRlcmVkIGluIGEgZGlmZmVyZW50IG9yZGVyLgorQHNtYWxsZXhhbXBsZQorQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCisgICBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uCitAdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlCitAZW5kIHNtYWxsZXhhbXBsZQorQGVuZCBlbnVtZXJhdGUKKworQGtpbmRleCAtLXdhcm4tY29uc3RydWN0b3JzCitAaXRlbSAtLXdhcm4tY29uc3RydWN0b3JzCitXYXJuIGlmIGFueSBnbG9iYWwgY29uc3RydWN0b3JzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgYSBmZXcKK29iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZm9ybWF0cyBsaWtlIENPRkYgb3IgRUxGLCB0aGUgbGlua2VyIGNhbiBub3QKK2RldGVjdCB0aGUgdXNlIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMuCisKK0BraW5kZXggLS13YXJuLW11bHRpcGxlLWdwCitAaXRlbSAtLXdhcm4tbXVsdGlwbGUtZ3AKK1dhcm4gaWYgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWVzIGFyZSByZXF1aXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCitUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgY2VydGFpbiBwcm9jZXNzb3JzLCBzdWNoIGFzIHRoZSBBbHBoYS4KK1NwZWNpZmljYWxseSwgc29tZSBwcm9jZXNzb3JzIHB1dCBsYXJnZS12YWx1ZWQgY29uc3RhbnRzIGluIGEgc3BlY2lhbAorc2VjdGlvbi4gIEEgc3BlY2lhbCByZWdpc3RlciAodGhlIGdsb2JhbCBwb2ludGVyKSBwb2ludHMgaW50byB0aGUgbWlkZGxlCitvZiB0aGlzIHNlY3Rpb24sIHNvIHRoYXQgY29uc3RhbnRzIGNhbiBiZSBsb2FkZWQgZWZmaWNpZW50bHkgdmlhIGEKK2Jhc2UtcmVnaXN0ZXIgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlLiAgU2luY2UgdGhlIG9mZnNldCBpbgorYmFzZS1yZWdpc3RlciByZWxhdGl2ZSBtb2RlIGlzIGZpeGVkIGFuZCByZWxhdGl2ZWx5IHNtYWxsIChlLmcuLCAxNgorYml0cyksIHRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbnN0YW50IHBvb2wuICBUaHVzLCBpbgorbGFyZ2UgcHJvZ3JhbXMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB1c2UgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIKK3ZhbHVlcyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGFkZHJlc3MgYWxsIHBvc3NpYmxlIGNvbnN0YW50cy4gIFRoaXMKK29wdGlvbiBjYXVzZXMgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZCB3aGVuZXZlciB0aGlzIGNhc2Ugb2NjdXJzLgorCitAa2luZGV4IC0td2Fybi1vbmNlCitAY2luZGV4IHdhcm5pbmdzLCBvbiB1bmRlZmluZWQgc3ltYm9scworQGNpbmRleCB1bmRlZmluZWQgc3ltYm9scywgd2FybmluZ3Mgb24KK0BpdGVtIC0td2Fybi1vbmNlCitPbmx5IHdhcm4gb25jZSBmb3IgZWFjaCB1bmRlZmluZWQgc3ltYm9sLCByYXRoZXIgdGhhbiBvbmNlIHBlciBtb2R1bGUKK3doaWNoIHJlZmVycyB0byBpdC4KKworQGtpbmRleCAtLXdhcm4tc2VjdGlvbi1hbGlnbgorQGNpbmRleCB3YXJuaW5ncywgb24gc2VjdGlvbiBhbGlnbm1lbnQKK0BjaW5kZXggc2VjdGlvbiBhbGlnbm1lbnQsIHdhcm5pbmdzIG9uCitAaXRlbSAtLXdhcm4tc2VjdGlvbi1hbGlnbgorV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKK2FsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgorVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0CitpcywgaWYgdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGRvZXMgbm90IHNwZWNpZnkgYSBzdGFydCBhZGRyZXNzIGZvcgordGhlIHNlY3Rpb24gKEBweHJlZntTRUNUSU9OU30pLgorCitAa2luZGV4IC0td2hvbGUtYXJjaGl2ZQorQGNpbmRleCBpbmNsdWRpbmcgYW4gZW50aXJlIGFyY2hpdmUKK0BpdGVtIC0td2hvbGUtYXJjaGl2ZQorRm9yIGVhY2ggYXJjaGl2ZSBtZW50aW9uZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUKK0Bjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uLCBpbmNsdWRlIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBhcmNoaXZlCitpbiB0aGUgbGluaywgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRoZSBhcmNoaXZlIGZvciB0aGUgcmVxdWlyZWQgb2JqZWN0CitmaWxlcy4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB0byB0dXJuIGFuIGFyY2hpdmUgZmlsZSBpbnRvIGEgc2hhcmVkCitsaWJyYXJ5LCBmb3JjaW5nIGV2ZXJ5IG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNoYXJlZAorbGlicmFyeS4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlLgorCitAa2luZGV4IC0td3JhcAorQGl0ZW0gLS13cmFwIEB2YXJ7c3ltYm9sfQorVXNlIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgQHZhcntzeW1ib2x9LiAgQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KK0B2YXJ7c3ltYm9sfSB3aWxsIGJlIHJlc29sdmVkIHRvIEBjb2Rle19fd3JhcF9AdmFye3N5bWJvbH19LiAgQW55Cit1bmRlZmluZWQgcmVmZXJlbmNlIHRvIEBjb2Rle19fcmVhbF9AdmFye3N5bWJvbH19IHdpbGwgYmUgcmVzb2x2ZWQgdG8KK0B2YXJ7c3ltYm9sfS4KKworVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgd3JhcHBlciBmb3IgYSBzeXN0ZW0gZnVuY3Rpb24uICBUaGUKK3dyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBAY29kZXtfX3dyYXBfQHZhcntzeW1ib2x9fS4gIElmIGl0Cit3aXNoZXMgdG8gY2FsbCB0aGUgc3lzdGVtIGZ1bmN0aW9uLCBpdCBzaG91bGQgY2FsbAorQGNvZGV7X19yZWFsX0B2YXJ7c3ltYm9sfX0uCisKK0hlcmUgaXMgYSB0cml2aWFsIGV4YW1wbGU6CisKK0BzbWFsbGV4YW1wbGUKK3ZvaWQgKgorX193cmFwX21hbGxvYyAoaW50IGMpCitAeworICBwcmludGYgKCJtYWxsb2MgY2FsbGVkIHdpdGggJWxkXG4iLCBjKTsKKyAgcmV0dXJuIF9fcmVhbF9tYWxsb2MgKGMpOworQH0KK0BlbmQgc21hbGxleGFtcGxlCisKK0lmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGlzIGZpbGUgdXNpbmcgQGNvZGV7LS13cmFwIG1hbGxvY30sIHRoZW4KK2FsbCBjYWxscyB0byBAY29kZXttYWxsb2N9IHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24gQGNvZGV7X193cmFwX21hbGxvY30KK2luc3RlYWQuICBUaGUgY2FsbCB0byBAY29kZXtfX3JlYWxfbWFsbG9jfSBpbiBAY29kZXtfX3dyYXBfbWFsbG9jfSB3aWxsCitjYWxsIHRoZSByZWFsIEBjb2Rle21hbGxvY30gZnVuY3Rpb24uCisKK1lvdSBtYXkgd2lzaCB0byBwcm92aWRlIGEgQGNvZGV7X19yZWFsX21hbGxvY30gZnVuY3Rpb24gYXMgd2VsbCwgc28gdGhhdAorbGlua3Mgd2l0aG91dCB0aGUgQGNvZGV7LS13cmFwfSBvcHRpb24gd2lsbCBzdWNjZWVkLiAgSWYgeW91IGRvIHRoaXMsCit5b3Ugc2hvdWxkIG5vdCBwdXQgdGhlIGRlZmluaXRpb24gb2YgQGNvZGV7X19yZWFsX21hbGxvY30gaW4gdGhlIHNhbWUKK2ZpbGUgYXMgQGNvZGV7X193cmFwX21hbGxvY307IGlmIHlvdSBkbywgdGhlIGFzc2VtYmxlciBtYXkgcmVzb2x2ZSB0aGUKK2NhbGwgYmVmb3JlIHRoZSBsaW5rZXIgaGFzIGEgY2hhbmNlIHRvIHdyYXAgaXQgdG8gQGNvZGV7bWFsbG9jfS4KKworQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBPcHRpb25zIHNwZWNpZmljIHRvIGkzODYgUEUgdGFyZ2V0cworCitUaGUgaTM4NiBQRSBsaW5rZXIgc3VwcG9ydHMgdGhlIEBjb2Rley1zaGFyZWR9IG9wdGlvbiwgd2hpY2ggY2F1c2VzCit0aGUgb3V0cHV0IHRvIGJlIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKERMTCkgaW5zdGVhZCBvZiBhCitub3JtYWwgZXhlY3V0YWJsZS4gIFlvdSBzaG91bGQgbmFtZSB0aGUgb3V0cHV0IEBjb2RleyouZGxsfSB3aGVuIHlvdQordXNlIHRoaXMgb3B0aW9uLiAgSW4gYWRkaXRpb24sIHRoZSBsaW5rZXIgZnVsbHkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkCitAY29kZXsqLmRlZn0gZmlsZXMsIHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGxpbmtlciBjb21tYW5kIGxpbmUKK2xpa2UgYW4gb2JqZWN0IGZpbGUgKGluIGZhY3QsIGl0IHNob3VsZCBwcmVjZWRlIGFyY2hpdmVzIGl0IGV4cG9ydHMKK3N5bWJvbHMgZnJvbSwgdG8gZW5zdXJlIHRoYXQgdGhleSBnZXQgbGlua2VkIGluLCBqdXN0IGxpa2UgYSBub3JtYWwKK29iamVjdCBmaWxlKS4KKworSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgY29tbW9uIHRvIGFsbCB0YXJnZXRzLCB0aGUgaTM4NiBQRSBsaW5rZXIKK3N1cHBvcnQgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgaTM4NgorUEUgdGFyZ2V0LiAgT3B0aW9ucyB0aGF0IHRha2UgdmFsdWVzIG1heSBiZSBzZXBhcmF0ZWQgZnJvbSB0aGVpcgordmFsdWVzIGJ5IGVpdGhlciBhIHNwYWNlIG9yIGFuIGVxdWFscyBzaWduLgorCitAdGFibGUgQGNvZGUKKworQGtpbmRleCAtLWFkZC1zdGRjYWxsLWFsaWFzCitAaXRlbSAtLWFkZC1zdGRjYWxsLWFsaWFzCitJZiBnaXZlbiwgc3ltYm9scyB3aXRoIGEgc3RkY2FsbCBzdWZmaXggKEBAQHZhcntubn0pIHdpbGwgYmUgZXhwb3J0ZWQKK2FzLWlzIGFuZCBhbHNvIHdpdGggdGhlIHN1ZmZpeCBzdHJpcHBlZC4KKworQGtpbmRleCAtLWJhc2UtZmlsZQorQGl0ZW0gLS1iYXNlLWZpbGUgQHZhcntmaWxlfQorVXNlIEB2YXJ7ZmlsZX0gYXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIGJhc2UKK2FkZHJlc3NlcyBvZiBhbGwgdGhlIHJlbG9jYXRpb25zIG5lZWRlZCBmb3IgZ2VuZXJhdGluZyBETExzIHdpdGgKK0BmaWxle2RsbHRvb2x9LgorCitAa2luZGV4IC0tZGxsCitAaXRlbSAtLWRsbAorQ3JlYXRlIGEgRExMIGluc3RlYWQgb2YgYSByZWd1bGFyIGV4ZWN1dGFibGUuICBZb3UgbWF5IGFsc28gdXNlCitAY29kZXstc2hhcmVkfSBvciBzcGVjaWZ5IGEgQGNvZGV7TElCUkFSWX0gaW4gYSBnaXZlbiBAY29kZXsuZGVmfQorZmlsZS4KKworQGtpbmRleCAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCitAa2luZGV4IC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwCitAaXRlbSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCitAaXRlbXggLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAKK0lmIHRoZSBsaW5rIGZpbmRzIGEgc3ltYm9sIHRoYXQgaXQgY2Fubm90IHJlc29sdmUsIGl0IHdpbGwgYXR0ZW1wdCB0bworZG8gImZ1enp5IGxpbmtpbmciIGJ5IGxvb2tpbmcgZm9yIGFub3RoZXIgZGVmaW5lZCBzeW1ib2wgdGhhdCBkaWZmZXJzCitvbmx5IGluIHRoZSBmb3JtYXQgb2YgdGhlIHN5bWJvbCBuYW1lIChjZGVjbCB2cyBzdGRjYWxsKSBhbmQgd2lsbAorcmVzb2x2ZSB0aGF0IHN5bWJvbCBieSBsaW5raW5nIHRvIHRoZSBtYXRjaC4gIEZvciBleGFtcGxlLCB0aGUKK3VuZGVmaW5lZCBzeW1ib2wgQGNvZGV7X2Zvb30gbWlnaHQgYmUgbGlua2VkIHRvIHRoZSBmdW5jdGlvbgorQGNvZGV7X2Zvb0BAMTJ9LCBvciB0aGUgdW5kZWZpbmVkIHN5bWJvbCBAY29kZXtfYmFyQEAxNn0gbWlnaHQgYmUgbGlua2VkCit0byB0aGUgZnVuY3Rpb24gQGNvZGV7X2Jhcn0uICBXaGVuIHRoZSBsaW5rZXIgZG9lcyB0aGlzLCBpdCBwcmludHMgYQord2FybmluZywgc2luY2UgaXQgbm9ybWFsbHkgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGxpbmssIGJ1dCBzb21ldGltZXMKK2ltcG9ydCBsaWJyYXJpZXMgZ2VuZXJhdGVkIGZyb20gdGhpcmQtcGFydHkgZGxscyBtYXkgbmVlZCB0aGlzIGZlYXR1cmUKK3RvIGJlIHVzYWJsZS4gIElmIHlvdSBzcGVjaWZ5IEBjb2Rley0tZW5hYmxlLXN0ZGNhbGwtZml4dXB9LCB0aGlzCitmZWF0dXJlIGlzIGZ1bGx5IGVuYWJsZWQgYW5kIHdhcm5pbmdzIGFyZSBub3QgcHJpbnRlZC4gIElmIHlvdSBzcGVjaWZ5CitAY29kZXstLWRpc2FibGUtc3RkY2FsbC1maXh1cH0sIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBhbmQgc3VjaAorbWlzbWF0Y2hlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBlcnJvcnMuCisKK0BjaW5kZXggRExMcywgY3JlYXRpbmcKK0BraW5kZXggLS1leHBvcnQtYWxsLXN5bWJvbHMKK0BpdGVtIC0tZXhwb3J0LWFsbC1zeW1ib2xzCitJZiBnaXZlbiwgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBvYmplY3RzIHVzZWQgdG8gYnVpbGQgYSBETEwgd2lsbAorYmUgZXhwb3J0ZWQgYnkgdGhlIERMTC4gIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZXJlCitvdGhlcndpc2Ugd291bGRuJ3QgYmUgYW55IGV4cG9ydGVkIHN5bWJvbHMuICBXaGVuIHN5bWJvbHMgYXJlCitleHBsaWNpdGx5IGV4cG9ydGVkIHZpYSBERUYgZmlsZXMgb3IgaW1wbGljaXRseSBleHBvcnRlZCB2aWEgZnVuY3Rpb24KK2F0dHJpYnV0ZXMsIHRoZSBkZWZhdWx0IGlzIHRvIG5vdCBleHBvcnQgYW55dGhpbmcgZWxzZSB1bmxlc3MgdGhpcworb3B0aW9uIGlzIGdpdmVuLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIEBjb2Rle0RsbE1haW5AQDEyfSwKK0Bjb2Rle0RsbEVudHJ5UG9pbnRAQDB9LCBhbmQgQGNvZGV7aW1wdXJlX3B0cn0gd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQorZXhwb3J0ZWQuCisKK0BraW5kZXggLS1leGNsdWRlLXN5bWJvbHMKK0BpdGVtIC0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7c3ltYm9sLHN5bWJvbCwuLi59CitTcGVjaWZpZXMgYSBsaXN0IG9mIHN5bWJvbHMgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5CitleHBvcnRlZC4gIFRoZSBzeW1ib2wgbmFtZXMgbWF5IGJlIGRlbGltaXRlZCBieSBjb21tYXMgb3IgY29sb25zLgorCitAa2luZGV4IC0tZmlsZS1hbGlnbm1lbnQKK0BpdGVtIC0tZmlsZS1hbGlnbm1lbnQKK1NwZWNpZnkgdGhlIGZpbGUgYWxpZ25tZW50LiAgU2VjdGlvbnMgaW4gdGhlIGZpbGUgd2lsbCBhbHdheXMgYmVnaW4gYXQKK2ZpbGUgb2Zmc2V0cyB3aGljaCBhcmUgbXVsdGlwbGVzIG9mIHRoaXMgbnVtYmVyLiAgVGhpcyBkZWZhdWx0cyB0bworNTEyLgorCitAY2luZGV4IGhlYXAgc2l6ZQorQGtpbmRleCAtLWhlYXAKK0BpdGVtIC0taGVhcCBAdmFye3Jlc2VydmV9CitAaXRlbXggLS1oZWFwIEB2YXJ7cmVzZXJ2ZX0sQHZhcntjb21taXR9CitTcGVjaWZ5IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgKGFuZCBvcHRpb25hbGx5IGNvbW1pdCkgdG8gYmUKK3VzZWQgYXMgaGVhcCBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIGRlZmF1bHQgaXMgMU1iIHJlc2VydmVkLCA0SworY29tbWl0dGVkLgorCitAY2luZGV4IGltYWdlIGJhc2UKK0BraW5kZXggLS1pbWFnZS1iYXNlCitAaXRlbSAtLWltYWdlLWJhc2UgQHZhcnt2YWx1ZX0KK1VzZSBAdmFye3ZhbHVlfSBhcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHlvdXIgcHJvZ3JhbSBvciBkbGwuICBUaGlzIGlzCit0aGUgbG93ZXN0IG1lbW9yeSBsb2NhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdXIgcHJvZ3JhbSBvciBkbGwKK2lzIGxvYWRlZC4gIFRvIHJlZHVjZSB0aGUgbmVlZCB0byByZWxvY2F0ZSBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZgoreW91ciBkbGxzLCBlYWNoIHNob3VsZCBoYXZlIGEgdW5pcXVlIGJhc2UgYWRkcmVzcyBhbmQgbm90IG92ZXJsYXAgYW55CitvdGhlciBkbGxzLiAgVGhlIGRlZmF1bHQgaXMgMHg0MDAwMDAgZm9yIGV4ZWN1dGFibGVzLCBhbmQgMHgxMDAwMDAwMAorZm9yIGRsbHMuCisKK0BraW5kZXggLS1raWxsLWF0CitAaXRlbSAtLWtpbGwtYXQKK0lmIGdpdmVuLCB0aGUgc3RkY2FsbCBzdWZmaXhlcyAoQEBAdmFye25ufSkgd2lsbCBiZSBzdHJpcHBlZCBmcm9tCitzeW1ib2xzIGJlZm9yZSB0aGV5IGFyZSBleHBvcnRlZC4KKworQGtpbmRleCAtLW1ham9yLWltYWdlLXZlcnNpb24KK0BpdGVtIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQorU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAxLgorCitAa2luZGV4IC0tbWFqb3Itb3MtdmVyc2lvbgorQGl0ZW0gLS1tYWpvci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9CitTZXRzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDQuCisKK0BraW5kZXggLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbgorQGl0ZW0gLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQorU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gNC4KKworQGtpbmRleCAtLW1pbm9yLWltYWdlLXZlcnNpb24KK0BpdGVtIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQorU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgorCitAa2luZGV4IC0tbWlub3Itb3MtdmVyc2lvbgorQGl0ZW0gLS1taW5vci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9CitTZXRzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCisKK0BraW5kZXggLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbgorQGl0ZW0gLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQorU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KKworQGNpbmRleCBERUYgZmlsZXMsIGNyZWF0aW5nCitAY2luZGV4IERMTHMsIGNyZWF0aW5nCitAa2luZGV4IC0tb3V0cHV0LWRlZgorQGl0ZW0gLS1vdXRwdXQtZGVmIEB2YXJ7ZmlsZX0KK1RoZSBsaW5rZXIgd2lsbCBjcmVhdGUgdGhlIGZpbGUgQHZhcntmaWxlfSB3aGljaCB3aWxsIGNvbnRhaW4gYSBERUYKK2ZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgRExMIHRoZSBsaW5rZXIgaXMgZ2VuZXJhdGluZy4gIFRoaXMgREVGIGZpbGUKKyh3aGljaCBzaG91bGQgYmUgY2FsbGVkIEBjb2RleyouZGVmfSkgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGFuIGltcG9ydAorbGlicmFyeSB3aXRoIEBjb2Rle2RsbHRvb2x9IG9yIG1heSBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvCithdXRvbWF0aWNhbGx5IG9yIGltcGxpY2l0bHkgZXhwb3J0ZWQgc3ltYm9scy4KKworQGtpbmRleCAtLXNlY3Rpb24tYWxpZ25tZW50CitAaXRlbSAtLXNlY3Rpb24tYWxpZ25tZW50CitTZXRzIHRoZSBzZWN0aW9uIGFsaWdubWVudC4gIFNlY3Rpb25zIGluIG1lbW9yeSB3aWxsIGFsd2F5cyBiZWdpbiBhdAorYWRkcmVzc2VzIHdoaWNoIGFyZSBhIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLiAgRGVmYXVsdHMgdG8gMHgxMDAwLgorCitAY2luZGV4IHN0YWNrIHNpemUKK0BraW5kZXggLS1zdGFjaworQGl0ZW0gLS1zdGFjayBAdmFye3Jlc2VydmV9CitAaXRlbXggLS1zdGFjayBAdmFye3Jlc2VydmV9LEB2YXJ7Y29tbWl0fQorU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIChhbmQgb3B0aW9uYWxseSBjb21taXQpIHRvIGJlCit1c2VkIGFzIHN0YWNrIGZvciB0aGlzIHByb2dyYW0uICBUaGUgZGVmYXVsdCBpcyAzMk1iIHJlc2VydmVkLCA0SworY29tbWl0dGVkLgorCitAa2luZGV4IC0tc3Vic3lzdGVtCitAaXRlbSAtLXN1YnN5c3RlbSBAdmFye3doaWNofQorQGl0ZW14IC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9OkB2YXJ7bWFqb3J9CitAaXRlbXggLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH06QHZhcnttYWpvcn0uQHZhcnttaW5vcn0KK1NwZWNpZmllcyB0aGUgc3Vic3lzdGVtIHVuZGVyIHdoaWNoIHlvdXIgcHJvZ3JhbSB3aWxsIGV4ZWN1dGUuICBUaGUKK2xlZ2FsIHZhbHVlcyBmb3IgQHZhcnt3aGljaH0gYXJlIEBjb2Rle25hdGl2ZX0sIEBjb2Rle3dpbmRvd3N9LAorQGNvZGV7Y29uc29sZX0sIGFuZCBAY29kZXtwb3NpeH0uICBZb3UgbWF5IG9wdGlvbmFsbHkgc2V0IHRoZQorc3Vic3lzdGVtIHZlcnNpb24gYWxzby4KKworQGVuZCB0YWJsZQorCitAaWZzZXQgVXNlc0VudlZhcnMKK0Bub2RlIEVudmlyb25tZW50CitAc2VjdGlvbiBFbnZpcm9ubWVudCBWYXJpYWJsZXMKKworWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIEBjb2Rle2xkfSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK0Bjb2Rle0dOVVRBUkdFVH0sIEBjb2Rle0xERU1VTEFUSU9OfSwgYW5kIEBjb2Rle0NPTExFQ1RfTk9fREVNQU5HTEV9LgorCitAa2luZGV4IEdOVVRBUkdFVAorQGNpbmRleCBkZWZhdWx0IGlucHV0IGZvcm1hdAorQGNvZGV7R05VVEFSR0VUfSBkZXRlcm1pbmVzIHRoZSBpbnB1dC1maWxlIG9iamVjdCBmb3JtYXQgaWYgeW91IGRvbid0Cit1c2UgQHNhbXB7LWJ9IChvciBpdHMgc3lub255bSBAc2FtcHstLWZvcm1hdH0pLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKK29mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdCAoQHB4cmVme0JGRH0pLiAgSWYgdGhlcmUgaXMgbm8KK0Bjb2Rle0dOVVRBUkdFVH0gaW4gdGhlIGVudmlyb25tZW50LCBAY29kZXtsZH0gdXNlcyB0aGUgbmF0dXJhbCBmb3JtYXQKK29mIHRoZSB0YXJnZXQuIElmIEBjb2Rle0dOVVRBUkdFVH0gaXMgc2V0IHRvIEBjb2Rle2RlZmF1bHR9IHRoZW4gQkZECithdHRlbXB0cyB0byBkaXNjb3ZlciB0aGUgaW5wdXQgZm9ybWF0IGJ5IGV4YW1pbmluZyBiaW5hcnkgaW5wdXQgZmlsZXM7Cit0aGlzIG1ldGhvZCBvZnRlbiBzdWNjZWVkcywgYnV0IHRoZXJlIGFyZSBwb3RlbnRpYWwgYW1iaWd1aXRpZXMsIHNpbmNlCit0aGVyZSBpcyBubyBtZXRob2Qgb2YgZW5zdXJpbmcgdGhhdCB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gc3BlY2lmeQorb2JqZWN0LWZpbGUgZm9ybWF0cyBpcyB1bmlxdWUuICBIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmUgZm9yCitCRkQgb24gZWFjaCBzeXN0ZW0gcGxhY2VzIHRoZSBjb252ZW50aW9uYWwgZm9ybWF0IGZvciB0aGF0IHN5c3RlbSBmaXJzdAoraW4gdGhlIHNlYXJjaC1saXN0LCBzbyBhbWJpZ3VpdGllcyBhcmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY29udmVudGlvbi4KKworQGtpbmRleCBMREVNVUxBVElPTgorQGNpbmRleCBkZWZhdWx0IGVtdWxhdGlvbgorQGNpbmRleCBlbXVsYXRpb24sIGRlZmF1bHQKK0Bjb2Rle0xERU1VTEFUSU9OfSBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZQorQHNhbXB7LW19IG9wdGlvbi4gIFRoZSBlbXVsYXRpb24gY2FuIGFmZmVjdCB2YXJpb3VzIGFzcGVjdHMgb2YgbGlua2VyCitiZWhhdmlvdXIsIHBhcnRpY3VsYXJseSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgWW91IGNhbiBsaXN0IHRoZQorYXZhaWxhYmxlIGVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4gIElmCit0aGUgQHNhbXB7LW19IG9wdGlvbiBpcyBub3QgdXNlZCwgYW5kIHRoZSBAY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQKK3ZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUKK2xpbmtlciB3YXMgY29uZmlndXJlZC4KK0BlbmQgaWZzZXQKKworQGtpbmRleCBDT0xMRUNUX05PX0RFTUFOR0xFCitAY2luZGV4IGRlbWFuZ2xpbmcsIGRlZmF1bHQKK05vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgZGVmYXVsdCB0byBkZW1hbmdsaW5nIHN5bWJvbHMuICBIb3dldmVyLCBpZgorQGNvZGV7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgdGhlbiBpdCB3aWxsCitkZWZhdWx0IHRvIG5vdCBkZW1hbmdsaW5nIHN5bWJvbHMuICBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgaW4KK2Egc2ltaWxhciBmYXNoaW9uIGJ5IHRoZSBAY29kZXtnY2N9IGxpbmtlciB3cmFwcGVyIHByb2dyYW0uICBUaGUgZGVmYXVsdAorbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIEBzYW1wey0tZGVtYW5nbGV9IGFuZCBAc2FtcHstLW5vLWRlbWFuZ2xlfQorb3B0aW9ucy4KKworQG5vZGUgU2NyaXB0cworQGNoYXB0ZXIgTGlua2VyIFNjcmlwdHMKKworQGNpbmRleCBzY3JpcHRzCitAY2luZGV4IGxpbmtlciBzY3JpcHRzCitAY2luZGV4IGNvbW1hbmQgZmlsZXMKK0V2ZXJ5IGxpbmsgaXMgY29udHJvbGxlZCBieSBhIEBkZm57bGlua2VyIHNjcmlwdH0uICBUaGlzIHNjcmlwdCBpcword3JpdHRlbiBpbiB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuCisKK1RoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gZGVzY3JpYmUgaG93IHRoZSBzZWN0aW9ucyBpbgordGhlIGlucHV0IGZpbGVzIHNob3VsZCBiZSBtYXBwZWQgaW50byB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBjb250cm9sCit0aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuICBNb3N0IGxpbmtlciBzY3JpcHRzIGRvIG5vdGhpbmcKK21vcmUgdGhhbiB0aGlzLiAgSG93ZXZlciwgd2hlbiBuZWNlc3NhcnksIHRoZSBsaW5rZXIgc2NyaXB0IGNhbiBhbHNvCitkaXJlY3QgdGhlIGxpbmtlciB0byBwZXJmb3JtIG1hbnkgb3RoZXIgb3BlcmF0aW9ucywgdXNpbmcgdGhlIGNvbW1hbmRzCitkZXNjcmliZWQgYmVsb3cuCisKK1RoZSBsaW5rZXIgYWx3YXlzIHVzZXMgYSBsaW5rZXIgc2NyaXB0LiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgb25lCit5b3Vyc2VsZiwgdGhlIGxpbmtlciB3aWxsIHVzZSBhIGRlZmF1bHQgc2NyaXB0IHRoYXQgaXMgY29tcGlsZWQgaW50byB0aGUKK2xpbmtlciBleGVjdXRhYmxlLiAgWW91IGNhbiB1c2UgdGhlIEBzYW1wey0tdmVyYm9zZX0gY29tbWFuZCBsaW5lIG9wdGlvbgordG8gZGlzcGxheSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQ2VydGFpbiBjb21tYW5kIGxpbmUgb3B0aW9ucywKK3N1Y2ggYXMgQHNhbXB7LXJ9IG9yIEBzYW1wey1OfSwgd2lsbCBhZmZlY3QgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KKworWW91IG1heSBzdXBwbHkgeW91ciBvd24gbGlua2VyIHNjcmlwdCBieSB1c2luZyB0aGUgQHNhbXB7LVR9IGNvbW1hbmQKK2xpbmUgb3B0aW9uLiAgV2hlbiB5b3UgZG8gdGhpcywgeW91ciBsaW5rZXIgc2NyaXB0IHdpbGwgcmVwbGFjZSB0aGUKK2RlZmF1bHQgbGlua2VyIHNjcmlwdC4KKworWW91IG1heSBhbHNvIHVzZSBsaW5rZXIgc2NyaXB0cyBpbXBsaWNpdGx5IGJ5IG5hbWluZyB0aGVtIGFzIGlucHV0IGZpbGVzCit0byB0aGUgbGlua2VyLCBhcyB0aG91Z2ggdGhleSB3ZXJlIGZpbGVzIHRvIGJlIGxpbmtlZC4gIEB4cmVme0ltcGxpY2l0CitMaW5rZXIgU2NyaXB0c30uCisKK0BtZW51CisqIEJhc2ljIFNjcmlwdCBDb25jZXB0czo6CUJhc2ljIExpbmtlciBTY3JpcHQgQ29uY2VwdHMKKyogU2NyaXB0IEZvcm1hdDo6CQlMaW5rZXIgU2NyaXB0IEZvcm1hdAorKiBTaW1wbGUgRXhhbXBsZTo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCisqIFNpbXBsZSBDb21tYW5kczo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBDb21tYW5kcworKiBBc3NpZ25tZW50czo6CQkJQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCisqIFNFQ1RJT05TOjoJCQlTRUNUSU9OUyBDb21tYW5kCisqIE1FTU9SWTo6CQkJTUVNT1JZIENvbW1hbmQKKyogUEhEUlM6OgkJCVBIRFJTIENvbW1hbmQKKyogVkVSU0lPTjo6CQkJVkVSU0lPTiBDb21tYW5kCisqIEV4cHJlc3Npb25zOjoJCQlFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cworKiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0czo6CUltcGxpY2l0IExpbmtlciBTY3JpcHRzCitAZW5kIG1lbnUKKworQG5vZGUgQmFzaWMgU2NyaXB0IENvbmNlcHRzCitAc2VjdGlvbiBCYXNpYyBMaW5rZXIgU2NyaXB0IENvbmNlcHRzCitAY2luZGV4IGxpbmtlciBzY3JpcHQgY29uY2VwdHMKK1dlIG5lZWQgdG8gZGVmaW5lIHNvbWUgYmFzaWMgY29uY2VwdHMgYW5kIHZvY2FidWxhcnkgaW4gb3JkZXIgdG8KK2Rlc2NyaWJlIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgorCitUaGUgbGlua2VyIGNvbWJpbmVzIGlucHV0IGZpbGVzIGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuICBUaGUgb3V0cHV0CitmaWxlIGFuZCBlYWNoIGlucHV0IGZpbGUgYXJlIGluIGEgc3BlY2lhbCBkYXRhIGZvcm1hdCBrbm93biBhcyBhbgorQGRmbntvYmplY3QgZmlsZSBmb3JtYXR9LiAgRWFjaCBmaWxlIGlzIGNhbGxlZCBhbiBAZGZue29iamVjdCBmaWxlfS4KK1RoZSBvdXRwdXQgZmlsZSBpcyBvZnRlbiBjYWxsZWQgYW4gQGRmbntleGVjdXRhYmxlfSwgYnV0IGZvciBvdXIKK3B1cnBvc2VzIHdlIHdpbGwgYWxzbyBjYWxsIGl0IGFuIG9iamVjdCBmaWxlLiAgRWFjaCBvYmplY3QgZmlsZSBoYXMsCithbW9uZyBvdGhlciB0aGluZ3MsIGEgbGlzdCBvZiBAZGZue3NlY3Rpb25zfS4gIFdlIHNvbWV0aW1lcyByZWZlciB0byBhCitzZWN0aW9uIGluIGFuIGlucHV0IGZpbGUgYXMgYW4gQGRmbntpbnB1dCBzZWN0aW9ufTsgc2ltaWxhcmx5LCBhIHNlY3Rpb24KK2luIHRoZSBvdXRwdXQgZmlsZSBpcyBhbiBAZGZue291dHB1dCBzZWN0aW9ufS4KKworRWFjaCBzZWN0aW9uIGluIGFuIG9iamVjdCBmaWxlIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMKK2Fsc28gaGF2ZSBhbiBhc3NvY2lhdGVkIGJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBAZGZue3NlY3Rpb24KK2NvbnRlbnRzfS4gIEEgc2VjdGlvbiBtYXkgYmUgbWFya2VkIGFzIEBkZm57bG9hZGFibGV9LCB3aGljaCBtZWFuIHRoYXQKK3RoZSBjb250ZW50cyBzaG91bGQgYmUgbG9hZGVkIGludG8gbWVtb3J5IHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4KK0Egc2VjdGlvbiB3aXRoIG5vIGNvbnRlbnRzIG1heSBiZSBAZGZue2FsbG9jYXRhYmxlfSwgd2hpY2ggbWVhbnMgdGhhdCBhbgorYXJlYSBpbiBtZW1vcnkgc2hvdWxkIGJlIHNldCBhc2lkZSwgYnV0IG5vdGhpbmcgaW4gcGFydGljdWxhciBzaG91bGQgYmUKK2xvYWRlZCB0aGVyZSAoaW4gc29tZSBjYXNlcyB0aGlzIG1lbW9yeSBtdXN0IGJlIHplcm9lZCBvdXQpLiAgQSBzZWN0aW9uCit3aGljaCBpcyBuZWl0aGVyIGxvYWRhYmxlIG5vciBhbGxvY2F0YWJsZSB0eXBpY2FsbHkgY29udGFpbnMgc29tZSBzb3J0CitvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisKK0V2ZXJ5IGxvYWRhYmxlIG9yIGFsbG9jYXRhYmxlIG91dHB1dCBzZWN0aW9uIGhhcyB0d28gYWRkcmVzc2VzLiAgVGhlCitmaXJzdCBpcyB0aGUgQGRmbntWTUF9LCBvciB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcwordGhlIHNlY3Rpb24gd2lsbCBoYXZlIHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4gIFRoZSBzZWNvbmQgaXMgdGhlCitAZGZue0xNQX0sIG9yIGxvYWQgbWVtb3J5IGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoZQorc2VjdGlvbiB3aWxsIGJlIGxvYWRlZC4gIEluIG1vc3QgY2FzZXMgdGhlIHR3byBhZGRyZXNzZXMgd2lsbCBiZSB0aGUKK3NhbWUuICBBbiBleGFtcGxlIG9mIHdoZW4gdGhleSBtaWdodCBiZSBkaWZmZXJlbnQgaXMgd2hlbiBhIGRhdGEgc2VjdGlvbgoraXMgbG9hZGVkIGludG8gUk9NLCBhbmQgdGhlbiBjb3BpZWQgaW50byBSQU0gd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMgdXAKKyh0aGlzIHRlY2huaXF1ZSBpcyBvZnRlbiB1c2VkIHRvIGluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcyBpbiBhIFJPTQorYmFzZWQgc3lzdGVtKS4gIEluIHRoaXMgY2FzZSB0aGUgUk9NIGFkZHJlc3Mgd291bGQgYmUgdGhlIExNQSwgYW5kIHRoZQorUkFNIGFkZHJlc3Mgd291bGQgYmUgdGhlIFZNQS4KKworWW91IGNhbiBzZWUgdGhlIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfQorcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstaH0gb3B0aW9uLgorCitFdmVyeSBvYmplY3QgZmlsZSBhbHNvIGhhcyBhIGxpc3Qgb2YgQGRmbntzeW1ib2xzfSwga25vd24gYXMgdGhlCitAZGZue3N5bWJvbCB0YWJsZX0uICBBIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBvciB1bmRlZmluZWQuICBFYWNoIHN5bWJvbAoraGFzIGEgbmFtZSwgYW5kIGVhY2ggZGVmaW5lZCBzeW1ib2wgaGFzIGFuIGFkZHJlc3MsIGFtb25nIG90aGVyCitpbmZvcm1hdGlvbi4gIElmIHlvdSBjb21waWxlIGEgQyBvciBDKysgcHJvZ3JhbSBpbnRvIGFuIG9iamVjdCBmaWxlLCB5b3UKK3dpbGwgZ2V0IGEgZGVmaW5lZCBzeW1ib2wgZm9yIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24gYW5kIGdsb2JhbCBvcgorc3RhdGljIHZhcmlhYmxlLiAgRXZlcnkgdW5kZWZpbmVkIGZ1bmN0aW9uIG9yIGdsb2JhbCB2YXJpYWJsZSB3aGljaCBpcworcmVmZXJlbmNlZCBpbiB0aGUgaW5wdXQgZmlsZSB3aWxsIGJlY29tZSBhbiB1bmRlZmluZWQgc3ltYm9sLgorCitZb3UgY2FuIHNlZSB0aGUgc3ltYm9scyBpbiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7bm19Citwcm9ncmFtLCBvciBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstdH0KK29wdGlvbi4KKworQG5vZGUgU2NyaXB0IEZvcm1hdAorQHNlY3Rpb24gTGlua2VyIFNjcmlwdCBGb3JtYXQKK0BjaW5kZXggbGlua2VyIHNjcmlwdCBmb3JtYXQKK0xpbmtlciBzY3JpcHRzIGFyZSB0ZXh0IGZpbGVzLgorCitZb3Ugd3JpdGUgYSBsaW5rZXIgc2NyaXB0IGFzIGEgc2VyaWVzIG9mIGNvbW1hbmRzLiAgRWFjaCBjb21tYW5kIGlzCitlaXRoZXIgYSBrZXl3b3JkLCBwb3NzaWJseSBmb2xsb3dlZCBieSBhcmd1bWVudHMsIG9yIGFuIGFzc2lnbm1lbnQgdG8gYQorc3ltYm9sLiAgWW91IG1heSBzZXBhcmF0ZSBjb21tYW5kcyB1c2luZyBzZW1pY29sb25zLiAgV2hpdGVzcGFjZSBpcworZ2VuZXJhbGx5IGlnbm9yZWQuCisKK1N0cmluZ3Mgc3VjaCBhcyBmaWxlIG9yIGZvcm1hdCBuYW1lcyBjYW4gbm9ybWFsbHkgYmUgZW50ZXJlZCBkaXJlY3RseS4KK0lmIHRoZSBmaWxlIG5hbWUgY29udGFpbnMgYSBjaGFyYWN0ZXIgc3VjaCBhcyBhIGNvbW1hIHdoaWNoIHdvdWxkCitvdGhlcndpc2Ugc2VydmUgdG8gc2VwYXJhdGUgZmlsZSBuYW1lcywgeW91IG1heSBwdXQgdGhlIGZpbGUgbmFtZSBpbgorZG91YmxlIHF1b3Rlcy4gIFRoZXJlIGlzIG5vIHdheSB0byB1c2UgYSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyIGluIGEKK2ZpbGUgbmFtZS4KKworWW91IG1heSBpbmNsdWRlIGNvbW1lbnRzIGluIGxpbmtlciBzY3JpcHRzIGp1c3QgYXMgaW4gQywgZGVsaW1pdGVkIGJ5CitAc2FtcHsvKn0gYW5kIEBzYW1weyovfS4gIEFzIGluIEMsIGNvbW1lbnRzIGFyZSBzeW50YWN0aWNhbGx5IGVxdWl2YWxlbnQKK3RvIHdoaXRlc3BhY2UuCisKK0Bub2RlIFNpbXBsZSBFeGFtcGxlCitAc2VjdGlvbiBTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCitAY2luZGV4IGxpbmtlciBzY3JpcHQgZXhhbXBsZQorQGNpbmRleCBleGFtcGxlIG9mIGxpbmtlciBzY3JpcHQKK01hbnkgbGlua2VyIHNjcmlwdHMgYXJlIGZhaXJseSBzaW1wbGUuCisKK1RoZSBzaW1wbGVzdCBwb3NzaWJsZSBsaW5rZXIgc2NyaXB0IGhhcyBqdXN0IG9uZSBjb21tYW5kOgorQHNhbXB7U0VDVElPTlN9LiAgWW91IHVzZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgdG8gZGVzY3JpYmUgdGhlCittZW1vcnkgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4KKworVGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGlzIGEgcG93ZXJmdWwgY29tbWFuZC4gIEhlcmUgd2Ugd2lsbAorZGVzY3JpYmUgYSBzaW1wbGUgdXNlIG9mIGl0LiAgTGV0J3MgYXNzdW1lIHlvdXIgcHJvZ3JhbSBjb25zaXN0cyBvbmx5IG9mCitjb2RlLCBpbml0aWFsaXplZCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBkYXRhLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUKK0BzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9LCBhbmQgQHNhbXB7LmJzc30gc2VjdGlvbnMsIHJlc3BlY3RpdmVseS4KK0xldCdzIGFzc3VtZSBmdXJ0aGVyIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbgoreW91ciBpbnB1dCBmaWxlcy4KKworRm9yIHRoaXMgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzCisweDEwMDAwLCBhbmQgdGhhdCB0aGUgZGF0YSBzaG91bGQgc3RhcnQgYXQgYWRkcmVzcyAweDgwMDAwMDAuICBIZXJlIGlzIGEKK2xpbmtlciBzY3JpcHQgd2hpY2ggd2lsbCBkbyB0aGF0OgorQHNtYWxsZXhhbXBsZQorU0VDVElPTlMKK0B7CisgIC4gPSAweDEwMDAwOworICAudGV4dCA6IEB7ICooLnRleHQpIEB9CisgIC4gPSAweDgwMDAwMDA7CisgIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KKyAgLmJzcyA6IEB7ICooLmJzcykgQH0KK0B9CitAZW5kIHNtYWxsZXhhbXBsZQorCitZb3Ugd3JpdGUgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGFzIHRoZSBrZXl3b3JkIEBzYW1we1NFQ1RJT05TfSwKK2ZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIHN5bWJvbCBhc3NpZ25tZW50cyBhbmQgb3V0cHV0IHNlY3Rpb24KK2Rlc2NyaXB0aW9ucyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMuCisKK1RoZSBmaXJzdCBsaW5lIGluIHRoZSBhYm92ZSBleGFtcGxlIHNldHMgdGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59LAord2hpY2ggaXMgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgYW4KK291dHB1dCBzZWN0aW9uIGluIHNvbWUgb3RoZXIgd2F5IChvdGhlciB3YXlzIGFyZSBkZXNjcmliZWQgbGF0ZXIpLCB0aGUKK2FkZHJlc3MgaXMgc2V0IGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBUaGUKK2xvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbiBpbmNyZW1lbnRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uCisKK1RoZSBmaXJzdCBsaW5lIGluc2lkZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgb2YgdGhlIGFib3ZlIGV4YW1wbGUKK3NldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSwgd2hpY2ggaXMgdGhlIGxvY2F0aW9uCitjb3VudGVyLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGluIHNvbWUKK290aGVyIHdheSAob3RoZXIgd2F5cyBhcmUgZGVzY3JpYmVkIGxhdGVyKSwgdGhlIGFkZHJlc3MgaXMgc2V0IGZyb20gdGhlCitjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbgoraW5jcmVtZW50ZWQgYnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgQXQgdGhlIHN0YXJ0IG9mIHRoZQorQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQsIHRoZSBsb2NhdGlvbiBjb3VudGVyIGhhcyB0aGUgdmFsdWUgQHNhbXB7MH0uCisKK1RoZSBzZWNvbmQgbGluZSBkZWZpbmVzIGFuIG91dHB1dCBzZWN0aW9uLCBAc2FtcHsudGV4dH0uICBUaGUgY29sb24gaXMKK3JlcXVpcmVkIHN5bnRheCB3aGljaCBtYXkgYmUgaWdub3JlZCBmb3Igbm93LiAgV2l0aGluIHRoZSBjdXJseSBicmFjZXMKK2FmdGVyIHRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lLCB5b3UgbGlzdCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IHNlY3Rpb25zCit3aGljaCBzaG91bGQgYmUgcGxhY2VkIGludG8gdGhpcyBvdXRwdXQgc2VjdGlvbi4gIFRoZSBAc2FtcHsqfSBpcyBhCit3aWxkY2FyZCB3aGljaCBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICBUaGUgZXhwcmVzc2lvbiBAc2FtcHsqKC50ZXh0KX0KK21lYW5zIGFsbCBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgaW4gYWxsIGlucHV0IGZpbGVzLgorCitTaW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBpcyBAc2FtcHsweDEwMDAwfSB3aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgorQHNhbXB7LnRleHR9IGlzIGRlZmluZWQsIHRoZSBsaW5rZXIgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCitAc2FtcHsudGV4dH0gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgQHNhbXB7MHgxMDAwMH0uCisKK1RoZSByZW1haW5pbmcgbGluZXMgZGVmaW5lIHRoZSBAc2FtcHsuZGF0YX0gYW5kIEBzYW1wey5ic3N9IHNlY3Rpb25zIGluCit0aGUgb3V0cHV0IGZpbGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbgorYXQgYWRkcmVzcyBAc2FtcHsweDgwMDAwMDB9LiAgQWZ0ZXIgdGhlIGxpbmtlciBwbGFjZXMgdGhlIEBzYW1wey5kYXRhfQorb3V0cHV0IHNlY3Rpb24sIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciB3aWxsIGJlCitAc2FtcHsweDgwMDAwMDB9IHBsdXMgdGhlIHNpemUgb2YgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbi4gIFRoZQorZWZmZWN0IGlzIHRoYXQgdGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuYnNzfSBvdXRwdXQgc2VjdGlvbgoraW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbiBpbiBtZW1vcnkKKworVGhlIGxpbmtlciB3aWxsIGVuc3VyZSB0aGF0IGVhY2ggb3V0cHV0IHNlY3Rpb24gaGFzIHRoZSByZXF1aXJlZAorYWxpZ25tZW50LCBieSBpbmNyZWFzaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlmIG5lY2Vzc2FyeS4gIEluIHRoaXMKK2V4YW1wbGUsIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2VzIGZvciB0aGUgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0KK3NlY3Rpb25zIHdpbGwgcHJvYmFibHkgc2F0aXNmeSBhbnkgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCBidXQgdGhlIGxpbmtlcgorbWF5IGhhdmUgdG8gY3JlYXRlIGEgc21hbGwgZ2FwIGJldHdlZW4gdGhlIEBzYW1wey5kYXRhfSBhbmQgQHNhbXB7LmJzc30KK3NlY3Rpb25zLgorCitUaGF0J3MgaXQhICBUaGF0J3MgYSBzaW1wbGUgYW5kIGNvbXBsZXRlIGxpbmtlciBzY3JpcHQuCisKK0Bub2RlIFNpbXBsZSBDb21tYW5kcworQHNlY3Rpb24gU2ltcGxlIExpbmtlciBTY3JpcHQgQ29tbWFuZHMKK0BjaW5kZXggbGlua2VyIHNjcmlwdCBzaW1wbGUgY29tbWFuZHMKK0luIHRoaXMgc2VjdGlvbiB3ZSBkZXNjcmliZSB0aGUgc2ltcGxlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMuCisKK0BtZW51CisqIEVudHJ5IFBvaW50OjoJCQlTZXR0aW5nIHRoZSBlbnRyeSBwb2ludAorKiBGaWxlIENvbW1hbmRzOjoJCUNvbW1hbmRzIGRlYWxpbmcgd2l0aCBmaWxlcworQGlmY2xlYXIgU2luZ2xlRm9ybWF0CisqIEZvcm1hdCBDb21tYW5kczo6CQlDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cworQGVuZCBpZmNsZWFyCisKKyogTWlzY2VsbGFuZW91cyBDb21tYW5kczo6CU90aGVyIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKK0BlbmQgbWVudQorCitAbm9kZSBFbnRyeSBQb2ludAorQHN1YnNlY3Rpb24gU2V0dGluZyB0aGUgZW50cnkgcG9pbnQKK0BraW5kZXggRU5UUlkoQHZhcntzeW1ib2x9KQorQGNpbmRleCBzdGFydCBvZiBleGVjdXRpb24KK0BjaW5kZXggZmlyc3QgaW5zdHJ1Y3Rpb24KK0BjaW5kZXggZW50cnkgcG9pbnQKK1RoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byBleGVjdXRlIGluIGEgcHJvZ3JhbSBpcyBjYWxsZWQgdGhlIEBkZm57ZW50cnkKK3BvaW50fS4gIFlvdSBjYW4gdXNlIHRoZSBAY29kZXtFTlRSWX0gbGlua2VyIHNjcmlwdCBjb21tYW5kIHRvIHNldCB0aGUKK2VudHJ5IHBvaW50LiAgVGhlIGFyZ3VtZW50IGlzIGEgc3ltYm9sIG5hbWU6CitAc21hbGxleGFtcGxlCitFTlRSWShAdmFye3N5bWJvbH0pCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHNldCB0aGUgZW50cnkgcG9pbnQuICBUaGUgbGlua2VyIHdpbGwgc2V0IHRoZQorZW50cnkgcG9pbnQgYnkgdHJ5aW5nIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIGluIG9yZGVyLCBhbmQKK3N0b3BwaW5nIHdoZW4gb25lIG9mIHRoZW0gc3VjY2VlZHM6CitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbSAKK3RoZSBAc2FtcHstZX0gQHZhcntlbnRyeX0gY29tbWFuZC1saW5lIG9wdGlvbjsKK0BpdGVtIAordGhlIEBjb2Rle0VOVFJZKEB2YXJ7c3ltYm9sfSl9IGNvbW1hbmQgaW4gYSBsaW5rZXIgc2NyaXB0OworQGl0ZW0gCit0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtzdGFydH0sIGlmIGRlZmluZWQ7CitAaXRlbSAKK3RoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiwgaWYgcHJlc2VudDsKK0BpdGVtIAorVGhlIGFkZHJlc3MgQGNvZGV7MH0uCitAZW5kIGl0ZW1pemUKKworQG5vZGUgRmlsZSBDb21tYW5kcworQHN1YnNlY3Rpb24gQ29tbWFuZHMgZGVhbGluZyB3aXRoIGZpbGVzCitAY2luZGV4IGxpbmtlciBzY3JpcHQgZmlsZSBjb21tYW5kcworU2V2ZXJhbCBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzIGRlYWwgd2l0aCBmaWxlcy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBJTkNMVURFIEB2YXJ7ZmlsZW5hbWV9CitAa2luZGV4IElOQ0xVREUgQHZhcntmaWxlbmFtZX0KK0BjaW5kZXggaW5jbHVkaW5nIGEgbGlua2VyIHNjcmlwdAorSW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdCBAdmFye2ZpbGVuYW1lfSBhdCB0aGlzIHBvaW50LiAgVGhlIGZpbGUgd2lsbAorYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGFueSBkaXJlY3Rvcnkgc3BlY2lmaWVkCit3aXRoIHRoZSBAY29kZXstTH0gb3B0aW9uLiAgWW91IGNhbiBuZXN0IGNhbGxzIHRvIEBjb2Rle0lOQ0xVREV9IHVwIHRvCisxMCBsZXZlbHMgZGVlcC4KKworQGl0ZW0gSU5QVVQoQHZhcntmaWxlfSwgQHZhcntmaWxlfSwgQGRvdHN7fSkKK0BpdGVteCBJTlBVVChAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fSkKK0BraW5kZXggSU5QVVQoQHZhcntmaWxlc30pCitAY2luZGV4IGlucHV0IGZpbGVzIGluIGxpbmtlciBzY3JpcHRzCitAY2luZGV4IGlucHV0IG9iamVjdCBmaWxlcyBpbiBsaW5rZXIgc2NyaXB0cworQGNpbmRleCBsaW5rZXIgc2NyaXB0IGlucHV0IG9iamVjdCBmaWxlcworVGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGRpcmVjdHMgdGhlIGxpbmtlciB0byBpbmNsdWRlIHRoZSBuYW1lZCBmaWxlcworaW4gdGhlIGxpbmssIGFzIHRob3VnaCB0aGV5IHdlcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBhbHdheXMgd2FudCB0byBpbmNsdWRlIEBmaWxle3N1YnIub30gYW55IHRpbWUgeW91IGRvCithIGxpbmssIGJ1dCB5b3UgY2FuJ3QgYmUgYm90aGVyZWQgdG8gcHV0IGl0IG9uIGV2ZXJ5IGxpbmsgY29tbWFuZCBsaW5lLAordGhlbiB5b3UgY2FuIHB1dCBAc2FtcHtJTlBVVCAoc3Vici5vKX0gaW4geW91ciBsaW5rZXIgc2NyaXB0LgorCitJbiBmYWN0LCBpZiB5b3UgbGlrZSwgeW91IGNhbiBsaXN0IGFsbCBvZiB5b3VyIGlucHV0IGZpbGVzIGluIHRoZSBsaW5rZXIKK3NjcmlwdCwgYW5kIHRoZW4gaW52b2tlIHRoZSBsaW5rZXIgd2l0aCBub3RoaW5nIGJ1dCBhIEBzYW1wey1UfSBvcHRpb24uCisKK1RoZSBsaW5rZXIgd2lsbCBmaXJzdCB0cnkgdG8gb3BlbiB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBJZgoraXQgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgc2VhcmNoIHRocm91Z2ggdGhlIGFyY2hpdmUgbGlicmFyeQorc2VhcmNoIHBhdGguICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey1MfSBpbiBAcmVme09wdGlvbnMsLENvbW1hbmQKK0xpbmUgT3B0aW9uc30uCisKK0lmIHlvdSB1c2UgQHNhbXB7SU5QVVQgKC1sQHZhcntmaWxlfSl9LCBAY29kZXtsZH0gd2lsbCB0cmFuc2Zvcm0gdGhlCituYW1lIHRvIEBjb2Rle2xpYkB2YXJ7ZmlsZX0uYX0sIGFzIHdpdGggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudAorQHNhbXB7LWx9LgorCitXaGVuIHlvdSB1c2UgdGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGluIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQsIHRoZQorZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluayBhdCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIGxpbmtlcgorc2NyaXB0IGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIGNhbiBhZmZlY3QgYXJjaGl2ZSBzZWFyY2hpbmcuCisKK0BpdGVtIEdST1VQKEB2YXJ7ZmlsZX0sIEB2YXJ7ZmlsZX0sIEBkb3Rze30pCitAaXRlbXggR1JPVVAoQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30pCitAa2luZGV4IEdST1VQKEB2YXJ7ZmlsZXN9KQorQGNpbmRleCBncm91cGluZyBpbnB1dCBmaWxlcworVGhlIEBjb2Rle0dST1VQfSBjb21tYW5kIGlzIGxpa2UgQGNvZGV7SU5QVVR9LCBleGNlcHQgdGhhdCB0aGUgbmFtZWQKK2ZpbGVzIHNob3VsZCBhbGwgYmUgYXJjaGl2ZXMsIGFuZCB0aGV5IGFyZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIG5vCituZXcgdW5kZWZpbmVkIHJlZmVyZW5jZXMgYXJlIGNyZWF0ZWQuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey0ofQoraW4gQHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30uCisKK0BpdGVtIE9VVFBVVChAdmFye2ZpbGVuYW1lfSkKK0BraW5kZXggT1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KQorQGNpbmRleCBvdXRwdXQgZmlsZSBuYW1lIGluIGxpbmtlciBzY3JpcG90CitUaGUgQGNvZGV7T1VUUFVUfSBjb21tYW5kIG5hbWVzIHRoZSBvdXRwdXQgZmlsZS4gIFVzaW5nCitAY29kZXtPVVRQVVQoQHZhcntmaWxlbmFtZX0pfSBpbiB0aGUgbGlua2VyIHNjcmlwdCBpcyBleGFjdGx5IGxpa2UgdXNpbmcKK0BzYW1wey1vIEB2YXJ7ZmlsZW5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lIChAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZAorTGluZSBPcHRpb25zfSkuICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0YWtlcworcHJlY2VkZW5jZS4KKworWW91IGNhbiB1c2UgdGhlIEBjb2Rle09VVFBVVH0gY29tbWFuZCB0byBkZWZpbmUgYSBkZWZhdWx0IG5hbWUgZm9yIHRoZQorb3V0cHV0IGZpbGUgb3RoZXIgdGhhbiB0aGUgdXN1YWwgZGVmYXVsdCBvZiBAZmlsZXthLm91dH0uCisKK0BpdGVtIFNFQVJDSF9ESVIoQHZhcntwYXRofSkKK0BraW5kZXggU0VBUkNIX0RJUihAdmFye3BhdGh9KQorQGNpbmRleCBsaWJyYXJ5IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKK0BjaW5kZXggYXJjaGl2ZSBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0CitAY2luZGV4IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKK1RoZSBAY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kIGFkZHMgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBwYXRocyB3aGVyZQorQGNvZGV7bGR9IGxvb2tzIGZvciBhcmNoaXZlIGxpYnJhcmllcy4gIFVzaW5nCitAY29kZXtTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pfSBpcyBleGFjdGx5IGxpa2UgdXNpbmcgQHNhbXB7LUwgQHZhcntwYXRofX0KK29uIHRoZSBjb21tYW5kIGxpbmUgKEBweHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgSWYgYm90aAorYXJlIHVzZWQsIHRoZW4gdGhlIGxpbmtlciB3aWxsIHNlYXJjaCBib3RoIHBhdGhzLiAgUGF0aHMgc3BlY2lmaWVkIHVzaW5nCit0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBhcmUgc2VhcmNoZWQgZmlyc3QuCisKK0BpdGVtIFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCitAa2luZGV4IFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCitAY2luZGV4IGZpcnN0IGlucHV0IGZpbGUKK1RoZSBAY29kZXtTVEFSVFVQfSBjb21tYW5kIGlzIGp1c3QgbGlrZSB0aGUgQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGV4Y2VwdAordGhhdCBAdmFye2ZpbGVuYW1lfSB3aWxsIGJlY29tZSB0aGUgZmlyc3QgaW5wdXQgZmlsZSB0byBiZSBsaW5rZWQsIGFzCit0aG91Z2ggaXQgd2VyZSBzcGVjaWZpZWQgZmlyc3Qgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMgbWF5IGJlIHVzZWZ1bAord2hlbiB1c2luZyBhIHN5c3RlbSBpbiB3aGljaCB0aGUgZW50cnkgcG9pbnQgaXMgYWx3YXlzIHRoZSBzdGFydCBvZiB0aGUKK2ZpcnN0IGZpbGUuCitAZW5kIHRhYmxlCisKK0BpZmNsZWFyIFNpbmdsZUZvcm1hdAorQG5vZGUgRm9ybWF0IENvbW1hbmRzCitAc3Vic2VjdGlvbiBDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cworQSBjb3VwbGUgb2YgbGlua2VyIHNjcmlwdCBjb21tYW5kcyBkZWFsIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pCitAaXRlbXggT1VUUFVUX0ZPUk1BVChAdmFye2RlZmF1bHR9LCBAdmFye2JpZ30sIEB2YXJ7bGl0dGxlfSkKK0BraW5kZXggT1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KQorQGNpbmRleCBvdXRwdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAorVGhlIEBjb2Rle09VVFBVVF9GT1JNQVR9IGNvbW1hbmQgbmFtZXMgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciB0aGUKK291dHB1dCBmaWxlIChAcHhyZWZ7QkZEfSkuICBVc2luZyBAY29kZXtPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pfSBpcworZXhhY3RseSBsaWtlIHVzaW5nIEBzYW1wey1vZm9ybWF0IEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKKyhAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIGJvdGggYXJlIHVzZWQsIHRoZSBjb21tYW5kCitsaW5lIG9wdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgorCitZb3UgY2FuIHVzZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aXRoIHRocmVlIGFyZ3VtZW50cyB0byB1c2UgZGlmZmVyZW50Citmb3JtYXRzIGJhc2VkIG9uIHRoZSBAc2FtcHstRUJ9IGFuZCBAc2FtcHstRUx9IGNvbW1hbmQgbGluZSBvcHRpb25zLgorVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiB0aGUKK2Rlc2lyZWQgZW5kaWFubmVzcy4KKworSWYgbmVpdGhlciBAc2FtcHstRUJ9IG5vciBAc2FtcHstRUx9IGFyZSB1c2VkLCB0aGVuIHRoZSBvdXRwdXQgZm9ybWF0Cit3aWxsIGJlIHRoZSBmaXJzdCBhcmd1bWVudCwgQHZhcntkZWZhdWx0fS4gIElmIEBzYW1wey1FQn0gaXMgdXNlZCwgdGhlCitvdXRwdXQgZm9ybWF0IHdpbGwgYmUgdGhlIHNlY29uZCBhcmd1bWVudCwgQHZhcntiaWd9LiAgSWYgQHNhbXB7LUVMfSBpcwordXNlZCwgdGhlIG91dHB1dCBmb3JtYXQgd2lsbCBiZSB0aGUgdGhpcmQgYXJndW1lbnQsIEB2YXJ7bGl0dGxlfS4KKworRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBNSVBTIEVMRiB0YXJnZXQgdXNlcyB0aGlzCitjb21tYW5kOgorQHNtYWxsZXhhbXBsZQorT1VUUFVUX0ZPUk1BVChlbGYzMi1iaWdtaXBzLCBlbGYzMi1iaWdtaXBzLCBlbGYzMi1saXR0bGVtaXBzKQorQGVuZCBzbWFsbGV4YW1wbGUKK1RoaXMgc2F5cyB0aGF0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlIGlzCitAc2FtcHtlbGYzMi1iaWdtaXBzfSwgYnV0IGlmIHRoZSB1c2VyIHVzZXMgdGhlIEBzYW1wey1FTH0gY29tbWFuZCBsaW5lCitvcHRpb24sIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIEBzYW1we2VsZjMyLWxpdHRsZW1pcHN9Citmb3JtYXQuCisKK0BpdGVtIFRBUkdFVChAdmFye2JmZG5hbWV9KQorQGtpbmRleCBUQVJHRVQoQHZhcntiZmRuYW1lfSkKK0BjaW5kZXggaW5wdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAorVGhlIEBjb2Rle1RBUkdFVH0gY29tbWFuZCBuYW1lcyB0aGUgQkZEIGZvcm1hdCB0byB1c2Ugd2hlbiByZWFkaW5nIGlucHV0CitmaWxlcy4gIEl0IGFmZmVjdHMgc3Vic2VxdWVudCBAY29kZXtJTlBVVH0gYW5kIEBjb2Rle0dST1VQfSBjb21tYW5kcy4KK1RoaXMgY29tbWFuZCBpcyBsaWtlIHVzaW5nIEBzYW1wey1iIEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKKyhAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIHRoZSBAY29kZXtUQVJHRVR9IGNvbW1hbmQKK2lzIHVzZWQgYnV0IEBjb2Rle09VVFBVVF9GT1JNQVR9IGlzIG5vdCwgdGhlbiB0aGUgbGFzdCBAY29kZXtUQVJHRVR9Citjb21tYW5kIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgQHhyZWZ7QkZEfS4KK0BlbmQgdGFibGUKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBNaXNjZWxsYW5lb3VzIENvbW1hbmRzCitAc3Vic2VjdGlvbiBPdGhlciBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCitUaGVyZSBhcmUgYSBmZXcgb3RoZXIgbGlua2VyIHNjcmlwdHMgY29tbWFuZHMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQVNTRVJUKEB2YXJ7ZXhwfSwgQHZhcnttZXNzYWdlfSkKK0BraW5kZXggQVNTRVJUCitAY2luZGV4IGFzc2VydGlvbiBpbiBsaW5rZXIgc2NyaXB0CitFbnN1cmUgdGhhdCBAdmFye2V4cH0gaXMgbm9uLXplcm8uICBJZiBpdCBpcyB6ZXJvLCB0aGVuIGV4aXQgdGhlIGxpbmtlcgord2l0aCBhbiBlcnJvciBjb2RlLCBhbmQgcHJpbnQgQHZhcnttZXNzYWdlfS4KKworQGl0ZW0gRVhURVJOKEB2YXJ7c3ltYm9sfSBAdmFye3N5bWJvbH0gQGRvdHN7fSkKK0BraW5kZXggRVhURVJOCitAY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wgaW4gbGlua2VyIHNjcmlwdAorRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAorc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAorbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIFlvdSBtYXkgbGlzdCBzZXZlcmFsIEB2YXJ7c3ltYm9sfXMgZm9yCitlYWNoIEBjb2Rle0VYVEVSTn0sIGFuZCB5b3UgbWF5IHVzZSBAY29kZXtFWFRFUk59IG11bHRpcGxlIHRpbWVzLiAgVGhpcworY29tbWFuZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAc2FtcHstdX0gY29tbWFuZC1saW5lIG9wdGlvbi4KKworQGl0ZW0gRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KK0BraW5kZXggRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KK0BjaW5kZXggY29tbW9uIGFsbG9jYXRpb24gaW4gbGlua2VyIHNjcmlwdAorVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIEBzYW1wey1kfSBjb21tYW5kLWxpbmUgb3B0aW9uOgordG8gbWFrZSBAY29kZXtsZH0gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYSByZWxvY2F0YWJsZQorb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkIChAc2FtcHstcn0pLgorCitAaXRlbSBOT0NST1NTUkVGUyhAdmFye3NlY3Rpb259IEB2YXJ7c2VjdGlvbn0gQGRvdHN7fSkKK0BraW5kZXggTk9DUk9TU1JFRlMoQHZhcntzZWN0aW9uc30pCitAY2luZGV4IGNyb3NzIHJlZmVyZW5jZXMKK1RoaXMgY29tbWFuZCBtYXkgYmUgdXNlZCB0byB0ZWxsIEBjb2Rle2xkfSB0byBpc3N1ZSBhbiBlcnJvciBhYm91dCBhbnkKK3JlZmVyZW5jZXMgYW1vbmcgY2VydGFpbiBvdXRwdXQgc2VjdGlvbnMuCisKK0luIGNlcnRhaW4gdHlwZXMgb2YgcHJvZ3JhbXMsIHBhcnRpY3VsYXJseSBvbiBlbWJlZGRlZCBzeXN0ZW1zIHdoZW4KK3VzaW5nIG92ZXJsYXlzLCB3aGVuIG9uZSBzZWN0aW9uIGlzIGxvYWRlZCBpbnRvIG1lbW9yeSwgYW5vdGhlciBzZWN0aW9uCit3aWxsIG5vdCBiZS4gIEFueSBkaXJlY3QgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gc2VjdGlvbnMgd291bGQgYmUKK2Vycm9ycy4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciBpZiBjb2RlIGluIG9uZSBzZWN0aW9uIGNhbGxlZAorYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSBvdGhlciBzZWN0aW9uLgorCitUaGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdGFrZXMgYSBsaXN0IG9mIG91dHB1dCBzZWN0aW9uIG5hbWVzLiAgSWYKK0Bjb2Rle2xkfSBkZXRlY3RzIGFueSBjcm9zcyByZWZlcmVuY2VzIGJldHdlZW4gdGhlIHNlY3Rpb25zLCBpdCByZXBvcnRzCithbiBlcnJvciBhbmQgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLiAgTm90ZSB0aGF0IHRoZQorQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdXNlcyBvdXRwdXQgc2VjdGlvbiBuYW1lcywgbm90IGlucHV0IHNlY3Rpb24KK25hbWVzLgorCitAaWZjbGVhciBTaW5nbGVGb3JtYXQKK0BpdGVtIE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCitAa2luZGV4IE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCitAY2luZGV4IG1hY2hpbmUgYXJjaGl0ZWN0dXJlCitAY2luZGV4IGFyY2hpdGVjdHVyZQorU3BlY2lmeSBhIHBhcnRpY3VsYXIgb3V0cHV0IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAgVGhlIGFyZ3VtZW50IGlzIG9uZQorb2YgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIEJGRCBsaWJyYXJ5IChAcHhyZWZ7QkZEfSkuICBZb3UgY2FuIHNlZSB0aGUKK2FyY2hpdGVjdHVyZSBvZiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoCit0aGUgQHNhbXB7LWZ9IG9wdGlvbi4KK0BlbmQgaWZjbGVhcgorQGVuZCB0YWJsZQorCitAbm9kZSBBc3NpZ25tZW50cworQHNlY3Rpb24gQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCitAY2luZGV4IGFzc2lnbm1lbnQgaW4gc2NyaXB0cworQGNpbmRleCBzeW1ib2wgZGVmaW5pdGlvbiwgc2NyaXB0cworQGNpbmRleCB2YXJpYWJsZXMsIGRlZmluaW5nCitZb3UgbWF5IGFzc2lnbiBhIHZhbHVlIHRvIGEgc3ltYm9sIGluIGEgbGlua2VyIHNjcmlwdC4gIFRoaXMgd2lsbCBkZWZpbmUKK3RoZSBzeW1ib2wgYXMgYSBnbG9iYWwgc3ltYm9sLgorCitAbWVudQorKiBTaW1wbGUgQXNzaWdubWVudHM6OgkJU2ltcGxlIEFzc2lnbm1lbnRzCisqIFBST1ZJREU6OgkJCVBST1ZJREUKK0BlbmQgbWVudQorCitAbm9kZSBTaW1wbGUgQXNzaWdubWVudHMKK0BzdWJzZWN0aW9uIFNpbXBsZSBBc3NpZ25tZW50cworCitZb3UgbWF5IGFzc2lnbiB0byBhIHN5bWJvbCB1c2luZyBhbnkgb2YgdGhlIEMgYXNzaWdubWVudCBvcGVyYXRvcnM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQHZhcntzeW1ib2x9ID0gQHZhcntleHByZXNzaW9ufSA7CitAaXRlbXggQHZhcntzeW1ib2x9ICs9IEB2YXJ7ZXhwcmVzc2lvbn0gOworQGl0ZW14IEB2YXJ7c3ltYm9sfSAtPSBAdmFye2V4cHJlc3Npb259IDsKK0BpdGVteCBAdmFye3N5bWJvbH0gKj0gQHZhcntleHByZXNzaW9ufSA7CitAaXRlbXggQHZhcntzeW1ib2x9IC89IEB2YXJ7ZXhwcmVzc2lvbn0gOworQGl0ZW14IEB2YXJ7c3ltYm9sfSA8PD0gQHZhcntleHByZXNzaW9ufSA7CitAaXRlbXggQHZhcntzeW1ib2x9ID4+PSBAdmFye2V4cHJlc3Npb259IDsKK0BpdGVteCBAdmFye3N5bWJvbH0gJj0gQHZhcntleHByZXNzaW9ufSA7CitAaXRlbXggQHZhcntzeW1ib2x9IHw9IEB2YXJ7ZXhwcmVzc2lvbn0gOworQGVuZCB0YWJsZQorCitUaGUgZmlyc3QgY2FzZSB3aWxsIGRlZmluZSBAdmFye3N5bWJvbH0gdG8gdGhlIHZhbHVlIG9mCitAdmFye2V4cHJlc3Npb259LiAgSW4gdGhlIG90aGVyIGNhc2VzLCBAdmFye3N5bWJvbH0gbXVzdCBhbHJlYWR5IGJlCitkZWZpbmVkLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCisKK1RoZSBzcGVjaWFsIHN5bWJvbCBuYW1lIEBzYW1wey59IGluZGljYXRlcyB0aGUgbG9jYXRpb24gY291bnRlci4gIFlvdQorbWF5IG9ubHkgdXNlIHRoaXMgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuCisKK1RoZSBzZW1pY29sb24gYWZ0ZXIgQHZhcntleHByZXNzaW9ufSBpcyByZXF1aXJlZC4KKworRXhwcmVzc2lvbnMgYXJlIGRlZmluZWQgYmVsb3c7IHNlZSBAcmVme0V4cHJlc3Npb25zfS4KKworWW91IG1heSB3cml0ZSBzeW1ib2wgYXNzaWdubWVudHMgYXMgY29tbWFuZHMgaW4gdGhlaXIgb3duIHJpZ2h0LCBvciBhcworc3RhdGVtZW50cyB3aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCwgb3IgYXMgcGFydCBvZiBhbiBvdXRwdXQKK3NlY3Rpb24gZGVzY3JpcHRpb24gaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZC4KKworVGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB3aWxsIGJlIHNldCBmcm9tIHRoZSBzZWN0aW9uIG9mIHRoZQorZXhwcmVzc2lvbjsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBzaG93aW5nIHRoZSB0aHJlZSBkaWZmZXJlbnQgcGxhY2VzIHRoYXQgc3ltYm9sCithc3NpZ25tZW50cyBtYXkgYmUgdXNlZDoKKworQHNtYWxsZXhhbXBsZQorZmxvYXRpbmdfcG9pbnQgPSAwOworU0VDVElPTlMKK0B7CisgIC50ZXh0IDoKKyAgICBAeworICAgICAgKigudGV4dCkKKyAgICAgIF9ldGV4dCA9IC47CisgICAgQH0KKyAgX2JkYXRhID0gKC4gKyAzKSAmIH4gNDsKKyAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQorQH0KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK0luIHRoaXMgZXhhbXBsZSwgdGhlIHN5bWJvbCBAc2FtcHtmbG9hdGluZ19wb2ludH0gd2lsbCBiZSBkZWZpbmVkIGFzCit6ZXJvLiAgVGhlIHN5bWJvbCBAc2FtcHtfZXRleHR9IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcKK3RoZSBsYXN0IEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9uLiAgVGhlIHN5bWJvbCBAc2FtcHtfYmRhdGF9IHdpbGwgYmUKK2RlZmluZWQgYXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBAc2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gYWxpZ25lZAordXB3YXJkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgorCitAbm9kZSBQUk9WSURFCitAc3Vic2VjdGlvbiBQUk9WSURFCitAY2luZGV4IFBST1ZJREUKK0luIHNvbWUgY2FzZXMsIGl0IGlzIGRlc2lyYWJsZSBmb3IgYSBsaW5rZXIgc2NyaXB0IHRvIGRlZmluZSBhIHN5bWJvbAorb25seSBpZiBpdCBpcyByZWZlcmVuY2VkIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgb2JqZWN0IGluY2x1ZGVkIGluCit0aGUgbGluay4gIEZvciBleGFtcGxlLCB0cmFkaXRpb25hbCBsaW5rZXJzIGRlZmluZWQgdGhlIHN5bWJvbAorQHNhbXB7ZXRleHR9LiAgSG93ZXZlciwgQU5TSSBDIHJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgYmUgYWJsZSB0byB1c2UKK0BzYW1we2V0ZXh0fSBhcyBhIGZ1bmN0aW9uIG5hbWUgd2l0aG91dCBlbmNvdW50ZXJpbmcgYW4gZXJyb3IuICBUaGUKK0Bjb2Rle1BST1ZJREV9IGtleXdvcmQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGEgc3ltYm9sLCBzdWNoIGFzCitAc2FtcHtldGV4dH0sIG9ubHkgaWYgaXQgaXMgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuICBUaGUgc3ludGF4IGlzCitAY29kZXtQUk9WSURFKEB2YXJ7c3ltYm9sfSA9IEB2YXJ7ZXhwcmVzc2lvbn0pfS4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIEBjb2Rle1BST1ZJREV9IHRvIGRlZmluZSBAc2FtcHtldGV4dH06CitAc21hbGxleGFtcGxlCitTRUNUSU9OUworQHsKKyAgLnRleHQgOgorICAgIEB7CisgICAgICAqKC50ZXh0KQorICAgICAgX2V0ZXh0ID0gLjsKKyAgICAgIFBST1ZJREUoZXRleHQgPSAuKTsKKyAgICBAfQorQH0KK0BlbmQgc21hbGxleGFtcGxlCisKK0luIHRoaXMgZXhhbXBsZSwgaWYgdGhlIHByb2dyYW0gZGVmaW5lcyBAc2FtcHtfZXRleHR9ICh3aXRoIGEgbGVhZGluZwordW5kZXJzY29yZSksIHRoZSBsaW5rZXIgd2lsbCBnaXZlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIElmLCBvbgordGhlIG90aGVyIGhhbmQsIHRoZSBwcm9ncmFtIGRlZmluZXMgQHNhbXB7ZXRleHR9ICh3aXRoIG5vIGxlYWRpbmcKK3VuZGVyc2NvcmUpLCB0aGUgbGlua2VyIHdpbGwgc2lsZW50bHkgdXNlIHRoZSBkZWZpbml0aW9uIGluIHRoZSBwcm9ncmFtLgorSWYgdGhlIHByb2dyYW0gcmVmZXJlbmNlcyBAc2FtcHtldGV4dH0gYnV0IGRvZXMgbm90IGRlZmluZSBpdCwgdGhlCitsaW5rZXIgd2lsbCB1c2UgdGhlIGRlZmluaXRpb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCisKK0Bub2RlIFNFQ1RJT05TCitAc2VjdGlvbiBTRUNUSU9OUyBjb21tYW5kCitAa2luZGV4IFNFQ1RJT05TCitUaGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgdGVsbHMgdGhlIGxpbmtlciBob3cgdG8gbWFwIGlucHV0IHNlY3Rpb25zCitpbnRvIG91dHB1dCBzZWN0aW9ucywgYW5kIGhvdyB0byBwbGFjZSB0aGUgb3V0cHV0IHNlY3Rpb25zIGluIG1lbW9yeS4KKworVGhlIGZvcm1hdCBvZiB0aGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgaXM6CitAc21hbGxleGFtcGxlCitTRUNUSU9OUworQHsKKyAgQHZhcntzZWN0aW9ucy1jb21tYW5kfQorICBAdmFye3NlY3Rpb25zLWNvbW1hbmR9CisgIEBkb3Rze30KK0B9CitAZW5kIHNtYWxsZXhhbXBsZQorCitFYWNoIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0gbWF5IG9mIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorYW4gQGNvZGV7RU5UUll9IGNvbW1hbmQgKEBweHJlZntFbnRyeSBQb2ludCwsRW50cnkgY29tbWFuZH0pCitAaXRlbQorYSBzeW1ib2wgYXNzaWdubWVudCAoQHB4cmVme0Fzc2lnbm1lbnRzfSkKK0BpdGVtCithbiBvdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgorQGl0ZW0KK2FuIG92ZXJsYXkgZGVzY3JpcHRpb24KK0BlbmQgaXRlbWl6ZQorCitUaGUgQGNvZGV7RU5UUll9IGNvbW1hbmQgYW5kIHN5bWJvbCBhc3NpZ25tZW50cyBhcmUgcGVybWl0dGVkIGluc2lkZSB0aGUKK0Bjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGZvciBjb252ZW5pZW5jZSBpbiB1c2luZyB0aGUgbG9jYXRpb24gY291bnRlciBpbgordGhvc2UgY29tbWFuZHMuICBUaGlzIGNhbiBhbHNvIG1ha2UgdGhlIGxpbmtlciBzY3JpcHQgZWFzaWVyIHRvCit1bmRlcnN0YW5kIGJlY2F1c2UgeW91IGNhbiB1c2UgdGhvc2UgY29tbWFuZHMgYXQgbWVhbmluZ2Z1bCBwb2ludHMgaW4KK3RoZSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLgorCitPdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbnMgYW5kIG92ZXJsYXkgZGVzY3JpcHRpb25zIGFyZSBkZXNjcmliZWQKK2JlbG93LgorCitJZiB5b3UgZG8gbm90IHVzZSBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGluIHlvdXIgbGlua2VyIHNjcmlwdCwgdGhlCitsaW5rZXIgd2lsbCBwbGFjZSBlYWNoIGlucHV0IHNlY3Rpb24gaW50byBhbiBpZGVudGljYWxseSBuYW1lZCBvdXRwdXQKK3NlY3Rpb24gaW4gdGhlIG9yZGVyIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCBpbiB0aGUKK2lucHV0IGZpbGVzLiAgSWYgYWxsIGlucHV0IHNlY3Rpb25zIGFyZSBwcmVzZW50IGluIHRoZSBmaXJzdCBmaWxlLCBmb3IKK2V4YW1wbGUsIHRoZSBvcmRlciBvZiBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBtYXRjaCB0aGUgb3JkZXIKK2luIHRoZSBmaXJzdCBpbnB1dCBmaWxlLiAgVGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBhdCBhZGRyZXNzIHplcm8uCisKK0BtZW51CisqIE91dHB1dCBTZWN0aW9uIERlc2NyaXB0aW9uOjoJT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KKyogT3V0cHV0IFNlY3Rpb24gTmFtZTo6CQlPdXRwdXQgc2VjdGlvbiBuYW1lCisqIE91dHB1dCBTZWN0aW9uIEFkZHJlc3M6OglPdXRwdXQgc2VjdGlvbiBhZGRyZXNzCisqIElucHV0IFNlY3Rpb246OgkJSW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgorKiBPdXRwdXQgU2VjdGlvbiBEYXRhOjoJCU91dHB1dCBzZWN0aW9uIGRhdGEKKyogT3V0cHV0IFNlY3Rpb24gS2V5d29yZHM6OglPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcworKiBPdXRwdXQgU2VjdGlvbiBEaXNjYXJkaW5nOjoJT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZworKiBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzOjoJT3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlcworKiBPdmVybGF5IERlc2NyaXB0aW9uOjoJCU92ZXJsYXkgZGVzY3JpcHRpb24KK0BlbmQgbWVudQorCitAbm9kZSBPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbgorQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KK1RoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tzIGxpa2UgdGhpczoKK0BzbWFsbGV4YW1wbGUKK0Bncm91cCAKK0B2YXJ7c2VjdGlvbn0gW0B2YXJ7YWRkcmVzc31dIFsoQHZhcnt0eXBlfSldIDogW0FUKEB2YXJ7bG1hfSldCisgIEB7CisgICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQorICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KKyAgICBAZG90c3t9CisgIEB9IFs+QHZhcntyZWdpb259XSBbOkB2YXJ7cGhkcn0gOkB2YXJ7cGhkcn0gQGRvdHN7fV0gWz1AdmFye2ZpbGxleHB9XQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworTW9zdCBvdXRwdXQgc2VjdGlvbnMgZG8gbm90IHVzZSBtb3N0IG9mIHRoZSBvcHRpb25hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuCisKK1RoZSB3aGl0ZXNwYWNlIGFyb3VuZCBAdmFye3NlY3Rpb259IGlzIHJlcXVpcmVkLCBzbyB0aGF0IHRoZSBzZWN0aW9uCituYW1lIGlzIHVuYW1iaWd1b3VzLiAgVGhlIGNvbG9uIGFuZCB0aGUgY3VybHkgYnJhY2VzIGFyZSBhbHNvIHJlcXVpcmVkLgorVGhlIGxpbmUgYnJlYWtzIGFuZCBvdGhlciB3aGl0ZSBzcGFjZSBhcmUgb3B0aW9uYWwuCisKK0VhY2ggQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfSBtYXkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCithIHN5bWJvbCBhc3NpZ25tZW50IChAcHhyZWZ7QXNzaWdubWVudHN9KQorQGl0ZW0KK2FuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gKEBweHJlZntJbnB1dCBTZWN0aW9ufSkKK0BpdGVtCitkYXRhIHZhbHVlcyB0byBpbmNsdWRlIGRpcmVjdGx5IChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gRGF0YX0pCitAaXRlbQorYSBzcGVjaWFsIG91dHB1dCBzZWN0aW9uIGtleXdvcmQgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkc30pCitAZW5kIGl0ZW1pemUKKworQG5vZGUgT3V0cHV0IFNlY3Rpb24gTmFtZQorQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gbmFtZQorQGNpbmRleCBuYW1lLCBzZWN0aW9uCitAY2luZGV4IHNlY3Rpb24gbmFtZQorVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGlzIEB2YXJ7c2VjdGlvbn0uICBAdmFye3NlY3Rpb259IG11c3QKK21lZXQgdGhlIGNvbnN0cmFpbnRzIG9mIHlvdXIgb3V0cHV0IGZvcm1hdC4gIEluIGZvcm1hdHMgd2hpY2ggb25seQorc3VwcG9ydCBhIGxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBzdWNoIGFzIEBjb2Rle2Eub3V0fSwgdGhlIG5hbWUKK211c3QgYmUgb25lIG9mIHRoZSBuYW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGZvcm1hdCAoQGNvZGV7YS5vdXR9LCBmb3IKK2V4YW1wbGUsIGFsbG93cyBvbmx5IEBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9IG9yIEBzYW1wey5ic3N9KS4gSWYgdGhlCitvdXRwdXQgZm9ybWF0IHN1cHBvcnRzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMsIGJ1dCB3aXRoIG51bWJlcnMgYW5kIG5vdAorbmFtZXMgKGFzIGlzIHRoZSBjYXNlIGZvciBPYXN5cyksIHRoZSBuYW1lIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhCitxdW90ZWQgbnVtZXJpYyBzdHJpbmcuICBBIHNlY3Rpb24gbmFtZSBtYXkgY29uc2lzdCBvZiBhbnkgc2VxdWVuY2Ugb2YKK2NoYXJhY3RlcnMsIGJ1dCBhIG5hbWUgd2hpY2ggY29udGFpbnMgYW55IHVudXN1YWwgY2hhcmFjdGVycyBzdWNoIGFzCitjb21tYXMgbXVzdCBiZSBxdW90ZWQuCisKK1RoZSBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gaXMgc3BlY2lhbDsgQHJlZntPdXRwdXQgU2VjdGlvbgorRGlzY2FyZGluZ30uCisKK0Bub2RlIE91dHB1dCBTZWN0aW9uIEFkZHJlc3MKK0BzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGFkZHJlc3MKK0BjaW5kZXggYWRkcmVzcywgc2VjdGlvbgorQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MKK1RoZSBAdmFye2FkZHJlc3N9IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBWTUEgKHRoZSB2aXJ0dWFsIG1lbW9yeQorYWRkcmVzcykgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgSWYgeW91IGRvIG5vdCBwcm92aWRlIEB2YXJ7YWRkcmVzc30sCit0aGUgbGlua2VyIHdpbGwgc2V0IGl0IGJhc2VkIG9uIEB2YXJ7cmVnaW9ufSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UKK2Jhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLgorCitJZiB5b3UgcHJvdmlkZSBAdmFye2FkZHJlc3N9LCB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZQorc2V0IHRvIHByZWNpc2VseSB0aGF0LiAgSWYgeW91IHByb3ZpZGUgbmVpdGhlciBAdmFye2FkZHJlc3N9IG5vcgorQHZhcntyZWdpb259LCB0aGVuIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHNldCB0byB0aGUKK2N1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgYWxpZ25lZCB0byB0aGUgYWxpZ25tZW50CityZXF1aXJlbWVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUKK291dHB1dCBzZWN0aW9uIGlzIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGFueSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5lZAord2l0aGluIHRoZSBvdXRwdXQgc2VjdGlvbi4KKworRm9yIGV4YW1wbGUsCitAc21hbGxleGFtcGxlCisudGV4dCAuIDogQHsgKigudGV4dCkgQH0KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK2FuZAorQHNtYWxsZXhhbXBsZQorLnRleHQgOiBAeyAqKC50ZXh0KSBAfQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAorYXJlIHN1YnRseSBkaWZmZXJlbnQuICBUaGUgZmlyc3Qgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCitAc2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uCitjb3VudGVyLiAgVGhlIHNlY29uZCB3aWxsIHNldCBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KK2NvdW50ZXIgYWxpZ25lZCB0byB0aGUgc3RyaWN0ZXN0IGFsaWdubWVudCBvZiBhIEBzYW1wey50ZXh0fSBpbnB1dAorc2VjdGlvbi4KKworVGhlIEB2YXJ7YWRkcmVzc30gbWF5IGJlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uOyBAcmVme0V4cHJlc3Npb25zfS4KK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhbGlnbiB0aGUgc2VjdGlvbiBvbiBhIDB4MTAgYnl0ZSBib3VuZGFyeSwKK3NvIHRoYXQgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgdGhlIHNlY3Rpb24gYWRkcmVzcyBhcmUgemVybywgeW91IGNvdWxkCitkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgorQHNtYWxsZXhhbXBsZQorLnRleHQgQUxJR04oMHgxMCkgOiBAeyAqKC50ZXh0KSBAfQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAorVGhpcyB3b3JrcyBiZWNhdXNlIEBjb2Rle0FMSUdOfSByZXR1cm5zIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNvdW50ZXIKK2FsaWduZWQgdXB3YXJkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisKK1NwZWNpZnlpbmcgQHZhcnthZGRyZXNzfSBmb3IgYSBzZWN0aW9uIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUKK2xvY2F0aW9uIGNvdW50ZXIuCisKK0Bub2RlIElucHV0IFNlY3Rpb24KK0BzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KK0BjaW5kZXggaW5wdXQgc2VjdGlvbnMKK0BjaW5kZXggbWFwcGluZyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMKK1RoZSBtb3N0IGNvbW1vbiBvdXRwdXQgc2VjdGlvbiBjb21tYW5kIGlzIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24uCisKK1RoZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGlzIHRoZSBtb3N0IGJhc2ljIGxpbmtlciBzY3JpcHQgb3BlcmF0aW9uLgorWW91IHVzZSBvdXRwdXQgc2VjdGlvbnMgdG8gdGVsbCB0aGUgbGlua2VyIGhvdyB0byBsYXkgb3V0IHlvdXIgcHJvZ3JhbQoraW4gbWVtb3J5LiAgWW91IHVzZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9ucyB0byB0ZWxsIHRoZSBsaW5rZXIgaG93IHRvCittYXAgdGhlIGlucHV0IGZpbGVzIGludG8geW91ciBtZW1vcnkgbGF5b3V0LgorCitAbWVudQorKiBJbnB1dCBTZWN0aW9uIEJhc2ljczo6CUlucHV0IHNlY3Rpb24gYmFzaWNzCisqIElucHV0IFNlY3Rpb24gV2lsZGNhcmRzOjoJSW5wdXQgc2VjdGlvbiB3aWxkY2FyZCBwYXR0ZXJucworKiBJbnB1dCBTZWN0aW9uIENvbW1vbjo6CUlucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCisqIElucHV0IFNlY3Rpb24gS2VlcDo6CQlJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KKyogSW5wdXQgU2VjdGlvbiBFeGFtcGxlOjoJSW5wdXQgc2VjdGlvbiBleGFtcGxlCitAZW5kIG1lbnUKKworQG5vZGUgSW5wdXQgU2VjdGlvbiBCYXNpY3MKK0BzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gYmFzaWNzCitAY2luZGV4IGlucHV0IHNlY3Rpb24gYmFzaWNzCitBbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGNvbnNpc3RzIG9mIGEgZmlsZSBuYW1lIG9wdGlvbmFsbHkgZm9sbG93ZWQKK2J5IGEgbGlzdCBvZiBzZWN0aW9uIG5hbWVzIGluIHBhcmVudGhlc2VzLgorCitUaGUgZmlsZSBuYW1lIGFuZCB0aGUgc2VjdGlvbiBuYW1lIG1heSBiZSB3aWxkY2FyZCBwYXR0ZXJucywgd2hpY2ggd2UKK2Rlc2NyaWJlIGZ1cnRoZXIgYmVsb3cgKEBweHJlZntJbnB1dCBTZWN0aW9uIFdpbGRjYXJkc30pLgorCitUaGUgbW9zdCBjb21tb24gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBpcyB0byBpbmNsdWRlIGFsbCBpbnB1dAorc2VjdGlvbnMgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBGb3IgZXhhbXBsZSwgdG8KK2luY2x1ZGUgYWxsIGlucHV0IEBzYW1wey50ZXh0fSBzZWN0aW9ucywgeW91IHdvdWxkIHdyaXRlOgorQHNtYWxsZXhhbXBsZQorKigudGV4dCkKK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK0hlcmUgdGhlIEBzYW1weyp9IGlzIGEgd2lsZGNhcmQgd2hpY2ggbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgVG8gZXhjbHVkZSBhIGZpbGUKK2Zyb20gbWF0Y2hpbmcgdGhlIGZpbGUgbmFtZSB3aWxkY2FyZCwgRVhDTFVERV9GSUxFIG1heSBiZSB1c2VkIHRvIG1hdGNoIGFsbCBmaWxlcworZXhjZXB0IHRoZSBvbmUgc3BlY2lmaWVkIGJ5IEVYQ0xVREVfRklMRS4gIEZvciBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCitAZW5kIHNtYWxsZXhhbXBsZQord2lsbCBjYXVzZSBhbGwgLmN0b3JzIHNlY3Rpb25zIGZyb20gYWxsIGZpbGVzIGV4Y2VwdCBjcnRlbmQubyB0byBiZSBpbmNsdWRlZC4KKworVGhlcmUgYXJlIHR3byB3YXlzIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBzZWN0aW9uOgorQHNtYWxsZXhhbXBsZQorKigudGV4dCAucmRhdGEpCisqKC50ZXh0KSAqKC5yZGF0YSkKK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBAc2FtcHsudGV4dH0gYW5kCitAc2FtcHsucmRhdGF9IGlucHV0IHNlY3Rpb25zIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEluIHRoZQorZmlyc3QgZXhhbXBsZSwgdGhleSB3aWxsIGJlIGludGVybWluZ2xlZC4gIEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgYWxsCitAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QsIGZvbGxvd2VkIGJ5IGFsbAorQHNhbXB7LnJkYXRhfSBpbnB1dCBzZWN0aW9ucy4KKworWW91IGNhbiBzcGVjaWZ5IGEgZmlsZSBuYW1lIHRvIGluY2x1ZGUgc2VjdGlvbnMgZnJvbSBhIHBhcnRpY3VsYXIgZmlsZS4KK1lvdSB3b3VsZCBkbyB0aGlzIGlmIG9uZSBvciBtb3JlIG9mIHlvdXIgZmlsZXMgY29udGFpbiBzcGVjaWFsIGRhdGEgdGhhdAorbmVlZHMgdG8gYmUgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIG1lbW9yeS4gIEZvciBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorZGF0YS5vKC5kYXRhKQorQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgeW91IHVzZSBhIGZpbGUgbmFtZSB3aXRob3V0IGEgbGlzdCBvZiBzZWN0aW9ucywgdGhlbiBhbGwgc2VjdGlvbnMgaW4KK3RoZSBpbnB1dCBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhpcyBpcyBub3QKK2NvbW1vbmx5IGRvbmUsIGJ1dCBpdCBtYXkgYnkgdXNlZnVsIG9uIG9jY2FzaW9uLiAgRm9yIGV4YW1wbGU6CitAc21hbGxleGFtcGxlCitkYXRhLm8KK0BlbmQgc21hbGxleGFtcGxlCisKK1doZW4geW91IHVzZSBhIGZpbGUgbmFtZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGFueSB3aWxkIGNhcmQKK2NoYXJhY3RlcnMsIHRoZSBsaW5rZXIgd2lsbCBmaXJzdCBzZWUgaWYgeW91IGFsc28gc3BlY2lmaWVkIHRoZSBmaWxlCituYW1lIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIG9yIGluIGFuIEBjb2Rle0lOUFVUfSBjb21tYW5kLiAgSWYgeW91CitkaWQgbm90LCB0aGUgbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIGFzIGFuIGlucHV0IGZpbGUsIGFzCit0aG91Z2ggaXQgYXBwZWFyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBhbgorQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIG5vdCBzZWFyY2ggZm9yIHRoZSBmaWxlIGluCit0aGUgYXJjaGl2ZSBzZWFyY2ggcGF0aC4KKworQG5vZGUgSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMKK0BzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gd2lsZGNhcmQgcGF0dGVybnMKK0BjaW5kZXggaW5wdXQgc2VjdGlvbiB3aWxkY2FyZHMKK0BjaW5kZXggd2lsZGNhcmQgZmlsZSBuYW1lIHBhdHRlcm5zCitAY2luZGV4IGZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucworQGNpbmRleCBzZWN0aW9uIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMKK0luIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24sIGVpdGhlciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBzZWN0aW9uCituYW1lIG9yIGJvdGggbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLgorCitUaGUgZmlsZSBuYW1lIG9mIEBzYW1weyp9IHNlZW4gaW4gbWFueSBleGFtcGxlcyBpcyBhIHNpbXBsZSB3aWxkY2FyZAorcGF0dGVybiBmb3IgdGhlIGZpbGUgbmFtZS4KKworVGhlIHdpbGRjYXJkIHBhdHRlcm5zIGFyZSBsaWtlIHRob3NlIHVzZWQgYnkgdGhlIFVuaXggc2hlbGwuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gKgorbWF0Y2hlcyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMKK0BpdGVtID8KK21hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIKK0BpdGVtIFtAdmFye2NoYXJzfV0KK21hdGNoZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW55IG9mIHRoZSBAdmFye2NoYXJzfTsgdGhlIEBzYW1wey19CitjaGFyYWN0ZXIgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMsIGFzIGluCitAc2FtcHtbYS16XX0gdG8gbWF0Y2ggYW55IGxvd2VyIGNhc2UgbGV0dGVyCitAaXRlbSBcCitxdW90ZXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIKK0BlbmQgdGFibGUKKworV2hlbiBhIGZpbGUgbmFtZSBpcyBtYXRjaGVkIHdpdGggYSB3aWxkY2FyZCwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKK3dpbGwgbm90IG1hdGNoIGEgQHNhbXB7L30gY2hhcmFjdGVyICh1c2VkIHRvIHNlcGFyYXRlIGRpcmVjdG9yeSBuYW1lcyBvbgorVW5peCkuICBBIHBhdHRlcm4gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBAc2FtcHsqfSBjaGFyYWN0ZXIgaXMgYW4KK2V4Y2VwdGlvbjsgaXQgd2lsbCBhbHdheXMgbWF0Y2ggYW55IGZpbGUgbmFtZSwgd2hldGhlciBpdCBjb250YWlucyBhCitAc2FtcHsvfSBvciBub3QuICBJbiBhIHNlY3Rpb24gbmFtZSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgd2lsbCBtYXRjaAorYSBAc2FtcHsvfSBjaGFyYWN0ZXIuCisKK0ZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucyBvbmx5IG1hdGNoIGZpbGVzIHdoaWNoIGFyZSBleHBsaWNpdGx5CitzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhbiBAY29kZXtJTlBVVH0gY29tbWFuZC4gIFRoZSBsaW5rZXIKK2RvZXMgbm90IHNlYXJjaCBkaXJlY3RvcmllcyB0byBleHBhbmQgd2lsZGNhcmRzLgorCitJZiBhIGZpbGUgbmFtZSBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgcGF0dGVybiwgb3IgaWYgYSBmaWxlIG5hbWUKK2FwcGVhcnMgZXhwbGljaXRseSBhbmQgaXMgYWxzbyBtYXRjaGVkIGJ5IGEgd2lsZGNhcmQgcGF0dGVybiwgdGhlIGxpbmtlcgord2lsbCB1c2UgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgRm9yIGV4YW1wbGUsIHRoaXMKK3NlcXVlbmNlIG9mIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGlzIHByb2JhYmx5IGluIGVycm9yLCBiZWNhdXNlIHRoZQorQGZpbGV7ZGF0YS5vfSBydWxlIHdpbGwgbm90IGJlIHVzZWQ6CitAc21hbGxleGFtcGxlCisuZGF0YSA6IEB7ICooLmRhdGEpIEB9CisuZGF0YTEgOiBAeyBkYXRhLm8oLmRhdGEpIEB9CitAZW5kIHNtYWxsZXhhbXBsZQorCitAY2luZGV4IFNPUlQKK05vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgZmlsZXMgYW5kIHNlY3Rpb25zIG1hdGNoZWQgYnkgd2lsZGNhcmRzCitpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc2VlbiBkdXJpbmcgdGhlIGxpbmsuICBZb3UgY2FuIGNoYW5nZQordGhpcyBieSB1c2luZyB0aGUgQGNvZGV7U09SVH0ga2V5d29yZCwgd2hpY2ggYXBwZWFycyBiZWZvcmUgYSB3aWxkY2FyZAorcGF0dGVybiBpbiBwYXJlbnRoZXNlcyAoZS5nLiwgQGNvZGV7U09SVCgudGV4dCopfSkuICBXaGVuIHRoZQorQGNvZGV7U09SVH0ga2V5d29yZCBpcyB1c2VkLCB0aGUgbGlua2VyIHdpbGwgc29ydCB0aGUgZmlsZXMgb3Igc2VjdGlvbnMKK2ludG8gYXNjZW5kaW5nIG9yZGVyIGJ5IG5hbWUgYmVmb3JlIHBsYWNpbmcgdGhlbSBpbiB0aGUgb3V0cHV0IGZpbGUuCisKK0lmIHlvdSBldmVyIGdldCBjb25mdXNlZCBhYm91dCB3aGVyZSBpbnB1dCBzZWN0aW9ucyBhcmUgZ29pbmcsIHVzZSB0aGUKK0BzYW1wey1NfSBsaW5rZXIgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFwIGZpbGUuICBUaGUgbWFwIGZpbGUgc2hvd3MKK3ByZWNpc2VseSBob3cgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMuCisKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgd2lsZGNhcmQgcGF0dGVybnMgbWlnaHQgYmUgdXNlZCB0byBwYXJ0aXRpb24KK2ZpbGVzLiAgVGhpcyBsaW5rZXIgc2NyaXB0IGRpcmVjdHMgdGhlIGxpbmtlciB0byBwbGFjZSBhbGwgQHNhbXB7LnRleHR9CitzZWN0aW9ucyBpbiBAc2FtcHsudGV4dH0gYW5kIGFsbCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbiBAc2FtcHsuYnNzfS4KK1RoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gZnJvbSBhbGwgZmlsZXMgYmVnaW5uaW5nCit3aXRoIGFuIHVwcGVyIGNhc2UgY2hhcmFjdGVyIGluIEBzYW1wey5EQVRBfTsgZm9yIGFsbCBvdGhlciBmaWxlcywgdGhlCitsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gaW4gQHNhbXB7LmRhdGF9LgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitTRUNUSU9OUyBAeworICAudGV4dCA6IEB7ICooLnRleHQpIEB9CisgIC5EQVRBIDogQHsgW0EtWl0qKC5kYXRhKSBAfQorICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9CisgIC5ic3MgOiBAeyAqKC5ic3MpIEB9CitAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgSW5wdXQgU2VjdGlvbiBDb21tb24KK0BzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCitAY2luZGV4IGNvbW1vbiBzeW1ib2wgcGxhY2VtZW50CitAY2luZGV4IHVuaW5pdGlhbGl6ZWQgZGF0YSBwbGFjZW1lbnQKK0Egc3BlY2lhbCBub3RhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBzeW1ib2xzLCBiZWNhdXNlIGluIG1hbnkgb2JqZWN0CitmaWxlIGZvcm1hdHMgY29tbW9uIHN5bWJvbHMgZG8gbm90IGhhdmUgYSBwYXJ0aWN1bGFyIGlucHV0IHNlY3Rpb24uICBUaGUKK2xpbmtlciB0cmVhdHMgY29tbW9uIHN5bWJvbHMgYXMgdGhvdWdoIHRoZXkgYXJlIGluIGFuIGlucHV0IHNlY3Rpb24KK25hbWVkIEBzYW1we0NPTU1PTn0uCisKK1lvdSBtYXkgdXNlIGZpbGUgbmFtZXMgd2l0aCB0aGUgQHNhbXB7Q09NTU9OfSBzZWN0aW9uIGp1c3QgYXMgd2l0aCBhbnkKK290aGVyIGlucHV0IHNlY3Rpb25zLiAgWW91IGNhbiB1c2UgdGhpcyB0byBwbGFjZSBjb21tb24gc3ltYm9scyBmcm9tIGEKK3BhcnRpY3VsYXIgaW5wdXQgZmlsZSBpbiBvbmUgc2VjdGlvbiB3aGlsZSBjb21tb24gc3ltYm9scyBmcm9tIG90aGVyCitpbnB1dCBmaWxlcyBhcmUgcGxhY2VkIGluIGFub3RoZXIgc2VjdGlvbi4KKworSW4gbW9zdCBjYXNlcywgY29tbW9uIHN5bWJvbHMgaW4gaW5wdXQgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlCitAc2FtcHsuYnNzfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZvciBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorLmJzcyBAeyAqKC5ic3MpICooQ09NTU9OKSBAfQorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNpbmRleCBzY29tbW9uIHNlY3Rpb24KK0BjaW5kZXggc21hbGwgY29tbW9uIHN5bWJvbHMKK1NvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBjb21tb24gc3ltYm9sLiAgRm9yCitleGFtcGxlLCB0aGUgTUlQUyBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IGRpc3Rpbmd1aXNoZXMgc3RhbmRhcmQgY29tbW9uCitzeW1ib2xzIGFuZCBzbWFsbCBjb21tb24gc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgdGhlIGxpbmtlciB3aWxsIHVzZSBhCitkaWZmZXJlbnQgc3BlY2lhbCBzZWN0aW9uIG5hbWUgZm9yIG90aGVyIHR5cGVzIG9mIGNvbW1vbiBzeW1ib2xzLiAgSW4KK3RoZSBjYXNlIG9mIE1JUFMgRUxGLCB0aGUgbGlua2VyIHVzZXMgQHNhbXB7Q09NTU9OfSBmb3Igc3RhbmRhcmQgY29tbW9uCitzeW1ib2xzIGFuZCBAc2FtcHsuc2NvbW1vbn0gZm9yIHNtYWxsIGNvbW1vbiBzeW1ib2xzLiAgVGhpcyBwZXJtaXRzIHlvdQordG8gbWFwIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY29tbW9uIHN5bWJvbHMgaW50byBtZW1vcnkgYXQgZGlmZmVyZW50Citsb2NhdGlvbnMuCisKK0BjaW5kZXggW0NPTU1PTl0KK1lvdSB3aWxsIHNvbWV0aW1lcyBzZWUgQHNhbXB7W0NPTU1PTl19IGluIG9sZCBsaW5rZXIgc2NyaXB0cy4gIFRoaXMKK25vdGF0aW9uIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiAgSXQgaXMgZXF1aXZhbGVudCB0bworQHNhbXB7KihDT01NT04pfS4KKworQG5vZGUgSW5wdXQgU2VjdGlvbiBLZWVwCitAc3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KK0BjaW5kZXggS0VFUAorQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KK1doZW4gbGluay10aW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBpbiB1c2UgKEBzYW1wey0tZ2Mtc2VjdGlvbnN9KSwKK2l0IGlzIG9mdGVuIHVzZWZ1bCB0byBtYXJrIHNlY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBlbGltaW5hdGVkLiAKK1RoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHN1cnJvdW5kaW5nIGFuIGlucHV0IHNlY3Rpb24ncyB3aWxkY2FyZCBlbnRyeQord2l0aCBAY29kZXtLRUVQKCl9LCBhcyBpbiBAY29kZXtLRUVQKCooLmluaXQpKX0gb3IKK0Bjb2Rle0tFRVAoU09SVCgqKSguY3RvcnMpKX0uCisKK0Bub2RlIElucHV0IFNlY3Rpb24gRXhhbXBsZQorQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBleGFtcGxlCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgYSBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LiAgSXQgdGVsbHMgdGhlIGxpbmtlcgordG8gcmVhZCBhbGwgb2YgdGhlIHNlY3Rpb25zIGZyb20gZmlsZSBAZmlsZXthbGwub30gYW5kIHBsYWNlIHRoZW0gYXQgdGhlCitzdGFydCBvZiBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXRhfSB3aGljaCBzdGFydHMgYXQgbG9jYXRpb24KK0BzYW1wezB4MTAwMDB9LiAgQWxsIG9mIHNlY3Rpb24gQHNhbXB7LmlucHV0MX0gZnJvbSBmaWxlIEBmaWxle2Zvby5vfQorZm9sbG93cyBpbW1lZGlhdGVseSwgaW4gdGhlIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBBbGwgb2Ygc2VjdGlvbgorQHNhbXB7LmlucHV0Mn0gZnJvbSBAZmlsZXtmb28ub30gZ29lcyBpbnRvIG91dHB1dCBzZWN0aW9uCitAc2FtcHtvdXRwdXRifSwgZm9sbG93ZWQgYnkgc2VjdGlvbiBAc2FtcHsuaW5wdXQxfSBmcm9tIEBmaWxle2ZvbzEub30uCitBbGwgb2YgdGhlIHJlbWFpbmluZyBAc2FtcHsuaW5wdXQxfSBhbmQgQHNhbXB7LmlucHV0Mn0gc2VjdGlvbnMgZnJvbSBhbnkKK2ZpbGVzIGFyZSB3cml0dGVuIHRvIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dGN9LgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK1NFQ1RJT05TIEB7CisgIG91dHB1dGEgMHgxMDAwMCA6CisgICAgQHsKKyAgICBhbGwubworICAgIGZvby5vICguaW5wdXQxKQorICAgIEB9CisgIG91dHB1dGIgOgorICAgIEB7CisgICAgZm9vLm8gKC5pbnB1dDIpCisgICAgZm9vMS5vICguaW5wdXQxKQorICAgIEB9CisgIG91dHB1dGMgOgorICAgIEB7CisgICAgKiguaW5wdXQxKQorICAgICooLmlucHV0MikKKyAgICBAfQorQH0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlICAgICAgICAKKworQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGF0YQorQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGF0YQorQGNpbmRleCBkYXRhCitAY2luZGV4IHNlY3Rpb24gZGF0YQorQGNpbmRleCBvdXRwdXQgc2VjdGlvbiBkYXRhCitAa2luZGV4IEJZVEUoQHZhcntleHByZXNzaW9ufSkKK0BraW5kZXggU0hPUlQoQHZhcntleHByZXNzaW9ufSkKK0BraW5kZXggTE9ORyhAdmFye2V4cHJlc3Npb259KQorQGtpbmRleCBRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCitAa2luZGV4IFNRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCitZb3UgY2FuIGluY2x1ZGUgZXhwbGljaXQgYnl0ZXMgb2YgZGF0YSBpbiBhbiBvdXRwdXQgc2VjdGlvbiBieSB1c2luZworQGNvZGV7QllURX0sIEBjb2Rle1NIT1JUfSwgQGNvZGV7TE9OR30sIEBjb2Rle1FVQUR9LCBvciBAY29kZXtTUVVBRH0gYXMKK2FuIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQuICBFYWNoIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiBpbgorcGFyZW50aGVzZXMgcHJvdmlkaW5nIHRoZSB2YWx1ZSB0byBzdG9yZSAoQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGUKK3ZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHN0b3JlZCBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KK2NvdW50ZXIuCisKK1RoZSBAY29kZXtCWVRFfSwgQGNvZGV7U0hPUlR9LCBAY29kZXtMT05HfSwgYW5kIEBjb2Rle1FVQUR9IGNvbW1hbmRzCitzdG9yZSBvbmUsIHR3bywgZm91ciwgYW5kIGVpZ2h0IGJ5dGVzIChyZXNwZWN0aXZlbHkpLiAgQWZ0ZXIgc3RvcmluZyB0aGUKK2J5dGVzLCB0aGUgbG9jYXRpb24gY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzCitzdG9yZWQuCisKK0ZvciBleGFtcGxlLCB0aGlzIHdpbGwgc3RvcmUgdGhlIGJ5dGUgMSBmb2xsb3dlZCBieSB0aGUgZm91ciBieXRlIHZhbHVlCitvZiB0aGUgc3ltYm9sIEBzYW1we2FkZHJ9OgorQHNtYWxsZXhhbXBsZQorQllURSgxKQorTE9ORyhhZGRyKQorQGVuZCBzbWFsbGV4YW1wbGUKKworV2hlbiB1c2luZyBhIDY0IGJpdCBob3N0IG9yIHRhcmdldCwgQGNvZGV7UVVBRH0gYW5kIEBjb2Rle1NRVUFEfSBhcmUgdGhlCitzYW1lOyB0aGV5IGJvdGggc3RvcmUgYW4gOCBieXRlLCBvciA2NCBiaXQsIHZhbHVlLiAgV2hlbiBib3RoIGhvc3QgYW5kCit0YXJnZXQgYXJlIDMyIGJpdHMsIGFuIGV4cHJlc3Npb24gaXMgY29tcHV0ZWQgYXMgMzIgYml0cy4gIEluIHRoaXMgY2FzZQorQGNvZGV7UVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHplcm8gZXh0ZW5kZWQgdG8gNjQgYml0cywgYW5kCitAY29kZXtTUVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHNpZ24gZXh0ZW5kZWQgdG8gNjQgYml0cy4KKworSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4cGxpY2l0IGVuZGlhbm5lc3MsCit3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0IGVuZGlhbm5lc3MuCitXaGVuIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBlbmRpYW5uZXNzLCBhcyBpcwordHJ1ZSBvZiwgZm9yIGV4YW1wbGUsIFMtcmVjb3JkcywgdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZQorZW5kaWFubmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgb2JqZWN0IGZpbGUuCisKK0BraW5kZXggRklMTChAdmFye2V4cHJlc3Npb259KQorQGNpbmRleCBob2xlcywgZmlsbGluZworQGNpbmRleCB1bnNwZWNpZmllZCBtZW1vcnkKK1lvdSBtYXkgdXNlIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kIHRvIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciB0aGUKK2N1cnJlbnQgc2VjdGlvbi4gIEl0IGlzIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuICBBbnkKK290aGVyd2lzZSB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeSB3aXRoaW4gdGhlIHNlY3Rpb24gKGZvciBleGFtcGxlLAorZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIGlucHV0IHNlY3Rpb25zKSBhcmUgZmlsbGVkCit3aXRoIHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIGV4cHJlc3Npb24sIHJlcGVhdGVkIGFzCituZWNlc3NhcnkuICBBIEBjb2Rle0ZJTEx9IHN0YXRlbWVudCBjb3ZlcnMgbWVtb3J5IGxvY2F0aW9ucyBhZnRlciB0aGUKK3BvaW50IGF0IHdoaWNoIGl0IG9jY3VycyBpbiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uOyBieSBpbmNsdWRpbmcgbW9yZQordGhhbiBvbmUgQGNvZGV7RklMTH0gc3RhdGVtZW50LCB5b3UgY2FuIGhhdmUgZGlmZmVyZW50IGZpbGwgcGF0dGVybnMgaW4KK2RpZmZlcmVudCBwYXJ0cyBvZiBhbiBvdXRwdXQgc2VjdGlvbi4KKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBmaWxsIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5IHdpdGggdGhlCit2YWx1ZSBAc2FtcHsweDkwOTB9OgorQHNtYWxsZXhhbXBsZQorRklMTCgweDkwOTApCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgQGNvZGV7RklMTH0gY29tbWFuZCBpcyBzaW1pbGFyIHRvIHRoZSBAc2FtcHs9QHZhcntmaWxsZXhwfX0gb3V0cHV0CitzZWN0aW9uIGF0dHJpYnV0ZSAoQHB4cmVme091dHB1dCBTZWN0aW9uIEZpbGx9KSwgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUKK3BhcnQgb2YgdGhlIHNlY3Rpb24gZm9sbG93aW5nIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKK2VudGlyZSBzZWN0aW9uLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgdGFrZXMKK3ByZWNlZGVuY2UuCisKK0Bub2RlIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzCitAc3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcworVGhlcmUgYXJlIGEgY291cGxlIG9mIGtleXdvcmRzIHdoaWNoIGNhbiBhcHBlYXIgYXMgb3V0cHV0IHNlY3Rpb24KK2NvbW1hbmRzLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggQ1JFQVRFX09CSkVDVF9TWU1CT0xTCitAY2luZGV4IGlucHV0IGZpbGVuYW1lIHN5bWJvbHMKK0BjaW5kZXggZmlsZW5hbWUgc3ltYm9scworQGl0ZW0gQ1JFQVRFX09CSkVDVF9TWU1CT0xTCitUaGUgY29tbWFuZCB0ZWxscyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCBpbnB1dCBmaWxlLgorVGhlIG5hbWUgb2YgZWFjaCBzeW1ib2wgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dAorZmlsZS4gIFRoZSBzZWN0aW9uIG9mIGVhY2ggc3ltYm9sIHdpbGwgYmUgdGhlIG91dHB1dCBzZWN0aW9uIGluIHdoaWNoCit0aGUgQGNvZGV7Q1JFQVRFX09CSkVDVF9TWU1CT0xTfSBjb21tYW5kIGFwcGVhcnMuCisKK1RoaXMgaXMgY29udmVudGlvbmFsIGZvciB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgSXQgaXMgbm90Citub3JtYWxseSB1c2VkIGZvciBhbnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LgorCitAa2luZGV4IENPTlNUUlVDVE9SUworQGNpbmRleCBDKysgY29uc3RydWN0b3JzLCBhcnJhbmdpbmcgaW4gbGluaworQGNpbmRleCBjb25zdHJ1Y3RvcnMsIGFycmFuZ2luZyBpbiBsaW5rCitAaXRlbSBDT05TVFJVQ1RPUlMKK1doZW4gbGlua2luZyB1c2luZyB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB0aGUgbGlua2VyIHVzZXMgYW4KK3VudXN1YWwgc2V0IGNvbnN0cnVjdCB0byBzdXBwb3J0IEMrKyBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAorZGVzdHJ1Y3RvcnMuICBXaGVuIGxpbmtpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3Qgc3VwcG9ydAorYXJiaXRyYXJ5IHNlY3Rpb25zLCBzdWNoIGFzIEVDT0ZGIGFuZCBYQ09GRiwgdGhlIGxpbmtlciB3aWxsCithdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZS4KK0ZvciB0aGVzZSBvYmplY3QgZmlsZSBmb3JtYXRzLCB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIHRlbGxzIHRoZQorbGlua2VyIHRvIHBsYWNlIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVyZSB0aGUKK0Bjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBhcHBlYXJzLiAgVGhlIEBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBpcworaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KKworVGhlIHN5bWJvbCBAd3tAY29kZXtfX0NUT1JfTElTVF9ffX0gbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwKK2NvbnN0cnVjdG9ycywgYW5kIHRoZSBzeW1ib2wgQHd7QGNvZGV7X19EVE9SX0xJU1R9fSBtYXJrcyB0aGUgZW5kLiAgVGhlCitmaXJzdCB3b3JkIGluIHRoZSBsaXN0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcywgZm9sbG93ZWQgYnkgdGhlIGFkZHJlc3MKK29mIGVhY2ggY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgZm9sbG93ZWQgYnkgYSB6ZXJvIHdvcmQuICBUaGUKK2NvbXBpbGVyIG11c3QgYXJyYW5nZSB0byBhY3R1YWxseSBydW4gdGhlIGNvZGUuICBGb3IgdGhlc2Ugb2JqZWN0IGZpbGUKK2Zvcm1hdHMgQHNje2dudX0gQysrIG5vcm1hbGx5IGNhbGxzIGNvbnN0cnVjdG9ycyBmcm9tIGEgc3Vicm91dGluZQorQGNvZGV7X19tYWlufTsgYSBjYWxsIHRvIEBjb2Rle19fbWFpbn0gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCit0aGUgc3RhcnR1cCBjb2RlIGZvciBAY29kZXttYWlufS4gIEBzY3tnbnV9IEMrKyBub3JtYWxseSBydW5zCitkZXN0cnVjdG9ycyBlaXRoZXIgYnkgdXNpbmcgQGNvZGV7YXRleGl0fSwgb3IgZGlyZWN0bHkgZnJvbSB0aGUgZnVuY3Rpb24KK0Bjb2Rle2V4aXR9LgorCitGb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBzdWNoIGFzIEBjb2Rle0NPRkZ9IG9yIEBjb2Rle0VMRn0gd2hpY2ggc3VwcG9ydAorYXJiaXRyYXJ5IHNlY3Rpb24gbmFtZXMsIEBzY3tnbnV9IEMrKyB3aWxsIG5vcm1hbGx5IGFycmFuZ2UgdG8gcHV0IHRoZQorYWRkcmVzc2VzIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGludG8gdGhlIEBjb2Rley5jdG9yc30KK2FuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLiAgUGxhY2luZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGludG8geW91cgorbGlua2VyIHNjcmlwdCB3aWxsIGJ1aWxkIHRoZSBzb3J0IG9mIHRhYmxlIHdoaWNoIHRoZSBAc2N7Z251fSBDKysKK3J1bnRpbWUgY29kZSBleHBlY3RzIHRvIHNlZS4KKworQHNtYWxsZXhhbXBsZQorICAgICAgX19DVE9SX0xJU1RfXyA9IC47CisgICAgICBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKQorICAgICAgKiguY3RvcnMpCisgICAgICBMT05HKDApCisgICAgICBfX0NUT1JfRU5EX18gPSAuOworICAgICAgX19EVE9SX0xJU1RfXyA9IC47CisgICAgICBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKQorICAgICAgKiguZHRvcnMpCisgICAgICBMT05HKDApCisgICAgICBfX0RUT1JfRU5EX18gPSAuOworQGVuZCBzbWFsbGV4YW1wbGUKKworSWYgeW91IGFyZSB1c2luZyB0aGUgQHNje2dudX0gQysrIHN1cHBvcnQgZm9yIGluaXRpYWxpemF0aW9uIHByaW9yaXR5LAord2hpY2ggcHJvdmlkZXMgc29tZSBjb250cm9sIG92ZXIgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCBjb25zdHJ1Y3RvcnMKK2FyZSBydW4sIHlvdSBtdXN0IHNvcnQgdGhlIGNvbnN0cnVjdG9ycyBhdCBsaW5rIHRpbWUgdG8gZW5zdXJlIHRoYXQgdGhleQorYXJlIGV4ZWN1dGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgV2hlbiB1c2luZyB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfQorY29tbWFuZCwgdXNlIEBzYW1we1NPUlQoQ09OU1RSVUNUT1JTKX0gaW5zdGVhZC4gIFdoZW4gdXNpbmcgdGhlCitAY29kZXsuY3RvcnN9IGFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLCB1c2UgQHNhbXB7KihTT1JUKC5jdG9ycykpfSBhbmQKK0BzYW1weyooU09SVCguZHRvcnMpKX0gaW5zdGVhZCBvZiBqdXN0IEBzYW1weyooLmN0b3JzKX0gYW5kCitAc2FtcHsqKC5kdG9ycyl9LgorCitOb3JtYWxseSB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciB3aWxsIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYXV0b21hdGljYWxseSwKK2FuZCB5b3Ugd2lsbCBub3QgbmVlZCB0byBjb25jZXJuIHlvdXJzZWxmIHdpdGggdGhlbS4gIEhvd2V2ZXIsIHlvdSBtYXkKK25lZWQgdG8gY29uc2lkZXIgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgd3JpdGluZyB5b3VyIG93biBsaW5rZXIKK3NjcmlwdHMuCisKK0BlbmQgdGFibGUKKworQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZworQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZworQGNpbmRleCBkaXNjYXJkaW5nIHNlY3Rpb25zCitAY2luZGV4IHNlY3Rpb25zLCBkaXNjYXJkaW5nCitAY2luZGV4IHJlbW92aW5nIHNlY3Rpb25zCitUaGUgbGlua2VyIHdpbGwgbm90IGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiB3aGljaCBkbyBub3QgaGF2ZSBhbnkKK2NvbnRlbnRzLiAgVGhpcyBpcyBmb3IgY29udmVuaWVuY2Ugd2hlbiByZWZlcnJpbmcgdG8gaW5wdXQgc2VjdGlvbnMgdGhhdAorbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCBpbiBhbnkgb2YgdGhlIGlucHV0IGZpbGVzLiAgRm9yIGV4YW1wbGU6CitAc21hbGxleGFtcGxlCisuZm9vIEB7ICooLmZvbykgQH0KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK3dpbGwgb25seSBjcmVhdGUgYSBAc2FtcHsuZm9vfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBpcyBhCitAc2FtcHsuZm9vfSBzZWN0aW9uIGluIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgorCitJZiB5b3UgdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBhcyBhbiBvdXRwdXQKK3NlY3Rpb24gY29tbWFuZCwgc3VjaCBhcyBhIHN5bWJvbCBhc3NpZ25tZW50LCB0aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgord2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgaW5wdXQgc2VjdGlvbnMuCisKK0BjaW5kZXggL0RJU0NBUkQvCitUaGUgc3BlY2lhbCBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gbWF5IGJlIHVzZWQgdG8gZGlzY2FyZAoraW5wdXQgc2VjdGlvbnMuICBBbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFuIG91dHB1dAorc2VjdGlvbiBuYW1lZCBAc2FtcHsvRElTQ0FSRC99IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgorCitAbm9kZSBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzCitAc3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCitAY2luZGV4IG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKK1dlIHNob3dlZCBhYm92ZSB0aGF0IHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tlZAorbGlrZSB0aGlzOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwIAorQHZhcntzZWN0aW9ufSBbQHZhcnthZGRyZXNzfV0gWyhAdmFye3R5cGV9KV0gOiBbQVQoQHZhcntsbWF9KV0KKyAgQHsKKyAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9CisgICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQorICAgIEBkb3Rze30KKyAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfSA6QHZhcntwaGRyfSBAZG90c3t9XSBbPUB2YXJ7ZmlsbGV4cH1dCitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorV2UndmUgYWxyZWFkeSBkZXNjcmliZWQgQHZhcntzZWN0aW9ufSwgQHZhcnthZGRyZXNzfSwgYW5kCitAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9LiAgSW4gdGhpcyBzZWN0aW9uIHdlIHdpbGwgZGVzY3JpYmUgdGhlCityZW1haW5pbmcgc2VjdGlvbiBhdHRyaWJ1dGVzLgorCitAbWVudSAKKyogT3V0cHV0IFNlY3Rpb24gVHlwZTo6CQlPdXRwdXQgc2VjdGlvbiB0eXBlCisqIE91dHB1dCBTZWN0aW9uIExNQTo6CQlPdXRwdXQgc2VjdGlvbiBMTUEKKyogT3V0cHV0IFNlY3Rpb24gUmVnaW9uOjoJT3V0cHV0IHNlY3Rpb24gcmVnaW9uCisqIE91dHB1dCBTZWN0aW9uIFBoZHI6OgkJT3V0cHV0IHNlY3Rpb24gcGhkcgorKiBPdXRwdXQgU2VjdGlvbiBGaWxsOjoJCU91dHB1dCBzZWN0aW9uIGZpbGwKK0BlbmQgbWVudQorCitAbm9kZSBPdXRwdXQgU2VjdGlvbiBUeXBlCitAc3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiB0eXBlCitFYWNoIG91dHB1dCBzZWN0aW9uIG1heSBoYXZlIGEgdHlwZS4gIFRoZSB0eXBlIGlzIGEga2V5d29yZCBpbgorcGFyZW50aGVzZXMuICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBkZWZpbmVkOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIE5PTE9BRAorVGhlIHNlY3Rpb24gc2hvdWxkIGJlIG1hcmtlZCBhcyBub3QgbG9hZGFibGUsIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUKK2xvYWRlZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4KK0BpdGVtIERTRUNUCitAaXRlbXggQ09QWQorQGl0ZW14IElORk8KK0BpdGVteCBPVkVSTEFZCitUaGVzZSB0eXBlIG5hbWVzIGFyZSBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFuZCBhcmUKK3JhcmVseSB1c2VkLiAgVGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3Q6IHRoZSBzZWN0aW9uIHNob3VsZCBiZQorbWFya2VkIGFzIG5vdCBhbGxvY2F0YWJsZSwgc28gdGhhdCBubyBtZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB0aGUKK3NlY3Rpb24gd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uCitAZW5kIHRhYmxlCisKK0BraW5kZXggTk9MT0FECitAY2luZGV4IHByZXZlbnQgdW5uZWNlc3NhcnkgbG9hZGluZworQGNpbmRleCBsb2FkaW5nLCBwcmV2ZW50aW5nCitUaGUgbGlua2VyIG5vcm1hbGx5IHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0cHV0IHNlY3Rpb24gYmFzZWQgb24KK3RoZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBtYXAgaW50byBpdC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZwordGhlIHNlY3Rpb24gdHlwZS4gIEZvciBleGFtcGxlLCBpbiB0aGUgc2NyaXB0IHNhbXBsZSBiZWxvdywgdGhlCitAc2FtcHtST019IHNlY3Rpb24gaXMgYWRkcmVzc2VkIGF0IG1lbW9yeSBsb2NhdGlvbiBAc2FtcHswfSBhbmQgZG9lcyBub3QKK25lZWQgdG8gYmUgbG9hZGVkIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZQorQHNhbXB7Uk9NfSBzZWN0aW9uIHdpbGwgYXBwZWFyIGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUgYXMgdXN1YWwuCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK1NFQ1RJT05TIEB7CisgIFJPTSAwIChOT0xPQUQpIDogQHsgQGRvdHN7fSBAfQorICBAZG90c3t9CitAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgT3V0cHV0IFNlY3Rpb24gTE1BCitAc3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBMTUEKK0BraW5kZXggQVQoQHZhcntsbWF9KQorQGNpbmRleCBsb2FkIGFkZHJlc3MKK0BjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MKK0V2ZXJ5IHNlY3Rpb24gaGFzIGEgdmlydHVhbCBhZGRyZXNzIChWTUEpIGFuZCBhIGxvYWQgYWRkcmVzcyAoTE1BKTsgc2VlCitAcmVme0Jhc2ljIFNjcmlwdCBDb25jZXB0c30uICBUaGUgYWRkcmVzcyBleHByZXNzaW9uIHdoaWNoIG1heSBhcHBlYXIgaW4KK2FuIG91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIHNldHMgdGhlIFZNQSAoQHB4cmVme091dHB1dCBTZWN0aW9uCitBZGRyZXNzfSkuCisKK1RoZSBsaW5rZXIgd2lsbCBub3JtYWxseSBzZXQgdGhlIExNQSBlcXVhbCB0byB0aGUgVk1BLiAgWW91IGNhbiBjaGFuZ2UKK3RoYXQgYnkgdXNpbmcgdGhlIEBjb2Rle0FUfSBrZXl3b3JkLiAgVGhlIGV4cHJlc3Npb24gQHZhcntsbWF9IHRoYXQKK2ZvbGxvd3MgdGhlIEBjb2Rle0FUfSBrZXl3b3JkIHNwZWNpZmllcyB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uLgorCitAY2luZGV4IFJPTSBpbml0aWFsaXplZCBkYXRhCitAY2luZGV4IGluaXRpYWxpemVkIGRhdGEgaW4gUk9NCitUaGlzIGZlYXR1cmUgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGJ1aWxkIGEgUk9NIGltYWdlLiAgRm9yCitleGFtcGxlLCB0aGUgZm9sbG93aW5nIGxpbmtlciBzY3JpcHQgY3JlYXRlcyB0aHJlZSBvdXRwdXQgc2VjdGlvbnM6IG9uZQorY2FsbGVkIEBzYW1wey50ZXh0fSwgd2hpY2ggc3RhcnRzIGF0IEBjb2RlezB4MTAwMH0sIG9uZSBjYWxsZWQKK0BzYW1wey5tZGF0YX0sIHdoaWNoIGlzIGxvYWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbgorZXZlbiB0aG91Z2ggaXRzIFZNQSBpcyBAY29kZXsweDIwMDB9LCBhbmQgb25lIGNhbGxlZCBAc2FtcHsuYnNzfSB0byBob2xkCit1bmluaXRpYWxpemVkIGRhdGEgYXQgYWRkcmVzcyBAY29kZXsweDMwMDB9LiAgVGhlIHN5bWJvbCBAY29kZXtfZGF0YX0gaXMKK2RlZmluZWQgd2l0aCB0aGUgdmFsdWUgQGNvZGV7MHgyMDAwfSwgd2hpY2ggc2hvd3MgdGhhdCB0aGUgbG9jYXRpb24KK2NvdW50ZXIgaG9sZHMgdGhlIFZNQSB2YWx1ZSwgbm90IHRoZSBMTUEgdmFsdWUuCisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorU0VDVElPTlMKKyAgQHsKKyAgLnRleHQgMHgxMDAwIDogQHsgKigudGV4dCkgX2V0ZXh0ID0gLiA7IEB9CisgIC5tZGF0YSAweDIwMDAgOiAKKyAgICBBVCAoIEFERFIgKC50ZXh0KSArIFNJWkVPRiAoLnRleHQpICkKKyAgICBAeyBfZGF0YSA9IC4gOyAqKC5kYXRhKTsgX2VkYXRhID0gLiA7ICBAfQorICAuYnNzIDB4MzAwMCA6CisgICAgQHsgX2JzdGFydCA9IC4gOyAgKiguYnNzKSAqKENPTU1PTikgOyBfYmVuZCA9IC4gO0B9CitAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIHJ1bi10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHVzZSB3aXRoIGEgcHJvZ3JhbSBnZW5lcmF0ZWQgd2l0aAordGhpcyBsaW5rZXIgc2NyaXB0IHdvdWxkIGluY2x1ZGUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdG8gY29weQordGhlIGluaXRpYWxpemVkIGRhdGEgZnJvbSB0aGUgUk9NIGltYWdlIHRvIGl0cyBydW50aW1lIGFkZHJlc3MuICBOb3RpY2UKK2hvdyB0aGlzIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlcgorc2NyaXB0LgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK2V4dGVybiBjaGFyIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2JzdGFydCwgX2JlbmQ7CitjaGFyICpzcmMgPSAmX2V0ZXh0OworY2hhciAqZHN0ID0gJl9kYXRhOworCisvKiBST00gaGFzIGRhdGEgYXQgZW5kIG9mIHRleHQ7IGNvcHkgaXQuICovCit3aGlsZSAoZHN0IDwgJl9lZGF0YSkgQHsKKyAgKmRzdCsrID0gKnNyYysrOworQH0KKworLyogWmVybyBic3MgKi8KK2ZvciAoZHN0ID0gJl9ic3RhcnQ7IGRzdDwgJl9iZW5kOyBkc3QrKykKKyAgKmRzdCA9IDA7CitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9kZSBPdXRwdXQgU2VjdGlvbiBSZWdpb24KK0BzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHJlZ2lvbgorQGtpbmRleCA+QHZhcntyZWdpb259CitAY2luZGV4IHNlY3Rpb24sIGFzc2lnbmluZyB0byBtZW1vcnkgcmVnaW9uCitAY2luZGV4IG1lbW9yeSByZWdpb25zIGFuZCBzZWN0aW9ucworWW91IGNhbiBhc3NpZ24gYSBzZWN0aW9uIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHJlZ2lvbiBvZiBtZW1vcnkgYnkKK3VzaW5nIEBzYW1wez5AdmFye3JlZ2lvbn19LiAgQHhyZWZ7TUVNT1JZfS4KKworSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitNRU1PUlkgQHsgcm9tIDogT1JJR0lOID0gMHgxMDAwLCBMRU5HVEggPSAweDEwMDAgQH0KK1NFQ1RJT05TIEB7IFJPTSA6IEB7ICooLnRleHQpIEB9ID5yb20gQH0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIE91dHB1dCBTZWN0aW9uIFBoZHIKK0BzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHBoZHIKK0BraW5kZXggOkB2YXJ7cGhkcn0KK0BjaW5kZXggc2VjdGlvbiwgYXNzaWduaW5nIHRvIHByb2dyYW0gaGVhZGVyCitAY2luZGV4IHByb2dyYW0gaGVhZGVycyBhbmQgc2VjdGlvbnMKK1lvdSBjYW4gYXNzaWduIGEgc2VjdGlvbiB0byBhIHByZXZpb3VzbHkgZGVmaW5lZCBwcm9ncmFtIHNlZ21lbnQgYnkKK3VzaW5nIEBzYW1wezpAdmFye3BoZHJ9fS4gIEB4cmVme1BIRFJTfS4gIElmIGEgc2VjdGlvbiBpcyBhc3NpZ25lZCB0bworb25lIG9yIG1vcmUgc2VnbWVudHMsIHRoZW4gYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGVkIHNlY3Rpb25zIHdpbGwgYmUKK2Fzc2lnbmVkIHRvIHRob3NlIHNlZ21lbnRzIGFzIHdlbGwsIHVubGVzcyB0aGV5IHVzZSBhbiBleHBsaWNpdGx5CitAY29kZXs6QHZhcntwaGRyfX0gbW9kaWZpZXIuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gdGVsbCB0aGUKK2xpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueSBzZWdtZW50IGF0IGFsbC4KKworSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitQSERSUyBAeyB0ZXh0IFBUX0xPQUQgOyBAfQorU0VDVElPTlMgQHsgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dCBAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgT3V0cHV0IFNlY3Rpb24gRmlsbAorQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZmlsbAorQGtpbmRleCA9QHZhcntmaWxsZXhwfQorQGNpbmRleCBzZWN0aW9uIGZpbGwgcGF0dGVybgorQGNpbmRleCBmaWxsIHBhdHRlcm4sIGVudGlyZSBzZWN0aW9uCitZb3UgY2FuIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciBhbiBlbnRpcmUgc2VjdGlvbiBieSB1c2luZworQHNhbXB7PUB2YXJ7ZmlsbGV4cH19LiAgQHZhcntmaWxsZXhwfSBpcyBhbiBleHByZXNzaW9uCisoQHB4cmVme0V4cHJlc3Npb25zfSkuICBBbnkgb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5Cit3aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uIChmb3IgZXhhbXBsZSwgZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQKK2FsaWdubWVudCBvZiBpbnB1dCBzZWN0aW9ucykgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvIGxlYXN0CitzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgdmFsdWUsIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KKworWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgZmlsbCB2YWx1ZSB3aXRoIGEgQGNvZGV7RklMTH0gY29tbWFuZCBpbiB0aGUKK291dHB1dCBzZWN0aW9uIGNvbW1hbmRzOyBzZWUgQHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfS4KKworSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitTRUNUSU9OUyBAeyAudGV4dCA6IEB7ICooLnRleHQpIEB9ID0weDkwOTAgQH0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIE92ZXJsYXkgRGVzY3JpcHRpb24KK0BzdWJzZWN0aW9uIE92ZXJsYXkgZGVzY3JpcHRpb24KK0BraW5kZXggT1ZFUkxBWQorQGNpbmRleCBvdmVybGF5cworQW4gb3ZlcmxheSBkZXNjcmlwdGlvbiBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBkZXNjcmliZSBzZWN0aW9ucyB3aGljaAorYXJlIHRvIGJlIGxvYWRlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIG1lbW9yeSBpbWFnZSBidXQgYXJlIHRvIGJlIHJ1biBhdAordGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MuICBBdCBydW4gdGltZSwgc29tZSBzb3J0IG9mIG92ZXJsYXkgbWFuYWdlciB3aWxsCitjb3B5IHRoZSBvdmVybGFpZCBzZWN0aW9ucyBpbiBhbmQgb3V0IG9mIHRoZSBydW50aW1lIG1lbW9yeSBhZGRyZXNzIGFzCityZXF1aXJlZCwgcGVyaGFwcyBieSBzaW1wbHkgbWFuaXB1bGF0aW5nIGFkZHJlc3NpbmcgYml0cy4gIFRoaXMgYXBwcm9hY2gKK2NhbiBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIGEgY2VydGFpbiByZWdpb24gb2YgbWVtb3J5IGlzIGZhc3RlcgordGhhbiBhbm90aGVyLgorCitPdmVybGF5cyBhcmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kLiAgVGhlCitAY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIHVzZWQgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIGxpa2UgYW4KK291dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhlIGZ1bGwgc3ludGF4IG9mIHRoZSBAY29kZXtPVkVSTEFZfQorY29tbWFuZCBpcyBhcyBmb2xsb3dzOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitPVkVSTEFZIFtAdmFye3N0YXJ0fV0gOiBbTk9DUk9TU1JFRlNdIFtBVCAoIEB2YXJ7bGRhZGRyfSApXQorICBAeworICAgIEB2YXJ7c2VjbmFtZTF9CisgICAgICBAeworICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9CisgICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KKyAgICAgICAgQGRvdHN7fQorICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQorICAgIEB2YXJ7c2VjbmFtZTJ9CisgICAgICBAeworICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9CisgICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KKyAgICAgICAgQGRvdHN7fQorICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQorICAgIEBkb3Rze30KKyAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0V2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwgZXhjZXB0IEBjb2Rle09WRVJMQVl9IChhIGtleXdvcmQpLCBhbmQgZWFjaAorc2VjdGlvbiBtdXN0IGhhdmUgYSBuYW1lIChAdmFye3NlY25hbWUxfSBhbmQgQHZhcntzZWNuYW1lMn0gYWJvdmUpLiAgVGhlCitzZWN0aW9uIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0gY29uc3RydWN0IGFyZSBpZGVudGljYWwgdG8KK3Rob3NlIHdpdGhpbiB0aGUgZ2VuZXJhbCBAY29kZXtTRUNUSU9OU30gY29udHJ1Y3QgKEBweHJlZntTRUNUSU9OU30pLAorZXhjZXB0IHRoYXQgbm8gYWRkcmVzc2VzIGFuZCBubyBtZW1vcnkgcmVnaW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IKK3NlY3Rpb25zIHdpdGhpbiBhbiBAY29kZXtPVkVSTEFZfS4KKworVGhlIHNlY3Rpb25zIGFyZSBhbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHN0YXJ0aW5nIGFkZHJlc3MuICBUaGUgbG9hZAorYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyBhcmUgYXJyYW5nZWQgc3VjaCB0aGF0IHRoZXkgYXJlIGNvbnNlY3V0aXZlIGluCittZW1vcnkgc3RhcnRpbmcgYXQgdGhlIGxvYWQgYWRkcmVzcyB1c2VkIGZvciB0aGUgQGNvZGV7T1ZFUkxBWX0gYXMgYQord2hvbGUgKGFzIHdpdGggbm9ybWFsIHNlY3Rpb24gZGVmaW5pdGlvbnMsIHRoZSBsb2FkIGFkZHJlc3MgaXMgb3B0aW9uYWwsCithbmQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IGFkZHJlc3M7IHRoZSBzdGFydCBhZGRyZXNzIGlzIGFsc28gb3B0aW9uYWwsCithbmQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIpLgorCitJZiB0aGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGtleXdvcmQgaXMgdXNlZCwgYW5kIHRoZXJlIGFueSByZWZlcmVuY2VzCithbW9uZyB0aGUgc2VjdGlvbnMsIHRoZSBsaW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuICBTaW5jZSB0aGUgc2VjdGlvbnMKK2FsbCBydW4gYXQgdGhlIHNhbWUgYWRkcmVzcywgaXQgbm9ybWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3Igb25lCitzZWN0aW9uIHRvIHJlZmVyIGRpcmVjdGx5IHRvIGFub3RoZXIuICBAeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzLAorTk9DUk9TU1JFRlN9LgorCitGb3IgZWFjaCBzZWN0aW9uIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0sIHRoZSBsaW5rZXIgYXV0b21hdGljYWxseQorZGVmaW5lcyB0d28gc3ltYm9scy4gIFRoZSBzeW1ib2wgQGNvZGV7X19sb2FkX3N0YXJ0X0B2YXJ7c2VjbmFtZX19IGlzCitkZWZpbmVkIGFzIHRoZSBzdGFydGluZyBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uICBUaGUgc3ltYm9sCitAY29kZXtfX2xvYWRfc3RvcF9AdmFye3NlY25hbWV9fSBpcyBkZWZpbmVkIGFzIHRoZSBmaW5hbCBsb2FkIGFkZHJlc3Mgb2YKK3RoZSBzZWN0aW9uLiAgQW55IGNoYXJhY3RlcnMgd2l0aGluIEB2YXJ7c2VjbmFtZX0gd2hpY2ggYXJlIG5vdCBsZWdhbAord2l0aGluIEMgaWRlbnRpZmllcnMgYXJlIHJlbW92ZWQuICBDIChvciBhc3NlbWJsZXIpIGNvZGUgbWF5IHVzZSB0aGVzZQorc3ltYm9scyB0byBtb3ZlIHRoZSBvdmVybGFpZCBzZWN0aW9ucyBhcm91bmQgYXMgbmVjZXNzYXJ5LgorCitBdCB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgc2V0IHRvCit0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgb3ZlcmxheSBwbHVzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHNlY3Rpb24uCisKK0hlcmUgaXMgYW4gZXhhbXBsZS4gIFJlbWVtYmVyIHRoYXQgdGhpcyB3b3VsZCBhcHBlYXIgaW5zaWRlIGEKK0Bjb2Rle1NFQ1RJT05TfSBjb25zdHJ1Y3QuCitAc21hbGxleGFtcGxlCitAZ3JvdXAKKyAgT1ZFUkxBWSAweDEwMDAgOiBBVCAoMHg0MDAwKQorICAgQHsKKyAgICAgLnRleHQwIEB7IG8xLyoubygudGV4dCkgQH0KKyAgICAgLnRleHQxIEB7IG8yLyoubygudGV4dCkgQH0KKyAgIEB9CitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorQG5vaW5kZW50CitUaGlzIHdpbGwgZGVmaW5lIGJvdGggQHNhbXB7LnRleHQwfSBhbmQgQHNhbXB7LnRleHQxfSB0byBzdGFydCBhdAorYWRkcmVzcyAweDEwMDAuICBAc2FtcHsudGV4dDB9IHdpbGwgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHg0MDAwLCBhbmQKK0BzYW1wey50ZXh0MX0gd2lsbCBiZSBsb2FkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgQHNhbXB7LnRleHQwfS4gIFRoZQorZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkOiBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDB9LAorQGNvZGV7X19sb2FkX3N0b3BfdGV4dDB9LCBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDF9LAorQGNvZGV7X19sb2FkX3N0b3BfdGV4dDF9LgorCitDIGNvZGUgdG8gY29weSBvdmVybGF5IEBjb2Rley50ZXh0MX0gaW50byB0aGUgb3ZlcmxheSBhcmVhIG1pZ2h0IGxvb2sKK2xpa2UgdGhlIGZvbGxvd2luZy4KKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCisgIGV4dGVybiBjaGFyIF9fbG9hZF9zdGFydF90ZXh0MSwgX19sb2FkX3N0b3BfdGV4dDE7CisgIG1lbWNweSAoKGNoYXIgKikgMHgxMDAwLCAmX19sb2FkX3N0YXJ0X3RleHQxLAorICAgICAgICAgICZfX2xvYWRfc3RvcF90ZXh0MSAtICZfX2xvYWRfc3RhcnRfdGV4dDEpOworQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworTm90ZSB0aGF0IHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIGp1c3Qgc3ludGFjdGljIHN1Z2FyLCBzaW5jZQorZXZlcnl0aGluZyBpdCBkb2VzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBtb3JlIGJhc2ljIGNvbW1hbmRzLiAgVGhlIGFib3ZlCitleGFtcGxlIGNvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGlkZW50aWNhbGx5IGFzIGZvbGxvd3MuCisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorICAudGV4dDAgMHgxMDAwIDogQVQgKDB4NDAwMCkgQHsgbzEvKi5vKC50ZXh0KSBAfQorICBfX2xvYWRfc3RhcnRfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKTsKKyAgX19sb2FkX3N0b3BfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKSArIFNJWkVPRiAoLnRleHQwKTsKKyAgLnRleHQxIDB4MTAwMCA6IEFUICgweDQwMDAgKyBTSVpFT0YgKC50ZXh0MCkpIEB7IG8yLyoubygudGV4dCkgQH0KKyAgX19sb2FkX3N0YXJ0X3RleHQxID0gTE9BREFERFIgKC50ZXh0MSk7CisgIF9fbG9hZF9zdG9wX3RleHQxID0gTE9BREFERFIgKC50ZXh0MSkgKyBTSVpFT0YgKC50ZXh0MSk7CisgIC4gPSAweDEwMDAgKyBNQVggKFNJWkVPRiAoLnRleHQwKSwgU0laRU9GICgudGV4dDEpKTsKK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIE1FTU9SWQorQHNlY3Rpb24gTUVNT1JZIGNvbW1hbmQKK0BraW5kZXggTUVNT1JZCitAY2luZGV4IG1lbW9yeSByZWdpb25zCitAY2luZGV4IHJlZ2lvbnMgb2YgbWVtb3J5CitAY2luZGV4IGFsbG9jYXRpbmcgbWVtb3J5CitAY2luZGV4IGRpc2NvbnRpbnVvdXMgbWVtb3J5CitUaGUgbGlua2VyJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBlcm1pdHMgYWxsb2NhdGlvbiBvZiBhbGwgYXZhaWxhYmxlCittZW1vcnkuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZC4KKworVGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIGJsb2NrcyBvZgorbWVtb3J5IGluIHRoZSB0YXJnZXQuICBZb3UgY2FuIHVzZSBpdCB0byBkZXNjcmliZSB3aGljaCBtZW1vcnkgcmVnaW9ucworbWF5IGJlIHVzZWQgYnkgdGhlIGxpbmtlciwgYW5kIHdoaWNoIG1lbW9yeSByZWdpb25zIGl0IG11c3QgYXZvaWQuICBZb3UKK2NhbiB0aGVuIGFzc2lnbiBzZWN0aW9ucyB0byBwYXJ0aWN1bGFyIG1lbW9yeSByZWdpb25zLiAgVGhlIGxpbmtlciB3aWxsCitzZXQgc2VjdGlvbiBhZGRyZXNzZXMgYmFzZWQgb24gdGhlIG1lbW9yeSByZWdpb25zLCBhbmQgd2lsbCB3YXJuIGFib3V0CityZWdpb25zIHRoYXQgYmVjb21lIHRvbyBmdWxsLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzaHVmZmxlIHNlY3Rpb25zCithcm91bmQgdG8gZml0IGludG8gdGhlIGF2YWlsYWJsZSByZWdpb25zLgorCitBIGxpbmtlciBzY3JpcHQgbWF5IGNvbnRhaW4gYXQgbW9zdCBvbmUgdXNlIG9mIHRoZSBAY29kZXtNRU1PUll9Citjb21tYW5kLiAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgYXMgbWFueSBibG9ja3Mgb2YgbWVtb3J5IHdpdGhpbiBpdCBhcworeW91IHdpc2guICBUaGUgc3ludGF4IGlzOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitNRU1PUlkgCisgIEB7CisgICAgQHZhcntuYW1lfSBbKEB2YXJ7YXR0cn0pXSA6IE9SSUdJTiA9IEB2YXJ7b3JpZ2lufSwgTEVOR1RIID0gQHZhcntsZW59CisgICAgQGRvdHN7fQorICBAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIEB2YXJ7bmFtZX0gaXMgYSBuYW1lIHVzZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQgdG8gcmVmZXIgdG8gdGhlCityZWdpb24uICBUaGUgcmVnaW9uIG5hbWUgaGFzIG5vIG1lYW5pbmcgb3V0c2lkZSBvZiB0aGUgbGlua2VyIHNjcmlwdC4KK1JlZ2lvbiBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgbmFtZSBzcGFjZSwgYW5kIHdpbGwgbm90IGNvbmZsaWN0Cit3aXRoIHN5bWJvbCBuYW1lcywgZmlsZSBuYW1lcywgb3Igc2VjdGlvbiBuYW1lcy4gIEVhY2ggbWVtb3J5IHJlZ2lvbgorbXVzdCBoYXZlIGEgZGlzdGluY3QgbmFtZS4KKworQGNpbmRleCBtZW1vcnkgcmVnaW9uIGF0dHJpYnV0ZXMKK1RoZSBAdmFye2F0dHJ9IHN0cmluZyBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzcGVjaWZ5Cit3aGV0aGVyIHRvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IHJlZ2lvbiBmb3IgYW4gaW5wdXQgc2VjdGlvbiB3aGljaCBpcworbm90IGV4cGxpY2l0bHkgbWFwcGVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgQXMgZGVzY3JpYmVkIGluCitAcmVme1NFQ1RJT05TfSwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBzZWN0aW9uIGZvciBzb21lIGlucHV0CitzZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcwordGhlIGlucHV0IHNlY3Rpb24uICBJZiB5b3UgZGVmaW5lIHJlZ2lvbiBhdHRyaWJ1dGVzLCB0aGUgbGlua2VyIHdpbGwgdXNlCit0aGVtIHRvIHNlbGVjdCB0aGUgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlIG91dHB1dCBzZWN0aW9uIHRoYXQgaXQgY3JlYXRlcy4KKworVGhlIEB2YXJ7YXR0cn0gc3RyaW5nIG11c3QgY29uc2lzdCBvbmx5IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gUgorUmVhZC1vbmx5IHNlY3Rpb24KK0BpdGVtIFcKK1JlYWQvd3JpdGUgc2VjdGlvbgorQGl0ZW0gWAorRXhlY3V0YWJsZSBzZWN0aW9uCitAaXRlbSBBCitBbGxvY2F0YWJsZSBzZWN0aW9uCitAaXRlbSBJCitJbml0aWFsaXplZCBzZWN0aW9uCitAaXRlbSBMCitTYW1lIGFzIEBzYW1we0l9CitAaXRlbSAhCitJbnZlcnQgdGhlIHNlbnNlIG9mIGFueSBvZiB0aGUgcHJlY2VkaW5nIGF0dHJpYnV0ZXMKK0BlbmQgdGFibGUKKworSWYgYSB1bm1hcHBlZCBzZWN0aW9uIG1hdGNoZXMgYW55IG9mIHRoZSBsaXN0ZWQgYXR0cmlidXRlcyBvdGhlciB0aGFuCitAc2FtcHshfSwgaXQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG1lbW9yeSByZWdpb24uICBUaGUgQHNhbXB7IX0KK2F0dHJpYnV0ZSByZXZlcnNlcyB0aGlzIHRlc3QsIHNvIHRoYXQgYW4gdW5tYXBwZWQgc2VjdGlvbiB3aWxsIGJlIHBsYWNlZAoraW4gdGhlIG1lbW9yeSByZWdpb24gb25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGxpc3RlZAorYXR0cmlidXRlcy4KKworQGtpbmRleCBPUklHSU4gPQorQGtpbmRleCBvID0KK0BraW5kZXggb3JnID0KK1RoZSBAdmFye29yaWdpbn0gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQorcmVnaW9uLiAgVGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkKK2FsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCB3aGljaCBtZWFucyB0aGF0IHlvdSBtYXkgbm90IHVzZSBhbnkgc2VjdGlvbgorcmVsYXRpdmUgc3ltYm9scy4gIFRoZSBrZXl3b3JkIEBjb2Rle09SSUdJTn0gbWF5IGJlIGFiYnJldmlhdGVkIHRvCitAY29kZXtvcmd9IG9yIEBjb2Rle299IChidXQgbm90LCBmb3IgZXhhbXBsZSwgQGNvZGV7T1JHfSkuCisKK0BraW5kZXggTEVOR1RIID0KK0BraW5kZXggbGVuID0KK0BraW5kZXggbCA9CitUaGUgQHZhcntsZW59IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkKK3JlZ2lvbi4gIEFzIHdpdGggdGhlIEB2YXJ7b3JpZ2lufSBleHByZXNzaW9uLCB0aGUgZXhwcmVzc2lvbiBtdXN0CitldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGUKK2tleXdvcmQgQGNvZGV7TEVOR1RIfSBtYXkgYmUgYWJicmV2aWF0ZWQgdG8gQGNvZGV7bGVufSBvciBAY29kZXtsfS4KKworSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSBzcGVjaWZ5IHRoYXQgdGhlcmUgYXJlIHR3byBtZW1vcnkgcmVnaW9ucworYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uOiBvbmUgc3RhcnRpbmcgYXQgQHNhbXB7MH0gZm9yIDI1NiBraWxvYnl0ZXMsCithbmQgdGhlIG90aGVyIHN0YXJ0aW5nIGF0IEBzYW1wezB4NDAwMDAwMDB9IGZvciBmb3VyIG1lZ2FieXRlcy4gIFRoZQorbGlua2VyIHdpbGwgcGxhY2UgaW50byB0aGUgQHNhbXB7cm9tfSBtZW1vcnkgcmVnaW9uIGV2ZXJ5IHNlY3Rpb24gd2hpY2gKK2lzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbnRvIGEgbWVtb3J5IHJlZ2lvbiwgYW5kIGlzIGVpdGhlciByZWFkLW9ubHkKK29yIGV4ZWN1dGFibGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2Ugb3RoZXIgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAorZXhwbGljaXRseSBtYXBwZWQgaW50byBhIG1lbW9yeSByZWdpb24gaW50byB0aGUgQHNhbXB7cmFtfSBtZW1vcnkKK3JlZ2lvbi4KKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCitNRU1PUlkgCisgIEB7CisgICAgcm9tIChyeCkgIDogT1JJR0lOID0gMCwgTEVOR1RIID0gMjU2SworICAgIHJhbSAoIXJ4KSA6IG9yZyA9IDB4NDAwMDAwMDAsIGwgPSA0TQorICBAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworT25jZSB5b3UgZGVmaW5lIGEgbWVtb3J5IHJlZ2lvbiwgeW91IGNhbiBkaXJlY3QgdGhlIGxpbmtlciB0byBwbGFjZQorc3BlY2lmaWMgb3V0cHV0IHNlY3Rpb25zIGludG8gdGhhdCBtZW1vcnkgcmVnaW9uIGJ5IHVzaW5nIHRoZQorQHNhbXB7PkB2YXJ7cmVnaW9ufX0gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCithIG1lbW9yeSByZWdpb24gbmFtZWQgQHNhbXB7bWVtfSwgeW91IHdvdWxkIHVzZSBAc2FtcHs+bWVtfSBpbiB0aGUKK291dHB1dCBzZWN0aW9uIGRlZmluaXRpb24uICBAeHJlZntPdXRwdXQgU2VjdGlvbiBSZWdpb259LiAgSWYgbm8gYWRkcmVzcword2FzIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIHRvCit0aGUgbmV4dCBhdmFpbGFibGUgYWRkcmVzcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24uICBJZiB0aGUgY29tYmluZWQKK291dHB1dCBzZWN0aW9ucyBkaXJlY3RlZCB0byBhIG1lbW9yeSByZWdpb24gYXJlIHRvbyBsYXJnZSBmb3IgdGhlCityZWdpb24sIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgorCitAbm9kZSBQSERSUworQHNlY3Rpb24gUEhEUlMgQ29tbWFuZAorQGtpbmRleCBQSERSUworQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMKK0BjaW5kZXggRUxGIHByb2dyYW0gaGVhZGVycworQGNpbmRleCBwcm9ncmFtIHNlZ21lbnRzCitAY2luZGV4IHNlZ21lbnRzLCBFTEYKK1RoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZXMgQGRmbntwcm9ncmFtIGhlYWRlcnN9LCBhbHNvIGtub3dzIGFzCitAZGZue3NlZ21lbnRzfS4gIFRoZSBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmUgaG93IHRoZSBwcm9ncmFtIHNob3VsZCBiZQorbG9hZGVkIGludG8gbWVtb3J5LiAgWW91IGNhbiBwcmludCB0aGVtIG91dCBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KK3Byb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXB9IG9wdGlvbi4KKworV2hlbiB5b3UgcnVuIGFuIEVMRiBwcm9ncmFtIG9uIGEgbmF0aXZlIEVMRiBzeXN0ZW0sIHRoZSBzeXN0ZW0gbG9hZGVyCityZWFkcyB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGxvYWQgdGhlCitwcm9ncmFtLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFyZSBzZXQgY29ycmVjdGx5LgorVGhpcyBtYW51YWwgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzeXN0ZW0gbG9hZGVyCitpbnRlcnByZXRzIHByb2dyYW0gaGVhZGVyczsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgRUxGIEFCSS4KKworVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSByZWFzb25hYmxlIHByb2dyYW0gaGVhZGVycyBieSBkZWZhdWx0LiAgSG93ZXZlciwKK2luIHNvbWUgY2FzZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBwcm9ncmFtIGhlYWRlcnMgbW9yZQorcHJlY2lzZWx5LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGZvciB0aGlzIHB1cnBvc2UuICBXaGVuCit0aGUgbGlua2VyIHNlZXMgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LCBpdCB3aWxsCitub3QgY3JlYXRlIGFueSBwcm9ncmFtIGhlYWRlcnMgb3RoZXIgdGhhbiB0aGUgb25lcyBzcGVjaWZpZWQuCisKK1RoZSBsaW5rZXIgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgd2hlbgorZ2VuZXJhdGluZyBhbiBFTEYgb3V0cHV0IGZpbGUuICBJbiBvdGhlciBjYXNlcywgdGhlIGxpbmtlciB3aWxsIHNpbXBseQoraWdub3JlIEBjb2Rle1BIRFJTfS4KKworVGhpcyBpcyB0aGUgc3ludGF4IG9mIHRoZSBAY29kZXtQSERSU30gY29tbWFuZC4gIFRoZSB3b3JkcyBAY29kZXtQSERSU30sCitAY29kZXtGSUxFSERSfSwgQGNvZGV7QVR9LCBhbmQgQGNvZGV7RkxBR1N9IGFyZSBrZXl3b3Jkcy4KKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCitQSERSUworQHsKKyAgQHZhcntuYW1lfSBAdmFye3R5cGV9IFsgRklMRUhEUiBdIFsgUEhEUlMgXSBbIEFUICggQHZhcnthZGRyZXNzfSApIF0KKyAgICAgICAgWyBGTEFHUyAoIEB2YXJ7ZmxhZ3N9ICkgXSA7CitAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIEB2YXJ7bmFtZX0gaXMgdXNlZCBvbmx5IGZvciByZWZlcmVuY2UgaW4gdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kCitvZiB0aGUgbGlua2VyIHNjcmlwdC4gIEl0IGlzIG5vdCBwdXQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBQcm9ncmFtCitoZWFkZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG5hbWUgc3BhY2UsIGFuZCB3aWxsIG5vdCBjb25mbGljdAord2l0aCBzeW1ib2wgbmFtZXMsIGZpbGUgbmFtZXMsIG9yIHNlY3Rpb24gbmFtZXMuICBFYWNoIHByb2dyYW0gaGVhZGVyCittdXN0IGhhdmUgYSBkaXN0aW5jdCBuYW1lLgorCitDZXJ0YWluIHByb2dyYW0gaGVhZGVyIHR5cGVzIGRlc2NyaWJlIHNlZ21lbnRzIG9mIG1lbW9yeSB3aGljaCB0aGUKK3N5c3RlbSBsb2FkZXIgd2lsbCBsb2FkIGZyb20gdGhlIGZpbGUuICBJbiB0aGUgbGlua2VyIHNjcmlwdCwgeW91CitzcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGVzZSBzZWdtZW50cyBieSBwbGFjaW5nIGFsbG9jYXRhYmxlIG91dHB1dAorc2VjdGlvbnMgaW4gdGhlIHNlZ21lbnRzLiAgWW91IHVzZSB0aGUgQHNhbXB7OkB2YXJ7cGhkcn19IG91dHB1dCBzZWN0aW9uCithdHRyaWJ1dGUgdG8gcGxhY2UgYSBzZWN0aW9uIGluIGEgcGFydGljdWxhciBzZWdtZW50LiAgQHhyZWZ7T3V0cHV0CitTZWN0aW9uIFBoZHJ9LgorCitJdCBpcyBub3JtYWwgdG8gcHV0IGNlcnRhaW4gc2VjdGlvbnMgaW4gbW9yZSB0aGFuIG9uZSBzZWdtZW50LiAgVGhpcworbWVyZWx5IGltcGxpZXMgdGhhdCBvbmUgc2VnbWVudCBvZiBtZW1vcnkgY29udGFpbnMgYW5vdGhlci4gIFlvdSBtYXkKK3JlcGVhdCBAc2FtcHs6QHZhcntwaGRyfX0sIHVzaW5nIGl0IG9uY2UgZm9yIGVhY2ggc2VnbWVudCB3aGljaCBzaG91bGQKK2NvbnRhaW4gdGhlIHNlY3Rpb24uCisKK0lmIHlvdSBwbGFjZSBhIHNlY3Rpb24gaW4gb25lIG9yIG1vcmUgc2VnbWVudHMgdXNpbmcgQHNhbXB7OkB2YXJ7cGhkcn19LAordGhlbiB0aGUgbGlua2VyIHdpbGwgcGxhY2UgYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGFibGUgc2VjdGlvbnMgd2hpY2ggZG8KK25vdCBzcGVjaWZ5IEBzYW1wezpAdmFye3BoZHJ9fSBpbiB0aGUgc2FtZSBzZWdtZW50cy4gIFRoaXMgaXMgZm9yCitjb252ZW5pZW5jZSwgc2luY2UgZ2VuZXJhbGx5IGEgd2hvbGUgc2V0IG9mIGNvbnRpZ3VvdXMgc2VjdGlvbnMgd2lsbCBiZQorcGxhY2VkIGluIGEgc2luZ2xlIHNlZ21lbnQuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gb3ZlcnJpZGUgdGhlCitkZWZhdWx0IHNlZ21lbnQgYW5kIHRlbGwgdGhlIGxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueQorc2VnbWVudCBhdCBhbGwuCisKK0BraW5kZXggRklMRUhEUgorQGtpbmRleCBQSERSUworWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZJTEVIRFJ9IGFuZCBAY29kZXtQSERSU30ga2V5d29yZHMgYXBwZWFyIGFmdGVyCit0aGUgcHJvZ3JhbSBoZWFkZXIgdHlwZSB0byBmdXJ0aGVyIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VnbWVudC4KK1RoZSBAY29kZXtGSUxFSERSfSBrZXl3b3JkIG1lYW5zIHRoYXQgdGhlIHNlZ21lbnQgc2hvdWxkIGluY2x1ZGUgdGhlIEVMRgorZmlsZSBoZWFkZXIuICBUaGUgQGNvZGV7UEhEUlN9IGtleXdvcmQgbWVhbnMgdGhhdCB0aGUgc2VnbWVudCBzaG91bGQKK2luY2x1ZGUgdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgdGhlbXNlbHZlcy4KKworVGhlIEB2YXJ7dHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgVGhlIG51bWJlcnMgaW5kaWNhdGUgdGhlCit2YWx1ZSBvZiB0aGUga2V5d29yZC4KKworQHRhYmxlIEBhc2lzCitAaXRlbSBAY29kZXtQVF9OVUxMfSAoMCkKK0luZGljYXRlcyBhbiB1bnVzZWQgcHJvZ3JhbSBoZWFkZXIuCisKK0BpdGVtIEBjb2Rle1BUX0xPQUR9ICgxKQorSW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9ncmFtIGhlYWRlciBkZXNjcmliZXMgYSBzZWdtZW50IHRvIGJlIGxvYWRlZCBmcm9tCit0aGUgZmlsZS4KKworQGl0ZW0gQGNvZGV7UFRfRFlOQU1JQ30gKDIpCitJbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQuCisKK0BpdGVtIEBjb2Rle1BUX0lOVEVSUH0gKDMpCitJbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGludGVycHJldGVyIG1heSBiZQorZm91bmQuCisKK0BpdGVtIEBjb2Rle1BUX05PVEV9ICg0KQorSW5kaWNhdGVzIGEgc2VnbWVudCBob2xkaW5nIG5vdGUgaW5mb3JtYXRpb24uCisKK0BpdGVtIEBjb2Rle1BUX1NITElCfSAoNSkKK0EgcmVzZXJ2ZWQgcHJvZ3JhbSBoZWFkZXIgdHlwZSwgZGVmaW5lZCBidXQgbm90IHNwZWNpZmllZCBieSB0aGUgRUxGCitBQkkuCisKK0BpdGVtIEBjb2Rle1BUX1BIRFJ9ICg2KQorSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIG1heSBiZSBmb3VuZC4KKworQGl0ZW0gQHZhcntleHByZXNzaW9ufQorQW4gZXhwcmVzc2lvbiBnaXZpbmcgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIG1heQorYmUgdXNlZCBmb3IgdHlwZXMgbm90IGRlZmluZWQgYWJvdmUuCitAZW5kIHRhYmxlCisKK1lvdSBjYW4gc3BlY2lmeSB0aGF0IGEgc2VnbWVudCBzaG91bGQgYmUgbG9hZGVkIGF0IGEgcGFydGljdWxhciBhZGRyZXNzCitpbiBtZW1vcnkgYnkgdXNpbmcgYW4gQGNvZGV7QVR9IGV4cHJlc3Npb24uICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKK0Bjb2Rle0FUfSBjb21tYW5kIHVzZWQgYXMgYW4gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlIChAcHhyZWZ7T3V0cHV0CitTZWN0aW9uIExNQX0pLiAgVGhlIEBjb2Rle0FUfSBjb21tYW5kIGZvciBhIHByb2dyYW0gaGVhZGVyIG92ZXJyaWRlcyB0aGUKK291dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZS4KKworVGhlIGxpbmtlciB3aWxsIG5vcm1hbGx5IHNldCB0aGUgc2VnbWVudCBmbGFncyBiYXNlZCBvbiB0aGUgc2VjdGlvbnMKK3doaWNoIGNvbXByaXNlIHRoZSBzZWdtZW50LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZMQUdTfSBrZXl3b3JkIHRvCitleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHNlZ21lbnQgZmxhZ3MuICBUaGUgdmFsdWUgb2YgQHZhcntmbGFnc30gbXVzdCBiZQorYW4gaW50ZWdlci4gIEl0IGlzIHVzZWQgdG8gc2V0IHRoZSBAY29kZXtwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgcHJvZ3JhbQoraGVhZGVyLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgQGNvZGV7UEhEUlN9LiAgVGhpcyBzaG93cyBhIHR5cGljYWwgc2V0IG9mIHByb2dyYW0KK2hlYWRlcnMgdXNlZCBvbiBhIG5hdGl2ZSBFTEYgc3lzdGVtLgorCitAZXhhbXBsZQorQGdyb3VwCitQSERSUworQHsKKyAgaGVhZGVycyBQVF9QSERSIFBIRFJTIDsKKyAgaW50ZXJwIFBUX0lOVEVSUCA7CisgIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIDsKKyAgZGF0YSBQVF9MT0FEIDsKKyAgZHluYW1pYyBQVF9EWU5BTUlDIDsKK0B9CisKK1NFQ1RJT05TCitAeworICAuID0gU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiBAeyAqKC5pbnRlcnApIEB9IDp0ZXh0IDppbnRlcnAKKyAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dAorICAucm9kYXRhIDogQHsgKigucm9kYXRhKSBAfSAvKiBkZWZhdWx0cyB0byA6dGV4dCAqLworICBAZG90c3t9CisgIC4gPSAuICsgMHgxMDAwOyAvKiBtb3ZlIHRvIGEgbmV3IHBhZ2UgaW4gbWVtb3J5ICovCisgIC5kYXRhIDogQHsgKiguZGF0YSkgQH0gOmRhdGEKKyAgLmR5bmFtaWMgOiBAeyAqKC5keW5hbWljKSBAfSA6ZGF0YSA6ZHluYW1pYworICBAZG90c3t9CitAfQorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0Bub2RlIFZFUlNJT04KK0BzZWN0aW9uIFZFUlNJT04gQ29tbWFuZAorQGtpbmRleCBWRVJTSU9OIEB7c2NyaXB0IHRleHRAfQorQGNpbmRleCBzeW1ib2wgdmVyc2lvbnMKK0BjaW5kZXggdmVyc2lvbiBzY3JpcHQKK0BjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scworVGhlIGxpbmtlciBzdXBwb3J0cyBzeW1ib2wgdmVyc2lvbnMgd2hlbiB1c2luZyBFTEYuICBTeW1ib2wgdmVyc2lvbnMgYXJlCitvbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuIHVzZQorc3ltYm9sIHZlcnNpb25zIHRvIHNlbGVjdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB3aGVuIGl0IHJ1bnMKK2EgcHJvZ3JhbSB0aGF0IG1heSBoYXZlIGJlZW4gbGlua2VkIGFnYWluc3QgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZQorc2hhcmVkIGxpYnJhcnkuCisKK1lvdSBjYW4gaW5jbHVkZSBhIHZlcnNpb24gc2NyaXB0IGRpcmVjdGx5IGluIHRoZSBtYWluIGxpbmtlciBzY3JpcHQsIG9yCit5b3UgY2FuIHN1cHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgYXMgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4KK2Fsc28gdXNlIHRoZSBAc2FtcHstLXZlcnNpb24tc2NyaXB0fSBsaW5rZXIgb3B0aW9uLgorCitUaGUgc3ludGF4IG9mIHRoZSBAY29kZXtWRVJTSU9OfSBjb21tYW5kIGlzIHNpbXBseQorQHNtYWxsZXhhbXBsZQorVkVSU0lPTiBAeyB2ZXJzaW9uLXNjcmlwdC1jb21tYW5kcyBAfQorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIGZvcm1hdCBvZiB0aGUgdmVyc2lvbiBzY3JpcHQgY29tbWFuZHMgaXMgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZCBieQorU3VuJ3MgbGlua2VyIGluIFNvbGFyaXMgMi41LiAgVGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgYSB0cmVlIG9mCit2ZXJzaW9uIG5vZGVzLiAgWW91IHNwZWNpZnkgdGhlIG5vZGUgbmFtZXMgYW5kIGludGVyZGVwZW5kZW5jaWVzIGluIHRoZQordmVyc2lvbiBzY3JpcHQuICBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBhcmUgYm91bmQgdG8gd2hpY2gKK3ZlcnNpb24gbm9kZXMsIGFuZCB5b3UgY2FuIHJlZHVjZSBhIHNwZWNpZmllZCBzZXQgb2Ygc3ltYm9scyB0byBsb2NhbAorc2NvcGUgc28gdGhhdCB0aGV5IGFyZSBub3QgZ2xvYmFsbHkgdmlzaWJsZSBvdXRzaWRlIG9mIHRoZSBzaGFyZWQKK2xpYnJhcnkuCisKK1RoZSBlYXNpZXN0IHdheSB0byBkZW1vbnN0cmF0ZSB0aGUgdmVyc2lvbiBzY3JpcHQgbGFuZ3VhZ2UgaXMgd2l0aCBhIGZldworZXhhbXBsZXMuCisKK0BzbWFsbGV4YW1wbGUKK1ZFUlNfMS4xIEB7CisJIGdsb2JhbDoKKwkJIGZvbzE7CisJIGxvY2FsOgorCQkgb2xkKjsgCisJCSBvcmlnaW5hbCo7IAorCQkgbmV3KjsgCitAfTsKKworVkVSU18xLjIgQHsKKwkJIGZvbzI7CitAfSBWRVJTXzEuMTsKKworVkVSU18yLjAgQHsKKwkJIGJhcjE7IGJhcjI7CitAfSBWRVJTXzEuMjsKK0BlbmQgc21hbGxleGFtcGxlCisKK1RoaXMgZXhhbXBsZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIHRocmVlIHZlcnNpb24gbm9kZXMuICBUaGUgZmlyc3QKK3ZlcnNpb24gbm9kZSBkZWZpbmVkIGlzIEBzYW1we1ZFUlNfMS4xfTsgaXQgaGFzIG5vIG90aGVyIGRlcGVuZGVuY2llcy4KK1RoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28xfSB0byBAc2FtcHtWRVJTXzEuMX0uICBJdCByZWR1Y2VzCithIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvY2FsIHNjb3BlIHNvIHRoYXQgdGhleSBhcmUgbm90IHZpc2libGUgb3V0c2lkZQorb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCitOZXh0LCB0aGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBub2RlIEBzYW1we1ZFUlNfMS4yfS4gIFRoaXMgbm9kZQorZGVwZW5kcyB1cG9uIEBzYW1we1ZFUlNfMS4xfS4gIFRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28yfQordG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMn0uCisKK0ZpbmFsbHksIHRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIG5vZGUgQHNhbXB7VkVSU18yLjB9LiAgVGhpcyBub2RlCitkZXBlbmRzIHVwb24gQHNhbXB7VkVSU18xLjJ9LiAgVGhlIHNjcmlwdHMgYmluZHMgdGhlIHN5bWJvbHMgQHNhbXB7YmFyMX0KK2FuZCBAc2FtcHtiYXIyfSBhcmUgYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzIuMH0uCisKK1doZW4gdGhlIGxpbmtlciBmaW5kcyBhIHN5bWJvbCBkZWZpbmVkIGluIGEgbGlicmFyeSB3aGljaCBpcyBub3QKK3NwZWNpZmljYWxseSBib3VuZCB0byBhIHZlcnNpb24gbm9kZSwgaXQgd2lsbCBlZmZlY3RpdmVseSBiaW5kIGl0IHRvIGFuCit1bnNwZWNpZmllZCBiYXNlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBZb3UgY2FuIGJpbmQgYWxsIG90aGVyd2lzZQordW5zcGVjaWZpZWQgc3ltYm9scyB0byBhIGdpdmVuIHZlcnNpb24gbm9kZSBieSB1c2luZyBAc2FtcHtnbG9iYWw6ICp9Citzb21ld2hlcmUgaW4gdGhlIHZlcnNpb24gc2NyaXB0LgorCitUaGUgbmFtZXMgb2YgdGhlIHZlcnNpb24gbm9kZXMgaGF2ZSBubyBzcGVjaWZpYyBtZWFuaW5nIG90aGVyIHRoYW4gd2hhdAordGhleSBtaWdodCBzdWdnZXN0IHRvIHRoZSBwZXJzb24gcmVhZGluZyB0aGVtLiAgVGhlIEBzYW1wezIuMH0gdmVyc2lvbgorY291bGQganVzdCBhcyB3ZWxsIGhhdmUgYXBwZWFyZWQgaW4gYmV0d2VlbiBAc2FtcHsxLjF9IGFuZCBAc2FtcHsxLjJ9LgorSG93ZXZlciwgdGhpcyB3b3VsZCBiZSBhIGNvbmZ1c2luZyB3YXkgdG8gd3JpdGUgYSB2ZXJzaW9uIHNjcmlwdC4KKworV2hlbiB5b3UgbGluayBhbiBhcHBsaWNhdGlvbiBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBoYXMgdmVyc2lvbmVkCitzeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gaXRzZWxmIGtub3dzIHdoaWNoIHZlcnNpb24gb2YgZWFjaCBzeW1ib2wgaXQKK3JlcXVpcmVzLCBhbmQgaXQgYWxzbyBrbm93cyB3aGljaCB2ZXJzaW9uIG5vZGVzIGl0IG5lZWRzIGZyb20gZWFjaAorc2hhcmVkIGxpYnJhcnkgaXQgaXMgbGlua2VkIGFnYWluc3QuICBUaHVzIGF0IHJ1bnRpbWUsIHRoZSBkeW5hbWljCitsb2FkZXIgY2FuIG1ha2UgYSBxdWljayBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyaWVzIHlvdSBoYXZlCitsaW5rZWQgYWdhaW5zdCBkbyBpbiBmYWN0IHN1cHBseSBhbGwgb2YgdGhlIHZlcnNpb24gbm9kZXMgdGhhdCB0aGUKK2FwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byByZXNvbHZlIGFsbCBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgSW4gdGhpcword2F5IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8ga25vdyB3aXRoIGNlcnRhaW50eSB0aGF0CithbGwgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IGl0IG5lZWRzIHdpbGwgYmUgcmVzb2x2YWJsZSB3aXRob3V0IGhhdmluZyB0bworc2VhcmNoIGZvciBlYWNoIHN5bWJvbCByZWZlcmVuY2UuCisKK1RoZSBzeW1ib2wgdmVyc2lvbmluZyBpcyBpbiBlZmZlY3QgYSBtdWNoIG1vcmUgc29waGlzdGljYXRlZCB3YXkgb2YKK2RvaW5nIG1pbm9yIHZlcnNpb24gY2hlY2tpbmcgdGhhdCBTdW5PUyBkb2VzLiAgVGhlIGZ1bmRhbWVudGFsIHByb2JsZW0KK3RoYXQgaXMgYmVpbmcgYWRkcmVzc2VkIGhlcmUgaXMgdGhhdCB0eXBpY2FsbHkgcmVmZXJlbmNlcyB0byBleHRlcm5hbAorZnVuY3Rpb25zIGFyZSBib3VuZCBvbiBhbiBhcy1uZWVkZWQgYmFzaXMsIGFuZCBhcmUgbm90IGFsbCBib3VuZCB3aGVuCit0aGUgYXBwbGljYXRpb24gc3RhcnRzIHVwLiAgSWYgYSBzaGFyZWQgbGlicmFyeSBpcyBvdXQgb2YgZGF0ZSwgYQorcmVxdWlyZWQgaW50ZXJmYWNlIG1heSBiZSBtaXNzaW5nOyB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byB1c2UKK3RoYXQgaW50ZXJmYWNlLCBpdCBtYXkgc3VkZGVubHkgYW5kIHVuZXhwZWN0ZWRseSBmYWlsLiAgV2l0aCBzeW1ib2wKK3ZlcnNpb25pbmcsIHRoZSB1c2VyIHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHRoZXkgc3RhcnQgdGhlaXIgcHJvZ3JhbSBpZgordGhlIGxpYnJhcmllcyBiZWluZyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFyZSB0b28gb2xkLgorCitUaGVyZSBhcmUgc2V2ZXJhbCBHTlUgZXh0ZW5zaW9ucyB0byBTdW4ncyB2ZXJzaW9uaW5nIGFwcHJvYWNoLiAgVGhlCitmaXJzdCBvZiB0aGVzZSBpcyB0aGUgYWJpbGl0eSB0byBiaW5kIGEgc3ltYm9sIHRvIGEgdmVyc2lvbiBub2RlIGluIHRoZQorc291cmNlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluc3RlYWQgb2YgaW4gdGhlIHZlcnNpb25pbmcKK3NjcmlwdC4gIFRoaXMgd2FzIGRvbmUgbWFpbmx5IHRvIHJlZHVjZSB0aGUgYnVyZGVuIG9uIHRoZSBsaWJyYXJ5CittYWludGFpbmVyLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHB1dHRpbmcgc29tZXRoaW5nIGxpa2U6CitAc21hbGxleGFtcGxlCitfX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AQFZFUlNfMS4xIik7CitAZW5kIHNtYWxsZXhhbXBsZQorQG5vaW5kZW50CitpbiB0aGUgQyBzb3VyY2UgZmlsZS4gIFRoaXMgcmVuYW1lcyB0aGUgZnVuY3Rpb24gQHNhbXB7b3JpZ2luYWxfZm9vfSB0bworYmUgYW4gYWxpYXMgZm9yIEBzYW1we2Zvb30gYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMX0uCitUaGUgQHNhbXB7bG9jYWw6fSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gcHJldmVudCB0aGUgc3ltYm9sCitAc2FtcHtvcmlnaW5hbF9mb299IGZyb20gYmVpbmcgZXhwb3J0ZWQuCisKK1RoZSBzZWNvbmQgR05VIGV4dGVuc2lvbiBpcyB0byBhbGxvdyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZQorZnVuY3Rpb24gdG8gYXBwZWFyIGluIGEgZ2l2ZW4gc2hhcmVkIGxpYnJhcnkuICBJbiB0aGlzIHdheSB5b3UgY2FuIG1ha2UKK2FuIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW4gaW50ZXJmYWNlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgbWFqb3IKK3ZlcnNpb24gbnVtYmVyIG9mIHRoZSBzaGFyZWQgbGlicmFyeSwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgYXBwbGljYXRpb25zCitsaW5rZWQgYWdhaW5zdCB0aGUgb2xkIGludGVyZmFjZSB0byBjb250aW51ZSB0byBmdW5jdGlvbi4KKworVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIG11bHRpcGxlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZXMgaW4gdGhlCitzb3VyY2UgZmlsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKKworQHNtYWxsZXhhbXBsZQorX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQEAiKTsKK19fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AQFZFUlNfMS4xIik7CitfX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BAVkVSU18xLjIiKTsKK19fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQEBAVkVSU18yLjAiKTsKK0BlbmQgc21hbGxleGFtcGxlCisKK0luIHRoaXMgZXhhbXBsZSwgQHNhbXB7Zm9vQEB9IHJlcHJlc2VudHMgdGhlIHN5bWJvbCBAc2FtcHtmb299IGJvdW5kIHRvIHRoZQordW5zcGVjaWZpZWQgYmFzZSB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICBUaGUgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzCitleGFtcGxlIHdvdWxkIGRlZmluZSA0IEMgZnVuY3Rpb25zOiBAc2FtcHtvcmlnaW5hbF9mb299LCBAc2FtcHtvbGRfZm9vfSwKK0BzYW1we29sZF9mb28xfSwgYW5kIEBzYW1we25ld19mb299LgorCitXaGVuIHlvdSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgZ2l2ZW4gc3ltYm9sLCB0aGVyZSBuZWVkcyB0byBiZQorc29tZSB3YXkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmVyc2lvbiB0byB3aGljaCBleHRlcm5hbCByZWZlcmVuY2VzIHRvCit0aGlzIHN5bWJvbCB3aWxsIGJlIGJvdW5kLiAgWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlCitAc2FtcHtmb29AQEBAVkVSU18yLjB9IHR5cGUgb2YgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlLiAgWW91IGNhbiBvbmx5CitkZWNsYXJlIG9uZSB2ZXJzaW9uIG9mIGEgc3ltYm9sIGFzIHRoZSBkZWZhdWx0IGluIHRoaXMgbWFubmVyOyBvdGhlcndpc2UKK3lvdSB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbC4KKworSWYgeW91IHdpc2ggdG8gYmluZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIHN5bWJvbAord2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzZXMgb2YgY29udmVuaWVuY2UKKyhpLmUuIEBzYW1we29sZF9mb299KSwgb3IgeW91IGNhbiB1c2UgdGhlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZSB0bworc3BlY2lmaWNhbGx5IGJpbmQgdG8gYW4gZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24uCisKK0Bub2RlIEV4cHJlc3Npb25zCitAc2VjdGlvbiBFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cworQGNpbmRleCBleHByZXNzaW9ucworQGNpbmRleCBhcml0aG1ldGljCitUaGUgc3ludGF4IGZvciBleHByZXNzaW9ucyBpbiB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBpcyBpZGVudGljYWwgdG8KK3RoYXQgb2YgQyBleHByZXNzaW9ucy4gIEFsbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGludGVnZXJzLiAgQWxsCitleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGluIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzIDMyIGJpdHMgaWYgYm90aCB0aGUKK2hvc3QgYW5kIHRhcmdldCBhcmUgMzIgYml0cywgYW5kIGlzIG90aGVyd2lzZSA2NCBiaXRzLgorCitZb3UgY2FuIHVzZSBhbmQgc2V0IHN5bWJvbCB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMuCisKK1RoZSBsaW5rZXIgZGVmaW5lcyBzZXZlcmFsIHNwZWNpYWwgcHVycG9zZSBidWlsdGluIGZ1bmN0aW9ucyBmb3IgdXNlIGluCitleHByZXNzaW9ucy4KKworQG1lbnUKKyogQ29uc3RhbnRzOjoJCQlDb25zdGFudHMKKyogU3ltYm9sczo6CQkJU3ltYm9sIE5hbWVzCisqIExvY2F0aW9uIENvdW50ZXI6OgkJVGhlIExvY2F0aW9uIENvdW50ZXIKKyogT3BlcmF0b3JzOjoJCQlPcGVyYXRvcnMKKyogRXZhbHVhdGlvbjo6CQkJRXZhbHVhdGlvbgorKiBFeHByZXNzaW9uIFNlY3Rpb246OgkJVGhlIFNlY3Rpb24gb2YgYW4gRXhwcmVzc2lvbgorKiBCdWlsdGluIEZ1bmN0aW9uczo6CQlCdWlsdGluIEZ1bmN0aW9ucworQGVuZCBtZW51CisKK0Bub2RlIENvbnN0YW50cworQHN1YnNlY3Rpb24gQ29uc3RhbnRzCitAY2luZGV4IGludGVnZXIgbm90YXRpb24KK0BjaW5kZXggY29uc3RhbnRzIGluIGxpbmtlciBzY3JpcHRzCitBbGwgY29uc3RhbnRzIGFyZSBpbnRlZ2Vycy4KKworQXMgaW4gQywgdGhlIGxpbmtlciBjb25zaWRlcnMgYW4gaW50ZWdlciBiZWdpbm5pbmcgd2l0aCBAc2FtcHswfSB0byBiZQorb2N0YWwsIGFuZCBhbiBpbnRlZ2VyIGJlZ2lubmluZyB3aXRoIEBzYW1wezB4fSBvciBAc2FtcHswWH0gdG8gYmUKK2hleGFkZWNpbWFsLiAgVGhlIGxpbmtlciBjb25zaWRlcnMgb3RoZXIgaW50ZWdlcnMgdG8gYmUgZGVjaW1hbC4KKworQGNpbmRleCBzY2FsZWQgaW50ZWdlcnMKK0BjaW5kZXggSyBhbmQgTSBpbnRlZ2VyIHN1ZmZpeGVzCitAY2luZGV4IE0gYW5kIEsgaW50ZWdlciBzdWZmaXhlcworQGNpbmRleCBzdWZmaXhlcyBmb3IgaW50ZWdlcnMKK0BjaW5kZXggaW50ZWdlciBzdWZmaXhlcworSW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIHRoZSBzdWZmaXhlcyBAY29kZXtLfSBhbmQgQGNvZGV7TX0gdG8gc2NhbGUgYQorY29uc3RhbnQgYnkKK0BjIFRFWEkyUk9GRi1LSUxMCitAaWZpbmZvCitAYyBFTkQgVEVYSTJST0ZGLUtJTEwKK0Bjb2RlezEwMjR9IG9yIEBjb2RlezEwMjQqMTAyNH0KK0BjIFRFWEkyUk9GRi1LSUxMCitAZW5kIGlmaW5mbworQHRleAorJHtccm0gMTAyNH0kIG9yICR7XHJtIDEwMjR9XjIkCitAZW5kIHRleAorQGMgRU5EIFRFWEkyUk9GRi1LSUxMCityZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFsbCByZWZlciB0byB0aGUgc2FtZSBxdWFudGl0eToKK0BzbWFsbGV4YW1wbGUKKyAgX2ZvdXJrXzEgPSA0SzsKKyAgX2ZvdXJrXzIgPSA0MDk2OworICBfZm91cmtfMyA9IDB4MTAwMDsKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIFN5bWJvbHMKK0BzdWJzZWN0aW9uIFN5bWJvbCBOYW1lcworQGNpbmRleCBzeW1ib2wgbmFtZXMKK0BjaW5kZXggbmFtZXMKK0BjaW5kZXggcXVvdGVkIHN5bWJvbCBuYW1lcworQGtpbmRleCAiCitVbmxlc3MgcXVvdGVkLCBzeW1ib2wgbmFtZXMgc3RhcnQgd2l0aCBhIGxldHRlciwgdW5kZXJzY29yZSwgb3IgcGVyaW9kCithbmQgbWF5IGluY2x1ZGUgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYW5kIGh5cGhlbnMuCitVbnF1b3RlZCBzeW1ib2wgbmFtZXMgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbnkga2V5d29yZHMuICBZb3UgY2FuCitzcGVjaWZ5IGEgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIG9kZCBjaGFyYWN0ZXJzIG9yIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKK2tleXdvcmQgYnkgc3Vycm91bmRpbmcgdGhlIHN5bWJvbCBuYW1lIGluIGRvdWJsZSBxdW90ZXM6CitAc21hbGxleGFtcGxlCisgICJTRUNUSU9OIiA9IDk7CisgICJ3aXRoIGEgc3BhY2UiID0gImFsc28gd2l0aCBhIHNwYWNlIiArIDEwOworQGVuZCBzbWFsbGV4YW1wbGUKKworU2luY2Ugc3ltYm9scyBjYW4gY29udGFpbiBtYW55IG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMsIGl0IGlzIHNhZmVzdAordG8gZGVsaW1pdCBzeW1ib2xzIHdpdGggc3BhY2VzLiAgRm9yIGV4YW1wbGUsIEBzYW1we0EtQn0gaXMgb25lIHN5bWJvbCwKK3doZXJlYXMgQHNhbXB7QSAtIEJ9IGlzIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIHN1YnRyYWN0aW9uLgorCitAbm9kZSBMb2NhdGlvbiBDb3VudGVyCitAc3Vic2VjdGlvbiBUaGUgTG9jYXRpb24gQ291bnRlcgorQGtpbmRleCAuCitAY2luZGV4IGRvdAorQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyCitAY2luZGV4IGN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uCitUaGUgc3BlY2lhbCBsaW5rZXIgdmFyaWFibGUgQGRmbntkb3R9IEBzYW1wey59IGFsd2F5cyBjb250YWlucyB0aGUKK2N1cnJlbnQgb3V0cHV0IGxvY2F0aW9uIGNvdW50ZXIuICBTaW5jZSB0aGUgQGNvZGV7Ln0gYWx3YXlzIHJlZmVycyB0byBhCitsb2NhdGlvbiBpbiBhbiBvdXRwdXQgc2VjdGlvbiwgaXQgbWF5IG9ubHkgYXBwZWFyIGluIGFuIGV4cHJlc3Npb24KK3dpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLiAgVGhlIEBjb2Rley59IHN5bWJvbCBtYXkgYXBwZWFyCithbnl3aGVyZSB0aGF0IGFuIG9yZGluYXJ5IHN5bWJvbCBpcyBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24uCisKK0BjaW5kZXggaG9sZXMKK0Fzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IHdpbGwgY2F1c2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gYmUKK21vdmVkLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgaG9sZXMgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlCitsb2NhdGlvbiBjb3VudGVyIG1heSBuZXZlciBiZSBtb3ZlZCBiYWNrd2FyZHMuCisKK0BzbWFsbGV4YW1wbGUKK1NFQ1RJT05TCitAeworICBvdXRwdXQgOgorICAgIEB7CisgICAgICBmaWxlMSgudGV4dCkKKyAgICAgIC4gPSAuICsgMTAwMDsKKyAgICAgIGZpbGUyKC50ZXh0KQorICAgICAgLiArPSAxMDAwOworICAgICAgZmlsZTMoLnRleHQpCisgICAgQH0gPSAweDEyMzQ7CitAfQorQGVuZCBzbWFsbGV4YW1wbGUKK0Bub2luZGVudAorSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUxfSBpcworbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXR9LiAgSXQgaXMKK2ZvbGxvd2VkIGJ5IGEgMTAwMCBieXRlIGdhcC4gIFRoZW4gdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20KK0BmaWxle2ZpbGUyfSBhcHBlYXJzLCBhbHNvIHdpdGggYSAxMDAwIGJ5dGUgZ2FwIGZvbGxvd2luZyBiZWZvcmUgdGhlCitAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUzfS4gIFRoZSBub3RhdGlvbiBAc2FtcHs9IDB4MTIzNH0KK3NwZWNpZmllcyB3aGF0IGRhdGEgdG8gd3JpdGUgaW4gdGhlIGdhcHMgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBGaWxsfSkuCisKK0BuZWVkIDIwMDAKK0Bub2RlIE9wZXJhdG9ycworQHN1YnNlY3Rpb24gT3BlcmF0b3JzCitAY2luZGV4IG9wZXJhdG9ycyBmb3IgYXJpdGhtZXRpYworQGNpbmRleCBhcml0aG1ldGljIG9wZXJhdG9ycworQGNpbmRleCBwcmVjZWRlbmNlIGluIGV4cHJlc3Npb25zCitUaGUgbGlua2VyIHJlY29nbml6ZXMgdGhlIHN0YW5kYXJkIEMgc2V0IG9mIGFyaXRobWV0aWMgb3BlcmF0b3JzLCB3aXRoCit0aGUgc3RhbmRhcmQgYmluZGluZ3MgYW5kIHByZWNlZGVuY2UgbGV2ZWxzOgorQGMgVEVYSTJST0ZGLUtJTEwKK0BpZmluZm8KK0BjIEVORCBURVhJMlJPRkYtS0lMTAorQHNtYWxsZXhhbXBsZQorcHJlY2VkZW5jZSAgICAgIGFzc29jaWF0aXZpdHkgICBPcGVyYXRvcnMgICAgICAgICAgICAgICAgTm90ZXMKKyhoaWdoZXN0KQorMSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAhICAtICB+ICAgICAgICAgICAgICAgICAgKDEpCisyICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICogIC8gICUKKzMgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKyAgLQorNCAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA+PiAgPDwKKzUgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgPT0gICE9ICA+ICA8ICA8PSAgPj0KKzYgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJgorNyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICB8Cis4ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICYmCis5ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHx8CisxMCAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgID8gOgorMTEgICAgICAgICAgICAgIHJpZ2h0ICAgICAgICAgICAmPSAgKz0gIC09ICAqPSAgLz0gICAgICAgKDIpCisobG93ZXN0KQorQGVuZCBzbWFsbGV4YW1wbGUKK05vdGVzOgorKDEpIFByZWZpeCBvcGVyYXRvcnMgCisoMikgQHhyZWZ7QXNzaWdubWVudHN9LgorQGMgVEVYSTJST0ZGLUtJTEwKK0BlbmQgaWZpbmZvCitAdGV4CitcdnNraXAgXGJhc2VsaW5lc2tpcAorJSJsaXNwbmFycm93aW5nIiBpcyB0aGUgZXh0cmEgaW5kZW50IHVzZWQgZ2VuZXJhbGx5IGZvciBzbWFsbGV4YW1wbGUKK1xoc2tpcFxsaXNwbmFycm93aW5nXHZib3h7XG9mZmludGVybGluZXNraXAKK1xocnVsZQorXGhhbGlnbgore1x2cnVsZSMmXHN0cnV0XGhmaWxcICNcIFxoZmlsJlx2cnVsZSMmXHN0cnV0XGhmaWxcICNcIFxoZmlsJlx2cnVsZSMmXHN0cnV0XGhmaWxcIHtcdHQgI31cIFxoZmlsJlx2cnVsZSNcY3IKK2hlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgorJlByZWNlZGVuY2UmJiAgQXNzb2NpYXRpdml0eSAgJiZ7XHJtIE9wZXJhdG9yc30mXGNyCitoZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3IKK1xub2FsaWdue1xocnVsZX0KK2hlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgorJmhpZ2hlc3QmJiYmJlxjcgorJSAnMTc2IGlzIHRpbGRlLCAnficgaW4gdHQgZm9udAorJjEmJmxlZnQmJlxxcXVhZC0gICAgICAgICAgXGNoYXInMTc2XCAgICAgICFccXF1YWRcZGFnJlxjciAKKyYyJiZsZWZ0JiYqICAgICAgICAgIC8gICAgICAgIFwlJlxjcgorJjMmJmxlZnQmJisgICAgICAgICAgLSZcY3IKKyY0JiZsZWZ0JiY+PiAgICAgICAgIDw8JlxjcgorJjUmJmxlZnQmJj09ICAgICAgICAgIT0gICAgICAgPiAgICAgIDwgICAgICA8PSAgICAgID49JlxjcgorJjYmJmxlZnQmJlwmJlxjcgorJjcmJmxlZnQmJnwmXGNyCismOCYmbGVmdCYme1wmXCZ9JlxjcgorJjkmJmxlZnQmJnx8JlxjcgorJjEwJiZyaWdodCYmPyAgICAgICAgOiZcY3IKKyYxMSYmcmlnaHQmJlxxcXVhZFwmPSAgICAgICs9ICAgICAgIC09ICAgICAqPSAgICAgLz1ccXF1YWRcZGRhZyZcY3IKKyZsb3dlc3QmJiYmJlxjcgoraGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyfQorXGhydWxlfQorQGVuZCB0ZXgKK0BpZnRleAoreworQG9iZXlsaW5lc0BwYXJza2lwPTBwdEBwYXJpbmRlbnQ9MHB0CitAZGFnQHF1YWQgUHJlZml4IG9wZXJhdG9ycy4KK0BkZGFnQHF1YWQgQHhyZWZ7QXNzaWdubWVudHN9LgorfQorQGVuZCBpZnRleAorQGMgRU5EIFRFWEkyUk9GRi1LSUxMCisKK0Bub2RlIEV2YWx1YXRpb24KK0BzdWJzZWN0aW9uIEV2YWx1YXRpb24KK0BjaW5kZXggbGF6eSBldmFsdWF0aW9uCitAY2luZGV4IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBvcmRlcgorVGhlIGxpbmtlciBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgbGF6aWx5LiAgSXQgb25seSBjb21wdXRlcyB0aGUgdmFsdWUgb2YKK2FuIGV4cHJlc3Npb24gd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KKworVGhlIGxpbmtlciBuZWVkcyBzb21lIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQKK2FkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlY3Rpb24sIGFuZCB0aGUgb3JpZ2lucyBhbmQgbGVuZ3RocyBvZiBtZW1vcnkKK3JlZ2lvbnMsIGluIG9yZGVyIHRvIGRvIGFueSBsaW5raW5nIGF0IGFsbC4gIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQKK2FzIHNvb24gYXMgcG9zc2libGUgd2hlbiB0aGUgbGlua2VyIHJlYWRzIGluIHRoZSBsaW5rZXIgc2NyaXB0LgorCitIb3dldmVyLCBvdGhlciB2YWx1ZXMgKHN1Y2ggYXMgc3ltYm9sIHZhbHVlcykgYXJlIG5vdCBrbm93biBvciBuZWVkZWQKK3VudGlsIGFmdGVyIHN0b3JhZ2UgYWxsb2NhdGlvbi4gIFN1Y2ggdmFsdWVzIGFyZSBldmFsdWF0ZWQgbGF0ZXIsIHdoZW4KK290aGVyIGluZm9ybWF0aW9uIChzdWNoIGFzIHRoZSBzaXplcyBvZiBvdXRwdXQgc2VjdGlvbnMpIGlzIGF2YWlsYWJsZQorZm9yIHVzZSBpbiB0aGUgc3ltYm9sIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi4KKworVGhlIHNpemVzIG9mIHNlY3Rpb25zIGNhbm5vdCBiZSBrbm93biB1bnRpbCBhZnRlciBhbGxvY2F0aW9uLCBzbworYXNzaWdubWVudHMgZGVwZW5kZW50IHVwb24gdGhlc2UgYXJlIG5vdCBwZXJmb3JtZWQgdW50aWwgYWZ0ZXIKK2FsbG9jYXRpb24uCisKK1NvbWUgZXhwcmVzc2lvbnMsIHN1Y2ggYXMgdGhvc2UgZGVwZW5kaW5nIHVwb24gdGhlIGxvY2F0aW9uIGNvdW50ZXIKK0BzYW1wey59LCBtdXN0IGJlIGV2YWx1YXRlZCBkdXJpbmcgc2VjdGlvbiBhbGxvY2F0aW9uLgorCitJZiB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQsIGJ1dCB0aGUgdmFsdWUgaXMgbm90CithdmFpbGFibGUsIHRoZW4gYW4gZXJyb3IgcmVzdWx0cy4gIEZvciBleGFtcGxlLCBhIHNjcmlwdCBsaWtlIHRoZQorZm9sbG93aW5nCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK1NFQ1RJT05TCisgIEB7CisgICAgLnRleHQgOSt0aGlzX2lzbnRfY29uc3RhbnQgOiAKKyAgICAgIEB7ICooLnRleHQpIEB9CisgIEB9CitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorQG5vaW5kZW50Cit3aWxsIGNhdXNlIHRoZSBlcnJvciBtZXNzYWdlIEBzYW1we25vbiBjb25zdGFudCBleHByZXNzaW9uIGZvciBpbml0aWFsCithZGRyZXNzfS4KKworQG5vZGUgRXhwcmVzc2lvbiBTZWN0aW9uCitAc3Vic2VjdGlvbiBUaGUgU2VjdGlvbiBvZiBhbiBFeHByZXNzaW9uCitAY2luZGV4IGV4cHJlc3Npb24gc2VjdGlvbnMKK0BjaW5kZXggYWJzb2x1dGUgZXhwcmVzc2lvbnMKK0BjaW5kZXggcmVsYXRpdmUgZXhwcmVzc2lvbnMKK0BjaW5kZXggYWJzb2x1dGUgYW5kIHJlbG9jYXRhYmxlIHN5bWJvbHMKK0BjaW5kZXggcmVsb2NhdGFibGUgYW5kIGFic29sdXRlIHN5bWJvbHMKK0BjaW5kZXggc3ltYm9scywgcmVsb2NhdGFibGUgYW5kIGFic29sdXRlCitXaGVuIHRoZSBsaW5rZXIgZXZhbHVhdGVzIGFuIGV4cHJlc3Npb24sIHRoZSByZXN1bHQgaXMgZWl0aGVyIGFic29sdXRlCitvciByZWxhdGl2ZSB0byBzb21lIHNlY3Rpb24uICBBIHJlbGF0aXZlIGV4cHJlc3Npb24gaXMgZXhwcmVzc2VkIGFzIGEKK2ZpeGVkIG9mZnNldCBmcm9tIHRoZSBiYXNlIG9mIGEgc2VjdGlvbi4KKworVGhlIHBvc2l0aW9uIG9mIHRoZSBleHByZXNzaW9uIHdpdGhpbiB0aGUgbGlua2VyIHNjcmlwdCBkZXRlcm1pbmVzCit3aGV0aGVyIGl0IGlzIGFic29sdXRlIG9yIHJlbGF0aXZlLiAgQW4gZXhwcmVzc2lvbiB3aGljaCBhcHBlYXJzIHdpdGhpbgorYW4gb3V0cHV0IHNlY3Rpb24gZGVmaW5pdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiB0aGUgb3V0cHV0CitzZWN0aW9uLiAgQW4gZXhwcmVzc2lvbiB3aGljaCBhcHBlYXJzIGVsc2V3aGVyZSB3aWxsIGJlIGFic29sdXRlLgorCitBIHN5bWJvbCBzZXQgdG8gYSByZWxhdGl2ZSBleHByZXNzaW9uIHdpbGwgYmUgcmVsb2NhdGFibGUgaWYgeW91IHJlcXVlc3QKK3JlbG9jYXRhYmxlIG91dHB1dCB1c2luZyB0aGUgQHNhbXB7LXJ9IG9wdGlvbi4gIFRoYXQgbWVhbnMgdGhhdCBhCitmdXJ0aGVyIGxpbmsgb3BlcmF0aW9uIG1heSBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sJ3MKK3NlY3Rpb24gd2lsbCBiZSB0aGUgc2VjdGlvbiBvZiB0aGUgcmVsYXRpdmUgZXhwcmVzc2lvbi4KKworQSBzeW1ib2wgc2V0IHRvIGFuIGFic29sdXRlIGV4cHJlc3Npb24gd2lsbCByZXRhaW4gdGhlIHNhbWUgdmFsdWUKK3Rocm91Z2ggYW55IGZ1cnRoZXIgbGluayBvcGVyYXRpb24uICBUaGUgc3ltYm9sIHdpbGwgYmUgYWJzb2x1dGUsIGFuZAord2lsbCBub3QgaGF2ZSBhbnkgcGFydGljdWxhciBhc3NvY2lhdGVkIHNlY3Rpb24uCisKK1lvdSBjYW4gdXNlIHRoZSBidWlsdGluIGZ1bmN0aW9uIEBjb2Rle0FCU09MVVRFfSB0byBmb3JjZSBhbiBleHByZXNzaW9uCit0byBiZSBhYnNvbHV0ZSB3aGVuIGl0IHdvdWxkIG90aGVyd2lzZSBiZSByZWxhdGl2ZS4gIEZvciBleGFtcGxlLCB0bworY3JlYXRlIGFuIGFic29sdXRlIHN5bWJvbCBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgb3V0cHV0CitzZWN0aW9uIEBzYW1wey5kYXRhfToKK0BzbWFsbGV4YW1wbGUKK1NFQ1RJT05TCisgIEB7CisgICAgLmRhdGEgOiBAeyAqKC5kYXRhKSBfZWRhdGEgPSBBQlNPTFVURSguKTsgQH0KKyAgQH0KK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK0lmIEBzYW1we0FCU09MVVRFfSB3ZXJlIG5vdCB1c2VkLCBAc2FtcHtfZWRhdGF9IHdvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZQorQHNhbXB7LmRhdGF9IHNlY3Rpb24uCisKK0Bub2RlIEJ1aWx0aW4gRnVuY3Rpb25zCitAc3Vic2VjdGlvbiBCdWlsdGluIEZ1bmN0aW9ucworQGNpbmRleCBmdW5jdGlvbnMgaW4gZXhwcmVzc2lvbnMKK1RoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIGJ1aWx0aW4gZnVuY3Rpb25zIGZvcgordXNlIGluIGxpbmtlciBzY3JpcHQgZXhwcmVzc2lvbnMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQUJTT0xVVEUoQHZhcntleHB9KQorQGtpbmRleCBBQlNPTFVURShAdmFye2V4cH0pCitAY2luZGV4IGV4cHJlc3Npb24sIGFic29sdXRlCitSZXR1cm4gdGhlIGFic29sdXRlIChub24tcmVsb2NhdGFibGUsIGFzIG9wcG9zZWQgdG8gbm9uLW5lZ2F0aXZlKSB2YWx1ZQorb2YgdGhlIGV4cHJlc3Npb24gQHZhcntleHB9LiAgUHJpbWFyaWx5IHVzZWZ1bCB0byBhc3NpZ24gYW4gYWJzb2x1dGUKK3ZhbHVlIHRvIGEgc3ltYm9sIHdpdGhpbiBhIHNlY3Rpb24gZGVmaW5pdGlvbiwgd2hlcmUgc3ltYm9sIHZhbHVlcyBhcmUKK25vcm1hbGx5IHNlY3Rpb24gcmVsYXRpdmUuICBAeHJlZntFeHByZXNzaW9uIFNlY3Rpb259LgorCitAaXRlbSBBRERSKEB2YXJ7c2VjdGlvbn0pCitAa2luZGV4IEFERFIoQHZhcntzZWN0aW9ufSkKK0BjaW5kZXggc2VjdGlvbiBhZGRyZXNzIGluIGV4cHJlc3Npb24KK1JldHVybiB0aGUgYWJzb2x1dGUgYWRkcmVzcyAodGhlIFZNQSkgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBZb3VyCitzY3JpcHQgbXVzdCBwcmV2aW91c2x5IGhhdmUgZGVmaW5lZCB0aGUgbG9jYXRpb24gb2YgdGhhdCBzZWN0aW9uLiAgSW4KK3RoZSBmb2xsb3dpbmcgZXhhbXBsZSwgQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkCitpZGVudGljYWwgdmFsdWVzOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitTRUNUSU9OUyBAeyBAZG90c3t9CisgIC5vdXRwdXQxIDoKKyAgICBAeyAKKyAgICBzdGFydF9vZl9vdXRwdXRfMSA9IEFCU09MVVRFKC4pOworICAgIEBkb3Rze30KKyAgICBAfQorICAub3V0cHV0IDoKKyAgICBAeworICAgIHN5bWJvbF8xID0gQUREUigub3V0cHV0MSk7CisgICAgc3ltYm9sXzIgPSBzdGFydF9vZl9vdXRwdXRfMTsKKyAgICBAfQorQGRvdHN7fSBAfQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQGl0ZW0gQUxJR04oQHZhcntleHB9KQorQGtpbmRleCBBTElHTihAdmFye2V4cH0pCitAY2luZGV4IHJvdW5kIHVwIGxvY2F0aW9uIGNvdW50ZXIKK0BjaW5kZXggYWxpZ24gbG9jYXRpb24gY291bnRlcgorUmV0dXJuIHRoZSBsb2NhdGlvbiBjb3VudGVyIChAY29kZXsufSkgYWxpZ25lZCB0byB0aGUgbmV4dCBAdmFye2V4cH0KK2JvdW5kYXJ5LiAgQHZhcntleHB9IG11c3QgYmUgYW4gZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBhIHBvd2VyIG9mCit0d28uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KK0BzbWFsbGV4YW1wbGUKKyguICsgQHZhcntleHB9IC0gMSkgJiB+KEB2YXJ7ZXhwfSAtIDEpCitAZW5kIHNtYWxsZXhhbXBsZQorCitAY29kZXtBTElHTn0gZG9lc24ndCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLS0taXQganVzdAorZG9lcyBhcml0aG1ldGljIG9uIGl0LiAgSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIGFsaWducyB0aGUgb3V0cHV0CitAY29kZXsuZGF0YX0gc2VjdGlvbiB0byB0aGUgbmV4dCBAY29kZXsweDIwMDB9IGJ5dGUgYm91bmRhcnkgYWZ0ZXIgdGhlCitwcmVjZWRpbmcgc2VjdGlvbiBhbmQgc2V0cyBhIHZhcmlhYmxlIHdpdGhpbiB0aGUgc2VjdGlvbiB0byB0aGUgbmV4dAorQGNvZGV7MHg4MDAwfSBib3VuZGFyeSBhZnRlciB0aGUgaW5wdXQgc2VjdGlvbnM6CitAc21hbGxleGFtcGxlCitAZ3JvdXAKK1NFQ1RJT05TIEB7IEBkb3Rze30KKyAgLmRhdGEgQUxJR04oMHgyMDAwKTogQHsKKyAgICAqKC5kYXRhKQorICAgIHZhcmlhYmxlID0gQUxJR04oMHg4MDAwKTsKKyAgQH0KK0Bkb3Rze30gQH0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCitAbm9pbmRlbnQKK1RoZSBmaXJzdCB1c2Ugb2YgQGNvZGV7QUxJR059IGluIHRoaXMgZXhhbXBsZSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mCithIHNlY3Rpb24gYmVjYXVzZSBpdCBpcyB1c2VkIGFzIHRoZSBvcHRpb25hbCBAdmFye2FkZHJlc3N9IGF0dHJpYnV0ZSBvZgorYSBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQgU2VjdGlvbiBBZGRyZXNzfSkuICBUaGUgc2Vjb25kIHVzZQorb2YgQGNvZGV7QUxJR059IGlzIHVzZWQgdG8gZGVmaW5lcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuCisKK1RoZSBidWlsdGluIGZ1bmN0aW9uIEBjb2Rle05FWFR9IGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTn0uCisKK0BpdGVtIEJMT0NLKEB2YXJ7ZXhwfSkKK0BraW5kZXggQkxPQ0soQHZhcntleHB9KQorVGhpcyBpcyBhIHN5bm9ueW0gZm9yIEBjb2Rle0FMSUdOfSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaW5rZXIKK3NjcmlwdHMuICBJdCBpcyBtb3N0IG9mdGVuIHNlZW4gd2hlbiBzZXR0aW5nIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dAorc2VjdGlvbi4KKworQGl0ZW0gREVGSU5FRChAdmFye3N5bWJvbH0pCitAa2luZGV4IERFRklORUQoQHZhcntzeW1ib2x9KQorQGNpbmRleCBzeW1ib2wgZGVmYXVsdHMKK1JldHVybiAxIGlmIEB2YXJ7c3ltYm9sfSBpcyBpbiB0aGUgbGlua2VyIGdsb2JhbCBzeW1ib2wgdGFibGUgYW5kIGlzCitkZWZpbmVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb3ZpZGUKK2RlZmF1bHQgdmFsdWVzIGZvciBzeW1ib2xzLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2NyaXB0IGZyYWdtZW50CitzaG93cyBob3cgdG8gc2V0IGEgZ2xvYmFsIHN5bWJvbCBAc2FtcHtiZWdpbn0gdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluCit0aGUgQHNhbXB7LnRleHR9IHNlY3Rpb24tLS1idXQgaWYgYSBzeW1ib2wgY2FsbGVkIEBzYW1we2JlZ2lufSBhbHJlYWR5CitleGlzdGVkLCBpdHMgdmFsdWUgaXMgcHJlc2VydmVkOgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK1NFQ1RJT05TIEB7IEBkb3Rze30KKyAgLnRleHQgOiBAeworICAgIGJlZ2luID0gREVGSU5FRChiZWdpbikgPyBiZWdpbiA6IC4gOworICAgIEBkb3Rze30KKyAgQH0KKyAgQGRvdHN7fQorQH0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIExPQURBRERSKEB2YXJ7c2VjdGlvbn0pCitAa2luZGV4IExPQURBRERSKEB2YXJ7c2VjdGlvbn0pCitAY2luZGV4IHNlY3Rpb24gbG9hZCBhZGRyZXNzIGluIGV4cHJlc3Npb24KK1JldHVybiB0aGUgYWJzb2x1dGUgTE1BIG9mIHRoZSBuYW1lZCBAdmFye3NlY3Rpb259LiAgVGhpcyBpcyBub3JtYWxseQordGhlIHNhbWUgYXMgQGNvZGV7QUREUn0sIGJ1dCBpdCBtYXkgYmUgZGlmZmVyZW50IGlmIHRoZSBAY29kZXtBVH0KK2F0dHJpYnV0ZSBpcyB1c2VkIGluIHRoZSBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIChAcHhyZWZ7T3V0cHV0CitTZWN0aW9uIExNQX0pLgorCitAa2luZGV4IE1BWAorQGl0ZW0gTUFYKEB2YXJ7ZXhwMX0sIEB2YXJ7ZXhwMn0pCitSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIEB2YXJ7ZXhwMX0gYW5kIEB2YXJ7ZXhwMn0uCisKK0BraW5kZXggTUlOCitAaXRlbSBNSU4oQHZhcntleHAxfSwgQHZhcntleHAyfSkKK1JldHVybnMgdGhlIG1pbmltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KKworQGl0ZW0gTkVYVChAdmFye2V4cH0pCitAa2luZGV4IE5FWFQoQHZhcntleHB9KQorQGNpbmRleCB1bmFsbG9jYXRlZCBhZGRyZXNzLCBuZXh0CitSZXR1cm4gdGhlIG5leHQgdW5hbGxvY2F0ZWQgYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgQHZhcntleHB9LgorVGhpcyBmdW5jdGlvbiBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gQGNvZGV7QUxJR04oQHZhcntleHB9KX07IHVubGVzcyB5b3UKK3VzZSB0aGUgQGNvZGV7TUVNT1JZfSBjb21tYW5kIHRvIGRlZmluZSBkaXNjb250aW51b3VzIG1lbW9yeSBmb3IgdGhlCitvdXRwdXQgZmlsZSwgdGhlIHR3byBmdW5jdGlvbnMgYXJlIGVxdWl2YWxlbnQuCisKK0BpdGVtIFNJWkVPRihAdmFye3NlY3Rpb259KQorQGtpbmRleCBTSVpFT0YoQHZhcntzZWN0aW9ufSkKK0BjaW5kZXggc2VjdGlvbiBzaXplCitSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0sIGlmIHRoYXQgc2VjdGlvbiBoYXMKK2JlZW4gYWxsb2NhdGVkLiAgSWYgdGhlIHNlY3Rpb24gaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB3aGVuIHRoaXMgaXMKK2V2YWx1YXRlZCwgdGhlIGxpbmtlciB3aWxsIHJlcG9ydCBhbiBlcnJvci4gIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwKK0Bjb2Rle3N5bWJvbF8xfSBhbmQgQGNvZGV7c3ltYm9sXzJ9IGFyZSBhc3NpZ25lZCBpZGVudGljYWwgdmFsdWVzOgorQHNtYWxsZXhhbXBsZQorQGdyb3VwCitTRUNUSU9OU0B7IEBkb3Rze30KKyAgLm91dHB1dCBAeworICAgIC5zdGFydCA9IC4gOworICAgIEBkb3Rze30KKyAgICAuZW5kID0gLiA7CisgICAgQH0KKyAgc3ltYm9sXzEgPSAuZW5kIC0gLnN0YXJ0IDsKKyAgc3ltYm9sXzIgPSBTSVpFT0YoLm91dHB1dCk7CitAZG90c3t9IEB9CitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorCitAaXRlbSBTSVpFT0ZfSEVBREVSUworQGl0ZW14IHNpemVvZl9oZWFkZXJzCitAa2luZGV4IFNJWkVPRl9IRUFERVJTCitAY2luZGV4IGhlYWRlciBzaXplCitSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG91dHB1dCBmaWxlJ3MgaGVhZGVycy4gIFRoaXMgaXMKK2luZm9ybWF0aW9uIHdoaWNoIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgZmlsZS4gIFlvdSBjYW4gdXNlCit0aGlzIG51bWJlciB3aGVuIHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlY3Rpb24sIGlmIHlvdQorY2hvb3NlLCB0byBmYWNpbGl0YXRlIHBhZ2luZy4KKworQGNpbmRleCBub3QgZW5vdWdoIHJvb20gZm9yIHByb2dyYW0gaGVhZGVycworQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMsIG5vdCBlbm91Z2ggcm9vbQorV2hlbiBwcm9kdWNpbmcgYW4gRUxGIG91dHB1dCBmaWxlLCBpZiB0aGUgbGlua2VyIHNjcmlwdCB1c2VzIHRoZQorQGNvZGV7U0laRU9GX0hFQURFUlN9IGJ1aWx0aW4gZnVuY3Rpb24sIHRoZSBsaW5rZXIgbXVzdCBjb21wdXRlIHRoZQorbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyBiZWZvcmUgaXQgaGFzIGRldGVybWluZWQgYWxsIHRoZSBzZWN0aW9uCithZGRyZXNzZXMgYW5kIHNpemVzLiAgSWYgdGhlIGxpbmtlciBsYXRlciBkaXNjb3ZlcnMgdGhhdCBpdCBuZWVkcworYWRkaXRpb25hbCBwcm9ncmFtIGhlYWRlcnMsIGl0IHdpbGwgcmVwb3J0IGFuIGVycm9yIEBzYW1we25vdCBlbm91Z2gKK3Jvb20gZm9yIHByb2dyYW0gaGVhZGVyc30uICBUbyBhdm9pZCB0aGlzIGVycm9yLCB5b3UgbXVzdCBhdm9pZCB1c2luZwordGhlIEBjb2Rle1NJWkVPRl9IRUFERVJTfSBmdW5jdGlvbiwgb3IgeW91IG11c3QgcmV3b3JrIHlvdXIgbGlua2VyCitzY3JpcHQgdG8gYXZvaWQgZm9yY2luZyB0aGUgbGlua2VyIHRvIHVzZSBhZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgb3IKK3lvdSBtdXN0IGRlZmluZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIHlvdXJzZWxmIHVzaW5nIHRoZSBAY29kZXtQSERSU30KK2NvbW1hbmQgKEBweHJlZntQSERSU30pLgorQGVuZCB0YWJsZQorCitAbm9kZSBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cworQHNlY3Rpb24gSW1wbGljaXQgTGlua2VyIFNjcmlwdHMKK0BjaW5kZXggaW1wbGljaXQgbGlua2VyIHNjcmlwdHMKK0lmIHlvdSBzcGVjaWZ5IGEgbGlua2VyIGlucHV0IGZpbGUgd2hpY2ggdGhlIGxpbmtlciBjYW4gbm90IHJlY29nbml6ZSBhcworYW4gb2JqZWN0IGZpbGUgb3IgYW4gYXJjaGl2ZSBmaWxlLCBpdCB3aWxsIHRyeSB0byByZWFkIHRoZSBmaWxlIGFzIGEKK2xpbmtlciBzY3JpcHQuICBJZiB0aGUgZmlsZSBjYW4gbm90IGJlIHBhcnNlZCBhcyBhIGxpbmtlciBzY3JpcHQsIHRoZQorbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLgorCitBbiBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdpbGwgbm90IHJlcGxhY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KKworVHlwaWNhbGx5IGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd291bGQgY29udGFpbiBvbmx5IHN5bWJvbAorYXNzaWdubWVudHMsIG9yIHRoZSBAY29kZXtJTlBVVH0sIEBjb2Rle0dST1VQfSwgb3IgQGNvZGV7VkVSU0lPTn0KK2NvbW1hbmRzLgorCitBbnkgaW5wdXQgZmlsZXMgcmVhZCBiZWNhdXNlIG9mIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBiZSByZWFkCithdCB0aGUgcG9zaXRpb24gaW4gdGhlIGNvbW1hbmQgbGluZSB3aGVyZSB0aGUgaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3YXMKK3JlYWQuICBUaGlzIGNhbiBhZmZlY3QgYXJjaGl2ZSBzZWFyY2hpbmcuCisKK0BpZnNldCBHRU5FUklDCitAbm9kZSBNYWNoaW5lIERlcGVuZGVudAorQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKKworQGNpbmRleCBtYWNoaW5lIGRlcGVuZGVuY2llcworQGNvZGV7bGR9IGhhcyBhZGRpdGlvbmFsIGZlYXR1cmVzIG9uIHNvbWUgcGxhdGZvcm1zOyB0aGUgZm9sbG93aW5nCitzZWN0aW9ucyBkZXNjcmliZSB0aGVtLiAgTWFjaGluZXMgd2hlcmUgQGNvZGV7bGR9IGhhcyBubyBhZGRpdGlvbmFsCitmdW5jdGlvbmFsaXR5IGFyZSBub3QgbGlzdGVkLgorCitAbWVudQorKiBIOC8zMDA6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKKyogaTk2MDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQorKiBBUk06OgkJCQlAY29kZXtsZH0gYW5kIHRoZSBBUk0gZmFtaWx5CitAZW5kIG1lbnUKK0BlbmQgaWZzZXQKKworQGMgRklYTUUhICBUaGlzIGNvdWxkIHVzZSBAcmFpc2VzZWN0aW9ucy9AbG93ZXJzZWN0aW9ucywgYnV0IHRoZXJlIHNlZW1zIHRvIGJlIGEgY29uZmxpY3QKK0BjICAgICAgICAgYmV0d2VlbiB0aG9zZSBhbmQgbm9kZS1kZWZhdWx0aW5nLgorQGlmc2V0IEg4MzAwCitAaWZjbGVhciBHRU5FUklDCitAcmFpc2VzZWN0aW9ucworQGVuZCBpZmNsZWFyCisKK0Bub2RlIEg4LzMwMAorQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSDgvMzAwCisKK0BjaW5kZXggSDgvMzAwIHN1cHBvcnQKK0ZvciB0aGUgSDgvMzAwLCBAY29kZXtsZH0gY2FuIHBlcmZvcm0gdGhlc2UgZ2xvYmFsIG9wdGltaXphdGlvbnMgd2hlbgoreW91IHNwZWNpZnkgdGhlIEBzYW1wey0tcmVsYXh9IGNvbW1hbmQtbGluZSBvcHRpb24uCisKK0B0YWJsZSBAZW1waAorQGNpbmRleCByZWxheGluZyBvbiBIOC8zMDAKK0BpdGVtIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMKK0Bjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7anNyfSBhbmQgQGNvZGV7am1wfSBpbnN0cnVjdGlvbnMgd2hvc2UKK3RhcmdldHMgYXJlIHdpdGhpbiBlaWdodCBiaXRzLCBhbmQgdHVybnMgdGhlbSBpbnRvIGVpZ2h0LWJpdAorcHJvZ3JhbS1jb3VudGVyIHJlbGF0aXZlIEBjb2Rle2Jzcn0gYW5kIEBjb2Rle2JyYX0gaW5zdHJ1Y3Rpb25zLAorcmVzcGVjdGl2ZWx5LgorCitAY2luZGV4IHN5bnRoZXNpemluZyBvbiBIOC8zMDAKK0BpdGVtIHN5bnRoZXNpemluZyBpbnN0cnVjdGlvbnMKK0BjIEZJWE1FOiBzcGVjaWZpY2FsbHkgbW92LmIsIG9yIGFueSBtb3YgaW5zdHJ1Y3Rpb25zIHJlYWxseT8KK0Bjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7bW92LmJ9IGluc3RydWN0aW9ucyB3aGljaCB1c2UgdGhlCitzaXh0ZWVuLWJpdCBhYnNvbHV0ZSBhZGRyZXNzIGZvcm0sIGJ1dCByZWZlciB0byB0aGUgdG9wCitwYWdlIG9mIG1lbW9yeSwgYW5kIGNoYW5nZXMgdGhlbSB0byB1c2UgdGhlIGVpZ2h0LWJpdCBhZGRyZXNzIGZvcm0uCisoVGhhdCBpczogdGhlIGxpbmtlciB0dXJucyBAc2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfToxNn0gaW50bworQHNhbXB7bW92LmIgQGNvZGV7QEB9QHZhcnthYX06OH0gd2hlbmV2ZXIgdGhlIGFkZHJlc3MgQHZhcnthYX0gaXMgaW4gdGhlCit0b3AgcGFnZSBvZiBtZW1vcnkpLgorQGVuZCB0YWJsZQorCitAaWZjbGVhciBHRU5FUklDCitAbG93ZXJzZWN0aW9ucworQGVuZCBpZmNsZWFyCitAZW5kIGlmc2V0CisKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZnNldCBIaXRhY2hpCitAYyBUaGlzIHN0dWZmIGlzIHBvaW50bGVzcyB0byBzYXkgdW5sZXNzIHlvdSdyZSBlc3BlY2lhbGx5IGNvbmNlcm5lZAorQGMgd2l0aCBIaXRhY2hpIGNoaXBzOyBkb24ndCBlbmFibGUgaXQgZm9yIGdlbmVyaWMgY2FzZSwgcGxlYXNlLgorQG5vZGUgSGl0YWNoaQorQGNoYXB0ZXIgQGNvZGV7bGR9IGFuZCBvdGhlciBIaXRhY2hpIGNoaXBzCisKK0Bjb2Rle2xkfSBhbHNvIHN1cHBvcnRzIHRoZSBIOC8zMDBILCB0aGUgSDgvNTAwLCBhbmQgdGhlIEhpdGFjaGkgU0guICBObworc3BlY2lhbCBmZWF0dXJlcywgY29tbWFuZHMsIG9yIGNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSByZXF1aXJlZCBmb3IKK3RoZXNlIGNoaXBzLgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBJOTYwCitAaWZjbGVhciBHRU5FUklDCitAcmFpc2VzZWN0aW9ucworQGVuZCBpZmNsZWFyCisKK0Bub2RlIGk5NjAKK0BzZWN0aW9uIEBjb2Rle2xkfSBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHkKKworQGNpbmRleCBpOTYwIHN1cHBvcnQKKworWW91IGNhbiB1c2UgdGhlIEBzYW1wey1BQHZhcnthcmNoaXRlY3R1cmV9fSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvCitzcGVjaWZ5IG9uZSBvZiB0aGUgdHdvLWxldHRlciBuYW1lcyBpZGVudGlmeWluZyBtZW1iZXJzIG9mIHRoZSA5NjAKK2ZhbWlseTsgdGhlIG9wdGlvbiBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgb3V0cHV0IHRhcmdldCwgYW5kIHdhcm5zIG9mIGFueQoraW5jb21wYXRpYmxlIGluc3RydWN0aW9ucyBpbiB0aGUgaW5wdXQgZmlsZXMuICBJdCBhbHNvIG1vZGlmaWVzIHRoZQorbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8gc3VwcG9ydCB0aGUgdXNlIG9mCitsaWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZSwgYnkgaW5jbHVkaW5nIGluIHRoZQorc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBhcmNoaXRlY3R1cmUuCisKK0ZvciBleGFtcGxlLCBpZiB5b3VyIEBjb2Rle2xkfSBjb21tYW5kIGxpbmUgaW5jbHVkZWQgQHd7QHNhbXB7LUFDQX19IGFzCit3ZWxsIGFzIEB3e0BzYW1wey1sdHJ5fX0sIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAorcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBAc2FtcHstTH0pIGZvciBhIGxpYnJhcnkgd2l0aAordGhlIG5hbWVzCisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAordHJ5CitsaWJ0cnkuYQordHJ5Y2EKK2xpYnRyeWNhLmEKK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorVGhlIGZpcnN0IHR3byBwb3NzaWJpbGl0aWVzIHdvdWxkIGJlIGNvbnNpZGVyZWQgaW4gYW55IGV2ZW50OyB0aGUgbGFzdAordHdvIGFyZSBkdWUgdG8gdGhlIHVzZSBvZiBAd3tAc2FtcHstQUNBfX0uCisKK1lvdSBjYW4gbWVhbmluZ2Z1bGx5IHVzZSBAc2FtcHstQX0gbW9yZSB0aGFuIG9uY2Ugb24gYSBjb21tYW5kIGxpbmUsIHNpbmNlCit0aGUgOTYwIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCit1c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIEB3e0BzYW1wey1sfX0KK3NwZWNpZmllcyBhIGxpYnJhcnkuCisKK0BjaW5kZXggQGNvZGV7LS1yZWxheH0gb24gaTk2MAorQGNpbmRleCByZWxheGluZyBvbiBpOTYwCitAY29kZXtsZH0gc3VwcG9ydHMgdGhlIEBzYW1wey0tcmVsYXh9IG9wdGlvbiBmb3IgdGhlIGk5NjAgZmFtaWx5LiAgSWYKK3lvdSBzcGVjaWZ5IEBzYW1wey0tcmVsYXh9LCBAY29kZXtsZH0gZmluZHMgYWxsIEBjb2Rle2JhbHh9IGFuZAorQGNvZGV7Y2FseH0gaW5zdHJ1Y3Rpb25zIHdob3NlIHRhcmdldHMgYXJlIHdpdGhpbiAyNCBiaXRzLCBhbmQgdHVybnMKK3RoZW0gaW50byAyNC1iaXQgcHJvZ3JhbS1jb3VudGVyIHJlbGF0aXZlIEBjb2Rle2JhbH0gYW5kIEBjb2Rle2NhbH0KK2luc3RydWN0aW9ucywgcmVzcGVjdGl2ZWx5LiAgQGNvZGV7bGR9IGFsc28gdHVybnMgQGNvZGV7Y2FsfQoraW5zdHJ1Y3Rpb25zIGludG8gQGNvZGV7YmFsfSBpbnN0cnVjdGlvbnMgd2hlbiBpdCBkZXRlcm1pbmVzIHRoYXQgdGhlCit0YXJnZXQgc3Vicm91dGluZSBpcyBhIGxlYWYgcm91dGluZSAodGhhdCBpcywgdGhlIHRhcmdldCBzdWJyb3V0aW5lIGRvZXMKK25vdCBpdHNlbGYgY2FsbCBhbnkgc3Vicm91dGluZXMpLgorCitAaWZjbGVhciBHRU5FUklDCitAbG93ZXJzZWN0aW9ucworQGVuZCBpZmNsZWFyCitAZW5kIGlmc2V0CisKK0BpZmNsZWFyIEdFTkVSSUMKK0ByYWlzZXNlY3Rpb25zCitAZW5kIGlmY2xlYXIKKworQG5vZGUgQVJNCitAc2VjdGlvbiBAY29kZXtsZH0ncyBzdXBwb3J0IGZvciBpbnRlcndvcmtpbmcgYmV0d2VlbiBBUk0gYW5kIFRodW1iIGNvZGUKKworQGNpbmRleCBBUk0gaW50ZXJ3b3JraW5nIHN1cHBvcnQKK0BjaW5kZXggLS1zdXBwb3J0LW9sZC1jb2RlCitGb3IgdGhlIEFSTSwgQGNvZGV7bGR9IHdpbGwgZ2VuZXJhdGUgY29kZSBzdHVicyB0byBhbGxvdyBmdW5jdGlvbnMgY2FsbHMKK2JldHdlZW0gQVJNIGFuZCBUaHVtYiBjb2RlLiAgVGhlc2Ugc3R1YnMgb25seSB3b3JrIHdpdGggY29kZSB0aGF0IGhhcworYmVlbiBjb21waWxlZCBhbmQgYXNzZW1ibGVkIHdpdGggdGhlIEBzYW1wey1tdGh1bWItaW50ZXJ3b3JrfSBjb21tYW5kCitsaW5lIG9wdGlvbi4gIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBsaW5rIHdpdGggb2xkIEFSTSBvYmplY3QgZmlsZXMgb3IKK2xpYnJhcmllcywgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21waWxlZCB3aXRoIHRoZSAtbXRodW1iLWludGVyd29yaworb3B0aW9uIHRoZW4gdGhlIEBzYW1wey0tc3VwcG9ydC1vbGQtY29kZX0gY29tbWFuZCBsaW5lIHN3aXRjaCBzaG91bGQgYmUKK2dpdmVuIHRvIHRoZSBsaW5rZXIuICBUaGlzIHdpbGwgbWFrZSBpdCBnZW5lcmF0ZSBsYXJnZXIgc3R1YiBmdW5jdGlvbnMKK3doaWNoIHdpbGwgd29yayB3aXRoIG5vbi1pbnRlcndvcmtpbmcgYXdhcmUgQVJNIGNvZGUuICBOb3RlLCBob3dldmVyLAordGhlIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGdlbmVyYXRpbmcgc3R1YnMgZm9yIGZ1bmN0aW9uIGNhbGxzIHRvCitub24taW50ZXJ3b3JraW5nIGF3YXJlIFRodW1iIGNvZGUuCisKK0BpZmNsZWFyIEdFTkVSSUMKK0Bsb3dlcnNlY3Rpb25zCitAZW5kIGlmY2xlYXIKKworQGlmY2xlYXIgU2luZ2xlRm9ybWF0CitAbm9kZSBCRkQKK0BjaGFwdGVyIEJGRAorCitAY2luZGV4IGJhY2sgZW5kCitAY2luZGV4IG9iamVjdCBmaWxlIG1hbmFnZW1lbnQKK0BjaW5kZXggb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCitAa2luZGV4IG9iamR1bXAgLWkKK1RoZSBsaW5rZXIgYWNjZXNzZXMgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIHVzaW5nIHRoZSBCRkQgbGlicmFyaWVzLgorVGhlc2UgbGlicmFyaWVzIGFsbG93IHRoZSBsaW5rZXIgdG8gdXNlIHRoZSBzYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24KK29iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKK2Zvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieSBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZworaXQgdG8gdGhlIGxpYnJhcnkuICBUbyBjb25zZXJ2ZSBydW50aW1lIG1lbW9yeSwgaG93ZXZlciwgdGhlIGxpbmtlciBhbmQKK2Fzc29jaWF0ZWQgdG9vbHMgYXJlIHVzdWFsbHkgY29uZmlndXJlZCB0byBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlCitvYmplY3QgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZS4gIFlvdSBjYW4gdXNlIEBjb2Rle29iamR1bXAgLWl9CisoQHB4cmVme29iamR1bXAsLG9iamR1bXAsYmludXRpbHMuaW5mbyxUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXN9KSB0bworbGlzdCBhbGwgdGhlIGZvcm1hdHMgYXZhaWxhYmxlIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uCisKK0BjaW5kZXggQkZEIHJlcXVpcmVtZW50cworQGNpbmRleCByZXF1aXJlbWVudHMgZm9yIEJGRAorQXMgd2l0aCBtb3N0IGltcGxlbWVudGF0aW9ucywgQkZEIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuCitzZXZlcmFsIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gVGhlIG1ham9yIGZhY3RvciBpbmZsdWVuY2luZworQkZEIGRlc2lnbiB3YXMgZWZmaWNpZW5jeTogYW55IHRpbWUgdXNlZCBjb252ZXJ0aW5nIGJldHdlZW4KK2Zvcm1hdHMgaXMgdGltZSB3aGljaCB3b3VsZCBub3QgaGF2ZSBiZWVuIHNwZW50IGhhZCBCRkQgbm90CitiZWVuIGludm9sdmVkLiBUaGlzIGlzIHBhcnRseSBvZmZzZXQgYnkgYWJzdHJhY3Rpb24gcGF5YmFjazsgc2luY2UKK0JGRCBzaW1wbGlmaWVzIGFwcGxpY2F0aW9ucyBhbmQgYmFjayBlbmRzLCBtb3JlIHRpbWUgYW5kIGNhcmUKK21heSBiZSBzcGVudCBvcHRpbWl6aW5nIGFsZ29yaXRobXMgZm9yIGEgZ3JlYXRlciBzcGVlZC4KKworT25lIG1pbm9yIGFydGlmYWN0IG9mIHRoZSBCRkQgc29sdXRpb24gd2hpY2ggeW91IHNob3VsZCBiZWFyIGluCittaW5kIGlzIHRoZSBwb3RlbnRpYWwgZm9yIGluZm9ybWF0aW9uIGxvc3MuICBUaGVyZSBhcmUgdHdvIHBsYWNlcyB3aGVyZQordXNlZnVsIGluZm9ybWF0aW9uIGNhbiBiZSBsb3N0IHVzaW5nIHRoZSBCRkQgbWVjaGFuaXNtOiBkdXJpbmcKK2NvbnZlcnNpb24gYW5kIGR1cmluZyBvdXRwdXQuIEB4cmVme0JGRCBpbmZvcm1hdGlvbiBsb3NzfS4KKworQG1lbnUKKyogQkZEIG91dGxpbmU6OiAgICAgICAgICAgICAgICAgSG93IGl0IHdvcmtzOiBhbiBvdXRsaW5lIG9mIEJGRAorQGVuZCBtZW51CisKK0Bub2RlIEJGRCBvdXRsaW5lCitAc2VjdGlvbiBIb3cgaXQgd29ya3M6IGFuIG91dGxpbmUgb2YgQkZECitAY2luZGV4IG9wZW5pbmcgb2JqZWN0IGZpbGVzCitAaW5jbHVkZSBiZmRzdW1tLnRleGkKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBSZXBvcnRpbmcgQnVncworQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKK0BjaW5kZXggYnVncyBpbiBAY29kZXtsZH0KK0BjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gQGNvZGV7bGR9CisKK1lvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7bGR9IHJlbGlhYmxlLgorCitSZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvcgoraXQgbWF5IG5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcwordG8gaGVscCB0aGUgZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiBAY29kZXtsZH0KK3dvcmsgYmV0dGVyLiAgQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZgorQGNvZGV7bGR9LgorCitJbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQoraW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgorCitAbWVudQorKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KKyogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCitAZW5kIG1lbnUKKworQG5vZGUgQnVnIENyaXRlcmlhCitAc2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KK0BjaW5kZXggYnVnIGNyaXRlcmlhCisKK0lmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAY2luZGV4IGZhdGFsIHNpZ25hbAorQGNpbmRleCBsaW5rZXIgY3Jhc2gKK0BjaW5kZXggY3Jhc2ggb2YgbGlua2VyCitAaXRlbQorSWYgdGhlIGxpbmtlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKK0Bjb2Rle2xkfSBidWcuICBSZWxpYWJsZSBsaW5rZXJzIG5ldmVyIGNyYXNoLgorCitAY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0CitAaXRlbQorSWYgQGNvZGV7bGR9IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEgYnVnLgorCitAY2luZGV4IGludmFsaWQgaW5wdXQKK0BpdGVtCitJZiBAY29kZXtsZH0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0CittYXkgYmUgYSBidWcuICBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgbGlua2VyIGNhbiBub3QgdmVyaWZ5IHRoYXQKK29iamVjdCBmaWxlcyBhcmUgY29ycmVjdC4KKworQGl0ZW0KK0lmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBsaW5rZXJzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvcgoraW1wcm92ZW1lbnQgb2YgQGNvZGV7bGR9IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIEJ1ZyBSZXBvcnRpbmcKK0BzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncworQGNpbmRleCBidWcgcmVwb3J0cworQGNpbmRleCBAY29kZXtsZH0gYnVncywgcmVwb3J0aW5nCisKK0EgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KK3Byb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIEBjb2Rle2xkfSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlCityZWNvbW1lbmQgeW91IGNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCisKK1lvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAoraW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcworZGlzdHJpYnV0aW9uLgorCitPdGhlcndpc2UsIHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle2xkfSB0bworQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCisKK1RoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKK0BzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKK2ZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKKworT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUKK3Byb2JsZW0gYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0Cithc3N1bWUgdGhhdCB0aGUgbmFtZSBvZiBhIHN5bWJvbCB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgorV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMKK2Egc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlCit0aGF0IG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZQorY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSBsaW5rZXIgaW50byBkb2luZyB0aGUgcmlnaHQKK3RoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQgZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZQorZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywgYW5kIHRoZSBtb3N0IGhlbHBmdWwuCisKK0tlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKK2l0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KK3RoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KKworU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCitiZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KK0BlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAorYnVncyBwcm9wZXJseS4KKworVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1RoZSB2ZXJzaW9uIG9mIEBjb2Rle2xkfS4gIEBjb2Rle2xkfSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0IGl0IHdpdGgKK3RoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgorCitXaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKK3RoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtsZH0uCisKK0BpdGVtCitBbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgaW5jbHVkaW5nIGFueQorcGF0Y2hlcyBtYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCisKK0BpdGVtCitUaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAordmVyc2lvbiBudW1iZXIuCisKK0BpdGVtCitXaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7bGR9LS0tZS5nLgorYGBAY29kZXtnY2MtMi43fScnLgorCitAaXRlbQorVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBsaW5rZXIgdG8gbGluayB5b3VyIGV4YW1wbGUgYW5kCitvYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwKK2xpc3QgdGhlbSBhbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMKK3N1ZmZpY2llbnQuCisKK0lmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCithbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCisKK0BpdGVtCitBIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKK2J1Zy4gIEl0IGlzIGdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywKK3V1ZW5jb2RlZCBpZiBuZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbQorYXZhaWxhYmxlIGZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5CityZWFzb25hYmxlIGNob2ljZSBmb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgYXNzZW1ibGVkIHVzaW5nIEBjb2Rle2dhc30gb3IgY29tcGlsZWQgdXNpbmcKK0Bjb2Rle2djY30sIHRoZW4gaXQgbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUKK29iamVjdCBmaWxlcy4gIEluIHRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YKK0Bjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheQoraG93IEBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3ZXJlIGNvbmZpZ3VyZWQuCisKK0BpdGVtCitBIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcworaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJworCitPZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtsZH0gZ2V0cyBhIGZhdGFsIHNpZ25hbCwgdGhlbiB3ZQord2lsbCBjZXJ0YWlubHkgbm90aWNlIGl0LiAgQnV0IGlmIHRoZSBidWcgaXMgaW5jb3JyZWN0IG91dHB1dCwgd2UgbWlnaHQKK25vdCBub3RpY2UgdW5sZXNzIGl0IGlzIGdsYXJpbmdseSB3cm9uZy4gIFlvdSBtaWdodCBhcyB3ZWxsIG5vdCBnaXZlIHVzCithIGNoYW5jZSB0byBtYWtlIGEgbWlzdGFrZS4KKworRXZlbiBpZiB0aGUgcHJvYmxlbSB5b3UgZXhwZXJpZW5jZSBpcyBhIGZhdGFsIHNpZ25hbCwgeW91IHNob3VsZCBzdGlsbAorc2F5IHNvIGV4cGxpY2l0bHkuICBTdXBwb3NlIHNvbWV0aGluZyBzdHJhbmdlIGlzIGdvaW5nIG9uLCBzdWNoIGFzLCB5b3VyCitjb3B5IG9mIEBjb2Rle2xkfSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZQorQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaAorYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzCitmYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYKK3lvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdworYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgorCitAaXRlbQorSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtsZH0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKK2RpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yCitAc2FtcHstcH0gb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLgorSWYgeW91IGV2ZW4gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5Citjb250ZXh0LCBub3QgYnkgbGluZSBudW1iZXIuCisKK1RoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgorc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCitAZW5kIGl0ZW1pemUKKworSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0EgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCisKK09mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZword2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAorY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCisKK1RoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCit3aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCit3aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KK1dlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCisKK09mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQorb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKK291dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKK2xlc3MgdGltZSwgYW5kIHNvIG9uLgorCitIb3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAorcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgorCitAaXRlbQorQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KKworQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAordGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CithIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCit0byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KKworU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle2xkfSBpdCBpcyB2ZXJ5IGhhcmQgdG8KK2NvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aAordGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUKK2FibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzCitmaXhlZC4KKworQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKK3BhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKK2hlbHAgdXMgdG8gdW5kZXJzdGFuZC4KKworQGl0ZW0KK0EgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KKworU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAordGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgorQGVuZCBpdGVtaXplCisKK0Bub2RlIE1SSQorQGFwcGVuZGl4IE1SSSBDb21wYXRpYmxlIFNjcmlwdCBGaWxlcworQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eQorVG8gYWlkIHVzZXJzIG1ha2luZyB0aGUgdHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXtsZH0gZnJvbSB0aGUgTVJJCitsaW5rZXIsIEBjb2Rle2xkfSBjYW4gdXNlIE1SSSBjb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzIGFzIGFuCithbHRlcm5hdGl2ZSB0byB0aGUgbW9yZSBnZW5lcmFsLXB1cnBvc2UgbGlua2VyIHNjcmlwdGluZyBsYW5ndWFnZQorZGVzY3JpYmVkIGluIEByZWZ7U2NyaXB0c30uICBNUkkgY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cyBoYXZlIGEgbXVjaAorc2ltcGxlciBjb21tYW5kIHNldCB0aGFuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb3RoZXJ3aXNlIHVzZWQgd2l0aAorQGNvZGV7bGR9LiAgQHNje2dudX0gQGNvZGV7bGR9IHN1cHBvcnRzIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgTVJJCitsaW5rZXIgY29tbWFuZHM7IHRoZXNlIGNvbW1hbmRzIGFyZSBkZXNjcmliZWQgaGVyZS4KKworSW4gZ2VuZXJhbCwgTVJJIHNjcmlwdHMgYXJlbid0IG9mIG11Y2ggdXNlIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvYmplY3QKK2ZpbGUgZm9ybWF0LCBzaW5jZSBpdCBvbmx5IGhhcyB0aHJlZSBzZWN0aW9ucyBhbmQgTVJJIHNjcmlwdHMgbGFjayBzb21lCitmZWF0dXJlcyB0byBtYWtlIHVzZSBvZiB0aGVtLgorCitZb3UgY2FuIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0IHVzaW5nIHRoZQorQHNhbXB7LWN9IGNvbW1hbmQtbGluZSBvcHRpb24uCisKK0VhY2ggY29tbWFuZCBpbiBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQgb2NjdXBpZXMgaXRzIG93biBsaW5lOyBlYWNoCitjb21tYW5kIGxpbmUgc3RhcnRzIHdpdGggdGhlIGtleXdvcmQgdGhhdCBpZGVudGlmaWVzIHRoZSBjb21tYW5kICh0aG91Z2gKK2JsYW5rIGxpbmVzIGFyZSBhbHNvIGFsbG93ZWQgZm9yIHB1bmN0dWF0aW9uKS4gIElmIGEgbGluZSBvZiBhbgorTVJJLWNvbXBhdGlibGUgc2NyaXB0IGJlZ2lucyB3aXRoIGFuIHVucmVjb2duaXplZCBrZXl3b3JkLCBAY29kZXtsZH0KK2lzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGNvbnRpbnVlcyBwcm9jZXNzaW5nIHRoZSBzY3JpcHQuCisKK0xpbmVzIGJlZ2lubmluZyB3aXRoIEBzYW1weyp9IGFyZSBjb21tZW50cy4KKworWW91IGNhbiB3cml0ZSB0aGVzZSBjb21tYW5kcyB1c2luZyBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzLCBvciBhbGwKK2xvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtjaGlwfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHtDSElQfS4KK1RoZSBmb2xsb3dpbmcgbGlzdCBzaG93cyBvbmx5IHRoZSB1cHBlci1jYXNlIGZvcm0gb2YgZWFjaCBjb21tYW5kLgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7QUJTT0xVVEV9IChNUkkpCitAaXRlbSBBQlNPTFVURSBAdmFye3NlY25hbWV9CitAaXRlbXggQUJTT0xVVEUgQHZhcntzZWNuYW1lfSwgQHZhcntzZWNuYW1lfSwgQGRvdHN7fSBAdmFye3NlY25hbWV9CitOb3JtYWxseSwgQGNvZGV7bGR9IGluY2x1ZGVzIGluIHRoZSBvdXRwdXQgZmlsZSBhbGwgc2VjdGlvbnMgZnJvbSBhbGwKK3RoZSBpbnB1dCBmaWxlcy4gIEhvd2V2ZXIsIGluIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCwgeW91IGNhbiB1c2UgdGhlCitAY29kZXtBQlNPTFVURX0gY29tbWFuZCB0byByZXN0cmljdCB0aGUgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4KK3lvdXIgb3V0cHV0IHByb2dyYW0uICBJZiB0aGUgQGNvZGV7QUJTT0xVVEV9IGNvbW1hbmQgaXMgdXNlZCBhdCBhbGwgaW4gYQorc2NyaXB0LCB0aGVuIG9ubHkgdGhlIHNlY3Rpb25zIG5hbWVkIGV4cGxpY2l0bHkgaW4gQGNvZGV7QUJTT0xVVEV9Citjb21tYW5kcyB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dC4gIFlvdSBjYW4gc3RpbGwgdXNlIG90aGVyCitpbnB1dCBzZWN0aW9ucyAod2hhdGV2ZXIgeW91IHNlbGVjdCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB1c2luZworQGNvZGV7TE9BRH0pIHRvIHJlc29sdmUgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KKworQGNpbmRleCBAY29kZXtBTElBU30gKE1SSSkKK0BpdGVtIEFMSUFTIEB2YXJ7b3V0LXNlY25hbWV9LCBAdmFye2luLXNlY25hbWV9CitVc2UgdGhpcyBjb21tYW5kIHRvIHBsYWNlIHRoZSBkYXRhIGZyb20gaW5wdXQgc2VjdGlvbiBAdmFye2luLXNlY25hbWV9CitpbiBhIHNlY3Rpb24gY2FsbGVkIEB2YXJ7b3V0LXNlY25hbWV9IGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCisKK0B2YXJ7aW4tc2VjbmFtZX0gbWF5IGJlIGFuIGludGVnZXIuCisKK0BjaW5kZXggQGNvZGV7QUxJR059IChNUkkpCitAaXRlbSBBTElHTiBAdmFye3NlY25hbWV9ID0gQHZhcntleHByZXNzaW9ufQorQWxpZ24gdGhlIHNlY3Rpb24gY2FsbGVkIEB2YXJ7c2VjbmFtZX0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoZQorQHZhcntleHByZXNzaW9ufSBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uCisKK0BjaW5kZXggQGNvZGV7QkFTRX0gKE1SSSkKK0BpdGVtIEJBU0UgQHZhcntleHByZXNzaW9ufQorVXNlIHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGFzIHRoZSBsb3dlc3QgYWRkcmVzcyAob3RoZXIgdGhhbgorYWJzb2x1dGUgYWRkcmVzc2VzKSBpbiB0aGUgb3V0cHV0IGZpbGUuCisKK0BjaW5kZXggQGNvZGV7Q0hJUH0gKE1SSSkKK0BpdGVtIENISVAgQHZhcntleHByZXNzaW9ufQorQGl0ZW14IENISVAgQHZhcntleHByZXNzaW9ufSwgQHZhcntleHByZXNzaW9ufQorVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZzsgaXQgaXMgYWNjZXB0ZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KKworQGNpbmRleCBAY29kZXtFTkR9IChNUkkpCitAaXRlbSBFTkQKK1RoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcgd2hhdGV2ZXI7IGl0J3Mgb25seSBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eS4KKworQGNpbmRleCBAY29kZXtGT1JNQVR9IChNUkkpCitAaXRlbSBGT1JNQVQgQHZhcntvdXRwdXQtZm9ybWF0fQorU2ltaWxhciB0byB0aGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY29tbWFuZCBpbiB0aGUgbW9yZSBnZW5lcmFsIGxpbmtlcgorbGFuZ3VhZ2UsIGJ1dCByZXN0cmljdGVkIHRvIG9uZSBvZiB0aGVzZSBvdXRwdXQgZm9ybWF0czogCisKK0BlbnVtZXJhdGUKK0BpdGVtIAorUy1yZWNvcmRzLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we1N9CisKK0BpdGVtCitJRUVFLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we0lFRUV9CisKK0BpdGVtCitDT0ZGICh0aGUgQHNhbXB7Y29mZi1tNjhrfSB2YXJpYW50IGluIEJGRCksIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMKK0BzYW1we0NPRkZ9CitAZW5kIGVudW1lcmF0ZQorCitAY2luZGV4IEBjb2Rle0xJU1R9IChNUkkpCitAaXRlbSBMSVNUIEB2YXJ7YW55dGhpbmd9QGRvdHN7fQorUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcCwgYXMgcHJvZHVjZWQgYnkgdGhlCitAY29kZXtsZH0gY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0uCisKK1RoZSBrZXl3b3JkIEBjb2Rle0xJU1R9IG1heSBiZSBmb2xsb3dlZCBieSBhbnl0aGluZyBvbiB0aGUKK3NhbWUgbGluZSwgd2l0aCBubyBjaGFuZ2UgaW4gaXRzIGVmZmVjdC4KKworQGNpbmRleCBAY29kZXtMT0FEfSAoTVJJKQorQGl0ZW0gTE9BRCBAdmFye2ZpbGVuYW1lfQorQGl0ZW14IExPQUQgQHZhcntmaWxlbmFtZX0sIEB2YXJ7ZmlsZW5hbWV9LCBAZG90c3t9IEB2YXJ7ZmlsZW5hbWV9CitJbmNsdWRlIG9uZSBvciBtb3JlIG9iamVjdCBmaWxlIEB2YXJ7ZmlsZW5hbWV9IGluIHRoZSBsaW5rOyB0aGlzIGhhcyB0aGUKK3NhbWUgZWZmZWN0IGFzIHNwZWNpZnlpbmcgQHZhcntmaWxlbmFtZX0gZGlyZWN0bHkgb24gdGhlIEBjb2Rle2xkfQorY29tbWFuZCBsaW5lLgorCitAY2luZGV4IEBjb2Rle05BTUV9IChNUkkpCitAaXRlbSBOQU1FIEB2YXJ7b3V0cHV0LW5hbWV9CitAdmFye291dHB1dC1uYW1lfSBpcyB0aGUgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgQGNvZGV7bGR9OyB0aGUKK01SSS1jb21wYXRpYmxlIGNvbW1hbmQgQGNvZGV7TkFNRX0gaXMgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZC1saW5lCitvcHRpb24gQHNhbXB7LW99IG9yIHRoZSBnZW5lcmFsIHNjcmlwdCBsYW5ndWFnZSBjb21tYW5kIEBjb2Rle09VVFBVVH0uCisKK0BjaW5kZXggQGNvZGV7T1JERVJ9IChNUkkpCitAaXRlbSBPUkRFUiBAdmFye3NlY25hbWV9LCBAdmFye3NlY25hbWV9LCBAZG90c3t9IEB2YXJ7c2VjbmFtZX0KK0BpdGVteCBPUkRFUiBAdmFye3NlY25hbWV9IEB2YXJ7c2VjbmFtZX0gQHZhcntzZWNuYW1lfQorTm9ybWFsbHksIEBjb2Rle2xkfSBvcmRlcnMgdGhlIHNlY3Rpb25zIGluIGl0cyBvdXRwdXQgZmlsZSBpbiB0aGUKK29yZGVyIGluIHdoaWNoIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBpbnB1dCBmaWxlcy4gIEluIGFuIE1SSS1jb21wYXRpYmxlCitzY3JpcHQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBvcmRlcmluZyB3aXRoIHRoZSBAY29kZXtPUkRFUn0gY29tbWFuZC4gIFRoZQorc2VjdGlvbnMgeW91IGxpc3Qgd2l0aCBAY29kZXtPUkRFUn0gd2lsbCBhcHBlYXIgZmlyc3QgaW4geW91ciBvdXRwdXQKK2ZpbGUsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCisKK0BjaW5kZXggQGNvZGV7UFVCTElDfSAoTVJJKQorQGl0ZW0gUFVCTElDIEB2YXJ7bmFtZX09QHZhcntleHByZXNzaW9ufQorQGl0ZW14IFBVQkxJQyBAdmFye25hbWV9LEB2YXJ7ZXhwcmVzc2lvbn0KK0BpdGVteCBQVUJMSUMgQHZhcntuYW1lfSBAdmFye2V4cHJlc3Npb259CitTdXBwbHkgYSB2YWx1ZSAoQHZhcntleHByZXNzaW9ufSkgZm9yIGV4dGVybmFsIHN5bWJvbAorQHZhcntuYW1lfSB1c2VkIGluIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCisKK0BjaW5kZXggQGNvZGV7U0VDVH0gKE1SSSkKK0BpdGVtIFNFQ1QgQHZhcntzZWNuYW1lfSwgQHZhcntleHByZXNzaW9ufQorQGl0ZW14IFNFQ1QgQHZhcntzZWNuYW1lfT1AdmFye2V4cHJlc3Npb259CitAaXRlbXggU0VDVCBAdmFye3NlY25hbWV9IEB2YXJ7ZXhwcmVzc2lvbn0KK1lvdSBjYW4gdXNlIGFueSBvZiB0aGVzZSB0aHJlZSBmb3JtcyBvZiB0aGUgQGNvZGV7U0VDVH0gY29tbWFuZCB0bworc3BlY2lmeSB0aGUgc3RhcnQgYWRkcmVzcyAoQHZhcntleHByZXNzaW9ufSkgZm9yIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4KK0lmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgQGNvZGV7U0VDVH0gc3RhdGVtZW50IGZvciB0aGUgc2FtZQorQHZhcntzZWNuYW1lfSwgb25seSB0aGUgQGVtcGh7Zmlyc3R9IHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MuCitAZW5kIHRhYmxlCisKK0Bub2RlIEluZGV4CitAdW5udW1iZXJlZCBJbmRleAorCitAcHJpbnRpbmRleCBjcAorCitAdGV4CislIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCislIG1lYW50aW1lOgorXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKK1xjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KK1xjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9CitcY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQorXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KK1xjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQorXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KK1xjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQorXHBhZ2VcY29sb3Bob24KKyUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgorQGVuZCB0ZXgKKworCitAY29udGVudHMKK0BieWUKKworCmRpZmYgLS1naXQgYS9sZC9sZGNyZWYuYyBiL2xkL2xkY3JlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTBkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZGNyZWYuYwpAQCAtMCwwICsxLDU0OSBAQAorLyogbGRjcmVmLmMgLS0gb3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgaG9sZHMgcm91dGluZXMgdGhhdCBtYW5hZ2UgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4KKyAgIFRoZSB0YWJsZSBpcyB1c2VkIHRvIGdlbmVyYXRlIGNyb3NzIHJlZmVyZW5jZSByZXBvcnRzLiAgSXQgaXMgYWxzbworICAgdXNlZCB0byBpbXBsZW1lbnQgdGhlIE5PQ1JPU1NSRUZTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisjaW5jbHVkZSAibGQuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZGV4cC5oIgorI2luY2x1ZGUgImxkbGFuZy5oIgorCisvKiBXZSBrZWVwIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIGZvciBlYWNoIHJlZmVyZW5jZSB0byBhCisgICBzeW1ib2wgZnJvbSBhIGdpdmVuIG9iamVjdC4gICovCisKK3N0cnVjdCBjcmVmX3JlZgoreworICAvKiBUaGUgbmV4dCByZWZlcmVuY2UuICAqLworICBzdHJ1Y3QgY3JlZl9yZWYgKm5leHQ7CisgIC8qIFRoZSBvYmplY3QuICAqLworICBiZmQgKmFiZmQ7CisgIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLiAgKi8KKyAgdW5zaWduZWQgaW50IGRlZiA6IDE7CisgIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBjb21tb24uICAqLworICB1bnNpZ25lZCBpbnQgY29tbW9uIDogMTsKKyAgLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gICovCisgIHVuc2lnbmVkIGludCB1bmRlZiA6IDE7Cit9OworCisvKiBXZSBrZWVwIGEgaGFzaCB0YWJsZSBvZiBzeW1ib2xzLiAgRWFjaCBlbnRyeSBsb29rcyBsaWtlIHRoaXMuICAqLworCitzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5Cit7CisgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OworICAvKiBUaGUgZGVtYW5nbGVkIG5hbWUuICAqLworICBjaGFyICpkZW1hbmdsZWQ7CisgIC8qIFJlZmVyZW5jZXMgdG8gYW5kIGRlZmluaXRpb25zIG9mIHRoaXMgc3ltYm9sLiAgKi8KKyAgc3RydWN0IGNyZWZfcmVmICpyZWZzOworfTsKKworLyogVGhpcyBpcyB3aGF0IHRoZSBoYXNoIHRhYmxlIGxvb2tzIGxpa2UuICAqLworCitzdHJ1Y3QgY3JlZl9oYXNoX3RhYmxlCit7CisgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OworfTsKKworLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqY3JlZl9oYXNoX25ld2Z1bmMKKyAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGNyZWZfZmlsbF9hcnJheSBQQVJBTVMgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIGludCBjcmVmX3NvcnRfYXJyYXkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKK3N0YXRpYyB2b2lkIG91dHB1dF9vbmVfY3JlZiBQQVJBTVMgKChGSUxFICosIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikpOworc3RhdGljIGJvb2xlYW4gY2hlY2tfbm9jcm9zc3JlZiBQQVJBTVMgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIHZvaWQgY2hlY2tfcmVmcworICBQQVJBTVMgKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCisJICAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKikpOworc3RhdGljIHZvaWQgY2hlY2tfcmVsb2NfcmVmcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKKy8qIExvb2sgdXAgYW4gZW50cnkgaW4gdGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCisKKyNkZWZpbmUgY3JlZl9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpCQlcCisgICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQkJCQkJXAorICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQorCisvKiBUcmF2ZXJzZSB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KKworI2RlZmluZSBjcmVmX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJCVwKKyAgKGJmZF9oYXNoX3RyYXZlcnNlCQkJCQkJCVwKKyAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAorICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAorICAgIChpbmZvKSkpCisKKy8qIFRoZSBjcmVmIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgc3RydWN0IGNyZWZfaGFzaF90YWJsZSBjcmVmX3RhYmxlOworCisvKiBXaGV0aGVyIHRoZSBjcmVmIGhhc2ggdGFibGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICAqLworCitzdGF0aWMgYm9vbGVhbiBjcmVmX2luaXRpYWxpemVkOworCisvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgc2VlbiBzbyBmYXIuICAqLworCitzdGF0aWMgc2l6ZV90IGNyZWZfc3ltY291bnQ7CisKKy8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIGNyZWYgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgorY3JlZl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQorICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OworICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopIGVudHJ5OworCisgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKKyAgICAgc3ViY2xhc3MuICAqLworICBpZiAocmV0ID09IE5VTEwpCisgICAgcmV0ID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCisJICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkpKSk7CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7CisKKyAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLworICByZXQgPSAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikKKwkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKKyAgaWYgKHJldCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLworICAgICAgcmV0LT5kZW1hbmdsZWQgPSBOVUxMOworICAgICAgcmV0LT5yZWZzID0gTlVMTDsKKworICAgICAgLyogS2VlcCBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBjcmVhdGVkIGluIHRoZSBoYXNoCisgICAgICAgICB0YWJsZS4gICovCisgICAgICArK2NyZWZfc3ltY291bnQ7CisgICAgfQorCisgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKK30KKworLyogQWRkIGEgc3ltYm9sIHRvIHRoZSBjcmVmIGhhc2ggdGFibGUuICBUaGlzIGlzIGNhbGxlZCBmb3IgZXZlcnkKKyAgIHN5bWJvbCB0aGF0IGlzIHNlZW4gZHVyaW5nIHRoZSBsaW5rLiAgKi8KKworLypBUkdTVVNFRCovCit2b2lkCithZGRfY3JlZiAobmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgdmFsdWU7Cit7CisgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7CisgIHN0cnVjdCBjcmVmX3JlZiAqcjsKKworICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZjcmVmX3RhYmxlLnJvb3QsIGNyZWZfaGFzaF9uZXdmdW5jKSkKKwllaW5mbyAoXygiJVglUDogYmZkX2hhc2hfdGFibGVfaW5pdCBvZiBjcmVmIHRhYmxlIGZhaWxlZDogJUVcbiIpKTsKKyAgICAgIGNyZWZfaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICBoID0gY3JlZl9oYXNoX2xvb2t1cCAoJmNyZWZfdGFibGUsIG5hbWUsIHRydWUsIGZhbHNlKTsKKyAgaWYgKGggPT0gTlVMTCkKKyAgICBlaW5mbyAoXygiJVglUDogY3JlZl9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7CisKKyAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKKyAgICBpZiAoci0+YWJmZCA9PSBhYmZkKQorICAgICAgYnJlYWs7CisKKyAgaWYgKHIgPT0gTlVMTCkKKyAgICB7CisgICAgICByID0gKHN0cnVjdCBjcmVmX3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKnIpOworICAgICAgci0+bmV4dCA9IGgtPnJlZnM7CisgICAgICBoLT5yZWZzID0gcjsKKyAgICAgIHItPmFiZmQgPSBhYmZkOworICAgICAgci0+ZGVmID0gZmFsc2U7CisgICAgICByLT5jb21tb24gPSBmYWxzZTsKKyAgICAgIHItPnVuZGVmID0gZmFsc2U7CisgICAgfQorCisgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQorICAgIHItPnVuZGVmID0gdHJ1ZTsKKyAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKKyAgICByLT5jb21tb24gPSB0cnVlOworICBlbHNlCisgICAgci0+ZGVmID0gdHJ1ZTsKK30KKworLyogQ29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJpZXMgaW50byBhbiBhcnJheS4gIFRoaXMKKyAgIGlzIGNhbGxlZCB2aWEgY3JlZl9oYXNoX3RyYXZlcnNlLiAgV2UgYWxzbyBmaWxsIGluIHRoZSBkZW1hbmdsZWQKKyAgIG5hbWUuICAqLworCitzdGF0aWMgYm9vbGVhbgorY3JlZl9maWxsX2FycmF5IChoLCBkYXRhKQorICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOworICAgICBQVFIgZGF0YTsKK3sKKyAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKipwcGggPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKiopIGRhdGE7CisKKyAgQVNTRVJUIChoLT5kZW1hbmdsZWQgPT0gTlVMTCk7CisgIGgtPmRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7CisKKyAgKipwcGggPSBoOworCisgICsrKnBwaDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU29ydCBhbiBhcnJheSBvZiBjcmVmIGhhc2ggdGFibGUgZW50cmllcyBieSBuYW1lLiAgKi8KKworc3RhdGljIGludAorY3JlZl9zb3J0X2FycmF5IChhMSwgYTIpCisgICAgIGNvbnN0IFBUUiBhMTsKKyAgICAgY29uc3QgUFRSIGEyOworeworICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDEgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTE7CisgIGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipwMiA9IChjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKSBhMjsKKworICByZXR1cm4gc3RyY21wICgoKnAxKS0+ZGVtYW5nbGVkLCAoKnAyKS0+ZGVtYW5nbGVkKTsKK30KKworLyogV3JpdGUgb3V0IHRoZSBjcmVmIHRhYmxlLiAgKi8KKworI2RlZmluZSBGSUxFQ09MICg1MCkKKwordm9pZAorb3V0cHV0X2NyZWYgKGZwKQorICAgICBGSUxFICpmcDsKK3sKKyAgaW50IGxlbjsKKyAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKmNzeW1zLCAqKmNzeW1fZmlsbCwgKipjc3ltLCAqKmNzeW1fZW5kOworICBjb25zdCBjaGFyICptc2c7CisKKyAgZnByaW50ZiAoZnAsIF8oIlxuQ3Jvc3MgUmVmZXJlbmNlIFRhYmxlXG5cbiIpKTsKKyAgbXNnID0gXygiU3ltYm9sIik7CisgIGZwcmludGYgKGZwLCBtc2cpOworICBsZW4gPSBzdHJsZW4gKG1zZyk7CisgIHdoaWxlIChsZW4gPCBGSUxFQ09MKQorICAgIHsKKyAgICAgIHB1dGMgKCcgJyAsIGZwKTsKKyAgICAgICsrbGVuOworICAgIH0KKyAgZnByaW50ZiAoZnAsIF8oIkZpbGVcbiIpKTsKKworICBpZiAoISBjcmVmX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgIGZwcmludGYgKGZwLCBfKCJObyBzeW1ib2xzXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNzeW1zID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqKQorCSAgIHhtYWxsb2MgKGNyZWZfc3ltY291bnQgKiBzaXplb2YgKCpjc3ltcykpKTsKKworICBjc3ltX2ZpbGwgPSBjc3ltczsKKyAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY3JlZl9maWxsX2FycmF5LCAmY3N5bV9maWxsKTsKKyAgQVNTRVJUICgoc2l6ZV90KSAoY3N5bV9maWxsIC0gY3N5bXMpID09IGNyZWZfc3ltY291bnQpOworCisgIHFzb3J0IChjc3ltcywgY3JlZl9zeW1jb3VudCwgc2l6ZW9mICgqY3N5bXMpLCBjcmVmX3NvcnRfYXJyYXkpOworCisgIGNzeW1fZW5kID0gY3N5bXMgKyBjcmVmX3N5bWNvdW50OworICBmb3IgKGNzeW0gPSBjc3ltczsgY3N5bSA8IGNzeW1fZW5kOyBjc3ltKyspCisgICAgb3V0cHV0X29uZV9jcmVmIChmcCwgKmNzeW0pOworfQorCisvKiBPdXRwdXQgb25lIGVudHJ5IGluIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorb3V0cHV0X29uZV9jcmVmIChmcCwgaCkKKyAgICAgRklMRSAqZnA7CisgICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Cit7CisgIGludCBsZW47CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKKyAgc3RydWN0IGNyZWZfcmVmICpyOworCisgIGhsID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsCisJCQkgICAgIGZhbHNlLCB0cnVlKTsKKyAgaWYgKGhsID09IE5VTEwpCisgICAgZWluZm8gKCIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIiwKKwkgICBoLT5yb290LnN0cmluZyk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QgYnV0IG5ldmVyCisJIHJlZmVyZW5jZWQgYnkgYSBub3JtYWwgb2JqZWN0LCB0aGVuIGRvbid0IHByaW50IGl0LiAgKi8KKyAgICAgIGlmIChobC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCisJeworCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQorCSAgICByZXR1cm47CisJICBpZiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKKwkgICAgICAmJiAoaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCisJICAgIHsKKwkgICAgICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQorCQlpZiAoKHItPmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKKwkJICBicmVhazsKKwkgICAgICBpZiAociA9PSBOVUxMKQorCQlyZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorCisgIGZwcmludGYgKGZwLCAiJXMgIiwgaC0+ZGVtYW5nbGVkKTsKKyAgbGVuID0gc3RybGVuIChoLT5kZW1hbmdsZWQpICsgMTsKKworICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChyLT5kZWYpCisJeworCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCisJICAgIHsKKwkgICAgICBwdXRjICgnICcsIGZwKTsKKwkgICAgICArK2xlbjsKKwkgICAgfQorCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKKwkgIGxlbiA9IDA7CisJfQorICAgIH0KKworICBmb3IgKHIgPSBoLT5yZWZzOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICghIHItPmRlZikKKwl7CisJICB3aGlsZSAobGVuIDwgRklMRUNPTCkKKwkgICAgeworCSAgICAgIHB1dGMgKCcgJywgZnApOworCSAgICAgICsrbGVuOworCSAgICB9CisJICBsZmluZm8gKGZwLCAiJUJcbiIsIHItPmFiZmQpOworCSAgbGVuID0gMDsKKwl9CisgICAgfQorCisgIEFTU0VSVCAobGVuID09IDApOworfQorCisvKiBDaGVjayBmb3IgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2VzLiAgKi8KKwordm9pZAorY2hlY2tfbm9jcm9zc3JlZnMgKCkKK3sKKyAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKKyAgICByZXR1cm47CisKKyAgY3JlZl9oYXNoX3RyYXZlcnNlICgmY3JlZl90YWJsZSwgY2hlY2tfbm9jcm9zc3JlZiwgKFBUUikgTlVMTCk7Cit9CisKKy8qIENoZWNrIG9uZSBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitjaGVja19ub2Nyb3NzcmVmIChoLCBpZ25vcmUpCisgICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7CisgICAgIFBUUiBpZ25vcmU7Cit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKKyAgYXNlY3Rpb24gKmRlZnNlYzsKKyAgY29uc3QgY2hhciAqZGVmc2VjbmFtZTsKKyAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7CisgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5jcjsKKworICBobCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLAorCQkJICAgICBmYWxzZSwgdHJ1ZSk7CisgIGlmIChobCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVpbmZvIChfKCIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIiksCisJICAgICBoLT5yb290LnN0cmluZyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgaWYgKGhsLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgJiYgaGwtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorICAgIHJldHVybiB0cnVlOworCisgIGRlZnNlYyA9IGhsLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKKyAgaWYgKGRlZnNlYyA9PSBOVUxMKQorICAgIHJldHVybiB0cnVlOworICBkZWZzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGRlZnNlYy0+b3duZXIsIGRlZnNlYyk7CisKKyAgZm9yIChuY3JzID0gbm9jcm9zc3JlZl9saXN0OyBuY3JzICE9IE5VTEw7IG5jcnMgPSBuY3JzLT5uZXh0KQorICAgIGZvciAobmNyID0gbmNycy0+bGlzdDsgbmNyICE9IE5VTEw7IG5jciA9IG5jci0+bmV4dCkKKyAgICAgIGlmIChzdHJjbXAgKG5jci0+bmFtZSwgZGVmc2VjbmFtZSkgPT0gMCkKKwljaGVja19yZWZzIChoLCBobCwgbmNycyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoZSBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gY2hlY2tfcmVmcyB0bworICAgY2hlY2tfcmVsb2NfcmVmcyB0aHJvdWdoIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCisKK3N0cnVjdCBjaGVja19yZWZzX2luZm8KK3sKKyAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKKyAgYXNlY3Rpb24gKmRlZnNlYzsKKyAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7CisgIGFzeW1ib2wgKiphc3ltYm9sczsKKyAgYm9vbGVhbiBzYW1lOworfTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIGRlZmluZWQgaW4gYSBzZWN0aW9uIHdoaWNoCisgICBwcm9oaWJpdHMgY3Jvc3MgcmVmZXJlbmNlcy4gIFdlIG5lZWQgdG8gbG9vayB0aHJvdWdoIGFsbCByZWZlcmVuY2VzCisgICB0byB0aGlzIHN5bWJvbCwgYW5kIGVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2VzIGFyZSBub3QgZnJvbQorICAgcHJvaGliaXRlZCBzZWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitjaGVja19yZWZzIChoLCBobCwgbmNycykKKyAgICAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhsOworICAgICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmNyczsKK3sKKyAgc3RydWN0IGNyZWZfcmVmICpyZWY7CisKKyAgZm9yIChyZWYgPSBoLT5yZWZzOyByZWYgIT0gTlVMTDsgcmVmID0gcmVmLT5uZXh0KQorICAgIHsKKyAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmxpOworICAgICAgYXN5bWJvbCAqKmFzeW1ib2xzOworICAgICAgc3RydWN0IGNoZWNrX3JlZnNfaW5mbyBpbmZvOworCisgICAgICAvKiBXZSBuZWVkIHRvIGxvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoaXMgQkZELCB0byBzZWUKKyAgICAgICAgIGlmIGFueSBvZiB0aGUgcmVsb2NhdGlvbnMgd2hpY2ggcmVmZXIgdG8gdGhpcyBzeW1ib2wgYXJlIGZyb20KKyAgICAgICAgIGEgcHJvaGliaXRlZCBzZWN0aW9uLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZG8gdGhpcyBldmVuIGZvcgorICAgICAgICAgdGhlIEJGRCBpbiB3aGljaCB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHNpbmNlIGV2ZW4gYSBzaW5nbGUKKyAgICAgICAgIEJGRCBtaWdodCBjb250YWluIGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2U7IGZvciB0aGlzCisgICAgICAgICBjYXNlLCB3ZSBzZXQgdGhlIFNBTUUgZmllbGQgaW4gSU5GTywgd2hpY2ggd2lsbCBjYXVzZQorICAgICAgICAgQ0hFQ0tfUkVMT0NTX1JFRlMgdG8gY2hlY2sgZm9yIHJlbG9jYXRpb25zIGFnYWluc3QgdGhlCisgICAgICAgICBzZWN0aW9uIGFzIHdlbGwgYXMgYWdhaW5zdCB0aGUgc3ltYm9sLiAgKi8KKworICAgICAgbGkgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSByZWYtPmFiZmQtPnVzcmRhdGE7CisgICAgICBpZiAobGkgIT0gTlVMTCAmJiBsaS0+YXN5bWJvbHMgIT0gTlVMTCkKKwlhc3ltYm9scyA9IGxpLT5hc3ltYm9sczsKKyAgICAgIGVsc2UKKwl7CisJICBsb25nIHN5bXNpemU7CisJICBsb25nIHN5bWJvbF9jb3VudDsKKworCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChyZWYtPmFiZmQpOworCSAgaWYgKHN5bXNpemUgPCAwKQorCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczsgJUVcbiIpLCByZWYtPmFiZmQpOworCSAgYXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7CisJICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAocmVmLT5hYmZkLCBhc3ltYm9scyk7CisJICBpZiAoc3ltYm9sX2NvdW50IDwgMCkKKwkgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgcmVmLT5hYmZkKTsKKwkgIGlmIChsaSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbGktPmFzeW1ib2xzID0gYXN5bWJvbHM7CisJICAgICAgbGktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKKwkgICAgfQorCX0KKworICAgICAgaW5mby5oID0gaDsKKyAgICAgIGluZm8uZGVmc2VjID0gaGwtPnUuZGVmLnNlY3Rpb247CisgICAgICBpbmZvLm5jcnMgPSBuY3JzOworICAgICAgaW5mby5hc3ltYm9scyA9IGFzeW1ib2xzOworICAgICAgaWYgKHJlZi0+YWJmZCA9PSBobC0+dS5kZWYuc2VjdGlvbi0+b3duZXIpCisJaW5mby5zYW1lID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwlpbmZvLnNhbWUgPSBmYWxzZTsKKyAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAocmVmLT5hYmZkLCBjaGVja19yZWxvY19yZWZzLCAoUFRSKSAmaW5mbyk7CisKKyAgICAgIGlmIChsaSA9PSBOVUxMKQorCWZyZWUgKGFzeW1ib2xzKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICBJTkZPLT5IIGlzIGEgc3ltYm9sCisgICBkZWZpbmVkIGluIElORk8tPkRFRlNFQ05BTUUuICBJZiB0aGlzIHNlY3Rpb24gbWFwcyBpbnRvIGFueSBvZiB0aGUKKyAgIHNlY3Rpb25zIGxpc3RlZCBpbiBJTkZPLT5OQ1JTLCBvdGhlciB0aGFuIElORk8tPkRFRlNFQ05BTUUsIHRoZW4gd2UKKyAgIGxvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMuICBJZiBhbnkgb2YgdGhlIHJlbG9jYXRpb25zIGFyZSB0bworICAgSU5GTy0+SCwgdGhlbiB3ZSByZXBvcnQgYSBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBlcnJvci4gICovCisKK3N0YXRpYyB2b2lkCitjaGVja19yZWxvY19yZWZzIChhYmZkLCBzZWMsIGlhcmcpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIGlhcmc7Cit7CisgIHN0cnVjdCBjaGVja19yZWZzX2luZm8gKmluZm8gPSAoc3RydWN0IGNoZWNrX3JlZnNfaW5mbyAqKSBpYXJnOworICBhc2VjdGlvbiAqb3V0c2VjOworICBjb25zdCBjaGFyICpvdXRzZWNuYW1lOworICBhc2VjdGlvbiAqb3V0ZGVmc2VjOworICBjb25zdCBjaGFyICpvdXRkZWZzZWNuYW1lOworICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuY3I7CisgIGNvbnN0IGNoYXIgKnN5bW5hbWU7CisgIGxvbmcgcmVsc2l6ZTsKKyAgYXJlbGVudCAqKnJlbHBwOworICBsb25nIHJlbGNvdW50OworICBhcmVsZW50ICoqcCwgKipwZW5kOworCisgIG91dHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247CisgIG91dHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0c2VjLT5vd25lciwgb3V0c2VjKTsKKworICBvdXRkZWZzZWMgPSBpbmZvLT5kZWZzZWMtPm91dHB1dF9zZWN0aW9uOworICBvdXRkZWZzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dGRlZnNlYy0+b3duZXIsIG91dGRlZnNlYyk7CisKKyAgLyogVGhlIHNlY3Rpb24gd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGlzIHBlcm1pdHRlZC4gICovCisgIGlmIChzdHJjbXAgKG91dHNlY25hbWUsIG91dGRlZnNlY25hbWUpID09IDApCisgICAgcmV0dXJuOworCisgIGZvciAobmNyID0gaW5mby0+bmNycy0+bGlzdDsgbmNyICE9IE5VTEw7IG5jciA9IG5jci0+bmV4dCkKKyAgICBpZiAoc3RyY21wIChvdXRzZWNuYW1lLCBuY3ItPm5hbWUpID09IDApCisgICAgICBicmVhazsKKworICBpZiAobmNyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFRoaXMgc2VjdGlvbiBpcyBvbmUgZm9yIHdoaWNoIGNyb3NzIHJlZmVyZW5jZXMgYXJlIHByb2hpYml0ZWQuCisgICAgIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMsIGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gYXJlIHRvCisgICAgIElORk8tPkguICAqLworCisgIHN5bW5hbWUgPSBpbmZvLT5oLT5yb290LnN0cmluZzsKKworICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKTsKKyAgaWYgKHJlbHNpemUgPCAwKQorICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7CisgIGlmIChyZWxzaXplID09IDApCisgICAgcmV0dXJuOworCisgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOworICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHAsIGluZm8tPmFzeW1ib2xzKTsKKyAgaWYgKHJlbGNvdW50IDwgMCkKKyAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOworCisgIHAgPSByZWxwcDsKKyAgcGVuZCA9IHAgKyByZWxjb3VudDsKKyAgZm9yICg7IHAgPCBwZW5kICYmICpwICE9IE5VTEw7IHArKykKKyAgICB7CisgICAgICBhcmVsZW50ICpxID0gKnA7CisKKyAgICAgIGlmIChxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCisJICAmJiAqcS0+c3ltX3B0cl9wdHIgIT0gTlVMTAorCSAgJiYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgc3ltbmFtZSkgPT0gMAorCSAgICAgIHx8IChpbmZvLT5zYW1lCisJCSAgJiYgYmZkX2dldF9zZWN0aW9uICgqcS0+c3ltX3B0cl9wdHIpID09IGluZm8tPmRlZnNlYykpKQorCXsKKwkgIC8qIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wuICBUaGUgc3ltYm9sIGlzIGRlZmluZWQKKyAgICAgICAgICAgICBpbiBPVVRTRUNOQU1FLiAgVGhpcyByZWxvYyBpcyBmcm9tIGEgc2VjdGlvbiB3aGljaCBpcworICAgICAgICAgICAgIG1hcHBlZCBpbnRvIGEgc2VjdGlvbiBmcm9tIHdoaWNoIHJlZmVyZW5jZXMgdG8gT1VUU0VDTkFNRQorICAgICAgICAgICAgIGFyZSBwcm9oaWJpdGVkLiAgV2UgbXVzdCByZXBvcnQgYW4gZXJyb3IuICAqLworCSAgZWluZm8gKF8oIiVYJUM6IHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gJXMgdG8gYCVUJyBpbiAlc1xuIiksCisJCSBhYmZkLCBzZWMsIHEtPmFkZHJlc3MsIG91dHNlY25hbWUsCisJCSBiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpLCBvdXRkZWZzZWNuYW1lKTsKKwl9CisgICAgfQorCisgIGZyZWUgKHJlbHBwKTsKK30KZGlmZiAtLWdpdCBhL2xkL2xkY3Rvci5jIGIvbGQvbGRjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MzRiOAotLS0gL2Rldi9udWxsCisrKyBiL2xkL2xkY3Rvci5jCkBAIC0wLDAgKzEsMzgzIEBACisvKiBsZGN0b3IuYyAtLSBjb25zdHJ1Y3RvciBzdXBwb3J0IHJvdXRpbmVzCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgorICAgCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZGdyYW0uaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZGN0b3IuaCIKKworc3RhdGljIGludCBjdG9yX3ByaW8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IGN0b3JfY21wIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CisKKy8qIFRoZSBsaXN0IG9mIHN0YXRlbWVudHMgbmVlZGVkIHRvIGhhbmRsZSBjb25zdHJ1Y3RvcnMuICBUaGVzZSBhcmUKKyAgIGludm9rZWQgYnkgdGhlIGNvbW1hbmQgQ09OU1RSVUNUT1JTIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KK2xhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjb25zdHJ1Y3Rvcl9saXN0OworCisvKiBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHNvcnRlZC4gIE5vdGUgdGhhdCB0aGlzIGlzCisgICBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgbGluazsgd2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZQorICAgQ09OU1RSVUNUT1JTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLworYm9vbGVhbiBjb25zdHJ1Y3RvcnNfc29ydGVkOworCisvKiBUaGUgc2V0cyB3ZSBoYXZlIHNlZW4uICAqLworc3RydWN0IHNldF9pbmZvICpzZXRzOworCisvKiBBZGQgYW4gZW50cnkgdG8gYSBzZXQuICBIIGlzIHRoZSBlbnRyeSBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUuCisgICBSRUxPQyBpcyB0aGUgcmVsb2NhdGlvbiB0byB1c2UgZm9yIGFuIGVudHJ5IGluIHRoZSBzZXQuICBTRUNUSU9OCisgICBhbmQgVkFMVUUgYXJlIHRoZSB2YWx1ZSB0byBhZGQuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0CisgICBwaGFzZSBvZiB0aGUgbGluaywgd2hlbiB3ZSBhcmUgc3RpbGwgZ2F0aGVyaW5nIHN5bWJvbHMgdG9nZXRoZXIuCisgICBXZSBqdXN0IHJlY29yZCB0aGUgaW5mb3JtYXRpb24gbm93LiAgVGhlIGxkY3Rvcl9maW5kX2NvbnN0cnVjdG9ycworICAgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgdGhlIHNldHMuICAqLworCit2b2lkCitsZGN0b3JfYWRkX3NldF9lbnRyeSAoaCwgcmVsb2MsIG5hbWUsIHNlY3Rpb24sIHZhbHVlKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgc3RydWN0IHNldF9pbmZvICpwOworICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7CisgIHN0cnVjdCBzZXRfZWxlbWVudCAqKmVwcDsKKworICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCisgICAgaWYgKHAtPmggPT0gaCkKKyAgICAgIGJyZWFrOworCisgIGlmIChwID09IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTCkKKyAgICB7CisgICAgICBwID0gKHN0cnVjdCBzZXRfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZXRfaW5mbykpOworICAgICAgcC0+bmV4dCA9IHNldHM7CisgICAgICBzZXRzID0gcDsKKyAgICAgIHAtPmggPSBoOworICAgICAgcC0+cmVsb2MgPSByZWxvYzsKKyAgICAgIHAtPmNvdW50ID0gMDsKKyAgICAgIHAtPmVsZW1lbnRzID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocC0+cmVsb2MgIT0gcmVsb2MpCisJeworCSAgZWluZm8gKF8oIiVQJVg6IERpZmZlcmVudCByZWxvY3MgdXNlZCBpbiBzZXQgJXNcbiIpLCBoLT5yb290LnN0cmluZyk7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBEb24ndCBwZXJtaXQgYSBzZXQgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSBkaWZmZXJlbnQgb2JqZWN0CisgICAgICAgICBmaWxlIGZvcm1hdHMuICBUaGUgc2FtZSByZWxvYyBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVzdWx0cy4gIFdlCisgICAgICAgICBhY3R1YWxseSBjb3VsZCBzb21ldGltZXMgaGFuZGxlIHRoaXMsIGJ1dCB0aGUgY2FzZSBpcworICAgICAgICAgdW5saWtlbHkgdG8gZXZlciBhcmlzZS4gIFNvbWV0aW1lcyBjb25zdHJ1Y3RvciBzeW1ib2xzIGFyZSBpbgorICAgICAgICAgdW51c3VhbCBzZWN0aW9ucywgc3VjaCBhcyB0aGUgYWJzb2x1dGUgc2VjdGlvbi0tdGhpcyBhcHBlYXJzCisgICAgICAgICB0byBiZSB0aGUgY2FzZSBpbiBMaW51eCBhLm91dC0tYW5kIGluIHN1Y2ggY2FzZXMgd2UganVzdAorICAgICAgICAgYXNzdW1lIGV2ZXJ5dGhpbmcgaXMgT0suICAqLworICAgICAgaWYgKHAtPmVsZW1lbnRzICE9IE5VTEwKKwkgICYmIHNlY3Rpb24tPm93bmVyICE9IE5VTEwKKwkgICYmIHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciAhPSBOVUxMCisJICAmJiBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChzZWN0aW9uLT5vd25lciksCisJCSAgICAgYmZkX2dldF90YXJnZXQgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lcikpICE9IDApCisJeworCSAgZWluZm8gKF8oIiVQJVg6IERpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGNvbXBvc2luZyBzZXQgJXNcbiIpLAorCQkgaC0+cm9vdC5zdHJpbmcpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgZSA9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2V0X2VsZW1lbnQpKTsKKyAgZS0+bmV4dCA9IE5VTEw7CisgIGUtPm5hbWUgPSBuYW1lOworICBlLT5zZWN0aW9uID0gc2VjdGlvbjsKKyAgZS0+dmFsdWUgPSB2YWx1ZTsKKworICBmb3IgKGVwcCA9ICZwLT5lbGVtZW50czsgKmVwcCAhPSBOVUxMOyBlcHAgPSAmKCplcHApLT5uZXh0KQorICAgIDsKKyAgKmVwcCA9IGU7CisKKyAgKytwLT5jb3VudDsKK30KKworLyogR2V0IHRoZSBwcmlvcml0eSBvZiBhIGcrKyBnbG9iYWwgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBmcm9tIHRoZQorICAgc3ltYm9sIG5hbWUuICAqLworCitzdGF0aWMgaW50CitjdG9yX3ByaW8gKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIC8qIFRoZSBuYW1lIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSBfR0xPQkFMXyRJJDY1NTM1JHRlc3QwMl9fRnYuCisgICAgIFRoZXJlIG1pZ2h0IGJlIGV4dHJhIGxlYWRpbmcgdW5kZXJzY29yZXMsIGFuZCB0aGUgJCBjaGFyYWN0ZXJzCisgICAgIG1pZ2h0IGJlIHNvbWV0aGluZyBlbHNlLiAgVGhlIEkgbWlnaHQgYmUgYSBELiAgKi8KKworICB3aGlsZSAoKm5hbWUgPT0gJ18nKQorICAgICsrbmFtZTsKKworICBpZiAoc3RybmNtcCAobmFtZSwgIkdMT0JBTF8iLCAgc2l6ZW9mICJHTE9CQUxfIiAtIDEpICE9IDApCisgICAgcmV0dXJuIC0xOworCisgIG5hbWUgKz0gc2l6ZW9mICJHTE9CQUxfIiAtIDE7CisKKyAgaWYgKG5hbWVbMF0gIT0gbmFtZVsyXSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChuYW1lWzFdICE9ICdJJyAmJiBuYW1lWzFdICE9ICdEJykKKyAgICByZXR1cm4gLTE7CisgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzNdKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIGF0b2kgKG5hbWUgKyAzKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNvcnQgY29uc3RydWN0b3IgZWxlbWVudHMgYnkgcHJpb3JpdHkuICBJdAorICAgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCisKK3N0YXRpYyBpbnQKK2N0b3JfY21wIChwMSwgcDIpCisgICAgIGNvbnN0IFBUUiBwMTsKKyAgICAgY29uc3QgUFRSIHAyOworeworICBjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKipwZTEgPSAoY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqKSBwMTsKKyAgY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqcGUyID0gKGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKikgcDI7CisgIGNvbnN0IGNoYXIgKm4xOworICBjb25zdCBjaGFyICpuMjsKKyAgaW50IHByaW8xOworICBpbnQgcHJpbzI7CisKKyAgbjEgPSAoKnBlMSktPm5hbWU7CisgIGlmIChuMSA9PSBOVUxMKQorICAgIG4xID0gIiI7CisgIG4yID0gKCpwZTIpLT5uYW1lOworICBpZiAobjIgPT0gTlVMTCkKKyAgICBuMiA9ICIiOworCisgIC8qIFdlIG5lZWQgdG8gc29ydCBpbiByZXZlcnNlIG9yZGVyIGJ5IHByaW9yaXR5LiAgV2hlbiB0d28KKyAgICAgY29uc3RydWN0b3JzIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksIHdlIHNob3VsZCBtYWludGFpbiB0aGVpcgorICAgICBjdXJyZW50IHJlbGF0aXZlIHBvc2l0aW9uLiAgKi8KKworICBwcmlvMSA9IGN0b3JfcHJpbyAobjEpOworICBwcmlvMiA9IGN0b3JfcHJpbyAobjIpOworCisgIC8qIFdlIHNvcnQgaW4gcmV2ZXJzZSBvcmRlciBiZWNhdXNlIHRoYXQgaXMgd2hhdCBnKysgZXhwZWN0cy4gICovCisgIGlmIChwcmlvMSA8IHByaW8yKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChwcmlvMSA+IHByaW8yKQorICAgIHJldHVybiAtMTsKKworICAvKiBGb3JjZSBhIHN0YWJsZSBzb3J0LiAgKi8KKworICBpZiAocGUxIDwgcGUyKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAocGUxID4gcGUyKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBmaXJzdCBwaGFzZSBvZiB0aGUgbGluayBhbmQKKyAgIGJlZm9yZSB0aGUgc2Vjb25kIHBoYXNlLiAgQXQgdGhpcyBwb2ludCBhbGwgc2V0IGluZm9ybWF0aW9uIGhhcworICAgYmVlbiBnYXRoZXJlZC4gIFdlIG5vdyBwdXQgdGhlIHN0YXRlbWVudHMgdG8gYnVpbGQgdGhlIHNldHMKKyAgIHRoZW1zZWx2ZXMgaW50byBjb25zdHJ1Y3Rvcl9saXN0LiAgKi8KKwordm9pZAorbGRjdG9yX2J1aWxkX3NldHMgKCkKK3sKKyAgc3RhdGljIGJvb2xlYW4gY2FsbGVkOworICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKKyAgYm9vbGVhbiBoZWFkZXJfcHJpbnRlZDsKKyAgc3RydWN0IHNldF9pbmZvICpwOworCisgIC8qIFRoZSBlbXVsYXRpb24gY29kZSBtYXkgY2FsbCB1cyBkaXJlY3RseSwgYnV0IHdlIG9ubHkgd2FudCB0byBkbworICAgICB0aGlzIG9uY2UuICAqLworICBpZiAoY2FsbGVkKQorICAgIHJldHVybjsKKyAgY2FsbGVkID0gdHJ1ZTsKKworICBpZiAoY29uc3RydWN0b3JzX3NvcnRlZCkKKyAgICB7CisgICAgICBmb3IgKHAgPSBzZXRzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorCXsKKwkgIGludCBjLCBpOworCSAgc3RydWN0IHNldF9lbGVtZW50ICplOworCSAgc3RydWN0IHNldF9lbGVtZW50ICoqYXJyYXk7CisKKwkgIGlmIChwLT5lbGVtZW50cyA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKworCSAgYyA9IDA7CisJICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKKwkgICAgKytjOworCisJICBhcnJheSA9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiopIHhtYWxsb2MgKGMgKiBzaXplb2YgKmFycmF5KTsKKworCSAgaSA9IDA7CisJICBmb3IgKGUgPSBwLT5lbGVtZW50czsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKKwkgICAgeworCSAgICAgIGFycmF5W2ldID0gZTsKKwkgICAgICArK2k7CisJICAgIH0KKworCSAgcXNvcnQgKGFycmF5LCBjLCBzaXplb2YgKmFycmF5LCBjdG9yX2NtcCk7CisKKwkgIGUgPSBhcnJheVswXTsKKwkgIHAtPmVsZW1lbnRzID0gZTsKKwkgIGZvciAoaSA9IDA7IGkgPCBjIC0gMTsgaSsrKQorCSAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2kgKyAxXTsKKwkgIGFycmF5W2ldLT5uZXh0ID0gTlVMTDsKKworCSAgZnJlZSAoYXJyYXkpOworCX0KKyAgICB9CisKKyAgb2xkID0gc3RhdF9wdHI7CisgIHN0YXRfcHRyID0gJmNvbnN0cnVjdG9yX2xpc3Q7CisKKyAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKKworICBoZWFkZXJfcHJpbnRlZCA9IGZhbHNlOworICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCisgICAgeworICAgICAgc3RydWN0IHNldF9lbGVtZW50ICplOworICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisgICAgICBpbnQgcmVsb2Nfc2l6ZSwgc2l6ZTsKKworICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQorCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbworCSBub3QgZG8gYW55dGhpbmcuICAqLworICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwljb250aW51ZTsKKworICAgICAgLyogRm9yIGVhY2ggc2V0IHdlIGJ1aWxkOgorCSAgIHNldDoKKwkgICAgIC5sb25nIG51bWJlcl9vZl9lbGVtZW50cworCSAgICAgLmxvbmcgZWxlbWVudDAKKwkgICAgIC4uLgorCSAgICAgLmxvbmcgZWxlbWVudE4KKwkgICAgIC5sb25nIDAKKwkgZXhjZXB0IHRoYXQgd2UgdXNlIHRoZSByaWdodCBzaXplIGluc3RlYWQgb2YgLmxvbmcuICBXaGVuCisJIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZ2VuZXJhdGUgcmVsb2NzIGluc3RlYWQgb2YKKwkgYWRkcmVzc2VzLiAgKi8KKyAgICAgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBwLT5yZWxvYyk7CisgICAgICBpZiAoaG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKKwl7CisJICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKKwkgICAgeworCSAgICAgIGVpbmZvIChfKCIlUCVYOiAlcyBkb2VzIG5vdCBzdXBwb3J0IHJlbG9jICVzIGZvciBzZXQgJXNcbiIpLAorCQkgICAgIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwKKwkJICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocC0+cmVsb2MpLAorCQkgICAgIHAtPmgtPnJvb3Quc3RyaW5nKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbGwgd2UgbmVlZCBpcyB0aGUKKwkgICAgIHNpemUsIHdoaWNoIHdlIGNhbiBnZXQgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KKwkgIGlmIChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIgIT0gTlVMTCkKKwkgICAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciwKKwkJCQkJICAgcC0+cmVsb2MpOworCSAgaWYgKGhvd3RvID09IE5VTEwpCisJICAgIHsKKwkgICAgICBlaW5mbyAoXygiJVAlWDogJXMgZG9lcyBub3Qgc3VwcG9ydCByZWxvYyAlcyBmb3Igc2V0ICVzXG4iKSwKKwkJICAgICBiZmRfZ2V0X3RhcmdldCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyKSwKKwkJICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAocC0+cmVsb2MpLAorCQkgICAgIHAtPmgtPnJvb3Quc3RyaW5nKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKworICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOworICAgICAgc3dpdGNoIChyZWxvY19zaXplKQorCXsKKwljYXNlIDE6IHNpemUgPSBCWVRFOyBicmVhazsKKwljYXNlIDI6IHNpemUgPSBTSE9SVDsgYnJlYWs7CisJY2FzZSA0OiBzaXplID0gTE9ORzsgYnJlYWs7CisJY2FzZSA4OgorCSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCisJICAgIHNpemUgPSBTUVVBRDsKKwkgIGVsc2UKKwkgICAgc2l6ZSA9IFFVQUQ7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZWluZm8gKF8oIiVQJVg6IFVuc3VwcG9ydGVkIHNpemUgJWQgZm9yIHNldCAlc1xuIiksCisJCSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKSwgcC0+aC0+cm9vdC5zdHJpbmcpOworCSAgc2l6ZSA9IExPTkc7CisJICBicmVhazsKKwl9CisKKyAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAiLiIsCisJCQkJICAgICAgZXhwX3Vub3AgKEFMSUdOX0ssCisJCQkJCQlleHBfaW50b3AgKHJlbG9jX3NpemUpKSkpOworICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHAtPmgtPnJvb3Quc3RyaW5nLAorCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKKyAgICAgIGxhbmdfYWRkX2RhdGEgKHNpemUsIGV4cF9pbnRvcCAoKGJmZF92bWEpIHAtPmNvdW50KSk7CisKKyAgICAgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IChzdHJ1Y3Qgc2V0X2VsZW1lbnQgKikgTlVMTDsgZSA9IGUtPm5leHQpCisJeworCSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaW50IGxlbjsKKworCSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQorCQl7CisJCSAgbWluZm8gKF8oIlxuU2V0ICAgICAgICAgICAgICAgICBTeW1ib2xcblxuIikpOworCQkgIGhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJfQorCisJICAgICAgbWluZm8gKCIlcyIsIHAtPmgtPnJvb3Quc3RyaW5nKTsKKwkgICAgICBsZW4gPSBzdHJsZW4gKHAtPmgtPnJvb3Quc3RyaW5nKTsKKworCSAgICAgIGlmIChsZW4gPj0gMTkpCisJCXsKKwkJICBwcmludF9ubCAoKTsKKwkJICBsZW4gPSAwOworCQl9CisJICAgICAgd2hpbGUgKGxlbiA8IDIwKQorCQl7CisJCSAgcHJpbnRfc3BhY2UgKCk7CisJCSAgKytsZW47CisJCX0KKworCSAgICAgIGlmIChlLT5uYW1lICE9IE5VTEwpCisJCW1pbmZvICgiJVRcbiIsIGUtPm5hbWUpOworCSAgICAgIGVsc2UKKwkJbWluZm8gKCIlR1xuIiwgZS0+c2VjdGlvbi0+b3duZXIsIGUtPnNlY3Rpb24sIGUtPnZhbHVlKTsKKwkgICAgfQorCisgICAgICAgICAgLyogTmVlZCBTRUNfS0VFUCBmb3IgLS1nYy1zZWN0aW9ucyAqLworCSAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChlLT5zZWN0aW9uKSkKKwkgICAgZS0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7CisKKwkgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQorCSAgICBsYW5nX2FkZF9yZWxvYyAocC0+cmVsb2MsIGhvd3RvLCBlLT5zZWN0aW9uLCBlLT5uYW1lLAorCQkJICAgIGV4cF9pbnRvcCAoZS0+dmFsdWUpKTsKKwkgIGVsc2UKKwkgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX3JlbG9wIChlLT5zZWN0aW9uLCBlLT52YWx1ZSkpOworCX0KKworICAgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX2ludG9wICgwKSk7CisgICAgfQorCisgIHN0YXRfcHRyID0gb2xkOworfQpkaWZmIC0tZ2l0IGEvbGQvbGRjdG9yLmggYi9sZC9sZGN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODczZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRjdG9yLmgKQEAgLTAsMCArMSw2MCBAQAorLyogbGRjdG9yLmggLSBsaW5rZXIgY29uc3RydWN0b3Igc3VwcG9ydAorICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIExEQ1RPUl9ICisjZGVmaW5lIExEQ1RPUl9ICisKKy8qIExpc3Qgb2Ygc3RhdGVtZW50cyBuZWVkZWQgdG8gaGFuZGxlIGNvbnN0cnVjdG9ycyAqLworZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjb25zdHJ1Y3Rvcl9saXN0OworCisvKiBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHNvcnRlZC4gIE5vdGUgdGhhdCB0aGlzIGlzCisgICBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgbGluazsgd2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZQorICAgQ09OU1RSVUNUT1JTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLworZXh0ZXJuIGJvb2xlYW4gY29uc3RydWN0b3JzX3NvcnRlZDsKKworLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBmb3IgZWFjaCBzZXQgd2UgYnVpbGQuICAqLworCitzdHJ1Y3Qgc2V0X2luZm8KK3sKKyAgc3RydWN0IHNldF9pbmZvICpuZXh0OwkJLyogTmV4dCBzZXQuICAqLworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsJLyogSGFzaCB0YWJsZSBlbnRyeS4gICovCisgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsJLyogUmVsb2MgdG8gdXNlIGZvciBhbiBlbnRyeS4gICovCisgIHNpemVfdCBjb3VudDsJCQkJLyogTnVtYmVyIG9mIGVsZW1lbnRzLiAgKi8KKyAgc3RydWN0IHNldF9lbGVtZW50ICplbGVtZW50czsJCS8qIEVsZW1lbnRzIGluIHNldC4gICovCit9OworCitzdHJ1Y3Qgc2V0X2VsZW1lbnQKK3sKKyAgc3RydWN0IHNldF9lbGVtZW50ICpuZXh0OwkJLyogTmV4dCBlbGVtZW50LiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsJCQkvKiBOYW1lIGluIHNldCAobWF5IGJlIE5VTEwpLiAgKi8KKyAgYXNlY3Rpb24gKnNlY3Rpb247CQkJLyogU2VjdGlvbiBvZiB2YWx1ZSBpbiBzZXQuICAqLworICBiZmRfdm1hIHZhbHVlOwkJCS8qIFZhbHVlIGluIHNldC4gICovCit9OworCisvKiBUaGUgc2V0cyB3ZSBoYXZlIHNlZW4uICAqLworCitleHRlcm4gc3RydWN0IHNldF9pbmZvICpzZXRzOworCitleHRlcm4gdm9pZCBsZGN0b3JfYWRkX3NldF9lbnRyeSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAorCQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKKwkJCQkJICBjb25zdCBjaGFyICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKK2V4dGVybiB2b2lkIGxkY3Rvcl9idWlsZF9zZXRzIFBBUkFNUyAoKHZvaWQpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGVtdWwuYyBiL2xkL2xkZW11bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjA0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZGVtdWwuYwpAQCAtMCwwICsxLDI5OCBAQAorLyogbGRlbXVsLmMgLS0gY2xlYXJpbmcgaG91c2UgZm9yIGxkIGVtdWxhdGlvbiBzdGF0ZXMKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZGVtdWwtbGlzdC5oIgorCitsZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb247CisKK3ZvaWQKK2xkZW11bF9obGwobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgbGRfZW11bGF0aW9uLT5obGwobmFtZSk7Cit9CisKKwordm9pZCBsZGVtdWxfc3lzbGliKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGxkX2VtdWxhdGlvbi0+c3lzbGliKG5hbWUpOworfQorCit2b2lkCitsZGVtdWxfYWZ0ZXJfcGFyc2UoKQoreworICBsZF9lbXVsYXRpb24tPmFmdGVyX3BhcnNlKCk7Cit9CisKK3ZvaWQKK2xkZW11bF9iZWZvcmVfcGFyc2UoKQoreworICBsZF9lbXVsYXRpb24tPmJlZm9yZV9wYXJzZSgpOworfQorCit2b2lkCitsZGVtdWxfYWZ0ZXJfb3BlbiAoKQoreworICBsZF9lbXVsYXRpb24tPmFmdGVyX29wZW4gKCk7Cit9CisKK3ZvaWQgCitsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbigpCit7CisgIGxkX2VtdWxhdGlvbi0+YWZ0ZXJfYWxsb2NhdGlvbigpOworfQorCit2b2lkIAorbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uKCkKK3sKKyAgaWYgKGxkX2VtdWxhdGlvbi0+YmVmb3JlX2FsbG9jYXRpb24pCisgICAgbGRfZW11bGF0aW9uLT5iZWZvcmVfYWxsb2NhdGlvbigpOworfQorCisKK3ZvaWQKK2xkZW11bF9zZXRfb3V0cHV0X2FyY2goKQoreworICBsZF9lbXVsYXRpb24tPnNldF9vdXRwdXRfYXJjaCgpOworfQorCit2b2lkCitsZGVtdWxfZmluaXNoKCkKK3sKKyAgaWYgKGxkX2VtdWxhdGlvbi0+ZmluaXNoKQorICAgIGxkX2VtdWxhdGlvbi0+ZmluaXNoKCk7Cit9CisKK3ZvaWQKK2xkZW11bF9zZXRfc3ltYm9scygpCit7CisgIGlmIChsZF9lbXVsYXRpb24tPnNldF9zeW1ib2xzKQorICAgIGxkX2VtdWxhdGlvbi0+c2V0X3N5bWJvbHMoKTsKK30KKwordm9pZAorbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKCkKK3sKKyAgaWYgKGxkX2VtdWxhdGlvbi0+Y3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpCisgICAgbGRfZW11bGF0aW9uLT5jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cygpOworfQorCitjaGFyICoKK2xkZW11bF9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7Cit7CisgIHJldHVybiBsZF9lbXVsYXRpb24tPmdldF9zY3JpcHQoaXNmaWxlKTsKK30KKworYm9vbGVhbgorbGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQorICAgICBjb25zdCBjaGFyICphcmNoOworICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7CisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OworeworICBpZiAobGRfZW11bGF0aW9uLT5vcGVuX2R5bmFtaWNfYXJjaGl2ZSkKKyAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPm9wZW5fZHluYW1pY19hcmNoaXZlKSAoYXJjaCwgc2VhcmNoLCBlbnRyeSk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbGVhbgorbGRlbXVsX3BsYWNlX29ycGhhbiAoZmlsZSwgcykKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKKyAgICAgYXNlY3Rpb24gKnM7Cit7CisgIGlmIChsZF9lbXVsYXRpb24tPnBsYWNlX29ycGhhbikKKyAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnBsYWNlX29ycGhhbikgKGZpbGUsIHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2ludAorbGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgLyogVHJ5IGFuZCB1c2UgdGhlIGVtdWxhdGlvbiBwYXJzZXIgaWYgdGhlcmUgaXMgb25lLiAqLworICBpZiAobGRfZW11bGF0aW9uLT5wYXJzZV9hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBsZF9lbXVsYXRpb24tPnBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIExldCB0aGUgZW11bGF0aW9uIGNvZGUgaGFuZGxlIGFuIHVucmVjb2duaXplZCBmaWxlLiAgKi8KKworYm9vbGVhbgorbGRlbXVsX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Cit7CisgIGlmIChsZF9lbXVsYXRpb24tPnVucmVjb2duaXplZF9maWxlKQorICAgIHJldHVybiAoKmxkX2VtdWxhdGlvbi0+dW5yZWNvZ25pemVkX2ZpbGUpIChlbnRyeSk7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogTGV0IHRoZSBlbXVsYXRpb24gY29kZSBoYW5kbGUgYSByZWNvZ25pemVkIGZpbGUuICAqLworCitib29sZWFuCitsZGVtdWxfcmVjb2duaXplZF9maWxlIChlbnRyeSkKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Cit7CisgIGlmIChsZF9lbXVsYXRpb24tPnJlY29nbml6ZWRfZmlsZSkKKyAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnJlY29nbml6ZWRfZmlsZSkgKGVudHJ5KTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitjaGFyICoKK2xkZW11bF9jaG9vc2VfdGFyZ2V0KCkKK3sKKyAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+Y2hvb3NlX3RhcmdldCgpOworfQorCisvKiBUaGUgZGVmYXVsdCBjaG9vc2VfdGFyZ2V0IGZ1bmN0aW9uLiAgKi8KKworY2hhciAqCitsZGVtdWxfZGVmYXVsdF90YXJnZXQoKQoreworICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYgKFRBUkdFVF9FTlZJUk9OKTsKKyAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCisgICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKKyAgcmV0dXJuIGxkX2VtdWxhdGlvbi0+dGFyZ2V0X25hbWU7Cit9CisKK3ZvaWQgCithZnRlcl9wYXJzZV9kZWZhdWx0KCkKK3sKKworfQorCit2b2lkCithZnRlcl9vcGVuX2RlZmF1bHQgKCkKK3sKK30KKwordm9pZAorYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0KCkKK3sKKworfQorCit2b2lkCitiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0KCkKK3sKKworfQorCit2b2lkCitzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCgpCit7CisgIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLworICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLAorCSAgICAgICAgICAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlLCBsZGZpbGVfb3V0cHV0X21hY2hpbmUpOworfQorCisvKkFSR1NVU0VEKi8KK3ZvaWQKK3N5c2xpYl9kZWZhdWx0KGlnbm9yZSkKKyAgICAgY2hhciAgKmlnbm9yZTsKK3sKKyAgaW5mb19tc2cgKF8oIiVTIFNZU0xJQiBpZ25vcmVkXG4iKSk7Cit9CisKKy8qQVJHU1VTRUQqLwordm9pZAoraGxsX2RlZmF1bHQoaWdub3JlKQorICAgICBjaGFyICAqaWdub3JlOworeworICBpbmZvX21zZyAoXygiJVMgSExMIGlnbm9yZWRcbiIpKTsKK30KKworbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uc1tdID0geyBFTVVMQVRJT05fTElTVCB9OworCit2b2lkCitsZGVtdWxfY2hvb3NlX21vZGUodGFyZ2V0KQorICAgICBjaGFyICp0YXJnZXQ7Cit7CisgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKmVwdHIgPSBsZF9lbXVsYXRpb25zOworICAgIC8qIElnbm9yZSAiZ2xkIiBwcmVmaXguICovCisgICAgaWYgKHRhcmdldFswXSA9PSAnZycgJiYgdGFyZ2V0WzFdID09ICdsJyAmJiB0YXJnZXRbMl0gPT0gJ2QnKQorCXRhcmdldCArPSAzOworICAgIGZvciAoOyAqZXB0cjsgZXB0cisrKQorICAgICAgeworCWlmIChzdHJjbXAodGFyZ2V0LCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSkgPT0gMCkKKwkgIHsKKwkgICAgbGRfZW11bGF0aW9uID0gKmVwdHI7CisJICAgIHJldHVybjsKKwkgIH0KKyAgICAgIH0KKyAgICBlaW5mbyAoXygiJVA6IHVucmVjb2duaXNlZCBlbXVsYXRpb24gbW9kZTogJXNcbiIpLCB0YXJnZXQpOworICAgIGVpbmZvIChfKCJTdXBwb3J0ZWQgZW11bGF0aW9uczogIikpOworICAgIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZGVycik7CisgICAgZWluZm8gKCIlRlxuIik7Cit9CisKK3ZvaWQKK2xkZW11bF9saXN0X2VtdWxhdGlvbnMgKGYpCisgICAgIEZJTEUgKmY7Cit7CisgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKKyAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgZm9yICg7ICplcHRyOyBlcHRyKyspCisgICAgeworICAgICAgaWYgKGZpcnN0KQorCWZpcnN0ID0gZmFsc2U7CisgICAgICBlbHNlCisJZnByaW50ZiAoZiwgIiAiKTsKKyAgICAgIGZwcmludGYgKGYsICIlcyIsICgqZXB0ciktPmVtdWxhdGlvbl9uYW1lKTsKKyAgICB9Cit9CisKK3ZvaWQKK2xkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIChmKQorICAgICBGSUxFICogZjsKK3sKKyAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKiBlcHRyOworICBpbnQgb3B0aW9uc19mb3VuZCA9IDA7CisgIAorICBmb3IgKGVwdHIgPSBsZF9lbXVsYXRpb25zOyAqIGVwdHI7IGVwdHIgKyspCisgICAgeworICAgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqIGVtdWwgPSAqIGVwdHI7CisgICAgICAKKyAgICAgIGlmIChlbXVsLT5saXN0X29wdGlvbnMpCisJeworCSAgZnByaW50ZiAoZiwgIiVzOiBcbiIsIGVtdWwtPmVtdWxhdGlvbl9uYW1lKTsKKyAgICAgIAorCSAgZW11bC0+bGlzdF9vcHRpb25zIChmKTsKKworCSAgb3B0aW9uc19mb3VuZCA9IDE7CisJfQorICAgIH0KKyAgCisgIGlmICghIG9wdGlvbnNfZm91bmQpCisgICAgZnByaW50ZiAoZiwgXygiICBubyBlbXVsYXRpb24gc3BlY2lmaWMgb3B0aW9ucy5cbiIpKTsKK30KZGlmZiAtLWdpdCBhL2xkL2xkZW11bC5oIGIvbGQvbGRlbXVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwZGUwNgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2xkZW11bC5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBsZC1lbXVsLmggLSBMaW5rZXIgZW11bGF0aW9uIGhlYWRlciBmaWxlCisgICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICovCisKKyNpZm5kZWYgTERFTVVMX0gKKyNkZWZpbmUgTERFTVVMX0gKKworI2lmIEFOU0lfUFJPVE9UWVBFUworc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdDsKK3N0cnVjdCBzZWFyY2hfZGlyczsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBsZGVtdWxfaGxsIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIHZvaWQgbGRlbXVsX3N5c2xpYiBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiB2b2lkIGxkZW11bF9hZnRlcl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZGVtdWxfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkZW11bF9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZGVtdWxfc2V0X291dHB1dF9hcmNoIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBjaGFyICpsZGVtdWxfY2hvb3NlX3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZGVtdWxfY2hvb3NlX21vZGUgUEFSQU1TICgoY2hhciAqKSk7CitleHRlcm4gdm9pZCBsZGVtdWxfbGlzdF9lbXVsYXRpb25zIFBBUkFNUyAoKEZJTEUgKikpOworZXh0ZXJuIHZvaWQgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7CitleHRlcm4gY2hhciAqbGRlbXVsX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKK2V4dGVybiB2b2lkIGxkZW11bF9maW5pc2ggUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGRlbXVsX3NldF9zeW1ib2xzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gYm9vbGVhbiBsZGVtdWxfcGxhY2Vfb3JwaGFuCisgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKiwgYXNlY3Rpb24gKikpOworZXh0ZXJuIGludCBsZGVtdWxfcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKK2V4dGVybiBib29sZWFuIGxkZW11bF91bnJlY29nbml6ZWRfZmlsZQorICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKK2V4dGVybiBib29sZWFuIGxkZW11bF9yZWNvZ25pemVkX2ZpbGUKKyAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7CitleHRlcm4gYm9vbGVhbiBsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKiwKKwkgICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKK2V4dGVybiBjaGFyICpsZGVtdWxfZGVmYXVsdF90YXJnZXQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYWZ0ZXJfcGFyc2VfZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhZnRlcl9vcGVuX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgc3lzbGliX2RlZmF1bHQgUEFSQU1TICgoY2hhciopKTsKK2V4dGVybiB2b2lkIGhsbF9kZWZhdWx0IFBBUkFNUyAoKGNoYXIqKSk7CisKK3R5cGVkZWYgc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdAoreworICAvKiBSdW4gYmVmb3JlIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZSBhbmQgc2NyaXB0IGZpbGUuCisgICAgIFNldCB0aGUgYXJjaGl0ZWN0dXJlLCBtYXliZSBvdGhlciB0aGluZ3MuICAqLworICB2b2lkICAgKCpiZWZvcmVfcGFyc2UpIFBBUkFNUyAoKHZvaWQpKTsKKworICAvKiBIYW5kbGUgdGhlIFNZU0xJQiAobG93IGxldmVsIGxpYnJhcnkpIHNjcmlwdCBjb21tYW5kLiAgKi8KKyAgdm9pZCAgICgqc3lzbGliKSBQQVJBTVMgKChjaGFyICopKTsKKworICAvKiBIYW5kbGUgdGhlIEhMTCAoaGlnaCBsZXZlbCBsaWJyYXJ5KSBzY3JpcHQgY29tbWFuZC4gICovCisgIHZvaWQgICAoKmhsbCkgUEFSQU1TICgoY2hhciAqKSk7CisKKyAgLyogUnVuIGFmdGVyIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZSBhbmQgc2NyaXB0IGZpbGUuICAqLworICB2b2lkICAgKCphZnRlcl9wYXJzZSkgUEFSQU1TICgodm9pZCkpOworCisgIC8qIFJ1biBhZnRlciBvcGVuaW5nIGFsbCBpbnB1dCBmaWxlcywgYW5kIGxvYWRpbmcgdGhlIHN5bWJvbHMuICAqLworICB2b2lkICAgKCphZnRlcl9vcGVuKSBQQVJBTVMgKCh2b2lkKSk7CisKKyAgLyogUnVuIGFmdGVyIGFsbG9jYXRpbmcgb3V0cHV0IHNlY3Rpb25zLiAgKi8KKyAgdm9pZCAgICgqYWZ0ZXJfYWxsb2NhdGlvbikgUEFSQU1TICggKHZvaWQpKTsKKworICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUuICAqLworICB2b2lkICAgKCpzZXRfb3V0cHV0X2FyY2gpIFBBUkFNUyAoKHZvaWQpKTsKKworICAvKiBEZWNpZGUgd2hpY2ggdGFyZ2V0IG5hbWUgdG8gdXNlLiAgKi8KKyAgY2hhciAqICgqY2hvb3NlX3RhcmdldCkgUEFSQU1TICgodm9pZCkpOworCisgIC8qIFJ1biBiZWZvcmUgYWxsb2NhdGluZyBvdXRwdXQgc2VjdGlvbnMuICAqLworICB2b2lkICAgKCpiZWZvcmVfYWxsb2NhdGlvbikgUEFSQU1TICgodm9pZCkpOworCisgIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgbGlua2VyIHNjcmlwdC4gICovCisgIGNoYXIgKiAoKmdldF9zY3JpcHQpIFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CisKKyAgLyogVGhlIG5hbWUgb2YgdGhpcyBlbXVsYXRpb24uICAqLworICBjaGFyICplbXVsYXRpb25fbmFtZTsKKworICAvKiBUaGUgb3V0cHV0IGZvcm1hdC4gICovCisgIGNoYXIgKnRhcmdldF9uYW1lOworCisgIC8qIFJ1biBhZnRlciBhc3NpZ25pbmcgdmFsdWVzIGZyb20gdGhlIHNjcmlwdC4gICovCisgIHZvaWQJKCpmaW5pc2gpIFBBUkFNUyAoKHZvaWQpKTsKKworICAvKiBDcmVhdGUgYW55IG91dHB1dCBzZWN0aW9ucyBuZWVkZWQgYnkgdGhlIHRhcmdldC4gICovCisgIHZvaWQJKCpjcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cykgUEFSQU1TICgodm9pZCkpOworCisgIC8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBsaWJyYXJ5LiAgQVJDSCBpcyBhbiBhcmNoaXRlY3R1cmUgbmFtZSwgYW5kCisgICAgIGlzIG5vcm1hbGx5IHRoZSBlbXB0eSBzdHJpbmcuICBFTlRSWSBpcyB0aGUgbGFuZ19pbnB1dF9zdGF0ZW1lbnQKKyAgICAgdGhhdCBzaG91bGQgYmUgb3BlbmVkLiAgKi8KKyAgYm9vbGVhbiAoKm9wZW5fZHluYW1pY19hcmNoaXZlKQorICAgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2gsIHN0cnVjdCBzZWFyY2hfZGlycyAqLAorCSAgICAgc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqZW50cnkpKTsKKworICAvKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFJldHVybiB0cnVlIGlmIGl0IHdhcyBwbGFjZWQsIGZhbHNlIGlmCisgICAgIHRoZSBkZWZhdWx0IGFjdGlvbiBzaG91bGQgYmUgdGFrZW4uICBUaGlzIGZpZWxkIG1heSBiZSBOVUxMLCBpbgorICAgICB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIGFsd2F5cyBiZSB0YWtlbi4gICovCisgIGJvb2xlYW4gKCpwbGFjZV9vcnBoYW4pCisgICAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqLCBhc2VjdGlvbiAqKSk7CisKKyAgLyogUnVuIGFmdGVyIGFzc2lnbmluZyBwYXJzaW5nIHdpdGggdGhlIGFyZ3MsIGJ1dCBiZWZvcmUgCisgICAgIHJlYWRpbmcgdGhlIHNjcmlwdC4gIFVzZWQgdG8gaW5pdGlhbGl6ZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHNjcmlwdC4gKi8KKyAgdm9pZAkoKnNldF9zeW1ib2xzKSBQQVJBTVMgKCh2b2lkKSk7CisKKyAgLyogUnVuIHRvIHBhcnNlIGFyZ3Mgd2hpY2ggdGhlIGJhc2UgbGlua2VyIGRvZXNuJ3QKKyAgICAgdW5kZXJzdGFuZC4gUmV0dXJuIG5vbiB6ZXJvIG9uIHN1Y2Vzcy4gKi8KKyAgaW50ICgqcGFyc2VfYXJncykgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CisKKyAgLyogUnVuIHRvIGhhbmRsZSBmaWxlcyB3aGljaCBhcmUgbm90IHJlY29nbml6ZWQgYXMgb2JqZWN0IGZpbGVzIG9yCisgICAgIGFyY2hpdmVzLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGhhbmRsZWQuICAqLworICBib29sZWFuICgqdW5yZWNvZ25pemVkX2ZpbGUpCisgICAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqKSk7CisKKyAgLyogUnVuIHRvIGxpc3QgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIHdoaWNoIHBhcnNlX2FyZ3MgaGFuZGxlcy4gICovCisgIHZvaWQgKCogbGlzdF9vcHRpb25zKSBQQVJBTVMgKChGSUxFICopKTsKKworICAvKiBSdW4gdG8gc3BlY2lhbGx5IGhhbmRsZSBmaWxlcyB3aGljaCAqYXJlKiByZWNvZ25pemVkIGFzIG9iamVjdAorICAgICBmaWxlcyBvciBhcmNoaXZlcy4gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBoYW5kbGVkLiAgKi8KKyAgYm9vbGVhbiAoKnJlY29nbml6ZWRfZmlsZSkKKyAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKKworfSBsZF9lbXVsYXRpb25feGZlcl90eXBlOworCit0eXBlZGVmIGVudW0gCit7CisgIGludGVsX2ljOTYwX2xkX21vZGVfZW51bSwKKyAgZGVmYXVsdF9tb2RlX2VudW0gLAorICBpbnRlbF9nbGQ5NjBfbGRfbW9kZV9lbnVtCit9IGxhbmdfZW11bGF0aW9uX21vZGVfZW51bV90eXBlOworCitleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uc1tdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkZXhwLmMgYi9sZC9sZGV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWQ3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZGV4cC5jCkBAIC0wLDAgKzEsOTg1IEBACisvKiBUaGlzIG1vZHVsZSBoYW5kbGVzIGV4cHJlc3Npb24gdHJlZXMuCitDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzYWNAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK0dMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitUaGlzIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2Ygd29ya2luZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGV4cHJlc3Npb25zLgorCitJdCBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgcmVsYXRpdmUvYWJzbmVzcyBvZiBhIHN5bWJvbCBldGMuIFRoaXMgaXMKK2RvbmUgYnkga2VlcGluZyBhbGwgdmFsdWVzIGluIGEgc3RydWN0IChhbiBldHJlZV92YWx1ZV90eXBlKSB3aGljaAorY29udGFpbnMgYSB2YWx1ZSwgYSBzZWN0aW9uIHRvIHdoaWNoIGl0IGlzIHJlbGF0aXZlIGFuZCBhIHZhbGlkIGJpdC4KKworKi8KKworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaW5jbHVkZSAibGQuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZGV4cC5oIgorI2luY2x1ZGUgImxkZ3JhbS5oIgorI2luY2x1ZGUgImxkbGFuZy5oIgorCitzdGF0aWMgdm9pZCBleHBfcHJpbnRfdG9rZW4gUEFSQU1TICgodG9rZW5fY29kZV90eXBlIGNvZGUpKTsKK3N0YXRpYyB2b2lkIG1ha2VfYWJzIFBBUkFNUyAoKGV0cmVlX3ZhbHVlX3R5cGUgKnB0cikpOworc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X2FicyBQQVJBTVMgKChiZmRfdm1hIHZhbHVlKSk7CitzdGF0aWMgdm9pZCBjaGVjayBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcywKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm9wKSk7CitzdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfcmVsCisgIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUsIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb24pKTsKK3N0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19yZWxfZnJvbV9zZWN0aW9uCisgIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUsIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb24pKTsKK3N0YXRpYyBldHJlZV92YWx1ZV90eXBlIGZvbGRfYmluYXJ5CisgIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCisJICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAorCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUsCisJICAgYmZkX3ZtYSBkb3QsIGJmZF92bWEgKmRvdHApKTsKK3N0YXRpYyBldHJlZV92YWx1ZV90eXBlIGZvbGRfbmFtZQorICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAorCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKKwkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lLAorCSAgIGJmZF92bWEgZG90KSk7CitzdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBleHBfZm9sZF90cmVlX25vX2RvdAorICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAorCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKKwkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lKSk7CisKK3N0YXRpYyB2b2lkCitleHBfcHJpbnRfdG9rZW4gKGNvZGUpCisgICAgIHRva2VuX2NvZGVfdHlwZSBjb2RlOworeworICBzdGF0aWMgQ09OU1Qgc3RydWN0CisgICAgeworICAgICAgdG9rZW5fY29kZV90eXBlIGNvZGU7CisgICAgICBjaGFyICpuYW1lOworICAgIH0gdGFibGVbXSA9CisgICAgICB7CisJeyBJTlQsCSJpbnQiIH0sCisJeyBSRUwsICJyZWxvY2F0ZWFibGUiIH0sCisJeyBOQU1FLCJOQU1FIiB9LAorCXsgUExVU0VRLCIrPSIgfSwKKwl7IE1JTlVTRVEsIi09IiB9LAorCXsgTVVMVEVRLCIqPSIgfSwKKwl7IERJVkVRLCIvPSIgfSwKKwl7IExTSElGVEVRLCI8PD0iIH0sCisJeyBSU0hJRlRFUSwiPj49IiB9LAorCXsgQU5ERVEsIiY9IiB9LAorCXsgT1JFUSwifD0iIH0sCisJeyBPUk9SLCJ8fCIgfSwKKwl7IEFOREFORCwiJiYiIH0sCisJeyBFUSwiPT0iIH0sCisJeyBORSwiIT0iIH0sCisJeyBMRSwiPD0iIH0sCisJeyBHRSwiPj0iIH0sCisJeyBMU0hJRlQsIjw8IiB9LAorCXsgUlNISUZULCI+Pj0iIH0sCisJeyBBTElHTl9LLCJBTElHTiIgfSwKKwl7IEJMT0NLLCJCTE9DSyIgfSwKKwl7IFNFQ1RJT05TLCJTRUNUSU9OUyIgfSwKKwl7IFNJWkVPRl9IRUFERVJTLCJTSVpFT0ZfSEVBREVSUyIgfSwKKwl7IE5FWFQsIk5FWFQiIH0sCisJeyBTSVpFT0YsIlNJWkVPRiIgfSwKKwl7IEFERFIsIkFERFIiIH0sCisJeyBMT0FEQUREUiwiTE9BREFERFIiIH0sCisJeyBNRU1PUlksIk1FTU9SWSIgfSwKKwl7IERFRklORUQsIkRFRklORUQiIH0sCisJeyBUQVJHRVRfSywiVEFSR0VUIiB9LAorCXsgU0VBUkNIX0RJUiwiU0VBUkNIX0RJUiIgfSwKKwl7IE1BUCwiTUFQIiB9LAorCXsgUVVBRCwiUVVBRCIgfSwKKwl7IFNRVUFELCJTUVVBRCIgfSwKKwl7IExPTkcsIkxPTkciIH0sCisJeyBTSE9SVCwiU0hPUlQiIH0sCisJeyBCWVRFLCJCWVRFIiB9LAorCXsgRU5UUlksIkVOVFJZIiB9LAorCXsgMCwoY2hhciAqKU5VTEwgfQorICAgICAgfTsKKyAgdW5zaWduZWQgaW50IGlkeDsKKworICBmb3IgKGlkeCA9IDA7IHRhYmxlW2lkeF0ubmFtZSAhPSAoY2hhciopTlVMTDsgaWR4KyspIHsKKyAgICBpZiAodGFibGVbaWR4XS5jb2RlID09IGNvZGUpIHsKKyAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCAiJXMiLCB0YWJsZVtpZHhdLm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiBOb3QgaW4gdGFibGUsIGp1c3QgcHJpbnQgaXQgYWxvbmUgKi8KKyAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsICIlYyIsY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkIAorbWFrZV9hYnMgKHB0cikKKyAgICAgZXRyZWVfdmFsdWVfdHlwZSAqcHRyOworeworICAgIGFzZWN0aW9uICpzID0gcHRyLT5zZWN0aW9uLT5iZmRfc2VjdGlvbjsKKyAgICBwdHItPnZhbHVlICs9IHMtPnZtYTsKKyAgICBwdHItPnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247Cit9CisKK3N0YXRpYyBldHJlZV92YWx1ZV90eXBlCituZXdfYWJzICh2YWx1ZSkKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7CisgIG5ldy52YWxpZF9wID0gdHJ1ZTsKKyAgbmV3LnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247CisgIG5ldy52YWx1ZSA9IHZhbHVlOworICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZCAKK2NoZWNrIChvcywgbmFtZSwgb3ApCisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICpvcDsKK3sKKyAgaWYgKG9zID09IE5VTEwpCisgICAgZWluZm8gKF8oIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIpLCBvcCwgbmFtZSk7CisgIGlmICghIG9zLT5wcm9jZXNzZWQpCisgICAgZWluZm8gKF8oIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIpLCBvcCwgbmFtZSk7Cit9CisKK2V0cmVlX3R5cGUgKgorZXhwX2ludG9wICh2YWx1ZSkKKyAgICAgYmZkX3ZtYSB2YWx1ZTsKK3sKKyAgZXRyZWVfdHlwZSAqbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyhzaXplb2YobmV3LT52YWx1ZSkpOworICBuZXctPnR5cGUubm9kZV9jb2RlID0gSU5UOworICBuZXctPnZhbHVlLnZhbHVlID0gdmFsdWU7CisgIG5ldy0+dHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfdmFsdWU7CisgIHJldHVybiBuZXc7CisKK30KKworLyogQnVpbGQgYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gdW5uYW1lZCByZWxvY2F0ZWFibGUgdmFsdWUuICAqLworCitldHJlZV90eXBlICoKK2V4cF9yZWxvcCAoc2VjdGlvbiwgdmFsdWUpCisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIHZhbHVlOworeworICBldHJlZV90eXBlICpuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+cmVsKSk7CisgIG5ldy0+dHlwZS5ub2RlX2NvZGUgPSBSRUw7CisgIG5ldy0+dHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfcmVsOworICBuZXctPnJlbC5zZWN0aW9uID0gc2VjdGlvbjsKKyAgbmV3LT5yZWwudmFsdWUgPSB2YWx1ZTsKKyAgcmV0dXJuIG5ldzsKK30KKworc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUKK25ld19yZWwgKHZhbHVlLCBzZWN0aW9uKQorICAgICBiZmRfdm1hIHZhbHVlOworICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uOworeworICBldHJlZV92YWx1ZV90eXBlIG5ldzsKKyAgbmV3LnZhbGlkX3AgPSB0cnVlOworICBuZXcudmFsdWUgPSB2YWx1ZTsKKyAgbmV3LnNlY3Rpb24gPSBzZWN0aW9uOworICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgZXRyZWVfdmFsdWVfdHlwZQorbmV3X3JlbF9mcm9tX3NlY3Rpb24gKHZhbHVlLCBzZWN0aW9uKQorICAgICBiZmRfdm1hIHZhbHVlOworICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uOworeworICBldHJlZV92YWx1ZV90eXBlIG5ldzsKKyAgbmV3LnZhbGlkX3AgPSB0cnVlOworICBuZXcudmFsdWUgPSB2YWx1ZTsKKyAgbmV3LnNlY3Rpb24gPSBzZWN0aW9uOworCisgICAgbmV3LnZhbHVlIC09IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7CisKKyAgcmV0dXJuIG5ldzsKK30KKworc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgCitmb2xkX2JpbmFyeSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCkKKyAgICAgZXRyZWVfdHlwZSAqdHJlZTsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOworICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOworICAgICBiZmRfdm1hIGRvdDsKKyAgICAgYmZkX3ZtYSAqZG90cDsKK3sKKyAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7CisKKyAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YmluYXJ5LmxocywgY3VycmVudF9zZWN0aW9uLAorCQkJICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7CisgIGlmIChyZXN1bHQudmFsaWRfcCkKKyAgICB7CisgICAgICBldHJlZV92YWx1ZV90eXBlIG90aGVyOworCisgICAgICBvdGhlciA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmJpbmFyeS5yaHMsCisJCQkgICAgIGN1cnJlbnRfc2VjdGlvbiwKKwkJCSAgICAgYWxsb2NhdGlvbl9kb25lLCBkb3QsZG90cCkgOworICAgICAgaWYgKG90aGVyLnZhbGlkX3ApCisJeworCSAgLyogSWYgdGhlIHZhbHVlcyBhcmUgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMsIG9yIHRoaXMgaXMgYW4KKwkgICAgIGFic29sdXRlIGV4cHJlc3Npb24sIG1ha2UgYm90aCB0aGUgc291cmNlIGFyZ3VtZW50cworCSAgICAgYWJzb2x1dGUuICBIb3dldmVyLCBhZGRpbmcgb3Igc3VidHJhY3RpbmcgYW4gYWJzb2x1dGUKKwkgICAgIHZhbHVlIGZyb20gYSByZWxhdGl2ZSB2YWx1ZSBpcyBtZWFuaW5nZnVsLCBhbmQgaXMgYW4KKwkgICAgIGV4Y2VwdGlvbi4gICovCisJICBpZiAoY3VycmVudF9zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbgorCSAgICAgICYmIChvdGhlci5zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbgorCQkgIHx8IChyZXN1bHQuc2VjdGlvbiA9PSBhYnNfb3V0cHV0X3NlY3Rpb24KKwkJICAgICAgJiYgdHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJysnKSkKKwkgICAgICAmJiAodHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJysnCisJCSAgfHwgdHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJy0nKSkKKwkgICAgeworCSAgICAgIGV0cmVlX3ZhbHVlX3R5cGUgaG9sZDsKKworCSAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIGFic29sdXRlIHRlcm0sIG1ha2Ugc3VyZSBpdCBpcyB0aGUKKwkJIHNlY29uZCBvbmUuICAqLworCSAgICAgIGlmIChvdGhlci5zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbikKKwkJeworCQkgIGhvbGQgPSByZXN1bHQ7CisJCSAgcmVzdWx0ID0gb3RoZXI7CisJCSAgb3RoZXIgPSBob2xkOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHJlc3VsdC5zZWN0aW9uICE9IG90aGVyLnNlY3Rpb24KKwkJICAgfHwgY3VycmVudF9zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbikKKwkgICAgeworCSAgICAgIG1ha2VfYWJzKCZyZXN1bHQpOworCSAgICAgIG1ha2VfYWJzKCZvdGhlcik7CisJICAgIH0KKworCSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCisJICAgIHsKKwkgICAgY2FzZSAnJSc6CisJICAgICAgaWYgKG90aGVyLnZhbHVlID09IDApCisJCWVpbmZvIChfKCIlRiVTICUlIGJ5IHplcm9cbiIpKTsKKwkgICAgICByZXN1bHQudmFsdWUgPSAoKGJmZF9zaWduZWRfdm1hKSByZXN1bHQudmFsdWUKKwkJCSAgICAgICUgKGJmZF9zaWduZWRfdm1hKSBvdGhlci52YWx1ZSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnLyc6CisJICAgICAgaWYgKG90aGVyLnZhbHVlID09IDApCisJCWVpbmZvIChfKCIlRiVTIC8gYnkgemVyb1xuIikpOworCSAgICAgIHJlc3VsdC52YWx1ZSA9ICgoYmZkX3NpZ25lZF92bWEpIHJlc3VsdC52YWx1ZQorCQkJICAgICAgLyAoYmZkX3NpZ25lZF92bWEpIG90aGVyLnZhbHVlKTsKKwkgICAgICBicmVhazsKKworI2RlZmluZSBCT1AoeCx5KSBjYXNlIHggOiByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUgeSBvdGhlci52YWx1ZTsgYnJlYWs7CisJICAgICAgQk9QKCcrJywrKTsKKwkgICAgICBCT1AoJyonLCopOworCSAgICAgIEJPUCgnLScsLSk7CisJICAgICAgQk9QKExTSElGVCw8PCk7CisJICAgICAgQk9QKFJTSElGVCw+Pik7CisJICAgICAgQk9QKEVRLD09KTsKKwkgICAgICBCT1AoTkUsIT0pOworCSAgICAgIEJPUCgnPCcsPCk7CisJICAgICAgQk9QKCc+Jyw+KTsKKwkgICAgICBCT1AoTEUsPD0pOworCSAgICAgIEJPUChHRSw+PSk7CisJICAgICAgQk9QKCcmJywmKTsKKwkgICAgICBCT1AoJ14nLF4pOworCSAgICAgIEJPUCgnfCcsfCk7CisJICAgICAgQk9QKEFOREFORCwmJik7CisJICAgICAgQk9QKE9ST1IsfHwpOworCisJICAgIGNhc2UgTUFYX0s6CisJICAgICAgaWYgKHJlc3VsdC52YWx1ZSA8IG90aGVyLnZhbHVlKQorCQlyZXN1bHQgPSBvdGhlcjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE1JTl9LOgorCSAgICAgIGlmIChyZXN1bHQudmFsdWUgPiBvdGhlci52YWx1ZSkKKwkJcmVzdWx0ID0gb3RoZXI7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGQUlMKCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKKwl9CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2V0cmVlX3ZhbHVlX3R5cGUgCitpbnZhbGlkICgpCit7CisgIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OworICBuZXcudmFsaWRfcCA9IGZhbHNlOworICByZXR1cm4gbmV3OworfQorCitzdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKK2ZvbGRfbmFtZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCkKKyAgICAgZXRyZWVfdHlwZSAqdHJlZTsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOworICAgICBsYW5nX3BoYXNlX3R5cGUgIGFsbG9jYXRpb25fZG9uZTsKKyAgICAgYmZkX3ZtYSBkb3Q7Cit7CisgIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OworICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jb2RlKSAKKyAgICAgIHsKKyAgICAgIGNhc2UgU0laRU9GX0hFQURFUlM6CisJaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pIAorCSAgeworCSAgICByZXN1bHQgPSBuZXdfYWJzICgoYmZkX3ZtYSkKKwkJCSAgICAgIGJmZF9zaXplb2ZfaGVhZGVycyAob3V0cHV0X2JmZCwKKwkJCQkJCSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKKwkgIH0KKwlicmVhazsKKyAgICAgIGNhc2UgREVGSU5FRDoKKwlpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKKwkgIHJlc3VsdC52YWxpZF9wID0gZmFsc2U7CisJZWxzZQorCSAgeworCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworCSAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKKwkJCQkJICAgICAgdHJlZS0+bmFtZS5uYW1lLAorCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOworCSAgICByZXN1bHQudmFsdWUgPSAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAorCQkJICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorCQkJCXx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisJCQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikpOworCSAgICByZXN1bHQuc2VjdGlvbiA9IDA7CisJICAgIHJlc3VsdC52YWxpZF9wID0gdHJ1ZTsKKwkgIH0KKwlicmVhazsKKyAgICAgIGNhc2UgTkFNRToKKwlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOworCWlmICh0cmVlLT5uYW1lLm5hbWVbMF0gPT0gJy4nICYmIHRyZWUtPm5hbWUubmFtZVsxXSA9PSAwKQorCSAgeworCSAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKKwkgICAgICByZXN1bHQgPSBuZXdfcmVsX2Zyb21fc2VjdGlvbihkb3QsIGN1cnJlbnRfc2VjdGlvbik7CisJICAgIGVsc2UKKwkgICAgICByZXN1bHQgPSBpbnZhbGlkKCk7CisJICB9CisJZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKKwkgIHsKKwkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKwkgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCisJCQkJCSAgICAgIHRyZWUtPm5hbWUubmFtZSwKKwkJCQkJICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkgICAgaWYgKGggIT0gTlVMTAorCQkmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkJICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKKwkgICAgICB7CisJCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnUuZGVmLnNlY3Rpb24pKQorCQkgIHJlc3VsdCA9IG5ld19hYnMgKGgtPnUuZGVmLnZhbHVlKTsKKwkJZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bQorCQkJIHx8IGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSkKKwkJICB7CisJCSAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisKKwkJICAgIG91dHB1dF9zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisJCSAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKKwkJICAgICAgZWluZm8gKF8oIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIpLAorCQkJICAgICB0cmVlLT5uYW1lLm5hbWUpOworCQkgICAgZWxzZQorCQkgICAgICB7CisJCQlsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKKworCQkJb3MgPSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwCisJCQkgICAgICAoYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCisJCQkJCQkgICAgIG91dHB1dF9zZWN0aW9uKSkpOworCisJCQkvKiBGSVhNRTogSXMgdGhpcyBjb3JyZWN0IGlmIHRoaXMgc2VjdGlvbiBpcworCQkJICAgYmVpbmcgbGlua2VkIHdpdGggLVI/ICAqLworCQkJcmVzdWx0ID0gbmV3X3JlbCAoKGgtPnUuZGVmLnZhbHVlCisJCQkJCSAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCisJCQkJCSAgb3MpOworCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bSkKKwkgICAgICBlaW5mbyAoXygiJUYlUzogdW5kZWZpbmVkIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIiksCisJCSAgICAgdHJlZS0+bmFtZS5uYW1lKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBBRERSOgorCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQorCSAgeworCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKKworCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKKwkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJBRERSIik7CisJICAgIHJlc3VsdCA9IG5ld19yZWwgKDAsIG9zKTsKKwkgIH0KKwllbHNlCisJICByZXN1bHQgPSBpbnZhbGlkICgpOworCWJyZWFrOworCisgICAgICBjYXNlIExPQURBRERSOgorCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQorCSAgeworCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKKworCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKKwkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJMT0FEQUREUiIpOworCSAgICBpZiAob3MtPmxvYWRfYmFzZSA9PSBOVUxMKQorCSAgICAgIHJlc3VsdCA9IG5ld19yZWwgKDAsIG9zKTsKKwkgICAgZWxzZQorCSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWVfbm9fZG90IChvcy0+bG9hZF9iYXNlLAorCQkJCQkgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKKwkJCQkJICAgICBhbGxvY2F0aW9uX2RvbmUpOworCSAgfQorCWVsc2UKKwkgIHJlc3VsdCA9IGludmFsaWQgKCk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU0laRU9GOgorCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQorCSAgeworCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKKworCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKKwkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJTSVpFT0YiKTsKKwkgICAgcmVzdWx0ID0gbmV3X2FicyAob3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpOworCSAgfQorCWVsc2UKKwkgIHJlc3VsdCA9IGludmFsaWQgKCk7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJRkFJTCgpOworCWJyZWFrOworICAgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CitldHJlZV92YWx1ZV90eXBlIAorZXhwX2ZvbGRfdHJlZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCkKKyAgICAgZXRyZWVfdHlwZSAqdHJlZTsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOworICAgICBsYW5nX3BoYXNlX3R5cGUgIGFsbG9jYXRpb25fZG9uZTsKKyAgICAgYmZkX3ZtYSBkb3Q7CisgICAgIGJmZF92bWEgKmRvdHA7Cit7CisgIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OworCisgIGlmICh0cmVlID09IE5VTEwpCisgICAgeworICAgICAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NsYXNzKSAKKyAgICB7CisgICAgY2FzZSBldHJlZV92YWx1ZToKKyAgICAgIHJlc3VsdCA9IG5ld19yZWwgKHRyZWUtPnZhbHVlLnZhbHVlLCBjdXJyZW50X3NlY3Rpb24pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV0cmVlX3JlbDoKKyAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maW5hbF9waGFzZV9lbnVtKQorCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7CisgICAgICBlbHNlCisJcmVzdWx0ID0gbmV3X3JlbCAoKHRyZWUtPnJlbC52YWx1ZQorCQkJICAgKyB0cmVlLT5yZWwuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJICAgKyB0cmVlLT5yZWwuc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCisJCQkgIGN1cnJlbnRfc2VjdGlvbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfYXNzZXJ0OgorICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzZXJ0X3MuY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7CisgICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCisJeworCSAgaWYgKCEgcmVzdWx0LnZhbHVlKQorCSAgICBlaW5mbyAoIiVGJVA6ICVzXG4iLCB0cmVlLT5hc3NlcnRfcy5tZXNzYWdlKTsKKwkgIHJldHVybiByZXN1bHQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV0cmVlX3VuYXJ5OgorICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+dW5hcnkuY2hpbGQsCisJCQkgICAgICBjdXJyZW50X3NlY3Rpb24sCisJCQkgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7CisgICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCisJeworCSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCisJICAgIHsKKwkgICAgY2FzZSBBTElHTl9LOgorCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQorCQlyZXN1bHQgPSBuZXdfcmVsX2Zyb21fc2VjdGlvbiAoQUxJR05fTiAoZG90LCByZXN1bHQudmFsdWUpLAorCQkJCQkgICAgICAgY3VycmVudF9zZWN0aW9uKTsKKwkgICAgICBlbHNlCisJCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBBQlNPTFVURToKKwkgICAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSAmJiByZXN1bHQudmFsaWRfcCkKKwkJeworCQkgIHJlc3VsdC52YWx1ZSArPSByZXN1bHQuc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYTsKKwkJICByZXN1bHQuc2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKKwkJfQorCSAgICAgIGVsc2UgCisJCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnfic6CisJICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOworCSAgICAgIHJlc3VsdC52YWx1ZSA9IH5yZXN1bHQudmFsdWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnISc6CisJICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOworCSAgICAgIHJlc3VsdC52YWx1ZSA9ICFyZXN1bHQudmFsdWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnLSc6CisJICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOworCSAgICAgIHJlc3VsdC52YWx1ZSA9IC1yZXN1bHQudmFsdWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBORVhUOgorCSAgICAgIC8qIFJldHVybiBuZXh0IHBsYWNlIGFsaWduZWQgdG8gdmFsdWUuICAqLworCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0pCisJCXsKKwkJICBtYWtlX2FicyAoJnJlc3VsdCk7CisJCSAgcmVzdWx0LnZhbHVlID0gQUxJR05fTiAoZG90LCByZXN1bHQudmFsdWUpOworCQl9CisJICAgICAgZWxzZQorCQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgRkFJTCAoKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBldHJlZV90cmluYXJ5OgorICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+dHJpbmFyeS5jb25kLCBjdXJyZW50X3NlY3Rpb24sCisJCQkgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7CisgICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCisJcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAoKHJlc3VsdC52YWx1ZQorCQkJCSA/IHRyZWUtPnRyaW5hcnkubGhzCisJCQkJIDogdHJlZS0+dHJpbmFyeS5yaHMpLAorCQkJCWN1cnJlbnRfc2VjdGlvbiwKKwkJCQlhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfYmluYXJ5OgorICAgICAgcmVzdWx0ID0gZm9sZF9iaW5hcnkgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLAorCQkJICAgIGRvdCwgZG90cCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfYXNzaWduOgorICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKKyAgICAgIGlmICh0cmVlLT5hc3NpZ24uZHN0WzBdID09ICcuJyAmJiB0cmVlLT5hc3NpZ24uZHN0WzFdID09IDApCisJeworCSAgLyogQXNzaWdubWVudCB0byBkb3QgY2FuIG9ubHkgYmUgZG9uZSBkdXJpbmcgYWxsb2NhdGlvbiAqLworCSAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlKQorCSAgICBlaW5mbyAoXygiJUYlUyBjYW4gbm90IFBST1ZJREUgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iKSk7CisJICBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtCisJICAgICAgfHwgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2ZpbmFsX3BoYXNlX2VudW0KKwkJICAmJiBjdXJyZW50X3NlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uKSkKKwkgICAgeworCSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmFzc2lnbi5zcmMsCisJCQkJICAgICAgY3VycmVudF9zZWN0aW9uLAorCQkJCSAgICAgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLCBkb3QsCisJCQkJICAgICAgZG90cCk7CisJICAgICAgaWYgKCEgcmVzdWx0LnZhbGlkX3ApCisJCWVpbmZvIChfKCIlRiVTIGludmFsaWQgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iKSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKGN1cnJlbnRfc2VjdGlvbiA9PSBOVUxMKQorCQkgICAgZWluZm8gKF8oIiVGJVMgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyIGludmFsaWQgb3V0c2lkZSBvZiBTRUNUSU9OXG4iKSk7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBiZmRfdm1hIG5leHRkb3Q7CisKKwkJICAgICAgbmV4dGRvdCA9IChyZXN1bHQudmFsdWUKKwkJCQkgKyBjdXJyZW50X3NlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWEpOworCQkgICAgICBpZiAobmV4dGRvdCA8IGRvdAorCQkJICAmJiBjdXJyZW50X3NlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uKQorCQkJeworCQkJICBlaW5mbyAoXygiJUYlUyBjYW5ub3QgbW92ZSBsb2NhdGlvbiBjb3VudGVyIGJhY2t3YXJkcyAoZnJvbSAlViB0byAlVilcbiIpLAorCQkJCSBkb3QsIG5leHRkb3QpOworCQkJfQorCQkgICAgICBlbHNlCisJCQkqZG90cCA9IG5leHRkb3Q7IAorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzaWduLnNyYywKKwkJCQkgIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLAorCQkJCSAgZG90LCBkb3RwKTsKKwkgIGlmIChyZXN1bHQudmFsaWRfcCkKKwkgICAgeworCSAgICAgIGJvb2xlYW4gY3JlYXRlOworCSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisJICAgICAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9hc3NpZ24pCisJCWNyZWF0ZSA9IHRydWU7CisJICAgICAgZWxzZQorCQljcmVhdGUgPSBmYWxzZTsKKwkgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0cmVlLT5hc3NpZ24uZHN0LAorCQkJCQljcmVhdGUsIGZhbHNlLCBmYWxzZSk7CisJICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisJCXsKKwkJICBpZiAodHJlZS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX2Fzc2lnbikKKwkJICAgIGVpbmZvIChfKCIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIiksCisJCQkgICB0cmVlLT5hc3NpZ24uZHN0KTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlCisJCSAgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCisJCSAgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQorCQl7CisJCSAgLyogRG8gbm90aGluZy4gIFRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgc29tZQorCQkgICAgIG9iamVjdC4gICovCisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBGSVhNRTogU2hvdWxkIHdlIHdvcnJ5IGlmIHRoZSBzeW1ib2wgaXMgYWxyZWFkeQorCQkgICAgIGRlZmluZWQ/ICAqLworCQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisJCSAgaC0+dS5kZWYudmFsdWUgPSByZXN1bHQudmFsdWU7CisJCSAgaC0+dS5kZWYuc2VjdGlvbiA9IHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbjsKKwkJfQorCSAgICB9CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV0cmVlX25hbWU6CisgICAgICByZXN1bHQgPSBmb2xkX25hbWUgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCBkb3QpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgRkFJTCAoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKK2V4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSkKKyAgICAgZXRyZWVfdHlwZSAqdHJlZTsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOworICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOworeworcmV0dXJuIGV4cF9mb2xkX3RyZWUodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIChiZmRfdm1hKQorCQkgICAgIDAsIChiZmRfdm1hICopTlVMTCk7Cit9CisKK2V0cmVlX3R5cGUgKgorZXhwX2Jpbm9wIChjb2RlLCBsaHMsIHJocykKKyAgICAgaW50IGNvZGU7CisgICAgIGV0cmVlX3R5cGUgKmxoczsKKyAgICAgZXRyZWVfdHlwZSAqcmhzOworeworICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OworICBldHJlZV92YWx1ZV90eXBlIHI7CisKKyAgdmFsdWUudHlwZS5ub2RlX2NvZGUgPSBjb2RlOworICB2YWx1ZS5iaW5hcnkubGhzID0gbGhzOworICB2YWx1ZS5iaW5hcnkucmhzID0gcmhzOworICB2YWx1ZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9iaW5hcnk7CisgIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsCisJCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCisJCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0gKTsKKyAgaWYgKHIudmFsaWRfcCkKKyAgICB7CisgICAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOworICAgIH0KKyAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPmJpbmFyeSkpOworICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5iaW5hcnkpKTsKKyAgcmV0dXJuIG5ldzsKK30KKworZXRyZWVfdHlwZSAqCitleHBfdHJpbm9wIChjb2RlLCBjb25kLCBsaHMsIHJocykKKyAgICAgaW50IGNvZGU7CisgICAgIGV0cmVlX3R5cGUgKmNvbmQ7CisgICAgIGV0cmVlX3R5cGUgKmxoczsKKyAgICAgZXRyZWVfdHlwZSAqcmhzOworeworICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OworICBldHJlZV92YWx1ZV90eXBlIHI7CisgIHZhbHVlLnR5cGUubm9kZV9jb2RlID0gY29kZTsKKyAgdmFsdWUudHJpbmFyeS5saHMgPSBsaHM7CisgIHZhbHVlLnRyaW5hcnkuY29uZCA9IGNvbmQ7CisgIHZhbHVlLnRyaW5hcnkucmhzID0gcmhzOworICB2YWx1ZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV90cmluYXJ5OworICByPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZQorCQkJCSAgICAqKU5VTEwsbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKKyAgaWYgKHIudmFsaWRfcCkgeworICAgIHJldHVybiBleHBfaW50b3Aoci52YWx1ZSk7CisgIH0KKyAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPnRyaW5hcnkpKTsKKyAgbWVtY3B5KChjaGFyICopbmV3LChjaGFyICopICZ2YWx1ZSwgc2l6ZW9mKG5ldy0+dHJpbmFyeSkpOworICByZXR1cm4gbmV3OworfQorCisKK2V0cmVlX3R5cGUgKgorZXhwX3Vub3AgKGNvZGUsIGNoaWxkKQorICAgICBpbnQgY29kZTsKKyAgICAgZXRyZWVfdHlwZSAqY2hpbGQ7Cit7CisgIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7CisKKyAgZXRyZWVfdmFsdWVfdHlwZSByOworICB2YWx1ZS51bmFyeS50eXBlLm5vZGVfY29kZSA9IGNvZGU7CisgIHZhbHVlLnVuYXJ5LmNoaWxkID0gY2hpbGQ7CisgIHZhbHVlLnVuYXJ5LnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3VuYXJ5OworICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLGFic19vdXRwdXRfc2VjdGlvbiwKKwkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7CisgIGlmIChyLnZhbGlkX3ApIHsKKyAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOworICB9CisgIG5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT51bmFyeSkpOworICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT51bmFyeSkpOworICByZXR1cm4gbmV3OworfQorCisKK2V0cmVlX3R5cGUgKgorZXhwX25hbWVvcCAoY29kZSwgbmFtZSkKKyAgICAgaW50IGNvZGU7CisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7CisgIGV0cmVlX3ZhbHVlX3R5cGUgcjsKKyAgdmFsdWUubmFtZS50eXBlLm5vZGVfY29kZSA9IGNvZGU7CisgIHZhbHVlLm5hbWUubmFtZSA9IG5hbWU7CisgIHZhbHVlLm5hbWUudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfbmFtZTsKKworCisgIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsCisJCQkgICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKU5VTEwsCisJCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOworICBpZiAoci52YWxpZF9wKSB7CisgICAgcmV0dXJuIGV4cF9pbnRvcChyLnZhbHVlKTsKKyAgfQorICBuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+bmFtZSkpOworICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5uYW1lKSk7CisgIHJldHVybiBuZXc7CisKK30KKworCisKKworZXRyZWVfdHlwZSAqCitleHBfYXNzb3AgKGNvZGUsIGRzdCwgc3JjKQorICAgICBpbnQgY29kZTsKKyAgICAgQ09OU1QgY2hhciAqZHN0OworICAgICBldHJlZV90eXBlICpzcmM7Cit7CisgIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7CisKKyAgdmFsdWUuYXNzaWduLnR5cGUubm9kZV9jb2RlID0gY29kZTsKKworCisgIHZhbHVlLmFzc2lnbi5zcmMgPSBzcmM7CisgIHZhbHVlLmFzc2lnbi5kc3QgPSBkc3Q7CisgIHZhbHVlLmFzc2lnbi50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9hc3NpZ247CisKKyNpZiAwCisgIGlmIChleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsICZyZXN1bHQpKSB7CisgICAgcmV0dXJuIGV4cF9pbnRvcChyZXN1bHQpOworICB9CisjZW5kaWYKKyAgbmV3ID0gKGV0cmVlX3R5cGUqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+YXNzaWduKSk7CisgIG1lbWNweSgoY2hhciAqKW5ldywgKGNoYXIgKikmdmFsdWUsIHNpemVvZihuZXctPmFzc2lnbikpOworICByZXR1cm4gbmV3OworfQorCisvKiBIYW5kbGUgUFJPVklERS4gICovCisKK2V0cmVlX3R5cGUgKgorZXhwX3Byb3ZpZGUgKGRzdCwgc3JjKQorICAgICBjb25zdCBjaGFyICpkc3Q7CisgICAgIGV0cmVlX3R5cGUgKnNyYzsKK3sKKyAgZXRyZWVfdHlwZSAqbjsKKworICBuID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuLT5hc3NpZ24pKTsKKyAgbi0+YXNzaWduLnR5cGUubm9kZV9jb2RlID0gJz0nOworICBuLT5hc3NpZ24udHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfcHJvdmlkZTsKKyAgbi0+YXNzaWduLnNyYyA9IHNyYzsKKyAgbi0+YXNzaWduLmRzdCA9IGRzdDsKKyAgcmV0dXJuIG47Cit9CisKKy8qIEhhbmRsZSBBU1NFUlQuICAqLworCitldHJlZV90eXBlICoKK2V4cF9hc3NlcnQgKGV4cCwgbWVzc2FnZSkKKyAgICAgZXRyZWVfdHlwZSAqZXhwOworICAgICBjb25zdCBjaGFyICptZXNzYWdlOworeworICBldHJlZV90eXBlICpuOworCisgIG4gPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG4tPmFzc2VydF9zKSk7CisgIG4tPmFzc2VydF9zLnR5cGUubm9kZV9jb2RlID0gJyEnOworICBuLT5hc3NlcnRfcy50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9hc3NlcnQ7CisgIG4tPmFzc2VydF9zLmNoaWxkID0gZXhwOworICBuLT5hc3NlcnRfcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgcmV0dXJuIG47Cit9CisKK3ZvaWQgCitleHBfcHJpbnRfdHJlZSAodHJlZSkKKyAgICAgZXRyZWVfdHlwZSAqdHJlZTsKK3sKKyAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY2xhc3MpIHsKKyAgY2FzZSBldHJlZV92YWx1ZToKKyAgICBtaW5mbyAoIjB4JXYiLCB0cmVlLT52YWx1ZS52YWx1ZSk7CisgICAgcmV0dXJuOworICBjYXNlIGV0cmVlX3JlbDoKKyAgICBpZiAodHJlZS0+cmVsLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCisgICAgICBtaW5mbyAoIiVCOiIsIHRyZWUtPnJlbC5zZWN0aW9uLT5vd25lcik7CisgICAgbWluZm8gKCIlcysweCV2IiwgdHJlZS0+cmVsLnNlY3Rpb24tPm5hbWUsIHRyZWUtPnJlbC52YWx1ZSk7CisgICAgcmV0dXJuOworICBjYXNlIGV0cmVlX2Fzc2lnbjoKKyNpZiAwCisgICAgaWYgKHRyZWUtPmFzc2lnbi5kc3QtPnNkZWZzICE9IChhc3ltYm9sICopTlVMTCl7CisgICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMgKCV4KSAiLHRyZWUtPmFzc2lnbi5kc3QtPm5hbWUsCisJICAgICAgdHJlZS0+YXNzaWduLmRzdC0+c2RlZnMtPnZhbHVlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMgKFVOREVGSU5FRCkiLHRyZWUtPmFzc2lnbi5kc3QtPm5hbWUpOworICAgIH0KKyNlbmRpZgorICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyIsdHJlZS0+YXNzaWduLmRzdCk7CisgICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKKyAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT5hc3NpZ24uc3JjKTsKKyAgICBicmVhazsKKyAgY2FzZSBldHJlZV9wcm92aWRlOgorICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlBST1ZJREUgKCVzLCAiLCB0cmVlLT5hc3NpZ24uZHN0KTsKKyAgICBleHBfcHJpbnRfdHJlZSAodHJlZS0+YXNzaWduLnNyYyk7CisgICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiKSIpOworICAgIGJyZWFrOworICBjYXNlIGV0cmVlX2JpbmFyeToKKyAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCIpOworICAgIGV4cF9wcmludF90cmVlKHRyZWUtPmJpbmFyeS5saHMpOworICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7CisgICAgZXhwX3ByaW50X3RyZWUodHJlZS0+YmluYXJ5LnJocyk7CisgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIikiKTsKKyAgICBicmVhazsKKyAgY2FzZSBldHJlZV90cmluYXJ5OgorICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnRyaW5hcnkuY29uZCk7CisgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIj8iKTsKKyAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5Lmxocyk7CisgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIjoiKTsKKyAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5LnJocyk7CisgICAgYnJlYWs7CisgIGNhc2UgZXRyZWVfdW5hcnk6CisgICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnVuYXJ5LnR5cGUubm9kZV9jb2RlKTsKKyAgICBpZiAodHJlZS0+dW5hcnkuY2hpbGQpIAorICAgIHsKKyAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCIpOworICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnVuYXJ5LmNoaWxkKTsKKyAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKSIpOworICB9CisgICAgCisgICAgYnJlYWs7CisKKyAgY2FzZSBldHJlZV9hc3NlcnQ6CisgICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiQVNTRVJUICgiKTsKKyAgICBleHBfcHJpbnRfdHJlZSAodHJlZS0+YXNzZXJ0X3MuY2hpbGQpOworICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiwgJXMpIiwgdHJlZS0+YXNzZXJ0X3MubWVzc2FnZSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBldHJlZV91bmRlZjoKKyAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiPz8/Pz8/Pz8iKTsKKyAgICBicmVhazsKKyAgY2FzZSBldHJlZV9uYW1lOgorICAgIGlmICh0cmVlLT50eXBlLm5vZGVfY29kZSA9PSBOQU1FKSB7CisgICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMiLCB0cmVlLT5uYW1lLm5hbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7CisgICAgICBpZiAodHJlZS0+bmFtZS5uYW1lKQorICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiglcykiLCB0cmVlLT5uYW1lLm5hbWUpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBGQUlMKCk7CisgICAgYnJlYWs7CisgIH0KK30KKworYmZkX3ZtYQorZXhwX2dldF92bWEgKHRyZWUsIGRlZiwgbmFtZSwgYWxsb2NhdGlvbl9kb25lKQorICAgICBldHJlZV90eXBlICp0cmVlOworICAgICBiZmRfdm1hIGRlZjsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKK3sKKyAgZXRyZWVfdmFsdWVfdHlwZSByOworCisgIGlmICh0cmVlICE9IE5VTEwpCisgICAgeworICAgICAgciA9IGV4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBhYnNfb3V0cHV0X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSk7CisgICAgICBpZiAoISByLnZhbGlkX3AgJiYgbmFtZSAhPSBOVUxMKQorCWVpbmZvIChfKCIlRiVTIG5vbmNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iKSwgbmFtZSk7CisgICAgICByZXR1cm4gci52YWx1ZTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gZGVmOworfQorCitpbnQgCitleHBfZ2V0X3ZhbHVlX2ludCAodHJlZSxkZWYsbmFtZSwgYWxsb2NhdGlvbl9kb25lKQorICAgICBldHJlZV90eXBlICp0cmVlOworICAgICBpbnQgZGVmOworICAgICBjaGFyICpuYW1lOworICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOworeworICByZXR1cm4gKGludClleHBfZ2V0X3ZtYSh0cmVlLChiZmRfdm1hKWRlZixuYW1lLCBhbGxvY2F0aW9uX2RvbmUpOworfQorCisKK2JmZF92bWEKK2V4cF9nZXRfYWJzX2ludCAodHJlZSwgZGVmLCBuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCisgICAgIGV0cmVlX3R5cGUgKnRyZWU7CisgICAgIGludCBkZWY7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Cit7CisgIGV0cmVlX3ZhbHVlX3R5cGUgcmVzOworICByZXMgPSBleHBfZm9sZF90cmVlX25vX2RvdCAodHJlZSwgYWJzX291dHB1dF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUpOworCisgIGlmIChyZXMudmFsaWRfcCkKKyAgICB7CisgICAgICByZXMudmFsdWUgKz0gcmVzLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7CisgICAgfQorICBlbHNlIHsKKyAgICBlaW5mbyAoXygiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLG5hbWUpOworICB9CisgIHJldHVybiByZXMudmFsdWU7Cit9CmRpZmYgLS1naXQgYS9sZC9sZGV4cC5oIGIvbGQvbGRleHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGU4ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRleHAuaApAQCAtMCwwICsxLDExNiBAQAorLyogbGRleHAuaCAtCisgICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKKyAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgTERFWFBfSAorI2RlZmluZSBMREVYUF9ICisKKy8qIFRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiB0cmVlICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgYmZkX3ZtYSB2YWx1ZTsKKyAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAqc2VjdGlvbjsKKyAgYm9vbGVhbiB2YWxpZF9wOworfSBldHJlZV92YWx1ZV90eXBlOworCisKKwordHlwZWRlZiBzdHJ1Y3QgCit7CisgIGludCBub2RlX2NvZGU7CisgIGVudW0geyBldHJlZV9iaW5hcnksCisJICAgZXRyZWVfdHJpbmFyeSwKKwkgICBldHJlZV91bmFyeSwKKwkgICBldHJlZV9uYW1lLAorCSAgIGV0cmVlX2Fzc2lnbiwKKwkgICBldHJlZV9wcm92aWRlLAorCSAgIGV0cmVlX3VuZGVmLAorCSAgIGV0cmVlX3Vuc3BlYywKKwkgICBldHJlZV92YWx1ZSwKKwkgICBldHJlZV9hc3NlcnQsCisJICAgZXRyZWVfcmVsIH0gbm9kZV9jbGFzczsKK30gbm9kZV90eXBlOworCisKKwordHlwZWRlZiB1bmlvbiBldHJlZV91bmlvbiAKK3sKKyAgbm9kZV90eXBlIHR5cGU7CisgIHN0cnVjdCB7CisgICAgbm9kZV90eXBlIHR5cGU7CisgICAgdW5pb24gZXRyZWVfdW5pb24gKmxoczsKKyAgICB1bmlvbiBldHJlZV91bmlvbiAqcmhzOworICB9IGJpbmFyeTsKKyAgc3RydWN0IHsKKyAgICBub2RlX3R5cGUgdHlwZTsKKyAgICB1bmlvbiBldHJlZV91bmlvbiAqY29uZDsKKyAgICB1bmlvbiBldHJlZV91bmlvbiAqbGhzOworICAgIHVuaW9uIGV0cmVlX3VuaW9uICpyaHM7CisgIH0gdHJpbmFyeTsKKyAgc3RydWN0IHsKKyAgICBub2RlX3R5cGUgdHlwZTsKKyAgICBDT05TVCBjaGFyICpkc3Q7CisgICAgdW5pb24gZXRyZWVfdW5pb24gKnNyYzsKKyAgfSBhc3NpZ247CisKKyAgc3RydWN0IHsKKyAgICBub2RlX3R5cGUgdHlwZTsKKyAgICB1bmlvbiAgIGV0cmVlX3VuaW9uICpjaGlsZDsKKyAgfSB1bmFyeTsKKyAgc3RydWN0IHsKKyAgICBub2RlX3R5cGUgdHlwZTsKKyAgIENPTlNUIGNoYXIgKm5hbWU7CisgIH0gbmFtZTsKKyAgc3RydWN0IHsKKyAgICBub2RlX3R5cGUgdHlwZTsKKyAgICBiZmRfdm1hIHZhbHVlOworICB9IHZhbHVlOworICBzdHJ1Y3QgeworICAgIG5vZGVfdHlwZSB0eXBlOworICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgIGJmZF92bWEgdmFsdWU7CisgIH0gcmVsOworICBzdHJ1Y3QgeworICAgIG5vZGVfdHlwZSB0eXBlOworICAgIHVuaW9uIGV0cmVlX3VuaW9uICpjaGlsZDsKKyAgICBjb25zdCBjaGFyICptZXNzYWdlOworICB9IGFzc2VydF9zOworfSBldHJlZV90eXBlOworCisKK2V0cmVlX3R5cGUgKmV4cF9pbnRvcCBQQVJBTVMgKChiZmRfdm1hKSk7CitldHJlZV90eXBlICpleHBfcmVsb3AgUEFSQU1TICgoYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOworZXRyZWVfdmFsdWVfdHlwZSBpbnZhbGlkIFBBUkFNUyAoKHZvaWQpKTsKK2V0cmVlX3ZhbHVlX3R5cGUgZXhwX2ZvbGRfdHJlZSBQQVJBTVMgKChldHJlZV90eXBlICosIHN0cnVjdAorCQkJCQlsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgKiwKKwkJCQkJbGFuZ19waGFzZV90eXBlLAorCQkJCQliZmRfdm1hLCBiZmRfdm1hICopKTsKK2V0cmVlX3R5cGUgKmV4cF9iaW5vcCBQQVJBTVMgKChpbnQsIGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqKSk7CitldHJlZV90eXBlICpleHBfdHJpbm9wIFBBUkFNUyAoKGludCxldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqKSk7CitldHJlZV90eXBlICpleHBfdW5vcCBQQVJBTVMgKChpbnQsIGV0cmVlX3R5cGUgKikpOworZXRyZWVfdHlwZSAqZXhwX25hbWVvcCBQQVJBTVMgKChpbnQsIENPTlNUIGNoYXIgKikpOworZXRyZWVfdHlwZSAqZXhwX2Fzc29wIFBBUkFNUyAoKGludCwgQ09OU1QgY2hhciAqLCBldHJlZV90eXBlICopKTsKK2V0cmVlX3R5cGUgKmV4cF9wcm92aWRlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZXRyZWVfdHlwZSAqKSk7CitldHJlZV90eXBlICpleHBfYXNzZXJ0IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Cit2b2lkIGV4cF9wcmludF90cmVlIFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOworYmZkX3ZtYSBleHBfZ2V0X3ZtYSBQQVJBTVMgKChldHJlZV90eXBlICosIGJmZF92bWEsIGNoYXIgKiwgbGFuZ19waGFzZV90eXBlKSk7CitpbnQgZXhwX2dldF92YWx1ZV9pbnQgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBpbnQsIGNoYXIgKixsYW5nX3BoYXNlX3R5cGUpKTsKK2JmZF92bWEgZXhwX2dldF9hYnNfaW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgaW50LCBjaGFyICosbGFuZ19waGFzZV90eXBlKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRmaWxlLmMgYi9sZC9sZGZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGZhMzFmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRmaWxlLmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorIGxkZmlsZS5jCisKKyBsb29rIGFmdGVyIGFsbCB0aGUgZmlsZSBzdHVmZgorCisgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGRsYW5nLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisjaW5jbHVkZSAibGRsZXguaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKK2NvbnN0IGNoYXIgKmxkZmlsZV9pbnB1dF9maWxlbmFtZTsKK2Jvb2xlYW4gbGRmaWxlX2Fzc3VtZWRfc2NyaXB0ID0gZmFsc2U7Citjb25zdCBjaGFyICpsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9ICIiOwordW5zaWduZWQgbG9uZyBsZGZpbGVfb3V0cHV0X21hY2hpbmU7CitlbnVtIGJmZF9hcmNoaXRlY3R1cmUgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmU7CitzZWFyY2hfZGlyc190eXBlICpzZWFyY2hfaGVhZDsKKworI2lmbmRlZiBNUFcKKyNpZmRlZiBWTVMKK2NoYXIgKnNsYXNoID0gIiI7CisjZWxzZQorI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX0NZR1dJTjMyX18pCitjaGFyICpzbGFzaCA9ICJcXCI7CisjZWxzZQorY2hhciAqc2xhc2ggPSAiLyI7CisjZW5kaWYKKyNlbmRpZgorI2Vsc2UgLyogTVBXICovCisvKiBUaGUgTVBXIHBhdGggY2hhciBpcyBhIGNvbG9uLiAqLworY2hhciAqc2xhc2ggPSAiOiI7CisjZW5kaWYgLyogTVBXICovCisKKy8qIExPQ0FMICovCisKK3N0YXRpYyBzZWFyY2hfZGlyc190eXBlICoqc2VhcmNoX3RhaWxfcHRyID0gJnNlYXJjaF9oZWFkOworCit0eXBlZGVmIHN0cnVjdCBzZWFyY2hfYXJjaCAKK3sKKyAgY2hhciAqbmFtZTsgCisgIHN0cnVjdCBzZWFyY2hfYXJjaCAqbmV4dDsKK30gc2VhcmNoX2FyY2hfdHlwZTsKKworc3RhdGljIHNlYXJjaF9hcmNoX3R5cGUgKnNlYXJjaF9hcmNoX2hlYWQ7CitzdGF0aWMgc2VhcmNoX2FyY2hfdHlwZSAqKnNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJnNlYXJjaF9hcmNoX2hlYWQ7CisgCitzdGF0aWMgYm9vbGVhbiBsZGZpbGVfb3Blbl9maWxlX3NlYXJjaAorICBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCisJICAgY29uc3QgY2hhciAqbGliLCBjb25zdCBjaGFyICpzdWZmaXgpKTsKK3N0YXRpYyBGSUxFICp0cnlfb3BlbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpleHRlbikpOworCit2b2lkCitsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAobmFtZSwgY21kbGluZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYm9vbGVhbiBjbWRsaW5lOworeworICBzZWFyY2hfZGlyc190eXBlICpuZXc7CisKKyAgbmV3ID0gKHNlYXJjaF9kaXJzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzZWFyY2hfZGlyc190eXBlKSk7CisgIG5ldy0+bmV4dCA9IE5VTEw7CisgIG5ldy0+bmFtZSA9IG5hbWU7CisgIG5ldy0+Y21kbGluZSA9IGNtZGxpbmU7CisgICpzZWFyY2hfdGFpbF9wdHIgPSBuZXc7CisgIHNlYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7Cit9CisKKy8qIFRyeSB0byBvcGVuIGEgQkZEIGZvciBhIGxhbmdfaW5wdXRfc3RhdGVtZW50LiAgKi8KKworYm9vbGVhbgorbGRmaWxlX3RyeV9vcGVuX2JmZCAoYXR0ZW1wdCwgZW50cnkpCisgICAgIGNvbnN0IGNoYXIgKmF0dGVtcHQ7CisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OworeworICBlbnRyeS0+dGhlX2JmZCA9IGJmZF9vcGVuciAoYXR0ZW1wdCwgZW50cnktPnRhcmdldCk7CisKKyAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCisgICAgeworICAgICAgaWYgKGVudHJ5LT50aGVfYmZkID09IE5VTEwpCisJaW5mb19tc2cgKF8oImF0dGVtcHQgdG8gb3BlbiAlcyBmYWlsZWRcbiIpLCBhdHRlbXB0KTsKKyAgICAgIGVsc2UKKwlpbmZvX21zZyAoXygiYXR0ZW1wdCB0byBvcGVuICVzIHN1Y2NlZWRlZFxuIiksIGF0dGVtcHQpOworICAgIH0KKworICBpZiAoZW50cnktPnRoZV9iZmQgIT0gTlVMTCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCkKKwllaW5mbyAoXygiJUYlUDogaW52YWxpZCBCRkQgdGFyZ2V0IGAlcydcbiIpLCBlbnRyeS0+dGFyZ2V0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFNlYXJjaCBmb3IgYW5kIG9wZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IEVOVFJZLiAgSWYgaXQgaXMgYW4KKyAgIGFyY2hpdmUsIHVzZSBBUkNILCBMSUIgYW5kIFNVRkZJWCB0byBtb2RpZnkgdGhlIGZpbGUgbmFtZS4gICovCisKK3N0YXRpYyBib29sZWFuCitsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCAoYXJjaCwgZW50cnksIGxpYiwgc3VmZml4KQorICAgICBjb25zdCBjaGFyICphcmNoOworICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKKyAgICAgY29uc3QgY2hhciAqbGliOworICAgICBjb25zdCBjaGFyICpzdWZmaXg7Cit7CisgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKKworICAvKiBJZiB0aGlzIGlzIG5vdCBhbiBhcmNoaXZlLCB0cnkgdG8gb3BlbiBpdCBpbiB0aGUgY3VycmVudAorICAgICBkaXJlY3RvcnkgZmlyc3QuICAqLworICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKKyAgICB7CisgICAgICBpZiAobGRmaWxlX3RyeV9vcGVuX2JmZCAoZW50cnktPmZpbGVuYW1lLCBlbnRyeSkpCisJcmV0dXJuIHRydWU7CisgICAgfQorCisgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7CisgICAgICAgc2VhcmNoICE9IChzZWFyY2hfZGlyc190eXBlICopTlVMTDsKKyAgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQpIAorICAgIHsKKyAgICAgIGNoYXIgKnN0cmluZzsKKworICAgICAgaWYgKGVudHJ5LT5keW5hbWljICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKKwl7CisJICBpZiAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KSkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorCisgICAgICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKKwkJCQkgKyBzdHJsZW4gKHNsYXNoKQorCQkJCSArIHN0cmxlbiAobGliKQorCQkJCSArIHN0cmxlbiAoZW50cnktPmZpbGVuYW1lKQorCQkJCSArIHN0cmxlbiAoYXJjaCkKKwkJCQkgKyBzdHJsZW4gKHN1ZmZpeCkKKwkJCQkgKyAxKTsKKworICAgICAgaWYgKGVudHJ5LT5pc19hcmNoaXZlKQorCXNwcmludGYgKHN0cmluZywgIiVzJXMlcyVzJXMlcyIsIHNlYXJjaC0+bmFtZSwgc2xhc2gsCisJCSBsaWIsIGVudHJ5LT5maWxlbmFtZSwgYXJjaCwgc3VmZml4KTsKKyAgICAgIGVsc2UgaWYgKGVudHJ5LT5maWxlbmFtZVswXSA9PSAnLycgfHwgZW50cnktPmZpbGVuYW1lWzBdID09ICcuJworI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX1dJTjMyKQorCSAgICAgICB8fCBlbnRyeS0+ZmlsZW5hbWVbMF0gPT0gJ1xcJyAKKwkgICAgICAgfHwgKGlzYWxwaGEgKGVudHJ5LT5maWxlbmFtZVswXSkgCisJICAgICAgICAgICAmJiBlbnRyeS0+ZmlsZW5hbWVbMV0gPT0gJzonKQorI2VuZGlmCisJICApCisJc3RyY3B5IChzdHJpbmcsIGVudHJ5LT5maWxlbmFtZSk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoc3RyaW5nLCAiJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwgZW50cnktPmZpbGVuYW1lKTsKKworICAgICAgaWYgKGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQorCXsKKwkgIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgZnJlZSAoc3RyaW5nKTsKKyAgICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBPcGVuIHRoZSBpbnB1dCBmaWxlIHNwZWNpZmllZCBieSBFTlRSWS4gICovCisKK3ZvaWQKK2xkZmlsZV9vcGVuX2ZpbGUgKGVudHJ5KQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKK3sKKyAgaWYgKGVudHJ5LT50aGVfYmZkICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmICghIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKQorICAgIHsKKyAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5KSkKKwlyZXR1cm47CisgICAgICBpZiAoc3RyY21wIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSkgIT0gMCkKKwllaW5mbyAoXygiJUYlUDogY2Fubm90IG9wZW4gJXMgZm9yICVzOiAlRVxuIiksCisJICAgICAgIGVudHJ5LT5maWxlbmFtZSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKTsKKyAgICAgIGVsc2UKKwllaW5mbyhfKCIlRiVQOiBjYW5ub3Qgb3BlbiAlczogJUVcbiIpLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNlYXJjaF9hcmNoX3R5cGUgKmFyY2g7CisKKyAgICAgIC8qIFRyeSB0byBvcGVuIDxmaWxlbmFtZT48c3VmZml4PiBvciBsaWI8ZmlsZW5hbWU+PHN1ZmZpeD4uYSAqLworICAgICAgZm9yIChhcmNoID0gc2VhcmNoX2FyY2hfaGVhZDsKKwkgICBhcmNoICE9IChzZWFyY2hfYXJjaF90eXBlICopIE5VTEw7CisJICAgYXJjaCA9IGFyY2gtPm5leHQpCisJeworCSAgaWYgKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLT5uYW1lLCBlbnRyeSwgImxpYiIsICIuYSIpKQorCSAgICByZXR1cm47CisjaWZkZWYgVk1TCisJICBpZiAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2ggKGFyY2gtPm5hbWUsIGVudHJ5LCAiOmxpYiIsICIuYSIpKQorCSAgICByZXR1cm47CisjZW5kaWYKKwl9CisgICAgICBlaW5mbyAoXygiJUYlUDogY2Fubm90IGZpbmQgJXNcbiIpLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOworICAgIH0KK30KKworLyogVHJ5IHRvIG9wZW4gTkFNRTsgaWYgdGhhdCBmYWlscywgdHJ5IE5BTUUgd2l0aCBFWFRFTiBhcHBlbmRlZCB0byBpdC4gICovCisKK3N0YXRpYyBGSUxFICoKK3RyeV9vcGVuIChuYW1lLCBleHRlbikKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgY2hhciAqZXh0ZW47Cit7CisgIEZJTEUgKnJlc3VsdDsKKyAgY2hhciBidWZmWzEwMDBdOworCisgIHJlc3VsdCA9IGZvcGVuIChuYW1lLCAiciIpOworICBpZiAodHJhY2VfZmlsZV90cmllcykKKyAgICB7CisgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisJaW5mb19tc2cgKF8oImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iKSwgbmFtZSk7CisgICAgICBlbHNlCisJaW5mb19tc2cgKF8oIm9wZW5lZCBzY3JpcHQgZmlsZSAlc1xuIiksIG5hbWUpOworICAgIH0KKworICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJlc3VsdDsKKworICBpZiAoKmV4dGVuKQorICAgIHsKKyAgICAgIHNwcmludGYgKGJ1ZmYsICIlcyVzIiwgbmFtZSwgZXh0ZW4pOworICAgICAgcmVzdWx0ID0gZm9wZW4gKGJ1ZmYsICJyIik7CisgICAgICBpZiAodHJhY2VfZmlsZV90cmllcykKKwl7CisJICBpZiAocmVzdWx0ID09IE5VTEwpCisJICAgIGluZm9fbXNnIChfKCJjYW5ub3QgZmluZCBzY3JpcHQgZmlsZSAlc1xuIiksIGJ1ZmYpOworCSAgZWxzZQorCSAgICBpbmZvX21zZyAoXygib3BlbmVkIHNjcmlwdCBmaWxlICVzXG4iKSwgYnVmZik7CisJfQorICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBUcnkgdG8gb3BlbiBOQU1FOyBpZiB0aGF0IGZhaWxzLCBsb29rIGZvciBpdCBpbiBhbnkgZGlyZWN0b3JpZXMKKyAgIHNwZWNpZmllZCB3aXRoIC1MLCB3aXRob3V0IGFuZCB3aXRoIEVYVEVORCBhcHBwZW5kZWQuICAqLworCitGSUxFICoKK2xkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSAobmFtZSwgZXh0ZW5kKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICpleHRlbmQ7Cit7CisgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKKyAgRklMRSAqcmVzdWx0OworICBjaGFyIGJ1ZmZlclsxMDAwXTsKKworICAvKiBGaXJzdCB0cnkgcmF3IG5hbWUgKi8KKyAgcmVzdWx0ID0gdHJ5X29wZW4obmFtZSwiIik7CisgIGlmIChyZXN1bHQgPT0gKEZJTEUgKilOVUxMKSB7CisgICAgLyogVHJ5IG5vdyBwcmVmaXhlcyAqLworICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7CisJIHNlYXJjaCAhPSAoc2VhcmNoX2RpcnNfdHlwZSAqKU5VTEw7CisJIHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkgeworICAgICAgc3ByaW50ZihidWZmZXIsIiVzJXMlcyIsIHNlYXJjaC0+bmFtZSwgc2xhc2gsIG5hbWUpOworICAgICAgcmVzdWx0ID0gdHJ5X29wZW4oYnVmZmVyLCBleHRlbmQpOworICAgICAgaWYgKHJlc3VsdClicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBGSUxFICpsZGxleF9pbnB1dF9zdGFjazsKKyAgbGRsZXhfaW5wdXRfc3RhY2sgPSBsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUobmFtZSwgIiIpOworCisgIGlmIChsZGxleF9pbnB1dF9zdGFjayA9PSAoRklMRSAqKU5VTEwpIHsKKyAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworICAgIGVpbmZvKF8oIiVQJUY6IGNhbm5vdCBvcGVuIGxpbmtlciBzY3JpcHQgZmlsZSAlczogJUVcbiIpLG5hbWUpOworICB9CisgIGxleF9wdXNoX2ZpbGUobGRsZXhfaW5wdXRfc3RhY2ssIG5hbWUpOworICAKKyAgbGRmaWxlX2lucHV0X2ZpbGVuYW1lID0gbmFtZTsKKyAgbGluZW5vID0gMTsKKyAgaGFkX3NjcmlwdCA9IHRydWU7Cit9CisKKworCisKKworI2lmZGVmIEdOVTk2MAorc3RhdGljCitjaGFyICoKK2dudTk2MF9tYXBfYXJjaG5hbWUoIG5hbWUgKQorY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IHRhYmVudHJ5IHsgY2hhciAqY21kX3N3aXRjaDsgY2hhciAqYXJjaDsgfTsKKyAgc3RhdGljIHN0cnVjdCB0YWJlbnRyeSBhcmNoX3RhYltdID0geworCSIiLCAgICIiLAorCSJLQSIsICJrYSIsCisJIktCIiwgImtiIiwKKwkiS0MiLCAibWMiLAkvKiBTeW5vbnltIGZvciBNQyAqLworCSJNQyIsICJtYyIsCisJIkNBIiwgImNhIiwKKwkiU0EiLCAia2EiLAkvKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBLQSAqLworCSJTQiIsICJrYiIsCS8qIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEtCICovCisJTlVMTCwgIiIKKyAgfTsKKyAgc3RydWN0IHRhYmVudHJ5ICp0cDsKKyAgCisKKyAgZm9yICggdHAgPSBhcmNoX3RhYjsgdHAtPmNtZF9zd2l0Y2ggIT0gTlVMTDsgdHArKyApeworICAgIGlmICggIXN0cmNtcChuYW1lLHRwLT5jbWRfc3dpdGNoKSApeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCB0cC0+Y21kX3N3aXRjaCA9PSBOVUxMICl7CisgICAgZWluZm8oXygiJVAlRjogdW5rbm93biBhcmNoaXRlY3R1cmU6ICVzXG4iKSxuYW1lKTsKKyAgfQorICByZXR1cm4gdHAtPmFyY2g7Cit9CisKKworCit2b2lkCitsZGZpbGVfYWRkX2FyY2gobmFtZSkKK2NoYXIgKm5hbWU7Cit7CisgIHNlYXJjaF9hcmNoX3R5cGUgKm5ldyA9CisgICAgKHNlYXJjaF9hcmNoX3R5cGUgKil4bWFsbG9jKChiZmRfc2l6ZV90eXBlKShzaXplb2Yoc2VhcmNoX2FyY2hfdHlwZSkpKTsKKworCisgIGlmICgqbmFtZSAhPSAnXDAnKSB7CisgICAgaWYgKGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lWzBdICE9ICdcMCcpIHsKKyAgICAgIGVpbmZvKF8oIiVQJUY6IHRhcmdldCBhcmNoaXRlY3R1cmUgcmVzcGVjaWZpZWRcbiIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgPSBuYW1lOworICB9CisKKyAgbmV3LT5uZXh0ID0gKHNlYXJjaF9hcmNoX3R5cGUqKU5VTEw7CisgIG5ldy0+bmFtZSA9IGdudTk2MF9tYXBfYXJjaG5hbWUoIG5hbWUgKTsKKyAgKnNlYXJjaF9hcmNoX3RhaWxfcHRyID0gbmV3OworICBzZWFyY2hfYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7CisKK30KKworI2Vsc2UJLyogbm90IEdOVTk2MCAqLworCisKK3ZvaWQKK2xkZmlsZV9hZGRfYXJjaCAoaW5fbmFtZSkKKyAgICAgQ09OU1QgY2hhciAqIGluX25hbWU7Cit7CisgIGNoYXIgKm5hbWUgPSBidXlzdHJpbmcoaW5fbmFtZSk7CisgIHNlYXJjaF9hcmNoX3R5cGUgKm5ldyA9CisgICAgKHNlYXJjaF9hcmNoX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzZWFyY2hfYXJjaF90eXBlKSk7CisKKyAgbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgPSBpbl9uYW1lOworCisgIG5ldy0+bmFtZSA9IG5hbWU7CisgIG5ldy0+bmV4dCA9IChzZWFyY2hfYXJjaF90eXBlKilOVUxMOworICB3aGlsZSAoKm5hbWUpCisgICAgeworICAgICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSkpCisJKm5hbWUgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKm5hbWUpOworICAgICAgbmFtZSsrOworICAgIH0KKyAgKnNlYXJjaF9hcmNoX3RhaWxfcHRyID0gbmV3OworICBzZWFyY2hfYXJjaF90YWlsX3B0ciA9ICZuZXctPm5leHQ7CisKK30KKyNlbmRpZgorCisvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgKi8KK3ZvaWQKK2xkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKHN0cmluZykKKyAgICAgQ09OU1QgY2hhciAqc3RyaW5nOworeworICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoKHN0cmluZyk7CisKKyAgaWYgKGFyY2gpIHsKKyAgICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGFyY2gtPmFyY2g7CisgICAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYXJjaC0+bWFjaDsKKyAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IGFyY2gtPnByaW50YWJsZV9uYW1lOworICB9CisgIGVsc2UgeworICAgIGVpbmZvKF8oIiVQJUY6IGNhbm5vdCByZXByZXNlbnQgbWFjaGluZSBgJXMnXG4iKSwgc3RyaW5nKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGQvbGRmaWxlLmggYi9sZC9sZGZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNjOWNlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRmaWxlLmgKQEAgLTAsMCArMSw1MyBAQAorLyogbGRmaWxlLmggLQorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKKyAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKmxkZmlsZV9pbnB1dF9maWxlbmFtZTsKK2V4dGVybiBib29sZWFuIGxkZmlsZV9hc3N1bWVkX3NjcmlwdDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKK2V4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmU7CitleHRlcm4gY29uc3QgY2hhciAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWU7CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvcgorICAgbGlicmFyaWVzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2RpcnMgCit7CisgIC8qIE5leHQgZGlyZWN0b3J5IG9uIGxpc3QuICAqLworICBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKm5leHQ7CisgIC8qIE5hbWUgb2YgZGlyZWN0b3J5LiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogdHJ1ZSBpZiB0aGlzIGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCisgIGJvb2xlYW4gY21kbGluZTsKK30gc2VhcmNoX2RpcnNfdHlwZTsKKworZXh0ZXJuIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOworCisjaWYgQU5TSV9QUk9UT1RZUEVTCitzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0OworI2VuZGlmCisKK2V4dGVybiB2b2lkIGxkZmlsZV9hZGRfYXJjaCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKK2V4dGVybiB2b2lkIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjbWRsaW5lKSk7CitleHRlcm4gdm9pZCBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOworZXh0ZXJuIHZvaWQgbGRmaWxlX29wZW5fZmlsZSBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKK2V4dGVybiBib29sZWFuIGxkZmlsZV90cnlfb3Blbl9iZmQKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKK2V4dGVybiBGSUxFICpsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXh0ZW5kKSk7CitleHRlcm4gdm9pZCBsZGZpbGVfc2V0X291dHB1dF9hcmNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvbGQvbGRncmFtLnkgYi9sZC9sZGdyYW0ueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYzZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRncmFtLnkKQEAgLTAsMCArMSwxMDk0IEBACisvKiBBIFlBQ0MgZ3JhbW1lciB0byBwYXJzZSBhIHN1cGVyc2V0IG9mIHRoZSBBVCZUIGxpbmtlciBzY3JpcHRpbmcgbGFuZ3VhdWUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc3RldmVAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsZC4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworJXsKKy8qCisKKyAqLworCisjZGVmaW5lIERPTlRERUNMQVJFX01BTExPQworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxkLmgiICAgIAorI2luY2x1ZGUgImxkZXhwLmgiCisjaW5jbHVkZSAibGR2ZXIuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJtcmkuaCIKKyNpbmNsdWRlICJsZGN0b3IuaCIKKyNpbmNsdWRlICJsZGxleC5oIgorCisjaWZuZGVmIFlZREVCVUcKKyNkZWZpbmUgWVlERUJVRyAxCisjZW5kaWYKKworc3RhdGljIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7CisKK2xhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpyZWdpb247CisKK3N0cnVjdCB3aWxkY2FyZF9zcGVjIGN1cnJlbnRfZmlsZTsKK2Jvb2xlYW4gbGRncmFtX3dhbnRfZmlsZW5hbWUgPSB0cnVlOworYm9vbGVhbiBoYWRfc2NyaXB0ID0gZmFsc2U7Citib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOworCitib29sZWFuIGxkZ3JhbV9pbl9zY3JpcHQgPSBmYWxzZTsKK2Jvb2xlYW4gbGRncmFtX2hhZF9lcXVhbHMgPSBmYWxzZTsKK2Jvb2xlYW4gbGRncmFtX2hhZF9rZWVwID0gZmFsc2U7CitjaGFyICpsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSBOVUxMOworCisjZGVmaW5lIEVSUk9SX05BTUVfTUFYIDIwCitzdGF0aWMgY2hhciAqZXJyb3JfbmFtZXNbRVJST1JfTkFNRV9NQVhdOworc3RhdGljIGludCBlcnJvcl9pbmRleDsKKyNkZWZpbmUgUFVTSF9FUlJPUih4KSBpZiAoZXJyb3JfaW5kZXggPCBFUlJPUl9OQU1FX01BWCkgZXJyb3JfbmFtZXNbZXJyb3JfaW5kZXhdID0geDsgZXJyb3JfaW5kZXgrKzsKKyNkZWZpbmUgUE9QX0VSUk9SKCkgICBlcnJvcl9pbmRleC0tOworJX0KKyV1bmlvbiB7CisgIGJmZF92bWEgaW50ZWdlcjsKKyAgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqY25hbWU7CisgIHN0cnVjdCB3aWxkY2FyZF9zcGVjIHdpbGRjYXJkOworICBpbnQgdG9rZW47CisgIHVuaW9uIGV0cmVlX3VuaW9uICpldHJlZTsKKyAgc3RydWN0IHBoZHJfaW5mbworICAgIHsKKyAgICAgIGJvb2xlYW4gZmlsZWhkcjsKKyAgICAgIGJvb2xlYW4gcGhkcnM7CisgICAgICB1bmlvbiBldHJlZV91bmlvbiAqYXQ7CisgICAgICB1bmlvbiBldHJlZV91bmlvbiAqZmxhZ3M7CisgICAgfSBwaGRyOworICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpub2Nyb3NzcmVmOworICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnNlY3Rpb25fcGhkcjsKKyAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZWZsaXN0OworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKnZlcnN5bXM7CisgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc25vZGU7Cit9CisKKyV0eXBlIDxldHJlZT4gZXhwIG9wdF9leHBfd2l0aF90eXBlIG11c3RiZV9leHAgb3B0X2F0IHBoZHJfdHlwZSBwaGRyX3ZhbAorJXR5cGUgPGV0cmVlPiBvcHRfZXhwX3dpdGhvdXRfdHlwZQorJXR5cGUgPGludGVnZXI+IGZpbGxfb3B0CisldHlwZSA8bmFtZT4gbWVtc3BlY19vcHQgY2FzZXN5bWxpc3QKKyV0eXBlIDxjbmFtZT4gd2lsZGNhcmRfbmFtZQorJXR5cGUgPHdpbGRjYXJkPiB3aWxkY2FyZF9zcGVjCisldG9rZW4gPGludGVnZXI+IElOVCAgCisldG9rZW4gPG5hbWU+IE5BTUUgTE5BTUUKKyV0eXBlIDxpbnRlZ2VyPiBsZW5ndGgKKyV0eXBlIDxwaGRyPiBwaGRyX3F1YWxpZmllcnMKKyV0eXBlIDxub2Nyb3NzcmVmPiBub2Nyb3NzcmVmX2xpc3QKKyV0eXBlIDxzZWN0aW9uX3BoZHI+IHBoZHJfb3B0CisldHlwZSA8aW50ZWdlcj4gb3B0X25vY3Jvc3NyZWZzCisKKyVyaWdodCA8dG9rZW4+IFBMVVNFUSBNSU5VU0VRIE1VTFRFUSBESVZFUSAgJz0nIExTSElGVEVRIFJTSElGVEVRICAgQU5ERVEgT1JFUSAKKyVyaWdodCA8dG9rZW4+ICc/JyAnOicKKyVsZWZ0IDx0b2tlbj4gT1JPUgorJWxlZnQgPHRva2VuPiAgQU5EQU5ECislbGVmdCA8dG9rZW4+ICd8JworJWxlZnQgPHRva2VuPiAgJ14nCislbGVmdCAgPHRva2VuPiAnJicKKyVsZWZ0IDx0b2tlbj4gIEVRIE5FCislbGVmdCAgPHRva2VuPiAnPCcgJz4nIExFIEdFCislbGVmdCAgPHRva2VuPiBMU0hJRlQgUlNISUZUCisKKyVsZWZ0ICA8dG9rZW4+ICcrJyAnLScKKyVsZWZ0ICA8dG9rZW4+ICcqJyAnLycgJyUnCisKKyVyaWdodCBVTkFSWQorJXRva2VuIEVORCAKKyVsZWZ0IDx0b2tlbj4gJygnCisldG9rZW4gPHRva2VuPiBBTElHTl9LIEJMT0NLIEJJTkQgUVVBRCBTUVVBRCBMT05HIFNIT1JUIEJZVEUKKyV0b2tlbiBTRUNUSU9OUyBQSERSUyBTT1JUCisldG9rZW4gJ3snICd9JworJXRva2VuIFNJWkVPRl9IRUFERVJTIE9VVFBVVF9GT1JNQVQgRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04gT1VUUFVUX0FSQ0gKKyV0b2tlbiBTSVpFT0ZfSEVBREVSUworJXRva2VuIElOQ0xVREUKKyV0b2tlbiBNRU1PUlkgREVGU1lNRU5ECisldG9rZW4gTk9MT0FEIERTRUNUIENPUFkgSU5GTyBPVkVSTEFZCisldG9rZW4gTkFNRSBMTkFNRSBERUZJTkVEIFRBUkdFVF9LIFNFQVJDSF9ESVIgTUFQIEVOVFJZCisldG9rZW4gPGludGVnZXI+IE5FWFQKKyV0b2tlbiBTSVpFT0YgQUREUiBMT0FEQUREUiBNQVhfSyBNSU5fSworJXRva2VuIFNUQVJUVVAgSExMIFNZU0xJQiBGTE9BVCBOT0ZMT0FUIE5PQ1JPU1NSRUZTCisldG9rZW4gT1JJR0lOIEZJTEwKKyV0b2tlbiBMRU5HVEggQ1JFQVRFX09CSkVDVF9TWU1CT0xTIElOUFVUIEdST1VQIE9VVFBVVCBDT05TVFJVQ1RPUlMKKyV0b2tlbiBBTElHTk1PRCBBVCBQUk9WSURFCisldHlwZSA8dG9rZW4+IGFzc2lnbl9vcCBhdHlwZQorJXR5cGUgPG5hbWU+ICBmaWxlbmFtZQorJXRva2VuIENISVAgTElTVCBTRUNUIEFCU09MVVRFICBMT0FEIE5FV0xJTkUgRU5EV09SRCBPUkRFUiBOQU1FV09SRCBBU1NFUlRfSworJXRva2VuIEZPUk1BVCBQVUJMSUMgREVGU1lNRU5EIEJBU0UgQUxJQVMgVFJVTkNBVEUgUkVMCisldG9rZW4gSU5QVVRfU0NSSVBUIElOUFVUX01SSV9TQ1JJUFQgSU5QVVRfREVGU1lNIENBU0UgRVhURVJOIFNUQVJUCisldG9rZW4gPG5hbWU+IFZFUlNfVEFHIFZFUlNfSURFTlRJRklFUgorJXRva2VuIEdMT0JBTCBMT0NBTCBWRVJTSU9OSyBJTlBVVF9WRVJTSU9OX1NDUklQVAorJXRva2VuIEtFRVAKKyV0b2tlbiBFWENMVURFX0ZJTEUKKyV0eXBlIDx2ZXJzeW1zPiB2ZXJzX2RlZm5zCisldHlwZSA8dmVyc25vZGU+IHZlcnNfdGFnCisldHlwZSA8ZGVmbGlzdD4gdmVyZGVwCisKKyUlCisKK2ZpbGU6CQorCQlJTlBVVF9TQ1JJUFQgc2NyaXB0X2ZpbGUKKwl8CUlOUFVUX01SSV9TQ1JJUFQgbXJpX3NjcmlwdF9maWxlCisJfAlJTlBVVF9WRVJTSU9OX1NDUklQVCB2ZXJzaW9uX3NjcmlwdF9maWxlCisJfAlJTlBVVF9ERUZTWU0gZGVmc3ltX2V4cHIKKwk7CisKKworZmlsZW5hbWU6ICBOQU1FOworCisKK2RlZnN5bV9leHByOgorCQl7IGxkbGV4X2RlZnN5bSgpOyB9CisJCU5BTUUgJz0nIGV4cAorCQl7CisJCSAgbGRsZXhfcG9wc3RhdGUoKTsKKwkJICBsYW5nX2FkZF9hc3NpZ25tZW50KGV4cF9hc3NvcCgkMywkMiwkNCkpOworCQl9CisKKy8qIFNZTlRBWCBXSVRISU4gQU4gTVJJIFNDUklQVCBGSUxFICovICAKK21yaV9zY3JpcHRfZmlsZToKKwkJeworCQkgIGxkbGV4X21yaV9zY3JpcHQgKCk7CisJCSAgUFVTSF9FUlJPUiAoXygiTVJJIHN0eWxlIHNjcmlwdCIpKTsKKwkJfQorCSAgICAgbXJpX3NjcmlwdF9saW5lcworCQl7CisJCSAgbGRsZXhfcG9wc3RhdGUgKCk7CisJCSAgbXJpX2RyYXdfdHJlZSAoKTsKKwkJICBQT1BfRVJST1IgKCk7CisJCX0KKwk7CisKK21yaV9zY3JpcHRfbGluZXM6CisJCW1yaV9zY3JpcHRfbGluZXMgbXJpX3NjcmlwdF9jb21tYW5kIE5FV0xJTkUKKyAgICAgICAgICB8CisJOworCittcmlfc2NyaXB0X2NvbW1hbmQ6CisJCUNISVAgIGV4cCAKKwl8CUNISVAgIGV4cCAnLCcgZXhwCisJfAlOQU1FIAl7CisJCQllaW5mbyhfKCIlUCVGOiB1bnJlY29nbmlzZWQga2V5d29yZCBpbiBNUkkgc3R5bGUgc2NyaXB0ICclcydcbiIpLCQxKTsKKwkJCX0KKwl8CUxJU1QgIAl7CisJCQljb25maWcubWFwX2ZpbGVuYW1lID0gIi0iOworCQkJfQorICAgICAgICB8ICAgICAgIE9SREVSIG9yZGVybmFtZWxpc3QKKwl8ICAgICAgIEVORFdPUkQgCisgICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgJz0nIGV4cAorIAkJCXsgbXJpX3B1YmxpYygkMiwgJDQpOyB9CisgICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgJywnIGV4cAorIAkJCXsgbXJpX3B1YmxpYygkMiwgJDQpOyB9CisgICAgICAgIHwgICAgICAgUFVCTElDIE5BTUUgIGV4cCAKKyAJCQl7IG1yaV9wdWJsaWMoJDIsICQzKTsgfQorCXwgCUZPUk1BVCBOQU1FCisJCQl7IG1yaV9mb3JtYXQoJDIpOyB9CisJfAlTRUNUIE5BTUUgJywnIGV4cAorCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQ0KTt9CisJfAlTRUNUIE5BTUUgIGV4cAorCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQzKTt9CisJfAlTRUNUIE5BTUUgJz0nIGV4cAorCQkJeyBtcmlfb3V0cHV0X3NlY3Rpb24oJDIsICQ0KTt9CisJfAlBTElHTl9LIE5BTUUgJz0nIGV4cAorCQkJeyBtcmlfYWxpZ24oJDIsJDQpOyB9CisJfAlBTElHTl9LIE5BTUUgJywnIGV4cAorCQkJeyBtcmlfYWxpZ24oJDIsJDQpOyB9CisJfAlBTElHTk1PRCBOQU1FICc9JyBleHAKKwkJCXsgbXJpX2FsaWdubW9kKCQyLCQ0KTsgfQorCXwJQUxJR05NT0QgTkFNRSAnLCcgZXhwCisJCQl7IG1yaV9hbGlnbm1vZCgkMiwkNCk7IH0KKwl8CUFCU09MVVRFIG1yaV9hYnNfbmFtZV9saXN0CisJfAlMT0FECSBtcmlfbG9hZF9uYW1lX2xpc3QKKwl8ICAgICAgIE5BTUVXT1JEIE5BTUUgCisJCQl7IG1yaV9uYW1lKCQyKTsgfSAgIAorCXwJQUxJQVMgTkFNRSAnLCcgTkFNRQorCQkJeyBtcmlfYWxpYXMoJDIsJDQsMCk7fQorCXwJQUxJQVMgTkFNRSAnLCcgSU5UCisJCQl7IG1yaV9hbGlhcygkMiwwLChpbnQpICQ0KTt9CisJfAlCQVNFICAgICBleHAKKwkJCXsgbXJpX2Jhc2UoJDIpOyB9CisgICAgICAgIHwgICAgICAgVFJVTkNBVEUgSU5UCisJCXsgIG1yaV90cnVuY2F0ZSgodW5zaWduZWQgaW50KSAkMik7IH0KKwl8CUNBU0UgY2FzZXN5bWxpc3QKKwl8CUVYVEVSTiBleHRlcm5fbmFtZV9saXN0CisJfAlJTkNMVURFIGZpbGVuYW1lCisJCXsgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlICgkMik7IH0gbXJpX3NjcmlwdF9saW5lcyBFTkQKKwl8CVNUQVJUIE5BTUUKKwkJeyBsYW5nX2FkZF9lbnRyeSAoJDIsIGZhbHNlKTsgfQorICAgICAgICB8CisJOworCitvcmRlcm5hbWVsaXN0OgorCSAgICAgIG9yZGVybmFtZWxpc3QgJywnIE5BTUUgICAgICAgICB7IG1yaV9vcmRlcigkMyk7IH0KKwl8ICAgICBvcmRlcm5hbWVsaXN0ICBOQU1FICAgICAgICAgeyBtcmlfb3JkZXIoJDIpOyB9CisgICAgICAJfAorCTsKKworbXJpX2xvYWRfbmFtZV9saXN0OgorCQlOQU1FCisJCQl7IG1yaV9sb2FkKCQxKTsgfQorCXwJbXJpX2xvYWRfbmFtZV9saXN0ICcsJyBOQU1FIHsgbXJpX2xvYWQoJDMpOyB9CisJOworCittcmlfYWJzX25hbWVfbGlzdDoKKyAJCU5BTUUKKyAJCQl7IG1yaV9vbmx5X2xvYWQoJDEpOyB9CisJfAltcmlfYWJzX25hbWVfbGlzdCAnLCcgIE5BTUUKKyAJCQl7IG1yaV9vbmx5X2xvYWQoJDMpOyB9CisJOworCitjYXNlc3ltbGlzdDoKKwkgIC8qIGVtcHR5ICovIHsgJCQgPSBOVUxMOyB9CisJfCBOQU1FCisJfCBjYXNlc3ltbGlzdCAnLCcgTkFNRQorCTsKKworZXh0ZXJuX25hbWVfbGlzdDoKKwkgIE5BTUUKKwkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDEpOyB9CisJfCBleHRlcm5fbmFtZV9saXN0IE5BTUUKKwkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDIpOyB9CisJfCBleHRlcm5fbmFtZV9saXN0ICcsJyBOQU1FCisJCQl7IGxkbGFuZ19hZGRfdW5kZWYgKCQzKTsgfQorCTsKKworc2NyaXB0X2ZpbGU6CisJeworCSBsZGxleF9ib3RoKCk7CisJfQorICAgICAgIGlmaWxlX2xpc3QKKwl7CisJbGRsZXhfcG9wc3RhdGUoKTsKKwl9CisgICAgICAgIDsKKworCitpZmlsZV9saXN0OgorICAgICAgIGlmaWxlX2xpc3QgaWZpbGVfcDEKKyAgICAgICAgfAorCTsKKworCisKK2lmaWxlX3AxOgorCQltZW1vcnkKKwl8CXNlY3Rpb25zCisJfAlwaGRycworCXwJc3RhcnR1cAorCXwJaGlnaF9sZXZlbF9saWJyYXJ5CisJfAlsb3dfbGV2ZWxfbGlicmFyeQorCXwJZmxvYXRpbmdfcG9pbnRfc3VwcG9ydAorCXwJc3RhdGVtZW50X2FueXdoZXJlCisJfAl2ZXJzaW9uCisgICAgICAgIHwJICc7JworCXwJVEFSR0VUX0sgJygnIE5BTUUgJyknCisJCXsgbGFuZ19hZGRfdGFyZ2V0KCQzKTsgfQorCXwJU0VBUkNIX0RJUiAnKCcgZmlsZW5hbWUgJyknCisJCXsgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKCQzLCBmYWxzZSk7IH0KKwl8CU9VVFBVVCAnKCcgZmlsZW5hbWUgJyknCisJCXsgbGFuZ19hZGRfb3V0cHV0KCQzLCAxKTsgfQorICAgICAgICB8CU9VVFBVVF9GT1JNQVQgJygnIE5BTUUgJyknCisJCSAgeyBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0ICgkMywgKGNoYXIgKikgTlVMTCwKKwkJCQkJICAgIChjaGFyICopIE5VTEwsIDEpOyB9CisJfAlPVVRQVVRfRk9STUFUICcoJyBOQU1FICcsJyBOQU1FICcsJyBOQU1FICcpJworCQkgIHsgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAoJDMsICQ1LCAkNywgMSk7IH0KKyAgICAgICAgfAlPVVRQVVRfQVJDSCAnKCcgTkFNRSAnKScKKwkJICB7IGxkZmlsZV9zZXRfb3V0cHV0X2FyY2goJDMpOyB9CisJfAlGT1JDRV9DT01NT05fQUxMT0NBVElPTgorCQl7IGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IHRydWUgOyB9CisJfAlJTlBVVCAnKCcgaW5wdXRfbGlzdCAnKScKKwl8CUdST1VQCisJCSAgeyBsYW5nX2VudGVyX2dyb3VwICgpOyB9CisJCSAgICAnKCcgaW5wdXRfbGlzdCAnKScKKwkJICB7IGxhbmdfbGVhdmVfZ3JvdXAgKCk7IH0KKyAgICAgCXwJTUFQICcoJyBmaWxlbmFtZSAnKScKKwkJeyBsYW5nX2FkZF9tYXAoJDMpOyB9CisJfAlJTkNMVURFIGZpbGVuYW1lIAorCQl7IGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSgkMik7IH0gaWZpbGVfbGlzdCBFTkQKKwl8CU5PQ1JPU1NSRUZTICcoJyBub2Nyb3NzcmVmX2xpc3QgJyknCisJCXsKKwkJICBsYW5nX2FkZF9ub2Nyb3NzcmVmICgkMyk7CisJCX0KKwl8CUVYVEVSTiAnKCcgZXh0ZXJuX25hbWVfbGlzdCAnKScKKwk7CisKK2lucHV0X2xpc3Q6CisJCU5BTUUKKwkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQxLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAorCQkJCSAoY2hhciAqKU5VTEwpOyB9CisJfAlpbnB1dF9saXN0ICcsJyBOQU1FCisJCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMyxsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKKwkJCQkgKGNoYXIgKilOVUxMKTsgfQorCXwJaW5wdXRfbGlzdCBOQU1FCisJCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMixsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKKwkJCQkgKGNoYXIgKilOVUxMKTsgfQorCXwJTE5BTUUKKwkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQxLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCisJCQkJIChjaGFyICopTlVMTCk7IH0KKwl8CWlucHV0X2xpc3QgJywnIExOQU1FCisJCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMyxsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAorCQkJCSAoY2hhciAqKU5VTEwpOyB9CisJfAlpbnB1dF9saXN0IExOQU1FCisJCXsgbGFuZ19hZGRfaW5wdXRfZmlsZSgkMixsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAorCQkJCSAoY2hhciAqKU5VTEwpOyB9CisJOworCitzZWN0aW9uczoKKwkJU0VDVElPTlMgJ3snIHNlY19vcl9ncm91cF9wMSAnfScKKwk7CisKK3NlY19vcl9ncm91cF9wMToKKwkJc2VjX29yX2dyb3VwX3AxIHNlY3Rpb24KKwl8CXNlY19vcl9ncm91cF9wMSBzdGF0ZW1lbnRfYW55d2hlcmUKKwl8CisJOworCitzdGF0ZW1lbnRfYW55d2hlcmU6CisJCUVOVFJZICcoJyBOQU1FICcpJworCQl7IGxhbmdfYWRkX2VudHJ5ICgkMywgZmFsc2UpOyB9CisJfAlhc3NpZ25tZW50IGVuZAorCTsKKworLyogVGhlICcqJyBhbmQgJz8nIGNhc2VzIGFyZSB0aGVyZSBiZWNhdXNlIHRoZSBsZXhlciByZXR1cm5zIHRoZW0gYXMKKyAgIHNlcGFyYXRlIHRva2VucyByYXRoZXIgdGhhbiBhcyBOQU1FLiAgKi8KK3dpbGRjYXJkX25hbWU6CisJCU5BTUUKKwkJCXsKKwkJCSAgJCQgPSAkMTsKKwkJCX0KKwl8CScqJworCQkJeworCQkJICAkJCA9ICIqIjsKKwkJCX0KKwl8CSc/JworCQkJeworCQkJICAkJCA9ICI/IjsKKwkJCX0KKwk7CisKK3dpbGRjYXJkX3NwZWM6CisJCXdpbGRjYXJkX25hbWUKKwkJCXsKKwkJCSAgJCQubmFtZSA9ICQxOworCQkJICAkJC5zb3J0ZWQgPSBmYWxzZTsKKwkJCSAgJCQuZXhjbHVkZV9uYW1lID0gTlVMTDsKKwkJCX0KKwl8IAlFWENMVURFX0ZJTEUgJygnIHdpbGRjYXJkX25hbWUgJyknIHdpbGRjYXJkX25hbWUKKwkJCXsKKwkJCSAgJCQubmFtZSA9ICQ1OworCQkJICAkJC5zb3J0ZWQgPSBmYWxzZTsKKwkJCSAgJCQuZXhjbHVkZV9uYW1lID0gJDM7CisJCQl9CisJfAlTT1JUICcoJyB3aWxkY2FyZF9uYW1lICcpJworCQkJeworCQkJICAkJC5uYW1lID0gJDM7CisJCQkgICQkLnNvcnRlZCA9IHRydWU7CisJCQkgICQkLmV4Y2x1ZGVfbmFtZSA9IE5VTEw7CisJCQl9CisJfAlTT1JUICcoJyBFWENMVURFX0ZJTEUgJygnIHdpbGRjYXJkX25hbWUgJyknIHdpbGRjYXJkX25hbWUgJyknCisJCQl7CisJCQkgICQkLm5hbWUgPSAkNzsKKwkJCSAgJCQuc29ydGVkID0gdHJ1ZTsKKwkJCSAgJCQuZXhjbHVkZV9uYW1lID0gJDU7CisJCQl9CisJOworCisKK2ZpbGVfTkFNRV9saXN0OgorCQl3aWxkY2FyZF9zcGVjCisJCQl7CisJCQkgIGxhbmdfYWRkX3dpbGQgKCQxLm5hbWUsICQxLnNvcnRlZCwKKwkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAorCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKKwkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDEuZXhjbHVkZV9uYW1lKTsKKwkJCX0KKwl8CWZpbGVfTkFNRV9saXN0IG9wdF9jb21tYSB3aWxkY2FyZF9zcGVjCisJCQl7CisJCQkgIGxhbmdfYWRkX3dpbGQgKCQzLm5hbWUsICQzLnNvcnRlZCwKKwkJCQkJIGN1cnJlbnRfZmlsZS5uYW1lLAorCQkJCQkgY3VycmVudF9maWxlLnNvcnRlZCwKKwkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgJDMuZXhjbHVkZV9uYW1lKTsKKwkJCX0KKwk7CisKK2lucHV0X3NlY3Rpb25fc3BlY19ub19rZWVwOgorCQlOQU1FCisJCQl7CisJCQkgIGxhbmdfYWRkX3dpbGQgKE5VTEwsIGZhbHNlLCAkMSwgZmFsc2UsCisJCQkJCSBsZGdyYW1faGFkX2tlZXAsIE5VTEwpOworCQkJfQorICAgICAgICB8CSdbJworCQkJeworCQkJICBjdXJyZW50X2ZpbGUubmFtZSA9IE5VTEw7CisJCQkgIGN1cnJlbnRfZmlsZS5zb3J0ZWQgPSBmYWxzZTsKKwkJCX0KKwkJZmlsZV9OQU1FX2xpc3QgJ10nCisJfAl3aWxkY2FyZF9zcGVjCisJCQl7CisJCQkgIGN1cnJlbnRfZmlsZSA9ICQxOworCQkJICAvKiAnKicgbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgKi8KKwkJCSAgaWYgKHN0cmNtcCAoY3VycmVudF9maWxlLm5hbWUsICIqIikgPT0gMCkKKwkJCSAgICBjdXJyZW50X2ZpbGUubmFtZSA9IE5VTEw7CisJCQl9CisJCScoJyBmaWxlX05BTUVfbGlzdCAnKScKKwk7CisKK2lucHV0X3NlY3Rpb25fc3BlYzoKKwkJaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXAKKwl8CUtFRVAgJygnCisJCQl7IGxkZ3JhbV9oYWRfa2VlcCA9IHRydWU7IH0KKwkJaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXAgJyknCisJCQl7IGxkZ3JhbV9oYWRfa2VlcCA9IGZhbHNlOyB9CisJOworCitzdGF0ZW1lbnQ6CisJICAJYXNzaWdubWVudCBlbmQKKwl8CUNSRUFURV9PQkpFQ1RfU1lNQk9MUworCQl7CisgCQlsYW5nX2FkZF9hdHRyaWJ1dGUobGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bSk7IAorCSAgICAgIAl9CisgICAgICAgIHwJJzsnCisgICAgICAgIHwJQ09OU1RSVUNUT1JTCisJCXsKKyAJCQorCQkgIGxhbmdfYWRkX2F0dHJpYnV0ZShsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bSk7IAorCQl9CisJfCBTT1JUICcoJyBDT05TVFJVQ1RPUlMgJyknCisJCXsKKwkJICBjb25zdHJ1Y3RvcnNfc29ydGVkID0gdHJ1ZTsKKwkJICBsYW5nX2FkZF9hdHRyaWJ1dGUgKGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtKTsKKwkJfQorCXwgaW5wdXRfc2VjdGlvbl9zcGVjCisgICAgICAgIHwgbGVuZ3RoICcoJyBtdXN0YmVfZXhwICcpJworICAgICAgICAJICAgICAgICB7CisJCQlsYW5nX2FkZF9kYXRhKChpbnQpICQxLCQzKTsKKwkJCX0KKyAgCisJfCBGSUxMICcoJyBtdXN0YmVfZXhwICcpJworCQkJeworCQkJICBsYW5nX2FkZF9maWxsCisJCQkgICAgKGV4cF9nZXRfdmFsdWVfaW50KCQzLAorCQkJCQkgICAgICAgMCwKKwkJCQkJICAgICAgICJmaWxsIHZhbHVlIiwKKwkJCQkJICAgICAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSkpOworCQkJfQorCTsKKworc3RhdGVtZW50X2xpc3Q6CisJCXN0YXRlbWVudF9saXN0IHN0YXRlbWVudAorICAJfCAgCXN0YXRlbWVudAorCTsKKyAgCitzdGF0ZW1lbnRfbGlzdF9vcHQ6CisJCS8qIGVtcHR5ICovCisJfAlzdGF0ZW1lbnRfbGlzdAorCTsKKworbGVuZ3RoOgorCQlRVUFECisJCQl7ICQkID0gJDE7IH0KKwl8CVNRVUFECisJCQl7ICQkID0gJDE7IH0KKwl8CUxPTkcKKwkJCXsgJCQgPSAkMTsgfQorCXwgCVNIT1JUCisJCQl7ICQkID0gJDE7IH0KKwl8CUJZVEUKKwkJCXsgJCQgPSAkMTsgfQorCTsKKworZmlsbF9vcHQ6CisgICAgICAgICAgJz0nIG11c3RiZV9leHAKKwkJeworCQkgICQkID0JIGV4cF9nZXRfdmFsdWVfaW50KCQyLAorCQkJCQkgICAwLAorCQkJCQkgICAiZmlsbCB2YWx1ZSIsCisJCQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7CisJCX0KKwl8IAl7ICQkID0gMDsgfQorCTsKKworCQkKKworYXNzaWduX29wOgorCQlQTFVTRVEKKwkJCXsgJCQgPSAnKyc7IH0KKwl8CU1JTlVTRVEKKwkJCXsgJCQgPSAnLSc7IH0KKwl8IAlNVUxURVEKKwkJCXsgJCQgPSAnKic7IH0KKwl8IAlESVZFUQorCQkJeyAkJCA9ICcvJzsgfQorCXwgCUxTSElGVEVRCisJCQl7ICQkID0gTFNISUZUOyB9CisJfCAJUlNISUZURVEKKwkJCXsgJCQgPSBSU0hJRlQ7IH0KKwl8IAlBTkRFUQorCQkJeyAkJCA9ICcmJzsgfQorCXwgCU9SRVEKKwkJCXsgJCQgPSAnfCc7IH0KKworCTsKKworZW5kOgknOycgfCAnLCcKKwk7CisKKworYXNzaWdubWVudDoKKwkJTkFNRSAnPScgbXVzdGJlX2V4cAorCQl7CisJCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgkMiwgJDEsICQzKSk7CisJCX0KKwl8CU5BTUUgYXNzaWduX29wIG11c3RiZV9leHAKKwkJeworCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAkMSwKKwkJCQkJCSAgZXhwX2Jpbm9wICgkMiwKKwkJCQkJCQkgICAgIGV4cF9uYW1lb3AgKE5BTUUsCisJCQkJCQkJCQkgJDEpLAorCQkJCQkJCSAgICAgJDMpKSk7CisJCX0KKwl8CVBST1ZJREUgJygnIE5BTUUgJz0nIG11c3RiZV9leHAgJyknCisJCXsKKwkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfcHJvdmlkZSAoJDMsICQ1KSk7CisJCX0KKwk7CisKKworb3B0X2NvbW1hOgorCQknLCcJfAk7CisKKworbWVtb3J5OgorCQlNRU1PUlkgJ3snIG1lbW9yeV9zcGVjIG1lbW9yeV9zcGVjX2xpc3QgJ30nCisJOworCittZW1vcnlfc3BlY19saXN0OgorCQltZW1vcnlfc3BlY19saXN0IG1lbW9yeV9zcGVjCisJfAltZW1vcnlfc3BlY19saXN0ICcsJyBtZW1vcnlfc3BlYworCXwKKwk7CisKKworbWVtb3J5X3NwZWM6IAkJTkFNRQorCQkJeyByZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKCQxKTsgfQorCQlhdHRyaWJ1dGVzX29wdCAnOicKKwkJb3JpZ2luX3NwZWMgb3B0X2NvbW1hIGxlbmd0aF9zcGVjCisKKwk7IG9yaWdpbl9zcGVjOgorCU9SSUdJTiAnPScgbXVzdGJlX2V4cAorCQl7IHJlZ2lvbi0+Y3VycmVudCA9CisJCSByZWdpb24tPm9yaWdpbiA9CisJCSBleHBfZ2V0X3ZtYSgkMywgMEwsIm9yaWdpbiIsIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Cit9CisJOworCitsZW5ndGhfc3BlYzoKKyAgICAgICAgICAgICBMRU5HVEggJz0nIG11c3RiZV9leHAKKyAgICAgICAgICAgICAgIHsgcmVnaW9uLT5sZW5ndGggPSBleHBfZ2V0X3ZtYSgkMywKKwkJCQkJICAgICAgIH4oKGJmZF92bWEpMCksCisJCQkJCSAgICAgICAibGVuZ3RoIiwKKwkJCQkJICAgICAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7CisJCX0KKwkKKworYXR0cmlidXRlc19vcHQ6CisJCSAgJygnIE5BTUUgJyknCisJCQl7CisJCQlsYW5nX3NldF9mbGFncyhyZWdpb24sICQyKTsKKwkJCX0KKwl8CisgIAorCTsKKworc3RhcnR1cDoKKwlTVEFSVFVQICcoJyBmaWxlbmFtZSAnKScKKwkJeyBsYW5nX3N0YXJ0dXAoJDMpOyB9CisJOworCitoaWdoX2xldmVsX2xpYnJhcnk6CisJCUhMTCAnKCcgaGlnaF9sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCAnKScKKwl8CUhMTCAnKCcgJyknCisJCQl7IGxkZW11bF9obGwoKGNoYXIgKilOVUxMKTsgfQorCTsKKworaGlnaF9sZXZlbF9saWJyYXJ5X05BTUVfbGlzdDoKKwkJaGlnaF9sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCBvcHRfY29tbWEgZmlsZW5hbWUKKwkJCXsgbGRlbXVsX2hsbCgkMyk7IH0KKwl8CWZpbGVuYW1lCisJCQl7IGxkZW11bF9obGwoJDEpOyB9CisKKwk7CisKK2xvd19sZXZlbF9saWJyYXJ5OgorCVNZU0xJQiAnKCcgbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0ICcpJworCTsgbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0OgorCQlsb3dfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Qgb3B0X2NvbW1hIGZpbGVuYW1lCisJCQl7IGxkZW11bF9zeXNsaWIoJDMpOyB9CisJfAorCTsKKworZmxvYXRpbmdfcG9pbnRfc3VwcG9ydDoKKwkJRkxPQVQKKwkJCXsgbGFuZ19mbG9hdCh0cnVlKTsgfQorCXwJTk9GTE9BVAorCQkJeyBsYW5nX2Zsb2F0KGZhbHNlKTsgfQorCTsKKwkJCitub2Nyb3NzcmVmX2xpc3Q6CisJCS8qIGVtcHR5ICovCisJCXsKKwkJICAkJCA9IE5VTEw7CisJCX0KKwl8CU5BTUUgbm9jcm9zc3JlZl9saXN0CisJCXsKKwkJICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuOworCisJCSAgbiA9IChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICopIHhtYWxsb2MgKHNpemVvZiAqbik7CisJCSAgbi0+bmFtZSA9ICQxOworCQkgIG4tPm5leHQgPSAkMjsKKwkJICAkJCA9IG47CisJCX0KKwl8CU5BTUUgJywnIG5vY3Jvc3NyZWZfbGlzdAorCQl7CisJCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbjsKKworCQkgIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm4pOworCQkgIG4tPm5hbWUgPSAkMTsKKwkJICBuLT5uZXh0ID0gJDM7CisJCSAgJCQgPSBuOworCQl9CisJOworCittdXN0YmVfZXhwOgkJIHsgbGRsZXhfZXhwcmVzc2lvbigpOyB9CisJCWV4cAorCQkJIHsgbGRsZXhfcG9wc3RhdGUoKTsgJCQ9JDI7fQorCTsKKworZXhwCToKKwkJJy0nIGV4cCAlcHJlYyBVTkFSWQorCQkJeyAkJCA9IGV4cF91bm9wKCctJywgJDIpOyB9CisJfAknKCcgZXhwICcpJworCQkJeyAkJCA9ICQyOyB9CisJfAlORVhUICcoJyBleHAgJyknICVwcmVjIFVOQVJZCisJCQl7ICQkID0gZXhwX3Vub3AoKGludCkgJDEsJDMpOyB9CisJfAknIScgZXhwICVwcmVjIFVOQVJZCisJCQl7ICQkID0gZXhwX3Vub3AoJyEnLCAkMik7IH0KKwl8CScrJyBleHAgJXByZWMgVU5BUlkKKwkJCXsgJCQgPSAkMjsgfQorCXwJJ34nIGV4cCAlcHJlYyBVTkFSWQorCQkJeyAkJCA9IGV4cF91bm9wKCd+JywgJDIpO30KKworCXwJZXhwICcqJyBleHAKKwkJCXsgJCQgPSBleHBfYmlub3AoJyonLCAkMSwgJDMpOyB9CisJfAlleHAgJy8nIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnLycsICQxLCAkMyk7IH0KKwl8CWV4cCAnJScgZXhwCisJCQl7ICQkID0gZXhwX2Jpbm9wKCclJywgJDEsICQzKTsgfQorCXwJZXhwICcrJyBleHAKKwkJCXsgJCQgPSBleHBfYmlub3AoJysnLCAkMSwgJDMpOyB9CisJfAlleHAgJy0nIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnLScgLCAkMSwgJDMpOyB9CisJfAlleHAgTFNISUZUIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcChMU0hJRlQgLCAkMSwgJDMpOyB9CisJfAlleHAgUlNISUZUIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcChSU0hJRlQgLCAkMSwgJDMpOyB9CisJfAlleHAgRVEgZXhwCisJCQl7ICQkID0gZXhwX2Jpbm9wKEVRICwgJDEsICQzKTsgfQorCXwJZXhwIE5FIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcChORSAsICQxLCAkMyk7IH0KKwl8CWV4cCBMRSBleHAKKwkJCXsgJCQgPSBleHBfYmlub3AoTEUgLCAkMSwgJDMpOyB9CisgIAl8CWV4cCBHRSBleHAKKwkJCXsgJCQgPSBleHBfYmlub3AoR0UgLCAkMSwgJDMpOyB9CisJfAlleHAgJzwnIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnPCcgLCAkMSwgJDMpOyB9CisJfAlleHAgJz4nIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnPicgLCAkMSwgJDMpOyB9CisJfAlleHAgJyYnIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnJicgLCAkMSwgJDMpOyB9CisJfAlleHAgJ14nIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnXicgLCAkMSwgJDMpOyB9CisJfAlleHAgJ3wnIGV4cAorCQkJeyAkJCA9IGV4cF9iaW5vcCgnfCcgLCAkMSwgJDMpOyB9CisJfAlleHAgJz8nIGV4cCAnOicgZXhwCisJCQl7ICQkID0gZXhwX3RyaW5vcCgnPycgLCAkMSwgJDMsICQ1KTsgfQorCXwJZXhwIEFOREFORCBleHAKKwkJCXsgJCQgPSBleHBfYmlub3AoQU5EQU5EICwgJDEsICQzKTsgfQorCXwJZXhwIE9ST1IgZXhwCisJCQl7ICQkID0gZXhwX2Jpbm9wKE9ST1IgLCAkMSwgJDMpOyB9CisJfAlERUZJTkVEICcoJyBOQU1FICcpJworCQkJeyAkJCA9IGV4cF9uYW1lb3AoREVGSU5FRCwgJDMpOyB9CisJfAlJTlQKKwkJCXsgJCQgPSBleHBfaW50b3AoJDEpOyB9CisgICAgICAgIHwJU0laRU9GX0hFQURFUlMKKwkJCXsgJCQgPSBleHBfbmFtZW9wKFNJWkVPRl9IRUFERVJTLDApOyB9CisKKwl8CVNJWkVPRiAnKCcgTkFNRSAnKScKKwkJCXsgJCQgPSBleHBfbmFtZW9wKFNJWkVPRiwkMyk7IH0KKwl8CUFERFIgJygnIE5BTUUgJyknCisJCQl7ICQkID0gZXhwX25hbWVvcChBRERSLCQzKTsgfQorCXwJTE9BREFERFIgJygnIE5BTUUgJyknCisJCQl7ICQkID0gZXhwX25hbWVvcChMT0FEQUREUiwkMyk7IH0KKwl8CUFCU09MVVRFICcoJyBleHAgJyknCisJCQl7ICQkID0gZXhwX3Vub3AoQUJTT0xVVEUsICQzKTsgfQorCXwJQUxJR05fSyAnKCcgZXhwICcpJworCQkJeyAkJCA9IGV4cF91bm9wKEFMSUdOX0ssJDMpOyB9CisJfAlCTE9DSyAnKCcgZXhwICcpJworCQkJeyAkJCA9IGV4cF91bm9wKEFMSUdOX0ssJDMpOyB9CisJfAlOQU1FCisJCQl7ICQkID0gZXhwX25hbWVvcChOQU1FLCQxKTsgfQorCXwJTUFYX0sgJygnIGV4cCAnLCcgZXhwICcpJworCQkJeyAkJCA9IGV4cF9iaW5vcCAoTUFYX0ssICQzLCAkNSApOyB9CisJfAlNSU5fSyAnKCcgZXhwICcsJyBleHAgJyknCisJCQl7ICQkID0gZXhwX2Jpbm9wIChNSU5fSywgJDMsICQ1ICk7IH0KKwl8CUFTU0VSVF9LICcoJyBleHAgJywnIE5BTUUgJyknCisJCQl7ICQkID0gZXhwX2Fzc2VydCAoJDMsICQ1KTsgfQorCTsKKworCitvcHRfYXQ6CisJCUFUICcoJyBleHAgJyknIHsgJCQgPSAkMzsgfQorCXwJeyAkJCA9IDA7IH0KKwk7CisKK3NlY3Rpb246CU5BTUUgCQl7IGxkbGV4X2V4cHJlc3Npb24oKTsgfQorCQlvcHRfZXhwX3dpdGhfdHlwZSAKKwkJb3B0X2F0ICAgCXsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X3NjcmlwdCAoKTsgfQorCQkneycKKwkJCXsKKwkJCSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQoJDEsICQzLAorCQkJCQkJCSAgICAgIHNlY3R5cGUsCisJCQkJCQkJICAgICAgMCwgMCwgMCwgJDQpOworCQkJfQorCQlzdGF0ZW1lbnRfbGlzdF9vcHQgCQorIAkJJ30nIHsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KKwkJbWVtc3BlY19vcHQgcGhkcl9vcHQgZmlsbF9vcHQKKwkJeworCQkgIGxkbGV4X3BvcHN0YXRlICgpOworCQkgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICgkMTMsICQxMSwgJDEyKTsKKwkJfQorCQlvcHRfY29tbWEKKwl8CU9WRVJMQVkKKwkJCXsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQorCQlvcHRfZXhwX3dpdGhvdXRfdHlwZSBvcHRfbm9jcm9zc3JlZnMgb3B0X2F0CisJCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9zY3JpcHQgKCk7IH0KKwkJJ3snIAorCQkJeworCQkJICBsYW5nX2VudGVyX292ZXJsYXkgKCQzLCAkNSwgKGludCkgJDQpOworCQkJfQorCQlvdmVybGF5X3NlY3Rpb24KKwkJJ30nCisJCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9CisJCW1lbXNwZWNfb3B0IHBoZHJfb3B0IGZpbGxfb3B0CisJCQl7CisJCQkgIGxkbGV4X3BvcHN0YXRlICgpOworCQkJICBsYW5nX2xlYXZlX292ZXJsYXkgKCQxNCwgJDEyLCAkMTMpOworCQkJfQorCQlvcHRfY29tbWEKKwl8CS8qIFRoZSBHUk9VUCBjYXNlIGlzIGp1c3QgZW5vdWdoIHRvIHN1cHBvcnQgdGhlIGdjYworCQkgICBzdnIzLmlmaWxlIHNjcmlwdC4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBmdWxsCisJCSAgIHN1cHBvcnQuICBJJ20gbm90IGV2ZW4gc3VyZSB3aGF0IEdST1VQIGlzIHN1cHBvc2VkCisJCSAgIHRvIG1lYW4uICAqLworCQlHUk9VUCB7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KKwkJb3B0X2V4cF93aXRoX3R5cGUKKwkJeworCQkgIGxkbGV4X3BvcHN0YXRlICgpOworCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCAiLiIsICQzKSk7CisJCX0KKwkJJ3snIHNlY19vcl9ncm91cF9wMSAnfScKKwk7CisKK3R5cGU6CisJICAgTk9MT0FEICB7IHNlY3R5cGUgPSBub2xvYWRfc2VjdGlvbjsgfQorCXwgIERTRUNUICAgeyBzZWN0eXBlID0gZHNlY3Rfc2VjdGlvbjsgfQorCXwgIENPUFkgICAgeyBzZWN0eXBlID0gY29weV9zZWN0aW9uOyB9CisJfCAgSU5GTyAgICB7IHNlY3R5cGUgPSBpbmZvX3NlY3Rpb247IH0KKwl8ICBPVkVSTEFZIHsgc2VjdHlwZSA9IG92ZXJsYXlfc2VjdGlvbjsgfQorCTsKKworYXR5cGU6CisJIAknKCcgdHlwZSAnKScKKyAgCXwgCS8qIEVNUFRZICovIHsgc2VjdHlwZSA9IG5vcm1hbF9zZWN0aW9uOyB9CisgIAl8IAknKCcgJyknIHsgc2VjdHlwZSA9IG5vcm1hbF9zZWN0aW9uOyB9CisJOworCitvcHRfZXhwX3dpdGhfdHlwZToKKwkJZXhwIGF0eXBlICc6JwkJeyAkJCA9ICQxOyB9CisJfAlhdHlwZSAnOicJCXsgJCQgPSAoZXRyZWVfdHlwZSAqKU5VTEw7ICB9CisJfAkvKiBUaGUgQklORCBjYXNlcyBhcmUgdG8gc3VwcG9ydCB0aGUgZ2NjIHN2cjMuaWZpbGUKKwkJICAgc2NyaXB0LiAgVGhleSBhcmVuJ3QgaW50ZW5kZWQgdG8gaW1wbGVtZW50IGZ1bGwKKwkJICAgc3VwcG9ydCBmb3IgdGhlIEJJTkQga2V5d29yZC4gIEknbSBub3QgZXZlbiBzdXJlCisJCSAgIHdoYXQgQklORCBpcyBzdXBwb3NlZCB0byBtZWFuLiAgKi8KKwkJQklORCAnKCcgZXhwICcpJyBhdHlwZSAnOicgeyAkJCA9ICQzOyB9CisJfAlCSU5EICcoJyBleHAgJyknIEJMT0NLICcoJyBleHAgJyknIGF0eXBlICc6JworCQl7ICQkID0gJDM7IH0KKwk7CisKK29wdF9leHBfd2l0aG91dF90eXBlOgorCQlleHAgJzonCQl7ICQkID0gJDE7IH0KKwl8CSc6JwkJeyAkJCA9IChldHJlZV90eXBlICopIE5VTEw7ICB9CisJOworCitvcHRfbm9jcm9zc3JlZnM6CisJCS8qIGVtcHR5ICovCisJCQl7ICQkID0gMDsgfQorCXwJTk9DUk9TU1JFRlMKKwkJCXsgJCQgPSAxOyB9CisJOworCittZW1zcGVjX29wdDoKKwkJJz4nIE5BTUUKKwkJeyAkJCA9ICQyOyB9CisJfAl7ICQkID0gIipkZWZhdWx0KiI7IH0KKwk7CisKK3BoZHJfb3B0OgorCQkvKiBlbXB0eSAqLworCQl7CisJCSAgJCQgPSBOVUxMOworCQl9CisJfAlwaGRyX29wdCAnOicgTkFNRQorCQl7CisJCSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpuOworCisJCSAgbiA9ICgoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopCisJCSAgICAgICB4bWFsbG9jIChzaXplb2YgKm4pKTsKKwkJICBuLT5uYW1lID0gJDM7CisJCSAgbi0+dXNlZCA9IGZhbHNlOworCQkgIG4tPm5leHQgPSAkMTsKKwkJICAkJCA9IG47CisJCX0KKwk7CisKK292ZXJsYXlfc2VjdGlvbjoKKwkJLyogZW1wdHkgKi8KKwl8CW92ZXJsYXlfc2VjdGlvbgorCQlOQU1FCisJCQl7CisJCQkgIGxkbGV4X3NjcmlwdCAoKTsKKwkJCSAgbGFuZ19lbnRlcl9vdmVybGF5X3NlY3Rpb24gKCQyKTsKKwkJCX0KKwkJJ3snIHN0YXRlbWVudF9saXN0X29wdCAnfScKKwkJCXsgbGRsZXhfcG9wc3RhdGUgKCk7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KKwkJcGhkcl9vcHQgZmlsbF9vcHQKKwkJCXsKKwkJCSAgbGRsZXhfcG9wc3RhdGUgKCk7CisJCQkgIGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uICgkOSwgJDgpOworCQkJfQorCQlvcHRfY29tbWEKKwk7CisKK3BoZHJzOgorCQlQSERSUyAneycgcGhkcl9saXN0ICd9JworCTsKKworcGhkcl9saXN0OgorCQkvKiBlbXB0eSAqLworCXwJcGhkcl9saXN0IHBoZHIKKwk7CisKK3BoZHI6CisJCU5BTUUgeyBsZGxleF9leHByZXNzaW9uICgpOyB9CisJCSAgcGhkcl90eXBlIHBoZHJfcXVhbGlmaWVycyB7IGxkbGV4X3BvcHN0YXRlICgpOyB9CisJCSAgJzsnCisJCXsKKwkJICBsYW5nX25ld19waGRyICgkMSwgJDMsICQ0LmZpbGVoZHIsICQ0LnBoZHJzLCAkNC5hdCwKKwkJCQkgJDQuZmxhZ3MpOworCQl9CisJOworCitwaGRyX3R5cGU6CisJCWV4cAorCQl7CisJCSAgJCQgPSAkMTsKKworCQkgIGlmICgkMS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX25hbWUKKwkJICAgICAgJiYgJDEtPnR5cGUubm9kZV9jb2RlID09IE5BTUUpCisJCSAgICB7CisJCSAgICAgIGNvbnN0IGNoYXIgKnM7CisJCSAgICAgIHVuc2lnbmVkIGludCBpOworCQkgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoZHJfdHlwZXNbXSA9CisJCQl7CisJCQkgICJQVF9OVUxMIiwgIlBUX0xPQUQiLCAiUFRfRFlOQU1JQyIsCisJCQkgICJQVF9JTlRFUlAiLCAiUFRfTk9URSIsICJQVF9TSExJQiIsCisJCQkgICJQVF9QSERSIgorCQkJfTsKKworCQkgICAgICBzID0gJDEtPm5hbWUubmFtZTsKKwkJICAgICAgZm9yIChpID0gMDsKKwkJCSAgIGkgPCBzaXplb2YgcGhkcl90eXBlcyAvIHNpemVvZiBwaGRyX3R5cGVzWzBdOworCQkJICAgaSsrKQorCQkJaWYgKHN0cmNtcCAocywgcGhkcl90eXBlc1tpXSkgPT0gMCkKKwkJCSAgeworCQkJICAgICQkID0gZXhwX2ludG9wIChpKTsKKwkJCSAgICBicmVhazsKKwkJCSAgfQorCQkgICAgfQorCQl9CisJOworCitwaGRyX3F1YWxpZmllcnM6CisJCS8qIGVtcHR5ICovCisJCXsKKwkJICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcGhkcl9pbmZvKSk7CisJCX0KKwl8CU5BTUUgcGhkcl92YWwgcGhkcl9xdWFsaWZpZXJzCisJCXsKKwkJICAkJCA9ICQzOworCQkgIGlmIChzdHJjbXAgKCQxLCAiRklMRUhEUiIpID09IDAgJiYgJDIgPT0gTlVMTCkKKwkJICAgICQkLmZpbGVoZHIgPSB0cnVlOworCQkgIGVsc2UgaWYgKHN0cmNtcCAoJDEsICJQSERSUyIpID09IDAgJiYgJDIgPT0gTlVMTCkKKwkJICAgICQkLnBoZHJzID0gdHJ1ZTsKKwkJICBlbHNlIGlmIChzdHJjbXAgKCQxLCAiRkxBR1MiKSA9PSAwICYmICQyICE9IE5VTEwpCisJCSAgICAkJC5mbGFncyA9ICQyOworCQkgIGVsc2UKKwkJICAgIGVpbmZvIChfKCIlWCVQOiVTOiBQSERSUyBzeW50YXggZXJyb3IgYXQgYCVzJ1xuIiksICQxKTsKKwkJfQorCXwJQVQgJygnIGV4cCAnKScgcGhkcl9xdWFsaWZpZXJzCisJCXsKKwkJICAkJCA9ICQ1OworCQkgICQkLmF0ID0gJDM7CisJCX0KKwk7CisKK3BoZHJfdmFsOgorCQkvKiBlbXB0eSAqLworCQl7CisJCSAgJCQgPSBOVUxMOworCQl9CisJfCAnKCcgZXhwICcpJworCQl7CisJCSAgJCQgPSAkMjsKKwkJfQorCTsKKworLyogVGhpcyBzeW50YXggaXMgdXNlZCB3aXRoaW4gYW4gZXh0ZXJuYWwgdmVyc2lvbiBzY3JpcHQgZmlsZS4gICovCisKK3ZlcnNpb25fc2NyaXB0X2ZpbGU6CisJCXsKKwkJICBsZGxleF92ZXJzaW9uX2ZpbGUgKCk7CisJCSAgUFVTSF9FUlJPUiAoXygiVkVSU0lPTiBzY3JpcHQiKSk7CisJCX0KKwkJdmVyc19ub2RlcworCQl7CisJCSAgbGRsZXhfcG9wc3RhdGUgKCk7CisJCSAgUE9QX0VSUk9SICgpOworCQl9CisJOworCisvKiBUaGlzIGlzIHVzZWQgd2l0aGluIGEgbm9ybWFsIGxpbmtlciBzY3JpcHQgZmlsZS4gICovCisKK3ZlcnNpb246CisJCXsKKwkJICBsZGxleF92ZXJzaW9uX3NjcmlwdCAoKTsKKwkJfQorCQlWRVJTSU9OSyAneycgdmVyc19ub2RlcyAnfScKKwkJeworCQkgIGxkbGV4X3BvcHN0YXRlICgpOworCQl9CisJOworCit2ZXJzX25vZGVzOgorCQl2ZXJzX25vZGUKKwl8CXZlcnNfbm9kZXMgdmVyc19ub2RlCisJOworCit2ZXJzX25vZGU6CisJCVZFUlNfVEFHICd7JyB2ZXJzX3RhZyAnfScgJzsnCisJCXsKKwkJICBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAoJDEsICQzLCBOVUxMKTsKKwkJfQorCXwJVkVSU19UQUcgJ3snIHZlcnNfdGFnICd9JyB2ZXJkZXAgJzsnCisJCXsKKwkJICBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAoJDEsICQzLCAkNSk7CisJCX0KKwk7CisKK3ZlcmRlcDoKKwkJVkVSU19UQUcKKwkJeworCQkgICQkID0gbGFuZ19hZGRfdmVyc19kZXBlbmQgKE5VTEwsICQxKTsKKwkJfQorCXwJdmVyZGVwIFZFUlNfVEFHCisJCXsKKwkJICAkJCA9IGxhbmdfYWRkX3ZlcnNfZGVwZW5kICgkMSwgJDIpOworCQl9CisJOworCit2ZXJzX3RhZzoKKwkJLyogZW1wdHkgKi8KKwkJeworCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlIChOVUxMLCBOVUxMKTsKKwkJfQorCXwJdmVyc19kZWZucyAnOycKKwkJeworCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlICgkMSwgTlVMTCk7CisJCX0KKwl8CUdMT0JBTCAnOicgdmVyc19kZWZucyAnOycKKwkJeworCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlICgkMywgTlVMTCk7CisJCX0KKwl8CUxPQ0FMICc6JyB2ZXJzX2RlZm5zICc7JworCQl7CisJCSAgJCQgPSBsYW5nX25ld192ZXJzX25vZGUgKE5VTEwsICQzKTsKKwkJfQorCXwJR0xPQkFMICc6JyB2ZXJzX2RlZm5zICc7JyBMT0NBTCAnOicgdmVyc19kZWZucyAnOycKKwkJeworCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlICgkMywgJDcpOworCQl9CisJOworCit2ZXJzX2RlZm5zOgorCQlWRVJTX0lERU5USUZJRVIKKwkJeworCQkgICQkID0gbGFuZ19uZXdfdmVyc19yZWdleCAoTlVMTCwgJDEsIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyk7CisJCX0KKwl8CXZlcnNfZGVmbnMgJzsnIFZFUlNfSURFTlRJRklFUgorCQl7CisJCSAgJCQgPSBsYW5nX25ld192ZXJzX3JlZ2V4ICgkMSwgJDMsIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyk7CisJCX0KKwl8CUVYVEVSTiBOQU1FICd7JworCQkJeworCQkJICAkPG5hbWU+JCA9IGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZzsKKwkJCSAgbGRncmFtX3ZlcnNfY3VycmVudF9sYW5nID0gJDI7CisJCQl9CisJCXZlcnNfZGVmbnMgJ30nCisJCQl7CisJCQkgIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9ICQ8bmFtZT40OworCQkJfQorCTsKKworJSUKK3ZvaWQKK3l5ZXJyb3IoYXJnKSAKKyAgICAgY29uc3QgY2hhciAqYXJnOworeyAKKyAgaWYgKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCkKKyAgICBlaW5mbyAoXygiJVA6JXM6IGZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkOyB0cmVhdGluZyBhcyBsaW5rZXIgc2NyaXB0XG4iKSwKKwkgICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOworICBpZiAoZXJyb3JfaW5kZXggPiAwICYmIGVycm9yX2luZGV4IDwgRVJST1JfTkFNRV9NQVgpCisgICAgIGVpbmZvICgiJVAlRjolUzogJXMgaW4gJXNcbiIsIGFyZywgZXJyb3JfbmFtZXNbZXJyb3JfaW5kZXgtMV0pOworICBlbHNlCisgICAgIGVpbmZvICgiJVAlRjolUzogJXNcbiIsIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9sZC9sZGludC50ZXhpbmZvIGIvbGQvbGRpbnQudGV4aW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVhNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRpbnQudGV4aW5mbwpAQCAtMCwwICsxLDU2NCBAQAorXGlucHV0IHRleGluZm8KK0BzZXRmaWxlbmFtZSBsZGludC5pbmZvCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIExkLUludGVybmFsczogKGxkaW50KS4JVGhlIEdOVSBsaW5rZXIgaW50ZXJuYWxzLgorRU5ELUlORk8tRElSLUVOVFJZCitAZW5kIGZvcm1hdAorQGVuZCBpZmluZm8KKworQGlmaW5mbworVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyIGxkLgorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0NvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBvciBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCAoZm9yIHdoaWNoIHB1cnBvc2UgdGhpcyB0ZXh0IG1heSBiZQorcmVnYXJkZWQgYXMgYSBwcm9ncmFtIGluIHRoZSBsYW5ndWFnZSBUZVgpLgorQGVuZCBpZmluZm8KKworQGlmdGV4CitAZmluYWxvdXQKK0BzZXRjaGFwdGVybmV3cGFnZSBvZmYKK0BzZXR0aXRsZSBHTlUgTGlua2VyIEludGVybmFscworQHRpdGxlcGFnZQorQHRpdGxle0EgZ3VpZGUgdG8gdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlcn0KK0BhdXRob3IgUGVyIEJvdGhuZXIsIFN0ZXZlIENoYW1iZXJsYWluLCBJYW4gTGFuY2UgVGF5bG9yLCBESiBEZWxvcmllCitAYXV0aG9yIEN5Z251cyBTdXBwb3J0CitAcGFnZQorCitAdGV4CitcZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAorXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwore1xwYXJza2lwPTBwdAorXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgorXGhmaWxsIFxtYW52ZXJzXHBhcgorXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgorfQorQGVuZCB0ZXgKKworQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BlbmQgdGl0bGVwYWdlCitAZW5kIGlmdGV4CisKK0Bub2RlIFRvcAorQHRvcAorCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXIgQGNvZGV7bGR9LiAgSXQgaXMgYQorY29sbGVjdGlvbiBvZiBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uIHdpdGggbGl0dGxlIGZvcm0gYXQgdGhpcyBwb2ludC4KK01vc3RseSwgaXQgaXMgYSByZXBvc2l0b3J5IGludG8gd2hpY2ggeW91IGNhbiBwdXQgaW5mb3JtYXRpb24gYWJvdXQKK0dOVSBAY29kZXtsZH0gYXMgeW91IGRpc2NvdmVyIGl0IChvciBhcyB5b3UgZGVzaWduIGNoYW5nZXMgdG8gQGNvZGV7bGR9KS4KKworQG1lbnUKKyogUkVBRE1FOjoJCQlUaGUgUkVBRE1FIEZpbGUKKyogRW11bGF0aW9uczo6CQkJSG93IGxpbmtlciBlbXVsYXRpb25zIGFyZSBnZW5lcmF0ZWQKKyogRW11bGF0aW9uIFdhbGt0aHJvdWdoOjoJQSBXYWxrdGhyb3VnaCBvZiBhIFR5cGljYWwgRW11bGF0aW9uCitAZW5kIG1lbnUKKworQG5vZGUgUkVBRE1FCitAY2hhcHRlciBUaGUgQGZpbGV7UkVBRE1FfSBGaWxlCisKK0NoZWNrIHRoZSBAZmlsZXtSRUFETUV9IGZpbGU7IGl0IG9mdGVuIGhhcyB1c2VmdWwgaW5mb3JtYXRpb24gdGhhdCBkb2VzIG5vdAorYXBwZWFyIGFueXdoZXJlIGVsc2UgaW4gdGhlIGRpcmVjdG9yeS4KKworQG5vZGUgRW11bGF0aW9ucworQGNoYXB0ZXIgSG93IGxpbmtlciBlbXVsYXRpb25zIGFyZSBnZW5lcmF0ZWQKKworRWFjaCBsaW5rZXIgdGFyZ2V0IGhhcyBhbiBAZGZue2VtdWxhdGlvbn0uICBUaGUgZW11bGF0aW9uIGluY2x1ZGVzIHRoZQorZGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBhbmQgY2VydGFpbiBlbXVsYXRpb25zIGFsc28gbW9kaWZ5IGNlcnRhaW4gdHlwZXMKK29mIGxpbmtlciBiZWhhdmlvdXIuCisKK0VtdWxhdGlvbnMgYXJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGJ5IHRoZSBzaGVsbCBzY3JpcHQKK0BmaWxle2dlbnNjcmlwdHMuc2h9LgorCitUaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHN0YXJ0cyBieSByZWFkaW5nIGEgZmlsZSBpbiB0aGUKK0BmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeS4gIFRoaXMgaXMgYSBzaGVsbCBzY3JpcHQgd2hpY2ggc2V0cyB2YXJpb3VzCitzaGVsbCB2YXJpYWJsZXMgdXNlZCBieSBAZmlsZXtnZW5zY3JpcHRzLnNofSBhbmQgdGhlIG90aGVyIHNoZWxsIHNjcmlwdHMKK2l0IGludm9rZXMuCisKK1RoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBpbnZva2UgYSBzaGVsbCBzY3JpcHQgaW4gdGhlCitAZmlsZXtzY3JpcHR0ZW1wbH0gZGlyZWN0b3J5IGluIG9yZGVyIHRvIGNyZWF0ZSBkZWZhdWx0IGxpbmtlciBzY3JpcHRzCit3cml0dGVuIGluIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0Cit3aWxsIGJlIGludm9rZWQgNSAob3IsIGluIHNvbWUgY2FzZXMsIDYpIHRpbWVzLCB3aXRoIGRpZmZlcmVudAorYXNzaWdubWVudHMgdG8gc2hlbGwgdmFyaWFibGVzLCB0byBjcmVhdGUgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cy4KK1RoZSBjaG9pY2Ugb2Ygc2NyaXB0IGlzIG1hZGUgYmFzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorCitBZnRlciBjcmVhdGluZyB0aGUgc2NyaXB0cywgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCBpbnZva2UgeWV0IGFub3RoZXIKK3NoZWxsIHNjcmlwdCwgdGhpcyB0aW1lIGluIHRoZSBAZmlsZXtlbXVsdGVtcGx9IGRpcmVjdG9yeS4gIFRoYXQgc2hlbGwKK3NjcmlwdCB3aWxsIGNyZWF0ZSB0aGUgZW11bGF0aW9uIHNvdXJjZSBmaWxlLCB3aGljaCBjb250YWlucyBDIGNvZGUuCitUaGlzIEMgY29kZSBwZXJtaXRzIHRoZSBsaW5rZXIgZW11bGF0aW9uIHRvIG92ZXJyaWRlIHZhcmlvdXMgbGlua2VyCitiZWhhdmlvdXJzLiAgTW9zdCB0YXJnZXRzIHVzZSB0aGUgZ2VuZXJpYyBlbXVsYXRpb24gY29kZSwgd2hpY2ggaXMgaW4KK0BmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfS4KKworVG8gc3VtbWFyaXplLCBAZmlsZXtnZW5zY3JpcHRzLnNofSByZWFkcyB0aHJlZSBzaGVsbCBzY3JpcHRzOiBhbgorZW11bGF0aW9uIHBhcmFtZXRlcnMgc2NyaXB0IGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnksIGEgbGlua2VyCitzY3JpcHQgZ2VuZXJhdGlvbiBzY3JpcHQgaW4gdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBkaXJlY3RvcnksIGFuZCBhbgorZW11bGF0aW9uIHNvdXJjZSBmaWxlIGdlbmVyYXRpb24gc2NyaXB0IGluIHRoZSBAZmlsZXtlbXVsdGVtcGx9CitkaXJlY3RvcnkuCisKK0ZvciBleGFtcGxlLCB0aGUgU3VuIDQgbGlua2VyIHNldHMgdXAgdmFyaWFibGVzIGluCitAZmlsZXtlbXVscGFyYW1zL3N1bjQuc2h9LCBjcmVhdGVzIGxpbmtlciBzY3JpcHRzIHVzaW5nCitAZmlsZXtzY3JpcHR0ZW1wbC9hb3V0LnNjfSwgYW5kIGNyZWF0ZXMgdGhlIGVtdWxhdGlvbiBjb2RlIHVzaW5nCitAZmlsZXtlbXVsdGVtcGwvc3Vub3MuZW19LgorCitOb3RlIHRoYXQgdGhlIGxpbmtlciBjYW4gc3VwcG9ydCBzZXZlcmFsIGVtdWxhdGlvbnMgc2ltdWx0YW5lb3VzbHksCitkZXBlbmRpbmcgdXBvbiBob3cgaXQgaXMgY29uZmlndXJlZC4gIEFuIGVtdWxhdGlvbiBjYW4gYmUgc2VsZWN0ZWQgd2l0aAordGhlIEBjb2Rley1tfSBvcHRpb24uICBUaGUgQGNvZGV7LVZ9IG9wdGlvbiB3aWxsIGxpc3QgYWxsIHN1cHBvcnRlZAorZW11bGF0aW9ucy4KKworQG1lbnUKKyogZW11bGF0aW9uIHBhcmFtZXRlcnM6OiAgICAgICAgQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0cworKiBsaW5rZXIgc2NyaXB0czo6ICAgICAgICAgICAgICBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cworKiBsaW5rZXIgZW11bGF0aW9uczo6ICAgICAgICAgICBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdHMKK0BlbmQgbWVudQorCitAbm9kZSBlbXVsYXRpb24gcGFyYW1ldGVycworQHNlY3Rpb24gQGZpbGV7ZW11bHBhcmFtc30gc2NyaXB0cworCitFYWNoIHRhcmdldCBzZWxlY3RzIGEgcGFydGljdWxhciBmaWxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBkaXJlY3RvcnkKK2J5IHNldHRpbmcgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle3RhcmdfZW11bH0gaW4gQGZpbGV7Y29uZmlndXJlLnRndH0uCitUaGlzIHNoZWxsIHZhcmlhYmxlIGlzIHVzZWQgYnkgdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHRvIGNvbnRyb2wKK2J1aWxkaW5nIGFuIGVtdWxhdGlvbiBzb3VyY2UgZmlsZS4KKworQ2VydGFpbiBjb252ZW50aW9ucyBhcmUgZW5mb3JjZWQuICBTdXBwb3NlIHRoZSBAY29kZXt0YXJnX2VtdWx9IHZhcmlhYmxlCitpcyBzZXQgdG8gQHZhcntlbXVsfSBpbiBAZmlsZXtjb25maWd1cmUudGd0fS4gIFRoZSBuYW1lIG9mIHRoZSBlbXVsYXRpb24KK3NoZWxsIHNjcmlwdCB3aWxsIGJlIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0uICBUaGUKK0BmaWxle01ha2VmaWxlfSBtdXN0IGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7ZUB2YXJ7ZW11bH0uY307IHRoaXMKK3RhcmdldCBtdXN0IGRlcGVuZCB1cG9uIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0sIGFzIHdlbGwgYXMgdGhlCithcHByb3ByaWF0ZSBzY3JpcHRzIGluIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIEBmaWxle2VtdWx0ZW1wbH0KK2RpcmVjdG9yaWVzLiAgVGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgbXVzdCBpbnZva2UgQGNvZGV7R0VOU0NSSVBUU30KK3dpdGggdHdvIGFyZ3VtZW50czogQHZhcntlbXVsfSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbWFrZSB2YXJpYWJsZQorQGNvZGV7dGRpcl9AdmFye2VtdWx9fS4gIFRoZSB2YWx1ZSBvZiB0aGUgbGF0dGVyIHZhcmlhYmxlIHdpbGwgYmUgc2V0IGJ5Cit0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB0YXJnZXQKK2RpcmVjdG9yeSB0byBzZWFyY2guCisKK0J5IGNvbnZlbnRpb24sIHRoZSBAZmlsZXtlbXVscGFyYW1zL0B2YXJ7ZW11bH0uc2h9IHNoZWxsIHNjcmlwdCBzaG91bGQKK29ubHkgc2V0IHNoZWxsIHZhcmlhYmxlcy4gIEl0IG1heSBzZXQgc2hlbGwgdmFyaWFibGVzIHdoaWNoIGFyZSB0byBiZQoraW50ZXJwcmV0ZWQgYnkgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBhbmQgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cy4KK0NlcnRhaW4gc2hlbGwgdmFyaWFibGVzIGFyZSBpbnRlcnByZXRlZCBkaXJlY3RseSBieSB0aGUKK0BmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdC4KKworSGVyZSBpcyBhIGxpc3Qgb2Ygc2hlbGwgdmFyaWFibGVzIGludGVycHJldGVkIGJ5IEBmaWxle2dlbnNjcmlwdHMuc2h9LAorYXMgd2VsbCBhcyBzb21lIGNvbnZlbnRpb25hbCBzaGVsbCB2YXJpYWJsZXMgaW50ZXJwcmV0ZWQgYnkgdGhlCitAZmlsZXtzY3JpcHR0ZW1wbH0gYW5kIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBTQ1JJUFRfTkFNRQorVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB0byB1c2UuICBJZgorQGNvZGV7U0NSSVBUX05BTUV9IGlzIHNldCB0byBAdmFye3NjcmlwdH0sIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgdXNlCit0aGUgc2NyaXB0IEBmaWxle3NjcmlwdHRlbWwvQHZhcntzY3JpcHR9LnNjfS4KKworQGl0ZW0gVEVNUExBVEVfTkFNRQorVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHRlbWxwfSBzY3JpcHQgdG8gdXNlLiAgSWYKK0Bjb2Rle1RFTVBMQVRFX05BTUV9IGlzIHNldCB0byBAdmFye3RlbXBsYXRlfSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbAordXNlIHRoZSBzY3JpcHQgQGZpbGV7ZW11bHRlbXBsL0B2YXJ7dGVtcGxhdGV9LmVtfS4gIElmIHRoaXMgdmFyaWFibGUgaXMKK25vdCBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIEBzYW1we2dlbmVyaWN9LgorCitAaXRlbSBHRU5FUkFURV9TSExJQl9TQ1JJUFQKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uZW1wdHkgc3RyaW5nLCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIGludm9rZQordGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgYW4gZXh0cmEgdGltZSB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeQorc2NyaXB0LiAgQHJlZntsaW5rZXIgc2NyaXB0c30uCisKK0BpdGVtIE9VVFBVVF9GT1JNQVQKK1RoaXMgaXMgbm9ybWFsbHkgc2V0IHRvIGluZGljYXRlIHRoZSBCRkQgb3V0cHV0IGZvcm1hdCB1c2UgKGUuZy4sCitAc2FtcHsiYS5vdXQtc3Vub3MtYmlnIn0uICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aWxsIG5vcm1hbGx5Cit1c2UgaXQgaW4gYW4gQGNvZGV7T1VUUFVUX0ZPUk1BVH0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KKworQGl0ZW0gQVJDSAorVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2UgKGUuZy4sCitAc2FtcHtzcGFyY30pLiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2lsbCBub3JtYWxseSB1c2UgaXQgaW4gYW4KK0Bjb2Rle09VVFBVVF9BUkNIfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgorCitAaXRlbSBFTlRSWQorU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyB1c2UgdGhpcyB0byBzZXQgdGhlIGVudHJ5IGFkZHJlc3MsIGluIGFuCitAY29kZXtFTlRSWX0gZXhwcmVzc2lvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4KKworQGl0ZW0gVEVYVF9TVEFSVF9BRERSCitTb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUKK0BzYW1wey50ZXh0fSBzZWN0aW9uLgorCitAaXRlbSBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIKK0lmIHRoaXMgaXMgZGVmaW5lZCwgdGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCBzZXRzCitAY29kZXtURVhUX1NUQVJUX0FERFJ9IHRvIGl0cyB2YWx1ZSBiZWZvcmUgcnVubmluZyB0aGUKK0BmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgZm9yIHRoZSBAY29kZXstbn0gYW5kIEBjb2Rley1OfSBvcHRpb25zCisoQHB4cmVme2xpbmtlciBzY3JpcHRzfSkuCisKK0BpdGVtIFNFR01FTlRfU0laRQorVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB1c2VzIHRoaXMgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mCitAY29kZXtEQVRBX0FMSUdOTUVOVH0gd2hlbiBydW5uaW5nIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0LgorCitAaXRlbSBUQVJHRVRfUEFHRV9TSVpFCitJZiBAY29kZXtTRUdNRU5UX1NJWkV9IGlzIG5vdCBkZWZpbmVkLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0Cit1c2VzIHRoaXMgdG8gZGVmaW5lIGl0LgorCitAaXRlbSBBTElHTk1FTlQKK1NvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgc2V0IHRoaXMgdG8gYSBudW1iZXIgdG8gcGFzcyB0bworQGNvZGV7QUxJR059IHRvIHNldCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgQGNvZGV7ZW5kfSBzeW1ib2wuCitAZW5kIHRhYmxlCisKK0Bub2RlIGxpbmtlciBzY3JpcHRzCitAc2VjdGlvbiBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cworCitFYWNoIGxpbmtlciB0YXJnZXQgdXNlcyBhIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlCitkZWZhdWx0IGxpbmtlciBzY3JpcHRzLiAgVGhlIG5hbWUgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMKK3NldCBieSB0aGUgQGNvZGV7U0NSSVBUX05BTUV9IHZhcmlhYmxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQuCitJZiBAY29kZXtTQ1JJUFRfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7c2NyaXB0fSwgQGNvZGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbAoraW52b2tlIEBmaWxle3NjcmlwdHRlbXBsL0B2YXJ7c2NyaXB0fS5zY30uCisKK1RoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBpbnZva2UgdGhlIEBmaWxle3NjcmlwdHRlbXBsfQorc2NyaXB0IDUgb3IgNiB0aW1lcy4gIEVhY2ggdGltZSBpdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKK0Bjb2Rle0xEX0ZMQUd9IHRvIGEgZGlmZmVyZW50IHZhbHVlLiAgV2hlbiB0aGUgbGlua2VyIGlzIHJ1biwgdGhlCitvcHRpb25zIHVzZWQgd2lsbCBkaXJlY3QgaXQgdG8gc2VsZWN0IGEgcGFydGljdWxhciBzY3JpcHQuICAoU2NyaXB0CitzZWxlY3Rpb24gaXMgY29udHJvbGxlZCBieSB0aGUgQGNvZGV7Z2V0X3NjcmlwdH0gZW11bGF0aW9uIGVudHJ5IHBvaW50OwordGhpcyBkZXNjcmliZXMgdGhlIGNvbnZlbnRpb25hbCBiZWhhdmlvdXIpLgorCitUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBzaG91bGQganVzdCB3cml0ZSBhIGxpbmtlciBzY3JpcHQsIHdyaXR0ZW4KK2luIHRoZSBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZSwgdG8gc3RhbmRhcmQgb3V0cHV0LiAgSWYgdGhlIGVtdWxhdGlvbgorbmFtZS0tdGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUgd2l0aG91dCB0aGUgQGZpbGV7LnNjfQorZXh0ZW5zaW9uLS1pcyBAdmFye2VtdWx9LCB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSBkaXJlY3RlZCB0bworQGZpbGV7bGRzY3JpcHRzL0B2YXJ7ZW11bH0uQHZhcntleHRlbnNpb259fSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LAord2hlcmUgQHZhcntleHRlbnNpb259IGNoYW5nZXMgZWFjaCB0aW1lIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzCitpbnZva2VkLgorCitIZXJlIGlzIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NpZ25lZCB0byBAY29kZXtMRF9GTEFHfS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSAoZW1wdHkpCitUaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIGJ5IGRlZmF1bHQgKHdoZW4gbm9uZSBvZiB0aGUgZm9sbG93aW5nCitjYXNlcyBhcHBseSkuICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnh9LgorQGl0ZW0gbgorVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQorQGNvZGV7LW59IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueG59LgorQGl0ZW0gTgorVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQorQGNvZGV7LU59IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueGJufS4KK0BpdGVtIHIKK1RoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKK0Bjb2Rley1yfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnhyfS4KK0BpdGVtIHUKK1RoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgd2hlbiB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCB0aGUKK0Bjb2Rley1Vcn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54dX0uCitAaXRlbSBzaGFyZWQKK1RoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzIG9ubHkgaW52b2tlZCB3aXRoIEBjb2Rle0xEX0ZMQUd9IHNldCB0bwordGhpcyB2YWx1ZSBpZiBAY29kZXtHRU5FUkFURV9TSExJQl9TQ1JJUFR9IGlzIGRlZmluZWQgaW4gdGhlCitAZmlsZXtlbXVscGFyYW1zfSBmaWxlLiAgVGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IG11c3QgYXJyYW5nZSB0byB1c2UKK3RoaXMgc2NyaXB0IGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lLCBub3JtYWxseSB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZAord2l0aCB0aGUgQGNvZGV7LXNoYXJlZH0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mCitAZmlsZXsueHN9LgorQGVuZCB0YWJsZQorCitCZXNpZGVzIHRoZSBzaGVsbCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQsIGFuZCB0aGUKK0Bjb2Rle0xEX0ZMQUd9IHZhcmlhYmxlLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0CitjZXJ0YWluIHZhcmlhYmxlcyBmb3IgZWFjaCBydW4gb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gUkVMT0NBVElORworVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIGEgZmluYWwKK3JlbG9jYXRpb24gKGUuZy4sIGFsbCBzY3JpcHRzIG90aGVyIHRoYW4gQGNvZGV7LXJ9IGFuZCBAY29kZXstVXJ9KS4KKworQGl0ZW0gQ09OU1RSVUNUSU5HCitUaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgYnVpbGRpbmcKK2dsb2JhbCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgKGUuZy4sIGFsbCBzY3JpcHRzIG90aGVyIHRoYW4KK0Bjb2Rley1yfSkuCisKK0BpdGVtIERBVEFfQUxJR05NRU5UCitUaGlzIHdpbGwgYmUgc2V0IHRvIGFuIEBjb2Rle0FMSUdOfSBleHByZXNzaW9uIHdoZW4gdGhlIG91dHB1dCBzaG91bGQgYmUKK3BhZ2UgYWxpZ25lZCwgb3IgdG8gQHNhbXB7Ln0gd2hlbiBnZW5lcmF0aW5nIHRoZSBAY29kZXstTn0gc2NyaXB0LgorCitAaXRlbSBDUkVBVEVfU0hMSUIKK1RoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gZ2VuZXJhdGluZyBhIEBjb2Rley1zaGFyZWR9CitzY3JpcHQuCitAZW5kIHRhYmxlCisKK1RoZSBjb252ZW50aW9uYWwgd2F5IHRvIHdyaXRlIGEgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcyB0byBmaXJzdAorc2V0IGEgZmV3IHNoZWxsIHZhcmlhYmxlcywgYW5kIHRoZW4gd3JpdGUgb3V0IGEgbGlua2VyIHNjcmlwdCB1c2luZworQGNvZGV7Y2F0fSB3aXRoIGEgaGVyZSBkb2N1bWVudC4gIFRoZSBsaW5rZXIgc2NyaXB0IHdpbGwgdXNlIHZhcmlhYmxlCitzdWJzdGl0dXRpb25zLCBiYXNlZCBvbiB0aGUgYWJvdmUgdmFyaWFibGVzIGFuZCB0aG9zZSBzZXQgaW4gdGhlCitAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQsIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ci4KKworV2hlbiB0aGVyZSBhcmUgcGFydHMgb2YgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgd2hpY2ggc2hvdWxkIG9ubHkKK2JlIHJ1biB3aGVuIGRvaW5nIGEgZmluYWwgcmVsb2NhdGlvbiwgdGhleSBzaG91bGQgYmUgZW5jbG9zZWQgd2l0aGluIGEKK3ZhcmlhYmxlIHN1YnN0aXR1dGlvbiBiYXNlZCBvbiBAY29kZXtSRUxPQ0FUSU5HfS4gIEZvciBleGFtcGxlLCBvbiBtYW55Cit0YXJnZXRzIHNwZWNpYWwgc3ltYm9scyBzdWNoIGFzIEBjb2Rle19lbmR9IHNob3VsZCBiZSBkZWZpbmVkIHdoZW4gZG9pbmcKK2EgZmluYWwgbGluay4gIE5hdHVyYWxseSwgdGhvc2Ugc3ltYm9scyBzaG91bGQgbm90IGJlIGRlZmluZWQgd2hlbiBkb2luZworYSByZWxvY2F0ZWFibGUgbGluayB1c2luZyBAY29kZXstcn0uICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdAorY291bGQgdXNlIGEgY29uc3RydWN0IGxpa2UgdGhpcyB0byBkZWZpbmUgdGhvc2Ugc3ltYm9sczoKK0BzbWFsbGV4YW1wbGUKKyAgJEB7UkVMT0NBVElORysgX2VuZCA9IC47QH0KK0BlbmQgc21hbGxleGFtcGxlCitUaGlzIHdpbGwgZG8gdGhlIHN5bWJvbCBhc3NpZ25tZW50IG9ubHkgaWYgdGhlIEBjb2Rle1JFTE9DQVRJTkd9Cit2YXJpYWJsZSBpcyBkZWZpbmVkLgorCitUaGUgYmFzaWMgam9iIG9mIHRoZSBsaW5rZXIgc2NyaXB0IGlzIHRvIHB1dCB0aGUgc2VjdGlvbnMgaW4gdGhlIGNvcnJlY3QKK29yZGVyLCBhbmQgYXQgdGhlIGNvcnJlY3QgbWVtb3J5IGFkZHJlc3Nlcy4gIEZvciBzb21lIHRhcmdldHMsIHRoZQorbGlua2VyIHNjcmlwdCBtYXkgaGF2ZSB0byBkbyBzb21lIG90aGVyIG9wZXJhdGlvbnMuCisKK0ZvciBleGFtcGxlLCBvbiBtb3N0IE1JUFMgcGxhdGZvcm1zLCB0aGUgbGlua2VyIGlzIHJlc3BvbnNpYmxlIGZvcgorZGVmaW5pbmcgdGhlIHNwZWNpYWwgc3ltYm9sIEBjb2Rle19ncH0sIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUKK0Bjb2RleyRncH0gcmVnaXN0ZXIuICBJdCBtdXN0IGJlIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHNtYWxsIGRhdGEKK3NlY3Rpb24gcGx1cyBAY29kZXsweDgwMDB9LiAgTmF0dXJhbGx5LCBpdCBzaG91bGQgb25seSBiZSBkZWZpbmVkIHdoZW4KK2RvaW5nIGEgZmluYWwgcmVsb2NhdGlvbi4gIFRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgZG9uZSBsaWtlIHRoaXM6CitAc21hbGxleGFtcGxlCisgICRAe1JFTE9DQVRJTkcrIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtAfQorQGVuZCBzbWFsbGV4YW1wbGUKK1RoaXMgbGluZSB3b3VsZCBhcHBlYXIganVzdCBiZWZvcmUgdGhlIHNlY3Rpb25zIHdoaWNoIGNvbXBvc2UgdGhlIHNtYWxsCitkYXRhIHNlY3Rpb24gKEBzYW1wey5zZGF0YX0sIEBzYW1wey5zYnNzfSkuICBBbGwgdGhvc2Ugc2VjdGlvbnMgd291bGQgYmUKK2NvbnRpZ3VvdXMgaW4gbWVtb3J5LgorCitNYW55IENPRkYgc3lzdGVtcyBidWlsZCBjb25zdHJ1Y3RvciB0YWJsZXMgaW4gdGhlIGxpbmtlciBzY3JpcHQuICBUaGUKK2NvbXBpbGVyIHdpbGwgYXJyYW5nZSB0byBvdXRwdXQgdGhlIGFkZHJlc3Mgb2YgZWFjaCBnbG9iYWwgY29uc3RydWN0b3IKK2luIGEgQHNhbXB7LmN0b3J9IHNlY3Rpb24sIGFuZCB0aGUgYWRkcmVzcyBvZiBlYWNoIGdsb2JhbCBkZXN0cnVjdG9yIGluCithIEBzYW1wey5kdG9yfSBzZWN0aW9uICh0aGlzIGlzIGRvbmUgYnkgZGVmaW5pbmcKK0Bjb2Rle0FTTV9PVVRQVVRfQ09OU1RSVUNUT1J9IGFuZCBAY29kZXtBU01fT1VUUFVUX0RFU1RSVUNUT1J9IGluIHRoZQorQGNvZGV7Z2NjfSBjb25maWd1cmF0aW9uIGZpbGVzKS4gIFRoZSBAY29kZXtnY2N9IHJ1bnRpbWUgc3VwcG9ydAorcm91dGluZXMgZXhwZWN0IHRoZSBjb25zdHJ1Y3RvciB0YWJsZSB0byBiZSBuYW1lZCBAY29kZXtfX0NUT1JfTElTVF9ffS4KK1RoZXkgZXhwZWN0IGl0IHRvIGJlIGEgbGlzdCBvZiB3b3Jkcywgd2l0aCB0aGUgZmlyc3Qgd29yZCBiZWluZyB0aGUKK2NvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcy4gIFRoZXJlIHNob3VsZCBiZSBhIHRyYWlsaW5nIHplcm8gd29yZC4KKyhBY3R1YWxseSwgdGhlIGNvdW50IG1heSBiZSAtMSBpZiB0aGUgdHJhaWxpbmcgd29yZCBpcyBwcmVzZW50LCBhbmQgdGhlCit0cmFpbGluZyB3b3JkIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb3VudCBpcyBjb3JyZWN0LCBidXQsIGFzIHRoZQorQGNvZGV7Z2NjfSBiZWhhdmlvdXIgaGFzIGNoYW5nZWQgc2xpZ2h0bHkgb3ZlciB0aGUgeWVhcnMsIGl0IGlzIHNhZmVzdAordG8gcHJvdmlkZSBib3RoKS4gIEhlcmUgaXMgYSB0eXBpY2FsIHdheSB0aGF0IG1pZ2h0IGJlIGhhbmRsZWQgaW4gYQorQGZpbGV7c2NyaXB0dGVtcGx9IGZpbGUuCitAc21hbGxleGFtcGxlCisgICAgJEB7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjtAfQorICAgICRAe0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMilAfQorICAgICRAe0NPTlNUUlVDVElORysgKiguY3RvcnMpQH0KKyAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoMClAfQorICAgICRAe0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjtAfQorICAgICRAe0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47QH0KKyAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpQH0KKyAgICAkQHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKUB9CisgICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKDApQH0KKyAgICAkQHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47QH0KK0BlbmQgc21hbGxleGFtcGxlCitUaGUgdXNlIG9mIEBjb2Rle0NPTlNUUlVDVElOR30gZW5zdXJlcyB0aGF0IHRoZXNlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKK3dpbGwgb25seSBhcHBlYXIgd2hlbiB0aGUgbGlua2VyIGlzIHN1cHBvc2VkIHRvIGJlIGJ1aWxkaW5nIHRoZQorY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzLiAgVGhpcyBleGFtcGxlIGlzIHdyaXR0ZW4gZm9yIGEgdGFyZ2V0Cit3aGljaCB1c2VzIDQgYnl0ZSBwb2ludGVycy4KKworRW1iZWRkZWQgc3lzdGVtcyBvZnRlbiBuZWVkIHRvIHNldCBhIHN0YWNrIGFkZHJlc3MuICBUaGlzIGlzIG5vcm1hbGx5CitiZXN0IGRvbmUgYnkgdXNpbmcgdGhlIEBjb2Rle1BST1ZJREV9IGNvbnN0cnVjdCB3aXRoIGEgZGVmYXVsdCBzdGFjaworYWRkcmVzcy4gIFRoaXMgcGVybWl0cyB0aGUgdXNlciB0byBlYXNpbHkgb3ZlcnJpZGUgdGhlIHN0YWNrIGFkZHJlc3MKK3VzaW5nIHRoZSBAY29kZXstLWRlZnN5bX0gb3B0aW9uLiAgSGVyZSBpcyBhbiBleGFtcGxlOgorQHNtYWxsZXhhbXBsZQorICAkQHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX3N0YWNrID0gMHg4MDAwMDAwMCk7QH0KK0BlbmQgc21hbGxleGFtcGxlCitUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtfX3N0YWNrfSB3b3VsZCB0aGVuIGJlIHVzZWQgaW4gdGhlIHN0YXJ0dXAKK2NvZGUgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgcG9pbnRlci4KKworQG5vZGUgbGlua2VyIGVtdWxhdGlvbnMKK0BzZWN0aW9uIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cworCitFYWNoIGxpbmtlciB0YXJnZXQgdXNlcyBhbiBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCB0byBnZW5lcmF0ZSB0aGUKK2VtdWxhdGlvbiBjb2RlLiAgVGhlIG5hbWUgb2YgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzIHNldCBieSB0aGUKK0Bjb2Rle1RFTVBMQVRFX05BTUV9IHZhcmlhYmxlIGluIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHQuICBJZiB0aGUKK0Bjb2Rle1RFTVBMQVRFX05BTUV9IHZhcmlhYmxlIGlzIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGlzCitAc2FtcHtnZW5lcmljfS4gIElmIHRoZSB2YWx1ZSBvZiBAY29kZXtURU1QTEFURV9OQU1FfSBpcyBAdmFye3RlbXBsYXRlfSwKK0BmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgdXNlIEBmaWxle2VtdWx0ZW1wbC9AdmFye3RlbXBsYXRlfS5lbX0uCisKK01vc3QgdGFyZ2V0cyB1c2UgdGhlIGdlbmVyaWMgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQsCitAZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0uICBBIGRpZmZlcmVudCBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBpcworb25seSBuZWVkZWQgaWYgdGhlIGxpbmtlciBtdXN0IHN1cHBvcnQgdW51c3VhbCBhY3Rpb25zLCBzdWNoIGFzIGxpbmtpbmcKK2FnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4KKworVGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzIG5vcm1hbGx5IHdyaXR0ZW4gYXMgYSBzaW1wbGUgaW52b2NhdGlvbgorb2YgQGNvZGV7Y2F0fSB3aXRoIGEgaGVyZSBkb2N1bWVudC4gIFRoZSBkb2N1bWVudCB3aWxsIHVzZSBhIGZldwordmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIFR5cGljYWxseSBlYWNoIGZ1bmN0aW9uIG5hbWVzIHVzZXMgYQorc3Vic3RpdHV0aW9uIGludm9sdmluZyBAY29kZXtFTVVMQVRJT05fTkFNRX0sIGZvciBlYXNlIG9mIGRlYnVnZ2luZyB3aGVuCit0aGUgbGlua2VyIHN1cHBvcnRzIG11bHRpcGxlIGVtdWxhdGlvbnMuCisKK0V2ZXJ5IGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBpbiB0aGUgZW1pdHRlZCBmaWxlIHNob3VsZCBiZSBzdGF0aWMuICBUaGUKK29ubHkgZ2xvYmFsbHkgdmlzaWJsZSBvYmplY3QgbXVzdCBiZSBuYW1lZAorQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufSwgd2hlcmUgQHZhcntFTVVMQVRJT05fTkFNRX0gaXMKK3RoZSBuYW1lIG9mIHRoZSBlbXVsYXRpb24gc2V0IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9ICh0aGlzIGlzIGFsc28gdGhlCituYW1lIG9mIHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlIHdpdGhvdXQgdGhlIEBmaWxley5zaH0gZXh0ZW5zaW9uKS4KK1RoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlCitAY29kZXtFTVVMQVRJT05fTkFNRX0gYmVmb3JlIGludm9raW5nIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdC4KKworVGhlIEBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbn0gdmFyaWFibGUgbXVzdCBiZSBhCitAY29kZXtzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0fSwgYXMgZGVmaW5lZCBpbiBAZmlsZXtsZGVtdWwuaH0uCitJdCBkZWZpbmVzIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZSBpbnZva2VkIGJ5IHRoZSBsaW5rZXIsCithcyB3ZWxsIGFzIHN0cmluZ3MgZm9yIHRoZSBlbXVsYXRpb24gbmFtZSAobm9ybWFsbHkgc2V0IGZyb20gdGhlIHNoZWxsCit2YXJpYWJsZSBAY29kZXtFTVVMQVRJT05fTkFNRX0gYW5kIHRoZSBkZWZhdWx0IEJGRCB0YXJnZXQgbmFtZSAobm9ybWFsbHkKK3NldCBmcm9tIHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aGljaCBpcyBub3JtYWxseSBzZXQKK2J5IHRoZSBAZmlsZXtlbXVscGFyYW1zfSBmaWxlKS4KKworVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKK0Bjb2Rle0NPTVBJTEVfSU59IHdoZW4gaXQgaW52b2tlcyB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgZm9yIHRoZQorZGVmYXVsdCBlbXVsYXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBzaG91bGQKK2luY2x1ZGUgdGhlIGxpbmtlciBzY3JpcHRzIGRpcmVjdGx5LCBhbmQgcmV0dXJuIHRoZW0gZnJvbSB0aGUKK0Bjb2Rle2dldF9zY3JpcHRzfSBlbnRyeSBwb2ludC4gIFdoZW4gdGhlIGVtdWxhdGlvbiBpcyBub3QgdGhlIGRlZmF1bHQsCit0aGUgQGNvZGV7Z2V0X3NjcmlwdHN9IGVudHJ5IHBvaW50IHNob3VsZCBqdXN0IHJldHVybiBhIGZpbGUgbmFtZS4gIFNlZQorQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIGlzIGRvbmUuCisKK0F0IHNvbWUgcG9pbnQsIHRoZSBsaW5rZXIgZW11bGF0aW9uIGVudHJ5IHBvaW50cyBzaG91bGQgYmUgZG9jdW1lbnRlZC4KKworQG5vZGUgRW11bGF0aW9uIFdhbGt0aHJvdWdoCitAY2hhcHRlciBBIFdhbGt0aHJvdWdoIG9mIGEgVHlwaWNhbCBFbXVsYXRpb24KKworVGhpcyBjaGFwdGVyIGlzIHRvIGhlbHAgcGVvcGxlIHdobyBhcmUgbmV3IHRvIHRoZSB3YXkgZW11bGF0aW9ucworaW50ZXJhY3Qgd2l0aCB0aGUgbGlua2VyLCBvciB3aG8gYXJlIHN1ZGRlbmx5IHRocnVzdCBpbnRvIHRoZSBwb3NpdGlvbgorb2YgaGF2aW5nIHRvIHdvcmsgd2l0aCBleGlzdGluZyBlbXVsYXRpb25zLiAgSXQgd2lsbCBkaXNjdXNzIHRoZSBmaWxlcworeW91IG5lZWQgdG8gYmUgYXdhcmUgb2YuICBJdCB3aWxsIHRlbGwgeW91IHdoZW4gdGhlIGdpdmVuICJob29rcyIgaW4KK3RoZSBlbXVsYXRpb24gd2lsbCBiZSBjYWxsZWQuICBJdCB3aWxsLCBob3BlZnVsbHksIGdpdmUgeW91IGVub3VnaAoraW5mb3JtYXRpb24gYWJvdXQgd2hlbiBhbmQgaG93IHRoaW5ncyBoYXBwZW4gdGhhdCB5b3UnbGwgYmUgYWJsZSB0bworZ2V0IGJ5LiAgQXMgYWx3YXlzLCB0aGUgc291cmNlIGlzIHRoZSBkZWZpbml0aXZlIHJlZmVyZW5jZSB0byB0aGlzLgorCitUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBsaW5rZXIgaXMgaW4gQGZpbGV7bGRtYWluLmN9IHdoZXJlCitAY29kZXttYWlufSBpcyBkZWZpbmVkLiAgVGhlIGJ1bGsgb2YgdGhlIGNvZGUgdGhhdCdzIGVtdWxhdGlvbgorc3BlY2lmaWMgd2lsbCBpbml0aWFsbHkgYmUgaW4gQGNvZGV7ZW11bHRlbXBsL0B2YXJ7ZW11bGF0aW9ufS5lbX0gYnV0Cit3aWxsIGVuZCB1cCBpbiBAY29kZXtlQHZhcntlbXVsYXRpb259LmN9IHdoZW4gdGhlIGJ1aWxkIGlzIGRvbmUuCitNb3N0IG9mIHRoZSB3b3JrIHRvIHNlbGVjdCBhbmQgaW50ZXJmYWNlIHdpdGggZW11bGF0aW9ucyBpcyBpbgorQGNvZGV7bGRlbXVsLmh9IGFuZCBAY29kZXtsZGVtdWwuY30uICBTcGVjaWZpY2FsbHksIEBjb2Rle2xkZW11bC5ofQorZGVmaW5lcyB0aGUgQGNvZGV7bGRfZW11bGF0aW9uX3hmZXJfc3RydWN0fSBzdHJ1Y3R1cmUgeW91ciBlbXVsYXRpb24KK2V4cG9ydHMuCisKK1lvdXIgZW11bGF0aW9uIGZpbGUgZXhwb3J0cyBhIHN5bWJvbAorQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufS4gIElmIHlvdXIgZW11bGF0aW9uIGlzCitzZWxlY3RlZCAoaXQgdXN1YWxseSBpcywgc2luY2UgdXN1YWxseSB0aGVyZSdzIG9ubHkgb25lKSwKK0Bjb2Rle2xkZW11bC5jfSBzZXRzIHRoZSB2YXJpYWJsZSBAdmFye2xkX2VtdWxhdGlvbn0gdG8gcG9pbnQgdG8gaXQuCitAY29kZXtsZGVtdWwuY30gYWxzbyBkZWZpbmVzIGEgbnVtYmVyIG9mIEFQSSBmdW5jdGlvbnMgdGhhdCBpbnRlcmZhY2UKK3RvIHlvdXIgZW11bGF0aW9uLCBsaWtlIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0gd2hpY2ggc2ltcGx5IGNhbGxzCit5b3VyIEBjb2Rle2xkX0B2YXJ7RU1VTEFUSU9OfV9lbXVsYXRpb24uYWZ0ZXJfcGFyc2V9IGZ1bmN0aW9uLiAgRm9yCit0aGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24sIHRoZSBmdW5jdGlvbnMgd2lsbCBiZSBtZW50aW9uZWQsIGJ1dCB5b3UKK3Nob3VsZCBhc3N1bWUgdGhlIGluZGlyZWN0IHJlZmVyZW5jZSB0byB5b3VyIGVtdWxhdGlvbiBhbHNvLgorCitXZSB3aWxsIGFsc28gc2tpcCBvciBnbG9zcyBvdmVyIHBhcnRzIG9mIHRoZSBsaW5rIHByb2Nlc3MgdGhhdCBkb24ndAorcmVsYXRlIHRvIGVtdWxhdGlvbnMsIGxpa2Ugc2V0dGluZyB1cCBpbnRlcm5hdGlvbmFsaXphdGlvbi4KKworQWZ0ZXIgaW5pdGlhbGl6YXRpb24sIEBjb2Rle21haW59IHNlbGVjdHMgYW4gZW11bGF0aW9uIGJ5IHByZS1zY2FubmluZwordGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBJdCBjYWxscyBAY29kZXtsZGVtdWxfY2hvb3NlX3RhcmdldH0gdG8KK2Nob29zZSBhIHRhcmdldC4gIElmIHlvdSBzZXQgQGNvZGV7Y2hvb3NlX3RhcmdldH0gdG8KK0Bjb2Rle2xkZW11bF9kZWZhdWx0X3RhcmdldH0sIGl0IHBpY2tzIHlvdXIgQGNvZGV7dGFyZ2V0X25hbWV9IGJ5CitkZWZhdWx0LgorCitAY29kZXttYWlufSBjYWxscyBAY29kZXtsZGVtdWxfYmVmb3JlX3BhcnNlfSwgdGhlbiBAY29kZXtwYXJzZV9hcmdzfS4KK0Bjb2Rle3BhcnNlX2FyZ3N9IGNhbGxzIEBjb2Rle2xkZW11bF9wYXJzZV9hcmdzfSBmb3IgZWFjaCBhcmcsIHdoaWNoCittdXN0IHVwZGF0ZSB0aGUgQGNvZGV7Z2V0b3B0fSBnbG9iYWxzIGlmIGl0IHJlY29nbml6ZXMgdGhlIGFyZ3VtZW50LgorSWYgdGhlIGVtdWxhdGlvbiBkb2Vzbid0IHJlY29nbml6ZSBpdCwgdGhlbiBwYXJzZV9hcmdzIGNoZWNrcyB0byBzZWUKK2lmIGl0IHJlY29nbml6ZXMgaXQuCisKK05vdyB0aGF0IHRoZSBlbXVsYXRpb24gaGFzIGhhZCBhY2Nlc3MgdG8gYWxsIGl0cyBjb21tYW5kLWxpbmUgb3B0aW9ucywKK0Bjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9zZXRfc3ltYm9sc30uICBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbnkKK2luaXRpYWxpemF0aW9uIHRoYXQgbWF5IGJlIGFmZmVjdGVkIGJ5IG9wdGlvbnMuICBJdCBpcyBhbHNvIHN1cHBvc2VkCit0byBzZXQgdXAgYW55IHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhlIGVtdWxhdGlvbiBzY3JpcHQuCisKK0Bjb2Rle21haW59IG5vdyBjYWxscyBAY29kZXtsZGVtdWxfZ2V0X3NjcmlwdH0gdG8gZ2V0IHRoZSBlbXVsYXRpb24KK3NjcmlwdCB0byB1c2UgKGJhc2VkIG9uIGFyZ3VtZW50cywgbm8gZG91YnQsIEBweHJlZntFbXVsYXRpb25zfSkgYW5kCitydW5zIGl0LiAgV2hpbGUgcGFyc2luZywgQGNvZGV7bGRncmFtLnl9IG1heSBjYWxsIEBjb2Rle2xkZW11bF9obGx9IG9yCitAY29kZXtsZGVtdWxfc3lzbGlifSB0byBoYW5kbGUgdGhlIEBjb2Rle0hMTH0gb3IgQGNvZGV7U1lTTElCfQorY29tbWFuZHMuICBJdCBtYXkgY2FsbCBAY29kZXtsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGV9IGlmIHlvdSBhc2tlZAordGhlIGxpbmtlciB0byBsaW5rIGEgZmlsZSBpdCBkb2Vzbid0IHJlY29nbml6ZS4gIEl0IHdpbGwgY2FsbAorQGNvZGV7bGRlbXVsX3JlY29nbml6ZWRfZmlsZX0gZm9yIGVhY2ggZmlsZSBpdCBkb2VzIHJlY29nbml6ZSwgaW4gY2FzZQordGhlIGVtdWxhdGlvbiB3YW50cyB0byBoYW5kbGUgc29tZSBmaWxlcyBzcGVjaWFsbHkuICBBbGwgdGhlIHdoaWxlLAoraXQncyBsb2FkaW5nIHRoZSBmaWxlcyAocG9zc2libHkgY2FsbGluZworQGNvZGV7bGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlfSkgYW5kIHN5bWJvbHMgYW5kIHN0dWZmLiAgQWZ0ZXIgaXQncworZG9uZSByZWFkaW5nIHRoZSBzY3JpcHQsIEBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0uCitVc2UgdGhlIGFmdGVyLXBhcnNlIGhvb2sgdG8gc2V0IHVwIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzdHVmZiB0aGUKK3NjcmlwdCBtaWdodCBoYXZlIHNldCB1cCwgbGlrZSB0aGUgZW50cnkgcG9pbnQuCisKK0Bjb2Rle21haW59IG5leHQgY2FsbHMgQGNvZGV7bGFuZ19wcm9jZXNzfSBpbiBAY29kZXtsZGxhbmcuY30uICBUaGlzCithcHBlYXJzIHRvIGJlIHRoZSBtYWluIGNvcmUgb2YgdGhlIGxpbmtpbmcgaXRzZWxmLCBhcyBmYXIgYXMgZW11bGF0aW9uCitob29rcyBhcmUgY29uY2VybmVkKCopLiAgSXQgZmlyc3Qgb3BlbnMgdGhlIG91dHB1dCBmaWxlJ3MgQkZELCBjYWxsaW5nCitAY29kZXtsZGVtdWxfc2V0X291dHB1dF9hcmNofSwgYW5kIGNhbGxzCitAY29kZXtsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHN9IGluIGNhc2UgeW91IG5lZWQgdG8gdXNlCitvdGhlciBtZWFucyB0byBmaW5kIG9yIGNyZWF0ZSBvYmplY3QgZmlsZXMgKGkuZS4gc2hhcmVkIGxpYnJhcmllcworZm91bmQgb24gYSBwYXRoLCBvciBmYWtlIHN0dWIgb2JqZWN0cykuICBEZXNwaXRlIHRoZSBuYW1lLCBub2JvZHkKK2NyZWF0ZXMgb3V0cHV0IHNlY3Rpb25zIGhlcmUuCisKKygqKSBJbiBtb3N0IGNhc2VzLCB0aGUgQkZEIGxpYnJhcnkgZG9lcyB0aGUgYnVsayBvZiB0aGUgYWN0dWFsCitsaW5raW5nLCBoYW5kbGluZyBzeW1ib2wgdGFibGVzLCBzeW1ib2wgcmVzb2x1dGlvbiwgcmVsb2NhdGlvbnMsIGFuZAorYnVpbGRpbmcgdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgU2VlIHRoZSBCRkQgcmVmZXJlbmNlIGZvciBhbGwgdGhlCitkZXRhaWxzLiAgWW91ciBlbXVsYXRpb24gaXMgdXN1YWxseSBjb25jZXJuZWQgbW9yZSB3aXRoIG1hbmFnaW5nCit0aGluZ3MgYXQgdGhlIGZpbGUgYW5kIHNlY3Rpb24gbGV2ZWwsIGxpa2UgInB1dCB0aGlzIGhlcmUsIGFkZCB0aGlzCitzZWN0aW9uIiwgZXRjLgorCitOZXh0LCB0aGUgb2JqZWN0cyB0byBiZSBsaW5rZWQgYXJlIG9wZW5lZCBhbmQgQkZEcyBjcmVhdGVkIGZvciB0aGVtLAorYW5kIEBjb2Rle2xkZW11bF9hZnRlcl9vcGVufSBpcyBjYWxsZWQuICBBdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSBhbGwKK3RoZSBvYmplY3RzIGFuZCBzeW1ib2xzIGxvYWRlZCwgYnV0IG5vbmUgb2YgdGhlIGRhdGEgaGFzIGJlZW4gcGxhY2VkCit5ZXQuCisKK05leHQgY29tZXMgdGhlIEJpZyBMaW5raW5nIFRoaW5neSAoZXhjZXB0IGZvciB0aGUgcGFydHMgQkZEIGRvZXMpLgorQWxsIGlucHV0IHNlY3Rpb25zIGFyZSBtYXBwZWQgdG8gb3V0cHV0IHNlY3Rpb25zIGFjY29yZGluZyB0byB0aGUKK3NjcmlwdC4gIElmIGEgc2VjdGlvbiBkb2Vzbid0IGdldCBtYXBwZWQgYnkgZGVmYXVsdCwKK0Bjb2Rle2xkZW11bF9wbGFjZV9vcnBoYW59IHdpbGwgZ2V0IGNhbGxlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGl0IGdvZXMuCitOZXh0IGl0IGZpZ3VyZXMgb3V0IHRoZSBvZmZzZXRzIGZvciBlYWNoIHNlY3Rpb24sIGNhbGxpbmcKK0Bjb2Rle2xkZW11bF9iZWZvcmVfYWxsb2NhdGlvbn0gYmVmb3JlIGFuZAorQGNvZGV7bGRlbXVsX2FmdGVyX2FsbG9jYXRpb259IGFmdGVyIGRlY2lkaW5nIHdoZXJlIGVhY2ggaW5wdXQgc2VjdGlvbgorZW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb25zLgorCitUaGUgbGFzdCBwYXJ0IG9mIEBjb2Rle2xhbmdfcHJvY2Vzc30gaXMgdG8gZmlndXJlIG91dCBhbGwgdGhlIHN5bWJvbHMnCit2YWx1ZXMuICBBZnRlciBhc3NpZ25pbmcgZmluYWwgdmFsdWVzIHRvIHRoZSBzeW1ib2xzLAorQGNvZGV7bGRlbXVsX2ZpbmlzaH0gaXMgY2FsbGVkLCBhbmQgYWZ0ZXIgdGhhdCwgYW55IHVuZGVmaW5lZCBzeW1ib2xzCithcmUgdHVybmVkIGludG8gZmF0YWwgZXJyb3JzLgorCitPSywgYmFjayB0byBAY29kZXttYWlufSwgd2hpY2ggY2FsbHMgQGNvZGV7bGR3cml0ZX0gaW4KK0BmaWxle2xkd3JpdGUuY30uICBAY29kZXtsZHdyaXRlfSBjYWxscyBCRkQncyBmaW5hbF9saW5rLCB3aGljaCBkb2VzCithbGwgdGhlIHJlbG9jYXRpb24gZml4dXBzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCBiZmQgdG8gZGlzaywgYW5kIHdlJ3JlCitkb25lLgorCitJbiBzdW1tYXJ5LAorCitAaXRlbWl6ZSBAYnVsbGV0CisKK0BpdGVtIEBjb2Rle21haW4oKX0gaW4gQGZpbGV7bGRtYWluLmN9CitAaXRlbSBAZmlsZXtlbXVsdGVtcGwvQHZhcntFTVVMQVRJT059LmVtfSBoYXMgeW91ciBjb2RlCitAaXRlbSBAY29kZXtsZGVtdWxfY2hvb3NlX3RhcmdldH0gKGRlZmF1bHRzIHRvIHlvdXIgQGNvZGV7dGFyZ2V0X25hbWV9KQorQGl0ZW0gQGNvZGV7bGRlbXVsX2JlZm9yZV9wYXJzZX0KK0BpdGVtIFBhcnNlIGFyZ3YsIGNhbGxzIEBjb2Rle2xkZW11bF9wYXJzZV9hcmdzfSBmb3IgZWFjaAorQGl0ZW0gQGNvZGV7bGRlbXVsX3NldF9zeW1ib2xzfQorQGl0ZW0gQGNvZGV7bGRlbXVsX2dldF9zY3JpcHR9CitAaXRlbSBwYXJzZSBzY3JpcHQKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX2hsbH0gb3IgQGNvZGV7bGRlbXVsX3N5c2xpYn0KK0BpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZX0KK0BlbmQgaXRlbWl6ZQorCitAaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfcGFyc2V9CitAaXRlbSBAY29kZXtsYW5nX3Byb2Nlc3MoKX0gaW4gQGZpbGV7bGRsYW5nLmN9CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtIGNyZWF0ZSBAY29kZXtvdXRwdXRfYmZkfQorQGl0ZW0gQGNvZGV7bGRlbXVsX3NldF9vdXRwdXRfYXJjaH0KK0BpdGVtIEBjb2Rle2xkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50c30KK0BpdGVtIHJlYWQgb2JqZWN0cywgY3JlYXRlIGlucHV0IGJmZHMgLSBhbGwgc3ltYm9scyBleGlzdCwgYnV0IGhhdmUgbm8gdmFsdWVzCitAaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGV9CitAaXRlbSB3aWxsIGNhbGwgQGNvZGV7bGRlbXVsX3JlY29nbml6ZWRfZmlsZX0KK0BpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9vcGVufQorQGl0ZW0gbWFwIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucworQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX3BsYWNlX29ycGhhbn0gZm9yIHJlbWFpbmluZyBzZWN0aW9ucworQGl0ZW0gQGNvZGV7bGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9ufQorQGl0ZW0gZ2l2ZXMgaW5wdXQgc2VjdGlvbnMgb2Zmc2V0cyBpbnRvIG91dHB1dCBzZWN0aW9ucywgcGxhY2VzIG91dHB1dCBzZWN0aW9ucworQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX2FsbG9jYXRpb259IC0gc2VjdGlvbiBhZGRyZXNzZXMgdmFsaWQKK0BpdGVtIGFzc2lnbnMgdmFsdWVzIHRvIHN5bWJvbHMKK0BpdGVtIEBjb2Rle2xkZW11bF9maW5pc2h9IC0gc3ltYm9sIHZhbHVlcyB2YWxpZAorQGVuZCBpdGVtaXplCisKK0BpdGVtIG91dHB1dCBiZmQgaXMgd3JpdHRlbiB0byBkaXNrCisKK0BlbmQgaXRlbWl6ZQorCitAY29udGVudHMKK0BieWUKZGlmZiAtLWdpdCBhL2xkL2xkbGFuZy5jIGIvbGQvbGRsYW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1YzY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xkL2xkbGFuZy5jCkBAIC0wLDAgKzEsNDcwMyBAQAorLyogTGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2Ugc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKyNpbmNsdWRlICJsZGxleC5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkY3Rvci5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImZubWF0Y2guaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogRk9SV0FSRFMgKi8KK3N0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXdfc3RhdGVtZW50IFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0sCisJCQkJCQkJIHNpemVfdCwKKwkJCQkJCQkgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOworCisKKy8qIExPQ0FMUyAqLworc3RhdGljIHN0cnVjdCBvYnN0YWNrIHN0YXRfb2JzdGFjazsKKworI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKKyNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIGZyZWUKK3N0YXRpYyBDT05TVCBjaGFyICpzdGFydHVwX2ZpbGU7CitzdGF0aWMgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGlucHV0X2ZpbGVfY2hhaW47CitzdGF0aWMgYm9vbGVhbiBwbGFjZWRfY29tbW9ucyA9IGZhbHNlOworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmRlZmF1bHRfY29tbW9uX3NlY3Rpb247CitzdGF0aWMgYm9vbGVhbiBtYXBfb3B0aW9uX2Y7CitzdGF0aWMgYmZkX3ZtYSBwcmludF9kb3Q7CitzdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlyc3RfZmlsZTsKK3N0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7CitzdGF0aWMgQ09OU1QgY2hhciAqY3VycmVudF90YXJnZXQ7CitzdGF0aWMgQ09OU1QgY2hhciAqb3V0cHV0X3RhcmdldDsKK3N0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgc3RhdGVtZW50X2xpc3Q7CitzdGF0aWMgc3RydWN0IGxhbmdfcGhkciAqbGFuZ19waGRyX2xpc3Q7CisKK3N0YXRpYyB2b2lkIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgorICBQQVJBTVMgKCh2b2lkICgqZnVuYykgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiksCisJICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcykpOworc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKm5ld19hZmlsZQorICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKKwkgICBjb25zdCBjaGFyICp0YXJnZXQsIGJvb2xlYW4gYWRkX3RvX2xpc3QpKTsKK3N0YXRpYyB2b2lkIGluaXRfb3MgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcykpOworc3RhdGljIHZvaWQgZXhwX2luaXRfb3MgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIHdpbGRjYXJkcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp3aWxkX3NvcnQKKyAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKKwkgICBhc2VjdGlvbiAqKSk7CitzdGF0aWMgdm9pZCB3aWxkX3NlY3Rpb24gUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHIsCisJCQkJICBjb25zdCBjaGFyICpzZWN0aW9uLAorCQkJCSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZSwKKwkJCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCkpOworc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmxvb2t1cF9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKK3N0YXRpYyB2b2lkIGxvYWRfc3ltYm9scyBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeSwKKwkJCQkgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqKSk7CitzdGF0aWMgdm9pZCB3aWxkX2ZpbGUgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCisJCQkgICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSk7CitzdGF0aWMgdm9pZCB3aWxkIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcywKKwkJCSAgY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqZmlsZSwKKwkJCSAgY29uc3QgY2hhciAqdGFyZ2V0LAorCQkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXQpKTsKK3N0YXRpYyBiZmQgKm9wZW5fb3V0cHV0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKK3N0YXRpYyB2b2lkIGxkbGFuZ19vcGVuX291dHB1dCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGF0ZW1lbnQpKTsKK3N0YXRpYyB2b2lkIG9wZW5faW5wdXRfYmZkcworICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGF0ZW1lbnQsIGJvb2xlYW4pKTsKK3N0YXRpYyB2b2lkIGxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBsYW5nX3BsYWNlX3VuZGVmaW5lZHMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucworICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAorCSAgIGNvbnN0IGNoYXIgKnRhcmdldCwKKwkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpKTsKK3N0YXRpYyB2b2lkIHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAorICBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpKTsKK3N0YXRpYyB2b2lkIHByaW50X2Fzc2lnbm1lbnQKKyAgUEFSQU1TICgobGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICphc3NpZ25tZW50LAorCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uKSk7CitzdGF0aWMgdm9pZCBwcmludF9pbnB1dF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqc3RhdG0pKTsKK3N0YXRpYyBib29sZWFuIHByaW50X29uZV9zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7CitzdGF0aWMgdm9pZCBwcmludF9pbnB1dF9zZWN0aW9uIFBBUkFNUyAoKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICppbikpOworc3RhdGljIHZvaWQgcHJpbnRfZmlsbF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19maWxsX3N0YXRlbWVudF90eXBlICpmaWxsKSk7CitzdGF0aWMgdm9pZCBwcmludF9kYXRhX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgKmRhdGEpKTsKK3N0YXRpYyB2b2lkIHByaW50X2FkZHJlc3Nfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBwcmludF9yZWxvY19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcmVsb2MpKTsKK3N0YXRpYyB2b2lkIHByaW50X3BhZGRpbmdfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSAqcykpOworc3RhdGljIHZvaWQgcHJpbnRfd2lsZF9zdGF0ZW1lbnQKKyAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICp3LAorCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7CitzdGF0aWMgdm9pZCBwcmludF9ncm91cAorICBQQVJBTVMgKChsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICosIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikpOworc3RhdGljIHZvaWQgcHJpbnRfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCisJCQkJICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcykpOworc3RhdGljIHZvaWQgcHJpbnRfc3RhdGVtZW50X2xpc3QgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKKwkJCQkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcykpOworc3RhdGljIHZvaWQgcHJpbnRfc3RhdGVtZW50cyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYmZkX3ZtYSBpbnNlcnRfcGFkIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip0aGlzX3B0ciwKKwkJCQkgICBmaWxsX3R5cGUgZmlsbCwgdW5zaWduZWQgaW50IHBvd2VyLAorCQkJCSAgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkJICAgYmZkX3ZtYSBkb3QpKTsKK3N0YXRpYyBiZmRfdm1hIHNpemVfaW5wdXRfc2VjdGlvbgorICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqdGhpc19wdHIsCisJICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAorCSAgIGZpbGxfdHlwZSBmaWxsLCBiZmRfdm1hIGRvdCwgYm9vbGVhbiByZWxheCkpOworc3RhdGljIHZvaWQgbGFuZ19maW5pc2ggUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgaWdub3JlX2JmZF9lcnJvcnMgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKK3N0YXRpYyB2b2lkIGxhbmdfY2hlY2sgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbGFuZ19jb21tb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIGJvb2xlYW4gbGFuZ19vbmVfY29tbW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOworc3RhdGljIHZvaWQgbGFuZ19wbGFjZV9vcnBoYW5zIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgdG9wb3dlciBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIGxhbmdfc2V0X3N0YXJ0b2YgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcmVzZXRfbWVtb3J5X3JlZ2lvbnMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbGFuZ19yZWNvcmRfcGhkcnMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbGFuZ19nY193aWxkX3NlY3Rpb24KKyAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKKwkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGxhbmdfZ2Nfd2lsZF9maWxlCisgIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLCBjb25zdCBjaGFyICosCisJICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBsYW5nX2djX3dpbGQKKyAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zXzEgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyBQQVJBTVMgKCh2b2lkKSk7CisJCQkJCQorCisvKiBFWFBPUlRTICovCitsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICphYnNfb3V0cHV0X3NlY3Rpb247CitsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OworbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW4gPSB7IDAgfTsKK2NvbnN0IGNoYXIgKmVudHJ5X3N5bWJvbCA9IE5VTEw7Citib29sZWFuIGVudHJ5X2Zyb21fY21kbGluZTsKK2Jvb2xlYW4gbGFuZ19oYXNfaW5wdXRfZmlsZSA9IGZhbHNlOworYm9vbGVhbiBoYWRfb3V0cHV0X2ZpbGVuYW1lID0gZmFsc2U7Citib29sZWFuIGxhbmdfZmxvYXRfZmxhZyA9IGZhbHNlOworYm9vbGVhbiBkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSA9IGZhbHNlOworc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5vY3Jvc3NyZWZfbGlzdDsKKworZXRyZWVfdHlwZSAqYmFzZTsgLyogUmVsb2NhdGlvbiBiYXNlIC0gb3IgbnVsbCAqLworCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQorI2RlZmluZSBjYXQoYSxiKSBhIyNiCisjZWxzZQorI2RlZmluZSBjYXQoYSxiKSBhLyoqL2IKKyNlbmRpZgorCisjZGVmaW5lIG5ld19zdGF0KHgseSkgKGNhdCh4LF90eXBlKSopIG5ld19zdGF0ZW1lbnQoY2F0KHgsX2VudW0pLCBzaXplb2YoY2F0KHgsX3R5cGUpKSx5KQorCisjZGVmaW5lIG91dHNpZGVfc2VjdGlvbl9hZGRyZXNzKHEpICggKHEpLT5vdXRwdXRfb2Zmc2V0ICsgKHEpLT5vdXRwdXRfc2VjdGlvbi0+dm1hKQorCisjZGVmaW5lIG91dHNpZGVfc3ltYm9sX2FkZHJlc3MocSkgKChxKS0+dmFsdWUgKyAgIG91dHNpZGVfc2VjdGlvbl9hZGRyZXNzKHEtPnNlY3Rpb24pKQorCisjZGVmaW5lIFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIICgxNikKKworUFRSCitzdGF0X2FsbG9jIChzaXplKQorICAgICBzaXplX3Qgc2l6ZTsKK3sKKyAgcmV0dXJuIG9ic3RhY2tfYWxsb2MgKCZzdGF0X29ic3RhY2ssIHNpemUpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgd2Fsa3MgdGhlIHBhcnNlIHRyZWUgYW5kIGNhbGxzIHRoZSBwcm92aWRlZAorICBmdW5jdGlvbiBmb3IgZWFjaCBub2RlCisqLworCitzdGF0aWMgdm9pZAorbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLCBzKQorICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Cit7CisgIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGZ1bmMgKHMpOworCisgICAgICBzd2l0Y2ggKHMtPmhlYWRlci50eXBlKQorCXsKKwljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgorCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLCBjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgorCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyCisJICAgIChmdW5jLAorCSAgICAgcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06CisJICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIKKwkgICAgKGZ1bmMsCisJICAgICBzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKKwkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlciAoZnVuYywKKwkJCQkJICBzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7CisJICBicmVhazsKKwljYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtOgorCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgorCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bToKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBGQUlMICgpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKwordm9pZAorbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGZ1bmMpCisgICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKK3sKKyAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLAorCQkJCSAgc3RhdGVtZW50X2xpc3QuaGVhZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCitsYW5nX2xpc3RfaW5pdCAobGlzdCkKKyAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpsaXN0OworeworICBsaXN0LT5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKKyAgbGlzdC0+dGFpbCA9ICZsaXN0LT5oZWFkOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBidWlsZCBhIG5ldyBzdGF0ZW1lbnQgbm9kZSBmb3IgdGhlIHBhcnNlIHRyZWUKKworICovCisKK3N0YXRpYworbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqCituZXdfc3RhdGVtZW50ICh0eXBlLCBzaXplLCBsaXN0KQorICAgICBlbnVtIHN0YXRlbWVudF9lbnVtIHR5cGU7CisgICAgIHNpemVfdCBzaXplOworICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKiBsaXN0OworeworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXcgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKQorICBzdGF0X2FsbG9jIChzaXplKTsKKworICBuZXctPmhlYWRlci50eXBlID0gdHlwZTsKKyAgbmV3LT5oZWFkZXIubmV4dCA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7CisgIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAobGlzdCwgbmV3LCAmbmV3LT5oZWFkZXIubmV4dCk7CisgIHJldHVybiBuZXc7Cit9CisKKy8qCisgIEJ1aWxkIGEgbmV3IGlucHV0IGZpbGUgbm9kZSBmb3IgdGhlIGxhbmd1YWdlLiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzCisgIGluIHdoaWNoIHdlIHRyZWF0IGFuIGlucHV0IGZpbGUsIGVnLCB3ZSBvbmx5IGxvb2sgYXQgc3ltYm9scywgb3IKKyAgcHJlZml4IGl0IHdpdGggYSAtbCBldGMuCisKKyAgV2UgY2FuIGJlIHN1cHBsaWVkIHdpdGggcmVxdWVzdHMgZm9yIGlucHV0IGZpbGVzIG1vcmUgdGhhbiBvbmNlOworICB0aGV5IG1heSwgZm9yIGV4YW1wbGUgYmUgc3BsaXQgb3ZlciBzZXJ2ZXJhbCBsaW5lcyBsaWtlIGZvby5vKC50ZXh0KQorICBmb28ubyguZGF0YSkgZXRjLCBzbyB3aGVuIGFza2VkIGZvciBhIGZpbGUgd2UgY2hlY2sgdGhhdCB3ZSBoYXZuJ3QKKyAgZ290IGl0IGFscmVhZHkgc28gd2UgZG9uJ3QgZHVwbGljYXRlIHRoZSBiZmQuCisKKyAqLworc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKgorbmV3X2FmaWxlIChuYW1lLCBmaWxlX3R5cGUsIHRhcmdldCwgYWRkX3RvX2xpc3QpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7CisgICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlOworICAgICBDT05TVCBjaGFyICp0YXJnZXQ7CisgICAgIGJvb2xlYW4gYWRkX3RvX2xpc3Q7Cit7CisgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnA7CisKKyAgaWYgKGFkZF90b19saXN0KQorICAgIHAgPSBuZXdfc3RhdCAobGFuZ19pbnB1dF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHAgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKKwkgICBzdGF0X2FsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7CisgICAgICBwLT5oZWFkZXIubmV4dCA9IE5VTEw7CisgICAgfQorCisgIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSB0cnVlOworICBwLT50YXJnZXQgPSB0YXJnZXQ7CisgIHN3aXRjaCAoZmlsZV90eXBlKQorICAgIHsKKyAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19zeW1ib2xzX29ubHlfZW51bToKKyAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKKyAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKKyAgICAgIHAtPnJlYWwgPSB0cnVlOworICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOworICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSB0cnVlOworICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtOgorICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOworICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOworICAgICAgcC0+cmVhbCA9IGZhbHNlOworICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOworICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKKyAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bToKKyAgICAgIHAtPmlzX2FyY2hpdmUgPSB0cnVlOworICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOworICAgICAgcC0+cmVhbCA9IHRydWU7CisgICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IGNvbmNhdCAoIi1sIiwgbmFtZSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7CisgICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOworICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bToKKyAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKKyAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKKyAgICAgIHAtPnJlYWwgPSBmYWxzZTsKKyAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKKyAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7CisgICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW06CisgICAgICBwLT5maWxlbmFtZSA9IG5hbWU7CisgICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7CisgICAgICBwLT5yZWFsID0gdHJ1ZTsKKyAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKKyAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7CisgICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bToKKyAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKKyAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKKyAgICAgIHAtPnJlYWwgPSB0cnVlOworICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOworICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKKyAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGQUlMICgpOworICAgIH0KKyAgcC0+dGhlX2JmZCA9IChiZmQgKikgTlVMTDsKKyAgcC0+YXN5bWJvbHMgPSAoYXN5bWJvbCAqKikgTlVMTDsKKyAgcC0+bmV4dF9yZWFsX2ZpbGUgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOworICBwLT5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKKyAgcC0+c3ltYm9sX2NvdW50ID0gMDsKKyAgcC0+ZHluYW1pYyA9IGNvbmZpZy5keW5hbWljX2xpbms7CisgIHAtPndob2xlX2FyY2hpdmUgPSB3aG9sZV9hcmNoaXZlOworICBwLT5sb2FkZWQgPSBmYWxzZTsKKyAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmaW5wdXRfZmlsZV9jaGFpbiwKKwkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBwLAorCQkJICZwLT5uZXh0X3JlYWxfZmlsZSk7CisgIHJldHVybiBwOworfQorCitsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKK2xhbmdfYWRkX2lucHV0X2ZpbGUgKG5hbWUsIGZpbGVfdHlwZSwgdGFyZ2V0KQorICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZTsKKyAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OworeworICBsYW5nX2hhc19pbnB1dF9maWxlID0gdHJ1ZTsKKyAgcmV0dXJuIG5ld19hZmlsZSAobmFtZSwgZmlsZV90eXBlLCB0YXJnZXQsIHRydWUpOworfQorCisvKiBCdWlsZCBlbm91Z2ggc3RhdGUgc28gdGhhdCB0aGUgcGFyc2VyIGNhbiBidWlsZCBpdHMgdHJlZSAqLwordm9pZAorbGFuZ19pbml0ICgpCit7CisgIG9ic3RhY2tfYmVnaW4gKCZzdGF0X29ic3RhY2ssIDEwMDApOworCisgIHN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OworCisgIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7CisKKyAgbGFuZ19saXN0X2luaXQgKCZpbnB1dF9maWxlX2NoYWluKTsKKyAgbGFuZ19saXN0X2luaXQgKCZsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7CisgIGxhbmdfbGlzdF9pbml0ICgmZmlsZV9jaGFpbik7CisgIGZpcnN0X2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlICgoY2hhciAqKSBOVUxMLAorCQkJCSAgICBsYW5nX2lucHV0X2ZpbGVfaXNfbWFya2VyX2VudW0sCisJCQkJICAgIChjaGFyICopIE5VTEwpOworICBhYnNfb3V0cHV0X3NlY3Rpb24gPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKEJGRF9BQlNfU0VDVElPTl9OQU1FKTsKKworICBhYnNfb3V0cHV0X3NlY3Rpb24tPmJmZF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBIHJlZ2lvbiBpcyBhbiBhcmVhIG9mIG1lbW9yeSBkZWNsYXJlZCB3aXRoIHRoZQorIE1FTU9SWSB7ICBuYW1lOm9yZz1leHAsIGxlbj1leHAgLi4uIH0KKyBzeW50YXguCisKKyBXZSBtYWludGFpbiBhIGxpc3Qgb2YgYWxsIHRoZSByZWdpb25zIGhlcmUKKworIElmIG5vIHJlZ2lvbnMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2NyaXB0LCB0aGVuIHRoZSBkZWZhdWx0IGlzIHVzZWQKKyB3aGljaCBpcyBjcmVhdGVkIHdoZW4gbG9va2VkIHVwIHRvIGJlIHRoZSBlbnRpcmUgZGF0YSBzcGFjZQorKi8KKworc3RhdGljIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKK3N0YXRpYyBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0X3RhaWwgPSAmbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7CisKK2xhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICoKK2xhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Cit7CisgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwOworCisgIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OworICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7CisgICAgICAgcCA9IHAtPm5leHQpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAocC0+bmFtZSwgbmFtZSkgPT0gMCkKKwl7CisJICByZXR1cm4gcDsKKwl9CisgICAgfQorCisjaWYgMAorICAvKiBUaGlzIGNvZGUgdXNlZCB0byBhbHdheXMgdXNlIHRoZSBmaXJzdCByZWdpb24gaW4gdGhlIGxpc3QgYXMgdGhlCisgICAgIGRlZmF1bHQgcmVnaW9uLiAgSSBjaGFuZ2VkIGl0IHRvIGluc3RlYWQgdXNlIGEgcmVnaW9uCisgICAgIGVuY29tcGFzc2luZyBhbGwgb2YgbWVtb3J5IGFzIHRoZSBkZWZhdWx0IHJlZ2lvbi4gIFRoaXMgcGVybWl0cworICAgICBOT0xPQUQgc2VjdGlvbnMgdG8gd29yayByZWFzb25hYmx5IHdpdGhvdXQgcmVxdWlyaW5nIGEgcmVnaW9uLgorICAgICBQZW9wbGUgc2hvdWxkIHNwZWNpZnkgd2hhdCByZWdpb24gdGhleSBtZWFuLCBpZiB0aGV5IHJlYWxseSB3YW50CisgICAgIGEgcmVnaW9uLiAgKi8KKyAgaWYgKHN0cmNtcCAobmFtZSwgIipkZWZhdWx0KiIpID09IDApCisgICAgeworICAgICAgaWYgKGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0ICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMKQorCXsKKwkgIHJldHVybiBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgeworICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpuZXcgPQorICAgIChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlKSk7CisKKyAgICBuZXctPm5hbWUgPSBidXlzdHJpbmcgKG5hbWUpOworICAgIG5ldy0+bmV4dCA9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOworCisgICAgKmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0X3RhaWwgPSBuZXc7CisgICAgbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3RfdGFpbCA9ICZuZXctPm5leHQ7CisgICAgbmV3LT5vcmlnaW4gPSAwOworICAgIG5ldy0+ZmxhZ3MgPSAwOworICAgIG5ldy0+bm90X2ZsYWdzID0gMDsKKyAgICBuZXctPmxlbmd0aCA9IH4oYmZkX3NpemVfdHlwZSkwOworICAgIG5ldy0+Y3VycmVudCA9IDA7CisgICAgbmV3LT5oYWRfZnVsbF9tZXNzYWdlID0gZmFsc2U7CisKKyAgICByZXR1cm4gbmV3OworICB9Cit9CisKKworbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKgorbGFuZ19tZW1vcnlfZGVmYXVsdCAoc2VjdGlvbikKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwOworCisgIGZsYWd3b3JkIHNlY19mbGFncyA9IHNlY3Rpb24tPmZsYWdzOworCisgIC8qIE92ZXJyaWRlIFNFQ19EQVRBIHRvIG1lYW4gYSB3cml0YWJsZSBzZWN0aW9uLiAgKi8KKyAgaWYgKChzZWNfZmxhZ3MgJiAoU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUpKSA9PSBTRUNfQUxMT0MpCisgICAgc2VjX2ZsYWdzIHw9IFNFQ19EQVRBOworCisgIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OworICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7CisgICAgICAgcCA9IHAtPm5leHQpCisgICAgeworICAgICAgaWYgKChwLT5mbGFncyAmIHNlY19mbGFncykgIT0gMAorCSAgJiYgKHAtPm5vdF9mbGFncyAmIHNlY19mbGFncykgPT0gMCkKKwl7CisJICByZXR1cm4gcDsKKwl9CisgICAgfQorICByZXR1cm4gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAoIipkZWZhdWx0KiIpOworfQorCitsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKK2xhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAobmFtZSkKKyAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqdTsKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwOworCisgIGZvciAodSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmhlYWQ7CisgICAgICAgdSAhPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOworICAgICAgIHUgPSBsb29rdXAtPm5leHQpCisgICAgeworICAgICAgbG9va3VwID0gJnUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGxvb2t1cC0+bmFtZSkgPT0gMCkKKwl7CisJICByZXR1cm4gbG9va3VwOworCX0KKyAgICB9CisgIHJldHVybiAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOworfQorCitsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKK2xhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAobmFtZSkKKyAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKK3sKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwOworCisgIGxvb2t1cCA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAobmFtZSk7CisgIGlmIChsb29rdXAgPT0gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKKyAgICB7CisKKyAgICAgIGxvb2t1cCA9IChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopCisJbmV3X3N0YXQgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBzdGF0X3B0cik7CisgICAgICBsb29rdXAtPnJlZ2lvbiA9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOworICAgICAgbG9va3VwLT5maWxsID0gMDsKKyAgICAgIGxvb2t1cC0+YmxvY2tfdmFsdWUgPSAxOworICAgICAgbG9va3VwLT5uYW1lID0gbmFtZTsKKworICAgICAgbG9va3VwLT5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKKyAgICAgIGxvb2t1cC0+YmZkX3NlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKKyAgICAgIGxvb2t1cC0+cHJvY2Vzc2VkID0gZmFsc2U7CisgICAgICBsb29rdXAtPnNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsKKyAgICAgIGxvb2t1cC0+YWRkcl90cmVlID0gKGV0cmVlX3R5cGUgKikgTlVMTDsKKyAgICAgIGxhbmdfbGlzdF9pbml0ICgmbG9va3VwLT5jaGlsZHJlbik7CisKKyAgICAgIGxvb2t1cC0+bWVtc3BlYyA9IChDT05TVCBjaGFyICopIE5VTEw7CisgICAgICBsb29rdXAtPmZsYWdzID0gMDsKKyAgICAgIGxvb2t1cC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQgPSAtMTsKKyAgICAgIGxvb2t1cC0+c2VjdGlvbl9hbGlnbm1lbnQgPSAtMTsKKyAgICAgIGxvb2t1cC0+bG9hZF9iYXNlID0gKHVuaW9uIGV0cmVlX3VuaW9uICopIE5VTEw7CisgICAgICBsb29rdXAtPnBoZHJzID0gTlVMTDsKKworICAgICAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkgICAgIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGxvb2t1cCwKKwkJCSAgICAgJmxvb2t1cC0+bmV4dCk7CisgICAgfQorICByZXR1cm4gbG9va3VwOworfQorCitzdGF0aWMgdm9pZAorbGFuZ19tYXBfZmxhZ3MgKGZsYWcpCisgICAgIGZsYWd3b3JkIGZsYWc7Cit7CisgIGlmIChmbGFnICYgU0VDX0FMTE9DKQorICAgIG1pbmZvICgiYSIpOworCisgIGlmIChmbGFnICYgU0VDX0NPREUpCisgICAgbWluZm8gKCJ4Iik7CisKKyAgaWYgKGZsYWcgJiBTRUNfUkVBRE9OTFkpCisgICAgbWluZm8gKCJyIik7CisKKyAgaWYgKGZsYWcgJiBTRUNfREFUQSkKKyAgICBtaW5mbyAoInciKTsKKworICBpZiAoZmxhZyAmIFNFQ19MT0FEKQorICAgIG1pbmZvICgibCIpOworfQorCit2b2lkCitsYW5nX21hcCAoKQoreworICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqbTsKKworICBtaW5mbyAoXygiXG5NZW1vcnkgQ29uZmlndXJhdGlvblxuXG4iKSk7CisgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiUtMTZzICUtMThzICUtMThzICVzXG4iLAorCSAgIF8oIk5hbWUiKSwgXygiT3JpZ2luIiksIF8oIkxlbmd0aCIpLCBfKCJBdHRyaWJ1dGVzIikpOworCisgIGZvciAobSA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OworICAgICAgIG0gIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7CisgICAgICAgbSA9IG0tPm5leHQpCisgICAgeworICAgICAgY2hhciBidWZbMTAwXTsKKyAgICAgIGludCBsZW47CisKKyAgICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiUtMTZzICIsIG0tPm5hbWUpOworCisgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBtLT5vcmlnaW4pOworICAgICAgbWluZm8gKCIweCVzICIsIGJ1Zik7CisgICAgICBsZW4gPSBzdHJsZW4gKGJ1Zik7CisgICAgICB3aGlsZSAobGVuIDwgMTYpCisJeworCSAgcHJpbnRfc3BhY2UgKCk7CisJICArK2xlbjsKKwl9CisKKyAgICAgIG1pbmZvICgiMHglViIsIG0tPmxlbmd0aCk7CisgICAgICBpZiAobS0+ZmxhZ3MgfHwgbS0+bm90X2ZsYWdzKQorCXsKKyNpZm5kZWYgQkZENjQKKwkgIG1pbmZvICgiICAgICAgICAiKTsKKyNlbmRpZgorCSAgaWYgKG0tPmZsYWdzKQorCSAgICB7CisJICAgICAgcHJpbnRfc3BhY2UgKCk7CisJICAgICAgbGFuZ19tYXBfZmxhZ3MgKG0tPmZsYWdzKTsKKwkgICAgfQorCisJICBpZiAobS0+bm90X2ZsYWdzKQorCSAgICB7CisJICAgICAgbWluZm8gKCIgISIpOworCSAgICAgIGxhbmdfbWFwX2ZsYWdzIChtLT5ub3RfZmxhZ3MpOworCSAgICB9CisJfQorCisgICAgICBwcmludF9ubCAoKTsKKyAgICB9CisKKyAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCBfKCJcbkxpbmtlciBzY3JpcHQgYW5kIG1lbW9yeSBtYXBcblxuIikpOworCisgIHByaW50X3N0YXRlbWVudHMgKCk7Cit9CisKKy8qIEluaXRpYWxpemUgYW4gb3V0cHV0IHNlY3Rpb24uICAqLworCitzdGF0aWMgdm9pZAoraW5pdF9vcyAocykKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqczsKK3sKKyAgc2VjdGlvbl91c2VyZGF0YV90eXBlICpuZXc7CisKKyAgaWYgKHMtPmJmZF9zZWN0aW9uICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmIChzdHJjbXAgKHMtPm5hbWUsIERJU0NBUkRfU0VDVElPTl9OQU1FKSA9PSAwKQorICAgIGVpbmZvIChfKCIlUCVGOiBJbGxlZ2FsIHVzZSBvZiBgJXMnIHNlY3Rpb24iKSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpOworCisgIG5ldyA9ICgoc2VjdGlvbl91c2VyZGF0YV90eXBlICopCisJIHN0YXRfYWxsb2MgKHNpemVvZiAoc2VjdGlvbl91c2VyZGF0YV90eXBlKSkpOworCisgIHMtPmJmZF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHMtPm5hbWUpOworICBpZiAocy0+YmZkX3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCisgICAgcy0+YmZkX3NlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBzLT5uYW1lKTsKKyAgaWYgKHMtPmJmZF9zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQorICAgIHsKKyAgICAgIGVpbmZvIChfKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIpLAorCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgcy0+bmFtZSk7CisgICAgfQorICBzLT5iZmRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBzLT5iZmRfc2VjdGlvbjsKKworICAvKiBXZSBpbml0aWFsaXplIGFuIG91dHB1dCBzZWN0aW9ucyBvdXRwdXQgb2Zmc2V0IHRvIG1pbnVzIGl0cyBvd24gKi8KKyAgLyogdm1hIHRvIGFsbG93IHVzIHRvIG91dHB1dCBhIHNlY3Rpb24gdGhyb3VnaCBpdHNlbGYgKi8KKyAgcy0+YmZkX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgPSAwOworICBnZXRfdXNlcmRhdGEgKHMtPmJmZF9zZWN0aW9uKSA9IChQVFIpIG5ldzsKKworICAvKiBJZiB0aGVyZSBpcyBhIGJhc2UgYWRkcmVzcywgbWFrZSBzdXJlIHRoYXQgYW55IHNlY3Rpb25zIGl0IG1pZ2h0CisgICAgIG1lbnRpb24gYXJlIGluaXRpYWxpemVkLiAgKi8KKyAgaWYgKHMtPmFkZHJfdHJlZSAhPSBOVUxMKQorICAgIGV4cF9pbml0X29zIChzLT5hZGRyX3RyZWUpOworfQorCisvKiBNYWtlIHN1cmUgdGhhdCBhbGwgb3V0cHV0IHNlY3Rpb25zIG1lbnRpb25lZCBpbiBhbiBleHByZXNzaW9uIGFyZQorICAgaW5pdGlhbGl6ZWQuICAqLworCitzdGF0aWMgdm9pZAorZXhwX2luaXRfb3MgKGV4cCkKKyAgICAgZXRyZWVfdHlwZSAqZXhwOworeworICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQorICAgIHsKKyAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKKyAgICAgIGV4cF9pbml0X29zIChleHAtPmFzc2lnbi5zcmMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV0cmVlX2JpbmFyeToKKyAgICAgIGV4cF9pbml0X29zIChleHAtPmJpbmFyeS5saHMpOworICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YmluYXJ5LnJocyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKKyAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkuY29uZCk7CisgICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5Lmxocyk7CisgICAgICBleHBfaW5pdF9vcyAoZXhwLT50cmluYXJ5LnJocyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfdW5hcnk6CisgICAgICBleHBfaW5pdF9vcyAoZXhwLT51bmFyeS5jaGlsZCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfbmFtZToKKyAgICAgIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY29kZSkKKwl7CisJY2FzZSBBRERSOgorCWNhc2UgTE9BREFERFI6CisJY2FzZSBTSVpFT0Y6CisJICB7CisJICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOworCisJICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChleHAtPm5hbWUubmFtZSk7CisJICAgIGlmIChvcyAhPSBOVUxMICYmIG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQorCSAgICAgIGluaXRfb3MgKG9zKTsKKwkgIH0KKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFNlY3Rpb25zIG1hcmtlZCB3aXRoIHRoZSBTRUNfTElOS19PTkNFIGZsYWcgc2hvdWxkIG9ubHkgYmUgbGlua2VkCisgICBvbmNlIGludG8gdGhlIG91dHB1dC4gIFRoaXMgcm91dGluZSBjaGVja3MgZWFjaCBzZWN0aW9ucywgYW5kCisgICBhcnJhbmdlcyB0byBkaXNjYXJkIGl0IGlmIGEgc2VjdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5CisgICBiZWVuIGxpbmtlZC4gIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYWxsIHJlbGV2YW50IHNlY3Rpb25zIGhhdmUgdGhlCisgICBTRUNfTElOS19PTkNFIGZsYWcgc2V0OyB0aGF0IGlzLCBpdCBkb2VzIG5vdCBkZXBlbmQgc29sZWx5IHVwb24gdGhlCisgICBzZWN0aW9uIG5hbWUuICBUaGlzIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCAoYWJmZCwgc2VjLCBkYXRhKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIFBUUiBkYXRhOworeworICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGRhdGE7CisgIHN0cnVjdCBzZWNfbGlua19vbmNlCisgICAgeworICAgICAgc3RydWN0IHNlY19saW5rX29uY2UgKm5leHQ7CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgIH07CisgIHN0YXRpYyBzdHJ1Y3Qgc2VjX2xpbmtfb25jZSAqc2VjX2xpbmtfb25jZV9saXN0OworICBmbGFnd29yZCBmbGFnczsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgc3RydWN0IHNlY19saW5rX29uY2UgKmw7CisKKyAgLyogSWYgd2UgYXJlIG9ubHkgcmVhZGluZyBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QsIHRoZW4gd2Ugd2FudCB0bworICAgICBkaXNjYXJkIGFsbCBzZWN0aW9ucy4gICovCisgIGlmIChlbnRyeS0+anVzdF9zeW1zX2ZsYWcpCisgICAgeworICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisgICAgICBzZWMtPm91dHB1dF9vZmZzZXQgPSBzZWMtPnZtYTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYyk7CisKKyAgaWYgKChmbGFncyAmIFNFQ19MSU5LX09OQ0UpID09IDApCisgICAgcmV0dXJuOworCisgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKKworICBmb3IgKGwgPSBzZWNfbGlua19vbmNlX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobmFtZSwgYmZkX2dldF9zZWN0aW9uX25hbWUgKGwtPnNlYy0+b3duZXIsIGwtPnNlYykpID09IDApCisJeworCSAgLyogVGhlIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBsaW5rZWQuICBTZWUgaWYgd2Ugc2hvdWxkCisgICAgICAgICAgICAgaXNzdWUgYSB3YXJuaW5nLiAgKi8KKwkgIHN3aXRjaCAoZmxhZ3MgJiBTRUNfTElOS19EVVBMSUNBVEVTKQorCSAgICB7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisKKwkgICAgY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOgorCSAgICAgIGVpbmZvIChfKCIlUDogJUI6IHdhcm5pbmc6IGlnbm9yaW5nIGR1cGxpY2F0ZSBzZWN0aW9uIGAlcydcbiIpLAorCQkgICAgIGFiZmQsIG5hbWUpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOgorCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IGRpZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGJvdGgKKyAgICAgICAgICAgICAgICAgc2VjdGlvbnMgYW5kIG1lbWNtcCB0aGVtLiAgVGhlIENPRkYvUEUgc3BlYyBzYXlzIHRoYXQKKyAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBsaW5rZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgY29ycmVjdGx5LCBzbyBJJ20gbm90IGdvaW5nIHRvIGJvdGhlciBkb2luZyBpdAorICAgICAgICAgICAgICAgICBlaXRoZXIuICAqLworCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJICAgIGNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6CisJICAgICAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykKKwkJICAhPSBiZmRfc2VjdGlvbl9zaXplIChsLT5zZWMtPm93bmVyLCBsLT5zZWMpKQorCQllaW5mbyAoXygiJVA6ICVCOiB3YXJuaW5nOiBkdXBsaWNhdGUgc2VjdGlvbiBgJXMnIGhhcyBkaWZmZXJlbnQgc2l6ZVxuIiksCisJCSAgICAgICBhYmZkLCBuYW1lKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBTZXQgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkIHNvIHRoYXQgd2lsZF9kb2l0IGRvZXMgbm90CisJICAgICBjcmVhdGUgYSBsYW5nX2lucHV0X3NlY3Rpb24gc3RydWN0dXJlIGZvciB0aGlzIHNlY3Rpb24uICAqLworCSAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUuICBSZWNvcmQgaXQuICAqLworCisgIGwgPSAoc3RydWN0IHNlY19saW5rX29uY2UgKikgeG1hbGxvYyAoc2l6ZW9mICpsKTsKKyAgbC0+c2VjID0gc2VjOworICBsLT5uZXh0ID0gc2VjX2xpbmtfb25jZV9saXN0OworICBzZWNfbGlua19vbmNlX2xpc3QgPSBsOworfQorDAorLyogVGhlIHdpbGQgcm91dGluZXMuCisKKyAgIFRoZXNlIGV4cGFuZCBzdGF0ZW1lbnRzIGxpa2UgKigudGV4dCkgYW5kIGZvby5vIHRvIGEgbGlzdCBvZgorICAgZXhwbGljaXQgYWN0aW9ucywgbGlrZSBmb28ubygudGV4dCksIGJhci5vKC50ZXh0KSBhbmQKKyAgIGZvby5vKC50ZXh0LCAuZGF0YSkuICAqLworCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgUEFUVEVSTiBhcmd1bWVudCBpcyBhIHdpbGRjYXJkIHBhdHRlcm4uCisgICBBbHRob3VnaCBiYWNrc2xhc2hlcyBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgaWYgYSBwYXR0ZXJuIGNvbnRhaW5zCisgICB3aWxkY2FyZHMsIHdlIGRvIG5vdCBjb25zaWRlciB0aGUgbWVyZSBwcmVzZW5jZSBvZiBhIGJhY2tzbGFzaCB0bworICAgYmUgZW5vdWdoIHRvIGNhdXNlIHRoZSB0aGUgcGF0dGVybiB0byBiZSB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuCisgICBUaGF0IGxldHMgdXMgaGFuZGxlIERPUyBmaWxlbmFtZXMgbW9yZSBuYXR1cmFsbHkuICAqLworCitzdGF0aWMgYm9vbGVhbgord2lsZGNhcmRwIChwYXR0ZXJuKQorICAgICBjb25zdCBjaGFyICpwYXR0ZXJuOworeworICBjb25zdCBjaGFyICpzOworCisgIGZvciAocyA9IHBhdHRlcm47ICpzICE9ICdcMCc7ICsrcykKKyAgICBpZiAoKnMgPT0gJz8nCisJfHwgKnMgPT0gJyonCisJfHwgKnMgPT0gJ1snKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLyogQWRkIFNFQ1RJT04gdG8gdGhlIG91dHB1dCBzZWN0aW9uIE9VVFBVVC4gIERvIHRoaXMgYnkgY3JlYXRpbmcgYQorICAgbGFuZ19pbnB1dF9zZWN0aW9uIHN0YXRlbWVudCB3aGljaCBpcyBwbGFjZWQgYXQgUFRSLiAgRklMRSBpcyB0aGUKKyAgIGlucHV0IGZpbGUgd2hpY2ggaG9sZHMgU0VDVElPTi4gICovCisKK3ZvaWQKK3dpbGRfZG9pdCAocHRyLCBzZWN0aW9uLCBvdXRwdXQsIGZpbGUpCisgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcHRyOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0OworICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOworeworICBmbGFnd29yZCBmbGFnczsKKyAgYm9vbGVhbiBkaXNjYXJkOworCisgIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzZWN0aW9uLT5vd25lciwgc2VjdGlvbik7CisKKyAgZGlzY2FyZCA9IGZhbHNlOworCisgIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIGRpc2NhcmQgc2VjdGlvbnMgbWFya2VkIHdpdGgKKyAgICAgU0VDX0VYQ0xVREUuICAqLworICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCisgICAgICAmJiAoZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKKyAgICBkaXNjYXJkID0gdHJ1ZTsKKworICAvKiBEaXNjYXJkIGlucHV0IHNlY3Rpb25zIHdoaWNoIGFyZSBhc3NpZ25lZCB0byBhIHNlY3Rpb24gbmFtZWQKKyAgICAgRElTQ0FSRF9TRUNUSU9OX05BTUUuICAqLworICBpZiAoc3RyY21wIChvdXRwdXQtPm5hbWUsIERJU0NBUkRfU0VDVElPTl9OQU1FKSA9PSAwKQorICAgIGRpc2NhcmQgPSB0cnVlOworCisgIC8qIERpc2NhcmQgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHdlIGFyZSBzdHJpcHBpbmcgZGVidWdnaW5nCisgICAgIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKChsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfZGVidWdnZXIgfHwgbGlua19pbmZvLnN0cmlwID09IHN0cmlwX2FsbCkKKyAgICAgICYmIChmbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCisgICAgZGlzY2FyZCA9IHRydWU7CisKKyAgaWYgKGRpc2NhcmQpCisgICAgeworICAgICAgaWYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCisJeworCSAgLyogVGhpcyBwcmV2ZW50cyBmdXR1cmUgY2FsbHMgZnJvbSBhc3NpZ25pbmcgdGhpcyBzZWN0aW9uLiAgKi8KKwkgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJvb2xlYW4gZmlyc3Q7CisgICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqbmV3OworICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisKKyAgICAgIGlmIChvdXRwdXQtPmJmZF9zZWN0aW9uID09IE5VTEwpCisJeworCSAgaW5pdF9vcyAob3V0cHV0KTsKKwkgIGZpcnN0ID0gdHJ1ZTsKKwl9CisgICAgICBlbHNlCisJZmlyc3QgPSBmYWxzZTsKKworICAgICAgLyogQWRkIGEgc2VjdGlvbiByZWZlcmVuY2UgdG8gdGhlIGxpc3QgKi8KKyAgICAgIG5ldyA9IG5ld19zdGF0IChsYW5nX2lucHV0X3NlY3Rpb24sIHB0cik7CisKKyAgICAgIG5ldy0+c2VjdGlvbiA9IHNlY3Rpb247CisgICAgICBuZXctPmlmaWxlID0gZmlsZTsKKyAgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gb3V0cHV0LT5iZmRfc2VjdGlvbjsKKworICAgICAgZmxhZ3MgPSBzZWN0aW9uLT5mbGFnczsKKworICAgICAgLyogV2UgZG9uJ3QgY29weSB0aGUgU0VDX05FVkVSX0xPQUQgZmxhZyBmcm9tIGFuIGlucHV0IHNlY3Rpb24KKwkgdG8gYW4gb3V0cHV0IHNlY3Rpb24sIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIGluY2x1ZGUgYQorCSBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uIGluIHRoZSBtaWRkbGUgb2YgYW4gb3RoZXJ3aXNlIGxvYWRlZAorCSBzZWN0aW9uIChJIGRvbid0IGtub3cgd2h5IHdlIHdhbnQgdG8gZG8gdGhpcywgYnV0IHdlIGRvKS4KKwkgYnVpbGRfbGlua19vcmRlciBpbiBsZHdyaXRlLmMgaGFuZGxlcyB0aGlzIGNhc2UgYnkgdHVybmluZworCSB0aGUgZW1iZWRkZWQgU0VDX05FVkVSX0xPQUQgc2VjdGlvbiBpbnRvIGEgZmlsbC4gICovCisKKyAgICAgIGZsYWdzICY9IH4gU0VDX05FVkVSX0xPQUQ7CisKKyAgICAgIC8qIElmIGZpbmFsIGxpbmssIGRvbid0IGNvcHkgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZ3MsIHRoZXkndmUKKwkgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZC4gIE9uZSByZWFzb24gdG8gZG8gdGhpcyBpcyB0aGF0IG9uIHBlCisJIGZvcm1hdCB0YXJnZXRzLCAudGV4dCRmb28gc2VjdGlvbnMgZ28gaW50byAudGV4dCBhbmQgaXQncyBvZGQKKwkgdG8gc2VlIC50ZXh0IHdpdGggU0VDX0xJTktfT05DRSBzZXQuICAqLworCisgICAgICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQorCWZsYWdzICY9IH4gKFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKTsKKworICAgICAgLyogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGlucHV0IHNlY3Rpb24sIGFuZCB0aGUgU0VDX1JFQURPTkxZCisgICAgICAgICBmbGFnIGlzIG5vdCBjdXJyZW50bHkgc2V0LCB0aGVuIGRvbid0IHNldCBpdCBqdXN0IGJlY2F1c2UgdGhlCisgICAgICAgICBpbnB1dCBzZWN0aW9uIGhhcyBpdCBzZXQuICAqLworCisgICAgICBpZiAoISBmaXJzdCAmJiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQorCWZsYWdzICY9IH4gU0VDX1JFQURPTkxZOworCisgICAgICBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgfD0gZmxhZ3M7CisKKyAgICAgIC8qIElmIFNFQ19SRUFET05MWSBpcyBub3Qgc2V0IGluIHRoZSBpbnB1dCBzZWN0aW9uLCB0aGVuIGNsZWFyCisgICAgICAgICBpdCBmcm9tIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwKQorCXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX1JFQURPTkxZOworCisgICAgICBzd2l0Y2ggKG91dHB1dC0+c2VjdHlwZSkKKwl7CisJY2FzZSBub3JtYWxfc2VjdGlvbjoKKwkgIGJyZWFrOworCWNhc2UgZHNlY3Rfc2VjdGlvbjoKKwljYXNlIGNvcHlfc2VjdGlvbjoKKwljYXNlIGluZm9fc2VjdGlvbjoKKwljYXNlIG92ZXJsYXlfc2VjdGlvbjoKKwkgIG91dHB1dC0+YmZkX3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfQUxMT0M7CisJICBicmVhazsKKwljYXNlIG5vbG9hZF9zZWN0aW9uOgorCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19MT0FEOworCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX05FVkVSX0xPQUQ7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmIChzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPiBvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCisJb3V0cHV0LT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOworCisgICAgICAvKiBJZiBzdXBwbGllZCBhbiBhbGlnbWVudCwgdGhlbiBmb3JjZSBpdC4gICovCisgICAgICBpZiAob3V0cHV0LT5zZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKKwlvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBvdXRwdXQtPnNlY3Rpb25fYWxpZ25tZW50OworICAgIH0KK30KKworLyogSGFuZGxlIHdpbGRjYXJkIHNvcnRpbmcuICBUaGlzIHJldHVybnMgdGhlIGxhbmdfaW5wdXRfc2VjdGlvbiB3aGljaAorICAgc2hvdWxkIGZvbGxvdyB0aGUgb25lIHdlIGFyZSBnb2luZyB0byBjcmVhdGUgZm9yIFNFQ1RJT04gYW5kIEZJTEUsCisgICBiYXNlZCBvbiB0aGUgc29ydGluZyByZXF1aXJlbWVudHMgb2YgV0lMRC4gIEl0IHJldHVybnMgTlVMTCBpZiB0aGUKKyAgIG5ldyBzZWN0aW9uIHNob3VsZCBqdXN0IGdvIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGlzdC4gICovCisKK3N0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoKK3dpbGRfc29ydCAod2lsZCwgZmlsZSwgc2VjdGlvbikKKyAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICp3aWxkOworICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpsOworCisgIGlmICghIHdpbGQtPmZpbGVuYW1lc19zb3J0ZWQgJiYgISB3aWxkLT5zZWN0aW9uc19zb3J0ZWQpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc2VjdGlvbl9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGZpbGUtPnRoZV9iZmQsIHNlY3Rpb24pOworICBmb3IgKGwgPSB3aWxkLT5jaGlsZHJlbi5oZWFkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorICAgIHsKKyAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICpsczsKKworICAgICAgaWYgKGwtPmhlYWRlci50eXBlICE9IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtKQorCWNvbnRpbnVlOworICAgICAgbHMgPSAmbC0+aW5wdXRfc2VjdGlvbjsKKworICAgICAgLyogU29ydGluZyBieSBmaWxlbmFtZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgc29ydGluZyBieSBzZWN0aW9uCisgICAgICAgICBuYW1lLiAgKi8KKworICAgICAgaWYgKHdpbGQtPmZpbGVuYW1lc19zb3J0ZWQpCisJeworCSAgY29uc3QgY2hhciAqZm4sICpsbjsKKwkgIGJvb2xlYW4gZmEsIGxhOworCSAgaW50IGk7CisKKwkgIC8qIFRoZSBQRSBzdXBwb3J0IGZvciB0aGUgLmlkYXRhIHNlY3Rpb24gYXMgZ2VuZXJhdGVkIGJ5CisgICAgICAgICAgICAgZGxsdG9vbCBhc3N1bWVzIHRoYXQgZmlsZXMgd2lsbCBiZSBzb3J0ZWQgYnkgdGhlIG5hbWUgb2YKKyAgICAgICAgICAgICB0aGUgYXJjaGl2ZSBhbmQgdGhlbiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlCisgICAgICAgICAgICAgYXJjaGl2ZS4gICovCisKKwkgIGlmIChmaWxlLT50aGVfYmZkICE9IE5VTEwKKwkgICAgICAmJiBiZmRfbXlfYXJjaGl2ZSAoZmlsZS0+dGhlX2JmZCkgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZuID0gYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGZpbGUtPnRoZV9iZmQpKTsKKwkgICAgICBmYSA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZuID0gZmlsZS0+ZmlsZW5hbWU7CisJICAgICAgZmEgPSBmYWxzZTsKKwkgICAgfQorCisJICBpZiAobHMtPmlmaWxlLT50aGVfYmZkICE9IE5VTEwKKwkgICAgICAmJiBiZmRfbXlfYXJjaGl2ZSAobHMtPmlmaWxlLT50aGVfYmZkKSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbG4gPSBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAobHMtPmlmaWxlLT50aGVfYmZkKSk7CisJICAgICAgbGEgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBsbiA9IGxzLT5pZmlsZS0+ZmlsZW5hbWU7CisJICAgICAgbGEgPSBmYWxzZTsKKwkgICAgfQorCisJICBpID0gc3RyY21wIChmbiwgbG4pOworCSAgaWYgKGkgPiAwKQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UgaWYgKGkgPCAwKQorCSAgICBicmVhazsKKworCSAgaWYgKGZhIHx8IGxhKQorCSAgICB7CisJICAgICAgaWYgKGZhKQorCQlmbiA9IGZpbGUtPmZpbGVuYW1lOworCSAgICAgIGlmIChsYSkKKwkJbG4gPSBscy0+aWZpbGUtPmZpbGVuYW1lOworCisJICAgICAgaSA9IHN0cmNtcCAoZm4sIGxuKTsKKwkgICAgICBpZiAoaSA+IDApCisJCWNvbnRpbnVlOworCSAgICAgIGVsc2UgaWYgKGkgPCAwKQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogSGVyZSBlaXRoZXIgdGhlIGZpbGVzIGFyZSBub3Qgc29ydGVkIGJ5IG5hbWUsIG9yIHdlIGFyZQorICAgICAgICAgbG9va2luZyBhdCB0aGUgc2VjdGlvbnMgZm9yIHRoaXMgZmlsZS4gICovCisKKyAgICAgIGlmICh3aWxkLT5zZWN0aW9uc19zb3J0ZWQpCisJeworCSAgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLAorCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLAorCQkJCQkgICAgbHMtPnNlY3Rpb24pKQorCSAgICAgIDwgMCkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gbDsKK30KKworLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLiAgU0VDVElPTiBtYXkgYmUKKyAgIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgaXMgYSB3aWxkIGNhcmQuICAqLworCitzdGF0aWMgdm9pZAord2lsZF9zZWN0aW9uIChwdHIsIHNlY3Rpb24sIGZpbGUsIG91dHB1dCkKKyAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7CisgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247CisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKK3sKKworICAvKiBEb24ndCBwcm9jZXNzIHNlY3Rpb25zIGZyb20gZmlsZXMgd2hpY2ggd2VyZSBleGNsdWRlZC4gKi8KKyAgaWYgKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGJvb2xlYW4gbWF0Y2g7CisKKyAgICAgIGlmICh3aWxkY2FyZHAgKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSkpCisgICAgICAgICBtYXRjaCA9IGZubWF0Y2ggKHB0ci0+ZXhjbHVkZV9maWxlbmFtZSwgZmlsZS0+ZmlsZW5hbWUsIDApID09IDAgPyB0cnVlIDogZmFsc2U7CisgICAgICBlbHNlCisgICAgICAgICBtYXRjaCA9IHN0cmNtcCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lLCBmaWxlLT5maWxlbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKKworICAgICAgaWYgKG1hdGNoKQorICAgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKKyAgICB7CisgICAgICByZWdpc3RlciBhc2VjdGlvbiAqczsKKyAgICAgIGJvb2xlYW4gd2lsZGNhcmQ7CisKKyAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCisJd2lsZGNhcmQgPSBmYWxzZTsKKyAgICAgIGVsc2UKKwl3aWxkY2FyZCA9IHdpbGRjYXJkcCAoc2VjdGlvbik7CisKKyAgICAgIGZvciAocyA9IGZpbGUtPnRoZV9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorCXsKKwkgIGJvb2xlYW4gbWF0Y2g7CisKKwkgIC8qIEF0dGFjaCBhbGwgc2VjdGlvbnMgbmFtZWQgU0VDVElPTi4gIElmIFNFQ1RJT04gaXMgTlVMTCwKKwkgICAgIHRoZW4gYXR0YWNoIGFsbCBzZWN0aW9ucy4KKworCSAgICAgUHJldmlvdXNseSwgaWYgU0VDVElPTiB3YXMgTlVMTCwgdGhpcyBjb2RlIGRpZCBub3QgY2FsbAorCSAgICAgd2lsZF9kb2l0IGlmIHRoZSBTRUNfSVNfQ09NTU9OIGZsYWcgd2FzIHNldCBmb3IgdGhlCisJICAgICBzZWN0aW9uLiAgSSBkaWQgbm90IHVuZGVyc3RhbmQgdGhhdCwgYW5kIEkgdG9vayBpdCBvdXQuCisJICAgICAtLWlhbkBjeWdudXMuY29tLiAgKi8KKworCSAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKKwkgICAgbWF0Y2ggPSB0cnVlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY29uc3QgY2hhciAqbmFtZTsKKworCSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmlsZS0+dGhlX2JmZCwgcyk7CisJICAgICAgaWYgKHdpbGRjYXJkKQorCQltYXRjaCA9IGZubWF0Y2ggKHNlY3Rpb24sIG5hbWUsIDApID09IDAgPyB0cnVlIDogZmFsc2U7CisJICAgICAgZWxzZQorCQltYXRjaCA9IHN0cmNtcCAoc2VjdGlvbiwgbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKKwkgICAgfQorCisJICBpZiAobWF0Y2gpCisJICAgIHsKKwkgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpiZWZvcmU7CisKKwkgICAgICAvKiBJZiB0aGUgd2lsZCBwYXR0ZXJuIHdhcyBtYXJrZWQgS0VFUCwgdGhlIG1lbWJlciBzZWN0aW9ucworCQkgc2hvdWxkIGJlIGFzIHdlbGwuICAqLworCSAgICAgIGlmIChwdHItPmtlZXBfc2VjdGlvbnMpCisJCXMtPmZsYWdzIHw9IFNFQ19LRUVQOworCisJICAgICAgYmVmb3JlID0gd2lsZF9zb3J0IChwdHIsIGZpbGUsIHMpOworCisJICAgICAgLyogSGVyZSBCRUZPUkUgcG9pbnRzIHRvIHRoZSBsYW5nX2lucHV0X3NlY3Rpb24gd2hpY2gKKwkJIHNob3VsZCBmb2xsb3cgdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gYWRkLiAgSWYgQkVGT1JFCisJCSBpcyBOVUxMLCB0aGVuIHRoZSBzZWN0aW9uIHNob3VsZCBqdXN0IGdvIGF0IHRoZSBlbmQKKwkJIG9mIHRoZSBjdXJyZW50IGxpc3QuICAqLworCisJICAgICAgaWYgKGJlZm9yZSA9PSBOVUxMKQorCQl3aWxkX2RvaXQgKCZwdHItPmNoaWxkcmVuLCBzLCBvdXRwdXQsIGZpbGUpOworCSAgICAgIGVsc2UKKwkJeworCQkgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBsaXN0OworCQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwcDsKKworCQkgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7CisJCSAgd2lsZF9kb2l0ICgmbGlzdCwgcywgb3V0cHV0LCBmaWxlKTsKKworCQkgIC8qIElmIHdlIGFyZSBkaXNjYXJkaW5nIHRoZSBzZWN0aW9uLCBMSVNULkhFQUQgd2lsbAorICAgICAgICAgICAgICAgICAgICAgYmUgTlVMTC4gICovCisJCSAgaWYgKGxpc3QuaGVhZCAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBBU1NFUlQgKGxpc3QuaGVhZC0+bmV4dCA9PSBOVUxMKTsKKworCQkgICAgICBmb3IgKHBwID0gJnB0ci0+Y2hpbGRyZW4uaGVhZDsKKwkJCSAgICpwcCAhPSBiZWZvcmU7CisJCQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKKwkJCUFTU0VSVCAoKnBwICE9IE5VTEwpOworCisJCSAgICAgIGxpc3QuaGVhZC0+bmV4dCA9ICpwcDsKKwkJICAgICAgKnBwID0gbGlzdC5oZWFkOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBUaGlzIGlzIHBhc3NlZCBhIGZpbGUgbmFtZSB3aGljaCBtdXN0IGhhdmUgYmVlbiBzZWVuIGFscmVhZHkgYW5kCisgICBhZGRlZCB0byB0aGUgc3RhdGVtZW50IHRyZWUuICBXZSB3aWxsIHNlZSBpZiBpdCBoYXMgYmVlbiBvcGVuZWQKKyAgIGFscmVhZHkgYW5kIGhhZCBpdHMgc3ltYm9scyByZWFkLiAgSWYgbm90IHRoZW4gd2UnbGwgcmVhZCBpdC4gICovCisKK3N0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICoKK2xvb2t1cF9uYW1lIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzZWFyY2g7CisKKyAgZm9yIChzZWFyY2ggPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBpbnB1dF9maWxlX2NoYWluLmhlYWQ7CisgICAgICAgc2VhcmNoICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7CisgICAgICAgc2VhcmNoID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgc2VhcmNoLT5uZXh0X3JlYWxfZmlsZSkKKyAgICB7CisgICAgICBpZiAoc2VhcmNoLT5maWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMICYmIG5hbWUgPT0gKGNoYXIgKikgTlVMTCkKKwlyZXR1cm4gc2VhcmNoOworICAgICAgaWYgKHNlYXJjaC0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTAorCSAgJiYgbmFtZSAhPSAoY2hhciAqKSBOVUxMCisJICAmJiBzdHJjbXAgKHNlYXJjaC0+ZmlsZW5hbWUsIG5hbWUpID09IDApCisJYnJlYWs7CisgICAgfQorCisgIGlmIChzZWFyY2ggPT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTCkKKyAgICBzZWFyY2ggPSBuZXdfYWZpbGUgKG5hbWUsIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0sIGRlZmF1bHRfdGFyZ2V0LAorCQkJZmFsc2UpOworCisgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBhZGRlZCB0aGlzIGZpbGUsIG9yIHRoaXMgZmlsZSBpcyBub3QgcmVhbAorICAgICAoRklYTUU6IGNhbiB0aGF0IGV2ZXIgYWN0dWFsbHkgaGFwcGVuPykgb3IgdGhlIG5hbWUgaXMgTlVMTAorICAgICAoRklYTUU6IGNhbiB0aGF0IGV2ZXIgYWN0dWFsbHkgaGFwcGVuPykgZG9uJ3QgYWRkIHRoaXMgZmlsZS4gICovCisgIGlmIChzZWFyY2gtPmxvYWRlZAorICAgICAgfHwgISBzZWFyY2gtPnJlYWwKKyAgICAgIHx8IHNlYXJjaC0+ZmlsZW5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKKyAgICByZXR1cm4gc2VhcmNoOworCisgIGxvYWRfc3ltYm9scyAoc2VhcmNoLCAobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICopIE5VTEwpOworCisgIHJldHVybiBzZWFyY2g7Cit9CisKKy8qIEdldCB0aGUgc3ltYm9scyBmb3IgYW4gaW5wdXQgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitsb2FkX3N5bWJvbHMgKGVudHJ5LCBwbGFjZSkKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7CisgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcGxhY2U7Cit7CisgIGNoYXIgKiptYXRjaGluZzsKKworICBpZiAoZW50cnktPmxvYWRlZCkKKyAgICByZXR1cm47CisKKyAgbGRmaWxlX29wZW5fZmlsZSAoZW50cnkpOworCisgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfYXJjaGl2ZSkKKyAgICAgICYmICEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKKyAgICB7CisgICAgICBiZmRfZXJyb3JfdHlwZSBlcnI7CisgICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKmhvbGQ7CisKKyAgICAgIGVyciA9IGJmZF9nZXRfZXJyb3IgKCk7CisgICAgICBpZiAoZXJyID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCisJeworCSAgY2hhciAqKnA7CisKKwkgIGVpbmZvIChfKCIlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIpLCBlbnRyeS0+dGhlX2JmZCk7CisJICBlaW5mbyAoXygiJUI6IG1hdGNoaW5nIGZvcm1hdHM6IiksIGVudHJ5LT50aGVfYmZkKTsKKwkgIGZvciAocCA9IG1hdGNoaW5nOyAqcCAhPSBOVUxMOyBwKyspCisJICAgIGVpbmZvICgiICVzIiwgKnApOworCSAgZWluZm8gKCIlRlxuIik7CisJfQorICAgICAgZWxzZSBpZiAoZXJyICE9IGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkCisJICAgICAgIHx8IHBsYWNlID09IE5VTEwpCisJZWluZm8gKF8oIiVGJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOworCisgICAgICBiZmRfY2xvc2UgKGVudHJ5LT50aGVfYmZkKTsKKyAgICAgIGVudHJ5LT50aGVfYmZkID0gTlVMTDsKKworICAgICAgLyogU2VlIGlmIHRoZSBlbXVsYXRpb24gaGFzIHNvbWUgc3BlY2lhbCBrbm93bGVkZ2UuICAqLworCisgICAgICBpZiAobGRlbXVsX3VucmVjb2duaXplZF9maWxlIChlbnRyeSkpCisJcmV0dXJuOworCisgICAgICAvKiBUcnkgdG8gaW50ZXJwcmV0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdC4gICovCisKKyAgICAgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAoZW50cnktPmZpbGVuYW1lKTsKKworICAgICAgaG9sZCA9IHN0YXRfcHRyOworICAgICAgc3RhdF9wdHIgPSBwbGFjZTsKKworICAgICAgbGRmaWxlX2Fzc3VtZWRfc2NyaXB0ID0gdHJ1ZTsKKyAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKKyAgICAgIHl5cGFyc2UgKCk7CisgICAgICBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKKworICAgICAgc3RhdF9wdHIgPSBob2xkOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChsZGVtdWxfcmVjb2duaXplZF9maWxlIChlbnRyeSkpCisgICAgcmV0dXJuOworCisgIC8qIFdlIGRvbid0IGNhbGwgbGRsYW5nX2FkZF9maWxlIGZvciBhbiBhcmNoaXZlLiAgSW5zdGVhZCwgdGhlCisgICAgIGFkZF9zeW1ib2xzIGVudHJ5IHBvaW50IHdpbGwgY2FsbCBsZGxhbmdfYWRkX2ZpbGUsIHZpYSB0aGUKKyAgICAgYWRkX2FyY2hpdmVfZWxlbWVudCBjYWxsYmFjaywgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJjaGl2ZQorICAgICB3aGljaCBpcyB1c2VkLiAgKi8KKyAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoZW50cnktPnRoZV9iZmQpKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9vYmplY3Q6CisgICAgICBsZGxhbmdfYWRkX2ZpbGUgKGVudHJ5KTsKKyAgICAgIGlmICh0cmFjZV9maWxlcyB8fCB0cmFjZV9maWxlX3RyaWVzKQorCWluZm9fbXNnICgiJUlcbiIsIGVudHJ5KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBiZmRfYXJjaGl2ZToKKyAgICAgIGlmIChlbnRyeS0+d2hvbGVfYXJjaGl2ZSkKKwl7CisJICBiZmQgKm1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGVudHJ5LT50aGVfYmZkLAorCQkJCQkJICAgICAgKGJmZCAqKSBOVUxMKTsKKwkgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKG1lbWJlciwgYmZkX29iamVjdCkpCisJCWVpbmZvIChfKCIlRiVCOiBvYmplY3QgJUIgaW4gYXJjaGl2ZSBpcyBub3Qgb2JqZWN0XG4iKSwKKwkJICAgICAgIGVudHJ5LT50aGVfYmZkLCBtZW1iZXIpOworCSAgICAgIGlmICghICgoKmxpbmtfaW5mby5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpCisJCSAgICAgKCZsaW5rX2luZm8sIG1lbWJlciwgIi0td2hvbGUtYXJjaGl2ZSIpKSkKKwkJYWJvcnQgKCk7CisJICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKG1lbWJlciwgJmxpbmtfaW5mbykpCisJCWVpbmZvIChfKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIG1lbWJlcik7CisJICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZW50cnktPnRoZV9iZmQsCisJCQkJCQkgICAgIG1lbWJlcik7CisJICAgIH0KKworCSAgZW50cnktPmxvYWRlZCA9IHRydWU7CisKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChlbnRyeS0+dGhlX2JmZCwgJmxpbmtfaW5mbykpCisgICAgZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOworCisgIGVudHJ5LT5sb2FkZWQgPSB0cnVlOworfQorCisvKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudCBmb3IgYSBzaW5nbGUgZmlsZSBGLiAgKi8KKworc3RhdGljIHZvaWQKK3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgb3V0cHV0KQorICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7CisgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247CisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKK3sKKyAgaWYgKGYtPnRoZV9iZmQgPT0gTlVMTAorICAgICAgfHwgISBiZmRfY2hlY2tfZm9ybWF0IChmLT50aGVfYmZkLCBiZmRfYXJjaGl2ZSkpCisgICAgd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLCBmLCBvdXRwdXQpOworICBlbHNlCisgICAgeworICAgICAgYmZkICptZW1iZXI7CisKKyAgICAgIC8qIFRoaXMgaXMgYW4gYXJjaGl2ZSBmaWxlLiAgV2UgbXVzdCBtYXAgZWFjaCBtZW1iZXIgb2YgdGhlCisJIGFyY2hpdmUgc2VwYXJhdGVseS4gICovCisgICAgICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChmLT50aGVfYmZkLCAoYmZkICopIE5VTEwpOworICAgICAgd2hpbGUgKG1lbWJlciAhPSBOVUxMKQorCXsKKwkgIC8qIFdoZW4gbG9va3VwX25hbWUgaXMgY2FsbGVkLCBpdCB3aWxsIGNhbGwgdGhlIGFkZF9zeW1ib2xzCisJICAgICBlbnRyeSBwb2ludCBmb3IgdGhlIGFyY2hpdmUuICBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZQorCSAgICAgYXJjaGl2ZSB3aGljaCBpcyBpbmNsdWRlZCwgQkZEIHdpbGwgY2FsbCBsZGxhbmdfYWRkX2ZpbGUsCisJICAgICB3aGljaCB3aWxsIHNldCB0aGUgdXNyZGF0YSBmaWVsZCBvZiB0aGUgbWVtYmVyIHRvIHRoZQorCSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnQuICAqLworCSAgaWYgKG1lbWJlci0+dXNyZGF0YSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLAorCQkJICAgIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIG1lbWJlci0+dXNyZGF0YSwKKwkJCSAgICBvdXRwdXQpOworCSAgICB9CisKKwkgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYtPnRoZV9iZmQsIG1lbWJlcik7CisJfQorICAgIH0KK30KKworLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQuICBTRUNUSU9OIG9yIEZJTEUgb3IgYm90aCBtYXkgYmUgTlVMTCwKKyAgIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIHdpbGRjYXJkLiAgU2VwYXJhdGUgbGFuZ19pbnB1dF9zZWN0aW9uCisgICBzdGF0ZW1lbnRzIGFyZSBjcmVhdGVkIGZvciBlYWNoIHBhcnQgb2YgdGhlIGV4cGFuc2lvbjsgdGhleSBhcmUKKyAgIGFkZGVkIGFmdGVyIHRoZSB3aWxkIHN0YXRlbWVudCBTLiAgT1VUUFVUIGlzIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCit3aWxkIChzLCBzZWN0aW9uLCBmaWxlLCB0YXJnZXQsIG91dHB1dCkKKyAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOworICAgICBjb25zdCBjaGFyICpzZWN0aW9uOworICAgICBjb25zdCBjaGFyICpmaWxlOworICAgICBjb25zdCBjaGFyICp0YXJnZXQ7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKK3sKKyAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKKworICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFBlcmZvcm0gdGhlIGl0ZXJhdGlvbiBvdmVyIGFsbCBmaWxlcyBpbiB0aGUgbGlzdCAqLworICAgICAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOworCSAgIGYgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKKwkgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dCkKKwl7CisJICB3aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIG91dHB1dCk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAod2lsZGNhcmRwIChmaWxlKSkKKyAgICB7CisgICAgICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7CisJICAgZiAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOworCSAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0KQorCXsKKwkgIGlmIChmbm1hdGNoIChmaWxlLCBmLT5maWxlbmFtZSwgRk5NX0ZJTEVfTkFNRSkgPT0gMCkKKwkgICAgd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBvdXRwdXQpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhIHNpbmdsZSBmaWxlICovCisgICAgICBmID0gbG9va3VwX25hbWUgKGZpbGUpOworICAgICAgd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmLCBvdXRwdXQpOworICAgIH0KKworICBpZiAoc2VjdGlvbiAhPSAoY2hhciAqKSBOVUxMCisgICAgICAmJiBzdHJjbXAgKHNlY3Rpb24sICJDT01NT04iKSA9PSAwCisgICAgICAmJiBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCisgICAgeworICAgICAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24gdGhhdCBjb21tb24gaXMgZ29pbmcgdG8gaW4gY2FzZSB3ZSBsYXRlcgorICAgICAgICAgZ2V0IHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGtub3cgd2hlcmUgdG8gcHV0IGl0LiAgKi8KKyAgICAgIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPSBvdXRwdXQ7CisgICAgfQorfQorCisvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCisKK3N0YXRpYyBiZmQgKgorb3Blbl9vdXRwdXQgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGJmZCAqb3V0cHV0OworCisgIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfdGFyZ2V0ICE9IChjaGFyICopIE5VTEwpCisJb3V0cHV0X3RhcmdldCA9IGN1cnJlbnRfdGFyZ2V0OworICAgICAgZWxzZQorCW91dHB1dF90YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKKyAgICB9CisgIG91dHB1dCA9IGJmZF9vcGVudyAobmFtZSwgb3V0cHV0X3RhcmdldCk7CisKKyAgaWYgKG91dHB1dCA9PSAoYmZkICopIE5VTEwpCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KQorCXsKKwkgIGVpbmZvIChfKCIlUCVGOiB0YXJnZXQgJXMgbm90IGZvdW5kXG4iKSwgb3V0cHV0X3RhcmdldCk7CisJfQorICAgICAgZWluZm8gKF8oIiVQJUY6IGNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzOiAlRVxuIiksIG5hbWUpOworICAgIH0KKworICBkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSA9IHRydWU7CisKKyAgLyogIG91dHB1dC0+ZmxhZ3MgfD0gRF9QQUdFRDsqLworCisgIGlmICghIGJmZF9zZXRfZm9ybWF0IChvdXRwdXQsIGJmZF9vYmplY3QpKQorICAgIGVpbmZvIChfKCIlUCVGOiVzOiBjYW4gbm90IG1ha2Ugb2JqZWN0IGZpbGU6ICVFXG4iKSwgbmFtZSk7CisgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvdXRwdXQsCisJCQkgICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwKKwkJCSAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZSkpCisgICAgZWluZm8gKF8oIiVQJUY6JXM6IGNhbiBub3Qgc2V0IGFyY2hpdGVjdHVyZTogJUVcbiIpLCBuYW1lKTsKKworICBsaW5rX2luZm8uaGFzaCA9IGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChvdXRwdXQpOworICBpZiAobGlua19pbmZvLmhhc2ggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCisgICAgZWluZm8gKF8oIiVQJUY6IGNhbiBub3QgY3JlYXRlIGxpbmsgaGFzaCB0YWJsZTogJUVcbiIpKTsKKworICBiZmRfc2V0X2dwX3NpemUgKG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOworICByZXR1cm4gb3V0cHV0OworfQorCisKKworCitzdGF0aWMgdm9pZAorbGRsYW5nX29wZW5fb3V0cHV0IChzdGF0ZW1lbnQpCisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzdGF0ZW1lbnQ7Cit7CisgIHN3aXRjaCAoc3RhdGVtZW50LT5oZWFkZXIudHlwZSkKKyAgICB7CisgICAgY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKKyAgICAgIEFTU0VSVCAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpOworICAgICAgb3V0cHV0X2JmZCA9IG9wZW5fb3V0cHV0IChzdGF0ZW1lbnQtPm91dHB1dF9zdGF0ZW1lbnQubmFtZSk7CisgICAgICBsZGVtdWxfc2V0X291dHB1dF9hcmNoICgpOworICAgICAgaWYgKGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgJiYgIWxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisJb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKKyAgICAgIGVsc2UKKwlvdXRwdXRfYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKKyAgICAgIGlmIChjb25maWcudGV4dF9yZWFkX29ubHkpCisJb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKKyAgICAgIGVsc2UKKwlvdXRwdXRfYmZkLT5mbGFncyAmPSB+V1BfVEVYVDsKKyAgICAgIGlmIChsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0KQorCW91dHB1dF9iZmQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7CisgICAgICBlbHNlCisJb3V0cHV0X2JmZC0+ZmxhZ3MgJj0gfkJGRF9UUkFESVRJT05BTF9GT1JNQVQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06CisgICAgICBjdXJyZW50X3RhcmdldCA9IHN0YXRlbWVudC0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBPcGVuIGFsbCB0aGUgaW5wdXQgZmlsZXMuICAqLworCitzdGF0aWMgdm9pZAorb3Blbl9pbnB1dF9iZmRzIChzLCBmb3JjZSkKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKKyAgICAgYm9vbGVhbiBmb3JjZTsKK3sKKyAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKKwl7CisJY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKKwkgIG9wZW5faW5wdXRfYmZkcyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLCBmb3JjZSk7CisJICBicmVhazsKKwljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06CisJICBvcGVuX2lucHV0X2JmZHMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLCBmb3JjZSk7CisJICBicmVhazsKKwljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKKwkgIC8qIE1heWJlIHdlIHNob3VsZCBsb2FkIHRoZSBmaWxlJ3Mgc3ltYm9scyAqLworCSAgaWYgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lCisJICAgICAgJiYgISB3aWxkY2FyZHAgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKSkKKwkgICAgKHZvaWQpIGxvb2t1cF9uYW1lIChzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSk7CisJICBvcGVuX2lucHV0X2JmZHMgKHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIGZvcmNlKTsKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKKwkgIHsKKwkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmczsKKworCSAgICAvKiBXZSBtdXN0IGNvbnRpbnVhbGx5IHNlYXJjaCB0aGUgZW50cmllcyBpbiB0aGUgZ3JvdXAKKyAgICAgICAgICAgICAgIHVudGlsIG5vIG5ldyBzeW1ib2xzIGFyZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB1bmRlZmluZWQKKyAgICAgICAgICAgICAgIHN5bWJvbHMuICAqLworCisJICAgIGRvCisJICAgICAgeworCQl1bmRlZnMgPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzX3RhaWw7CisJCW9wZW5faW5wdXRfYmZkcyAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIHRydWUpOworCSAgICAgIH0KKwkgICAgd2hpbGUgKHVuZGVmcyAhPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzX3RhaWwpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKKwkgIGN1cnJlbnRfdGFyZ2V0ID0gcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7CisJICBicmVhazsKKwljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06CisJICBpZiAocy0+aW5wdXRfc3RhdGVtZW50LnJlYWwgPT0gdHJ1ZSkKKwkgICAgeworCSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7CisKKwkgICAgICBzLT5pbnB1dF9zdGF0ZW1lbnQudGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7CisKKwkgICAgICAvKiBJZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGEgZ3JvdXAsIGFuZCB0aGlzCisgICAgICAgICAgICAgICAgIGlzIGFuIGFyY2hpdmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBzZWFyY2hlZCwgdGhlbgorICAgICAgICAgICAgICAgICBmb3JjZSBpdCB0byBiZSByZXNlYXJjaGVkLiAgKi8KKwkgICAgICBpZiAoZm9yY2UKKwkJICAmJiBzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkCisJCSAgJiYgYmZkX2NoZWNrX2Zvcm1hdCAocy0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQsCisJCQkJICAgICAgIGJmZF9hcmNoaXZlKSkKKwkJcy0+aW5wdXRfc3RhdGVtZW50LmxvYWRlZCA9IGZhbHNlOworCisJICAgICAgbGFuZ19saXN0X2luaXQgKCZhZGQpOworCisJICAgICAgbG9hZF9zeW1ib2xzICgmcy0+aW5wdXRfc3RhdGVtZW50LCAmYWRkKTsKKworCSAgICAgIGlmIChhZGQuaGVhZCAhPSBOVUxMKQorCQl7CisJCSAgKmFkZC50YWlsID0gcy0+bmV4dDsKKwkJICBzLT5uZXh0ID0gYWRkLmhlYWQ7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIElmIHRoZXJlIGFyZSBbQ09NTU9OU10gc3RhdGVtZW50cywgcHV0IGEgd2lsZCBvbmUgaW50byB0aGUgYnNzIHNlY3Rpb24gKi8KKworc3RhdGljIHZvaWQKK2xhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyAoKQoreworI2lmIDAKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLnRleHQiKTsKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmRhdGEiKTsKKworICBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID0KKyAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuYnNzIik7CisKKworICBpZiAocGxhY2VkX2NvbW1vbnMgPT0gZmFsc2UpCisgICAgeworICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPQorICAgICAgbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCisJCSZkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLT5jaGlsZHJlbik7CisKKyAgICAgIG5ldy0+c2VjdGlvbl9uYW1lID0gIkNPTU1PTiI7CisgICAgICBuZXctPmZpbGVuYW1lID0gKGNoYXIgKikgTlVMTDsKKyAgICAgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7CisgICAgfQorI2VuZGlmCisKK30KKworLyoKKyBBZGQgdGhlIHN1cHBsaWVkIG5hbWUgdG8gdGhlIHN5bWJvbCB0YWJsZSBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLgorIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBjaGFpbiBhcyB3ZSBvcGVuIGlucHV0IGJmZHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QKK3sKKyAgc3RydWN0IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0ICpuZXh0OworICBjaGFyICpuYW1lOworfSAgICAgICAgICAgICAgICAgICAgICAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZTsKKworc3RhdGljIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKmxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7CisKK3ZvaWQKK2xkbGFuZ19hZGRfdW5kZWYgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Cit7CisgIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKm5ldyA9CisgICAgKChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopCisgICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSkpKTsKKworICBuZXctPm5leHQgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOworICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkID0gbmV3OworCisgIG5ldy0+bmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Cit9CisKKy8qIFJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZHMgY3JlYXRlZCBhYm92ZSBhbmQgcGxhY2UgdGhlbQorICAgaW50byB0aGUgbGlua2VyIGhhc2ggdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMgYmVsb25naW5nIHRvIHRoZQorICAgc2NyaXB0IGZpbGUuCisqLworc3RhdGljIHZvaWQKK2xhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKQoreworICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICpwdHI7CisKKyAgZm9yIChwdHIgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOworICAgICAgIHB0ciAhPSAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqKSBOVUxMOworICAgICAgIHB0ciA9IHB0ci0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgcHRyLT5uYW1lLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKwllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOworICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCisJeworCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOworCSAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKKwkgIGJmZF9saW5rX2FkZF91bmRlZiAobGlua19pbmZvLmhhc2gsIGgpOworCX0KKyAgICB9Cit9CisKKy8qIE9wZW4gaW5wdXQgZmlsZXMgYW5kIGF0dGF0Y2ggdG8gb3V0cHV0IHNlY3Rpb25zICovCitzdGF0aWMgdm9pZAorbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAocywgdGFyZ2V0LCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOworICAgICBDT05TVCBjaGFyICp0YXJnZXQ7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Cit7CisgIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCisJeworCisKKwljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKKwkgIHdpbGQgKCZzLT53aWxkX3N0YXRlbWVudCwgcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAorCQlzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSwgdGFyZ2V0LAorCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOworCisJICBicmVhazsKKwljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgorCSAgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAorCQkJCQl0YXJnZXQsCisJCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7CisJICBicmVhazsKKwljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06CisJICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKKwkJCQkJdGFyZ2V0LAorCQkJCQkmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06CisJICBicmVhazsKKwljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgorCSAgdGFyZ2V0ID0gcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7CisJICBicmVhazsKKwljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06CisJICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKKwkJCQkJdGFyZ2V0LAorCQkJCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKKwljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06CisJY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgorCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgorCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKKwkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gTlVMTAorCSAgICAgICYmIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKKwkgICAgaW5pdF9vcyAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgorCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCisJICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQorCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOworCisJICAvKiBNYWtlIHN1cmUgdGhhdCBhbnkgc2VjdGlvbnMgbWVudGlvbmVkIGluIHRoZSBhc3NpZ25tZW50CisgICAgICAgICAgICAgYXJlIGluaXRpYWxpemVkLiAgKi8KKwkgIGV4cF9pbml0X29zIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06CisJICBGQUlMICgpOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06CisJICAvKiBNYXJrIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBhZGRyZXNzICovCisJICB7CisJICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KKwkgICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAKKwkJKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSk7CisKKwkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQorCSAgICAgIGluaXRfb3MgKG9zKTsKKwkgICAgb3MtPmFkZHJfdHJlZSA9IHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3M7CisJICB9CisJICBicmVhazsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Cit7CisgIGFzZWN0aW9uICpzZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKKyAgaW50IGxlbjsKKworICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IGFic19vdXRwdXRfc2VjdGlvbikKKyAgICB7CisgICAgICBtaW5mbyAoIlxuJXMiLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOworCisgICAgICBpZiAoc2VjdGlvbiAhPSBOVUxMKQorCXsKKwkgIHByaW50X2RvdCA9IHNlY3Rpb24tPnZtYTsKKworCSAgbGVuID0gc3RybGVuIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOworCSAgaWYgKGxlbiA+PSBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCAtIDEpCisJICAgIHsKKwkgICAgICBwcmludF9ubCAoKTsKKwkgICAgICBsZW4gPSAwOworCSAgICB9CisJICB3aGlsZSAobGVuIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEgpCisJICAgIHsKKwkgICAgICBwcmludF9zcGFjZSAoKTsKKwkgICAgICArK2xlbjsKKwkgICAgfQorCisJICBtaW5mbyAoIjB4JVYgJVciLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7CisKKwkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3ZtYSBhZGRyOworCisJICAgICAgYWRkciA9IGV4cF9nZXRfYWJzX2ludCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5sb2FkX2Jhc2UsIDAsCisJCQkJICAgICAgImxvYWQgYmFzZSIsIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7CisJICAgICAgbWluZm8gKF8oIiBsb2FkIGFkZHJlc3MgMHglViIpLCBhZGRyKTsKKwkgICAgfQorCX0KKworICAgICAgcHJpbnRfbmwgKCk7CisgICAgfQorCisgIHByaW50X3N0YXRlbWVudF9saXN0IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmNoaWxkcmVuLmhlYWQsCisJCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfYXNzaWdubWVudCAoYXNzaWdubWVudCwgb3V0cHV0X3NlY3Rpb24pCisgICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGFzc2lnbm1lbnQ7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbjsKK3sKKyAgaW50IGk7CisgIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OworCisgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQorICAgIHByaW50X3NwYWNlICgpOworCisgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKGFzc2lnbm1lbnQtPmV4cC0+YXNzaWduLnNyYywgb3V0cHV0X3NlY3Rpb24sCisJCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgcHJpbnRfZG90LCAmcHJpbnRfZG90KTsKKyAgaWYgKHJlc3VsdC52YWxpZF9wKQorICAgIG1pbmZvICgiMHglViIsIHJlc3VsdC52YWx1ZSArIHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1pbmZvICgiKnVuZGVmKiAgICIpOworI2lmZGVmIEJGRDY0CisgICAgICBtaW5mbyAoIiAgICAgICAgIik7CisjZW5kaWYKKyAgICB9CisKKyAgbWluZm8gKCIgICAgICAgICAgICAgICAgIik7CisKKyAgZXhwX3ByaW50X3RyZWUgKGFzc2lnbm1lbnQtPmV4cCk7CisKKyAgcHJpbnRfbmwgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9pbnB1dF9zdGF0ZW1lbnQgKHN0YXRtKQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogc3RhdG07Cit7CisgIGlmIChzdGF0bS0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJMT0FEICVzXG4iLCBzdGF0bS0+ZmlsZW5hbWUpOworICAgIH0KK30KKworLyogUHJpbnQgYWxsIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkCisgICB2aWEgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCisKK3N0YXRpYyBib29sZWFuIAorcHJpbnRfb25lX3N5bWJvbCAoaGFzaF9lbnRyeSwgcHRyKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFzaF9lbnRyeTsKKyAgICAgUFRSIHB0cjsKK3sKKyAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBwdHI7CisKKyAgaWYgKChoYXNoX2VudHJ5LT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAorICAgICAgIHx8IGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorICAgICAgJiYgc2VjID09IGhhc2hfZW50cnktPnUuZGVmLnNlY3Rpb24pCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQorCXByaW50X3NwYWNlICgpOworICAgICAgbWluZm8gKCIweCVWICAgIiwKKwkgICAgIChoYXNoX2VudHJ5LT51LmRlZi52YWx1ZQorCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAorCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpOworCisgICAgICBtaW5mbyAoIiAgICAgICAgICAgICAlVFxuIiwgaGFzaF9lbnRyeS0+cm9vdC5zdHJpbmcpOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5wdXQgc2VjdGlvbiB0byB0aGUgbWFwIGZpbGUuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfaW5wdXRfc2VjdGlvbiAoaW4pCisgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICogaW47Cit7CisgIGFzZWN0aW9uICppID0gaW4tPnNlY3Rpb247CisgIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGktPl9jb29rZWRfc2l6ZSAhPSAwID8gaS0+X2Nvb2tlZF9zaXplIDogaS0+X3Jhd19zaXplOworCisgIGlmIChzaXplICE9IDApCisgICAgeworICAgICAgcHJpbnRfc3BhY2UgKCk7CisKKyAgICAgIG1pbmZvICgiJXMiLCBpLT5uYW1lKTsKKworICAgICAgaWYgKGktPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisJeworCSAgaW50IGxlbjsKKworCSAgbGVuID0gMSArIHN0cmxlbiAoaS0+bmFtZSk7CisJICBpZiAobGVuID49IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIIC0gMSkKKwkgICAgeworCSAgICAgIHByaW50X25sICgpOworCSAgICAgIGxlbiA9IDA7CisJICAgIH0KKwkgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKKwkgICAgeworCSAgICAgIHByaW50X3NwYWNlICgpOworCSAgICAgICsrbGVuOworCSAgICB9CisKKwkgIG1pbmZvICgiMHglViAlVyAlQlxuIiwKKwkJIGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0LCBzaXplLAorCQkgaS0+b3duZXIpOworCisJICBpZiAoaS0+X2Nvb2tlZF9zaXplICE9IDAgJiYgaS0+X2Nvb2tlZF9zaXplICE9IGktPl9yYXdfc2l6ZSkKKwkgICAgeworCSAgICAgIGxlbiA9IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIICsgMzsKKyNpZmRlZiBCRkQ2NAorCSAgICAgIGxlbiArPSAxNjsKKyNlbHNlCisJICAgICAgbGVuICs9IDg7CisjZW5kaWYKKwkgICAgICB3aGlsZSAobGVuID4gMCkKKwkJeworCQkgIHByaW50X3NwYWNlICgpOworCQkgIC0tbGVuOworCQl9CisKKwkgICAgICBtaW5mbyAoXygiJVcgKHNpemUgYmVmb3JlIHJlbGF4aW5nKVxuIiksIGktPl9yYXdfc2l6ZSk7CisJICAgIH0KKworCSAgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHByaW50X29uZV9zeW1ib2wsIChQVFIpIGkpOworCisJICBwcmludF9kb3QgPSBpLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaS0+b3V0cHV0X29mZnNldCArIHNpemU7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X2ZpbGxfc3RhdGVtZW50IChmaWxsKQorICAgICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKiBmaWxsOworeworICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIgRklMTCBtYXNrIDB4JXhcbiIsIGZpbGwtPmZpbGwpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZGF0YV9zdGF0ZW1lbnQgKGRhdGEpCisgICAgIGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqIGRhdGE7Cit7CisgIGludCBpOworICBiZmRfdm1hIGFkZHI7CisgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKKyAgICBwcmludF9zcGFjZSAoKTsKKworICBhZGRyID0gZGF0YS0+b3V0cHV0X3ZtYTsKKyAgaWYgKGRhdGEtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisgICAgYWRkciArPSBkYXRhLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCisgIHN3aXRjaCAoZGF0YS0+dHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIGNhc2UgQllURToKKyAgICAgIHNpemUgPSBCWVRFX1NJWkU7CisgICAgICBuYW1lID0gIkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSE9SVDoKKyAgICAgIHNpemUgPSBTSE9SVF9TSVpFOworICAgICAgbmFtZSA9ICJTSE9SVCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIExPTkc6CisgICAgICBzaXplID0gTE9OR19TSVpFOworICAgICAgbmFtZSA9ICJMT05HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUVVBRDoKKyAgICAgIHNpemUgPSBRVUFEX1NJWkU7CisgICAgICBuYW1lID0gIlFVQUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTUVVBRDoKKyAgICAgIHNpemUgPSBRVUFEX1NJWkU7CisgICAgICBuYW1lID0gIlNRVUFEIjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBtaW5mbyAoIjB4JVYgJVcgJXMgMHgldiIsIGFkZHIsIHNpemUsIG5hbWUsIGRhdGEtPnZhbHVlKTsKKworICBpZiAoZGF0YS0+ZXhwLT50eXBlLm5vZGVfY2xhc3MgIT0gZXRyZWVfdmFsdWUpCisgICAgeworICAgICAgcHJpbnRfc3BhY2UgKCk7CisgICAgICBleHBfcHJpbnRfdHJlZSAoZGF0YS0+ZXhwKTsKKyAgICB9CisKKyAgcHJpbnRfbmwgKCk7CisKKyAgcHJpbnRfZG90ID0gYWRkciArIHNpemU7Cit9CisKKy8qIFByaW50IGFuIGFkZHJlc3Mgc3RhdGVtZW50LiAgVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBvcHRpb25zIGxpa2UKKyAgIC1UdGV4dC4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9hZGRyZXNzX3N0YXRlbWVudCAoYWRkcmVzcykKKyAgICAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICphZGRyZXNzOworeworICBtaW5mbyAoXygiQWRkcmVzcyBvZiBzZWN0aW9uICVzIHNldCB0byAiKSwgYWRkcmVzcy0+c2VjdGlvbl9uYW1lKTsKKyAgZXhwX3ByaW50X3RyZWUgKGFkZHJlc3MtPmFkZHJlc3MpOworICBwcmludF9ubCAoKTsKK30KKworLyogUHJpbnQgYSByZWxvYyBzdGF0ZW1lbnQuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfcmVsb2Nfc3RhdGVtZW50IChyZWxvYykKKyAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcmVsb2M7Cit7CisgIGludCBpOworICBiZmRfdm1hIGFkZHI7CisgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKKyAgICBwcmludF9zcGFjZSAoKTsKKworICBhZGRyID0gcmVsb2MtPm91dHB1dF92bWE7CisgIGlmIChyZWxvYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKKyAgICBhZGRyICs9IHJlbG9jLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworCisgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jLT5ob3d0byk7CisKKyAgbWluZm8gKCIweCVWICVXIFJFTE9DICVzICIsIGFkZHIsIHNpemUsIHJlbG9jLT5ob3d0by0+bmFtZSk7CisKKyAgaWYgKHJlbG9jLT5uYW1lICE9IE5VTEwpCisgICAgbWluZm8gKCIlcysiLCByZWxvYy0+bmFtZSk7CisgIGVsc2UKKyAgICBtaW5mbyAoIiVzKyIsIHJlbG9jLT5zZWN0aW9uLT5uYW1lKTsKKworICBleHBfcHJpbnRfdHJlZSAocmVsb2MtPmFkZGVuZF9leHApOworCisgIHByaW50X25sICgpOworCisgIHByaW50X2RvdCA9IGFkZHIgKyBzaXplOworfSAgCisKK3N0YXRpYyB2b2lkCitwcmludF9wYWRkaW5nX3N0YXRlbWVudCAocykKKyAgICAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlICpzOworeworICBpbnQgbGVuOworICBiZmRfdm1hIGFkZHI7CisKKyAgbWluZm8gKCIgKmZpbGwqIik7CisKKyAgbGVuID0gc2l6ZW9mICIgKmZpbGwqIiAtIDE7CisgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKKyAgICB7CisgICAgICBwcmludF9zcGFjZSAoKTsKKyAgICAgICsrbGVuOworICAgIH0KKworICBhZGRyID0gcy0+b3V0cHV0X29mZnNldDsKKyAgaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCisgICAgYWRkciArPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hOworICBtaW5mbyAoIjB4JVYgJVciLCBhZGRyLCBzLT5zaXplKTsKKworICBpZiAocy0+ZmlsbCAhPSAwKQorICAgIG1pbmZvICgiICV1Iiwgcy0+ZmlsbCk7CisKKyAgcHJpbnRfbmwgKCk7CisKKyAgcHJpbnRfZG90ID0gYWRkciArIHMtPnNpemU7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF93aWxkX3N0YXRlbWVudCAodywgb3MpCisgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqIHc7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvczsKK3sKKyAgcHJpbnRfc3BhY2UgKCk7CisKKyAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCisgICAgbWluZm8gKCJTT1JUKCIpOworICBpZiAody0+ZXhjbHVkZV9maWxlbmFtZSAhPSBOVUxMKQorICAgIG1pbmZvICgiRVhDTFVERV9GSUxFICggJXMgKSIsIHctPmV4Y2x1ZGVfZmlsZW5hbWUpOworICBpZiAody0+ZmlsZW5hbWUgIT0gTlVMTCkKKyAgICBtaW5mbyAoIiVzIiwgdy0+ZmlsZW5hbWUpOworICBlbHNlCisgICAgbWluZm8gKCIqIik7CisgIGlmICh3LT5maWxlbmFtZXNfc29ydGVkKQorICAgIG1pbmZvICgiKSIpOworCisgIG1pbmZvICgiKCIpOworICBpZiAody0+c2VjdGlvbnNfc29ydGVkKQorICAgIG1pbmZvICgiU09SVCgiKTsKKyAgaWYgKHctPnNlY3Rpb25fbmFtZSAhPSBOVUxMKQorICAgIG1pbmZvICgiJXMiLCB3LT5zZWN0aW9uX25hbWUpOworICBlbHNlCisgICAgbWluZm8gKCIqIik7CisgIGlmICh3LT5zZWN0aW9uc19zb3J0ZWQpCisgICAgbWluZm8gKCIpIik7CisgIG1pbmZvICgiKSIpOworCisgIHByaW50X25sICgpOworCisgIHByaW50X3N0YXRlbWVudF9saXN0ICh3LT5jaGlsZHJlbi5oZWFkLCBvcyk7Cit9CisKKy8qIFByaW50IGEgZ3JvdXAgc3RhdGVtZW50LiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2dyb3VwIChzLCBvcykKKyAgICAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqczsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Cit7CisgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlNUQVJUIEdST1VQXG4iKTsKKyAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMtPmNoaWxkcmVuLmhlYWQsIG9zKTsKKyAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiRU5EIEdST1VQXG4iKTsKK30KKworLyogUHJpbnQgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiBTLgorICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZvciBhbnkgc3RhdGVtZW50IHR5cGUuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMsIG9zKQorICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOworICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKK3sKKyAgd2hpbGUgKHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludF9zdGF0ZW1lbnQgKHMsIG9zKTsKKyAgICAgIHMgPSBzLT5uZXh0OworICAgIH0KK30KKworLyogUHJpbnQgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiBzdGF0ZW1lbnQgbGlzdCBTLgorICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZvciBhbnkgc3RhdGVtZW50IHR5cGUuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3RhdGVtZW50IChzLCBvcykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Cit7CisgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsIF8oIkZhaWwgd2l0aCAlZFxuIiksIHMtPmhlYWRlci50eXBlKTsKKyAgICAgIEZBSUwgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgorICAgICAgaWYgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCAhPSBOVUxMKQorCXsKKwkgIGlmIChjb25zdHJ1Y3RvcnNfc29ydGVkKQorCSAgICBtaW5mbyAoIiBTT1JUIChDT05TVFJVQ1RPUlMpXG4iKTsKKwkgIGVsc2UKKwkgICAgbWluZm8gKCIgQ09OU1RSVUNUT1JTXG4iKTsKKwkgIHByaW50X3N0YXRlbWVudF9saXN0IChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIG9zKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKKyAgICAgIHByaW50X3dpbGRfc3RhdGVtZW50ICgmcy0+d2lsZF9zdGF0ZW1lbnQsIG9zKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgorICAgICAgcHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQgKCZzLT5hZGRyZXNzX3N0YXRlbWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06CisgICAgICBtaW5mbyAoIiBDUkVBVEVfT0JKRUNUX1NZTUJPTFNcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06CisgICAgICBwcmludF9maWxsX3N0YXRlbWVudCAoJnMtPmZpbGxfc3RhdGVtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgorICAgICAgcHJpbnRfZGF0YV9zdGF0ZW1lbnQgKCZzLT5kYXRhX3N0YXRlbWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06CisgICAgICBwcmludF9yZWxvY19zdGF0ZW1lbnQgKCZzLT5yZWxvY19zdGF0ZW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKKyAgICAgIHByaW50X2lucHV0X3NlY3Rpb24gKCZzLT5pbnB1dF9zZWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgorICAgICAgcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgKCZzLT5wYWRkaW5nX3N0YXRlbWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06CisgICAgICBwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKCZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06CisgICAgICBwcmludF9hc3NpZ25tZW50ICgmcy0+YXNzaWdubWVudF9zdGF0ZW1lbnQsIG9zKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06CisgICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJUQVJHRVQoJXMpXG4iLCBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgorICAgICAgbWluZm8gKCJPVVRQVVQoJXMiLCBzLT5vdXRwdXRfc3RhdGVtZW50Lm5hbWUpOworICAgICAgaWYgKG91dHB1dF90YXJnZXQgIT0gTlVMTCkKKwltaW5mbyAoIiAlcyIsIG91dHB1dF90YXJnZXQpOworICAgICAgbWluZm8gKCIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKKyAgICAgIHByaW50X2lucHV0X3N0YXRlbWVudCAoJnMtPmlucHV0X3N0YXRlbWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06CisgICAgICBwcmludF9ncm91cCAoJnMtPmdyb3VwX3N0YXRlbWVudCwgb3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06CisgICAgICBGQUlMICgpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc3RhdGVtZW50cyAoKQoreworICBwcmludF9zdGF0ZW1lbnRfbGlzdCAoc3RhdGVtZW50X2xpc3QuaGVhZCwgYWJzX291dHB1dF9zZWN0aW9uKTsKK30KKworLyogUHJpbnQgdGhlIGZpcnN0IE4gc3RhdGVtZW50cyBpbiBzdGF0ZW1lbnQgbGlzdCBTIHRvIFNUREVSUi4KKyAgIElmIE4gPT0gMCwgbm90aGluZyBpcyBwcmludGVkLgorICAgSWYgTiA8IDAsIHRoZSBlbnRpcmUgbGlzdCBpcyBwcmludGVkLgorICAgSW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gR0RCLiAgKi8KKwordm9pZAorZHByaW50X3N0YXRlbWVudCAocywgbikKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7CisgICAgIGludCBuOworeworICBGSUxFICptYXBfc2F2ZSA9IGNvbmZpZy5tYXBfZmlsZTsKKworICBjb25maWcubWFwX2ZpbGUgPSBzdGRlcnI7CisKKyAgaWYgKG4gPCAwKQorICAgIHByaW50X3N0YXRlbWVudF9saXN0IChzLCBhYnNfb3V0cHV0X3NlY3Rpb24pOworICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKHMgJiYgLS1uID49IDApCisJeworCSAgcHJpbnRfc3RhdGVtZW50IChzLCBhYnNfb3V0cHV0X3NlY3Rpb24pOworCSAgcyA9IHMtPm5leHQ7CisJfQorICAgIH0KKworICBjb25maWcubWFwX2ZpbGUgPSBtYXBfc2F2ZTsKK30KKworc3RhdGljIGJmZF92bWEKK2luc2VydF9wYWQgKHRoaXNfcHRyLCBmaWxsLCBwb3dlciwgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBkb3QpCisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogdGhpc19wdHI7CisgICAgIGZpbGxfdHlwZSBmaWxsOworICAgICB1bnNpZ25lZCBpbnQgcG93ZXI7CisgICAgIGFzZWN0aW9uICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OworICAgICBiZmRfdm1hIGRvdDsKK3sKKyAgLyogQWxpZ24gdGhpcyBzZWN0aW9uIGZpcnN0IHRvIHRoZQorICAgICBpbnB1dCBzZWN0aW9ucyByZXF1aXJlbWVudCwgdGhlbgorICAgICB0byB0aGUgb3V0cHV0IHNlY3Rpb24ncyByZXF1aXJlbWVudC4KKyAgICAgSWYgdGhpcyBhbGlnbm1lbnQgaXMgPiB0aGFuIGFueSBzZWVuIGJlZm9yZSwKKyAgICAgdGhlbiByZWNvcmQgaXQgdG9vLiBQZXJmb3JtIHRoZSBhbGlnbm1lbnQgYnkKKyAgICAgaW5zZXJ0aW5nIGEgbWFnaWMgJ3BhZGRpbmcnIHN0YXRlbWVudC4KKyAgICAgKi8KKworICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X25lZWRlZCA9IGFsaWduX3Bvd2VyIChkb3QsIHBvd2VyKSAtIGRvdDsKKworICBpZiAoYWxpZ25tZW50X25lZWRlZCAhPSAwKQorICAgIHsKKyAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9CisJKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCisJIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOworCisgICAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4gKi8KKyAgICAgIG5ldy0+aGVhZGVyLm5leHQgPSAqdGhpc19wdHI7CisgICAgICAqdGhpc19wdHIgPSBuZXc7CisgICAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOworICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKyAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9CisJZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT52bWE7CisgICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOworICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gYWxpZ25tZW50X25lZWRlZDsKKyAgICB9CisKKworICAvKiBSZW1lbWJlciB0aGUgbW9zdCByZXN0cmljdGl2ZSBhbGlnbm1lbnQgKi8KKyAgaWYgKHBvd2VyID4gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIpCisgICAgeworICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKKyAgICB9CisgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+X3Jhd19zaXplICs9IGFsaWdubWVudF9uZWVkZWQ7CisgIHJldHVybiBhbGlnbm1lbnRfbmVlZGVkICsgZG90OworCit9CisKKy8qIFdvcmsgb3V0IGhvdyBtdWNoIHRoaXMgc2VjdGlvbiB3aWxsIG1vdmUgdGhlIGRvdCBwb2ludCAqLworc3RhdGljIGJmZF92bWEKK3NpemVfaW5wdXRfc2VjdGlvbiAodGhpc19wdHIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZmlsbCwgZG90LCByZWxheCkKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKKyAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKyAgICAgZmlsbF90eXBlIGZpbGw7CisgICAgIGJmZF92bWEgZG90OworICAgICBib29sZWFuIHJlbGF4OworeworICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqaXMgPSAmKCgqdGhpc19wdHIpLT5pbnB1dF9zZWN0aW9uKTsKKyAgYXNlY3Rpb24gKmkgPSBpcy0+c2VjdGlvbjsKKworICBpZiAoaXMtPmlmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKKyAgICB7CisgICAgICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5zdWJzZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKKyAgICAgICBpLT5hbGlnbm1lbnRfcG93ZXIgPQorCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQ7CisKKyAgICAgIGRvdCA9IGluc2VydF9wYWQgKHRoaXNfcHRyLCBmaWxsLCBpLT5hbGlnbm1lbnRfcG93ZXIsCisJCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLCBkb3QpOworCisgICAgICAvKiBSZW1lbWJlciB3aGVyZSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gdGhpcyBpbnB1dCBzZWN0aW9uIGdvZXMgKi8KKworICAgICAgaS0+b3V0cHV0X29mZnNldCA9IGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKKworICAgICAgLyogTWFyayBob3cgYmlnIHRoZSBvdXRwdXQgc2VjdGlvbiBtdXN0IGJlIHRvIGNvbnRhaW4gdGhpcyBub3cKKwkgKi8KKyAgICAgIGlmIChpLT5fY29va2VkX3NpemUgIT0gMCkKKwlkb3QgKz0gaS0+X2Nvb2tlZF9zaXplOworICAgICAgZWxzZQorCWRvdCArPSBpLT5fcmF3X3NpemU7CisgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaS0+b3V0cHV0X29mZnNldCA9IGktPnZtYSAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKKyAgICB9CisKKyAgcmV0dXJuIGRvdDsKK30KKworLyogQ2hlY2sgdG8gc2VlIGlmIGFueSBhbGxvY2F0ZWQgc2VjdGlvbnMgb3ZlcmxhcCB3aXRoIG90aGVyIGFsbG9jYXRlZAorICAgc2VjdGlvbnMuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgbGlua2VyIHNjcmlwdCBzcGVjaWZpY2FsbHkgc3BlY2lmaWVzCisgICB0aGUgb3V0cHV0IHNlY3Rpb24gYWRkcmVzc2VzIG9mIHRoZSB0d28gc2VjdGlvbnMuICAqLworc3RhdGljIHZvaWQKK2xhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCkKK3sKKyAgYXNlY3Rpb24gKiBzOworCisgIC8qIFNjYW4gYWxsIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgbGlzdC4gICovCisgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIC8qIElnbm9yZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IGxvYWRlZCBvciB3aGljaCBoYXZlIG5vIGNvbnRlbnRzLiAgKi8KKyAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgcykgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKQorCSYmIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHMpICE9IDApCisgICAgICB7CisJYXNlY3Rpb24gKiBvczsKKworCS8qIE9uY2Ugd2UgcmVhY2ggc2VjdGlvbiAncycgc3RvcCBvdXIgc2VhY2guICBUaGlzIHByZXZlbnRzIHR3bworCSAgIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSBiZWluZyBwcm9kdWNlZCwgb25lIGZvciAnc2VjdGlvbiBBIG92ZXJsYXBzCisJICAgc2VjdGlvbiBCJyBhbmQgb25lIGZvciAnc2VjdGlvbiBCIG92ZXJsYXBzIHNlY3Rpb24gQScuICAqLworCWZvciAob3MgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgb3MgIT0gczsgb3MgPSBvcy0+bmV4dCkKKwkgIHsKKwkgICAgYmZkX3ZtYSBzX3N0YXJ0OworCSAgICBiZmRfdm1hIHNfZW5kOworCSAgICBiZmRfdm1hIG9zX3N0YXJ0OworCSAgICBiZmRfdm1hIG9zX2VuZDsKKworCSAgICAvKiBPbmx5IGNvbnNpZGVyIGxvYWRhYmxlIHNlY3Rpb25zIHdpdGggcmVhbCBjb250ZW50cy4gICovCisJICAgIGlmICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MpCisJCSAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSA9PSAwKQorCQl8fCBiZmRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCBvcykgPT0gMCkKKwkgICAgICBjb250aW51ZTsKKworCSAgICAvKiBXZSBtdXN0IGNoZWNrIHRoZSBzZWN0aW9ucycgTE1BIGFkZHJlc3NlcyBub3QgdGhlaXIKKwkgICAgICAgVk1BIGFkZHJlc3NlcyBiZWNhdXNlIG92ZXJsYXkgc2VjdGlvbnMgY2FuIGhhdmUKKwkgICAgICAgb3ZlcmxhcHBpbmcgVk1BcyBidXQgdGhleSBtdXN0IGhhdmUgZGlzdGluY3QgTE1Bcy4gICovCisJICAgIHNfc3RhcnQgID0gYmZkX3NlY3Rpb25fbG1hIChvdXRwdXRfYmZkLCBzKTsKKwkgICAgb3Nfc3RhcnQgPSBiZmRfc2VjdGlvbl9sbWEgKG91dHB1dF9iZmQsIG9zKTsKKwkgICAgc19lbmQgICAgPSBzX3N0YXJ0ICArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHMpIC0gMTsKKwkgICAgb3NfZW5kICAgPSBvc19zdGFydCArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIG9zKSAtIDE7CisKKwkgICAgLyogTG9vayBmb3IgYW4gb3ZlcmxhcC4gICovCisJICAgIGlmICgoc19lbmQgPCBvc19zdGFydCkgfHwgKHNfc3RhcnQgPiBvc19lbmQpKQorCSAgICAgIGNvbnRpbnVlOworCSAgICAKKwkgICAgZWluZm8gKAorXygiJVglUDogc2VjdGlvbiAlcyBbJVYgLT4gJVZdIG92ZXJsYXBzIHNlY3Rpb24gJXMgWyVWIC0+ICVWXVxuIiksCisJCSAgIHMtPm5hbWUsIHNfc3RhcnQsIHNfZW5kLCBvcy0+bmFtZSwgb3Nfc3RhcnQsIG9zX2VuZCk7CisKKwkgICAgLyogT25jZSB3ZSBoYXZlIGZvdW5kIG9uZSBvdmVybGFwIGZvciB0aGlzIHNlY3Rpb24sCisJICAgICAgIHN0b3AgbG9va2luZyBmb3Igb3RoZXJzLiAgKi8KKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9Cit9CisKKy8qIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgYmZkX3JlbGF4X3NlY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAorICAgYWdhaW4uICAqLworCitzdGF0aWMgYm9vbGVhbiByZWxheF9hZ2FpbjsKKworLyogU2V0IHRoZSBzaXplcyBmb3IgYWxsIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLworCitiZmRfdm1hCitsYW5nX3NpemVfc2VjdGlvbnMgKHMsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgcHJldiwgZmlsbCwgZG90LCByZWxheCkKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7CisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogcHJldjsKKyAgICAgZmlsbF90eXBlIGZpbGw7CisgICAgIGJmZF92bWEgZG90OworICAgICBib29sZWFuIHJlbGF4OworeworICAvKiBTaXplIHVwIHRoZSBzZWN0aW9ucyBmcm9tIHRoZWlyIGNvbnN0aXR1ZW50IHBhcnRzLiAgKi8KKyAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKKwl7CisJY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgorCSAgeworCSAgICBiZmRfdm1hIGFmdGVyOworCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7CisKKwkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQorCSAgICAgIC8qIFRoaXMgc2VjdGlvbiB3YXMgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlZC4gICovCisJICAgICAgYnJlYWs7CisKKwkgICAgLyogSWYgdGhpcyBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiwgdXNlIHRoZSBzaXplIGFuZAorCSAgICAgICBhZGRyZXNzIGZyb20gdGhlIGlucHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcyBpcyBDT0ZGCisJICAgICAgIHNwZWNpZmljOyBpdCB3b3VsZCBiZSBjbGVhbmVyIGlmIHRoZXJlIHdlcmUgc29tZSBvdGhlciB3YXkKKwkgICAgICAgdG8gZG8gdGhpcywgYnV0IG5vdGhpbmcgc2ltcGxlIGNvbWVzIHRvIG1pbmQuICAqLworCSAgICBpZiAoKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKKwkgICAgICB7CisJCWFzZWN0aW9uICogaW5wdXQ7CisKKwkJaWYgKG9zLT5jaGlsZHJlbi5oZWFkID09IE5VTEwKKwkJICAgIHx8IG9zLT5jaGlsZHJlbi5oZWFkLT5uZXh0ICE9IE5VTEwKKwkJICAgIHx8IG9zLT5jaGlsZHJlbi5oZWFkLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKKwkJICBlaW5mbyAoXygiJVAlWDogSW50ZXJuYWwgZXJyb3Igb24gQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uICVzXG4iKSwKKwkJCSBvcy0+bmFtZSk7CisKKwkJaW5wdXQgPSBvcy0+Y2hpbGRyZW4uaGVhZC0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOworCQliZmRfc2V0X3NlY3Rpb25fdm1hIChvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAorCQkJCSAgICAgb3MtPmJmZF9zZWN0aW9uLAorCQkJCSAgICAgYmZkX3NlY3Rpb25fdm1hIChpbnB1dC0+b3duZXIsIGlucHV0KSk7CisJCW9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplID0gaW5wdXQtPl9yYXdfc2l6ZTsKKwkJYnJlYWs7CisJICAgICAgfQorCisJICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG9zLT5iZmRfc2VjdGlvbikpCisJICAgICAgeworCQkvKiBObyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCBhbiBhYnMgc2VjdGlvbiBzdGFydHMgYXQgemVyby4gICovCisJCUFTU0VSVCAob3MtPmJmZF9zZWN0aW9uLT52bWEgPT0gMCk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlpZiAob3MtPmFkZHJfdHJlZSA9PSAoZXRyZWVfdHlwZSAqKSBOVUxMKQorCQkgIHsKKwkJICAgIC8qIE5vIGFkZHJlc3Mgc3BlY2lmaWVkIGZvciB0aGlzIHNlY3Rpb24sIGdldCBvbmUKKwkJICAgICAgIGZyb20gdGhlIHJlZ2lvbiBzcGVjaWZpY2F0aW9uLiAgKi8KKwkJICAgIGlmIChvcy0+cmVnaW9uID09IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMCisJCQl8fCAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKKwkJCSAgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkgIT0gMCkKKwkJCSAgICAmJiBvcy0+cmVnaW9uLT5uYW1lWzBdID09ICcqJworCQkJICAgICYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDApKQorCQkgICAgICB7CisJCQlvcy0+cmVnaW9uID0gbGFuZ19tZW1vcnlfZGVmYXVsdCAob3MtPmJmZF9zZWN0aW9uKTsKKwkJICAgICAgfQorCisJCSAgICAvKiBJZiBhIGxvYWRhYmxlIHNlY3Rpb24gaXMgdXNpbmcgdGhlIGRlZmF1bHQgbWVtb3J5CisJCSAgICAgICByZWdpb24sIGFuZCBzb21lIG5vbiBkZWZhdWx0IG1lbW9yeSByZWdpb25zIHdlcmUKKwkJICAgICAgIGRlZmluZWQsIGlzc3VlIGEgd2FybmluZy4gICovCisJCSAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQorCQkJICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkgIT0gMAorCQkJJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCisJCQkmJiBzdHJjbXAgKG9zLT5yZWdpb24tPm5hbWUsICIqZGVmYXVsdCoiKSA9PSAwCisJCQkmJiBsYW5nX21lbW9yeV9yZWdpb25fbGlzdCAhPSBOVUxMCisJCQkmJiAoc3RyY21wIChsYW5nX21lbW9yeV9yZWdpb25fbGlzdC0+bmFtZSwgIipkZWZhdWx0KiIpICE9IDAKKwkJCSAgICB8fCBsYW5nX21lbW9yeV9yZWdpb25fbGlzdC0+bmV4dCAhPSBOVUxMKSkKKwkJICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBubyBtZW1vcnkgcmVnaW9uIHNwZWNpZmllZCBmb3Igc2VjdGlvbiBgJXMnXG4iKSwKKwkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikpOworCisJCSAgICBkb3QgPSBvcy0+cmVnaW9uLT5jdXJyZW50OworIAorCQkgICAgaWYgKG9zLT5zZWN0aW9uX2FsaWdubWVudCA9PSAtMSkKKwkJICAgICAgeworCQkJYmZkX3ZtYSBvbGRkb3Q7CisKKwkJCW9sZGRvdCA9IGRvdDsKKwkJCWRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKKworCQkJaWYgKGRvdCAhPSBvbGRkb3QgJiYgY29uZmlnLndhcm5fc2VjdGlvbl9hbGlnbikKKwkJCSAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjaGFuZ2luZyBzdGFydCBvZiBzZWN0aW9uICVzIGJ5ICV1IGJ5dGVzXG4iKSwKKwkJCQkgb3MtPm5hbWUsICh1bnNpZ25lZCBpbnQpIChkb3QgLSBvbGRkb3QpKTsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGV0cmVlX3ZhbHVlX3R5cGUgcjsKKworCQkgICAgciA9IGV4cF9mb2xkX3RyZWUgKG9zLT5hZGRyX3RyZWUsCisJCQkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKKwkJCQkgICAgICAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sCisJCQkJICAgICAgIGRvdCwgJmRvdCk7CisJCSAgICBpZiAoci52YWxpZF9wID09IGZhbHNlKQorCQkgICAgICB7CisJCQllaW5mbyAoXygiJUYlUzogbm9uIGNvbnN0YW50IGFkZHJlc3MgZXhwcmVzc2lvbiBmb3Igc2VjdGlvbiAlc1xuIiksCisJCQkgICAgICAgb3MtPm5hbWUpOworCQkgICAgICB9CisJCSAgICBkb3QgPSByLnZhbHVlICsgci5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOworCQkgIH0KKwkJCisJCS8qIFRoZSBzZWN0aW9uIHN0YXJ0cyBoZXJlLgorCQkgICBGaXJzdCwgYWxpZ24gdG8gd2hhdCB0aGUgc2VjdGlvbiBuZWVkcy4gICovCisKKwkJaWYgKG9zLT5zZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKKwkJICBkb3QgPSBhbGlnbl9wb3dlciAoZG90LCBvcy0+c2VjdGlvbl9hbGlnbm1lbnQpOworCisJCWJmZF9zZXRfc2VjdGlvbl92bWEgKDAsIG9zLT5iZmRfc2VjdGlvbiwgZG90KTsKKwkJCisJCW9zLT5iZmRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7CisJICAgICAgfQorCisJICAgICh2b2lkKSBsYW5nX3NpemVfc2VjdGlvbnMgKG9zLT5jaGlsZHJlbi5oZWFkLCBvcywgJm9zLT5jaGlsZHJlbi5oZWFkLAorCQkJCSAgICAgICBvcy0+ZmlsbCwgZG90LCByZWxheCk7CisJICAgIAorCSAgICAvKiBJZ25vcmUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb25zLCB1c2UgdGhlIHZtYSBhbmQgc2l6ZSB0bworCSAgICAgICBhbGlnbiBhZ2FpbnN0LiAgKi8KKworCSAgICBhZnRlciA9IEFMSUdOX04gKG9zLT5iZmRfc2VjdGlvbi0+dm1hICsKKwkJCSAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUsCisJCQkgICAgIC8qIFRoZSBjb2VyY2lvbiBoZXJlIGlzIGltcG9ydGFudCwgc2VlIGxkLmguICAqLworCQkJICAgICAoYmZkX3ZtYSkgb3MtPmJsb2NrX3ZhbHVlKTsKKworCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChvcy0+YmZkX3NlY3Rpb24pKQorCSAgICAgIEFTU0VSVCAoYWZ0ZXIgPT0gb3MtPmJmZF9zZWN0aW9uLT52bWEpOworCSAgICBlbHNlCisJICAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBhZnRlciAtIG9zLT5iZmRfc2VjdGlvbi0+dm1hOworCSAgICBkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYSArIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplOworCSAgICBvcy0+cHJvY2Vzc2VkID0gdHJ1ZTsKKworCSAgICAvKiBVcGRhdGUgZG90IGluIHRoZSByZWdpb24gPworCSAgICAgICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgYWxsb2NhdGVkLAorCSAgICAgICBzaW5jZSB1bmFsbG9jYXRlZCBzZWN0aW9ucyBkbyBub3QgY29udHJpYnV0ZSB0byB0aGUgcmVnaW9uJ3MKKwkgICAgICAgb3ZlcmFsbCBzaXplIGluIG1lbW9yeS4gICovCisJICAgIGlmIChvcy0+cmVnaW9uICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMCisJCSYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKKwkJJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSkKKwkgICAgICB7CisJCW9zLT5yZWdpb24tPmN1cnJlbnQgPSBkb3Q7CisJCQorCQkvKiBNYWtlIHN1cmUgdGhpcyBpc24ndCBzaWxseS4gICovCisJCWlmIChvcy0+cmVnaW9uLT5jdXJyZW50IDwgb3MtPnJlZ2lvbi0+b3JpZ2luCisJCSAgICB8fCAob3MtPnJlZ2lvbi0+Y3VycmVudCAtIG9zLT5yZWdpb24tPm9yaWdpbgorCQkJPiBvcy0+cmVnaW9uLT5sZW5ndGgpKQorCQkgIHsKKwkJICAgIGlmIChvcy0+YWRkcl90cmVlICE9IChldHJlZV90eXBlICopIE5VTEwpCisJCSAgICAgIHsKKwkJCWVpbmZvIChfKCIlWCVQOiBhZGRyZXNzIDB4JXYgb2YgJUIgc2VjdGlvbiAlcyBpcyBub3Qgd2l0aGluIHJlZ2lvbiAlc1xuIiksCisJCQkgICAgICAgb3MtPnJlZ2lvbi0+Y3VycmVudCwKKwkJCSAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAorCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+bmFtZSwKKwkJCSAgICAgICBvcy0+cmVnaW9uLT5uYW1lKTsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICB7CisJCQllaW5mbyAoXygiJVglUDogcmVnaW9uICVzIGlzIGZ1bGwgKCVCIHNlY3Rpb24gJXMpXG4iKSwKKwkJCSAgICAgICBvcy0+cmVnaW9uLT5uYW1lLAorCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCisJCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5uYW1lKTsKKwkJICAgICAgfQorCQkgICAgLyogUmVzZXQgdGhlIHJlZ2lvbiBwb2ludGVyLiAgKi8KKwkJICAgIG9zLT5yZWdpb24tPmN1cnJlbnQgPSBvcy0+cmVnaW9uLT5vcmlnaW47CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKKwkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAorCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkJICAgICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAorCQkJCSAgICBmaWxsLAorCQkJCSAgICBkb3QsIHJlbGF4KTsKKwkgIGJyZWFrOworCisJY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06CisJICB7CisJICAgIHVuc2lnbmVkIGludCBzaXplID0gMDsKKworCSAgICBzLT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfdm1hID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOworCSAgICBzLT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9CisJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKKworCSAgICBzd2l0Y2ggKHMtPmRhdGFfc3RhdGVtZW50LnR5cGUpCisJICAgICAgeworCSAgICAgIGNhc2UgUVVBRDoKKwkgICAgICBjYXNlIFNRVUFEOgorCQlzaXplID0gUVVBRF9TSVpFOworCQlicmVhazsKKwkgICAgICBjYXNlIExPTkc6CisJCXNpemUgPSBMT05HX1NJWkU7CisJCWJyZWFrOworCSAgICAgIGNhc2UgU0hPUlQ6CisJCXNpemUgPSBTSE9SVF9TSVpFOworCQlicmVhazsKKwkgICAgICBjYXNlIEJZVEU6CisJCXNpemUgPSBCWVRFX1NJWkU7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICBkb3QgKz0gc2l6ZTsKKwkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemU7CisJICAgIC8qIFRoZSBvdXRwdXQgc2VjdGlvbiBnZXRzIGNvbnRlbnRzLCBhbmQgdGhlbiB3ZSBpbnNwZWN0IGZvcgorCSAgICAgICBhbnkgZmxhZ3Mgc2V0IGluIHRoZSBpbnB1dCBzY3JpcHQgd2hpY2ggb3ZlcnJpZGUgYW55IEFMTE9DLiAgKi8KKwkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKKwkgICAgaWYgKCEob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5mbGFncyAmIFNFQ19ORVZFUl9MT0FEKSkgeworCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOworCSAgICB9CisJICB9CisJICBicmVhazsKKworCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKKwkgIHsKKwkgICAgaW50IHNpemU7CisKKwkgICAgcy0+cmVsb2Nfc3RhdGVtZW50Lm91dHB1dF92bWEgPQorCSAgICAgIGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKKwkgICAgcy0+cmVsb2Nfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0KKwkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOworCSAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChzLT5yZWxvY19zdGF0ZW1lbnQuaG93dG8pOworCSAgICBkb3QgKz0gc2l6ZTsKKwkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemU7CisJICB9CisJICBicmVhazsKKyAgICAgCisJY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06CisKKwkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKKwkJCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAorCQkJCSAgICAmcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKKworCQkJCSAgICBmaWxsLCBkb3QsIHJlbGF4KTsKKworCSAgYnJlYWs7CisKKwljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06CisJICBsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gPQorCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgorCSAgYnJlYWs7CisJY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKKwkgIHsKKwkgICAgYXNlY3Rpb24gKmk7CisKKwkgICAgaSA9ICgqcHJldiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbjsKKwkgICAgaWYgKCEgcmVsYXgpCisJICAgICAgeworCQlpZiAoaS0+X2Nvb2tlZF9zaXplID09IDApCisJCSAgaS0+X2Nvb2tlZF9zaXplID0gaS0+X3Jhd19zaXplOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJYm9vbGVhbiBhZ2FpbjsKKworCQlpZiAoISBiZmRfcmVsYXhfc2VjdGlvbiAoaS0+b3duZXIsIGksICZsaW5rX2luZm8sICZhZ2FpbikpCisJCSAgZWluZm8gKF8oIiVQJUY6IGNhbid0IHJlbGF4IHNlY3Rpb246ICVFXG4iKSk7CisJCWlmIChhZ2FpbikKKwkJICByZWxheF9hZ2FpbiA9IHRydWU7CisJICAgICAgfQorCSAgICBkb3QgPSBzaXplX2lucHV0X3NlY3Rpb24gKHByZXYsCisJCQkJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAorCQkJCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+ZmlsbCwKKwkJCQkgICAgICBkb3QsIHJlbGF4KTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtOgorCSAgcy0+ZmlsbF9zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOworCisJICBmaWxsID0gcy0+ZmlsbF9zdGF0ZW1lbnQuZmlsbDsKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgorCSAgeworCSAgICBiZmRfdm1hIG5ld2RvdCA9IGRvdDsKKworCSAgICBleHBfZm9sZF90cmVlIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHAsCisJCQkgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKKwkJCSAgIGRvdCwKKwkJCSAgICZuZXdkb3QpOworCisJICAgIGlmIChuZXdkb3QgIT0gZG90KQorCSAgICAgIHsKKwkJLyogVGhlIGFzc2lnbm1lbnQgY2hhbmdlZCBkb3QuICBJbnNlcnQgYSBwYWQuICAqLworCQlpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ID09IGFic19vdXRwdXRfc2VjdGlvbikKKwkJICB7CisJCSAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFuIG91dHB1dCBzZWN0aW9uLCB0aGVuIGp1c3QgYWRqdXN0CisJCSAgICAgICB0aGUgZGVmYXVsdCBtZW1vcnkgYWRkcmVzcy4gICovCisJCSAgICBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwICgiKmRlZmF1bHQqIiktPmN1cnJlbnQgPSBuZXdkb3Q7CisJCSAgfQorCQllbHNlIGlmICghcmVsYXgpCisJCSAgeworCQkgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0KKwkJICAgICAgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCisJCSAgICAgICBzdGF0X2FsbG9jIChzaXplb2YgKGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSkpKTsKKworCQkgICAgLyogTGluayBpbnRvIGV4aXN0aW5nIGNoYWluLiAgKi8KKwkJICAgIG5ldy0+aGVhZGVyLm5leHQgPSAqcHJldjsKKwkJICAgICpwcmV2ID0gbmV3OworCQkgICAgbmV3LT5oZWFkZXIudHlwZSA9IGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bTsKKwkJICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPQorCQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOworCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KKwkJICAgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOworCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5maWxsID0gZmlsbDsKKwkJICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZSA9IG5ld2RvdCAtIGRvdDsKKwkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSArPQorCQkgICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7CisJCSAgfQorCisJCWRvdCA9IG5ld2RvdDsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKworCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgorCSAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHBhc3MsIHNvbWUKKwkgICAgIHBhZGRpbmcgc3RhdGVtZW50cyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkIGR1cmluZyBwcmV2aW91cworCSAgICAgcGFzc2VzLiAgV2UgbWF5IGhhdmUgdG8gbW92ZSB0aGUgcGFkZGluZyBzdGF0ZW1lbnQgdG8gYSBuZXcKKwkgICAgIGxvY2F0aW9uIGlmIGRvdCBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgYXQgdGhpcyBwb2ludCBpbiB0aGlzCisJICAgICBwYXNzIHRoYW4gaXQgZGlkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByZXZpb3VzIHBhc3MuICAqLworCSAgcy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9CisJICAgIGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKKwkgIGRvdCArPSBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOworCSAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9CisJICAgIHMtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7CisJICBicmVhazsKKworCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKKwkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCisJCQkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKKwkJCQkgICAgJnMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAorCQkJCSAgICBmaWxsLCBkb3QsIHJlbGF4KTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIEZBSUwgKCk7CisJICBicmVhazsKKworCSAgLyogVGhpcyBjYW4gb25seSBnZXQgaGVyZSB3aGVuIHJlbGF4aW5nIGlzIHR1cm5lZCBvbi4gICovCisKKwljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKKwkgIGJyZWFrOworCX0KKyAgICAgIHByZXYgPSAmcy0+aGVhZGVyLm5leHQ7CisgICAgfQorICByZXR1cm4gZG90OworfQorCitiZmRfdm1hCitsYW5nX2RvX2Fzc2lnbm1lbnRzIChzLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIGZpbGwsIGRvdCkKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7CisgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7CisgICAgIGZpbGxfdHlwZSBmaWxsOworICAgICBiZmRfdm1hIGRvdDsKK3sKKyAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKKwl7CisJY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKKwkgIGRvdCA9IGxhbmdfZG9fYXNzaWdubWVudHMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwKKwkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKKwkJCQkgICAgIGZpbGwsCisJCQkJICAgICBkb3QpOworCSAgYnJlYWs7CisKKwljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06CisJICB7CisJICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KKwkgICAgICAmKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7CisKKwkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQorCSAgICAgIHsKKwkJZG90ID0gb3MtPmJmZF9zZWN0aW9uLT52bWE7CisJCSh2b2lkKSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChvcy0+Y2hpbGRyZW4uaGVhZCwgb3MsCisJCQkJCSAgICBvcy0+ZmlsbCwgZG90KTsKKwkJZG90ID0gb3MtPmJmZF9zZWN0aW9uLT52bWEgKyBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZTsKKwkgICAgICB9CisJICAgIGlmIChvcy0+bG9hZF9iYXNlKSAKKwkgICAgICB7CisJCS8qIElmIG5vdGhpbmcgaGFzIGJlZW4gcGxhY2VkIGludG8gdGhlIG91dHB1dCBzZWN0aW9uIHRoZW4KKwkJICAgaXQgd29uJ3QgaGF2ZSBhIGJmZF9zZWN0aW9uLiAqLworCQlpZiAob3MtPmJmZF9zZWN0aW9uKSAKKwkJICB7CisJCSAgICBvcy0+YmZkX3NlY3Rpb24tPmxtYSAKKwkJICAgICAgPSBleHBfZ2V0X2Fic19pbnQob3MtPmxvYWRfYmFzZSwgMCwibG9hZCBiYXNlIiwgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKKwkJICB9CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06CisKKwkgIGRvdCA9IGxhbmdfZG9fYXNzaWdubWVudHMgKHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCisJCQkJICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkJICAgICBmaWxsLCBkb3QpOworCisJICBicmVhazsKKworCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKKwljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgorCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06CisjaWYgMAorCWNhc2UgbGFuZ19jb21tb25fc3RhdGVtZW50X2VudW06CisjZW5kaWYKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgorCSAgeworCSAgICBldHJlZV92YWx1ZV90eXBlIHZhbHVlOworCisJICAgIHZhbHVlID0gZXhwX2ZvbGRfdHJlZSAocy0+ZGF0YV9zdGF0ZW1lbnQuZXhwLAorCQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKKwkJCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sIGRvdCwgJmRvdCk7CisJICAgIHMtPmRhdGFfc3RhdGVtZW50LnZhbHVlID0gdmFsdWUudmFsdWU7CisJICAgIGlmICh2YWx1ZS52YWxpZF9wID09IGZhbHNlKQorCSAgICAgIGVpbmZvIChfKCIlRiVQOiBpbnZhbGlkIGRhdGEgc3RhdGVtZW50XG4iKSk7CisJICB9CisJICBzd2l0Y2ggKHMtPmRhdGFfc3RhdGVtZW50LnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBRVUFEOgorCSAgICBjYXNlIFNRVUFEOgorCSAgICAgIGRvdCArPSBRVUFEX1NJWkU7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgTE9ORzoKKwkgICAgICBkb3QgKz0gTE9OR19TSVpFOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNIT1JUOgorCSAgICAgIGRvdCArPSBTSE9SVF9TSVpFOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEJZVEU6CisJICAgICAgZG90ICs9IEJZVEVfU0laRTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06CisJICB7CisJICAgIGV0cmVlX3ZhbHVlX3R5cGUgdmFsdWU7CisKKwkgICAgdmFsdWUgPSBleHBfZm9sZF90cmVlIChzLT5yZWxvY19zdGF0ZW1lbnQuYWRkZW5kX2V4cCwKKwkJCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCisJCQkJICAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBkb3QsICZkb3QpOworCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQuYWRkZW5kX3ZhbHVlID0gdmFsdWUudmFsdWU7CisJICAgIGlmICh2YWx1ZS52YWxpZF9wID09IGZhbHNlKQorCSAgICAgIGVpbmZvIChfKCIlRiVQOiBpbnZhbGlkIHJlbG9jIHN0YXRlbWVudFxuIikpOworCSAgfQorCSAgZG90ICs9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocy0+cmVsb2Nfc3RhdGVtZW50Lmhvd3RvKTsKKwkgIGJyZWFrOworCisJY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKKwkgIHsKKwkgICAgYXNlY3Rpb24gKmluID0gcy0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOworCisJICAgIGlmIChpbi0+X2Nvb2tlZF9zaXplICE9IDApCisJICAgICAgZG90ICs9IGluLT5fY29va2VkX3NpemU7CisJICAgIGVsc2UKKwkgICAgICBkb3QgKz0gaW4tPl9yYXdfc2l6ZTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgorCSAgYnJlYWs7CisJY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06CisJICBmaWxsID0gcy0+ZmlsbF9zdGF0ZW1lbnQuZmlsbDsKKwkgIGJyZWFrOworCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgorCSAgeworCSAgICBleHBfZm9sZF90cmVlIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHAsCisJCQkgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sCisJCQkgICBkb3QsCisJCQkgICAmZG90KTsKKwkgIH0KKworCSAgYnJlYWs7CisJY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06CisJICBkb3QgKz0gcy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKKwkgIGJyZWFrOworCisJY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgorCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCisJCQkJICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCisJCQkJICAgICBmaWxsLCBkb3QpOworCisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBGQUlMICgpOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06CisJICBicmVhazsKKwl9CisKKyAgICB9CisgIHJldHVybiBkb3Q7Cit9CisKKy8qIEZpeCBhbnkgLnN0YXJ0b2YuIG9yIC5zaXplb2YuIHN5bWJvbHMuICBXaGVuIHRoZSBhc3NlbWJsZXJzIHNlZSB0aGUKKyAgIG9wZXJhdG9yIC5zdGFydG9mLiAoc2VjdGlvbl9uYW1lKSwgaXQgcHJvZHVjZXMgYW4gdW5kZWZpbmVkIHN5bWJvbAorICAgLnN0YXJ0b2Yuc2VjdGlvbl9uYW1lLiAgU2ltaWxhcmx5LCB3aGVuIGl0IHNlZXMKKyAgIC5zaXplb2YuIChzZWN0aW9uX25hbWUpLCBpdCBwcm9kdWNlcyBhbiB1bmRlZmluZWQgc3ltYm9sCisgICAuc2l6ZW9mLnNlY3Rpb25fbmFtZS4gIEZvciBhbGwgdGhlIG91dHB1dCBzZWN0aW9ucywgd2UgbG9vayBmb3IKKyAgIHN1Y2ggc3ltYm9scywgYW5kIHNldCB0aGVtIHRvIHRoZSBjb3JyZWN0IHZhbHVlLiAgKi8KKworc3RhdGljIHZvaWQKK2xhbmdfc2V0X3N0YXJ0b2YgKCkKK3sKKyAgYXNlY3Rpb24gKnM7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuOworCisgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7CisgICAgICBjaGFyICpidWY7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzKTsKKyAgICAgIGJ1ZiA9IHhtYWxsb2MgKDEwICsgc3RybGVuIChzZWNuYW1lKSk7CisKKyAgICAgIHNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgc2VjbmFtZSk7CisgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBidWYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpZiAoaCAhPSBOVUxMICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJeworCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKKwkgIGgtPnUuZGVmLnZhbHVlID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgcyk7CisJICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwl9CisKKyAgICAgIHNwcmludGYgKGJ1ZiwgIi5zaXplb2YuJXMiLCBzZWNuYW1lKTsKKyAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGJ1ZiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgIGlmIChoICE9IE5VTEwgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKwl7CisJICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOworCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQorCSAgICBoLT51LmRlZi52YWx1ZSA9IHMtPl9jb29rZWRfc2l6ZTsKKwkgIGVsc2UKKwkgICAgaC0+dS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7CisJICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKKwl9CisKKyAgICAgIGZyZWUgKGJ1Zik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbGFuZ19maW5pc2ggKCkKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisgIGJvb2xlYW4gd2FybjsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQorICAgIHdhcm4gPSBmYWxzZTsKKyAgZWxzZQorICAgIHdhcm4gPSB0cnVlOworCisgIGlmIChlbnRyeV9zeW1ib2wgPT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBObyBlbnRyeSBoYXMgYmVlbiBzcGVjaWZpZWQuICBMb29rIGZvciBzdGFydCwgYnV0IGRvbid0IHdhcm4KKwkgaWYgd2UgZG9uJ3QgZmluZCBpdC4gICovCisgICAgICBlbnRyeV9zeW1ib2wgPSAic3RhcnQiOworICAgICAgd2FybiA9IGZhbHNlOworICAgIH0KKworICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBlbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCisgICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKwkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQorICAgICAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKKyAgICB7CisgICAgICBiZmRfdm1hIHZhbDsKKworICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCisJICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCisJCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQorCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKKyAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwgdmFsKSkKKwllaW5mbyAoXygiJVAlRjolczogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIpLCBlbnRyeV9zeW1ib2wpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZF92bWEgdmFsOworICAgICAgQ09OU1QgY2hhciAqc2VuZDsKKworICAgICAgLyogV2UgY291bGRuJ3QgZmluZCB0aGUgZW50cnkgc3ltYm9sLiAgVHJ5IHBhcnNpbmcgaXQgYXMgYQorICAgICAgICAgbnVtYmVyLiAgKi8KKyAgICAgIHZhbCA9IGJmZF9zY2FuX3ZtYSAoZW50cnlfc3ltYm9sLCAmc2VuZCwgMCk7CisgICAgICBpZiAoKnNlbmQgPT0gJ1wwJykKKwl7CisJICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsIHZhbCkpCisJICAgIGVpbmZvIChfKCIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIikpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc2VjdGlvbiAqdHM7CisKKwkgIC8qIENhbid0IGZpbmQgdGhlIGVudHJ5IHN5bWJvbCwgYW5kIGl0J3Mgbm90IGEgbnVtYmVyLiAgVXNlCisJICAgICB0aGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KKwkgIHRzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIudGV4dCIpOworCSAgaWYgKHRzICE9IChhc2VjdGlvbiAqKSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKHdhcm4pCisJCWVpbmZvIChfKCIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBkZWZhdWx0aW5nIHRvICVWXG4iKSwKKwkJICAgICAgIGVudHJ5X3N5bWJvbCwgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgdHMpKTsKKwkgICAgICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsCisJCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCisJCQkJCQkJCXRzKSkpCisJCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIikpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAod2FybikKKwkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IG5vdCBzZXR0aW5nIHN0YXJ0IGFkZHJlc3NcbiIpLAorCQkgICAgICAgZW50cnlfc3ltYm9sKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIFRoaXMgaXMgYSBzbWFsbCBmdW5jdGlvbiB1c2VkIHdoZW4gd2Ugd2FudCB0byBpZ25vcmUgZXJyb3JzIGZyb20KKyAgIEJGRC4gICovCisKK3N0YXRpYyB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitpZ25vcmVfYmZkX2Vycm9ycyAoY29uc3QgY2hhciAqcywgLi4uKQorI2Vsc2UKK2lnbm9yZV9iZmRfZXJyb3JzIChzKQorICAgICBjb25zdCBjaGFyICpzOworI2VuZGlmCit7CisgIC8qIERvbid0IGRvIGFueXRoaW5nLiAgKi8KK30KKworLyogQ2hlY2sgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIG9mIGFsbCB0aGUgaW5wdXQgZmlsZXMgaXMgY29tcGF0aWJsZQorICAgd2l0aCB0aGUgb3V0cHV0IGZpbGUuICBBbHNvIGNhbGwgdGhlIGJhY2tlbmQgdG8gbGV0IGl0IGRvIGFueQorICAgb3RoZXIgY2hlY2tpbmcgdGhhdCBpcyBuZWVkZWQuICAqLworCitzdGF0aWMgdm9pZAorbGFuZ19jaGVjayAoKQoreworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpmaWxlOworICBiZmQgKmlucHV0X2JmZDsKKyAgQ09OU1QgYmZkX2FyY2hfaW5mb190eXBlICpjb21wYXRpYmxlOworCisgIGZvciAoZmlsZSA9IGZpbGVfY2hhaW4uaGVhZDsKKyAgICAgICBmaWxlICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7CisgICAgICAgZmlsZSA9IGZpbGUtPmlucHV0X3N0YXRlbWVudC5uZXh0KQorICAgIHsKKyAgICAgIGlucHV0X2JmZCA9IGZpbGUtPmlucHV0X3N0YXRlbWVudC50aGVfYmZkOworICAgICAgY29tcGF0aWJsZSA9IGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChpbnB1dF9iZmQsCisJCQkJCSAgICBvdXRwdXRfYmZkKTsKKyAgICAgIGlmIChjb21wYXRpYmxlID09IE5VTEwpCisJeworCSAgaWYgKGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQorCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzIGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIGAlQicgaXMgaW5jb21wYXRpYmxlIHdpdGggJXMgb3V0cHV0XG4iKSwKKwkJICAgYmZkX3ByaW50YWJsZV9uYW1lIChpbnB1dF9iZmQpLCBpbnB1dF9iZmQsCisJCSAgIGJmZF9wcmludGFibGVfbmFtZSAob3V0cHV0X2JmZCkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBmbiA9IE5VTEw7CisKKwkgIC8qIElmIHdlIGFyZW4ndCBzdXBwb3NlZCB0byB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKKyAgICAgICAgICAgICBmaWxlcywgdGVtcG9yYXJpbHkgc2V0IHRoZSBCRkQgZXJyb3IgaGFuZGxlciB0byBhCisgICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggd2lsbCBkbyBub3RoaW5nLiAgV2Ugc3RpbGwgd2FudCB0byBjYWxsCisgICAgICAgICAgICAgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIHNpbmNlIGl0IG1heSBzZXQgdXAKKyAgICAgICAgICAgICBpbmZvcm1hdGlvbiB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KKwkgIGlmICghIGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQorCSAgICBwZm4gPSBiZmRfc2V0X2Vycm9yX2hhbmRsZXIgKGlnbm9yZV9iZmRfZXJyb3JzKTsKKwkgIGlmICghIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpbnB1dF9iZmQsIG91dHB1dF9iZmQpKQorCSAgICB7CisJICAgICAgaWYgKGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQorCQllaW5mbyAoXygiJUUlWDogZmFpbGVkIHRvIG1lcmdlIHRhcmdldCBzcGVjaWZpYyBkYXRhIG9mIGZpbGUgJUJcbiIpLAorCQkgICAgICAgaW5wdXRfYmZkKTsKKwkgICAgfQorCSAgaWYgKCEgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCisJICAgIGJmZF9zZXRfZXJyb3JfaGFuZGxlciAocGZuKTsKKwl9CisgICAgfQorfQorCisvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgYW5kIGF0dGFjaCB0aGVtIHRvIHRoZQorICAgY29ycmVjdCBzZWN0aW9uLiAgVGhlIC1zb3J0LWNvbW1vbiBjb21tYW5kIGxpbmUgc3dpdGNoIG1heSBiZSB1c2VkCisgICB0byByb3VnaGx5IHNvcnQgdGhlIGVudHJpZXMgYnkgc2l6ZS4gICovCisKK3N0YXRpYyB2b2lkCitsYW5nX2NvbW1vbiAoKQoreworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZQorICAgICAgJiYgISBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCisgICAgcmV0dXJuOworCisgIGlmICghIGNvbmZpZy5zb3J0X2NvbW1vbikKKyAgICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgbGFuZ19vbmVfY29tbW9uLCAoUFRSKSBOVUxMKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBwb3dlcjsKKworICAgICAgZm9yIChwb3dlciA9IDQ7IHBvd2VyID49IDA7IHBvd2VyLS0pCisJYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIGxhbmdfb25lX2NvbW1vbiwKKwkJCQkoUFRSKSAmcG93ZXIpOworICAgIH0KK30KKworLyogUGxhY2Ugb25lIGNvbW1vbiBzeW1ib2wgaW4gdGhlIGNvcnJlY3Qgc2VjdGlvbi4gICovCisKK3N0YXRpYyBib29sZWFuCitsYW5nX29uZV9jb21tb24gKGgsIGluZm8pCisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBQVFIgaW5mbzsKK3sKKyAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKKyAgYmZkX3ZtYSBzaXplOworICBhc2VjdGlvbiAqc2VjdGlvbjsKKworICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzaXplID0gaC0+dS5jLnNpemU7CisgIHBvd2VyX29mX3R3byA9IGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7CisKKyAgaWYgKGNvbmZpZy5zb3J0X2NvbW1vbgorICAgICAgJiYgcG93ZXJfb2ZfdHdvIDwgKHVuc2lnbmVkIGludCkgKihpbnQgKikgaW5mbykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBzZWN0aW9uID0gaC0+dS5jLnAtPnNlY3Rpb247CisKKyAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLworICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBBTElHTl9OIChzZWN0aW9uLT5fY29va2VkX3NpemUsCisJCQkJICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOworCisgIC8qIEFkanVzdCB0aGUgYWxpZ25tZW50IGlmIG5lY2Vzc2FyeS4gICovCisgIGlmIChwb3dlcl9vZl90d28gPiBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCisgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXJfb2ZfdHdvOworCisgIC8qIENoYW5nZSB0aGUgc3ltYm9sIGZyb20gY29tbW9uIHRvIGRlZmluZWQuICAqLworICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOworICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKKyAgaC0+dS5kZWYudmFsdWUgPSBzZWN0aW9uLT5fY29va2VkX3NpemU7CisKKyAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLworICBzZWN0aW9uLT5fY29va2VkX3NpemUgKz0gc2l6ZTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHNlY3Rpb24gaXMgYWxsb2NhdGVkIGluIG1lbW9yeSwgYW5kIG1ha2Ugc3VyZSB0aGF0CisgICAgIGl0IGlzIG5vIGxvbmdlciBhIGNvbW1vbiBzZWN0aW9uLiAgKi8KKyAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOworICBzZWN0aW9uLT5mbGFncyAmPSB+IFNFQ19JU19DT01NT047CisKKyAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOworICAgICAgaW50IGxlbjsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBjaGFyIGJ1Zls1MF07CisKKyAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQorCXsKKwkgIG1pbmZvIChfKCJcbkFsbG9jYXRpbmcgY29tbW9uIHN5bWJvbHNcbiIpKTsKKwkgIG1pbmZvIChfKCJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcblxuIikpOworCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOworCX0KKworICAgICAgbmFtZSA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7CisgICAgICBtaW5mbyAoIiVzIiwgbmFtZSk7CisgICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOworICAgICAgZnJlZSAobmFtZSk7CisKKyAgICAgIGlmIChsZW4gPj0gMTkpCisJeworCSAgcHJpbnRfbmwgKCk7CisJICBsZW4gPSAwOworCX0KKyAgICAgIHdoaWxlIChsZW4gPCAyMCkKKwl7CisJICBwcmludF9zcGFjZSAoKTsKKwkgICsrbGVuOworCX0KKworICAgICAgbWluZm8gKCIweCIpOworICAgICAgaWYgKHNpemUgPD0gMHhmZmZmZmZmZikKKwlzcHJpbnRmIChidWYsICIlbHgiLCAodW5zaWduZWQgbG9uZykgc2l6ZSk7CisgICAgICBlbHNlCisJc3ByaW50Zl92bWEgKGJ1Ziwgc2l6ZSk7CisgICAgICBtaW5mbyAoIiVzIiwgYnVmKTsKKyAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKKworICAgICAgd2hpbGUgKGxlbiA8IDE2KQorCXsKKwkgIHByaW50X3NwYWNlICgpOworCSAgKytsZW47CisJfQorCisgICAgICBtaW5mbyAoIiVCXG4iLCBzZWN0aW9uLT5vd25lcik7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKgorcnVuIHRocm91Z2ggdGhlIGlucHV0IGZpbGVzIGFuZCBlbnN1cmUgdGhhdCBldmVyeSBpbnB1dAorc2VjdGlvbiBoYXMgc29tZXdoZXJlIHRvIGdvLiBJZiBvbmUgaXMgZm91bmQgd2l0aG91dAorYSBkZXN0aW5hdGlvbiB0aGVuIGNyZWF0ZSBhbiBpbnB1dCByZXF1ZXN0IGFuZCBwbGFjZSBpdAoraW50byB0aGUgc3RhdGVtZW50IHRyZWUuCisqLworCitzdGF0aWMgdm9pZAorbGFuZ19wbGFjZV9vcnBoYW5zICgpCit7CisgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7CisKKyAgZm9yIChmaWxlID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOworICAgICAgIGZpbGUgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKKyAgICAgICBmaWxlID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZS0+bmV4dCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqczsKKworICAgICAgZm9yIChzID0gZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnM7CisJICAgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKKwkgICBzID0gcy0+bmV4dCkKKwl7CisJICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgbm90IGF0dGF0Y2hlZCwgcm9vdAorCSAgICAgICAgIGFyb3VuZCBmb3IgYSBzZW5zaWJsZSBwbGFjZSBmb3IgaXQgdG8gZ28gKi8KKworCSAgICAgIGlmIChmaWxlLT5qdXN0X3N5bXNfZmxhZykKKwkJeworCQkgIC8qIFdlIGFyZSBvbmx5IHJldHJpZXZpbmcgc3ltYm9sIHZhbHVlcyBmcm9tIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgIGZpbGUuICBXZSB3YW50IHRoZSBzeW1ib2xzIHRvIGFjdCBhcyB0aG91Z2ggdGhlCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIGZpbGUgYXJlIGFic29sdXRlLiAgKi8KKwkJICBzLT5vdXRwdXRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisJCSAgcy0+b3V0cHV0X29mZnNldCA9IHMtPnZtYTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocy0+bmFtZSwgIkNPTU1PTiIpID09IDApCisJCXsKKwkJICAvKiBUaGlzIGlzIGEgbG9uZWx5IGNvbW1vbiBzZWN0aW9uIHdoaWNoIG11c3QgaGF2ZQorCQkgICAgIGNvbWUgZnJvbSBhbiBhcmNoaXZlLiAgV2UgYXR0YWNoIHRvIHRoZSBzZWN0aW9uCisJCSAgICAgd2l0aCB0aGUgd2lsZGNhcmQuICAqLworCQkgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKKwkJICAgICAgfHwgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uKQorCQkgICAgeworCQkgICAgICBpZiAoZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9PSBOVUxMKQorCQkJeworI2lmIDAKKwkJCSAgLyogVGhpcyBtZXNzYWdlIGhhcHBlbnMgd2hlbiB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZyMy5pZmlsZSBsaW5rZXIgc2NyaXB0LCBzbyBJIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgaXQuICAqLworCQkJICBpbmZvX21zZyAoXygiJVA6IG5vIFtDT01NT05dIGNvbW1hbmQsIGRlZmF1bHRpbmcgdG8gLmJzc1xuIikpOworI2VuZGlmCisJCQkgIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPQorCQkJICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoIi5ic3MiKTsKKworCQkJfQorCQkgICAgICB3aWxkX2RvaXQgKCZkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLT5jaGlsZHJlbiwgcywKKwkJCQkgZGVmYXVsdF9jb21tb25fc2VjdGlvbiwgZmlsZSk7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChsZGVtdWxfcGxhY2Vfb3JwaGFuIChmaWxlLCBzKSkKKwkJOworCSAgICAgIGVsc2UKKwkJeworCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KKwkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKHMtPm5hbWUpOworCisJCSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKwordm9pZAorbGFuZ19zZXRfZmxhZ3MgKHB0ciwgZmxhZ3MpCisgICAgIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICpwdHI7CisgICAgIENPTlNUIGNoYXIgKmZsYWdzOworeworICBmbGFnd29yZCAqcHRyX2ZsYWdzID0gJnB0ci0+ZmxhZ3M7CisKKyAgcHRyLT5mbGFncyA9IHB0ci0+bm90X2ZsYWdzID0gMDsKKyAgd2hpbGUgKCpmbGFncykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpmbGFncykKKwl7CisJY2FzZSAnISc6CisJICBwdHJfZmxhZ3MgPSAocHRyX2ZsYWdzID09ICZwdHItPmZsYWdzKSA/ICZwdHItPm5vdF9mbGFncyA6ICZwdHItPmZsYWdzOworCSAgYnJlYWs7CisKKwljYXNlICdBJzogY2FzZSAnYSc6CisJICAqcHRyX2ZsYWdzIHw9IFNFQ19BTExPQzsKKwkgIGJyZWFrOworCisJY2FzZSAnUic6IGNhc2UgJ3InOgorCSAgKnB0cl9mbGFncyB8PSBTRUNfUkVBRE9OTFk7CisJICBicmVhazsKKworCWNhc2UgJ1cnOiBjYXNlICd3JzoKKwkgICpwdHJfZmxhZ3MgfD0gU0VDX0RBVEE7CisJICBicmVhazsKKworCWNhc2UgJ1gnOiBjYXNlICd4JzoKKwkgICpwdHJfZmxhZ3MgfD0gU0VDX0NPREU7CisJICBicmVhazsKKworCWNhc2UgJ0wnOiBjYXNlICdsJzoKKwljYXNlICdJJzogY2FzZSAnaSc6CisJICAqcHRyX2ZsYWdzIHw9IFNFQ19MT0FEOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgc3ludGF4IGluIGZsYWdzXG4iKSk7CisJICBicmVhazsKKwl9CisgICAgICBmbGFncysrOworICAgIH0KK30KKworLyogQ2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggaW5wdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgIG9uIGFuIGFyY2hpdmUsIGJ1dCBub3Qgb24gdGhlIGVsZW1lbnRzLiAgKi8KKwordm9pZAorbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChmdW5jKQorICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Cit7CisgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7CisKKyAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgaW5wdXRfZmlsZV9jaGFpbi5oZWFkOworICAgICAgIGYgIT0gTlVMTDsKKyAgICAgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dF9yZWFsX2ZpbGUpCisgICAgZnVuYyAoZik7Cit9CisKKy8qIENhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIGZpbGUuICBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gYWxsCisgICB0aGUgZWxlbWVudHMgb2YgYW4gYXJjaGl2ZSB3aGljaCBhcmUgaW5jbHVkZWQgaW4gdGhlIGxpbmssIGJ1dCB3aWxsCisgICBub3QgYmUgY2FsbGVkIG9uIHRoZSBhcmNoaXZlIGZpbGUgaXRzZWxmLiAgKi8KKwordm9pZAorbGFuZ19mb3JfZWFjaF9maWxlIChmdW5jKQorICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Cit7CisgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7CisKKyAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOworICAgICAgIGYgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKKyAgICAgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dCkKKyAgICB7CisgICAgICBmdW5jIChmKTsKKyAgICB9Cit9CisKKyNpZiAwCisKKy8qIE5vdCB1c2VkLiAgKi8KKwordm9pZAorbGFuZ19mb3JfZWFjaF9pbnB1dF9zZWN0aW9uIChmdW5jKQorICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgoYmZkICogYWIsIGFzZWN0aW9uICogYXMpKTsKK3sKKyAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKKworICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7CisgICAgICAgZiAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOworICAgICAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0KQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzOworCisgICAgICBmb3IgKHMgPSBmLT50aGVfYmZkLT5zZWN0aW9uczsKKwkgICBzICE9IChhc2VjdGlvbiAqKSBOVUxMOworCSAgIHMgPSBzLT5uZXh0KQorCXsKKwkgIGZ1bmMgKGYtPnRoZV9iZmQsIHMpOworCX0KKyAgICB9Cit9CisKKyNlbmRpZgorCit2b2lkCitsZGxhbmdfYWRkX2ZpbGUgKGVudHJ5KQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogZW50cnk7Cit7CisgIGJmZCAqKnBwOworCisgIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJmZpbGVfY2hhaW4sCisJCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgZW50cnksCisJCQkgJmVudHJ5LT5uZXh0KTsKKworICAvKiBUaGUgQkZEIGxpbmtlciBuZWVkcyB0byBoYXZlIGEgbGlzdCBvZiBhbGwgaW5wdXQgQkZEcyBpbnZvbHZlZCBpbgorICAgICBhIGxpbmsuICAqLworICBBU1NFUlQgKGVudHJ5LT50aGVfYmZkLT5saW5rX25leHQgPT0gKGJmZCAqKSBOVUxMKTsKKyAgQVNTRVJUIChlbnRyeS0+dGhlX2JmZCAhPSBvdXRwdXRfYmZkKTsKKyAgZm9yIChwcCA9ICZsaW5rX2luZm8uaW5wdXRfYmZkczsKKyAgICAgICAqcHAgIT0gKGJmZCAqKSBOVUxMOworICAgICAgIHBwID0gJigqcHApLT5saW5rX25leHQpCisgICAgOworICAqcHAgPSBlbnRyeS0+dGhlX2JmZDsKKyAgZW50cnktPnRoZV9iZmQtPnVzcmRhdGEgPSAoUFRSKSBlbnRyeTsKKyAgYmZkX3NldF9ncF9zaXplIChlbnRyeS0+dGhlX2JmZCwgZ19zd2l0Y2hfdmFsdWUpOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNoZWNrIGZvciBhbnkgd2hpY2ggc2hvdWxkIG5vdCBiZQorICAgICBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFdlIG5lZWQgdG8gZG8gdGhpcyBub3csIHNvIHRoYXQgd2UgY2FuCisgICAgIG5vdGljZSB3aGVuIHRoZSBiYWNrZW5kIGxpbmtlciB0cmllcyB0byByZXBvcnQgbXVsdGlwbGUKKyAgICAgZGVmaW5pdGlvbiBlcnJvcnMgZm9yIHN5bWJvbHMgd2hpY2ggYXJlIGluIHNlY3Rpb25zIHdlIGFyZW4ndAorICAgICBnb2luZyB0byBsaW5rLiAgRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byBlbnRpcmVseSBpZ25vcmUKKyAgICAgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBzZWN0aW9ucyB3aGljaCBhcmUgZ29pbmcgdG8gYmUKKyAgICAgZGlzY2FyZGVkLiAgVGhpcyB3b3VsZCByZXF1aXJlIG1vZGlmeWluZyB0aGUgYmFja2VuZCBsaW5rZXIgZm9yCisgICAgIGVhY2ggYmFja2VuZCB3aGljaCBtaWdodCBzZXQgdGhlIFNFQ19MSU5LX09OQ0UgZmxhZy4gIElmIHdlIGRvCisgICAgIHRoaXMsIHdlIHNob3VsZCBwcm9iYWJseSBoYW5kbGUgU0VDX0VYQ0xVREUgaW4gdGhlIHNhbWUgd2F5LiAgKi8KKworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGVudHJ5LT50aGVfYmZkLCBzZWN0aW9uX2FscmVhZHlfbGlua2VkLCAoUFRSKSBlbnRyeSk7Cit9CisKK3ZvaWQKK2xhbmdfYWRkX291dHB1dCAobmFtZSwgZnJvbV9zY3JpcHQpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3NjcmlwdDsKK3sKKyAgLyogTWFrZSAtbyBvbiBjb21tYW5kIGxpbmUgb3ZlcnJpZGUgT1VUUFVUIGluIHNjcmlwdC4gICovCisgIGlmIChoYWRfb3V0cHV0X2ZpbGVuYW1lID09IGZhbHNlIHx8ICFmcm9tX3NjcmlwdCkKKyAgICB7CisgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBuYW1lOworICAgICAgaGFkX291dHB1dF9maWxlbmFtZSA9IHRydWU7CisgICAgfQorfQorCisKK3N0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpjdXJyZW50X3NlY3Rpb247CisKK3N0YXRpYyBpbnQKK3RvcG93ZXIgKHgpCisgICAgIGludCB4OworeworICB1bnNpZ25lZCBpbnQgaSA9IDE7CisgIGludCBsOworCisgIGlmICh4IDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yIChsID0gMDsgbCA8IDMyOyBsKyspIAorICAgIHsKKyAgICAgIGlmIChpID49ICh1bnNpZ25lZCBpbnQpIHgpCisJcmV0dXJuIGw7CisgICAgICBpIDw8PSAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZAorbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lLAorCQkJCSAgICAgYWRkcmVzc19leHAsIHNlY3R5cGUsIGJsb2NrX3ZhbHVlLAorCQkJCSAgICAgYWxpZ24sIHN1YmFsaWduLCBlYmFzZSkKKyAgICAgY29uc3QgY2hhciAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWU7CisgICAgIGV0cmVlX3R5cGUgKiBhZGRyZXNzX2V4cDsKKyAgICAgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKKyAgICAgYmZkX3ZtYSBibG9ja192YWx1ZTsKKyAgICAgZXRyZWVfdHlwZSAqYWxpZ247CisgICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduOworICAgICBldHJlZV90eXBlICplYmFzZTsKK3sKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7CisKKyAgY3VycmVudF9zZWN0aW9uID0KKyAgIG9zID0KKyAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lKTsKKworCisKKyAgLyogQWRkIHRoaXMgc3RhdGVtZW50IHRvIHRyZWUgKi8KKyAgLyogIGFkZF9zdGF0ZW1lbnQobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSwKKyAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ki8KKyAgLyogTWFrZSBuZXh0IHRoaW5ncyBjaGFpbiBpbnRvIHN1YmNoYWluIG9mIHRoaXMgKi8KKworICBpZiAob3MtPmFkZHJfdHJlZSA9PQorICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCkKKyAgeworICAgIG9zLT5hZGRyX3RyZWUgPQorICAgICBhZGRyZXNzX2V4cDsKKyAgfQorICBvcy0+c2VjdHlwZSA9IHNlY3R5cGU7CisgIGlmIChzZWN0eXBlICE9IG5vbG9hZF9zZWN0aW9uKQorICAgIG9zLT5mbGFncyA9IFNFQ19OT19GTEFHUzsKKyAgZWxzZQorICAgIG9zLT5mbGFncyA9IFNFQ19ORVZFUl9MT0FEOworICBvcy0+YmxvY2tfdmFsdWUgPSBibG9ja192YWx1ZSA/IGJsb2NrX3ZhbHVlIDogMTsKKyAgc3RhdF9wdHIgPSAmb3MtPmNoaWxkcmVuOworCisgIG9zLT5zdWJzZWN0aW9uX2FsaWdubWVudCA9IHRvcG93ZXIoCisgICBleHBfZ2V0X3ZhbHVlX2ludChzdWJhbGlnbiwgLTEsCisJCSAgICAgInN1YnNlY3Rpb24gYWxpZ25tZW50IiwKKwkJICAgICAwKSk7CisgIG9zLT5zZWN0aW9uX2FsaWdubWVudCA9IHRvcG93ZXIoCisgICBleHBfZ2V0X3ZhbHVlX2ludChhbGlnbiwgLTEsCisJCSAgICAgInNlY3Rpb24gYWxpZ25tZW50IiwgMCkpOworCisgIG9zLT5sb2FkX2Jhc2UgPSBlYmFzZTsKK30KKworCit2b2lkCitsYW5nX2ZpbmFsICgpCit7CisgIGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlICpuZXcgPQorICAgIG5ld19zdGF0IChsYW5nX291dHB1dF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKKworICBuZXctPm5hbWUgPSBvdXRwdXRfZmlsZW5hbWU7Cit9CisKKy8qIFJlc2V0IHRoZSBjdXJyZW50IGNvdW50ZXJzIGluIHRoZSByZWdpb25zICovCitzdGF0aWMgdm9pZAorcmVzZXRfbWVtb3J5X3JlZ2lvbnMgKCkKK3sKKyAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKKworICBmb3IgKHAgPSBsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKKyAgICAgICBwICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMOworICAgICAgIHAgPSBwLT5uZXh0KQorICAgIHsKKyAgICAgIHAtPm9sZF9sZW5ndGggPSAoYmZkX3NpemVfdHlwZSkgKHAtPmN1cnJlbnQgLSBwLT5vcmlnaW4pOworICAgICAgcC0+Y3VycmVudCA9IHAtPm9yaWdpbjsKKyAgICB9Cit9CisKKy8qID8/PyBBdCBzb21lIHBvaW50IHRoaXMgdHJhdmVyc2FsIGZvciBHQyBzaG91bGQgc2hhcmUgY29kZSB3aXRoIHRoZQorICAgdHJhdmVyc2FsIGZvciBtYW5pcHVsYXRpbmcgdGhlIG91dHB1dCBmaWxlLiAgKi8KKworLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLCBtYXJraW5nIGl0cyBzZWN0aW9ucyBLRUVQCisgICBhcyBuZWVkZWQuICBTRUNUSU9OIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgd2lsZCBjYXJkLiAgKi8KKworc3RhdGljIHZvaWQKK2xhbmdfZ2Nfd2lsZF9zZWN0aW9uIChwdHIsIHNlY3Rpb24sIGZpbGUpCisgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcHRyOworICAgICBjb25zdCBjaGFyICpzZWN0aW9uOworICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOworeworICBpZiAoZmlsZS0+anVzdF9zeW1zX2ZsYWcgPT0gZmFsc2UpCisgICAgeworICAgICAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7CisgICAgICBib29sZWFuIHdpbGRjYXJkOworCisgICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQorCXdpbGRjYXJkID0gZmFsc2U7CisgICAgICBlbHNlCisJd2lsZGNhcmQgPSB3aWxkY2FyZHAgKHNlY3Rpb24pOworCisgICAgICBmb3IgKHMgPSBmaWxlLT50aGVfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKKwl7CisJICBib29sZWFuIG1hdGNoOworCisJICBpZiAoc2VjdGlvbiA9PSBOVUxMKQorCSAgICBtYXRjaCA9IHRydWU7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpuYW1lOworCisJICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaWxlLT50aGVfYmZkLCBzKTsKKwkgICAgICBpZiAod2lsZGNhcmQpCisJCW1hdGNoID0gZm5tYXRjaCAoc2VjdGlvbiwgbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKKwkgICAgICBlbHNlCisJCW1hdGNoID0gc3RyY21wIChzZWN0aW9uLCBuYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOworCSAgICB9CisKKwkgIGlmIChtYXRjaCkKKwkgICAgeworCSAgICAgIC8qIElmIHRoZSB3aWxkIHBhdHRlcm4gd2FzIG1hcmtlZCBLRUVQLCB0aGUgbWVtYmVyIHNlY3Rpb25zCisJCSBzaG91bGQgYmUgYXMgd2VsbC4gICovCisJICAgICAgaWYgKHB0ci0+a2VlcF9zZWN0aW9ucykKKwkJcy0+ZmxhZ3MgfD0gU0VDX0tFRVA7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudCBmb3IgYSBzaW5nbGUgZmlsZSBGLiAgKi8KKworc3RhdGljIHZvaWQKK2xhbmdfZ2Nfd2lsZF9maWxlIChzLCBzZWN0aW9uLCBmKQorICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7CisgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247CisgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Cit7CisgIGlmIChmLT50aGVfYmZkID09IE5VTEwKKyAgICAgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoZi0+dGhlX2JmZCwgYmZkX2FyY2hpdmUpKQorICAgIGxhbmdfZ2Nfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLCBmKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGJmZCAqbWVtYmVyOworCisgICAgICAvKiBUaGlzIGlzIGFuIGFyY2hpdmUgZmlsZS4gIFdlIG11c3QgbWFwIGVhY2ggbWVtYmVyIG9mIHRoZQorCSBhcmNoaXZlIHNlcGFyYXRlbHkuICAqLworICAgICAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgKGJmZCAqKSBOVUxMKTsKKyAgICAgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKKwl7CisJICAvKiBXaGVuIGxvb2t1cF9uYW1lIGlzIGNhbGxlZCwgaXQgd2lsbCBjYWxsIHRoZSBhZGRfc3ltYm9scworCSAgICAgZW50cnkgcG9pbnQgZm9yIHRoZSBhcmNoaXZlLiAgRm9yIGVhY2ggZWxlbWVudCBvZiB0aGUKKwkgICAgIGFyY2hpdmUgd2hpY2ggaXMgaW5jbHVkZWQsIEJGRCB3aWxsIGNhbGwgbGRsYW5nX2FkZF9maWxlLAorCSAgICAgd2hpY2ggd2lsbCBzZXQgdGhlIHVzcmRhdGEgZmllbGQgb2YgdGhlIG1lbWJlciB0byB0aGUKKwkgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50LiAgKi8KKwkgIGlmIChtZW1iZXItPnVzcmRhdGEgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGxhbmdfZ2Nfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLAorCQkJICAgIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIG1lbWJlci0+dXNyZGF0YSk7CisJICAgIH0KKworCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgbWVtYmVyKTsKKwl9CisgICAgfQorfQorCisvKiBIYW5kbGUgYSB3aWxkIHN0YXRlbWVudCwgbWFya2luZyBpdCBhZ2FpbnN0IEdDLiAgU0VDVElPTiBvciBGSUxFIG9yIGJvdGgKKyAgIG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSB3aWxkY2FyZC4gICovCisKK3N0YXRpYyB2b2lkCitsYW5nX2djX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUpCisgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqczsKKyAgICAgY29uc3QgY2hhciAqc2VjdGlvbjsKKyAgICAgY29uc3QgY2hhciAqZmlsZTsKK3sKKyAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKKworICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFBlcmZvcm0gdGhlIGl0ZXJhdGlvbiBvdmVyIGFsbCBmaWxlcyBpbiB0aGUgbGlzdCAqLworICAgICAgZm9yIChmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOworCSAgIGYgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKKwkgICBmID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZi0+bmV4dCkKKwl7CisJICBsYW5nX2djX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZik7CisJfQorICAgIH0KKyAgZWxzZSBpZiAod2lsZGNhcmRwIChmaWxlKSkKKyAgICB7CisgICAgICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7CisJICAgZiAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOworCSAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0KQorCXsKKwkgIGlmIChmbm1hdGNoIChmaWxlLCBmLT5maWxlbmFtZSwgRk5NX0ZJTEVfTkFNRSkgPT0gMCkKKwkgICAgbGFuZ19nY193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhIHNpbmdsZSBmaWxlICovCisgICAgICBmID0gbG9va3VwX25hbWUgKGZpbGUpOworICAgICAgbGFuZ19nY193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYpOworICAgIH0KK30KKworLyogSXRlcmF0ZSBvdmVyIHNlY3Rpb25zIG1hcmtpbmcgdGhlbSBhZ2FpbnN0IEdDLiAgKi8KKworc3RhdGljIHZvaWQKK2xhbmdfZ2Nfc2VjdGlvbnNfMSAocykKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Cit7CisgIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCisJeworCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgorCSAgbGFuZ19nY193aWxkICgmcy0+d2lsZF9zdGF0ZW1lbnQsCisJCQlzLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsCisJCQlzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSk7CisJICBicmVhazsKKwljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgorCSAgbGFuZ19nY19zZWN0aW9uc18xIChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQpOworCSAgYnJlYWs7CisJY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgorCSAgbGFuZ19nY19zZWN0aW9uc18xIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7CisJICBicmVhazsKKwljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06CisJICBsYW5nX2djX3NlY3Rpb25zXzEgKHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbGFuZ19nY19zZWN0aW9ucyAoKQoreworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqdWxpc3QsIGZha2VfbGlzdF9zdGFydDsKKworICAvKiBLZWVwIGFsbCBzZWN0aW9ucyBzbyBtYXJrZWQgaW4gdGhlIGxpbmsgc2NyaXB0LiAgKi8KKworICBsYW5nX2djX3NlY3Rpb25zXzEgKHN0YXRlbWVudF9saXN0LmhlYWQpOworCisgIC8qIEtlZXAgYWxsIHNlY3Rpb25zIGNvbnRhaW5pbmcgc3ltYm9scyB1bmRlZmluZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KKyAgICAgSGFuZGxlIHRoZSBlbnRyeSBzeW1ib2wgYXQgdGhlIHNhbWUgdGltZS4gICovCisKKyAgZmFrZV9saXN0X3N0YXJ0Lm5leHQgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOworICBpZiAoZW50cnlfc3ltYm9sID09IE5VTEwpCisgICAgZmFrZV9saXN0X3N0YXJ0Lm5hbWUgPSAic3RhcnQiOworICBlbHNlCisgICAgZmFrZV9saXN0X3N0YXJ0Lm5hbWUgPSAoY2hhciAqKSBlbnRyeV9zeW1ib2w7CisKKyAgZm9yICh1bGlzdCA9ICZmYWtlX2xpc3Rfc3RhcnQ7IHVsaXN0OyB1bGlzdCA9IHVsaXN0LT5uZXh0KQorICAgIHsKKyAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHVsaXN0LT5uYW1lLCAKKwkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKKyAgICAgICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKKyAgICAgICAgICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCisJICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+dS5kZWYuc2VjdGlvbikpCisJeworCSAgaC0+dS5kZWYuc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7CisJfQorICAgIH0KKworICBiZmRfZ2Nfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOworfQorCit2b2lkCitsYW5nX3Byb2Nlc3MgKCkKK3sKKyAgbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzICgpOworICBjdXJyZW50X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OworCisgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChsZGxhbmdfb3Blbl9vdXRwdXQpOwkvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSAqLworCisgIGxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAoKTsKKworICAvKiBBZGQgdG8gdGhlIGhhc2ggdGFibGUgYWxsIHVuZGVmaW5lZHMgb24gdGhlIGNvbW1hbmQgbGluZSAqLworICBsYW5nX3BsYWNlX3VuZGVmaW5lZHMgKCk7CisKKyAgLyogQ3JlYXRlIGEgYmZkIGZvciBlYWNoIGlucHV0IGZpbGUgKi8KKyAgY3VycmVudF90YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKKyAgb3Blbl9pbnB1dF9iZmRzIChzdGF0ZW1lbnRfbGlzdC5oZWFkLCBmYWxzZSk7CisKKyAgbGRlbXVsX2FmdGVyX29wZW4gKCk7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgd2UncmUgbm90IG1peGluZyBhcmNoaXRlY3R1cmVzLiAgV2UgY2FsbCB0aGlzCisgICAgIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZCwgYnV0IGJlZm9yZSB3ZSBkbyBhbnkKKyAgICAgb3RoZXIgcHJvY2Vzc2luZywgc28gdGhhdCBhbnkgb3BlcmF0aW9ucyBtZXJnZV9wcml2YXRlX2JmZF9kYXRhCisgICAgIGRvZXMgb24gdGhlIG91dHB1dCBmaWxlIHdpbGwgYmUga25vd24gZHVyaW5nIHRoZSByZXN0IG9mIHRoZQorICAgICBsaW5rLiAgKi8KKyAgbGFuZ19jaGVjayAoKTsKKworICAvKiBIYW5kbGUgLmV4cG9ydHMgaW5zdGVhZCBvZiBhIHZlcnNpb24gc2NyaXB0IGlmIHdlJ3JlIHRvbGQgdG8gZG8gc28uICAqLworICBpZiAoY29tbWFuZF9saW5lLnZlcnNpb25fZXhwb3J0c19zZWN0aW9uKQorICAgIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gKCk7CisKKyAgLyogQnVpbGQgYWxsIHNldHMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIGlucHV0CisgICAgIGZpbGVzLiAgKi8KKyAgbGRjdG9yX2J1aWxkX3NldHMgKCk7CisKKyAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucyBpZiBhc2tlZCB0by4gICovCisgIGlmIChjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMpCisgICAgbGFuZ19nY19zZWN0aW9ucyAoKTsKKworICAvKiBTaXplIHVwIHRoZSBjb21tb24gZGF0YSAqLworICBsYW5nX2NvbW1vbiAoKTsKKworICAvKiBSdW4gdGhyb3VnaCB0aGUgY29udG91cnMgb2YgdGhlIHNjcmlwdCBhbmQgYXR0YWNoIGlucHV0IHNlY3Rpb25zCisgICAgIHRvIHRoZSBjb3JyZWN0IG91dHB1dCBzZWN0aW9ucworICAgICAqLworICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLCAoY2hhciAqKSBOVUxMLAorCQkJCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEwpOworCisKKyAgLyogRmluZCBhbnkgc2VjdGlvbnMgbm90IGF0dGFjaGVkIGV4cGxpY2l0bHkgYW5kIGhhbmRsZSB0aGVtICovCisgIGxhbmdfcGxhY2Vfb3JwaGFucyAoKTsKKworICBsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb24gKCk7CisKKyAgLyogV2UgbXVzdCByZWNvcmQgdGhlIHByb2dyYW0gaGVhZGVycyBiZWZvcmUgd2UgdHJ5IHRvIGZpeCB0aGUKKyAgICAgc2VjdGlvbiBwb3NpdGlvbnMsIHNpbmNlIHRoZXkgd2lsbCBhZmZlY3QgU0laRU9GX0hFQURFUlMuICAqLworICBsYW5nX3JlY29yZF9waGRycyAoKTsKKworICAvKiBOb3cgcnVuIGFyb3VuZCBhbmQgcmVsYXggaWYgd2UgY2FuICovCisgIGlmIChjb21tYW5kX2xpbmUucmVsYXgpCisgICAgeworICAgICAgLyogRmlyc3QgdGltZSByb3VuZCBpcyBhIHRyaWFsIHJ1biB0byBnZXQgdGhlICd3b3JzdCBjYXNlJworCSBhZGRyZXNzZXMgb2YgdGhlIG9iamVjdHMgaWYgdGhlcmUgd2FzIG5vIHJlbGF4aW5nLiAgKi8KKyAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKKwkJCSAgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOworCisgICAgICAvKiBLZWVwIHJlbGF4aW5nIHVudGlsIGJmZF9yZWxheF9zZWN0aW9uIGdpdmVzIHVwLiAgKi8KKyAgICAgIGRvCisJeworCSAgcmVzZXRfbWVtb3J5X3JlZ2lvbnMgKCk7CisKKwkgIHJlbGF4X2FnYWluID0gZmFsc2U7CisKKwkgIC8qIE5vdGU6IHBlLWRsbC5jIGRvZXMgc29tZXRoaW5nIGxpa2UgdGhpcyBhbHNvLiAgSWYgeW91IGZpbmQKKwkgICAgIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGlzIGNvZGUsIHlvdSBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZQorCSAgICAgcGUtZGxsLmMgYWxzby4gIERKICovCisKKwkgIC8qIERvIGFsbCB0aGUgYXNzaWdubWVudHMgd2l0aCBvdXIgY3VycmVudCBndWVzc2VzIGFzIHRvCisJICAgICBzZWN0aW9uIHNpemVzLiAgKi8KKwkgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRlbWVudF9saXN0LmhlYWQsCisJCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAgICAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKKworCSAgLyogUGVyZm9ybSBhbm90aGVyIHJlbGF4IHBhc3MgLSB0aGlzIHRpbWUgd2Uga25vdyB3aGVyZSB0aGUKKwkgICAgIGdsb2JhbHMgYXJlLCBzbyBjYW4gbWFrZSBiZXR0ZXIgZ3Vlc3MuICAqLworCSAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAorCQkJICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAgICAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIHRydWUpOworCX0KKyAgICAgIHdoaWxlIChyZWxheF9hZ2Fpbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU2l6ZSB1cCB0aGUgc2VjdGlvbnMuICAqLworICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAorCQkJICBhYnNfb3V0cHV0X3NlY3Rpb24sCisJCQkgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7CisgICAgfQorCisgIC8qIFNlZSBpZiBhbnl0aGluZyBzcGVjaWFsIHNob3VsZCBiZSBkb25lIG5vdyB3ZSBrbm93IGhvdyBiaWcKKyAgICAgZXZlcnl0aGluZyBpcy4gICovCisgIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOworCisgIC8qIEZpeCBhbnkgLnN0YXJ0b2YuIG9yIC5zaXplb2YuIHN5bWJvbHMuICAqLworICBsYW5nX3NldF9zdGFydG9mICgpOworCisgIC8qIERvIGFsbCB0aGUgYXNzaWdubWVudHMsIG5vdyB0aGF0IHdlIGtub3cgdGhlIGZpbmFsIHJlc3RpbmdwbGFjZXMKKyAgICAgb2YgYWxsIHRoZSBzeW1ib2xzICovCisKKyAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKKwkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKKwkJICAgICAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgbWFrZSBzZW5zZS4gICovCisgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKKyAgICAgICYmIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcykKKyAgICBsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzICgpOworICAKKyAgLyogRmluYWwgc3R1ZmZzICovCisKKyAgbGRlbXVsX2ZpbmlzaCAoKTsKKyAgbGFuZ19maW5pc2ggKCk7Cit9CisKKy8qIEVYUE9SVEVEIFRPIFlBQ0MgKi8KKwordm9pZAorbGFuZ19hZGRfd2lsZCAoc2VjdGlvbl9uYW1lLCBzZWN0aW9uc19zb3J0ZWQsIGZpbGVuYW1lLCBmaWxlbmFtZXNfc29ydGVkLAorCSAgICAgICBrZWVwX3NlY3Rpb25zLCBleGNsdWRlX2ZpbGVuYW1lKQorICAgICBjb25zdCBjaGFyICpjb25zdCBzZWN0aW9uX25hbWU7CisgICAgIGJvb2xlYW4gc2VjdGlvbnNfc29ydGVkOworICAgICBjb25zdCBjaGFyICpjb25zdCBmaWxlbmFtZTsKKyAgICAgYm9vbGVhbiBmaWxlbmFtZXNfc29ydGVkOworICAgICBib29sZWFuIGtlZXBfc2VjdGlvbnM7CisgICAgIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfZmlsZW5hbWU7Cit7CisgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCisJCQkJCSAgICBzdGF0X3B0cik7CisKKyAgaWYgKHNlY3Rpb25fbmFtZSAhPSAoY2hhciAqKSBOVUxMICYmIHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiQ09NTU9OIikgPT0gMCkKKyAgICB7CisgICAgICBwbGFjZWRfY29tbW9ucyA9IHRydWU7CisgICAgfQorICBpZiAoZmlsZW5hbWUgIT0gTlVMTCAmJiAhIHdpbGRjYXJkcCAoZmlsZW5hbWUpKQorICAgIHsKKyAgICAgIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSB0cnVlOworICAgIH0KKyAgbmV3LT5zZWN0aW9uX25hbWUgPSBzZWN0aW9uX25hbWU7CisgIG5ldy0+c2VjdGlvbnNfc29ydGVkID0gc2VjdGlvbnNfc29ydGVkOworICBuZXctPmZpbGVuYW1lID0gZmlsZW5hbWU7CisgIG5ldy0+ZmlsZW5hbWVzX3NvcnRlZCA9IGZpbGVuYW1lc19zb3J0ZWQ7CisgIG5ldy0+a2VlcF9zZWN0aW9ucyA9IGtlZXBfc2VjdGlvbnM7CisgIG5ldy0+ZXhjbHVkZV9maWxlbmFtZSA9IGV4Y2x1ZGVfZmlsZW5hbWU7CisgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7Cit9CisKK3ZvaWQKK2xhbmdfc2VjdGlvbl9zdGFydCAobmFtZSwgYWRkcmVzcykKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgZXRyZWVfdHlwZSAqIGFkZHJlc3M7Cit7CisgIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZSAqYWQgPSBuZXdfc3RhdCAobGFuZ19hZGRyZXNzX3N0YXRlbWVudCwgc3RhdF9wdHIpOworCisgIGFkLT5zZWN0aW9uX25hbWUgPSBuYW1lOworICBhZC0+YWRkcmVzcyA9IGFkZHJlc3M7Cit9CisKKy8qIFNldCB0aGUgc3RhcnQgc3ltYm9sIHRvIE5BTUUuICBDTURMSU5FIGlzIG5vbnplcm8gaWYgdGhpcyBpcyBjYWxsZWQKKyAgIGJlY2F1c2Ugb2YgYSAtZSBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB6ZXJvIGlmIHRoaXMgaXMKKyAgIGNhbGxlZCBieSBFTlRSWSBpbiBhIGxpbmtlciBzY3JpcHQuICBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRha2UKKyAgIHByZWNlZGVuY2UuICAqLworCit2b2lkCitsYW5nX2FkZF9lbnRyeSAobmFtZSwgY21kbGluZSkKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgYm9vbGVhbiBjbWRsaW5lOworeworICBpZiAoZW50cnlfc3ltYm9sID09IE5VTEwKKyAgICAgIHx8IGNtZGxpbmUKKyAgICAgIHx8ICEgZW50cnlfZnJvbV9jbWRsaW5lKQorICAgIHsKKyAgICAgIGVudHJ5X3N5bWJvbCA9IG5hbWU7CisgICAgICBlbnRyeV9mcm9tX2NtZGxpbmUgPSBjbWRsaW5lOworICAgIH0KK30KKwordm9pZAorbGFuZ19hZGRfdGFyZ2V0IChuYW1lKQorICAgICBDT05TVCBjaGFyICpuYW1lOworeworICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfdGFyZ2V0X3N0YXRlbWVudCwKKwkJCQkJICAgICAgc3RhdF9wdHIpOworCisgIG5ldy0+dGFyZ2V0ID0gbmFtZTsKKworfQorCit2b2lkCitsYW5nX2FkZF9tYXAgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIHdoaWxlICgqbmFtZSkKKyAgICB7CisgICAgICBzd2l0Y2ggKCpuYW1lKQorCXsKKwkgIGNhc2UgJ0YnOgorCSAgbWFwX29wdGlvbl9mID0gdHJ1ZTsKKwkgIGJyZWFrOworCX0KKyAgICAgIG5hbWUrKzsKKyAgICB9Cit9CisKK3ZvaWQKK2xhbmdfYWRkX2ZpbGwgKGV4cCkKKyAgICAgaW50IGV4cDsKK3sKKyAgbGFuZ19maWxsX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ19maWxsX3N0YXRlbWVudCwKKwkJCQkJICAgIHN0YXRfcHRyKTsKKworICBuZXctPmZpbGwgPSBleHA7Cit9CisKK3ZvaWQKK2xhbmdfYWRkX2RhdGEgKHR5cGUsIGV4cCkKKyAgICAgaW50IHR5cGU7CisgICAgIHVuaW9uIGV0cmVlX3VuaW9uICpleHA7Cit7CisKKyAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ19kYXRhX3N0YXRlbWVudCwKKwkJCQkJICAgIHN0YXRfcHRyKTsKKworICBuZXctPmV4cCA9IGV4cDsKKyAgbmV3LT50eXBlID0gdHlwZTsKKworfQorCisvKiBDcmVhdGUgYSBuZXcgcmVsb2Mgc3RhdGVtZW50LiAgUkVMT0MgaXMgdGhlIEJGRCByZWxvY2F0aW9uIHR5cGUgdG8KKyAgIGdlbmVyYXRlLiAgSE9XVE8gaXMgdGhlIGNvcnJlc3BvbmRpbmcgaG93dG8gc3RydWN0dXJlICh3ZSBjb3VsZAorICAgbG9vayB0aGlzIHVwLCBidXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBkb25lIHNvKS4gIFNFQ1RJT04gaXMgdGhlCisgICBzZWN0aW9uIHRvIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdCwgb3IgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUKKyAgIHN5bWJvbCB0byBnZW5lcmF0ZSBhIHJlbG9jIGFnYWluc3QuICBFeGFjdGx5IG9uZSBvZiBTRUNUSU9OIGFuZAorICAgTkFNRSBtdXN0IGJlIE5VTEwuICBBRERFTkQgaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIGFkZGVuZC4gICovCisKK3ZvaWQKK2xhbmdfYWRkX3JlbG9jIChyZWxvYywgaG93dG8sIHNlY3Rpb24sIG5hbWUsIGFkZGVuZCkKKyAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOworICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmQ7Cit7CisgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnAgPSBuZXdfc3RhdCAobGFuZ19yZWxvY19zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKKyAgCisgIHAtPnJlbG9jID0gcmVsb2M7CisgIHAtPmhvd3RvID0gaG93dG87CisgIHAtPnNlY3Rpb24gPSBzZWN0aW9uOworICBwLT5uYW1lID0gbmFtZTsKKyAgcC0+YWRkZW5kX2V4cCA9IGFkZGVuZDsKKworICBwLT5hZGRlbmRfdmFsdWUgPSAwOworICBwLT5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7CisgIHAtPm91dHB1dF92bWEgPSAwOworfQorCitsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKgorbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwKQorICAgICBldHJlZV90eXBlICogZXhwOworeworICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50LAorCQkJCQkJICBzdGF0X3B0cik7CisKKyAgbmV3LT5leHAgPSBleHA7CisgIHJldHVybiBuZXc7Cit9CisKK3ZvaWQKK2xhbmdfYWRkX2F0dHJpYnV0ZSAoYXR0cmlidXRlKQorICAgICBlbnVtIHN0YXRlbWVudF9lbnVtIGF0dHJpYnV0ZTsKK3sKKyAgbmV3X3N0YXRlbWVudCAoYXR0cmlidXRlLCBzaXplb2YgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUpLCBzdGF0X3B0cik7Cit9CisKK3ZvaWQKK2xhbmdfc3RhcnR1cCAobmFtZSkKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKK3sKKyAgaWYgKHN0YXJ0dXBfZmlsZSAhPSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIGVpbmZvIChfKCIlUCVGbXVsdGlwbGUgU1RBUlRVUCBmaWxlc1xuIikpOworICAgIH0KKyAgZmlyc3RfZmlsZS0+ZmlsZW5hbWUgPSBuYW1lOworICBmaXJzdF9maWxlLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7CisgIGZpcnN0X2ZpbGUtPnJlYWwgPSB0cnVlOworCisgIHN0YXJ0dXBfZmlsZSA9IG5hbWU7Cit9CisKK3ZvaWQKK2xhbmdfZmxvYXQgKG1heWJlKQorICAgICBib29sZWFuIG1heWJlOworeworICBsYW5nX2Zsb2F0X2ZsYWcgPSBtYXliZTsKK30KKwordm9pZAorbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKGZpbGwsIG1lbXNwZWMsIHBoZHJzKQorICAgICBiZmRfdm1hIGZpbGw7CisgICAgIGNvbnN0IGNoYXIgKm1lbXNwZWM7CisgICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Cit7CisgIGN1cnJlbnRfc2VjdGlvbi0+ZmlsbCA9IGZpbGw7CisgIGN1cnJlbnRfc2VjdGlvbi0+cmVnaW9uID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAobWVtc3BlYyk7CisgIGN1cnJlbnRfc2VjdGlvbi0+cGhkcnMgPSBwaGRyczsKKyAgc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Cit9CisKKy8qCisgQ3JlYXRlIGFuIGFic29sdXRlIHN5bWJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIHdpdGggdGhlIHZhbHVlIG9mIHRoZQorIGFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiB0aGUgc2VjdGlvbiBuYW1lZC4KKworIElmIHRoZSBzeW1ib2wgYWxyZWFkeSBleGlzdHMsIHRoZW4gZG8gbm90aGluZy4KKyovCit2b2lkCitsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mIChzZWNuYW1lLCBuYW1lKQorICAgICBjb25zdCBjaGFyICpzZWNuYW1lOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCisgICAgZWluZm8gKF8oIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKKworICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldworICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2VjOworCisgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOworCisgICAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgc2VjbmFtZSk7CisgICAgICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQorCWgtPnUuZGVmLnZhbHVlID0gMDsKKyAgICAgIGVsc2UKKwloLT51LmRlZi52YWx1ZSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIHNlYyk7CisKKyAgICAgIGgtPnUuZGVmLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOworICAgIH0KK30KKworLyoKKyBDcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgd2l0aCB0aGUgdmFsdWUgb2YgdGhlCisgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIG5hbWVkLgorCisgSWYgdGhlIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgdGhlbiBkbyBub3RoaW5nLgorKi8KK3ZvaWQKK2xhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YgKHNlY25hbWUsIG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIG5hbWUsIHRydWUsIHRydWUsIHRydWUpOworICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKKyAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOworCisgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3CisgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWM7CisKKyAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisKKyAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBzZWNuYW1lKTsKKyAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCisJaC0+dS5kZWYudmFsdWUgPSAwOworICAgICAgZWxzZQorCWgtPnUuZGVmLnZhbHVlID0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsIHNlYykKKwkJCSAgKyBiZmRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCBzZWMpKTsKKworICAgICAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7CisgICAgfQorfQorCit2b2lkCitsYW5nX3N0YXRlbWVudF9hcHBlbmQgKGxpc3QsIGVsZW1lbnQsIGZpZWxkKQorICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKiBsaXN0OworICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogZWxlbWVudDsKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiBmaWVsZDsKK3sKKyAgKihsaXN0LT50YWlsKSA9IGVsZW1lbnQ7CisgIGxpc3QtPnRhaWwgPSBmaWVsZDsKK30KKworLyogU2V0IHRoZSBvdXRwdXQgZm9ybWF0IHR5cGUuICAtb2Zvcm1hdCBvdmVycmlkZXMgc2NyaXB0cy4gICovCisKK3ZvaWQKK2xhbmdfYWRkX291dHB1dF9mb3JtYXQgKGZvcm1hdCwgYmlnLCBsaXR0bGUsIGZyb21fc2NyaXB0KQorICAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgIGNvbnN0IGNoYXIgKmJpZzsKKyAgICAgY29uc3QgY2hhciAqbGl0dGxlOworICAgICBpbnQgZnJvbV9zY3JpcHQ7Cit7CisgIGlmIChvdXRwdXRfdGFyZ2V0ID09IE5VTEwgfHwgIWZyb21fc2NyaXB0KQorICAgIHsKKyAgICAgIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9CSUcKKwkgICYmIGJpZyAhPSBOVUxMKQorCWZvcm1hdCA9IGJpZzsKKyAgICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0xJVFRMRQorCSAgICAgICAmJiBsaXR0bGUgIT0gTlVMTCkKKwlmb3JtYXQgPSBsaXR0bGU7CisKKyAgICAgIG91dHB1dF90YXJnZXQgPSBmb3JtYXQ7CisgICAgfQorfQorCisvKiBFbnRlciBhIGdyb3VwLiAgVGhpcyBjcmVhdGVzIGEgbmV3IGxhbmdfZ3JvdXBfc3RhdGVtZW50LCBhbmQgc2V0cworICAgc3RhdF9wdHIgdG8gYnVpbGQgbmV3IHN0YXRlbWVudHMgd2l0aGluIHRoZSBncm91cC4gICovCisKK3ZvaWQKK2xhbmdfZW50ZXJfZ3JvdXAgKCkKK3sKKyAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqZzsKKworICBnID0gbmV3X3N0YXQgKGxhbmdfZ3JvdXBfc3RhdGVtZW50LCBzdGF0X3B0cik7CisgIGxhbmdfbGlzdF9pbml0ICgmZy0+Y2hpbGRyZW4pOworICBzdGF0X3B0ciA9ICZnLT5jaGlsZHJlbjsKK30KKworLyogTGVhdmUgYSBncm91cC4gIFRoaXMganVzdCByZXNldHMgc3RhdF9wdHIgdG8gc3RhcnQgd3JpdGluZyB0byB0aGUKKyAgIHJlZ3VsYXIgbGlzdCBvZiBzdGF0ZW1lbnRzIGFnYWluLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3Qgd29yayBpZgorICAgZ3JvdXBzIGNhbiBvY2N1ciBpbnNpZGUgYW55dGhpbmcgZWxzZSB3aGljaCBjYW4gYWRqdXN0IHN0YXRfcHRyLAorICAgYnV0IGN1cnJlbnRseSB0aGV5IGNhbid0LiAgKi8KKwordm9pZAorbGFuZ19sZWF2ZV9ncm91cCAoKQoreworICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKK30KKworLyogQWRkIGEgbmV3IHByb2dyYW0gaGVhZGVyLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggZW50cnkgaW4gYSBQSERSUworICAgY29tbWFuZCBpbiBhIGxpbmtlciBzY3JpcHQuICAqLworCit2b2lkCitsYW5nX25ld19waGRyIChuYW1lLCB0eXBlLCBmaWxlaGRyLCBwaGRycywgYXQsIGZsYWdzKQorICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBldHJlZV90eXBlICp0eXBlOworICAgICBib29sZWFuIGZpbGVoZHI7CisgICAgIGJvb2xlYW4gcGhkcnM7CisgICAgIGV0cmVlX3R5cGUgKmF0OworICAgICBldHJlZV90eXBlICpmbGFnczsKK3sKKyAgc3RydWN0IGxhbmdfcGhkciAqbiwgKipwcDsKKworICBuID0gKHN0cnVjdCBsYW5nX3BoZHIgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGFuZ19waGRyKSk7CisgIG4tPm5leHQgPSBOVUxMOworICBuLT5uYW1lID0gbmFtZTsKKyAgbi0+dHlwZSA9IGV4cF9nZXRfdmFsdWVfaW50ICh0eXBlLCAwLCAicHJvZ3JhbSBoZWFkZXIgdHlwZSIsCisJCQkgICAgICAgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKKyAgbi0+ZmlsZWhkciA9IGZpbGVoZHI7CisgIG4tPnBoZHJzID0gcGhkcnM7CisgIG4tPmF0ID0gYXQ7CisgIG4tPmZsYWdzID0gZmxhZ3M7CisKKyAgZm9yIChwcCA9ICZsYW5nX3BoZHJfbGlzdDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQorICAgIDsKKyAgKnBwID0gbjsKK30KKworLyogUmVjb3JkIHRoZSBwcm9ncmFtIGhlYWRlciBpbmZvcm1hdGlvbiBpbiB0aGUgb3V0cHV0IEJGRC4gIEZJWE1FOiBXZQorICAgc2hvdWxkIG5vdCBiZSBjYWxsaW5nIGFuIEVMRiBzcGVjaWZpYyBmdW5jdGlvbiBoZXJlLiAgKi8KKworc3RhdGljIHZvaWQKK2xhbmdfcmVjb3JkX3BoZHJzICgpCit7CisgIHVuc2lnbmVkIGludCBhbGM7CisgIGFzZWN0aW9uICoqc2VjczsKKyAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpsYXN0OworICBzdHJ1Y3QgbGFuZ19waGRyICpsOworICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp1OworCisgIGFsYyA9IDEwOworICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChhbGMgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKKyAgbGFzdCA9IE5VTEw7CisgIGZvciAobCA9IGxhbmdfcGhkcl9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBjOworICAgICAgZmxhZ3dvcmQgZmxhZ3M7CisgICAgICBiZmRfdm1hIGF0OworCisgICAgICBjID0gMDsKKyAgICAgIGZvciAodSA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmhlYWQ7CisJICAgdSAhPSBOVUxMOworCSAgIHUgPSB1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQubmV4dCkKKwl7CisJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKKwkgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGw7CisKKwkgIG9zID0gJnUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKworCSAgcGwgPSBvcy0+cGhkcnM7CisJICBpZiAocGwgIT0gTlVMTCkKKwkgICAgbGFzdCA9IHBsOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKG9zLT5zZWN0eXBlID09IG5vbG9hZF9zZWN0aW9uCisJCSAgfHwgb3MtPmJmZF9zZWN0aW9uID09IE5VTEwKKwkJICB8fCAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKKwkJY29udGludWU7CisJICAgICAgcGwgPSBsYXN0OworCSAgICB9CisKKwkgIGlmIChvcy0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKKwkgICAgY29udGludWU7CisKKwkgIGZvciAoOyBwbCAhPSBOVUxMOyBwbCA9IHBsLT5uZXh0KQorCSAgICB7CisJICAgICAgaWYgKHN0cmNtcCAocGwtPm5hbWUsIGwtPm5hbWUpID09IDApCisJCXsKKwkJICBpZiAoYyA+PSBhbGMpCisJCSAgICB7CisJCSAgICAgIGFsYyAqPSAyOworCQkgICAgICBzZWNzID0gKChhc2VjdGlvbiAqKikKKwkJCSAgICAgIHhyZWFsbG9jIChzZWNzLCBhbGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7CisJCSAgICB9CisJCSAgc2Vjc1tjXSA9IG9zLT5iZmRfc2VjdGlvbjsKKwkJICArK2M7CisJCSAgcGwtPnVzZWQgPSB0cnVlOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChsLT5mbGFncyA9PSBOVUxMKQorCWZsYWdzID0gMDsKKyAgICAgIGVsc2UKKwlmbGFncyA9IGV4cF9nZXRfdm1hIChsLT5mbGFncywgMCwgInBoZHIgZmxhZ3MiLAorCQkJICAgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOworCisgICAgICBpZiAobC0+YXQgPT0gTlVMTCkKKwlhdCA9IDA7CisgICAgICBlbHNlCisJYXQgPSBleHBfZ2V0X3ZtYSAobC0+YXQsIDAsICJwaGRyIGxvYWQgYWRkcmVzcyIsCisJCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7CisKKyAgICAgIGlmICghIGJmZF9yZWNvcmRfcGhkciAob3V0cHV0X2JmZCwgbC0+dHlwZSwKKwkJCSAgICAgbC0+ZmxhZ3MgPT0gTlVMTCA/IGZhbHNlIDogdHJ1ZSwKKwkJCSAgICAgZmxhZ3MsCisJCQkgICAgIGwtPmF0ID09IE5VTEwgPyBmYWxzZSA6IHRydWUsCisJCQkgICAgIGF0LCBsLT5maWxlaGRyLCBsLT5waGRycywgYywgc2VjcykpCisJZWluZm8gKF8oIiVGJVA6IGJmZF9yZWNvcmRfcGhkciBmYWlsZWQ6ICVFXG4iKSk7CisgICAgfQorCisgIGZyZWUgKHNlY3MpOworCisgIC8qIE1ha2Ugc3VyZSBhbGwgdGhlIHBoZHIgYXNzaWdubWVudHMgc3VjY2VlZGVkLiAgKi8KKyAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKKyAgICAgICB1ICE9IE5VTEw7CisgICAgICAgdSA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uZXh0KQorICAgIHsKKyAgICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGw7CisKKyAgICAgIGlmICh1LT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuYmZkX3NlY3Rpb24gPT0gTlVMTCkKKwljb250aW51ZTsKKworICAgICAgZm9yIChwbCA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5waGRyczsKKwkgICBwbCAhPSBOVUxMOworCSAgIHBsID0gcGwtPm5leHQpCisJaWYgKCEgcGwtPnVzZWQgJiYgc3RyY21wIChwbC0+bmFtZSwgIk5PTkUiKSAhPSAwKQorCSAgZWluZm8gKF8oIiVYJVA6IHNlY3Rpb24gYCVzJyBhc3NpZ25lZCB0byBub24tZXhpc3RlbnQgcGhkciBgJXMnXG4iKSwKKwkJIHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uYW1lLCBwbC0+bmFtZSk7CisgICAgfQorfQorCisvKiBSZWNvcmQgYSBsaXN0IG9mIHNlY3Rpb25zIHdoaWNoIG1heSBub3QgYmUgY3Jvc3MgcmVmZXJlbmNlZC4gICovCisKK3ZvaWQKK2xhbmdfYWRkX25vY3Jvc3NyZWYgKGwpCisgICAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKmw7Cit7CisgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuOworCisgIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbi0+bmV4dCA9IG5vY3Jvc3NyZWZfbGlzdDsKKyAgbi0+bGlzdCA9IGw7CisgIG5vY3Jvc3NyZWZfbGlzdCA9IG47CisKKyAgLyogU2V0IG5vdGljZV9hbGwgc28gdGhhdCB3ZSBnZXQgaW5mb3JtZWQgYWJvdXQgYWxsIHN5bWJvbHMuICAqLworICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IHRydWU7Cit9CisMCisvKiBPdmVybGF5IGhhbmRsaW5nLiAgV2UgaGFuZGxlIG92ZXJsYXlzIHdpdGggc29tZSBzdGF0aWMgdmFyaWFibGVzLiAgKi8KKworLyogVGhlIG92ZXJsYXkgdmlydHVhbCBhZGRyZXNzLiAgKi8KK3N0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X3ZtYTsKKworLyogVGhlIG92ZXJsYXkgbG9hZCBhZGRyZXNzLiAgKi8KK3N0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X2xtYTsKKworLyogV2hldGhlciBub2Nyb3NzcmVmcyBpcyBzZXQgZm9yIHRoaXMgb3ZlcmxheS4gICovCitzdGF0aWMgaW50IG92ZXJsYXlfbm9jcm9zc3JlZnM7CisKKy8qIEFuIGV4cHJlc3Npb24gZm9yIHRoZSBtYXhpbXVtIHNlY3Rpb24gc2l6ZSBzZWVuIHNvIGZhci4gICovCitzdGF0aWMgZXRyZWVfdHlwZSAqb3ZlcmxheV9tYXg7CisKKy8qIEEgbGlzdCBvZiBhbGwgdGhlIHNlY3Rpb25zIGluIHRoaXMgb3ZlcmxheS4gICovCisKK3N0cnVjdCBvdmVybGF5X2xpc3QKK3sKKyAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbmV4dDsKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Cit9OworCitzdGF0aWMgc3RydWN0IG92ZXJsYXlfbGlzdCAqb3ZlcmxheV9saXN0OworCisvKiBTdGFydCBoYW5kbGluZyBhbiBvdmVybGF5LiAgKi8KKwordm9pZAorbGFuZ19lbnRlcl9vdmVybGF5ICh2bWFfZXhwciwgbG1hX2V4cHIsIG5vY3Jvc3NyZWZzKQorICAgICBldHJlZV90eXBlICp2bWFfZXhwcjsKKyAgICAgZXRyZWVfdHlwZSAqbG1hX2V4cHI7CisgICAgIGludCBub2Nyb3NzcmVmczsKK3sKKyAgLyogVGhlIGdyYW1tYXIgc2hvdWxkIHByZXZlbnQgbmVzdGVkIG92ZXJsYXlzIGZyb20gb2NjdXJyaW5nLiAgKi8KKyAgQVNTRVJUIChvdmVybGF5X3ZtYSA9PSBOVUxMCisJICAmJiBvdmVybGF5X2xtYSA9PSBOVUxMCisJICAmJiBvdmVybGF5X2xpc3QgPT0gTlVMTAorCSAgJiYgb3ZlcmxheV9tYXggPT0gTlVMTCk7CisKKyAgb3ZlcmxheV92bWEgPSB2bWFfZXhwcjsKKyAgb3ZlcmxheV9sbWEgPSBsbWFfZXhwcjsKKyAgb3ZlcmxheV9ub2Nyb3NzcmVmcyA9IG5vY3Jvc3NyZWZzOworfQorCisvKiBTdGFydCBhIHNlY3Rpb24gaW4gYW4gb3ZlcmxheS4gIFdlIGhhbmRsZSB0aGlzIGJ5IGNhbGxpbmcKKyAgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IHdpdGggdGhlIGNvcnJlY3QgVk1BIGFuZCBMTUEuICAqLworCit2b2lkCitsYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbiAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbjsKKyAgZXRyZWVfdHlwZSAqc2l6ZTsKKworICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAobmFtZSwgb3ZlcmxheV92bWEsIG5vcm1hbF9zZWN0aW9uLAorCQkJCSAgICAgICAwLCAwLCAwLCBvdmVybGF5X2xtYSk7CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2VjdGlvbiwgdGhlbiBiYXNlIHRoZSBWTUEgYW5kIExNQSBvZiBmdXR1cmUKKyAgICAgc2VjdGlvbnMgb24gdGhpcyBvbmUuICBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZXZlbiBpZiBgLicgaXMKKyAgICAgdXNlZCBpbiB0aGUgYWRkcmVzc2VzLiAgKi8KKyAgaWYgKG92ZXJsYXlfbGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIG92ZXJsYXlfdm1hID0gZXhwX25hbWVvcCAoQUREUiwgbmFtZSk7CisgICAgICBvdmVybGF5X2xtYSA9IGV4cF9uYW1lb3AgKExPQURBRERSLCBuYW1lKTsKKyAgICB9CisKKyAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24uICAqLworICBuID0gKHN0cnVjdCBvdmVybGF5X2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKKyAgbi0+b3MgPSBjdXJyZW50X3NlY3Rpb247CisgIG4tPm5leHQgPSBvdmVybGF5X2xpc3Q7CisgIG92ZXJsYXlfbGlzdCA9IG47CisKKyAgc2l6ZSA9IGV4cF9uYW1lb3AgKFNJWkVPRiwgbmFtZSk7CisKKyAgLyogQWRqdXN0IHRoZSBMTUEgZm9yIHRoZSBuZXh0IHNlY3Rpb24uICAqLworICBvdmVybGF5X2xtYSA9IGV4cF9iaW5vcCAoJysnLCBvdmVybGF5X2xtYSwgc2l6ZSk7CisKKyAgLyogQXJyYW5nZSB0byB3b3JrIG91dCB0aGUgbWF4aW11bSBzZWN0aW9uIGVuZCBhZGRyZXNzLiAgKi8KKyAgaWYgKG92ZXJsYXlfbWF4ID09IE5VTEwpCisgICAgb3ZlcmxheV9tYXggPSBzaXplOworICBlbHNlCisgICAgb3ZlcmxheV9tYXggPSBleHBfYmlub3AgKE1BWF9LLCBvdmVybGF5X21heCwgc2l6ZSk7Cit9CisKKy8qIEZpbmlzaCBhIHNlY3Rpb24gaW4gYW4gb3ZlcmxheS4gIFRoZXJlIGlzbid0IGFueSBzcGVjaWFsIHRvIGRvCisgICBoZXJlLiAgKi8KKwordm9pZAorbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24gKGZpbGwsIHBoZHJzKQorICAgICBiZmRfdm1hIGZpbGw7CisgICAgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNoYXIgKmNsZWFuLCAqczI7CisgIGNvbnN0IGNoYXIgKnMxOworICBjaGFyICpidWY7CisKKyAgbmFtZSA9IGN1cnJlbnRfc2VjdGlvbi0+bmFtZTsKKworICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoZmlsbCwgIipkZWZhdWx0KiIsIHBoZHJzKTsKKworICAvKiBEZWZpbmUgdGhlIG1hZ2ljIHN5bWJvbHMuICAqLworCisgIGNsZWFuID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOworICBzMiA9IGNsZWFuOworICBmb3IgKHMxID0gbmFtZTsgKnMxICE9ICdcMCc7IHMxKyspCisgICAgaWYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqczEpIHx8ICpzMSA9PSAnXycpCisgICAgICAqczIrKyA9ICpzMTsKKyAgKnMyID0gJ1wwJzsKKworICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNsZWFuKSArIHNpemVvZiAiX19sb2FkX3N0YXJ0XyIpOworICBzcHJpbnRmIChidWYsICJfX2xvYWRfc3RhcnRfJXMiLCBjbGVhbik7CisgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBidWYsCisJCQkJICBleHBfbmFtZW9wIChMT0FEQUREUiwgbmFtZSkpKTsKKworICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNsZWFuKSArIHNpemVvZiAiX19sb2FkX3N0b3BfIik7CisgIHNwcmludGYgKGJ1ZiwgIl9fbG9hZF9zdG9wXyVzIiwgY2xlYW4pOworICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgYnVmLAorCQkJCSAgZXhwX2Jpbm9wICgnKycsCisJCQkJCSAgICAgZXhwX25hbWVvcCAoTE9BREFERFIsIG5hbWUpLAorCQkJCQkgICAgIGV4cF9uYW1lb3AgKFNJWkVPRiwgbmFtZSkpKSk7CisKKyAgZnJlZSAoY2xlYW4pOworfQorCisvKiBGaW5pc2ggYW4gb3ZlcmxheS4gIElmIHRoZXJlIGFyZSBhbnkgb3ZlcmxheSB3aWRlIHNldHRpbmdzLCB0aGlzCisgICBsb29rcyB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhlIG92ZXJsYXkgYW5kIHNldHMgdGhlbS4gICovCisKK3ZvaWQKK2xhbmdfbGVhdmVfb3ZlcmxheSAoZmlsbCwgbWVtc3BlYywgcGhkcnMpCisgICAgIGJmZF92bWEgZmlsbDsKKyAgICAgY29uc3QgY2hhciAqbWVtc3BlYzsKKyAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKK3sKKyAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnJlZ2lvbjsKKyAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbDsKKyAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbm9jcm9zc3JlZjsKKworICBpZiAobWVtc3BlYyA9PSBOVUxMKQorICAgIHJlZ2lvbiA9IE5VTEw7CisgIGVsc2UKKyAgICByZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChtZW1zcGVjKTsKKworICBub2Nyb3NzcmVmID0gTlVMTDsKKworICBsID0gb3ZlcmxheV9saXN0OworICB3aGlsZSAobCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBvdmVybGF5X2xpc3QgKm5leHQ7CisKKyAgICAgIGlmIChmaWxsICE9IDAgJiYgbC0+b3MtPmZpbGwgPT0gMCkKKwlsLT5vcy0+ZmlsbCA9IGZpbGw7CisgICAgICBpZiAocmVnaW9uICE9IE5VTEwgJiYgbC0+b3MtPnJlZ2lvbiA9PSBOVUxMKQorCWwtPm9zLT5yZWdpb24gPSByZWdpb247CisgICAgICBpZiAocGhkcnMgIT0gTlVMTCAmJiBsLT5vcy0+cGhkcnMgPT0gTlVMTCkKKwlsLT5vcy0+cGhkcnMgPSBwaGRyczsKKworICAgICAgaWYgKG92ZXJsYXlfbm9jcm9zc3JlZnMpCisJeworCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmM7CisKKwkgIG5jID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuYyk7CisJICBuYy0+bmFtZSA9IGwtPm9zLT5uYW1lOworCSAgbmMtPm5leHQgPSBub2Nyb3NzcmVmOworCSAgbm9jcm9zc3JlZiA9IG5jOworCX0KKworICAgICAgbmV4dCA9IGwtPm5leHQ7CisgICAgICBmcmVlIChsKTsKKyAgICAgIGwgPSBuZXh0OworICAgIH0KKworICBpZiAobm9jcm9zc3JlZiAhPSBOVUxMKQorICAgIGxhbmdfYWRkX25vY3Jvc3NyZWYgKG5vY3Jvc3NyZWYpOworCisgIC8qIFVwZGF0ZSAuIGZvciB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LiAgKi8KKyAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwKKwkJCQkgIGV4cF9iaW5vcCAoJysnLCBvdmVybGF5X3ZtYSwgb3ZlcmxheV9tYXgpKSk7CisKKyAgb3ZlcmxheV92bWEgPSBOVUxMOworICBvdmVybGF5X2xtYSA9IE5VTEw7CisgIG92ZXJsYXlfbm9jcm9zc3JlZnMgPSAwOworICBvdmVybGF5X2xpc3QgPSBOVUxMOworICBvdmVybGF5X21heCA9IE5VTEw7Cit9CisMCisvKiBWZXJzaW9uIGhhbmRsaW5nLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgRUxGLiAgKi8KKworLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaG9sZHMgdGhlIHZlcnNpb24gdHJlZSB0aGF0IHdlIGJ1aWxkLiAgKi8KKworc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX2VsZl92ZXJzaW9uX2luZm87CisKK3N0YXRpYyBpbnQKK2xhbmdfdmVyc19tYXRjaF9sYW5nX2MgKGV4cHIsIHN5bSkKKyAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpleHByOworICAgICBjb25zdCBjaGFyICpzeW07Cit7CisgIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Cit9CisKK3N0YXRpYyBpbnQKK2xhbmdfdmVyc19tYXRjaF9sYW5nX2NwbHVzcGx1cyAoZXhwciwgc3ltKQorICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmV4cHI7CisgICAgIGNvbnN0IGNoYXIgKnN5bTsKK3sKKyAgY2hhciAqYWx0X3N5bTsKKyAgaW50IHJlc3VsdDsKKworICBpZiAoZXhwci0+cGF0dGVyblswXSA9PSAnKicgJiYgZXhwci0+cGF0dGVyblsxXSA9PSAnXDAnKQorICAgIHJldHVybiAxOworCisgIGFsdF9zeW0gPSBjcGx1c19kZW1hbmdsZShzeW0sIC8qIERNR0xfTk9fVFBBUkFNUyAqLyAwKTsKKyAgaWYgKCFhbHRfc3ltKQorICAgIHsKKyAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIChhbHNvKSByZXR1cm5zIE5VTEwgd2hlbiBpdCBpcyBub3QgYSBDKysgc3ltYm9sLgorCSBTaG91bGQgd2UgZWFybHkgb3V0IGZhbHNlIGluIHRoaXMgY2FzZT8gICovCisgICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgYWx0X3N5bSwgMCkgPT0gMDsKKyAgICAgIGZyZWUgKGFsdF9zeW0pOworICAgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhIChleHByLCBzeW0pCisgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZXhwcjsKKyAgICAgY29uc3QgY2hhciAqc3ltOworeworICBjaGFyICphbHRfc3ltOworICBpbnQgcmVzdWx0OworCisgIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCisgICAgcmV0dXJuIDE7CisKKyAgYWx0X3N5bSA9IGNwbHVzX2RlbWFuZ2xlKHN5bSwgRE1HTF9KQVZBKTsKKyAgaWYgKCFhbHRfc3ltKQorICAgIHsKKyAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIChhbHNvKSByZXR1cm5zIE5VTEwgd2hlbiBpdCBpcyBub3QgYSBKYXZhIHN5bWJvbC4KKwkgU2hvdWxkIHdlIGVhcmx5IG91dCBmYWxzZSBpbiB0aGlzIGNhc2U/ICAqLworICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgc3ltLCAwKSA9PSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIGFsdF9zeW0sIDApID09IDA7CisgICAgICBmcmVlIChhbHRfc3ltKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggdmFyaWFibGUgbmFtZSBvciBtYXRjaCBleHByZXNzaW9uLiAgKi8KKworc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICoKK2xhbmdfbmV3X3ZlcnNfcmVnZXggKG9yaWcsIG5ldywgbGFuZykKKyAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpvcmlnOworICAgICBjb25zdCBjaGFyICpuZXc7CisgICAgIGNvbnN0IGNoYXIgKmxhbmc7Cit7CisgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqcmV0OworCisgIHJldCA9IChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKikgeG1hbGxvYyAoc2l6ZW9mICpyZXQpOworICByZXQtPm5leHQgPSBvcmlnOworICByZXQtPnBhdHRlcm4gPSBuZXc7CisKKyAgaWYgKGxhbmcgPT0gTlVMTCB8fCBzdHJjYXNlY21wIChsYW5nLCAiQyIpID09IDApCisgICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2M7CisgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGxhbmcsICJDKysiKSA9PSAwKQorICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jcGx1c3BsdXM7CisgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKGxhbmcsICJKYXZhIikgPT0gMCkKKyAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfamF2YTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGVpbmZvIChfKCIlWCVQOiB1bmtub3duIGxhbmd1YWdlIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCisJICAgICBsYW5nKTsKKyAgICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19jOworICAgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBzZXQgb2YgdmFyaWFibGUgbmFtZXMgYW5kIG1hdGNoCisgICBleHByZXNzaW9ucy4gICovCisKK3N0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqCitsYW5nX25ld192ZXJzX25vZGUgKGdsb2JhbHMsIGxvY2FscykKKyAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpnbG9iYWxzOworICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxvY2FsczsKK3sKKyAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpyZXQ7CisKKyAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7CisgIHJldC0+bmV4dCA9IE5VTEw7CisgIHJldC0+bmFtZSA9IE5VTEw7CisgIHJldC0+dmVybnVtID0gMDsKKyAgcmV0LT5nbG9iYWxzID0gZ2xvYmFsczsKKyAgcmV0LT5sb2NhbHMgPSBsb2NhbHM7CisgIHJldC0+ZGVwcyA9IE5VTEw7CisgIHJldC0+bmFtZV9pbmR4ID0gKHVuc2lnbmVkIGludCkgLTE7CisgIHJldC0+dXNlZCA9IDA7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGtlZXBzIHRyYWNrIG9mIHZlcnNpb24gaW5kaWNlcy4gICovCisKK3N0YXRpYyBpbnQgdmVyc2lvbl9pbmRleDsKKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBrbm93IHRoZSBuYW1lIGFuZCBkZXBlbmRlbmNpZXMgb2YgdGhlCisgICB2ZXJzaW9uLiAgKi8KKwordm9pZAorbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKG5hbWUsIHZlcnNpb24sIGRlcHMpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc2lvbjsKKyAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpkZXBzOworeworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQsICoqcHA7CisgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTE7CisKKyAgLyogTWFrZSBzdXJlIHRoaXMgbm9kZSBoYXMgYSB1bmlxdWUgbmFtZS4gICovCisgIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKKyAgICBpZiAoc3RyY21wICh0LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSB2ZXJzaW9uIHRhZyBgJXMnXG4iKSwgbmFtZSk7CisKKyAgLyogQ2hlY2sgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbWF0Y2ggbmFtZXMsIGFuZCBtYWtlIHN1cmUgdGhlcmUKKyAgICAgYXJlbid0IGFueSBkdXBsaWNhdGVzLiAgKi8KKworICBmb3IgKGUxID0gdmVyc2lvbi0+Z2xvYmFsczsgZTEgIT0gTlVMTDsgZTEgPSBlMS0+bmV4dCkKKyAgICB7CisgICAgICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCisJeworCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMjsKKworCSAgZm9yIChlMiA9IHQtPmxvY2FsczsgZTIgIT0gTlVMTDsgZTIgPSBlMi0+bmV4dCkKKwkgICAgaWYgKHN0cmNtcCAoZTEtPnBhdHRlcm4sIGUyLT5wYXR0ZXJuKSA9PSAwKQorCSAgICAgIGVpbmZvIChfKCIlWCVQOiBkdXBsaWNhdGUgZXhwcmVzc2lvbiBgJXMnIGluIHZlcnNpb24gaW5mb3JtYXRpb25cbiIpLAorCQkgICAgIGUxLT5wYXR0ZXJuKTsKKwl9CisgICAgfQorCisgIGZvciAoZTEgPSB2ZXJzaW9uLT5sb2NhbHM7IGUxICE9IE5VTEw7IGUxID0gZTEtPm5leHQpCisgICAgeworICAgICAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQorCXsKKwkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZTI7CisKKwkgIGZvciAoZTIgPSB0LT5nbG9iYWxzOyBlMiAhPSBOVUxMOyBlMiA9IGUyLT5uZXh0KQorCSAgICBpZiAoc3RyY21wIChlMS0+cGF0dGVybiwgZTItPnBhdHRlcm4pID09IDApCisJICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCisJCSAgICAgZTEtPnBhdHRlcm4pOworCX0KKyAgICB9CisKKyAgdmVyc2lvbi0+ZGVwcyA9IGRlcHM7CisgIHZlcnNpb24tPm5hbWUgPSBuYW1lOworICArK3ZlcnNpb25faW5kZXg7CisgIHZlcnNpb24tPnZlcm51bSA9IHZlcnNpb25faW5kZXg7CisKKyAgZm9yIChwcCA9ICZsYW5nX2VsZl92ZXJzaW9uX2luZm87ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKKyAgICA7CisgICpwcCA9IHZlcnNpb247Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Ugc2VlIGEgdmVyc2lvbiBkZXBlbmRlbmN5LiAgKi8KKworc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICoKK2xhbmdfYWRkX3ZlcnNfZGVwZW5kIChsaXN0LCBuYW1lKQorICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmxpc3Q7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqcmV0OworICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7CisKKyAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7CisgIHJldC0+bmV4dCA9IGxpc3Q7CisKKyAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsIG5hbWUpID09IDApCisJeworCSAgcmV0LT52ZXJzaW9uX25lZWRlZCA9IHQ7CisJICByZXR1cm4gcmV0OworCX0KKyAgICB9CisKKyAgZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSBgJXMnXG4iKSwgbmFtZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2xhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gKCkKK3sKKyAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpncmVnID0gTlVMTCwgKmxyZWc7CisKKyAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZXhwb3J0cyIpOworICAgICAgY2hhciAqY29udGVudHMsICpwOworICAgICAgYmZkX3NpemVfdHlwZSBsZW47CisKKyAgICAgIGlmIChzZWMgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGxlbiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzZWMpOworICAgICAgY29udGVudHMgPSB4bWFsbG9jIChsZW4pOworICAgICAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzZWMsIGNvbnRlbnRzLCAwLCBsZW4pKQorCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gcmVhZCAuZXhwb3J0cyBzZWN0aW9uIGNvbnRlbnRzIiksIHNlYyk7CisKKyAgICAgIHAgPSBjb250ZW50czsKKyAgICAgIHdoaWxlIChwIDwgY29udGVudHMrbGVuKQorCXsKKwkgIGdyZWcgPSBsYW5nX25ld192ZXJzX3JlZ2V4IChncmVnLCBwLCBOVUxMKTsKKwkgIHAgPSBzdHJjaHIgKHAsICdcMCcpICsgMTsKKwl9CisKKyAgICAgIC8qIERvIG5vdCBmcmVlIHRoZSBjb250ZW50cywgYXMgd2UgdXNlZCB0aGVtIGNyZWF0aW5nIHRoZSByZWdleC4gICovCisKKyAgICAgIC8qIERvIG5vdCBpbmNsdWRlIHRoaXMgc2VjdGlvbiBpbiB0aGUgbGluay4gICovCisgICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGlzLT50aGVfYmZkLCBzZWMsCisJYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpcy0+dGhlX2JmZCwgc2VjKSB8IFNFQ19FWENMVURFKTsKKyAgICB9CisKKyAgbHJlZyA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKE5VTEwsICIqIiwgTlVMTCk7CisgIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlIChjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24sCisJCQkgICBsYW5nX25ld192ZXJzX25vZGUgKGdyZWcsIGxyZWcpLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2xkL2xkbGFuZy5oIGIvbGQvbGRsYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkNzk3MgotLS0gL2Rldi9udWxsCisrKyBiL2xkL2xkbGFuZy5oCkBAIC0wLDAgKzEsNDkwIEBACisvKiBsZGxhbmcuaCAtIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIHN1cHBvcnQKKyAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorICAgCisgICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIExETEFOR19ICisjZGVmaW5lIExETEFOR19ICisKK3R5cGVkZWYgZW51bQoreworICBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtLAorICBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW0sCisgIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bSwKKyAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKKyAgbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCisgIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0KK30gbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZmlsbF90eXBlOwordHlwZWRlZiBzdHJ1Y3Qgc3RhdGVtZW50X2xpc3QKK3sKKyAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKmhlYWQ7CisgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICoqdGFpbDsKK30gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlOworCisKK3R5cGVkZWYgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0Cit7CisgIGNoYXIgKm5hbWU7CisgIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqbmV4dDsKKyAgYmZkX3ZtYSBvcmlnaW47CisgIGJmZF9zaXplX3R5cGUgbGVuZ3RoOworICBiZmRfdm1hIGN1cnJlbnQ7CisgIGJmZF9zaXplX3R5cGUgb2xkX2xlbmd0aDsKKyAgZmxhZ3dvcmQgZmxhZ3M7CisgIGZsYWd3b3JkIG5vdF9mbGFnczsKKyAgYm9vbGVhbiBoYWRfZnVsbF9tZXNzYWdlOworfSBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSA7CisKK3R5cGVkZWYgc3RydWN0IGxhbmdfc3RhdGVtZW50X2hlYWRlcl9zdHJ1Y3QgCit7CisgIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7CisgIGVudW0gc3RhdGVtZW50X2VudW0KKyAgICB7CisgICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtLAorICAgICAgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtLAorICAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtLAorICAgICAgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfZmlsbF9zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0sCisgICAgICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bSwKKyAgICAgIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtLAorICAgICAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtLAorICAgICAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bSwKKworICAgICAgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF9lbnVtLAorICAgICAgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW0KKyAgICB9IHR5cGU7Cit9IGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlOworCisKK3R5cGVkZWYgc3RydWN0IAoreworICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7CisgIHVuaW9uIGV0cmVlX3VuaW9uICpleHA7Cit9IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgY29uc3QgY2hhciAqdGFyZ2V0OworfSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBsYW5nX291dHB1dF9zdGF0ZW1lbnRfc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgY29uc3QgY2hhciAqbmFtZTsKK30gbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGU7CisKKy8qIFNlY3Rpb24gdHlwZXMgc3BlY2lmaWVkIGluIGEgbGlua2VyIHNjcmlwdC4gICovCisKK2VudW0gc2VjdGlvbl90eXBlCit7CisgIG5vcm1hbF9zZWN0aW9uLAorICBkc2VjdF9zZWN0aW9uLAorICBjb3B5X3NlY3Rpb24sCisgIG5vbG9hZF9zZWN0aW9uLAorICBpbmZvX3NlY3Rpb24sCisgIG92ZXJsYXlfc2VjdGlvbgorfTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYSBsaXN0IG9mIHByb2dyYW0gaGVhZGVycyBkZXNjcmliaW5nIHNlZ21lbnRzCisgICBpbiB3aGljaCB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlIHBsYWNlZC4gICovCisKK3N0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdAoreworICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKm5leHQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGJvb2xlYW4gdXNlZDsKK307CisKK3R5cGVkZWYgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3N0cnVjdCAKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOworICB1bmlvbiBldHJlZV91bmlvbiAqYWRkcl90cmVlOworICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47CisgIGNvbnN0IGNoYXIgKm1lbXNwZWM7CisgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpuZXh0OworICBjb25zdCBjaGFyICpuYW1lOworCisgIGJvb2xlYW4gcHJvY2Vzc2VkOworICAgIAorICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247CisgIGZsYWd3b3JkIGZsYWdzOwkJLyogT3IgdG9nZXRoZXIgb2YgYWxsIGlucHV0IHNlY3Rpb25zICovCisgIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGU7CisgIHN0cnVjdCBtZW1vcnlfcmVnaW9uX3N0cnVjdCAqcmVnaW9uOworICBzaXplX3QgYmxvY2tfdmFsdWU7CisgIGZpbGxfdHlwZSBmaWxsOworCisgIGludCBzdWJzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBjb21wb25lbnRzICovCisgIGludCBzZWN0aW9uX2FsaWdubWVudDsgIC8qIGFsaWdubWVudCBvZiBzdGFydCBvZiBzZWN0aW9uICovCisKKyAgdW5pb24gZXRyZWVfdW5pb24gKmxvYWRfYmFzZTsKKworICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOworfSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKK30gbGFuZ19jb21tb25fc3RhdGVtZW50X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKK30gbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOworICBmaWxsX3R5cGUgZmlsbDsKKyAgaW50IHNpemU7CisgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKK30gbGFuZ19maWxsX3N0YXRlbWVudF90eXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7CisgIHVuc2lnbmVkIGludCB0eXBlOworICB1bmlvbiAgZXRyZWVfdW5pb24gKmV4cDsKKyAgYmZkX3ZtYSB2YWx1ZTsKKyAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOworICBiZmRfdm1hIG91dHB1dF92bWE7Cit9IGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZTsKKworLyogR2VuZXJhdGUgYSByZWxvYyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7CisKKyAgLyogUmVsb2MgdG8gZ2VuZXJhdGUuICAqLworICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CisKKyAgLyogUmVsb2MgaG93dG8gc3RydWN0dXJlLiAgKi8KKyAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87CisKKyAgLyogU2VjdGlvbiB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbiBhbmQKKyAgICAgbmFtZSBtdXN0IGJlIE5VTEwuICAqLworICBhc2VjdGlvbiAqc2VjdGlvbjsKKworICAvKiBOYW1lIG9mIHN5bWJvbCB0byBnZW5lcmF0ZSByZWxvYyBhZ2FpbnN0LiAgRXhhY3RseSBvbmUgb2Ygc2VjdGlvbgorICAgICBhbmQgbmFtZSBtdXN0IGJlIE5VTEwuICAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIEV4cHJlc3Npb24gZm9yIGFkZGVuZC4gICovCisgIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmRfZXhwOworCisgIC8qIFJlc29sdmVkIGFkZGVuZC4gICovCisgIGJmZF92bWEgYWRkZW5kX3ZhbHVlOworCisgIC8qIE91dHB1dCBzZWN0aW9uIHdoZXJlIHJlbG9jIHNob3VsZCBiZSBwZXJmb3JtZWQuICAqLworICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisKKyAgLyogVk1BIHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCisgIGJmZF92bWEgb3V0cHV0X3ZtYTsKK30gbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgLyogTmFtZSBvZiB0aGlzIGZpbGUuICAqLworICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgLyogTmFtZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wgZ2l2aW5nIGFkZHJlc3Mgb2YgdGV4dCBzdGFydCAqLworICAvKiBVc3VhbGx5IHRoZSBzYW1lIGFzIGZpbGVuYW1lLCBidXQgZm9yIGEgZmlsZSBzcGVjJ2Qgd2l0aCAtbAorICAgICB0aGlzIGlzIHRoZSAtbCBzd2l0Y2ggaXRzZWxmIHJhdGhlciB0aGFuIHRoZSBmaWxlbmFtZS4gICovCisgIGNvbnN0IGNoYXIgKmxvY2FsX3N5bV9uYW1lOworICAgIAorICBiZmQgKnRoZV9iZmQ7CisgICAgCisgIGJvb2xlYW4gY2xvc2VkOworICBmaWxlX3B0ciBwYXNzaXZlX3Bvc2l0aW9uOworICAgIAorICAvKiBTeW1ib2wgdGFibGUgb2YgdGhlIGZpbGUuICAqLworICBhc3ltYm9sICoqYXN5bWJvbHM7CisgIHVuc2lnbmVkIGludCBzeW1ib2xfY291bnQ7CisgICAgCisgIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUgLSB3aGF0ZXZlciBpdCBpcywgd2FuZGVycyB1cCBhbmQgZG93bgorICAgICBhcmNoaXZlcyAqLworICAgIAorICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHQ7CisgIC8qIFBvaW50IHRvIHRoZSBuZXh0IGZpbGUsIGJ1dCBza2lwcyBhcmNoaXZlIGNvbnRlbnRzICovCisgIHVuaW9uICBsYW5nX3N0YXRlbWVudF91bmlvbiAgKm5leHRfcmVhbF9maWxlOworICAgIAorICBib29sZWFuIGlzX2FyY2hpdmU7CisgICAgCisgIC8qIDEgbWVhbnMgc2VhcmNoIGEgc2V0IG9mIGRpcmVjdG9yaWVzIGZvciB0aGlzIGZpbGUuICAqLworICBib29sZWFuIHNlYXJjaF9kaXJzX2ZsYWc7CisgICAgCisgIC8qIDEgbWVhbnMgdGhpcyBpcyBiYXNlIGZpbGUgb2YgaW5jcmVtZW50YWwgbG9hZC4KKyAgICAgRG8gbm90IGxvYWQgdGhpcyBmaWxlJ3MgdGV4dCBvciBkYXRhLgorICAgICBBbHNvIGRlZmF1bHQgdGV4dF9zdGFydCB0byBhZnRlciB0aGlzIGZpbGUncyBic3MuICovCisgICAgCisgIGJvb2xlYW4ganVzdF9zeW1zX2ZsYWc7CisKKyAgLyogV2hldGhlciB0byBzZWFyY2ggZm9yIHRoaXMgZW50cnkgYXMgYSBkeW5hbWljIGFyY2hpdmUuICAqLworICBib29sZWFuIGR5bmFtaWM7CisKKyAgLyogV2hldGhlciB0byBpbmNsdWRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYW4gYXJjaGl2ZS4gICovCisgIGJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKKworICBib29sZWFuIGxvYWRlZDsKKyAgICAKKyAgLyogICAgdW5zaWduZWQgaW50IGdsb2JhbHNfaW5fdGhpc19maWxlOyovCisgIGNvbnN0IGNoYXIgKnRhcmdldDsKKyAgYm9vbGVhbiByZWFsOworfSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7CisgIGFzZWN0aW9uICpzZWN0aW9uOworICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppZmlsZTsKKyAgCit9IGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICpmaWxlOworfSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0Cit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOworICBib29sZWFuIHNlY3Rpb25zX3NvcnRlZDsKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGJvb2xlYW4gZmlsZW5hbWVzX3NvcnRlZDsKKyAgYm9vbGVhbiBrZWVwX3NlY3Rpb25zOworICBjb25zdCBjaGFyICpleGNsdWRlX2ZpbGVuYW1lOworICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Cit9IGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9zdHJ1Y3QKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOworICBjb25zdCAgY2hhciAqc2VjdGlvbl9uYW1lOworICB1bmlvbiAgZXRyZWVfdW5pb24gKmFkZHJlc3M7Cit9IGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOworICBiZmRfdm1hIG91dHB1dF9vZmZzZXQ7CisgIHNpemVfdCBzaXplOworICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisgIGZpbGxfdHlwZSBmaWxsOworfSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGU7CisKKy8qIEEgZ3JvdXAgc3RhdGVtZW50IGNvbGxlY3RzIGEgc2V0IG9mIGxpYnJhcmllcyB0b2dldGhlci4gIFRoZQorICAgbGlicmFyaWVzIGFyZSBzZWFyY2hlZCBtdWx0aXBsZSB0aW1lcywgdW50aWwgbm8gbmV3IHVuZGVmaW5lZAorICAgc3ltYm9scyBhcmUgZm91bmQuICBUaGUgZWZmZWN0IGlzIHRvIHNlYXJjaCBhIGdyb3VwIG9mIGxpYnJhcmllcyBhcworICAgdGhvdWdoIHRoZXkgd2VyZSBhIHNpbmdsZSBsaWJyYXJ5LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOworICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgY2hpbGRyZW47Cit9IGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGU7CisKK3R5cGVkZWYgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gCit7CisgIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKKyAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKm5leHQ7CisgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSB3aWxkX3N0YXRlbWVudDsKKyAgbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlIGRhdGFfc3RhdGVtZW50OworICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlIHJlbG9jX3N0YXRlbWVudDsKKyAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlIGFkZHJlc3Nfc3RhdGVtZW50OworICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKKyAgbGFuZ19hZmlsZV9hc2VjdGlvbl9wYWlyX3N0YXRlbWVudF90eXBlIGFmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50OworICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgYXNzaWdubWVudF9zdGF0ZW1lbnQ7CisgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgaW5wdXRfc3RhdGVtZW50OworICBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfdHlwZSB0YXJnZXRfc3RhdGVtZW50OworICBsYW5nX291dHB1dF9zdGF0ZW1lbnRfdHlwZSBvdXRwdXRfc3RhdGVtZW50OworICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSBpbnB1dF9zZWN0aW9uOworICBsYW5nX2NvbW1vbl9zdGF0ZW1lbnRfdHlwZSBjb21tb25fc3RhdGVtZW50OworICBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF90eXBlIG9iamVjdF9zeW1ib2xzX3N0YXRlbWVudDsKKyAgbGFuZ19maWxsX3N0YXRlbWVudF90eXBlIGZpbGxfc3RhdGVtZW50OworICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X3R5cGUgcGFkZGluZ19zdGF0ZW1lbnQ7CisgIGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgZ3JvdXBfc3RhdGVtZW50OworfSBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlOworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2dyYW0gaGVhZGVyLCBmcm9tIHRoZQorICAgUEhEUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCisKK3N0cnVjdCBsYW5nX3BoZHIKK3sKKyAgc3RydWN0IGxhbmdfcGhkciAqbmV4dDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgbG9uZyB0eXBlOworICBib29sZWFuIGZpbGVoZHI7CisgIGJvb2xlYW4gcGhkcnM7CisgIGV0cmVlX3R5cGUgKmF0OworICBldHJlZV90eXBlICpmbGFnczsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIGxpc3Qgb2Ygc2VjdGlvbnMgd2hpY2ggbWF5IG5vdAorICAgY3Jvc3MgcmVmZXJlbmNlIGVhY2ggb3RoZXIuICAqLworCitzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmCit7CisgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5leHQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisvKiBUaGUgbGlzdCBvZiBub2Nyb3NzcmVmIGxpc3RzLiAgKi8KKworc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMKK3sKKyAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5leHQ7CisgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKmxpc3Q7Cit9OworCitleHRlcm4gc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5vY3Jvc3NyZWZfbGlzdDsKKworZXh0ZXJuIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmFic19vdXRwdXRfc2VjdGlvbjsKK2V4dGVybiBib29sZWFuIGxhbmdfaGFzX2lucHV0X2ZpbGU7CitleHRlcm4gZXRyZWVfdHlwZSAqYmFzZTsKK2V4dGVybiBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnN0YXRfcHRyOworZXh0ZXJuIGJvb2xlYW4gZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmU7CisKK2V4dGVybiBjb25zdCBjaGFyICplbnRyeV9zeW1ib2w7CitleHRlcm4gYm9vbGVhbiBlbnRyeV9mcm9tX2NtZGxpbmU7CisKK2V4dGVybiB2b2lkIGxhbmdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvbnN0KSk7CitleHRlcm4gc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpsYW5nX21lbW9yeV9yZWdpb25fZGVmYXVsdAorICBQQVJBTVMgKChhc2VjdGlvbiAqKSk7CitleHRlcm4gdm9pZCBsYW5nX21hcCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsYW5nX3NldF9mbGFncyBQQVJBTVMgKChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIGxhbmdfYWRkX291dHB1dCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCBmcm9tX3NjcmlwdCkpOworZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUsCisJICAgZXRyZWVfdHlwZSAqIGFkZHJlc3NfZXhwLAorCSAgIGVudW0gc2VjdGlvbl90eXBlIHNlY3R5cGUsCisJICAgYmZkX3ZtYSBibG9ja192YWx1ZSwKKwkgICBldHJlZV90eXBlICphbGlnbiwKKwkgICBldHJlZV90eXBlICpzdWJhbGlnbiwKKwkgICBldHJlZV90eXBlICopKTsKK2V4dGVybiB2b2lkIGxhbmdfZmluYWwgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGFuZ19wcm9jZXNzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxhbmdfc2VjdGlvbl9zdGFydCBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuaW9uIGV0cmVlX3VuaW9uICopKTsKK2V4dGVybiB2b2lkIGxhbmdfYWRkX2VudHJ5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworZXh0ZXJuIHZvaWQgbGFuZ19hZGRfdGFyZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgbGFuZ19hZGRfd2lsZAorICBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBsYW5nX2FkZF9tYXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBsYW5nX2FkZF9maWxsIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGxhbmdfYWRkX2Fzc2lnbm1lbnQgUEFSQU1TICgodW5pb24gZXRyZWVfdW5pb24gKikpOworZXh0ZXJuIHZvaWQgbGFuZ19hZGRfYXR0cmlidXRlIFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0pKTsKK2V4dGVybiB2b2lkIGxhbmdfc3RhcnR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIGxhbmdfZmxvYXQgUEFSQU1TICgoZW51bSBiZmRfYm9vbGVhbikpOworZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKKyAgUEFSQU1TICgoYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikpOworZXh0ZXJuIHZvaWQgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZiBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgbGFuZ19hYnNfc3ltYm9sX2F0X2JlZ2lubmluZ19vZiBQQVJBTVMgKChjb25zdCBjaGFyICosCisJCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kIFBBUkFNUyAoKHN0cnVjdCBzdGF0ZW1lbnRfbGlzdCAqLAorCQkJCQkgICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqLAorCQkJCQkgICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqKikpOworZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlCisgIFBBUkFNUyAoKHZvaWQgKCpkb3RoaXMpIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKSk7CitleHRlcm4gdm9pZCBsYW5nX2Zvcl9lYWNoX2ZpbGUKKyAgUEFSQU1TICgodm9pZCAoKmRvdGhpcykgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpKTsKK2V4dGVybiBiZmRfdm1hIGxhbmdfZG9fYXNzaWdubWVudHMKKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHMsCisJICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAorCSAgIGZpbGxfdHlwZSBmaWxsLAorCSAgIGJmZF92bWEgZG90KSk7CisKKyNkZWZpbmUgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQoc3RhdGVtZW50KQkJXAorICBleHRlcm4gbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGZpbGVfY2hhaW47CQkJXAorICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdGF0ZW1lbnQ7CQkJCVwKKyAgZm9yIChzdGF0ZW1lbnQgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKWZpbGVfY2hhaW4uaGVhZDtcCisgICAgICAgc3RhdGVtZW50ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopTlVMTDsJCVwKKyAgICAgICBzdGF0ZW1lbnQgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKXN0YXRlbWVudC0+bmV4dClcCisgIAorZXh0ZXJuIHZvaWQgbGFuZ19wcm9jZXNzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkbGFuZ19hZGRfZmlsZSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK2V4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqIGNvbnN0KSk7CitleHRlcm4gbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbGFuZ19hZGRfaW5wdXRfZmlsZQorICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKKwkgICBjb25zdCBjaGFyICp0YXJnZXQpKTsKK2V4dGVybiB2b2lkIGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKK2V4dGVybiBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICoKKyAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lKSk7CitleHRlcm4gdm9pZCBsZGxhbmdfYWRkX3VuZGVmIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmNvbnN0IG5hbWUpKTsKK2V4dGVybiB2b2lkIGxhbmdfYWRkX291dHB1dF9mb3JtYXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCQkJCSAgICBjb25zdCBjaGFyICosIGludCBmcm9tX3NjcmlwdCkpOworZXh0ZXJuIHZvaWQgbGFuZ19saXN0X2luaXQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOworZXh0ZXJuIHZvaWQgbGFuZ19hZGRfZGF0YSBQQVJBTVMgKChpbnQgdHlwZSwgdW5pb24gZXRyZWVfdW5pb24gKikpOworZXh0ZXJuIHZvaWQgbGFuZ19hZGRfcmVsb2MKKyAgUEFSQU1TICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jLCByZWxvY19ob3d0b190eXBlICpob3d0bywKKwkgICBhc2VjdGlvbiAqc2VjdGlvbiwgY29uc3QgY2hhciAqbmFtZSwgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZCkpOworZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQKKyAgUEFSQU1TICgodm9pZCAoKmZ1bmMpIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKSk7CitleHRlcm4gUFRSIHN0YXRfYWxsb2MgUEFSQU1TICgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGRwcmludF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqLCBpbnQpKTsKK2V4dGVybiBiZmRfdm1hIGxhbmdfc2l6ZV9zZWN0aW9ucworICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAorCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKKwkgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHJldiwgZmlsbF90eXBlIGZpbGwsCisJICAgYmZkX3ZtYSBkb3QsIGJvb2xlYW4gcmVsYXgpKTsKK2V4dGVybiB2b2lkIGxhbmdfZW50ZXJfZ3JvdXAgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9ncm91cCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCB3aWxkX2RvaXQKKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwdHIsIGFzZWN0aW9uICpzZWN0aW9uLAorCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCwKKwkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlKSk7CitleHRlcm4gdm9pZCBsYW5nX25ld19waGRyCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgZXRyZWVfdHlwZSAqLCBib29sZWFuLCBib29sZWFuLCBldHJlZV90eXBlICosCisJICAgZXRyZWVfdHlwZSAqKSk7CitleHRlcm4gdm9pZCBsYW5nX2FkZF9ub2Nyb3NzcmVmIFBBUkFNUyAoKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikpOworZXh0ZXJuIHZvaWQgbGFuZ19lbnRlcl9vdmVybGF5IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgZXRyZWVfdHlwZSAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgbGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24KKyAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopKTsKK2V4dGVybiB2b2lkIGxhbmdfbGVhdmVfb3ZlcmxheQorICBQQVJBTVMgKChiZmRfdm1hLCBjb25zdCBjaGFyICosIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfZWxmX3ZlcnNpb25faW5mbzsKKworZXh0ZXJuIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbGFuZ19uZXdfdmVyc19yZWdleAorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfbmV3X3ZlcnNfbm9kZQorICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICopKTsKK2V4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmxhbmdfYWRkX3ZlcnNfZGVwZW5kCisgIFBBUkFNUyAoKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqLCBjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICosCisJICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGxleC5oIGIvbGQvbGRsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQ0NGNhCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRsZXguaApAQCAtMCwwICsxLDYyIEBACisvKiBsZGxleC5oIC0KKyAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBMRExFWF9ICisjZGVmaW5lIExETEVYX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFRoZSBpbml0aWFsIHBhcnNlciBzdGF0ZXMuICAqLwordHlwZWRlZiBlbnVtIGlucHV0X2VudW0geworICBpbnB1dF9zZWxlY3RlZCwJCS8qIFdlJ3ZlIHNldCB0aGUgaW5pdGlhbCBzdGF0ZS4gICovCisgIGlucHV0X3NjcmlwdCwKKyAgaW5wdXRfbXJpX3NjcmlwdCwKKyAgaW5wdXRfdmVyc2lvbl9zY3JpcHQsCisgIGlucHV0X2RlZnN5bQorfSBpbnB1dF90eXBlOworCitleHRlcm4gaW5wdXRfdHlwZSBwYXJzZXJfaW5wdXQ7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGluZW5vOworZXh0ZXJuIGNvbnN0IGNoYXIgKmxleF9zdHJpbmc7CisKKy8qIEluIGxkbGV4LmwuICAqLworZXh0ZXJuIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZXhfcHVzaF9maWxlIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBsZXhfcmVkaXJlY3QgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gdm9pZCBsZGxleF9zY3JpcHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGRsZXhfbXJpX3NjcmlwdCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZGxleF92ZXJzaW9uX3NjcmlwdCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZGxleF92ZXJzaW9uX2ZpbGUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGRsZXhfZGVmc3ltIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkbGV4X2V4cHJlc3Npb24gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGRsZXhfYm90aCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBsZGxleF9jb21tYW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGxkbGV4X3BvcHN0YXRlIFBBUkFNUyAoKHZvaWQpKTsKKworLyogSW4gbGV4c3VwLmMuICAqLworZXh0ZXJuIGludCBsZXhfaW5wdXQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgbGV4X3VucHV0IFBBUkFNUyAoKGludCkpOworI2lmbmRlZiB5eXdyYXAKK2V4dGVybiBpbnQgeXl3cmFwIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGxleC5sIGIvbGQvbGRsZXgubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWVmODBmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRsZXgubApAQCAtMCwwICsxLDY2MiBAQAorJXsKKworLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK0dMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCitUaGlzIHdhcyB3cml0dGVuIGJ5IHN0ZXZlIGNoYW1iZXJsYWluCisgICAgICAgICAgICAgICAgICAgIHNhY0BjeWdudXMuY29tCisqLworCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmZGVmIE1QVworLyogUHJldmVudCBlbnVtIHJlZGVmaW5pdGlvbiBwcm9ibGVtcy4gKi8KKyNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKKyNlbmRpZiAvKiBNUFcgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZGxleC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorCisvKiBUaGUgdHlwZSBvZiB0b3AtbGV2ZWwgcGFyc2VyIGlucHV0LgorICAgeXlsZXggYW5kIHl5cGFyc2UgKGluZGlyZWN0bHkpIGJvdGggY2hlY2sgdGhpcy4gICovCitpbnB1dF90eXBlIHBhcnNlcl9pbnB1dDsKKworLyogTGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgaW5wdXQgZmlsZS4KKyAgIChGSVhNRSBBY3R1YWxseSwgaXQgZG9lc24ndCBhcHBlYXIgdG8gZ2V0IHJlc2V0IGZvciBlYWNoIGZpbGU/KSAgKi8KK3Vuc2lnbmVkIGludCBsaW5lbm8gPSAxOworCisvKiBUaGUgc3RyaW5nIHdlIGFyZSBjdXJyZW50bHkgbGV4aW5nLCBvciBOVUxMIGlmIHdlIGFyZSByZWFkaW5nIGEKKyAgIGZpbGUuICAqLworY29uc3QgY2hhciAqbGV4X3N0cmluZyA9IE5VTEw7CisKKy8qIFN1cHBvcnQgZm9yIGZsZXggcmVhZGluZyBmcm9tIG1vcmUgdGhhbiBvbmUgaW5wdXQgZmlsZSAoc3RyZWFtKS4KKyAgIGBpbmNsdWRlX3N0YWNrJyBpcyBmbGV4J3MgaW5wdXQgc3RhdGUgZm9yIGVhY2ggb3BlbiBmaWxlOworICAgYGZpbGVfbmFtZV9zdGFjaycgaXMgdGhlIGZpbGUgbmFtZXMuICBgbGluZW5vX3N0YWNrJyBpcyB0aGUgY3VycmVudAorICAgbGluZSBudW1iZXJzLgorCisgICBJZiBgaW5jbHVkZV9zdGFja19wdHInIGlzIDAsIHdlIGhhdmVuJ3Qgc3RhcnRlZCByZWFkaW5nIGFueXRoaW5nIHlldC4KKyAgIE90aGVyd2lzZSwgc3RhY2sgZWxlbWVudHMgMCB0aHJvdWdoIGBpbmNsdWRlX3N0YWNrX3B0ciAtIDEnIGFyZSB2YWxpZC4gICovCisKKyN1bmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSB5eV9pbnB1dChidWYsICZyZXN1bHQsIG1heF9zaXplKQorCisjZGVmaW5lIE1BWF9JTkNMVURFX0RFUFRIIDEwCitzdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEhdOworc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVfbmFtZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07CitzdGF0aWMgdW5zaWduZWQgaW50IGxpbmVub19zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07CitzdGF0aWMgdW5zaWduZWQgaW50IGluY2x1ZGVfc3RhY2tfcHRyID0gMDsKK3N0YXRpYyBpbnQgdmVyc19ub2RlX25lc3RpbmcgPSAwOworCitzdGF0aWMgWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZywKKwkJCQkJCQlzaXplX3Qgc2l6ZSkpOworc3RhdGljIHZvaWQgeXlfaW5wdXQgUEFSQU1TICgoY2hhciAqLCBpbnQgKnJlc3VsdCwgaW50IG1heF9zaXplKSk7CisKK3N0YXRpYyB2b2lkIGNvbW1lbnQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgbGV4X3dhcm5faW52YWxpZCBQQVJBTVMgKChjaGFyICp3aGVyZSwgY2hhciAqd2hhdCkpOworCisvKiBTVEFURVMgCisJRVhQUkVTU0lPTglkZWZpbml0ZWx5IGluIGFuIGV4cHJlc3Npb24KKwlTQ1JJUFQJCWRlZmluaXRlbHkgaW4gYSBzY3JpcHQKKwlCT1RICQllaXRoZXIgRVhQUkVTU0lPTiBvciBTQ1JJUFQKKwlERUZTWU1FWFAJaW4gYW4gYXJndW1lbnQgdG8gLWRlZnN5bQorICAgICAgICBNUkkgICAgICAgICAgICAgaW4gYW4gTVJJIHNjcmlwdAorCVZFUlNfU1RBUlQJc3RhcnRpbmcgYSBTdW4gc3R5bGUgbWFwZmlsZQorCVZFUlNfU0NSSVBUCWEgU3VuIHN0eWxlIG1hcGZpbGUKKwlWRVJTX05PREUJYSBub2RlIHdpdGhpbiBhIFN1biBzdHlsZSBtYXBmaWxlCisqLworI2RlZmluZSBSVE9LRU4oeCkgIHsgIHl5bHZhbC50b2tlbiA9IHg7IHJldHVybiB4OyB9CisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgZmxleCB3YW50IHRoaXMuICAqLworI2lmbmRlZiB5eXdyYXAKK2ludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQorI2VuZGlmCislfQorCislYSA0MDAwCislbyA1MDAwCisKK0NNREZJTEVOQU1FQ0hBUiAgIFtfYS16QS1aMC05XC9cLlxcX1wrXCRcOlxbXF1cXFwsXD1cJlwhXDxcPlwtXH5dCitDTURGSUxFTkFNRUNIQVIxICBbX2EtekEtWjAtOVwvXC5cXF9cK1wkXDpcW1xdXFxcLFw9XCZcIVw8XD5cfl0KK0ZJTEVOQU1FQ0hBUjEJW19hLXpBLVpcL1wuXFxcJFxfXH5dCitTWU1CT0xDSEFSTiAgICAgW19hLXpBLVpcL1wuXFxcJFxfXH4wLTldCitGSUxFTkFNRUNIQVIJW19hLXpBLVowLTlcL1wuXC1cX1wrXD1cJFw6XFtcXVxcXCxcfl0KK1dJTERDSEFSCVtfYS16QS1aMC05XC9cLlwtXF9cK1w9XCRcOlxbXF1cXFwsXH5cP1wqXQorV0hJVEUJCVsgXHRcblxyXSsgCisKK05PQ0ZJTEVOQU1FQ0hBUglbX2EtekEtWjAtOVwvXC5cLVxfXCtcJFw6XFtcXVxcXH5dCisKK1ZfVEFHIFsuJF9hLXpBLVpdWy5fYS16QS1aMC05XSoKK1ZfSURFTlRJRklFUiBbKj8uJF9hLXpBLVpdWyo/LiRfYS16QS1aMC05XSoKKworJXMgU0NSSVBUCislcyBFWFBSRVNTSU9OCislcyBCT1RICislcyBERUZTWU1FWFAKKyVzIE1SSQorJXMgVkVSU19TVEFSVAorJXMgVkVSU19TQ1JJUFQKKyVzIFZFUlNfTk9ERQorJSUKKworICBpZiAocGFyc2VyX2lucHV0ICE9IGlucHV0X3NlbGVjdGVkKQorICAgIHsKKyAgICAgIC8qIFRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgaW5wdXQgZGV0ZXJtaW5lcyB0aGUgaW5pdGlhbCBwYXJzZXIgc3RhdGUuICAqLworICAgICAgaW5wdXRfdHlwZSB0ID0gcGFyc2VyX2lucHV0OworICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2VsZWN0ZWQ7CisgICAgICBzd2l0Y2ggKHQpCisJeworCWNhc2UgaW5wdXRfc2NyaXB0OiByZXR1cm4gSU5QVVRfU0NSSVBUOyBicmVhazsKKwljYXNlIGlucHV0X21yaV9zY3JpcHQ6IHJldHVybiBJTlBVVF9NUklfU0NSSVBUOyBicmVhazsKKwljYXNlIGlucHV0X3ZlcnNpb25fc2NyaXB0OiByZXR1cm4gSU5QVVRfVkVSU0lPTl9TQ1JJUFQ7IGJyZWFrOworCWNhc2UgaW5wdXRfZGVmc3ltOiByZXR1cm4gSU5QVVRfREVGU1lNOyBicmVhazsKKwlkZWZhdWx0OiBhYm9ydCAoKTsKKwl9CisgICAgfQorCis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTj4iLyoiCXsgY29tbWVudCgpOyB9CisKKworPERFRlNZTUVYUD4iLSIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignLScpO30KKzxERUZTWU1FWFA+IisiICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oJysnKTt9Cis8REVGU1lNRVhQPntGSUxFTkFNRUNIQVIxfXtTWU1CT0xDSEFSTn0qICAgeyB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyByZXR1cm4gTkFNRTsgfQorPERFRlNZTUVYUD4iPSIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignPScpOyB9CisKKzxNUkksRVhQUkVTU0lPTj4iJCIoWzAtOUEtRmEtZl0pKyB7CisgIAkJCQl5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAoeXl0ZXh0KzEsIDAsMTYpOworCQkJCXJldHVybiBJTlQ7CisJCQl9CisKKzxNUkksRVhQUkVTU0lPTj4oWzAtOUEtRmEtZl0pKyhIfGh8WHx4fEJ8YnxPfG98RHxkKSB7CisJCQkJICAgaW50IGliYXNlIDsKKwkJCQkgICBzd2l0Y2ggKHl5dGV4dFt5eWxlbmctMV0pIHsKKwkJCQkgICAgY2FzZSAnWCc6IAorCQkJCSAgICBjYXNlICd4JzoKKwkJCQkgICAgY2FzZSAnSCc6CisJCQkJICAgIGNhc2UgJ2gnOgorCQkJCSAgICAgaWJhc2UgPSAxNjsKKwkJCQkgICAgIGJyZWFrOworCQkJCSAgICBjYXNlICdPJzoKKwkJCQkgICAgY2FzZSAnbyc6CisJCQkJICAgICBpYmFzZSA9IDg7CisJCQkJICAgICBicmVhazsKKwkJCQkgICAgY2FzZSAnQic6CisJCQkJICAgIGNhc2UgJ2InOgorCQkJCSAgICAgaWJhc2UgPSAyOworCQkJCSAgICAgYnJlYWs7CisJCQkJICAgIGRlZmF1bHQ6CisJCQkJICAgICBpYmFzZSA9IDEwOworCQkJCSAgIH0KKwkJCQkgICB5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAoeXl0ZXh0LCAwLAorCQkJCQkJCQkgIGliYXNlKTsKKwkJCQkgICByZXR1cm4gSU5UOworCQkJCSB9Cis8U0NSSVBULERFRlNZTUVYUCxNUkksQk9USCxFWFBSRVNTSU9OPigoKCIkInwiMHgiKShbMC05QS1GYS1mXSkrKXwoKFswLTldKSspKShNfEt8bXxrKT8geworCQkJCSAgY2hhciAqcyA9IHl5dGV4dDsKKworCQkJCSAgaWYgKCpzID09ICckJykKKwkJCQkgICAgKytzOworCQkJCSAgeXlsdmFsLmludGVnZXIgPSBiZmRfc2Nhbl92bWEgKHMsIDAsIDApOworCQkJCSAgaWYgKHl5dGV4dFt5eWxlbmctMV0gPT0gJ00nCisJCQkJICAgICAgfHwgeXl0ZXh0W3l5bGVuZy0xXSA9PSAnbScpCisJCQkJICAgIHl5bHZhbC5pbnRlZ2VyICo9IDEwMjQgKiAxMDI0OworCQkJCSAgaWYgKHl5dGV4dFt5eWxlbmctMV0gPT0gJ0snIAorCQkJCSAgICAgIHx8IHl5dGV4dFt5eWxlbmctMV09PSdrJykKKwkJCQkgICAgeXlsdmFsLmludGVnZXIgKj0gMTAyNDsKKwkJCQkgIHJldHVybiBJTlQ7CisJCQkJfQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJdIgkJeyBSVE9LRU4oJ10nKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IlsiCQl7IFJUT0tFTignWycpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPDw9Igl7IFJUT0tFTihMU0hJRlRFUSk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+Pj0iCXsgUlRPS0VOKFJTSElGVEVRKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Inx8Igl7IFJUT0tFTihPUk9SKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij09Igl7IFJUT0tFTihFUSk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIhPSIJeyBSVE9LRU4oTkUpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPj0iCXsgUlRPS0VOKEdFKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ijw9Igl7IFJUT0tFTihMRSk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8PCIJeyBSVE9LRU4oTFNISUZUKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4+Igl7IFJUT0tFTihSU0hJRlQpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKz0iCXsgUlRPS0VOKFBMVVNFUSk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiItPSIJeyBSVE9LRU4oTUlOVVNFUSk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIqPSIJeyBSVE9LRU4oTVVMVEVRKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii89Igl7IFJUT0tFTihESVZFUSk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImPSIJeyBSVE9LRU4oQU5ERVEpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifD0iCXsgUlRPS0VOKE9SRVEpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJiYiCXsgUlRPS0VOKEFOREFORCk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+IgkJeyBSVE9LRU4oJz4nKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiwiCQl7IFJUT0tFTignLCcpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJiIJCXsgUlRPS0VOKCcmJyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ8IgkJeyBSVE9LRU4oJ3wnKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+In4iCQl7IFJUT0tFTignficpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iISIJCXsgUlRPS0VOKCchJyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI/IgkJeyBSVE9LRU4oJz8nKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IioiCQl7IFJUT0tFTignKicpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKyIJCXsgUlRPS0VOKCcrJyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiItIgkJeyBSVE9LRU4oJy0nKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii8iCQl7IFJUT0tFTignLycpO30KKzxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJSIJCXsgUlRPS0VOKCclJyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8IgkJeyBSVE9LRU4oJzwnKTt9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij0iICAgICAgICAgIHsgUlRPS0VOKCc9Jyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ9IgkJCXsgUlRPS0VOKCd9JykgOyB9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+InsiCQkJeyBSVE9LRU4oJ3snKTsgfQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIpIgkJCXsgUlRPS0VOKCcpJyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIoIgkJCXsgUlRPS0VOKCcoJyk7fQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI6IgkJeyBSVE9LRU4oJzonKTsgfQorPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI7IgkJeyBSVE9LRU4oJzsnKTt9Cis8Qk9USCxTQ1JJUFQ+Ik1FTU9SWSIJCXsgUlRPS0VOKE1FTU9SWSk7fQorPEJPVEgsU0NSSVBUPiJPUklHSU4iCQl7IFJUT0tFTihPUklHSU4pO30KKzxCT1RILFNDUklQVD4iVkVSU0lPTiIJCXsgUlRPS0VOKFZFUlNJT05LKTt9Cis8RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQkxPQ0siCQl7IFJUT0tFTihCTE9DSyk7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkJJTkQiCQl7IFJUT0tFTihCSU5EKTt9Cis8Qk9USCxTQ1JJUFQ+IkxFTkdUSCIJCXsgUlRPS0VOKExFTkdUSCk7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkFMSUdOIgkJCXsgUlRPS0VOKEFMSUdOX0spO30KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJBRERSIgkJCXsgUlRPS0VOKEFERFIpO30KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJMT0FEQUREUiIJCXsgUlRPS0VOKExPQURBRERSKTt9Cis8RVhQUkVTU0lPTixCT1RIPiJNQVgiCQkJeyBSVE9LRU4oTUFYX0spOyB9Cis8RVhQUkVTU0lPTixCT1RIPiJNSU4iCQkJeyBSVE9LRU4oTUlOX0spOyB9Cis8RVhQUkVTU0lPTixCT1RIPiJBU1NFUlQiCQl7IFJUT0tFTihBU1NFUlRfSyk7IH0KKzxCT1RILFNDUklQVD4iRU5UUlkiCQkJeyBSVE9LRU4oRU5UUlkpO30KKzxCT1RILFNDUklQVCxNUkk+IkVYVEVSTiIJCXsgUlRPS0VOKEVYVEVSTik7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5FWFQiCQkJeyBSVE9LRU4oTkVYVCk7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+InNpemVvZl9oZWFkZXJzIgl7IFJUT0tFTihTSVpFT0ZfSEVBREVSUyk7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IlNJWkVPRl9IRUFERVJTIgl7IFJUT0tFTihTSVpFT0ZfSEVBREVSUyk7fQorPEJPVEgsU0NSSVBUPiJNQVAiCQkJeyBSVE9LRU4oTUFQKTt9Cis8RVhQUkVTU0lPTixCT1RILFNDUklQVD4iU0laRU9GIgkJeyBSVE9LRU4oU0laRU9GKTt9Cis8Qk9USCxTQ1JJUFQ+IlRBUkdFVCIJCXsgUlRPS0VOKFRBUkdFVF9LKTt9Cis8Qk9USCxTQ1JJUFQ+IlNFQVJDSF9ESVIiCQl7IFJUT0tFTihTRUFSQ0hfRElSKTt9Cis8Qk9USCxTQ1JJUFQ+Ik9VVFBVVCIJCXsgUlRPS0VOKE9VVFBVVCk7fQorPEJPVEgsU0NSSVBUPiJJTlBVVCIJCQl7IFJUT0tFTihJTlBVVCk7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkdST1VQIgkJeyBSVE9LRU4oR1JPVVApO30KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJERUZJTkVEIgkJeyBSVE9LRU4oREVGSU5FRCk7fQorPEJPVEgsU0NSSVBUPiJDUkVBVEVfT0JKRUNUX1NZTUJPTFMiCXsgUlRPS0VOKENSRUFURV9PQkpFQ1RfU1lNQk9MUyk7fQorPEJPVEgsU0NSSVBUPiJDT05TVFJVQ1RPUlMiCQl7IFJUT0tFTiggQ09OU1RSVUNUT1JTKTt9Cis8Qk9USCxTQ1JJUFQ+IkZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OIiB7IFJUT0tFTihGT1JDRV9DT01NT05fQUxMT0NBVElPTik7fQorPEJPVEgsU0NSSVBUPiJTRUNUSU9OUyIJCXsgUlRPS0VOKFNFQ1RJT05TKTt9Cis8Qk9USCxTQ1JJUFQ+IkZJTEwiCQkJeyBSVE9LRU4oRklMTCk7fQorPEJPVEgsU0NSSVBUPiJTVEFSVFVQIgkJeyBSVE9LRU4oU1RBUlRVUCk7fQorPEJPVEgsU0NSSVBUPiJPVVRQVVRfRk9STUFUIgkJeyBSVE9LRU4oT1VUUFVUX0ZPUk1BVCk7fQorPEJPVEgsU0NSSVBUPiJPVVRQVVRfQVJDSCIJCXsgUlRPS0VOKCBPVVRQVVRfQVJDSCk7fQorPEJPVEgsU0NSSVBUPiJITEwiCQkJeyBSVE9LRU4oSExMKTt9Cis8Qk9USCxTQ1JJUFQ+IlNZU0xJQiIJCXsgUlRPS0VOKFNZU0xJQik7fQorPEJPVEgsU0NSSVBUPiJGTE9BVCIJCQl7IFJUT0tFTihGTE9BVCk7fQorPEJPVEgsU0NSSVBUPiJRVUFEIgkJCXsgUlRPS0VOKCBRVUFEKTt9Cis8Qk9USCxTQ1JJUFQ+IlNRVUFEIgkJCXsgUlRPS0VOKCBTUVVBRCk7fQorPEJPVEgsU0NSSVBUPiJMT05HIgkJCXsgUlRPS0VOKCBMT05HKTt9Cis8Qk9USCxTQ1JJUFQ+IlNIT1JUIgkJCXsgUlRPS0VOKCBTSE9SVCk7fQorPEJPVEgsU0NSSVBUPiJCWVRFIgkJCXsgUlRPS0VOKCBCWVRFKTt9Cis8Qk9USCxTQ1JJUFQ+Ik5PRkxPQVQiCQl7IFJUT0tFTihOT0ZMT0FUKTt9Cis8RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTk9DUk9TU1JFRlMiCXsgUlRPS0VOKE5PQ1JPU1NSRUZTKTt9Cis8Qk9USCxTQ1JJUFQ+Ik9WRVJMQVkiCQkJeyBSVE9LRU4oT1ZFUkxBWSk7IH0KKzxCT1RILFNDUklQVD4iU09SVCIJCQl7IFJUT0tFTihTT1JUKTsgfQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5PTE9BRCIJeyBSVE9LRU4oTk9MT0FEKTt9Cis8RVhQUkVTU0lPTixCT1RILFNDUklQVD4iRFNFQ1QiCQl7IFJUT0tFTihEU0VDVCk7fQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkNPUFkiCQl7IFJUT0tFTihDT1BZKTt9Cis8RVhQUkVTU0lPTixCT1RILFNDUklQVD4iSU5GTyIJCXsgUlRPS0VOKElORk8pO30KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJPVkVSTEFZIgl7IFJUT0tFTihPVkVSTEFZKTt9Cis8Qk9USCxTQ1JJUFQ+Im8iCQkJeyBSVE9LRU4oT1JJR0lOKTt9Cis8Qk9USCxTQ1JJUFQ+Im9yZyIJCQl7IFJUT0tFTihPUklHSU4pO30KKzxCT1RILFNDUklQVD4ibCIJCQl7IFJUT0tFTiggTEVOR1RIKTt9Cis8Qk9USCxTQ1JJUFQ+ImxlbiIJCQl7IFJUT0tFTiggTEVOR1RIKTt9Cis8Qk9USCxTQ1JJUFQ+IklOQ0xVREUiCQkJeyBSVE9LRU4oSU5DTFVERSk7fQorPEJPVEgsU0NSSVBUPiJQSERSUyIJCQl7IFJUT0tFTiAoUEhEUlMpOyB9Cis8RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQVQiCQkJeyBSVE9LRU4oQVQpO30KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJQUk9WSURFIgkJeyBSVE9LRU4oUFJPVklERSk7IH0KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJLRUVQIgkJeyBSVE9LRU4oS0VFUCk7IH0KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJFWENMVURFX0ZJTEUiICAgICAgICB7IFJUT0tFTihFWENMVURFX0ZJTEUpOyB9Cis8TVJJPiIjIi4qXG4/CQkJeyArKyBsaW5lbm87IH0KKzxNUkk+IlxuIgkgICAgICAgICAgICAgICAgeyArKyBsaW5lbm87ICBSVE9LRU4oTkVXTElORSk7IH0KKzxNUkk+IioiLioJCQl7IC8qIE1yaSBjb21tZW50IGxpbmUgKi8gfQorPE1SST4iOyIuKgkJCXsgLyogTXJpIGNvbW1lbnQgbGluZSAqLyB9Cis8TVJJPiJFTkQiICAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVORFdPUkQpOyB9Cis8TVJJPiJBTElHTk1PRCIJCXsgUlRPS0VOKEFMSUdOTU9EKTt9Cis8TVJJPiJBTElHTiIJCXsgUlRPS0VOKEFMSUdOX0spO30KKzxNUkk+IkNISVAiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0hJUCk7IH0KKzxNUkk+IkJBU0UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQkFTRSk7IH0KKzxNUkk+IkFMSUFTIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEFMSUFTKTsgfQorPE1SST4iVFJVTkNBVEUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oVFJVTkNBVEUpOyB9Cis8TVJJPiJMT0FEIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExPQUQpOyB9Cis8TVJJPiJQVUJMSUMiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFBVQkxJQyk7IH0KKzxNUkk+Ik9SREVSIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oT1JERVIpOyB9Cis8TVJJPiJOQU1FIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE5BTUVXT1JEKTsgfQorPE1SST4iRk9STUFUIiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihGT1JNQVQpOyB9Cis8TVJJPiJDQVNFIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENBU0UpOyB9Cis8TVJJPiJTVEFSVCIgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFNUQVJUKTsgfQorPE1SST4iTElTVCIuKiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihMSVNUKTsgLyogTElTVCBhbmQgaWdub3JlIHRvIGVuZCBvZiBsaW5lICovIH0KKzxNUkk+IlNFQ1QiCQkJeyBSVE9LRU4oU0VDVCk7IH0KKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULE1SST4iQUJTT0xVVEUiCQkJeyBSVE9LRU4oQUJTT0xVVEUpOyB9Cis8TVJJPiJlbmQiICAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVORFdPUkQpOyB9Cis8TVJJPiJhbGlnbm1vZCIJCXsgUlRPS0VOKEFMSUdOTU9EKTt9Cis8TVJJPiJhbGlnbiIJCXsgUlRPS0VOKEFMSUdOX0spO30KKzxNUkk+ImNoaXAiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0hJUCk7IH0KKzxNUkk+ImJhc2UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQkFTRSk7IH0KKzxNUkk+ImFsaWFzIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEFMSUFTKTsgfQorPE1SST4idHJ1bmNhdGUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oVFJVTkNBVEUpOyB9Cis8TVJJPiJsb2FkIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExPQUQpOyB9Cis8TVJJPiJwdWJsaWMiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFBVQkxJQyk7IH0KKzxNUkk+Im9yZGVyIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oT1JERVIpOyB9Cis8TVJJPiJuYW1lIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE5BTUVXT1JEKTsgfQorPE1SST4iZm9ybWF0IiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihGT1JNQVQpOyB9Cis8TVJJPiJjYXNlIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENBU0UpOyB9Cis8TVJJPiJleHRlcm4iICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVYVEVSTik7IH0KKzxNUkk+InN0YXJ0IiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oU1RBUlQpOyB9Cis8TVJJPiJsaXN0Ii4qICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExJU1QpOyAvKiBMSVNUIGFuZCBpZ25vcmUgdG8gZW5kIG9mIGxpbmUgKi8gfQorPE1SST4ic2VjdCIJCQl7IFJUT0tFTihTRUNUKTsgfQorPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsTVJJPiJhYnNvbHV0ZSIJCQl7IFJUT0tFTihBQlNPTFVURSk7IH0KKworPE1SST57RklMRU5BTUVDSEFSMX17Tk9DRklMRU5BTUVDSEFSfSoJeworLyogRmlsZW5hbWUgd2l0aG91dCBjb21tYXMsIG5lZWRlZCB0byBwYXJzZSBtcmkgc3R1ZmYgKi8KKwkJCQkgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsgCisJCQkJICByZXR1cm4gTkFNRTsKKwkJCQl9CisKKworPEJPVEgsRVhQUkVTU0lPTj57RklMRU5BTUVDSEFSMX17RklMRU5BTUVDSEFSfSoJeworCQkJCSB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyAKKwkJCQkgIHJldHVybiBOQU1FOworCQkJCX0KKzxCT1RILEVYUFJFU1NJT04+Ii1sIntGSUxFTkFNRUNIQVJ9KyB7CisJCQkJICB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyAoeXl0ZXh0ICsgMik7CisJCQkJICByZXR1cm4gTE5BTUU7CisJCQkJfQorPFNDUklQVD57V0lMRENIQVJ9KiB7CisJCS8qIEFubm95aW5nbHksIHRoaXMgcGF0dGVybiBjYW4gbWF0Y2ggY29tbWVudHMsIGFuZCB3ZSBoYXZlCisJCSAgIGxvbmdlc3QgbWF0Y2ggaXNzdWVzIHRvIGNvbnNpZGVyLiAgU28gaWYgdGhlIGZpcnN0IHR3bworCQkgICBjaGFyYWN0ZXJzIGFyZSBhIGNvbW1lbnQgb3BlbmluZywgcHV0IHRoZSBpbnB1dCBiYWNrIGFuZAorCQkgICB0cnkgYWdhaW4uICAqLworCQlpZiAoeXl0ZXh0WzBdID09ICcvJyAmJiB5eXRleHRbMV0gPT0gJyonKQorCQkgIHsKKwkJICAgIHl5bGVzcygyKTsKKwkJICAgIGNvbW1lbnQgKCk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsKKwkJICAgIHJldHVybiBOQU1FOworCQkgIH0KKwl9CisKKzxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULFZFUlNfTk9ERT4iXCIiW15cIl0qIlwiIiB7CisJCQkJCS8qIE5vIG1hdHRlciB0aGUgc3RhdGUsIHF1b3RlcworCQkJCQkgICBnaXZlIHdoYXQncyBpbnNpZGUgKi8KKwkJCQkJeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KzEpOworCQkJCQl5eWx2YWwubmFtZVt5eWxlbmctMl0gPSAwOworCQkJCQlyZXR1cm4gTkFNRTsKKwkJCQl9Cis8Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTj4iXG4iCQl7IGxpbmVubysrO30KKzxNUkksQk9USCxTQ1JJUFQsRVhQUkVTU0lPTj5bIFx0XHJdKwl7IH0KKworPFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bOiw7XQl7IHJldHVybiAqeXl0ZXh0OyB9CisKKzxWRVJTX05PREU+Z2xvYmFsCQl7IFJUT0tFTihHTE9CQUwpOyB9CisKKzxWRVJTX05PREU+bG9jYWwJCXsgUlRPS0VOKExPQ0FMKTsgfQorCis8VkVSU19OT0RFPmV4dGVybgkJeyBSVE9LRU4oRVhURVJOKTsgfQorCis8VkVSU19OT0RFPntWX0lERU5USUZJRVJ9CXsgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcgKHl5dGV4dCk7CisJCQkJICByZXR1cm4gVkVSU19JREVOVElGSUVSOyB9CisKKzxWRVJTX1NDUklQVD57Vl9UQUd9CQl7IHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nICh5eXRleHQpOworCQkJCSAgcmV0dXJuIFZFUlNfVEFHOyB9CisKKzxWRVJTX1NUQVJUPiJ7IgkJCXsgQkVHSU4oVkVSU19TQ1JJUFQpOyByZXR1cm4gKnl5dGV4dDsgfQorCis8VkVSU19TQ1JJUFQ+InsiCQl7IEJFR0lOKFZFUlNfTk9ERSk7IAorCQkJCSAgdmVyc19ub2RlX25lc3RpbmcgPSAwOworCQkJCSAgcmV0dXJuICp5eXRleHQ7CisJCQkJfQorPFZFUlNfU0NSSVBUPiJ9IgkJeyByZXR1cm4gKnl5dGV4dDsgfQorPFZFUlNfTk9ERT4ieyIJCQl7IHZlcnNfbm9kZV9uZXN0aW5nKys7IHJldHVybiAqeXl0ZXh0OyB9Cis8VkVSU19OT0RFPiJ9IgkJCXsgaWYgKC0tdmVyc19ub2RlX25lc3RpbmcgPCAwKQorCQkJCSAgICBCRUdJTihWRVJTX1NDUklQVCk7CisJCQkJICByZXR1cm4gKnl5dGV4dDsKKwkJCQl9CisKKzxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bXG5dCQl7IGxpbmVubysrOyB9CisKKzxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD4jLioJCXsgLyogRWF0IHVwIGNvbW1lbnRzICovIH0KKworPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPlsgXHRccl0rICAgCXsgLyogRWF0IHVwIHdoaXRlc3BhY2UgKi8gfQorCis8PEVPRj4+IHsKKyAgaW5jbHVkZV9zdGFja19wdHItLTsKKyAgICAKKyAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID09IDApIAorICB7CisgICAgeXl0ZXJtaW5hdGUoKTsKKyAgfQorICBlbHNlIAorICB7CisgICAgeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsdWRlX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSk7CisKKyAgfQorICBCRUdJTihTQ1JJUFQpOworICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUgPSBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHIgLSAxXTsKKyAgbGluZW5vID0gbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyIC0gMV07CisKKyAgcmV0dXJuIEVORDsKK30KKworPFNDUklQVCxNUkksVkVSU19TVEFSVCxWRVJTX1NDUklQVCxWRVJTX05PREU+LglsZXhfd2Fybl9pbnZhbGlkKCIgaW4gc2NyaXB0IiwgeXl0ZXh0KTsKKzxFWFBSRVNTSU9OLERFRlNZTUVYUCxCT1RIPi4JbGV4X3dhcm5faW52YWxpZCgiIGluIGV4cHJlc3Npb24iLCB5eXRleHQpOworICAgIAorJSUKKwwKKworLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBzY3JpcHQgZmlsZSBOQU1FLCBvcGVuIG9uIEZJTEUsCisgICBzYXZpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW5mbyBvbiB0aGUgaW5jbHVkZSBzdGFjay4gICovCisKK3ZvaWQKK2xleF9wdXNoX2ZpbGUgKGZpbGUsIG5hbWUpCisgICAgIEZJTEUgKmZpbGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGlmIChpbmNsdWRlX3N0YWNrX3B0ciA+PSBNQVhfSU5DTFVERV9ERVBUSCkgCisgICAgeworICAgICAgZWluZm8oIiVGOmluY2x1ZGVzIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKKyAgICB9CisgIGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBuYW1lOworICBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gMTsKKyAgaW5jbHVkZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBZWV9DVVJSRU5UX0JVRkZFUjsKKworICBpbmNsdWRlX3N0YWNrX3B0cisrOworICB5eWluID0gZmlsZTsKKyAgeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7CisgIEJFR0lOIChTQ1JJUFQpOworfQorCisvKiBSZXR1cm4gYSBuZXdseSBjcmVhdGVkIGZsZXggaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgU1RSSU5HLAorICAgd2hpY2ggaXMgU0laRSBieXRlcyBsb25nLiAgKi8KKworc3RhdGljIFlZX0JVRkZFUl9TVEFURSAKK3l5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHNpemUpCisgICAgIENPTlNUIGNoYXIgKnN0cmluZzsKKyAgICAgc2l6ZV90IHNpemU7Cit7CisgIFlZX0JVRkZFUl9TVEFURSBiOworCisgIC8qIENhbGxzIHRvIG0tYWxsb2MgZ2V0IHR1cm5lZCBieSBzZWQgaW50byB4bS1hbGxvYy4gICovCisgIGIgPSAoWVlfQlVGRkVSX1NUQVRFKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSkpOworICBiLT55eV9pbnB1dF9maWxlID0gMDsKKyAgYi0+eXlfYnVmX3NpemUgPSBzaXplOworCisgIC8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKKyAgICAgd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICAqLworICBiLT55eV9jaF9idWYgPSAoY2hhciAqKSBtYWxsb2MgKCh1bnNpZ25lZCkgKGItPnl5X2J1Zl9zaXplICsgMykpOworCisgIGItPnl5X2NoX2J1ZlswXSA9ICdcbic7CisgIHN0cmNweSAoYi0+eXlfY2hfYnVmKzEsIHN0cmluZyk7CisgIGItPnl5X2NoX2J1ZltzaXplKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworICBiLT55eV9jaF9idWZbc2l6ZSsyXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKyAgYi0+eXlfbl9jaGFycyA9IHNpemUrMTsKKyAgYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMV07CisKKyAgLyogZmxleCAyLjQuNyBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UuICBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSB1c2luZworICAgICBhIGZsZXggaW50ZXJuYWwgaW50ZXJmYWNlIGluIHRoZSBmaXJzdCBwbGFjZSEgICovCisjaWZkZWYgWVlfQlVGRkVSX05FVworICBiLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKyNlbHNlCisgIGItPnl5X2VvZl9zdGF0dXMgPSBFT0ZfTk9UX1NFRU47CisjZW5kaWYKKworICByZXR1cm4gYjsKK30KKworLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBmcm9tIFNUUklORywgc2F2aW5nIHRoZSBjdXJyZW50IGlucHV0IGluZm8KKyAgIG9uIHRoZSBpbmNsdWRlIHN0YWNrLiAgKi8KKwordm9pZAorbGV4X3JlZGlyZWN0IChzdHJpbmcpCisgICAgIENPTlNUIGNoYXIgKnN0cmluZzsKK3sKKyAgWVlfQlVGRkVSX1NUQVRFIHRtcDsKKworICB5eV9pbml0ID0gMDsKKyAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID49IE1BWF9JTkNMVURFX0RFUFRIKSAKKyAgICB7CisgICAgICBlaW5mbygiJUY6IG1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7CisgICAgfQorICBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gInJlZGlyZWN0IjsKKyAgbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IDA7CisgIGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisgIGluY2x1ZGVfc3RhY2tfcHRyKys7CisgIHRtcCA9IHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSk7CisgIHl5X3N3aXRjaF90b19idWZmZXIgKHRtcCk7CisgIEJFR0lOIChTQ1JJUFQpOworfQorDAorLyogRnVuY3Rpb25zIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBmbGV4IHN0YXJ0IGNvbmRpdGlvbiwKKyAgIHNhdmluZyB0aGUgY3VycmVudCBzdGFydCBjb25kaXRpb24gb24gYHN0YXRlX3N0YWNrJy4gICovCisKK3N0YXRpYyBpbnQgc3RhdGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEggKiAyXTsKK3N0YXRpYyBpbnQgKnN0YXRlX3N0YWNrX3AgPSBzdGF0ZV9zdGFjazsKKwordm9pZAorbGRsZXhfc2NyaXB0ICgpCit7CisgICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OworICBCRUdJTiAoU0NSSVBUKTsKK30KKwordm9pZAorbGRsZXhfbXJpX3NjcmlwdCAoKQoreworICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKKyAgQkVHSU4gKE1SSSk7Cit9CisKK3ZvaWQKK2xkbGV4X3ZlcnNpb25fc2NyaXB0ICgpCit7CisgICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OworICBCRUdJTiAoVkVSU19TVEFSVCk7Cit9CisKK3ZvaWQKK2xkbGV4X3ZlcnNpb25fZmlsZSAoKQoreworICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKKyAgQkVHSU4gKFZFUlNfU0NSSVBUKTsKK30KKwordm9pZAorbGRsZXhfZGVmc3ltICgpCit7CisgICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OworICBCRUdJTiAoREVGU1lNRVhQKTsKK30KKwkgICAKK3ZvaWQKK2xkbGV4X2V4cHJlc3Npb24gKCkKK3sKKyAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7CisgIEJFR0lOIChFWFBSRVNTSU9OKTsKK30KKwordm9pZAorbGRsZXhfYm90aCAoKQoreworICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKKyAgQkVHSU4gKEJPVEgpOworfQorCit2b2lkCitsZGxleF9wb3BzdGF0ZSAoKQoreworICB5eV9zdGFydCA9ICooLS1zdGF0ZV9zdGFja19wKTsKK30KKwwKKworLyogUGxhY2UgdXAgdG8gTUFYX1NJWkUgY2hhcmFjdGVycyBpbiBCVUYgYW5kIHJldHVybiBpbiAqUkVTVUxUCisgICBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIDAgdG8gaW5kaWNhdGUgRU9GLiAgKi8KKworc3RhdGljIHZvaWQKK3l5X2lucHV0IChidWYsIHJlc3VsdCwgbWF4X3NpemUpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50ICpyZXN1bHQ7CisgICAgIGludCBtYXhfc2l6ZTsKK3sKKyAgKnJlc3VsdCA9IDA7IAorICBpZiAoeXlfY3VycmVudF9idWZmZXItPnl5X2lucHV0X2ZpbGUpCisgICAgeworICAgICAgaWYgKHl5aW4pCisJeworCSAgKnJlc3VsdCA9IHJlYWQgKGZpbGVubyAoeXlpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUpOworCSAgaWYgKCpyZXN1bHQgPCAwKSAKKwkgICAgZWluZm8gKCIlRiVQOiByZWFkIGluIGZsZXggc2Nhbm5lciBmYWlsZWRcbiIpOworCX0KKyAgICB9Cit9CisKKy8qIEVhdCB0aGUgcmVzdCBvZiBhIEMtc3R5bGUgY29tbWVudC4gICovCisKK3N0YXRpYyB2b2lkCitjb21tZW50ICgpCit7CisgIGludCBjOworCisgIHdoaWxlICgxKQorICB7CisgICAgYyA9IGlucHV0KCk7CisgICAgd2hpbGUgKGMgIT0gJyonICYmIGMgIT0gRU9GKSAKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXG4nKQorCWxpbmVubysrOworICAgICAgYyA9IGlucHV0KCk7CisgICAgfQorCisgICAgaWYgKGMgPT0gJyonKQorICAgIHsKKyAgICAgIGMgPSBpbnB1dCgpOworICAgICAgd2hpbGUgKGMgPT0gJyonKQorICAgICAgIGMgPSBpbnB1dCgpOworICAgICAgaWYgKGMgPT0gJy8nKQorICAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHRoZSBlbmQgKi8KKyAgICB9CisKKyAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgbGluZW5vKys7CisKKyAgICBpZiAoYyA9PSBFT0YpCisgICAgeworICAgICAgZWluZm8oICIlRiVQOiBFT0YgaW4gY29tbWVudFxuIik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLyogV2FybiB0aGUgdXNlciBhYm91dCBhIGdhcmJhZ2UgY2hhcmFjdGVyIFdIQVQgaW4gdGhlIGlucHV0CisgICBpbiBjb250ZXh0IFdIRVJFLiAgKi8KKworc3RhdGljIHZvaWQKK2xleF93YXJuX2ludmFsaWQgKHdoZXJlLCB3aGF0KQorICAgICBjaGFyICp3aGVyZSwgKndoYXQ7Cit7CisgIGNoYXIgYnVmWzVdOworCisgIC8qIElmIHdlIGhhdmUgZm91bmQgYW4gaW5wdXQgZmlsZSB3aG9zZSBmb3JtYXQgd2UgZG8gbm90IHJlY29nbml6ZSwKKyAgICAgYW5kIHdlIGFyZSB0aGVyZWZvcmUgdHJlYXRpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LCBhbmQgd2UgZmluZAorICAgICBhbiBpbnZhbGlkIGNoYXJhY3RlciwgdGhlbiBtb3N0IGxpa2VseSB0aGlzIGlzIGEgcmVhbCBvYmplY3QgZmlsZQorICAgICBvZiBzb21lIGRpZmZlcmVudCBmb3JtYXQuICBUcmVhdCBpdCBhcyBzdWNoLiAgKi8KKyAgaWYgKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7CisgICAgICBlaW5mbyAoIiVGJXM6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iLCBsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOworICAgIH0KKworICBpZiAoISBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgKndoYXQpKQorICAgIHsKKyAgICAgIHNwcmludGYgKGJ1ZiwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpICp3aGF0KTsKKyAgICAgIHdoYXQgPSBidWY7CisgICAgfQorCisgIGVpbmZvICgiJVA6JVM6IGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyIGAlcyclc1xuIiwgd2hhdCwgd2hlcmUpOworfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmMgYi9sZC9sZG1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTcxMGRiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRtYWluLmMKQEAgLTAsMCArMSwxMzAwIEBACisvKiBNYWluIHByb2dyYW0gb2YgR05VIGxpbmtlci4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK0dMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorI2luY2x1ZGUgImxkd3JpdGUuaCIKKyNpbmNsdWRlICJsZGdyYW0uaCIKKyNpbmNsdWRlICJsZGV4cC5oIgorI2luY2x1ZGUgImxkbGFuZy5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkbGV4LmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRjdG9yLmgiCisKKy8qIFNvbWV3aGVyZSBhYm92ZSwgc3lzL3N0YXQuaCBnb3QgaW5jbHVkZWQgLiAuIC4gLiAqLworI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKKyNkZWZpbmUJU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX1NCUksKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKK2V4dGVybiBQVFIgc2JyayAoKTsKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBjaGFyICpnZXRfZW11bGF0aW9uIFBBUkFNUyAoKGludCwgY2hhciAqKikpOworc3RhdGljIHZvaWQgc2V0X3NjcmlwdHNfZGlyIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRVhQT1JUUyAqLworCitjaGFyICpkZWZhdWx0X3RhcmdldDsKK2NvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZSA9ICJhLm91dCI7CisKKy8qIE5hbWUgdGhpcyBwcm9ncmFtIHdhcyBpbnZva2VkIGJ5LiAgKi8KK2NoYXIgKnByb2dyYW1fbmFtZTsKKworLyogVGhlIGZpbGUgdGhhdCB3ZSdyZSBjcmVhdGluZyAqLworYmZkICpvdXRwdXRfYmZkID0gMDsKKworLyogU2V0IGJ5IC1HIGFyZ3VtZW50LCBmb3IgTUlQUyBFQ09GRiB0YXJnZXQuICAqLworaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKKworLyogTm9uemVybyBtZWFucyBwcmludCBuYW1lcyBvZiBpbnB1dCBmaWxlcyBhcyBwcm9jZXNzZWQuICAqLworYm9vbGVhbiB0cmFjZV9maWxlczsKKworLyogTm9uemVybyBtZWFucyBzYW1lLCBidXQgbm90ZSBvcGVuIGZhaWx1cmVzLCB0b28uICAqLworYm9vbGVhbiB0cmFjZV9maWxlX3RyaWVzOworCisvKiBOb256ZXJvIG1lYW5zIHZlcnNpb24gbnVtYmVyIHdhcyBwcmludGVkLCBzbyBleGl0IHN1Y2Nlc3NmdWxseQorICAgaW5zdGVhZCBvZiBjb21wbGFpbmluZyBpZiBubyBpbnB1dCBmaWxlcyBhcmUgZ2l2ZW4uICAqLworYm9vbGVhbiB2ZXJzaW9uX3ByaW50ZWQ7CisKKy8qIE5vbnplcm8gbWVhbnMgbGluayBpbiBldmVyeSBtZW1iZXIgb2YgYW4gYXJjaGl2ZS4gICovCitib29sZWFuIHdob2xlX2FyY2hpdmU7CisKKy8qIFRydWUgaWYgd2Ugc2hvdWxkIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcy4gICovCitib29sZWFuIGRlbWFuZ2xpbmc7CisKK2FyZ3NfdHlwZSBjb21tYW5kX2xpbmU7CisKK2xkX2NvbmZpZ190eXBlIGNvbmZpZzsKKworc3RhdGljIHZvaWQgcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYm9vbGVhbiBjaGVja19mb3Jfc2NyaXB0c19kaXIgUEFSQU1TICgoY2hhciAqZGlyKSk7CitzdGF0aWMgYm9vbGVhbiBhZGRfYXJjaGl2ZV9lbGVtZW50IFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAorCQkJCQkgICAgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgYm9vbGVhbiBtdWx0aXBsZV9kZWZpbml0aW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSAgICBjb25zdCBjaGFyICosCisJCQkJCSAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwKKwkJCQkJICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBtdWx0aXBsZV9jb21tb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJY29uc3QgY2hhciAqLCBiZmQgKiwKKwkJCQkJZW51bSBiZmRfbGlua19oYXNoX3R5cGUsIGJmZF92bWEsCisJCQkJCWJmZCAqLCBlbnVtIGJmZF9saW5rX2hhc2hfdHlwZSwKKwkJCQkJYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gYWRkX3RvX3NldCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosCisJCQkJICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAorCQkJCSAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiBjb25zdHJ1Y3Rvcl9jYWxsYmFjayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkgICAgIGJvb2xlYW4gY29uc3RydWN0b3IsCisJCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gd2FybmluZ19jYWxsYmFjayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAorCQkJCQkgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGJmZCAqLAorCQkJCQkgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOworc3RhdGljIHZvaWQgd2FybmluZ19maW5kX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKK3N0YXRpYyBib29sZWFuIHVuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKKwkJCQkJIGNvbnN0IGNoYXIgKiwgYmZkICosCisJCQkJCSBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiByZWxvY19vdmVyZmxvdyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwKKwkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKK3N0YXRpYyBib29sZWFuIHJlbG9jX2Rhbmdlcm91cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCisJCQkJCWJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7CitzdGF0aWMgYm9vbGVhbiB1bmF0dGFjaGVkX3JlbG9jIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCisJCQkJCSBjb25zdCBjaGFyICosIGJmZCAqLCBhc2VjdGlvbiAqLAorCQkJCQkgYmZkX3ZtYSkpOworc3RhdGljIGJvb2xlYW4gbm90aWNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKKwkJCSAgICAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOworCitzdGF0aWMgc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyBsaW5rX2NhbGxiYWNrcyA9Cit7CisgIGFkZF9hcmNoaXZlX2VsZW1lbnQsCisgIG11bHRpcGxlX2RlZmluaXRpb24sCisgIG11bHRpcGxlX2NvbW1vbiwKKyAgYWRkX3RvX3NldCwKKyAgY29uc3RydWN0b3JfY2FsbGJhY2ssCisgIHdhcm5pbmdfY2FsbGJhY2ssCisgIHVuZGVmaW5lZF9zeW1ib2wsCisgIHJlbG9jX292ZXJmbG93LAorICByZWxvY19kYW5nZXJvdXMsCisgIHVuYXR0YWNoZWRfcmVsb2MsCisgIG5vdGljZQorfTsKKworc3RydWN0IGJmZF9saW5rX2luZm8gbGlua19pbmZvOworDAorc3RhdGljIHZvaWQKK3JlbW92ZV9vdXRwdXQgKCkKK3sKKyAgaWYgKG91dHB1dF9maWxlbmFtZSkgCisgICAgeworICAgICAgaWYgKG91dHB1dF9iZmQgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0pCisJZmNsb3NlKChGSUxFICopKG91dHB1dF9iZmQtPmlvc3RyZWFtKSk7CisgICAgICBpZiAoZGVsZXRlX291dHB1dF9maWxlX29uX2ZhaWx1cmUpCisJdW5saW5rIChvdXRwdXRfZmlsZW5hbWUpOworICAgIH0KK30KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGNoYXIgKmVtdWxhdGlvbjsKKyAgbG9uZyBzdGFydF90aW1lID0gZ2V0X3J1bl90aW1lICgpOworCisjaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCisgIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKKyNlbmRpZgorICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKyAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOworCisgIGJmZF9pbml0ICgpOworCisgIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOworCisgIHhhdGV4aXQgKHJlbW92ZV9vdXRwdXQpOworCisgIC8qIFNldCB0aGUgZGVmYXVsdCBCRkQgdGFyZ2V0IGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHRhcmdldC4gIERvaW5nCisgICAgIHRoaXMgcGVybWl0cyB0aGUgbGlua2VyIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQsCisgICAgIGFuZCBsaW5rZWQgYWdhaW5zdCBhIHNoYXJlZCBCRkQgbGlicmFyeSB3aGljaCB3YXMgY29uZmlndXJlZCBmb3IKKyAgICAgYSBkaWZmZXJlbnQgdGFyZ2V0LiAgVGhlIG1hY3JvIFRBUkdFVCBpcyBkZWZpbmVkIGJ5IE1ha2VmaWxlLiAgKi8KKyAgaWYgKCEgYmZkX3NldF9kZWZhdWx0X3RhcmdldCAoVEFSR0VUKSkKKyAgICB7CisgICAgICBlaW5mbyAoXygiJVglUDogY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlRVxuIiksIFRBUkdFVCk7CisgICAgICB4ZXhpdCAoMSk7CisgICAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIGRhdGEgYWJvdXQgb3B0aW9ucy4gICovCisgIHRyYWNlX2ZpbGVzID0gdHJhY2VfZmlsZV90cmllcyA9IHZlcnNpb25fcHJpbnRlZCA9IGZhbHNlOworICB3aG9sZV9hcmNoaXZlID0gZmFsc2U7CisgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSB0cnVlOworICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7CisgIGNvbmZpZy5oYXNfc2hhcmVkID0gZmFsc2U7CisgIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IGZhbHNlOworICBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgPSBOVUxMOworICBjb21tYW5kX2xpbmUucnBhdGggPSBOVUxMOworICBjb21tYW5kX2xpbmUud2Fybl9taXNtYXRjaCA9IHRydWU7CisgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IHRydWU7CisKKyAgLyogV2UgaW5pdGlhbGl6ZSBERU1BTkdMSU5HIGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICBDT0xMRUNUX05PX0RFTUFOR0xFLiAgVGhlIGdjYyBjb2xsZWN0MiBwcm9ncmFtIHdpbGwgZGVtYW5nbGUgdGhlCisgICAgIG91dHB1dCBvZiB0aGUgbGlua2VyLCB1bmxlc3MgQ09MTEVDVF9OT19ERU1BTkdMRSBpcyBzZXQgaW4gdGhlCisgICAgIGVudmlyb25tZW50LiAgQWN0aW5nIHRoZSBzYW1lIHdheSBoZXJlIGxldHMgdXMgcHJvdmlkZSB0aGUgc2FtZQorICAgICBpbnRlcmZhY2UgYnkgZGVmYXVsdC4gICovCisgIGRlbWFuZ2xpbmcgPSBnZXRlbnYgKCJDT0xMRUNUX05PX0RFTUFOR0xFIikgPT0gTlVMTDsKKworICBsaW5rX2luZm8uY2FsbGJhY2tzID0gJmxpbmtfY2FsbGJhY2tzOworICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gZmFsc2U7CisgIGxpbmtfaW5mby5zaGFyZWQgPSBmYWxzZTsKKyAgbGlua19pbmZvLnN5bWJvbGljID0gZmFsc2U7CisgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOworICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gZmFsc2U7CisgIGxpbmtfaW5mby5vcHRpbWl6ZSA9IGZhbHNlOworICBsaW5rX2luZm8ubm9fdW5kZWZpbmVkID0gZmFsc2U7CisgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX25vbmU7CisgIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9ub25lOworICBsaW5rX2luZm8ua2VlcF9tZW1vcnkgPSB0cnVlOworICBsaW5rX2luZm8uaW5wdXRfYmZkcyA9IE5VTEw7CisgIGxpbmtfaW5mby5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiA9IE5VTEw7CisgIGxpbmtfaW5mby5oYXNoID0gTlVMTDsKKyAgbGlua19pbmZvLmtlZXBfaGFzaCA9IE5VTEw7CisgIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gZmFsc2U7CisgIGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9IE5VTEw7CisgIGxpbmtfaW5mby53cmFwX2hhc2ggPSBOVUxMOworICBsaW5rX2luZm8ubXBjODYwYzAgPSAwOworICAKKyAgbGRmaWxlX2FkZF9hcmNoICgiIik7CisKKyAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IHRydWU7CisgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOworICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gdHJ1ZTsKKyAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gdHJ1ZTsKKyAgY29uZmlnLm1ha2VfZXhlY3V0YWJsZSA9IHRydWU7CisKKyAgZW11bGF0aW9uID0gZ2V0X2VtdWxhdGlvbiAoYXJnYywgYXJndik7CisgIGxkZW11bF9jaG9vc2VfbW9kZSAoZW11bGF0aW9uKTsKKyAgZGVmYXVsdF90YXJnZXQgPSBsZGVtdWxfY2hvb3NlX3RhcmdldCAoKTsKKyAgbGFuZ19pbml0ICgpOworICBsZGVtdWxfYmVmb3JlX3BhcnNlICgpOworICBsYW5nX2hhc19pbnB1dF9maWxlID0gZmFsc2U7CisgIHBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpOworCisgIGxkZW11bF9zZXRfc3ltYm9scyAoKTsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKKyAgICB7CisgICAgICBpZiAoY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zKQorCWVpbmZvICgiJVAlRjogLS1nYy1zZWN0aW9ucyBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKTsKKyAgICAgIGlmIChsaW5rX2luZm8ubXBjODYwYzApCisJZWluZm8gKF8oIiVQJUY6IC1yIGFuZCAtLW1wYzg2MGMwIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIikpOworICAgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLnJlbGF4KQorCWVpbmZvIChfKCIlUCVGOiAtLXJlbGF4IGFuZCAtciBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKKyAgICAgIGlmIChsaW5rX2luZm8uc2hhcmVkKQorCWVpbmZvIChfKCIlUCVGOiAtciBhbmQgLXNoYXJlZCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKKyAgICB9CisKKyAgLyogVHJlYXQgbGQgLXIgLXMgYXMgbGQgLXIgLVMgLXggKGkuZS4sIHN0cmlwIGFsbCBsb2NhbCBzeW1ib2xzKS4gIEkKKyAgICAgZG9uJ3Qgc2VlIGhvdyBlbHNlIHRoaXMgY2FuIGJlIGhhbmRsZWQsIHNpbmNlIGluIHRoaXMgY2FzZSB3ZQorICAgICBtdXN0IHByZXNlcnZlIGFsbCBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9scy4gICovCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9hbGwpCisgICAgeworICAgICAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfZGVidWdnZXI7CisgICAgICBpZiAobGlua19pbmZvLmRpc2NhcmQgPT0gZGlzY2FyZF9ub25lKQorCWxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9hbGw7CisgICAgfQorCisgIC8qIFRoaXMgZXNzZW50aWFsbHkgYWRkcyBhbm90aGVyIC1MIGRpcmVjdG9yeSBzbyB0aGlzIG11c3QgYmUgZG9uZSBhZnRlcgorICAgICB0aGUgLUwncyBpbiBhcmd2IGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLworICBzZXRfc2NyaXB0c19kaXIgKCk7CisKKyAgaWYgKGhhZF9zY3JpcHQgPT0gZmFsc2UpCisgICAgeworICAgICAgLyogUmVhZCB0aGUgZW11bGF0aW9uJ3MgYXBwcm9wcmlhdGUgZGVmYXVsdCBzY3JpcHQuICAqLworICAgICAgaW50IGlzZmlsZTsKKyAgICAgIGNoYXIgKnMgPSBsZGVtdWxfZ2V0X3NjcmlwdCAoJmlzZmlsZSk7CisKKyAgICAgIGlmIChpc2ZpbGUpCisJbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChzKTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAodHJhY2VfZmlsZV90cmllcykKKwkgICAgeworCSAgICAgIGluZm9fbXNnIChfKCJ1c2luZyBpbnRlcm5hbCBsaW5rZXIgc2NyaXB0OlxuIikpOworCSAgICAgIGluZm9fbXNnICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCSAgICAgIGluZm9fbXNnIChzKTsKKwkgICAgICBpbmZvX21zZyAoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCSAgICB9CisJICBsZXhfc3RyaW5nID0gczsKKwkgIGxleF9yZWRpcmVjdCAocyk7CisJfQorICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2NyaXB0OworICAgICAgeXlwYXJzZSAoKTsKKyAgICAgIGxleF9zdHJpbmcgPSBOVUxMOworICAgIH0KKworICBsYW5nX2ZpbmFsICgpOworCisgIGlmIChsYW5nX2hhc19pbnB1dF9maWxlID09IGZhbHNlKQorICAgIHsKKyAgICAgIGlmICh2ZXJzaW9uX3ByaW50ZWQpCisJeGV4aXQgKDApOworICAgICAgZWluZm8gKF8oIiVQJUY6IG5vIGlucHV0IGZpbGVzXG4iKSk7CisgICAgfQorCisgIGlmICh0cmFjZV9maWxlcykKKyAgICB7CisgICAgICBpbmZvX21zZyAoXygiJVA6IG1vZGUgJXNcbiIpLCBlbXVsYXRpb24pOworICAgIH0KKworICBsZGVtdWxfYWZ0ZXJfcGFyc2UgKCk7CisKKworICBpZiAoY29uZmlnLm1hcF9maWxlbmFtZSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChjb25maWcubWFwX2ZpbGVuYW1lLCAiLSIpID09IDApCisJeworCSAgY29uZmlnLm1hcF9maWxlID0gc3Rkb3V0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25maWcubWFwX2ZpbGUgPSBmb3BlbiAoY29uZmlnLm1hcF9maWxlbmFtZSwgRk9QRU5fV1QpOworCSAgaWYgKGNvbmZpZy5tYXBfZmlsZSA9PSAoRklMRSAqKSBOVUxMKQorCSAgICB7CisJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKKwkgICAgICBlaW5mbyAoXygiJVAlRjogY2Fubm90IG9wZW4gbWFwIGZpbGUgJXM6ICVFXG4iKSwKKwkJICAgICBjb25maWcubWFwX2ZpbGVuYW1lKTsKKwkgICAgfQorCX0KKyAgICB9CisKKworICBsYW5nX3Byb2Nlc3MgKCk7CisKKyAgLyogUHJpbnQgZXJyb3IgbWVzc2FnZXMgZm9yIGFueSBtaXNzaW5nIHN5bWJvbHMsIGZvciBhbnkgd2FybmluZworICAgICBzeW1ib2xzLCBhbmQgcG9zc2libHkgbXVsdGlwbGUgZGVmaW5pdGlvbnMgKi8KKworCisgIGlmIChjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgeworICAgICAgLyogTG9vayBmb3IgYSB0ZXh0IHNlY3Rpb24gYW5kIG1hcmsgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBpdCAqLworICAgICAgYXNlY3Rpb24gKmZvdW5kID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIudGV4dCIpOworCisgICAgICBpZiAoZm91bmQgIT0gKGFzZWN0aW9uICopIE5VTEwpCisJeworCSAgZm91bmQtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKKwl9CisgICAgfQorCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQorICAgIG91dHB1dF9iZmQtPmZsYWdzICY9IH5FWEVDX1A7CisgIGVsc2UKKyAgICBvdXRwdXRfYmZkLT5mbGFncyB8PSBFWEVDX1A7CisKKyAgbGR3cml0ZSAoKTsKKworICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCisgICAgbGFuZ19tYXAgKCk7CisgIGlmIChjb21tYW5kX2xpbmUuY3JlZikKKyAgICBvdXRwdXRfY3JlZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwgPyBjb25maWcubWFwX2ZpbGUgOiBzdGRvdXQpOworICBpZiAobm9jcm9zc3JlZl9saXN0ICE9IE5VTEwpCisgICAgY2hlY2tfbm9jcm9zc3JlZnMgKCk7CisKKyAgLyogRXZlbiBpZiB3ZSdyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgc29tZSBub24tZmF0YWwgZXJyb3JzIHNob3VsZAorICAgICBiZSByZXBvcnRlZCBpbiB0aGUgZXhpdCBzdGF0dXMuICAoV2hhdCBub24tZmF0YWwgZXJyb3JzLCBpZiBhbnksIGRvIHdlCisgICAgIHdhbnQgdG8gaWdub3JlIGZvciByZWxvY2F0ZWFibGUgb3V0cHV0PykgICovCisKKyAgaWYgKGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPT0gZmFsc2UgJiYgZm9yY2VfbWFrZV9leGVjdXRhYmxlID09IGZhbHNlKQorICAgIHsKKyAgICAgIGlmICh0cmFjZV9maWxlcyA9PSB0cnVlKQorCXsKKwkgIGVpbmZvIChfKCIlUDogbGluayBlcnJvcnMgZm91bmQsIGRlbGV0aW5nIGV4ZWN1dGFibGUgYCVzJ1xuIiksCisJCSBvdXRwdXRfZmlsZW5hbWUpOworCX0KKworICAgICAgLyogVGhlIGZpbGUgd2lsbCBiZSByZW1vdmVkIGJ5IHJlbW92ZV9vdXRwdXQuICAqLworCisgICAgICB4ZXhpdCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCEgYmZkX2Nsb3NlIChvdXRwdXRfYmZkKSkKKwllaW5mbyAoXygiJUYlQjogZmluYWwgY2xvc2UgZmFpbGVkOiAlRVxuIiksIG91dHB1dF9iZmQpOworCisgICAgICAvKiBJZiB0aGUgLS1mb3JjZS1leGUtc3VmZml4IGlzIGVuYWJsZWQsIGFuZCB3ZSdyZSBtYWtpbmcgYW4KKwkgZXhlY3V0YWJsZSBmaWxlIGFuZCBpdCBkb2Vzbid0IGVuZCBpbiAuZXhlLCBjb3B5IGl0IHRvIG9uZSB3aGljaCBkb2VzLiAqLworCisgICAgICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlICYmIGNvbW1hbmRfbGluZS5mb3JjZV9leGVfc3VmZml4KQorCXsKKwkgIGludCBsZW4gPSBzdHJsZW4gKG91dHB1dF9maWxlbmFtZSk7CisJICBpZiAobGVuIDwgNCAKKwkgICAgICB8fCAoc3RyY2FzZWNtcCAob3V0cHV0X2ZpbGVuYW1lICsgbGVuIC0gNCwgIi5leGUiKSAhPSAwCisJCSAgJiYgc3RyY2FzZWNtcCAob3V0cHV0X2ZpbGVuYW1lICsgbGVuIC0gNCwgIi5kbGwiKSAhPSAwKSkKKwkgICAgeworCSAgICAgIEZJTEUgKnNyYzsKKwkgICAgICBGSUxFICpkc3Q7CisJICAgICAgY29uc3QgaW50IGJzaXplID0gNDA5NjsKKwkgICAgICBjaGFyICpidWYgPSB4bWFsbG9jIChic2l6ZSk7CisJICAgICAgaW50IGw7CisJICAgICAgY2hhciAqZHN0X25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKKwkgICAgICBzdHJjcHkgKGRzdF9uYW1lLCBvdXRwdXRfZmlsZW5hbWUpOworCSAgICAgIHN0cmNhdCAoZHN0X25hbWUsICIuZXhlIik7CisJICAgICAgc3JjID0gZm9wZW4gKG91dHB1dF9maWxlbmFtZSwgRk9QRU5fUkIpOworCSAgICAgIGRzdCA9IGZvcGVuIChkc3RfbmFtZSwgRk9QRU5fV0IpOworCisJICAgICAgaWYgKCFzcmMpCisJCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3Igc291cmNlIG9mIGNvcHkgYCVzJ1xuIiksIG91dHB1dF9maWxlbmFtZSk7CisJICAgICAgaWYgKCFkc3QpCisJCWVpbmZvIChfKCIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3IgZGVzdGluYXRpb24gb2YgY29weSBgJXMnXG4iKSwgZHN0X25hbWUpOworCSAgICAgIHdoaWxlICgobCA9IGZyZWFkIChidWYsIDEsIGJzaXplLCBzcmMpKSA+IDApCisJCXsKKwkJICBpbnQgZG9uZSA9IGZ3cml0ZSAoYnVmLCAxLCBsLCBkc3QpOworCQkgIGlmIChkb25lICE9IGwpCisJCSAgICB7CisJCSAgICAgIGVpbmZvIChfKCIlUDogRXJyb3Igd3JpdGluZyBmaWxlIGAlcydcbiIpLCBkc3RfbmFtZSk7CisJCSAgICB9CisJCX0KKwkgICAgICBmY2xvc2UgKHNyYyk7CisJICAgICAgaWYgKGZjbG9zZSAoZHN0KSA9PSBFT0YpCisJCXsKKwkJICBlaW5mbyAoXygiJVA6IEVycm9yIGNsb3NpbmcgZmlsZSBgJXMnXG4iKSwgZHN0X25hbWUpOworCQl9CisJICAgICAgZnJlZSAoZHN0X25hbWUpOworCSAgICAgIGZyZWUgKGJ1Zik7CisJICAgIH0KKwl9CisgICAgfQorCisgIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKKworICBpZiAoY29uZmlnLnN0YXRzKQorICAgIHsKKyNpZmRlZiBIQVZFX1NCUksKKyAgICAgIGNoYXIgKmxpbSA9IChjaGFyICopIHNicmsgKDApOworI2VuZGlmCisgICAgICBsb25nIHJ1bl90aW1lID0gZ2V0X3J1bl90aW1lICgpIC0gc3RhcnRfdGltZTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBsaW5rOiAlbGQuJTA2bGRcbiIpLAorCSAgICAgICBwcm9ncmFtX25hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKKyNpZmRlZiBIQVZFX1NCUksKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRhdGEgc2l6ZSAlbGRcbiIpLCBwcm9ncmFtX25hbWUsCisJICAgICAgIChsb25nKSAobGltIC0gKGNoYXIgKikgJmVudmlyb24pKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBQcmV2ZW50IHJlbW92ZV9vdXRwdXQgZnJvbSBkb2luZyBhbnl0aGluZywgYWZ0ZXIgYSBzdWNjZXNzZnVsIGxpbmsuICAqLworICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOworCisgIHhleGl0ICgwKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdlIG5lZWQgdG8gZmluZCBhbnkgZXhwbGljaXRseSBnaXZlbiBlbXVsYXRpb24gaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUKKyAgIHN0YXRlIHRoYXQncyBuZWVkZWQgYnkgdGhlIGxleCZ5YWNjIGFyZ3VtZW50IHBhcnNlciAocGFyc2VfYXJncykuICAqLworCitzdGF0aWMgY2hhciAqCitnZXRfZW11bGF0aW9uIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGNoYXIgKmVtdWxhdGlvbjsKKyAgaW50IGk7CisKKyAgZW11bGF0aW9uID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7CisgIGlmIChlbXVsYXRpb24gPT0gTlVMTCkKKyAgICBlbXVsYXRpb24gPSBERUZBVUxUX0VNVUxBVElPTjsKKworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmICghc3RybmNtcCAoYXJndltpXSwgIi1tIiwgMikpCisJeworCSAgaWYgKGFyZ3ZbaV1bMl0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIC8qIC1tIEVNVUwgKi8KKwkgICAgICBpZiAoaSA8IGFyZ2MgLSAxKQorCQl7CisJCSAgZW11bGF0aW9uID0gYXJndltpICsgMV07CisJCSAgaSsrOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZWluZm8oXygiJVAlRjogbWlzc2luZyBhcmd1bWVudCB0byAtbVxuIikpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1taXBzMSIpID09IDAKKwkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHMyIikgPT0gMAorCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczMiKSA9PSAwCisJCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzNCIpID09IDApCisJICAgIHsKKwkgICAgICAvKiBGSVhNRTogVGhlIGFyZ3VtZW50cyAtbWlwczEsIC1taXBzMiBhbmQgLW1pcHMzIGFyZQorCQkgcGFzc2VkIHRvIHRoZSBsaW5rZXIgYnkgc29tZSBNSVBTIGNvbXBpbGVycy4gIFRoZXkKKwkJIGdlbmVyYWxseSB0ZWxsIHRoZSBsaW5rZXIgdG8gdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50CisJCSBsaWJyYXJ5IHBhdGguICBQZXJoYXBzIHNvbWVkYXkgdGhlc2Ugc2hvdWxkIGJlCisJCSBpbXBsZW1lbnRlZCBhcyBlbXVsYXRpb25zOyB1bnRpbCB0aGVuLCB3ZSBqdXN0IGlnbm9yZQorCQkgdGhlIGFyZ3VtZW50cyBhbmQgaG9wZSB0aGF0IG5vYm9keSBldmVyIGNyZWF0ZXMKKwkJIGVtdWxhdGlvbnMgbmFtZWQgaXBzMSwgaXBzMiBvciBpcHMzLiAgKi8KKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChhcmd2W2ldLCAiLW00ODYiKSA9PSAwKQorCSAgICB7CisJICAgICAgLyogRklYTUU6IFRoZSBhcmd1bWVudCAtbTQ4NiBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlciBvbgorCQkgc29tZSBMaW51eCBzeXN0ZW1zLiAgSG9wZSB0aGF0IG5vYm9keSBjcmVhdGVzIGFuCisJCSBlbXVsYXRpb24gbmFtZWQgNDg2LiAgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogLW1FTVVMICovCisJICAgICAgZW11bGF0aW9uID0gJmFyZ3ZbaV1bMl07CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBlbXVsYXRpb247Cit9CisKKy8qIElmIGRpcmVjdG9yeSBESVIgY29udGFpbnMgYW4gImxkc2NyaXB0cyIgc3ViZGlyZWN0b3J5LAorICAgYWRkIERJUiB0byB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCBhbmQgcmV0dXJuIHRydWUsCisgICBlbHNlIHJldHVybiBmYWxzZS4gICovCisKK3N0YXRpYyBib29sZWFuCitjaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikKKyAgICAgY2hhciAqZGlyOworeworICBzaXplX3QgZGlybGVuOworICBjaGFyICpidWY7CisgIHN0cnVjdCBzdGF0IHM7CisgIGJvb2xlYW4gcmVzOworCisgIGRpcmxlbiA9IHN0cmxlbiAoZGlyKTsKKyAgLyogc2l6ZW9mIGNvdW50cyB0aGUgdGVybWluYXRpbmcgTlVMLiAgKi8KKyAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoZGlybGVuICsgc2l6ZW9mKCIvbGRzY3JpcHRzIikpOworICBzcHJpbnRmIChidWYsICIlcy9sZHNjcmlwdHMiLCBkaXIpOworCisgIHJlcyA9IHN0YXQgKGJ1ZiwgJnMpID09IDAgJiYgU19JU0RJUiAocy5zdF9tb2RlKTsKKyAgZnJlZSAoYnVmKTsKKyAgaWYgKHJlcykKKyAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoZGlyLCBmYWxzZSk7CisgIHJldHVybiByZXM7Cit9CisKKy8qIFNldCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIGZpbmRpbmcgc2NyaXB0IGZpbGVzLgorICAgTGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGhlcmUgdG9vLCBidXQgdGhhdCdzIG9rLgorICAgV2UgbG9vayBmb3IgdGhlICJsZHNjcmlwdHMiIGRpcmVjdG9yeSBpbjoKKworICAgU0NSSVBURElSIChwYXNzZWQgZnJvbSBNYWtlZmlsZSkKKyAgIHRoZSBkaXIgd2hlcmUgdGhpcyBwcm9ncmFtIGlzIChmb3IgdXNpbmcgaXQgZnJvbSB0aGUgYnVpbGQgdHJlZSkKKyAgIHRoZSBkaXIgd2hlcmUgdGhpcyBwcm9ncmFtIGlzLy4uL2xpYiAoZm9yIGluc3RhbGxpbmcgdGhlIHRvb2wgc3VpdGUgZWxzZXdoZXJlKSAqLworCitzdGF0aWMgdm9pZAorc2V0X3NjcmlwdHNfZGlyICgpCit7CisgIGNoYXIgKmVuZCwgKmRpcjsKKyAgc2l6ZV90IGRpcmxlbjsKKworICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChTQ1JJUFRESVIpKQorICAgIHJldHVybjsJCQkvKiBXZSd2ZSBiZWVuIGluc3RhbGxlZCBub3JtYWxseS4gICovCisKKyAgLyogTG9vayBmb3IgImxkc2NyaXB0cyIgaW4gdGhlIGRpciB3aGVyZSBvdXIgYmluYXJ5IGlzLiAgKi8KKyAgZW5kID0gc3RycmNociAocHJvZ3JhbV9uYW1lLCAnLycpOworCisgIGlmIChlbmQgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEb24ndCBsb29rIGZvciBsZHNjcmlwdHMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhlcmUgaXMKKyAgICAgICAgIHRvbyBtdWNoIHBvdGVudGlhbCBmb3IgY29uZnVzaW9uLiAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZGlybGVuID0gZW5kIC0gcHJvZ3JhbV9uYW1lOworICAvKiBNYWtlIGEgY29weSBvZiBwcm9ncmFtX25hbWUgaW4gZGlyLgorICAgICBMZWF2ZSByb29tIGZvciBsYXRlciAiLy4uL2xpYiIuICAqLworICBkaXIgPSAoY2hhciAqKSB4bWFsbG9jIChkaXJsZW4gKyA4KTsKKyAgc3RybmNweSAoZGlyLCBwcm9ncmFtX25hbWUsIGRpcmxlbik7CisgIGRpcltkaXJsZW5dID0gJ1wwJzsKKworICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpKQorICAgIHJldHVybjsJCQkvKiBEb24ndCBmcmVlIGRpci4gICovCisKKyAgLyogTG9vayBmb3IgImxkc2NyaXB0cyIgaW4gPHRoZSBkaXIgd2hlcmUgb3VyIGJpbmFyeSBpcz4vLi4vbGliLiAgKi8KKyAgc3RyY3B5IChkaXIgKyBkaXJsZW4sICIvLi4vbGliIik7CisgIGlmIChjaGVja19mb3Jfc2NyaXB0c19kaXIgKGRpcikpCisgICAgcmV0dXJuOworCisgIGZyZWUgKGRpcik7CQkJLyogV2VsbCwgd2UgdHJpZWQuICAqLworfQorCit2b2lkCithZGRfeXN5bSAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgaWYgKGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9PSAoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopIE5VTEwpCisgICAgeworICAgICAgbGlua19pbmZvLm5vdGljZV9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKKwkJCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKKyAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAobGlua19pbmZvLm5vdGljZV9oYXNoLAorCQkJCSAgIGJmZF9oYXNoX25ld2Z1bmMsCisJCQkJICAgNjEpKQorCWVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKKyAgICB9ICAgICAgCisKKyAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLm5vdGljZV9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKQorICAgICAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOworfQorCisvKiBSZWNvcmQgYSBzeW1ib2wgdG8gYmUgd3JhcHBlZCwgZnJvbSB0aGUgLS13cmFwIG9wdGlvbi4gICovCisKK3ZvaWQKK2FkZF93cmFwIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpZiAobGlua19pbmZvLndyYXBfaGFzaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmtfaW5mby53cmFwX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQorCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKKyAgICAgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXRfbiAobGlua19pbmZvLndyYXBfaGFzaCwKKwkJCQkgICBiZmRfaGFzaF9uZXdmdW5jLAorCQkJCSAgIDYxKSkKKwllaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7CisgICAgfQorICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ud3JhcF9oYXNoLCBuYW1lLCB0cnVlLCB0cnVlKSA9PSBOVUxMKQorICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOworfQorCisvKiBIYW5kbGUgdGhlIC1yZXRhaW4tc3ltYm9scy1maWxlIG9wdGlvbi4gICovCisKK3ZvaWQKK2FkZF9rZWVwc3ltc19maWxlIChmaWxlbmFtZSkKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Cit7CisgIEZJTEUgKmZpbGU7CisgIGNoYXIgKmJ1ZjsKKyAgc2l6ZV90IGJ1ZnNpemU7CisgIGludCBjOworCisgIGlmIChsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfc29tZSkKKyAgICBlaW5mbyAoXygiJVglUDogZXJyb3I6IGR1cGxpY2F0ZSByZXRhaW4tc3ltYm9scy1maWxlXG4iKSk7CisKKyAgZmlsZSA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKKyAgaWYgKGZpbGUgPT0gKEZJTEUgKikgTlVMTCkKKyAgICB7CisgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOworICAgICAgZWluZm8gKCIlWCVQOiAlczogJUVcbiIsIGZpbGVuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbGlua19pbmZvLmtlZXBfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCisJCQkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7CisgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKGxpbmtfaW5mby5rZWVwX2hhc2gsIGJmZF9oYXNoX25ld2Z1bmMpKQorICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIpKTsKKworICBidWZzaXplID0gMTAwOworICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChidWZzaXplKTsKKworICBjID0gZ2V0YyAoZmlsZSk7CisgIHdoaWxlIChjICE9IEVPRikKKyAgICB7CisgICAgICB3aGlsZSAoaXNzcGFjZSAoYykpCisJYyA9IGdldGMgKGZpbGUpOworCisgICAgICBpZiAoYyAhPSBFT0YpCisJeworCSAgc2l6ZV90IGxlbiA9IDA7CisKKwkgIHdoaWxlICghIGlzc3BhY2UgKGMpICYmIGMgIT0gRU9GKQorCSAgICB7CisJICAgICAgYnVmW2xlbl0gPSBjOworCSAgICAgICsrbGVuOworCSAgICAgIGlmIChsZW4gPj0gYnVmc2l6ZSkKKwkJeworCQkgIGJ1ZnNpemUgKj0gMjsKKwkJICBidWYgPSB4cmVhbGxvYyAoYnVmLCBidWZzaXplKTsKKwkJfQorCSAgICAgIGMgPSBnZXRjIChmaWxlKTsKKwkgICAgfQorCisJICBidWZbbGVuXSA9ICdcMCc7CisKKwkgIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5rZWVwX2hhc2gsIGJ1ZiwgdHJ1ZSwgdHJ1ZSkKKwkgICAgICA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCisJICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZm9yIGluc2VydGlvbiBmYWlsZWQ6ICVFXG4iKSk7CisJfQorICAgIH0KKworICBpZiAobGlua19pbmZvLnN0cmlwICE9IHN0cmlwX25vbmUpCisgICAgZWluZm8gKF8oIiVQOiBgLXJldGFpbi1zeW1ib2xzLWZpbGUnIG92ZXJyaWRlcyBgLXMnIGFuZCBgLVMnXG4iKSk7CisKKyAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfc29tZTsKK30KKwwKKy8qIENhbGxiYWNrcyBmcm9tIHRoZSBCRkQgbGlua2VyIHJvdXRpbmVzLiAgKi8KKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRlY2lkZWQgdG8gaW5jbHVkZSBhbiBhcmNoaXZlIG1lbWJlciBpbgorICAgYSBsaW5rLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorYWRkX2FyY2hpdmVfZWxlbWVudCAoaW5mbywgYWJmZCwgbmFtZSkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wdXQ7CisKKyAgaW5wdXQgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKKwkgICB4bWFsbG9jIChzaXplb2YgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpKSk7CisgIGlucHV0LT5maWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOworICBpbnB1dC0+bG9jYWxfc3ltX25hbWUgPSBhYmZkLT5maWxlbmFtZTsKKyAgaW5wdXQtPnRoZV9iZmQgPSBhYmZkOworICBpbnB1dC0+YXN5bWJvbHMgPSBOVUxMOworICBpbnB1dC0+bmV4dCA9IE5VTEw7CisgIGlucHV0LT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOworICBpbnB1dC0+bG9hZGVkID0gZmFsc2U7CisgIGlucHV0LT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7CisKKyAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3Qgc2V0OiBoZWFkZXIubmV4dCwKKyAgICAgaGVhZGVyLnR5cGUsIGNsb3NlZCwgcGFzc2l2ZV9wb3NpdGlvbiwgc3ltYm9sX2NvdW50LAorICAgICBuZXh0X3JlYWxfZmlsZSwgaXNfYXJjaGl2ZSwgdGFyZ2V0LCByZWFsLiAgVGhpcyBiaXQgb2YgY29kZSBpcworICAgICBmcm9tIHRoZSBvbGQgZGVjb2RlX2xpYnJhcnlfc3ViZmlsZSBmdW5jdGlvbi4gIEkgZG9uJ3Qga25vdworICAgICB3aGV0aGVyIGFueSBvZiB0aG9zZSBmaWVsZHMgbWF0dGVycy4gICovCisKKyAgbGRsYW5nX2FkZF9maWxlIChpbnB1dCk7CisKKyAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSAoRklMRSAqKSBOVUxMKQorICAgIHsKKyAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOworICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisgICAgICBiZmQgKmZyb207CisgICAgICBpbnQgbGVuOworCisgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCisgICAgICBpZiAoaCA9PSBOVUxMKQorCWZyb20gPSBOVUxMOworICAgICAgZWxzZQorCXsKKwkgIHN3aXRjaCAoaC0+dHlwZSkKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIGZyb20gPSBOVUxMOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgorCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKKwkgICAgICBmcm9tID0gaC0+dS5kZWYuc2VjdGlvbi0+b3duZXI7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKKwkgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKKwkgICAgICBmcm9tID0gaC0+dS51bmRlZi5hYmZkOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246CisJICAgICAgZnJvbSA9IGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCisJeworCSAgY2hhciBidWZbMTAwXTsKKworCSAgc3ByaW50ZiAoYnVmLCAiJS0yOXMgJXNcblxuIiwgXygiQXJjaGl2ZSBtZW1iZXIgaW5jbHVkZWQiKSwKKwkJICAgXygiYmVjYXVzZSBvZiBmaWxlIChzeW1ib2wpIikpOworCSAgbWluZm8gKCIlcyIsIGJ1Zik7CisJICBoZWFkZXJfcHJpbnRlZCA9IHRydWU7CisJfQorCisgICAgICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpID09IE5VTEwpCisJeworCSAgbWluZm8gKCIlcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKwkgIGxlbiA9IHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtaW5mbyAoIiVzKCVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSksCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisJICBsZW4gPSAoc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKQorCQkgKyBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKQorCQkgKyAyKTsKKwl9CisKKyAgICAgIGlmIChsZW4gPj0gMjkpCisJeworCSAgcHJpbnRfbmwgKCk7CisJICBsZW4gPSAwOworCX0KKyAgICAgIHdoaWxlIChsZW4gPCAzMCkKKwl7CisJICBwcmludF9zcGFjZSAoKTsKKwkgICsrbGVuOworCX0KKworICAgICAgaWYgKGZyb20gIT0gTlVMTCkKKwltaW5mbyAoIiVCICIsIGZyb20pOworICAgICAgaWYgKGggIT0gTlVMTCkKKwltaW5mbyAoIiglVClcbiIsIGgtPnJvb3Quc3RyaW5nKTsKKyAgICAgIGVsc2UKKwltaW5mbyAoIiglcylcbiIsIG5hbWUpOworICAgIH0KKworICBpZiAodHJhY2VfZmlsZXMgfHwgdHJhY2VfZmlsZV90cmllcykKKyAgICBpbmZvX21zZyAoIiVJXG4iLCBpbnB1dCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQKKyAgIG11bHRpcGxlIHRpbWVzLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorbXVsdGlwbGVfZGVmaW5pdGlvbiAoaW5mbywgbmFtZSwgb2JmZCwgb3NlYywgb3ZhbCwgbmJmZCwgbnNlYywgbnZhbCkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZCAqb2JmZDsKKyAgICAgYXNlY3Rpb24gKm9zZWM7CisgICAgIGJmZF92bWEgb3ZhbDsKKyAgICAgYmZkICpuYmZkOworICAgICBhc2VjdGlvbiAqbnNlYzsKKyAgICAgYmZkX3ZtYSBudmFsOworeworICAvKiBJZiBlaXRoZXIgc2VjdGlvbiBoYXMgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkIHNldCB0bworICAgICBiZmRfYWJzX3NlY3Rpb25fcHRyLCBpdCBtZWFucyB0aGF0IHRoZSBzZWN0aW9uIGlzIGJlaW5nCisgICAgIGRpc2NhcmRlZCwgYW5kIHRoaXMgaXMgbm90IHJlYWxseSBhIG11bHRpcGxlIGRlZmluaXRpb24gYXQgYWxsLgorICAgICBGSVhNRTogSXQgd291bGQgYmUgY2xlYW5lciB0byBzb21laG93IGlnbm9yZSBzeW1ib2xzIGRlZmluZWQgaW4KKyAgICAgc2VjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4gICovCisgIGlmICgob3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAorICAgICAgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChvc2VjKQorICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAob3NlYy0+b3V0cHV0X3NlY3Rpb24pKQorICAgICAgfHwgKG5zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKKwkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjKQorCSAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChuc2VjLT5vdXRwdXRfc2VjdGlvbikpKQorICAgIHJldHVybiB0cnVlOworCisgIGVpbmZvIChfKCIlWCVDOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGAlVCdcbiIpLAorCSBuYmZkLCBuc2VjLCBudmFsLCBuYW1lKTsKKyAgaWYgKG9iZmQgIT0gKGJmZCAqKSBOVUxMKQorICAgIGVpbmZvIChfKCIlRDogZmlyc3QgZGVmaW5lZCBoZXJlXG4iKSwgb2JmZCwgb3NlYywgb3ZhbCk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wsIG9yCisgICB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBmb3VuZCBmb3IgYSBzeW1ib2wgdGhhdCBpcyBhbHJlYWR5IGRlZmluZWQsCisgICBvciB3aGVuIHR3byBjb21tb24gc3ltYm9scyBhcmUgZm91bmQuICBXZSBvbmx5IGRvIHNvbWV0aGluZyBpZgorICAgLXdhcm4tY29tbW9uIHdhcyB1c2VkLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgorbXVsdGlwbGVfY29tbW9uIChpbmZvLCBuYW1lLCBvYmZkLCBvdHlwZSwgb3NpemUsIG5iZmQsIG50eXBlLCBuc2l6ZSkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZCAqb2JmZDsKKyAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb3R5cGU7CisgICAgIGJmZF92bWEgb3NpemU7CisgICAgIGJmZCAqbmJmZDsKKyAgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgbnR5cGU7CisgICAgIGJmZF92bWEgbnNpemU7Cit7CisgIGlmICghIGNvbmZpZy53YXJuX2NvbW1vbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAobnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisgICAgICB8fCBudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKKyAgICAgIHx8IG50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCisgICAgeworICAgICAgQVNTRVJUIChvdHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7CisgICAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGRlZmluaXRpb24gb2YgYCVUJyBvdmVycmlkaW5nIGNvbW1vblxuIiksCisJICAgICBuYmZkLCBuYW1lKTsKKyAgICAgIGlmIChvYmZkICE9IE5VTEwpCisJZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOworICAgIH0KKyAgZWxzZSBpZiAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICAgfHwgb3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCisJICAgfHwgb3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKKyAgICB7CisgICAgICBBU1NFUlQgKG50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKKyAgICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uXG4iKSwKKwkgICAgIG5iZmQsIG5hbWUpOworICAgICAgaWYgKG9iZmQgIT0gTlVMTCkKKwllaW5mbyAoXygiJUI6IHdhcm5pbmc6IGRlZmluZWQgaGVyZVxuIiksIG9iZmQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEFTU0VSVCAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24gJiYgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOworICAgICAgaWYgKG9zaXplID4gbnNpemUpCisJeworCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb25cbiIpLAorCQkgbmJmZCwgbmFtZSk7CisJICBpZiAob2JmZCAhPSBOVUxMKQorCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGxhcmdlciBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOworCX0KKyAgICAgIGVsc2UgaWYgKG5zaXplID4gb3NpemUpCisJeworCSAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uXG4iKSwKKwkJIG5iZmQsIG5hbWUpOworCSAgaWYgKG9iZmQgIT0gTlVMTCkKKwkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGVpbmZvIChfKCIlQjogd2FybmluZzogbXVsdGlwbGUgY29tbW9uIG9mIGAlVCdcbiIpLCBuYmZkLCBuYW1lKTsKKwkgIGlmIChvYmZkICE9IE5VTEwpCisJICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKKwl9CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIEJGRCBoYXMgZGlzY292ZXJlZCBhIHNldCBlbGVtZW50LiAgSCBpcyB0aGUKKyAgIGVudHJ5IGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBmb3IgdGhlIHNldC4gIFNFQ1RJT04gYW5kIFZBTFVFCisgICByZXByZXNlbnQgYSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNldC4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK2FkZF90b19zZXQgKGluZm8sIGgsIHJlbG9jLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgdmFsdWU7Cit7CisgIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCisgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksCisJICAgaC0+cm9vdC5zdHJpbmcpOworCisgIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIHJlbG9jLCAoY29uc3QgY2hhciAqKSBOVUxMLCBzZWN0aW9uLCB2YWx1ZSk7CisKKyAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCisgICAgeworICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOworICAgICAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKKyAgICAgIC8qIFdlIGRvbid0IGNhbGwgYmZkX2xpbmtfYWRkX3VuZGVmIHRvIGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mCisJIHVuZGVmaW5lZCBzeW1ib2xzIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGRlZmluZSBpdAorCSBvdXJzZWx2ZXMuICAqLworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBjb25zdHJ1Y3Rvci4gIFRoaXMgaXMgb25seQorICAgY2FsbGVkIGZvciBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMtLXRob3NlIHdoaWNoIGRvIG5vdCBoYW5kbGUKKyAgIGNvbnN0cnVjdG9ycyBpbiBzb21lIG1vcmUgY2xldmVyIGZhc2hpb24uICBUaGlzIGlzIHNpbWlsYXIgdG8KKyAgIGFkZGluZyBhbiBlbGVtZW50IHRvIGEgc2V0LCBidXQgbGVzcyBnZW5lcmFsLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvbnN0cnVjdG9yX2NhbGxiYWNrIChpbmZvLCBjb25zdHJ1Y3RvciwgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBib29sZWFuIGNvbnN0cnVjdG9yOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIHZhbHVlOworeworICBjaGFyICpzOworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgY2hhciBzZXRfbmFtZVsxICsgc2l6ZW9mICJfX0NUT1JfTElTVF9fIl07CisKKyAgaWYgKGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycykKKyAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGdsb2JhbCBjb25zdHJ1Y3RvciAlcyB1c2VkXG4iKSwgbmFtZSk7CisKKyAgaWYgKCEgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvKiBFbnN1cmUgdGhhdCBCRkRfUkVMT0NfQ1RPUiBleGlzdHMgbm93LCBzbyB0aGF0IHdlIGNhbiBnaXZlIGEKKyAgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2UuICAqLworICBpZiAoYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBCRkRfUkVMT0NfQ1RPUikgPT0gTlVMTAorICAgICAgJiYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKKwkgIHx8IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwpKQorICAgIGVpbmZvIChfKCIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIpKTsKKworICBzID0gc2V0X25hbWU7CisgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpICE9ICdcMCcpCisgICAgKnMrKyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7CisgIGlmIChjb25zdHJ1Y3RvcikKKyAgICBzdHJjcHkgKHMsICJfX0NUT1JfTElTVF9fIik7CisgIGVsc2UKKyAgICBzdHJjcHkgKHMsICJfX0RUT1JfTElTVF9fIik7CisKKyAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBzZXRfbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQorICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7CisgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQorICAgIHsKKyAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKKyAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7CisgICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgorCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKKwkgb3Vyc2VsdmVzLiAgKi8KKyAgICB9CisKKyAgbGRjdG9yX2FkZF9zZXRfZW50cnkgKGgsIEJGRF9SRUxPQ19DVE9SLCBuYW1lLCBzZWN0aW9uLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBBIHN0cnVjdHVyZSB1c2VkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdoCisgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLworCitzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvCit7CisgIGJvb2xlYW4gZm91bmQ7CisgIGNvbnN0IGNoYXIgKndhcm5pbmc7CisgIGNvbnN0IGNoYXIgKnN5bWJvbDsKKyAgYXN5bWJvbCAqKmFzeW1ib2xzOworfTsKKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIHdhcm5pbmcgc3ltYm9sLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgYm9vbGVhbgord2FybmluZ19jYWxsYmFjayAoaW5mbywgd2FybmluZywgc3ltYm9sLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqd2FybmluZzsKKyAgICAgY29uc3QgY2hhciAqc3ltYm9sOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIGFkZHJlc3M7Cit7CisgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIHN1cHBvcnQgd2Fybl9tdWx0aXBsZV9ncC4gIEZJWE1FOiBUaGlzIHNob3VsZAorICAgICBoYXZlIGEgY2xlYW5lciBpbnRlcmZhY2UsIGJ1dCB3aGF0PyAgKi8KKyAgaWYgKCEgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AKKyAgICAgICYmIHN0cmNtcCAod2FybmluZywgInVzaW5nIG11bHRpcGxlIGdwIHZhbHVlcyIpID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKHNlY3Rpb24gIT0gTlVMTCkKKyAgICBlaW5mbyAoIiVDOiAlc1xuIiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgd2FybmluZyk7CisgIGVsc2UgaWYgKGFiZmQgPT0gTlVMTCkKKyAgICBlaW5mbyAoIiVQOiAlc1xuIiwgd2FybmluZyk7CisgIGVsc2UgaWYgKHN5bWJvbCA9PSBOVUxMKQorICAgIGVpbmZvICgiJUI6ICVzXG4iLCBhYmZkLCB3YXJuaW5nKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OworICAgICAgYXN5bWJvbCAqKmFzeW1ib2xzOworICAgICAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyBpbmZvOworCisgICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyB0byBzZWUgaWYgd2UgY2FuIGZpbmQgYSBwbGF1c2libGUKKwkgYWRkcmVzcy4gICovCisKKyAgICAgIGVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgYWJmZC0+dXNyZGF0YTsKKyAgICAgIGlmIChlbnRyeSAhPSBOVUxMICYmIGVudHJ5LT5hc3ltYm9scyAhPSBOVUxMKQorCWFzeW1ib2xzID0gZW50cnktPmFzeW1ib2xzOworICAgICAgZWxzZQorCXsKKwkgIGxvbmcgc3ltc2l6ZTsKKwkgIGxvbmcgc3ltYm9sX2NvdW50OworCisJICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOworCSAgaWYgKHN5bXNpemUgPCAwKQorCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKKwkgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOworCSAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKKwkgIGlmIChzeW1ib2xfY291bnQgPCAwKQorCSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBhYmZkKTsKKwkgIGlmIChlbnRyeSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZW50cnktPmFzeW1ib2xzID0gYXN5bWJvbHM7CisJICAgICAgZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKKwkgICAgfQorCX0KKworICAgICAgaW5mby5mb3VuZCA9IGZhbHNlOworICAgICAgaW5mby53YXJuaW5nID0gd2FybmluZzsKKyAgICAgIGluZm8uc3ltYm9sID0gc3ltYm9sOworICAgICAgaW5mby5hc3ltYm9scyA9IGFzeW1ib2xzOworICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCB3YXJuaW5nX2ZpbmRfcmVsb2MsIChQVFIpICZpbmZvKTsKKworICAgICAgaWYgKCEgaW5mby5mb3VuZCkKKwllaW5mbyAoIiVCOiAlc1xuIiwgYWJmZCwgd2FybmluZyk7CisKKyAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQorCWZyZWUgKGFzeW1ib2xzKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGJ5IHdhcm5pbmdfY2FsbGJhY2sgZm9yIGVhY2ggc2VjdGlvbi4gIEl0IGNoZWNrcyB0aGUKKyAgIHJlbG9jcyBvZiB0aGUgc2VjdGlvbiB0byBzZWUgaWYgaXQgY2FuIGZpbmQgYSByZWZlcmVuY2UgdG8gdGhlCisgICBzeW1ib2wgd2hpY2ggdHJpZ2dlcmVkIHRoZSB3YXJuaW5nLiAgSWYgaXQgY2FuLCBpdCB1c2VzIHRoZSByZWxvYworICAgdG8gZ2l2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggYSBmaWxlIGFuZCBsaW5lIG51bWJlci4gICovCisKK3N0YXRpYyB2b2lkCit3YXJuaW5nX2ZpbmRfcmVsb2MgKGFiZmQsIHNlYywgaWFyZykKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBQVFIgaWFyZzsKK3sKKyAgc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyAqaW5mbyA9IChzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvICopIGlhcmc7CisgIGxvbmcgcmVsc2l6ZTsKKyAgYXJlbGVudCAqKnJlbHBwOworICBsb25nIHJlbGNvdW50OworICBhcmVsZW50ICoqcCwgKipwZW5kOworCisgIGlmIChpbmZvLT5mb3VuZCkKKyAgICByZXR1cm47CisKKyAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7CisgIGlmIChyZWxzaXplIDwgMCkKKyAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOworICBpZiAocmVsc2l6ZSA9PSAwKQorICAgIHJldHVybjsKKworICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKKyAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHBwLCBpbmZvLT5hc3ltYm9scyk7CisgIGlmIChyZWxjb3VudCA8IDApCisgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKKworICBwID0gcmVscHA7CisgIHBlbmQgPSBwICsgcmVsY291bnQ7CisgIGZvciAoOyBwIDwgcGVuZCAmJiAqcCAhPSBOVUxMOyBwKyspCisgICAgeworICAgICAgYXJlbGVudCAqcSA9ICpwOworCisgICAgICBpZiAocS0+c3ltX3B0cl9wdHIgIT0gTlVMTAorCSAgJiYgKnEtPnN5bV9wdHJfcHRyICE9IE5VTEwKKwkgICYmIHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgaW5mby0+c3ltYm9sKSA9PSAwKQorCXsKKwkgIC8qIFdlIGZvdW5kIGEgcmVsb2MgZm9yIHRoZSBzeW1ib2wgd2UgYXJlIGxvb2tpbmcgZm9yLiAgKi8KKwkgIGVpbmZvICgiJUM6ICVzXG4iLCBhYmZkLCBzZWMsIHEtPmFkZHJlc3MsIGluZm8tPndhcm5pbmcpOworCSAgaW5mby0+Zm91bmQgPSB0cnVlOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBmcmVlIChyZWxwcCk7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyBmb3VuZC4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIGJvb2xlYW4KK3VuZGVmaW5lZF9zeW1ib2wgKGluZm8sIG5hbWUsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIGFkZHJlc3M7Cit7CisgIHN0YXRpYyBjaGFyICplcnJvcl9uYW1lOworICBzdGF0aWMgdW5zaWduZWQgaW50IGVycm9yX2NvdW50OworCisjZGVmaW5lIE1BWF9FUlJPUlNfSU5fQV9ST1cgNQorCisgIGlmIChjb25maWcud2Fybl9vbmNlKQorICAgIHsKKyAgICAgIHN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmhhc2g7CisKKyAgICAgIC8qIE9ubHkgd2FybiBvbmNlIGFib3V0IGEgcGFydGljdWxhciB1bmRlZmluZWQgc3ltYm9sLiAgKi8KKworICAgICAgaWYgKGhhc2ggPT0gTlVMTCkKKwl7CisJICBoYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKKwkJICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF90YWJsZSkpKTsKKwkgIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKGhhc2gsIGJmZF9oYXNoX25ld2Z1bmMpKQorCSAgICBlaW5mbyAoXygiJUYlUDogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7CisJfQorCisgICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChoYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGhhc2gsIG5hbWUsIHRydWUsIHRydWUpID09IE5VTEwpCisJZWluZm8gKF8oIiVGJVA6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7CisgICAgfQorCisgIC8qIFdlIG5ldmVyIHByaW50IG1vcmUgdGhhbiBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIGVycm9ycyBpbiBhIHJvdworICAgICBmb3IgYSBzaW5nbGUgc3ltYm9sLiAgKi8KKyAgaWYgKGVycm9yX25hbWUgIT0gKGNoYXIgKikgTlVMTAorICAgICAgJiYgc3RyY21wIChuYW1lLCBlcnJvcl9uYW1lKSA9PSAwKQorICAgICsrZXJyb3JfY291bnQ7CisgIGVsc2UKKyAgICB7CisgICAgICBlcnJvcl9jb3VudCA9IDA7CisgICAgICBpZiAoZXJyb3JfbmFtZSAhPSAoY2hhciAqKSBOVUxMKQorCWZyZWUgKGVycm9yX25hbWUpOworICAgICAgZXJyb3JfbmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7CisgICAgfQorCisgIGlmIChzZWN0aW9uICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGVycm9yX2NvdW50IDwgTUFYX0VSUk9SU19JTl9BX1JPVykKKwllaW5mbyAoXygiJVglQzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iKSwKKwkgICAgICAgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcywgbmFtZSk7CisgICAgICBlbHNlIGlmIChlcnJvcl9jb3VudCA9PSBNQVhfRVJST1JTX0lOX0FfUk9XKQorCWVpbmZvIChfKCIlRDogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIiksCisJICAgICAgIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIG5hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChlcnJvcl9jb3VudCA8IE1BWF9FUlJPUlNfSU5fQV9ST1cpCisJZWluZm8gKF8oIiVYJUI6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIiksCisJICAgICAgIGFiZmQsIG5hbWUpOworICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKKwllaW5mbyAoXygiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAorCSAgICAgICBhYmZkLCBuYW1lKTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWxvYyBvdmVyZmxvd3MuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCityZWxvY19vdmVyZmxvdyAoaW5mbywgbmFtZSwgcmVsb2NfbmFtZSwgYWRkZW5kLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgY2hhciAqcmVsb2NfbmFtZTsKKyAgICAgYmZkX3ZtYSBhZGRlbmQ7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgYWRkcmVzczsKK3sKKyAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQorICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7CisgIGVsc2UKKyAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7CisgIGVpbmZvIChfKCIgcmVsb2NhdGlvbiB0cnVuY2F0ZWQgdG8gZml0OiAlcyAlVCIpLCByZWxvY19uYW1lLCBuYW1lKTsKKyAgaWYgKGFkZGVuZCAhPSAwKQorICAgIGVpbmZvICgiKyV2IiwgYWRkZW5kKTsKKyAgZWluZm8gKCJcbiIpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGRhbmdlcm91cyByZWxvY2F0aW9uIGlzIG1hZGUuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCityZWxvY19kYW5nZXJvdXMgKGluZm8sIG1lc3NhZ2UsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpCisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworICAgICBjb25zdCBjaGFyICptZXNzYWdlOworICAgICBiZmQgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworICAgICBiZmRfdm1hIGFkZHJlc3M7Cit7CisgIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKKyAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOworICBlbHNlCisgICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOworICBlaW5mbyAoXygiZGFuZ2Vyb3VzIHJlbG9jYXRpb246ICVzXG4iKSwgbWVzc2FnZSk7CisgIHJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2MgaXMgYmVpbmcgZ2VuZXJhdGVkIGF0dGFjaGVkIHRvIGEgc3ltYm9sCisgICB0aGF0IGlzIG5vdCBiZWluZyBvdXRwdXQuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCit1bmF0dGFjaGVkX3JlbG9jIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQorICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgYmZkX3ZtYSBhZGRyZXNzOworeworICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCisgICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKKyAgZWxzZQorICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKKyAgZWluZm8gKF8oIiByZWxvYyByZWZlcnMgdG8gc3ltYm9sIGAlVCcgd2hpY2ggaXMgbm90IGJlaW5nIG91dHB1dFxuIiksIG5hbWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgaWYgbGlua19pbmZvLm5vdGljZV9hbGwgaXMgc2V0LCBvciB3aGVuIGEgc3ltYm9sIGluCisgICBsaW5rX2luZm8ubm90aWNlX2hhc2ggaXMgZm91bmQuICBTeW1ib2xzIGFyZSBwdXQgaW4gbm90aWNlX2hhc2gKKyAgIHVzaW5nIHRoZSAteSBvcHRpb24uICAqLworCitzdGF0aWMgYm9vbGVhbgorbm90aWNlIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247CisgICAgIGJmZF92bWEgdmFsdWU7Cit7CisgIGlmICghIGluZm8tPm5vdGljZV9hbGwKKyAgICAgIHx8IChpbmZvLT5ub3RpY2VfaGFzaCAhPSBOVUxMCisJICAmJiBiZmRfaGFzaF9sb29rdXAgKGluZm8tPm5vdGljZV9oYXNoLCBuYW1lLCBmYWxzZSwgZmFsc2UpICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQorCWVpbmZvICgiJUI6IHJlZmVyZW5jZSB0byAlc1xuIiwgYWJmZCwgbmFtZSk7CisgICAgICBlbHNlCisJZWluZm8gKCIlQjogZGVmaW5pdGlvbiBvZiAlc1xuIiwgYWJmZCwgbmFtZSk7CisgICAgfQorCisgIGlmIChjb21tYW5kX2xpbmUuY3JlZiB8fCBub2Nyb3NzcmVmX2xpc3QgIT0gTlVMTCkKKyAgICBhZGRfY3JlZiAobmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmggYi9sZC9sZG1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFiZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGRtYWluLmgKQEAgLTAsMCArMSw0MCBAQAorLyogbGRtYWluLmggLQorICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBMRE1BSU5fSAorI2RlZmluZSBMRE1BSU5fSAorCitleHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOworZXh0ZXJuIGJmZCAqb3V0cHV0X2JmZDsKK2V4dGVybiBjaGFyICpkZWZhdWx0X3RhcmdldDsKK2V4dGVybiBib29sZWFuIHRyYWNlX2ZpbGVzOworZXh0ZXJuIGJvb2xlYW4gdHJhY2VfZmlsZV90cmllczsKK2V4dGVybiBib29sZWFuIHZlcnNpb25fcHJpbnRlZDsKK2V4dGVybiBib29sZWFuIHdob2xlX2FyY2hpdmU7CitleHRlcm4gYm9vbGVhbiBkZW1hbmdsaW5nOworZXh0ZXJuIGludCBnX3N3aXRjaF92YWx1ZTsKK2V4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7CitleHRlcm4gc3RydWN0IGJmZF9saW5rX2luZm8gbGlua19pbmZvOworCitleHRlcm4gdm9pZCBhZGRfeXN5bSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK2V4dGVybiB2b2lkIGFkZF93cmFwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIHZvaWQgYWRkX2tlZXBzeW1zX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZG1pc2MuYyBiL2xkL2xkbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWIyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZG1pc2MuYwpAQCAtMCwwICsxLDUzOCBAQAorLyogbGRtaXNjLmMKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNkZWZpbmUgVVNFX1NUREFSRyAxCisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNkZWZpbmUgVVNFX1NUREFSRyAwCisjZW5kaWYKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGdyYW0uaCIKKyNpbmNsdWRlICJsZGxleC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorCitzdGF0aWMgdm9pZCB2ZmluZm8gUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKworLyoKKyAlJSBsaXRlcmFsICUKKyAlRiBlcnJvciBpcyBmYXRhbAorICVQIHByaW50IHByb2dyYW0gbmFtZQorICVTIHByaW50IHNjcmlwdCBmaWxlIGFuZCBsaW5lbnVtYmVyCisgJUUgY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8KKyAlSSBmaWxlbmFtZSBmcm9tIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZQorICVCIGZpbGVuYW1lIGZyb20gYSBiZmQKKyAlVCBzeW1ib2wgbmFtZQorICVYIG5vIG9iamVjdCBvdXRwdXQsIGZhaWwgcmV0dXJuCisgJVYgaGV4IGJmZF92bWEKKyAldiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcworICVXIGhleCBiZmRfdm1hIHdpdGggMHggd2l0aCBubyBsZWFkaW5nIHplcm9zIHRha2luZyB1cCA4IHNwYWNlcworICVDIGNsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24KKyAlRCBsaWtlICVDLCBidXQgbm8gZnVuY3Rpb24gbmFtZQorICVHIGxpa2UgJUQsIGJ1dCBvbmx5IGZ1bmN0aW9uIG5hbWUKKyAlUiBpbmZvIGFib3V0IGEgcmVsZW50CisgJXMgYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYKKyAlZCBpbnRlZ2VyLCBsaWtlIHByaW50ZgorICV1IGludGVnZXIsIGxpa2UgcHJpbnRmCisqLworCitjaGFyICoKK2RlbWFuZ2xlIChzdHJpbmcpCisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgY2hhciAqcmVzOworCisgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKKyAgICAgICYmIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob3V0cHV0X2JmZCkgPT0gc3RyaW5nWzBdKQorICAgICsrc3RyaW5nOworCisgIC8qIFRoaXMgaXMgYSBoYWNrIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIFhDT0ZGLCBvciB0aGUgTVMgUEUgICAqLworICAvKiBmb3JtYXQuICBYY29mZiBoYXMgYSBzaW5nbGUgJy4nLCB3aGlsZSB0aGUgTlQgUEUgZm9yIFBQQyBoYXMgJy4uJy4gKi8KKyAgLyogU28gd2UgcmVtb3ZlIGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHdoaWxlKHN0cmluZ1swXSA9PSAnLicpCisgICAgKytzdHJpbmc7CisKKyAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKHN0cmluZywgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOworICByZXR1cm4gcmVzID8gcmVzIDogeHN0cmR1cCAoc3RyaW5nKTsKK30KKworc3RhdGljIHZvaWQKK3ZmaW5mbyAoZnAsIGZtdCwgYXJnKQorICAgICBGSUxFICpmcDsKKyAgICAgY29uc3QgY2hhciAqZm10OworICAgICB2YV9saXN0IGFyZzsKK3sKKyAgYm9vbGVhbiBmYXRhbCA9IGZhbHNlOworCisgIHdoaWxlICgqZm10ICE9ICdcMCcpCisgICAgeworICAgICAgd2hpbGUgKCpmbXQgIT0gJyUnICYmICpmbXQgIT0gJ1wwJykgCisJeworCSAgcHV0YyAoKmZtdCwgZnApOworCSAgZm10Kys7CisJfQorCisgICAgICBpZiAoKmZtdCA9PSAnJScpIAorCXsKKwkgIGZtdCArKzsKKwkgIHN3aXRjaCAoKmZtdCsrKSAKKwkgICAgeworCSAgICBkZWZhdWx0OgorCSAgICAgIGZwcmludGYgKGZwLCIlJSVjIiwgZm10Wy0xXSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnJSc6CisJICAgICAgLyogbGl0ZXJhbCAlICovCisJICAgICAgcHV0YyAoJyUnLCBmcCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnWCc6CisJICAgICAgLyogbm8gb2JqZWN0IG91dHB1dCwgZmFpbCByZXR1cm4gKi8KKwkgICAgICBjb25maWcubWFrZV9leGVjdXRhYmxlID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnVic6CisJICAgICAgLyogaGV4IGJmZF92bWEgKi8KKwkgICAgICB7CisJCWJmZF92bWEgdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7CisJCWZwcmludGZfdm1hIChmcCwgdmFsdWUpOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICd2JzoKKwkgICAgICAvKiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcyAqLworCSAgICAgIHsKKwkJY2hhciBidWZbMTAwXTsKKwkJY2hhciAqcCA9IGJ1ZjsKKwkJYmZkX3ZtYSB2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKKwkJc3ByaW50Zl92bWEgKHAsIHZhbHVlKTsKKwkJd2hpbGUgKCpwID09ICcwJykKKwkJICBwKys7CisJCWlmICghKnApCisJCSAgcC0tOworCQlmcHV0cyAocCwgZnApOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdXJzoKKwkgICAgICAvKiBoZXggYmZkX3ZtYSB3aXRoIDB4IHdpdGggbm8gbGVhZGluZyB6ZXJvZXMgdGFraW5nIHVwCisgICAgICAgICAgICAgICAgIDggc3BhY2VzLiAgKi8KKwkgICAgICB7CisJCWNoYXIgYnVmWzEwMF07CisJCWJmZF92bWEgdmFsdWU7CisJCWNoYXIgKnA7CisJCWludCBsZW47CisKKwkJdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7CisJCXNwcmludGZfdm1hIChidWYsIHZhbHVlKTsKKwkJZm9yIChwID0gYnVmOyAqcCA9PSAnMCc7ICsrcCkKKwkJICA7CisJCWlmICgqcCA9PSAnXDAnKQorCQkgIC0tcDsKKwkJbGVuID0gc3RybGVuIChwKTsKKwkJd2hpbGUgKGxlbiA8IDgpCisJCSAgeworCQkgICAgcHV0YyAoJyAnLCBmcCk7CisJCSAgICArK2xlbjsKKwkJICB9CisJCWZwcmludGYgKGZwLCAiMHglcyIsIHApOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdUJzoKKwkgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCisJICAgICAgeworCQljb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7CisKKwkJaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCB8fCAqbmFtZSA9PSAwKQorCQkgIGZwcmludGYgKGZwLCBfKCJubyBzeW1ib2wiKSk7CisJCWVsc2UgaWYgKCEgZGVtYW5nbGluZykKKwkJICBmcHJpbnRmIChmcCwgIiVzIiwgbmFtZSk7CisJCWVsc2UKKwkJICB7CisJCSAgICBjaGFyICpkZW1hbmdsZWQ7CisKKwkJICAgIGRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChuYW1lKTsKKwkJICAgIGZwcmludGYgKGZwLCAiJXMiLCBkZW1hbmdsZWQpOworCQkgICAgZnJlZSAoZGVtYW5nbGVkKTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0InOgorCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBiZmQgKi8KKwkgICAgICB7IAorCQliZmQgKmFiZmQgPSB2YV9hcmcgKGFyZywgYmZkICopOworCQlpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKKwkJICBmcHJpbnRmIChmcCwgIiVzKCVzKSIsIGFiZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAorCQkJICAgYWJmZC0+ZmlsZW5hbWUpOworCQllbHNlCisJCSAgZnByaW50ZiAoZnAsICIlcyIsIGFiZmQtPmZpbGVuYW1lKTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnRic6CisJICAgICAgLyogZXJyb3IgaXMgZmF0YWwgKi8KKwkgICAgICBmYXRhbCA9IHRydWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnUCc6CisJICAgICAgLyogcHJpbnQgcHJvZ3JhbSBuYW1lICovCisJICAgICAgZnByaW50ZiAoZnAsICIlcyIsIHByb2dyYW1fbmFtZSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnRSc6CisJICAgICAgLyogY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8gKi8KKwkgICAgICBmcHJpbnRmIChmcCwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0knOgorCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICovCisJICAgICAgeworCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppOworCisJCWkgPSB2YV9hcmcgKGFyZywgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKTsKKwkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSAhPSBOVUxMKQorCQkgIGZwcmludGYgKGZwLCAiKCVzKSIsCisJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoaS0+dGhlX2JmZCkpKTsKKwkJZnByaW50ZiAoZnAsICIlcyIsIGktPmxvY2FsX3N5bV9uYW1lKTsKKwkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSA9PSBOVUxMCisJCSAgICAmJiBzdHJjbXAgKGktPmxvY2FsX3N5bV9uYW1lLCBpLT5maWxlbmFtZSkgIT0gMCkKKwkJICBmcHJpbnRmIChmcCwgIiAoJXMpIiwgaS0+ZmlsZW5hbWUpOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdTJzoKKwkgICAgICAvKiBwcmludCBzY3JpcHQgZmlsZSBhbmQgbGluZW51bWJlciAqLworCSAgICAgIGlmIChwYXJzaW5nX2RlZnN5bSkKKwkJZnByaW50ZiAoZnAsICItLWRlZnN5bSAlcyIsIGxleF9zdHJpbmcpOworCSAgICAgIGVsc2UgaWYgKGxkZmlsZV9pbnB1dF9maWxlbmFtZSAhPSBOVUxMKQorCQlmcHJpbnRmIChmcCwgIiVzOiV1IiwgbGRmaWxlX2lucHV0X2ZpbGVuYW1lLCBsaW5lbm8pOworCSAgICAgIGVsc2UKKwkJZnByaW50ZiAoZnAsIF8oImJ1aWx0IGluIGxpbmtlciBzY3JpcHQ6JXUiKSwgbGluZW5vKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdSJzoKKwkgICAgICAvKiBQcmludCBhbGwgdGhhdCdzIGludGVyZXN0aW5nIGFib3V0IGEgcmVsZW50ICovCisJICAgICAgeworCQlhcmVsZW50ICpyZWxlbnQgPSB2YV9hcmcgKGFyZywgYXJlbGVudCAqKTsKKwkKKwkJbGZpbmZvIChmcCwgIiVzKzB4JXYgKHR5cGUgJXMpIiwKKwkJCSgqKHJlbGVudC0+c3ltX3B0cl9wdHIpKS0+bmFtZSwKKwkJCXJlbGVudC0+YWRkZW5kLAorCQkJcmVsZW50LT5ob3d0by0+bmFtZSk7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCQorCSAgICBjYXNlICdDJzoKKwkgICAgY2FzZSAnRCc6CisJICAgIGNhc2UgJ0cnOgorCSAgICAgIC8qIENsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24gbmFtZSBpZiBwb3NzaWJsZSwKKwkJIG9yIHNlY3Rpb24gbmFtZSBhcyBhIGxhc3QgcmVzb3J0LiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBCRkQsCisJCSBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQuICAqLworCSAgICAgIHsKKwkJc3RhdGljIGJmZCAqbGFzdF9iZmQ7CisJCXN0YXRpYyBjaGFyICpsYXN0X2ZpbGUgPSBOVUxMOworCQlzdGF0aWMgY2hhciAqbGFzdF9mdW5jdGlvbiA9IE5VTEw7CisJCWJmZCAqYWJmZDsKKwkJYXNlY3Rpb24gKnNlY3Rpb247CisJCWJmZF92bWEgb2Zmc2V0OworCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKKwkJYXN5bWJvbCAqKmFzeW1ib2xzOworCQljb25zdCBjaGFyICpmaWxlbmFtZTsKKwkJY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOworCQl1bnNpZ25lZCBpbnQgbGluZW51bWJlcjsKKwkJYm9vbGVhbiBkaXNjYXJkX2xhc3Q7CisKKwkJYWJmZCA9IHZhX2FyZyAoYXJnLCBiZmQgKik7CisJCXNlY3Rpb24gPSB2YV9hcmcgKGFyZywgYXNlY3Rpb24gKik7CisJCW9mZnNldCA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKKworCQllbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGFiZmQtPnVzcmRhdGE7CisJCWlmIChlbnRyeSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMCisJCSAgICAmJiBlbnRyeS0+YXN5bWJvbHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpCisJCSAgYXN5bWJvbHMgPSBlbnRyeS0+YXN5bWJvbHM7CisJCWVsc2UKKwkJICB7CisJCSAgICBsb25nIHN5bXNpemU7CisJCSAgICBsb25nIHN5bWJvbF9jb3VudDsKKworCQkgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKKwkJICAgIGlmIChzeW1zaXplIDwgMCkKKwkJICAgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHNcbiIpLCBhYmZkKTsKKwkJICAgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOworCQkgICAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKKwkJICAgIGlmIChzeW1ib2xfY291bnQgPCAwKQorCQkgICAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIiksIGFiZmQpOworCQkgICAgaWYgKGVudHJ5ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwpCisJCSAgICAgIHsKKwkJCWVudHJ5LT5hc3ltYm9scyA9IGFzeW1ib2xzOworCQkJZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKKwkJICAgICAgfQorCQkgIH0KKworCQlkaXNjYXJkX2xhc3QgPSB0cnVlOworCQlpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBhc3ltYm9scywgb2Zmc2V0LAorCQkJCQkgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsCisJCQkJCSAgICZsaW5lbnVtYmVyKSkKKwkJICB7CisJCSAgICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnRycpCisJCSAgICAgIHsKKwkJCWxmaW5mbyAoZnAsICIlQjoiLCBhYmZkKTsKKwkJCWlmIChmaWxlbmFtZSAhPSBOVUxMCisJCQkgICAgJiYgc3RyY21wIChmaWxlbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpICE9IDApCisJCQkgIGZwcmludGYgKGZwLCAiJXM6IiwgZmlsZW5hbWUpOworCQkJbGZpbmZvIChmcCwgIiVUIiwgZnVuY3Rpb25uYW1lKTsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnQycpCisJCSAgICAgIHsKKwkJCWlmIChmaWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMKQorCQkJICBmaWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOworCisJCQlpZiAobGFzdF9iZmQgPT0gTlVMTAorCQkJICAgIHx8IGxhc3RfZmlsZSA9PSBOVUxMCisJCQkgICAgfHwgbGFzdF9mdW5jdGlvbiA9PSBOVUxMCisJCQkgICAgfHwgbGFzdF9iZmQgIT0gYWJmZAorCQkJICAgIHx8IHN0cmNtcCAobGFzdF9maWxlLCBmaWxlbmFtZSkgIT0gMAorCQkJICAgIHx8IHN0cmNtcCAobGFzdF9mdW5jdGlvbiwgZnVuY3Rpb25uYW1lKSAhPSAwKQorCQkJICB7CisJCQkgICAgLyogV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAorCQkJICAgICAgIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZworCQkJICAgICAgIHNpbWlsYXJseSB1bmhlbHBmdWwuICAqLworCQkJICAgIGxmaW5mbyAoZnAsIF8oIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIiksCisJCQkJICAgIGFiZmQsIGZ1bmN0aW9ubmFtZSk7CisKKwkJCSAgICBsYXN0X2JmZCA9IGFiZmQ7CisJCQkgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQorCQkJICAgICAgZnJlZSAobGFzdF9maWxlKTsKKwkJCSAgICBsYXN0X2ZpbGUgPSBidXlzdHJpbmcgKGZpbGVuYW1lKTsKKwkJCSAgICBpZiAobGFzdF9mdW5jdGlvbiAhPSBOVUxMKQorCQkJICAgICAgZnJlZSAobGFzdF9mdW5jdGlvbik7CisJCQkgICAgbGFzdF9mdW5jdGlvbiA9IGJ1eXN0cmluZyAoZnVuY3Rpb25uYW1lKTsKKwkJCSAgfQorCQkJZGlzY2FyZF9sYXN0ID0gZmFsc2U7CisJCQlpZiAobGluZW51bWJlciAhPSAwKQorCQkJICBmcHJpbnRmIChmcCwgIiVzOiV1IiwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOworCQkJZWxzZQorCQkJICBsZmluZm8gKGZwLCAiJXMoJXMrMHgldikiLCBmaWxlbmFtZSwgc2VjdGlvbi0+bmFtZSwKKwkJCQkgIG9mZnNldCk7CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKGZpbGVuYW1lID09IE5VTEwKKwkJCSAgICAgfHwgc3RyY21wIChmaWxlbmFtZSwgYWJmZC0+ZmlsZW5hbWUpID09IDApCisJCSAgICAgIHsKKwkJCWxmaW5mbyAoZnAsICIlQiglcysweCV2KSIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsCisJCQkJb2Zmc2V0KTsKKwkJCWlmIChsaW5lbnVtYmVyICE9IDApCisJCQkgIGxmaW5mbyAoZnAsICI6JXUiLCBsaW5lbnVtYmVyKTsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAobGluZW51bWJlciAhPSAwKSAKKwkJICAgICAgbGZpbmZvIChmcCwgIiVCOiVzOiV1IiwgYWJmZCwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOworCQkgICAgZWxzZQorCQkgICAgICBsZmluZm8gKGZwLCAiJUIoJXMrMHgldik6JXMiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLAorCQkJICAgICAgb2Zmc2V0LCBmaWxlbmFtZSk7CisJCSAgfQorCQllbHNlCisJCSAgbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwgb2Zmc2V0KTsKKworCQlpZiAoZGlzY2FyZF9sYXN0KQorCQkgIHsKKwkJICAgIGxhc3RfYmZkID0gTlVMTDsKKwkJICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKKwkJICAgICAgeworCQkJZnJlZSAobGFzdF9maWxlKTsKKwkJCWxhc3RfZmlsZSA9IE5VTEw7CisJCSAgICAgIH0KKwkJICAgIGlmIChsYXN0X2Z1bmN0aW9uICE9IE5VTEwpCisJCSAgICAgIHsKKwkJCWZyZWUgKGxhc3RfZnVuY3Rpb24pOworCQkJbGFzdF9mdW5jdGlvbiA9IE5VTEw7CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCQkKKwkgICAgY2FzZSAncyc6CisJICAgICAgLyogYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYgKi8KKwkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgdmFfYXJnIChhcmcsIGNoYXIgKikpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ2QnOgorCSAgICAgIC8qIGludGVnZXIsIGxpa2UgcHJpbnRmICovCisJICAgICAgZnByaW50ZiAoZnAsICIlZCIsIHZhX2FyZyAoYXJnLCBpbnQpKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICd1JzoKKwkgICAgICAvKiB1bnNpZ25lZCBpbnRlZ2VyLCBsaWtlIHByaW50ZiAqLworCSAgICAgIGZwcmludGYgKGZwLCAiJXUiLCB2YV9hcmcgKGFyZywgdW5zaWduZWQgaW50KSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChmYXRhbCA9PSB0cnVlKSAKKyAgICB4ZXhpdCgxKTsKK30KKworLyogRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gc3Rkb3V0LiAqLworCisvKiAoWW91IHdvdWxkIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBqdXN0ICJpbmZvIiwgYnV0IHRoZW4geW91CisgICB3b3VsZCBob3NlZCBieSBMeW54T1MsIHdoaWNoIGRlZmluZXMgdGhhdCBuYW1lIGluIGl0cyBsaWJjLikgICovCisKK3ZvaWQKKyNpZiBVU0VfU1REQVJHCitpbmZvX21zZyAoY29uc3QgY2hhciAqZm10LCAuLi4pCisjZWxzZQoraW5mb19tc2cgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZzsKKworI2lmICEgVVNFX1NUREFSRworICBjb25zdCBjaGFyICpmbXQ7CisKKyAgdmFfc3RhcnQgKGFyZyk7CisgIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZywgZm10KTsKKyNlbmRpZgorCisgIHZmaW5mbyAoc3Rkb3V0LCBmbXQsIGFyZyk7CisgIHZhX2VuZCAoYXJnKTsKK30KKworLyogKCdlJyBmb3IgZXJyb3IuKSBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBzdGRlcnIuICovCisKK3ZvaWQKKyNpZiBVU0VfU1REQVJHCitlaW5mbyAoY29uc3QgY2hhciAqZm10LCAuLi4pCisjZWxzZQorZWluZm8gKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZzsKKworI2lmICEgVVNFX1NUREFSRworICBjb25zdCBjaGFyICpmbXQ7CisKKyAgdmFfc3RhcnQgKGFyZyk7CisgIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZywgZm10KTsKKyNlbmRpZgorCisgIHZmaW5mbyAoc3RkZXJyLCBmbXQsIGFyZyk7CisgIHZhX2VuZCAoYXJnKTsKK30KKwordm9pZCAKK2luZm9fYXNzZXJ0IChmaWxlLCBsaW5lKQorICAgICBjb25zdCBjaGFyICpmaWxlOworICAgICB1bnNpZ25lZCBpbnQgbGluZTsKK3sKKyAgZWluZm8gKF8oIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iKSwgZmlsZSwgbGluZSk7Cit9CisKK2NoYXIgKgorYnV5c3RyaW5nICh4KQorICAgICBDT05TVCBjaGFyICpDT05TVCB4OworeworICBzaXplX3QgbCA9IHN0cmxlbih4KSsxOworICBjaGFyICpyID0geG1hbGxvYyhsKTsKKyAgbWVtY3B5KHIsIHgsbCk7CisgIHJldHVybiByOworfQorCisvKiAoJ20nIGZvciBtYXApIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIG1hcC4gKi8KKwordm9pZAorI2lmIFVTRV9TVERBUkcKK21pbmZvIChjb25zdCBjaGFyICpmbXQsIC4uLikKKyNlbHNlCittaW5mbyAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnOworCisjaWYgISBVU0VfU1REQVJHCisgIGNvbnN0IGNoYXIgKmZtdDsKKyAgdmFfc3RhcnQgKGFyZyk7CisgIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZywgZm10KTsKKyNlbmRpZgorCisgIHZmaW5mbyAoY29uZmlnLm1hcF9maWxlLCBmbXQsIGFyZyk7CisgIHZhX2VuZCAoYXJnKTsKK30KKwordm9pZAorI2lmIFVTRV9TVERBUkcKK2xmaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCisjZWxzZQorbGZpbmZvICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmc7CisKKyNpZiAhIFVTRV9TVERBUkcKKyAgRklMRSAqZmlsZTsKKyAgY29uc3QgY2hhciAqZm10OworCisgIHZhX3N0YXJ0IChhcmcpOworICBmaWxlID0gdmFfYXJnIChhcmcsIEZJTEUgKik7CisgIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZywgZm10KTsKKyNlbmRpZgorCisgIHZmaW5mbyAoZmlsZSwgZm10LCBhcmcpOworICB2YV9lbmQgKGFyZyk7Cit9CisMCisvKiBGdW5jdGlvbnMgdG8gcHJpbnQgdGhlIGxpbmsgbWFwLiAgKi8KKwordm9pZCAKK3ByaW50X3NwYWNlICgpCit7CisgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiAiKTsKK30KKwordm9pZCAKK3ByaW50X25sICgpCit7CisgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlxuIik7Cit9CmRpZmYgLS1naXQgYS9sZC9sZG1pc2MuaCBiL2xkL2xkbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjNiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZG1pc2MuaApAQCAtMCwwICsxLDU2IEBACisvKiBsZG1pc2MuaCAtCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCisgICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgTERNSVNDX0gKKyNkZWZpbmUgTERNSVNDX0gKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZWluZm8gUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKK2V4dGVybiB2b2lkIG1pbmZvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7CitleHRlcm4gdm9pZCBpbmZvX21zZyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOworZXh0ZXJuIHZvaWQgbGZpbmZvIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKKyNlbHNlCisvKiBWQVJBUkdTKi8KK2V4dGVybiB2b2lkIGVpbmZvICgpOworLyogVkFSQVJHUyovCitleHRlcm4gdm9pZCBtaW5mbyAoKTsKKy8qIFZBUkFSR1MqLworZXh0ZXJuIHZvaWQgaW5mb19tc2cgKCk7CisvKlZBUkFSR1MqLworZXh0ZXJuIHZvaWQgbGZpbmZvICgpOworI2VuZGlmCisKK2V4dGVybiB2b2lkIGluZm9fYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KSk7CitleHRlcm4gdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworZXh0ZXJuIFBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworZXh0ZXJuIHZvaWQgeGV4aXQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gY2hhciAqYnV5c3RyaW5nIFBBUkFNUyAoKENPTlNUIGNoYXIgKkNPTlNUKSk7CisKKyNkZWZpbmUgQVNTRVJUKHgpIFwKK2RvIHsgaWYgKCEoeCkpIGluZm9fYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGQUlMKCkgXAorZG8geyBpbmZvX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0gd2hpbGUgKDApCisKK2V4dGVybiB2b2lkIHByaW50X3NwYWNlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIHByaW50X25sIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBjaGFyICpkZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZHZlci5jIGIvbGQvbGR2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYwMGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGR2ZXIuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBsZHZlci5jIC0tIFByaW50IGxpbmtlciB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkdmVyLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisKK2NvbnN0IGNoYXIgKmxkX3Byb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047CisKK3ZvaWQKK2xkdmVyc2lvbiAobm9pc3kpCisgICAgIGludCBub2lzeTsKK3sKKyAgZnByaW50ZiAoc3Rkb3V0LCBfKCJHTlUgbGQgdmVyc2lvbiAlcyAod2l0aCBCRkQgJXMpXG4iKSwKKwkgICBsZF9wcm9ncmFtX3ZlcnNpb24sIEJGRF9WRVJTSU9OKTsKKworICBpZiAobm9pc3kpIAorICAgIHsKKyAgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKipwdHIgPSBsZF9lbXVsYXRpb25zOworICAgIAorICAgICAgcHJpbnRmIChfKCIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIikpOworICAgICAgd2hpbGUgKCpwdHIpIAorCXsKKwkgIHByaW50ZiAoIiAgICVzXG4iLCAoKnB0ciktPmVtdWxhdGlvbl9uYW1lKTsKKwkgIHB0cisrOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sZC9sZHZlci5oIGIvbGQvbGR2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTdiNmJjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGR2ZXIuaApAQCAtMCwwICsxLDIyIEBACisvKiBsZHZlci5oIC0tIEhlYWRlciBmaWxlIGZvciBsZHZlci5jLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitleHRlcm4gY29uc3QgY2hhciAqbGRfcHJvZ3JhbV92ZXJzaW9uOworCit2b2lkIGxkdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKZGlmZiAtLWdpdCBhL2xkL2xkd3JpdGUuYyBiL2xkL2xkd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYxMTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbGR3cml0ZS5jCkBAIC0wLDAgKzEsNTMwIEBACisvKiBsZHdyaXRlLmMgLS0gd3JpdGUgb3V0IHRoZSBsaW5rZWQgZmlsZQorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc2FjQGN5Z251cy5jb20KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImJmZGxpbmsuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZHdyaXRlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisKK3N0YXRpYyB2b2lkIGJ1aWxkX2xpbmtfb3JkZXIgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgYXNlY3Rpb24gKmNsb25lX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGludCAqKSk7CitzdGF0aWMgdm9pZCBzcGxpdF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOworCisvKiBCdWlsZCBsaW5rX29yZGVyIHN0cnVjdHVyZXMgZm9yIHRoZSBCRkQgbGlua2VyLiAgKi8KKworc3RhdGljIHZvaWQKK2J1aWxkX2xpbmtfb3JkZXIgKHN0YXRlbWVudCkKKyAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqc3RhdGVtZW50OworeworICBzd2l0Y2ggKHN0YXRlbWVudC0+aGVhZGVyLnR5cGUpCisgICAgeworICAgIGNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgorICAgICAgeworCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKwlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisJYmZkX3ZtYSB2YWx1ZTsKKwlib29sZWFuIGJpZ19lbmRpYW4gPSBmYWxzZTsKKworCW91dHB1dF9zZWN0aW9uID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbjsKKwlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKKworCWxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKKwlpZiAobGlua19vcmRlciA9PSBOVUxMKQorCSAgZWluZm8gKF8oIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIpKTsKKworCWxpbmtfb3JkZXItPnR5cGUgPSBiZmRfZGF0YV9saW5rX29yZGVyOworCWxpbmtfb3JkZXItPm9mZnNldCA9IHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQub3V0cHV0X3ZtYTsKKwlsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoUVVBRF9TSVpFKTsKKworCXZhbHVlID0gc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC52YWx1ZTsKKworCS8qIElmIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBvdXRwdXQgQkZEIGlzIG5vdCBrbm93biwgdGhlbiB3ZQorCSAgIGJhc2UgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGRhdGEgb24gdGhlIGZpcnN0IGlucHV0IGZpbGUuCisJICAgQnkgY29udmVudGlvbiwgdGhlIGJmZF9wdXQgcm91dGluZXMgZm9yIGFuIHVua25vd24KKwkgICBlbmRpYW5uZXNzIGFyZSBiaWcgZW5kaWFuLCBzbyB3ZSBtdXN0IHN3YXAgaGVyZSBpZiB0aGUKKwkgICBpbnB1dCBmaWxlIGlzIGxpdHRsZSBlbmRpYW4uICAqLworCWlmIChiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCisJICBiaWdfZW5kaWFuID0gdHJ1ZTsKKwllbHNlIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAob3V0cHV0X2JmZCkpCisJICBiaWdfZW5kaWFuID0gZmFsc2U7CisJZWxzZQorCSAgeworCSAgICBib29sZWFuIHN3YXA7CisKKwkgICAgc3dhcCA9IGZhbHNlOworCSAgICBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fQklHKQorCSAgICAgIGJpZ19lbmRpYW4gPSB0cnVlOworCSAgICBlbHNlIGlmIChjb21tYW5kX2xpbmUuZW5kaWFuID09IEVORElBTl9MSVRUTEUpCisJICAgICAgeworCQliaWdfZW5kaWFuID0gZmFsc2U7CisJCXN3YXAgPSB0cnVlOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fVU5TRVQpCisJICAgICAgeworCQliaWdfZW5kaWFuID0gdHJ1ZTsKKwkJeworCQkgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChzKQorCQkgICAgeworCQkgICAgICBpZiAocy0+dGhlX2JmZCAhPSBOVUxMKQorCQkJeworCQkJICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKHMtPnRoZV9iZmQpKQorCQkJICAgIHsKKwkJCSAgICAgIGJpZ19lbmRpYW4gPSBmYWxzZTsKKwkJCSAgICAgIHN3YXAgPSB0cnVlOworCQkJICAgIH0KKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgICB9CisKKwkgICAgaWYgKHN3YXApCisJICAgICAgeworCQliZmRfYnl0ZSBidWZmZXJbOF07CisKKwkJc3dpdGNoIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUpCisJCSAgeworCQkgIGNhc2UgUVVBRDoKKwkJICBjYXNlIFNRVUFEOgorCQkgICAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPj0gUVVBRF9TSVpFKQorCQkgICAgICB7CisJCQliZmRfcHV0bDY0ICh2YWx1ZSwgYnVmZmVyKTsKKwkJCXZhbHVlID0gYmZkX2dldGI2NCAoYnVmZmVyKTsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgICAvKiBGYWxsIHRocm91Z2guICAqLworCQkgIGNhc2UgTE9ORzoKKwkJICAgIGJmZF9wdXRsMzIgKHZhbHVlLCBidWZmZXIpOworCQkgICAgdmFsdWUgPSBiZmRfZ2V0YjMyIChidWZmZXIpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBTSE9SVDoKKwkJICAgIGJmZF9wdXRsMTYgKHZhbHVlLCBidWZmZXIpOworCQkgICAgdmFsdWUgPSBiZmRfZ2V0YjE2IChidWZmZXIpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBCWVRFOgorCQkgICAgYnJlYWs7CisJCSAgZGVmYXVsdDoKKwkJICAgIGFib3J0ICgpOworCQkgIH0KKwkgICAgICB9CisJICB9CisKKwlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKKwlzd2l0Y2ggKHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudHlwZSkKKwkgIHsKKwkgIGNhc2UgUVVBRDoKKwkgIGNhc2UgU1FVQUQ6CisJICAgIGlmIChzaXplb2YgKGJmZF92bWEpID49IFFVQURfU0laRSkKKwkgICAgICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJYmZkX3ZtYSBoaWdoOworCisJCWlmIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUgPT0gUVVBRCkKKwkJICBoaWdoID0gMDsKKwkJZWxzZSBpZiAoKHZhbHVlICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJICBoaWdoID0gMDsKKwkJZWxzZQorCQkgIGhpZ2ggPSAoYmZkX3ZtYSkgLTE7CisJCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGhpZ2gsCisJCQkgICAgKGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cworCQkJICAgICArIChiaWdfZW5kaWFuID8gMCA6IDQpKSk7CisJCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLAorCQkJICAgIChsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMKKwkJCSAgICAgKyAoYmlnX2VuZGlhbiA/IDQgOiAwKSkpOworCSAgICAgIH0KKwkgICAgbGlua19vcmRlci0+c2l6ZSA9IFFVQURfU0laRTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPTkc6CisJICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOworCSAgICBsaW5rX29yZGVyLT5zaXplID0gTE9OR19TSVpFOworCSAgICBicmVhazsKKwkgIGNhc2UgU0hPUlQ6CisJICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOworCSAgICBsaW5rX29yZGVyLT5zaXplID0gU0hPUlRfU0laRTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEJZVEU6CisJICAgIGJmZF9wdXRfOCAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7CisJICAgIGxpbmtfb3JkZXItPnNpemUgPSBCWVRFX1NJWkU7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYWJvcnQgKCk7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKKyAgICAgIHsKKwlsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyczsKKwlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247CisJc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOworCisJcnMgPSAmc3RhdGVtZW50LT5yZWxvY19zdGF0ZW1lbnQ7CisKKwlvdXRwdXRfc2VjdGlvbiA9IHJzLT5vdXRwdXRfc2VjdGlvbjsKKwlBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKKworCWxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKKwlpZiAobGlua19vcmRlciA9PSBOVUxMKQorCSAgZWluZm8gKF8oIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIpKTsKKworCWxpbmtfb3JkZXItPm9mZnNldCA9IHJzLT5vdXRwdXRfdm1hOworCWxpbmtfb3JkZXItPnNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJzLT5ob3d0byk7CisKKwlsaW5rX29yZGVyLT51LnJlbG9jLnAgPQorCSAgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MgKikKKwkgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYykpKTsKKworCWxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MgPSBycy0+cmVsb2M7CisJbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQgPSBycy0+YWRkZW5kX3ZhbHVlOworCisJaWYgKHJzLT5uYW1lID09IE5VTEwpCisJICB7CisJICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyOworCSAgICBpZiAocnMtPnNlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpCisJICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24gPSBycy0+c2VjdGlvbjsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24gPSBycy0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247CisJCWxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kICs9IHJzLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB7CisJICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXI7CisJICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lID0gcnMtPm5hbWU7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06CisgICAgICAvKiBDcmVhdGUgYSBuZXcgbGlua19vcmRlciBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGlzCisJIGF0dGFjaGVkICovCisgICAgICBpZiAoc3RhdGVtZW50LT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKKwl7CisJICBhc2VjdGlvbiAqaSA9IHN0YXRlbWVudC0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOworCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gaS0+b3V0cHV0X3NlY3Rpb247CisKKwkgIEFTU0VSVCAob3V0cHV0X3NlY3Rpb24tPm93bmVyID09IG91dHB1dF9iZmQpOworCisJICBpZiAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisKKwkgICAgICBsaW5rX29yZGVyID0gYmZkX25ld19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbik7CisKKwkgICAgICBpZiAoaS0+ZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKKwkJeworCQkgIC8qIFdlJ3ZlIGdvdCBhIG5ldmVyIGxvYWQgc2VjdGlvbiBpbnNpZGUgb25lIHdoaWNoCisJCSAgICAgaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB3ZSdsbCBjaGFuZ2UgaXQgaW50byBhCisJCSAgICAgZmlsbCBsaW5rX29yZGVyICovCisJCSAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9maWxsX2xpbmtfb3JkZXI7CisJCSAgbGlua19vcmRlci0+dS5maWxsLnZhbHVlID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjsKKwkJICBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24gPSBpOworCQkgIEFTU0VSVCAoaS0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOworCQl9CisJICAgICAgaWYgKGktPl9jb29rZWRfc2l6ZSkKKwkJbGlua19vcmRlci0+c2l6ZSA9IGktPl9jb29rZWRfc2l6ZTsKKwkgICAgICBlbHNlCisJCWxpbmtfb3JkZXItPnNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGkpOworCSAgICAgIGxpbmtfb3JkZXItPm9mZnNldCA9IGktPm91dHB1dF9vZmZzZXQ7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgorICAgICAgLyogTWFrZSBhIG5ldyBsaW5rX29yZGVyIHdpdGggdGhlIHJpZ2h0IGZpbGxlciAqLworICAgICAgeworCWFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKKwlzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7CisKKwlvdXRwdXRfc2VjdGlvbiA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb247CisJQVNTRVJUIChzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uLT5vd25lcgorCQk9PSBvdXRwdXRfYmZkKTsKKwlpZiAoKG91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCisJICB7CisJICAgIGxpbmtfb3JkZXIgPSBiZmRfbmV3X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uKTsKKwkgICAgbGlua19vcmRlci0+dHlwZSA9IGJmZF9maWxsX2xpbmtfb3JkZXI7CisJICAgIGxpbmtfb3JkZXItPnNpemUgPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7CisJICAgIGxpbmtfb3JkZXItPm9mZnNldCA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldDsKKwkgICAgbGlua19vcmRlci0+dS5maWxsLnZhbHVlID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5maWxsOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogQWxsIHRoZSBvdGhlciBvbmVzIGZhbGwgdGhyb3VnaCAqLworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBDYWxsIEJGRCB0byB3cml0ZSBvdXQgdGhlIGxpbmtlZCBmaWxlLiAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBXYW5kZXIgYXJvdW5kIHRoZSBpbnB1dCBzZWN0aW9ucywgbWFrZSBzdXJlIHRoYXQKKyAgIHdlJ2xsIG5ldmVyIHRyeSBhbmQgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggbW9yZSByZWxvY3MKKyAgIHRoYW4gd2lsbCBmaXQuLiBEbyB0aGlzIGJ5IGFsd2F5cyBhc3N1bWluZyB0aGUgd29yc3QgY2FzZSwgYW5kCisgICBjcmVhdGluZyBuZXcgb3V0cHV0IHNlY3Rpb25zIHdpdGggYWxsIHRoZSByaWdodCBiaXRzICovCisjZGVmaW5lIFRFU1RJVCAxCitzdGF0aWMgYXNlY3Rpb24gKgorY2xvbmVfc2VjdGlvbiAoYWJmZCwgcywgY291bnQpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnM7CisgICAgIGludCAqY291bnQ7Cit7CisjZGVmaW5lIFNTSVpFIDgKKyAgY2hhciBzbmFtZVtTU0laRV07CQkvKiA/PyAgZmluZCB0aGUgbmFtZSBmb3IgdGhpcyBzaXplICovCisgIGFzZWN0aW9uICpuOworICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKyAgLyogSW52ZW50IGEgc2VjdGlvbiBuYW1lIC0gdXNlIGZpcnN0IGZpdmUKKyAgICAgY2hhcnMgb2YgYmFzZSBzZWN0aW9uIG5hbWUgYW5kIGEgZGlnaXQgc3VmZml4ICovCisgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICBjaGFyIGJbNl07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChiKSAtIDEgJiYgcy0+bmFtZVtpXTsgaSsrKQorCWJbaV0gPSBzLT5uYW1lW2ldOworICAgICAgYltpXSA9IDA7CisgICAgICBzcHJpbnRmIChzbmFtZSwgIiVzJWQiLCBiLCAoKmNvdW50KSsrKTsKKyAgICB9CisgIHdoaWxlIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc25hbWUpKTsKKworICBuID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIHhzdHJkdXAgKHNuYW1lKSk7CisKKyAgLyogQ3JlYXRlIGEgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgKi8KKworICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLAorCQkJICAgIHNuYW1lLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7CisgIGgtPnUuZGVmLnZhbHVlID0gMDsKKyAgaC0+dS5kZWYuc2VjdGlvbiA9IG4gICA7CisKKworICBuLT5mbGFncyA9IHMtPmZsYWdzOworICBuLT52bWEgPSBzLT52bWE7CisgIG4tPnVzZXJfc2V0X3ZtYSA9IHMtPnVzZXJfc2V0X3ZtYTsKKyAgbi0+bG1hID0gcy0+bG1hOworICBuLT5fY29va2VkX3NpemUgPSAwOworICBuLT5fcmF3X3NpemUgPSAwOworICBuLT5vdXRwdXRfb2Zmc2V0ID0gcy0+b3V0cHV0X29mZnNldDsKKyAgbi0+b3V0cHV0X3NlY3Rpb24gPSBuOworICBuLT5vcmVsb2NhdGlvbiA9IDA7CisgIG4tPnJlbG9jX2NvdW50ID0gMDsKKyAgbi0+YWxpZ25tZW50X3Bvd2VyID0gcy0+YWxpZ25tZW50X3Bvd2VyOworICByZXR1cm4gbjsKK30KKworI2lmIFRFU1RJTkcKK3N0YXRpYyB2b2lkIAorZHMgKHMpCisgICAgIGFzZWN0aW9uICpzOworeworICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmwgPSBzLT5saW5rX29yZGVyX2hlYWQ7CisgIHByaW50ZiAoInZtYSAleCBzaXplICV4XG4iLCBzLT52bWEsIHMtPl9yYXdfc2l6ZSk7CisgIHdoaWxlIChsKQorICAgIHsKKyAgICAgIGlmIChsLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCXsKKwkgIHByaW50ZiAoIiU4eCAlc1xuIiwgbC0+b2Zmc2V0LCBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyLT5maWxlbmFtZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByaW50ZiAoXygiJTh4IHNvbWV0aGluZyBlbHNlXG4iKSwgbC0+b2Zmc2V0KTsKKwl9CisgICAgICBsID0gbC0+bmV4dDsKKyAgICB9CisgIHByaW50ZiAoIlxuIik7Cit9CitkdW1wIChzLCBhMSwgYTIpCisgICAgIGNoYXIgKnM7CisgICAgIGFzZWN0aW9uICphMTsKKyAgICAgYXNlY3Rpb24gKmEyOworeworICBwcmludGYgKCIlc1xuIiwgcyk7CisgIGRzIChhMSk7CisgIGRzIChhMik7Cit9CisKK3N0YXRpYyB2b2lkIAorc2FuaXR5X2NoZWNrIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGFzZWN0aW9uICpzOworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOworICAgICAgYmZkX3ZtYSBwcmV2ID0gMDsKKyAgICAgIGZvciAocCA9IHMtPmxpbmtfb3JkZXJfaGVhZDsgcDsgcCA9IHAtPm5leHQpCisJeworCSAgaWYgKHAtPm9mZnNldCA+IDEwMDAwMCkKKwkgICAgYWJvcnQgKCk7CisJICBpZiAocC0+b2Zmc2V0IDwgcHJldikKKwkgICAgYWJvcnQgKCk7CisJICBwcmV2ID0gcC0+b2Zmc2V0OworCX0KKyAgICB9Cit9CisjZWxzZQorI2RlZmluZSBzYW5pdHlfY2hlY2soYSkKKyNkZWZpbmUgZHVtcChhLCBiLCBjKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIAorc3BsaXRfc2VjdGlvbnMgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGFzZWN0aW9uICpvcmlnaW5hbF9zZWM7CisgIGludCBuc2VjcyA9IGFiZmQtPnNlY3Rpb25fY291bnQ7CisgIHNhbml0eV9jaGVjayAoYWJmZCk7CisgIC8qIGxvb2sgdGhyb3VnaCBhbGwgdGhlIG9yaWdpbmFsIHNlY3Rpb25zICovCisgIGZvciAob3JpZ2luYWxfc2VjID0gYWJmZC0+c2VjdGlvbnM7CisgICAgICAgb3JpZ2luYWxfc2VjICYmIG5zZWNzOworICAgICAgIG9yaWdpbmFsX3NlYyA9IG9yaWdpbmFsX3NlYy0+bmV4dCwgbnNlY3MtLSkKKyAgICB7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGludCBjb3VudCA9IDA7CisgICAgICBpbnQgbGluZXMgPSAwOworICAgICAgaW50IHJlbG9jcyA9IDA7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKipwcDsKKyAgICAgIGJmZF92bWEgdm1hID0gb3JpZ2luYWxfc2VjLT52bWE7CisgICAgICBiZmRfdm1hIHNoaWZ0X29mZnNldCA9IDA7CisgICAgICBhc2VjdGlvbiAqY3Vyc29yID0gb3JpZ2luYWxfc2VjOworCisgICAgICAvKiBjb3VudCB1cCB0aGUgcmVsb2NhdGlvbnMgYW5kIGxpbmUgZW50cmllcyB0byBzZWUgaWYKKwkgYW55dGhpbmcgd291bGQgYmUgdG9vIGJpZyB0byBmaXQgKi8KKyAgICAgIGZvciAocHAgPSAmKGN1cnNvci0+bGlua19vcmRlcl9oZWFkKTsgKnBwOyBwcCA9ICYoKCpwcCktPm5leHQpKQorCXsKKwkgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcCA9ICpwcDsKKwkgIGludCB0aGlzbGluZXMgPSAwOworCSAgaW50IHRoaXNyZWxvY3MgPSAwOworCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCisJICAgIHsKKwkgICAgICBhc2VjdGlvbiAqc2VjOworCisJICAgICAgc2VjID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOworCisJICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUKKwkJICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lKQorCQl0aGlzbGluZXMgPSBzZWMtPmxpbmVub19jb3VudDsKKworCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCisJCXRoaXNyZWxvY3MgPSBzZWMtPnJlbG9jX2NvdW50OworCisJICAgIH0KKwkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQorCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCisJCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCisJICAgIHRoaXNyZWxvY3MrKzsKKworCSAgaWYgKCEgZmlyc3QKKwkgICAgICAmJiAodGhpc3JlbG9jcyArIHJlbG9jcyA+IGNvbmZpZy5zcGxpdF9ieV9yZWxvYworCQkgIHx8IHRoaXNsaW5lcyArIGxpbmVzID4gY29uZmlnLnNwbGl0X2J5X3JlbG9jCisJCSAgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpKQorCSAgICB7CisJICAgICAgLyogY3JlYXRlIGEgbmV3IHNlY3Rpb24gYW5kIHB1dCB0aGlzIGxpbmsgb3JkZXIgYW5kIHRoZQorCQkgZm9sbG93aW5nIGxpbmsgb3JkZXJzIGludG8gaXQgKi8KKwkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmwgPSBwOworCSAgICAgIGFzZWN0aW9uICpuID0gY2xvbmVfc2VjdGlvbiAoYWJmZCwgY3Vyc29yLCAmY291bnQpOworCSAgICAgICpwcCA9IE5VTEw7CS8qIFNuaXAgb2ZmIGxpbmsgb3JkZXJzIGZyb20gb2xkIHNlY3Rpb24gKi8KKwkgICAgICBuLT5saW5rX29yZGVyX2hlYWQgPSBsOwkvKiBhdHRhY2ggdG8gbmV3IHNlY3Rpb24gKi8KKwkgICAgICBwcCA9ICZuLT5saW5rX29yZGVyX2hlYWQ7CisKKwkgICAgICAvKiBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHNlY3Rpb24gYW5kCisJCSB1cGRhdGUgdGhlIHZtYSBvZiB0aGUgbmV3IG9uZSAqLworCisJICAgICAgZHVtcCAoImJlZm9yZSBzbmlwIiwgY3Vyc29yLCBuKTsKKworCSAgICAgIG4tPl9yYXdfc2l6ZSA9IGN1cnNvci0+X3Jhd19zaXplIC0gbC0+b2Zmc2V0OworCSAgICAgIGN1cnNvci0+X3Jhd19zaXplID0gbC0+b2Zmc2V0OworCisJICAgICAgdm1hICs9IGN1cnNvci0+X3Jhd19zaXplOworCSAgICAgIG4tPmxtYSA9IG4tPnZtYSA9IHZtYTsKKworCSAgICAgIHNoaWZ0X29mZnNldCA9IGwtPm9mZnNldDsKKworCSAgICAgIC8qIHJ1biBkb3duIHRoZSBjaGFpbiBhbmQgY2hhbmdlIHRoZSBvdXRwdXQgc2VjdGlvbiB0bworCQkgdGhlIHJpZ2h0IG9uZSwgdXBkYXRlIHRoZSBvZmZzZXRzIHRvbyAqLworCisJICAgICAgd2hpbGUgKGwpCisJCXsKKwkJICBsLT5vZmZzZXQgLT0gc2hpZnRfb2Zmc2V0OworCQkgIGlmIChsLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQorCQkgICAgeworCQkgICAgICBsLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID0gbjsKKwkJICAgICAgbC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID0gbC0+b2Zmc2V0OworCQkgICAgfQorCQkgIGwgPSBsLT5uZXh0OworCQl9CisJICAgICAgZHVtcCAoImFmdGVyIHNuaXAiLCBjdXJzb3IsIG4pOworCSAgICAgIGN1cnNvciA9IG47CisJICAgICAgcmVsb2NzID0gdGhpc3JlbG9jczsKKwkgICAgICBsaW5lcyA9IHRoaXNsaW5lczsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVsb2NzICs9IHRoaXNyZWxvY3M7CisJICAgICAgbGluZXMgKz0gdGhpc2xpbmVzOworCSAgICB9CisKKwkgIGZpcnN0ID0gZmFsc2U7CisJfQorICAgIH0KKyAgc2FuaXR5X2NoZWNrIChhYmZkKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorbGR3cml0ZSAoKQoreworICAvKiBSZXNldCBlcnJvciBpbmRpY2F0b3IsIHdoaWNoIGNhbiB0eXBpY2FsbHkgc29tZXRoaW5nIGxpa2UgaW52YWxpZAorICAgICBmb3JtYXQgZnJvbSBvcGVubmluZyB1cCB0aGUgLm8gZmlsZXMgKi8KKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKKyAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGJ1aWxkX2xpbmtfb3JkZXIpOworCisgIGlmIChjb25maWcuc3BsaXRfYnlfcmVsb2MgfHwgY29uZmlnLnNwbGl0X2J5X2ZpbGUpCisgICAgc3BsaXRfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOworICBpZiAoIWJmZF9maW5hbF9saW5rIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKSkKKyAgICB7CisgICAgICAvKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVjb3JkZWQsIHByaW50IGl0IG91dC4gIE90aGVyd2lzZSBhc3N1bWUKKwkgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBsaWtlIHVua25vd24gc3ltYm9sIHdhcyBwcmludGVkCisJIG91dC4gICovCisKKyAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKKwllaW5mbyAoXygiJUYlUDogZmluYWwgbGluayBmYWlsZWQ6ICVFXG4iKSwgb3V0cHV0X2JmZCk7CisgICAgICBlbHNlCisJeGV4aXQoMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGQvbGR3cml0ZS5oIGIvbGQvbGR3cml0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDhiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZHdyaXRlLmgKQEAgLTAsMCArMSwyMCBAQAorLyogbGR3cml0ZS5oIC0KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCisgICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKK3ZvaWQgbGR3cml0ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9sZC9sZXhzdXAuYyBiL2xkL2xleHN1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTUwODcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9sZXhzdXAuYwpAQCAtMCwwICsxLDExNDAgQEAKKy8qIFBhcnNlIG9wdGlvbnMgZm9yIHRoZSBHTlUgbGlua2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKK0dMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGdyYW0uaCIKKyNpbmNsdWRlICJsZGxleC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkdmVyLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1IKKyNpZiBkZWZpbmVkIChfX01TRE9TX18pIHx8IChkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSkKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzsnCisjZWxzZQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKKyNlbmRpZgorI2VuZGlmCisKKy8qIFNvbWV3aGVyZSBhYm92ZSwgc3lzL3N0YXQuaCBnb3QgaW5jbHVkZWQgLiAuIC4gLiAqLworI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKKyNkZWZpbmUJU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNlbmRpZgorCisvKiBPbWl0IGFyZ3MgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGNsYXNoaW5nIHdpdGggYSBzeXN0ZW0gaGVhZGVyCisgICB0aGF0IG1pZ2h0IGRpc2FncmVlIGFib3V0IGNvbnN0cy4gICovCit1bnNpZ25lZCBsb25nIHN0cnRvdWwgKCk7CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2Rpcmxpc3QgUEFSQU1TICgoY2hhciAqZGlybGlzdF9wdHIpKTsKK3N0YXRpYyB2b2lkIHNldF9zZWN0aW9uX3N0YXJ0IFBBUkFNUyAoKGNoYXIgKnNlY3QsIGNoYXIgKnZhbHN0cikpOworc3RhdGljIHZvaWQgaGVscCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIE5vbi16ZXJvIGlmIHdlIGFyZSBwcm9jZXNzaW5nIGEgLS1kZWZzeW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KK2ludCBwYXJzaW5nX2RlZnN5bSA9IDA7CisKKy8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAorICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCisKKyNkZWZpbmUgT1BUSU9OX0FTU0VSVAkJCTE1MAorI2RlZmluZSBPUFRJT05fQ0FMTF9TSEFSRUQJCShPUFRJT05fQVNTRVJUICsgMSkKKyNkZWZpbmUgT1BUSU9OX0NSRUYJCQkoT1BUSU9OX0NBTExfU0hBUkVEICsgMSkKKyNkZWZpbmUgT1BUSU9OX0RFRlNZTQkJCShPUFRJT05fQ1JFRiArIDEpCisjZGVmaW5lIE9QVElPTl9ERU1BTkdMRQkJCShPUFRJT05fREVGU1lNICsgMSkKKyNkZWZpbmUgT1BUSU9OX0RZTkFNSUNfTElOS0VSCQkoT1BUSU9OX0RFTUFOR0xFICsgMSkKKyNkZWZpbmUgT1BUSU9OX0VCCQkJKE9QVElPTl9EWU5BTUlDX0xJTktFUiArIDEpCisjZGVmaW5lIE9QVElPTl9FTAkJCShPUFRJT05fRUIgKyAxKQorI2RlZmluZSBPUFRJT05fRU1CRURERURfUkVMT0NTCQkoT1BUSU9OX0VMICsgMSkKKyNkZWZpbmUgT1BUSU9OX0VYUE9SVF9EWU5BTUlDCQkoT1BUSU9OX0VNQkVEREVEX1JFTE9DUyArIDEpCisjZGVmaW5lIE9QVElPTl9IRUxQCQkJKE9QVElPTl9FWFBPUlRfRFlOQU1JQyArIDEpCisjZGVmaW5lIE9QVElPTl9JR05PUkUJCQkoT1BUSU9OX0hFTFAgKyAxKQorI2RlZmluZSBPUFRJT05fTUFQCQkJKE9QVElPTl9JR05PUkUgKyAxKQorI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJCShPUFRJT05fTUFQICsgMSkKKyNkZWZpbmUgT1BUSU9OX05PX0tFRVBfTUVNT1JZCQkoT1BUSU9OX05PX0RFTUFOR0xFICsgMSkKKyNkZWZpbmUgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0gJCShPUFRJT05fTk9fS0VFUF9NRU1PUlkgKyAxKQorI2RlZmluZSBPUFRJT05fTk9JTkhJQklUX0VYRUMJCShPUFRJT05fTk9fV0FSTl9NSVNNQVRDSCArIDEpCisjZGVmaW5lIE9QVElPTl9OT05fU0hBUkVECQkoT1BUSU9OX05PSU5ISUJJVF9FWEVDICsgMSkKKyNkZWZpbmUgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkUJCShPUFRJT05fTk9OX1NIQVJFRCArIDEpCisjZGVmaW5lIE9QVElPTl9PRk9STUFUCQkJKE9QVElPTl9OT19XSE9MRV9BUkNISVZFICsgMSkKKyNkZWZpbmUgT1BUSU9OX1JFTEFYCQkJKE9QVElPTl9PRk9STUFUICsgMSkKKyNkZWZpbmUgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEUJKE9QVElPTl9SRUxBWCArIDEpCisjZGVmaW5lIE9QVElPTl9SUEFUSAkJCShPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRSArIDEpCisjZGVmaW5lIE9QVElPTl9SUEFUSF9MSU5LCQkoT1BUSU9OX1JQQVRIICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NIQVJFRAkJCShPUFRJT05fUlBBVEhfTElOSyArIDEpCisjZGVmaW5lIE9QVElPTl9TT05BTUUJCQkoT1BUSU9OX1NIQVJFRCArIDEpCisjZGVmaW5lIE9QVElPTl9TT1JUX0NPTU1PTgkJKE9QVElPTl9TT05BTUUgKyAxKQorI2RlZmluZSBPUFRJT05fU1RBVFMJCQkoT1BUSU9OX1NPUlRfQ09NTU9OICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NZTUJPTElDCQkJKE9QVElPTl9TVEFUUyArIDEpCisjZGVmaW5lIE9QVElPTl9UQVNLX0xJTksJCShPUFRJT05fU1lNQk9MSUMgKyAxKQorI2RlZmluZSBPUFRJT05fVEJTUwkJCShPUFRJT05fVEFTS19MSU5LICsgMSkKKyNkZWZpbmUgT1BUSU9OX1REQVRBCQkJKE9QVElPTl9UQlNTICsgMSkKKyNkZWZpbmUgT1BUSU9OX1RURVhUCQkJKE9QVElPTl9UREFUQSArIDEpCisjZGVmaW5lIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQJKE9QVElPTl9UVEVYVCArIDEpCisjZGVmaW5lIE9QVElPTl9VUgkJCShPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUICsgMSkKKyNkZWZpbmUgT1BUSU9OX1ZFUkJPU0UJCQkoT1BUSU9OX1VSICsgMSkKKyNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCQkoT1BUSU9OX1ZFUkJPU0UgKyAxKQorI2RlZmluZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQJCShPUFRJT05fVkVSU0lPTiArIDEpCisjZGVmaW5lIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTgkoT1BUSU9OX1ZFUlNJT05fU0NSSVBUICsgMSkKKyNkZWZpbmUgT1BUSU9OX1dBUk5fQ09NTU9OCQkoT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OICsgMSkKKyNkZWZpbmUgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTCShPUFRJT05fV0FSTl9DT01NT04gKyAxKQorI2RlZmluZSBPUFRJT05fV0FSTl9NVUxUSVBMRV9HUAkJKE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUyArIDEpCisjZGVmaW5lIE9QVElPTl9XQVJOX09OQ0UJCShPUFRJT05fV0FSTl9NVUxUSVBMRV9HUCArIDEpCisjZGVmaW5lIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04JKE9QVElPTl9XQVJOX09OQ0UgKyAxKQorI2RlZmluZSBPUFRJT05fU1BMSVRfQllfUkVMT0MJCShPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NQTElUX0JZX0ZJTEUgCSAgICAJKE9QVElPTl9TUExJVF9CWV9SRUxPQyArIDEpCisjZGVmaW5lIE9QVElPTl9XSE9MRV9BUkNISVZFCQkoT1BUSU9OX1NQTElUX0JZX0ZJTEUgKyAxKQorI2RlZmluZSBPUFRJT05fV1JBUAkJCShPUFRJT05fV0hPTEVfQVJDSElWRSArIDEpCisjZGVmaW5lIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYCQkoT1BUSU9OX1dSQVAgKyAxKQorI2RlZmluZSBPUFRJT05fR0NfU0VDVElPTlMJCShPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCArIDEpCisjZGVmaW5lIE9QVElPTl9OT19HQ19TRUNUSU9OUwkJKE9QVElPTl9HQ19TRUNUSU9OUyArIDEpCisjZGVmaW5lIE9QVElPTl9DSEVDS19TRUNUSU9OUwkJKE9QVElPTl9OT19HQ19TRUNUSU9OUyArIDEpCisjZGVmaW5lIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUwkoT1BUSU9OX0NIRUNLX1NFQ1RJT05TICsgMSkKKyNkZWZpbmUgT1BUSU9OX01QQzg2MEMwICAgICAgICAgICAgICAgICAoT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TICsgMSkKKyNkZWZpbmUgT1BUSU9OX05PX1VOREVGSU5FRAkJKE9QVElPTl9NUEM4NjBDMCArIDEpCisKKy8qIFRoZSBsb25nIG9wdGlvbnMuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHRoZSBvcHRpb24KKyAgIHBhcnNpbmcgYW5kIHRoZSBoZWxwIHRleHQuICAqLworCitzdHJ1Y3QgbGRfb3B0aW9uCit7CisgIC8qIFRoZSBsb25nIG9wdGlvbiBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCBvcHRpb24gb3B0OworICAvKiBUaGUgc2hvcnQgb3B0aW9uIHdpdGggdGhlIHNhbWUgbWVhbmluZyAoJ1wwJyBpZiBub25lKS4gICovCisgIGNoYXIgc2hvcnRvcHQ7CisgIC8qIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCAoTlVMTCBpZiBub25lKS4gICovCisgIGNvbnN0IGNoYXIgKmFyZzsKKyAgLyogVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGlzIGlzIGEgc3lub255bSBmb3IKKyAgICAgdGhlIHByZXZpb3VzIG9wdGlvbi4gICovCisgIGNvbnN0IGNoYXIgKmRvYzsKKyAgZW51bQorICAgIHsKKyAgICAgIC8qIFVzZSBvbmUgZGFzaCBiZWZvcmUgbG9uZyBvcHRpb24gbmFtZS4gICovCisgICAgICBPTkVfREFTSCwKKyAgICAgIC8qIFVzZSB0d28gZGFzaGVzIGJlZm9yZSBsb25nIG9wdGlvbiBuYW1lLiAgKi8KKyAgICAgIFRXT19EQVNIRVMsCisgICAgICAvKiBEb24ndCBtZW50aW9uIHRoaXMgb3B0aW9uIGluIC0taGVscCBvdXRwdXQuICAqLworICAgICAgTk9fSEVMUAorICAgIH0gY29udHJvbDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRfb3B0aW9uIGxkX29wdGlvbnNbXSA9Cit7CisgIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKKyAgICAgICdhJywgTl8oIktFWVdPUkQiKSwgTl8oIlNoYXJlZCBsaWJyYXJ5IGNvbnRyb2wgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkiKSwKKyAgICAgIE9ORV9EQVNIIH0sCisgIHsgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0EnfSwKKyAgICAgICdBJywgTl8oIkFSQ0giKSwgTl8oIlNldCBhcmNoaXRlY3R1cmUiKSAsIFRXT19EQVNIRVMgfSwKKyAgeyB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAorICAgICAgJ2InLCBOXygiVEFSR0VUIiksIE5fKCJTcGVjaWZ5IHRhcmdldCBmb3IgZm9sbG93aW5nIGlucHV0IGZpbGVzIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Im1yaS1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKKyAgICAgICdjJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgTVJJIGZvcm1hdCBsaW5rZXIgc2NyaXB0IiksIFRXT19EQVNIRVMgfSwKKyAgeyB7ImRjIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCisgICAgICAnZCcsIE5VTEwsIE5fKCJGb3JjZSBjb21tb24gc3ltYm9scyB0byBiZSBkZWZpbmVkIiksIE9ORV9EQVNIIH0sCisgIHsgeyJkcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAorICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKKyAgeyB7ImVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCisgICAgICAnZScsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgc3RhcnQgYWRkcmVzcyIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJleHBvcnQtZHluYW1pYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0RZTkFNSUN9LAorICAgICAgJ0UnLCBOVUxMLCBOXygiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGJpZy1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAorICB7IHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAorICB7IHsiYXV4aWxpYXJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCisgICAgICAnZicsIE5fKCJTSExJQiIpLCBOXygiQXV4aWxpYXJ5IGZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwKKyAgICAgIFRXT19EQVNIRVMgfSwKKyAgeyB7ImZpbHRlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRid9LAorICAgICAgJ0YnLCBOXygiU0hMSUIiKSwgTl8oIkZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwgVFdPX0RBU0hFUyB9LAorICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCisgICAgICAnZycsIE5VTEwsIE5fKCJJZ25vcmVkIiksIE9ORV9EQVNIIH0sCisgIHsgeyJncHNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0cnfSwKKyAgICAgICdHJywgTl8oIlNJWkUiKSwgTl8oIlNtYWxsIGRhdGEgc2l6ZSAoaWYgbm8gc2l6ZSwgc2FtZSBhcyAtLXNoYXJlZCkiKSwKKyAgICAgIFRXT19EQVNIRVMgfSwKKyAgeyB7InNvbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU09OQU1FfSwKKyAgICAgICdoJywgTl8oIkZJTEVOQU1FIiksIE5fKCJTZXQgaW50ZXJuYWwgbmFtZSBvZiBzaGFyZWQgbGlicmFyeSIpLCBPTkVfREFTSCB9LAorICB7IHsibGlicmFyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAorICAgICAgJ2wnLCBOXygiTElCTkFNRSIpLCBOXygiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsibGlicmFyeS1wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdMJ30sCisgICAgICAnTCcsIE5fKCJESVJFQ1RPUlkiKSwgTl8oIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBUV09fREFTSEVTIH0sCisgIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKKyAgICAgICdtJywgTl8oIkVNVUxBVElPTiIpLCBOXygiU2V0IGVtdWxhdGlvbiIpLCBPTkVfREFTSCB9LAorICB7IHsicHJpbnQtbWFwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCisgICAgICAnTScsIE5VTEwsIE5fKCJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsibm1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCisgICAgICAnbicsIE5VTEwsIE5fKCJEbyBub3QgcGFnZSBhbGlnbiBkYXRhIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Im9tYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTid9LAorICAgICAgJ04nLCBOVUxMLCBOXygiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSwgZG8gbm90IG1ha2UgdGV4dCByZWFkb25seSIpLAorICAgICAgVFdPX0RBU0hFUyB9LAorICB7IHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJ30sCisgICAgICAnbycsIE5fKCJGSUxFIiksIE5fKCJTZXQgb3V0cHV0IGZpbGUgbmFtZSIpLCBUV09fREFTSEVTIH0sCisgIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKKyAgICAgICdPJywgTlVMTCwgTl8oIk9wdGltaXplIG91dHB1dCBmaWxlIiksIE9ORV9EQVNIIH0sCisgIHsgeyJReSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJJZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKKyAgeyB7InJlbG9jYXRlYWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAorICAgICAgJ3InLCBOVUxMLCBOXygiR2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCIpLCBUV09fREFTSEVTIH0sCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKKyAgICAgICdpJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKKyAgeyB7Imp1c3Qtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUid9LAorICAgICAgJ1InLCBOXygiRklMRSIpLCBOXygiSnVzdCBsaW5rIHN5bWJvbHMgKGlmIGRpcmVjdG9yeSwgc2FtZSBhcyAtLXJwYXRoKSIpLAorICAgICAgVFdPX0RBU0hFUyB9LAorICB7IHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCisgICAgICAncycsIE5VTEwsIE5fKCJTdHJpcCBhbGwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAorICAgICAgJ1MnLCBOVUxMLCBOXygiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsidHJhY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKKyAgICAgICd0JywgTlVMTCwgTl8oIlRyYWNlIGZpbGUgb3BlbnMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsic2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdUJ30sCisgICAgICAnVCcsIE5fKCJGSUxFIiksIE5fKCJSZWFkIGxpbmtlciBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsidW5kZWZpbmVkIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd1J30sCisgICAgICAndScsIE5fKCJTWU1CT0wiKSwgTl8oIlN0YXJ0IHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsiVXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VSfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJCdWlsZCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0YWJsZXMiKSwgT05FX0RBU0ggfSwKKyAgeyB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAorICAgICAgJ3YnLCBOVUxMLCBOXygiUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiIpLCBUV09fREFTSEVTIH0sCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKKyAgICAgICdWJywgTlVMTCwgTl8oIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIpLCBPTkVfREFTSCB9LAorICB7IHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKKyAgICAgICd4JywgTlVMTCwgTl8oIkRpc2NhcmQgYWxsIGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1gnfSwKKyAgICAgICdYJywgTlVMTCwgTl8oIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsidHJhY2Utc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd5J30sCisgICAgICAneScsIE5fKCJTWU1CT0wiKSwgTl8oIlRyYWNlIG1lbnRpb25zIG9mIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCisgIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKKyAgICAgICdZJywgTl8oIlBBVEgiKSwgTl8oIkRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAorICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCisgICAgICAneicsIE5fKCJLRVlXT1JEIiksIE5fKCJJZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKKyAgeyB7InN0YXJ0LWdyb3VwIiwgbm9fYXJndW1lbnQsIE5VTEwsICcoJ30sCisgICAgICAnKCcsIE5VTEwsIE5fKCJTdGFydCBhIGdyb3VwIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7ImVuZC1ncm91cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnKSd9LAorICAgICAgJyknLCBOVUxMLCBOXygiRW5kIGEgZ3JvdXAiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsiYXNzZXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU1NFUlR9LAorICAgICAgJ1wwJywgTl8oIktFWVdPUkQiKSwgTl8oIklnbm9yZWQgZm9yIFN1bk9TIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKKyAgeyB7IkJkeW5hbWljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCisgICAgICAnXDAnLCBOVUxMLCBOXygiTGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKKyAgeyB7ImR5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCisgICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAorICB7IHsiY2FsbF9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKKyAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCisgIHsgeyJCc3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKKyAgeyB7ImRuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKKyAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCisgIHsgeyJub25fc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKKyAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCisgIHsgeyJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAorICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKKyAgeyB7IkJzeW1ib2xpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1lNQk9MSUN9LAorICAgICAgJ1wwJywgTlVMTCwgTl8oIkJpbmQgZ2xvYmFsIHJlZmVyZW5jZXMgbG9jYWxseSIpLCBPTkVfREFTSCB9LAorICB7IHsiY2hlY2stc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NIRUNLX1NFQ1RJT05TfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJDaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMgKGRlZmF1bHQpIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Im5vLWNoZWNrLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19DSEVDS19TRUNUSU9OU30sCisgICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIpLAorICAgICAgVFdPX0RBU0hFUyB9LAorICB7IHsiY3JlZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ1JFRn0sCisgICAgICAnXDAnLCBOVUxMLCBOXygiT3V0cHV0IGNyb3NzIHJlZmVyZW5jZSB0YWJsZSIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJkZWZzeW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRlNZTX0sCisgICAgICAnXDAnLCBOXygiU1lNQk9MPUVYUFJFU1NJT04iKSwgTl8oIkRlZmluZSBhIHN5bWJvbCIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVNQU5HTEV9LAorICAgICAgJ1wwJywgTlVMTCwgTl8oIkRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJkeW5hbWljLWxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFlOQU1JQ19MSU5LRVJ9LAorICAgICAgJ1wwJywgTl8oIlBST0dSQU0iKSwgTl8oIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdXNlIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7ImVtYmVkZGVkLXJlbG9jcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU1CRURERURfUkVMT0NTfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiKSwgVFdPX0RBU0hFU30sCisgIHsgeyJmb3JjZS1leGUtc3VmZml4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJGb3JjZSBnZW5lcmF0aW9uIG9mIGZpbGUgd2l0aCAuZXhlIHN1ZmZpeCIpLCBUV09fREFTSEVTfSwKKyAgeyB7ImdjLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9HQ19TRUNUSU9OU30sCisgICAgICAnXDAnLCBOVUxMLCBOXygiUmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAob24gc29tZSB0YXJnZXRzKSIpLAorICAgICAgVFdPX0RBU0hFUyB9LAorICB7IHsibm8tZ2Mtc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0dDX1NFQ1RJT05TfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJEb24ndCByZW1vdmUgdW51c2VkIHNlY3Rpb25zIChkZWZhdWx0KSIpLAorICAgICAgVFdPX0RBU0hFUyB9LAorICB7IHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCisgICAgICAnXDAnLCBOVUxMLCBOXygiUHJpbnQgb3B0aW9uIGhlbHAiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsiTWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVB9LAorICAgICAgJ1wwJywgTl8oIkZJTEUiKSwgTl8oIldyaXRlIGEgbWFwIGZpbGUiKSwgT05FX0RBU0ggfSwKKyAgeyB7Im5vLWRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERU1BTkdMRSB9LAorICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvIG5vdCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsibm8ta2VlcC1tZW1vcnkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0tFRVBfTUVNT1JZfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJVc2UgbGVzcyBtZW1vcnkgYW5kIG1vcmUgZGlzayBJL08iKSwgVFdPX0RBU0hFUyB9LAorICB7IHsibm8tdW5kZWZpbmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19VTkRFRklORUR9LAorICAgICAnXDAnLCBOVUxMLCBOXygiQWxsb3cgbm8gdW5kZWZpbmVkIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsibm8td2Fybi1taXNtYXRjaCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0FSTl9NSVNNQVRDSH0sCisgICAgICAnXDAnLCBOVUxMLCBOXygiRG9uJ3Qgd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0IGZpbGVzIiksIFRXT19EQVNIRVN9LAorICB7IHsibm8td2hvbGUtYXJjaGl2ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fV0hPTEVfQVJDSElWRX0sCisgICAgICAnXDAnLCBOVUxMLCBOXygiVHVybiBvZmYgLS13aG9sZS1hcmNoaXZlIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Im5vaW5oaWJpdC1leGVjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0lOSElCSVRfRVhFQ30sCisgICAgICAnXDAnLCBOVUxMLCBOXygiQ3JlYXRlIGFuIG91dHB1dCBmaWxlIGV2ZW4gaWYgZXJyb3JzIG9jY3VyIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Im5vaW5oaWJpdF9leGVjIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0lOSElCSVRfRVhFQ30sCisgICAgICAnXDAnLCBOVUxMLCBOVUxMLCBOT19IRUxQIH0sCisgIHsgeyJvZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PRk9STUFUfSwKKyAgICAgICdcMCcsIE5fKCJUQVJHRVQiKSwgTl8oIlNwZWNpZnkgdGFyZ2V0IG9mIG91dHB1dCBmaWxlIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7InFtYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJJZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5IiksIE9ORV9EQVNIIH0sCisgIHsgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAorICAgICAgJ1wwJywgTlVMTCwgTl8oIlJlbGF4IGJyYW5jaGVzIG9uIGNlcnRhaW4gdGFyZ2V0cyIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJyZXRhaW4tc3ltYm9scy1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsCisgICAgICAgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEV9LAorICAgICAgJ1wwJywgTl8oIkZJTEUiKSwgTl8oIktlZXAgb25seSBzeW1ib2xzIGxpc3RlZCBpbiBGSUxFIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7InJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SUEFUSH0sCisgICAgICAnXDAnLCBOXygiUEFUSCIpLCBOXygiU2V0IHJ1bnRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiKSwgT05FX0RBU0ggfSwKKyAgeyB7InJwYXRoLWxpbmsiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JQQVRIX0xJTkt9LAorICAgICAgJ1wwJywgTl8oIlBBVEgiKSwgTl8oIlNldCBsaW5rIHRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiKSwgT05FX0RBU0ggfSwKKyAgeyB7InNoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0hBUkVEfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJDcmVhdGUgYSBzaGFyZWQgbGlicmFyeSIpLCBPTkVfREFTSCB9LAorICB7IHsiQnNoYXJlYWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0hBUkVEIH0sIC8qIEZyZWVCU0QuICAqLworICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKKyAgeyB7InNvcnQtY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TT1JUX0NPTU1PTn0sCisgICAgICAnXDAnLCBOVUxMLCBOXygiU29ydCBjb21tb24gc3ltYm9scyBieSBzaXplIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7InNvcnRfY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TT1JUX0NPTU1PTn0sCisgICAgICAnXDAnLCBOVUxMLCBOVUxMLCBOT19IRUxQIH0sCisgIHsgeyJzcGxpdC1ieS1maWxlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUExJVF9CWV9GSUxFfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZm9yIGVhY2ggZmlsZSIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJzcGxpdC1ieS1yZWxvYyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BMSVRfQllfUkVMT0N9LAorICAgICAgJ1wwJywgTl8oIkNPVU5UIiksIE5fKCJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZXZlcnkgQ09VTlQgcmVsb2NzIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7InN0YXRzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFUU30sCisgICAgICAnXDAnLCBOVUxMLCBOXygiUHJpbnQgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsidGFzay1saW5rIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UQVNLX0xJTkt9LAorICAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiRG8gdGFzayBsZXZlbCBsaW5raW5nIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGxpbmtlciIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJUYnNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UQlNTfSwKKyAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAuYnNzIHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKKyAgeyB7IlRkYXRhIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UREFUQX0sCisgICAgICAnXDAnLCBOXygiQUREUkVTUyIpLCBOXygiU2V0IGFkZHJlc3Mgb2YgLmRhdGEgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAorICB7IHsiVHRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RURVhUfSwKKyAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAudGV4dCBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCisgIHsgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJCT1NFfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJPdXRwdXQgbG90cyBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgbGluayIpLCBUV09fREFTSEVTIH0sCisgIHsgeyJkbGwtdmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSQk9TRX0sIC8qIExpbnV4LiAgKi8KKyAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKKyAgeyB7InZlcnNpb24tc2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJTSU9OX1NDUklQVCB9LAorICAgICAgJ1wwJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsidmVyc2lvbi1leHBvcnRzLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKKyAgICAgT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OIH0sCisgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiVGFrZSBleHBvcnQgc3ltYm9scyBsaXN0IGZyb20gLmV4cG9ydHMsIHVzaW5nIFNZTUJPTCBhcyB0aGUgdmVyc2lvbi4iKSwKKyAgICBUV09fREFTSEVTIH0sCisgIHsgeyJ3YXJuLWNvbW1vbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9DT01NT059LAorICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gYWJvdXQgZHVwbGljYXRlIGNvbW1vbiBzeW1ib2xzIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Indhcm4tY29uc3RydWN0b3JzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SU30sCisgICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBpZiBnbG9iYWwgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFyZSBzZWVuIiksCisgICAgICBUV09fREFTSEVTIH0sCisgIHsgeyJ3YXJuLW11bHRpcGxlLWdwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX01VTFRJUExFX0dQfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIHRoZSBtdWx0aXBsZSBHUCB2YWx1ZXMgYXJlIHVzZWQiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsid2Fybi1vbmNlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX09OQ0V9LAorICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gb25seSBvbmNlIHBlciB1bmRlZmluZWQgc3ltYm9sIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7Indhcm4tc2VjdGlvbi1hbGlnbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIHN0YXJ0IG9mIHNlY3Rpb24gY2hhbmdlcyBkdWUgdG8gYWxpZ25tZW50IiksCisgICAgICBUV09fREFTSEVTIH0sCisgIHsgeyJ3aG9sZS1hcmNoaXZlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XSE9MRV9BUkNISVZFfSwKKyAgICAgICdcMCcsIE5VTEwsIE5fKCJJbmNsdWRlIGFsbCBvYmplY3RzIGZyb20gZm9sbG93aW5nIGFyY2hpdmVzIiksIFRXT19EQVNIRVMgfSwKKyAgeyB7IndyYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dSQVB9LAorICAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiVXNlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAorICB7IHsibXBjODYwYzAiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01QQzg2MEMwfSwKKyAgICAgICdcMCcsIE5fKCJbPVdPUkRTXSIpLCBOXygiTW9kaWZ5IHByb2JsZW1hdGljIGJyYW5jaGVzIGluIGxhc3QgV09SRFMgKDEtMTAsIGRlZmF1bHQgNSkgd29yZHMgb2YgYSBwYWdlIiksIFRXT19EQVNIRVMgfQorfTsKKworI2RlZmluZSBPUFRJT05fQ09VTlQgKChpbnQpIChzaXplb2YgbGRfb3B0aW9ucyAvIHNpemVvZiBsZF9vcHRpb25zWzBdKSkKKworLyogVGVzdCAic3RyaW5nIiBmb3IgY29udGFpbmluZyBhIHN0cmluZyBvZiBkaWdpdHMgdGhhdCBmb3JtIGEgbnVtYmVyCitiZXR3ZWVuICJtaW4iIGFuZCAibWF4Ii4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvciAiZXJyIi4gKi8KK3N0YXRpYworaW50IGlzX251bSggY2hhciAqc3RyaW5nLCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgZXJyKQoreworICBpbnQgcmVzdWx0ID0gMDsKKworICBmb3IgKCA7ICpzdHJpbmc7ICsrc3RyaW5nKQorICB7CisgICAgaWYgKCFpc2RpZ2l0KCpzdHJpbmcpKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IGVycjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXN1bHQgPSByZXN1bHQgKiAxMCArICgqc3RyaW5nIC0gJzAnKTsKKyAgfQorICBpZiAocmVzdWx0IDwgbWluIHx8IHJlc3VsdCA+IG1heCkKKyAgICByZXN1bHQgPSBlcnI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorcGFyc2VfYXJncyAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgaSwgaXMsIGlsOworICBpbnQgaW5ncm91cCA9IDA7CisgIGNoYXIgKmRlZmF1bHRfZGlybGlzdCA9IE5VTEw7CisgIGNoYXIgc2hvcnRvcHRzW09QVElPTl9DT1VOVCAqIDMgKyAyXTsKKyAgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tPUFRJT05fQ09VTlQgKyAxXTsKKyAgaW50IGxhc3Rfb3B0aW5kOworCisgIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0CisgICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0CisgICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAorICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KKyAgc2hvcnRvcHRzWzBdID0gJy0nOworICBpcyA9IDE7CisgIGlsID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE9QVElPTl9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChsZF9vcHRpb25zW2ldLnNob3J0b3B0ICE9ICdcMCcpCisJeworCSAgc2hvcnRvcHRzW2lzXSA9IGxkX29wdGlvbnNbaV0uc2hvcnRvcHQ7CisJICArK2lzOworCSAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gcmVxdWlyZWRfYXJndW1lbnQKKwkgICAgICB8fCBsZF9vcHRpb25zW2ldLm9wdC5oYXNfYXJnID09IG9wdGlvbmFsX2FyZ3VtZW50KQorCSAgICB7CisJICAgICAgc2hvcnRvcHRzW2lzXSA9ICc6JzsKKwkgICAgICArK2lzOworCSAgICAgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5oYXNfYXJnID09IG9wdGlvbmFsX2FyZ3VtZW50KQorCQl7CisJCSAgc2hvcnRvcHRzW2lzXSA9ICc6JzsKKwkJICArK2lzOworCQl9CisJICAgIH0KKwl9CisgICAgICBpZiAobGRfb3B0aW9uc1tpXS5vcHQubmFtZSAhPSBOVUxMKQorCXsKKwkgIGxvbmdvcHRzW2lsXSA9IGxkX29wdGlvbnNbaV0ub3B0OworCSAgKytpbDsKKwl9CisgICAgfQorICBzaG9ydG9wdHNbaXNdID0gJ1wwJzsKKyAgbG9uZ29wdHNbaWxdLm5hbWUgPSBOVUxMOworCisgIC8qIFRoZSAtRyBvcHRpb24gaXMgYW1iaWd1b3VzIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuICBTb21ldGltZXMgaXQKKyAgICAgc3BlY2lmaWVzIHRoZSBsYXJnZXN0IGRhdGEgc2l6ZSB0byBwdXQgaW50byB0aGUgc21hbGwgZGF0YQorICAgICBzZWN0aW9uLiAgU29tZXRpbWVzIGl0IGlzIGVxdWl2YWxlbnQgdG8gLS1zaGFyZWQuICBVbmZvcnR1bmF0ZWx5LAorICAgICB0aGUgZmlyc3QgZm9ybSB0YWtlcyBhbiBhcmd1bWVudCwgd2hpbGUgdGhlIHNlY29uZCBkb2VzIG5vdC4KKworICAgICBXZSBuZWVkIHRvIHBlcm1pdCB0aGUgLS1zaGFyZWQgZm9ybSBiZWNhdXNlIG9uIHNvbWUgcGxhdGZvcm1zLAorICAgICBzdWNoIGFzIFNvbGFyaXMsIGdjYyAtc2hhcmVkIHdpbGwgcGFzcyAtRyB0byB0aGUgbGlua2VyLgorCisgICAgIFRvIHBlcm1pdCBlaXRoZXIgdXNhZ2UsIHdlIGxvb2sgdGhyb3VnaCB0aGUgYXJndW1lbnQgbGlzdC4gIElmIHdlCisgICAgIGZpbmQgLUcgbm90IGZvbGxvd2VkIGJ5IGEgbnVtYmVyLCB3ZSBjaGFuZ2UgaXQgaW50byAtLXNoYXJlZC4KKyAgICAgVGhpcyB3aWxsIHdvcmsgZm9yIG1vc3Qgbm9ybWFsIGNhc2VzLiAgKi8KKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICBpZiAoc3RyY21wIChhcmd2W2ldLCAiLUciKSA9PSAwCisJJiYgKGkgKyAxID49IGFyZ2MKKwkgICAgfHwgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYXJndltpICsgMV1bMF0pKSkKKyAgICAgIGFyZ3ZbaV0gPSAoY2hhciAqKSAiLS1zaGFyZWQiOworCisgIC8qIEJlY2F1c2Ugd2UgcGVybWl0IGxvbmcgb3B0aW9ucyB0byBzdGFydCB3aXRoIGEgc2luZ2xlIGRhc2gsIGFuZAorICAgICB3ZSBoYXZlIGEgLS1saWJyYXJ5IG9wdGlvbiwgYW5kIHRoZSAtbCBvcHRpb24gaXMgY29udmVudGlvbmFsbHkKKyAgICAgdXNlZCB3aXRoIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhcmd1bWVudCwgd2UgY2FuIGhhdmUgYmFkCisgICAgIHJlc3VsdHMgaWYgc29tZWJvZHkgdHJpZXMgdG8gdXNlIC1sIHdpdGggYSBsaWJyYXJ5IHdob3NlIG5hbWUKKyAgICAgaGFwcGVucyB0byBzdGFydCB3aXRoICJpYnJhcnkiLCBhcyBpbiAtbGkuICBXZSBhdm9pZCBwcm9ibGVtcyBieQorICAgICBzaW1wbHkgdHVybmluZyAtbCBpbnRvIC0tbGlicmFyeS4gIFRoaXMgbWVhbnMgdGhhdCB1c2VycyB3aWxsCisgICAgIGhhdmUgdG8gdXNlIHR3byBkYXNoZXMgaW4gb3JkZXIgdG8gdXNlIC0tbGlicmFyeSwgd2hpY2ggaXMgT0sKKyAgICAgc2luY2UgdGhhdCdzIGhvdyBpdCBpcyBkb2N1bWVudGVkLgorCisgICAgIEZJWE1FOiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBwcm9ibGVtIGNhbiBhcmlzZSBmb3Igb3RoZXIgc2hvcnQKKyAgICAgb3B0aW9ucyBhcyB3ZWxsLCBhbHRob3VnaCB0aGUgdXNlciBkb2VzIGFsd2F5cyBoYXZlIHRoZSByZWNvdXJzZQorICAgICBvZiBhZGRpbmcgYSBzcGFjZSBiZXR3ZWVuIHRoZSBvcHRpb24gYW5kIHRoZSBhcmd1bWVudC4gICovCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nCisJICAmJiBhcmd2W2ldWzFdID09ICdsJworCSAgJiYgYXJndltpXVsyXSAhPSAnXDAnKQorCXsKKwkgIGNoYXIgKm47CisKKwkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGFyZ3ZbaV0pICsgMjApOworCSAgc3ByaW50ZiAobiwgIi0tbGlicmFyeT0lcyIsIGFyZ3ZbaV0gKyAyKTsKKwkgIGFyZ3ZbaV0gPSBuOworCX0KKyAgICB9CisKKyAgbGFzdF9vcHRpbmQgPSAtMTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGxvbmdpbmQ7CisgICAgICBpbnQgb3B0YzsKKworICAgICAgLyogVXNpbmcgbGFzdF9vcHRpbmQgbGV0cyB1cyBhdm9pZCBjYWxsaW5nIGxkZW11bF9wYXJzZV9hcmdzCisJIG11bHRpcGxlIHRpbWVzIG9uIGEgc2luZ2xlIG9wdGlvbiwgd2hpY2ggd291bGQgbGVhZCB0bworCSBjb25mdXNpb24gaW4gdGhlIGludGVybmFsIHN0YXRpYyB2YXJpYWJsZXMgbWFpbnRhaW5lZCBieQorCSBnZXRvcHQuICBUaGlzIGNvdWxkIG90aGVyd2lzZSBoYXBwZW4gZm9yIGFuIGFyZ3VtZW50IGxpa2UKKwkgLW54LCBpbiB3aGljaCB0aGUgLW4gaXMgcGFyc2VkIGFzIGEgc2luZ2xlIG9wdGlvbiwgYW5kIHdlCisJIGxvb3AgYXJvdW5kIHRvIHBpY2sgdXAgdGhlIC14LiAgKi8KKyAgICAgIGlmIChvcHRpbmQgIT0gbGFzdF9vcHRpbmQpCisJeworCSAgaWYgKGxkZW11bF9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KSkKKwkgICAgY29udGludWU7CisJICBsYXN0X29wdGluZCA9IG9wdGluZDsKKwl9CisKKyAgICAgIC8qIGdldG9wdF9sb25nX29ubHkgaXMgbGlrZSBnZXRvcHRfbG9uZywgYnV0ICctJyBhcyB3ZWxsIGFzICctLScKKwkgY2FuIGluZGljYXRlIGEgbG9uZyBvcHRpb24uICAqLworICAgICAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsICZsb25naW5kKTsKKworICAgICAgaWYgKG9wdGMgPT0gLTEpCisJYnJlYWs7CisgICAgICBzd2l0Y2ggKG9wdGMpCisJeworCWRlZmF1bHQ6CisJICB4ZXhpdCAoMSk7CisJY2FzZSAxOgkJCS8qIEZpbGUgbmFtZS4gICovCisJICBsYW5nX2FkZF9pbnB1dF9maWxlIChvcHRhcmcsIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0sCisJCQkgICAgICAgKGNoYXIgKikgTlVMTCk7CisJICBicmVhazsKKworCWNhc2UgT1BUSU9OX0lHTk9SRToKKwkgIGJyZWFrOworCWNhc2UgJ2EnOgorCSAgLyogRm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuICBBY3R1YWxseSAtYSBzaGFyZWQgc2hvdWxkIG1lYW4KKyAgICAgICAgICAgICBgYHVzZSBvbmx5IHNoYXJlZCBsaWJyYXJpZXMnJyBidXQsIHRoZW4sIHdlIGRvbid0CisgICAgICAgICAgICAgY3VycmVudGx5IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBIUC9VWCBhbnlob3cuICAqLworCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiYXJjaGl2ZSIpID09IDApCisJICAgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAic2hhcmVkIikgPT0gMAorCQkgICB8fCBzdHJjbXAgKG9wdGFyZywgImRlZmF1bHQiKSA9PSAwKQorCSAgICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgZWluZm8gKF8oIiVQJUY6IHVucmVjb2duaXplZCAtYSBvcHRpb24gYCVzJ1xuIiksIG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9BU1NFUlQ6CisJICAvKiBGSVhNRTogV2UganVzdCBpZ25vcmUgdGhlc2UsIGJ1dCB3ZSBzaG91bGQgaGFuZGxlIHRoZW0uICAqLworCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiZGVmaW5pdGlvbnMiKSA9PSAwKQorCSAgICA7CisJICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIm5vZGVmaW5pdGlvbnMiKSA9PSAwKQorCSAgICA7CisJICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgIm5vc3ltYm9saWMiKSA9PSAwKQorCSAgICA7CisJICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgInB1cmUtdGV4dCIpID09IDApCisJICAgIDsKKwkgIGVsc2UKKwkgICAgZWluZm8gKF8oIiVQJUY6IHVucmVjb2duaXplZCAtYXNzZXJ0IG9wdGlvbiBgJXMnXG4iKSwgb3B0YXJnKTsKKwkgIGJyZWFrOworCWNhc2UgJ0EnOgorCSAgbGRmaWxlX2FkZF9hcmNoIChvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSAnYic6CisJICBsYW5nX2FkZF90YXJnZXQgKG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlICdjJzoKKwkgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKKwkgIHBhcnNlcl9pbnB1dCA9IGlucHV0X21yaV9zY3JpcHQ7CisJICB5eXBhcnNlICgpOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fQ0FMTF9TSEFSRUQ6CisJICBjb25maWcuZHluYW1pY19saW5rID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX05PTl9TSEFSRUQ6CisJICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9DUkVGOgorCSAgY29tbWFuZF9saW5lLmNyZWYgPSB0cnVlOworCSAgbGlua19pbmZvLm5vdGljZV9hbGwgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24gPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fREVGU1lNOgorCSAgbGV4X3N0cmluZyA9IG9wdGFyZzsKKwkgIGxleF9yZWRpcmVjdCAob3B0YXJnKTsKKwkgIHBhcnNlcl9pbnB1dCA9IGlucHV0X2RlZnN5bTsKKwkgIHBhcnNpbmdfZGVmc3ltID0gMTsKKwkgIHl5cGFyc2UgKCk7CisJICBwYXJzaW5nX2RlZnN5bSA9IDA7CisJICBsZXhfc3RyaW5nID0gTlVMTDsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0RFTUFOR0xFOgorCSAgZGVtYW5nbGluZyA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9EWU5BTUlDX0xJTktFUjoKKwkgIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciA9IG9wdGFyZzsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX0VCOgorCSAgY29tbWFuZF9saW5lLmVuZGlhbiA9IEVORElBTl9CSUc7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9FTDoKKwkgIGNvbW1hbmRfbGluZS5lbmRpYW4gPSBFTkRJQU5fTElUVExFOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fRU1CRURERURfUkVMT0NTOgorCSAgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcyA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9FWFBPUlRfRFlOQU1JQzoKKwljYXNlICdFJzogLyogSFAvVVggY29tcGF0aWJpbGl0eS4gICovCisJICBjb21tYW5kX2xpbmUuZXhwb3J0X2R5bmFtaWMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnZSc6CisJICBsYW5nX2FkZF9lbnRyeSAob3B0YXJnLCB0cnVlKTsKKwkgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgaWYgKGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzID0KKwkJKGNoYXIgKiopIHhtYWxsb2MgKDIgKiBzaXplb2YgKGNoYXIgKikpOworCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1swXSA9IG9wdGFyZzsKKwkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbMV0gPSBOVUxMOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnQgYzsKKwkgICAgICBjaGFyICoqcDsKKworCSAgICAgIGMgPSAwOworCSAgICAgIGZvciAocCA9IGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyczsgKnAgIT0gTlVMTDsgcCsrKQorCQkrK2M7CisJICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzID0KKwkJKGNoYXIgKiopIHhyZWFsbG9jIChjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMsCisJCQkJICAgIChjICsgMikgKiBzaXplb2YgKGNoYXIgKikpOworCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1tjXSA9IG9wdGFyZzsKKwkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnNbYyArIDFdID0gTlVMTDsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnRic6CisJICBjb21tYW5kX2xpbmUuZmlsdGVyX3NobGliID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWDoKKwkgIGNvbW1hbmRfbGluZS5mb3JjZV9leGVfc3VmZml4ID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ0cnOgorCSAgeworCSAgICBjaGFyICplbmQ7CisJICAgIGdfc3dpdGNoX3ZhbHVlID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKKwkgICAgaWYgKCplbmQpCisJICAgICAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgbnVtYmVyIGAlcydcbiIpLCBvcHRhcmcpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAnZyc6CisJICAvKiBJZ25vcmUuICAqLworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fR0NfU0VDVElPTlM6CisJICBjb21tYW5kX2xpbmUuZ2Nfc2VjdGlvbnMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fSEVMUDoKKwkgIGhlbHAgKCk7CisJICB4ZXhpdCAoMCk7CisJICBicmVhazsKKwljYXNlICdMJzoKKwkgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChvcHRhcmcsIHRydWUpOworCSAgYnJlYWs7CisJY2FzZSAnbCc6CisJICBsYW5nX2FkZF9pbnB1dF9maWxlIChvcHRhcmcsIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCisJCQkgICAgICAgKGNoYXIgKikgTlVMTCk7CisJICBicmVhazsKKwljYXNlICdNJzoKKwkgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSAiLSI7CisJICBicmVhazsKKwljYXNlICdtJzoKKwkgIC8qIElnbm9yZS4gIFdhcyBoYW5kbGVkIGluIGEgcHJlLXBhcnNlLiAgICovCisJICBicmVhazsKKwljYXNlIE9QVElPTl9NQVA6CisJICBjb25maWcubWFwX2ZpbGVuYW1lID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSAnTic6CisJICBjb25maWcudGV4dF9yZWFkX29ubHkgPSBmYWxzZTsKKwkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKKwkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgJ24nOgorCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOworCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTk9fREVNQU5HTEU6CisJICBkZW1hbmdsaW5nID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9OT19HQ19TRUNUSU9OUzoKKwkgIGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucyA9IGZhbHNlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTk9fS0VFUF9NRU1PUlk6CisJICBsaW5rX2luZm8ua2VlcF9tZW1vcnkgPSBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX05PX1VOREVGSU5FRDoKKwkgIGxpbmtfaW5mby5ub191bmRlZmluZWQgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTk9fV0FSTl9NSVNNQVRDSDoKKwkgIGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9OT0lOSElCSVRfRVhFQzoKKwkgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9OT19XSE9MRV9BUkNISVZFOgorCSAgd2hvbGVfYXJjaGl2ZSA9IGZhbHNlOworCSAgYnJlYWs7CisJY2FzZSAnTyc6CisJICAvKiBGSVhNRSAiLU88bm9uLWRpZ2l0cz4gPHZhbHVlPiIgdXNlZCB0byBzZXQgdGhlIGFkZHJlc3Mgb2YKKwkgICAgIHNlY3Rpb24gPG5vbi1kaWdpdHM+LiAgV2FzIHRoaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorCSAgICAgc29tZXRoaW5nLCBvciBjYW4gd2UgY3JlYXRlIGEgbmV3IG9wdGlvbiB0byBkbyB0aGF0CisJICAgICAod2l0aCBhIHN5bnRheCBzaW1pbGFyIHRvIC1kZWZzeW0pPworCSAgICAgZ2V0b3B0IGNhbid0IGhhbmRsZSB0d28gYXJncyB0byBhbiBvcHRpb24gd2l0aG91dCBrbHVkZ2VzLiAgKi8KKworCSAgLyogRW5hYmxlIG9wdGltaXphdGlvbnMgb2Ygb3V0cHV0IGZpbGVzLiAgKi8KKwkgIGxpbmtfaW5mby5vcHRpbWl6ZSA9IHN0cnRvdWwgKG9wdGFyZywgTlVMTCwgMCkgPyB0cnVlIDogZmFsc2U7CisJICBicmVhazsKKwljYXNlICdvJzoKKwkgIGxhbmdfYWRkX291dHB1dCAob3B0YXJnLCAwKTsgCisJICBicmVhazsKKwljYXNlIE9QVElPTl9PRk9STUFUOgorCSAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAob3B0YXJnLCAoY2hhciAqKSBOVUxMLCAoY2hhciAqKSBOVUxMLCAwKTsKKwkgIGJyZWFrOworCWNhc2UgJ2knOgorCWNhc2UgJ3InOgorCSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHRydWU7CisJICBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID0gZmFsc2U7CisJICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7CisJICBjb25maWcudGV4dF9yZWFkX29ubHkgPSBmYWxzZTsKKwkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgJ1InOgorCSAgLyogVGhlIEdOVSBsaW5rZXIgdHJhZGl0aW9uYWxseSB1c2VzIC1SIHRvIG1lYW4gdG8gaW5jbHVkZQorCSAgICAgb25seSB0aGUgc3ltYm9scyBmcm9tIGEgZmlsZS4gIFRoZSBTb2xhcmlzIGxpbmtlciB1c2VzIC1SCisJICAgICB0byBzZXQgdGhlIHBhdGggdXNlZCBieSB0aGUgcnVudGltZSBsaW5rZXIgdG8gZmluZAorCSAgICAgbGlicmFyaWVzLiAgVGhpcyBpcyB0aGUgR05VIGxpbmtlciAtcnBhdGggYXJndW1lbnQuICBXZQorCSAgICAgdHJ5IHRvIHN1cHBvcnQgYm90aCBzaW11bHRhbmVvdXNseSBieSBjaGVja2luZyB0aGUgZmlsZQorCSAgICAgbmFtZWQuICBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgcmF0aGVyIHRoYW4gYSByZWd1bGFyIGZpbGUsCisJICAgICB3ZSBhc3N1bWUgLXJwYXRoIHdhcyBtZWFudC4gICovCisJICB7CisJICAgIHN0cnVjdCBzdGF0IHM7CisKKwkgICAgaWYgKHN0YXQgKG9wdGFyZywgJnMpID49IDAKKwkJJiYgISBTX0lTRElSIChzLnN0X21vZGUpKQorCSAgICAgIHsKKwkJbGFuZ19hZGRfaW5wdXRfZmlsZSAob3B0YXJnLAorCQkJCSAgICAgbGFuZ19pbnB1dF9maWxlX2lzX3N5bWJvbHNfb25seV9lbnVtLAorCQkJCSAgICAgKGNoYXIgKikgTlVMTCk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSBPUFRJT05fUlBBVEg6CisJICBpZiAoY29tbWFuZF9saW5lLnJwYXRoID09IE5VTEwpCisJICAgIGNvbW1hbmRfbGluZS5ycGF0aCA9IGJ1eXN0cmluZyAob3B0YXJnKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNpemVfdCBycGF0aF9sZW4gPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5ycGF0aCk7CisJICAgICAgc2l6ZV90IG9wdGFyZ19sZW4gPSBzdHJsZW4gKG9wdGFyZyk7CisJICAgICAgY2hhciAqYnVmOworCSAgICAgIGNoYXIgKmNwID0gY29tbWFuZF9saW5lLnJwYXRoOworCisJICAgICAgLyogRmlyc3Qgc2VlIHdoZXRoZXIgT1BUQVJHIGlzIGFscmVhZHkgaW4gdGhlIHBhdGguICAqLworCSAgICAgIGRvCisJCXsKKwkJICBzaXplX3QgaWR4ID0gMDsKKwkJICB3aGlsZSAob3B0YXJnW2lkeF0gIT0gJ1wwJyAmJiBvcHRhcmdbaWR4XSA9PSBjcFtpZHhdKQorCQkgICAgKytpZHg7CisJCSAgaWYgKG9wdGFyZ1tpZHhdID09ICdcMCcKKwkJICAgICAgJiYgKGNwW2lkeF0gPT0gJ1wwJyB8fCBjcFtpZHhdID09ICc6JykpCisJCSAgICAvKiBXZSBmb3VuZCBpdC4gICovCisJCSAgICBicmVhazsKKworCQkgIC8qIE5vdCB5ZXQgZm91bmQuICAqLworCQkgIGNwID0gc3RyY2hyIChjcCwgJzonKTsKKwkJICBpZiAoY3AgIT0gTlVMTCkKKwkJICAgICsrY3A7CisJCX0KKwkgICAgICB3aGlsZSAoY3AgIT0gTlVMTCk7CisKKwkgICAgICBpZiAoY3AgPT0gTlVMTCkKKwkJeworCQkgIGJ1ZiA9IHhtYWxsb2MgKHJwYXRoX2xlbiArIG9wdGFyZ19sZW4gKyAyKTsKKwkJICBzcHJpbnRmIChidWYsICIlczolcyIsIGNvbW1hbmRfbGluZS5ycGF0aCwgb3B0YXJnKTsKKwkJICBmcmVlIChjb21tYW5kX2xpbmUucnBhdGgpOworCQkgIGNvbW1hbmRfbGluZS5ycGF0aCA9IGJ1ZjsKKwkJfQorCSAgICB9CisJICBicmVhazsKKwljYXNlIE9QVElPTl9SUEFUSF9MSU5LOgorCSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID09IE5VTEwpCisJICAgIGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID0gYnV5c3RyaW5nIChvcHRhcmcpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciAqYnVmOworCisJICAgICAgYnVmID0geG1hbGxvYyAoc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGhfbGluaykKKwkJCSAgICAgKyBzdHJsZW4gKG9wdGFyZykKKwkJCSAgICAgKyAyKTsKKwkgICAgICBzcHJpbnRmIChidWYsICIlczolcyIsIGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLCBvcHRhcmcpOworCSAgICAgIGZyZWUgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rKTsKKwkgICAgICBjb21tYW5kX2xpbmUucnBhdGhfbGluayA9IGJ1ZjsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fUkVMQVg6CisJICBjb21tYW5kX2xpbmUucmVsYXggPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRToKKwkgIGFkZF9rZWVwc3ltc19maWxlIChvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSAnUyc6CisJICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9kZWJ1Z2dlcjsKKwkgIGJyZWFrOworCWNhc2UgJ3MnOgorCSAgbGlua19pbmZvLnN0cmlwID0gc3RyaXBfYWxsOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fU0hBUkVEOgorCSAgaWYgKGNvbmZpZy5oYXNfc2hhcmVkKQorCSAgICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgZWluZm8gKF8oIiVQJUY6IC1zaGFyZWQgbm90IHN1cHBvcnRlZFxuIikpOworCSAgYnJlYWs7CisJY2FzZSAnaCc6CQkvKiBVc2VkIG9uIFNvbGFyaXMuICAqLworCWNhc2UgT1BUSU9OX1NPTkFNRToKKwkgIGNvbW1hbmRfbGluZS5zb25hbWUgPSBvcHRhcmc7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9TT1JUX0NPTU1PTjoKKwkgIGNvbmZpZy5zb3J0X2NvbW1vbiA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9TVEFUUzoKKwkgIGNvbmZpZy5zdGF0cyA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9TWU1CT0xJQzoKKwkgIGxpbmtfaW5mby5zeW1ib2xpYyA9IHRydWU7CisJICBicmVhazsKKwljYXNlICd0JzoKKwkgIHRyYWNlX2ZpbGVzID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgJ1QnOgorCSAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOworCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2NyaXB0OworCSAgeXlwYXJzZSAoKTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1RCU1M6CisJICBzZXRfc2VjdGlvbl9zdGFydCAoIi5ic3MiLCBvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fVERBVEE6CisJICBzZXRfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgb3B0YXJnKTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1RURVhUOgorCSAgc2V0X3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQ6CisJICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1RBU0tfTElOSzoKKwkgIGxpbmtfaW5mby50YXNrX2xpbmsgPSB0cnVlOworCSAgLyogRmFsbCB0aHJvdWdoIC0gZG8gYW4gaW1wbGllZCAtciBvcHRpb24uICAqLworCWNhc2UgT1BUSU9OX1VSOgorCSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHRydWU7CisJICBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID0gdHJ1ZTsKKwkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKKwkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOworCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOworCSAgYnJlYWs7CisJY2FzZSAndSc6CisJICBsZGxhbmdfYWRkX3VuZGVmIChvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fVkVSQk9TRToKKwkgIGxkdmVyc2lvbiAoMSk7CisJICB2ZXJzaW9uX3ByaW50ZWQgPSB0cnVlOworCSAgdHJhY2VfZmlsZV90cmllcyA9IHRydWU7CisJICBicmVhazsKKwljYXNlICd2JzoKKwkgIGxkdmVyc2lvbiAoMCk7CisJICB2ZXJzaW9uX3ByaW50ZWQgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSAnVic6CisJICBsZHZlcnNpb24gKDEpOworCSAgdmVyc2lvbl9wcmludGVkID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1ZFUlNJT046CisJICAvKiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuICAqLworCSAgcHJpbnRmICgiR05VIGxkICVzXG4iLCBsZF9wcm9ncmFtX3ZlcnNpb24pOworCSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKKwkgIHByaW50ZiAoXygiXAorVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIikpOworCSAgeworCSAgICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqcHRyID0gbGRfZW11bGF0aW9uczsKKyAgICAKKwkgICAgcHJpbnRmIChfKCIgIFN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIikpOworCSAgICB3aGlsZSAoKnB0cikgCisJICAgICAgeworCQlwcmludGYgKCIgICAlc1xuIiwgKCpwdHIpLT5lbXVsYXRpb25fbmFtZSk7CisJCXB0cisrOworCSAgICAgIH0KKwkgIH0KKwkgIHhleGl0ICgwKTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1ZFUlNJT05fU0NSSVBUOgorCSAgLyogVGhpcyBvcHRpb24gaW5kaWNhdGVzIGEgc21hbGwgc2NyaXB0IHRoYXQgb25seSBzcGVjaWZpZXMKKyAgICAgICAgICAgICB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgUmVhZCBpdCwgYnV0IGRvbid0IGFzc3VtZSB0aGF0CisgICAgICAgICAgICAgd2UndmUgc2VlbiBhIGxpbmtlciBzY3JpcHQuICAqLworCSAgeworCSAgICBib29sZWFuIGhvbGRfaGFkX3NjcmlwdDsKKworCSAgICBob2xkX2hhZF9zY3JpcHQgPSBoYWRfc2NyaXB0OworCSAgICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7CisJICAgIGhhZF9zY3JpcHQgPSBob2xkX2hhZF9zY3JpcHQ7CisJICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3ZlcnNpb25fc2NyaXB0OworCSAgICB5eXBhcnNlICgpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT046CisJICAvKiBUaGlzIG9wdGlvbiByZWNvcmRzIGEgdmVyc2lvbiBzeW1ib2wgdG8gYmUgYXBwbGllZCB0byB0aGUKKwkgICAgIHN5bWJvbHMgbGlzdGVkIGZvciBleHBvcnQgdG8gYmUgZm91bmQgaW4gdGhlIG9iamVjdCBmaWxlcworCSAgICAgLmV4cG9ydHMgc2VjdGlvbnMuICAqLworCSAgY29tbWFuZF9saW5lLnZlcnNpb25fZXhwb3J0c19zZWN0aW9uID0gb3B0YXJnOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fV0FSTl9DT01NT046CisJICBjb25maWcud2Fybl9jb21tb24gPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fV0FSTl9DT05TVFJVQ1RPUlM6CisJICBjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fV0FSTl9NVUxUSVBMRV9HUDoKKwkgIGNvbmZpZy53YXJuX211bHRpcGxlX2dwID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgT1BUSU9OX1dBUk5fT05DRToKKwkgIGNvbmZpZy53YXJuX29uY2UgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOOgorCSAgY29uZmlnLndhcm5fc2VjdGlvbl9hbGlnbiA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9XSE9MRV9BUkNISVZFOgorCSAgd2hvbGVfYXJjaGl2ZSA9IHRydWU7CisJICBicmVhazsKKwljYXNlIE9QVElPTl9XUkFQOgorCSAgYWRkX3dyYXAgKG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlICdYJzoKKwkgIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9sOworCSAgYnJlYWs7CisJY2FzZSAneCc6CisJICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfYWxsOworCSAgYnJlYWs7CisJY2FzZSAnWSc6CisJICBpZiAoc3RybmNtcCAob3B0YXJnLCAiUCwiLCAyKSA9PSAwKQorCSAgICBvcHRhcmcgKz0gMjsKKwkgIGRlZmF1bHRfZGlybGlzdCA9IHhzdHJkdXAgKG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlICd5JzoKKwkgIGFkZF95c3ltIChvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSAneic6CisJICAvKiBXZSBhY2NlcHQgYW5kIGlnbm9yZSB0aGlzIG9wdGlvbiBmb3IgU29sYXJpcworICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuICBBY3R1YWxseSwgb24gU29sYXJpcywgb3B0YXJnIGlzIG5vdAorICAgICAgICAgICAgIGlnbm9yZWQuICBTb21lZGF5IHdlIHNob3VsZCBoYW5kbGUgaXQgY29ycmVjdGx5LiAgRklYTUUuICAqLworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fU1BMSVRfQllfUkVMT0M6CisJICBjb25maWcuc3BsaXRfYnlfcmVsb2MgPSBhdG9pIChvcHRhcmcpOworCSAgYnJlYWs7IAorCWNhc2UgT1BUSU9OX1NQTElUX0JZX0ZJTEU6CisJICBjb25maWcuc3BsaXRfYnlfZmlsZSA9IHRydWU7CisJICBicmVhazsgCisJY2FzZSBPUFRJT05fQ0hFQ0tfU0VDVElPTlM6CisJICBjb21tYW5kX2xpbmUuY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgPSB0cnVlOworCSAgYnJlYWs7CisJY2FzZSBPUFRJT05fTk9fQ0hFQ0tfU0VDVElPTlM6CisJICBjb21tYW5kX2xpbmUuY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgPSBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgJygnOgorCSAgaWYgKGluZ3JvdXApCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICAgICBfKCIlczogbWF5IG5vdCBuZXN0IGdyb3VwcyAoLS1oZWxwIGZvciB1c2FnZSlcbiIpLAorCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKKwkgICAgICB4ZXhpdCAoMSk7CisJICAgIH0KKwkgIGxhbmdfZW50ZXJfZ3JvdXAgKCk7CisJICBpbmdyb3VwID0gMTsKKwkgIGJyZWFrOworCWNhc2UgJyknOgorCSAgaWYgKCEgaW5ncm91cCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIF8oIiVzOiBncm91cCBlbmRlZCBiZWZvcmUgaXQgYmVnYW4gKC0taGVscCBmb3IgdXNhZ2UpXG4iKSwKKwkJICAgICAgIHByb2dyYW1fbmFtZSk7CisJICAgICAgeGV4aXQgKDEpOworCSAgICB9CisJICBsYW5nX2xlYXZlX2dyb3VwICgpOworCSAgaW5ncm91cCA9IDA7CisJICBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX01QQzg2MEMwOgorICAgICAgICAgIGxpbmtfaW5mby5tcGM4NjBjMCA9IDIwOyAgICAgIC8qIGRlZmF1bHQgdmFsdWUgKGluIGJ5dGVzKSAqLworICAgICAgICAgIGlmIChvcHRhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHVuc2lnbmVkIHdvcmRzOworCisgICAgICAgICAgICAgIHdvcmRzID0gaXNfbnVtIChvcHRhcmcsIDEsIDEwLCAwKTsKKyAgICAgICAgICAgICAgaWYgKHdvcmRzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnZhbGlkIGFyZ3VtZW50IHRvIG9wdGlvbiBcIm1wYzg2MGMwXCJcbiIpKTsKKyAgICAgICAgICAgICAgICAgIHhleGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxpbmtfaW5mby5tcGM4NjBjMCA9IHdvcmRzICogNDsgICAvKiBjb252ZXJ0IHdvcmRzIHRvIGJ5dGVzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgY29tbWFuZF9saW5lLnJlbGF4ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChpbmdyb3VwKQorICAgIGxhbmdfbGVhdmVfZ3JvdXAgKCk7CisKKyAgaWYgKGRlZmF1bHRfZGlybGlzdCAhPSBOVUxMKQorICAgIHNldF9kZWZhdWx0X2Rpcmxpc3QgKGRlZmF1bHRfZGlybGlzdCk7CisKK30KKworLyogQWRkIHRoZSAoY29sb24tc2VwYXJhdGVkKSBlbGVtZW50cyBvZiBESVJMSVNUX1BUUiB0byB0aGUKKyAgIGxpYnJhcnkgc2VhcmNoIHBhdGguICAqLworCitzdGF0aWMgdm9pZAorc2V0X2RlZmF1bHRfZGlybGlzdCAoZGlybGlzdF9wdHIpCisgICAgIGNoYXIgKmRpcmxpc3RfcHRyOworeworICBjaGFyICpwOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHAgPSBzdHJjaHIgKGRpcmxpc3RfcHRyLCBQQVRIX1NFUEFSQVRPUik7CisgICAgICBpZiAocCAhPSBOVUxMKQorCSpwID0gJ1wwJzsKKyAgICAgIGlmICgqZGlybGlzdF9wdHIgIT0gJ1wwJykKKwlsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoZGlybGlzdF9wdHIsIHRydWUpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwlicmVhazsKKyAgICAgIGRpcmxpc3RfcHRyID0gcCArIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc2V0X3NlY3Rpb25fc3RhcnQgKHNlY3QsIHZhbHN0cikKKyAgICAgY2hhciAqc2VjdCwgKnZhbHN0cjsKK3sKKyAgY2hhciAqZW5kOworICB1bnNpZ25lZCBsb25nIHZhbCA9IHN0cnRvdWwgKHZhbHN0ciwgJmVuZCwgMTYpOworICBpZiAoKmVuZCkKKyAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGAlcydcbiIpLCB2YWxzdHIpOworICBsYW5nX3NlY3Rpb25fc3RhcnQgKHNlY3QsIGV4cF9pbnRvcCAodmFsKSk7Cit9CisMCisvKiBQcmludCBoZWxwIG1lc3NhZ2VzIGZvciB0aGUgb3B0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitoZWxwICgpCit7CisgIGludCBpOworICBjb25zdCBjaGFyICoqdGFyZ2V0cywgKipwcDsKKworICBwcmludGYgKF8oIlVzYWdlOiAlcyBbb3B0aW9uc10gZmlsZS4uLlxuIiksIHByb2dyYW1fbmFtZSk7CisKKyAgcHJpbnRmIChfKCJPcHRpb25zOlxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgT1BUSU9OX0NPVU5UOyBpKyspCisgICAgeworICAgICAgaWYgKGxkX29wdGlvbnNbaV0uZG9jICE9IE5VTEwpCisJeworCSAgYm9vbGVhbiBjb21tYTsKKwkgIGludCBsZW47CisJICBpbnQgajsKKworCSAgcHJpbnRmICgiICAiKTsKKworCSAgY29tbWEgPSBmYWxzZTsKKwkgIGxlbiA9IDI7CisKKwkgIGogPSBpOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLnNob3J0b3B0ICE9ICdcMCcKKwkJICAmJiBsZF9vcHRpb25zW2pdLmNvbnRyb2wgIT0gTk9fSEVMUCkKKwkJeworCQkgIHByaW50ZiAoIiVzLSVjIiwgY29tbWEgPyAiLCAiIDogIiIsIGxkX29wdGlvbnNbal0uc2hvcnRvcHQpOworCQkgIGxlbiArPSAoY29tbWEgPyAyIDogMCkgKyAyOworCQkgIGlmIChsZF9vcHRpb25zW2pdLmFyZyAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBpZiAobGRfb3B0aW9uc1tqXS5vcHQuaGFzX2FyZyAhPSBvcHRpb25hbF9hcmd1bWVudCkKKwkJCXsKKwkJCSAgcHJpbnRmICgiICIpOworCQkJICArK2xlbjsKKwkJCX0KKwkJICAgICAgcHJpbnRmICgiJXMiLCBfKGxkX29wdGlvbnNbal0uYXJnKSk7CisJCSAgICAgIGxlbiArPSBzdHJsZW4gKF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKKwkJICAgIH0KKwkJICBjb21tYSA9IHRydWU7CisJCX0KKwkgICAgICArK2o7CisJICAgIH0KKwkgIHdoaWxlIChqIDwgT1BUSU9OX0NPVU5UICYmIGxkX29wdGlvbnNbal0uZG9jID09IE5VTEwpOworCisJICBqID0gaTsKKwkgIGRvCisJICAgIHsKKwkgICAgICBpZiAobGRfb3B0aW9uc1tqXS5vcHQubmFtZSAhPSBOVUxMCisJCSAgJiYgbGRfb3B0aW9uc1tqXS5jb250cm9sICE9IE5PX0hFTFApCisJCXsKKwkJICBwcmludGYgKCIlcy0lcyVzIiwKKwkJCSAgY29tbWEgPyAiLCAiIDogIiIsCisJCQkgIGxkX29wdGlvbnNbal0uY29udHJvbCA9PSBUV09fREFTSEVTID8gIi0iIDogIiIsCisJCQkgIGxkX29wdGlvbnNbal0ub3B0Lm5hbWUpOworCQkgIGxlbiArPSAoKGNvbW1hID8gMiA6IDApCisJCQkgICsgMQorCQkJICArIChsZF9vcHRpb25zW2pdLmNvbnRyb2wgPT0gVFdPX0RBU0hFUyA/IDEgOiAwKQorCQkJICArIHN0cmxlbiAobGRfb3B0aW9uc1tqXS5vcHQubmFtZSkpOworCQkgIGlmIChsZF9vcHRpb25zW2pdLmFyZyAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCIgJXMiLCBfKGxkX29wdGlvbnNbal0uYXJnKSk7CisJCSAgICAgIGxlbiArPSAxICsgc3RybGVuIChfKGxkX29wdGlvbnNbal0uYXJnKSk7CisJCSAgICB9CisJCSAgY29tbWEgPSB0cnVlOworCQl9CisJICAgICAgKytqOworCSAgICB9CisJICB3aGlsZSAoaiA8IE9QVElPTl9DT1VOVCAmJiBsZF9vcHRpb25zW2pdLmRvYyA9PSBOVUxMKTsKKworCSAgaWYgKGxlbiA+PSAzMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIlxuIik7CisJICAgICAgbGVuID0gMDsKKwkgICAgfQorCisJICBmb3IgKDsgbGVuIDwgMzA7IGxlbisrKQorCSAgICBwdXRjaGFyICgnICcpOworCisJICBwcmludGYgKCIlc1xuIiwgXyhsZF9vcHRpb25zW2ldLmRvYykpOworCX0KKyAgICB9CisKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgcHJpbnRmIChfKCIlczogc3VwcG9ydGVkIHRhcmdldHM6IiksIHByb2dyYW1fbmFtZSk7CisgIHRhcmdldHMgPSBiZmRfdGFyZ2V0X2xpc3QgKCk7CisgIGZvciAocHAgPSB0YXJnZXRzOyAqcHAgIT0gTlVMTDsgcHArKykKKyAgICBwcmludGYgKCIgJXMiLCAqcHApOworICBmcmVlICh0YXJnZXRzKTsKKyAgcHJpbnRmICgiXG4iKTsKKworICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICBwcmludGYgKF8oIiVzOiBzdXBwb3J0ZWQgZW11bGF0aW9uczogIiksIHByb2dyYW1fbmFtZSk7CisgIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgKHN0ZG91dCk7CisgIHByaW50ZiAoIlxuIik7CisKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgcHJpbnRmIChfKCIlczogZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnM6XG4iKSwgcHJvZ3JhbV9uYW1lKTsKKyAgbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMgKHN0ZG91dCk7CisgIHByaW50ZiAoIlxuIik7CisgIAorICBwcmludGYgKF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Cit9CmRpZmYgLS1naXQgYS9sZC9tYWMtbGQuciBiL2xkL21hYy1sZC5yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTZmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9tYWMtbGQucgpAQCAtMCwwICsxLDQyIEBACisvKiBSZXNvdXJjZXMgZm9yIEdOVSBMRC4gKi8KKworI2luY2x1ZGUgIlN5c1R5cGVzLnIiCisKKy8qIFZlcnNpb24gcmVzb3VyY2VzLiAqLworCityZXNvdXJjZSAndmVycycgKDEpICB7CisJMCwKKwkwLAorCTAsCisJMCwKKwl2ZXJVcywKKwlWRVJTSU9OX1NUUklORywKKwlWRVJTSU9OX1NUUklORyAgIiAoQykgMTk4Ni05NSBGU0YsIEluYy4iCit9OworCityZXNvdXJjZSAndmVycycgKDIsIHB1cmdlYWJsZSkgIHsKKwkwLAorCTAsCisJMCwKKwkwLAorCXZlclVzLAorCVZFUlNJT05fU1RSSU5HLAorCSJHTEQgIiBWRVJTSU9OX1NUUklORyAiIGZvciBNUFciCit9OworCisjaWZkZWYgV0FOVF9DRlJHCisKKyNpbmNsdWRlICJDb2RlRnJhZ21lbnRUeXBlcy5yIgorCityZXNvdXJjZSAnY2ZyZycgKDApIHsKKwl7CisJCWtQb3dlclBDLAorCQlrRnVsbExpYiwKKwkJa05vVmVyc2lvbk51bSwga05vVmVyc2lvbk51bSwKKwkJMCwgMCwKKwkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCisJCVBST0dfTkFNRQorCX0KK307CisKKyNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2xkL21wdy1jb25maWcuaW4gYi9sZC9tcHctY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNTQyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9tcHctY29uZmlnLmluCkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgTEQuCisKK0lmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLworCVNldCBlbXVsbmFtZSBtNjhrY29mZgorCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVtNjhrY29mZi5jIGVtNjhrY29mZi5jCisJU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlbTY4a2NvZmYuYy5vCisKK0Vsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCisJU2V0IGVtdWxuYW1lIHBwY21hY29zCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZXBwY21hYy5jIGVwcGNtYWNvcy5jCisJU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlcHBjbWFjb3MuYy5vCisKK0Vsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCisJU2V0IGVtdWxuYW1lIGkzODZnbzMyCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZWkzODZnbzMyLmMgZWkzODZnbzMyLmMKKwlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVpMzg2Z28zMi5jLm8KKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtZWNvZmYvCisJU2V0IGVtdWxuYW1lIG1pcHNpZHQKKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1pZHRtaXBzLmMgZW1pcHNpZHQuYworCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZW1pcHNpZHQuYy5vCisKK0Vsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtXE9wdGlvbi14LVxPcHRpb24teC8KKwlTZXQgZW11bG5hbWUgZWxmMzJlYm1pcAorCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVsZm1pcHMuYyBlZWxmMzJlYm1pcC5jCisJU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlZWxmMzJlYm1pcC5jLm8KKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KKwlTZXQgZW11bG5hbWUgc2gKKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lc2guYyBlc2guYworCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZXNoLmMubworRW5kIElmCisKK0VjaG8gJy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gIERPIE5PVCBFRElUISAqLycgPiAie299ImxkZW11bC10bXAuaAorRWNobyAiZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfe2VtdWxuYW1lfV9lbXVsYXRpb247IiA+PiAie299ImxkZW11bC10bXAuaAorRWNobyAnI2RlZmluZSBFTVVMQVRJT05fTElTVCBcJwkJCQk+PiAie299ImxkZW11bC10bXAuaAorRWNobyAiICAmbGRfe2VtdWxuYW1lfV9lbXVsYXRpb24sIFwiCQkJPj4gIntvfSJsZGVtdWwtdG1wLmgKK0VjaG8gJyAgMCcJCQkJCQk+PiAie299ImxkZW11bC10bXAuaAorCitNb3ZlSWZDaGFuZ2UgIntvfSJsZGVtdWwtdG1wLmggIntvfSJsZGVtdWwtbGlzdC5oCisKK0VjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAorRWNobyAiRU1VTCA9ICIge2VtdWxuYW1lfQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiRU1VTEFUSU9OX09GSUxFUyA9ICIge2VtdWxhdGlvbl9vZmlsZXN9CQk+PiAie299Im1rLnRtcAorRWNobyAndmVyc2lvbiA9ICcgYFNlYXJjaCAnbGQgdmVyc2lvbiAnIHtzcmNkaXJ9bGR2ZXIuYyB8IHNlZCAtZSAncy8uKmxkIHZlcnNpb24gXChbXiBdKlwpLiovXDEvJ2AgPj4gIntvfSJtay50bXAKK0VjaG8gIlRERUZJTkVTID0gIgkJCQkJPj4gIntvfSJtay50bXAKK0VjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKKworRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKK0VjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKKworTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCmRpZmYgLS1naXQgYS9sZC9tcHctZWxmbWlwcy5jIGIvbGQvbXB3LWVsZm1pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFiMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvbXB3LWVsZm1pcHMuYwpAQCAtMCwwICsxLDE0MzkgQEAKKy8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KKworLyogMzIgYml0IEVMRiBlbXVsYXRpb24gY29kZSBmb3IgZWxmMzJlYm1pcAorICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+CisgICBFTEYgc3VwcG9ydCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfSVNfZWxmMzJlYm1pcAorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaW5jbHVkZSAibGQuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJsZGV4cC5oIgorI2luY2x1ZGUgImxkbGFuZy5oIgorI2luY2x1ZGUgImxkZ3JhbS5oIgorCitzdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlCisgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc2VhcmNoX2RpcnNfdHlwZSAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZAorICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKK3N0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfc3RhdF9uZWVkZWQKKyAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7CitzdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50CisgIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOworc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOworc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF9wbGFjZV9vcnBoYW4KKyAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7CitzdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24KKyAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7CitzdGF0aWMgY2hhciAqZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CisKK3N0YXRpYyB2b2lkCitnbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSgpCit7CisgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfbWlwczsKKyAgY29uZmlnLmR5bmFtaWNfbGluayA9IHRydWU7Cit9CisKKy8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgRUxGCisgICBkeW5hbWljIGxpYnJhcmllcyBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuc28uICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2xkZWxmMzJlYm1pcF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKKyAgICAgY29uc3QgY2hhciAqYXJjaDsKKyAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOworICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKnN0cmluZzsKKworICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7CisKKyAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCisJCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKKwkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCisJCQkgICAgICsgc2l6ZW9mICIvbGliLnNvIik7CisKKyAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zbyIsIHNlYXJjaC0+bmFtZSwgZmlsZW5hbWUsIGFyY2gpOworCisgIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQorICAgIHsKKyAgICAgIGZyZWUgKHN0cmluZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKKworICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKKyAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCisgICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQorICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCisgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCisgICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKKyAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQorICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KKyAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCisKKyAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKKyAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKKyAgICAgcHJldHR5LCB0aG91Z2guICAqLworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCisgICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKKyAgICB7CisgICAgICBjaGFyICpuZWVkZWRfbmFtZTsKKworICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7CisgICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpCisJCQkJICAgICAgKyBzdHJsZW4gKGFyY2gpCisJCQkJICAgICAgKyBzaXplb2YgImxpYi5zbyIpOworICAgICAgc3ByaW50ZiAobmVlZGVkX25hbWUsICJsaWIlcyVzLnNvIiwgZmlsZW5hbWUsIGFyY2gpOworICAgICAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGVudHJ5LT50aGVfYmZkLCBuZWVkZWRfbmFtZSk7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKKy8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAorICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkLiAgKi8KKworc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKK3N0YXRpYyBzdHJ1Y3Qgc3RhdCBnbG9iYWxfc3RhdDsKK3N0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiAoKQoreworICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZCwgKmw7CisKKyAgLyogV2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgd2hlbiBkb2luZyBhIGZpbmFsIGxpbmsuICAqLworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQorICAgIHJldHVybjsKKworICAvKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXBwZWFyIGluIERUX05FRURFRCBlbnRyaWVzIGluCisgICAgIGR5bmFtaWMgb2JqZWN0cyBpbmNsdWRlZCBpbiB0aGUgbGluayAob2Z0ZW4gdGhlcmUgd2lsbCBiZSBub25lKS4KKyAgICAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdAorICAgICB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZQorICAgICBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcKKyAgICAgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbiBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUKKyAgICAgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcworICAgICBsb29wLiAgKi8KKyAgbmVlZGVkID0gYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOworICBmb3IgKGwgPSBuZWVkZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsbDsKKyAgICAgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOworICAgICAgc2l6ZV90IGxlbjsKKyAgICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKKworICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCisgICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQorCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsLT5uYW1lKSA9PSAwKQorCSAgYnJlYWs7CisgICAgICBpZiAobGwgIT0gbCkKKwljb250aW51ZTsKKworICAgICAgLyogU2VlIGlmIHRoaXMgZmlsZSB3YXMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgZXhwbGljaXRseS4gICovCisgICAgICBnbG9iYWxfbmVlZGVkID0gbDsKKyAgICAgIGdsb2JhbF9mb3VuZCA9IGZhbHNlOworICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZCk7CisgICAgICBpZiAoZ2xvYmFsX2ZvdW5kKQorCWNvbnRpbnVlOworCisgICAgICAvKiBXZSBuZWVkIHRvIGZpbmQgdGhpcyBmaWxlIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUuICBXZQorCSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlIGR5bmFtaWMKKwkgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCisJIHJwYXRoX2xpbmssIHJwYXRoLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiB0aGUgbGlua2VyIHNjcmlwdAorCSBMSUJfU0VBUkNIX0RJUlMuICBXZSBkbyBub3Qgc2VhcmNoIHVzaW5nIHRoZSAtTCBhcmd1bWVudHMuICAqLworICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCisJCQkJCSAgICAgIGwtPm5hbWUpKQorCWNvbnRpbnVlOworICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsLT5uYW1lKSkKKwljb250aW51ZTsKKyAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCisJICAmJiBjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKKwl7CisJICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7CisJICBpZiAoZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSkpCisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGxlbiA9IHN0cmxlbiAobC0+bmFtZSk7CisgICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQorCXsKKwkgIGNoYXIgKmZpbGVuYW1lOworCisJICBpZiAoc2VhcmNoLT5jbWRsaW5lKQorCSAgICBjb250aW51ZTsKKwkgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpICsgbGVuICsgMik7CisJICBzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBsLT5uYW1lKTsKKwkgIGlmIChnbGRlbGYzMmVibWlwX3RyeV9uZWVkZWQgKGZpbGVuYW1lKSkKKwkgICAgYnJlYWs7CisJICBmcmVlIChmaWxlbmFtZSk7CisJfQorICAgICAgaWYgKHNlYXJjaCAhPSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiksCisJICAgICBsLT5uYW1lLCBsLT5ieSk7CisgICAgfQorfQorCisvKiBTZWFyY2ggZm9yIGEgbmVlZGVkIGZpbGUgaW4gYSBwYXRoLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2dsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSkKKyAgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgY29uc3QgY2hhciAqczsKKyAgc2l6ZV90IGxlbjsKKworICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCisgICAgcmV0dXJuIGZhbHNlOworICBsZW4gPSBzdHJsZW4gKG5hbWUpOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlbmFtZSwgKnNzZXQ7CisKKyAgICAgIHMgPSBzdHJjaHIgKHBhdGgsICc6Jyk7CisgICAgICBpZiAocyA9PSBOVUxMKQorCXMgPSBwYXRoICsgc3RybGVuIChwYXRoKTsKKworICAgICAgZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIGxlbiArIDIpOworICAgICAgaWYgKHMgPT0gcGF0aCkKKwlzc2V0ID0gZmlsZW5hbWU7CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5IChmaWxlbmFtZSwgcGF0aCwgcyAtIHBhdGgpOworCSAgZmlsZW5hbWVbcyAtIHBhdGhdID0gJy8nOworCSAgc3NldCA9IGZpbGVuYW1lICsgKHMgLSBwYXRoKSArIDE7CisJfQorICAgICAgc3RyY3B5IChzc2V0LCBuYW1lKTsKKworICAgICAgaWYgKGdsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAoZmlsZW5hbWUpKQorCXJldHVybiB0cnVlOworCisgICAgICBmcmVlIChmaWxlbmFtZSk7CisKKyAgICAgIGlmICgqcyA9PSAnXDAnKQorCWJyZWFrOworICAgICAgcGF0aCA9IHMgKyAxOworICAgIH0KKworICByZXR1cm4gZmFsc2U7CSAgCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHBvc3NpYmxlIG5hbWUgZm9yIGEgZHluYW1pYyBvYmplY3QKKyAgIG5hbWVkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2dsZGVsZjMyZWJtaXBfdHJ5X25lZWRlZCAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgYmZkICphYmZkOworCisgIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7CisgIGlmIChhYmZkID09IE5VTEwpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCisgICAgeworICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIC8qIFdlJ3ZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgbWF0Y2hpbmcgdGhlIERUX05FRURFRCBlbnRyeS4gICovCisKKyAgLyogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBvdGhlciBpbnB1dCBmaWxlIG9mIHRoZQorICAgICBzYW1lIG5hbWUuICBXZSBtdXN0IG5vdyBjaGVjayBhZ2FpbiB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIHRoZQorICAgICBzYW1lIGZpbGUgdHdpY2UuICBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSBvbiBtYW55IHN5c3RlbXMKKyAgICAgbGliYy5zbyBpcyBhIHN5bWxpbmsgdG8sIGUuZy4sIGxpYmMuc28uMS4gIFRoZSBTT05BTUUgZW50cnkgd2lsbAorICAgICByZWZlcmVuY2UgbGliYy5zby4xLiAgSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGxpYmMuc28sIHdlCisgICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBsaWJjLnNvLjEgaWYgdGhleSBhcmUgdGhlIHNhbWUgZmlsZSwgYW5kIHdlCisgICAgIGNhbiBvbmx5IGNoZWNrIHRoYXQgdXNpbmcgc3RhdC4gICovCisKKyAgaWYgKGJmZF9zdGF0IChhYmZkLCAmZ2xvYmFsX3N0YXQpICE9IDApCisgICAgZWluZm8gKF8oIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIpLCBhYmZkKTsKKyAgZ2xvYmFsX2ZvdW5kID0gZmFsc2U7CisgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkZWxmMzJlYm1pcF9zdGF0X25lZWRlZCk7CisgIGlmIChnbG9iYWxfZm91bmQpCisgICAgeworICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKKyAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQorICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCisgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7CisKKyAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLworICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCisgICAgZWluZm8gKF8oIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgYWJmZCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCitnbGRlbGYzMmVibWlwX2NoZWNrX25lZWRlZCAocykKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKK3sKKyAgaWYgKGdsb2JhbF9mb3VuZCkKKyAgICByZXR1cm47CisKKyAgaWYgKHMtPmZpbGVuYW1lICE9IE5VTEwKKyAgICAgICYmIHN0cmNtcCAocy0+ZmlsZW5hbWUsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCisgICAgeworICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzb25hbWU7CisKKyAgICAgIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7CisgICAgICBpZiAoc29uYW1lICE9IE5VTEwKKwkgICYmIHN0cmNtcCAoc29uYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQorCXsKKwkgIGdsb2JhbF9mb3VuZCA9IHRydWU7CisJICByZXR1cm47CisJfQorICAgIH0KKwkgIAorICBpZiAocy0+c2VhcmNoX2RpcnNfZmxhZworICAgICAgJiYgcy0+ZmlsZW5hbWUgIT0gTlVMTAorICAgICAgJiYgc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpID09IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZjsKKworICAgICAgZiA9IHN0cnJjaHIgKHMtPmZpbGVuYW1lLCAnLycpOworICAgICAgaWYgKGYgIT0gTlVMTAorCSAgJiYgc3RyY21wIChmICsgMSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKKwl7CisJICBnbG9iYWxfZm91bmQgPSB0cnVlOworCSAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKKy8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgcnVubmluZyBzdGF0IG9uCisgICB0aGUgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitnbGRlbGYzMmVibWlwX3N0YXRfbmVlZGVkIChzKQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOworeworICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgY29uc3QgY2hhciAqc3VmZml4OworICBjb25zdCBjaGFyICpzb25hbWU7CisgIGNvbnN0IGNoYXIgKmY7CisKKyAgaWYgKGdsb2JhbF9mb3VuZCkKKyAgICByZXR1cm47CisgIGlmIChzLT50aGVfYmZkID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmIChiZmRfc3RhdCAocy0+dGhlX2JmZCwgJnN0KSAhPSAwKQorICAgIHsKKyAgICAgIGVpbmZvIChfKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiksIHMtPnRoZV9iZmQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc3Quc3RfZGV2ID09IGdsb2JhbF9zdGF0LnN0X2RldgorICAgICAgJiYgc3Quc3RfaW5vID09IGdsb2JhbF9zdGF0LnN0X2lubykKKyAgICB7CisgICAgICBnbG9iYWxfZm91bmQgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBXZSBpc3N1ZSBhIHdhcm5pbmcgaWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgaW5jbHVkaW5nIHR3bworICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgc2hhcmVkIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwKKyAgICAgdGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiAtbGMgcGlja3MgdXAgbGliYy5zby42IGJ1dCBzb21lIG90aGVyCisgICAgIHNoYXJlZCBsaWJyYXJ5IGhhcyBhIERUX05FRURFRCBlbnRyeSBvZiBsaWJjLnNvLjUuICBUaGlzIGlzIGEKKyAgICAgaHVlcmlzdGljIHRlc3QsIGFuZCBpdCB3aWxsIG9ubHkgd29yayBpZiB0aGUgbmFtZSBsb29rcyBsaWtlCisgICAgIE5BTUUuc28uVkVSU0lPTi4gIEZJWE1FOiBEZXBlbmRpbmcgb24gZmlsZSBuYW1lcyBpcyBlcnJvci1wcm9uZS4KKyAgICAgSWYgd2UgcmVhbGx5IHdhbnQgdG8gaXNzdWUgd2FybmluZ3MgYWJvdXQgbWl4aW5nIHZlcnNpb24gbnVtYmVycworICAgICBvZiBzaGFyZWQgbGlicmFyaWVzLCB3ZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2F5LiAgKi8KKworICBpZiAoc3RyY2hyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAnLycpICE9IE5VTEwpCisgICAgcmV0dXJuOworICBzdWZmaXggPSBzdHJzdHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICIuc28uIik7CisgIGlmIChzdWZmaXggPT0gTlVMTCkKKyAgICByZXR1cm47CisgIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKKworICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOworICBpZiAoc29uYW1lID09IE5VTEwpCisgICAgc29uYW1lID0gcy0+ZmlsZW5hbWU7CisKKyAgZiA9IHN0cnJjaHIgKHNvbmFtZSwgJy8nKTsKKyAgaWYgKGYgIT0gTlVMTCkKKyAgICArK2Y7CisgIGVsc2UKKyAgICBmID0gc29uYW1lOworCisgIGlmIChzdHJuY21wIChmLCBnbG9iYWxfbmVlZGVkLT5uYW1lLCBzdWZmaXggLSBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQorICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIpLAorCSAgIGdsb2JhbF9uZWVkZWQtPm5hbWUsIGdsb2JhbF9uZWVkZWQtPmJ5LCBmKTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKKyAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCisKK3N0YXRpYyB2b2lkCitnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uICgpCit7CisgIGNvbnN0IGNoYXIgKnJwYXRoOworICBhc2VjdGlvbiAqc2ludGVycDsKKworICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0CisgICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQorICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLworICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50KTsKKworICAvKiBMZXQgdGhlIEVMRiBiYWNrZW5kIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMgcmVxdWlyZWQKKyAgICAgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgcnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7CisgIGlmIChycGF0aCA9PSBOVUxMKQorICAgIHJwYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfUlVOX1BBVEgiKTsKKyAgaWYgKCEgYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwKKwkJCQkJCSBjb21tYW5kX2xpbmUuc29uYW1lLAorCQkJCQkJIHJwYXRoLAorCQkJCQkJIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywKKwkJCQkJCSAmbGlua19pbmZvLAorCQkJCQkJICZzaW50ZXJwKSkKKyAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKSk7CisKKyAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBkeW5hbWljIGxpbmtlciB3ZSBhcmUgdXNpbmcuICAqLworICBpZiAoY29tbWFuZF9saW5lLmludGVycHJldGVyICE9IE5VTEwKKyAgICAgICYmIHNpbnRlcnAgIT0gTlVMTCkKKyAgICB7CisgICAgICBzaW50ZXJwLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXI7CisgICAgICBzaW50ZXJwLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcikgKyAxOworICAgIH0KKworICAvKiBMb29rIGZvciBhbnkgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLiAgQXMgYSBHTlUgZXh0ZW5zaW9ucywKKyAgICAgd2UgdHJlYXQgc3VjaCBzZWN0aW9ucyBhcyBjb250YWluaW5nIHdhcm5pbmcgbWVzc2FnZXMuICBXZSBwcmludAorICAgICBvdXQgdGhlIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gemVybyBvdXQgdGhlIHNlY3Rpb24gc2l6ZSBzbworICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLworCisgIHsKKyAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCisgICAgICB7CisJYXNlY3Rpb24gKnM7CisJYmZkX3NpemVfdHlwZSBzejsKKwljaGFyICptc2c7CisJYm9vbGVhbiByZXQ7CisKKwlpZiAoaXMtPmp1c3Rfc3ltc19mbGFnKQorCSAgY29udGludWU7CisKKwlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmdudS53YXJuaW5nIik7CisJaWYgKHMgPT0gTlVMTCkKKwkgIGNvbnRpbnVlOworCisJc3ogPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgcyk7CisJbXNnID0geG1hbGxvYyAoKHNpemVfdCkgc3ogKyAxKTsKKwlpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQorCSAgZWluZm8gKF8oIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iKSwKKwkJIGlzLT50aGVfYmZkKTsKKwltc2dbc3pdID0gJ1wwJzsKKwlyZXQgPSBsaW5rX2luZm8uY2FsbGJhY2tzLT53YXJuaW5nICgmbGlua19pbmZvLCBtc2csCisJCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAorCQkJCQkgICAgaXMtPnRoZV9iZmQsIChhc2VjdGlvbiAqKSBOVUxMLAorCQkJCQkgICAgKGJmZF92bWEpIDApOworCUFTU0VSVCAocmV0KTsKKwlmcmVlIChtc2cpOworCisJLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplLCBzbyB0aGF0IHdlIGRvbid0IHdhc3RlIGNvcHlpbmcgdGhlCisJICAgd2FybmluZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCisJcy0+X3Jhd19zaXplID0gMDsKKyAgICAgIH0KKyAgfQorfQorCisvKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKKyAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9jYXRlcyBhbnkgYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBhbmQKKyAgIHRlbGxzIHRoZSBFTEYgYmFja2VuZCBhYm91dCB0aGVtLCBpbiBjYXNlIHRoZXkgYXJlIGFzc2lnbm1lbnRzIHRvCisgICBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLworCitzdGF0aWMgdm9pZAorZ2xkZWxmMzJlYm1pcF9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQorICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOworeworICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQorICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKK30KKworLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KKworc3RhdGljIHZvaWQKK2dsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQorICAgICBldHJlZV90eXBlICpleHA7Cit7CisgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCisgICAgeworICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKKyAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKKwkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGlmIChoID09IE5VTEwpCisJYnJlYWs7CisKKyAgICAgIC8qIFdlIGNhbGwgcmVjb3JkX2xpbmtfYXNzaWdubWVudCBldmVuIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KKwkgVGhpcyBpcyBiZWNhdXNlIGlmIGl0IGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2UKKwkgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsCisJIG5vdCB0aGUgdmFsdWUgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgKGJlY2F1c2Ugd2UgYXJlIHNldHRpbmcKKwkgc3ltYm9scyBsaWtlIGV0ZXh0KS4gIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIKKwkgb2JqZWN0LCB0aGVuLCBhcyBpdCBoYXBwZW5zLCBjYWxsaW5nIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQKKwkgd2lsbCBkbyBubyBoYXJtLiAgKi8KKworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKKyAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQorCXsKKwkgIGlmICghIChiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAorCQkgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGV4cC0+YXNzaWduLmRzdCwKKwkJICBleHAtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlID8gdHJ1ZSA6IGZhbHNlKSkpCisJICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iKSwKKwkJICAgZXhwLT5hc3NpZ24uZHN0KTsKKwl9CisgICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfYmluYXJ5OgorICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOworICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV0cmVlX3RyaW5hcnk6CisgICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKKyAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7CisgICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGV0cmVlX3VuYXJ5OgorICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uICBXZSB1c2UgdGhpcyB0byBwdXQgcmFuZG9tIFNIRl9BTExPQworICAgc2VjdGlvbnMgaW4gdGhlIHJpZ2h0IHNlZ21lbnQuICAqLworCitzdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKK3N0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKK3N0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yb2RhdGE7CitzdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9kYXRhOworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfYnNzOworc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcmVsOworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBib29sZWFuCitnbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbiAoZmlsZSwgcykKKyAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKKyAgICAgYXNlY3Rpb24gKnM7Cit7CisgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOworICBhc2VjdGlvbiAqc25ldywgKipwcHM7CisgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOworICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOworICBldHJlZV90eXBlICphZGRyZXNzOworICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7CisgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOworCisgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLworICBob2xkX3NlY3Rpb24gPSBzOworICBob2xkX3VzZSA9IE5VTEw7CisgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24pOworCisgIGlmIChob2xkX3VzZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBwbGFjZWQgYSBzZWN0aW9uIHdpdGggdGhpcyBuYW1lLiAgKi8KKyAgICAgIHdpbGRfZG9pdCAoJmhvbGRfdXNlLT5jaGlsZHJlbiwgcywgaG9sZF91c2UsIGZpbGUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHNlY25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3duZXIsIHMpOworCisgIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCB0aGVuIGFsd2F5cyBwdXQgLmdudS53YXJuaW5nLlNZTUJPTAorICAgICBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dCBzZWN0aW9uIHRvIGdldCB0aGVtIG91dCBvZiB0aGUgd2F5LiAgKi8KKyAgaWYgKCEgbGlua19pbmZvLnNoYXJlZAorICAgICAgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCisgICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLmdudS53YXJuaW5nLiIsIHNpemVvZiAiLmdudS53YXJuaW5nLiIgLSAxKSA9PSAwCisgICAgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKKyAgICB7CisgICAgICB3aWxkX2RvaXQgKCZob2xkX3RleHQtPmNoaWxkcmVuLCBzLCBob2xkX3RleHQsIGZpbGUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qIERlY2lkZSB3aGljaCBzZWdtZW50IHRoZSBzZWN0aW9uIHNob3VsZCBnbyBpbiBiYXNlZCBvbiB0aGUKKyAgICAgc2VjdGlvbiBuYW1lIGFuZCBzZWN0aW9uIGZsYWdzLiAgKi8KKyAgcGxhY2UgPSBOVUxMOworICBpZiAoKHMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAorICAgICAgJiYgaG9sZF9ic3MgIT0gTlVMTCkKKyAgICBwbGFjZSA9IGhvbGRfYnNzOworICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDAKKwkgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKKyAgICBwbGFjZSA9IGhvbGRfZGF0YTsKKyAgZWxzZSBpZiAoc3RybmNtcCAoc2VjbmFtZSwgIi5yZWwiLCA0KSA9PSAwCisJICAgJiYgaG9sZF9yZWwgIT0gTlVMTCkKKyAgICBwbGFjZSA9IGhvbGRfcmVsOworICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMAorCSAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAorCSAgICYmIGhvbGRfcm9kYXRhICE9IE5VTEwpCisgICAgcGxhY2UgPSBob2xkX3JvZGF0YTsKKyAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCisJICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCisgICAgcGxhY2UgPSBob2xkX3RleHQ7CisgIGlmIChwbGFjZSA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZSByaWdodAorICAgICBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sgbmVhdGVyLiAgKi8KKyAgc25ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIHNlY25hbWUpOworICBpZiAoc25ldyA9PSBOVUxMKQorICAgICAgZWluZm8gKF8oIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiksCisJICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBzZWNuYW1lKTsKKyAgaWYgKHBsYWNlLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAocHBzID0gJm91dHB1dF9iZmQtPnNlY3Rpb25zOyAqcHBzICE9IHNuZXc7IHBwcyA9ICYoKnBwcyktPm5leHQpCisJOworICAgICAgKnBwcyA9IHNuZXctPm5leHQ7CisgICAgICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OworICAgICAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKKyAgICB9CisKKyAgLyogU3RhcnQgYnVpbGRpbmcgYSBsaXN0IG9mIHN0YXRlbWVudHMgZm9yIHRoaXMgc2VjdGlvbi4gICovCisgIG9sZCA9IHN0YXRfcHRyOworICBzdGF0X3B0ciA9ICZhZGQ7CisgIGxhbmdfbGlzdF9pbml0IChzdGF0X3B0cik7CisKKyAgLyogSWYgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gaXMgcmVwcmVzZW50YWJsZSBpbiBDLCB0aGVuIGNyZWF0ZQorICAgICBzeW1ib2xzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLiAgKi8KKyAgZm9yIChwcyA9IHNlY25hbWU7ICpwcyAhPSAnXDAnOyBwcysrKQorICAgIGlmICghIGlzYWxudW0gKCpwcykgJiYgKnBzICE9ICdfJykKKyAgICAgIGJyZWFrOworICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKKyAgICB7CisgICAgICBjaGFyICpzeW1uYW1lOworCisgICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOworICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBzZWNuYW1lKTsKKyAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAorCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAorCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQorCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7CisgICAgfQorCisgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgYWRkcmVzcyA9IE5VTEw7CisgIGVsc2UKKyAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7CisKKyAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKHNlY25hbWUsIGFkZHJlc3MsIDAsCisJCQkJICAgICAgIChiZmRfdm1hKSAwLAorCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAorCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAorCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKKworICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoc2VjbmFtZSk7CisgIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOworCisgIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIpOworICBzdGF0X3B0ciA9ICZhZGQ7CisKKyAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCisgICAgeworICAgICAgY2hhciAqc3ltbmFtZTsKKworICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gc2VjbmFtZSArIHNpemVvZiAiX19zdG9wXyIpOworICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RvcF8lcyIsIHNlY25hbWUpOworICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIHN5bW5hbWUsCisJCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOworICAgIH0KKworICAvKiBOb3cgc3RpY2sgdGhlIG5ldyBzdGF0ZW1lbnQgbGlzdCByaWdodCBhZnRlciBQTEFDRS4gICovCisgICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKKyAgcGxhY2UtPmhlYWRlci5uZXh0ID0gYWRkLmhlYWQ7CisKKyAgc3RhdF9wdHIgPSBvbGQ7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitnbGRlbGYzMmVibWlwX3BsYWNlX3NlY3Rpb24gKHMpCisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Cit7CisgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOworCisgIGlmIChzLT5oZWFkZXIudHlwZSAhPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtKQorICAgIHJldHVybjsKKworICBvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7CisKKyAgaWYgKHN0cmNtcCAob3MtPm5hbWUsIGhvbGRfc2VjdGlvbi0+bmFtZSkgPT0gMCkKKyAgICBob2xkX3VzZSA9IG9zOworCisgIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQorICAgIGhvbGRfdGV4dCA9IG9zOworICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJvZGF0YSIpID09IDApCisgICAgaG9sZF9yb2RhdGEgPSBvczsKKyAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKKyAgICBob2xkX2RhdGEgPSBvczsKKyAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5ic3MiKSA9PSAwKQorICAgIGhvbGRfYnNzID0gb3M7CisgIGVsc2UgaWYgKGhvbGRfcmVsID09IE5VTEwKKwkgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAorCSAgICYmIHN0cm5jbXAgKG9zLT5uYW1lLCAiLnJlbCIsIDQpID09IDApCisgICAgaG9sZF9yZWwgPSBvczsKK30KKworc3RhdGljIGNoYXIgKgorZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0KGlzZmlsZSkKKyAgICAgaW50ICppc2ZpbGU7Cit7CQkJICAgICAKKyAgKmlzZmlsZSA9IDA7CisKKyAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCisgICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKKwkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKK09VVFBVVF9BUkNIKG1pcHMpXG5cCitFTlRSWShfc3RhcnQpXG5cCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzXG5cCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nXG5cCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkXG5cCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi9cblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAorICAuaW50ZXJwICAgMCA6IHsgKiguaW50ZXJwKSAJfVxuXAorICAucmVnaW5mbyAgICAgMCA6IHsgKigucmVnaW5mbykgfVxuXAorICAuZHluYW1pYyAgICAgMCA6IHsgKiguZHluYW1pYykgfVxuXAorICAuZHluc3RyICAgICAgMCA6IHsgKiguZHluc3RyKQkJfVxuXAorICAuZHluc3ltICAgICAgMCA6IHsgKiguZHluc3ltKQkJfVxuXAorICAuaGFzaCAgICAgICAgMCA6IHsgKiguaGFzaCkJCX1cblwKKyAgLnJlbC50ZXh0ICAgIDAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAorICAucmVsYS50ZXh0ICAgMCA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAorICAucmVsLmRhdGEgICAgMCA6IHsgKigucmVsLmRhdGEpCQl9XG5cCisgIC5yZWxhLmRhdGEgICAwIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCisgIC5yZWwucm9kYXRhICAwIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAorICAucmVsYS5yb2RhdGEgMCA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCisgIC5yZWwuZ290ICAgICAwIDogeyAqKC5yZWwuZ290KQkJfVxuXAorICAucmVsYS5nb3QgICAgMCA6IHsgKigucmVsYS5nb3QpCQl9XG5cCisgIC5yZWwuY3RvcnMgICAwIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKKyAgLnJlbGEuY3RvcnMgIDAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKKyAgLnJlbC5kdG9ycyAgIDAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAorICAucmVsYS5kdG9ycyAgMCA6IHsgKigucmVsYS5kdG9ycykJfVxuXAorICAucmVsLmluaXQgICAgMCA6IHsgKigucmVsLmluaXQpCX1cblwKKyAgLnJlbGEuaW5pdCAgIDAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAorICAucmVsLmZpbmkgICAgMCA6IHsgKigucmVsLmZpbmkpCX1cblwKKyAgLnJlbGEuZmluaSAgIDAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAorICAucmVsLmJzcyAgICAgMCA6IHsgKigucmVsLmJzcykJCX1cblwKKyAgLnJlbGEuYnNzICAgIDAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAorICAucmVsLnBsdCAgICAgMCA6IHsgKigucmVsLnBsdCkJCX1cblwKKyAgLnJlbGEucGx0ICAgIDAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAorICAucm9kYXRhICAwIDogeyAqKC5yb2RhdGEpICB9XG5cCisgIC5yb2RhdGExIDAgOiB7ICooLnJvZGF0YTEpIH1cblwKKyAgLmluaXQgICAgICAgIDAgOiB7ICooLmluaXQpCX0gPTBcblwKKyAgLnRleHQgICAgMCA6XG5cCisgIHtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnN0dWIpXG5cCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCisgICAgKiguZ251Lndhcm5pbmcpXG5cCisgIH0gPTBcblwKKyAgLmZpbmkgICAgMCA6IHsgKiguZmluaSkgICAgfSA9MFxuXAorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAorICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKKyAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCisgICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCisgICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCisgICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKKyAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAorICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAorICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCisgICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCisgICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAorICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCisgICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKKyAgLmRhdGEgIDAgOlxuXAorICB7XG5cCisgICAgKiguZGF0YSlcblwKKyAgICBDT05TVFJVQ1RPUlNcblwKKyAgfVxuXAorICAuZGF0YTEgMCA6IHsgKiguZGF0YTEpIH1cblwKKyAgLmN0b3JzICAgICAgIDAgOiB7ICooLmN0b3JzKSAgIH1cblwKKyAgLmR0b3JzICAgICAgIDAgOiB7ICooLmR0b3JzKSAgIH1cblwKKyAgLmdvdCAgICAgICAgIDAgOlxuXAorICB7XG5cCisgICAgKiguZ290LnBsdCkgKiguZ290KVxuXAorICAgfVxuXAorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAorICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCisgIC5zZGF0YSAgIDAgOiB7ICooLnNkYXRhKSB9XG5cCisgIC5zYnNzICAgIDAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKKyAgLmJzcyAgICAgMCA6XG5cCisgIHtcblwKKyAgICooLmR5bmJzcylcblwKKyAgICooLmJzcylcblwKKyAgICooQ09NTU9OKVxuXAorICB9XG5cCisgIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAorICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAorICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCisgIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCisgICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAorICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCisgICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAorICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAorICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKKyAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAuICAqL1xuXAorICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCisgIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKK31cblxuIjsKKyAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQorICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCisJICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCitPVVRQVVRfQVJDSChtaXBzKVxuXAorRU5UUlkoX3N0YXJ0KVxuXAorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlc1xuXAorICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZ1xuXAorICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZFxuXAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovXG5cCitTRUNUSU9OU1xuXAore1xuXAorICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKKyAgLmludGVycCAgIDAgOiB7ICooLmludGVycCkgCX1cblwKKyAgLnJlZ2luZm8gICAgIDAgOiB7ICooLnJlZ2luZm8pIH1cblwKKyAgLmR5bmFtaWMgICAgIDAgOiB7ICooLmR5bmFtaWMpIH1cblwKKyAgLmR5bnN0ciAgICAgIDAgOiB7ICooLmR5bnN0cikJCX1cblwKKyAgLmR5bnN5bSAgICAgIDAgOiB7ICooLmR5bnN5bSkJCX1cblwKKyAgLmhhc2ggICAgICAgIDAgOiB7ICooLmhhc2gpCQl9XG5cCisgIC5yZWwudGV4dCAgICAwIDogeyAqKC5yZWwudGV4dCkJCX1cblwKKyAgLnJlbGEudGV4dCAgIDAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKKyAgLnJlbC5kYXRhICAgIDAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAorICAucmVsYS5kYXRhICAgMCA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAorICAucmVsLnJvZGF0YSAgMCA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKKyAgLnJlbGEucm9kYXRhIDAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAorICAucmVsLmdvdCAgICAgMCA6IHsgKigucmVsLmdvdCkJCX1cblwKKyAgLnJlbGEuZ290ICAgIDAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAorICAucmVsLmN0b3JzICAgMCA6IHsgKigucmVsLmN0b3JzKQl9XG5cCisgIC5yZWxhLmN0b3JzICAwIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCisgIC5yZWwuZHRvcnMgICAwIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKKyAgLnJlbGEuZHRvcnMgIDAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKKyAgLnJlbC5pbml0ICAgIDAgOiB7ICooLnJlbC5pbml0KQl9XG5cCisgIC5yZWxhLmluaXQgICAwIDogeyAqKC5yZWxhLmluaXQpCX1cblwKKyAgLnJlbC5maW5pICAgIDAgOiB7ICooLnJlbC5maW5pKQl9XG5cCisgIC5yZWxhLmZpbmkgICAwIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKKyAgLnJlbC5ic3MgICAgIDAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCisgIC5yZWxhLmJzcyAgICAwIDogeyAqKC5yZWxhLmJzcykJCX1cblwKKyAgLnJlbC5wbHQgICAgIDAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCisgIC5yZWxhLnBsdCAgICAwIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKKyAgLnJvZGF0YSAgMCA6IHsgKigucm9kYXRhKSAgfVxuXAorICAucm9kYXRhMSAwIDogeyAqKC5yb2RhdGExKSB9XG5cCisgIC5pbml0ICAgICAgICAwIDogeyAqKC5pbml0KQl9ID0wXG5cCisgIC50ZXh0ICAgIDAgOlxuXAorICB7XG5cCisgICAgKigudGV4dClcblwKKyAgICAqKC5zdHViKVxuXAorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAorICAgICooLmdudS53YXJuaW5nKVxuXAorICB9ID0wXG5cCisgIC5maW5pICAgIDAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCisgICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAorICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAorICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAorICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCisgICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKKyAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKKyAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAorICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAorICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKKyAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAorICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCisgIC5kYXRhICAwIDpcblwKKyAge1xuXAorICAgICooLmRhdGEpXG5cCisgIH1cblwKKyAgLmRhdGExIDAgOiB7ICooLmRhdGExKSB9XG5cCisgIC5jdG9ycyAgICAgICAwIDogeyAqKC5jdG9ycykgICB9XG5cCisgIC5kdG9ycyAgICAgICAwIDogeyAqKC5kdG9ycykgICB9XG5cCisgIC5nb3QgICAgICAgICAwIDpcblwKKyAge1xuXAorICAgICooLmdvdC5wbHQpICooLmdvdClcblwKKyAgIH1cblwKKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAorICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAorICAuc2RhdGEgICAwIDogeyAqKC5zZGF0YSkgfVxuXAorICAuc2JzcyAgICAwIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCisgIC5ic3MgICAgIDAgOlxuXAorICB7XG5cCisgICAqKC5keW5ic3MpXG5cCisgICAqKC5ic3MpXG5cCisgICAqKENPTU1PTilcblwKKyAgfVxuXAorICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKKyAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAorICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKKyAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAorICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAorICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgLiAgKi9cblwKKyAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAorICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCit9XG5cbiI7CisgIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCisgICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKKwkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKK09VVFBVVF9BUkNIKG1pcHMpXG5cCitFTlRSWShfc3RhcnQpXG5cCisgU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAorICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAorICAuID0gMHgwNDAwMDAwO1xuXAorICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAorICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAorICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAorICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKKyAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAorICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKKyAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAorICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCisgIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKKyAgLnRleHQgICAgICA6XG5cCisgIHtcblwKKyAgICBfZnRleHQgPSAuIDtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnN0dWIpXG5cCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCisgICAgKiguZ251Lndhcm5pbmcpXG5cCisgIH0gPTBcblwKKyAgX2V0ZXh0ID0gLjtcblwKKyAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAorICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKKyAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCisgICAgICAgLiA9IC47XG5cCisgICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCisgICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCisgICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKKyAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAorICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAorICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCisgICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCisgICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAorICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCisgICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKKyAgLiArPSAuIC0gMHgwNDAwMDAwO1xuXAorICAuZGF0YSAgICA6XG5cCisgIHtcblwKKyAgICBfZmRhdGEgPSAuIDtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgIENPTlNUUlVDVE9SU1xuXAorICB9XG5cCisgIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAorICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAorICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAorICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCisgIC5nb3QgICAgICAgICAgIDpcblwKKyAge1xuXAorICAgICooLmdvdC5wbHQpICooLmdvdClcblwKKyAgIH1cblwKKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAorICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAorICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAorICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAorICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAorICBfZWRhdGEgID0gIC47XG5cCisgIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCisgIF9fYnNzX3N0YXJ0ID0gLjtcblwKKyAgX2Zic3MgPSAuO1xuXAorICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCisgIC5ic3MgICAgICAgOlxuXAorICB7XG5cCisgICAqKC5keW5ic3MpXG5cCisgICAqKC5ic3MpXG5cCisgICAqKENPTU1PTilcblwKKyAgfVxuXAorICBfZW5kID0gLiA7XG5cCisgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAorICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKKyAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAorICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKKyAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAorICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAorICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAorfVxuXG4iOworICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKKyAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAorCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAorT1VUUFVUX0FSQ0gobWlwcylcblwKK0VOVFJZKF9zdGFydClcblwKKyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1lbGYvbGliKTtcblwKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/XG5cCisgICBfX0RZTkFNSUMgPSAwOyAgICAqL1xuXAorU0VDVElPTlNcblwKK3tcblwKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCisgIC4gPSAweDA0MDAwMDA7XG5cCisgIC5pbnRlcnAgICAgIDogeyAqKC5pbnRlcnApIAl9XG5cCisgIC5yZWdpbmZvICAgICAgIDogeyAqKC5yZWdpbmZvKSB9XG5cCisgIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9XG5cCisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9XG5cCisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9XG5cCisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfVxuXAorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9XG5cCisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfVxuXAorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9XG5cCisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCisgIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfVxuXAorICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9XG5cCisgIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfVxuXAorICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9XG5cCisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfVxuXAorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9XG5cCisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfVxuXAorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9XG5cCisgIC5yb2RhdGEgICAgOiB7ICooLnJvZGF0YSkgIH1cblwKKyAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfVxuXAorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfSA9MFxuXAorICAudGV4dCAgICAgIDpcblwKKyAge1xuXAorICAgIF9mdGV4dCA9IC4gO1xuXAorICAgICooLnRleHQpXG5cCisgICAgKiguc3R1YilcblwKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKKyAgICAqKC5nbnUud2FybmluZylcblwKKyAgfSA9MFxuXAorICBfZXRleHQgPSAuO1xuXAorICBQUk9WSURFIChldGV4dCA9IC4pO1xuXAorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAorICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKKyAgICAgICAuID0gMHgxMDAwMDAwMDtcblwKKyAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKKyAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKKyAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAorICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCisgICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCisgICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKKyAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKKyAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCisgICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKKyAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAorICAuICs9IDB4MTAwMDAwMDAgLSAweDA0MDAwMDA7XG5cCisgIC5kYXRhICAgIDpcblwKKyAge1xuXAorICAgIF9mZGF0YSA9IC4gO1xuXAorICAgICooLmRhdGEpXG5cCisgICAgQ09OU1RSVUNUT1JTXG5cCisgIH1cblwKKyAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9XG5cCisgIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykgICB9XG5cCisgIC5kdG9ycyAgICAgICAgIDogeyAqKC5kdG9ycykgICB9XG5cCisgIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDtcblwKKyAgLmdvdCAgICAgICAgICAgOlxuXAorICB7XG5cCisgICAgKiguZ290LnBsdCkgKiguZ290KVxuXAorICAgfVxuXAorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0c1xuXAorICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvXG5cCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovXG5cCisgIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9XG5cCisgIC5saXQ4IDogeyAqKC5saXQ4KSB9XG5cCisgIC5saXQ0IDogeyAqKC5saXQ0KSB9XG5cCisgIF9lZGF0YSAgPSAgLjtcblwKKyAgUFJPVklERSAoZWRhdGEgPSAuKTtcblwKKyAgX19ic3Nfc3RhcnQgPSAuO1xuXAorICBfZmJzcyA9IC47XG5cCisgIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH1cblwKKyAgLmJzcyAgICAgICA6XG5cCisgIHtcblwKKyAgICooLmR5bmJzcylcblwKKyAgICooLmJzcylcblwKKyAgICooQ09NTU9OKVxuXAorICB9XG5cCisgIF9lbmQgPSAuIDtcblwKKyAgUFJPVklERSAoZW5kID0gLik7XG5cCisgIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlblxuXAorICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqL1xuXAorICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9XG5cCisgIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH1cblwKKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuXG5cCisgICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuXAorICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuXG5cCisgICAgIGZvciB0aGUgb3RoZXJzLiAgICovXG5cCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfVxuXAorICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfVxuXAorICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfVxuXAorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH1cblwKKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH1cblwKKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH1cblwKKyAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi9cblwKKyAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAorICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCit9XG5cbiI7CisgIGVsc2UgaWYgKGxpbmtfaW5mby5zaGFyZWQpCisgICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKKwkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKK09VVFBVVF9BUkNIKG1pcHMpXG5cCitFTlRSWShfc3RhcnQpXG5cCisgU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAorICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAorICAuID0gMHg1ZmZlMDAwMCArIFNJWkVPRl9IRUFERVJTO1xuXAorICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAorICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAorICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKKyAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAorICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKKyAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAorICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCisgIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKKyAgLnRleHQgICAgICA6XG5cCisgIHtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnN0dWIpXG5cCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCisgICAgKiguZ251Lndhcm5pbmcpXG5cCisgIH0gPTBcblwKKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAorICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKKyAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCisgICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCisgICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCisgICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCisgICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKKyAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAorICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAorICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCisgICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCisgICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAorICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCisgICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKKyAgLiArPSAweDEwMDAwO1xuXAorICAuZGF0YSAgICA6XG5cCisgIHtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgIENPTlNUUlVDVE9SU1xuXAorICB9XG5cCisgIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAorICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAorICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAorICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCisgIC5nb3QgICAgICAgICAgIDpcblwKKyAge1xuXAorICAgICooLmdvdC5wbHQpICooLmdvdClcblwKKyAgIH1cblwKKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAorICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAorICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAorICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAorICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAorICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCisgIC5ic3MgICAgICAgOlxuXAorICB7XG5cCisgICAqKC5keW5ic3MpXG5cCisgICAqKC5ic3MpXG5cCisgICAqKENPTU1PTilcblwKKyAgfVxuXAorICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKKyAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAorICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKKyAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAorICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAorICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAorfVxuXG4iOworICBlbHNlCisgICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKKwkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKK09VVFBVVF9BUkNIKG1pcHMpXG5cCitFTlRSWShfc3RhcnQpXG5cCisgU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAorICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAorICAuID0gMHgwNDAwMDAwO1xuXAorICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAorICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAorICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAorICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKKyAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAorICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKKyAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAorICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCisgIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKKyAgLnRleHQgICAgICA6XG5cCisgIHtcblwKKyAgICBfZnRleHQgPSAuIDtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnN0dWIpXG5cCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCisgICAgKiguZ251Lndhcm5pbmcpXG5cCisgIH0gPTBcblwKKyAgX2V0ZXh0ID0gLjtcblwKKyAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAorICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKKyAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCisgICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCisgICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCisgICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCisgICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKKyAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAorICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAorICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCisgICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCisgICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAorICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCisgICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKKyAgLiArPSAweDEwMDAwMDAwIC0gMHgwNDAwMDAwO1xuXAorICAuZGF0YSAgICA6XG5cCisgIHtcblwKKyAgICBfZmRhdGEgPSAuIDtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgIENPTlNUUlVDVE9SU1xuXAorICB9XG5cCisgIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAorICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAorICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAorICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCisgIC5nb3QgICAgICAgICAgIDpcblwKKyAge1xuXAorICAgICooLmdvdC5wbHQpICooLmdvdClcblwKKyAgIH1cblwKKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAorICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAorICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAorICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAorICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAorICBfZWRhdGEgID0gIC47XG5cCisgIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCisgIF9fYnNzX3N0YXJ0ID0gLjtcblwKKyAgX2Zic3MgPSAuO1xuXAorICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCisgIC5ic3MgICAgICAgOlxuXAorICB7XG5cCisgICAqKC5keW5ic3MpXG5cCisgICAqKC5ic3MpXG5cCisgICAqKENPTU1PTilcblwKKyAgfVxuXAorICBfZW5kID0gLiA7XG5cCisgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAorICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKKyAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAorICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKKyAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAorICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAorICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCisgIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKKyAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAorfVxuXG4iOworfQorCitzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2VsZjMyZWJtaXBfZW11bGF0aW9uID0gCit7CisgIGdsZGVsZjMyZWJtaXBfYmVmb3JlX3BhcnNlLAorICBzeXNsaWJfZGVmYXVsdCwKKyAgaGxsX2RlZmF1bHQsCisgIGFmdGVyX3BhcnNlX2RlZmF1bHQsCisgIGdsZGVsZjMyZWJtaXBfYWZ0ZXJfb3BlbiwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uLAorICBnbGRlbGYzMmVibWlwX2dldF9zY3JpcHQsCisgICJlbGYzMmVibWlwIiwKKyAgImVsZjMyLWJpZ21pcHMiLAorICBOVUxMLAorICBOVUxMLAorICBnbGRlbGYzMmVibWlwX29wZW5fZHluYW1pY19hcmNoaXZlLAorICBnbGRlbGYzMmVibWlwX3BsYWNlX29ycGhhbgorfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1lcHBjbWFjLmMgYi9sZC9tcHctZXBwY21hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDlhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9tcHctZXBwY21hYy5jCkBAIC0wLDAgKzEsMTIyNCBAQAorLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLworCisvKiBBSVggZW11bGF0aW9uIGNvZGUgZm9yIHBwY21hY29zCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KKyAgIEFJWCBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9JU19wcGNtYWNvcworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAibGRmaWxlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZGN0b3IuaCIKKyNpbmNsdWRlICJsZGdyYW0uaCIKKworc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKK3N0YXRpYyB2b2lkIGdsZHBwY21hY29zX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOworc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZnJlZSBQQVJBTVMgKChQVFIpKTsKK3N0YXRpYyB2b2lkIGdsZHBwY21hY29zX2ZpbmRfcmVsb2NzCisgIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOworc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKK3N0YXRpYyBjaGFyICpnbGRwcGNtYWNvc19nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CisKKy8qIFRoZSBmaWxlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247CisKKy8qIFRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrIGlzIHBlcm1pdHRlZCB0byBncm93LiAgVGhpcyBpcyBzdG9yZWQgaW4KKyAgIHRoZSBhLm91dCBoZWFkZXIuICAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7CisKKy8qIFRoZSBtYXhpbXVtIGRhdGEgc2l6ZS4gIFRoaXMgaXMgc3RvcmVkIGluIHRoZSBhLm91dCBoZWFkZXIuICAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKKworLyogV2hldGhlciB0byBwZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCitzdGF0aWMgaW50IGdjID0gMTsKKworLyogVGhlIG1vZHVsZSB0eXBlIHRvIHVzZS4gICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7CisKKy8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkgKGkuZS4sIG5vIHJlbG9jcworICAgcGVybWl0dGVkKS4gICovCitzdGF0aWMgaW50IHRleHRybzsKKworLyogV2hldGhlciB0byBpbXBsZW1lbnQgVW5peCBsaWtlIGxpbmtlciBzZW1hbnRpY3MuICAqLworc3RhdGljIGludCB1bml4X2xkOworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGltcG9ydCBmaWxlIGxpc3QuICAqLworCitzdHJ1Y3QgZmlsZWxpc3QKK3sKKyAgc3RydWN0IGZpbGVsaXN0ICpuZXh0OworICBjb25zdCBjaGFyICpuYW1lOworfTsKKworLyogTGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLworc3RhdGljIHN0cnVjdCBmaWxlbGlzdCAqaW1wb3J0X2ZpbGVzOworCisvKiBMaXN0IG9mIGV4cG9ydCBzeW1ib2xzIHJlYWQgZnJvbSB0aGUgZXhwb3J0IGZpbGVzLiAgKi8KKworc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdAoreworICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuZXh0OworICBjb25zdCBjaGFyICpuYW1lOworICBib29sZWFuIHN5c2NhbGw7Cit9OworCitzdGF0aWMgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZXhwb3J0X3N5bWJvbHM7CisKKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgZG9uZS4gICovCisKK3N0YXRpYyB2b2lkCitnbGRwcGNtYWNvc19iZWZvcmVfcGFyc2UoKQoreworI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLworICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX3Bvd2VycGM7CisjZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KK30KKworLyogSGFuZGxlIEFJWCBzcGVjaWZpYyBvcHRpb25zLiAgKi8KKworc3RhdGljIGludAorZ2xkcHBjbWFjb3NfcGFyc2VfYXJncyAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKKyAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7CisgIGludCBpbmR4OworICBpbnQgbG9uZ2luZDsKKyAgaW50IG9wdGM7CisgIGxvbmcgdmFsOworICBjaGFyICplbmQ7CisKKyNkZWZpbmUgT1BUSU9OX0lHTk9SRSAoMzAwKQorI2RlZmluZSBPUFRJT05fQVVUT0lNUCAoT1BUSU9OX0lHTk9SRSArIDEpCisjZGVmaW5lIE9QVElPTl9FUk5PVE9LIChPUFRJT05fQVVUT0lNUCArIDEpCisjZGVmaW5lIE9QVElPTl9FUk9LIChPUFRJT05fRVJOT1RPSyArIDEpCisjZGVmaW5lIE9QVElPTl9FWFBPUlQgKE9QVElPTl9FUk9LICsgMSkKKyNkZWZpbmUgT1BUSU9OX0lNUE9SVCAoT1BUSU9OX0VYUE9SVCArIDEpCisjZGVmaW5lIE9QVElPTl9MT0FETUFQIChPUFRJT05fSU1QT1JUICsgMSkKKyNkZWZpbmUgT1BUSU9OX01BWERBVEEgKE9QVElPTl9MT0FETUFQICsgMSkKKyNkZWZpbmUgT1BUSU9OX01BWFNUQUNLIChPUFRJT05fTUFYREFUQSArIDEpCisjZGVmaW5lIE9QVElPTl9NT0RUWVBFIChPUFRJT05fTUFYU1RBQ0sgKyAxKQorI2RlZmluZSBPUFRJT05fTk9BVVRPSU1QIChPUFRJT05fTU9EVFlQRSArIDEpCisjZGVmaW5lIE9QVElPTl9OT1NUUkNNUENUIChPUFRJT05fTk9BVVRPSU1QICsgMSkKKyNkZWZpbmUgT1BUSU9OX1BEIChPUFRJT05fTk9TVFJDTVBDVCArIDEpCisjZGVmaW5lIE9QVElPTl9QVCAoT1BUSU9OX1BEICsgMSkKKyNkZWZpbmUgT1BUSU9OX1NUUkNNUENUIChPUFRJT05fUFQgKyAxKQorI2RlZmluZSBPUFRJT05fVU5JWCAoT1BUSU9OX1NUUkNNUENUICsgMSkKKworICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworICAgIHsiYmFzaXMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCisgICAgeyJiYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCisgICAgeyJiY29tcHJsZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJjcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAorICAgIHsiYmNyb3IzMSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKKyAgICB7ImJFIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWFBPUlR9LAorICAgIHsiYmVybm90b2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VSTk9UT0t9LAorICAgIHsiYmVyb2siLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VST0t9LAorICAgIHsiYmVycm1zZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJleHBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCisgICAgeyJiZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCisgICAgeyJiZ2MiLCBub19hcmd1bWVudCwgJmdjLCAxfSwKKyAgICB7ImJoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAorICAgIHsiYmhhbHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCisgICAgeyJiSSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKKyAgICB7ImJpbXBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNUE9SVH0sCisgICAgeyJibCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCisgICAgeyJibG9hZG1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTE9BRE1BUH0sCisgICAgeyJibWF4ZGF0YSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYREFUQX0sCisgICAgeyJibWF4c3RhY2siLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKKyAgICB7ImJNIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKKyAgICB7ImJtb2R0eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NT0RUWVBFfSwKKyAgICB7ImJub2F1dG9pbXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCisgICAgeyJibm9kZWxjc2VjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKKyAgICB7ImJub2VudHJ5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAorICAgIHsiYm5vZ2MiLCBub19hcmd1bWVudCwgJmdjLCAwfSwKKyAgICB7ImJuc28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCisgICAgeyJibm9zdHJjbXBjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9TVFJDTVBDVH0sCisgICAgeyJibm90ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCisgICAgeyJibnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDB9LAorICAgIHsiYnBEIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QRH0sCisgICAgeyJicFQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BUfSwKKyAgICB7ImJybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAxfSwKKyAgICB7ImJTIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhTVEFDS30sCisgICAgeyJic28iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FVVE9JTVB9LAorICAgIHsiYnN0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVFJDTVBDVH0sCisgICAgeyJidGV4dHJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAorICAgIHsic3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0FVVE9JTVB9LAorICAgIHsidW5peCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVU5JWH0sCisgICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQorICB9OworCisgIC8qIE9wdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBBSVggbGlua2VyIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0OiAtZiwKKyAgICAgLVMsIC12LCAtWiwgLWJiaW5kY21kcywgLWJiaW5kZXIsIC1iYmluZG9wdHMsIC1iY2FsbHMsIC1iY2FwcywKKyAgICAgLWJjcm9yMTUsIC1iZGVidWdvcHQsIC1iZGJnLCAtYmRlbGNzZWN0LCAtYmV4PywgLWJmaWxlbGlzdCwgLWJmbCwKKyAgICAgLWJnY2J5cGFzcywgLWJnbGluaywgLWJpbnNlcnQsIC1iaSwgLWJsb2FkbWFwLCAtYmwsIC1ibWFwLCAtYm5sLAorICAgICAtYm5vYmluZCwgLWJub2NvbXBybGQsIC1ibm9jcmxkLCAtYm5vZXJybXNnLCAtYm5vZ2xpbmssCisgICAgIC1ibm9sb2FkbWFwLCAtYm5sLCAtYm5vb2JqcmVvcmRlciwgLWJub3F1aWV0LCAtYm5vcmVvcmRlciwKKyAgICAgLWJub3R5cGNoaywgLWJub3gsIC1icXVpZXQsIC1iUiwgLWJyZW5hbWUsIC1icmVvcmRlciwgLWJ0eXBjaGssCisgICAgIC1ieCwgLWJYLCAtYnhyZWYuICAqLworCisgIC8qIElmIHRoZSBjdXJyZW50IG9wdGlvbiBzdGFydHMgd2l0aCAtYiwgY2hhbmdlIHRoZSBmaXJzdCA6IHRvIGFuID0uCisgICAgIFRoZSBBSVggbGlua2VyIHVzZXMgOiB0byBzZXBhcmF0ZSB0aGUgb3B0aW9uIGZyb20gdGhlIGFyZ3VtZW50OworICAgICBjaGFuZ2luZyBpdCB0byA9IGxldHMgdXMgdHJlYXQgaXQgYXMgYSBnZXRvcHQgb3B0aW9uLiAgKi8KKyAgaW5keCA9IG9wdGluZDsKKyAgaWYgKGluZHggPT0gMCkKKyAgICBpbmR4ID0gMTsKKyAgaWYgKGluZHggPCBhcmdjICYmIHN0cm5jbXAgKGFyZ3ZbaW5keF0sICItYiIsIDIpID09IDApCisgICAgeworICAgICAgY2hhciAqczsKKworICAgICAgZm9yIChzID0gYXJndltpbmR4XTsgKnMgIT0gJ1wwJzsgcysrKQorCXsKKwkgIGlmICgqcyA9PSAnOicpCisJICAgIHsKKwkgICAgICAqcyA9ICc9JzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgb3B0ZXJyID0gMDsKKyAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItRDpIOktUOnoiLCBsb25nb3B0cywgJmxvbmdpbmQpOworICBvcHRlcnIgPSBwcmV2b3B0ZXJyOworCisgIHN3aXRjaCAob3B0YykKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIG9wdGluZCA9IHByZXZvcHRpbmQ7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgMDoKKyAgICAgIC8qIExvbmcgb3B0aW9uIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWcuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdEJzoKKyAgICAgIHZhbCA9IHN0cnRvbCAob3B0YXJnLCAmZW5kLCAwKTsKKyAgICAgIGlmICgqZW5kICE9ICdcMCcpCisJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1EIG51bWJlciAlc1xuIiksIG9wdGFyZyk7CisgICAgICBlbHNlIGlmICh2YWwgIT0gLTEpCisJbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBleHBfaW50b3AgKHZhbCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdIJzoKKyAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7CisgICAgICBpZiAoKmVuZCAhPSAnXDAnCisJICB8fCAodmFsICYgKHZhbCAtIDEpKSAhPSAwKQorCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtSCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOworICAgICAgZWxzZQorCWZpbGVfYWxpZ24gPSB2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0snOgorICAgIGNhc2UgJ3onOgorICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgdGFyZ2V0IHN5c3RlbS4gICovCisgICAgICBmaWxlX2FsaWduID0gNDA5NjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVCc6CisgICAgICAvKiBPbiBBSVggdGhpcyBpcyB0aGUgc2FtZSBhcyBHTlUgbGQgLVR0ZXh0LiAgV2hlbiB3ZSBzZWUgLVQKKyAgICAgICAgIG51bWJlciwgd2UgYXNzdW1lIHRoZSBBSVggb3B0aW9uIGlzIGludGVuZGVkLiAgT3RoZXJ3aXNlLCB3ZQorICAgICAgICAgYXNzdW1lIHRoZSB1c3VhbCBHTlUgbGQgLVQgb3B0aW9uIGlzIGludGVuZGVkLiAgV2UgY2FuJ3QganVzdAorICAgICAgICAgaWdub3JlIHRoZSBBSVggb3B0aW9uLCBiZWNhdXNlIGdjYyBwYXNzZXMgaXQgdG8gdGhlIGxpbmtlci4gICovCisgICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwl7CisJICBvcHRpbmQgPSBwcmV2b3B0aW5kOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCBleHBfaW50b3AgKHZhbCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9JR05PUkU6CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0FVVE9JTVA6CisgICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fRVJOT1RPSzoKKyAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9FUk9LOgorICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fRVhQT1JUOgorICAgICAgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChvcHRhcmcsIGZhbHNlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fSU1QT1JUOgorICAgICAgeworCXN0cnVjdCBmaWxlbGlzdCAqbjsKKwlzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOworCisJbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKKwluLT5uZXh0ID0gTlVMTDsKKwluLT5uYW1lID0gb3B0YXJnOworCWZscHAgPSAmaW1wb3J0X2ZpbGVzOworCXdoaWxlICgqZmxwcCAhPSBOVUxMKQorCSAgZmxwcCA9ICYoKmZscHApLT5uZXh0OworCSpmbHBwID0gbjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTE9BRE1BUDoKKyAgICAgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX01BWERBVEE6CisgICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhkYXRhIG51bWJlciAlc1xuIiksCisJICAgICAgIG9wdGFyZyk7CisgICAgICBlbHNlCisJbWF4ZGF0YSA9IHZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTUFYU1RBQ0s6CisgICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOworICAgICAgaWYgKCplbmQgIT0gJ1wwJykKKwllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLWJtYXhzdGFjayBudW1iZXIgJXNcbiIpLAorCSAgICAgICBvcHRhcmcpOworICAgICAgZWxzZQorCW1heHN0YWNrID0gdmFsOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9NT0RUWVBFOgorICAgICAgaWYgKCpvcHRhcmcgPT0gJ1MnKQorCXsKKwkgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOworCSAgKytvcHRhcmc7CisJfQorICAgICAgaWYgKCpvcHRhcmcgPT0gJ1wwJyB8fCBvcHRhcmdbMV0gPT0gJ1wwJykKKwllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgbW9kdWxlIHR5cGUgJXNcbiIpLCBvcHRhcmcpOworICAgICAgZWxzZQorCW1vZHR5cGUgPSAoKm9wdGFyZyA8PCA4KSB8IG9wdGFyZ1sxXTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTk9BVVRPSU1QOgorICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fTk9TVFJDTVBDVDoKKyAgICAgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QRDoKKyAgICAgIC8qIFRoaXMgc2V0cyB0aGUgcGFnZSB0aGF0IHRoZSAuZGF0YSBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvCisgICAgICAgICBzdGFydCBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUKKyAgICAgICAgIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUsIHNvIHdlIG5lZWQgdG8gYnVpbGQgYW4gYXBwcm9wcmlhdGUKKyAgICAgICAgIGV4cHJlc3Npb24uICAqLworICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKKyAgICAgIGlmICgqZW5kICE9ICdcMCcpCisJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wRCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOworICAgICAgZWxzZQorCXsKKwkgIGV0cmVlX3R5cGUgKnQ7CisKKwkgIHQgPSBleHBfYmlub3AgKCcrJywKKwkJCSBleHBfaW50b3AgKHZhbCksCisJCQkgZXhwX2Jpbm9wICgnJicsCisJCQkJICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIiksCisJCQkJICAgIGV4cF9pbnRvcCAoMHhmZmYpKSk7CisJICB0ID0gZXhwX2Jpbm9wICgnJicsCisJCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoNykpLAorCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgNykpOworCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCB0KTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1BUOgorICAgICAgLyogVGhpcyBzZXQgdGhlIHBhZ2UgdGhhdCB0aGUgLnRleHQgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byBzdGFydAorICAgICAgICAgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlIG9mZnNldAorICAgICAgICAgd2l0aGluIHRoZSBmaWxlLiAgKi8KKyAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7CisgICAgICBpZiAoKmVuZCAhPSAnXDAnKQorCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtcFQgbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKKyAgICAgIGVsc2UKKwl7CisJICBldHJlZV90eXBlICp0OworCisJICB0ID0gZXhwX2Jpbm9wICgnKycsCisJCQkgZXhwX2ludG9wICh2YWwpLAorCQkJIGV4cF9uYW1lb3AgKFNJWkVPRl9IRUFERVJTLCBOVUxMKSk7CisJICB0ID0gZXhwX2Jpbm9wICgnJicsCisJCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoNykpLAorCQkJIGV4cF9pbnRvcCAofiAoYmZkX3ZtYSkgNykpOworCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLnRleHQiLCB0KTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1NUUkNNUENUOgorICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9VTklYOgorICAgICAgdW5peF9sZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYSBCRkQKKyAgIG9iamVjdCBvciBhbiBhcmNoaXZlLiAgSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggIyEsIHdlIG11c3QgdHJlYXQgaXQKKyAgIGFzIGFuIGltcG9ydCBmaWxlLiAgVGhpcyBpcyBmb3IgQUlYIGNvbXBhdGliaWxpdHkuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ2xkcHBjbWFjb3NfdW5yZWNvZ25pemVkX2ZpbGUgKGVudHJ5KQorICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKK3sKKyAgRklMRSAqZTsKKyAgYm9vbGVhbiByZXQ7CisKKyAgZSA9IGZvcGVuIChlbnRyeS0+ZmlsZW5hbWUsIEZPUEVOX1JUKTsKKyAgaWYgKGUgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0ID0gZmFsc2U7CisKKyAgaWYgKGdldGMgKGUpID09ICcjJyAmJiBnZXRjIChlKSA9PSAnIScpCisgICAgeworICAgICAgc3RydWN0IGZpbGVsaXN0ICpuOworICAgICAgc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKKworICAgICAgbiA9IChzdHJ1Y3QgZmlsZWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZmlsZWxpc3QpKTsKKyAgICAgIG4tPm5leHQgPSBOVUxMOworICAgICAgbi0+bmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKKyAgICAgIGZscHAgPSAmaW1wb3J0X2ZpbGVzOworICAgICAgd2hpbGUgKCpmbHBwICE9IE5VTEwpCisJZmxwcCA9ICYoKmZscHApLT5uZXh0OworICAgICAgKmZscHAgPSBuOworCisgICAgICByZXQgPSB0cnVlOworICAgICAgZW50cnktPmxvYWRlZCA9IHRydWU7CisgICAgfQorCisgIGZjbG9zZSAoZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuICAqLworCitzdGF0aWMgdm9pZAorZ2xkcHBjbWFjb3NfYWZ0ZXJfb3BlbiAoKQoreworICBib29sZWFuIHI7CisgIHN0cnVjdCBzZXRfaW5mbyAqcDsKKworICAvKiBDYWxsIGxkY3Rvcl9idWlsZF9zZXRzLCBhZnRlciBwcmV0ZW5kaW5nIHRoYXQgdGhpcyBpcyBhCisgICAgIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG8gdGhpcyBiZWNhdXNlIEFJWCByZXF1aXJlcyByZWxvY2F0aW9uCisgICAgIGVudHJpZXMgZm9yIGFsbCByZWZlcmVuY2VzIHRvIHN5bWJvbHMsIGV2ZW4gaW4gYSBmaW5hbAorICAgICBleGVjdXRhYmxlLiAgT2YgY291cnNlLCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBpZiB3ZSBhcmUKKyAgICAgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlLiAgKi8KKyAgciA9IGxpbmtfaW5mby5yZWxvY2F0ZWFibGU7CisgIGlmIChzdHJzdHIgKGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSwgInhjb2ZmIikgIT0gTlVMTCkKKyAgICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKKyAgbGRjdG9yX2J1aWxkX3NldHMgKCk7CisgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSByOworCisgIC8qIEZvciBlYWNoIHNldCwgcmVjb3JkIHRoZSBzaXplLCBzbyB0aGF0IHRoZSBYQ09GRiBiYWNrZW5kIGNhbgorICAgICBvdXRwdXQgdGhlIGNvcnJlY3QgY3NlY3QgbGVuZ3RoLiAgKi8KKyAgZm9yIChwID0gc2V0czsgcCAhPSAoc3RydWN0IHNldF9pbmZvICopIE5VTEw7IHAgPSBwLT5uZXh0KQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB3ZSBtYXkgaGF2ZSBiZWVuIGludm9rZWQgZnJvbQorCSBjb2xsZWN0LCBhbmQgdGhlIHNldHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGJ1aWx0LCBzbyB3ZSBkbworCSBub3QgZG8gYW55dGhpbmcuICAqLworICAgICAgaWYgKHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCisJICB8fCBwLT5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKKwljb250aW51ZTsKKworICAgICAgaWYgKHAtPnJlbG9jICE9IEJGRF9SRUxPQ19DVE9SKQorCXsKKwkgIC8qIEhhbmRsZSB0aGlzIGlmIHdlIG5lZWQgdG8uICAqLworCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBzaXplID0gKHAtPmNvdW50ICsgMikgKiA0OworICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcC0+aCwgc2l6ZSkpCisJZWluZm8gKF8oIiVGJVA6IGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgZmFpbGVkOiAlRVxuIikpOworICAgIH0KK30KKworLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKKyAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCisKK3N0YXRpYyB2b2lkCitnbGRwcGNtYWNvc19iZWZvcmVfYWxsb2NhdGlvbiAoKQoreworICBzdHJ1Y3QgZmlsZWxpc3QgKmZsOworICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICplbDsKKyAgY2hhciAqbGlicGF0aDsKKyAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07CisgIGludCBpOworCisgIC8qIEhhbmRsZSB0aGUgaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGlmIGFueS4gICovCisgIGZvciAoZmwgPSBpbXBvcnRfZmlsZXM7IGZsICE9IE5VTEw7IGZsID0gZmwtPm5leHQpCisgICAgZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChmbC0+bmFtZSwgdHJ1ZSk7CisgIGZvciAoZWwgPSBleHBvcnRfc3ltYm9sczsgZWwgIT0gTlVMTDsgZWwgPSBlbC0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKKworICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZWwtPm5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgaWYgKGggPT0gTlVMTCkKKwllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgb2YgZXhwb3J0IHN5bWJvbCBmYWlsZWQ6ICVFXG4iKSk7CisgICAgICBpZiAoISBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwgZWwtPnN5c2NhbGwpKQorCWVpbmZvIChfKCIlUCVGOiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCBmYWlsZWQ6ICVFXG4iKSk7CisgICAgfQorCisgIC8qIFRyYWNrIGRvd24gYWxsIHJlbG9jYXRpb25zIGNhbGxlZCBmb3IgYnkgdGhlIGxpbmtlciBzY3JpcHQgKHRoZXNlCisgICAgIGFyZSB0eXBpY2FsbHkgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBlbnRyaWVzIGNyZWF0ZWQgYnkKKyAgICAgQ09OU1RSVUNUT1JTKSBhbmQgbGV0IHRoZSBiYWNrZW5kIGtub3cgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZQorICAgICAubG9hZGVyIHJlbG9jcyBmb3IgdGhlbS4gICovCisgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGRwcGNtYWNvc19maW5kX3JlbG9jcyk7CisKKyAgLyogV2UgbmVlZCB0byBidWlsZCBMSUJQQVRIIGZyb20gdGhlIC1MIGFyZ3VtZW50cy4gIElmIGFueSAtcnBhdGgKKyAgICAgYXJndW1lbnRzIHdlcmUgdXNlZCwgdGhvdWdoLCB3ZSB1c2UgLXJwYXRoIGluc3RlYWQsIGFzIGEgR05VCisgICAgIGV4dGVuc2lvbi4gICovCisgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKKyAgICBsaWJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOworICBlbHNlIGlmIChzZWFyY2hfaGVhZCA9PSBOVUxMKQorICAgIGxpYnBhdGggPSAoY2hhciAqKSAiIjsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW47CisgICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7CisKKyAgICAgIGxlbiA9IHN0cmxlbiAoc2VhcmNoX2hlYWQtPm5hbWUpOworICAgICAgbGlicGF0aCA9IHhtYWxsb2MgKGxlbiArIDEpOworICAgICAgc3RyY3B5IChsaWJwYXRoLCBzZWFyY2hfaGVhZC0+bmFtZSk7CisgICAgICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkLT5uZXh0OyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQorCXsKKwkgIHNpemVfdCBubGVuOworCisJICBubGVuID0gc3RybGVuIChzZWFyY2gtPm5hbWUpOworCSAgbGlicGF0aCA9IHhyZWFsbG9jIChsaWJwYXRoLCBsZW4gKyBubGVuICsgMik7CisJICBsaWJwYXRoW2xlbl0gPSAnOic7CisJICBzdHJjcHkgKGxpYnBhdGggKyBsZW4gKyAxLCBzZWFyY2gtPm5hbWUpOworCSAgbGVuICs9IG5sZW4gKyAxOworCX0KKyAgICB9CisKKyAgLyogTGV0IHRoZSBYQ09GRiBiYWNrZW5kIHNldCB1cCB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KKyAgaWYgKCEgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgbGlicGF0aCwKKwkJCQkJIGVudHJ5X3N5bWJvbCwgZmlsZV9hbGlnbiwKKwkJCQkJIG1heHN0YWNrLCBtYXhkYXRhLAorCQkJCQkgZ2MgJiYgISB1bml4X2xkID8gdHJ1ZSA6IGZhbHNlLAorCQkJCQkgbW9kdHlwZSwKKwkJCQkJIHRleHRybyA/IHRydWUgOiBmYWxzZSwKKwkJCQkJIHVuaXhfbGQsCisJCQkJCSBzcGVjaWFsX3NlY3Rpb25zKSkKKyAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKSk7CisKKyAgLyogTG9vayB0aHJvdWdoIHRoZSBzcGVjaWFsIHNlY3Rpb25zLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHJpZ2h0CisgICAgIHBsYWNlIGluIHRoZSBsaW5rIG9yZGVyaW5nLiAgVGhpcyBpcyBlc3BlY2lhbGx5IG1hZ2ljLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICB7CisgICAgICBhc2VjdGlvbiAqc2VjOworICAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7CisgICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcGxzOworICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmlzOworICAgICAgY29uc3QgY2hhciAqb25hbWU7CisgICAgICBib29sZWFuIHN0YXJ0OworCisgICAgICBzZWMgPSBzcGVjaWFsX3NlY3Rpb25zW2ldOworICAgICAgaWYgKHNlYyA9PSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICAvKiBSZW1vdmUgdGhpcyBzZWN0aW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIG91dHB1dCBzZWN0aW9uLgorICAgICAgICAgVGhpcyBhc3N1bWVzIHdlIGtub3cgd2hhdCB0aGUgc2NyaXB0IGxvb2tzIGxpa2UuICAqLworICAgICAgaXMgPSBOVUxMOworICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOworICAgICAgaWYgKG9zID09IE5VTEwpCisJZWluZm8gKF8oIiVQJUY6IGNhbid0IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXNcbiIpLAorCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKKyAgICAgIGZvciAocGxzID0gJm9zLT5jaGlsZHJlbi5oZWFkOyAqcGxzICE9IE5VTEw7IHBscyA9ICYoKnBscyktPm5leHQpCisJeworCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KKwkgICAgICAmJiAoKnBscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCisJICAgIHsKKwkgICAgICBpcyA9IChsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqKSAqcGxzOworCSAgICAgICpwbHMgPSAoKnBscyktPm5leHQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgoKnBscyktPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bSkKKwkgICAgeworCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwd2xzOworCisJICAgICAgZm9yIChwd2xzID0gJigqcGxzKS0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKKwkJICAgKnB3bHMgIT0gTlVMTDsKKwkJICAgcHdscyA9ICYoKnB3bHMpLT5uZXh0KQorCQl7CisJCSAgaWYgKCgqcHdscyktPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtCisJCSAgICAgICYmICgqcHdscyktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiA9PSBzZWMpCisJCSAgICB7CisJCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwd2xzOworCQkgICAgICAqcHdscyA9ICgqcHdscyktPm5leHQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKGlzICE9IE5VTEwpCisJCWJyZWFrOworCSAgICB9CisJfQkKKworICAgICAgaWYgKGlzID09IE5VTEwpCisJZWluZm8gKF8oIiVQJUY6IGNhbid0IGZpbmQgJXMgaW4gb3V0cHV0IHNlY3Rpb25cbiIpLAorCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc2VjLT5vd25lciwgc2VjKSk7CisKKyAgICAgIC8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBzZWN0aW9uIHNob3VsZCBnby4gICovCisgICAgICBzd2l0Y2ggKGkpCisJeworCWRlZmF1bHQ6IC8qIHRvIGF2b2lkIHdhcm5pbmdzICovCisJY2FzZSAwOgorCSAgLyogX3RleHQgKi8KKwkgIG9uYW1lID0gIi50ZXh0IjsKKwkgIHN0YXJ0ID0gdHJ1ZTsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIC8qIF9ldGV4dCAqLworCSAgb25hbWUgPSAiLnRleHQiOworCSAgc3RhcnQgPSBmYWxzZTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIC8qIF9kYXRhICovCisJICBvbmFtZSA9ICIuZGF0YSI7CisJICBzdGFydCA9IHRydWU7CisJICBicmVhazsKKwljYXNlIDM6CisJICAvKiBfZWRhdGEgKi8KKwkgIG9uYW1lID0gIi5kYXRhIjsKKwkgIHN0YXJ0ID0gZmFsc2U7CisJICBicmVhazsKKwljYXNlIDQ6CisJY2FzZSA1OgorCSAgLyogX2VuZCBhbmQgZW5kICovCisJICBvbmFtZSA9ICIuYnNzIjsKKwkgIHN0YXJ0ID0gZmFsc2U7CisJICBicmVhazsKKwl9CisKKyAgICAgIG9zID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChvbmFtZSk7CisKKyAgICAgIGlmIChzdGFydCkKKwl7CisJICBpcy0+aGVhZGVyLm5leHQgPSBvcy0+Y2hpbGRyZW4uaGVhZDsKKwkgIG9zLT5jaGlsZHJlbi5oZWFkID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlzLT5oZWFkZXIubmV4dCA9IE5VTEw7CisJICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZvcy0+Y2hpbGRyZW4sCisJCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIGlzLAorCQkJCSAmaXMtPmhlYWRlci5uZXh0KTsKKwl9CisgICAgfQorfQorCisvKiBSZWFkIGFuIGltcG9ydCBvciBleHBvcnQgZmlsZS4gIEZvciBhbiBpbXBvcnQgZmlsZSwgdGhpcyBpcyBjYWxsZWQKKyAgIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiBlbXVsYXRpb24gcm91dGluZS4gIEZvciBhbiBleHBvcnQgZmlsZSwKKyAgIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZV9hcmdzIGVtdWxhdGlvbiByb3V0aW5lLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZHBwY21hY29zX3JlYWRfZmlsZSAoZmlsZW5hbWUsIGltcG9ydCkKKyAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgIGJvb2xlYW4gaW1wb3J0OworeworICBzdHJ1Y3Qgb2JzdGFjayAqbzsKKyAgRklMRSAqZjsKKyAgaW50IGxpbmVubzsKKyAgaW50IGM7CisgIGJvb2xlYW4ga2VlcDsKKyAgY29uc3QgY2hhciAqaW1wcGF0aDsKKyAgY29uc3QgY2hhciAqaW1wZmlsZTsKKyAgY29uc3QgY2hhciAqaW1wbWVtYmVyOworCisgIG8gPSAoc3RydWN0IG9ic3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb2JzdGFjaykpOworICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAobywgMCwgMCwgeG1hbGxvYywgZ2xkcHBjbWFjb3NfZnJlZSk7CisKKyAgZiA9IGZvcGVuIChmaWxlbmFtZSwgRk9QRU5fUlQpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CisgICAgICBlaW5mbyAoIiVGJXM6ICVFXG4iLCBmaWxlbmFtZSk7CisgICAgfQorCisgIGtlZXAgPSBmYWxzZTsKKworICBpbXBwYXRoID0gTlVMTDsKKyAgaW1wZmlsZSA9IE5VTEw7CisgIGltcG1lbWJlciA9IE5VTEw7CisKKyAgbGluZW5vID0gMDsKKyAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikKKyAgICB7CisgICAgICBjaGFyICpzOworICAgICAgY2hhciAqc3ltbmFtZTsKKyAgICAgIGJvb2xlYW4gc3lzY2FsbDsKKyAgICAgIGJmZF92bWEgYWRkcmVzczsKKyAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOworCisgICAgICBpZiAoYyAhPSAnXG4nKQorCXsKKwkgIG9ic3RhY2tfMWdyb3cgKG8sIGMpOworCSAgY29udGludWU7CisJfQorCisgICAgICBvYnN0YWNrXzFncm93IChvLCAnXDAnKTsKKyAgICAgICsrbGluZW5vOworCisgICAgICBzID0gKGNoYXIgKikgb2JzdGFja19iYXNlIChvKTsKKyAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQorCSsrczsKKyAgICAgIGlmICgqcyA9PSAnXDAnCisJICB8fCAqcyA9PSAnKicKKwkgIHx8ICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnICcpCisJICB8fCAoISBpbXBvcnQgJiYgKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKSkKKwl7CisJICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoKnMgPT0gJyMnICYmIHNbMV0gPT0gJyEnKQorCXsKKwkgIHMgKz0gMjsKKwkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQorCSAgICArK3M7CisJICBpZiAoKnMgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltcHBhdGggPSBOVUxMOworCSAgICAgIGltcGZpbGUgPSBOVUxMOworCSAgICAgIGltcG1lbWJlciA9IE5VTEw7CisJICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnMgPT0gJygnKQorCSAgICBlaW5mbyAoXygiJUYlcyVkOiAjISAoW21lbWJlcl0pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaW1wb3J0IGZpbGVzXG4iKSwKKwkJICAgZmlsZW5hbWUsIGxpbmVubyk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyIGNzOworCSAgICAgIGNoYXIgKmZpbGU7CisKKwkgICAgICAodm9pZCkgb2JzdGFja19maW5pc2ggKG8pOworCSAgICAgIGtlZXAgPSB0cnVlOworCSAgICAgIGltcHBhdGggPSBzOworCSAgICAgIGZpbGUgPSBOVUxMOworCSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJygnICYmICpzICE9ICdcMCcpCisJCXsKKwkJICBpZiAoKnMgPT0gJy8nKQorCQkgICAgZmlsZSA9IHMgKyAxOworCQkgICsrczsKKwkJfQorCSAgICAgIGlmIChmaWxlICE9IE5VTEwpCisJCXsKKwkJICBmaWxlWy0xXSA9ICdcMCc7CisJCSAgaW1wZmlsZSA9IGZpbGU7CisJCSAgaWYgKGltcHBhdGggPT0gZmlsZSAtIDEpCisJCSAgICBpbXBwYXRoID0gIi8iOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaW1wZmlsZSA9IGltcHBhdGg7CisJCSAgaW1wcGF0aCA9ICIiOworCQl9CisJICAgICAgY3MgPSAqczsKKwkgICAgICAqcyA9ICdcMCc7CisJICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcykpCisJCXsKKwkJICArK3M7CisJCSAgY3MgPSAqczsKKwkJfQorCSAgICAgIGlmIChjcyAhPSAnKCcpCisJCXsKKwkJICBpbXBtZW1iZXIgPSAiIjsKKwkJICBpZiAoY3MgIT0gJ1wwJykKKwkJICAgIGVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iKSwKKwkJCSAgIGZpbGVuYW1lLCBsaW5lbm8pOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgKytzOworCQkgIGltcG1lbWJlciA9IHM7CisJCSAgd2hpbGUgKCpzICE9ICcpJyAmJiAqcyAhPSAnXDAnKQorCQkgICAgKytzOworCQkgIGlmICgqcyA9PSAnKScpCisJCSAgICAqcyA9ICdcMCc7CisJCSAgZWxzZQorCQkgICAgZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIpLAorCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7CisJCX0KKwkgICAgfQorCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBzeW1ib2wgdG8gYmUgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuICAqLworICAgICAgc3ltbmFtZSA9IHM7CisgICAgICBzeXNjYWxsID0gZmFsc2U7CisgICAgICBhZGRyZXNzID0gKGJmZF92bWEpIC0xOworCisgICAgICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpICYmICpzICE9ICdcMCcpCisJKytzOworICAgICAgaWYgKCpzICE9ICdcMCcpCisJeworCSAgY2hhciAqc2U7CisKKwkgICpzKysgPSAnXDAnOworCisJICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKKwkgICAgKytzOworCisJICBzZSA9IHM7CisJICB3aGlsZSAoISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSAmJiAqc2UgIT0gJ1wwJykKKwkgICAgKytzZTsKKwkgIGlmICgqc2UgIT0gJ1wwJykKKwkgICAgeworCSAgICAgICpzZSsrID0gJ1wwJzsKKwkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZSkpCisJCSsrc2U7CisJICAgICAgaWYgKCpzZSAhPSAnXDAnKQorCQllaW5mbyAoXygiJXMlZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiksCisJCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKKwkgICAgfQorCisJICBpZiAoc3RyY2FzZWNtcCAocywgInN2YyIpID09IDAKKwkgICAgICB8fCBzdHJjYXNlY21wIChzLCAic3lzY2FsbCIpID09IDApCisJICAgIHN5c2NhbGwgPSB0cnVlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciAqZW5kOworCisJICAgICAgYWRkcmVzcyA9IHN0cnRvdWwgKHMsICZlbmQsIDApOworCSAgICAgIGlmICgqZW5kICE9ICdcMCcpCisJCWVpbmZvIChfKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiksCisJCSAgICAgICBmaWxlbmFtZSwgbGluZW5vKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgaW1wb3J0KQorCXsKKwkgIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm47CisKKwkgIGxkbGFuZ19hZGRfdW5kZWYgKHN5bW5hbWUpOworCSAgbiA9ICgoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqKQorCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QpKSk7CisJICBuLT5uZXh0ID0gZXhwb3J0X3N5bWJvbHM7CisJICBuLT5uYW1lID0gYnV5c3RyaW5nIChzeW1uYW1lKTsKKwkgIG4tPnN5c2NhbGwgPSBzeXNjYWxsOworCSAgZXhwb3J0X3N5bWJvbHMgPSBuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBzeW1uYW1lLCBmYWxzZSwgZmFsc2UsCisJCQkJICAgIHRydWUpOworCSAgaWYgKGggPT0gTlVMTCB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQorCSAgICB7CisJICAgICAgLyogV2UgY2FuIGp1c3QgaWdub3JlIGF0dGVtcHRzIHRvIGltcG9ydCBhbiB1bnJlZmVyZW5jZWQKKwkJIHN5bWJvbC4gICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICghIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLAorCQkJCQkgICAgIGFkZHJlc3MsIGltcHBhdGgsIGltcGZpbGUsCisJCQkJCSAgICAgaW1wbWVtYmVyKSkKKwkJZWluZm8gKF8oIiVYJXM6JWQ6IGZhaWxlZCB0byBpbXBvcnQgc3ltYm9sICVzOiAlRVxuIiksCisJCSAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBzeW1uYW1lKTsKKwkgICAgfQorCX0KKworICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKKyAgICB9CisKKyAgaWYgKG9ic3RhY2tfb2JqZWN0X3NpemUgKG8pID4gMCkKKyAgICB7CisgICAgICBlaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IGlnbm9yaW5nIHVudGVybWluYXRlZCBsYXN0IGxpbmVcbiIpLAorCSAgICAgZmlsZW5hbWUsIGxpbmVubyk7CisgICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOworICAgIH0KKworICBpZiAoISBrZWVwKQorICAgIHsKKyAgICAgIG9ic3RhY2tfZnJlZSAobywgTlVMTCk7CisgICAgICBmcmVlIChvKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBzYXZlcyB1cyBmcm9tIHdvcnJ5aW5nIGFib3V0IGRlY2xhcmluZyBmcmVlLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZHBwY21hY29zX2ZyZWUgKHApCisgICAgIFBUUiBwOworeworICBmcmVlIChwKTsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCisgICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvb2tzIGZvciByZWxvY2F0aW9ucyBhbmQgYXNzaWdubWVudHMKKyAgIHRvIHN5bWJvbHMuICAqLworCitzdGF0aWMgdm9pZAorZ2xkcHBjbWFjb3NfZmluZF9yZWxvY3MgKHMpCisgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Cit7CisgIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtKQorICAgIHsKKyAgICAgIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgKnJzOworCisgICAgICBycyA9ICZzLT5yZWxvY19zdGF0ZW1lbnQ7CisgICAgICBpZiAocnMtPm5hbWUgPT0gTlVMTCkKKwllaW5mbyAoXygiJUYlUDogb25seSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5bWJvbHMgYXJlIHBlcm1pdHRlZFxuIikpOworICAgICAgaWYgKCEgYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIHJzLT5uYW1lKSkKKwllaW5mbyAoXygiJUYlUDogYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgZmFpbGVkOiAlRVxuIikpOworICAgIH0KKworICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQorICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Cit9CisKKy8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCisKK3N0YXRpYyB2b2lkCitnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHApCisgICAgIGV0cmVlX3R5cGUgKmV4cDsKK3sKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7CisKKyAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKKyAgICB7CisgICAgY2FzZSBldHJlZV9wcm92aWRlOgorICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAorCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgaWYgKGggPT0gTlVMTCkKKwlicmVhazsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgY2FzZSBldHJlZV9hc3NpZ246CisgICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKKwl7CisJICBpZiAoISBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKKwkJCQkJCSAgZXhwLT5hc3NpZ24uZHN0KSkKKwkgICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIpLAorCQkgICBleHAtPmFzc2lnbi5kc3QpOworCX0KKyAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfYmluYXJ5OgorICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKKyAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKKyAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKKyAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOworICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZXRyZWVfdW5hcnk6CisgICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKgorZ2xkcHBjbWFjb3NfZ2V0X3NjcmlwdChpc2ZpbGUpCisgICAgIGludCAqaXNmaWxlOworewkJCSAgICAgCisgICppc2ZpbGUgPSAwOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybgorIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAorT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKK0VOVFJZKF9fc3RhcnQpXG5cCitTRUNUSU9OU1xuXAore1xuXAorICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAorICAudGV4dCAwIDoge1xuXAorICAgICooLnRleHQpXG5cCisgICAgKigucHIpXG5cCisgICAgKigucm8pXG5cCisgICAgKiguZGIpXG5cCisgICAgKiguZ2wpXG5cCisgICAgKigueG8pXG5cCisgICAgKigudGkpXG5cCisgICAgKigudGIpXG5cCisgIH1cblwKKyAgLmRhdGEgMCA6IHtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgICooLnJ3KVxuXAorICAgICooLnN2KVxuXAorICAgICooLnVhKVxuXAorICAgIC4gPSBBTElHTig0KTtcblwKKyAgICBDT05TVFJVQ1RPUlNcblwKKyAgICAqKC5kcylcblwKKyAgICAqKC50YzApXG5cCisgICAgKigudGMpXG5cCisgICAgKigudGQpXG5cCisgIH1cblwKKyAgLmJzcyA6IHtcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKiguYnMpXG5cCisgICAgKigudWMpXG5cCisgICAgKihDT01NT04pXG5cCisgIH1cblwKKyAgLmxvYWRlciAwIDoge1xuXAorICAgICooLmxvYWRlcilcblwKKyAgfVxuXAorICAuZGVidWcgMCA6IHtcblwKKyAgICAqKC5kZWJ1ZylcblwKKyAgfVxuXAorfVxuXG4iCisgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4KKyJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKK09VVFBVVF9BUkNIKHBvd2VycGMpXG5cCitFTlRSWShfX3N0YXJ0KVxuXAorU0VDVElPTlNcblwKK3tcblwKKyAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKKyAgLnRleHQgMCA6IHtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnByKVxuXAorICAgICooLnJvKVxuXAorICAgICooLmRiKVxuXAorICAgICooLmdsKVxuXAorICAgICooLnhvKVxuXAorICAgICooLnRpKVxuXAorICAgICooLnRiKVxuXAorICB9XG5cCisgIC5kYXRhIDAgOiB7XG5cCisgICAgKiguZGF0YSlcblwKKyAgICAqKC5ydylcblwKKyAgICAqKC5zdilcblwKKyAgICAqKC51YSlcblwKKyAgICAuID0gQUxJR04oNCk7XG5cCisgICAgKiguZHMpXG5cCisgICAgKigudGMwKVxuXAorICAgICooLnRjKVxuXAorICAgICooLnRkKVxuXAorICB9XG5cCisgIC5ic3MgOiB7XG5cCisgICAgKiguYnNzKVxuXAorICAgICooLmJzKVxuXAorICAgICooLnVjKVxuXAorICAgICooQ09NTU9OKVxuXAorICB9XG5cCisgIC5sb2FkZXIgMCA6IHtcblwKKyAgICAqKC5sb2FkZXIpXG5cCisgIH1cblwKKyAgLmRlYnVnIDAgOiB7XG5cCisgICAgKiguZGVidWcpXG5cCisgIH1cblwKK31cblxuIgorICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybgorIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAorT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKKyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAorRU5UUlkoX19zdGFydClcblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCisgIC50ZXh0ICAgOiB7XG5cCisgICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnByKVxuXAorICAgICooLnJvKVxuXAorICAgICooLmRiKVxuXAorICAgICooLmdsKVxuXAorICAgICooLnhvKVxuXAorICAgICooLnRpKVxuXAorICAgICooLnRiKVxuXAorICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAorICB9XG5cCisgIC5kYXRhIDAgOiB7XG5cCisgICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgICooLnJ3KVxuXAorICAgICooLnN2KVxuXAorICAgICooLnVhKVxuXAorICAgIC4gPSBBTElHTig0KTtcblwKKyAgICBDT05TVFJVQ1RPUlNcblwKKyAgICAqKC5kcylcblwKKyAgICAqKC50YzApXG5cCisgICAgKigudGMpXG5cCisgICAgKigudGQpXG5cCisgICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCisgIH1cblwKKyAgLmJzcyA6IHtcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKiguYnMpXG5cCisgICAgKigudWMpXG5cCisgICAgKihDT01NT04pXG5cCisgICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAorICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAorICB9XG5cCisgIC5sb2FkZXIgMCA6IHtcblwKKyAgICAqKC5sb2FkZXIpXG5cCisgIH1cblwKKyAgLmRlYnVnIDAgOiB7XG5cCisgICAgKiguZGVidWcpXG5cCisgIH1cblwKK31cblxuIgorICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KKyJPVVRQVVRfRk9STUFUKFwieGNvZmYtcG93ZXJtYWNcIilcblwKK09VVFBVVF9BUkNIKHBvd2VycGMpXG5cCisgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYXBwbGUtbWFjb3MvbGliKTtcblwKK0VOVFJZKF9fc3RhcnQpXG5cCitTRUNUSU9OU1xuXAore1xuXAorICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAorICAudGV4dCAgIDoge1xuXAorICAgIFBST1ZJREUgKF90ZXh0ID0gLik7XG5cCisgICAgKigudGV4dClcblwKKyAgICAqKC5wcilcblwKKyAgICAqKC5ybylcblwKKyAgICAqKC5kYilcblwKKyAgICAqKC5nbClcblwKKyAgICAqKC54bylcblwKKyAgICAqKC50aSlcblwKKyAgICAqKC50YilcblwKKyAgICBQUk9WSURFIChfZXRleHQgPSAuKTtcblwKKyAgfVxuXAorICAuZGF0YSAwIDoge1xuXAorICAgIFBST1ZJREUgKF9kYXRhID0gLik7XG5cCisgICAgKiguZGF0YSlcblwKKyAgICAqKC5ydylcblwKKyAgICAqKC5zdilcblwKKyAgICAqKC51YSlcblwKKyAgICAuID0gQUxJR04oNCk7XG5cCisgICAgQ09OU1RSVUNUT1JTXG5cCisgICAgKiguZHMpXG5cCisgICAgKigudGMwKVxuXAorICAgICooLnRjKVxuXAorICAgICooLnRkKVxuXAorICAgIFBST1ZJREUgKF9lZGF0YSA9IC4pO1xuXAorICB9XG5cCisgIC5ic3MgOiB7XG5cCisgICAgKiguYnNzKVxuXAorICAgICooLmJzKVxuXAorICAgICooLnVjKVxuXAorICAgICooQ09NTU9OKVxuXAorICAgIFBST1ZJREUgKF9lbmQgPSAuKTtcblwKKyAgICBQUk9WSURFIChlbmQgPSAuKTtcblwKKyAgfVxuXAorICAubG9hZGVyIDAgOiB7XG5cCisgICAgKigubG9hZGVyKVxuXAorICB9XG5cCisgIC5kZWJ1ZyAwIDoge1xuXAorICAgICooLmRlYnVnKVxuXAorICB9XG5cCit9XG5cbiIKKyAgOyBlbHNlIHJldHVybgorIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAorT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKKyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAorRU5UUlkoX19zdGFydClcblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCisgIC50ZXh0ICAgOiB7XG5cCisgICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnByKVxuXAorICAgICooLnJvKVxuXAorICAgICooLmRiKVxuXAorICAgICooLmdsKVxuXAorICAgICooLnhvKVxuXAorICAgICooLnRpKVxuXAorICAgICooLnRiKVxuXAorICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAorICB9XG5cCisgIC5kYXRhIDAgOiB7XG5cCisgICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgICooLnJ3KVxuXAorICAgICooLnN2KVxuXAorICAgICooLnVhKVxuXAorICAgIC4gPSBBTElHTig0KTtcblwKKyAgICBDT05TVFJVQ1RPUlNcblwKKyAgICAqKC5kcylcblwKKyAgICAqKC50YzApXG5cCisgICAgKigudGMpXG5cCisgICAgKigudGQpXG5cCisgICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCisgIH1cblwKKyAgLmJzcyA6IHtcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKiguYnMpXG5cCisgICAgKigudWMpXG5cCisgICAgKihDT01NT04pXG5cCisgICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAorICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAorICB9XG5cCisgIC5sb2FkZXIgMCA6IHtcblwKKyAgICAqKC5sb2FkZXIpXG5cCisgIH1cblwKKyAgLmRlYnVnIDAgOiB7XG5cCisgICAgKiguZGVidWcpXG5cCisgIH1cblwKK31cblxuIgorOyB9CisKK3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfcHBjbWFjb3NfZW11bGF0aW9uID0gCit7CisgIGdsZHBwY21hY29zX2JlZm9yZV9wYXJzZSwKKyAgc3lzbGliX2RlZmF1bHQsCisgIGhsbF9kZWZhdWx0LAorICBhZnRlcl9wYXJzZV9kZWZhdWx0LAorICBnbGRwcGNtYWNvc19hZnRlcl9vcGVuLAorICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCisgIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAorICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCisgIGdsZHBwY21hY29zX2JlZm9yZV9hbGxvY2F0aW9uLAorICBnbGRwcGNtYWNvc19nZXRfc2NyaXB0LAorICAicHBjbWFjb3MiLAorICAieGNvZmYtcG93ZXJtYWMiLAorICAwLAkvKiBmaW5pc2ggKi8KKyAgMCwJLyogY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKi8KKyAgMCwJLyogb3Blbl9keW5hbWljX2FyY2hpdmUgKi8KKyAgMCwJLyogcGxhY2Vfb3JwaGFuICovCisgIDAsCS8qIHNldF9zeW1ib2xzICovCisgIGdsZHBwY21hY29zX3BhcnNlX2FyZ3MsCisgIGdsZHBwY21hY29zX3VucmVjb2duaXplZF9maWxlCit9OwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWVzaC5jIGIvbGQvbXB3LWVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmM1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9tcHctZXNoLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KKworLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gc2gKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9JU19zaAorCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYmZkbGluay5oIgorCisjaW5jbHVkZSAibGQuaCIKKyNpbmNsdWRlICJsZG1haW4uaCIKKyNpbmNsdWRlICJsZGVtdWwuaCIKKyNpbmNsdWRlICJsZGZpbGUuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKworc3RhdGljIHZvaWQgZ2xkc2hfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBjaGFyICpnbGRzaF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7CisKK3N0YXRpYyB2b2lkCitnbGRzaF9iZWZvcmVfcGFyc2UoKQoreworI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLworICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX3NoOworI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCit9CisKK3N0YXRpYyBjaGFyICoKK2dsZHNoX2dldF9zY3JpcHQoaXNmaWxlKQorICAgICBpbnQgKmlzZmlsZTsKK3sJCQkgICAgIAorICAqaXNmaWxlID0gMDsKKworICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKKyAgICByZXR1cm4KK2NvbmNhdCgKKyJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAorT1VUUFVUX0FSQ0goc2gpXG5cCitNRU1PUllcblwKK3tcblwKKyAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKK31cblwKKyAiLCIgU0VDVElPTlNcblwKK3tcblwKKyAiLCIgIC50ZXh0IDpcblwKKyAge1xuXAorICAgICooLnRleHQpXG5cCisgICAgKiguc3RyaW5ncylcblwKKyAgfSBcblwKKyAgLnRvcnMgOlxuXAorICB7XG5cCisgICAgX19fY3RvcnMgPSAuIDtcblwKKyAgICAqKC5jdG9ycylcblwKKyAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKKyAgICBfX19kdG9ycyA9IC4gO1xuXAorICAgICooLmR0b3JzKVxuXAorICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAorICB9IFxuXAorICIsIiAgLmRhdGEgOlxuXAorICB7XG5cCisgICAgKiguZGF0YSlcblwKKyAgfSBcblwKKyAiLCIgLmJzcyA6XG5cCisgIHtcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKihDT01NT04pXG5cCisgIH0gXG5cCisgIiwiIC5zdGFjayAgIDpcblwKKyAge1xuXAorICAgICooLnN0YWNrKVxuXAorICB9IFxuXAorICIsIiAuc3RhYiAwICA6XG5cCisgIHtcblwKKyAgICAqKC5zdGFiKVxuXAorICB9XG5cCisgIiwiIC5zdGFic3RyIDAgIDpcblwKKyAge1xuXAorICAgICooLnN0YWJzdHIpXG5cCisgIH1cblwKK31cblxuIiwgTlVMTCkKKyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybgorY29uY2F0ICgKKyJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAorT1VUUFVUX0FSQ0goc2gpXG5cCisgIiwiIE1FTU9SWVxuXAore1xuXAorICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAorfVxuXAorICIsIiBTRUNUSU9OU1xuXAore1xuXAorICIsIiAgLnRleHQgOlxuXAorICB7XG5cCisgICAgKigudGV4dClcblwKKyAgICAqKC5zdHJpbmdzKVxuXAorICB9IFxuXAorICIsIiAgIC50b3JzIDpcblwKKyAge1xuXAorICAgIF9fX2N0b3JzID0gLiA7XG5cCisgICAgKiguY3RvcnMpXG5cCisgICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCisgICAgX19fZHRvcnMgPSAuIDtcblwKKyAgICAqKC5kdG9ycylcblwKKyAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKKyAgfSBcblwKKyAiLCIgICAuZGF0YSA6XG5cCisgIHtcblwKKyAgICAqKC5kYXRhKVxuXAorICB9IFxuXAorICIsIiAgIC5ic3MgOlxuXAorICB7XG5cCisgICAgKiguYnNzKVxuXAorICAgICooQ09NTU9OKVxuXAorICB9IFxuXAorICIsIiAgIC5zdGFjayAgIDpcblwKKyAge1xuXAorICAgICooLnN0YWNrKVxuXAorICB9IFxuXAorICIsIiAgIC5zdGFiIDAgIDpcblwKKyAge1xuXAorICAgICooLnN0YWIpXG5cCisgIH1cblwKKyAiLCIgICAuc3RhYnN0ciAwICA6XG5cCisgIHtcblwKKyAgICAqKC5zdGFic3RyKVxuXAorICB9XG5cCit9XG5cbiIsIE5VTEwpCisgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuCitjb25jYXQgKAorIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCitPVVRQVVRfQVJDSChzaClcblwKK01FTU9SWVxuXAore1xuXAorICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAorfVxuXAorU0VDVElPTlNcblwKK3tcblwKKyAiLCIgICAudGV4dCA6XG5cCisgIHtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgICooLnN0cmluZ3MpXG5cCisgICAgIF9ldGV4dCA9IC4gOyBcblwKKyAgfSAgPiByYW1cblwKKyAiLCIgICAudG9ycyA6XG5cCisgIHtcblwKKyAgICBfX19jdG9ycyA9IC4gO1xuXAorICAgICooLmN0b3JzKVxuXAorICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAorICAgIF9fX2R0b3JzID0gLiA7XG5cCisgICAgKiguZHRvcnMpXG5cCisgICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCisgIH0gID4gcmFtXG5cCisgIiwiICAgLmRhdGEgOlxuXAorICB7XG5cCisgICAgKiguZGF0YSlcblwKKyAgICAgX2VkYXRhID0gLiA7IFxuXAorICB9ICA+IHJhbVxuXAorICIsIiAgIC5ic3MgOlxuXAorICB7XG5cCisgICAgIF9ic3Nfc3RhcnQgPSAuIDsgXG5cCisgICAgKiguYnNzKVxuXAorICAgICooQ09NTU9OKVxuXAorICAgICBfZW5kID0gLiA7ICBcblwKKyAgfSAgPiByYW1cblwKKyAiLCIgICAuc3RhY2sgIDB4MzAwMDAgICA6XG5cCisgIHtcblwKKyAgICAgX3N0YWNrID0gLiA7IFxuXAorICAgICooLnN0YWNrKVxuXAorICB9ICA+IHJhbVxuXAorICIsIiAgIC5zdGFiIDAgKE5PTE9BRCkgOlxuXAorICB7XG5cCisgICAgKiguc3RhYilcblwKKyAgfVxuXAorICIsIiAgIC5zdGFic3RyIDAgKE5PTE9BRCkgOlxuXAorICB7XG5cCisgICAgKiguc3RhYnN0cilcblwKKyAgfVxuXAorfVxuXG4iLCBOVUxMKQorICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KK2NvbmNhdCAoCisiT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKK09VVFBVVF9BUkNIKHNoKVxuXAorTUVNT1JZXG5cCit7XG5cCisgIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCit9XG5cCitTRUNUSU9OU1xuXAore1xuXAorICIsIiAgIC50ZXh0IDpcblwKKyAge1xuXAorICAgICooLnRleHQpXG5cCisgICAgKiguc3RyaW5ncylcblwKKyAgICAgX2V0ZXh0ID0gLiA7IFxuXAorICB9ICA+IHJhbVxuXAorICIsIiAgIC50b3JzIDpcblwKKyAge1xuXAorICAgIF9fX2N0b3JzID0gLiA7XG5cCisgICAgKiguY3RvcnMpXG5cCisgICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCisgICAgX19fZHRvcnMgPSAuIDtcblwKKyAgICAqKC5kdG9ycylcblwKKyAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKKyAgfSAgPiByYW1cblwKKyAiLCIgICAuZGF0YSA6XG5cCisgIHtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgICBfZWRhdGEgPSAuIDsgXG5cCisgIH0gID4gcmFtXG5cCisgIiwiICAgLmJzcyA6XG5cCisgIHtcblwKKyAgICAgX2Jzc19zdGFydCA9IC4gOyBcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKihDT01NT04pXG5cCisgICAgIF9lbmQgPSAuIDsgIFxuXAorICB9ICA+IHJhbVxuXAorICIsIiAgIC5zdGFjayAgMHgzMDAwMCAgIDpcblwKKyAge1xuXAorICAgICBfc3RhY2sgPSAuIDsgXG5cCisgICAgKiguc3RhY2spXG5cCisgIH0gID4gcmFtXG5cCisgIiwiICAgLnN0YWIgMCAoTk9MT0FEKSA6XG5cCisgIHtcblwKKyAgICAqKC5zdGFiKVxuXAorICB9XG5cCisgIiwiICAgLnN0YWJzdHIgMCAoTk9MT0FEKSA6XG5cCisgIHtcblwKKyAgICAqKC5zdGFic3RyKVxuXAorICB9XG5cCit9XG5cbiIsIE5VTEwpCisgIDsgZWxzZSByZXR1cm4KK2NvbmNhdCAoCisiT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKK09VVFBVVF9BUkNIKHNoKVxuXAorTUVNT1JZXG5cCit7XG5cCisgIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCit9XG5cCitTRUNUSU9OU1xuXAore1xuXAorICIsIiAgIC50ZXh0IDpcblwKKyAge1xuXAorICAgICooLnRleHQpXG5cCisgICAgKiguc3RyaW5ncylcblwKKyAgICAgX2V0ZXh0ID0gLiA7IFxuXAorICB9ICA+IHJhbVxuXAorICIsIiAgIC50b3JzIDpcblwKKyAge1xuXAorICAgIF9fX2N0b3JzID0gLiA7XG5cCisgICAgKiguY3RvcnMpXG5cCisgICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCisgICAgX19fZHRvcnMgPSAuIDtcblwKKyAgICAqKC5kdG9ycylcblwKKyAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKKyAgfSAgPiByYW1cblwKKyAiLCIgICAuZGF0YSA6XG5cCisgIHtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgICBfZWRhdGEgPSAuIDsgXG5cCisgIH0gID4gcmFtXG5cCisgIiwiICAgLmJzcyA6XG5cCisgIHtcblwKKyAgICAgX2Jzc19zdGFydCA9IC4gOyBcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKihDT01NT04pXG5cCisgICAgIF9lbmQgPSAuIDsgIFxuXAorICB9ICA+IHJhbVxuXAorICIsIiAgIC5zdGFjayAgMHgzMDAwMCAgIDpcblwKKyAge1xuXAorICAgICBfc3RhY2sgPSAuIDsgXG5cCisgICAgKiguc3RhY2spXG5cCisgIH0gID4gcmFtXG5cCisgIiwiICAgLnN0YWIgMCAoTk9MT0FEKSA6XG5cCisgIHtcblwKKyAgICAqKC5zdGFiKVxuXAorICB9XG5cCisgIiwiICAgLnN0YWJzdHIgMCAoTk9MT0FEKSA6XG5cCisgIHtcblwKKyAgICAqKC5zdGFic3RyKVxuXAorICB9XG5cCit9XG5cbiIsIE5VTEwpCis7IH0KKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9zaF9lbXVsYXRpb24gPSAKK3sKKyAgZ2xkc2hfYmVmb3JlX3BhcnNlLAorICBzeXNsaWJfZGVmYXVsdCwKKyAgaGxsX2RlZmF1bHQsCisgIGFmdGVyX3BhcnNlX2RlZmF1bHQsCisgIGFmdGVyX29wZW5fZGVmYXVsdCwKKyAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKKyAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAorICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAorICBnbGRzaF9nZXRfc2NyaXB0LAorICAic2giLAorICAiY29mZi1zaCIKK307CmRpZmYgLS1naXQgYS9sZC9tcHctaWR0bWlwcy5jIGIvbGQvbXB3LWlkdG1pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRkYzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbXB3LWlkdG1pcHMuYwpAQCAtMCwwICsxLDQzMCBAQAorLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLworCisvKiBIYW5kbGUgZW1iZWRkZWQgcmVsb2NzIGZvciBNSVBTLgorICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiBiYXNlZCBvbiBnZW5lcmljLmVtLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9JU19taXBzaWR0CisKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisKKyNpbmNsdWRlICJsZC5oIgorI2luY2x1ZGUgImxkbWFpbi5oIgorI2luY2x1ZGUgImxkZW11bC5oIgorI2luY2x1ZGUgImxkZmlsZS5oIgorI2luY2x1ZGUgImxkbWlzYy5oIgorCitzdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBnbGRtaXBzaWR0X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgY2hlY2tfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworc3RhdGljIHZvaWQgZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBjaGFyICpnbGRtaXBzaWR0X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKKworc3RhdGljIHZvaWQKK2dsZG1pcHNpZHRfYmVmb3JlX3BhcnNlKCkKK3sKKyNpZm5kZWYgVEFSR0VUXwkJCS8qIEkuZS4sIGlmIG5vdCBnZW5lcmljLiAgKi8KKyAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9taXBzOworI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgcnVuIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4KKyAgIFdlIGNyZWF0ZSBhIC5yZWwuc2RhdGEgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBmaWxlIHdpdGggYSBub24gemVybworICAgLnNkYXRhIHNlY3Rpb24uICBUaGUgQkZEIGJhY2tlbmQgd2lsbCBmaWxsIGluIHRoZXNlIHNlY3Rpb25zIHdpdGgKKyAgIG1hZ2ljIG51bWJlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbiBhdCBydW4KKyAgIHRpbWUuICBUaGlzIHdpbGwgb25seSBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgYWxsIHRoZSBpbnB1dCBmaWxlcworICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHVzaW5nIC1tZW1iZWRkZWQtcGljLiAgKi8KKworc3RhdGljIHZvaWQKK2dsZG1pcHNpZHRfYWZ0ZXJfb3BlbiAoKQoreworICBiZmQgKmFiZmQ7CisKKyAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcworICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKKyAgICByZXR1cm47CisKKyAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqZGF0YXNlYzsKKworICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVsb2NfY291bnQgZmllbGQgaGFzIGFscmVhZHkKKyAgICAgICAgIGJlZW4gc2V0IHVwLiAgV2UgY291bGQgY2FsbCBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBidXQKKyAgICAgICAgIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBidWZmZXIgcmF0aGVyIHRoYW4gYSByZWxvYworICAgICAgICAgY291bnQuICBXZSBkbyBub3Qgd2FudCB0byBjYWxsIGJmZF9jYW5vbmljYWxpemVfcmVsb2MsCisgICAgICAgICBiZWNhdXNlIGFsdGhvdWdoIGl0IHdvdWxkIGFsd2F5cyB3b3JrIGl0IHdvdWxkIGZvcmNlIHVzIHRvCisgICAgICAgICByZWFkIGluIHRoZSByZWxvY3MgaW50byBCRkQgY2Fub25pY2FsIGZvcm0sIHdoaWNoIHdvdWxkIHdhc3RlCisgICAgICAgICBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGFuZCBtZW1vcnkuICAqLworICAgICAgaWYgKGRhdGFzZWMgIT0gTlVMTCAmJiBkYXRhc2VjLT5yZWxvY19jb3VudCA+IDApCisJeworCSAgYXNlY3Rpb24gKnJlbHNlYzsKKworCSAgcmVsc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKKwkgIGlmIChyZWxzZWMgPT0gTlVMTAorCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCByZWxzZWMsCisJCQkJCSAgKFNFQ19BTExPQworCQkJCQkgICB8IFNFQ19MT0FECisJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUworCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKQorCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcmVsc2VjLCAyKQorCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbHNlYywKKwkJCQkJIGRhdGFzZWMtPnJlbG9jX2NvdW50ICogNCkpCisJICAgIGVpbmZvIChfKCIlRiVCOiBjYW4gbm90IGNyZWF0ZSAucmVsLnNkYXRhIHNlY3Rpb246ICVFXG4iKSk7CisJfQorCisgICAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBhbGwgb3RoZXIgZGF0YSBzZWN0aW9ucyBhcmUgZW1wdHksIGFzIGlzCisgICAgICAgICByZXF1aXJlZCBmb3IgZW1iZWRkZWQgUElDIGNvZGUuICAqLworICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBjaGVja19zZWN0aW9ucywgKFBUUikgZGF0YXNlYyk7CisgICAgfQorfQorCisvKiBDaGVjayB0aGF0IG9mIHRoZSBkYXRhIHNlY3Rpb25zLCBvbmx5IHRoZSAuc2RhdGEgc2VjdGlvbiBoYXMKKyAgIHJlbG9jcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorY2hlY2tfc2VjdGlvbnMgKGFiZmQsIHNlYywgc2RhdGFzZWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlYzsKKyAgICAgUFRSIHNkYXRhc2VjOworeworICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKSA9PSAwCisgICAgICAmJiBzZWMgIT0gKGFzZWN0aW9uICopIHNkYXRhc2VjCisgICAgICAmJiBzZWMtPnJlbG9jX2NvdW50ICE9IDApCisgICAgZWluZm8gKF8oIiVGJVg6IHNlY3Rpb24gJXMgaGFzIHJlbG9jczsgY2FuIG5vdCB1c2UgLS1lbWJlZGRlZC1yZWxvY3NcbiIpLAorCSAgIGFiZmQsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIG9mZnNldHMgaGF2ZQorICAgYmVlbiBzZXQuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCByZWxvY3MsIGl0IGNhbGxzIGEgc3BlY2lhbAorICAgQkZEIGJhY2tlbmQgcm91dGluZSB0byBkbyB0aGUgd29yay4gICovCisKK3N0YXRpYyB2b2lkCitnbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24gKCkKK3sKKyAgYmZkICphYmZkOworCisgIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKKyAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCisgICAgcmV0dXJuOworCisgIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCisgICAgeworICAgICAgYXNlY3Rpb24gKmRhdGFzZWMsICpyZWxzZWM7CisgICAgICBjaGFyICplcnJtc2c7CisKKyAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOworCisgICAgICBpZiAoZGF0YXNlYyA9PSBOVUxMIHx8IGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCisJY29udGludWU7CisKKyAgICAgIHJlbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbC5zZGF0YSIpOworICAgICAgQVNTRVJUIChyZWxzZWMgIT0gTlVMTCk7CisKKyAgICAgIGlmICghIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MgKGFiZmQsICZsaW5rX2luZm8sCisJCQkJCQkgICBkYXRhc2VjLCByZWxzZWMsCisJCQkJCQkgICAmZXJybXNnKSkKKwl7CisJICBpZiAoZXJybXNnID09IE5VTEwpCisJICAgIGVpbmZvIChfKCIlQiVYOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlRVxuIiksCisJCSAgIGFiZmQpOworCSAgZWxzZQorCSAgICBlaW5mbyAoXygiJVglQjogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJXNcbiIpLAorCQkgICBhYmZkLCBlcnJtc2cpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK2dsZG1pcHNpZHRfZ2V0X3NjcmlwdChpc2ZpbGUpCisgICAgIGludCAqaXNmaWxlOworewkJCSAgICAgCisgICppc2ZpbGUgPSAwOworCisgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQorICAgIHJldHVybgorY29uY2F0KAorIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAorCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAorIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAorRU5UUlkoc3RhcnQpXG5cCitTRUNUSU9OU1xuXAore1xuXAorICAudGV4dCA6IHtcblwKKyAgICA7XG5cCisgICAgKiguaW5pdClcblwKKyAgICA7XG5cCisgICAgKigudGV4dClcblwKKyAgICAqKC5yZWwuc2RhdGEpXG5cCisgICAgKiguZmluaSlcblwKKyAgICA7XG5cCisgICAgO1xuXAorICB9XG5cCisgIiwiICAucmRhdGEgOiB7XG5cCisgICAgKigucmRhdGEpXG5cCisgIH1cblwKKyAgLmRhdGEgOiB7XG5cCisgICAgKiguZGF0YSlcblwKKyAgICBDT05TVFJVQ1RPUlNcblwKKyAgfVxuXAorICAubGl0OCA6IHtcblwKKyAgICAqKC5saXQ4KVxuXAorICB9XG5cCisgIC5saXQ0IDoge1xuXAorICAgICooLmxpdDQpXG5cCisgIH1cblwKKyAiLCIgIC5zZGF0YSA6IHtcblwKKyAgICAqKC5zZGF0YSlcblwKKyAgfVxuXAorICAuc2JzcyA6IHtcblwKKyAgICAqKC5zYnNzKVxuXAorICAgICooLnNjb21tb24pXG5cCisgIH1cblwKKyAgLmJzcyA6IHtcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKihDT01NT04pXG5cCisgIH1cblwKK31cblxuIiwgTlVMTCkKKyAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybgorIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAorCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAorIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAorRU5UUlkoc3RhcnQpXG5cCitTRUNUSU9OU1xuXAore1xuXAorICAudGV4dCA6IHtcblwKKyAgICA7XG5cCisgICAgKiguaW5pdClcblwKKyAgICA7XG5cCisgICAgKigudGV4dClcblwKKyAgICAqKC5yZWwuc2RhdGEpXG5cCisgICAgKiguZmluaSlcblwKKyAgICA7XG5cCisgICAgO1xuXAorICB9XG5cCisgIC5yZGF0YSA6IHtcblwKKyAgICAqKC5yZGF0YSlcblwKKyAgfVxuXAorICAuZGF0YSA6IHtcblwKKyAgICAqKC5kYXRhKVxuXAorICB9XG5cCisgIC5saXQ4IDoge1xuXAorICAgICooLmxpdDgpXG5cCisgIH1cblwKKyAgLmxpdDQgOiB7XG5cCisgICAgKigubGl0NClcblwKKyAgfVxuXAorICAuc2RhdGEgOiB7XG5cCisgICAgKiguc2RhdGEpXG5cCisgIH1cblwKKyAgLnNic3MgOiB7XG5cCisgICAgKiguc2JzcylcblwKKyAgICAqKC5zY29tbW9uKVxuXAorICB9XG5cCisgIC5ic3MgOiB7XG5cCisgICAgKiguYnNzKVxuXAorICAgICooQ09NTU9OKVxuXAorICB9XG5cCit9XG5cbiIKKyAgOyBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KSByZXR1cm4KK2NvbmNhdCgKKyJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKKwkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKKyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKK0VOVFJZKHN0YXJ0KVxuXAorU0VDVElPTlNcblwKK3tcblwKKyAgLiA9IDB4YTAwMTIwMDA7XG5cCisgIC50ZXh0IDoge1xuXAorICAgICBfZnRleHQgPSAuIDtcblwKKyAgICAqKC5pbml0KVxuXAorICAgICBlcHJvbCAgPSAgLjtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAorICAgICooLnJlbC5zZGF0YSlcblwKKyAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAorICAgICooLmZpbmkpXG5cCisgICAgIGV0ZXh0ICA9ICAuO1xuXAorICAgICBfZXRleHQgID0gIC47XG5cCisiLCIgIH1cblwKKyAgLiA9IC47XG5cCisgIC5yZGF0YSA6IHtcblwKKyAgICAqKC5yZGF0YSlcblwKKyAgfVxuXAorICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAorICAuZGF0YSA6IHtcblwKKyAgICAqKC5kYXRhKVxuXAorICAgIENPTlNUUlVDVE9SU1xuXAorICB9XG5cCisgICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCisgIC5saXQ4IDoge1xuXAorICAgICooLmxpdDgpXG5cCisgIH1cblwKKyAgLmxpdDQgOiB7XG5cCisgICAgKigubGl0NClcblwKKyAgfVxuXAorICAuc2RhdGEgOiB7XG5cCisgICAgKiguc2RhdGEpXG5cCisgIH1cblwKKyIsIiAgIGVkYXRhICA9ICAuO1xuXAorICAgX2VkYXRhICA9ICAuO1xuXAorICAgX2Zic3MgPSAuO1xuXAorICAuc2JzcyA6IHtcblwKKyAgICAqKC5zYnNzKVxuXAorICAgICooLnNjb21tb24pXG5cCisgIH1cblwKKyAgLmJzcyA6IHtcblwKKyAgICAqKC5ic3MpXG5cCisgICAgKihDT01NT04pXG5cCisgIH1cblwKKyAgIGVuZCA9IC47XG5cCisgICBfZW5kID0gLjtcblwKK31cblxuIgorLCBOVUxMKQorICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KK2NvbmNhdCAoCisiT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCisJICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCisgU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCitFTlRSWShzdGFydClcblwKK1NFQ1RJT05TXG5cCit7XG5cCisgIC4gPSAweGEwMDEyMDAwO1xuXAorICAudGV4dCA6IHtcblwKKyAgICAgX2Z0ZXh0ID0gLiA7XG5cCisgICAgKiguaW5pdClcblwKKyAgICAgZXByb2wgID0gIC47XG5cCisgICAgKigudGV4dClcblwKKyAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTtcblwKKyAgICAqKC5yZWwuc2RhdGEpXG5cCisgICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTtcblwKKyAgICAqKC5maW5pKVxuXAorICAgICBldGV4dCAgPSAgLjtcblwKKyAgICAgX2V0ZXh0ICA9ICAuO1xuXAorICIsIiAgfVxuXAorICAuID0gLjtcblwKKyAgLnJkYXRhIDoge1xuXAorICAgICooLnJkYXRhKVxuXAorICB9XG5cCisgICBfZmRhdGEgPSBBTElHTigxNik7XG5cCisgIC5kYXRhIDoge1xuXAorICAgICooLmRhdGEpXG5cCisgICAgQ09OU1RSVUNUT1JTXG5cCisgIH1cblwKKyAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKKyAgLmxpdDggOiB7XG5cCisgICAgKigubGl0OClcblwKKyAiLCIgIH1cblwKKyAgLmxpdDQgOiB7XG5cCisgICAgKigubGl0NClcblwKKyAgfVxuXAorICAuc2RhdGEgOiB7XG5cCisgICAgKiguc2RhdGEpXG5cCisgIH1cblwKKyAgIGVkYXRhICA9ICAuO1xuXAorICAgX2VkYXRhICA9ICAuO1xuXAorICAgX2Zic3MgPSAuO1xuXAorICAuc2JzcyA6IHtcblwKKyAgICAqKC5zYnNzKVxuXAorICAgICooLnNjb21tb24pXG5cCisgIiwiICB9XG5cCisgIC5ic3MgOiB7XG5cCisgICAgKiguYnNzKVxuXAorICAgICooQ09NTU9OKVxuXAorICB9XG5cCisgICBlbmQgPSAuO1xuXAorICAgX2VuZCA9IC47XG5cCit9XG5cbiIKKywgTlVMTCkKKyAgOyBlbHNlIHJldHVybgorY29uY2F0ICgKKyJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKKwkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKKyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKK0VOVFJZKHN0YXJ0KVxuXAorU0VDVElPTlNcblwKK3tcblwKKyAgLiA9IDB4YTAwMTIwMDA7XG5cCisgIC50ZXh0IDoge1xuXAorICAgICBfZnRleHQgPSAuIDtcblwKKyAgICAqKC5pbml0KVxuXAorICAgICBlcHJvbCAgPSAgLjtcblwKKyAgICAqKC50ZXh0KVxuXAorICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdGFydCA9IC4pO1xuXAorICAgICooLnJlbC5zZGF0YSlcblwKKyAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO1xuXAorICAgICooLmZpbmkpXG5cCisgICAgIGV0ZXh0ICA9ICAuO1xuXAorICAgICBfZXRleHQgID0gIC47XG5cCisgIiwiICB9XG5cCisgIC4gPSAuO1xuXAorICAucmRhdGEgOiB7XG5cCisgICAgKigucmRhdGEpXG5cCisgIH1cblwKKyAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKKyAgLmRhdGEgOiB7XG5cCisgICAgKiguZGF0YSlcblwKKyAgICBDT05TVFJVQ1RPUlNcblwKKyAgfVxuXAorICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAorICAubGl0OCA6IHtcblwKKyAgICAqKC5saXQ4KVxuXAorICB9XG5cCisgIC5saXQ0IDoge1xuXAorICAgICooLmxpdDQpXG5cCisgIiwiICB9XG5cCisgIC5zZGF0YSA6IHtcblwKKyAgICAqKC5zZGF0YSlcblwKKyAgfVxuXAorICAgZWRhdGEgID0gIC47XG5cCisgICBfZWRhdGEgID0gIC47XG5cCisgICBfZmJzcyA9IC47XG5cCisgIC5zYnNzIDoge1xuXAorICAgICooLnNic3MpXG5cCisgICAgKiguc2NvbW1vbilcblwKKyAgfVxuXAorICAuYnNzIDoge1xuXAorICAgICooLmJzcylcblwKKyAgICAqKENPTU1PTilcblwKKyAgfVxuXAorICAgZW5kID0gLjtcblwKKyAgIF9lbmQgPSAuO1xuXAorfVxuXG4iCissIE5VTEwpCis7IH0KKworc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9taXBzaWR0X2VtdWxhdGlvbiA9IAoreworICBnbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSwKKyAgc3lzbGliX2RlZmF1bHQsCisgIGhsbF9kZWZhdWx0LAorICBhZnRlcl9wYXJzZV9kZWZhdWx0LAorICBnbGRtaXBzaWR0X2FmdGVyX29wZW4sCisgIGdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbiwKKyAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCisgIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKKyAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKKyAgZ2xkbWlwc2lkdF9nZXRfc2NyaXB0LAorICAibWlwc2lkdCIsCisgICJlY29mZi1iaWdtaXBzIgorfTsKZGlmZiAtLWdpdCBhL2xkL21wdy1tYWtlLnNlZCBiL2xkL21wdy1tYWtlLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE5NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvbXB3LW1ha2Uuc2VkCkBAIC0wLDAgKzEsOTUgQEAKKyMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgbGQgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgorCisvSERFRklORVMvcy9ASERFRklORVNALy8KKworL150YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQC9zL14vIy8KKworL15FTVVMID0gQEVNVUxAL3MvXi8jLworCisvXkVNVUxBVElPTl9PRklMRVMgPSBARU1VTEFUSU9OX09GSUxFU0Avcy9eLyMvCisKKyMgRml4YWRkIHRvIHRoZSBpbmNsdWRlIHBhdGhzLgorL15JTkNMVURFUyA9IC4qJC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LworL0JGRERJUi9zLy1pIHtCRkRESVJ9IC8taSAie0JGRERJUn0iOiAvCisvSU5DRElSL3MvLWkge0lOQ0RJUn0gLy1pICJ7SU5DRElSfSI6IC8KKworIyBVc2UgYnlhY2MgaW5zdGVhZCBvZiBiaXNvbiAoZm9yIG5vdyBhbnl3YXkpLgorL0JJU09OL3MvXkJJU09OID0uKiQvQklTT04gPSBieWFjYy8KKyMvQklTT05GTEFHUy9zL15CSVNPTkZMQUdTID0uKiQvQklTT05GTEFHUyA9IC8KKworIyBTdXBwcmVzcyB0aGUgc3VwcHJlc3Npb24gb2Ygc21hcnQgbWFrZXMuCisvXlwueVwuYy9kCisKKyMgSGFjayB1cCBsZG1haW4gY29tcGlsZS4KKy9eIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgLiogY29uZmlnLnN0YXR1cyQvLC9eJC9jXAorIntvfSJsZG1haW4uYy5vIFxcT3B0aW9uLWYgICJ7c30ibGRtYWluLmNcCisJe0NDfSBAREFTSF9DX0ZMQUdAIC1kIERFRkFVTFRfRU1VTEFUSU9OPXtkcX17RU1VTH17ZHF9IC1kIFNDUklQVERJUj17ZHF9e3NjcmlwdGRpcn17ZHF9IHtBTExfQ0ZMQUdTfSAie3N9ImxkbWFpbi5jIC1vICJ7b30ibGRtYWluLmMub1wKKworCisjIFJlbW92ZSBsZGVtdWwtbGlzdC5oIGJ1aWxkLCByZWx5IG9uIGNvbmZpZ3VyZSB0byBtYWtlIG9uZS4KKy9ebGRlbXVsLWxpc3QuaCAvLC9SZW5hbWUgLXkgIntzfSJsZGVtdWwtdG1wLmggL2QKKworIyBGaXggcGF0aG5hbWVzIHRvIGdlbmVyYXRlZCBmaWxlcy4KKy9jb25maWcuaC9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZworL2NvbmZpZy5oL3MvXmNvbmZpZ1wuaC8ie299ImNvbmZpZy5oLworCisveS50YWIuYy9zLyJ7c30ieVwudGFiXC5jLyJ7b30ieS50YWIuYy9nCisveS50YWIuYy9zL155XC50YWJcLmMvIntvfSJ5LnRhYi5jLworL3kudGFiLmgvcy8ie3N9InlcLnRhYlwuaC8ie299InkudGFiLmgvZworL3kudGFiLmgvcy9eeVwudGFiXC5oLyJ7b30ieS50YWIuaC8KKworL2xkZ3JhbS5jL3MvIntzfSJsZGdyYW1cLmMvIntvfSJsZGdyYW0uYy9nCisvbGRncmFtLmMvcy9ebGRncmFtXC5jLyJ7b30ibGRncmFtLmMvCisKKy9sZGdyYW0uaC9zLyJ7c30ibGRncmFtXC5oLyJ7b30ibGRncmFtLmgvZworL2xkZ3JhbS5oL3MvXmxkZ3JhbVwuaC8ie299ImxkZ3JhbS5oLworCisvbGRsZXguYy9zLyJ7c30ibGRsZXhcLmMvIntvfSJsZGxleC5jL2cKKy9sZGxleC5jL3MvXmxkbGV4XC5jLyJ7b30ibGRsZXguYy8KKworL2xkbGV4LmMubmV3L3MvIntzfSJsZGxleFwuY1wubmV3LyJ7b30ibGRsZXguYy5uZXcvZworCisvbGV4Lnl5LmMvcy8ie3N9ImxleFwueXlcLmMvIntvfSJsZXgueXkuYy9nCisKKy9sZGVtdWwtbGlzdC5oL3MvIntzfSJsZGVtdWwtbGlzdFwuaC8ie299ImxkZW11bC1saXN0LmgvZworL2xkZW11bC1saXN0Lmgvcy9ebGRlbXVsLWxpc3RcLmgvIntvfSJsZGVtdWwtbGlzdC5oLworCisjIEVkaXQgcGF0aG5hbWVzIHRvIGVtdWxhdGlvbiBmaWxlcy4KKy8ie3N9ImUuKlwuYy9zLyJ7c30iZVwoWy1fYS16MC05XSpcKVwuYy8ie299ImVcMS5jL2cKKy9eZS4qXC5jL3MvXmVcKFstX2EtejAtOV0qXClcLmMvIntvfSJlXDEuYy8KKworIyBXZSBjYW4ndCBydW4gZ2Vuc2NyaXB0cywgc28gZG9uJ3QgdHJ5LgorL3tHRU5TQ1JJUFRTfS9zL3tHRU5TQ1JJUFRTfS9udWxsLWNvbW1hbmQvCisKKyMgQ29tbWVudCBvdXQgdGhlIFRESVJTIGJpdHMuCisvXlRESVJTQC9zL14vIy8KKworIyBQb2ludCBhdCB0aGUgQkZEIGxpYnJhcnkgZGlyZWN0bHkuCisvQEJGRExJQkAvcy9AQkZETElCQC86OmJmZDpsaWJiZmQuby8KKworIyBEb24ndCBuZWVkIHRoaXMuCisvQEhMREZMQUdTQC9zL0BITERGTEFHU0AvLworCisjL3NlZC4qZnJlZS8sLz4gIntvfSJsZGxleC5jLm5ldy9jXAorIwlcCUNhdGVuYXRlICJ7b30ibGV4Lnl5LmMgPiJ7b30ibGRsZXguYy5uZXcKKworIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWxkLnIuCisve0xEX1BST0d9LnIvcy97TERfUFJPR31cLnIvbWFjLWxkLnIvCisKKy9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCitpbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCitcCitpbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKKwlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKKwlEdXBsaWNhdGUgLXkgOmxkLm5ldyAie2JpbmRpcn0ibGRcCisKKworIyBSZW1vdmUgZGVwZW5kZW5jeSByZWJ1aWxkaW5nIGNydWQuCisvXi5kZXAgLywvIyAuUEhPTlkgL2QKKworIyBSZW1vdmUgdGhlIGxpbnRsb2cgYWN0aW9uLCBwaXBlIHN5bWJvbHMgaW4gY29sdW1uIDEgbG9zZS4KKy9ebGludGxvZyBcXE9wdGlvbi1mLywvXiQvZAorCisvXk1ha2VmaWxlIFxcT3B0aW9uLWYvLC9eJC9kCisvXiJ7b30iY29uZmlnLmggXFxPcHRpb24tZi8sL14kL2QKKy9eY29uZmlnLnN0YXR1cyBcXE9wdGlvbi1mLywvXiQvZApkaWZmIC0tZ2l0IGEvbGQvbXJpLmMgYi9sZC9tcmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFhZWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvbXJpLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qIG1yaS5jIC0tIGhhbmRsZSBNUkkgc3R5bGUgbGlua2VyIHNjcmlwdHMKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgorCitHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFRoaXMgYml0IGRvZXMgdGhlIHRyZWUgZGVjb3JhdGlvbiB3aGVuIE1SSSBzdHlsZSBsaW5rIHNjcmlwdHMgYXJlIHBhcnNlZCAqLworCisvKgorICBjb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgorICAJCSBzYWNAY3lnbnVzLmNvbQorCisqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiIAorI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZG1pc2MuaCIKKyNpbmNsdWRlICJtcmkuaCIKKyNpbmNsdWRlICJsZGdyYW0uaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgeworICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqbmV4dDsKKyAgQ09OU1QgY2hhciAqbmFtZTsKKyAgQ09OU1QgY2hhciAqYWxpYXM7CisgIGV0cmVlX3R5cGUgKnZtYTsKKyAgZXRyZWVfdHlwZSAqYWxpZ247CisgIGV0cmVlX3R5cGUgKnN1YmFsaWduOworICBpbnQgb2tfdG9fbG9hZDsKK30gOworCit1bnNpZ25lZCBpbnQgc3ltYm9sX3RydW5jYXRlID0gMTAwMDA7CitzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqb3JkZXI7CitzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqb25seV9sb2FkOworc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFkZHJlc3M7CitzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpYXM7CisKK3N0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphbGlnbm1lbnQ7CitzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqc3ViYWxpZ25tZW50OworCitzdGF0aWMgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsb29rdXAKKyAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0KSk7CitzdGF0aWMgdm9pZCBtcmlfYWRkX3RvX2xpc3QgUEFSQU1TICgoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0LAorCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqdm1hLAorCQkJCSAgICAgY29uc3QgY2hhciAqemFsaWFzLCBldHJlZV90eXBlICphbGlnbiwKKwkJCQkgICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduKSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKgorbG9va3VwIChuYW1lLCBsaXN0KQorICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3Q7Cit7CisKKyAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipwdHIgPSBsaXN0OworICB3aGlsZSAoKnB0cikgCisgIHsKKyAgICBpZiAoc3RyY21wKG5hbWUsICgqcHRyKS0+bmFtZSkgPT0gMCkgeworICAgICAgLyogSWYgdGhpcyBpcyBhIG1hdGNoLCBkZWxldGUgaXQsIHdlIG9ubHkga2VlcCB0aGUgbGFzdCBpbnN0YW5jZQorCSBvZiBhbnkgbmFtZSAqLworICAgICAgKnB0ciA9ICgqcHRyKS0+bmV4dDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwdHIgPSAmKCgqcHRyKS0+bmV4dCk7CisgICAgfQorICB9CisKKyAgKnB0ciA9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0KSk7CisgIHJldHVybiBwdHI7Cit9CisKK3N0YXRpYyB2b2lkCittcmlfYWRkX3RvX2xpc3QgKGxpc3QsIG5hbWUsIHZtYSwgemFsaWFzLCBhbGlnbiwgc3ViYWxpZ24pCisgICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdDsKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgZXRyZWVfdHlwZSAqdm1hOworICAgICBDT05TVCBjaGFyICp6YWxpYXM7CisgICAgIGV0cmVlX3R5cGUgKmFsaWduOworICAgICBldHJlZV90eXBlICpzdWJhbGlnbjsKK3sKKyAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipwdHIgPSBsb29rdXAobmFtZSxsaXN0KTsKKyAgKCpwdHIpLT5uYW1lID0gbmFtZTsKKyAgKCpwdHIpLT52bWEgPSB2bWE7CisgICgqcHRyKS0+bmV4dCA9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEw7CisgICgqcHRyKS0+b2tfdG9fbG9hZCA9IDA7CisgICgqcHRyKS0+YWxpYXMgPSB6YWxpYXM7CisgICgqcHRyKS0+YWxpZ24gPSBhbGlnbjsKKyAgKCpwdHIpLT5zdWJhbGlnbiA9IHN1YmFsaWduOworfQorCisKK3ZvaWQKK21yaV9vdXRwdXRfc2VjdGlvbiAobmFtZSwgdm1hKQorICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBldHJlZV90eXBlICp2bWE7Cit7CisgIG1yaV9hZGRfdG9fbGlzdCgmYWRkcmVzcywgbmFtZSwgdm1hLCAwLDAsMCk7Cit9CisKKy8qIGlmIGFueSBBQlNPTFVURSA8bmFtZT4gYXJlIGluIHRoZSBzY3JpcHQsIG9ubHkgbG9hZCB0aG9zZSBmaWxlcworbWFya2VkIHRodXMgKi8KKwordm9pZAorbXJpX29ubHlfbG9hZCAobmFtZSkKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKK3sKKyAgbXJpX2FkZF90b19saXN0KCZvbmx5X2xvYWQsIG5hbWUsIDAsIDAsMCwwKTsKK30KKworCit2b2lkCittcmlfYmFzZSAoZXhwKQorICAgICBldHJlZV90eXBlICpleHA7Cit7CisgIGJhc2UgPSBleHA7Cit9CisKK3N0YXRpYyBpbnQgZG9uZV90cmVlID0gMDsKKwordm9pZAorbXJpX2RyYXdfdHJlZSAoKQoreworICBpZiAoZG9uZV90cmVlKSByZXR1cm47CisKKyAgLyogV2UgZG9uJ3QgYm90aGVyIHdpdGggbWVtb3J5IHJlZ2lvbnMuICAqLworI2lmIDAKKyAgLyogQ3JlYXRlIHRoZSByZWdpb25zICovCisgeworICAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnI7CisgICByID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCgibG9uZyIpOworICAgci0+Y3VycmVudCA9IHItPm9yaWdpbiA9IGV4cF9nZXRfdm1hKGJhc2UsIChiZmRfdm1hKTAsICJvcmlnaW4iLAorCQkJCQlsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOworICAgci0+bGVuZ3RoID0gKGJmZF9zaXplX3R5cGUpIGV4cF9nZXRfdm1hKDAsIChiZmRfdm1hKSB+KChiZmRfc2l6ZV90eXBlKTApLAorCQkJCQkgICAibGVuZ3RoIiwgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKKyB9CisjZW5kaWYKKyAgCisgIC8qIE5vdyBidWlsZCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIGxkbGFuZyBtYWNoaW5lICovCisKKworICAvKiBBdHRhdGNoIHRoZSBhZGRyZXNzZXMgb2YgYW55IHdoaWNoIGhhdmUgYWRkcmVzc2VzLCBhbmQgYWRkIHRoZQorICAgICBvbmVzIG5vdCBtZW50aW9uZWQgKi8KKyAgaWYgKGFkZHJlc3MgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgeworICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphbGlzdDsKKyAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqb2xpc3Q7CisgICAgaWYgKG9yZGVyID09IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIHsKKyAgICAgIG9yZGVyID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBmb3IgKGFsaXN0ID0gYWRkcmVzczsKKwkgYWxpc3QgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0KilOVUxMOworCSBhbGlzdCA9IGFsaXN0LT5uZXh0KSAKKyAgICB7CisgICAgICBpbnQgZG9uZSA9IDA7CisgICAgICBmb3IgKG9saXN0ID0gb3JkZXI7CisJICAgZG9uZSA9PSAwICYmCisJICAgb2xpc3QgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTDsKKwkgICBvbGlzdCA9IG9saXN0LT5uZXh0KSAKKyAgICAgIHsKKwlpZiAoc3RyY21wKGFsaXN0LT5uYW1lLCBvbGlzdC0+bmFtZSkgPT0gMCkgCisJeworCSAgb2xpc3QtPnZtYSA9IGFsaXN0LT52bWE7CisJICBkb25lID0gMTsKKwl9CisgICAgICB9CisgICAgICBpZiAoIWRvbmUpIHsKKwkvKiBhZGQgdGhpcyBvbnRvIGVuZCBvZiBvcmRlciBsaXN0ICovCisJbXJpX2FkZF90b19saXN0KCZvcmRlciwgYWxpc3QtPm5hbWUsIGFsaXN0LT52bWEsIDAsMCwwKTsKKyAgICAgIH0KKworICAgIH0KKworICB9CisKKyAgLyogSWYgd2UncmUgb25seSBzdXBwb3NlZCB0byBsb2FkIGEgc3Vic2V0IG9mIHRoZW0gaW4sIHRoZW4gcHJ1bmUKKyAgICAgdGhlIGxpc3QuICAqLworCisgIGlmIChvbmx5X2xvYWQgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgCisgIHsKKyAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcHRyMTsKKyAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcHRyMjsKKyAgICBpZiAob3JkZXIgPT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0KilOVUxMKQorICAgICBvcmRlciA9IG9ubHlfbG9hZDsKKyAgICAKKyAgICAvKiBTZWUgaWYgdGhpcyBuYW1lIGlzIGluIHRoZSBsaXN0LCBpZiBpdCBpcyB0aGVuIHdlIGNhbiBsb2FkIGl0CisgICAgICovCisgICAgZm9yIChwdHIxID0gb25seV9sb2FkOyBwdHIxOyBwdHIxID0gcHRyMS0+bmV4dCkgCisgICAgeworICAgICAgZm9yIChwdHIyPSBvcmRlcjsgcHRyMjsgcHRyMj1wdHIyLT5uZXh0KSAKKyAgICAgIHsKKwlpZiAoc3RyY21wKHB0cjItPm5hbWUsIHB0cjEtPm5hbWUpPT0wKSB7CisJICBwdHIyLT5va190b19sb2FkID0gMTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgCisgIHsKKyAgICAvKiBObyBvbmx5IGxvYWQgbGlzdCwgc28gZXZlcnl0aGluZyBpcyBvayB0byBsb2FkICovCisgICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjsKKyAgICBmb3IgKHB0ciA9IG9yZGVyOyBwdHI7IHB0cj1wdHItPm5leHQpIHsKKyAgICAgIHB0ci0+b2tfdG9fbG9hZCA9IDE7CisgICAgfQorICB9CisKKworCisgIC8qIENyZWF0ZSB0aGUgb3JkZXIgb2Ygc2VjdGlvbnMgdG8gbG9hZCAqLworICBpZiAob3JkZXIgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgCisgIHsKKyAgICAvKiBCZWVuIHRvbGQgdG8gb3V0cHV0IHRoZSBzZWN0aW9ucyBpbiBhIGNlcnRhaW4gb3JkZXIgKi8KKyAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcCA9IG9yZGVyOworICAgIHdoaWxlIChwKSAKKyAgICB7CisgICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYXB0cjsKKyAgICAgIGV0cmVlX3R5cGUgKmFsaWduID0gMDsKKyAgICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduID0gMDsKKyAgICAgIC8qIFNlZSBpZiBhbiBhbGlnbm1lbnQgaGFzIGJlZW4gc3BlY2lmaWVkICovCisKKyAgICAgIGZvciAoYXB0ciA9IGFsaWdubWVudDsgYXB0cjsgYXB0cj0gYXB0ci0+bmV4dCkKKyAgICAgIHsKKwlpZiAoc3RyY21wKGFwdHItPm5hbWUsIHAtPm5hbWUpPT0wKSB7CisJICBhbGlnbiA9ICBhcHRyLT5hbGlnbjsKKwl9CisgICAgICB9CisKKyAgICAgIGZvciAoYXB0ciA9IHN1YmFsaWdubWVudDsgYXB0cjsgYXB0cj0gYXB0ci0+bmV4dCkKKyAgICAgIHsKKwlpZiAoc3RyY21wKGFwdHItPm5hbWUsIHAtPm5hbWUpPT0wKSB7CisJICBzdWJhbGlnbiA9ICBhcHRyLT5zdWJhbGlnbjsKKwl9CisgICAgICB9CisKKyAgICAgIGlmIChiYXNlID09IDApIHsKKwliYXNlID0gcC0+dm1hID8gcC0+dm1hIDpleHBfbmFtZW9wKE5BTUUsICIuIik7CisgICAgICB9CisgICAgICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAocC0+bmFtZSwgYmFzZSwKKwkJCQkJICAgcC0+b2tfdG9fbG9hZCA/IDAgOiBub2xvYWRfc2VjdGlvbiwKKwkJCQkJICAgMSwgYWxpZ24sIHN1YmFsaWduLAorCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKKyAgICAgIGJhc2UgPSAwOworICAgICAgbGFuZ19hZGRfd2lsZCAocC0+bmFtZSwgZmFsc2UsIChjaGFyICopTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKKyAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24sIGFkZCBpdCB0b28gKi8KKyAgICAgIGZvciAoYXB0ciA9IGFsaWFzOyBhcHRyOyBhcHRyID0gYXB0ci0+bmV4dCkgeworCisJaWYgKHN0cmNtcChhcHRyLT5hbGlhcywgcC0+bmFtZSk9PSAwKSB7CisJICBsYW5nX2FkZF93aWxkIChhcHRyLT5uYW1lLCBmYWxzZSwgKGNoYXIgKilOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpOworCX0KKyAgICAgIH0KKworICAgICAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKKwkoMCwgIipkZWZhdWx0KiIsIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7CisKKyAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KKyAgfQorCisKKyAgZG9uZV90cmVlID0gMTsKKworfQordm9pZAorbXJpX2xvYWQgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIGJhc2UgPSAwOworICBsYW5nX2FkZF9pbnB1dF9maWxlKG5hbWUsCisJCSAgICAgIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0sIChjaGFyICopTlVMTCk7CisgIC8qICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCgwLCIqZGVmYXVsdCoiKTsqLworfQorCisKK3ZvaWQKK21yaV9vcmRlciAobmFtZSkKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKK3sKKyAgbXJpX2FkZF90b19saXN0KCZvcmRlciwgbmFtZSwgMCwgMCwwLDApOworfQorCit2b2lkIAorbXJpX2FsaWFzICh3YW50LCBpcywgaXNuKQorICAgICBDT05TVCBjaGFyICp3YW50OworICAgICBDT05TVCBjaGFyICppczsKKyAgICAgaW50IGlzbjsKK3sKKyAgaWYgKCFpcykgeworICAgIC8qIFNvbWUgc2VjdGlvbnMgYXJlIGRpZ2l0cyAtICovCisgICAgY2hhciBidWZbMjBdOworICAgIHNwcmludGYoYnVmLCAiJWQiLCBpc24pOworICAgIGlzID0geHN0cmR1cCAoYnVmKTsKKyAgICBpZiAoaXMgPT0gTlVMTCkKKyAgICAgIGFib3J0ICgpOworICB9CisgIG1yaV9hZGRfdG9fbGlzdCgmYWxpYXMsIGlzLCAwLCB3YW50LDAsMCk7CisKK30KKworCit2b2lkIAorbXJpX25hbWUgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIGxhbmdfYWRkX291dHB1dChuYW1lLCAxKTsKKworfQorCisKK3ZvaWQKK21yaV9mb3JtYXQgKG5hbWUpCisgICAgIENPTlNUIGNoYXIgKm5hbWU7Cit7CisgIGlmIChzdHJjbXAobmFtZSwgIlMiKSA9PSAwKQorICB7CisgICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgic3JlYyIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOworICB9CisgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiSUVFRSIpID09IDApCisgIHsKKyAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJpZWVlIiwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJDT0ZGIikgPT0gMCkKKyAgeworICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoImNvZmYtbTY4ayIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOworICB9CisgIGVsc2UgeworICAgIGVpbmZvKF8oIiVQJUY6IHVua25vd24gZm9ybWF0IHR5cGUgJXNcbiIpLCBuYW1lKTsKKyAgfQorfQorCisKK3ZvaWQKK21yaV9wdWJsaWMgKG5hbWUsIGV4cCkKKyAgICAgQ09OU1QgY2hhciAqbmFtZTsKKyAgICAgZXRyZWVfdHlwZSAqZXhwOworeworICBsYW5nX2FkZF9hc3NpZ25tZW50KGV4cF9hc3NvcCgnPScsIG5hbWUsIGV4cCkpOworfQorCit2b2lkIAorbXJpX2FsaWduIChuYW1lLCBleHApCisgICAgIENPTlNUIGNoYXIgKm5hbWU7CisgICAgIGV0cmVlX3R5cGUgKmV4cDsKK3sKKyAgbXJpX2FkZF90b19saXN0KCZhbGlnbm1lbnQsIG5hbWUsMCwwLGV4cCwwKTsKK30KKwordm9pZCAKK21yaV9hbGlnbm1vZCAobmFtZSwgZXhwKQorICAgICBDT05TVCBjaGFyICpuYW1lOworICAgICBldHJlZV90eXBlICpleHA7Cit7CisgIG1yaV9hZGRfdG9fbGlzdCgmc3ViYWxpZ25tZW50LCBuYW1lLDAsMCwwLGV4cCk7Cit9CisKKwordm9pZCAKK21yaV90cnVuY2F0ZSAoZXhwKQorICAgICB1bnNpZ25lZCBpbnQgZXhwOworeworICBzeW1ib2xfdHJ1bmNhdGUgPSBleHA7Cit9CmRpZmYgLS1naXQgYS9sZC9tcmkuaCBiL2xkL21yaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2YwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9tcmkuaApAQCAtMCwwICsxLDM5IEBACisvKiBtcmkuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTVJJIHNjcmlwdGluZyBmdW5jdGlvbnMKKyAgIENvcHlyaWdodCAxOTkzLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBNUklfSAorI2RlZmluZSBNUklfSAorCitleHRlcm4gdW5zaWduZWQgaW50IHN5bWJvbF90cnVuY2F0ZTsKKworZXh0ZXJuIHZvaWQgbXJpX291dHB1dF9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGV0cmVlX3R5cGUgKnZtYSkpOworZXh0ZXJuIHZvaWQgbXJpX29ubHlfbG9hZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7CitleHRlcm4gdm9pZCBtcmlfYmFzZSBQQVJBTVMgKChldHJlZV90eXBlICpleHApKTsKK2V4dGVybiB2b2lkIG1yaV9sb2FkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKK2V4dGVybiB2b2lkIG1yaV9vcmRlciBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7CitleHRlcm4gdm9pZCBtcmlfYWxpYXMgUEFSQU1TICgoY29uc3QgY2hhciAqd2FudCwgY29uc3QgY2hhciAqaXMsIGludCBpc24pKTsKK2V4dGVybiB2b2lkIG1yaV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKK2V4dGVybiB2b2lkIG1yaV9mb3JtYXQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOworZXh0ZXJuIHZvaWQgbXJpX3B1YmxpYyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKK2V4dGVybiB2b2lkIG1yaV9hbGlnbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKK2V4dGVybiB2b2lkIG1yaV9hbGlnbm1vZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICpleHApKTsKK2V4dGVybiB2b2lkIG1yaV90cnVuY2F0ZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgZXhwKSk7CitleHRlcm4gdm9pZCBtcmlfZHJhd190cmVlIFBBUkFNUyAoKHZvaWQpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9wZS1kbGwuYyBiL2xkL3BlLWRsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzMwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9wZS1kbGwuYwpAQCAtMCwwICsxLDE2NTEgQEAKKy8qIFJvdXRpbmVzIHRvIGhlbHAgYnVpbGQgUEVJLWZvcm1hdCBETExzIChXaW4zMiBldGMpCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IERKIERlbG9yaWUgPGRqQGN5Z251cy5jb20+CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKKyAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmRsaW5rLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImxkLmgiCisjaW5jbHVkZSAibGRleHAuaCIKKyNpbmNsdWRlICJsZGxhbmcuaCIKKyNpbmNsdWRlICJsZHdyaXRlLmgiCisjaW5jbHVkZSAibGRtaXNjLmgiCisjaW5jbHVkZSAibGRncmFtLmgiCisjaW5jbHVkZSAibGRtYWluLmgiCisjaW5jbHVkZSAibGRlbXVsLmgiCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL2JmZC9saWJjb2ZmLmgiCisjaW5jbHVkZSAiZGVmZmlsZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBUaGlzIGZpbGUgdHVybnMgYSByZWd1bGFyIFdpbmRvd3MgUEUgaW1hZ2UgaW50byBhIERMTC4gIEJlY2F1c2Ugb2YKKyB0aGUgY29tcGxleGl0eSBvZiB0aGlzIG9wZXJhdGlvbiwgaXQgaGFzIGJlZW4gYnJva2VuIGRvd24gaW50byBhCisgbnVtYmVyIG9mIHNlcGFyYXRlIG1vZHVsZXMgd2hpY2ggYXJlIGFsbCBjYWxsZWQgYnkgdGhlIG1haW4gZnVuY3Rpb24KKyBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlLWVudHJhbnQgYW5kIGlzCisgbm9ybWFsbHkgb25seSBjYWxsZWQgb25jZSwgc28gc3RhdGljIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZWR1Y2UKKyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMgcmVxdWlyZWQuCisKKyBTZWUgYWxzbzogbGQvZW11bHRlbXBsL3BlLmVtCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGZvciBlbXVsdGVtcGwvcGUuZW0gKi8KKworZGVmX2ZpbGUgKnBlX2RlZl9maWxlID0gMDsKK2ludCBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAwOworaW50IHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzID0gMTsKK2ludCBwZV9kbGxfa2lsbF9hdHMgPSAwOworaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBzdGF0aWMgdmFyaWFibGVzIGFuZCB0eXBlcworCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYmZkX3ZtYSBpbWFnZV9iYXNlOworCitzdGF0aWMgYmZkICpmaWxsZXJfYmZkOworc3RhdGljIHN0cnVjdCBzZWMgKmVkYXRhX3MsICpyZWxvY19zOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmVkYXRhX2QsICpyZWxvY19kOworc3RhdGljIGludCBlZGF0YV9zeiwgcmVsb2Nfc3o7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEhlbHBlciBmdW5jdGlvbnMgZm9yIHFzb3J0LiAgUmVsb2NzIG11c3QgYmUgc29ydGVkIHNvIHRoYXQgd2UgY2FuIHdyaXRlCisgdGhlbSBvdXQgYnkgcGFnZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3JlbG9jX3NvcnQgKHZhLCB2YikKKyAgICAgY29uc3Qgdm9pZCAqdmEsICp2YjsKK3sKKyAgYmZkX3ZtYSBhID0gKihiZmRfdm1hICopIHZhOworICBiZmRfdm1hIGIgPSAqKGJmZF92bWEgKikgdmI7CisgIHJldHVybiAoYSA+IGIpIC0gKGEgPCBiKTsKK30KKworc3RhdGljIGludAorcGVfZXhwb3J0X3NvcnQgKHZhLCB2YikKKyAgICAgY29uc3Qgdm9pZCAqdmEsICp2YjsKK3sKKyAgZGVmX2ZpbGVfZXhwb3J0ICphID0gKGRlZl9maWxlX2V4cG9ydCAqKSB2YTsKKyAgZGVmX2ZpbGVfZXhwb3J0ICpiID0gKGRlZl9maWxlX2V4cG9ydCAqKSB2YjsKKyAgcmV0dXJuIHN0cmNtcCAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIFJlYWQgYW5kIHByb2Nlc3MgdGhlIC5ERUYgZmlsZQorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBlbnRyaWVzIGluIHBlX2RlZl9maWxlLT5leHBvcnRzW10uICBJIHVzZQorICAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldIHRvIHRhZyB3aGV0aGVyIG9yIG5vdCB0aGUgc3ltYm9sIHdhcworICAgZGVmaW5lZCwgc2luY2Ugd2UgY2FuJ3QgZXhwb3J0IHN5bWJvbHMgd2UgZG9uJ3QgaGF2ZS4gKi8KKworc3RhdGljIGJmZF92bWEgKmV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzOworc3RhdGljIHN0cnVjdCBzZWMgKipleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnM7CisKK3N0YXRpYyBpbnQgZXhwb3J0X3RhYmxlX3NpemU7CitzdGF0aWMgaW50IGNvdW50X2V4cG9ydGVkOworc3RhdGljIGludCBjb3VudF9leHBvcnRlZF9ieW5hbWU7CitzdGF0aWMgaW50IGNvdW50X3dpdGhfb3JkaW5hbHM7CitzdGF0aWMgY29uc3QgY2hhciAqZGxsX25hbWU7CitzdGF0aWMgaW50IG1pbl9vcmRpbmFsLCBtYXhfb3JkaW5hbDsKK3N0YXRpYyBpbnQgKmV4cG9ydGVkX3N5bWJvbHM7CisKK3R5cGVkZWYgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QKKyAgeworICAgIGNoYXIgKnN0cmluZzsKKyAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqbmV4dDsKKyAgfQorZXhjbHVkZV9saXN0X3N0cnVjdDsKK3N0YXRpYyBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqZXhjbHVkZXMgPSAwOworCit2b2lkCitwZV9kbGxfYWRkX2V4Y2x1ZGVzIChuZXdfZXhjbHVkZXMpCisgICAgIGNvbnN0IGNoYXIgKm5ld19leGNsdWRlczsKK3sKKyAgY2hhciAqbG9jYWxfY29weTsKKyAgY2hhciAqZXhjbHVkZV9zdHJpbmc7CisKKyAgbG9jYWxfY29weSA9IHhzdHJkdXAgKG5ld19leGNsdWRlcyk7CisKKyAgZXhjbHVkZV9zdHJpbmcgPSBzdHJ0b2sgKGxvY2FsX2NvcHksICIsOiIpOworICBmb3IgKDsgZXhjbHVkZV9zdHJpbmc7IGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChOVUxMLCAiLDoiKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqbmV3X2V4Y2x1ZGU7CisKKyAgICAgIG5ld19leGNsdWRlID0gKChzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqKQorCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QpKSk7CisgICAgICBuZXdfZXhjbHVkZS0+c3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChleGNsdWRlX3N0cmluZykgKyAxKTsKKyAgICAgIHN0cmNweSAobmV3X2V4Y2x1ZGUtPnN0cmluZywgZXhjbHVkZV9zdHJpbmcpOworICAgICAgbmV3X2V4Y2x1ZGUtPm5leHQgPSBleGNsdWRlczsKKyAgICAgIGV4Y2x1ZGVzID0gbmV3X2V4Y2x1ZGU7CisgICAgfQorCisgIGZyZWUgKGxvY2FsX2NvcHkpOworfQorCitzdGF0aWMgaW50CithdXRvX2V4cG9ydCAoZCwgbikKKyAgICAgZGVmX2ZpbGUgKmQ7CisgICAgIGNvbnN0IGNoYXIgKm47Cit7CisgIGludCBpOworICBzdHJ1Y3QgZXhjbHVkZV9saXN0X3N0cnVjdCAqZXg7CisgIGZvciAoaSA9IDA7IGkgPCBkLT5udW1fZXhwb3J0czsgaSsrKQorICAgIGlmIChzdHJjbXAgKGQtPmV4cG9ydHNbaV0ubmFtZSwgbikgPT0gMCkKKyAgICAgIHJldHVybiAwOworICBpZiAocGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobiwgIkRsbE1haW5AMTIiKSA9PSAwKQorCXJldHVybiAwOworICAgICAgaWYgKHN0cmNtcCAobiwgIkRsbEVudHJ5UG9pbnRAMCIpID09IDApCisJcmV0dXJuIDA7CisgICAgICBpZiAoc3RyY21wIChuLCAiaW1wdXJlX3B0ciIpID09IDApCisJcmV0dXJuIDA7CisgICAgfQorICBmb3IgKGV4ID0gZXhjbHVkZXM7IGV4OyBleCA9IGV4LT5uZXh0KQorICAgIGlmIChzdHJjbXAgKG4sIGV4LT5zdHJpbmcpID09IDApCisgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2RlZl9maWxlIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBpbnQgaSwgajsKKyAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJsaGU7CisgIGJmZCAqYjsKKyAgc3RydWN0IHNlYyAqczsKKyAgZGVmX2ZpbGVfZXhwb3J0ICplPTA7CisKKyAgaWYgKCFwZV9kZWZfZmlsZSkKKyAgICBwZV9kZWZfZmlsZSA9IGRlZl9maWxlX2VtcHR5ICgpOworCisgIC8qIEZpcnN0LCBydW4gYXJvdW5kIHRvIGFsbCB0aGUgb2JqZWN0cyBsb29raW5nIGZvciB0aGUgLmRyZWN0dmUKKyAgICAgc2VjdGlvbnMsIGFuZCBwdXNoIHRob3NlIGludG8gdGhlIGRlZiBmaWxlIHRvbyAqLworCisgIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCisgICAgeworICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChiLCAiLmRyZWN0dmUiKTsKKyAgICAgIGlmIChzKQorCXsKKwkgIGludCBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKKwkgIGNoYXIgKmJ1ZiA9IHhtYWxsb2MgKHNpemUpOworCSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChiLCBzLCBidWYsIDAsIHNpemUpOworCSAgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSAocGVfZGVmX2ZpbGUsIGJ1Ziwgc2l6ZSk7CisJICBmcmVlIChidWYpOworCX0KKyAgICB9CisKKyAgLyogTm93LCBtYXliZSBleHBvcnQgZXZlcnl0aGluZyBlbHNlIHRoZSBkZWZhdWx0IHdheSAqLworCisgIGlmIChwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgfHwgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzID09IDApCisgICAgeworICAgICAgZm9yIChiID0gaW5mby0+aW5wdXRfYmZkczsgYjsgYiA9IGItPmxpbmtfbmV4dCkKKwl7CisJICBhc3ltYm9sICoqc3ltYm9sczsKKwkgIGludCBuc3ltcywgc3ltc2l6ZTsKKworCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChiKTsKKwkgIHN5bWJvbHMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3ltc2l6ZSk7CisJICBuc3ltcyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChiLCBzeW1ib2xzKTsKKworCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyBqKyspCisJICAgIHsKKwkgICAgICBpZiAoKHN5bWJvbHNbal0tPmZsYWdzICYgKEJTRl9GVU5DVElPTiB8IEJTRl9HTE9CQUwpKQorCQkgID09IChCU0ZfRlVOQ1RJT04gfCBCU0ZfR0xPQkFMKSkKKwkJeworCQkgIGNvbnN0IGNoYXIgKnNuID0gc3ltYm9sc1tqXS0+bmFtZTsKKwkJICBpZiAoKnNuID09ICdfJykKKwkJICAgIHNuKys7CisJCSAgaWYgKGF1dG9fZXhwb3J0IChwZV9kZWZfZmlsZSwgc24pKQorCQkgICAgZGVmX2ZpbGVfYWRkX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHNuLCAwLCAtMSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyN1bmRlZiBORQorI2RlZmluZSBORSBwZV9kZWZfZmlsZS0+bnVtX2V4cG9ydHMKKworICAvKiBDYW5vbmljYWxpemUgdGhlIGV4cG9ydCBsaXN0ICovCisKKyAgaWYgKHBlX2RsbF9raWxsX2F0cykKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKKwl7CisJICBpZiAoc3RyY2hyIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lLCAnQCcpKQorCSAgICB7CisJICAgICAgLyogVGhpcyB3aWxsIHByZXNlcnZlIGludGVybmFsX25hbWUsIHdoaWNoIG1heSBoYXZlIGJlZW4gcG9pbnRpbmcKKwkgICAgICAgICB0byB0aGUgc2FtZSBtZW1vcnkgYXMgbmFtZSwgb3IgbWlnaHQgbm90IGhhdmUgKi8KKwkgICAgICBjaGFyICp0bXAgPSB4c3RyZHVwIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKTsKKwkgICAgICAqKHN0cmNociAodG1wLCAnQCcpKSA9IDA7CisJICAgICAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSA9IHRtcDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCisJeworCSAgaWYgKHN0cmNociAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwgJ0AnKSkKKwkgICAgeworCSAgICAgIGNoYXIgKnRtcCA9IHhzdHJkdXAgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUpOworCSAgICAgICooc3RyY2hyICh0bXAsICdAJykpID0gMDsKKwkgICAgICBpZiAoYXV0b19leHBvcnQgKHBlX2RlZl9maWxlLCB0bXApKQorCQlkZWZfZmlsZV9hZGRfZXhwb3J0IChwZV9kZWZfZmlsZSwgdG1wLAorCQkJCSAgICAgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwgLTEpOworCSAgICAgIGVsc2UKKwkJZnJlZSAodG1wKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgZSA9IHBlX2RlZl9maWxlLT5leHBvcnRzOyAvKiBjb252ZW5pZW5jZSwgYnV0IHdhdGNoIG91dCBmb3IgaXQgY2hhbmdpbmcgKi8KKworICBleHBvcnRlZF9zeW1ib2xfb2Zmc2V0cyA9IChiZmRfdm1hICopIHhtYWxsb2MgKE5FICogc2l6ZW9mIChiZmRfdm1hKSk7CisgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9ucyA9IChzdHJ1Y3Qgc2VjICoqKSB4bWFsbG9jIChORSAqIHNpemVvZiAoc3RydWN0IHNlYyAqKSk7CisKKyAgbWVtc2V0IChleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnMsIDAsIE5FICogc2l6ZW9mIChzdHJ1Y3Qgc2VjICopKTsKKyAgbWF4X29yZGluYWwgPSAwOworICBtaW5fb3JkaW5hbCA9IDY1NTM2OworICBjb3VudF9leHBvcnRlZCA9IDA7CisgIGNvdW50X2V4cG9ydGVkX2J5bmFtZSA9IDA7CisgIGNvdW50X3dpdGhfb3JkaW5hbHMgPSAwOworCisgIHFzb3J0IChwZV9kZWZfZmlsZS0+ZXhwb3J0cywgTkUsIHNpemVvZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbMF0pLCBwZV9leHBvcnRfc29ydCk7CisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgTkU7IGkrKykKKyAgICB7CisgICAgICBpZiAoaSA+IDAgJiYgc3RyY21wIChlW2ldLm5hbWUsIGVbaSAtIDFdLm5hbWUpID09IDApCisJeworCSAgLyogVGhpcyBpcyBhIGR1cGxpY2F0ZSAqLworCSAgaWYgKGVbaiAtIDFdLm9yZGluYWwgIT0gLTEKKwkgICAgICAmJiBlW2ldLm9yZGluYWwgIT0gLTEKKwkgICAgICAmJiBlW2ogLSAxXS5vcmRpbmFsICE9IGVbaV0ub3JkaW5hbCkKKwkgICAgeworCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICAgICAgZWluZm8gKF8oIiVYRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzICglZCB2cyAlZClcbiIpLAorCQkgICAgIGVbaiAtIDFdLm5hbWUsIGVbaiAtIDFdLm9yZGluYWwsIGVbaV0ub3JkaW5hbCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICAgICAgZWluZm8gKF8oIldhcm5pbmcsIGR1cGxpY2F0ZSBFWFBPUlQ6ICVzXG4iKSwKKwkJICAgICBlW2ogLSAxXS5uYW1lKTsKKwkgICAgfQorCSAgaWYgKGVbaV0ub3JkaW5hbCkKKwkgICAgZVtqIC0gMV0ub3JkaW5hbCA9IGVbaV0ub3JkaW5hbDsKKwkgIGVbaiAtIDFdLmZsYWdfcHJpdmF0ZSB8PSBlW2ldLmZsYWdfcHJpdmF0ZTsKKwkgIGVbaiAtIDFdLmZsYWdfY29uc3RhbnQgfD0gZVtpXS5mbGFnX2NvbnN0YW50OworCSAgZVtqIC0gMV0uZmxhZ19ub25hbWUgfD0gZVtpXS5mbGFnX25vbmFtZTsKKwkgIGVbaiAtIDFdLmZsYWdfZGF0YSB8PSBlW2ldLmZsYWdfZGF0YTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGkgIT0gaikKKwkgICAgZVtqXSA9IGVbaV07CisJICBqKys7CisJfQorICAgIH0KKyAgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzID0gajsJLyogPT0gTkUgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgTkU7IGkrKykKKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKSArIDIpOworICAgICAgKm5hbWUgPSAnXyc7CisgICAgICBzdHJjcHkgKG5hbWUgKyAxLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKKworICAgICAgYmxoZSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAorCQkJCSAgIG5hbWUsCisJCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKworICAgICAgaWYgKGJsaGUgJiYgKGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKSkKKwl7CisJICBjb3VudF9leHBvcnRlZCsrOworCSAgaWYgKCFwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5mbGFnX25vbmFtZSkKKwkgICAgY291bnRfZXhwb3J0ZWRfYnluYW1lKys7CisJICBleHBvcnRlZF9zeW1ib2xfb2Zmc2V0c1tpXSA9IGJsaGUtPnUuZGVmLnZhbHVlOworCSAgZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zW2ldID0gYmxoZS0+dS5kZWYuc2VjdGlvbjsKKwkgIGlmIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsICE9IC0xKQorCSAgICB7CisJICAgICAgaWYgKG1heF9vcmRpbmFsIDwgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCkKKwkJbWF4X29yZGluYWwgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsOworCSAgICAgIGlmIChtaW5fb3JkaW5hbCA+IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwpCisJCW1pbl9vcmRpbmFsID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbDsKKwkgICAgICBjb3VudF93aXRoX29yZGluYWxzKys7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChibGhlICYmIGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJeworCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZGVmaW5lZFxuIiksCisJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKKwl9CisgICAgICBlbHNlIGlmIChibGhlKQorCXsKKwkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgd3JvbmcgdHlwZSAoJWQgdnMgJWQpXG4iKSwKKwkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUsCisJCSBibGhlLT50eXBlLCBiZmRfbGlua19oYXNoX2RlZmluZWQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBmb3VuZFxuIiksCisJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKKwl9CisgICAgICBmcmVlIChuYW1lKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEJ1aWxkIHRoZSBiZmQgdGhhdCB3aWxsIGNvbnRhaW4gLmVkYXRhIGFuZCAucmVsb2Mgc2VjdGlvbnMKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2J1aWxkX2ZpbGxlcl9iZmQgKCkKK3sKKyAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsbGVyX2ZpbGU7CisgIGZpbGxlcl9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAoImRsbCBzdHVmZiIsCisJCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAorCQkJCSAgICAgTlVMTCk7CisgIGZpbGxlcl9maWxlLT50aGVfYmZkID0gZmlsbGVyX2JmZCA9IGJmZF9jcmVhdGUgKCJkbGwgc3R1ZmYiLCBvdXRwdXRfYmZkKTsKKyAgaWYgKGZpbGxlcl9iZmQgPT0gTlVMTAorICAgICAgfHwgIWJmZF9zZXRfYXJjaF9tYWNoIChmaWxsZXJfYmZkLAorCQkJICAgICBiZmRfZ2V0X2FyY2ggKG91dHB1dF9iZmQpLAorCQkJICAgICBiZmRfZ2V0X21hY2ggKG91dHB1dF9iZmQpKSkKKyAgICB7CisgICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIEJGRCAlRVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGVkYXRhX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIuZWRhdGEiKTsKKyAgaWYgKGVkYXRhX3MgPT0gTlVMTAorICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZmlsbGVyX2JmZCwgZWRhdGFfcywKKwkJCQkgKFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkgIHwgU0VDX0FMTE9DCisJCQkJICB8IFNFQ19MT0FECisJCQkJICB8IFNFQ19LRUVQCisJCQkJICB8IFNFQ19JTl9NRU1PUlkpKSkKKyAgICB7CisgICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5lZGF0YSBzZWN0aW9uOiAlRVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgZWRhdGFfcywgZWRhdGFfc3opOworCisgIHJlbG9jX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIucmVsb2MiKTsKKyAgaWYgKHJlbG9jX3MgPT0gTlVMTAorICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZmlsbGVyX2JmZCwgcmVsb2NfcywKKwkJCQkgKFNFQ19IQVNfQ09OVEVOVFMKKwkJCQkgIHwgU0VDX0FMTE9DCisJCQkJICB8IFNFQ19MT0FECisJCQkJICB8IFNFQ19LRUVQCisJCQkJICB8IFNFQ19JTl9NRU1PUlkpKSkKKyAgICB7CisgICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5yZWxvYyBzZWN0aW9uOiAlRVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgMCk7CisKKyAgbGRsYW5nX2FkZF9maWxlIChmaWxsZXJfZmlsZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEdhdGhlciBhbGwgdGhlIGV4cG9ydGVkIHN5bWJvbHMgYW5kIGJ1aWxkIHRoZSAuZWRhdGEgc2VjdGlvbgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfZWRhdGEgKGFiZmQsIGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Cit7CisgIGludCBpLCBuZXh0X29yZGluYWw7CisgIGludCBuYW1lX3RhYmxlX3NpemUgPSAwOworICBjb25zdCBjaGFyICpkbG5wOworCisgIC8qIEZpcnN0LCB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgZXhwb3J0ZWQgc3ltYm9scyB0aGVyZSBhcmUsCisgICAgIGFuZCB3aGF0IHRoZSByYW5nZSBvZiBvcmRpbmFscyBpcy4gKi8KKworICBpZiAocGVfZGVmX2ZpbGUtPm5hbWUpCisgICAgeworICAgICAgZGxsX25hbWUgPSBwZV9kZWZfZmlsZS0+bmFtZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkbGxfbmFtZSA9IGFiZmQtPmZpbGVuYW1lOworICAgICAgZm9yIChkbG5wID0gZGxsX25hbWU7ICpkbG5wOyBkbG5wKyspCisJeworCSAgaWYgKCpkbG5wID09ICdcXCcgfHwgKmRsbnAgPT0gJy8nIHx8ICpkbG5wID09ICc6JykKKwkgICAgZGxsX25hbWUgPSBkbG5wICsgMTsKKwl9CisgICAgfQorCisgIGlmIChjb3VudF93aXRoX29yZGluYWxzICYmIG1heF9vcmRpbmFsID4gY291bnRfZXhwb3J0ZWQpCisgICAgeworICAgICAgaWYgKG1pbl9vcmRpbmFsID4gbWF4X29yZGluYWwgLSBjb3VudF9leHBvcnRlZCArIDEpCisJbWluX29yZGluYWwgPSBtYXhfb3JkaW5hbCAtIGNvdW50X2V4cG9ydGVkICsgMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtaW5fb3JkaW5hbCA9IDE7CisgICAgICBtYXhfb3JkaW5hbCA9IGNvdW50X2V4cG9ydGVkOworICAgIH0KKyAgZXhwb3J0X3RhYmxlX3NpemUgPSBtYXhfb3JkaW5hbCAtIG1pbl9vcmRpbmFsICsgMTsKKworICBleHBvcnRlZF9zeW1ib2xzID0gKGludCAqKSB4bWFsbG9jIChleHBvcnRfdGFibGVfc2l6ZSAqIHNpemVvZiAoaW50KSk7CisgIGZvciAoaSA9IDA7IGkgPCBleHBvcnRfdGFibGVfc2l6ZTsgaSsrKQorICAgIGV4cG9ydGVkX3N5bWJvbHNbaV0gPSAtMTsKKworICAvKiBOb3cgd2UgbmVlZCB0byBhc3NpZ24gb3JkaW5hbHMgdG8gdGhvc2UgdGhhdCBkb24ndCBoYXZlIHRoZW0gKi8KKyAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCisgICAgeworICAgICAgaWYgKGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSkKKwl7CisJICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAhPSAtMSkKKwkgICAgeworCSAgICAgIGludCBlaSA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgLSBtaW5fb3JkaW5hbDsKKwkgICAgICBpbnQgcGkgPSBleHBvcnRlZF9zeW1ib2xzW2VpXTsKKwkgICAgICBpZiAocGkgIT0gLTEpCisJCXsKKwkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkgIGVpbmZvIChfKCIlWEVycm9yLCBvcmlkaW5hbCB1c2VkIHR3aWNlOiAlZCAoJXMgdnMgJXMpXG4iKSwKKwkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsLAorCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsCisJCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbcGldLm5hbWUpOworCQl9CisJICAgICAgZXhwb3J0ZWRfc3ltYm9sc1tlaV0gPSBpOworCSAgICB9CisJICBuYW1lX3RhYmxlX3NpemUgKz0gc3RybGVuIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKSArIDE7CisJfQorICAgIH0KKworICBuZXh0X29yZGluYWwgPSBtaW5fb3JkaW5hbDsKKyAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCisgICAgaWYgKGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSkKKyAgICAgIGlmIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsID09IC0xKQorCXsKKwkgIHdoaWxlIChleHBvcnRlZF9zeW1ib2xzW25leHRfb3JkaW5hbCAtIG1pbl9vcmRpbmFsXSAhPSAtMSkKKwkgICAgbmV4dF9vcmRpbmFsKys7CisJICBleHBvcnRlZF9zeW1ib2xzW25leHRfb3JkaW5hbCAtIG1pbl9vcmRpbmFsXSA9IGk7CisJICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsID0gbmV4dF9vcmRpbmFsOworCX0KKworICAvKiBPSywgbm93IHdlIGNhbiBhbGxvY2F0ZSBzb21lIG1lbW9yeSAqLworCisgIGVkYXRhX3N6ID0gKDQwCQkvKiBkaXJlY3RvcnkgKi8KKwkgICAgICArIDQgKiBleHBvcnRfdGFibGVfc2l6ZQkvKiBhZGRyZXNzZXMgKi8KKwkgICAgICArIDQgKiBjb3VudF9leHBvcnRlZF9ieW5hbWUJLyogbmFtZSBwdHJzICovCisJICAgICAgKyAyICogY291bnRfZXhwb3J0ZWRfYnluYW1lCS8qIG9yZGluYWxzICovCisJICAgICAgKyBuYW1lX3RhYmxlX3NpemUgKyBzdHJsZW4gKGRsbF9uYW1lKSArIDEpOworfQorCitzdGF0aWMgdm9pZAorZmlsbF9lZGF0YSAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKyAgaW50IGksIGhpbnQ7CisgIHVuc2lnbmVkIGNoYXIgKmVkaXJlY3Rvcnk7CisgIHVuc2lnbmVkIGxvbmcgKmVhZGRyZXNzZXM7CisgIHVuc2lnbmVkIGxvbmcgKmVuYW1lcHRyczsKKyAgdW5zaWduZWQgc2hvcnQgKmVvcmRpbmFsczsKKyAgdW5zaWduZWQgY2hhciAqZW5hbWVzdHI7CisgIHRpbWVfdCBub3c7CisKKyAgdGltZSAoJm5vdyk7CisKKyAgZWRhdGFfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGVkYXRhX3N6KTsKKworICAvKiBOb3RlIHVzZSBvZiBhcnJheSBwb2ludGVyIG1hdGggaGVyZSAqLworICBlZGlyZWN0b3J5ID0gZWRhdGFfZDsKKyAgZWFkZHJlc3NlcyA9ICh1bnNpZ25lZCBsb25nICopIChlZGF0YV9kICsgNDApOworICBlbmFtZXB0cnMgPSBlYWRkcmVzc2VzICsgZXhwb3J0X3RhYmxlX3NpemU7CisgIGVvcmRpbmFscyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoZW5hbWVwdHJzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKKyAgZW5hbWVzdHIgPSAoY2hhciAqKSAoZW9yZGluYWxzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKKworI2RlZmluZSBFUlZBKHB0cikgKCgodW5zaWduZWQgY2hhciAqKShwdHIpIC0gZWRhdGFfZCkgKyBlZGF0YV9zLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gaW1hZ2VfYmFzZSkKKworICBtZW1zZXQgKGVkYXRhX2QsIDAsIDQwKTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgbm93LCBlZGF0YV9kICsgNCk7CisgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKKyAgICB7CisgICAgICBiZmRfcHV0XzE2IChhYmZkLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciwgZWRhdGFfZCArIDgpOworICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IsIGVkYXRhX2QgKyAxMCk7CisgICAgfQorICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksIGVkYXRhX2QgKyAxMik7CisgIHN0cmNweSAoZW5hbWVzdHIsIGRsbF9uYW1lKTsKKyAgZW5hbWVzdHIgKz0gc3RybGVuIChlbmFtZXN0cikgKyAxOworICBiZmRfcHV0XzMyIChhYmZkLCBtaW5fb3JkaW5hbCwgZWRhdGFfZCArIDE2KTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgZXhwb3J0X3RhYmxlX3NpemUsIGVkYXRhX2QgKyAyMCk7CisgIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50X2V4cG9ydGVkX2J5bmFtZSwgZWRhdGFfZCArIDI0KTsKKyAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZWFkZHJlc3NlcyksIGVkYXRhX2QgKyAyOCk7CisgIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lcHRycyksIGVkYXRhX2QgKyAzMik7CisgIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVvcmRpbmFscyksIGVkYXRhX2QgKyAzNik7CisKKyAgLyogT2ssIG5vdyBmb3IgdGhlIGZpbGxpbmcgaW4gcGFydCAqLworICBoaW50ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGV4cG9ydF90YWJsZV9zaXplOyBpKyspCisgICAgeworICAgICAgaW50IHMgPSBleHBvcnRlZF9zeW1ib2xzW2ldOworICAgICAgaWYgKHMgIT0gLTEpCisJeworCSAgc3RydWN0IHNlYyAqc3NlYyA9IGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tzXTsKKwkgIHVuc2lnbmVkIGxvbmcgc3J2YSA9IChleHBvcnRlZF9zeW1ib2xfb2Zmc2V0c1tzXQorCQkJCSsgc3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQorCQkJCSsgc3NlYy0+b3V0cHV0X29mZnNldCk7CisKKwkgIGJmZF9wdXRfMzIgKGFiZmQsIHNydmEgLSBpbWFnZV9iYXNlLCAodm9pZCAqKSAoZWFkZHJlc3NlcyArIGkpKTsKKwkgIGlmICghcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10uZmxhZ19ub25hbWUpCisJICAgIHsKKwkgICAgICBjaGFyICplbmFtZSA9IHBlX2RlZl9maWxlLT5leHBvcnRzW3NdLm5hbWU7CisJICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW5hbWVzdHIpLCAodm9pZCAqKSBlbmFtZXB0cnMpOworCSAgICAgIHN0cmNweSAoZW5hbWVzdHIsIGVuYW1lKTsKKwkgICAgICBlbmFtZXN0ciArPSBzdHJsZW4gKGVuYW1lc3RyKSArIDE7CisJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaSwgKHZvaWQgKikgZW9yZGluYWxzKTsKKwkgICAgICBlbmFtZXB0cnMrKzsKKwkgICAgICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5oaW50ID0gaGludCsrOworCSAgICB9CisJICBlb3JkaW5hbHMrKzsKKwl9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBHYXRoZXIgYWxsIHRoZSByZWxvY2F0aW9ucyBhbmQgYnVpbGQgdGhlIC5yZWxvYyBzZWN0aW9uCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitnZW5lcmF0ZV9yZWxvYyAoYWJmZCwgaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKK3sKKworICAvKiBmb3IgLnJlbG9jIHN0dWZmICovCisgIGJmZF92bWEgKnJlbG9jX2FkZHJlc3NlczsKKyAgaW50IHRvdGFsX3JlbG9jcyA9IDA7CisgIGludCBpOworICB1bnNpZ25lZCBsb25nIHNlY19wYWdlID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7CisgIHVuc2lnbmVkIGxvbmcgcGFnZV9wdHIsIHBhZ2VfY291bnQ7CisgIGludCBiaTsKKyAgYmZkICpiOworICBzdHJ1Y3Qgc2VjICpzOworCisgIHRvdGFsX3JlbG9jcyA9IDA7CisgIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCisgICAgZm9yIChzID0gYi0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQorICAgICAgdG90YWxfcmVsb2NzICs9IHMtPnJlbG9jX2NvdW50OworCisgIHJlbG9jX2FkZHJlc3NlcyA9IChiZmRfdm1hICopIHhtYWxsb2MgKHRvdGFsX3JlbG9jcyAqIHNpemVvZiAoYmZkX3ZtYSkpOworCisgIHRvdGFsX3JlbG9jcyA9IDA7CisgIGJpID0gMDsKKyAgZm9yIChiaSA9IDAsIGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiaSsrLCBiID0gYi0+bGlua19uZXh0KQorICAgIHsKKyAgICAgIGFyZWxlbnQgKipyZWxvY3M7CisgICAgICBpbnQgcmVsc2l6ZSwgbnJlbG9jcywgaTsKKworICAgICAgZm9yIChzID0gYi0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgc2VjX3ZtYSA9IHMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0OworCSAgYXN5bWJvbCAqKnN5bWJvbHM7CisJICBpbnQgbnN5bXMsIHN5bXNpemU7CisKKwkgIC8qIGlmIGl0J3Mgbm90IGxvYWRlZCwgd2UgZG9uJ3QgbmVlZCB0byByZWxvY2F0ZSBpdCB0aGlzIHdheSAqLworCSAgaWYgKCEocy0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQorCSAgICBjb250aW51ZTsKKworCSAgLyogSSBkb24ndCBrbm93IHdoeSB0aGVyZSB3b3VsZCBiZSBhIHJlbG9jIGZvciB0aGVzZSwgYnV0IEkndmUKKwkgICAgIHNlZW4gaXQgaGFwcGVuIC0gREogKi8KKwkgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQorCSAgICBjb250aW51ZTsKKworCSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uLT52bWEgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEh1aD8gIFNob3VsZG4ndCBoYXBwZW4sIGJ1dCBwdW50IGlmIGl0IGRvZXMgKi8KKwkgICAgICBlaW5mbyAoIkRKOiB6ZXJvIHZtYSBzZWN0aW9uIHJlbG9jIGRldGVjdGVkOiBgJXMnICMlZCBmPSVkXG4iLAorCQkgICAgIHMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCBzLT5vdXRwdXRfc2VjdGlvbi0+aW5kZXgsCisJCSAgICAgcy0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGIpOworCSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKKwkgIG5zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGIsIHN5bWJvbHMpOworCisJICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYiwgcyk7CisJICByZWxvY3MgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoKHNpemVfdCkgcmVsc2l6ZSk7CisJICBucmVsb2NzID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYiwgcywgcmVsb2NzLCBzeW1ib2xzKTsKKworCSAgZm9yIChpID0gMDsgaSA8IG5yZWxvY3M7IGkrKykKKwkgICAgeworCSAgICAgIGlmICghcmVsb2NzW2ldLT5ob3d0by0+cGNfcmVsYXRpdmUKKwkJICAmJiByZWxvY3NbaV0tPmhvd3RvLT50eXBlICE9IFJfSU1BR0VCQVNFKQorCQl7CisJCSAgc3dpdGNoIChyZWxvY3NbaV0tPmhvd3RvLT5iaXRzaXplKQorCQkgICAgeworCQkgICAgY2FzZSAzMjoKKwkJICAgICAgcmVsb2NfYWRkcmVzc2VzW3RvdGFsX3JlbG9jcysrXSA9IHNlY192bWEgKyByZWxvY3NbaV0tPmFkZHJlc3M7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkJICAgICAgZWluZm8gKF8oIiVYRXJyb3I6ICVkLWJpdCByZWxvYyBpbiBkbGxcbiIpLAorCQkJICAgICByZWxvY3NbaV0tPmhvd3RvLT5iaXRzaXplKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZnJlZSAocmVsb2NzKTsKKwkgIC8qIFdhcm5pbmc6IHRoZSBhbGxvY2F0ZWQgc3ltYm9scyBhcmUgcmVtZW1iZXJlZCBpbiBCRkQgYW5kIHJldXNlZAorCSAgICAgbGF0ZXIsIHNvIGRvbid0IGZyZWUgdGhlbSEgKi8KKwkgIC8qIGZyZWUgKHN5bWJvbHMpOyAqLworCX0KKyAgICB9CisKKyAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0b3RhbF9yZWxvY3MgcmVsb2NhdGlvbiBhZGRyZXNzZXMgaW4KKyAgICAgcmVsb2NfYWRkcmVzc2VzLCB3aGljaCBhcmUgYWxsIHN1aXRhYmxlIGZvciB0aGUgLnJlbG9jIHNlY3Rpb24uCisgICAgIFdlIG11c3Qgbm93IGNyZWF0ZSB0aGUgbmV3IHNlY3Rpb25zLiAqLworCisgIHFzb3J0IChyZWxvY19hZGRyZXNzZXMsIHRvdGFsX3JlbG9jcywgc2l6ZW9mIChiZmRfdm1hKSwgcmVsb2Nfc29ydCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3JlbG9jczsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19wYWdlID0gKHJlbG9jX2FkZHJlc3Nlc1tpXSA+PiAxMik7CisgICAgICBpZiAodGhpc19wYWdlICE9IHNlY19wYWdlKQorCXsKKwkgIHJlbG9jX3N6ID0gKHJlbG9jX3N6ICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduICovCisJICByZWxvY19zeiArPSA4OworCSAgc2VjX3BhZ2UgPSB0aGlzX3BhZ2U7CisJfQorICAgICAgcmVsb2Nfc3ogKz0gMjsKKyAgICB9CisgIHJlbG9jX3N6ID0gKHJlbG9jX3N6ICsgMykgJiB+MzsJLyogNC1ieXRlIGFsaWduICovCisKKyAgcmVsb2NfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKHJlbG9jX3N6KTsKKworICBzZWNfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSAoLTEpOworICByZWxvY19zeiA9IDA7CisgIHBhZ2VfcHRyID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7CisgIHBhZ2VfY291bnQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfcmVsb2NzOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBydmEgPSByZWxvY19hZGRyZXNzZXNbaV0gLSBpbWFnZV9iYXNlOworICAgICAgdW5zaWduZWQgbG9uZyB0aGlzX3BhZ2UgPSAocnZhICYgfjB4ZmZmKTsKKyAgICAgIGlmICh0aGlzX3BhZ2UgIT0gc2VjX3BhZ2UpCisJeworCSAgd2hpbGUgKHJlbG9jX3N6ICYgMykKKwkgICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7CisJICBpZiAocGFnZV9wdHIgIT0gKHVuc2lnbmVkIGxvbmcpICgtMSkpCisJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jX3N6IC0gcGFnZV9wdHIsIHJlbG9jX2QgKyBwYWdlX3B0ciArIDQpOworCSAgYmZkX3B1dF8zMiAoYWJmZCwgdGhpc19wYWdlLCByZWxvY19kICsgcmVsb2Nfc3opOworCSAgcGFnZV9wdHIgPSByZWxvY19zejsKKwkgIHJlbG9jX3N6ICs9IDg7CisJICBzZWNfcGFnZSA9IHRoaXNfcGFnZTsKKwkgIHBhZ2VfY291bnQgPSAwOworCX0KKyAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIChydmEgJiAweGZmZikgKyAweDMwMDAsIHJlbG9jX2QgKyByZWxvY19zeik7CisgICAgICByZWxvY19zeiArPSAyOworICAgICAgcGFnZV9jb3VudCsrOworICAgIH0KKyAgd2hpbGUgKHJlbG9jX3N6ICYgMykKKyAgICByZWxvY19kW3JlbG9jX3N6KytdID0gMDsKKyAgaWYgKHBhZ2VfcHRyICE9ICh1bnNpZ25lZCBsb25nKSAoLTEpKQorICAgIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jX3N6IC0gcGFnZV9wdHIsIHJlbG9jX2QgKyBwYWdlX3B0ciArIDQpOworICB3aGlsZSAocmVsb2Nfc3ogPCByZWxvY19zLT5fcmF3X3NpemUpCisgICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIEdpdmVuIHRoZSBleGl0aW5nIGRlZl9maWxlIHN0cnVjdHVyZSwgcHJpbnQgb3V0IGEgLkRFRiBmaWxlIHRoYXQKKyBjb3JyZXNwb25kcyB0byBpdC4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK3F1b3RlcHV0IChzLCBmLCBuZWVkc19xdW90ZXMpCisgICAgIGNoYXIgKnM7CisgICAgIEZJTEUgKiBmOworICAgICBpbnQgbmVlZHNfcXVvdGVzOworeworICBjaGFyICpjcDsKKyAgZm9yIChjcCA9IHM7ICpjcDsgY3ArKykKKyAgICBpZiAoKmNwID09ICdcJycKKwl8fCAqY3AgPT0gJyInCisJfHwgKmNwID09ICdcXCcKKwl8fCBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmNwKQorCXx8ICpjcCA9PSAnLCcKKwl8fCAqY3AgPT0gJzsnKQorICAgICAgbmVlZHNfcXVvdGVzID0gMTsKKyAgaWYgKG5lZWRzX3F1b3RlcykKKyAgICB7CisgICAgICBwdXRjICgnIicsIGYpOworICAgICAgd2hpbGUgKCpzKQorCXsKKwkgIGlmICgqcyA9PSAnIicgfHwgKnMgPT0gJ1xcJykKKwkgICAgcHV0YyAoJ1xcJywgZik7CisJICBwdXRjICgqcywgZik7CisJICBzKys7CisJfQorICAgICAgcHV0YyAoJyInLCBmKTsKKyAgICB9CisgIGVsc2UKKyAgICBmcHV0cyAocywgZik7Cit9CisKK3ZvaWQKK3BlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSAocGVfb3V0X2RlZl9maWxlbmFtZSkKKyAgICAgY2hhciAqcGVfb3V0X2RlZl9maWxlbmFtZTsKK3sKKyAgaW50IGk7CisgIEZJTEUgKm91dCA9IGZvcGVuIChwZV9vdXRfZGVmX2ZpbGVuYW1lLCAidyIpOworICBpZiAob3V0ID09IE5VTEwpCisgICAgeworICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGVpbmZvIChfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZGVmIGZpbGUgJXNcbiIpLAorCSAgICAgcHJvZ3JhbV9uYW1lLCBwZV9vdXRfZGVmX2ZpbGVuYW1lKTsKKyAgICB9CisKKyAgaWYgKHBlX2RlZl9maWxlKQorICAgIHsKKyAgICAgIGlmIChwZV9kZWZfZmlsZS0+bmFtZSkKKwl7CisJICBpZiAocGVfZGVmX2ZpbGUtPmlzX2RsbCkKKwkgICAgZnByaW50ZiAob3V0LCAiTElCUkFSWSAiKTsKKwkgIGVsc2UKKwkgICAgZnByaW50ZiAob3V0LCAiTkFNRSAiKTsKKwkgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+bmFtZSwgb3V0LCAxKTsKKwkgIGlmIChwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSkKKwkgICAgZnByaW50ZiAob3V0LCAiIEJBU0U9MHglbHgiLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSk7CisJICBmcHJpbnRmIChvdXQsICJcbiIpOworCX0KKworICAgICAgaWYgKHBlX2RlZl9maWxlLT5kZXNjcmlwdGlvbikKKwl7CisJICBmcHJpbnRmIChvdXQsICJERVNDUklQVElPTiAiKTsKKwkgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+ZGVzY3JpcHRpb24sIG91dCwgMSk7CisJICBmcHJpbnRmIChvdXQsICJcbiIpOworCX0KKworICAgICAgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21pbm9yICE9IC0xKQorCWZwcmludGYgKG91dCwgIlZFUlNJT04gJWQuJWRcbiIsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yLAorCQkgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IpOworICAgICAgZWxzZSBpZiAocGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IgIT0gLTEpCisJZnByaW50ZiAob3V0LCAiVkVSU0lPTiAlZFxuIiwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IpOworCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUgIT0gLTEgfHwgcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSAhPSAtMSkKKwlmcHJpbnRmIChvdXQsICJcbiIpOworCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX2NvbW1pdCAhPSAtMSkKKwlmcHJpbnRmIChvdXQsICJTVEFDS1NJWkUgMHgleCwweCV4XG4iLAorCQkgcGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUsIHBlX2RlZl9maWxlLT5zdGFja19jb21taXQpOworICAgICAgZWxzZSBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUgIT0gLTEpCisJZnByaW50ZiAob3V0LCAiU1RBQ0tTSVpFIDB4JXhcbiIsIHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlKTsKKyAgICAgIGlmIChwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQgIT0gLTEpCisJZnByaW50ZiAob3V0LCAiSEVBUFNJWkUgMHgleCwweCV4XG4iLAorCQkgcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSwgcGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0KTsKKyAgICAgIGVsc2UgaWYgKHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEpCisJZnByaW50ZiAob3V0LCAiSEVBUFNJWkUgMHgleFxuIiwgcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSk7CisKKyAgICAgIGlmIChwZV9kZWZfZmlsZS0+bnVtX3NlY3Rpb25fZGVmcyA+IDApCisJeworCSAgZnByaW50ZiAob3V0LCAiXG5TRUNUSU9OU1xuXG4iKTsKKwkgIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQorCSAgICB7CisJICAgICAgZnByaW50ZiAob3V0LCAiICAgICIpOworCSAgICAgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLm5hbWUsIG91dCwgMCk7CisJICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpCisJCXsKKwkJICBmcHJpbnRmIChvdXQsICIgQ0xBU1MgIik7CisJCSAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MsIG91dCwgMCk7CisJCX0KKwkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3JlYWQpCisJCWZwcmludGYgKG91dCwgIiBSRUFEIik7CisJICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ193cml0ZSkKKwkJZnByaW50ZiAob3V0LCAiIFdSSVRFIik7CisJICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19leGVjdXRlKQorCQlmcHJpbnRmIChvdXQsICIgRVhFQ1VURSIpOworCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfc2hhcmVkKQorCQlmcHJpbnRmIChvdXQsICIgU0hBUkVEIik7CisJICAgICAgZnByaW50ZiAob3V0LCAiXG4iKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA+IDApCisJeworCSAgZnByaW50ZiAob3V0LCAiXG5FWFBPUlRTXG5cbiIpOworCSAgZm9yIChpID0gMDsgaSA8IHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQorCSAgICB7CisJICAgICAgZGVmX2ZpbGVfZXhwb3J0ICplID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHMgKyBpOworCSAgICAgIGZwcmludGYgKG91dCwgIiAgICAiKTsKKwkgICAgICBxdW90ZXB1dCAoZS0+bmFtZSwgb3V0LCAwKTsKKwkgICAgICBpZiAoZS0+aW50ZXJuYWxfbmFtZSAmJiBzdHJjbXAgKGUtPmludGVybmFsX25hbWUsIGUtPm5hbWUpKQorCQl7CisJCSAgZnByaW50ZiAob3V0LCAiID0gIik7CisJCSAgcXVvdGVwdXQgKGUtPmludGVybmFsX25hbWUsIG91dCwgMCk7CisJCX0KKwkgICAgICBpZiAoZS0+b3JkaW5hbCAhPSAtMSkKKwkJZnByaW50ZiAob3V0LCAiIEAlZCIsIGUtPm9yZGluYWwpOworCSAgICAgIGlmIChlLT5mbGFnX3ByaXZhdGUpCisJCWZwcmludGYgKG91dCwgIiBQUklWQVRFIik7CisJICAgICAgaWYgKGUtPmZsYWdfY29uc3RhbnQpCisJCWZwcmludGYgKG91dCwgIiBDT05TVEFOVCIpOworCSAgICAgIGlmIChlLT5mbGFnX25vbmFtZSkKKwkJZnByaW50ZiAob3V0LCAiIE5PTkFNRSIpOworCSAgICAgIGlmIChlLT5mbGFnX2RhdGEpCisJCWZwcmludGYgKG91dCwgIiBEQVRBIik7CisKKwkgICAgICBmcHJpbnRmIChvdXQsICJcbiIpOworCSAgICB9CisJfQorCisgICAgICBpZiAocGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzID4gMCkKKwl7CisJICBmcHJpbnRmIChvdXQsICJcbklNUE9SVFNcblxuIik7CisJICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzOyBpKyspCisJICAgIHsKKwkgICAgICBkZWZfZmlsZV9pbXBvcnQgKmltID0gcGVfZGVmX2ZpbGUtPmltcG9ydHMgKyBpOworCSAgICAgIGZwcmludGYgKG91dCwgIiAgICAiKTsKKwkgICAgICBpZiAoaW0tPmludGVybmFsX25hbWUKKwkJICAmJiAoIWltLT5uYW1lIHx8IHN0cmNtcCAoaW0tPmludGVybmFsX25hbWUsIGltLT5uYW1lKSkpCisJCXsKKwkJICBxdW90ZXB1dCAoaW0tPmludGVybmFsX25hbWUsIG91dCwgMCk7CisJCSAgZnByaW50ZiAob3V0LCAiID0gIik7CisJCX0KKwkgICAgICBxdW90ZXB1dCAoaW0tPm1vZHVsZS0+bmFtZSwgb3V0LCAwKTsKKwkgICAgICBmcHJpbnRmIChvdXQsICIuIik7CisJICAgICAgaWYgKGltLT5uYW1lKQorCQlxdW90ZXB1dCAoaW0tPm5hbWUsIG91dCwgMCk7CisJICAgICAgZWxzZQorCQlmcHJpbnRmIChvdXQsICIlZCIsIGltLT5vcmRpbmFsKTsKKwkgICAgICBmcHJpbnRmIChvdXQsICJcbiIpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIGZwcmludGYgKG91dCwgXygiOyBubyBjb250ZW50cyBhdmFpbGFibGVcbiIpKTsKKworICBpZiAoZmNsb3NlIChvdXQpID09IEVPRikKKyAgICB7CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZWluZm8gKF8oIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIiksIHBlX291dF9kZWZfZmlsZW5hbWUpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgR2VuZXJhdGUgdGhlIGltcG9ydCBsaWJyYXJ5CisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhc3ltYm9sICoqc3ltdGFiOworc3RhdGljIGludCBzeW1wdHI7CitzdGF0aWMgaW50IHRtcF9zZXE7CitzdGF0aWMgY29uc3QgY2hhciAqZGxsX2ZpbGVuYW1lOworc3RhdGljIGNoYXIgKmRsbF9zeW1uYW1lOworCisjZGVmaW5lIFVORFNFQyAoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbgorCitzdGF0aWMgYXNlY3Rpb24gKgorcXVpY2tfc2VjdGlvbihhYmZkLCBuYW1lLCBmbGFncywgYWxpZ24pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgaW50IGZsYWdzOworICAgICBpbnQgYWxpZ247Cit7CisgIGFzZWN0aW9uICpzZWM7CisgIGFzeW1ib2wgKnN5bTsKKworICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpOworICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MKKwkJCQkgIHwgU0VDX0FMTE9DCisJCQkJICB8IFNFQ19MT0FECisJCQkJICB8IFNFQ19LRUVQCisJCQkgKTsKKyAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCBhbGlnbik7CisgIC8qIHJlbWVtYmVyIHRvIHVuZG8gdGhpcyBiZWZvcmUgdHJ5aW5nIHRvIGxpbmsgaW50ZXJuYWxseSEgKi8KKyAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKKworICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOworICBzeW10YWJbc3ltcHRyKytdID0gc3ltOworICBzeW0tPm5hbWUgPSBzZWMtPm5hbWU7CisgIHN5bS0+c2VjdGlvbiA9IHNlYzsKKyAgc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKKyAgc3ltLT52YWx1ZSA9IDA7CisKKyAgcmV0dXJuIHNlYzsKK30KKworc3RhdGljIHZvaWQKK3F1aWNrX3N5bWJvbCAoYWJmZCwgbjEsIG4yLCBuMywgc2VjLCBmbGFncywgYWRkcikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpuMTsKKyAgICAgY2hhciAqbjI7CisgICAgIGNoYXIgKm4zOworICAgICBhc2VjdGlvbiAqc2VjOworICAgICBpbnQgZmxhZ3M7CisgICAgIGludCBhZGRyOworeworICBhc3ltYm9sICpzeW07CisgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG4xKSArIHN0cmxlbiAobjIpICsgc3RybGVuIChuMykgKyAxKTsKKyAgc3RyY3B5IChuYW1lLCBuMSk7CisgIHN0cmNhdCAobmFtZSwgbjIpOworICBzdHJjYXQgKG5hbWUsIG4zKTsKKyAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKKyAgc3ltLT5uYW1lID0gbmFtZTsKKyAgc3ltLT5zZWN0aW9uID0gc2VjOworICBzeW0tPmZsYWdzID0gZmxhZ3M7CisgIHN5bS0+dmFsdWUgPSBhZGRyOworICBzeW10YWJbc3ltcHRyKytdID0gc3ltOworfQorCitzdGF0aWMgYXJlbGVudCAqcmVsdGFiID0gMDsKK3N0YXRpYyBpbnQgcmVsY291bnQgPSAwLCByZWxzaXplID0gMDsKKworc3RhdGljIHZvaWQKK3F1aWNrX3JlbG9jIChhYmZkLCBhZGRyZXNzLCB3aGljaF9ob3d0bywgc3ltaWR4KQorICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBhZGRyZXNzOworICAgICBpbnQgd2hpY2hfaG93dG87CisgICAgIGludCBzeW1pZHg7Cit7CisgIGlmIChyZWxjb3VudCA+PSAocmVsc2l6ZS0xKSkKKyAgICB7CisgICAgICByZWxzaXplICs9IDEwOworICAgICAgaWYgKHJlbHRhYikKKwlyZWx0YWIgPSAoYXJlbGVudCAqKSB4cmVhbGxvYyAocmVsdGFiLCByZWxzaXplICogc2l6ZW9mIChhcmVsZW50KSk7CisgICAgICBlbHNlCisJcmVsdGFiID0gKGFyZWxlbnQgKikgeG1hbGxvYyAocmVsc2l6ZSAqIHNpemVvZiAoYXJlbGVudCkpOworICAgIH0KKyAgcmVsdGFiW3JlbGNvdW50XS5hZGRyZXNzID0gYWRkcmVzczsKKyAgcmVsdGFiW3JlbGNvdW50XS5hZGRlbmQgPSAwOworICByZWx0YWJbcmVsY291bnRdLmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCB3aGljaF9ob3d0byk7CisgIHJlbHRhYltyZWxjb3VudF0uc3ltX3B0cl9wdHIgPSBzeW10YWIgKyBzeW1pZHg7CisgIHJlbGNvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCitzYXZlX3JlbG9jcyAoYXNlY3Rpb24gKnNlYykKK3sKKyAgaW50IGk7CisgIHNlYy0+cmVsb2NhdGlvbiA9IHJlbHRhYjsKKyAgc2VjLT5yZWxvY19jb3VudCA9IHJlbGNvdW50OworICBzZWMtPm9yZWxvY2F0aW9uID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChyZWxjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7CisgIGZvciAoaT0wOyBpPHJlbGNvdW50OyBpKyspCisgICAgc2VjLT5vcmVsb2NhdGlvbltpXSA9IHNlYy0+cmVsb2NhdGlvbiArIGk7CisgIHNlYy0+b3JlbG9jYXRpb25bcmVsY291bnRdID0gMDsKKyAgc2VjLT5mbGFncyB8PSBTRUNfUkVMT0M7CisgIHJlbHRhYiA9IDA7CisgIHJlbGNvdW50ID0gcmVsc2l6ZSA9IDA7Cit9CisKKy8qCisgKgkuc2VjdGlvbgkuaWRhdGEkMgorICoJLmdsb2JhbAkJX19oZWFkX215X2RsbAorICogX19oZWFkX215X2RsbDoKKyAqCS5ydmEJCWhuYW1lCisgKgkubG9uZwkJMAorICoJLmxvbmcJCTAKKyAqCS5ydmEJCV9fbXlfZGxsX2luYW1lCisgKgkucnZhCQlmdGh1bmsKKyAqCisgKgkuc2VjdGlvbgkuaWRhdGEkNQorICoJLmxvbmcJCTAKKyAqIGZ0aHVuazoKKyAqCisgKgkuc2VjdGlvbgkuaWRhdGEkNAorICoJLmxvbmcJCTAKKyAqIGhuYW1lOgorICovCisKK3N0YXRpYyBiZmQgKgorbWFrZV9oZWFkIChwYXJlbnQpCisgICAgIGJmZCAqcGFyZW50OworeworICBhc2VjdGlvbiAqaWQyLCAqaWQ1LCAqaWQ0OworICB1bnNpZ25lZCBjaGFyICpkMiwgKmQ1LCAqZDQ7CisgIGNoYXIgKm9uYW1lOworICBiZmQgKmFiZmQ7CisKKyAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7CisgIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOworICB0bXBfc2VxKys7CisKKyAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOworICBiZmRfZmluZF90YXJnZXQgKCJwZS1pMzg2IiwgYWJmZCk7CisgIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKKworICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7CisgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKTsKKworICBzeW1wdHIgPSAwOworICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoNiAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgIGlkMiA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkMiIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOworICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKKyAgaWQ0ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ0IiwgU0VDX0hBU19DT05URU5UUywgMik7CisgIHF1aWNrX3N5bWJvbCAoYWJmZCwgIl9faGVhZF8iLCBkbGxfc3ltbmFtZSwgIiIsIGlkMiwgQlNGX0dMT0JBTCwgMCk7CisgIHF1aWNrX3N5bWJvbCAoYWJmZCwgIl8iLCBkbGxfc3ltbmFtZSwgIl9pbmFtZSIsIFVORFNFQywgQlNGX0dMT0JBTCwgMCk7CisKKyAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkMiwgMjApOworICBkMiA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDIwKTsKKyAgaWQyLT5jb250ZW50cyA9IGQyOworICBtZW1zZXQgKGQyLCAwLCAyMCk7CisgIGQyWzBdID0gZDJbMTZdID0gNDsgLyogcmVsb2MgYWRkZW5kICovCisgIHF1aWNrX3JlbG9jIChhYmZkLCAgMCwgQkZEX1JFTE9DX1JWQSwgMik7CisgIHF1aWNrX3JlbG9jIChhYmZkLCAxMiwgQkZEX1JFTE9DX1JWQSwgNCk7CisgIHF1aWNrX3JlbG9jIChhYmZkLCAxNiwgQkZEX1JFTE9DX1JWQSwgMSk7CisgIHNhdmVfcmVsb2NzIChpZDIpOworCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOworICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOworICBpZDUtPmNvbnRlbnRzID0gZDU7CisgIG1lbXNldCAoZDUsIDAsIDQpOworCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOworICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOworICBpZDQtPmNvbnRlbnRzID0gZDQ7CisgIG1lbXNldCAoZDQsIDAsIDQpOworCisgIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7CisKKyAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDIsIGQyLCAwLCAyMCk7CisgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ1LCBkNSwgMCwgNCk7CisgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ0LCBkNCwgMCwgNCk7CisgIAorICBiZmRfbWFrZV9yZWFkYWJsZSAoYWJmZCk7CisgIHJldHVybiBhYmZkOworfQorCisvKgorICoJLnNlY3Rpb24JLmlkYXRhJDQKKyAqCS5sb25nCQkwCisgKgkuc2VjdGlvbgkuaWRhdGEkNQorICoJLmxvbmcJCTAKKyAqCS5zZWN0aW9uCWlkYXRhJDcKKyAqCS5nbG9iYWwJCV9fbXlfZGxsX2luYW1lCisgKl9fbXlfZGxsX2luYW1lOgorICoJLmFzY2l6CQkibXkuZGxsIgorICovCisKK3N0YXRpYyBiZmQgKgorbWFrZV90YWlsIChwYXJlbnQpCisgICAgIGJmZCAqcGFyZW50OworeworICBhc2VjdGlvbiAqaWQ0LCAqaWQ1LCAqaWQ3OworICB1bnNpZ25lZCBjaGFyICpkNCwgKmQ1LCAqZDc7CisgIGludCBsZW47CisgIGNoYXIgKm9uYW1lOworICBiZmQgKmFiZmQ7CisKKyAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7CisgIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOworICB0bXBfc2VxKys7CisKKyAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOworICBiZmRfZmluZF90YXJnZXQgKCJwZS1pMzg2IiwgYWJmZCk7CisgIGJmZF9tYWtlX3dyaXRhYmxlIChhYmZkKTsKKworICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7CisgIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKTsKKworICBzeW1wdHIgPSAwOworICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoNSAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOworICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKKyAgaWQ3ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgMik7CisgIHF1aWNrX3N5bWJvbCAoYWJmZCwgIl8iLCBkbGxfc3ltbmFtZSwgIl9pbmFtZSIsIGlkNywgQlNGX0dMT0JBTCwgMCk7CisKKyAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7CisgIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7CisgIGlkNC0+Y29udGVudHMgPSBkNDsKKyAgbWVtc2V0IChkNCwgMCwgNCk7CisKKyAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7CisgIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7CisgIGlkNS0+Y29udGVudHMgPSBkNTsKKyAgbWVtc2V0IChkNSwgMCwgNCk7CisKKyAgbGVuID0gc3RybGVuIChkbGxfZmlsZW5hbWUpKzE7CisgIGlmIChsZW4gJiAxKQorICAgIGxlbiArKzsKKyAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNywgbGVuKTsKKyAgZDcgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChsZW4pOworICBpZDctPmNvbnRlbnRzID0gZDc7CisgIHN0cmNweSAoZDcsIGRsbF9maWxlbmFtZSk7CisKKyAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKKworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNywgZDcsIDAsIGxlbik7CisKKyAgYmZkX21ha2VfcmVhZGFibGUgKGFiZmQpOworICByZXR1cm4gYWJmZDsKK30KKworLyoKKyAqCS50ZXh0CisgKgkuZ2xvYmFsCQlfZnVuY3Rpb24KKyAqCS5nbG9iYWwJCV9fX2ltcF9mdW5jdGlvbgorICoJLmdsb2JhbAkJX19pbXBfX2Z1bmN0aW9uCisgKl9mdW5jdGlvbjoKKyAqCWptcAkJKl9faW1wX19mdW5jdGlvbjoKKyAqCisgKgkuc2VjdGlvbglpZGF0YSQ3CisgKgkubG9uZwkJX19oZWFkX215X2RsbAorICoKKyAqCS5zZWN0aW9uCS5pZGF0YSQ1CisgKl9fX2ltcF9mdW5jdGlvbjoKKyAqX19pbXBfX2Z1bmN0aW9uOgorICppYXQ/CisgKgkuc2VjdGlvbgkuaWRhdGEkNAorICppYXQ/CisgKgkuc2VjdGlvbgkuaWRhdGEkNgorICpJRDxvcmRpbmFsPjoKKyAqCS5zaG9ydAkJPGhpbnQ+CisgKgkuYXNjaXoJCSJmdW5jdGlvbiIgeGxhdGU/IChhZGQgdW5kZXJzY29yZSwga2lsbCBhdCkKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBqbXBfaXg4Nl9ieXRlc1tdID0geworICAweGZmLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkwCit9OworCisKK3N0YXRpYyBiZmQgKgorbWFrZV9vbmUgKGV4cCwgcGFyZW50KQorICAgICBkZWZfZmlsZV9leHBvcnQgKmV4cDsKKyAgICAgYmZkICpwYXJlbnQ7Cit7CisgIGFzZWN0aW9uICp0eCwgKmlkNywgKmlkNSwgKmlkNCwgKmlkNjsKKyAgdW5zaWduZWQgY2hhciAqdGQsICpkNywgKmQ1LCAqZDQsICpkNjsKKyAgaW50IGxlbjsKKyAgY2hhciAqb25hbWU7CisgIGJmZCAqYWJmZDsKKworICBvbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKKyAgc3ByaW50ZiAob25hbWUsICJkJTA2ZC5vIiwgdG1wX3NlcSk7CisgIHRtcF9zZXErKzsKKworICBhYmZkID0gYmZkX2NyZWF0ZSAob25hbWUsIHBhcmVudCk7CisgIGJmZF9maW5kX3RhcmdldCAoInBlLWkzODYiLCBhYmZkKTsKKyAgYmZkX21ha2Vfd3JpdGFibGUgKGFiZmQpOworCisgIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKKyAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2kzODYsIDApOworCisgIHN5bXB0ciA9IDA7CisgIHN5bXRhYiA9IChhc3ltYm9sICoqKSB4bWFsbG9jICgxMCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7CisgIHR4ICA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIudGV4dCIsICAgIFNFQ19DT0RFfFNFQ19IQVNfQ09OVEVOVFMsIDIpOworICBpZDcgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDciLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKKyAgaWQ1ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ1IiwgU0VDX0hBU19DT05URU5UUywgMik7CisgIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOworICBpZDYgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDYiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKKyAgcXVpY2tfc3ltYm9sIChhYmZkLCAiXyIsIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIHR4LCBCU0ZfR0xPQkFMLCAwKTsKKyAgcXVpY2tfc3ltYm9sIChhYmZkLCAiX19oZWFkXyIsIGRsbF9zeW1uYW1lLCAiIiwgVU5EU0VDLCBCU0ZfR0xPQkFMLCAwKTsKKyAgcXVpY2tfc3ltYm9sIChhYmZkLCAiX19faW1wXyIsIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIGlkNSwgQlNGX0dMT0JBTCwgMCk7CisgIHF1aWNrX3N5bWJvbCAoYWJmZCwgIl9faW1wX18iLCBleHAtPmludGVybmFsX25hbWUsICIiLCBpZDUsIEJTRl9HTE9CQUwsIDApOworCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCB0eCwgOCk7CisgIHRkID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoOCk7CisgIHR4LT5jb250ZW50cyA9IHRkOworICBtZW1jcHkgKHRkLCBqbXBfaXg4Nl9ieXRlcywgOCk7CisgIHF1aWNrX3JlbG9jIChhYmZkLCAyLCBCRkRfUkVMT0NfMzIsIDIpOworICBzYXZlX3JlbG9jcyAodHgpOworCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDcsIDQpOworICBkNyA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOworICBpZDctPmNvbnRlbnRzID0gZDc7CisgIG1lbXNldCAoZDcsIDAsIDQpOworICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNik7CisgIHNhdmVfcmVsb2NzIChpZDcpOworCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDUsIDQpOworICBkNSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOworICBpZDUtPmNvbnRlbnRzID0gZDU7CisgIG1lbXNldCAoZDUsIDAsIDQpOworICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKKyAgICB7CisgICAgICBkNVswXSA9IGV4cC0+b3JkaW5hbDsKKyAgICAgIGQ1WzFdID0gZXhwLT5vcmRpbmFsID4+IDg7CisgICAgICBkNVszXSA9IDB4ODA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDQpOworICAgICAgc2F2ZV9yZWxvY3MgKGlkNSk7CisgICAgfQorCisgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDQsIDQpOworICBkNCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKDQpOworICBpZDQtPmNvbnRlbnRzID0gZDQ7CisgIG1lbXNldCAoZDQsIDAsIDQpOworICBpZiAoZXhwLT5mbGFnX25vbmFtZSkKKyAgICB7CisgICAgICBkNVswXSA9IGV4cC0+b3JkaW5hbDsKKyAgICAgIGQ1WzFdID0gZXhwLT5vcmRpbmFsID4+IDg7CisgICAgICBkNVszXSA9IDB4ODA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDAsIEJGRF9SRUxPQ19SVkEsIDQpOworICAgICAgc2F2ZV9yZWxvY3MgKGlkNCk7CisgICAgfQorCisgIGlmIChleHAtPmZsYWdfbm9uYW1lKQorICAgIHsKKyAgICAgIGxlbiA9IDA7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ2LCAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBzdHJsZW4gKGV4cC0+bmFtZSkgKyAzOworICAgICAgaWYgKGxlbiAmIDEpCisJbGVuKys7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ2LCBsZW4pOworICAgICAgZDYgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChsZW4pOworICAgICAgaWQ2LT5jb250ZW50cyA9IGQ2OworICAgICAgbWVtc2V0IChkNiwgMCwgbGVuKTsKKyAgICAgIGQ2WzBdID0gZXhwLT5oaW50ICYgMHhmZjsKKyAgICAgIGQ2WzFdID0gZXhwLT5oaW50ID4+IDg7CisgICAgICBzdHJjcHkgKGQ2KzIsIGV4cC0+bmFtZSk7CisgICAgfQorCisgIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzeW10YWIsIHN5bXB0cik7CisKKyAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCB0eCwgdGQsIDAsIDQpOworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNywgZDcsIDAsIDQpOworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOworICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOworICBpZiAoIWV4cC0+ZmxhZ19ub25hbWUpCisgICAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDYsIGQ2LCAwLCBsZW4pOworCisgIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKKyAgcmV0dXJuIGFiZmQ7Cit9CisKK3ZvaWQKK3BlX2RsbF9nZW5lcmF0ZV9pbXBsaWIgKGRlZiwgaW1wZmlsZW5hbWUpCisgICAgIGRlZl9maWxlICpkZWY7CisgICAgIGNoYXIgKmltcGZpbGVuYW1lOworeworICBpbnQgaTsKKyAgYmZkICphcl9oZWFkOworICBiZmQgKmFyX3RhaWw7CisgIGJmZCAqb3V0YXJjaDsKKyAgYmZkICpoZWFkID0gMDsKKworICBkbGxfZmlsZW5hbWUgPSBkZWYtPm5hbWU7CisgIGlmIChkbGxfZmlsZW5hbWUgPT0gMCkKKyAgICB7CisgICAgICBkbGxfZmlsZW5hbWUgPSBkbGxfbmFtZTsKKyAgICAgIGZvciAoaT0wOyBpbXBmaWxlbmFtZVtpXTsgaSsrKQorCWlmIChpbXBmaWxlbmFtZVtpXSA9PSAnLycgfHwgaW1wZmlsZW5hbWVbaV0gPT0gJ1xcJykKKwkgIGRsbF9maWxlbmFtZSA9IGltcGZpbGVuYW1lKzE7CisgICAgfQorICBkbGxfc3ltbmFtZSA9IHhzdHJkdXAgKGRsbF9maWxlbmFtZSk7CisgIGZvciAoaT0wOyBkbGxfc3ltbmFtZVtpXTsgaSsrKQorICAgIGlmICghaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGRsbF9zeW1uYW1lW2ldKSkKKyAgICAgIGRsbF9zeW1uYW1lW2ldID0gJ18nOworCisgIHVubGluayAoaW1wZmlsZW5hbWUpOworCisgIG91dGFyY2ggPSBiZmRfb3BlbncgKGltcGZpbGVuYW1lLCAwKTsKKworICBpZiAoIW91dGFyY2gpCisgICAgeworICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGVpbmZvIChfKCIlWENhbid0IG9wZW4gLmxpYiBmaWxlOiAlc1xuIiksIGltcGZpbGVuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgZWluZm8gKF8oIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIpLCBpbXBmaWxlbmFtZSk7CisgIAorICBiZmRfc2V0X2Zvcm1hdCAob3V0YXJjaCwgYmZkX2FyY2hpdmUpOworICBvdXRhcmNoLT5oYXNfYXJtYXAgPSAxOworCisgIC8qIFdvcmsgb3V0IGEgcmVhc29uYWJsZSBzaXplIG9mIHRoaW5ncyB0byBwdXQgb250byBvbmUgbGluZS4gKi8KKworICBhcl9oZWFkID0gbWFrZV9oZWFkIChvdXRhcmNoKTsKKyAgYXJfdGFpbCA9IG1ha2VfdGFpbCAob3V0YXJjaCk7CisKKyAgaWYgKGFyX2hlYWQgPT0gTlVMTCB8fCBhcl90YWlsID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGk8ZGVmLT5udW1fZXhwb3J0czsgaSsrKQorICAgIHsKKyAgICAgIC8qIFRoZSBpbXBvcnQgbGlicmFyeSBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIGludGVybmFsIG5hbWUgKi8KKyAgICAgIGNoYXIgKmludGVybmFsID0gZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWU7CisgICAgICBiZmQgKm47CisgICAgICBkZWYtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSA9IGRlZi0+ZXhwb3J0c1tpXS5uYW1lOworICAgICAgbiA9IG1ha2Vfb25lIChkZWYtPmV4cG9ydHMraSwgb3V0YXJjaCk7CisgICAgICBuLT5uZXh0ID0gaGVhZDsKKyAgICAgIGhlYWQgPSBuOworICAgICAgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUgPSBpbnRlcm5hbDsKKyAgICB9CisKKyAgLyogTm93IHN0aWNrIHRoZW0gYWxsIGludG8gdGhlIGFyY2hpdmUgKi8KKworICBhcl9oZWFkLT5uZXh0ID0gaGVhZDsKKyAgYXJfdGFpbC0+bmV4dCA9IGFyX2hlYWQ7CisgIGhlYWQgPSBhcl90YWlsOworCisgIGlmICghIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRhcmNoLCBoZWFkKSkKKyAgICBlaW5mbyAoIiVYYmZkX3NldF9hcmNoaXZlX2hlYWQ6ICVzXG4iLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgIAorICBpZiAoISBiZmRfY2xvc2UgKG91dGFyY2gpKQorICAgIGVpbmZvICgiJVhiZmRfY2xvc2UgJXM6ICVzXG4iLCBpbXBmaWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisgIHdoaWxlIChoZWFkICE9IE5VTEwpCisgICAgeworICAgICAgYmZkICpuID0gaGVhZC0+bmV4dDsKKyAgICAgIGJmZF9jbG9zZSAoaGVhZCk7CisgICAgICBoZWFkID0gbjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfYmZkX3RvX2xpbmsgKGFiZmQsIG5hbWUsIGxpbmtfaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworeworICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmYWtlX2ZpbGU7CisgIGZha2VfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKG5hbWUsCisJCQkJICAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKKwkJCQkgICBOVUxMKTsKKyAgZmFrZV9maWxlLT50aGVfYmZkID0gYWJmZDsKKyAgbGRsYW5nX2FkZF9maWxlIChmYWtlX2ZpbGUpOworICBpZiAoIWJmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBsaW5rX2luZm8pKQorICAgIGVpbmZvICgiJVhhZGRzeW0gJXM6ICVzXG4iLCBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Cit9CisKK3ZvaWQKK3BlX3Byb2Nlc3NfaW1wb3J0X2RlZnMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbykKKyAgICAgYmZkICpvdXRwdXRfYmZkOworICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOworeworICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZTsKKworICBpZiAoIXBlX2RlZl9maWxlKQorICAgIHJldHVybjsKKworICBmb3IgKG1vZHVsZSA9IHBlX2RlZl9maWxlLT5tb2R1bGVzOyBtb2R1bGU7IG1vZHVsZSA9IG1vZHVsZS0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgaSwgZG9fdGhpc19kbGw7CisKKyAgICAgIGRsbF9maWxlbmFtZSA9IG1vZHVsZS0+bmFtZTsKKyAgICAgIGRsbF9zeW1uYW1lID0geHN0cmR1cCAobW9kdWxlLT5uYW1lKTsKKyAgICAgIGZvciAoaT0wOyBkbGxfc3ltbmFtZVtpXTsgaSsrKQorCWlmICghaXNhbG51bSAoZGxsX3N5bW5hbWVbaV0pKQorCSAgZGxsX3N5bW5hbWVbaV0gPSAnXyc7CisKKyAgICAgIGRvX3RoaXNfZGxsID0gMDsKKworICAgICAgZm9yIChpPTA7IGk8cGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzOyBpKyspCisJaWYgKHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm1vZHVsZSA9PSBtb2R1bGUpCisJICB7CisJICAgIGRlZl9maWxlX2V4cG9ydCBleHA7CisJICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOworCisJICAgIC8qIHNlZSBpZiB3ZSBuZWVkIHRoaXMgaW1wb3J0ICovCisJICAgIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUpICsgMik7CisJICAgIHNwcmludGYgKG5hbWUsICJfJXMiLCBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKKwkgICAgYmxoZSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsIG5hbWUsCisJCQkJCSBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwkgICAgZnJlZSAobmFtZSk7CisJICAgIGlmIChibGhlICYmIGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCisJICAgICAgeworCQliZmQgKm9uZTsKKwkJLyogd2UgZG8gKi8KKwkJaWYgKCFkb190aGlzX2RsbCkKKwkJICB7CisJCSAgICBiZmQgKmFyX2hlYWQgPSBtYWtlX2hlYWQgKG91dHB1dF9iZmQpOworCQkgICAgYWRkX2JmZF90b19saW5rIChhcl9oZWFkLCBhcl9oZWFkLT5maWxlbmFtZSwgbGlua19pbmZvKTsKKwkJICAgIGRvX3RoaXNfZGxsID0gMTsKKwkJICB9CisJCWV4cC5pbnRlcm5hbF9uYW1lID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZTsKKwkJZXhwLm5hbWUgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5uYW1lOworCQlleHAub3JkaW5hbCA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm9yZGluYWw7CisJCWV4cC5oaW50ID0gZXhwLm9yZGluYWwgPj0gMCA/IGV4cC5vcmRpbmFsIDogMDsKKwkJZXhwLmZsYWdfcHJpdmF0ZSA9IDA7CisJCWV4cC5mbGFnX2NvbnN0YW50ID0gMDsKKwkJZXhwLmZsYWdfZGF0YSA9IDA7CisJCWV4cC5mbGFnX25vbmFtZSA9IGV4cC5uYW1lID8gMCA6IDE7CisJCW9uZSA9IG1ha2Vfb25lICgmZXhwLCBvdXRwdXRfYmZkKTsKKwkJYWRkX2JmZF90b19saW5rIChvbmUsIG9uZS0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7CisJICAgICAgfQorCSAgfQorICAgICAgaWYgKGRvX3RoaXNfZGxsKQorCXsKKwkgIGJmZCAqYXJfdGFpbCA9IG1ha2VfdGFpbCAob3V0cHV0X2JmZCk7CisJICBhZGRfYmZkX3RvX2xpbmsgKGFyX3RhaWwsIGFyX3RhaWwtPmZpbGVuYW1lLCBsaW5rX2luZm8pOworCX0KKworICAgICAgZnJlZSAoZGxsX3N5bW5hbWUpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgV2Ugd2VyZSBoYW5kZWQgYSAqLkRMTCBmaWxlLiAgUGFyc2UgaXQgYW5kIHR1cm4gaXQgaW50byBhIHNldCBvZgorIElNUE9SVFMgZGlyZWN0aXZlcyBpbiB0aGUgZGVmIGZpbGUuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMKKyBoYW5kbGVkLCBmYWxzZSBpZiBub3QuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3BlX2dldDE2IChhYmZkLCB3aGVyZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgd2hlcmU7Cit7CisgIHVuc2lnbmVkIGNoYXIgYlsyXTsKKyAgYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCk7CisgIGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKTsKKyAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3BlX2dldDMyIChhYmZkLCB3aGVyZSkKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgd2hlcmU7Cit7CisgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyAgYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCk7CisgIGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKTsKKyAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKK30KKworI2lmIDAgLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitwZV9hczE2IChwdHIpCisgICAgIHZvaWQgKnB0cjsKK3sKKyAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKKyAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgaW50CitwZV9hczMyIChwdHIpCisgICAgIHZvaWQgKnB0cjsKK3sKKyAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKKyAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKK30KKworYm9vbGVhbgorcGVfaW1wbGllZF9pbXBvcnRfZGxsIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGJmZCAqZGxsOworICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOworICB1bnNpZ25lZCBsb25nIGV4cG9ydF9ydmEsIGV4cG9ydF9zaXplLCBuc2VjdGlvbnMsIHNlY3B0ciwgZXhwcHRyOworICB1bnNpZ25lZCBjaGFyICpleHBkYXRhLCAqZXJ2YTsKKyAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG9yZGluYWxzLCBuZXhwLCBvcmRiYXNlOworICBjaGFyICpkbGxfbmFtZTsKKworICAvKiBObywgSSBjYW4ndCB1c2UgYmZkIGhlcmUuICBrZXJuZWwzMi5kbGwgcHV0cyBpdHMgZXhwb3J0IHRhYmxlIGluCisgICAgIHRoZSBtaWRkbGUgb2YgdGhlIC5yZGF0YSBzZWN0aW9uLiAqLworCisgIGRsbCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsICJwZWktaTM4NiIpOworICBpZiAoIWRsbCkKKyAgICB7CisgICAgICBlaW5mbyAoIiVYb3BlbiAlczogJXNcbiIsIGZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAvKiBQRUkgZGxscyBzZWVtIHRvIGJlIGJmZF9vYmplY3RzICovCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoZGxsLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBlaW5mbyAoIiVYJXM6IHRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBETExcbiIsIGZpbGVuYW1lKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZGxsX25hbWUgPSBmaWxlbmFtZTsKKyAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCisgICAgaWYgKGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnIHx8IGZpbGVuYW1lW2ldID09ICc6JykKKyAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWUgKyBpICsgMTsKKworICBwZV9oZWFkZXJfb2Zmc2V0ID0gcGVfZ2V0MzIgKGRsbCwgMHgzYyk7CisgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOworICBudW1fZW50cmllcyA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyA5Mik7CisgIGlmIChudW1fZW50cmllcyA8IDEpIC8qIG5vIGV4cG9ydHMgKi8KKyAgICByZXR1cm4gZmFsc2U7CisgIGV4cG9ydF9ydmEgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTYpOworICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOworICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIpOworICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCisJICAgIHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMTYpKTsKKyAgZXhwcHRyID0gMDsKKyAgZm9yIChpPTA7IGk8bnNlY3Rpb25zOyBpKyspCisgICAgeworICAgICAgY2hhciBzbmFtZVs4XTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOworICAgICAgdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7CisgICAgICB1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOworICAgICAgYmZkX3NlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7CisgICAgICBiZmRfcmVhZChzbmFtZSwgMSwgOCwgZGxsKTsKKyAgICAgIGlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKKwl7CisJICBleHBwdHIgPSBmcHRyICsgKGV4cG9ydF9ydmEgLSB2YWRkcik7CisJICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKKwkgICAgZXhwb3J0X3NpemUgPSB2c2l6ZSAtIChleHBvcnRfcnZhIC0gdmFkZHIpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoZXhwb3J0X3NpemUpOworICBiZmRfc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKKyAgYmZkX3JlYWQgKGV4cGRhdGEsIDEsIGV4cG9ydF9zaXplLCBkbGwpOworICBlcnZhID0gZXhwZGF0YSAtIGV4cG9ydF9ydmE7CisKKyAgaWYgKHBlX2RlZl9maWxlID09IDApCisgICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSgpOworCisgIG5leHAgPSBwZV9hczMyIChleHBkYXRhKzI0KTsKKyAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7CisgIG9yZGluYWxzID0gcGVfYXMzMiAoZXhwZGF0YSszNik7CisgIG9yZGJhc2UgPSBwZV9hczMyIChleHBkYXRhKzE2KTsKKyAgZm9yIChpPTA7IGk8bmV4cDsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbmFtZV9ydmEgPSBwZV9hczMyIChlcnZhK25hbWVfcnZhcytpKjQpOworICAgICAgZGVmX2ZpbGVfaW1wb3J0ICppbXA7CisgICAgICBpbXAgPSBkZWZfZmlsZV9hZGRfaW1wb3J0IChwZV9kZWZfZmlsZSwgZXJ2YStuYW1lX3J2YSwgZGxsX25hbWUsCisJCQkJIGksIDApOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgVGhlc2UgYXJlIHRoZSBtYWluIGZ1bmN0aW9ucywgY2FsbGVkIGZyb20gdGhlIGVtdWxhdGlvbi4gIFRoZSBmaXJzdAorIGlzIGNhbGxlZCBhZnRlciB0aGUgYmZkcyBhcmUgcmVhZCwgc28gd2UgY2FuIGd1ZXNzIGF0IGhvdyBtdWNoIHNwYWNlCisgd2UgbmVlZC4gIFRoZSBzZWNvbmQgaXMgY2FsbGVkIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgcGxhY2VkLCBzbyB3ZQorIGNhbiBwdXQgdGhlIHJpZ2h0IHZhbHVlcyBpbiBwbGFjZS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorcGVfZGxsX2J1aWxkX3NlY3Rpb25zIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBwcm9jZXNzX2RlZl9maWxlIChhYmZkLCBpbmZvKTsKKworICBnZW5lcmF0ZV9lZGF0YSAoYWJmZCwgaW5mbyk7CisgIGJ1aWxkX2ZpbGxlcl9iZmQgKCk7Cit9CisKK3ZvaWQKK3BlX2RsbF9maWxsX3NlY3Rpb25zIChhYmZkLCBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOworeworICBpbWFnZV9iYXNlID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7CisKKyAgZ2VuZXJhdGVfcmVsb2MgKGFiZmQsIGluZm8pOworICBpZiAocmVsb2Nfc3ogPiAwKQorICAgIHsKKyAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCByZWxvY19zLCByZWxvY19zeik7CisKKyAgICAgIC8qIFJlc2l6ZSB0aGUgc2VjdGlvbnMuICAqLworICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCwgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAmc3RhdF9wdHItPmhlYWQsIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7CisKKyAgICAgIC8qIFJlZG8gc3BlY2lhbCBzdHVmZi4gICovCisgICAgICBsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbiAoKTsKKworICAgICAgLyogRG8gdGhlIGFzc2lnbm1lbnRzIGFnYWluLiAgKi8KKyAgICAgIGxhbmdfZG9fYXNzaWdubWVudHMgKHN0YXRfcHRyLT5oZWFkLAorCQkJICAgYWJzX291dHB1dF9zZWN0aW9uLAorCQkJICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOworICAgIH0KKworICBmaWxsX2VkYXRhIChhYmZkLCBpbmZvKTsKKworICBwZV9kYXRhIChhYmZkKS0+ZGxsID0gMTsKKworICBlZGF0YV9zLT5jb250ZW50cyA9IGVkYXRhX2Q7CisgIHJlbG9jX3MtPmNvbnRlbnRzID0gcmVsb2NfZDsKK30KZGlmZiAtLWdpdCBhL2xkL3BvL01ha2UtaW4gYi9sZC9wby9NYWtlLWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTEwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9wby9NYWtlLWluCkBAIC0wLDAgKzEsMjUxIEBACisjIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCitQQUNLQUdFID0gQFBBQ0tBR0VACitWRVJTSU9OID0gQFZFUlNJT05ACisKK1NIRUxMID0gL2Jpbi9zaAorQFNFVF9NQUtFQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitkYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KK3N1YmRpciA9IHBvCisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACisKK0NDID0gQENDQAorR0VOQ0FUID0gQEdFTkNBVEAKK0dNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACitNU0dGTVQgPSBATVNHRk1UQAorWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAorTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKKworREVGUyA9IEBERUZTQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorCitJTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKKworQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKKworU09VUkNFUyA9IGNhdC1pZC10YmwuYworUE9GSUxFUyA9IEBQT0ZJTEVTQAorR01PRklMRVMgPSBAR01PRklMRVNACitESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAorc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQorCitQT1RGSUxFUyA9IFwKKworQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAorCisuYy5vOgorCSQoQ09NUElMRSkgJDwKKworLnBvLnBveDoKKwkkKE1BS0UpICQoUEFDS0FHRSkucG90CisJJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAorCisucG8ubW86CisJJChNU0dGTVQpIC1vICRAICQ8CisKKy5wby5nbW86CisJZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAorCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8CisKKy5wby5jYXQ6CisJc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKKwkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKKworCithbGw6IGFsbC1AVVNFX05MU0AKKworYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAorYWxsLW5vOgorCiskKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCisJJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAorCSAgLS1hZGQtY29tbWVudHMgLUMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKKwkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KKwlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKKwltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAorCiskKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6CiskKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAorCXJtIC1mIGNhdC1pZC10YmwudG1wCisJc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAorCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAorCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKKwkgIHJtIGNhdC1pZC10YmwudG1wOyBcCisJZWxzZSBcCisJICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCisJICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCisJICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCisJZmkKKwljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCisKKworaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQoraW5zdGFsbC1leGVjOgoraW5zdGFsbC1pbmZvOgoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACitpbnN0YWxsLWRhdGEtbm86IGFsbAoraW5zdGFsbC1kYXRhLXllczogYWxsCisJaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAorCWVsc2UgXAorCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKKwlmaQorCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAorCSAgY2FzZSAiJCRjYXQiIGluIFwKKwkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAorCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCisJICBlc2FjOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCisJICBlbHNlIFwKKwkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAorCSAgZWxzZSBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKKwkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAorCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKKwkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHRydWU7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZG9uZQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCisJICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCisJICBmaTsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCisJCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKworIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgoraW5zdGFsbGNoZWNrOgorCit1bmluc3RhbGw6CisJY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAorCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCisJICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKKwlkb25lCisJcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgorCitjaGVjazogYWxsCisKK2NhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKKworZHZpIGluZm8gdGFncyBUQUdTIElEOgorCittb3N0bHljbGVhbjoKKwlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCisJcm0gLWZyICoubworCitjbGVhbjogbW9zdGx5Y2xlYW4KKworZGlzdGNsZWFuOiBjbGVhbgorCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQorCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwlybSAtZiAkKEdNT0ZJTEVTKQorCitkaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCisJZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCisJZG9uZQorCit1cGRhdGUtcG86IE1ha2VmaWxlCisJJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAorCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAorCWNkICQoc3JjZGlyKTsgXAorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCisJICBlY2hvICIkJGxhbmc6IjsgXAorCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAorCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCisJICAgIHJtIC1mICQkbGFuZy5wbzsgXAorCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAorCSAgZmk7IFwKKwlkb25lCisKK1BPVEZJTEVTOiBQT1RGSUxFUy5pbgorCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCisJICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKKwkgIGVsc2UgXAorCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAorCSAgZmk7IFwKKwkgIHJtIC1mICRALXQgJEAgXAorCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCisJCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKKwkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAorCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCisJICAgICYmIG12ICRALXQgJEAgKQorCitQT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQorCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KKworTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUworCWNkIC4uIFwKKwkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAorCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9wby9QT1RGSUxFUy5pbiBiL2xkL3BvL1BPVEZJTEVTLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGE4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9wby9QT1RGSUxFUy5pbgpAQCAtMCwwICsxLDY0IEBACitkZWZmaWxlLmgKK2xkLmgKK2xkY3JlZi5jCitsZGN0b3IuYworbGRjdG9yLmgKK2xkZW11bC5jCitsZGVtdWwuaAorbGRleHAuYworbGRleHAuaAorbGRmaWxlLmMKK2xkZmlsZS5oCitsZGxhbmcuYworbGRsYW5nLmgKK2xkbGV4LmgKK2xkbWFpbi5jCitsZG1haW4uaAorbGRtaXNjLmMKK2xkbWlzYy5oCitsZHZlci5jCitsZHZlci5oCitsZHdyaXRlLmMKK2xkd3JpdGUuaAorbGV4c3VwLmMKK21wdy1lbGZtaXBzLmMKK21wdy1lcHBjbWFjLmMKK21wdy1lc2guYworbXB3LWlkdG1pcHMuYworbXJpLmMKK21yaS5oCitwZS1kbGwuYworc3lzZGVwLmgKK3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oCit0ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCit0ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKK3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYwordGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmMKK3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LmMKK3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKK3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYwordGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4Mi5jCit0ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKK3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYwordGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jCit0ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYwordGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKK3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS5jCit0ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYwordGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKK3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jCit0ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzIuYwordGVzdHN1aXRlL2xkLXNoL3NoMi5jCit0ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYwordGVzdHN1aXRlL2xkLXNoYXJlZC9zaDEuYwordGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYwordGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMKK3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCit0ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCmRpZmYgLS1naXQgYS9sZC9wby9sZC5wb3QgYi9sZC9wby9sZC5wb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhYWViMAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3BvL2xkLnBvdApAQCAtMCwwICsxLDEzNzIgQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTAyLTExIDIxOjAwKzAwMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgorCisjOiBlbXVsdGVtcGwvYXJtY29mZi5lbTo2NQorbXNnaWQgIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToxOTAKK21zZ2lkICIiCisiICAtLWJhc2VfZmlsZSA8YmFzZWZpbGU+ICAgICAgICAgICAgIEdlbmVyYXRlIGEgYmFzZSBmaWxlIGZvciByZWxvY2F0YWJsZSAiCisiRExMc1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToxOTEKK21zZ2lkICIiCisiICAtLWRsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBpbWFnZSBiYXNlIHRvIHRoZSBkZWZhdWx0IGZvciBETExzXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjE5MgorbXNnaWQgIiAgLS1maWxlLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICAgICBTZXQgZmlsZSBhbGlnbm1lbnRcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MTkzCittc2dpZCAiICAtLWhlYXAgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgIFNldCBpbml0aWFsIHNpemUgb2YgdGhlIGhlYXBcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MTk0Cittc2dpZCAiIgorIiAgLS1pbWFnZS1iYXNlIDxhZGRyZXNzPiAgICAgICAgICAgICBTZXQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZVxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToxOTUKK21zZ2lkICIiCisiICAtLW1ham9yLWltYWdlLXZlcnNpb24gPG51bWJlcj4gICAgIFNldCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToxOTYKK21zZ2lkICIgIC0tbWFqb3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgdmVyc2lvblxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToxOTcKK21zZ2lkICIiCisiICAtLW1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIDxudW1iZXI+IFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHN1YnN5c3RlbSAiCisidmVyc2lvblxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToxOTgKK21zZ2lkICIiCisiICAtLW1pbm9yLWltYWdlLXZlcnNpb24gPG51bWJlcj4gICAgIFNldCByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MTk5Cittc2dpZCAiICAtLW1pbm9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHJldmlzaW9uXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjIwMAorbXNnaWQgIiIKKyIgIC0tbWlub3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtICIKKyJyZXZpc2lvblxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToyMDEKK21zZ2lkICIgIC0tc2VjdGlvbi1hbGlnbm1lbnQgPHNpemU+ICAgICAgICAgU2V0IHNlY3Rpb24gYWxpZ25tZW50XG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjIwMgorbXNnaWQgIiAgLS1zdGFjayA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICBTZXQgc2l6ZSBvZiB0aGUgaW5pdGlhbCBzdGFja1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToyMDMKK21zZ2lkICIiCisiICAtLXN1YnN5c3RlbSA8bmFtZT5bOjx2ZXJzaW9uPl0gICAgIFNldCByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gWyYgdmVyc2lvbl1cbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MjA0Cittc2dpZCAiIgorIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgICAgICAgICAgICAgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjIwNgorbXNnaWQgIiIKKyIgIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgICAgICAgICAgICAgRXhwb3J0IHN5bWJvbHMgd2l0aCBhbmQgd2l0aG91dCBAbm5cbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MjA3Cittc2dpZCAiICAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgIERvbid0IGxpbmsgX3N5bSB0byBfc3ltQG5uXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjIwOAorbXNnaWQgIiIKKyIgIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgICAgICAgICAgICAgTGluayBfc3ltIHRvIF9zeW1Abm4gd2l0aG91dCB3YXJuaW5nc1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToyMDkKK21zZ2lkICIiCisiICAtLWV4Y2x1ZGUtc3ltYm9scyBzeW0sc3ltLC4uLiAgICAgIEV4Y2x1ZGUgc3ltYm9scyBmcm9tIGF1dG9tYXRpYyBleHBvcnRcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MjEwCittc2dpZCAiIgorIiAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGV4cG9ydCBhbGwgZ2xvYmFscyB0byAiCisiRExMXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjIxMQorbXNnaWQgIiAgLS1raWxsLWF0ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgQG5uIGZyb20gZXhwb3J0ZWQgc3ltYm9sc1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToyMTIKK21zZ2lkICIgIC0tb3V0LWltcGxpYiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgaW1wb3J0IGxpYnJhcnlcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MjEzCittc2dpZCAiIgorIiAgLS1vdXRwdXQtZGVmIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIC5ERUYgZmlsZSBmb3IgdGhlIGJ1aWx0IERMTFxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbToyNzYKK21zZ2lkICIlUDogd2FybmluZzogYmFkIHZlcnNpb24gbnVtYmVyIGluIC1zdWJzeXN0ZW0gb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjI5MgorbXNnaWQgIiVQJUY6IGludmFsaWQgc3Vic3lzdGVtIHR5cGUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06MzA3Cittc2dpZCAiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbTozMjUKK21zZ2lkICIlUCVGOiBzdHJhbmdlIGhleCBpbmZvIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbTozNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IENhbid0IG9wZW4gYmFzZSBmaWxlICVzXG4iCittc2dzdHIgIiIKKworIzogZW11bHRlbXBsL3BlLmVtOjQ5NworbXNnaWQgIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbTo1NjcgZW11bHRlbXBsL3BlLmVtOjU5MworIywgYy1mb3JtYXQKK21zZ2lkICJXYXJuaW5nOiByZXNvbHZpbmcgJXMgYnkgbGlua2luZyB0byAlc1xuIgorbXNnc3RyICIiCisKKyM6IGVtdWx0ZW1wbC9wZS5lbTo1NzIgZW11bHRlbXBsL3BlLmVtOjU5OAorbXNnaWQgIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06NTczIGVtdWx0ZW1wbC9wZS5lbTo1OTkKK21zZ2lkICJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06NjE1Cittc2dpZCAiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06NjUyCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06Njc1CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMgZm9yIGludGVyd29ya2luZyIKK21zZ3N0ciAiIgorCisjOiBlbXVsdGVtcGwvcGUuZW06NzMwIGxkbGFuZy5jOjE2MjMgbGRsYW5nLmM6Mzk5MCBsZGxhbmcuYzo0MDI0IGxkbWFpbi5jOjk3OAorbXNnaWQgIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZGNyZWYuYzoxNjIKK21zZ2lkICIlWCVQOiBiZmRfaGFzaF90YWJsZV9pbml0IG9mIGNyZWYgdGFibGUgZmFpbGVkOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkY3JlZi5jOjE2OAorbXNnaWQgIiVYJVA6IGNyZWZfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkY3JlZi5jOjIzOQorbXNnaWQgIiIKKyJcbiIKKyJDcm9zcyBSZWZlcmVuY2UgVGFibGVcbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBsZGNyZWYuYzoyNDAKK21zZ2lkICJTeW1ib2wiCittc2dzdHIgIiIKKworIzogbGRjcmVmLmM6MjQ4Cittc2dpZCAiRmlsZVxuIgorbXNnc3RyICIiCisKKyM6IGxkY3JlZi5jOjI1MgorbXNnaWQgIk5vIHN5bWJvbHNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGNyZWYuYzozNjkKK21zZ2lkICIlUDogc3ltYm9sIGAlVCcgbWlzc2luZyBmcm9tIG1haW4gaGFzaCB0YWJsZVxuIgorbXNnc3RyICIiCisKKyM6IGxkY3JlZi5jOjQ0MQorbXNnaWQgIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM7ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRjcmVmLmM6NDQ1IGxkbWFpbi5jOjEwNDYgbGRtYWluLmM6MTA1MAorbXNnaWQgIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRjcmVmLmM6NTE3IGxkY3JlZi5jOjUyNCBsZG1haW4uYzoxMDk2IGxkbWFpbi5jOjExMDMKK21zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iCittc2dzdHIgIiIKKworIy4gV2UgZm91bmQgYSByZWxvYyBmb3IgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wgaXMgZGVmaW5lZAorIy4gaW4gT1VUU0VDTkFNRS4gIFRoaXMgcmVsb2MgaXMgZnJvbSBhIHNlY3Rpb24gd2hpY2ggaXMKKyMuIG1hcHBlZCBpbnRvIGEgc2VjdGlvbiBmcm9tIHdoaWNoIHJlZmVyZW5jZXMgdG8gT1VUU0VDTkFNRQorIy4gYXJlIHByb2hpYml0ZWQuICBXZSBtdXN0IHJlcG9ydCBhbiBlcnJvci4KKyM6IGxkY3JlZi5jOjU0MgorbXNnaWQgIiVYJUM6IHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gJXMgdG8gYCVUJyBpbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkY3Rvci5jOjg5Cittc2dpZCAiJVAlWDogRGlmZmVyZW50IHJlbG9jcyB1c2VkIGluIHNldCAlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkY3Rvci5jOjEwNgorbXNnaWQgIiVQJVg6IERpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGNvbXBvc2luZyBzZXQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGN0b3IuYzoyODggbGRjdG9yLmM6MzAyCittc2dpZCAiJVAlWDogJXMgZG9lcyBub3Qgc3VwcG9ydCByZWxvYyAlcyBmb3Igc2V0ICVzXG4iCittc2dzdHIgIiIKKworIzogbGRjdG9yLmM6MzIzCittc2dpZCAiJVAlWDogVW5zdXBwb3J0ZWQgc2l6ZSAlZCBmb3Igc2V0ICVzXG4iCittc2dzdHIgIiIKKworIzogbGRjdG9yLmM6MzQ0Cittc2dpZCAiIgorIlxuIgorIlNldCAgICAgICAgICAgICAgICAgU3ltYm9sXG4iCisiXG4iCittc2dzdHIgIiIKKworIzogbGRlbXVsLmM6MjIzCittc2dpZCAiJVMgU1lTTElCIGlnbm9yZWRcbiIKK21zZ3N0ciAiIgorCisjOiBsZGVtdWwuYzoyMzEKK21zZ2lkICIlUyBITEwgaWdub3JlZFxuIgorbXNnc3RyICIiCisKKyM6IGxkZW11bC5jOjI1MgorbXNnaWQgIiVQOiB1bnJlY29nbmlzZWQgZW11bGF0aW9uIG1vZGU6ICVzXG4iCittc2dzdHIgIiIKKworIzogbGRlbXVsLmM6MjUzCittc2dpZCAiU3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIKK21zZ3N0ciAiIgorCisjOiBsZGVtdWwuYzoyOTcKK21zZ2lkICIgIG5vIGVtdWxhdGlvbiBzcGVjaWZpYyBvcHRpb25zLlxuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6MTU2Cittc2dpZCAiJUYlUDogJXMgdXNlcyB1bmRlZmluZWQgc2VjdGlvbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6MTU4Cittc2dpZCAiJUYlUDogJXMgZm9yd2FyZCByZWZlcmVuY2Ugb2Ygc2VjdGlvbiAlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6MjcwCittc2dpZCAiJUYlUyAlJSBieSB6ZXJvXG4iCittc2dzdHIgIiIKKworIzogbGRleHAuYzoyNzcKK21zZ2lkICIlRiVTIC8gYnkgemVyb1xuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6NDAwCittc2dpZCAiJVglUzogdW5yZXNvbHZhYmxlIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6NDE5Cittc2dpZCAiJUYlUzogdW5kZWZpbmVkIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6NjAwCittc2dpZCAiJUYlUyBjYW4gbm90IFBST1ZJREUgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iCittc2dzdHIgIiIKKworIzogbGRleHAuYzo2MTAKK21zZ2lkICIlRiVTIGludmFsaWQgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iCittc2dzdHIgIiIKKworIzogbGRleHAuYzo2MTQKK21zZ2lkICIlRiVTIGFzc2lnbm1lbnQgdG8gbG9jYXRpb24gY291bnRlciBpbnZhbGlkIG91dHNpZGUgb2YgU0VDVElPTlxuIgorbXNnc3RyICIiCisKKyM6IGxkZXhwLmM6NjI0Cittc2dpZCAiJUYlUyBjYW5ub3QgbW92ZSBsb2NhdGlvbiBjb3VudGVyIGJhY2t3YXJkcyAoZnJvbSAlViB0byAlVilcbiIKK21zZ3N0ciAiIgorCisjOiBsZGV4cC5jOjY1MgorbXNnaWQgIiVQJUY6JXM6IGhhc2ggY3JlYXRpb24gZmFpbGVkXG4iCittc2dzdHIgIiIKKworIzogbGRleHAuYzo5NDkKK21zZ2lkICIlRiVTIG5vbmNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iCittc2dzdHIgIiIKKworIzogbGRleHAuYzo5ODIKK21zZ2lkICIlRiVTIG5vbiBjb25zdGFudCBleHByZXNzaW9uIGZvciAlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkZmlsZS5jOjEwOQorIywgYy1mb3JtYXQKK21zZ2lkICJhdHRlbXB0IHRvIG9wZW4gJXMgZmFpbGVkXG4iCittc2dzdHIgIiIKKworIzogbGRmaWxlLmM6MTExCisjLCBjLWZvcm1hdAorbXNnaWQgImF0dGVtcHQgdG8gb3BlbiAlcyBzdWNjZWVkZWRcbiIKK21zZ3N0ciAiIgorCisjOiBsZGZpbGUuYzoxMTkKK21zZ2lkICIlRiVQOiBpbnZhbGlkIEJGRCB0YXJnZXQgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkZmlsZS5jOjIyMgorbXNnaWQgIiVGJVA6IGNhbm5vdCBvcGVuICVzOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkZmlsZS5jOjIzOSBsZGZpbGUuYzoyNTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2Fubm90IGZpbmQgc2NyaXB0IGZpbGUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGZpbGUuYzoyNDEgbGRmaWxlLmM6MjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIm9wZW5lZCBzY3JpcHQgZmlsZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkZmlsZS5jOjI5OQorbXNnaWQgIiVQJUY6IGNhbm5vdCBvcGVuIGxpbmtlciBzY3JpcHQgZmlsZSAlczogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZGZpbGUuYzozNDAKK21zZ2lkICIlUCVGOiB1bmtub3duIGFyY2hpdGVjdHVyZTogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGZpbGUuYzozNTcKK21zZ2lkICIlUCVGOiB0YXJnZXQgYXJjaGl0ZWN0dXJlIHJlc3BlY2lmaWVkXG4iCittc2dzdHIgIiIKKworIzogbGRmaWxlLmM6NDEwCittc2dpZCAiJVAlRjogY2Fubm90IHJlcHJlc2VudCBtYWNoaW5lIGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo1OTAKK21zZ2lkICIiCisiXG4iCisiTWVtb3J5IENvbmZpZ3VyYXRpb25cbiIKKyJcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo1OTIKK21zZ2lkICJOYW1lIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjU5MgorbXNnaWQgIk9yaWdpbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo1OTIKK21zZ2lkICJMZW5ndGgiCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6NTkyCittc2dpZCAiQXR0cmlidXRlcyIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo2MzQKK21zZ2lkICIiCisiXG4iCisiTGlua2VyIHNjcmlwdCBhbmQgbWVtb3J5IG1hcFxuIgorIlxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjY1MQorbXNnaWQgIiVQJUY6IElsbGVnYWwgdXNlIG9mIGAlcycgc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo2NjEKK21zZ2lkICIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo3ODIKK21zZ2lkICIlUDogJUI6IHdhcm5pbmc6IGlnbm9yaW5nIGR1cGxpY2F0ZSBzZWN0aW9uIGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzo3OTYKK21zZ2lkICIlUDogJUI6IHdhcm5pbmc6IGR1cGxpY2F0ZSBzZWN0aW9uIGAlcycgaGFzIGRpZmZlcmVudCBzaXplXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MTIyMworbXNnaWQgIiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjEyMjQKK21zZ2lkICIlQjogbWF0Y2hpbmcgZm9ybWF0czoiCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MTIzMQorbXNnaWQgIiVGJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MTI4NAorbXNnaWQgIiVGJUI6IG9iamVjdCAlQiBpbiBhcmNoaXZlIGlzIG5vdCBvYmplY3RcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoxMjkwIGxkbGFuZy5jOjEzMDIKK21zZ2lkICIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjE0MTgKK21zZ2lkICIlUCVGOiB0YXJnZXQgJXMgbm90IGZvdW5kXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MTQyMAorbXNnaWQgIiVQJUY6IGNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjE0MjgKK21zZ2lkICIlUCVGOiVzOiBjYW4gbm90IG1ha2Ugb2JqZWN0IGZpbGU6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MTQzMgorbXNnaWQgIiVQJUY6JXM6IGNhbiBub3Qgc2V0IGFyY2hpdGVjdHVyZTogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoxNDM2Cittc2dpZCAiJVAlRjogY2FuIG5vdCBjcmVhdGUgbGluayBoYXNoIHRhYmxlOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjE3NDYKK21zZ2lkICIgbG9hZCBhZGRyZXNzIDB4JVYiCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MTg3NQorbXNnaWQgIiVXIChzaXplIGJlZm9yZSByZWxheGluZylcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoxOTU0CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZHJlc3Mgb2Ygc2VjdGlvbiAlcyBzZXQgdG8gIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjIwOTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbCB3aXRoICVkXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MjMyMAorbXNnaWQgIiVYJVA6IHNlY3Rpb24gJXMgWyVWIC0+ICVWXSBvdmVybGFwcyBzZWN0aW9uICVzIFslViAtPiAlVl1cbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoyMzcyCittc2dpZCAiJVAlWDogSW50ZXJuYWwgZXJyb3Igb24gQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uICVzXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MjQxMworbXNnaWQgIiVQOiB3YXJuaW5nOiBubyBtZW1vcnkgcmVnaW9uIHNwZWNpZmllZCBmb3Igc2VjdGlvbiBgJXMnXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MjQyNgorbXNnaWQgIiVQOiB3YXJuaW5nOiBjaGFuZ2luZyBzdGFydCBvZiBzZWN0aW9uICVzIGJ5ICV1IGJ5dGVzXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MjQ0MAorbXNnaWQgIiVGJVM6IG5vbiBjb25zdGFudCBhZGRyZXNzIGV4cHJlc3Npb24gZm9yIHNlY3Rpb24gJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoyNDkyCittc2dpZCAiJVglUDogYWRkcmVzcyAweCV2IG9mICVCIHNlY3Rpb24gJXMgaXMgbm90IHdpdGhpbiByZWdpb24gJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoyNTAwCittc2dpZCAiJVglUDogcmVnaW9uICVzIGlzIGZ1bGwgKCVCIHNlY3Rpb24gJXMpXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6MjYwMgorbXNnaWQgIiVQJUY6IGNhbid0IHJlbGF4IHNlY3Rpb246ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6Mjc2MworbXNnaWQgIiVGJVA6IGludmFsaWQgZGF0YSBzdGF0ZW1lbnRcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoyNzkyCittc2dpZCAiJUYlUDogaW52YWxpZCByZWxvYyBzdGF0ZW1lbnRcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoyOTI2Cittc2dpZCAiJVAlRjolczogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzoyOTM5IGxkbGFuZy5jOjI5NTYKK21zZ2lkICIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjI5NTEKK21zZ2lkICIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBkZWZhdWx0aW5nIHRvICVWXG4iCittc2dzdHIgIiIKKworIzogbGRsYW5nLmM6Mjk2MQorbXNnaWQgIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IG5vdCBzZXR0aW5nIHN0YXJ0IGFkZHJlc3NcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzozMDAzCittc2dpZCAiIgorIiVQOiB3YXJuaW5nOiAlcyBhcmNoaXRlY3R1cmUgb2YgaW5wdXQgZmlsZSBgJUInIGlzIGluY29tcGF0aWJsZSB3aXRoICVzICIKKyJvdXRwdXRcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzozMDIxCittc2dpZCAiJUUlWDogZmFpbGVkIHRvIG1lcmdlIHRhcmdldCBzcGVjaWZpYyBkYXRhIG9mIGZpbGUgJUJcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzozMTA2Cittc2dpZCAiIgorIlxuIgorIkFsbG9jYXRpbmcgY29tbW9uIHN5bWJvbHNcbiIKK21zZ3N0ciAiIgorCisjOiBsZGxhbmcuYzozMTA3Cittc2dpZCAiIgorIkNvbW1vbiBzeW1ib2wgICAgICAgc2l6ZSAgICAgICAgICAgICAgZmlsZVxuIgorIlxuIgorbXNnc3RyICIiCisKKyMuIFRoaXMgbWVzc2FnZSBoYXBwZW5zIHdoZW4gdXNpbmcgdGhlCisjLiBzdnIzLmlmaWxlIGxpbmtlciBzY3JpcHQsIHNvIEkgaGF2ZQorIy4gZGlzYWJsZWQgaXQuCisjOiBsZGxhbmcuYzozMTk2Cittc2dpZCAiJVA6IG5vIFtDT01NT05dIGNvbW1hbmQsIGRlZmF1bHRpbmcgdG8gLmJzc1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjMyNTkKK21zZ2lkICIlUCVGOiBpbnZhbGlkIHN5bnRheCBpbiBmbGFnc1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjM5NDcKK21zZ2lkICIlUCVGbXVsdGlwbGUgU1RBUlRVUCBmaWxlc1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjQyMDkKK21zZ2lkICIlRiVQOiBiZmRfcmVjb3JkX3BoZHIgZmFpbGVkOiAlRVxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjQyMjgKK21zZ2lkICIlWCVQOiBzZWN0aW9uIGAlcycgYXNzaWduZWQgdG8gbm9uLWV4aXN0ZW50IHBoZHIgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjQ0OTcKK21zZ2lkICIlWCVQOiBkdXBsaWNhdGUgdmVyc2lvbiB0YWcgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjQ1MTAgbGRsYW5nLmM6NDUyMworbXNnaWQgIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjQ1NjAKK21zZ2lkICIlWCVQOiB1bmFibGUgdG8gZmluZCB2ZXJzaW9uIGRlcGVuZGVuY3kgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbGFuZy5jOjQ1ODIKK21zZ2lkICIlWCVQOiB1bmFibGUgdG8gcmVhZCAuZXhwb3J0cyBzZWN0aW9uIGNvbnRlbnRzIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjE4OAorbXNnaWQgIiVYJVA6IGNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoyNDUKK21zZ2lkICIlUCVGOiAtLXJlbGF4IGFuZCAtciBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoyNDcKK21zZ2lkICIlUCVGOiAtciBhbmQgLXNoYXJlZCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoyNzYKK21zZ2lkICJ1c2luZyBpbnRlcm5hbCBsaW5rZXIgc2NyaXB0OlxuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjI5NQorbXNnaWQgIiVQJUY6IG5vIGlucHV0IGZpbGVzXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6MzAwCittc2dpZCAiJVA6IG1vZGUgJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzozMTgKK21zZ2lkICIlUCVGOiBjYW5ub3Qgb3BlbiBtYXAgZmlsZSAlczogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzozNjQKK21zZ2lkICIlUDogbGluayBlcnJvcnMgZm91bmQsIGRlbGV0aW5nIGV4ZWN1dGFibGUgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjM3NQorbXNnaWQgIiVGJUI6IGZpbmFsIGNsb3NlIGZhaWxlZDogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzozOTkKK21zZ2lkICIlWCVQOiB1bmFibGUgdG8gb3BlbiBmb3Igc291cmNlIG9mIGNvcHkgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjQwMQorbXNnaWQgIiVYJVA6IHVuYWJsZSB0byBvcGVuIGZvciBkZXN0aW5hdGlvbiBvZiBjb3B5IGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo0MDcKK21zZ2lkICIlUDogRXJyb3Igd3JpdGluZyBmaWxlIGAlcydcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo0MTMgcGUtZGxsLmM6ODk5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjQzMQorIywgYy1mb3JtYXQKK21zZ2lkICIlczogdG90YWwgdGltZSBpbiBsaW5rOiAlbGQuJTA2bGRcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo0MzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGRhdGEgc2l6ZSAlbGRcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo0NzUKK21zZ2lkICIlUCVGOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC1tXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6NTg5IGxkbWFpbi5jOjYxMCBsZG1haW4uYzo2NDEKK21zZ2lkICIlUCVGOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo1OTQgbGRtYWluLmM6NjEzCittc2dpZCAiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo2MjgKK21zZ2lkICIlWCVQOiBlcnJvcjogZHVwbGljYXRlIHJldGFpbi1zeW1ib2xzLWZpbGVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo2NzIKK21zZ2lkICIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZm9yIGluc2VydGlvbiBmYWlsZWQ6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6Njc3Cittc2dpZCAiJVA6IGAtcmV0YWluLXN5bWJvbHMtZmlsZScgb3ZlcnJpZGVzIGAtcycgYW5kIGAtUydcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo3NTQKK21zZ2lkICJBcmNoaXZlIG1lbWJlciBpbmNsdWRlZCIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo3NTUKK21zZ2lkICJiZWNhdXNlIG9mIGZpbGUgKHN5bWJvbCkiCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6ODI3Cittc2dpZCAiJVglQzogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBgJVQnXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6ODMwCittc2dpZCAiJUQ6IGZpcnN0IGRlZmluZWQgaGVyZVxuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjg1OQorbXNnaWQgIiVCOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBjb21tb25cbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo4NjIKK21zZ2lkICIlQjogd2FybmluZzogY29tbW9uIGlzIGhlcmVcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo4NjkKK21zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBkZWZpbml0aW9uXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6ODcyCittc2dpZCAiJUI6IHdhcm5pbmc6IGRlZmluZWQgaGVyZVxuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjg3OQorbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGxhcmdlciBjb21tb25cbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo4ODIKK21zZ2lkICIlQjogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6ODg2Cittc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRpbmcgc21hbGxlciBjb21tb25cbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo4ODkKK21zZ2lkICIlQjogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZVxuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjg5MworbXNnaWQgIiVCOiB3YXJuaW5nOiBtdWx0aXBsZSBjb21tb24gb2YgYCVUJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjg5NQorbXNnaWQgIiVCOiB3YXJuaW5nOiBwcmV2aW91cyBjb21tb24gaXMgaGVyZVxuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjkxNyBsZG1haW4uYzo5NTYKK21zZ2lkICIlUDogd2FybmluZzogZ2xvYmFsIGNvbnN0cnVjdG9yICVzIHVzZWRcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzo5NjYKK21zZ2lkICIlUCVGOiBCRkQgYmFja2VuZCBlcnJvcjogQkZEX1JFTE9DX0NUT1IgdW5zdXBwb3J0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoxMTUyCittc2dpZCAiJUYlUDogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6MTE1OQorbXNnaWQgIiVGJVA6IGJmZF9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6MTE3OAorbXNnaWQgIiVYJUM6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjExODEKK21zZ2lkICIlRDogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIgorbXNnc3RyICIiCisKKyM6IGxkbWFpbi5jOjExODcKK21zZ2lkICIlWCVCOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoxMTkwCittc2dpZCAiJUI6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoxMjExIGxkbWFpbi5jOjEyMzMgbGRtYWluLmM6MTI1MworbXNnaWQgIiVQJVg6IGdlbmVyYXRlZCIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoxMjE0Cittc2dpZCAiIHJlbG9jYXRpb24gdHJ1bmNhdGVkIHRvIGZpdDogJXMgJVQiCittc2dzdHIgIiIKKworIzogbGRtYWluLmM6MTIzNgorIywgYy1mb3JtYXQKK21zZ2lkICJkYW5nZXJvdXMgcmVsb2NhdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiBsZG1haW4uYzoxMjU2Cittc2dpZCAiIHJlbG9jIHJlZmVycyB0byBzeW1ib2wgYCVUJyB3aGljaCBpcyBub3QgYmVpbmcgb3V0cHV0XG4iCittc2dzdHIgIiIKKworIzogbGRtaXNjLmM6MTc3Cittc2dpZCAibm8gc3ltYm9sIgorbXNnc3RyICIiCisKKyM6IGxkbWlzYy5jOjIzOQorIywgYy1mb3JtYXQKK21zZ2lkICJidWlsdCBpbiBsaW5rZXIgc2NyaXB0OiV1IgorbXNnc3RyICIiCisKKyM6IGxkbWlzYy5jOjI4OSBsZG1pc2MuYzoyOTMKK21zZ2lkICIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzXG4iCittc2dzdHIgIiIKKworIy4gV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAorIy4gaW4gY2FzZSBmaWxlbmFtZSBpcyBhIC5oIGZpbGUgb3Igc29tZXRoaW5nCisjLiBzaW1pbGFybHkgdW5oZWxwZnVsLgorIzogbGRtaXNjLmM6MzI5Cittc2dpZCAiJUI6IEluIGZ1bmN0aW9uIGAlVCc6XG4iCittc2dzdHIgIiIKKworIzogbGRtaXNjLmM6NDYxCittc2dpZCAiJUYlUDogaW50ZXJuYWwgZXJyb3IgJXMgJWRcbiIKK21zZ3N0ciAiIgorCisjOiBsZHZlci5jOjM1CisjLCBjLWZvcm1hdAorbXNnaWQgIkdOVSBsZCB2ZXJzaW9uICVzICh3aXRoIEJGRCAlcylcbiIKK21zZ3N0ciAiIgorCisjOiBsZHZlci5jOjQyIGxleHN1cC5jOjgyOQorbXNnaWQgIiAgU3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iCittc2dzdHIgIiIKKworIzogbGR3cml0ZS5jOjU5IGxkd3JpdGUuYzoxOTUKK21zZ2lkICIlUCVGOiBiZmRfbmV3X2xpbmtfb3JkZXIgZmFpbGVkXG4iCittc2dzdHIgIiIKKworIzogbGR3cml0ZS5jOjM2NQorIywgYy1mb3JtYXQKK21zZ2lkICIlOHggc29tZXRoaW5nIGVsc2VcbiIKK21zZ3N0ciAiIgorCisjOiBsZHdyaXRlLmM6NTI2Cittc2dpZCAiJUYlUDogZmluYWwgbGluayBmYWlsZWQ6ICVFXG4iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTQ4IGxleHN1cC5jOjIzMSBsZXhzdXAuYzoyMzcKK21zZ2lkICJLRVlXT1JEIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE0OAorbXNnaWQgIlNoYXJlZCBsaWJyYXJ5IGNvbnRyb2wgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTUxCittc2dpZCAiQVJDSCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxNTEKK21zZ2lkICJTZXQgYXJjaGl0ZWN0dXJlIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE1MyBsZXhzdXAuYzoyOTAKK21zZ2lkICJUQVJHRVQiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTUzCittc2dpZCAiU3BlY2lmeSB0YXJnZXQgZm9yIGZvbGxvd2luZyBpbnB1dCBmaWxlcyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxNTUgbGV4c3VwLmM6MTk0IGxleHN1cC5jOjIwNCBsZXhzdXAuYzoyMTMgbGV4c3VwLmM6Mjc4CisjOiBsZXhzdXAuYzoyOTcgbGV4c3VwLmM6MzMxCittc2dpZCAiRklMRSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxNTUKK21zZ2lkICJSZWFkIE1SSSBmb3JtYXQgbGlua2VyIHNjcmlwdCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxNTcKK21zZ2lkICJGb3JjZSBjb21tb24gc3ltYm9scyB0byBiZSBkZWZpbmVkIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE2MSBsZXhzdXAuYzozMjEgbGV4c3VwLmM6MzIzIGxleHN1cC5jOjMyNQorbXNnaWQgIkFERFJFU1MiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTYxCittc2dpZCAiU2V0IHN0YXJ0IGFkZHJlc3MiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTYzCittc2dpZCAiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTY1Cittc2dpZCAiTGluayBiaWctZW5kaWFuIG9iamVjdHMiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTY3Cittc2dpZCAiTGluayBsaXR0bGUtZW5kaWFuIG9iamVjdHMiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTY5IGxleHN1cC5jOjE3MgorbXNnaWQgIlNITElCIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE2OQorbXNnaWQgIkF1eGlsaWFyeSBmaWx0ZXIgZm9yIHNoYXJlZCBvYmplY3Qgc3ltYm9sIHRhYmxlIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE3MgorbXNnaWQgIkZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTc0Cittc2dpZCAiSWdub3JlZCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxNzYKK21zZ2lkICJTSVpFIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE3NgorbXNnaWQgIlNtYWxsIGRhdGEgc2l6ZSAoaWYgbm8gc2l6ZSwgc2FtZSBhcyAtLXNoYXJlZCkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTc5Cittc2dpZCAiRklMRU5BTUUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTc5Cittc2dpZCAiU2V0IGludGVybmFsIG5hbWUgb2Ygc2hhcmVkIGxpYnJhcnkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTgxCittc2dpZCAiTElCTkFNRSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxODEKK21zZ2lkICJTZWFyY2ggZm9yIGxpYnJhcnkgTElCTkFNRSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxODMKK21zZ2lkICJESVJFQ1RPUlkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTgzCittc2dpZCAiQWRkIERJUkVDVE9SWSB0byBsaWJyYXJ5IHNlYXJjaCBwYXRoIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE4NQorbXNnaWQgIkVNVUxBVElPTiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxODUKK21zZ2lkICJTZXQgZW11bGF0aW9uIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE4NworbXNnaWQgIlByaW50IG1hcCBmaWxlIG9uIHN0YW5kYXJkIG91dHB1dCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxODkKK21zZ2lkICJEbyBub3QgcGFnZSBhbGlnbiBkYXRhIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjE5MQorbXNnaWQgIkRvIG5vdCBwYWdlIGFsaWduIGRhdGEsIGRvIG5vdCBtYWtlIHRleHQgcmVhZG9ubHkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTk0Cittc2dpZCAiU2V0IG91dHB1dCBmaWxlIG5hbWUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTk2Cittc2dpZCAiT3B0aW1pemUgb3V0cHV0IGZpbGUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MTk4Cittc2dpZCAiSWdub3JlZCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5IgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIwMAorbXNnaWQgIkdlbmVyYXRlIHJlbG9jYXRlYWJsZSBvdXRwdXQiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjA0Cittc2dpZCAiSnVzdCBsaW5rIHN5bWJvbHMgKGlmIGRpcmVjdG9yeSwgc2FtZSBhcyAtLXJwYXRoKSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMDcKK21zZ2lkICJTdHJpcCBhbGwgc3ltYm9scyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMDkKK21zZ2lkICJTdHJpcCBkZWJ1Z2dpbmcgc3ltYm9scyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMTEKK21zZ2lkICJUcmFjZSBmaWxlIG9wZW5zIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIxMworbXNnaWQgIlJlYWQgbGlua2VyIHNjcmlwdCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMTUgbGV4c3VwLmM6MjI3IGxleHN1cC5jOjMxNyBsZXhzdXAuYzozMzQgbGV4c3VwLmM6MzUxCittc2dpZCAiU1lNQk9MIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIxNQorbXNnaWQgIlN0YXJ0IHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBTWU1CT0wiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjE3Cittc2dpZCAiQnVpbGQgZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdGFibGVzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIxOQorbXNnaWQgIlByaW50IHZlcnNpb24gaW5mb3JtYXRpb24iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjIxCittc2dpZCAiUHJpbnQgdmVyc2lvbiBhbmQgZW11bGF0aW9uIGluZm9ybWF0aW9uIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIyMworbXNnaWQgIkRpc2NhcmQgYWxsIGxvY2FsIHN5bWJvbHMiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjI1Cittc2dpZCAiRGlzY2FyZCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMjcKK21zZ2lkICJUcmFjZSBtZW50aW9ucyBvZiBTWU1CT0wiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjI5IGxleHN1cC5jOjI5OSBsZXhzdXAuYzozMDEKK21zZ2lkICJQQVRIIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIyOQorbXNnaWQgIkRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMzEKK21zZ2lkICJJZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjMzCittc2dpZCAiU3RhcnQgYSBncm91cCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMzUKK21zZ2lkICJFbmQgYSBncm91cCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyMzcKK21zZ2lkICJJZ25vcmVkIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5IgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjIzOQorbXNnaWQgIkxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjI0NQorbXNnaWQgIkRvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyNTMKK21zZ2lkICJCaW5kIGdsb2JhbCByZWZlcmVuY2VzIGxvY2FsbHkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjU1Cittc2dpZCAiQ2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIChkZWZhdWx0KSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyNTcKK21zZ2lkICJEbyBub3QgY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIG92ZXJsYXBzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjI2MAorbXNnaWQgIk91dHB1dCBjcm9zcyByZWZlcmVuY2UgdGFibGUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjYyCittc2dpZCAiU1lNQk9MPUVYUFJFU1NJT04iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjYyCittc2dpZCAiRGVmaW5lIGEgc3ltYm9sIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjI2NAorbXNnaWQgIlBST0dSQU0iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjY0Cittc2dpZCAiU2V0IHRoZSBkeW5hbWljIGxpbmtlciB0byB1c2UiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjY2Cittc2dpZCAiR2VuZXJhdGUgZW1iZWRkZWQgcmVsb2NzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjI2OAorbXNnaWQgIkZvcmNlIGdlbmVyYXRpb24gb2YgZmlsZSB3aXRoIC5leGUgc3VmZml4IgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjI3MAorbXNnaWQgIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKG9uIHNvbWUgdGFyZ2V0cykiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjczCittc2dpZCAiRG9uJ3QgcmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAoZGVmYXVsdCkiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6Mjc2Cittc2dpZCAiUHJpbnQgb3B0aW9uIGhlbHAiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6Mjc4Cittc2dpZCAiV3JpdGUgYSBtYXAgZmlsZSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyODAKK21zZ2lkICJVc2UgbGVzcyBtZW1vcnkgYW5kIG1vcmUgZGlzayBJL08iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjgyCittc2dpZCAiRG9uJ3Qgd2FybiBhYm91dCBtaXNtYXRjaGVkIGlucHV0IGZpbGVzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjI4NAorbXNnaWQgIlR1cm4gb2ZmIC0td2hvbGUtYXJjaGl2ZSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyODYKK21zZ2lkICJDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZXZlbiBpZiBlcnJvcnMgb2NjdXIiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjkwCittc2dpZCAiU3BlY2lmeSB0YXJnZXQgb2Ygb3V0cHV0IGZpbGUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MjkyCittc2dpZCAiSWdub3JlZCBmb3IgTGludXggY29tcGF0aWJpbGl0eSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoyOTQKK21zZ2lkICJSZWxheCBicmFuY2hlcyBvbiBjZXJ0YWluIHRhcmdldHMiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6Mjk3Cittc2dpZCAiS2VlcCBvbmx5IHN5bWJvbHMgbGlzdGVkIGluIEZJTEUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6Mjk5Cittc2dpZCAiU2V0IHJ1bnRpbWUgc2hhcmVkIGxpYnJhcnkgc2VhcmNoIHBhdGgiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzAxCittc2dpZCAiU2V0IGxpbmsgdGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozMDMKK21zZ2lkICJDcmVhdGUgYSBzaGFyZWQgbGlicmFyeSIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozMDcKK21zZ2lkICJTb3J0IGNvbW1vbiBzeW1ib2xzIGJ5IHNpemUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzExCittc2dpZCAiU3BsaXQgb3V0cHV0IHNlY3Rpb25zIGZvciBlYWNoIGZpbGUiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzEzCittc2dpZCAiQ09VTlQiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzEzCittc2dpZCAiU3BsaXQgb3V0cHV0IHNlY3Rpb25zIGV2ZXJ5IENPVU5UIHJlbG9jcyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozMTUKK21zZ2lkICJQcmludCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozMTcKK21zZ2lkICJEbyB0YXNrIGxldmVsIGxpbmtpbmciCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzE5Cittc2dpZCAiVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBsaW5rZXIiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzIxCittc2dpZCAiU2V0IGFkZHJlc3Mgb2YgLmJzcyBzZWN0aW9uIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjMyMworbXNnaWQgIlNldCBhZGRyZXNzIG9mIC5kYXRhIHNlY3Rpb24iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzI1Cittc2dpZCAiU2V0IGFkZHJlc3Mgb2YgLnRleHQgc2VjdGlvbiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozMjcKK21zZ2lkICJPdXRwdXQgbG90cyBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgbGluayIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozMzEKK21zZ2lkICJSZWFkIHZlcnNpb24gaW5mb3JtYXRpb24gc2NyaXB0IgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjMzNAorbXNnaWQgIlRha2UgZXhwb3J0IHN5bWJvbHMgbGlzdCBmcm9tIC5leHBvcnRzLCB1c2luZyBTWU1CT0wgYXMgdGhlIHZlcnNpb24uIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjMzNworbXNnaWQgIldhcm4gYWJvdXQgZHVwbGljYXRlIGNvbW1vbiBzeW1ib2xzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjMzOQorbXNnaWQgIldhcm4gaWYgZ2xvYmFsIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyBhcmUgc2VlbiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozNDIKK21zZ2lkICJXYXJuIGlmIHRoZSBtdWx0aXBsZSBHUCB2YWx1ZXMgYXJlIHVzZWQiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzQ0Cittc2dpZCAiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6MzQ2Cittc2dpZCAiV2FybiBpZiBzdGFydCBvZiBzZWN0aW9uIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzozNDkKK21zZ2lkICJJbmNsdWRlIGFsbCBvYmplY3RzIGZyb20gZm9sbG93aW5nIGFyY2hpdmVzIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjM1MQorbXNnaWQgIlVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgU1lNQk9MIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjQ5MQorbXNnaWQgIiVQJUY6IHVucmVjb2duaXplZCAtYSBvcHRpb24gYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjUwNAorbXNnaWQgIiVQJUY6IHVucmVjb2duaXplZCAtYXNzZXJ0IG9wdGlvbiBgJXMnXG4iCittc2dzdHIgIiIKKworIzogbGV4c3VwLmM6NTkyCittc2dpZCAiJVAlRjogaW52YWxpZCBudW1iZXIgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjc1OAorbXNnaWQgIiVQJUY6IC1zaGFyZWQgbm90IHN1cHBvcnRlZFxuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjgyMgorbXNnaWQgIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjgyMworbXNnaWQgIiIKKyJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG4iCisidGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjkxNAorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbWF5IG5vdCBuZXN0IGdyb3VwcyAoLS1oZWxwIGZvciB1c2FnZSlcbiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzo5MjUKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGdyb3VwIGVuZGVkIGJlZm9yZSBpdCBiZWdhbiAoLS1oZWxwIGZvciB1c2FnZSlcbiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzo5NzMKK21zZ2lkICIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgYCVzJ1xuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjk4NQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJXMgW29wdGlvbnNdIGZpbGUuLi5cbiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzo5ODcKK21zZ2lkICJPcHRpb25zOlxuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjEwNjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIKK21zZ3N0ciAiIgorCisjOiBsZXhzdXAuYzoxMDcyCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBzdXBwb3J0ZWQgZW11bGF0aW9uczogIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjEwNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IGVtdWxhdGlvbiBzcGVjaWZpYyBvcHRpb25zOlxuIgorbXNnc3RyICIiCisKKyM6IGxleHN1cC5jOjEwODEKK21zZ2lkICIiCisiXG4iCisiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iCittc2dzdHIgIiIKKworIzogbXJpLmM6MzQyCittc2dpZCAiJVAlRjogdW5rbm93biBmb3JtYXQgdHlwZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IHBlLWRsbC5jOjI5NAorIywgYy1mb3JtYXQKK21zZ2lkICIlWEVycm9yLCBkdXBsaWNhdGUgRVhQT1JUIHdpdGggb3JpZGluYWxzOiAlcyAoJWQgdnMgJWQpXG4iCittc2dzdHIgIiIKKworIzogcGUtZGxsLmM6MzAwCisjLCBjLWZvcm1hdAorbXNnaWQgIldhcm5pbmcsIGR1cGxpY2F0ZSBFWFBPUlQ6ICVzXG4iCittc2dzdHIgIiIKKworIzogcGUtZGxsLmM6MzQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBkZWZpbmVkXG4iCittc2dzdHIgIiIKKworIzogcGUtZGxsLmM6MzU0CisjLCBjLWZvcm1hdAorbXNnaWQgIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIHdyb25nIHR5cGUgKCVkIHZzICVkKVxuIgorbXNnc3RyICIiCisKKyM6IHBlLWRsbC5jOjM2MQorIywgYy1mb3JtYXQKK21zZ2lkICIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCBub3QgZm91bmRcbiIKK21zZ3N0ciAiIgorCisjOiBwZS1kbGwuYzo0ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiJVhFcnJvciwgb3JpZGluYWwgdXNlZCB0d2ljZTogJWQgKCVzIHZzICVzKVxuIgorbXNnc3RyICIiCisKKyM6IHBlLWRsbC5jOjY2NAorIywgYy1mb3JtYXQKK21zZ2lkICIlWEVycm9yOiAlZC1iaXQgcmVsb2MgaW4gZGxsXG4iCittc2dzdHIgIiIKKworIzogcGUtZGxsLmM6NzczCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBkZWYgZmlsZSAlc1xuIgorbXNnc3RyICIiCisKKyM6IHBlLWRsbC5jOjg5NAorbXNnaWQgIjsgbm8gY29udGVudHMgYXZhaWxhYmxlXG4iCittc2dzdHIgIiIKKworIzogcGUtZGxsLmM6MTMyNgorIywgYy1mb3JtYXQKK21zZ2lkICIlWENhbid0IG9wZW4gLmxpYiBmaWxlOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHBlLWRsbC5jOjEzMzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgorbXNnc3RyICIiCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9SRUFETUUgYi9sZC9zY3JpcHR0ZW1wbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZDJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK1RoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgbGlua2VyIHNjcmlwdCB0ZW1wbGF0ZXMuCitnZW5zY3JpcHRzLnNoIHNldHMgc29tZSBzaGVsbCB2YXJpYWJsZXMsIHRoZW4gc291cmNlcworRU1VTEFUSU9OLnNjLCB0byBnZW5lcmF0ZSBFTVVMQVRJT04ue3gseHIseHUseG4seGJufSAtLSB0aGUgc2NyaXB0CitmaWxlcyBmb3IgZGVmYXVsdCwgLXIsIC1VciwgLW4sIC1OLgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYTI5ay5zYyBiL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyNWIxZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MKQEAgLTAsMCArMSwzNyBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitTRUNUSU9OUworeworICAudGV4dCA6IHsKKyAgICAqKC50ZXh0KQorICAgICR7UkVMT0NBVElORysgX19ldGV4dCAgPSAgLn07CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9CisgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KKyAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9CisgICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KKyAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9CisgICAgKigubGl0KQorICAgICooLnNoZGF0YSkKKyAgfQorICAuc2hic3MgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpIDoJeworICAgICooLnNoYnNzKQorICB9IAorICAuZGF0YSAgOiB7CisgICAgKiguZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrIF9fZWRhdGEgID0gIC59OworICB9CisgIC5ic3MgICBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSkgOgorICB7IAkJCQkJCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IEFMSUdOKDB4OCl9OworICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FpeC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FpeC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjRiNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvYWl4LnNjCkBAIC0wLDAgKzEsNTUgQEAKKyMgQUlYIGxpbmtlciBzY3JpcHQuCisjIEFJWCBhbHdheXMgdXNlcyBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIHNlY3Rpb24gVk1BIGFwcGVhcnMgdG8gYmUKKyMgdW5pbXBvcnRhbnQuICBUaGUgbmF0aXZlIGxpbmtlciBhbGlnbnMgdGhlIHNlY3Rpb25zIG9uIGJvdW5kYXJpZXMKKyMgc3BlY2lmaWVkIGJ5IHRoZSAtSCBvcHRpb24uCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKyR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319CitFTlRSWShfX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLnBhZCAwIDogeyAqKC5wYWQpIH0KKyAgLnRleHQgJHtSRUxPQ0FUSU5HLTB9IDogeworICAgICR7UkVMT0NBVElORytQUk9WSURFIChfdGV4dCA9IC4pO30KKyAgICAqKC50ZXh0KQorICAgICooLnByKQorICAgICooLnJvKQorICAgICooLmRiKQorICAgICooLmdsKQorICAgICooLnhvKQorICAgICooLnRpKQorICAgICooLnRiKQorICAgICR7UkVMT0NBVElORytQUk9WSURFIChfZXRleHQgPSAuKTt9CisgIH0KKyAgLmRhdGEgMCA6IHsKKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2RhdGEgPSAuKTt9CisgICAgKiguZGF0YSkKKyAgICAqKC5ydykKKyAgICAqKC5zdikKKyAgICAqKC51YSkKKyAgICAuID0gQUxJR04oNCk7CisgICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQorICAgICooLmRzKQorICAgICooLnRjMCkKKyAgICAqKC50YykKKyAgICAqKC50ZCkKKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2VkYXRhID0gLik7fQorICB9CisgIC5ic3MgOiB7CisgICAgKigudG9jYnNzKQorICAgICooLmJzcykKKyAgICAqKC5icykKKyAgICAqKC51YykKKyAgICAqKENPTU1PTikKKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX2VuZCA9IC4pO30KKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQorICB9CisgIC5sb2FkZXIgMCA6IHsKKyAgICAqKC5sb2FkZXIpCisgIH0KKyAgLmRlYnVnIDAgOiB7CisgICAgKiguZGVidWcpCisgIH0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hbHBoYS5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGExMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvYWxwaGEuc2MKQEAgLTAsMCArMSw3NCBAQAorIyBMaW5rZXIgc2NyaXB0IGZvciBBbHBoYSBzeXN0ZW1zLgorIyBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisjIFRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW11bGF0aW9uIGZpbGUuICBUaGUKKyMgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlIGZvciBhbiBBbHBoYSBydW5uaW5nIE9TRi8xLgordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Cit0ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwICsgU0laRU9GX0hFQURFUlMiCitpZiB0ZXN0ICJ4JExEX0ZMQUciID0gInhuIiAtbyAieCRMRF9GTEFHIiA9ICJ4TiI7IHRoZW4KKyAgREFUQV9BRERSPS4KK2Vsc2UKKyAgdGVzdCAteiAiJERBVEFfQUREUiIgJiYgREFUQV9BRERSPTB4MTQwMDAwMDAwCitmaQorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQorICAudGV4dCA6IHsKKyAgICAke1JFTE9DQVRJTkcrIF9mdGV4dCA9IC4gfTsKKyAgICAke1JFTE9DQVRJTkcrIF9faXN0YXJ0ID0gLiB9OworICAgICR7UkVMT0NBVElORysgKiguaW5pdCkgfQorICAgICR7UkVMT0NBVElORysgTE9ORyAoMHg2YmZhODAwMSl9CisgICAgJHtSRUxPQ0FUSU5HKyBlcHJvbCAgPSAgLn07CisgICAgKigudGV4dCkKKyAgICAke1JFTE9DQVRJTkcrIF9fZnN0YXJ0ID0gLiB9OworICAgICR7UkVMT0NBVElORysgKiguZmluaSl9CisgICAgJHtSRUxPQ0FUSU5HKyBMT05HICgweDZiZmE4MDAxKX0KKyAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLn07CisgIH0KKyAgLnJkYXRhIDogeworICAgICooLnJkYXRhKQorICB9CisgIC5yY29uc3QgOiB7CisgICAgKigucmNvbnN0KQorICB9CisgIC5wZGF0YSA6IHsKKyAgICAke1JFTE9DQVRJTkcrIF9mcGRhdGEgPSAuO30KKyAgICAqKC5wZGF0YSkKKyAgfQorICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfTt9CisgIC5kYXRhIDogeworICAgICR7UkVMT0NBVElORysgX2ZkYXRhID0gLjt9CisgICAgKiguZGF0YSkKKyAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9CisgIH0KKyAgLnhkYXRhIDogeworICAgICooLnhkYXRhKQorICB9CisgICR7UkVMT0NBVElORysgX2dwID0gQUxJR04gKDE2KSArIDB4ODAwMDt9CisgIC5saXQ4IDogeworICAgICooLmxpdDgpCisgIH0KKyAgLmxpdGEgOiB7CisgICAgKigubGl0YSkKKyAgfQorICAuc2RhdGEgOiB7CisgICAgKiguc2RhdGEpCisgIH0KKyAgJHtSRUxPQ0FUSU5HKyBfRURBVEEgID0gIC47fQorICAke1JFTE9DQVRJTkcrIF9GQlNTID0gLjt9CisgIC5zYnNzIDogeworICAgICooLnNic3MpCisgICAgKiguc2NvbW1vbikKKyAgfQorICAuYnNzIDogeworICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgfQorICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYW91dC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkYmIzNwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MKQEAgLTAsMCArMSw1NyBAQAordGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KK3Rlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Cit0ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iNCIKKworY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKKwkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQorJHtTSExJQl9QQVRIKyR7UkVMT0NBVElORyske1NITElCX1BBVEh9fX0KKyR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ciske1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KK1NFQ1RJT05TCit7CisgICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKKyAgICAgICBpcyBpbXBvcnRhbnQuICAqLworICAgICooLmR5bnJlbCkKKyAgICAqKC5oYXNoKQorICAgICooLmR5bnN5bSkKKyAgICAqKC5keW5zdHIpCisgICAgKigucnVsZXMpCisgICAgKigubmVlZCkKKyAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9CisgICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KKyAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KKyAgfQorICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KKyAgLmRhdGEgOgorICB7CisgICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAqKC5keW5hbWljKQorICAgICooLmdvdCkKKyAgICAqKC5wbHQpCisgICAgKiguZGF0YSkKKyAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9CisgICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9CisgICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQorICB9CisgIC5ic3MgOgorICB7CisgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9CisgICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gfTsKKyAgICR7UkVMT0NBVElORytfX2VuZCA9IC4gfTsKKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3NmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYwpAQCAtMCwwICsxLDM1IEBACitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQorU0VDVElPTlMKK3sKKyAgLnRleHQgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAke1JFTE9DQVRJTkcrX19zdGV4dF8gPSAuO30KKyAgICAqKC50ZXh0KQorICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQorICAgICR7UkVMT0NBVElORytfZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9CisgICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9CisgIH0KKyAgLmRhdGEgJHtSRUxPQ0FUSU5HKyR7REFUQV9BTElHTk1FTlR9fSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrX19zZGF0YV8gPSAuO30KKyAgICAqKC5kYXRhKQorICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KKyAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSICguZGF0YSl9IDoKKyAgeworICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OworICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07CisgICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OworICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDcxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjCkBAIC0wLDAgKzEsNjIgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgQVJNIENPRkYuCisjIEJhc2VkIG9uIGkzODZjb2ZmLnNjIGJ5IElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KK3Rlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0CitpZiB0ZXN0IC16ICIke0RBVEFfQUREUn0iOyB0aGVuCisgIGlmIHRlc3QgIiRMRF9GTEFHIiA9ICJOIiB8fCB0ZXN0ICIkTERfRkxBRyIgPSAibiI7IHRoZW4KKyAgICBEQVRBX0FERFI9LgorICBmaQorZmkKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCiske0xJQl9TRUFSQ0hfRElSU30KKworRU5UUlkoJHtFTlRSWX0pCisKK1NFQ1RJT05TCit7CisgIC8qIFdlIHN0YXJ0IGF0IDB4ODAwMCBiZWNhdXNlIGdkYiBhc3N1bWVzIGl0IChzZWUgRlJBTUVfQ0hBSU4pLgorICAgICBUaGlzIGlzIGFuIGFydGlmYWN0IG9mIHRoZSBBUk0gRGVtb24gbW9uaXRvciB1c2luZyB0aGUgYm90dG9tIDMyaworICAgICBhcyB3b3Jrc3BhY2UgKHNoYXJlZCB3aXRoIHRoZSBGUCBpbnN0cnVjdGlvbiBlbXVsYXRvciBpZgorICAgICBwcmVzZW50KTogKi8KKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDgwMDB9IDogeworICAgICooLmluaXQpCisgICAgKigudGV4dCkKKyAgICAqKC5nbHVlXzd0KQorICAgICooLmdsdWVfNykKKyAgICAqKC5yZGF0YSkKKyAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAorCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCisJCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQorICAgICooLmZpbmkpCisgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9CisgIH0KKyAgLmRhdGEgJHtSRUxPQ0FUSU5HKyR7REFUQV9BRERSLTB4NDAwMDAgKyAoLiAmIDB4ZmZmYzBmZmYpfX0gOiB7CisgICAgJHtSRUxPQ0FUSU5HKyAgX19kYXRhX3N0YXJ0X18gPSAuIDt9CisgICAgKiguZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrIF9fZGF0YV9lbmRfXyA9IC4gO30KKyAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSAgPSAgLjt9CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgorICB7IAkJCQkJCisgICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydF9fID0gLiA7fQorICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgICAke1JFTE9DQVRJTkcrIF9fYnNzX2VuZF9fID0gLiA7fQorICB9CisKKyAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KKyAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9CisgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQorCisgIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKKyAgeworICAgIFsgLnN0YWIgXQorICB9CisgIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgorICB7CisgICAgWyAuc3RhYnN0ciBdCisgIH0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYyBiL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5NjMwNQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MKQEAgLTAsMCArMSw0OSBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCitFTlRSWShfc3RhcnQpCiske1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQorCitTRUNUSU9OUworeworICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MjAwMCArIFNJWkVPRl9IRUFERVJTfSA6CisgICAgeworICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LnN0YXJ0ID0gLn07CisgICAgICAqKC50ZXh0KQorICAgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9CisgICAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLjt9CisgICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHQuZW5kID0gLn07CisgICAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQorICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQorICAgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KKyAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQorICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQorICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KKyAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9CisgICAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KKyAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KKyAgICB9CisgIC5kYXRhICR7UkVMT0NBVElORysgU0laRU9GKC50ZXh0KSArIEFERFIoLnRleHQpICsgMHg0MDAwMDB9IDoKKyAgICB7CisgICAgICAke1JFTE9DQVRJTkcrIF9fLmRhdGEuc3RhcnQgPSAufTsKKyAgICAgICooLmRhdGEpCisgICAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKKyAgICAgICR7UkVMT0NBVElORysgX2VkYXRhICA9ICAufTsKKyAgICAgICR7UkVMT0NBVElORysgX18uZGF0YS5lbmQgPSAufTsKKyAgICB9CisgIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKKyAgICB7IAkJCQkJCisgICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5zdGFydCA9IC59OworICAgICAgKiguYnNzKQorICAgICAgKihDT01NT04pCisgICAgICAke1JFTE9DQVRJTkcrIF9fLmJzcy5lbmQgPSAufTsKKyAgICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07CisgICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKKyAgICB9CisgIC5jb21tZW50ICR7UkVMT0NBVElORysgMH0gOgorICAgIHsKKyAgICAgICooLmNvbW1lbnQpCisgICAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYyBiL2xkL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDUwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYwpAQCAtMCwwICsxLDI3IEBACitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorRU5UUlkoc3RhcnQpCisKK1NFQ1RJT05TIHsKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiAKKyAgICB7CisJKigudGV4dCk7CisJJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OworICAgIH0KKyAgZGF0YSAke1JFTE9DQVRJTkcrMHg4MDAwMjAwMH0gOgorICAgIHsKKwkqKC5kYXRhKTsKKwkqKC5tc3RhY2spOyAKKwkqKC5zaGJzcyk7CisJKigucnN0YWNrKTsKKwkqKC5tc3RhY2spOworCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgICB9CisgIC5ic3MgIC4gOgorICAgIHsgCisJKihDT01NT04pIAkKKwkqKC5ic3MpOworCSR7UkVMT0NBVElORytfZW5kID0gLn07CisgICAgfSAKK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmLnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZmVhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9lbGYuc2MKQEAgLTAsMCArMSwyODYgQEAKKyMKKyMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6CisjCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCisjCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKKyMJSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyAtIGF0IHN0YXJ0IG9mIHRleHQgc2VnbWVudAorIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLnJvZGF0YSAuLi4KKyMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQorIwlPVEhFUl9URVhUX1NFQ1RJT05TIC0gdGhlc2UgZ2V0IHB1dCBpbiAudGV4dCB3aGVuIHJlbG9jYXRpbmcKKyMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5jdG9ycyAuc2RhdGEgLi4uCisjCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCisjCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAorIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgorIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKKyMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCisjCQkudGV4dCBzZWN0aW9uLgorIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKKyMJCS5kYXRhIHNlY3Rpb24uCisjCU9USEVSX0dPVF9TWU1CT0xTIC0gc3ltYm9scyBkZWZpbmVkIGp1c3QgYmVmb3JlIC5nb3QuCisjCU9USEVSX0dPVF9TRUNUSU9OUyAtIHNlY3Rpb25zIGp1c3QgYWZ0ZXIgLmdvdCBhbmQgLnNkYXRhLgorIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQorIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCisjCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgorIwlURVhUX0RZTkFNSUMgLSAuZHluYW1pYyBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuCisjCUVNQkVEREVEIC0gd2hldGhlciB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uIAorIwlTSExJQl9URVhUX1NUQVJUX0FERFIgLSBpZiBzZXQsIGFkZCB0byBTSVpFT0ZfSEVBREVSUyB0byBzZXQKKyMJCXN0YXJ0IGFkZHJlc3Mgb2Ygc2hhcmVkIGxpYnJhcnkuCisjCUlOUFVUX0ZJTEVTIC0gSU5QVVQgY29tbWFuZCBvZiBmaWxlcyB0byBhbHdheXMgaW5jbHVkZQorIworIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCisjIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KKyMKKwordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKK3Rlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Cit0ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQoraWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCit0ZXN0IC16ICIke0VMRlNJWkV9IiAmJiBFTEZTSVpFPTMyCit0ZXN0IC16ICIke0FMSUdOTUVOVH0iICYmIEFMSUdOTUVOVD0iJHtFTEZTSVpFfSAvIDgiCit0ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KK0lOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKK1BMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKK0RZTkFNSUM9Ii5keW5hbWljICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0iCisKK0NUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAorICB7CisgICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX1NUQVJUfX0KKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9FTkR9fQorICB9IgorCitEVE9SPSIgLmR0b3JzICAgICAgICR7Q09OU1RSVUNUSU5HLTB9IDoKKyAgeworICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9TVEFSVH19CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgICAke0NPTlNUUlVDVElORyske0RUT1JfRU5EfX0KKyAgfSIKKworIyBpZiB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIGRvbid0IGFkZCBTSVpFT0ZfSEVBREVSUy4KK2lmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgorICAgdGVzdCAteiAiJHtURVhUX0JBU0VfQUREUkVTU30iICYmIFRFWFRfQkFTRV9BRERSRVNTPSIke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUyIKK2Vsc2UKKyAgIHRlc3QgLXogIiR7VEVYVF9CQVNFX0FERFJFU1N9IiAmJiBURVhUX0JBU0VfQUREUkVTUz0iJHtURVhUX1NUQVJUX0FERFJ9IgorZmkKKworY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKKwkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pCitFTlRSWSgke0VOVFJZfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQorJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KKyR7UkVMT0NBVElORyske0lOUFVUX0ZJTEVTfX0KKyR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99CisKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9CQVNFX0FERFJFU1N9O319CisgICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gJHtTSExJQl9URVhUX1NUQVJUX0FERFI6LTB9ICsgU0laRU9GX0hFQURFUlM7fX0KKyAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQorICAke0lOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlN9CisgICR7VEVYVF9EWU5BTUlDKyR7RFlOQU1JQ319CisgIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQorICAuZ251LnZlcnNpb24gJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikJfQorICAuZ251LnZlcnNpb25fZCAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX2QpCX0KKyAgLmdudS52ZXJzaW9uX3IgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKQl9CisgIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgorICAgIHsKKyAgICAgICooLnJlbC50ZXh0KQorICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC50ZXh0LiopfQorICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UudCopfQorICAgIH0KKyAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6CisgICAgeworICAgICAgKigucmVsYS50ZXh0KQorICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEudGV4dC4qKX0KKyAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS50Kil9CisgICAgfQorICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDoKKyAgICB7CisgICAgICAqKC5yZWwuZGF0YSkKKyAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZGF0YS4qKX0KKyAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLmQqKX0KKyAgICB9CisgIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOgorICAgIHsKKyAgICAgICooLnJlbGEuZGF0YSkKKyAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmRhdGEuKil9CisgICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuZCopfQorICAgIH0KKyAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6CisgICAgeworICAgICAgKigucmVsLnJvZGF0YSkKKyAgICAgICR7UkVMT0NBVElORysqKC5yZWwucm9kYXRhLiopfQorICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbC5nbnUubGlua29uY2UuciopfQorICAgIH0KKyAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6CisgICAgeworICAgICAgKigucmVsYS5yb2RhdGEpCisgICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5yb2RhdGEuKil9CisgICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuciopfQorICAgIH0KKyAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuaW5pdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KQl9CisgIC5yZWxhLmluaXQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkJfQorICAucmVsLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkJfQorICAucmVsYS5maW5pICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KKyAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5pbml0KSkJfSA9JHtOT1AtMH0KKyAgJHtEQVRBX1BMVC0ke1BMVH19CisgIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQorICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9CisgICAgKiguc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnQqKX0KKyAgICAke1JFTE9DQVRJTkcrJHtPVEhFUl9URVhUX1NFQ1RJT05TfX0KKyAgfSA9JHtOT1AtMH0KKyAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQorICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9CisgIC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6IHsgS0VFUCAoKiguZmluaSkpCQl9ID0ke05PUC0wfQorICAucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOgorICB7CisgICAgKigucm9kYXRhKQorICAgICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9CisgICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5yKil9CisgIH0KKyAgLnJvZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGExKSB9CisgICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KKworICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoLiAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fX0KKyAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSAke1NITElCX0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoLiAmICgke01BWFBBR0VTSVpFfSAtIDEpKX07fX0KKworICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319CisgICAgKiguZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KKyAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLmQqKX0KKyAgICAke0NPTlNUUlVDVElORytTT1JUKENPTlNUUlVDVE9SUyl9CisgIH0KKyAgLmRhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKiguZGF0YTEpIH0KKyAgLmVoX2ZyYW1lIDogeyAqKC5laF9mcmFtZSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSA6IHsgKiguZ2NjX2V4Y2VwdF90YWJsZSkgfQorICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQorICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KKyAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19CisgICR7REFUQV9QTFQrJHtQTFR9fQorICAke1JFTE9DQVRJTkcrJHtPVEhFUl9HT1RfU1lNQk9MU319CisgIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQorICAke1RFWFRfRFlOQU1JQy0ke0RZTkFNSUN9fQorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpICooLnNkYXRhLiopIH0KKyAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfR09UX1NFQ1RJT05TfX0KKyAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KKyAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9CisgICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KKyAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9CisgIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KKyAgICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9CisgIH0KKyAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke0FMSUdOTUVOVH0pO30KKyAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9CisgICR7UkVMT0NBVElORyske09USEVSX0JTU19FTkRfU1lNQk9MU319CisgICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorCisgIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KKworICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisKKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKworICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisKKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorCisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisKKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKworICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TfX0KKworICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLworICAke09USEVSX1NFQ1RJT05TfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjIGIvbGQvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJlZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYwpAQCAtMCwwICsxLDIyNiBAQAorIworIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKKyMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKKyMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAorIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLnJvZGF0YSAuLi4KKyMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQorIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KKyMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKKyMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCisjCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCisjCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQorIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKKyMJCS50ZXh0IHNlY3Rpb24uCisjCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQorIwkJLmRhdGEgc2VjdGlvbi4KKyMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKKyMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgorIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KKyMJRU1CRURERUQgLSB3aGV0aGVyIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gCisjCisjIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKKyMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgorIwordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKK3Rlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Cit0ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQoraWYgWyAteiAiJE1BQ0hJTkUiIF07IHRoZW4gT1VUUFVUX0FSQ0g9JHtBUkNIfTsgZWxzZSBPVVRQVVRfQVJDSD0ke0FSQ0h9OiR7TUFDSElORX07IGZpCit0ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KK0lOVEVSUD0iLmludGVycCAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSAJfSIKK1BMVD0iLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnBsdCkJfSIKKworCitDVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKKyAgeworICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KKyAgfSIKKworRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6CisgIHsKKyAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQorICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19CisgIH0iCisKKworIyBpZiB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0sIGRvbid0IGFkZCBTSVpFT0ZfSEVBREVSUy4KK2lmIFsgLXogIiRFTUJFRERFRCIgXTsgdGhlbgorICAgdGVzdCAteiAiJHtSRUFET05MWV9CQVNFX0FERFJFU1N9IiAmJiBSRUFET05MWV9CQVNFX0FERFJFU1M9IiR7UkVBRE9OTFlfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUyIKK2Vsc2UKKyAgIHRlc3QgLXogIiR7UkVBRE9OTFlfQkFTRV9BRERSRVNTfSIgJiYgUkVBRE9OTFlfQkFTRV9BRERSRVNTPSIke1JFQURPTkxZX1NUQVJUX0FERFJ9IgorZmkKKworY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKKwkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pCitFTlRSWSgke0VOVFJZfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQorJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KKyR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1JFQURPTkxZX0JBU0VfQUREUkVTU307fX0KKyAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQorICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19CisgIC5oYXNoICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuaW5pdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5pbml0KQl9CisgIC5yZWxhLmluaXQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkJfQorICAucmVsLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZmluaSkJfQorICAucmVsYS5maW5pICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KKyAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQorICAke0RBVEFfUExULSR7UExUfX0KKyAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICooLmdudS5saW5rb25jZS5yKikgfQorICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KKyAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQorCisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gICovCisgICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItQUxJR04oNCk7fX0KKworICAuZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICR7UkVMT0NBVElORyske0RBVEFfU1RBUlRfU1lNQk9MU319CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhLiopCisgICAgKiguZ251LmxpbmtvbmNlLmQqKQorICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgfQorICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQorICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQorICAke1JFTE9DQVRJTkcrJHtDVE9SfX0KKyAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19CisgIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQorICAuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9CisgICR7REFUQV9QTFQrJHtQTFR9fQorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KKyAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KKyAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9CisgICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KKyAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9CisgIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgICR7UkVMT0NBVElORytfZW5kID0gLiA7fQorICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQorCisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKworICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CisKKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisKKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorCisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKworICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorCisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisKKyAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVMT0NBVElOR19TRUNUSU9OU319CisKKyAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KKyAgJHtPVEhFUl9TRUNUSU9OU30KKworCisgIC8qIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCisgICAgIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoaS5lLiB0b3Agb2YgNjRLIGRhdGEgc3BhY2UpLiAqLworICAuc3RhY2sgMHgwMDAwN0ZGRSA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0KKworICAudGV4dCAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQorICAgIEtFRVAgKCooLmluaXQpKQorICAgIEtFRVAgKCooLmZpbmkpKQorICAgICooLnRleHQpCisgICAgKigudGV4dC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICAgICooLmdudS5saW5rb25jZS50KikKKyAgfSA9JHtOT1AtMH0KKyAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQorICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjkyODMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjCkBAIC0wLDAgKzEsMjE5IEBACisKK0NUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAorICB7CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuOyB9CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjsgfQorICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0iCisKK0RUT1I9IiAgLmR0b3JzCSR7Q09OU1RSVUNUSU5HLTB9IDoKKyAgeworICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjsgfQorICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47IH0KKyAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19IgorCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworTUVNT1JZCit7CisgIHRleHQgJHtURVhUX0RFRl9TRUNUSU9OfSA6IE9SSUdJTiA9ICR7VEVYVF9TVEFSVF9BRERSfSwgTEVOR1RIID0gJHtURVhUX1NJWkV9CisgIGRhdGEgJHtEQVRBX0RFRl9TRUNUSU9OfSA6IE9SSUdJTiA9ICR7REFUQV9TVEFSVF9BRERSfSwgTEVOR1RIID0gJHtEQVRBX1NJWkV9CisgIGVtZW0gJHtFTUVNX0RFRl9TRUNUSU9OfSA6IE9SSUdJTiA9ICR7RU1FTV9TVEFSVF9BRERSfSwgTEVOR1RIID0gJHtFTUVNX1NJWkV9CisgIGVpdAkJCSAgIDogT1JJR0lOID0gJHtFSVRfU1RBUlRfQUREUn0sICBMRU5HVEggPSAke0VJVF9TSVpFfQorfQorCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgJHtURVhUX0RZTkFNSUMrJHtEWU5BTUlDfX0KKyAgLmhhc2gJCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpIH0KKyAgLmR5bnN5bQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0cgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fcgkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKworICAucmVsYS50ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEudGV4dCkgKigucmVsYS5nbnUubGlua29uY2UudCopIH0KKyAgLnJlbGEuZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLmQqKSB9CisgIC5yZWxhLnJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnJvZGF0YSkgKigucmVsYS5nbnUubGlua29uY2UuciopIH0KKyAgLnJlbGEuc3RleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zdGVzdCkgfQorICAucmVsYS5ldGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmV0ZXN0KSB9CisgIC5yZWxhLnNkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2RhdGEpIH0KKyAgLnJlbGEuZWRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5lZGF0YSkgfQorICAucmVsYS5laXRfdgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVpdF92KSB9CisgIC5yZWxhLnNic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zYnNzKSB9CisgIC5yZWxhLmVic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5lYnNzKSB9CisgIC5yZWxhLnNyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zcm9kYXRhKSB9CisgIC5yZWxhLmVyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5lcm9kYXRhKSB9CisgIC5yZWxhLmdvdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5jdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuaW5pdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEuYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWxhLnBsdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkgfQorCisgIC5yZWwuZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZGF0YSkgKigucmVsLmdudS5saW5rb25jZS5kKikgfQorICAucmVsLnJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucm9kYXRhKSAqKC5yZWwuZ251LmxpbmtvbmNlLnIqKSB9CisgIC5yZWwuc3RleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnN0ZXN0KSB9CisgIC5yZWwuZXRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmV0ZXN0KSB9CisgIC5yZWwuc2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNkYXRhKSB9CisgIC5yZWwuZWRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVkYXRhKSB9CisgIC5yZWwuc2JzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc2JzcykgfQorICAucmVsLmVic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVic3MpIH0KKyAgLnJlbC5laXRfdgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZWl0X3YpIH0KKyAgLnJlbC5zcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zcm9kYXRhKSB9CisgIC5yZWwuZXJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZXJvZGF0YSkgfQorICAucmVsLmdvdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KSB9CisgIC5yZWwuY3RvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuaW5pdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLmZpbmkJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5ic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykgfQorICAucmVsLnBsdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KSB9CisKKyAgLmluaXQJCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmluaXQpIH0gPSR7Tk9QLTB9CisgICR7REFUQV9QTFQtJHtQTFR9fQorCisgIC8qIEludGVybmFsIHRleHQgc3BhY2UgKi8KKyAgLnN0ZXh0CSR7UkVMT0NBVElORy0wfSA6IHsgKiguc3RleHQpIH0JCSR7UkVMT0NBVElORysgPiB0ZXh0fQorCisgIC8qIEludGVybmFsIHRleHQgc3BhY2Ugb3IgZXh0ZXJuYWwgbWVtb3J5ICovCisgIC50ZXh0IDoKKyAgeworICAgICooLnRleHQpCisgICAgKiguZ251LmxpbmtvbmNlLnQqKQorICAgICooLmluaXQpCisgICAgKiguZmluaSkKKyAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9CisgIH0gJHtSRUxPQ0FUSU5HKyA+ICR7VEVYVF9NRU1PUll9fQorCisgIC8qIEludGVybmFsIGRhdGEgc3BhY2UgKi8KKyAgLnNyb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zcm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiBkYXRhfQorICAuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgfQkJJHtSRUxPQ0FUSU5HKyA+IGRhdGF9CisKKyAgLyogSW50ZXJuYWwgZGF0YSBzcGFjZSBvciBleHRlcm5hbCBtZW1vcnkgKi8KKyAgLnJvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19CisKKyAgLyogQysrIGV4Y2VwdGlvbiBzdXBwb3J0LiAgKi8KKyAgLmVoX2ZyYW1lCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZWhfZnJhbWUpIH0JJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQorCisgICR7UkVMT0NBVElORyske0NUT1J9fQorICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KKworICAuZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZ251LmxpbmtvbmNlLmQqKQorICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9CisgIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQorCisgIC8qIEV4dGVybmFsIG1lbW9yeSAqLworICAuZXRleHQJJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ldGV4dF9zdGFydCA9IC4pIDsgfQorICAgICooLmV0ZXh0KQorICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ldGV4dF9lbmQgPSAuKSA7IH0KKyAgfSAke1JFTE9DQVRJTkcrID4gZW1lbX0KKworICAuZXJvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVyb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+IGVtZW19CisgIC5lZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVkYXRhKSB9CQkke1JFTE9DQVRJTkcrID4gZW1lbX0KKworICAuc2JzcwkJJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19zYnNzX3N0YXJ0ID0gLikgOyB9CisgICAgKiguc2JzcykKKyAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc2Jzc19lbmQgPSAuKSA7ICB9CisgIH0gJHtSRUxPQ0FUSU5HKyA+IGRhdGF9CisKKyAgLmVic3MJCSR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWJzc19zdGFydCA9IC4pIDsgfQorICAgICooLmVic3MpCisgICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Vic3NfZW5kID0gLikgOyAgfQorICB9ICR7UkVMT0NBVElORysgPiBkYXRhfQorCisgIC5ic3MJCSR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fYnNzX3N0YXJ0ID0gLikgOyB9CisgICAgKiguYnNzKQorICAgICooQ09NTU9OKQorICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ic3NfZW5kID0gLikgOyB9CisgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9CisgIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQorCisgIC5laXRfdgkke1JFTE9DQVRJTkctMH0gOgorICB7CisgICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2VpdF9zdGFydCA9IC4pIDsgfQorICAgICooLmVpdF92KQorICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19laXRfZW5kID0gLikgOyB9CisgIH0gJHtSRUxPQ0FUSU5HKyA+IGVpdH0KKworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYgkJIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIJIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbAkgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIJIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleAkgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisKKyAgLmNvbW1lbnQJIDAgOiB7ICooLmNvbW1lbnQpIH0KKworICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisKKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcJIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lCQkgMCA6IHsgKigubGluZSkgfQorCisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisKKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorCisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisKKyAgUFJPVklERSAoX19zdGFjayA9ICR7U1RBQ0tfU1RBUlRfQUREUn0pOworfQorRU9GCisKKworCisKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGFiOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvZWxmcHBjLnNjCkBAIC0wLDAgKzEsMjg4IEBACisjCisjIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgorIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQorIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0CisjCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgorIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCisjCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgorIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQorIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKKyMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KKyMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCisjCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQorIwkJLnRleHQgc2VjdGlvbi4KKyMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCisjCQkuZGF0YSBzZWN0aW9uLgorIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQorIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCisjCisjIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKKyMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgorIwordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKK3Rlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Cit0ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQordGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCitTQlNTMj0iLnNic3MyICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzczIpIH0iCitTREFUQTI9Ii5zZGF0YTIgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YTIpIH0iCitJTlRFUlA9Ii5pbnRlcnAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIH0iCitQTFQ9Ii5wbHQgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpIH0iCitDVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKKyAgeworICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KKyAgfSIKKworRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6CisgIHsKKyAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQorICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19CisgIH0iCisKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCisJICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCitFTlRSWSgke0VOVFJZfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQorJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KKyR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99CisKKyR7UkVMT0NBVElORytQUk9WSURFIChfX3N0YWNrID0gMCk7fQorJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX3N0YWNrID0gMCk7fQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgICR7Q1JFQVRFX1NITElCLSR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlM7fX0KKyAgJHtDUkVBVEVfU0hMSUIrJHtSRUxPQ0FUSU5HKy4gPSBTSVpFT0ZfSEVBREVSUzt9fQorICAke0NSRUFURV9TSExJQi0ke0lOVEVSUH19CisgIC5oYXNoCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0JJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9CisgIC5nbnUudmVyc2lvbiAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKSAgICAgIH0KKyAgLmdudS52ZXJzaW9uX2QgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKSAgfQorICAuZ251LnZlcnNpb25fciAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpICB9CisgIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOgorICAgIHsKKyAgICAgICooLnJlbGEudGV4dCkKKyAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnRleHQuKil9CisgICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UudCopfQorICAgIH0KKyAgLnJlbGEuZGF0YSAgICR7UkVMT0NBVElORy0wfSA6CisgICAgeworICAgICAgKigucmVsYS5kYXRhKQorICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZGF0YS4qKX0KKyAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5kKil9CisgICAgfQorICAucmVsYS5yb2RhdGEgJHtSRUxPQ0FUSU5HLTB9IDoKKyAgICB7CisgICAgICAqKC5yZWxhLnJvZGF0YSkKKyAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnJvZGF0YS4qKX0KKyAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmdudS5saW5rb25jZS5yKil9CisgICAgfQorICAucmVsYS5nb3QJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJfQorICAucmVsYS5nb3QxCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QxKQl9CisgIC5yZWxhLmdvdDIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdDIpCX0KKyAgLnJlbGEuY3RvcnMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWxhLmR0b3JzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsYS5pbml0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9CisgIC5yZWxhLmZpbmkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpCX0KKyAgLnJlbGEuYnNzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCX0KKyAgLnJlbGEucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCX0KKyAgLnJlbGEuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNkYXRhKQl9CisgIC5yZWxhLnNic3MJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MpCX0KKyAgLnJlbGEuc2RhdGEyCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YTIpCX0KKyAgLnJlbGEuc2JzczIJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnNic3MyKQl9CisgIC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX1NZTUJPTFN9fQorICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9CisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9CisgIH0gPSR7Tk9QLTB9CisgIC5pbml0CQkke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmluaXQpKQl9ID0ke05PUC0wfQorICAuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5maW5pKSkJfSA9JHtOT1AtMH0KKyAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfQorICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuciopfQorICB9CisgIC5yb2RhdGExCSR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQorICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KKyAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZXRleHQgPSAuKTt9CisgICR7Q1JFQVRFX1NITElCLSR7U0RBVEEyfX0KKyAgJHtDUkVBVEVfU0hMSUItJHtTQlNTMn19CisgICR7UkVMT0NBVElORyske09USEVSX1JFQURPTkxZX1NFQ1RJT05TfX0KKworICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGQKKyAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6CisgICAgICAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTigke01BWFBBR0VTSVpFfSkgKyAoQUxJR04oOCkgJiAoJHtNQVhQQUdFU0laRX0gLSAxKSl9O30KKyAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGEKKyAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGUKKyAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZQorICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlCisgICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuCisgICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmcKKyAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmUKKyAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlCisgICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3QKKyAgICAgYmUgcmVmZXJlbmNlZCkuICAqLworICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9CisKKyAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQorICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HKyooLmRhdGEuKil9CisgICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5kKil9CisgICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQorICB9CisgIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9CisgICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319CisKKyAgLmdvdDEJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290MSkgfQorICAuZHluYW1pYwkke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KKworICAvKiBQdXQgLmN0b3JzIGFuZCAuZHRvcnMgbmV4dCB0byB0aGUgLmdvdDIgc2VjdGlvbiwgc28gdGhhdCB0aGUgcG9pbnRlcnMKKyAgICAgZ2V0IHJlbG9jYXRlZCB3aXRoIC1tcmVsb2NhdGFibGUuIEFsc28gcHV0IGluIHRoZSAuZml4dXAgcG9pbnRlcnMuCisgICAgIFRoZSBjdXJyZW50IGNvbXBpbGVyIG5vIGxvbmdlciBuZWVkcyB0aGlzLCBidXQga2VlcCBpdCBhcm91bmQgZm9yIDIuNy4yICAqLworCisJCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UMl9TVEFSVF8gPSAuKTt9CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfU1RBUlRfID0gLik7fQorICAuZ290MgkJJHtSRUxPQ0FUSU5HLTB9IDogIHsgKiguZ290MikgfQorCisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfTElTVF9fID0gLik7fQorCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fQ1RPUl9MSVNUX18gPSAuKTt9CisgICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0NUT1JfRU5EX18gPSAuKTt9CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX19DVE9SX0VORF9fID0gLik7fQorCisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfTElTVF9fID0gLik7fQorCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fRFRPUl9MSVNUX18gPSAuKTt9CisgICAgICAgICAgICAgICAgJHtSRUxPQ0FUSU5HKyR7RFRPUn19CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0RUT1JfRU5EX18gPSAuKTt9CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX19EVE9SX0VORF9fID0gLik7fQorCisJCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfU1RBUlRfID0gLik7fQorCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19GSVhVUF9TVEFSVF8gPSAuKTt9CisgIC5maXh1cAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpeHVwKSB9CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfRklYVVBfRU5EXyA9IC4pO30KKwkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRklYVVBfRU5EXyA9IC4pO30KKwkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1QyX0VORF8gPSAuKTt9CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVDJfRU5EXyA9IC4pO30KKworCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9TVEFSVF8gPSAuKTt9CisJCSR7UkVMT0NBVElORytQUk9WSURFIChfX0dPVF9TVEFSVF8gPSAuKTt9CisgIC5nb3QJCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290KSB9CisgIC5nb3QucGx0CSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgfQorICAke0NSRUFURV9TSExJQiske1NEQVRBMn19CisgICR7Q1JFQVRFX1NITElCKyR7U0JTUzJ9fQorCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVF9FTkRfID0gLik7fQorCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1RfRU5EXyA9IC4pO30KKworICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9CisgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQorICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChfX2VkYXRhID0gLik7fQorICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOgorICB7CisgICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc2Jzc19zdGFydCA9IC4pO30KKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19zdGFydCA9IC4pO30KKyAgICAqKC5zYnNzKQorICAgICooLnNjb21tb24pCisgICAgKiguZHluc2JzcykKKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19zYnNzX2VuZCA9IC4pO30KKyAgICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fc2Jzc19lbmQgPSAuKTt9CisgIH0KKyAgJHtQTFR9CisgIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6CisgIHsKKyAgICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KKyAgICR7UkVMT0NBVElORytQUk9WSURFIChfX2Jzc19zdGFydCA9IC4pO30KKyAgICR7UkVMT0NBVElORytQUk9WSURFIChfX19ic3Nfc3RhcnQgPSAuKTt9CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KKyAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KKyAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZW5kID0gLik7fQorCisgIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbgorICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLworICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KKworICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisKKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKworICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisKKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorCisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisKKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKworICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLworICAke09USEVSX1NFQ1RJT05TfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9nbzMyY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2dvMzJjb2ZmLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9nbzMyY29mZi5zYwpAQCAtMCwwICsxLDMzIEBACisjIExpbmtlciBzY3JpcHQgZm9yIDM4NiBnbzMyCisjIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKKwordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1zdGFydAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDArU0laRU9GX0hFQURFUlN9IDogeworICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLiA7IF9ldGV4dCA9IC59OworICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDB4MjAwKTt9CisgIH0KKyAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAke0RBVEFfQUxJR05NRU5UfX0gOiB7CisgICAgJHtSRUxPQ0FUSU5HKyAqKC5jdG9yKX0KKyAgICAke1JFTE9DQVRJTkcrICooLmR0b3IpfQorICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLiA7IF9lZGF0YSA9IC59OworICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDB4MjAwKTt9CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgorICB7IAkJCQkJCisgICAgKiguYnNzKQorICAgICooQ09NTU9OKQorICAgICR7UkVMT0NBVElORysgZW5kID0gLiA7IF9lbmQgPSAufTsKKyAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigweDIwMCk7fQorICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmODc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2g4MzAwLnNjCkBAIC0wLDAgKzEsNjkgQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCitPVVRQVVRfQVJDSCgke0FSQ0h9KQorRU5UUlkoIl9zdGFydCIpCisKK01FTU9SWQoreworCS8qIDB4YzQgaXMgYSBtYWdpYyBlbnRyeS4gIFdlIHNob3VsZCBoYXZlIHRoZSBsaW5rZXIganVzdAorCSAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCisJdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0CisJbWFnaWN2ZWN0b3JzIDogbyA9IDB4YzQsIGwgPSAweDNjCisJcmFtICAgIDogbyA9IDB4MDEwMCwgbCA9IDB4ZmRmYworCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCisJdG9wcmFtIDogbyA9IDB4ZmVmYywgbCA9IDB4NAorCS8qIEF0IHRoZSB2ZXJ5IHRvIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHRoZSA4LWJpdCBhcmVhLiAgKi8KKwllaWdodCA6IG8gPSAweGZmMDAsIGwgPSAweDEwMAorfQorCitTRUNUSU9OUyAJCQkJCit7IAkJCQkJCisudmVjdG9ycyA6IHsKKwkvKiBVc2Ugc29tZXRoaW5nIGxpa2UgdGhpcyB0byBwbGFjZSBhIHNwZWNpZmljIGZ1bmN0aW9uJ3MgYWRkcmVzcworCSAgIGludG8gdGhlIHZlY3RvciB0YWJsZS4gCisKKwlTSE9SVChBQlNPTFVURShfZm9vYmFyKSkgKi8KKworCSooLnZlY3RvcnMpCisgICAgICAgIH0gJHtSRUxPQ0FUSU5HKyA+IHZlY3RvcnN9CisKKy50ZXh0IDoJeyAJCQkJCQorCSooLnJvZGF0YSkgCQkJCQorCSooLnRleHQpIAkJCQkKKwkqKC5zdHJpbmdzKQorICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KKwl9ICR7UkVMT0NBVElORysgPiByYW19CisudG9ycyA6IHsKKwlfX19jdG9ycyA9IC4gOworCSooLmN0b3JzKQorCV9fX2N0b3JzX2VuZCA9IC4gOworCV9fX2R0b3JzID0gLiA7CisJKiguZHRvcnMpCisJX19fZHRvcnNfZW5kID0gLiA7CisJfSAke1JFTE9DQVRJTkcrID4gcmFtfQorLmRhdGEgOiB7CisJKiguZGF0YSkKKwkqKC50aW55KQorCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KKwl9ICR7UkVMT0NBVElORysgPiByYW19CisuYnNzIDogeworCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KKwkqKC5ic3MpCisJKihDT01NT04pCisJJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9CisJfSAke1JFTE9DQVRJTkcrID5yYW19Cisuc3RhY2sgOiB7CisJJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQorCSooLnN0YWNrKQorCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KKy5laWdodCA6IHsKKwkqKC5laWdodCkKKwl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KKy5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKKwlbIC5zdGFiIF0KKwl9Cisuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7CisJWyAuc3RhYnN0ciBdCisJfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjZmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2g4MzAwaC5zYwpAQCAtMCwwICsxLDc2IEBACitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goaDgzMDBoKQorRU5UUlkoIl9zdGFydCIpCisKKy8qIFRoZSBtZW1vcnkgc2l6ZSBpcyAyNTZLQiB0byBjb2luY2lkZSB3aXRoIHRoZSBzaW11bGF0b3IuCisgICBEb24ndCBjaGFuZ2UgZWl0aGVyIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyLiAgKi8KKworTUVNT1JZCit7CisgICAgICAgIC8qIDB4YzQgaXMgYSBtYWdpYyBlbnRyeS4gIFdlIHNob3VsZCBoYXZlIHRoZSBsaW5rZXIganVzdAorICAgICAgICAgICBza2lwIG92ZXIgaXQgb25lIGRheS4uLiAqLworICAgICAgICB2ZWN0b3JzIDogbyA9IDB4MDAwMCwgbCA9IDB4YzQKKyAgICAgICAgbWFnaWN2ZWN0b3JzIDogbyA9IDB4YzQsIGwgPSAweDNjCisJLyogV2Ugc3RpbGwgb25seSB1c2UgMjU2ayBhcyB0aGUgbWFpbiByYW0gc2l6ZS4gICovCisJcmFtICAgIDogbyA9IDB4MDEwMCwgbCA9IDB4M2ZlZmMKKwkvKiBUaGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3Agb2YgbWFpbiByYW0uICAqLworCXRvcHJhbSA6IG8gPSAweDNmZmZjLCBsID0gMHg0CisJLyogVGhpcyBob2xkcyB2YXJpYWJsZXMgaW4gdGhlICJ0aW55IiBzZWN0aW9ucy4gICovCisJdGlueSAgIDogbyA9IDB4ZmY4MDAwLCBsID0gMHg3ZjAwCisJLyogQXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHRoZSA4LWJpdCBhcmVhLiAgKi8KKwllaWdodCAgOiBvID0gMHhmZmZmMDAsIGwgPSAweDEwMAorfQorCitTRUNUSU9OUyAJCQkJCit7IAkJCQkJCisudmVjdG9ycyA6IHsKKwkvKiBVc2Ugc29tZXRoaW5nIGxpa2UgdGhpcyB0byBwbGFjZSBhIHNwZWNpZmljIGZ1bmN0aW9uJ3MgYWRkcmVzcworCSAgIGludG8gdGhlIHZlY3RvciB0YWJsZS4KKworCUxPTkcoQUJTT0xVVEUoX2Zvb2JhcikpICovCisKKwkqKC52ZWN0b3JzKQorCX0gJHtSRUxPQ0FUSU5HKyA+IHZlY3RvcnN9CisudGV4dCA6CXsgCQkJCQkKKwkqKC5yb2RhdGEpIAkJCQkKKwkqKC50ZXh0KSAJCQkJCisJKiguc3RyaW5ncykKKyAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9CisJfSAke1JFTE9DQVRJTkcrID4gcmFtfQorLnRvcnMgOiB7CisJX19fY3RvcnMgPSAuIDsKKwkqKC5jdG9ycykKKwlfX19jdG9yc19lbmQgPSAuIDsKKwlfX19kdG9ycyA9IC4gOworCSooLmR0b3JzKQorCV9fX2R0b3JzX2VuZCA9IC4gOworCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKy5kYXRhIDogeworCSooLmRhdGEpCisJJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQorCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKy5ic3MgOiB7CisJJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7fQorCSooLmJzcykKKwkqKENPTU1PTikKKwkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KKwl9ICR7UkVMT0NBVElORysgPnJhbX0KKy5zdGFjayA6IHsKKwkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9CisJKiguc3RhY2spCisJfSAke1JFTE9DQVRJTkcrID4gdG9wcmFtfQorLnRpbnkgOiB7CisJKigudGlueSkKKwl9ICR7UkVMT0NBVElORysgPiB0aW55fQorLmVpZ2h0IDogeworCSooLmVpZ2h0KQorCX0gJHtSRUxPQ0FUSU5HKyA+IGVpZ2h0fQorLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeworCVsgLnN0YWIgXQorCX0KKy5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKKwlbIC5zdGFic3RyIF0KKwl9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4MzAwcy5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3NGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjCkBAIC0wLDAgKzEsNzYgQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCitPVVRQVVRfQVJDSChoODMwMHMpCitFTlRSWSgiX3N0YXJ0IikKKworLyogVGhlIG1lbW9yeSBzaXplIGlzIDI1NktCIHRvIGNvaW5jaWRlIHdpdGggdGhlIHNpbXVsYXRvci4KKyAgIERvbid0IGNoYW5nZSBlaXRoZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3RoZXIuICAqLworCitNRU1PUlkKK3sKKyAgICAgICAgLyogMHhjNCBpcyBhIG1hZ2ljIGVudHJ5LiAgV2Ugc2hvdWxkIGhhdmUgdGhlIGxpbmtlciBqdXN0CisgICAgICAgICAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCisgICAgICAgIHZlY3RvcnMgOiBvID0gMHgwMDAwLCBsID0gMHhjNAorICAgICAgICBtYWdpY3ZlY3RvcnMgOiBvID0gMHhjNCwgbCA9IDB4M2MKKwkvKiBXZSBzdGlsbCBvbmx5IHVzZSAyNTZrIGFzIHRoZSBtYWluIHJhbSBzaXplLiAgKi8KKwlyYW0gICAgOiBvID0gMHgwMTAwLCBsID0gMHgzZmVmYworCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCisJdG9wcmFtIDogbyA9IDB4M2ZmZmMsIGwgPSAweDQKKwkvKiBUaGlzIGhvbGRzIHZhcmlhYmxlcyBpbiB0aGUgInRpbnkiIHNlY3Rpb25zLiAgKi8KKwl0aW55ICAgOiBvID0gMHhmZjgwMDAsIGwgPSAweDdmMDAKKwkvKiBBdCB0aGUgdmVyeSB0b3Agb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgdGhlIDgtYml0IGFyZWEuICAqLworCWVpZ2h0ICA6IG8gPSAweGZmZmYwMCwgbCA9IDB4MTAwCit9CisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy52ZWN0b3JzIDogeworCS8qIFVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHBsYWNlIGEgc3BlY2lmaWMgZnVuY3Rpb24ncyBhZGRyZXNzCisJICAgaW50byB0aGUgdmVjdG9yIHRhYmxlLgorCisJTE9ORyhBQlNPTFVURShfZm9vYmFyKSkgKi8KKworCSooLnZlY3RvcnMpCisJfSAke1JFTE9DQVRJTkcrID4gdmVjdG9yc30KKy50ZXh0IDoJeyAJCQkJCQorCSooLnJvZGF0YSkgCQkJCQorCSooLnRleHQpIAkJCQkKKwkqKC5zdHJpbmdzKQorICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KKwl9ICR7UkVMT0NBVElORysgPiByYW19CisudG9ycyA6IHsKKwlfX19jdG9ycyA9IC4gOworCSooLmN0b3JzKQorCV9fX2N0b3JzX2VuZCA9IC4gOworCV9fX2R0b3JzID0gLiA7CisJKiguZHRvcnMpCisJX19fZHRvcnNfZW5kID0gLiA7CisJfSAke1JFTE9DQVRJTkcrID4gcmFtfQorLmRhdGEgOiB7CisJKiguZGF0YSkKKwkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9CisJfSAke1JFTE9DQVRJTkcrID4gcmFtfQorLmJzcyA6IHsKKwkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDt9CisJKiguYnNzKQorCSooQ09NTU9OKQorCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQorCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQorLnN0YWNrIDogeworCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KKwkqKC5zdGFjaykKKwl9ICR7UkVMT0NBVElORysgPiB0b3ByYW19CisudGlueSA6IHsKKwkqKC50aW55KQorCX0gJHtSRUxPQ0FUSU5HKyA+IHRpbnl9CisuZWlnaHQgOiB7CisJKiguZWlnaHQpCisJfSAke1JFTE9DQVRJTkcrID4gZWlnaHR9Cisuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7CisJWyAuc3RhYiBdCisJfQorLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeworCVsgLnN0YWJzdHIgXQorCX0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmEzOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDAuc2MKQEAgLTAsMCArMSw2MiBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCisKKy8qIENvZGUgYW5kIGRhdGEgNjRrIHRvdGFsICovCisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0ICR7UkVMT0NBVElORysgMHgwMDAwIH0gOgorCXsgCQkJCQkKKwkgICooLnRleHQpIAkJCQkKKworICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9CisJfQorCisKKy5kYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6CisJeworCSooLmRhdGEpCisJJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQorCX0gCisKKy5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgorCXsKKwkqKC5yZGF0YSk7IAorCSAgKiguc3RyaW5ncykKKwlfX19jdG9ycyA9IC4gOworCSooLmN0b3JzKQorCV9fX2N0b3JzX2VuZCA9IC4gOworCV9fX2R0b3JzID0gLiA7CisJKiguZHRvcnMpCisJX19fZHRvcnNfZW5kID0gLiA7Cit9IAorCisuYnNzICAke1JFTE9DQVRJTkcrIC4gfSA6CisJeworCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQorCSooLmJzcykKKwkqKENPTU1PTikKKwkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KKwl9CisKKy5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweGZmZjB9IDoKKwl7CisJJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQorCSooLnN0YWNrKQorCX0gCisKKyAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAorICB7CisgICAgWyAuc3RhYiBdCisgIH0KKyAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFic3RyIF0KKyAgfQorfQorRU9GCisKKworCisKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVmYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBiLnNjCkBAIC0wLDAgKzEsNjIgQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCitPVVRQVVRfQVJDSCgke0FSQ0h9KQorCisvKiBDb2RlIGFuZCBkYXRhLCBib3RoIGxhcmdlciB0aGFuIDY0ayAqLworCitTRUNUSU9OUyAJCQkJCit7IAkJCQkJCisudGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDB9IDoKKwl7IAkJCQkJCisJICAqKC50ZXh0KSAJCQkJCisKKyAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQorCX0KKworCisuZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwfSA6CisJeworCSooLmRhdGEpCisJJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQorCX0gCisKKy5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDMwMDAwfSA6CisJeworCSooLnJkYXRhKTsgCisJICAqKC5zdHJpbmdzKQorCV9fX2N0b3JzID0gLiA7CisJKiguY3RvcnMpCisJX19fY3RvcnNfZW5kID0gLiA7CisJX19fZHRvcnMgPSAuIDsKKwkqKC5kdG9ycykKKwlfX19kdG9yc19lbmQgPSAuIDsKK30gCisKKy5ic3MgICR7UkVMT0NBVElORysgMHg0MDAwMH0gOgorCXsKKwkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KKwkqKC5ic3MpCisJKihDT01NT04pCisJJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9CisJfQorCisuc3RhY2sgICR7UkVMT0NBVElORysgMHg1MDAwMH0gOgorCXsKKwkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9CisJKiguc3RhY2spCisJfSAKKworICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9Cit9CitFT0YKKworCisKKwpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBjLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODgwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MKQEAgLTAsMCArMSw1OSBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCisKKy8qIENvbXBhY3QgbW9kZWwgLSBjb2RlIDwgNjRrLCBkYXRhID4gNjRrICovCisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0IDB4MTAwMDAgOgorCXsgCQkJCQkKKwkgICooLnRleHQpIAkJCQkKKwkgICooLnN0cmluZ3MpCisgICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KKwl9ICR7UkVMT0NBVElORysgPiByYW19CisKKworLmRhdGEgMHgyMDAwMCA6CisJeworCSooLmRhdGEpCisJJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQorCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKworLnJkYXRhIDB4MzAwMDAgIDogeworCSooLnJkYXRhKTsgCisJX19fY3RvcnMgPSAuIDsKKwkqKC5jdG9ycykKKwlfX19jdG9yc19lbmQgPSAuIDsKKwlfX19kdG9ycyA9IC4gOworCSooLmR0b3JzKQorCV9fX2R0b3JzX2VuZCA9IC4gOworfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKworLmJzcyAgMHg0MDAwMCA6CisJeworCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQorCSooLmJzcykKKwkqKENPTU1PTikKKwkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KKwl9ICR7UkVMT0NBVElORysgPnJhbX0KKy5zdGFjayAweDVmZmYwIDoKKwl7CisJJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQorCSooLnN0YWNrKQorCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KKworICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9Cit9CitFT0YKKworCisKKwpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MGE0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMG0uc2MKQEAgLTAsMCArMSw2MSBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCisKKy8qIENvZGUgYW5kIGRhdGEsIGJvdGggbGFyZ2VyIHRoYW4gNjRrICovCisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMH0gOgorCXsgCQkJCQkKKwkgICooLnRleHQpIAkJCQkKKyAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQorCX0KKworCisuZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwfSA6CisJeworCSooLmRhdGEpCisJJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQorCX0gCisKKy5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgorCXsKKwkqKC5yZGF0YSk7IAorCSAgKiguc3RyaW5ncykKKwlfX19jdG9ycyA9IC4gOworCSooLmN0b3JzKQorCV9fX2N0b3JzX2VuZCA9IC4gOworCV9fX2R0b3JzID0gLiA7CisJKiguZHRvcnMpCisJX19fZHRvcnNfZW5kID0gLiA7CisJfSAKKworLmJzcyAgJHtSRUxPQ0FUSU5HKyAuIH0gOgorCXsKKwkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KKwkqKC5ic3MpCisJKihDT01NT04pCisJJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9CisJfQorCisuc3RhY2sgICR7UkVMT0NBVElORysgMHgyZmZmMH0gOgorCXsKKwkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9CisJKiguc3RhY2spCisJfSAKKworICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9Cit9CitFT0YKKworCisKKwpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjE1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMHMuc2MKQEAgLTAsMCArMSw2MCBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCisKKy8qIENvZGUgYW5kIGRhdGEsIGJvdGggNjRrICovCisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMCB9IDoKKwl7IAkJCQkJCisJKigudGV4dCkgCQkJCQorICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KKwl9CisKKy5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwIH0gOgorCXsKKwkqKC5yZGF0YSk7IAorCSooLnN0cmluZ3MpCisJX19fY3RvcnMgPSAuIDsKKwkqKC5jdG9ycykKKwlfX19jdG9yc19lbmQgPSAuIDsKKwlfX19kdG9ycyA9IC4gOworCSooLmR0b3JzKQorCV9fX2R0b3JzX2VuZCA9IC4gOworCX0KKworLmRhdGEgICR7UkVMT0NBVElORysgLiB9IDoKKwl7CisJKiguZGF0YSkKKwkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9CisJfSAKKworLmJzcyAgJHtSRUxPQ0FUSU5HKyAufSA6CisJeworCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQorCSooLmJzcykKKwkqKENPTU1PTikKKwkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KKwl9CisKKy5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweDJmZmYwfSA6CisJeworCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KKwkqKC5zdGFjaykKKwl9IAorCisgIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKKyAgeworICAgIFsgLnN0YWIgXQorICB9CisgIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgorICB7CisgICAgWyAuc3RhYnN0ciBdCisgIH0KK30KK0VPRgorCisKKworCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjIGIvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDFjZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYwpAQCAtMCwwICsxLDM4IEBACitEQVRBX0FERFI9MHg0MDAwMDAwMAordGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKK0VOVFJZKCJcJFNUQVJUXCQiKQorJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KK1NFQ1RJT05TCit7CisgIC50ZXh0IDB4MTAwMCAke1JFTE9DQVRJTkcrKyR7VEVYVF9TVEFSVF9BRERSfX06CisgIHsKKyAgICAke1JFTE9DQVRJTkcrX190ZXh0X3N0YXJ0ID0gLn07CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKiguUEFSSVNDLnN0dWJzKQorICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gLn07CisgICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC59OworICB9CisgICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFJ9O30KKyAgLmRhdGEgOgorICB7CisgICAgJHtSRUxPQ0FUSU5HKyAuID0gLiArIDB4MTAwMCB9OworICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnQgPSAufTsKKyAgICAqKC5kYXRhKQorICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgICAke1JFTE9DQVRJTkcrZWRhdGEgPSAufTsKKyAgICAke1JFTE9DQVRJTkcrX2VkYXRhID0gLn07CisgIH0KKyAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn0gKyBTSVpFT0YoLmRhdGEpO30KKyAgLmJzcyA6CisgIHsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgJHtSRUxPQ0FUSU5HK2VuZCA9IC4gfTsKKyAgICR7UkVMT0NBVElORytfZW5kID0gLiB9OworICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmZmRlMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2kzODZiZW9zLnNjCkBAIC0wLDAgKzEsMTk0IEBACisjIExpbmtlciBzY3JpcHQgZm9yIFBFLgorCitpZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KKyAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQorZmkKKworIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKKyMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCitpZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgorICBSX1RFWFQ9JyooLnRleHQkKiknCisgIFJfREFUQT0nKiguZGF0YSQqKScKKyAgUl9SREFUQT0nKigucmRhdGEkKiknCisgIFJfSURBVEE9JworICAgICooLmlkYXRhJDIpCisgICAgKiguaWRhdGEkMykKKyAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCisgICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOworICAgICooLmlkYXRhJDQpCisgICAgKiguaWRhdGEkNSkKKyAgICAqKC5pZGF0YSQ2KQorICAgICooLmlkYXRhJDcpJworICBSX0NSVD0nKiguQ1JUJCopJworICBSX1JTUkM9JyooLnJzcmMkKiknCisgIFJfRVhDPScqKC5leGMkKiknCitlbHNlCisgIFJfVEVYVD0KKyAgUl9EQVRBPQorICBSX1JEQVRBPQorICBSX0lEQVRBPQorICBSX0NSVD0KKyAgUl9SU1JDPQorICBSX0VYQz0KK2ZpCisKK2NhdCA8PEVPRgorJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSl9Ciske1JFTE9DQVRJTkctT1VUUFVUX0ZPUk1BVCgke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSl9CisKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWShfX3N0YXJ0KQorJHtSRUxPQ0FUSU5HK2hlYWRlciA9IC47fQorJHtSRUxPQ0FUSU5HK19fZmx0dXNlZCA9IC47IC8qIHNldCB1cCBmbG9hdGluZyBwdCBmb3IgTVMgLm9ialwncyAqL30KKyR7UkVMT0NBVElORytfX2xkdXNlZCA9IC47fQorU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCisgIHsKKyAgICAke1JFTE9DQVRJTkcrIF9fdGV4dF9zdGFydF9fID0gLiA7fQorICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9CisgICAgKigudGV4dCkKKyAgICAke1JfVEVYVH0KKyAgICAqKC5nbHVlXzd0KQorICAgICooLmdsdWVfNykKKyAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAorCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCisJCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQorICAgICR7UkVMT0NBVElORysgKiguZmluaSl9CisgICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KKyAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQorICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9fdGV4dF9lbmRfXyA9IC47fQorICAgICooLmdjY19leGNlcHRfdGFibGUpCisgIH0KKworICAvKiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YQorICAgICBvbiBmb3JrLiAgVGhpcyB1c2VkIHRvIGJlIG5hbWVkICIuZGF0YSRub2NvcHkiLiAgVGhlIGxpbmtlciB1c2VkCisgICAgIHRvIGluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0CisgICAgIGJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgSW5zdGVhZCwgd2UgbmFtZSB0aGUgc2VjdGlvbgorICAgICAiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyIF9fZGF0YV9lbmRfXy4gKi8KKworICAuZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOiAKKyAgeworICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnRfXyA9IC4gO30KKyAgICAqKC5kYXRhKQorICAgICooLmRhdGEyKQorICAgICR7Ul9EQVRBfQorICAgICR7UkVMT0NBVElORytfX2RhdGFfZW5kX18gPSAuIDt9CisgICAgJHtSRUxPQ0FUSU5HKyooLmRhdGFfY3lnd2luX25vY29weSl9CisgIH0KKworICAuYnNzICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnRfXyA9IC4gO30KKyAgICAqKC5ic3MpCisgICAgKihDT01NT04pCisgICAgLyogbGluay5leGUgYXBwYXJlbnRseSBwdWxscyBpbiAub2JqJ3MgYmVjYXVzZSBvZiBVTkRFRiBjb21tb24KKwlzeW1ib2xzLCB3aGljaCBpcyBub3QgdGhlIGNvZmYgd2F5LCBidXQgdGhhdCdzIE1TIGZvciB5b3UuICovCisgICAgKiguQ1JUXCRYQ0EpCisgICAgKiguQ1JUXCRYQ1opCisgICAgKiguQ1JUXCRYSUEpCisgICAgKiguQ1JUXCRYSVopCisgICAgJHtSRUxPQ0FUSU5HK19fYnNzX2VuZF9fID0gLiA7fQorICB9CisKKyAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsKKyAgICAqKC5yZGF0YSkKKyAgICAke1JfUkRBVEF9CisgICAgKiguZWhfZnJhbWUpCisgIH0KKworICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKKyAgeworICAgICooLmVkYXRhKQorICB9CisKKyAgL0RJU0NBUkQvIDoKKyAgeworICAgICooLmRlYnVnXCRTKQorICAgICooLmRlYnVnXCRUKQorICAgICooLmRlYnVnXCRGKQorICAgICooLmRyZWN0dmUpCisgICAgKiguZGVidWcqKQorICB9CisKKyAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsKKyAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCisJU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLworICAgICR7Ul9JREFUQX0KKyAgfQorICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsgCQkJCQkKKyAgICAke1JfQ1JUfQorICB9CisKKyAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKKyAgeworICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KKyAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQorICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQorICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQorICB9CisKKyAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsgCQkJCQkKKyAgICAqKC5yZWxvYykKKyAgfQorCisgIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsgCQkJCQkKKyAgICAqKC5yc3JjKQorICAgICR7Ul9SU1JDfQorICB9CisKKyAgLmV4YyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgKiguZXhjKQorICAgICR7Ul9FWEN9CisgIH0KKworICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorCisgIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmxpbmUpIH0KKworICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorCisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisKKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbWFjaW5mbykgfQorCisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmIxYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MKQEAgLTAsMCArMSw0MyBAQAorIyBMaW5rZXIgc2NyaXB0IGZvciAzODYgQ09GRi4gIFRoaXMgd29ya3Mgb24gU1ZSMy4yIGFuZCBTQ08gVW5peCAzLjIuMi4KKyMgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKKyMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKKyMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgorSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCitGSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCiske0xJQl9TRUFSQ0hfRElSU30KKworRU5UUlkoJHtFTlRSWX0pCisKK1NFQ1RJT05TCit7CisgIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogeworICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9CisgICAgKigudGV4dCkKKyAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQorICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OworICB9CisgIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKKyAgICAqKC5kYXRhKQorICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OworICB9CisgIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKKyAgeyAJCQkJCQorICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OworICB9CisgICR7UkVMT0NBVElORy0gJHtJTklUfX0KKyAgJHtSRUxPQ0FUSU5HLSAke0ZJTkl9fQorICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkM2QwOQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjCkBAIC0wLDAgKzEsNDYgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgaTM4NiBnbzMyIChESkdQUCkKKwordGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1zdGFydAorRVhFPSR7Q09OU1RSVUNUSU5HKyR7UkVMT0NBVElORystZXhlfX0KKworIyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgaW4gYXMgdmFyaWFibGVzIGluIG9yZGVyIHRvIGdldCAnfScgaW4gYSBzaGVsbAorIyBjb25kaXRpb25hbCBleHBhbnNpb24uCitDVE9SPScuY3RvciA6IHsgKiguY3RvcikgfScKK0RUT1I9Jy5kdG9yIDogeyAqKC5kdG9yKSB9JworCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0ke0VYRX0iKQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyAke1RBUkdFVF9QQUdFX1NJWkV9K1NJWkVPRl9IRUFERVJTfSA6IHsKKyAgICAqKC50ZXh0KQorICAgICooLmNvbnN0KikKKyAgICAqKC5ybyopCisgICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ICA9ICAuIDsgX2V0ZXh0ID0gLn07CisgICAgJHtSRUxPQ0FUSU5HKy4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KKyAgfQorICAuZGF0YSAke1JFTE9DQVRJTkcrICR7REFUQV9BTElHTk1FTlR9fSA6IHsKKyAgICAke1JFTE9DQVRJTkcrZGpncHBfZmlyc3RfY3RvciA9IC4gOworICAgICooLmN0b3IpCisgICAgZGpncHBfbGFzdF9jdG9yID0gLiA7fQorICAgICR7UkVMT0NBVElORytkamdwcF9maXJzdF9kdG9yID0gLiA7CisgICAgKiguZHRvcikKKyAgICBkamdwcF9sYXN0X2R0b3IgPSAuIDt9CisgICAgKiguZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuIDsgX2VkYXRhID0gLn07CisgICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oJHtTRUdNRU5UX1NJWkV9KTt9CisgIH0KKyAgJHtDT05TVFJVQ1RJTkcrJHtSRUxPQ0FUSU5HLSRDVE9SfX0KKyAgJHtDT05TVFJVQ1RJTkcrJHtSRUxPQ0FUSU5HLSREVE9SfX0KKyAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgorICB7IAkJCQkJCisgICAgKiguYnNzKQorICAgICooQ09NTU9OKQorICAgICR7UkVMT0NBVElORysgZW5kID0gLiA7IF9lbmQgPSAufTsKKyAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZseW54LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjcyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYwpAQCAtMCwwICsxLDQ2IEBACit0ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7CisgICAgKiguaW5pdCkKKyAgICAqKC50ZXh0KQorICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQorICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQorICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQorICAgICooLmZpbmkpCisgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07CisgIH0KKyAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogeworICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgorICB7IAkJCQkJCisgICAgKiguYnNzKQorICAgICooQ09NTU9OKQorICAgICR7UkVMT0NBVElORysgZW5kID0gLn07CisgIH0KKyAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAorICB7CisgICAgWyAuc3RhYiBdCisgIH0KKyAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFic3RyIF0KKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMTJlNwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYwpAQCAtMCwwICsxLDM4IEBACitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQorU0VDVElPTlMKK3sKKyAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQorICAudGV4dCA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgICR7UkVMT0NBVElORytldGV4dCA9IC47fQorICAgICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9IC47fQorICB9CisgIC5kYXRhIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5kYXRhKQorICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgICAke1JFTE9DQVRJTkcrZWRhdGEgID0gIC47fQorICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQorICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KKyAgfQorICAuYnNzIDoKKyAgeworICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLn07CisgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgICR7UkVMT0NBVElORytlbmQgPSBBTElHTig0KSB9OworICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OworICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pOTYwLnNjIGIvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzMzNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYwpAQCAtMCwwICsxLDI1IEBACitjYXQgPDxFT0YKK1NFQ1RJT05TCit7IAorICAgIC50ZXh0IDogCisgICAgeyAKKwkke0dMRF9TVFlMRSsgQ1JFQVRFX09CSkVDVF9TWU1CT0xTfQorCSooLnRleHQpIAorCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLn07CisJJHtDT05TVFJVQ1RJTkcrJHtDT0ZGX0NUT1JTfX0KKyAgICB9ICAKKyAgICAuZGF0YSA6CisgICAgeyAKKyAJKiguZGF0YSkgCisJJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQorCSR7UkVMT0NBVElORysgX2VkYXRhID0gLn07CisgICAgfSAgCisgICAgLmJzcyA6CisgICAgeyAKKwkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAufTsKKwkqKC5ic3MpCSAKKwkqKENPTU1PTikgCisJJHtSRUxPQ0FUSU5HKyBfZW5kID0gLn07CisgICAgfSAKK30gCitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGthdXguc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDI4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrYXV4LnNjCkBAIC0wLDAgKzEsNDYgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgQS9VWC4KK3Rlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0CitJTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKK0ZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JworQ1RPUlM9Jy5jdG9ycyA6IHsgKiguY3RvcnMpIH0nCitEVE9SUz0nLmR0b3JzIDogeyAqKC5kdG9ycykgfScKKworY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyAkVEVYVF9TVEFSVF9BRERSfSA6IHsKKyAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQorICAgICR7UkVMT0NBVElORysgKiguZmluaSl9CisgICAgKigudGV4dCkKKyAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTig0KTt9CisgICAgJHtSRUxPQ0FUSU5HKyAqKC5jdG9ycyl9CisgICAgJHtSRUxPQ0FUSU5HKyAqKC5kdG9ycyl9CisgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQorICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLjt9CisgIH0gPTB4NEU3MTRFNzEKKyAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAkREFUQV9BTElHTk1FTlR9IDogeworICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSA9IC47fQorICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLjt9CisgIH0KKyAgLmJzcyA6IHsKKyAgICAqKC5ic3MpCisgICAgKihDT01NT04pCisgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KKyAgfQorICAke1JFTE9DQVRJTkctICR7SU5JVH19CisgICR7UkVMT0NBVElORy0gJHtGSU5JfX0KKyAgJHtSRUxPQ0FUSU5HLSAke0NUT1JTfX0KKyAgJHtSRUxPQ0FUSU5HLSAke0RUT1JTfX0KKworICAuY29tbWVudCAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLmNvbW1lbnQgXSBbIC5pZGVudCBdIH0KKyAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyBbIC5zdGFiIF0gfQorICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLnN0YWJzdHIgXSB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2OGM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjCkBAIC0wLDAgKzEsNDIgQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCiske0xJQl9TRUFSQ0hfRElSU30KK1BST1ZJREUgKF9fc3RhY2sgPSAwKTsgCitTRUNUSU9OUworeworICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDAwMH0gOiB7CisgICAgKigudGV4dCkKKyAgICAke0NPTlNUUlVDVElORysgLiA9IEFMSUdOKDQpO30KKyAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KKyAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfRU5EX18gPSAuO30KKyAgfQorICAuZGF0YSA6IHsKKyAgICAqKC5kYXRhKQorICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OworICB9CisgIC5ic3MgOiB7IAkJCQkJCisgICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OworICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSBBTElHTigweDgpfTsKKyAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gQUxJR04oMHg4KX07CisgIH0KKyAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAorICB7CisgICAgWyAuc3RhYiBdCisgIH0KKyAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFic3RyIF0KKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGtseW54LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDIyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYwpAQCAtMCwwICsxLDQ2IEBACit0ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7CisgICAgKiguaW5pdCkKKyAgICAqKC50ZXh0KQorICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQorICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9CisgICAgKiguZmluaSkKKyAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKKyAgfQorICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7CisgICAgKiguZGF0YSAuZGF0YTIpCisgICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgorICB7IAkJCQkJCisgICAgKiguYnNzKQorICAgICooQ09NTU9OKQorICAgICR7UkVMT0NBVElORysgZW5kID0gLn07CisgIH0KKyAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAorICB7CisgICAgWyAuc3RhYiBdCisgIH0KKyAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFic3RyIF0KKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjIGIvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTJiMTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYwpAQCAtMCwwICsxLDQ5IEBACisjIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCisjIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KK0lOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JworRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKK0VOVFJZKF9fc3RhcnQpCiske1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQorCitTRUNUSU9OUyAJCQkJCit7IAkJCQkJCisgIC50ZXh0ICR7UkVMT0NBVElORysgKDB4MjAwMDcgKyBTSVpFT0ZfSEVBREVSUykgJn4gN30gOgorICAgIHsKKyAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5zdGFydCA9IC59OworICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LnN0YXJ0ID0gLn07CisgICAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQorICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LmVuZCA9IC59OworICAgICAgKigudGV4dCkgCQkJCQorICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZGVzY19zdGFydCA9IC59OworICAgICAgJHtSRUxPQ0FUSU5HKyAqKC50ZGVzYyl9CisgICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHRfZW5kID0gLn0JOworICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5zdGFydCA9IC59OworICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5lbmQgPSAufTsKKyAgICAgICR7UkVMT0NBVElORysgX18uZmluaV9zdGFydCA9IC59OworICAgICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKSB9CisgICAgICAke1JFTE9DQVRJTkcrIF9fLmZpbmlfZW5kID0gLn07CisgICAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07CisgICAgfSAgCQkJCQkKKyAgLmRhdGEgJHtSRUxPQ0FUSU5HKyBORVhUICgweDQwMDAwMCkgKyAoKFNJWkVPRigudGV4dCkgKyBBRERSKC50ZXh0KSkgJSAweDIwMDApfSA6CisgICAgeyAJCQkJCQorICAgICAgKiguZGF0YSkKKyAgICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC59OworICAgIH0gIAkJCQkJCisgIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKKyAgICB7IAkJCisgICAgICAqKC5ic3MpCQorICAgICAgKihDT01NT04pIAkKKyAgICAgICR7UkVMT0NBVElORysgX2VuZCA9IC59OworICAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IC59OworICAgIH0KKyAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQorICAke1JFTE9DQVRJTkctICR7RklOSX19CisgIC5jb21tZW50ICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKKyAgeworICAgICooLmNvbW1lbnQpCisgIH0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExMWJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MKQEAgLTAsMCArMSwxNTYgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCisKK2lmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgorICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9CitmaQorCisjIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAorIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KKyMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCisjIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCisjIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKKyMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KKyMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCitpZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgorICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCisgIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKKyAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCisgIFJfSURBVEE9JworICAgIFNPUlQoKikoLmlkYXRhJDIpCisgICAgU09SVCgqKSguaWRhdGEkMykKKyAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCisgICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOworICAgIFNPUlQoKikoLmlkYXRhJDQpCisgICAgU09SVCgqKSguaWRhdGEkNSkKKyAgICBTT1JUKCopKC5pZGF0YSQ2KQorICAgIFNPUlQoKikoLmlkYXRhJDcpJworICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJworICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCitlbHNlCisgIFJfVEVYVD0KKyAgUl9EQVRBPQorICBSX1JEQVRBPQorICBSX0lEQVRBPQorICBSX0NSVD0KKyAgUl9SU1JDPQorZmkKKworY2F0IDw8RU9GCiske1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KKyR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KKworJHtMSUJfU0VBUkNIX0RJUlN9CisKK0VOVFJZKF9tYWluQ1JUU3RhcnR1cCkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCisgIHsKKyAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQorICAgICooLnRleHQpCisgICAgJHtSX1RFWFR9CisgICAgKiguZ2x1ZV83dCkKKyAgICAqKC5nbHVlXzcpCisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKKwkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KKyAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAorCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KKyAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQorICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCisgICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KKyAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9CisgICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKKyAgfQorCisgIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCisgICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKKyAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKKyAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCisgICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLworCisgIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAorICB7CisgICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQorICAgICooLmRhdGEpCisgICAgKiguZGF0YTIpCisgICAgJHtSX0RBVEF9CisgICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KKyAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KKyAgfQorCisgIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKKyAgeworICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQorICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9CisgIH0KKworICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKKyAgeworICAgICooLnJkYXRhKQorICAgICR7Ul9SREFUQX0KKyAgICAqKC5laF9mcmFtZSkKKyAgfQorCisgIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7CisgICAgKiguZWRhdGEpCisgIH0KKworICAvRElTQ0FSRC8gOgorICB7CisgICAgKiguZGVidWdcJFMpCisgICAgKiguZGVidWdcJFQpCisgICAgKiguZGVidWdcJEYpCisgICAgKiguZHJlY3R2ZSkKKyAgfQorCisgIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7CisgICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgorCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KKyAgICAke1JfSURBVEF9CisgIH0KKyAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgJHtSX0NSVH0KKyAgfQorCisgIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsKKyAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCisgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KKyAgfQorCisgIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgKigucmVsb2MpCisgIH0KKworICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgKigucnNyYykKKyAgICAke1JfUlNSQ30KKyAgfQorCisgIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWIgXQorICB9CisKKyAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgorICB7CisgICAgWyAuc3RhYnN0ciBdCisgIH0KKworICAuc3RhY2sgMHg4MDAwMCA6CisgIHsKKyAgICBfc3RhY2sgPSAuOworICAgICooLnN0YWNrKQorICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MGFlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9taXBzLnNjCkBAIC0wLDAgKzEsNzIgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgTUlQUyBzeXN0ZW1zLgorIyBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCisjIFRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW11bGF0aW9uIGZpbGUuICBUaGUKKyMgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlIGZvciBhIERFQ3N0YXRpb24gcnVubmluZyBVbHRyaXguCit0ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKKworaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCisgIHRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKK2Vsc2UKKyAgdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDQwMDAwMCIKK2ZpCitpZiB0ZXN0ICJ4JExEX0ZMQUciID0gInhuIiAtbyAieCRMRF9GTEFHIiA9ICJ4TiI7IHRoZW4KKyAgREFUQV9BRERSPS4KK2Vsc2UKKyAgdGVzdCAteiAiJERBVEFfQUREUiIgJiYgREFUQV9BRERSPTB4MTAwMDAwMDAKK2ZpCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAorCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCiske0xJQl9TRUFSQ0hfRElSU30KKworRU5UUlkoJHtFTlRSWX0pCisKK1NFQ1RJT05TCit7CisgICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KKyAgLnRleHQgOiB7CisgICAgJHtSRUxPQ0FUSU5HKyBfZnRleHQgPSAuIH07CisgICAgKiguaW5pdCkKKyAgICAke1JFTE9DQVRJTkcrIGVwcm9sICA9ICAufTsKKyAgICAqKC50ZXh0KQorICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTt9CisgICAgKigucmVsLnNkYXRhKQorICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO30KKyAgICAqKC5maW5pKQorICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OworICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAufTsKKyAgfQorICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfTt9CisgIC5yZGF0YSA6IHsKKyAgICAqKC5yZGF0YSkKKyAgfQorICAke1JFTE9DQVRJTkcrIF9mZGF0YSA9IEFMSUdOKDE2KTt9CisgIC5kYXRhIDogeworICAgICooLmRhdGEpCisgICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQorICB9CisgICR7UkVMT0NBVElORysgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO30KKyAgLmxpdDggOiB7CisgICAgKigubGl0OCkKKyAgfQorICAubGl0NCA6IHsKKyAgICAqKC5saXQ0KQorICB9CisgIC5zZGF0YSA6IHsKKyAgICAqKC5zZGF0YSkKKyAgfQorICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuO30KKyAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC47fQorICAke1JFTE9DQVRJTkcrIF9mYnNzID0gLjt9CisgIC5zYnNzIDogeworICAgICooLnNic3MpCisgICAgKiguc2NvbW1vbikKKyAgfQorICAuYnNzIDogeworICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgfQorICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQorICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyBiL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyMmIzMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKQEAgLTAsMCArMSwzMCBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKKwkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KK1NFQ1RJT05TCit7CisgICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9CisgIH0KKyAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9CisgIC5kYXRhIDoKKyAgeworICAgICooLmRhdGEpCisgICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQorICAgICR7UkVMT0NBVElORytlZGF0YSAgPSAgLjt9CisgIH0KKyAgLmJzcyA6CisgIHsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgJHtSRUxPQ0FUSU5HK2VuZCA9IC4gfTsKKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9udy5zYyBiL2xkL3NjcmlwdHRlbXBsL253LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTUyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9udy5zYwpAQCAtMCwwICsxLDEzMSBAQAorIworIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKKyMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKKyMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAorIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLmN0b3JzIC5yb2RhdGEgLi4uCisjCQkoZS5nLiwgLlBBUklTQy5taWxsaSkKKyMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5zZGF0YSAuLi4KKyMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKKyMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCisjCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCisjCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQorIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKKyMJCS50ZXh0IHNlY3Rpb24uCisjCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQorIwkJLmRhdGEgc2VjdGlvbi4KKyMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKKyMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgorIwlEQVRBX1BMVCAtIC5wbHQgc2hvdWxkIGJlIGluIGRhdGEgc2VnbWVudCwgbm90IHRleHQgc2VnbWVudC4KKyMKKyMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAorIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCisjCit0ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQordGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KK3Rlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgorSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgorUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IiwgIiR7QklHX09VVFBVVF9GT1JNQVR9IiwKKwkgICAgICAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7UkVMT0NBVElORysvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgJHtTVEFDS1pFUk8rJHtTVEFDS1pFUk99fSAke1NITElCX1BBVEgrJHtTSExJQl9QQVRIfX0gICovfQorJHtSRUxPQ0FUSU5HKyR7RVhFQ1VUQUJMRV9TWU1CT0xTfX0KKyR7UkVMT0NBVElORy0gLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi99CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn0gKyBTSVpFT0ZfSEVBREVSUzt9fQorICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319CisgICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KKyAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbml0KQl9ID0ke05PUC0wfQorICAke0RBVEFfUExULSR7UExUfX0KKyAgLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKKyAgeworICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319CisgICAgKigudGV4dCkKKyAgICAke0NPTlNUUlVDVElORysJX19DVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAke0NPTlNUUlVDVElORysJKiguY3RvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQorICAgICR7Q09OU1RSVUNUSU5HKwlfX0NUT1JfRU5EX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysJX19EVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAke0NPTlNUUlVDVElORysJKiguZHRvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKwlMT05HKDApfQorICAgICR7Q09OU1RSVUNUSU5HKwlfX0RUT1JfRU5EX18gPSAuO30KKyAgfQorICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KKyAgLmZpbmkgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5maW5pKSAgICB9ID0ke05PUC0wfQorICAuY3RvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kdG9ycykgICB9CisgIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhKSAgfQorICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KKyAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLSBBTElHTig4KSArICR7TUFYUEFHRVNJWkV9fTt9CisgIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgorICB7CisgICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KKyAgICAqKC5kYXRhKQorICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKyAgfQorICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQorICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQorICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KKyAgLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfQorICAke0RBVEFfUExUKyR7UExUfX0KKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbworICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLworICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSB9CisgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQorICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9CisgICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQorICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319CisgIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQorICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KKyAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KKworICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KKyAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisKKyAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KKyAgJHtPVEhFUl9TRUNUSU9OU30KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcGUuc2MgYi9sZC9zY3JpcHR0ZW1wbC9wZS5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI2YmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvcGUuc2MKQEAgLTAsMCArMSwxNTEgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCisKK2lmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgorICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9CitmaQorCisjIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAorIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KKyMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCisjIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCisjIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKKyMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KKyMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCitpZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgorICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCisgIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKKyAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCisgIFJfSURBVEE9JworICAgIFNPUlQoKikoLmlkYXRhJDIpCisgICAgU09SVCgqKSguaWRhdGEkMykKKyAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCisgICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOworICAgIFNPUlQoKikoLmlkYXRhJDQpCisgICAgU09SVCgqKSguaWRhdGEkNSkKKyAgICBTT1JUKCopKC5pZGF0YSQ2KQorICAgIFNPUlQoKikoLmlkYXRhJDcpJworICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJworICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCitlbHNlCisgIFJfVEVYVD0KKyAgUl9EQVRBPQorICBSX1JEQVRBPQorICBSX0lEQVRBPQorICBSX0NSVD0KKyAgUl9SU1JDPQorZmkKKworY2F0IDw8RU9GCiske1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KKyR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KKworJHtMSUJfU0VBUkNIX0RJUlN9CisKK0VOVFJZKF9tYWluQ1JUU3RhcnR1cCkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCisgIHsKKyAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQorICAgICooLnRleHQpCisgICAgJHtSX1RFWFR9CisgICAgKiguZ2x1ZV83dCkKKyAgICAqKC5nbHVlXzcpCisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjsgX19DVE9SX0xJU1RfXyA9IC4gOyAKKwkJCUxPTkcgKC0xKTsgKiguY3RvcnMpOyAqKC5jdG9yKTsgTE9ORyAoMCk7IH0KKyAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuOyBfX0RUT1JfTElTVF9fID0gLiA7IAorCQkJTE9ORyAoLTEpOyAqKC5kdG9ycyk7ICooLmR0b3IpOyAgTE9ORyAoMCk7IH0KKyAgICAke1JFTE9DQVRJTkcrICooLmZpbmkpfQorICAgIC8qID8/PyBXaHkgaXMgLmdjY19leGMgaGVyZT8gICovCisgICAgJHtSRUxPQ0FUSU5HKyAqKC5nY2NfZXhjKX0KKyAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ID0gLjt9CisgICAgKiguZ2NjX2V4Y2VwdF90YWJsZSkKKyAgfQorCisgIC8qIFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSBzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhCisgICAgIG9uIGZvcmsuICBUaGlzIHVzZWQgdG8gYmUgbmFtZWQgIi5kYXRhJG5vY29weSIuICBUaGUgbGlua2VyIHVzZWQKKyAgICAgdG8gaW5jbHVkZSB0aGlzIGJldHdlZW4gX19kYXRhX3N0YXJ0X18gYW5kIF9fZGF0YV9lbmRfXywgYnV0IHRoYXQKKyAgICAgYnJlYWtzIGJ1aWxkaW5nIHRoZSBjeWd3aW4zMiBkbGwuICBJbnN0ZWFkLCB3ZSBuYW1lIHRoZSBzZWN0aW9uCisgICAgICIuZGF0YV9jeWd3aW5fbm9jb3B5IiBhbmQgZXhwbGljdGx5IGluY2x1ZGUgaXQgYWZ0ZXIgX19kYXRhX2VuZF9fLiAqLworCisgIC5kYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6IAorICB7CisgICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydF9fID0gLiA7fQorICAgICooLmRhdGEpCisgICAgKiguZGF0YTIpCisgICAgJHtSX0RBVEF9CisgICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9lbmRfXyA9IC4gO30KKyAgICAke1JFTE9DQVRJTkcrKiguZGF0YV9jeWd3aW5fbm9jb3B5KX0KKyAgfQorCisgIC5ic3MgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKKyAgeworICAgICR7UkVMT0NBVElORytfX2Jzc19zdGFydF9fID0gLiA7fQorICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgICAke1JFTE9DQVRJTkcrX19ic3NfZW5kX18gPSAuIDt9CisgIH0KKworICAucmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKKyAgeworICAgICooLnJkYXRhKQorICAgICR7Ul9SREFUQX0KKyAgICAqKC5laF9mcmFtZSkKKyAgfQorCisgIC5lZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7CisgICAgKiguZWRhdGEpCisgIH0KKworICAvRElTQ0FSRC8gOgorICB7CisgICAgKiguZGVidWdcJFMpCisgICAgKiguZGVidWdcJFQpCisgICAgKiguZGVidWdcJEYpCisgICAgKiguZHJlY3R2ZSkKKyAgfQorCisgIC5pZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7CisgICAgLyogVGhpcyBjYW5ub3QgY3VycmVudGx5IGJlIGhhbmRsZWQgd2l0aCBncm91cGVkIHNlY3Rpb25zLgorCVNlZSBwZS5lbTpzb3J0X3NlY3Rpb25zLiAgKi8KKyAgICAke1JfSURBVEF9CisgIH0KKyAgLkNSVCAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgJHtSX0NSVH0KKyAgfQorCisgIC5lbmRqdW5rICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6CisgIHsKKyAgICAvKiBlbmQgaXMgZGVwcmVjYXRlZCwgZG9uJ3QgdXNlIGl0ICovCisgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KKyAgICAke1JFTE9DQVRJTkcrIF9fZW5kX18gPSAuO30KKyAgfQorCisgIC5yZWxvYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgKigucmVsb2MpCisgIH0KKworICAucnNyYyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgorICB7IAkJCQkJCisgICAgKigucnNyYykKKyAgICAke1JfUlNSQ30KKyAgfQorCisgIC5zdGFiICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWIgXQorICB9CisKKyAgLnN0YWJzdHIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgorICB7CisgICAgWyAuc3RhYnN0ciBdCisgIH0KKworfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmJlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9wcGNwZS5zYwpAQCAtMCwwICsxLDE5OCBAQAorIyBBIFBFIGxpbmtlciBzY3JpcHQgZm9yIFBvd2VyUEMuCisjIExvb3NlbHkgYmFzZWQgb24gU3RldmUgQ2hhbWJlcmxhaW4ncyBwZS5zYy4KKyMgQWxsIG5ldyBtaXN0YWtlcyBzaG91bGQgYmUgY3JlZGl0ZWQgdG8gS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKKyMKKyMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKKyMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgorSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCitGSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KQorJHtMSUJfU0VBUkNIX0RJUlN9CisKKy8qIE11Y2ggb2YgdGhpcyBsYXlvdXQgd2FzIGRldGVybWluZWQgYnkgZGVsdmluZyBpbnRvIC5leGUgZmlsZXMgZm9yCisgICB0aGUgYm94IGdlbmVyYXRlZCBieSBvdGhlciBjb21waWxlcnMvbGlua2Vycy9ldGMuIFRoaXMgbWVhbnMgdGhhdAorICAgaWYgYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZGlkIG5vdCBoYXBwZW4gdG8gYXBwZWFyIGluIG9uZSBvZiB0aGUgCisgICBzdWJqZWN0IGZpbGVzLCB0aGVuIGl0IG1heSBub3QgYmUgeWV0IHN1cHBvcnRlZC4KKyovCisKKy8qIEl0J3MgIm1haW5DUlRTdGFydHVwIiwgbm90ICJfbWFpbkNSVFN0YXJ0dXAiLCBhbmQgaXQncyBsb2NhdGVkIGluCisgICBvbmUgb2YgdGhlIHR3byAubGliIGZpbGVzIChsaWJjLmxpYiBhbmQga2VybmVsMzIubGliKSB0aGF0IGN1cnJlbnRseQorICAgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBsaW5rIGxpbmUuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdCB1c2UgCisgICAiLXUgbWFpbkNSVFN0YXJ0dXAiIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIGluY2x1ZGVkIGluIHRoZSBsaW5rLgorKi8KKworRU5UUlkobWFpbkNSVFN0YXJ0dXApCisKK1NFQ1RJT05TCit7CisKKyAgLyogdGV4dCAtIHRoZSB1c3VhbCBtZWFuaW5nICovCisgIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAorCXsKKwkgICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KTt9CisJICAgICooLnRleHQpCisJICAgICooLmdjY19leGNlcHRfdGFibGUpCisJICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCisJCSAgICAgICAgTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQorICAgICAgICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKKwkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9CisJICAgICR7UkVMT0NBVElORysgKiguZmluaSk7fQorCSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKKwl9CisKKyAgLyogcmRhdGEgLSBSZWFkIE9ubHkgUnVudGltZSBEYXRhCisgICAgIENUUiBzZWN0aW9uczogQWxsIG9mIHRoZSBDUlQgKHJlYWQgb25seSBDIHJ1bnRpbWUgZGF0YSkgc2VjdGlvbnMgCisJYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUgLnJkYXRhIChyZWFkIG9ubHkgcnVudGltZSBkYXRhKSAKKwlzZWN0aW9uLCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyLiBEb24ndCBrbm93IGlmIGl0IG1hdHRlcnMgb3Igbm90LgorCU5vdCBhbGwgc2VjdGlvbnMgYXJlIGFsd2F5cyBwcmVzZW50IGVpdGhlci4KKyAgICAgLnJkYXRhOiBjb21waWxlciBnZW5lcmF0ZWQgcmVhZCBvbmx5IGRhdGEKKyAgICAgLnhkYXRhOiBjb21waWxlciBnZW5lcmF0ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlLiAoTW9zdCBkb2NzCisJc2VlbSB0byBzdWdnZXN0IHRoYXQgdGhpcyBzZWN0aW9uIGlzIG5vdyBkZXByZWNhdGVkIGluZmF2b3IKKwlvZiB0aGUgeWRhdGEgc2VjdGlvbikKKyAgICAgLmVkYXRhOiBUaGUgZXhwb3J0ZWQgbmFtZXMgdGFibGUuCisgICovCisgIC5yZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKKwl7CisJICAgICooLkNSVFwkWENBKTsKKwkgICAgKiguQ1JUXCRYQ0MpOworCSAgICAqKC5DUlRcJFhDWik7CisJICAgICooLkNSVFwkWElBKTsKKwkgICAgKiguQ1JUXCRYSUMpOworCSAgICAqKC5DUlRcJFhJWik7CisJICAgICooLkNSVFwkWExBKTsKKwkgICAgKiguQ1JUXCRYTFopOworCSAgICAqKC5DUlRcJFhQQSk7CisJICAgICooLkNSVFwkWFBYKTsKKwkgICAgKiguQ1JUXCRYUFopOworCSAgICAqKC5DUlRcJFhUQSk7CisJICAgICooLkNSVFwkWFRaKTsKKwkgICAgKigucmRhdGEpOworCSAgICAqKC54ZGF0YSk7CisJfQorCisgIC5lZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKKwl7CisgICAgCSAgICAqKC5lZGF0YSk7CisJfQorCisgIC8qIGRhdGEgLSBpbml0aWFsaXplZCBkYXRhCisgICAgIC55ZGF0YTogZXhjZXB0aW9uIGhhbmRsaW5nIGluZm9ybWF0aW9uLgorICAgICAuZGF0YTogdGhlIHVzdWFsIG1lYW5pbmcuCisgICAgIC5kYXRhMjogbW9yZSBvZiB0aGUgc2FtZS4KKyAgICAgLmJzczogRm9yIHNvbWUgcmVhc29uLCBic3MgYXBwZWFycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YQorCXNlY3Rpb24sIGFzIG9wcG9zZWQgdG8gYmVpbmcgZ2l2ZW4gYSBzZWN0aW9uIG9mIGl0J3Mgb3duLgorICAgICBDT01NT046CisgICovCisgIC5kYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOiAKKwl7CisJICAgIF9fZGF0YV9zdGFydF9fID0gLiA7IAorCSAgICAqKC55ZGF0YSk7CisJICAgICooLmRhdGEpOworCSAgICAqKC5kYXRhMik7CisJICAgIF9fYnNzX3N0YXJ0X18gPSAuIDsKKwkgICAgKiguYnNzKSA7CisJICAgICooQ09NTU9OKTsKKwkgICAgX19ic3NfZW5kX18gPSAuIDsKKwkgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAgLn07CisgCSAgICBfX2RhdGFfZW5kX18gPSAuIDsgCisJfQorCisgIC8qIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGUuIEEgc2VxdWVuY2Ugb2YgNSB3b3JkIGVudHJpZXMuIFNlY3Rpb24KKyAgICAgYWRkcmVzcyBhbmQgZXh0ZW50IGFyZSBwbGFjZWQgaW4gdGhlIERhdGFEaXJlY3RvcnkuCisgICovCisgIC5wZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKKwl7IAkJCQkJCisJICAgICooLnBkYXRhKQorIAkgICAgOworCX0KKworICAvKiBUaGUgaWRhdGEgc2VjdGlvbiBpcyBjaG9jayBmdWxsIG9mIG1hZ2ljIGJpdHMuIAorCTEuIEJvdW5kYXJpZXMgYXJvdW5kIHZhcmlvdXMgaWRhdGEgcGFydHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZQorCSAgIHNvbWUgb2YgdGhlIGZpZWxkcyBvZiB0aGUgRGF0YURpcmVjdG9yeS4gSW4gcGFydGljdWxhciwgdGhlCisJICAgbWFnaWMgZm9yIDIsIDQgYW5kIDUgYXJlIGtub3duIHRvIGJlIHVzZWQuIFNvbWUgY29tcGlsZXJzCisJICAgYXBwZWFyIHRvIGdlbmVyYXRlIG1hZ2ljIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhpcyBwdXJwb3NlLgorCSAgIFdoZXJlIHdlIGNhbiwgd2UgY2F0Y2ggc3VjaCBzeW1ib2xzIGFuZCB1c2Ugb3VyIG93bi4gVGhpcyBvZgorCSAgIGNvdXJzZSBpcyBzb21ldGhpbmcgbGVzcyB0aGFuIGEgcGVyZmVjdCBzdHJhdGVneS4KKwkyLiBUaGUgdGFibGUgb2YgY29udGVudHMgaXMgcGxhY2VkIGltbWVkaWF0ZWx5IGFmdGVyIGlkYXRhNC4KKwkgICBUaGUgIi5wcml2YXRlLnRvYyIgc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgcHBjIGJmZC4gVGhlCisJICAgLnRvYyB2YXJpYWJsZSBpcyBnZW5lcmF0ZWQgYnkgZ2FzLCBhbmQgcmVzb2x2ZWQgaGVyZS4gSXQgaXMKKwkgICB1c2VkIHRvIGluaXRpYWxpemVkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIChhbmQgYW55b25lIGVsc2Ugd2hvCisJICAgbmVlZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1vZHVsZSdzIHRvYykuIFRoZSBvbmx5IHRoaW5nIAorCSAgIGludGVyZXN0aW5nIGFib3V0IGl0IGF0IGFsbD8gTW9zdCBwcGMgaW5zdHJ1Y3Rpb25zIHVzaW5nIGl0CisJICAgaGF2ZSBhIDE2Yml0IGRpc3BsYWNlbWVudCBmaWVsZC4gVGhlIGNvbnZlbnRpb24gZm9yIGFkZHJlc3NpbmcKKwkgICBpcyB0byBpbml0aWFsaXplIHRoZSAudG9jIHZhbHVlIHRvIDMySyBwYXN0IHRoZSBzdGFydCBvZiB0aGUKKwkgICBhY3R1YWwgdG9jLCBhbmQgc3VidHJhY3QgMzJLIGZyb20gYWxsIHJlZmVyZW5jZXMsIHRodXMgdXNpbmcKKwkgICB0aGUgZW50aXJlIDY0SyByYW5nZS4gTmF0dXJhbGx5LCB0aGUgcmVsb2MgY29kZSBtdXN0IGFncmVlCisJICAgb24gdGhpcyBudW1iZXIgb3IgeW91IGdldCBwcmV0dHkgc3R1cGlkIHJlc3VsdHMuCisgICovCisgIC5pZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKKwl7IAkJCQkJCisJICAgIF9faWRhdGEyX21hZ2ljX18gPSAuOworCSAgICAqKC5pZGF0YVwkMik7CisJICAgIF9faWRhdGEzX21hZ2ljX18gPSAuOworCSAgICAqKC5pZGF0YVwkMyk7CisJICAgIF9faWRhdGE0X21hZ2ljX18gPSAuOworCSAgICAqKC5pZGF0YVwkNCk7CisJICAgIC4gPSBBTElHTig0KTsKKwkgICAgLnRvYyA9IC4gKyAzMjc2ODsKKwkgICAgKigucHJpdmF0ZS50b2MpOworCSAgICBfX2lkYXRhNV9tYWdpY19fID0gLjsKKwkgICAgKiguaWRhdGFcJDUpOworCSAgICBfX2lkYXRhNl9tYWdpY19fID0gLjsKKwkgICAgKiguaWRhdGFcJDYpOworCSAgICBfX2lkYXRhN19tYWdpY19fID0gLjsKKwkgICAgKiguaWRhdGFcJDcpOworCSAgICA7CisJfQorCisgIC8qIHJlbGRhdGEgLS0gZGF0YSB0aGF0IHJlcXVpcmVzIHJlbG9jYXRpb24KKyAgKi8KKyAgLnJlbGRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6CisJeyAJCQkJCQorCSAgICAqKC5yZWxkYXRhKQorIAkgICAgOworCX0KKworCisgIC8qIFJlc291cmNlcyAqLworICAucnNyYyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKKwl7IAkJCQkJCisJICAgICooLnJzcmNcJDAxKQorCSAgICAqKC5yc3JjXCQwMikKKwkgICAgOworCX0KKworICAuc3RhYiBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pICAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorCisgIC5zdGFic3RyIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFic3RyIF0KKyAgfQorCisgIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBjdXJyZW50bHkgZ2VuZXJhdGVkIGJ5IHRoZSBkbGx0b29sIGZyb20gU3RldmUgCisgICAgIENoYW1iZXJsYWluIGluIGEgc2Vjb25kIHBhc3Mgb2YgbGlua2luZy4gU2VjdGlvbiBhZGRyZXNzIGFuZCBleHRlbnQKKyAgICAgYXJlIHBsYWNlZCBpbiB0aGUgRGF0YURpcmVjdG9yeS4KKyAgKi8KKyAgLnJlbG9jIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgorCXsgCQkJCQkKKwkgICAgKigucmVsb2MpCisJICAgIDsKKwl9CisKKyAgLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggY29kZXZpZXcgZGVidWdnZXIgc3VwcG9ydCBvciB0aGUKKyAgICAgZGlyZWN0aXZlIHNlY3Rpb24gKHlldCkuIEhvcGVmdWxseSwgd2UganVuayB0aGVtIGNvcnJlY3RseS4gCisgICovCisgIC9ESVNDQVJELyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDogCisJeworICAgIAkgICAgKiguZGVidWdcJFMpCisgICAgCSAgICAqKC5kZWJ1Z1wkVCkKKyAgICAJICAgICooLmRlYnVnXCRGKQorICAgIAkgICAgKiguZHJlY3R2ZSkKKyAgICAJICAgIDsKKyAgIAl9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGM2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjCkBAIC0wLDAgKzEsNjEgQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKyR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319CisKK1NFQ1RJT05TCit7CisgIC50ZXh0ICR7UkVMT0NBVElORzotMH0gJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiB7CisgICAgJHtSRUxPQ0FUSU5HKyBzdGFydCA9IERFRklORUQoX1NUQVJUKSA/IF9TVEFSVCA6IERFRklORUQoX3N0YXJ0KSA/IF9zdGFydCA6IC47fQorICAgICR7UkVMT0NBVElORysgUFJPVklERShfX3RleHQgPSAuKTt9CisgICAgKigudGV4dCk7CisgICAgKihjb2RlKTsKKyAgICAqKGNvbnN0KTsKKyAgICAqKHN0cmluZ3MpOworICAgICoocFNPUyk7CisgICAgKihwUk9CRSk7CisgICAgKihwTkEpOworICAgICoocEhJTEUpOworICAgICoocFJFUEMpOworICAgICoocFJQQyk7CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9CisgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygwKTt9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKTt9CisgICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKTt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCk7fQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9CisgICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZXRleHQgPSAuKTt9CisgICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9ldGV4dCA9IC4pO30KKyAgfQorICAuZGF0YSAke1JFTE9DQVRJTkc6LTB9IDogJHtSRUxPQ0FUSU5HKyBBVChBRERSKC50ZXh0KSArIFNJWkVPRigudGV4dCkpfSB7CisgICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZGF0YSA9IC4pO30KKyAgICAqKC5kYXRhKTsKKyAgICAqKHZhcnMpOworICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2VkYXRhID0gLik7fQorICAgICR7UkVMT0NBVElORysgUFJPVklERShfZWRhdGEgPSAuKTt9CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkc6LTB9IDoKKyAgeyAJCQkJCQorICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2JzcyA9IC4pO30KKyAgICAqKC5ic3MpOworICAgICooemVyb3ZhcnMpOworICAgICooQ09NTU9OKTsKKyAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lYnNzID0gLik7fQorICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2VuZCA9IC4pO30KKyAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2VuZCA9IC4pO30KKyAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX0ZyZWVNZW1TdGFydCA9IC4pO30KKyAgfQorICAuc3RhYiAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKKyAgeworICAgICooLnN0YWIpOworICB9CisgIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICAqKC5zdGFic3RyKTsKKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MgYi9sZC9zY3JpcHR0ZW1wbC9yaXNjaXguc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMWEwYwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYwpAQCAtMCwwICsxLDM1IEBACitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorT1VUUFVUX0FSQ0goJHtBUkNIfSkKKworJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KKyR7UkVMT0NBVElORytfX0RZTkFNSUMgID0gIDA7fQorJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ciske1NITElCX1BBVEgrJHtSRUxPQ0FUSU5HKyR7U0hMSUJfUEFUSH19fQorU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX06CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgICR7UEFEX1RFWFQrJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9fQorICAgICR7UkVMT0NBVElORytfZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9CisgICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAke0RBVEFfQUxJR05NRU5UfTt9CisgIH0KKyAgLmRhdGEgICR7UkVMT0NBVElORyske0RBVEFfQUxJR05NRU5UfX0gOgorICB7CisgICAgKiguZGF0YSkKKyAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9CisgICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9CisgICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgPSAgLjt9CisgIH0KKyAgLmJzcyAke1JFTE9DQVRJTkcrU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6CisgIHsKKyAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OworICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmYyNjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYwpAQCAtMCwwICsxLDQ0IEBACitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorRU5UUlkoc3RhcnQpCisKK1NFQ1RJT05TIHsKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiAKKyAgICB7CisJKigudGV4dCk7CisJKigudGV4dDEpOworCSooLnRleHQyKTsKKwkke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07CisgICAgfQorICAubGl0IEFMSUdOKDQpIDoKKyAgIHsKKwkqKC5saXQpOworCSR7UkVMT0NBVElORytfZWxpdCA9IC59OworICAgfQorICAuZGF0YSBBTElHTig0KSA6CisgICAgeworCSooLmRhdGEpOworCSooLmRhdGExKTsKKwkqKC5kYXRhMik7CisJJHtSRUxPQ0FUSU5HK19lZGF0YSA9IC59OworCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KKwkke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KKwkke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KKwkke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQorCSR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQorCSR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9CisJJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9CisJJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9CisJJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KKwkke0NPTlNUUlVDVElORysgTE9ORygwKX0KKwkke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQorICAgIH0KKworICAuYnNzICBBTElHTig0KSA6CisgICAgeyAKKwkqKENPTU1PTikgCQorCSooLmJzcykKKwkke1JFTE9DQVRJTkcrX2VuZCA9IC59OworICAgIH0gCit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NoLnNjIGIvbGQvc2NyaXB0dGVtcGwvc2guc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2ZGQyMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL3NoLnNjCkBAIC0wLDAgKzEsNTkgQEAKK1RPUlM9Ii50b3JzIDoKKyAgeworICAgIF9fX2N0b3JzID0gLiA7CisgICAgKiguY3RvcnMpCisgICAgX19fY3RvcnNfZW5kID0gLiA7CisgICAgX19fZHRvcnMgPSAuIDsKKyAgICAqKC5kdG9ycykKKyAgICBfX19kdG9yc19lbmQgPSAuIDsKKyAgfSA+IHJhbSIKKworY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCisKK01FTU9SWQoreworICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEyaworfQorCitTRUNUSU9OUworeworICAudGV4dCA6CisgIHsKKyAgICAqKC50ZXh0KQorICAgICooLnN0cmluZ3MpCisgICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQorICB9ICR7UkVMT0NBVElORysgPiByYW19CisgICR7Q09OU1RSVUNUSU5HKyR7VE9SU319CisgIC5kYXRhIDoKKyAgeworICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQorICB9ICR7UkVMT0NBVElORysgPiByYW19CisgIC5ic3MgOgorICB7CisgICAgJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7IH0KKyAgICAqKC5ic3MpCisgICAgKihDT01NT04pCisgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9CisgIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKyAgLnN0YWNrICR7UkVMT0NBVElORysgMHgzMDAwMCB9ICA6CisgIHsKKyAgICAke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9CisgICAgKiguc3RhY2spCisgIH0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKyAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgICooLnN0YWIpCisgIH0KKyAgLnN0YWJzdHIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgICooLnN0YWJzdHIpCisgIH0KK30KK0VPRgorCisKKworCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiYjdhZAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYwpAQCAtMCwwICsxLDQ4IEBACisjIExpbmtlciBzY3JpcHQgZm9yIFNwYXJjIENPRkYuCisjIEJhc2VkIG9uIGkzODZjb2ZmLnNjIGJ5IElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KK3Rlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0CitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorJHtMSUJfU0VBUkNIX0RJUlN9CisKK0VOVFJZKCR7RU5UUll9KQorCitTRUNUSU9OUworeworICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKKyAgICAqKC5pbml0KQorICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9CisgICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KKyAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQorICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KKyAgICAqKC5maW5pKQorICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OworICB9CisgIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKKyAgICAqKC5kYXRhKQorICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC59OworICB9CisgIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKKyAgeyAJCQkJCQorICAgICooLmJzcykKKyAgICAqKENPTU1PTikKKyAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC59OworICB9CisgIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKKyAgeworICAgIFsgLnN0YWIgXQorICB9CisgIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgorICB7CisgICAgWyAuc3RhYnN0ciBdCisgIH0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjFlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MKQEAgLTAsMCArMSw0NyBAQAorIyBMaW5rZXIgc2NyaXB0IGZvciBTcGFyYyBMeW54T1MuCit0ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKKyR7TElCX1NFQVJDSF9ESVJTfQorCitFTlRSWSgke0VOVFJZfSkKKworU0VDVElPTlMKK3sKKyAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7CisgICAgKiguaW5pdCkKKyAgICAqKC50ZXh0KQorICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQorICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KKyAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KKyAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9CisgICAgKiguZmluaSkKKyAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKKyAgfQorICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7CisgICAgKiguZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKKyAgfQorICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6CisgIHsgCQkJCQkKKyAgICAqKC5ic3MpCisgICAgKihDT01NT04pCisgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKKyAgfQorICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCisgIHsKKyAgICBbIC5zdGFiIF0KKyAgfQorICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9Cit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWUxMzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvc3QyMDAwLnNjCkBAIC0wLDAgKzEsMjYgQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCitPVVRQVVRfQVJDSCgke0FSQ0h9KQorCisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0IDoKKwl7IAkJCQkJCisJICAqKC50ZXh0KSAJCQkJCisJICAqKC5zdHJpbmdzKQorICAgCSAgX2V0ZXh0ID0gLjsKKwkqKC5kYXRhKQorCV9lZGF0YSA9IC47CisJKiguYnNzKQorCSooQ09NTU9OKQorCSBfZW5kID0gLjsKKworfQorCit9CitFT0YKKworCisKKwpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmFlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MKQEAgLTAsMCArMSwzNCBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCR7QVJDSH0pCisKKyR7U1RBQ0taRVJPKyR7UkVMT0NBVElORyske1NUQUNLWkVST319fQorJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc3RhY2sgPSAwKTt9CitTRUNUSU9OUworeworICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9CisgIC50ZXh0IDoKKyAgeworICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUworICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQorICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gLjt9CisgICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319CisgIH0KKyAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9CisgIC5kYXRhIDoKKyAgeworICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9CisgICAgJHtSRUxPQ0FUSU5HK19fZWRhdGEgID0gIC47fQorICB9CisgIC5ic3MgOgorICB7CisgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKKyAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07CisgIH0KK30KK0VPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMmQ0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MKQEAgLTAsMCArMSw1OCBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCIke09VVFBVVF9BUkNIfSIpCisKK01FTU9SWQoreworCXJvbSA6IE9SSUdJTiA9IDB4MDAwMDAzMDAsIExFTkdUSCA9IDE2aworCXJhbSA6IE9SSUdJTiA9IDB4MDAwMDAzMDAgKyAxNmssIExFTkdUSCA9IDE2aworCXJhbWJsazAgOiBPUklHSU4gPSAweDAyMDI2MDAwLCBMRU5HVEggPSAweDEwMDAKKwlyYW1ibGsxIDogT1JJR0lOID0gMHgwMjAyNzAwMCwgTEVOR1RIID0gMHgxMDAwCit9CisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy52ZWN0b3JzIDB4MDAwMDAwMDAgOgoreworCSoodmVjdG9ycykKK30KKworLnRleHQgOiAKK3sKKwkqKC50ZXh0KQorfSA+IHJvbQorCisuY29uc3QgOgoreworCSooLmNvbnN0KQorCV9fZXRleHQgPSAuIDsKK30gPiByb20KKworLm1kYXRhIDogQVQoIEFERFIoLmNvbnN0KSArIFNJWkVPRiguY29uc3QpICkKK3sKKwlfX2RhdGEgPSAuIDsKKwkqKC5kYXRhKTsKKwlfX2VkYXRhID0gLiA7Cit9ID4gcmFtCisKKy5ic3MgOgoreworCV9fYnNzID0gLiA7CisJKiguYnNzKTsKKwkqKENPTU1PTik7CisJX19lYnNzID0gLiA7Cit9ID4gcmFtCisKKy5yYW0wIDoKK3sKKwkqKHJhbTApCit9ID4gcmFtYmxrMAorCisucmFtMSA6Cit7CisJKihyYW0xKQorfSA+IHJhbWJsazEKKworfQorCitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZmNjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjCkBAIC0wLDAgKzEsNzQgQEAKKyMgTGlua2VyIHNjcmlwdCBmb3IgVEkgVE1TMzIwQzgwICh0aWM4MCkgQ09GRi4KKyMKKyMgQmVzaWRlcyB0aGUgc2hlbGwgdmFyaWFibGVzIHNldCBieSB0aGUgZW11bHBhcmFtcyBzY3JpcHQsIGFuZCB0aGUgTERfRkxBRworIyB2YXJpYWJsZSwgdGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHdpbGwgc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGZvciBlYWNoCisjIHRpbWUgdGhpcyBzY3JpcHQgaXMgcnVuIHRvIGdlbmVyYXRlIG9uZSBvZiB0aGUgbGlua2VyIHNjcmlwdHMgZm9yIGxkc2NyaXB0czoKKyMKKyMgUkVMT0NBVElORzogU2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZ29pbmcgdG8gYmUgZG9pbmcKKyMgYSBmaW5hbCByZWxvY2F0aW9uLgorIworIyBDT05TVFJVQ1RJTkc6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGdvaW5nIHRvIGJlCisjIGJ1aWxkaW5nIGdsb2JhbCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMuCisjCisjIERBVEFfQUxJR05NRU5UOiBTZXQgdG8gYW4gQUxJR04gZXhwcmVzc2lvbiB3aGVuIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHBhZ2UKKyMgYWxpZ25lZCwgb3IgdG8gIi4iIHdoZW4gZ2VuZXJhdGluZyB0aGUgLU4gc2NyaXB0LgorIworIyBDUkVBVEVfU0hMSUI6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBnZW5lcmF0aW5nIGEgc2NyaXB0IGZvcgorIyB0aGUgLXNoYXJlZCBsaW5rZXIgYXJnLgorCit0ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4ODAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKK3Rlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X19zdGFydAorCitjYXQgPDxFT0YKK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQorJHtMSUJfU0VBUkNIX0RJUlN9CisKK0VOVFJZKCR7RU5UUll9KQorCitTRUNUSU9OUworeworICAudGV4dCAke1JFTE9DQVRJTkcrICRURVhUX1NUQVJUX0FERFJ9IDogeworICAgICooLmluaXQpCisgICAgKiguZmluaSkKKyAgICAqKC50ZXh0KQorICB9CisgIC5jb25zdCBBTElHTig0KSA6IHsKKyAgICAqKC5jb25zdCkKKyAgfQorICAuY3RvcnMgQUxJR04oNCkgOiB7CisgICAgJHtDT05TVFJVQ1RJTkcrIC4gPSBBTElHTig0KTt9CisgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoLTEpfQorICAgICooLmN0b3JzKQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgIH0KKyAgLmR0b3JzIEFMSUdOKDQpIDogeworICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQorICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKC0xKX0KKyAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQorICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9CisgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9CisgIH0KKyAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9CisgIC5kYXRhIDogeworICAgICooLmRhdGEpCisgICAgJHtSRUxPQ0FUSU5HKyBfX2VkYXRhICA9ICAufTsKKyAgfQorICAuYnNzIDogeyAJCQkJCQorICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKKyAgICAqKC5ic3MpCisgICAgKihDT01NT04pCisgICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OworICAgICAke1JFTE9DQVRJTkcrIF9fZW5kID0gQUxJR04oMHg4KX07CisgIH0KKyAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAorICB7CisgICAgWyAuc3RhYiBdCisgIH0KKyAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6CisgIHsKKyAgICBbIC5zdGFic3RyIF0KKyAgfQorfQorRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC92ODUwLnNjIGIvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjJmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYwpAQCAtMCwwICsxLDIwNCBAQAorY2F0IDw8IEVPRgorT1VUUFVUX0ZPUk1BVCgiZWxmMzItdjg1MCIsICJlbGYzMi12ODUwIiwKKwkgICAgICAiZWxmMzItdjg1MCIpCitPVVRQVVRfQVJDSCh2ODUwKQorRU5UUlkoX3N0YXJ0KQorU0VBUkNIX0RJUiguKTsKKy8qL2NyaXR0ZXJzL3NsdWcvZ3Jvc3NtYW4vaW5zdGFsbC9zdW40L3Y4NTAtZWxmL2xpYiovCitTRUNUSU9OUworeworICAvKiBUaGlzIHNhdmVzIGEgbGl0dGxlIHNwYWNlIGluIHRoZSBFTEYgZmlsZSwgc2luY2UgdGhlIHpkYSBzdGFydHMKKyAgICAgYXQgYSBoaWdoZXIgbG9jYXRpb24gdGhhdCB0aGUgRUxGIGhlYWRlcnMgdGFrZSB1cC4gICovCisKKyAgLnpkYXRhICR7WkRBVEFfU1RBUlRfQUREUn0gOiB7CisJKiguemRhdGEpCisJKiguemJzcykKKwkqKHJlc3pkYXRhKQorCSooLnpjb21tb24pCisgIH0KKworICAvKiBUaGlzIGlzIHRoZSByZWFkIG9ubHkgcGFydCBvZiB0aGUgemVybyBkYXRhIGFyZWEuCisgICAgIEhhdmluZyBpdCBhcyBhIHNlcGVyYXRlIHNlY3Rpb24gcHJldmVudHMgaXRzCisgICAgIGF0dHJpYnV0ZXMgZnJvbSBiZWluZyBpbmhlcml0ZWQgYnkgdGhlIHpkYXRhCisgICAgIHNlY3Rpb24uICBTcGVjaWZpY2FsbHkgaXQgcHJldmVudHMgdGhlIHpkYXRhCisgICAgIHNlY3Rpb24gZnJvbSBiZWluZyBtYXJrZWQgUkVBRE9OTFkuICAqLworCisgIC5yb3pkYXRhICR7Uk9aREFUQV9TVEFSVF9BRERSfSA6IHsKKwkqKC5yb3pkYXRhKQorCSoocm9temRhdGEpCisJKihyb216YnNzKQorICB9CisKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAke1RFWFRfU1RBUlRfQUREUn07CisgIC5pbnRlcnAJOiB7ICooLmludGVycCkgfQorICAuaGFzaAkJOiB7ICooLmhhc2gpIH0KKyAgLmR5bnN5bQk6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIJOiB7ICooLmR5bnN0cikgfQorICAucmVsLnRleHQJOiB7ICooLnJlbC50ZXh0KSB9CisgIC5yZWxhLnRleHQJOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsLmRhdGEJOiB7ICooLnJlbC5kYXRhKSB9CisgIC5yZWxhLmRhdGEJOiB7ICooLnJlbGEuZGF0YSkgfQorICAucmVsLnJvZGF0YQk6IHsgKigucmVsLnJvZGF0YSkgfQorICAucmVsYS5yb2RhdGEJOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWwuZ290CTogeyAqKC5yZWwuZ290KSB9CisgIC5yZWxhLmdvdAk6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbC5jdG9ycwk6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWxhLmN0b3JzCTogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMJOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsYS5kdG9ycwk6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsLmluaXQJOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWxhLmluaXQJOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsLmZpbmkJOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWxhLmZpbmkJOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsLmJzcwk6IHsgKigucmVsLmJzcykgfQorICAucmVsYS5ic3MJOiB7ICooLnJlbGEuYnNzKSB9CisgIC5yZWwucGx0CTogeyAqKC5yZWwucGx0KSB9CisgIC5yZWxhLnBsdAk6IHsgKigucmVsYS5wbHQpIH0KKyAgLmluaXQJCTogeyBLRUVQICgqKC5pbml0KSkgfSA9MAorICAucGx0CQk6IHsgKigucGx0KSB9CisKKyAgLnRleHQJCTogeworICAgICooLnRleHQpCisgICAgJHtSRUxPQ0FUSU5HKyooLnRleHQuKil9CisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgICAgKiguZ251LmxpbmtvbmNlLnQqKQorICB9ID0wCisKKyAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQorICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9CisKKyAgIC8qIFRoaXMgaXMgc3BlY2lhbCBjb2RlIGFyZWEgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIHRleHQgc2VjdGlvbi4KKyAgICAgIEl0IGNvbnRhaW5zIGEgc21hbGwgbG9va3VwIHRhYmxlIGF0IHRoZSBzdGFydCBmb2xsb3dlZCBieSB0aGUKKyAgICAgIGNvZGUgcG9pbnRlZCB0byBieSBlbnRyaWVzIGluIHRoZSBsb29rdXAgdGFibGUuICAqLworCisgIC5jYWxsX3RhYmxlX2RhdGEgJHtDQUxMX1RBQkxFX1NUQVJUX0FERFJ9IDogeworICAgICR7UkVMT0NBVElORytQUk9WSURFKF9fY3RicCA9IC4pO30KKyAgICAqKC5jYWxsX3RhYmxlX2RhdGEpCisgIH0gPSAweGZmICAgLyogZmlsbCBnYXBzIHdpdGggMHhmZiAqLworICAuY2FsbF90YWJsZV90ZXh0IDogeworICAgICooLmNhbGxfdGFibGVfdGV4dCkKKyAgfQorCisgIC5maW5pCQk6IHsgS0VFUCAoKiguZmluaSkpICAgIH0gPTAKKyAgLnJvZGF0YQk6IHsgKigucm9kYXRhKSAke1JFTE9DQVRJTkcrKigucm9kYXRhLiopfSAqKC5nbnUubGlua29uY2UuciopIH0KKyAgLnJvZGF0YTEJOiB7ICooLnJvZGF0YTEpIH0KKworICAuZGF0YQkJOiB7CisgICAgKiguZGF0YSkKKyAgICAke1JFTE9DQVRJTkcrKiguZGF0YS4qKX0KKyAgICAqKC5nbnUubGlua29uY2UuZCopCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgLmRhdGExCTogeyAqKC5kYXRhMSkgfQorICAuY3RvcnMJOiB7CisgICAgJHtSRUxPQ0FUSU5HK19fX2N0b3JzID0gLjt9CisgICAgS0VFUCAoKiguY3RvcnMpKQorICAgICR7UkVMT0NBVElORytfX19jdG9yc19lbmQgPSAuO30KKyAgfQorCisgIC5kdG9ycwk6IHsKKyAgICAke1JFTE9DQVRJTkcrX19fZHRvcnMgPSAuO30KKyAgICBLRUVQICgqKC5kdG9ycykpCisgICAgJHtSRUxPQ0FUSU5HK19fX2R0b3JzX2VuZCA9IC47fQorICB9CisKKyAgLmdvdAkJOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQorICAuZHluYW1pYwk6IHsgKiguZHluYW1pYykgfQorCisgIC50ZGF0YSAke1REQVRBX1NUQVJUX0FERFJ9IDogeworCSR7UkVMT0NBVElORytQUk9WSURFIChfX2VwID0gLik7fQorCSooLnRieXRlKQorCSooLnRjb21tb25fYnl0ZSkKKwkqKC50ZGF0YSkKKwkqKC50YnNzKQorCSooLnRjb21tb24pCisgIH0KKworICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YSAke1NEQVRBX1NUQVJUX0FERFJ9IDogeworCSR7UkVMT0NBVElORytQUk9WSURFIChfX2dwID0gLiArIDB4ODAwMCk7fQorCSooLnNkYXRhKQorICAgfQorCisgIC8qIFNlZSBjb21tZW50IGFib3V0IC5yb3pkYXRhLiAqLworICAucm9zZGF0YSAke1JPU0RBVEFfU1RBUlRfQUREUn0gOiB7CisJKigucm9zZGF0YSkKKyAgfQorCisgIC8qIFdlIHBsYWNlIHRoZSAuc2JzcyBkYXRhIHNlY3Rpb24gQUZURVIgdGhlIC5yb3NkYXRhIHNlY3Rpb24sIHNvIHRoYXQKKyAgICAgaXQgY2FuIGRpcmVjdGx5IHByZWNlZWQgdGhlIC5ic3Mgc2VjdGlvbi4gIFRoaXMgYWxsb3dzIHJ1bnRpbWUgc3RhcnR1cAorICAgICBjb2RlIHRvIGluaXRpYWxpc2UgYWxsIHRoZSB6ZXJvLWRhdGEgc2VjdGlvbnMgYnkgc2ltcGx5IHRha2luZyB0aGUKKyAgICAgdmFsdWUgb2YgJ19lZGF0YScgYW5kIHplcm9pbmcgdW50aWwgaXQgcmVhY2hlcyAnX2VuZCcgICovCisgIC5zYnNzIDogeworCSR7UkVMT0NBVElORytfX3Nic3Nfc3RhcnQgPSAuO30KKwkqKC5zYnNzKQorCSooLnNjb21tb24pCisgIH0KKworICAke1JFTE9DQVRJTkcrX2VkYXRhICA9IERFRklORUQgKF9fc2Jzc19zdGFydCkgPyBfX3Nic3Nfc3RhcnQgOiAuIDt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IF9lZGF0YSk7fQorCisgIC5ic3MgICAgICAgOgorICB7CisJJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gREVGSU5FRCAoX19zYnNzX3N0YXJ0KSA/IF9fc2Jzc19zdGFydCA6IC4gO30KKwkke1JFTE9DQVRJTkcrX19yZWFsX2Jzc19zdGFydCA9IC4gO30KKwkqKC5keW5ic3MpCisJKiguYnNzKQorCSooQ09NTU9OKQorICB9CisKKyAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9CisgICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMAkJOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgMAkJOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAwCQk6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMAk6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAJCTogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAJOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgMAkJOiB7ICooLmNvbW1lbnQpIH0KKworICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisKKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMAk6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAJOiB7ICooLmxpbmUpIH0KKworICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwCTogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwCTogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9CisKKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwCTogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwCTogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorCisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAJOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAJOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMAk6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMAk6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAJOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMAk6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwCTogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisKKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMAk6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMAk6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMAk6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMAk6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKworICAvKiBVc2VyIHN0YWNrICovCisgIC5zdGFjayAweDIwMDAwMAk6IHsKKwkke1JFTE9DQVRJTkcrX19zdGFjayA9IC47fQorCSooLnN0YWNrKQorICB9CisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCit9CitFT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgYi9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTg0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9sZC9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjCkBAIC0wLDAgKzEgQEAKKyMgTm90aGluZyB0byBkby4KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3c2NS5zYyBiL2xkL3NjcmlwdHRlbXBsL3c2NS5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTA0NDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvdzY1LnNjCkBAIC0wLDAgKzEsNTggQEAKK2NhdCA8PEVPRgorT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCitPVVRQVVRfQVJDSCgke0FSQ0h9KQorCitNRU1PUlkgeworCXJhbSAgIDogbyA9IDB4MTAwMCwgbCA9IDUxMmsKKwl9CisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0IDoKKwl7IAkJCQkJCisJICAqKC50ZXh0KSAJCQkJCisJICAqKC5zdHJpbmdzKQorICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9CisJfSAke1JFTE9DQVRJTkcrID4gcmFtfQorCisKKy50b3JzICAgOiB7CisJX19fY3RvcnMgPSAuIDsKKwkqKC5jdG9ycykKKwlfX19jdG9yc19lbmQgPSAuIDsKKwlfX19kdG9ycyA9IC4gOworCSooLmR0b3JzKQorCV9fX2R0b3JzX2VuZCA9IC4gOworfSAgJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKworLmRhdGEgIDoKKwl7CisJKiguZGF0YSkKKwkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9CisJfSAke1JFTE9DQVRJTkcrID4gcmFtfQorLmJzcyAgOgorCXsKKwkke1JFTE9DQVRJTkcrIF9ic3Nfc3RhcnQgPSAuIDsgfQorCSooLmJzcykKKwkqKENPTU1PTikKKwkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KKwl9ICR7UkVMT0NBVElORysgPnJhbX0KKy5zdGFjayAke1JFTE9DQVRJTkcrIDB4MzAwMDAgfSAgOiAKKwl7CisJJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQorCSooLnN0YWNrKQorCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KKyAgLnN0YWIgIC4gKE5PTE9BRCkgOiAKKyAgeworICAgIFsgLnN0YWIgXQorICB9CisgIC5zdGFic3RyICAuIChOT0xPQUQpIDoKKyAgeworICAgIFsgLnN0YWJzdHIgXQorICB9Cit9CitFT0YKKworCisKKwpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC96ODAwMC5zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg3OTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MKQEAgLTAsMCArMSw1NCBAQAorY2F0IDw8RU9GCitPVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKK09VVFBVVF9BUkNIKCIke09VVFBVVF9BUkNIfSIpCitFTlRSWShfc3RhcnQpCisKK1NFQ1RJT05TIAkJCQkKK3sgCQkJCQkKKy50ZXh0ICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MDAwMDAwMH19IDogeyAJCQkJCQorCSAgKigudGV4dCkgCQkJCQorCSAgKiguc3RyaW5ncykKKwkgICooLnJkYXRhKQorCX0KKworLmN0b3JzICR7QklHKyAke1JFTE9DQVRJTkcrIDB4MjAwMDAwMH19ICA6IAorCXsKKwkgICR7UkVMT0NBVElORysgX19fY3RvcnMgPSAuIDsgIH0KKwkgICooLmN0b3JzKTsKKwkgICR7UkVMT0NBVElORysgX19fY3RvcnNfZW5kID0gLiA7IH0KKwkgIF9fX2R0b3JzID0gLiA7CisJICAqKC5kdG9ycyk7CisJICAke1JFTE9DQVRJTkcrIF9fX2R0b3JzX2VuZCA9IC4gOyB9CisJfSAKKworLmRhdGEgJHtCSUcrICR7UkVMT0NBVElORysgMHgzMDAwMDAwfX0gOiB7CisJKiguZGF0YSkKKwl9CisKKy5ic3MgJHtCSUcrICR7UkVMT0NBVElORysgMHg0MDAwMDAwfX0gOiAKKyAgeworICAgICR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQorICAgICooLmJzcyk7CisgICAgKihDT01NT04pOworICAgICR7UkVMT0NBVElORysgX19lbmRfYnNzID0gLiA7IH0KKyAgfQorCisuaGVhcCAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDUwMDAwMDB9fSA6IHsKKwkke1JFTE9DQVRJTkcrIF9fc3RhcnRfaGVhcCA9IC4gOyB9CisJJHtSRUxPQ0FUSU5HKyAuID0gLiArIDIwayAgOyB9CisJJHtSRUxPQ0FUSU5HKyBfX2VuZF9oZWFwID0gLiA7IH0KKwl9IAorCisuc3RhY2sgJHtSRUxPQ0FUSU5HKyAweGYwMDAgfSAgOiAKKwl7CisJJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQorCSooLnN0YWNrKQorCSR7UkVMT0NBVElORysgX19zdGFja190b3AgPSAuIDsgfQorCX0gCisKK30KK0VPRgorCisKKworCmRpZmYgLS1naXQgYS9sZC9zdGFtcC1oLmluIGIvbGQvc3RhbXAtaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg4ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvc3RhbXAtaC5pbgpAQCAtMCwwICsxIEBACit0aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2xkL3N5c2RlcC5oIGIvbGQvc3lzZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjYzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3N5c2RlcC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIHN5c2RlcC5oIC0tIGhhbmRsZSBob3N0IGRlcGVuZGVuY2llcyBmb3IgdGhlIEdOVSBsaW5rZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCisKKyAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgTERfU1lTREVQX0gKKyNkZWZpbmUgTERfU1lTREVQX0gKKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKK2V4dGVybiBjaGFyICpzdHJyY2hyICgpOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCisjaW5jbHVkZSAiZm9wZW4tYmluLmgiCisjZWxzZQorI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKK2V4dGVybiBjaGFyICpzdHJzdHIgKCk7CisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorZXh0ZXJuIHZvaWQgZnJlZSAoKTsKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYKK2V4dGVybiBjaGFyICpnZXRlbnYgKCk7CisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgorZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworI2VuZGlmCisKKyNlbmRpZiAvKiAhIGRlZmluZWQgKExEX1NZU0RFUF9IKSAqLwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL0NoYW5nZUxvZyBiL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMGNiZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKQEAgLTAsMCArMSw3MzEgQEAKKzE5OTktMDMtMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBEbyBub3QgcnVuIHRlc3RzIGZvciBDT0ZGIG9yIFBFCisJYmFzZWQgcG9ydHMuCisKKzE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZXMgZm9yIFN0cm9uZ0FSTQorCXRhcmdldHMuCisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBmb3IgU3Ryb25nQVJNIHRhcmdldHMuCisKKwkqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiBBZGQgZXhwZWN0ZWQgZmFpbHVyZSBmb3IgQVJNLUNPRkYKKwl0YXJnZXRzLiAKKworMTk5OS0wMi0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGQtY2hlY2tzL2FzbS5zOiBVc2UgLmxvbmcgaW5zdGVhZCBvZiAud29yZC4KKwlSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsIC5kYXRhIGFuZCAuYnNzLgorCSogbGQtY2hlY2tzL3NjcmlwdDogUmVwbGFjZSBjdXN0b20gc2VjdGlvbiBuYW1lcyB3aXRoIC50ZXh0LCAuZGF0YQorCWFuZCAuYnNzLiAKKwkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsCisJLmRhdGEgYW5kIC5ic3MuIAorCisxOTk5LTAyLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsZC1jaGVja3M6IE5ldyBkaXJlY3Rvcnk6ICBUZXN0cyBmb3IgdGhlIGxpbmtlcidzCisJLS1jaGVjay1zZWN0aW9ucyBvcHRpb24uCisJKiBsZC1jaGVja3MvY2hlY2tzLmV4cDogTmV3IGZpbGUuCisJKiBsZC1jaGVja3Mvc2NyaXB0OiBCb2d1cyBsaW5rZXIgc2NyaXB0LgorCSogbGQtY2hlY2tzL2FzbS5zOiBTaW1wbGUgdGVzdCBhc3NlbWJsZXIgZmlsZS4KKworVHVlIEZlYiAgMiAxOToxNTowMiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGxkLXNlbGVjdGl2ZS9zZWxlY3RpdmUuZXhwOiAgRGlzYWJsZSB0ZXN0IGZvciB1bnN1cHBvcnRlZAorICAgICAgICB0YXJnZXRzLiAgQ2hhbmdlIHRlc3RzIHRvIGNoZWNrIGZvciBhYnNlbmNlIG9mIHN5bWJvbHMgaW5zdGVhZAorICAgICAgICBvZiBhZGRyZXNzIHplcm8uCisKK01vbiBKYW4gMTggMDM6NDQ6NTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvZGVmYXVsdC5leHAgKGdldF9saW5rX2ZpbGVzKTogUXVvdGUgdGFyZ2V0X3RyaXBsZXQgYW5kIENDCisJd2hlbiBpbnZva2luZyBzaGVsbC4KKwkoZ2V0X3RhcmdldF9lbXVsKTogTGlrZXdpc2UuCisKKzE5OTktMDEtMDMgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBjb25maWcvZGVmYXVsdC5leHAgKGdldF9saW5rX2ZpbGVzLCBnZXRfdGFyZ2V0X2VtdWwpOiBOZXcgcHJvY3M7CisJcnVuIHNoZWxsIGNvbW1hbmRzIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBjb25maWd1cmUuaG9zdCBhbmQKKwljb25maWd1cmUudGd0IGluIHRoZSBzb3VyY2UgdHJlZS4KKwkodG9wIGxldmVsKTogVXNlIHRoZW0gdG8gZ2V0IGluZm9ybWF0aW9uIG5lZWRlZCB0byBydW4gdGVzdHMsIGlmCisJbm90IG90aGVyd2lzZSBwcm92aWRlZC4KKworCSogbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQ6IE5ldyBmaWxlLiAgQnVpbGRzIGEgc2hhcmVkIGxpYnJhcnksIGJ1dAorCWdpdmVzIG5vbi16ZXJvIGFkZHJlc3NlcyBmb3IgbWVtb3J5IHJlZ2lvbi4KKwkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIG5vbi1QSUMgbm9uLUFJWCB0ZXN0IGFnYWluIHVzaW5nCisJdGhlIG5ldyBsaW5rZXIgc2NyaXB0LgorCitUdWUgRGVjICA4IDIyOjU2OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IERlbGV0ZSB4ZmFpbHMgZm9yIFBQQyBMaW51eCB0YXJnZXRzLAorCW5ld2VyIGdsaWJjIGxldHMgbGluayBzdWNjZWVkLgorCitTdW4gRGVjICA2IDEyOjU5OjM3IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KKworCSogbGQtZWxmdmVycy92ZXJzMS5jOiBBZGQgbWlzc2luZyByZXR1cm4gdHlwZXMgYW5kIHZhbHVlcy4KKwkqIGxkLWVsZnZlcnMvdmVyczIuYzogTGlrZXdpc2UuCisJKiBsZC1lbGZ2ZXJzL3ZlcnMzLmM6IExpa2V3aXNlLgorCSogbGQtZWxmdmVycy92ZXJzNC5jOiBMaWtld2lzZS4KKwkqIGxkLWVsZnZlcnMvdmVyczUuYzogTGlrZXdpc2UuCisJKiBsZC1lbGZ2ZXJzL3ZlcnM2LmM6IExpa2V3aXNlLgorCSogbGQtZWxmdmVycy92ZXJzNy5jOiBMaWtld2lzZS4KKwkqIGxkLWVsZnZlcnMvdmVyczkuYzogTGlrZXdpc2UuCisJKiBsZC1lbGZ2ZXJzL3ZlcnMxNS5jOiBMaWtld2lzZS4KKworRnJpIE9jdCAyMyAxNjoyODoyOSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgorCisgICAgICAgKiBsZC1zZWxlY3RpdmU6ICBOZXcgZGlyZWN0b3J5IHdpdGggbmV3IGZpbGVzIHRvIHRlc3QKKyAgICAgICBzZWxlY3RpdmUgbGlua2luZy4KKworICAgICAgICogbGliL2xkLWxpYi5leHAgKGxkX25tKTogIFN0cmlwIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tICRuYW1lLgorICAgICAKK1N1biBPY3QgIDQgMjI6MTc6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1lbGZ2ZXJzL3ZlcnMxNi5kc3ltOiBXb3JrIGNvcnJlY3RseSBvbiBhIHN5c3RlbSB3aXRob3V0CisJdmVyc2lvbmVkIHN5c3RlbSBsaWJyYXJpZXMuCisKK01vbiBTZXAgMjggMjE6MzE6MTIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIGFscGhhLWxpbnV4LgorCSogbGQtZWxmdmVycy8qLnN5bSwgbGQtZWxmdmVycy8qLmRzeW06IEFkanVzdCBwYXR0ZXJzIHRvIG1hdGNoCisJQWxwaGEncyB1c2Ugb2Ygc3Rfb3RoZXIuCisKKzE5OTgtMDktMjcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwICh2ZXJzMTYsIHZlcnMxNmEpOiBOZXcgdGVzdHMuCisJKiBsZC1lbGZ2ZXJzL3t2ZXJzMTYuKiwgdmVyczE2YS4qfTogTmV3IGZpbGVzLgorCitUaHUgU2VwIDE3IDE3OjE4OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBNYWtlIHVuZGVmaW5lZCBsaW5lIHRlc3QgYmUgYW4geGZhaWwKKwlmb3IgYXJtL3RodW5iIGVsZiB0b29sY2hhaW5zLgorCitXZWQgU2VwICA5IDE0OjEwOjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBjaGFuZ2UgdGVzdCBmb3IgZWxmL2R3YXJmMiB0YXJnZXRzLgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBBcm0tZWxmIG5vdyBwYXNzZXMgdGhpcyB0ZXN0LgorCitXZWQgQXVnIDE5IDExOjU5OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBhcm0vdGh1bWItZWxmIGV4cGVjdGVkIGZhaWx1cmVzLgorCQorVGh1IEF1ZyAxMyAxMjo0MTo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBEb24ndCBydW4gdGhlIC0tc3RhdGljIGJvb3RzdHJhcAorCXRlc3QgaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXRpYyBsaWJiZmQuYS4KKworV2VkIEF1ZyAxMiAxNToxOTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlCYXNlZCBvbiBwYXRjaCBmcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKKwkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIEFscGhhIEVMRiB0YXJnZXRzLgorCitNb24gQXVnIDEwIDE1OjQyOjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGxkLXNjcmlwdHMvd2Vhay50ICgudGV4dCwgLmRhdGEpOiBGb2N1cyBkYXRhIHRvIGJlIHVzZWQuCisJKC9ESVNDQVJELyk6IEFsbCB0aGUgcmVzdC4KKwkqIGxkLXNjcmlwdHMvd2VhazEucywgbGQtc2NyaXB0cy93ZWFrMi5zOiBQdXQgc3R1ZmYgaW4gLmRhdGEuCisKK0ZyaSBKdWwgMjQgMTg6Mzc6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcvZGVmYXVsdC5leHA6IENyZWF0ZSB0bXBkaXIvZ2FzIHN1YmRpcmVjdG9yeSwgYWRkIGEKKwlzeW1saW5rIHRvIGFzLW5ldywgYW5kIHNldCBnY2NfZ2FzX2ZsYWcgdmFyaWFibGUuCisJKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgdGhlIGNvbXBpbGVyIGFwcGVhcnMgdG8KKwliZSBnY2MsIHVzZSBnY2NfZ2FzX2ZsYWcgd2hlbiBjb21waWxpbmcuCisKK1RodSBKdWwgMjMgMTI6MjM6MjkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBKdXN0IGNoZWNrIGZvciBpPzg2IHJhdGhlciB0aGFuIGNoZWNraW5nCisJZm9yIGkzODYsIGk0ODYsIGFuZCBpNTg2LgorCShvYmpkdW1wX3ZlcnNpb25zdHVmZik6IElmIHdlIGNhbid0IGZpbmQgdGhlIGxpbmUsIGR1bXAgdGhlIGZpbGUuCisKK0ZyaSBKdWwgIDMgMDA6Mjc6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogUnVuIHRlc3Qgb24gKi0qLWVhYmkqLgorCSogbGQtc2NyaXB0cy93ZWFrLmV4cDogTGlrZXdpc2UuCisKK1dlZCBKdWwgIDEgMTA6NTE6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlsIGZvciB2ODUwLgorCisJKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogYXJtIGFuZCB0aHVtYiBQRSB0b29sY2hhaW5zIG5vdyBwYXNzCisJdGhlc2UgdGVzdHMuCisKK0ZyaSBKdW4gMTkgMTc6MTI6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zY3JpcHRzL3dlYWsuZXhwOiBOZXcgdGVzdC4KKwkqIGxkLXNjcmlwdHMvd2Vhay50OiBOZXcgZmlsZS4KKwkqIGxkLXNjcmlwdHMvd2VhazEuczogTmV3IGZpbGUuCisJKiBsZC1zY3JpcHRzL3dlYWsyLnM6IE5ldyBmaWxlLgorCitUdWUgSnVuIDE2IDEyOjQwOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+CisKKwkqIGxkLWVsZnZlcnMvdmVycy5leHA6IFJ1biB0ZXN0cyBvbiBwb3dlcnBjIEVMRiB0YXJnZXRzLgorCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgorCSogbGQtZWxmdmVycy92ZXJzMS5kc3ltOiBBbGxvdyBmb3IgLnNkYXRhLgorCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgUG93ZXJQQyBMaW51eC4KKworRnJpIE1heSAyOSAxNTowMjo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCB4ZmFpbHMgZm9yIHBvd2VycGMqLSotZWFiaS4KKyAJKHJ1bl9zcmVjX3Rlc3QpOiBPbiBtbjEwMjAwLCBkZWZpbmUgX190cnVuY3NpcHNpMl9kb19kMi4KKwkqIGxkLXNyZWMvc3IxLmMgKF9fbWFpbik6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLgorCSogbGQtc3JlYy9zcjMuY2MgKF9fbWFpbik6IExpa2V3aXNlLgorCShfX2J1aWx0aW5fZGVsZXRlLCBfX2J1aWx0aW5fbmV3KTogTGlrZXdpc2UuCisJKF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbik6IFJldHVybiAwLgorCShfX2dldF9laF9jb250ZXh0KTogTGlrZXdpc2UuCisKK1RodSBNYXkgMjEgMTU6MjE6MzMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzdXBwb3J0IGZvciB0aHVtYi1wZSB0YXJnZXQuCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc3VwcG9ydCBmb3IgYXJtLXBlIGFuZCB0aHVtYi1wZSB0YXJnZXRzLgorCitNb24gTWF5ICA0IDE3OjU0OjIwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlscyBmb3IgbTY4ay1saW51eC4KKworTW9uIE1heSAgNCAxNzoxMjowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNoYXJlZC9tYWluLmMgKHNobGliX292ZXJyaWRkZW5jYWxsMik6IE5ldyBmdW5jdGlvbi4KKwkobWFpbik6IENhbGwgc2hsaWJfc2hsaWJjYWxsMi4KKwkqIGxkLXNoYXJlZC9zaDEuYyAoc2hsaWJfc2hsaWJjYWxsMik6IE5ldyBmdW5jdGlvbi4KKwkoc2hsaWJfb3ZlcnJpZGRlbmNhbGwyKTogTmV3IGZ1bmN0aW9uLgorCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IEFkZCBvdXRwdXQgbGluZSBmb3IgbmV3IHRlc3QuCisJKiBsZC1zaGFyZWQvc3VuNC5kYXQ6IExpa2V3aXNlLgorCisJKiBsZC1zcmVjL3NyMy5jYyAoX19nZXRfZWhfY29udGV4dCk6IE5ldyBmdW5jdGlvbi4KKworVHVlIEFwciAgNyAxMjo1MDoxNyAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmggKGNsYXNzIEZvbyk6IERlY2xhcmUgbGVuIHRvIGJlIHN0YXRpYyB0bworCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCisJKiBsZC1zcmVjL3NyMy5jYyAoY2xhc3MgRm9vKTogTGlrZXdpc2UuCisKK1R1ZSBGZWIgMTAgMTY6NDI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyMy5jYyAoX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluKTogTmV3IGZ1bmN0aW9uLgorCitNb24gRmViICAyIDE0OjE3OjQ4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc2NyaXB0cy9waGRycy5leHA6IEFkanVzdCBwaGRyc19yZWdleHAgZm9yIGEgNjQgYml0IHRhcmdldC4KKworVGh1IERlYyAxOCAxMToxMzoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBEdXBsaWNhdGVkIEFybSBwYXRjaCBmb3IgVGh1bWIgdGFyZ2V0cy4KKworVHVlIERlYyAgMiAwOTo1MDoxOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBBcHBsaWVkIHBhdGNoIGZyb20gVG9ueS5UaG9tcHNvbkBhcm0uY29tIHdoaWNoCisJZml4ZXMgQVJNIHRlc3RzLgorCitNb24gRGVjICAxIDE2OjEyOjA1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBvZiB0ZXN0cyAxIGFuZCAyIGZvciBBUk0KKwljb2ZmIHRhcmdldHMuCisKK1dlZCBOb3YgMTIgMTQ6MTg6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1jZHRlc3QvY2R0ZXN0LWZvby5oIChjbGFzcyBGb28pOiBEZWNsYXJlIGxlbiB0byBiZSBpbnQgdG8KKwlhdm9pZCBjb21waWxlciB3YXJuaW5nLgorCSogbGQtc3JlYy9zcjMuY2MgKGNsYXNzIEZvbyk6IExpa2V3aXNlLgorCitNb24gTm92IDEwIDE0OjI1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGliL2xkLWxpYi5leHAgKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmspOiBQZXJtaXQgdGhlIGxpbmtlciB0bworCWhhdmUgYW55IG5hbWUgd2hlbiBsb29raW5nIGZvciBlbnRyeSBzeW1ib2wgd2FybmluZ3MuCisKKwkqIGxkLXNyZWMvc3IzLmNjIChfX2VoX3BjKTogRGVmaW5lLgorCitNb24gT2N0IDIwIDE0OjM2OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc3JlYy9zcjMuY2M6IEFkZCBkZWZpbml0aW9ucyBmb3IgdGVybWluYXRlLCBfX3Rlcm1pbmF0ZSwgYW5kCisgCV9fdGhyb3csIHNpbmNlIHRoZSBjdXJyZW50IGcrKyBleHBlY3RzIHRoZW0gdG8gYmUgZGVmaW5lZC4KKworRnJpIE9jdCAgMyAxMjoyNDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLWVsZnZlcnMvdmVycy5leHAgKG9iamR1bXBfZW1wdHl2ZXJzdHVmZik6IEFjY2VwdCB0aGUgb3V0cHV0CisJZmlsZSBpZiB0aGUgc3RyaW5nIGxpYmMgYXBwZWFycyBpbiBpdC4KKwkob2JqZHVtcF92ZXJzaW9uc3R1ZmYpOiBBY2NlcHQgdW5leHBlY3RlZCBsaW5lcyBpbiB0aGUgb3V0cHV0CisJZmlsZS4gIENvbXBhcmUgbGluZXMgdXNpbmcgc3RyaW5nIG1hdGNoLgorCSogbGQtZWxmdmVycy92ZXJzNi52ZXI6IFBlcm1pdCBhbnkgdmFsdWUgaW4gdGhlIHZuYV9vdGhlciBmaWVsZC4KKworVHVlIEF1ZyAxMiAxNjowMToyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBDb3JyZWN0IHN0cmluZyBxdW90aW5nLgorCitTYXQgQXVnICA5IDAwOjU2OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBDaGFuZ2UgbGQsIGFzLCBubSBhbmQgc3RyaXAgZnJvbSAubmV3IHRvCisJLW5ldy4gIExvYWQgbGQtbGliLmV4cCByYXRoZXIgdGhhbiBsZC5leHAuCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogVXNlIGxkLW5ldyByYXRoZXIgdGhhbiBsZC5uZXcuCisJKiBsaWIvbGQtbGliLmV4cDogUmVuYW1lIGZyb20gbGliL2xkLmV4cCwgZm9yIHRoZSBiZW5lZml0IG9mCisJRGVqYUdudSBjaGFuZ2VzLgorCitUaHUgSnVuIDI2IDEyOjA3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtZWxmdmVycy92ZXJzLmV4cDogVXNlIGVncmVwIHJhdGhlciB0aGFuIGdyZXAgd2hlbiBsb29raW5nIGZvcgorCWFuIGFsdGVybmF0aW9uLiAgRnJvbSBHcmVnIE1hcmdvIDxnbWFyZ29AZGwuY29tPi4KKworV2VkIEp1biAyNSAxMjo0NzoyMiAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgbTY4ay1saW51eCBvbiB0ZXN0cworCXdpdGggbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzLgorCitGcmkgSnVuICA2IDE3OjM1OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtZWxmdmVycy92ZXJzNi52ZXI6IFVwZGF0ZSBmb3IgcmVjZW50IGVsZmxpbmsuaCBwYXRjaCB0bworCXZlcnNpb24gaGFuZGxpbmcuCisKK1dlZCBKdW4gIDQgMTI6MDY6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgX19fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiBhcyB3ZWxsLgorCitGcmkgTWF5IDMwIDEyOjIxOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIF9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiB3aGVuCisJbGlua2luZy4KKworTW9uIE1heSAxMiAxMToxNzo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogVXNlICRiYXNlX2RpciByYXRoZXIgdGhhbiAkb2JqZGlyIHdoZW4KKwlzZXR0aW5nIGxkLiAgRnJvbSBKb2huIERhdmlkIEFuZ2xpbiA8ZGF2ZUBoaWF1bHkxLmhpYS5ucmMuY2E+LgorCitGcmkgQXByIDI1IDA5OjA3OjAwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbGQtc3JlYy9zcmVjLmV4cDogRGVmaW5lIHZhcmlvdXMgb3V0IG9mIGxpbmUgcHJvbG9ndWUvZXBpbG9ndWUKKwlmdW5jdGlvbnMgZm9yIHRoZSBtbjEwMjAwIHRvIGF2b2lkIG5lZWRpbmcgbGliZ2NjLmEuCisKK1dlZCBNYXIgMjYgMTM6NTY6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBEb24ndCBleHBlY3QgZmFpbHVyZXMgb24gbWlwcyotKi1lbGYqLgorCitNb24gTWFyIDE3IDE5OjI3OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtZWxmdmVycy92ZXJzLmV4cDogRG9uJ3QgcnVuIG9uIFN1bk9TIG9yIEFJWC4KKworV2VkIE1hciAxMiAyMTo0NDoxOSAxOTk3ICBFcmljIFlvdW5nZGFsZSAgPGVyaWNAYW5kYW50ZS5qaWMuY29tPgorCisJKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwLCAqOiBOZXcgdGVzdHMgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nLgorCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgYXIgYW5kIHN0cmlwLgorCitGcmkgRmViICA3IDE2OjQ3OjAyIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogVXNlIHBydW5lX3dhcm5pbmdzIGluc3RlYWQgb2YKKwlwcnVuZV9zeXN0ZW1fY3J1ZC4KKwkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBEaXR0by4KKwkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBEaXR0by4KKwkqIGxkLXNoL3NoLmV4cDogRGl0dG8uCisJKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogRGl0dG8uCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBEaXR0by4KKwkqIGxpYi9sZC5leHA6IERpdHRvLgorCitXZWQgSmFuIDI5IDAwOjQ3OjI5IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBsZC1jZHRlc3QvY2R0ZXN0LmV4cDogUHV0IGEgc2xhc2ggYmV0d2VlbiAkc3JjZGlyLyRzdWJkaXIuCisJKiBsZC1zY3JpcHRzL3NjcmlwdC5leHA6IERpdHRvLgorCSogbGQtc2gvc2guZXhwOiBEaXR0by4KKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBEaXR0by4KKwkqIGxkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cDogRGl0dG8uCisJKiBsaWIvbGQuZXhwOiBEaXR0by4KKworTW9uIERlYyAzMCAxNzowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBGaXggcXVvdGluZyBmb3IgLS1kZWZzeW0gJGdsb2JhbCQuCisKK1R1ZSBPY3QgIDEgMTU6NTI6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgorCXByaW50aW5nLgorCitGcmkgU2VwIDEzIDE1OjUxOjQ1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IERlZmluZSAkZ2xvYmFsJCBmb3IgaHBwYS1lbGYuCisKK1RodSBBdWcgIDggMTQ6Mjk6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zY3JpcHRzL2Nyb3NzMi50OiBNYXAgWENPRkYgc2VjdGlvbnMgdG8gLnRleHQgb3IgLmRhdGEuCisKKwkqIGxpYi9sZC5leHA6IFVzZSB2ZXJib3NlIC1sb2cgaW5zdGVhZCBvZiBjYWxsaW5nIGJvdGggdmVyYm9zZSBhbmQKKwlzZW5kX2xvZy4KKworV2VkIEF1ZyAgNyAxODowMDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBOZXcgdGVzdC4KKwkqIGxkLXNjcmlwdHMvcGhkcnMucywgbGQtc2NyaXB0cy9waGRycy50OiBOZXcgZmlsZXMuCisKK1N1biBBdWcgIDQgMjE6NTg6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogT24gYTI5ayB0YXJnZXRzLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCisJVl9TUElMTCBhbmQgVl9GSUxMLgorCitUaHUgQXVnICAxIDE0OjEwOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IE5ldyB0ZXN0LgorCSogbGQtc2NyaXB0cy97Y3Jvc3MxLmMsIGNyb3NzMi5jLCBjcm9zczMuY306IE5ldyBmaWxlcy4KKwkqIGxkLXNjcmlwdHMve2Nyb3NzMS50LCBjcm9zczIudH06IE5ldyBmaWxlcy4KKworU2F0IEp1biAyOSAxMzo0MDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNoL3NoLmV4cDogRml4IGRlYnVnZ2luZyBtZXNzYWdlcy4KKwkqIGxkLXNoL3NoMS5zOiBVc2UgLmFsaWduIDQuCisKK1dlZCBNYXkgIDEgMTY6NDU6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zaC9zaC5leHA6IFVzZSAtTyB3aGVuIGNvbXBpbGluZyB3aXRoIC1tcmVsYXguCisKK01vbiBBcHIgMjkgMTA6MzM6MTAgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3RzIG9uCisgCUxpbnV4L202OGsuCisKK0ZyaSBBcHIgIDUgMTY6MjA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0cyBvbiBMaW51eC4KKworTW9uIEZlYiAyNiAxMjo0NToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBEb24ndCB1c2UgLWZwaWMgb24gTUlQUyB0YXJnZXRzLgorCitXZWQgSmFuIDMxIDE1OjA5OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgaHBwYSotKi0qZWxmKi4KKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBMaWtld2lzZS4KKworRnJpIEphbiAyNiAxODo0MzowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBFTEYgdGFyZ2V0cyBzaG91bGQgbm93IHBhc3MgdGhlCisJdW5kZWZpbmVkIGxpbmUgdGVzdC4KKworVGh1IEphbiAyNSAxNTozNjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLWVtcGljL2VtcGljLmV4cDogVXBkYXRlIGZvciBjaGFuZ2UgdG8gTUlQUyBkaXNhc3NlbWJsZXIuCisKK01vbiBKYW4gMTUgMTU6MDU6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIG1pcHMqLSotaXJpeDUqCisJd2hlbiBkb2luZyB0aGUgLS1zdGF0aWMgdGVzdC4KKwkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGVzdHMgb24gbWlwcyotKi1pcml4NSouCisKK0ZyaSBEZWMgMjkgMTI6MzM6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogT24gQUlYLCBkb24ndCBwYXNzIHRoZSAtYkkgb3B0aW9uCisJd2hlbiBjcmVhdGluZyBsZC1wYXJ0aWFsLm8uCisKK1R1ZSBEZWMgMjYgMTc6Mzc6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBJZiBwb3dlcnBjKi0qLWVhYmkqLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCisJX19lYWJpLgorCitUdWUgRGVjIDE5IDE4OjAxOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgWENPRkYgdGFyZ2V0cy4KKworRnJpIERlYyAxNSAxNjozNjoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IE9uIGEyOWsgdGFyZ2V0cywgdXNlIC0tZGVmc3ltIHRvIGRlZmluZQorCVZfU1BJTEwgYW5kIFZfRklMTC4KKwkqIGxkLXNyZWMvc3IxLmMgKFZfU1BJTEwsIFZfRklMTCk6IFJlbW92ZSBkZWZpbml0aW9ucy4KKwkqIGxkLXNyZWMvc3IzLmNjOiBMaWtld2lzZS4KKworCSogbGQtc3JlYy9zcmVjLmV4cDogUmVtb3ZlIGk5NjAgQ09GRiBzZXR1cF94ZmFpbC4KKworU2F0IERlYyAgMiAwMToyMDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IERvbid0IHVzZSBbXSBpbiBzZXR1cF94ZmFpbCBleHByZXNzaW9ucy4KKworRnJpIERlYyAgMSAxMzoxODoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIE1JUFMgRUxGIHRhcmdldHMuCisKK1dlZCBOb3YgMjkgMTM6MDE6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGk5NjAgQ09GRiB0YXJnZXRzLgorCitNb24gTm92IDI3IDE0OjM2OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlsIGNhbGxzIGZvciBpWzM0NV04Ni0qLWFvdXQqLgorCisJKiBsZC1zcmVjL3NyMS5jIChWX1NQSUxMLCBWX0ZJTEwpOiBEZWZpbmUuCisJKiBsZC1zcmVjL3NyMy5jYzogTGlrZXdpc2UuCisKK1R1ZSBOb3YgMjEgMTY6MDU6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1lbXBpYy9lbXBpYy5leHA6IFVwZGF0ZSBmb3IgY2hhbmdlcyBpbiBvYmpkdW1wIG91dHB1dC4KKworV2VkIE5vdiAxNSAxNzo0Mjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNyZWMvc3JlYy5leHA6IE5ldyB0ZXN0cy4KKwkqIGxkLXNyZWMvc3IxLmMsIGxkLXNyZWMvc3IyLmMsIGxkLXNyZWMvc3IzLmNjOiBOZXcgZmlsZXMuCisJKiBsaWIvbGQuZXhwIChsZF9zaW1wbGVfbGluayk6IERpc2NhcmQgd2FybmluZ3MgYWJvdXQgbm90IGJlaW5nCisJYWJsZSB0byBmaW5kIHRoZSBlbnRyeSBzeW1ib2wuCisKK1R1ZSBOb3YgMTQgMjA6MDM6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zaC9zaDIuYyAoX19tYWluKTogRGVmaW5lLgorCitNb24gTm92ICA2IDE0OjM5OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtZW1waWMvZW1waWMuZXhwOiBBY2NlcHQgYSAuIGluIHRoZSBhZGRyZXNzIHN5bWJvbC4KKworCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0ZXN0cyBvbiByczYwMDAqLSotYWl4KiBhbmQKKwlwb3dlcnBjKi0qLWFpeCouICBBZGQgY29kZSB0byBjcmVhdGUgYXBwcm9wcmlhdGUgZXhwb3J0cyBmaWxlcywKKwlhbmQgcGFzcyBhcHByb3ByaWF0ZSBjb21waWxhdGlvbiBmbGFncywgYW5kIHRlc3QgYWdhaW5zdAorCWFwcHJvcHJpYXRlIGV4cGVjdGVkIG91dHB1dC4KKwkqIGxkLXNoYXJlZC94Y29mZi5kYXQ6IE5ldyBmaWxlLgorCSogbGQtc2hhcmVkL21haW4uYzogUHV0ICNpZm5kZWYgWENPRkZfVEVTVCBhcm91bmQgdGVzdHMgdGhhdCBjYW4KKwlub3QgYmUgbGlua2VkIHVzaW5nIFhDT0ZGLiAgVXNlIHNobGliX3NobGlidmFyMSBhcyBhIHNhbXBsZQorCWZ1bmN0aW9uIHBvaW50ZXIsIHJhdGhlciB0aGFuIHNobGliX21haW52YXIuCisJKiBsZC1zaGFyZWQvc2gxLmM6IExpa2V3aXNlLgorCSogbGQtc2hhcmVkL3NoYXJlZC5kYXQ6IFVwZGF0ZSBmb3IgY2hhbmdlIGZyb20gdXNpbmcgc2hsaWJfbWFpbnZhcgorCXRvIHVzaW5nIHNobGliX3NobGlidmFyMS4KKwkqIGxkLXNoYXJlZC9zdW40LmRhdDogTGlrZXdpc2UuCisKK1NhdCBPY3QgMjggMDE6NTQ6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1zY3JpcHRzL3NjcmlwdC50OiBQdXQgLnByIGluIC50ZXh0LCBhbmQgLnJ3IGluIC5kYXRhLCBmb3IKKwljb252ZW5pZW5jZSB3aGVuIHRlc3RpbmcgWENPRkYuCisKK1RodSBPY3QgMjYgMjI6NTM6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogT24gQUlYLCBwYXNzIC1iSS9saWIvc3lzY2FsbHMuZXhwCisJYWxvbmcgd2l0aCAtLXN0YXRpYy4KKworCSogbGQtc2NyaXB0cy9zY3JpcHQuczogTWFrZSBzeW1ib2xzIGdsb2JhbC4KKworRnJpIE9jdCAyMCAxMjoyMjoxNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBhcm0qLSotcGUqLgorCitGcmkgU2VwIDI5IDExOjA2OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IFVzZSAtZSB3aGVuIGludm9raW5nIHRoZSBsaW5rZXIsIHRvCisJcHJldmVudCB0aGUgU3VuT1MgbGlua2VyIGZyb20gdHJ5aW5nIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LgorCitUaHUgU2VwIDI4IDEyOjM3OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgdGVzdHMgb24gc3BhcmMqLSotc3Vub3M0Ki4gIEFkZAorCWFwcHJvcHJpYXRlIG1vZGlmaWNhdGlvbnMgYW5kIHNldHVwX3hmYWlscy4KKwkqIGxkLXNoYXJlZC9zdW40LmRhdDogTmV3IGZpbGUuCisKK01vbiBTZXAgMTggMTQ6MTI6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3ZlcnNpb24pOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkLgorCShkZWZhdWx0X2xkX3JlbG9jYXRlLCBkZWZhdWx0X2xkX2xpbmspOiBMaWtld2lzZS4KKwkoZGVmYXVsdF9sZF9zaW1wbGVfbGluaywgZGVmYXVsdF9sZF9jb21waWxlKTogTGlrZXdpc2UuCisJKGRlZmF1bHRfbGRfYXNzZW1ibGUsIGRlZmF1bHRfbGRfbm0pOiBMaWtld2lzZS4KKworRnJpIFNlcCAgOCAxNzoxNTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3QgZXhpc3QsIG1hcmsgdGhlCisJdGVzdHMgYXMgdW50ZXN0ZWQgcmF0aGVyIHRoYW4gdW5yZXNvbHZlZC4KKworV2VkIEF1ZyAyMyAxMDo0NjozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGxkLXNoL3NoLmV4cDogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiB0aGUgb3V0cHV0IG9mIGNtcC4KKworVHVlIEF1ZyAxNSAxNzozNTozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogU3BsaXQgc2NyaXB0IHZlcmlmaWNhdGlvbiBpbnRvIGEgcHJvYy4KKwlBZGQgc2ltcGxlIHRlc3Qgb2YgTVJJIHNjcmlwdC4KKwkqIGxkLXNjcmlwdHMvc2NyaXB0bS50OiBOZXcgZmlsZS4KKworV2VkIEp1bCAyNiAxMTozODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNoL3NoLmV4cDogTWFyayBgU0ggY29uZmlybSByZWxheGluZycgdGVzdCB1bnJlc29sdmVkIHdoZW4KKwlhcHByb3ByaWF0ZS4KKworTW9uIEp1bCAyNCAxNTozNDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kZWZhdWx0LmV4cDogRGVmaW5lIG9iamNvcHkgaWYgaXQgaXMgbm90IGRlZmluZWQuCisJKiBsZC1zaC8qOiBOZXcgdGVzdHMgZm9yIFNIIHJlbGF4aW5nLgorCisJKiBsZC1lbXBpYy9lbXBpYy5leHA6IElmICRDQyBkb2VzIG5vdCBleGlzdCwgY2FsbCB1bnRlc3RlZCByYXRoZXIKKwl0aGFuIHVucmVzb2x2ZWQuCisKK1RodSBKdWwgMjAgMTU6MDk6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogSWYgJENDIGRvZXMgbm90IGV4aXN0LCBtYXJrIHRoZQorCXRlc3RzIGFzIHVudGVzdGVkIHJhdGhlciB0aGFuIHVucmVzb2x2ZWQuICBDbGVhciBFTEYgeGZhaWxzIGZvcgorCW1pcHMqLCBub3QganVzdCBtaXBzLgorCitUdWUgSnVsIDE4IDEyOjAwOjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2gtKi0qIGZvcgorCXVuZGVmaW5lZCBsaW5lIHRlc3QuCisKK0ZyaSBKdWwgMTQgMTM6MDc6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogTmV3IHRlc3QsIHRvIGNoZWNrIHJlcG9ydGluZyBvZgorCXVuZGVmaW5lZCBzeW1ib2xzLgorCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jOiBOZXcgZmlsZS4KKworTW9uIEp1bCAxMCAxMToxMzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cDogSWYgYSB0ZXN0IGZhaWxzLCByZXBvcnQgaXQgY29ycmVjdGx5OgorCWRvbid0IHRyeSB0byBydW4gdGhlIG5leHQgdGVzdCwgYW5kIGRvbid0IHJlcG9ydCBhIHBhc3MgYXMgd2VsbCBhcworCWEgZmFpbC4KKworTW9uIEp1bCAgMyAxNDoyNjozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBsZC90ZXN0c3VpdGUvdmVyc2Fkb3MvKHQxLHQyKS5sZDogRW5kIGluIG5ld2xpbmVzLgorCitNb24gTWF5IDIyIDIwOjE5OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IElmIGNjIGFyZ3VtZW50IGlzIG11bHRpcGxlCisJd29yZHMsIHVzZSBvbmx5IHRoZSBmaXJzdCB3aGVuIHRyeWluZyB0byB2ZXJpZnkgdGhlIGF2YWlsYWJpbGl0eQorCW9mIHRoZSBjb21waWxlci4KKworTW9uIEZlYiAgNiAxMTo0Njo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGxkLXNjcmlwdHMvZGVmaW5lZC50OiBNZW50aW9uIC5kYXRhIGFuZCAuYnNzIGV4cGxpY2l0bHkuCisKK1R1ZSBKYW4gMjQgMTQ6NTE6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogSWYgbm90IGluIHRoZSBsZCBidWlsZCBkaXJlY3RvcnksCisJY2FsbCB1bnRlc3RlZCBmb3IgZWFjaCB0ZXN0LCByYXRoZXIgdGhhbiBpZ25vcmluZyBpdC4gIElmIG9uZSB0ZXN0CisJZmFpbHMsIGdvIG9uIHRvIHRoZSBuZXh0IG9uZSBpbnN0ZWFkIG9mIHJldHVybmluZy4KKwkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBJZiBjb21waWxhdGlvbnMgZmFpbCwgbWFyayB0ZXN0cyBhcworCXVucmVzb2x2ZWQuCisJKiBsZC1lbXBpYy9lbXBpYy5leHA6IExpa2V3aXNlLiAgQWxzbywgYWx3YXlzIHBhc3MgdGhlIHNhbWUgdGVzdAorCW5hbWUgdG8gcGFzcyBvciBmYWlsLgorCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLiAgQWxzbywgYWx3YXlzIHJ1biBhbGwgdGVzdHMuCisJKiBsZC1zY3JpcHRzL2RlZmluZWQuZXhwOiBJZiBhcyBvciBubSBmYWlsLCBtYXJrIHRlc3QgYXMKKwl1bnJlc29sdmVkLiAgQWx3YXlzIHBhc3MgdGhlIHNhbWUgdGVzdCBuYW1lIHRvIHBhc3Mgb3IgZmFpbC4KKwkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogTGlrZXdpc2UuCisJKiBsZC1zY3JpcHRzL3NpemVvZi5leHA6IExpa2V3aXNlLgorCitXZWQgSmFuIDExIDExOjQ4OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbGQtc2NyaXB0cy9zaXplb2YuZXhwOiBOZXcgdGVzdCwgYmFzZWQgb24gYnVnIHJlcG9ydCBmcm9tCisJYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgorCSogbGQtc2NyaXB0cy9zaXplb2YuczogTmV3IGZpbGUuCisJKiBsZC1zY3JpcHRzL3NpemVvZi50OiBOZXcgZmlsZS4KKworV2VkIEphbiAgNCAxODo1NjoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGxpYi9sZC5leHA6IFVzZSBbd2hpY2ggJGxkXSByYXRoZXIgdGhhbiBbZmlsZSBleGlzdHMgJGxkXSB0byBzZWUKKwlpZiB0aGUgbGlua2VyIGV4aXN0cy4KKworV2VkIERlYyAxNCAxNjozOTowMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBsaWIvbGQuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLAorCWluIGNhc2UgdGhlIHVzZXIgaXNuJ3QgdXNpbmcgdGhlIG5ld2VzdCBEZWphR251IHZlcnNpb24gdGhhdCB3ZQorCWhhdmVuJ3QgcmVsZWFzZWQgdG8gdGhlIG5ldCB5ZXQuCisKK0ZyaSBEZWMgIDIgMTQ6MTc6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZpbmUgb2JqZHVtcCBpZiBpdCBpcyBub3QgZGVmaW5lZC4KKwkqIGxkLWVtcGljLyo6IE5ldyB0ZXN0cyB0byB0ZXN0IC1tZW1iZWRkZWQtcGljIGNvZGUuCisKK01vbiBOb3YgMjggMTE6MjQ6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBsZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogUGFzcyBjbXAgb3V0cHV0IHRocm91Z2gKKwlwcnVuZV9zeXN0ZW1fY3J1ZC4KKwkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBQYXNzIGRpZmYgb3V0cHV0IHRocm91Z2gKKwlwcnVuZV9zeXN0ZW1fY3J1ZC4KKwkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBMaWtld2lzZS4KKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW1vdmUgdW51c2VkIGFuZCB1c2VsZXNzIHByb2MgbGRfbG9hZC4KKworU3VuIE9jdCAzMCAxMzowMjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfY29tcGlsZSk6IFJlbW92ZSB0aGUgb3V0cHV0IGZpbGUgYmVmb3JlCisJY29tcGlsaW5nLgorCisJKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTW92ZSBjb21tb24gdGVzdCBjb2RlIGludG8gYSBwcm9jZWR1cmUuCisJQWRkIHRlc3RzIGZvciBjb21waWxpbmcgdGhlIG5vbiBzaGFyZWQgY29kZSBQSUMuCisJKiBsZC1zaGFyZWQvbWFpbi5jIChtYWluKTogQ2FsbCBtYWluX2NhbGxlZCwgYW5kIHByaW50IHRoZSByZXN1bHQuCisJKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogQWRqdXN0IGFjY29yZGluZ2x5LgorCitUaHUgT2N0IDI3IDE3OjMwOjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbGQtc2hhcmVkOiBOZXcgZGlyZWN0b3J5LCB3aXRoIG5ldyBmaWxlcyB0byB0ZXN0IGdlbmVyYXRpbmcgRUxGCisJc2hhcmVkIGxpYnJhcmllcy4KKworCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgdGhlIGNvbXBpbGF0aW9uIHdvcmtlZCwgYnV0CisJbm8gb2JqZWN0IGZpbGUgd2FzIGNyZWF0ZWQsIGNoZWNrIHRvIHNlZSBpZiB0aGUgY29tcGlsZXIgZm9vbGlzaGx5CisJaWdub3JlZCB0aGUgLW8gc3dpdGNoIHdoZW4gY29tcGlsaW5nLCBhbmQgbW92ZSB0aGUgcmVzdWx0aW5nCisJb2JqZWN0IGlmIGl0IGRpZC4KKworVGh1IFNlcCAyOSAxMjozNjo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIFZNUyBkb2VzIG5vdCBwZXJtaXRzIGAuJyBpbiBkaXJlY3RvcnkgbmFtZXMuICBSZW5hbWVkCisJbGQuYm9vdHN0cmFwIHRvIGxkLWJvb3RzdHJhcCwgbGQuY2R0ZXN0IHRvIGxkLWNkdGVzdCwgYW5kCisJbGQuc2NyaXB0cyB0byBsZC1zY3JpcHRzLgorCitXZWQgU2VwIDI4IDEyOjE4OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgdmFyaWFibGVzIGFzIGFuZCBubS4gIENyZWF0ZSB0bXBkaXIgaWYKKwlpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IERvbid0IGNyZWF0ZSB0bXBkaXIgaGVyZS4KKwkqIGxkLmNkdGVzdC9jZHRlc3QuZXhwOiBMaWtld2lzZS4KKwkqIGxkLnNjcmlwdHMvZGVmaW5lZC5leHA6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IGFzIGFuZCBubQorCWhlcmUuICBDaGFuZ2UgcGVycm9yIGZvciBubyB2YXJpYWJsZXMgZm91bmQgdG8gZmFpbC4KKwkqIGxkLnNjcmlwdHMvc2NyaXB0LmV4cDogTmV3IHRlc3QuCisJKiBsZC5zY3JpcHRzL3NjcmlwdC50LCBsZC5zY3JpcHRzL3NjcmlwdC5zOiBOZXcgZmlsZXMuCisKK1R1ZSBTZXAgMjcgMTQ6NTk6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBsZC5zY3JpcHRzOiBOZXcgZGlyZWN0b3J5LgorCSogbGQuc2NyaXB0cy9kZWZpbmVkLmV4cCwgbGQuc2NyaXB0cy9kZWZpbmVkLnM6IE5ldyBmaWxlcy4KKwkqIGxkLnNjcmlwdHMvZGVmaW5lZC50OiBOZXcgZmlsZS4KKwkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfc2ltcGxlX2xpbmspOiBOZXcgZnVuY3Rpb24uCisJKGRlZmF1bHRfbGRfYXNzZW1ibGUsIGRlZmF1bHRfbGRfbm0pOiBOZXcgZnVuY3Rpb25zLgorCSogY29uZmlnL2RlZmF1bHQuZXhwOiBSZW5hbWUgZnJvbSB1bml4LWxkLmV4cC4KKwkobGRfc2ltcGxlX2xpbmssIGxkX2Fzc2VtYmxlLCBsZF9ubSk6IE5ldyBmdW5jdGlvbnMuCisKKwkqIGNvbmZpZy91bml4LWxkLmV4cDogU2V0IGxkIHVzaW5nIGZpbmRmaWxlLgorCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9yZWxvY2F0ZSk6IFJldHVybiBhIHZhbHVlLiAgQ2hhbmdlIGZvcm1hdAorCW9mIGxvZyBtZXNzYWdlcy4KKwkoZGVmYXVsdF9sZF9jb21waWxlKTogTGlrZXdpc2UuCisJKGRlZmF1bHRfbGRfbGluayk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3QgaW5jbHVkZSAkQkZETElCIGFuZAorCSRMSUJJQkVSVFkgaW4gbGluay4KKwkqIGxkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBSZXdyaXRlLgorCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IFJld3JpdGUuCisJKiBsZC5jZHRlc3QvY2R0ZXN0LWZvby5jYzogVXBkYXRlIGZyb20gdG9wIGxldmVsIGxkIGRpcmVjdG9yeS4KKwkqIGxkLmNkdGVzdC9jZHRlc3QtZm9vLmg6IExpa2V3aXNlLgorCSogbGQuY2R0ZXN0L2NkdGVzdC1tYWluLmNjOiBMaWtld2lzZS4KKworRnJpIE1heSAyNyAwOTozNTowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IERvbid0IGxvb2sgZm9yICRyZXN1bHQgYmVmb3JlIGl0J3MKKwlkZWZpbmVkLgorCitUdWUgTWF5IDE3IDE1OjA2OjQ5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAsIGxpYi9sZC5leHA6IFJlcGxhY2UgZXJyb3IgcHJvYworCSAgY2FsbHMgd2l0aCBwZXJyb3IgY2FsbHMuCisKK1dlZCBNYXkgMTEgMTY6NDc6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBsZC5jZHRlc3QvY2R0ZXN0LWJhci5jYzogUmVuYW1lZCBmcm9tIGNkdGVzdC1mdW5jLmNjLgorCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IEFkanVzdGVkLgorCitGcmkgSmFuIDI4IDEzOjI1OjQxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwkqIGxpYi9sZC5leHAgKHNpbXBsZV9kaWZmKTogSW5kaWNhdGUgZmFpbHVyZSBpZiBmaWxlcyBoYXZlCisJZGlmZmVyZW50IG51bWJlcnMgb2YgbGluZXMuICBEb24ndCBtdWNrIHdpdGggJGRpZmZlcmVuY2VzIHRvIGF2b2lkCisJaW5kaWNhdGluZyBhIHBhc3MsIGp1c3QgcmV0dXJuLgorCisJKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L3tjZHRlc3QtZm9vLmgsY2R0ZXN0LWZvby5jYyxjZHRlc3QtbWFpbi5jY306CisJRml4IHRlc3QgY2FzZSB0byBiZSB2YWxpZCBBTlNJIEMrKy4gIERvbid0IHJlcXVpcmUgdXNlIG9mIGhlYWRlcgorCWZpbGVzLCBzbyAiLi4vZ2NjL3hnY2MgLUIuLi9nY2MvIiBjYW4gYmUgdXNlZCBmb3IgQ1hYLgorCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBDb21iaW5lICJybSIgbGluZXMuICBBZGQgc29tZQorCWNvbW1lbnRhcnkgb24gdGhpbmdzIHRoYXQgYXJlIHN0aWxsIGJyb2tlbiB3aXRoIHRoaXMgdGVzdCBjYXNlLgorCitGcmkgU2VwIDEwIDA5OjU4OjIzIDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCisKKwkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogQWRkZWQgQ1hYRkxBR1MgdG8gY29tcGlsZSBzdGFnZS4KKworVGh1IEF1ZyAxMiAxNjowNTozNyAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQorCisJKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogYWRkIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydAorCSogdGVzdHN1aXRlL2NvbmZpZy91bml4LWxkLmV4cDogYWRkIGNvbXBpbGVyIGFuZCBsaW5rZXIgc3VwcG9ydAorCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBmaXhlZCB0byBkbyBwYXJ0aWFsIGxpbmtzCisJKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgdGVzdHNjYXNlCisKK1dlZCBBdWcgIDQgMjE6MDA6MTggMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworCSogdGVzdHN1aXRlL2xpYi9sZC5leHA6IG5ldyBmaWxlCisJKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBuZXcgZmlsZQorCSogdGVzdHN1aXRlL2xkLmJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBuZXcgZmlsZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwZmRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKQEAgLTAsMCArMSwxNzEgQEAKKyMgQmFzaWMgZXhwZWN0IHNjcmlwdCBmb3IgTEQgUmVncmVzc2lvbiBUZXN0cworIyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCisjCisKK2lmICFbaW5mbyBleGlzdHMgbGRdIHRoZW4geworICAgIHNldCBsZCBbZmluZGZpbGUgJGJhc2VfZGlyL2xkLW5ldyAkYmFzZV9kaXIvbGQtbmV3IFt0cmFuc2Zvcm0gbGRdXQorfQorCitpZiAhW2luZm8gZXhpc3RzIGFzXSB0aGVuIHsKKyAgICBzZXQgYXMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3ICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3IFt0cmFuc2Zvcm0gYXNdXQorfQorCitpZiAhW2luZm8gZXhpc3RzIG5tXSB0aGVuIHsKKyAgICBzZXQgbm0gW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9ubS1uZXcgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KK30KKworaWYgIVtpbmZvIGV4aXN0cyBvYmpkdW1wXSB0aGVuIHsKKyAgICBzZXQgb2JqZHVtcCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL29iamR1bXBdCit9CisKK2lmICFbaW5mbyBleGlzdHMgb2JqY29weV0gdGhlbiB7CisgICAgc2V0IG9iamNvcHkgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9vYmpjb3B5XQorfQorCitpZiAhW2luZm8gZXhpc3RzIGFyXSB0aGVuIHsKKyAgICBzZXQgYXIgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9hcl0KK30KKworaWYgIVtpbmZvIGV4aXN0cyBzdHJpcF0gdGhlbiB7CisgICAgc2V0IHN0cmlwIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvc3RyaXAtbmV3ICRiYXNlX2Rpci8uLi9iaW51dGlscy9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCit9CisKK2lmIHshW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyXX0gdGhlbiB7CisgICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyIiBzdGF0dXMKK30KKworIyBNYWtlIGEgc3ltbGluayBmcm9tIHRtcGRpci9hcyB0byB0aGUgYXNzZW1ibGVyIGluIHRoZSBidWlsZCB0cmVlLCBzbworIyB0aGF0IHdlIGNhbiB1c2UgYSAtQiBvcHRpb24gdG8gZ2NjIHRvIGZvcmNlIGl0IHRvIHVzZSB0aGUgbmV3bHkKKyMgYnVpbHQgYXNzZW1ibGVyLgoraWYgeyFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXIvZ2FzXX0gdGhlbiB7CisgICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyL2dhcyIgc3RhdHVzCisgICAgY2F0Y2ggImV4ZWMgbG4gLXMgLi4vLi4vLi4vZ2FzL2FzLW5ldyB0bXBkaXIvZ2FzL2FzIiBzdGF0dXMKK30KK3NldCBnY2NfZ2FzX2ZsYWcgIi1CW3B3ZF0vdG1wZGlyL2dhcy8iCisKKyMgbG9hZCB0aGUgdXRpbGl0eSBwcm9jZWR1cmVzCitsb2FkX2xpYiBsZC1saWIuZXhwCisKK3Byb2MgZ2V0X2xpbmtfZmlsZXMge3Zhcm5hbWV9IHsKKyAgICBnbG9iYWwgJHZhcm5hbWUKKyAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIENDCisgICAgaWYgIVtpbmZvIGV4aXN0cyAkdmFybmFtZV0geworCXNldCBzdGF0dXMgW2NhdGNoICJleGVjIHNoIC1jIFwiaG9zdD0nJHRhcmdldF90cmlwbGV0JyAmJiBDQz0nJENDJyAmJiAuICRzcmNkaXIvLi4vY29uZmlndXJlLmhvc3QgJiYgZXZhbCBlY2hvIFxcJCR2YXJuYW1lXCIiIHJlc3VsdF0KKwlpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgbmF0aXZlIGxpbmsgZmlsZXM6ICRyZXN1bHQiIH0KKwlzZXQgJHZhcm5hbWUgJHJlc3VsdAorICAgIH0KK30KKworcHJvYyBnZXRfdGFyZ2V0X2VtdWwge30geworICAgIGdsb2JhbCB0YXJnZXRfdHJpcGxldAorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyBzaCAtYyBcInRhcmc9JyR0YXJnZXRfdHJpcGxldCcgJiYgLiAkc3JjZGlyLy4uL2NvbmZpZ3VyZS50Z3QgJiYgZWNobyBcXFwkdGFyZ19lbXVsXCIiIHJlc3VsdF0KKyAgICBpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgZW11bGF0aW9uIG5hbWU6ICRyZXN1bHQiIH0KKyAgICByZXR1cm4gJHJlc3VsdAorfQorCitpZiBbaXNuYXRpdmVdIHsKKyAgICBmb3JlYWNoIHgge0hPU1RJTkdfQ1JUMCBIT1NUSU5HX0xJQlN9IHsKKwlnZXRfbGlua19maWxlcyAkeAorICAgIH0KK30gZWxzZSB7CisgICAgZm9yZWFjaCB4IHtIT1NUSU5HX0NSVDAgSE9TVElOR19MSUJTfSB7IHNldCAkeCAiIiB9Cit9CitpZiAhW2luZm8gZXhpc3RzIEhPU1RJTkdfRU1VXSB7IHNldCBIT1NUSU5HX0VNVSAiLW0gW2dldF90YXJnZXRfZW11bF0iIH0KKworIworIyBsZF92ZXJzaW9uIC0tIGV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZCBjb21waWxlciAoR0NDKQorIworcHJvYyBsZF92ZXJzaW9uIHt9IHsKKyAgICBnbG9iYWwgbGQKKyAgICBkZWZhdWx0X2xkX3ZlcnNpb24gJGxkCit9CisKKyMKKyMgbGRfZXhpdCAtLSBqdXN0IGEgc3R1YiBmb3IgbGQKKyMKK3Byb2MgbGRfZXhpdCB7fSB7Cit9CisKKyMKKyMgbGRfc3RhcnQgCisjCXJlbGluayB0aGUgbGlua2VyCisjCitwcm9jIGxkX3N0YXJ0IHsgbGQgdGFyZ2V0IH0geworCSMKK30KKworIworIyBsZF9yZWxvY2F0ZSAKKyMJbGluayBhbiBvYmplY3QgdXNpbmcgcmVsb2NhdGlvbgorIworcHJvYyBsZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0geworCWRlZmF1bHRfbGRfcmVsb2NhdGUgJGxkICR0YXJnZXQgJG9iamVjdHMKK30KKworIworIyBsZF9saW5rIAorIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZAorIworcHJvYyBsZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7CisJZGVmYXVsdF9sZF9saW5rICRsZCAkdGFyZ2V0ICRvYmplY3RzCit9CisKKyMKKyMgbGRfc2ltcGxlX2xpbmsgCisjCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCisjCitwcm9jIGxkX3NpbXBsZV9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7CisJZGVmYXVsdF9sZF9zaW1wbGVfbGluayAkbGQgJHRhcmdldCAkb2JqZWN0cworfQorCisjCisjIGxkX2NvbXBpbGUgCisjCWNvbXBpbGUgYW4gb2JqZWN0IHVzaW5nICRjYworIworcHJvYyBsZF9jb21waWxlIHsgY2Mgc291cmNlIG9iamVjdCB9IHsKKwlkZWZhdWx0X2xkX2NvbXBpbGUgJGNjICRzb3VyY2UgJG9iamVjdCAKK30KKworIworIyBsZF9hc3NlbWJsZQorIwlhc3NlbWJsZSBhIGZpbGUKKyMKK3Byb2MgbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0geworCWRlZmF1bHRfbGRfYXNzZW1ibGUgJGFzICRzb3VyY2UgJG9iamVjdCAKK30KKworIworIyBsZF9ubQorIwlydW4gbm0gb24gYSBmaWxlCisjCitwcm9jIGxkX25tIHsgbm0gb2JqZWN0IH0geworCWRlZmF1bHRfbGRfbm0gJG5tICRvYmplY3QKK30KKworIworIyBsZF9leGVjCisjCWV4ZWN1dGUgaXRoZSB0YXJnZXQKKyMKK3Byb2MgbGRfZXhlYyB7IHRhcmdldCBvdXRwdXQgfSB7CisJZGVmYXVsdF9sZF9leGVjICR0YXJnZXQgJG91dHB1dAorfQorCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0YjgyMAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1ib290c3RyYXAvYm9vdHN0cmFwLmV4cApAQCAtMCwwICsxLDEwMyBAQAorIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBCb290c3RyYXAgVGVzdHMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCisjIFJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKKyMKKworIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gYm9vdHN0cmFwIGl0c2VsZi4KKworIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCitpZiAhW2lzbmF0aXZlXSB7CisgICAgcmV0dXJuCit9CisKKyMgQm9vdHN0cmFwIGxkLiAgRmlyc3QgbGluayB0aGUgb2JqZWN0IGZpbGVzIHRvZ2V0aGVyIHVzaW5nIC1yLCBpbgorIyBvcmRlciB0byB0ZXN0IC1yLiAgVGhlbiBsaW5rIHRoZSByZXN1bHQgaW50byBhbiBleGVjdXRhYmxlLCBsZDEsIHRvCisjIHJlYWxseSB0ZXN0IC1yLiAgVXNlIGxkMSB0byBsaW5rIGEgZnJlc2ggbGQsIGxkMi4gIFVzZSBsZDIgdG8gbGluayBhCisjIG5ldyBsZCwgbGQzLiAgbGQyIGFuZCBsZDMgc2hvdWxkIGJlIGlkZW50aWNhbC4KKworZm9yZWFjaCBmbGFncyB7IiIgIi0tc3RhdGljIiAiLS10cmFkaXRpb25hbC1mb3JtYXQiICItLW5vLWtlZXAtbWVtb3J5In0geworICAgIGlmIHsiJGZsYWdzIiAhPSAiIn0geyAKKwlzZXQgdGVzdG5hbWUgImJvb3RzdHJhcCB3aXRoICRmbGFncyIKKyAgICB9IGVsc2UgeworCXNldCB0ZXN0bmFtZSAiYm9vdHN0cmFwIgorICAgIH0KKworICAgICMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiB3ZSBoYXZlIHRoZSBsZCBidWlsZCBkaXJlY3RvcnksCisgICAgIyBzaW5jZSB3ZSBuZWVkIHRoZSBvYmplY3QgZmlsZXMuCisgICAgaWYgeyRsZCAhPSAiJG9iamRpci9sZC1uZXcifSB7CisJdW50ZXN0ZWQgJHRlc3RuYW1lCisJY29udGludWUKKyAgICB9CisKKyAgICAjIElmIHdlIG9ubHkgaGF2ZSBhIHNoYXJlZCBsaWJiZmQsIHdlIHByb2JhYmx5IGNhbid0IHJ1biB0aGUKKyAgICAjIC0tc3RhdGljIHRlc3QuCisgICAgaWYgeyAkZmxhZ3MgPT0gIi0tc3RhdGljIiAmJiAhIFtzdHJpbmcgbWF0Y2ggIipsaWJiZmQuYSoiICRCRkRMSUJdIH0gdGhlbiB7CisJdW50ZXN0ZWQgJHRlc3RuYW1lCisJY29udGludWUKKyAgICB9CisKKyAgICBpZiAhW2xkX3JlbG9jYXRlICRsZCB0bXBkaXIvbGQtcGFydGlhbC5vICIkZmxhZ3MgJE9GSUxFUyJdIHsKKwlmYWlsICR0ZXN0bmFtZQorCWNvbnRpbnVlCisgICAgfQorCisgICAgIyBPbiBBSVgsIHlvdSBuZWVkIHRvIHNwZWNpZnkgYW4gaW1wb3J0IGxpc3Qgd2hlbiB1c2luZyAtLXN0YXRpYy4KKyAgICAjIFlvdSBvbmx5IHdhbnQgdGhlIGltcG9ydCBsaXN0IHdoZW4gY3JlYXRpbmcgdGhlIGZpbmFsCisgICAgIyBleGVjdXRhYmxlLgorICAgIGlmIFtpc3RhcmdldCAiKi0qLWFpeCoiXSB7CisJaWYgeyIkZmxhZ3MiID09ICItLXN0YXRpYyJ9IHsKKwkgICAgc2V0IGZsYWdzICItLXN0YXRpYyAtYkk6L2xpYi9zeXNjYWxscy5leHAiCisJfQorICAgIH0KKworICAgICMgT24gSXJpeCA1LCBsaW5raW5nIHdpdGggLS1zdGF0aWMgb25seSB3b3JrcyBpZiBhbGwgdGhlIGZpbGVzIGFyZQorICAgICMgY29tcGlsZWQgdXNpbmcgLW5vbl9zaGFyZWQuCisgICAgaWYgeyIkZmxhZ3MiID09ICItLXN0YXRpYyJ9IHsKKwlzZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiCisgICAgfQorCisgICAgaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvbGQxICIkZmxhZ3MgdG1wZGlyL2xkLXBhcnRpYWwubyAkQkZETElCICRMSUJJQkVSVFkiXSB7CisJZmFpbCAkdGVzdG5hbWUKKwljb250aW51ZQorICAgIH0KKworICAgIGlmICFbbGRfbGluayB0bXBkaXIvbGQxIHRtcGRpci9sZDIgIiRmbGFncyAkT0ZJTEVTICRCRkRMSUIgJExJQklCRVJUWSJdIHsKKwlmYWlsICR0ZXN0bmFtZQorCWNvbnRpbnVlCisgICAgfQorCisgICAgaWYgIVtsZF9saW5rIHRtcGRpci9sZDIgdG1wZGlyL2xkMyAiJGZsYWdzICRPRklMRVMgJEJGRExJQiAkTElCSUJFUlRZIl0geworCWZhaWwgJHRlc3RuYW1lCisJY29udGludWUKKyAgICB9CisKKyAgICBzZW5kX2xvZyAiY21wIHRtcGRpci9sZDIgdG1wZGlyL2xkM1xuIgorICAgIHZlcmJvc2UgImNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDMiCisgICAgY2F0Y2ggImV4ZWMgY21wIHRtcGRpci9sZDIgdG1wZGlyL2xkMyIgZXhlY19vdXRwdXQKKyAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlwYXNzICR0ZXN0bmFtZQorICAgIH0gZWxzZSB7CisJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorCXZlcmJvc2UgIiRleGVjX291dHB1dCIgMQorCisJZmFpbCAkdGVzdG5hbWUKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1iYXIuY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1iYXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMDBlMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYwpAQCAtMCwwICsxLDE3IEBACisvLyB0ZXN0IHByb2dyYW0gZm9yIENsYXNzIEZvbworCisjaW5jbHVkZSAiY2R0ZXN0LWZvby5oIgorCitzdGF0aWMgRm9vIHN0YXRpY19mb28oICJzdGF0aWNfZm9vIik7IAorCitGb28gZigpCit7CisgICAgRm9vIHg7CisgICAgcmV0dXJuIHg7Cit9CisKK3ZvaWQgZygpCit7CisgICAgRm9vIG90aGVyX2ZvbzEgPSBGb28oICJvdGhlcl9mb28xIiksIG90aGVyX2ZvbzIgPSBGb28oICJvdGhlcl9mb28yIik7CisgICAgb3RoZXJfZm9vMiA9IG90aGVyX2ZvbzE7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1ZTMzYwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYwpAQCAtMCwwICsxLDg5IEBACisvLyBDbGFzcyBGb28KKyNwcmFnbWEgaW1wbGVtZW50YXRpb24KKworCisvLyBXZSBkb24ndCB1c2UgaGVhZGVyIGZpbGVzLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gc2VlLCB3aGV0aGVyIHRoZQorLy8gY29tcGlsZXIgaXMgaW5zdGFsbGVkIHByb3Blcmx5LgorLy8KKyNpZiAoX19HTlVHX18gPT0gMikKK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworI2VuZGlmCisKK2V4dGVybiAiQyIgeworICAgIGNoYXIgKnN0cm5jcHkgKGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIGRlc3QsIHNpemVfdCBsZW4pOworICAgIGludCBwcmludGYgKGNvbnN0IGNoYXIqLCAuLi4pOworfTsKKworI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKKworaW50IEZvbzo6Zm9vcyA9IDA7CisKK3ZvaWQgRm9vOjppbml0X2ZvbyAoKQoreworICAgIHByaW50ZiAoIkJST0tFTkxZIGNhbGxpbmcgRm9vOjppbml0X2ZvbyBmcm9tIF9faW5pdF9zdGFydDsgc2l6ZV9vZihGb28pID0gJWRcbiIsIHNpemVvZihGb28pKTsKKyAgICBmb29zID0gRk9PTElTSF9OVU1CRVI7Cit9CisKKworRm9vOjpGb28gKCkKK3sKKyAgICBpID0gKytmb29zOworICAgIHN0cm5jcHkgKG1lc3NhZ2UsICJkZWZhdWx0LWZvbyIsIGxlbik7CisjaWZkZWYgV0lUSF9BRERSCisgICAgcHJpbnRmICgiQ29uc3RydWN0aW5nIEZvbyglZCkgXCJkZWZhdWx0LWZvb1wiIGF0ICUwOHhcbiIsIGksIHRoaXMpOworI2Vsc2UKKyAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCJcbiIsIGkpOworI2VuZGlmCit9CisKK0Zvbzo6Rm9vIChjaGFyKiBtc2cpCit7CisgICAgaSA9ICsrZm9vczsKKyAgICBzdHJuY3B5KCBtZXNzYWdlLCBtc2csIGxlbik7CisjaWZkZWYgV0lUSF9BRERSCisgICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4XG4iLCBpLCBtZXNzYWdlLCB0aGlzKTsKKyNlbHNlCisgICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIlxuIiwgaSwgbWVzc2FnZSk7CisjZW5kaWYKK30KKworCitGb286OkZvbyAoY29uc3QgRm9vJiBmb28pCit7CisgICAgaSA9ICsrZm9vczsKKyNpZmRlZiBXSVRIX0FERFIKKyAgICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB3aXRoIEZvbyglZCkgJTA4eFxuIiwgCisJICAgIGksIGZvby5tZXNzYWdlLCB0aGlzLCBmb28uaSwgJmZvbyk7CisjZWxzZQorICAgcHJpbnRmICgiSW5pdGlhbGl6aW5nIEZvbyglZCkgXCIlc1wiIHdpdGggRm9vKCVkKVxuIixpLCBmb28ubWVzc2FnZSwgZm9vLmkpOworI2VuZGlmCisgICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOworfQorCisKK0ZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQoreworI2lmZGVmIFdJVEhfQUREUgorICAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB0byBGb28oJWQpICUwOHhcbiIsIAorCSAgICBmb28uaSwgZm9vLm1lc3NhZ2UsICZmb28sIGksIHRoaXMpOworI2Vsc2UKKyAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgdG8gRm9vKCVkKVxuIiwgZm9vLmksIGZvby5tZXNzYWdlLCBpKTsKKyNlbmRpZgorICAgIGZvciAoIGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworRm9vOjp+Rm9vICgpCit7CisgICAgZm9vcy0tOworI2lmZGVmIFdJVEhfQUREUgorICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHggKHJlbWFpbmluZyBmb29zOiAlZClcbiIsCisJICAgIGksIG1lc3NhZ2UsIHRoaXMsIGZvb3MpOworI2Vsc2UKKyAgICBwcmludGYgKCJEZXN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKKwkgICAgaSwgbWVzc2FnZSwgZm9vcyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmZTUyYQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENsYXNzIEZvbworCisjcHJhZ21hIGludGVyZmFjZQorCisjZGVmaW5lIEZPT0xJU0hfTlVNQkVSIC00NzExCisKKyNpZm5kZWYgRk9PX01TR19MRU4KKyNkZWZpbmUgRk9PX01TR19MRU4gODAKKyNlbmRpZgorIAorY2xhc3MgRm9vIHsKKyAgICBzdGF0aWMgaW50IGZvb3M7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IGludCBsZW4gPSBGT09fTVNHX0xFTjsKKyAgICBjaGFyIG1lc3NhZ2VbbGVuXTsKK3B1YmxpYzogCisgICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7CisgICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQorICAgIEZvbygpOworICAgIEZvbyggY2hhciogbWVzc2FnZSk7CisgICAgRm9vKGNvbnN0IEZvbyYpOworICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7CisgICAgfkZvbyAoKTsKK307IApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtbWFpbi5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5OWI1YwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKQEAgLTAsMCArMSw0MCBAQAorLy8gbWFpbiBwcm9ncmFtIGZvciBDbGFzcyBGb28KKworZXh0ZXJuICJDIiB7CisvLyBTb21lIDxhc3NlcnQuaD4gaW1wbGVtZW50YXRpb25zIChlLmcuIFNVTk9TIDQuMSkgYXJlIGJyb2tlbiwKKy8vIGluIHRoYXQgdGhleSByZXF1aXJlIDxzdGRpby5oPi4gIEJ1dCwgaWYgZ2NjL2crKyBpcyBpbnN0YWxsZWQKKy8vIGNvcnJlY3RseSwgeW91IHNob3VsZCBnZXQgZ2NjJ3MgYXNzZXJ0LmguCisvLyBJZiB0aGUgY29tcGlsZSBmYWlscywgaXQgbWVhbnMgdGhlIHdyb25nIGluY2x1ZGUgZmlsZXMgYXJlIGluIHVzZSEKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK307CisjaW5jbHVkZSAiY2R0ZXN0LWZvby5oIgorCitleHRlcm4gIkMiIHZvaWQgX19pbml0X3N0YXJ0KCk7CisKK2V4dGVybiBGb28gZih2b2lkKTsKK2V4dGVybiB2b2lkIGcodm9pZCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkICpub3QqIGJlIGNhbGxlZCBieSB0aGUgZW52aXJvbm1lbnQuICBUaGVyZSBpcworICAgbm8gd2F5IGluIEMrKyB0byBgYHJ1biBzb21ldGhpbmcgYWZ0ZXIgdGhlIGluaXRpYWxpemVycyBidXQgYmVmb3JlIG1haW4oKScnLgorICAgVGhlIGxpYnJhcnkgdGhhdCBkZXBlbmRzIG9uIHRoaXMgKE5JSENMKSBpcyBicm9rZW4uICAtLSBKb2huIEdpbG1vcmUgCisgICBXZSBsZWF2ZSB0aGlzIGhlcmUgdG8gdGVzdCB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBjb21waWxlcgorICAgZG8gbm90IHJlLWludHJvZHVjZSB0aGlzIGxvc2luZyBgYGZlYXR1cmUnJy4gICovCit2b2lkIAorX19pbml0X3N0YXJ0KCkKK3sKKyAgICBGb286OmluaXRfZm9vKCk7Cit9CisKK3N0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsgCisKK21haW4oKSAKK3sgCisgICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSAyKTsKKyAgICBGb28gYXV0b21hdGljX2ZvbyggImF1dG9tYXRpY19mb28iKTsKKyAgICBGb28gYmxhX2ZvbyA9IGYoKTsKKyAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOworICAgIGcoKTsKKyAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOworICAgIC8vIGBhdXRvbWF0aWNfZm9vJyBhbmQgYGJsYV9mb28nIGFyZSBkZXN0cnVjdGVkIGhlcmUgCit9IAorIApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmUwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5kYXQKQEAgLTAsMCArMSwxNSBAQAorQ29uc3RydWN0aW5nIEZvbygxKSAic3RhdGljX2ZvbyIKK0NvbnN0cnVjdGluZyBGb28oMikgInN0YXRpY19mb28iCitDb25zdHJ1Y3RpbmcgRm9vKDMpICJhdXRvbWF0aWNfZm9vIgorQ29uc3RydWN0aW5nIEZvbyg0KSAiZGVmYXVsdC1mb28iCitJbml0aWFsaXppbmcgRm9vKDUpICJkZWZhdWx0LWZvbyIgd2l0aCBGb28oNCkKK0Rlc3RydWN0aW5nIEZvbyg0KSAiZGVmYXVsdC1mb28iIChyZW1haW5pbmcgZm9vczogNCkKK0NvbnN0cnVjdGluZyBGb28oNSkgIm90aGVyX2ZvbzEiCitDb25zdHJ1Y3RpbmcgRm9vKDYpICJvdGhlcl9mb28yIgorQ29weWluZyBGb28oNSkgIm90aGVyX2ZvbzEiIHRvIEZvbyg2KQorRGVzdHJ1Y3RpbmcgRm9vKDYpICJvdGhlcl9mb28xIiAocmVtYWluaW5nIGZvb3M6IDUpCitEZXN0cnVjdGluZyBGb28oNSkgIm90aGVyX2ZvbzEiIChyZW1haW5pbmcgZm9vczogNCkKK0Rlc3RydWN0aW5nIEZvbyg1KSAiZGVmYXVsdC1mb28iIChyZW1haW5pbmcgZm9vczogMykKK0Rlc3RydWN0aW5nIEZvbygzKSAiYXV0b21hdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAyKQorRGVzdHJ1Y3RpbmcgRm9vKDIpICJzdGF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDEpCitEZXN0cnVjdGluZyBGb28oMSkgInN0YXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMCkKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JlMzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwCkBAIC0wLDAgKzEsMTAwIEBACisjIEV4cGVjdCBzY3JpcHQgZm9yIExEIGNkdGVzdCBUZXN0cworIyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk0LDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCisjIFJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKKyMKKworIyBNYWtlIHN1cmUgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgorCitzZXQgdGVzdDEgImNkdGVzdCIKK3NldCB0ZXN0MiAiY2R0ZXN0IHdpdGggLVVyIgorCisjIFRoaXMgdGVzdCByZXF1aXJlcyBydW5uaW5nIHRoZSBleGVjdXRhYmxlIGdlbmVyYXRlZCBieSBsZC4KK2lmICFbaXNuYXRpdmVdIHsKKyAgICByZXR1cm4KK30KKworaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKKyAgICB1bnRlc3RlZCAkdGVzdDEKKyAgICB1bnRlc3RlZCAkdGVzdDIKKyAgICByZXR1cm4KK30KKworaWYgeyAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1mb28uY2MgdG1wZGlyL2NkdGVzdC1mb28ub10KKyAgICAgfHwgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtYmFyLmNjIHRtcGRpci9jZHRlc3QtYmFyLm9dCisgICAgIHx8ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LW1haW4uY2MgdG1wZGlyL2NkdGVzdC1tYWluLm9dIH0geworICAgIHVucmVzb2x2ZWQgJHRlc3QxCisgICAgdW5yZXNvbHZlZCAkdGVzdDIKKyAgICByZXR1cm4KK30KKworaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvY2R0ZXN0IHt0bXBkaXIvY2R0ZXN0LWZvby5vIHRtcGRpci9jZHRlc3QtYmFyLm8gdG1wZGlyL2NkdGVzdC1tYWluLm99XSB7CisgICAgZmFpbCAkdGVzdDEKK30gZWxzZSB7CisgICAgc2VuZF9sb2cgInRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0XG4iCisgICAgdmVyYm9zZSAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiCisgICAgY2F0Y2ggImV4ZWMgdG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiIGV4ZWNfb3V0cHV0CisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCisJZmFpbCAkdGVzdDEKKyAgICB9IGVsc2UgeworCXNlbmRfbG9nICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0XG4iCisJdmVyYm9zZSAiZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdCIKKwljYXRjaCAiZXhlYyBkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IiBleGVjX291dHB1dAorCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorCisJaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworCSAgICBwYXNzICR0ZXN0MQorCX0gZWxzZSB7CisJICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwkgICAgdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCisJICAgIGZhaWwgJHRlc3QxCisJfQorICAgIH0KK30KKworaWYgIVtsZF9yZWxvY2F0ZSAkbGQgdG1wZGlyL2NkdGVzdC5vIHstVXIgdG1wZGlyL2NkdGVzdC1mb28ubyB0bXBkaXIvY2R0ZXN0LWJhci5vIHRtcGRpci9jZHRlc3QtbWFpbi5vfV0geworICAgIGZhaWwgJHRlc3QyCit9IGVsc2UgeworICAgIGlmICFbbGRfbGluayAkbGQgdG1wZGlyL2NkdGVzdCB0bXBkaXIvY2R0ZXN0Lm9dIHsKKwlmYWlsICR0ZXN0MgorICAgIH0gZWxzZSB7CisJc2VuZF9sb2cgInRtcGRpci9jZHRlc3QgPnRtcGRpci9jZHRlc3Qub3V0XG4iCisJdmVyYm9zZSAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiCisJY2F0Y2ggImV4ZWMgdG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXQiIGV4ZWNfb3V0cHV0CisJaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKKwkgICAgZmFpbCAkdGVzdDIKKwl9IGVsc2UgeworCSAgICBzZW5kX2xvZyAiZGlmZiB0bXBkaXIvY2R0ZXN0Lm91dCAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LmRhdFxuIgorCSAgICB2ZXJib3NlICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IgorCSAgICBjYXRjaCAiZXhlYyBkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IiBleGVjX291dHB1dAorCSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKworCSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisJCXBhc3MgJHRlc3QyCisJICAgIH0gZWxzZSB7CisJCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwkJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCisJCWZhaWwgJHRlc3QyCisJICAgIH0KKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucyBiL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvYXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlMGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvYXNtLnMKQEAgLTAsMCArMSwxNCBAQAorLnRleHQKKwkuZ2xvYmFsIGZvbworZm9vOgorCS5sb25nIDB4MTIzNDU2NzgKKworLmRhdGEKKwkuZ2xvYmFsIGJhcgorYmFyOgorCS5sb25nIDB4ODc2NTQzMjEKKworCS5sY29tbSAweDEyCisKKworCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvY2hlY2tzLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvY2hlY2tzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNlZjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCkBAIC0wLDAgKzEsNzIgQEAKKyMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VjdGlvbiBjaGVja3MgdGVzdHMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBOaWNrIENsaWZ0b24gKG5pY2tjQGN5Z251cy5jb20pCisKK3Byb2Mgc2VjdGlvbl9jaGVjayB7fSB7CisgICAgZ2xvYmFsIGxkX2ZsYWdzCisgICAgZ2xvYmFsIGFzCisgICAgZ2xvYmFsIGxkCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICAKKyAgICBzZXQgdGVzdCAiY2hlY2sgc2VjdGlvbnMiCisgICAgCisgICAgc2V0IGxkZmxhZ3MgIi0tY2hlY2stc2VjdGlvbnMiCisKKyAgICBpZiB7ICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9hc20ucyB0bXBkaXIvYXNtLm9dfSB7CisJdW5yZXNvbHZlZCAkdGVzdAorCXJldHVybgorICAgIH0KKworICAgIGlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9hc20ueCAiJGxkZmxhZ3MgdG1wZGlyL2FzbS5vIl0geworCWZhaWwgIiR0ZXN0IDogdXNpbmcgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IgorICAgIH0gZWxzZSB7CisJcGFzcyAkdGVzdAorICAgIH0KKworICAgICMgQ2hhbmdlIHRoZSBsaW5rZXIgZmxhZ3Mgc28gdGhhdCBvdXIgImJ1Z2d5IiBsaW5rZXIKKyAgICAjIHNjcmlwdCBpcyB1c2VkLgorICAgIHNldCBsZGZsYWdzICItLWNoZWNrLXNlY3Rpb25zIC1UICRzcmNkaXIvJHN1YmRpci9zY3JpcHQgLWUgZm9vIgorCisgICAgIyBQZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mIGludm9raW5nIGxkX3NpbXBsZV9saW5rCisgICAgIyBleGNlcHQgdGhhdCB3ZSBuZWVkIHRvIG1hc3NhZ2UgdGhlIG91dHB1dCBmdXRoZXIuCisgICAgCisgICAgY2F0Y2ggImV4ZWMgJGxkIC1vIHRtcGRpci9hc20ueCAkbGRmbGFncyB0bXBkaXIvYXNtLm8iIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIGdvdCBzb21lIG91dHB1dCBmcm9tIHRoZSBsaW5rZXIKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisJZmFpbCAiJHRlc3QgLSBlcnJvciBtZXNzYWdlIGV4cGVjdGVkIGJ1dCBub3QgZm91bmQiCisgICAgfSAKKworICAgICMgTm93IHJlbW92ZSBvdXIgZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZQorICAgIHJlZ3N1YiAtYWxsICIuKjogc2VjdGlvbiAuZGF0YSAuKiBvdmVybGFwcyBzZWN0aW9uIC50ZXh0IC4qIiAkZXhlY19vdXRwdXQgIiIgZXhlY19vdXRwdXQKKworICAgICMgQW5kIGNoZWNrIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlLCAodW5leHBlY3RlZCkgd2FzIGxlZnQKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisJcGFzcyAkdGVzdAorICAgIH0gZWxzZSB7CisJdmVyYm9zZSAtbG9nICJVbmV4cGVjdGVkIGxpbmtlciBtZXNzYWdlKHMpOiAkZXhlY19vdXRwdXQiCisJCisJZmFpbCAiJHRlc3QgLSB1c2luZyBlcnJvbmVvdXMgbGlua2VyIHNjcmlwdCIKKyAgICB9Cit9CisKK3NlY3Rpb25fY2hlY2sKKworCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL3NjcmlwdCBiL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3Mvc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzZhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL3NjcmlwdApAQCAtMCwwICsxLDYgQEAKK1NFQ1RJT05TIHsKKyAgICAgICAgLnRleHQgMHgxMDAgOiAgICAgICAgICAgICB7ICooLnRleHQpIH0KKwkuZGF0YSAweDEwMCA6IEFUICgweDEwMCkgIHsgKiguZGF0YSkgfQorCS5ic3MgIDB4MTAwIDogQVQgKDB4NDAwMCkgeyAqKC5ic3MpICB9Cit9CisKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmYWE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwCkBAIC0wLDAgKzEsODA4IEBACisjIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXZlcnNpb24gdGVzdHMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBFcmljIFlvdW5nZGFsZSAoZXJpY0BhbmRhbnRlLmppYy5jb20pCisKKyMKKworIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCitpZiAhW2lzbmF0aXZlXSB0aGVuIHtyZXR1cm59CisKKyMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiBhIGNvdXBsZSBvZiBFTEYgcGxhdGZvcm1zLgorIyBTcXVhcmUgYnJhY2tldCBleHByZXNzaW9ucyBzZWVtIHRvIGNvbmZ1c2UgaXN0YXJnZXQuCisjIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgdGVzdCB0aGF0IGlzIHVzZWQgaW4gbGQtc2hhcmVkLCBCVFcuCitpZiB7ICFbaXN0YXJnZXQgaT84Ni0qLXN5c3Y0Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi11bml4d2FyZV0gXAorICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1lbGYqXSBcCisgICAgICYmICFbaXN0YXJnZXQgaT84Ni0qLWxpbnV4Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IG02OGstKi1saW51eCpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBtaXBzKi0qLWlyaXg1Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1lbGYqXSBcCisgICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYy0qLWxpbnV4Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1zeXN2NCpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1lbGZdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1zb2xhcmlzMipdCisgICAgICYmICFbaXN0YXJnZXQgYWxwaGEqLSotbGludXgqXSB9IHsKKyAgICByZXR1cm4KK30KKworaWYgeyBbaXN0YXJnZXQgaT84Ni0qLWxpbnV4YW91dCpdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGk/ODYtKi1saW51eG9sZGxkKl0gXAorICAgICB8fCBbaXN0YXJnZXQgbTY4ay0qLWxpbnV4YW91dCpdIH0geworICAgIHJldHVybgorfQorCitpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisgICAgcmV0dXJuCit9CisKK3NldCBkaWZmIGRpZmYKK3NldCB0bXBkaXIgdG1wZGlyCitzZXQgVk9CSkRVTVBfRkxBR1MgLS1wcml2YXRlLWhlYWRlcnMKK3NldCBET0JKRFVNUF9GTEFHUyAtLWR5bmFtaWMtc3ltcworc2V0IFNPQkpEVU1QX0ZMQUdTIC0tc3ltcworc2V0IHNoYXJlZCAtLXNoYXJlZAorc2V0IHNjcmlwdCAtLXZlcnNpb24tc2NyaXB0CisKK3Byb2MgdGVzdF9hciB7IHRlc3QgbGliIG9iamVjdCBleHBlY3QgfSB7CisgICAgZ2xvYmFsIGFyCisgICAgZ2xvYmFsIG5tCisgICAgZ2xvYmFsIHRtcGRpcgorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIGRpZmYKKworICAgIHZlcmJvc2UgLWxvZyAiJGFyIC1jciAkdG1wZGlyLyRsaWIgJHRtcGRpci8kb2JqZWN0IgorICAgIGNhdGNoICJleGVjICRhciAtY3IgJHRtcGRpci8kbGliICR0bXBkaXIvJG9iamVjdCIgZXhlY19vdXRwdXQKKyAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKKwl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwl1bnJlc29sdmVkICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisgICAgCisgICAgdmVyYm9zZSAtbG9nICIkbm0gLS1wcmludC1hcm1hcCAkdG1wZGlyLyRsaWIgfCBncmVwIFwiIGluIFwiIHwgZWdyZXAgXCJWRVJTXFx8YmFyXFx8Zm9vXCIgfCBzb3J0ID4gJHRtcGRpci9ubS5vdXQiCisKKyAgICBjYXRjaCAiZXhlYyAkbm0gLS1wcmludC1hcm1hcCAkdG1wZGlyLyRsaWIgfCBncmVwIFxcXCBpblxcXCAgfCBlZ3JlcCBWRVJTXFxcfGJhclxcXHxmb28gfCBzb3J0ID4gJHRtcGRpci9ubS5vdXQiIGV4ZWNfb3V0cHV0CisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworCWNhdGNoICJleGVjICRkaWZmIC1xICR0bXBkaXIvbm0ub3V0ICRzcmNkaXIvJHN1YmRpci8kZXhwZWN0IiBleGVjX291dHB1dAorCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorCWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwkgICAgcGFzcyAkdGVzdAorCSAgICByZXR1cm4KKwl9IGVsc2UgeworCSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwkgICAgZmFpbCAiJHRlc3QiCisJICAgIHJldHVybgorCX0KKyAgICB9IGVsc2UgeworCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorCWZhaWwgIiR0ZXN0IgorICAgIH0KK30KKworIworIyBvYmpkdW1wX2VtcHR5c3ltc3R1ZmYKKyMJQ2hlY2sgbm9uLWR5bmFtaWMgc3ltYm9scyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBub25lIHdpdGggJ0AnLgorIworcHJvYyBvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKKyAgICBnbG9iYWwgU09CSkRVTVBfRkxBR1MKKyAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKKyAgICBnbG9iYWwgZGlmZgorCisgICAgaWYgIVtpbmZvIGV4aXN0cyBTT0JKRFVNUF9GTEFHU10geyBzZXQgU09CSkRVTVBfRkxBR1MgIiIgfQorCisgICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvXEAvcCIKKworICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9cQC9wIiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKyMgV2Ugc2hvdWxkbid0IGdldCBhbnl0aGluZyBoZXJlLgorCXJldHVybiAxCisgICAgfSBlbHNlIHsKKyMgaXQgaXMgbm90IG5vcm1hbCB0byBjb21lIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgorCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eXN5bXN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKKwlyZXR1cm4gMAorICAgIH0KKworfQorCisjCisjIG9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZgorIwlDaGVjayBkeW5hbWljIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSB3aXRoICdAJy4KKyMKK3Byb2Mgb2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7CisgICAgZ2xvYmFsIERPQkpEVU1QX0ZMQUdTCisgICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0CisgICAgZ2xvYmFsIGRpZmYKKworICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KKworICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIgorCisgICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKyMgV2Ugc2hvdWxkbid0IGdldCBhbnl0aGluZyBoZXJlLgorCXJldHVybiAxCisgICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiKm9iamR1bXA6ICo6IG5vdCBhIGR5bmFtaWMgb2JqZWN0IiAkZXhlY19vdXRwdXRdIHRoZW4geworCXJldHVybiAxCisgICAgfSBlbHNlIHsKKyMgaXQgaXMgbm90IG5vcm1hbCB0byBjb21lIGhlcmUgLSB3ZSBoYXZlIG5vIG91dHB1dCB0byBjb21wYXJlLgorCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eWR5bnN5bXN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKKwlyZXR1cm4gMAorICAgIH0gfQorfQorCisjCisjIG9iamR1bXBfZW1wdHl2ZXJzdHVmZgorIwlNYWtlIHN1cmUgdGhlcmUgaXMgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbgorIworcHJvYyBvYmpkdW1wX2VtcHR5dmVyc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCB9IHsKKyAgICBnbG9iYWwgVk9CSkRVTVBfRkxBR1MKKyAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKKyAgICBnbG9iYWwgZGlmZgorICAgIGdsb2JhbCB0bXBkaXIKKworICAgIGlmIHtbd2hpY2ggJG9iamR1bXBdID09IDB9IHRoZW4geworCXBlcnJvciAiJG9iamR1bXAgZG9lcyBub3QgZXhpc3QiCisJcmV0dXJuIDAKKyAgICB9CisKKyAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9CisKKyAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCisKKyAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAiIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworIyBpdCBpcyBub3JtYWwgdG8gZmFpbCBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KKwlyZXR1cm4gMQorICAgIH0gZWxzZSB7IGlmIHsgW3N0cmluZyBtYXRjaCAiKmxpYmMqIiAkZXhlY19vdXRwdXRdIH0gdGhlbiB7CisjIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGVyZSBpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGxpYmMsIHNvIHdlCisjIGNhbid0IHJlYWxseSBwZXJmb3JtIHRoaXMgdGVzdC4KKwlyZXR1cm4gMQorICAgIH0gZWxzZSB7CisJdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCisJdmVyYm9zZSAtbG9nICJvYmpkdW1wX2VtcHR5dmVyc3R1ZmY6IGRpZCBub3QgZXhwZWN0IGFueSBvdXRwdXQgZnJvbSBvYmpkdW1wIgorCXJldHVybiAwCisgICAgfSB9CisKK30KKworIworIyBvYmpkdW1wX3N5bXN0dWZmCisjCUR1bXAgbm9uLWR5bmFtaWMgc3ltYm9sIHN0dWZmIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgorIworcHJvYyBvYmpkdW1wX3N5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKKyAgICBnbG9iYWwgU09CSkRVTVBfRkxBR1MKKyAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKKyAgICBnbG9iYWwgZGlmZgorICAgIGdsb2JhbCB0bXBkaXIKKworICAgIGlmICFbaW5mbyBleGlzdHMgU09CSkRVTVBfRkxBR1NdIHsgc2V0IFNPQkpEVU1QX0ZMQUdTICIiIH0KKworICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBncmVwIFxAIHwgc29ydCAgPiAkdG1wZGlyL29iamR1bXAub3V0IgorCisgICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBncmVwIFxAIHwgc29ydCAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKworIyBOb3cgZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0byBlZmZlY3RpdmVseSBkaWZmIHRoZSBkYXJuZWQgdGhpbmdzCisjIFRoZSBzdHVmZiBjb21pbmcgZnJvbSB0aGUgZXhwZWN0ZmlsZSBpcyBhY3R1YWxseSBhIHJlZ2V4LCBzbyB3ZSBjYW4KKyMgc2tpcCBvdmVyIHRoZSBhY3R1YWwgYWRkcmVzc2VzIGFuZCBzbyBmb3J0aC4gIFRoaXMgaXMgY3VycmVudGx5IHZlcnkKKyMgc2ltcGxlbWluZGVkIC0gaXQgZXhwZWN0cyBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgaW4gdGVybXMgb2YgbGluZQorIyBudW1iZXJzLgorCisJaWYgW2ZpbGUgZXhpc3RzICRleHBlY3RmaWxlXSB0aGVuIHsKKwkgICAgc2V0IGZpbGVfYSBbb3BlbiAkZXhwZWN0ZmlsZSByXQorCX0gZWxzZSB7CisJICAgIHBlcnJvciAiJGV4cGVjdGZpbGUgZG9lc24ndCBleGlzdCIKKwkgICAgcmV0dXJuIDAKKwl9CisJCisJaWYgW2ZpbGUgZXhpc3RzICR0bXBkaXIvb2JqZHVtcC5vdXRdIHRoZW4geworCSAgICBzZXQgZmlsZV9iIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KKwl9IGVsc2UgeworCSAgICBwZXJyb3IgIiR0bXBkaXIvb2JqZHVtcC5vdXQgZG9lc24ndCBleGlzdCIKKwkgICAgcmV0dXJuIDAKKwl9CisKKwl2ZXJib3NlICIjIERpZmYnaW5nOiAkZXhwZWN0ZmlsZSAkdG1wZGlyL29iamR1bXAub3V0IiAyCisKKwlzZXQgZW9mIC0xCisJc2V0IGRpZmZlcmVuY2VzIDAKKworCXdoaWxlIHsgW2dldHMgJGZpbGVfYSBsaW5lXSAhPSAkZW9mIH0geworCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4geworCQljb250aW51ZQorCSAgICB9IGVsc2UgeworCQlsYXBwZW5kIGxpc3RfYSAkbGluZQorCSAgICB9CisJfQorCWNsb3NlICRmaWxlX2EKKworCXdoaWxlIHsgW2dldHMgJGZpbGVfYiBsaW5lXSAhPSAkZW9mIH0geworCSAgICBpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4geworCQljb250aW51ZQorCSAgICB9IGVsc2UgeworCQlsYXBwZW5kIGxpc3RfYiAkbGluZQorCSAgICB9CisJfQorCWNsb3NlICRmaWxlX2IKKwkKKwlmb3IgeyBzZXQgaSAwIH0geyAkaSA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGkgfSB7CisJICAgIHNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQorCSAgICBzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KKwkgICAgCisKKwkgICAgdmVyYm9zZSAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2EiIDMKKwkgICAgdmVyYm9zZSAiXHQvdG1wL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIgMworCSAgICBpZiBbcmVnZXhwICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7CisJCWNvbnRpbnVlCisJICAgIH0gZWxzZSB7CisJCXZlcmJvc2UgLWxvZyAiXHQkZXhwZWN0ZmlsZTogJGk6ICRsaW5lX2EiCisJCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKKwkJCisJCXJldHVybiAwCisJICAgIH0KKwl9CisJCisJaWYgeyBbbGxlbmd0aCAkbGlzdF9hXSAhPSBbbGxlbmd0aCAkbGlzdF9iXSB9IHsKKwkgICAgdmVyYm9zZSAtbG9nICJMaW5lIGNvdW50IgorCSAgICByZXR1cm4gMAorCX0KKwkKKwlpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKKwkgICAgcmV0dXJuIDEKKwl9CisJCisJcmV0dXJuIDAKKyAgICB9IGVsc2UgeworCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorCXJldHVybiAwCisgICAgfQorCit9CisKKyMKKyMgb2JqZHVtcF9keW1zeW1zdHVmZgorIwlEdW1wIGR5bmFtaWMgc3ltYm9sIHN0dWZmIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgorIworcHJvYyBvYmpkdW1wX2R5bnN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgZXhwZWN0ZmlsZSB9IHsKKyAgICBnbG9iYWwgRE9CSkRVTVBfRkxBR1MKKyAgICBnbG9iYWwgdmVyc2lvbl9vdXRwdXQKKyAgICBnbG9iYWwgZGlmZgorICAgIGdsb2JhbCB0bXBkaXIKKworICAgIGlmICFbaW5mbyBleGlzdHMgRE9CSkRVTVBfRkxBR1NdIHsgc2V0IERPQkpEVU1QX0ZMQUdTICIiIH0KKworICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJERPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZFUlMvcFxcXDsvc2hvdy9wIHwgc29ydCB8IHVuaXEgID4gJHRtcGRpci9vYmpkdW1wLm91dCIKKworICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCB8IHNvcnQgfCB1bmlxICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworCisjIE5vdyBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uIHRvIGVmZmVjdGl2ZWx5IGRpZmYgdGhlIGRhcm5lZCB0aGluZ3MKKyMgVGhlIHN0dWZmIGNvbWluZyBmcm9tIHRoZSBleHBlY3RmaWxlIGlzIGFjdHVhbGx5IGEgcmVnZXgsIHNvIHdlIGNhbgorIyBza2lwIG92ZXIgdGhlIGFjdHVhbCBhZGRyZXNzZXMgYW5kIHNvIGZvcnRoLiAgVGhpcyBpcyBjdXJyZW50bHkgdmVyeQorIyBzaW1wbGVtaW5kZWQgLSBpdCBleHBlY3RzIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBpbiB0ZXJtcyBvZiBsaW5lCisjIG51bWJlcnMuCisKKwlpZiBbZmlsZSBleGlzdHMgJGV4cGVjdGZpbGVdIHRoZW4geworCSAgICBzZXQgZmlsZV9hIFtvcGVuICRleHBlY3RmaWxlIHJdCisJfSBlbHNlIHsKKwkgICAgd2FybmluZyAiJGV4cGVjdGZpbGUgZG9lc24ndCBleGlzdCIKKwkgICAgcmV0dXJuIDAKKwl9CisJCisJaWYgW2ZpbGUgZXhpc3RzICR0bXBkaXIvb2JqZHVtcC5vdXRdIHRoZW4geworCSAgICBzZXQgZmlsZV9iIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KKwl9IGVsc2UgeworCSAgICBmYWlsICIkdG1wZGlyL29iamR1bXAub3V0IGRvZXNuJ3QgZXhpc3QiCisJICAgIHJldHVybiAwCisJfQorCisJdmVyYm9zZSAiIyBEaWZmJ2luZzogJGV4cGVjdGZpbGUgJHRtcGRpci9vYmpkdW1wLm91dCIgMgorCisJc2V0IGVvZiAtMQorCXNldCBkaWZmZXJlbmNlcyAwCisKKwl3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKKwkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKKwkJY29udGludWUKKwkgICAgfSBlbHNlIHsKKwkJbGFwcGVuZCBsaXN0X2EgJGxpbmUKKwkgICAgfQorCX0KKwljbG9zZSAkZmlsZV9hCisKKwl3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKKwkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKKwkJY29udGludWUKKwkgICAgfSBlbHNlIHsKKwkJbGFwcGVuZCBsaXN0X2IgJGxpbmUKKwkgICAgfQorCX0KKwljbG9zZSAkZmlsZV9iCisJCisJZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9iXSB9IHsgaW5jciBpIH0geworCSAgICBzZXQgbGluZV9iIFtsaW5kZXggJGxpc3RfYiAkaV0KKwkgICAgCisjIFRoZSB0ZXN0cyBhcmUgcmlnZ2VkIHNvIHRoYXQgd2Ugc2hvdWxkIG5ldmVyIGV4cG9ydCBhIHN5bWJvbCB3aXRoIHRoZQorIyB3b3JkICdoaWRlJyBpbiBpdC4gIFRodXMgd2UganVzdCBzZWFyY2ggZm9yIGl0LCBhbmQgYmFpbCBpZiB3ZSBmaW5kIGl0LgorCSAgICBpZiBbcmVnZXhwICJoaWRlIiAkbGluZV9iXSB0aGVuIHsKKwkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgorCQkKKwkJcmV0dXJuIDAKKwkgICAgfQorCisJICAgIHZlcmJvc2UgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9iIiAzCisKKwkgICAgIyBXZSBjYW4ndCBhc3N1bWUgdGhhdCB0aGUgc29ydCBpcyBjb25zaXN0ZW50IGFjcm9zcworCSAgICAjIHN5c3RlbXMsIHNvIHdlIG11c3QgY2hlY2sgZWFjaCByZWdleHAuICBXaGVuIHdlIGZpbmQgYQorCSAgICAjIHJlZ2V4cCwgd2UgbnVsbCBpdCBvdXQsIHNvIHdlIGRvbid0IG1hdGNoIGl0IHR3aWNlLgorCSAgICBmb3IgeyBzZXQgaiAwIH0geyAkaiA8IFtsbGVuZ3RoICRsaXN0X2FdIH0geyBpbmNyIGogfSB7CisJCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRqXQorCisJCWlmIFtyZWdleHAgJGxpbmVfYSAkbGluZV9iXSB0aGVuIHsKKwkJICAgIGxyZXBsYWNlICRsaXN0X2EgJGogJGogIkNBTiBOT1QgTUFUQ0giCisJCSAgICBicmVhaworCQl9CisJICAgIH0KKworCSAgICBpZiB7ICRqID49IFtsbGVuZ3RoICRsaXN0X2FdIH0geworCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCisJCQorCQlyZXR1cm4gMAorCSAgICB9CisJfQorCQorCWlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7CisJICAgIHZlcmJvc2UgLWxvZyAiTGluZSBjb3VudCIKKwkgICAgcmV0dXJuIDAKKwl9CisJCisJaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7CisJICAgIHJldHVybiAxCisJfQorCQorCXJldHVybiAwCisgICAgfSBlbHNlIHsKKwl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwlyZXR1cm4gMAorICAgIH0KKworfQorCisjCisjIG9iamR1bXBfdmVyc2lvbnN0dWZmCisjCUR1bXAgdmVyc2lvbiBkZWZpbml0aW9ucy9yZWZlcmVuY2VzIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBzYW5lLgorIworcHJvYyBvYmpkdW1wX3ZlcnNpb25zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7CisgICAgZ2xvYmFsIFZPQkpEVU1QX0ZMQUdTCisgICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0CisgICAgZ2xvYmFsIGRpZmYKKyAgICBnbG9iYWwgdG1wZGlyCisKKyAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKKwlwZXJyb3IgIiRvYmpkdW1wIGRvZXMgbm90IGV4aXN0IgorCXJldHVybiAwCisgICAgfQorCisgICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQorCisgICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IgorCisgICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKKyAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisKKwkjIEl0J3MgT0sgaWYgdGhlcmUgYXJlIGV4dHJhIGxpbmVzIGluIHRoZSBhY3R1YWwgb3V0cHV0OyB0aGV5CisJIyBtYXkgY29tZSBmcm9tIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbGliYy4gIFdlIHJlcXVpcmUgdGhhdAorCSMgZXZlcnkgbGluZSBpbiBFWFBFQ1RGSUxFIGFwcGVhciBpbiB0aGUgb3V0cHV0IGluIG9yZGVyLgorCisJc2V0IGYxIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KKwlzZXQgZjIgW29wZW4gJGV4cGVjdGZpbGUgcl0KKwlnZXRzICRmMiBsMgorCXdoaWxlIHsgW2dldHMgJGYxIGwxXSAhPSAtMSB9IHsKKwkgICAgaWYgeyBbc3RyaW5nIG1hdGNoICRsMiAkbDFdIH0gdGhlbiB7CisJCWlmIHsgW2dldHMgJGYyIGwyXSA9PSAtMSB9IHRoZW4geworCQkgICAgY2xvc2UgJGYxCisJCSAgICBjbG9zZSAkZjIKKwkJICAgIHJldHVybiAxCisJCX0KKwkgICAgfQorCX0KKworCSMgV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgd2l0aG91dCBzZWVpbmcgdGhlIGxpbmUgd2UKKwkjIGV4cGVjdGVkLiAgVGhpcyBpcyBhIHRlc3QgZmFpbHVyZS4KKworCWNsb3NlICRmMQorCWNsb3NlICRmMgorCisJdmVyYm9zZSAtbG9nICJEaWQgbm90IGZpbmQgXCIkbDJcIiIKKwlzZXQgZjEgW29wZW4gJHRtcGRpci9vYmpkdW1wLm91dCByXQorCXdoaWxlIHsgW2dldHMgJGYxIGwxXSAhPSAtMSB9IHsKKwkgICAgdmVyYm9zZSAtbG9nICRsMQorCX0KKworCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorCXJldHVybiAwCisgICAgfSBlbHNlIHsKKwl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwlyZXR1cm4gMAorICAgIH0KK30KKworcHJvYyBidWlsZF92ZXJzX2xpYiB7IHRlc3Qgc291cmNlIGxpYm5hbWUgb3RoZXIgbWFwZmlsZSB2ZXJleHAgdmVyc3ltZXhwIHN5bWV4cCB9IHsKKyAgICBnbG9iYWwgbGQKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBleGVjX291dHB1dAorICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKKyAgICBnbG9iYWwgdG1wZGlyCisgICAgZ2xvYmFsIGFzCisgICAgZ2xvYmFsIG9iamR1bXAKKyAgICBnbG9iYWwgQ0MKKyAgICBnbG9iYWwgQ0ZMQUdTCisgICAgZ2xvYmFsIHNoYXJlZAorICAgIGdsb2JhbCBzY3JpcHQKKworICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGxpYm5hbWUuc10gICAgIHsKKwl1bnJlc29sdmVkICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRsaWJuYW1lLnMgJHRtcGRpci8kbGlibmFtZS5vIF0gICAgIHsKKwl1bnJlc29sdmVkICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRvdGhlcl0gdGhlbiB7CisJc2V0IG90aGVyX2xpYiAiIgorICAgIH0gZWxzZSB7CisJc2V0IG90aGVyX2xpYiAkdG1wZGlyLyRvdGhlcgorICAgIH0KKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG1hcGZpbGVdIHRoZW4geworCXNldCBzY3JpcHRfYXJnICIiCisgICAgfSBlbHNlIHsKKwlzZXQgc2NyaXB0X2FyZyAiJHNjcmlwdCAkc3JjZGlyLyRzdWJkaXIvJG1hcGZpbGUiCisgICAgfQorCisgICAgaWYgeyFbbGRfc2ltcGxlX2xpbmsgJGxkICR0bXBkaXIvJGxpYm5hbWUuc28gIiRzaGFyZWQgJHRtcGRpci8kbGlibmFtZS5vICRvdGhlcl9saWIgJHNjcmlwdF9hcmciXX0gICAgIHsKKwlmYWlsICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7CisJZmFpbCAiJHRlc3QiCisJcmV0dXJuCisgICAgfQorCisgICAgaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7CisJZmFpbCAiJHRlc3QiCisJcmV0dXJuCisgICAgfQorCisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkc3ltZXhwXSB0aGVuIHsKKwlpZiB7IVtvYmpkdW1wX2VtcHR5c3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5vIF19ICAgICB7CisJICAgIGZhaWwgIiR0ZXN0IgorCSAgICByZXR1cm4KKwl9CisgICAgfSBlbHNlIHsKKwlpZiB7IVtvYmpkdW1wX3N5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUubyAkc3JjZGlyLyRzdWJkaXIvJHN5bWV4cCBdfSAgICAgeworCSAgICBmYWlsICIkdGVzdCIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIHBhc3MgJHRlc3QKKyAgICAKK30KKworcHJvYyB0ZXN0X2xkZmFpbCB7IHRlc3QgZmxhZyBzb3VyY2UgZXhlY25hbWUgb3RoZXIgbWFwZmlsZSB3aHlmYWlsIH0geworICAgIGdsb2JhbCBsZAorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIGV4ZWNfb3V0cHV0CisgICAgZ2xvYmFsIGhvc3RfdHJpcGxldAorICAgIGdsb2JhbCB0bXBkaXIKKyAgICBnbG9iYWwgYXMKKyAgICBnbG9iYWwgb2JqZHVtcAorICAgIGdsb2JhbCBDQworICAgIGdsb2JhbCBDRkxBR1MKKyAgICBnbG9iYWwgc2NyaXB0CisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRvdGhlcl0gdGhlbiB7CisJc2V0IG90aGVyX2xpYiAiIgorICAgIH0gZWxzZSB7CisJc2V0IG90aGVyX2xpYiAkdG1wZGlyLyRvdGhlcgorICAgIH0KKworICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRmbGFnICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7CisJdW5yZXNvbHZlZCAiJHRlc3QiCisJcmV0dXJuCisgICAgfQorCisgICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kZXhlY25hbWUucyAkdG1wZGlyLyRleGVjbmFtZS5vIF0gICAgIHsKKwl1bnJlc29sdmVkICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisKKyAgICB2ZXJib3NlIC1sb2cgIlRoaXMgbGluayBzaG91bGQgZmFpbCBiZWNhdXNlIG9mICR3aHlmYWlsIgorCisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkbWFwZmlsZV0gdGhlbiB7CisJc2V0IHNjcmlwdF9hcmcgIiIKKyAgICB9IGVsc2UgeworCXNldCBzY3JpcHRfYXJnICIkc2NyaXB0ICRzcmNkaXIvJHN1YmRpci8kbWFwZmlsZSIKKyAgICB9CisKKyAgICBpZiB7IVtsZF9saW5rICRsZCAkdG1wZGlyLyRleGVjbmFtZSAiJHRtcGRpci8kZXhlY25hbWUubyAkb3RoZXJfbGliICRzY3JpcHRfYXJnIl19ICAgICB7CisJcGFzcyAiJHRlc3QiCisJcmV0dXJuCisgICAgfQorICAgIGZhaWwgIiR0ZXN0IgorfQorCitwcm9jIHRlc3RfYXNmYWlsIHsgdGVzdCBmbGFnIHNvdXJjZSBleGVjbmFtZSB3aHlmYWlsIH0geworICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIHRtcGRpcgorICAgIGdsb2JhbCBhcworICAgIGdsb2JhbCBDQworICAgIGdsb2JhbCBDRkxBR1MKKworICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRmbGFnICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7CisJdW5yZXNvbHZlZCAiJHRlc3QiCisJcmV0dXJuCisgICAgfQorCisgICAgdmVyYm9zZSAtbG9nICJUaGlzIGFzc2VtYmxlIHNob3VsZCBmYWlsIGJlY2F1c2Ugb2YgJHdoeWZhaWwiCisgICAgY2F0Y2ggImV4ZWMgJGFzIC1vICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHRtcGRpci8kZXhlY25hbWUucyIgZXhlY19vdXRwdXQKKyAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisJZmFpbCAiJHRlc3QiCisJcmV0dXJuCisgICAgfQorICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorICAgIHBhc3MgIiR0ZXN0IgorfQorCitwcm9jIHRlc3Rfc3RyaXBfdmVyc19saWIgeyB0ZXN0IHNyY2xpYiBsaWJuYW1lIHZlcmV4cCB2ZXJzeW1leHAgfSB7CisgICAgZ2xvYmFsIHN0cmlwCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgZXhlY19vdXRwdXQKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisgICAgZ2xvYmFsIHRtcGRpcgorICAgIGdsb2JhbCBvYmpkdW1wCisKKyAgICB2ZXJib3NlIC1sb2cgImNwICR0bXBkaXIvJHNyY2xpYiAkdG1wZGlyLyRsaWJuYW1lLnNvIgorICAgIGV4ZWMgY3AgJHRtcGRpci8kc3JjbGliICR0bXBkaXIvJGxpYm5hbWUuc28KKworICAgIHZlcmJvc2UgLWxvZyAiJHN0cmlwICR0bXBkaXIvJGxpYm5hbWUuc28iCisgICAgY2F0Y2ggImV4ZWMgJHN0cmlwICR0bXBkaXIvJGxpYm5hbWUuc28iIGV4ZWNfb3V0cHV0CisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworCisjIElmIHN0cmlwIHdlbnQgT0ssIHRoZW4gcnVuIHRoZSB1c3VhbCB0ZXN0cyBvbiB0aGUgdGhpbmcgdG8gbWFrZSBzdXJlIHRoYXQKKyMgaXQgaXMgc2FuZS4KKwlpZiB7IVtvYmpkdW1wX3ZlcnNpb25zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7CisJICAgIGZhaWwgIiR0ZXN0IgorCSAgICByZXR1cm4KKwl9CisJCisJaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLnNvICRzcmNkaXIvJHN1YmRpci8kdmVyc3ltZXhwIF19ICAgICB7CisJICAgIGZhaWwgIiR0ZXN0IgorCSAgICByZXR1cm4KKwl9CisJCisgICAgfSBlbHNlIHsKKwl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwlmYWlsICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisgICAgcGFzcyAkdGVzdAorfQorCisKK3Byb2MgYnVpbGRfZXhlYyB7IHRlc3Qgc291cmNlIGV4ZWNuYW1lIGZsYWdzIHNvbGlibmFtZSB2ZXJleHAgdmVyc3ltZXhwIHN5bWV4cCB9IHsKKyAgICBnbG9iYWwgbGQKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBleGVjX291dHB1dAorICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKKyAgICBnbG9iYWwgdG1wZGlyCisgICAgZ2xvYmFsIGFzCisgICAgZ2xvYmFsIG9iamR1bXAKKyAgICBnbG9iYWwgQ0MKKyAgICBnbG9iYWwgQ0ZMQUdTCisKKyAgICBzZXQgc2hhcmVkIC0tc2hhcmVkCisgICAgc2V0IHNjcmlwdCAtLXZlcnNpb24tc2NyaXB0CisgICAgaWYgIVtsZF9jb21waWxlICIkQ0MgLVMgJENGTEFHUyIgJHNyY2Rpci8kc3ViZGlyLyRzb3VyY2UgJHRtcGRpci8kZXhlY25hbWUuc10gICAgIHsKKwl1bnJlc29sdmVkICIkdGVzdCIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiAhW2xkX2Fzc2VtYmxlICRhcyAkdG1wZGlyLyRleGVjbmFtZS5zICR0bXBkaXIvJGV4ZWNuYW1lLm8gXSAgICAgeworCXVucmVzb2x2ZWQgIiR0ZXN0IgorCXJldHVybgorICAgIH0KKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHNvbGlibmFtZV0gdGhlbiB7CisJc2V0IHNvbGlibmFtZV9saWIgIiIKKyAgICB9IGVsc2UgeworCXNldCBzb2xpYm5hbWVfbGliICR0bXBkaXIvJHNvbGlibmFtZQorICAgIH0KKworICAgIGlmIHshW2xkX2xpbmsgJGxkICR0bXBkaXIvJGV4ZWNuYW1lICIkZmxhZ3MgJHRtcGRpci8kZXhlY25hbWUubyAkc29saWJuYW1lX2xpYiJdfSAgICAgeworCWZhaWwgIiR0ZXN0IgorCXJldHVybgorICAgIH0KKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHZlcmV4cF0gdGhlbiB7CisjCisjIE1ha2Ugc3VyZSB3ZSBnZXQgbm90aGluZyBiYWNrLgorIworCWlmIHshW29iamR1bXBfZW1wdHl2ZXJzdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSBdfSAgICAgeworCSAgICBmYWlsICIkdGVzdCIKKwkgICAgcmV0dXJuCisJfQorICAgIH0gZWxzZSB7CisJaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgJHNyY2Rpci8kc3ViZGlyLyR2ZXJleHAgXX0gICAgIHsKKwkgICAgZmFpbCAiJHRlc3QiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICR2ZXJzeW1leHBdIHRoZW4geworCWlmIHshW29iamR1bXBfZW1wdHlkeW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSBdfSAgICAgeworCSAgICBmYWlsICIkdGVzdCIKKwkgICAgcmV0dXJuCisJfQorICAgIH0gZWxzZSB7CisJaWYgeyFbb2JqZHVtcF9keW5zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZSAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgeworCSAgICBmYWlsICIkdGVzdCIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHN5bWV4cF0gdGhlbiB7CisJaWYgeyFbb2JqZHVtcF9lbXB0eXN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lLm8gXX0gICAgIHsKKwkgICAgZmFpbCAiJHRlc3QiCisJICAgIHJldHVybgorCX0KKyAgICB9IGVsc2UgeworCWlmIHshW29iamR1bXBfc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUubyAkc3JjZGlyLyRzdWJkaXIvJHN5bWV4cCBdfSAgICAgeworCSAgICBmYWlsICIkdGVzdCIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIHBhc3MgJHRlc3QKK30KKworCisjCisjIEJhc2ljIHRlc3QgLSBidWlsZCBhIGxpYnJhcnkgd2l0aCB2ZXJzaW9uZWQgc3ltYm9scy4KKyMKK2J1aWxkX3ZlcnNfbGliICJ2ZXJzMSIgdmVyczEuYyB2ZXJzMSAiIiB2ZXJzMS5tYXAgdmVyczEudmVyIHZlcnMxLmRzeW0gdmVyczEuc3ltCisKKworIworIyBUZXN0ICMyIC0gYnVpbGQgYSBsaWJyYXJ5LCBhbmQgbGluayBpdCBhZ2FpbnN0IHRoZSBsaWJyYXJ5IHdlIGJ1aWx0IGluIHN0ZXAKKyMgMS4KKyMKK2J1aWxkX3ZlcnNfbGliICJ2ZXJzMiIgdmVyczIuYyB2ZXJzMiB2ZXJzMS5zbyB2ZXJzMi5tYXAgdmVyczIudmVyIHZlcnMyLmRzeW0gIiIKKworIworIyBUZXN0ICMzIC0gYnVpbGQgYW4gZXhlY3V0YWJsZSwgYW5kIGxpbmsgaXQgYWdhaW5zdCB2ZXJzMS5zby4KKyMKK2J1aWxkX2V4ZWMgInZlcnMzIiB2ZXJzMy5jIHZlcnMzICIiIHZlcnMxLnNvIHZlcnMzLnZlciB2ZXJzMy5kc3ltICIiCisKKyMKKyMgVGVzdCAjNCAtIE1ha2Ugc3VyZSBhIHZlcnNpb24gaW1wbGljaXRseSBkZWZpbmVkIGluIGFuIGV4ZWN1dGFibGUKKyMgY2F1c2VzIGEgdmVyc2lvbiBub2RlIHRvIGJlIGNyZWF0ZWQuICBWZXJpZnkgdGhpcyBib3RoIHdpdGggYW5kIHdpdGhvdXQKKyMgLS1leHBvcnQtZHluYW1pYy4KKyMKKworIyBUaGlzIHRlc3QgZmFpbHMgb24gTUlQUy4gIE9uIHRoZSBNSVBTIHdlIG11c3QgcHV0IGZvbyBpbiB0aGUgZHluYW1pYworIyBzeW1ib2wgdGFibGUsIHdoaWNoIHRoZSB0ZXN0IGRvZXMgbm90IGV4cGVjdC4KK3NldHVwX3hmYWlsICJtaXBzKi0qLSoiCitidWlsZF9leGVjICJ2ZXJzNCIgdmVyczQuYyB2ZXJzNCAiIiAiIiAiIiAiIiB2ZXJzNC5zeW0KKworYnVpbGRfZXhlYyAidmVyczRhIiB2ZXJzNC5jIHZlcnM0YSAiLWV4cG9ydC1keW5hbWljIiAiIiB2ZXJzNGEudmVyIHZlcnM0YS5kc3ltIHZlcnM0YS5zeW0KKworCisjCisjIFRyeSBtdWx0aXBsZSBkZWZpbml0aW9ucyBmb29AQkFSIGFuZCBmb29AQEJBUiBhbmQgbWFrZSBzdXJlIHRoZSBsaW5rZXIKKyMgY29tcGxhaW5zLgorIwordGVzdF9sZGZhaWwgInZlcnM1IiAiIiB2ZXJzNS5jIHZlcnM1ICIiICIiICJtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGZvb0BWRVJTXzEuMiIKKworIworIworIyBOb3cgYnVpbGQgYSB0ZXN0IHRoYXQgc2hvdWxkIHJlZmVyZW5jZSBhIGJ1bmNoIG9mIHZlcnNpb25lZCBzeW1ib2xzLgorIyBBbGwgb2YgdGhlbSBzaG91bGQgYmUgY29ycmVjdGx5IHJlZmVyZW5jZWQuCisjCitidWlsZF9leGVjICJ2ZXJzNiIgdmVyczYuYyB2ZXJzNiAiIiB2ZXJzMS5zbyB2ZXJzNi52ZXIgdmVyczYuZHN5bSB2ZXJzNi5zeW0KKworIworIyBBbm90aGVyIHRlc3QgdG8gdmVyaWZ5IHRoYXQgc29tZXRoaW5nIG1hZGUgbG9jYWwgdmlhICdsb2NhbCcgaXMgdHJ1bHkgbm90CisjIGFjY2Vzc2libGUuCisjCitidWlsZF92ZXJzX2xpYiAidmVyczdhIiB2ZXJzN2EuYyB2ZXJzN2EgIiIgdmVyczcubWFwIHZlcnM3YS52ZXIgdmVyczdhLmRzeW0gdmVyczdhLnN5bQorCit0ZXN0X2xkZmFpbCAidmVyczciICIiIHZlcnM3LmMgdmVyczcgdmVyczdhLnNvICIiICJ1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGhpZGVfYSIKKworCisjCisjIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byB2ZXJpZnkgdGhhdCB3ZSBjYW4gcGFzcyBhIGxpbmtlciBzY3JpcHQgb24gdGhlCisjIGNvbW1hbmQgbGluZSBhcyBpZiBpdCB3ZXJlIGEgbm9ybWFsIC5vIGZpbGUuCisjCitjYXRjaCAiZXhlYyBjcCAkc3JjZGlyLyRzdWJkaXIvdmVyczgubWFwICR0bXBkaXIvIiBpZ25vcmVfb3V0cHV0CitidWlsZF92ZXJzX2xpYiAidmVyczgiIHZlcnMxLmMgdmVyczggdmVyczgubWFwICIiIHZlcnM4LnZlciB2ZXJzMS5kc3ltIHZlcnMxLnN5bQorCisjCisjIFRoaXMgdGVzdCB0cmllcyB0byBtYWtlIHN1cmUgdGhhdCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gdmVyc2lvbmVkIHN5bWJvbHMKKyMgZG9uJ3QgY29sbGlkZSB3aXRoIGRlZmF1bHQgZGVmaW5pdGlvbnMgd2l0aCB0aGUgc2FtZSBzeW1ib2wuCisjCitidWlsZF9leGVjICJ2ZXJzOSIgdmVyczkuYyB2ZXJzOSAiLWV4cG9ydC1keW5hbWljIiAiIiB2ZXJzOS52ZXIgdmVyczkuZHN5bSB2ZXJzOS5zeW0KKworCisjCisjIFRyeSBhbmQgdXNlIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIgc2hvdWxkIGZhaWwgd2l0aAorIyBhbiBlcnJvciBtZXNzYWdlLgorIwordGVzdF9sZGZhaWwgInZlcnMxMCIgIi1ERE9fVEVTVDEwIiB2ZXJzMS5jIHZlcnMxMCAiIiAidmVyczEubWFwIC0tc2hhcmVkIiAiaW52YWxpZCB2ZXJzaW9uIgorCisjCisjIFRyeSBhbmQgc29tZSB0aGluZ3MgdGhlIGFzc2VtYmxlciBzaG91bGQgY29tcGxhaW4gYWJvdXQuCisjCit0ZXN0X2FzZmFpbCAidmVyczExIiAiLURET19URVNUMTEiIHZlcnMxLmMgdmVyczExICJubyBAIGluIHN5bXZlciIKKwordGVzdF9hc2ZhaWwgInZlcnMxMiIgIi1ERE9fVEVTVDEyIiB2ZXJzMS5jIHZlcnMxMiAiZXh0ZXJuIHZlcnNpb24gZGVmaW5pdGlvbiIKKworIworIyBQdXQgYSBzaGFyZWQgbGlicmFyeSBpbiBhbiBhcmNoaXZlIGxpYnJhcnksIGFuZCBtYWtlIHN1cmUgdGhlIGdsb2JhbAorIyBhcmNoaXZlIHN5bWJvbCB0YWJsZSBpcyBzYW5lLgorIwordGVzdF9hciAiYXIgd2l0aCB2ZXJzaW9uZWQgc29saWIiIHZlcnMxMy5hIHZlcnMxLnNvIHZlcnMxMy5hc3ltCisKKyMKKyMgU3RyaXAgYSBzaGFyZWQgbGlicmFyeSwgYW5kIG1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgc2NyZXcgc29tZXRoaW5nIHVwIGluIHRoZXJlLgorIwordGVzdF9zdHJpcF92ZXJzX2xpYiAidmVyczE0IiB2ZXJzMS5zbyB2ZXJzMTQgdmVyczEudmVyIHZlcnMxLmRzeW0gCisKKworIworIyBCdWlsZCBhbm90aGVyIHRlc3Qgd2l0aCBzb21lIHZlcnNpb25lZCBzeW1ib2xzLiAgSGVyZSB3ZSBhcmUgZ29pbmcgdG8gCisjIHRyeSBhbmQgb3ZlcnJpZGUgc29tZXRoaW5nIGZyb20gdGhlIGxpYnJhcnksIGFuZCB3ZSBzaG91bGRuJ3QgZ2V0CisjIGFueSBlcnJvcnMuCisjCitidWlsZF9leGVjICJ2ZXJzMTUiIHZlcnMxNS5jIHZlcnMxNSAiIiB2ZXJzMS5zbyB2ZXJzMTUudmVyIHZlcnMxNS5kc3ltIHZlcnMxNS5zeW0KKworIworIyBUZXN0IHRoYXQgd2hlbiB3ZSBvdmVycmlkZSBhIHZlcnNpb25lZCBzeW1ib2wgZnJvbSB0aGUgbGlicmFyeSB0aGlzCisjIHN5bWJvbCBhcHBlYXJzIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBvZiB0aGUgZXhlY3V0YWJsZS4KKyMKK2J1aWxkX3ZlcnNfbGliICJ2ZXJzMTZhIiB2ZXJzMTZhLmMgdmVyczE2YSAiIiB2ZXJzMTYubWFwIHZlcnMxNmEudmVyIHZlcnMxNmEuZHN5bSAiIgorYnVpbGRfZXhlYyAidmVyczE2IiB2ZXJzMTYuYyB2ZXJzMTYgIiIgdmVyczE2YS5zbyAiIiB2ZXJzMTYuZHN5bSAiIgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0MWZkOQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIEJhc2ljIHRlc3Qgb2YgdmVyc2lvbmluZy4gIFRoZSBpZGVhIHdpdGggdGhpcyBpcyB0aGF0IHdlIGRlZmluZQorICogYSBidW5jaCBvZiBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBzeW1ib2wsIGFuZCB3ZSBjYW4gdGhlb3JldGljYWxseQorICogdGhlbiBsaW5rIGFwcGxpY2F0aW9ucyBhZ2FpbnN0IHZhcnlpbmcgc2V0cyBvZiB0aGVzZS4KKyAqLworY29uc3QgY2hhciAqIHNob3dfYmFyMSA9ICJhc2RmIjsKK2NvbnN0IGNoYXIgKiBzaG93X2JhcjIgPSAiYXNkZiI7CisKK2ludAorYmFyKCkKK3sKKwlyZXR1cm4gMzsKK30KKworLyoKKyAqIFRoZSAnaGlkZScgcHJlZml4IGlzIHNvbWV0aGluZyBzbyB0aGF0IHdlIGNhbiBhdXRvbWF0aWNhbGx5IHNlYXJjaCB0aGUKKyAqIHN5bWJvbCB0YWJsZSBhbmQgdmVyaWZ5IHRoYXQgbm9uZSBvZiB0aGVzZSBzeW1ib2xzIHdlcmUgYWN0dWFsbHkgZXhwb3J0ZWQuCisgKi8KK2ludAoraGlkZV9vcmlnaW5hbF9mb28oKQoreworCXJldHVybiAxK2JhcigpOworCit9CisKK2ludAoraGlkZV9vbGRfZm9vKCkKK3sKKwlyZXR1cm4gMTArYmFyKCk7CisKK30KKworaW50CitoaWRlX29sZF9mb28xKCkKK3sKKwlyZXR1cm4gMTAwK2JhcigpOworCit9CisKK2ludAoraGlkZV9uZXdfZm9vKCkKK3sKKwlyZXR1cm4gMTAwMCtiYXIoKTsKKworfQorCitfX2FzbV9fKCIuc3ltdmVyIGhpZGVfb3JpZ2luYWxfZm9vLHNob3dfZm9vQCIpOworX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28sc2hvd19mb29AVkVSU18xLjEiKTsKK19fYXNtX18oIi5zeW12ZXIgaGlkZV9vbGRfZm9vMSxzaG93X2Zvb0BWRVJTXzEuMiIpOworX19hc21fXygiLnN5bXZlciBoaWRlX25ld19mb28sc2hvd19mb29AQFZFUlNfMi4wIik7CisKKworCisjaWZkZWYgRE9fVEVTVDEwCisvKiBJbiB0ZXN0IDEwLCB3ZSB0cnkgYW5kIGRlZmluZSBhIG5vbi1leGlzdGFudCB2ZXJzaW9uIG5vZGUuICBUaGUgbGlua2VyCisgKiBzaG91bGQgY2F0Y2ggdGhpcyBhbmQgY29tcGxhaW4uICovCitpbnQKK2hpZGVfbmV3X2JvZ3VzX2ZvbygpCit7CisJcmV0dXJuIDEwMDArYmFyKCk7CisKK30KK19fYXNtX18oIi5zeW12ZXIgaGlkZV9uZXdfYm9ndXNfZm9vLHNob3dfZm9vQFZFUlNfMi4yIik7CisjZW5kaWYKKworCisKKworI2lmZGVmIERPX1RFU1QxMQorLyoKKyAqIFRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byBjYXRjaCBhIGNvdXBsZSBvZiBzeW50YWN0aWMgZXJyb3JzLiAgVGhlIGFzc2VtYmxlcgorICogc2hvdWxkIGNvbXBsYWluIGFib3V0IGJvdGggb2YgdGhlIGRpcmVjdGl2ZXMgYmVsb3cuCisgKi8KK2ludAoreHl6enooKQoreworICBuZXcyX2ZvbygpOworICBiYXIzMygpOworfQorCitfX2FzbV9fKCIuc3ltdmVyIG5ldzJfZm9vLGZvb1ZFUlNfMi4wIik7CitfX2FzbV9fKCIuc3ltdmVyIGJhcjMzLGJhckBAVkVSU18yLjAiKTsKKyNlbmRpZgorCisjaWZkZWYgRE9fVEVTVDEyCisvKgorICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGNhdGNoIGEgY291cGxlIG9mIHN5bnRhY3RpYyBlcnJvcnMuICBUaGUgYXNzZW1ibGVyCisgKiBzaG91bGQgY29tcGxhaW4gYWJvdXQgYm90aCBvZiB0aGUgZGlyZWN0aXZlcyBiZWxvdy4KKyAqLworaW50Cit4eXp6eigpCit7CisgIG5ldzJfZm9vKCk7CisgIGJhcjMzKCk7Cit9CisKK19fYXNtX18oIi5zeW12ZXIgYmFyMzMsYmFyQEBWRVJTXzIuMCIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuZHN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ0MzRiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuZHN5bQpAQCAtMCwwICsxLDkgQEAKK1swXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCitbMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgorWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKK1swLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCitbMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbworWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KK1swLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbworWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjEKK1swLTlhLWZdKiBnICAgIERPICgucz9kYXRhfFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgc2hvd19iYXIyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMzdiYwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLm1hcApAQCAtMCwwICsxLDE2IEBACitWRVJTXzEuMSB7CisJIGdsb2JhbDoKKwkJIGZvbzE7CisJIGxvY2FsOgorCQkgaGlkZV9vbGQqOyAKKwkJIGhpZGVfb3JpZ2luYWwqOyAKKwkJIGhpZGVfbmV3KjsgCit9OworCitWRVJTXzEuMiB7CisJCSBmb28yOworfSBWRVJTXzEuMTsKKworVkVSU18yLjAgeworCQkgc2hvd19iYXIxOyBzaG93X2JhcjI7Cit9IFZFUlNfMS4yOwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEuc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmY4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5zeW0KQEAgLTAsMCArMSw0IEBACitbMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQAorWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BWRVJTXzEuMQorWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BWRVJTXzEuMgorWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0BAVkVSU18yLjAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTczMTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCkBAIC0wLDAgKzEsOCBAQAorVmVyc2lvbiBkZWZpbml0aW9uczoKKzEgMHgwMSAweDBhMjY4ODFmIHRtcGRpci92ZXJzMS5zbworMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKKzMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCisJVkVSU18xLjEgCis0IDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAorCVZFUlNfMS4yIAorCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDYxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bQpAQCAtMCwwICsxLDEwIEBACitWRVJTXzEuMSBpbiB2ZXJzMS5zbworVkVSU18xLjIgaW4gdmVyczEuc28KK1ZFUlNfMi4wIGluIHZlcnMxLnNvCitiYXIgaW4gdmVyczEuc28KK3Nob3dfYmFyMSBpbiB2ZXJzMS5zbworc2hvd19iYXIyIGluIHZlcnMxLnNvCitzaG93X2Zvb0AgaW4gdmVyczEuc28KK3Nob3dfZm9vQEBWRVJTXzIuMCBpbiB2ZXJzMS5zbworc2hvd19mb29AVkVSU18xLjEgaW4gdmVyczEuc28KK3Nob3dfZm9vQFZFUlNfMS4yIGluIHZlcnMxLnNvCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMmJlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICogVGVzdGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgaWYgd2UgZXh0ZXJuYWxseSByZWZlcmVuY2UgYSB2ZXJzaW9uZWQgc3ltYm9sCisgKiB0aGF0IHdlIGFsd2F5cyBnZXQgdGhlIHJpZ2h0IG9uZS4KKyAqLworCitpbnQKK2Zvb18xKCkKK3sKKyAgcmV0dXJuIDEwMzQ7Cit9CisKK2ludAorZm9vXzIoKQoreworICByZXR1cm4gMTM0MzsKK30KKworaW50Citmb29fMygpCit7CisgIHJldHVybiAxMzM0OworfQorCitpbnQKK21haW4oKQoreworICBwcmludGYoIkV4cGVjdCA0LCAgICBnZXQgJWRcbiIsIGZvb18xKCkpOworICBwcmludGYoIkV4cGVjdCAxMywgICBnZXQgJWRcbiIsIGZvb18yKCkpOworICBwcmludGYoIkV4cGVjdCAxMDMsICBnZXQgJWRcbiIsIGZvb18zKCkpOworICByZXR1cm4gMDsKK30KKworX19hc21fXygiLnN5bXZlciBmb29fMSxzaG93X2Zvb0AiKTsKK19fYXNtX18oIi5zeW12ZXIgZm9vXzIsc2hvd19mb29AVkVSU18xLjEiKTsKK19fYXNtX18oIi5zeW12ZXIgZm9vXzMsc2hvd19mb29AQFZFUlNfMS4yIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5kc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWUxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuZHN5bQpAQCAtMCwwICsxLDUgQEAKK1swXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCitbMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgorWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KK1swLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCitbMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmFiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltCkBAIC0wLDAgKzEsMyBAQAorWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2Zvb0AKK1swLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AVkVSU18xLjEKK1swLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29AQFZFUlNfMS4yCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJlYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgpAQCAtMCwwICsxLDUgQEAKK1ZlcnNpb24gZGVmaW5pdGlvbnM6CisxIDB4MDEgMHgwZDhhMjYwNSB0bXBkaXIvdmVyczE1CisyIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgorMyAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKKwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY4YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmMKQEAgLTAsMCArMSwxMCBAQAoraW50IHNob3dfYmFyICgpCit7CisgIHJldHVybiAwOworfQorZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKKworaW50IG1haW4gKCkKK3sKKyAgcmV0dXJuIHNob3dfZm9vICgpOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQyNGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0KQEAgLTAsMCArMSwyIEBACitbMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiggIEJhc2UgICAgICAgKT8gKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfYmFyCitbMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiggICAgICAgICAgICAgKT8gKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYzMzJmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcApAQCAtMCwwICsxLDMgQEAKK1ZFUlNfMS4xIHsKKyAgZ2xvYmFsOiBzaG93X2JhcjsKK307CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYjFmZAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYwpAQCAtMCwwICsxLDggQEAKK2ludCBzaG93X2JhciAoKQoreworICByZXR1cm4gMTsKK30KK2ludCBzaG93X2ZvbyAoKQoreworICByZXR1cm4gc2hvd19iYXIgKCk7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4ZGY0NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuZHN5bQpAQCAtMCwwICsxLDMgQEAKK1swLTlhLWZdKiBnICAgIERPIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzFcLjEgICAgVkVSU18xXC4xCitbMC05YS1mXSogZyAgICBERiAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xXC4xICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JhcgorWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIEJhc2UgICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NmMWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKQEAgLTAsMCArMSwzIEBACitWZXJzaW9uIGRlZmluaXRpb25zOgorMSAweDAxIDB4MDYwMWNmYmYgdG1wZGlyL3ZlcnMxNmEuc28KKzIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE1MzdlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIuYwpAQCAtMCwwICsxLDEwIEBACisvKgorICogVGVzdCBmdW5jdGlvbi4gIFRoaXMgaXMgYnVpbHQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgcmVmZXJlbmNlcyBhCisgKiB2ZXJzaW9uZWQgc3ltYm9sIGZvbyB0aGF0IGlzIGluIHRlc3Quc28uCisgKi8KKwordm9pZAorc2hvd194eXp6eSgpCit7CisgIHByaW50ZigiJWQiLCBzaG93X2ZvbygpKTsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5kc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTg1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5kc3ltCkBAIC0wLDAgKzEsMyBAQAorWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbworWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU19YWFhfMS4xIFZFUlNfWFhYXzEuMQorWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU19YWFhfMS4xICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X3h5enp5CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1N2Q3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLm1hcApAQCAtMCwwICsxLDQgQEAKKworVkVSU19YWFhfMS4xIHsKKwkJIHNob3dfeHl6enk7Cit9OwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIudmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjYzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIKQEAgLTAsMCArMSw4IEBACitWZXJzaW9uIGRlZmluaXRpb25zOgorMSAweDAxIDB4MGEyNjE4MWYgdG1wZGlyL3ZlcnMyLnNvCisyIDB4MDAgMHgwODc4NWI1MSBWRVJTX1hYWF8xLjEKKworVmVyc2lvbiBSZWZlcmVuY2VzOgorICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKKyAgICAweDBhNzkyMmIwIDB4MDAgMDMgVkVSU18yLjAKKwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwNmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmMKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIE1haW4gcHJvZ3JhbSBmb3IgdGVzdDEsIHRlc3QyLgorICovCisKK2ludAorbWFpbigpCit7CisgIHByaW50ZigiJWRcbiIsIHNob3dfZm9vKCkpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzI2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltCkBAIC0wLDAgKzEgQEAKK1swLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTIzMGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyCkBAIC0wLDAgKzEsNCBAQAorVmVyc2lvbiBSZWZlcmVuY2VzOgorICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKKyAgICAweDBhNzkyMmIwIDB4MDAgMDIgVkVSU18yLjAKKwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0OTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGEgdmVyc2lvbmVkIHN5bWJvbCBkZWZpbml0aW9uIGluIGFuCisgKiBhcHBsaWNhdGlvbiBjb3JyZWN0bHkgZGVmaW5lcyB0aGUgdmVyc2lvbiBub2RlLCBpZiBhbmQgb25seSBpZgorICogdGhlIGFjdHVhbCBzeW1ib2wgaXMgZXhwb3J0ZWQuICBUaGlzIGlzIGJ1aWx0IGJvdGggd2l0aCBhbmQgd2l0aG91dAorICogLWV4cG9ydC1keW5hbWljLgorICovCitpbnQKK2JhcigpCit7CisJcmV0dXJuIDM7Cit9CisKK2ludAorbmV3X2ZvbygpCit7CisJcmV0dXJuIDEwMDArYmFyKCk7CisKK30KKworX19hc21fXygiLnN5bXZlciBuZXdfZm9vLGZvb0BAVkVSU18yLjAiKTsKKworaW50CittYWluKCkKK3sKKyAgcHJpbnRmKCIlZFxuIiwgZm9vKCkpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LnN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ5NDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuc3ltCkBAIC0wLDAgKzEgQEAKK1swLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuZHN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Y5ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLmRzeW0KQEAgLTAsMCArMSwyIEBACitbMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAorWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5zeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0OTQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5zeW0KQEAgLTAsMCArMSBAQAorWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZjZWRjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgpAQCAtMCwwICsxLDQgQEAKK1ZlcnNpb24gZGVmaW5pdGlvbnM6CisxIDB4MDEgMHgwZDhhMjZlMSB0bXBkaXIvdmVyczRhCisyIDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAorCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNS5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZlYTQwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczUuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYXJlIGNvcnJlY3RseSBkZXRlY3RlZAorICogYXMgYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KKyAqLworY29uc3QgY2hhciAqIGJhcjEgPSAiYXNkZiI7Citjb25zdCBjaGFyICogYmFyMiA9ICJhc2RmIjsKKworaW50CitiYXIoKQoreworCXJldHVybiAzOworfQorCitpbnQKK29yaWdpbmFsX2ZvbygpCit7CisJcmV0dXJuIDErYmFyKCk7CisKK30KKworaW50CitvbGRfZm9vKCkKK3sKKwlyZXR1cm4gMTArYmFyKCk7CisKK30KKworaW50CitvbGRfZm9vMSgpCit7CisJcmV0dXJuIDEwMCtiYXIoKTsKKworfQorCitpbnQKK25ld19mb28oKQoreworCXJldHVybiAxMDAwK2JhcigpOworCit9CisKK19fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKK19fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKK19fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7CitfX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOworCitpbnQKK21haW4gKCkKK3sKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTg2OGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogVGVzdGNhc2UgdG8gbWFrZSBzdXJlIHRoYXQgaWYgd2UgZXh0ZXJuYWxseSByZWZlcmVuY2UgYSB2ZXJzaW9uZWQgc3ltYm9sCisgKiB0aGF0IHdlIGFsd2F5cyBnZXQgdGhlIHJpZ2h0IG9uZS4KKyAqLworCitpbnQKK21haW4oKQoreworICBwcmludGYoIkV4cGVjdCA0LCAgICBnZXQgJWRcbiIsIGZvb18xKCkpOworICBwcmludGYoIkV4cGVjdCAxMywgICBnZXQgJWRcbiIsIGZvb18yKCkpOworICBwcmludGYoIkV4cGVjdCAxMDMsICBnZXQgJWRcbiIsIGZvb18zKCkpOworICBwcmludGYoIkV4cGVjdCAxMDAzLCBnZXQgJWRcbiIsIGZvb180KCkpOworICByZXR1cm4gMDsKK30KKworX19hc21fXygiLnN5bXZlciBmb29fMSxzaG93X2Zvb0AiKTsKK19fYXNtX18oIi5zeW12ZXIgZm9vXzIsc2hvd19mb29AVkVSU18xLjEiKTsKK19fYXNtX18oIi5zeW12ZXIgZm9vXzMsc2hvd19mb29AVkVSU18xLjIiKTsKK19fYXNtX18oIi5zeW12ZXIgZm9vXzQsc2hvd19mb29AVkVSU18yLjAiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODUxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltCkBAIC0wLDAgKzEsNCBAQAorWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogICAgICAgICAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbworWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbworWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMS4yICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbworWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMS4xICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjVjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0KQEAgLTAsMCArMSw0IEBACitbMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQAorWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMQorWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMgorWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTJiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi52ZXIKQEAgLTAsMCArMSw2IEBACitWZXJzaW9uIFJlZmVyZW5jZXM6CisgIHJlcXVpcmVkIGZyb20gdG1wZGlyL3ZlcnMxLnNvOgorICAgIDB4MGE3OTI3YjEgMHgwMCA/PyBWRVJTXzEuMQorICAgIDB4MGE3OTI3YjIgMHgwMCA/PyBWRVJTXzEuMgorICAgIDB4MGE3OTIyYjAgMHgwMCA/PyBWRVJTXzIuMAorCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNy5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjViN2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogVGVzdCBwcm9ncmFtIHRoYXQgZ29lcyB3aXRoIHRlc3Q3LnNvCisgKi8KKworCitpbnQKK21haW4oKQoreworICByZXR1cm4gaGlkZV9hKDEpICsgc2hvd19iKDEpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3Lm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZkNTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCkBAIC0wLDAgKzEsNiBAQAorVkVSU18xIHsKKwlnbG9iYWw6CisJCXNob3dfYiA7CisJbG9jYWw6CisJCWhpZGVfYTsKK307CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZWU4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogVGVzdCBzdXBwbGllZCBieSBVbHJpY2guICBWZXJpZnkgdGhhdCB3ZSBjYW4gY29ycmVjdGx5IGZvcmNlICdhJworICogdG8gbG9jYWwgc2NvcGUuCisgKi8KK2ludAorX19hX2ludGVybmFsIChpbnQgZSkKK3sKKyAgcmV0dXJuIGUgKyAxMDsKK30KKworaW50CitfX2JfaW50ZXJuYWwgKGludCBlKQoreworICByZXR1cm4gZSArIDQyOworfQorCithc20gKCIuc3ltdmVyIF9fYV9pbnRlcm5hbCxoaWRlX2FAQFZFUlNfMSIpOworYXNtICgiLnN5bXZlciBfX2JfaW50ZXJuYWwsc2hvd19iQEBWRVJTXzEiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLmRzeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2OTZjNwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCkBAIC0wLDAgKzEsMiBAQAorWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18xICAgICAgVkVSU18xCitbMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2Euc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTliZDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczdhLnN5bQpAQCAtMCwwICsxLDIgQEAKK1swLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/aGlkZV9hQEBWRVJTXzEKK1swLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iQEBWRVJTXzEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EudmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWY4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EudmVyCkBAIC0wLDAgKzEsNCBAQAorVmVyc2lvbiBkZWZpbml0aW9uczoKKzEgMHgwMSAweDAyNjlmZDNmIHRtcGRpci92ZXJzN2Euc28KKzIgMHgwMCAweDA1YWE3OTIxIFZFUlNfMQorCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ1ODZjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYwpAQCAtMCwwICsxLDUgQEAKK2ludAorbWFpbigpCit7CisgIHJldHVybiBhKDEpICsgYigxKTsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4Lm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM1OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCkBAIC0wLDAgKzEsMTggQEAKK1ZFUlNJT04geworCVZFUlNfMS4xIHsKKwkJIGdsb2JhbDoKKwkJCSBmb28xOworCQkgbG9jYWw6CisJCQkgaGlkZV9vbGQqOyAKKwkJCSBoaWRlX29yaWdpbmFsKjsgCisJCQkgaGlkZV9uZXcqOyAKKwl9OworCQorCVZFUlNfMS4yIHsKKwkJCSBmb28yOworCX0gVkVSU18xLjE7CisJCisJVkVSU18yLjAgeworCQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOworCX0gVkVSU18xLjI7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1OTAyMwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LnZlcgpAQCAtMCwwICsxLDggQEAKK1ZlcnNpb24gZGVmaW5pdGlvbnM6CisxIDB4MDEgMHgwYTI2ZjgxZiB0bXBkaXIvdmVyczguc28KKzIgMHgwMCAweDBhNzkyN2IxIFZFUlNfMS4xCiszIDB4MDAgMHgwYTc5MjdiMiBWRVJTXzEuMgorCVZFUlNfMS4xIAorNCAweDAwIDB4MGE3OTIyYjAgVkVSU18yLjAKKwlWRVJTXzEuMiAKKwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyZmRkYgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFRlc3RjYXNlIHRvIHZlcmlmeSB0aGF0IHJlZmVyZW5jZSB0byBmb29AQkFSIGFuZCBhIGRlZmluaXRpb24gb2YgZm9vQEBCQVIKKyAqIGFyZSBub3QgdHJlYXRlZCBhcyBhIG11bHRpcGxlIGRlZi4KKyAqLworY29uc3QgY2hhciAqIGJhcjEgPSAiYXNkZiI7Citjb25zdCBjaGFyICogYmFyMiA9ICJhc2RmIjsKKworaW50CitiYXIoKQoreworCXJldHVybiAzOworfQorCitpbnQKK29yaWdpbmFsX2ZvbygpCit7CisJcmV0dXJuIDErYmFyKCk7CisKK30KKworaW50CitvbGRfZm9vKCkKK3sKKwlyZXR1cm4gMTArYmFyKCk7CisKK30KKworaW50CituZXdfZm9vKCkKK3sKKwlyZXR1cm4gMTAwMCtiYXIoKTsKKworfQorCitpbnQKK21haW4oKQoreworICBvbGRfZm9vMSgpOworICByZXR1cm4gMDsKK30KKworX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQCIpOworX19hc21fXygiLnN5bXZlciBvbGRfZm9vLGZvb0BWRVJTXzEuMSIpOworX19hc21fXygiLnN5bXZlciBvbGRfZm9vMSxmb29AVkVSU18xLjIiKTsKK19fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMS4yIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzkzMDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuZHN5bQpAQCAtMCwwICsxLDQgQEAKK1swXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCitbMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgorWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4xXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCitbMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzMTUxNgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnN5bQpAQCAtMCwwICsxLDQgQEAKK1swXSogKkY/ICpcKlVORFwqCVswXSogZm9vQFZFUlNfMS4yCitbMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0AKK1swLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQFZFUlNfMS4xCitbMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BAVkVSU18xLjIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNiYTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkudmVyCkBAIC0wLDAgKzEsNSBAQAorVmVyc2lvbiBkZWZpbml0aW9uczoKKzEgMHgwMSAweDA0ZDhhMjY5IHRtcGRpci92ZXJzOQorMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKKzMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCisKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9lbXBpYy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTI4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvZW1waWMuZXhwCkBAIC0wLDAgKzEsMjYzIEBACisjIEV4cGVjdCBzY3JpcHQgZm9yIGxkLWVtcGljIHRlc3RzCisjICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKKyMKKworIyBUZXN0IHRoZSBoYW5kbGluZyBvZiBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLiAgVGhpcyB0ZXN0IGVzc2VudGlhbGx5CisjIHRlc3RzIHRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlciwgc2luY2UgTUlQUworIyBlbWJlZGRlZCBQSUMgaXMgYSBHTlUgZW5oYW5jZW1lbnQgdG8gc3RhbmRhcmQgTUlQUyB0b29scy4KKworIyBFbWJlZGRlZCBQSUMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIE1JUFMgRUNPRkYgdGFyZ2V0cy4KK2lmICFbaXN0YXJnZXQgbWlwcyotKi1lY29mZipdIHsKKyAgICByZXR1cm4KK30KKworc2V0IHRlc3RuYW1lIHJlbGF4CisKK2lmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKKyAgICB1bnRlc3RlZCAkdGVzdG5hbWUKKyAgICByZXR1cm4KK30KKworIyBUZXN0IHRoYXQgcmVsYXhhdGlvbiB3b3JrcyBjb3JyZWN0bHkuICBUaGlzIHRlc3RzdWl0ZSB3YXMgY29tcG9zZWQKKyMgKGJ5IGV4cGVyaW1lbnRhdGlvbikgdG8gZm9yY2UgdGhlIGxpbmtlciB0byByZWxheCB0d2ljZS0tdGhhdCBpcywKKyMgdGhlIGZpcnN0IHJlbGF4YXRpb24gcGFzcyB3aWxsIGZvcmNlIGFub3RoZXIgY2FsbCB0byBiZSBvdXQgb2YKKyMgcmFuZ2UsIHJlcXVpcmluZyBhIHNlY29uZCByZWxheGF0aW9uIHBhc3MuCitpZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDEuYyB0bXBkaXIvcmVsYXgxLm9dCisgICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDIuYyB0bXBkaXIvcmVsYXgyLm9dCisgICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDMuYyB0bXBkaXIvcmVsYXgzLm9dCisgICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDQuYyB0bXBkaXIvcmVsYXg0Lm9dIH0geworICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCisgICAgcmV0dXJuCit9CisKK2lmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9yZWxheCAiLS1yZWxheCAtVCAkc3JjZGlyLyRzdWJkaXIvcmVsYXgudCB0bXBkaXIvcmVsYXgxLm8gdG1wZGlyL3JlbGF4Mi5vIHRtcGRpci9yZWxheDMubyB0bXBkaXIvcmVsYXg0Lm8iXSB7CisgICAgZmFpbCAkdGVzdG5hbWUKK30gZWxzZSB7CisgICAgIyBDaGVjayB0aGF0IHRoZSByZWxheGF0aW9uIHByb2R1Y2VkIHRoZSBjb3JyZWN0IHJlc3VsdC4gIENoZWNrCisgICAgIyBlYWNoIGJhbCBpbnN0cnVjdGlvbi4gIFNvbWUgd2lsbCBnbyBkaXJlY3RseSB0byB0aGUgc3RhcnQgb2YgYQorICAgICMgZnVuY3Rpb24sIHdoaWNoIGlzIE9LLiAgU29tZSB3aWxsIGZvcm0gcGFydCBvZiB0aGUgZml2ZQorICAgICMgaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgY2FsbCBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSB3ZSBjb21wdXRlIHRoZQorICAgICMgcmVhbCBkZXN0aW5hdGlvbiBhbmQgbWFrZSBzdXJlIGl0IGlzIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLgorICAgICMgU29tZSBiYWwgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHRvIGxvY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCisgICAgIyBmdW5jdGlvbiBpbiBvcmRlciB0byBkbyBwb3NpdGlvbiBpbmRlcGVuZGVudCBhZGRyZXNzaW5nIGludG8gdGhlCisgICAgIyB0ZXh0IHNlY3Rpb24sIGluIHdoaWNoIGNhc2Ugd2UganVzdCBjaGVjayB0aGF0IGl0IGNvcnJlY3RseQorICAgICMgY29tcHV0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKworICAgICMgR2V0IHRoZSBzeW1ib2wgdGFibGUuCisgICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3JlbGF4XSB7CisJdW5yZXNvbHZlZCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisKKyAgICAjIEdldCBhIGRpc2Fzc2VtYmx5LgorICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXNcbiIKKyAgICB2ZXJib3NlICIkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXMiCisgICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLWQgdG1wZGlyL3JlbGF4ID50bXBkaXIvcmVsYXguZGlzIiBleGVjX291dHB1dAorICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0geworCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwl2ZXJib3NlICRleGVjX291dHB1dAorCXVucmVzb2x2ZWQgJHRlc3RuYW1lCisJcmV0dXJuCisgICAgfQorCisgICAgc2V0IGJhbGNudCAwCisgICAgc2V0IGZpbGUgW29wZW4gdG1wZGlyL3JlbGF4LmRpcyByXQorICAgIHdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7CisJdmVyYm9zZSAiJGxpbmUiIDIKKworCWlmICFbc3RyaW5nIG1hdGNoICIqYmFsKiIgJGxpbmVdIHsKKwkgICAgY29udGludWUKKwl9CisKKwl2ZXJib3NlICIkbGluZSIKKworCWluY3IgYmFsY250CisKKwlpZiAhW3JlZ2V4cCAiXihcWzAtOWEtZkEtRlxdKykgKDxcW2EteiswLTlBLVouXF0rPik/IGJhbCAoXFswLTlhLWZBLUZcXSspIiAkbGluZSB3aG9sZSBhZGRyIGxhYmVsIGRlc3RdIHsKKwkgICAgcGVycm9yICJ1bnJlY29nbml6ZWQgZm9ybWF0IGZvciAkbGluZSIKKwkgICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKKwkgICAgcmV0dXJuCisJfQorCisJaWYgIjB4JGFkZHIgKyA4ICE9IDB4JGRlc3QiIHsKKwkgICAgIyBUaGlzIGlzIGEgc3RyYWlnaHQgZnVuY3Rpb24gY2FsbC4gIEFsbCBmdW5jdGlvbiBjYWxscyBpbgorCSAgICAjIHRoaXMgZXhhbXBsZSBhcmUgdG8gZWl0aGVyIGZvbyBvciBiYXIuCisJICAgIGlmICIweCRkZXN0ICE9ICRubV9vdXRwdXQoZm9vKSAmJiAweCRkZXN0ICE9ICRubV9vdXRwdXQoYmFyKSIgeworCQlzZW5kX2xvZyAiZmFpbCAxXG4iCisJCXNlbmRfbG9nICIkbGluZVxuIgorCQlmYWlsICR0ZXN0bmFtZQorCQlyZXR1cm4KKwkgICAgfQorCX0gZWxzZSB7CisJICAgICMgUGljayB1cCB0aGUgbmV4dCBsaW5lLiAgSWYgaXQgaXMgc2xsLCB0aGlzIGlzIGEgc3dpdGNoCisJICAgICMgcHJvbG9ndWUsIGFuZCB0aGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gdG8gdGVzdCBpdC4KKwkgICAgIyBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBsdWksIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbgorCSAgICAjIHNob3VsZCBiZSBhbiBhZGRpdSwgZm9sbG93ZWQgYnkgYW4gYWRkdSB0byAkMzEuCisJICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7CisJCXNlbmRfbG9nICJmYWlsIDJcbiIKKwkJc2VuZF9sb2cgIiRsaW5lXG4iCisJCWZhaWwgJHRlc3RuYW1lCisJCXJldHVybgorCSAgICB9CisJICAgIHZlcmJvc2UgJGwKKworCSAgICBpZiBbc3RyaW5nIG1hdGNoICIqc2xsKiIgJGxdIHsKKwkJY29udGludWUKKwkgICAgfQorCSAgICBpZiAhW3JlZ2V4cCAibHVpIChcW1wkYS16MC05XF0rKSwoXFswLTlhLWZBLUZ4XF0rKSIgJGwgd2hvbGUgcmVnIHVwcGVyXSB7CisJCXNlbmRfbG9nICJmYWlsIDNcbiIKKwkJc2VuZF9sb2cgIiRsaW5lXG4iCisJCXNlbmRfbG9nICIkbFxuIgorCQlmYWlsICR0ZXN0bmFtZQorCQlyZXR1cm4KKwkgICAgfQorCisJICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7CisJCXNlbmRfbG9nICJmYWlsIDRcbiIKKwkJc2VuZF9sb2cgIiRsaW5lXG4iCisJCWZhaWwgJHRlc3RuYW1lCisJCXJldHVybgorCSAgICB9CisJICAgIHZlcmJvc2UgIiRsIgorCSAgICBpZiAhW3JlZ2V4cCAiYWRkaXUgXFwkcmVnLFxcJHJlZywoXFstMC05XF0rKSIgJGwgd2hvbGUgbG93ZXJdIHsKKwkJc2VuZF9sb2cgImZhaWwgNVxuIgorCQlzZW5kX2xvZyAiJGxpbmVcbiIKKwkJc2VuZF9sb2cgIiRsXG4iCisJCXNlbmRfbG9nICJhZGRpdSBcXCRyZWcsXFwkcmVnLChcWy0wLTlcXSspXG4iCisJCWZhaWwgJHRlc3RuYW1lCisJCXJldHVybgorCSAgICB9CisKKwkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKKwkJc2VuZF9sb2cgImZhaWwgNlxuIgorCQlzZW5kX2xvZyAiJGxpbmVcbiIKKwkJZmFpbCAkdGVzdG5hbWUKKwkJcmV0dXJuCisJICAgIH0KKwkgICAgdmVyYm9zZSAiJGwiCisJICAgIGlmICFbcmVnZXhwICJhZGR1IFxcJHJlZyxcXCRyZWcsXFxcJHJhIiAkbF0geworCQlzZW5kX2xvZyAiZmFpbCA3XG4iCisJCXNlbmRfbG9nICIkbGluZVxuIgorCQlzZW5kX2xvZyAiJGxcbiIKKwkJZmFpbCAkdGVzdG5hbWUKKwkJcmV0dXJuCisJICAgIH0KKworCSAgICAjIFRoZSBuZXh0IGxpbmUgd2lsbCBiZSBqYWxyIGluIHRoZSBjYXNlIG9mIGFuIGV4cGFuZGVkCisJICAgICMgY2FsbC4gIE90aGVyd2lzZSwgdGhlIGNvZGUgaXMgZ2V0dGluZyB0aGUgc3RhcnQgb2YgdGhlCisJICAgICMgZnVuY3Rpb24sIGFuZCB0aGUgbmV4dCBsaW5lIGNhbiBiZSBhbnl0aGluZy4KKworCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0geworCQlzZW5kX2xvZyAiZmFpbCA4XG4iCisJCXNlbmRfbG9nICIkbGluZVxuIgorCQlmYWlsICR0ZXN0bmFtZQorCQlyZXR1cm4KKwkgICAgfQorCSAgICB2ZXJib3NlICIkbCIJCisJICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipqYWxyKiIgJGxdIHsKKwkJc2V0IGRlc3QgW2V4cHIgMHgkYWRkciArIDggKyAoJHVwcGVyIDw8IDE2KSArICRsb3dlcl0KKwkJaWYgeyAkZGVzdCAhPSAkbm1fb3V0cHV0KGZvbykgJiYgJGRlc3QgIT0gJG5tX291dHB1dChiYXIpIH0geworCQkgICAgc2VuZF9sb2cgImZhaWwgOVxuIgorCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCisJCSAgICBmYWlsICR0ZXN0bmFtZQorCQkgICAgcmV0dXJuCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJc2V0IGRlc3QgW2V4cHIgKCR1cHBlciA8PCAxNikgKyAkbG93ZXJdCisJCWlmICFbcmVnZXhwICI8KFxbLmEtelxdKylcXCsoXFswLTlhLWZBLUZcXSspPiIgJGxhYmVsIHdob2xlIGJhc2Ugb2Zmc2V0XSB7CisJCSAgICBzZW5kX2xvZyAiZmFpbCAxMFxuIgorCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCisJCSAgICBmYWlsICR0ZXN0bmFtZQorCQkgICAgcmV0dXJuCisJCX0KKwkJc2V0IG9mZnNldCAweCRvZmZzZXQKKwkJaWYgeyAkYmFzZSA9PSAiLmZvbyIgfSB7CisJCSAgICBzZXQgb2Zmc2V0IFtleHByICRvZmZzZXQgLSAoJG5tX291dHB1dChmb28pIC0gMHgzMCldCisJCX0KKwkJaWYgeyAkb2Zmc2V0ICsgOCAhPSAtICRkZXN0IH0geworCQkgICAgc2VuZF9sb2cgImZhaWwgMTFcbiIKKwkJICAgIHNlbmRfbG9nICIkbGluZVxuIgorCQkgICAgZmFpbCAkdGVzdG5hbWUKKwkJICAgIHJldHVybgorCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgY2xvc2UgJGZpbGUKKworICAgIGlmIHskYmFsY250IDwgMTB9IHsKKwlzZW5kX2xvZyAiZmFpbCAxMlxuIgorCWZhaWwgJHRlc3RuYW1lCisgICAgfSBlbHNlIHsKKwl2ZXJib3NlICIkYmFsY250IGJhbCBpbnN0cnVjdGlvbnMiCisJcGFzcyAkdGVzdG5hbWUKKyAgICB9Cit9CisKKyMgV2Ugbm93IHRlc3QgYWN0dWFsbHkgcnVubmluZyBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlLiAgVGhpcyBjYW4gb25seQorIyBiZSBkb25lIG9uIGEgTUlQUyBob3N0IHdpdGggdGhlIHNhbWUgZW5kaWFubmVzcyBhcyBvdXIgdGFyZ2V0LgoraWYgW2lzdGFyZ2V0IG1pcHNlbC0qLSpdIHsKKyAgICBpZiAhW2lzaG9zdCBtaXBzKi0qLXVsdHJpeCpdIHsKKwlyZXR1cm4KKyAgICB9Cit9IGVsc2UgeworICAgIGlmICFbaXNob3N0IG1pcHMqLSotaXJpeCpdIHsKKwlyZXR1cm4KKyAgICB9Cit9CisKK3NldCB0ZXN0bmFtZSAicnVuIGVtYmVkZGVkIFBJQyBjb2RlIgorCisjIENvbXBpbGUgdGhlIHByb2dyYW0gd2hpY2ggd2lsbCBydW4gdGhlIHRlc3QuICBUaGlzIGNvZGUgbXVzdCBiZQorIyBjb21waWxlZCBmb3IgdGhlIGhvc3QsIG5vdCB0aGUgdGFyZ2V0Lgorc2VuZF9sb2cgIiRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jXG4iCit2ZXJib3NlICIkQ0NfRk9SX0hPU1QgJENGTEFHU19GT1JfSE9TVCAtbyB0bXBkaXIvcnVuICRzcmNkaXIvJHN1YmRpci9ydW4uYyIKK2NhdGNoICJleGVjICRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jIiBleGVjX291dHB1dAoraWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIKKyAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCisjIENvbXBpbGUgYW5kIGxpbmsgdGhlIHRlc3QuCitpZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0aS5zIHRtcGRpci9ydW50ZXN0aS5vXQorICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdDEuYyB0bXBkaXIvcnVudGVzdDEub10KKyAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3QyLmMgdG1wZGlyL3J1bnRlc3QyLm9dIH0geworICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCisgICAgcmV0dXJuCit9CitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvcnVudGVzdCAiLS1lbWJlZGRlZC1yZWxvY3MgdG1wZGlyL3J1bnRlc3RpLm8gdG1wZGlyL3J1bnRlc3QxLm8gdG1wZGlyL3J1bnRlc3QyLm8iXSB7CisgICAgZmFpbCAkdGVzdG5hbWUKK30gZWxzZSB7CisgICAgIyBOb3cgcnVuIHRoZSB0ZXN0LgorICAgIHNlbmRfbG9nICJ0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0XG4iCisgICAgdmVyYm9zZSAidG1wZGlyL3J1biB0bXBkaXIvcnVudGVzdCIKKyAgICBjYXRjaCAiZXhlYyB0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0IiBleGVjX291dHB1dAorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipyYW4gYW5kIHJldHVybmVkIDAqIiAkZXhlY19vdXRwdXRdIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgorCXBhc3MgJHRlc3RuYW1lCisgICAgfSBlbHNlIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgorCWZhaWwgJHRlc3RuYW1lCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4LnQgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE4YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4LnQKQEAgLTAsMCArMSw0OSBAQAorT1VUUFVUX0ZPUk1BVCgiZWNvZmYtYmlnbWlwcyIpCitTRUNUSU9OUworeworICAuZm9vIDB4MzAgOiB7CisgICAgdG1wZGlyL3JlbGF4My5vKC50ZXh0KQorICAgIHRtcGRpci9yZWxheDEubygudGV4dCkKKyAgfQorICAudGV4dCAgMHgyMDAwMCA6IHsKKyAgICAgX2Z0ZXh0ID0gLiA7CisgICAgKiguaW5pdCkKKyAgICAgZXByb2wgID0gIC47CisgICAgdG1wZGlyL3JlbGF4NC5vKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZmluaSkKKyAgICAgZXRleHQgID0gIC47CisgICAgIF9ldGV4dCAgPSAgLjsKKyAgfQorICAucmRhdGEgIC4gOiB7CisgICAgKigucmRhdGEpCisgIH0KKyAgIF9mZGF0YSA9IC47CisgIC5kYXRhICAuIDogeworICAgICooLmRhdGEpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgIF9ncCA9IC4gKyAweDgwMDA7CisgIC5saXQ4ICAuIDogeworICAgICooLmxpdDgpCisgIH0KKyAgLmxpdDQgIC4gOiB7CisgICAgKigubGl0NCkKKyAgfQorICAuc2RhdGEgIC4gOiB7CisgICAgKiguc2RhdGEpCisgIH0KKyAgIGVkYXRhICA9ICAuOworICAgX2VkYXRhICA9ICAuOworICAgX2Zic3MgPSAuOworICAuc2JzcyAgLiA6IHsKKyAgICAqKC5zYnNzKQorICAgICooLnNjb21tb24pCisgIH0KKyAgLmJzcyAgLiA6IHsKKyAgICAqKC5ic3MpCisgICAgKihDT01NT04pCisgIH0KKyAgIGVuZCA9IC47CisgICBfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGVjMzllCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4MS5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIEZpcnN0IHNvdXJjZSBmaWxlIGluIHJlbGF4YXRpb24gdGVzdC4gICovCisKK2V4dGVybiBpbnQgYmFyICgpOworc3RhdGljIGludCBmb28yICgpOworCitpbnQgZm9vIChpbnQgaSkKK3sKKyAgc3dpdGNoIChpKQorICAgIHsKKyAgICBjYXNlIDA6IGJhciAoMCk7IGJyZWFrOworICAgIGNhc2UgMTogYmFyICgxKTsgYnJlYWs7CisgICAgY2FzZSAyOiBiYXIgKDIpOyBicmVhazsKKyAgICBjYXNlIDM6IGJhciAoMyk7IGJyZWFrOworICAgIGNhc2UgNDogYmFyIChmb28yKTsgYnJlYWs7CisgICAgY2FzZSA1OiBiYXIgKGJhcik7IGJyZWFrOworICAgIH0KKyAgd2hpbGUgKDEpCisgICAgaWYgKGkpCisgICAgICByZXR1cm4gYmFyICgpOworfQorCitzdGF0aWMgaW50IGZvbzIgKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NTRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYwpAQCAtMCwwICsxLDE5IEBACisvKiBTZWNvbmQgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KKworaW50IGJhcjIgKCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIGZvbyAoKTsKKyAgcmV0dXJuIGZvbyAoKSArIGZvbyAoKSArIGZvbyAoKSArIGZvbyAoKTsKK30KKworaW50IGJhciAoaW50IGkpCit7CisgIHdoaWxlICgxKQorICAgIGlmIChpKQorICAgICAgcmV0dXJuIGZvbyAoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZm9vICgpOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWE1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgzLmMKQEAgLTAsMCArMSwzIEBACisvKiBUaGlyZCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLworCitpbnQgcXV1eCAoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjZmIwNQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYwpAQCAtMCwwICsxLDMgQEAKKy8qIEZvdXJ0aCBzb3VyY2UgZmlsZSBpbiByZWxheGF0aW9uIHRlc3QuICAqLworCitpbnQgeHl6enkgKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDM3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIExvYWQgYW5kIHJ1biBhIE1JUFMgcG9zaXRpb24gaW5kZXBlbmRlbnQgRUNPRkYgZmlsZS4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+CisgICBQdWJsaWMgZG9tYWluLiAgKi8KKworLyogVGhpcyBwcm9ncmFtIHdpbGwgbG9hZCBhbiBFQ09GRiBmaWxlIGludG8gbWVtb3J5IGFuZCBleGVjdXRlIGl0LgorICAgVGhlIGZpbGUgbXVzdCBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgdGhlIEdOVSAtbWVtYmVkZGVkLXBpYworICAgc3dpdGNoIHRvIHByb2R1Y2UgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gIFRoaXMgd2lsbCBvbmx5IHdvcmsKKyAgIGlmIHRoaXMgcHJvZ3JhbSBpcyBydW4gb24gYSBNSVBTIHN5c3RlbSB3aXRoIHRoZSBzYW1lIGVuZGlhbm5lc3MgYXMKKyAgIHRoZSBFQ09GRiBmaWxlLiAgVGhlIEVDT0ZGIGZpbGUgbXVzdCBiZSBjb21wbGV0ZS4gIFN5c3RlbSBjYWxscyBtYXkKKyAgIG5vdCB3b3JrIGNvcnJlY3RseS4KKworICAgVGhlcmUgYXJlIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBmaWxlICh0aGV5IGNvdWxkIGJlIHJlbW92ZWQKKyAgIGJ5IGRvaW5nIHNvbWUgYWRkaXRpb25hbCBwcm9ncmFtbWluZykuICBUaGUgZmlsZSBtdXN0IGJlIGFsaWduZWQKKyAgIHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBnYXBzIGludHJvZHVjZWQgaW4gdGhlIGRhdGEKKyAgIHNlZ21lbnQ7IHRoZSBHTlUgbGlua2VyIHByb2R1Y2VzIHN1Y2ggZmlsZXMgYnkgZGVmYXVsdC4gIEhvd2V2ZXIsCisgICB0aGUgZmlsZSBtdXN0IG5vdCBhc3N1bWUgdGhhdCB0aGUgdGV4dCBvciBkYXRhIHNlZ21lbnQgaXMgYWxpZ25lZAorICAgb24gYSBwYWdlIGJvdW5kYXJ5LiAgVGhlIHN0YXJ0IGFkZHJlc3MgbXVzdCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICB0ZXh0IHNlZ21lbnQuCisKKyAgIFRoZSBFQ09GRiBmaWxlIGlzIHJ1biBieSBjYWxsaW5nIGl0IGFzIHRob3VnaCBpdCB3ZXJlIGEgZnVuY3Rpb24uCisgICBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGlzIHBhc3NlZCBhcyB0aGUgb25seSBhcmd1bWVudC4KKyAgIFRoZSBmaWxlIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLCB3aGljaCB3aWxsIGJlCisgICBwcmludGVkLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworLyogU3RydWN0dXJlcyB1c2VkIGluIEVDT0ZGIGZpbGVzLiAgV2UgYXNzdW1lIHRoYXQgYSBzaG9ydCBpcyB0d28KKyAgIGJ5dGVzIGFuZCBhbiBpbnQgaXMgZm91ciBieXRlcy4gIFRoaXMgaXMgbm90IG11Y2ggb2YgYW4gYXNzdW1wdGlvbiwKKyAgIHNpbmNlIHdlIGFscmVhZHkgYXNzdW1lIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24gYSBNSVBTIGhvc3Qgd2l0aCB0aGUKKyAgIHNhbWUgZW5kaWFubmVzcyBhcyB0aGUgZmlsZSB3ZSBhcmUgZXhhbWluaW5nLiAgKi8KKworc3RydWN0IGVjb2ZmX2ZpbGVoZHIgeworICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIHNob3J0IGZfbnNjbnM7CS8qIG51bWJlciBvZiBzZWN0aW9ucyAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgaW50IGZfdGltZGF0OwkvKiB0aW1lICYgZGF0ZSBzdGFtcCAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCBmX3N5bXB0cjsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYiAgICAgICAqLworICB1bnNpZ25lZCBpbnQgZl9uc3ltczsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KKyAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpICAgICAgICAgKi8KKyAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsJLyogZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGVjb2ZmX2FvdXRoZHIKK3sKKyAgdW5zaWduZWQgc2hvcnQgbWFnaWM7CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KKyAgdW5zaWduZWQgc2hvcnQgdnN0YW1wOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KKyAgdW5zaWduZWQgaW50IHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCisgIHVuc2lnbmVkIGludCBkc2l6ZTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKyAgdW5zaWduZWQgaW50IGJzaXplOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLworICB1bnNpZ25lZCBpbnQgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KKyAgdW5zaWduZWQgaW50IHRleHRfc3RhcnQ7CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgaW50IGRhdGFfc3RhcnQ7CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKyAgdW5zaWduZWQgaW50IGJzc19zdGFydDsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCisgIHVuc2lnbmVkIGludCBncHJtYXNrOwkJLyogPz8gKi8KKyAgdW5zaWduZWQgaW50IGNwcm1hc2tbNF07CS8qID8/ICovCisgIHVuc2lnbmVkIGludCBncF92YWx1ZTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCit9OworCisjZGVmaW5lIEVDT0ZGX1NDTkhEUl9TSVpFICg0MCkKKworc3RhdGljIHZvaWQKK2RpZSAocykKKyAgICAgY2hhciAqczsKK3sKKyAgcGVycm9yIChzKTsKKyAgZXhpdCAoMSk7Cit9CisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBGSUxFICpmOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp6OworICBzdHJ1Y3QgZWNvZmZfZmlsZWhkciAqZmg7CisgIHN0cnVjdCBlY29mZl9hb3V0aGRyICphaDsKKyAgdW5zaWduZWQgaW50IHRvZmY7CisgIGNoYXIgKnQsICpkOworICBpbnQgKCpwZm4pICgpOworICBpbnQgcmV0OworCisgIGlmIChhcmdjICE9IDIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIGZpbGVcbiIsIGFyZ3ZbMF0pOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGYgPSBmb3BlbiAoYXJndlsxXSwgInIiKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICBkaWUgKGFyZ3ZbMV0pOworCisgIGlmIChzdGF0IChhcmd2WzFdLCAmcykgPCAwKQorICAgIGRpZSAoInN0YXQiKTsKKworICB6ID0gKGNoYXIgKikgbWFsbG9jIChzLnN0X3NpemUpOworICBpZiAoeiA9PSBOVUxMKQorICAgIGRpZSAoIm1hbGxvYyIpOworCisgIGlmIChmcmVhZCAoeiwgMSwgcy5zdF9zaXplLCBmKSAhPSBzLnN0X3NpemUpCisgICAgZGllICgiZnJlYWQiKTsKKworICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIHdoaWNoIGlzIHRoZQorICAgICBsb2NhdGlvbiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCwgYW5kIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LAorICAgICB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcGFzcyBhcyBhbiBhcmd1bWVudC4gIFdlIGFsc28gbmVlZCB0aGUgc2l6ZQorICAgICBhbmQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgYnNzIHNlZ21lbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGFsbCBpbgorICAgICB0aGUgRUNPRkYgYS5vdXQgaGVhZGVyLiAgKi8KKworICBmaCA9IChzdHJ1Y3QgZWNvZmZfZmlsZWhkciAqKSB6OworICBpZiAoZmgtPmZfb3B0aGRyICE9IHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmV4cGVjdGVkIG9wdGhkciBzaXplOiBpcyAldSwgd2FudCAldVxuIiwKKwkgICAgICAgYXJndlsxXSwgKHVuc2lnbmVkIGludCkgZmgtPmZfb3B0aGRyLAorCSAgICAgICAodW5zaWduZWQgaW50KSBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgYWggPSAoc3RydWN0IGVjb2ZmX2FvdXRoZHIgKikgKHogKyBzaXplb2YgKHN0cnVjdCBlY29mZl9maWxlaGRyKSk7CisgIGlmIChhaC0+bWFnaWMgIT0gMDQxMykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogYmFkIGFvdXRoZHIgbWFnaWMgbnVtYmVyIDAlbyAod2FudCAwNDEzKVxuIiwKKwkgICAgICAgYXJndlsxXSwgKHVuc2lnbmVkIGludCkgYWgtPm1hZ2ljKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBXZSBzaG91bGQgY2xlYXIgdGhlIGJzcyBzZWdtZW50IGF0IHRoaXMgcG9pbnQuICBUaGlzIGlzIHRoZQorICAgICBhaC0+YnNpemUgYnl0ZXMgc3RhcnRpbmcgYXQgYWgtPmJzc19zdGFydCwgVG8gZG8gdGhpcyBjb3JyZWN0bHksCisgICAgIHdlIHdvdWxkIGhhdmUgdG8gbWFrZSBzdXJlIG91ciBtZW1vcnkgYmxvY2sgaXMgbGFyZ2UgZW5vdWdoLiAgSXQKKyAgICAgc28gaGFwcGVucyB0aGF0IG91ciB0ZXN0IGNhc2UgZG9lcyBub3QgaGF2ZSBhbnkgYWRkaXRpb25hbCBwYWdlcworICAgICBmb3IgdGhlIGJzcyBzZWdtZW50LS1pdCBpcyBjb250YWluZWQgd2l0aGluIHRoZSBkYXRhIHNlZ21lbnQuCisgICAgIFNvLCB3ZSBkb24ndCBib3RoZXIuICAqLworICBpZiAoYWgtPmJzaXplICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAiJXM6IGJzcyBzZWdtZW50IGlzICV1IGJ5dGVzOyBub24temVybyBzaXplcyBub3Qgc3VwcG9ydGVkXG4iLAorCSAgICAgICBhcmd2WzFdLCBhaC0+YnNpemUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIFRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGp1c3QgYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzLCByb3VuZGVkIHRvIGEKKyAgICAgMTYgYnl0ZSBib3VuZGFyeS4gICovCisgIHRvZmYgPSAoc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmlsZWhkcikgKyBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKQorCSAgKyBmaC0+Zl9uc2NucyAqIEVDT0ZGX1NDTkhEUl9TSVpFKTsKKyAgdG9mZiArPSAxNTsKKyAgdG9mZiAmPX4gMTU7CisgIHQgPSB6ICsgdG9mZjsKKworICAvKiBUaGUgdHNpemUgZmllbGQgZ2l2ZXMgdXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQuICAqLworICBkID0geiArIGFoLT50c2l6ZTsKKworICAvKiBDYWxsIHRoZSBjb2RlIGFzIGEgZnVuY3Rpb24uICAqLworICBwZm4gPSAoaW50ICgqKSAoKSkgdDsKKyAgcmV0ID0gKCpwZm4pIChkKTsKKworICBwcmludGYgKCIlcyByYW4gYW5kIHJldHVybmVkICVkXG4iLCBhcmd2WzFdLCByZXQpOworCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWFiNmViCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QxLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIEZpcnN0IEMgc291cmNlIGZpbGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4gICovCisKKy8qIFRoZSBtYWluIHBvaW50IG9mIHRoaXMgdGVzdCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbmQgZGF0YQorICAgYXJlIHRydWx5IHBvc2l0aW9uIGluZGVwZW5kZW50LiAgV2Ugc3RhdGljYWxseSBpbml0aWFsaXplIHNldmVyYWwKKyAgIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHkgYWRqdXN0ZWQgYXQKKyAgIHJ1bnRpbWUuICAqLworCitpbnQgaSA9IDE7CitpbnQgaiA9IDA7CitleHRlcm4gaW50IGs7CitpbnQgbDsKK2NoYXIgc21hbGxfYnVmW10gPSAiYWFhYSI7CitjaGFyICpzbWFsbF9wb2ludGVyID0gc21hbGxfYnVmOworY2hhciBiaWdfYnVmW10gPSAiYWFhYWFhYWFhYWFhYWFhYSI7CitjaGFyICpiaWdfcG9pbnRlciA9IGJpZ19idWY7CisKK2V4dGVybiBpbnQgYmFyICgpOworaW50ICgqcGJhcikgKCkgPSBiYXI7CisKK3N0YXRpYyBpbnQKK2ZvbzIgKGFyZykKKyAgICAgaW50IGFyZzsKK3sKKyAgbCA9IGFyZzsKKyAgcmV0dXJuIGkgKyBqOworfQorCitpbnQgKCpwZm9vMikgKCkgPSBmb28yOworCitpbnQKK2Noa3N0ciAoeiwgYykKKyAgICAgY2hhciAqejsKKyAgICAgaW50IGM7Cit7CisgIC8qIFN3aXRjaCBzdGF0ZW1lbnRzIG5lZWQgZXh0cmEgZWZmb3J0IHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50LAorICAgICBzbyB3ZSBydW4gb25lIGhlcmUsIGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlIGNhc2VzIHdpbGwgbmV2ZXIgYmUKKyAgICAgdGFrZW4uICAqLworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgICAgcmV0dXJuIGkgLSAxOworICAgIGNhc2UgNDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgY2FzZSA3OgorICAgIGNhc2UgODoKKyAgICBjYXNlIDk6CisgICAgICByZXR1cm4gaSAqIGo7CisgICAgY2FzZSAxMDoKKyAgICBjYXNlIDExOgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxMzoKKyAgICBjYXNlIDE0OgorICAgIGNhc2UgMTU6CisgICAgICByZXR1cm4gajsKKyAgICBjYXNlIDE2OgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB3aGlsZSAoYy0tICE9IDApCisgICAgaWYgKCp6KysgIT0gJ2EnKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuICp6ID09ICdcMCc7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJsZXIgc3RhcnR1cCByb3V0aW5lLiAgSXQgdHJpZXMKKyAgIHRvIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuICBJdCByZXR1cm5zIDAgb24KKyAgIHN1Y2Nlc3MsIHNvbWV0aGluZyBlbHNlIG9uIGZhaWx1cmUuICAqLworCitpbnQKK2ZvbyAoKQoreworICBpZiAoaSAhPSAxKQorICAgIHJldHVybiAxOworICBpZiAoaiAhPSAwKQorICAgIHJldHVybiAyOworICBpZiAoISBjaGtzdHIgKHNtYWxsX2J1ZiwgNCkpCisgICAgcmV0dXJuIDM7CisgIGlmICghIGNoa3N0ciAoc21hbGxfcG9pbnRlciwgNCkpCisgICAgcmV0dXJuIDQ7CisgIGlmICghIGNoa3N0ciAoYmlnX2J1ZiwgMTYpKQorICAgIHJldHVybiA1OworICBpZiAoISBjaGtzdHIgKGJpZ19wb2ludGVyLCAxNikpCisgICAgcmV0dXJuIDY7CisKKyAgaWYgKGwgIT0gMCkKKyAgICByZXR1cm4gNzsKKyAgaWYgKGZvbzIgKDEpICE9IDEpCisgICAgcmV0dXJuIDg7CisgIGlmIChsICE9IDEpCisgICAgcmV0dXJuIDk7CisgIGlmICgoKnBmb28yKSAoMikgIT0gMSkKKyAgICByZXR1cm4gMTA7CisgIGlmIChsICE9IDIpCisgICAgcmV0dXJuIDExOworCisgIGlmIChiYXIgKDEpICE9IDApCisgICAgcmV0dXJuIDEyOworICBpZiAoYmFyICgtMSkgIT0gMSkKKyAgICByZXR1cm4gMTM7CisgIGlmICgoKnBiYXIpICgweGE1YTVhNWE1KSAhPSAtMSkKKyAgICByZXR1cm4gMTQ7CisgIGlmIChrICE9IDB4YTVhNWE1YTUpCisgICAgcmV0dXJuIDE1OworICBpZiAoKCpwYmFyKSAoMCkgIT0gMHhhNWE1YTVhNSkKKyAgICByZXR1cm4gMTY7CisgIGlmIChrICE9IDApCisgICAgcmV0dXJuIDE3OworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDA1MjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKQEAgLTAsMCArMSwyNiBAQAorLyogU2Vjb25kIEMgc291cmNlIGZpbGUgZm9yIGFjdHVhbCBleGVjdXRpb24gdGVzdC4gICovCisKK2ludCBrOworZXh0ZXJuIGludCBpOworZXh0ZXJuIGludCBqOworZXh0ZXJuIGNoYXIgc21hbGxfYnVmW107CitleHRlcm4gY2hhciAqc21hbGxfcG9pbnRlcjsKKworZXh0ZXJuIGludCBjaGtzdHIgKCk7CisKK2ludAorYmFyIChuKQorICAgICBpbnQgbjsKK3sKKyAgaW50IHI7CisKKyAgaWYgKGkgIT0gMQorICAgICAgfHwgaiAhPSAwCisgICAgICB8fCAhIGNoa3N0ciAoc21hbGxfYnVmLCA0KQorICAgICAgfHwgISBjaGtzdHIgKHNtYWxsX3BvaW50ZXIsIDQpKQorICAgIHJldHVybiBrICsgMTsKKworICByID0gazsKKyAgayA9IG47CisgIHJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdGkucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmExOTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3RpLnMKQEAgLTAsMCArMSw5NCBAQAorIyBBc3NlbWJsZXIgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB0ZXN0LgorCQorIyBUaGlzIGNvZGUgYmVjb21lcyB0aGUgc3RhcnQgb2YgdGhlIGV4ZWN1dGlvbiB0ZXN0IHByb2dyYW0uICBJdCBpcworIyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBzdGF0aWMgZGF0YSwgaW52b2tpbmcgdGhlIEMgY29kZSwKKyMgYW5kIHJldHVybmluZyB0aGUgcmVzdWx0LiAgSXQgaXMgY2FsbGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEgQworIyBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQuCisKKyMgV2UgbmVlZCB0byBrbm93IHRoZSB2YWx1ZSBvZiBfZnRleHQgYW5kIF9mZGF0YSBhdCBsaW5rIHRpbWUsIGJ1dCB3ZQorIyBoYXZlIG5vIHdheSB0byBhY3R1YWxseSBnZXQgdGhhdCBhdCBydW50aW1lLiAgVGhpcyBpcyBiZWNhdXNlIHdoZW4KKyMgdGhpcyBjb2RlIGlzIGNvbXBpbGVkIHdpdGggLW1lbWJlZGRlZC1waWMsIHRoZSBsYSBpbnN0cnVjdGlvbiB3aWxsCisjIGJlIHR1cm5lZCBpbnRvIGFuIGFkZGl1ICRncCBpbnN0cnVjdGlvbi4gIFdlIHdvcmsgYXJvdW5kIHRoaXMgYnkKKyMgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gd29yZHMgaW4gdGhlIC5kYXRhIHNlY3Rpb24uICBXZSB0aGVuIGxvYWQKKyMgdGhlIHZhbHVlcyBvZiB0aGVzZSB3b3JkcyAqYmVmb3JlKiBkb2luZyB0aGUgcnVudGltZSByZWxvY2F0aW9uLgorCS5zZGF0YQordGV4dF9zdGFydDoKKwkud29yZAlfZnRleHQKK2RhdGFfc3RhcnQ6CisJLndvcmQJX2ZkYXRhCisKKwkuZ2xvYmwJc3RhcnQKKwkudGV4dAorc3RhcnQ6CisJIyBHcmFiIHNvbWUgc3BhY2Ugb24gdGhlIHN0YWNrLCBqdXN0IGFzIHRob3VnaCB3ZSB3ZXJlIGEgcmVhbAorCSMgZnVuY3Rpb24uCisJYWRkaXUJJHNwLCRzcCwtOAorCXN3CSQzMSwwKCRzcCkKKworCSMgU2F2ZSB0aGUgJGdwIHJlZ2lzdGVyLCBhbmQgc2V0IGl0IHVwIGZvciBvdXIgZGF0YSBzZWN0aW9uLgorCXN3CSRncCw0KCRzcCkKKworCWFkZHUJJGdwLCQ0LDB4ODAwMAkJIyBtYWNybworCisJIyBUaGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCBpcyBpbiAkNC4KKworCSMgR2V0IHRoZSBhZGRyZXNzIG9mIHN0YXJ0IGludG8gJDUgaW4gYSBwb3NpdGlvbiBpbmRlcGVuZGVudAorCSMgZmFzaGlvbi4KKwkuc2V0CW5vcmVvcmRlcgorCSRMRjEgPSAuICsgOAorCWJhbAkkTEYxCisJbGEJJDUsc3RhcnQtJExGMQkJIyBtYWNybworCS5zZXQJcmVvcmRlcgorCWFkZHUJJDUsJDUsJDMxCisKKwkjIE5vdyBnZXQgdGhlIGFkZHJlc3Mgb2YgX2Z0ZXh0IGludG8gJDYuCisJbGEJJDYsX2Z0ZXh0LXN0YXJ0CQkjIG1hY3JvCisJYWRkdQkkNiwkNiwkNQorCisJIyBHZXQgdGhlIHZhbHVlIG9mIF9mdGV4dCB1c2VkIHRvIGxpbmsgaW50byAkNy4KKwlsdwkkNyx0ZXh0X3N0YXJ0CQkjIG1hY3JvCisKKwkjIEdldCB0aGUgdmFsdWUgb2YgX2ZkYXRhIHVzZWQgdG8gbGluayBpbnRvICQ4LgorCWx3CSQ4LGRhdGFfc3RhcnQJCSMgbWFjcm8KKworCSMgR2V0IHRoZSBhZGRyZXNzIG9mIF9fcnVudGltZV9yZWxvY19zdGFydCBpbnRvICQ5LgorCWxhCSQ5LF9fcnVudGltZV9yZWxvY19zdGFydC1zdGFydAkjIG1hY3JvCisJYWRkdQkkOSwkOSwkNQorCisJIyBHZXQgdGhlIGFkZHJlc3Mgb2YgX19ydW50aW1lX3JlbG9jX3N0b3AgaW50byAkMTAuCisJbGEJJDEwLF9fcnVudGltZV9yZWxvY19zdG9wLXN0YXJ0CSMgbWFjcm8KKwlhZGR1CSQxMCwkMTAsJDUKKworCSMgVGhlIHdvcmRzIGJldHdlZW4gJDkgYW5kICQxMCBhcmUgdGhlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24KKwkjIGluc3RydWN0aW9ucy4gIFN0ZXAgdGhyb3VnaCBhbmQgcmVsb2NhdGUgdGhlbS4gIEZpcnN0IHNldAorCSMgJDExIGFuZCAkMTIgdG8gdGhlIHZhbHVlcyB0byBhZGQgdG8gdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywKKwkjIHJlc3BlY3RpdmVseS4KKwlzdWJ1CSQxMSwkNiwkNworCXN1YnUJJDEyLCQ0LCQ4CisKKzE6CQorCWJnZQkkOSwkMTAsM2YJCSMgbWFjcm8KKwlsdwkkMTMsMCgkOSkKKwlhbmQJJDE0LCQxMywweGZmZmZmZmZlCSMgbWFjcm8KKwltb3ZlCSQxNSwkMTEKKwliZXEJJDEzLCQxNCwyZgorCW1vdmUJJDE1LCQxMgorMjoJCisJYWRkdQkkMTQsJDE0LCQ0CisJbHcJJDI0LDAoJDE0KQorCWFkZHUJJDI0LCQyNCwkMTUKKwlzdwkkMjQsMCgkMTQpCisJYWRkaXUJJDksJDksNAorCWIJMWIKKzM6CQorCisJIyBOb3cgdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZGF0YSBoYXMgYmVlbiByZWxvY2F0ZWQKKwkjIGNvcnJlY3RseSwgYW5kIHdlIGNhbiBjYWxsIHRoZSBDIGNvZGUgd2hpY2ggZG9lcyB0aGUgYWN0dWFsCisJIyB0ZXN0aW5nLgorCWJhbAlmb28KKworCSMgV2UgcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgQyBjb2RlLgorCWx3CSQzMSwwKCRzcCkKKwlsdwkkZ3AsNCgkc3ApCisJYWRkdQkkc3AsJHNwLDgKKwlqCSQzMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njc4OTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLmMKQEAgLTAsMCArMSw2IEBACitleHRlcm4gaW50IGZvbyAoKTsKK2ludAorZnVuYyAoKQoreworICByZXR1cm4gZm9vICgpOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTk0OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQKQEAgLTAsMCArMSw2IEBACitOT0NST1NTUkVGUyAoIC50ZXh0IC5kYXRhICkKK1NFQ1RJT05TCit7CisgIC50ZXh0IDogeyB0bXBkaXIvY3Jvc3MxLm8gfQorICAuZGF0YSA6IHsgdG1wZGlyL2Nyb3NzMi5vIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MzE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi5jCkBAIC0wLDAgKzEsNSBAQAoraW50Citmb28gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDQ2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIudApAQCAtMCwwICsxLDYgQEAKK05PQ1JPU1NSRUZTICggLnRleHQgLmRhdGEgKQorU0VDVElPTlMKK3sKKyAgLnRleHQgOiB7ICooLnRleHQpICooLnByKSB9CisgIC5kYXRhIDogeyAqKC5kYXRhKSAqKC5zZGF0YSkgKigucncpICooLnRjMCkgKigudGMpIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0OGMzMgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jCkBAIC0wLDAgKzEsNyBAQAoraW50IGkgPSA0OworCitpbnQKK2ZvbyAoKQoreworICByZXR1cm4gaTsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWU5NzU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwCkBAIC0wLDAgKzEsNzcgQEAKKyMgVGVzdCBOT0NST1NTUkVGUyBpbiBhIGxpbmtlciBzY3JpcHQuCisjIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgorCitzZXQgdGVzdDEgIk5PQ1JPU1NSRUZTIDEiCitzZXQgdGVzdDIgIk5PQ1JPU1NSRUZTIDIiCisKK2lmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKKyAgICB1bnRlc3RlZCAkdGVzdDEKKyAgICB1bnRlc3RlZCAkdGVzdDIKKyAgICByZXR1cm4KK30KKworaWYgeyAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLmMiIHRtcGRpci9jcm9zczEub10gXAorICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLmMiIHRtcGRpci9jcm9zczIub10gfSB7CisgICAgdW5yZXNvbHZlZCAkdGVzdDEKKyAgICB1bnJlc29sdmVkICR0ZXN0MgorICAgIHJldHVybgorfQorCitzZXQgZmxhZ3MgIiIKKworIyBUaGUgYTI5ayBjb21waWxlZCBjb2RlIGNhbGxzIFZfU1BJTEwgYW5kIFZfRklMTC4gIFNpbmNlIHdlIGRvbid0CisjIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCisjIGZ1bmN0aW9ucywgd2UganVzdCBkZWZpbmUgdGhlbSBvdXQuCitpZiBbaXN0YXJnZXQgYTI5ayotKi0qXSB7CisgICAgc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gVl9TUElMTD0wIC0tZGVmc3ltIFZfRklMTD0wIgorfQorCisjIGhwcGEtZWxmIG5lZWRzIGEgZGVmaW5pdGlvbiBmb3IgJGdsb2JhbCQuCitpZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB7CisgICAgc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gJ1wkZ2xvYmFsXCQnPTAiCit9CisKK3ZlcmJvc2UgLWxvZyAiJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MxIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczEudCB0bXBkaXIvY3Jvc3MxLm8gdG1wZGlyL2Nyb3NzMi5vIgorCitjYXRjaCAiZXhlYyAkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczEgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS50IHRtcGRpci9jcm9zczEubyB0bXBkaXIvY3Jvc3MyLm8iIGV4ZWNfb3V0cHV0CisKK3NldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorCityZWdzdWIgLWFsbCAiKF58XG4pKCRsZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKKworaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworICAgIGZhaWwgJHRlc3QxCit9IGVsc2UgeworICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgorICAgIGlmIFtyZWdleHAgInByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gLiogdG8gYGZvbycgaW4iICRleGVjX291dHB1dF0geworCXBhc3MgJHRlc3QxCisgICAgfSBlbHNlIHsKKwlmYWlsICR0ZXN0MQorICAgIH0KK30KKworIyBDaGVjayBjcm9zcyByZWZlcmVuY2VzIHdpdGhpbiBhIHNpbmdsZSBvYmplY3QuCisKK2lmIHsgIVtsZF9jb21waWxlICRDQyAiJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMy5jIiB0bXBkaXIvY3Jvc3MzLm9dIH0geworICAgIHVucmVzb2x2ZWQgJHRlc3QyCisgICAgcmV0dXJuCit9CisKK3ZlcmJvc2UgLWxvZyAiJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MyIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczIudCB0bXBkaXIvY3Jvc3MzLm8iCisKK2NhdGNoICJleGVjICRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMiAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLnQgdG1wZGlyL2Nyb3NzMy5vIiBleGVjX291dHB1dAorCitzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKworcmVnc3ViIC1hbGwgIihefFxuKSgkbGQ6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbFxbXlxuXF0qXG4/KSIgJGV4ZWNfb3V0cHV0ICJcXDEiIGV4ZWNfb3V0cHV0CisKK2lmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKyAgICBmYWlsICR0ZXN0MgorfSBlbHNlIHsKKyAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKyAgICBpZiBbcmVnZXhwICJwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tIC4qIHRvIGAuKicgaW4iICRleGVjX291dHB1dF0geworCXBhc3MgJHRlc3QyCisgICAgfSBlbHNlIHsKKwlmYWlsICR0ZXN0MgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMjZiYwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQuZXhwCkBAIC0wLDAgKzEsMzkgQEAKKyMgVGVzdCBERUZJTkVEIGluIGEgbGlua2VyIHNjcmlwdC4KKyMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisKK3NldCB0ZXN0bmFtZSAiREVGSU5FRCIKK3NldCBwcm1zX2lkIDU2OTkKKworaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2RlZmluZWQucyB0bXBkaXIvZGVmLm9dIHsKKyAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvZGVmICItVCAkc3JjZGlyLyRzdWJkaXIvZGVmaW5lZC50IHRtcGRpci9kZWYubyJdIHsKKyAgICBmYWlsICR0ZXN0bmFtZQorfSBlbHNlIHsKKyAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvZGVmXSB7CisJdW5yZXNvbHZlZCAkdGVzdG5hbWUKKyAgICB9IGVsc2UgeworCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTEpXSBcCisJICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh2YWx1ZTIpXX0geworCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCisJICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKKwkgICAgZmFpbCAkdGVzdG5hbWUKKwl9IGVsc2UgeworCSAgICBpZiB7JG5tX291dHB1dCh2YWx1ZTEpICE9IDF9IHsKKwkJc2VuZF9sb2cgInZhbHVlMSA9PSAkbm1fb3V0cHV0KHZhbHVlMSlcbiIKKwkJdmVyYm9zZSAidmFsdWUxID09ICRubV9vdXRwdXQodmFsdWUxKSIKKwkJZmFpbCAkdGVzdG5hbWUKKwkgICAgfSBlbHNlIHsKKwkJaWYgeyRubV9vdXRwdXQodmFsdWUyKSAhPSAyfSB7CisJCSAgICBzZW5kX2xvZyAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKVxuIgorCQkgICAgdmVyYm9zZSAidmFsdWUyID09ICRubV9vdXRwdXQodmFsdWUyKSIKKwkJICAgIGZhaWwgJHRlc3RuYW1lCisJCX0gZWxzZSB7CisJCSAgICBwYXNzICR0ZXN0bmFtZQorCQl9CisJICAgIH0KKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjRiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnMKQEAgLTAsMCArMSwyIEBACisJLmdsb2JsCWRlZmluZWQKKwlkZWZpbmVkCT0JMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWYxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQKQEAgLTAsMCArMSw3IEBACitTRUNUSU9OUyB7CisJLnRleHQgOiB7ICooLnRleHQpIH0KKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS5ic3MgOiB7ICooLmJzcykgKihDT01NT04pIH0KK30KK3ZhbHVlMSA9IERFRklORUQgKGRlZmluZWQpID8gMSA6IDI7Cit2YWx1ZTIgPSBERUZJTkVEICh1bmRlZmluZWQpID8gMSA6IDI7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlZTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLmV4cApAQCAtMCwwICsxLDU3IEBACisjIFRlc3QgUEhEUlMgaW4gYSBsaW5rZXIgc2NyaXB0LgorIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworIyBQSERSUyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIEVMRi4KK2lmIHsgIVtpc3RhcmdldCAqLSotc3lzdjQqXSBcCisgICAgICYmICFbaXN0YXJnZXQgKi0qLXVuaXh3YXJlKl0gXAorICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lbGYqXSBcCisgICAgICYmICFbaXN0YXJnZXQgKi0qLWVhYmkqXSBcCisgICAgICYmICFbaXN0YXJnZXQgKi0qLWxpbnV4Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NSpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDYqXSBcCisgICAgICYmICFbaXN0YXJnZXQgKi0qLXNvbGFyaXMyKl0gfSB7CisgICAgcmV0dXJuCit9CisKK2lmIHsgW2lzdGFyZ2V0ICotKi1saW51eGFvdXQqXSBcCisgICAgIHx8IFtpc3RhcmdldCAqLSotbGludXhvbGRsZCpdIH0geworICAgIHJldHVybgorfQorCisjIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsaXN0aWMgdGVzdC4KKworc2V0IHRlc3RuYW1lICJQSERSUyIKKworaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3BoZHJzLnMgdG1wZGlyL3BoZHJzLm9dIHsKKyAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitzZXQgcGhkcnNfcmVnZXhwIFwKKyIuKlByb2dyYW0gSGVhZGVyOi4qUEhEUiAqb2ZmICoweDAwKjM0ICp2YWRkciAqMHgwMCo4MDAzNCAqcGFkZHIgKjB4MDAqODAwMzQuKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiBmbGFncyByLS0uKkxPQUQgKm9mZiAqMHgwMCogKnZhZGRyICoweDAwKjgwMDAwICpwYWRkciAqMHgwMCo4MDAwMC4qZmlsZXN6ICoweDAwKlxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzIHIteC4qTE9BRCAqb2ZmICoweDBcWzAtOWEtZlxdKiAqdmFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSogKnBhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzICpydy0uKiIKKworIyBPbiBhIDY0IGJpdCBFTEYgZm9ybWF0LCB3ZSBuZWVkIGRpZmZlcmVudCBudW1iZXJzLgoraWYgeyBbaXN0YXJnZXQgYWxwaGEqLSotKl0gfSB0aGVuIHsKKyAgc2V0IHBoZHJzX3JlZ2V4cCBcCisiLipQcm9ncmFtIEhlYWRlcjouKlBIRFIgKm9mZiAqMHgwMCo0MCAqdmFkZHIgKjB4MDAqODAwNDAgKnBhZGRyICoweDAwKjgwMDQwLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogZmxhZ3Mgci0tLipMT0FEICpvZmYgKjB4MDAqICp2YWRkciAqMHgwMCo4MDAwMCAqcGFkZHIgKjB4MDAqODAwMDAuKmZpbGVzeiAqMHgwMCpcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyByLXguKkxPQUQgKm9mZiAqMHgwXFswLTlhLWZcXSogKnZhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qICpwYWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKi4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyAqcnctLioiCit9CisKK2lmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9waGRycyAiLVQgJHNyY2Rpci8kc3ViZGlyL3BoZHJzLnQgdG1wZGlyL3BoZHJzLm8iXSB7CisgICAgZmFpbCAkdGVzdG5hbWUKK30gZWxzZSB7CisgICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0geworCXVucmVzb2x2ZWQgJHRlc3RuYW1lCisJcmV0dXJuCisgICAgfQorCisgICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAtLXByaXZhdGUgdG1wZGlyL3BoZHJzIgorICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC0tcHJpdmF0ZSB0bXBkaXIvcGhkcnMiIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisgICAgdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAorCisgICAgaWYgW3JlZ2V4cCAkcGhkcnNfcmVnZXhwICRleGVjX291dHB1dF0geworCXBhc3MgJHRlc3RuYW1lCisgICAgfSBlbHNlIHsKKwlmYWlsICR0ZXN0bmFtZQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWYwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zCkBAIC0wLDAgKzEsOCBAQAorCS50ZXh0CisKKwkubG9uZwkxCisKKwkuZGF0YQorCisJLmxvbmcJMgorCQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3MTBlMgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQKQEAgLTAsMCArMSwxNCBAQAorUEhEUlMKK3sKKyAgaGVhZGVyIFBUX1BIRFIgUEhEUlMgOworICB0ZXh0IFBUX0xPQUQgRklMRUhEUiBQSERSUyA7CisgIGRhdGEgUFRfTE9BRCA7Cit9CisKK1NFQ1RJT05TCit7CisgIC4gPSAweDgwMDAwICsgU0laRU9GX0hFQURFUlM7CisgIC50ZXh0IDogeyAqKC50ZXh0KSB9IDp0ZXh0CisgIC5kYXRhIDogeyAqKC5kYXRhKSB9IDpkYXRhCisgIC9ESVNDQVJELyA6IHsgKigucmVnaW5mbykgfQorfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwYTA0MQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC5leHAKQEAgLTAsMCArMSw2NCBAQAorIyBUZXN0IGJhc2ljIGxpbmtlciBzY3JpcHQgZnVuY3Rpb25hbGl0eQorIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitzZXQgdGVzdG5hbWUgInNjcmlwdCIKKworaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdC5zIHRtcGRpci9zY3JpcHQub10geyAKKyAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitwcm9jIGNoZWNrX3NjcmlwdCB7IH0geworICAgIGdsb2JhbCBubQorICAgIGdsb2JhbCB0ZXN0bmFtZQorICAgIGdsb2JhbCBubV9vdXRwdXQKKworICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci9zY3JpcHRdIHsKKwl1bnJlc29sdmVkICR0ZXN0bmFtZQorICAgIH0gZWxzZSB7CisJaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfc3RhcnQpXSBcCisJICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X2VuZCldIFwKKwkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfc3RhcnQpXSBcCisJICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX2VuZCldfSB7CisJICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKKwkgICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgorCSAgICBmYWlsICR0ZXN0bmFtZQorCX0gZWxzZSB7CisJICAgIGlmIHskbm1fb3V0cHV0KHRleHRfc3RhcnQpICE9IDB4MTAwfSB7CisJCXNlbmRfbG9nICJ0ZXh0X3N0YXJ0ID09ICRubV9vdXRwdXQodGV4dF9zdGFydClcbiIKKwkJdmVyYm9zZSAidGV4dF9zdGFydCA9PSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpIgorCQlmYWlsICR0ZXN0bmFtZQorCSAgICB9IGVsc2UgeyBpZiB7JG5tX291dHB1dCh0ZXh0X2VuZCkgPCAweDEwNCBcCisJCQkgIHx8ICRubV9vdXRwdXQodGV4dF9lbmQpID4gMHgxMTB9IHsKKwkJc2VuZF9sb2cgInRleHRfZW5kID09ICRubV9vdXRwdXQodGV4dF9lbmQpXG4iCisJCXZlcmJvc2UgInRleHRfZW5kID09ICRubV9vdXRwdXQodGV4dF9lbmQpIgorCQlmYWlsICR0ZXN0bmFtZQorCSAgICB9IGVsc2UgeyBpZiB7JG5tX291dHB1dChkYXRhX3N0YXJ0KSAhPSAweDEwMDB9IHsKKwkJc2VuZF9sb2cgImRhdGFfc3RhcnQgPT0gJG5tX291dHB1dChkYXRhX3N0YXJ0KVxuIgorCQl2ZXJib3NlICJkYXRhX3N0YXJ0ID09ICRubV9vdXRwdXQoZGF0YV9zdGFydCkiCisJCWZhaWwgJHRlc3RuYW1lCisJICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KGRhdGFfZW5kKSA8IDB4MTAwNCBcCisJCQkgfHwgJG5tX291dHB1dChkYXRhX2VuZCkgPiAweDEwMTB9IHsKKwkJc2VuZF9sb2cgImRhdGFfZW5kID09ICRubV9vdXRwdXQoZGF0YV9lbmQpXG4iCisJCXZlcmJvc2UgImRhdGFfZW5kID09ICRubV9vdXRwdXQoZGF0YV9lbmQpIgorCQlmYWlsICR0ZXN0bmFtZQorCSAgICB9IGVsc2UgeworCQlwYXNzICR0ZXN0bmFtZQorCSAgICB9IH0gfSB9CisJfQorICAgIH0KK30KKworaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdC50IHRtcGRpci9zY3JpcHQubyJdIHsKKyAgICBmYWlsICR0ZXN0bmFtZQorfSBlbHNlIHsKKyAgICBjaGVja19zY3JpcHQKK30KKworc2V0IHRlc3RuYW1lICJNUkkgc2NyaXB0IgorCitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2NyaXB0ICItYyAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0bS50Il0geworICAgIGZhaWwgJHRlc3RuYW1lCit9IGVsc2UgeworICAgIGNoZWNrX3NjcmlwdAorfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I2NWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMKQEAgLTAsMCArMSw4IEBACisJLnRleHQKKwkuZ2xvYmwgdGV4dF9zeW1ib2wKK3RleHRfc3ltYm9sOgkKKwkubG9uZwkxCisJLmRhdGEKKwkuZ2xvYmwgZGF0YV9zeW1ib2wKK2RhdGFfc3ltYm9sOgkKKwkubG9uZwkyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdC50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2E0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudApAQCAtMCwwICsxLDE2IEBACitTRUNUSU9OUworeworICAudGV4dCAweDEwMCA6IHsgCisgICAgdGV4dF9zdGFydCA9IC47CisgICAgKigudGV4dCkKKyAgICAqKC5wcikKKyAgICB0ZXh0X2VuZCA9IC47CisgIH0KKyAgLiA9IDB4MTAwMDsKKyAgLmRhdGEgOiB7CisgICAgZGF0YV9zdGFydCA9IC47CisgICAgKiguZGF0YSkKKyAgICAqKC5ydykKKyAgICBkYXRhX2VuZCA9IC47CisgIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NjYWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0bS50CkBAIC0wLDAgKzEsMTAgQEAKKyogTVJJIHNjcmlwdAorc2VjdCAudGV4dCA9ICQxMDAJOyAudGV4dCBzdGFydCBhZGRyZXNzCitzZWN0IC5kYXRhID0gMTAwMGgJOyAuZGF0YSBzdGFydCBhZGRyZXNzCitwdWJsaWMgdGV4dF9zdGFydCA9ICQxMDAKK3B1YmxpYyB0ZXh0X2VuZCA9ICMgY29udGludWF0aW9uIGxpbmUKKyAgdGV4dF9zdGFydCArIDQKK3B1YmxpYyBkYXRhX3N0YXJ0ID0gMTAwMGgKK3B1YmxpYyBkYXRhX2VuZCA9IGRhdGFfc3RhcnQgKyA0CisKK2xvYWQgdG1wZGlyL3NjcmlwdC5vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmRlZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cApAQCAtMCwwICsxLDU1IEBACisjIFRlc3QgU0laRU9GIGluIGEgbGlua2VyIHNjcmlwdC4KKyMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKyMgQmFzZWQgb24gYSBidWcgcmVwb3J0IGZyb20gYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlLgorCitzZXQgdGVzdG5hbWUgIlNJWkVPRiIKKworaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3NpemVvZi5zIHRtcGRpci9zaXplb2Yub10geworICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCisgICAgcmV0dXJuCit9CisKK2lmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaXplb2YgIi1UICRzcmNkaXIvJHN1YmRpci9zaXplb2YudCB0bXBkaXIvc2l6ZW9mLm8iXSB7CisgICAgZmFpbCAkdGVzdG5hbWUKKyAgICByZXR1cm4KK30KKworaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NpemVvZl0geworICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCisgICAgcmV0dXJuCit9CisKK2lmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X3N0YXJ0KV0gXAorICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X2VuZCldIFwKKyAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9zdGFydCldIFwKKyAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZGF0YV9lbmQpXSBcCisgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHNpemVvZl90ZXh0KV0gXAorICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChzaXplb2ZfZGF0YSldfSB7CisgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgorICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKKyAgICBmYWlsICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitpZiB7JG5tX291dHB1dCh0ZXh0X2VuZCkgLSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX3RleHQpfSB7CisgICAgc2VuZF9sb2cgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dFxuIgorICAgIHZlcmJvc2UgInRleHRfZW5kIC0gdGV4dF9zdGFydCAhPSBzaXplb2ZfdGV4dCIKKyAgICBmYWlsICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitpZiB7JG5tX291dHB1dChkYXRhX2VuZCkgLSAkbm1fb3V0cHV0KGRhdGFfc3RhcnQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX2RhdGEpfSB7CisgICAgc2VuZF9sb2cgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YVxuIgorICAgIHZlcmJvc2UgImRhdGFfZW5kIC0gZGF0YV9zdGFydCAhPSBzaXplb2ZfZGF0YSIKKyAgICBmYWlsICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitpZiB7JG5tX291dHB1dChzaXplb2ZfdGV4dCkgIT0gJG5tX291dHB1dChzaXplb2ZfZGF0YSl9IHsKKyAgICBzZW5kX2xvZyAic2l6ZW9mX3RleHQgIT0gc2l6ZW9mX2RhdGFcbiIKKyAgICB2ZXJib3NlICJzaXplb2ZfdGV4dCAhPSBzaXplb2ZfZGF0YSIKKyAgICBmYWlsICR0ZXN0bmFtZQorICAgIHJldHVybgorfQorCitwYXNzICR0ZXN0bmFtZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIxY2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMKQEAgLTAsMCArMSBAQAorCS5zcGFjZQkxNgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ0YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnQKQEAgLTAsMCArMSwxNyBAQAorU0VDVElPTlMgeworCS50ZXh0IDoKKwkgIHsKKwkgICAgdGV4dF9zdGFydCA9IC47CisJICAgIHRtcGRpci9zaXplb2YubyAKKwkgICAgdGV4dF9lbmQgPSAuOworCSAgfQorCS5kYXRhIDogCisJICB7IAorCSAgICBkYXRhX3N0YXJ0ID0gLjsKKwkgICAgLiA9IC4gKyBTSVpFT0YoLnRleHQpOworCSAgICBkYXRhX2VuZCA9IC47CisJICB9Cit9CQorCitzaXplb2ZfdGV4dCA9IFNJWkVPRigudGV4dCk7CitzaXplb2ZfZGF0YSA9IFNJWkVPRiguZGF0YSk7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OWRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cApAQCAtMCwwICsxLDU3IEBACisjIFRlc3Qgd2VhayBzeW1ib2xzLgorIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgorCitzZXQgdGVzdG5hbWUgIndlYWsgc3ltYm9scyIKKworIyBUaGlzIHRlc3Qgb25seSB3b3JrcyBmb3IgRUxGIHRhcmdldHMuICBJdCBvdWdodCB0byB3b3JrIGZvciBzb21lCisjIGEub3V0IHRhcmdldHMsIGJ1dCBpdCBkb2Vzbid0LgorCitpZiB7ICFbaXN0YXJnZXQgKi0qLXN5c3Y0Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0ICotKi11bml4d2FyZSpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCAqLSotZWxmKl0gXAorICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lYWJpKl0gXAorICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDUqXSBcCisgICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg2Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0ICotKi1zb2xhcmlzMipdIH0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKK2lmIHsgW2lzdGFyZ2V0ICotKi1saW51eGFvdXQqXSBcCisgICAgIHx8IFtpc3RhcmdldCAqLSotbGludXhvbGRsZCpdIH0geworICAgIHJldHVybgorfQorCitpZiB7ISBbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci93ZWFrMS5zIHRtcGRpci93ZWFrMS5vXQorICAgIHx8ICEgW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvd2VhazIucyB0bXBkaXIvd2VhazIub119IHRoZW4geworICAgICMgSXQncyBPSyBpZiAud2VhayBkb2Vzbid0IHdvcmsgb24gdGhpcyB0YXJnZXQuCisgICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKKyAgICByZXR1cm4KK30KKworc2V0IHdlYWtfcmVnZXhwX2JpZyBcCisiLipDb250ZW50cyBvZiBzZWN0aW9uIC50ZXh0Oi4qMTAwMCAwMDAwMTAwOCAwMDAwMjAwYyAxMjEyMTIxMiAzNDM0MzQzNC4qQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YTouKjIwMDAgMDAwMDEwMDggMDAwMDIwMGMgNTY1NjU2NTYgNzg3ODc4NzguKiIKKworc2V0IHdlYWtfcmVnZXhwX2xpdHRsZSBcCisiLipDb250ZW50cyBvZiBzZWN0aW9uIC50ZXh0Oi4qMTAwMCAwODEwMDAwMCAwYzIwMDAwMCAxMjEyMTIxMiAzNDM0MzQzNC4qQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YTouKjIwMDAgMDgxMDAwMDAgMGMyMDAwMDAgNTY1NjU2NTYgNzg3ODc4NzguKiIKKworaWYgeyEgW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvd2VhayAiLVQgJHNyY2Rpci8kc3ViZGlyL3dlYWsudCB0bXBkaXIvd2VhazEubyB0bXBkaXIvd2VhazIubyJdIH0gdGhlbiB7CisgICAgZmFpbCAkdGVzdG5hbWUKK30gZWxzZSB7CisgICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gdGhlbiB7CisJdW5yZXNvbHZlZCAkdGVzdG5hbWUKKwlyZXR1cm4KKyAgICB9CisKKyAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wIC1zIHRtcGRpci93ZWFrIgorICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1zIHRtcGRpci93ZWFrIiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIHZlcmJvc2UgLWxvZyAkZXhlY19vdXRwdXQKKworICAgIGlmIHtbcmVnZXhwICR3ZWFrX3JlZ2V4cF9iaWcgJGV4ZWNfb3V0cHV0XSBcCisJfHwgW3JlZ2V4cCAkd2Vha19yZWdleHBfbGl0dGxlICRleGVjX291dHB1dF0gfSB0aGVuIHsKKwlwYXNzICR0ZXN0bmFtZQorICAgIH0gZWxzZSB7CisJZmFpbCAkdGVzdG5hbWUKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMDEzZQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsudApAQCAtMCwwICsxLDEyIEBACitTRUNUSU9OUworeworICAudGV4dCAweDEwMDAgOiB7CisgICAgdG1wZGlyL3dlYWsxLm8oLmRhdGEpCisgIH0KKyAgLmRhdGEgMHgyMDAwIDogeworICAgIHRtcGRpci93ZWFrMi5vKC5kYXRhKQorICB9CisgIC9ESVNDQVJELyA6IHsKKyAgICAqKCopCisgIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmZiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCkBAIC0wLDAgKzEsMTEgQEAKKy5kYXRhCisJLmdsb2JhbAlmb28xCisJLmdsb2JhbAlzeW0xCisJLndlYWsJc3ltMgorZm9vMToKKwkubG9uZwlzeW0xCisJLmxvbmcJc3ltMgorc3ltMToKKwkubG9uZwkweDEyMTIxMjEyCitzeW0yOgorCS5sb25nCTB4MzQzNDM0MzQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsyLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZWRmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMi5zCkBAIC0wLDAgKzEsMTEgQEAKKy5kYXRhCisJLmdsb2JhbAlmb28yCisJLndlYWsJc3ltMQorCS5nbG9iYWwJc3ltMgorZm9vMjoKKwkubG9uZwlzeW0xCisJLmxvbmcJc3ltMgorc3ltMToKKwkubG9uZwkweDU2NTY1NjU2CitzeW0yOgorCS5sb25nCTB4Nzg3ODc4NzgKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwMjM2NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qIF9zdGFydCBzaG91bGQgYmUgdGhlIG9ubHkgdGhpbmcgbGVmdCBhZnRlciBHQy4gICovCisKK3ZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7Cit2b2lkIF9zdGFydCgpCit7Cit9CisKK3ZvaWQgZHJvcG1lMSgpCit7Cit9CisKK2ludCBkcm9wbWUyWzEwMl0gPSB7IDAgfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5NTg4NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIE5vcm1hbGx5IHdlIHNob3VsZCBsb29zZSBmb28gYW5kIGtlZXAgX3N0YXJ0IGFuZCBfaW5pdC4gCisgICBXaXRoIC11IGZvbywgd2Ugc2hvdWxkIGtlZXAgdGhhdCBhcyB3ZWxsLiAgKi8KKwordm9pZCBfc3RhcnQoKSBfX2FzbV9fKCJfc3RhcnQiKTsKK3ZvaWQgX3N0YXJ0KCkKK3sKK30KKwordm9pZCBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuaW5pdCIpKSkKK19pbml0KCkKK3sKK30KKworaW50IGZvbygpIF9fYXNtX18oImZvbyIpOworaW50IGZvbygpCit7CisgIHN0YXRpYyBpbnQgeCA9IDE7CisgIHJldHVybiB4Kys7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzMuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyYmM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYwpAQCAtMCwwICsxLDMzIEBACitzdHJ1Y3QgQQoreworICB2aXJ0dWFsIHZvaWQgZm9vKCk7CisgIHZpcnR1YWwgdm9pZCBiYXIoKTsKK307CisKK3ZvaWQgQTo6Zm9vKCkgeyB9CQkJLy8ga2VlcAordm9pZCBBOjpiYXIoKSB7IH0JCQkvLyBsb29zZQorCitzdHJ1Y3QgQiA6IHB1YmxpYyBBCit7CisgIHZpcnR1YWwgdm9pZCBmb28oKTsKK307CisKK3ZvaWQgQjo6Zm9vKCkgeyB9CQkJLy8ga2VlcAorCit2b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwkvLyBrZWVwCisKK0EgYTsJCQkJCS8vIGtlZXAKK0IgYjsKK0EgKmdldG1lKCkgeyByZXR1cm4gJmE7IH0JCS8vIGtlZXAKKwordm9pZCBfc3RhcnQoKQoreworICBnZXRtZSgpLT5mb28oKTsKK30KKworLy8gSW4gYWRkaXRpb24sIGtlZXAgQSdzIHZpcnR1YWwgdGFibGUuCisKKy8vIFdlJ2xsIHdpbmQgdXAga2VlcGluZyBgYicgYW5kIHRodXMgQidzIHZpcnR1YWwgdGFibGUgYmVjYXVzZQorLy8gYGEnIGFuZCBgYicgYXJlIGJvdGggcmVmZXJlbmNlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KKworZXh0ZXJuICJDIiB2b2lkIF9fbWFpbigpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjI2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzQuY2MKQEAgLTAsMCArMSwyOCBAQAorc3RydWN0IEEKK3sKKyAgdmlydHVhbCB2b2lkIGZvbygpOworICB2aXJ0dWFsIHZvaWQgYmFyKCk7Cit9OworCit2b2lkIEE6OmZvbygpIHsgfQkJCS8vIGxvb3NlCit2b2lkIEE6OmJhcigpIHsgfQkJCS8vIGtlZXAKKworc3RydWN0IEIgOiBwdWJsaWMgQQoreworICB2aXJ0dWFsIHZvaWQgZm9vKCk7Cit9OworCit2b2lkIEI6OmZvbygpIHsgfQkJCS8vIGxvb3NlCisKK3ZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKKworQSBhOwkJCQkJLy8ga2VlcAorQiBiOworQSAqZ2V0bWUoKSB7IHJldHVybiAmYTsgfQkJLy8ga2VlcAorCit2b2lkIF9zdGFydCgpCit7CisgIGdldG1lKCktPmJhcigpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzUuY2MgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3OWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvNS5jYwpAQCAtMCwwICsxLDMyIEBACisvLyBUaGlzIHRlc3QgY3VycmVudGx5IGZhaWxzIGJlY2F1c2UgdGhlIEMrKyBmcm9udCBlbmQgZW1pdHMgYEEnIGFzCisvLyB0aGUgYmFzZSBjbGFzcyBjYWxsZWQgcmF0aGVyIHRoYW4gYEInIGFzIGl0IG91Z2h0LiAgQXQgbGVhc3QgaXQKKy8vIGlzIGVycm9yaW5nIG9uIHRoZSBzYWZlIHNpZGUuLi4KKworc3RydWN0IEEKK3sKKyAgdmlydHVhbCB2b2lkIGZvbygpOworICB2aXJ0dWFsIHZvaWQgYmFyKCk7Cit9OworCit2b2lkIEE6OmZvbygpIHsgfQkJCS8vIGxvb3NlCit2b2lkIEE6OmJhcigpIHsgfQkJCS8vIGxvb3NlCisKK3N0cnVjdCBCIDogcHVibGljIEEKK3sKKyAgdmlydHVhbCB2b2lkIGZvbygpOworfTsKKwordm9pZCBCOjpmb28oKSB7IH0JCQkvLyBrZWVwCisKK3ZvaWQgX3N0YXJ0KCkgX19hc21fXygiX3N0YXJ0Iik7CS8vIGtlZXAKKworQSBhOworQiBiOwkJCQkJLy8ga2VlcAorQiAqZ2V0bWUoKSB7IHJldHVybiAmYjsgfQkJLy8ga2VlcAorCit2b2lkIF9zdGFydCgpCit7CisgIGdldG1lKCktPmZvbygpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19tYWluKCkgeyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhOWQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cApAQCAtMCwwICsxLDIwOCBAQAorIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBzZWxlY3RpdmUgbGlua2luZyB0ZXN0cworIyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBXcml0dGVuIGJ5IENhdGhlcmluZSBNb29yZSAoY2xtQGN5Z251cy5jb20pCisjIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCisKKworIyBDT0ZGIGJhc2VkIHBvcnRzIGRvIG5vdCBzdXBwb3J0IHNlbGVjdGl2ZSBsaW5raW5nCitpZiB7W2lzdGFyZ2V0ICIqLSotY29mZiIgIiotKi1wZSJdfSB7CisgIHJldHVybgorfQorCitzZXQgdGVzdDEgInNlbGVjdGl2ZTEiCitzZXQgdGVzdDIgInNlbGVjdGl2ZTIiCitzZXQgdGVzdDMgInNlbGVjdGl2ZTMiCitzZXQgdGVzdDQgInNlbGVjdGl2ZTQiCitzZXQgdGVzdDUgInNlbGVjdGl2ZTUiCitzZXQgdGVzdDYgInNlbGVjdGl2ZTYiCisKK3NldCBjZmxhZ3MgIi13IC1PMiAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucyIgCitzZXQgY3h4ZmxhZ3MgIi1mdnRhYmxlLWdjIC1mbm8tZXhjZXB0aW9ucyAtZm5vLXJ0dGkiCitzZXQgbGRmbGFncyAiLS1nYy1zZWN0aW9ucyAtQnN0YXRpYyIKKworaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKKyAgICB1bnRlc3RlZCAkdGVzdDEKKyAgICB1bnRlc3RlZCAkdGVzdDIKKyAgICB1bnRlc3RlZCAkdGVzdDMKKyAgICB1bnRlc3RlZCAkdGVzdDQKKyAgICB1bnRlc3RlZCAkdGVzdDUKKyAgICB1bnRlc3RlZCAkdGVzdDYKKyAgICByZXR1cm4KK30KKworaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMS5jIHRtcGRpci8xLm9dfSB7CisgICAgdW5yZXNvbHZlZCAkdGVzdDEKKyAgICByZXR1cm4KK30KKworaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzEueCAiJGxkZmxhZ3MgdG1wZGlyLzEubyJdIHsKKyAgICBmYWlsICR0ZXN0MQorfSBlbHNlIHsKKyAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMS54XSB7CisJdW5yZXNvbHZlZCAkdGVzdDEKKyAgICB9IGVsc2UgeworCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRyb3BtZTEpXX0geworCQlzZW5kX2xvZyAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpXG4iCisJCXZlcmJvc2UgImRyb3BtZTEgPT0gJG5tX291dHB1dChkcm9wbWUxKSIKKwkJZmFpbCAkdGVzdDEKKwkgICAgfSBlbHNlIHsKKwkJaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMildfSB7CisJCSAgICBzZW5kX2xvZyAiZHJvcG1lMiA9PSAkbm1fb3V0cHV0KGRyb3BtZTIpXG4iCisJCSAgICB2ZXJib3NlICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMikiCisJCSAgICBmYWlsICR0ZXN0MQorCQl9IGVsc2UgeworCQkgICAgcGFzcyAkdGVzdDEKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMi5jIHRtcGRpci8yLm9dfSB7CisgICAgdW5yZXNvbHZlZCAkdGVzdDIKKyAgICByZXR1cm4KK30KKworaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzIueCAiJGxkZmxhZ3MgdG1wZGlyLzIubyJdIHsKKyAgICBmYWlsICR0ZXN0MgorfSBlbHNlIHsKKyAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7CisJdW5yZXNvbHZlZCAkdGVzdDIKKyAgICB9IGVsc2UgeworCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0geworICAgICAgICAgICAgc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKKyAgICAgICAgICAgIHZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKKyAgICAgICAgICAgIGZhaWwgJHRlc3QyCisJfSBlbHNlIHsKKyAgICAgICAgICAgIHBhc3MgJHRlc3QyCisJICAgIH0gCisJIH0KKyAgICAgfQorCitpZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKKyAgICB1bnJlc29sdmVkICR0ZXN0MworICAgIHJldHVybgorfQorCitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyAtdSBmb28gdG1wZGlyLzIubyJdIHsKKyAgICBmYWlsICR0ZXN0MworfSBlbHNlIHsKKyAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7CisJdW5yZXNvbHZlZCAkdGVzdDMKKyAgICB9IGVsc2UgeworCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dChmb28pXSB9IHsKKwkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgorCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCisJICAgIGZhaWwgJHRlc3QzCisJfSBlbHNlIHsKKwkgICAgaWYgeyRubV9vdXRwdXQoZm9vKSA9PSAwfSB7CisJCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCisJCXZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKKwkJZmFpbCAkdGVzdDMKKwkgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXNzICR0ZXN0MworCQl9CisJIH0KKyAgICAgfQorfQorCitzZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCisKK2lmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8zLmNjIHRtcGRpci8zLm9dfSB7CisgICAgdW5yZXNvbHZlZCAkdGVzdDQKKyAgICByZXR1cm4KK30KKworc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgorCitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMy54ICIkbGRmbGFncyB0bXBkaXIvMy5vIl0geworICAgZmFpbCAkdGVzdDQKK30gZWxzZSB7CisgICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyLzMueF0geworICAgICAgIHVucmVzb2x2ZWQgJHRlc3Q0CisgICAgfSBlbHNlIHsKKyAgICAgICBpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFCKV19IHsKKyAgICAgICAgICBzZW5kX2xvZyAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpXG4iCisgICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgorICAgICAgICAgIGZhaWwgJHRlc3Q0CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgaWYge1sgaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcl9fMUEpXX0geworICAgICAgICAgICAgICBzZW5kX2xvZyAiYmFyX18xQT09ICRubV9vdXRwdXQoX2Jhcl9fMUEpXG4iCisgICAgICAgICAgICAgIHZlcmJvc2UgImJhcl9fMUEgPT0gJG5tX291dHB1dChfYmFyX18xQSkiCisgICAgICAgICAgICAgIGZhaWwgJHRlc3Q0CisgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBwYXNzICR0ZXN0NAorICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9Cit9CisKK2lmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci80LmNjIHRtcGRpci80Lm9dfSB7CisgICAgdW5yZXNvbHZlZCAkdGVzdDUKKyAgICByZXR1cm4KK30KKworaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzQueCAiJGxkZmxhZ3MgdG1wZGlyLzQubyJdIHsKKyAgICBmYWlsICR0ZXN0NQorfSBlbHNlIHsKKyAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvNC54XSB7CisJdW5yZXNvbHZlZCAkdGVzdDUKKyAgICB9IGVsc2UgeworCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0geyAKKyAgICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKKyAgICAgICAgICAgIHZlcmJvc2UgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKSIKKwkgICAgZmFpbCAkdGVzdDUKKwl9IGVsc2UgeworICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUEpXX0geworCSAgICAgICAgc2VuZF9sb2cgImZvb19fMUE9PSAkbm1fb3V0cHV0KGZvb19fMUEpXG4iCisJCXZlcmJvc2UgImZvb19fMUEgPT0gJG5tX291dHB1dChmb29fXzFBKSIKKwkJZmFpbCAkdGVzdDUKKyAgICAgICAgICB9IGVsc2UgeworCSAgICAgIHBhc3MgJHRlc3Q1CisgICAgICAgICAgICAgfQorCX0KKyAgICB9Cit9CisKK3NldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKKworaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzUuY2MgdG1wZGlyLzUub119IHsKKyAgICB1bnJlc29sdmVkICR0ZXN0NgorICAgIHJldHVybgorfQorCitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvNS54ICIkbGRmbGFncyB0bXBkaXIvNS5vIl0geworICAgIGZhaWwgJHRlc3Q2Cit9IGVsc2UgeworICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci81LnhdIHsKKwl1bnJlc29sdmVkICR0ZXN0NgorICAgIH0gZWxzZSB7CisJaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQildIH0geworICAgICAgICAgICAgc2VuZF9sb2cgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKVxuIgorICAgICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgorCSAgICBmYWlsICR0ZXN0NgorCX0gZWxzZSB7CisgICAgICAgICAgICBpZiB7IFtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQSldfSB7CisJCSAgc2VuZF9sb2cgImZvb19fMUE9PSAkbm1fb3V0cHV0KGZvb19fMUEpXG4iCisJCSAgdmVyYm9zZSAiZm9vX18xQSA9PSAkbm1fb3V0cHV0KGZvb19fMUEpIgorCQkgIGZhaWwgJHRlc3Q2CisgICAgICAgICAgICB9IGVsc2UgeworCSAgICAgICBwYXNzICR0ZXN0NgorCSAgICB9CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDZkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwCkBAIC0wLDAgKzEsMTQzIEBACisjIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoIHRlc3RzCisjICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCisjCisKKyMgVGVzdCBTSCByZWxheGluZy4gIFRoaXMgdGVzdHMgdGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgYXMgd2VsbCBhcworIyB0aGUgbGlua2VyLgorCitpZiAhW2lzdGFyZ2V0IHNoKi0qLSpdIHsKKyAgICByZXR1cm4KK30KKworc2V0IHRlc3RzaW1wbGUgIlNIIHNpbXBsZSByZWxheGluZyIKKworaWYgIVtsZF9hc3NlbWJsZSAkYXMgIi1yZWxheCAkc3JjZGlyLyRzdWJkaXIvc2gxLnMiIHRtcGRpci9zaDEub10geworICAgIHVucmVzb2x2ZWQgJHRlc3RzaW1wbGUKK30gZWxzZSB7IGlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDEgIi1yZWxheCB0bXBkaXIvc2gxLm8iXSB7CisgICAgZmFpbCAkdGVzdHNpbXBsZQorfSBlbHNlIHsKKyAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvc2gxXSB7CisJdW5yZXNvbHZlZCAkdGVzdHNpbXBsZQorICAgIH0gZWxzZSB7CisJaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcildIFwKKwkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldfSB7CisJICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKKwkgICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgorCSAgICBmYWlsICR0ZXN0c2ltcGxlCisJfSBlbHNlIHsKKwkgICAgaWYgeyRubV9vdXRwdXQoYmFyKSAhPSAkbm1fb3V0cHV0KGZvbykgKyA0fSB7CisJCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCisJCXZlcmJvc2UgImZvbyA9PSAkbm1fb3V0cHV0KGZvbykiCisJCXNlbmRfbG9nICJiYXIgPT0gJG5tX291dHB1dChiYXIpXG4iCisJCXZlcmJvc2UgImJhciA9PSAkbm1fb3V0cHV0KGJhcikiCisJCWZhaWwgJHRlc3RzaW1wbGUKKwkgICAgfSBlbHNlIHsKKwkJcGFzcyAkdGVzdHNpbXBsZQorCSAgICB9CisJfQorICAgIH0KK30gfQorCitzZXQgdGVzdHNyZWMgIlNIIHJlbGF4aW5nIHRvIFMtcmVjb3JkcyIKKworaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMS5zMSAiLXJlbGF4IC1vZm9ybWF0IHNyZWMgdG1wZGlyL3NoMS5vIl0geworICAgIGZhaWwgJHRlc3RzcmVjCit9IGVsc2UgeworICAgICMgVGhlIGZpbGUgbmFtZSBpcyBlbWJlZGRlZCBpbiB0aGUgUy1yZWNvcmRzLCBzbyBjcmVhdGUgYm90aAorICAgICMgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgorICAgIGNhdGNoICJleGVjIHJtIC1mIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0CisgICAgc2VuZF9sb2cgIm12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMlxuIgorICAgIHZlcmJvc2UgIm12IHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIKKyAgICBjYXRjaCAiZXhlYyBtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiIGV4ZWNfb3V0cHV0CisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorCXZlcmJvc2UgIiRleGVjX291dHB1dCIKKwl1bnJlc29sdmVkICR0ZXN0c3JlYworICAgIH0gZWxzZSB7CisJc2VuZF9sb2cgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIgorCXZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIgorCWNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NoMSB0bXBkaXIvc2gxLnMxIiBleGVjX291dHB1dAorCWlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0geworCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIKKwkgICAgdW5yZXNvbHZlZCAkdGVzdHNyZWMKKwl9IGVsc2UgeworCSAgICBzZW5kX2xvZyAiY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMlxuIgorCSAgICB2ZXJib3NlICJjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIgorCSAgICBjYXRjaCAiZXhlYyBjbXAgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAorCSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKwkgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwkJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgorCQlmYWlsICR0ZXN0c3JlYworCSAgICB9IGVsc2UgeworCQlwYXNzICR0ZXN0c3JlYworCSAgICB9CisJfQorICAgIH0KK30KKworc2V0IHRlc3RsaW5rICJTSCByZWxheGluZyIKK3NldCB0ZXN0anNyICJTSCBjb25maXJtIHJlbGF4aW5nIgorc2V0IHRlc3RydW4gIlNIIHJlbGF4aW5nIGV4ZWN1dGlvbiIKKworaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0geworICAgIHVudGVzdGVkICR0ZXN0bGluaworICAgIHVudGVzdGVkICR0ZXN0anNyCisgICAgdW50ZXN0ZWQgJHRlc3RydW4KKyAgICByZXR1cm4KK30KKworaWYgeyFbbGRfYXNzZW1ibGUgJGFzICItcmVsYXggJHNyY2Rpci8kc3ViZGlyL3N0YXJ0LnMiIHRtcGRpci9zdGFydC5vXSBcCisgICAgIHx8ICFbbGRfY29tcGlsZSAkQ0MgIi1PIC1tcmVsYXggJHNyY2Rpci8kc3ViZGlyL3NoMi5jIiB0bXBkaXIvc2gyLm9dfSB7CisgICAgdW5yZXNvbHZlZCAkdGVzdGxpbmsKKyAgICB1bnJlc29sdmVkICR0ZXN0anNyCisgICAgdW5yZXNvbHZlZCAkdGVzdHJ1bgorICAgIHJldHVybgorfQorCitpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gyICItcmVsYXggdG1wZGlyL3N0YXJ0Lm8gdG1wZGlyL3NoMi5vIl0geworICAgIGZhaWwgJHRlc3RsaW5rCisgICAgdW5yZXNvbHZlZCAkdGVzdGpzcgorICAgIHVucmVzb2x2ZWQgJHRlc3RydW4KKyAgICByZXR1cm4KK30KKworcGFzcyAkdGVzdGxpbmsKKworc2VuZF9sb2cgIiRvYmpkdW1wIC1kIHRtcGRpci9zaDJcbiIKK3ZlcmJvc2UgIiRvYmpkdW1wIC1kIHRtcGRpci9zaDIiCitjYXRjaCAiZXhlYyAkb2JqZHVtcCAtZCB0bXBkaXIvc2gyIiBleGVjX291dHB1dAoraWYgW3N0cmluZyBtYXRjaCAiKmpzcioiICRleGVjX291dHB1dF0geworICAgIGZhaWwgJHRlc3Rqc3IKK30gZWxzZSB7CisgICAgcGFzcyAkdGVzdGpzcgorfQorCitpZiB7ICFbaW5mbyBleGlzdHMgU0lNXSB8fCBbd2hpY2ggJFNJTV0gPT0gMCB9IHsKKyAgICB1bnRlc3RlZCAkdGVzdHJ1bgorICAgIHJldHVybgorfQorCitzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyAkU0lNIHRtcGRpci9zaDIiIGV4ZWNfb3V0cHV0XQoraWYgeyAkc3RhdHVzID09IDAgfSB7CisgICAgcGFzcyAkdGVzdHJ1bgorfSBlbHNlIHsKKyAgICBmYWlsICR0ZXN0cnVuCit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2gxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4ZTQzOQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucwpAQCAtMCwwICsxLDEzIEBACisJLnRleHQKK2ZvbzoKK0wxOgkKKwltb3YubAlMMixyMAorCS51c2VzCUwxCisJanNyCUByMAorCXJ0cworCS5hbGlnbgkyCitMMjoKKwkubG9uZwliYXIKK2JhcjoKKwlydHMKKwkuYWxpZ24JNApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2ZlODgKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMKQEAgLTAsMCArMSwxMjAgQEAKK2ludCBnbG9iYWw7CisKK2V4dGVybiB2b2lkIHRyYXAgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHF1aXQgKGludCk7CitzdGF0aWMgaW50IGZvbyAoaW50KTsKKworaW50CittYWluICgpCit7CisgIGlmIChmb28gKDApICE9IDAgfHwgZ2xvYmFsICE9IDApCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDEpICE9IDEgfHwgZ2xvYmFsICE9IDEpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDIpICE9IDIgfHwgZ2xvYmFsICE9IDIpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDMpICE9IDMgfHwgZ2xvYmFsICE9IDMpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDQpICE9IDQgfHwgZ2xvYmFsICE9IDQpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDUpICE9IDUgfHwgZ2xvYmFsICE9IDUpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDYpICE9IDYgfHwgZ2xvYmFsICE9IDYpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDcpICE9IDcgfHwgZ2xvYmFsICE9IDcpCisgICAgcXVpdCAoMSk7CisgIGlmIChmb28gKDgpICE9IDggfHwgZ2xvYmFsICE9IDgpCisgICAgcXVpdCAoMSk7CisgIHF1aXQgKDApOworfQorCit2b2lkCitfX21haW4gKCkKK3sKK30KKworc3RhdGljIHZvaWQKK3F1aXQgKGludCBzdGF0dXMpCit7CisgIHRyYXAgKDEsIHN0YXR1cyk7Cit9CisKK2ludAorYmFyIChpbnQgaSkKK3sKKyAgZ2xvYmFsID0gaTsKKyAgcmV0dXJuIGk7Cit9CisKK2ludAorYmFyMCAoaW50IGkpCit7CisgIGdsb2JhbCA9IDA7CisgIHJldHVybiBpOworfQorCitpbnQKK2JhcjEgKGludCBpKQoreworICBnbG9iYWwgPSAxOworICByZXR1cm4gaTsKK30KKworaW50CitiYXIyIChpbnQgaSkKK3sKKyAgZ2xvYmFsID0gMjsKKyAgcmV0dXJuIGk7Cit9CisKK2ludAorYmFyMyAoaW50IGkpCit7CisgIGdsb2JhbCA9IDM7CisgIHJldHVybiBpOworfQorCitpbnQKK2JhcjQgKGludCBpKQoreworICBnbG9iYWwgPSA0OworICByZXR1cm4gaTsKK30KKworaW50CitiYXI1IChpbnQgaSkKK3sKKyAgZ2xvYmFsID0gNTsKKyAgcmV0dXJuIGk7Cit9CisKK2ludAorYmFyNiAoaW50IGkpCit7CisgIGdsb2JhbCA9IDY7CisgIHJldHVybiBpOworfQorCitpbnQKK2JhcjcgKGludCBpKQoreworICBnbG9iYWwgPSA3OworICByZXR1cm4gaTsKK30KKworaW50Citmb28gKGludCBpKQoreworICBzd2l0Y2ggKGkpCisgICAgeworICAgIGNhc2UgMDogYmFyMCAoMCk7IHJldHVybiAwOworICAgIGNhc2UgMTogYmFyMSAoMSk7IHJldHVybiAxOworICAgIGNhc2UgMjogYmFyMiAoMik7IHJldHVybiAyOworICAgIGNhc2UgMzogYmFyMyAoMyk7IHJldHVybiAzOworICAgIGNhc2UgNDogYmFyNCAoNCk7IHJldHVybiA0OworICAgIGNhc2UgNTogYmFyNSAoNSk7IHJldHVybiA1OworICAgIGNhc2UgNjogYmFyNiAoNik7IHJldHVybiA2OworICAgIGNhc2UgNzogYmFyNyAoNyk7IHJldHVybiA3OworICAgIGRlZmF1bHQ6IHJldHVybiBiYXIgKGkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmNGM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zCkBAIC0wLDAgKzEsMjcgQEAKKwkuc2VjdGlvbiAudGV4dAorCS5nbG9iYWwJc3RhcnQKK3N0YXJ0OgorCisJbW92LmwJc3RhY2tfayxyMTUKKworCSEgY2FsbCB0aGUgbWFpbmxpbmUJCitMMToJCisJbW92LmwJbWFpbl9rLHIwCisJLnVzZXMJTDEKKwlqc3IJQHIwCisJbm9wCisKKwkuYWxpZ24gMgorc3RhY2tfazoKKwkubG9uZwlfc3RhY2sJCittYWluX2s6CisJLmxvbmcJX21haW4KKworCS5nbG9iYWwgX3RyYXAKK190cmFwOgkKKwl0cmFwYSAjMworCXJ0cworCW5vcAorCisJLnNlY3Rpb24gLnN0YWNrCitfc3RhY2s6CS5sb25nCTB4ZGVhZGRlYWQKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvZWxmLW9mZnNldC5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmU0MjkzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkCkBAIC0wLDAgKzEsMTY4IEBACitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IDB4MTAwMDAwOworICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLmdudS52ZXJzaW9uICAgOiB7ICooLmdudS52ZXJzaW9uKQl9CisgIC5nbnUudmVyc2lvbl9kICAgOiB7ICooLmdudS52ZXJzaW9uX2QpCX0KKyAgLmdudS52ZXJzaW9uX3IgICA6IHsgKiguZ251LnZlcnNpb25fcikJfQorICAucmVsLnRleHQgICAgICA6CisgICAgeworICAgICAgKigucmVsLnRleHQpCisgICAgICAqKC5yZWwudGV4dC4qKQorICAgICAgKigucmVsLmdudS5saW5rb25jZS50KikKKyAgICB9CisgIC5yZWxhLnRleHQgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnRleHQpCisgICAgICAqKC5yZWxhLnRleHQuKikKKyAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLnQqKQorICAgIH0KKyAgLnJlbC5kYXRhICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5kYXRhKQorICAgICAgKigucmVsLmRhdGEuKikKKyAgICAgICooLnJlbC5nbnUubGlua29uY2UuZCopCisgICAgfQorICAucmVsYS5kYXRhICAgICA6CisgICAgeworICAgICAgKigucmVsYS5kYXRhKQorICAgICAgKigucmVsYS5kYXRhLiopCisgICAgICAqKC5yZWxhLmdudS5saW5rb25jZS5kKikKKyAgICB9CisgIC5yZWwucm9kYXRhICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucm9kYXRhKQorICAgICAgKigucmVsLnJvZGF0YS4qKQorICAgICAgKigucmVsLmdudS5saW5rb25jZS5yKikKKyAgICB9CisgIC5yZWxhLnJvZGF0YSAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnJvZGF0YSkKKyAgICAgICooLnJlbGEucm9kYXRhLiopCisgICAgICAqKC5yZWxhLmdudS5saW5rb25jZS5yKikKKyAgICB9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX0KKyAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfQorICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX0KKyAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgS0VFUCAoKiguaW5pdCkpCX0KKyAgLnBsdCAgICAgIDogeyAqKC5wbHQpCX0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAqKC50ZXh0KQorICAgICooLnRleHQuKikKKyAgICAqKC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICAgICooLmdudS5saW5rb25jZS50KikKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAuZmluaSAgICAgIDogeyBLRUVQICgqKC5maW5pKSkJCX0gPTB4OTA5MAorICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGEuKikKKyAgICAqKC5nbnUubGlua29uY2UuciopCisgIH0KKyAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOKDB4MTAwMCkgKyAoLiAmICgweDEwMDAgLSAxKSk7CisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YS4qKQorICAgICooLmdudS5saW5rb25jZS5kKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH0KKyAgLmN0b3JzICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgY29uc3RydWN0b3JzLCBzbworICAgICAgIHdlIG1ha2Ugc3VyZSBpdCBpcyBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90IGFjdHVhbGx5IGxpbmsgYWdhaW5zdAorICAgICAgIGNydGJlZ2luLm87IHRoZSBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2gKKyAgICAgICBkaXJlY3RvcnkgY3J0YmVnaW4ubyBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmdvdCAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQorICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSAqKC5zZGF0YS4qKSB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovCit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2ZkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL21haW4uYwpAQCAtMCwwICsxLDgxIEBACisvKiBUaGlzIGlzIHRoZSBtYWluIHByb2dyYW0gZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0LiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWludmFyID0gMTsKK2ludCBvdmVycmlkZGVudmFyID0gMjsKK2V4dGVybiBpbnQgc2hsaWJ2YXIxOworCitleHRlcm4gaW50IHNobGliX21haW52YXIgKCk7CitleHRlcm4gaW50IHNobGliX292ZXJyaWRkZW52YXIgKCk7CitleHRlcm4gaW50IHNobGliX3NobGlidmFyMSAoKTsKK2V4dGVybiBpbnQgc2hsaWJfc2hsaWJ2YXIyICgpOworZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGwgKCk7CitleHRlcm4gaW50IHNobGliX21haW5jYWxsICgpOworZXh0ZXJuIGludCBzaGxpYl9jaGVja2Z1bnB0cjEgKCk7CitleHRlcm4gaW50IHNobGliX2NoZWNrZnVucHRyMiAoKTsKK2V4dGVybiBpbnQgKCpzaGxpYl9nZXRmdW5wdHIxICgpKSAoKTsKK2V4dGVybiBpbnQgKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKTsKK2V4dGVybiBpbnQgc2hsaWJfY2hlY2sgKCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzaGFyZWQgbGlicmFyeS4gICovCisKK2ludAorbWFpbl9jYWxsZWQgKCkKK3sKKyAgcmV0dXJuIDY7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIGEgZnVuY3Rpb24gaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKworaW50CitzaGxpYl9vdmVycmlkZGVuY2FsbDIgKCkKK3sKKyAgcmV0dXJuIDg7Cit9CisKK2ludAorbWFpbiAoKQoreworICBpbnQgKCpwKSAoKTsKKworICBwcmludGYgKCJtYWludmFyID09ICVkXG4iLCBtYWludmFyKTsKKyAgcHJpbnRmICgib3ZlcnJpZGRlbnZhciA9PSAlZFxuIiwgb3ZlcnJpZGRlbnZhcik7CisgIHByaW50ZiAoInNobGlidmFyMSA9PSAlZFxuIiwgc2hsaWJ2YXIxKTsKKyNpZm5kZWYgWENPRkZfVEVTVAorICBwcmludGYgKCJzaGxpYl9tYWludmFyICgpID09ICVkXG4iLCBzaGxpYl9tYWludmFyICgpKTsKKyAgcHJpbnRmICgic2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAlZFxuIiwgc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSk7CisjZW5kaWYKKyAgcHJpbnRmICgic2hsaWJfc2hsaWJ2YXIxICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYnZhcjEgKCkpOworICBwcmludGYgKCJzaGxpYl9zaGxpYnZhcjIgKCkgPT0gJWRcbiIsIHNobGliX3NobGlidmFyMiAoKSk7CisgIHByaW50ZiAoInNobGliX3NobGliY2FsbCAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJjYWxsICgpKTsKKyNpZm5kZWYgWENPRkZfVEVTVAorICBwcmludGYgKCJzaGxpYl9zaGxpYmNhbGwyICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYmNhbGwyICgpKTsKKyAgcHJpbnRmICgic2hsaWJfbWFpbmNhbGwgKCkgPT0gJWRcbiIsIHNobGliX21haW5jYWxsICgpKTsKKyNlbmRpZgorICBwcmludGYgKCJtYWluX2NhbGxlZCAoKSA9PSAlZFxuIiwgbWFpbl9jYWxsZWQgKCkpOworICBwcmludGYgKCJzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gJWRcbiIsCisJICBzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkpOworI2lmbmRlZiBYQ09GRl9URVNUCisgIHByaW50ZiAoInNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpID09ICVkXG4iLAorCSAgc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkpOworI2VuZGlmCisgIHAgPSBzaGxpYl9nZXRmdW5wdHIxICgpOworICBwcmludGYgKCJzaGxpYl9nZXRmdW5wdHIxICgpICIpOworICBpZiAocCA9PSBzaGxpYl9zaGxpYnZhcjEpCisgICAgcHJpbnRmICgiPT0iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiE9Iik7CisgIHByaW50ZiAoIiBzaGxpYl9zaGxpYnZhcjFcbiIpOworI2lmbmRlZiBYQ09GRl9URVNUCisgIHAgPSBzaGxpYl9nZXRmdW5wdHIyICgpOworICBwcmludGYgKCJzaGxpYl9nZXRmdW5wdHIyICgpICIpOworICBpZiAocCA9PSBtYWluX2NhbGxlZCkKKyAgICBwcmludGYgKCI9PSIpOworICBlbHNlCisgICAgcHJpbnRmICgiIT0iKTsKKyAgcHJpbnRmICgiIG1haW5fY2FsbGVkXG4iKTsKKyNlbmRpZgorICBwcmludGYgKCJzaGxpYl9jaGVjayAoKSA9PSAlZFxuIiwgc2hsaWJfY2hlY2sgKCkpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWUwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiBUaGlzIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGxkIHRlc3QuICBUaGlzIGZpbGUgYmVjb21lcyBwYXJ0CisgICBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKworLyogVGhpcyB2YXJpYWJsZSBpcyBzdXBwbGllZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KKyNpZm5kZWYgWENPRkZfVEVTVAorZXh0ZXJuIGludCBtYWludmFyOworI2VuZGlmCisKKy8qIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnksIGFuZCBvdmVycmlkZGVuIGJ5CisgICB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KKyNpZm5kZWYgWENPRkZfVEVTVAoraW50IG92ZXJyaWRkZW52YXIgPSAtMTsKKyNlbmRpZgorCisvKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KK2ludCBzaGxpYnZhcjEgPSAzOworCisvKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgYnkgYW5vdGhlciBvYmplY3QgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KK2V4dGVybiBpbnQgc2hsaWJ2YXIyOworCisvKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSB2YWx1ZXMgb2YgdGhlIGFib3ZlIHZhcmlhYmxlcyBhcyBzZWVuIGluCisgICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworCisjaWZuZGVmIFhDT0ZGX1RFU1QKK2ludAorc2hsaWJfbWFpbnZhciAoKQoreworICByZXR1cm4gbWFpbnZhcjsKK30KKyNlbmRpZgorCisjaWZuZGVmIFhDT0ZGX1RFU1QKK2ludAorc2hsaWJfb3ZlcnJpZGRlbnZhciAoKQoreworICByZXR1cm4gb3ZlcnJpZGRlbnZhcjsKK30KKyNlbmRpZgorCitpbnQKK3NobGliX3NobGlidmFyMSAoKQoreworICByZXR1cm4gc2hsaWJ2YXIxOworfQorCitpbnQKK3NobGliX3NobGlidmFyMiAoKQoreworICByZXR1cm4gc2hsaWJ2YXIyOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhbm90aGVyIG9iamVjdCBpbiB0aGUKKyAgIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKworZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGxlZCAoKTsKKworaW50CitzaGxpYl9zaGxpYmNhbGwgKCkKK3sKKyAgcmV0dXJuIHNobGliX3NobGliY2FsbGVkICgpOworfQorCisjaWZuZGVmIFhDT0ZGX1RFU1QKKy8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoaXMgb2JqZWN0IGluIHRoZSBzaGFyZWQKKyAgIGxpYnJhcnkuICBUaGUgbWFpbiBwcm9ncmFtIHdpbGwgb3ZlcnJpZGUgdGhlIGNhbGxlZCBmdW5jdGlvbi4gICovCisKK2V4dGVybiBpbnQgc2hsaWJfb3ZlcmlkZGVuY2FsbDIgKCk7CisKK2ludAorc2hsaWJfc2hsaWJjYWxsMiAoKQoreworICByZXR1cm4gc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpOworfQorCitpbnQKK3NobGliX292ZXJyaWRkZW5jYWxsMiAoKQoreworICByZXR1cm4gNzsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgbWFpbiBwcm9ncmFtLiAgKi8KKworI2lmbmRlZiBYQ09GRl9URVNUCitleHRlcm4gaW50IG1haW5fY2FsbGVkICgpOworCitpbnQKK3NobGliX21haW5jYWxsICgpCit7CisgIHJldHVybiBtYWluX2NhbGxlZCAoKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gc2hsaWJfbWFpbnZhci4gIEl0CisgICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLworCitpbnQgCitzaGxpYl9jaGVja2Z1bnB0cjEgKHApCisgICAgIGludCAoKnApICgpOworeworICByZXR1cm4gcCA9PSBzaGxpYl9zaGxpYnZhcjE7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIGEgZnVuY3Rpb24gcG9pbnRlciB0byBtYWluX2NhbGxlZC4gIEl0CisgICBjb25maXJtcyB0aGF0IHRoZSBwb2ludGVyIGNvbXBhcmVzIGVxdWFsbHkuICAqLworCisjaWZuZGVmIFhDT0ZGX1RFU1QKK2ludAorc2hsaWJfY2hlY2tmdW5wdHIyIChwKQorICAgICBpbnQgKCpwKSAoKTsKK3sKKyAgcmV0dXJuIHAgPT0gbWFpbl9jYWxsZWQ7Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBzaGxpYl9tYWludmFyLiAgKi8KKworaW50CisoKnNobGliX2dldGZ1bnB0cjEgKCkpICgpCit7CisgIHJldHVybiBzaGxpYl9zaGxpYnZhcjE7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gbWFpbl9jYWxsZWQuICAqLworCisjaWZuZGVmIFhDT0ZGX1RFU1QKK2ludAorKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKQoreworICByZXR1cm4gbWFpbl9jYWxsZWQ7Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29uc3RhbnQgZGF0YSBhbmQgbG9jYWwgZnVuY3Rpb25zCisgICB3b3JrLiAgKi8KKworI2lmbmRlZiBfX1NURENfXworI2RlZmluZSBjb25zdAorI2VuZGlmCisKK3N0YXRpYyBpbnQgaSA9IDY7CitzdGF0aWMgY29uc3QgY2hhciAqc3RyID0gIkhlbGxvLCB3b3JsZFxuIjsKKworaW50CitzaGxpYl9jaGVjayAoKQoreworICBjb25zdCBjaGFyICpzMSwgKnMyOworCisgIGlmIChpICE9IDYpCisgICAgcmV0dXJuIDA7CisKKyAgLyogVG8gaXNvbGF0ZSB0aGUgdGVzdCwgZG9uJ3QgcmVseSBvbiBhbnkgZXh0ZXJuYWwgZnVuY3Rpb25zLCBzdWNoCisgICAgIGFzIHN0cmNtcC4gICovCisgIHMxID0gIkhlbGxvLCB3b3JsZFxuIjsKKyAgczIgPSBzdHI7CisgIHdoaWxlICgqczEgIT0gJ1wwJykKKyAgICBpZiAoKnMxKysgIT0gKnMyKyspCisgICAgICByZXR1cm4gMDsKKyAgaWYgKCpzMiAhPSAnXDAnKQorICAgIHJldHVybiAwOworCisgIGlmIChzaGxpYl9zaGxpYnZhcjEgKCkgIT0gMykKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2E0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMi5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgaXMgcGFydCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgbGQgdGVzdC4gIFRoaXMgZmlsZSBiZWNvbWVzIHBhcnQKKyAgIG9mIGEgc2hhcmVkIGxpYnJhcnkuICAqLworCisvKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaGVyZSwgYW5kIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBmaWxlIGluCisgICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworaW50IHNobGlidmFyMiA9IDQ7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFub3RoZXIgZmlsZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworCitpbnQKK3NobGliX3NobGliY2FsbGVkICgpCit7CisgIHJldHVybiA1OworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZWUzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5kYXQKQEAgLTAsMCArMSwxNiBAQAorbWFpbnZhciA9PSAxCitvdmVycmlkZGVudmFyID09IDIKK3NobGlidmFyMSA9PSAzCitzaGxpYl9tYWludmFyICgpID09IDEKK3NobGliX292ZXJyaWRkZW52YXIgKCkgPT0gMgorc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKK3NobGliX3NobGlidmFyMiAoKSA9PSA0CitzaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQorc2hsaWJfc2hsaWJjYWxsMiAoKSA9PSA4CitzaGxpYl9tYWluY2FsbCAoKSA9PSA2CittYWluX2NhbGxlZCAoKSA9PSA2CitzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMQorc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gMQorc2hsaWJfZ2V0ZnVucHRyMSAoKSA9PSBzaGxpYl9zaGxpYnZhcjEKK3NobGliX2dldGZ1bnB0cjIgKCkgPT0gbWFpbl9jYWxsZWQKK3NobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM5YzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwCkBAIC0wLDAgKzEsMjY0IEBACisjIEV4cGVjdCBzY3JpcHQgZm9yIGxkLXNoYXJlZCB0ZXN0cworIyAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQorIworCisjIE1ha2Ugc3VyZSB0aGF0IGxkIGNhbiBnZW5lcmF0ZSBFTEYgc2hhcmVkIGxpYnJhcmllcy4KKyMgTm90ZSB0aGF0IGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBpcyB0ZXN0ZWQgYnkgdGhlCisjIGJvb3RzdHJhcCB0ZXN0LgorCisjIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgbGQgZ2VuZXJhdGVzIG5hdGl2ZSBleGVjdXRhYmxlcy4KK2lmICFbaXNuYXRpdmVdIHRoZW4ge3JldHVybn0KKworIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIGEgY291cGxlIG9mIEVMRiBwbGF0Zm9ybXMuCisjIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KK2lmIHsgIVtpc3RhcmdldCBpMzg2LSotc3lzdjQqXSBcCisgICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLXN5c3Y0Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1zeXN2NCpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotdW5peHdhcmVdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotdW5peHdhcmVdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotdW5peHdhcmVdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotZWxmKl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi1lbGYqXSBcCisgICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLWVsZipdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBpMzg2LSotbGludXgqXSBcCisgICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLWxpbnV4Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi1saW51eCpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCisgICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKKyAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCisgICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCisgICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSBcCisgICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc3Vub3M0Kl0gXAorICAgICAmJiAhW2lzdGFyZ2V0IHJzNjAwMCotKi1haXgqXSBcCisgICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYyotKi1haXgqXSB9IHsKKyAgICByZXR1cm4KK30KKworaWYgeyBbaXN0YXJnZXQgaTM4Ni0qLWxpbnV4YW91dCpdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGk0ODYtKi1saW51eGFvdXQqXSBcCisgICAgIHx8IFtpc3RhcmdldCBpNTg2LSotbGludXhhb3V0Kl0gXAorICAgICB8fCBbaXN0YXJnZXQgaTM4Ni0qLWxpbnV4b2xkbGQqXSBcCisgICAgIHx8IFtpc3RhcmdldCBpNDg2LSotbGludXhvbGRsZCpdIFwKKyAgICAgfHwgW2lzdGFyZ2V0IGk1ODYtKi1saW51eG9sZGxkKl0gXAorICAgICB8fCBbaXN0YXJnZXQgbTY4ay0qLWxpbnV4YW91dCpdIH0geworICAgIHJldHVybgorfQorCitzZXQgdG1wZGlyIHRtcGRpcgorc2V0IFNIQ0ZMQUcgIiIKKworaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0geworCisgICAgIyBBSVggc2hhcmVkIGxpYnJhcmllcyBkbyBub3Qgc2VlbSB0byBzdXBwb3J0IHVzZWZ1bCBmZWF0dXJlcywKKyAgICAjIGxpa2Ugb3ZlcnJpZGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gb3IgbGV0dGluZyB0aGUKKyAgICAjIHNoYXJlZCBsaWJyYXJ5IHJlZmVyIHRvIG9iamVjdHMgZGVmaW5lZCBpbiB0aGUgbWFpbiBwcm9ncmFtLiAgV2UKKyAgICAjIGF2b2lkIHRlc3RpbmcgdGhvc2UgZmVhdHVyZXMuCisgICAgc2V0IFNIQ0ZMQUcgIi1EWENPRkZfVEVTVCIKKworICAgICMgVGhlIEFJWCAzLjIuNSBsb2FkZXIgYXBwZWFycyB0byByYW5kb21seSBmYWlsIHdoZW4gbG9hZGluZworICAgICMgc2hhcmVkIGxpYnJhcmllcyBmcm9tIE5TRiBtb3VudGVkIHBhcnRpdGlvbnMsIHNvIHdlIGF2b2lkIGFueQorICAgICMgcG90ZW50aWFsIHByb2JsZW1zIGJ5IHVzaW5nIGEgbG9jYWwgZGlyZWN0b3J5LgorICAgIGNhdGNoIHtleGVjIC9iaW4vc2ggLWMgImVjaG8gJCQifSBwaWQKKyAgICBzZXQgdG1wZGlyIC91c3IvdG1wL2xkLiRwaWQKKyAgICBjYXRjaCAiZXhlYyBta2RpciAkdG1wZGlyIiBleGVjX3N0YXR1cworCisgICAgIyBPbiBBSVgsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBleHBvcnQgdGhlIHN5bWJvbHMgdGhlIHNoYXJlZAorICAgICMgbGlicmFyeSBpcyBnb2luZyB0byBwcm92aWRlLCBhbmQgbmVlZC4KKyAgICBzZXQgZmlsZSBbb3BlbiAkdG1wZGlyL3hjb2ZmLmV4cCB3XQorICAgIHB1dHMgJGZpbGUgc2hsaWJ2YXIxCisgICAgcHV0cyAkZmlsZSBzaGxpYnZhcjIKKyAgICBwdXRzICRmaWxlIHNobGliX3NobGlidmFyMQorICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJ2YXIyCisgICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYmNhbGwKKyAgICBwdXRzICRmaWxlIHNobGliX3NobGliY2FsbGVkCisgICAgcHV0cyAkZmlsZSBzaGxpYl9jaGVja2Z1bnB0cjEKKyAgICBwdXRzICRmaWxlIHNobGliX2dldGZ1bnB0cjEKKyAgICBwdXRzICRmaWxlIHNobGliX2NoZWNrCisgICAgY2xvc2UgJGZpbGUKK30KKworIyBUaGUgdGVzdCBwcm9jZWR1cmUuCitwcm9jIHNoYXJlZF90ZXN0IHsgcHJvZ25hbWUgdGVzdG5hbWUgbWFpbiBzaDEgc2gyIGRhdCBhcmdzIH0geworICAgIGdsb2JhbCBsZAorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIGV4ZWNfb3V0cHV0CisgICAgZ2xvYmFsIGhvc3RfdHJpcGxldAorICAgIGdsb2JhbCB0bXBkaXIKKworICAgIGlmIFtsbGVuZ3RoICRhcmdzXSB7IHNldCBzaGxkZmxhZ3MgW2xpbmRleCAkYXJncyAwXSB9IGVsc2UgeyBzZXQgc2hsZGZsYWdzICIiIH0KKworICAgICMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJ5LgorICAgICMgT24gQUlYLCB3ZSBuZWVkIHRvIHVzZSBhbiBleHBvcnQgZmlsZS4KKyAgICBzZXQgc2hhcmVkIC1zaGFyZWQKKyAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisJc2V0IHNoYXJlZCAiLWJNOlNSRSAtYkU6JHRtcGRpci94Y29mZi5leHAiCisgICAgfQorICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRwcm9nbmFtZS5zbyAiJHNoYXJlZCAkc2hsZGZsYWdzICR0bXBkaXIvJHNoMSAkdG1wZGlyLyRzaDIiXX0geworICAgICAgICBmYWlsICIkdGVzdG5hbWUiCisgICAgCXJldHVybgorICAgIH0KKworICAgICMgTGluayBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4gIFVzZSAtcnBhdGggc28gdGhhdCB0aGUKKyAgICAjIGR5bmFtaWMgbGlua2VyIGNhbiBsb2NhdGUgdGhlIHNoYXJlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUuCisgICAgIyBPbiBBSVgsIHdlIG11c3QgaW5jbHVkZSAvbGliIGluIC1ycGF0aCwgYXMgb3RoZXJ3aXNlIHRoZSBsb2FkZXIKKyAgICAjIGNhbiBub3QgZmluZCAtbGMuCisgICAgc2V0IHJwYXRoICR0bXBkaXIKKyAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisJc2V0IHJwYXRoIC9saWI6JHRtcGRpcgorICAgIH0KKyAgICBpZiAhW2xkX2xpbmsgJGxkICR0bXBkaXIvJHByb2duYW1lICItcnBhdGggJHJwYXRoICR0bXBkaXIvJG1haW4gJHRtcGRpci8kcHJvZ25hbWUuc28iXSB7CisgICAgCWZhaWwgIiR0ZXN0bmFtZSIKKyAgICAJcmV0dXJuCisgICAgfQorCisgICAgIyBSdW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtCisgICAgc2VuZF9sb2cgIiR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXRcbiIKKyAgICB2ZXJib3NlICIkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0IgorICAgIGNhdGNoICJleGVjICR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXQiIGV4ZWNfb3V0cHV0CisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgorCWZhaWwgIiR0ZXN0bmFtZSIKKyAgICAJcmV0dXJuCisgICAgfQorCisgICAgc2VuZF9sb2cgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdFxuIgorICAgIHZlcmJvc2UgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdCIKKyAgICBjYXRjaCAiZXhlYyBkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXQiIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisKKyAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7CisJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorCXZlcmJvc2UgIiRleGVjX291dHB1dCIKKwlmYWlsICIkdGVzdG5hbWUiCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIHBhc3MgIiR0ZXN0bmFtZSIKK30KKworaWYgW2lzdGFyZ2V0IG1pcHMqLSotKl0geworICAgIHNldCBwaWNmbGFnICIiCit9IGVsc2UgeworICAgICMgVW5mb3J0dW5hdGVseSwgdGhlIGdjYyBhcmd1bWVudCBpcyAtZnBpYyBhbmQgdGhlIGNjIGFyZ3VtZW50IGlzCisgICAgIyAtS1BJQy4gIFdlIGhhdmUgdG8gdHJ5IGJvdGguCisgICAgc2V0IHBpY2ZsYWcgIi1mcGljIgorICAgIHNlbmRfbG9nICIkQ0MgJHBpY2ZsYWdcbiIKKyAgICB2ZXJib3NlICIkQ0MgJHBpY2ZsYWciCisgICAgY2F0Y2ggImV4ZWMgJENDICRwaWNmbGFnIiBleGVjX291dHB1dAorICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKyAgICB2ZXJib3NlICItLSIgIiRleGVjX291dHB1dCIKKyAgICBpZiB7IFtzdHJpbmcgbWF0Y2ggIippbGxlZ2FsIG9wdGlvbioiICRleGVjX291dHB1dF0gXAorCSB8fCBbc3RyaW5nIG1hdGNoICIqb3B0aW9uIGlnbm9yZWQqIiAkZXhlY19vdXRwdXRdIFwKKwkgfHwgW3N0cmluZyBtYXRjaCAiKnVucmVjb2duaXplZCBvcHRpb24qIiAkZXhlY19vdXRwdXRdIFwKKwkgfHwgW3N0cmluZyBtYXRjaCAiKnBhc3NlZCB0byBsZCoiICRleGVjX291dHB1dF0gfSB7CisJaWYgW2lzdGFyZ2V0ICotKi1zdW5vczQqXSB7CisJICAgIHNldCBwaWNmbGFnICItcGljIgorCX0gZWxzZSB7CisJICAgIHNldCBwaWNmbGFnICItS1BJQyIKKwl9CisgICAgfQorfQordmVyYm9zZSAiVXNpbmcgJHBpY2ZsYWcgdG8gY29tcGlsZSBQSUMgY29kZSIKKworIyBDb21waWxlIHRoZSBtYWluIHByb2dyYW0uCitpZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbm5wLm9dIHsKKyAgICB1bnJlc29sdmVkICJzaGFyZWQgKG5vbiBQSUMpIgorICAgIHVucmVzb2x2ZWQgInNoYXJlZCIKK30gZWxzZSB7CisgICAgIyBUaGUgc2hhcmVkIGxpYnJhcnkgaXMgY29tcG9zZWQgb2YgdHdvIGZpbGVzLiAgRmlyc3QgY29tcGlsZSB0aGVtCisgICAgIyB3aXRob3V0IHVzaW5nIC1mcGljLiAgVGhhdCBzaG91bGQgd29yayBvbiBhbiBFTEYgc3lzdGVtLAorICAgICMgYWx0aG91Z2ggaXQgd2lsbCBiZSBsZXNzIGVmZmljaWVudCBiZWNhdXNlIHRoZSBkeW5hbWljIGxpbmtlcgorICAgICMgd2lsbCBuZWVkIHRvIGRvIG1vcmUgcmVsb2NhdGlvbiB3b3JrLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdAorICAgICMgdXNpbmcgLWZwaWMgd2lsbCBjYXVzZSBzb21lIG9mIHRoZSB0ZXN0cyB0byByZXR1cm4gZGlmZmVyZW50CisgICAgIyByZXN1bHRzLgorICAgIGlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMS5jICR0bXBkaXIvc2gxbnAub10KKwkgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMi5jICR0bXBkaXIvc2gybnAub10gfSB7CisJdW5yZXNvbHZlZCAic2hhcmVkIChub24gUElDKSIKKyAgICB9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisJc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub25QSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8geGNvZmYKKyAgICB9IGVsc2UgeworCSMgU3VuT1Mgbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzIGRvbid0IHBlcm1pdCBzb21lIGNhc2VzIG9mCisJIyBvdmVycmlkaW5nLgorCXNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKKwlzaGFyZWRfdGVzdCBzaG5wICJzaGFyZWQgKG5vbiBQSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8gc2hhcmVkCisKKwkjIFRlc3QgRUxGIHNoYXJlZCBsaWJyYXJ5IHJlbG9jYXRpb25zIHdpdGggYSBub24temVybyBsb2FkCisJIyBhZGRyZXNzIGZvciB0aGUgbGlicmFyeS4gIE5lYXIgYXMgSSBjYW4gdGVsbCwgdGhlIFJfKl9SRUxBVElWRQorCSMgcmVsb2NhdGlvbnMgZm9yIHZhcmlvdXMgdGFyZ2V0cyBhcmUgYnJva2VuIGluIHRoZSBjYXNlIHdoZXJlCisJIyB0aGUgbG9hZCBhZGRyZXNzIGlzIG5vdCB6ZXJvICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuCisJc2V0dXBfeGZhaWwgIiotKi1zdW5vczQqIgorCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uIFBJQywgbG9hZCBvZmZzZXQpIiBcCisJCW1haW5ucC5vIHNoMW5wLm8gc2gybnAubyBzaGFyZWQgXAorCQkiLVQgJHNyY2Rpci8kc3ViZGlyL2VsZi1vZmZzZXQubGQiCisgICAgfSB9CisKKyAgICAjIE5vdyBjb21waWxlIHRoZSBjb2RlIHVzaW5nIC1mcGljLgorCisgICAgaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gxLmMgJHRtcGRpci9zaDFwLm9dIAorCSB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gyLmMgJHRtcGRpci9zaDJwLm9dIH0geworCXVucmVzb2x2ZWQgInNoYXJlZCIKKyAgICB9IGVsc2UgeworCSMgU3VuT1MgY2FuIG5vdCBjb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvcnJlY3RseQorCWlmIFtpc3RhcmdldCAiKi0qLXN1bm9zNCoiXSB7CisJICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHN1bjQKKwl9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisJICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCisJfSBlbHNlIHsKKwkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCisJfSB9CisgICAgfQorfQorCisjIE5vdyBkbyB0aGUgc2FtZSB0ZXN0cyBhZ2FpbiwgYnV0IHRoaXMgdGltZSBjb21waWxlIG1haW4uYyBQSUMuCitpZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbnAub10geworICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgorICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4pIgorfSBlbHNlIHsKKyAgICBpZiB7IFtmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMW5wLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gybnAubyBdIH0geworICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisJICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCisJfSBlbHNlIHsKKwkgICAgIyBTdW5PUyBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMgZG9uJ3QgcGVybWl0IHNvbWUgY2FzZXMgb2YKKwkgICAgIyBvdmVycmlkaW5nLgorCSAgICBzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCisJICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAorCX0KKyAgICB9IGVsc2UgeworCXVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgorICAgIH0KKworICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxcC5vIF0gJiYgWyBmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMnAubyBdIH0geworICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisJICAgIHNoYXJlZF90ZXN0IHNobXBwICJzaGFyZWQgKFBJQyBtYWluKSIgbWFpbnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCisJfSBlbHNlIHsKKwkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCisJfQorICAgIH0gZWxzZSB7CisJdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCisgICAgfQorfQorCitpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7CisgICAgIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCisgICAgY2F0Y2ggImV4ZWMgcm0gLXJmICR0bXBkaXIiIGV4ZWNfc3RhdHVzCit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zdW40LmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTBkODdkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zdW40LmRhdApAQCAtMCwwICsxLDE2IEBACittYWludmFyID09IDEKK292ZXJyaWRkZW52YXIgPT0gMgorc2hsaWJ2YXIxID09IDMKK3NobGliX21haW52YXIgKCkgPT0gMQorc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAyCitzaGxpYl9zaGxpYnZhcjEgKCkgPT0gMworc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKK3NobGliX3NobGliY2FsbCAoKSA9PSA1CitzaGxpYl9zaGxpYmNhbGwyICgpID09IDgKK3NobGliX21haW5jYWxsICgpID09IDYKK21haW5fY2FsbGVkICgpID09IDYKK3NobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAwCitzaGxpYl9jaGVja2Z1bnB0cjIgKG1haW5fY2FsbGVkKSA9PSAxCitzaGxpYl9nZXRmdW5wdHIxICgpICE9IHNobGliX3NobGlidmFyMQorc2hsaWJfZ2V0ZnVucHRyMiAoKSA9PSBtYWluX2NhbGxlZAorc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3hjb2ZmLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA5ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKQEAgLTAsMCArMSwxMCBAQAorbWFpbnZhciA9PSAxCitvdmVycmlkZGVudmFyID09IDIKK3NobGlidmFyMSA9PSAzCitzaGxpYl9zaGxpYnZhcjEgKCkgPT0gMworc2hsaWJfc2hsaWJ2YXIyICgpID09IDQKK3NobGliX3NobGliY2FsbCAoKSA9PSA1CittYWluX2NhbGxlZCAoKSA9PSA2CitzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMQorc2hsaWJfZ2V0ZnVucHRyMSAoKSA9PSBzaGxpYl9zaGxpYnZhcjEKK3NobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMS5jIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkZTk3NwotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIFMtcmVjb3JkIGZvcm1hdC4gICovCisKK2V4dGVybiBpbnQgZTE7CitleHRlcm4gaW50IGUyOworaW50IGk7CitpbnQgaiA9IDE7CitzdGF0aWMgaW50IGs7CitzdGF0aWMgaW50IGwgPSAxOworc3RhdGljIGNoYXIgYWJbXSA9ICJUaGlzIGlzIGEgc3RyaW5nIGNvbnN0YW50IjsKKworZXh0ZXJuIGludCBmbjEgKCk7CitleHRlcm4gaW50IGZuMiAoKTsKKworaW50CittYWluICgpCit7CisgIGZuMSAoYWIpOworICBmbjIgKCJzdGF0aWMgc3RyaW5nIGNvbnN0YW50Iik7CisgIHJldHVybiBlMSArIGUyICsgaSArIGogKyBrICsgbDsKK30KKwordm9pZAorX19tYWluICgpCit7Cit9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzZjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjIuYwpAQCAtMCwwICsxLDE4IEBACisvKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBTLXJlY29yZCBmb3JtYXQuICAqLworCitpbnQgZTE7CitpbnQgZTIgPSAxOworCitpbnQKK2ZuMSAocykKKyAgICAgY2hhciAqczsKK3sKKyAgcmV0dXJuIHNbZTFdOworfQorCitpbnQKK2ZuMiAocykKKyAgICAgY2hhciAqczsKK3sKKyAgcmV0dXJuIHNbZTJdOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IzLmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTdjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjMuY2MKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIFMtcmVjb3JkIGZvcm1hdC4KKworI2RlZmluZSBGT09fTVNHX0xFTiA4MAorCitjbGFzcyBGb28geworICAgIHN0YXRpYyBpbnQgZm9vczsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGxlbiA9IEZPT19NU0dfTEVOOworICAgIGNoYXIgbWVzc2FnZVtsZW5dOworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGluaXRfZm9vICgpOworICAgIHN0YXRpYyBpbnQgbmJfZm9vcygpIHsgcmV0dXJuIGZvb3M7IH0KKyAgICBGb28oKTsKKyAgICBGb28oIGNoYXIqIG1lc3NhZ2UpOworICAgIEZvbyhjb25zdCBGb28mKTsKKyAgICBGb28gJiBvcGVyYXRvcj0gKGNvbnN0IEZvbyYpOworICAgIH5Gb28gKCk7Cit9OworCitzdGF0aWMgRm9vIHN0YXRpY19mb28oICJzdGF0aWNfZm9vIik7CisKK2ludAorbWFpbiAoKQoreworICBGb28gYXV0b21hdGljX2ZvbyggImF1dG9tYXRpY19mb28iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3Rlcm1pbmF0ZSh2b2lkKQoreworICAvKiBUaGlzIHJlY3Vyc2l2ZSBjYWxsIHByZXZlbnRzIGEgY29tcGlsZXIgd2FybmluZyB0aGF0IHRoZSBub3JldHVybgorICAgICBmdW5jdGlvbiB0ZXJtaW5hdGUgYWN0dWFsbHkgZG9lcyByZXR1cm4uICAqLworICB0ZXJtaW5hdGUgKCk7Cit9CisKK2V4dGVybiAiQyIgewordm9pZAorX19tYWluICgpCit7Cit9CisKK3ZvaWQKK19fYnVpbHRpbl9kZWxldGUgKCkKK3sKK30KKwordm9pZAorX19idWlsdGluX25ldyAoKQoreworfQorCit2b2lkCitfX3Rocm93ICgpCit7Cit9CisKK3ZvaWQKK19fdGVybWluYXRlICgpCit7Cit9CisKK3ZvaWQgKl9fZWhfcGM7CisKK3ZvaWQgKioqCitfX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4gKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgKgorX19nZXRfZWhfY29udGV4dCAoKQoreworICByZXR1cm4gMDsKK30KKworfQorCitpbnQgRm9vOjpmb29zID0gMDsKKwordm9pZCBGb286OmluaXRfZm9vICgpCit7CisgIGZvb3MgPSA4MDsKK30KKworRm9vOjpGb28gKCkKK3sKKyAgaSA9ICsrZm9vczsKK30KKworRm9vOjpGb28gKGNoYXIqIG1zZykKK3sKKyAgaSA9ICsrZm9vczsKK30KKworRm9vOjpGb28gKGNvbnN0IEZvbyYgZm9vKQoreworICBpID0gKytmb29zOworICBmb3IgKGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspCisgICAgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOworfQorCitGb28mIEZvbzo6b3BlcmF0b3I9IChjb25zdCBGb28mIGZvbykKK3sKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBGT09fTVNHX0xFTjsgaysrKQorICAgIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKKyAgcmV0dXJuICp0aGlzOworfQorCitGb286On5Gb28gKCkKK3sKKyAgZm9vcy0tOworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcmVjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E3MGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3JlYy5leHAKQEAgLTAsMCArMSwzNzQgQEAKKyMgVGVzdCBsaW5raW5nIGRpcmVjdGx5IHRvIFMtcmVjb3Jkcy4KKyMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCisjIFB1YmxpYyBkb21haW4uCisKKyMgR2V0IHRoZSBvZmZzZXQgZnJvbSBhbiBTLXJlY29yZCBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YS4KKworcHJvYyBzcmVjX29mZiB7IGwgfSB7CisgICAgaWYgW3N0cmluZyBtYXRjaCAiUzEqIiAkbF0geworCXJldHVybiA4CisgICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiUzIqIiAkbF0geworCXJldHVybiAxMAorICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIlMzKiIgJGxdIHsKKwlyZXR1cm4gMTIKKyAgICB9IGVsc2UgeworCXJldHVybiAtMQorICAgIH0gfSB9Cit9CisKKyMgU2VlIGlmIGFuIFMtcmVjb3JkIGxpbmUgY29udGFpbnMgb25seSB6ZXJvIGRhdGEuCisKK3Byb2Mgc3JlY196ZXJvIHsgbCB9IHsKKyAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFswNzg5XF0qIiAkbF0geworCXJldHVybiAxCisgICAgfQorCisgICAgIyBTdHJpcCB0aGUgYWRkcmVzcyBhbmQgY2hlY2tzdW0uCisgICAgaWYgW3N0cmluZyBtYXRjaCAiU1xbMTIzXF0qIiAkbF0geworCXNldCBsIFtzdHJpbmcgcmFuZ2UgJGwgW3NyZWNfb2ZmICRsXSBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAzXV0KKyAgICB9IGVsc2UgeworCXJldHVybiAwCisgICAgfQorCisgICAgIyBUaGUgcmVzdCBtdXN0IGJlIHplcm8uCisgICAgcmV0dXJuIFtzdHJpbmcgbWF0Y2ggIiIgW3N0cmluZyB0cmltICRsICIwIl1dCit9CisKKyMgR2V0IHRoZSBhZGRyZXNzIG9mIGFuIFMtcmVjb3JkIGxpbmUuCisKK3Byb2Mgc3JlY19hZGRyIHsgbCB9IHsKKyAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7CisJc2V0IGFkZHIgW3N0cmluZyByYW5nZSAkbCA0IFtleHByIFtzcmVjX29mZiAkbF0gLSAxXV0KKyAgICB9IGVsc2UgeworCXJldHVybiAtMQorICAgIH0KKworICAgIHJldHVybiAiMHgkYWRkciIKK30KKworIyBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGFuIFMtcmVjb3JkIGxpbmUuCisKK3Byb2Mgc3JlY19sZW4geyBsIH0geworICAgIGlmICFbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7CisJcmV0dXJuIDAKKyAgICB9CisKKyAgICByZXR1cm4gW2V4cHIgIjB4W3N0cmluZyByYW5nZSAkbCAyIDNdIiAtIChbc3JlY19vZmYgJGxdIC0gNCkgLyAyIC0gMV0KK30KKworIyBFeHRyYWN0IGJ5dGVzIGZyb20gYW4gUy1yZWNvcmQgbGluZS4KKworcHJvYyBzcmVjX2V4dHJhY3QgeyBsIHN0YXJ0IGxlbiB9IHsKKyAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KKyAgICBzZXQgcmxlbiBbc3JlY19sZW4gJGxdCisgICAgc2V0IHN0b3AgW2V4cHIgJHN0YXJ0ICsgJGxlbl0KKyAgICBpZiB7ICRzdG9wID4gJHJsZW4gfSB7CisJc2V0IHN0b3AgW2V4cHIgJHJsZW5dCisgICAgfQorICAgIHNldCBzdGFydCBbZXhwciAkc3RhcnQgKiAyICsgJG9mZl0KKyAgICBzZXQgc3RvcCBbZXhwciAkc3RvcCAqIDIgKyAkb2ZmIC0gMV0KKyAgICByZXR1cm4gW3N0cmluZyByYW5nZSAkbCAkc3RhcnQgJHN0b3BdCit9CisKKyMgU2VlIGlmIGEgcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gUy1yZWNvcmQgbGluZSBpcyBhbGwgemVyb2VzLgorCitwcm9jIHNyZWNfemVyb19yYW5nZSB7IGwgc3RhcnQgbGVuIH0geworICAgIHJldHVybiBbc3RyaW5nIG1hdGNoICIiIFtzdHJpbmcgdHJpbSBbc3JlY19leHRyYWN0ICRsICRzdGFydCAkbGVuXSAiMCJdXQorfQorCisjIFRyaW0gYW4gUy1yZWNvcmQgbGluZSBzdWNoIHRoYXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgcmVtYWluCisjIGF0IHRoZSBlbmQuCisKK3Byb2Mgc3JlY190cmltIHsgbCBsZWF2ZSB9IHsKKyAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KKyAgICBzZXQgYWRkciBbc3JlY19hZGRyICRsXQorICAgIHNldCBsZW4gW3NyZWNfbGVuICRsXQorCisgICAgaWYgeyAkbGVhdmUgPj0gJGxlbiB9IHsKKwlyZXR1cm4gJGwKKyAgICB9CisKKyAgICBzZXQgczEgW3N0cmluZyByYW5nZSAkbCAwIDFdCisgICAgc2V0IHMyIFtmb3JtYXQgIiUwMngiIFtleHByICgkb2ZmIC0gNCkgLyAyICsgJGxlYXZlICsgMV1dCisgICAgc2V0IHMzIFtmb3JtYXQgIiUwW2V4cHIgJG9mZiAtIDRdeCIgW2V4cHIgJGFkZHIgKyAkbGVuIC0gJGxlYXZlXV0KKyAgICBzZXQgczQgW3N0cmluZyByYW5nZSAkbCBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAoJGxlYXZlICogMikgLSAyXSBlbmRdCisgICAgc2V0IHMgIiR7czF9JHtzMn0ke3MzfSR7czR9IgorCisgICAgdmVyYm9zZSAic3JlY190cmltIHsgJyRsJyAkbGVhdmUgfSByZXR1cm5pbmcgJyRzJyIgMgorCisgICAgcmV0dXJuICRzCit9CisKKyMgUmVwb3J0IGZhaWx1cmUgd2hlbiBjb21wYXJpbmcgUy1yZWNvcmQgbGluZXMKKworcHJvYyBzcmVjX2NvbXBhcmVfZmFpbCB7IHdoaWNoIGwxIGwyIH0geworICAgIHNlbmRfbG9nICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDJcbiIKKyAgICB2ZXJib3NlICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDIiCit9CisKKyMgQ29tcGFyZSBTLXJlY29yZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgdG8gZnVzcyBhYm91dCB0aGluZ3MgbGlrZQorIyBleHRyYSB6ZXJvZXMuICBOb3RlIHRoYXQgQkZEIGFsd2F5cyBzb3J0cyBTLXJlY29yZHMgYnkgYWRkcmVzcy4KKworcHJvYyBzcmVjX2NvbXBhcmUgeyBmMSBmMiB9IHsKKyAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQorICAgIHNldCBlMiBbZ2V0cyAkZjIgbDJdCisKKyAgICB3aGlsZSB7ICRlMSAhPSAtMSB9IHsKKwlzZXQgbDEgW3N0cmluZyB0cmltcmlnaHQgJGwxICJcclxuIl0KKwlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KKwlpZiB7ICRlMiA9PSAtMSB9IHsKKwkgICAgIyBJZiBsMSBjb250YWlucyBkYXRhLCBpdCBtdXN0IGJlIHplcm8uCisJICAgIGlmICFbc3JlY196ZXJvICRsMV0geworCQlzZW5kX2xvZyAiZGF0YSBhZnRlciBFT0Y6ICRsMVxuIgorCQl2ZXJib3NlICJkYXRhIGFmdGVyIEVPRjogJGwxIgorCQlyZXR1cm4gMAorCSAgICB9CisJfSBlbHNlIHsgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJGwxICRsMl0gPT0gMCB9IHsKKwkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KKwkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KKwl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwxXSB9IHsKKwkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KKwl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwyXSB9IHsKKwkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KKwl9IGVsc2UgeworCSAgICAjIFRoZSBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUsIGFuZCBuZWl0aGVyIGlzIGFsbCB6ZXJvZXMuCisJICAgIHNldCBhMSBbc3JlY19hZGRyICRsMV0KKwkgICAgc2V0IG4xIFtzcmVjX2xlbiAkbDFdCisJICAgIHNldCBhMiBbc3JlY19hZGRyICRsMl0KKwkgICAgc2V0IG4yIFtzcmVjX2xlbiAkbDJdCisKKwkgICAgaWYgeyAkYTEgPCAkYTIgJiYgIVtzcmVjX3plcm9fcmFuZ2UgJGwxIDAgW2V4cHIgJGEyIC0gJGExXV0gfSB7CisJCXZlcmJvc2UgIiRhMSAkYTIgW3NyZWNfZXh0cmFjdCAkbDEgMCBbZXhwciAkYTIgLSAkYTFdXSIgMgorCQlzcmVjX2NvbXBhcmVfZmFpbCAxICRsMSAkbDIKKwkJcmV0dXJuIDAKKwkgICAgfQorCSAgICBpZiB7ICRhMiA8ICRhMSAmJiAhW3NyZWNfemVyb19yYW5nZSAkbDIgMCBbZXhwciAkYTEgLSAkYTJdXSB9IHsKKwkJc3JlY19jb21wYXJlX2ZhaWwgMiAkbDEgJGwyCisJCXJldHVybiAwCisJICAgIH0KKworCSAgICAjIEhlcmUgd2Uga25vdyB0aGF0IGFueSBpbml0aWFsIGRhdGEgaW4gYm90aCBsaW5lcyBpcworCSAgICAjIHplcm8uICBOb3cgbWFrZSBzdXJlIHRoYXQgYW55IG92ZXJsYXBwaW5nIGRhdGEgbWF0Y2hlcy4KKwkgICAgaWYgeyAkYTEgPCAkYTIgfSB7CisJCXNldCBvczEgW2V4cHIgJGEyIC0gJGExXQorCQlzZXQgb3MyIDAKKwkgICAgfSBlbHNlIHsKKwkJc2V0IG9zMSAwCisJCXNldCBvczIgW2V4cHIgJGExIC0gJGEyXQorCSAgICB9CisJICAgIGlmIHsgJGExICsgJG4xIDwgJGEyICsgJG4yIH0geworCQlzZXQgb2wgW2V4cHIgJG4xIC0gJG9zMV0KKwkgICAgfSBlbHNlIHsKKwkJc2V0IG9sIFtleHByICRuMiAtICRvczJdCisJICAgIH0KKworCSAgICBzZXQgeDEgW3NyZWNfZXh0cmFjdCAkbDEgJG9zMSAkb2xdCisJICAgIHNldCB4MiBbc3JlY19leHRyYWN0ICRsMiAkb3MyICRvbF0KKwkgICAgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJHgxICR4Ml0gIT0gMCB9IHsKKwkJdmVyYm9zZSAiJG9zMSAkb2wgJHgxIiAyCisJCXZlcmJvc2UgIiRvczIgJG9sICR4MiIgMgorCQlzcmVjX2NvbXBhcmVfZmFpbCAzICRsMSAkbDIKKwkJcmV0dXJuIDAKKwkgICAgfQorCisJICAgICMgVGhlc2Ugc3RyaW5ncyBtYXRjaC4gIFRyaW0gdGhlIGRhdGEgZnJvbSB0aGUgbGFyZ2VyCisJICAgICMgc3RyaW5nLCByZWFkIGEgbmV3IGNvcHkgb2YgdGhlIHNtYWxsZXIgc3RyaW5nLCBhbmQKKwkgICAgIyBjb250aW51ZS4KKwkgICAgaWYgeyAkYTEgKyAkbjEgPCAkYTIgKyAkbjIgfSB7CisJCXNldCBsMiBbc3JlY190cmltICRsMiBbZXhwciAoJGEyICsgJG4yKSAtICgkYTEgKyAkbjEpXV0KKwkJc2V0IGUxIFtnZXRzICRmMSBsMV0KKwkgICAgfSBlbHNlIHsgaWYgeyAkYTEgKyAkbjEgPiAkYTIgKyAkbjIgfSB7CisJCXNldCBsMSBbc3JlY190cmltICRsMSBbZXhwciAoJGExICsgJG4xKSAtICgkYTIgKyAkbjIpXV0KKwkJc2V0IGUyIFtnZXRzICRmMiBsMl0KKwkgICAgfSBlbHNlIHsKKwkJc2V0IGUxIFtnZXRzICRmMSBsMV0KKwkJc2V0IGUyIFtnZXRzICRmMiBsMl0KKwkgICAgfSB9CisJfSB9IH0gfQorICAgIH0KKworICAgICMgV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmaWxlLiAgVGhlIHJlbWFpbmRlciBvZiB0aGUKKyAgICAjIHNlY29uZCBmaWxlIG11c3QgY29udGFpbiBvbmx5IHplcm9lcy4KKyAgICB3aGlsZSB7ICRlMiAhPSAtMSB9IHsKKwlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KKwlpZiAhW3NyZWNfemVybyAkbDJdIHsKKwkgICAgc2VuZF9sb2cgImRhdGEgYWZ0ZXIgRU9GOiAkbDJcbiIKKwkgICAgdmVyYm9zZSAiZGF0YSBhZnRlciBFT0Y6ICRsMiIKKwkgICAgcmV0dXJuIDAKKwl9CisJc2V0IGUyIFtnZXRzICRmMiBsMl0KKyAgICB9CisKKyAgICByZXR1cm4gMQorfQorCisjIExpbmsgdHdpY2UsIG9iamNvcHksIGFuZCBjb21wYXJlCisKK3Byb2MgcnVuX3NyZWNfdGVzdCB7IHRlc3Qgb2JqcyB9IHsKKyAgICBnbG9iYWwgbGQKKyAgICBnbG9iYWwgb2JqY29weQorICAgIGdsb2JhbCBzaXplb2ZfaGVhZGVycworICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKKworICAgIHNldCBmbGFncyAiIgorCisgICAgIyBJZiB0aGUgbGlua2VyIHNjcmlwdCB1c2VzIFNJWkVPRl9IRUFERVJTLCB1c2UgYSAtVHRleHQgYXJndW1lbnQKKyAgICAjIHRvIGZvcmNlIGJvdGggdGhlIG5vcm1hbCBsaW5rIGFuZCB0aGUgUy1yZWNvcmQgbGluayB0byBiZSBwdXQgaW4KKyAgICAjIHRoZSBzYW1lIHBsYWNlLiAgV2UgZG9uJ3QgYWx3YXlzIHVzZSAtVHRleHQgYmVjYXVzZSBpdCBpbnRlcmFjdHMKKyAgICAjIHBvb3JseSB3aXRoIGEub3V0LgorCisgICAgaWYgeyAkc2l6ZW9mX2hlYWRlcnMgfSB7CisJc2V0IGZsYWdzICIkZmxhZ3MgLVR0ZXh0IDB4MTAwMCIKKyAgICB9CisKKyAgICAjIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKKyAgICAjIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCisgICAgIyBmdW5jdGlvbnMsIHdlIGp1c3QgZGVmaW5lIHRoZW0gb3V0LgorICAgIGlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKKwlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCisgICAgfQorCisgICAgIyBBUk0gdGFyZ2V0cyBjYWxsIF9fZ2NjbWFpbgorICAgIGlmIFtpc3RhcmdldCBhcm0tKi0qXSB7CisJc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgorICAgIH0KKyAgICAKKyAgICBpZiBbaXN0YXJnZXQgc3Ryb25nYXJtLSotKl0geworCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fZ2NjbWFpbj0wIgorICAgIH0KKyAgICAKKyAgICAjIFRodW1iIHRhcmdldHMgY2FsbCBfX2djY21haW4KKyAgICBpZiBbaXN0YXJnZXQgdGh1bWItKi0qXSB7CisJc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgorICAgIH0KKworICAgICMgUG93ZXJQQyBFQUJJIGNvZGUgY2FsbHMgX19lYWJpLgorICAgIGlmIFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSB7CisJc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19lYWJpPTAiCisgICAgfQorCisgICAgIyBtbjEwMjAwIGNvZGUgY2FsbHMgX190cnVuY3NpcHNpMl9kMF9kMi4KKyAgICBpZiB7W2lzdGFyZ2V0IG1uMTAyMDAqLSotKl19IHRoZW4geworCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fdHJ1bmNzaXBzaTJfZDBfZDI9MCIKKyAgICB9CisKKyAgICAjIFY4NTAgdGFyZ2V0cyBuZWVkIGxpYmdjYy5hCisgICAgaWYgW2lzdGFyZ2V0IHY4NTAqLSotZWxmXSB7CisJc2V0IG9ianMgIiRvYmpzIC1MIC4uL2djYyAtbGdjYyIKKyAgICB9CisgICAgCisgICAgaWYgeyAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc3IxICIkZmxhZ3MgJG9ianMiXSBcCisJIHx8ICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zcjIuc3IgIiRmbGFncyAtb2Zvcm1hdCBzcmVjICRvYmpzIl0gfSB7CisJc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCisJZmFpbCAkdGVzdAorCXJldHVybgorICAgIH0KKworICAgIHNlbmRfbG9nICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zcjEgdG1wZGlyL3NyMS5zclxuIgorICAgIHZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIgorICAgIGNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0geworCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKKwl2ZXJib3NlICIkZXhlY19vdXRwdXQiCisJdW5yZXNvbHZlZCAkdGVzdAorCXJldHVybgorICAgIH0KKworICAgIHNldCBmMSBbb3BlbiB0bXBkaXIvc3IxLnNyIHJdCisgICAgc2V0IGYyIFtvcGVuIHRtcGRpci9zcjIuc3Igcl0KKyAgICBpZiBbc3JlY19jb21wYXJlICRmMSAkZjJdIHsKKwlwYXNzICR0ZXN0CisgICAgfSBlbHNlIHsKKwlmYWlsICR0ZXN0CisgICAgfQorICAgIGNsb3NlICRmMQorICAgIGNsb3NlICRmMgorfQorCitzZXQgdGVzdDEgIlMtcmVjb3JkcyIKK3NldCB0ZXN0MiAiUy1yZWNvcmRzIHdpdGggY29uc3RydWN0b3JzIgorCisjIFNlZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNlcyBTSVpFT0ZfSEVBREVSUy4KK2NhdGNoICJleGVjICRsZCAtLXZlcmJvc2UiIGV4ZWNfb3V0cHV0CitzZXQgc2l6ZW9mX2hlYWRlcnMgW3N0cmluZyBtYXRjaCAiKlNJWkVPRl9IRUFERVJTKiIgJGV4ZWNfb3V0cHV0XQorCisjIEZpcnN0IHRlc3QgbGlua2luZyBhIEMgcHJvZ3JhbS4gIFdlIGRvbid0IHJlcXVpcmUgYW55IGxpYnJhcmllcy4gIFdlCisjIGxpbmsgaXQgbm9ybWFsbHksIGFuZCBvYmpjb3B5IHRvIHRoZSBTLXJlY29yZCBmb3JtYXQsIGFuZCB0aGVuIGxpbmsKKyMgZGlyZWN0bHkgdG8gdGhlIFMtcmVjb3JkIGZvcm1hdCwgYW5kIHJlcXVpcmUgdGhhdCB0aGUgdHdvIGZpbGVzCisjIGNvbnRhaW4gdGhlIHNhbWUgZGF0YS4KKworaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0geworICAgIHVudGVzdGVkICR0ZXN0MQorICAgIHVudGVzdGVkICR0ZXN0MgorICAgIHJldHVybgorfQorCitpZiB7ICFbbGRfY29tcGlsZSAkQ0MgJHNyY2Rpci8kc3ViZGlyL3NyMS5jIHRtcGRpci9zcjEub10gXAorICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICRzcmNkaXIvJHN1YmRpci9zcjIuYyB0bXBkaXIvc3IyLm9dIH0geworICAgIHVucmVzb2x2ZWQgJHRlc3QxCisgICAgdW5yZXNvbHZlZCAkdGVzdDIKKyAgICByZXR1cm4KK30KKworIyBUaGUgaTM4Ni1hb3V0IHRhcmdldCBpcyBjb25mdXNlZDogdGhlIGxpbmtlciBkb2VzIG5vdCBwdXQgdGhlCisjIHNlY3Rpb25zIHdoZXJlIG9iamR1bXAgZmluZHMgdGhlbS4gIEkgZG9uJ3Qga25vdyB3aGljaCBpcyB3cm9uZy4KK3NldHVwX3hmYWlsICJpKjg2LSotYW91dCoiCisKKyMgVGhlc2UgdGVzdHMgZmFpbCBvbiB0aGUgbmF0aXZlIE1JUFMgRUxGIHRhcmdldHMgYmVjYXVzZSB0aGUgR1AgdmFsdWUKKyMgaW4gdGhlIC5yZWdpbmZvIHNlY3Rpb24gaXMgbm90IHVwZGF0ZWQgd2hlbiB0aGUgUy1yZWNvcmQgdmVyc2lvbiBpcworIyB3cml0dGVuIG91dC4gIFRoZSBtaXBzLWVsZiB0YXJnZXQgaXRzZWxmIGRvZXMgbm90IHVzZSBhIC5yZWdpbmZvIHNlY3Rpb24uCitzZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiICJtaXBzKi0qLWlyaXg2KiIKKworIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgZG8gdGhlIG1hZ2ljIFRPQyBoYW5kbGluZyB0aGF0IFhDT0ZGCisjIGxpbmtlcnMgZG8uCitzZXR1cF94ZmFpbCAiKi0qLWFpeCoiICIqLSoteGNvZmYqIgorCisjIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBidWlsZCBBUk0vVGh1bWIgc3R1YnMuCitzZXR1cF94ZmFpbCAiYXJtLSotY29mZiIKK3NldHVwX3hmYWlsICJzdHJvbmdhcm0tKi0qIgorc2V0dXBfeGZhaWwgImFybS0qLXBlKiIKKyMgc2V0dXBfeGZhaWwgImFybS0qZWxmKiIKK3NldHVwX3hmYWlsICJ0aHVtYi0qLWNvZmYqIgorc2V0dXBfeGZhaWwgInRodW1iLSotcGUqIgorc2V0dXBfeGZhaWwgInRodW1iLSotZWxmKiIKKworIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgYnVpbGQgc3BlY2lhbCBFQUJJIHNlY3Rpb25zLgorc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCisKKyMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGluY2x1ZGUgdGhlIC57emRhfSBzZWN0aW9ucy4KK3NldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKKworIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgaGFuZGxlIEFscGhhIEVsZiByZWxheGF0aW9uLgorc2V0dXBfeGZhaWwgImFscGhhKi0qLWVsZioiICJhbHBoYSotKi1saW51eC1nbnUqIiAiYWxwaGEqLSotZ251KiIKK3NldHVwX3hmYWlsICJhbHBoYSotKi1uZXRic2QqIgorCitydW5fc3JlY190ZXN0ICR0ZXN0MSAidG1wZGlyL3NyMS5vIHRtcGRpci9zcjIubyIKKworIyBOb3cgdHJ5IGxpbmtpbmcgYSBDKysgcHJvZ3JhbSB3aXRoIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kCisjIGRlc3RydWN0b3JzLiAgTm90ZSB0aGF0IHNpbmNlIHdlIGFyZSBub3QgbGlua2luZyBhZ2FpbnN0IGFueQorIyBsaWJyYXJpZXMsIHRoaXMgcHJvZ3JhbSB3b24ndCBhY3R1YWxseSB3b3JrIG9yIGFueXRoaW5nLgorCitpZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0geworICAgIHVudGVzdGVkICR0ZXN0MgorICAgIHJldHVybgorfQorCitpZiAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL3NyMy5jYyB0bXBkaXIvc3IzLm9dIHsKKyAgICB1bnJlc29sdmVkICR0ZXN0MgorICAgIHJldHVybgorfQorCisjIFNlZSBhYm92ZS4KK3NldHVwX3hmYWlsICJpKjg2LSotYW91dCoiCitzZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiICJtaXBzKi0qLWlyaXg2KiIKK3NldHVwX3hmYWlsICIqLSotYWl4KiIgIiotKi14Y29mZioiCitzZXR1cF94ZmFpbCAiYXJtLSotKiIKK3NldHVwX3hmYWlsICJzdHJvbmdhcm0tKi0qIgorc2V0dXBfeGZhaWwgInRodW1iLSotKiIKK3NldHVwX3hmYWlsICJwb3dlcnBjKi0qLWVhYmkqIgorc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgorc2V0dXBfeGZhaWwgImFscGhhKi0qLWVsZioiICJhbHBoYSotKi1saW51eC1nbnUqIiAiYWxwaGEqLSotZ251KiIKK3NldHVwX3hmYWlsICJhbHBoYSotKi1uZXRic2QqIgorCitydW5fc3JlY190ZXN0ICR0ZXN0MiAidG1wZGlyL3NyMy5vIgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyYWVjNgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmMKQEAgLTAsMCArMSwxMCBAQAorLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCB0aGUgbGlua2VyJ3MgcmVwb3J0aW5nIG9mIHVuZGVmaW5lZAorICAgc3ltYm9scy4gICovCisKK2V4dGVybiBpbnQgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKKworaW50CitmdW5jdGlvbiAoKQoreworICByZXR1cm4gdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKK30KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWIzYmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwCkBAIC0wLDAgKzEsMTI2IEBACisjIFRlc3QgdGhhdCB0aGUgbGlua2VyIHJlcG9ydHMgdW5kZWZpbmVkIHN5bWJvbCBlcnJvcnMgY29ycmVjdGx5LgorIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorIworIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitzZXQgdGVzdHVuZCAidW5kZWZpbmVkIgorc2V0IHRlc3RmbiAidW5kZWZpbmVkIGZ1bmN0aW9uIgorc2V0IHRlc3RsaW5lICJ1bmRlZmluZWQgbGluZSIKKworaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0geworICAgIHZlcmJvc2UgIkNvdWxkIG5vdCBmaW5kIEMgY29tcGlsZXIhIiAxCisgICAgdW50ZXN0ZWQgJHRlc3R1bmQKKyAgICB1bnRlc3RlZCAkdGVzdGZuCisgICAgdW50ZXN0ZWQgJHRlc3RsaW5lCisgICAgcmV0dXJuCit9CisKK2lmICFbbGRfY29tcGlsZSAiJENDIC1nIiAkc3JjZGlyLyRzdWJkaXIvdW5kZWZpbmVkLmMgdG1wZGlyL3VuZGVmaW5lZC5vXSB7CisgICAgdmVyYm9zZSAiVW5hYmxlIHRvIGNvbXBpbGUgdGVzdCBmaWxlISIgMQorICAgIHVucmVzb2x2ZWQgJHRlc3R1bmQKKyAgICB1bnJlc29sdmVkICR0ZXN0Zm4KKyAgICB1bnJlc29sdmVkICR0ZXN0bGluZQorICAgIHJldHVybgorfQorCitjYXRjaCAiZXhlYyBybSAtZiB0bXBkaXIvdW5kZWZpbmVkIiBleGVjX291dHB1dAorCisjIFVzaW5nIC1lIHN0YXJ0IHByZXZlbnRzIHRoZSBTdW5PUyBsaW5rZXIgZnJvbSB0cnlpbmcgdG8gYnVpbGQgYQorIyBzaGFyZWQgbGlicmFyeS4KK3NlbmRfbG9nICIkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm9cbiIKK3ZlcmJvc2UgIiRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQubyIKKworY2F0Y2ggImV4ZWMgJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vIiBleGVjX291dHB1dAorc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgordmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgorCitwcm9jIGNoZWNrdW5kIHsgc3RyaW5nIHRlc3RuYW1lIH0geworICAgIGdsb2JhbCBleGVjX291dHB1dAorCisgICAgaWYgW3N0cmluZyBtYXRjaCAiKiRzdHJpbmcqIiAkZXhlY19vdXRwdXRdIHsKKwlwYXNzICR0ZXN0bmFtZQorICAgIH0gZWxzZSB7CisJZmFpbCAkdGVzdG5hbWUKKyAgICB9Cit9CisKK3NldCBtdSAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCciCitjaGVja3VuZCAkbXUgJHRlc3R1bmQKKworIyBBUk0gUEUgZGVmYXVsdHMgdG8gdXNpbmcgc3RhYnMgZGVidWdnaW5nLCB3aGljaCB3ZSBjYW4ndCBoYW5kbGUgZm9yCisjIGEgQ09GRiBmaWxlLgorI3NldHVwX3hmYWlsICJhcm0qLSotcGUqIgorI3NldHVwX3hmYWlsICJ0aHVtYiotKi1wZSoiCisKKyMgSnVzdCBkb2Vzbid0IHdvcmsgZm9yIFBBIEVMRi4gIE5vIGNsdWUgd2h5Lgorc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCisKK3NldCBtZiAidG1wZGlyL3VuZGVmaW5lZC5vOiBJbiBmdW5jdGlvbiBgZnVuY3Rpb24nOiIKK2NoZWNrdW5kICRtZiAkdGVzdGZuCisKKyMgQ09GRiBTSCBnZXRzIHRoaXMgdGVzdCB3cm9uZy0taXQgcmVwb3J0cyBsaW5lIDEwLCBiZWNhdXNlIGFsdGhvdWdoCisjIHRoZSBqdW1wIGlzIGF0IGxpbmUgOSwgdGhlIGZ1bmN0aW9uIGFkZHJlc3MsIGFuZCB0aGUgcmVsb2MsIGlzCisjIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KK3NldHVwX3hmYWlsICJzaC0qLSoiCisKKyMgQVJNIFBFIGRlZmF1bHRzIHRvIHVzaW5nIHN0YWJzIGRlYnVnZ2luZywgd2hpY2ggd2UgY2FuJ3QgaGFuZGxlIGZvcgorIyBhIENPRkYgZmlsZS4KKyNzZXR1cF94ZmFpbCAiYXJtKi0qLXBlKiIKKyNzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUqIgorCisjIEp1c3QgZG9lc24ndCB3b3JrIGZvciBQQSBFTEYuICBObyBjbHVlIHdoeS4KK3NldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgorCitzZXQgbWwgInVuZGVmaW5lZC5jOjk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnIgorIyBXaXRoIHRhcmdldHMgdGhhdCB1c2UgZWxmL2R3YXJmMiwgc3VjaCBhcyB0aGUgYXJtLWVsZiBhbmQgdGh1bWItZWxmCisjIHRvb2xjaGFpbnMsIHRoZSBjb2RlIGluIGJmZC9lbGYuYzpfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpIGlzIGNhbGxlZAorIyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIGZpbGUgbmFtZS9saW5lIG51bWJlciB3aGVyZSB0aGUgdW5kZWZpbmVkCisjIHJlZmVyZW5jZSBvY2N1cnMuICBVbmZvcnR1bmF0ZWx5IHRoaXMgdHJpZXMgdG8gdXNlIHRoZSBkd2FyZjIgZGVidWcKKyMgaW5mb3JtYXRpb24gaGVsZCBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIHNlcmllcworIyBvZiBjb21wX3VuaXQgc3RydWN0dXJlcywgZWFjaCBvZiB3aGljaCBoYXMgYSBsb3cvaGlnaCBhZGRyZXNzIHJhbmdlCisjIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiBtZW1vcnkgbG9jYXRpb25zIGNvdmVyZWQgYnkgdGhhdCBzdHJ1Y3R1cmUuICBUaGUKKyMgc3RydWN0dXJlcyBhbHNvIGluZGV4IGludG8gb3RoZXIgc3RydWN0dXJlcyBoZWxkIGluIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uCisjIGFuZCB0b2dldGhlciB0aGV5IGNhbiB0cmFuc2xhdGUgbWVtb3J5IGxvY2F0aW9ucyBiYWNrIGludG8gZmlsZS9mdW5jdGlvbi9saW5lCisjIG51bWJlciBhZGRyZXNzZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiAgU2luY2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkKKyMgcmVnaW9uIGNvdmVyZWQgYnkgYSBjb21wX3VuaXQgaXMgb25seSBkZXRlcm1pbmVkIGF0IGxpbmsgdGltZSwgdGhlIGxvdy9oaWdoCisjIGFkZHJlc3NlcyBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBhbmQgdGhlIGxpbmUgYWRkcmVzc2VzIGluIHRoZSAuZGVidWdfbGluZQorIyBzZWN0aW9uIGFyZSBjb21wdXRlZCBieSBnZW5lcmF0aW5nIHJlbG9jcyBhZ2FpbnN0IGtub3duIHN5bWJvbHMgaW4gdGhlIG9iamVjdAorIyBjb2RlLgorIworIyBXaGVuIHRoZSB1bmRlZmluZWQgcmVmZXJlbmNlIGlzIGRldGVjdGVkLCB0aGUgcmVsb2NzIGluIHRoZSBkd2FyZjIKKyMgZGVidWcgc2VjdGlvbnMgaGF2ZSBub3QgeWV0IGJlZW4gcmVzb2x2ZWQsIHNvIHRoZSBsb3cvaGlnaCBhZGRyZXNzZXMgYW5kIHRoZQorIyBsaW5lIG51bWJlciBhZGRyZXNzIGFyZSBhbGwgc2V0IGF0IHplcm8uICBUaHVzIHdoZW4gX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKQorIyBjYWxscyBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSgpIG5vIGNvbXBfdW5pdCBjYW4gYmUgZm91bmQgd2hpY2gKKyMgYWN0dWFsbHkgY292ZXJzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSByZWZlcmVuY2Ugb2NjdXJlZCwgYW5kIHNvCisjIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkgZmFpbHMuCisjCisjIFRoZSB1cHNob3Qgb2YgYWxsIG9mIHRoaXMsIGlzIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlCisjIGxpbmtlciwgaW5zdGVhZCBvZiBoYXZpbmcgYSBzb3VyY2UgZmlsZSBuYW1lICYgbGluZSBudW1iZXIgYXMgaW46CisjCisjICAgdW5kZWZpbmVkLmM6OTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCcKKyMKKyMgaGFzIGFuIG9iamVjdCBmaWxlICYgc2VjdGlvbiBhZGRyZXNzIGluc3RlYWQ6CisjCisjICAgdW5kZWZpbmVkLjAoLnRleHQrMHhjKTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCcKKyMKKyMgaGVuY2UgdGhlIHhmYWlscyBiZWxvdy4KKworc2V0dXBfeGZhaWwgYXJtLSotZWxmCitzZXR1cF94ZmFpbCBzdHJvbmdhcm0tKi1lbGYKK3NldHVwX3hmYWlsIHRodW1iLSotZWxmCisKK2NoZWNrdW5kICRtbCAkdGVzdGxpbmUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTEucm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3MGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0xLnJvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0ZGM1OQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZCBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTVjNGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLmxkCkBAIC0wLDAgKzEsMjgxIEBACitPVVRQVVRfRk9STUFUKCJzcmVjIikKK1NFQ1RJT05TCit7CisKKworLnRleHQgMCA6IHsgKigiOSIpICooIjEwIikgKigiMTEiKSAqKCIxMiIpICooIjEzIikgKigiMTQiKSAqKCIxNSIpCisJCSooIjciKSAqKCI4IikgKigiMCIpICooIjEiKSAqKCIyIikgKigiMyIpICooIjQiKSB9CisuYnNzIChOT0xPQUQpICA6IHsgICooIjUiKSAqKCI2IikgfQorCisuUEFGSSAgICA9MHgwMDAwMDA1MCA7CisuUENISU8gICA9MHgwMDAwMDBEMCA7CisuUENMTyAgICA9MHgwMDAwMDA1NCA7CisuUENWQlNWICA9MHgwMDAwMDAwRSA7CisuUENWVFNVICA9MHgwMDAwMDAxMiA7CisuUENWVFNWICA9MHgwMDAwMDAxNiA7CisuUENWVFNWTCA9MHgwMDAwMDAxQSA7CisuUENWVFVTICA9MHgwMDAwMDAxRSA7CisuUERJUyAgICA9MHgwMDAwMDAyMiA7CisuUERJU0wgICA9MHgwMDAwMDAyNiA7CisuUERWSiAgICA9MHgwMDAwMDAyQSA7CisuUEVJTyAgICA9MHgwMDAwMDBDQyA7CisuUEVPRiAgICA9MHgwMDAwMDA1OCA7CisuUEVPTCAgICA9MHgwMDAwMDA1QyA7CisuUEVRVVMgICA9MHgwMDAwMDAyRSA7CisuUEVRVVYgICA9MHgwMDAwMDAzMiA7CisuUEVRVVZMICA9MHgwMDAwMDAzNiA7CisuUEVRVVcgICA9MHgwMDAwMDBERSA7CisuUEdDTSAgICA9MHgwMDAwMDA2NCA7CisuUEdFUVMgICA9MHgwMDAwMDAzQSA7CisuUEdFUVYgICA9MHgwMDAwMDAzRSA7CisuUEdFUVZMICA9MHgwMDAwMDA0MiA7CisuUEdFVCAgICA9MHgwMDAwMDA2MCA7CisuUEdSVFMgICA9MHgwMDAwMDA0NiA7CisuUEdSVFYgICA9MHgwMDAwMDA0QSA7CisuUEdSVFZMICA9MHgwMDAwMDA0RSA7CisuUElBQ1QgICA9MHgwMDAwMDA2QyA7CisuUElGRCAgICA9MHgwMDAwMDA2OCA7CisuUElORFMgICA9MHgwMDAwMDA1MiA7CisuUElORFYgICA9MHgwMDAwMDA1NiA7CisuUElORFZMICA9MHgwMDAwMDA1QSA7CisuUElORFcgICA9MHgwMDAwMDBENiA7CisuUExEQ1MgICA9MHgwMDAwMDA1RSA7CisuUExEQ1YgICA9MHgwMDAwMDA2MiA7CisuUExFUVMgICA9MHgwMDAwMDA2NiA7CisuUExFUVYgICA9MHgwMDAwMDA2QSA7CisuUExFUVZMICA9MHgwMDAwMDA2RSA7CisuUExFU1MgICA9MHgwMDAwMDA3MiA7CisuUExFU1YgICA9MHgwMDAwMDA3NiA7CisuUExFU1ZMICA9MHgwMDAwMDA3QSA7CisuUExPRFMgICA9MHgwMDAwMDA3RSA7CisuUExPRFYgICA9MHgwMDAwMDA4MiA7CisuUExPRFZMICA9MHgwMDAwMDA4NiA7CisuUE1PREogICA9MHgwMDAwMDA4QSA7CisuUE1PViAgICA9MHgwMDAwMDBFMiA7CisuUE1QSiAgICA9MHgwMDAwMDA4RSA7CisuUE5FUVMgICA9MHgwMDAwMDA5MiA7CisuUE5FUVYgICA9MHgwMDAwMDA5NiA7CisuUE5FUVZMICA9MHgwMDAwMDA5QSA7CisuUE5FUVcgICA9MHgwMDAwMDBEQSA7CisuUFBBR0UgICA9MHgwMDAwMDBENCA7CisuUFBFRSAgICA9MHgwMDAwMDA3MCA7CisuUFBVVCAgICA9MHgwMDAwMDA3NCA7CisuUFJEQiAgICA9MHgwMDAwMDA3OCA7CisuUFJEQyAgICA9MHgwMDAwMDA3QyA7CisuUFJESCAgICA9MHgwMDAwMDA4MCA7CisuUFJESSAgICA9MHgwMDAwMDA4NCA7CisuUFJESiAgICA9MHgwMDAwMDA4OCA7CisuUFJEUlMgICA9MHgwMDAwMDBDOCA7CisuUFJEUyAgICA9MHgwMDAwMDA4QyA7CisuUFJEViAgICA9MHgwMDAwMDA5MCA7CisuUFJMTiAgICA9MHgwMDAwMDA5NCA7CisuUFJSQU4gICA9MHgwMDAwMDA5OCA7CisuUFJTVCAgICA9MHgwMDAwMDA5QyA7CisuUFJXVCAgICA9MHgwMDAwMDBBMCA7CisuUFNDT04gICA9MHgwMDAwMDA5RSA7CisuUFNDT1AgICA9MHgwMDAwMDBBMiA7CisuUFNERUwgICA9MHgwMDAwMDBBNiA7CisuUFNJTlMgICA9MHgwMDAwMDBBQSA7CisuUFNMRU4gICA9MHgwMDAwMDBBRSA7CisuUFNQT1MgICA9MHgwMDAwMDBCMiA7CisuUFNUQ1YgICA9MHgwMDAwMDBCNiA7CisuUFNUQ1ZMICA9MHgwMDAwMDBCQSA7CisuUFNUT1MgICA9MHgwMDAwMDBCRSA7CisuUFNUT1YgICA9MHgwMDAwMDBDMiA7CisuUFNUT1ZMICA9MHgwMDAwMDBDNiA7CisuUFNUUlMgICA9MHgwMDAwMDBDQSA7CisuUFNUUlYgICA9MHgwMDAwMDBDRSA7CisuUFNUUlZMICA9MHgwMDAwMDBEMiA7CisuUFdMTiAgICA9MHgwMDAwMDBBNCA7CisuUFdSQU4gICA9MHgwMDAwMDBBOCA7CisuUFdSQiAgICA9MHgwMDAwMDBBQyA7CisuUFdSQyAgICA9MHgwMDAwMDBCMCA7CisuUFdSSCAgICA9MHgwMDAwMDBCNCA7CisuUFdSSSAgICA9MHgwMDAwMDBCOCA7CisuUFdSSiAgICA9MHgwMDAwMDBCQyA7CisuUFdSUyAgICA9MHgwMDAwMDBDMCA7CisuUFdSViAgICA9MHgwMDAwMDBDNCA7CisKKy8qCisuUEFGST0weCAgID0gMHgwMDsKKy5QQ0hJTyAgID0weCAweDAwMDAwMDsKKy5QQ0xPICAgID0weCA2NCA7CisuUEM7CisuUENWVFNVICA9MHggMHgwMDAwMDA7CisuUENWVFNWICA9MHggMHgwMDAwMDA7CisuUENWVFNWTCA9MHggMHgwMDAwMDA7CisuUENWVFVTICA9MHggMTU4IDsKKy5QOworLlBESVNMICAgPTB4IDB4MDAwMDAwOworLlBEVkogICAgPTB4IDB4MDAwMDAwOworLlBFSU8gICAgPTB4IDB4MDAwMDAwOworLlBFT0YgICAgPTB4IDB4MDAwMDAwOworLlBFT0wgICAgPTB4IDB4MDAwMDAwOworLlBFUVVTICAgPTB4IDB4MDAwMDAwOworLlBFUVVWICAgPTB4IDB4MDAwMDAwOworLlBFUVVWTCAgPTB4IDB4MDAwMDAwOworLlBFUVVXICAgPTB4IDB4MDAwMDAwOworLlBHQ00gICAgPTB4IDB4MDAwMDAwOworLlBHRVFTICAgPTB4IDB4MDAwMDAwOworLlBHRVFWICAgPTB4IDB4MDAwMDAwOworLlBHRVFWTCAgPTB4IDB4MDAwMDAwOworLlBHRVQgICAgPTB4IDB4MDAwMDAwOworLlBHUlRTICAgPTB4IDB4MDAwMDAwOworLlBHUlRWICAgPTB4IDB4MDAwMDAwOworLlBHUlRWTCAgPTB4IDB4MDAwMDAwOworLlBJQUNUICAgPTB4IDB4MDAwMDAwOworLlBJRkQgICAgPTB4IDEyNiA7CisuUDsKKy5QSU5EViAgID0weCAweDAwMDAwMDsKKy5QSU5EVkwgID0weCAweDAwMDAwMDsKKy5QSU5EVyAgID0weCAweDAwMDAwMDsKKy5QTERDUyAgID0weCAweDAwMDAwMDsKKy5QTERDViAgID0weCAweDAwMDAwMDsKKy5QTEVRUyAgID0weCAweDAwMDAwMDsKKy5QTEVRViAgID0weCAweDAwMDAwMDsKKy5QTEVRVkwgID0weCAweDAwMDAwMDsKKy5QTEVTUyAgID0weCAweDAwMDAwMDsKKy5QTEVTViAgID0weCAweDAwMDAwMDsKKy5QTEVTVkwgID0weCAweDAwMDAwMDsKKy5QTE9EUyAgID0weCAweDAwMDAwMDsKKy5QTE9EViAgID0weCAweDAwMDAwMDsKKy5QTE9EVkwgID0weCAweDAwMDAwMDsKKy5QTU9ESiAgID0weCAweDAwMDAwMDsKKy5QTU9WICAgID0weCAweDAwMDAwMDsKKy5QTVBKICAgID0weCAweDAwMDAwMDsKKy5QTkVRUyAgID0weCAweDAwMDAwMDsKKy5QTkVRViAgID0weCAweDAwMDAwMDsKKy5QTkVRVkwgID0weCAweDAwMDAwMDsKKy5QTkVRVyAgID0weCAweDAwMDAwMDsKKy5QUEFHRSAgID0weCAweDAwMDAwMDsKKy5QUEVFICAgID0weCAweDAwMDAwMDsKKy5QUFVUICAgID0weCAweDAwMDAwMDsKKy5QUkRCICAgID0weCAweDAwMDAwMDsKKy5QUkRDICAgID0weCAweDAwMDAwMDsKKy5QUkRIICAgID0weCAweDAwMDAwMDsKKy5QUkRJICAgID0weCAweDAwMDAwMDsKKy5QUkRKICAgID0weCAweDAwMDAwMDsKKy5QUkRSUyAgID0weCAweDAwMDAwMDsKKy5QUkRTICAgID0weCAweDAwMDAwMDsKKy5QUkRWICAgID0weCAweDAwMDAwMDsKKy5QUkxOICAgID0weCAweDAwMDAwMDsKKy5QUlJBTiAgID0weCAweDAwMDAwMDsKKy5QUlNUICAgID0weCAweDAwMDAwMDsKKy5QUldUICAgID0weCAweDAwMDAwMDsKKy5QU0NPTiAgID0weCAweDAwMDAwMDsKKy5QU0NPUCAgID0weCAweDAwMDAwMDsKKy5QU0RFTCAgID0weCAweDAwMDAwMDsKKy5QU0lOUyAgID0weCAweDAwMDAwMDsKKy5QU0xFTiAgID0weCAweDAwMDAwMDsKKy5QU1BPUyAgID0weCAweDAwMDAwMDsKKy5QU1RDViAgID0weCAweDAwMDAwMDsKKy5QU1RDVkwgID0weCAweDAwMDAwMDsKKy5QU1RPUyAgID0weCAweDAwMDAwMDsKKy5QU1RPViAgID0weCAweDAwMDAwMDsKKy5QU1RPVkwgID0weCAweDAwMDAwMDsKKy5QU1RSUyAgID0weCAweDAwMDAwMDsKKy5QU1RSViAgID0weCAweDAwMDAwMDsKKy5QU1RSVkwgID0weCAweDAwMDAwMDsKKy5QV0xOICAgID0weCAweDAwMDAwMDsKKy5QV1JBTiAgID0weCAweDAwMDAwMDsKKy5QV1JCICAgID0weCAweDAwMDAwMDsKKy5QV1JDICAgID0weCAweDAwMDAwMDsKKy5QV1JIICAgID0weCAweDAwMDAwMDsKKy5QV1JJICAgID0weCAweDAwMDAwMDsKKy5QV1JKICAgID0weCAweDAwMDAwMDsKKy5QV1JTICAgID0weCAweDAwMDAwMDsKKy5QV1JWICAgID0weCAweDAwMDAwMDsKKworKi8KKy8qCisuUD0weCAgICAgID0gMDsKKy5QQ0hJTyAgID0weCAweGZlZWRmYTsKKy5QQ0xPICAgID0weCAweGZlZWRmYTsKKy5QQ1ZCU1YgID0weCAweGZlZWRmYTsKKy5QQ1ZUU1UgID0weCAweGZlZWRmYTsKKy5QQ1ZUU1YgID0weCAweGZlZWRmYTsKKy5QQ1ZUU1ZMID0weCAweGZlZWRmYTsKKy5QQ1ZUVVMgID0weCAweGZlZWRmYTsKKy5QRElTICAgID0weCAweGZlZWRmYTsKKy5QRElTTCAgID0weCAweGZlZWRmYTsKKy5QRFZKICAgID0weCAweGZlZWRmYTsKKy5QRUlPICAgID0weCAweGZlZWRmYTsKKy5QRU9GICAgID0weCAweGZlZWRmYTsKKy5QRU9MICAgID0weCAweGZlZWRmYTsKKy5QRVFVUyAgID0weCAweGZlZWRmYTsKKy5QRVFVViAgID0weCAweGZlZWRmYTsKKy5QRVFVVkwgID0weCAweGZlZWRmYTsKKy5QRVFVVyAgID0weCAweGZlZWRmYTsKKy5QR0NNICAgID0weCAweGZlZWRmYTsKKy5QR0VRUyAgID0weCAweGZlZWRmYTsKKy5QR0VRViAgID0weCAweGZlZWRmYTsKKy5QR0VRVkwgID0weCAweGZlZWRmYTsKKy5QR0VUICAgID0weCAweGZlZWRmYTsKKy5QR1JUUyAgID0weCAweGZlZWRmYTsKKy5QR1JUViAgID0weCAweGZlZWRmYTsKKy5QR1JUVkwgID0weCAweGZlZWRmYTsKKy5QSUFDVCAgID0weCAweGZlZWRmYTsKKy5QSUZEICAgID0weCAweGZlZWRmYTsKKy5QSU5EUyAgID0weCAweGZlZWRmYTsKKy5QSU5EViAgID0weCAweGZlZWRmYTsKKy5QSU5EVkwgID0weCAweGZlZWRmYTsKKy5QSU5EVyAgID0weCAweGZlZWRmYTsKKy5QTERDUyAgID0weCAweGZlZWRmYTsKKy5QTERDViAgID0weCAweGZlZWRmYTsKKy5QTEVRUyAgID0weCAweGZlZWRmYTsKKy5QTEVRViAgID0weCAweGZlZWRmYTsKKy5QTEVRVkwgID0weCAweGZlZWRmYTsKKy5QTEVTUyAgID0weCAweGZlZWRmYTsKKy5QTEVTViAgID0weCAweGZlZWRmYTsKKy5QTEVTVkwgID0weCAweGZlZWRmYTsKKy5QTE9EUyAgID0weCAweGZlZWRmYTsKKy5QTE9EViAgID0weCAweGZlZWRmYTsKKy5QTE9EVkwgID0weCAweGZlZWRmYTsKKy5QTU9ESiAgID0weCAweGZlZWRmYTsKKy5QTU9WICAgID0weCAweGZlZWRmYTsKKy5QTVBKICAgID0weCAweGZlZWRmYTsKKy5QTkVRUyAgID0weCAweGZlZWRmYTsKKy5QTkVRViAgID0weCAweGZlZWRmYTsKKy5QTkVRVkwgICAgPSAweGZlZWRmYWNlOworLlBORVFXICAgICA9IDB4ZmVlZGZhY2U7CisuUFBBR0UgICAgID0gMHhmZWVkZmFjZTsKKy5QUEVFICAgICAgPSAweGZlZWRmYWNlOworLlBQVVQgICAgICA9IDB4ZmVlZGZhY2U7CisuUFJEQiAgICAgID0gMHhmZWVkZmFjZTsKKy5QUkRDICAgICAgPSAweGZlZWRmYWNlOworLlBSREggICAgICA9IDB4ZmVlZGZhY2U7CisuUFJESSAgICAgID0gMHhmZWVkZmFjZTsKKy5QUkRKICAgICAgPSAweGZlZWRmYWNlOworLlBSRFJTICAgICA9IDB4ZmVlZGZhY2U7CisuUFJEUyAgICAgID0gMHhmZWVkZmFjZTsKKy5QUkRWICAgICAgPSAweGZlZWRmYWNlOworLlBSTE4gICAgICA9IDB4ZmVlZGZhY2U7CisuUFJSQU4gICAgID0gMHhmZWVkZmFjZTsKKy5QUlNUICAgICAgPSAweGZlZWRmYWNlOworLlBSV1QgICAgICA9IDB4ZmVlZGZhY2U7CisuUFNDT04gICAgID0gMHhmZWVkZmFjZTsKKy5QU0NPUCAgICAgPSAweGZlZWRmYWNlOworLlBTREVMICAgICA9IDB4ZmVlZGZhY2U7CisuUFNJTlMgICAgID0gMHhmZWVkZmFjZTsKKy5QU0xFTiAgICAgPSAweGZlZWRmYWNlOworLlBTUE9TICAgICA9IDB4ZmVlZGZhY2U7CisuUFNUQ1YgICAgID0gMHhmZWVkZmFjZTsKKy5QU1RDVkwgICAgPSAweGZlZWRmYWNlOworLlBTVE9TICAgICA9IDB4ZmVlZGZhY2U7CisuUFNUT1YgICAgID0gMHhmZWVkZmFjZTsKKy5QU1RPVkwgICAgPSAweGZlZWRmYWNlOworLlBTVFJTICAgICA9IDB4ZmVlZGZhY2U7CisuUFNUUlYgICAgID0gMHhmZWVkZmFjZTsKKy5QU1RSVkwgICAgPSAweGZlZWRmYWNlOworLlBXTE4gICAgICA9IDB4ZmVlZGZhY2U7CisuUFdSQU4gICAgID0gMHhmZWVkZmFjZTsKKy5QV1JCICAgICAgPSAweGZlZWRmYWNlOworLlBXUkMgICAgICA9IDB4ZmVlZGZhY2U7CisuUFdSSCAgICAgID0gMHhmZWVkZmFjZTsKKy5QV1JJICAgICAgPSAweGZlZWRmYWNlOworLlBXUkogICAgICA9IDB4ZmVlZGZhY2U7CisuUFdSUyAgICAgID0gMHhmZWVkZmFjZTsKKy5QV1JWICAgICAgPSAweGZlZWRmYWNlOworKi8KKworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLm9vayBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4NGI5NAotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS5vb2sKQEAgLTAsMCArMSwxMzMgQEAKK1MwMEMwMDAwNzQzMTJFNkY3NTc0MkU2RjZCQzANCitTMTE4MDAwMDAwMDAwQTIwNTM0MTQ2NDU1MzU0NEY1MjQ1MjA0MTIwMjAyMDIwMjA1MkJFDQorUzExODAwMTUzMTMzMkUzMzIwMjAyMDIwMjAyMDIwNTIzMTMzMkUzMjIwMjAyMDIwMjA3Nw0KK1MxMTgwMDJBMjAyMDAwQjVFODY2MDBCNUU5QjExREExNUI5OTAwMDAxRjAwMDAwMDBBNTANCitTMTE4MDAzRjY0MDAwMDAwM0UwMDAwMDA1QzAwQTgwMEJBMDBGMDAwMDQwMDAxMDAwMjUxDQorUzExODAwNTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwMDQwMzFDRjUyNTQ0QzQ5NDJEMA0KK1MxMTgwMDY5NDM0RjRFMDAwNEU1RUM1MjU0NEM0OTQyNDM0RjRFMDAwNEU1RUQ1MjU0RjANCitTMTE4MDA3RTRDNDk0MjQzNEY0RTAwNDAzMUQyNTI1NDRDNDk0MjQzNEY0RTAwMDAwQTA4DQorUzExODAwOTM3RDUyNTQ0QzQ5NDI1MzU0NTIwMDEwQTRBODUyNTQ0QzQ5NDI0NjQ5NENBRA0KK1MxMTgwMEE4MDAwMjAwQjVFODZEMDAwMDAxNjAwMEI1RTg3MzAwMDAwMjU0MDAwMjAwNkENCitTMTE4MDBCREI1RTkzNzUzNDE0NjQ1NTA1MjQ5NEU1NDIwMDAwMDA2MDAwMjAwMDgwMDc5DQorUzExODAwRDIwMDAwMDM0MjAwQjVFODZFNDk0RTQ5NTQ1MzQxNDY0NTUzNTQwMDAwMDJDOQ0KK1MxMTgwMEU3MTgwMDAwMEUwMDAwMDAwOTAyMDAzMDAwMDAwMDAwNEU1NkZGRDhCQThGREINCitTMTE4MDBGQzYzMDYyRTRFNjEwMDAwMTY0MUZBMDAzMjQzRUVGRkQ4NzAyNjEyRDg1MTQ5DQorUzExODAxMTFDOEZGRkM0RTVFNEU3NTJCNTdGRkYyMkYzQzAwMDAwMDBBNjAwMDAwMDI1OQ0KK1MxMTgwMTI2M0I2RjAwMDJGRkY2MkYyRDAwMzgyRjJEMDAzNDRFNEM0RTRBNDM0RjUwRTcNCitTMTE4MDEzQjU5NTI0OTQ3NDg1NDIwNTQ2NTZDNjU2NjZGNkUyMDQxNDIyMDRDMjA0RDZCDQorUzExODAxNTAyMDQ1NzI2OTYzNzM3MzZGNkUyQzIwMzEzOTM5MzMwMDRFNTZGRkZDQkFCNQ0KK1MxMTgwMTY1OEY2MzA0MkU0RTYxQUMyMDJFMDAwQzA2ODAwMDAwMDAwQzRFNzY1NjgwN0MNCitTMTE4MDE3QTRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDAwMEIwMkQ0MEZGRkMyMDBCDQorUzExODAxOEY2QzAwM0EyMjA4MjQyQzAwMzY5NDgxNEU3NjA0ODIwMDAwMDAwQzRFNzZEMg0KK1MxMTgwMUE0NEFENTY2MDQ2MTAwMDA4RUIwODI2RTBDMENBRTAwMDAwMDAxMDAwQzZDRUINCitTMTE4MDFCOTAwMDAwQzIwN0MwMDAwMDAwMDYxMDAwMDYwMjA2QzAwM0EyMDA4NjYwNDZDDQorUzExODAxQ0U2MTAwMDA3NjIyMDhEMkFFRkZGQzY4MDQ2MTAwMDA1QzIwODEyMTZFMDA0Mw0KK1MxMTgwMUUzMTAwMDA0MjE2RTAwMEMwMDA4MjIwODA2ODEwMDAwMDAwQzY4MDQ2MTAwQzINCitTMTE4MDFGODAwNDAyRDQxMDAxNDI5NTAwMDNBMjA2QzAwM0EyNDA4NjYwNDYxMDAwMEJDDQorUzExODAyMEQzQTQyOTA0MkE4MDAwNDQyQTgwMDA4NEU1RTIyNUYyODVGNTA4RjRFRTkyMg0KK1MxMTgwMjIyMDAwMjJCNUZGRkYyNEU1RUQxREYyODVGMkYwODJCNDhGRkYyRDBEMDRFREENCitTMTE4MDIzN0QwMkI1N0ZGRjIyRjNDMDAwMDAwMEU2MDAwRkVFMjJCNTdGRkYyMkYzQ0Q0DQorUzExODAyNEMwMDAwMDAxMDYwMDBGRUQ0NEU1NkZGRkNCQThGNjMwNjJFNEU2MTAwRkUyQg0KK1MxMTgwMjYxQjgyRDZDMDAzMkZGRkM2MDAwMDAxMjJCNUZGRkYyNEZFRUZGRkM0MkFFRjENCitTMTE4MDI3NkZGRkM2MDAwMDA4MjRBQUVGRkZDNjcwMDAwN0EyMDZFRkZGQzIwMDg2NkE3DQorUzExODAyOEIwMDAwMDQ2MUI2MjIyODAwMDRCMkFFMDAxMDY3MDAwMDYyMjIwODAyODEwQg0KK1MxMTgwMkEwMDAwMDAwMDM0QTgxNjY0MDIyMDgyMjZDMDAzQTI0MDlCMjgyNkUzNDI2QjYNCitTMTE4MDJCNTEwMjgwODA2ODQwMDAwMDAwQzY4MDQ2MTAwRkY3NkI2ODQ2RDIwMjYxMDFCDQorUzExODAyQ0EyODA4OTY4NDRFNzYwNDgzMDAwMDAwMEM0RTc2NEFENTY2MDQ2MTAwRkZDRA0KK1MxMTgwMkRGNUFCNkE4MDAwODZDMDAwMDA0NjE4MjIwNkVGRkZDMjAwODY2MDQ2MTAwNzcNCitTMTE4MDJGNEZGNTIyRDUwRkZGQzYwODA0QUFFRkZGQzY3MDAwMDJDMjA2RUZGRkMyMDE5DQorUzExODAzMDkwODY2MDQ2MTAwRkYzODIyNkUwMDBDMjJBODAwMDgyMjA4MDY4MTAwMDBCMg0KK1MxMTgwMzFFMDAwQzY4MDQ2MTAwRkYxNDJENDEwMDE0NjAwMDAwMEMyMDZFMDAwQzQyMTANCitTMTE4MDMzMzkwNDJBRTAwMTQ0RTVFMjA1RjI4NUY1MDhGNEVEMDRGRURGRjAwNzA3RjQ0DQorUzExODAzNDgyMDRGNDI1ODUxQzhGRkZDNDg2REZGMDgxRjNDMDAwNDNGM0MwMDAxOUY0OQ0KK1MxMTgwMzVERkMwMDAwMDAwQzIyNEY0NUZBMDRGRTIyREEyMkRBMjJEQTI2NkMwMDI4MUYNCitTMTE4MDM3MjJGMEMyODZDMDAyQzRFQUIwMDY4NDg2REZGQjg0ODZERkZCNDJGMEMyMEU3DQorUzExODAzODc2QzAwMDAyODZDMDAwNDRFOTA5RkZDMDAwMDAwNTIyRjJERkZDNjJGMEMzMg0KK1MxMTgwMzlDMjA2QzAwMDgyODZDMDAwQzRFOTA3MDUyMjY2QzAwMjA0RUFCMDAxRTQxNkENCitTMTE4MDNCMUZBMDRCRTI2NkMwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFNDFFREQ3DQorUzExODAzQzZGRkJBMjY2QzAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUUxRjNDMDA5OA0KK1MxMTgwM0RCMjgzRjNDMDAwMTI2NkMwMDIwNEVBQjAwOUU5RkZDMDAwMDAwNTIzMDJERDINCitTMTE4MDNGMEZGQ0E0OEMwMkYwMDJGMEMyMDZDMDAwODI4NkMwMDBDNEU5MDcwNTIyNkJGDQorUzExODA0MDU2QzAwMjA0RUFCMDAxRTI2NkMwMDIwNEVBQjAwOUU0MUZBMDQ1RTI2NkNDMw0KK1MxMTgwNDFBMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTQxRURGRjlFNzAxNjI2NzINCitTMTE4MDQyRjZDMDAyMDRFQUIwMENBNjAwMDAwMTYyQjVGRkZGMjRGRURGRjAwMkI3QzkyDQorUzExODA0NDQwMDAwMDAwMUZGQjQ2MDAwMDNFNDQ4NkRGRjA4OUZGQzAwMDAwMDUyMjBEQg0KK1MxMTgwNDU5NEY0M0VERkY5RTMwMTk3MjUwOTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBMjMNCitTMTE4MDQ2RTUzNDBFMjQwMzBEOTUxQzhGRkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMzAzDQorUzExODA0ODNGNjMyREEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDUwRkZBQTQ4NkQwMg0KK1MxMTgwNDk4RkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTBGRjk2NDJBREZGNzMNCitTMTE4MDRBRDAwMkI2QzAwMzJGRjA0NDg3QTAzQzQzRjNDRkZGRjQ4NkRGRjA4MjY2QzFBDQorUzExODA0QzIwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRjcwNDg2REZGMDgyNjZDMDA4OA0KK1MxMTgwNEQ3MjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZGNUM2MDAwMDA3ODJCNUZGRkYyOUUNCitTMTE4MDRFQzRGRURGRjAwNDg3QTAzQkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjFGDQorUzExODA1MDEwQzI4NkMwMDJDNEVBQjAwQzBGRjM0OUZGQzAwMDAwMDUyMjA2REZGMDRBQw0KK1MxMTgwNTE2MjAwODJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGNjANCitTMTE4MDUyQkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkYwMDhGDQorUzExODA1NDBERkZDMDAwMDAwNTI0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVCNg0KK1MxMTgwNTU1QUIwMEE0RkVFNjYwMDAwMUYwMjA2REZGMDQyMDA4NjYwMjYxODA0QTkwMkUNCitTMTE4MDU2QTY3MDAwMTZBMjIxMDAyODEwMDAwMDAwMzRBODE2NjRBMjIxMDI0MkMwMEYxDQorUzExODA1N0YzNjA0ODIwMDAwMDAwQzY4MDQ2MTAwRkNBRUIyODI2RTM0MjIxMDI0MDhGMA0KK1MxMTgwNTk0MDY4MjAwMDAwMDBDNjgwNDYxMDBGQzlBQjI4MjZEMjAyMjEwMjQwODkyQTYNCitTMTE4MDVBOTgyNEU3NjA0ODEwMDAwMDAwQzRFNzY0QUQ1NjYwNDYxMDBGQzdFQjJBOEUwDQorUzExODA1QkUwMDA4NkMwMDAwMDY2MTAwRkYyMjIwNkRGRjA0MjAwODY2MDQ2MTAwRkZBNg0KK1MxMTgwNUQzMTYyMjI4MDAwOEQyQURGRjAwNjgwNDYxMDBGQzU4MkI0MUZGMDA5RkZDMDINCitTMTE4MDVFODAwMDAwMDUyMjQwODJGMDIyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRkJGDQorUzExODA1RkQwRjNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUJFNQ0KK1MxMTgwNjEyMDBDMEZFMkFERkZDMDAwMDAwNTIyMDZERkYwNDIwMDg2NjA0NjEwMEZFMzkNCitTMTE4MDYyN0MyMkYyODAwMDQzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Q0QxDQorUzExODA2M0MwMDJDNEVBQjAwQkNGREZDMjA2REZGMDQyMDA4NjYwNDYxMDBGRTlBMkY4MQ0KK1MxMTgwNjUxMjgwMDA4M0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNjgNCitTMTE4MDY2NjRFQUIwMEJDRkRENDlGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODY2MDQ2MTg1DQorUzExODA2N0IwMEZFNkMyMjEwMkYwMTJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEZGRg0KK1MxMTgwNjkwM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNjANCitTMTE4MDZBNUMwRkQ5OERGRkMwMDAwMDA1MjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Qzc1DQorUzExODA2QkEwMDJDNEVBQjAwQTRGRDdFMjA2REZGMDQyMDA4NjYwNDYxMDBGRTFDMkIxQg0KK1MxMTgwNkNGNTBGRjA0NjAwMEZFOEEyMDZDMDAzQUIxRURGRjA0NjcwMDAwNkM0ODdBREINCitTMTE4MDZFNDAxRTgzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RURDDQorUzExODA2RjlBQjAwQzBGRDQyOUZGQzAwMDAwMDUyMjA2REZGMDQyMDA4MkYwMDJGMEMyRg0KK1MxMTgwNzBFMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGRkY0ODZERkYwODI2MTcNCitTMTE4MDcyMzZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkQwRURGRkMwMDAwMDA1MjNEDQorUzExODA3Mzg0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTRGQ0Y0NDg2Mg0KK1MxMTgwNzREN0EwMTk4M0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDOTYNCitTMTE4MDc2MjRFQUIwMEMwRkNEODQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RTMyDQorUzExODA3NzdBQjAwQTRGQ0M0NDg3QTAxNkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgzRQ0KK1MxMTgwNzhDMkYwQzI4NkMwMDJDNEVBQjAwQzBGQ0E4NDg2REZGMDgyNjZDMDAyODJGNTcNCitTMTE4MDdBMTBDMjg2QzAwMkM0RUFCMDBBNEZDOTQyMDZERkYwNDIwMDgwNjgwMDAwMDA4DQorUzExODA3QjYwMDE4NEU3NjIyMkMwMDM2OTI4MDRFNzYwMjgxRkZGRkZGRkM0QUQ1NjZGMw0KK1MxMTgwN0NCMDQ2MTAwRkE2QTJGMDEzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDRTQNCitTMTE4MDdFMDI4NkMwMDJDNEVBQjAwQkNGQzU2MkYyREZGMDAzRjNDMDAwQzQ4NkRGRkEzDQorUzExODA3RjUwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQkNGQzNBNDg2REZGMDg4Nw0KK1MxMTgwODBBMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZDMjY0ODZERkYwODFGODYNCitTMTE4MDgxRjNDMDAwMTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTQ0ODZERkZCODE1DQorUzExODA4MzQ0ODZERkZCNDJGMEMyMDZDMDAxODI4NkMwMDFDNEU5MDQ4NkRGRjA4NDJEOA0KK1MxMTgwODQ5MjcyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDU0NDJBNzJGMkQwMDM4RjANCitTMTE4MDg1RTJGMkQwMDM0NEU0QTAwMEE0NjMxMjAyMDIwMjAyMDIwMjAyMDAwMDIzQTlDDQorUzExODA4NzMzQTAwMDIyOTNBMDAwMDAwMzAyMDIwMjAyMDIwNDE2NDY0NzI2NTczNzMzNw0KK1MxMTgwODg4MjAyMDIwMjA0OTY0NjU2RTc0Njk3NDc5MjAyMDIwMjAyMDIwMjAyMDUzM0ENCitTMTE4MDg5RDY5N0E2NTIwMjAyMDIwMjAyMDIwMjA0RTY1Nzg3NDAwMUQ0OTZFNzY2MUIwDQorUzExODA4QjI2QzY5NjQyMDczNjU2NzZENjU2RTc0MjA3Mzc0NjE3Mjc0Njk2RTY3MjAzNQ0KK1MxMTgwOEM3NjE3NDNBMjAyMDAwMTg1MzY1Njc2RDY1NkU3NDIwNkM2OTczNzQyMDYzN0YNCitTMTE4MDhEQzZGNzI3Mjc1NzA3NDY1NjQzQTIwMDAwMDAwMTgyMDIwMjA0MTc2NjE2OTNCDQorUzExODA4RjE2QzYxNjI2QzY1MjAyMDIwMjAyMDIwMjAyMDU1NzM2NTY0NEZFREZGRjIzMA0KK1MxMTgwOTA2OUZGQzAwMDAwMDBBNjEwMDAxNTY0MUVDMDAzMDIwREYyMERGMzBERjIwRjENCitTMTE4MDkxQjJDMDAzMjU2ODA0RTc2MDI4MEZGRkZGRkZDNEFENTY2MDQ2MTAwRjkwQTYzDQorUzExODA5MzAyOTQwMDAzMjI5NDAwMDNBNjAwMDAwM0UyQjVGRkZGMjRGRURGRkYyMjAwQQ0KK1MxMTgwOTQ1MkMwMDMyNTY4MDRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDBGOEUwNjQNCitTMTE4MDk1QTI5NDAwMDNBMjA2QzAwM0EyMjA4NjYwNDYxMDBGOERFNDI5MDQyQTgwMDk0DQorUzExODA5NkYwNDQyQTgwMDA4NjAwMDAwOUU0QTJDMDAzMDY3MDAwMDFBMjA2QzAwM0E4RQ0KK1MxMTgwOTg0MjAwODY2MDI2MUIyNDI5MDQyQTgwMDA0NDJBODAwMDg2MDAwMDA3RTIwMDcNCitTMTE4MDk5OTZDMDAzQTIwMDg2NjAyNjE5QTRBOTA2NzAwMDA2RTIyMTAwMjgxMDAwMEIwDQorUzExODA5QUUwMDAzNEE4MTY2NEEyMjEwMjQyQzAwMzYwNDgyMDAwMDAwMEM2ODA0NjE5Qg0KK1MxMTgwOUMzMDBGODc0QjI4MjZFMzQyMjEwMjQwODA2ODIwMDAwMDAwQzY4MDQ2MTAwMUENCitTMTE4MDlEOEY4NjBCMjgyNkQyMDIyMTAyNDA4OTI4MjRFNzYwNDgxMDAwMDAwMEM0RUQ4DQorUzExODA5RUQ3NjRBRDU2NjA0NjEwMEY4NDRCMkE4MDAwODZDMDAwMDA2NjEwMEZGM0NFNQ0KK1MxMTgwQTAyMjA2QzAwM0EyMDA4NjYwNDYxMDBGRjMwMjk1MDAwM0E2MDg0NDJBNzJGNDQNCitTMTE4MEExNzJEMDAzODJGMkQwMDM0NEU0QTRFNTYwMDAwNTE4RjQyQTcxRjNDMDAwRTYzDQorUzExODBBMkM0MjY3NDg3QTAwMTI0MjY3NDIyNzJGM0MwMEI1RTg2RTRFNDkwMDBFNTBCNw0KK1MxMTgwQTQxOEY0RTVFMjA1RjI4NUY0RUU4MDAwMjIwN0MwMDAwMDAwMDYwMDQyQjVGOTkNCitTMTE4MEE1NkZGRjI0RTVFRDFERjI4NUYyRjA4RDBEMDRFRDA0M0ZBMDAwNEQzRkMwMEFFDQorUzExODBBNkIwMjcwNEUyRjQ5MDAwQTQzRkEwMDA0RDNGQzAwMDAwMDQwMkY0OTAwMDY2Mg0KK1MxMTgwQTgwNDFGQTAwMDREMUZDRkZGRkY1N0EyMDI4MDA1NjY2MDAwMDIyMjIwOTkyMDENCitTMTE4MEE5NTg4MjE0MTAwNTY0MjgxMjQ0OEQyNUFCNUM5NkRGQTQ0NDFEMzY4MDA1QUFFDQorUzExMTBBQUExRjdDMDAwMTAwMDQ0RTc1NDIyRjAwMDQ0RTc1OUYNCitTOTAzMDAwMEZDDQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNhN2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMi5ybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRhNzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMy5ybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU5MzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTMucm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWU0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIubGQKQEAgLTAsMCArMSwyODEgQEAKK09VVFBVVF9GT1JNQVQoInNyZWMiKQorU0VDVElPTlMKK3sKKworCisudGV4dCAwIDogeyAqKCI5IikgKigiMTAiKSAqKCIxMSIpICooIjEyIikgKigiMTMiKSAqKCIxNCIpICooIjE1IikKKwkJKigiNyIpICooIjgiKSAqKCIwIikgKigiMSIpICooIjIiKSAqKCIzIikgKigiNCIpIH0KKy5ic3MgICA6IHsgICooIjUiKSAqKCI2IikgfQorCisuUEFGSSAgICA9MHgwMDAwMDA1MCA7CisuUENISU8gICA9MHgwMDAwMDBEMCA7CisuUENMTyAgICA9MHgwMDAwMDA1NCA7CisuUENWQlNWICA9MHgwMDAwMDAwRSA7CisuUENWVFNVICA9MHgwMDAwMDAxMiA7CisuUENWVFNWICA9MHgwMDAwMDAxNiA7CisuUENWVFNWTCA9MHgwMDAwMDAxQSA7CisuUENWVFVTICA9MHgwMDAwMDAxRSA7CisuUERJUyAgICA9MHgwMDAwMDAyMiA7CisuUERJU0wgICA9MHgwMDAwMDAyNiA7CisuUERWSiAgICA9MHgwMDAwMDAyQSA7CisuUEVJTyAgICA9MHgwMDAwMDBDQyA7CisuUEVPRiAgICA9MHgwMDAwMDA1OCA7CisuUEVPTCAgICA9MHgwMDAwMDA1QyA7CisuUEVRVVMgICA9MHgwMDAwMDAyRSA7CisuUEVRVVYgICA9MHgwMDAwMDAzMiA7CisuUEVRVVZMICA9MHgwMDAwMDAzNiA7CisuUEVRVVcgICA9MHgwMDAwMDBERSA7CisuUEdDTSAgICA9MHgwMDAwMDA2NCA7CisuUEdFUVMgICA9MHgwMDAwMDAzQSA7CisuUEdFUVYgICA9MHgwMDAwMDAzRSA7CisuUEdFUVZMICA9MHgwMDAwMDA0MiA7CisuUEdFVCAgICA9MHgwMDAwMDA2MCA7CisuUEdSVFMgICA9MHgwMDAwMDA0NiA7CisuUEdSVFYgICA9MHgwMDAwMDA0QSA7CisuUEdSVFZMICA9MHgwMDAwMDA0RSA7CisuUElBQ1QgICA9MHgwMDAwMDA2QyA7CisuUElGRCAgICA9MHgwMDAwMDA2OCA7CisuUElORFMgICA9MHgwMDAwMDA1MiA7CisuUElORFYgICA9MHgwMDAwMDA1NiA7CisuUElORFZMICA9MHgwMDAwMDA1QSA7CisuUElORFcgICA9MHgwMDAwMDBENiA7CisuUExEQ1MgICA9MHgwMDAwMDA1RSA7CisuUExEQ1YgICA9MHgwMDAwMDA2MiA7CisuUExFUVMgICA9MHgwMDAwMDA2NiA7CisuUExFUVYgICA9MHgwMDAwMDA2QSA7CisuUExFUVZMICA9MHgwMDAwMDA2RSA7CisuUExFU1MgICA9MHgwMDAwMDA3MiA7CisuUExFU1YgICA9MHgwMDAwMDA3NiA7CisuUExFU1ZMICA9MHgwMDAwMDA3QSA7CisuUExPRFMgICA9MHgwMDAwMDA3RSA7CisuUExPRFYgICA9MHgwMDAwMDA4MiA7CisuUExPRFZMICA9MHgwMDAwMDA4NiA7CisuUE1PREogICA9MHgwMDAwMDA4QSA7CisuUE1PViAgICA9MHgwMDAwMDBFMiA7CisuUE1QSiAgICA9MHgwMDAwMDA4RSA7CisuUE5FUVMgICA9MHgwMDAwMDA5MiA7CisuUE5FUVYgICA9MHgwMDAwMDA5NiA7CisuUE5FUVZMICA9MHgwMDAwMDA5QSA7CisuUE5FUVcgICA9MHgwMDAwMDBEQSA7CisuUFBBR0UgICA9MHgwMDAwMDBENCA7CisuUFBFRSAgICA9MHgwMDAwMDA3MCA7CisuUFBVVCAgICA9MHgwMDAwMDA3NCA7CisuUFJEQiAgICA9MHgwMDAwMDA3OCA7CisuUFJEQyAgICA9MHgwMDAwMDA3QyA7CisuUFJESCAgICA9MHgwMDAwMDA4MCA7CisuUFJESSAgICA9MHgwMDAwMDA4NCA7CisuUFJESiAgICA9MHgwMDAwMDA4OCA7CisuUFJEUlMgICA9MHgwMDAwMDBDOCA7CisuUFJEUyAgICA9MHgwMDAwMDA4QyA7CisuUFJEViAgICA9MHgwMDAwMDA5MCA7CisuUFJMTiAgICA9MHgwMDAwMDA5NCA7CisuUFJSQU4gICA9MHgwMDAwMDA5OCA7CisuUFJTVCAgICA9MHgwMDAwMDA5QyA7CisuUFJXVCAgICA9MHgwMDAwMDBBMCA7CisuUFNDT04gICA9MHgwMDAwMDA5RSA7CisuUFNDT1AgICA9MHgwMDAwMDBBMiA7CisuUFNERUwgICA9MHgwMDAwMDBBNiA7CisuUFNJTlMgICA9MHgwMDAwMDBBQSA7CisuUFNMRU4gICA9MHgwMDAwMDBBRSA7CisuUFNQT1MgICA9MHgwMDAwMDBCMiA7CisuUFNUQ1YgICA9MHgwMDAwMDBCNiA7CisuUFNUQ1ZMICA9MHgwMDAwMDBCQSA7CisuUFNUT1MgICA9MHgwMDAwMDBCRSA7CisuUFNUT1YgICA9MHgwMDAwMDBDMiA7CisuUFNUT1ZMICA9MHgwMDAwMDBDNiA7CisuUFNUUlMgICA9MHgwMDAwMDBDQSA7CisuUFNUUlYgICA9MHgwMDAwMDBDRSA7CisuUFNUUlZMICA9MHgwMDAwMDBEMiA7CisuUFdMTiAgICA9MHgwMDAwMDBBNCA7CisuUFdSQU4gICA9MHgwMDAwMDBBOCA7CisuUFdSQiAgICA9MHgwMDAwMDBBQyA7CisuUFdSQyAgICA9MHgwMDAwMDBCMCA7CisuUFdSSCAgICA9MHgwMDAwMDBCNCA7CisuUFdSSSAgICA9MHgwMDAwMDBCOCA7CisuUFdSSiAgICA9MHgwMDAwMDBCQyA7CisuUFdSUyAgICA9MHgwMDAwMDBDMCA7CisuUFdSViAgICA9MHgwMDAwMDBDNCA7CisKKy8qCisuUEFGST0weCAgID0gMHgwMDsKKy5QQ0hJTyAgID0weCAweDAwMDAwMDsKKy5QQ0xPICAgID0weCA2NCA7CisuUEM7CisuUENWVFNVICA9MHggMHgwMDAwMDA7CisuUENWVFNWICA9MHggMHgwMDAwMDA7CisuUENWVFNWTCA9MHggMHgwMDAwMDA7CisuUENWVFVTICA9MHggMTU4IDsKKy5QOworLlBESVNMICAgPTB4IDB4MDAwMDAwOworLlBEVkogICAgPTB4IDB4MDAwMDAwOworLlBFSU8gICAgPTB4IDB4MDAwMDAwOworLlBFT0YgICAgPTB4IDB4MDAwMDAwOworLlBFT0wgICAgPTB4IDB4MDAwMDAwOworLlBFUVVTICAgPTB4IDB4MDAwMDAwOworLlBFUVVWICAgPTB4IDB4MDAwMDAwOworLlBFUVVWTCAgPTB4IDB4MDAwMDAwOworLlBFUVVXICAgPTB4IDB4MDAwMDAwOworLlBHQ00gICAgPTB4IDB4MDAwMDAwOworLlBHRVFTICAgPTB4IDB4MDAwMDAwOworLlBHRVFWICAgPTB4IDB4MDAwMDAwOworLlBHRVFWTCAgPTB4IDB4MDAwMDAwOworLlBHRVQgICAgPTB4IDB4MDAwMDAwOworLlBHUlRTICAgPTB4IDB4MDAwMDAwOworLlBHUlRWICAgPTB4IDB4MDAwMDAwOworLlBHUlRWTCAgPTB4IDB4MDAwMDAwOworLlBJQUNUICAgPTB4IDB4MDAwMDAwOworLlBJRkQgICAgPTB4IDEyNiA7CisuUDsKKy5QSU5EViAgID0weCAweDAwMDAwMDsKKy5QSU5EVkwgID0weCAweDAwMDAwMDsKKy5QSU5EVyAgID0weCAweDAwMDAwMDsKKy5QTERDUyAgID0weCAweDAwMDAwMDsKKy5QTERDViAgID0weCAweDAwMDAwMDsKKy5QTEVRUyAgID0weCAweDAwMDAwMDsKKy5QTEVRViAgID0weCAweDAwMDAwMDsKKy5QTEVRVkwgID0weCAweDAwMDAwMDsKKy5QTEVTUyAgID0weCAweDAwMDAwMDsKKy5QTEVTViAgID0weCAweDAwMDAwMDsKKy5QTEVTVkwgID0weCAweDAwMDAwMDsKKy5QTE9EUyAgID0weCAweDAwMDAwMDsKKy5QTE9EViAgID0weCAweDAwMDAwMDsKKy5QTE9EVkwgID0weCAweDAwMDAwMDsKKy5QTU9ESiAgID0weCAweDAwMDAwMDsKKy5QTU9WICAgID0weCAweDAwMDAwMDsKKy5QTVBKICAgID0weCAweDAwMDAwMDsKKy5QTkVRUyAgID0weCAweDAwMDAwMDsKKy5QTkVRViAgID0weCAweDAwMDAwMDsKKy5QTkVRVkwgID0weCAweDAwMDAwMDsKKy5QTkVRVyAgID0weCAweDAwMDAwMDsKKy5QUEFHRSAgID0weCAweDAwMDAwMDsKKy5QUEVFICAgID0weCAweDAwMDAwMDsKKy5QUFVUICAgID0weCAweDAwMDAwMDsKKy5QUkRCICAgID0weCAweDAwMDAwMDsKKy5QUkRDICAgID0weCAweDAwMDAwMDsKKy5QUkRIICAgID0weCAweDAwMDAwMDsKKy5QUkRJICAgID0weCAweDAwMDAwMDsKKy5QUkRKICAgID0weCAweDAwMDAwMDsKKy5QUkRSUyAgID0weCAweDAwMDAwMDsKKy5QUkRTICAgID0weCAweDAwMDAwMDsKKy5QUkRWICAgID0weCAweDAwMDAwMDsKKy5QUkxOICAgID0weCAweDAwMDAwMDsKKy5QUlJBTiAgID0weCAweDAwMDAwMDsKKy5QUlNUICAgID0weCAweDAwMDAwMDsKKy5QUldUICAgID0weCAweDAwMDAwMDsKKy5QU0NPTiAgID0weCAweDAwMDAwMDsKKy5QU0NPUCAgID0weCAweDAwMDAwMDsKKy5QU0RFTCAgID0weCAweDAwMDAwMDsKKy5QU0lOUyAgID0weCAweDAwMDAwMDsKKy5QU0xFTiAgID0weCAweDAwMDAwMDsKKy5QU1BPUyAgID0weCAweDAwMDAwMDsKKy5QU1RDViAgID0weCAweDAwMDAwMDsKKy5QU1RDVkwgID0weCAweDAwMDAwMDsKKy5QU1RPUyAgID0weCAweDAwMDAwMDsKKy5QU1RPViAgID0weCAweDAwMDAwMDsKKy5QU1RPVkwgID0weCAweDAwMDAwMDsKKy5QU1RSUyAgID0weCAweDAwMDAwMDsKKy5QU1RSViAgID0weCAweDAwMDAwMDsKKy5QU1RSVkwgID0weCAweDAwMDAwMDsKKy5QV0xOICAgID0weCAweDAwMDAwMDsKKy5QV1JBTiAgID0weCAweDAwMDAwMDsKKy5QV1JCICAgID0weCAweDAwMDAwMDsKKy5QV1JDICAgID0weCAweDAwMDAwMDsKKy5QV1JIICAgID0weCAweDAwMDAwMDsKKy5QV1JJICAgID0weCAweDAwMDAwMDsKKy5QV1JKICAgID0weCAweDAwMDAwMDsKKy5QV1JTICAgID0weCAweDAwMDAwMDsKKy5QV1JWICAgID0weCAweDAwMDAwMDsKKworKi8KKy8qCisuUD0weCAgICAgID0gMDsKKy5QQ0hJTyAgID0weCAweGZlZWRmYTsKKy5QQ0xPICAgID0weCAweGZlZWRmYTsKKy5QQ1ZCU1YgID0weCAweGZlZWRmYTsKKy5QQ1ZUU1UgID0weCAweGZlZWRmYTsKKy5QQ1ZUU1YgID0weCAweGZlZWRmYTsKKy5QQ1ZUU1ZMID0weCAweGZlZWRmYTsKKy5QQ1ZUVVMgID0weCAweGZlZWRmYTsKKy5QRElTICAgID0weCAweGZlZWRmYTsKKy5QRElTTCAgID0weCAweGZlZWRmYTsKKy5QRFZKICAgID0weCAweGZlZWRmYTsKKy5QRUlPICAgID0weCAweGZlZWRmYTsKKy5QRU9GICAgID0weCAweGZlZWRmYTsKKy5QRU9MICAgID0weCAweGZlZWRmYTsKKy5QRVFVUyAgID0weCAweGZlZWRmYTsKKy5QRVFVViAgID0weCAweGZlZWRmYTsKKy5QRVFVVkwgID0weCAweGZlZWRmYTsKKy5QRVFVVyAgID0weCAweGZlZWRmYTsKKy5QR0NNICAgID0weCAweGZlZWRmYTsKKy5QR0VRUyAgID0weCAweGZlZWRmYTsKKy5QR0VRViAgID0weCAweGZlZWRmYTsKKy5QR0VRVkwgID0weCAweGZlZWRmYTsKKy5QR0VUICAgID0weCAweGZlZWRmYTsKKy5QR1JUUyAgID0weCAweGZlZWRmYTsKKy5QR1JUViAgID0weCAweGZlZWRmYTsKKy5QR1JUVkwgID0weCAweGZlZWRmYTsKKy5QSUFDVCAgID0weCAweGZlZWRmYTsKKy5QSUZEICAgID0weCAweGZlZWRmYTsKKy5QSU5EUyAgID0weCAweGZlZWRmYTsKKy5QSU5EViAgID0weCAweGZlZWRmYTsKKy5QSU5EVkwgID0weCAweGZlZWRmYTsKKy5QSU5EVyAgID0weCAweGZlZWRmYTsKKy5QTERDUyAgID0weCAweGZlZWRmYTsKKy5QTERDViAgID0weCAweGZlZWRmYTsKKy5QTEVRUyAgID0weCAweGZlZWRmYTsKKy5QTEVRViAgID0weCAweGZlZWRmYTsKKy5QTEVRVkwgID0weCAweGZlZWRmYTsKKy5QTEVTUyAgID0weCAweGZlZWRmYTsKKy5QTEVTViAgID0weCAweGZlZWRmYTsKKy5QTEVTVkwgID0weCAweGZlZWRmYTsKKy5QTE9EUyAgID0weCAweGZlZWRmYTsKKy5QTE9EViAgID0weCAweGZlZWRmYTsKKy5QTE9EVkwgID0weCAweGZlZWRmYTsKKy5QTU9ESiAgID0weCAweGZlZWRmYTsKKy5QTU9WICAgID0weCAweGZlZWRmYTsKKy5QTVBKICAgID0weCAweGZlZWRmYTsKKy5QTkVRUyAgID0weCAweGZlZWRmYTsKKy5QTkVRViAgID0weCAweGZlZWRmYTsKKy5QTkVRVkwgICAgPSAweGZlZWRmYWNlOworLlBORVFXICAgICA9IDB4ZmVlZGZhY2U7CisuUFBBR0UgICAgID0gMHhmZWVkZmFjZTsKKy5QUEVFICAgICAgPSAweGZlZWRmYWNlOworLlBQVVQgICAgICA9IDB4ZmVlZGZhY2U7CisuUFJEQiAgICAgID0gMHhmZWVkZmFjZTsKKy5QUkRDICAgICAgPSAweGZlZWRmYWNlOworLlBSREggICAgICA9IDB4ZmVlZGZhY2U7CisuUFJESSAgICAgID0gMHhmZWVkZmFjZTsKKy5QUkRKICAgICAgPSAweGZlZWRmYWNlOworLlBSRFJTICAgICA9IDB4ZmVlZGZhY2U7CisuUFJEUyAgICAgID0gMHhmZWVkZmFjZTsKKy5QUkRWICAgICAgPSAweGZlZWRmYWNlOworLlBSTE4gICAgICA9IDB4ZmVlZGZhY2U7CisuUFJSQU4gICAgID0gMHhmZWVkZmFjZTsKKy5QUlNUICAgICAgPSAweGZlZWRmYWNlOworLlBSV1QgICAgICA9IDB4ZmVlZGZhY2U7CisuUFNDT04gICAgID0gMHhmZWVkZmFjZTsKKy5QU0NPUCAgICAgPSAweGZlZWRmYWNlOworLlBTREVMICAgICA9IDB4ZmVlZGZhY2U7CisuUFNJTlMgICAgID0gMHhmZWVkZmFjZTsKKy5QU0xFTiAgICAgPSAweGZlZWRmYWNlOworLlBTUE9TICAgICA9IDB4ZmVlZGZhY2U7CisuUFNUQ1YgICAgID0gMHhmZWVkZmFjZTsKKy5QU1RDVkwgICAgPSAweGZlZWRmYWNlOworLlBTVE9TICAgICA9IDB4ZmVlZGZhY2U7CisuUFNUT1YgICAgID0gMHhmZWVkZmFjZTsKKy5QU1RPVkwgICAgPSAweGZlZWRmYWNlOworLlBTVFJTICAgICA9IDB4ZmVlZGZhY2U7CisuUFNUUlYgICAgID0gMHhmZWVkZmFjZTsKKy5QU1RSVkwgICAgPSAweGZlZWRmYWNlOworLlBXTE4gICAgICA9IDB4ZmVlZGZhY2U7CisuUFdSQU4gICAgID0gMHhmZWVkZmFjZTsKKy5QV1JCICAgICAgPSAweGZlZWRmYWNlOworLlBXUkMgICAgICA9IDB4ZmVlZGZhY2U7CisuUFdSSCAgICAgID0gMHhmZWVkZmFjZTsKKy5QV1JJICAgICAgPSAweGZlZWRmYWNlOworLlBXUkogICAgICA9IDB4ZmVlZGZhY2U7CisuUFdSUyAgICAgID0gMHhmZWVkZmFjZTsKKy5QV1JWICAgICAgPSAweGZlZWRmYWNlOworKi8KKworfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLm9vayBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmMjRhNQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKQEAgLTAsMCArMSw5OSBAQAorUzAxMjAwMDA2OTZFNjk3NDc0NjU3Mzc0NUY2NTcwNjMyRTczNzJDRg0KK1MxMTgwMDAwMDAwMDAwMDA0OTRFNDk1NDU0NDU1MzU0MjAyMDUwNDEzMDM1MjAyMDUyQUINCitTMTE4MDAxNTMxMzMyRTMzMjAyMDIwMjAyMDIwMjA1MjMxMzMyRTMyMjAyMDIwMjAyMDc3DQorUzExODAwMkEyMDIwMDA5MzRCNUIwMEI1RTZDMTFCMDg5REQ2MDAwMDU0MDAwMDAwMDVGOQ0KK1MxMTgwMDNGNUEwMDAwMDA0ODAwNUMwMEE2MDAwMDAxMEEwMTI2MDAwNDAwMDEwMDAyQ0INCitTMTE4MDA1NDAwOTAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwNDAyMDIwMDAwMDQ5NEY1RjhBDQorUzExODAwNjk1MjQ1NTM0NTUyNTY0MTUyNTQ0QzQ5NDI0MzRGNEUwMDQwNDg0NTAxMDAzQg0KK1MxMTgwMDdFNTA1RjQxNEM0QzIwMjAyMDIwMjA1MjU0NEM0OTQyNDM0RjRFMDEwMDAwRTMNCitTMTE4MDA5MzAwMDA5QzAxMDAwMDAwMDAwMDAwMDg1MzQ1NTA0MTUyNDE1NDQ1MDAwODUyDQorUzExODAwQTgwMDA4MDA0MDMxQ0Y1MjU0NEM0OTQyNDM0RjRFMDAwNEU1RUM1MjU0NENEMw0KK1MxMTgwMEJENDk0MjQzNEY0RTAwQjVFODZENTM0MTQ2NDU1MzU0NEY1MjAwMDA0RjI4RDcNCitTMTE4MDBEMjUzNTk1MzU0NDU0RDQ5NEQwMEI1RTg3MzUzNDE0NjQ1NTM1NDRGNTIwMDIzDQorUzExODAwRTc0MDMxRDI1MjU0NEM0OTQyNDM0RjRFMDAwMDBBN0Q1MjU0NEM0OTQyNTMwOQ0KK1MxMTgwMEZDNTQ1MjAwMTBBNEE4NTI1NDRDNDk0MjQ2NDk0QzAwMDEwMEI1RTZDMDQ5RUMNCitTMTE4MDExMTRFNDk1NDU0NDU1MzU0MjAyMDAwMDAwNjE2MDIwMDA4MDAwMDAwMDIzMjEwDQorUzExODAxMjYwMDQ4MDAwMDAwMDA0RTU2RkZGMEJBOEY2MzA2MkU0RTYxMDAwMEJDNDE1OQ0KK1MxMTgwMTNCRkEwMEY0NDNFRUZGRjAzMkQ4MkQ3QzAwMDAwMDAxRkZGQzIwNkUwMDA4NTgNCitTMTE4MDE1MDIwMDg2NjA0NjEwMDAwQkEyMjJFRkZGQzUzODE0QTgxNkMwNDYxMDAwMDJFDQorUzExODAxNjU5RTIyNDhEM0U5RkZGQzQxRjAxODAwQjNDODYzRUU0QTEwNjYwMDAwMDZFNw0KK1MxMTgwMTdBNjAwMDAwNjI0MUVFRkZGMDI2NkMwMDM4NEVBQjAwN0UyMDZFMDAwODIwOTUNCitTMTE4MDE4RjA4NjYwNDYxMDAwMDdDMjIyRUZGRkM1MzgxNEE4MTZDMDQ2MTAwMDA2MEVEDQorUzExODAxQTQyMjQ4RDNFOUZGRkM0MUYwMTgwMEIzQzg2M0VFMUYxMDNGM0MwMDAxMjYzQg0KK1MxMTgwMUI5NkMwMDM4NEVBQjAwOUU0MUVFRkZGMDcwMEMyNjZDMDAzODRFQUIwMENBQ0INCitTMTE4MDFDRTUyQUVGRkZDMENBRTAwMDAwMDBBRkZGQzZGMDBGRjcwNDFFRUZGRjA0MzFGDQorUzExODAxRTNFRTAwMEMyMkQ4MjJEODIyRDg0RTVFMjA1RjU4OEY0RUQwMkI1N0ZGRjI3OA0KK1MxMTgwMUY4MkYzQzAwMDAwMDBBNjAwMDAwMUUyQjU3RkZGMjJGM0MwMDAwMDAwRjYwQUUNCitTMTE4MDIwRDAwMDAxMDJCNTdGRkYyMkYzQzAwMDAwMDEwNjAwMDAwMDIzQjZGMDAwMkNDDQorUzExODAyMjJGRkY2MkYyRDAwMzgyRjJEMDAzNDRFNEM0RTRBMDAwMDRGRURGRUVBMjAzNA0KK1MxMTgwMjM3M0MwMDAwMDA4QTIwNEY0MjU4NTFDOEZGRkM0ODZERkVFQTFGM0MwMDA0Q0YNCitTMTE4MDI0QzNGM0MwMDAxOUZGQzAwMDAwMDBDMjI0RjQ1RkEwMkQ0MjJEQTIyREEyMkQ2DQorUzExODAyNjFEQTI2NkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwNjg0ODZERkZCODQ4NkQ0Mw0KK1MxMTgwMjc2RkZCNDJGMEMyMDZDMDAwODI4NkMwMDBDNEU5MDlGRkMwMDAwMDA1MjJGNTMNCitTMTE4MDI4QjJERkZDNjJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDcwNTIyNjZDMDAzODdGDQorUzExODAyQTA0RUFCMDAxRTQxRkEwMjk0MjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEUwNA0KK1MxMTgwMkI1QUIwMDlFNDFFREZGQkEyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RUFCRkMNCitTMTE4MDJDQTAwOUUxRjNDMDAyODNGM0MwMDAxMjY2QzAwMzg0RUFCMDA5RTlGRkMwMDgyDQorUzExODAyREYwMDAwNTIzMDJERkZDQTQ4QzAyRjAwMkYwQzIwNkMwMDEwMjg2QzAwMTREOA0KK1MxMTgwMkY0NEU5MDcwNTIyNjZDMDAzODRFQUIwMDFFMjY2QzAwMzg0RUFCMDA5RTQxQ0UNCitTMTE4MDMwOUZBMDIzNDI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFQUIwMDlFNDFFRERCDQorUzExODAzMUVGRjgwNzAxNjI2NkMwMDM4NEVBQjAwQ0E5RkZDMDAwMDAwMEU2MTAwMDIyOA0KK1MxMTgwMzMzMjg0MUVERkY5RTIwREYyMERGMjBERjMwREY0QTJERkY5RTY3MDAwMDNBRkQNCitTMTE4MDM0ODU5OEYyRjJERkZBMDJGMkRGRkE4MkYwQzIwNkMwMDE4Mjg2QzAwMUM0RUQ5DQorUzExODAzNUQ5MDAxQjgyQjVGRkY5QTJGMkRGRjlBMkYyREZGQTQyRjJERkZBODJGMENFOQ0KK1MxMTgwMzcyMjA2QzAwMjAyODZDMDAyNDRFOTA2MDAwMDAzNDU5OEYyRjJERkZBMDQ4NzENCitTMTE4MDM4NzZERkZBODJGMEMyMDZDMDAyODI4NkMwMDJDNEU5MDJCNUZGRjk2MkYyRDQxDQorUzExODAzOUNGRkE0MkYyREZGOTYyRjJERkZBODJGMEMyMDZDMDAyMDI4NkMwMDI0NEVDNA0KK1MxMTgwM0IxOTA0ODZERkVFQTlGRkMwMDAwMDA1MjIwNEY0M0VERkY4MDMwMTk3MjUwRjANCitTMTE4MDNDNjkyNDA2RjAyNDI0MUQwNDEzMEMwNkYwQTUzNDBFMjQwMzBEOTUxQzhGRjA4DQorUzExODAzREJGQzlGRkMwMDAwMDA1MjIyNEY0NUZBMDE1QzMyREEyNjZDMDA0MDJGMENGQQ0KK1MxMTgwM0YwMjg2QzAwNDQ0RUFCMDA1MDAxMkM0ODZERkVFQTI2NkMwMDQwMkYwQzI4RDQNCitTMTE4MDQwNTZDMDA0NDRFQUIwMEEwMDExODQ4N0EwMTM0M0YzQ0ZGRkY0ODZERkVFQTZGDQorUzExODA0MUEyNjZDMDA0MDJGMEMyODZDMDA0NDRFQUIwMEMwMDBGQzQ4NkRGRUVBMjY2Qw0KK1MxMTgwNDJGNkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwQTQwMEU4NDJBREZGQjAyQjdDMkINCitTMTE4MDQ0NDAwMDAwMDAxRkZBQzU5OEYyRjJERkZBQzYxMDAwMTdFMkI1RkZGQjAyQkMwDQorUzExODA0NTk0MEZGQjAyRjJERkZBQzNGM0MwMDBBNDg2REZFRUEyNjZDMDA0MDJGMEM2NQ0KK1MxMTgwNDZFMjg2QzAwNDQ0RUFCMDBCQzAwQUU5RkZDMDAwMDAwMEMyRjJERkZCMDYxMjcNCitTMTE4MDQ4MzAwRkNBODJGMEYzRjNDMDAwQTQ4NkRGRUVBMjY2QzAwNDAyRjBDMjg2Q0JCDQorUzExODA0OTgwMDQ0NEVBQjAwQzAwMDg2REZGQzAwMDAwMDBDNDg2REZFRUEyNjZDMDBCMg0KK1MxMTgwNEFENDAyRjBDMjg2QzAwNDQ0RUFCMDBBNDAwNkM1MkFERkZBQzBDQUQwMDAwNzcNCitTMTE4MDRDMjAwMEFGRkFDNkY4MjQ4NkRGRUVBMUYzQzAwMDEyNjZDMDA0MDJGMEMyODREDQorUzExODA0RDc2QzAwNDQ0RUFCMDA1NDQ4NkRGRkI4NDg2REZGQjQyRjBDMjA2QzAwMzA0NA0KK1MxMTgwNEVDMjg2QzAwMzQ0RTkwNDg2REZFRUE0MjI3MjY2QzAwNDAyRjBDMjg2QzAwQUENCitTMTE4MDUwMTQ0NEVBQjAwNTQ0MkE3MkYyRDAwMzgyRjJEMDAzNDRFNEEyQjU3RkZGMjM4DQorUzExODA1MTYyRjNDMDAwMDAwMEM2MDAwRkQwMDJCNTdGRkYyMkYzQzAwMDAwMDY0NjA1Ng0KK1MxMTgwNTJCMDBGQ0YyMDAwQTQ2MzEyMDIwMjAyMDIwMjAyMDIwMDAwMjNBM0EwMDAyRDANCitTMTE4MDU0MDI5M0EwMDAwMDAxNDIwMjAyMDIwMjAyMDQzNjE3MzY1MjAyMDIwMjA1MjFEDQorUzExODA1NTU2NTczNzU2Qzc0NDFGQTAwMDREMUZDRkZGRkZBQTAyMDI4MDAzQzQzRkFGQg0KK1MxMTgwNTZBMDAwNEQzRkMwMDAwMDFENjQ1RkEwMDA0RDVGQzAwMDAwMjVFMjYwQTU4RDINCitTMTE4MDU3RjhBRDA4ODU1ODAyMjI4MDA1NjY2MDAwMDJFMjQwODI2NUFENUIwQjgwMDhGDQorUzExODA1OTRCNUMwNkRGNjIyMDk5Mjg4MjE0MTAwNTY0MjgxMjY0OEQyNUJCN0M5NkQyRQ0KK1MxMTgwNUE5RkE0NDQxRDM2ODAwNUExMjNDMDAwMTYwMDAwMDA0NDI0MTFGNDEwMDA0OEINCitTMTE4MDVCRTJGNjgwMDM0MDAwNjJGNDkwMDBBOTY4OTJGNDMwMDBFNEU3NTRFNTZGRkNDDQorUzExODA1RDNGMDIwMkUwMDA4NDdGQTAwMDREN0ZDMDAwMDAxQTYyMjBCNDFGQTAwMDQ5RQ0KK1MxMTgwNUU4RDFGQzAwMDAwMUI2MkQ1OEZGRjAyRDU4RkZGNDJENThGRkY4MkQ1MEZGOTINCitTMTE4MDVGREZDNTM4MDc0MDhCNDgwNjUwMDAxMkM0MUZBMDAwNEQxRkMwMDAwMDAwRUJBDQorUzExODA2MTJEMDgwMzAzMDA4MDA0RUZCMDAwMjAwMTIwMDIyMDAzMjAwNDIwMDQ4MDBEQw0KK1MxMTgwNjI3NTgwMDZDMDBBMDAwREM0MUZBMDAwNEQxRkMwMDAwMDExODIwMTA2MDAwQzUNCitTMTE4MDYzQzAxMDI0N0ZBMDAwNEQ3RkMwMDAwMDEwQzIwMEI2MDAwMDBGMjQxRkEwMEM1DQorUzExODA2NTEwNEQxRkMwMDAwMDExMDIwMTA2MDAwMDBFMjIwMDE2MDAwMDBEQzQ3RkE5RQ0KK1MxMTgwNjY2MDAwNEQ3RkMwMDAwMDEyMDIwMEI2MDAwMDBDQzQzRkEwMDA0RDNGQzAwMUMNCitTMTE4MDY3QjAwMDBGQTQxRTkwMDBDMjAxMDYwMDAwMEI4MjQyRUZGRjQ0N0ZBMDAwNDY0DQorUzExODA2OTBEN0ZDMDAwMDAwRkVCNDhCNjYwMDAwMTI0N0ZBMDAwNEQ3RkMwMDAwMDFCMA0KK1MxMTgwNkE1MTQyMDBCNjAwMDAwOTQ0N0ZBMDAwNEQ3RkMwMDAwMDEwQTIwMEI2MDAwNUINCitTMTE4MDZCQTAwODQ0MUZBMDAwNEQxRkMwMDAwMDA4QTIwNTA0N0ZBMDAwNEQ3RkMwMDg1DQorUzExODA2Q0YwMDAwODJCMUNCNjYwMDAwMTI0N0ZBMDAwNEQ3RkMwMDAwMDBFMDIwMEI3OQ0KK1MxMTgwNkU0NjAwMDAwNTg0N0ZBMDAwNEQ3RkMwMDAwMDBEMjIwMEI2MDAwMDA0ODQxNDcNCitTMTE4MDZGOUZBMDAwNEQxRkMwMDAwMDA0RTQzRkEwMDA0RDNGQzAwMDAwMDNFQjNEMEZFDQorUzExODA3MEU2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMEFFMjAwQjYwMDAwMDFFNDdBNA0KK1MxMTgwNzIzRkEwMDA0RDdGQzAwMDAwMEE2MjAwQjYwMDAwMDBFNDdGQTAwMDREN0ZDOTUNCitTMTE4MDczODAwMDAwMDk4MjAwQjRFNUU0RTc0MDAwNDAwMDA1Mzc1NkU2NTAwMDAwMEQ4DQorUzExODA3NEQwMDA3NDY0Rjc0NzQ2RjAwMDAwMDAwMDAwQTAwMDAwMDBDNTA2NTZDNkNGRA0KK1MxMTgwNzYyNjUwMDAwMDAwNzVFNTM3NDY5NkU2MTAwNEI2MTcyNjk2RTAwMDAwMDAwQzANCitTMTE4MDc3NzA1MDAwMDA3NjgwMDAwMDAwMzAwMDAwNzZFNTA3NTc0NzQ2NTAwNEI2MUJGDQorUzExODA3OEM2QzZDNjUwMDUzNzQ2OTZFNjEzMTAwMDA0QjYxNzI2OTZFMzEwMDAwMDBDMQ0KK1MxMTgwN0ExMDAwMDMzMDAwMDA3OTAwMDAwMDAxRjAwMDAwNzk4Nzg3OTdBN0EwMDAwRDINCitTMTE4MDdCNjRGNkM2QzY1MDAwMDM3MDAzODAwNTA2NTc0NjU3MjAwNTM3Njc1NkM2QzE5DQorUzExODA3Q0I2RjAwMDAzOTAwNTM2Qzc1NzQwMDAwMDAwMDAwMDAwMDAwMDc0QzAwMDA3Mg0KK1MxMTUwN0UwMDc2NDAwMDAwNzc4MDAwMDA3ODAwMDAwMDdBNDAwMDAwN0FDMzQNCitTOTAzMDAwMEZDDQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYzA2NgotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy92ZXJzYWRvcy5leHAKQEAgLTAsMCArMSw5OSBAQAorIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzYWRvcyB0ZXN0cworIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKKyMKKworIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gcmVhZCB2ZXJzYWRvcyBpbWFnZXMgYW5kCisjIGdlbmVyYXRlIGJpbmFyaWVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gdGhlIGN1c3RvbWVyJ3MKKyMgb2xkIG1ldGhvZC4KKworIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCisKKyMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiA2OGsgY29mZiB0YXJnZXRzCisjIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KK2lmIHsgIVtpc3RhcmdldCBtNjhrLSotY29mZipdIH0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKK3NldCB0ZXN0bmFtZSAiTEQgVkVSU0FET1MiCisKKworcHJvYyBpbnNwZWN0IHsgd2hpY2hvbmUgfSB7CisgICAgZ2xvYmFsIG9iamR1bXAKKyAgICBnbG9iYWwgZXhlY19vdXRwdXQKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCB0ZXN0bmFtZQorCisgICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1zIHRtcGRpci8kd2hpY2hvbmUub3V0ID50bXBkaXIvJHdoaWNob25lLmR1bXBcbiIKKyAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyB0bXBkaXIvJHdoaWNob25lLm91dCB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kdW1wIiBleGVjX291dHB1dAorCisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorCXZlcmJvc2UgJGV4ZWNfb3V0cHV0CisJdW5yZXNvbHZlZCAkdGVzdG5hbWUKKwlyZXR1cm4gMAorICAgIH0KKworICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayA+dG1wZGlyLyR3aGljaG9uZS5kb2tcbiIKKyAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0CisKKyAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKKwlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCisJdmVyYm9zZSAkZXhlY19vdXRwdXQKKwl1bnJlc29sdmVkICR0ZXN0bmFtZQorCXJldHVybiAwCisgICAgfQorCisgICAgIyBjb21wYXJlIGl0IHdpdGggdGhlIGNvcnJlY3Qgb3V0cHV0CisgICAgY2F0Y2ggImV4ZWMgZGlmZiB0bXBkaXIvJHdoaWNob25lLmR1bXAgdG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0CisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7CisJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgorCXZlcmJvc2UgJGV4ZWNfb3V0cHV0CisJZmFpbCAkdGVzdG5hbWUKKwlyZXR1cm4gMAorICAgIH0KKworICAgIHJldHVybiAxCit9CisKK2lmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci90MS5vdXQgXAorCSIgLVQgJHNyY2Rpci8kc3ViZGlyL3QxLmxkICRzcmNkaXIvJHN1YmRpci90MS0xLnJvICAkc3JjZGlyLyRzdWJkaXIvdDEtMi5ybyJdIHsKKyAgICBmYWlsICR0ZXN0bmFtZQorICAgIHJldHVybgorfSBlbHNlIHsKKyAgICAjIEdldCBhIGR1bXAgb2Ygd2hhdCB3ZSd2ZSBnb3QsIGFuZCB3aGF0IHdlIHNob3VsZCBoYXZlCisgICAgaWYgIVtpbnNwZWN0IHQxXSB7CisJcmV0dXJuCisgICAgfQorfQorCisKK2lmICFbbGRfc2ltcGxlX2xpbmsgJGxkICB0bXBkaXIvdDIub3V0IFwKKwkiIC1UICRzcmNkaXIvJHN1YmRpci90Mi5sZCAkc3JjZGlyLyRzdWJkaXIvdDItMi5ybyBcCisJJHNyY2Rpci8kc3ViZGlyL3QyLTEucm8gICRzcmNkaXIvJHN1YmRpci90Mi0zLnJvIl0geworICAgIGZhaWwgJHRlc3RuYW1lCisgICAgcmV0dXJuCit9IGVsc2UgeworICAgICMgR2V0IGEgZHVtcCBvZiB3aGF0IHdlJ3ZlIGdvdCwgYW5kIHdoYXQgd2Ugc2hvdWxkIGhhdmUKKyAgICBpZiAhW2luc3BlY3QgdDJdIHsKKwlyZXR1cm4KKyAgICB9Cit9CisKK3Bhc3MgJHRlc3RuYW1lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAgYi9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhNDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2xkL3Rlc3RzdWl0ZS9saWIvbGQtbGliLmV4cApAQCAtMCwwICsxLDMyNyBAQAorIworIyBkZWZhdWx0X2xkX3ZlcnNpb24gCisjCWV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZAorIworcHJvYyBkZWZhdWx0X2xkX3ZlcnNpb24geyBsZCB9IHsKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisKKyAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKKwlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKKwlleGl0IDEKKyAgICB9CisgICAgCisgICAgY2F0Y2ggImV4ZWMgJGxkIC0tdmVyc2lvbiIgdG1wCisgICAgc2V0IHRtcCBbcHJ1bmVfd2FybmluZ3MgJHRtcF0KKyAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgJHRtcCB2ZXJzaW9uIGN5ZyBudW1iZXIKKyAgICBpZiBbaW5mbyBleGlzdHMgbnVtYmVyXSB0aGVuIHsKKwljbG9uZV9vdXRwdXQgIiRsZCAkbnVtYmVyXG4iCisgICAgfQorfQorCisjCisjIGRlZmF1bHRfbGRfcmVsb2NhdGUgCisjCWxpbmsgYW4gb2JqZWN0IHVzaW5nIHJlbG9jYXRpb24KKyMKK3Byb2MgZGVmYXVsdF9sZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0geworICAgIGdsb2JhbCBIT1NUSU5HX0VNVQorICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKKyAgICAKKyAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKKwlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKKwlyZXR1cm4gMAorICAgIH0KKyAgICAKKyAgICB2ZXJib3NlIC1sb2cgIiRsZCAkSE9TVElOR19FTVUgLW8gJHRhcmdldCAtciAkb2JqZWN0cyIKKyAgICAKKyAgICBjYXRjaCAiZXhlYyAkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgLXIgJG9iamVjdHMiIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworCXJldHVybiAxCisgICAgfSBlbHNlIHsKKwl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwlyZXR1cm4gMAorICAgIH0KK30KKworCisjCisjIGRlZmF1bHRfbGRfbGluayAKKyMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQKKyMKK3Byb2MgZGVmYXVsdF9sZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7CisgICAgZ2xvYmFsIEhPU1RJTkdfRU1VCisgICAgZ2xvYmFsIEhPU1RJTkdfQ1JUMAorICAgIGdsb2JhbCBIT1NUSU5HX0xJQlMKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisgICAgCisgICAgc2V0IG9ianMgIiRIT1NUSU5HX0NSVDAgJG9iamVjdHMiCisgICAgc2V0IGxpYnMgIiRIT1NUSU5HX0xJQlMiCisgICAgCisgICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7CisJcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCisJcmV0dXJuIDAKKyAgICB9CisgICAgCisgICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgJG9ianMgJGxpYnMiCisgICAgCisgICAgY2F0Y2ggImV4ZWMgJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0ICRvYmpzICRsaWJzIiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlyZXR1cm4gMQorICAgIH0gZWxzZSB7CisJdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCisJcmV0dXJuIDAKKyAgICB9Cit9CisKKyMKKyMgZGVmYXVsdF9sZF9zaW1wbGVfbGluayAKKyMJbGluayBhIHByb2dyYW0gdXNpbmcgbGQsIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBsaWJyYXJpZXMKKyMKK3Byb2MgZGVmYXVsdF9sZF9zaW1wbGVfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0geworICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKKyAgICAKKyAgICBpZiB7IFt3aGljaCAkbGRdID09IDAgfSB0aGVuIHsKKwlwZXJyb3IgIiRsZCBkb2VzIG5vdCBleGlzdCIKKwlyZXR1cm4gMAorICAgIH0KKyAgICAKKyAgICB2ZXJib3NlIC1sb2cgIiRsZCAtbyAkdGFyZ2V0ICRvYmplY3RzIgorICAgIAorICAgIGNhdGNoICJleGVjICRsZCAtbyAkdGFyZ2V0ICRvYmplY3RzIiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorCisgICAgIyBXZSBkb24ndCBjYXJlIGlmIHdlIGdldCBhIHdhcm5pbmcgYWJvdXQgYSBub24tZXhpc3RlbnQgc3RhcnQKKyAgICAjIHN5bWJvbCwgc2luY2UgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdCBtaWdodCB1c2UgRU5UUlkuCisgICAgcmVnc3ViIC1hbGwgIihefFxuKShcW15cblxdKjogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKKworICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlyZXR1cm4gMQorICAgIH0gZWxzZSB7CisJdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCisJcmV0dXJuIDAKKyAgICB9Cit9CisKKyMKKyMgZGVmYXVsdF9sZF9jb21waWxlIAorIwljb21waWxlIGFuIG9iamVjdCB1c2luZyBjYworIworcHJvYyBkZWZhdWx0X2xkX2NvbXBpbGUgeyBjYyBzb3VyY2Ugb2JqZWN0IH0geworICAgIGdsb2JhbCBDRkxBR1MKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKKyAgICBnbG9iYWwgZ2NjX2dhc19mbGFnCisKKyAgICBzZXQgY2NfcHJvZyAkY2MKKyAgICBpZiB7W2xsZW5ndGggJGNjX3Byb2ddID4gMX0gdGhlbiB7CisJc2V0IGNjX3Byb2cgW2xpbmRleCAkY2NfcHJvZyAwXQorICAgIH0KKyAgICBpZiB7W3doaWNoICRjY19wcm9nXSA9PSAwfSB0aGVuIHsKKwlwZXJyb3IgIiRjY19wcm9nIGRvZXMgbm90IGV4aXN0IgorCXJldHVybiAwCisgICAgfQorCisgICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamVjdCIgZXhlY19vdXRwdXQKKworICAgIHNldCBmbGFncyAiLUkkc3JjZGlyLyRzdWJkaXIgJENGTEFHUyIKKworICAgICMgSWYgd2UgYXJlIGNvbXBpbGluZyB3aXRoIGdjYywgd2Ugd2FudCB0byBhZGQgZ2NjX2dhc19mbGFnIHRvCisgICAgIyBmbGFncy4gIFJhdGhlciB0aGFuIGRldGVybWluZSB0aGlzIGluIHNvbWUgY29tcGxleCB3YXksIHdlIGd1ZXNzCisgICAgIyBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIuCisgICAgaWYge1tzdHJpbmcgbWF0Y2ggIipnY2MqIiAkY2NdIHx8IFtzdHJpbmcgbWF0Y2ggIiorKyoiICRjY119IHRoZW4geworCXNldCBmbGFncyAiJGdjY19nYXNfZmxhZyAkZmxhZ3MiCisgICAgfQorCisgICAgdmVyYm9zZSAtbG9nICIkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIKKworICAgIGNhdGNoICJleGVjICRjYyAkZmxhZ3MgLWMgJHNvdXJjZSAtbyAkb2JqZWN0IiBleGVjX291dHB1dAorICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKKwlpZiB7IVtmaWxlIGV4aXN0cyAkb2JqZWN0XX0gdGhlbiB7CisJICAgIHJlZ2V4cCAiLiovKFxbXi9cXSopJCIgJHNvdXJjZSBhbGwgZG9iagorCSAgICByZWdzdWIgIlxcLmMiICRkb2JqICIubyIgcmVhbG9iagorCSAgICB2ZXJib3NlICJsb29raW5nIGZvciAkcmVhbG9iaiIKKwkgICAgaWYge1tmaWxlIGV4aXN0cyAkcmVhbG9ial19IHRoZW4geworCQl2ZXJib3NlIC1sb2cgIm12ICRyZWFsb2JqICRvYmplY3QiCisJCWNhdGNoICJleGVjIG12ICRyZWFsb2JqICRvYmplY3QiIGV4ZWNfb3V0cHV0CisJCXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQorCQlpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7CisJCSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwkJICAgIHBlcnJvciAiY291bGQgbm90IG1vdmUgJHJlYWxvYmogdG8gJG9iamVjdCIKKwkJICAgIHJldHVybiAwCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJcGVycm9yICIkb2JqZWN0IG5vdCBmb3VuZCBhZnRlciBjb21waWxhdGlvbiIKKwkJcmV0dXJuIDAKKwkgICAgfQorCX0KKwlyZXR1cm4gMQorICAgIH0gZWxzZSB7CisJdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCisJcGVycm9yICIkc291cmNlOiBjb21waWxhdGlvbiBmYWlsZWQiCisJcmV0dXJuIDAKKyAgICB9Cit9CisKKyMKKyMgZGVmYXVsdF9sZF9hc3NlbWJsZQorIwlhc3NlbWJsZSBhIGZpbGUKKyMKK3Byb2MgZGVmYXVsdF9sZF9hc3NlbWJsZSB7IGFzIHNvdXJjZSBvYmplY3QgfSB7CisgICAgZ2xvYmFsIEFTRkxBR1MKKyAgICBnbG9iYWwgaG9zdF90cmlwbGV0CisgICAgCisgICAgaWYge1t3aGljaCAkYXNdID09IDB9IHRoZW4geworCXBlcnJvciAiJGFzIGRvZXMgbm90IGV4aXN0IgorCXJldHVybiAwCisgICAgfQorCisgICAgaWYgIVtpbmZvIGV4aXN0cyBBU0ZMQUdTXSB7IHNldCBBU0ZMQUdTICIiIH0KKworICAgIHZlcmJvc2UgLWxvZyAiJGFzICRBU0ZMQUdTIC1vICRvYmplY3QgJHNvdXJjZSIKKworICAgIGNhdGNoICJleGVjICRhcyAkQVNGTEFHUyAtbyAkb2JqZWN0ICRzb3VyY2UiIGV4ZWNfb3V0cHV0CisgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCisgICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4geworCXJldHVybiAxCisgICAgfSBlbHNlIHsKKwl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKKwlwZXJyb3IgIiRzb3VyY2U6IGFzc2VtYmx5IGZhaWxlZCIKKwlyZXR1cm4gMAorICAgIH0KK30KKworIworIyBkZWZhdWx0X2xkX25tCisjCXJ1biBubSBvbiBhIGZpbGUsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiB0aGUgYXJyYXkgbm1fb3V0cHV0CisjCitwcm9jIGRlZmF1bHRfbGRfbm0geyBubSBvYmplY3QgfSB7CisgICAgZ2xvYmFsIE5NRkxBR1MKKyAgICBnbG9iYWwgbm1fb3V0cHV0CisgICAgZ2xvYmFsIGhvc3RfdHJpcGxldAorCisgICAgaWYge1t3aGljaCAkbm1dID09IDB9IHRoZW4geworCXBlcnJvciAiJG5tIGRvZXMgbm90IGV4aXN0IgorCXJldHVybiAwCisgICAgfQorCisgICAgaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB7IHNldCBOTUZMQUdTICIiIH0KKworICAgIHZlcmJvc2UgLWxvZyAiJG5tICROTUZMQUdTICRvYmplY3QgPnRtcGRpci9ubS5vdXQiCisKKyAgICBjYXRjaCAiZXhlYyAkbm0gJE5NRkxBR1MgJG9iamVjdCA+dG1wZGlyL25tLm91dCIgZXhlY19vdXRwdXQKKyAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKyAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7CisJc2V0IGZpbGUgW29wZW4gdG1wZGlyL25tLm91dCByXQorCXdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7CisJICAgIHZlcmJvc2UgIiRsaW5lIiAyCisJICAgIGlmIFtyZWdleHAgIl4oXFswLTlhLWZBLUZcXSspIFxbYS16QS1aMC05XF0gKC4rKSQiICRsaW5lIHdob2xlIHZhbHVlIG5hbWVdIHsKKyAgICAgICAgICAgICAgICBzZXQgbmFtZSBbc3RyaW5nIHRyaW1sZWZ0ICRuYW1lICJfIl0KKwkJdmVyYm9zZSAiU2V0dGluZyBubV9vdXRwdXQoJG5hbWUpIHRvIDB4JHZhbHVlIiAyCisJCXNldCBubV9vdXRwdXQoJG5hbWUpIDB4JHZhbHVlCisJICAgIH0KKwl9CisJY2xvc2UgJGZpbGUKKwlyZXR1cm4gMQorICAgIH0gZWxzZSB7CisJdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCisJcGVycm9yICIkb2JqZWN0OiBubSBmYWlsZWQiCisJcmV0dXJuIDAKKyAgICB9Cit9CisKKyMKKyMgc2ltcGxlX2RpZmYKKyMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQorIwlyZXR1cm5zIGRpZmZlcmVuY2VzIGlmIGV4aXN0CisjCXJldHVybnMgbnVsbCBpZiBmaWxlKHMpIGNhbm5vdCBiZSBvcGVuZWQKKyMKK3Byb2Mgc2ltcGxlX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0geworICAgIGdsb2JhbCB0YXJnZXQKKwkKKyAgICBzZXQgZW9mIC0xCisgICAgc2V0IGRpZmZlcmVuY2VzIDAKKyAgICAKKyAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7CisJc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCisgICAgfSBlbHNlIHsKKwl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCisJcmV0dXJuCisgICAgfQorICAgIAorICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKKwlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KKyAgICB9IGVsc2UgeworCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKKwlyZXR1cm4KKyAgICB9CisgICAgCisgICAgdmVyYm9zZSAiIyBEaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yXG4iIDIKKyAgICAKKyAgICB3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKKwlpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4geworCSAgICBjb250aW51ZQorCX0gZWxzZSB7CisJICAgIGxhcHBlbmQgbGlzdF9hICRsaW5lCisJfQorICAgIH0KKyAgICBjbG9zZSAkZmlsZV9hCisgICAgCisgICAgd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7CisJaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKKwkgICAgY29udGludWUKKwl9IGVsc2UgeworCSAgICBsYXBwZW5kIGxpc3RfYiAkbGluZQorCX0KKyAgICB9CisgICAgY2xvc2UgJGZpbGVfYgorCisgICAgZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0geworCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQorCXNldCBsaW5lX2IgW2xpbmRleCAkbGlzdF9iICRpXQorCisJdmVyYm9zZSAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIiAzCisJdmVyYm9zZSAiXHQkZmlsZV8yOiAkaTogJGxpbmVfYlxuIiAzCisJaWYgW3N0cmluZyBjb21wYXJlICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7CisJICAgIHZlcmJvc2UgLWxvZyAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIgorCSAgICB2ZXJib3NlIC1sb2cgIlx0JGZpbGVfMjogJGk6ICRsaW5lX2JcbiIKKworCSAgICBmYWlsICJUZXN0OiAkdGFyZ2V0IgorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIAorICAgIGlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7CisJZmFpbCAiVGVzdDogJHRhcmdldCIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKKwlwYXNzICJUZXN0OiAkdGFyZ2V0IgorICAgIH0KK30KKworIyBUaGlzIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBhbiB1bnJlbGVhc2VkIHZlcnNpb24gb2YgRGVqYUdudS4gIE9uY2UKKyMgdGhhdCB2ZXJzaW9uIGdldHMgcmVsZWFzZWQsIGFuZCBoYXMgYmVlbiBvdXQgaW4gdGhlIHdvcmxkIGZvciBhIGZldworIyBtb250aHMgYXQgbGVhc3QsIGl0IG1heSBiZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIGNvcHkuCitpZiAhW3N0cmluZyBsZW5ndGggW2luZm8gcHJvYyBwcnVuZV93YXJuaW5nc11dIHsKKyAgICAjCisgICAgIyBwcnVuZV93YXJuaW5ncyAtLSBkZWxldGUgdmFyaW91cyBzeXN0ZW0gdmVyYm9zaXRpZXMgZnJvbSBURVhUCisgICAgIworICAgICMgQW4gZXhhbXBsZSBpczoKKyAgICAjIGxkLnNvOiB3YXJuaW5nOiAvdXNyL2xpYi9saWJjLnNvLjEuOC4xIGhhcyBvbGRlciByZXZpc2lvbiB0aGFuIGV4cGVjdGVkIDkKKyAgICAjCisgICAgIyBTaXRlcyB3aXRoIHBhcnRpY3VsYXIgdmVyYm9zZSBvcydzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gc2l0ZS5leHAuCisgICAgIworICAgIHByb2MgcHJ1bmVfd2FybmluZ3MgeyB0ZXh0IH0geworCSMgVGhpcyBpcyBmcm9tIHN1bjQncy4gIERvIGl0IGZvciBhbGwgbWFjaGluZXMgZm9yIG5vdy4KKwkjIFRoZSAiXFwxIiBpcyB0byB0cnkgdG8gcHJlc2VydmUgYSAiXG4iIGJ1dCBvbmx5IGlmIG5lY2Vzc2FyeS4KKwlyZWdzdWIgLWFsbCAiKF58XG4pKGxkLnNvOiB3YXJuaW5nOlxbXlxuXF0qXG4/KSsiICR0ZXh0ICJcXDEiIHRleHQKKworCSMgSXQgbWlnaHQgYmUgdGVtcHRpbmcgdG8gZ2V0IGNhcnJpZWQgYXdheSBhbmQgZGVsZXRlIGJsYW5rIGxpbmVzLCBldGMuCisJIyBKdXN0IGRlbGV0ZSAqZXhhY3RseSogd2hhdCB3ZSdyZSBhc2sgdG8sIGFuZCB0aGF0J3MgaXQuCisJcmV0dXJuICR0ZXh0CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NPUFlJTkcuTElCIGIvbGliaWJlcnR5L0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWEzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvQ09QWUlORy5MSUIKQEAgLTAsMCArMSw0ODIgQEAKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKKyBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55CitvdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCit5b3VyIGxpYnJhcmllcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCit5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKK3RoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAordmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgordGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorDAorICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQorc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKK3RyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAord2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCitmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcworbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgorZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5CitvbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKK3RoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgorCisgIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Cit0aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQorcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKK2NoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCithbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KK2EgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKK2Rlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQordHJlYXRzIGl0IGFzIHN1Y2guCisKKyAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQorc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCitjb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgorCisgIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCit1c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKK2xpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KK3Blcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKK3ByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQorbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKK3RoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcworY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKK3dpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Cit3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgorCisgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCisMCisJCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCitjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAorcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCithZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21waWxlIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgYykgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBkKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkKK2Rpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK29yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKK3NhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKKyJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAgICBNQSAwMjExMS0xMzA3LCBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCmRpZmYgLS1naXQgYS9saWJpYmVydHkvQ2hhbmdlTG9nIGIvbGliaWJlcnR5L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDMyZmViCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L0NoYW5nZUxvZwpAQCAtMCwwICsxLDMyMzIgQEAKKzE5OTktMDQtMjAgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCUZpeCBmcm9tIERhbGUgSGF3a2luczoKKwkqIGNwbHVzLWRlbS5jIChtb3BfdXApOiBTZXQgdHlwZXZlY19zaXplIHRvIHplcm8sIHNvIGl0J2xsIGJlIAorCXJlYWxsb2NhdGVkIHByb3Blcmx5IGlmIHdlIHVzZSBpdCBhZ2Fpbi4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bi4gIEJlCisJc3RyaWN0ZXIgYWJvdXQgc3ludGF4LiAgQWx3YXlzIG51bGwtdGVybWluYXRlIHN0cmluZy4KKworCUZpeCBmcm9tIE1hcmN1cyBEYW5pZWxzOgorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IERvbid0IHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUKKwlpZGVudGlmaWVyIGxvb2tpbmcgZm9yIGFub3RoZXIgdW5kZXJzY29yZS4KKworMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYWxsb2NhLWNvbmYuaCAoYWxsb2NhKSBbQ19BTExPQ0FdOiBEb24ndCB1c2UgR2NjIGJ1aWx0aW4KKwlvciA8YWxsb2NhLmg+LgorCSogY2xvY2suYyAoR05VX0haKTogTmV3IGRlZmluaXRpb24uCisJKGNsb2NrKTogVXNlIGl0LgorCSogZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KKworCSogY29uZmlnLnRhYmxlOiBVc2UgbWgtYmVvcy4KKwkqIGNvbmZpZy9taC1iZW9zOiBOZXcgZmlsZS4KKworMTk5OS0wNC0wMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYzogQXR0ZW1wdCB0byBoYW5kbGUgb3ZlcmZsb3dzIGluIGNvdW50cyB3aXRoIHNvbWUKKwlzZW1ibGFuY2Ugb2YgZ3JhY2UuCisJKGNvbnN1bWVfY291bnQpOiBEZXRlY3Qgb3ZlcmZsb3dzLiAgUmV0dXJuIC0xIHRvIGluZGljYXRlIGVycm9ycywKKwlpbnN0ZWFkIG9mIHplcm8uCisJKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0sIGRlbWFuZ2xlX3RlbXBsYXRlKTogSGFuZGxlIGNoYW5nZQorCXRvIGNvbnN1bWVfY291bnQncyByZXR1cm4gY29udmVudGlvbi4KKworVGh1IEFwciAgOCAxNDo0MzoyOCAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHhtYWxsb2MuYywgcGV4ZWN1dGUuYzogRGVmaW5lIF9fQ1lHV0lOX18gd2hlbiBiZWluZyBjb21waWxlZAorIAl3aXRoIG9sZCBfX0NZR1dJTjMyX18gY29tcGlsZXIuCisKKzE5OTktMDQtMDIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+CisKKwkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX3BvaW50ZXJzKTogRGVmaW5lLgorCisxOTk5LTAzLTMwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgorCisJKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfY29tcGFyZV9pbnRzKTogRGVmaW5lLgorCisxOTk5LTAzLTMwICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogSWYgYGNvdW50JyB3cmFwcywgcmV0dXJuIDAgYW5kCisJZG9uJ3QgYWR2YW5jZSBpbnB1dCBwb2ludGVyLgorCShkZW1hbmdsZV9jbGFzc19uYW1lKTogSWYgY29uc3VtZV9jb3VudCBkaWRuJ3QgZmluZCBhIGNvdW50LCBkbworCW5vdGhpbmcuICBEb24ndCBib3RoZXIgd2l0aCBgc3RybGVuJyBzYW5pdHkgY2hlY2s7IGNvbnN1bWVfY291bnQKKwlkb2VzIGl0IGZvciB1cy4KKworMTk5OS0wMy0xNiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJRnJvbSBBcnQgSGFhcyAgPGFoYWFzQG5lb3NvZnQuY29tPjoKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBEb24ndCBncmFiIGFsbCB0aGUgJ19fJyBzdHJpbmdzCisJd2hlbiBkb2luZyBhcm0gb3IgaHAgc3R5bGUuCisJKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogRGVjciBmb3JnZXR0aW5nX3R5cGVzIGZpZWxkIHdoZW4gZG9uZS4KKwkKK1RodSBNYXIgMTEgMDE6MjI6NTggMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+CisKKwkqIHBleGVjdXRlLmMgKF9fQ1lHV0lOMzJfXyk6IFJlbmFtZSB0bworCShfX0NZR1dJTl9fKTogdGhpcy4KKwkqIHhtYWxsb2MuYzogTGlrZXdpc2UuCisKKwlDaGFuZ2VzIHRvIHN1cHBvcnQgaTM4Ni1wYy11d2luLgorCSogY29uZmlndXJlLmluICgqLSotdXdpbiopOiBXb3JrYXJvdW5kIGZvciB2Zm9yayBidWcuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSk6IEJlIGxpa2Ugc3RhbmRhcmQgVW5peC4KKwkocHdhaXQpOiBMaWtld2lzZS4KKwkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBEZWZpbmUuCisJKHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSk6IFVzZS4KKwkoeG1hbGxvYyk6IFVzZS4KKworVGh1IE1hciAxMSAwMTowNzo1NSAxOTk5ICBGcmFueiBTaXJsIDxGcmFuei5TaXJsLWtlcm5lbEBsYXV0ZXJiYWNoLmNvbT4KKworCSogY29uZmlnLnRhYmxlOiBDbGVhbnVwIGFuZCBhZGQgbWgtKnBpYyBoYW5kbGluZyBmb3IgYWxwaGEsIGFybSwgcG93ZXJwYworCitTdW4gRmViIDI4IDIyOjMwOjQ0IDE5OTkgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy50YWJsZTogQ2hlY2sgY3lnd2luKiwgbm90IGN5Z3dpbjMyKi4KKworVHVlIEZlYiAgOSAxNjozOTowMSAxOTk5ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgbWtzdGVtcCAtPiBta3N0ZW1wcy4KKworVHVlIEZlYiAgOSAwMToxMjoyNyAxOTk5ICBNYXJjIEVzcGllIDxNYXJjLkVzcGllQGxpYWZhLmp1c3NpZXUuZnI+CisKKwkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiByZW1vdmUgbWtzdGVtcC5vCisJKiBjb25maWd1cmUuaW4gKGZ1bmNzKTogQ2hlY2sgZm9yIGFuZCBjb25kaXRpb25hbGx5IGFkZCBta3N0ZW1wcyB0bworCXRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBsaWJpYmVydHkgd2lsbCBwcm92aWRlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCQorV2VkIEZlYiAgMyAwMDowMToxNSAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KKworCSogY2xvY2suYyAoSFopOiBEZWZpbmUgaW4gdGVybXMgb2YgKElTTyBDKSBDTE9DS1NfUEVSX1NFQyBvbiAKKwlwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIEhaLgorCSogZ2V0cnVudGltZS5jIChIWik6IExpa2V3aXNlLgorCitTYXQgSmFuIDMwIDEzOjI4OjA0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICh4c3RyZHVwLm8pOiBEZXBlbmQgb24gY29uZmlnLmguCisKK1dlZCBKYW4gMTMgMDc6MjY6NDQgMTk5OSAgSC5KLiBMdSAgKGhqbEBnbnUub3JnKQorCisJKiBjcGx1cy1kZW0uYyAobW9wX3VwKTogU2V0IHdvcmstPnByZXZpb3VzX2FyZ3VtZW50IHRvIE5VTEwgYWZ0ZXIKKwlmcmVlaW5nIGl0LgorCitXZWQgSmFuIDEzIDE0OjE2OjM2IDE5OTkgIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogeHN0cmR1cC5jICh4c3RyZHVwKTogU3dpdGNoIGZyb20gc3RyY3B5IHRvIG1lbWNweSBmb3Igc3BlZWQuCisKK1R1ZSBKYW4gIDUgMTU6NTg6MjkgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogZml4IHR5cG8sIHNwbGF5LXRyZWUuYyBpbnN0ZWFkIG9mCisJc3BsYXktdHJlZS5vLgorCisxOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgorCisxOTk4LTEyLTMwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogcmFuZG9tLmMgKE5VTEwpOiBEb24ndCByZWRlZmluZSBOVUxMIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZC4KKworVHVlIERlYyAyMiAwOTo0MzozNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGFyZ3YuYyAoYnVpbGRhcmd2KTogQ2FzdCB0aGUgcmVzdWx0IG9mIGFsbG9jYSBpbiBhc3NpZ25tZW50LgorCisJKiBjaG9vc2UtdGVtcC5jOiBJbmNsdWRlIHN0ZGxpYi5oLgorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogUmVtb3ZlIHVudXNlZCBwcm90b3R5cGUuCisgIAkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogQ29uc3RpZnkgZmlyc3QgcGFyYW1ldGVyLgorICAJKGNvZGVfZm9yX3F1YWxpZmllcik6IEF2b2lkIGEgZ2NjIGV4dGVuc2lvbiwgbWFrZSB0aGUgcGFyYW1ldGVyIGFuCisgCWludCwgbm90IGEgY2hhci4KKwkoZGVtYW5nbGVfcXVhbGlmaWVyKTogTGlrZXdpc2UuCisJKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IENhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUgZnVuY3Rpb24gdG8KKwl1bnNpZ25lZCBjaGFyLgorCShhcm1fcHQpOiBBZGQgcGFyZW5zIGFyb3VuZCBhc3NpZ25tZW50IHVzZWQgYXMgdHJ1dGggdmFsdWUuCisJKGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSk6IENvbnN0aWZ5IHZhcmlhYmxlIGBhcmdzJy4KKwkoZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUpOiBDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlCisJZnVuY3Rpb24gdG8gdW5zaWduZWQgY2hhci4KKwkoZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGknLgorCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBDb25zdGlmeSBwYXJhbWV0ZXIgYGFyZ3MnLgorCUNhc3QgdGhlIGFyZ3VtZW50IG9mIGEgY3R5cGUgZnVuY3Rpb24gdG8gdW5zaWduZWQgY2hhci4KKworCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogQWRkIGV4cGxpY2l0IGJyYWNlcyB0bworIAlhdm9pZCBhbWJpZ3VvdXMgYGVsc2UnLgorCisJKiBmbm1hdGNoLmMgKGZubWF0Y2gpOiBDaGFuZ2UgdHlwZSBvZiB2YXJpYWJsZXMgYGMnLCBgYzEnLAorIAlgY3N0YXJ0JyBhbmQgYGNlbmQnIHRvIHVuc2lnbmVkIGNoYXIuICBDYXN0IHRoZSBhcmd1bWVudCBvZiBtYWNybworIAlgRk9MRCcsIHdoaWNoIHVzZXMgY3R5cGUgZnVuY3Rpb25zLCB0byB1bnNpZ25lZCBjaGFyLgorCisJKiBvYmphbGxvYy5jIChmcmVlKTogQWRkIHByb3RvdHlwZS4KKworU3VuIERlYyAyMCAxNjowMzo0NiAxOTk4ICBIYW5zLVBldGVyIE5pbHNzb24gIDxocEBheGlzLnNlPgorCisJKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogRml4IHR5cG86IHNwbGF5LXRyZWUuYywgbm90IHNwbGF5LXRyZWUubworCitGcmkgRGVjIDE4IDE3OjUwOjE4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogcmVtb3ZlIGRlY2xhcmF0aW9uIC0tIGZ1bmN0aW9uCisgCWRvZXNuJ3QgZXhpc3QuCisJKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBpJy4KKwkKK0ZyaSBEZWMgMTggMTY6MTE6NDMgRVNUIDE5OTggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFByb2Nlc3MgQ1YgYW5kIHUgY29kZXMgYmVmb3JlCisJYnVtcGluZyB0aGUgcG9pbnRlciB3ZSByZWFkIGZyb20uIEFsc28gcHJlcGVuZCB0aGVzZSBjb2RlcywKKwlhcyB3ZSBkbyBpbiBvdGhlciBwbGFjZXMuCisKKzE5OTgtMTItMTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBNYWtlIHZhcmlhYmxlICdhcmdzJyBiZQorCSdjb25zdCBjaGFyIConIGluIG9yZGVyIHRvIG1hdGNoIGl0cyB1c2FnZSB3aGVuIGNhbGxpbmcgc2libGluZ3MuCisJKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IE1ha2UgZmlyc3QgYXJnICdjb25zdCBjaGFyICoqJyBpbiBvcmRlcgorCXRvIG1hdGNoIHVzYWdlLgorCitNb24gRGVjIDE0IDA5OjU1OjUwIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCisKKwkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlKTogVXNlIGBjb25zdCcsIG5vdCBgQ09OU1QnLgorCSogbWVtY2hyLmMgKG1lbWNocik6IExpa2V3aXNlLgorCSogbWVtY3B5LmMgKG1lbWNweSk6IExpa2V3aXNlLgorCSogbWVtbW92ZS5jIChtZW1tb3ZlKTogTGlrZXdpc2UuCisKKwkqIG1rc3RlbXAuYzogRG9uJ3QgY2hlY2sgSU5fR0NDIGFueW1vcmUuCisJKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KKwkqIHNwbGF5LXRyZWUuYzogTGlrZXdpc2UuCisKKwkqIHN0cmNoci5jIChzdHJjaHIpOiBVc2UgYGNvbnN0Jywgbm90IGBDT05TVCcuCisJKiBzdHJyY2hyLmMgKHN0cnJjaHIpOiBMaWtld2lzZS4KKwkqIHN0cnRvbC5jIChzdHJ0b2wpOiBMaWtld2lzZS4KKwkqIHN0cnRvdWwuYyAoc3RydG91bCk6IExpa2V3aXNlLgorCitGcmkgRGVjICA0IDEzOjUxOjA0IDE5OTggIERhdmlkIFRheWxvciAgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKwkJCSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGN5Z251cy5jb20+CisJCQkgIFN0YW4gU2hlYnMgICAgIDxzaGVic0BjeWdudXMuY29tPgorCQkJICBFZGl0aCBFcHN0ZWluICA8ZWVwc3RlaW5AY3lnbnVzLmNvbT4KKwkJCSAgQW5kcmVzIE1hY0xlb2QgPGFtYWNsZW9kQGN5Z251cy5jb20+CisJCQkgIFNhdGlzaCBQYWkJIDxwYWlAYXBvbGxvLmhwLmNvbT4KKworCSogSFAgYUNDIGRlbWFuZ2xpbmcgc3VwcG9ydC4KKwkqIGNwbHVzLWRlbS5jCisJKG1haW4pOiBSZW1vdmUgZGVmYXVsdCB0byBIUCBzdHlsZSBkZW1hbmdsaW5nLCBzZXQgdG8gRURHCisgCWRlbWFuZ2xpbmcgY29ycmVjdGx5IHdoZW4gLWVkZyBzcGVjaWZpZWQ7IHNldCB0aGUgZGVtYW5nbGluZyBzdHlsZQorIAl3aGVuIHVzZXIgc3BlY2lmaWVzICdlZGcnLiBTZXQgc3RyaXBfdW5kZXJzY29yZSB0bworIAlwcmVwZW5kc191bmRlcnNjb3JlLCBpZiBub3QgSFBVWEhQUEEuICBTZXQKKyAJY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIHRvIGhwX2RlbWFuZ2xpbmcgaWYgSFBVWEhQUEEuICBTZXQKKyAJY3VycmVudCBkZW1hbmdsaW5nIHN0eWxlIGNvcnJlY3RseSBpZiB0aGUgc3dpdGNoIGlzIGhwLiAgUmVhZAorIAlsYWJlbCBjb3JyZWN0bHkgYWxzbyBpbiB0aGUgSFAgc3R5bGUgY2FzZS4KKwkod29ya19zdHVmZik6IGFkZCB0ZW1wX3N0YXJ0IGZpZWxkOyBhZGQgZmllbGQgZm9yIHZvbGF0aWxlIG1lbWJlcgorIAlmdW5jdGlvbi4KKwkoYXJtX3B0KTogaGFuZGxlIEFSTV9ERU1BTkdMSU5HIGFuZCBFREdfREVNQU5HTElORyBzdHlsZXM7IEhQCisgCXN0eWxlIGZvciB0aGlzIGNhc2UgaXMgdGhlIHNhbWUgYXMgQVJNLgorCShkZW1hbmdsZV9hcmdzKTogaGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlOyBzdXBwb3J0IEhQIHN0eWxlLgorCShkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBuZXcgZnVuY3Rpb24uIChJdCB3YXMKKyAJZGVtYW5nbGVfYXJtX3B0Lik7IGNoZWNrIGFuZCBzZXQgdmFsdWUgb2YgdGVtcF9zdGFydCBmaWVsZCBpbgorIAltdWx0aXBsZSBwbGFjZXMuIEFsc28sIHdoZW4gY2VjaGluZyBmb3IgZW5kIG9mIHRlbXBsYXRlIGFyZ3MsCisgCWNoZWNrIHRvIHNlZSBpZiBhdCBlbmQgb2Ygc3RhdGljIG1lbWJlciBvZiB0ZW1wbGF0ZSBjbGFzcy4KKwkoZGVtYW5nbGVfY2xhc3MpOiBuZXcgbG9jYWwgdmFyaWFibGUgOiBzYXZlX2NsYXNzX25hbWVfZW5kIERvbid0CisgCWluY2x1ZGUgdGVtcGxhdGUgYXJncyBpbiBzdHJpbmcgZGVmaW5pbmcgY2xhc3MuCisJKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiB1c2UgZGVtYW5nZWxfYXJtX2hwX3RlbXBsYXRlLgorCShkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogaGFuZGxlIGNhc2Ugd2hlcmUgZGVtYW5nbGluZyBzdHlsZSBpcworIAlIUF9ERU1BTkdMSU5HIGFuZCBjdXJyZW50bHkgcG9pbnQgYXQgYW4gJ1gnIGluIHRoZSBtYW5nbGVkIG5hbWUuCisgIAlIYW5kbGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuICBIYW5kbGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKKyAJb3BzIGZvciBIUCBzdHlsZS4KKwkoZGVtYW5nbGVfcHJlZml4KTogaGFuZGxlIEVER19ERU1BTkdMSU5HIGFuZCBBUk1fREVNQU5HTElORworIAlzdHlsZXMuICBnbG9iYWwgZGVzdHJ1Y3RvciBhbmQgY29uc3RydWN0b3IgZm9yIEhQIHN0eWxlIGFyZSBzYW1lCisgCWFzIGZvciBBUk0gc3R5bGUuIFNhbWUgZm9yIGxvY2FsIHZhcmlhYmxlcy4KKwkoZGVtYW5nbGVfcXVhbGlmaWVkKTogaGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlLgorCShkZW1hbmdsZV9zaWduYXR1cmUpOiBhZGQgY2FzZSBmb3Igdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uLiAgRm9yCisgCWNhc2VzICcxJyAtICc5JyA6IGluaXRpYWxpemUgdGhlIHRlbXBfc3RhcnQgZmllbGQgdG8gLTEgYW5kIGhhbmRsZQorIAl0aGUgRURHX0RFTUFOR0xJTkcgc3R5bGUuICBmb3IgY2FzZSAnRicgOiBoYW5kbGUgRURHX0RFTUFOR0xJTkcKKyAJYW5kIEFVVE9fREVNQU5HTElORyBzdHlsZXMuICBJZiBleHBlY3RpbmcgYSBmdW5jdGlvbiBhbmQgbWFuYWdlZAorIAl0byBkZW1hbmdsZSB0aGUgZnVuY3QgYXJncywgdGhlbiBoYW5kbGUgdGhlIExVQ0lEX0RFTUFOR0xJTkcsCisgCUFSTV9ERU1BTkdMSU5HLCBhbmQgRURHX0RFTUFOR0xJTkcgc3R5bGVzLiAgQWRkIGNhc2UgZm9yIGxvY2FsCisgCWNsYXNzIG5hbWUgYWZ0ZXIgIkxubm5fIGluIEhQIHN0eWxlIGNhc2UuIEhQIHN0eWxlIHRvbyBuZWVkcyB0bworIAlmb3JnZXQgdHlwZXMuICBfbm5uIGlzIE9LIGZvciBIUCBzdHlsZSwgc28gZG9uJ3QgcmVwb3J0IGZhaWx1cmUuCisJKGRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlKTogbmV3IGZ1bmN0aW9uLiBIYW5kbGUgdGVtcGxhdGUncworIAl2YWx1ZSBwYXJhbSBmb3IgSFAvYUNDLgorCShkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsKTogbmV3IGZ1bmN0aW9uLiAgSGFuZGxlIGEgdGVtcGxhdGUncworIAlsaXRlcmFsIHBhcmFtZXRlciBmb3IgSFAgYUNDLgorCShyZWN1cnNpdmVseV9kZW1hbmdsZSk6IG5ldyBmdW5jdGlvbgorCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBuZXcgZnVuY3Rpb24uCisJKHVzYWdlKTogYWRkICdlZGcnIHRvIHRoZSBsaXN0IG9mIGRlbWFuZ2xpbmcgc3R5bGVzOyBhZGQgaHAgc3dpdGNoCisgCXRvIG1lc3NhZ2UuCisKK1NhdCBOb3YgMjggMTc6MjU6MjIgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KKworCSogcGV4ZWN1dGUuYzogUmVtb3ZlIG9ic29sZXRlIGlmZGVmZWQgY3lnd2luIGNvZGUuCisKK0ZyaSBOb3YgMjcgMTM6MjY6MDYgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgorCisJKiBjaG9vc2UtdGVtcC5jOiBBbHdheXMgaW5jbHVkZSBsaWJpYmVydHkuaC4gIEF2b2lkIHJlZHVuZGFuY2llcy4KKwkqIGNwbHVzLWRlbS5jOiBMaWtld2lzZS4gIENvbmZvcm0gdG8gbGliaWJlcnR5LmguCisJKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KKwkqIHNwbGF5LXRyZWUuYzogTGlrZXdpc2UuCisKKzE5OTgtMTEtMjUgIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHNwbGF5LXRyZWUubyk6IEFkZCBjb25maWcuaCBkZXBlbmRlbmN5LgorCitNb24gTm92IDIzIDE2OjU5OjQ5IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogIGNvbmZpZ3VyZS5pbjogVXNlIEFDX1BSRVJFUSgyLjEyLjEpLgorCisxOTk4LTExLTE2ICBCZW5qYW1pbiBLb3NuaWsgIDxia296QGhhaWdodC5jb25zdGFudC5jb20+CisKKyAgICAgICAgKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogQWRkIGRlbWFuZ2xpbmcgZm9yIEM5eCB0eXBlcy4KKworVGh1IE5vdiAxOSAyMjoxNTo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1wdy5jIChtcHdfYWNjZXNzKTogQWRkIG1pc3NpbmcgcGFyZW5zLgorCitUaHUgTm92IDE5IDEyOjU5OjIxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9TWVNfV0FJVC4KKworCSogcGV4ZWN1dGUuYzogSW5jbHVkZSBzeXMvd2FpdC5oIHdoZW4gIUlOX0dDQy4KKworVGh1IE5vdiAxOSAxNDozODoyMCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBwZXhlY3V0ZS5jOiByZXZlcnQgYmFjayB0byBjaGVja2luZyBvbGQgQ3lnd2luCisJcHJlcHJvY2Vzc29yIHN5bWJvbCB1bnRpbCBzb21lIHRpbWUgaGFzIHBhc3NlZC4KKworV2VkIE5vdiAxOCAwODo1MjoyNiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgorCisJKiBwZXhlY3V0ZS5jOiBSZW9yZ2FuaXplIFdJTjMyIGNhc2UgdG8gYWNjb21vZGF0ZSBDeWd3aW4KKwlzaW5jZSBpdCB3aWxsIG5vdyBzdXBwb3J0IHNpbWlsYXIgY29uc3RydWN0cy4KKworRnJpIE5vdiAxMyAxOToxODowNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGNhbGxvYy4KKworCSogY2FsbG9jLmM6IE5ldwlmaWxlLgorCisJKiB4bWFsbG9jLmMgKHhjYWxsb2MpOiBOZXcgZnVuY3Rpb24uCisKK0ZyaSBOb3YgMTMgMDg6NTE6NDYgRVNUIDE5OTggIEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KKworCSpjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogVXNlIHRoZSBsYXN0ICJfXyIKKwlpbiB0aGUgbWFuZ2xlZCBuYW1lIHdoZW4gbG9va2luZyBmb3IgdGhlIHNpZ25hdHVyZS4gVGhpcyBhbGxvd3MKKwl0ZW1wbGF0ZSBuYW1lcyB0byBiZWdpbiB3aXRoICJfXyIuCisKKzE5OTgtMTEtMDggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+CisKKwkqIGNwbHVzLWRlbS5jICh0eXBlX2tpbmRfdCk6IEFkZCB0a19yZWZlcmVuY2UuCisJKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBIYW5kbGUgaXQuCisJKGRvX3R5cGUpOiBVc2UgaXQgZm9yIHJlZmVyZW5jZXMsIGluc3RlYWQgb2YgdGtfcG9pbnRlci4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBVc2UgY3BsdXNfZGVtYW5nbGUsCisJbm90IGludGVybmFsX2NwbHVzX2RlbWFuZ2xlLgorCitTYXQgTm92ICA3IDE2OjAyOjEwIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgaW5jbHVkZSBnYW5zaWRlY2wuaC4KKwkqIG1rc3RlbXAuYzogTGlrZXdpc2UuCisJKiBwZXhlY3V0ZS5jOiBMaWtld2lzZS4KKworTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgorICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQorCitNb24gTm92ICAyIDEwOjIyOjAxIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogcGV4ZWN1dGUuYzogQ2hlY2sgSEFWRV9DT05GSUdfSCwgbm90IElOX0dDQywgd2hlbiBkZXRlcm1pbmluZworIAl3aGV0aGVyIHRvIGluY2x1ZGUgY29uZmlnLmguICBQb3NzaWJseSBpbmNsdWRlIHVuaXN0ZC5oIGluIHRoZQorIAkhSU5fR0NDIGNhc2UuICBEZWZpbmUgVkZPUktfU1RSSU5HIGFzIGEgcHJpbnRhYmxlIGZ1bmN0aW9uIGNhbGwKKyAJZm9yIGVycm9yIG1lc3NhZ2VzIChlaXRoZXIgInZmb3JrIiBvciAiZm9yayIuKSAgSWYgSEFWRV9WRk9SS19IIGlzCisgCWRlZmluZWQsIGluY2x1ZGUgdmZvcmsuaC4gIElmIFZNUyBpcyBkZWZpbmVkLCBkZWZpbmUgdmZvcmsoKQorIAlhcHByb3ByaWF0ZWx5LiAgUmVtb3ZlIHZmb3JrIGNoZWNrIG9uIFVTRywgd2UncmUgdXNpbmcgYXV0b2NvbmYuCisgIAkocGV4ZWN1dGUpOiBTZXQgYGVycm1zZ19mbXQnIHRvIFZGT1JLX1NUUklORyBpbnN0ZWFkIG9mIGNoZWNraW5nCisgCWxvY2FsbHkgd2hhdCBzdHJpbmcgdG8gdXNlLgorCisxOTk4LTEwLTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgorCisJKiBzcGxheS10cmVlLmM6IFR3ZWFrIGluY2x1ZGUgZGlyZWN0aXZlcyB0byBtYWtlIHN1cmUgZGVjbGFyYXRpb25zIG9mCisJeG1hbGxvYyBhbmQgZnJlZSBhcmUgYXZhaWxhYmxlLgorCisxOTk4LTEwLTI1ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBGaXggaGFuZGxpbmcgb2YgdmlydHVhbCB0YWJsZXMgaW4KKwlhbm9ueW1vdXMgbmFtZXNwYWNlcy4KKworMTk5OC0xMC0yMyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKHdvcmtfc3R1ZmYpOiBSZXBsYWNlIGNvbnN0X3R5cGUgYW5kIHZvbGF0aWxlX3R5cGUKKwl3aXRoIHR5cGVfcXVhbHMuCisJKFRZUEVfVU5RVUFMSUZJRUQpOiBOZXcgbWFjcm8uCisJKFRZUEVfUVVBTF9DT05TVCk6IExpa2V3aXNlLgorCShUWVBFX1FVQUxfVk9MQVRJTEUpOiBMaWtld2lzZS4KKwkoVFlQRV9RVUFMX1JFU1RSSUNUKTogTGlrZXdpc2UuCisJKGNvZGVfZm9yX3F1YWxpZmllcik6IE5ldyBmdW5jdGlvbi4KKwkocXVhbGlmaWVyX3N0cmluZyk6IExpa2V3aXNlLgorCShkZW1hbmdsZV9xdWFsaWZpZXIpOiBMaWtld2lzZS4KKwkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBVc2UgdGhlbS4KKwkoZGVtYW5nbGVfc2lnbmF0dXJlKTogTGlrZXdpc2UuCisJKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBMaWtld2lzZS4KKwkoZG9fdHlwZSk6IExpa2V3aXNlLgorCShkZW1hbmdsZV9mdW5kX3R5cGUpKTogTGlrZXdpc2UuCisKK1RodSBPY3QgMjIgMTk6NTg6NDMgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgorCisJKiBzcGxheS10cmVlLmMgKHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIpOiBNYWtlIGRlZmluaXRpb24gc3RhdGljCisJdG8gbWF0Y2ggcHJvdG90eXBlLgorCisxOTk4LTEwLTIxICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgorCisJKiBzcGxheS10cmVlLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBpdC4KKwkoUkVRVUlSRURfT0ZJTEVTKTogTGlrZXdpc2UuCisJKHNwbGF5LXRyZWUubyk6IEFkZCBkZXBlbmRlbmNpZXMuCisKK1R1ZSBPY3QgMjAgMTI6Mjk6MDIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogRml4IG9mZi1ieS1vbmUgd2hlbiBjaGVja2luZworCXJhbmdlIG9mICdLJyBpbmRleC4KKworVGh1IE9jdCAxNSAxODo1MToxMiAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGNob29zZS10ZW1wLmM6IFByb3RvdHlwZSBta3N0ZW1wcygpIHdoZW4gSU5fR0NDLgorCisJKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8KKwlgdW5zaWduZWQgY2hhcicuCisJKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENhc3QgdGhlIHJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuCisJY29tcGFyaW5nIGFnYWluc3Qgb25lLgorCShjcGx1c19tYW5nbGVfb3BuYW1lKTogTGlrZXdpc2UuCisJKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0bworCWB1bnNpZ25lZCBjaGFyJy4KKwkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IExpa2V3aXNlLgorCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEluaXRpYWxpemUgdmFyaWFibGUgYGJpbmRleCcuICBDYXN0IHRoZQorCXJlc3VsdCBvZiBgc3RybGVuJyB0byAoaW50KSB3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4gIFJlbW92ZQorCXVudXNlZCB2YXJpYWJsZSBgc3RhcnRfb2ZfdmFsdWVfcGFybScuCisJKGRlbWFuZ2xlX2NsYXNzX25hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgorCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KKwkoZGVtYW5nbGVfcHJlZml4KTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCisJKGdudV9zcGVjaWFsKTogTGlrZXdpc2UuICBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkKKwl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KKwkoZGVtYW5nbGVfcXVhbGlmaWVkKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCisJKGdldF9jb3VudCk6IExpa2V3aXNlLgorCShkb190eXBlKTogTGlrZXdpc2UuICBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgorCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KKwkoZGVtYW5nbGVfZnVuZF90eXBlKTogQ2FzdCBhcmd1bWVudCBvZiBjdHlwZSBtYWNybyB0byBgdW5zaWduZWQgY2hhcicuCisJKGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkKKwl3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KKworCSogbWtzdGVtcC5jIChta3N0ZW1wcyk6IENhc3QgdmFyaWFibGUgYGxlbicgdG8gKGludCkgd2hlbgorCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KKworVHVlIE9jdCAxMyAyMzo1MTo1MSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKyAgICAgICAgKiBta3N0ZW1wLmM6IENoZWNrIEhBVkVfU1lTX1RJTUVfSCBiZWZvcmUgaW5jbHVkaW5nIHN5cy90aW1lLmgKKyAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3RpbWUuaCB0b28uCisgICAgICAgICogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbHQuCisKKwkqIGdldG9wdC5jOiBDaGVjayBIQVZFX1NUUklOR1NfSCBiZWZvcmUgaW5jbHVkaW5nIHN0cmluZ3MuaC4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IENoZWNrIGZvciBzdHJpbmdzLmggdG9vLgorCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlYnVpbHQuCisKK01vbiBPY3QgMTIgMTk6MTU6NTkgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogaW4gY29tbWVudCwgY2FsbCBBQ19FWEVFWFQgaW5zdGVhZCBvZiBBTV9FWEVFWFQKKworU3VuIE9jdCAxMSAxNzozNjowNiAxOTk4ICBNaWNoYWVsIFRpZW1hbm4gIDx0aWVtYW5uQGhvbG9kZWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjcGx1cy1kZW0ubywgb2JzdGFjay5vKTogRGVwZW5kIHVwb24gY29uZmlnLmguCisKK1RodSBPY3QgIDggMjM6NDI6MDggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNZXJnZSBlZ2NzICYgZGV2byBsaWJpYmVydHkuCisKKzE5OTgtMDktMDggIE1hcnRpbiB2b24gTPZ3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+CisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBEZW1hbmdsZSBhbm9ueW1vdXMgbmFtZXNwYWNlcy4KKworTW9uIFNlcCAgNyAyMzoyOTowMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIG1rc3RlbXAuYzogSW5jbHVkZSBjb25maWcuaCBldmVuIHdoZW4gbm90IElOX0dDQy4gIFdyYXAgaGVhZGVyCisgCWluY2x1c2lvbnMgaW5zaWRlIEhBVkVfKl9IIG1hY3Jvcy4gIEluY2x1ZGUgYW5zaWRlY2wuaCB3aGVuIG5vdAorIAlJTl9HQ0MuCisKKwkqIHZhc3ByaW50Zi5jOiBJbmNsdWRlIHN0ZGFyZy5oL3ZhcmFyZ3MuaCBmaXJzdC4KKworCSogdnByaW50Zi5jOiBMaWtld2lzZS4KKworU2F0IFNlcCAgNSAwMzoyNDo0OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHBleGVjdXRlLmM6IFVwZGF0ZXMgZnJvbSBnY2MuICBDb3B5IGluIGdjYyBoYXMgYmVlbiByZW1vdmVkLiAgVGhpcworCWlzIHRoZSBjYW5vbmljYWwgY29weS4gIERlZmluZSBJU1NQQUNFIGlmICFJTl9HQ0MuCisJKiBhbGxvY2EuYywgdmZwcmludGYuYywgY2hvb3NlLXRlbXAuYywgbWtzdGVtcC5jLCBnZXRvcHQuYzogU2ltaWxhcmx5LgorCSogZ2V0b3B0MS5jLCBvYnN0YWNrLmM6IFNpbWlsYXJseS4KKwkqIE1ha2VmaWxlLmluOiBCdWlsZCBta3N0ZW1wLm8KKworVHVlIFNlcCAgMSAyMzoxMjo0NyAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEluY2x1ZGUgYXNwcmludGYgaW4gbGlzdCBvZiBmdW5jdGlvbnMga25vd24gbm90CisJdG8gYmUgaW4gbmV3bGliLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitXZWQgQXVnIDE5IDE0OjA1OjAxIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgorCisJKiBjcGx1cy1kZW0uYyAod29ya19zdHVmZik6IEFkZCBkbGxpbXBvcnRlZC4KKwkoZGVtYW5nbGVkX3ByZWZpeCk6IE1hcmsgc3ltYm9scyBpbXBvcnRlZCBmcm9tIFBFIERMTC4KKwkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGVkKTogSGFuZGxlLgorCisxOTk4LTA4LTE3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogRml4IHNpbXBsZSBhcnJheSBoYW5kbGluZy4gIElmIHdlIGZhaWwsCisJc3RheSBmYWlsZWQuCisKK01vbiBBdWcgMTcgMTA6NDA6MzQgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgorCisJKiBjcGx1cy1kZW0uYzogSW5jbHVkZSBjb25maWcuaCBpZiBpdCBleGlzdHMuICBBbHNvLCBvbmx5CisJcHJvdG90eXBlIG1hbGxvYy9yZWFsbG9jIGlmIHdlIGNhbid0IGdldCBzdGRsaWIuaC4KKworU2F0IEF1ZyAxNSAxNjoxNTowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU3dpdGNoIGJhY2sgdG8gY2hlY2tpbmcgLS13aXRoLXRhcmdldC1zdWJkaXIgd2hlbgorCWRlY2lkaW5nIHdoZXRoZXIgdG8gY2hlY2sgZm9yIG5ld2xpYiwgdW5kb2luZyBwYXJ0IG9mIEp1bHkgMTUKKwljaGFuZ2UuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBBdWcgMTMgMTY6NDc6MzggMTk5OCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKHR5cGVfa2luZF90KTogTmV3IHR5cGUuCisJKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBBZGQgdHlwZV9raW5kX3QgcGFyYW1ldGVyLiAgUmVseQorCW9uIHRoaXMgcGFyYW10ZXIsIHJhdGhlciB0aGFuIGRlbWFuZ2xpbmcgdGhlIHR5cGUgYWdhaW4uCisJKGRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlKTogUGFzcyB0a19pbnRlZ3JhbC4KKwkoZGVtYW5nbGVfdGVtcGxhdGVfOiBQYXNzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGRvX3R5cGUuCisJKGRvX3R5cGUpOiBSZXR1cm4gYSB0eXBlX2tpbmRfdC4gIFBhc3MgdGtfaW50ZWdyYWwgdG8KKwlkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheSBib3VuZHMuCisJKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IExpa2V3aXNlLgorCisJQWxzbyBpbmNvcnBvcmF0ZSBmcm9tIEdDQyB2ZXJzaW9uOgorCisJVHVlIEp1bCAyMSAxMzoyODoxOSAxOTk4ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogVXNlIGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5cy4KKworVGh1IEF1ZyAxMyAxNjo0NzozOCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+CisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IE1ha2UgZnVuY3Rpb24gZGVmaW5pdGlvbgorCXN0YXRpYyB0byBtYXRjaCB0aGUgcHJvdG90eXBlLgorCitUdWUgSnVsIDI4IDExOjMzOjA5IDE5OTggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+CisKKwkqIGNwbHVzLWRlbS5jICh0eXBlX2tpbmRfdCk6IE5ldyB0eXBlLgorCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogQWRkIHR5cGVfa2luZF90IHBhcmFtZXRlci4gIFJlbHkKKwlvbiB0aGlzIHBhcmFtdGVyLCByYXRoZXIgdGhhbiBkZW1hbmdsaW5nIHRoZSB0eXBlIGFnYWluLgorCShkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSk6IFBhc3MgdGtfaW50ZWdyYWwuCisJKGRlbWFuZ2xlX3RlbXBsYXRlXzogUGFzcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBkb190eXBlLgorCShkb190eXBlKTogUmV0dXJuIGEgdHlwZV9raW5kX3QuICBQYXNzIHRrX2ludGVncmFsIHRvCisJZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXkgYm91bmRzLgorCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBMaWtld2lzZS4KKworCUFsc28gaW5jb3Jwb3JhdGUgZnJvbSBHQ0MgdmVyc2lvbjoKKworCVR1ZSBKdWwgMjEgMTM6Mjg6MTkgMTk5OCAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IFVzZSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheXMuCisKK01vbiBKdWwgMjcgMTI6MTY6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMT0NBKTogTmV3IHZhcmlhYmxlLgorCSgkKFRBUkdFVExJQikpOiBBZGQgJChBTExPQ0EpIHRvIGxpYnJhcnkuCisJKG5lZWRlZC1saXN0KTogQWRkICQoQUxMT0NBKS4KKwkoJChBTExPQ0EpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgorCitTdW4gSnVsIDE5IDA4OjIzOjE3IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogTWFrZSBmdW5jdGlvbiBkZWZpbml0aW9uCisJc3RhdGljIHRvIG1hdGNoIHRoZSBwcm90b3R5cGUuCisKK1dlZCBKdWwgMTUgMDA6MTI6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIC0td2l0aC1jcm9zcy1ob3N0IHJhdGhlciB0aGFuCisJLS13aXRoLXRhcmdldC1zdWJkaXIgd2hlbiBkZWNpZGluZyB3aGV0aGVyIGJ1aWxkIHVzZXMgYSBjcm9zcworCWNvbXBpbGVyLCBhbmQgd2hlbiBkZWNpZGluZyB3aGVyZSB0byBpbnN0YWxsIHRoZSBsaWJyYXJ5LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitTdW4gSnVsIDEyIDAxOjI3OjA1IDE5OTggIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogUmV0dXJuIGEgdmFsdWUuCisKK1NhdCBKdWwgMTEgMTY6MTk6NDggMTk5OCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKHN0cmluZyk6IE1vdmUgZGVmaW5pdGlvbiBiZWZvcmUgd29ya19zdHVmZi4KKwkod29ya19zdHVmZik6IEFkZCB2b2xhdGlsZV90eXBlLCBmb3JnZXR0aW5nX3R5cGVzLAorCXByZXZpb3VzX2FyZ3VtZW50LCBhbmQgbnJlcGVhdHMgZmllbGRzLgorCShTQ09QRV9TVFJJTkcpOiBOZXcgbWFjcm8uCisJKGRlbWFuZ2xlX3RlbXBsYXRlKTogQWRkIGByZW1lbWJlcicgcGFyYW1ldGVyLiAgQWRkIGNvbW1lbnQuCisJUmVnaXN0ZXIgdGhlIGBCJyBjb2RlIHR5cGUgaGVyZSwgaWYgcmVtZW1iZXJpbmcuICBUaWR5LiAgRml4IGNyYXNoCisJb24gTlVMTCB0bXBsX2FyZ3ZlYy4gIEJlIGNvbnNpc3RlbnQgd2l0aCB1c2Ugb2YgdG5hbWUvdHJhd25hbWUuCisJKGRlbWFuZ2xlX25lc3RlZF9hcmdzKTogTmV3IGZ1bmN0aW9uLgorCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IEhhbmRsZSB2b2xhdGlsZS1xdWFsaWZpZWQgbWVtYmVyCisJZnVuY3Rpb25zLgorCShtb3BfdXApOiBEZWxldGUgdGhlIHByZXZpb3VzX2FyZ3VtZW50IHN0cmluZyBpZiBwcmVzZW50LgorCShkZW1hbmdsZV9zaWduYXR1cmUpOiBUaWR5LiAgSGFuZGxlIHZvbGF0aWxlLXF1YWxpZmllZCBtZW1iZXIKKwlmdW5jdGlvbnMuICBIYW5kbGUgYmFjay1yZWZlcmVuY2VzIHVzaW5nIHRoZSBgQicgY29kZS4gIFVzZSBleHRyYQorCXBhcmFtZXRlciB0byBkZW1hbmdsZV90ZW1wbGF0ZSBhbmQgU0NPUEVfU1RSSU5HIHdoZXJlIGFwcHJvcHJpYXRlLgorCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogRml4IHRoaW5rbzsgJ0InIGlzIG5vdCBhbiBpbnRlZ3JhbAorCWNvZGUuCisJKGRlbWFuZ2xlX2NsYXNzKTogVXNlIFNDT1BFX1NUUklORy4KKwkoZ251X3NwZWNpYWwpOiBQYXNzIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gZGVtYW5nbGVfdGVtcGxhdGUuCisJVXNlIFNDT1BFX1NUUklORy4KKwkoZGVtYW5nbGVfcXVhbGlmaWVkKTogU2F2ZSBxdWFsaWZpZWQgdHlwZXMgZm9yIGxhdGVyCisJYmFjay1yZWZlcmVuY2VzLiAgSGFuZGxlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlCisJdHlwZXMgY29ycmVjdGx5LgorCShkb190eXBlKTogVGlkeS4gIFVzZSBTQ09QRV9TVFJJTkcuICBQYXNzIGV4dHJhIGFyZ3VtZW50IHRvCisJZGVtYW5nbGVfdGVtcGxhdGUuICBVc2UgZGVtYW5nbGVkX25lc3RlZF9hcmdzLiAgRG9uJ3QgcmVtZW1iZXIKKwlxdWFsaWZpZWQgdHlwZXMgaGVyZTsgdGhhdCdzIG5vdyBkb25lIGluIGRlbWFuZ2xlX3F1YWxpZmllZC4KKwlTaW1pbGFybHkgZm9yIHRlbXBsYXRlcy4KKwkoZG9fYXJnKTogSW1wcm92ZSBjb21tbWVudC4gIEhhbmRsZSAnbicgcmVwZWF0IGNvZGUuCisJKHJlbWVtYmVyX3R5cGUpOiBDaGVjayBmb3JnZXR0aW5nX3R5cGVzLgorCShkZW1hbmdsZV9hcmdzKTogRGVhbCB3aXRoICduJyByZXBlYXQgY29kZXMuICBUaWR5LgorCitUaHUgSnVsICAyIDE2OjI2OjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnRhYmxlOiBPbmx5IHVzZSBtaC1mYnNkMjEgb24gKi0qLWZyZWVic2QyLjIuWzAxMl0sIG5vdCBvbgorCSotKi1mcmVlYnNkMi4yLiouICBGcm9tIERtaXRyaWogVGVqYmx1bSA8dGVqYmx1bUBhcmMuaHEuY3RpLnJ1Pi4KKworTW9uIEp1biAxNSAxNjoyOTowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc2V0b2Jqcyk6IENvcnJlY3QgcXVvdGluZyBlcnJvciBpbiBjeWd3aW4zMiBjYXNlLgorCUZyb20gQ2hyaXMgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4uCisKK01vbiBKdW4gIDEgMTM6NDc6NTUgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIG9ic3RhY2suYzogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KKworTW9uIEp1biAgMSAxNDoxNzozNiAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBBZGQgYSBkZXBlbmRlbmN5IG9uIHN0YW1wLXBpY2RpciBmb3IgdGhlCisJb2JqZWN0cywgc28gdGhhdCB3ZSBjYW4gZG8gYSBwYXJhbGxlbCBidWlsZC4KKworU2F0IE1heSAzMCAyMjoxNzoxMyAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KKworCSogY29uZmlndXJlLmluIChjaGVja2Z1bmNzKTogQWRkIG1pc3NpbmcgIiciLgorCitGcmkgTWF5IDI5IDEyOjQwOjQxIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmMgKF9vYnN0YWNrX21lbW9yeV91c2VkKTogIEVsaWRlIHRoaXMgZnVuY3Rpb24gaWYgd2UncmUKKwlvbiBhIHN5c3RlbSB3aXRoIEdOVSBsaWJjLgorCitUdWUgTWF5IDI2IDE4OjI4OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCitUdWUgTWF5IDI2IDE1OjAxOjUyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGFsbG9jYS1jb25mLmguCisKK0ZyaSBNYXkgMjIgMDE6Mzg6MDcgMTk5OCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5zZT4KKworCSogY3BsdXMtZGVtLmMgKE1CVUZfU0laRSk6IEJ1bXBlZCBmcm9tIDUxMiB0byAzMjc2Ny4KKworMTk5OC0wNS0yMSAgTWFyayBNaXRjaGVsbCAgPG1taXRjaGVsbEB1c2EubmV0PgorCisJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSB2b2xhdGlsZSBxdWFsaWZpY2F0aW9uLgorCisxOTk4LTA1LTIxICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHVuaXN0ZC5oIGFzIHdlbGwuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWcuaW46IFJlYnVpbGQuCisJKiBnZXRwYWdlc2l6ZS5jIChHTlVfT1VSX1BBR0VTSVpFKTogVXNlIHN5c2NvbmYgb25seSBpZiBfU0NfUEFHRVNJWkUKKwlpcyBkZWZpbmVkIGluIHVuaXN0ZC5oLiBSZWZvcm1hdCBjb25kaXRpb25hbCBibG9jayBmb3IgZWFzaWVyIHJlYWRpbmcuCisKKwkqIGNvbmZpZy50YWJsZSAoc2hhcmVkKTogRGVmYXVsdCB0byBubyBpZiAke2VuYWJsZV9zaGFyZWR9CisJaXMgdW5zZXQgb3IgZW1wdHk7IHRoaXMgbG9naWMgaXMgdXNlZCBieSB0aGUgdG9wbGV2ZWwKKwljb25maWd1cmUgc2NyaXB0cywgdG9vLgorCitTYXQgTWF5IDE2IDE0OjAxOjI2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnRhYmxlOiBBZGQgbGluZSB0byBzZXQgZW5hYmxlX3NoYXJlZCBpbiB0aGUgTWFrZWZpbGUKKwlhcyBuZWVkZWQuCisKK1dlZCBNYXkgMTMgMTQ6MjQ6MzggMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgorCisJKiBjcGx1cy1kZW0uYyAoc3F1YW5nbGVfbW9wX3VwKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHZvaWQuCisJKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogUmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgYG9wdGlvbnMnLgorCUFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IFJlbW92ZSBmdW5jdGlvbiB3aWRlIHZhcmlhYmxlIGBpbnQgaScgYW5kCisJcmVwbGFjZSB3aXRoIGBzaXplX3QgaScgYXQgZWFjaCBsb2NhdGlvbiB3aGVyZSBpdCBpcyB1c2VkLgorCShjcGx1c19tYW5nbGVfb3BuYW1lKTogY2hhbmdlIHR5cGUgb2YgYGknIGZyb20gaW50IHRvIHNpemVfdC4KKworV2VkIE1heSAxMyAxMzozOTozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFsbG9jYS1jb25mLmg6IEluY2x1ZGUgY29uZmlnLmguICBDaGVjayBIQVZFX0FMTE9DQV9IIHJhdGhlcgorCXRoYW4gc3BhcmMgb3Igc3VuLgorCSogTWFrZWZpbGUuaW4gKGFyZ3Yubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oIGFuZCBhbGxvY2EtY29uZi5oLgorCitGcmkgTWF5ICA4IDAwOjIzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTZXQgbGliaWJlcnR5X3RvcGRpciBjb3JyZWN0bHkgd2hlbiBzcmNkaXIgaXMKKwkiLiIgYW5kIHdpdGhfdGFyZ2V0X3N1YmRpciBpcyBub3Qgc2V0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUaHUgTWF5ICA3IDEzOjAxOjQ0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgKi0qLW1pbmd3MzIqIGNhc2UuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBNYXkgIDYgMTE6MzM6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcudGFibGU6IE5ldmVyIHVzZSBhIFBJQyBmaWxlIGZvciAqLSotY3lnd2luMzIqLgorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIGNvbmZpZy50YWJsZS4KKworCSogY29uZmlndXJlLmluOiBPbiBhIGN5Z3dpbjMyIGhvc3QsIGFsd2F5cyBjb21waWxlIHJhbmRvbSwgYW5kCisJZG9uJ3QgdGVzdCBmb3Igc3lzX3NpZ2xpc3QsIHN0cnNpZ25hbCwgb3IgcHNpZ25hbC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY2xvY2suYzogQ2hlY2sgSEFWRV9TWVNfUEFSQU1fSCByYXRoZXIgdGhhbiBOT19TWVNfUEFSQU1fSC4KKwkqIGdldGN3ZC5jOiBMaWtld2lzZS4KKwkqIGdldHBhZ2VzaXplLmM6IExpa2V3aXNlLgorCSogZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KKworVHVlIE1heSAgNSAxODowODozMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlVc2UgYXV0b2NvbmYgdGVzdHMgcmF0aGVyIHRoYW4gdGhlIG9sZCBkdW1teS5jIHRlc3Q6CisJKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfV0lUSCBjYWxscyBmb3IgLS13aXRoLXRhcmdldC1zdWJkaXIgYW5kCisJLS13aXRoLW5ld2xpYi4gIEFkZCBBQ19DT05GSUdfSEVBREVSLiAgVXNlIEFDX1JFUExBQ0VfRlVOQ1MgZm9yCisJbW9zdCBmdW5jdGlvbnMuICBBZGQgc3BlY2lhbCBjYXNlcyB0byBoYW5kbGUgbmV3bGliIGFuZCBWeFdvcmtzLgorCVJlbW92ZSB0YXJnZXRfbWFrZWZpbGVfZnJhZy4gIENyZWF0ZSBzdGFtcC1oIGluIEFDX09VVFBVVCBpZgorCUNPTkZJR19IRUFERVJTIGlzIHNldC4gIE9ubHkgY2FsbCBjb25maWctbWwuaW4gaW4gQUNfT1VUUFVUIGlmCisJQ09ORklHX0ZJTEVTIGlzIHNldDsgc2V0IGFjX2ZpbGUgYmVmb3JlIGNhbGxpbmcgaXQuCisJKiBjb25maWcudGFibGUgKGFybS0qLXJpc2NpeCosICotKi1jeWd3aW4zMik6IFJlbW92ZS4KKwkoKi0qLWhwdXgqLCAqLSotaGl1eCosICotKi1pcml4NCosICotKi1zb2xhcmlzMiopOiBSZW1vdmUuCisJKCotKi1zeXN2NCosICotKi1nbzMyLCAqLSotdnh3b3JrczUqLCAqLSotdnh3b3Jrcyk6IFJlbW92ZQorCShpWzM0NTZdLSotbWluZ3czMiopOiBSZW1vdmUuCisJKiBNYWtlZmlsZS5pbiAoRVJST1JTX0NDLCBDT05GSUdfSCwgTkVFREVEX0xJU1QpOiBSZW1vdmUuCisJKExJQk9CSlMpOiBOZXcgdmFyaWFibGUuCisJKEhPU1RfT0ZJTEVTLCBET19BTFNPLCBTVEFHRVNUVUZGKTogUmVtb3ZlLgorCShhbGwpOiBEZXBlbmQgdXBvbiBuZWVkZWQtbGlzdC4gIERvbid0IGNoZWNrIFJVTEUxLgorCShAdGFyZ2V0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgorCShDT01QSUxFLmMpOiBJbmNsdWRlIEBERUZTQC4KKwkoSEZJTEVTKTogQWRkIGFsbG9jYS1jb25mLmguCisJKFJFUVVJUkVEX09GSUxFUyk6IFJlbW92ZSBiYXNlbmFtZS5vLgorCSgkKFRBUkdFVExJQikpOiBOZXcgdGFyZ2V0LgorCShzdGFtcC1uZWVkZWQsIGxuZWVkZWQtbGlzdCwgbmVlZGVkLmF3aywgc3RhbXAtY29uZmlnKTogUmVtb3ZlLgorCShsY29uZmlnLmgsIG5lZWRlZDIuYXdrLCBkdW1teS5vLCBlcnJvcnMpOiBSZW1vdmUuCisJKG5lZWRlZC1saXN0LCBjb25maWcuaCk6IFJld3JpdGUuCisJKFJVTEUxLCAkKFJVTEUxKSwgUlVMRTIsICQoUlVMRTIpKTogUmVtb3ZlLgorCSguYWx3YXlzLik6IFJlbW92ZS4KKwkoTWFrZWZpbGUpOiBTZXQgQ09ORklHX0ZJTEVTIGFuZCBDT05GSUdfSEVBREVSUy4KKwkoc3RhbXAtaCk6IE5ldyB0YXJnZXQuCisJKGF0ZXhpdC5vLCBjbG9jay5vLCBnZXRjd2QubywgZ2V0cGFnZXNpemUubyk6IE5ldyB0YXJnZXRzLgorCShiYXNlbmFtZS5vKTogRG9uJ3QgZGVwZW5kIHVwb24gY29uZmlnLmguCisJKGdldHJ1bnRpbWUubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgorCSogYXRleGl0LmM6IEluY2x1ZGUgY29uZmlnLmguICBDaGVjayBIQVZFX09OX0VYSVQgcmF0aGVyIHRoYW4KKwlORUVEX29uX2V4aXQuCisJKiBiYXNlbmFtZS5jOiBEb24ndCBpbmNsdWRlIGNvbmZpZy5oLiAgRG9uJ3QgY2hlY2sgTkVFRF9iYXNlbmFtZS4KKwkqIGNsb2NrLmM6IEluY2x1ZGUgY29uZmlnLmguCisJKiBnZXRjd2QuYzogTGlrZXdpc2UuCisJKiBnZXRwYWdlc2l6ZS5jOiBMaWtld2lzZS4KKwkqIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuICBGaXggY2hlY2tzIHdoaWNoIHNldCBIQVZFX0dFVFJVU0FHRSBhbmQKKwlIQVZFX1RJTUVTLgorCSogc3RyZXJyb3IuYzogQ2hhbmdlIHVzZXMgb2YgTkVFRF9zeXNfZXJybGlzdCB0bworCUhBVkVfU1lTX0VSUkxJU1QuICBMaWtld2lzZSBmb3IgTkVFRF9zdHJlcnJvciBhbmQgSEFWRV9TVFJFUlJPUi4KKwkqIHN0cnNpZ25hbC5jOiBMaWtld2lzZSBmb3IgTkVFRF9zeXNfc2lnbGlzdCBhbmQgSEFWRV9TWVNfU0lHTElTVCwKKwlhbmQgZm9yIE5FRURfc3Ryc2lnbmFsIGFuZCBIQVZFX1NUUlNJR05BTCBhbmQgZm9yIE5FRURfcHNpZ25hbCBhbmQKKwlIQVZFX1BTSUdOQUwuCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGR1bW15LmM6IFJlbW92ZS4KKwkqIGZ1bmN0aW9ucy5kZWY6IFJlbW92ZS4KKwkqIGNvbmZpZy9taC1jeHV4NyAoSERFRklORVMpOiBSZW1vdmUgLURIQVZFX1NZU0NPTkYuCisJKiBjb25maWcvbWgtd2luZG93cyAoSERFRklORVMpOiBSZW1vdmUuCisJKiBjb25maWcvbWgtY3lnd2luMzI6IFJlbW92ZS4KKwkqIGNvbmZpZy9taC1nbzMyOiBSZW1vdmUuCisJKiBjb25maWcvbWgtaXJpeDQ6IFJlbW92ZS4KKwkqIGNvbmZpZy9taC1yaXNjaXg6IFJlbW92ZS4KKwkqIGNvbmZpZy9taC1zeXN2NDogUmVtb3ZlLgorCSogY29uZmlnL210LW1pbmd3MzI6IFJlbW92ZS4KKwkqIGNvbmZpZy9tdC12eHdvcmtzNTogUmVtb3ZlLgorCSogY29uZmlnLmluOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHVzaW5nIGF1dG9oZWFkZXIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK01vbiBNYXkgIDQgMTM6MDA6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJld3JpdGUgdG8gdXNlIGF1dG9jb25mLgorCSogY29uZmlndXJlOiBHZW5lcmF0ZSB1c2luZyBhdXRvY29uZi4KKwkqIGNvbmZpZy9taC1hNjhic2Q6IFJlbW92ZS4KKwkqIGNvbmZpZy9taC1hcG9sbG82ODogUmVtb3ZlLgorCSogY29uZmlnL21oLWhwYnNkOiBSZW1vdmUuCisJKiBjb25maWcvbWgtbmNyMzAwMDogUmVtb3ZlLgorCSogY29uZmlnL21oLXN5c3Y6IFJlbW92ZS4KKwkqIGNvbmZpZy9taC1haXggKFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KKwkqIGNvbmZpZy9taC1jeHV4NyAoUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgorCSogY29uZmlnL21oLWlyaXg0IChDQywgUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgorCSogY29uZmlnL21oLXN5c3Y0IChSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCisJKiBjb25maWcudGFibGU6IENoYW5nZSBjb25maWdfc2hlbGwgdG8gQ09ORklHX1NIRUxMLCBhbmQgdXNlCisJbGliaWJlcnR5X3RvcGRpciB0byBmaW5kIG1vdmUtaWYtY2hhbmdlLgorIAkobTY4ay1hcG9sbG8tYnNkKiwgbTY4ay1hcG9sbG8tc3lzdiopOiBSZW1vdmUuCisJKGlbMzQ1Nl04Ni1uY3Itc3lzdjQqLCAqLSotZGd1eCosIGhwcGEqLWhwLWJzZCopOiBSZW1vdmUuCisJKCotKi1pcml4KiwgKi0qLW04OGtiY3MqLCAqLSotc3lzdiopOiBSZW1vdmUuCisJKiBNYWtlZmlsZS5pbiAoc3JjZGlyKTogU2V0IHRvIEBzcmNkaXJALgorCShWUEFUSCk6IExpa2V3aXNlLgorCShwcmVmaXgsIGV4ZWNfcHJlZml4LCBiaW5kaXIsIGxpYmRpcik6IFNldCB0byBhdXRvY29uZiB2YXJpYWJsZXMuCisJKFNIRUxMLCBJTlNUQUxMLCBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IExpa2V3aXNlLgorCShDQywgQ0ZMQUdTLCBSQU5MSUIpKTogTGlrZXdpc2UuCisJKGRhdGFkaXIsIG1hbipkaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsIE1BS0VJTkZPKTogUmVtb3ZlLgorCSh0YXJnZXRfbWFrZWZpbGVfZnJhZywgaG9zdF9tYWtlZmlsZV9mcmFnKTogQWRkIHN1YnN0aXR1dGlvbnMuCisJKElOU1RBTExfREVTVCk6IFNldCB0byBASU5TVEFMTF9ERVNUQC4KKwkoTWFrZWZpbGUpOiBEZXBlbmQgdXBvbiBjb25maWcuc3RhdHVzLiAgRG9uJ3QgZGVwZW5kIHVwb24KKwkkKGhvc3RfbWFrZWZpbGVfZnJhZykgb3IgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykuCisJKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgorCitTdW4gTWF5ICAzIDE3OjU4OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL210LXN1bm9zNDogUmVtb3ZlLiAgU2hvdWxkIGJlIGhhbmRsZWQgYnkgLS13aXRoLWhlYWRlcnMKKwlhbmQgLS13aXRoLWxpYnJhcmllcyBvcHRpb25zIGF0IHRvcCBsZXZlbC4KKwkqIGNvbmZpZy50YWJsZTogTmV2ZXIgdXNlIG10LXN1bm9zNC4KKworCSogYWxsb2NhLWNvbmYuaDogTmV3IGZpbGUsIGNvbWJpbmluZyBhbGxvY2Etbm9ybS5oIGFuZAorCWFsbG9jYS1ib3RjaC5oLgorCSogYWxsb2NhLW5vcm0uaDogUmVtb3ZlLgorCSogYWxsb2NhLWJvdGNoLmg6IFJlbW92ZS4KKwkqIGNvbmZpZ3VyZS5pbjogU2V0IHNoZWxsIHZhcmlhYmxlcyBmaWxlcyBhbmQgbGlua3MgdG8gZW1wdHkuCisJKiBjb25maWcudGFibGU6IERvbid0IHNldCBzaGVsbCB2YXJpYWJsZSBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5iYXQ6IERvbid0IGNyZWF0ZSBhbGxvY2EtY29uZi5oLgorCSogbWFrZWZpbGUudm1zOiBMaWtld2lzZS4KKwkqIG1wdy1jb25maWcuaW46IExpa2V3aXNlLgorCSogdm1zYnVpbGQuY29tOiBMaWtld2lzZS4KKworRnJpIE1heSAgMSAxMTo0MTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICgkKEhPU1RfT0ZJTEVTKSAkKFJFUVVJUkVEX09GSUxFUykpOiBSZW1vdmUgb2xkCisJdGFyZ2V0IGRlcGVuZGluZyB1cG9uIGNvbmZpZy5oLgorCShhbGxvY2Eubyk6IEFkZCB0YXJnZXQgZGVwZW5kaW5nIHVwb24gY29uZmlnLmgKKwkoYmFzZW5hbWUubywgY2hvb3NlLXRlbXAubywgZm5tYXRjaC5vKTogTGlrZXdpc2UuCisJKGdldG9wdC5vLCBnZXRvcHQxLm8sIHBleGVjdXRlLm8sIHN0cmVycm9yLm8pOiBMaWtld2lzZS4KKwkoc3Ryc2lnbmFsLm8sIHhzdHJlcnJvci5vKTogTGlrZXdpc2UuCisKK0ZyaSBNYXkgIDEgMDQ6MjY6MjUgMTk5OCAgUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKwkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiAgSW5pdGlhbGl6ZSB3b3JrLgorCitNb24gQXByIDI3IDE1OjUzOjMwIEVEVCAxOTk4IEFuZHJldyBNYWNMZW9kIDxhbWFjbGVvZEBjeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogUmVwbGFjZSBtaXNzaW5nIGVsc2UuCisKK1N1biBBcHIgMjYgMTU6Mzg6NTAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IEZpeCBvZmYtYnktb25lIGJ1ZyB3aGVuIGNoZWNraW5nIHRoZQorCWxlbmd0aCBpbiB0aGUgbmFtZSBvZiBhIHZpcnR1YWwgdGFibGUuCisKK1dlZCBBcHIgMjIgMTA6NTM6NDkgRURUIDE5OTggQW5kcmV3IE1hY0xlb2QgIDxhbWFjbGVvZEBjeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoc3RydWN0IHdvcmsgc3R1ZmYpOiBBZGQgZmllbGQgZm9yIEIgYW5kIEsgbWFuZ2xlIGNvZGVzLgorCShjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBDYWxsIG1vcF91cF9zcXVhbmdsZS4KKwkoY3BsdXNfZGVtYW5nbGUpOiBJbml0aWFsaXplIHNxdWFuZ2xlIGluZm8sIHRoZW4gY2FsbAorCWludGVybmFsX2NwbHVzX2RlbWFuZ2xlLiAoTW9zdCBjb2RlIG1vdmVkIHRoZXJlIGFzIHdlbGwpCisJKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogTmV3IGZ1bmN0aW9uLCBwZXJmb3JtcyBtb3N0IG9mIHdoYXQgdXNlCisJdG8gYmUgZG9uZSBpbiBjcGx1c19kZW1hbmdsZSwgYnV0IGlzIG9ubHkgY2FsbGVkIHdpdGggdGhpcyBmaWxlLgorCShzcXVhbmdsZV9tb3BfdXApOiBOZXcgZnVuY3Rpb24gdG8gY2xlYW4gdXAgQiBhbmQgSyBjb2RlIGRhdGEuCisJKG1vcF91cCk6IHNldCBwb2ludGVycyB0byBOVUxMIGFmdGVyIGZyZWVpbmcuCisJKGRlbWFuZ2xlX3NpZ25hdHVyZSwgZGVtYW5nbGVfdGVtcGxhdGUsIGRlbWFuZ2xlX2NsYXNzKTogQWRkCisJc3dpdGNoIGVsZW1lbnRzIHRvIGhhbmRsZSBLIGFuZCBCIGNvZGVzLgorCShkZW1hbmdsZV9wcmVmaXgsIGdudV9zcGVjaWFsLCBkZW1hbmdsZV9xdWFsaWZpZWQpOiBBZGQKKwljb2RlIHRvIGhhbmRsZSBLIGFuZCBCIGNvZGVzLgorCShkb190eXBlLCBkZW1hbmdsZV9mdW5kX3R5cGUpOiBIYW5kbGUgQiBhbmQgSyBjb2Rlcy4KKwkocmVtZW1iZXJfS3R5cGUpOiBOZXcgZnVuY3Rpb24gdG8gc3RvcmUgSyBpbmZvLgorCShyZWdpc3Rlcl9CdHlwZSwgcmVtZW1iZXJfQnR5cGUpOiBOZXcgZnVuY3Rpb25zIGZvciBCIGNvZGVzLgorCShmb3JnZXRfQl9hbmRfS190eXBlcyk6IE5ldyBmdW5jdGlvbiB0byBkZXN0cm95IEIgYW5kIEsgaW5mby4KKworRnJpIEFwciAxMCAwMTo0OToxMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIENPUFlJTkcuTElCLCBjaG9vc2UtdGVtcC5jLCBjcGx1cy1kZW0uYzogU3luYyB3aXRoIGVnY3MgJiBnY2MuCisKK1RodSBNYXIgIDUgMDk6MjM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBjb25maWcudGFibGU6IE1ha2UgbG9jYXRpbmcgZnJhZyBmaWxlcyBmYWlsc2FmZSBldmVuIGZvciB0aGUKKwlzcGVjaWFsIGNhc2UgaWYgY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIGluIHNyY2Rpci4KKworTW9uIEZlYiAyMyAxNDozMzoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNob29zZS10ZW1wLmM6IEZpeCBoYW5kbGluZyBvZiBzeXMvZmlsZS5oIHRvIHdvcmsgaW4gbGliaWJlcnR5LgorCitTdW4gRmViIDIyIDE4OjAzOjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY2hvb3NlLXRlbXAuYzogU3luYyB3aXRoIGNvcHkgaW4gZ2NjLgorCitUaHUgRmViIDEyIDE2OjI5OjQ5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2V0b3B0LmM6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCisJKiBnZXRvcHQxLmM6IExpa2V3aXNlLgorCitUdWUgRmViIDEwIDE2OjU4OjMzIDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IC48ZGlnaXRzPgorCXN0cmluZ3MgdGhhdCBhcmUgbm90IGFjdHVhbGx5IGxlbmd0aHMuCisKK0ZyaSBGZWIgIDYgMDE6MzU6MTcgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgorCisJKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IERvbid0IHBhc3MgUElDRkxBRy4KKwkoLmMubyk6IENoZWNrIHZhbHVlIG9mIGVuYWJsZV9zaGFyZWQsIG5vdCBQSUNGTEFHLgorCShzdGFtcC1waWNkaXIpOiBEaXRvLgorCitUaHUgRmViICA1IDE4OjQ4OjU2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWcvbWgtY3lnd2luMzI6IHJlbW92ZSB2YXNwcmludGYubyBmcm9tIEVYVFJBX09GSUxFUworICAgICAgICBzaW5jZSBpdCBnZXRzIGJ1aWx0IGF1dG9tYXRpY2FsbHkKKworU3VuIEZlYiAgMSAwMjo1MjozMiAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+CisKKwkqIGNvbmZpZy50YWJsZSAodnh3b3JrcyBjb25maWdzKTogRGVmYXVsdCB0byBWeFdvcmtzIDUueCwgYXMgdGhhdCBpcworCXRoZSBjdXJyZW50bHkgc2hpcHBpbmcgT1MuCisKK1R1ZSBKYW4gMjcgMTY6MDg6MjAgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIHZtc2J1aWxkLmNvbSBbUkVRVUlSRV9PRklMRVNdOiBTeW5jaHJvbml6ZWQgd2l0aCBNYWtlZmlsZS5pbjoKKwlBZGQgZm5tYXRjaC5vIGFuZCBvYmphbGxvYy5vOyByZW1vdmUgdmFzcHJpbnRmLm8uCisJW2NvbmZpZy5oXTogRGVmaW5lIE5FRURfc3Ryc2lnbmFsLgorCitNb24gSmFuIDE5IDEyOjIwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZnVuY3Rpb25zLmRlZjogQ29ycmVjdCBhcmd1bWVudCB0eXBlcyBmb3Igc3RyZXJyb3IgYW5kCisJc3Ryc2lnbmFsLiAgUmVwb3J0ZWQgYnkgQWxleCBHdXRtYW4gPGFndXRtYW5AZW1jLmNvbT4uCisKK1N1biBKYW4gMTggMTU6NTc6MjggMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogdmFzcHJpbnRmLmMgKGludF92YXNwcmludGYpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZSBmb3IgZmxvYXQvZG91YmxlCisJdmFsdWVzLgorCitTYXQgSmFuIDE3IDIyOjI4OjM4IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgorCQkJICBKLkouIFZhbmRlckhlaWpkZW4gPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KKworCUFkZCBtaW5ndzMyIHN1cHBvcnQuCisJKiBwZXhlY3V0ZS5jIChwZXhlY3V0ZSk6IE5ldyBmdW5jdGlvbiBmb3IgbWluZ3czMi4gU3VwcG9ydHMgcGlwZXMuCisJKHB3YWl0KTogTmV3IGZ1bmN0aW9uIGZvciBtaW5ndzMyLgorCisJKiBjb25maWcudGFibGUgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogU3VwcG9ydCBmb3IgaTM4Ni1taW5ndzMyLgorCSogY29uZmlnL210LW1pbmd3MzI6IE5ldyBmaWxlLgorCSogeG1hbGxvYy5jIChmaXJzdF9icmVhayk6IE5vdCB1c2VkIGZvciBtaW5ndzMyLgorCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBEb24ndCB1c2Ugc2JyayBvbiBtaW5ndzMyLgorCSh4bWFsbG9jKTogTGlrZXdpc2UuCisJKHhyZWFsbG9jKTogTGlrZXdpc2UuCisKK1NhdCBKYW4gMTcgMjI6Mjg6MDUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjaG9vc2UtdGVtcC5jOiBTeW5jIHdpdGggZ2NjIHZlcnNpb24uCisKK1R1ZSBKYW4gMTMgMTg6MzQ6MzkgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIsIGluc3RhbGxfdG9fdG9vbGRpcik6IEFkZCBNVUxUSVNVQkRJUgorCXRvIGFsbCBmaWxlbmFtZXMgaW4gbGliZGlyIGFuZCB0b29sZGlyLgorCShkaXN0Y2xlYW4pOiBEbyBNVUxUSUNMRUFOIGJlZm9yZSBkZWxldGluZyBNYWtlZmlsZS4KKwkoc3RhbXAtbmVlZGVkLCBzdGFtcC1jb25maWcpOiBBZGQgTVVMVElTUkNUT1AgdG8KKwlwYXRobmFtZSBmb3IgbW92ZS1pZi1jaGFuZ2UuCisKK1RodSBEZWMgIDQgMTc6MjU6MTkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzdHJzaWduYWwuYyAoc3lzX25zaWcpOiBUcnkgTlNJRyBhbmQgX05TSUcuCisKK1dlZCBOb3YgMTkgMTM6Mzc6MDYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGFsbG9jYS1ub3JtLmggKGFsbG9jYSwgR0NDIGNhc2UpOiBEb24ndCByZWRlZmluZSBhbGxvY2EgaWYgaXQKKwl3YXMgYWxyZWFkeSBkZWZpbmVkIHByZXZpb3VzbHkuCisKK01vbiBOb3YgMTAgMTI6NDg6MDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIC4uL2luc3RhbGwtc2gsIG5vdCBpbnN0YWxsLgorCitUdWUgT2N0IDI4IDIzOjQxOjE1IDE5OTcgIEp1ZHkgR29sZGJlcmcgIDxqb2R5Z0BpZHQubmV0PgorCisJKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHBleGVjdXRlLmMuCisKK1dlZCBPY3QgMTUgMTk6MTM6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhc3ByaW50Zi5jOiBDb25zaXN0ZW50bHkgdXNlIGVpdGhlciBzdGRhcmcgb3IgdmFyYXJncy4KKworVHVlIE9jdCAxNCAxMjowMTowMCAxOTk3ICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+CisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBEb24ndCBsb29rIGZvciByZXR1cm4gdHlwZXMgb24KKwljb25zdHJ1Y3RvcnMuICBIYW5kbGUgbWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9ycy4KKworRnJpIE9jdCAgMyAxNzo1MzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIFJFQURNRTogRml4IGNvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb25zLgorCitNb24gU2VwIDI5IDEyOjI4OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcGV4ZWN1dGUuYzogVXBkYXRlIHRvIGN1cnJlbnQgdmVyc2lvbiBmcm9tIC9nZC9nbnUvbGliOgorCisJTW9uIFNlcCAyOSAxMjoyNzo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBwZXhlY3V0ZS5jOiBVc2Ugc3Bhd24gaWYgX19DWUdXSU4zMl9fLgorCisJMTk5Ny0wOC0wOCAgUGF1bCBFZ2dlcnQgIDxlZ2dlcnRAdHdpbnN1bi5jb20+CisKKyAgICAgICAgKiBwZXhlY3V0ZS5jOiBJbmNsdWRlICJjb25maWcuaCIgZmlyc3QsIGFzIHBlciBhdXRvY29uZiBtYW51YWwuCisKKwlGcmkgSnVuIDI3IDE1OjIwOjI5IDE5OTcgIFNjb3R0IENocmlzdGxleSA8c2NvdHRjQG5ldC1jb21tdW5pdHkuY29tPgorCisgICAgICAgICogcGV4ZWN1dGUuYyAoZml4X2FyZ3YpOiBOZXcgZnVuY3Rpb24uCisgICAgICAgIChwZXhlY3V0ZSk6IFdpbjMyIGJ1dCBub3QgQ3lnd2luMzIgbmVlZHMgaXRzIGFyZ3VtZW50cyBmaXhlZC4KKyAgICAgICAgQWRkIHVuZGVyc2NvcmUgdG8gY3dhaXQgZnVuY3Rpb24gY2FsbC4KKworU3VuIFNlcCAyOCAxMjowMDo1MiAxOTk3ICBNYXJrIE1pdGNoZWxsICA8bW1pdGNoZWxsQHVzYS5uZXQ+CisKKyAgICAgICAgKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBBZGQgbmV3IHBhcmFtZXRlci4gIEhhbmRsZSBuZXcKKyAgICAgICAgdGVtcGxhdGUtZnVuY3Rpb24gbWFuZ2xpbmcuCisgICAgICAgIChjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMpOiBOZXcgZnVuY3Rpb24uCisgICAgICAgIChkZW1hbmdsZV9zaWduYXR1cmUpOiBIYW5kbGUgbmV3IG5hbWUtbWFuZ2xpbmcgc2NoZW1lLgorCitXZWQgU2VwIDI0IDAwOjMxOjU5IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAeWluLmN5Z251cy5jb20+CisKKwkqIGFzcHJpbnRmLmM6IHN0ZGFyZy5oIHdoZW4gQUxNT1NUX1NUREMKKwkqIGNvbmZpZy9taC13aW5kb3dzIChFWFRSQV9PRklMRVMpOiBhZGQgYXNwcmludGYubyBhbmQKKyAJc3RybmNhc2VjbXAuby4KKworVGh1IEF1ZyAyOCAxNDoyNzoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHZhc3ByaW50Zi5jICh2YXNwcmludGYpOiBBbGxvdyBmb3IgX0JTRF9WQV9MSVNUXy4KKworCSogY29uZmlnLnRhYmxlOiBBZGQgY2FzZSBmb3IgRnJlZUJTRCAyLjEgYW5kIDIuMiwgbmVlZHMgbWgtZmJzZDIxLgorCisJKiBjb25maWcvbWgtZmJzZDIxIChFWFRSQV9PRklMRVMpOiBGb3JjZSB2YXNwcmludGYubworCitXZWQgU2VwIDEwIDEyOjQzOjEwIDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENoYW5nZSAiY29tcGxleCIgdG8gIl9fY29tcGxleCIuCisKK0ZyaSBTZXAgIDUgMTY6MzQ6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhc3ByaW50Zi5jIChhc3ByaW50Zik6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBhc3ByaW50Zi5jCisJKiBmdW5jdGlvbnMuZGVmOiBEaXR0by4KKworVGh1IEF1ZyAyOCAxODo1MzozNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGFyZ3YuYyAoZHVwYXJndik6IE5ldyBmdW5jdGlvbiwgZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4KKworVHVlIEF1ZyAxOSAyMDoyODo0NSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvbWgtY3lnd2luMzI6IGFsc28gYnVpbGQgcmFuZG9tLm8KKworVHVlIEF1ZyAxOSAxNzoxMDo1NiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jOiBBZGQgJ2V4dGVybicgdG8gcHJlcGVuZHNfdW5kZXJzY29yZS4KKworV2VkIEp1bCAzMCAxMTo0MjoxOSAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmM6IFZhcmlvdXMgY2hhbmdlcyB0byBwcm9kdWNlIEphdmEgb3V0cHV0IHdoZW4gcGFzc2VkCisJRE1HTF9KQVZBLiAgVGh1cyAiOjoiIGJlY29tZXMgIi4iIGFuZCAiSkFycmF5PEZvbz4iIGJlY29tZXMgIkZvb1tdIi4KKwkobWFpbik6IFN1cHBvcnQgLS1qYXZhIGFuZCAtaiBmbGFncyB0byBzZXQgRE1HTF9KQVZBLgorCitUdWUgSnVsIDIyIDE5OjA1OjIzIDE5OTcgIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVATWF0aGVtYXRpay5UVS1DaGVtbml0ei5ERT4KKworCSogY29uZmlnL21oLWdvMzIgKENDLCBBUiwgUkFOTElCKTogRG9uJ3QgZGVmaW5lLgorCitUdWUgSnVsIDIyIDE3OjQ5OjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBwZXhlY3V0ZS5vLgorCShwZXhlY3V0ZS5vKTogTmV3IHRhcmdldC4KKworCSogTWFrZWZpbGUuaW4gKHN0YW1wLW5lZWRlZCk6IE5ldyB0YXJnZXQsIHJlcGxhY2luZyBuZWVkZWQtbGlzdC4KKwkobmVlZGVkLWxpc3QpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLW5lZWRlZC4KKwkoc3RhbXAtY29uZmlnKTogTmV3IHRhcmdldCwgcmVwbGFjaW5nIGNvbmZpZy5oLgorCShjb25maWcuaCk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtY29uZmlnLgorCShtb3N0bHljbGVhbik6IFJlbW92ZSBzdGFtcC0qLgorCitUaHUgSnVuIDEyIDExOjAwOjE4IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6IHBhc3MgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNIGFuZAorCUlOU1RBTExfREFUQSBmb3IgbXVsdGlsaWJiZWQgaW5zdGFsbHMKKworVHVlIEp1biAgMyAxMzoyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJVHVlIERlYyAxMCAwOTo0NDo1NyAxOTk2ICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KKworCSogY2hvb3NlLXRlbXAuYyAoY2hvb3NlX3RlbXBfYmFzZSk6IERvbid0IGR1bXAgY29yZSBpZiBUTVBESVIgaXMgZW1wdHkuCisKKwkqIGNob29zZS10ZW1wLmMgKHRyeSk6IEluc2lzdCB0aGF0IHRlbXAgZGlyIGJlIHNlYXJjaGFibGUuCisKKwlXZWQgT2N0IDIzIDE3OjM2OjM5IDE5OTYgIERvdWcgUnVwcCAgKHJ1cHBAZ25hdC5jb20pCisKKwkqIGNob29zZS10ZW1wLmMgKGNob29zZV90ZW1wX2Jhc2UpOiBPbiBWTVMsIHVzZSBwcm9wZXIgc3ludGF4CisJZm9yIGN1cnJlbnQgZGlyZWN0b3J5LgorCisJU2F0IEZlYiAxNSAxOTowMzo0OCAxOTk3ICBHZW9mZnJleSBOb2VyICAobm9lckBjeWdudXMuY29tKQorCisJKiBwZXhlY3V0ZS5jOiBSZW1vdmUgc3BlY2lhbCBjYXNlcyBmb3IgY3lnd2luMzIuCisJKHB3YWl0KTogUmVtb3ZlIGxvY2FsIGRlZmluaXRpb24gb2YgYHBpZCcuCisKKwlUdWUgTm92IDEyIDE4OjI2OjE1IDE5OTYgIERvdWcgUnVwcCAgKHJ1cHBAZ25hdC5jb20pCisKKwkqIHBleGVjdXRlLmMgKHZmb3JrKTogU3VwcGx5IG5ldyBkZWZpbml0aW9uIGZvciBWTVMuCisJKHB3YWl0KTogVXNlIHdhaXRwaWQgaW5zdGVhZCBvZiB3YWl0IGZvciBWTVMuCisKK1R1ZSBNYXkgMjAgMTQ6MDI6MjAgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSBgSicuCisJKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFByaW50ICJjb21wbGV4IiBmb3IgaXQuCisKK1dlZCBBcHIgMzAgMTI6MTU6NDUgMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERvbid0IHR1cm4gb24gbXVsdGlsaWIgaGVyZS4KKworTW9uIEFwciAyOCAxOTowNDozMSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBvYnN0YWNrLmM6IG1vdmUgX29ic3RhY2tfbWVtb3J5X3VzZWQgb3V0c2lkZSBvZiBpZmRlZi4gIENhbm5vdCBiZQorCWVsaWRlZDsgbmVlZGVkIGJ5IGdkYiBhbmQgbm90IHByZXNlbnQgaW4gbGliYy4KKworVGh1IEFwciAyNCAxOTozMzo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSB0bXBtdWx0aS5vdXQuCisKK1R1ZSBBcHIgMjIgMTA6MjU6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCk6CisJQWRkIG5ldyBmbG9hdGZvcm1hdCwgbWFpbmx5IGZvciBBUk0gZG91Ymxlcy4KKworTW9uIEFwciAxNCAxMjoxMToxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy50YWJsZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aXRoICR7bW92ZWlmY2hhbmdlfS4gIEZyb20KKwlUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+LgorCitGcmkgQXByICA0IDAzOjA5OjI0IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEVuYWJsZSBtdWx0aWxpYmluZyBieSBkZWZhdWx0LgorCVVwZGF0ZSBtdWx0aWxpYiB0ZW1wbGF0ZSB0byByZWFkIGNvbmZpZy1tbC5pbi4KKworVHVlIEFwciAgMSAxNjoyNjozOSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogbWFrZWZpbGUudm1zOiBBZGQgb2JqYWxsb2MuCisKK01vbiBNYXIgMzEgMjM6NTc6NTEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2l0KTogQWRkIHByb3RvdHlwZSBkZWNsYXJhdGlvbi4KKwkodXNhZ2UsIGZhdGFsKTogTGlrZXdpc2UuCisKKwkqIHhleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogQWRkIHByb3RvdHlwZS4KKworCSogc3RyZXJyb3IuYyAoaW5pdF9lcnJvcl90YWJsZXMpOiBEZWNsYXJlLgorCitGcmkgTWFyIDI4IDExOjQzOjIwIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgorCisJKiBmdW5jdGlvbnMuZGVmOiBBZGQgREVGIG9mIHZhc3ByaW50ZiwgYW5kIERFRkZVTkMgb2Ygc3Ryc2lnbmFsLgorCSogc3Ryc2lnbmFsLmM6IE9ubHkgZGVmaW5lIHN0cnNpZ25hbCBpZiBORUVEX3N0cnNpZ25hbC4KKwkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiBSZW1vdmUgdmFzcHJpbnRmLm8uCisJKiBjb25maWd1cmUuaW46IEFkZCBORUVEX3N0cnNpZ25hbCB0byB4Y29uZmlnLmguICBBZGQgdmFzcHJpbnRmLm8KKwl0byB4bmVlZGVkLWxpc3QuCisJKiBjb25maWcvbWgtY3lnd2luMzIgKEhERUZJTkVTKTogQWRkIC1ETkVFRF9zdHJzaWduYWwuCisJKEVYVFJBX09GSUxFUyk6IERlZmluZSB0byB2YXNwcmludGYuby4KKwkqIGNvbmZpZy9taC13aW5kb3dzIChIREVGSU5FUyk6IEFkZCAtRE5FRURfc3Ryc2lnbmFsLgorCShFWFRSQV9PRklMRVMpOiBBZGQgdmFzcHJpbnRmLm8uCisJKiBjb25maWcvbXQtdnh3b3JrczUgKHZ4Y29uZmlnLmgpOiBEZWZpbmUgTkVFRF9zdHJzaWduYWwuCisJKHZ4bmVlZGVkLWxpc3QpOiBBZGQgdmFzcHJpbnRmLm8uCisKK1RodSBNYXIgMjAgMTc6MDI6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBvYmphbGxvYy5jOiBJbmNsdWRlIDxzdGRpby5oPi4KKworTW9uIE1hciAxNyAxOToyMzoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9iamFsbG9jLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBvYmphbGxvYy5jCisJKFJFUVVJUkVEX09GSUxFUyk6IEFkZCBvYmphbGxvYy5vLgorCShvYmphbGxvYy5vKTogTmV3IHRhcmdldC4KKworU2F0IE1hciAxNSAxODo0OTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG9ic3RhY2suYzogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24uCisKK0ZyaSBNYXIgMTQgMTQ6MTg6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYzogQWRkIHByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLgorCShteXN0cnN0cik6IE1ha2Ugc3RhdGljLiAgTWFrZSBhcmd1bWVudHMgYW5kIHJlc3VsdCBjb25zdC4KKwkoY3BsdXNfbWF0Y2gpOiBSZW1vdmU7IG5vdCB1c2VkLgorCitUdWUgTWFyIDExIDE0OjIwOjMxIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogQ2FsbCBkZW1hbmdsZWRfZnVuZF90eXBlIGZvciBvdGhlcgorCV9fdCogc3ltYm9scy4KKworVHVlIE1hciAxMSAxNTo0MToyMSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KKworCSogc3BhY2VzLmM6IERlY2xhcmUgbWFsbG9jIGFuZCBmcmVlIHByb3Blcmx5LgorCSogc3Ryc2lnbmFsLmMgKGluaXRfc2lnbmFsX3RhYmxlcyk6IEFkZCBwcm90b3R5cGUuCisJKiB4YXRleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogQWRkIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCisKK1dlZCBGZWIgMTkgMTU6NDM6MjQgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogSWYgYWxsb2NhLm8gaXMgbmVlZGVkLCB4ZXhpdC5vIGlzCisJYWxzbyByZXF1aXJlZCBiZWNhdXNlIG9mIHhtYWxsb2Muby4KKworRnJpIEZlYiAxNCAxMzo0MzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0cnNpZ25hbC5jOiBVbmNvbmRpdGlvbmFsbHkgcmVkZWZpbmUgc3lzX3NpZ2xpc3QgYXJvdW5kIHRoZQorCWluY2x1c2lvbiBvZiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcy4KKworVGh1IEZlYiAxMyAyMjowMTowNCAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KKworCSogbWFrZWZpbGUudm1zOiBSZW1vdmUgOCBiaXQgY2hhcmFjdGVycy4gIFVwZGF0ZSB0byBsYXRlc3QKKwlnY2MgcmVsZWFzZS4KKworVHVlIEZlYiAgNCAxMTo1MjoxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0cnNpZ25hbC5jOiBVc2UgTkVFRF9zeXNfc2lnbGlzdCBpbnN0ZWFkIG9mCisJTE9TSU5HX1NZU19TSUdMSVNULgorCSogY29uZmlnLnRhYmxlOiBEb24ndCB1c2UgbWgtbHlueG9zLgorCSogY29uZmlnL21oLWx5bnhvczogUmVtb3ZlLgorCitUaHUgSmFuIDE2IDE0OjUxOjAzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYzogRml4IGluZGVudGluZzsgbWFrZSBpZGVudGljYWwgdG8gdGhlIGNvcHkKKwlpbiBHQ0MuCisJKGRvX3R5cGUsIGNhc2UgJ00nKTogQ2hlY2sgZm9yIGEgdGVtcGxhdGUgYXMgd2VsbCBhcyBhIGNsYXNzLgorCitUaHUgRGVjIDE5IDEzOjUxOjMzIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL210LXZ4d29ya3M1ICh2eG5lZWRlZC1saXN0KTogUmVtb3ZlIHNpZ3NldG1hc2subywgc2luY2UKKwl2eHdvcmtzIDUuWzAtM10gYWxsIGhhdmUgc2lnc2V0bWFzayBpbiB0aGVtOyB0aGUgb25lIHByb3ZpZGVkIGJ5CisJbGliaWJlcnR5IGlzIGluY29ycmVjdCwgYXMgd2VsbC4KKworTW9uIERlYyAgMiAxNTowMzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGFsbG9jYS5jIChhbGxvY2EpOiBXaGVuIGNvbXBpbGVkIHdpdGggYW4gQU5TSS9JU08gY29tcGlsZXIsCisJYWxsb2NhIHRha2VzIGEgc2l6ZV90IGFyZ3VtZW50LCBub3QganVzdCB1bnNpZ25lZC4KKworTW9uIE5vdiAxOCAxNTo0MjowOCAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jOiBOb3RlIHRoYXQgdGhpcyBmaWxlIGFsc28gbGl2ZXMgaW4gR0NDLgorCitNb24gTm92IDE4IDE1OjE5OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogYWxsb2NhLmM6IFJlbW92ZSBpbmNsdWRlIG9mIGxpYmliZXJ0eS5oIGZvciBocHV4LgorCSogYXJndi5jOiAgUmVwbGFjZSBkZWZzIGZyb20gbGliaWJlcnR5LmguCisJKiBzcGFjZXMuYzogUHV0IGJhY2sgZXh0ZXJucyBmcm9tIHJlbW92ZWQgZnJvbSBsaWJpYmVydHkuaC4KKwkqIHZhc3ByaW50Zi5jOiBSZW1vdmUgaW5jbHVkZSBvZiBsaWJpYmVydHkuaCBmb3IgaHB1eC4KKworTW9uIE5vdiAxOCAxNDowODowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jOiBDaGVja2luZyBpbiBhZ2FpbjsgbGFzdCBjaGVja2luIGZpbGVkIGR1ZSB0byBzdGlja3kgdGFnLgorCitXZWQgTm92IDEzIDA4OjIyOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmM6IFJldmVydCBsYXN0IHR3byBjb21taXRzIGR1ZSB0byBjb25mbGljdHMgd2l0aAorCWhwdXggc3lzdGVtIGhlYWRlcnMuCisKK1dlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBhbGxvY2EuYywgYXJndi5jLCBzcGFjZXMuYywgc3RyY2FzZWNtcC5jLCB2YXNwcmludGYuYywgdnByaW50Zi5jOgorCVJldmVydCBsYXN0IGNvbW1pdCBkdWUgdG8gY29uZmxpY3RzIHdpdGggaHB1eCBzeXN0ZW0gaGVhZGVycy4KKworV2VkIE5vdiAxMyAxMDozNjo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jICh4e20scmV9YWxsb2MpOiBNYWtlIGRlY2xhcmF0aW9ucyBjb21wYXRpYmlsZSB3aXRoCisJbGliaWJlcnR5Lmggd2hlbiBjb21waWxlZCB3aXRoIGEgc3RhbmRhcmQgY29tcGlsZXIuCisKK1R1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBhbGxvY2EuYzogSW5jbHVkZSBsaWJpYmVydHkuaCBmb3IgZGVmaW5pdGlvbiBvZiB4bWFsbG9jLgorCURvbid0IHJlZGVmaW5lIE5VTEwuCisJKiBhcmd2LmM6IE1vdmUgcHJvdG90eXBlcyB0byBsaWJpYmVydHkuaC4KKwkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGZvciBkZWZpbml0aW9uIG9mIHhtYWxsb2MuCisJRG9uJ3QgcmVkZWZpbmUgTlVMTC4KKwlVc2UgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgorCSogc3BhY2VzLmM6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBtYWxsb2MgYW5kIGZyZWUgd2hpY2ggYXJlCisJYWxyZWFkeSBpbiBsaWJpYnJ0eS5oLgorCSogc3RyY2FzZWNtcC5jOiBVc2UgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgorCSogdmFzcHJpbnRmLmM6IEluY2x1ZGUgbGliaWJlcnR5LmggZm9yIGRlZmluaXRpb24gb2YgbWFsbG9jLgorCURvbid0IHJlZGVmaW5lIE5VTEwuCisJKiB2cHJpbnRmLmM6IEluY2x1ZGUgc3RkYXJnLmggaWYgX19TVERDX18uCisKK0ZyaSBPY3QgMTEgMTU6NDI6MTIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXdpbmRvd3M6ICBBZGQgc3RyY2FzZWNtcC5vIHRvIEVYVFJBX09GSUxFUy4KKworRnJpIE9jdCAxMSAxMToxNjozMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy5jIChtcHdpZnlfZmlsZW5hbWUpOiBSZXdyaXRlIHRvIHNpbXBsaWZ5LCBhbmQgdG8gaGFuZGxlCisJdXB3YXJkIGNvbXBvbmVudHMgY29ycmVjdGx5LgorCitUdWUgT2N0ICA4IDA4OjU1OjM0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy50YWJsZSwgY29uZmlnL21oLXdpbmRvd3M6ICBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgdW5kZXIKKwlNU1ZDICh0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KKworTW9uIE9jdCAgNyAxMDo1MDoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGZubWF0Y2guYzogVW5kZWYgY29uc3QgaWYgbm90IF9fU1REQ19fLgorCitUaHUgT2N0ICAzIDEzOjQ2OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZm5tYXRjaC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgZm5tYXRjaC5jLgorCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgZm5tYXRjaC5vLgorCShmbm1hdGNoLm8pOiBOZXcgdGFyZ2V0LgorCitXZWQgU2VwIDE4IDE0OjQ5OjEzIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGhhbmRsaW5nIG9mIGFkZHJlc3MgYXJncy4KKwkoZ251X3NwZWNpYWwpOiBIYW5kbGUgdHlwZV9pbmZvIHN0dWZmLgorCitGcmkgU2VwIDEzIDE3OjUyOjU1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LmMgKERlYnVnUEkpOiBNYWtlIHNldHRhYmxlIGZyb20gdGhlIGVudiB2YXIgREVCVUdfUEFUSE5BTUVTLgorCShtcHdpZnlfZmlsZW5hbWUpOiBIYW5kbGUgIjo6LyIgY2FzZS4KKworVGh1IFNlcCAxMiAxMzozMDo0MCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvbWgtY3lnd2luMzI6IG5ldyBmaWxlIChuZWVkIC1ETkVFRF9iYXNlbmFtZSBhbmQKKwkJLURORUVEX3N5c19zaWdsaXN0IGZvciBuYXRpdmUgTlQgcmVidWlsZGluZykKKwkqIGNvbmZpZy50YWJsZSAoKi0qLWN5Z3dpbjMyKTogbmV3IGVudHJ5CisJKiBjaG9vc2UtdGVtcC5jOiBicmluZyBpbiBzeW5jIHdpdGggZ2NjIChyZXZlcnQgQXVnIDE3IGNoYW5nZSkKKworVGh1IEF1ZyAyOSAxNjo0ODo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy50YWJsZSAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgorCitUdWUgQXVnIDI3IDEzOjQ3OjU4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcGV4ZWN1dGUuYyAocGV4ZWN1dGUpIFtNUFddOiBSZW1vdmUgb2xkIGJvZ3VzIGNvZGUgdGhhdAorCW1lc3NlZCB3aXRoIGFyZ3VtZW50cyB0aGF0IGluY2x1ZGVkIGEgJy8nLCBhZGQgZXNjYXBlIGNoYXJzCisJdG8gZG91YmxlIHF1b3RlcywgcmVtb3ZlIGNvbnN0IGRlY2wgZnJvbSBhcmcgdGhhdCBNYWMKKwljb21waWxlcnMgZG9uJ3Qgc2VlbSB0byBsaWtlLgorCitTYXQgQXVnIDE3IDA0OjQ0OjI3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIHBleGVjdXRlLmM6IFVwZGF0ZSB0ZXN0IGZvciB3aW4zMiAoJiYgISBjeWd3aW4zMikuCisJKiBjaG9vc2UtdGVtcC5jOiBmaXggV0lOMzIgcHJlcHJvY2Vzc29yIGRlZmluZXMKKworVGh1IEF1ZyAxNSAxMjoyNjo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgYW5kIEBTRUdNRU5UX0ZMQUcoe0RlZmF1bHR9KUAKKwl0byBlZGl0aW5nIG9mIGRlZmF1bHQgbWFrZWZpbGUgcnVsZS4KKworU3VuIEF1ZyAxMSAyMTowMzoyNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBhbGxvY2Etbm9ybS5oOiAgSW5jbHVkZSA8bWFsbG9jLmg+IGlmIF9XSU4zMi4KKwkqIGFyZ3YuYzogIEluY2x1ZGUgbm9uLXByb3RvdHlwZWQgZGVjbHMgZm9yIG1hbGxvYyBhbmQgc3RyaW5nCisJZnVuY3Rpb25zIGlmICEgX1dJTjMyIG9yIGlmIF9fR05VQ19fLgorCitUaHUgQXVnICA4IDEyOjQyOjQwIDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBjb25maWcuaC12bXM6IE5ldyBmaWxlLgorCSogbWFrZWZpbGUudm1zOiBVc2UgaXQuCisKK1dlZCBBdWcgIDcgMTc6MTY6MTIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0LmMgKF9nZXRvcHRfaW50ZXJuYWwpOiAgSWYgYXJnYyBpcyAwLCBqdXN0IHJldHVybiAoYmVmb3JlCisJd2UgcmVmZXJlbmNlICphcmd2IGFuZCBzZWdmYXVsdCkuCisKK01vbiBBdWcgIDUgMDE6Mjk6MDggMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogQWRkIG11bHRpbGliLm91dC4KKworVGh1IEp1bCAxOCAxNzo0MDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFsbG9jYS1ub3JtLmg6IENoYW5nZSAjaWZkZWYgc3BhcmMgdG8gI2lmIGRlZmluZWQgKHNwYXJjKSAmJgorCWRlZmluZWQgKHN1bikuICBGcm9tIEFuZHJldyBHaWVydGggPEFORFJFV0dAbWljcm9saXNlLmNvLnVrPi4KKworTW9uIEp1bCAgMSAxMzo0MDo0NCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCVR1ZSBNYXkgMjggMTU6Mjk6MDMgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+CisKKwkqIHZtc2J1aWxkLmNvbSAoUkVRVUlSRF9PRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAubyBhbmQgeHN0cmR1cC5vLgorCisJVGh1IEphbiAyNSAxODoyMDowNCAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKworCSogdm1zYnVpbGQuY29tOiBDaGFuZ2VzIHRvIGhhbmRsZSBERUZGVU5DKG9uX2V4aXQpLgorCShkb19vZmlsZXMpOiBBbGxvdyBub25leGlzdGVudCBzb3VyY2UgZmlsZSBpbiBwYXNzIDMuCisJKGNoa19kZWZmdW5jKTogTmV3IHJvdXRpbmUuCisKK1R1ZSBKdW4gMjUgMTk6MjQ6NDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogcGV4ZWN1dGUuYyAoUEVYRUNVVEVfVkVSQk9TRSk6IERlZmluZS4KKwkoTVBXIHBleGVjdXRlKTogQ2hlY2sgZmxhZ3MgJiBQRVhFQ1VURV9WRVJCT1NFIGluc3RlYWQgb2YgdmVyYm9zZV9mbGFnLgorCitUdWUgSnVuIDI1IDIzOjExOjQ4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmVkLgorCitUdWUgSnVuIDI1IDIzOjAxOjA3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChvbGRpbmNsdWRlZGlyKTogUmVtb3ZlZC4KKworVHVlIEp1biAyNSAyMjo1MDowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisgICAgICAgICogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBTZXQgdG8gJChwcmVmaXgpL3NoYXJlLgorCitUaHUgSnVuIDIwIDIxOjE3OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IFJlaW5kZW50LiAgQXZvaWQgZW5kbGVzcyBsb29wIGJ5CisJY2hlY2tpbmcgZm9yIGVycm9ycyBmcm9tIGRvX3R5cGUuCisKK1R1ZSBKdW4gMTggMTQ6MzY6MTkgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCisJKiB4bWFsbG9jLmM6IElmIFZNUywgaW5jbHVkZSA8c3RkbGliLmg+IGFuZCA8dW5peGxpYi5oPiByYXRoZXIKKwl0aGFuIGRlY2xhcmluZyBtYWxsb2MsIHJlYWxsb2MsIGFuZCBzYnJrLgorCitNb24gSnVuIDEwIDEzOjE3OjE3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHBleGVjdXRlLmM6IE5ldyBmaWxlLgorCitXZWQgSnVuICA1IDE2OjU3OjQ1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiB4bWFsbG9jLmM6IERlY2xhcmUgc2Jyay4KKworU2F0IE1heSAgNCAwNTowODo0NSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFsbG9jYS1ub3JtLmg6ICBBZGQgU1BBUkN3b3JrcyBjYyBjb21wYXRpYmxlIF9fYnVpbHRpbl9hbGxvY2EKKwlkZWNsYXJhdGlvbi4KKworTW9uIEFwciAyMiAxODo0MTo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHhzdHJlcnJvci5jOiBJbmNsdWRlIDxzdGRpby5oPi4KKworU3VuIEFwciAyMSAxMTo1NToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGF0ZXhpdC5jLgorCitTdW4gQXByIDIxIDA5OjUwOjA5IDE5OTYgIFN0ZXBoZW4gTCBNb3NoaWVyICAobW9zaGllckB3b3JsZC5zdGQuY29tKQorCisJKiBjaG9vc2UtdGVtcC5jOiBJbmNsdWRlIHN5cy90eXBlcy5oIGJlZm9yZSBzeXMvZmlsZS5oIGZvciBzY28zLjJ2NS4KKworV2VkIEFwciAxNyAxMToxNzo1NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjaG9vc2UtdGVtcC5jOiBEb24ndCAjaW5jbHVkZSBzeXMvZmlsZS5oIGlmZGVmIE5PX1NZU19GSUxFX0guCisJI2luY2x1ZGUgPHN0ZGlvLmg+CisJKiBjb25maWcvbXQtdnh3b3JrczUgKEhERUZJTkVTKTogRGVmaW5lIE5PX1NZU19GSUxFX0guCisKK1R1ZSBBcHIgMTYgMTE6Mjc6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgc28gaXMgeG1hbGxvYy5vLgorCVJldmVydHMgRmViIDgsIDE5OTUgY2hhbmdlLgorCitNb24gQXByIDE1IDEyOjUzOjI2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNob29zZS10ZW1wLmM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBjaG9vc2UtdGVtcC5jLgorCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAuby4KKworU2F0IEFwciAxMyAxNDoxOTozMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF90b19kb3VibGUpOiAgRG9uJ3QgYmlhcyBleHBvbmVudCB3aGVuCisJaGFuZGxpbmcgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuCisKK1RodSBBcHIgMTEgMTM6MzY6NTYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogIEZpeCBidWdzIHdpdGggaGFuZGxpbmcKKwludW1iZXJzIHdpdGggZnJhY3Rpb25zIDwgMzIgYml0cy4KKworTW9uIEFwciAgOCAxNDo0ODozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy50YWJsZTogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgorCWRpcmVjdG9yaWVzLgorCitUdWUgTWFyIDE5IDIyOjAyOjA3IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGZvciBub24tbWFuZ2xlZCBwb2ludGVyCisJYXJndW1lbnRzLgorCitGcmkgTWFyICA4IDE3OjI0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBJZiBzcmNkaXIgaXMgYC4nIGFuZCB3aXRoX3RhcmdldF9zdWJkaXIgaXMgbm90CisJYC4nLCB0aGVuIHNldCBNVUxUSVNSQ1RPUCBiZWZvcmUgY2FsbGluZyBjb25maWctbWwuaW4uCisKK1RodSBNYXIgIDcgMTM6Mzc6MTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHcuYyAobXB3X29wZW4pOiBBZGQgZGVidWdnaW5nIG91dHB1dCBvcHRpb24uCisKK1dlZCBNYXIgIDYgMTc6MzY6MDMgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBGaXggZm9yIGFkZHJlc3Mtb2YtZXh0ZXJuIGFyZ3VtZW50cy4KKworVHVlIEZlYiAyNyAxMjowMDo1MCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBtcHcuYyAobXB3aWZ5X2ZpbGVuYW1lKTogQ2hhbmdlIDYgdG8gNSBpbgorCXN0cm5jbXAgKHVuaXhuYW1lLCAiL3RtcC8iLCA1KS4KKworVHVlIEZlYiAyMCAxMDo1NTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEluaXRpYWxpemUgaXNfYm9vbC4gIENvcnJlY3RseQorCWhhbmRsZSAwIGFzIGEgcG9pbnRlciB2YWx1ZSBwYXJhbWV0ZXIuCisKK01vbiBGZWIgIDUgMTY6NDE6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVwZW5kIHVwb24gcmVxdWlyZWQtbGlzdC4KKwkocmVxdWlyZWQtbGlzdCk6IE5ldyB0YXJnZXQuCisJKGNsZWFuKTogUmVtb3ZlIHJlcXVpcmVkLWxpc3QuCisKK1dlZCBKYW4gMzEgMTA6MTk6NDEgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogd2luMzIuYzogRGVsZXRlZC4KKwkqIGNvbmZpZy50YWJsZSAoaTM4Ni0qLXdpbjMyKTogRGVsZXRlZC4KKwkqIGNvbmZpZy9taC1pMzg2d2luMzI6IERlbGV0ZWQuCisKK1RodSBKYW4gMTggMTE6MzQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KKwljb25zdCBjaGFyICouCisJKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KKwljb25zdCBjaGFyICouICBEb24ndCBjYXN0IHJldHVybiB2YWx1ZS4KKworVHVlIEphbiAxNiAxMjoxMzoxMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy5jOiBJbmNsdWRlIFRpbWVyLmgsIGluIG9yZGVyIHRvIGdldCBtNjhrIE1pY3Jvc2Vjb25kcyB0cmFwCisJZGVmaW5pdGlvbi4KKworV2VkIEphbiAgMyAxMzoxNTowNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogb2JzdGFjay5jOiBVcGRhdGUgY29weXJpZ2h0IHRvIDE5OTYuCisJKF9vYnN0YWNrX21lbW9yeV91c2VkKTogRGVmaW5lIG5ldyBmdW5jdGlvbi4gIENhbGxlZCB2aWEKKwlvYnN0YWNrX21lbW9yeV91c2VkIG1hY3JvLgorCitUaHUgRGVjIDI4IDExOjM5OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogeHN0cmR1cC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgeHN0cmR1cC5jLgorCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgeHN0cmR1cC5vLgorCSh4c3RyZHVwLm8pOiBOZXcgdGFyZ2V0LgorCitNb24gRGVjIDExIDE4OjE4OjUyIDE5OTUgIE1pa2UgU3R1bXAgIDxtcnNAY3lnbnVzLmNvbT4KKworCSogYXRleGl0LmM6IE5ldyBzdHViIHRvIHByb3ZpZGUgYXRleGl0IG9uIHN5c3RlbXMgdGhhdCBoYXZlCisJb25fZXhpdCwgbGlrZSBTdW5PUyA0LjEueCBzeXN0ZW1zLgorCSogZnVuY3Rpb25zLmRlZiAob25fZXhpdCwgYXRleGl0KTogRGl0dG8uCisKK01vbiBEZWMgMTEgMTU6NDI6MTQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHcuYyAobXB3X2Fib3J0KTogUmVtb3ZlIGRlY2wuCisJKG1wd19hY2Nlc3MpOiBNb3ZlIGRlYnVnZ2luZyBwcmludGYuCisKK1NhdCBEZWMgIDIgMDE6MjU6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWcudGFibGU6IENvbnNpc3RlbnRseSB1c2UgJHtob3N0fSByYXRoZXIgdGhhbiAke3hob3N0fSBvcgorCSR7dGFyZ2V0fS4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIHRvIHNldCAke3hob3N0fSBiZWZvcmUgY2FsbGluZworCWNvbmZpZy50YWJsZS4KKworVHVlIE5vdiAyOCAxNDoxNjo1NyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICguYy5vKTogVXNlIHRlc3QgaW5zdGVhZCBvZiB0aGUgbGVmdCBicmFja2V0LCB0bworCWF2b2lkIHByb2JsZW1zIHdpdGggc29tZSB2ZXJzaW9ucyBvZiBtYWtlLgorCitUdWUgTm92IDI4IDExOjQ1OjE3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkOiBGaXggSU5DRElSIGVkaXQgdG8gd29yayB3aXRoIE5vdiAxNCBjaGFuZ2UuCisKK1R1ZSBOb3YgMjEgMTE6MjY6MzQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvbWgtaHB1eDogUmVtb3ZlLiAgSXQgd2FzIG9ubHkgdXNlZCB0byBkZWZpbmUgRVhUUkFfT0ZJTEVTLAorCXdoaWNoIHdhcyBzZXQgdG8ganVzdCBhbGxvY2Eubywgd2hpY2ggaXMgbm93IGF1dG9tYXRpY2FsbHkgbWFya2VkCisJYXMgbmVlZGVkIGJ5IHRoZSBhdXRvY29uZmlndXJhdGlvbiBwcm9jZXNzLgorCitUdWUgTm92IDIxIDE0OjE1OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnRhYmxlOiBDaGVjayAke3dpdGhfY3Jvc3NfaG9zdH0gcmF0aGVyIHRoYW4gY29tcGFyaW5nCisJJHtob3N0fSBhbmQgJHt0YXJnZXR9LgorCitUaHUgTm92IDE2IDE0OjM0OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBJZiB3aXRoX3RhcmdldF9zdWJkaXIgaXMgZW1wdHksIHNldCB4aG9zdCB0bworCSR7aG9zdH0gcmF0aGVyIHRoYW4gJHt0YXJnZXR9IGJlZm9yZSBjYWxsaW5nIGNvbmZpZy50YWJsZS4KKworVHVlIE5vdiAxNCAwMTozODozMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoTVVMVElUT1ApOiBEZWxldGVkLgorCShNVUxUSVNSQ1RPUCwgTVVMVElCVUlMRFRPUCk6IE5ldy4KKwkoRkxBR1NfVE9fUEFTUyk6IERlbGV0ZSBJTkNESVIuCisJKElOQ0RJUik6IEFkZCAkKE1VTFRJU1JDVE9QKS4KKwkoaW5zdGFsbF90b19saWJkaXIpOiBBZGQgJChNVUxUSVNVQkRJUikuICBDYWxsICQoTVVMVElETykuCisJKiBjb25maWd1cmUuaW46IERlbGV0ZSBjYWxsIHRvIGNmZy1tbC1jb20uaW4uICBDYWxsIGNvbmZpZy1tbC5pbgorCWluc3RlYWQgb2YgY2ZnLW1sLXBvcy5pbi4KKwkoY3Jvc3MtY29tcGlsZSBjaGVjayk6IENoYW5nZSB0byB0ZXN0IGZvciB3aXRoX3RhcmdldF9zdWJkaXIuCisJKEVYVFJBX0xJTktTKTogRGVsZXRlLgorCitTdW4gTm92IDEyIDEyOjEzOjA0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkOiBBZGQgZ2V0cGFnZXNpemUuYy5vIHRvIG5lZWRlZC1saXN0LgorCSogbXB3LmMgW1VTRV9NV19IRUFERVJTXTogQ29uZGl0aW9uYWxpemUgY29tcGlsaW5nIG9mCisJZnVuY3Rpb25zIHRoYXQgYXJlIHN1cHBsaWVkIGJ5IE1ldHJvd2Vya3MgbGlicmFyaWVzLgorCShmc3RhdCk6IENsZWFuIHVwIGRlc2NyaXB0b3ItPnBvaW50ZXIgY29udmVyc2lvbiBjb2RlLgorCShJbnN0YWxsQ29uc29sZSwgZXRjKTogRW1wdHkgZGVmaW5pdGlvbnMsIGZvciB3aGVuIGxpbmtpbmcKKwl3aXRoIFNJT1VYLgorCitTdW4gTm92ICA1IDE5OjI1OjI3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBBbHNvIHBhc3MgUElDRkxBR1MuCisJKC5jLm8pOiAgU3R5bGlzdGljIGNoYW5nZS4KKworVGh1IE5vdiAgMiAxMjowNjoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0cnRvbC5jLCBzdHJ0b3VsLmM6IERvbid0IGluY2x1ZGUgPHN0ZGxpYi5oPi4gIEZyb20KKwlwaGRtQGluZm8udWNsLmFjLmJlIChQaGlsaXBwZSBEZSBNdXl0ZXIpLgorCitXZWQgTm92ICAxIDExOjU5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDb3JyZWN0IHNlZCBjYWxsLgorCitNb24gT2N0IDMwIDEzOjAzOjQ1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46ICBDbGVhbiB1cCAvIHNpbXBsaWZ5IGZvciBuYXRpdmUuCisKKwkqIGNvbmZpZ3VyZS5pbjogIE1lcmdlIGluIHN0dWZmIGZyb20gLi4veGliZXJ0eS9jb25maWd1cmUuaW4uCisJKiBNYWtlZmlsZS5pbiAoQ0MpOiAgQWRkIGRlZmluaXRpb24gKHNvIGl0IGNhbiBiZSBvdmVycnJpZGRlbgorCWJ5IC4uL2NvbmZpZ3VyZSkuCisKK1R1ZSBPY3QgMjQgMTc6NTc6MjcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IExlYXZlIHN0cmVycm9yLmMubyBpbiBzdGFuZGFyZCBsaXN0IG9mIGZ1bmN0aW9ucy4KKwkqIG1wdy5jIChSX09LLCBFTk9FTlQsIEVBQ0NFU1MsIEVOT1NZUyk6IFJlbW92ZS4KKwkobGluayk6IFJlbW92ZSB1c2VsZXNzIGRlZmluaXRpb24gd2l0aCBlcnJvciByZXR1cm4uCisJKGxhc3RfbWljcm9zZWNvbmRzLCB3YXJuX2lmX3NwaW5fZGVsYXksIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSk6CisJVXNlIFVuc2lnbmVkV2lkZSB0eXBlIGZvciBtaWNyb3NlY29uZCBjb3VudHMuCisKK1RodSBPY3QgMTkgMTA6NTI6MDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KKworCSogbWVtY21wLmMgKG1lbWNtcCk6IEFyZ3VtZW50IHR5cGVzIGFyZSBjb25zdCB2b2lkICosIG5vdCB2b2lkCisJKmNvbnN0LgorCisJKiBzdHJuY2FzZWNtcC5jIChzdHJuY2FzZWNtcCk6IEluY2x1ZGUgYW5zaWRlY2wuaC9zdGRhcmcuaCwgbm90CisJc3lzL3R5cGVzLmguCisJKiBzdHJjYXNlY21wLmMgKHN0cmNhc2VjbXApOiBEaXR0by4KKworVHVlIE9jdCAxMCAxMTowMzoyNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJJU09OKTogIFJlbW92ZSBtYWNyby4KKworVHVlIFNlcCAyNiAxNTowNjo0NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBBZGQgZGVmYXVsdCBlbXB0eSBkZWZpbml0aW9uLgorCSogbXB3LWNvbmZpZy5pbiAoY29uZmlnLmgpOiBPbmx5IHVwZGF0ZSBpZiBjaGFuZ2VkLgorCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KKwkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIGVkaXRzIE1ha2VmaWxlLmluIGludG8gTVBXIG1ha2VmaWxlLgorCSogbXB3LmM6IFJlbW92ZSBzZW1pLWNsb25lIG9mIHN0cmVycm9yIGNvZGUuCisJKHN5c19uZXJyLCBzeXNfZXJybGlzdCk6IERlZmluZSBoZXJlLgorCShNaWNyb3NlY29uZHMpOiBPbmx5IGRlZmluZSBhcyBBLWxpbmUgdHJhcCBpZiBtNjhrIE1hYy4KKworV2VkIFNlcCAyMCAxMjo1MzozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIGRpc3RjbGVhbi4KKworTW9uIEF1ZyAyOCAxOTo0Nzo1MiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlnLnRhYmxlOiAgRm9yIGhvc3QsIGdlbmVyYWxpemUgcnM2MDAwLWlibS1haXgqCisJdG8gKi1pYm0tYWl4KiBzbyB3ZSBhbHNvIGluY2x1ZGUgcG93ZXJwYy4KKworVHVlIEF1ZyAyMiAwMzoxODowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+CisKKwlGcmkgSnVuIDE2IDE4OjM1OjQwIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiB4c3RyZXJyb3IuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiwgdm1zYnVpbGQuY29tOiBDb21waWxlIGl0LgorCitNb24gSnVsIDMxIDEyOjE2OjMyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy50YWJsZSAoaTM4Ni0qLXdpbjMyKTogTmV3LgorCitGcmkgSnVsIDIxIDExOjM1OjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChNVUxUSVRPUCk6IE5ldyB2YXJpYWJsZS4KKwkoTVVMVElESVJTLCBNVUxUSVNVQkRJUiwgTVVMVElETywgTVVMVElDTEVBTik6IExpa2V3aXNlLgorCShhbGwpOiBBZGQgbXVsdGlsaWIgc3VwcG9ydC4KKwkoaW5zdGFsbF90b190b29sZGlyLCAqY2xlYW4pOiBMaWtld2lzZS4KKworTW9uIEp1bCAxMCAxMTo0NzoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQWRkIGhleC5vLiAgRnJvbSBESiBEZWxvcmllLgorCitGcmkgSnVuIDMwIDE3OjI4OjU5IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiB2bXNidWlsZC5jb206ICBjcmVhdGUgIm5ldy1saWIub2xiIiwgYnVpbGQgbGliaWJlcnR5IHVuZGVyIHRoYXQKKwluYW1lLCBhbmQgdGhlbiBtYWtlIGl0IGJlY29tZSAibGliZXJ0eS5vbGIiIHdoZW4gZG9uZSwgc28gdGhhdCBhbgorCWluY29tcGxldGUgYnVpbGQgYXR0ZW1wdCBuZXZlciBsZWF2ZXMgYmVoaW5kIHNvbWV0aGluZyB3aGljaCBsb29rcworCWxpa2UgYSBjb21wbGV0ZSBsaWJyYXJ5LgorCitUaHUgSnVuIDI5IDAwOjIyOjAyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taC1pMzg2cGU6IE5ldyBmaWxlIGZvciBQRSBob3N0cy4KKwkqIGNvbmZpZy50YWJsZTogVW5kZXJzdGFuZCBQRSBob3N0cy4KKworV2VkIEp1biAyOCAxOToxMzoyMyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmM6IFVwZGF0ZSBmcm9tIGdjYy4KKworCSogYXJndi5jLCBkdW1teS5jOiBJZiBfX1NURENfXywgI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiIGFmdGVyCisgICAgICAgIDxzdGRkZWYuaD4uCisJKiBhbGxvY2Etbm9ybS5oOiBJZiBfX1NURENfXywgZGVjbGFyZSBhbGxvY2Egd2l0aCBpdHMgcGFyYW1ldGVyLgorCitUaHUgSnVuIDIyIDE4OjU3OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2UuaW4gKEFMTF9DRkxBR1MpOiBEZWZpbmUgTkVFRF9iYXNlbmFtZS4KKwkqIG1wdy5jOiBPbmx5IHRlc3QgRGVidWdQSSBvbmNlIHdoZW5ldmVyIHByaW50aW5nIGRlYnVnIGluZm8uCisJKG1wd2lmeV9maWxlbmFtZSk6IElmIGZpbGVuYW1lIGlzIC90bXAvZm9vLCBjaGFuZ2UgaXQgaW50byA6X2ZvbywKKwlhbHNvIGZpeCB0byBub3Qgd3JpdGUgb24gaW5wdXQgZmlsZW5hbWUgYnVmZmVyLgorCShtcHdfYWNjZXNzKTogVXNlIHN0YXQoKSBpbnN0ZWFkIG9mIG9wZW4oKSwgd29ya3MgZm9yIGRpcmVjdG9yaWVzCisJYXMgd2VsbCBhcyBmaWxlcy4KKworTW9uIEp1biAxOSAwMDozMzoyMiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IE1hc3NhZ2UgYnJva2VuIHNoZWxscyB0aGF0IHJlcXVpcmUgJ2Vsc2UgdHJ1ZScuCisKK1NhdCBKdW4gMTcgMjM6MjE6NTggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGFsbG9jYS1ub3JtLmg6IERlY2xhcmUgYWxsb2NhIGFzIHR5cGUgIlBUUiIgdG8gbWF0Y2ggZnVuY3Rpb25zLmRlZi4KKwlEZWNsYXJlIF9fYnVpbHRpbl9hbGxvY2EgaW4gdGhlIHNwYXJjIGNhc2UsIGFzIGFyZ3YuYyBkaWQuCisJKiBhcmd2LmM6IFJlcGxhY2UgaW5saW5lIHZlcnNpb24gb2YgYWxsb2NhLW5vcm0uaCBhdCBzdGFydCBvZiBmaWxlIHdpdGgKKwlhICNpbmNsdWRlIG9mIGFsbG9jYS1jb25mLmguICBQcmVjZWRlIGl0IHdpdGggYW4gaW5jbHVkZSBvZiBhbnNpZGVjbC5oCisJYmVjYXVzZSBhbGxvY2Etbm9ybS5oIG5lZWRzIHRvIGRlY2xhcmUgYWxsb2NhIGFzICJQVFIiLgorCitNb24gSnVuIDEyIDE0OjI0OjI2IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHdpbjMyLmM6IE5ldyBmaWxlLgorCitGcmkgSnVuICA5IDE1OjE2OjE0IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBkdW1teS5jOiAjaW5jbHVkZSAiYWxsb2NhLWNvbmYuaCIuCisKK1dlZCBKdW4gIDcgMTE6NDY6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBzdGFtcC1waWNkaXIuCisJKGNsZWFuKTogRG9uJ3QuCisKK01vbiBKdW4gIDUgMTg6NDY6MDYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy50YWJsZSAoZnJhZ3MpOiBVc2UgdG9wbGV2ZWwgcGljIGZyYWdzLgorCisJKiBNYWtlZmlsZS5pbiAoUElDRkxBRyk6IE5ldyBtYWNyby4KKwkoYWxsKTogRGVwZW5kIG9uIHN0YW1wLXBpY2Rpci4KKwkobmVlZGVkLWxpc3QpOiBEaXR0by4KKwkoLmMubyk6IEFsc28gYnVpbGQgcGljIG9iamVjdC4KKwkoc3RhbXAtcGljZGlyKTogTmV3IHJ1bGUuCisJKG1vc3RseWNsZWFuKTogUmVtb3ZlIHBpYy4KKwkoY2xlYW4pOiBSZW1vdmUgc3RhbXAtcGljZGlyLgorCitGcmkgTWFyIDI0IDE2OjU1OjQ4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQorCisJKiB2bXNidWlsZC5jb20gKGNvbmZpZy5oKTogQWRkIGAjZGVmaW5lIE5FRURfYmFzZW5hbWUnLgorCitUdWUgTWF5IDIzIDEwOjEyOjQ2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjbG9jay5jLCBnZXRvcHQuYywgc3RydG9kLmMsIHZzcHJpbnRmLmM6ICBDaGFuZ2UgZnJvbSB1c2luZyBMR1BMCisJdG8gbGliaW8tc3R5bGUgY29weXJpZ2h0LgorCSogZ2V0cGFnZXNpemUuYzogIFJlbW92ZSBGU0YgY29weXJpZ2h0LgorCitTYXQgTWF5IDIwIDEyOjMwOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCUFkZGVkIGltcHJvdmVkIFZNUyBzdXBwb3J0IGZyb20gUGF0IFJhbmtpbjoKKworCUZyaSBNYXIgMTcgMTg6NDA6MzYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCisKKwkqIHZtc2J1aWxkLmNvbTogIG5ldyBmaWxlLgorCisJKiBnZXRwYWdlc2l6ZS5jIChnZXRwYWdlc2l6ZSk6ICBpbXBsZW1lbnQgZm9yIFZNUzsKKwkqIHN0cmVycm9yLmMgKHN0cmVycm9yLCBzdHJlcnJubywgc3RydG9lcnJubyk6ICBhZGQgcnVkaW1lbnRhcnkKKwlzdXBwb3J0IGZvciBFVk1TRVJSLgorCitUaHUgTWF5IDE4IDE3OjAxOjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KKworCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCisKKwkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X2FybV9leHQpOiBEZWZpbmUuCisKK1R1ZSBNYXkgMTYgMTM6MzA6NTkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGJhc2VuYW1lLmMsIGJjbXAuYywgZ2V0Y3dkLmMsIGluc3F1ZS5jLCByZW5hbWUuYywgc2lnc2V0bWFzay5jLAorCXN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgUmVtb3ZlIEZTRiBjb3B5cmlnaHQuCisJKiBzaWdzZXRtYXNrLmM6ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLSBzZWVtcyB0byBiZSBuZWVkZWQgYnkgSVNDLgorCitNb24gTWF5IDE1IDE5OjUzOjE3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBiY29weS5jLCBiemVyby5jLCBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbXNldC5jLCBzdHJjaHIuYywKKwlzdHJyY2hyLmMsIHN0cnN0ci5jLCB2Zm9yay5jOiAgUmVtb3ZlIEZTRiBDb3B5cmlnaHQsIGJlY2F1c2UgdGhpcworCW1pZ2h0IGNvbnRhbWluYXRlIGxpYnN0ZGMrKyB3aXRoIHRoZSBMR1BMLiAgKE9LJ2QgYnkgUk1TIDExIE9jdCA5NC4pCisJKiBzdHJjaHIuYywgc3RycmNoci5jOiAgQWRkIGNhc3QgdG8gc3VwcHJlc3MgY29uc3Qgd2FybmluZy4KKworVGh1IE1heSAgNCAxNDozNjo0MiAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogY3BsdXMtZGVtLmM6IFVzZSBjb25zdCBpbnN0ZWFkIG9mIENPTlNULiAgRG9uJ3QgaW5jbHVkZQorICAgICAgICBhbnNpZGVjbC5oIGRpcmVjdGx5LgorCitXZWQgQXByIDE5IDAxOjMwOjI3IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBjcGx1cy1kZW0uYzogRG9uJ3QgaW5jbHVkZSBsaWJpYmVydHkuaC4gIERvIGRlY2xhcmUgeG1hbGxvYyBhbmQKKyAgICAgICAgeHJlYWxsb2MuCisJKC1ETUFJTik6IERvbid0IHJlbHkgb24gYW4gZXh0ZXJuYWxseS1kZWZpbmVkIHZlcnNpb24gbnVtYmVyOworICAgICAgICBpbnN0ZWFkLCByZXF1aXJlIHRoZSB2ZXJzaW9uIG51bWJlciB0byBiZSBkZWZpbmVkIGFzIGEKKyAgICAgICAgcHJlcHJvY2Vzc29yIG1hY3JvLiAgSGFuZGxlIHRoZSBSUy82MDAwIGxlYWRpbmcgZG90LiAgRGVmaW5lCisgICAgICAgIHhtYWxsb2MsIHhyZWFsbG9jIGFuZCBmYXRhbC4gIERvbid0IHN0cmlwIGEgbGVhZGluZyB1bmRlcnNjb3JlCisgICAgICAgIGlmIHdlIGNvdWxkbid0IGRlbWFuZ2xlIHRoZSB3b3JkLgorCitUdWUgQXByICA0IDEzOjAzOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCShPbGQgbXB3LmMgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCisJKiBtcHcuYyAod2FybmluZ190aHJlc2hvbGQpOiBEZWZhdWx0IHRvIC40IHNlYy4KKwkob3ZlcmZsb3dfY291bnQsIGN1cnJlbnRfcHJvZ3Jlc3MpOiBOZXcgZ2xvYmFscy4KKwkod2Fybl9pZl9zcGluX2RlbGF5KTogSW5jbHVkZSBjdXJyZW50IHByb2dyZXNzIHR5cGUsCisJc3VjaCBhcyBwcm9ncmFtIG5hbWUsIGluIG1lc3NhZ2UuCisJKG1wd19zdGFydF9wcm9ncmVzcyk6IFNldCBjdXJyZW50X3Byb2dyZXNzIHZhcmlhYmxlIGZyb20gYXJnLgorCShtcHdfZW5kX3Byb2dyZXNzKTogUmVwb3J0IHNwaW4gZGVsYXlzIGJ5IHBvd2VyLW9mLXR3by1zaXplCisJYnVja2V0cyBpbnN0ZWFkIG9mIGNvbnN0YW50LXNpemUgYnVja2V0cy4KKworCSogbXB3LmM6IENsZWFuIHVwIGZvcm1hdHRpbmcsIHR5cGVzLCByZXR1cm5zLCBldGMuCisJKEVOT1NZUyk6IERlZmluZS4KKwkobXB3X2ZyZWFkLCBtcHdfZndyaXRlKTogRGVmaW5lLgorCShzbGVlcCk6IERlZmluZSBjb3JyZWN0bHkuCisKKwkqIG1wdy5jOiBOZXcgY29kZSB0byBpbXBsZW1lbnQgY3Vyc29yIHNwaW5uaW5nIHN1cHBvcnQuCisJKHVtYXNrKTogTmV3IGZ1bmN0aW9uLgorCShtcHdfZm9wZW4sIG1wd19mc2Vlaywgc3RhdCwgZnN0YXQpOiBDYWxsIFBST0dSRVNTLgorCisJKiBtcHcuYyAobXB3X2Jhc2VuYW1lLCBtcHdfbWl4ZWRfYmFzZW5hbWUpOiBOZXcgZnVuY3Rpb25zLCBmaW5kCisJYmFzZW5hbWVzIGZvciBNUFcgYW5kIE1QVy9Vbml4IGZpbGVuYW1lcy4KKwkobXB3X3NwZWNpYWxfaW5pdCk6IE5ldyBmdW5jdGlvbiwgY2FsbHMgTWFjc2J1ZyBpZiBkZXNpcmVkLgorCisJKiBtcHcuYzogQWRkIEdQTCBub3RpY2UuCisJKG1wd2lmeV9maWxlbmFtZSk6IEFkZCBtb3JlIHRyYW5zZm9ybWF0aW9ucy4KKwkobXB3X2ZvcGVuKTogQ2FsbCBtcHdpZnlfZmlsZW5hbWUgb24gZmlsZSBuYW1lcy4KKwkocmVuYW1lKTogUmVtb3ZlLgorCShjaGRpciwgZ2V0Y3dkKTogQWRkIHNpbXBsZSBkZWZpbml0aW9ucy4KKworCSogbXB3LmM6IFJhbmRvbSBjbGVhbnVwcywgcmVtb3ZlIHVudXNlZCBjb2RlIGJpdHMuCisJQWRkZWQgY29weSBvZiBzdHJlcnJvci5jIGZvciBnY2MncyB1c2UuCisJKHN0YXQsIGZzdGF0LCBfc3RhdCk6IE5ldyB2ZXJzaW9ucyBiYXNlZCBvbiBHdWlkbyB2YW4gUm9zc3VtIGNvZGUuCisKKwkqIG1wdy5jIChtcHdfZnNlZWspOiBNYWtlIGl0IHdvcmsgY29ycmVjdGx5IHdoZW4gZG9pbmcgU0VFS19DVVIuCisKKwkqIG1wdy5jIChzdGF0KTogUmVtb3ZlIGhhY2sgZGVmaW5pdGlvbiwgZ2V0IGZyb20gc3lzL3N0YXQuaC4KKwkoZm9yaywgdmZvcmssIGV0Yyk6IFByaW50IGVycm9yIG1lc3NhZ2VzIGlmIGNhbGxlZC4KKwkoZ2V0cnVzYWdlLCBzYnJrLCBlbnZpcm9uLCBpc2F0dHksIGxpbmssIHV0aW1lLCBta2Rpciwgcm1kaXIsCisJcmVuYW1lLCBjaG93bik6IERlZmluZS4KKworCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KKwkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCisJKiBtcHcuYzogTmV3IGZpbGUsIE1QVyBjb21wYXRpYmlsaXR5IHJvdXRpbmVzLgorCitGcmkgTWFyIDI0IDE0OjEwOjMwIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBiYXNlbmFtZS5jOiBJbmNsdWRlIGNvbmZpZy5oIGJlZm9yZSBjaGVja2luZyBmb3IgTkVFRF9iYXNlbmFtZS4KKworVGh1IE1hciAyMyAxOTowOTo1NCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogZnVuY3Rpb25zLmRlZjogQWRkIERFRkZVTkMgZm9yIGJhc2VuYW1lLgorCisJKiBiYXNlbmFtZS5jOiBPbmx5IGRlZmluZSBiYXNlbmFtZSBpZiBORUVEX2Jhc2VuYW1lLgorCitUaHUgTWFyIDE2IDEzOjM2OjA1IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBjb25maWcudGFibGU6IEZpeCAtLWVuYWJsZS1zaGFyZWQgbG9naWMgZm9yIG5hdGl2ZSBidWlsZHMuCisKK01vbiBNYXIgMTMgMTE6MDU6MTEgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IERlbWFuZ2xlIGJvb2wgbGl0ZXJhbHMgcHJvcGVybHkuCisKK01vbiBNYXIgIDYgMjM6NTc6MjggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc3RydG9sLmMgc3RydG91bC5jOiAgUmVwbGFjZSB0aGVzZSB3aXRoIGxlc3MgYnVnZ3kgdmVyc2lvbnMgZnJvbQorCU5ldEJTRC4gIChzdHJ0b3VsIGluIHBhcnRpY3VsYXIgY291bGRuJ3QgaGFuZGxlIGJhc2UgMTYuKQorCitXZWQgTWFyICAxIDE1OjU5OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlnL210LXZ4d29ya3M1IChIREVGSU5FUyk6IERlZmluZSBOT19TWVNfUEFSQU1fSC4KKworCSogY2xvY2suYzogSWYgTk9fU1lTX1BBUkFNX0ggaXMgZGVmaW5lZCwgZG9uJ3QgaW5jbHVkZQorCTxzeXMvcGFyYW0uaD4uCisJKiBnZXRjd2QuYywgZ2V0cGFnZXNpemUuYywgZ2V0cnVudGltZS5jOiBMaWtld2lzZS4KKworRnJpIEZlYiAxNyAxNTo0MDo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdldHJ1bnRpbWUuYyAoZ2V0X3J1bl90aW1lKTogRG9uJ3QgYXNzdW1lIHRoYXQgQ0xPQ0tTX1BFUl9TRUMgaXMKKwlhIG51bWJlcjsgQU5TSSBhcHBlYXJzIHRvIHBlcm1pdCBhbnkgZXhwcmVzc2lvbiwgaW5jbHVkaW5nIGEKKwlmdW5jdGlvbiBjYWxsLgorCisJKiBjb25maWcudGFibGUgKCotKi12eHdvcmtzNSopOiBVc2UgbXQtdnh3b3JrczUgd2hlbiBjb25maWd1cmluZworCXhpYmVydHkuCisJKiBjb25maWcvbXQtdnh3b3JrczU6IE5ldyBmaWxlLgorCitUaHUgRmViICA5IDE0OjE5OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYmFzZW5hbWUuYyAoYmFzZW5hbWUpOiBDaGFuZ2UgYXJndW1lbnQgdG8gYmUgY29uc3QuCisKK1dlZCBGZWIgIDggMTg6MDY6NTIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBEb24ndCB3b3JyeSBhYm91dCB4bWFsbG9jLgorCitTdW4gSmFuIDE1IDAwOjQwOjM2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogRGVsZXRlIHhob3N0LW1rZnJhZy4KKworVGh1IEphbiAxMiAxNjo1NDoxOCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgc28gaXMgeG1hbGxvYy5vLgorCitXZWQgSmFuIDExIDIyOjM5OjU2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGhleC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMsIENGSUxFUyk6IExpc3QgaXQuCisJKGhleC5vKTogQWRkIGRlcGVuZGVuY2llcy4KKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IEZvciBHTlUgc3R5bGUgY29uc3RydWN0b3IgYW5kCisJZGVzdHJ1Y3RvciBuYW1lcywgdHJ5IGRlbWFuZ2xpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nLgorCitXZWQgRGVjIDI4IDAwOjQ5OjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KKworCSogdmFzcHJpbnRmLmMgKGludF92YXNwcmludGYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSh2YXNwcmludGYpOiBVc2UgaW50X3Zhc3ByaW50Zi4gIFJlbW92ZXMgYXNzdW1wdGlvbiB0aGF0IHZhX2xpc3QKKwlpcyBhc3NpZ25tZW50IGNvbXBhdGlibGUuCisKK1NhdCBOb3YgIDUgMTk6Mjk6MTIgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChMSUJDRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGl0LgorCSguYy5vKTogVXNlIGl0LgorCitUaHUgTm92ICAzIDE5OjA5OjQ3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIGdldG9wdC5jLCBnZXRvcHQxLmM6IERvIGNvbXBpbGUgdGhlc2UgZnVuY3Rpb25zIHVuZGVyIExpbnV4LAorCXNpbmNlIG1hbnkgbmF0aXZlIHZlcnNpb25zIGFyZSBiYXNlZCBvbiBnbGliYyBidXQgYXJlIGJ1Z2d5LgorCitNb24gT2N0IDI0IDE1OjE2OjQ2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiB2YXNwcmludGYuYzogIE1ha2UgJ2Zvcm1hdCcgYXJnIGJlIGNvbnN0LCB0byBhdm9pZCBhIG1pc21hdGNoCisJd2l0aCBwcm90b3R5cGUgaW4gR05VIGxpYmMuICBTdXBwb3J0IHN0ZGFyZy5oIGFzIHdlbGwgYXMgdmFyYXJncy5oLgorCitUdWUgT2N0IDExIDE3OjQ4OjI3IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHZhc3ByaW50Zi5vLgorCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlIHZhc3ByaW50Zi4KKworV2VkIFNlcCAxNCAxNzowNDo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBSZWNvcmQgc2JyayAoMCkgaW4gZmlyc3RfYnJlYWsuCisJKHhtYWxsb2MpOiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgdHJ5IHRvIHJlcG9ydCBob3cgbXVjaAorCW1lbW9yeSB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBwcm9ncmFtIHVwIHRvIHRoaXMgcG9pbnQuCisJKHhyZWFsbG9jKTogTGlrZXdpc2UuCisKK1N1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKworCSogTWFrZWZpbGUuaW4gKEVSUk9SU19DQyk6IE5ldyB2YXJpYWJsZSwgZGVmYXVsdGVkIHRvICQoQ0MpLiAgVXNlIGl0CisJd2hlbiBsaW5raW5nIGR1bW15LgorCSogY29uZmlnLnRhYmxlOiBBZGQgaG9zdCBSSVNDaVggTWFrZWZpbGUgZnJhZy4KKwkqIGNvbmZpZy9taC1yaXNjaXg6IE5ldyBmaWxlLgorCitUaHUgQXVnIDI1IDE3OjI5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBEZWZpbmUuCisJKCQoUlVMRTEpKTogVXNlICQoRkxBR1NfVE9fUEFTUykuCisKK1dlZCBBdWcgMjQgMTc6MDg6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiB2YXNwcmludGYuYzogSW5jbHVkZSA8c3RyaW5nLmg+LgorCSh2YXNwcmludGYpOiBBZGQgY2FzdHMgdG8gdm9pZCBmb3IgdmFfYXJnIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KKwkqIHhhdGV4aXQuYzogRGVjbGFyZSBtYWxsb2MuCisKK0ZyaSBBdWcgMTkgMTU6Mjk6MTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FyZ3MpOiBGaXggYSBidWcgaW4gcHJldmlvdXMgcGF0Y2ggKHRoZQorCW9uZSBiZWxvdykuCisKK1RodSBBdWcgMTggMTQ6Mzc6MTQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlIGFyZ3MpOiBIYW5kbGUgQVJNIHJlcGVhdCBlbmNvZGluZyB3aGVyZQorICAgICAgICB0aGUgdHlwZSBpbmRleCBpcyBncmVhdGVyIHRoYW4gOS4KKworV2VkIEF1ZyAxNyAxNjoxMzo0OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogYWNjZXB0IG9wdGlvbmFsICdfJyBiZXR3ZWVuCisJcXVhbGlmaWVkIG5hbWUuIFRoaXMgaXMgYmFlY2F1c2UgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGVuZCB3aXRoCisJbnVtZXJpYyBhbmQgY2FuIG1peGVkIHVwIHdpdGggdGhlIGxlbmd0aCBvZiBuZXh0IHF1YWxpZmllZCBuYW1lLgorCitXZWQgQXVnICAzIDA1OjUyOjE0IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LXN1bm9zNDogVXNlIG91ciBzdGFuZGFyZCBsb2NhdGlvbiBmb3IgY3Jvc3MtaW5jbHVkZXMKKwlhbmQgY3Jvc3MtbGlicyB3aGVuIHRoZSB0YXJnZXQgaXMgYWxzbyBhICJob3N0IiBlbnZpcm9ubWVudCAoaWUgbm8KKwluZXdsaWI7IGluY2x1ZGVzIGFuZCBzdWNoIGRvbid0IGJlbG9uZyB0byB1cykuICBUaGlzIGlzIHNwZWNpZmljCisJdG8gdGhlIEN5Z251cyBTdXBwb3J0IGVudmlyb25tZW50LgorCitUdWUgQXVnICAyIDE1OjI1OjEyIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IGRlbWFuZ2xlIGFzIHh4eDwnUSc+IG5vdAorCXh4eDxjaD04MT4uCisKK01vbiBBdWcgIDEgMTc6MDI6NDggMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKG1haW4pOiBmbHVzaCBzdGRvdXQgdG8gbWFrZSBwaXBlIHdvcmsuCisKK1NhdCBKdWwgMTYgMTI6NTY6MzIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcudGFibGUgKCotKi1jeHV4NyopOiAgUmVjb2duaXplLgorCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfbTg4MTEwX2V4dCkgW0hBUlJJU19GTE9BVF9GT1JNQVRdOgorCUhhcnJpcy1zcGVjaWZpYyBmbG9hdCBmb3JtYXQuCisJKiBjb25maWcvbWgtY3h1eDc6IE5ldyBmaWxlLgorCitXZWQgSnVuIDI5IDAwOjI2OjE3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YKKwljb25zdW1lX2NvdW50IGRvZXNuJ3QgaW5kZXggYmV5b25kIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKworTW9uIEp1biAyMCAyMzo1NDozNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBIYW5kbGUgdnRhYmxlIG1hbmdsaW5nIG9mIGdjYy0yLjQuNSBhbmQKKwllYXJsaWVyLiBJbXByb3ZlIHRlc3QgZm9yIG5ldyB2dGFibGUgbWFuZ2xpbmcuIENoYW5nZSBvdXRwdXQgYmFjaworCXRvIGB2aXJ0dWFsIHRhYmxlJy4KKworTW9uIEp1biAyMCAxMTozNzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG9ic3RhY2suYzogQWx3YXlzIGNvbXBpbGUgdGhpcyBjb2RlLCBldmVuIGlmIHVzaW5nIHRoZSBHTlUKKwlsaWJyYXJ5LiAgQXZvaWRzIHByb2JsZW1zIHdpdGggcmVsYXRpdmVseSByZWNlbnQgYmluYXJ5CisJaW5jb21wYXRpYmlsaXR5LgorCitUaHUgSnVuIDE2IDE3OjU0OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCisJKHhtYWxsb2MsIHhyZWFsbG9jLCBmcmVlKTogRG9uJ3QgZGVjbGFyZS4KKwkoc3Ryc3RyKTogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXJzLgorCSh4bWFsbG9jLCB4cmVhbGxvYyk6IERvbid0IGRlZmluZS4KKwkobG9uZ19vcHRpb25zKTogQWRkIG5vLXN0cmlwLXVuZGVyc2NvcmVzLgorCShtYWluKTogQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUuICBQYXNzIG4gaW4gc2hvcnQgb3B0aW9ucyB0bworCWdldG9wdF9sb25nLiAgSGFuZGxlIG9wdGlvbiAnbicgdG8gbm90IHN0cmlwIHVuZGVyc2NvcmVzLgorCSh1c2FnZSk6IE1lbnRpb24gLW4gYW5kIC0tbm8tc3RyaXAtdW5kZXJzY29yZXMuCisKK1N1biBKdW4gMTIgMDE6Mzc6MDkgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IFNlcGFyYXRlIGNvbnNlY3V0aXZlID4ncyB3aXRoIGEKKyAgICAgICAgc3BhY2UuCisJKGdudV9zcGVjaWFsKTogRGVtYW5nbGUgdGVtcGxhdGUgYW5kIHF1YWxpZmllZCBuYW1lcyBpbiBhIHZ0YWJsZSBuYW1lLgorCitGcmkgTWF5IDI3IDEyOjI3OjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCisKKwlGcm9tIGdhcy0yLjMgYW5kIGJpbnV0aWxzLTIuNCBuZXQgcmVsZWFzZXM6CisKKwlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKKworCSogbWFrZWZpbGUuZG9zOiBbbmV3XSBNYWtlZmlsZSBmb3IgZG9zL2dvMzIKKwkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IGZpbGVzCisJKiBtc2Rvcy5jOiByZW1vdmUgc29tZSBmdW5jdGlvbnMgbm93IGluIGxpYmMuYQorCitGcmkgTWF5IDIwIDE4OjUzOjMyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiAgUmVjb2duaXplIHRodW5rcywgYXMgd2VsbCBhcworCXRoZSBuZXcgbmFtaW5nIHN0eWxlIGZvciB2dGFibGVzICh3aGVuIC1mdnRhYmxlLXRodW5rcykuCisKK1dlZCBNYXkgMTggMTM6MzQ6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoWFRSQUZMQUdTKTogRG9uJ3QgZGVmaW5lLgorCSguYy5vLCBkdW1teS5vKTogRG9uJ3QgdXNlIFhUUkFGTEFHUy4KKwkoJChSVUxFMSkpOiBEb24ndCBwYXNzIFhUUkFGTEFHUyBkb3duIGluIHJlY3Vyc2l2ZSBjYWxsLgorCitGcmkgTWF5IDEzIDE2OjAyOjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB2YXNwcmludGYuYzogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogQWRkIGl0LgorCitGcmkgTWF5IDEzIDE2OjIwOjI4IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuZF90eXBlKTogR3JvayBib29sLgorCitGcmkgTWF5ICA2IDE0OjQ0OjIxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy50YWJsZTogQWRkIGdvMzIKKwkqIGNvbmZpZy9taC1nbzMyOiBOZXcgdGVtcGxhdGUuCisKK0ZyaSBNYXkgIDYgMTE6MDE6NTkgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnRhYmxlLCBjb25maWcvbXQtc3Vub3M0OiBjb25maWcgZm9yIHdoZW4gc3VuNCBpcyBjcm9zcyB0YXJnZXQuCisKK01vbiBBcHIgMTEgMDA6NTQ6MzMgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQorCisgICAgICAgICogZ2V0b3B0LmMgW25vdCBfX0dOVV9MSUJSQVJZX19dIFtfX0dDQ19fXSBbbm90IF9fU1REQ19fXToKKyAgICAgICAgRGVjbGFyZSBzdHJsZW4gdG8gcmV0dXJuIGludC4gIERvbid0IGluY2x1ZGUgc3RkZGVmLmguCisKK0ZyaSBBcHIgIDEgMDA6Mzg6MTcgMTk5NCAgSmltIFdpbHNvbiAgKHdpbHNvbkBtb2xlLmdudS5haS5taXQuZWR1KQorCisgICAgICAgICogZ2V0b3B0LmM6IERlbGV0ZSB1c2Ugb2YgSU5fR0NDIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAgICBzdGRkZWYuaCBvciBnc3RkZGVmLmggaXMgaW5jbHVkZWQuCisKK1RodSBBcHIgMTQgMTQ6MDA6NTYgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IEZpeCBhIGJ1ZyBpbiB0ZW1wbGF0ZSBmdW5jdGlvbgorCXR5cGUgbnVtYmVyaW5nLgorCitXZWQgQXByIDEzIDE3OjIzOjAzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBGaXggdGVtcGxhdGUgZnVuY3Rpb24gd2l0aCBhcm0KKwlzdHlsZSBhcmd1bWVudCB0eXBlIG51bWJlciwgVG4uCisKK1dlZCBBcHIgMTMgMTc6MTE6MTUgMTk5NCAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogQWRkIG5ld1tdIGFuZCBkZWxldGVbXS4KKworRnJpIEFwciAgOCAxMToyMTo0MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYXJndi5jIChidWlsZGFyZ3YpOiBEb24ndCBwcm9kdWNlIGVtcHR5IGFyZ3VtZW50IGp1c3QgYmVjYXVzZQorCXRoZXJlIGlzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisKK1dlZCBBcHIgIDYgMTE6NDI6MTQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogZml4ICdRJyBxdWFsaWZpZWQgbmFtZSBidWcuCisJSGFuZGxlICdwJyBzYW1lIGFzICdQJy4KKwkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogSGFuZGxlICdwJyBzYW1lIGFzICdQJy4KKworU2F0IE1hciAyNiAxMjowMDoxMyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGZsb2F0Zm9ybWF0LmMgKGdldF9maWVsZCwgcHV0X2ZpZWxkKTogIEZpeCBvZmYgYnkgb25lIGVycm9yIGluCisJbGl0dGxlIGVuZGlhbiBjYXNlLgorCitUaHUgTWFyIDI0IDEwOjQwOjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSk6IFBhc3MgdW5zaWduZWQgY2hhciAqLAorCW5vdCBjaGFyICosIHRvIHB1dF9maWVsZC4KKworRnJpIE1hciAxOCAxMjozNDozMyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogbWVtbW92ZS5jOiAgUmUtd3JvdGU7ICBwbGFjZWQgaW4gcHVibGljIGRvbWFpbi4KKworV2VkIE1hciAxNiAxMDozMzowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IElmIEFSTSBkZW1hbmdsaW5nLCBkb24ndCB0cmVhdAorCV9fUSogYXMgYSBjb25zdHJ1Y3Rvci4KKworTW9uIE1hciAxNCAxMjoyNjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGllZWUtZmxvYXQuYzogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKworTW9uIE1hciAgNyAxMjoyODoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGZsb2F0Zm9ybWF0LmMgKGdldF9maWVsZCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCisJKHB1dF9maWVsZCk6IFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlIGkuCisKK1N1biBGZWIgMjcgMjE6NTA6MTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGZsb2F0Zm9ybWF0LmM6IE5ldyBmaWxlLCBpbnRlbmRlZCB0byByZXBsYWNlIGllZWUtZmxvYXQuYy4KKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCisKK1RodSBGZWIgMjQgMTE6NTE6MTIgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQorCisJKiBnZXRvcHQuYzogUmVtb3ZlICNpZmRlZiBHRVRPUFRfQ09NUEFUIGFuZCAjaWYgMCBjb2RlLgorCSAoX2dldG9wdF9pbml0aWFsaXplKTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIF9nZXRvcHRfaW50ZXJuYWwuCisJIChfZ2V0b3B0X2ludGVybmFsKToKKwkgSWYgbG9uZ19vbmx5IGFuZCB0aGUgQVJHVi1lbGVtZW50IGhhcyB0aGUgZm9ybSAiLWYiLCB3aGVyZSBmIGlzCisJIGEgdmFsaWQgc2hvcnQgb3B0aW9uLCBkb24ndCBjb25zaWRlciBpdCBhbiBhYmJyZXZpYXRlZCBmb3JtIG9mCisJIGEgbG9uZyBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCBmLiAgT3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlIG5vCisJIHdheSB0byBnaXZlIHRoZSAtZiBzaG9ydCBvcHRpb24uCisKK1RodSBGZWIgMTAgMTQ6NDQ6MTYgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQorCisgICAgICAgICogZ2V0b3B0LmMgW25vdCBfX0dOVV9MSUJSQVJZX19dIFtfX0dOVUNfX10gW25vdCBJTl9HQ0NdOgorICAgICAgICBUZXN0IGp1c3QgX19TVERDX18sIG5vdCBlbWFjcy4KKworV2VkIEZlYiAgOSAwMDoxNDowMCAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCisKKyAgICAgICAgKiBnZXRvcHQuYyBbbm90IF9fR05VX0xJQlJBUllfX10gW19fR05VQ19fXSBbbm90IElOX0dDQ10KKyAgICAgICAgW2VtYWNzXSBbbm90IF9fU1REQ19fXTogRG9uJ3QgaW5jbHVkZSBzdGRkZWYuaC4gIERvbid0IGRlY2xhcmUgc3RybGVuLgorCitGcmkgRGVjIDI0IDE5OjQzOjAwIDE5OTMgIE5vYWggRnJpZWRtYW4gIChmcmllZG1hbkBudXRyaW1hdC5nbnUuYWkubWl0LmVkdSkKKworICAgICAgICAqIGdldG9wdC5jIChfTk9fUFJPVE8pOiBEZWZpbmUgYmVmb3JlIGNvbmZpZy5oIGlzIGluY2x1ZGVkLgorCitNb24gU2VwIDIwIDE1OjU5OjAzIDE5OTMgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCisKKyAgICAgICAgKiBnZXRvcHQuYywgZ2V0b3B0MS5jIFtlbWFjcyB8fCBDT05GSUdfQlJPS0VUU106IEluY2x1ZGUKKwk8Y29uZmlnLmg+IG9ubHkgdW5kZXIgdGhlc2UsIGVsc2UgImNvbmZpZy5oIi4KKworVGh1IEF1ZyAxMiAxODoxNjo0OSAxOTkzICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQorCisgICAgICAgICogZ2V0b3B0LmMsIGdldG9wdDEuYyBbSEFWRV9DT05GSUdfSF06IEluY2x1ZGUKKyAgICAgICAgPGNvbmZpZy5oPiBpbnN0ZWFkIG9mICJjb25maWcuaCIuCisKK1N1biBGZWIgMjAgMTc6MTc6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCisKKwkqIGNvbmNhdC5jOiBDaGVjayBBTlNJX1BST1RPVFlQRVMgcmF0aGVyIHRoYW4gX19TVERDX18gdG8gZGVjaWRlCisJd2hldGhlciB0byB1c2UgcHJvdG90eXBlcyBvciBub3QuCisJKiBzdHJlcnJvci5jIChjb25zdCk6IE5ldmVyIHVuZGVmaW5lOyBsZXQgYW5zaWRlY2wuaCBoYW5kbGUgaXQuCisJKiBzdHJzaWduYWwuYyAoY29uc3QpOiBMaWtld2lzZS4KKworVGh1IEZlYiAxNyAxMzoyNzozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHhhdGV4aXQuYyAoX3hleGl0X2NsZWFudXApOiBEZWNsYXJlIGFzIGV4dGVybjsgZG9uJ3QgaW5pdGlhbGl6ZS4KKwlNZXJnaW5nIGNvbW1vbiBhbmQgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG5lZWQgbm90IGJlIHN1cHBvcnRlZCBieQorCUFOU0kgQyBjb21waWxlcnMuCisJKHhhdGV4aXQpOiBJbml0aWFsaXplIF94ZXhpdF9jbGVhbnVwIGlmIG5vdCBhbHJlYWR5IHNldC4KKwkqIHhleGl0LmM6IENvbW1lbnQgZml4LgorCitXZWQgRmViIDE2IDAxOjE1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogeG1hbGxvYy5jOiBEb24ndCBkZWNsYXJlIHhleGl0OyBpdCdzIGRlY2xhcmVkIGluIGxpYmliZXJ0eS5oLgorCSh4cmVhbGxvYyk6IElmIG9sZG1lbSBpcyBOVUxMLCBhbGxvY2F0ZSB3aXRoIG1hbGxvYywgcmF0aGVyIHRoYW4KKwlhc3N1bWluZyB0aGF0IHJlYWxsb2Mgd29ya3MgY29ycmVjdGx5LgorCitUdWUgRmViIDE1IDA5OjI2OjE2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uY2F0LmMsIGllZWUtZmxvYXQuYzogIFJlcGxhY2UgaW5jbHVzaW9uIG9mIDxzdHJpbmcuaD4KKwl3aXRoIGV4cGxpY2l0IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgYXMgcmVjb21tZW5kZWQgYnkgSWFuIFRheWxvci4KKworU2F0IEZlYiAxMiAxMDozMToxMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgUFRSIGFuZCBzaXplX3QgdGhyb3VnaG91dC4KKwkobWFsbG9jLCByZWFsbG9jKTogRGVjbGFyZS4KKworVGh1IEZlYiAxMCAxNzowODoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGFyZ3YuYywgYmFzZW5hbWUuYzogSW5jbHVkZSBhbnNpZGVjbC5oIGFuZCBsaWJpYmVydHkuaC4KKwkqIGNvbmNhdC5jLCBmZG1hdGNoLmMsIGdldHJ1bnRpbWUuYywgc3BhY2VzLmM6IExpa2V3aXNlLgorCSogc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmMsIHhhdGV4aXQuYywgeGV4aXQuYzogTGlrZXdpc2UuCisJKiB4bWFsbG9jLmM6IExpa2V3aXNlLgorCSogY29uY2F0LmM6IERvbid0IGRlY2xhcmUgeG1hbGxvYy4gIElmIF9fU1REQ19fLCB1c2UgPHN0ZGFyZy5oPgorCW1hY3Jvcywgbm90IDx2YXJhcmdzLmg+IG1hY3Jvcy4KKwkqIHNwYWNlcy5jIChzcGFjZXMpOiBNYWtlIHJldHVybiB0eXBlIGNvbnN0LiAgRG9uJ3QgY3Jhc2ggaWYKKwltYWxsb2MgcmV0dXJucyBOVUxMLgorCSogc3RyZXJyb3IuYyAoc3RydWN0IGVycm9yX2luZm8pOiBNYWtlIG5hbWUgYW5kIG1zZyBmaWVsZHMgY29uc3QuCisJKGVycm9yX25hbWVzKTogTWFrZSBjb25zdC4KKwkoc3RyZXJybm8pOiBNYWtlIGNvbnN0LgorCShzdHJ0b2Vycm5vKTogTWFrZSBhcmd1bWVudCBjb25zdC4KKwkqIHN0cnNpZ25hbC5jIChzdHJ1Y3Qgc2lnbmFsX2luZm8pOiBNYWtlIG5hbWUgYW5kIG1zZyBmaWVsZHMKKwljb25zdC4KKwkoc2lnbmFsX25hbWVzLCBzeXNfc2lnbGlzdCk6IE1ha2UgY29uc3QuCisJKHN0cnNpZ25hbCwgc3Ryc2lnbm8pOiBNYWtlIGNvbnN0LgorCShzdHJ0b3NpZ25vKTogTWFrZSBhcmd1bWVudCBjb25zdC4KKwkqIHhhdGV4aXQuYzogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMuCisJKiB4bWFsbG9jLmMgKG5hbWUpOiBNYWtlIGNvbnN0LgorCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBNYWtlIGFyZ3VtZW50IGNvbnN0LgorCSogTWFrZWZpbGUuaW4gKElOQ0RJUik6IERlZmluZS4KKwkoLmMubyk6IFVzZSAkKElOQ0RJUikuCisJKGR1bW15Lm8pOiBMaWtld2lzZS4KKwkoYXJndi5vLCBiYXNlbmFtZS5vKTogTmV3IHRhcmdldHM7IGRlcGVuZCBvbiBsaWJpYmVydHkuaC4KKwkoY29uY2F0Lm8sIGZkbWF0Y2gubywgZ2V0cnVudGltZS5vLCBzcGFjZXMubyk6IExpa2V3aXNlLgorCShzdHJlcnJvci5vLCBzdHJzaWduYWwubywgeGF0ZXhpdC5vLCB4ZXhpdC5vKTogTGlrZXdpc2UuCisJKHhtYWxsb2Mubyk6IExpa2V3aXNlLgorCShjcGx1cy1kZW0ubyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBkZW1hbmdsZS5oLgorCShnZXRvcHQubywgZ2V0b3B0MS5vKTogTmV3IHRhcmdldHM7IGRlcGVuZCBvbiBnZXRvcHQuaC4KKwkoaWVlZS1mbG9hdC5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIGllZWUtZmxvYXQuaC4KKwkob2JzdGFjay5vKTogTmV3IHRhcmdldDsgZGVwZW5kIG9uIG9ic3RhY2suaC4KKworVHVlIEZlYiAgOCAwNToyOTowOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwlIYW5kbGUgb2JzdGFja19jaHVua19hbGxvYyByZXR1cm5pbmcgTlVMTC4gIFRoaXMgYWxsb3dzCisJb2JzdGFja3MgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMsIHdpdGhvdXQgZm9yY2luZyB0aGVtCisJdG8gY2FsbCBleGl0IG9yIGxvbmdqbXAuCisJKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xLCBfb2JzdGFja19uZXdjaHVuayk6CisJSWYgQ0FMTF9DSFVOS0ZVTiByZXR1cm5zIE5VTEwsIHNldCBhbGxvY19mYWlsZWQsIGVsc2UgY2xlYXIgaXQuCisJKF9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xKTogUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgMCBpZiBub3QuCisKK1R1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25jYXQuYywgaWVlZS1mbG9hdC5jOiAgSW5jbHVkZSA8c3RyaW5nLmg+LgorCitTdW4gRmViICA2IDIxOjI4OjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogeG1hbGxvYy5jICh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKHhtYWxsb2MsIHhyZWFsbG9jKTogSW5jbHVkZSB0aGUgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgc2V0LgorCisJKiBSZXBsYWNlIGF0ZXhpdC5jIHdpdGggeGF0ZXhpdC5jLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyksIGZ1bmN0aW9ucy5kZWY6IENoYW5nZSByZWZlcmVuY2VzLgorCitTYXQgRmViICA1IDE0OjAyOjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogZ2V0cnVudGltZS5jIChnZXRfcnVuX3RpbWUpOiBVc2UgZ2V0cnVzYWdlIG9yIHRpbWVzIGlmCisJSEFWRV9HRVRSVVNBR0Ugb3IgSEFWRV9USU1FUyBhcmUgZGVmaW5lZC4KKworRnJpIEZlYiAgNCAxNTo0OTozOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGF0ZXhpdC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChDRklMRVMpLCBmdW5jdGlvbnMuZGVmOiBBZGQgaXQuCisJKiB4ZXhpdC5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChDRklMRVMsIFJFUVVJUkVEX09GSUxFUyk6IEFkZCBpdC4KKwkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBDYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4KKwlDaGFuZ2UgcmVxdWVzdCBmb3IgMCBieXRlcyBpbnRvIHJlcXVlc3QgZm9yIDEgYnl0ZS4KKworV2VkIEZlYiAgMiAxMTozNjo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHhtYWxsb2MuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBQcmludCBzaXplIHVzaW5nICVsdSwgYW5kIGNhc3QgdG8KKwl1bnNpZ25lZCBsb25nLCB0byBhdm9pZCB3YXJuaW5ncy4KKworRnJpIEphbiAyOCAxNzo0OTowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBkdW1teS5jOiBEb24ndCBpbmNsdWRlIHRpbWUuaCBldmVyOyBhbHdheXMgZGVmaW5lIGNsb2NrX3QgYXMKKwkidW5zaWduZWQgbG9uZyIuICBVbnRpbCBnY2MvZml4aW5jbHVkZXMgZW5zdXJlcyB0aGF0IGNsb2NrX3QKKwlleGlzdHMsIF9fU1REQ19fIGlzbid0IGEgc3VmZmljaWVudCB0ZXN0LiAgQW5kIGlmIGNsb2NrKCkgZG9lc24ndAorCWV4aXN0LCBjbG9ja190IHByb2JhYmx5IGRvZXNuJ3QgZWl0aGVyLgorCitNb24gSmFuIDI0IDExOjUyOjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY2xvY2suYywgZ2V0cnVudGltZS5jOiBOZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5pbjogQWRkIHRvIGZpbGUgbGlzdHMuCisJKiBmdW5jdGlvbnMuZGVmIChjbG9jayk6IEFkZCB0byBsaXN0LgorCSogZHVtbXkuYyAodGltZS5oKTogQWRkIGlmIF9fU1REQ19fLgorCShjbG9ja190KTogI2RlZmluZSBhcyAidW5zaWduZWQgbG9uZyIgaWYgbm90IF9fU1REQ19fLgorCitUdWUgSmFuIDExIDExOjI3OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogc3RydG9kLmM6IERlY2xhcmUgYXRvZi4gIEZyb20gZWRsZXJAamFuLnVsdHJhLm55dS5lZHUgKEphbgorCUVkbGVyKS4KKworVHVlIERlYyAyOCAxNDoxNzozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChlcnJvcnMpOiBVc2UgQ0ZMQUdTIGFzIHdlbGwgYXMgTERGTEFHUyB3aGVuCisJbGlua2luZy4KKworRnJpIERlYyAxNyAxMjoyNjowNyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBOZXcgZnVuY3Rpb24uICBDb21tb24gY29kZQorCWZvciBBUk0gdGVtcGxhdGUgZGVtYW5nbGluZy4KKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9jbGFzc19uYW1lKTogVXNlIGRlbWFuZ2xlX2FybV9wdC4KKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBMaWtld2lzZS4KKworVHVlIE5vdiAzMCAxNTo0Nzo0OCAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IEFkZCBDT05TVCB0byBwbGVhc2UgZ2NjLgorCitTYXQgTm92IDI3IDExOjA1OjUwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJTWVyZ2UgY2hhbmdlcyBmcm9tIHRvbUBiYXNpbC5pY2NlLnJ1Zy5ubCAoVG9tIFIuSGFnZW1hbikKKwkqIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgQXMgYSBzbWFsbCBzcGFjZSBvcHRpbWl6YXRpb24sIGRvbid0CisJaW5jbHVkZSBtZXNzYWdlcyB3aGVuIHRoZXkgYXJlbid0IGFjdHVhbGx5IHVzZWQuCisKKwlNZXJnZSBjaGFuZ2VzIGZyb20gdGFrZWZpdmUuY28uYXQham9lIChKb3NlZiBMZWhlcmJhdWVyKQorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCwgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSwKKwljcGx1c19kZW1hbmdsZV9vcG5hbWUpOiAgRml4ZXMgZm9yIHN5c3RlbXMgd2hlcmUgY3BsdXNfbWFya2VyCisJaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gJyQnLgorCitGcmkgTm92IDI2IDEzOjUxOjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiB3YWl0cGlkLmM6ICBTaW1wbGUtbWluZGVkIGFwcHJvY2ltYXRpb24gdG8gd2FpdHBpZAorCXVzaW5nIHZhbmlsbGEgd2FpdC4KKwkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgVXBkYXRlIGFjY29yZGluZ2x5LAorCitUaHUgTm92IDE4IDE4OjAxOjE1IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMoZGVtYW5nbGVfdGVtcGxhdGUpOiBmaXggYnVnIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKwl3aXRoIHZhbHVlIG9mIHVzZXIgZGVmaW5lZCB0eXBlLgorCitXZWQgTm92IDE3IDE4OjMwOjIxIDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogYWRkIHRoZSBzdWJqZWN0IG5ldyBmdW5jdGlvbgorCXRvIHN1cHBvcnQgdW5pZmllZCBzZWFyY2ggb2Ygb3BlcmF0b3IgaW4gY2xhc3MuCisKK1dlZCBOb3YgMTAgMDk6NDc6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlnY2MgLVdhbGwgbGludDoKKwkqIHN0cnRvdWwuYyAoc3RydG91bCk6IHVzZSAiKGRpZ2l0ID0gKnMpICE9ICdcMCciIG5vdCBqdXN0CisJImRpZ2l0ID0gKnMiIGFzIGNvbmRpdGlvbiBpbiB3aGlsZSBsb29wLgorCitUdWUgTm92ICA5IDE1OjUyOjIyIDE5OTMgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBwYXNzIFNIRUxMIHRvIHJlY3Vyc2l2ZSBtYWtlCisKK1RodSBOb3YgIDQgMTI6MDk6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIHZmcHJpbnRmLmMsIHZwcmludGYuYywgdnNwcmludGYuYzogIE1ha2UgZm9ybWF0IGFyZworCWJlIChjb25zdCBjaGFyKiksIGZvciBBTlNJIChhbmQgZ2NjIHcvZml4cHJvdG8pIGNvbnNpc3RlbmN5LgorCitUaHUgTm92ICA0IDA4OjI5OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcudGFibGU6IE1ha2UgKi0qLWhpdXgqIHVzZSBtaC1ocHV4LgorCitGcmkgT2N0IDIyIDA3OjUzOjE1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcudGFibGU6IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCisKK1R1ZSBPY3QgMTkgMTc6MTI6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogZW5zdXJlIHRoYXQgb2JqZWN0IGZpbGUgbmFtZXMgYXJlCisJICBub3QgZHVwbGljYXRlZCwgYXMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9iamVjdCBmaWxlIGluCisJICBhIGxpYnJhcnkgY2F1c2VzIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZXMKKworTW9uIE9jdCAxOCAyMTo1OToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RyY2FzZWNtcC5jLCBzdHJuY2FzZWNtcC5jOiBDaGFuZ2UgdV9jaGFyIHRvIHVuc2lnbmVkIGNoYXIuCisKK0ZyaSBPY3QgMTUgMjI6MTc6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBzdHJuY2FzZWNtcC5jOiBuZXcgZmlsZSwgaW1wbGVtZW50cyBzdHJuY2FzZWNtcAorCSogc3RyY2FzZWNtcC5jOiBuZXcgZmlsZSwgaW1wbGVtZW50IHN0cmNhc2VjbXAKKworCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IGxpc3QgdGhlc2UgdHdvIG5ldyBzb3VyY2UgZmlsZXMKKworCSogZnVuY3Rpb25zLmRlZjogYWRkIHN0cmNhc2VjbXAgYW5kIHN0cm5jYXNlY21wIGVudHJpZXMKKworRnJpIE9jdCAxNSAxNDo1MzowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHN0cnRvdWwuYyAoc3RydG91bCksIHN0cnRvbC5jIChzdHJ0b2wpOiBIYW5kbGUgb3ZlcmZsb3cKKwlhY2NvcmRpbmcgdG8gQU5TSSBDLgorCitUaHUgT2N0IDE0IDE2OjM0OjE5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmM6IGFkZCBzdXBwb3J0IG9mIEFSTSBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciwKKwlhbmQgJ0cnIGZvciBwYXNzaW5nIHJlY29yZCBvciB1bmlvbiBpbiBwYXJhbWV0ZXIuCisKK1dlZCBPY3QgMTMgMTM6MzY6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBGaXggY29tbWVudCB0byBjbGFyaWZ5IHRoYXQgc3R1ZmYgaW4gUkVRVUlSRURfT0ZJTEVTCisJc2hvdWxkIG5vdCBiZSBpbiBmdW5jdGlvbnMuZGVmLgorCitXZWQgT2N0IDEzIDEzOjEzOjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZnVuY3Rpb25zLmRlZjogUmVtb3ZlZCB4bWFsbG9jLiAgU3R1ZmYgaW4gUkVRVUlSRURfT0ZJTEVTIHNob3VsZAorCW5vdCBiZSBpbiBmdW5jdGlvbnMuZGVmLgorCitNb24gT2N0ICA0IDE4OjI2OjM5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmM6IGNoYW5nZSBnbG9ibCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHRvIHByb3BlciBuYW1lCisKK1R1ZSBTZXAgMjggMTg6MTE6MDcgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogZml4IGJ1ZyBpbiBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCisKK1R1ZSBTZXAgMjggMTY6MjA6NDkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogc3VwcG9ydCBib3RoIG9sZCBhbmQgbmV3IF92dCQuLi4gdnRibCBtYW5nbGVkIG5hbWVzCisKK0ZyaSBTZXAgMjQgMTk6MDc6MTYgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jOiBGaXggZGVtYW5nbGVfdGVtcGxhdGUgcHJvdG90eXBlCisKK0ZyaSBTZXAgMjQgMTc6MzI6NTUgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogZml4IHRlbXBsYXRlIGRlbWFuZ2xpbmcKKwkqIGNwbHVzLWRlbS5jOiBmaXggY29uc3QgdHlwZSBkZW1hbmdsaW5nCisJKiBjcGx1cy1kZW0uYzogZml4IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IsIHZpcnR1YWwgdGFibGUsCisJcXVhbGlmaWVyLCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBkZW1hbmdsaW5nCisKK1dlZCBTZXAgIDEgMjM6MTM6MTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0cnNpZ25hbC5jLCBzdHJlcnJvci5jOiBVc2UgZnVsbHktYnJhY2tldGVkIGluaXRpYWxpemVyIHRvCisJa2VlcCBnY2MgLVdhbGwgaGFwcHkuCisKK0ZyaSBBdWcgMjcgMTA6MzA6MDkgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogQWRkIENPTlNUUyB0byBtYWtlIGdjYyBoYXBweSB3aXRoIGxhc3QKKwlwYXRjaC4KKworRnJpIEF1ZyAyNyAxMToyNDo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCVBhdGNoIGZyb20gUGF1bCBGbGluZGVyczoKKwkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogRGVhbCB3aXRoIGFycmF5cy4KKworVHVlIEF1ZyAyNCAxNDoyMzo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZDogRGVhbCB3aXRoIEdOVSBmb3JtYXQgZm9yIG1vcmUKKwl0aGFuIDkgY2xhc3Nlcy4KKworV2VkIEF1ZyAxOCAxOTo1MDoyOSAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGR1bW15Lm8pOiBSZWRpcmVjdCB0byAvZGV2L251bGwgdG8gYXZvaWQgInZhcmlhYmxlCisJbm90IGluaXRpYWxpemVkIiB3YXJuaW5ncyB1bmRlciBIUC9VWAorCitTdW4gQXVnIDE1IDIwOjQyOjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdHJlcnJvci5jOiBNb3ZlIGluY2x1ZGUgb2Ygc3RkaW8uaCBhZnRlciBzeXNfZXJybGlzdCAjZGVmaW5lLgorCUFsc28gcmVtb3ZlIE5VTEwgZGVmaW5pdGlvbiAoc3RkaW8uaCBhbHdheXMgZGVmaW5lcyBOVUxMLCBzbyBpdAorCW5ldmVyIGRpZCBhbnl0aGluZyBidXQgY2x1dHRlciB1cCB0aGUgY29kZSkuCisKK1NhdCBBdWcgMTQgMTQ6MjE6NDkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogaGFuZGxlIHhtYWxsb2MuYworCisJKiB4bWFsbG9jLmM6IHByb3ZpZGUgeG1hbGxvYyBhbmQgeHJlYWxsb2MgZnVuY3Rpb25zCisKK1RodSBBdWcgMTIgMTc6Mzg6NTcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogRml4IGEgY29tbWVudC4KKworU2F0IEF1ZyAgNyAxMzo1NjozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGdldG9wdDEuYzogRGVjbGFyZSBjb25zdCB0aGUgd2F5IGdldG9wdC5jIGRvZXMuCisKK0ZyaSBBdWcgIDYgMTc6MDM6MTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmMsIGFsbG9jYS5jOiBVcGRhdGUgZnJvbSBGU0YuCisJKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbiwgd2hpY2gKKwlkb2Vzbid0IHVzZSBhbGxvY2EuCisKK1R1ZSBKdWwgMjcgMTQ6MDM6NTcgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBBZGQgdGhlIHRhcmdldCB3aXRoIGEgbWVzc2FnZSBzYXlpbmcKKwl3aGVyZSBkZW1hbmdsZSB3ZW50LgorCitNb24gSnVsIDI2IDE1OjQ5OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9ic29sZXRlIGBkZW1hbmdsZScgdGFyZ2V0LgorCitUaHUgSnVsIDIyIDA4OjMxOjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoYXJtX3NwZWNpYWwpOiAgQXBwbHkgcGF0Y2ggZnJvbSBhcmdAbHVjaWQuY29tIHRvCisJYXZvaWQgaW5maW5pdGUgbG9vcCBvbiB2dGJsIHN5bWJvbHMgd2l0aCBkaXNhbWJpZ3VhdGluZyAianVuayIKKwl0YWNrZWQgb24gdGhlIGVuZC4KKworTW9uIEp1bCAxOSAxNDoxMDozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIHN0cnNpZ25hbC5jOiB3b3JrIGFyb3VuZCBzb21lIHN5c3RlbXMgbG9zaW5nIGRlZmluaXRpb25zIG9mCisJc3lzX3NpZ2xpc3QKKworCSogY29uZmlnL21oLWx5bnhvczogdGhpcyBzeXN0ZW0gaGFzIGEgbG9zaW5nIGRlZmluaXRpb24gb2YKKwlzeXNfc2lnbGlzdAorCisJKiBjb25maWcudGFibGU6IHVzZSBtaC1seW54b3MgZm9yICotKi1seW54b3MKKworTW9uIEp1bCAxOSAxNzowODo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy50YWJsZTogQWRkIHN1cHBvcnQgZm9yIEhQUEEgQlNEIGhvc3RzLgorCisJKiBjb25maWcvbWgtaHBic2Q6IE5ldyBmaWxlLgorCitNb24gSnVsIDEyIDE4OjAwOjQwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVEFHUyk6IG1ha2Ugd29yayB3aGVuIHNyY2RpciAhPSBvYmpkaXIuCisKK1N1biBKdW4gMjcgMTU6MzU6MzEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAobWFpbik6IEFkZCBsb25nIG9wdGlvbnMsIGluY2x1ZGluZyAtLWhlbHAgYW5kCisJLS12ZXJzaW9uLgorCSh1c2FnZSk6IE5ldyBmdW5jdGlvbiBmcm9tIGNvZGUgaW4gbWFpbi4KKworVHVlIEp1biAyMiAxMTozNzozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnRhYmxlOiAgTmV3IHNoZWxsIHNjaXB0LCBzb3VyY2VkIGJ5IGJvdGggLi9jb25maWd1cmUsaW4KKwlhbmQgLi4veGliZXJ0eS9jb25maWd1cmUuaW4sIHRvIGF2b2lkIG1haW50YWluYW5jZSBsb3NzYWdlcy4KKwkqIGNvbmZpZ3VyZS5pbiBhbmQgLi4veGliZXJ0eS9jb25maWd1cmUuaW46ICBVc2UgY29uZmlnLnRhYmxlLgorCisJKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBtaC1haXggZm9yIEFJWCAzLjIsIG9ubHkgZm9yIDMuMS4KKwkqIGNvbmZpZ3VyZS5pbjogTWFwICotKi1pcml4KiAoZXhjZXB0IGlyaXg0KSB0byBtaC1zeXN2LgorCSogLi4veGliZXJ0eS9jb25maWd1cmUuaW46ICBVcGRhdGUgZnJvbSAuL2NvbmZpZ3VyZS5pbi4KKworVHVlIEp1biAxNSAxNzowNTozMSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKKworV2VkIE1heSAyNiAxMjo1OTowOSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNwbHVzLWRlbS5jICh4cmVhbGxvYyk6ICBNYXRjaCBkZWZpbml0aW9uIHdpdGggcHJvdG90eXBlLgorCitUdWUgTWF5IDI1IDE0OjI3OjUxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6ICBEZW1hbmdsZSBjZnJvbnQKKwlsb2NhbCB2YXJpYWJsZXMgYXMgYW4gZXh0ZW5zaW9uIHRvIEFSTSBkZW1hbmdsaW5nLgorCitGcmkgTWF5IDIxIDA5OjUzOjU3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpZWVlLWZsb2F0LmM6IERvbid0IHJlcXVpcmUgcG9pbnRlcnMgdG8gZG91YmxlIHRvIGJlIGFsaWduZWQuCisKK1R1ZSBNYXkgMTggMTc6MTI6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKyAgICAgICAgKG1lcmdlIGNoYW5nZXMgZnJvbSBkbG9uZ0Bjc2UudWNzYy5lZHUpCisJKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6ICBTaW1wbGlmeS4KKwkqIGNwbHVzLWRlbS5jIChhcm1fcHQsIGRlbWFuZ2xlX2NsYXNzX25hbWUpOiAgTmV3IGZ1bmN0aW9ucy4KKwkqIGNwbHVzLWRlbS5jICh2YXJpb3VzKTogIENhbGxzIHRvIGFybV9wdCwgZGVtYW5nbGVfY2xhc3NfbmFtZS4KKworCSogY3BsdXMtZGVtLmMgKHhtYWxsb2MsIHhyZWFsbG9jLCBzdHJzdHIpOiAgTWFrZSBleHRlcm4gZGVjbHMgaW50bworCWZ1bGwgcHJvdG90eXBlcy4KKwkqIGNwbHVzLWRlbS5jIChmcmVlKTogIEFkZCBwcm90b3R5cGUuCisJKiBjcGx1cy1kZW0uYyAob3B0YWJsZSk6ICBGdWxseSBicmFja2V0aXplIGluaXRpYWxpemVyLgorCitGcmkgTWF5IDE0IDE3OjEzOjA1IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogIFdoZXRoZXIgaW5pdGlhbCB1bmRlcnNjb3JlcyBhcmUgc3RyaXBwZWQKKwlkZXBlbmRzIG9uIHRoZSBleHRlcm5hbCB2YXJpYWJsZSBwcmVwZW5kc191bmRlcnNjb3JlCisJKHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGUgYmludXRpbHMgTWFrZWZpbGUpLgorCitGcmkgTWF5IDE0IDA3OjMyOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAobW9wX3VwLCBhcm1fc3BlY2lhbCk6IFJlbW92ZSBzb21lIHVudXNlZCB2YXJpYWJsZXMuCisKK1R1ZSBNYXkgIDQgMjA6MzE6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChjb25zdW1lX2NvdW50KTogIFJldHVybiB6ZXJvIGlmIGFyZyBkb2VzIG5vdAorCXN0YXJ0IHdpdGggZGlnaXQsIGFuZCBkb24ndCBjb25zdW1lIGFueSBpbnB1dC4KKworVHVlIE1heSAgNCAwODoxMDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogVXNlICR7c3JjZGlyfSBub3QgJF4uCisKKwkqIHN0cnRvZC5jOiBOZXcgZmlsZSwgbmVlZGVkIGF0IGxlYXN0IGZvciBCU0QgNC4zLgorCitTdW4gTWF5ICAyIDExOjMwOjQyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBzdHJzaWduYWwuYyAoc3lzX3NpZ2xpc3QpOiAgRm9yIEFOU0kgY29tcGlsYXRpb25zLCB0eXBlIGlzCisJImNvbnN0IGNoYXIgKmNvbnN0Ii4gIEFsc28gcmVtb3ZlIGNvbmRpdGlvbmFsaXphdGlvbiBvbiBfX1NURENfXworCXNpbmNlIGNvbnN0IGlzIGRlZmluZWQgYXdheSBmb3Igbm9uLUFOU0kuCisKK1dlZCBBcHIgMjggMTk6Mjk6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplICotKi1ocHV4LgorCSogY29uZmlnL21oLWhwdXg6IE5ldyBmaWxlLgorCitUdWUgQXByIDI3IDE1OjIyOjE5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiB0bXBuYW0uYzogIEFkZGVkIEFOU0kgdG1wbmFtKCkgZnVuY3Rpb24uCisJKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseS4KKworVHVlIEFwciAyNyAxMzozODozOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogR2V0IHRoZSBkZW1hbmdsaW5nIG9mCisJc3RvcF9fMUEgcmlnaHQuCisKK0ZyaSBBcHIgMTYgMjM6NDg6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGNhbHZpbikKKworCSogY3BsdXMtZGVtLmM6IERlY2xhcmUgc3Ryc3RyIHJldHVybiB0eXBlLgorCitGcmkgTWFyIDI2IDEyOjAxOjI2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzdHJzaWduYWwuYzogQWRkIHNvbWUgQUlYIHNpZ25hbHMuCisKK1RodSBNYXIgMjUgMTU6MTc6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTUFLRU9WRVJSSURFUyk6IERlZmluZSB0byBiZSBlbXB0eS4KKworV2VkIE1hciAyNCAwMTo1OToyNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgJiBkdmkgdGFyZ2V0cworCitUaHUgTWFyIDE4IDE0OjA1OjQ0IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogaWVlZS1mbG9hdC5jOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiIChzaW5jZSBpdCBpcworCW5lZWRlZCBieSAuLi9vcGNvZGUvbTY4ay1kaXMuYykuCisKK1R1ZSBNYXIgIDIgMTc6NDc6MzEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jOiAgUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBjZnJvbnQgd2l0aCBBUk0uCisKK0ZyaSBGZWIgMjYgMDA6MTc6MDcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogIEZpeCBtYWluIHByb2dyYW0gKHdoZW4gY29tcGlsZWQgd2l0aCAtRE1BSU4pCisJdG8gYmUgbW9yZSB1c2VmdWwgYXMgYSBmaWx0ZXIuCisKK1NhdCBGZWIgMjAgMjE6NDE6MzkgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbF90b19saWJkaXIsIGluc3RhbGxfdG9fdG9vbGRpcik6IEdvIGludG8gdGhlCisJZGVzdGluYXRpb24gZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nICQoUkFOTElCKSwgaW4gY2FzZSB0aGF0CisJcHJvZ3JhbSB0cmllcyB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBwYXJ0IG9mCisJaXRzIHdvcmsuCisKK1RodSBGZWIgMTggMjM6MDA6MTkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHN0cnNpZ25hbC5jIChzeXNfc2lnbGlzdCk6ICBSZW1vdmUgeWV0IGFub3RoZXIgKiVeJiUmJCMgImNvbnN0IgorCWJlY2F1c2UgQlNEIDQuNCBsYWNrcyBvbmUuICBJc24ndCB0aGlzIGZ1bj8KKworVGh1IEZlYiAxOCAxMToyNDoyNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBTZXQgZnVuY19kb25lIGFmdGVyCisJZGVtYW5nbGluZyBhIHRlbXBsYXRlLgorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogIEZpeCBzZXZlcmFsIHNtYWxsIGJ1Z3MKKwlpbiBkZW1hbmdsaW5nIEdOVSBzdHlsZSB0ZW1wbGF0ZXMuCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogIEZpeCBmb3IgdGVtcGxhdGVzIGluIEdOVQorCXN0eWxlIGNvbnN0cnVjdG9ycy4KKwkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBGaXggZm9yIHRlbXBsYXRlcyBpbiBHTlUgc3R5bGUKKwlzdGF0aWMgZGF0YSBtZW1iZXJzLgorCitUdWUgRmViIDE2IDE3OjI4OjM1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogIE1vZGlmeSB0byBpbmNsdWRlIHR5cGUKKwltb2RpZmllcnMgbGlrZSBzdGF0aWMgYW5kIGNvbnN0IGluIHJlbWVtYmVyZWQgdHlwZXMuCisKK1RodSBGZWIgMTEgMjI6MjA6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZWRfcXVhbGlmaWVkKTogIEFkZCBuZXcgcGFyYW1ldGVyIHRoYXQgdGVsbHMKKwl3aGV0aGVyIHRvIHByZXBlbmQgb3IgYXBwZW5kIHRoZSBxdWFsaWZpZXJzLgorCSogY3BsdXMtZGVtLmMgKHN0cmluZ19wcmVwZW5kcyk6ICBVc2VkIG5vdywgcmVtb3ZlICNpZiAwLgorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBDYWxsIGRlbWFuZ2xlX3F1YWxpZmllZAorCXdpdGggcHJlcGVuZGluZy4KKwkqIGNwbHVzX2RlbS5jIChnbnVfc3BlY2lhbCk6ICBSZWNvZ25pemUgc3RhdGljIGRhdGEgbWVtYmVycyB0aGF0CisJdXNlIHF1YWxpZmllZCBuYW1lcy4KKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQpOiAgQWNjdW11bGF0ZSBxdWFsaWZpZXJzIGluIGEKKwl0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGUgcHJlcGVuZCBvciBhcHBlbmQgdGhlbSB0byB0aGUgcmVzdWx0LAorCWFzIHNwZWNpZmllZCBieSB0aGUgbmV3ICJhcHBlbmQiIGZsYWcuCisJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6ICBDYWxsIGRlbWFuZ2xlZF9xdWFsaWZpZWQgd2l0aAorCWFwcGVuZGluZy4KKworTW9uIERlYyAyOCAxMDo0NzoxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogc3Ryc2lnbmFsLmMgKHNpZ25hbF90YWJsZSk6IE5vdyBjb25zdC4KKwkoaW5pdF9zaWduYWxfdGFibGVzKTogVmFyaWFibGUgZWlwIG5vdyBwb2ludHMgdG8gY29uc3QuCisKKwkqIHN0cmVycm9yLmMgKGVycm9yX3RhYmxlKTogTm93IGNvbnN0LgorCShpbml0X2Vycm9yX3RhYmxlcyk6IFZhcmlhYmxlIGVpcCBub3cgcG9pbnRzIHRvIGNvbnN0LgorCitUdWUgRGVjIDE1IDE1OjM2OjUwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBtZW1jaHIuYyAobWVtY2hyKTogIE5ldyAoQU5TSSBzdGFuZGFyZCkgZnVuY3Rpb24uCisJKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogIEFkZGVkIG1lbWNoci4KKwkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6IFVzZSByYyBpbnN0YWQgb2Ygbm9uLXN0YW5kYXJkIGNxLgorCitXZWQgRGVjICAyIDIyOjQ5OjEwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0LmM6IHJlbW92ZSB1c2Ugb2YgVVNHIGFyb3VuZCA8YWxsb2NhLmg+LCB3aGljaCBuZXZlciBtZWFudAorCWFueXRoaW5nIGFueXdheQorCisJKiBjb25maWcvbWgte2FpeCxhcG9sbG82OCxuY3IzMDAwLHN5c3Ysc3lzdjR9OiByZW1vdmVkIGRlZmluaXRpb25zCisJb2YgVVNHIGFuZCBVU0dyNAorCitUaHUgTm92IDE5IDAzOjA5OjMzIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IFJlY29nbml6ZSBgdycsIGEgd2lkZSBjaGFyYWN0ZXI7CisJaXQncyBub3cgYSB0eXBlIGFjY29yZGluZyB0byB0aGUgQU5TSSBYM0oxNiB3b3JraW5nIHBhcGVyOyBvdXRwdXQKKwkid2NoYXJfdCIgZm9yIGl0LgorCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEFjY2VwdCBgdycgYXMgYW4gaW50ZWdyYWwgdHlwZS4KKwkoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2UgYGNoYXIgKicsIG5vdCBgUFRSJy4gIENhc3QgY2FsbHMgdG8gdGhlaXIKKwljb3VudGVycGFydHMgbWFsbG9jIGFuZCByZWFsbG9jIHRvIGBjaGFyIConLgorCShtYWluKTogRXhpdCB3aXRoIGEgMCBzdGF0dXMuCisJKiBNYWtlZmlsZS5pbiAoZGVtYW5nbGUpOiBEb24ndCBleHBlY3QgdGhlIHVzZXIgdG8gZGVmaW5lCisJREVNQU5HTEUsIGluc3RlYWQgZm9yY2UgdG8gYmUgY3BsdXMtZGVtLmMuICBMb29rIGluICQoc3JjZGlyKS8uLi9pbmNsdWRlCisJZm9yIGRlbWFuZ2xlLmguICBQYXNzIGl0IGFueSBIREVGSU5FUyBvciBYVFJBRkxBR1MuCisKK1dlZCBOb3YgMTggMTg6NTY6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBBdm9pZCB2ZXJib3NpdHkuCisJKiBjb25maWcvbWgtc3lzdjQ6ICBSZW1vdmUgQVJfRkxBR1Mgb3ZlcnJpZGUsIHVzZSBJTlNUQUxMPWNwLAorCXJlcGxhY2UgVVNHcjQgd2l0aCBIQVZFX1NZU0NPTkYuCisJKiBjb25maWcvbWgtc29sYXJpczogIFJlbW92ZTsgbWgtc3lzdjQgd29ya3Mgbm93LgorCSogZ2V0cGFnZXNpemUuYzogIFJlcGxhY2UgVVNHcjQgd2l0aCBIQVZFX1NZU0NPTkYuCisJKiBjb25maWd1cmUuaW46ICBTaW1wbGlmeSBob3N0IG1hdGNoaW5nIHRhYmxlLCByZW1vdmUgc2VwYXJhdGUKKwlzb2xhcmlzIGNvbmZpZyBmaWxlLgorCitTdW4gTm92IDE1IDA5OjM1OjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zb2xhcmlzMiopOiAgQWRkLCB1c2UgbWgtc3lzdjQuCisKK1R1ZSBOb3YgIDMgMjE6Mjc6MDMgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogQWRkIGRlY2xzLgorCShyZW1lbWJlcl90eXBlKTogRG9uJ3QgY2FzdCB4bWFsbG9jLgorCShzdHJpbmdfbmVlZCk6IExpa2V3aXNlOyBkb24ndCBjYXN0IHhyZWFsbG9jIGVpdGhlci4KKworRnJpIE9jdCAyMyAwODo1MjowMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBmdW5jdGlvbnMuZGVmcywgcmVuYW1lLmM6IGFkZGVkIHNpbXBsZQorCWltcGxlbWVudGF0aW9uIG9mIHJlbmFtZSwgc2luY2Ugc29tZSBiaW51dGlscyBwcm9ncmFtcyB1c2UgaXQuCisKK1RodSBPY3QgMTUgMTU6MTg6MjIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIHN0cnNpZ25hbC5jOiAgQWRkIGFwcHJvcHJpYXRlICdjb25zdCcgdG8gc3lzX3NpZ2xpc3QKKwlleHRlcm4gZGVjbGFyYXRpb24gKGlmIF9fU1REQ19fKS4gIChOZWVkZWQgZm9yIExpbnV4LikKKwkqIHN0cnNpZ25hbC5jIChzdHJzaWduYWwpOiBBZGQgY2FzdCB0byByZW1vdmUgY29uc3QtbmVzcy4KKworRnJpIE9jdCAgOSAwMzoyMjo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKG5lZWRlZC5hd2ssIG5lZWRlZDIuYXdrKTogIFJlbW92ZSBlcnJvbmVvdXMgXCdzCisJYmVmb3JlICIncywgZGlhZ25vc2VkIGJ5IEJTRCA0LjQgYXdrLgorCitUaHUgT2N0ICA4IDE1OjI1OjEyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGNyZWF0ZSBjb25maWcuaCBhbmQgbmVlZGVkLWxpc3QgdGhyb3VnaCAkKENPTkZJR19IKQorCWFuZCAkKE5FRURFRF9MSVNUKSwgdG8gZ2l2ZSBzb21lIGhvb2tzIGZvciB4aWJlcnR5LgorCitUaHUgT2N0ICAxIDIzOjMxOjQyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci10cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKKworV2VkIFNlcCAzMCAxMToyNjo1OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBhcmd2LmMsIGJhc2VuYW1lLmMsIGJjbXAuYywgYmNvcHkuYywgYnplcm8uYywKKwljb25jYXQuYywgY3BsdXMtZGVtLmMsIGZkbWF0Y2guYywgZ2V0Y3dkLmMsIGdldG9wdC5jLCBnZXRvcHQxLmMsCisJZ2V0cGFnZXNpemUuYywgaW5zcXVlLmMsIG1lbWNtcC5jLCBtZW1jcHkuYywgbWVtbW92ZS5jLCBtZW1zZXQuYywKKwlvYnN0YWNrLmMsIHNpZ3NldG1hc2suYywgc3BhY2VzLmMsIHN0cmNoci5jLCBzdHJlcnJvci5jLAorCXN0cnJjaHIuYywgc3Ryc2lnbmFsLmMsIHN0cnN0ci5jLCB2Zm9yay5jLCB2c3ByaW50Zi5jOgorCUNvbnZlcnQgZnJvbSB1c2luZyBHUEwgdG8gTEdQTC4KKworU2F0IFNlcCAyNiAwNDowMTozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVycm9ycyk6ICBMZWF2ZSBkdW1teS5vIGFuZCBkdW1teSBhcm91bmQgc28gdGhhdAorCXdlIGNhbiBzZWUgaG93IHRoZSBuZWVkZWQgbGlzdCB3YXMgZ2VuZXJhdGVkIChpdCdzIHNvbWV0aW1lcyB3cm9uZykuCisJKG1vc3RseWNsZWFuKTogIFJlbW92ZSB0aGVtLgorCitNb24gU2VwIDIxIDE0OjUwOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZ2V0Y3dkLmM6IHN1cHBseSBhIGRlZmF1bHQgaWYgTUFYUEFUSExFTiBpcyBub3QgZGVmaW5lZC4KKworCSogY29uZmlnL21oLWlyaXg0OiBzZXQgRVhUUkFfT0ZJTEVTIHRvIGFsbG9jYS5vLCBmcm9tIFdSUy4KKworV2VkIFNlcCAgOSAxMjo0MTo0OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBVc2UgWFRSQUZMQUdTIHdoZW4gY29tcGlsaW5nLCBzbyB0aGF0IHhpYmVydHkgd29ya3MKKwl3aGVuIGNyb3NzLWNvbXBpbGluZy4KKworVGh1IFNlcCAgMyAxMzoyOTozOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jOiAoZGVtYW5nbGVfcHJlZml4KTogcmVkdWN0aW9uIGluIHN0cmVuZ3RoIG9mIHN0cnN0cgorCSAgYXMgYSB0aW1lIG9wdGltaXphdGlvbi4KKworCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlKTogcmVtb3ZlIHN0cnBicmsgdGVzdC4gIEFwcGVhcnMgdG8KKwkgIGJlIG1vcmUgZXhwZW5zaXZlIHRoYW4gc2ltcGx5IGRlbWFuZ2xpbmcuCisKKwkqIGNwbHVzLWRlbS5jIChjcGx1c19tYXRjaCk6IG5ldyBmdW5jdGlvbi4KKworVHVlIFNlcCAgMSAxNToyNDowNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jOiAgI2luY2x1ZGUgPHN0ZGlvLmg+LCB0byBkZWZpbmUgTlVMTC4KKwlEZWZpbmUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlLgorCitTdW4gQXVnIDMwIDE3OjU4OjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmM6ICBOZXcgZmlsZSwgbW92ZWQgZnJvbSAuLi9nZGIuCisJKiBjcGx1cy1kZW0uYyAoc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyk6ICBOZXcgZXhwb3J0ZWQKKwlmdW5jdGlvbiwgdG8gYXZvaWQgY29tcGlsaW5nIGluIHRhcmdldC1kZXBlbmRlbmN5IGZvciBDUExVU19NQVJLRVIuCisJKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiAgQWxsb3cgZGVtYW5nbGluZyBzdHlsZSBvcHRpb24KKwl0byBiZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIsIGJ1dCB1c2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlCisJY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlIGFzIGEgZGVmYXVsdC4KKwkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGZvciBjcGx1cy1kZW0uYworCitTYXQgQXVnIDI5IDEwOjQ0OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmM6ICBNZXJnZSBpbiBjb21tZW50IGNoYW5nZXMgZnJvbSBGU0YgdmVyc2lvbi4gIE5vdworCW1hdGNoZXMgdGhlIEZTRiB2ZXJzaW9uIGV4YWN0bHkuCisKK0ZyaSBBdWcgMjggMTg6Mzk6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG9ic3RhY2suYyAoQ0FMTF9GUkVFRlVOKTogIENhbid0IHVzZSA/OiB3aXRoIHZvaWQgdmFsdWVzIChhdAorCWxlYXN0IG9uIGxvc2luZyBERUNzdGF0aW9ucyEpOyB1c2UgaWYtdGhlbi1lbHNlIGluc3RlYWQuCisKK1dlZCBBdWcgMTkgMTQ6NDA6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCisKK01vbiBBdWcgMTAgMTc6MzM6NDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisgICAgICAgKiBNYWtlZmlsZS5pbjogY2xlYW4gdXAgZGVmaW5pdGlvbiBvZiBDRklMRVMsIG1vcmUgY29tbWVudHMKKworU2F0IEF1ZyAgOCAyMzoxMDo1OSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0LmMgKG15X2luZGV4KTogIE1ha2UgZmlyc3QgYXJnIGNvbnN0IHRvIG1hdGNoIHN0cmNociwKKwl3aGljaCBpdCBzb21ldGltZXMgaXMgcmVtYXBwZWQgdG8uCisKK1NhdCBBdWcgIDEgMTM6NDg6NTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG9ic3RhY2suYyAoREVGQVVMVF9BTElHTk1FTlQpOiAgVXBkYXRlIHRvIG1hdGNoIEZTRiB2ZXJzaW9uLgorCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbik6ICBJbml0aWFsaXplIHVzZV9leHRyYV9hcmcuCisJKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luXzEpOiAgTmV3LCBmcm9tIEZTRiB2ZXJzaW9uLgorCitNb24gSnVsIDIwIDIxOjA3OjU4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmMgKENBTExfQ0hFQ0tGVU4sIENBTExfRlJFRUZVTik6ICBVc2UgdXNlX2V4dHJhX2FyZyBhbmQKKwlleHRyYV9hcmcuCisJKiBvYnN0YWNrLmMgKF9vYnN0YWNrX2JlZ2luKTogIFJlbW92ZSBhcmVhX2lkIGFuZCBmbGFncyBhcmd1bWVudHMKKwkocHJldmlvdXNseSBhZGRlZCBmb3IgbW1hbGxvYyBzdXBwb3J0LCBpbnRlcmZhY2UgaGFzIGNoYW5nZWQpLgorCUFsc28gY29udmVydCBmbGFncyB1c2FnZSB0byB1c2UgdXNlX2V4dHJhX2FyZyBhbmQgbWF5YmVfZW1wdHlfb2JqZWN0LgorCitGcmkgSnVsIDEwIDAwOjQxOjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBhcmd2LmM6ICBNb3ZlIGV4cGFuZGFyZ3YgaW5saW5lIGFuZCBlbGltaW5hdGUgc3RhdGljIHZhcmlhYmxlcy4KKwlSZXdyaXRlIHRvIGFsd2F5cyBhbGxvY2F0ZSBpbiBwb3dlcnMgb2YgdHdvLiAgRml4IHRvIHJldHVybiBhbgorCWFyZ3Ygd2l0aCBhIHNpbmdsZSBudWxsIHN0cmluZyBhcmcgaWYgcGFzc2VkIGEgbnVsbCBzdHJpbmcuCisKK0ZyaSBKdWwgIDMgMjA6Mjc6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHJhbmRvbS5jLCBzaWdzZXRtYXNrLmMsIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jOiAgUmVtb3ZlCisJIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzCisJaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgorCitNb24gSnVuIDI5IDEwOjU0OjE5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBiY29weS5jLCBzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIExpbnQuCisKK1RodSBKdW4gMjUgMDk6MTg6NDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBnZXRvcHQuYzogbWVyZ2UgY2hhbmdlcyBmcm9tIG1ha2UuCisKK1RodSBKdW4gMjUgMDQ6NDM6MjIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFsbG9jYS5jOiAgSW5jb3Jwb3JhdGUgZml4ZXMgZnJvbSBnZGIvYWxsb2NhLmMuCisJRklYTUU6ICBFdmVudHVhbGx5IG1vdmUgZ2RiJ3MgYWxsb2NhIGNvbmZpZ3VyYXRpb24gZmlsZXMgaGVyZSwKKwlhbmQgcmVtb3ZlIGdkYi9hbGxvY2EuYyBhbmQgaXRzIE1ha2VmaWxlLmluIHN1cHBvcnQuCisKK1R1ZSBKdW4gMjMgMjE6NTY6MzAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR1bW15LmM6ICBEZWZpbmUgTk9USElORyB0byAvKm5vdGhpbmcqLywgY2hhbmdlIHJldHVybiB0eXBlCisJb2YgbWFpbiB0byBpbnQgYW5kIHJldHVybiB6ZXJvLgorCSogZnVuY3Rpb25zLmRlZjogIFN1cHBseSBOT1RISU5HIGFzIHRoZSBmb3VydGggYXJnIHRvIG1hY3JvcworCXRoYXQgZG9uJ3QgaGF2ZSBhbiBleHBsaWNpdCBhcmcsIHRvIHNhdGlzZnkgcGlja3kgcHJlcHJvY2Vzc29ycy4KKworV2VkIEp1biAxNyAxODoxMzo1OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQ2xlYW4gdXAgKmNsZWFuIHJ1bGVzLCBhcyBwZXIgc3RhbmRhcmRzLnRleGkuCisKK1R1ZSBKdW4gMTYgMTY6MTE6NTkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBtZXJnZWQgbGFyZ2VseSBncmF0dWl0b3VzLCBtb3N0bHkKKwkgIHdoaXRlc3BhY2UgZGlmZnMgZnJvbSBvdGhlciBwcmVwIGRpc3RyaWJ1dGlvbnMuCisKK01vbiBKdW4gMTUgMTI6MjU6NDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1uY3IzMDAwIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAorCWl0IGlzIGJyb2tlbiBvbiBuY3IgMzAwMCdzLgorCitNb24gSnVuIDE1IDAxOjAzOjI2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzaWdzZXRtYXNrLmM6ICBSZXdyaXRlLiAgT2xkIG9uZSB3YXMgdmVyeSBjb25mdXNlZCBhYm91dCBpdHMKKwlhcmd1bWVudHMgYW5kIHJlc3VsdC4gIE5ldyBvbmUgY2FuJ3QgZG8gbXVjaCwgYnV0IGF0IGxlYXN0IGtub3dzCisJd2hhdCBpdCBjYW4ndCBkbywgYW5kIGl0J3MgZ29vZCBlbm91Z2ggZm9yIEdEQidzIHVzZS4KKworU3VuIEp1biAxNCAxNToxNzo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBmdW5jdGlvbnMuZGVmOiAgVXNlIHByb3BlciBwcm90b3R5cGUgZm9yIHN0cnRvdWwuCisKK0ZyaSBKdW4gMTIgMTk6MjI6NDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIHJhbmRvbS5jLgorCSogY29uZmlnL21oLSo6ICBVc2UgInRydWUiIHJhdGhlciB0aGFuICJlY2hvID4vZGV2L251bGwiIGZvciByYW5saWIuCisJKiBjb25maWd1cmUuaW46ICB1cGRhdGUgc29sYXJpczIgY29uZmlnLgorCitXZWQgSnVuIDEwIDE2OjMxOjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiByYW5kb20uYzogIEFkZCBmb3IgcmFuZG9tKCkgYW5kIHNyYW5kb20oKS4KKwkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgcmFuZG9tCisKK1R1ZSBKdW4gIDkgMTc6Mjc6MTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy97bWgtbmNyMzAwMCwgbWgtc3lzdjR9OiAgQWRkIGRlZmluaXRpb24gZm9yIElOU1RBTEwKKwl1c2luZyAvdXNyL3VjYi9pbnN0YWxsLgorCitNb24gSnVuICAxIDEzOjIwOjE3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogc3RyZXJyb3IuYzogIEtsdWRnZSB0byBndWFyZCBhZ2FpbnN0IGEgY29uZmxpY3Qgd2l0aAorCXBvc3NpYmxlIGRlY2xhcmF0aW9uIG9mIHN5c19lcnJsaXN0IGluIGVycm5vLmguCisKK1N1biBNYXkgMzEgMTU6MDc6NDcgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtc29sYXJpczogYWRkIHNvbGFyaXMyIGNvbmZpZyBzdXBwb3J0LgorCitGcmkgTWF5IDI5IDE3OjIzOjIzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogc2lnc2V0bWFzay5jOiAgI2lmZGVmIG91dCBzaWdzZXRtYXNrIGlmIFNJR19TRVRNQVNLCisJaXMgbm90IGRlZmluZWQgKHNob3VsZCBiZSBkZWZpbmVkIGluIHNpZ25hbC5oLCBzYXlzIFBvc2l4LikuCisKK01vbiBNYXkgMTggMTc6MzU6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIGdldG9wdC5jOiBtZXJnZWQgY2hhbmdlcyBmcm9tIG1ha2UtMy42Mi4xMS4KKworRnJpIE1heSAgOCAxNDo1MzowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogZ2V0b3B0LmM6IG1lcmdlZCBjaGFuZ2VzIGZyb20gYmlzb24tMS4xOC4KKworVHVlIE1heSAgNSAxMTo1MTo0MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgRG9uJ3QgaGF2ZSAkKEVYVFJBX09GSUxFUykgZGVwZW5kIG9uIGNvbmZpZy5oLAorCXNpbmNlIHRoYXQgaW50cm9kdWNlcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCisJKCQoRVhUUkFfT0ZJTEVTKSBhcmUgdXNlZCB0byBidWlsZCBjb25maWcuaC4pCisKKwkqIHN0cnRvdWwuYzogIEZpeGVzIHRvIGhhbmRsZSBub24tZGVjaW1hbCBiYXNlcyBiZXR0ZXIuCisKK1dlZCBBcHIgMjIgMDk6Mjc6NTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1uY3IzMDAwOiAgUmVwbGFjZSBNSU5VU19HIHdpdGggQ0ZMQUdTLgorCSogTWFrZWZpbGUuZG9zOiAgRmluaXNoIE1JTlVTX0cgZXJhZGljYXRpb24uCisJKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogIEFkZCBzdHJzaWduYWwuYy4KKwkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiAgQWRkIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8KKwkqIE1ha2VmaWxlLmluIChuZWVkZWQtbGlzdCk6ICBTcGxpdCBjcmVhdGlvbiBvZiBlcnJvcnMgZmlsZSB0bworCXNlcGFyYXRlIG1ha2UgdGFyZ2V0LgorCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oLCBuZWVkZWQyLmF3aywgZXJyb3JzKTogIE5ldyB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogIFNwbGl0IHRvIG11bHRpcGxlIGxpbmVzLCBhZGQgbmVlZGVkMi5hd2sKKwlhbmQgY29uZmlnLmguCisJKiBkdW1teS5jIChERUZGVU5DLCBERUZWQVIpOiAgQWRkIGRlZmluZXMgYW5kIHVuZGVmcy4KKwkqIGZ1bmN0aW9ucy5kZWYgKHN0cmVycm9yKTogIFJlbW92ZSBmcm9tIG9wdGlvbmFsIGxpc3QuCisJKiBmdW5jdGlvbnMuZGVmIChzeXNfbmVyciwgc3lzX2Vycmxpc3QsIHN5c19zaWdsaXN0KTogIERFRlZBUidzCisJKiBmdW5jdGlvbnMuZGVmIChzdHJlcnJvciwgcHNpZ25hbCk6ICBERUZGVU5DJ3MKKwkqIHN0cmVycm9yLmM6ICBSZXdyaXRlIGZyb20gc2NyYXRjaCB0byB1c2Ugc3lzX2Vycmxpc3Qgb25seSBpZgorCWF2YWlsYWJsZSwgYWRkIGVycm5vX21heCgpLCBhZGQgc3RyZXJybm8oKSwgYWRkIHN0cnRvZXJybm8oKSwKKwlhZGQgdGVzdCBkcml2ZXIuCisJKiBzdHJzaWduYWwuYzogIE5ldyBmaWxlLCBzaWduYWwgZXF1aXZhbGVudCB0byBzdHJlcnJvci5jLgorCVVzZXMgc3lzX3NpZ2xpc3QgaWYgYXZhaWxhYmxlLCBkZWZpbmVzIHNpZ25vX21heCgpLCBzdHJzaWduYWwoKSwKKwlzdHJzaWdubygpLCBzdHJ0b3NpZ25vKCksIHBzaWduYWwoKSwgYW5kIHRlc3QgZHJpdmVyLgorCitNb24gQXByIDIwIDIwOjQ5OjMyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZG8gbm90IHByaW50IHJlY3Vyc2lvbiBsaW5lLgorCisJKiBNYWtlZmlsZS5pbjogYWxsb3cgQ0ZMQUdTIHRvIGJlIHBhc3NlZCBpbiBmcm9tIGNvbW1hbmQgbGluZS4KKwkgIFJlbW92ZWQgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgorCitNb24gQXByIDIwIDEyOjU3OjQ2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLWFpeDogIE5ldy4gIEVYVFJBX09GSUxFUyBsaXN0cyBjb3B5c2lnbi5vLAorCXNvIGxpYmcrKyB1c2VycyBkb24ndCBoYXZlIHRvIGJlIGluY29udmVuaWVuY2VkIGJ5IGEKKwlsaWJjLmEgYnVnIChsaWJjLmEgbmVlZHMgY29weXNpZ24sIGJ1dCBkb2Vzbid0IGRlZmluZSBpdCEpLgorCSogY29uZmlndXJlLmluOiAgVXNlIGNvbmZpZy9taC1haXguCisJKiBzdHJ0b3VsLmM6ICBIYW5kbGUgJy0nIGFzIHJlcXVpcmVkIGJ5IEFOU0kuCisJQ2xlYW4gdXAgcmFkaXggaGFuZGxpbmcuCisJKiBzdHJzdHIuYzogIEZpeCBidWdneSBhbGdvcml0aG0uCisJKiBNYWtlZmlsZS5pbjogIENoYW5nZSBzbyB0aGF0ICR7RVhUUkFfT0ZJTEVTfSBpcworCWFwcGVuZGVkIHRvIG5lZWRlZC1saXN0ICh3aGljaCBpcyB1c2VkIGJ5IGxpYmcrKykuCisKK0ZyaSBBcHIgMTAgMjI6NTE6NDEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCisJKiBjb25maWcvbWgtbmNyMzAwMDogIE5ldyBjb25maWcgZmlsZS4KKworV2VkIEFwciAgMSAyMzozMTo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYXJndi5jLCBkdW1teS5jOiAgTGludC4KKworVHVlIE1hciAzMSAxODo0Njo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXN5c3Y0OiAgTmV3IGNvbmZpZyBmaWxlLgorCSogY29uZmlndXJlLmluIChob3N0X21ha2VmaWxlX2ZyYWcpOiAgU2V0IHRvIGNvbmZpZy9taC1zeXN2NCBmb3IKKwlob3N0X29zID09IHN5c3Y0LgorCSogZ2V0cGFnZXNpemUuYzogIEZvciBTVlI0LCB1c2Ugc3lzY29uZihfU0NfUEFHRVNJWkUpIHRvIGdldAorCXBhZ2VzaXplLgorCitTdW4gTWFyIDI5IDEyOjI2OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBnZXRvcHQuYzogIExpbnQuCisKK0ZyaSBNYXIgMjcgMDg6MzI6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGZ1bmN0aW9ucy5kZWYgKGFsbG9jYSk6ICBGaXggcmV0dXJuIHR5cGUgYW5kIGFyZ3MgdG8gYXZvaWQKKwl0eXBlIGNsYXNoIHdpdGggZ2NjJ3MgYnVpbHRpbiBhbGxvY2EuCisKK1R1ZSBNYXIgMjQgMjM6MzM6NDIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLWlyaXg0OiBpcml4NCBzdXBwb3J0LgorCisJKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZiwgYWxsb2NhLmM6IGFkZGVkIGFsbG9jYS4KKworVHVlIE1hciAyNCAxNzozNDo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmMgKENBTExfRlJFRUZVTik6ICBNYWtlIGl0IGNvbXBpbGUgb24gREVDc3RhdGlvbnMuCisKK1RodSBNYXIgMTkgMTM6NTc6NDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGFyZ3YuYzogIEZpeCB2YXJpb3VzIGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlCisJY29ycmVjdCBpbiBhbiBBTlNJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgorCitTYXQgTWFyIDE0IDE3OjI4OjE3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmM6ICBDaGFuZ2VzIHRvIHN1cHBvcnQgY2FsbGluZyBtbWFsbG9jIGZ1bmN0aW9ucywKKwl3aGljaCB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgb3ZlciBtYWxsb2MgZnVuY3Rpb25zLgorCitGcmkgTWFyICA2IDIyOjAxOjEwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBhZGRlZCBjaGVjayB0YXJnZXQuCisKK1RodSBGZWIgMjcgMjI6MTk6MzkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGFyZ3YuYzogICNpbmNsdWRlIGFsbG9jYS1jb25mLmggKG5lZWRlZCBieSBBSVgpLgorCitXZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAorCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCisJICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KKworU2F0IEZlYiAyMiAwMTowOToyMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBhcmd2LmM6ICBDaGVjayBpbiBGcmVkJ3MgdmVyc2lvbiB3aGljaCBmaXhlcyBwcm9ibGVtcyB3aXRoCisJYWxsb2NhKCkuCisKK0ZyaSBGZWIgIDcgMjE6NDY6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbWFrZWZpbGUuZG9zOiAgUmVtb3ZlIE5VTCB0byBrZWVwIHBhdGNoIGZyb20gZmFpbGluZy4KKworVGh1IEphbiAzMCAyMjo0ODo0MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBnZXRvcHQuYyAoX2dldG9wdF9pbnRlcm5hbCk6ICBGaXggdXNhZ2Ugb2YgZW51bSBoYXNfYXJnLgorCitNb24gSmFuIDIwIDE4OjUzOjIzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKyAJKiBnZXRvcHQuYywgZ2V0b3B0MS5jLCAuLi9pbmNsdWRlL2dldG9wdC5oOiAgR2V0IGxhdGVzdCB2ZXJzaW9ucy4KKworU2F0IEphbiAxOCAxNjo1MzowMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogYXJndi5jOiAgTmV3IGZpbGUgdG8gYnVpbGQgYW5kIGRlc3Ryb3kgc3RhbmRhcmQgYXJndW1lbnQKKwl2ZWN0b3JzIGZyb20gYSBjb21tYW5kIHN0cmluZy4KKworCSogTWFrZWZpbGUuaW46ICBBZGQgYXJndi5jIGFuZCBhcmd2Lm8gdG8gYXBwcm9wcmlhdGUgbWFjcm9zLgorCitGcmkgRGVjIDIwIDEyOjEyOjU3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgorCisJKiByaW5kZXguYzogIERlY2xhcmUgcmV0dXJuIHR5cGUgb2YgZXh0ZXJuYWxseSB1c2VkIGZ1bmN0aW9uCisJc3RycmNocigpLgorCitUaHUgRGVjIDE5IDE4OjM1OjAzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlbW92ZSAiKioqIiBpbiBub3JtYWwgb3V0cHV0LCBzaW5jZSBNYWtlIHByb2R1Y2VzCisJdGhpcyBvbiBlcnJvcnMsIGFuZCBpdCdzIGNvbnZlbmllbnQgdG8gc2VhcmNoIGZvci4KKworVHVlIERlYyAxNyAyMzoyMTozMCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbWVtY21wLmMsIG1lbWNweS5jLCBtZW1tb3ZlLmMsIG1lbXNldC5jLCBzdHJjaHIuYywgc3RycmNoci5jOgorCU5ldyBBTlNJIGZ1bmN0aW9ucy4gIFRoZSBvbGQgbm9uLUFOU0kgZnVuY3Rpb25zIChzdWNoIGFzIGJjb3B5KQorCXNob3VsZCBiZSBhdm9pZGVkLgorCSogYmNvcHkuYzogIEZpeCB0byBjb3JyZWN0bHkgaGFuZGxlIG92ZXJsYXBwaW5nIHJlZ2lvbnMuCisJKiBpbmRleC5jLCByaW5kZXguYzogIFJlLXdyaXRlIGluIHRlcm1zIG9mIHN0cmNocigpIGFuZCBzdHJyY2hyKCkuCisJKiBmdW5jdGlvbnMuZGVmOiAgQWRkIHRoZSBuZXcgZnVuY3Rpb25zLgorCSogZnVuY3Rpb25zLmRlZjogIEFkZCA0dGggcGFyYW1ldGVyIHRvIERFRiBtYWNybywKKwlhbiBhbnNpZGVjbC5oLXN0eWxlIHByb3RvdHlwZS4KKwkqIGR1bW15LmM6ICBVc2UgZXhwYW5kZWQgREVGIG1hY3JvIHRvIGNyZWF0ZSBhIGR1bW15IGZ1bmN0aW9uCisJY2FsbCwgd2l0aCBjb3JyZWN0IHBhcmFtZXRlciB0eXBlcy4gIChUaGlzIGF2b2lkcyBzb21lCisJY29tcGxhaW50cyBmcm9tIGdjYyBhYm91dCBwcmVkZWZpbmVkIGJ1aWx0aW5zLikKKworCU1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgY29uZmlnL21oLWRlZmF1bHQgaW50byBNYWtlZmlsZS5pbi4KKwlUaGlzIGF2b2lkIGR1cGxpY2F0aW9uLCBhbmQgc2ltcGxpZmllcyB0aGluZ3Mgc2xpZ2h0bHkuCisJKiBNYWtlZmlsZS5pbjogIFR3ZWFrIHNvIHdlIGRvbid0IG5lZWQgY29uZmlnL21oLWRlZmF1bHQuCisJKiBSRUFETUU6ICBVcGRhdGUuCisJKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCBjb25maWcvbWgtZGVmYXVsdC4KKwkqIGNvbmZpZy9taC1kZWZhdWx0OiAgRGVsZXRlZC4KKwkqIGNvbmZpZy9taC1zeXN2OiAgUmVtb3ZlIGxpbmVzIGNvcGllZCBmcm9tIG9sZCBtaC1kZWZhdWx0LgorCitUdWUgRGVjIDE3IDA1OjQ2OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBmZG1hdGNoLmMgKGZkbWF0Y2gpOiAgRG9uJ3QgY29tcGFyZSBzdF9yZGV2LCB3aGljaCBpcyBmb3IKKwknbWtub2QnIGRldmljZSBudW1iZXJzLgorCitNb24gRGVjIDE2IDEyOjI1OjM0IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBmZG1hdGNoLmMsIE1ha2VmaWxlLmluOiAgQWRkIG5ldyBmdW5jdGlvbiB0aGF0IHRha2VzIHR3bworCW9wZW4gZmlsZSBkZXNjcmlwdG9ycyBhbmQgcmV0dXJucyBub256ZXJvIGlmIHRoZXkgcmVmZXIgdG8KKwl0aGUgc2FtZSBmaWxlLCB6ZXJvIG90aGVyd2lzZS4gICh1c2VkIGluIGdkYikKKworV2VkIERlYyAxMSAxNzo0MDozOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKwlGcm9tIERKOgorCSogbXNkb3MuYzogc3R1YiBmdW5jdGlvbnMgZm9yIGRvcy4KKwkqIG1ha2VmaWxlLmRvcywgY29uZmlnZGouYmF0OiBuZXcuCisJKiBnZXRvcHQuYzogRG9uJ3QgaW5jbHVkZSBhbGxvY2EtY29uZi5oIGluIGEgR08zMiB3b3JsZC4KKworCitUdWUgRGVjIDEwIDA0OjE0OjQ5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitGcmkgRGVjICA2IDIzOjI2OjQ1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMgYmVjYXVzZSBic2QgbWFrZQorCSAgY2FuJ3QgY29wZS4gIGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBpbnN0YWxsIHVzaW5nCisJICBJTlNUQUxMX0RBVEEuCisKKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGNvbW1vbnRhcmdldHMgYXMgaXQgaXMgbm8gbG9uZ2VyIGEKKwkgIHJlY29nbml6ZWQgaG9vay4KKworVGh1IERlYyAgNSAyMjo0Njo0NiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKKwkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKKwkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCisKK0ZyaSBOb3YgMjIgMTk6MTU6MjkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgZmluZC1uZWVkZWQuYXdrIGRvZXMgbm90IGZpdCBpbiAxNCBjaGFycy4KKworCSogTWFrZWZpbGUuaW46ICBTdXBwcmVzcyBlcnJvciBjaGVja2luZyB3aGVuIGNvbXBpbGluZyB0aGUgdGVzdAorCXByb2dyYW0sIGJlY2F1c2UgVWx0cml4IG1ha2Uvc2ggYWJvcnRzIHRoZXJlIGR1ZSB0byBhIGJ1Zy4KKworRnJpIE5vdiAyMiAxMjoyMzoxNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBSZS1kaWQgaG93IEVYVFJBX09GSUxFUyBpcyB1c2VkIHRvIGJlIG1vcmUgdXNlZnVsLgorCSogUkVBRE1FOiAgRXhwbGFpbmVkIGhvdyB0aGUgYXV0by1jb25maWd1cmF0aW9uIHdvcmtzLAorCWFuZCBob3cgdG8gYWRkIG5ldyBmaWxlcyBhbmQvb3IgY29uZmlndXJhdGlvbnMuCisKK0ZyaSBOb3YgMjIgMDk6NDU6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHN0cnRvdWwuYzogIEF2b2lkIGRlZmluaW5nIFVMT05HX01BWCBpZiBhbHJlYWR5IGRlZmluZWQ7CisJY2FzdCBhIGNvbnN0IGNoYXIgKiB0byBjaGFyICogZm9yIHBlZGFudHMuCisKKwkqIGdldG9wdC5jOiAgT25seSBkZWZpbmUgImNvbnN0IiBhZnRlciBsb2NhbCBpbmNsdWRlIGZpbGVzIGdldCB0bywKKwlhbmQgb25seSBpZiB0aGV5IGhhdmVuJ3QgZGVmaW5lZCBpdC4KKworVGh1IE5vdiAyMSAxNjo1ODo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZ2V0Y3dkLmMgKHJlbW92ZSBnZXR3ZC5jKTogR05VIGNvZGUgc2hvdWxkIGNhbGwgZ2V0Y3dkKCkuICBXZQorCWVtdWxhdGUgaXQgd2l0aCBnZXR3ZCgpIGlmIGF2YWlsYWJsZS4gIFRoaXMgYXZvaWRzIGNhbGxlcnMgaGF2aW5nCisJdG8gZmluZCBhIE1BWFBBVEhMRU4gb3IgUEFUSF9NQVggdmFsdWUgZnJvbSBzb21ld2hlcmUuCisJKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZjogIGdldHdkLT5nZXRjd2QuCisJKiBjb25maWd1cmUuaW46ICBVc2UgZ2VuZXJpYyBjYXNlIGZvciBldmVyeSBzeXN0ZW0uCisJKiBjb25maWcvbWgte2RlbHRhODgsbWFjaCxyczYwMDAsc3ZyNH06ICBSZW1vdmUuCisJKiBjb25maWcvbWgtc3lzdjogIFVzZSBkZWZhdWx0IGhhbmRsaW5nLCBqdXN0IGFkZCAtRFVTRy4KKworVGh1IE5vdiAxNCAxMDo1ODowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZy9taC1kZWZhdWx0OiBSZS1kbyBtYWtlIG1hZ2ljCisJc28gdGhhdCBmb3IgdGhlIGRlZmF1bHQgKCJhdXRvbWF0aWMiKSBtb2RlIHdlIG9ubHkKKwljb21waWxlIHRoZSBmaWxlcyB3ZSBhY3R1YWxseSBuZWVkLiAgRG8gdGhpcyB1c2luZworCWEgcmVjdXJzaXZlIG1ha2U6ICBUaGUgdG9wLWxldmVsIGdlbmVyYXRlcyB0aGUgbGlzdAorCW9mIG5lZWRlZCBmaWxlcyAobG9vc2VseSwgdGhlIG9uZXMgbWlzc2luZyBpbiBsaWJjKSwKKwlhbmQgdGhlbiBwYXNzZXMgdGhhdCBsaXN0IHRvIHRoZSByZWN1cnNpdmUgbWFrZS4KKwkqIGNvbmZpZy9taC1tYWNoOiAgUmVtb3ZlIG9ic29sZXRlIFNUUkVSUk9SLXtDLE99IG1hY3Jvcy4KKworVHVlIE5vdiAxMiAxOToxMDo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCVJTLzYwMDAgaG9zdCBzdXBwb3J0IChncnVtYmxlKS4KKworCSogY29uZmlndXJlLmluOiAgQnVpbGQgYWxsb2NhLWNvbmYuaCBmaWxlIGZyb20gYWxsb2NhLW5vcm0uaAorCShldmVyeXRoaW5nIGVsc2UpIG9yIGFsbG9jYS1ib3RjaC5oIChycy82MDAwKS4KKwkqIE1ha2VmaWxlLmluOiAgSW5jbHVkZSAuIG9uIHRoZSBpbmNsdWRlIHBhdGguCisJKiBnZXRvcHQuYzogIFVzZSBhbGxvY2EtY29uZi5oLgorCSogYWxsb2NhLW5vcm0uaDogIEhvdyB0byBkZWNsYXJlIGFsbG9jYSBvbiByZWFzb25hYmxlIG1hY2hpbmVzLgorCSogYWxsb2NhLWJvdGNoLmg6IEhvdyB0byBkZWNsYXJlIGFsbG9jYSBvbiBicmFpbmRlYWQgbWFjaGluZXMuCisKK1R1ZSBOb3YgMTIgMDk6MjE6NDggMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmNhdC5jIDogIE5ldyBmaWxlLCBsaWtlIGNvbmNhdCgpIGluIGdkYiBidXQgY2FuIHRha2UgYQorCXZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgcmF0aGVyIHRoYW4gZml4ZWQgYXQgMyBhcmdzLiAgRm9yCisJbm93LCBjbGllbnQgYXBwbGljYXRpb25zIG11c3Qgc3VwcGx5IGFuIHhtYWxsb2MoKSwgd2hpY2ggaXMgYQorCWZyb250IGVuZCBmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggb3V0LW9mLW1lbW9yeQorCWNvbmRpdGlvbnMuCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIGNvbmNhdC5jIGFuZCBjb25jYXQubyB0byBhcHByb3ByaWF0ZSBtYWNyb3MuCisKK1NhdCBOb3YgIDkgMTM6Mjk6NTkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1zdnI0OiAgQWRkIHNpZ3NldG1hc2sgdG8gbGlzdCBvZiByZXF1aXJlZCBmdW5jdGlvbnMuCisKK1N1biBOb3YgIDMgMTE6NTc6NTYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIHZzcHJpbnRmLmM6ICBOZXcgZmlsZS4KKwkqIGZ1bmN0aW9ucy5kZWYsIE1ha2VmaWxlLmluOiAgQWRkIHZzcHJpbnRmLgorCitTdW4gT2N0IDI3IDE2OjMxOjIyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1yczYwMDA6ICBBZGQgcnMvNjAwMCBob3N0IHN1cHBvcnQuCisJKiBNYWtlZmlsZS5pbjogIENvbXBpbGUgd2l0aCBkZWJ1ZyBpbmZvLgorCitGcmkgT2N0IDI1IDE3OjAxOjEyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBhbmQgbmV3IGZpbGVzOiBkdW1teS5jLCBmdW5jdGlvbnMuZGVmLAorCWNvbmZpZy9tZi1kZWZhdWx0OiAgQWRkZWQgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbW9kZSwKKwl3aGljaCBpbmNsdWRlcyBpbnRvIGxpYmliZXJ0eS5hIGZ1bmN0aW9ucyB0aGF0IGFyZSAibWlzc2luZyIgaW4gbGliYy4KKwkqIHN0cmR1cC5jLCB2cHJpbnRmLmMsIHZmcHJpbnRmLmM6IE5ldyBmaWxlcy4KKworVGh1IE9jdCAyNCAwMjoyOToyNiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2htYWtlLXN2cjQ6IE5ldyBmaWxlLgorCisJKiBjb25maWcvaG1ha2Utc3lzdjogQWRkIEhPU1RfQ0ZJTEVTIGFuZCBIT1NUX09GSUxFUy4KKworCSogYmFzZW5hbWUuYywgYmNtcC5jLCBiY29weS5jLCBiemVyby5jLCBnZXRwYWdlc2l6ZS5jIGdldHdkLmMsCisJaW5kZXguYywgaW5zcXVlLmMsIHJpbmRleC5jLCBzcGFjZXMuYywgc3Ryc3RyLmMsIHZmb3JrLmM6IE5ldworCWZpbGVzIGNvbnRhaW5pbmcgZWl0aGVyIHBvcnRhYmxlIEMgdmVyc2lvbnMgb3IgZW11bGF0aW9ucyB1c2luZworCW5hdGl2ZSBsaWJyYXJ5IGNhbGxzLgorCisJKiBzdHJlcnJvci5jOiAgQWRkIGNvcHlyaWdodCwgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiwgZXRjLgorCisJKiBzdHJ0b2wuYzogIFJlcGxhY2UgaGFyZHdpcmVkIGhleCBjb25zdGFudHMgd2l0aCBzb21lIG1vcmUKKwlwb3J0YWJsZSBtYWNyb3MuICBSZW1vdmUgaWxsZWdhbCAoYWNjb3JkaW5nIHRvIGdjYykgY2FzdC4KKworCSogc3RydG91bC5jOiBSZXBsYWNlIGhhcmR3aXJlZCBoZXggY29uc3RhbnQgd2l0aCBtb3JlIHBvcnRhYmxlCisJbWFjcm8uCisKKwkqIE1ha2VmaWxlLmluOiBNb3ZlIFRBUkdFVExJQiBhbmQgQ0ZMQUdTIHdoZXJlIG1ha2VmaWxlIGZyYWdtZW50cworCWNhbiBvdmVycmlkZSB0aGVtLiAgQWRkIG5ldyBzb3VyY2UgYW5kIG9iamVjdCBmaWxlIG5hbWVzIHRvIENGSUxFUworCWFuZCBPRklMRVMgcmVzcGVjdGl2ZWx5LgorCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTVlI0IG1ha2VmaWxlIGZyYWdtZW50cy4KKworVHVlIE9jdCAyMiAxOTowMDoyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBNb3ZlIFJBTkxJQiwgQVIgYW5kIEFSX0ZMQUdTIHRvIHdoZXJlIHRoZXkgY2FuIGJlCisJb3Zlci1yaWRkZW4gYnkgY29uZmlnL2htYWtlLSoKKwkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgbTg4a2N2cyB0byBzeXN2IGxpc3QKKworRnJpIE9jdCAgNCAwMToyOTowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBNb3N0IGhvc3RzIG5lZWQgc3RyZXJyb3IsIGJ1dCBvbmUgb3IgdHdvIGRvbid0LAorCWFuZCB0aGV5IG92ZXJyaWRlIHRoZXNlIGRlZmluaXRpb25zIGluIHRoZSBob3N0LWRlcGVuZGVudCBtYWtlZmlsZQorCWZyYWdtZW50LgorCSogY29uZmlnL2htYWtlLW1hY2g6ICBUaGUgb2RkIG1hbiBvdXQgb24gc3RyZXJyb3IgLS0gaXQncyBzdXBwbGllZC4KKwkqIHN0cmVycm9yLmM6ICBOZXcgZmlsZS4KKworCSogc3RydG9sLmMsIHN0cnRvdWwuYzogIEFkZCBzdHJ0b2wgdG8gbGliaWJlcnR5LCBzaW5jZSBNYWNoIGxhY2tzCisJaXQgYW5kIGJmZCB1c2VzIGl0LgorCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgY29uZmlnL2htYWtlLW1hY2g6ICBPbmx5IGNvbmZpZ3VyZQorCXN0cnRvbCAmIHN0cm90b3VsIGluIG9uIE1hY2guCisKK1R1ZSBTZXAgIDMgMDY6MzY6MjMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmM6ICBNZXJnZSB3aXRoIGxhdGVzdCBGU0YgdmVyc2lvbi4KKworDAorTG9jYWwgVmFyaWFibGVzOgordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L01ha2VmaWxlLmluIGIvbGliaWJlcnR5L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjg5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNDcgQEAKKyMKKyMgTWFrZWZpbGUKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KKyMgTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyMgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkgPHJpY2hAY3lnbnVzLmNvbT4uCisKKyMKKyMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSBkaXJlY3RvcnkKKyMKKworc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKKworZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitiaW5kaXIgPSBAYmluZGlyQAorbGliZGlyID0gQGxpYmRpckAKKworU0hFTEwgPSBAU0hFTExACisKKyMgTXVsdGlsaWIgc3VwcG9ydCB2YXJpYWJsZXMuCitNVUxUSVNSQ1RPUCA9CitNVUxUSUJVSUxEVE9QID0KK01VTFRJRElSUyA9CitNVUxUSVNVQkRJUiA9CitNVUxUSURPID0gdHJ1ZQorTVVMVElDTEVBTiA9IHRydWUKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKK0FSID0gQEFSQAorQVJfRkxBR1MgPSByYworCitDQyA9IEBDQ0AKK0NGTEFHUyA9IEBDRkxBR1NACitMSUJDRkxBR1MgPSAkKENGTEFHUykKK1JBTkxJQiA9IEBSQU5MSUJACisKK1BJQ0ZMQUcgPQorCitNQUtFT1ZFUlJJREVTID0KKworVEFSR0VUTElCID0gbGliaWJlcnR5LmEKKworTElCT0JKUyA9IEBMSUJPQkpTQAorQUxMT0NBID0gQEFMTE9DQUAKKworIyBBIGNvbmZpZ3VyYXRpb24gY2FuIHNwZWNpZnkgZXh0cmEgLm8gZmlsZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQsCisjIGV2ZW4gaWYgdGhleSBhcmUgaW4gbGliYy4gKFBlcmhhcHMgdGhlIGxpYmMgdmVyc2lvbiBpcyBidWdneS4pCitFWFRSQV9PRklMRVMgPSAKKworIyBGbGFncyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIG1ha2UuCitGTEFHU19UT19QQVNTID0gXAorCSJBUj0kKEFSKSIgXAorCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAorCSJDQz0kKENDKSIgXAorCSJDRkxBR1M9JChDRkxBR1MpIiBcCisJIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKKwkiRVhUUkFfT0ZJTEVTPSQoRVhUUkFfT0ZJTEVTKSIgXAorCSJIREVGSU5FUz0kKEhERUZJTkVTKSIgXAorCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKKwkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAorCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCisJIkxERkxBR1M9JChMREZMQUdTKSIgXAorCSJMT0FETElCRVM9JChMT0FETElCRVMpIiBcCisJIlJBTkxJQj0kKFJBTkxJQikiIFwKKwkiU0hFTEw9JChTSEVMTCkiCisKK2FsbDogc3RhbXAtcGljZGlyICQoVEFSR0VUTElCKSBuZWVkZWQtbGlzdCByZXF1aXJlZC1saXN0CisJQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1hbGwKKworLlBIT05ZOiBjaGVjayBpbnN0YWxsY2hlY2sKK2NoZWNrIGluc3RhbGxjaGVjazoKKworQGhvc3RfbWFrZWZpbGVfZnJhZ0AKKworSU5DRElSPSQoc3JjZGlyKS8kKE1VTFRJU1JDVE9QKS4uL2luY2x1ZGUKKworQ09NUElMRS5jID0gJChDQykgLWMgQERFRlNAICQoTElCQ0ZMQUdTKSAtSS4gLUkkKElOQ0RJUikgJChIREVGSU5FUykKKy5jLm86CisJdGVzdCB4IiQoZW5hYmxlX3NoYXJlZCkiICE9IHh5ZXMgfHwgXAorCSAgJChDT01QSUxFLmMpICQoUElDRkxBRykgJDwgLW8gcGljLyRACisJJChDT01QSUxFLmMpICQ8CisKK2luZm8gaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8gZHZpOgorCisjIEluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgaW4gdGhpcyBkaXJlY3RvcnkuCitIRklMRVMgPSBhbGxvY2EtY29uZi5oCisKKyMgTk9URTogSWYgeW91IGFkZCBuZXcgZmlsZXMgdG8gdGhlIGxpYnJhcnksIGFkZCB0aGVtIHRvIHRoaXMgbGlzdAorIyAoYWxwaGFiZXRpY2FsKSwgYW5kIGFkZCB0aGVtIHRvIFJFUVVJUkVEX09GSUxFUyBvciBmdW5jcyBpbgorIyBjb25maWd1cmUuaW4uCitDRklMRVMgPSBhc3ByaW50Zi5jIGFsbG9jYS5jIGFyZ3YuYyBhdGV4aXQuYyBiYXNlbmFtZS5jIGJjbXAuYyBiY29weS5jIFwKKwliemVyby5jIGNob29zZS10ZW1wLmMgY2xvY2suYyBjb25jYXQuYyBjcGx1cy1kZW0uYyBmZG1hdGNoLmMgXAorCWZubWF0Y2guYyBnZXRjd2QuYyBnZXRvcHQuYyBnZXRvcHQxLmMgZ2V0cGFnZXNpemUuYyBcCisJZ2V0cnVudGltZS5jIGZsb2F0Zm9ybWF0LmMgaGV4LmMgaW5kZXguYyBpbnNxdWUuYyBtZW1jaHIuYyBcCisJbWVtY21wLmMgbWVtY3B5LmMgbWVtbW92ZS5jIG1lbXNldC5jIG1rc3RlbXBzLmMgb2JqYWxsb2MuYyBvYnN0YWNrLmMgXAorCXBleGVjdXRlLmMgcmFuZG9tLmMgcmVuYW1lLmMgcmluZGV4LmMgc2lnc2V0bWFzay5jIHNwYWNlcy5jIFwKKwlzcGxheS10cmVlLmMgc3RyY2FzZWNtcC5jIHN0cm5jYXNlY21wLmMgc3RyY2hyLmMgc3RyZHVwLmMgc3RyZXJyb3IuYyBcCisJc3RycmNoci5jIHN0cnNpZ25hbC5jIHN0cnN0ci5jIHN0cnRvZC5jIHN0cnRvbC5jIHN0cnRvdWwuYyBcCisJdG1wbmFtLmMgdmFzcHJpbnRmLmMgdmZvcmsuYyB2ZnByaW50Zi5jIHZwcmludGYuYyB2c3ByaW50Zi5jIFwKKwl3YWl0cGlkLmMgeGF0ZXhpdC5jIHhleGl0LmMgeG1hbGxvYy5jIHhzdHJkdXAuYyB4c3RyZXJyb3IuYworCisjIFRoZXNlIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkuCitSRVFVSVJFRF9PRklMRVMgPSBhcmd2Lm8gY2hvb3NlLXRlbXAubyBjb25jYXQubyBjcGx1cy1kZW0ubyBcCisgIGZkbWF0Y2gubyBmbm1hdGNoLm8gZ2V0b3B0Lm8gZ2V0b3B0MS5vIGdldHJ1bnRpbWUubyBoZXgubyBcCisgIGZsb2F0Zm9ybWF0Lm8gb2JqYWxsb2MubyBvYnN0YWNrLm8gcGV4ZWN1dGUubyBzcGFjZXMubyBcCisgIHNwbGF5LXRyZWUubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vIHhhdGV4aXQubyB4ZXhpdC5vIHhtYWxsb2MubyBcCisgIHhzdHJkdXAubyB4c3RyZXJyb3IubworCiskKFRBUkdFVExJQik6ICQoUkVRVUlSRURfT0ZJTEVTKSAkKEVYVFJBX09GSUxFUykgJChMSUJPQkpTKSAkKEFMTE9DQSkKKwlybSAtZiAkKFRBUkdFVExJQikKKwkkKEFSKSAkKEFSX0ZMQUdTKSAkKFRBUkdFVExJQikgXAorCSAgJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKQorCSQoUkFOTElCKSAkKFRBUkdFVExJQikKKworSU5TVEFMTF9ERVNUID0gQElOU1RBTExfREVTVEAKK2luc3RhbGw6IGluc3RhbGxfdG9fJChJTlNUQUxMX0RFU1QpCisKK2luc3RhbGxfdG9fbGliZGlyOiBhbGwKKwkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQobGliZGlyKSQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uCisJKCBjZCAkKGxpYmRpcikkKE1VTFRJU1VCRElSKSA7ICQoUkFOTElCKSAkKFRBUkdFVExJQikubiApCisJbXYgLWYgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpLm4gJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpCisJQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1pbnN0YWxsCisKK2luc3RhbGxfdG9fdG9vbGRpcjogYWxsCisJJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUTElCKSAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uCisJKCBjZCAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpIDsgJChSQU5MSUIpICQoVEFSR0VUTElCKS5uICkKKwltdiAtZiAkKHRvb2xkaXIpL2xpYiQoTVVMVElTVUJESVIpLyQoVEFSR0VUTElCKS5uICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpCisJQCQoTVVMVElETykgJChGTEFHU19UT19QQVNTKSBtdWx0aS1kbyBETz1pbnN0YWxsCisKKyMgbmVlZGVkLWxpc3QgaXMgdXNlZCBieSBsaWJzdGRjKysuCituZWVkZWQtbGlzdDogTWFrZWZpbGUKKwlmPSIkKExJQk9CSlMpICQoQUxMT0NBKSAkKEVYVFJBX09GSUxFUykiOyBcCisJY2FzZSAkJGYgaW4gXAorCSAgKmFsbG9jYS5vKikgZj0iJCRmIHhtYWxsb2MubyB4ZXhpdC5vIiA7OyBcCisJZXNhYzsgXAorCWVjaG8gJCRmID4gbmVlZGVkLWxpc3QKKworIyByZXF1aXJlZC1saXN0IHdhcyB1c2VkIHdoZW4gYnVpbGRpbmcgYSBzaGFyZWQgYmZkL29wY29kZXMvbGliaWJlcnR5CisjIGxpYnJhcnkuICBJIGRvbid0IGtub3cgaWYgaXQgdXNlZCBieSBhbnl0aGluZyBjdXJyZW50bHkuCityZXF1aXJlZC1saXN0OiBNYWtlZmlsZQorCWVjaG8gJChSRVFVSVJFRF9PRklMRVMpID4gcmVxdWlyZWQtbGlzdAorCitzdGFtcC1waWNkaXI6CisJaWYgWyB4IiQoZW5hYmxlX3NoYXJlZCkiID0geHllcyBdICYmIFsgISAtZCBwaWMgXTsgdGhlbiBcCisJICBta2RpciBwaWM7IFwKKwllbHNlIHRydWU7IGZpCisJdG91Y2ggc3RhbXAtcGljZGlyCisKKy5QSE9OWTogYWxsIGV0YWdzIHRhZ3MgbHMgY2xlYW4gc3RhZ2UxIHN0YWdlMgorCitldGFncyB0YWdzOiBUQUdTCisKK1RBR1M6ICQoQ0ZJTEVTKSAkKEhGSUxFUykKKwlldGFncyBgZm9yIGkgaW4gJChIRklMRVMpICQoQ0ZJTEVTKTsgZG8gZWNobyAkKHNyY2RpcikvJCRpIDsgZG9uZWAKKworIyBUaGUgc3RhbmRhbG9uZSBkZW1hbmdsZXIgKGMrK2ZpbHQpIGhhcyBiZWVuIG1vdmVkIHRvIGJpbnV0aWxzLgorZGVtYW5nbGU6CisJQGVjaG8gIlRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciwgbm93IG5hbWVkIGMrK2ZpbHQsIGlzIG5vdyIKKwlAZWNobyAiYSBwYXJ0IG9mIGJpbnV0aWxzLiIKKwlAZmFsc2UKKworbHM6CisJQGVjaG8gTWFrZWZpbGUgJChIRklMRVMpICQoQ0ZJTEVTKQorCisjIE5lZWQgdG8gZGVhbCB3aXRoIHByb2ZpbGVkIGxpYnJhcmllcywgdG9vLgorCittb3N0bHljbGVhbjoKKwlybSAtcmYgKi5vIHBpYyBjb3JlIGVycnMgXCMqICouRSBhLm91dAorCXJtIC1mIG5lZWRlZC5hd2sgbmVlZGVkMi5hd2sgZXJyb3JzIGR1bW15IG5lZWRlZC1saXN0IGNvbmZpZy5oIHN0YW1wLSoKKwlybSAtZiAkKENPTkZJR19IKSAkKE5FRURFRF9MSVNUKSBzdGFtcC1waWNkaXIKKwlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1tb3N0bHljbGVhbgorY2xlYW46IG1vc3RseWNsZWFuCisJcm0gLWYgKi5hIHJlcXVpcmVkLWxpc3QgdG1wbXVsdGkub3V0CisJQCQoTVVMVElDTEVBTikgbXVsdGktY2xlYW4gRE89Y2xlYW4KK2Rpc3RjbGVhbjogY2xlYW4KKwlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1kaXN0Y2xlYW4KKwlybSAtZiAqfiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIHhob3N0LW1rZnJhZyBUQUdTIG11bHRpbGliLm91dAorCXJtIC1mIGNvbmZpZy5sb2cKK21haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBkaXN0Y2xlYW4KKworZm9yY2U6CisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cworCUNPTkZJR19GSUxFUz1NYWtlZmlsZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKK2NvbmZpZy5oOiBzdGFtcC1oIDsgQHRydWUKK3N0YW1wLWg6IGNvbmZpZy5pbiBjb25maWcuc3RhdHVzCisJQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKK2NvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy50YWJsZQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKTogc3RhbXAtcGljZGlyCisKK2FsbG9jYS5vOiBjb25maWcuaAorYXRleGl0Lm86IGNvbmZpZy5oCithcmd2Lm86IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCitiYXNlbmFtZS5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKK2Nob29zZS10ZW1wLm86IGNvbmZpZy5oCitjbG9jay5vOiBjb25maWcuaAorY29uY2F0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAorY3BsdXMtZGVtLm86IGNvbmZpZy5oICQoSU5DRElSKS9kZW1hbmdsZS5oCitmZG1hdGNoLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAorZm5tYXRjaC5vOiBjb25maWcuaCAkKElOQ0RJUikvZm5tYXRjaC5oCitnZXRjd2QubzogY29uZmlnLmgKK2dldG9wdC5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKK2dldG9wdDEubzogY29uZmlnLmggJChJTkNESVIpL2dldG9wdC5oCitnZXRwYWdlc2l6ZS5vOiBjb25maWcuaAorZ2V0cnVudGltZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKK2hleC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKK2Zsb2F0Zm9ybWF0Lm86ICQoSU5DRElSKS9mbG9hdGZvcm1hdC5oCitta3N0ZW1wcy5vOiBjb25maWcuaAorb2JqYWxsb2MubzogJChJTkNESVIpL29iamFsbG9jLmgKK29ic3RhY2subzogY29uZmlnLmggJChJTkNESVIpL29ic3RhY2suaAorcGV4ZWN1dGUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCitzcGFjZXMubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCitzcGxheS10cmVlLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvc3BsYXktdHJlZS5oICQoSU5DRElSKS9hbnNpZGVjbC5oCitzdHJlcnJvci5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKK3N0cnNpZ25hbC5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKK3hhdGV4aXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCit4ZXhpdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKK3htYWxsb2MubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCit4c3RyZHVwLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoreHN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L1JFQURNRSBiL2xpYmliZXJ0eS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1MjI2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9SRUFETUUKQEAgLTAsMCArMSw2NSBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIC1saWJlcnR5IGxpYnJhcnkgb2YgZnJlZSBzb2Z0d2FyZS4KK0l0IGlzIGEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB1c2VkIGJ5IHZhcmlvdXMgR05VIHByb2dyYW1zLgorQ3VycmVudCBtZW1iZXJzIGluY2x1ZGU6CisKKwlnZXRvcHQgLS0gZ2V0IG9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUKKwlvYnN0YWNrIC0tIHN0YWNrcyBvZiBhcmJpdHJhcmlseS1zaXplZCBvYmplY3RzCisJc3RyZXJyb3IgLS0gZXJyb3IgbWVzc2FnZSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gZXJybm8KKwlzdHJ0b2wgLS0gc3RyaW5nLXRvLWxvbmcgY29udmVyc2lvbgorCXN0cnRvdWwgLS0gc3RyaW5nLXRvLXVuc2lnbmVkLWxvbmcgY29udmVyc2lvbgorCitXZSBleHBlY3QgbWFueSBvZiB0aGUgR05VIHN1YnJvdXRpbmVzIHRoYXQgYXJlIGZsb2F0aW5nIGFyb3VuZCB0bworZXZlbnR1YWxseSBhcnJpdmUgaGVyZS4KKworVGhlIGxpYnJhcnkgbXVzdCBiZSBjb25maWd1cmVkIGZyb20gdGhlIHRvcCBzb3VyY2UgZGlyZWN0b3J5LiAgRG9uJ3QKK3RyeSB0byBydW4gY29uZmlndXJlIGluIHRoaXMgZGlyZWN0b3J5LiAgRm9sbG93IHRoZSBjb25maWd1cmF0aW9uCitpbnN0cnVjdGlvbnMgaW4gLi4vUkVBRE1FLgorCitQbGVhc2UgcmVwb3J0IGJ1Z3MgYW5kIGZpeGVzIHRvICJidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdSIuICBUaGFuayB5b3UuCisKK0FERElORyBBIE5FVyBGSUxFCis9PT09PT09PT09PT09PT09PQorCitUaGVyZSBhcmUgdHdvIHNldHMgb2YgZmlsZXM6ICBUaG9zZSB0aGF0IGFyZSAicmVxdWlyZWQiIHdpbGwgYmUKK2luY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IGZvciBhbGwgY29uZmlndXJhdGlvbnMsIHdoaWxlIHRob3NlCit0aGF0IGFyZSAib3B0aW9uYWwiIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkgb25seSBpZiAibmVlZGVkLiIKKworVG8gYWRkIGEgbmV3IHJlcXVpcmVkIGZpbGUsIGVkaXQgTWFrZWZpbGUgdG8gYWRkIHRoZSBzb3VyY2UgZmlsZQorbmFtZSB0byBDRklMRVMgYW5kIHRoZSBvYmplY3QgZmlsZSB0byBSRVFVSVJFRF9PRklMRVMuCisKK1RvIGFkZCBhIG5ldyBvcHRpb25hbCBmaWxlLCBpdCBtdXN0IHByb3ZpZGUgYSBzaW5nbGUgZnVuY3Rpb24sIGFuZCB0aGUKK25hbWUgb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisKKyAgICAqIEFkZCB0aGUgc291cmNlIGZpbGUgbmFtZSB0byBDRklMRVMuCisKKyAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gbmFtZSB0byB0aGUgZnVuY3Mgc2hlbGwgdmFyaWFibGUgaW4KKyAgICAgIGNvbmZpZ3VyZS5pbi4KKworICAgICogQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgQUNfQ0hFQ0tfRlVOQ1MgbGlzdHMganVzdCBhZnRlciB0aGUKKyAgICAgIHNldHRpbmcgb2YgdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlLiAgVGhlc2UgQUNfQ0hFQ0tfRlVOQ1MgY2FsbHMKKyAgICAgIGFyZSBuZXZlciBleGVjdXRlZDsgdGhleSBhcmUgdGhlcmUgdG8gbWFrZSBhdXRvaGVhZGVyIHdvcmsKKyAgICAgIGJldHRlci4KKworICAgICogQ29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZXMgb2YgYnVpbGRpbmcgbGliaWJlcnR5OyBhcyBvZiB0aGlzCisgICAgICB3cml0aW5nLCB0aGUgc3BlY2lhbCBjYXNlcyBhcmUgbmV3bGliIGFuZCBWeFdvcmtzLiAgSWYgYQorICAgICAgcGFydGljdWxhciBzcGVjaWFsIGNhc2UgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uLCB5b3UgZG8gbm90IG5lZWQKKyAgICAgIHRvIGRvIGFueXRoaW5nLiAgSWYgaXQgZG9lcyBub3QgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIGFkZCB0aGUKKyAgICAgIG9iamVjdCBmaWxlIHRvIExJQk9CSlMsIGFuZCBhZGQgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gdGhlIGNhc2UKKyAgICAgIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gZGVmaW5lIEhBVkVfZnVuYy4KKworVGhlIG9wdGlvbmFsIGZpbGUgeW91J3ZlIGFkZGVkIChlLmcuIGdldGN3ZC5jKSBzaG91bGQgY29tcGlsZSBhbmQgd29yaworb24gYWxsIGhvc3RzIHdoZXJlIGl0IGlzIG5lZWRlZC4gIEl0IGRvZXMgbm90IGhhdmUgdG8gd29yayBvciBldmVuCitjb21waWxlIG9uIGhvc3RzIHdoZXJlIGl0IGlzIG5vdCBuZWVkZWQuCisKK0FERElORyBBIE5FVyBDT05GSUdVUkFUSU9OCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPbiBtb3N0IGhvc3RzIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhlIHNjaGVtZSBmb3IgYXV0b21hdGljYWxseQorZmlndXJpbmcgb3V0IHdoaWNoIGZpbGVzIGFyZSBuZWVkZWQuICBJbiB0aGF0IGNhc2UsIHlvdSBwcm9iYWJseQorZG9uJ3QgbmVlZCBhIHNwZWNpYWwgTWFrZWZpbGUgc3R1YiBmb3IgdGhhdCBjb25maWd1cmF0aW9uLgorCitJZiB0aGUgZnVsbHkgYXV0b21hdGljIHNjaGVtZSBkb2Vzbid0IHdvcmssIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKK2J5IHdpdGggZGVmaW5pbmcgRVhUUkFfT0ZJTEVTIGluIHlvdXIgTWFrZWZpbGUgc3R1Yi4gIFRoaXMgaXMKK2EgbGlzdCBvZiBvYmplY3QgZmlsZSBuYW1lcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIHJlcXVpcmVkCitmb3IgdGhpcyBjb25maWd1cmF0aW9uIC0gdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIGxpYmliZXJ0eS5hLAorcmVnYXJkbGVzcyBvZiB3aGF0ZXZlciBtaWdodCBiZSBpbiB0aGUgQyBsaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FjY29uZmlnLmggYi9saWJpYmVydHkvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2M1OTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2FjY29uZmlnLmgKQEAgLTAsMCArMSwxMSBAQAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfZXJybGlzdCB2YXJpYWJsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfRVJSTElTVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19uZXJyIHZhcmlhYmxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19ORVJSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX3NpZ2xpc3QgdmFyaWFibGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1NJR0xJU1QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJlcnJvciBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJFUlJPUgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FsbG9jYS1jb25mLmggYi9saWJpYmVydHkvYWxsb2NhLWNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzNlZWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoQ19BTExPQ0EpCisjIGlmbmRlZiBhbGxvY2EKKyMgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBlbmRpZgorI2Vsc2UgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KKyMgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgZWxzZQorIyAgaWYgZGVmaW5lZChIQVZFX0FMTE9DQV9IKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLworIyAgIGlmZGVmIF9fU1REQ19fCitleHRlcm4gUFRSIGFsbG9jYSAoc2l6ZV90KTsKKyMgICBlbHNlIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCitleHRlcm4gUFRSIGFsbG9jYSAoKTsKKyMgICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fU1REQ19fKSAqLworIyAgZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX0FMTE9DQV9IKSAqLworIyAgaWZkZWYgX1dJTjMyCisjICAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBlbmRpZgorIyBlbmRpZiAvKiAhIGRlZmluZWQgKF9BSVgpICovCisjZW5kaWYgLyogISBkZWZpbmVkIChfX0dOVUNfXykgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EuYyBiL2xpYmliZXJ0eS9hbGxvY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjhhMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2FsbG9jYS5jCkBAIC0wLDAgKzEsNTA1IEBACisvKiBhbGxvY2EuYyAtLSBhbGxvY2F0ZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCBtZW1vcnkKKyAgIChNb3N0bHkpIHBvcnRhYmxlIHB1YmxpYy1kb21haW4gaW1wbGVtZW50YXRpb24gLS0gRCBBIEd3eW4KKworICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUFdCIGxpYnJhcnkgYWxsb2NhIGZ1bmN0aW9uLAorICAgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBzcGFjZSBvZmYgdGhlIHJ1bi10aW1lIHN0YWNrIHNvCisgICB0aGF0IGl0IGlzIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIHVwb24gcHJvY2VkdXJlIGV4aXQsCisgICB3YXMgaW5zcGlyZWQgYnkgZGlzY3Vzc2lvbnMgd2l0aCBKLiBRLiBKb2huc29uIG9mIENvcm5lbGwuCisgICBKLk90dG8gVGVubmFudCA8am90QGNyYXkuY29tPiBjb250cmlidXRlZCB0aGUgQ3JheSBzdXBwb3J0LgorCisgICBUaGVyZSBhcmUgc29tZSBwcmVwcm9jZXNzb3IgY29uc3RhbnRzIHRoYXQgY2FuCisgICBiZSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIGZvciB5b3VyIHNwZWNpZmljIHN5c3RlbSwgZm9yCisgICBpbXByb3ZlZCBlZmZpY2llbmN5OyBob3dldmVyLCB0aGUgZGVmYXVsdHMgc2hvdWxkIGJlIG9rYXkuCisKKyAgIFRoZSBnZW5lcmFsIGNvbmNlcHQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBrZWVwCisgICB0cmFjayBvZiBhbGwgYWxsb2NhLWFsbG9jYXRlZCBibG9ja3MsIGFuZCByZWNsYWltIGFueQorICAgdGhhdCBhcmUgZm91bmQgdG8gYmUgZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIHRoZSBjdXJyZW50CisgICBpbnZvY2F0aW9uLiAgVGhpcyBoZXVyaXN0aWMgZG9lcyBub3QgcmVjbGFpbSBzdG9yYWdlIGFzCisgICBzb29uIGFzIGl0IGJlY29tZXMgaW52YWxpZCwgYnV0IGl0IHdpbGwgZG8gc28gZXZlbnR1YWxseS4KKworICAgQXMgYSBzcGVjaWFsIGNhc2UsIGFsbG9jYSgwKSByZWNsYWltcyBzdG9yYWdlIHdpdGhvdXQKKyAgIGFsbG9jYXRpbmcgYW55LiAgSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIGFsbG9jYSgwKSBpbgorICAgeW91ciBtYWluIGNvbnRyb2wgbG9vcCwgZXRjLiB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIGVtYWNzCisjaW5jbHVkZSAiYmxvY2tpbnB1dC5oIgorI2VuZGlmCisKKy8qIElmIGNvbXBpbGluZyB3aXRoIEdDQyAyLCB0aGlzIGZpbGUncyBub3QgbmVlZGVkLiAgRXhjZXB0IG9mIGNvdXJzZSBpZgorICAgdGhlIEMgYWxsb2NhIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KKyNpZiBkZWZpbmVkIChVU0VfQ19BTExPQ0EpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyCisKKy8qIElmIHNvbWVvbmUgaGFzIGRlZmluZWQgYWxsb2NhIGFzIGEgbWFjcm8sCisgICB0aGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgd2F5IGFsbG9jYSBpcyBzdXBwb3NlZCB0byB3b3JrLiAgKi8KKyNpZm5kZWYgYWxsb2NhCisKKyNpZmRlZiBlbWFjcworI2lmZGVmIHN0YXRpYworLyogYWN0dWFsbHksIG9ubHkgd2FudCB0aGlzIGlmIHN0YXRpYyBpcyBkZWZpbmVkIGFzICIiCisgICAtLSB0aGlzIGlzIGZvciB1c2csIGluIHdoaWNoIGVtYWNzIG11c3QgdW5kZWZpbmUgc3RhdGljCisgICBpbiBvcmRlciB0byBtYWtlIHVuZXhlYyB3b3JrYWJsZQorICAgKi8KKyNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCit5b3UKK2xvc2UKKy0tIG11c3Qga25vdyBTVEFDS19ESVJFQ1RJT04gYXQgY29tcGlsZS10aW1lCisjZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OIHVuZGVmaW5lZCAqLworI2VuZGlmIC8qIHN0YXRpYyAqLworI2VuZGlmIC8qIGVtYWNzICovCisKKy8qIElmIHlvdXIgc3RhY2sgaXMgYSBsaW5rZWQgbGlzdCBvZiBmcmFtZXMsIHlvdSBoYXZlIHRvCisgICBwcm92aWRlIGFuICJhZGRyZXNzIG1ldHJpYyIgQUREUkVTU19GVU5DVElPTiBtYWNyby4gICovCisKKyNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKK2xvbmcgaTAwYWZ1bmMgKCk7CisjZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAoY2hhciAqKSBpMDBhZnVuYyAoJihhcmcpKQorI2Vsc2UKKyNkZWZpbmUgQUREUkVTU19GVU5DVElPTihhcmcpICYoYXJnKQorI2VuZGlmCisKKyNpZiBfX1NURENfXwordHlwZWRlZiB2b2lkICpwb2ludGVyOworI2Vsc2UKK3R5cGVkZWYgY2hhciAqcG9pbnRlcjsKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUJTlVMTAkwCisjZW5kaWYKKworLyogRGlmZmVyZW50IHBvcnRpb25zIG9mIEVtYWNzIG5lZWQgdG8gY2FsbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKKyAgIG1hbGxvYy4gIFRoZSBFbWFjcyBleGVjdXRhYmxlIG5lZWRzIGFsbG9jYSB0byBjYWxsIHhtYWxsb2MsIGJlY2F1c2UKKyAgIG9yZGluYXJ5IG1hbGxvYyBpc24ndCBwcm90ZWN0ZWQgZnJvbSBpbnB1dCBzaWduYWxzLiAgT24gdGhlIG90aGVyCisgICBoYW5kLCB0aGUgdXRpbGl0aWVzIGluIGxpYi1zcmMgbmVlZCBhbGxvY2EgdG8gY2FsbCBtYWxsb2M7IHNvbWUgb2YKKyAgIHRoZW0gYXJlIHZlcnkgc2ltcGxlLCBhbmQgZG9uJ3QgaGF2ZSBhbiB4bWFsbG9jIHJvdXRpbmUuCisKKyAgIE5vbi1FbWFjcyBwcm9ncmFtcyBleHBlY3QgdGhpcyB0byBjYWxsIHVzZSB4bWFsbG9jLgorCisgICBDYWxsZXJzIGJlbG93IHNob3VsZCB1c2UgbWFsbG9jLiAgKi8KKworI2lmbmRlZiBlbWFjcworI2RlZmluZSBtYWxsb2MgeG1hbGxvYworI2VuZGlmCitleHRlcm4gcG9pbnRlciBtYWxsb2MgKCk7CisKKy8qIERlZmluZSBTVEFDS19ESVJFQ1RJT04gaWYgeW91IGtub3cgdGhlIGRpcmVjdGlvbiBvZiBzdGFjaworICAgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgZGVkdWNlZCBhdCBydW4tdGltZS4KKworICAgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworICAgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgICBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAgKi8KKworI2lmbmRlZiBTVEFDS19ESVJFQ1RJT04KKyNkZWZpbmUJU1RBQ0tfRElSRUNUSU9OCTAJLyogRGlyZWN0aW9uIHVua25vd24uICAqLworI2VuZGlmCisKKyNpZiBTVEFDS19ESVJFQ1RJT04gIT0gMAorCisjZGVmaW5lCVNUQUNLX0RJUglTVEFDS19ESVJFQ1RJT04JLyogS25vd24gYXQgY29tcGlsZS10aW1lLiAgKi8KKworI2Vsc2UgLyogU1RBQ0tfRElSRUNUSU9OID09IDA7IG5lZWQgcnVuLXRpbWUgY29kZS4gICovCisKK3N0YXRpYyBpbnQgc3RhY2tfZGlyOwkJLyogMSBvciAtMSBvbmNlIGtub3duLiAgKi8KKyNkZWZpbmUJU1RBQ0tfRElSCXN0YWNrX2RpcgorCitzdGF0aWMgdm9pZAorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSBOVUxMOwkvKiBBZGRyZXNzIG9mIGZpcnN0IGBkdW1teScsIG9uY2Uga25vd24uICAqLworICBhdXRvIGNoYXIgZHVtbXk7CQkvKiBUbyBnZXQgc3RhY2sgYWRkcmVzcy4gICovCisKKyAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICB7CQkJCS8qIEluaXRpYWwgZW50cnkuICAqLworICAgICAgYWRkciA9IEFERFJFU1NfRlVOQ1RJT04gKGR1bW15KTsKKworICAgICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CS8qIFJlY3Vyc2Ugb25jZS4gICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU2Vjb25kIGVudHJ5LiAgKi8KKyAgICAgIGlmIChBRERSRVNTX0ZVTkNUSU9OIChkdW1teSkgPiBhZGRyKQorCXN0YWNrX2RpciA9IDE7CQkvKiBTdGFjayBncmV3IHVwd2FyZC4gICovCisgICAgICBlbHNlCisJc3RhY2tfZGlyID0gLTE7CQkvKiBTdGFjayBncmV3IGRvd253YXJkLiAgKi8KKyAgICB9Cit9CisKKyNlbmRpZiAvKiBTVEFDS19ESVJFQ1RJT04gPT0gMCAqLworCisvKiBBbiAiYWxsb2NhIGhlYWRlciIgaXMgdXNlZCB0bzoKKyAgIChhKSBjaGFpbiB0b2dldGhlciBhbGwgYWxsb2NhJ2VkIGJsb2NrczsKKyAgIChiKSBrZWVwIHRyYWNrIG9mIHN0YWNrIGRlcHRoLgorCisgICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHNpemVvZihoZWFkZXIpIGFncmVlIHdpdGggbWFsbG9jCisgICBhbGlnbm1lbnQgY2h1bmsgc2l6ZS4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBzaG91bGQgd29yayBva2F5LiAgKi8KKworI2lmbmRlZglBTElHTl9TSVpFCisjZGVmaW5lCUFMSUdOX1NJWkUJc2l6ZW9mKGRvdWJsZSkKKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIGhkcgoreworICBjaGFyIGFsaWduW0FMSUdOX1NJWkVdOwkvKiBUbyBmb3JjZSBzaXplb2YoaGVhZGVyKS4gICovCisgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuaW9uIGhkciAqbmV4dDsJCS8qIEZvciBjaGFpbmluZyBoZWFkZXJzLiAgKi8KKyAgICAgIGNoYXIgKmRlZXA7CQkvKiBGb3Igc3RhY2sgZGVwdGggbWVhc3VyZS4gICovCisgICAgfSBoOworfSBoZWFkZXI7CisKK3N0YXRpYyBoZWFkZXIgKmxhc3RfYWxsb2NhX2hlYWRlciA9IE5VTEw7CS8qIC0+IGxhc3QgYWxsb2NhIGhlYWRlci4gICovCisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYXQgbGVhc3QgU0laRSBieXRlcyBvZiBzdG9yYWdlLAorICAgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIGV4aXQgZnJvbQorICAgdGhlIHByb2NlZHVyZSB0aGF0IGNhbGxlZCBhbGxvY2EuICBPcmlnaW5hbGx5LCB0aGlzIHNwYWNlCisgICB3YXMgc3VwcG9zZWQgdG8gYmUgdGFrZW4gZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBvZiB0aGUKKyAgIGNhbGxlciwgYnV0IHRoYXQgbWV0aG9kIGNhbm5vdCBiZSBtYWRlIHRvIHdvcmsgZm9yIHNvbWUKKyAgIGltcGxlbWVudGF0aW9ucyBvZiBDLCBmb3IgZXhhbXBsZSB1bmRlciBHb3VsZCdzIFVUWC8zMi4gICovCisKK3BvaW50ZXIKK2FsbG9jYSAoc2l6ZSkKKyAgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgYXV0byBjaGFyIHByb2JlOwkJLyogUHJvYmVzIHN0YWNrIGRlcHRoOiAqLworICByZWdpc3RlciBjaGFyICpkZXB0aCA9IEFERFJFU1NfRlVOQ1RJT04gKHByb2JlKTsKKworI2lmIFNUQUNLX0RJUkVDVElPTiA9PSAwCisgIGlmIChTVEFDS19ESVIgPT0gMCkJCS8qIFVua25vd24gZ3Jvd3RoIGRpcmVjdGlvbi4gICovCisgICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisjZW5kaWYKKworICAvKiBSZWNsYWltIGdhcmJhZ2UsIGRlZmluZWQgYXMgYWxsIGFsbG9jYSdkIHN0b3JhZ2UgdGhhdAorICAgICB3YXMgYWxsb2NhdGVkIGZyb20gZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIGN1cnJlbnRseS4gICovCisKKyAgeworICAgIHJlZ2lzdGVyIGhlYWRlciAqaHA7CS8qIFRyYXZlcnNlcyBsaW5rZWQgbGlzdC4gICovCisKKyNpZmRlZiBlbWFjcworICAgIEJMT0NLX0lOUFVUOworI2VuZGlmCisKKyAgICBmb3IgKGhwID0gbGFzdF9hbGxvY2FfaGVhZGVyOyBocCAhPSBOVUxMOykKKyAgICAgIGlmICgoU1RBQ0tfRElSID4gMCAmJiBocC0+aC5kZWVwID4gZGVwdGgpCisJICB8fCAoU1RBQ0tfRElSIDwgMCAmJiBocC0+aC5kZWVwIDwgZGVwdGgpKQorCXsKKwkgIHJlZ2lzdGVyIGhlYWRlciAqbnAgPSBocC0+aC5uZXh0OworCisJICBmcmVlICgocG9pbnRlcikgaHApOwkvKiBDb2xsZWN0IGdhcmJhZ2UuICAqLworCisJICBocCA9IG5wOwkJLyogLT4gbmV4dCBoZWFkZXIuICAqLworCX0KKyAgICAgIGVsc2UKKwlicmVhazsJCQkvKiBSZXN0IGFyZSBub3QgZGVlcGVyLiAgKi8KKworICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IGhwOwkvKiAtPiBsYXN0IHZhbGlkIHN0b3JhZ2UuICAqLworCisjaWZkZWYgZW1hY3MKKyAgICBVTkJMT0NLX0lOUFVUOworI2VuZGlmCisgIH0KKworICBpZiAoc2l6ZSA9PSAwKQorICAgIHJldHVybiBOVUxMOwkJLyogTm8gYWxsb2NhdGlvbiByZXF1aXJlZC4gICovCisKKyAgLyogQWxsb2NhdGUgY29tYmluZWQgaGVhZGVyICsgdXNlciBkYXRhIHN0b3JhZ2UuICAqLworCisgIHsKKyAgICByZWdpc3RlciBwb2ludGVyIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChoZWFkZXIpICsgc2l6ZSk7CisgICAgLyogQWRkcmVzcyBvZiBoZWFkZXIuICAqLworCisgICAgaWYgKG5ldyA9PSAwKQorICAgICAgYWJvcnQoKTsKKworICAgICgoaGVhZGVyICopIG5ldyktPmgubmV4dCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsKKyAgICAoKGhlYWRlciAqKSBuZXcpLT5oLmRlZXAgPSBkZXB0aDsKKworICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IChoZWFkZXIgKikgbmV3OworCisgICAgLyogVXNlciBzdG9yYWdlIGJlZ2lucyBqdXN0IGFmdGVyIGhlYWRlci4gICovCisKKyAgICByZXR1cm4gKHBvaW50ZXIpICgoY2hhciAqKSBuZXcgKyBzaXplb2YgKGhlYWRlcikpOworICB9Cit9CisKKyNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKKworI2lmZGVmIERFQlVHX0kwMEFGVU5DCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaWZuZGVmIENSQVlfU1RBQ0sKKyNkZWZpbmUgQ1JBWV9TVEFDSworI2lmbmRlZiBDUkFZMgorLyogU3RhY2sgc3RydWN0dXJlcyBmb3IgQ1JBWS0xLCBDUkFZIFgtTVAsIGFuZCBDUkFZIFktTVAgKi8KK3N0cnVjdCBzdGFja19jb250cm9sX2hlYWRlcgorICB7CisgICAgbG9uZyBzaGdyb3c6MzI7CQkvKiBOdW1iZXIgb2YgdGltZXMgc3RhY2sgaGFzIGdyb3duLiAgKi8KKyAgICBsb25nIHNoYXNlZzozMjsJCS8qIFNpemUgb2YgaW5jcmVtZW50cyB0byBzdGFjay4gICovCisgICAgbG9uZyBzaGh3bTozMjsJCS8qIEhpZ2ggd2F0ZXIgbWFyayBvZiBzdGFjay4gICovCisgICAgbG9uZyBzaHNpemU6MzI7CQkvKiBDdXJyZW50IHNpemUgb2Ygc3RhY2sgKGFsbCBzZWdtZW50cykuICAqLworICB9OworCisvKiBUaGUgc3RhY2sgc2VnbWVudCBsaW5rYWdlIGNvbnRyb2wgaW5mb3JtYXRpb24gb2NjdXJzIGF0CisgICB0aGUgaGlnaC1hZGRyZXNzIGVuZCBvZiBhIHN0YWNrIHNlZ21lbnQuICAoVGhlIHN0YWNrCisgICBncm93cyBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuKSAgVGhlIGluaXRpYWwKKyAgIHBhcnQgb2YgdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIGlzCisgICAwMjAwIChvY3RhbCkgd29yZHMuICBUaGlzIHByb3ZpZGVzIGZvciByZWdpc3RlciBzdG9yYWdlCisgICBmb3IgdGhlIHJvdXRpbmUgd2hpY2ggb3ZlcmZsb3dzIHRoZSBzdGFjay4gICovCisKK3N0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UKKyAgeworICAgIGxvbmcgc3NbMDIwMF07CQkvKiAwMjAwIG92ZXJmbG93IHdvcmRzLiAgKi8KKyAgICBsb25nIHNzc2l6ZTozMjsJCS8qIE51bWJlciBvZiB3b3JkcyBpbiB0aGlzIHNlZ21lbnQuICAqLworICAgIGxvbmcgc3NiYXNlOjMyOwkJLyogT2Zmc2V0IHRvIHN0YWNrIGJhc2UuICAqLworICAgIGxvbmc6MzI7CisgICAgbG9uZyBzc3BzZWc6MzI7CQkvKiBPZmZzZXQgdG8gbGlua2FnZSBjb250cm9sIG9mIHByZXZpb3VzCisJCQkJICAgc2VnbWVudCBvZiBzdGFjay4gICovCisgICAgbG9uZzozMjsKKyAgICBsb25nIHNzdGNwdDozMjsJCS8qIFBvaW50ZXIgdG8gdGFzayBjb21tb24gYWRkcmVzcyBibG9jay4gICovCisgICAgbG9uZyBzc2Nzbm07CQkvKiBQcml2YXRlIGNvbnRyb2wgc3RydWN0dXJlIG51bWJlciBmb3IKKwkJCQkgICBtaWNyb3Rhc2tpbmcuICAqLworICAgIGxvbmcgc3N1c3IxOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLworICAgIGxvbmcgc3N1c3IyOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLworICAgIGxvbmcgc3N0cGlkOwkJLyogUHJvY2VzcyBJRCBmb3IgcGlkIGJhc2VkIG11bHRpLXRhc2tpbmcuICAqLworICAgIGxvbmcgc3NndnVwOwkJLyogUG9pbnRlciB0byBtdWx0aXRhc2tpbmcgdGhyZWFkIGdpdmV1cC4gICovCisgICAgbG9uZyBzc2NyYXlbN107CQkvKiBSZXNlcnZlZCBmb3IgQ3JheSBSZXNlYXJjaC4gICovCisgICAgbG9uZyBzc2EwOworICAgIGxvbmcgc3NhMTsKKyAgICBsb25nIHNzYTI7CisgICAgbG9uZyBzc2EzOworICAgIGxvbmcgc3NhNDsKKyAgICBsb25nIHNzYTU7CisgICAgbG9uZyBzc2E2OworICAgIGxvbmcgc3NhNzsKKyAgICBsb25nIHNzczA7CisgICAgbG9uZyBzc3MxOworICAgIGxvbmcgc3NzMjsKKyAgICBsb25nIHNzczM7CisgICAgbG9uZyBzc3M0OworICAgIGxvbmcgc3NzNTsKKyAgICBsb25nIHNzczY7CisgICAgbG9uZyBzc3M3OworICB9OworCisjZWxzZSAvKiBDUkFZMiAqLworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdmVjdG9yIG9mIHdvcmRzCisgICByZXR1cm5lZCBieSB0aGUgU1RLU1RBVCBsaWJyYXJ5IHJvdXRpbmUuICAqLworc3RydWN0IHN0a19zdGF0CisgIHsKKyAgICBsb25nIG5vdzsJCQkvKiBDdXJyZW50IHRvdGFsIHN0YWNrIHNpemUuICAqLworICAgIGxvbmcgbWF4YzsJCQkvKiBBbW91bnQgb2YgY29udGlndW91cyBzcGFjZSB3aGljaCB3b3VsZAorCQkJCSAgIGJlIHJlcXVpcmVkIHRvIHNhdGlzZnkgdGhlIG1heGltdW0KKwkJCQkgICBzdGFjayBkZW1hbmQgdG8gZGF0ZS4gICovCisgICAgbG9uZyBoaWdoX3dhdGVyOwkJLyogU3RhY2sgaGlnaC13YXRlciBtYXJrLiAgKi8KKyAgICBsb25nIG92ZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayBvdmVyZmxvdyAoJFNUS09GRU4pIGNhbGxzLiAgKi8KKyAgICBsb25nIGhpdHM7CQkJLyogTnVtYmVyIG9mIGludGVybmFsIGJ1ZmZlciBoaXRzLiAgKi8KKyAgICBsb25nIGV4dGVuZHM7CQkvKiBOdW1iZXIgb2YgYmxvY2sgZXh0ZW5zaW9ucy4gICovCisgICAgbG9uZyBzdGtvX21hbGxvY3M7CQkvKiBCbG9jayBhbGxvY2F0aW9ucyBieSAkU1RLT0ZFTi4gICovCisgICAgbG9uZyB1bmRlcmZsb3dzOwkJLyogTnVtYmVyIG9mIHN0YWNrIHVuZGVyZmxvdyBjYWxscyAoJFNUS1JFVE4pLiAgKi8KKyAgICBsb25nIHN0a29fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtSRVROLiAgKi8KKyAgICBsb25nIHN0a21fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtNUkVULiAgKi8KKyAgICBsb25nIHNlZ21lbnRzOwkJLyogQ3VycmVudCBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMuICAqLworICAgIGxvbmcgbWF4czsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBzdGFjayBzZWdtZW50cyBzbyBmYXIuICAqLworICAgIGxvbmcgcGFkX3NpemU7CQkvKiBTdGFjayBwYWQgc2l6ZS4gICovCisgICAgbG9uZyBjdXJyZW50X2FkZHJlc3M7CS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBhZGRyZXNzLiAgKi8KKyAgICBsb25nIGN1cnJlbnRfc2l6ZTsJCS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBzaXplLiAgVGhpcworCQkJCSAgIG51bWJlciBpcyBhY3R1YWxseSBjb3JydXB0ZWQgYnkgU1RLU1RBVCB0bworCQkJCSAgIGluY2x1ZGUgdGhlIGZpZnRlZW4gd29yZCB0cmFpbGVyIGFyZWEuICAqLworICAgIGxvbmcgaW5pdGlhbF9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGluaXRpYWwgc2VnbWVudC4gICovCisgICAgbG9uZyBpbml0aWFsX3NpemU7CQkvKiBTaXplIG9mIGluaXRpYWwgc2VnbWVudC4gICovCisgIH07CisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggdHJhaWxzCisgICBhbnkgc3RhY2sgc2VnbWVudC4gIEkgdGhpbmsgdGhhdCB0aGUgZGVzY3JpcHRpb24gaW4gJ2FzZGVmJyBpcworICAgb3V0IG9mIGRhdGUuICBJIG9ubHkgZGVzY3JpYmUgdGhlIHBhcnRzIHRoYXQgSSBhbSBzdXJlIGFib3V0LiAgKi8KKworc3RydWN0IHN0a190cmFpbGVyCisgIHsKKyAgICBsb25nIHRoaXNfYWRkcmVzczsJCS8qIEFkZHJlc3Mgb2YgdGhpcyBibG9jay4gICovCisgICAgbG9uZyB0aGlzX3NpemU7CQkvKiBTaXplIG9mIHRoaXMgYmxvY2sgKGRvZXMgbm90IGluY2x1ZGUKKwkJCQkgICB0aGlzIHRyYWlsZXIpLiAgKi8KKyAgICBsb25nIHVua25vd24yOworICAgIGxvbmcgdW5rbm93bjM7CisgICAgbG9uZyBsaW5rOwkJCS8qIEFkZHJlc3Mgb2YgdHJhaWxlciBibG9jayBvZiBwcmV2aW91cworCQkJCSAgIHNlZ21lbnQuICAqLworICAgIGxvbmcgdW5rbm93bjU7CisgICAgbG9uZyB1bmtub3duNjsKKyAgICBsb25nIHVua25vd243OworICAgIGxvbmcgdW5rbm93bjg7CisgICAgbG9uZyB1bmtub3duOTsKKyAgICBsb25nIHVua25vd24xMDsKKyAgICBsb25nIHVua25vd24xMTsKKyAgICBsb25nIHVua25vd24xMjsKKyAgICBsb25nIHVua25vd24xMzsKKyAgICBsb25nIHVua25vd24xNDsKKyAgfTsKKworI2VuZGlmIC8qIENSQVkyICovCisjZW5kaWYgLyogbm90IENSQVlfU1RBQ0sgKi8KKworI2lmZGVmIENSQVkyCisvKiBEZXRlcm1pbmUgYSAic3RhY2sgbWVhc3VyZSIgZm9yIGFuIGFyYml0cmFyeSBBRERSRVNTLgorICAgSSBkb3VidCB0aGF0ICJsaW50IiB3aWxsIGxpa2UgdGhpcyBtdWNoLiAgKi8KKworc3RhdGljIGxvbmcKK2kwMGFmdW5jIChsb25nICphZGRyZXNzKQoreworICBzdHJ1Y3Qgc3RrX3N0YXQgc3RhdHVzOworICBzdHJ1Y3Qgc3RrX3RyYWlsZXIgKnRyYWlsZXI7CisgIGxvbmcgKmJsb2NrLCBzaXplOworICBsb25nIHJlc3VsdCA9IDA7CisKKyAgLyogV2Ugd2FudCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzZWdtZW50cy4gIFRoZSBmaXJzdAorICAgICBzdGVwIGlzIHRvIGdldCB0aGUgc3RhY2sgc3RhdHVzIHN0cnVjdHVyZS4gIFdlIGNvdWxkIGRvIHRoaXMKKyAgICAgbW9yZSBxdWlja2x5IGFuZCBtb3JlIGRpcmVjdGx5LCBwZXJoYXBzLCBieSByZWZlcmVuY2luZyB0aGUKKyAgICAgJExNMDAgY29tbW9uIGJsb2NrLCBidXQgSSBrbm93IHRoYXQgdGhpcyB3b3Jrcy4gICovCisKKyAgU1RLU1RBVCAoJnN0YXR1cyk7CisKKyAgLyogU2V0IHVwIHRoZSBpdGVyYXRpb24uICAqLworCisgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIChzdGF0dXMuY3VycmVudF9hZGRyZXNzCisJCQkJICAgICsgc3RhdHVzLmN1cnJlbnRfc2l6ZQorCQkJCSAgICAtIDE1KTsKKworICAvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBzdGFjayBzZWdtZW50LiAgVGhlcmVmb3JlIGl0IGlzCisgICAgIGEgZmF0YWwgZXJyb3IgaWYgInRyYWlsZXIiIGlzIG51bGwuICAqLworCisgIGlmICh0cmFpbGVyID09IDApCisgICAgYWJvcnQgKCk7CisKKyAgLyogRGlzY2FyZCBzZWdtZW50cyB0aGF0IGRvIG5vdCBjb250YWluIG91ciBhcmd1bWVudCBhZGRyZXNzLiAgKi8KKworICB3aGlsZSAodHJhaWxlciAhPSAwKQorICAgIHsKKyAgICAgIGJsb2NrID0gKGxvbmcgKikgdHJhaWxlci0+dGhpc19hZGRyZXNzOworICAgICAgc2l6ZSA9IHRyYWlsZXItPnRoaXNfc2l6ZTsKKyAgICAgIGlmIChibG9jayA9PSAwIHx8IHNpemUgPT0gMCkKKwlhYm9ydCAoKTsKKyAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7CisgICAgICBpZiAoKGJsb2NrIDw9IGFkZHJlc3MpICYmIChhZGRyZXNzIDwgKGJsb2NrICsgc2l6ZSkpKQorCWJyZWFrOworICAgIH0KKworICAvKiBTZXQgdGhlIHJlc3VsdCB0byB0aGUgb2Zmc2V0IGluIHRoaXMgc2VnbWVudCBhbmQgYWRkIHRoZSBzaXplcworICAgICBvZiBhbGwgcHJlZGVjZXNzb3Igc2VnbWVudHMuICAqLworCisgIHJlc3VsdCA9IGFkZHJlc3MgLSBibG9jazsKKworICBpZiAodHJhaWxlciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgIGRvCisgICAgeworICAgICAgaWYgKHRyYWlsZXItPnRoaXNfc2l6ZSA8PSAwKQorCWFib3J0ICgpOworICAgICAgcmVzdWx0ICs9IHRyYWlsZXItPnRoaXNfc2l6ZTsKKyAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7CisgICAgfQorICB3aGlsZSAodHJhaWxlciAhPSAwKTsKKworICAvKiBXZSBhcmUgZG9uZS4gIE5vdGUgdGhhdCBpZiB5b3UgcHJlc2VudCBhIGJvZ3VzIGFkZHJlc3MgKG9uZQorICAgICBub3QgaW4gYW55IHNlZ21lbnQpLCB5b3Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbnVtYmVyIGJhY2ssIGZvcm1lZAorICAgICBmcm9tIHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBibG9jay4gIFRoaXMgaXMgcHJvYmFibHkKKyAgICAgbm90IHdoYXQgeW91IHdhbnQuICAqLworCisgIHJldHVybiAocmVzdWx0KTsKK30KKworI2Vsc2UgLyogbm90IENSQVkyICovCisvKiBTdGFjayBhZGRyZXNzIGZ1bmN0aW9uIGZvciBhIENSQVktMSwgQ1JBWSBYLU1QLCBvciBDUkFZIFktTVAuCisgICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aGUgY2VsbCB3aXRoaW4gdGhlIHN0YWNrLAorICAgZ2l2ZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNlbGwuICBUaGUgcHVycG9zZSBvZiB0aGlzCisgICByb3V0aW5lIGlzIHRvIGxpbmVhcml6ZSwgaW4gc29tZSBzZW5zZSwgc3RhY2sgYWRkcmVzc2VzCisgICBmb3IgYWxsb2NhLiAgKi8KKworc3RhdGljIGxvbmcKK2kwMGFmdW5jIChsb25nIGFkZHJlc3MpCit7CisgIGxvbmcgc3RrbCA9IDA7CisKKyAgbG9uZyBzaXplLCBwc2VnLCB0aGlzX3NlZ21lbnQsIHN0YWNrOworICBsb25nIHJlc3VsdCA9IDA7CisKKyAgc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqc3NwdHI7CisKKyAgLyogUmVnaXN0ZXIgQjY3IGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlCisgICAgIGN1cnJlbnQgc3RhY2sgc2VnbWVudC4gIElmIHlvdSAoYXMgYSBzdWJwcm9ncmFtKSBzdG9yZQorICAgICB5b3VyIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2sgYW5kIGZpbmQgdGhhdCB5b3UgYXJlIHBhc3QKKyAgICAgdGhlIGNvbnRlbnRzIG9mIEI2NywgeW91IGhhdmUgb3ZlcmZsb3dlZCB0aGUgc2VnbWVudC4KKworICAgICBCNjcgYWxzbyBwb2ludHMgdG8gdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sCisgICAgIGFyZWEsIHdoaWNoIGlzIHdoYXQgd2UgYXJlIHJlYWxseSBpbnRlcmVzdGVkIGluLiAgKi8KKworICBzdGtsID0gQ1JBWV9TVEFDS1NFR19FTkQgKCk7CisgIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKKworICAvKiBJZiBvbmUgc3VidHJhY3RzICdzaXplJyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQsCisgICAgIG9uZSBoYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlZ21lbnQuCisKKyAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHNlZ21lbnQsICdwc2VnJyB3aWxsIGJlCisgICAgIG5vbnplcm8uICAqLworCisgIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOworICBzaXplID0gc3NwdHItPnNzc2l6ZTsKKworICB0aGlzX3NlZ21lbnQgPSBzdGtsIC0gc2l6ZTsKKworICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGNhbGxpbmcgdGhpcyByb3V0aW5lIGl0c2VsZiBjYXVzZWQKKyAgICAgYSBzdGFjayBvdmVyZmxvdy4gIERpc2NhcmQgc3RhY2sgc2VnbWVudHMgd2hpY2ggZG8gbm90CisgICAgIGNvbnRhaW4gdGhlIHRhcmdldCBhZGRyZXNzLiAgKi8KKworICB3aGlsZSAoISh0aGlzX3NlZ21lbnQgPD0gYWRkcmVzcyAmJiBhZGRyZXNzIDw9IHN0a2wpKQorICAgIHsKKyNpZmRlZiBERUJVR19JMDBBRlVOQworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAxMW8gJTAxMW8gJTAxMW9cbiIsIHRoaXNfc2VnbWVudCwgYWRkcmVzcywgc3RrbCk7CisjZW5kaWYKKyAgICAgIGlmIChwc2VnID09IDApCisJYnJlYWs7CisgICAgICBzdGtsID0gc3RrbCAtIHBzZWc7CisgICAgICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7CisgICAgICBzaXplID0gc3NwdHItPnNzc2l6ZTsKKyAgICAgIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOworICAgICAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7CisgICAgfQorCisgIHJlc3VsdCA9IGFkZHJlc3MgLSB0aGlzX3NlZ21lbnQ7CisKKyAgLyogSWYgeW91IHN1YnRyYWN0IHBzZWcgZnJvbSB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHN0YWNrLAorICAgICB5b3UgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBwcmV2aW91cyBzdGFjayBzZWdtZW50J3MgZW5kLgorICAgICBUaGlzIHNlZW1zIGEgbGl0dGxlIGNvbnZvbHV0ZWQgdG8gbWUsIGJ1dCBJJ2xsIGJldCB5b3Ugc2F2ZQorICAgICBhIGN5Y2xlIHNvbWV3aGVyZS4gICovCisKKyAgd2hpbGUgKHBzZWcgIT0gMCkKKyAgICB7CisjaWZkZWYgREVCVUdfSTAwQUZVTkMKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvXG4iLCBwc2VnLCBzaXplKTsKKyNlbmRpZgorICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOworICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOworICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7CisgICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKKyAgICAgIHJlc3VsdCArPSBzaXplOworICAgIH0KKyAgcmV0dXJuIChyZXN1bHQpOworfQorCisjZW5kaWYgLyogbm90IENSQVkyICovCisjZW5kaWYgLyogQ1JBWSAqLworCisjZW5kaWYgLyogbm8gYWxsb2NhICovCisjZW5kaWYgLyogbm90IEdDQyB2ZXJzaW9uIDIgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hcmd2LmMgYi9saWJpYmVydHkvYXJndi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzE3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvYXJndi5jCkBAIC0wLDAgKzEsMzkwIEBACisvKiBDcmVhdGUgYW5kIGRlc3Ryb3kgYXJndW1lbnQgdmVjdG9ycyAoYXJndidzKQorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCitMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0xpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiAgQ3JlYXRlIGFuZCBkZXN0cm95IGFyZ3VtZW50IHZlY3RvcnMuICBBbiBhcmd1bWVudCB2ZWN0b3IgaXMgc2ltcGx5IGFuCisgICAgYXJyYXkgb2Ygc3RyaW5nIHBvaW50ZXJzLCB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBwb2ludGVyLiAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworI2lmZGVmIGlzc3BhY2UKKyN1bmRlZiBpc3NwYWNlCisjZW5kaWYKKyNkZWZpbmUgaXNzcGFjZShjaCkgKChjaCkgPT0gJyAnIHx8IChjaCkgPT0gJ1x0JykKKworLyogIFJvdXRpbmVzIGltcG9ydGVkIGZyb20gc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcmllcy4gKi8KKworI2lmZGVmIF9fU1REQ19fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2V4dGVybiB2b2lkICptZW1jcHkgKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOwkvKiA0LjExLjIuMSAqLworZXh0ZXJuIHNpemVfdCBzdHJsZW4gKGNvbnN0IGNoYXIgKnMpOwkJCQkvKiA0LjExLjYuMyAqLworZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IHNpemUpOwkJCQkvKiA0LjEwLjMuMyAqLworZXh0ZXJuIHZvaWQgKnJlYWxsb2MgKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwkJCS8qIDQuMTAuMy40ICovCitleHRlcm4gdm9pZCBmcmVlICh2b2lkICpwdHIpOwkJCQkJLyogNC4xMC4zLjIgKi8KK2V4dGVybiBjaGFyICpzdHJkdXAgKGNvbnN0IGNoYXIgKnMpOwkJCQkvKiBOb24tQU5TSSAqLworCisjZWxzZQkvKiAhX19TVERDX18gKi8KKworI2lmICFkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fR05VQ19fCitleHRlcm4gY2hhciAqbWVtY3B5ICgpOwkJLyogQ29weSBtZW1vcnkgcmVnaW9uICovCitleHRlcm4gaW50IHN0cmxlbiAoKTsJCS8qIENvdW50IGxlbmd0aCBvZiBzdHJpbmcgKi8KK2V4dGVybiBjaGFyICptYWxsb2MgKCk7CQkvKiBTdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGVyICovCitleHRlcm4gY2hhciAqcmVhbGxvYyAoKTsJLyogU3RhbmRhcmQgbWVtb3J5IHJlYWxsb2NhdG9yICovCitleHRlcm4gdm9pZCBmcmVlICgpOwkJLyogRnJlZSBtYWxsb2MnZCBtZW1vcnkgKi8KK2V4dGVybiBjaGFyICpzdHJkdXAgKCk7CQkvKiBEdXBsaWNhdGUgYSBzdHJpbmcgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogX19TVERDX18gKi8KKworI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisjaWZuZGVmIEVPUworI2RlZmluZSBFT1MgJ1wwJworI2VuZGlmCisKKyNkZWZpbmUgSU5JVElBTF9NQVhBUkdDIDgJLyogTnVtYmVyIG9mIGFyZ3MgKyBOVUxMIGluIGluaXRpYWwgYXJndiAqLworCisKKy8qCisKK05BTUUKKworCWR1cGFyZ3YgLS0gZHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3RvcgorCitTWU5PUFNJUworCisJY2hhciAqKmR1cGFyZ3YgKHZlY3RvcikKKwljaGFyICoqdmVjdG9yOworCitERVNDUklQVElPTgorCisJRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gIFNpbXBseSBzY2FucyB0aHJvdWdoIHRoZQorCXZlY3RvciwgZHVwbGljYXRpbmcgZWFjaCBhcmd1bWVudCB1bnRpbCB0aGUKKwl0ZXJtaW5hdGluZyBOVUxMIGlzIGZvdW5kLgorCitSRVRVUk5TCisKKwlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgdmVjdG9yIGlmCisJc3VjY2Vzc2Z1bC4gUmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgdG8KKwljb21wbGV0ZSBidWlsZGluZyB0aGUgYXJndW1lbnQgdmVjdG9yLgorCisqLworCitjaGFyICoqCitkdXBhcmd2IChhcmd2KQorICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGFyZ2M7CisgIGNoYXIgKipjb3B5OworICAKKyAgaWYgKGFyZ3YgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIC8qIHRoZSB2ZWN0b3IgKi8KKyAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspOworICBjb3B5ID0gKGNoYXIgKiopIG1hbGxvYyAoKGFyZ2MgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7CisgIGlmIChjb3B5ID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICAvKiB0aGUgc3RyaW5ncyAqLworICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7IGFyZ2MrKykKKyAgICB7CisgICAgICBpbnQgbGVuID0gc3RybGVuIChhcmd2W2FyZ2NdKTsKKyAgICAgIGNvcHlbYXJnY10gPSBtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIChsZW4gKyAxKSk7CisgICAgICBpZiAoY29weVthcmdjXSA9PSBOVUxMKQorCXsKKwkgIGZyZWVhcmd2IChjb3B5KTsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIHN0cmNweSAoY29weVthcmdjXSwgYXJndlthcmdjXSk7CisgICAgfQorICBjb3B5W2FyZ2NdID0gTlVMTDsKKyAgcmV0dXJuIGNvcHk7Cit9CisKKy8qCisKK05BTUUKKworCWZyZWVhcmd2IC0tIGZyZWUgYW4gYXJndW1lbnQgdmVjdG9yCisKK1NZTk9QU0lTCisKKwl2b2lkIGZyZWVhcmd2ICh2ZWN0b3IpCisJY2hhciAqKnZlY3RvcjsKKworREVTQ1JJUFRJT04KKworCUZyZWUgYW4gYXJndW1lbnQgdmVjdG9yIHRoYXQgd2FzIGJ1aWx0IHVzaW5nIGJ1aWxkYXJndi4gIFNpbXBseSBzY2FucworCXRocm91Z2ggdGhlIHZlY3RvciwgZnJlZWluZyB0aGUgbWVtb3J5IGZvciBlYWNoIGFyZ3VtZW50IHVudGlsIHRoZQorCXRlcm1pbmF0aW5nIE5VTEwgaXMgZm91bmQsIGFuZCB0aGVuIGZyZWVzIHRoZSB2ZWN0b3IgaXRzZWxmLgorCitSRVRVUk5TCisKKwlObyB2YWx1ZS4KKworKi8KKwordm9pZCBmcmVlYXJndiAodmVjdG9yKQorY2hhciAqKnZlY3RvcjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqKnNjYW47CisKKyAgaWYgKHZlY3RvciAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoc2NhbiA9IHZlY3RvcjsgKnNjYW4gIT0gTlVMTDsgc2NhbisrKQorCXsKKwkgIGZyZWUgKCpzY2FuKTsKKwl9CisgICAgICBmcmVlICh2ZWN0b3IpOworICAgIH0KK30KKworLyoKKworTkFNRQorCisJYnVpbGRhcmd2IC0tIGJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nCisKK1NZTk9QU0lTCisKKwljaGFyICoqYnVpbGRhcmd2IChzcCkKKwljaGFyICpzcDsKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgcG9pbnRlciB0byBhIHN0cmluZywgcGFyc2UgdGhlIHN0cmluZyBleHRyYWN0aW5nIGZpZWxkcworCXNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIGFuZCBvcHRpb25hbGx5IGVuY2xvc2VkIHdpdGhpbiBlaXRoZXIgc2luZ2xlCisJb3IgZG91YmxlIHF1b3RlcyAod2hpY2ggYXJlIHN0cmlwcGVkIG9mZiksIGFuZCBidWlsZCBhIHZlY3RvciBvZgorCXBvaW50ZXJzIHRvIGNvcGllcyBvZiB0aGUgc3RyaW5nIGZvciBlYWNoIGZpZWxkLiAgVGhlIGlucHV0IHN0cmluZworCXJlbWFpbnMgdW5jaGFuZ2VkLgorCisJQWxsIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSBwb2ludGVyIGFycmF5IGFuZCBjb3BpZXMgb2YgdGhlIHN0cmluZworCWlzIG9idGFpbmVkIGZyb20gbWFsbG9jLiAgQWxsIG9mIHRoZSBtZW1vcnkgY2FuIGJlIHJldHVybmVkIHRvIHRoZQorCXN5c3RlbSB3aXRoIHRoZSBzaW5nbGUgZnVuY3Rpb24gY2FsbCBmcmVlYXJndiwgd2hpY2ggdGFrZXMgdGhlCisJcmV0dXJuZWQgcmVzdWx0IG9mIGJ1aWxkYXJndiwgYXMgaXQncyBhcmd1bWVudC4KKworCVRoZSBtZW1vcnkgZm9yIHRoZSBhcmd2IGFycmF5IGlzIGR5bmFtaWNhbGx5IGV4cGFuZGVkIGFzIG5lY2Vzc2FyeS4KKworUkVUVVJOUworCisJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IHZlY3RvciBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIE5VTEwKKwlpZiB0aGUgaW5wdXQgc3RyaW5nIHBvaW50ZXIgaXMgTlVMTCBvciBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQKKwltZW1vcnkgdG8gY29tcGxldGUgYnVpbGRpbmcgdGhlIGFyZ3VtZW50IHZlY3Rvci4KKworTk9URVMKKworCUluIG9yZGVyIHRvIHByb3ZpZGUgYSB3b3JraW5nIGJ1ZmZlciBmb3IgZXh0cmFjdGluZyBhcmd1bWVudHMgaW50bywKKwl3aXRoIGFwcHJvcHJpYXRlIHN0cmlwcGluZyBvZiBxdW90ZXMgYW5kIHRyYW5zbGF0aW9uIG9mIGJhY2tzbGFzaAorCXNlcXVlbmNlcywgd2UgYWxsb2NhdGUgYSB3b3JraW5nIGJ1ZmZlciBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBpbnB1dAorCXN0cmluZy4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBzcGFjZSBpbiB3aGljaCB0bworCXdvcmssIHNpbmNlIHRoZSBleHRyYWN0ZWQgYXJnIGlzIG5ldmVyIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBzdHJpbmcuCisKKwlJZiB0aGUgaW5wdXQgaXMgYSBudWxsIHN0cmluZyAoYXMgb3Bwb3NlZCB0byBhIE5VTEwgcG9pbnRlciksIHRoZW4KKwlidWlsZGFyZyByZXR1cm5zIGFuIGFyZ3YgdGhhdCBoYXMgb25lIGFyZywgYSBudWxsIHN0cmluZy4KKworCUFyZ3YgaXMgYWx3YXlzIGtlcHQgdGVybWluYXRlZCB3aXRoIGEgTlVMTCBhcmcgcG9pbnRlciwgc28gaXQgY2FuCisJYmUgcGFzc2VkIHRvIGZyZWVhcmd2IGF0IGFueSB0aW1lLCBvciByZXR1cm5lZCwgYXMgYXBwcm9wcmlhdGUuCisqLworCitjaGFyICoqYnVpbGRhcmd2IChpbnB1dCkKK2NoYXIgKmlucHV0OworeworICBjaGFyICphcmc7CisgIGNoYXIgKmNvcHlidWY7CisgIGludCBzcXVvdGUgPSAwOworICBpbnQgZHF1b3RlID0gMDsKKyAgaW50IGJzcXVvdGUgPSAwOworICBpbnQgYXJnYyA9IDA7CisgIGludCBtYXhhcmdjID0gMDsKKyAgY2hhciAqKmFyZ3YgPSBOVUxMOworICBjaGFyICoqbmFyZ3Y7CisKKyAgaWYgKGlucHV0ICE9IE5VTEwpCisgICAgeworICAgICAgY29weWJ1ZiA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChpbnB1dCkgKyAxKTsKKyAgICAgIC8qIElzIGEgZG97fXdoaWxlIHRvIGFsd2F5cyBleGVjdXRlIHRoZSBsb29wIG9uY2UuICBBbHdheXMgcmV0dXJuIGFuCisJIGFyZ3YsIGV2ZW4gZm9yIG51bGwgc3RyaW5ncy4gIFNlZSBOT1RFUyBhYm92ZSwgdGVzdCBjYXNlIGJlbG93LiAqLworICAgICAgZG8KKwl7CisJICAvKiBQaWNrIG9mZiBhcmd2W2FyZ2NdICovCisJICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKKwkgICAgeworCSAgICAgIGlucHV0Kys7CisJICAgIH0KKwkgIGlmICgobWF4YXJnYyA9PSAwKSB8fCAoYXJnYyA+PSAobWF4YXJnYyAtIDEpKSkKKwkgICAgeworCSAgICAgIC8qIGFyZ3YgbmVlZHMgaW5pdGlhbGl6YXRpb24sIG9yIGV4cGFuc2lvbiAqLworCSAgICAgIGlmIChhcmd2ID09IE5VTEwpCisJCXsKKwkJICBtYXhhcmdjID0gSU5JVElBTF9NQVhBUkdDOworCQkgIG5hcmd2ID0gKGNoYXIgKiopIG1hbGxvYyAobWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBtYXhhcmdjICo9IDI7CisJCSAgbmFyZ3YgPSAoY2hhciAqKikgcmVhbGxvYyAoYXJndiwgbWF4YXJnYyAqIHNpemVvZiAoY2hhciAqKSk7CisJCX0KKwkgICAgICBpZiAobmFyZ3YgPT0gTlVMTCkKKwkJeworCQkgIGlmIChhcmd2ICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGZyZWVhcmd2IChhcmd2KTsKKwkJICAgICAgYXJndiA9IE5VTEw7CisJCSAgICB9CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBhcmd2ID0gbmFyZ3Y7CisJICAgICAgYXJndlthcmdjXSA9IE5VTEw7CisJICAgIH0KKwkgIC8qIEJlZ2luIHNjYW5uaW5nIGFyZyAqLworCSAgYXJnID0gY29weWJ1ZjsKKwkgIHdoaWxlICgqaW5wdXQgIT0gRU9TKQorCSAgICB7CisJICAgICAgaWYgKGlzc3BhY2UgKCppbnB1dCkgJiYgIXNxdW90ZSAmJiAhZHF1b3RlICYmICFic3F1b3RlKQorCQl7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoYnNxdW90ZSkKKwkJICAgIHsKKwkJICAgICAgYnNxdW90ZSA9IDA7CisJCSAgICAgICphcmcrKyA9ICppbnB1dDsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqaW5wdXQgPT0gJ1xcJykKKwkJICAgIHsKKwkJICAgICAgYnNxdW90ZSA9IDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoc3F1b3RlKQorCQkgICAgeworCQkgICAgICBpZiAoKmlucHV0ID09ICdcJycpCisJCQl7CisJCQkgIHNxdW90ZSA9IDA7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgKmFyZysrID0gKmlucHV0OworCQkJfQorCQkgICAgfQorCQkgIGVsc2UgaWYgKGRxdW90ZSkKKwkJICAgIHsKKwkJICAgICAgaWYgKCppbnB1dCA9PSAnIicpCisJCQl7CisJCQkgIGRxdW90ZSA9IDA7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgKmFyZysrID0gKmlucHV0OworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKCppbnB1dCA9PSAnXCcnKQorCQkJeworCQkJICBzcXVvdGUgPSAxOworCQkJfQorCQkgICAgICBlbHNlIGlmICgqaW5wdXQgPT0gJyInKQorCQkJeworCQkJICBkcXVvdGUgPSAxOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgICphcmcrKyA9ICppbnB1dDsKKwkJCX0KKwkJICAgIH0KKwkJICBpbnB1dCsrOworCQl9CisJICAgIH0KKwkgICphcmcgPSBFT1M7CisJICBhcmd2W2FyZ2NdID0gc3RyZHVwIChjb3B5YnVmKTsKKwkgIGlmIChhcmd2W2FyZ2NdID09IE5VTEwpCisJICAgIHsKKwkgICAgICBmcmVlYXJndiAoYXJndik7CisJICAgICAgYXJndiA9IE5VTEw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGFyZ2MrKzsKKwkgIGFyZ3ZbYXJnY10gPSBOVUxMOworCisJICB3aGlsZSAoaXNzcGFjZSAoKmlucHV0KSkKKwkgICAgeworCSAgICAgIGlucHV0Kys7CisJICAgIH0KKwl9CisgICAgICB3aGlsZSAoKmlucHV0ICE9IEVPUyk7CisgICAgfQorICByZXR1cm4gKGFyZ3YpOworfQorCisjaWZkZWYgTUFJTgorCisvKiBTaW1wbGUgbGl0dGxlIHRlc3QgZHJpdmVyLiAqLworCitzdGF0aWMgY2hhciAqdGVzdHNbXSA9Cit7CisgICJhIHNpbXBsZSBjb21tYW5kIGxpbmUiLAorICAiYXJnICdmb28nIGlzIHNpbmdsZSBxdW90ZWQiLAorICAiYXJnIFwiYmFyXCIgaXMgZG91YmxlIHF1b3RlZCIsCisgICJhcmcgXCJmb28gYmFyXCIgaGFzIGVtYmVkZGVkIHdoaXRlc3BhY2UiLAorICAiYXJnICdKYWNrIHNhaWQgXFwnaGlcXCcnIGhhcyBzaW5nbGUgcXVvdGVzIiwKKyAgImFyZyAnSmFjayBzYWlkIFxcXCJoaVxcXCInIGhhcyBkb3VibGUgcXVvdGVzIiwKKyAgImEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgeiAxIDIgMyA0IDUgNiA3IDggOSIsCisgIAorICAvKiBUaGlzIHNob3VsZCBiZSBleHBhbmRlZCBpbnRvIG9ubHkgb25lIGFyZ3VtZW50LiAgKi8KKyAgInRyYWlsaW5nLXdoaXRlc3BhY2UgIiwKKworICAiIiwKKyAgTlVMTAorfTsKKworbWFpbiAoKQoreworICBjaGFyICoqYXJndjsKKyAgY2hhciAqKnRlc3Q7CisgIGNoYXIgKip0YXJnczsKKworICBmb3IgKHRlc3QgPSB0ZXN0czsgKnRlc3QgIT0gTlVMTDsgdGVzdCsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoImJ1aWxkYXJndihcIiVzXCIpXG4iLCAqdGVzdCk7CisgICAgICBpZiAoKGFyZ3YgPSBidWlsZGFyZ3YgKCp0ZXN0KSkgPT0gTlVMTCkKKwl7CisJICBwcmludGYgKCJmYWlsZWQhXG5cbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmb3IgKHRhcmdzID0gYXJndjsgKnRhcmdzICE9IE5VTEw7IHRhcmdzKyspCisJICAgIHsKKwkgICAgICBwcmludGYgKCJcdFwiJXNcIlxuIiwgKnRhcmdzKTsKKwkgICAgfQorCSAgcHJpbnRmICgiXG4iKTsKKwl9CisgICAgICBmcmVlYXJndiAoYXJndik7CisgICAgfQorCit9CisKKyNlbmRpZgkvKiBNQUlOICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXNwcmludGYuYyBiL2xpYmliZXJ0eS9hc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWYzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvYXNwcmludGYuYwpAQCAtMCwwICsxLDU3IEBACisvKiBMaWtlIHNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0CisgICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgorTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgordmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgorbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisjaWYgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSB8fCBkZWZpbmVkIChBTE1PU1RfU1REQykKKyNkZWZpbmUgVVNFX1NUREFSRworI2VuZGlmCisKKyNpZmRlZiBVU0VfU1REQVJHCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisvKiBWQVJBUkdTICovCisjaWZkZWYgVVNFX1NUREFSRworaW50Cithc3ByaW50ZiAoY2hhciAqKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisjZWxzZQoraW50Cithc3ByaW50ZiAoYnVmLCBmbXQsIHZhX2FsaXN0KQorICAgICBjaGFyICoqYnVmOworICAgICBjb25zdCBjaGFyICpmbXQ7CisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIGludCBzdGF0dXM7CisgIHZhX2xpc3QgYXA7CisjaWZkZWYgVVNFX1NUREFSRworICB2YV9zdGFydCAoYXAsIGZtdCk7CisjZWxzZQorICB2YV9zdGFydCAoYXApOworI2VuZGlmCisgIHN0YXR1cyA9IHZhc3ByaW50ZiAoYnVmLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYXRleGl0LmMgYi9saWJpYmVydHkvYXRleGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3ZDk4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9hdGV4aXQuYwpAQCAtMCwwICsxLDE4IEBACisvKiBXcmFwcGVyIHRvIGltcGxlbWVudCBBTlNJIEMncyBhdGV4aXQgdXNpbmcgU3VuT1MncyBvbl9leGl0LiAqLworLyogVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tTWlrZSBTdHVtcC4gKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9PTl9FWElUCisKK2ludAorYXRleGl0KGYpCisgICAgIHZvaWQgKCpmKSgpOworeworICAvKiBJZiB0aGUgc3lzdGVtIGRvZXNuJ3QgcHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIGF0ZXhpdCwgdXNlIG9uX2V4aXQKKyAgICAgaWYgdGhlIHN5c3RlbSBwcm92aWRlcyB0aGF0LiAgKi8KKyAgb25fZXhpdCAoZiwgMCk7CisgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iYXNlbmFtZS5jIGIvbGliaWJlcnR5L2Jhc2VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0NGM4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9iYXNlbmFtZS5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIFJldHVybiB0aGUgYmFzZW5hbWUgb2YgYSBwYXRobmFtZS4KKyAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KKworLyoKK05BTUUKKwliYXNlbmFtZSAtLSByZXR1cm4gcG9pbnRlciB0byBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lCisKK1NZTk9QU0lTCisJY2hhciAqYmFzZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCisKK0RFU0NSSVBUSU9OCisJR2l2ZW4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0eXBpY2FsIHBhdGhuYW1lCisJKC91c3Ivc3JjL2NtZC9scy9scy5jIGZvciBleGFtcGxlKSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisJbGFzdCBjb21wb25lbnQgb2YgdGhlIHBhdGhuYW1lICgibHMuYyIgaW4gdGhpcyBjYXNlKS4KKworQlVHUworCVByZXN1bWVzIGEgVU5JWCBzdHlsZSBwYXRoIHdpdGggVU5JWCBzdHlsZSBzZXBhcmF0b3JzLgorKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKK2NoYXIgKgorYmFzZW5hbWUgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGNvbnN0IGNoYXIgKmJhc2UgPSBuYW1lOworCisgIHdoaWxlICgqbmFtZSkKKyAgICB7CisgICAgICBpZiAoKm5hbWUrKyA9PSAnLycpCisJeworCSAgYmFzZSA9IG5hbWU7CisJfQorICAgIH0KKyAgcmV0dXJuIChjaGFyICopIGJhc2U7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvYmNtcC5jIGIvbGliaWJlcnR5L2JjbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU0NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2JjbXAuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBiY21wCisgICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KKworLyoKKworTkFNRQorCisJYmNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucworCitTWU5PUFNJUworCisJaW50IGJjbXAgKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgY291bnQpCisKK0RFU0NSSVBUSU9OCisKKwlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIHplcm8gaWYgdGhleSBhcmUgaWRlbnRpY2FsLAorCW5vbi16ZXJvIG90aGVyd2lzZS4gIElmIGNvdW50IGlzIHplcm8sIHJldHVybiB6ZXJvLgorCitOT1RFUworCisJTm8gZ3VhcmFudGVlIGlzIG1hZGUgYWJvdXQgdGhlIG5vbi16ZXJvIHJldHVybmVkIHZhbHVlLiAgSW4KKwlwYXJ0aWN1bGFyLCB0aGUgcmVzdWx0cyBtYXkgYmUgc2lnbmZpY2FudGx5IGRpZmZlcmVudCB0aGFuCisJc3RyY21wKCksIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4sCisJZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLCBhY2NvcmRpbmcgdG8gbGV4aWNvZ3JhcGhpY2FsCisJc29ydGluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KKworQlVHUworCisqLworCisKK2ludAorYmNtcCAoZnJvbSwgdG8sIGNvdW50KQorICBjaGFyICpmcm9tLCAqdG87CisgIGludCBjb3VudDsKK3sKKyAgaW50IHJ0bnZhbCA9IDA7CisKKyAgd2hpbGUgKGNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIGlmICgqZnJvbSsrICE9ICp0bysrKQorCXsKKwkgIHJ0bnZhbCA9IDE7CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gKHJ0bnZhbCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iY29weS5jIGIvbGliaWJlcnR5L2Jjb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NTM2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9iY29weS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGJjb3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRhcnkgbGVuZ3RoCisKK05BTUUKKwliY29weSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0cmFyeSBsZW5ndGgKKworU1lOT1BTSVMKKwl2b2lkIGJjb3B5IChjaGFyICppbiwgY2hhciAqb3V0LCBpbnQgbGVuZ3RoKQorCitERVNDUklQVElPTgorCUNvcHkgTEVOR1RIIGJ5dGVzIGZyb20gbWVtb3J5IHJlZ2lvbiBwb2ludGVkIHRvIGJ5IElOIHRvIG1lbW9yeQorCXJlZ2lvbiBwb2ludGVkIHRvIGJ5IE9VVC4KKworQlVHUworCVNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50cyBjYW4gYmUgbWFkZSBpbiBzb21lIGNhc2VzIGJ5CisJaW1wbGVtZW50aW5nIGNvcGllcyBvZiBtdWx0aXBsZSBieXRlcyBzaW11bHRhbmVvdXNseSwgb3IgdW5yb2xsaW5nCisJdGhlIGNvcHkgbG9vcC4KKworKi8KKwordm9pZAorYmNvcHkgKHNyYywgZGVzdCwgbGVuKQorICByZWdpc3RlciBjaGFyICpzcmMsICpkZXN0OworICBpbnQgbGVuOworeworICBpZiAoZGVzdCA8IHNyYykKKyAgICB3aGlsZSAobGVuLS0pCisgICAgICAqZGVzdCsrID0gKnNyYysrOworICBlbHNlCisgICAgeworICAgICAgY2hhciAqbGFzdHMgPSBzcmMgKyAobGVuLTEpOworICAgICAgY2hhciAqbGFzdGQgPSBkZXN0ICsgKGxlbi0xKTsKKyAgICAgIHdoaWxlIChsZW4tLSkKKyAgICAgICAgKihjaGFyICopbGFzdGQtLSA9ICooY2hhciAqKWxhc3RzLS07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2J6ZXJvLmMgYi9saWJpYmVydHkvYnplcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE2NDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2J6ZXJvLmMKQEAgLTAsMCArMSwzMSBAQAorLyogUG9ydGFibGUgdmVyc2lvbiBvZiBiemVybyBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgorICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCisKKy8qCitOQU1FCisJYnplcm8gLS0gemVybyB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbgorCitTWU5PUFNJUworCXZvaWQgYnplcm8gKGNoYXIgKnRvLCBpbnQgY291bnQpCisKK0RFU0NSSVBUSU9OCisJWmVybyBDT1VOVCBieXRlcyBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBUTy4KKworQlVHUworCVNpZ25pZmljYW50IHNwZWVkIGVuaGFuY2VtZW50cyBtYXkgYmUgbWFkZSBpbiBzb21lIGVudmlyb25tZW50cworCWJ5IHplcm9pbmcgbW9yZSB0aGFuIGEgc2luZ2xlIGJ5dGUgYXQgYSB0aW1lLCBvciBieSB1bnJvbGxpbmcgdGhlCisJbG9vcC4KKworKi8KKworCit2b2lkCitiemVybyAodG8sIGNvdW50KQorICBjaGFyICp0bzsKKyAgaW50IGNvdW50OworeworICB3aGlsZSAoY291bnQtLSA+IDApCisgICAgeworICAgICAgKnRvKysgPSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jYWxsb2MuYyBiL2xpYmliZXJ0eS9jYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGMwYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2NhbGxvYy5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorIAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCisvKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCitQVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworCitQVFIKK2NhbGxvYyAobmVsZW0sIGVsc2l6ZSkKKyAgc2l6ZV90IG5lbGVtLCBlbHNpemU7Cit7CisgIHJlZ2lzdGVyIFBUUiBwdHI7ICAKKworICBpZiAobmVsZW0gPT0gMCB8fCBlbHNpemUgPT0gMCkKKyAgICBuZWxlbSA9IGVsc2l6ZSA9IDE7CisgIAorICBwdHIgPSBtYWxsb2MgKG5lbGVtICogZWxzaXplKTsKKyAgaWYgKHB0cikgYnplcm8gKHB0ciwgbmVsZW0gKiBlbHNpemUpOworICAKKyAgcmV0dXJuIHB0cjsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jIGIvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljNzM4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9jaG9vc2UtdGVtcC5jCkBAIC0wLDAgKzEsMjAzIEBACisvKiBVdGlsaXR5IHRvIHBpY2sgYSB0ZW1wb3JhcnkgZmlsZW5hbWUgcHJlZml4LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCitMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0xpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKK3dyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczogY2hvb3NlX3RlbXBfYmFzZSBhbmQgbWFrZV90ZW1wX2ZpbGUuICAqLworCisvKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYXQgbGVhc3QgdHdvIHBsYWNlczogbGliaWJlcnR5IGFuZCBnY2MuCisgICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4JLyogTWF5IGdldCBQX3RtcGRpci4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfRklMRV9ICisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4gICAvKiBNYXkgZ2V0IFJfT0ssIGV0Yy4gb24gc29tZSBzeXN0ZW1zLiAgKi8KKyNlbmRpZgorCisjaWZuZGVmIFJfT0sKKyNkZWZpbmUgUl9PSyA0CisjZGVmaW5lIFdfT0sgMgorI2RlZmluZSBYX09LIDEKKyNlbmRpZgorCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCitleHRlcm4gaW50IG1rc3RlbXBzICgpOworCisjaWZuZGVmIElOX0dDQworI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX1dJTjMyKQorI2RlZmluZSBESVJfU0VQQVJBVE9SICdcXCcKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJworI2VuZGlmCisKKy8qIE9uIE1TRE9TLCB3cml0ZSB0ZW1wIGZpbGVzIGluIGN1cnJlbnQgZGlyCisgICBiZWNhdXNlIHRoZXJlJ3Mgbm8gcGxhY2UgZWxzZSB3ZSBjYW4gZXhwZWN0IHRvIHVzZS4gICovCisvKiA/Pz8gQWx0aG91Z2ggdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHRyaWVkIGFzIGEgbGFzdCByZXNvcnQsCisgICB0aGlzIGlzIGxlZnQgaW4gc28gdGhhdCBvbiBNU0RPUyBpdCBpcyBwcmVmZXJyZWQgdG8gL3RtcCBvbiB0aGUKKyAgIG9mZiBjaGFuY2UgdGhhdCBzb21lb25lIHJlcXVpcmVzIHRoaXMsIHNpbmNlIHRoYXQgd2FzIHRoZSBwcmV2aW91cworICAgYmVoYXZpb3VyLiAgKi8KKyNpZmRlZiBfX01TRE9TX18KKyNpZm5kZWYgUF90bXBkaXIKKyNkZWZpbmUgUF90bXBkaXIgIi4iCisjZW5kaWYKKyNlbmRpZgorCisvKiBOYW1lIG9mIHRlbXBvcmFyeSBmaWxlLgorICAgbWt0ZW1wIHJlcXVpcmVzIDYgdHJhaWxpbmcgWCdzLiAgKi8KKyNkZWZpbmUgVEVNUF9GSUxFICJjY1hYWFhYWCIKKworLyogU3Vicm91dGluZSBvZiBjaG9vc2VfdGVtcF9iYXNlLgorICAgSWYgQkFTRSBpcyBub24tTlVMTCwgcmV0dXJuIGl0LgorICAgT3RoZXJ3aXNlIGl0IGNoZWNrcyBpZiBESVIgaXMgYSB1c2FibGUgZGlyZWN0b3J5LgorICAgSWYgc3VjY2VzcywgRElSIGlzIHJldHVybmVkLgorICAgT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuICAqLworCitzdGF0aWMgY2hhciAqCit0cnkgKGRpciwgYmFzZSkKKyAgICAgY2hhciAqZGlyLCAqYmFzZTsKK3sKKyAgaWYgKGJhc2UgIT0gMCkKKyAgICByZXR1cm4gYmFzZTsKKyAgaWYgKGRpciAhPSAwCisgICAgICAmJiBhY2Nlc3MgKGRpciwgUl9PSyB8IFdfT0sgfCBYX09LKSA9PSAwKQorICAgIHJldHVybiBkaXI7CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gYSBwcmVmaXggZm9yIHRlbXBvcmFyeSBmaWxlIG5hbWVzIG9yIE5VTEwgaWYgdW5hYmxlIHRvIGZpbmQgb25lLgorICAgVGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGNob3NlbiBpZiBhbGwgZWxzZSBmYWlscyBzbyB0aGUgcHJvZ3JhbSBpcworICAgZXhpdGVkIGlmIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjYW4ndCBiZSBmb3VuZCAobWt0ZW1wIGZhaWxzKS4KKyAgIFRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQgaXMgb2J0YWluZWQgd2l0aCB4bWFsbG9jLiAKKworICAgVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgb25seS4gIEl0IHVzZQorICAgaXMgbm90IHJlY29tbWVuZGVkLiAgKi8KKworY2hhciAqCitjaG9vc2VfdGVtcF9iYXNlICgpCit7CisgIGNoYXIgKmJhc2UgPSAwOworICBjaGFyICp0ZW1wX2ZpbGVuYW1lOworICBpbnQgbGVuOworICBzdGF0aWMgY2hhciB0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OworICBzdGF0aWMgY2hhciB1c3J0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3UnLCAncycsICdyJywgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OworCisgIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUERJUiIpLCBiYXNlKTsKKyAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QIiksIGJhc2UpOworICBiYXNlID0gdHJ5IChnZXRlbnYgKCJURU1QIiksIGJhc2UpOworCisjaWZkZWYgUF90bXBkaXIKKyAgYmFzZSA9IHRyeSAoUF90bXBkaXIsIGJhc2UpOworI2VuZGlmCisKKyAgLyogVHJ5IC91c3IvdG1wLCB0aGVuIC90bXAuICAqLworICBiYXNlID0gdHJ5ICh1c3J0bXAsIGJhc2UpOworICBiYXNlID0gdHJ5ICh0bXAsIGJhc2UpOworIAorICAvKiBJZiBhbGwgZWxzZSBmYWlscywgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEgICovCisgIGlmIChiYXNlID09IDApCisgICAgYmFzZSA9ICIuIjsKKworICBsZW4gPSBzdHJsZW4gKGJhc2UpOworICB0ZW1wX2ZpbGVuYW1lID0geG1hbGxvYyAobGVuICsgMSAvKkRJUl9TRVBBUkFUT1IqLworCQkJICAgKyBzdHJsZW4gKFRFTVBfRklMRSkgKyAxKTsKKyAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lLCBiYXNlKTsKKworICBpZiAobGVuICE9IDAKKyAgICAgICYmIHRlbXBfZmlsZW5hbWVbbGVuLTFdICE9ICcvJworICAgICAgJiYgdGVtcF9maWxlbmFtZVtsZW4tMV0gIT0gRElSX1NFUEFSQVRPUikKKyAgICB0ZW1wX2ZpbGVuYW1lW2xlbisrXSA9IERJUl9TRVBBUkFUT1I7CisgIHN0cmNweSAodGVtcF9maWxlbmFtZSArIGxlbiwgVEVNUF9GSUxFKTsKKworICBta3RlbXAgKHRlbXBfZmlsZW5hbWUpOworICBpZiAoc3RybGVuICh0ZW1wX2ZpbGVuYW1lKSA9PSAwKQorICAgIGFib3J0ICgpOworICByZXR1cm4gdGVtcF9maWxlbmFtZTsKK30KKy8qIFJldHVybiBhIHRlbXBvcmFyeSBmaWxlIG5hbWUgKGFzIGEgc3RyaW5nKSBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUKKyAgIG9uZS4gICovCisKK2NoYXIgKgorbWFrZV90ZW1wX2ZpbGUgKHN1ZmZpeCkKKyAgICAgY2hhciAqc3VmZml4OworeworICBjaGFyICpiYXNlID0gMDsKKyAgY2hhciAqdGVtcF9maWxlbmFtZTsKKyAgaW50IGJhc2VfbGVuLCBzdWZmaXhfbGVuOworICBpbnQgZmQ7CisgIHN0YXRpYyBjaGFyIHRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07CisgIHN0YXRpYyBjaGFyIHVzcnRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndScsICdzJywgJ3InLCBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07CisKKyAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QRElSIiksIGJhc2UpOworICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVAiKSwgYmFzZSk7CisgIGJhc2UgPSB0cnkgKGdldGVudiAoIlRFTVAiKSwgYmFzZSk7CisKKyNpZmRlZiBQX3RtcGRpcgorICBiYXNlID0gdHJ5IChQX3RtcGRpciwgYmFzZSk7CisjZW5kaWYKKworICAvKiBUcnkgL3Vzci90bXAsIHRoZW4gL3RtcC4gICovCisgIGJhc2UgPSB0cnkgKHVzcnRtcCwgYmFzZSk7CisgIGJhc2UgPSB0cnkgKHRtcCwgYmFzZSk7CisgCisgIC8qIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ISAgKi8KKyAgaWYgKGJhc2UgPT0gMCkKKyAgICBiYXNlID0gIi4iOworCisgIGJhc2VfbGVuID0gc3RybGVuIChiYXNlKTsKKworICBpZiAoc3VmZml4KQorICAgIHN1ZmZpeF9sZW4gPSBzdHJsZW4gKHN1ZmZpeCk7CisgIGVsc2UKKyAgICBzdWZmaXhfbGVuID0gMDsKKworICB0ZW1wX2ZpbGVuYW1lID0geG1hbGxvYyAoYmFzZV9sZW4gKyAxIC8qRElSX1NFUEFSQVRPUiovCisJCQkgICArIHN0cmxlbiAoVEVNUF9GSUxFKQorCQkJICAgKyBzdWZmaXhfbGVuICsgMSk7CisgIHN0cmNweSAodGVtcF9maWxlbmFtZSwgYmFzZSk7CisKKyAgaWYgKGJhc2VfbGVuICE9IDAKKyAgICAgICYmIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4tMV0gIT0gJy8nCisgICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuLTFdICE9IERJUl9TRVBBUkFUT1IpCisgICAgdGVtcF9maWxlbmFtZVtiYXNlX2xlbisrXSA9IERJUl9TRVBBUkFUT1I7CisgIHN0cmNweSAodGVtcF9maWxlbmFtZSArIGJhc2VfbGVuLCBURU1QX0ZJTEUpOworCisgIGlmIChzdWZmaXgpCisgICAgc3RyY2F0ICh0ZW1wX2ZpbGVuYW1lLCBzdWZmaXgpOworCisgIGZkID0gbWtzdGVtcHMgKHRlbXBfZmlsZW5hbWUsIHN1ZmZpeF9sZW4pOworICAvKiBJZiBta3N0ZW1wcyBmYWlsZWQsIHRoZW4gc29tZXRoaW5nIGJhZCBpcyBoYXBwZW5pbmcuICBNYXliZSB3ZSBzaG91bGQKKyAgICAgaXNzdWUgYSBtZXNzYWdlIGFib3V0IGEgcG9zc2libGUgc2VjdXJpdHkgYXR0YWNrIGluIHByb2dyZXNzPyAgKi8KKyAgaWYgKGZkID09IC0xKQorICAgIGFib3J0ICgpOworICAvKiBTaW1pbGFybHkgaWYgd2UgY2FuIG5vdCBjbG9zZSB0aGUgZmlsZS4gICovCisgIGlmIChjbG9zZSAoZmQpKQorICAgIGFib3J0ICgpOworICByZXR1cm4gdGVtcF9maWxlbmFtZTsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jbG9jay5jIGIvbGliaWJlcnR5L2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyNTA5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9jbG9jay5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEFOU0ktY29tcGF0aWJsZSBjbG9jayBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKK3NvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQordGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcworY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKK3RoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK1RoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKK3RoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmZGVmIEhBVkVfR0VUUlVTQUdFCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9USU1FUworI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIF9TQ19DTEtfVENLCisjZGVmaW5lIEdOVV9IWiAgc3lzY29uZihfU0NfQ0xLX1RDSykKKyNlbHNlCisjaWZkZWYgSFoKKyNkZWZpbmUgR05VX0haICBIWgorI2Vsc2UKKyNpZmRlZiBDTE9DS1NfUEVSX1NFQworI2RlZmluZSBHTlVfSFogIENMT0NLU19QRVJfU0VDCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qIEZJWE1FOiBzaG91bGQgYmUgYWJsZSB0byBkZWNsYXJlIGFzIGNsb2NrX3QuICovCisKK2xvbmcKK2Nsb2NrICgpCit7CisjaWZkZWYgSEFWRV9HRVRSVVNBR0UKKyAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7CisKKyAgZ2V0cnVzYWdlICgwLCAmcnVzYWdlKTsKKyAgcmV0dXJuIChydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV91dGltZS50dl91c2VjCisJICArIHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOworI2Vsc2UKKyNpZmRlZiBIQVZFX1RJTUVTCisgIHN0cnVjdCB0bXMgdG1zOworCisgIHRpbWVzICgmdG1zKTsKKyAgcmV0dXJuICh0bXMudG1zX3V0aW1lICsgdG1zLnRtc19zdGltZSkgKiAoMTAwMDAwMCAvIEdOVV9IWik7CisjZWxzZQorI2lmZGVmIFZNUworICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQgcHJvY191c2VyX3RpbWU7CisgICAgICBpbnQgcHJvY19zeXN0ZW1fdGltZTsKKyAgICAgIGludCBjaGlsZF91c2VyX3RpbWU7CisgICAgICBpbnQgY2hpbGRfc3lzdGVtX3RpbWU7CisgICAgfSB2bXNfdGltZXM7CisKKyAgdGltZXMgKCZ2bXNfdGltZXMpOworICByZXR1cm4gKHZtc190aW1lcy5wcm9jX3VzZXJfdGltZSArIHZtc190aW1lcy5wcm9jX3N5c3RlbV90aW1lKSAqIDEwMDAwOworI2Vsc2UKKyAgLyogQSBmYWxsYmFjaywgaWYgbm90aGluZyBlbHNlIGF2YWlsYWJsZS4gKi8KKyAgcmV0dXJuIDA7CisjZW5kaWYgLyogVk1TICovCisjZW5kaWYgLyogSEFWRV9USU1FUyAqLworI2VuZGlmIC8qIEhBVkVfR0VUUlVTQUdFICovCit9CisKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25jYXQuYyBiL2xpYmliZXJ0eS9jb25jYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjEzMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2NvbmNhdC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBDb25jYXRlbmF0ZSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncy4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgorTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgordmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgorbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworLyoKKworTkFNRQorCisJY29uY2F0IC0tIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MKKworU1lOT1BTSVMKKworCSNpbmNsdWRlIDx2YXJhcmdzLmg+CisKKwljaGFyICpjb25jYXQgKHMxLCBzMiwgczMsIC4uLiwgTlVMTCkKKworREVTQ1JJUFRJT04KKworCUNvbmNhdGVuYXRlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmluZ3MgYW5kIHJldHVybiB0aGUgcmVzdWx0CisJaW4gZnJlc2hseSBtYWxsb2MnZCBtZW1vcnkuCisKKwlSZXR1cm5zIE5VTEwgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUuICBUaGUgYXJndW1lbnQKKwlsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0IE5VTEwgcG9pbnRlciBlbmNvdW50ZXJlZC4gIFBvaW50ZXJzCisJdG8gZW1wdHkgc3RyaW5ncyBhcmUgaWdub3JlZC4KKworTk9URVMKKworCVRoaXMgZnVuY3Rpb24gdXNlcyB4bWFsbG9jKCkgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBmcm9udCBlbmQKKwlmdW5jdGlvbiB0byBtYWxsb2MoKSB0aGF0IGRlYWxzIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zLiAgSW4KKwl0eXBpY2FsIHVzZSwgaWYgbWFsbG9jKCkgcmV0dXJucyBOVUxMIHRoZW4geG1hbGxvYygpIGRpdmVydHMgdG8gYW4KKwllcnJvciBoYW5kbGVyIHJvdXRpbmUgd2hpY2ggbmV2ZXIgcmV0dXJucywgYW5kIHRodXMgeG1hbGxvYyB3aWxsCisJbmV2ZXIgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiAgSWYgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB3aXNoZXMgdG8KKwlkZWFsIHdpdGggbG93IG1lbW9yeSBzaXR1YXRpb25zIGl0c2VsZiwgaXQgc2hvdWxkIHN1cHBseSBhbiB4bWFsbG9jCisJdGhhdCBqdXN0IGRpcmVjdGx5IGludm9rZXMgbWFsbG9jIGFuZCBibGluZGx5IHJldHVybnMgd2hhdGV2ZXIKKwltYWxsb2MgcmV0dXJucy4KKyovCisKKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorZXh0ZXJuIHNpemVfdCBzdHJsZW4gKGNvbnN0IGNoYXIgKnMpOworI2Vsc2UKK2V4dGVybiBpbnQgc3RybGVuICgpOworI2VuZGlmCisKKyNkZWZpbmUgTlVMTFAgKGNoYXIgKikwCisKKy8qIFZBUkFSR1MgKi8KKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK2NoYXIgKgorY29uY2F0IChjb25zdCBjaGFyICpmaXJzdCwgLi4uKQorI2Vsc2UKK2NoYXIgKgorY29uY2F0ICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbmd0aDsKKyAgcmVnaXN0ZXIgY2hhciAqbmV3c3RyOworICByZWdpc3RlciBjaGFyICplbmQ7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmFyZzsKKyAgdmFfbGlzdCBhcmdzOworI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgY29uc3QgY2hhciAqZmlyc3Q7CisjZW5kaWYKKworICAvKiBGaXJzdCBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSByZXN1bHQgYW5kIGdldCBzdWZmaWNpZW50IG1lbW9yeS4gKi8KKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgZmlyc3QpOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBmaXJzdCA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisgIGlmIChmaXJzdCA9PSBOVUxMUCkKKyAgICBsZW5ndGggPSAwOworICBlbHNlCisgICAgeworICAgICAgbGVuZ3RoID0gc3RybGVuIChmaXJzdCk7CisgICAgICB3aGlsZSAoKGFyZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKSkgIT0gTlVMTFApCisJeworCSAgbGVuZ3RoICs9IHN0cmxlbiAoYXJnKTsKKwl9CisgICAgfQorICBuZXdzdHIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW5ndGggKyAxKTsKKyAgdmFfZW5kIChhcmdzKTsKKworICAvKiBOb3cgY29weSB0aGUgaW5kaXZpZHVhbCBwaWVjZXMgdG8gdGhlIHJlc3VsdCBzdHJpbmcuICovCisKKyAgaWYgKG5ld3N0ciAhPSBOVUxMUCkKKyAgICB7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgICAgICB2YV9zdGFydCAoYXJncywgZmlyc3QpOworI2Vsc2UKKyAgICAgIHZhX3N0YXJ0IChhcmdzKTsKKyAgICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOworI2VuZGlmCisgICAgICBlbmQgPSBuZXdzdHI7CisgICAgICBpZiAoZmlyc3QgIT0gTlVMTFApCisJeworCSAgYXJnID0gZmlyc3Q7CisJICB3aGlsZSAoKmFyZykKKwkgICAgeworCSAgICAgICplbmQrKyA9ICphcmcrKzsKKwkgICAgfQorCSAgd2hpbGUgKChhcmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKikpICE9IE5VTExQKQorCSAgICB7CisJICAgICAgd2hpbGUgKCphcmcpCisJCXsKKwkJICAqZW5kKysgPSAqYXJnKys7CisJCX0KKwkgICAgfQorCX0KKyAgICAgICplbmQgPSAnXDAwMCc7CisgICAgICB2YV9lbmQgKGFyZ3MpOworICAgIH0KKworICByZXR1cm4gKG5ld3N0cik7Cit9CisKKyNpZmRlZiBNQUlOCisKKy8qIFNpbXBsZSBsaXR0bGUgdGVzdCBkcml2ZXIuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKCkKK3sKKyAgcHJpbnRmICgiXCJcIiA9IFwiJXNcIlxuIiwgY29uY2F0IChOVUxMUCkpOworICBwcmludGYgKCJcImFcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsIE5VTExQKSk7CisgIHByaW50ZiAoIlwiYWJcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgTlVMTFApKTsKKyAgcHJpbnRmICgiXCJhYmNcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYSIsICJiIiwgImMiLCBOVUxMUCkpOworICBwcmludGYgKCJcImFiY2RcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYWIiLCAiY2QiLCBOVUxMUCkpOworICBwcmludGYgKCJcImFiY2RlXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoImFiIiwgImMiLCAiZGUiLCBOVUxMUCkpOworICBwcmludGYgKCJcImFiY2RlZlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCIiLCAiYSIsICIiLCAiYmNkIiwgImVmIiwgTlVMTFApKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy5oLXZtcyBiL2xpYmliZXJ0eS9jb25maWcuaC12bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhYzZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9jb25maWcuaC12bXMKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBORUVEX3N0cmVycm9yCisjZGVmaW5lIE5FRURfc3RyZXJyb3IKKyNlbmRpZgorI2lmbmRlZiBORUVEX2Jhc2VuYW1lCisjZGVmaW5lIE5FRURfYmFzZW5hbWUKKyNlbmRpZgorI2lmbmRlZiBORUVEX3BzaWduYWwKKyNkZWZpbmUgTkVFRF9wc2lnbmFsCisjZW5kaWYKKyNpZm5kZWYgTkVFRF9vbl9leGl0CisjZGVmaW5lIE5FRURfb25fZXhpdAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcuaW4gYi9saWJpYmVydHkvY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzJkODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY29uZmlnLmluCkBAIC0wLDAgKzEsMjAzIEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfV0FJVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8dmZvcmsuaD4uICAqLworI3VuZGVmIEhBVkVfVkZPUktfSAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgcGlkX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB2Zm9yayBhcyBmb3JrIGlmIHZmb3JrIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIHZmb3JrCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX2Vycmxpc3QgdmFyaWFibGUuICAqLworI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfbmVyciB2YXJpYWJsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfTkVSUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19zaWdsaXN0IHZhcmlhYmxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19TSUdMSVNUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSRVJST1IKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhc3ByaW50ZiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9BU1BSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGF0ZXhpdCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9BVEVYSVQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiYXNlbmFtZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9CQVNFTkFNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQkNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJjb3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0JDT1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYnplcm8gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQlpFUk8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjYWxsb2MgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQ0FMTE9DCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2xvY2sgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQ0xPQ0sKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaW5kZXggZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfSU5ERVgKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpbnNxdWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfSU5TUVVFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01FTUNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NRU1DTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTUVNQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtbW92ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NRU1NT1ZFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtc2V0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01FTVNFVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG9uX2V4aXQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfT05fRVhJVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHBzaWduYWwgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFNJR05BTAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJhbmRvbSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9SQU5ET00KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW5hbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUkVOQU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmluZGV4IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1JJTkRFWAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ3NldG1hc2sgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0lHU0VUTUFTSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJkdXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSRFVQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSRVJST1IKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJuY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJOQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnNpZ25hbCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJTSUdOQUwKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJzdHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSU1RSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG9kIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUlRPRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvbCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJUT0wKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b3VsIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUlRPVUwKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNjb25mIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NZU0NPTkYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lcyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRtcG5hbSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9UTVBOQU0KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2YXNwcmludGYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVkFTUFJJTlRGCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdmZwcmludGYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVkZQUklOVEYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2cHJpbnRmIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1ZQUklOVEYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2c3ByaW50ZiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9WU1BSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHdhaXRwaWQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfV0FJVFBJRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19GSUxFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLnRhYmxlIGIvbGliaWJlcnR5L2NvbmZpZy50YWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEzYjIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2NvbmZpZy50YWJsZQpAQCAtMCwwICsxLDYwIEBACitjYXNlICIke2hvc3R9IiBpbgorICByczYwMDAtaWJtLWFpeDMuMSB8IHJzNjAwMC1pYm0tYWl4KQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhZz1taC1haXggOzsKKyAgKi0qLWN4dXg3KikJCWZyYWc9bWgtY3h1eDcgOzsKKyAgKi0qLWZyZWVic2QyLjEuKikJZnJhZz1taC1mYnNkMjEgOzsKKyAgKi0qLWZyZWVic2QyLjIuWzAxMl0pCWZyYWc9bWgtZmJzZDIxIDs7CisgIGlbMzQ1XTg2LSotd2luZG93cyopCWZyYWc9bWgtd2luZG93cyA7OworICAqLSotYmVvcyopCQlmcmFnPW1oLWJlb3MgOzsKK2VzYWMKKworZnJhZ3M9JGZyYWcKKworIyBJZiB0aGV5IGRpZG4ndCBzcGVjaWZ5IC0tZW5hYmxlLXNoYXJlZCwgZG9uJ3QgZ2VuZXJhdGUgc2hhcmVkIGxpYnMuCitjYXNlICIke2VuYWJsZV9zaGFyZWR9IiBpbgorICB5ZXMpIHNoYXJlZD15ZXMgOzsKKyAgbm8pIHNoYXJlZD1ubyA7OworICAiIikgc2hhcmVkPW5vIDs7CisgICopIHNoYXJlZD15ZXMgOzsKK2VzYWMKK2lmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCisgIGNhc2UgIiR7aG9zdH0iIGluCisgICAgKi0qLWN5Z3dpbiopCTs7CisgICAgYWxwaGEqLSotbGludXgqKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLWVsZmFscGhhcGljIiA7OworICAgIGFybSotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1hcm1waWMiIDs7CisgICAgaHBwYSotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC1wYXBpYyIgOzsKKyAgICBpWzM0NTZdODYtKi0qKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXg4NnBpYyIgOzsKKyAgICBwb3dlcnBjKi0qLWFpeCopCTs7CisgICAgcG93ZXJwYyotKi0qKQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXBwY3BpYyIgOzsKKyAgICAqLSotKikJCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtJHtob3N0X2NwdX1waWMiIDs7CisgIGVzYWMKK2ZpCisKK2VjaG8gIiMgV2FybmluZzogdGhpcyBmcmFnbWVudCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCIgPiB0ZW1wLWZyYWcKKworZm9yIGZyYWcgaW4gJHtmcmFnc307IGRvCisgIGNhc2UgJHtmcmFnfSBpbgorICAgIC4uLyogKQorICAgICAgaWYgWyAke3NyY2Rpcn0gPSAuIF07IHRoZW4KKwlbIC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iIF0gJiYgZnJhZz0uLi8ke2ZyYWd9CisJWyAtbiAiJHt3aXRoX211bHRpc3JjdG9wfSIgXSAmJiBmcmFnPSR7d2l0aF9tdWx0aXNyY3RvcH0ke2ZyYWd9CisgICAgICBmaQorICAgICAgOzsKKyAgZXNhYworICBmcmFnPSR7c3JjZGlyfS8ke3hzcmNkaXJ9Y29uZmlnLyRmcmFnCisgIGlmIFsgLWYgJHtmcmFnfSBdOyB0aGVuCisgICAgZWNobyAiQXBwZW5kaW5nICR7ZnJhZ30gdG8geGhvc3QtbWtmcmFnIgorICAgIGVjaG8gIiMgRm9sbG93aW5nIGZyYWdtZW50IGNvcGllZCBmcm9tICR7ZnJhZ30iID4+IHRlbXAtZnJhZworICAgIGNhdCAke2ZyYWd9ID4+IHRlbXAtZnJhZworICBmaQorZG9uZQorCisjIHJlY29yZCBpZiB3ZSB3YW50IHRvIGJ1aWxkIHNoYXJlZCBsaWJzLgoraWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KKyAgZWNobyBlbmFibGVfc2hhcmVkID0geWVzID4+IHRlbXAtZnJhZworZWxzZQorICBlY2hvIGVuYWJsZV9zaGFyZWQgPSBubyA+PiB0ZW1wLWZyYWcKK2ZpCisKK2ZyYWc9eGhvc3QtbWtmcmFnCiske0NPTkZJR19TSEVMTH0gJHtsaWJpYmVydHlfdG9wZGlyfS9tb3ZlLWlmLWNoYW5nZSB0ZW1wLWZyYWcgeGhvc3QtbWtmcmFnCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnL21oLWFpeCBiL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjQ1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY29uZmlnL21oLWFpeApAQCAtMCwwICsxLDkgQEAKKyMgVGhpcyBmaWxlIGlzIG9ubHkgbmVlZGVkIGJ5IEFJWCAzLjEuCitIREVGSU5FUyA9IC1EX19JRUVFX0JJR19FTkRJQU4KKworIyBNb3N0IHJlbGVhc2VzIG9mIEFJWCAzLjEgaW5jbHVkZSBhbiBpbmNvcnJlY3QgaW50ZXJuYWwgdmVyc2lvbiBvZiBjb3B5c2lnbgorIyBpbiBsaWJjLmEgZm9yIHVzZSBieSBzb21lIGxpYmMgcHVibGljIGZ1bmN0aW9ucyBpbmNsdWRpbmcgbW9kZi4gIFRoZSBwdWJsaWMKKyMgdmVyc2lvbiBvZiBjb3B5c2lnbiBpbiBsaWJtLmEgaXMgdXNhYmxlLiAgRm9yIHRoZSBzYWtlIG9mIGxpYmcrKyAod2hpY2gKKyMgdXNlcyBtb2RmKSwgd2UgYWRkIGNvcHlzaWduIGhlcmUuICBTdXBwb3NlZGx5LCB0aGlzIHByb2JsZW0gaXMgZml4ZWQgaW4gQUlYCisjIDMuMS44IGFuZCBhYm92ZSwgaW5jbHVkaW5nIGFsbCByZWxlYXNlcyBvZiBBSVggMy4yLgorRVhUUkFfT0ZJTEVTID0gY29weXNpZ24ubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zIGIvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzVlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY29uZmlnL21oLWJlb3MKQEAgLTAsMCArMSw3IEBACisjIEhvc3QgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIEJlT1MKKworIyBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdGhlIHdpbXB5IGRlZmF1bHQgNjRrIHN0YWNrCisjIGxpbWl0IGluIEJlT1MgaXMgZWl0aGVyIGluY3JlYXNlZCBvciBtYWRlIHVzZXIgc2V0dGFibGUgc29tZWhvdy4KKyMgVGhpcyBwcm9iYWJseSB3b24ndCBoYXBwZW4gdW50aWwgYWZ0ZXIgdGhlIERSOSByZWxlYXNlLgorCitFWFRSQV9PRklMRVMgPSBhbGxvY2EubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1jeHV4NyBiL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNGIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcKQEAgLTAsMCArMSBAQAorSERFRklORVMgPSAtREhBUlJJU19GTE9BVF9GT1JNQVQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxIGIvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3NWE3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9jb25maWcvbWgtZmJzZDIxCkBAIC0wLDAgKzEgQEAKK0VYVFJBX09GSUxFUz12YXNwcmludGYubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzIGIvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjVmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY29uZmlnL21oLXdpbmRvd3MKQEAgLTAsMCArMSBAQAorRVhUUkFfT0ZJTEVTPWFzcHJpbnRmLm8gc3RyY2FzZWNtcC5vIHN0cm5jYXNlY21wLm8gdmFzcHJpbnRmLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUgYi9saWJpYmVydHkvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4NDA3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY29uZmlndXJlCkBAIC0wLDAgKzEsMjg1MCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWNyb3NzLWhvc3Q9SE9TVCAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWIiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPXBleGVjdXRlLmMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGFyZ2V0LXN1YmRpciBvciAtLXdpdGhvdXQtdGFyZ2V0LXN1YmRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcitzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF90YXJnZXRfc3ViZGlyIgorICA6CitmaQorCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyb3NzLWhvc3Qgb3IgLS13aXRob3V0LWNyb3NzLWhvc3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2Nyb3NzX2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfY3Jvc3NfaG9zdCIKKyAgOgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1uZXdsaWIgb3IgLS13aXRob3V0LW5ld2xpYiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbmV3bGliK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX25ld2xpYiIKKyAgOgorZmkKKworCitpZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCisgIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KKyAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgorICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKKyAgICBlbHNlCisgICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgorICAgIGZpCisgIGZpCitlbHNlCisgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKK2ZpCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkbGliaWJlcnR5X3RvcGRpciAkc3JjZGlyLyRsaWJpYmVydHlfdG9wZGlyOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJGxpYmliZXJ0eV90b3BkaXIgJHNyY2Rpci8kbGliaWJlcnR5X3RvcGRpciIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKKworCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjE0OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK2lmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCisgIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCitlbHNlCisgIGFjX3Rvb2xfcHJlZml4PQorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCitmaQorZmkKK0FSPSIkYWNfY3ZfcHJvZ19BUiIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcwNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2Vsc2UKKyAgUkFOTElCPSI6IgorZmkKK2ZpCisKKworIyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVmaW5lIG91ciBvd24gdmVyc2lvbiBvZiBBQ19QUk9HX0NDLiAgVGhpcyBpcworIyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBub3QgY2FsbCBBQ19QUk9HX0NDX1dPUktTLiAgV2UKKyMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKKyMgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mCisjIGl0c2VsZi4KKworCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgyODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCisgIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPQorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg1MjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgorICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1PMiIKKyAgZmkKK2Vsc2UKKyAgR0NDPQorICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODgxOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CitpZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKKyAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKK0VPRgorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0M9IiRDQyAtcG9zaXgiCisgIGVsc2UKKyAgICBDQz0iJENDIC1YcCIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIElTQz0KK2ZpCisKKworCisKKworCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTE5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKy4gJHtzcmNkaXJ9L2NvbmZpZy50YWJsZQoraG9zdF9tYWtlZmlsZV9mcmFnPSR7ZnJhZ30KKworCisjIEl0J3MgT0sgdG8gY2hlY2sgZm9yIGhlYWRlciBmaWxlcy4gIEFsdGhvdWdoIHRoZSBjb21waWxlciBtYXkgbm90IGJlCisjIGFibGUgdG8gbGluayBhbnl0aGluZywgaXQgaGFkIGJldHRlciBiZSBhYmxlIHRvIGF0IGxlYXN0IGNvbXBpbGUKKyMgc29tZXRoaW5nLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk4MDogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMzU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZm9yIGFjX2hkciBpbiBzeXMvZmlsZS5oIHN5cy9wYXJhbS5oIHN0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN0cmluZ3MuaCBzeXMvdGltZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA2MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEwNzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEwMDogY2hlY2tpbmcgZm9yIHN5cy93YWl0LmggdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTEwNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpZm5kZWYgV0VYSVRTVEFUVVMKKyNkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdF92YWwpICgodW5zaWduZWQpKHN0YXRfdmFsKSA+PiA4KQorI2VuZGlmCisjaWZuZGVmIFdJRkVYSVRFRAorI2RlZmluZSBXSUZFWElURUQoc3RhdF92YWwpICgoKHN0YXRfdmFsKSAmIDI1NSkgPT0gMCkKKyNlbmRpZgoraW50IG1haW4oKSB7CitpbnQgczsKK3dhaXQgKCZzKTsKK3MgPSBXSUZFWElURUQgKHMpID8gV0VYSVRTVEFUVVMgKHMpIDogMTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKK0VPRgorCitmaQorCisKKyMgVGhpcyBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpZiB0aGV5CisjIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgorCitmdW5jcz0iYXNwcmludGYiCitmdW5jcz0iJGZ1bmNzIGF0ZXhpdCIKK2Z1bmNzPSIkZnVuY3MgYmFzZW5hbWUiCitmdW5jcz0iJGZ1bmNzIGJjbXAiCitmdW5jcz0iJGZ1bmNzIGJjb3B5IgorZnVuY3M9IiRmdW5jcyBiemVybyIKK2Z1bmNzPSIkZnVuY3MgY2FsbG9jIgorZnVuY3M9IiRmdW5jcyBjbG9jayIKK2Z1bmNzPSIkZnVuY3MgZ2V0Y3dkIgorZnVuY3M9IiRmdW5jcyBnZXRwYWdlc2l6ZSIKK2Z1bmNzPSIkZnVuY3MgaW5kZXgiCitmdW5jcz0iJGZ1bmNzIGluc3F1ZSIKK2Z1bmNzPSIkZnVuY3MgbWVtY2hyIgorZnVuY3M9IiRmdW5jcyBtZW1jbXAiCitmdW5jcz0iJGZ1bmNzIG1lbWNweSIKK2Z1bmNzPSIkZnVuY3MgbWVtbW92ZSIKK2Z1bmNzPSIkZnVuY3MgbWVtc2V0IgorZnVuY3M9IiRmdW5jcyBta3N0ZW1wcyIKK2Z1bmNzPSIkZnVuY3MgcmFuZG9tIgorZnVuY3M9IiRmdW5jcyByZW5hbWUiCitmdW5jcz0iJGZ1bmNzIHJpbmRleCIKK2Z1bmNzPSIkZnVuY3Mgc2lnc2V0bWFzayIKK2Z1bmNzPSIkZnVuY3Mgc3RyY2FzZWNtcCIKK2Z1bmNzPSIkZnVuY3Mgc3RyY2hyIgorZnVuY3M9IiRmdW5jcyBzdHJkdXAiCitmdW5jcz0iJGZ1bmNzIHN0cm5jYXNlY21wIgorZnVuY3M9IiRmdW5jcyBzdHJyY2hyIgorZnVuY3M9IiRmdW5jcyBzdHJzdHIiCitmdW5jcz0iJGZ1bmNzIHN0cnRvZCIKK2Z1bmNzPSIkZnVuY3Mgc3RydG9sIgorZnVuY3M9IiRmdW5jcyBzdHJ0b3VsIgorZnVuY3M9IiRmdW5jcyB0bXBuYW0iCitmdW5jcz0iJGZ1bmNzIHZhc3ByaW50ZiIKK2Z1bmNzPSIkZnVuY3MgdmZwcmludGYiCitmdW5jcz0iJGZ1bmNzIHZwcmludGYiCitmdW5jcz0iJGZ1bmNzIHZzcHJpbnRmIgorZnVuY3M9IiRmdW5jcyB3YWl0cGlkIgorCisjIEFsc28gaW4gdGhlIG9sZCBmdW5jdGlvbi5kZWYgZmlsZTogYWxsb2NhLCB2Zm9yaywgZ2V0b3B0LgorCit2YXJzPSJzeXNfZXJybGlzdCBzeXNfbmVyciBzeXNfc2lnbGlzdCIKKworY2hlY2tmdW5jcz0iZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcyIKKworIyBUaGVzZSBhcmUgbmVpdGhlciBleGVjdXRlZCBub3IgcmVxdWlyZWQsIGJ1dCB0aGV5IGhlbHAga2VlcAorIyBhdXRvaGVhZGVyIGhhcHB5IHdpdGhvdXQgYWRkaW5nIGEgYnVuY2ggb2YgdGV4dCB0byBhY2NvbmZpZy5oLgoraWYgdGVzdCAieCIgPSAieSI7IHRoZW4KKyAgZm9yIGFjX2Z1bmMgaW4gYXNwcmludGYgYXRleGl0IGJhc2VuYW1lIGJjbXAgYmNvcHkgYnplcm8gY2FsbG9jIGNsb2NrIGdldGN3ZAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgIGZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplIGluZGV4IGluc3F1ZSBta3N0ZW1wcyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1tb3ZlCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjUwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgZm9yIGFjX2Z1bmMgaW4gbWVtc2V0IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMwNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgIGZvciBhY19mdW5jIGluIHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM2MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM2NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgIGZvciBhY19mdW5jIGluIHN0cnRvdWwgdG1wbmFtIHZhc3ByaW50ZiB2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIHdhaXRwaWQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MTU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0MjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCitFT0YKKworICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TWVNfTkVSUiAxCitFT0YKKworICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TWVNfU0lHTElTVCAxCitFT0YKKworICBmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZpCisKKyMgRm9yIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zLCBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIHRoZQorIyBmdW5jdGlvbiB3ZSB3YW50IHRvIHB1dCBGTi5vIGluIExJQk9CSlMsIGFuZCBpZiB0aGUgaG9zdCBkb2VzCisjIHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCB3ZSB3YW50IHRvIGRlZmluZSBIQVZFX0ZOIGluIGNvbmZpZy5oLiAgQWxzbywKKyMgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSBhbGxvY2EsIHdlIHNldCBBTExPQ0EgdG8gYWxsb2NhLm8KKworc2V0b2Jqcz0KK2lmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KKworICAjIFdlIGFyZSBiZWluZyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGxpYnJhcnkuICBBQ19SRVBMQUNFX0ZVTkNTCisgICMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZSBhYmxlIHRvCisgICMgbGluayBleGVjdXRhYmxlcy4gIE5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgYmUgYmVpbmcgY29uZmlndXJlZAorICAjIG5hdGl2ZS4KKworICAjIElmIHdlIGFyZSBiZWluZyBjb25maWd1cmVkIGZvciBuZXdsaWIsIHdlIGtub3cgd2hpY2ggZnVuY3Rpb25zCisgICMgbmV3bGliIHByb3ZpZGUgYW5kIHdoaWNoIG9uZXMgd2Ugd2lsbCBiZSBleHBlY3RlZCB0byBwcm92aWRlLgorCisgIGlmIHRlc3QgIngke3dpdGhfbmV3bGlifSIgPSAieHllcyI7IHRoZW4KKyAgICBBTExPQ0E9ImFsbG9jYS5vIgorICAgIExJQk9CSlM9ImFzcHJpbnRmLm8gYmFzZW5hbWUubyBpbnNxdWUubyByYW5kb20ubyBzdHJkdXAubyB2YXNwcmludGYubyIKKworICAgIGZvciBmIGluICRmdW5jczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorCWFzcHJpbnRmIHwgYmFzZW5hbWUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJkdXAgfCB2YXNwcmludGYpCisJICA7OworCSopCisJICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisJICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkbiAxCitFT0YKKworCSAgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICAjIG5ld2xpYiBkb2VzbnQgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKKyAgICAjIGRvbnQgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCisKKyAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIG5ld2xpYiBvbmx5IGhhcyBzdHJlcnJvci4KKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCitFT0YKKworCisgICAgc2V0b2Jqcz15ZXMKKworICBmaQorZmkKKworaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KKyAgY2FzZSAiJHtob3N0fSIgaW4KKworICAqLSotdnh3b3JrcyopCisgICAgIyBIYW5kbGUgVnhXb3JrcyBjb25maWd1cmF0aW9uIHNwZWNpYWxseSwgc2luY2Ugb24gVnhXb3JrcyB0aGUKKyAgICAjIGxpYnJhcmllcyBhcmUgYWN0dWFsbHkgb24gdGhlIHRhcmdldCBib2FyZCwgbm90IGluIHRoZSBmaWxlCisgICAgIyBzeXN0ZW0uCisgICAgTElCT0JKUz0iYmFzZW5hbWUubyBnZXRwYWdlc2l6ZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmNhc2VjbXAubyIKKyAgICBMSUJPQkpTPSIkTElCT0JKUyBzdHJuY2FzZWNtcC5vIHN0cmR1cC5vIHZmb3JrLm8gd2FpdHBpZC5vIHZhc3ByaW50Zi5vIgorICAgIGZvciBmIGluICRmdW5jczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorCWJhc2VuYW1lIHwgZ2V0cGFnZXNpemUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJjYXNlY21wKQorCSAgOzsKKwlzdHJuY2FzZWNtcCB8IHN0cmR1cCB8IHZmb3JrIHwgd2FpdHBpZCB8IHZhc3ByaW50ZikKKwkgIDs7CisJKikKKwkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKwkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRuIDEKK0VPRgorCisJICA7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgVnhXb3JrcyBkb2Vzbid0IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCisgICAgIyBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KKworICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgVnhXb3JrcyBvbmx5IGhhcyBzdHJlcnJvci4KKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFJFUlJPUiAxCitFT0YKKworCisgICAgc2V0b2Jqcz15ZXMKKyAgICA7OworCisgIGVzYWMKK2ZpCisKK2lmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCisKKyAgY2FzZSAiJHtob3N0fSIgaW4KKworICAqLSotY3lnd2luKikKKyAgICAjIFRoZSBDeWd3aW4gbGlicmFyeSBhY3R1YWxseSB1c2VzIGEgY291cGxlIG9mIGZpbGVzIGZyb20KKyAgICAjIGxpYmliZXJ0eSB3aGVuIGl0IGlzIGJ1aWx0LiAgSWYgd2UgYXJlIGJ1aWxkaW5nIGEgbmF0aXZlCisgICAgIyBDeWd3aW4sIGFuZCB3ZSBydW4gdGhlIHRlc3RzLCB3ZSB3aWxsIGFwcGVhciB0byBoYXZlIHRoZXNlCisgICAgIyBmaWxlcy4gIEhvd2V2ZXIsIHdoZW4gd2UgZ28gb24gdG8gYnVpbGQgd2luc3VwLCB3ZSB3aWxsIHdpbmQgdXAKKyAgICAjIHdpdGggYSBsaWJyYXJ5IHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGZpbGVzLCBzaW5jZSB0aGV5IHNob3VsZAorICAgICMgaGF2ZSBjb21lIGZyb20gbGliaWJlcnR5LgorCisgICAgIyBXZSBoYW5kbGUgdGhpcyBieSByZW1vdmluZyB0aGUgZnVuY3Rpb25zIHRoZSB3aW5zdXAgbGlicmFyeQorICAgICMgcHJvdmlkZXMgZnJvbSBvdXIgc2hlbGwgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlCisgICAgIyBtaXNzaW5nLgorCisgICAgZnVuY3M9ImBlY2hvICRmdW5jcyB8IHNlZCAtZSAncy9yYW5kb20vLydgIgorICAgIExJQk9CSlM9IiRMSUJPQkpTIHJhbmRvbS5vIgorICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19zaWdsaXN0Ly8nYCIKKyAgICBjaGVja2Z1bmNzPSJgZWNobyAkY2hlY2tmdW5jcyB8IHNlZCAtZSAncy9zdHJzaWduYWwvLycgLWUgJ3MvcHNpZ25hbC8vJ2AiCisgICAgOzsKKworICAqLSotbWluZ3czMiopCisgICAgIyBVbmRlciBtaW5ndzMyLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQorICAgICMgbWFjcm9zLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCisgICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX25lcnIvLycgLWUgJ3Mvc3lzX2Vycmxpc3QvLydgIgorICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NZU19ORVJSIDEKK0VPRgorCisgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1lTX0VSUkxJU1QgMQorRU9GCisKKyAgICA7OworCisgICotKi11d2luKikKKyAgICAjIFVuZGVyIHNvbWUgdmVyc2lvbnMgb2YgdXdpbiwgdmZvcmsgaXMgbm90b3Jpb3VzbHkgYnVnZ3kgYW5kIHRoZSB0ZXN0IAorICAgICMgY2FuIGhhbmcgY29uZmlndXJlOyBvbiBvdGhlciB2ZXJzaW9ucywgdmZvcmsgZXhpc3RzIGp1c3QgYXMgYSBzdHViLgorICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB2Zm9yayBpbiB1d2luJ3MgcnVudGltZSBpcyBmaXhlZC4KKyAgICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCisgICAgOzsKKworICBlc2FjCisKKyAgIyBXZSBoYXZlbid0IHNldCB0aGUgbGlzdCBvZiBvYmplY3RzIHlldC4gIFVzZSB0aGUgc3RhbmRhcmQgYXV0b2NvbmYKKyAgIyB0ZXN0cy4gIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGNvbXBpbGVyIHdvcmtzLgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NzI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDE2ODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjg4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKKyAgZm9yIGFjX2Z1bmMgaW4gJGZ1bmNzCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzIxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK0xJQk9CSlM9IiRMSUJPQkpTICR7YWNfZnVuY30uJHthY19vYmpleHR9IgorZmkKK2RvbmUKKworCisgICMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3Nzg6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODExOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4MTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NzY6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODgxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkwNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTkxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NjE6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxOTY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5ODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDEwOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDE1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA1OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDc5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwOTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgcGlkX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxMTQ6IGNoZWNraW5nIGZvciBwaWRfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9waWRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxMTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pcGlkX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3BpZF90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfcGlkX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9waWRfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9waWRfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBwaWRfdCBpbnQKK0VPRgorCitmaQorCithY19zYWZlPWBlY2hvICJ2Zm9yay5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB2Zm9yay5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTQ4OiBjaGVja2luZyBmb3IgdmZvcmsuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8dmZvcmsuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjE1ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1ZGT1JLX0ggMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE4MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdmZvcmtfd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdmZvcmsiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxODk6IGNoZWNraW5nIGZvciB2Zm9yayIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9yaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxOTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgdmZvcmsoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB2Zm9yaygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX3Zmb3JrKSB8fCBkZWZpbmVkIChfX3N0dWJfX192Zm9yaykKK2Nob2tlIG1lCisjZWxzZQordmZvcmsoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY192Zm9yaz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfdmZvcms9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyd2Zm9ya2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yaworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFRoYW5rcyB0byBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9WRk9SS19ICisjaW5jbHVkZSA8dmZvcmsuaD4KKyNlbmRpZgorLyogT24gc29tZSBzcGFyYyBzeXN0ZW1zLCBjaGFuZ2VzIGJ5IHRoZSBjaGlsZCB0byBsb2NhbCBhbmQgaW5jb21pbmcKKyAgIGFyZ3VtZW50IHJlZ2lzdGVycyBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQuCisgICBUaGUgY29tcGlsZXIgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LAorICAgYnV0IHNvbWUgY29tcGlsZXJzIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZvcmsuaD4uCisgICBUZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGEgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MKKyAgIGlzIHB1dCBpbnRvIGEgcmVnaXN0ZXIgdGhhdCBpcyBjbG9iYmVyZWQgYnkgdGhlIHZmb3JrLiAgKi8KK3N0YXRpYworI2lmZGVmIF9fY3BsdXNwbHVzCitzcGFyY19hZGRyZXNzX3Rlc3QgKGludCBhcmcpCisjZWxzZQorc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7CisjZW5kaWYKK3sKKyAgc3RhdGljIHBpZF90IGNoaWxkOworICBpZiAoIWNoaWxkKSB7CisgICAgY2hpbGQgPSB2Zm9yayAoKTsKKyAgICBpZiAoY2hpbGQgPCAwKSB7CisgICAgICBwZXJyb3IgKCJ2Zm9yayIpOworICAgICAgX2V4aXQoMik7CisgICAgfQorICAgIGlmICghY2hpbGQpIHsKKyAgICAgIGFyZyA9IGdldHBpZCgpOworICAgICAgd3JpdGUoLTEsICIiLCAwKTsKKyAgICAgIF9leGl0IChhcmcpOworICAgIH0KKyAgfQorfQorbWFpbigpIHsKKyAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOworICBwaWRfdCBjaGlsZDsKKworICBzcGFyY19hZGRyZXNzX3Rlc3QgKCk7CisKKyAgY2hpbGQgPSB2Zm9yayAoKTsKKworICBpZiAoY2hpbGQgPT0gMCkgeworICAgIC8qIEhlcmUgaXMgYW5vdGhlciB0ZXN0IGZvciBzcGFyYyB2Zm9yayByZWdpc3RlciBwcm9ibGVtcy4KKyAgICAgICBUaGlzIHRlc3QgdXNlcyBsb3RzIG9mIGxvY2FsIHZhcmlhYmxlcywgYXQgbGVhc3QKKyAgICAgICBhcyBtYW55IGxvY2FsIHZhcmlhYmxlcyBhcyBtYWluIGhhcyBhbGxvY2F0ZWQgc28gZmFyCisgICAgICAgaW5jbHVkaW5nIGNvbXBpbGVyIHRlbXBvcmFyaWVzLiAgNCBsb2NhbHMgYXJlIGVub3VnaCBmb3IKKyAgICAgICBnY2MgMS40MC4zIG9uIGEgU29sYXJpcyA0LjEuMyBzcGFyYywgYnV0IHdlIHVzZSA4IHRvIGJlIHNhZmUuCisgICAgICAgQSBidWdneSBjb21waWxlciBzaG91bGQgcmV1c2UgdGhlIHJlZ2lzdGVyIG9mIHBhcmVudAorICAgICAgIGZvciBvbmUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcywgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0CisgICAgICAgcGFyZW50IGNhbid0IHBvc3NpYmx5IGJlIHVzZWQgYW55IG1vcmUgaW4gdGhpcyByb3V0aW5lLgorICAgICAgIEFzc2lnbmluZyB0byB0aGUgbG9jYWwgdmFyaWFibGUgd2lsbCB0aHVzIG11bmdlIHBhcmVudAorICAgICAgIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gICovCisgICAgcGlkX3QKKyAgICAgIHAgPSBnZXRwaWQoKSwgcDEgPSBnZXRwaWQoKSwgcDIgPSBnZXRwaWQoKSwgcDMgPSBnZXRwaWQoKSwKKyAgICAgIHA0ID0gZ2V0cGlkKCksIHA1ID0gZ2V0cGlkKCksIHA2ID0gZ2V0cGlkKCksIHA3ID0gZ2V0cGlkKCk7CisgICAgLyogQ29udmluY2UgdGhlIGNvbXBpbGVyIHRoYXQgcC4ucDcgYXJlIGxpdmU7IG90aGVyd2lzZSwgaXQgbWlnaHQKKyAgICAgICB1c2UgdGhlIHNhbWUgaGFyZHdhcmUgcmVnaXN0ZXIgZm9yIGFsbCA4IGxvY2FsIHZhcmlhYmxlcy4gICovCisgICAgaWYgKHAgIT0gcDEgfHwgcCAhPSBwMiB8fCBwICE9IHAzIHx8IHAgIT0gcDQKKwl8fCBwICE9IHA1IHx8IHAgIT0gcDYgfHwgcCAhPSBwNykKKyAgICAgIF9leGl0KDEpOworCisgICAgLyogT24gc29tZSBzeXN0ZW1zIChlLmcuIElSSVggMy4zKSwKKyAgICAgICB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudCBmcm9tIGNoaWxkIGZpbGUgZGVzY3JpcHRvcnMuCisgICAgICAgSWYgdGhlIGNoaWxkIGNsb3NlcyBhIGRlc2NyaXB0b3IgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLAorICAgICAgIHRoaXMgbXVuZ2VzIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yIGFzIHdlbGwuCisgICAgICAgVGVzdCBmb3IgdGhpcyBieSBjbG9zaW5nIHN0ZG91dCBpbiB0aGUgY2hpbGQuICAqLworICAgIF9leGl0KGNsb3NlKGZpbGVubyhzdGRvdXQpKSAhPSAwKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgd2hpbGUgKHdhaXQoJnN0YXR1cykgIT0gY2hpbGQpCisgICAgICA7CisgICAgZXhpdCgKKwkgLyogV2FzIHRoZXJlIHNvbWUgcHJvYmxlbSB3aXRoIHZmb3JraW5nPyAgKi8KKwkgY2hpbGQgPCAwCisKKwkgLyogRGlkIHRoZSBjaGlsZCBmYWlsPyAgKFRoaXMgc2hvdWxkbid0IGhhcHBlbi4pICAqLworCSB8fCBzdGF0dXMKKworCSAvKiBEaWQgdGhlIHZmb3JrL2NvbXBpbGVyIGJ1ZyBvY2N1cj8gICovCisJIHx8IHBhcmVudCAhPSBnZXRwaWQoKQorCisJIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCisJIHx8IGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpICE9IDAKKwkgKTsKKyAgfQorfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSB2Zm9yayBmb3JrCitFT0YKKworZmkKKworICBpZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KKyAgICBMSUJPQkpTPSIkTElCT0JKUyB2Zm9yay5vIgorICBmaQorICBmb3IgdiBpbiAkdmFyczsgZG8KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJHYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNjE6IGNoZWNraW5nIGZvciAkdiIgPiY1CisgICAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2xpYmliZXJ0eV9jdl92YXJfJHYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ludCAqcDsKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCAkdjsgcCA9ICYkdjsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzczOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRsaWJpYmVydHlfY3ZfdmFyXyckdmBcIiA9IHllcyI7IHRoZW4KKyAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICAgIG49SEFWRV9gZWNobyAkdiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRuIDEKK0VPRgorCisgICAgZWxzZQorICAgICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgICAgZmkKKyAgZG9uZQorICBmb3IgYWNfZnVuYyBpbiAkY2hlY2tmdW5jcworZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM5OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQwNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmaQorCisjIEluc3RhbGwgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggYSBjcm9zcyBjb21waWxlciBpbiAkKHRvb2xkaXIpIHJhdGhlcgorIyB0aGFuICQobGliZGlyKS4KK2lmIHRlc3QgLXogIiR7d2l0aF9jcm9zc19ob3N0fSI7IHRoZW4KKyAgSU5TVEFMTF9ERVNUPWxpYmRpcgorZWxzZQorICBJTlNUQUxMX0RFU1Q9dG9vbGRpcgorZmkKKworCisjIFdlIG5lZWQgbXVsdGlsaWIgc3VwcG9ydCwgYnV0IG9ubHkgaWYgY29uZmlndXJpbmcgZm9yIHRoZSB0YXJnZXQuCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBGRkxBR1NAJSRGRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCisvQGhvc3RfbWFrZWZpbGVfZnJhZ0AvciAkaG9zdF9tYWtlZmlsZV9mcmFnCitzJUBob3N0X21ha2VmaWxlX2ZyYWdAJSVnCitzJUBDUFBAJSRDUFAlZworcyVATElCT0JKU0AlJExJQk9CSlMlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQElOU1RBTExfREVTVEAlJElOU1RBTExfREVTVCVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK3NyY2Rpcj0ke3NyY2Rpcn0KK2hvc3Q9JHtob3N0fQordGFyZ2V0PSR7dGFyZ2V0fQord2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQord2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9CithY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCitDT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KK2xpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3Rlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorICBpZiB0ZXN0IC1uICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iOyB0aGVuCisgICAgIyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gc2V0IGFjX2ZpbGUKKyAgICBhY19maWxlPU1ha2VmaWxlCisgICAgLiAke2xpYmliZXJ0eV90b3BkaXJ9L2NvbmZpZy1tbC5pbgorICBmaQorZmkKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlndXJlLmJhdCBiL2xpYmliZXJ0eS9jb25maWd1cmUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODgxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY29uZmlndXJlLmJhdApAQCAtMCwwICsxLDE0IEBACitAZWNobyBvZmYNCitpZiAiJTEiID09ICJoOC8zMDAiIGdvdG8gaDgzMDANCisNCitlY2hvIENvbmZpZ3VyaW5nIGxpYmliZXJ0eSBmb3IgZ28zMg0KK2NvcHkgTWFrZWZpbGUuZG9zIE1ha2VmaWxlDQorZWNobyAjZGVmaW5lIE5FRURfc3lzX3NpZ2xpc3QgMSA+PiBjb25maWcuaA0KK2VjaG8gI2RlZmluZSBORUVEX3BzaWduYWwgMSA+PiBjb25maWcuaA0KK2dvdG8gZXhpdA0KKw0KKzpoODMwMA0KK2VjaG8gQ29uZmlndXJpbmcgbGliaWJlcnR5IGZvciBIOC8zMDANCitjb3B5IE1ha2VmaWxlLmRvcyBNYWtlZmlsZQ0KKw0KKzpleGl0DQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbiBiL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyZjAzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwzNDEgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0CisKK0FDX1BSRVJFUSgyLjEyLjEpCitBQ19JTklUKHBleGVjdXRlLmMpCisKK2RubCBXZSB1c2UgdGhlc2Ugb3B0aW9ucyB0byBkZWNpZGUgd2hpY2ggZnVuY3Rpb25zIHRvIGluY2x1ZGUuCitBQ19BUkdfV0lUSCh0YXJnZXQtc3ViZGlyLAorWyAgLS13aXRoLXRhcmdldC1zdWJkaXI9U1VCRElSICAgICAgQ29uZmlndXJpbmcgaW4gYSBzdWJkaXJlY3RvcnldKQorQUNfQVJHX1dJVEgoY3Jvc3MtaG9zdCwKK1sgIC0td2l0aC1jcm9zcy1ob3N0PUhPU1QgICAgICAgICAgIENvbmZpZ3VyaW5nIHdpdGggYSBjcm9zcyBjb21waWxlcl0pCitBQ19BUkdfV0lUSChuZXdsaWIsCitbICAtLXdpdGgtbmV3bGliICAgICAgICAgICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIG5ld2xpYl0pCisKK2lmIHRlc3QgIiR7c3JjZGlyfSIgPSAiLiI7IHRoZW4KKyAgaWYgdGVzdCAteiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgorICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKKyAgZWxzZQorICAgIGlmIHRlc3QgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iOyB0aGVuCisgICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uLy4uIgorICAgIGVsc2UKKyAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4iCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgorZmkKK0FDX0NPTkZJR19BVVhfRElSKCRsaWJpYmVydHlfdG9wZGlyKQorCitBQ19DQU5PTklDQUxfSE9TVAorCitkbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKK2RubCBBTV9JTklUX0FVVE9NQUtFKGxpYmliZXJ0eSwgMS4wKQorCitkbmwgVGhlc2UgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTCwgYmVjYXVzZSBpdCBtYXkgd2FudAorZG5sIHRvIGNhbGwgQUNfQ0hFQ0tfUFJPRy4KK0FDX0NIRUNLX1RPT0woQVIsIGFyKQorQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKKworIyBGSVhNRTogV2UgdGVtcG9yYXJpbHkgZGVmaW5lIG91ciBvd24gdmVyc2lvbiBvZiBBQ19QUk9HX0NDLiAgVGhpcyBpcworIyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBub3QgY2FsbCBBQ19QUk9HX0NDX1dPUktTLiAgV2UKKyMgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKKyMgbGluayBhbiBleGVjdXRhYmxlLiAgVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGluIGF1dG9jb25mCisjIGl0c2VsZi4KKworQUNfREVGVU4oTElCX0FDX1BST0dfQ0MsCitbQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NQUF0pZG5sCitBQ19QUk9WSURFKFtBQ19QUk9HX0NDXSkKK0FDX0NIRUNLX1BST0coQ0MsIGdjYywgZ2NjKQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBBQ19DSEVDS19QUk9HKENDLCBjYywgY2MsICwgLCAvdXNyL3VjYi9jYykKKyAgdGVzdCAteiAiJENDIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIXSkKK2ZpCisKK0FDX1BST0dfQ0NfR05VCisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2RubCBDaGVjayB3aGV0aGVyIC1nIHdvcmtzLCBldmVuIGlmIENGTEFHUyBpcyBzZXQsIGluIGNhc2UgdGhlIHBhY2thZ2UKK2RubCBwbGF5cyBhcm91bmQgd2l0aCBDRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCitkbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCisgIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPQorICBBQ19QUk9HX0NDX0cKKyAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItTzIiCisgIGZpCitlbHNlCisgIEdDQz0KKyAgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ0ZMQUdTPSItZyIKK2ZpCitdKQorCitMSUJfQUNfUFJPR19DQworCitBQ19JU0NfUE9TSVgKKworZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgbGlidG9vbDoKK2RubCBEZWZhdWx0IHRvIGEgbm9uIHNoYXJlZCBsaWJyYXJ5LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUKK2RubCBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLXNoYXJlZC4KK2RubCBBTV9ESVNBQkxFX1NIQVJFRAorCitkbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBsaWJ0b29sOgorZG5sIEFNX1BST0dfTElCVE9PTAorCitkbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKK2RubCBBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKK0FDX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQorCitkbmwgV2hlbiB3ZSBzdGFydCB1c2luZyBhdXRvbWFrZToKK2RubCBBTV9NQUlOVEFJTkVSX01PREUKK2RubCBBQ19FWEVFWFQKKworZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6CitkbmwgQU1fUFJPR19JTlNUQUxMCitBQ19QUk9HX0lOU1RBTEwKKworLiAke3NyY2Rpcn0vY29uZmlnLnRhYmxlCitob3N0X21ha2VmaWxlX2ZyYWc9JHtmcmFnfQorQUNfU1VCU1RfRklMRShob3N0X21ha2VmaWxlX2ZyYWcpCisKKyMgSXQncyBPSyB0byBjaGVjayBmb3IgaGVhZGVyIGZpbGVzLiAgQWx0aG91Z2ggdGhlIGNvbXBpbGVyIG1heSBub3QgYmUKKyMgYWJsZSB0byBsaW5rIGFueXRoaW5nLCBpdCBoYWQgYmV0dGVyIGJlIGFibGUgdG8gYXQgbGVhc3QgY29tcGlsZQorIyBzb21ldGhpbmcuCitBQ19DSEVDS19IRUFERVJTKHN5cy9maWxlLmggc3lzL3BhcmFtLmggc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3RyaW5ncy5oIHN5cy90aW1lLmgpCitBQ19IRUFERVJfU1lTX1dBSVQKKworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGlmIHRoZXkKKyMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlIGhvc3QuCisKK2Z1bmNzPSJhc3ByaW50ZiIKK2Z1bmNzPSIkZnVuY3MgYXRleGl0IgorZnVuY3M9IiRmdW5jcyBiYXNlbmFtZSIKK2Z1bmNzPSIkZnVuY3MgYmNtcCIKK2Z1bmNzPSIkZnVuY3MgYmNvcHkiCitmdW5jcz0iJGZ1bmNzIGJ6ZXJvIgorZnVuY3M9IiRmdW5jcyBjYWxsb2MiCitmdW5jcz0iJGZ1bmNzIGNsb2NrIgorZnVuY3M9IiRmdW5jcyBnZXRjd2QiCitmdW5jcz0iJGZ1bmNzIGdldHBhZ2VzaXplIgorZnVuY3M9IiRmdW5jcyBpbmRleCIKK2Z1bmNzPSIkZnVuY3MgaW5zcXVlIgorZnVuY3M9IiRmdW5jcyBtZW1jaHIiCitmdW5jcz0iJGZ1bmNzIG1lbWNtcCIKK2Z1bmNzPSIkZnVuY3MgbWVtY3B5IgorZnVuY3M9IiRmdW5jcyBtZW1tb3ZlIgorZnVuY3M9IiRmdW5jcyBtZW1zZXQiCitmdW5jcz0iJGZ1bmNzIG1rc3RlbXBzIgorZnVuY3M9IiRmdW5jcyByYW5kb20iCitmdW5jcz0iJGZ1bmNzIHJlbmFtZSIKK2Z1bmNzPSIkZnVuY3MgcmluZGV4IgorZnVuY3M9IiRmdW5jcyBzaWdzZXRtYXNrIgorZnVuY3M9IiRmdW5jcyBzdHJjYXNlY21wIgorZnVuY3M9IiRmdW5jcyBzdHJjaHIiCitmdW5jcz0iJGZ1bmNzIHN0cmR1cCIKK2Z1bmNzPSIkZnVuY3Mgc3RybmNhc2VjbXAiCitmdW5jcz0iJGZ1bmNzIHN0cnJjaHIiCitmdW5jcz0iJGZ1bmNzIHN0cnN0ciIKK2Z1bmNzPSIkZnVuY3Mgc3RydG9kIgorZnVuY3M9IiRmdW5jcyBzdHJ0b2wiCitmdW5jcz0iJGZ1bmNzIHN0cnRvdWwiCitmdW5jcz0iJGZ1bmNzIHRtcG5hbSIKK2Z1bmNzPSIkZnVuY3MgdmFzcHJpbnRmIgorZnVuY3M9IiRmdW5jcyB2ZnByaW50ZiIKK2Z1bmNzPSIkZnVuY3MgdnByaW50ZiIKK2Z1bmNzPSIkZnVuY3MgdnNwcmludGYiCitmdW5jcz0iJGZ1bmNzIHdhaXRwaWQiCisKKyMgQWxzbyBpbiB0aGUgb2xkIGZ1bmN0aW9uLmRlZiBmaWxlOiBhbGxvY2EsIHZmb3JrLCBnZXRvcHQuCisKK3ZhcnM9InN5c19lcnJsaXN0IHN5c19uZXJyIHN5c19zaWdsaXN0IgorCitjaGVja2Z1bmNzPSJnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzIgorCisjIFRoZXNlIGFyZSBuZWl0aGVyIGV4ZWN1dGVkIG5vciByZXF1aXJlZCwgYnV0IHRoZXkgaGVscCBrZWVwCisjIGF1dG9oZWFkZXIgaGFwcHkgd2l0aG91dCBhZGRpbmcgYSBidW5jaCBvZiB0ZXh0IHRvIGFjY29uZmlnLmguCitpZiB0ZXN0ICJ4IiA9ICJ5IjsgdGhlbgorICBBQ19DSEVDS19GVU5DUyhhc3ByaW50ZiBhdGV4aXQgYmFzZW5hbWUgYmNtcCBiY29weSBiemVybyBjYWxsb2MgY2xvY2sgZ2V0Y3dkKQorICBBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSBpbmRleCBpbnNxdWUgbWtzdGVtcHMgbWVtY2hyIG1lbWNtcCBtZW1jcHkgbWVtbW92ZSkKKyAgQUNfQ0hFQ0tfRlVOQ1MobWVtc2V0IHJhbmRvbSByZW5hbWUgcmluZGV4IHNpZ3NldG1hc2sgc3RyY2FzZWNtcCkKKyAgQUNfQ0hFQ0tfRlVOQ1Moc3RyY2hyIHN0cmR1cCBzdHJuY2FzZWNtcCBzdHJyY2hyIHN0cnN0ciBzdHJ0b2Qgc3RydG9sKQorICBBQ19DSEVDS19GVU5DUyhzdHJ0b3VsIHRtcG5hbSB2YXNwcmludGYgdmZwcmludGYgdnByaW50ZiB2c3ByaW50ZiB3YWl0cGlkKQorICBBQ19ERUZJTkUoSEFWRV9TWVNfRVJSTElTVCkKKyAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCisgIEFDX0RFRklORShIQVZFX1NZU19TSUdMSVNUKQorICBBQ19DSEVDS19GVU5DUyhnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzKQorZmkKKworIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCisjIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKKyMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAorIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubworCitzZXRvYmpzPQoraWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgorCisgICMgV2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgYXMgYSB0YXJnZXQgbGlicmFyeS4gIEFDX1JFUExBQ0VfRlVOQ1MKKyAgIyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlIGFibGUgdG8KKyAgIyBsaW5rIGV4ZWN1dGFibGVzLiAgTm90ZSB0aGF0IHdlIG1heSBzdGlsbCBiZSBiZWluZyBjb25maWd1cmVkCisgICMgbmF0aXZlLgorCisgICMgSWYgd2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgZm9yIG5ld2xpYiwgd2Uga25vdyB3aGljaCBmdW5jdGlvbnMKKyAgIyBuZXdsaWIgcHJvdmlkZSBhbmQgd2hpY2ggb25lcyB3ZSB3aWxsIGJlIGV4cGVjdGVkIHRvIHByb3ZpZGUuCisKKyAgaWYgdGVzdCAieCR7d2l0aF9uZXdsaWJ9IiA9ICJ4eWVzIjsgdGhlbgorICAgIEFMTE9DQT0iYWxsb2NhLm8iCisgICAgTElCT0JKUz0iYXNwcmludGYubyBiYXNlbmFtZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmR1cC5vIHZhc3ByaW50Zi5vIgorCisgICAgZm9yIGYgaW4gJGZ1bmNzOyBkbworICAgICAgY2FzZSAiJGYiIGluCisJYXNwcmludGYgfCBiYXNlbmFtZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmR1cCB8IHZhc3ByaW50ZikKKwkgIDs7CisJKikKKwkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKwkgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKKwkgIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBuZXdsaWIgZG9lc250IHByb3ZpZGUgYW55IG9mIHRoZSB2YXJpYWJsZXMgaW4gJHZhcnMsIHNvIHdlCisgICAgIyBkb250IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgorCisgICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBuZXdsaWIgb25seSBoYXMgc3RyZXJyb3IuCisgICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCisKKyAgICBzZXRvYmpzPXllcworCisgIGZpCitmaQorCitpZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgorICBjYXNlICIke2hvc3R9IiBpbgorCisgICotKi12eHdvcmtzKikKKyAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQorICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKKyAgICAjIHN5c3RlbS4KKyAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgorICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCisgICAgZm9yIGYgaW4gJGZ1bmNzOyBkbworICAgICAgY2FzZSAiJGYiIGluCisJYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCisJICA7OworCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQorCSAgOzsKKwkqKQorCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorCSAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICAjIFZ4V29ya3MgZG9lc24ndCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQorICAgICMgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVtIGhlcmUuCisKKyAgICAjIE9mIHRoZSBmdW5jdGlvbnMgaW4gJGNoZWNrZnVuY3MsIFZ4V29ya3Mgb25seSBoYXMgc3RyZXJyb3IuCisgICAgQUNfREVGSU5FKEhBVkVfU1RSRVJST1IpCisKKyAgICBzZXRvYmpzPXllcworICAgIDs7CisKKyAgZXNhYworZmkKKworaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KKworICBjYXNlICIke2hvc3R9IiBpbgorCisgICotKi1jeWd3aW4qKQorICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQorICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKKyAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKKyAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAorICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCisgICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCisKKyAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5CisgICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKKyAgICAjIG1pc3NpbmcuCisKKyAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCisgICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCisgICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgorICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKKyAgICA7OworCisgICotKi1taW5ndzMyKikKKyAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCisgICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KKyAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCisgICAgQUNfREVGSU5FKEhBVkVfU1lTX05FUlIpCisgICAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCisgICAgOzsKKworICAqLSotdXdpbiopCisgICAgIyBVbmRlciBzb21lIHZlcnNpb25zIG9mIHV3aW4sIHZmb3JrIGlzIG5vdG9yaW91c2x5IGJ1Z2d5IGFuZCB0aGUgdGVzdCAKKyAgICAjIGNhbiBoYW5nIGNvbmZpZ3VyZTsgb24gb3RoZXIgdmVyc2lvbnMsIHZmb3JrIGV4aXN0cyBqdXN0IGFzIGEgc3R1Yi4KKyAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdmZvcmsgaW4gdXdpbidzIHJ1bnRpbWUgaXMgZml4ZWQuCisgICAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubworICAgIDs7CisKKyAgZXNhYworCisgICMgV2UgaGF2ZW4ndCBzZXQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB5ZXQuICBVc2UgdGhlIHN0YW5kYXJkIGF1dG9jb25mCisgICMgdGVzdHMuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBjb21waWxlciB3b3Jrcy4KKyAgQUNfUFJPR19DQ19XT1JLUworICBBQ19SRVBMQUNFX0ZVTkNTKCRmdW5jcykKKyAgQUNfRlVOQ19BTExPQ0EKKyAgQUNfRlVOQ19WRk9SSworICBpZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KKyAgICBMSUJPQkpTPSIkTElCT0JKUyB2Zm9yay5vIgorICBmaQorICBmb3IgdiBpbiAkdmFyczsgZG8KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkdl0pCisgICAgQUNfQ0FDSEVfVkFMKGxpYmliZXJ0eV9jdl92YXJfJHYsCisgICAgICBbQUNfVFJZX0xJTksoW2ludCAqcDtdLCBbZXh0ZXJuIGludCAkdjsgcCA9ICYkdjtdLAorCQkgICBbZXZhbCAibGliaWJlcnR5X2N2X3Zhcl8kdj15ZXMiXSwKKwkJICAgW2V2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9bm8iXSldKQorICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGxpYmliZXJ0eV9jdl92YXJfJyR2YFwiID0geWVzIjsgdGhlbgorICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICBuPUhBVkVfYGVjaG8gJHYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICBmaQorICBkb25lCisgIEFDX0NIRUNLX0ZVTkNTKCRjaGVja2Z1bmNzKQorZmkKKworIyBJbnN0YWxsIGEgbGlicmFyeSBidWlsdCB3aXRoIGEgY3Jvc3MgY29tcGlsZXIgaW4gJCh0b29sZGlyKSByYXRoZXIKKyMgdGhhbiAkKGxpYmRpcikuCitpZiB0ZXN0IC16ICIke3dpdGhfY3Jvc3NfaG9zdH0iOyB0aGVuCisgIElOU1RBTExfREVTVD1saWJkaXIKK2Vsc2UKKyAgSU5TVEFMTF9ERVNUPXRvb2xkaXIKK2ZpCitBQ19TVUJTVChJTlNUQUxMX0RFU1QpCisKKyMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KK0FDX09VVFBVVChNYWtlZmlsZSwKK1t0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgorICAgICMgRklYTUU6IFdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBhY19maWxlCisgICAgYWNfZmlsZT1NYWtlZmlsZQorICAgIC4gJHtsaWJpYmVydHlfdG9wZGlyfS9jb25maWctbWwuaW4KKyAgZmkKK2ZpXSwKK3NyY2Rpcj0ke3NyY2Rpcn0KK2hvc3Q9JHtob3N0fQordGFyZ2V0PSR7dGFyZ2V0fQord2l0aF90YXJnZXRfc3ViZGlyPSR7d2l0aF90YXJnZXRfc3ViZGlyfQord2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9CithY19jb25maWd1cmVfYXJncz0iLS1lbmFibGUtbXVsdGlsaWIgJHthY19jb25maWd1cmVfYXJnc30iCitDT05GSUdfU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KK2xpYmliZXJ0eV90b3BkaXI9JHtsaWJpYmVydHlfdG9wZGlyfQorKQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvcHlzaWduLmMgYi9saWJpYmVydHkvY29weXNpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVmOGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2NvcHlzaWduLmMKQEAgLTAsMCArMSwxNDAgQEAKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorCisjaWZkZWYgX19JRUVFX0JJR19FTkRJQU4KKwordHlwZWRlZiB1bmlvbiAKK3sKKyAgZG91YmxlIHZhbHVlOworICBzdHJ1Y3QgCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7CisgICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOjQ7CisgICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMToxNjsKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24yOjE2OworICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjM6MTY7CisgICAgCisgIH0gbnVtYmVyOworICBzdHJ1Y3QgCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7CisgICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKKyAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKKyAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjM7CisgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKKyAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24yOjE2OworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjM6MTY7CisgIH0gbmFuOworICBzdHJ1Y3QgCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIG1zdzsKKyAgICB1bnNpZ25lZCBsb25nIGxzdzsKKyAgfSBwYXJ0czsKKyAgICBsb25nIGFzbG9uZ1syXTsKK30gX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlOworCisjZW5kaWYKKworI2lmZGVmIF9fSUVFRV9MSVRUTEVfRU5ESUFOCisKK3R5cGVkZWYgdW5pb24gCit7CisgIGRvdWJsZSB2YWx1ZTsKKyAgc3RydWN0IAorICB7CisjaWZkZWYgX19TTUFMTF9CSVRGSUVMRFMKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24zOjE2OworICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjI6MTY7CisgICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMToxNjsKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA0OworI2Vsc2UKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjMyOworICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6MjA7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQgOjExOworICAgIHVuc2lnbmVkIGludCBzaWduICAgICA6IDE7CisgIH0gbnVtYmVyOworICBzdHJ1Y3QgCisgIHsKKyNpZmRlZiBfX1NNQUxMX0JJVEZJRUxEUworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjM6MTY7CisgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMjoxNjsKKyAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MzsKKyNlbHNlCisgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMTozMjsKKyAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjE5OworI2VuZGlmCisgICAgdW5zaWduZWQgaW50IHF1aWV0OjE7CisgICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiAxMTsKKyAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7CisgIH0gbmFuOworICBzdHJ1Y3QgCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGxzdzsKKyAgICB1bnNpZ25lZCBsb25nIG1zdzsKKyAgfSBwYXJ0czsKKworICBsb25nIGFzbG9uZ1syXTsKKworfSBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGU7CisKKyNlbmRpZgorCisjaWZkZWYgX19JRUVFX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24KK3sKKyAgZmxvYXQgdmFsdWU7CisgIHN0cnVjdCAKKyAgeworICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKKyAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDg7CisgICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDogNzsKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOiAxNjsKKyAgfSBudW1iZXI7CisgIHN0cnVjdCAKKyAgeworICAgIHVuc2lnbmVkIGludCBzaWduOjE7CisgICAgdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7CisgICAgdW5zaWduZWQgaW50IHF1aWV0OjE7CisgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDo2OworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7CisgIH0gbmFuOworICBsb25nIHAxOworICAKK30gX19pZWVlX2Zsb2F0X3NoYXBlX3R5cGU7CisjZW5kaWYKKworI2lmZGVmIF9fSUVFRV9MSVRUTEVfRU5ESUFOCit0eXBlZGVmIHVuaW9uCit7CisgIGZsb2F0IHZhbHVlOworICBzdHJ1Y3QgCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA3OworICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6IDE2OworICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogODsKKyAgICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7CisgIH0gbnVtYmVyOworICBzdHJ1Y3QgCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6NjsKKyAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKKyAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKKyAgICB1bnNpZ25lZCBpbnQgc2lnbjoxOworICB9IG5hbjsKKyAgbG9uZyBwMTsKKyAgCit9IF9faWVlZV9mbG9hdF9zaGFwZV90eXBlOworI2VuZGlmCisKKworZG91YmxlIERFRlVOKGNvcHlzaWduLCAoeCwgeSksIGRvdWJsZSB4IEFORCBkb3VibGUgeSkKK3sKKyAgX19pZWVlX2RvdWJsZV9zaGFwZV90eXBlIGEsYjsKKyAgYi52YWx1ZSA9IHk7ICAKKyAgYS52YWx1ZSA9IHg7CisgIGEubnVtYmVyLnNpZ24gPWIubnVtYmVyLnNpZ247CisgIHJldHVybiBhLnZhbHVlOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NwbHVzLWRlbS5jIGIvbGliaWJlcnR5L2NwbHVzLWRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTU4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvY3BsdXMtZGVtLmMKQEAgLTAsMCArMSw0NTM1IEBACisvKiBEZW1hbmdsZXIgZm9yIEdOVSBDKysKKyAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBKYW1lcyBDbGFyayAoampjQGpjbGFyay51dWNwKQorICAgUmV3cml0dGVuIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pIGZvciBBUk0gYW5kIEx1Y2lkIGRlbWFuZ2xpbmcKKyAgIE1vZGlmaWVkIGJ5IFNhdGlzaCBQYWkgKHBhaUBhcG9sbG8uaHAuY29tKSBmb3IgSFAgZGVtYW5nbGluZworCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCitMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0xpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczsgY3BsdXNfbWFuZ2xlX29wbmFtZSBhbmQgY3BsdXNfZGVtYW5nbGUuCisKKyAgIFRoaXMgZmlsZSBpbXBvcnRzIHhtYWxsb2MgYW5kIHhyZWFsbG9jLCB3aGljaCBhcmUgbGlrZSBtYWxsb2MgYW5kCisgICByZWFsbG9jIGV4Y2VwdCB0aGF0IHRoZXkgZ2VuZXJhdGUgYSBmYXRhbCBlcnJvciBpZiB0aGVyZSBpcyBubworICAgYXZhaWxhYmxlIG1lbW9yeS4gICovCisKKy8qIFRoaXMgZmlsZSBsaXZlcyBpbiBib3RoIEdDQyBhbmQgbGliaWJlcnR5LiAgV2hlbiBtYWtpbmcgY2hhbmdlcywgcGxlYXNlCisgICB0cnkgbm90IHRvIGJyZWFrIGVpdGhlci4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCitjaGFyICogbWFsbG9jICgpOworY2hhciAqIHJlYWxsb2MgKCk7CisjZW5kaWYKKworI2luY2x1ZGUgPGRlbWFuZ2xlLmg+CisjdW5kZWYgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFCisjZGVmaW5lIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSB3b3JrLT5vcHRpb25zCisKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKm15c3Ryc3RyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK215c3Ryc3RyIChzMSwgczIpCisgICAgIGNvbnN0IGNoYXIgKnMxLCAqczI7Cit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSBzMTsKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOworCisgIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQorCXsKKwkgIHJldHVybiAocCk7CisJfQorICAgIH0KKyAgcmV0dXJuICgwKTsKK30KKworLyogSW4gb3JkZXIgdG8gYWxsb3cgYSBzaW5nbGUgZGVtYW5nbGVyIGV4ZWN1dGFibGUgdG8gZGVtYW5nbGUgc3RyaW5ncworICAgdXNpbmcgdmFyaW91cyBjb21tb24gdmFsdWVzIG9mIENQTFVTX01BUktFUiwgYXMgd2VsbCBhcyBhbnkgc3BlY2lmaWMKKyAgIG9uZSBzZXQgYXQgY29tcGlsZSB0aW1lLCB3ZSBtYWludGFpbiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUKKyAgIGNvbW1vbmx5IHVzZWQgb25lcywgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWFya2VyIHdlIGFyZSBsb29raW5nIGZvcgorICAgaXMgaW4gdGhhdCBzdHJpbmcuICBDUExVU19NQVJLRVIgaXMgdXN1YWxseSAnJCcgb24gc3lzdGVtcyB3aGVyZSB0aGUKKyAgIGFzc2VtYmxlciBjYW4gZGVhbCB3aXRoIHRoYXQuICBXaGVyZSB0aGUgYXNzZW1ibGVyIGNhbid0LCBpdCdzIHVzdWFsbHkKKyAgICcuJyAoYnV0IG9uIG1hbnkgc3lzdGVtcyAnLicgaXMgdXNlZCBmb3Igb3RoZXIgdGhpbmdzKS4gIFdlIHB1dCB0aGUKKyAgIGN1cnJlbnQgZGVmaW5lZCBDUExVU19NQVJLRVIgZmlyc3QgKHdoaWNoIGRlZmF1bHRzIHRvICckJyksIGZvbGxvd2VkCisgICBieSB0aGUgbmV4dCBtb3N0IGNvbW1vbiB2YWx1ZSwgZm9sbG93ZWQgYnkgYW4gZXhwbGljaXQgJyQnIGluIGNhc2UKKyAgIHRoZSB2YWx1ZSBvZiBDUExVU19NQVJLRVIgaXMgbm90ICckJy4KKworICAgV2UgY291bGQgYXZvaWQgdGhpcyBpZiB3ZSBjb3VsZCBqdXN0IGdldCBnKysgdG8gdGVsbCB1cyB3aGF0IHRoZSBhY3R1YWwKKyAgIGNwbHVzIG1hcmtlciBjaGFyYWN0ZXIgaXMgYXMgcGFydCBvZiB0aGUgZGVidWcgaW5mb3JtYXRpb24sIHBlcmhhcHMgYnkKKyAgIGVuc3VyaW5nIHRoYXQgaXQgaXMgdGhlIGNoYXJhY3RlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGdjYzxuPl9jb21waWxlZAorICAgbWFya2VyIHN5bWJvbCAoRklYTUUpLiAgKi8KKworI2lmICFkZWZpbmVkIChDUExVU19NQVJLRVIpCisjZGVmaW5lIENQTFVTX01BUktFUiAnJCcKKyNlbmRpZgorCitlbnVtIGRlbWFuZ2xpbmdfc3R5bGVzIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGdudV9kZW1hbmdsaW5nOworCitzdGF0aWMgY2hhciBjcGx1c19tYXJrZXJzW10gPSB7IENQTFVTX01BUktFUiwgJy4nLCAnJCcsICdcMCcgfTsKKworc3RhdGljIGNoYXIgY2hhcl9zdHJbMl0gPSB7ICdcMDAwJywgJ1wwMDAnIH07CisKK3ZvaWQKK3NldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcgKGNoKQorICAgICBpbnQgY2g7Cit7CisgIGNwbHVzX21hcmtlcnNbMF0gPSBjaDsKK30KKwordHlwZWRlZiBzdHJ1Y3Qgc3RyaW5nCQkvKiBCZXdhcmU6IHRoZXNlIGFyZW4ndCByZXF1aXJlZCB0byBiZSAqLworewkJCQkvKiAgJ1wwJyB0ZXJtaW5hdGVkLiAgKi8KKyAgY2hhciAqYjsJCQkvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIHN0cmluZyAqLworICBjaGFyICpwOwkJCS8qIHBvaW50ZXIgYWZ0ZXIgbGFzdCBjaGFyYWN0ZXIgKi8KKyAgY2hhciAqZTsJCQkvKiBwb2ludGVyIGFmdGVyIGVuZCBvZiBhbGxvY2F0ZWQgc3BhY2UgKi8KK30gc3RyaW5nOworCisvKiBTdHVmZiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHN1Yi1yb3V0aW5lcy4KKyAgIFVzaW5nIGEgc2hhcmVkIHN0cnVjdHVyZSBhbGxvd3MgY3BsdXNfZGVtYW5nbGUgdG8gYmUgcmVlbnRyYW50LiAgKi8KKworc3RydWN0IHdvcmtfc3R1ZmYKK3sKKyAgaW50IG9wdGlvbnM7CisgIGNoYXIgKip0eXBldmVjOworICBjaGFyICoqa3R5cGV2ZWM7CisgIGNoYXIgKipidHlwZXZlYzsKKyAgaW50IG51bWs7CisgIGludCBudW1iOworICBpbnQga3NpemU7CisgIGludCBic2l6ZTsKKyAgaW50IG50eXBlczsKKyAgaW50IHR5cGV2ZWNfc2l6ZTsKKyAgaW50IGNvbnN0cnVjdG9yOworICBpbnQgZGVzdHJ1Y3RvcjsKKyAgaW50IHN0YXRpY190eXBlOwkvKiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKi8KKyAgaW50IHRlbXBfc3RhcnQ7ICAgICAgIC8qIGluZGV4IGluIGRlbWFuZ2xlZCB0byBzdGFydCBvZiB0ZW1wbGF0ZSBhcmdzICovCisgIGludCB0eXBlX3F1YWxzOyAgICAgICAvKiBUaGUgdHlwZSBxdWFsaWZpZXJzLiAgKi8KKyAgaW50IGRsbGltcG9ydGVkOwkvKiBTeW1ib2wgaW1wb3J0ZWQgZnJvbSBhIFBFIERMTCAqLworICBjaGFyICoqdG1wbF9hcmd2ZWM7ICAgLyogVGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnRzLiAqLworICBpbnQgbnRtcGxfYXJnczsgICAgICAgLyogVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuICovCisgIGludCBmb3JnZXR0aW5nX3R5cGVzOyAvKiBOb256ZXJvIGlmIHdlIGFyZSBub3QgcmVtZW1iZXJpbmcgdGhlIHR5cGVzCisJCQkgICB3ZSBzZWUuICAqLworICBzdHJpbmcqIHByZXZpb3VzX2FyZ3VtZW50OyAvKiBUaGUgbGFzdCBmdW5jdGlvbiBhcmd1bWVudCBkZW1hbmdsZWQuICAqLworICBpbnQgbnJlcGVhdHM7ICAgICAgICAgLyogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHByZXZpb3VzCisJCQkgICBhcmd1bWVudC4gICovCit9OworCisjZGVmaW5lIFBSSU5UX0FOU0lfUVVBTElGSUVSUyAod29yayAtPiBvcHRpb25zICYgRE1HTF9BTlNJKQorI2RlZmluZSBQUklOVF9BUkdfVFlQRVMgICAgICAgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfUEFSQU1TKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGFibGUKK3sKKyAgY29uc3QgY2hhciAqaW47CisgIGNvbnN0IGNoYXIgKm91dDsKKyAgaW50IGZsYWdzOworfSBvcHRhYmxlW10gPSB7CisgIHsibnciLAkgICIgbmV3IiwJRE1HTF9BTlNJfSwJLyogbmV3ICgxLjkyLAkgYW5zaSkgKi8KKyAgeyJkbCIsCSAgIiBkZWxldGUiLAlETUdMX0FOU0l9LAkvKiBuZXcgKDEuOTIsCSBhbnNpKSAqLworICB7Im5ldyIsCSAgIiBuZXciLAkwfSwJCS8qIG9sZCAoMS45MSwJIGFuZCAxLngpICovCisgIHsiZGVsZXRlIiwJICAiIGRlbGV0ZSIsCTB9LAkJLyogb2xkICgxLjkxLAkgYW5kIDEueCkgKi8KKyAgeyJ2biIsCSAgIiBuZXcgW10iLAlETUdMX0FOU0l9LAkvKiBHTlUsIHBlbmRpbmcgYW5zaSAqLworICB7InZkIiwJICAiIGRlbGV0ZSBbXSIsCURNR0xfQU5TSX0sCS8qIEdOVSwgcGVuZGluZyBhbnNpICovCisgIHsiYXMiLAkgICI9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJuZSIsCSAgIiE9IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwgYW5zaSAqLworICB7ImVxIiwJICAiPT0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCisgIHsiZ2UiLAkgICI+PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KKyAgeyJndCIsCSAgIj4iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCisgIHsibGUiLAkgICI8PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KKyAgeyJsdCIsCSAgIjwiLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCisgIHsicGx1cyIsCSAgIisiLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJwbCIsCSAgIisiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImFwbCIsCSAgIis9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJtaW51cyIsCSAgIi0iLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJtaSIsCSAgIi0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImFtaSIsCSAgIi09IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJtdWx0IiwJICAiKiIsCQkwfSwJCS8qIG9sZCAqLworICB7Im1sIiwJICAiKiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsiYW11IiwJICAiKj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAoQVJNL0x1Y2lkKSAqLworICB7ImFtbCIsCSAgIio9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKEdOVS9nKyspICovCisgIHsiY29udmVydCIsCSAgIisiLAkJMH0sCQkvKiBvbGQgKHVuYXJ5ICspICovCisgIHsibmVnYXRlIiwJICAiLSIsCQkwfSwJCS8qIG9sZCAodW5hcnkgLSkgKi8KKyAgeyJ0cnVuY19tb2QiLAkgICIlIiwJCTB9LAkJLyogb2xkICovCisgIHsibWQiLAkgICIlIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJhbWQiLAkgICIlPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsidHJ1bmNfZGl2IiwJICAiLyIsCQkwfSwJCS8qIG9sZCAqLworICB7ImR2IiwJICAiLyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsiYWR2IiwJICAiLz0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7InRydXRoX2FuZGlmIiwgIiYmIiwJCTB9LAkJLyogb2xkICovCisgIHsiYWEiLAkgICImJiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsidHJ1dGhfb3JpZiIsICAifHwiLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJvbyIsCSAgInx8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJ0cnV0aF9ub3QiLAkgICIhIiwJCTB9LAkJLyogb2xkICovCisgIHsibnQiLAkgICIhIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJwb3N0aW5jcmVtZW50IiwiKysiLAkwfSwJCS8qIG9sZCAqLworICB7InBwIiwJICAiKysiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7InBvc3RkZWNyZW1lbnQiLCItLSIsCTB9LAkJLyogb2xkICovCisgIHsibW0iLAkgICItLSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsiYml0X2lvciIsCSAgInwiLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJvciIsCSAgInwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImFvciIsCSAgInw9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJiaXRfeG9yIiwJICAiXiIsCQkwfSwJCS8qIG9sZCAqLworICB7ImVyIiwJICAiXiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsiYWVyIiwJICAiXj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImJpdF9hbmQiLAkgICImIiwJCTB9LAkJLyogb2xkICovCisgIHsiYWQiLAkgICImIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJhYWQiLAkgICImPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsiYml0X25vdCIsCSAgIn4iLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJjbyIsCSAgIn4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImNhbGwiLAkgICIoKSIsCQkwfSwJCS8qIG9sZCAqLworICB7ImNsIiwJICAiKCkiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImFsc2hpZnQiLAkgICI8PCIsCQkwfSwJCS8qIG9sZCAqLworICB7ImxzIiwJICAiPDwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImFscyIsCSAgIjw8PSIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJhcnNoaWZ0IiwJICAiPj4iLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJycyIsCSAgIj4+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJhcnMiLAkgICI+Pj0iLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCisgIHsiY29tcG9uZW50IiwJICAiLT4iLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJwdCIsCSAgIi0+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2k7IEx1Y2lkIEMrKyBmb3JtICovCisgIHsicmYiLAkgICItPiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpOyBBUk0vR05VIGZvcm0gKi8KKyAgeyJpbmRpcmVjdCIsCSAgIioiLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJtZXRob2RfY2FsbCIsICAiLT4oKSIsCTB9LAkJLyogb2xkICovCisgIHsiYWRkciIsCSAgIiYiLAkJMH0sCQkvKiBvbGQgKHVuYXJ5ICYpICovCisgIHsiYXJyYXkiLAkgICJbXSIsCQkwfSwJCS8qIG9sZCAqLworICB7InZjIiwJICAiW10iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7ImNvbXBvdW5kIiwJICAiLCAiLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJjbSIsCSAgIiwgIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KKyAgeyJjb25kIiwJICAiPzoiLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJjbiIsCSAgIj86IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCisgIHsibWF4IiwJICAiPj8iLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJteCIsCSAgIj4/IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCisgIHsibWluIiwJICAiPD8iLAkJMH0sCQkvKiBvbGQgKi8KKyAgeyJtbiIsCSAgIjw/IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCisgIHsibm9wIiwJICAiIiwJCTB9LAkJLyogb2xkIChmb3Igb3BlcmF0b3I9KSAqLworICB7InJtIiwJICAiLT4qIiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLworICB7InN6IiwgICAgICAgICAgInNpemVvZiAiLCAgICBETUdMX0FOU0l9ICAgICAgLyogcHNldWRvLWFuc2kgKi8KK307CisKKy8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmFyaW91cyB0eXBlIHZhcmlldGllcy4KKyAgIFRoZXkgYXJlIGFsbCBub24temVybyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYXMgYHN1Y2Nlc3MnCisgICB2YWx1ZXMuICAqLwordHlwZWRlZiBlbnVtIHR5cGVfa2luZF90Cit7CisgIHRrX25vbmUsCisgIHRrX3BvaW50ZXIsCisgIHRrX3JlZmVyZW5jZSwKKyAgdGtfaW50ZWdyYWwsCisgIHRrX2Jvb2wsCisgIHRrX2NoYXIsCisgIHRrX3JlYWwKK30gdHlwZV9raW5kX3Q7CisKKyNkZWZpbmUgU1RSSU5HX0VNUFRZKHN0cikJKChzdHIpIC0+IGIgPT0gKHN0cikgLT4gcCkKKyNkZWZpbmUgUFJFUEVORF9CTEFOSyhzdHIpCXtpZiAoIVNUUklOR19FTVBUWShzdHIpKSBcCisgICAgc3RyaW5nX3ByZXBlbmQoc3RyLCAiICIpO30KKyNkZWZpbmUgQVBQRU5EX0JMQU5LKHN0cikJe2lmICghU1RSSU5HX0VNUFRZKHN0cikpIFwKKyAgICBzdHJpbmdfYXBwZW5kKHN0ciwgIiAiKTt9CisjZGVmaW5lIExFTl9TVFJJTkcoc3RyKSAgICAgICAgICggKFNUUklOR19FTVBUWShzdHIpKT8wOigoc3RyKS0+cCAtIChzdHIpLT5iKSkKKworLyogVGhlIHNjb3BlIHNlcGFyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhlIGxhbmd1YWdlIGJlaW5nIGRlbWFuZ2xlZC4gICovCisKKyNkZWZpbmUgU0NPUEVfU1RSSU5HKHdvcmspICgod29yay0+b3B0aW9ucyAmIERNR0xfSkFWQSkgPyAiLiIgOiAiOjoiKQorCisjZGVmaW5lIEFSTV9WVEFCTEVfU1RSSU5HICJfX3Z0YmxfXyIJLyogTHVjaWQvQVJNIHZpcnR1YWwgdGFibGUgcHJlZml4ICovCisjZGVmaW5lIEFSTV9WVEFCTEVfU1RSTEVOIDgJCS8qIHN0cmxlbiAoQVJNX1ZUQUJMRV9TVFJJTkcpICovCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgY2hhciAqCittb3BfdXAgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgc3RyaW5nICosIGludCkpOworCitzdGF0aWMgdm9pZAorc3F1YW5nbGVfbW9wX3VwIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKKworI2lmIDAKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX21ldGhvZF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7CisjZW5kaWYKKworc3RhdGljIGNoYXIgKgoraW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssCisJCQkJCSBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOworCitzdGF0aWMgaW50CitkZW1hbmdsZV90ZW1wbGF0ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCisJCQkgICBzdHJpbmcgKiwgaW50LCBpbnQpKTsKKworc3RhdGljIGludAorYXJtX3B0IFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqLAorCQljb25zdCBjaGFyICoqKSk7CisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX2NsYXNzX25hbWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKKworc3RhdGljIGludAorZGVtYW5nbGVfcXVhbGlmaWVkIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAorCQkJICAgIGludCwgaW50KSk7CisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX2NsYXNzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7CisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX2Z1bmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOworCitzdGF0aWMgaW50CitkZW1hbmdsZV9zaWduYXR1cmUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKKworc3RhdGljIGludAorZGVtYW5nbGVfcHJlZml4IFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7CisKK3N0YXRpYyBpbnQKK2dudV9zcGVjaWFsIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7CisKK3N0YXRpYyBpbnQKK2FybV9zcGVjaWFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfbmVlZCBQQVJBTVMgKChzdHJpbmcgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfZGVsZXRlIFBBUkFNUyAoKHN0cmluZyAqKSk7CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfaW5pdCBQQVJBTVMgKChzdHJpbmcgKikpOworCitzdGF0aWMgdm9pZAorc3RyaW5nX2NsZWFyIFBBUkFNUyAoKHN0cmluZyAqKSk7CisKKyNpZiAwCitzdGF0aWMgaW50CitzdHJpbmdfZW1wdHkgUEFSQU1TICgoc3RyaW5nICopKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc3RyaW5nX2FwcGVuZCBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfYXBwZW5kcyBQQVJBTVMgKChzdHJpbmcgKiwgc3RyaW5nICopKTsKKworc3RhdGljIHZvaWQKK3N0cmluZ19hcHBlbmRuIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorc3RyaW5nX3ByZXBlbmQgUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorc3RyaW5nX3ByZXBlbmRuIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICosIGludCkpOworCitzdGF0aWMgaW50CitnZXRfY291bnQgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgaW50ICopKTsKKworc3RhdGljIGludAorY29uc3VtZV9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqKSk7CisKK3N0YXRpYyBpbnQKK2NvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyBQQVJBTVMgKChjb25zdCBjaGFyKiopKTsKKworc3RhdGljIGludAorZGVtYW5nbGVfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOworCitzdGF0aWMgaW50CitkZW1hbmdsZV9uZXN0ZWRfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiosIGNvbnN0IGNoYXIqKiwgc3RyaW5nKikpOworCitzdGF0aWMgaW50Citkb190eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7CisKK3N0YXRpYyBpbnQKK2RvX2FyZyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOworCitzdGF0aWMgdm9pZAorZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKKwkJCQljb25zdCBjaGFyICopKTsKKworc3RhdGljIHZvaWQKK3JlbWVtYmVyX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3JlbWVtYmVyX0J0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKKworc3RhdGljIGludAorcmVnaXN0ZXJfQnR5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOworCitzdGF0aWMgdm9pZAorcmVtZW1iZXJfS3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2ZvcmdldF90eXBlcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7CisKK3N0YXRpYyB2b2lkCitmb3JnZXRfQl9hbmRfS190eXBlcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfcHJlcGVuZHMgUEFSQU1TICgoc3RyaW5nICosIHN0cmluZyAqKSk7CisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYqLCBjb25zdCBjaGFyKiosCisJCQkJICAgICAgc3RyaW5nKiwgdHlwZV9raW5kX3QpKTsKKworc3RhdGljIGludAorZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKKworc3RhdGljIGludAorZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOworCitzdGF0aWMgaW50CitzbmFyZl9udW1lcmljX2xpdGVyYWwgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKKworLyogVGhlcmUgaXMgYSBUWVBFX1FVQUwgdmFsdWUgZm9yIGVhY2ggdHlwZSBxdWFsaWZpZXIuICBUaGV5IGNhbiBiZQorICAgY29tYmluZWQgYnkgYml0d2lzZS1vciB0byBmb3JtIHRoZSBjb21wbGV0ZSBzZXQgb2YgcXVhbGlmaWVycyBmb3IgYQorICAgdHlwZS4gICovCisKKyNkZWZpbmUgVFlQRV9VTlFVQUxJRklFRCAgIDB4MAorI2RlZmluZSBUWVBFX1FVQUxfQ09OU1QgICAgMHgxCisjZGVmaW5lIFRZUEVfUVVBTF9WT0xBVElMRSAweDIKKyNkZWZpbmUgVFlQRV9RVUFMX1JFU1RSSUNUIDB4NAorCitzdGF0aWMgaW50Citjb2RlX2Zvcl9xdWFsaWZpZXIgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBjb25zdCBjaGFyKgorcXVhbGlmaWVyX3N0cmluZyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitkZW1hbmdsZV9xdWFsaWZpZXIgUEFSQU1TICgoaW50KSk7CisKKy8qIFRyYW5zbGF0ZSBjb3VudCB0byBpbnRlZ2VyLCBjb25zdW1pbmcgdG9rZW5zIGluIHRoZSBwcm9jZXNzLgorICAgQ29udmVyc2lvbiB0ZXJtaW5hdGVzIG9uIHRoZSBmaXJzdCBub24tZGlnaXQgY2hhcmFjdGVyLgorCisgICBUcnlpbmcgdG8gY29uc3VtZSBzb21ldGhpbmcgdGhhdCBpc24ndCBhIGNvdW50IHJlc3VsdHMgaW4gbm8KKyAgIGNvbnN1bXB0aW9uIG9mIGlucHV0IGFuZCBhIHJldHVybiBvZiAtMS4KKworICAgT3ZlcmZsb3cgY29uc3VtZXMgdGhlIHJlc3Qgb2YgdGhlIGRpZ2l0cywgYW5kIHJldHVybnMgLTEuICAqLworCitzdGF0aWMgaW50Citjb25zdW1lX2NvdW50ICh0eXBlKQorICAgICBjb25zdCBjaGFyICoqdHlwZTsKK3sKKyAgaW50IGNvdW50ID0gMDsKKworICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQorICAgIHJldHVybiAtMTsKKworICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKKyAgICB7CisgICAgICBjb3VudCAqPSAxMDsKKworICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LgorCSBXZSBhc3N1bWUgdGhhdCBjb3VudCBpcyByZXByZXNlbnRlZCB1c2luZyB0d28ncy1jb21wbGVtZW50OworCSBubyBwb3dlciBvZiB0d28gaXMgZGl2aXNpYmxlIGJ5IHRlbiwgc28gaWYgYW4gb3ZlcmZsb3cgb2NjdXJzCisJIHdoZW4gbXVsdGlwbHlpbmcgYnkgdGVuLCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIGEgbXVsdGlwbGUgb2YKKwkgdGVuLiAgKi8KKyAgICAgIGlmICgoY291bnQgJSAxMCkgIT0gMCkKKwl7CisJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqdHlwZSkpCisJICAgICgqdHlwZSkrKzsKKwkgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIGNvdW50ICs9ICoqdHlwZSAtICcwJzsKKyAgICAgICgqdHlwZSkrKzsKKyAgICB9CisKKyAgcmV0dXJuIChjb3VudCk7Cit9CisKKworLyogTGlrZSBjb25zdW1lX2NvdW50LCBidXQgZm9yIGNvdW50cyB0aGF0IGFyZSBwcmVjZWRlZCBhbmQgZm9sbG93ZWQKKyAgIGJ5ICdfJyBpZiB0aGV5IGFyZSBncmVhdGVyIHRoYW4gMTAuICBBbHNvLCAtMSBpcyByZXR1cm5lZCBmb3IKKyAgIGZhaWx1cmUsIHNpbmNlIDAgY2FuIGJlIGEgdmFsaWQgdmFsdWUuICAqLworCitzdGF0aWMgaW50Citjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpCisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworeworICBpbnQgaWR4OworCisgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQorICAgIHsKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKKwlyZXR1cm4gLTE7CisKKyAgICAgIGlkeCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOworICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCisJLyogVGhlIHRyYWlsaW5nIHVuZGVyc2NvcmUgd2FzIG1pc3NpbmcuICovCisJcmV0dXJuIC0xOworCisgICAgICAoKm1hbmdsZWQpKys7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCoqbWFuZ2xlZCA8ICcwJyB8fCAqKm1hbmdsZWQgPiAnOScpCisJcmV0dXJuIC0xOworCisgICAgICBpZHggPSAqKm1hbmdsZWQgLSAnMCc7CisgICAgICAoKm1hbmdsZWQpKys7CisgICAgfQorCisgIHJldHVybiBpZHg7Cit9CisKKy8qIEMgaXMgdGhlIGNvZGUgZm9yIGEgdHlwZS1xdWFsaWZpZXIuICBSZXR1cm4gdGhlIFRZUEVfUVVBTAorICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHF1YWxpZmllci4gICovCisKK3N0YXRpYyBpbnQKK2NvZGVfZm9yX3F1YWxpZmllciAoYykKKyAgaW50IGM7Cit7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAnQyc6CisgICAgICByZXR1cm4gVFlQRV9RVUFMX0NPTlNUOworCisgICAgY2FzZSAnVic6CisgICAgICByZXR1cm4gVFlQRV9RVUFMX1ZPTEFUSUxFOworCisgICAgY2FzZSAndSc6CisgICAgICByZXR1cm4gVFlQRV9RVUFMX1JFU1RSSUNUOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBDIHdhcyBhbiBpbnZhbGlkIHF1YWxpZmllci4gICovCisgIGFib3J0ICgpOworfQorCisvKiBSZXR1cm4gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBxdWFsaWZpZXJzIGdpdmVuIGJ5CisgICBUWVBFX1FVQUxTLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIqCitxdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKQorICAgICBpbnQgdHlwZV9xdWFsczsKK3sKKyAgc3dpdGNoICh0eXBlX3F1YWxzKQorICAgIHsKKyAgICBjYXNlIFRZUEVfVU5RVUFMSUZJRUQ6CisgICAgICByZXR1cm4gIiI7CisKKyAgICBjYXNlIFRZUEVfUVVBTF9DT05TVDoKKyAgICAgIHJldHVybiAiY29uc3QiOworCisgICAgY2FzZSBUWVBFX1FVQUxfVk9MQVRJTEU6CisgICAgICByZXR1cm4gInZvbGF0aWxlIjsKKworICAgIGNhc2UgVFlQRV9RVUFMX1JFU1RSSUNUOgorICAgICAgcmV0dXJuICJfX3Jlc3RyaWN0IjsKKworICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1ZPTEFUSUxFOgorICAgICAgcmV0dXJuICJjb25zdCB2b2xhdGlsZSI7CisKKyAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9SRVNUUklDVDoKKyAgICAgIHJldHVybiAiY29uc3QgX19yZXN0cmljdCI7CisKKyAgICBjYXNlIFRZUEVfUVVBTF9WT0xBVElMRSB8IFRZUEVfUVVBTF9SRVNUUklDVDoKKyAgICAgIHJldHVybiAidm9sYXRpbGUgX19yZXN0cmljdCI7CisKKyAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9WT0xBVElMRSB8IFRZUEVfUVVBTF9SRVNUUklDVDoKKyAgICAgIHJldHVybiAiY29uc3Qgdm9sYXRpbGUgX19yZXN0cmljdCI7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFRZUEVfUVVBTFMgd2FzIGFuIGludmFsaWQgcXVhbGlmaWVyIHNldC4gICovCisgIGFib3J0ICgpOworfQorCisvKiBDIGlzIHRoZSBjb2RlIGZvciBhIHR5cGUtcXVhbGlmaWVyLiAgUmV0dXJuIHRoZSBzdHJpbmcKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBxdWFsaWZpZXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlCisgICBjYWxsZWQgd2l0aCBhIHZhbGlkIHF1YWxpZmllciBjb2RlLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIqCitkZW1hbmdsZV9xdWFsaWZpZXIgKGMpCisgIGludCBjOworeworICByZXR1cm4gcXVhbGlmaWVyX3N0cmluZyAoY29kZV9mb3JfcXVhbGlmaWVyIChjKSk7Cit9CisKK2ludAorY3BsdXNfZGVtYW5nbGVfb3BuYW1lIChvcG5hbWUsIHJlc3VsdCwgb3B0aW9ucykKKyAgICAgY29uc3QgY2hhciAqb3BuYW1lOworICAgICBjaGFyICpyZXN1bHQ7CisgICAgIGludCBvcHRpb25zOworeworICBpbnQgbGVuLCBsZW4xLCByZXQ7CisgIHN0cmluZyB0eXBlOworICBzdHJ1Y3Qgd29ya19zdHVmZiB3b3JrWzFdOworICBjb25zdCBjaGFyICp0ZW07CisKKyAgbGVuID0gc3RybGVuKG9wbmFtZSk7CisgIHJlc3VsdFswXSA9ICdcMCc7CisgIHJldCA9IDA7CisgIG1lbXNldCAoKGNoYXIgKikgd29yaywgMCwgc2l6ZW9mICh3b3JrKSk7CisgIHdvcmstPm9wdGlvbnMgPSBvcHRpb25zOworCisgIGlmIChvcG5hbWVbMF0gPT0gJ18nICYmIG9wbmFtZVsxXSA9PSAnXycKKyAgICAgICYmIG9wbmFtZVsyXSA9PSAnbycgJiYgb3BuYW1lWzNdID09ICdwJykKKyAgICB7CisgICAgICAvKiBBTlNJLiAgKi8KKyAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCisgICAgICB0ZW0gPSBvcG5hbWUgKyA0OworICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKKwl7CisJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yICIpOworCSAgc3RybmNhdCAocmVzdWx0LCB0eXBlLmIsIHR5cGUucCAtIHR5cGUuYik7CisJICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7CisJICByZXQgPSAxOworCX0KKyAgICB9CisgIGVsc2UgaWYgKG9wbmFtZVswXSA9PSAnXycgJiYgb3BuYW1lWzFdID09ICdfJworCSAgICYmIG9wbmFtZVsyXSA+PSAnYScgJiYgb3BuYW1lWzJdIDw9ICd6JworCSAgICYmIG9wbmFtZVszXSA+PSAnYScgJiYgb3BuYW1lWzNdIDw9ICd6JykKKyAgICB7CisgICAgICBpZiAob3BuYW1lWzRdID09ICdcMCcpCisJeworCSAgLyogT3BlcmF0b3IuICAqLworCSAgc2l6ZV90IGk7CisJICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKKwkgICAgeworCSAgICAgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDIKKwkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDIsIDIpID09IDApCisJCXsKKwkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7CisJCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKKwkJICByZXQgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKG9wbmFtZVsyXSA9PSAnYScgJiYgb3BuYW1lWzVdID09ICdcMCcpCisJICAgIHsKKwkgICAgICAvKiBBc3NpZ25tZW50LiAgKi8KKwkgICAgICBzaXplX3QgaTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKKwkJeworCQkgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDMKKwkJICAgICAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAyLCAzKSA9PSAwKQorCQkgICAgeworCQkgICAgICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7CisJCSAgICAgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7CisJCSAgICAgIHJldCA9IDE7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChsZW4gPj0gMworCSAgICYmIG9wbmFtZVswXSA9PSAnbycKKwkgICAmJiBvcG5hbWVbMV0gPT0gJ3AnCisJICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBvcG5hbWVbMl0pICE9IE5VTEwpCisgICAgeworICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCisgICAgICBpZiAobGVuID49IDEwIC8qIG9wJGFzc2lnbl8gKi8KKwkgICYmIG1lbWNtcCAob3BuYW1lICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQorCXsKKwkgIHNpemVfdCBpOworCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCisJICAgIHsKKwkgICAgICBsZW4xID0gbGVuIC0gMTA7CisJICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuMQorCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMTAsIGxlbjEpID09IDApCisJCXsKKwkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7CisJCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKKwkJICBzdHJjYXQgKHJlc3VsdCwgIj0iKTsKKwkJICByZXQgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgc2l6ZV90IGk7CisJICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKKwkgICAgeworCSAgICAgIGxlbjEgPSBsZW4gLSAzOworCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbjEKKwkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDMsIGxlbjEpID09IDApCisJCXsKKwkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7CisJCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKKwkJICByZXQgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChsZW4gPj0gNSAmJiBtZW1jbXAgKG9wbmFtZSwgInR5cGUiLCA0KSA9PSAwCisJICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBvcG5hbWVbNF0pICE9IE5VTEwpCisgICAgeworICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yICovCisgICAgICB0ZW0gPSBvcG5hbWUgKyA1OworICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKKwl7CisJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yICIpOworCSAgc3RybmNhdCAocmVzdWx0LCB0eXBlLmIsIHR5cGUucCAtIHR5cGUuYik7CisJICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7CisJICByZXQgPSAxOworCX0KKyAgICB9CisgIHNxdWFuZ2xlX21vcF91cCAod29yayk7CisgIHJldHVybiByZXQ7CisKK30KKy8qIFRha2VzIG9wZXJhdG9yIG5hbWUgYXMgZS5nLiAiKysiIGFuZCByZXR1cm5zIG1hbmdsZWQKKyAgIG9wZXJhdG9yIG5hbWUgKGUuZy4gInBvc3RpbmNyZW1lbnRfZXhwciIpLCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KKworICAgSWYgT1BUSU9OUyAmIERNR0xfQU5TSSA9PSAxLCByZXR1cm4gdGhlIEFOU0kgbmFtZTsKKyAgIGlmIE9QVElPTlMgJiBETUdMX0FOU0kgPT0gMCwgcmV0dXJuIHRoZSBvbGQgR05VIG5hbWUuICAqLworCitjb25zdCBjaGFyICoKK2NwbHVzX21hbmdsZV9vcG5hbWUgKG9wbmFtZSwgb3B0aW9ucykKKyAgICAgY29uc3QgY2hhciAqb3BuYW1lOworICAgICBpbnQgb3B0aW9uczsKK3sKKyAgc2l6ZV90IGk7CisgIGludCBsZW47CisKKyAgbGVuID0gc3RybGVuIChvcG5hbWUpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLm91dCkgPT0gbGVuCisJICAmJiAob3B0aW9ucyAmIERNR0xfQU5TSSkgPT0gKG9wdGFibGVbaV0uZmxhZ3MgJiBETUdMX0FOU0kpCisJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0ub3V0LCBvcG5hbWUsIGxlbikgPT0gMCkKKwlyZXR1cm4gb3B0YWJsZVtpXS5pbjsKKyAgICB9CisgIHJldHVybiAoMCk7Cit9CisKKy8qIGNoYXIgKmNwbHVzX2RlbWFuZ2xlIChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykKKworICAgSWYgTUFOR0xFRCBpcyBhIG1hbmdsZWQgZnVuY3Rpb24gbmFtZSBwcm9kdWNlZCBieSBHTlUgQysrLCB0aGVuCisgICBhIHBvaW50ZXIgdG8gYSBtYWxsb2NlZCBzdHJpbmcgZ2l2aW5nIGEgQysrIHJlcHJlc2VudGF0aW9uCisgICBvZiB0aGUgbmFtZSB3aWxsIGJlIHJldHVybmVkOyBvdGhlcndpc2UgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhlIHN0cmluZyB3aGljaAorICAgaXMgcmV0dXJuZWQuCisKKyAgIFRoZSBPUFRJT05TIGFyZyBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGJpdHM6CisKKyAgIAlETUdMX0FOU0kJQU5TSSBxdWFsaWZpZXJzIHN1Y2ggYXMgYGNvbnN0JyBhbmQgYHZvaWQnIGFyZQorCQkJaW5jbHVkZWQuCisJRE1HTF9QQVJBTVMJRnVuY3Rpb24gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuCisKKyAgIEZvciBleGFtcGxlLAorCisgICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgRE1HTF9QQVJBTVMpCQk9PiAiQTo6Zm9vKGludCkiCisgICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpCT0+ICJBOjpmb28oaW50KSIKKyAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCAwKQkJCT0+ICJBOjpmb28iCisKKyAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgRE1HTF9QQVJBTVMpCQk9PiAiQTo6Zm9vKGZsb2F0LC4uLikiCisgICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKT0+ICJBOjpmb28oZmxvYXQsLi4uKSIKKyAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgMCkJCQk9PiAiQTo6Zm9vIgorCisgICBOb3RlIHRoYXQgYW55IGxlYWRpbmcgdW5kZXJzY29yZXMsIG9yIG90aGVyIHN1Y2ggY2hhcmFjdGVycyBwcmVwZW5kZWQgYnkKKyAgIHRoZSBjb21waWxhdGlvbiBzeXN0ZW0sIGFyZSBwcmVzdW1lZCB0byBoYXZlIGFscmVhZHkgYmVlbiBzdHJpcHBlZCBmcm9tCisgICBNQU5HTEVELiAgKi8KKworY2hhciAqCitjcGx1c19kZW1hbmdsZSAobWFuZ2xlZCwgb3B0aW9ucykKKyAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKKyAgICAgaW50IG9wdGlvbnM7Cit7CisgIGNoYXIgKnJldDsKKyAgc3RydWN0IHdvcmtfc3R1ZmYgd29ya1sxXTsKKyAgbWVtc2V0ICgoY2hhciAqKSB3b3JrLCAwLCBzaXplb2YgKHdvcmspKTsKKyAgd29yayAtPiBvcHRpb25zID0gb3B0aW9uczsKKyAgaWYgKCh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX1NUWUxFX01BU0spID09IDApCisgICAgd29yayAtPiBvcHRpb25zIHw9IChpbnQpIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSAmIERNR0xfU1RZTEVfTUFTSzsKKworICByZXQgPSBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgbWFuZ2xlZCk7CisgIHNxdWFuZ2xlX21vcF91cCAod29yayk7CisgIHJldHVybiAocmV0KTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG1vc3Qgb2Ygd2hhdCBjcGx1c19kZW1hbmdsZSB1c2UgdG8gZG8sIGJ1dAorICAgdG8gYmUgYWJsZSB0byBkZW1hbmdsZSBhIG5hbWUgd2l0aCBhIEIsIEsgb3IgbiBjb2RlLCB3ZSBuZWVkIHRvCisgICBoYXZlIGEgbG9uZ2VyIHRlcm0gbWVtb3J5IG9mIHdoYXQgdHlwZXMgaGF2ZSBiZWVuIHNlZW4uIFRoZSBvcmlnaW5hbAorICAgbm93IGludGlhbGl6ZXMgYW5kIGNsZWFucyB1cCB0aGUgc3F1YW5nbGUgY29kZSBpbmZvLCB3aGlsZSBpbnRlcm5hbAorICAgY2FsbHMgZ28gZGlyZWN0bHkgdG8gdGhpcyByb3V0aW5lIHRvIGF2b2lkIHJlc2V0dGluZyB0aGF0IGluZm8uICovCisKK3N0YXRpYyBjaGFyICoKK2ludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCBtYW5nbGVkKQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKK3sKKworICBzdHJpbmcgZGVjbDsKKyAgaW50IHN1Y2Nlc3MgPSAwOworICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOworICBpbnQgczEsczIsczMsczQ7CisgIHMxID0gd29yay0+Y29uc3RydWN0b3I7CisgIHMyID0gd29yay0+ZGVzdHJ1Y3RvcjsKKyAgczMgPSB3b3JrLT5zdGF0aWNfdHlwZTsKKyAgczQgPSB3b3JrLT50eXBlX3F1YWxzOworICB3b3JrLT5jb25zdHJ1Y3RvciA9IHdvcmstPmRlc3RydWN0b3IgPSAwOworICB3b3JrLT50eXBlX3F1YWxzID0gVFlQRV9VTlFVQUxJRklFRDsKKyAgd29yay0+ZGxsaW1wb3J0ZWQgPSAwOworCisgIGlmICgobWFuZ2xlZCAhPSBOVUxMKSAmJiAoKm1hbmdsZWQgIT0gJ1wwJykpCisgICAgeworICAgICAgc3RyaW5nX2luaXQgKCZkZWNsKTsKKworICAgICAgLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGdudSBzdHlsZSBkZW1hbmdsaW5nIGlzIGFjdGl2ZSBhbmQgaWYgdGhlCisJIHN0cmluZyB0byBiZSBkZW1hbmdsZWQgY29udGFpbnMgYSBDUExVU19NQVJLRVIuICBJZiBzbywgYXR0ZW1wdCB0bworCSByZWNvZ25pemUgb25lIG9mIHRoZSBnbnUgc3BlY2lhbCBmb3JtcyByYXRoZXIgdGhhbiBsb29raW5nIGZvciBhCisJIHN0YW5kYXJkIHByZWZpeC4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHdvcnJ5IGFib3V0IHdoZXRoZXIgdGhlcmUKKwkgaXMgYSAiX18iIHN0cmluZyBpbiB0aGUgbWFuZ2xlZCBzdHJpbmcuICBDb25zaWRlciAiXyRfNV9fZm9vIiBmb3IKKwkgZXhhbXBsZS4gICovCisKKyAgICAgIGlmICgoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKSkKKwl7CisJICBzdWNjZXNzID0gZ251X3NwZWNpYWwgKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7CisJfQorICAgICAgaWYgKCFzdWNjZXNzKQorCXsKKwkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9wcmVmaXggKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7CisJfQorICAgICAgaWYgKHN1Y2Nlc3MgJiYgKCptYW5nbGVkICE9ICdcMCcpKQorCXsKKwkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9zaWduYXR1cmUgKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7CisJfQorICAgICAgaWYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJnbG9iYWwgY29uc3RydWN0b3JzIGtleWVkIHRvICIpOworICAgICAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAod29yay0+ZGVzdHJ1Y3RvciA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiZ2xvYmFsIGRlc3RydWN0b3JzIGtleWVkIHRvICIpOworICAgICAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAwOworICAgICAgICB9CisgICAgICBlbHNlIGlmICh3b3JrLT5kbGxpbXBvcnRlZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiaW1wb3J0IHN0dWIgZm9yICIpOworICAgICAgICAgIHdvcmstPmRsbGltcG9ydGVkID0gMDsKKyAgICAgICAgfQorICAgICAgZGVtYW5nbGVkID0gbW9wX3VwICh3b3JrLCAmZGVjbCwgc3VjY2Vzcyk7CisgICAgfQorICB3b3JrLT5jb25zdHJ1Y3RvciA9IHMxOworICB3b3JrLT5kZXN0cnVjdG9yID0gczI7CisgIHdvcmstPnN0YXRpY190eXBlID0gczM7CisgIHdvcmstPnR5cGVfcXVhbHMgPSBzNDsKKyAgcmV0dXJuIChkZW1hbmdsZWQpOworfQorCisKKy8qIENsZWFyIG91dCBhbmQgc3F1YW5nbGluZyByZWxhdGVkIHN0b3JhZ2UgKi8KK3N0YXRpYyB2b2lkCitzcXVhbmdsZV9tb3BfdXAgKHdvcmspCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworeworICAvKiBjbGVhbiB1cCB0aGUgQiBhbmQgSyB0eXBlIG1hbmdsaW5nIHR5cGVzLiAqLworICBmb3JnZXRfQl9hbmRfS190eXBlcyAod29yayk7CisgIGlmICh3b3JrIC0+IGJ0eXBldmVjICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiBidHlwZXZlYyk7CisgICAgfQorICBpZiAod29yayAtPiBrdHlwZXZlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4ga3R5cGV2ZWMpOworICAgIH0KK30KKworLyogQ2xlYXIgb3V0IGFueSBtYW5nbGVkIHN0b3JhZ2UgKi8KKworc3RhdGljIGNoYXIgKgorbW9wX3VwICh3b3JrLCBkZWNscCwgc3VjY2VzcykKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIHN0cmluZyAqZGVjbHA7CisgICAgIGludCBzdWNjZXNzOworeworICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOworCisgIC8qIERpc2NhcmQgdGhlIHJlbWVtYmVyZWQgdHlwZXMsIGlmIGFueS4gICovCisKKyAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKKyAgaWYgKHdvcmsgLT4gdHlwZXZlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4gdHlwZXZlYyk7CisgICAgICB3b3JrIC0+IHR5cGV2ZWMgPSBOVUxMOworICAgICAgd29yayAtPiB0eXBldmVjX3NpemUgPSAwOworICAgIH0KKyAgaWYgKHdvcmstPnRtcGxfYXJndmVjKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yay0+bnRtcGxfYXJnczsgaSsrKQorCWlmICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSkKKwkgIGZyZWUgKChjaGFyKikgd29yay0+dG1wbF9hcmd2ZWNbaV0pOworCisgICAgICBmcmVlICgoY2hhciopIHdvcmstPnRtcGxfYXJndmVjKTsKKyAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gTlVMTDsKKyAgICB9CisgIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKKyAgICB7CisgICAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7CisgICAgICBmcmVlICgoY2hhciopIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKKyAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gTlVMTDsKKyAgICB9CisKKyAgLyogSWYgZGVtYW5nbGluZyB3YXMgc3VjY2Vzc2Z1bCwgZW5zdXJlIHRoYXQgdGhlIGRlbWFuZ2xlZCBzdHJpbmcgaXMgbnVsbAorICAgICB0ZXJtaW5hdGVkIGFuZCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGZyZWUgdGhlIGRlbWFuZ2xpbmcgZGVjbC4gICovCisKKyAgaWYgKCFzdWNjZXNzKQorICAgIHsKKyAgICAgIHN0cmluZ19kZWxldGUgKGRlY2xwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICIiLCAxKTsKKyAgICAgIGRlbWFuZ2xlZCA9IGRlY2xwIC0+IGI7CisgICAgfQorICByZXR1cm4gKGRlbWFuZ2xlZCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZW1hbmdsZV9zaWduYXR1cmUgLS0gZGVtYW5nbGUgdGhlIHNpZ25hdHVyZSBwYXJ0IG9mIGEgbWFuZ2xlZCBuYW1lCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgaW50CisJZGVtYW5nbGVfc2lnbmF0dXJlIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCisJCQkgICAgc3RyaW5nICpkZWNscCk7CisKK0RFU0NSSVBUSU9OCisKKwlDb25zdW1lIGFuZCBkZW1hbmdsZSB0aGUgc2lnbmF0dXJlIHBvcnRpb24gb2YgdGhlIG1hbmdsZWQgbmFtZS4KKworCURFQ0xQIGlzIHRoZSBzdHJpbmcgd2hlcmUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdC4gIEF0CisJZW50cnkgaXQgY29udGFpbnMgdGhlIGRlbWFuZ2xlZCByb290IG5hbWUgZnJvbSB0aGUgbWFuZ2xlZCBuYW1lCisJcHJlZml4LiAgSS5FLiBlaXRoZXIgYSBkZW1hbmdsZWQgb3BlcmF0b3IgbmFtZSBvciB0aGUgcm9vdCBmdW5jdGlvbgorCW5hbWUuICBJbiBzb21lIHNwZWNpYWwgY2FzZXMsIGl0IG1heSBjb250YWluIG5vdGhpbmcuCisKKwkqTUFOR0xFRCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgdW5jb25zdW1lZCBsb2NhdGlvbiBpbiB0aGUgbWFuZ2xlZAorCW5hbWUuICBBcyB0b2tlbnMgYXJlIGNvbnN1bWVkIGFuZCBkZW1hbmdsaW5nIGlzIHBlcmZvcm1lZCwgdGhlCisJcG9pbnRlciBpcyB1cGRhdGVkIHRvIGNvbnRpbnVvdXNseSBwb2ludCBhdCB0aGUgbmV4dCB0b2tlbiB0bworCWJlIGNvbnN1bWVkLgorCisJRGVtYW5nbGluZyBHTlUgc3R5bGUgbWFuZ2xlZCBuYW1lcyBpcyBuYXN0eSBiZWNhdXNlIHRoZXJlIGlzIG5vCisJZXhwbGljaXQgdG9rZW4gdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIG91dGVybW9zdCBmdW5jdGlvbgorCWFyZ3VtZW50IGxpc3QuICAqLworCitzdGF0aWMgaW50CitkZW1hbmdsZV9zaWduYXR1cmUgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7CisgICAgIHN0cmluZyAqZGVjbHA7Cit7CisgIGludCBzdWNjZXNzID0gMTsKKyAgaW50IGZ1bmNfZG9uZSA9IDA7CisgIGludCBleHBlY3RfZnVuYyA9IDA7CisgIGludCBleHBlY3RfcmV0dXJuX3R5cGUgPSAwOworICBjb25zdCBjaGFyICpvbGRtYW5nbGVkID0gTlVMTDsKKyAgc3RyaW5nIHRyYXduYW1lOworICBzdHJpbmcgdG5hbWU7CisKKyAgd2hpbGUgKHN1Y2Nlc3MgJiYgKCoqbWFuZ2xlZCAhPSAnXDAnKSkKKyAgICB7CisgICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKKwl7CisJY2FzZSAnUSc6CisJICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7CisJICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMSwgMCk7CisJICBpZiAoc3VjY2VzcykKKwkgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKKwkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCisJICAgIGV4cGVjdF9mdW5jID0gMTsKKwkgIG9sZG1hbmdsZWQgPSBOVUxMOworCSAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnSyc6CisJICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7CisJICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMSwgMCk7CisJICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQorCSAgICB7CisJICAgICAgZXhwZWN0X2Z1bmMgPSAxOworCSAgICB9CisJICBvbGRtYW5nbGVkID0gTlVMTDsKKwkgIGJyZWFrOworCisJY2FzZSAnUyc6CisJICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uICovCisJICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOworCSAgICB9CisJICAoKm1hbmdsZWQpKys7CisJICB3b3JrIC0+IHN0YXRpY190eXBlID0gMTsKKwkgIGJyZWFrOworCisJY2FzZSAnQyc6CisJY2FzZSAnVic6CisJY2FzZSAndSc6CisJICB3b3JrLT50eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKKworCSAgLyogYSBxdWFsaWZpZWQgbWVtYmVyIGZ1bmN0aW9uICovCisJICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQorCSAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7CisJICAoKm1hbmdsZWQpKys7CisJICBicmVhazsKKworCWNhc2UgJ0wnOgorCSAgLyogTG9jYWwgY2xhc3MgbmFtZSBmb2xsb3dzIGFmdGVyICJMbm5uXyIgKi8KKwkgIGlmIChIUF9ERU1BTkdMSU5HKQorCSAgICB7CisJICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAmJiAoKiptYW5nbGVkICE9ICdfJykpCisJCSgqbWFuZ2xlZCkrKzsKKwkgICAgICBpZiAoISoqbWFuZ2xlZCkKKwkJc3VjY2VzcyA9IDA7CisJICAgICAgZWxzZQorCQkoKm1hbmdsZWQpKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3VjY2VzcyA9IDA7CisJICBicmVhazsKKworCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOworCSAgICB9CisgICAgICAgICAgd29yay0+dGVtcF9zdGFydCA9IC0xOyAvKiB1cHBlcm1vc3QgY2FsbCB0byBkZW1hbmdsZV9jbGFzcyAqLworCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7CisJICBpZiAoc3VjY2VzcykKKwkgICAgeworCSAgICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7CisJICAgIH0KKwkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCisJICAgIHsKKyAgICAgICAgICAgICAgLyogRURHIGFuZCBvdGhlcnMgd2lsbCBoYXZlIHRoZSAiRiIsIHNvIHdlIGxldCB0aGUgbG9vcCBjeWNsZQorICAgICAgICAgICAgICAgICBpZiB3ZSBhcmUgbG9va2luZyBhdCBvbmUuICovCisgICAgICAgICAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ0YnKQorICAgICAgICAgICAgICAgICBleHBlY3RfZnVuYyA9IDE7CisJICAgIH0KKwkgIG9sZG1hbmdsZWQgPSBOVUxMOworCSAgYnJlYWs7CisKKwljYXNlICdCJzoKKwkgIHsKKwkgICAgc3RyaW5nIHM7CisJICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmcyk7CisJICAgIGlmIChzdWNjZXNzKQorCSAgICAgIHsKKwkJc3RyaW5nX2FwcGVuZCAoJnMsIFNDT1BFX1NUUklORyAod29yaykpOworCQlzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmcyk7CisJICAgICAgfQorCSAgICBvbGRtYW5nbGVkID0gTlVMTDsKKwkgICAgZXhwZWN0X2Z1bmMgPSAxOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICdGJzoKKwkgIC8qIEZ1bmN0aW9uICovCisJICAvKiBBUk0vSFAgc3R5bGUgZGVtYW5nbGluZyBpbmNsdWRlcyBhIHNwZWNpZmljICdGJyBjaGFyYWN0ZXIgYWZ0ZXIKKwkgICAgIHRoZSBjbGFzcyBuYW1lLiAgRm9yIEdOVSBzdHlsZSwgaXQgaXMganVzdCBpbXBsaWVkLiAgU28gd2UgY2FuCisJICAgICBzYWZlbHkganVzdCBjb25zdW1lIGFueSAnRicgYXQgdGhpcyBwb2ludCBhbmQgYmUgY29tcGF0aWJsZQorCSAgICAgd2l0aCBlaXRoZXIgc3R5bGUuICAqLworCisJICBvbGRtYW5nbGVkID0gTlVMTDsKKwkgIGZ1bmNfZG9uZSA9IDE7CisJICAoKm1hbmdsZWQpKys7CisKKwkgIC8qIEZvciBsdWNpZC9BUk0vSFAgc3R5bGUgd2UgaGF2ZSB0byBmb3JnZXQgYW55IHR5cGVzIHdlIG1pZ2h0CisJICAgICBoYXZlIHJlbWVtYmVyZWQgdXAgdG8gdGhpcyBwb2ludCwgc2luY2UgdGhleSB3ZXJlIG5vdCBhcmd1bWVudAorCSAgICAgdHlwZXMuICBHTlUgc3R5bGUgY29uc2lkZXJzIGFsbCB0eXBlcyBzZWVuIGFzIGF2YWlsYWJsZSBmb3IKKwkgICAgIGJhY2sgcmVmZXJlbmNlcy4gIFNlZSBjb21tZW50IGluIGRlbWFuZ2xlX2FyZ3MoKSAqLworCisJICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQorCSAgICB7CisJICAgICAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKKwkgICAgfQorCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKKwkgIC8qIEFmdGVyIHBpY2tpbmcgb2ZmIHRoZSBmdW5jdGlvbiBhcmdzLCB3ZSBleHBlY3QgdG8gZWl0aGVyCisJICAgICBmaW5kIHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSAocHJlY2VkZWQgYnkgYW4gJ18nKSBvciB0aGUKKwkgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworCSAgaWYgKHN1Y2Nlc3MgJiYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgKiptYW5nbGVkID09ICdfJykKKwkgICAgeworCSAgICAgICsrKCptYW5nbGVkKTsKKyAgICAgICAgICAgICAgLyogQXQgdGhpcyBsZXZlbCwgd2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlIHJldHVybiB0eXBlLiAqLworICAgICAgICAgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRuYW1lKTsKKyAgICAgICAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJnRuYW1lKTsKKyAgICAgICAgICAgIH0KKworCSAgYnJlYWs7CisKKwljYXNlICd0JzoKKwkgIC8qIEcrKyBUZW1wbGF0ZSAqLworCSAgc3RyaW5nX2luaXQoJnRyYXduYW1lKTsKKwkgIHN0cmluZ19pbml0KCZ0bmFtZSk7CisJICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOworCSAgICB9CisJICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZ0bmFtZSwKKwkJCQkgICAgICAgJnRyYXduYW1lLCAxLCAxKTsKKwkgIGlmIChzdWNjZXNzKQorCSAgICB7CisJICAgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKKwkgICAgfQorCSAgc3RyaW5nX2FwcGVuZCAoJnRuYW1lLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKKworCSAgc3RyaW5nX3ByZXBlbmRzKGRlY2xwLCAmdG5hbWUpOworCSAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCisJICAgIHsKKwkgICAgICBzdHJpbmdfcHJlcGVuZCAoJnRyYXduYW1lLCAifiIpOworCSAgICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnRyYXduYW1lKTsKKwkgICAgICB3b3JrLT5kZXN0cnVjdG9yIC09IDE7CisJICAgIH0KKwkgIGlmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKQorCSAgICB7CisJICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHJhd25hbWUpOworCSAgICAgIHdvcmstPmNvbnN0cnVjdG9yIC09IDE7CisJICAgIH0KKwkgIHN0cmluZ19kZWxldGUoJnRyYXduYW1lKTsKKwkgIHN0cmluZ19kZWxldGUoJnRuYW1lKTsKKwkgIG9sZG1hbmdsZWQgPSBOVUxMOworCSAgZXhwZWN0X2Z1bmMgPSAxOworCSAgYnJlYWs7CisKKwljYXNlICdfJzoKKwkgIGlmIChHTlVfREVNQU5HTElORyAmJiBleHBlY3RfcmV0dXJuX3R5cGUpCisJICAgIHsKKwkgICAgICAvKiBSZWFkIHRoZSByZXR1cm4gdHlwZS4gKi8KKwkgICAgICBzdHJpbmcgcmV0dXJuX3R5cGU7CisJICAgICAgc3RyaW5nX2luaXQgKCZyZXR1cm5fdHlwZSk7CisKKwkgICAgICAoKm1hbmdsZWQpKys7CisJICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZyZXR1cm5fdHlwZSk7CisJICAgICAgQVBQRU5EX0JMQU5LICgmcmV0dXJuX3R5cGUpOworCisJICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJnJldHVybl90eXBlKTsKKwkgICAgICBzdHJpbmdfZGVsZXRlICgmcmV0dXJuX3R5cGUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBlbHNlCisJICAgIC8qIEF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwsIHdlIGNhbm5vdCBoYXZlIGEgcmV0dXJuIHR5cGUgc3BlY2lmaWVkLAorCSAgICAgICBzbyBpZiB3ZSBydW4gaW50byBhbm90aGVyICdfJyBhdCB0aGlzIHBvaW50IHdlIGFyZSBkZWFsaW5nIHdpdGgKKwkgICAgICAgYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yIGhhcyBiZWVuIG1hbmdsZWQgYnkKKwkgICAgICAgc29tZSBhbGdvcml0aG0gd2UgZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoLiAgU28ganVzdAorCSAgICAgICByZWplY3QgdGhlIGVudGlyZSBkZW1hbmdsaW5nLiAgKi8KKyAgICAgICAgICAgIC8qIEhvd2V2ZXIsICJfbm5uIiBpcyBhbiBleHBlY3RlZCBzdWZmaXggZm9yIGFsdGVybmF0ZSBlbnRyeSBwb2ludAorICAgICAgICAgICAgICAgbnVtYmVyZWQgbm5uIGZvciBhIGZ1bmN0aW9uLCB3aXRoIEhQIGFDQywgc28gc2tpcCBvdmVyIHRoYXQKKyAgICAgICAgICAgICAgIHdpdGhvdXQgcmVwb3J0aW5nIGZhaWx1cmUuIHBhaS8xOTk3LTA5LTA0ICovCisgICAgICAgICAgICBpZiAoSFBfREVNQU5HTElORykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKiptYW5nbGVkICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCisgICAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBzdWNjZXNzID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSAnSCc6CisJICBpZiAoR05VX0RFTUFOR0xJTkcpCisJICAgIHsKKwkgICAgICAvKiBBIEcrKyB0ZW1wbGF0ZSBmdW5jdGlvbi4gIFJlYWQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cy4gKi8KKwkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAwLAorCQkJCQkgICAwKTsKKwkgICAgICBpZiAoISh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpKQorCQlleHBlY3RfcmV0dXJuX3R5cGUgPSAxOworCSAgICAgICgqbWFuZ2xlZCkrKzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZWxzZQorCSAgICAvKiBmYWxsIHRocm91Z2ggKi8KKwkgICAgezt9CisKKwlkZWZhdWx0OgorCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKKwkgICAgeworCSAgICAgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgorCQkgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLworCSAgICAgIGZ1bmNfZG9uZSA9IDE7CisJICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm9uLUdOVSBkZW1hbmdsZXJzIHVzZSBhIHNwZWNpZmljIHRva2VuIHRvIG1hcmsgdGhlIHN0YXJ0CisJCSBvZiB0aGUgb3V0ZXJtb3N0IGZ1bmN0aW9uIGFyZ3VtZW50IHRva2Vucy4gIFR5cGljYWxseSAnRicsCisJCSBmb3IgQVJNL0hQLWRlbWFuZ2xpbmcsIGZvciBleGFtcGxlLiAgU28gaWYgd2UgZmluZCBzb21ldGhpbmcKKwkJIHdlIGFyZSBub3QgcHJlcGFyZWQgZm9yLCBpdCBtdXN0IGJlIGFuIGVycm9yLiAgKi8KKwkgICAgICBzdWNjZXNzID0gMDsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgICAgLyoKKwlpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQorCSovCisgICAgICB7CisJaWYgKHN1Y2Nlc3MgJiYgZXhwZWN0X2Z1bmMpCisJICB7CisJICAgIGZ1bmNfZG9uZSA9IDE7CisgICAgICAgICAgICAgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZvcmdldF90eXBlcyAod29yayk7CisgICAgICAgICAgICAgICAgfQorCSAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOworCSAgICAvKiBTaW5jZSB0ZW1wbGF0ZSBpbmNsdWRlIHRoZSBtYW5nbGluZyBvZiB0aGVpciByZXR1cm4gdHlwZXMsCisJICAgICAgIHdlIG11c3Qgc2V0IGV4cGVjdF9mdW5jIHRvIDAgc28gdGhhdCB3ZSBkb24ndCB0cnkgZG8KKwkgICAgICAgZGVtYW5nbGUgbW9yZSBhcmd1bWVudHMgdGhlIG5leHQgdGltZSB3ZSBnZXQgaGVyZS4gICovCisJICAgIGV4cGVjdF9mdW5jID0gMDsKKwkgIH0KKyAgICAgIH0KKyAgICB9CisgIGlmIChzdWNjZXNzICYmICFmdW5jX2RvbmUpCisgICAgeworICAgICAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKKwl7CisJICAvKiBXaXRoIEdOVSBzdHlsZSBkZW1hbmdsaW5nLCBiYXJfXzNmb28gaXMgJ2Zvbzo6YmFyKHZvaWQpJywgYW5kCisJICAgICBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKKwkgICAgIGZpcnN0IGNhc2UsIGFuZCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSAnKHZvaWQpJyBnZXRzIGFkZGVkIHRvCisJICAgICB0aGUgY3VycmVudCBkZWNscC4gIE5vdGUgdGhhdCB3aXRoIEFSTS9IUCwgdGhlIGZpcnN0IGNhc2UKKwkgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYSBzdGF0aWMgZGF0YSBtZW1iZXIgJ2Zvbzo6YmFyJywKKwkgICAgIHdoaWNoIGlzIGluIHRoZSBjdXJyZW50IGRlY2xwLCBzbyB3ZSBsZWF2ZSBpdCBhbG9uZS4gICovCisJICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOworCX0KKyAgICB9CisgIGlmIChzdWNjZXNzICYmIFBSSU5UX0FSR19UWVBFUykKKyAgICB7CisgICAgICBpZiAod29yay0+c3RhdGljX3R5cGUpCisJc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgc3RhdGljIik7CisgICAgICBpZiAod29yay0+dHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQorCXsKKwkgIEFQUEVORF9CTEFOSyAoZGVjbHApOworCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIHF1YWxpZmllcl9zdHJpbmcgKHdvcmstPnR5cGVfcXVhbHMpKTsKKwl9CisgICAgfQorCisgIHJldHVybiAoc3VjY2Vzcyk7Cit9CisKKyNpZiAwCisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX21ldGhvZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcgKmRlY2xwOworeworICBpbnQgc3VjY2VzcyA9IDA7CisKKyAgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCisgICAgeworICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkICsgMSk7CisgICAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKKyAgICAgIHN1Y2Nlc3MgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7CisgICAgfQorICByZXR1cm4gKHN1Y2Nlc3MpOworfQorCisjZW5kaWYKKworc3RhdGljIGludAorZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICp0bmFtZTsKK3sKKyAgaW50IGk7CisgIGludCByOworICBpbnQgbmVlZF9jb21tYSA9IDA7CisgIGludCBzdWNjZXNzID0gMTsKKyAgc3RyaW5nIHRlbXA7CisKKyAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICJ0ZW1wbGF0ZSA8Iik7CisgIC8qIGdldCBzaXplIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0ICovCisgIGlmIChnZXRfY291bnQgKG1hbmdsZWQsICZyKSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQorCXsKKwkgIGlmIChuZWVkX2NvbW1hKQorCSAgICB7CisJICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIsICIpOworCSAgICB9CisKKwkgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCisJICAgIGlmICgqKm1hbmdsZWQgPT0gJ1onKQorCSAgICAgIHsKKwkJKCptYW5nbGVkKSsrOworCQlzdHJpbmdfYXBwZW5kICh0bmFtZSwgImNsYXNzIik7CisJICAgICAgfQorCSAgICAgIC8qIHogZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KKwkgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKKwkgICAgICB7CisJCSgqbWFuZ2xlZCkrKzsKKwkJc3VjY2VzcyA9CisJCSAgZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOworCQlpZiAoIXN1Y2Nlc3MpCisJCSAgeworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLyogdGVtcCBpcyBpbml0aWFsaXplZCBpbiBkb190eXBlICovCisJCXN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7CisJCWlmIChzdWNjZXNzKQorCQkgIHsKKwkJICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOworCQkgIH0KKwkJc3RyaW5nX2RlbGV0ZSgmdGVtcCk7CisJCWlmICghc3VjY2VzcykKKwkJICB7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgbmVlZF9jb21tYSA9IDE7CisJfQorCisgICAgfQorICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKKyAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKKyAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI+IGNsYXNzIik7CisgIHJldHVybiAoc3VjY2Vzcyk7Cit9CisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX2ludGVncmFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhcioqIG1hbmdsZWQ7CisgICAgIHN0cmluZyogczsKK3sKKyAgaW50IHN1Y2Nlc3M7CisKKyAgaWYgKCoqbWFuZ2xlZCA9PSAnRScpCisgICAgeworICAgICAgaW50IG5lZWRfb3BlcmF0b3IgPSAwOworCisgICAgICBzdWNjZXNzID0gMTsKKyAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiKCIsIDEpOworICAgICAgKCptYW5nbGVkKSsrOworICAgICAgd2hpbGUgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdXJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykKKwl7CisJICBpZiAobmVlZF9vcGVyYXRvcikKKwkgICAgeworCSAgICAgIHNpemVfdCBpOworCSAgICAgIHNpemVfdCBsZW47CisKKwkgICAgICBzdWNjZXNzID0gMDsKKworCSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hbmdsZWQpOworCisJICAgICAgZm9yIChpID0gMDsKKwkJICAgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGUgWzBdKTsKKwkJICAgKytpKQorCQl7CisJCSAgc2l6ZV90IGwgPSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pOworCisJCSAgaWYgKGwgPD0gbGVuCisJCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgKm1hbmdsZWQsIGwpID09IDApCisJCSAgICB7CisJCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOworCQkgICAgICBzdHJpbmdfYXBwZW5kIChzLCBvcHRhYmxlW2ldLm91dCk7CisJCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOworCQkgICAgICBzdWNjZXNzID0gMTsKKwkJICAgICAgKCptYW5nbGVkKSArPSBsOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCisJICAgICAgaWYgKCFzdWNjZXNzKQorCQlicmVhazsKKwkgICAgfQorCSAgZWxzZQorCSAgICBuZWVkX29wZXJhdG9yID0gMTsKKworCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCisJCQkJCQkgIHRrX2ludGVncmFsKTsKKwl9CisKKyAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ1cnKQorCSAgc3VjY2VzcyA9IDA7CisgICAgICBlbHNlCisJeworCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIpIiwgMSk7CisJICAoKm1hbmdsZWQpKys7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoKiptYW5nbGVkID09ICdRJyB8fCAqKm1hbmdsZWQgPT0gJ0snKQorICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHMsIDAsIDEpOworICBlbHNlCisgICAgeworICAgICAgc3VjY2VzcyA9IDA7CisKKyAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQorCXsKKwkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOworCSAgKCptYW5nbGVkKSsrOworCX0KKyAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQorCXsKKwkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7CisJICAoKm1hbmdsZWQpKys7CisJICBzdWNjZXNzID0gMTsKKwl9CisgICAgfQorCisgIHJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgaW50CitkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCBzLCB0aykKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcqIHM7CisgICAgIHR5cGVfa2luZF90IHRrOworeworICBpbnQgc3VjY2VzcyA9IDE7CisKKyAgaWYgKCoqbWFuZ2xlZCA9PSAnWScpCisgICAgeworICAgICAgLyogVGhlIG5leHQgYXJndW1lbnQgaXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICovCisgICAgICBpbnQgaWR4OworCisgICAgICAoKm1hbmdsZWQpKys7CisgICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOworICAgICAgaWYgKGlkeCA9PSAtMQorCSAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQorCSAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKKwlyZXR1cm4gLTE7CisgICAgICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCisJc3RyaW5nX2FwcGVuZCAocywgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7CisgICAgICBlbHNlCisJeworCSAgY2hhciBidWZbMTBdOworCSAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOworCSAgc3RyaW5nX2FwcGVuZCAocywgYnVmKTsKKwl9CisgICAgfQorICBlbHNlIGlmICh0ayA9PSB0a19pbnRlZ3JhbCkKKyAgICBzdWNjZXNzID0gZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpOworICBlbHNlIGlmICh0ayA9PSB0a19jaGFyKQorICAgIHsKKyAgICAgIGNoYXIgdG1wWzJdOworICAgICAgaW50IHZhbDsKKyAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQorCXsKKwkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOworCSAgKCptYW5nbGVkKSsrOworCX0KKyAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiJyIsIDEpOworICAgICAgdmFsID0gY29uc3VtZV9jb3VudChtYW5nbGVkKTsKKyAgICAgIGlmICh2YWwgPD0gMCkKKwlzdWNjZXNzID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICB0bXBbMF0gPSAoY2hhcil2YWw7CisJICB0bXBbMV0gPSAnXDAnOworCSAgc3RyaW5nX2FwcGVuZG4gKHMsICZ0bXBbMF0sIDEpOworCSAgc3RyaW5nX2FwcGVuZG4gKHMsICInIiwgMSk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAodGsgPT0gdGtfYm9vbCkKKyAgICB7CisgICAgICBpbnQgdmFsID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7CisgICAgICBpZiAodmFsID09IDApCisJc3RyaW5nX2FwcGVuZG4gKHMsICJmYWxzZSIsIDUpOworICAgICAgZWxzZSBpZiAodmFsID09IDEpCisJc3RyaW5nX2FwcGVuZG4gKHMsICJ0cnVlIiwgNCk7CisgICAgICBlbHNlCisJc3VjY2VzcyA9IDA7CisgICAgfQorICBlbHNlIGlmICh0ayA9PSB0a19yZWFsKQorICAgIHsKKyAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQorCXsKKwkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOworCSAgKCptYW5nbGVkKSsrOworCX0KKyAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQorCXsKKwkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7CisJICAoKm1hbmdsZWQpKys7CisJfQorICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnLicpIC8qIGZyYWN0aW9uICovCisJeworCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIuIiwgMSk7CisJICAoKm1hbmdsZWQpKys7CisJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKKwkgICAgeworCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7CisJICAgICAgKCptYW5nbGVkKSsrOworCSAgICB9CisJfQorICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpIC8qIGV4cG9uZW50ICovCisJeworCSAgc3RyaW5nX2FwcGVuZG4gKHMsICJlIiwgMSk7CisJICAoKm1hbmdsZWQpKys7CisJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKKwkgICAgeworCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7CisJICAgICAgKCptYW5nbGVkKSsrOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAodGsgPT0gdGtfcG9pbnRlciB8fCB0ayA9PSB0a19yZWZlcmVuY2UpCisgICAgeworICAgICAgaW50IHN5bWJvbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKKyAgICAgIGlmIChzeW1ib2xfbGVuID09IC0xKQorCXJldHVybiAtMTsKKyAgICAgIGlmIChzeW1ib2xfbGVuID09IDApCisJc3RyaW5nX2FwcGVuZG4gKHMsICIwIiwgMSk7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqcCA9IHhtYWxsb2MgKHN5bWJvbF9sZW4gKyAxKSwgKnE7CisJICBzdHJuY3B5IChwLCAqbWFuZ2xlZCwgc3ltYm9sX2xlbik7CisJICBwIFtzeW1ib2xfbGVuXSA9ICdcMCc7CisJICAvKiBXZSB1c2UgY3BsdXNfZGVtYW5nbGUgaGVyZSwgcmF0aGVyIHRoYW4KKwkgICAgIGludGVybmFsX2NwbHVzX2RlbWFuZ2xlLCBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkKKwkgICAgIG1hbmdsZWQgaGVyZSBkb2VzIG5vdCBtYWtlIHVzZSBvZiBhbnkgb2YgdGhlIHNxdWFuZ2xpbmcKKwkgICAgIG9yIHR5cGUtY29kZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGJ1aWx0IHVwIHRodXMgZmFyOyBpdCBpcworCSAgICAgbWFuZ2xlZCBpbmRlcGVuZGVudGx5LiAgKi8KKwkgIHEgPSBjcGx1c19kZW1hbmdsZSAocCwgd29yay0+b3B0aW9ucyk7CisJICBpZiAodGsgPT0gdGtfcG9pbnRlcikKKwkgICAgc3RyaW5nX2FwcGVuZG4gKHMsICImIiwgMSk7CisJICAvKiBGSVhNRTogUG9pbnRlci10by1tZW1iZXIgY29uc3RhbnRzIHNob3VsZCBnZXQgYQorCSAgICAgICAgICAgIHF1YWxpZnlpbmcgY2xhc3MgbmFtZSBoZXJlLiAgKi8KKwkgIGlmIChxKQorCSAgICB7CisJICAgICAgc3RyaW5nX2FwcGVuZCAocywgcSk7CisJICAgICAgZnJlZSAocSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RyaW5nX2FwcGVuZCAocywgcCk7CisJICBmcmVlIChwKTsKKwl9CisgICAgICAqbWFuZ2xlZCArPSBzeW1ib2xfbGVuOworICAgIH0KKworICByZXR1cm4gc3VjY2VzczsKK30KKworLyogRGVtYW5nbGUgdGhlIHRlbXBsYXRlIG5hbWUgaW4gTUFOR0xFRC4gIFRoZSBmdWxsIG5hbWUgb2YgdGhlCisgICB0ZW1wbGF0ZSAoZS5nLiwgUzxpbnQ+KSBpcyBwbGFjZWQgaW4gVE5BTUUuICBUaGUgbmFtZSB3aXRob3V0IHRoZQorICAgdGVtcGxhdGUgcGFyYW1ldGVycyAoZS5nLiBTKSBpcyBwbGFjZWQgaW4gVFJBV05BTUUgaWYgVFJBV05BTUUgaXMKKyAgIG5vbi1OVUxMLiAgSWYgSVNfVFlQRSBpcyBub256ZXJvLCB0aGlzIHRlbXBsYXRlIGlzIGEgdHlwZSB0ZW1wbGF0ZSwKKyAgIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgSWYgYm90aCBJU19UWVBFIGFuZCBSRU1FTUJFUiBhcmUgbm9uemVybywKKyAgIHRoZSB0bWVwbGF0ZSBpcyByZW1lbWJlcmVkIGluIHRoZSBsaXN0IG9mIGJhY2stcmVmZXJlbmNlYWJsZQorICAgdHlwZXMuICAqLworCitzdGF0aWMgaW50CitkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgdG5hbWUsIHRyYXduYW1lLCBpc190eXBlLCByZW1lbWJlcikKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcgKnRuYW1lOworICAgICBzdHJpbmcgKnRyYXduYW1lOworICAgICBpbnQgaXNfdHlwZTsKKyAgICAgaW50IHJlbWVtYmVyOworeworICBpbnQgaTsKKyAgaW50IHI7CisgIGludCBuZWVkX2NvbW1hID0gMDsKKyAgaW50IHN1Y2Nlc3MgPSAwOworICBjb25zdCBjaGFyICpzdGFydDsKKyAgaW50IGlzX2phdmFfYXJyYXkgPSAwOworICBzdHJpbmcgdGVtcDsKKyAgaW50IGJpbmRleCA9IDA7CisKKyAgKCptYW5nbGVkKSsrOworICBpZiAoaXNfdHlwZSkKKyAgICB7CisgICAgICBpZiAocmVtZW1iZXIpCisJYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOworICAgICAgc3RhcnQgPSAqbWFuZ2xlZDsKKyAgICAgIC8qIGdldCB0ZW1wbGF0ZSBuYW1lICovCisgICAgICBpZiAoKiptYW5nbGVkID09ICd6JykKKwl7CisJICBpbnQgaWR4OworCSAgKCptYW5nbGVkKSsrOworCSAgKCptYW5nbGVkKSsrOworCisJICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOworCSAgaWYgKGlkeCA9PSAtMQorCSAgICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKKwkgICAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQorCSAgICByZXR1cm4gKDApOworCisJICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCisJICAgIHsKKwkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7CisJICAgICAgaWYgKHRyYXduYW1lKQorCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzEwXTsKKwkgICAgICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7CisJICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsIGJ1Zik7CisJICAgICAgaWYgKHRyYXduYW1lKQorCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgYnVmKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoKHIgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKSkgPD0gMAorCSAgICAgIHx8IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpIDwgcikKKwkgICAgeworCSAgICAgIHJldHVybiAoMCk7CisJICAgIH0KKwkgIGlzX2phdmFfYXJyYXkgPSAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKQorCSAgICAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIkpBcnJheTFaIiwgOCkgPT0gMDsKKwkgIGlmICghIGlzX2phdmFfYXJyYXkpCisJICAgIHsKKwkgICAgICBzdHJpbmdfYXBwZW5kbiAodG5hbWUsICptYW5nbGVkLCByKTsKKwkgICAgfQorCSAgaWYgKHRyYXduYW1lKQorCSAgICBzdHJpbmdfYXBwZW5kbiAodHJhd25hbWUsICptYW5nbGVkLCByKTsKKwkgICptYW5nbGVkICs9IHI7CisJfQorICAgIH0KKyAgaWYgKCFpc19qYXZhX2FycmF5KQorICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPCIpOworICAvKiBnZXQgc2l6ZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCAqLworICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQorICAgIHsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICBpZiAoIWlzX3R5cGUpCisgICAgeworICAgICAgLyogQ3JlYXRlIGFuIGFycmF5IGZvciBzYXZpbmcgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHZhbHVlcy4gKi8KKyAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gKGNoYXIqKikgeG1hbGxvYyAociAqIHNpemVvZiAoY2hhciAqKSk7CisgICAgICB3b3JrLT5udG1wbF9hcmdzID0gcjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCisJd29yay0+dG1wbF9hcmd2ZWNbaV0gPSAwOworICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKKyAgICB7CisgICAgICBpZiAobmVlZF9jb21tYSkKKwl7CisJICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7CisJfQorICAgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCisgICAgICBpZiAoKiptYW5nbGVkID09ICdaJykKKwl7CisJICAoKm1hbmdsZWQpKys7CisJICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KKwkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7CisJICBpZiAoc3VjY2VzcykKKwkgICAgeworCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOworCisJICAgICAgaWYgKCFpc190eXBlKQorCQl7CisJCSAgLyogU2F2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQuICovCisJCSAgaW50IGxlbiA9IHRlbXAucCAtIHRlbXAuYjsKKwkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOworCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sIHRlbXAuYiwgbGVuKTsKKwkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKKwkJfQorCSAgICB9CisJICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKKwkgIGlmICghc3VjY2VzcykKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLworICAgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKKwl7CisJICBpbnQgcjI7CisJICAoKm1hbmdsZWQpKys7CisJICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOworCisJICBpZiAoc3VjY2VzcworCSAgICAgICYmIChyMiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA+IDAKKwkgICAgICAmJiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSByMikKKwkgICAgeworCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOworCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIyKTsKKwkgICAgICBpZiAoIWlzX3R5cGUpCisJCXsKKwkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KKwkJICBpbnQgbGVuID0gcjI7CisJCSAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKKwkJICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCAqbWFuZ2xlZCwgbGVuKTsKKwkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKKwkJfQorCSAgICAgICptYW5nbGVkICs9IHIyOworCSAgICB9CisJICBpZiAoIXN1Y2Nlc3MpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdHJpbmcgIHBhcmFtOworCSAgc3RyaW5nKiBzOworCisJICAvKiBvdGhlcndpc2UsIHZhbHVlIHBhcmFtZXRlciAqLworCisJICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KKwkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7CisJICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKKwkgIGlmICghc3VjY2VzcykKKwkgICAgYnJlYWs7CisKKwkgIGlmICghaXNfdHlwZSkKKwkgICAgeworCSAgICAgIHMgPSAmcGFyYW07CisJICAgICAgc3RyaW5nX2luaXQgKHMpOworCSAgICB9CisJICBlbHNlCisJICAgIHMgPSB0bmFtZTsKKworCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCisJCQkJCQkgICh0eXBlX2tpbmRfdCkgc3VjY2Vzcyk7CisKKwkgIGlmICghc3VjY2VzcykKKwkgICAgeworCSAgICAgIGlmICghaXNfdHlwZSkKKwkJc3RyaW5nX2RlbGV0ZSAocyk7CisJICAgICAgc3VjY2VzcyA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKCFpc190eXBlKQorCSAgICB7CisJICAgICAgaW50IGxlbiA9IHMtPnAgLSBzLT5iOworCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7CisJICAgICAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgcy0+YiwgbGVuKTsKKwkgICAgICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKKworCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgcyk7CisJICAgICAgc3RyaW5nX2RlbGV0ZSAocyk7CisJICAgIH0KKwl9CisgICAgICBuZWVkX2NvbW1hID0gMTsKKyAgICB9CisgIGlmIChpc19qYXZhX2FycmF5KQorICAgIHsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiW10iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKKwlzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPiIpOworICAgIH0KKworICBpZiAoaXNfdHlwZSAmJiByZW1lbWJlcikKKyAgICByZW1lbWJlcl9CdHlwZSAod29yaywgdG5hbWUtPmIsIExFTl9TVFJJTkcgKHRuYW1lKSwgYmluZGV4KTsKKworICAvKgorICAgIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQorICAgIHsKKyAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKKyAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKKyAgICBzdWNjZXNzID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOworICAgIH0KKyAgICB9CisgICAgKi8KKyAgcmV0dXJuIChzdWNjZXNzKTsKK30KKworc3RhdGljIGludAorYXJtX3B0ICh3b3JrLCBtYW5nbGVkLCBuLCBhbmNob3IsIGFyZ3MpCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICptYW5nbGVkOworICAgICBpbnQgbjsKKyAgICAgY29uc3QgY2hhciAqKmFuY2hvciwgKiphcmdzOworeworICAvKiBDaGVjayBpZiBBUk0gdGVtcGxhdGUgd2l0aCAiX19wdF9fIiBpbiBpdCAoInBhcmFtZXRlcml6ZWQgdHlwZSIpICovCisgIC8qIEFsbG93IEhQIGFsc28gaGVyZSwgYmVjYXVzZSBIUCdzIGNmcm9udCBjb21waWxlciBmb2xsb3dzIEFSTSB0byBzb21lIGV4dGVudCAqLworICBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpICYmICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCisgICAgeworICAgICAgaW50IGxlbjsKKyAgICAgICphcmdzID0gKmFuY2hvciArIDY7CisgICAgICBsZW4gPSBjb25zdW1lX2NvdW50IChhcmdzKTsKKyAgICAgIGlmIChsZW4gPT0gLTEpCisJcmV0dXJuIDA7CisgICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKKwl7CisJICArKyphcmdzOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKKyAgICB7CisgICAgICBpZiAoKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fdG1fXyIpKQorICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3BzX18iKSkKKyAgICAgICAgICB8fCAoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19wdF9fIikpKQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAqYXJncyA9ICphbmNob3IgKyA2OworICAgICAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOworCSAgaWYgKGxlbiA9PSAtMSkKKwkgICAgcmV0dXJuIDA7CisgICAgICAgICAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICsrKmFyZ3M7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19TIikpKQorICAgICAgICB7CisgCSAgaW50IGxlbjsKKyAJICAqYXJncyA9ICphbmNob3IgKyAzOworIAkgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOworCSAgaWYgKGxlbiA9PSAtMSkKKwkgICAgcmV0dXJuIDA7CisgCSAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICsrKmFyZ3M7CisgCSAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBuLCBkZWNscCkKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBpbnQgbjsKKyAgICAgc3RyaW5nICpkZWNscDsKK3sKKyAgY29uc3QgY2hhciAqcDsKKyAgY29uc3QgY2hhciAqYXJnczsKKyAgY29uc3QgY2hhciAqZSA9ICptYW5nbGVkICsgbjsKKyAgc3RyaW5nIGFyZzsKKworICAvKiBDaGVjayBmb3IgSFAgYUNDIHRlbXBsYXRlIHNwZWM6IGNsYXNzWHQxdDIgd2hlcmUgdDEsIHQyIGFyZQorICAgICB0ZW1wbGF0ZSBhcmdzICovCisgIGlmIChIUF9ERU1BTkdMSU5HICYmICgoKm1hbmdsZWQpW25dID09ICdYJykpCisgICAgeworICAgICAgY2hhciAqc3RhcnRfc3BlY19hcmdzID0gTlVMTDsKKworICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIGFuZCBvbWl0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHBzZXVkby1hcmd1bWVudHMsCisgICAgICAgICBzdWNoIGFzIGluICJTcGVjPCMxLCMxLio+IiAqLworICAgICAgc3RhcnRfc3BlY19hcmdzID0gc3RyY2hyICgqbWFuZ2xlZCwgJzwnKTsKKyAgICAgIGlmIChzdGFydF9zcGVjX2FyZ3MgJiYgKHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkIDwgbikpCisgICAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7CisgICAgICAoKm1hbmdsZWQpICs9IG4gKyAxOworICAgICAgc3RyaW5nX2luaXQgKCZhcmcpOworICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLworICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKKyAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOworICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICBzdHJpbmdfY2xlYXIgKCZhcmcpOworICAgICAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlICdUJzoKKyAgICAgICAgICAgICAgICAvKiAnVCcgc2lnbmFscyBhIHR5cGUgcGFyYW1ldGVyICovCisgICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOworICAgICAgICAgICAgICAgIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCisgICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgLyogJ1UnIG9yICdTJyBzaWduYWxzIGFuIGludGVncmFsIHZhbHVlICovCisgICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCisgICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgICAgICAvKiAnQScgc2lnbmFscyBhIG5hbWVkIGNvbnN0YW50IGV4cHJlc3Npb24gKGxpdGVyYWwpICovCisgICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKKyAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogVG9kYXksIDE5OTctMDktMDMsIHdlIGhhdmUgb25seSB0aGUgYWJvdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBudWxsICovCisgICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKKyAgICAgICAgIC8qIENoZWNrIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGVtcGxhdGUgYXJncy4KKyAgICAgICAgICAgICAwIGlmIGF0IGVuZCBvZiBzdGF0aWMgbWVtYmVyIG9mIHRlbXBsYXRlIGNsYXNzLAorICAgICAgICAgICAgIF8gaWYgZG9uZSB3aXRoIHRlbXBsYXRlIGFyZ3MgZm9yIGEgZnVuY3Rpb24gKi8KKyAgICAgICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnXDAwMCcpIHx8ICgqKm1hbmdsZWQgPT0gJ18nKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOworICAgICAgICB9CisgICAgaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOgorICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI+Iik7CisgICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKKyAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQorICAgICAgICAoKm1hbmdsZWQpKys7CisgICAgICByZXR1cm47CisgICAgfQorICAvKiBBUk0gdGVtcGxhdGU/IChBbHNvIGhhbmRsZXMgSFAgY2Zyb250IGV4dGVuc2lvbnMpICovCisgIGVsc2UgaWYgKGFybV9wdCAod29yaywgKm1hbmdsZWQsIG4sICZwLCAmYXJncykpCisgICAgeworICAgICAgc3RyaW5nIHR5cGVfc3RyOworCisgICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7CisgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBwIC0gKm1hbmdsZWQpOworICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpICAvKiBub24tcmVjdXJzaXZlIGNhbGwgKi8KKwl3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKKyAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOworICAgICAgLyogc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nIGhlcmUgKi8KKyAgICAgIHdoaWxlIChhcmdzIDwgZSkgeworCXN0cmluZ19jbGVhciAoJmFyZyk7CisKKwkvKiBDaGVjayBmb3IgdHlwZSBvciBsaXRlcmFsIGhlcmUgKi8KKwlzd2l0Y2ggKCphcmdzKQorCSAgeworCSAgICAvKiBIUCBjZnJvbnQgZXh0ZW5zaW9ucyB0byBBUk0gZm9yIHRlbXBsYXRlIGFyZ3MgKi8KKwkgICAgLyogc3BlYzogWHQxTHYxIHdoZXJlIHQxIGlzIGEgdHlwZSwgdjEgaXMgYSBsaXRlcmFsIHZhbHVlICovCisJICAgIC8qIEZJWE1FOiBXZSBoYW5kbGUgb25seSBudW1lcmljIGxpdGVyYWxzIGZvciBIUCBjZnJvbnQgKi8KKyAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgIC8qIEEgdHlwZWQgY29uc3RhbnQgdmFsdWUgZm9sbG93cyAqLworICAgICAgICAgICAgYXJncysrOworICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJnR5cGVfc3RyKSkKKwkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7CisgICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKCIpOworICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZhcmcsICZ0eXBlX3N0cik7CisgICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKSIpOworICAgICAgICAgICAgaWYgKCphcmdzICE9ICdMJykKKyAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOworICAgICAgICAgICAgYXJncysrOworICAgICAgICAgICAgLyogTm93IHNuYXJmIGEgbGl0ZXJhbCB2YWx1ZSBmb2xsb3dpbmcgJ0wnICovCisgICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQorCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAvKiBTbmFyZiBhIGxpdGVyYWwgZm9sbG93aW5nICdMJyAqLworICAgICAgICAgICAgYXJncysrOworICAgICAgICAgICAgaWYgKCFzbmFyZl9udW1lcmljX2xpdGVyYWwgKCZhcmdzLCAmYXJnKSkKKwkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogTm90IGhhbmRsaW5nIG90aGVyIEhQIGNmcm9udCBzdHVmZiAqLworICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJmFyZykpCisgICAgICAgICAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKKwkgIH0KKwlzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOworCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOworICAgICAgfQorICAgIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU6CisgICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKKyAgICAgIGlmIChhcmdzID49IGUpCisJLS1kZWNscC0+cDsgLyogcmVtb3ZlIGV4dHJhIGNvbW1hICovCisgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKKyAgICB9CisgIGVsc2UgaWYgKG4+MTAgJiYgc3RybmNtcCAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDAKKwkgICAmJiAoKm1hbmdsZWQpWzldID09ICdOJworCSAgICYmICgqbWFuZ2xlZClbOF0gPT0gKCptYW5nbGVkKVsxMF0KKwkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pKQorICAgIHsKKyAgICAgIC8qIEEgbWVtYmVyIG9mIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiAgKi8KKyAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAie2Fub255bW91c30iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsIG9ubHkgKi8KKwl3b3JrLT50ZW1wX3N0YXJ0ID0gMDsgICAgIC8qIGRpc2FibGUgaW4gcmVjdXJzaXZlIGNhbGxzICovCisgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKKyAgICB9CisgICptYW5nbGVkICs9IG47Cit9CisKKy8qIEV4dHJhY3QgYSBjbGFzcyBuYW1lLCBwb3NzaWJseSBhIHRlbXBsYXRlIHdpdGggYXJndW1lbnRzLCBmcm9tIHRoZQorICAgbWFuZ2xlZCBzdHJpbmc7IHF1YWxpZmllcnMsIGxvY2FsIGNsYXNzIGluZGljYXRvcnMsIGV0Yy4gaGF2ZQorICAgYWxyZWFkeSBiZWVuIGRlYWx0IHdpdGggKi8KKworc3RhdGljIGludAorZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpkZWNscDsKK3sKKyAgaW50IG47CisgIGludCBzdWNjZXNzID0gMDsKKworICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7CisgIGlmIChuID09IC0xKQorICAgIHJldHVybiAwOworICBpZiAoKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPj0gbikKKyAgICB7CisgICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKTsKKyAgICAgIHN1Y2Nlc3MgPSAxOworICAgIH0KKworICByZXR1cm4gKHN1Y2Nlc3MpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZGVtYW5nbGVfY2xhc3MgLS0gZGVtYW5nbGUgYSBtYW5nbGVkIGNsYXNzIHNlcXVlbmNlCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgaW50CisJZGVtYW5nbGVfY2xhc3MgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKKwkJCXN0cmludCAqZGVjbHApCisKK0RFU0NSSVBUSU9OCisKKwlERUNMUCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xpbmcgaXMgYmVpbmcgZG9uZS4KKworCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB0b2tlbiB0byBiZSBkZW1hbmdsZWQuICBPbiBpbnB1dCwKKwlpdCBwb2ludHMgdG8gYSBtYW5nbGVkIGNsYXNzIChJLkUuICIzZm9vIiwgIjEzdmVyeWxvbmdjbGFzcyIsIGV0Yy4pCisJT24gZXhpdCwgaXQgcG9pbnRzIHRvIHRoZSBuZXh0IHRva2VuIGFmdGVyIHRoZSBtYW5nbGVkIGNsYXNzIG9uCisJc3VjY2Vzcywgb3IgdGhlIGZpcnN0IHVuY29uc3VtZWQgdG9rZW4gb24gZmFpbHVyZS4KKworCUlmIHRoZSBDT05TVFJVQ1RPUiBvciBERVNUUlVDVE9SIGZsYWdzIGFyZSBzZXQgaW4gV09SSywgdGhlbgorCXdlIGFyZSBkZW1hbmdsaW5nIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gIEluIHRoaXMgY2FzZQorCXdlIHByZXBlbmQgImNsYXNzOjpjbGFzcyIgb3IgImNsYXNzOjp+Y2xhc3MiIHRvIERFQ0xQLgorCisJT3RoZXJ3aXNlLCB3ZSBwcmVwZW5kICJjbGFzczo6IiB0byB0aGUgY3VycmVudCBERUNMUC4KKworCVJlc2V0IHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZsYWdzIG9uY2UgdGhleSBoYXZlIGJlZW4KKwkiY29uc3VtZWQiLiAgVGhpcyBhbGxvd3MgZGVtYW5nbGVfY2xhc3MgdG8gYmUgY2FsbGVkIGxhdGVyIGR1cmluZworCXRoZSBzYW1lIGRlbWFuZ2xpbmcsIHRvIGRvIG5vcm1hbCBjbGFzcyBkZW1hbmdsaW5nLgorCisJUmV0dXJucyAxIGlmIGRlbWFuZ2xpbmcgaXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UuCisKKyovCisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcgKmRlY2xwOworeworICBpbnQgc3VjY2VzcyA9IDA7CisgIGludCBidHlwZTsKKyAgc3RyaW5nIGNsYXNzX25hbWU7CisgIGNoYXIgKnNhdmVfY2xhc3NfbmFtZV9lbmQgPSAwOworCisgIHN0cmluZ19pbml0ICgmY2xhc3NfbmFtZSk7CisgIGJ0eXBlID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOworICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmNsYXNzX25hbWUpKQorICAgIHsKKyAgICAgIHNhdmVfY2xhc3NfbmFtZV9lbmQgPSBjbGFzc19uYW1lLnA7CisgICAgICBpZiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkKKwl7CisgICAgICAgICAgLyogYWRqdXN0IHNvIHdlIGRvbid0IGluY2x1ZGUgdGVtcGxhdGUgYXJncyAqLworICAgICAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ICYmICh3b3JrLT50ZW1wX3N0YXJ0ICE9IC0xKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2xhc3NfbmFtZS5wID0gY2xhc3NfbmFtZS5iICsgd29yay0+dGVtcF9zdGFydDsKKyAgICAgICAgICAgIH0KKwkgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZjbGFzc19uYW1lKTsKKwkgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQorCSAgICB7CisJICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCAifiIpOworICAgICAgICAgICAgICB3b3JrIC0+IGRlc3RydWN0b3IgLT0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgd29yayAtPiBjb25zdHJ1Y3RvciAtPSAxOworCSAgICB9CisJfQorICAgICAgY2xhc3NfbmFtZS5wID0gc2F2ZV9jbGFzc19uYW1lX2VuZDsKKyAgICAgIHJlbWVtYmVyX0t0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpKTsKKyAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpLCBidHlwZSk7CisgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOworICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOworICAgICAgc3VjY2VzcyA9IDE7CisgICAgfQorICBzdHJpbmdfZGVsZXRlICgmY2xhc3NfbmFtZSk7CisgIHJldHVybiAoc3VjY2Vzcyk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZW1hbmdsZV9wcmVmaXggLS0gY29uc3VtZSB0aGUgbWFuZ2xlZCBuYW1lIHByZWZpeCBhbmQgZmluZCBzaWduYXR1cmUKKworU1lOT1BTSVMKKworCXN0YXRpYyBpbnQKKwlkZW1hbmdsZV9wcmVmaXggKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKKwkJCSBzdHJpbmcgKmRlY2xwKTsKKworREVTQ1JJUFRJT04KKworCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBwcmVmaXggb2YgdGhlIG1hbmdsZWQgbmFtZS4KKworCURFQ0xQIHBvaW50cyB0byB0aGUgc3RyaW5nIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xlZCBvdXRwdXQgaXMKKwlwbGFjZWQuICBPbiBlbnRyeSwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gIE9uIGV4aXQgaXQgY29udGFpbnMKKwl0aGUgcm9vdCBmdW5jdGlvbiBuYW1lLCB0aGUgZGVtYW5nbGVkIG9wZXJhdG9yIG5hbWUsIG9yIGluIHNvbWUKKwlzcGVjaWFsIGNhc2VzIGVpdGhlciBub3RoaW5nIG9yIHRoZSBjb21wbGV0ZWx5IGRlbWFuZ2xlZCByZXN1bHQuCisKKwlNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCBwb2ludGVyIGludG8gdGhlIG1hbmdsZWQgbmFtZS4gIEFzIGVhY2gKKwl0b2tlbiBvZiB0aGUgbWFuZ2xlZCBuYW1lIGlzIGNvbnN1bWVkLCBpdCBpcyB1cGRhdGVkLiAgVXBvbiBlbnRyeQorCXRoZSBjdXJyZW50IG1hbmdsZWQgbmFtZSBwb2ludGVyIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCisJdGhlIG1hbmdsZWQgbmFtZS4gIFVwb24gZXhpdCwgaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKwlvZiB0aGUgc2lnbmF0dXJlIGlmIGRlbWFuZ2xpbmcgd2FzIHN1Y2Nlc3NmdWwsIG9yIHRvIHRoZSBmaXJzdAorCXVuY29uc3VtZWQgY2hhcmFjdGVyIGlmIGRlbWFuZ2xpbmcgb2YgdGhlIHByZWZpeCB3YXMgdW5zdWNjZXNzZnVsLgorCisJUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgorICovCisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX3ByZWZpeCAod29yaywgbWFuZ2xlZCwgZGVjbHApCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpkZWNscDsKK3sKKyAgaW50IHN1Y2Nlc3MgPSAxOworICBjb25zdCBjaGFyICpzY2FuOworICBpbnQgaTsKKworICBpZiAoc3RybGVuKCptYW5nbGVkKSA+IDYKKyAgICAgICYmIChzdHJuY21wKCptYW5nbGVkLCAiX2ltcF9fIiwgNikgPT0gMAorICAgICAgICAgIHx8IHN0cm5jbXAoKm1hbmdsZWQsICJfX2ltcF8iLCA2KSA9PSAwKSkKKyAgICB7CisgICAgICAvKiBpdCdzIGEgc3ltYm9sIGltcG9ydGVkIGZyb20gYSBQRSBkeW5hbWljIGxpYnJhcnkuIENoZWNrIGZvciBib3RoCisgICAgICAgICBuZXcgc3R5bGUgcHJlZml4IF9pbXBfXyBhbmQgbGVnYWN5IF9faW1wXyB1c2VkIGJ5IG9sZGVyIHZlcnNpb25zCisJIG9mIGRsbHRvb2wuICovCisgICAgICAoKm1hbmdsZWQpICs9IDY7CisgICAgICB3b3JrLT5kbGxpbXBvcnRlZCA9IDE7CisgICAgfQorICBlbHNlIGlmIChzdHJsZW4oKm1hbmdsZWQpID49IDExICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDApCisgICAgeworICAgICAgY2hhciAqbWFya2VyID0gc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzhdKTsKKyAgICAgIGlmIChtYXJrZXIgIT0gTlVMTCAmJiAqbWFya2VyID09ICgqbWFuZ2xlZClbMTBdKQorCXsKKwkgIGlmICgoKm1hbmdsZWQpWzldID09ICdEJykKKwkgICAgeworCSAgICAgIC8qIGl0J3MgYSBHTlUgZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCisJICAgICAgKCptYW5nbGVkKSArPSAxMTsKKwkgICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKKwkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKKwkJcmV0dXJuIHN1Y2Nlc3M7CisJICAgIH0KKwkgIGVsc2UgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0knKQorCSAgICB7CisJICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0ICovCisJICAgICAgKCptYW5nbGVkKSArPSAxMTsKKwkgICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7CisJICAgICAgaWYgKGdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkpCisJCXJldHVybiBzdWNjZXNzOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfX3N0ZF9fIiwgNykgPT0gMCkKKyAgICB7CisgICAgICAvKiBpdCdzIGEgQVJNIGdsb2JhbCBkZXN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gZXhpdCAqLworICAgICAgKCptYW5nbGVkKSArPSA3OworICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDI7CisgICAgfQorICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RpX18iLCA3KSA9PSAwKQorICAgIHsKKyAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGNvbnN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gaW5pdGlhbCAqLworICAgICAgKCptYW5nbGVkKSArPSA3OworICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAyOworICAgIH0KKworICAvKiAgVGhpcyBibG9jayBvZiBjb2RlIGlzIGEgcmVkdWN0aW9uIGluIHN0cmVuZ3RoIHRpbWUgb3B0aW1pemF0aW9uCisgICAgICBvZjoKKyAgICAgIHNjYW4gPSBteXN0cnN0ciAoKm1hbmdsZWQsICJfXyIpOyAqLworCisgIHsKKyAgICBzY2FuID0gKm1hbmdsZWQ7CisKKyAgICBkbyB7CisgICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOworICAgIH0gd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7CisKKyAgICBpZiAoc2NhbiAhPSBOVUxMKSAtLXNjYW47CisgIH0KKworICBpZiAoc2NhbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGZvdW5kIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgJ18nLCBlbnN1cmUgdGhhdCB3ZSBzdGFydCBhdAorCSB0aGUgbGFzdCBwYWlyIGluIHRoZSBzZXF1ZW5jZS4gICovCisgICAgICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOworICAgICAgaWYgKGkgPiAyKQorCXsKKwkgIHNjYW4gKz0gKGkgLSAyKTsKKwl9CisgICAgfQorCisgIGlmIChzY2FuID09IE5VTEwpCisgICAgeworICAgICAgc3VjY2VzcyA9IDA7CisgICAgfQorICBlbHNlIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQorICAgIHsKKyAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblswXSkgJiYgKHNjYW5bMF0gIT0gJ3QnKSkKKwl7CisJICBzdWNjZXNzID0gMDsKKwl9CisgICAgfQorICBlbHNlIGlmICgoc2NhbiA9PSAqbWFuZ2xlZCkKKwkgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkgfHwgKHNjYW5bMl0gPT0gJ1EnKQorCSAgICAgICB8fCAoc2NhblsyXSA9PSAndCcpIHx8IChzY2FuWzJdID09ICdLJykgfHwgKHNjYW5bMl0gPT0gJ0gnKSkpCisgICAgeworICAgICAgLyogVGhlIEFSTSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIG1hbmdsaW5nIG9mIGxvY2FsIHZhcmlhYmxlcy4KKwkgQnV0IGNmcm9udCBtYW5nbGVzIGxvY2FsIHZhcmlhYmxlcyBieSBwcmVwZW5kaW5nIF9fPG5lc3RpbmdfbGV2ZWw+CisJIHRvIHRoZW0uIEFzIGFuIGV4dGVuc2lvbiB0byBBUk0gZGVtYW5nbGluZyB3ZSBoYW5kbGUgdGhpcyBjYXNlLiAgKi8KKyAgICAgIGlmICgoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKQorCSAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkpCisJeworCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKKwkgIGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOworCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkKTsKKwkgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOworCSAgc3VjY2VzcyA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEEgR05VIHN0eWxlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoIF9fWzAtOVF0XS4gIEJ1dCBjZnJvbnQgdXNlcworCSAgICAgbmFtZXMgbGlrZSBfX1EyXzNmb28zYmFyIGZvciBuZXN0ZWQgdHlwZSBuYW1lcy4gIFNvIGRvbid0IGFjY2VwdAorCSAgICAgdGhpcyBzdHlsZSBvZiBjb25zdHJ1Y3RvciBmb3IgY2Zyb250IGRlbWFuZ2xpbmcuICBBIEdOVQorCSAgICAgc3R5bGUgbWVtYmVyLXRlbXBsYXRlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoICdIJy4gKi8KKwkgIGlmICghKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykpCisJICAgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKKwkgICptYW5nbGVkID0gc2NhbiArIDI7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoQVJNX0RFTUFOR0xJTkcgJiYgc2NhblsyXSA9PSAncCcgJiYgc2NhblszXSA9PSAndCcpCisgICAgeworICAgICAgLyogQ2Zyb250LXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCisgICAgICBzdWNjZXNzID0gMTsKKworICAgICAgLyogQVJNIHRlbXBsYXRlPyAqLworICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOworICAgIH0KKyAgZWxzZSBpZiAoRURHX0RFTUFOR0xJTkcgJiYgKChzY2FuWzJdID09ICd0JyAmJiBzY2FuWzNdID09ICdtJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICdzJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykpKQorICAgIHsKKyAgICAgIC8qIEVERy1zdHlsZSBwYXJhbWV0ZXJpemVkIHR5cGUuICBIYW5kbGVkIGxhdGVyIGFzIGEgc2lnbmF0dXJlLiAqLworICAgICAgc3VjY2VzcyA9IDE7CisKKyAgICAgIC8qIEVERyB0ZW1wbGF0ZT8gKi8KKyAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgc3RybGVuICgqbWFuZ2xlZCksIGRlY2xwKTsKKyAgICB9CisgIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKSAmJiAhaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkKKwkgICAmJiAoc2NhblsyXSAhPSAndCcpKQorICAgIHsKKyAgICAgIC8qIE1hbmdsZWQgbmFtZSBzdGFydHMgd2l0aCAiX18iLiAgU2tpcCBvdmVyIGFueSBsZWFkaW5nICdfJyBjaGFyYWN0ZXJzLAorCSB0aGVuIGZpbmQgdGhlIG5leHQgIl9fIiB0aGF0IHNlcGFyYXRlcyB0aGUgcHJlZml4IGZyb20gdGhlIHNpZ25hdHVyZS4KKwkgKi8KKyAgICAgIGlmICghKEFSTV9ERU1BTkdMSU5HIHx8IExVQ0lEX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKKwkgIHx8IChhcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApID09IDApKQorCXsKKwkgIHdoaWxlICgqc2NhbiA9PSAnXycpCisJICAgIHsKKwkgICAgICBzY2FuKys7CisJICAgIH0KKwkgIGlmICgoc2NhbiA9IG15c3Ryc3RyIChzY2FuLCAiX18iKSkgPT0gTlVMTCB8fCAoKihzY2FuICsgMikgPT0gJ1wwJykpCisJICAgIHsKKwkgICAgICAvKiBObyBzZXBhcmF0b3IgKEkuRS4gIl9fbm90X21hbmdsZWQiKSwgb3IgZW1wdHkgc2lnbmF0dXJlCisJCSAoSS5FLiAiX19ub3RfbWFuZ2xlZF9laXRoZXJfXyIpICovCisJICAgICAgc3VjY2VzcyA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnRtcDsKKworICAgICAgICAgICAgICAvKiBMb29rIGZvciB0aGUgTEFTVCBvY2N1cnJlbmNlIG9mIF9fLCBhbGxvd2luZyBuYW1lcyB0bworICAgICAgICAgICAgICAgICBoYXZlIHRoZSAnX18nIHNlcXVlbmNlIGVtYmVkZGVkIGluIHRoZW0uICovCisJICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykpCisJCXsKKwkJICB3aGlsZSAoKHRtcCA9IG15c3Ryc3RyIChzY2FuICsgMiwgIl9fIikpICE9IE5VTEwpCisJCSAgICBzY2FuID0gdG1wOworCQl9CisJICAgICAgaWYgKCooc2NhbiArIDIpID09ICdcMCcpCisJCXN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoKihzY2FuICsgMikgIT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBNYW5nbGVkIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAiX18iIGJ1dCBkb2VzIGhhdmUgb25lIHNvbWV3aGVyZQorCSBpbiB0aGVyZSB3aXRoIG5vbiBlbXB0eSBzdHVmZiBhZnRlciBpdC4gIExvb2tzIGxpa2UgYSBnbG9iYWwKKwkgZnVuY3Rpb24gbmFtZS4gICovCisgICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRG9lc24ndCBsb29rIGxpa2UgYSBtYW5nbGVkIG5hbWUgKi8KKyAgICAgIHN1Y2Nlc3MgPSAwOworICAgIH0KKworICBpZiAoIXN1Y2Nlc3MgJiYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIgfHwgd29yay0+ZGVzdHJ1Y3RvciA9PSAyKSkKKyAgICB7CisgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOworICAgICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7CisgICAgICBzdWNjZXNzID0gMTsKKyAgICB9CisgIHJldHVybiAoc3VjY2Vzcyk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlnbnVfc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIGdudSBtYW5nbGVkIHN0cmluZ3MKKworU1lOT1BTSVMKKworCXN0YXRpYyBpbnQKKwlnbnVfc3BlY2lhbCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAorCQkgICAgIHN0cmluZyAqZGVjbHApOworCisKK0RFU0NSSVBUSU9OCisKKwlQcm9jZXNzIHNvbWUgc3BlY2lhbCBHTlUgc3R5bGUgbWFuZ2xpbmcgZm9ybXMgdGhhdCBkb24ndCBmaXQKKwl0aGUgbm9ybWFsIHBhdHRlcm4uICBGb3IgZXhhbXBsZToKKworCQlfJF8zZm9vCQkoZGVzdHJ1Y3RvciBmb3IgY2xhc3MgZm9vKQorCQlfdnQkZm9vCQkoZm9vIHZpcnR1YWwgdGFibGUpCisJCV92dCRmb28kYmFyCShmb286OmJhciB2aXJ0dWFsIHRhYmxlKQorCQlfX3Z0X2ZvbwkoZm9vIHZpcnR1YWwgdGFibGUsIG5ldyBzdHlsZSB3aXRoIHRodW5rcykKKwkJXzNmb28kdmFybmFtZQkoc3RhdGljIGRhdGEgbWVtYmVyKQorCQlfUTIycnMydHUkdncJKHN0YXRpYyBkYXRhIG1lbWJlcikKKwkJX190NnZlY3RvcjFaaWkJKGNvbnN0cnVjdG9yIHdpdGggdGVtcGxhdGUpCisJCV9fdGh1bmtfNF9fJF83b3N0cmVhbSAodmlydHVhbCBmdW5jdGlvbiB0aHVuaykKKyAqLworCitzdGF0aWMgaW50CitnbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpkZWNscDsKK3sKKyAgaW50IG47CisgIGludCBzdWNjZXNzID0gMTsKKyAgY29uc3QgY2hhciAqcDsKKworICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKKyAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVsxXSkgIT0gTlVMTAorICAgICAgJiYgKCptYW5nbGVkKVsyXSA9PSAnXycpCisgICAgeworICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgZGVzdHJ1Y3RvciwgZ2V0IHBhc3QgIl88Q1BMVVNfTUFSS0VSPl8iICovCisgICAgICAoKm1hbmdsZWQpICs9IDM7CisgICAgICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKKyAgICB9CisgIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCisJICAgJiYgKCgoKm1hbmdsZWQpWzFdID09ICdfJworCQkmJiAoKm1hbmdsZWQpWzJdID09ICd2JworCQkmJiAoKm1hbmdsZWQpWzNdID09ICd0JworCQkmJiAoKm1hbmdsZWQpWzRdID09ICdfJykKKwkgICAgICAgfHwgKCgqbWFuZ2xlZClbMV0gPT0gJ3YnCisJCSAgICYmICgqbWFuZ2xlZClbMl0gPT0gJ3QnCisJCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVszXSkgIT0gTlVMTCkpKQorICAgIHsKKyAgICAgIC8qIEZvdW5kIGEgR05VIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0ICJfdnQ8Q1BMVVNfTUFSS0VSPiIKKyAgICAgICAgIGFuZCBjcmVhdGUgdGhlIGRlY2wuICBOb3RlIHRoYXQgd2UgY29uc3VtZSB0aGUgZW50aXJlIG1hbmdsZWQKKwkgaW5wdXQgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGRlbWFuZ2xlX3NpZ25hdHVyZSBoYXMgbm8gd29yaworCSB0byBkby4gICovCisgICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAndicpCisJKCptYW5nbGVkKSArPSA1OyAvKiBOZXcgc3R5bGUsIHdpdGggdGh1bmtzOiAiX192dF8iICovCisgICAgICBlbHNlCisJKCptYW5nbGVkKSArPSA0OyAvKiBPbGQgc3R5bGUsIG5vIHRodW5rczogIl92dDxDUExVU19NQVJLRVI+IiAqLworICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQorCXsKKwkgIHN3aXRjaCAoKiptYW5nbGVkKQorCSAgICB7CisJICAgIGNhc2UgJ1EnOgorCSAgICBjYXNlICdLJzoKKwkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3QnOgorCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsCisJCQkJCSAgIDEpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSptYW5nbGVkWzBdKSkKKwkJeworCQkgIG4gPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOworCQkgIC8qIFdlIG1heSBiZSBzZWVpbmcgYSB0b28tbGFyZ2Ugc2l6ZSwgb3IgZWxzZSBhCisJCSAgICAgIi48ZGlnaXRzPiIgaW5kaWNhdGluZyBhIHN0YXRpYyBsb2NhbCBzeW1ib2wuICBJbgorCQkgICAgIGFueSBjYXNlLCBkZWNsYXJlIHZpY3RvcnkgYW5kIG1vdmUgb247ICpkb24ndCogdHJ5CisJCSAgICAgdG8gdXNlIG4gdG8gYWxsb2NhdGUuICAqLworCQkgIGlmIChuID4gKGludCkgc3RybGVuICgqbWFuZ2xlZCkpCisJCSAgICB7CisJCSAgICAgIHN1Y2Nlc3MgPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIG4gPSBzdHJjc3BuICgqbWFuZ2xlZCwgY3BsdXNfbWFya2Vycyk7CisJCX0KKwkgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKKwkgICAgICAoKm1hbmdsZWQpICs9IG47CisJICAgIH0KKworCSAgcCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKKwkgIGlmIChzdWNjZXNzICYmICgocCA9PSBOVUxMKSB8fCAocCA9PSAqbWFuZ2xlZCkpKQorCSAgICB7CisJICAgICAgaWYgKHAgIT0gTlVMTCkKKwkJeworCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKKwkJICAoKm1hbmdsZWQpKys7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3VjY2VzcyA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBpZiAoc3VjY2VzcykKKwlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiB2aXJ0dWFsIHRhYmxlIik7CisgICAgfQorICBlbHNlIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJworCSAgICYmIChzdHJjaHIoIjAxMjM0NTY3ODlRdCIsICgqbWFuZ2xlZClbMV0pICE9IE5VTEwpCisJICAgJiYgKHAgPSBzdHJwYnJrICgqbWFuZ2xlZCwgY3BsdXNfbWFya2VycykpICE9IE5VTEwpCisgICAgeworICAgICAgLyogc3RhdGljIGRhdGEgbWVtYmVyLCAiXzNmb28kdmFybmFtZSIgZm9yIGV4YW1wbGUgKi8KKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQorCXsKKwljYXNlICdRJzoKKwljYXNlICdLJzoKKwkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKKwkgIGJyZWFrOworCWNhc2UgJ3QnOgorCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOworCSAgaWYgKG4gPCAwIHx8IG4gPiBzdHJsZW4gKCptYW5nbGVkKSkKKwkgICAgeworCSAgICAgIHN1Y2Nlc3MgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKKwkgICgqbWFuZ2xlZCkgKz0gbjsKKwl9CisgICAgICBpZiAoc3VjY2VzcyAmJiAocCA9PSAqbWFuZ2xlZCkpCisJeworCSAgLyogQ29uc3VtZWQgZXZlcnl0aGluZyB1cCB0byB0aGUgY3BsdXNfbWFya2VyLCBhcHBlbmQgdGhlCisJICAgICB2YXJpYWJsZSBuYW1lLiAgKi8KKwkgICgqbWFuZ2xlZCkrKzsKKwkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKKwkgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKKwkgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOworCSAgKCptYW5nbGVkKSArPSBuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdWNjZXNzID0gMDsKKwl9CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgIl9fdGh1bmtfIiwgOCkgPT0gMCkKKyAgICB7CisgICAgICBpbnQgZGVsdGE7CisKKyAgICAgICgqbWFuZ2xlZCkgKz0gODsKKyAgICAgIGRlbHRhID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7CisgICAgICBpZiAoZGVsdGEgPT0gLTEpCisJc3VjY2VzcyA9IDA7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqbWV0aG9kID0gaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssICsrKm1hbmdsZWQpOworCisJICBpZiAobWV0aG9kKQorCSAgICB7CisJICAgICAgY2hhciBidWZbNTBdOworCSAgICAgIHNwcmludGYgKGJ1ZiwgInZpcnR1YWwgZnVuY3Rpb24gdGh1bmsgKGRlbHRhOiVkKSBmb3IgIiwgLWRlbHRhKTsKKwkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgYnVmKTsKKwkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgbWV0aG9kKTsKKwkgICAgICBmcmVlIChtZXRob2QpOworCSAgICAgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKKwkgICAgICAoKm1hbmdsZWQpICs9IG47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN1Y2Nlc3MgPSAwOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoKm1hbmdsZWQsICJfX3QiLCAzKSA9PSAwCisJICAgJiYgKCgqbWFuZ2xlZClbM10gPT0gJ2knIHx8ICgqbWFuZ2xlZClbM10gPT0gJ2YnKSkKKyAgICB7CisgICAgICBwID0gKCptYW5nbGVkKVszXSA9PSAnaScgPyAiIHR5cGVfaW5mbyBub2RlIiA6ICIgdHlwZV9pbmZvIGZ1bmN0aW9uIjsKKyAgICAgICgqbWFuZ2xlZCkgKz0gNDsKKyAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQorCXsKKwljYXNlICdRJzoKKwljYXNlICdLJzoKKwkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKKwkgIGJyZWFrOworCWNhc2UgJ3QnOgorCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgZGVjbHApOworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdcMCcpCisJc3VjY2VzcyA9IDA7CisgICAgICBpZiAoc3VjY2VzcykKKwlzdHJpbmdfYXBwZW5kIChkZWNscCwgcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3VjY2VzcyA9IDA7CisgICAgfQorICByZXR1cm4gKHN1Y2Nlc3MpOworfQorCitzdGF0aWMgdm9pZAorcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBuYW1lbGVuZ3RoKQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7CisgICAgIHN0cmluZyAqcmVzdWx0OworICAgICBpbnQgbmFtZWxlbmd0aDsKK3sKKyAgY2hhciAqIHJlY3Vyc2UgPSAoY2hhciAqKU5VTEw7CisgIGNoYXIgKiByZWN1cnNlX2RlbSA9IChjaGFyICopTlVMTDsKKworICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobmFtZWxlbmd0aCArIDEpOworICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBuYW1lbGVuZ3RoKTsKKyAgcmVjdXJzZVtuYW1lbGVuZ3RoXSA9ICdcMDAwJzsKKworICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKKworICBpZiAocmVjdXJzZV9kZW0pCisgICAgeworICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7CisgICAgICBmcmVlIChyZWN1cnNlX2RlbSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIG5hbWVsZW5ndGgpOworICAgIH0KKyAgZnJlZSAocmVjdXJzZSk7CisgICptYW5nbGVkICs9IG5hbWVsZW5ndGg7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlhcm1fc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIEFSTS9sdWNpZCBtYW5nbGVkIHN0cmluZ3MKKworU1lOT1BTSVMKKworCXN0YXRpYyBpbnQKKwlhcm1fc3BlY2lhbCAoY29uc3QgY2hhciAqKm1hbmdsZWQsCisJCSAgICAgc3RyaW5nICpkZWNscCk7CisKKworREVTQ1JJUFRJT04KKworCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEFSTSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAorCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgorCisJCV9fdnRibF9fM2ZvbwkJKGZvbyB2aXJ0dWFsIHRhYmxlKQorCQlfX3Z0YmxfXzNmb29fXzNiYXIJKGJhcjo6Zm9vIHZpcnR1YWwgdGFibGUpCisKKyAqLworCitzdGF0aWMgaW50Cithcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApCisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcgKmRlY2xwOworeworICBpbnQgbjsKKyAgaW50IHN1Y2Nlc3MgPSAxOworICBjb25zdCBjaGFyICpzY2FuOworCisgIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgQVJNX1ZUQUJMRV9TVFJJTkcsIEFSTV9WVEFCTEVfU1RSTEVOKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIEZvdW5kIGEgQVJNIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0IEFSTV9WVEFCTEVfU1RSSU5HCisgICAgICAgICBhbmQgY3JlYXRlIHRoZSBkZWNsLiAgTm90ZSB0aGF0IHdlIGNvbnN1bWUgdGhlIGVudGlyZSBtYW5nbGVkCisJIGlucHV0IHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBkZW1hbmdsZV9zaWduYXR1cmUgaGFzIG5vIHdvcmsKKwkgdG8gZG8uICAqLworICAgICAgc2NhbiA9ICptYW5nbGVkICsgQVJNX1ZUQUJMRV9TVFJMRU47CisgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgICAgICAgIC8qIGZpcnN0IGNoZWNrIGl0IGNhbiBiZSBkZW1hbmdsZWQgKi8KKyAgICAgICAgeworICAgICAgICAgIG4gPSBjb25zdW1lX2NvdW50ICgmc2Nhbik7CisgICAgICAgICAgaWYgKG4gPT0gLTEpCisJICAgIHsKKwkgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgLyogbm8gZ29vZCAqLworCSAgICB9CisgICAgICAgICAgc2NhbiArPSBuOworICAgICAgICAgIGlmIChzY2FuWzBdID09ICdfJyAmJiBzY2FuWzFdID09ICdfJykKKwkgICAgeworCSAgICAgIHNjYW4gKz0gMjsKKwkgICAgfQorICAgICAgICB9CisgICAgICAoKm1hbmdsZWQpICs9IEFSTV9WVEFCTEVfU1RSTEVOOworICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQorCXsKKwkgIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKKyAgICAgICAgICBpZiAobiA9PSAtMQorCSAgICAgIHx8IG4gPiBzdHJsZW4gKCptYW5nbGVkKSkKKwkgICAgcmV0dXJuIDA7CisJICBzdHJpbmdfcHJlcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7CisJICAoKm1hbmdsZWQpICs9IG47CisJICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycgJiYgKCptYW5nbGVkKVsxXSA9PSAnXycpCisJICAgIHsKKwkgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsICI6OiIpOworCSAgICAgICgqbWFuZ2xlZCkgKz0gMjsKKwkgICAgfQorCX0KKyAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHZpcnR1YWwgdGFibGUiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdWNjZXNzID0gMDsKKyAgICB9CisgIHJldHVybiAoc3VjY2Vzcyk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZW1hbmdsZV9xdWFsaWZpZWQgLS0gZGVtYW5nbGUgJ1EnIHF1YWxpZmllZCBuYW1lIHN0cmluZ3MKKworU1lOT1BTSVMKKworCXN0YXRpYyBpbnQKKwlkZW1hbmdsZV9xdWFsaWZpZWQgKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKm1hbmdsZWQsCisJCQkgICAgc3RyaW5nICpyZXN1bHQsIGludCBpc2Z1bmNuYW1lLCBpbnQgYXBwZW5kKTsKKworREVTQ1JJUFRJT04KKworCURlbWFuZ2xlIGEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIlEyNU91dGVyNUlubmVyIiB3aGljaCBpcworCXRoZSBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICBUaGUgZGVtYW5nbGVkIG91dHB1dCBpcworCXByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgcmVzdWx0IHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlCisJc3RhdGUgb2YgdGhlIGFwcGVuZCBmbGFnLgorCisJSWYgaXNmdW5jbmFtZSBpcyBub256ZXJvLCB0aGVuIHRoZSBxdWFsaWZpZWQgbmFtZSB3ZSBhcmUgYnVpbGRpbmcKKwlpcyBnb2luZyB0byBiZSB1c2VkIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIG5hbWUsIHNvIGlmIGl0IGlzIGEKKwljb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGZ1bmN0aW9uLCBhcHBlbmQgYW4gYXBwcm9wcmlhdGUKKwljb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuICBJLkUuIGZvciB0aGUgYWJvdmUgZXhhbXBsZSwKKwl0aGUgcmVzdWx0IGZvciB1c2UgYXMgYSBjb25zdHJ1Y3RvciBpcyAiT3V0ZXI6OklubmVyOjpJbm5lciIKKwlhbmQgdGhlIHJlc3VsdCBmb3IgdXNlIGFzIGEgZGVzdHJ1Y3RvciBpcyAiT3V0ZXI6OklubmVyOjp+SW5uZXIiLgorCitCVUdTCisKKwlOdW1lcmljIGNvbnZlcnNpb24gaXMgQVNDSUkgZGVwZW5kZW50IChGSVhNRSkuCisKKyAqLworCitzdGF0aWMgaW50CitkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgaXNmdW5jbmFtZSwgYXBwZW5kKQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7CisgICAgIHN0cmluZyAqcmVzdWx0OworICAgICBpbnQgaXNmdW5jbmFtZTsKKyAgICAgaW50IGFwcGVuZDsKK3sKKyAgaW50IHF1YWxpZmllcnMgPSAwOworICBpbnQgc3VjY2VzcyA9IDE7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNoYXIgbnVtWzJdOworICBzdHJpbmcgdGVtcDsKKyAgc3RyaW5nIGxhc3RfbmFtZTsKKyAgaW50IGJpbmRleCA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKKworICAvKiBXZSBvbmx5IG1ha2UgdXNlIG9mIElTRlVOQ05BTUUgaWYgdGhlIGVudGl0eSBpcyBhIGNvbnN0cnVjdG9yIG9yCisgICAgIGRlc3RydWN0b3IuICAqLworICBpc2Z1bmNuYW1lID0gKGlzZnVuY25hbWUKKwkJJiYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpKTsKKworICBzdHJpbmdfaW5pdCAoJnRlbXApOworICBzdHJpbmdfaW5pdCAoJmxhc3RfbmFtZSk7CisKKyAgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ0snKQorICAgIHsKKyAgICAvKiBTcXVhbmdsaW5nIHF1YWxpZmllZCBuYW1lIHJldXNlICovCisgICAgICBpbnQgaWR4OworICAgICAgKCptYW5nbGVkKSsrOworICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKKyAgICAgIGlmIChpZHggPT0gLTEgfHwgaWR4ID49IHdvcmsgLT4gbnVtaykKKyAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICBlbHNlCisgICAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCB3b3JrIC0+IGt0eXBldmVjW2lkeF0pOworICAgIH0KKyAgZWxzZQorICAgIHN3aXRjaCAoKCptYW5nbGVkKVsxXSkKKyAgICB7CisgICAgY2FzZSAnXyc6CisgICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcyBwcmVjZWRlZAorCSBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5IGNhc2UpIGFuZCBmb2xsb3dlZAorCSBieSBhbiB1bmRlcnNjb3JlLiAgKi8KKyAgICAgIHAgPSAqbWFuZ2xlZCArIDI7CisgICAgICBxdWFsaWZpZXJzID0gYXRvaSAocCk7CisgICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSB8fCAqcCA9PSAnMCcpCisJc3VjY2VzcyA9IDA7CisKKyAgICAgIC8qIFNraXAgdGhlIGRpZ2l0cy4gICovCisgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApKQorCSsrcDsKKworICAgICAgaWYgKCpwICE9ICdfJykKKwlzdWNjZXNzID0gMDsKKworICAgICAgKm1hbmdsZWQgPSBwICsgMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnNyc6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnOSc6CisgICAgICAvKiBUaGUgY291bnQgaXMgaW4gYSBzaW5nbGUgZGlnaXQuICAqLworICAgICAgbnVtWzBdID0gKCptYW5nbGVkKVsxXTsKKyAgICAgIG51bVsxXSA9ICdcMCc7CisgICAgICBxdWFsaWZpZXJzID0gYXRvaSAobnVtKTsKKworICAgICAgLyogSWYgdGhlcmUgaXMgYW4gdW5kZXJzY29yZSBhZnRlciB0aGUgZGlnaXQsIHNraXAgaXQuICBUaGlzIGlzCisJIHNhaWQgdG8gYmUgZm9yIEFSTS1xdWFsaWZpZWQgbmFtZXMsIGJ1dCB0aGUgQVJNIG1ha2VzIG5vCisJIG1lbnRpb24gb2Ygc3VjaCBhbiB1bmRlcnNjb3JlLiAgUGVyaGFwcyBjZnJvbnQgdXNlcyBvbmUuICAqLworICAgICAgaWYgKCgqbWFuZ2xlZClbMl0gPT0gJ18nKQorCXsKKwkgICgqbWFuZ2xlZCkrKzsKKwl9CisgICAgICAoKm1hbmdsZWQpICs9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzAnOgorICAgIGRlZmF1bHQ6CisgICAgICBzdWNjZXNzID0gMDsKKyAgICB9CisKKyAgaWYgKCFzdWNjZXNzKQorICAgIHJldHVybiBzdWNjZXNzOworCisgIC8qIFBpY2sgb2ZmIHRoZSBuYW1lcyBhbmQgY29sbGVjdCB0aGVtIGluIHRoZSB0ZW1wIGJ1ZmZlciBpbiB0aGUgb3JkZXIKKyAgICAgaW4gd2hpY2ggdGhleSBhcmUgZm91bmQsIHNlcGFyYXRlZCBieSAnOjonLiAgKi8KKworICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKKyAgICB7CisgICAgICBpbnQgcmVtZW1iZXJfSyA9IDE7CisgICAgICBzdHJpbmdfY2xlYXIgKCZsYXN0X25hbWUpOworCisgICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ18nKQorCSgqbWFuZ2xlZCkrKzsKKworICAgICAgaWYgKCptYW5nbGVkWzBdID09ICd0JykKKwl7CisJICAvKiBIZXJlIHdlIGFsd2F5cyBhcHBlbmQgdG8gVEVNUCBzaW5jZSB3ZSB3aWxsIHdhbnQgdG8gdXNlCisJICAgICB0aGUgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFzIGEKKwkgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIFRoZSBhcHByb3ByaWF0ZQorCSAgICAgKHBhcmFtZXRlci1sZXNzKSB2YWx1ZSBpcyByZXR1cm5lZCBieSBkZW1hbmdsZV90ZW1wbGF0ZQorCSAgICAgaW4gTEFTVF9OQU1FLiAgV2UgZG8gbm90IHJlbWVtYmVyIHRoZSB0ZW1wbGF0ZSB0eXBlIGhlcmUsCisJICAgICBpbiBvcmRlciB0byBtYXRjaCB0aGUgRysrIG1hbmdsaW5nIGFsZ29yaXRobS4gICovCisJICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUod29yaywgbWFuZ2xlZCwgJnRlbXAsCisJCQkJICAgICAgJmxhc3RfbmFtZSwgMSwgMCk7CisJICBpZiAoIXN1Y2Nlc3MpCisJICAgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKCptYW5nbGVkWzBdID09ICdLJykKKwl7CisgICAgICAgICAgaW50IGlkeDsKKyAgICAgICAgICAoKm1hbmdsZWQpKys7CisgICAgICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKKyAgICAgICAgICBpZiAoaWR4ID09IC0xIHx8IGlkeCA+PSB3b3JrLT5udW1rKQorICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmstPmt0eXBldmVjW2lkeF0pOworICAgICAgICAgIHJlbWVtYmVyX0sgPSAwOworCisJICBpZiAoIXN1Y2Nlc3MpIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoRURHX0RFTUFOR0xJTkcpCisgICAgICAgICAgICB7CisJICAgICAgaW50IG5hbWVsZW5ndGg7CisgCSAgICAgIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgcXVhbGlmaWVyCisgCSAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGRlYWwgd2l0aCB0ZW1wbGF0ZXMgaW4KKyAJICAgICAgICogbWFuZ2xpbmcgc3R5bGVzIGxpa2UgRURHICovCisJICAgICAgbmFtZWxlbmd0aCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOworCSAgICAgIGlmIChuYW1lbGVuZ3RoID09IC0xKQorCQl7CisJCSAgc3VjY2VzcyA9IDA7CisJCSAgYnJlYWs7CisJCX0KKyAJICAgICAgcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgJnRlbXAsIG5hbWVsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZsYXN0X25hbWUpOworICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRzICgmdGVtcCwgJmxhc3RfbmFtZSk7CisgICAgICAgICAgICB9CisJfQorCisgICAgICBpZiAocmVtZW1iZXJfSykKKwlyZW1lbWJlcl9LdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCkpOworCisgICAgICBpZiAocXVhbGlmaWVycyA+IDApCisJc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOworICAgIH0KKworICByZW1lbWJlcl9CdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCksIGJpbmRleCk7CisKKyAgLyogSWYgd2UgYXJlIHVzaW5nIHRoZSByZXN1bHQgYXMgYSBmdW5jdGlvbiBuYW1lLCB3ZSBuZWVkIHRvIGFwcGVuZAorICAgICB0aGUgYXBwcm9wcmlhdGUgJzo6JyBzZXBhcmF0ZWQgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLgorICAgICBXZSBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgcGxhY2UsIHdoZXJlCisgICAgIHdlIGFscmVhZHkgaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUuICAqLworCisgIGlmIChpc2Z1bmNuYW1lKQorICAgIHsKKyAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKKyAgICAgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQorCXN0cmluZ19hcHBlbmQgKCZ0ZW1wLCAifiIpOworICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKKyAgICB9CisKKyAgLyogTm93IGVpdGhlciBwcmVwZW5kIHRoZSB0ZW1wIGJ1ZmZlciB0byB0aGUgcmVzdWx0LCBvciBhcHBlbmQgaXQsCisgICAgIGRlcGVuZGluZyB1cG9uIHRoZSBzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuICAqLworCisgIGlmIChhcHBlbmQpCisgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJnRlbXApOworICBlbHNlCisgICAgeworICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCisJc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOworICAgICAgc3RyaW5nX3ByZXBlbmRzIChyZXN1bHQsICZ0ZW1wKTsKKyAgICB9CisKKyAgc3RyaW5nX2RlbGV0ZSAoJmxhc3RfbmFtZSk7CisgIHN0cmluZ19kZWxldGUgKCZ0ZW1wKTsKKyAgcmV0dXJuIChzdWNjZXNzKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWdldF9jb3VudCAtLSBjb252ZXJ0IGFuIGFzY2lpIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMKKworU1lOT1BTSVMKKworCXN0YXRpYyBpbnQKKwlnZXRfY291bnQgKGNvbnN0IGNoYXIgKip0eXBlLCBpbnQgKmNvdW50KQorCitERVNDUklQVElPTgorCisJQXNzdW1lIHRoYXQgKnR5cGUgcG9pbnRzIGF0IGEgY291bnQgaW4gYSBtYW5nbGVkIG5hbWU7IHNldAorCSpjb3VudCB0byBpdHMgdmFsdWUsIGFuZCBzZXQgKnR5cGUgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyCisJdGhlIGNvdW50LiAgVGhlcmUgYXJlIHNvbWUgd2VpcmQgcnVsZXMgaW4gZWZmZWN0IGhlcmUuCisKKwlJZiAqdHlwZSBkb2VzIG5vdCBwb2ludCBhdCBhIHN0cmluZyBvZiBkaWdpdHMsIHJldHVybiB6ZXJvLgorCisJSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBmb2xsb3dlZCBieSBhbgorCXVuZGVyc2NvcmUsIHNldCAqY291bnQgdG8gdGhlaXIgdmFsdWUgYXMgYW4gaW50ZWdlciwgYWR2YW5jZQorCSp0eXBlIHRvIHBvaW50ICphZnRlciB0aGUgdW5kZXJzY29yZSwgYW5kIHJldHVybiAxLgorCisJSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBub3QgZm9sbG93ZWQgYnkgYW4KKwl1bmRlcnNjb3JlLCBjb25zdW1lIG9ubHkgdGhlIGZpcnN0IGRpZ2l0LiAgU2V0ICpjb3VudCB0byBpdHMKKwl2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBsZWF2ZSAqdHlwZSBwb2ludGluZyBhZnRlciB0aGF0IGRpZ2l0LAorCWFuZCByZXR1cm4gMS4KKworICAgICAgICBUaGUgZXhjdXNlIGZvciB0aGlzIG9kZCBiZWhhdmlvcjogaW4gdGhlIEFSTSBhbmQgSFAgZGVtYW5nbGluZworICAgICAgICBzdHlsZXMsIGEgdHlwZSBjYW4gYmUgZm9sbG93ZWQgYnkgYSByZXBlYXQgY291bnQgb2YgdGhlIGZvcm0KKyAgICAgICAgYE54eScsIHdoZXJlOgorCisgICAgICAgIGB4JyBpcyBhIHNpbmdsZSBkaWdpdCBzcGVjaWZ5aW5nIGhvdyBtYW55IGFkZGl0aW9uYWwgY29waWVzCisgICAgICAgICAgICBvZiB0aGUgdHlwZSB0byBhcHBlbmQgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZAorCisgICAgICAgIGB5JyBpcyBvbmUgb3IgbW9yZSBkaWdpdHMsIHNwZWNpZnlpbmcgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YKKyAgICAgICAgICAgIHRoZSBmaXJzdCByZXBlYXRlZCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIFllcywgYXMgeW91J3JlCisgICAgICAgICAgICB1bm1hbmdsaW5nIHRoZSBuYW1lIHlvdSBjYW4gZmlndXJlIHRoaXMgb3V0IHlvdXJzZWxmLCBidXQKKyAgICAgICAgICAgIGl0J3MgdGhlcmUgYW55d2F5LgorCisgICAgICAgIFNvLCBmb3IgZXhhbXBsZSwgaW4gYGJhcl9fM2Zvb0ZQaU41MScsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhCisgICAgICAgIHBvaW50ZXIgdG8gYW4gaW50ZWdlciAoYFBpJyksIGFuZCB0aGVuIHRoZSBuZXh0IGZpdmUgYXJndW1lbnRzCisgICAgICAgIGFyZSB0aGUgc2FtZSAoYE41JyksIGFuZCB0aGUgZmlyc3QgcmVwZWF0IGlzIHRoZSBmdW5jdGlvbidzCisgICAgICAgIHNlY29uZCBhcmd1bWVudCAoYDEnKS4KKyovCisKK3N0YXRpYyBpbnQKK2dldF9jb3VudCAodHlwZSwgY291bnQpCisgICAgIGNvbnN0IGNoYXIgKip0eXBlOworICAgICBpbnQgKmNvdW50OworeworICBjb25zdCBjaGFyICpwOworICBpbnQgbjsKKworICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCisgICAgeworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqY291bnQgPSAqKnR5cGUgLSAnMCc7CisgICAgICAoKnR5cGUpKys7CisgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKKwl7CisJICBwID0gKnR5cGU7CisJICBuID0gKmNvdW50OworCSAgZG8KKwkgICAgeworCSAgICAgIG4gKj0gMTA7CisJICAgICAgbiArPSAqcCAtICcwJzsKKwkgICAgICBwKys7CisJICAgIH0KKwkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqcCkpOworCSAgaWYgKCpwID09ICdfJykKKwkgICAgeworCSAgICAgICp0eXBlID0gcCArIDE7CisJICAgICAgKmNvdW50ID0gbjsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAoMSk7Cit9CisKKy8qIFJFU1VMVCB3aWxsIGJlIGluaXRpYWxpc2VkIGhlcmU7IGl0IHdpbGwgYmUgZnJlZWQgb24gZmFpbHVyZS4gIFRoZQorICAgdmFsdWUgcmV0dXJuZWQgaXMgcmVhbGx5IGEgdHlwZV9raW5kX3QuICAqLworCitzdGF0aWMgaW50Citkb190eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpyZXN1bHQ7Cit7CisgIGludCBuOworICBpbnQgZG9uZTsKKyAgaW50IHN1Y2Nlc3M7CisgIHN0cmluZyBkZWNsOworICBjb25zdCBjaGFyICpyZW1lbWJlcmVkX3R5cGU7CisgIGludCB0eXBlX3F1YWxzOworICBzdHJpbmcgYnR5cGU7CisgIHR5cGVfa2luZF90IHRrID0gdGtfbm9uZTsKKworICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKKyAgc3RyaW5nX2luaXQgKCZkZWNsKTsKKyAgc3RyaW5nX2luaXQgKHJlc3VsdCk7CisKKyAgZG9uZSA9IDA7CisgIHN1Y2Nlc3MgPSAxOworICB3aGlsZSAoc3VjY2VzcyAmJiAhZG9uZSkKKyAgICB7CisgICAgICBpbnQgbWVtYmVyOworICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCisJeworCisJICAvKiBBIHBvaW50ZXIgdHlwZSAqLworCWNhc2UgJ1AnOgorCWNhc2UgJ3AnOgorCSAgKCptYW5nbGVkKSsrOworCSAgaWYgKCEgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfSkFWQSkpCisJICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIioiKTsKKwkgIGlmICh0ayA9PSB0a19ub25lKQorCSAgICB0ayA9IHRrX3BvaW50ZXI7CisJICBicmVhazsKKworCSAgLyogQSByZWZlcmVuY2UgdHlwZSAqLworCWNhc2UgJ1InOgorCSAgKCptYW5nbGVkKSsrOworCSAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiJiIpOworCSAgaWYgKHRrID09IHRrX25vbmUpCisJICAgIHRrID0gdGtfcmVmZXJlbmNlOworCSAgYnJlYWs7CisKKwkgIC8qIEFuIGFycmF5ICovCisJY2FzZSAnQSc6CisJICB7CisJICAgICsrKCptYW5nbGVkKTsKKwkgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKQorCQkmJiAoZGVjbC5iWzBdID09ICcqJyB8fCBkZWNsLmJbMF0gPT0gJyYnKSkKKwkgICAgICB7CisJCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKKwkJc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7CisJICAgICAgfQorCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIlsiKTsKKwkgICAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCisJICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsICZkZWNsLAorCQkJCQkJICAgICAgdGtfaW50ZWdyYWwpOworCSAgICBpZiAoKiptYW5nbGVkID09ICdfJykKKwkgICAgICArKygqbWFuZ2xlZCk7CisJICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiXSIpOworCSAgICBicmVhazsKKwkgIH0KKworCS8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gdHlwZSAqLworCWNhc2UgJ1QnOgorCSAgKCptYW5nbGVkKSsrOworCSAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZuKSB8fCBuID49IHdvcmsgLT4gbnR5cGVzKQorCSAgICB7CisJICAgICAgc3VjY2VzcyA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJlbWVtYmVyZWRfdHlwZSA9IHdvcmsgLT4gdHlwZXZlY1tuXTsKKwkgICAgICBtYW5nbGVkID0gJnJlbWVtYmVyZWRfdHlwZTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwkgIC8qIEEgZnVuY3Rpb24gKi8KKwljYXNlICdGJzoKKwkgICgqbWFuZ2xlZCkrKzsKKwkgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKQorCQkmJiAoZGVjbC5iWzBdID09ICcqJyB8fCBkZWNsLmJbMF0gPT0gJyYnKSkKKwkgICAgeworCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKKwkgICAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKKwkgICAgfQorCSAgLyogQWZ0ZXIgcGlja2luZyBvZmYgdGhlIGZ1bmN0aW9uIGFyZ3MsIHdlIGV4cGVjdCB0byBlaXRoZXIgZmluZCB0aGUKKwkgICAgIGZ1bmN0aW9uIHJldHVybiB0eXBlIChwcmVjZWRlZCBieSBhbiAnXycpIG9yIHRoZSBlbmQgb2YgdGhlCisJICAgICBzdHJpbmcuICAqLworCSAgaWYgKCFkZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgJmRlY2wpCisJICAgICAgfHwgKCoqbWFuZ2xlZCAhPSAnXycgJiYgKiptYW5nbGVkICE9ICdcMCcpKQorCSAgICB7CisJICAgICAgc3VjY2VzcyA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChzdWNjZXNzICYmICgqKm1hbmdsZWQgPT0gJ18nKSkKKwkgICAgKCptYW5nbGVkKSsrOworCSAgYnJlYWs7CisKKwljYXNlICdNJzoKKwljYXNlICdPJzoKKwkgIHsKKwkgICAgdHlwZV9xdWFscyA9IFRZUEVfVU5RVUFMSUZJRUQ7CisKKwkgICAgbWVtYmVyID0gKiptYW5nbGVkID09ICdNJzsKKwkgICAgKCptYW5nbGVkKSsrOworCSAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkgJiYgKiptYW5nbGVkICE9ICd0JykKKwkgICAgICB7CisJCXN1Y2Nlc3MgPSAwOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7CisJICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7CisJICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQorCSAgICAgIHsKKwkJbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOworCQlpZiAobiA9PSAtMQorCQkgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCBuKQorCQkgIHsKKwkJICAgIHN1Y2Nlc3MgPSAwOworCQkgICAgYnJlYWs7CisJCSAgfQorCQlzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCAqbWFuZ2xlZCwgbik7CisJCSptYW5nbGVkICs9IG47CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlzdHJpbmcgdGVtcDsKKwkJc3RyaW5nX2luaXQgKCZ0ZW1wKTsKKwkJc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCwKKwkJCQkJICAgICBOVUxMLCAxLCAxKTsKKwkJaWYgKHN1Y2Nlc3MpCisJCSAgeworCQkgICAgc3RyaW5nX3ByZXBlbmRuICgmZGVjbCwgdGVtcC5iLCB0ZW1wLnAgLSB0ZW1wLmIpOworCQkgICAgc3RyaW5nX2NsZWFyICgmdGVtcCk7CisJCSAgfQorCQllbHNlCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7CisJICAgIGlmIChtZW1iZXIpCisJICAgICAgeworCQlzd2l0Y2ggKCoqbWFuZ2xlZCkKKwkJICB7CisJCSAgY2FzZSAnQyc6CisJCSAgY2FzZSAnVic6CisJCSAgY2FzZSAndSc6CisJCSAgICB0eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKKwkJICAgICgqbWFuZ2xlZCkrKzsKKwkJICAgIGJyZWFrOworCisJCSAgZGVmYXVsdDoKKwkJICAgIGJyZWFrOworCQkgIH0KKworCQlpZiAoKigqbWFuZ2xlZCkrKyAhPSAnRicpCisJCSAgeworCQkgICAgc3VjY2VzcyA9IDA7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgICBpZiAoKG1lbWJlciAmJiAhZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsICZkZWNsKSkKKwkJfHwgKiptYW5nbGVkICE9ICdfJykKKwkgICAgICB7CisJCXN1Y2Nlc3MgPSAwOworCQlicmVhazsKKwkgICAgICB9CisJICAgICgqbWFuZ2xlZCkrKzsKKwkgICAgaWYgKCEgUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQorCSAgICAgIHsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBpZiAodHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQorCSAgICAgIHsKKwkJQVBQRU5EX0JMQU5LICgmZGVjbCk7CisJCXN0cmluZ19hcHBlbmQgKCZkZWNsLCBxdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKSk7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgY2FzZSAnRyc6CisJICAoKm1hbmdsZWQpKys7CisJICBicmVhazsKKworCWNhc2UgJ0MnOgorCWNhc2UgJ1YnOgorCWNhc2UgJ3UnOgorCSAgaWYgKFBSSU5UX0FOU0lfUVVBTElGSUVSUykKKwkgICAgeworCSAgICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkpCisJCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIiAiKTsKKworCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgZGVtYW5nbGVfcXVhbGlmaWVyICgqKm1hbmdsZWQpKTsKKwkgICAgfQorCSAgKCptYW5nbGVkKSsrOworCSAgYnJlYWs7CisJICAvKgorCSAgICB9CisJICAgICovCisKKwkgIC8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJICBkb25lID0gMTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKHN1Y2Nlc3MpIHN3aXRjaCAoKiptYW5nbGVkKQorICAgIHsKKyAgICAgIC8qIEEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIk91dGVyOjpJbm5lciIuICAqLworICAgIGNhc2UgJ1EnOgorICAgIGNhc2UgJ0snOgorICAgICAgeworICAgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIDAsIDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIC8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gc3F1YW5nbGVkIHR5cGUgKi8KKyAgICBjYXNlICdCJzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmbikgfHwgbiA+PSB3b3JrIC0+IG51bWIpCisJc3VjY2VzcyA9IDA7CisgICAgICBlbHNlCisJc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT5idHlwZXZlY1tuXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1gnOgorICAgIGNhc2UgJ1knOgorICAgICAgLyogQSB0ZW1wbGF0ZSBwYXJtLiAgV2Ugc3Vic3RpdHV0ZSB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4gKi8KKyAgICAgIHsKKwlpbnQgaWR4OworCisJKCptYW5nbGVkKSsrOworCWlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7CisKKwlpZiAoaWR4ID09IC0xCisJICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKKwkgICAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKKwkgIHsKKwkgICAgc3VjY2VzcyA9IDA7CisJICAgIGJyZWFrOworCSAgfQorCisJaWYgKHdvcmstPnRtcGxfYXJndmVjKQorCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKKwllbHNlCisJICB7CisJICAgIGNoYXIgYnVmWzEwXTsKKwkgICAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOworCSAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGJ1Zik7CisJICB9CisKKwlzdWNjZXNzID0gMTsKKyAgICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOworICAgICAgaWYgKHRrID09IHRrX25vbmUpCisJdGsgPSAodHlwZV9raW5kX3QpIHN1Y2Nlc3M7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKHN1Y2Nlc3MpCisgICAgeworICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKKwl7CisJICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICIgIik7CisJICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmZGVjbCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHN0cmluZ19kZWxldGUgKHJlc3VsdCk7CisgIHN0cmluZ19kZWxldGUgKCZkZWNsKTsKKworICBpZiAoc3VjY2VzcykKKyAgICAvKiBBc3N1bWUgYW4gaW50ZWdyYWwgdHlwZSwgaWYgd2UncmUgbm90IHN1cmUuICAqLworICAgIHJldHVybiAoaW50KSAoKHRrID09IHRrX25vbmUpID8gdGtfaW50ZWdyYWwgOiB0ayk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogR2l2ZW4gYSBwb2ludGVyIHRvIGEgdHlwZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgZnVuZGFtZW50YWwgdHlwZQorICAgYXJndW1lbnQgKGludCwgbG9uZywgdW5zaWduZWQgaW50LCBldGMpIGluIFRZUEUsIGEgcG9pbnRlciB0byB0aGUKKyAgIHN0cmluZyBpbiB3aGljaCB0aGUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdCBpbiBSRVNVTFQsIGFuZAorICAgdGhlIFdPUksgc3RydWN0dXJlLCBkZWNvZGUgdGhlIHR5cGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgcmVzdWx0LgorCisgICBGb3IgZXhhbXBsZToKKworICAgCSJDaSIJPT4JImNvbnN0IGludCIKKwkiU2wiCT0+CSJzaWduZWQgbG9uZyIKKwkiQ1VzIgk9PgkiY29uc3QgdW5zaWduZWQgc2hvcnQiCisKKyAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7CisgICAgIHN0cmluZyAqcmVzdWx0OworeworICBpbnQgZG9uZSA9IDA7CisgIGludCBzdWNjZXNzID0gMTsKKyAgY2hhciBidWZbMTBdOworICBpbnQgZGVjID0gMDsKKyAgc3RyaW5nIGJ0eXBlOworICB0eXBlX2tpbmRfdCB0ayA9IHRrX2ludGVncmFsOworCisgIHN0cmluZ19pbml0ICgmYnR5cGUpOworCisgIC8qIEZpcnN0IHBpY2sgb2ZmIGFueSB0eXBlIHF1YWxpZmllcnMuICBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZS4gICovCisKKyAgd2hpbGUgKCFkb25lKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQorCXsKKwljYXNlICdDJzoKKwljYXNlICdWJzoKKwljYXNlICd1JzoKKwkgIGlmIChQUklOVF9BTlNJX1FVQUxJRklFUlMpCisJICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKHJlc3VsdCwgIiAiKTsKKwkgICAgICBzdHJpbmdfcHJlcGVuZCAocmVzdWx0LCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOworCSAgICB9CisJICAoKm1hbmdsZWQpKys7CisJICBicmVhazsKKwljYXNlICdVJzoKKwkgICgqbWFuZ2xlZCkrKzsKKwkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKwkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInVuc2lnbmVkIik7CisJICBicmVhazsKKwljYXNlICdTJzogLyogc2lnbmVkIGNoYXIgb25seSAqLworCSAgKCptYW5nbGVkKSsrOworCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOworCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAic2lnbmVkIik7CisJICBicmVhazsKKwljYXNlICdKJzoKKwkgICgqbWFuZ2xlZCkrKzsKKwkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKwkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIl9fY29tcGxleCIpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGRvbmUgPSAxOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBOb3cgcGljayBvZmYgdGhlIGZ1bmRhbWVudGFsIHR5cGUuICBUaGVyZSBjYW4gYmUgb25seSBvbmUuICAqLworCisgIHN3aXRjaCAoKiptYW5nbGVkKQorICAgIHsKKyAgICBjYXNlICdcMCc6CisgICAgY2FzZSAnXyc6CisgICAgICBicmVhazsKKyAgICBjYXNlICd2JzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInZvaWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3gnOgorICAgICAgKCptYW5nbGVkKSsrOworICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOworICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyBsb25nIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdsJzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgKCptYW5nbGVkKSsrOworICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOworICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiaW50Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInNob3J0Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImJvb2wiKTsKKyAgICAgIHRrID0gdGtfYm9vbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgICAgKCptYW5nbGVkKSsrOworICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOworICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiY2hhciIpOworICAgICAgdGsgPSB0a19jaGFyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6CisgICAgICAoKm1hbmdsZWQpKys7CisgICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7CisgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ3Y2hhcl90Iik7CisgICAgICB0ayA9IHRrX2NoYXI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdyJzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmcgZG91YmxlIik7CisgICAgICB0ayA9IHRrX3JlYWw7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImRvdWJsZSIpOworICAgICAgdGsgPSB0a19yZWFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICAoKm1hbmdsZWQpKys7CisgICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7CisgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJmbG9hdCIpOworICAgICAgdGsgPSB0a19yZWFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRyc6CisgICAgICAoKm1hbmdsZWQpKys7CisgICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCisJeworCSAgc3VjY2VzcyA9IDA7CisJICBicmVhazsKKwl9CisgICAgY2FzZSAnSSc6CisgICAgICArKygqbWFuZ2xlZCk7CisgICAgICBpZiAoKiptYW5nbGVkID09ICdfJykKKwl7CisJICBpbnQgaTsKKwkgICsrKCptYW5nbGVkKTsKKwkgIGZvciAoaSA9IDA7CisJICAgICAgIChpIDwgc2l6ZW9mIChidWYpIC0gMSAmJiAqKm1hbmdsZWQgJiYgKiptYW5nbGVkICE9ICdfJyk7CisJICAgICAgICsrKCptYW5nbGVkKSwgKytpKQorCSAgICBidWZbaV0gPSAqKm1hbmdsZWQ7CisJICBpZiAoKiptYW5nbGVkICE9ICdfJykKKwkgICAgeworCSAgICAgIHN1Y2Nlc3MgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBidWZbaV0gPSAnXDAnOworCSAgKysoKm1hbmdsZWQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzdHJuY3B5IChidWYsICptYW5nbGVkLCAyKTsKKwkgIGJ1ZlsyXSA9ICdcMCc7CisJICAqbWFuZ2xlZCArPSAyOworCX0KKyAgICAgIHNzY2FuZiAoYnVmLCAiJXgiLCAmZGVjKTsKKyAgICAgIHNwcmludGYgKGJ1ZiwgImludCVpX3QiLCBkZWMpOworICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOworICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCBidWYpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgLyogQW4gZXhwbGljaXQgdHlwZSwgc3VjaCBhcyAiNm15dHlwZSIgb3IgIjdpbnRlZ2VyIiAqLworICAgIGNhc2UgJzAnOgorICAgIGNhc2UgJzEnOgorICAgIGNhc2UgJzInOgorICAgIGNhc2UgJzMnOgorICAgIGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOgorICAgIGNhc2UgJzYnOgorICAgIGNhc2UgJzcnOgorICAgIGNhc2UgJzgnOgorICAgIGNhc2UgJzknOgorICAgICAgeworICAgICAgICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOworICAgICAgICBzdHJpbmcgYnR5cGU7CisgICAgICAgIHN0cmluZ19pbml0ICgmYnR5cGUpOworICAgICAgICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlKSkgeworICAgICAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBidHlwZS5iLCBMRU5fU1RSSU5HICgmYnR5cGUpLCBiaW5kZXgpOworICAgICAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKKyAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmYnR5cGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdWNjZXNzID0gMDsKKyAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJmJ0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAndCc6CisgICAgICB7CisgICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlLCAwLCAxLCAxKTsKKyAgICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmJ0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBzdWNjZXNzID8gKChpbnQpIHRrKSA6IDA7Cit9CisKKworLyogSGFuZGxlIGEgdGVtcGxhdGUncyB2YWx1ZSBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQorICAgKiptYW5nbGVkIHBvaW50cyB0byAnUycgb3IgJ1UnICovCisKK3N0YXRpYyBpbnQKK2RvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpyZXN1bHQ7Cit7CisgIGludCB1bnNpZ25lZF9jb25zdDsKKworICBpZiAoKiptYW5nbGVkICE9ICdVJyAmJiAqKm1hbmdsZWQgIT0gJ1MnKQorICAgIHJldHVybiAwOworCisgIHVuc2lnbmVkX2NvbnN0ID0gKCoqbWFuZ2xlZCA9PSAnVScpOworCisgICgqbWFuZ2xlZCkrKzsKKworICBzd2l0Y2ggKCoqbWFuZ2xlZCkKKyAgICB7CisgICAgICBjYXNlICdOJzoKKyAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLSIpOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgJ1AnOgorICAgICAgICAoKm1hbmdsZWQpKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTSc6CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgLTJeMzEgKi8KKyAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLTIxNDc0ODM2NDgiKTsKKyAgICAgICAgKCptYW5nbGVkKSsrOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBXZSBoYXZlIHRvIGJlIGxvb2tpbmcgYXQgYW4gaW50ZWdlciBub3cgKi8KKyAgaWYgKCEoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogV2Ugb25seSBkZWFsIHdpdGggaW50ZWdyYWwgdmFsdWVzIGZvciB0ZW1wbGF0ZQorICAgICBwYXJhbWV0ZXJzIC0tIHNvIGl0J3MgT0sgdG8gbG9vayBvbmx5IGZvciBkaWdpdHMgKi8KKyAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCisgICAgeworICAgICAgY2hhcl9zdHJbMF0gPSAqKm1hbmdsZWQ7CisgICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGNoYXJfc3RyKTsKKyAgICAgICgqbWFuZ2xlZCkrKzsKKyAgICB9CisKKyAgaWYgKHVuc2lnbmVkX2NvbnN0KQorICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIlUiKTsKKworICAvKiBGSVhNRT8gU29tZSBkYXkgd2UgbWF5IGhhdmUgNjQtYml0IChvciBsYXJnZXIgOi0pICkgY29uc3RhbnRzCisgICAgIHdpdGggTCBvciBMTCBzdWZmaXhlcy4gcGFpLzE5OTctMDktMDMgKi8KKworICByZXR1cm4gMTsgLyogc3VjY2VzcyAqLworfQorCisvKiBIYW5kbGUgYSB0ZW1wbGF0ZSdzIGxpdGVyYWwgcGFyYW1ldGVyIGZvciBIUCBhQ0MgKGV4dGVuc2lvbiBmcm9tIEFSTSkKKyAgICoqbWFuZ2xlZCBpcyBwb2ludGluZyB0byB0aGUgJ0EnICovCisKK3N0YXRpYyBpbnQKK2RvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcgKnJlc3VsdDsKK3sKKyAgaW50IGxpdGVyYWxfbGVuID0gMDsKKyAgY2hhciAqIHJlY3Vyc2U7CisgIGNoYXIgKiByZWN1cnNlX2RlbTsKKworICBpZiAoKiptYW5nbGVkICE9ICdBJykKKyAgICByZXR1cm4gMDsKKworICAoKm1hbmdsZWQpKys7CisKKyAgbGl0ZXJhbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKKworICBpZiAobGl0ZXJhbF9sZW4gPD0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBMaXRlcmFsIHBhcmFtZXRlcnMgYXJlIG5hbWVzIG9mIGFycmF5cywgZnVuY3Rpb25zLCBldGMuICBhbmQgdGhlCisgICAgIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzIHRoZSBhZGRyZXNzIG9wZXJhdG9yICovCisgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIiYiKTsKKworICAvKiBOb3cgcmVjdXJzaXZlbHkgZGVtYW5nbGUgdGhlIGxpdGVyYWwgbmFtZSAqLworICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobGl0ZXJhbF9sZW4gKyAxKTsKKyAgbWVtY3B5IChyZWN1cnNlLCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOworICByZWN1cnNlW2xpdGVyYWxfbGVuXSA9ICdcMDAwJzsKKworICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKKworICBpZiAocmVjdXJzZV9kZW0pCisgICAgeworICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7CisgICAgICBmcmVlIChyZWN1cnNlX2RlbSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIGxpdGVyYWxfbGVuKTsKKyAgICB9CisgICgqbWFuZ2xlZCkgKz0gbGl0ZXJhbF9sZW47CisgIGZyZWUgKHJlY3Vyc2UpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitzbmFyZl9udW1lcmljX2xpdGVyYWwgKGFyZ3MsIGFyZykKKyAgICAgY29uc3QgY2hhciAqKiBhcmdzOworICAgICBzdHJpbmcgKiBhcmc7Cit7CisgIGlmICgqKmFyZ3MgPT0gJy0nKQorICAgIHsKKyAgICAgIGNoYXJfc3RyWzBdID0gJy0nOworICAgICAgc3RyaW5nX2FwcGVuZCAoYXJnLCBjaGFyX3N0cik7CisgICAgICAoKmFyZ3MpKys7CisgICAgfQorICBlbHNlIGlmICgqKmFyZ3MgPT0gJysnKQorICAgICgqYXJncykrKzsKKworICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCisgICAgcmV0dXJuIDA7CisKKyAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCisgICAgeworICAgICAgY2hhcl9zdHJbMF0gPSAqKmFyZ3M7CisgICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKKyAgICAgICgqYXJncykrKzsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIERlbWFuZ2xlIHRoZSBuZXh0IGFyZ3VtZW50LCBnaXZlbiBieSBNQU5HTEVEIGludG8gUkVTVUxULCB3aGljaAorICAgKnNob3VsZCBiZSBhbiB1bmluaXRpYWxpemVkKiBzdHJpbmcuICBJdCB3aWxsIGJlIGluaXRpYWxpemVkIGhlcmUsCisgICBhbmQgZnJlZSdkIHNob3VsZCBhbnl0aGluZyBnbyB3cm9uZy4gICovCisKK3N0YXRpYyBpbnQKK2RvX2FyZyAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7CisgICAgIHN0cmluZyAqcmVzdWx0OworeworICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkIHNvIHRoYXQgd2UgY2FuIHJlY29yZCB0aGUgdHlwZSwgZm9yCisgICAgIG5vbi1zcXVhbmdsaW5nIHR5cGUgcmVtZW1iZXJpbmcuICAqLworICBjb25zdCBjaGFyICpzdGFydCA9ICptYW5nbGVkOworCisgIHN0cmluZ19pbml0IChyZXN1bHQpOworCisgIGlmICh3b3JrLT5ucmVwZWF0cyA+IDApCisgICAgeworICAgICAgLS13b3JrLT5ucmVwZWF0czsKKworICAgICAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID09IDApCisJcmV0dXJuIDA7CisKKyAgICAgIC8qIFdlIHdhbnQgdG8gcmVpc3N1ZSB0aGUgcHJldmlvdXMgdHlwZSBpbiB0aGlzIGFyZ3VtZW50IGxpc3QuICAqLworICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmICgqKm1hbmdsZWQgPT0gJ24nKQorICAgIHsKKyAgICAgIC8qIEEgc3F1YW5nbGluZy1zdHlsZSByZXBlYXQuICAqLworICAgICAgKCptYW5nbGVkKSsrOworICAgICAgd29yay0+bnJlcGVhdHMgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOworCisgICAgICBpZiAod29yay0+bnJlcGVhdHMgPD0gMCkKKwkvKiBUaGlzIHdhcyBub3QgYSByZXBlYXQgY291bnQgYWZ0ZXIgYWxsLiAgKi8KKwlyZXR1cm4gMDsKKworICAgICAgaWYgKHdvcmstPm5yZXBlYXRzID4gOSkKKwl7CisJICBpZiAoKiptYW5nbGVkICE9ICdfJykKKwkgICAgLyogVGhlIHJlcGVhdCBjb3VudCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gJ18nIGluIHRoaXMKKwkgICAgICAgY2FzZS4gICovCisJICAgIHJldHVybiAwOworCSAgZWxzZQorCSAgICAoKm1hbmdsZWQpKys7CisJfQorCisgICAgICAvKiBOb3csIHRoZSByZXBlYXQgaXMgYWxsIHNldCB1cC4gICovCisgICAgICByZXR1cm4gZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOworICAgIH0KKworICAvKiBTYXZlIHRoZSByZXN1bHQgaW4gV09SSy0+cHJldmlvdXNfYXJndW1lbnQgc28gdGhhdCB3ZSBjYW4gZmluZCBpdAorICAgICBpZiBpdCdzIHJlcGVhdGVkLiAgTm90ZSB0aGF0IHNhdmluZyBTVEFSVCBpcyBub3QgZ29vZCBlbm91Z2g6IHdlCisgICAgIGRvIG5vdCB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIHR5cGVzIHRvIHRoZSBiYWNrLXJlZmVyZW5jZWFibGUKKyAgICAgdHlwZSB2ZWN0b3Igd2hlbiBwcm9jZXNzaW5nIGEgcmVwZWF0ZWQgdHlwZS4gICovCisgIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKKyAgICBzdHJpbmdfY2xlYXIgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gKHN0cmluZyopIHhtYWxsb2MgKHNpemVvZiAoc3RyaW5nKSk7CisgICAgICBzdHJpbmdfaW5pdCAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOworICAgIH0KKworICBpZiAoIWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KSkKKyAgICByZXR1cm4gMDsKKworICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7CisKKyAgcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsICptYW5nbGVkIC0gc3RhcnQpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3JlbWVtYmVyX3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICpzdGFydDsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciAqdGVtOworCisgIGlmICh3b3JrLT5mb3JnZXR0aW5nX3R5cGVzKQorICAgIHJldHVybjsKKworICBpZiAod29yayAtPiBudHlwZXMgPj0gd29yayAtPiB0eXBldmVjX3NpemUpCisgICAgeworICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY19zaXplID09IDApCisJeworCSAgd29yayAtPiB0eXBldmVjX3NpemUgPSAzOworCSAgd29yayAtPiB0eXBldmVjCisJICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgd29yayAtPiB0eXBldmVjX3NpemUgKj0gMjsKKwkgIHdvcmsgLT4gdHlwZXZlYworCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IHR5cGV2ZWMsCisJCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSk7CisJfQorICAgIH0KKyAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7CisgIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKKyAgdGVtW2xlbl0gPSAnXDAnOworICB3b3JrIC0+IHR5cGV2ZWNbd29yayAtPiBudHlwZXMrK10gPSB0ZW07Cit9CisKKworLyogUmVtZW1iZXIgYSBLIHR5cGUgY2xhc3MgcXVhbGlmaWVyLiAqLworc3RhdGljIHZvaWQKK3JlbWVtYmVyX0t0eXBlICh3b3JrLCBzdGFydCwgbGVuKQorICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKKyAgICAgY29uc3QgY2hhciAqc3RhcnQ7CisgICAgIGludCBsZW47Cit7CisgIGNoYXIgKnRlbTsKKworICBpZiAod29yayAtPiBudW1rID49IHdvcmsgLT4ga3NpemUpCisgICAgeworICAgICAgaWYgKHdvcmsgLT4ga3NpemUgPT0gMCkKKwl7CisJICB3b3JrIC0+IGtzaXplID0gNTsKKwkgIHdvcmsgLT4ga3R5cGV2ZWMKKwkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHdvcmsgLT4ga3NpemUgKj0gMjsKKwkgIHdvcmsgLT4ga3R5cGV2ZWMKKwkgICAgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopd29yayAtPiBrdHlwZXZlYywKKwkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4ga3NpemUpOworCX0KKyAgICB9CisgIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOworICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7CisgIHRlbVtsZW5dID0gJ1wwJzsKKyAgd29yayAtPiBrdHlwZXZlY1t3b3JrIC0+IG51bWsrK10gPSB0ZW07Cit9CisKKy8qIFJlZ2lzdGVyIGEgQiBjb2RlLCBhbmQgZ2V0IGFuIGluZGV4IGZvciBpdC4gQiBjb2RlcyBhcmUgcmVnaXN0ZXJlZAorICAgYXMgdGhleSBhcmUgc2VlbiwgcmF0aGVyIHRoYW4gYXMgdGhleSBhcmUgY29tcGxldGVkLCBzbyBtYXA8dGVtcDxjaGFyPiA+CisgICByZWdpc3RlcnMgbWFwPHRlbXA8Y2hhcj4gPiBhcyBCMCwgYW5kIHRlbXA8Y2hhcj4gYXMgQjEgKi8KKworc3RhdGljIGludAorcmVnaXN0ZXJfQnR5cGUgKHdvcmspCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworeworICBpbnQgcmV0OworCisgIGlmICh3b3JrIC0+IG51bWIgPj0gd29yayAtPiBic2l6ZSkKKyAgICB7CisgICAgICBpZiAod29yayAtPiBic2l6ZSA9PSAwKQorCXsKKwkgIHdvcmsgLT4gYnNpemUgPSA1OworCSAgd29yayAtPiBidHlwZXZlYworCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgd29yayAtPiBic2l6ZSAqPSAyOworCSAgd29yayAtPiBidHlwZXZlYworCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGJ0eXBldmVjLAorCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBic2l6ZSk7CisJfQorICAgIH0KKyAgcmV0ID0gd29yayAtPiBudW1iKys7CisgIHdvcmsgLT4gYnR5cGV2ZWNbcmV0XSA9IE5VTEw7CisgIHJldHVybihyZXQpOworfQorCisvKiBTdG9yZSBhIHZhbHVlIGludG8gYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgQiBjb2RlIHR5cGUuICovCisKK3N0YXRpYyB2b2lkCityZW1lbWJlcl9CdHlwZSAod29yaywgc3RhcnQsIGxlbiwgaW5kZXgpCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICpzdGFydDsKKyAgICAgaW50IGxlbiwgaW5kZXg7Cit7CisgIGNoYXIgKnRlbTsKKworICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOworICB0ZW1bbGVuXSA9ICdcMCc7CisgIHdvcmsgLT4gYnR5cGV2ZWNbaW5kZXhdID0gdGVtOworfQorCisvKiBMb3NlIGFsbCB0aGUgaW5mbyByZWxhdGVkIHRvIEIgYW5kIEsgdHlwZSBjb2Rlcy4gKi8KK3N0YXRpYyB2b2lkCitmb3JnZXRfQl9hbmRfS190eXBlcyAod29yaykKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Cit7CisgIGludCBpOworCisgIHdoaWxlICh3b3JrIC0+IG51bWsgPiAwKQorICAgIHsKKyAgICAgIGkgPSAtLSh3b3JrIC0+IG51bWspOworICAgICAgaWYgKHdvcmsgLT4ga3R5cGV2ZWNbaV0gIT0gTlVMTCkKKwl7CisJICBmcmVlICh3b3JrIC0+IGt0eXBldmVjW2ldKTsKKwkgIHdvcmsgLT4ga3R5cGV2ZWNbaV0gPSBOVUxMOworCX0KKyAgICB9CisKKyAgd2hpbGUgKHdvcmsgLT4gbnVtYiA+IDApCisgICAgeworICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtYik7CisgICAgICBpZiAod29yayAtPiBidHlwZXZlY1tpXSAhPSBOVUxMKQorCXsKKwkgIGZyZWUgKHdvcmsgLT4gYnR5cGV2ZWNbaV0pOworCSAgd29yayAtPiBidHlwZXZlY1tpXSA9IE5VTEw7CisJfQorICAgIH0KK30KKy8qIEZvcmdldCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgYnV0IG5vdCB0aGUgdHlwZSB2ZWN0b3IgaXRzZWxmLiAgKi8KKworc3RhdGljIHZvaWQKK2ZvcmdldF90eXBlcyAod29yaykKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Cit7CisgIGludCBpOworCisgIHdoaWxlICh3b3JrIC0+IG50eXBlcyA+IDApCisgICAgeworICAgICAgaSA9IC0tKHdvcmsgLT4gbnR5cGVzKTsKKyAgICAgIGlmICh3b3JrIC0+IHR5cGV2ZWNbaV0gIT0gTlVMTCkKKwl7CisJICBmcmVlICh3b3JrIC0+IHR5cGV2ZWNbaV0pOworCSAgd29yayAtPiB0eXBldmVjW2ldID0gTlVMTDsKKwl9CisgICAgfQorfQorCisvKiBQcm9jZXNzIHRoZSBhcmd1bWVudCBsaXN0IHBhcnQgb2YgdGhlIHNpZ25hdHVyZSwgYWZ0ZXIgYW55IGNsYXNzIHNwZWMKKyAgIGhhcyBiZWVuIGNvbnN1bWVkLCBhcyB3ZWxsIGFzIHRoZSBmaXJzdCAnRicgY2hhcmFjdGVyIChpZiBhbnkpLiAgRm9yCisgICBleGFtcGxlOgorCisgICAiX19hbHNfXzNmb29SVDAiCQk9Pglwcm9jZXNzICJSVDAiCisgICAiY29tcGxleGZ1bmM1X19GUEZQY19QRmxfaSIJPT4JcHJvY2VzcyAiUEZQY19QRmxfaSIKKworICAgREVDTFAgbXVzdCBiZSBhbHJlYWR5IGluaXRpYWxpc2VkLCB1c3VhbGx5IG5vbi1lbXB0eS4gIEl0IHdvbid0IGJlIGZyZWVkCisgICBvbiBmYWlsdXJlLgorCisgICBOb3RlIHRoYXQgZysrIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIEFSTSBhbmQgbHVjaWQgc3R5bGUgbWFuZ2xpbmcKKyAgIHdpdGggcmVnYXJkcyB0byByZWZlcmVuY2VzIHRvIHByZXZpb3VzbHkgc2VlbiB0eXBlcy4gIEZvciBleGFtcGxlLCBnaXZlbgorICAgdGhlIHNvdXJjZSBmcmFnbWVudDoKKworICAgICBjbGFzcyBmb28geworICAgICAgIHB1YmxpYzoKKyAgICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYyk7CisgICAgIH07CisKKyAgICAgZm9vOjpmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9CisgICAgIHZvaWQgZm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKSB7IGlhID0gaWIgPSBpYzsgfQorCisgICBnKysgcHJvZHVjZXMgdGhlIG5hbWVzOgorCisgICAgIF9fM2Zvb2lSVDBpVDJpVDIKKyAgICAgZm9vX19GaVIzZm9vaVQxaVQxCisKKyAgIHdoaWxlIGxjYyAoYW5kIHByZXN1bWFibHkgb3RoZXIgQVJNIHN0eWxlIGNvbXBpbGVycyBhcyB3ZWxsKSBwcm9kdWNlczoKKworICAgICBmb29fX0ZpUjNmb29UMVQyVDFUMgorICAgICBfX2N0X18zZm9vRmlSM2Zvb1QxVDJUMVQyCisKKyAgIE5vdGUgdGhhdCBnKysgYmFzZXMgaXRzIHR5cGUgbnVtYmVycyBzdGFydGluZyBhdCB6ZXJvIGFuZCBjb3VudHMgYWxsCisgICBwcmV2aW91c2x5IHNlZW4gdHlwZXMsIHdoaWxlIGx1Y2lkL0FSTSBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nCisgICBhdCBvbmUgYW5kIG9ubHkgY29uc2lkZXJzIHR5cGVzIGFmdGVyIGl0IGhhcyBzZWVuIHRoZSAnRicgY2hhcmFjdGVyCisgICBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJncy4gIEZvciBsdWNpZC9BUk0gc3R5bGUsIHdlCisgICBhY2NvdW50IGZvciB0aGlzIGRpZmZlcmVuY2UgYnkgZGlzY2FyZGluZyBhbnkgcHJldmlvdXNseSBzZWVuIHR5cGVzIHdoZW4KKyAgIHdlIHNlZSB0aGUgJ0YnIGNoYXJhY3RlciwgYW5kIHN1YnRyYWN0aW5nIG9uZSBmcm9tIHRoZSB0eXBlIG51bWJlcgorICAgcmVmZXJlbmNlLgorCisgKi8KKworc3RhdGljIGludAorZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpkZWNscDsKK3sKKyAgc3RyaW5nIGFyZzsKKyAgaW50IG5lZWRfY29tbWEgPSAwOworICBpbnQgcjsKKyAgaW50IHQ7CisgIGNvbnN0IGNoYXIgKnRlbTsKKyAgY2hhciB0ZW1wdHlwZTsKKworICBpZiAoUFJJTlRfQVJHX1RZUEVTKQorICAgIHsKKyAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKCIpOworICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXDAnKQorCXsKKwkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAidm9pZCIpOworCX0KKyAgICB9CisKKyAgd2hpbGUgKCgqKm1hbmdsZWQgIT0gJ18nICYmICoqbWFuZ2xlZCAhPSAnXDAnICYmICoqbWFuZ2xlZCAhPSAnZScpCisJIHx8IHdvcmstPm5yZXBlYXRzID4gMCkKKyAgICB7CisgICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnTicpIHx8ICgqKm1hbmdsZWQgPT0gJ1QnKSkKKwl7CisJICB0ZW1wdHlwZSA9ICooKm1hbmdsZWQpKys7CisKKwkgIGlmICh0ZW1wdHlwZSA9PSAnTicpCisJICAgIHsKKwkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQorCQl7CisJCSAgcmV0dXJuICgwKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICByID0gMTsKKwkgICAgfQorICAgICAgICAgIGlmICgoSFBfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgd29yayAtPiBudHlwZXMgPj0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgMTAgb3IgbW9yZSB0eXBlcyB3ZSBtaWdodCBoYXZlIG1vcmUgdGhhbiBhIDEgZGlnaXQKKyAgICAgICAgICAgICAgICAgaW5kZXggc28gd2UnbGwgaGF2ZSB0byBjb25zdW1lIHRoZSB3aG9sZSBjb3VudCBoZXJlLiBUaGlzCisgICAgICAgICAgICAgICAgIHdpbGwgbG9zZSBpZiB0aGUgbmV4dCB0aGluZyBpcyBhIHR5cGUgbmFtZSBwcmVjZWRlZCBieSBhCisgICAgICAgICAgICAgICAgIGNvdW50IGJ1dCBpdCdzIGltcG9zc2libGUgdG8gZGVtYW5nbGUgdGhhdCBjYXNlIHByb3Blcmx5CisgICAgICAgICAgICAgICAgIGFueXdheS4gRWcgaWYgd2UgYWxyZWFkeSBoYXZlIDEyIHR5cGVzIGlzIFQxMlBjICIoLi4uLCB0eXBlMSwKKyAgICAgICAgICAgICAgICAgUGMsIC4uLikiICBvciAiKC4uLiwgdHlwZTEyLCBjaGFyICosIC4uLikiICovCisgICAgICAgICAgICAgIGlmICgodCA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCkpIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZ0KSkKKwkgICAgCXsKKwkgICAgICAgICAgcmV0dXJuICgwKTsKKwkgICAgCX0KKwkgICAgfQorCSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKKwkgICAgeworCSAgICAgIHQtLTsKKwkgICAgfQorCSAgLyogVmFsaWRhdGUgdGhlIHR5cGUgaW5kZXguICBQcm90ZWN0IGFnYWluc3QgaWxsZWdhbCBpbmRpY2VzIGZyb20KKwkgICAgIG1hbGZvcm1lZCB0eXBlIHN0cmluZ3MuICAqLworCSAgaWYgKCh0IDwgMCkgfHwgKHQgPj0gd29yayAtPiBudHlwZXMpKQorCSAgICB7CisJICAgICAgcmV0dXJuICgwKTsKKwkgICAgfQorCSAgd2hpbGUgKHdvcmstPm5yZXBlYXRzID4gMCB8fCAtLXIgPj0gMCkKKwkgICAgeworCSAgICAgIHRlbSA9IHdvcmsgLT4gdHlwZXZlY1t0XTsKKwkgICAgICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCisJCXsKKwkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwgIik7CisJCX0KKwkgICAgICBpZiAoIWRvX2FyZyAod29yaywgJnRlbSwgJmFyZykpCisJCXsKKwkJICByZXR1cm4gKDApOworCQl9CisJICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKKwkJeworCQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7CisJCX0KKwkgICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKKwkgICAgICBuZWVkX2NvbW1hID0gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCisJICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKKwkgIGlmICghZG9fYXJnICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKKwkgICAgcmV0dXJuICgwKTsKKwkgIGlmIChQUklOVF9BUkdfVFlQRVMpCisJICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7CisJICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKKwkgIG5lZWRfY29tbWEgPSAxOworCX0KKyAgICB9CisKKyAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpCisgICAgeworICAgICAgKCptYW5nbGVkKSsrOworICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKKwl7CisJICBpZiAobmVlZF9jb21tYSkKKwkgICAgeworCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOworCSAgICB9CisJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIi4uLiIpOworCX0KKyAgICB9CisKKyAgaWYgKFBSSU5UX0FSR19UWVBFUykKKyAgICB7CisgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIikiKTsKKyAgICB9CisgIHJldHVybiAoMSk7Cit9CisKKy8qIExpa2UgZGVtYW5nbGVfYXJncywgYnV0IGZvciBkZW1hbmdsaW5nIHRoZSBhcmd1bWVudCBsaXN0cyBvZiBmdW5jdGlvbgorICAgYW5kIG1ldGhvZCBwb2ludGVycyBvciByZWZlcmVuY2VzLCBub3QgdG9wLWxldmVsIGRlY2xhcmF0aW9ucy4gICovCisKK3N0YXRpYyBpbnQKK2RlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKKyAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7CisgICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOworICAgICBzdHJpbmcgKmRlY2xwOworeworICBzdHJpbmcqIHNhdmVkX3ByZXZpb3VzX2FyZ3VtZW50OworICBpbnQgcmVzdWx0OworICBpbnQgc2F2ZWRfbnJlcGVhdHM7CisKKyAgLyogVGhlIEcrKyBuYW1lLW1hbmdsaW5nIGFsZ29yaXRobSBkb2VzIG5vdCByZW1lbWJlciB0eXBlcyBvbiBuZXN0ZWQKKyAgICAgYXJndW1lbnQgbGlzdHMsIHVubGVzcyAtZnNxdWFuZ2xpbmcgaXMgdXNlZCwgYW5kIGluIHRoYXQgY2FzZSB0aGUKKyAgICAgdHlwZSB2ZWN0b3IgdXBkYXRlZCBieSByZW1lbWJlcl90eXBlIGlzIG5vdCB1c2VkLiAgU28sIHdlIHR1cm4KKyAgICAgb2ZmIHJlbWVtYmVyaW5nIG9mIHR5cGVzIGhlcmUuICAqLworICArK3dvcmstPmZvcmdldHRpbmdfdHlwZXM7CisKKyAgLyogRm9yIHRoZSByZXBlYXQgY29kZXMgdXNlZCB3aXRoIC1mc3F1YW5nbGluZywgd2UgbXVzdCBrZWVwIHRyYWNrIG9mCisgICAgIHRoZSBsYXN0IGFyZ3VtZW50LiAgKi8KKyAgc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQgPSB3b3JrLT5wcmV2aW91c19hcmd1bWVudDsKKyAgc2F2ZWRfbnJlcGVhdHMgPSB3b3JrLT5ucmVwZWF0czsKKyAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAwOworICB3b3JrLT5ucmVwZWF0cyA9IDA7CisKKyAgLyogQWN0dWFsbHkgZGVtYW5nbGUgdGhlIGFyZ3VtZW50cy4gICovCisgIHJlc3VsdCA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKKworICAvKiBSZXN0b3JlIHRoZSBwcmV2aW91c19hcmd1bWVudCBmaWVsZC4gICovCisgIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKKyAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7CisgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7CisgIC0td29yay0+Zm9yZ2V0dGluZ190eXBlczsKKyAgd29yay0+bnJlcGVhdHMgPSBzYXZlZF9ucmVwZWF0czsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pCisgICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOworICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKKyAgICAgc3RyaW5nICpkZWNscDsKKyAgICAgY29uc3QgY2hhciAqc2NhbjsKK3sKKyAgc2l6ZV90IGk7CisgIHN0cmluZyB0eXBlOworICBjb25zdCBjaGFyICp0ZW07CisKKyAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAoKm1hbmdsZWQpLCBzY2FuIC0gKCptYW5nbGVkKSk7CisgIHN0cmluZ19uZWVkIChkZWNscCwgMSk7CisgICooZGVjbHAgLT4gcCkgPSAnXDAnOworCisgIC8qIENvbnN1bWUgdGhlIGZ1bmN0aW9uIG5hbWUsIGluY2x1ZGluZyB0aGUgIl9fIiBzZXBhcmF0aW5nIHRoZSBuYW1lCisgICAgIGZyb20gdGhlIHNpZ25hdHVyZS4gIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgU0NBTiBwb2ludHMgdG8gdGhlCisgICAgIHNlcGFyYXRvci4gICovCisKKyAgKCptYW5nbGVkKSA9IHNjYW4gKyAyOworICAvKiBXZSBtYXkgYmUgbG9va2luZyBhdCBhbiBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgZnVuY3Rpb246CisgICAgIGZvb19fWHQxdDJfRnQzdDQsIHdoZXJlIHQxLCB0MiwgLi4uIGFyZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIGEKKyAgICAgZm9sbG93aW5nIF9GIG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSGFuZGxlCisgICAgIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgZmlyc3QuICovCisKKyAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCoqbWFuZ2xlZCA9PSAnWCcpKQorICAgIHsKKyAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgMCwgZGVjbHApOworICAgICAgLyogVGhpcyBsZWF2ZXMgTUFOR0xFRCBwb2ludGluZyB0byB0aGUgJ0YnIG1hcmtpbmcgZnVuYyBhcmdzICovCisgICAgfQorCisgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCisgICAgeworCisgICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBBUk0gc3R5bGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBvcGVyYXRvci4KKwkgSWYgc28sIHRoZW4ganVzdCByZWNvcmQgaXQsIGNsZWFyIHRoZSBkZWNsLCBhbmQgcmV0dXJuLgorCSBXZSBjYW4ndCBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZGVjbCB1bnRpbCBsYXRlciwKKwkgd2hlbiB3ZSByZWNvdmVyIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIHNpZ25hdHVyZS4gICovCisKKyAgICAgIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2N0IikgPT0gMCkKKwl7CisJICB3b3JrIC0+IGNvbnN0cnVjdG9yICs9IDE7CisJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2R0IikgPT0gMCkKKwl7CisJICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKKwkgIHN0cmluZ19jbGVhciAoZGVjbHApOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gMworICAgICAgJiYgZGVjbHAtPmJbMF0gPT0gJ28nCisgICAgICAmJiBkZWNscC0+YlsxXSA9PSAncCcKKyAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgZGVjbHAtPmJbMl0pICE9IE5VTEwpCisgICAgeworICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCisgICAgICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAxMCAvKiBvcCRhc3NpZ25fICovCisJICAmJiBtZW1jbXAgKGRlY2xwLT5iICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQorCXsKKwkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQorCSAgICB7CisJICAgICAgaW50IGxlbiA9IGRlY2xwLT5wIC0gZGVjbHAtPmIgLSAxMDsKKwkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KKwkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMTAsIGxlbikgPT0gMCkKKwkJeworCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOworCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKKwkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOworCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPSIpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCisJICAgIHsKKwkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDM7CisJICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuCisJCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDMsIGxlbikgPT0gMCkKKwkJeworCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOworCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKKwkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDUgJiYgbWVtY21wIChkZWNscC0+YiwgInR5cGUiLCA0KSA9PSAwCisJICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+Yls0XSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KKyAgICAgIHRlbSA9IGRlY2xwLT5iICsgNTsKKyAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCisJeworCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7CisJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yICIpOworCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHlwZSk7CisJICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZGVjbHAtPmJbMF0gPT0gJ18nICYmIGRlY2xwLT5iWzFdID09ICdfJworCSAgICYmIGRlY2xwLT5iWzJdID09ICdvJyAmJiBkZWNscC0+YlszXSA9PSAncCcpCisgICAgeworICAgICAgLyogQU5TSS4gICovCisgICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLworICAgICAgdGVtID0gZGVjbHAtPmIgKyA0OworICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKKwl7CisJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKKwkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7CisJICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKKwkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKKwl9CisgICAgfQorICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCisJICAgJiYgZGVjbHAtPmJbMl0gPj0gJ2EnICYmIGRlY2xwLT5iWzJdIDw9ICd6JworCSAgICYmIGRlY2xwLT5iWzNdID49ICdhJyAmJiBkZWNscC0+YlszXSA8PSAneicpCisgICAgeworICAgICAgaWYgKGRlY2xwLT5iWzRdID09ICdcMCcpCisJeworCSAgLyogT3BlcmF0b3IuICAqLworCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCisJICAgIHsKKwkgICAgICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAyCisJCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDIsIDIpID09IDApCisJCXsKKwkJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKKwkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7CisJCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChkZWNscC0+YlsyXSA9PSAnYScgJiYgZGVjbHAtPmJbNV0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQorCQl7CisJCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMworCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMykgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgc3RyaW5nX2NsZWFyIChkZWNscCk7CisJCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKKwkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIGEgbWluaSBzdHJpbmctaGFuZGxpbmcgcGFja2FnZSAqLworCitzdGF0aWMgdm9pZAorc3RyaW5nX25lZWQgKHMsIG4pCisgICAgIHN0cmluZyAqczsKKyAgICAgaW50IG47Cit7CisgIGludCB0ZW07CisKKyAgaWYgKHMtPmIgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobiA8IDMyKQorCXsKKwkgIG4gPSAzMjsKKwl9CisgICAgICBzLT5wID0gcy0+YiA9IHhtYWxsb2MgKG4pOworICAgICAgcy0+ZSA9IHMtPmIgKyBuOworICAgIH0KKyAgZWxzZSBpZiAocy0+ZSAtIHMtPnAgPCBuKQorICAgIHsKKyAgICAgIHRlbSA9IHMtPnAgLSBzLT5iOworICAgICAgbiArPSB0ZW07CisgICAgICBuICo9IDI7CisgICAgICBzLT5iID0geHJlYWxsb2MgKHMtPmIsIG4pOworICAgICAgcy0+cCA9IHMtPmIgKyB0ZW07CisgICAgICBzLT5lID0gcy0+YiArIG47CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RyaW5nX2RlbGV0ZSAocykKKyAgICAgc3RyaW5nICpzOworeworICBpZiAocy0+YiAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKHMtPmIpOworICAgICAgcy0+YiA9IHMtPmUgPSBzLT5wID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfaW5pdCAocykKKyAgICAgc3RyaW5nICpzOworeworICBzLT5iID0gcy0+cCA9IHMtPmUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorc3RyaW5nX2NsZWFyIChzKQorICAgICBzdHJpbmcgKnM7Cit7CisgIHMtPnAgPSBzLT5iOworfQorCisjaWYgMAorCitzdGF0aWMgaW50CitzdHJpbmdfZW1wdHkgKHMpCisgICAgIHN0cmluZyAqczsKK3sKKyAgcmV0dXJuIChzLT5iID09IHMtPnApOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK3N0cmluZ19hcHBlbmQgKHAsIHMpCisgICAgIHN0cmluZyAqcDsKKyAgICAgY29uc3QgY2hhciAqczsKK3sKKyAgaW50IG47CisgIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKKyAgICByZXR1cm47CisgIG4gPSBzdHJsZW4gKHMpOworICBzdHJpbmdfbmVlZCAocCwgbik7CisgIG1lbWNweSAocC0+cCwgcywgbik7CisgIHAtPnAgKz0gbjsKK30KKworc3RhdGljIHZvaWQKK3N0cmluZ19hcHBlbmRzIChwLCBzKQorICAgICBzdHJpbmcgKnAsICpzOworeworICBpbnQgbjsKKworICBpZiAocy0+YiAhPSBzLT5wKQorICAgIHsKKyAgICAgIG4gPSBzLT5wIC0gcy0+YjsKKyAgICAgIHN0cmluZ19uZWVkIChwLCBuKTsKKyAgICAgIG1lbWNweSAocC0+cCwgcy0+Yiwgbik7CisgICAgICBwLT5wICs9IG47CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RyaW5nX2FwcGVuZG4gKHAsIHMsIG4pCisgICAgIHN0cmluZyAqcDsKKyAgICAgY29uc3QgY2hhciAqczsKKyAgICAgaW50IG47Cit7CisgIGlmIChuICE9IDApCisgICAgeworICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOworICAgICAgbWVtY3B5IChwLT5wLCBzLCBuKTsKKyAgICAgIHAtPnAgKz0gbjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfcHJlcGVuZCAocCwgcykKKyAgICAgc3RyaW5nICpwOworICAgICBjb25zdCBjaGFyICpzOworeworICBpZiAocyAhPSBOVUxMICYmICpzICE9ICdcMCcpCisgICAgeworICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBzdHJsZW4gKHMpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzdHJpbmdfcHJlcGVuZHMgKHAsIHMpCisgICAgIHN0cmluZyAqcCwgKnM7Cit7CisgIGlmIChzLT5iICE9IHMtPnApCisgICAgeworICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLT5iLCBzLT5wIC0gcy0+Yik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBuKQorICAgICBzdHJpbmcgKnA7CisgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgIGludCBuOworeworICBjaGFyICpxOworCisgIGlmIChuICE9IDApCisgICAgeworICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOworICAgICAgZm9yIChxID0gcC0+cCAtIDE7IHEgPj0gcC0+YjsgcS0tKQorCXsKKwkgIHFbbl0gPSBxWzBdOworCX0KKyAgICAgIG1lbWNweSAocC0+Yiwgcywgbik7CisgICAgICBwLT5wICs9IG47CisgICAgfQorfQorCisvKiBUbyBnZW5lcmF0ZSBhIHN0YW5kYWxvbmUgZGVtYW5nbGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgcHVycG9zZXMsCisgICBqdXN0IGNvbXBpbGUgYW5kIGxpbmsgdGhpcyBmaWxlIHdpdGggLURNQUlOIGFuZCBsaWJpYmVydHkuYS4gIFdoZW4KKyAgIHJ1biwgaXQgZGVtYW5nbGVzIGVhY2ggY29tbWFuZCBsaW5lIGFyZywgb3IgZWFjaCBzdGRpbiBzdHJpbmcsIGFuZAorICAgcHJpbnRzIHRoZSByZXN1bHQgb24gc3Rkb3V0LiAgKi8KKworI2lmZGVmIE1BSU4KKworI2luY2x1ZGUgImdldG9wdC5oIgorCitzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOworc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047CitzdGF0aWMgaW50IGZsYWdzID0gRE1HTF9QQVJBTVMgfCBETUdMX0FOU0k7CisKK3N0YXRpYyB2b2lkIGRlbWFuZ2xlX2l0IFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGZhdGFsIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorZGVtYW5nbGVfaXQgKG1hbmdsZWRfbmFtZSkKKyAgICAgY2hhciAqbWFuZ2xlZF9uYW1lOworeworICBjaGFyICpyZXN1bHQ7CisKKyAgcmVzdWx0ID0gY3BsdXNfZGVtYW5nbGUgKG1hbmdsZWRfbmFtZSwgZmxhZ3MpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiJXNcbiIsIG1hbmdsZWRfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgiJXNcbiIsIHJlc3VsdCk7CisgICAgICBmcmVlIChyZXN1bHQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3VzYWdlIChzdHJlYW0sIHN0YXR1cykKKyAgICAgRklMRSAqc3RyZWFtOworICAgICBpbnQgc3RhdHVzOworeworICBmcHJpbnRmIChzdHJlYW0sICJcCitVc2FnZTogJXMgWy1fXSBbLW5dIFstcyB7Z251LGx1Y2lkLGFybSxocCxlZGd9XSBbLS1zdHJpcC11bmRlcnNjb3Jlc11cblwKKyAgICAgICBbLS1uby1zdHJpcC11bmRlcnNjb3Jlc10gWy0tZm9ybWF0PXtnbnUsbHVjaWQsYXJtLGhwLGVkZ31dXG5cCisgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXSBbYXJnLi4uXVxuIiwKKwkgICBwcm9ncmFtX25hbWUpOworICBleGl0IChzdGF0dXMpOworfQorCisjZGVmaW5lIE1CVUZfU0laRSAzMjc2NworY2hhciBtYnVmZmVyW01CVUZfU0laRV07CisKKy8qIERlZmluZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHVuZGVyc2NvcmUuYy4gICovCitleHRlcm4gaW50IHByZXBlbmRzX3VuZGVyc2NvcmU7CisKK2ludCBzdHJpcF91bmRlcnNjb3JlID0gMDsKKworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisgIHsic3RyaXAtdW5kZXJzY29yZXMiLCBub19hcmd1bWVudCwgMCwgJ18nfSwKKyAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKKyAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCisgIHsiamF2YSIsIG5vX2FyZ3VtZW50LCAwLCAnaid9LAorICB7Im5vLXN0cmlwLXVuZGVyc2NvcmVzIiwgbm9fYXJndW1lbnQsIDAsICduJ30sCisgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAorICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Cit9OworCisvKiBNb3JlICdmcmllbmRseScgYWJvcnQgdGhhdCBwcmludHMgdGhlIGxpbmUgYW5kIGZpbGUuCisgICBjb25maWcuaCBjYW4gI2RlZmluZSBhYm9ydCBmYW5jeV9hYm9ydCBpZiB5b3UgbGlrZSB0aGF0IHNvcnQgb2YgdGhpbmcuICAqLworCit2b2lkCitmYW5jeV9hYm9ydCAoKQoreworICBmYXRhbCAoIkludGVybmFsIGdjYyBhYm9ydC4iKTsKK30KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGNoYXIgKnJlc3VsdDsKKyAgaW50IGM7CisKKyAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKworICBzdHJpcF91bmRlcnNjb3JlID0gcHJlcGVuZHNfdW5kZXJzY29yZTsKKworICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIl9uczpqIiwgbG9uZ19vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlICc/JzoKKwkgIHVzYWdlIChzdGRlcnIsIDEpOworCSAgYnJlYWs7CisJY2FzZSAnaCc6CisJICB1c2FnZSAoc3Rkb3V0LCAwKTsKKwljYXNlICduJzoKKwkgIHN0cmlwX3VuZGVyc2NvcmUgPSAwOworCSAgYnJlYWs7CisJY2FzZSAndic6CisJICBwcmludGYgKCJHTlUgJXMgKEMrKyBkZW1hbmdsZXIpLCB2ZXJzaW9uICVzXG4iLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fdmVyc2lvbik7CisJICBleGl0ICgwKTsKKwljYXNlICdfJzoKKwkgIHN0cmlwX3VuZGVyc2NvcmUgPSAxOworCSAgYnJlYWs7CisJY2FzZSAnaic6CisJICBmbGFncyB8PSBETUdMX0pBVkE7CisJICBicmVhazsKKwljYXNlICdzJzoKKwkgIGlmIChzdHJjbXAgKG9wdGFyZywgImdudSIpID09IDApCisJICAgIHsKKwkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBnbnVfZGVtYW5nbGluZzsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJsdWNpZCIpID09IDApCisJICAgIHsKKwkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBsdWNpZF9kZW1hbmdsaW5nOworCSAgICB9CisJICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImFybSIpID09IDApCisJICAgIHsKKwkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBhcm1fZGVtYW5nbGluZzsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJocCIpID09IDApCisJICAgIHsKKwkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBocF9kZW1hbmdsaW5nOworCSAgICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJlZGciKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgPSBlZGdfZGVtYW5nbGluZzsKKyAgICAgICAgICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmtub3duIGRlbWFuZ2xpbmcgc3R5bGUgYCVzJ1xuIiwKKwkJICAgICAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisgICAgICBmb3IgKCA7IG9wdGluZCA8IGFyZ2M7IG9wdGluZCsrKQorCXsKKwkgIGRlbWFuZ2xlX2l0IChhcmd2W29wdGluZF0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKDs7KQorCXsKKwkgIGludCBpID0gMDsKKwkgIGMgPSBnZXRjaGFyICgpOworCSAgLyogVHJ5IHRvIHJlYWQgYSBsYWJlbC4gICovCisJICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzYWxudW0oYykgfHwgYyA9PSAnXycgfHwgYyA9PSAnJCcgfHwgYyA9PSAnLicgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJyMnIHx8IGMgPT0gJywnIHx8IGMgPT0gJyonIHx8IGMgPT0gJyYnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID09ICdbJyB8fCBjID09ICddJyB8fCBjID09ICc6JyB8fCBjID09ICcoJyB8fCBjID09ICcpJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgb25lcyBpbiB0aGUgMm5kICYgM3JkIGxpbmVzIHdlcmUgYWRkZWQgdG8gaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUCBhQ0MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gbWFuZ2xpbmdzICovCisJICAgIHsKKwkgICAgICBpZiAoaSA+PSBNQlVGX1NJWkUtMSkKKwkJYnJlYWs7CisJICAgICAgbWJ1ZmZlcltpKytdID0gYzsKKwkgICAgICBjID0gZ2V0Y2hhciAoKTsKKwkgICAgfQorCSAgaWYgKGkgPiAwKQorCSAgICB7CisJICAgICAgaW50IHNraXBfZmlyc3QgPSAwOworCisJICAgICAgaWYgKG1idWZmZXJbMF0gPT0gJy4nKQorCQkrK3NraXBfZmlyc3Q7CisJICAgICAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgbWJ1ZmZlcltza2lwX2ZpcnN0XSA9PSAnXycpCisJCSsrc2tpcF9maXJzdDsKKworCSAgICAgIGlmIChza2lwX2ZpcnN0ID4gaSkKKwkJc2tpcF9maXJzdCA9IGk7CisKKwkgICAgICBtYnVmZmVyW2ldID0gMDsKKworCSAgICAgIHJlc3VsdCA9IGNwbHVzX2RlbWFuZ2xlIChtYnVmZmVyICsgc2tpcF9maXJzdCwgZmxhZ3MpOworCSAgICAgIGlmIChyZXN1bHQpCisJCXsKKwkJICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCisJCSAgICBwdXRjICgnLicsIHN0ZG91dCk7CisJCSAgZnB1dHMgKHJlc3VsdCwgc3Rkb3V0KTsKKwkJICBmcmVlIChyZXN1bHQpOworCQl9CisJICAgICAgZWxzZQorCQlmcHV0cyAobWJ1ZmZlciwgc3Rkb3V0KTsKKworCSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKwkgICAgfQorCSAgaWYgKGMgPT0gRU9GKQorCSAgICBicmVhazsKKwkgIHB1dGNoYXIgKGMpOworCX0KKyAgICB9CisKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitmYXRhbCAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHIpOworICBleGl0ICgxKTsKK30KKworUFRSCit4bWFsbG9jIChzaXplKQorICBzaXplX3Qgc2l6ZTsKK3sKKyAgcmVnaXN0ZXIgUFRSIHZhbHVlID0gKFBUUikgbWFsbG9jIChzaXplKTsKKyAgaWYgKHZhbHVlID09IDApCisgICAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitQVFIKK3hyZWFsbG9jIChwdHIsIHNpemUpCisgIFBUUiBwdHI7CisgIHNpemVfdCBzaXplOworeworICByZWdpc3RlciBQVFIgdmFsdWUgPSAoUFRSKSByZWFsbG9jIChwdHIsIHNpemUpOworICBpZiAodmFsdWUgPT0gMCkKKyAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOworICByZXR1cm4gdmFsdWU7Cit9CisjZW5kaWYJLyogbWFpbiAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2ZkbWF0Y2guYyBiL2xpYmliZXJ0eS9mZG1hdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmMDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9mZG1hdGNoLmMKQEAgLTAsMCArMSw3MyBAQAorLyogQ29tcGFyZSB0d28gb3BlbiBmaWxlIGRlc2NyaXB0b3JzIHRvIHNlZSBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KK0xpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qCisKK05BTUUKKworCWZkbWF0Y2ggLS0gc2VlIGlmIHR3byBmaWxlIGRlc2NyaXB0b3JzIHJlZmVyIHRvIHNhbWUgZmlsZQorCitTWU5PUFNJUworCisJaW50IGZkbWF0Y2ggKGludCBmZDEsIGludCBmZDIpCisKK0RFU0NSSVBUSU9OCisKKwlDaGVjayB0byBzZWUgaWYgdHdvIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byB0aGUgc2FtZSBmaWxlLgorCVRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiB3ZSBoYXZlIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCisJZm9yIGFuIHVubmFtZWQgZmlsZSwgYW5kIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IHdlIGJlbGlldmUgdG8gCisJY29ycmVzcG9uZCB0byB0aGF0IGZkLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGV4ZWMnZCB3aXRoCisJYW4gYWxyZWFkeSBvcGVuIGZpbGUgKHN0ZG91dCBmb3IgZXhhbXBsZSkgb3IgZnJvbSB0aGUgU1ZSNCAvcHJvYworCWNhbGxzIHRoYXQgcmV0dXJuIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyBmb3IgbWFwcGVkIGFkZHJlc3Mgc3BhY2VzLgorCUFsbCB3ZSBoYXZlIHRvIGRvIGlzIG9wZW4gdGhlIGZpbGUgYnkgbmFtZSBhbmQgY2hlY2sgdGhlIHR3byBmaWxlCisJZGVzY3JpcHRvcnMgZm9yIGEgbWF0Y2gsIHdoaWNoIGlzIGRvbmUgYnkgY29tcGFyaW5nIG1ham9yJm1pbm9yCisJZGV2aWNlIG51bWJlcnMgYW5kIGlub2RlIG51bWJlcnMuCisKK0JVR1MKKworCShGSVhNRTogZG9lcyB0aGlzIHdvcmsgZm9yIG5ldHdvcmtzPykKKwlJdCB3b3JrcyBmb3IgTkZTLCB3aGljaCBhc3NpZ25zIGEgZGV2aWNlIG51bWJlciB0byBlYWNoIG1vdW50LgorCisqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitpbnQgZmRtYXRjaCAoZmQxLCBmZDIpCisJaW50IGZkMTsKKwlpbnQgZmQyOworeworICBzdHJ1Y3Qgc3RhdCBzYnVmMTsKKyAgc3RydWN0IHN0YXQgc2J1ZjI7CisKKyAgaWYgKChmc3RhdCAoZmQxLCAmc2J1ZjEpID09IDApICYmCisgICAgICAoZnN0YXQgKGZkMiwgJnNidWYyKSA9PSAwKSAmJgorICAgICAgKHNidWYxLnN0X2RldiA9PSBzYnVmMi5zdF9kZXYpICYmCisgICAgICAoc2J1ZjEuc3RfaW5vID09IHNidWYyLnN0X2lubykpCisgICAgeworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jIGIvbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmMjFlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jCkBAIC0wLDAgKzEsNDAzIEBACisvKiBJRUVFIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgcm91dGluZXMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisjaW5jbHVkZSA8bWF0aC5oPgkJLyogbGRleHAgKi8KKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CitleHRlcm4gdm9pZCAqbWVtc2V0ICh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOworI2Vsc2UKK2V4dGVybiBjaGFyICptZW1jcHkgKCk7CitleHRlcm4gY2hhciAqbWVtc2V0ICgpOworI2VuZGlmCisKKy8qIFRoZSBvZGRzIHRoYXQgQ0hBUl9CSVQgd2lsbCBiZSBhbnl0aGluZyBidXQgOCBhcmUgbG93IGVub3VnaCB0aGF0IEknbSBub3QKKyAgIGdvaW5nIHRvIGJvdGhlciB3aXRoIHRyeWluZyB0byBtdWNrIGFyb3VuZCB3aXRoIHdoZXRoZXIgaXQgaXMgZGVmaW5lZCBpbgorICAgYSBzeXN0ZW0gaGVhZGVyLCB3aGF0IHdlIGRvIGlmIG5vdCwgZXRjLiAgKi8KKyNkZWZpbmUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQgOAorCisvKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCitjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnID0KK3sKKyAgZmxvYXRmb3JtYXRfYmlnLCAzMiwgMCwgMSwgOCwgMTI3LCAyNTUsIDksIDIzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KK307Citjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfbGl0dGxlID0KK3sKKyAgZmxvYXRmb3JtYXRfbGl0dGxlLCAzMiwgMCwgMSwgOCwgMTI3LCAyNTUsIDksIDIzLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KK307Citjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnID0KK3sKKyAgZmxvYXRmb3JtYXRfYmlnLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCit9OworY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSA9Cit7CisgIGZsb2F0Zm9ybWF0X2xpdHRsZSwgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubworfTsKKworLyogZmxvYXRmb3JtYXQgZm9yIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIsIHdpdGggYmlnIGVuZGlhbiB3b3JkCisgICBvcmRlcmluZywgYXMgb24gdGhlIEFSTS4gICovCisKK2NvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGVieXRlX2JpZ3dvcmQgPQoreworICBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KK307CisKK2NvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dCA9Cit7CisgIGZsb2F0Zm9ybWF0X2xpdHRsZSwgODAsIDAsIDEsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMTYsIDY0LAorICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCit9OworY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X202ODg4MV9leHQgPQoreworICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAxNiB0byAzMSBhcmUgdW51c2VkLiAgKi8KKyAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKK307Citjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQgPQoreworICAvKiBOb3RlIHRoYXQgdGhlIGJpdHMgZnJvbSAwIHRvIDE1IGFyZSB1bnVzZWQuICAqLworICBmbG9hdGZvcm1hdF9saXR0bGUsIDk2LCAxNiwgMTcsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LAorICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCit9OworY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQgPQoreworI2lmZGVmIEhBUlJJU19GTE9BVF9GT1JNQVQKKyAgLyogSGFycmlzIHVzZXMgcmF3IGZvcm1hdCAxMjggYnl0ZXMgbG9uZywgYnV0IHRoZSBudW1iZXIgaXMganVzdCBhbiBpZWVlCisgICAgIGRvdWJsZSwgYW5kIHRoZSBsYXN0IDY0IGJpdHMgYXJlIHdhc3RlZC4gKi8KKyAgZmxvYXRmb3JtYXRfYmlnLDEyOCwgMCwgMSwgMTEsICAweDNmZiwgIDB4N2ZmLCAxMiwgNTIsCisgIGZsb2F0Zm9ybWF0X2ludGJpdF9ubworI2Vsc2UKKyAgZmxvYXRmb3JtYXRfYmlnLCA4MCwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAxNiwgNjQsCisgIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKKyNlbmRpZiAvKiBIQVJSSVNfRkxPQVRfRk9STUFUICovCit9OworY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQgPQoreworICAvKiBCaXRzIDEgdG8gMTYgYXJlIHVudXNlZC4gICovCisgIGZsb2F0Zm9ybWF0X2JpZywgOTYsIDAsIDE3LCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwKKyAgZmxvYXRmb3JtYXRfaW50Yml0X3llcworfTsKKwwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9maWVsZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosCisJCQkJCWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycywKKwkJCQkJdW5zaWduZWQgaW50LAorCQkJCQl1bnNpZ25lZCBpbnQsCisJCQkJCXVuc2lnbmVkIGludCkpOworCisvKiBFeHRyYWN0IGEgZmllbGQgd2hpY2ggc3RhcnRzIGF0IFNUQVJUIGFuZCBpcyBMRU4gYnl0ZXMgbG9uZy4gIERBVEEgYW5kCisgICBUT1RBTF9MRU4gYXJlIHRoZSB0aGluZyB3ZSBhcmUgZXh0cmFjdGluZyBpdCBmcm9tLCBpbiBieXRlb3JkZXIgT1JERVIuICAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9maWVsZCAoZGF0YSwgb3JkZXIsIHRvdGFsX2xlbiwgc3RhcnQsIGxlbikKKyAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIG9yZGVyOworICAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuOworICAgICB1bnNpZ25lZCBpbnQgc3RhcnQ7CisgICAgIHVuc2lnbmVkIGludCBsZW47Cit7CisgIHVuc2lnbmVkIGxvbmcgcmVzdWx0OworICB1bnNpZ25lZCBpbnQgY3VyX2J5dGU7CisgIGludCBjdXJfYml0c2hpZnQ7CisKKyAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KKyAgY3VyX2J5dGUgPSAoc3RhcnQgKyBsZW4pIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7CisgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCisgICAgY3VyX2J5dGUgPSAodG90YWxfbGVuIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gY3VyX2J5dGUgLSAxOworICBjdXJfYml0c2hpZnQgPQorICAgICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7CisgIHJlc3VsdCA9ICooZGF0YSArIGN1cl9ieXRlKSA+PiAoLWN1cl9iaXRzaGlmdCk7CisgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKKyAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKKyAgICArK2N1cl9ieXRlOworICBlbHNlCisgICAgLS1jdXJfYnl0ZTsKKworICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLworICB3aGlsZSAoY3VyX2JpdHNoaWZ0IDwgbGVuKQorICAgIHsKKyAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKKwkvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGU7IHplcm8gb3V0IHRoZSBiaXRzIHdoaWNoIGFyZSBub3QgcGFydCBvZgorCSAgIHRoaXMgZmllbGQuICAqLworCXJlc3VsdCB8PQorCSAgKCooZGF0YSArIGN1cl9ieXRlKSAmICgoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKSkKKwkgICAgPDwgY3VyX2JpdHNoaWZ0OworICAgICAgZWxzZQorCXJlc3VsdCB8PSAqKGRhdGEgKyBjdXJfYnl0ZSkgPDwgY3VyX2JpdHNoaWZ0OworICAgICAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOworICAgICAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKKwkrK2N1cl9ieXRlOworICAgICAgZWxzZQorCS0tY3VyX2J5dGU7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorICAKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCisgICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KKyAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KKwordm9pZAorZmxvYXRmb3JtYXRfdG9fZG91YmxlIChmbXQsIGZyb20sIHRvKQorICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKKyAgICAgY2hhciAqZnJvbTsKKyAgICAgZG91YmxlICp0bzsKK3sKKyAgdW5zaWduZWQgY2hhciAqdWZyb20gPSAodW5zaWduZWQgY2hhciAqKWZyb207CisgIGRvdWJsZSBkdG87CisgIGxvbmcgZXhwb25lbnQ7CisgIHVuc2lnbmVkIGxvbmcgbWFudDsKKyAgdW5zaWduZWQgaW50IG1hbnRfYml0cywgbWFudF9vZmY7CisgIGludCBtYW50X2JpdHNfbGVmdDsKKyAgaW50IHNwZWNpYWxfZXhwb25lbnQ7CQkvKiBJdCdzIGEgTmFOLCBkZW5vcm0gb3IgemVybyAqLworCisgIGV4cG9uZW50ID0gZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAorCQkJZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbik7CisgIC8qIE5vdGUgdGhhdCBpZiBleHBvbmVudCBpbmRpY2F0ZXMgYSBOYU4sIHdlIGNhbid0IHJlYWxseSBkbyBhbnl0aGluZyB1c2VmdWwKKyAgICAgKG5vdCBrbm93aW5nIGlmIHRoZSBob3N0IGhhcyBOYU4ncywgb3IgaG93IHRvIGJ1aWxkIG9uZSkuICBTbyBpdCB3aWxsCisgICAgIGVuZCB1cCBhcyBhbiBpbmZpbml0eSBvciBzb21ldGhpbmcgY2xvc2U7IHRoYXQgaXMgT0suICAqLworCisgIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOworICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OworICBkdG8gPSAwLjA7CisKKyAgc3BlY2lhbF9leHBvbmVudCA9IGV4cG9uZW50ID09IDAgfHwgZXhwb25lbnQgPT0gZm10LT5leHBfbmFuOworCisgIC8qIERvbid0IGJpYXMgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuICAqLworICBpZiAoIXNwZWNpYWxfZXhwb25lbnQpCisgICAgZXhwb25lbnQgLT0gZm10LT5leHBfYmlhczsKKworICAvKiBCdWlsZCB0aGUgcmVzdWx0IGFsZ2VicmFpY2FsbHkuICBNaWdodCBnbyBpbmZpbml0ZSwgdW5kZXJmbG93LCBldGM7CisgICAgIHdobyBjYXJlcy4gKi8KKworICAvKiBJZiB0aGlzIGZvcm1hdCB1c2VzIGEgaGlkZGVuIGJpdCwgZXhwbGljaXRseSBhZGQgaXQgaW4gbm93LiAgT3RoZXJ3aXNlLAorICAgICBpbmNyZW1lbnQgdGhlIGV4cG9uZW50IGJ5IG9uZSB0byBhY2NvdW50IGZvciB0aGUgaW50ZWdlciBiaXQuICAqLworCisgIGlmICghc3BlY2lhbF9leHBvbmVudCkKKyAgICB7CisgICAgICBpZiAoZm10LT5pbnRiaXQgPT0gZmxvYXRmb3JtYXRfaW50Yml0X25vKQorCWR0byA9IGxkZXhwICgxLjAsIGV4cG9uZW50KTsKKyAgICAgIGVsc2UKKwlleHBvbmVudCsrOworICAgIH0KKworICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQorICAgIHsKKyAgICAgIG1hbnRfYml0cyA9IG1pbiAobWFudF9iaXRzX2xlZnQsIDMyKTsKKworICAgICAgbWFudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKKwkJCSBtYW50X29mZiwgbWFudF9iaXRzKTsKKworICAgICAgZHRvICs9IGxkZXhwICgoZG91YmxlKW1hbnQsIGV4cG9uZW50IC0gbWFudF9iaXRzKTsKKyAgICAgIGV4cG9uZW50IC09IG1hbnRfYml0czsKKyAgICAgIG1hbnRfb2ZmICs9IG1hbnRfYml0czsKKyAgICAgIG1hbnRfYml0c19sZWZ0IC09IG1hbnRfYml0czsKKyAgICB9CisKKyAgLyogTmVnYXRlIGl0IGlmIG5lZ2F0aXZlLiAgKi8KKyAgaWYgKGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxKSkKKyAgICBkdG8gPSAtZHRvOworICAqdG8gPSBkdG87Cit9CisMCitzdGF0aWMgdm9pZCBwdXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCisJCQkgICAgICAgdW5zaWduZWQgaW50LAorCQkJICAgICAgIHVuc2lnbmVkIGludCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZykpOworCisvKiBTZXQgYSBmaWVsZCB3aGljaCBzdGFydHMgYXQgU1RBUlQgYW5kIGlzIExFTiBieXRlcyBsb25nLiAgREFUQSBhbmQKKyAgIFRPVEFMX0xFTiBhcmUgdGhlIHRoaW5nIHdlIGFyZSBleHRyYWN0aW5nIGl0IGZyb20sIGluIGJ5dGVvcmRlciBPUkRFUi4gICovCitzdGF0aWMgdm9pZAorcHV0X2ZpZWxkIChkYXRhLCBvcmRlciwgdG90YWxfbGVuLCBzdGFydCwgbGVuLCBzdHVmZl90b19wdXQpCisgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKKyAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKKyAgICAgdW5zaWduZWQgaW50IHN0YXJ0OworICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICB1bnNpZ25lZCBsb25nIHN0dWZmX3RvX3B1dDsKK3sKKyAgdW5zaWduZWQgaW50IGN1cl9ieXRlOworICBpbnQgY3VyX2JpdHNoaWZ0OworCisgIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCisgIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOworICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQorICAgIGN1cl9ieXRlID0gKHRvdGFsX2xlbiAvIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIGN1cl9ieXRlIC0gMTsKKyAgY3VyX2JpdHNoaWZ0ID0KKyAgICAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSAtIEZMT0FURk9STUFUX0NIQVJfQklUOworICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KKyAgICB+KCgoMSA8PCAoKHN0YXJ0ICsgbGVuKSAlIEZMT0FURk9STUFUX0NIQVJfQklUKSkgLSAxKSA8PCAoLWN1cl9iaXRzaGlmdCkpOworICAqKGRhdGEgKyBjdXJfYnl0ZSkgfD0KKyAgICAoc3R1ZmZfdG9fcHV0ICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKSA8PCAoLWN1cl9iaXRzaGlmdCk7CisgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKKyAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKKyAgICArK2N1cl9ieXRlOworICBlbHNlCisgICAgLS1jdXJfYnl0ZTsKKworICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLworICB3aGlsZSAoY3VyX2JpdHNoaWZ0IDwgbGVuKQorICAgIHsKKyAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKKwl7CisJICAvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGUuICAqLworCSAgKihkYXRhICsgY3VyX2J5dGUpICY9CisJICAgIH4oKDEgPDwgKGxlbiAtIGN1cl9iaXRzaGlmdCkpIC0gMSk7CisJICAqKGRhdGEgKyBjdXJfYnl0ZSkgfD0gKHN0dWZmX3RvX3B1dCA+PiBjdXJfYml0c2hpZnQpOworCX0KKyAgICAgIGVsc2UKKwkqKGRhdGEgKyBjdXJfYnl0ZSkgPSAoKHN0dWZmX3RvX3B1dCA+PiBjdXJfYml0c2hpZnQpCisJCQkgICAgICAmICgoMSA8PCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSAxKSk7CisgICAgICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7CisgICAgICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQorCSsrY3VyX2J5dGU7CisgICAgICBlbHNlCisJLS1jdXJfYnl0ZTsKKyAgICB9Cit9CisKKy8qIFRoZSBjb252ZXJzZTogY29udmVydCB0aGUgZG91YmxlICpGUk9NIHRvIGFuIGV4dGVuZGVkIGZsb2F0CisgICBhbmQgc3RvcmUgd2hlcmUgVE8gcG9pbnRzLiAgTmVpdGhlciBGUk9NIG5vciBUTyBoYXZlIGFueSBhbGlnbm1lbnQKKyAgIHJlc3RyaWN0aW9ucy4gICovCisKK3ZvaWQKK2Zsb2F0Zm9ybWF0X2Zyb21fZG91YmxlIChmbXQsIGZyb20sIHRvKQorICAgICBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKKyAgICAgZG91YmxlICpmcm9tOworICAgICBjaGFyICp0bzsKK3sKKyAgZG91YmxlIGRmcm9tOworICBpbnQgZXhwb25lbnQ7CisgIGRvdWJsZSBtYW50OworICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKKyAgaW50IG1hbnRfYml0c19sZWZ0OworICB1bnNpZ25lZCBjaGFyICp1dG8gPSAodW5zaWduZWQgY2hhciAqKXRvOworCisgIG1lbWNweSAoJmRmcm9tLCBmcm9tLCBzaXplb2YgKGRmcm9tKSk7CisgIG1lbXNldCAodXRvLCAwLCBmbXQtPnRvdGFsc2l6ZSAvIEZMT0FURk9STUFUX0NIQVJfQklUKTsKKyAgaWYgKGRmcm9tID09IDApCisgICAgcmV0dXJuOwkJCS8qIFJlc3VsdCBpcyB6ZXJvICovCisgIGlmIChkZnJvbSAhPSBkZnJvbSkKKyAgICB7CisgICAgICAvKiBGcm9tIGlzIE5hTiAqLworICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsCisJCSBmbXQtPmV4cF9sZW4sIGZtdC0+ZXhwX25hbik7CisgICAgICAvKiBCZSBzdXJlIGl0J3Mgbm90IGluZmluaXR5LCBidXQgTmFOIHZhbHVlIGlzIGlycmVsICovCisgICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPm1hbl9zdGFydCwKKwkJIDMyLCAxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSWYgbmVnYXRpdmUsIHNldCB0aGUgc2lnbiBiaXQuICAqLworICBpZiAoZGZyb20gPCAwKQorICAgIHsKKyAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+c2lnbl9zdGFydCwgMSwgMSk7CisgICAgICBkZnJvbSA9IC1kZnJvbTsKKyAgICB9CisKKyAgLyogSG93IHRvIHRlbGwgYW4gaW5maW5pdHkgZnJvbSBhbiBvcmRpbmFyeSBudW1iZXI/ICBGSVhNRS1zb21lZGF5ICovCisKKyAgbWFudCA9IGZyZXhwIChkZnJvbSwgJmV4cG9uZW50KTsKKyAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbiwKKwkgICAgIGV4cG9uZW50ICsgZm10LT5leHBfYmlhcyAtIDEpOworCisgIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOworICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OworICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbWFudF9sb25nOworICAgICAgbWFudF9iaXRzID0gbWFudF9iaXRzX2xlZnQgPCAzMiA/IG1hbnRfYml0c19sZWZ0IDogMzI7CisKKyAgICAgIG1hbnQgKj0gNDI5NDk2NzI5Ni4wOworICAgICAgbWFudF9sb25nID0gKHVuc2lnbmVkIGxvbmcpbWFudDsKKyAgICAgIG1hbnQgLT0gbWFudF9sb25nOworCisgICAgICAvKiBJZiB0aGUgaW50ZWdlciBiaXQgaXMgaW1wbGljaXQsIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGl0LgorCSBJZiB3ZSBhcmUgZGlzY2FyZGluZyBhIHplcm8sIHdlIHNob3VsZCBiZSAoYnV0IGFyZSBub3QpIGNyZWF0aW5nCisJIGEgZGVub3JtYWxpemVkCW51bWJlciB3aGljaCBtZWFucyBhZGp1c3RpbmcgdGhlIGV4cG9uZW50CisJIChJIHRoaW5rKS4gICovCisgICAgICBpZiAobWFudF9iaXRzX2xlZnQgPT0gZm10LT5tYW5fbGVuCisJICAmJiBmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCisJeworCSAgbWFudF9sb25nICY9IDB4N2ZmZmZmZmY7CisJICBtYW50X2JpdHMgLT0gMTsKKwl9CisgICAgICBlbHNlIGlmIChtYW50X2JpdHMgPCAzMikKKwl7CisJICAvKiBUaGUgYml0cyB3ZSB3YW50IGFyZSBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBNQU5UX0JJVFMgYml0cyBvZgorCSAgICAgbWFudF9sb25nLiAgTW92ZSB0aGVtIHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudC4gICovCisJICBtYW50X2xvbmcgPj49IDMyIC0gbWFudF9iaXRzOworCX0KKworICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKKwkJIG1hbnRfb2ZmLCBtYW50X2JpdHMsIG1hbnRfbG9uZyk7CisgICAgICBtYW50X29mZiArPSBtYW50X2JpdHM7CisgICAgICBtYW50X2JpdHNfbGVmdCAtPSBtYW50X2JpdHM7CisgICAgfQorfQorCisKKyNpZmRlZiBJRUVFX0RFQlVHCisKKy8qIFRoaXMgaXMgdG8gYmUgcnVuIG9uIGEgaG9zdCB3aGljaCB1c2VzIElFRUUgZmxvYXRpbmcgcG9pbnQuICAqLworCit2b2lkCitpZWVlX3Rlc3QgKG4pCisgICAgIGRvdWJsZSBuOworeworICBkb3VibGUgcmVzdWx0OworICBjaGFyIGV4dGVuWzE2XTsKKworICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcsICZuLCAmcmVzdWx0KTsKKyAgaWYgKG4gIT0gcmVzdWx0KQorICAgIHByaW50ZiAoIkRpZmZlcih0byk6ICUuMjBnIC0+ICUuMjBnXG4iLCBuLCByZXN1bHQpOworICBmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgJm4sICZyZXN1bHQpOworICBpZiAobiAhPSByZXN1bHQpCisgICAgcHJpbnRmICgiRGlmZmVyKGZyb20pOiAlLjIwZyAtPiAlLjIwZ1xuIiwgbiwgcmVzdWx0KTsKKworICBmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsICZuLCBleHRlbik7CisgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsIGV4dGVuLCAmcmVzdWx0KTsKKyAgaWYgKG4gIT0gcmVzdWx0KQorICAgIHByaW50ZiAoIkRpZmZlcih0bytmcm9tKTogJS4yMGcgLT4gJS4yMGdcbiIsIG4sIHJlc3VsdCk7CisKKyNpZiBJRUVFX0RFQlVHID4gMQorICAvKiBUaGlzIGlzIHRvIGJlIHJ1biBvbiBhIGhvc3Qgd2hpY2ggdXNlcyA2ODg4MSBmb3JtYXQuICAqLworICB7CisgICAgbG9uZyBkb3VibGUgZXggPSAqKGxvbmcgZG91YmxlICopZXh0ZW47CisgICAgaWYgKGV4ICE9IG4pCisgICAgICBwcmludGYgKCJEaWZmZXIoZnJvbSB2cy4gZXh0ZW5kZWQpOiAlLjIwZ1xuIiwgbik7CisgIH0KKyNlbmRpZgorfQorCitpbnQKK21haW4gKCkKK3sKKyAgaWVlZV90ZXN0ICgwLjUpOworICBpZWVlX3Rlc3QgKDI1Ni4wKTsKKyAgaWVlZV90ZXN0ICgwLjEyMzQ1KTsKKyAgaWVlZV90ZXN0ICgyMzQyMzUuNzg5MDcyMzQpOworICBpZWVlX3Rlc3QgKC01MTIuMCk7CisgIGllZWVfdGVzdCAoLTAuMDA0MzIxKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9mbm1hdGNoLmMgYi9saWJpYmVydHkvZm5tYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWJmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvZm5tYXRjaC5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK05PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCitCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAcHJlcC5haS5taXQuZWR1LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpZiBkZWZpbmVkIChDT05GSUdfQlJPS0VUUykKKy8qIFdlIHVzZSA8Y29uZmlnLmg+IGluc3RlYWQgb2YgImNvbmZpZy5oIiBzbyB0aGF0IGEgY29tcGlsYXRpb24KKyAgIHVzaW5nIC1JLiAtSSRzcmNkaXIgd2lsbCB1c2UgLi9jb25maWcuaCByYXRoZXIgdGhhbiAkc3JjZGlyL2NvbmZpZy5oCisgICAod2hpY2ggaXQgd291bGQgZG8gYmVjYXVzZSBpdCBmb3VuZCB0aGlzIGZpbGUgaW4gJHNyY2RpcikuICAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2Vsc2UKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisKKy8qIFRoaXMgY29kZSB0byB1bmRlZiBjb25zdCBhZGRlZCBpbiBsaWJpYmVydHkuICAqLworI2lmbmRlZiBfX1NURENfXworLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCisgICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLworI2lmbmRlZiBjb25zdAorI2RlZmluZSBjb25zdAorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKworLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90CisgICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCisgICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCisgICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5CisgICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKKyAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKKyAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KKworI2lmIGRlZmluZWQgKF9MSUJDKSB8fCAhZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKQorCisKKyNpZiAhZGVmaW5lZChfX0dOVV9MSUJSQVJZX18pICYmICFkZWZpbmVkKFNURENfSEVBREVSUykKK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworLyogTWF0Y2ggU1RSSU5HIGFnYWluc3QgdGhlIGZpbGVuYW1lIHBhdHRlcm4gUEFUVEVSTiwgcmV0dXJuaW5nIHplcm8gaWYKKyAgIGl0IG1hdGNoZXMsIG5vbnplcm8gaWYgbm90LiAgKi8KK2ludAorZm5tYXRjaCAocGF0dGVybiwgc3RyaW5nLCBmbGFncykKKyAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgICBpbnQgZmxhZ3M7Cit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSBwYXR0ZXJuLCAqbiA9IHN0cmluZzsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOworCisvKiBOb3RlIHRoYXQgdGhpcyBldmFsdXRlcyBDIG1hbnkgdGltZXMuICAqLworI2RlZmluZSBGT0xEKGMpCSgoZmxhZ3MgJiBGTk1fQ0FTRUZPTEQpICYmIGlzdXBwZXIgKGMpID8gdG9sb3dlciAoYykgOiAoYykpCisKKyAgd2hpbGUgKChjID0gKnArKykgIT0gJ1wwJykKKyAgICB7CisgICAgICBjID0gRk9MRCAoYyk7CisKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnPyc6CisJICBpZiAoKm4gPT0gJ1wwJykKKwkgICAgcmV0dXJuIEZOTV9OT01BVENIOworCSAgZWxzZSBpZiAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgKm4gPT0gJy8nKQorCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7CisJICBlbHNlIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKKwkJICAgKG4gPT0gc3RyaW5nIHx8ICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBuWy0xXSA9PSAnLycpKSkKKwkgICAgcmV0dXJuIEZOTV9OT01BVENIOworCSAgYnJlYWs7CisKKwljYXNlICdcXCc6CisJICBpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkpCisJICAgIHsKKwkgICAgICBjID0gKnArKzsKKwkgICAgICBjID0gRk9MRCAoYyk7CisJICAgIH0KKwkgIGlmIChGT0xEICgodW5zaWduZWQgY2hhcikqbikgIT0gYykKKwkgICAgcmV0dXJuIEZOTV9OT01BVENIOworCSAgYnJlYWs7CisKKwljYXNlICcqJzoKKwkgIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKKwkgICAgICAobiA9PSBzdHJpbmcgfHwgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIG5bLTFdID09ICcvJykpKQorCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7CisKKwkgIGZvciAoYyA9ICpwKys7IGMgPT0gJz8nIHx8IGMgPT0gJyonOyBjID0gKnArKywgKytuKQorCSAgICBpZiAoKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmICpuID09ICcvJykgfHwKKwkJKGMgPT0gJz8nICYmICpuID09ICdcMCcpKQorCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKKworCSAgaWYgKGMgPT0gJ1wwJykKKwkgICAgcmV0dXJuIDA7CisKKwkgIHsKKwkgICAgdW5zaWduZWQgY2hhciBjMSA9ICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpID8gKnAgOiBjOworCSAgICBjMSA9IEZPTEQgKGMxKTsKKwkgICAgZm9yICgtLXA7ICpuICE9ICdcMCc7ICsrbikKKwkgICAgICBpZiAoKGMgPT0gJ1snIHx8IEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA9PSBjMSkgJiYKKwkJICBmbm1hdGNoIChwLCBuLCBmbGFncyAmIH5GTk1fUEVSSU9EKSA9PSAwKQorCQlyZXR1cm4gMDsKKwkgICAgcmV0dXJuIEZOTV9OT01BVENIOworCSAgfQorCisJY2FzZSAnWyc6CisJICB7CisJICAgIC8qIE5vbnplcm8gaWYgdGhlIHNlbnNlIG9mIHRoZSBjaGFyYWN0ZXIgY2xhc3MgaXMgaW52ZXJ0ZWQuICAqLworCSAgICByZWdpc3RlciBpbnQgbm90OworCisJICAgIGlmICgqbiA9PSAnXDAnKQorCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKKworCSAgICBpZiAoKGZsYWdzICYgRk5NX1BFUklPRCkgJiYgKm4gPT0gJy4nICYmCisJCShuID09IHN0cmluZyB8fCAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgblstMV0gPT0gJy8nKSkpCisJICAgICAgcmV0dXJuIEZOTV9OT01BVENIOworCisJICAgIG5vdCA9ICgqcCA9PSAnIScgfHwgKnAgPT0gJ14nKTsKKwkgICAgaWYgKG5vdCkKKwkgICAgICArK3A7CisKKwkgICAgYyA9ICpwKys7CisJICAgIGZvciAoOzspCisJICAgICAgeworCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIGNzdGFydCA9IGMsIGNlbmQgPSBjOworCisJCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpCisJCSAgY3N0YXJ0ID0gY2VuZCA9ICpwKys7CisKKwkJY3N0YXJ0ID0gY2VuZCA9IEZPTEQgKGNzdGFydCk7CisKKwkJaWYgKGMgPT0gJ1wwJykKKwkJICAvKiBbICh1bnRlcm1pbmF0ZWQpIGxvc2VzLiAgKi8KKwkJICByZXR1cm4gRk5NX05PTUFUQ0g7CisKKwkJYyA9ICpwKys7CisJCWMgPSBGT0xEIChjKTsKKworCQlpZiAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgYyA9PSAnLycpCisJCSAgLyogWy9dIGNhbiBuZXZlciBtYXRjaC4gICovCisJCSAgcmV0dXJuIEZOTV9OT01BVENIOworCisJCWlmIChjID09ICctJyAmJiAqcCAhPSAnXScpCisJCSAgeworCQkgICAgY2VuZCA9ICpwKys7CisJCSAgICBpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkgJiYgY2VuZCA9PSAnXFwnKQorCQkgICAgICBjZW5kID0gKnArKzsKKwkJICAgIGlmIChjZW5kID09ICdcMCcpCisJCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKKwkJICAgIGNlbmQgPSBGT0xEIChjZW5kKTsKKworCQkgICAgYyA9ICpwKys7CisJCSAgfQorCisJCWlmIChGT0xEICgodW5zaWduZWQgY2hhcikqbikgPj0gY3N0YXJ0CisJCSAgICAmJiBGT0xEICgodW5zaWduZWQgY2hhcikqbikgPD0gY2VuZCkKKwkJICBnb3RvIG1hdGNoZWQ7CisKKwkJaWYgKGMgPT0gJ10nKQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgaWYgKCFub3QpCisJICAgICAgcmV0dXJuIEZOTV9OT01BVENIOworCSAgICBicmVhazsKKworCSAgbWF0Y2hlZDo7CisJICAgIC8qIFNraXAgdGhlIHJlc3Qgb2YgdGhlIFsuLi5dIHRoYXQgYWxyZWFkeSBtYXRjaGVkLiAgKi8KKwkgICAgd2hpbGUgKGMgIT0gJ10nKQorCSAgICAgIHsKKwkJaWYgKGMgPT0gJ1wwJykKKwkJICAvKiBbLi4uICh1bnRlcm1pbmF0ZWQpIGxvc2VzLiAgKi8KKwkJICByZXR1cm4gRk5NX05PTUFUQ0g7CisKKwkJYyA9ICpwKys7CisJCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpCisJCSAgLyogWFhYIDEwMDMuMmQxMSBpcyB1bmNsZWFyIGlmIHRoaXMgaXMgcmlnaHQuICAqLworCQkgICsrcDsKKwkgICAgICB9CisJICAgIGlmIChub3QpCisJICAgICAgcmV0dXJuIEZOTV9OT01BVENIOworCSAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgaWYgKGMgIT0gRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pKQorCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7CisJfQorCisgICAgICArK247CisgICAgfQorCisgIGlmICgqbiA9PSAnXDAnKQorICAgIHJldHVybiAwOworCisgIGlmICgoZmxhZ3MgJiBGTk1fTEVBRElOR19ESVIpICYmICpuID09ICcvJykKKyAgICAvKiBUaGUgRk5NX0xFQURJTkdfRElSIGZsYWcgc2F5cyB0aGF0ICJmb28qIiBtYXRjaGVzICJmb29iYXIvZnJvYm96eiIuICAqLworICAgIHJldHVybiAwOworCisgIHJldHVybiBGTk1fTk9NQVRDSDsKK30KKworI2VuZGlmCS8qIF9MSUJDIG9yIG5vdCBfX0dOVV9MSUJSQVJZX18uICAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldGN3ZC5jIGIvbGliaWJlcnR5L2dldGN3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDU1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvZ2V0Y3dkLmMKQEAgLTAsMCArMSw1NCBAQAorLyogRW11bGF0ZSBnZXRjd2QgdXNpbmcgZ2V0d2QuCisgICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAqLworCisvKgorTkFNRQorCWdldGN3ZCAtLSBnZXQgYWJzb2x1dGUgcGF0aG5hbWUgZm9yIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKKworU1lOT1BTSVMKKwljaGFyICpnZXRjd2QgKGNoYXIgcGF0aG5hbWVbbGVuXSwgbGVuKQorCitERVNDUklQVElPTgorCUNvcHkgdGhlIGFic29sdXRlIHBhdGhuYW1lIGZvciB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbnRvCisJdGhlIHN1cHBsaWVkIGJ1ZmZlciBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLiAgSWYgdGhlIAorCWN1cnJlbnQgZGlyZWN0b3J5J3MgcGF0aCBkb2Vzbid0IGZpdCBpbiBMRU4gY2hhcmFjdGVycywgdGhlIHJlc3VsdAorCWlzIE5VTEwgYW5kIGVycm5vIGlzIHNldC4KKworQlVHUworCUVtdWxhdGVkIHZpYSB0aGUgZ2V0d2QoKSBjYWxsLCB3aGljaCBpcyByZWFzb25hYmxlIGZvciBtb3N0CisJc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGdldGN3ZCgpLgorCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorCitleHRlcm4gY2hhciAqZ2V0d2QgKCk7CitleHRlcm4gaW50IGVycm5vOworCisjaWZuZGVmIE1BWFBBVEhMRU4KKyNkZWZpbmUgTUFYUEFUSExFTiAxMDI0CisjZW5kaWYKKworY2hhciAqCitnZXRjd2QgKGJ1ZiwgbGVuKQorICBjaGFyICpidWY7CisgIGludCBsZW47Cit7CisgIGNoYXIgb3VyYnVmW01BWFBBVEhMRU5dOworICBjaGFyICpyZXN1bHQ7CisKKyAgcmVzdWx0ID0gZ2V0d2QgKG91cmJ1Zik7CisgIGlmIChyZXN1bHQpIHsKKyAgICBpZiAoc3RybGVuIChvdXJidWYpID49IGxlbikgeworICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RyY3B5IChidWYsIG91cmJ1Zik7CisgIH0KKyAgcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRvcHQuYyBiL2xpYmliZXJ0eS9nZXRvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDE1MzFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2dldG9wdC5jCkBAIC0wLDAgKzEsMTA1NiBAQAorLyogR2V0b3B0IGZvciBHTlUuCisgICBOT1RFOiBnZXRvcHQgaXMgbm93IHBhcnQgb2YgdGhlIEMgbGlicmFyeSwgc28gaWYgeW91IGRvbid0IGtub3cgd2hhdAorICAgIktlZXAgdGhpcyBmaWxlIG5hbWUtc3BhY2UgY2xlYW4iIG1lYW5zLCB0YWxrIHRvIGRyZXBwZXJAZ251Lm9yZworICAgYmVmb3JlIGNoYW5naW5nIGl0IQorCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OAorICAgCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgIGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworDAorLyogVGhpcyB0ZWxscyBBbHBoYSBPU0YvMSBub3QgdG8gZGVmaW5lIGEgZ2V0b3B0IHByb3RvdHlwZSBpbiA8c3RkaW8uaD4uCisgICBEaXR0byBmb3IgQUlYIDMuMiBhbmQgPHN0ZGxpYi5oPi4gICovCisjaWZuZGVmIF9OT19QUk9UTworIyBkZWZpbmUgX05PX1BST1RPCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmICFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXworLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCisgICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLworIyBpZm5kZWYgY29uc3QKKyMgIGRlZmluZSBjb25zdAorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBDb21tZW50IG91dCBhbGwgdGhpcyBjb2RlIGlmIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSwgYW5kIGFyZSBub3QKKyAgIGFjdHVhbGx5IGNvbXBpbGluZyB0aGUgbGlicmFyeSBpdHNlbGYuICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VIEMKKyAgIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKKyAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKKyAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQorICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0IGZpbGVzLAorICAgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLworCisjZGVmaW5lIEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiAyCisjaWYgIWRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfX0dMSUJDX18gJiYgX19HTElCQ19fID49IDIKKyMgaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+CisjIGlmIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OID09IEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgorIyAgZGVmaW5lIEVMSURFX0NPREUKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVMSURFX0NPREUKKworCisvKiBUaGlzIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgc29tZSBsaWJyYXJ5ICNpbmNsdWRlCisgICB0byBnZXQgX19HTlVfTElCUkFSWV9fIGRlZmluZWQuICAqLworI2lmZGVmCV9fR05VX0xJQlJBUllfXworLyogRG9uJ3QgaW5jbHVkZSBzdGRsaWIuaCBmb3Igbm9uLUdOVSBDIGxpYnJhcmllcyBiZWNhdXNlIHNvbWUgb2YgdGhlbQorICAgY29udGFpbiBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQuICAqLworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYJLyogR05VIEMgbGlicmFyeS4gICovCisKKyNpZmRlZiBWTVMKKyMgaW5jbHVkZSA8dW5peGxpYi5oPgorIyBpZiBIQVZFX1NUUklOR19IIC0gMAorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfCisvKiBUaGlzIGlzIGZvciBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucyB3aXRoIGludGVybmF0aW9uYWxpemVkIG1lc3NhZ2VzLgorICAgV2hlbiBjb21waWxpbmcgbGliYywgdGhlIF8gbWFjcm8gaXMgcHJlZGVmaW5lZC4gICovCisjIGlmZGVmIEhBVkVfTElCSU5UTF9ICisjICBpbmNsdWRlIDxsaWJpbnRsLmg+CisjICBkZWZpbmUgXyhtc2dpZCkJZ2V0dGV4dCAobXNnaWQpCisjIGVsc2UKKyMgIGRlZmluZSBfKG1zZ2lkKQkobXNnaWQpCisjIGVuZGlmCisjZW5kaWYKKworLyogVGhpcyB2ZXJzaW9uIG9mIGBnZXRvcHQnIGFwcGVhcnMgdG8gdGhlIGNhbGxlciBsaWtlIHN0YW5kYXJkIFVuaXggYGdldG9wdCcKKyAgIGJ1dCBpdCBiZWhhdmVzIGRpZmZlcmVudGx5IGZvciB0aGUgdXNlciwgc2luY2UgaXQgYWxsb3dzIHRoZSB1c2VyCisgICB0byBpbnRlcnNwZXJzZSB0aGUgb3B0aW9ucyB3aXRoIHRoZSBvdGhlciBhcmd1bWVudHMuCisKKyAgIEFzIGBnZXRvcHQnIHdvcmtzLCBpdCBwZXJtdXRlcyB0aGUgZWxlbWVudHMgb2YgQVJHViBzbyB0aGF0LAorICAgd2hlbiBpdCBpcyBkb25lLCBhbGwgdGhlIG9wdGlvbnMgcHJlY2VkZSBldmVyeXRoaW5nIGVsc2UuICBUaHVzCisgICBhbGwgYXBwbGljYXRpb24gcHJvZ3JhbXMgYXJlIGV4dGVuZGVkIHRvIGhhbmRsZSBmbGV4aWJsZSBhcmd1bWVudCBvcmRlci4KKworICAgU2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNUIGRpc2FibGVzIHBlcm11dGF0aW9uLgorICAgVGhlbiB0aGUgYmVoYXZpb3IgaXMgY29tcGxldGVseSBzdGFuZGFyZC4KKworICAgR05VIGFwcGxpY2F0aW9uIHByb2dyYW1zIGNhbiB1c2UgYSB0aGlyZCBhbHRlcm5hdGl2ZSBtb2RlIGluIHdoaWNoCisgICB0aGV5IGNhbiBkaXN0aW5ndWlzaCB0aGUgcmVsYXRpdmUgb3JkZXIgb2Ygb3B0aW9ucyBhbmQgb3RoZXIgYXJndW1lbnRzLiAgKi8KKworI2luY2x1ZGUgImdldG9wdC5oIgorCisvKiBGb3IgY29tbXVuaWNhdGlvbiBmcm9tIGBnZXRvcHQnIHRvIHRoZSBjYWxsZXIuCisgICBXaGVuIGBnZXRvcHQnIGZpbmRzIGFuIG9wdGlvbiB0aGF0IHRha2VzIGFuIGFyZ3VtZW50LAorICAgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGhlcmUuCisgICBBbHNvLCB3aGVuIGBvcmRlcmluZycgaXMgUkVUVVJOX0lOX09SREVSLAorICAgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudCBpcyByZXR1cm5lZCBoZXJlLiAgKi8KKworY2hhciAqb3B0YXJnID0gTlVMTDsKKworLyogSW5kZXggaW4gQVJHViBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIHNjYW5uZWQuCisgICBUaGlzIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gdG8gYW5kIGZyb20gdGhlIGNhbGxlcgorICAgYW5kIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBgZ2V0b3B0Jy4KKworICAgT24gZW50cnkgdG8gYGdldG9wdCcsIHplcm8gbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbDsgaW5pdGlhbGl6ZS4KKworICAgV2hlbiBgZ2V0b3B0JyByZXR1cm5zIC0xLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlCisgICBub24tb3B0aW9uIGVsZW1lbnRzIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgaXRzZWxmIHNjYW4uCisKKyAgIE90aGVyd2lzZSwgYG9wdGluZCcgY29tbXVuaWNhdGVzIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQKKyAgIGhvdyBtdWNoIG9mIEFSR1YgaGFzIGJlZW4gc2Nhbm5lZCBzbyBmYXIuICAqLworCisvKiAxMDAzLjIgc2F5cyB0aGlzIG11c3QgYmUgMSBiZWZvcmUgYW55IGNhbGwuICAqLworaW50IG9wdGluZCA9IDE7CisKKy8qIEZvcm1lcmx5LCBpbml0aWFsaXphdGlvbiBvZiBnZXRvcHQgZGVwZW5kZWQgb24gb3B0aW5kPT0wLCB3aGljaAorICAgY2F1c2VzIHByb2JsZW1zIHdpdGggcmUtY2FsbGluZyBnZXRvcHQgYXMgcHJvZ3JhbXMgZ2VuZXJhbGx5IGRvbid0CisgICBrbm93IHRoYXQuICovCisKK2ludCBfX2dldG9wdF9pbml0aWFsaXplZCA9IDA7CisKKy8qIFRoZSBuZXh0IGNoYXIgdG8gYmUgc2Nhbm5lZCBpbiB0aGUgb3B0aW9uLWVsZW1lbnQKKyAgIGluIHdoaWNoIHRoZSBsYXN0IG9wdGlvbiBjaGFyYWN0ZXIgd2UgcmV0dXJuZWQgd2FzIGZvdW5kLgorICAgVGhpcyBhbGxvd3MgdXMgdG8gcGljayB1cCB0aGUgc2NhbiB3aGVyZSB3ZSBsZWZ0IG9mZi4KKworICAgSWYgdGhpcyBpcyB6ZXJvLCBvciBhIG51bGwgc3RyaW5nLCBpdCBtZWFucyByZXN1bWUgdGhlIHNjYW4KKyAgIGJ5IGFkdmFuY2luZyB0byB0aGUgbmV4dCBBUkdWLWVsZW1lbnQuICAqLworCitzdGF0aWMgY2hhciAqbmV4dGNoYXI7CisKKy8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UKKyAgIGZvciB1bnJlY29nbml6ZWQgb3B0aW9ucy4gICovCisKK2ludCBvcHRlcnIgPSAxOworCisvKiBTZXQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciB3aGljaCB3YXMgdW5yZWNvZ25pemVkLgorICAgVGhpcyBtdXN0IGJlIGluaXRpYWxpemVkIG9uIHNvbWUgc3lzdGVtcyB0byBhdm9pZCBsaW5raW5nIGluIHRoZQorICAgc3lzdGVtJ3Mgb3duIGdldG9wdCBpbXBsZW1lbnRhdGlvbi4gICovCisKK2ludCBvcHRvcHQgPSAnPyc7CisKKy8qIERlc2NyaWJlIGhvdyB0byBkZWFsIHdpdGggb3B0aW9ucyB0aGF0IGZvbGxvdyBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMuCisKKyAgIElmIHRoZSBjYWxsZXIgZGlkIG5vdCBzcGVjaWZ5IGFueXRoaW5nLAorICAgdGhlIGRlZmF1bHQgaXMgUkVRVUlSRV9PUkRFUiBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgIFBPU0lYTFlfQ09SUkVDVCBpcyBkZWZpbmVkLCBQRVJNVVRFIG90aGVyd2lzZS4KKworICAgUkVRVUlSRV9PUkRFUiBtZWFucyBkb24ndCByZWNvZ25pemUgdGhlbSBhcyBvcHRpb25zOworICAgc3RvcCBvcHRpb24gcHJvY2Vzc2luZyB3aGVuIHRoZSBmaXJzdCBub24tb3B0aW9uIGlzIHNlZW4uCisgICBUaGlzIGlzIHdoYXQgVW5peCBkb2VzLgorICAgVGhpcyBtb2RlIG9mIG9wZXJhdGlvbiBpcyBzZWxlY3RlZCBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQKKyAgIHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCwgb3IgdXNpbmcgYCsnIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgIG9mIHRoZSBsaXN0IG9mIG9wdGlvbiBjaGFyYWN0ZXJzLgorCisgICBQRVJNVVRFIGlzIHRoZSBkZWZhdWx0LiAgV2UgcGVybXV0ZSB0aGUgY29udGVudHMgb2YgQVJHViBhcyB3ZSBzY2FuLAorICAgc28gdGhhdCBldmVudHVhbGx5IGFsbCB0aGUgbm9uLW9wdGlvbnMgYXJlIGF0IHRoZSBlbmQuICBUaGlzIGFsbG93cyBvcHRpb25zCisgICB0byBiZSBnaXZlbiBpbiBhbnkgb3JkZXIsIGV2ZW4gd2l0aCBwcm9ncmFtcyB0aGF0IHdlcmUgbm90IHdyaXR0ZW4gdG8KKyAgIGV4cGVjdCB0aGlzLgorCisgICBSRVRVUk5fSU5fT1JERVIgaXMgYW4gb3B0aW9uIGF2YWlsYWJsZSB0byBwcm9ncmFtcyB0aGF0IHdlcmUgd3JpdHRlbgorICAgdG8gZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKKyAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAorICAgYXMgaWYgaXQgd2VyZSB0aGUgYXJndW1lbnQgb2YgYW4gb3B0aW9uIHdpdGggY2hhcmFjdGVyIGNvZGUgMS4KKyAgIFVzaW5nIGAtJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaXN0IG9mIG9wdGlvbiBjaGFyYWN0ZXJzCisgICBzZWxlY3RzIHRoaXMgbW9kZSBvZiBvcGVyYXRpb24uCisKKyAgIFRoZSBzcGVjaWFsIGFyZ3VtZW50IGAtLScgZm9yY2VzIGFuIGVuZCBvZiBvcHRpb24tc2Nhbm5pbmcgcmVnYXJkbGVzcworICAgb2YgdGhlIHZhbHVlIG9mIGBvcmRlcmluZycuICBJbiB0aGUgY2FzZSBvZiBSRVRVUk5fSU5fT1JERVIsIG9ubHkKKyAgIGAtLScgY2FuIGNhdXNlIGBnZXRvcHQnIHRvIHJldHVybiAtMSB3aXRoIGBvcHRpbmQnICE9IEFSR0MuICAqLworCitzdGF0aWMgZW51bQoreworICBSRVFVSVJFX09SREVSLCBQRVJNVVRFLCBSRVRVUk5fSU5fT1JERVIKK30gb3JkZXJpbmc7CisKKy8qIFZhbHVlIG9mIFBPU0lYTFlfQ09SUkVDVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCitzdGF0aWMgY2hhciAqcG9zaXhseV9jb3JyZWN0OworDAorI2lmZGVmCV9fR05VX0xJQlJBUllfXworLyogV2Ugd2FudCB0byBhdm9pZCBpbmNsdXNpb24gb2Ygc3RyaW5nLmggd2l0aCBub24tR05VIGxpYnJhcmllcworICAgYmVjYXVzZSB0aGVyZSBhcmUgbWFueSB3YXlzIGl0IGNhbiBjYXVzZSB0cm91YmxlLgorICAgT24gc29tZSBzeXN0ZW1zLCBpdCBjb250YWlucyBzcGVjaWFsIG1hZ2ljIG1hY3JvcyB0aGF0IGRvbid0IHdvcmsKKyAgIGluIEdDQy4gICovCisjIGluY2x1ZGUgPHN0cmluZy5oPgorIyBkZWZpbmUgbXlfaW5kZXgJc3RyY2hyCisjZWxzZQorCisjIGlmIEhBVkVfU1RSSU5HX0gKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyBlbHNlCisjICBpZiBIQVZFX1NUUklOR1NfSAorIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIEF2b2lkIGRlcGVuZGluZyBvbiBsaWJyYXJ5IGZ1bmN0aW9ucyBvciBmaWxlcworICAgd2hvc2UgbmFtZXMgYXJlIGluY29uc2lzdGVudC4gICovCisKKyNpZm5kZWYgZ2V0ZW52CitleHRlcm4gY2hhciAqZ2V0ZW52ICgpOworI2VuZGlmCisKK3N0YXRpYyBjaGFyICoKK215X2luZGV4IChzdHIsIGNocikKKyAgICAgY29uc3QgY2hhciAqc3RyOworICAgICBpbnQgY2hyOworeworICB3aGlsZSAoKnN0cikKKyAgICB7CisgICAgICBpZiAoKnN0ciA9PSBjaHIpCisJcmV0dXJuIChjaGFyICopIHN0cjsKKyAgICAgIHN0cisrOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIElmIHVzaW5nIEdDQywgd2UgY2FuIHNhZmVseSBkZWNsYXJlIHN0cmxlbiB0aGlzIHdheS4KKyAgIElmIG5vdCB1c2luZyBHQ0MsIGl0IGlzIG9rIG5vdCB0byBkZWNsYXJlIGl0LiAgKi8KKyNpZmRlZiBfX0dOVUNfXworLyogTm90ZSB0aGF0IE1vdG9yb2xhIERlbHRhIDY4ayBSM1Y3IGNvbWVzIHdpdGggR0NDIGJ1dCBub3Qgc3RkZGVmLmguCisgICBUaGF0IHdhcyByZWxldmFudCB0byBjb2RlIHRoYXQgd2FzIGhlcmUgYmVmb3JlLiAgKi8KKyMgaWYgKCFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXykgJiYgIWRlZmluZWQgc3RybGVuCisvKiBnY2Mgd2l0aCAtdHJhZGl0aW9uYWwgZGVjbGFyZXMgdGhlIGJ1aWx0LWluIHN0cmxlbiB0byByZXR1cm4gaW50LAorICAgYW5kIGhhcyBkb25lIHNvIGF0IGxlYXN0IHNpbmNlIHZlcnNpb24gMi40LjUuIC0tIHJtcy4gICovCitleHRlcm4gaW50IHN0cmxlbiAoY29uc3QgY2hhciAqKTsKKyMgZW5kaWYgLyogbm90IF9fU1REQ19fICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KKwwKKy8qIEhhbmRsZSBwZXJtdXRhdGlvbiBvZiBhcmd1bWVudHMuICAqLworCisvKiBEZXNjcmliZSB0aGUgcGFydCBvZiBBUkdWIHRoYXQgY29udGFpbnMgbm9uLW9wdGlvbnMgdGhhdCBoYXZlCisgICBiZWVuIHNraXBwZWQuICBgZmlyc3Rfbm9ub3B0JyBpcyB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3Qgb2YgdGhlbTsKKyAgIGBsYXN0X25vbm9wdCcgaXMgdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IG9mIHRoZW0uICAqLworCitzdGF0aWMgaW50IGZpcnN0X25vbm9wdDsKK3N0YXRpYyBpbnQgbGFzdF9ub25vcHQ7CisKKyNpZmRlZiBfTElCQworLyogQmFzaCAyLjAgZ2l2ZXMgdXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyBmbGFncworICAgaW5kaWNhdGluZyBBUkdWIGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFyZ3VtZW50cy4gICovCisKKy8qIERlZmluZWQgaW4gZ2V0b3B0X2luaXQuYyAgKi8KK2V4dGVybiBjaGFyICpfX2dldG9wdF9ub25vcHRpb25fZmxhZ3M7CisKK3N0YXRpYyBpbnQgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW47CitzdGF0aWMgaW50IG5vbm9wdGlvbl9mbGFnc19sZW47CisKK3N0YXRpYyBpbnQgb3JpZ2luYWxfYXJnYzsKK3N0YXRpYyBjaGFyICpjb25zdCAqb3JpZ2luYWxfYXJndjsKKworLyogTWFrZSBzdXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiYXNoIDIuMCBwdXRzIGluIHRoZSBlbnZpcm9ubWVudAorICAgaXMgdmFsaWQgZm9yIHRoZSBnZXRvcHQgY2FsbCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBBUkdWIHBhc3NlZAorICAgdG8gZ2V0b3B0IGlzIHRoYXQgb25lIHBhc3NlZCB0byB0aGUgcHJvY2Vzcy4gICovCitzdGF0aWMgdm9pZAorX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCitzdG9yZV9hcmdzX2FuZF9lbnYgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKK3sKKyAgLyogWFhYIFRoaXMgaXMgbm8gZ29vZCBzb2x1dGlvbi4gIFdlIHNob3VsZCByYXRoZXIgY29weSB0aGUgYXJncyBzbworICAgICB0aGF0IHdlIGNhbiBjb21wYXJlIHRoZW0gbGF0ZXIuICBCdXQgd2UgbXVzdCBub3QgdXNlIG1hbGxvYygzKS4gICovCisgIG9yaWdpbmFsX2FyZ2MgPSBhcmdjOworICBvcmlnaW5hbF9hcmd2ID0gYXJndjsKK30KKyMgaWZkZWYgdGV4dF9zZXRfZWxlbWVudAordGV4dF9zZXRfZWxlbWVudCAoX19saWJjX3N1YmluaXQsIHN0b3JlX2FyZ3NfYW5kX2Vudik7CisjIGVuZGlmIC8qIHRleHRfc2V0X2VsZW1lbnQgKi8KKworIyBkZWZpbmUgU1dBUF9GTEFHUyhjaDEsIGNoMikgXAorICBpZiAobm9ub3B0aW9uX2ZsYWdzX2xlbiA+IDApCQkJCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBjaGFyIF9fdG1wID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMV07CQkJICAgICAgXAorICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMV0gPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gyXTsJICAgICAgXAorICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMl0gPSBfX3RtcDsJCQkJICAgICAgXAorICAgIH0KKyNlbHNlCS8qICFfTElCQyAqLworIyBkZWZpbmUgU1dBUF9GTEFHUyhjaDEsIGNoMikKKyNlbmRpZgkvKiBfTElCQyAqLworCisvKiBFeGNoYW5nZSB0d28gYWRqYWNlbnQgc3Vic2VxdWVuY2VzIG9mIEFSR1YuCisgICBPbmUgc3Vic2VxdWVuY2UgaXMgZWxlbWVudHMgW2ZpcnN0X25vbm9wdCxsYXN0X25vbm9wdCkKKyAgIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbm9uLW9wdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2tpcHBlZCBzbyBmYXIuCisgICBUaGUgb3RoZXIgaXMgZWxlbWVudHMgW2xhc3Rfbm9ub3B0LG9wdGluZCksIHdoaWNoIGNvbnRhaW5zIGFsbAorICAgdGhlIG9wdGlvbnMgcHJvY2Vzc2VkIHNpbmNlIHRob3NlIG5vbi1vcHRpb25zIHdlcmUgc2tpcHBlZC4KKworICAgYGZpcnN0X25vbm9wdCcgYW5kIGBsYXN0X25vbm9wdCcgYXJlIHJlbG9jYXRlZCBzbyB0aGF0IHRoZXkgZGVzY3JpYmUKKyAgIHRoZSBuZXcgaW5kaWNlcyBvZiB0aGUgbm9uLW9wdGlvbnMgaW4gQVJHViBhZnRlciB0aGV5IGFyZSBtb3ZlZC4gICovCisKKyNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCitzdGF0aWMgdm9pZCBleGNoYW5nZSAoY2hhciAqKik7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2V4Y2hhbmdlIChhcmd2KQorICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGJvdHRvbSA9IGZpcnN0X25vbm9wdDsKKyAgaW50IG1pZGRsZSA9IGxhc3Rfbm9ub3B0OworICBpbnQgdG9wID0gb3B0aW5kOworICBjaGFyICp0ZW07CisKKyAgLyogRXhjaGFuZ2UgdGhlIHNob3J0ZXIgc2VnbWVudCB3aXRoIHRoZSBmYXIgZW5kIG9mIHRoZSBsb25nZXIgc2VnbWVudC4KKyAgICAgVGhhdCBwdXRzIHRoZSBzaG9ydGVyIHNlZ21lbnQgaW50byB0aGUgcmlnaHQgcGxhY2UuCisgICAgIEl0IGxlYXZlcyB0aGUgbG9uZ2VyIHNlZ21lbnQgaW4gdGhlIHJpZ2h0IHBsYWNlIG92ZXJhbGwsCisgICAgIGJ1dCBpdCBjb25zaXN0cyBvZiB0d28gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHN3YXBwZWQgbmV4dC4gICovCisKKyNpZmRlZiBfTElCQworICAvKiBGaXJzdCBtYWtlIHN1cmUgdGhlIGhhbmRsaW5nIG9mIHRoZSBgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzJworICAgICBzdHJpbmcgY2FuIHdvcmsgbm9ybWFsbHkuICBPdXIgdG9wIGFyZ3VtZW50IG11c3QgYmUgaW4gdGhlIHJhbmdlCisgICAgIG9mIHRoZSBzdHJpbmcuICAqLworICBpZiAobm9ub3B0aW9uX2ZsYWdzX2xlbiA+IDAgJiYgdG9wID49IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKQorICAgIHsKKyAgICAgIC8qIFdlIG11c3QgZXh0ZW5kIHRoZSBhcnJheS4gIFRoZSB1c2VyIHBsYXlzIGdhbWVzIHdpdGggdXMgYW5kCisJIHByZXNlbnRzIG5ldyBhcmd1bWVudHMuICAqLworICAgICAgY2hhciAqbmV3X3N0ciA9IG1hbGxvYyAodG9wICsgMSk7CisgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKQorCW5vbm9wdGlvbl9mbGFnc19sZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IDA7CisgICAgICBlbHNlCisJeworCSAgbWVtc2V0IChfX21lbXBjcHkgKG5ld19zdHIsIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncywKKwkJCSAgICAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pLAorCQkgICdcMCcsIHRvcCArIDEgLSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbik7CisJICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IHRvcCArIDE7CisJICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPSBuZXdfc3RyOworCX0KKyAgICB9CisjZW5kaWYKKworICB3aGlsZSAodG9wID4gbWlkZGxlICYmIG1pZGRsZSA+IGJvdHRvbSkKKyAgICB7CisgICAgICBpZiAodG9wIC0gbWlkZGxlID4gbWlkZGxlIC0gYm90dG9tKQorCXsKKwkgIC8qIEJvdHRvbSBzZWdtZW50IGlzIHRoZSBzaG9ydCBvbmUuICAqLworCSAgaW50IGxlbiA9IG1pZGRsZSAtIGJvdHRvbTsKKwkgIHJlZ2lzdGVyIGludCBpOworCisJICAvKiBTd2FwIGl0IHdpdGggdGhlIHRvcCBwYXJ0IG9mIHRoZSB0b3Agc2VnbWVudC4gICovCisJICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICAgIHsKKwkgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOworCSAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W3RvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaV07CisJICAgICAgYXJndlt0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGldID0gdGVtOworCSAgICAgIFNXQVBfRkxBR1MgKGJvdHRvbSArIGksIHRvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaSk7CisJICAgIH0KKwkgIC8qIEV4Y2x1ZGUgdGhlIG1vdmVkIGJvdHRvbSBzZWdtZW50IGZyb20gZnVydGhlciBzd2FwcGluZy4gICovCisJICB0b3AgLT0gbGVuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUb3Agc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KKwkgIGludCBsZW4gPSB0b3AgLSBtaWRkbGU7CisJICByZWdpc3RlciBpbnQgaTsKKworCSAgLyogU3dhcCBpdCB3aXRoIHRoZSBib3R0b20gcGFydCBvZiB0aGUgYm90dG9tIHNlZ21lbnQuICAqLworCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCSAgICB7CisJICAgICAgdGVtID0gYXJndltib3R0b20gKyBpXTsKKwkgICAgICBhcmd2W2JvdHRvbSArIGldID0gYXJndlttaWRkbGUgKyBpXTsKKwkgICAgICBhcmd2W21pZGRsZSArIGldID0gdGVtOworCSAgICAgIFNXQVBfRkxBR1MgKGJvdHRvbSArIGksIG1pZGRsZSArIGkpOworCSAgICB9CisJICAvKiBFeGNsdWRlIHRoZSBtb3ZlZCB0b3Agc2VnbWVudCBmcm9tIGZ1cnRoZXIgc3dhcHBpbmcuICAqLworCSAgYm90dG9tICs9IGxlbjsKKwl9CisgICAgfQorCisgIC8qIFVwZGF0ZSByZWNvcmRzIGZvciB0aGUgc2xvdHMgdGhlIG5vbi1vcHRpb25zIG5vdyBvY2N1cHkuICAqLworCisgIGZpcnN0X25vbm9wdCArPSAob3B0aW5kIC0gbGFzdF9ub25vcHQpOworICBsYXN0X25vbm9wdCA9IG9wdGluZDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZGF0YSB3aGVuIHRoZSBmaXJzdCBjYWxsIGlzIG1hZGUuICAqLworCisjaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworc3RhdGljIGNvbnN0IGNoYXIgKl9nZXRvcHRfaW5pdGlhbGl6ZSAoaW50LCBjaGFyICpjb25zdCAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciAqCitfZ2V0b3B0X2luaXRpYWxpemUgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZykKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmNvbnN0ICphcmd2OworICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7Cit7CisgIC8qIFN0YXJ0IHByb2Nlc3Npbmcgb3B0aW9ucyB3aXRoIEFSR1YtZWxlbWVudCAxIChzaW5jZSBBUkdWLWVsZW1lbnQgMAorICAgICBpcyB0aGUgcHJvZ3JhbSBuYW1lKTsgdGhlIHNlcXVlbmNlIG9mIHByZXZpb3VzbHkgc2tpcHBlZAorICAgICBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMgaXMgZW1wdHkuICAqLworCisgIGZpcnN0X25vbm9wdCA9IGxhc3Rfbm9ub3B0ID0gb3B0aW5kOworCisgIG5leHRjaGFyID0gTlVMTDsKKworICBwb3NpeGx5X2NvcnJlY3QgPSBnZXRlbnYgKCJQT1NJWExZX0NPUlJFQ1QiKTsKKworICAvKiBEZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgb3JkZXJpbmcgb2Ygb3B0aW9ucyBhbmQgbm9ub3B0aW9ucy4gICovCisKKyAgaWYgKG9wdHN0cmluZ1swXSA9PSAnLScpCisgICAgeworICAgICAgb3JkZXJpbmcgPSBSRVRVUk5fSU5fT1JERVI7CisgICAgICArK29wdHN0cmluZzsKKyAgICB9CisgIGVsc2UgaWYgKG9wdHN0cmluZ1swXSA9PSAnKycpCisgICAgeworICAgICAgb3JkZXJpbmcgPSBSRVFVSVJFX09SREVSOworICAgICAgKytvcHRzdHJpbmc7CisgICAgfQorICBlbHNlIGlmIChwb3NpeGx5X2NvcnJlY3QgIT0gTlVMTCkKKyAgICBvcmRlcmluZyA9IFJFUVVJUkVfT1JERVI7CisgIGVsc2UKKyAgICBvcmRlcmluZyA9IFBFUk1VVEU7CisKKyNpZmRlZiBfTElCQworICBpZiAocG9zaXhseV9jb3JyZWN0ID09IE5VTEwKKyAgICAgICYmIGFyZ2MgPT0gb3JpZ2luYWxfYXJnYyAmJiBhcmd2ID09IG9yaWdpbmFsX2FyZ3YpCisgICAgeworICAgICAgaWYgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID09IDApCisJeworCSAgaWYgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9PSBOVUxMCisJICAgICAgfHwgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzWzBdID09ICdcMCcpCisJICAgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gLTE7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpvcmlnX3N0ciA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnczsKKwkgICAgICBpbnQgbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSBzdHJsZW4gKG9yaWdfc3RyKTsKKwkgICAgICBpZiAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPCBhcmdjKQorCQlub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IGFyZ2M7CisJICAgICAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID0KKwkJKGNoYXIgKikgbWFsbG9jIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbik7CisJICAgICAgaWYgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9PSBOVUxMKQorCQlub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IC0xOworCSAgICAgIGVsc2UKKwkJbWVtc2V0IChfX21lbXBjcHkgKF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncywgb3JpZ19zdHIsIGxlbiksCisJCQknXDAnLCBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiAtIGxlbik7CisJICAgIH0KKwl9CisgICAgICBub25vcHRpb25fZmxhZ3NfbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW47CisgICAgfQorICBlbHNlCisgICAgbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IDA7CisjZW5kaWYKKworICByZXR1cm4gb3B0c3RyaW5nOworfQorDAorLyogU2NhbiBlbGVtZW50cyBvZiBBUkdWICh3aG9zZSBsZW5ndGggaXMgQVJHQykgZm9yIG9wdGlvbiBjaGFyYWN0ZXJzCisgICBnaXZlbiBpbiBPUFRTVFJJTkcuCisKKyAgIElmIGFuIGVsZW1lbnQgb2YgQVJHViBzdGFydHMgd2l0aCAnLScsIGFuZCBpcyBub3QgZXhhY3RseSAiLSIgb3IgIi0tIiwKKyAgIHRoZW4gaXQgaXMgYW4gb3B0aW9uIGVsZW1lbnQuICBUaGUgY2hhcmFjdGVycyBvZiB0aGlzIGVsZW1lbnQKKyAgIChhc2lkZSBmcm9tIHRoZSBpbml0aWFsICctJykgYXJlIG9wdGlvbiBjaGFyYWN0ZXJzLiAgSWYgYGdldG9wdCcKKyAgIGlzIGNhbGxlZCByZXBlYXRlZGx5LCBpdCByZXR1cm5zIHN1Y2Nlc3NpdmVseSBlYWNoIG9mIHRoZSBvcHRpb24gY2hhcmFjdGVycworICAgZnJvbSBlYWNoIG9mIHRoZSBvcHRpb24gZWxlbWVudHMuCisKKyAgIElmIGBnZXRvcHQnIGZpbmRzIGFub3RoZXIgb3B0aW9uIGNoYXJhY3RlciwgaXQgcmV0dXJucyB0aGF0IGNoYXJhY3RlciwKKyAgIHVwZGF0aW5nIGBvcHRpbmQnIGFuZCBgbmV4dGNoYXInIHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBgZ2V0b3B0JyBjYW4KKyAgIHJlc3VtZSB0aGUgc2NhbiB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGNoYXJhY3RlciBvciBBUkdWLWVsZW1lbnQuCisKKyAgIElmIHRoZXJlIGFyZSBubyBtb3JlIG9wdGlvbiBjaGFyYWN0ZXJzLCBgZ2V0b3B0JyByZXR1cm5zIC0xLgorICAgVGhlbiBgb3B0aW5kJyBpcyB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3QgQVJHVi1lbGVtZW50CisgICB0aGF0IGlzIG5vdCBhbiBvcHRpb24uICAoVGhlIEFSR1YtZWxlbWVudHMgaGF2ZSBiZWVuIHBlcm11dGVkCisgICBzbyB0aGF0IHRob3NlIHRoYXQgYXJlIG5vdCBvcHRpb25zIG5vdyBjb21lIGxhc3QuKQorCisgICBPUFRTVFJJTkcgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbGVnaXRpbWF0ZSBvcHRpb24gY2hhcmFjdGVycy4KKyAgIElmIGFuIG9wdGlvbiBjaGFyYWN0ZXIgaXMgc2VlbiB0aGF0IGlzIG5vdCBsaXN0ZWQgaW4gT1BUU1RSSU5HLAorICAgcmV0dXJuICc/JyBhZnRlciBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlLiAgSWYgeW91IHNldCBgb3B0ZXJyJyB0bworICAgemVybywgdGhlIGVycm9yIG1lc3NhZ2UgaXMgc3VwcHJlc3NlZCBidXQgd2Ugc3RpbGwgcmV0dXJuICc/Jy4KKworICAgSWYgYSBjaGFyIGluIE9QVFNUUklORyBpcyBmb2xsb3dlZCBieSBhIGNvbG9uLCB0aGF0IG1lYW5zIGl0IHdhbnRzIGFuIGFyZywKKyAgIHNvIHRoZSBmb2xsb3dpbmcgdGV4dCBpbiB0aGUgc2FtZSBBUkdWLWVsZW1lbnQsIG9yIHRoZSB0ZXh0IG9mIHRoZSBmb2xsb3dpbmcKKyAgIEFSR1YtZWxlbWVudCwgaXMgcmV0dXJuZWQgaW4gYG9wdGFyZycuICBUd28gY29sb25zIG1lYW4gYW4gb3B0aW9uIHRoYXQKKyAgIHdhbnRzIGFuIG9wdGlvbmFsIGFyZzsgaWYgdGhlcmUgaXMgdGV4dCBpbiB0aGUgY3VycmVudCBBUkdWLWVsZW1lbnQsCisgICBpdCBpcyByZXR1cm5lZCBpbiBgb3B0YXJnJywgb3RoZXJ3aXNlIGBvcHRhcmcnIGlzIHNldCB0byB6ZXJvLgorCisgICBJZiBPUFRTVFJJTkcgc3RhcnRzIHdpdGggYC0nIG9yIGArJywgaXQgcmVxdWVzdHMgZGlmZmVyZW50IG1ldGhvZHMgb2YKKyAgIGhhbmRsaW5nIHRoZSBub24tb3B0aW9uIEFSR1YtZWxlbWVudHMuCisgICBTZWUgdGhlIGNvbW1lbnRzIGFib3V0IFJFVFVSTl9JTl9PUkRFUiBhbmQgUkVRVUlSRV9PUkRFUiwgYWJvdmUuCisKKyAgIExvbmctbmFtZWQgb3B0aW9ucyBiZWdpbiB3aXRoIGAtLScgaW5zdGVhZCBvZiBgLScuCisgICBUaGVpciBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQgYXMgbG9uZyBhcyB0aGUgYWJicmV2aWF0aW9uIGlzIHVuaXF1ZQorICAgb3IgaXMgYW4gZXhhY3QgbWF0Y2ggZm9yIHNvbWUgZGVmaW5lZCBvcHRpb24uICBJZiB0aGV5IGhhdmUgYW4KKyAgIGFyZ3VtZW50LCBpdCBmb2xsb3dzIHRoZSBvcHRpb24gbmFtZSBpbiB0aGUgc2FtZSBBUkdWLWVsZW1lbnQsIHNlcGFyYXRlZAorICAgZnJvbSB0aGUgb3B0aW9uIG5hbWUgYnkgYSBgPScsIG9yIGVsc2UgdGhlIGluIG5leHQgQVJHVi1lbGVtZW50LgorICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhIGxvbmctbmFtZWQgb3B0aW9uLCBpdCByZXR1cm5zIDAgaWYgdGhhdCBvcHRpb24ncworICAgYGZsYWcnIGZpZWxkIGlzIG5vbnplcm8sIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uJ3MgYHZhbCcgZmllbGQKKyAgIGlmIHRoZSBgZmxhZycgZmllbGQgaXMgemVyby4KKworICAgVGhlIGVsZW1lbnRzIG9mIEFSR1YgYXJlbid0IHJlYWxseSBjb25zdCwgYmVjYXVzZSB3ZSBwZXJtdXRlIHRoZW0uCisgICBCdXQgd2UgcHJldGVuZCB0aGV5J3JlIGNvbnN0IGluIHRoZSBwcm90b3R5cGUgdG8gYmUgY29tcGF0aWJsZQorICAgd2l0aCBvdGhlciBzeXN0ZW1zLgorCisgICBMT05HT1BUUyBpcyBhIHZlY3RvciBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbgorICAgZWxlbWVudCBjb250YWluaW5nIGEgbmFtZSB3aGljaCBpcyB6ZXJvLgorCisgICBMT05HSU5EIHJldHVybnMgdGhlIGluZGV4IGluIExPTkdPUFQgb2YgdGhlIGxvbmctbmFtZWQgb3B0aW9uIGZvdW5kLgorICAgSXQgaXMgb25seSB2YWxpZCB3aGVuIGEgbG9uZy1uYW1lZCBvcHRpb24gaGFzIGJlZW4gZm91bmQgYnkgdGhlIG1vc3QKKyAgIHJlY2VudCBjYWxsLgorCisgICBJZiBMT05HX09OTFkgaXMgbm9uemVybywgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW50cm9kdWNlCisgICBsb25nLW5hbWVkIG9wdGlvbnMuICAqLworCitpbnQKK19nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywgbG9uZ29wdHMsIGxvbmdpbmQsIGxvbmdfb25seSkKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmNvbnN0ICphcmd2OworICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmc7CisgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOworICAgICBpbnQgKmxvbmdpbmQ7CisgICAgIGludCBsb25nX29ubHk7Cit7CisgIG9wdGFyZyA9IE5VTEw7CisKKyAgaWYgKG9wdGluZCA9PSAwIHx8ICFfX2dldG9wdF9pbml0aWFsaXplZCkKKyAgICB7CisgICAgICBpZiAob3B0aW5kID09IDApCisJb3B0aW5kID0gMTsJLyogRG9uJ3Qgc2NhbiBBUkdWWzBdLCB0aGUgcHJvZ3JhbSBuYW1lLiAgKi8KKyAgICAgIG9wdHN0cmluZyA9IF9nZXRvcHRfaW5pdGlhbGl6ZSAoYXJnYywgYXJndiwgb3B0c3RyaW5nKTsKKyAgICAgIF9fZ2V0b3B0X2luaXRpYWxpemVkID0gMTsKKyAgICB9CisKKyAgLyogVGVzdCB3aGV0aGVyIEFSR1Zbb3B0aW5kXSBwb2ludHMgdG8gYSBub24tb3B0aW9uIGFyZ3VtZW50LgorICAgICBFaXRoZXIgaXQgZG9lcyBub3QgaGF2ZSBvcHRpb24gc3ludGF4LCBvciB0aGVyZSBpcyBhbiBlbnZpcm9ubWVudCBmbGFnCisgICAgIGZyb20gdGhlIHNoZWxsIGluZGljYXRpbmcgaXQgaXMgbm90IGFuIG9wdGlvbi4gIFRoZSBsYXRlciBpbmZvcm1hdGlvbgorICAgICBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgdXNlZCBpbiB0aGUgR05VIGxpYmMuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBOT05PUFRJT05fUCAoYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJwkgICAgICBcCisJCSAgICAgIHx8IChvcHRpbmQgPCBub25vcHRpb25fZmxhZ3NfbGVuCQkJICAgICAgXAorCQkJICAmJiBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3Nbb3B0aW5kXSA9PSAnMScpKQorI2Vsc2UKKyMgZGVmaW5lIE5PTk9QVElPTl9QIChhcmd2W29wdGluZF1bMF0gIT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnXDAnKQorI2VuZGlmCisKKyAgaWYgKG5leHRjaGFyID09IE5VTEwgfHwgKm5leHRjaGFyID09ICdcMCcpCisgICAgeworICAgICAgLyogQWR2YW5jZSB0byB0aGUgbmV4dCBBUkdWLWVsZW1lbnQuICAqLworCisgICAgICAvKiBHaXZlIEZJUlNUX05PTk9QVCAmIExBU1RfTk9OT1BUIHJhdGlvbmFsIHZhbHVlcyBpZiBPUFRJTkQgaGFzIGJlZW4KKwkgbW92ZWQgYmFjayBieSB0aGUgdXNlciAod2hvIG1heSBhbHNvIGhhdmUgY2hhbmdlZCB0aGUgYXJndW1lbnRzKS4gICovCisgICAgICBpZiAobGFzdF9ub25vcHQgPiBvcHRpbmQpCisJbGFzdF9ub25vcHQgPSBvcHRpbmQ7CisgICAgICBpZiAoZmlyc3Rfbm9ub3B0ID4gb3B0aW5kKQorCWZpcnN0X25vbm9wdCA9IG9wdGluZDsKKworICAgICAgaWYgKG9yZGVyaW5nID09IFBFUk1VVEUpCisJeworCSAgLyogSWYgd2UgaGF2ZSBqdXN0IHByb2Nlc3NlZCBzb21lIG9wdGlvbnMgZm9sbG93aW5nIHNvbWUgbm9uLW9wdGlvbnMsCisJICAgICBleGNoYW5nZSB0aGVtIHNvIHRoYXQgdGhlIG9wdGlvbnMgY29tZSBmaXJzdC4gICovCisKKwkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gb3B0aW5kKQorCSAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOworCSAgZWxzZSBpZiAobGFzdF9ub25vcHQgIT0gb3B0aW5kKQorCSAgICBmaXJzdF9ub25vcHQgPSBvcHRpbmQ7CisKKwkgIC8qIFNraXAgYW55IGFkZGl0aW9uYWwgbm9uLW9wdGlvbnMKKwkgICAgIGFuZCBleHRlbmQgdGhlIHJhbmdlIG9mIG5vbi1vcHRpb25zIHByZXZpb3VzbHkgc2tpcHBlZC4gICovCisKKwkgIHdoaWxlIChvcHRpbmQgPCBhcmdjICYmIE5PTk9QVElPTl9QKQorCSAgICBvcHRpbmQrKzsKKwkgIGxhc3Rfbm9ub3B0ID0gb3B0aW5kOworCX0KKworICAgICAgLyogVGhlIHNwZWNpYWwgQVJHVi1lbGVtZW50IGAtLScgbWVhbnMgcHJlbWF0dXJlIGVuZCBvZiBvcHRpb25zLgorCSBTa2lwIGl0IGxpa2UgYSBudWxsIG9wdGlvbiwKKwkgdGhlbiBleGNoYW5nZSB3aXRoIHByZXZpb3VzIG5vbi1vcHRpb25zIGFzIGlmIGl0IHdlcmUgYW4gb3B0aW9uLAorCSB0aGVuIHNraXAgZXZlcnl0aGluZyBlbHNlIGxpa2UgYSBub24tb3B0aW9uLiAgKi8KKworICAgICAgaWYgKG9wdGluZCAhPSBhcmdjICYmICFzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0tIikpCisJeworCSAgb3B0aW5kKys7CisKKwkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gb3B0aW5kKQorCSAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOworCSAgZWxzZSBpZiAoZmlyc3Rfbm9ub3B0ID09IGxhc3Rfbm9ub3B0KQorCSAgICBmaXJzdF9ub25vcHQgPSBvcHRpbmQ7CisJICBsYXN0X25vbm9wdCA9IGFyZ2M7CisKKwkgIG9wdGluZCA9IGFyZ2M7CisJfQorCisgICAgICAvKiBJZiB3ZSBoYXZlIGRvbmUgYWxsIHRoZSBBUkdWLWVsZW1lbnRzLCBzdG9wIHRoZSBzY2FuCisJIGFuZCBiYWNrIG92ZXIgYW55IG5vbi1vcHRpb25zIHRoYXQgd2Ugc2tpcHBlZCBhbmQgcGVybXV0ZWQuICAqLworCisgICAgICBpZiAob3B0aW5kID09IGFyZ2MpCisJeworCSAgLyogU2V0IHRoZSBuZXh0LWFyZy1pbmRleCB0byBwb2ludCBhdCB0aGUgbm9uLW9wdGlvbnMKKwkgICAgIHRoYXQgd2UgcHJldmlvdXNseSBza2lwcGVkLCBzbyB0aGUgY2FsbGVyIHdpbGwgZGlnZXN0IHRoZW0uICAqLworCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCkKKwkgICAgb3B0aW5kID0gZmlyc3Rfbm9ub3B0OworCSAgcmV0dXJuIC0xOworCX0KKworICAgICAgLyogSWYgd2UgaGF2ZSBjb21lIHRvIGEgbm9uLW9wdGlvbiBhbmQgZGlkIG5vdCBwZXJtdXRlIGl0LAorCSBlaXRoZXIgc3RvcCB0aGUgc2NhbiBvciBkZXNjcmliZSBpdCB0byB0aGUgY2FsbGVyIGFuZCBwYXNzIGl0IGJ5LiAgKi8KKworICAgICAgaWYgKE5PTk9QVElPTl9QKQorCXsKKwkgIGlmIChvcmRlcmluZyA9PSBSRVFVSVJFX09SREVSKQorCSAgICByZXR1cm4gLTE7CisJICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgLyogV2UgaGF2ZSBmb3VuZCBhbm90aGVyIG9wdGlvbi1BUkdWLWVsZW1lbnQuCisJIFNraXAgdGhlIGluaXRpYWwgcHVuY3R1YXRpb24uICAqLworCisgICAgICBuZXh0Y2hhciA9IChhcmd2W29wdGluZF0gKyAxCisJCSAgKyAobG9uZ29wdHMgIT0gTlVMTCAmJiBhcmd2W29wdGluZF1bMV0gPT0gJy0nKSk7CisgICAgfQorCisgIC8qIERlY29kZSB0aGUgY3VycmVudCBvcHRpb24tQVJHVi1lbGVtZW50LiAgKi8KKworICAvKiBDaGVjayB3aGV0aGVyIHRoZSBBUkdWLWVsZW1lbnQgaXMgYSBsb25nIG9wdGlvbi4KKworICAgICBJZiBsb25nX29ubHkgYW5kIHRoZSBBUkdWLWVsZW1lbnQgaGFzIHRoZSBmb3JtICItZiIsIHdoZXJlIGYgaXMKKyAgICAgYSB2YWxpZCBzaG9ydCBvcHRpb24sIGRvbid0IGNvbnNpZGVyIGl0IGFuIGFiYnJldmlhdGVkIGZvcm0gb2YKKyAgICAgYSBsb25nIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGYuICBPdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KKyAgICAgd2F5IHRvIGdpdmUgdGhlIC1mIHNob3J0IG9wdGlvbi4KKworICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUncyBhIGxvbmcgb3B0aW9uICJmdWJhciIgYW5kCisgICAgIHRoZSBBUkdWLWVsZW1lbnQgaXMgIi1mdSIsIGRvIGNvbnNpZGVyIHRoYXQgYW4gYWJicmV2aWF0aW9uIG9mCisgICAgIHRoZSBsb25nIG9wdGlvbiwganVzdCBsaWtlICItLWZ1IiwgYW5kIG5vdCAiLWYiIHdpdGggYXJnICJ1Ii4KKworICAgICBUaGlzIGRpc3RpbmN0aW9uIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHVzZWZ1bCBhcHByb2FjaC4gICovCisKKyAgaWYgKGxvbmdvcHRzICE9IE5VTEwKKyAgICAgICYmIChhcmd2W29wdGluZF1bMV0gPT0gJy0nCisJICB8fCAobG9uZ19vbmx5ICYmIChhcmd2W29wdGluZF1bMl0gfHwgIW15X2luZGV4IChvcHRzdHJpbmcsIGFyZ3Zbb3B0aW5kXVsxXSkpKSkpCisgICAgeworICAgICAgY2hhciAqbmFtZWVuZDsKKyAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnA7CisgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpwZm91bmQgPSBOVUxMOworICAgICAgaW50IGV4YWN0ID0gMDsKKyAgICAgIGludCBhbWJpZyA9IDA7CisgICAgICBpbnQgaW5kZm91bmQgPSAtMTsKKyAgICAgIGludCBvcHRpb25faW5kZXg7CisKKyAgICAgIGZvciAobmFtZWVuZCA9IG5leHRjaGFyOyAqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnPSc7IG5hbWVlbmQrKykKKwkvKiBEbyBub3RoaW5nLiAgKi8gOworCisgICAgICAvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAorCSBvciBhYmJyZXZpYXRlZCBtYXRjaGVzLiAgKi8KKyAgICAgIGZvciAocCA9IGxvbmdvcHRzLCBvcHRpb25faW5kZXggPSAwOyBwLT5uYW1lOyBwKyssIG9wdGlvbl9pbmRleCsrKQorCWlmICghc3RybmNtcCAocC0+bmFtZSwgbmV4dGNoYXIsIG5hbWVlbmQgLSBuZXh0Y2hhcikpCisJICB7CisJICAgIGlmICgodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKQorCQk9PSAodW5zaWduZWQgaW50KSBzdHJsZW4gKHAtPm5hbWUpKQorCSAgICAgIHsKKwkJLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLworCQlwZm91bmQgPSBwOworCQlpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKKwkJZXhhY3QgPSAxOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHBmb3VuZCA9PSBOVUxMKQorCSAgICAgIHsKKwkJLyogRmlyc3Qgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLworCQlwZm91bmQgPSBwOworCQlpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICAvKiBTZWNvbmQgb3IgbGF0ZXIgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLworCSAgICAgIGFtYmlnID0gMTsKKwkgIH0KKworICAgICAgaWYgKGFtYmlnICYmICFleGFjdCkKKwl7CisJICBpZiAob3B0ZXJyKQorCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYCVzJyBpcyBhbWJpZ3VvdXNcbiIpLAorCQkgICAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXSk7CisJICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKwkgIG9wdGluZCsrOworCSAgb3B0b3B0ID0gMDsKKwkgIHJldHVybiAnPyc7CisJfQorCisgICAgICBpZiAocGZvdW5kICE9IE5VTEwpCisJeworCSAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7CisJICBvcHRpbmQrKzsKKwkgIGlmICgqbmFtZWVuZCkKKwkgICAgeworCSAgICAgIC8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAorCQkgYWxsb3cgaXQgdG8gYmUgdXNlZCBvbiBlbnVtcy4gICovCisJICAgICAgaWYgKHBmb3VuZC0+aGFzX2FyZykKKwkJb3B0YXJnID0gbmFtZWVuZCArIDE7CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKG9wdGVycikKKwkJICAgIHsKKwkJICAgICAgaWYgKGFyZ3Zbb3B0aW5kIC0gMV1bMV0gPT0gJy0nKQorCQkJLyogLS1vcHRpb24gKi8KKwkJCWZwcmludGYgKHN0ZGVyciwKKwkJCQkgXygiJXM6IG9wdGlvbiBgLS0lcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCisJCQkJIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7CisJCSAgICAgIGVsc2UKKwkJCS8qICtvcHRpb24gb3IgLW9wdGlvbiAqLworCQkJZnByaW50ZiAoc3RkZXJyLAorCQkJCSBfKCIlczogb3B0aW9uIGAlYyVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKKwkJCQkgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXVswXSwgcGZvdW5kLT5uYW1lKTsKKworCQkgICAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKworCQkgICAgICBvcHRvcHQgPSBwZm91bmQtPnZhbDsKKwkJICAgICAgcmV0dXJuICc/JzsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChwZm91bmQtPmhhc19hcmcgPT0gMSkKKwkgICAgeworCSAgICAgIGlmIChvcHRpbmQgPCBhcmdjKQorCQlvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAob3B0ZXJyKQorCQkgICAgZnByaW50ZiAoc3RkZXJyLAorCQkJICAgXygiJXM6IG9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSwKKwkJCSAgIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kIC0gMV0pOworCQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworCQkgIG9wdG9wdCA9IHBmb3VuZC0+dmFsOworCQkgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOworCQl9CisJICAgIH0KKwkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworCSAgaWYgKGxvbmdpbmQgIT0gTlVMTCkKKwkgICAgKmxvbmdpbmQgPSBvcHRpb25faW5kZXg7CisJICBpZiAocGZvdW5kLT5mbGFnKQorCSAgICB7CisJICAgICAgKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIHJldHVybiBwZm91bmQtPnZhbDsKKwl9CisKKyAgICAgIC8qIENhbid0IGZpbmQgaXQgYXMgYSBsb25nIG9wdGlvbi4gIElmIHRoaXMgaXMgbm90IGdldG9wdF9sb25nX29ubHksCisJIG9yIHRoZSBvcHRpb24gc3RhcnRzIHdpdGggJy0tJyBvciBpcyBub3QgYSB2YWxpZCBzaG9ydAorCSBvcHRpb24sIHRoZW4gaXQncyBhbiBlcnJvci4KKwkgT3RoZXJ3aXNlIGludGVycHJldCBpdCBhcyBhIHNob3J0IG9wdGlvbi4gICovCisgICAgICBpZiAoIWxvbmdfb25seSB8fCBhcmd2W29wdGluZF1bMV0gPT0gJy0nCisJICB8fCBteV9pbmRleCAob3B0c3RyaW5nLCAqbmV4dGNoYXIpID09IE5VTEwpCisJeworCSAgaWYgKG9wdGVycikKKwkgICAgeworCSAgICAgIGlmIChhcmd2W29wdGluZF1bMV0gPT0gJy0nKQorCQkvKiAtLW9wdGlvbiAqLworCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIGAtLSVzJ1xuIiksCisJCQkgYXJndlswXSwgbmV4dGNoYXIpOworCSAgICAgIGVsc2UKKwkJLyogK29wdGlvbiBvciAtb3B0aW9uICovCisJCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCBvcHRpb24gYCVjJXMnXG4iKSwKKwkJCSBhcmd2WzBdLCBhcmd2W29wdGluZF1bMF0sIG5leHRjaGFyKTsKKwkgICAgfQorCSAgbmV4dGNoYXIgPSAoY2hhciAqKSAiIjsKKwkgIG9wdGluZCsrOworCSAgb3B0b3B0ID0gMDsKKwkgIHJldHVybiAnPyc7CisJfQorICAgIH0KKworICAvKiBMb29rIGF0IGFuZCBoYW5kbGUgdGhlIG5leHQgc2hvcnQgb3B0aW9uLWNoYXJhY3Rlci4gICovCisKKyAgeworICAgIGNoYXIgYyA9ICpuZXh0Y2hhcisrOworICAgIGNoYXIgKnRlbXAgPSBteV9pbmRleCAob3B0c3RyaW5nLCBjKTsKKworICAgIC8qIEluY3JlbWVudCBgb3B0aW5kJyB3aGVuIHdlIHN0YXJ0IHRvIHByb2Nlc3MgaXRzIGxhc3QgY2hhcmFjdGVyLiAgKi8KKyAgICBpZiAoKm5leHRjaGFyID09ICdcMCcpCisgICAgICArK29wdGluZDsKKworICAgIGlmICh0ZW1wID09IE5VTEwgfHwgYyA9PSAnOicpCisgICAgICB7CisJaWYgKG9wdGVycikKKwkgIHsKKwkgICAgaWYgKHBvc2l4bHlfY29ycmVjdCkKKwkgICAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiksCisJCSAgICAgICBhcmd2WzBdLCBjKTsKKwkgICAgZWxzZQorCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgb3B0aW9uIC0tICVjXG4iKSwKKwkJICAgICAgIGFyZ3ZbMF0sIGMpOworCSAgfQorCW9wdG9wdCA9IGM7CisJcmV0dXJuICc/JzsKKyAgICAgIH0KKyAgICAvKiBDb252ZW5pZW5jZS4gVHJlYXQgUE9TSVggLVcgZm9vIHNhbWUgYXMgbG9uZyBvcHRpb24gLS1mb28gKi8KKyAgICBpZiAodGVtcFswXSA9PSAnVycgJiYgdGVtcFsxXSA9PSAnOycpCisgICAgICB7CisJY2hhciAqbmFtZWVuZDsKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uICpwOworCWNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7CisJaW50IGV4YWN0ID0gMDsKKwlpbnQgYW1iaWcgPSAwOworCWludCBpbmRmb3VuZCA9IDA7CisJaW50IG9wdGlvbl9pbmRleDsKKworCS8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQuICAqLworCWlmICgqbmV4dGNoYXIgIT0gJ1wwJykKKwkgIHsKKwkgICAgb3B0YXJnID0gbmV4dGNoYXI7CisJICAgIC8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAorCSAgICAgICB3ZSBtdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudCBub3cuICAqLworCSAgICBvcHRpbmQrKzsKKwkgIH0KKwllbHNlIGlmIChvcHRpbmQgPT0gYXJnYykKKwkgIHsKKwkgICAgaWYgKG9wdGVycikKKwkgICAgICB7CisJCS8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLworCQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIpLAorCQkJIGFyZ3ZbMF0sIGMpOworCSAgICAgIH0KKwkgICAgb3B0b3B0ID0gYzsKKwkgICAgaWYgKG9wdHN0cmluZ1swXSA9PSAnOicpCisJICAgICAgYyA9ICc6JzsKKwkgICAgZWxzZQorCSAgICAgIGMgPSAnPyc7CisJICAgIHJldHVybiBjOworCSAgfQorCWVsc2UKKwkgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYG9wdGluZCcgb25jZTsKKwkgICAgIGluY3JlbWVudCBpdCBhZ2FpbiB3aGVuIHRha2luZyBuZXh0IEFSR1YtZWx0IGFzIGFyZ3VtZW50LiAgKi8KKwkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOworCisJLyogb3B0YXJnIGlzIG5vdyB0aGUgYXJndW1lbnQsIHNlZSBpZiBpdCdzIGluIHRoZQorCSAgIHRhYmxlIG9mIGxvbmdvcHRzLiAgKi8KKworCWZvciAobmV4dGNoYXIgPSBuYW1lZW5kID0gb3B0YXJnOyAqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnPSc7IG5hbWVlbmQrKykKKwkgIC8qIERvIG5vdGhpbmcuICAqLyA7CisKKwkvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAorCSAgIG9yIGFiYnJldmlhdGVkIG1hdGNoZXMuICAqLworCWZvciAocCA9IGxvbmdvcHRzLCBvcHRpb25faW5kZXggPSAwOyBwLT5uYW1lOyBwKyssIG9wdGlvbl9pbmRleCsrKQorCSAgaWYgKCFzdHJuY21wIChwLT5uYW1lLCBuZXh0Y2hhciwgbmFtZWVuZCAtIG5leHRjaGFyKSkKKwkgICAgeworCSAgICAgIGlmICgodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKSA9PSBzdHJsZW4gKHAtPm5hbWUpKQorCQl7CisJCSAgLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLworCQkgIHBmb3VuZCA9IHA7CisJCSAgaW5kZm91bmQgPSBvcHRpb25faW5kZXg7CisJCSAgZXhhY3QgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgICAgZWxzZSBpZiAocGZvdW5kID09IE5VTEwpCisJCXsKKwkJICAvKiBGaXJzdCBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCisJCSAgcGZvdW5kID0gcDsKKwkJICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKKwkJfQorCSAgICAgIGVsc2UKKwkJLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKwkJYW1iaWcgPSAxOworCSAgICB9CisJaWYgKGFtYmlnICYmICFleGFjdCkKKwkgIHsKKwkgICAgaWYgKG9wdGVycikKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYC1XICVzJyBpcyBhbWJpZ3VvdXNcbiIpLAorCQkgICAgICAgYXJndlswXSwgYXJndltvcHRpbmRdKTsKKwkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisJICAgIG9wdGluZCsrOworCSAgICByZXR1cm4gJz8nOworCSAgfQorCWlmIChwZm91bmQgIT0gTlVMTCkKKwkgIHsKKwkgICAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7CisJICAgIGlmICgqbmFtZWVuZCkKKwkgICAgICB7CisJCS8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAorCQkgICBhbGxvdyBpdCB0byBiZSB1c2VkIG9uIGVudW1zLiAgKi8KKwkJaWYgKHBmb3VuZC0+aGFzX2FyZykKKwkJICBvcHRhcmcgPSBuYW1lZW5kICsgMTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGlmIChvcHRlcnIpCisJCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiXAorJXM6IG9wdGlvbiBgLVcgJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAorCQkJICAgICAgIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7CisKKwkJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworCQkgICAgcmV0dXJuICc/JzsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlIGlmIChwZm91bmQtPmhhc19hcmcgPT0gMSkKKwkgICAgICB7CisJCWlmIChvcHRpbmQgPCBhcmdjKQorCQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOworCQllbHNlCisJCSAgeworCQkgICAgaWYgKG9wdGVycikKKwkJICAgICAgZnByaW50ZiAoc3RkZXJyLAorCQkJICAgICAgIF8oIiVzOiBvcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiksCisJCQkgICAgICAgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXSk7CisJCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKwkJICAgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOworCQkgIH0KKwkgICAgICB9CisJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworCSAgICBpZiAobG9uZ2luZCAhPSBOVUxMKQorCSAgICAgICpsb25naW5kID0gb3B0aW9uX2luZGV4OworCSAgICBpZiAocGZvdW5kLT5mbGFnKQorCSAgICAgIHsKKwkJKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7CisJCXJldHVybiAwOworCSAgICAgIH0KKwkgICAgcmV0dXJuIHBmb3VuZC0+dmFsOworCSAgfQorCSAgbmV4dGNoYXIgPSBOVUxMOworCSAgcmV0dXJuICdXJzsJLyogTGV0IHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgaXQuICAgKi8KKyAgICAgIH0KKyAgICBpZiAodGVtcFsxXSA9PSAnOicpCisgICAgICB7CisJaWYgKHRlbXBbMl0gPT0gJzonKQorCSAgeworCSAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IGFjY2VwdHMgYW4gYXJndW1lbnQgb3B0aW9uYWxseS4gICovCisJICAgIGlmICgqbmV4dGNoYXIgIT0gJ1wwJykKKwkgICAgICB7CisJCW9wdGFyZyA9IG5leHRjaGFyOworCQlvcHRpbmQrKzsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBvcHRhcmcgPSBOVUxMOworCSAgICBuZXh0Y2hhciA9IE5VTEw7CisJICB9CisJZWxzZQorCSAgeworCSAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50LiAgKi8KKwkgICAgaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQorCSAgICAgIHsKKwkJb3B0YXJnID0gbmV4dGNoYXI7CisJCS8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAorCQkgICB3ZSBtdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudCBub3cuICAqLworCQlvcHRpbmQrKzsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKG9wdGluZCA9PSBhcmdjKQorCSAgICAgIHsKKwkJaWYgKG9wdGVycikKKwkJICB7CisJCSAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KKwkJICAgIGZwcmludGYgKHN0ZGVyciwKKwkJCSAgIF8oIiVzOiBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gJWNcbiIpLAorCQkJICAgYXJndlswXSwgYyk7CisJCSAgfQorCQlvcHRvcHQgPSBjOworCQlpZiAob3B0c3RyaW5nWzBdID09ICc6JykKKwkJICBjID0gJzonOworCQllbHNlCisJCSAgYyA9ICc/JzsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICAvKiBXZSBhbHJlYWR5IGluY3JlbWVudGVkIGBvcHRpbmQnIG9uY2U7CisJCSBpbmNyZW1lbnQgaXQgYWdhaW4gd2hlbiB0YWtpbmcgbmV4dCBBUkdWLWVsdCBhcyBhcmd1bWVudC4gICovCisJICAgICAgb3B0YXJnID0gYXJndltvcHRpbmQrK107CisJICAgIG5leHRjaGFyID0gTlVMTDsKKwkgIH0KKyAgICAgIH0KKyAgICByZXR1cm4gYzsKKyAgfQorfQorCitpbnQKK2dldG9wdCAoYXJnYywgYXJndiwgb3B0c3RyaW5nKQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqY29uc3QgKmFyZ3Y7CisgICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKK3sKKyAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywKKwkJCSAgIChjb25zdCBzdHJ1Y3Qgb3B0aW9uICopIDAsCisJCQkgICAoaW50ICopIDAsCisJCQkgICAwKTsKK30KKworI2VuZGlmCS8qIE5vdCBFTElERV9DT0RFLiAgKi8KKwwKKyNpZmRlZiBURVNUCisKKy8qIENvbXBpbGUgd2l0aCAtRFRFU1QgdG8gbWFrZSBhbiBleGVjdXRhYmxlIGZvciB1c2UgaW4gdGVzdGluZworICAgdGhlIGFib3ZlIGRlZmluaXRpb24gb2YgYGdldG9wdCcuICAqLworCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGM7CisgIGludCBkaWdpdF9vcHRpbmQgPSAwOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBvcHRpbmQgPyBvcHRpbmQgOiAxOworCisgICAgICBjID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAiYWJjOmQ6MDEyMzQ1Njc4OSIpOworICAgICAgaWYgKGMgPT0gLTEpCisJYnJlYWs7CisKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJICBpZiAoZGlnaXRfb3B0aW5kICE9IDAgJiYgZGlnaXRfb3B0aW5kICE9IHRoaXNfb3B0aW9uX29wdGluZCkKKwkgICAgcHJpbnRmICgiZGlnaXRzIG9jY3VyIGluIHR3byBkaWZmZXJlbnQgYXJndi1lbGVtZW50cy5cbiIpOworCSAgZGlnaXRfb3B0aW5kID0gdGhpc19vcHRpb25fb3B0aW5kOworCSAgcHJpbnRmICgib3B0aW9uICVjXG4iLCBjKTsKKwkgIGJyZWFrOworCisJY2FzZSAnYSc6CisJICBwcmludGYgKCJvcHRpb24gYVxuIik7CisJICBicmVhazsKKworCWNhc2UgJ2InOgorCSAgcHJpbnRmICgib3B0aW9uIGJcbiIpOworCSAgYnJlYWs7CisKKwljYXNlICdjJzoKKwkgIHByaW50ZiAoIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnPyc6CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBwcmludGYgKCI/PyBnZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKKwl9CisgICAgfQorCisgIGlmIChvcHRpbmQgPCBhcmdjKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7CisgICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykKKwlwcmludGYgKCIlcyAiLCBhcmd2W29wdGluZCsrXSk7CisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KKworICBleGl0ICgwKTsKK30KKworI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRvcHQxLmMgYi9saWJpYmVydHkvZ2V0b3B0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjU3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvZ2V0b3B0MS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBnZXRvcHRfbG9uZyBhbmQgZ2V0b3B0X2xvbmdfb25seSBlbnRyeSBwb2ludHMgZm9yIEdOVSBnZXRvcHQuCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTgKKyAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCisgICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisMCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXRvcHQuaCIKKworI2lmICFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXworLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCisgICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLworI2lmbmRlZiBjb25zdAorI2RlZmluZSBjb25zdAorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAorICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZi4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQworICAgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZworICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCisgICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QgZmlsZXMsCisgICBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCisKKyNkZWZpbmUgR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OIDIKKyNpZiAhZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBfX0dMSUJDX18gPj0gMgorI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgorI2lmIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OID09IEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgorI2RlZmluZSBFTElERV9DT0RFCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVMSURFX0NPREUKKworCisvKiBUaGlzIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgc29tZSBsaWJyYXJ5ICNpbmNsdWRlCisgICB0byBnZXQgX19HTlVfTElCUkFSWV9fIGRlZmluZWQuICAqLworI2lmZGVmIF9fR05VX0xJQlJBUllfXworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZm5kZWYJTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCitpbnQKK2dldG9wdF9sb25nIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCkKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmNvbnN0ICphcmd2OworICAgICBjb25zdCBjaGFyICpvcHRpb25zOworICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnM7CisgICAgIGludCAqb3B0X2luZGV4OworeworICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgsIDApOworfQorCisvKiBMaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4KKyAgIElmIGFuIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoICctJyAobm90ICctLScpIGRvZXNuJ3QgbWF0Y2ggYSBsb25nIG9wdGlvbiwKKyAgIGJ1dCBkb2VzIG1hdGNoIGEgc2hvcnQgb3B0aW9uLCBpdCBpcyBwYXJzZWQgYXMgYSBzaG9ydCBvcHRpb24KKyAgIGluc3RlYWQuICAqLworCitpbnQKK2dldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqY29uc3QgKmFyZ3Y7CisgICAgIGNvbnN0IGNoYXIgKm9wdGlvbnM7CisgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9uczsKKyAgICAgaW50ICpvcHRfaW5kZXg7Cit7CisgIHJldHVybiBfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCwgMSk7Cit9CisKKworI2VuZGlmCS8qIE5vdCBFTElERV9DT0RFLiAgKi8KKwwKKyNpZmRlZiBURVNUCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGM7CisgIGludCBkaWdpdF9vcHRpbmQgPSAwOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBvcHRpbmQgPyBvcHRpbmQgOiAxOworICAgICAgaW50IG9wdGlvbl9pbmRleCA9IDA7CisgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9CisgICAgICB7CisJeyJhZGQiLCAxLCAwLCAwfSwKKwl7ImFwcGVuZCIsIDAsIDAsIDB9LAorCXsiZGVsZXRlIiwgMSwgMCwgMH0sCisJeyJ2ZXJib3NlIiwgMCwgMCwgMH0sCisJeyJjcmVhdGUiLCAwLCAwLCAwfSwKKwl7ImZpbGUiLCAxLCAwLCAwfSwKKwl7MCwgMCwgMCwgMH0KKyAgICAgIH07CisKKyAgICAgIGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFiYzpkOjAxMjM0NTY3ODkiLAorCQkgICAgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKyAgICAgIGlmIChjID09IC0xKQorCWJyZWFrOworCisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgMDoKKwkgIHByaW50ZiAoIm9wdGlvbiAlcyIsIGxvbmdfb3B0aW9uc1tvcHRpb25faW5kZXhdLm5hbWUpOworCSAgaWYgKG9wdGFyZykKKwkgICAgcHJpbnRmICgiIHdpdGggYXJnICVzIiwgb3B0YXJnKTsKKwkgIHByaW50ZiAoIlxuIik7CisJICBicmVhazsKKworCWNhc2UgJzAnOgorCWNhc2UgJzEnOgorCWNhc2UgJzInOgorCWNhc2UgJzMnOgorCWNhc2UgJzQnOgorCWNhc2UgJzUnOgorCWNhc2UgJzYnOgorCWNhc2UgJzcnOgorCWNhc2UgJzgnOgorCWNhc2UgJzknOgorCSAgaWYgKGRpZ2l0X29wdGluZCAhPSAwICYmIGRpZ2l0X29wdGluZCAhPSB0aGlzX29wdGlvbl9vcHRpbmQpCisJICAgIHByaW50ZiAoImRpZ2l0cyBvY2N1ciBpbiB0d28gZGlmZmVyZW50IGFyZ3YtZWxlbWVudHMuXG4iKTsKKwkgIGRpZ2l0X29wdGluZCA9IHRoaXNfb3B0aW9uX29wdGluZDsKKwkgIHByaW50ZiAoIm9wdGlvbiAlY1xuIiwgYyk7CisJICBicmVhazsKKworCWNhc2UgJ2EnOgorCSAgcHJpbnRmICgib3B0aW9uIGFcbiIpOworCSAgYnJlYWs7CisKKwljYXNlICdiJzoKKwkgIHByaW50ZiAoIm9wdGlvbiBiXG4iKTsKKwkgIGJyZWFrOworCisJY2FzZSAnYyc6CisJICBwcmludGYgKCJvcHRpb24gYyB3aXRoIHZhbHVlIGAlcydcbiIsIG9wdGFyZyk7CisJICBicmVhazsKKworCWNhc2UgJ2QnOgorCSAgcHJpbnRmICgib3B0aW9uIGQgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlICc/JzoKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHByaW50ZiAoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOworCX0KKyAgICB9CisKKyAgaWYgKG9wdGluZCA8IGFyZ2MpCisgICAgeworICAgICAgcHJpbnRmICgibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKKyAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQorCXByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgfQorCisgIGV4aXQgKDApOworfQorCisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMgYi9saWJpYmVydHkvZ2V0cGFnZXNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjRkNmMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMKQEAgLTAsMCArMSw5NiBAQAorLyogRW11bGF0aW9uIG9mIGdldHBhZ2VzaXplKCkgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIGl0LiAqLworCisvKgorCitOQU1FCisKKwlnZXRwYWdlc2l6ZSAtLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBwYWdlIG9mIG1lbW9yeQorCitTWU5PUFNJUworCisJaW50IGdldHBhZ2VzaXplICh2b2lkKQorCitERVNDUklQVElPTgorCisJUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgcGFnZSBvZiBtZW1vcnkuICBUaGlzIGlzIHRoZQorCWdyYW51bGFyaXR5IG9mIG1hbnkgb2YgdGhlIHN5c3RlbSBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcy4KKwlObyBndWFyYW50ZWUgaXMgbWFkZSBhcyB0byB3aGV0aGVyIG9yIG5vdCBpdCBpcyB0aGUgc2FtZSBhcyB0aGUKKwliYXNpYyBtZW1vcnkgbWFuYWdlbWVudCBoYXJkd2FyZSBwYWdlIHNpemUuCisKK0JVR1MKKworCUlzIGludGVuZGVkIGFzIGEgcmVhc29uYWJsZSByZXBsYWNlbWVudCBmb3Igc3lzdGVtcyB3aGVyZSB0aGlzCisJaXMgbm90IHByb3ZpZGVkIGFzIGEgc3lzdGVtIGNhbGwuICBUaGUgdmFsdWUgb2YgNDA5NiBtYXkgb3IgbWF5CisJbm90IGJlIGNvcnJlY3QgZm9yIHRoZSBzeXN0ZW1zIHdoZXJlIGl0IGlzIHJldHVybmVkIGFzIHRoZSBkZWZhdWx0CisJdmFsdWUuCisKKyovCisKKyNpZm5kZWYgVk1TCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjdW5kZWYgR05VX09VUl9QQUdFU0laRQorI2lmIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgJiYgZGVmaW5lZCAoSEFWRV9VTklTVERfSCkKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBfU0NfUEFHRVNJWkUKKyNkZWZpbmUgR05VX09VUl9QQUdFU0laRSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgR05VX09VUl9QQUdFU0laRQorIyBpZmRlZglQQUdFU0laRQorIyAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgUEFHRVNJWkUKKyMgZWxzZQkvKiBubyBQQUdFU0laRSAqLworIyAgaWZkZWYJRVhFQ19QQUdFU0laRQorIyAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIEVYRUNfUEFHRVNJWkUKKyMgIGVsc2UJLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgIGlmZGVmCU5CUEcKKyMgICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgKE5CUEcgKiBDTFNJWkUpCisjICAgIGlmbmRlZglDTFNJWkUKKyMgICAgIGRlZmluZQlDTFNJWkUgMQorIyAgICBlbmRpZgkvKiBDTFNJWkUgKi8KKyMgICBlbHNlCS8qIG5vIE5CUEcgKi8KKyMgICAgaWZkZWYJTkJQQworIyAgICAgZGVmaW5lCUdOVV9PVVJfUEFHRVNJWkUgTkJQQworIyAgICBlbHNlCS8qIG5vIE5CUEMgKi8KKyMgICAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIDQwOTYJLyogSnVzdCBwdW50IGFuZCB1c2UgcmVhc29uYWJsZSB2YWx1ZSAqLworIyAgICBlbmRpZiAvKiBOQlBDICovCisjICAgZW5kaWYgLyogTkJQRyAqLworIyAgZW5kaWYgLyogRVhFQ19QQUdFU0laRSAqLworIyBlbmRpZiAvKiBQQUdFU0laRSAqLworI2VuZGlmIC8qIEdOVV9PVVJfUEFHRVNJWkUgKi8KKworaW50CitnZXRwYWdlc2l6ZSAoKQoreworICByZXR1cm4gKEdOVV9PVVJfUEFHRVNJWkUpOworfQorCisjZWxzZSAvKiBWTVMgKi8KKworI2lmIDAJLyogb2xkZXIgZGlzdHJpYnV0aW9ucyBvZiBnY2Mtdm1zIGFyZSBtaXNzaW5nIDxzeWlkZWYuaD4gKi8KKyNpbmNsdWRlIDxzeWlkZWYuaD4KKyNlbmRpZgorI2lmbmRlZiBTWUkkX1BBR0VfU0laRQkvKiBWTVMgVjUuNCBhbmQgZWFybGllciBkaWRuJ3QgaGF2ZSB0aGlzIHlldCAqLworI2RlZmluZSBTWUkkX1BBR0VfU0laRSA0NDUyCisjZW5kaWYKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxpYiRnZXRzeWkoY29uc3QgdW5zaWduZWQgc2hvcnQgKiwuLi4pOworCitpbnQgZ2V0cGFnZXNpemUgKCkKK3sKKyAgbG9uZyBwYWdzaXogPSAwTDsKKyAgdW5zaWduZWQgc2hvcnQgaXRtY29kID0gU1lJJF9QQUdFX1NJWkU7CisKKyAgKHZvaWQpIGxpYiRnZXRzeWkgKCZpdG1jb2QsICh2b2lkICopICZwYWdzaXopOworICBpZiAocGFnc2l6ID09IDBMKQorICAgIHBhZ3NpeiA9IDUxMkw7CS8qIFZBWCBkZWZhdWx0ICovCisgIHJldHVybiAoaW50KSBwYWdzaXo7Cit9CisKKyNlbmRpZiAvKiBWTVMgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9nZXRydW50aW1lLmMgYi9saWJpYmVydHkvZ2V0cnVudGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzA3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvZ2V0cnVudGltZS5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIFJldHVybiB0aW1lIHVzZWQgc28gZmFyLCBpbiBtaWNyb3NlY29uZHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KK0xpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisvKiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGdldCBlbGFwc2VkIGV4ZWN1dGlvbiB0aW1lOyB1bmZvcnR1bmF0ZWx5IG5vCisgICBzaW5nbGUgd2F5IGlzIGF2YWlsYWJsZSBmb3IgYWxsIGhvc3Qgc3lzdGVtcywgbm9yIGFyZSB0aGVyZSByZWxpYWJsZQorICAgd2F5cyB0byBmaW5kIG91dCB3aGljaCB3YXkgaXMgY29ycmVjdCBmb3IgYSBnaXZlbiBob3N0LiAqLworCisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9HRVRSVVNBR0UKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RJTUVTCisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisvKiBUaGlzIGlzIGEgZmFsbGJhY2s7IGlmIHdyb25nLCBpdCB3aWxsIGxpa2VseSBtYWtlIG9idmlvdXNseSB3cm9uZworICAgcmVzdWx0cy4gKi8KKworI2lmbmRlZiBDTE9DS1NfUEVSX1NFQworI2RlZmluZSBDTE9DS1NfUEVSX1NFQyAxCisjZW5kaWYKKworI2lmZGVmIF9TQ19DTEtfVENLCisjZGVmaW5lIEdOVV9IWiAgc3lzY29uZihfU0NfQ0xLX1RDSykKKyNlbHNlCisjaWZkZWYgSFoKKyNkZWZpbmUgR05VX0haICBIWgorI2Vsc2UKKyNpZmRlZiBDTE9DS1NfUEVSX1NFQworI2RlZmluZSBHTlVfSFogIENMT0NLU19QRVJfU0VDCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKK2xvbmcKK2dldF9ydW5fdGltZSAoKQoreworI2lmZGVmIEhBVkVfR0VUUlVTQUdFCisgIHN0cnVjdCBydXNhZ2UgcnVzYWdlOworCisgIGdldHJ1c2FnZSAoMCwgJnJ1c2FnZSk7CisgIHJldHVybiAocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfdXRpbWUudHZfdXNlYworCSAgKyBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV9zdGltZS50dl91c2VjKTsKKyNlbHNlIC8qICEgSEFWRV9HRVRSVVNBR0UgKi8KKyNpZmRlZiBIQVZFX1RJTUVTCisgIHN0cnVjdCB0bXMgdG1zOworCisgIHRpbWVzICgmdG1zKTsKKyAgcmV0dXJuICh0bXMudG1zX3V0aW1lICsgdG1zLnRtc19zdGltZSkgKiAoMTAwMDAwMCAvIEdOVV9IWik7CisjZWxzZSAvKiAhIEhBVkVfVElNRVMgKi8KKyAgLyogRmFsbCBiYWNrIG9uIGNsb2NrIGFuZCBob3BlIGl0J3MgY29ycmVjdGx5IGltcGxlbWVudGVkLiAqLworICBjb25zdCBsb25nIGNsb2Nrc19wZXJfc2VjID0gQ0xPQ0tTX1BFUl9TRUM7CisgIGlmIChjbG9ja3NfcGVyX3NlYyA8PSAxMDAwMDAwKQorICAgIHJldHVybiBjbG9jayAoKSAqICgxMDAwMDAwIC8gY2xvY2tzX3Blcl9zZWMpOworICBlbHNlCisgICAgcmV0dXJuIGNsb2NrICgpIC8gY2xvY2tzX3Blcl9zZWM7CisjZW5kaWYgIC8qIEhBVkVfVElNRVMgKi8KKyNlbmRpZiAgLyogSEFWRV9HRVRSVVNBR0UgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9oZXguYyBiL2xpYmliZXJ0eS9oZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJlZWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L2hleC5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIEhleCBjaGFyYWN0ZXIgbWFuaXB1bGF0aW9uIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KK0xpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKK2NoYXIgX2hleF92YWx1ZVtfaGV4X2FycmF5X3NpemVdOworCit2b2lkIGhleF9pbml0ICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgX2hleF9hcnJheV9zaXplOyBpKyspCisgICAgX2hleF92YWx1ZVtpXSA9IF9oZXhfYmFkOworICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICBfaGV4X3ZhbHVlWycwJyArIGldID0gaTsKKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICBfaGV4X3ZhbHVlWydhJyArIGldID0gX2hleF92YWx1ZVsnQScgKyBpXSA9IDEwICsgaTsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9pbmRleC5jIGIvbGliaWJlcnR5L2luZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhMDBmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9pbmRleC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgKG9ic29sZXRlKSBpbmRleCgpLiAqLworCitleHRlcm4gY2hhciAqIHN0cmNocigpOworCitjaGFyICoKK2luZGV4IChzLCBjKQorICBjaGFyICpzOworICBpbnQgYzsKK3sKKyAgcmV0dXJuIHN0cmNociAocywgYyk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvaW5zcXVlLmMgYi9saWJpYmVydHkvaW5zcXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1MDE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9pbnNxdWUuYwpAQCAtMCwwICsxLDUwIEBACisvKiBpbnNxdWUoM0MpIHJvdXRpbmVzCisgICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLworCisvKgorTkFNRQorCWluc3F1ZSwgcmVtcXVlIC0tIGluc2VydCwgcmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHF1ZXVlCisKK1NZTk9QU0lTCisJc3RydWN0IHFlbGVtIHsKKwkgIHN0cnVjdCBxZWxlbSAqcV9mb3J3OworCSAgc3RydWN0IHFlbGVtICpxX2JhY2s7CisJICBjaGFyIHFfZGF0YVtdOworCX07CisKKwl2b2lkIGluc3F1ZSAoc3RydWN0IHFlbGVtICplbGVtLCBzdHJ1Y3QgcWVsZW0gKnByZWQpCisKKwl2b2lkIHJlbXF1ZSAoc3RydWN0IHFlbGVtICplbGVtKQorCitERVNDUklQVElPTgorCVJvdXRpbmVzIHRvIG1hbmlwdWxhdGUgcXVldWVzIGJ1aWx0IGZyb20gZG91Ymx5IGxpbmtlZCBsaXN0cy4KKwlUaGUgaW5zcXVlIHJvdXRpbmUgaW5zZXJ0cyBFTEVNIGluIHRoZSBxdWV1ZSBpbW1lZGlhdGVseSBhZnRlcgorCVBSRUQuICBUaGUgcmVtcXVlIHJvdXRpbmUgcmVtb3ZlcyBFTEVNIGZyb20gaXRzIGNvbnRhaW5pbmcgcXVldWUuCisqLworCisKK3N0cnVjdCBxZWxlbSB7CisgIHN0cnVjdCBxZWxlbSAqcV9mb3J3OworICBzdHJ1Y3QgcWVsZW0gKnFfYmFjazsKK307CisKKwordm9pZAoraW5zcXVlIChlbGVtLCBwcmVkKQorICBzdHJ1Y3QgcWVsZW0gKmVsZW07CisgIHN0cnVjdCBxZWxlbSAqcHJlZDsKK3sKKyAgZWxlbSAtPiBxX2ZvcncgPSBwcmVkIC0+IHFfZm9ydzsKKyAgcHJlZCAtPiBxX2ZvcncgLT4gcV9iYWNrID0gZWxlbTsKKyAgZWxlbSAtPiBxX2JhY2sgPSBwcmVkOworICBwcmVkIC0+IHFfZm9ydyA9IGVsZW07Cit9CisKKwordm9pZAorcmVtcXVlIChlbGVtKQorICBzdHJ1Y3QgcWVsZW0gKmVsZW07Cit7CisgIGVsZW0gLT4gcV9mb3J3IC0+IHFfYmFjayA9IGVsZW0gLT4gcV9iYWNrOworICBlbGVtIC0+IHFfYmFjayAtPiBxX2ZvcncgPSBlbGVtIC0+IHFfZm9ydzsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tYWtlZmlsZS5kb3MgYi9saWJpYmVydHkvbWFrZWZpbGUuZG9zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmE2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvbWFrZWZpbGUuZG9zCkBAIC0wLDAgKzEsMjkgQEAKK0NGTEFHUz0tTzIKKworT0JKUyA9IFwKKwlhcmd2Lm8gXAorCWJhc2VuYW1lLm8gXAorCWNvbmNhdC5vIFwKKwljcGx1cy1kZW0ubyBcCisJZmRtYXRjaC5vIFwKKwlmbG9hdGZvcm1hdC5vIFwKKwlnZXRvcHQubyBcCisJZ2V0b3B0MS5vIFwKKwlnZXRydW50aW1lLm8gXAorCWhleC5vIFwKKwltc2Rvcy5vIFwKKwlvYnN0YWNrLm8gXAorCXNwYWNlcy5vIFwKKwlzdHJlcnJvci5vIFwKKwlzdHJzaWduYWwubyBcCisJeGF0ZXhpdC5vIFwKKwl4ZXhpdC5vIFwKKwl4bWFsbG9jLm8gXAorCSRFCisKKy5jLm86CisJZ2NjIC1JLi4vaW5jbHVkZSAkKENGTEFHUykgLWMgJDwKKworbGliaWJlcnR5LmEgOiAkKE9CSlMpCisJLXJtIGxpYmliZXJ0eS5hCisJYXIgcnZzIGxpYmliZXJ0eS5hICQoT0JKUykKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMgYi9saWJpYmVydHkvbWFrZWZpbGUudm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvbWFrZWZpbGUudm1zCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSB1bmRlciBvcGVuVk1TL0FscGhhCisjCisjIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCisjCisjIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQorIworIworCitPQkpTPWJjb3B5Lm9iaixiY21wLm9iaixnZXRvcHQub2JqLG9ic3RhY2sub2JqLHhleGl0Lm9iaix4bWFsbG9jLm9iaixoZXgub2JqLFwKKyAgIGdldG9wdDEub2JqLGNwbHVzLWRlbS5vYmosc3RybmNhc2VjbXAub2JqLHN0cmNhc2VjbXAub2JqLHN0cmR1cC5vYmosXAorICAgY29uY2F0Lm9iaixnZXRydW50aW1lLm9iaixnZXRwYWdlc2l6ZS5vYmosYWxsb2NhLm9iaix4c3RyZXJyb3Iub2JqLFwKKyAgIHhzdHJkdXAub2JqLHhhdGV4aXQub2JqLGNob29zZS10ZW1wLm9iaixmbm1hdGNoLm9iaixvYmphbGxvYy5vYmoKKworaWZlcSAoJChDQyksZ2NjKQorQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkKK2Vsc2UKKyMgYXNzdW1lIGRlYyBjCitDRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKS9kZWZpbmU9KCJjb25zdD0iKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYykKK2VuZGlmCisKK2xpYmliZXJ0eS5vbGI6IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChPQkpTKQorCXB1cmdlCisJbGliL2NyZWF0ZSBsaWJpYmVydHkgKi5vYmoKKworY29uZmlnLmg6IGNvbmZpZy5oLXZtcworCSQoQ1ApICQ8ICRACisKK2NsZWFuOgorCSQkIHB1cmdlCisJJChSTSkgY29uZmlnLmg7CisJJChSTSkgKi5vYmo7CisJJChSTSkgbGliaWJlcnR5Lm9sYjsKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jaHIuYyBiL2xpYmliZXJ0eS9tZW1jaHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2UzMDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L21lbWNoci5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCitGVU5DVElPTgorCTw8bWVtY2hyPj4tLS1maW5kIGNoYXJhY3RlciBpbiBtZW1vcnkKKworSU5ERVgKKwltZW1jaHIKKworQU5TSV9TWU5PUFNJUworCSNpbmNsdWRlIDxzdHJpbmcuaD4KKwl2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqPFtzcmNdPiwgaW50IDxbY10+LCBzaXplX3QgPFtsZW5ndGhdPik7CisKK1RSQURfU1lOT1BTSVMKKwkjaW5jbHVkZSA8c3RyaW5nLmg+CisJdm9pZCAqbWVtY2hyKDxbc3JjXT4sIDxbY10+LCA8W2xlbmd0aF0+KQorCXZvaWQgKjxbc3JjXT47CisJdm9pZCAqPFtjXT47CisJc2l6ZV90IDxbbGVuZ3RoXT47CisKK0RFU0NSSVBUSU9OCisJVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBtZW1vcnkgc3RhcnRpbmcgYXQgPDwqPFtzcmNdPj4+IGZvciB0aGUKKwljaGFyYWN0ZXIgPFtjXT4uICBUaGUgc2VhcmNoIG9ubHkgZW5kcyB3aXRoIHRoZSBmaXJzdAorCW9jY3VycmVuY2Ugb2YgPFtjXT4sIG9yIGFmdGVyIDxbbGVuZ3RoXT4gY2hhcmFjdGVyczsgaW4KKwlwYXJ0aWN1bGFyLCA8PE5VTEw+PiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIHNlYXJjaC4KKworUkVUVVJOUworCUlmIHRoZSBjaGFyYWN0ZXIgPFtjXT4gaXMgZm91bmQgd2l0aGluIDxbbGVuZ3RoXT4gY2hhcmFjdGVycworCW9mIDw8Kjxbc3JjXT4+PiwgYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQuIElmCisJPFtjXT4gaXMgbm90IGZvdW5kLCB0aGVuIDw8TlVMTD4+IGlzIHJldHVybmVkLiAJCisKK1BPUlRBQklMSVRZCis8PG1lbWNocj4+ICByZXF1aXJlcyBubyBzdXBwb3J0aW5nIE9TIHN1YnJvdXRpbmVzLgorCitRVUlDS1JFRgorCW1lbWNociBhbnNpIHB1cmUKKworKi8KKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCisjZW5kaWYKKworUFRSCittZW1jaHIgKHNyY192b2lkLCBjLCBsZW5ndGgpCisgICAgIHJlZ2lzdGVyIGNvbnN0IFBUUiBzcmNfdm9pZDsKKyAgICAgaW50IGM7CisgICAgIHNpemVfdCBsZW5ndGg7Cit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3JjX3ZvaWQ7CisgIAorICB3aGlsZSAoLS1sZW5ndGggPj0gMCkKKyAgeworICAgIGlmICgqc3JjID09IGMpCisgICAgIHJldHVybiAoUFRSKXNyYzsKKyAgICBzcmMrKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jbXAuYyBiL2xpYmliZXJ0eS9tZW1jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdhZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L21lbWNtcC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIG1lbWNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLworCisvKgorTkFNRQorCW1lbWNtcCAtLSBjb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucworCitTWU5PUFNJUworCWludCBtZW1jbXAgKGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvLCBzaXplX3QgY291bnQpCisKK0RFU0NSSVBUSU9OCisJQ29tcGFyZSB0d28gbWVtb3J5IHJlZ2lvbnMgYW5kIHJldHVybiBsZXNzIHRoYW4sCisJZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLCBhY2NvcmRpbmcgdG8gbGV4aWNvZ3JhcGhpY2FsCisJb3JkZXJpbmcgb2YgdGhlIGNvbXBhcmVkIHJlZ2lvbnMuCisqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCitpbnQKK0RFRlVOKG1lbWNtcCwgKHN0cjEsIHN0cjIsIGNvdW50KSwKKyAgICAgIGNvbnN0IFBUUiBzdHIxIEFORCBjb25zdCBQVFIgc3RyMiBBTkQgc2l6ZV90IGNvdW50KQoreworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzMSA9ICh1bnNpZ25lZCBjaGFyKilzdHIxOworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzMiA9ICh1bnNpZ25lZCBjaGFyKilzdHIyOworCisgIHdoaWxlIChjb3VudC0tID4gMCkKKyAgICB7CisgICAgICBpZiAoKnMxKysgIT0gKnMyKyspCisJICByZXR1cm4gczFbLTFdIDwgczJbLTFdID8gLTEgOiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jcHkuYyBiL2xpYmliZXJ0eS9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdhOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L21lbWNweS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIG1lbWNweSAodGhlIHN0YW5kYXJkIEMgZnVuY3Rpb24pCisgICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KKworLyoKK05BTUUKKwltZW1jcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKKworU1lOT1BTSVMKKwl2b2lkKiBtZW1jcHkgKHZvaWQgKm91dCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBuKTsKKworREVTQ1JJUFRJT04KKwlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKKwlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCisqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCitQVFIKK0RFRlVOKG1lbWNweSwgKG91dCwgaW4sIGxlbmd0aCksIFBUUiBvdXQgQU5EIGNvbnN0IFBUUiBpbiBBTkQgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBiY29weShpbiwgb3V0LCBsZW5ndGgpOworICAgIHJldHVybiBvdXQ7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtbW92ZS5jIGIvbGliaWJlcnR5L21lbW1vdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZjMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L21lbW1vdmUuYwpAQCAtMCwwICsxLDE4IEBACisvKiBXcmFwcGVyIHRvIGltcGxlbWVudCBBTlNJIEMncyBtZW1tb3ZlIHVzaW5nIEJTRCdzIGJjb3B5LiAqLworLyogVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tUGVyIEJvdGhuZXIuICovCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCitQVFIKK21lbW1vdmUgKHMxLCBzMiwgbikKKyAgICAgUFRSIHMxOworICAgICBjb25zdCBQVFIgczI7CisgICAgIHNpemVfdCBuOworeworICBiY29weSAoczIsIHMxLCBuKTsKKyAgcmV0dXJuIHMxOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbXNldC5jIGIvbGliaWJlcnR5L21lbXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNTQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvbWVtc2V0LmMKQEAgLTAsMCArMSwxOSBAQAorLyogbWVtc2V0CisgICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCisjZW5kaWYKKworUFRSCitERUZVTihtZW1zZXQsIChkZXN0LCB2YWwsIGxlbiksCisgICAgICBQVFIgZGVzdCBBTkQgcmVnaXN0ZXIgaW50IHZhbCBBTkQgcmVnaXN0ZXIgc2l6ZV90IGxlbikKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIqKWRlc3Q7CisgIHdoaWxlIChsZW4tLSA+IDApCisgICAgKnB0cisrID0gdmFsOworICByZXR1cm4gZGVzdDsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9ta3N0ZW1wcy5jIGIvbGliaWJlcnR5L21rc3RlbXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMTZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9ta3N0ZW1wcy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIG1rc3RlbXAuYyBmcm9tIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKy8qIFdlIG5lZWQgdG8gcHJvdmlkZSBhIHR5cGUgZm9yIGdjY191aW50NjRfdC4gICovCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGdjY191aW50NjRfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ2NjX3VpbnQ2NF90OworI2VuZGlmCisKKyNpZm5kZWYgVE1QX01BWAorI2RlZmluZSBUTVBfTUFYIDE2Mzg0CisjZW5kaWYKKworLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFLgorCisgICBURU1QTEFURSBoYXMgdGhlIGZvcm06CisKKyAgIDxwYXRoPi9jY1hYWFhYWDxzdWZmaXg+CisKKyAgIFNVRkZJWF9MRU4gdGVsbHMgdXMgaG93IGxvbmcgPHN1ZmZpeD4gaXMgKGl0IGNhbiBiZSB6ZXJvIGxlbmd0aCkuCisKKyAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIGJlZm9yZSA8c3VmZml4PiBtdXN0IGJlICJYWFhYWFgiOworICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCisKKyAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbiBvbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gICovCitpbnQKK21rc3RlbXBzICh0ZW1wbGF0ZSwgc3VmZml4X2xlbikKKyAgICAgY2hhciAqdGVtcGxhdGU7CisgICAgIGludCBzdWZmaXhfbGVuOworeworICBzdGF0aWMgY29uc3QgY2hhciBsZXR0ZXJzW10KKyAgICA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7CisgIHN0YXRpYyBnY2NfdWludDY0X3QgdmFsdWU7CisjaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisjZW5kaWYKKyAgY2hhciAqWFhYWFhYOworICBzaXplX3QgbGVuOworICBpbnQgY291bnQ7CisKKyAgbGVuID0gc3RybGVuICh0ZW1wbGF0ZSk7CisKKyAgaWYgKChpbnQpIGxlbiA8IDYgKyBzdWZmaXhfbGVuCisgICAgICB8fCBzdHJuY21wICgmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dLCAiWFhYWFhYIiwgNikpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBYWFhYWFggPSAmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dOworCisjaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKyAgLyogR2V0IHNvbWUgbW9yZSBvciBsZXNzIHJhbmRvbSBkYXRhLiAgKi8KKyAgZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOworICB2YWx1ZSArPSAoKGdjY191aW50NjRfdCkgdHYudHZfdXNlYyA8PCAxNikgXiB0di50dl9zZWMgXiBnZXRwaWQgKCk7CisjZWxzZQorICB2YWx1ZSArPSBnZXRwaWQgKCk7CisjZW5kaWYKKworICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBUTVBfTUFYOyArK2NvdW50KQorICAgIHsKKyAgICAgIGdjY191aW50NjRfdCB2ID0gdmFsdWU7CisgICAgICBpbnQgZmQ7CisKKyAgICAgIC8qIEZpbGwgaW4gdGhlIHJhbmRvbSBiaXRzLiAgKi8KKyAgICAgIFhYWFhYWFswXSA9IGxldHRlcnNbdiAlIDYyXTsKKyAgICAgIHYgLz0gNjI7CisgICAgICBYWFhYWFhbMV0gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgICB2IC89IDYyOworICAgICAgWFhYWFhYWzJdID0gbGV0dGVyc1t2ICUgNjJdOworICAgICAgdiAvPSA2MjsKKyAgICAgIFhYWFhYWFszXSA9IGxldHRlcnNbdiAlIDYyXTsKKyAgICAgIHYgLz0gNjI7CisgICAgICBYWFhYWFhbNF0gPSBsZXR0ZXJzW3YgJSA2Ml07CisgICAgICB2IC89IDYyOworICAgICAgWFhYWFhYWzVdID0gbGV0dGVyc1t2ICUgNjJdOworCisgICAgICBmZCA9IG9wZW4gKHRlbXBsYXRlLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOworICAgICAgaWYgKGZkID49IDApCisJLyogVGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuICAqLworCXJldHVybiBmZDsKKworICAgICAgLyogVGhpcyBpcyBhIHJhbmRvbSB2YWx1ZS4gIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdGhlIG5leHQKKwkgVE1QX01BWCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyA3Nzc3IHRvIFZBTFVFIGFyZSBkaWZmZXJlbnQKKwkgd2l0aCAobW9kdWxlIDJeMzIpLiAgKi8KKyAgICAgIHZhbHVlICs9IDc3Nzc7CisgICAgfQorCisgIC8qIFdlIHJldHVybiB0aGUgbnVsbCBzdHJpbmcgaWYgd2UgY2FuJ3QgZmluZCBhIHVuaXF1ZSBmaWxlIG5hbWUuICAqLworICB0ZW1wbGF0ZVswXSA9ICdcMCc7CisgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHctY29uZmlnLmluIGIvbGliaWJlcnR5L21wdy1jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyMTgwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9tcHctY29uZmlnLmluCkBAIC0wLDAgKzEsNyBAQAorIyBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgbGliaWJlcnR5LgorCitFY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldworCitNb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKKworCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LW1ha2Uuc2VkIGIvbGliaWJlcnR5L21wdy1tYWtlLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJhNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L21wdy1tYWtlLnNlZApAQCAtMCwwICsxLDUxIEBACisjIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgbGliaWJlcnR5J3MgVW5peCBtYWtlZmlsZSB0byBNUFcgc3ludGF4LgorCisjIENvbW1lbnQgb3V0IGEgdXNlbGVzcyB0aGluZy4KKy9eXC5hbHdheXNcLi9zL14vIy8KKworIyBSZXBsYWNlIHRoZSBhdXRvLWdlbmVyYXRlZCBsaXN0IHdpdGggdGhlIGxpc3Qgb2Ygd2hhdCB3ZSBrbm93IHdlIG5lZWQuCitzL2BjYXQgbmVlZGVkLWxpc3RgLyJ7b30iYWxsb2NhLmMubyAie299ImJjb3B5LmMubyAie299ImdldHBhZ2VzaXplLmMubyAie299Imluc3F1ZS5jLm8gIntvfSJtcHcuYy5vICJ7b30ic3RyY2FzZWNtcC5jLm8gIntvfSJzdHJkdXAuYy5vICJ7b30ic3RybmNhc2VjbXAuYy5vLworCisjIFBhc3RlIGluIHNvbWUgZGVzaXJhYmxlIGRlZmluaXRpb25zLgorIyBUaGUgZGVmYXVsdCBydWxlIGhlcmUgY29tcGxldGVseSByZXBsYWNlcyB0aGUgdHJpY2t5IHN0dWZmIGluIHRoZSBVbml4CisjIE1ha2VmaWxlLmluLgorL14jIyMkL2FcCitcCitIREVGSU5FUyA9IC1kIE5FRURfc3lzX3NpZ2xpc3QgLWQgTkVFRF9zeXNfZXJybGlzdCAtZCBORUVEX2Jhc2VuYW1lIC1kIE5FRURfc3RyY2FzZWNtcCAtZCBORUVEX3N0cm5jYXNlY21wXAorSU5DTFVERVMgPSAtaSA6IC1pIHtJTkNESVJ9OiAtaSB7SU5DRElSfTptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTogLWkgIntzfSJcCitcCisuYy5vIFxcT3B0aW9uLWYgLmNcCisJe0NDfSBAREFTSF9DX0ZMQUdAIHtEZXBEaXJ9e0RlZmF1bHR9LmMge0xJQkNGTEFHU30ge0lOQ0xVREVTfSB7SERFRklORVN9IEBTRUdNRU5UX0ZMQUcoe0RlZmF1bHR9KUAgLW8ge1RhcmdEaXJ9e0RlZmF1bHR9LmMub1wKKworIyBSZW1vdmUgZGVwZW5kZW5jeSBvbiBuZWVkZWQtbGlzdCwgd2hpY2ggd2UgZG9uJ3QgdXNlLgorL0RPX0FMU08gPS9zL25lZWRlZC1saXN0Ly8KKworL0lOQ0RJUj0vcy8ie3NyY2Rpcn0ie01VTFRJU1JDVE9QfTo6LyJ7dG9wc3JjZGlyfSIvCisKKyMgV2hhY2sgb3V0IHRoZSBDT01QSUxFLmMgdHJpY2tpbmVzcy4KKy9eQ09NUElMRS5jIC8sL14kL2QKKworIyBSZW1vdmUgdGhlIG11bHRpZG8gdHJpY2tpbmVzcyBmcm9tIHRoZSAiYWxsIiB0YXJnZXQuCisvXmFsbCBcXE9wdGlvbi1mLywvXiQvY1wKK2FsbCBcXE9wdGlvbi1mIHtUQVJHRVRMSUJ9XAorCisKKyMgUmVtb3ZlIHRoZSBSVUxFMS9SVUxFMiBjcnVkLgorL2lmIFxbLywvZmkvZAorL15SVUxFMSA9LywvUlVMRTIgPS9kCisvUlVMRTIvcy9SVUxFMi9UQVJHRVRMSUIvCisKKyMgRG9uJ3Qgd2FudCBmZG1hdGNoIGV2ZXIuCitzLyAie299ImZkbWF0Y2guYy5vLy8KKworIyBGaXggcGF0aHMgdG8gZ2VuZXJhdGVkIGZpbGVzLgorL2NvbmZpZy5oL3MvIntzfSJjb25maWcuaC8ie299ImNvbmZpZy5oLworCisjIFdoYWNrIG91dCBjb25maWcgcmVidWlsZCBydWxlcy4KKy9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy5jIGIvbGliaWJlcnR5L21wdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2FlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvbXB3LmMKQEAgLTAsMCArMSwxMDEwIEBACisvKiBNUFctVW5peCBjb21wYXRpYmlsaXR5IGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KK0xpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdW5kZXIgTVBXLiAqLworCisjaW5jbHVkZSAibXB3LmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmbmRlZiBVU0VfTVdfSEVBREVSUworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPFR5cGVzLmg+CisjaW5jbHVkZSA8RmlsZXMuaD4KKworI2luY2x1ZGUgPFRpbWVyLmg+CisKKy8qIEluaXRpYWxpemUgdG8gMCBhdCBmaXJzdCwgdGhlbiBzZXQgdG8gZXJybm9fbWF4KCkgbGF0ZXIuICAqLworCitpbnQgc3lzX25lcnIgPSAwOworCisvKiBEZWJ1ZyBmbGFnIGZvciBwYXRobmFtZSBoYWNraW5nLiAgU2V0IHRoaXMgdG8gb25lIGFuZCByZWJ1aWxkLiAqLworCitpbnQgRGVidWdQSSA9IC0xOworCit2b2lkCittcHdpZnlfZmlsZW5hbWUoY2hhciAqdW5peG5hbWUsIGNoYXIgKm1hY25hbWUpCit7CisgIGludCBpLCBqOworCisgIC8qIChzaG91bGQgdHJ1bmNhdGUgMjU1IGNoYXJzIGZyb20gZW5kIG9mIG5hbWUsIG5vdCBiZWdpbm5pbmcpICovCisgIGlmIChzdHJsZW4gKHVuaXhuYW1lKSA+IDI1NSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJQYXRobmFtZSBcIiVzXCIgaXMgdG9vIGxvbmcgZm9yIE1hY3MsIHRydW5jYXRpbmdcbiIsCisJICAgICAgIHVuaXhuYW1lKTsKKyAgICB9CisgIGogPSAwOworICAvKiBJZiB5b3UncmUgZ29pbmcgdG8gZW5kIHVwIHdpdGggb25lIG9yIG1vcmUgY29sb25zIGluIHRoZSBtaWRkbGUgb2YgYQorICAgICBwYXRoIGFmdGVyIGFuIGFsbC1Vbml4IHJlbGF0aXZlIHBhdGggaXMgdHJhbnNsYXRlZCwgeW91IG11c3QgYWRkIGEKKyAgICAgY29sb24gb24gdGhlIGZyb250LCBzbyB0aGF0IHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbm90IHRob3VnaHQgdG8gYmUKKyAgICAgYSBkaXNrIG5hbWUuICAqLworICBpZiAodW5peG5hbWVbMF0gIT0gJy8nICYmICEgc3RyY2hyICh1bml4bmFtZSwgJzonKSAmJiBzdHJjaHIgKHVuaXhuYW1lLCAnLycpKQorICAgIHsKKyAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKKyAgICB9CisgIGZvciAoaSA9IDA7IHVuaXhuYW1lW2ldICE9ICdcMCcgJiYgaSA8IDI1NTsgKytpKQorICAgIHsKKyAgICAgIGlmIChpID09IDAgJiYgdW5peG5hbWVbaV0gPT0gJy8nKQorCXsKKwkgIGlmIChzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEEgdGVtcG9yYXJ5IG5hbWUsIG1ha2UgYSBtb3JlIE1hYy1mbGF2b3JlZCB0bXBuYW1lLiAqLworCSAgICAgIC8qIEEgYmV0dGVyIGNob2ljZSB3b3VsZCBiZSB7Qm9vdH1UcmFzaDpmb28sIGJ1dAorCQkgdGhhdCB3b3VsZCByZXF1aXJlIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgdGhlCisJCSBib290IGRpc2sncyBhbmQgdHJhc2hjYW4ncyBuYW1lLiAgQW5vdGhlciBvcHRpb24KKwkJIHdvdWxkIGJlIHRvIGhhdmUgYW4gZW52IHZhciwgc28gdXNlciBjYW4gcG9pbnQgaXQKKwkJIGF0IGEgcmFtZGlzay4gKi8KKwkgICAgICBtYWNuYW1lW2orK10gPSAnOic7CisJICAgICAgbWFjbmFtZVtqKytdID0gJ3QnOworCSAgICAgIG1hY25hbWVbaisrXSA9ICdtJzsKKwkgICAgICBtYWNuYW1lW2orK10gPSAncCc7CisJICAgICAgbWFjbmFtZVtqKytdID0gJ18nOworCSAgICAgIGkgKz0gNDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRG9uJ3QgY29weSB0aGUgbGVhZGluZyBzbGFzaC4gKi8KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICc6JyAmJiB1bml4bmFtZVtpKzFdID09ICcvJykKKwl7CisJICBtYWNuYW1lW2orK10gPSAnOic7CisJICBpICs9IDE7CisJfQorICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQorCXsKKwkgIG1hY25hbWVbaisrXSA9ICc6JzsKKwkgIGkgKz0gMTsKKwl9CisgICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLicgJiYgdW5peG5hbWVbaSsyXSA9PSAnLycpCisJeworCSAgbWFjbmFtZVtqKytdID0gJzonOworCSAgbWFjbmFtZVtqKytdID0gJzonOworCSAgaSArPSAyOworCX0KKyAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcvJykKKwl7CisJICBtYWNuYW1lW2orK10gPSAnOic7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1hY25hbWVbaisrXSA9IHVuaXhuYW1lW2ldOworCX0KKyAgICB9CisgIG1hY25hbWVbal0gPSAnXDAnOworICAvKiBBbGxvdyBmb3IgZ2V0dGluZyB0aGUgZGVidWcgZmxhZyBmcm9tIGFuIGVudiB2YXI7IHF1aXRlIHVzZWZ1bC4gKi8KKyAgaWYgKERlYnVnUEkgPCAwKQorICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOworICBpZiAoRGVidWdQSSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIjIE1hZGUgXCIlc1wiXG4iLCB1bml4bmFtZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIjIGludG8gXCIlc1wiXG4iLCBtYWNuYW1lKTsKKyAgICB9Cit9CisKKy8qIE1QVy1mbGF2b3JlZCBiYXNlbmFtZSBmaW5kZXIuICovCisKK2NoYXIgKgorbXB3X2Jhc2VuYW1lIChuYW1lKQorICBjaGFyICpuYW1lOworeworICBjaGFyICpiYXNlID0gbmFtZTsKKworICB3aGlsZSAoKm5hbWUpCisgICAgeworICAgICAgaWYgKCpuYW1lKysgPT0gJzonKQorCXsKKwkgIGJhc2UgPSBuYW1lOworCX0KKyAgICB9CisgIHJldHVybiBiYXNlOworfQorCisvKiBNaXhlZCBNUFcvVW5peCBiYXNlbmFtZSBmaW5kZXIuICBUaGlzIGNhbiBiZSBsZWQgYXN0cmF5IGJ5CisgICBmaWxlbmFtZXMgd2l0aCBzbGFzaGVzIGluIHRoZW0gYW5kIGNvbWUgdXAgd2l0aCBhIGJhc2VuYW1lIHRoYXQKKyAgIGVpdGhlciBjb3JyZXNwb25kcyB0byBubyBmaWxlIG9yICh3b3JzZSkgdG8gc29tZSBvdGhlciBmaWxlLCBzbworICAgc2hvdWxkIG9ubHkgYmUgdHJpZWQgaWYgb3RoZXIgbWV0aG9kcyBvZiBmaW5kaW5nIGEgZmlsZSB2aWEgYQorICAgYmFzZW5hbWUgaGF2ZSBmYWlsZWQuICAqLworCitjaGFyICoKK21wd19taXhlZF9iYXNlbmFtZSAobmFtZSkKKyAgY2hhciAqbmFtZTsKK3sKKyAgY2hhciAqYmFzZSA9IG5hbWU7CisKKyAgd2hpbGUgKCpuYW1lKQorICAgIHsKKyAgICAgIGlmICgqbmFtZSA9PSAnLycgfHwgKm5hbWUgPT0gJzonKQorCXsKKwkgIGJhc2UgPSBuYW1lICsgMTsKKwl9CisgICAgICArK25hbWU7CisgICAgfQorICByZXR1cm4gYmFzZTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBmb3BlbigpIG1vZGlmaWVkIHRvIGNyZWF0ZSBmaWxlcyB0aGF0IGFyZSB0eXBlIFRFWFQKKyAgIG9yICdCSU4gJywgYW5kIGFsd2F5cyBvZiB0eXBlICdNUFMgJy4gICovCisKK0ZJTEUgKgorbXB3X2ZvcGVuIChjaGFyICpuYW1lLCBjaGFyICptb2RlKQoreworI3VuZGVmIGZvcGVuCisgIGludCBlcnJudW07CisgIEZJTEUgKmZwOworICBjaGFyIHRtcG5hbWVbMjU2XTsKKworICBtcHdpZnlfZmlsZW5hbWUgKG5hbWUsIHRtcG5hbWUpOworICBQUk9HUkVTUyAoMSk7CisgIGZwID0gZm9wZW4gKHRtcG5hbWUsIG1vZGUpOworICBlcnJudW0gPSBlcnJubzsKKworICAvKiBJZiB3cml0aW5nLCBuZWVkIHRvIHNldCB0eXBlIGFuZCBjcmVhdG9yIHVzZWZ1bGx5LiAqLworICBpZiAoc3RyY2hyIChtb2RlLCAndycpKQorICAgIHsKKyAgICAgIGNoYXIgKnBuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRtcG5hbWUpICsgMik7CisgICAgICBPU0VyciBlOworICAgICAgc3RydWN0IEZJbmZvIGZpOworCisgICAgICBwbmFtZVswXSA9IHN0cmxlbiAodG1wbmFtZSk7CisgICAgICBzdHJjcHkgKHBuYW1lKzEsIHRtcG5hbWUpOworCQorICAgICAgZSA9IEdldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7CisgICAgICAvKiBzaG91bGQgZG8gc3BpZmZpZXIgZXJyb3IgaGFuZGxpbmcgKi8KKyAgICAgIGlmIChlICE9IDApCisJZnByaW50ZihzdGRlcnIsICJHZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKKyAgICAgIGlmIChzdHJjaHIgKG1vZGUsICdiJykpCisJeworCSAgZmkuZmRUeXBlID0gKE9TVHlwZSkgJ0JJTiAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnVEVYVCc7CisJfQorICAgICAgZmkuZmRDcmVhdG9yID0gKE9TVHlwZSkgJ01QUyAnOworICAgICAgZSA9IFNldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7CisgICAgICBpZiAoZSAhPSAwKQorCWZwcmludGYoc3RkZXJyLCAiU2V0RkluZm8gcmV0dXJucyAlZFxuIiwgZSk7CisgICAgICBmcmVlIChwbmFtZSk7CisgICAgfQorICBpZiAoZnAgPT0gTlVMTCkKKyAgICBlcnJubyA9IGVycm51bTsKKyAgcmV0dXJuIGZwOworfQorCisvKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmc2VlaygpIG1vZGlmaWVkIHRvIGZpbGwgdGhlIGZpbGUgd2l0aCB6ZXJvcworICAgaWYgc2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgaXQuICAqLworCisjZGVmaW5lIFpFUk9CTEtTSVpFIDQwOTYKKworY2hhciB6ZXJvc1taRVJPQkxLU0laRV07CisKK2ludAorbXB3X2ZzZWVrIChGSUxFICpmcCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyN1bmRlZiBmc2VlaworICBpbnQgY3Vyc2l6ZSwgbnVtbGVmdDsKKworICBQUk9HUkVTUyAoMSk7CisgIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpCisgICAgeworICAgICAgZnNlZWsgKGZwLCAwLCBTRUVLX0VORCk7CisgICAgICBjdXJzaXplID0gZnRlbGwgKGZwKTsKKyAgICAgIGlmIChvZmZzZXQgPiBjdXJzaXplKQorCXsKKwkgIG51bWxlZnQgPSBvZmZzZXQgLSBjdXJzaXplOworCSAgd2hpbGUgKG51bWxlZnQgPiBaRVJPQkxLU0laRSkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgbWlnaHQgZmFpbCwgc2hvdWxkIGNoZWNrIGZvciB0aGF0LiAqLworCSAgICAgIFBST0dSRVNTICgxKTsKKwkgICAgICBmd3JpdGUgKHplcm9zLCAxLCBaRVJPQkxLU0laRSwgZnApOworCSAgICAgIG51bWxlZnQgLT0gWkVST0JMS1NJWkU7CisJICAgIH0KKwkgIFBST0dSRVNTICgxKTsKKwkgIGZ3cml0ZSAoemVyb3MsIDEsIG51bWxlZnQsIGZwKTsKKwkgIGZmbHVzaCAoZnApOworCX0KKyAgICB9CisgIHJldHVybiBmc2VlayAoZnAsIG9mZnNldCwgd2hlbmNlKTsKK30KKworaW50CittcHdfZnJlYWQgKGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBuaXRlbXMsIEZJTEUgKnN0cmVhbSkKK3sKKyN1bmRlZiBmcmVhZAorICBpbnQgcnNsdDsKKworICBQUk9HUkVTUyAoMSk7CisgIHJzbHQgPSBmcmVhZCAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7CisgIFBST0dSRVNTICgxKTsKKyAgcmV0dXJuIHJzbHQ7Cit9CisKK2ludAorbXB3X2Z3cml0ZSAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQoreworI3VuZGVmIGZ3cml0ZQorICBpbnQgcnNsdDsKKworICBQUk9HUkVTUyAoMSk7CisgIHJzbHQgPSBmd3JpdGUgKHB0ciwgc2l6ZSwgbml0ZW1zLCBzdHJlYW0pOworICBQUk9HUkVTUyAoMSk7CisgIHJldHVybiByc2x0OworfQorCitpbnQKK2xpbmsgKCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAibGluayBub3QgYXZhaWxhYmxlIVxuIik7CisgIG1wd19hYm9ydCAoKTsKK30KKworaW50Citmb3JrICgpCit7CisgIGZwcmludGYgKHN0ZGVyciwgImZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOworICBtcHdfYWJvcnQgKCk7Cit9CisKK2ludAordmZvcmsgKCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAidmZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOworICBtcHdfYWJvcnQgKCk7CisgIHJldHVybiAoLTEpOworfQorCitpbnQKK3BpcGUgKGludCAqZmQpCit7CisgIGZwcmludGYgKHN0ZGVyciwgInBpcGUgbm90IGF2YWlsYWJsZSFcbiIpOworICBtcHdfYWJvcnQgKCk7CisgIHJldHVybiAoLTEpOworfQorCisjaWZuZGVmIFVTRV9NV19IRUFERVJTCitpbnQKK2V4ZWN2cCAoY2hhciAqZmlsZSwgY2hhciAqKmFyZ3YpCit7CisgIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2cCBub3QgYXZhaWxhYmxlIVxuIik7CisgIG1wd19hYm9ydCAoKTsKKyAgcmV0dXJuICgtMSk7Cit9CisKK2ludAorZXhlY3YgKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2KQoreworICBmcHJpbnRmIChzdGRlcnIsICJleGVjdiBub3QgYXZhaWxhYmxlIVxuIik7CisgIG1wd19hYm9ydCAoKTsKKyAgcmV0dXJuICgtMSk7Cit9CisjZW5kaWYKKworaW50CitraWxsIChpbnQgcGlkLCBpbnQgc2lnKQoreworICBmcHJpbnRmIChzdGRlcnIsICJraWxsIG5vdCBhdmFpbGFibGUhXG4iKTsKKyAgbXB3X2Fib3J0ICgpOworICByZXR1cm4gKC0xKTsKK30KKworaW50Cit3YWl0IChpbnQgKnN0YXR1cykKK3sKKyAgKnN0YXR1cyA9IDA7CisgIHJldHVybiAwOworfQorCisjaWZuZGVmIFVTRV9NV19IRUFERVJTCitpbnQKK3NsZWVwIChpbnQgc2Vjb25kcykKK3sKKyAgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBub3c7CisKKyAgdGltZSAoJnN0YXJ0X3RpbWUpOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIFBST0dSRVNTICgxKTsKKyAgICAgIHRpbWUgKCZub3cpOworICAgICAgaWYgKG5vdyA+IHN0YXJ0X3RpbWUgKyBzZWNvbmRzKQorCXJldHVybiAwOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkCitwdXRlbnYgKGNoYXIgKnN0cikKK3sKKyAgLyogVGhlIEdDQyBkcml2ZXIgY2FsbHMgdGhpcyB0byBkbyB0aGluZ3MgZm9yIGNvbGxlY3QyLCBidXQgd2UKKyAgICAgZG9uJ3QgY2FyZSBhYm91dCBjb2xsZWN0Mi4gKi8KK30KKworaW50CitjaG1vZCAoY2hhciAqcGF0aCwgaW50IG1vZGUpCit7CisgIC8qIFByZXRlbmQgaXQgd2FzIGFsbCBPSy4gKi8KKyAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgVVNFX01XX0hFQURFUlMKK2ludAorZ2V0dWlkICgpCit7CisgIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorZ2V0Z2lkICgpCit7CisgIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogSW5zdGVhZCBvZiBjb3JlZHVtcGluZywgd2hpY2ggaXMgbm90IGEgbm9ybWFsIE1hYyBmYWNpbGl0eSwgd2UKKyAgIGRyb3AgaW50byBNYWNzYnVnLiAgSWYgd2UgdGhlbiAiZyIgZnJvbSBNYWNzYnVnLCB0aGUgcHJvZ3JhbSB3aWxsCisgICBleGl0IGNsZWFubHkuICovCisKK3ZvaWQKK21wd19hYm9ydCAoKQoreworICAvKiBNYWtlIHN1cmUgbm8gb3V0cHV0IHN0aWxsIGJ1ZmZlcmVkIHVwLCB0aGVuIHphcCBpbnRvIE1hY3NCdWcuICovCisgIGZmbHVzaChzdGRvdXQpOworICBmZmx1c2goc3RkZXJyKTsKKyAgcHJpbnRmKCIjIyBBYm9ydCEgIyNcbiIpOworI2lmZGVmIE1QV19TQURFCisgIFN5c0Vycm9yKDgwMDUpOworI2Vsc2UgCisgIERlYnVnZ2VyKCk7CisjZW5kaWYKKyAgLyogImciIGluIE1hY3NCdWcgd2lsbCB0aGVuIGNhdXNlIGEgcmVndWxhciBlcnJvciBleGl0LiAqLworICBleGl0ICgxKTsKK30KKworLyogSW1pdGF0aW9uIGdldHJ1c2FnZSBiYXNlZCBvbiB0aGUgQU5TSSBjbG9jaygpIGZ1bmN0aW9uLiAqLworCitpbnQKK2dldHJ1c2FnZSAoaW50IHdobywgc3RydWN0IHJ1c2FnZSAqcnVzYWdlKQoreworICBpbnQgY2xrID0gY2xvY2sgKCk7CisKKyNpZiAwCisgIHJ1c2FnZS0+cnVfdXRpbWUudHZfc2VjID0gY2xrIC8gQ0xPQ0tTX1BFUl9TRUM7CisgIHJ1c2FnZS0+cnVfdXRpbWUudHZfdXNlYyA9ICgoY2xrICogMTAwMCkgLyBDTE9DS1NfUEVSX1NFQykgKiAxMDAwOworICBydXNhZ2UtPnJ1X3N0aW1lLnR2X3NlYyA9IDA7CisgIHJ1c2FnZS0+cnVfc3RpbWUudHZfdXNlYyA9IDA7CisjZW5kaWYKK30KKworaW50CitzYnJrICgpCit7CisgIHJldHVybiAwOworfQorCisjaWZuZGVmIFVTRV9NV19IRUFERVJTCitpbnQKK2lzYXR0eSAoaW50IGZkKQoreworICByZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSBUaW1vdGh5IE11cnJheSdzIFBvc2l4IGxpYnJhcnkuICovCisKKyNpbmNsdWRlICJ1dGltZS5oIgorCitpbnQKK3V0aW1lIChjaGFyICpmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgKnRpbWVzKQoreworICBDSW5mb1BCUmVjIGNpcGJyOworICBIRmlsZUluZm8gKmZwYiA9IChIRmlsZUluZm8gKikgJmNpcGJyOworICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyAqKSAmY2lwYnI7CisgIHVuc2lnbmVkIGNoYXIgcG5hbWVbMjU2XTsKKyAgc2hvcnQgZXJyOworICAKKyAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgZmlsZW5hbWUpOworICBjMnBzdHIgKHBuYW1lKTsKKworICBkcGItPmlvRHJEaXJJRCA9IDBMOworICBmcGItPmlvTmFtZVB0ciA9IHBuYW1lOworICBmcGItPmlvVlJlZk51bSA9IDA7CisgIGZwYi0+aW9GRGlySW5kZXggPSAwOworICBmcGItPmlvRlZlcnNOdW0gPSAwOworICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7CisgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICBlcnJubyA9IEVOT0VOVDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZHBiLT5pb0RyRGlySUQgPSAwTDsKKyAgZnBiLT5pb0ZsTWREYXQgPSB0aW1lcy0+bW9kdGltZTsKKyAgZnBiLT5pb0ZsQ3JEYXQgPSB0aW1lcy0+YWN0aW1lOworICBlcnIgPSBQQlNldENhdEluZm8gKCZjaXBiciwgMCk7CisgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICBlcnJubyA9IEVBQ0NFUzsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbWtkaXIgKGNoYXIgKnBhdGgsIGludCBtb2RlKQoreworICBlcnJubyA9IEVOT1NZUzsKKyAgcmV0dXJuIC0xOworfQorCitpbnQKK3JtZGlyICgpCit7CisgIGVycm5vID0gRU5PU1lTOworICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKworY2hvd24gKCkKK3sKKyAgZXJybm8gPSBFTk9TWVM7CisgIHJldHVybiAtMTsKK30KKworY2hhciAqbXllbnZpcm9uW10gPSB7TlVMTH07CisKK2NoYXIgKiplbnZpcm9uID0gbXllbnZpcm9uOworCisjaWZuZGVmIFVTRV9NV19IRUFERVJTCisKKy8qIE1pbmltYWwgJ3N0YXQnIGVtdWxhdGlvbjogdGVsbHMgZGlyZWN0b3JpZXMgZnJvbSBmaWxlcyBhbmQKKyAgIGdpdmVzIGxlbmd0aCBhbmQgbXRpbWUuCisKKyAgIERlcml2ZWQgZnJvbSBjb2RlIHdyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bSwgQ1dJLCBBbXN0ZXJkYW0KKyAgIGFuZCBwbGFjZWQgYnkgaGltIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KKworZXh0ZXJuIGludCBfX3VpZCwgX19naWQ7CisKK2ludCBfX3VpZCA9IDA7CitpbnQgX19naWQgPSAwOworCisvKiBCaXRzIGluIGlvRmxBdHRyaWI6ICovCisjZGVmaW5lIExPQ0tCSVQJKDE8PDApCQkvKiBGaWxlIGxvY2tlZCAqLworI2RlZmluZSBESVJCSVQJKDE8PDQpCQkvKiBJdCdzIGEgZGlyZWN0b3J5ICovCisKKy8qIE1hY2lmaWVkICJzdGF0IiBpbiB3aGljaCBmaWxlbmFtZSBpcyBnaXZlbiByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSwKKyAgIHNwZWNpZmllZCBieSBsb25nIERpcklELiAgKi8KKworc3RhdGljIGludAorX3N0YXQgKGNoYXIgKm5hbWUsIGxvbmcgZGlyaWQsIHN0cnVjdCBzdGF0ICpidWYpCit7CisgIENJbmZvUEJSZWMgY2lwYnI7CisgIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyopICZjaXBicjsKKyAgRGlySW5mbyAqZHBiID0gKERpckluZm8qKSAmY2lwYnI7CisgIFN0cjI1NSBwbmFtZTsKKyAgc2hvcnQgZXJyOworCisgIC8qIE1ha2UgYSB0ZW1wIGNvcHkgb2YgdGhlIG5hbWUgYW5kIHBhc2NhbGl6ZS4gKi8KKyAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgbmFtZSk7CisgIGMycHN0ciAocG5hbWUpOworICAKKyAgY2lwYnIuZGlySW5mby5pb0RyRGlySUQgPSBkaXJpZDsKKyAgY2lwYnIuaEZpbGVJbmZvLmlvTmFtZVB0ciA9IHBuYW1lOworICBjaXBici5oRmlsZUluZm8uaW9WUmVmTnVtID0gMDsKKyAgY2lwYnIuaEZpbGVJbmZvLmlvRkRpckluZGV4ID0gMDsKKyAgY2lwYnIuaEZpbGVJbmZvLmlvRlZlcnNOdW0gPSAwOworICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7CisgIGlmIChlcnIgIT0gbm9FcnIpCisgICAgeworICAgICAgZXJybm8gPSBFTk9FTlQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAvKiBNYWMgZmlsZXMgYXJlIHJlYWRhYmxlIGlmIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGF0IGFsbC4gKi8KKyAgYnVmLT5zdF9tb2RlID0gMDQ0NDsKKyAgLyogTWFyayB1bmxvY2tlZCBmaWxlcyBhcyB3cml0ZWFibGUuICovCisgIGlmICghKGZwYi0+aW9GbEF0dHJpYiAmIExPQ0tCSVQpKQorICAgIGJ1Zi0+c3RfbW9kZSB8PSAwMjIyOworICBpZiAoZnBiLT5pb0ZsQXR0cmliICYgRElSQklUKQorICAgIHsKKyAgICAgIC8qIE1hcmsgZGlyZWN0b3JpZXMgYXMgImV4ZWN1dGFibGUiLiAqLworICAgICAgYnVmLT5zdF9tb2RlIHw9IDAxMTEgfCBTX0lGRElSOworICAgICAgYnVmLT5zdF9zaXplID0gZHBiLT5pb0RyTm1GbHM7CisgICAgICBidWYtPnN0X3JzaXplID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBidWYtPnN0X21vZGUgfD0gU19JRlJFRzsKKyAgICAgIC8qIE1hcmsgYXBwcyBhcyAiZXhlY3V0YWJsZSIuICovCisgICAgICBpZiAoZnBiLT5pb0ZsRm5kckluZm8uZmRUeXBlID09ICdBUFBMJykKKwlidWYtPnN0X21vZGUgfD0gMDExMTsKKyAgICAgIC8qIEZpbGwgaW4gdGhlIHNpemVzIG9mIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzLiAqLworICAgICAgYnVmLT5zdF9zaXplID0gZnBiLT5pb0ZsTGdMZW47CisgICAgICBidWYtPnN0X3JzaXplID0gZnBiLT5pb0ZsUkxnTGVuOworICAgIH0KKyAgLyogRmlsbCBpbiB2YXJpb3VzIHRpbWVzLiAqLworICBidWYtPnN0X2F0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7CisgIGJ1Zi0+c3RfbXRpbWUgPSBmcGItPmlvRmxNZERhdDsKKyAgYnVmLT5zdF9jdGltZSA9IGZwYi0+aW9GbENyRGF0OworICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGlub2RlIG51bWJlci4gKi8KKyAgYnVmLT5zdF9pbm8gPSAodW5zaWduZWQgc2hvcnQpIGZwYi0+aW9EaXJJRDsKKyAgLyogU2V0IHVwIGFuIGltaXRhdGlvbiBkZXZpY2UuICovCisgIEdldFZSZWZOdW0gKGJ1Zi0+c3RfaW5vLCAmYnVmLT5zdF9kZXYpOworICBidWYtPnN0X3VpZCA9IF9fdWlkOworICBidWYtPnN0X2dpZCA9IF9fZ2lkOworLyogIGJ1Zi0+c3RfRmxGbmRySW5mbyA9IGZwYi0+aW9GbEZuZHJJbmZvOyAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHN0YXQoKSBzZXRzIHVwIGFuIGVtcHR5IGRpcmlkLiAqLworCitpbnQKK3N0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpCit7CisgIGxvbmcgcnNsdCwgZXJybnVtOworICBjaGFyIHRtcG5hbWVbMjU2XTsKKworICBtcHdpZnlfZmlsZW5hbWUgKHBhdGgsIHRtcG5hbWUpOworICBpZiAoRGVidWdQSSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIjIHN0YXQgKCVzLCAleCkiLCB0bXBuYW1lLCBidWYpOworICBQUk9HUkVTUyAoMSk7CisgIHJzbHQgPSBfc3RhdCAodG1wbmFtZSwgMEwsIGJ1Zik7CisgIGVycm51bSA9IGVycm5vOworICBpZiAoRGVidWdQSSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKKyAgICAgIGlmIChyc2x0ICE9IDApCisJZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICB9CisgIGlmIChyc2x0ICE9IDApCisgICAgZXJybm8gPSBlcnJudW07CisgIHJldHVybiByc2x0OworfQorCitpbnQKK2ZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpCit7CisgIEZDQlBCUmVjIGZjYjsKKyAgRklMRSAqZnA7CisgIFN0cjI1NSBwYXRobmFtZTsKKyAgbG9uZyBkaXJpZCA9IDBMLCB0ZW1wOworICBsb25nIHJzbHQsIGVycm51bTsKKyAgc2hvcnQgZXJyOworCisgIGlmIChEZWJ1Z1BJIDwgMCkKKyAgICBEZWJ1Z1BJID0gKCooZ2V0ZW52ICgiREVCVUdfUEFUSE5BTUVTIikpID09ICcxJyA/IDEgOiAwKTsKKyAgaWYgKERlYnVnUEkpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiIyBmc3RhdCAoJWQsICV4KSIsIGZkLCBidWYpOworICBQUk9HUkVTUyAoMSk7CisgIHBhdGhuYW1lWzBdID0gMDsKKyNpZmRlZiBGSU9GTkFNRQorICAvKiBVc2UgYW4gTVBXLXNwZWNpZmljIGlvY3RsIHRvIGdldCB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZCB3aXRoCisgICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLworICBpb2N0bCAoZmQsIEZJT0ZOQU1FLCAobG9uZyAqKSBwYXRobmFtZSk7IAorI2Vsc2UKKyAgeW91IGxvc2UKKyNlbmRpZgorICBpZiAoRGVidWdQSSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgKG5hbWUgaXMgJXMpIiwgcGF0aG5hbWUpOworICBkaXJpZCA9IDBMIC8qIGZjYi5pb0ZDQlBhcklEICovIDsKKyAgcnNsdCA9IF9zdGF0ICgoY2hhciAqKSBwYXRobmFtZSwgZGlyaWQsIGJ1Zik7CisgIGVycm51bSA9IGVycm5vOworICBpZiAoRGVidWdQSSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKKyAgICAgIGlmIChyc2x0ICE9IDApCisJZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICB9CisgIGlmIChyc2x0ICE9IDApCisgICAgZXJybm8gPSBlcnJudW07CisgIHJldHVybiByc2x0OworfQorCisjZW5kaWYgLyogbiBVU0VfTVdfSEVBREVSUyAqLworCitjaGRpciAoKQoreworICBlcnJubyA9IEVOT1NZUzsKKyAgcmV0dXJuICgtMSk7Cit9CisKK2NoYXIgKgorZ2V0Y3dkIChjaGFyICpidWYsIGludCBzaXplKQoreworICBpZiAoYnVmID09IE5VTEwpCisgICAgYnVmID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKKyAgc3RyY3B5KGJ1ZiwgIjoiKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgbW9yZSBlbGFib3JhdGUgZm9yIE1QVy4gKi8KKworY2hhciAqCitnZXRwd2QgKCkKK3sKKyAgcmV0dXJuICI6IjsKK30KKworaW50CittcHdfb3BlbiAoY2hhciAqZmlsZW5hbWUsIGludCBhcmcyLCBpbnQgYXJnMykKK3sKKyN1bmRlZiBvcGVuCisgIGludCBmZCwgZXJybnVtID0gMDsKKyAgY2hhciB0bXBuYW1lWzI1Nl07CisKKyAgbXB3aWZ5X2ZpbGVuYW1lIChmaWxlbmFtZSwgdG1wbmFtZSk7CisgIGZkID0gb3BlbiAodG1wbmFtZSwgYXJnMik7CisgIGVycm51bSA9IGVycm5vOworCisgIGlmIChEZWJ1Z1BJKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgb3BlbiAoJXMsICVkLCAlZCkiLCB0bXBuYW1lLCBhcmcyLCBhcmczKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIGZkKTsKKyAgICAgIGlmIChmZCA9PSAtMSkKKwlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKyAgaWYgKGZkID09IC0xKQorICAgIGVycm5vID0gZXJybnVtOworICByZXR1cm4gZmQ7Cit9CisKK2ludAorbXB3X2FjY2VzcyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGludCBjbWQpCit7CisjdW5kZWYgYWNjZXNzCisKKyAgaW50IHJzbHQsIGVycm51bSA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworICBjaGFyIHRtcG5hbWVbMjU2XTsKKworICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKKyAgaWYgKGNtZCAmIFJfT0sgfHwgY21kICYgWF9PSykKKyAgICB7CisgICAgICByc2x0ID0gc3RhdCAodG1wbmFtZSwgJnN0KTsKKyAgICAgIGVycm51bSA9IGVycm5vOworICAgICAgaWYgKHJzbHQgPj0gMCkKKwl7CisJICBpZiAoKCgoc3Quc3RfbW9kZSAmIDAwNCkgPT0gMCkgJiYgKGNtZCAmIFJfT0spKQorCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDIpID09IDApICYmIChjbWQgJiBXX09LKSkKKwkgICAgICB8fCAoKChzdC5zdF9tb2RlICYgMDAxKSA9PSAwKSAmJiAoY21kICYgWF9PSykpKQorCSAgICB7CisJICAgICAgcnNsdCA9IC0xOworCSAgICAgIGVycm51bSA9IEVBQ0NFUzsKKwkgICAgfQorCX0KKyAgICB9CisgIGlmIChEZWJ1Z1BJKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgbXB3X2FjY2VzcyAoJXMsICVkKSIsIHRtcG5hbWUsIGNtZCk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKKyAgICAgIGlmIChyc2x0ICE9IDApCisJZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisgIGlmIChyc2x0ICE9IDApCisgICAgZXJybm8gPSBlcnJudW07CisgIHJldHVybiByc2x0OworfQorCisvKiBUaGUgTVBXIGxpYnJhcnkgY3JlYXQoKSBoYXMgbm8gbW9kZSBhcmd1bWVudC4gKi8KKworaW50CittcHdfY3JlYXQgKGNoYXIgKnBhdGgsIC8qIG1vZGVfdCAqLyBpbnQgbW9kZSkKK3sKKyN1bmRlZiBjcmVhdAorCisjaWZkZWYgVVNFX01XX0hFQURFUlMKKyAgcmV0dXJuIGNyZWF0IChwYXRoLCBtb2RlKTsKKyNlbHNlCisgIHJldHVybiBjcmVhdCAocGF0aCk7CisjZW5kaWYKK30KKworLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGNvbnRyb2wgaW4gYW4gTVBXIHRvb2wgYmVmb3JlIGl0IGNyYXNoZXMgdGhlCisgICBtYWNoaW5lLiAgKi8KKworbXB3X3NwZWNpYWxfaW5pdCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaWYgKHN0cnN0ciAobmFtZSwgIkRFQlVHIikpCisgICAgRGVidWdTdHIoIlxwYXQgYmVnaW5uaW5nIG9mIHByb2dyYW0iKTsKK30KKworc3RhdGljIGludCBjdXJyZW50X3VtYXNrOworCitpbnQKK3VtYXNrKGludCBtYXNrKQoreworICBpbnQgb2xkbWFzayA9IGN1cnJlbnRfdW1hc2s7CisKKyAgY3VycmVudF91bWFzayA9IG1hc2s7CisgIHJldHVybiBvbGRtYXNrOworfQorCisvKiBDdXJzb3Itc3Bpbm5pbmcgc3R1ZmYgdGhhdCBpbmNsdWRlcyBtZXRlcmluZyBvZiBzcGluIHJhdGUgYW5kIGRlbGF5cy4gICovCisKKy8qIE5vbnplcm8gd2hlbiBjdXJzb3Igc3Bpbm5pbmcgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiAgKi8KKworaW50IGN1cnNvcl9pbml0ZWQ7CisKKy8qIE5vbnplcm8gaWYgc3BpbiBzaG91bGQgYmUgbWVhc3VyZWQgYW5kIGV4Y2Vzc2l2ZSBkZWxheXMgcmVwb3J0ZWQuICAqLworCitpbnQgbWVhc3VyZV9zcGluOworCisvKiBOb256ZXJvIGlmIHNwaW4gaGlzdG9ncmFtIGFuZCByYXRlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LiAgKi8KKworaW50IGR1bXBfc3Bpbl9kYXRhOworCitsb25nIHdhcm5pbmdfdGhyZXNob2xkID0gNDAwMDAwOworCitsb25nIGJ1Y2tldF9zaXplID0gMTAyNDsKKworbG9uZyBidWNrZXRfcG93ZXIgPSAxMDsKKworbG9uZyBudW1idWNrZXRzID0gMzAwOworCitpbnQgKmRlbGF5X2NvdW50czsKKworaW50IG92ZXJmbG93X2NvdW50OworCitjaGFyICpjdXJyZW50X3Byb2dyZXNzOworCitzdGF0aWMgVW5zaWduZWRXaWRlIGxhc3RfbWljcm9zZWNvbmRzOworCitzdGF0aWMgY2hhciAqbGFzdF9zcGluX2ZpbGUgPSAiIjsKKworc3RhdGljIGludCBsYXN0X3NwaW5fbGluZTsKKwordm9pZAord2Fybl9pZl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgbG9uZyBkaWZmLCBpeDsKKyAgVW5zaWduZWRXaWRlIG5vdzsKKworICBNaWNyb3NlY29uZHMoJm5vdyk7CisKKyAgZGlmZiA9IG5vdy5sbyAtIGxhc3RfbWljcm9zZWNvbmRzLmxvOworCisgIGlmIChkaWZmID4gd2FybmluZ190aHJlc2hvbGQpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiIyAlczogJWxkLiUwNmxkIHNlYyBkZWxheSBnZXR0aW5nIGZyb20gJXM6JWQgdG8gJXM6JWRcbiIsCisJICAgICAoY3VycmVudF9wcm9ncmVzcyA/IGN1cnJlbnRfcHJvZ3Jlc3MgOiAiIiksCisJICAgICBkaWZmIC8gMTAwMDAwMCwgZGlmZiAlIDEwMDAwMDAsCisJICAgICBsYXN0X3NwaW5fZmlsZSwgbGFzdF9zcGluX2xpbmUsIGZpbGUsIGxpbmUpOworICBpZiAoZHVtcF9zcGluX2RhdGEpCisgICAgeworICAgICAgaWYgKGRpZmYgPj0gMCkKKwl7CisJICBpeCA9IGRpZmYgPj4gYnVja2V0X3Bvd2VyOworCSAgaWYgKGl4ID49IDAgJiYgaXggPCBudW1idWNrZXRzICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQorCSAgICArK2RlbGF5X2NvdW50c1tpeF07CisJICBlbHNlCisJICAgICsrb3ZlcmZsb3dfY291bnQ7CisJfQorICAgICAgZWxzZQorCWZwcmludGYgKHN0ZGVyciwgInJhdyBkaWZmIGlzICVsZCAoPylcbiIsIGRpZmYpOworICAgIH0KK30KKwordm9pZAorcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgTWljcm9zZWNvbmRzICgmbGFzdF9taWNyb3NlY29uZHMpOworICBsYXN0X3NwaW5fZmlsZSA9IGZpbGU7CisgIGxhc3Rfc3Bpbl9saW5lID0gbGluZTsKK30KKwordm9pZAorbXB3X3N0YXJ0X3Byb2dyZXNzIChjaGFyICpzdHIsIGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgaW50IGk7CisgIGNoYXIgKm1lYXN1cmUsICp0aHJlc2hvbGQ7CisKKyAgaWYgKCFjdXJzb3JfaW5pdGVkKQorICAgIHsKKyAgICAgIEluaXRDdXJzb3JDdGwgKG5pbCk7CisgICAgICBjdXJzb3JfaW5pdGVkID0gMTsKKyAgICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7CisgICAgICBtZWFzdXJlID0gZ2V0ZW52ICgiTUVBU1VSRV9TUElOIik7CisgICAgICBpZiAobWVhc3VyZSAhPSBOVUxMICYmIG1lYXN1cmVbMF0gIT0gJ1wwJykKKwl7CisJICBtZWFzdXJlX3NwaW4gPSAxOworCSAgaWYgKHN0cmNtcCAobWVhc3VyZSwgImFsbCIpID09IDApCisJICAgIGR1bXBfc3Bpbl9kYXRhID0gMTsKKwl9CisgICAgICB0aHJlc2hvbGQgPSBnZXRlbnYgKCJTUElOX1dBUk5fVEhSRVNIT0xEIik7CisgICAgICBpZiAodGhyZXNob2xkICE9IE5VTEwgJiYgdGhyZXNob2xkWzBdICE9ICdcMCcpCisJd2FybmluZ190aHJlc2hvbGQgPSBhdG9sICh0aHJlc2hvbGQpOworICAgICAgaWYgKGR1bXBfc3Bpbl9kYXRhKQorCXsKKwkgIGlmIChkZWxheV9jb3VudHMgPT0gTlVMTCkKKwkgICAgZGVsYXlfY291bnRzID0gKGludCAqKSBtYWxsb2MgKG51bWJ1Y2tldHMgKiBzaXplb2YgKGludCkpOworCSAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKKwkgICAgZGVsYXlfY291bnRzW2ldID0gMDsKKwkgIG92ZXJmbG93X2NvdW50ID0gMDsKKwl9CisgICAgfQorICBjdXJyZW50X3Byb2dyZXNzID0gc3RyOworCisgIHN5c19uZXJyID0gZXJybm9fbWF4ICgpOworCisgIG1wd19zcGVjaWFsX2luaXQgKHN0cik7Cit9CisKK3ZvaWQKK21wd19wcm9ncmVzcyAoaW50IG4pCit7CisgIFNwaW5DdXJzb3IgKDMyKTsKK30KKwordm9pZAorbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQgbiwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgIGlmIChtZWFzdXJlX3NwaW4pCisgICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKKyAgU3BpbkN1cnNvciAoMzIpOworICBpZiAobWVhc3VyZV9zcGluKQorICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Cit9CisKK3ZvaWQKK21wd19lbmRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgIGxvbmcgaSwgZGVsYXksIGNvdW50ID0gMCwgc3VtID0gMCwgYXZnZGVsYXksIHNwaW5yYXRlOworICBsb25nIGN1cnBvd2VyID0gMCwgY3VyZ3JvdXAgPSAwOworCisgIC8qIFdhcm4gaWYgaXQncyBiZWVuIGEgd2hpbGUgc2luY2UgdGhlIGxhc3Qgc3Bpbi4gICovCisgIGlmIChtZWFzdXJlX3NwaW4pCisgICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKKworICAvKiBEdW1wIGFsbCB0aGUgbm9uemVybyBkZWxheSBjb3VudHMgYW5kIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGRlbGF5LiAgKi8KKyAgaWYgKGR1bXBfc3Bpbl9kYXRhICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWNrZXRzOyArK2kpCisJeworCSAgZGVsYXkgPSAoaSArIDEpICogYnVja2V0X3NpemU7CisJICBzdW0gKz0gZGVsYXlfY291bnRzW2ldICogKGkgKyAxKTsKKwkgIGNvdW50ICs9IGRlbGF5X2NvdW50c1tpXTsKKwkgIGlmIChkZWxheSA8PSAoMSA8PCBjdXJwb3dlcikpCisJICAgIHsKKwkgICAgICBjdXJncm91cCArPSBkZWxheV9jb3VudHNbaV07CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChjdXJncm91cCA+IDApCisJCWZwcmludGYgKHN0ZGVyciwKKwkJCSAiIyAlczogJWQgZGVsYXlzIGJldHdlZW4gJWxkLiUwNmxkIGFuZCAlbGQuJTA2bGQgc2VjXG4iLAorCQkJIChzdHIgPyBzdHIgOiAiIiksCisJCQkgY3VyZ3JvdXAsCisJCQkgKDEgPDwgY3VycG93ZXIpIC8gMTAwMDAwMCwKKwkJCSAoMSA8PCBjdXJwb3dlcikgJSAxMDAwMDAwLAorCQkJICgxIDw8IChjdXJwb3dlciArIDEpKSAvIDEwMDAwMDAsCisJCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpICUgMTAwMDAwMCk7CisJICAgICAgKytjdXJwb3dlcjsKKwkgICAgICBjdXJncm91cCA9IDA7CisJICAgIH0KKwl9CisgICAgICBpZiAoY291bnQgPiAwKQorCXsKKwkgIGF2Z2RlbGF5ID0gKHN1bSAqIGJ1Y2tldF9zaXplKSAvIGNvdW50OworCSAgc3BpbnJhdGUgPSAxMDAwMDAwIC8gYXZnZGVsYXk7CisJICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiBBdmVyYWdlIHNwaW4gcmF0ZSBpcyAlZCB0aW1lcy9zZWNcbiIsCisJCSAgIChzdHIgPyBzdHIgOiAiIiksIHNwaW5yYXRlKTsKKwl9CisgICAgfQorfQorCisjaWZkZWYgUFJPR1JFU1NfVEVTVAorCisvKiBUZXN0IHByb2dyYW0uICAqLworCittYWluICgpCit7CisgIGludCBpLCBqOworICBkb3VibGUgeCA9IDEuMCwgeSA9IDIuNDsKKyAgbG9uZyBzdGFydCA9IE1pY3Jvc2Vjb25kcyAoKSwgdG07ICBGSVhNRQorCisgIFNUQVJUX1BST0dSRVNTICgiaGkiLCAwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgIHsKKyAgICAgIFBST0dSRVNTICgxKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IChpICogMTAwKTsgKytqKQorCXsKKwkgIHggKz0gKHggKiB5KSAvIGo7CisJfQorICAgIH0KKyAgCisgIEVORF9QUk9HUkVTUyAoImhpIik7CisgIAorICB0bSA9IE1pY3Jvc2Vjb25kcyAoKSAtIHN0YXJ0OworCisgIHByaW50ZiAoIlRvdGFsIHRpbWUgaXMgJWQuJWQgc2Vjc1xuIiwgdG0gLyAxMDAwMDAwLCB0bSAlIDEwMDAwMDApOworfQorCisjZW5kaWYKKworI2lmZGVmIFVTRV9NV19IRUFERVJTCisvKiBFbXB0eSBkZWZpbml0aW9ucyBmb3IgTWV0cm93ZXJrcycgU0lPVVggY29uc29sZSBsaWJyYXJ5LiAqLworCisjaWZuZGVmIF9fQ09OU09MRV9fCisjaW5jbHVkZSA8Y29uc29sZS5oPgorI2VuZGlmCisKK3Nob3J0CitJbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKK3sKKyNwcmFnbWEgdW51c2VkIChmZCkKKwlyZXR1cm4gMDsKK30KKwordm9pZAorUmVtb3ZlQ29uc29sZSh2b2lkKQoreworfQorCitsb25nCitXcml0ZUNoYXJzVG9Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQoreworI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKKwlyZXR1cm4gMDsKK30KKworbG9uZyBSZWFkQ2hhcnNGcm9tQ29uc29sZShjaGFyICpidWYsIGxvbmcgbikKK3sKKyNwcmFnbWEgdW51c2VkIChidWYsIG4pCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBjaGFyICoKK19fdHR5bmFtZShsb25nIGZkKQoreworCXN0YXRpYyBjaGFyICpfX2RldmljZW5hbWUgPSAibnVsbCBkZXZpY2UiOworCisJaWYgKGZkID49IDAgJiYgZmQgPD0gMikKKwkgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXNkb3MuYyBiL2xpYmliZXJ0eS9tc2Rvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2U2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvbXNkb3MuYwpAQCAtMCwwICsxLDE1IEBACitjaGFyIG1zZ1tdID0gIk5vIHZmb3JrIGF2YWlsYWJsZSAtIGFib3J0aW5nXG4iOwordmZvcmsoKQoreworICB3cml0ZSgxLCBtc2csIHNpemVvZihtc2cpKTsKK30KKworc2lnc2V0bWFzaygpCit7CisgIC8qIG5vIHNpZ25hbHMgc3VwcG9ydCBpbiBnbzMyICh5ZXQpICovCit9CisKK3dhaXRwaWQoKQoreworICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvb2JqYWxsb2MuYyBiL2xpYmliZXJ0eS9vYmphbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzU0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvb2JqYWxsb2MuYwpAQCAtMCwwICsxLDI5MSBAQAorLyogb2JqYWxsb2MuYyAtLSByb3V0aW5lcyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9iamVjdHMKKyAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAib2JqYWxsb2MuaCIKKworLyogR2V0IGEgZGVmaW5pdGlvbiBmb3IgTlVMTC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmIFZNUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXhsaWIuaD4KKyNlbHNlCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKy8qIEdldCBhIGRlZmluaXRpb24gZm9yIHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGlzIG11c3QgYmUgZGVjbGFyZWQuICAqLworZXh0ZXJuIFBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CitleHRlcm4gdm9pZCBmcmVlIFBBUkFNUyAoKFBUUikpOworI2VuZGlmCisKKy8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBvYmplY3QuICBGcmVlaW5nIGFsbG9jYXRlZAorICAgc3BhY2UgbWF5IG9yIG1heSBub3QgZnJlZSBhbGwgbW9yZSByZWNlbnRseSBhbGxvY2F0ZWQgc3BhY2UuCisKKyAgIFdlIGhhbmRsZSBsYXJnZSBhbmQgc21hbGwgYWxsb2NhdGlvbiByZXF1ZXN0cyBkaWZmZXJlbnRseS4gIElmIHdlCisgICBkb24ndCBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgY3VycmVudCBibG9jaywgYW5kIHRoZSBhbGxvY2F0aW9uCisgICByZXF1ZXN0IGlzIGZvciBtb3JlIHRoYW4gNTEyIGJ5dGVzLCB3ZSBzaW1wbHkgcGFzcyBpdCB0aHJvdWdoIHRvCisgICBtYWxsb2MuICAqLworCisvKiBUaGUgb2JqYWxsb2Mgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gb2JqYWxsb2MuaC4gICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggY2h1bmsuICAqLworCitzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsKK3sKKyAgLyogTmV4dCBjaHVuay4gICovCisgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKKyAgLyogSWYgdGhpcyBjaHVuayBjb250YWlucyBsYXJnZSBvYmplY3RzLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZgorICAgICBjdXJyZW50X3B0ciB3aGVuIHRoaXMgY2h1bmsgd2FzIGFsbG9jYXRlZC4gIElmIHRoaXMgY2h1bmsKKyAgICAgY29udGFpbnMgc21hbGwgb2JqZWN0cywgdGhpcyBpcyBOVUxMLiAgKi8KKyAgY2hhciAqY3VycmVudF9wdHI7Cit9OworCisvKiBUaGUgYWxpZ25lZCBzaXplIG9mIG9iamFsbG9jX2NodW5rLiAgKi8KKworI2RlZmluZSBDSFVOS19IRUFERVJfU0laRQkJCQkJXAorICAoKHNpemVvZiAoc3RydWN0IG9iamFsbG9jX2NodW5rKSArIE9CSkFMTE9DX0FMSUdOIC0gMSkJXAorICAgJn4gKE9CSkFMTE9DX0FMSUdOIC0gMSkpCisKKy8qIFdlIGFzayBmb3IgdGhpcyBtdWNoIG1lbW9yeSBlYWNoIHRpbWUgd2UgY3JlYXRlIGEgY2h1bmsgd2hpY2ggaXMgdG8KKyAgIGhvbGQgc21hbGwgb2JqZWN0cy4gICovCisKKyNkZWZpbmUgQ0hVTktfU0laRSAoNDA5NiAtIDMyKQorCisvKiBBIHJlcXVlc3QgZm9yIHRoaXMgYW1vdW50IG9yIG1vcmUgaXMganVzdCBwYXNzZWQgdGhyb3VnaCB0byBtYWxsb2MuICAqLworCisjZGVmaW5lIEJJR19SRVFVRVNUICg1MTIpCisKKy8qIENyZWF0ZSBhbiBvYmphbGxvYyBzdHJ1Y3R1cmUuICAqLworCitzdHJ1Y3Qgb2JqYWxsb2MgKgorb2JqYWxsb2NfY3JlYXRlICgpCit7CisgIHN0cnVjdCBvYmphbGxvYyAqcmV0OworICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOworCisgIHJldCA9IChzdHJ1Y3Qgb2JqYWxsb2MgKikgbWFsbG9jIChzaXplb2YgKnJldCk7CisgIGlmIChyZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXQtPmNodW5rcyA9IChQVFIpIG1hbGxvYyAoQ0hVTktfU0laRSk7CisgIGlmIChyZXQtPmNodW5rcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKHJldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIHJldC0+Y2h1bmtzOworICBjaHVuay0+bmV4dCA9IE5VTEw7CisgIGNodW5rLT5jdXJyZW50X3B0ciA9IE5VTEw7CisKKyAgcmV0LT5jdXJyZW50X3B0ciA9IChjaGFyICopIGNodW5rICsgQ0hVTktfSEVBREVSX1NJWkU7CisgIHJldC0+Y3VycmVudF9zcGFjZSA9IENIVU5LX1NJWkUgLSBDSFVOS19IRUFERVJfU0laRTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBBbGxvY2F0ZSBzcGFjZSBmcm9tIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCisKK1BUUgorX29iamFsbG9jX2FsbG9jIChvLCBsZW4pCisgICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKKyAgICAgdW5zaWduZWQgbG9uZyBsZW47Cit7CisgIC8qIFdlIGF2b2lkIGNvbmZ1c2lvbiBmcm9tIHplcm8gc2l6ZWQgb2JqZWN0cyBieSBhbHdheXMgYWxsb2NhdGluZworICAgICBhdCBsZWFzdCAxIGJ5dGUuICAqLworICBpZiAobGVuID09IDApCisgICAgbGVuID0gMTsKKworICBsZW4gPSAobGVuICsgT0JKQUxMT0NfQUxJR04gLSAxKSAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKTsKKworICBpZiAobGVuIDw9IG8tPmN1cnJlbnRfc3BhY2UpCisgICAgeworICAgICAgby0+Y3VycmVudF9wdHIgKz0gbGVuOworICAgICAgby0+Y3VycmVudF9zcGFjZSAtPSBsZW47CisgICAgICByZXR1cm4gKFBUUikgKG8tPmN1cnJlbnRfcHRyIC0gbGVuKTsKKyAgICB9CisKKyAgaWYgKGxlbiA+PSBCSUdfUkVRVUVTVCkKKyAgICB7CisgICAgICBjaGFyICpyZXQ7CisgICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmNodW5rOworCisgICAgICByZXQgPSAoY2hhciAqKSBtYWxsb2MgKENIVU5LX0hFQURFUl9TSVpFICsgbGVuKTsKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIHJldDsKKyAgICAgIGNodW5rLT5uZXh0ID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7CisgICAgICBjaHVuay0+Y3VycmVudF9wdHIgPSBvLT5jdXJyZW50X3B0cjsKKworICAgICAgby0+Y2h1bmtzID0gKFBUUikgY2h1bms7CisKKyAgICAgIHJldHVybiAoUFRSKSAocmV0ICsgQ0hVTktfSEVBREVSX1NJWkUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7CisKKyAgICAgIGNodW5rID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBtYWxsb2MgKENIVU5LX1NJWkUpOworICAgICAgaWYgKGNodW5rID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgICBjaHVuay0+bmV4dCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOworICAgICAgY2h1bmstPmN1cnJlbnRfcHRyID0gTlVMTDsKKworICAgICAgby0+Y3VycmVudF9wdHIgPSAoY2hhciAqKSBjaHVuayArIENIVU5LX0hFQURFUl9TSVpFOworICAgICAgby0+Y3VycmVudF9zcGFjZSA9IENIVU5LX1NJWkUgLSBDSFVOS19IRUFERVJfU0laRTsKKworICAgICAgby0+Y2h1bmtzID0gKFBUUikgY2h1bms7CisKKyAgICAgIHJldHVybiBvYmphbGxvY19hbGxvYyAobywgbGVuKTsKKyAgICB9Cit9CisKKy8qIEZyZWUgYW4gZW50aXJlIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCisKK3ZvaWQKK29iamFsbG9jX2ZyZWUgKG8pCisgICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKK3sKKyAgc3RydWN0IG9iamFsbG9jX2NodW5rICpsOworCisgIGwgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKKyAgd2hpbGUgKGwgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKm5leHQ7CisKKyAgICAgIG5leHQgPSBsLT5uZXh0OworICAgICAgZnJlZSAobCk7CisgICAgICBsID0gbmV4dDsKKyAgICB9CisKKyAgZnJlZSAobyk7Cit9CisKKy8qIEZyZWUgYSBibG9jayBmcm9tIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gIFRoaXMgYWxzbyBmcmVlcyBhbGwgbW9yZQorICAgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2Nrcy4gICovCisKK3ZvaWQKK29iamFsbG9jX2ZyZWVfYmxvY2sgKG8sIGJsb2NrKQorICAgICBzdHJ1Y3Qgb2JqYWxsb2MgKm87CisgICAgIFBUUiBibG9jazsKK3sKKyAgc3RydWN0IG9iamFsbG9jX2NodW5rICpwLCAqc21hbGw7CisgIGNoYXIgKmIgPSAoY2hhciAqKSBibG9jazsKKworICAvKiBGaXJzdCBzZXQgUCB0byB0aGUgY2h1bmsgd2hpY2ggY29udGFpbnMgdGhlIGJsb2NrIHdlIGFyZSBmcmVlaW5nLAorICAgICBhbmQgc2V0IFEgdG8gdGhlIGxhc3Qgc21hbGwgb2JqZWN0IGNodW5rIHdlIHNlZSBiZWZvcmUgUC4gICovCisgIHNtYWxsID0gTlVMTDsKKyAgZm9yIChwID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisgICAgeworICAgICAgaWYgKHAtPmN1cnJlbnRfcHRyID09IE5VTEwpCisJeworCSAgaWYgKGIgPiAoY2hhciAqKSBwICYmIGIgPCAoY2hhciAqKSBwICsgQ0hVTktfU0laRSkKKwkgICAgYnJlYWs7CisJICBzbWFsbCA9IHA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChiID09IChjaGFyICopIHAgKyBDSFVOS19IRUFERVJfU0laRSkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBjaHVuaywgdGhlIGNhbGxlciBoYXMgbWFkZSBhIG1pc3Rha2UuICAqLworICBpZiAocCA9PSBOVUxMKQorICAgIGFib3J0ICgpOworCisgIGlmIChwLT5jdXJyZW50X3B0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqcTsKKyAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqZmlyc3Q7CisKKyAgICAgIC8qIFRoZSBibG9jayBpcyBpbiBhIGNodW5rIGNvbnRhaW5pbmcgc21hbGwgb2JqZWN0cy4gIFdlIGNhbgorCSBmcmVlIGV2ZXJ5IGNodW5rIHRocm91Z2ggU01BTEwsIGJlY2F1c2UgdGhleSBoYXZlIGNlcnRhaW5seQorCSBiZWVuIGFsbG9jYXRlZCBtb3JlIHJlY2VudGx5LiAgQWZ0ZXIgU01BTEwsIHdlIHdpbGwgbm90IHNlZQorCSBhbnkgY2h1bmtzIGNvbnRhaW5pbmcgc21hbGwgb2JqZWN0czsgd2UgY2FuIGZyZWUgYW55IGJpZworCSBjaHVuayBpZiB0aGUgY3VycmVudF9wdHIgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIEIuICBXZQorCSBjYW4gdGhlbiByZXNldCB0aGUgbmV3IGN1cnJlbnRfcHRyIHRvIEIuICAqLworCisgICAgICBmaXJzdCA9IE5VTEw7CisgICAgICBxID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7CisgICAgICB3aGlsZSAocSAhPSBwKQorCXsKKwkgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKKworCSAgbmV4dCA9IHEtPm5leHQ7CisJICBpZiAoc21hbGwgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChzbWFsbCA9PSBxKQorCQlzbWFsbCA9IE5VTEw7CisJICAgICAgZnJlZSAocSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHEtPmN1cnJlbnRfcHRyID4gYikKKwkgICAgZnJlZSAocSk7CisJICBlbHNlIGlmIChmaXJzdCA9PSBOVUxMKQorCSAgICBmaXJzdCA9IHE7CisKKwkgIHEgPSBuZXh0OworCX0KKworICAgICAgaWYgKGZpcnN0ID09IE5VTEwpCisJZmlyc3QgPSBwOworICAgICAgby0+Y2h1bmtzID0gKFBUUikgZmlyc3Q7CisKKyAgICAgIC8qIE5vdyBzdGFydCBhbGxvY2F0aW5nIGZyb20gdGhpcyBzbWFsbCBibG9jayBhZ2Fpbi4gICovCisgICAgICBvLT5jdXJyZW50X3B0ciA9IGI7CisgICAgICBvLT5jdXJyZW50X3NwYWNlID0gKChjaGFyICopIHAgKyBDSFVOS19TSVpFKSAtIGI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpxOworICAgICAgY2hhciAqY3VycmVudF9wdHI7CisKKyAgICAgIC8qIFRoaXMgYmxvY2sgaXMgaW4gYSBsYXJnZSBjaHVuayBieSBpdHNlbGYuICBXZSBjYW4gZnJlZQorICAgICAgICAgZXZlcnl0aGluZyBvbiB0aGUgbGlzdCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgYmxvY2suICBXZQorICAgICAgICAgdGhlbiBzdGFydCBhbGxvY2F0aW5nIGZyb20gdGhlIG5leHQgY2h1bmsgY29udGFpbmluZyBzbWFsbAorICAgICAgICAgb2JqZWN0cywgc2V0dGluZyBjdXJyZW50X3B0ciBmcm9tIHRoZSB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUKKyAgICAgICAgIGxhcmdlIGNodW5rIHdlIGFyZSBmcmVlaW5nLiAgKi8KKworICAgICAgY3VycmVudF9wdHIgPSBwLT5jdXJyZW50X3B0cjsKKyAgICAgIHAgPSBwLT5uZXh0OworCisgICAgICBxID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7CisgICAgICB3aGlsZSAocSAhPSBwKQorCXsKKwkgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKKworCSAgbmV4dCA9IHEtPm5leHQ7CisJICBmcmVlIChxKTsKKwkgIHEgPSBuZXh0OworCX0KKworICAgICAgby0+Y2h1bmtzID0gKFBUUikgcDsKKworICAgICAgd2hpbGUgKHAtPmN1cnJlbnRfcHRyICE9IE5VTEwpCisJcCA9IHAtPm5leHQ7CisKKyAgICAgIG8tPmN1cnJlbnRfcHRyID0gY3VycmVudF9wdHI7CisgICAgICBvLT5jdXJyZW50X3NwYWNlID0gKChjaGFyICopIHAgKyBDSFVOS19TSVpFKSAtIGN1cnJlbnRfcHRyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9vYnN0YWNrLmMgYi9saWJpYmVydHkvb2JzdGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzE4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvb2JzdGFjay5jCkBAIC0wLDAgKzEsNTkzIEBACisvKiBvYnN0YWNrLmMgLSBzdWJyb3V0aW5lcyB1c2VkIGltcGxpY2l0bHkgYnkgb2JqZWN0IHN0YWNrIG1hY3JvcworICAgQ29weXJpZ2h0IChDKSAxOTg4LDg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisKKyAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCisgICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm9ic3RhY2suaCIKKworLyogTk9URSBCRUZPUkUgTU9ESUZZSU5HIFRISVMgRklMRTogVGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlCisgICBpbmNyZW1lbnRlZCB3aGVuZXZlciBjYWxsZXJzIGNvbXBpbGVkIHVzaW5nIGFuIG9sZCBvYnN0YWNrLmggY2FuIG5vCisgICBsb25nZXIgcHJvcGVybHkgY2FsbCB0aGUgZnVuY3Rpb25zIGluIHRoaXMgb2JzdGFjay5jLiAgKi8KKyNkZWZpbmUgT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiAxCisKKy8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAorICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgYW5kIHRoZSBpbnN0YWxsZWQgbGlicmFyeQorICAgc3VwcG9ydHMgdGhlIHNhbWUgbGlicmFyeSBpbnRlcmZhY2Ugd2UgZG8uICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VCisgICBDIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKKyAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKKyAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQorICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0CisgICBmaWxlcywgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIFJhbmRvbSB0aGluZyB0byBnZXQgX19HTlVfTElCUkFSWV9fLiAgKi8KKyNpZiAhZGVmaW5lZCAoX0xJQkMpICYmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQorI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgorI2lmIF9HTlVfT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiA9PSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OCisjZGVmaW5lIEVMSURFX0NPREUKKyNlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBFTElERV9DT0RFCisKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworI2RlZmluZSBQT0lOVEVSIHZvaWQgKgorI2Vsc2UKKyNkZWZpbmUgUE9JTlRFUiBjaGFyICoKKyNlbmRpZgorCisvKiBEZXRlcm1pbmUgZGVmYXVsdCBhbGlnbm1lbnQuICAqLworc3RydWN0IGZvb2FsaWduIHtjaGFyIHg7IGRvdWJsZSBkO307CisjZGVmaW5lIERFRkFVTFRfQUxJR05NRU5UICBcCisgICgoUFRSX0lOVF9UWVBFKSAoKGNoYXIgKikgJigoc3RydWN0IGZvb2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCisvKiBJZiBtYWxsb2Mgd2VyZSByZWFsbHkgc21hcnQsIGl0IHdvdWxkIHJvdW5kIGFkZHJlc3NlcyB0byBERUZBVUxUX0FMSUdOTUVOVC4KKyAgIEJ1dCBpbiBmYWN0IGl0IG1pZ2h0IGJlIGxlc3Mgc21hcnQgYW5kIHJvdW5kIGFkZHJlc3NlcyB0byBhcyBtdWNoIGFzCisgICBERUZBVUxUX1JPVU5ESU5HLiAgU28gd2UgcHJlcGFyZSBmb3IgaXQgdG8gZG8gdGhhdC4gICovCit1bmlvbiBmb29yb3VuZCB7bG9uZyB4OyBkb3VibGUgZDt9OworI2RlZmluZSBERUZBVUxUX1JPVU5ESU5HIChzaXplb2YgKHVuaW9uIGZvb3JvdW5kKSkKKworLyogV2hlbiB3ZSBjb3B5IGEgbG9uZyBibG9jayBvZiBkYXRhLCB0aGlzIGlzIHRoZSB1bml0IHRvIGRvIGl0IHdpdGguCisgICBPbiBzb21lIG1hY2hpbmVzLCBjb3B5aW5nIHN1Y2Nlc3NpdmUgaW50cyBkb2VzIG5vdCB3b3JrOworICAgaW4gc3VjaCBhIGNhc2UsIHJlZGVmaW5lIENPUFlJTkdfVU5JVCB0byBgbG9uZycgKGlmIHRoYXQgd29ya3MpCisgICBvciBgY2hhcicgYXMgYSBsYXN0IHJlc29ydC4gICovCisjaWZuZGVmIENPUFlJTkdfVU5JVAorI2RlZmluZSBDT1BZSU5HX1VOSVQgaW50CisjZW5kaWYKKworCisvKiBUaGUgZnVuY3Rpb25zIGFsbG9jYXRpbmcgbW9yZSByb29tIGJ5IGNhbGxpbmcgYG9ic3RhY2tfY2h1bmtfYWxsb2MnCisgICBqdW1wIHRvIHRoZSBoYW5kbGVyIHBvaW50ZWQgdG8gYnkgYG9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXInLgorICAgVGhpcyB2YXJpYWJsZSBieSBkZWZhdWx0IHBvaW50cyB0byB0aGUgaW50ZXJuYWwgZnVuY3Rpb24KKyAgIGBwcmludF9hbmRfYWJvcnQnLiAgKi8KKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KK3N0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAodm9pZCk7Cit2b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpID0gcHJpbnRfYW5kX2Fib3J0OworI2Vsc2UKK3N0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAoKTsKK3ZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKSA9IHByaW50X2FuZF9hYm9ydDsKKyNlbmRpZgorCisvKiBFeGl0IHZhbHVlIHVzZWQgd2hlbiBgcHJpbnRfYW5kX2Fib3J0JyBpcyB1c2VkLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VX0xJQlJBUllfXyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmbmRlZiBFWElUX0ZBSUxVUkUKKyNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKKyNlbmRpZgoraW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlID0gRVhJVF9GQUlMVVJFOworCisvKiBUaGUgbm9uLUdOVS1DIG1hY3JvcyBjb3B5IHRoZSBvYnN0YWNrIGludG8gdGhpcyBnbG9iYWwgdmFyaWFibGUKKyAgIHRvIGF2b2lkIG11bHRpcGxlIGV2YWx1YXRpb24uICAqLworCitzdHJ1Y3Qgb2JzdGFjayAqX29ic3RhY2s7CisKKy8qIERlZmluZSBhIG1hY3JvIHRoYXQgZWl0aGVyIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSB0cmFkaXRpb25hbCBtYWxsb2MvZnJlZQorICAgY2FsbGluZyBpbnRlcmZhY2UsIG9yIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSBtbWFsbG9jL21mcmVlIGludGVyZmFjZQorICAgKHRoYXQgYWRkcyBhbiBleHRyYSBmaXJzdCBhcmd1bWVudCksIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB1c2VfZXh0cmFfYXJnLgorICAgRm9yIGZyZWUsIGRvIG5vdCB1c2UgPzosIHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIHRoZSBNSVBTIGNvbXBpbGVycywKKyAgIGRvIG5vdCBhbGxvdyAoZXhwcikgPyB2b2lkIDogdm9pZC4gICovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCisgICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKKyAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAorICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAobG9uZykpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQorCisjZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKKyAgZG8geyBcCisgICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCisgICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKKyAgICBlbHNlIFwKKyAgICAgICgqKHZvaWQgKCopICh2b2lkICopKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIENBTExfQ0hVTktGVU4oaCwgc2l6ZSkgXAorICAoKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCisgICA/ICgqKGgpLT5jaHVua2Z1bikgKChoKS0+ZXh0cmFfYXJnLCAoc2l6ZSkpIFwKKyAgIDogKCooc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikgKCkpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQorCisjZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKKyAgZG8geyBcCisgICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCisgICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKKyAgICBlbHNlIFwKKyAgICAgICgqKHZvaWQgKCopICgpKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisMCisvKiBJbml0aWFsaXplIGFuIG9ic3RhY2sgSCBmb3IgdXNlLiAgU3BlY2lmeSBjaHVuayBzaXplIFNJWkUgKDAgbWVhbnMgZGVmYXVsdCkuCisgICBPYmplY3RzIHN0YXJ0IG9uIG11bHRpcGxlcyBvZiBBTElHTk1FTlQgKDAgbWVhbnMgdXNlIGRlZmF1bHQpLgorICAgQ0hVTktGVU4gaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBhbGxvY2F0ZSBjaHVua3MsCisgICBhbmQgRlJFRUZVTiB0aGUgZnVuY3Rpb24gdG8gZnJlZSB0aGVtLgorCisgICBSZXR1cm4gbm9uemVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIG91dCBvZiBtZW1vcnkuCisgICBUbyByZWNvdmVyIGZyb20gYW4gb3V0IG9mIG1lbW9yeSBlcnJvciwKKyAgIGZyZWUgdXAgc29tZSBtZW1vcnksIHRoZW4gY2FsbCB0aGlzIGFnYWluLiAgKi8KKworaW50Citfb2JzdGFja19iZWdpbiAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikKKyAgICAgc3RydWN0IG9ic3RhY2sgKmg7CisgICAgIGludCBzaXplOworICAgICBpbnQgYWxpZ25tZW50OworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworICAgICBQT0lOVEVSICgqY2h1bmtmdW4pIChsb25nKTsKKyAgICAgdm9pZCAoKmZyZWVmdW4pICh2b2lkICopOworI2Vsc2UKKyAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKKyAgICAgdm9pZCAoKmZyZWVmdW4pICgpOworI2VuZGlmCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KKworICBpZiAoYWxpZ25tZW50ID09IDApCisgICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7CisgIGlmIChzaXplID09IDApCisgICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KKyAgICB7CisgICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCisJIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCisJIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgorCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKKwkgYWxsb2NhdGVkLgorCisJIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKKwkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLworICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCisJCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKKwkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7CisgICAgICBzaXplID0gNDA5NiAtIGV4dHJhOworICAgIH0KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLCBsb25nKSkgY2h1bmtmdW47CisgIGgtPmZyZWVmdW4gPSAodm9pZCAoKikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopKSBmcmVlZnVuOworI2Vsc2UKKyAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKCkpIGNodW5rZnVuOworICBoLT5mcmVlZnVuID0gZnJlZWZ1bjsKKyNlbmRpZgorICBoLT5jaHVua19zaXplID0gc2l6ZTsKKyAgaC0+YWxpZ25tZW50X21hc2sgPSBhbGlnbm1lbnQgLSAxOworICBoLT51c2VfZXh0cmFfYXJnID0gMDsKKworICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKKyAgaWYgKCFjaHVuaykKKyAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOworICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKKyAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKKyAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKKyAgY2h1bmstPnByZXYgPSAwOworICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KKyAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKKyAgaC0+YWxsb2NfZmFpbGVkID0gMDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorX29ic3RhY2tfYmVnaW5fMSAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKKyAgICAgaW50IHNpemU7CisgICAgIGludCBhbGlnbm1lbnQ7CisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisgICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKFBPSU5URVIsIGxvbmcpOworICAgICB2b2lkICgqZnJlZWZ1bikgKFBPSU5URVIsIFBPSU5URVIpOworI2Vsc2UKKyAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKKyAgICAgdm9pZCAoKmZyZWVmdW4pICgpOworI2VuZGlmCisgICAgIFBPSU5URVIgYXJnOworeworICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOyAvKiBwb2ludHMgdG8gbmV3IGNodW5rICovCisKKyAgaWYgKGFsaWdubWVudCA9PSAwKQorICAgIGFsaWdubWVudCA9IChpbnQpIERFRkFVTFRfQUxJR05NRU5UOworICBpZiAoc2l6ZSA9PSAwKQorICAgIC8qIERlZmF1bHQgc2l6ZSBpcyB3aGF0IEdOVSBtYWxsb2MgY2FuIGZpdCBpbiBhIDQwOTYtYnl0ZSBibG9jay4gICovCisgICAgeworICAgICAgLyogMTIgaXMgc2l6ZW9mIChtaGVhZCkgYW5kIDQgaXMgRVhUUkEgZnJvbSBHTlUgbWFsbG9jLgorCSBVc2UgdGhlIHZhbHVlcyBmb3IgcmFuZ2UgY2hlY2tpbmcsIGJlY2F1c2UgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb2ZmLAorCSB0aGUgZXh0cmEgYnl0ZXMgd29uJ3QgYmUgbWlzc2VkIHRlcnJpYmx5LCBidXQgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb24KKwkgYW5kIHdlIHVzZWQgYSBsYXJnZXIgcmVxdWVzdCwgYSB3aG9sZSBleHRyYSA0MDk2IGJ5dGVzIHdvdWxkIGJlCisJIGFsbG9jYXRlZC4KKworCSBUaGVzZSBudW1iZXIgYXJlIGlycmVsZXZhbnQgdG8gdGhlIG5ldyBHTlUgbWFsbG9jLiAgSSBzdXNwZWN0IGl0IGlzCisJIGxlc3Mgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LiAgKi8KKyAgICAgIGludCBleHRyYSA9ICgoKCgxMiArIERFRkFVTFRfUk9VTkRJTkcgLSAxKSAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKQorCQkgICAgKyA0ICsgREVGQVVMVF9ST1VORElORyAtIDEpCisJCSAgICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpOworICAgICAgc2l6ZSA9IDQwOTYgLSBleHRyYTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiBfX1NURENfXworICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLGxvbmcpKSBjaHVua2Z1bjsKKyAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47CisjZWxzZQorICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47CisgIGgtPmZyZWVmdW4gPSBmcmVlZnVuOworI2VuZGlmCisgIGgtPmNodW5rX3NpemUgPSBzaXplOworICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7CisgIGgtPmV4dHJhX2FyZyA9IGFyZzsKKyAgaC0+dXNlX2V4dHJhX2FyZyA9IDE7CisKKyAgY2h1bmsgPSBoLT5jaHVuayA9IENBTExfQ0hVTktGVU4gKGgsIGggLT4gY2h1bmtfc2l6ZSk7CisgIGlmICghY2h1bmspCisgICAgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKTsKKyAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgPSBjaHVuay0+Y29udGVudHM7CisgIGgtPmNodW5rX2xpbWl0ID0gY2h1bmstPmxpbWl0CisgICAgPSAoY2hhciAqKSBjaHVuayArIGgtPmNodW5rX3NpemU7CisgIGNodW5rLT5wcmV2ID0gMDsKKyAgLyogVGhlIGluaXRpYWwgY2h1bmsgbm93IGNvbnRhaW5zIG5vIGVtcHR5IG9iamVjdC4gICovCisgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7CisgIGgtPmFsbG9jX2ZhaWxlZCA9IDA7CisgIHJldHVybiAxOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBjdXJyZW50IGNodW5rIGZvciB0aGUgb2JzdGFjayAqSAorICAgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBMRU5HVEggYnl0ZXMgbmVlZCB0byBiZSBhZGRlZAorICAgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LCBvciBhIG5ldyBvYmplY3Qgb2YgbGVuZ3RoIExFTkdUSCBhbGxvY2F0ZWQuCisgICBDb3BpZXMgYW55IHBhcnRpYWwgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkIGNodW5rCisgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgb25lLiAgKi8KKwordm9pZAorX29ic3RhY2tfbmV3Y2h1bmsgKGgsIGxlbmd0aCkKKyAgICAgc3RydWN0IG9ic3RhY2sgKmg7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqb2xkX2NodW5rID0gaC0+Y2h1bms7CisgIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbmV3X2NodW5rOworICByZWdpc3RlciBsb25nCW5ld19zaXplOworICByZWdpc3RlciBsb25nIG9ial9zaXplID0gaC0+bmV4dF9mcmVlIC0gaC0+b2JqZWN0X2Jhc2U7CisgIHJlZ2lzdGVyIGxvbmcgaTsKKyAgbG9uZyBhbHJlYWR5OworCisgIC8qIENvbXB1dGUgc2l6ZSBmb3IgbmV3IGNodW5rLiAgKi8KKyAgbmV3X3NpemUgPSAob2JqX3NpemUgKyBsZW5ndGgpICsgKG9ial9zaXplID4+IDMpICsgMTAwOworICBpZiAobmV3X3NpemUgPCBoLT5jaHVua19zaXplKQorICAgIG5ld19zaXplID0gaC0+Y2h1bmtfc2l6ZTsKKworICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGNodW5rLiAgKi8KKyAgbmV3X2NodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgbmV3X3NpemUpOworICBpZiAoIW5ld19jaHVuaykKKyAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOworICBoLT5jaHVuayA9IG5ld19jaHVuazsKKyAgbmV3X2NodW5rLT5wcmV2ID0gb2xkX2NodW5rOworICBuZXdfY2h1bmstPmxpbWl0ID0gaC0+Y2h1bmtfbGltaXQgPSAoY2hhciAqKSBuZXdfY2h1bmsgKyBuZXdfc2l6ZTsKKworICAvKiBNb3ZlIHRoZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIG5ldyBjaHVuay4KKyAgICAgV29yZCBhdCBhIHRpbWUgaXMgZmFzdCBhbmQgaXMgc2FmZSBpZiB0aGUgb2JqZWN0CisgICAgIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLiAgKi8KKyAgaWYgKGgtPmFsaWdubWVudF9tYXNrICsgMSA+PSBERUZBVUxUX0FMSUdOTUVOVCkKKyAgICB7CisgICAgICBmb3IgKGkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAtIDE7CisJICAgaSA+PSAwOyBpLS0pCisJKChDT1BZSU5HX1VOSVQgKiluZXdfY2h1bmstPmNvbnRlbnRzKVtpXQorCSAgPSAoKENPUFlJTkdfVU5JVCAqKWgtPm9iamVjdF9iYXNlKVtpXTsKKyAgICAgIC8qIFdlIHVzZWQgdG8gY29weSB0aGUgb2RkIGZldyByZW1haW5pbmcgYnl0ZXMgYXMgb25lIGV4dHJhIENPUFlJTkdfVU5JVCwKKwkgYnV0IHRoYXQgY2FuIGNyb3NzIGEgcGFnZSBib3VuZGFyeSBvbiBhIG1hY2hpbmUKKwkgd2hpY2ggZG9lcyBub3QgZG8gc3RyaWN0IGFsaWdubWVudCBmb3IgQ09QWUlOR19VTklUUy4gICovCisgICAgICBhbHJlYWR5ID0gb2JqX3NpemUgLyBzaXplb2YgKENPUFlJTkdfVU5JVCkgKiBzaXplb2YgKENPUFlJTkdfVU5JVCk7CisgICAgfQorICBlbHNlCisgICAgYWxyZWFkeSA9IDA7CisgIC8qIENvcHkgcmVtYWluaW5nIGJ5dGVzIG9uZSBieSBvbmUuICAqLworICBmb3IgKGkgPSBhbHJlYWR5OyBpIDwgb2JqX3NpemU7IGkrKykKKyAgICBuZXdfY2h1bmstPmNvbnRlbnRzW2ldID0gaC0+b2JqZWN0X2Jhc2VbaV07CisKKyAgLyogSWYgdGhlIG9iamVjdCBqdXN0IGNvcGllZCB3YXMgdGhlIG9ubHkgZGF0YSBpbiBPTERfQ0hVTkssCisgICAgIGZyZWUgdGhhdCBjaHVuayBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGNoYWluLgorICAgICBCdXQgbm90IGlmIHRoYXQgY2h1bmsgbWlnaHQgY29udGFpbiBhbiBlbXB0eSBvYmplY3QuICAqLworICBpZiAoaC0+b2JqZWN0X2Jhc2UgPT0gb2xkX2NodW5rLT5jb250ZW50cyAmJiAhIGgtPm1heWJlX2VtcHR5X29iamVjdCkKKyAgICB7CisgICAgICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bmstPnByZXY7CisgICAgICBDQUxMX0ZSRUVGVU4gKGgsIG9sZF9jaHVuayk7CisgICAgfQorCisgIGgtPm9iamVjdF9iYXNlID0gbmV3X2NodW5rLT5jb250ZW50czsKKyAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgKyBvYmpfc2l6ZTsKKyAgLyogVGhlIG5ldyBjaHVuayBjZXJ0YWlubHkgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0IHlldC4gICovCisgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Cit9CisKKy8qIFJldHVybiBub256ZXJvIGlmIG9iamVjdCBPQkogaGFzIGJlZW4gYWxsb2NhdGVkIGZyb20gb2JzdGFjayBILgorICAgVGhpcyBpcyBoZXJlIGZvciBkZWJ1Z2dpbmcuCisgICBJZiB5b3UgdXNlIGl0IGluIGEgcHJvZ3JhbSwgeW91IGFyZSBwcm9iYWJseSBsb3NpbmcuICAqLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisvKiBTdXBwcmVzcyAtV21pc3NpbmctcHJvdG90eXBlcyB3YXJuaW5nLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWNsYXJlIHRoaXMgaW4KKyAgIG9ic3RhY2suaCBiZWNhdXNlIGl0IGlzIGp1c3QgZm9yIGRlYnVnZ2luZy4gICovCitpbnQgX29ic3RhY2tfYWxsb2NhdGVkX3AgKHN0cnVjdCBvYnN0YWNrICpoLCBQT0lOVEVSIG9iaik7CisjZW5kaWYKKworaW50Citfb2JzdGFja19hbGxvY2F0ZWRfcCAoaCwgb2JqKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKKyAgICAgUE9JTlRFUiBvYmo7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLworICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCisKKyAgbHAgPSAoaCktPmNodW5rOworICAvKiBXZSB1c2UgPj0gcmF0aGVyIHRoYW4gPiBzaW5jZSB0aGUgb2JqZWN0IGNhbm5vdCBiZSBleGFjdGx5IGF0CisgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNodW5rIGJ1dCBtaWdodCBiZSBhbiBlbXB0eSBvYmplY3QgZXhhY3RseQorICAgICBhdCB0aGUgZW5kIG9mIGFuIGFkamFjZW50IGNodW5rLiAgKi8KKyAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKKyAgICB7CisgICAgICBwbHAgPSBscC0+cHJldjsKKyAgICAgIGxwID0gcGxwOworICAgIH0KKyAgcmV0dXJuIGxwICE9IDA7Cit9CisMCisvKiBGcmVlIG9iamVjdHMgaW4gb2JzdGFjayBILCBpbmNsdWRpbmcgT0JKIGFuZCBldmVyeXRoaW5nIGFsbG9jYXRlCisgICBtb3JlIHJlY2VudGx5IHRoYW4gT0JKLiAgSWYgT0JKIGlzIHplcm8sIGZyZWUgZXZlcnl0aGluZyBpbiBILiAgKi8KKworI3VuZGVmIG9ic3RhY2tfZnJlZQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhcyB0d28gbmFtZXMgd2l0aCBpZGVudGljYWwgZGVmaW5pdGlvbnMuCisgICBUaGlzIGlzIHRoZSBmaXJzdCBvbmUsIGNhbGxlZCBmcm9tIG5vbi1BTlNJIGNvZGUuICAqLworCit2b2lkCitfb2JzdGFja19mcmVlIChoLCBvYmopCisgICAgIHN0cnVjdCBvYnN0YWNrICpoOworICAgICBQT0lOVEVSIG9iajsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCisgIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KKworICBscCA9IGgtPmNodW5rOworICAvKiBXZSB1c2UgPj0gYmVjYXVzZSB0aGVyZSBjYW5ub3QgYmUgYW4gb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjaHVuay4KKyAgICAgQnV0IHRoZXJlIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QgYXQgdGhhdCBhZGRyZXNzCisgICAgIGF0IHRoZSBlbmQgb2YgYW5vdGhlciBjaHVuay4gICovCisgIHdoaWxlIChscCAhPSAwICYmICgoUE9JTlRFUikgbHAgPj0gb2JqIHx8IChQT0lOVEVSKSAobHApLT5saW1pdCA8IG9iaikpCisgICAgeworICAgICAgcGxwID0gbHAtPnByZXY7CisgICAgICBDQUxMX0ZSRUVGVU4gKGgsIGxwKTsKKyAgICAgIGxwID0gcGxwOworICAgICAgLyogSWYgd2Ugc3dpdGNoIGNodW5rcywgd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHRoZSBuZXcgY3VycmVudAorCSBjaHVuayBjb250YWlucyBhbiBlbXB0eSBvYmplY3QsIHNvIGFzc3VtZSB0aGF0IGl0IG1heS4gICovCisgICAgICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOworICAgIH0KKyAgaWYgKGxwKQorICAgIHsKKyAgICAgIGgtPm9iamVjdF9iYXNlID0gaC0+bmV4dF9mcmVlID0gKGNoYXIgKikgKG9iaik7CisgICAgICBoLT5jaHVua19saW1pdCA9IGxwLT5saW1pdDsKKyAgICAgIGgtPmNodW5rID0gbHA7CisgICAgfQorICBlbHNlIGlmIChvYmogIT0gMCkKKyAgICAvKiBvYmogaXMgbm90IGluIGFueSBvZiB0aGUgY2h1bmtzISAqLworICAgIGFib3J0ICgpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZnJvbSBBTlNJIGNvZGUuICAqLworCit2b2lkCitvYnN0YWNrX2ZyZWUgKGgsIG9iaikKKyAgICAgc3RydWN0IG9ic3RhY2sgKmg7CisgICAgIFBPSU5URVIgb2JqOworeworICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KKyAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLworCisgIGxwID0gaC0+Y2h1bms7CisgIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgorICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKKyAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KKyAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKKyAgICB7CisgICAgICBwbHAgPSBscC0+cHJldjsKKyAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOworICAgICAgbHAgPSBwbHA7CisgICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50CisJIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KKyAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7CisgICAgfQorICBpZiAobHApCisgICAgeworICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKKyAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OworICAgICAgaC0+Y2h1bmsgPSBscDsKKyAgICB9CisgIGVsc2UgaWYgKG9iaiAhPSAwKQorICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCisgICAgYWJvcnQgKCk7Cit9CisMCitpbnQKK19vYnN0YWNrX21lbW9yeV91c2VkIChoKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rKiBscDsKKyAgcmVnaXN0ZXIgaW50IG5ieXRlcyA9IDA7CisKKyAgZm9yIChscCA9IGgtPmNodW5rOyBscCAhPSAwOyBscCA9IGxwLT5wcmV2KQorICAgIHsKKyAgICAgIG5ieXRlcyArPSBscC0+bGltaXQgLSAoY2hhciAqKSBscDsKKyAgICB9CisgIHJldHVybiBuYnl0ZXM7Cit9CisMCisvKiBEZWZpbmUgdGhlIGVycm9yIGhhbmRsZXIuICAqLworI2lmbmRlZiBfCisjIGlmZGVmIEhBVkVfTElCSU5UTF9ICisjICBpbmNsdWRlIDxsaWJpbnRsLmg+CisjICBpZm5kZWYgXworIyAgIGRlZmluZSBfKFN0cikgZ2V0dGV4dCAoU3RyKQorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIF8oU3RyKSAoU3RyKQorIyBlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitwcmludF9hbmRfYWJvcnQgKCkKK3sKKyAgZnB1dHMgKF8oIm1lbW9yeSBleGhhdXN0ZWRcbiIpLCBzdGRlcnIpOworICBleGl0IChvYnN0YWNrX2V4aXRfZmFpbHVyZSk7Cit9CisMCisjaWYgMAorLyogVGhlc2UgYXJlIG5vdyB0dXJuZWQgb2ZmIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIGl0CisgICBhbmQgaXQgdXNlcyBiY29weSB2aWEgb2JzdGFja19ncm93LCB3aGljaCBjYXVzZXMgdHJvdWJsZSBvbiBzeXNWLiAgKi8KKworLyogTm93IGRlZmluZSB0aGUgZnVuY3Rpb25hbCB2ZXJzaW9ucyBvZiB0aGUgb2JzdGFjayBtYWNyb3MuCisgICBEZWZpbmUgdGhlbSB0byBzaW1wbHkgdXNlIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyB0byBkbyB0aGUgam9iLiAgKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworLyogVGhlc2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZG8gbm90IHdvcmsgd2l0aCBub24tQU5TSSBwcmVwcm9jZXNzb3JzOworICAgdGhleSB3b24ndCBwYXNzIHRocm91Z2ggdGhlIG1hY3JvIG5hbWVzIGluIHBhcmVudGhlc2VzLiAgKi8KKworLyogVGhlIGZ1bmN0aW9uIG5hbWVzIGFwcGVhciBpbiBwYXJlbnRoZXNlcyBpbiBvcmRlciB0byBwcmV2ZW50CisgICB0aGUgbWFjcm8tZGVmaW5pdGlvbnMgb2YgdGhlIG5hbWVzIGZyb20gYmVpbmcgZXhwYW5kZWQgdGhlcmUuICAqLworCitQT0lOVEVSIChvYnN0YWNrX2Jhc2UpIChvYnN0YWNrKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKK3sKKyAgcmV0dXJuIG9ic3RhY2tfYmFzZSAob2JzdGFjayk7Cit9CisKK1BPSU5URVIgKG9ic3RhY2tfbmV4dF9mcmVlKSAob2JzdGFjaykKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Cit7CisgIHJldHVybiBvYnN0YWNrX25leHRfZnJlZSAob2JzdGFjayk7Cit9CisKK2ludCAob2JzdGFja19vYmplY3Rfc2l6ZSkgKG9ic3RhY2spCisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOworeworICByZXR1cm4gb2JzdGFja19vYmplY3Rfc2l6ZSAob2JzdGFjayk7Cit9CisKK2ludCAob2JzdGFja19yb29tKSAob2JzdGFjaykKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Cit7CisgIHJldHVybiBvYnN0YWNrX3Jvb20gKG9ic3RhY2spOworfQorCitpbnQgKG9ic3RhY2tfbWFrZV9yb29tKSAob2JzdGFjaywgbGVuZ3RoKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgcmV0dXJuIG9ic3RhY2tfbWFrZV9yb29tIChvYnN0YWNrLCBsZW5ndGgpOworfQorCit2b2lkIChvYnN0YWNrX2dyb3cpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOworICAgICBQT0lOVEVSIHBvaW50ZXI7CisgICAgIGludCBsZW5ndGg7Cit7CisgIG9ic3RhY2tfZ3JvdyAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKK30KKwordm9pZCAob2JzdGFja19ncm93MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7CisgICAgIFBPSU5URVIgcG9pbnRlcjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgb2JzdGFja19ncm93MCAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKK30KKwordm9pZCAob2JzdGFja18xZ3JvdykgKG9ic3RhY2ssIGNoYXJhY3RlcikKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7CisgICAgIGludCBjaGFyYWN0ZXI7Cit7CisgIG9ic3RhY2tfMWdyb3cgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Cit9CisKK3ZvaWQgKG9ic3RhY2tfYmxhbmspIChvYnN0YWNrLCBsZW5ndGgpCisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOworICAgICBpbnQgbGVuZ3RoOworeworICBvYnN0YWNrX2JsYW5rIChvYnN0YWNrLCBsZW5ndGgpOworfQorCit2b2lkIChvYnN0YWNrXzFncm93X2Zhc3QpIChvYnN0YWNrLCBjaGFyYWN0ZXIpCisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOworICAgICBpbnQgY2hhcmFjdGVyOworeworICBvYnN0YWNrXzFncm93X2Zhc3QgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Cit9CisKK3ZvaWQgKG9ic3RhY2tfYmxhbmtfZmFzdCkgKG9ic3RhY2ssIGxlbmd0aCkKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7CisgICAgIGludCBsZW5ndGg7Cit7CisgIG9ic3RhY2tfYmxhbmtfZmFzdCAob2JzdGFjaywgbGVuZ3RoKTsKK30KKworUE9JTlRFUiAob2JzdGFja19maW5pc2gpIChvYnN0YWNrKQorICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKK3sKKyAgcmV0dXJuIG9ic3RhY2tfZmluaXNoIChvYnN0YWNrKTsKK30KKworUE9JTlRFUiAob2JzdGFja19hbGxvYykgKG9ic3RhY2ssIGxlbmd0aCkKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHJldHVybiBvYnN0YWNrX2FsbG9jIChvYnN0YWNrLCBsZW5ndGgpOworfQorCitQT0lOVEVSIChvYnN0YWNrX2NvcHkpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOworICAgICBQT0lOVEVSIHBvaW50ZXI7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHJldHVybiBvYnN0YWNrX2NvcHkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Cit9CisKK1BPSU5URVIgKG9ic3RhY2tfY29weTApIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOworICAgICBQT0lOVEVSIHBvaW50ZXI7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHJldHVybiBvYnN0YWNrX2NvcHkwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOworfQorCisjZW5kaWYgLyogX19TVERDX18gKi8KKworI2VuZGlmIC8qIDAgKi8KKworI2VuZGlmCS8qICFFTElERV9DT0RFICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4ZWN1dGUuYyBiL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTk3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvcGV4ZWN1dGUuYwpAQCAtMCwwICsxLDczOCBAQAorLyogVXRpbGl0aWVzIHRvIGV4ZWN1dGUgYSBwcm9ncmFtIGluIGEgc3VicHJvY2VzcyAocG9zc2libHkgbGlua2VkIGJ5IHBpcGVzCisgICB3aXRoIG90aGVyIHN1YnByb2Nlc3NlcyksIGFuZCB3YWl0IGZvciBpdC4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgorTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgordmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCit3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IHBleGVjdXRlIGFuZCBwd2FpdC4gICovCisKKy8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBsaWJpYmVydHkgYW5kIGdjYy4KKyAgIERvbid0IGNoYW5nZSBvbmUgd2l0aG91dCB0aGUgb3RoZXIuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjZGVmaW5lIElTU1BBQ0UgKHgpIGlzc3BhY2UoeCkKKyNpZmRlZiBIQVZFX1NZU19XQUlUX0gKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2VuZGlmCisKKyNpZmRlZiB2Zm9yayAvKiBBdXRvY29uZiBtYXkgZGVmaW5lIHRoaXMgdG8gZm9yayBmb3IgdXMuICovCisjIGRlZmluZSBWRk9SS19TVFJJTkcgImZvcmsiCisjZWxzZQorIyBkZWZpbmUgVkZPUktfU1RSSU5HICJ2Zm9yayIKKyNlbmRpZgorI2lmZGVmIEhBVkVfVkZPUktfSAorI2luY2x1ZGUgPHZmb3JrLmg+CisjZW5kaWYKKyNpZmRlZiBWTVMKKyNkZWZpbmUgdmZvcmsoKSAoZGVjYyQkYWxsb2NfdmZvcmtfYmxvY2tzKCkgPj0gMCA/IFwKKyAgICAgICAgICAgICAgIGxpYiRnZXRfY3VycmVudF9pbnZvX2NvbnRleHQoZGVjYyQkZ2V0X3Zmb3JrX2ptcGJ1ZigpKSA6IC0xKQorI2VuZGlmIC8qIFZNUyAqLworCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpZiAhZGVmaW5lZCAoX19DWUdXSU5fXykgJiYgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQorI2RlZmluZSBfX0NZR1dJTl9fIDEKKyNlbmRpZgorCisvKiBzdGRpbiBmaWxlIG51bWJlci4gICovCisjZGVmaW5lIFNURElOX0ZJTEVfTk8gMAorCisvKiBzdGRvdXQgZmlsZSBudW1iZXIuICAqLworI2RlZmluZSBTVERPVVRfRklMRV9OTyAxCisKKy8qIHZhbHVlIG9mIGBwaXBlJzogcG9ydCBpbmRleCBmb3IgcmVhZGluZy4gICovCisjZGVmaW5lIFJFQURfUE9SVCAwCisKKy8qIHZhbHVlIG9mIGBwaXBlJzogcG9ydCBpbmRleCBmb3Igd3JpdGluZy4gICovCisjZGVmaW5lIFdSSVRFX1BPUlQgMQorCitzdGF0aWMgY2hhciAqaW5zdGFsbF9lcnJvcl9tc2cgPSAiaW5zdGFsbGF0aW9uIHByb2JsZW0sIGNhbm5vdCBleGVjIGAlcyciOworCisvKiBwZXhlY3V0ZTogZXhlY3V0ZSBhIHByb2dyYW0uCisKKyAgIFBST0dSQU0gYW5kIEFSR1YgYXJlIHRoZSBhcmd1bWVudHMgdG8gZXhlY3YvZXhlY3ZwLgorCisgICBUSElTX1BOQU1FIGlzIG5hbWUgb2YgdGhlIGNhbGxpbmcgcHJvZ3JhbSAoaS5lLiBhcmd2WzBdKS4KKworICAgVEVNUF9CQVNFIGlzIHRoZSBwYXRoIG5hbWUsIHNhbnMgc3VmZml4LCBvZiBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQorICAgaWYgbmVlZGVkLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIE1TRE9TIHBvcnRzIHRoYXQgZG9uJ3QgdXNlCisgICBHTzMyIChkbyBhbnkgc3RpbGwgZXhpc3Q/KS4gIFBvcnRzIHRoYXQgZG9uJ3QgbmVlZCBpdCBjYW4gcGFzcyBOVUxMLgorCisgICAoRkxBR1MgJiBQRVhFQ1VURV9TRUFSQ0gpIGlzIG5vbi16ZXJvIGlmICRQQVRIIHNob3VsZCBiZSBzZWFyY2hlZAorICAgKD8/PyBJdCdzIG5vdCBjbGVhciB0aGF0IEdDQyBwYXNzZXMgdGhpcyBmbGFnIGNvcnJlY3RseSkuCisgICAoRkxBR1MgJiBQRVhFQ1VURV9GSVJTVCkgaXMgbm9uemVybyBmb3IgdGhlIGZpcnN0IHByb2Nlc3MgaW4gY2hhaW4uCisgICAoRkxBR1MgJiBQRVhFQ1VURV9GSVJTVCkgaXMgbm9uemVybyBmb3IgdGhlIGxhc3QgcHJvY2VzcyBpbiBjaGFpbi4KKyAgIEZJUlNUX0xBU1QgY291bGQgYmUgc2ltcGxpZmllZCB0byBvbmx5IG1hcmsgdGhlIGxhc3Qgb2YgYSBjaGFpbiBvZiBwcm9jZXNzZXMKKyAgIGJ1dCB0aGF0IHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYWx3YXlzIG1hcmsgdGhlIGxhc3Qgb25lIChhbmQgbm90IGdpdmUgdXAKKyAgIGVhcmx5IGlmIHNvbWUgZXJyb3Igb2NjdXJzKS4gIEl0J3MgbW9yZSByb2J1c3QgdG8gcmVxdWlyZSB0aGUgY2FsbGVyIHRvCisgICBtYXJrIGJvdGggZW5kcyBvZiB0aGUgY2hhaW4uCisKKyAgIFRoZSByZXN1bHQgaXMgdGhlIHBpZCBvbiBzeXN0ZW1zIGxpa2UgVW5peCB3aGVyZSB3ZSBmb3JrL2V4ZWMgYW5kIG9uIHN5c3RlbXMKKyAgIGxpa2UgV0lOMzIgYW5kIE9TMiB3aGVyZSB3ZSB1c2Ugc3Bhd24uICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHdhaXQgZm9yCisgICB0aGUgY2hpbGQuCisKKyAgIFRoZSByZXN1bHQgaXMgdGhlIFdFWElUU1RBVFVTIG9uIHN5c3RlbXMgbGlrZSBNU0RPUyB3aGVyZSB3ZSBzcGF3biBhbmQgd2FpdAorICAgZm9yIHRoZSBjaGlsZCBoZXJlLgorCisgICBVcG9uIGZhaWx1cmUsIEVSUk1TR19GTVQgYW5kIEVSUk1TR19BUkcgYXJlIHNldCB0byB0aGUgdGV4dCBvZiB0aGUgZXJyb3IKKyAgIG1lc3NhZ2Ugd2l0aCBhbiBvcHRpb25hbCBhcmd1bWVudCAoaWYgbm90IG5lZWRlZCwgRVJSTVNHX0FSRyBpcyBzZXQgdG8KKyAgIE5VTEwpLCBhbmQgLTEgaXMgcmV0dXJuZWQuICBgZXJybm8nIGlzIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyIHRvIHVzZS4KKworICAgcHdhaXQ6IGNvdmVyIGZ1bmN0aW9uIGZvciB3YWl0LgorCisgICBQSUQgaXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHRhc2sgdG8gd2FpdCBmb3IuCisgICBTVEFUVVMgaXMgdGhlIGBzdGF0dXMnIGFyZ3VtZW50IHRvIHdhaXQuCisgICBGTEFHUyBpcyBjdXJyZW50bHkgdW51c2VkIChhbGxvd3MgZnV0dXJlIGVuaGFuY2VtZW50IHdpdGhvdXQgYnJlYWtpbmcKKyAgIHVwd2FyZCBjb21wYXRpYmlsaXR5KS4gIFBhc3MgMCBmb3Igbm93LgorCisgICBUaGUgcmVzdWx0IGlzIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHJlYXBlZCwKKyAgIG9yIC0xIGZvciBmYWlsdXJlIChlcnJubyBzYXlzIHdoeSkuCisKKyAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHdhaXRpbmcgZm9yIGEgcGFydGljdWxhciBjaGlsZCwgUElEIGlzCisgICBpZ25vcmVkLiAgT24gc3lzdGVtcyBsaWtlIE1TRE9TIHRoYXQgZG9uJ3QgcmVhbGx5IG11bHRpdGFzayBwd2FpdAorICAgaXMganVzdCBhIG1lY2hhbmlzbSB0byBwcm92aWRlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgZm9yIHRoZSBjYWxsZXIuCisKKyAgIHBmaW5pc2g6IGZpbmlzaCBnZW5lcmF0aW9uIG9mIHNjcmlwdAorCisgICBwZmluaXNoIGlzIG5lY2Vzc2FyeSBmb3Igc3lzdGVtcyBsaWtlIE1QVyB3aGVyZSBhIHNjcmlwdCBpcyBnZW5lcmF0ZWQgdGhhdAorICAgcnVucyB0aGUgcmVxdWVzdGVkIHByb2dyYW1zLgorKi8KKworI2lmZGVmIF9fTVNET1NfXworCisvKiBNU0RPUyBkb2Vzbid0IG11bHRpdGFzaywgYnV0IGZvciB0aGUgc2FrZSBvZiBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlCisgICB0aGUgY29kZSBiZWhhdmVzIGxpa2UgaXQgZG9lcy4gIHBleGVjdXRlIHJ1bnMgdGhlIHByb2dyYW0sIHR1Y2tzIHRoZQorICAgZXhpdCBjb2RlIGF3YXksIGFuZCByZXR1cm5zIGEgInBpZCIuICBwd2FpdCBtdXN0IGJlIGNhbGxlZCB0byBmZXRjaCB0aGUKKyAgIGV4aXQgY29kZS4gICovCisKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKKy8qIEZvciBjb21tdW5pY2F0aW5nIGluZm9ybWF0aW9uIGZyb20gcGV4ZWN1dGUgdG8gcHdhaXQuICAqLworc3RhdGljIGludCBsYXN0X3BpZCA9IDA7CitzdGF0aWMgaW50IGxhc3Rfc3RhdHVzID0gMDsKK3N0YXRpYyBpbnQgbGFzdF9yZWFwZWQgPSAwOworCitpbnQKK3BleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQorICAgICBjb25zdCBjaGFyICpwcm9ncmFtOworICAgICBjaGFyICogY29uc3QgKmFyZ3Y7CisgICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7CisgICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKKyAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKKyAgICAgaW50IGZsYWdzOworeworICBpbnQgcmM7CisKKyAgbGFzdF9waWQrKzsKKyAgaWYgKGxhc3RfcGlkIDwgMCkKKyAgICBsYXN0X3BpZCA9IDE7CisKKyAgaWYgKChmbGFncyAmIFBFWEVDVVRFX09ORSkgIT0gUEVYRUNVVEVfT05FKQorICAgIGFib3J0ICgpOworCisjaWZkZWYgX19HTzMyX18KKyAgLyogPz8/IFdoYXQgYXJlIHRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZyb20gc3Bhd252PyAgKi8KKyAgcmMgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBzcGF3bnZwIDogc3Bhd252KSAoMSwgcHJvZ3JhbSwgYXJndik7CisjZWxzZQorICBjaGFyICpzY21kLCAqcmY7CisgIEZJTEUgKmFyZ2ZpbGU7CisgIGludCBpLCBlbCA9IGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gNCA6IDA7CisKKyAgc2NtZCA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocHJvZ3JhbSkgKyBzdHJsZW4gKHRlbXBfYmFzZSkgKyA2ICsgZWwpOworICByZiA9IHNjbWQgKyBzdHJsZW4ocHJvZ3JhbSkgKyAyICsgZWw7CisgIHNwcmludGYgKHNjbWQsICIlcyVzIEAlcy5ncCIsIHByb2dyYW0sCisJICAgKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gIi5leGUiIDogIiIpLCB0ZW1wX2Jhc2UpOworICBhcmdmaWxlID0gZm9wZW4gKHJmLCAidyIpOworICBpZiAoYXJnZmlsZSA9PSAwKQorICAgIHsKKyAgICAgIGludCBlcnJub19zYXZlID0gZXJybm87CisgICAgICBmcmVlIChzY21kKTsKKyAgICAgIGVycm5vID0gZXJybm9fc2F2ZTsKKyAgICAgICplcnJtc2dfZm10ID0gImNhbm5vdCBvcGVuIGAlcy5ncCciOworICAgICAgKmVycm1zZ19hcmcgPSB0ZW1wX2Jhc2U7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCisgICAgeworICAgICAgY2hhciAqY3A7CisgICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQorCXsKKwkgIGlmICgqY3AgPT0gJyInIHx8ICpjcCA9PSAnXCcnIHx8ICpjcCA9PSAnXFwnIHx8IElTU1BBQ0UgKCpjcCkpCisJICAgIGZwdXRjICgnXFwnLCBhcmdmaWxlKTsKKwkgIGZwdXRjICgqY3AsIGFyZ2ZpbGUpOworCX0KKyAgICAgIGZwdXRjICgnXG4nLCBhcmdmaWxlKTsKKyAgICB9CisgIGZjbG9zZSAoYXJnZmlsZSk7CisKKyAgcmMgPSBzeXN0ZW0gKHNjbWQpOworCisgIHsKKyAgICBpbnQgZXJybm9fc2F2ZSA9IGVycm5vOworICAgIHJlbW92ZSAocmYpOworICAgIGZyZWUgKHNjbWQpOworICAgIGVycm5vID0gZXJybm9fc2F2ZTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHJjID09IC0xKQorICAgIHsKKyAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7CisgICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIFR1Y2sgdGhlIHN0YXR1cyBhd2F5IGZvciBwd2FpdCwgYW5kIHJldHVybiBhICJwaWQiLiAgKi8KKyAgbGFzdF9zdGF0dXMgPSByYyA8PCA4OworICByZXR1cm4gbGFzdF9waWQ7Cit9CisKK2ludAorcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKKyAgICAgaW50IHBpZDsKKyAgICAgaW50ICpzdGF0dXM7CisgICAgIGludCBmbGFnczsKK3sKKyAgLyogT24gTVNET1MgZWFjaCBwZXhlY3V0ZSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGl0J3MgYXNzb2NpYXRlZCBwd2FpdC4gICovCisgIGlmIChwaWQgIT0gbGFzdF9waWQKKyAgICAgIC8qIENhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgY2hpbGQ/ICAqLworICAgICAgfHwgcGlkID09IGxhc3RfcmVhcGVkKQorICAgIHsKKyAgICAgIC8qID8/PyBFQ0hJTEQgd291bGQgYmUgYSBiZXR0ZXIgY2hvaWNlLiAgQ2FuIHdlIHVzZSBpdCBoZXJlPyAgKi8KKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCisgICAgIE5lZWRlZD8gICovCisgICpzdGF0dXMgPSBsYXN0X3N0YXR1czsKKyAgbGFzdF9yZWFwZWQgPSBsYXN0X3BpZDsKKyAgcmV0dXJuIGxhc3RfcGlkOworfQorCisjZW5kaWYgLyogTVNET1MgKi8KKworI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgISBkZWZpbmVkIChfX1VXSU5fXykKKworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworI2lmZGVmIF9fQ1lHV0lOX18KKworI2RlZmluZSBmaXhfYXJndihhcmd2ZWMpIChhcmd2ZWMpCisKK2V4dGVybiBpbnQgX3NwYXdudiAoKTsKK2V4dGVybiBpbnQgX3NwYXdudnAgKCk7CisKKyNlbHNlIC8qICEgX19DWUdXSU5fXyAqLworCisvKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIE1pY3Jvc29mdCBDIHNwYXduIGZ1bmN0aW9ucycgcHJvcGVuc2l0eQorICAgdG8gcmVtb3ZlIHRoZSBvdXRlcm1vc3Qgc2V0IG9mIGRvdWJsZSBxdW90ZXMgZnJvbSBhbGwgYXJndW1lbnRzLiAgKi8KKworY29uc3QgY2hhciAqIGNvbnN0ICoKK2ZpeF9hcmd2IChhcmd2ZWMpCisgICAgIGNoYXIgKiphcmd2ZWM7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDE7IGFyZ3ZlY1tpXSAhPSAwOyBpKyspCisgICAgeworICAgICAgaW50IGxlbiwgajsKKyAgICAgIGNoYXIgKnRlbXAsICpuZXd0ZW1wOworCisgICAgICB0ZW1wID0gYXJndmVjW2ldOworICAgICAgbGVuID0gc3RybGVuICh0ZW1wKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKKyAgICAgICAgeworICAgICAgICAgIGlmICh0ZW1wW2pdID09ICciJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbmV3dGVtcCA9IHhtYWxsb2MgKGxlbiArIDIpOworICAgICAgICAgICAgICBzdHJuY3B5IChuZXd0ZW1wLCB0ZW1wLCBqKTsKKyAgICAgICAgICAgICAgbmV3dGVtcCBbal0gPSAnXFwnOworICAgICAgICAgICAgICBzdHJuY3B5ICgmbmV3dGVtcCBbaisxXSwgJnRlbXAgW2pdLCBsZW4taik7CisgICAgICAgICAgICAgIG5ld3RlbXAgW2xlbisxXSA9IDA7CisgICAgICAgICAgICAgIHRlbXAgPSBuZXd0ZW1wOworICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXJndmVjW2ldID0gdGVtcDsKKyAgICAgIH0KKworICByZXR1cm4gKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBhcmd2ZWM7Cit9CisjZW5kaWYgLyogX19DWUdXSU5fXyAqLworCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKiBtaW5ndzMyIGhlYWRlcnMgbWF5IG5vdCBkZWZpbmUgdGhlIGZvbGxvd2luZy4gICovCisKKyNpZm5kZWYgX1BfV0FJVAorIyAgZGVmaW5lIF9QX1dBSVQJMAorIyAgZGVmaW5lIF9QX05PV0FJVAkxCisjICBkZWZpbmUgX1BfT1ZFUkxBWQkyCisjICBkZWZpbmUgX1BfTk9XQUlUTwkzCisjICBkZWZpbmUgX1BfREVUQUNICTQKKworIyAgZGVmaW5lIFdBSVRfQ0hJTEQJMAorIyAgZGVmaW5lIFdBSVRfR1JBTkRDSElMRAkxCisjZW5kaWYKKworLyogV2luMzIgc3VwcG9ydHMgcGlwZXMgKi8KK2ludAorcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCisgICAgIGNvbnN0IGNoYXIgKnByb2dyYW07CisgICAgIGNoYXIgKiBjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKKyAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOworICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOworICAgICBpbnQgZmxhZ3M7Cit7CisgIGludCBwaWQ7CisgIGludCBwZGVzWzJdLCBvcmdfc3RkaW4sIG9yZ19zdGRvdXQ7CisgIGludCBpbnB1dF9kZXNjLCBvdXRwdXRfZGVzYzsKKyAgaW50IHJldHJpZXMsIHNsZWVwX2ludGVydmFsOworCisgIC8qIFBpcGUgd2FpdGluZyBmcm9tIGxhc3QgcHJvY2VzcywgdG8gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIG5leHQgb25lLgorICAgICBWYWx1ZSBpcyBTVERJTl9GSUxFX05PIGlmIG5vIHBpcGUgaXMgd2FpdGluZworICAgICAoaS5lLiB0aGUgbmV4dCBjb21tYW5kIGlzIHRoZSBmaXJzdCBvZiBhIGdyb3VwKS4gICovCisgIHN0YXRpYyBpbnQgbGFzdF9waXBlX2lucHV0OworCisgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHByb2Nlc3MsIGluaXRpYWxpemUuICAqLworICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9GSVJTVCkKKyAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POworCisgIGlucHV0X2Rlc2MgPSBsYXN0X3BpcGVfaW5wdXQ7CisKKyAgLyogSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBwcm9jZXNzLCBtYWtlIGEgcGlwZSBmb3IgaXRzIG91dHB1dCwKKyAgICAgYW5kIHJlY29yZCBpdCBhcyB3YWl0aW5nIHRvIGJlIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBwcm9jZXNzLiAgKi8KKyAgaWYgKCEgKGZsYWdzICYgUEVYRUNVVEVfTEFTVCkpCisgICAgeworICAgICAgaWYgKF9waXBlIChwZGVzLCAyNTYsIE9fQklOQVJZKSA8IDApCisJeworCSAgKmVycm1zZ19mbXQgPSAicGlwZSI7CisJICAqZXJybXNnX2FyZyA9IE5VTEw7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgb3V0cHV0X2Rlc2MgPSBwZGVzW1dSSVRFX1BPUlRdOworICAgICAgbGFzdF9waXBlX2lucHV0ID0gcGRlc1tSRUFEX1BPUlRdOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIExhc3QgcHJvY2Vzcy4gICovCisgICAgICBvdXRwdXRfZGVzYyA9IFNURE9VVF9GSUxFX05POworICAgICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKKyAgICB9CisKKyAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKKyAgICB7CisgICAgICBvcmdfc3RkaW4gPSBkdXAgKFNURElOX0ZJTEVfTk8pOworICAgICAgZHVwMiAoaW5wdXRfZGVzYywgU1RESU5fRklMRV9OTyk7CisgICAgICBjbG9zZSAoaW5wdXRfZGVzYyk7IAorICAgIH0KKworICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCisgICAgeworICAgICAgb3JnX3N0ZG91dCA9IGR1cCAoU1RET1VUX0ZJTEVfTk8pOworICAgICAgZHVwMiAob3V0cHV0X2Rlc2MsIFNURE9VVF9GSUxFX05PKTsKKyAgICAgIGNsb3NlIChvdXRwdXRfZGVzYyk7CisgICAgfQorCisgIHBpZCA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IF9zcGF3bnZwIDogX3NwYXdudikKKyAgICAoX1BfTk9XQUlULCBwcm9ncmFtLCBmaXhfYXJndihhcmd2KSk7CisKKyAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKKyAgICB7CisgICAgICBkdXAyIChvcmdfc3RkaW4sIFNURElOX0ZJTEVfTk8pOworICAgICAgY2xvc2UgKG9yZ19zdGRpbik7CisgICAgfQorCisgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKKyAgICB7CisgICAgICBkdXAyIChvcmdfc3Rkb3V0LCBTVERPVVRfRklMRV9OTyk7CisgICAgICBjbG9zZSAob3JnX3N0ZG91dCk7CisgICAgfQorCisgIGlmIChwaWQgPT0gLTEpCisgICAgeworICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKKyAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgcmV0dXJuIHBpZDsKK30KKworLyogTVMgQ1JURExMIGRvZXNuJ3QgcmV0dXJuIGVub3VnaCBpbmZvcm1hdGlvbiBpbiBzdGF0dXMgdG8gZGVjaWRlIGlmIHRoZQorICAgY2hpbGQgZXhpdGVkIGR1ZSB0byBhIHNpZ25hbCBvciBub3QsIHJhdGhlciBpdCBzaW1wbHkgcmV0dXJucyBhbgorICAgaW50ZWdlciB3aXRoIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNoaWxkOyBlZy4sIGlmIHRoZSBjaGlsZCBleGl0ZWQgd2l0aCAKKyAgIGFuIGFib3J0KCkgY2FsbCBhbmQgZGlkbid0IGhhdmUgYSBoYW5kbGVyIGZvciBTSUdBQlJULCBpdCBzaW1wbHkgcmV0dXJucworICAgd2l0aCBzdGF0dXMgPSAzLiBXZSBmaXggdGhlIHN0YXR1cyBjb2RlIHRvIGNvbmZvcm0gdG8gdGhlIHVzdWFsIFdJRioKKyAgIG1hY3Jvcy4gTm90ZSB0aGF0IFdJRlNJR05BTEVEIHdpbGwgbmV2ZXIgYmUgdHJ1ZSB1bmRlciBDUlRETEwuICovCisKK2ludAorcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKKyAgICAgaW50IHBpZDsKKyAgICAgaW50ICpzdGF0dXM7CisgICAgIGludCBmbGFnczsKK3sKKyNpZmRlZiBfX0NZR1dJTl9fCisgIHJldHVybiB3YWl0IChzdGF0dXMpOworI2Vsc2UKKyAgaW50IHRlcm1zdGF0OworCisgIHBpZCA9IF9jd2FpdCAoJnRlcm1zdGF0LCBwaWQsIFdBSVRfQ0hJTEQpOworCisgIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgorICAgICBOZWVkZWQ/ICAqLworCisgIC8qIGN3YWl0IHJldHVybnMgdGhlIGNoaWxkIHByb2Nlc3MgZXhpdCBjb2RlIGluIHRlcm1zdGF0LgorICAgICBBIHZhbHVlIG9mIDMgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaWxkIGNhdWdodCBhIHNpZ25hbCwgYnV0IG5vdAorICAgICB3aGljaCBvbmUuICBTaW5jZSBvbmx5IFNJR0FCUlQsIFNJR0ZQRSBhbmQgU0lHSU5UIGRvIGFueXRoaW5nLCB3ZQorICAgICByZXBvcnQgU0lHQUJSVC4gICovCisgIGlmICh0ZXJtc3RhdCA9PSAzKQorICAgICpzdGF0dXMgPSBTSUdBQlJUOworICBlbHNlCisgICAgKnN0YXR1cyA9ICgoKHRlcm1zdGF0KSAmIDB4ZmYpIDw8IDgpOworCisgIHJldHVybiBwaWQ7CisjZW5kaWYgLyogX19DWUdXSU5fXyAqLworfQorCisjZW5kaWYgLyogX1dJTjMyICYmICEgX19VV0lOX18gKi8KKworI2lmZGVmIE9TMgorCisvKiA/Pz8gRG9lcyBPUzIgaGF2ZSBwcm9jZXNzLmg/ICAqLworZXh0ZXJuIGludCBzcGF3bnYgKCk7CitleHRlcm4gaW50IHNwYXdudnAgKCk7CisKK2ludAorcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCisgICAgIGNvbnN0IGNoYXIgKnByb2dyYW07CisgICAgIGNoYXIgKiBjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKKyAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOworICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOworICAgICBpbnQgZmxhZ3M7Cit7CisgIGludCBwaWQ7CisKKyAgaWYgKChmbGFncyAmIFBFWEVDVVRFX09ORSkgIT0gUEVYRUNVVEVfT05FKQorICAgIGFib3J0ICgpOworICAvKiA/Pz8gUHJlc3VtYWJseSAxID09IF9QX05PV0FJVC4gICovCisgIHBpZCA9IChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IHNwYXdudnAgOiBzcGF3bnYpICgxLCBwcm9ncmFtLCBhcmd2KTsKKyAgaWYgKHBpZCA9PSAtMSkKKyAgICB7CisgICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOworICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgcmV0dXJuIHBpZDsKK30KKworaW50Citwd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQorICAgICBpbnQgcGlkOworICAgICBpbnQgKnN0YXR1czsKKyAgICAgaW50IGZsYWdzOworeworICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KKyAgICAgTmVlZGVkPyAgKi8KKyAgaW50IHBpZCA9IHdhaXQgKHN0YXR1cyk7CisgIHJldHVybiBwaWQ7Cit9CisKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmZGVmIE1QVworCisvKiBNUFcgcGV4ZWN1dGUgZG9lc24ndCBhY3R1YWxseSBydW4gYW55dGhpbmc7IGluc3RlYWQsIGl0IHdyaXRlcyBvdXQKKyAgIHNjcmlwdCBjb21tYW5kcyB0aGF0LCB3aGVuIHJ1biwgd2lsbCBkbyB0aGUgYWN0dWFsIGV4ZWN1dGluZy4KKworICAgRm9yIGV4YW1wbGUsIGluIEdDQydzIGNhc2UsIEdDQyB3aWxsIHdyaXRlIG91dCBzZXZlcmFsIHNjcmlwdCBjb21tYW5kczoKKworICAgY3BwIC4uLgorICAgY2MxIC4uLgorICAgYXMgLi4uCisgICBsZCAuLi4KKworICAgYW5kIHRoZW4gZXhpdC4gIE5vbmUgb2YgdGhlIGFib3ZlIHByb2dyYW1zIHdpbGwgaGF2ZSBydW4geWV0LiAgVGhlIHRhc2sKKyAgIHRoYXQgY2FsbGVkIEdDQyB3aWxsIHRoZW4gZXhlY3V0ZSB0aGUgc2NyaXB0IGFuZCBjYXVzZSBjcHAsZXRjLiB0byBydW4uCisgICBUaGUgY2FsbGVyIG11c3QgaW52b2tlIHBmaW5pc2ggYmVmb3JlIGNhbGxpbmcgZXhpdC4gIFRoaXMgYWRkcworICAgdGhlIGZpbmlzaGluZyB0b3VjaGVzIHRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LiAgKi8KKworc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKKworaW50CitwZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKKyAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKKyAgICAgY2hhciAqIGNvbnN0ICphcmd2OworICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOworICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7CisgICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7CisgICAgIGludCBmbGFnczsKK3sKKyAgY2hhciB0bXBwcm9ncmFtWzI1NV07CisgIGNoYXIgKmNwLCAqdG1wbmFtZTsKKyAgaW50IGk7CisKKyAgbXB3aWZ5X2ZpbGVuYW1lIChwcm9ncmFtLCB0bXBwcm9ncmFtKTsKKyAgaWYgKGZpcnN0X3RpbWUpCisgICAgeworICAgICAgcHJpbnRmICgiU2V0IEZhaWxlZCAwXG4iKTsKKyAgICAgIGZpcnN0X3RpbWUgPSAwOworICAgIH0KKworICBmcHV0cyAoIklmIHtGYWlsZWR9ID09IDBcbiIsIHN0ZG91dCk7CisgIC8qIElmIGJlaW5nIHZlcmJvc2UsIG91dHB1dCBhIGNvcHkgb2YgdGhlIGNvbW1hbmQuICBJdCBzaG91bGQgYmUKKyAgICAgYWNjdXJhdGUgZW5vdWdoIGFuZCBlc2NhcGVkIGVub3VnaCB0byBiZSAiY2xpY2thYmxlIi4gICovCisgIGlmIChmbGFncyAmIFBFWEVDVVRFX1ZFUkJPU0UpCisgICAgeworICAgICAgZnB1dHMgKCJcdEVjaG8gIiwgc3Rkb3V0KTsKKyAgICAgIGZwdXRjICgnXCcnLCBzdGRvdXQpOworICAgICAgZnB1dHMgKHRtcHByb2dyYW0sIHN0ZG91dCk7CisgICAgICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKKyAgICAgIGZwdXRjICgnICcsIHN0ZG91dCk7CisgICAgICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQorCXsKKwkgIGZwdXRjICgnXCcnLCBzdGRvdXQpOworCSAgLyogU2VlIGlmIHdlIGhhdmUgYW4gYXJndW1lbnQgdGhhdCBuZWVkcyBmaXhpbmcuICAqLworCSAgaWYgKHN0cmNocihhcmd2W2ldLCAnLycpKQorCSAgICB7CisJICAgICAgdG1wbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDI1Nik7CisJICAgICAgbXB3aWZ5X2ZpbGVuYW1lIChhcmd2W2ldLCB0bXBuYW1lKTsKKwkgICAgICBhcmd2W2ldID0gdG1wbmFtZTsKKwkgICAgfQorCSAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKKwkgICAgeworCSAgICAgIC8qIFdyaXRlIGFuIE9wdGlvbi1kIGVzY2FwZSBjaGFyIGluIGZyb250IG9mIHNwZWNpYWwgY2hhcnMuICAqLworCSAgICAgIGlmIChzdHJjaHIoIicrIiwgKmNwKSkKKwkJZnB1dGMgKCdcMjY2Jywgc3Rkb3V0KTsKKwkgICAgICBmcHV0YyAoKmNwLCBzdGRvdXQpOworCSAgICB9CisJICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKKwkgIGZwdXRjICgnICcsIHN0ZG91dCk7CisJfQorICAgICAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7CisgICAgfQorICBmcHV0cyAoIlx0Iiwgc3Rkb3V0KTsKKyAgZnB1dHMgKHRtcHByb2dyYW0sIHN0ZG91dCk7CisgIGZwdXRjICgnICcsIHN0ZG91dCk7CisKKyAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKKyAgICB7CisgICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBhcmd1bWVudCB0aGF0IG5lZWRzIGZpeGluZy4gICovCisgICAgICBpZiAoc3RyY2hyKGFyZ3ZbaV0sICcvJykpCisJeworCSAgdG1wbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKDI1Nik7CisJICBtcHdpZnlfZmlsZW5hbWUgKGFyZ3ZbaV0sIHRtcG5hbWUpOworCSAgYXJndltpXSA9IHRtcG5hbWU7CisJfQorICAgICAgaWYgKHN0cmNociAoYXJndltpXSwgJyAnKSkKKwlmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKKyAgICAgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCisJeworCSAgLyogV3JpdGUgYW4gT3B0aW9uLWQgZXNjYXBlIGNoYXIgaW4gZnJvbnQgb2Ygc3BlY2lhbCBjaGFycy4gICovCisJICBpZiAoc3RyY2hyKCInKyIsICpjcCkpCisJICAgIGZwdXRjICgnXDI2NicsIHN0ZG91dCk7CisJICBmcHV0YyAoKmNwLCBzdGRvdXQpOworCX0KKyAgICAgIGlmIChzdHJjaHIgKGFyZ3ZbaV0sICcgJykpCisJZnB1dGMgKCdcJycsIHN0ZG91dCk7CisgICAgICBmcHV0YyAoJyAnLCBzdGRvdXQpOworICAgIH0KKworICBmcHV0cyAoIlxuIiwgc3Rkb3V0KTsKKworICAvKiBPdXRwdXQgY29tbWFuZHMgdGhhdCBhcnJhbmdlIHRvIGNsZWFuIHVwIGFuZCBleGl0IGlmIGEgZmFpbHVyZSBvY2N1cnMuCisgICAgIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBjb2xsZWN0IHRoZSBzdGF0dXMgZnJvbSB0aGUgcHJvZ3JhbSB0aGF0IHdhcworICAgICBydW4sIHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgc2NyaXB0IGNvbW1hbmQuICBBbHNvLCB3ZSBkb24ndCBleGl0CisgICAgIGltbWVkaWF0ZWx5LCBzaW5jZSBuZWNlc3NhcnkgY2xlYW51cHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNjcmlwdC4gICovCisgIGZwdXRzICgiXHRTZXQgVG1wU3RhdHVzIHtTdGF0dXN9XG4iLCBzdGRvdXQpOworICBmcHV0cyAoIlx0SWYge1RtcFN0YXR1c30gIT0gMFxuIiwgc3Rkb3V0KTsKKyAgZnB1dHMgKCJcdFx0U2V0IEZhaWxlZCB7VG1wU3RhdHVzfVxuIiwgc3Rkb3V0KTsKKyAgZnB1dHMgKCJcdEVuZFxuIiwgc3Rkb3V0KTsKKyAgZnB1dHMgKCJFbmRcbiIsIHN0ZG91dCk7CisKKyAgLyogV2UncmUganVzdCBjb21wb3NpbmcgYSBzY3JpcHQsIGNhbid0IGZhaWwgaGVyZS4gICovCisgIHJldHVybiAwOworfQorCitpbnQKK3B3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCisgICAgIGludCBwaWQ7CisgICAgIGludCAqc3RhdHVzOworICAgICBpbnQgZmxhZ3M7Cit7CisgICpzdGF0dXMgPSAwOworICByZXR1cm4gMDsKK30KKworLyogV3JpdGUgb3V0IGNvbW1hbmRzIHRoYXQgd2lsbCBleGl0IHdpdGggdGhlIGNvcnJlY3QgZXJyb3IgY29kZQorICAgaWYgc29tZXRoaW5nIGluIHRoZSBzY3JpcHQgZmFpbGVkLiAgKi8KKwordm9pZAorcGZpbmlzaCAoKQoreworICBwcmludGYgKCJcdEV4aXQgXCJ7RmFpbGVkfVwiXG4iKTsKK30KKworI2VuZGlmIC8qIE1QVyAqLworCisvKiBpbmNsdWRlIGZvciBVbml4LWxpa2UgZW52aXJvbm1lbnRzIGJ1dCBub3QgZm9yIERvcy1saWtlIGVudmlyb25tZW50cyAqLworI2lmICEgZGVmaW5lZCAoX19NU0RPU19fKSAmJiAhIGRlZmluZWQgKE9TMikgJiYgISBkZWZpbmVkIChNUFcpIFwKKyAgICAmJiAhIChkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19VV0lOX18pKQorCitleHRlcm4gaW50IGV4ZWN2ICgpOworZXh0ZXJuIGludCBleGVjdnAgKCk7CisKK2ludAorcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCisgICAgIGNvbnN0IGNoYXIgKnByb2dyYW07CisgICAgIGNoYXIgKiBjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKKyAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOworICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOworICAgICBpbnQgZmxhZ3M7Cit7CisgIGludCAoKmZ1bmMpKCkgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBleGVjdnAgOiBleGVjdik7CisgIGludCBwaWQ7CisgIGludCBwZGVzWzJdOworICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7CisgIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKKyAgLyogUGlwZSB3YWl0aW5nIGZyb20gbGFzdCBwcm9jZXNzLCB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUgbmV4dCBvbmUuCisgICAgIFZhbHVlIGlzIFNURElOX0ZJTEVfTk8gaWYgbm8gcGlwZSBpcyB3YWl0aW5nCisgICAgIChpLmUuIHRoZSBuZXh0IGNvbW1hbmQgaXMgdGhlIGZpcnN0IG9mIGEgZ3JvdXApLiAgKi8KKyAgc3RhdGljIGludCBsYXN0X3BpcGVfaW5wdXQ7CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcHJvY2VzcywgaW5pdGlhbGl6ZS4gICovCisgIGlmIChmbGFncyAmIFBFWEVDVVRFX0ZJUlNUKQorICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87CisKKyAgaW5wdXRfZGVzYyA9IGxhc3RfcGlwZV9pbnB1dDsKKworICAvKiBJZiB0aGlzIGlzbid0IHRoZSBsYXN0IHByb2Nlc3MsIG1ha2UgYSBwaXBlIGZvciBpdHMgb3V0cHV0LAorICAgICBhbmQgcmVjb3JkIGl0IGFzIHdhaXRpbmcgdG8gYmUgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHByb2Nlc3MuICAqLworICBpZiAoISAoZmxhZ3MgJiBQRVhFQ1VURV9MQVNUKSkKKyAgICB7CisgICAgICBpZiAocGlwZSAocGRlcykgPCAwKQorCXsKKwkgICplcnJtc2dfZm10ID0gInBpcGUiOworCSAgKmVycm1zZ19hcmcgPSBOVUxMOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKKyAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLworICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKKyAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87CisgICAgfQorCisgIC8qIEZvcmsgYSBzdWJwcm9jZXNzOyB3YWl0IGFuZCByZXRyeSBpZiBpdCBmYWlscy4gICovCisgIHNsZWVwX2ludGVydmFsID0gMTsKKyAgZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDQ7IHJldHJpZXMrKykKKyAgICB7CisgICAgICBwaWQgPSB2Zm9yayAoKTsKKyAgICAgIGlmIChwaWQgPj0gMCkKKwlicmVhazsKKyAgICAgIHNsZWVwIChzbGVlcF9pbnRlcnZhbCk7CisgICAgICBzbGVlcF9pbnRlcnZhbCAqPSAyOworICAgIH0KKworICBzd2l0Y2ggKHBpZCkKKyAgICB7CisgICAgY2FzZSAtMToKKyAgICAgIHsKKwkqZXJybXNnX2ZtdCA9IFZGT1JLX1NUUklORzsKKwkqZXJybXNnX2FyZyA9IE5VTEw7CisJcmV0dXJuIC0xOworICAgICAgfQorCisgICAgY2FzZSAwOiAvKiBjaGlsZCAqLworICAgICAgLyogTW92ZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBwaXBlcyBpbnRvIHBsYWNlLCBpZiBuZWNlc3NhcnkuICAqLworICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKKwl7CisJICBjbG9zZSAoU1RESU5fRklMRV9OTyk7CisJICBkdXAgKGlucHV0X2Rlc2MpOworCSAgY2xvc2UgKGlucHV0X2Rlc2MpOworCX0KKyAgICAgIGlmIChvdXRwdXRfZGVzYyAhPSBTVERPVVRfRklMRV9OTykKKwl7CisJICBjbG9zZSAoU1RET1VUX0ZJTEVfTk8pOworCSAgZHVwIChvdXRwdXRfZGVzYyk7CisJICBjbG9zZSAob3V0cHV0X2Rlc2MpOworCX0KKworICAgICAgLyogQ2xvc2UgdGhlIHBhcmVudCdzIGRlc2NzIHRoYXQgYXJlbid0IHdhbnRlZCBoZXJlLiAgKi8KKyAgICAgIGlmIChsYXN0X3BpcGVfaW5wdXQgIT0gU1RESU5fRklMRV9OTykKKwljbG9zZSAobGFzdF9waXBlX2lucHV0KTsKKworICAgICAgLyogRXhlYyB0aGUgcHJvZ3JhbS4gICovCisgICAgICAoKmZ1bmMpIChwcm9ncmFtLCBhcmd2KTsKKworICAgICAgLyogTm90ZTogQ2FsbGluZyBmcHJpbnRmIGFuZCBleGl0IGhlcmUgZG9lc24ndCBzZWVtIHJpZ2h0IGZvciB2Zm9yay4gICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgdGhpc19wbmFtZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsIGluc3RhbGxfZXJyb3JfbXNnLCBwcm9ncmFtKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIHhzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGV4aXQgKC0xKTsKKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICAgIHJldHVybiAwOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEluIHRoZSBwYXJlbnQsIGFmdGVyIGZvcmtpbmcuCisJIENsb3NlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IHdlIG1hZGUgZm9yIHRoaXMgY2hpbGQuICAqLworICAgICAgaWYgKGlucHV0X2Rlc2MgIT0gU1RESU5fRklMRV9OTykKKwljbG9zZSAoaW5wdXRfZGVzYyk7CisgICAgICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCisJY2xvc2UgKG91dHB1dF9kZXNjKTsKKworICAgICAgLyogUmV0dXJuIGNoaWxkJ3MgcHJvY2VzcyBudW1iZXIuICAqLworICAgICAgcmV0dXJuIHBpZDsKKyAgICB9Cit9CisKK2ludAorcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKKyAgICAgaW50IHBpZDsKKyAgICAgaW50ICpzdGF0dXM7CisgICAgIGludCBmbGFnczsKK3sKKyAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCisgICAgIE5lZWRlZD8gICovCisjaWZkZWYgVk1TCisgIHBpZCA9IHdhaXRwaWQgKC0xLCBzdGF0dXMsIDApOworI2Vsc2UKKyAgcGlkID0gd2FpdCAoc3RhdHVzKTsKKyNlbmRpZgorICByZXR1cm4gcGlkOworfQorCisjZW5kaWYgLyogISBfX01TRE9TX18gJiYgISBPUzIgJiYgISBNUFcgJiYgISAoX1dJTjMyICYmICEgX19VV0lOX18pICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmFuZG9tLmMgYi9saWJpYmVydHkvcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5NTA3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9yYW5kb20uYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKgorICogVGhpcyBpcyBkZXJpdmVkIGZyb20gdGhlIEJlcmtlbGV5IHNvdXJjZToKKyAqCUAoIylyYW5kb20uYwk1LjUgKEJlcmtlbGV5KSA3LzYvODgKKyAqIEl0IHdhcyByZXdvcmtlZCBmb3IgdGhlIEdOVSBDIExpYnJhcnkgYnkgUm9sYW5kIE1jR3JhdGguCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZiAwCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZWxzZQorCisjZGVmaW5lCVVMT05HX01BWCAgKCh1bnNpZ25lZCBsb25nKSh+MEwpKSAgICAgLyogMHhGRkZGRkZGRiBmb3IgMzItYml0cyAqLworI2RlZmluZQlMT05HX01BWCAgICgobG9uZykoVUxPTkdfTUFYID4+IDEpKSAgIC8qIDB4N0ZGRkZGRkYgZm9yIDMyLWJpdHMqLworCisjaWZkZWYgX19TVERDX18KKyMgIGRlZmluZSBQVFIgdm9pZCAqCisjICBpZm5kZWYgTlVMTAorIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCisjICBlbmRpZgorI2Vsc2UKKyMgIGRlZmluZSBQVFIgY2hhciAqCisjICBpZm5kZWYgTlVMTAorIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgorCitsb25nIGludCByYW5kb20gKCk7CisKKy8qIEFuIGltcHJvdmVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBwYWNrYWdlLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCisgICByYW5kKCkvc3JhbmQoKSBsaWtlIGludGVyZmFjZSwgdGhpcyBwYWNrYWdlIGFsc28gaGFzIGEgc3BlY2lhbCBzdGF0ZSBpbmZvCisgICBpbnRlcmZhY2UuICBUaGUgaW5pdHN0YXRlKCkgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBhIHNlZWQsIGFuIGFycmF5IG9mCisgICBieXRlcywgYW5kIGEgY291bnQgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIGJlaW5nIHBhc3NlZCBpbjsgdGhpcyBhcnJheSBpcworICAgdGhlbiBpbml0aWFsaXplZCB0byBjb250YWluIGluZm9ybWF0aW9uIGZvciByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gd2l0aAorICAgdGhhdCBtdWNoIHN0YXRlIGluZm9ybWF0aW9uLiAgR29vZCBzaXplcyBmb3IgdGhlIGFtb3VudCBvZiBzdGF0ZQorICAgaW5mb3JtYXRpb24gYXJlIDMyLCA2NCwgMTI4LCBhbmQgMjU2IGJ5dGVzLiAgVGhlIHN0YXRlIGNhbiBiZSBzd2l0Y2hlZCBieQorICAgY2FsbGluZyB0aGUgc2V0c3RhdGUoKSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGFycmF5IGFzIHdhcyBpbml0aWFsbGl6ZWQKKyAgIHdpdGggaW5pdHN0YXRlKCkuICBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSBydW5zIHdpdGggMTI4IGJ5dGVzIG9mIHN0YXRlCisgICBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhdGVzIGZhciBiZXR0ZXIgcmFuZG9tIG51bWJlcnMgdGhhbiBhIGxpbmVhcgorICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIElmIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gaXMgbGVzcyB0aGFuCisgICAzMiBieXRlcywgYSBzaW1wbGUgbGluZWFyIGNvbmdydWVudGlhbCBSLk4uRy4gaXMgdXNlZC4gIEludGVybmFsbHksIHRoZQorICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBsb25nczsgdGhlIHplcm9ldGggZWxlbWVudCBvZgorICAgdGhlIGFycmF5IGlzIHRoZSB0eXBlIG9mIFIuTi5HLiBiZWluZyB1c2VkIChzbWFsbCBpbnRlZ2VyKTsgdGhlIHJlbWFpbmRlcgorICAgb2YgdGhlIGFycmF5IGlzIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFIuTi5HLiAgVGh1cywgMzIgYnl0ZXMgb2YKKyAgIHN0YXRlIGluZm9ybWF0aW9uIHdpbGwgZ2l2ZSA3IGxvbmdzIHdvcnRoIG9mIHN0YXRlIGluZm9ybWF0aW9uLCB3aGljaCB3aWxsCisgICBhbGxvdyBhIGRlZ3JlZSBzZXZlbiBwb2x5bm9taWFsLiAgKE5vdGU6IFRoZSB6ZXJvZXRoIHdvcmQgb2Ygc3RhdGUKKyAgIGluZm9ybWF0aW9uIGFsc28gaGFzIHNvbWUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkIGluIGl0OyBzZWUgc2V0c3RhdGUKKyAgIGZvciBkZXRhaWxzKS4gIFRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gdGVjaG5pcXVlIGlzIGEgbGluZWFyIGZlZWRiYWNrCisgICBzaGlmdCByZWdpc3RlciBhcHByb2FjaCwgZW1wbG95aW5nIHRyaW5vbWlhbHMgKHNpbmNlIHRoZXJlIGFyZSBmZXdlciB0ZXJtcworICAgdG8gc3VtIHVwIHRoYXQgd2F5KS4gIEluIHRoaXMgYXBwcm9hY2gsIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgYWxsCisgICB0aGUgbnVtYmVycyBpbiB0aGUgc3RhdGUgdGFibGUgd2lsbCBhY3QgYXMgYSBsaW5lYXIgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIsCisgICBhbmQgd2lsbCBoYXZlIHBlcmlvZCAyXmRlZyAtIDEgKHdoZXJlIGRlZyBpcyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsCisgICBiZWluZyB1c2VkLCBhc3N1bWluZyB0aGF0IHRoZSBwb2x5bm9taWFsIGlzIGlycmVkdWNpYmxlIGFuZCBwcmltaXRpdmUpLgorICAgVGhlIGhpZ2hlciBvcmRlciBiaXRzIHdpbGwgaGF2ZSBsb25nZXIgcGVyaW9kcywgc2luY2UgdGhlaXIgdmFsdWVzIGFyZQorICAgYWxzbyBpbmZsdWVuY2VkIGJ5IHBzZXVkby1yYW5kb20gY2FycmllcyBvdXQgb2YgdGhlIGxvd2VyIGJpdHMuICBUaGUKKyAgIHRvdGFsIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yIGlzIGFwcHJveGltYXRlbHkgZGVnKigyKipkZWcgLSAxKTsgdGh1cworICAgZG91YmxpbmcgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBoYXMgYSB2YXN0IGluZmx1ZW5jZSBvbiB0aGUKKyAgIHBlcmlvZCBvZiB0aGUgZ2VuZXJhdG9yLiAgTm90ZTogVGhlIGRlZyooMioqZGVnIC0gMSkgaXMgYW4gYXBwcm94aW1hdGlvbgorICAgb25seSBnb29kIGZvciBsYXJnZSBkZWcsIHdoZW4gdGhlIHBlcmlvZCBvZiB0aGUgc2hpZnQgcmVnaXN0ZXIgaXMgdGhlCisgICBkb21pbmFudCBmYWN0b3IuICBXaXRoIGRlZyBlcXVhbCB0byBzZXZlbiwgdGhlIHBlcmlvZCBpcyBhY3R1YWxseSBtdWNoCisgICBsb25nZXIgdGhhbiB0aGUgNyooMioqNyAtIDEpIHByZWRpY3RlZCBieSB0aGlzIGZvcm11bGEuICAqLworCisKKworLyogRm9yIGVhY2ggb2YgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCB3ZSBoYXZlIGEKKyAgIGJyZWFrIHZhbHVlIG9uIHRoZSBhbW91bnQgb2Ygc3RhdGUgaW5mb3JtYXRpb24gKHlvdSBuZWVkIGF0IGxlYXN0IHRoaQorICAgYnl0ZXMgb2Ygc3RhdGUgaW5mbyB0byBzdXBwb3J0IHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IpLCBhIGRlZ3JlZSBmb3IKKyAgIHRoZSBwb2x5bm9taWFsIChhY3R1YWxseSBhIHRyaW5vbWlhbCkgdGhhdCB0aGUgUi5OLkcuIGlzIGJhc2VkIG9uLCBhbmQKKyAgIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIGxvd2VyIG9yZGVyIGNvZWZmaWNpZW50cyBvZiB0aGUgdHJpbm9taWFsLiAgKi8KKworLyogTGluZWFyIGNvbmdydWVudGlhbC4gICovCisjZGVmaW5lCVRZUEVfMAkJMAorI2RlZmluZQlCUkVBS18wCQk4CisjZGVmaW5lCURFR18wCQkwCisjZGVmaW5lCVNFUF8wCQkwCisKKy8qIHgqKjcgKyB4KiozICsgMS4gICovCisjZGVmaW5lCVRZUEVfMQkJMQorI2RlZmluZQlCUkVBS18xCQkzMgorI2RlZmluZQlERUdfMQkJNworI2RlZmluZQlTRVBfMQkJMworCisvKiB4KioxNSArIHggKyAxLiAgKi8KKyNkZWZpbmUJVFlQRV8yCQkyCisjZGVmaW5lCUJSRUFLXzIJCTY0CisjZGVmaW5lCURFR18yCQkxNQorI2RlZmluZQlTRVBfMgkJMQorCisvKiB4KiozMSArIHgqKjMgKyAxLiAgKi8KKyNkZWZpbmUJVFlQRV8zCQkzCisjZGVmaW5lCUJSRUFLXzMJCTEyOAorI2RlZmluZQlERUdfMwkJMzEKKyNkZWZpbmUJU0VQXzMJCTMKKworLyogeCoqNjMgKyB4ICsgMS4gICovCisjZGVmaW5lCVRZUEVfNAkJNAorI2RlZmluZQlCUkVBS180CQkyNTYKKyNkZWZpbmUJREVHXzQJCTYzCisjZGVmaW5lCVNFUF80CQkxCisKKworLyogQXJyYXkgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIGluZm9ybWF0aW9uIHRvIG1ha2UgY29kZSBydW4gZmFzdGVyLgorICAgUmVsaWVzIG9uIGZhY3QgdGhhdCBUWVBFX2kgPT0gaS4gICovCisKKyNkZWZpbmUJTUFYX1RZUEVTCTUJLyogTWF4IG51bWJlciBvZiB0eXBlcyBhYm92ZS4gICovCisKK3N0YXRpYyBpbnQgZGVncmVlc1tNQVhfVFlQRVNdID0geyBERUdfMCwgREVHXzEsIERFR18yLCBERUdfMywgREVHXzQgfTsKK3N0YXRpYyBpbnQgc2Vwc1tNQVhfVFlQRVNdID0geyBTRVBfMCwgU0VQXzEsIFNFUF8yLCBTRVBfMywgU0VQXzQgfTsKKworCisKKy8qIEluaXRpYWxseSwgZXZlcnl0aGluZyBpcyBzZXQgdXAgYXMgaWYgZnJvbToKKwlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKKyAgIE5vdGUgdGhhdCB0aGlzIGluaXRpYWxpemF0aW9uIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHNyYW5kb20KKyAgIGFkdmFuY2VzIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyAxMCpyYW5kX2RlZyB0aW1lcywgYW5kIGhlbmNlIHRoZQorICAgcmVhciBwb2ludGVyIHdoaWNoIHN0YXJ0cyBhdCAwIHdpbGwgYWxzbyBlbmQgdXAgYXQgemVybzsgdGh1cyB0aGUgemVyb2V0aAorICAgZWxlbWVudCBvZiB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIGNvbnRhaW5zIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQKKyAgIHBvc2l0aW9uIG9mIHRoZSByZWFyIHBvaW50ZXIgaXMganVzdAorCShNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyBUWVBFXzMgPT0gVFlQRV8zLiAgKi8KKworc3RhdGljIGxvbmcgaW50IHJhbmR0YmxbREVHXzMgKyAxXSA9CisgIHsgVFlQRV8zLAorICAgICAgMHg5YTMxOTAzOSwgMHgzMmQ5YzAyNCwgMHg5YjY2MzE4MiwgMHg1ZGExZjM0MiwgCisgICAgICAweGRlM2I4MWUwLCAweGRmMGE2ZmI1LCAweGYxMDNiYzAyLCAweDQ4ZjM0MGZiLCAKKyAgICAgIDB4NzQ0OWU1NmIsIDB4YmViMWRiYjAsIDB4YWI1YzU5MTgsIDB4OTQ2NTU0ZmQsIAorICAgICAgMHg4YzJlNjgwZiwgMHhlYjNkNzk5ZiwgMHhiMTFlZTBiNywgMHgyZDQzNmI4NiwgCisgICAgICAweGRhNjcyZTJhLCAweDE1ODhjYTg4LCAweGUzNjk3MzVkLCAweDkwNGYzNWY3LCAKKyAgICAgIDB4ZDcxNThmZDYsIDB4NmZhNmYwNTEsIDB4NjE2ZTZiOTYsIDB4YWM5NGVmZGMsIAorICAgICAgMHgzNjQxM2Y5MywgMHhjNjIyYzI5OCwgMHhmNWE0MmFiOCwgMHg4YTg4ZDc3YiwgCisgICAgICAweGY1YWQ5ZDBlLCAweDg5OTkyMjBiLCAweDI3ZmI0N2I5CisgICAgfTsKKworLyogRlBUUiBhbmQgUlBUUiBhcmUgdHdvIHBvaW50ZXJzIGludG8gdGhlIHN0YXRlIGluZm8sIGEgZnJvbnQgYW5kIGEgcmVhcgorICAgcG9pbnRlci4gIFRoZXNlIHR3byBwb2ludGVycyBhcmUgYWx3YXlzIHJhbmRfc2VwIHBsYWNlcyBhcGFydHMsIGFzIHRoZXkKKyAgIGN5Y2xlIHRocm91Z2ggdGhlIHN0YXRlIGluZm9ybWF0aW9uLiAgKFllcywgdGhpcyBkb2VzIG1lYW4gd2UgY291bGQgZ2V0CisgICBhd2F5IHdpdGgganVzdCBvbmUgcG9pbnRlciwgYnV0IHRoZSBjb2RlIGZvciByYW5kb20gaXMgbW9yZSBlZmZpY2llbnQKKyAgIHRoaXMgd2F5KS4gIFRoZSBwb2ludGVycyBhcmUgbGVmdCBwb3NpdGlvbmVkIGFzIHRoZXkgd291bGQgYmUgZnJvbSB0aGUgY2FsbDoKKwlpbml0c3RhdGUoMSwgcmFuZHRibCwgMTI4KTsKKyAgIChUaGUgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciwgcnB0ciwgaXMgcmVhbGx5IDAgKGFzIGV4cGxhaW5lZCBhYm92ZQorICAgaW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmwpIGJlY2F1c2UgdGhlIHN0YXRlIHRhYmxlIHBvaW50ZXIgaXMgc2V0CisgICB0byBwb2ludCB0byByYW5kdGJsWzFdIChhcyBleHBsYWluZWQgYmVsb3cpLikgICovCisKK3N0YXRpYyBsb25nIGludCAqZnB0ciA9ICZyYW5kdGJsW1NFUF8zICsgMV07CitzdGF0aWMgbG9uZyBpbnQgKnJwdHIgPSAmcmFuZHRibFsxXTsKKworCisKKy8qIFRoZSBmb2xsb3dpbmcgdGhpbmdzIGFyZSB0aGUgcG9pbnRlciB0byB0aGUgc3RhdGUgaW5mb3JtYXRpb24gdGFibGUsCisgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBnZW5lcmF0b3IsIHRoZSBkZWdyZWUgb2YgdGhlIGN1cnJlbnQgcG9seW5vbWlhbAorICAgYmVpbmcgdXNlZCwgYW5kIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHR3byBwb2ludGVycy4KKyAgIE5vdGUgdGhhdCBmb3IgZWZmaWNpZW5jeSBvZiByYW5kb20sIHdlIHJlbWVtYmVyIHRoZSBmaXJzdCBsb2NhdGlvbiBvZgorICAgdGhlIHN0YXRlIGluZm9ybWF0aW9uLCBub3QgdGhlIHplcm9ldGguICBIZW5jZSBpdCBpcyB2YWxpZCB0byBhY2Nlc3MKKyAgIHN0YXRlWy0xXSwgd2hpY2ggaXMgdXNlZCB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgUi5OLkcuCisgICBBbHNvLCB3ZSByZW1lbWJlciB0aGUgbGFzdCBsb2NhdGlvbiwgc2luY2UgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuCisgICBpbmRleGluZyBldmVyeSB0aW1lIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgZWxlbWVudCB0byBzZWUgaWYKKyAgIHRoZSBmcm9udCBhbmQgcmVhciBwb2ludGVycyBoYXZlIHdyYXBwZWQuICAqLworCitzdGF0aWMgbG9uZyBpbnQgKnN0YXRlID0gJnJhbmR0YmxbMV07CisKK3N0YXRpYyBpbnQgcmFuZF90eXBlID0gVFlQRV8zOworc3RhdGljIGludCByYW5kX2RlZyA9IERFR18zOworc3RhdGljIGludCByYW5kX3NlcCA9IFNFUF8zOworCitzdGF0aWMgbG9uZyBpbnQgKmVuZF9wdHIgPSAmcmFuZHRibFtzaXplb2YocmFuZHRibCkgLyBzaXplb2YocmFuZHRibFswXSldOworDAorLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIGdpdmVuIHNlZWQuICBJZiB0aGUKKyAgIHR5cGUgaXMgdGhlIHRyaXZpYWwgbm8tc3RhdGUtaW5mb3JtYXRpb24gdHlwZSwganVzdCByZW1lbWJlciB0aGUgc2VlZC4KKyAgIE90aGVyd2lzZSwgaW5pdGlhbGl6ZXMgc3RhdGVbXSBiYXNlZCBvbiB0aGUgZ2l2ZW4gInNlZWQiIHZpYSBhIGxpbmVhcgorICAgY29uZ3J1ZW50aWFsIGdlbmVyYXRvci4gIFRoZW4sIHRoZSBwb2ludGVycyBhcmUgc2V0IHRvIGtub3duIGxvY2F0aW9ucworICAgdGhhdCBhcmUgZXhhY3RseSByYW5kX3NlcCBwbGFjZXMgYXBhcnQuICBMYXN0bHksIGl0IGN5Y2xlcyB0aGUgc3RhdGUKKyAgIGluZm9ybWF0aW9uIGEgZ2l2ZW4gbnVtYmVyIG9mIHRpbWVzIHRvIGdldCByaWQgb2YgYW55IGluaXRpYWwgZGVwZW5kZW5jaWVzCisgICBpbnRyb2R1Y2VkIGJ5IHRoZSBMLkMuUi5OLkcuICBOb3RlIHRoYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHJhbmR0YmxbXQorICAgZm9yIGRlZmF1bHQgdXNhZ2UgcmVsaWVzIG9uIHZhbHVlcyBwcm9kdWNlZCBieSB0aGlzIHJvdXRpbmUuICAqLwordm9pZAorc3JhbmRvbSAoeCkKKyAgdW5zaWduZWQgaW50IHg7Cit7CisgIHN0YXRlWzBdID0geDsKKyAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCisgICAgeworICAgICAgcmVnaXN0ZXIgbG9uZyBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5kX2RlZzsgKytpKQorCXN0YXRlW2ldID0gKDExMDM1MTUxNDUgKiBzdGF0ZVtpIC0gMV0pICsgMTIzNDU7CisgICAgICBmcHRyID0gJnN0YXRlW3JhbmRfc2VwXTsKKyAgICAgIHJwdHIgPSAmc3RhdGVbMF07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAgKiByYW5kX2RlZzsgKytpKQorCXJhbmRvbSgpOworICAgIH0KK30KKwwKKy8qIEluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiBhcnJheSBvZiBOIGJ5dGVzIGZvcgorICAgZnV0dXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbi4gIEJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UKKyAgIGFyZSBnaXZlbiwgYW5kIHRoZSBicmVhayB2YWx1ZXMgZm9yIHRoZSBkaWZmZXJlbnQgUi5OLkcuJ3MsIHdlIGNob29zZQorICAgdGhlIGJlc3QgKGxhcmdlc3QpIG9uZSB3ZSBjYW4gYW5kIHNldCB0aGluZ3MgdXAgZm9yIGl0LiAgc3JhbmRvbSBpcworICAgdGhlbiBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgb24gcmV0dXJuCisgICBmcm9tIHNyYW5kb20sIHdlIHNldCBzdGF0ZVstMV0gdG8gYmUgdGhlIHR5cGUgbXVsdGlwbGV4ZWQgd2l0aCB0aGUgY3VycmVudAorICAgdmFsdWUgb2YgdGhlIHJlYXIgcG9pbnRlcjsgdGhpcyBpcyBzbyBzdWNjZXNzaXZlIGNhbGxzIHRvIGluaXRzdGF0ZSB3b24ndAorICAgbG9zZSB0aGlzIGluZm9ybWF0aW9uIGFuZCB3aWxsIGJlIGFibGUgdG8gcmVzdGFydCB3aXRoIHNldHN0YXRlLgorICAgTm90ZTogVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGlzIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUsIGlmIGFueSwganVzdCBsaWtlCisgICBzZXRzdGF0ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHdoZW4gaW5pdHN0YXRlIGlzIGNhbGxlZC4KKyAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvbGQgc3RhdGUuICAqLworUFRSCitpbml0c3RhdGUgKHNlZWQsIGFyZ19zdGF0ZSwgbikKKyAgdW5zaWduZWQgaW50IHNlZWQ7CisgIFBUUiBhcmdfc3RhdGU7CisgIHVuc2lnbmVkIGxvbmcgbjsKK3sKKyAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07CisKKyAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCisgICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOworICBlbHNlCisgICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKKyAgaWYgKG4gPCBCUkVBS18xKQorICAgIHsKKyAgICAgIGlmIChuIDwgQlJFQUtfMCkKKwl7CisJICBlcnJubyA9IEVJTlZBTDsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMDsKKyAgICAgIHJhbmRfZGVnID0gREVHXzA7CisgICAgICByYW5kX3NlcCA9IFNFUF8wOworICAgIH0KKyAgZWxzZSBpZiAobiA8IEJSRUFLXzIpCisgICAgeworICAgICAgcmFuZF90eXBlID0gVFlQRV8xOworICAgICAgcmFuZF9kZWcgPSBERUdfMTsKKyAgICAgIHJhbmRfc2VwID0gU0VQXzE7CisgICAgfQorICBlbHNlIGlmIChuIDwgQlJFQUtfMykKKyAgICB7CisgICAgICByYW5kX3R5cGUgPSBUWVBFXzI7CisgICAgICByYW5kX2RlZyA9IERFR18yOworICAgICAgcmFuZF9zZXAgPSBTRVBfMjsKKyAgICB9CisgIGVsc2UgaWYgKG4gPCBCUkVBS180KQorICAgIHsKKyAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMzsKKyAgICAgIHJhbmRfZGVnID0gREVHXzM7CisgICAgICByYW5kX3NlcCA9IFNFUF8zOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJhbmRfdHlwZSA9IFRZUEVfNDsKKyAgICAgIHJhbmRfZGVnID0gREVHXzQ7CisgICAgICByYW5kX3NlcCA9IFNFUF80OworICAgIH0KKworICBzdGF0ZSA9ICYoKGxvbmcgaW50ICopIGFyZ19zdGF0ZSlbMV07CS8qIEZpcnN0IGxvY2F0aW9uLiAgKi8KKyAgLyogTXVzdCBzZXQgRU5EX1BUUiBiZWZvcmUgc3JhbmRvbS4gICovCisgIGVuZF9wdHIgPSAmc3RhdGVbcmFuZF9kZWddOworICBzcmFuZG9tKHNlZWQpOworICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKKyAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7CisgIGVsc2UKKyAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOworCisgIHJldHVybiBvc3RhdGU7Cit9CisMCisvKiBSZXN0b3JlIHRoZSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBhcnJheS4KKyAgIE5vdGU6IEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIGFsc28gcmVtZW1iZXIgdGhlIGxvY2F0aW9ucyBvZiB0aGUgcG9pbnRlcnMKKyAgIGluIHRoZSBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uLCBhbmQgcmVzdG9yZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycworICAgZnJvbSB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IG11bHRpcGxleGluZyB0aGUgcG9pbnRlcgorICAgbG9jYXRpb24gaW50byB0aGUgemVyb2V0aCB3b3JkIG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGR1ZQorICAgdG8gdGhlIG9yZGVyIGluIHdoaWNoIHRoaW5ncyBhcmUgZG9uZSwgaXQgaXMgT0sgdG8gY2FsbCBzZXRzdGF0ZSB3aXRoIHRoZQorICAgc2FtZSBzdGF0ZSBhcyB0aGUgY3VycmVudCBzdGF0ZQorICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZSBpbmZvcm1hdGlvbi4gICovCisKK1BUUgorc2V0c3RhdGUgKGFyZ19zdGF0ZSkKKyAgUFRSIGFyZ19zdGF0ZTsKK3sKKyAgcmVnaXN0ZXIgbG9uZyBpbnQgKm5ld19zdGF0ZSA9IChsb25nIGludCAqKSBhcmdfc3RhdGU7CisgIHJlZ2lzdGVyIGludCB0eXBlID0gbmV3X3N0YXRlWzBdICUgTUFYX1RZUEVTOworICByZWdpc3RlciBpbnQgcmVhciA9IG5ld19zdGF0ZVswXSAvIE1BWF9UWVBFUzsKKyAgUFRSIG9zdGF0ZSA9IChQVFIpICZzdGF0ZVstMV07CisKKyAgaWYgKHJhbmRfdHlwZSA9PSBUWVBFXzApCisgICAgc3RhdGVbLTFdID0gcmFuZF90eXBlOworICBlbHNlCisgICAgc3RhdGVbLTFdID0gKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIHJhbmRfdHlwZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgVFlQRV8wOgorICAgIGNhc2UgVFlQRV8xOgorICAgIGNhc2UgVFlQRV8yOgorICAgIGNhc2UgVFlQRV8zOgorICAgIGNhc2UgVFlQRV80OgorICAgICAgcmFuZF90eXBlID0gdHlwZTsKKyAgICAgIHJhbmRfZGVnID0gZGVncmVlc1t0eXBlXTsKKyAgICAgIHJhbmRfc2VwID0gc2Vwc1t0eXBlXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBTdGF0ZSBpbmZvIG11bmdlZC4gICovCisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBzdGF0ZSA9ICZuZXdfc3RhdGVbMV07CisgIGlmIChyYW5kX3R5cGUgIT0gVFlQRV8wKQorICAgIHsKKyAgICAgIHJwdHIgPSAmc3RhdGVbcmVhcl07CisgICAgICBmcHRyID0gJnN0YXRlWyhyZWFyICsgcmFuZF9zZXApICUgcmFuZF9kZWddOworICAgIH0KKyAgLyogU2V0IGVuZF9wdHIgdG9vLiAgKi8KKyAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107CisKKyAgcmV0dXJuIG9zdGF0ZTsKK30KKwwKKy8qIElmIHdlIGFyZSB1c2luZyB0aGUgdHJpdmlhbCBUWVBFXzAgUi5OLkcuLCBqdXN0IGRvIHRoZSBvbGQgbGluZWFyCisgICBjb25ncnVlbnRpYWwgYml0LiAgT3RoZXJ3aXNlLCB3ZSBkbyBvdXIgZmFuY3kgdHJpbm9taWFsIHN0dWZmLCB3aGljaCBpcyB0aGUKKyAgIHNhbWUgaW4gYWxsIHRoZXIgb3RoZXIgY2FzZXMgZHVlIHRvIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbgorICAgc2V0IHVwLiAgVGhlIGJhc2ljIG9wZXJhdGlvbiBpcyB0byBhZGQgdGhlIG51bWJlciBhdCB0aGUgcmVhciBwb2ludGVyIGludG8KKyAgIHRoZSBvbmUgYXQgdGhlIGZyb250IHBvaW50ZXIuICBUaGVuIGJvdGggcG9pbnRlcnMgYXJlIGFkdmFuY2VkIHRvIHRoZSBuZXh0CisgICBsb2NhdGlvbiBjeWNsaWNhbGx5IGluIHRoZSB0YWJsZS4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgc3VtIGdlbmVyYXRlZCwKKyAgIHJlZHVjZWQgdG8gMzEgYml0cyBieSB0aHJvd2luZyBhd2F5IHRoZSAibGVhc3QgcmFuZG9tIiBsb3cgYml0LgorICAgTm90ZTogVGhlIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgZnJvbnQgYW5kCisgICByZWFyIHBvaW50ZXJzIGNhbid0IHdyYXAgb24gdGhlIHNhbWUgY2FsbCBieSBub3QgdGVzdGluZyB0aGUgcmVhcgorICAgcG9pbnRlciBpZiB0aGUgZnJvbnQgb25lIGhhcyB3cmFwcGVkLiAgUmV0dXJucyBhIDMxLWJpdCByYW5kb20gbnVtYmVyLiAgKi8KKworbG9uZyBpbnQKK3JhbmRvbSAoKQoreworICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKKyAgICB7CisgICAgICBzdGF0ZVswXSA9ICgoc3RhdGVbMF0gKiAxMTAzNTE1MjQ1KSArIDEyMzQ1KSAmIExPTkdfTUFYOworICAgICAgcmV0dXJuIHN0YXRlWzBdOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxvbmcgaW50IGk7CisgICAgICAqZnB0ciArPSAqcnB0cjsKKyAgICAgIC8qIENodWNraW5nIGxlYXN0IHJhbmRvbSBiaXQuICAqLworICAgICAgaSA9ICgqZnB0ciA+PiAxKSAmIExPTkdfTUFYOworICAgICAgKytmcHRyOworICAgICAgaWYgKGZwdHIgPj0gZW5kX3B0cikKKwl7CisJICBmcHRyID0gc3RhdGU7CisJICArK3JwdHI7CisJfQorICAgICAgZWxzZQorCXsKKwkgICsrcnB0cjsKKwkgIGlmIChycHRyID49IGVuZF9wdHIpCisJICAgIHJwdHIgPSBzdGF0ZTsKKwl9CisgICAgICByZXR1cm4gaTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvcmVuYW1lLmMgYi9saWJpYmVydHkvcmVuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNmUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9yZW5hbWUuYwpAQCAtMCwwICsxLDIyIEBACisvKiByZW5hbWUgLS0gcmVuYW1lIGEgZmlsZQorICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KKworLyogUmVuYW1lIGEgZmlsZS4gICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQKK3JlbmFtZSAoemZyb20sIHp0bykKKyAgICAgY2hhciAqemZyb207CisgICAgIGNoYXIgKnp0bzsKK3sKKyAgaWYgKGxpbmsgKHpmcm9tLCB6dG8pIDwgMCkKKyAgICB7CisgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQorCXJldHVybiAtMTsKKyAgICAgIGlmICh1bmxpbmsgKHp0bykgPCAwCisJICB8fCBsaW5rICh6ZnJvbSwgenRvKSA8IDApCisJcmV0dXJuIC0xOworICAgIH0KKyAgcmV0dXJuIHVubGluayAoemZyb20pOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JpbmRleC5jIGIvbGliaWJlcnR5L3JpbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWQxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvcmluZGV4LmMKQEAgLTAsMCArMSwxMSBAQAorLyogU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiAob2Jzb2xldGUpIHJpbmRleCgpLiAqLworCitleHRlcm4gY2hhciAqc3RycmNociAoKTsKKworY2hhciAqCityaW5kZXggKHMsIGMpCisgIGNoYXIgKnM7CisgIGludCBjOworeworICByZXR1cm4gc3RycmNociAocywgYyk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc2lnc2V0bWFzay5jIGIvbGliaWJlcnR5L3NpZ3NldG1hc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTA5ZTZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3NpZ3NldG1hc2suYwpAQCAtMCwwICsxLDMwIEBACisvKiBWZXJzaW9uIG9mIHNpZ3NldG1hc2suYworICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiAoc2FjQGN5Z251cy5jb20pLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisgICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb2FtaW4uICovCisKKy8qIFNldCB0aGUgY3VycmVudCBzaWduYWwgbWFzayB0byB0aGUgc2V0IHByb3ZpZGVkLCBhbmQgcmV0dXJuIHRoZSAKKyAgIHByZXZpb3VzIHZhbHVlICovCisKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisvKiBJbmNsdWRpbmcgPHN5cy90eXBlcy5oPiBzZWVtcyB0byBiZSBuZWVkZWQgYnkgSVNDLiAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaWZkZWYgU0lHX1NFVE1BU0sKK2ludAorREVGVU4oc2lnc2V0bWFzaywoc2V0KSwKKyAgICAgIGludCBzZXQpCit7CisgICAgc2lnc2V0X3QgbmV3OworICAgIHNpZ3NldF90IG9sZDsKKyAgICAKKyAgICBzaWdlbXB0eXNldCAoJm5ldyk7CisgICAgaWYgKHNldCAhPSAwKSB7CisgICAgICBhYm9ydCgpOwkvKiBGSVhNRSwgd2UgZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlIG9sZCBtYXNrIHRvIG5ldyAqLworICAgIH0KKyAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm5ldywgJm9sZCk7CisgICAgcmV0dXJuIDE7CS8qIEZJWE1FLCB3ZSBhbHdheXMgcmV0dXJuIDEgYXMgb2xkIHZhbHVlLiAgKi8KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwYWNlcy5jIGIvbGliaWJlcnR5L3NwYWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTI1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvc3BhY2VzLmMKQEAgLTAsMCArMSw3OCBAQAorLyogQWxsb2NhdGUgbWVtb3J5IHJlZ2lvbiBmaWxsZWQgd2l0aCBzcGFjZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KK0xpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorCitOQU1FCisKKwlzcGFjZXMgLS0gcmV0dXJuIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBmdWxsIG9mIHNwYWNlcworCitTWU5PUFNJUworCisJY2hhciAqc3BhY2VzIChpbnQgY291bnQpCisKK0RFU0NSSVBUSU9OCisKKwlSZXR1cm5zIGEgcG9pbnRlciB0byBhIG1lbW9yeSByZWdpb24gZmlsbGVkIHdpdGggdGhlIHNwZWNpZmllZAorCW51bWJlciBvZiBzcGFjZXMgYW5kIG51bGwgdGVybWluYXRlZC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzCisJdmFsaWQgdW50aWwgYXQgbGVhc3QgdGhlIG5leHQgY2FsbC4KKwkKK0JVR1MKKworKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpZiBWTVMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bml4bGliLmg+CisjZWxzZQorLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGVzZSBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KK2V4dGVybiBQVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworZXh0ZXJuIHZvaWQgZnJlZSBQQVJBTVMgKChQVFIpKTsKKyNlbmRpZgorCitjb25zdCBjaGFyICoKK3NwYWNlcyAoY291bnQpCisgIGludCBjb3VudDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqdDsKKyAgc3RhdGljIGNoYXIgKmJ1ZjsKKyAgc3RhdGljIGludCBtYXhzaXplOworCisgIGlmIChjb3VudCA+IG1heHNpemUpCisgICAgeworICAgICAgaWYgKGJ1ZikKKwl7CisJICBmcmVlIChidWYpOworCX0KKyAgICAgIGJ1ZiA9IG1hbGxvYyAoY291bnQgKyAxKTsKKyAgICAgIGlmIChidWYgPT0gKGNoYXIgKikgMCkKKwlyZXR1cm4gMDsKKyAgICAgIGZvciAodCA9IGJ1ZiArIGNvdW50IDsgdCAhPSBidWYgOyApCisJeworCSAgKi0tdCA9ICcgJzsKKwl9CisgICAgICBtYXhzaXplID0gY291bnQ7CisgICAgICBidWZbY291bnRdID0gJ1wwJzsKKyAgICB9CisgIHJldHVybiAoY29uc3QgY2hhciAqKSAoYnVmICsgbWF4c2l6ZSAtIGNvdW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwbGF5LXRyZWUuYyBiL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiYjVhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qIEEgc3BsYXktdHJlZSBkYXRhdHlwZS4gIAorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTWFyayBNaXRjaGVsbCAobWFya0BtYXJrbWl0Y2hlbGwuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgorICAgCitHTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBGb3IgYW4gZWFzaWx5IHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHNwbGF5LXRyZWVzLCBzZWU6CisKKyAgICAgTGV3aXMsIEhhcnJ5IFIuIGFuZCBEZW5lbmJlcmcsIExhcnJ5LiAgRGF0YSBTdHJ1Y3R1cmVzIGFuZCBUaGVpcgorICAgICBBbGdvcml0aG1zLiAgSGFycGVyLUNvbGxpbnMsIEluYy4gIDE5OTEuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgInNwbGF5LXRyZWUuaCIKKworc3RhdGljIHZvaWQgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyICAgIFBBUkFNUygoc3BsYXlfdHJlZSwgCisJCQkJCQlzcGxheV90cmVlX25vZGUpKTsKK3N0YXRpYyB2b2lkIHNwbGF5X3RyZWVfc3BsYXkgICAgICAgICAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCisJCQkJCQlzcGxheV90cmVlX2tleSkpOworc3RhdGljIHNwbGF5X3RyZWVfbm9kZSBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAorCQkJCQkJc3BsYXlfdHJlZV9rZXksCisJCQkJCQlzcGxheV90cmVlX25vZGUqLAorCQkJCQkJc3BsYXlfdHJlZV9ub2RlKiwKKwkJCQkJCXNwbGF5X3RyZWVfbm9kZSopKTsKK3N0YXRpYyBpbnQgc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAgICBQQVJBTVMoKHNwbGF5X3RyZWUsCisJCQkJCSAgICAgICAgc3BsYXlfdHJlZV9ub2RlLAorCQkJCQkJc3BsYXlfdHJlZV9mb3JlYWNoX2ZuLAorCQkJCQkJdm9pZCopKTsKKworLyogRGVhbGxvY2F0ZSBOT0RFIChhIG1lbWJlciBvZiBTUCksIGFuZCBhbGwgaXRzIHN1Yi10cmVlcy4gICovCisKK3N0YXRpYyB2b2lkIAorc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZSkKKyAgICAgc3BsYXlfdHJlZSBzcDsKKyAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Cit7CisgIGlmICghbm9kZSkKKyAgICByZXR1cm47CisKKyAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgbm9kZS0+bGVmdCk7CisgIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUtPnJpZ2h0KTsKKworICBpZiAoc3AtPmRlbGV0ZV9rZXkpCisgICAgKCpzcC0+ZGVsZXRlX2tleSkobm9kZS0+a2V5KTsKKyAgaWYgKHNwLT5kZWxldGVfdmFsdWUpCisgICAgKCpzcC0+ZGVsZXRlX3ZhbHVlKShub2RlLT52YWx1ZSk7CisKKyAgZnJlZSAoKGNoYXIqKSBub2RlKTsKK30KKworLyogSGVscCBzcGxheSBTUCBhcm91bmQgS0VZLiAgUEFSRU5UIGFuZCBHUkFORFBBUkVOVCBhcmUgdGhlIHBhcmVudAorICAgYW5kIGdyYW5kcGFyZW50LCByZXNwZWN0aXZlbHksIG9mIE5PREUuICAqLworCitzdGF0aWMgc3BsYXlfdHJlZV9ub2RlCitzcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgbm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkKKyAgICAgc3BsYXlfdHJlZSBzcDsKKyAgICAgc3BsYXlfdHJlZV9rZXkga2V5OworICAgICBzcGxheV90cmVlX25vZGUgKm5vZGU7CisgICAgIHNwbGF5X3RyZWVfbm9kZSAqcGFyZW50OworICAgICBzcGxheV90cmVlX25vZGUgKmdyYW5kcGFyZW50OworeworICBzcGxheV90cmVlX25vZGUgKm5leHQ7CisgIHNwbGF5X3RyZWVfbm9kZSBuOworICBpbnQgY29tcGFyaXNvbjsKKyAgCisgIG4gPSAqbm9kZTsKKworICBpZiAoIW4pCisgICAgcmV0dXJuICpwYXJlbnQ7CisKKyAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApIChrZXksIG4tPmtleSk7CisKKyAgaWYgKGNvbXBhcmlzb24gPT0gMCkKKyAgICAvKiBXZSd2ZSBmb3VuZCB0aGUgdGFyZ2V0LiAgKi8KKyAgICBuZXh0ID0gMDsKKyAgZWxzZSBpZiAoY29tcGFyaXNvbiA8IDApCisgICAgLyogVGhlIHRhcmdldCBpcyB0byB0aGUgbGVmdC4gICovCisgICAgbmV4dCA9ICZuLT5sZWZ0OworICBlbHNlIAorICAgIC8qIFRoZSB0YXJnZXQgaXMgdG8gdGhlIHJpZ2h0LiAgKi8KKyAgICBuZXh0ID0gJm4tPnJpZ2h0OworCisgIGlmIChuZXh0KQorICAgIHsKKyAgICAgIC8qIENvbnRpbnVlIGRvd24gdGhlIHRyZWUuICAqLworICAgICAgbiA9IHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCBuZXh0LCBub2RlLCBwYXJlbnQpOworCisgICAgICAvKiBUaGUgcmVjdXJzaXZlIGNhbGwgd2lsbCBjaGFuZ2UgdGhlIHBsYWNlIHRvIHdoaWNoIE5PREUKKwkgcG9pbnRzLiAgKi8KKyAgICAgIGlmICgqbm9kZSAhPSBuKQorCXJldHVybiBuOworICAgIH0KKworICBpZiAoIXBhcmVudCkKKyAgICAvKiBOT0RFIGlzIHRoZSByb290LiAgV2UgYXJlIGRvbmUuICAqLworICAgIHJldHVybiBuOworCisgIC8qIEZpcnN0LCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gZ3JhbmRwYXJlbnQgKGkuZS4sCisgICAgICpQQVJFTlQgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuKSAgKi8KKyAgaWYgKCFncmFuZHBhcmVudCkgCisgICAgeworICAgICAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0KQorCXsKKwkgICpub2RlID0gbi0+cmlnaHQ7CisJICBuLT5yaWdodCA9ICpwYXJlbnQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgICpub2RlID0gbi0+bGVmdDsKKwkgIG4tPmxlZnQgPSAqcGFyZW50OworCX0KKyAgICAgICpwYXJlbnQgPSBuOworICAgICAgcmV0dXJuIG47CisgICAgfQorCisgIC8qIE5leHQgaGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBib3RoIE4gYW5kICpQQVJFTlQgYXJlIGxlZnQgY2hpbGRyZW4sCisgICAgIG9yIHdoZXJlIGJvdGggYXJlIHJpZ2h0IGNoaWxkcmVuLiAgKi8KKyAgaWYgKG4gPT0gKCpwYXJlbnQpLT5sZWZ0ICYmICpwYXJlbnQgPT0gKCpncmFuZHBhcmVudCktPmxlZnQpCisgICAgeworICAgICAgc3BsYXlfdHJlZV9ub2RlIHAgPSAqcGFyZW50OworCisgICAgICAoKmdyYW5kcGFyZW50KS0+bGVmdCA9IHAtPnJpZ2h0OworICAgICAgcC0+cmlnaHQgPSAqZ3JhbmRwYXJlbnQ7CisgICAgICBwLT5sZWZ0ID0gbi0+cmlnaHQ7CisgICAgICBuLT5yaWdodCA9IHA7CisgICAgICAqZ3JhbmRwYXJlbnQgPSBuOworICAgICAgcmV0dXJuIG47IAorICAgIH0KKyAgZWxzZSBpZiAgKG4gPT0gKCpwYXJlbnQpLT5yaWdodCAmJiAqcGFyZW50ID09ICgqZ3JhbmRwYXJlbnQpLT5yaWdodCkKKyAgICB7CisgICAgICBzcGxheV90cmVlX25vZGUgcCA9ICpwYXJlbnQ7CisKKyAgICAgICgqZ3JhbmRwYXJlbnQpLT5yaWdodCA9IHAtPmxlZnQ7CisgICAgICBwLT5sZWZ0ID0gKmdyYW5kcGFyZW50OworICAgICAgcC0+cmlnaHQgPSBuLT5sZWZ0OworICAgICAgbi0+bGVmdCA9IHA7CisgICAgICAqZ3JhbmRwYXJlbnQgPSBuOworICAgICAgcmV0dXJuIG47CisgICAgfQorCisgIC8qIEZpbmFsbHksIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBOIGlzIGEgbGVmdCBjaGlsZCwgYnV0ICpQQVJFTlQKKyAgICAgaXMgYSByaWdodCBjaGlsZCwgb3IgdmljZSB2ZXJzYS4gICovCisgIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCkgCisgICAgeworICAgICAgKCpwYXJlbnQpLT5sZWZ0ID0gbi0+cmlnaHQ7CisgICAgICBuLT5yaWdodCA9ICpwYXJlbnQ7CisgICAgICAoKmdyYW5kcGFyZW50KS0+cmlnaHQgPSBuLT5sZWZ0OworICAgICAgbi0+bGVmdCA9ICpncmFuZHBhcmVudDsKKyAgICAgICpncmFuZHBhcmVudCA9IG47CisgICAgICByZXR1cm4gbjsKKyAgICB9IAorICBlbHNlCisgICAgeworICAgICAgKCpwYXJlbnQpLT5yaWdodCA9IG4tPmxlZnQ7CisgICAgICBuLT5sZWZ0ID0gKnBhcmVudDsKKyAgICAgICgqZ3JhbmRwYXJlbnQpLT5sZWZ0ID0gbi0+cmlnaHQ7CisgICAgICBuLT5yaWdodCA9ICpncmFuZHBhcmVudDsKKyAgICAgICpncmFuZHBhcmVudCA9IG47CisgICAgICByZXR1cm4gbjsKKyAgICB9Cit9CisKKy8qIFNwbGF5IFNQIGFyb3VuZCBLRVkuICAqLworCitzdGF0aWMgdm9pZAorc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSkKKyAgICAgc3BsYXlfdHJlZSBzcDsKKyAgICAgc3BsYXlfdHJlZV9rZXkga2V5OworeworICBpZiAoc3AtPnJvb3QgPT0gMCkKKyAgICByZXR1cm47CisKKyAgc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksICZzcC0+cm9vdCwgCisJCQkgICAvKmdyYW5kcGFyZW50PSovMCwgLypwYXJlbnQ9Ki8wKTsgCit9CisKKy8qIENhbGwgRk4sIHBhc3NpbmcgaXQgdGhlIERBVEEsIGZvciBldmVyeSBub2RlIGJlbG93IE5PREUsIGFsbCBvZgorICAgd2hpY2ggYXJlIGZyb20gU1AsIGZvbGxvd2luZyBhbiBpbi1vcmRlciB0cmF2ZXJzYWwuICBJZiBGTiBldmVyeQorICAgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgaXRlcmF0aW9uIGNlYXNlcyBpbW1lZGlhdGVseSwgYW5kIHRoZQorICAgdmFsdWUgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KKworc3RhdGljIGludAorc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUsIGZuLCBkYXRhKQorICAgICBzcGxheV90cmVlIHNwOworICAgICBzcGxheV90cmVlX25vZGUgbm9kZTsKKyAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOworICAgICB2b2lkKiBkYXRhOworeworICBpbnQgdmFsOworCisgIGlmICghbm9kZSkKKyAgICByZXR1cm4gMDsKKworICB2YWwgPSBzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyIChzcCwgbm9kZS0+bGVmdCwgZm4sIGRhdGEpOworICBpZiAodmFsKQorICAgIHJldHVybiB2YWw7CisKKyAgdmFsID0gKCpmbikobm9kZSwgZGF0YSk7CisgIGlmICh2YWwpCisgICAgcmV0dXJuIHZhbDsKKworICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUtPnJpZ2h0LCBmbiwgZGF0YSk7Cit9CisKKy8qIEFsbG9jYXRlIGEgbmV3IHNwbGF5IHRyZWUsIHVzaW5nIENPTVBBUkVfRk4gdG8gY29tcGFyZSBub2RlcywKKyAgIERFTEVURV9LRVlfRk4gdG8gZGVhbGxvY2F0ZSBrZXlzLCBhbmQgREVMRVRFX1ZBTFVFX0ZOIHRvIGRlYWxsb2NhdGUKKyAgIHZhbHVlcy4gICovCisKK3NwbGF5X3RyZWUgCitzcGxheV90cmVlX25ldyAoY29tcGFyZV9mbiwgZGVsZXRlX2tleV9mbiwgZGVsZXRlX3ZhbHVlX2ZuKQorICAgICBzcGxheV90cmVlX2NvbXBhcmVfZm4gY29tcGFyZV9mbjsKKyAgICAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuIGRlbGV0ZV9rZXlfZm47CisgICAgIHNwbGF5X3RyZWVfZGVsZXRlX3ZhbHVlX2ZuIGRlbGV0ZV92YWx1ZV9mbjsKK3sKKyAgc3BsYXlfdHJlZSBzcCA9IChzcGxheV90cmVlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlKSk7CisgIHNwLT5yb290ID0gMDsKKyAgc3AtPmNvbXAgPSBjb21wYXJlX2ZuOworICBzcC0+ZGVsZXRlX2tleSA9IGRlbGV0ZV9rZXlfZm47CisgIHNwLT5kZWxldGVfdmFsdWUgPSBkZWxldGVfdmFsdWVfZm47CisKKyAgcmV0dXJuIHNwOworfQorCisvKiBEZWFsbG9jYXRlIFNQLiAgKi8KKwordm9pZCAKK3NwbGF5X3RyZWVfZGVsZXRlIChzcCkKKyAgICAgc3BsYXlfdHJlZSBzcDsKK3sKKyAgc3BsYXlfdHJlZV9kZWxldGVfaGVscGVyIChzcCwgc3AtPnJvb3QpOworICBmcmVlICgoY2hhciopIHNwKTsKK30KKworLyogSW5zZXJ0IGEgbmV3IG5vZGUgKGFzc29jaWF0aW5nIEtFWSB3aXRoIERBVEEpIGludG8gU1AuICBJZiBhCisgICBwcmV2aW91cyBub2RlIHdpdGggdGhlIGluZGljYXRlZCBLRVkgZXhpc3RzLCBpdHMgZGF0YSBpcyByZXBsYWNlZAorICAgd2l0aCB0aGUgbmV3IHZhbHVlLiAgKi8KKwordm9pZCAKK3NwbGF5X3RyZWVfaW5zZXJ0IChzcCwga2V5LCB2YWx1ZSkKKyAgICAgc3BsYXlfdHJlZSBzcDsKKyAgICAgc3BsYXlfdHJlZV9rZXkga2V5OworICAgICBzcGxheV90cmVlX3ZhbHVlIHZhbHVlOworeworICBpbnQgY29tcGFyaXNvbjsKKworICBzcGxheV90cmVlX3NwbGF5IChzcCwga2V5KTsKKworICBpZiAoc3AtPnJvb3QpCisgICAgY29tcGFyaXNvbiA9ICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSk7CisKKyAgaWYgKHNwLT5yb290ICYmIGNvbXBhcmlzb24gPT0gMCkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbHJlYWR5IGhhcyB0aGUgaW5kaWNhdGVkIEtFWSwganVzdAorCSByZXBsYWNlIHRoZSB2YWx1ZSB3aXRoIFZBTFVFLiAgKi8KKyAgICAgIGlmIChzcC0+ZGVsZXRlX3ZhbHVlKQorCSgqc3AtPmRlbGV0ZV92YWx1ZSkoc3AtPnJvb3QtPnZhbHVlKTsKKyAgICAgIHNwLT5yb290LT52YWx1ZSA9IHZhbHVlOworICAgIH0gCisgIGVsc2UgCisgICAgeworICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUsIGFuZCBpbnNlcnQgaXQgYXQgdGhlIHJvb3QuICAqLworICAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7CisgICAgICAKKyAgICAgIG5vZGUgPSAoc3BsYXlfdHJlZV9ub2RlKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzcGxheV90cmVlX25vZGUpKTsKKyAgICAgIG5vZGUtPmtleSA9IGtleTsKKyAgICAgIG5vZGUtPnZhbHVlID0gdmFsdWU7CisgICAgICAKKyAgICAgIGlmICghc3AtPnJvb3QpCisJbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0ID0gMDsKKyAgICAgIGVsc2UgaWYgKGNvbXBhcmlzb24gPCAwKQorCXsKKwkgIG5vZGUtPmxlZnQgPSBzcC0+cm9vdDsKKwkgIG5vZGUtPnJpZ2h0ID0gbm9kZS0+bGVmdC0+cmlnaHQ7CisJICBub2RlLT5sZWZ0LT5yaWdodCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5vZGUtPnJpZ2h0ID0gc3AtPnJvb3Q7CisJICBub2RlLT5sZWZ0ID0gbm9kZS0+cmlnaHQtPmxlZnQ7CisJICBub2RlLT5yaWdodC0+bGVmdCA9IDA7CisJfQorCisgICAgc3AtPnJvb3QgPSBub2RlOworICB9Cit9CisKKy8qIExvb2t1cCBLRVkgaW4gU1AsIHJldHVybmluZyBWQUxVRSBpZiBwcmVzZW50LCBhbmQgTlVMTCAKKyAgIG90aGVyd2lzZS4gICovCisKK3NwbGF5X3RyZWVfbm9kZQorc3BsYXlfdHJlZV9sb29rdXAgKHNwLCBrZXkpCisgICAgIHNwbGF5X3RyZWUgc3A7CisgICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKK3sKKyAgc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSk7CisKKyAgaWYgKHNwLT5yb290ICYmICgqc3AtPmNvbXApKHNwLT5yb290LT5rZXksIGtleSkgPT0gMCkKKyAgICByZXR1cm4gc3AtPnJvb3Q7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogQ2FsbCBGTiwgcGFzc2luZyBpdCB0aGUgREFUQSwgZm9yIGV2ZXJ5IG5vZGUgaW4gU1AsIGZvbGxvd2luZyBhbgorICAgaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGUKKyAgIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisgICBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiAgKi8KKworaW50CitzcGxheV90cmVlX2ZvcmVhY2ggKHNwLCBmbiwgZGF0YSkKKyAgICAgc3BsYXlfdHJlZSBzcDsKKyAgICAgc3BsYXlfdHJlZV9mb3JlYWNoX2ZuIGZuOworICAgICB2b2lkICpkYXRhOworeworICByZXR1cm4gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIHNwLT5yb290LCBmbiwgZGF0YSk7Cit9CisKKy8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgaW50cy4gICovCisKK2ludAorc3BsYXlfdHJlZV9jb21wYXJlX2ludHMgKGsxLCBrMikKKyAgICAgc3BsYXlfdHJlZV9rZXkgazE7CisgICAgIHNwbGF5X3RyZWVfa2V5IGsyOworeworICBpZiAoKGludCkgazEgPCAoaW50KSBrMikKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKChpbnQpIGsxID4gKGludCkgazIpCisgICAgcmV0dXJuIDE7CisgIGVsc2UgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFNwbGF5LXRyZWUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdHJlYXRpbmcgdGhlIGtleXMgYXMgcG9pbnRlcnMuICAqLworCitpbnQKK3NwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyAoazEsIGsyKQorICAgICBzcGxheV90cmVlX2tleSBrMTsKKyAgICAgc3BsYXlfdHJlZV9rZXkgazI7Cit7CisgIGlmICgoY2hhciopIGsxIDwgKGNoYXIqKSBrMikKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKChjaGFyKikgazEgPiAoY2hhciopIGsyKQorICAgIHJldHVybiAxOworICBlbHNlIAorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmNhc2VjbXAuYyBiL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhOTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgorICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKKyAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCisgKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXN0cmNhc2VjbXAuYwk1LjUgKEJlcmtlbGV5KSAxMS8yNC84NyI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCisvKgorICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKKyAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKKyAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcm1hcFtdID0geworCSh1YyknXDAwMCcsKHVjKSdcMDAxJywodWMpJ1wwMDInLCh1YyknXDAwMycsKHVjKSdcMDA0JywodWMpJ1wwMDUnLCh1YyknXDAwNicsKHVjKSdcMDA3JywKKwkodWMpJ1wwMTAnLCh1YyknXDAxMScsKHVjKSdcMDEyJywodWMpJ1wwMTMnLCh1YyknXDAxNCcsKHVjKSdcMDE1JywodWMpJ1wwMTYnLCh1YyknXDAxNycsCisJKHVjKSdcMDIwJywodWMpJ1wwMjEnLCh1YyknXDAyMicsKHVjKSdcMDIzJywodWMpJ1wwMjQnLCh1YyknXDAyNScsKHVjKSdcMDI2JywodWMpJ1wwMjcnLAorCSh1YyknXDAzMCcsKHVjKSdcMDMxJywodWMpJ1wwMzInLCh1YyknXDAzMycsKHVjKSdcMDM0JywodWMpJ1wwMzUnLCh1YyknXDAzNicsKHVjKSdcMDM3JywKKwkodWMpJ1wwNDAnLCh1YyknXDA0MScsKHVjKSdcMDQyJywodWMpJ1wwNDMnLCh1YyknXDA0NCcsKHVjKSdcMDQ1JywodWMpJ1wwNDYnLCh1YyknXDA0NycsCisJKHVjKSdcMDUwJywodWMpJ1wwNTEnLCh1YyknXDA1MicsKHVjKSdcMDUzJywodWMpJ1wwNTQnLCh1YyknXDA1NScsKHVjKSdcMDU2JywodWMpJ1wwNTcnLAorCSh1YyknXDA2MCcsKHVjKSdcMDYxJywodWMpJ1wwNjInLCh1YyknXDA2MycsKHVjKSdcMDY0JywodWMpJ1wwNjUnLCh1YyknXDA2NicsKHVjKSdcMDY3JywKKwkodWMpJ1wwNzAnLCh1YyknXDA3MScsKHVjKSdcMDcyJywodWMpJ1wwNzMnLCh1YyknXDA3NCcsKHVjKSdcMDc1JywodWMpJ1wwNzYnLCh1YyknXDA3NycsCisJKHVjKSdcMTAwJywodWMpJ1wxNDEnLCh1YyknXDE0MicsKHVjKSdcMTQzJywodWMpJ1wxNDQnLCh1YyknXDE0NScsKHVjKSdcMTQ2JywodWMpJ1wxNDcnLAorCSh1YyknXDE1MCcsKHVjKSdcMTUxJywodWMpJ1wxNTInLCh1YyknXDE1MycsKHVjKSdcMTU0JywodWMpJ1wxNTUnLCh1YyknXDE1NicsKHVjKSdcMTU3JywKKwkodWMpJ1wxNjAnLCh1YyknXDE2MScsKHVjKSdcMTYyJywodWMpJ1wxNjMnLCh1YyknXDE2NCcsKHVjKSdcMTY1JywodWMpJ1wxNjYnLCh1YyknXDE2NycsCisJKHVjKSdcMTcwJywodWMpJ1wxNzEnLCh1YyknXDE3MicsKHVjKSdcMTMzJywodWMpJ1wxMzQnLCh1YyknXDEzNScsKHVjKSdcMTM2JywodWMpJ1wxMzcnLAorCSh1YyknXDE0MCcsKHVjKSdcMTQxJywodWMpJ1wxNDInLCh1YyknXDE0MycsKHVjKSdcMTQ0JywodWMpJ1wxNDUnLCh1YyknXDE0NicsKHVjKSdcMTQ3JywKKwkodWMpJ1wxNTAnLCh1YyknXDE1MScsKHVjKSdcMTUyJywodWMpJ1wxNTMnLCh1YyknXDE1NCcsKHVjKSdcMTU1JywodWMpJ1wxNTYnLCh1YyknXDE1NycsCisJKHVjKSdcMTYwJywodWMpJ1wxNjEnLCh1YyknXDE2MicsKHVjKSdcMTYzJywodWMpJ1wxNjQnLCh1YyknXDE2NScsKHVjKSdcMTY2JywodWMpJ1wxNjcnLAorCSh1YyknXDE3MCcsKHVjKSdcMTcxJywodWMpJ1wxNzInLCh1YyknXDE3MycsKHVjKSdcMTc0JywodWMpJ1wxNzUnLCh1YyknXDE3NicsKHVjKSdcMTc3JywKKwkodWMpJ1wyMDAnLCh1YyknXDIwMScsKHVjKSdcMjAyJywodWMpJ1wyMDMnLCh1YyknXDIwNCcsKHVjKSdcMjA1JywodWMpJ1wyMDYnLCh1YyknXDIwNycsCisJKHVjKSdcMjEwJywodWMpJ1wyMTEnLCh1YyknXDIxMicsKHVjKSdcMjEzJywodWMpJ1wyMTQnLCh1YyknXDIxNScsKHVjKSdcMjE2JywodWMpJ1wyMTcnLAorCSh1YyknXDIyMCcsKHVjKSdcMjIxJywodWMpJ1wyMjInLCh1YyknXDIyMycsKHVjKSdcMjI0JywodWMpJ1wyMjUnLCh1YyknXDIyNicsKHVjKSdcMjI3JywKKwkodWMpJ1wyMzAnLCh1YyknXDIzMScsKHVjKSdcMjMyJywodWMpJ1wyMzMnLCh1YyknXDIzNCcsKHVjKSdcMjM1JywodWMpJ1wyMzYnLCh1YyknXDIzNycsCisJKHVjKSdcMjQwJywodWMpJ1wyNDEnLCh1YyknXDI0MicsKHVjKSdcMjQzJywodWMpJ1wyNDQnLCh1YyknXDI0NScsKHVjKSdcMjQ2JywodWMpJ1wyNDcnLAorCSh1YyknXDI1MCcsKHVjKSdcMjUxJywodWMpJ1wyNTInLCh1YyknXDI1MycsKHVjKSdcMjU0JywodWMpJ1wyNTUnLCh1YyknXDI1NicsKHVjKSdcMjU3JywKKwkodWMpJ1wyNjAnLCh1YyknXDI2MScsKHVjKSdcMjYyJywodWMpJ1wyNjMnLCh1YyknXDI2NCcsKHVjKSdcMjY1JywodWMpJ1wyNjYnLCh1YyknXDI2NycsCisJKHVjKSdcMjcwJywodWMpJ1wyNzEnLCh1YyknXDI3MicsKHVjKSdcMjczJywodWMpJ1wyNzQnLCh1YyknXDI3NScsKHVjKSdcMjc2JywodWMpJ1wyNzcnLAorCSh1YyknXDMwMCcsKHVjKSdcMzQxJywodWMpJ1wzNDInLCh1YyknXDM0MycsKHVjKSdcMzQ0JywodWMpJ1wzNDUnLCh1YyknXDM0NicsKHVjKSdcMzQ3JywKKwkodWMpJ1wzNTAnLCh1YyknXDM1MScsKHVjKSdcMzUyJywodWMpJ1wzNTMnLCh1YyknXDM1NCcsKHVjKSdcMzU1JywodWMpJ1wzNTYnLCh1YyknXDM1NycsCisJKHVjKSdcMzYwJywodWMpJ1wzNjEnLCh1YyknXDM2MicsKHVjKSdcMzYzJywodWMpJ1wzNjQnLCh1YyknXDM2NScsKHVjKSdcMzY2JywodWMpJ1wzNjcnLAorCSh1YyknXDM3MCcsKHVjKSdcMzcxJywodWMpJ1wzNzInLCh1YyknXDMzMycsKHVjKSdcMzM0JywodWMpJ1wzMzUnLCh1YyknXDMzNicsKHVjKSdcMzM3JywKKwkodWMpJ1wzNDAnLCh1YyknXDM0MScsKHVjKSdcMzQyJywodWMpJ1wzNDMnLCh1YyknXDM0NCcsKHVjKSdcMzQ1JywodWMpJ1wzNDYnLCh1YyknXDM0NycsCisJKHVjKSdcMzUwJywodWMpJ1wzNTEnLCh1YyknXDM1MicsKHVjKSdcMzUzJywodWMpJ1wzNTQnLCh1YyknXDM1NScsKHVjKSdcMzU2JywodWMpJ1wzNTcnLAorCSh1YyknXDM2MCcsKHVjKSdcMzYxJywodWMpJ1wzNjInLCh1YyknXDM2MycsKHVjKSdcMzY0JywodWMpJ1wzNjUnLCh1YyknXDM2NicsKHVjKSdcMzY3JywKKwkodWMpJ1wzNzAnLCh1YyknXDM3MScsKHVjKSdcMzcyJywodWMpJ1wzNzMnLCh1YyknXDM3NCcsKHVjKSdcMzc1JywodWMpJ1wzNzYnLCh1YyknXDM3NycsCit9OworCitpbnQKK3N0cmNhc2VjbXAoczEsIHMyKQorICAgIGNvbnN0IGNoYXIgKnMxLCAqczI7Cit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB1MSwgdTI7CisKKyAgICBmb3IgKDs7KSB7CisJdTEgPSAodW5zaWduZWQgY2hhcikgKnMxKys7CisJdTIgPSAodW5zaWduZWQgY2hhcikgKnMyKys7CisJaWYgKGNoYXJtYXBbdTFdICE9IGNoYXJtYXBbdTJdKSB7CisJICAgIHJldHVybiBjaGFybWFwW3UxXSAtIGNoYXJtYXBbdTJdOworCX0KKwlpZiAodTEgPT0gJ1wwJykgeworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RyY2hyLmMgYi9saWJpYmVydHkvc3RyY2hyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwNDgwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9zdHJjaHIuYwpAQCAtMCwwICsxLDM0IEBACisvKiBQb3J0YWJsZSB2ZXJzaW9uIG9mIHN0cmNocigpCisgICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KKworLyoKK05BTUUKKwlzdHJjaHIgLS0gcmV0dXJuIHBvaW50ZXIgdG8gZmlyc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCisKK1NZTk9QU0lTCisJY2hhciAqc3RyY2hyIChjb25zdCBjaGFyICpzLCBpbnQgYykKKworREVTQ1JJUFRJT04KKwlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCisJc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KKwkKK0JVR1MKKwlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KKwlkZXBlbmRlbnQuCisqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKworY2hhciAqCitzdHJjaHIgKHMsIGMpCisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIGludCBjOworeworICBkbyB7CisgICAgaWYgKCpzID09IGMpCisgICAgICB7CisJcmV0dXJuIChjaGFyKilzOworICAgICAgfQorICB9IHdoaWxlICgqcysrKTsKKyAgcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJkdXAuYyBiL2xpYmliZXJ0eS9zdHJkdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg1YjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3N0cmR1cC5jCkBAIC0wLDAgKzEsMTAgQEAKK2NoYXIgKgorc3RyZHVwKHMpCisgICAgIGNoYXIgKnM7Cit7CisgICAgY2hhciAqcmVzdWx0ID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocykgKyAxKTsKKyAgICBpZiAocmVzdWx0ID09IChjaGFyKikwKQorCXJldHVybiAoY2hhciopMDsKKyAgICBzdHJjcHkocmVzdWx0LCBzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cmVycm9yLmMgYi9saWJpYmVydHkvc3RyZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDRjYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3N0cmVycm9yLmMKQEAgLTAsMCArMSw4MzEgQEAKKy8qIEV4dGVuZGVkIHN1cHBvcnQgZm9yIHVzaW5nIGVycm5vIHZhbHVlcy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAgZm5mQGN5Z251cy5jb20KKyAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tUGVyIEJvdGhuZXIuICAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9TWVNfRVJSTElTVAorLyogTm90ZSB0aGF0IGVycm5vLmggKG5vdCBzdXJlIHdoYXQgT1MpIG9yIHN0ZGlvLmggKEJTRCA0LjQsIGF0IGxlYXN0KQorICAgbWlnaHQgZGVjbGFyZSBzeXNfZXJybGlzdCBpbiBhIHdheSB0aGF0IHRoZSBjb21waWxlciBtaWdodCBjb25zaWRlcgorICAgaW5jb21wYXRpYmxlIHdpdGggb3VyIGxhdGVyIGRlY2xhcmF0aW9uLCBwZXJoYXBzIGJ5IHVzaW5nIGNvbnN0CisgICBhdHRyaWJ1dGVzLiAgU28gd2UgaGlkZSB0aGUgZGVjbGFyYXRpb24gaW4gZXJybm8uaCAoaWYgYW55KSB1c2luZyBhCisgICBtYWNyby4gKi8KKyNkZWZpbmUgc3lzX2Vycmxpc3Qgc3lzX2Vycmxpc3RfXworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZmRlZiBIQVZFX1NZU19FUlJMSVNUCisjdW5kZWYgc3lzX2Vycmxpc3QKKyNlbmRpZgorCisvKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLworCisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2V4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KK2V4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CQkJLyogNC4xMS42LjEgKi8KKyNlbHNlCS8qICFfX1NURENfXyAqLworZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KK2V4dGVybiBjaGFyICptZW1zZXQgKCk7CisjZW5kaWYJLyogX19TVERDX18gKi8KKworI2lmbmRlZiBNQVgKKyMgIGRlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGluaXRfZXJyb3JfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIGVycm5vIHZhbHVlcy4gIFNlZSBpbnRybygyKSBpbiBtb3N0IFVOSVggc3lzdGVtcworICAgUHJvZ3JhbW1lcnMgUmVmZXJlbmNlIE1hbnVhbHMuCisKKyAgIE5vdGUgdGhhdCB0aGlzIHRhYmxlIGlzIGdlbmVyYWxseSBvbmx5IGFjY2Vzc2VkIHdoZW4gaXQgaXMgdXNlZCBhdCBydW50aW1lCisgICB0byBpbml0aWFsaXplIGVycm5vIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzIHRoYXQgYXJlIGluZGV4ZWQgYnkgZXJybm8KKyAgIHZhbHVlLgorCisgICBOb3QgYWxsIG9mIHRoZXNlIGVycm5vcyB3aWxsIGV4aXN0IG9uIGFsbCBzeXN0ZW1zLiAgVGhpcyB0YWJsZSBpcyB0aGUgb25seQorICAgdGhpbmcgdGhhdCBzaG91bGQgaGF2ZSB0byBiZSB1cGRhdGVkIGFzIG5ldyBlcnJvciBudW1iZXJzIGFyZSBpbnRyb2R1Y2VkLgorICAgSXQncyBzb3J0IG9mIHVnbHksIGJ1dCBhdCBsZWFzdCBpdHMgcG9ydGFibGUuICovCisKK3N0cnVjdCBlcnJvcl9pbmZvCit7CisgIGludCB2YWx1ZTsJCS8qIFRoZSBudW1lcmljIHZhbHVlIGZyb20gPGVycm5vLmg+ICovCisgIGNvbnN0IGNoYXIgKm5hbWU7CS8qIFRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlICovCisjaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKKyAgY29uc3QgY2hhciAqbXNnOwkvKiBTaG9ydCBtZXNzYWdlIGFib3V0IHRoaXMgdmFsdWUgKi8KKyNlbmRpZgorfTsKKworI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCisjICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZSwgbXNnfQorI2Vsc2UKKyMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXJyb3JfaW5mbyBlcnJvcl90YWJsZVtdID0KK3sKKyNpZiBkZWZpbmVkIChFUEVSTSkKKyAgRU5UUlkoRVBFUk0sICJFUEVSTSIsICJOb3Qgb3duZXIiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT0VOVCkKKyAgRU5UUlkoRU5PRU5ULCAiRU5PRU5UIiwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVTUkNIKQorICBFTlRSWShFU1JDSCwgIkVTUkNIIiwgIk5vIHN1Y2ggcHJvY2VzcyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUlOVFIpCisgIEVOVFJZKEVJTlRSLCAiRUlOVFIiLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVJTykKKyAgRU5UUlkoRUlPLCAiRUlPIiwgIkkvTyBlcnJvciIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5YSU8pCisgIEVOVFJZKEVOWElPLCAiRU5YSU8iLCAiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRTJCSUcpCisgIEVOVFJZKEUyQklHLCAiRTJCSUciLCAiQXJnIGxpc3QgdG9vIGxvbmciKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT0VYRUMpCisgIEVOVFJZKEVOT0VYRUMsICJFTk9FWEVDIiwgIkV4ZWMgZm9ybWF0IGVycm9yIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQkFERikKKyAgRU5UUlkoRUJBREYsICJFQkFERiIsICJCYWQgZmlsZSBudW1iZXIiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVDSElMRCkKKyAgRU5UUlkoRUNISUxELCAiRUNISUxEIiwgIk5vIGNoaWxkIHByb2Nlc3NlcyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVdPVUxEQkxPQ0spCS8qIFB1dCBiZWZvcmUgRUFHQUlOLCBzb21ldGltZXMgYWxpYXNlZCAqLworICBFTlRSWShFV09VTERCTE9DSywgIkVXT1VMREJMT0NLIiwgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUFHQUlOKQorICBFTlRSWShFQUdBSU4sICJFQUdBSU4iLCAiTm8gbW9yZSBwcm9jZXNzZXMiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT01FTSkKKyAgRU5UUlkoRU5PTUVNLCAiRU5PTUVNIiwgIk5vdCBlbm91Z2ggc3BhY2UiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVBQ0NFUykKKyAgRU5UUlkoRUFDQ0VTLCAiRUFDQ0VTIiwgIlBlcm1pc3Npb24gZGVuaWVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFRkFVTFQpCisgIEVOVFJZKEVGQVVMVCwgIkVGQVVMVCIsICJCYWQgYWRkcmVzcyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PVEJMSykKKyAgRU5UUlkoRU5PVEJMSywgIkVOT1RCTEsiLCAiQmxvY2sgZGV2aWNlIHJlcXVpcmVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQlVTWSkKKyAgRU5UUlkoRUJVU1ksICJFQlVTWSIsICJEZXZpY2UgYnVzeSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUVYSVNUKQorICBFTlRSWShFRVhJU1QsICJFRVhJU1QiLCAiRmlsZSBleGlzdHMiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVYREVWKQorICBFTlRSWShFWERFViwgIkVYREVWIiwgIkNyb3NzLWRldmljZSBsaW5rIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTk9ERVYpCisgIEVOVFJZKEVOT0RFViwgIkVOT0RFViIsICJObyBzdWNoIGRldmljZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PVERJUikKKyAgRU5UUlkoRU5PVERJUiwgIkVOT1RESVIiLCAiTm90IGEgZGlyZWN0b3J5IiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFSVNESVIpCisgIEVOVFJZKEVJU0RJUiwgIkVJU0RJUiIsICJJcyBhIGRpcmVjdG9yeSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUlOVkFMKQorICBFTlRSWShFSU5WQUwsICJFSU5WQUwiLCAiSW52YWxpZCBhcmd1bWVudCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5GSUxFKQorICBFTlRSWShFTkZJTEUsICJFTkZJTEUiLCAiRmlsZSB0YWJsZSBvdmVyZmxvdyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU1GSUxFKQorICBFTlRSWShFTUZJTEUsICJFTUZJTEUiLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PVFRZKQorICBFTlRSWShFTk9UVFksICJFTk9UVFkiLCAiTm90IGEgdHlwZXdyaXRlciIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVRYVEJTWSkKKyAgRU5UUlkoRVRYVEJTWSwgIkVUWFRCU1kiLCAiVGV4dCBmaWxlIGJ1c3kiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVGQklHKQorICBFTlRSWShFRkJJRywgIkVGQklHIiwgIkZpbGUgdG9vIGxhcmdlIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTk9TUEMpCisgIEVOVFJZKEVOT1NQQywgIkVOT1NQQyIsICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVNQSVBFKQorICBFTlRSWShFU1BJUEUsICJFU1BJUEUiLCAiSWxsZWdhbCBzZWVrIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFUk9GUykKKyAgRU5UUlkoRVJPRlMsICJFUk9GUyIsICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVNTElOSykKKyAgRU5UUlkoRU1MSU5LLCAiRU1MSU5LIiwgIlRvbyBtYW55IGxpbmtzIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFUElQRSkKKyAgRU5UUlkoRVBJUEUsICJFUElQRSIsICJCcm9rZW4gcGlwZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRURPTSkKKyAgRU5UUlkoRURPTSwgIkVET00iLCAiTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVSQU5HRSkKKyAgRU5UUlkoRVJBTkdFLCAiRVJBTkdFIiwgIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTk9NU0cpCisgIEVOVFJZKEVOT01TRywgIkVOT01TRyIsICJObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUlEUk0pCisgIEVOVFJZKEVJRFJNLCAiRUlEUk0iLCAiSWRlbnRpZmllciByZW1vdmVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQ0hSTkcpCisgIEVOVFJZKEVDSFJORywgIkVDSFJORyIsICJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMMk5TWU5DKQorICBFTlRSWShFTDJOU1lOQywgIkVMMk5TWU5DIiwgIkxldmVsIDIgbm90IHN5bmNocm9uaXplZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUwzSExUKQorICBFTlRSWShFTDNITFQsICJFTDNITFQiLCAiTGV2ZWwgMyBoYWx0ZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMM1JTVCkKKyAgRU5UUlkoRUwzUlNULCAiRUwzUlNUIiwgIkxldmVsIDMgcmVzZXQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMTlJORykKKyAgRU5UUlkoRUxOUk5HLCAiRUxOUk5HIiwgIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVVOQVRDSCkKKyAgRU5UUlkoRVVOQVRDSCwgIkVVTkFUQ0giLCAiUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PQ1NJKQorICBFTlRSWShFTk9DU0ksICJFTk9DU0kiLCAiTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMMkhMVCkKKyAgRU5UUlkoRUwySExULCAiRUwySExUIiwgIkxldmVsIDIgaGFsdGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFREVBRExLKQorICBFTlRSWShFREVBRExLLCAiRURFQURMSyIsICJEZWFkbG9jayBjb25kaXRpb24iKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT0xDSykKKyAgRU5UUlkoRU5PTENLLCAiRU5PTENLIiwgIk5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVCQURFKQorICBFTlRSWShFQkFERSwgIkVCQURFIiwgIkludmFsaWQgZXhjaGFuZ2UiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVCQURSKQorICBFTlRSWShFQkFEUiwgIkVCQURSIiwgIkludmFsaWQgcmVxdWVzdCBkZXNjcmlwdG9yIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWEZVTEwpCisgIEVOVFJZKEVYRlVMTCwgIkVYRlVMTCIsICJFeGNoYW5nZSBmdWxsIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTk9BTk8pCisgIEVOVFJZKEVOT0FOTywgIkVOT0FOTyIsICJObyBhbm9kZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUJBRFJRQykKKyAgRU5UUlkoRUJBRFJRQywgIkVCQURSUUMiLCAiSW52YWxpZCByZXF1ZXN0IGNvZGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVCQURTTFQpCisgIEVOVFJZKEVCQURTTFQsICJFQkFEU0xUIiwgIkludmFsaWQgc2xvdCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRURFQURMT0NLKQorICBFTlRSWShFREVBRExPQ0ssICJFREVBRExPQ0siLCAiRmlsZSBsb2NraW5nIGRlYWRsb2NrIGVycm9yIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQkZPTlQpCisgIEVOVFJZKEVCRk9OVCwgIkVCRk9OVCIsICJCYWQgZm9udCBmaWxlIGZvcm1hdCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PU1RSKQorICBFTlRSWShFTk9TVFIsICJFTk9TVFIiLCAiRGV2aWNlIG5vdCBhIHN0cmVhbSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PREFUQSkKKyAgRU5UUlkoRU5PREFUQSwgIkVOT0RBVEEiLCAiTm8gZGF0YSBhdmFpbGFibGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVUSU1FKQorICBFTlRSWShFVElNRSwgIkVUSU1FIiwgIlRpbWVyIGV4cGlyZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT1NSKQorICBFTlRSWShFTk9TUiwgIkVOT1NSIiwgIk91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PTkVUKQorICBFTlRSWShFTk9ORVQsICJFTk9ORVQiLCAiTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT1BLRykKKyAgRU5UUlkoRU5PUEtHLCAiRU5PUEtHIiwgIlBhY2thZ2Ugbm90IGluc3RhbGxlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVJFTU9URSkKKyAgRU5UUlkoRVJFTU9URSwgIkVSRU1PVEUiLCAiT2JqZWN0IGlzIHJlbW90ZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PTElOSykKKyAgRU5UUlkoRU5PTElOSywgIkVOT0xJTksiLCAiTGluayBoYXMgYmVlbiBzZXZlcmVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQURWKQorICBFTlRSWShFQURWLCAiRUFEViIsICJBZHZlcnRpc2UgZXJyb3IiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVTUk1OVCkKKyAgRU5UUlkoRVNSTU5ULCAiRVNSTU5UIiwgIlNybW91bnQgZXJyb3IiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVDT01NKQorICBFTlRSWShFQ09NTSwgIkVDT01NIiwgIkNvbW11bmljYXRpb24gZXJyb3Igb24gc2VuZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVBST1RPKQorICBFTlRSWShFUFJPVE8sICJFUFJPVE8iLCAiUHJvdG9jb2wgZXJyb3IiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVNVUxUSUhPUCkKKyAgRU5UUlkoRU1VTFRJSE9QLCAiRU1VTFRJSE9QIiwgIk11bHRpaG9wIGF0dGVtcHRlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRURPVERPVCkKKyAgRU5UUlkoRURPVERPVCwgIkVET1RET1QiLCAiUkZTIHNwZWNpZmljIGVycm9yIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQkFETVNHKQorICBFTlRSWShFQkFETVNHLCAiRUJBRE1TRyIsICJOb3QgYSBkYXRhIG1lc3NhZ2UiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOQU1FVE9PTE9ORykKKyAgRU5UUlkoRU5BTUVUT09MT05HLCAiRU5BTUVUT09MT05HIiwgIkZpbGUgbmFtZSB0b28gbG9uZyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU9WRVJGTE9XKQorICBFTlRSWShFT1ZFUkZMT1csICJFT1ZFUkZMT1ciLCAiVmFsdWUgdG9vIGxhcmdlIGZvciBkZWZpbmVkIGRhdGEgdHlwZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PVFVOSVEpCisgIEVOVFJZKEVOT1RVTklRLCAiRU5PVFVOSVEiLCAiTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVCQURGRCkKKyAgRU5UUlkoRUJBREZELCAiRUJBREZEIiwgIkZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVSRU1DSEcpCisgIEVOVFJZKEVSRU1DSEcsICJFUkVNQ0hHIiwgIlJlbW90ZSBhZGRyZXNzIGNoYW5nZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMSUJBQ0MpCisgIEVOVFJZKEVMSUJBQ0MsICJFTElCQUNDIiwgIkNhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5IiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTElCQkFEKQorICBFTlRSWShFTElCQkFELCAiRUxJQkJBRCIsICJBY2Nlc3NpbmcgYSBjb3JydXB0ZWQgc2hhcmVkIGxpYnJhcnkiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMSUJTQ04pCisgIEVOVFJZKEVMSUJTQ04sICJFTElCU0NOIiwgIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVMSUJNQVgpCisgIEVOVFJZKEVMSUJNQVgsICJFTElCTUFYIiwgIkF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBzaGFyZWQgbGlicmFyaWVzIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTElCRVhFQykKKyAgRU5UUlkoRUxJQkVYRUMsICJFTElCRVhFQyIsICJDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5IiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFSUxTRVEpCisgIEVOVFJZKEVJTFNFUSwgIkVJTFNFUSIsICJJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT1NZUykKKyAgRU5UUlkoRU5PU1lTLCAiRU5PU1lTIiwgIk9wZXJhdGlvbiBub3QgYXBwbGljYWJsZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUxPT1ApCisgIEVOVFJZKEVMT09QLCAiRUxPT1AiLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVSRVNUQVJUKQorICBFTlRSWShFUkVTVEFSVCwgIkVSRVNUQVJUIiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZXN0YXJ0ZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVTVFJQSVBFKQorICBFTlRSWShFU1RSUElQRSwgIkVTVFJQSVBFIiwgIlN0cmVhbXMgcGlwZSBlcnJvciIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PVEVNUFRZKQorICBFTlRSWShFTk9URU1QVFksICJFTk9URU1QVFkiLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVVTRVJTKQorICBFTlRSWShFVVNFUlMsICJFVVNFUlMiLCAiVG9vIG1hbnkgdXNlcnMiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVOT1RTT0NLKQorICBFTlRSWShFTk9UU09DSywgIkVOT1RTT0NLIiwgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRURFU1RBRERSUkVRKQorICBFTlRSWShFREVTVEFERFJSRVEsICJFREVTVEFERFJSRVEiLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU1TR1NJWkUpCisgIEVOVFJZKEVNU0dTSVpFLCAiRU1TR1NJWkUiLCAiTWVzc2FnZSB0b28gbG9uZyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVBST1RPVFlQRSkKKyAgRU5UUlkoRVBST1RPVFlQRSwgIkVQUk9UT1RZUEUiLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0IiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTk9QUk9UT09QVCkKKyAgRU5UUlkoRU5PUFJPVE9PUFQsICJFTk9QUk9UT09QVCIsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFUFJPVE9OT1NVUFBPUlQpCisgIEVOVFJZKEVQUk9UT05PU1VQUE9SVCwgIkVQUk9UT05PU1VQUE9SVCIsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFU09DS1ROT1NVUFBPUlQpCisgIEVOVFJZKEVTT0NLVE5PU1VQUE9SVCwgIkVTT0NLVE5PU1VQUE9SVCIsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFT1BOT1RTVVBQKQorICBFTlRSWShFT1BOT1RTVVBQLCAiRU9QTk9UU1VQUCIsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVQRk5PU1VQUE9SVCkKKyAgRU5UUlkoRVBGTk9TVVBQT1JULCAiRVBGTk9TVVBQT1JUIiwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQUZOT1NVUFBPUlQpCisgIEVOVFJZKEVBRk5PU1VQUE9SVCwgIkVBRk5PU1VQUE9SVCIsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQUREUklOVVNFKQorICBFTlRSWShFQUREUklOVVNFLCAiRUFERFJJTlVTRSIsICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFQUREUk5PVEFWQUlMKQorICBFTlRSWShFQUREUk5PVEFWQUlMLCAiRUFERFJOT1RBVkFJTCIsIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVORVRET1dOKQorICBFTlRSWShFTkVURE9XTiwgIkVORVRET1dOIiwgIk5ldHdvcmsgaXMgZG93biIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5FVFVOUkVBQ0gpCisgIEVOVFJZKEVORVRVTlJFQUNILCAiRU5FVFVOUkVBQ0giLCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5FVFJFU0VUKQorICBFTlRSWShFTkVUUkVTRVQsICJFTkVUUkVTRVQiLCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gYmVjYXVzZSBvZiByZXNldCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUNPTk5BQk9SVEVEKQorICBFTlRSWShFQ09OTkFCT1JURUQsICJFQ09OTkFCT1JURUQiLCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVDT05OUkVTRVQpCisgIEVOVFJZKEVDT05OUkVTRVQsICJFQ09OTlJFU0VUIiwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PQlVGUykKKyAgRU5UUlkoRU5PQlVGUywgIkVOT0JVRlMiLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUlTQ09OTikKKyAgRU5UUlkoRUlTQ09OTiwgIkVJU0NPTk4iLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTk9UQ09OTikKKyAgRU5UUlkoRU5PVENPTk4sICJFTk9UQ09OTiIsICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRVNIVVRET1dOKQorICBFTlRSWShFU0hVVERPV04sICJFU0hVVERPV04iLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFVE9PTUFOWVJFRlMpCisgIEVOVFJZKEVUT09NQU5ZUkVGUywgIkVUT09NQU5ZUkVGUyIsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFVElNRURPVVQpCisgIEVOVFJZKEVUSU1FRE9VVCwgIkVUSU1FRE9VVCIsICJDb25uZWN0aW9uIHRpbWVkIG91dCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUNPTk5SRUZVU0VEKQorICBFTlRSWShFQ09OTlJFRlVTRUQsICJFQ09OTlJFRlVTRUQiLCAiQ29ubmVjdGlvbiByZWZ1c2VkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFSE9TVERPV04pCisgIEVOVFJZKEVIT1NURE9XTiwgIkVIT1NURE9XTiIsICJIb3N0IGlzIGRvd24iKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVIT1NUVU5SRUFDSCkKKyAgRU5UUlkoRUhPU1RVTlJFQUNILCAiRUhPU1RVTlJFQUNIIiwgIk5vIHJvdXRlIHRvIGhvc3QiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVBTFJFQURZKQorICBFTlRSWShFQUxSRUFEWSwgIkVBTFJFQURZIiwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFSU5QUk9HUkVTUykKKyAgRU5UUlkoRUlOUFJPR1JFU1MsICJFSU5QUk9HUkVTUyIsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFU1RBTEUpCisgIEVOVFJZKEVTVEFMRSwgIkVTVEFMRSIsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVVQ0xFQU4pCisgIEVOVFJZKEVVQ0xFQU4sICJFVUNMRUFOIiwgIlN0cnVjdHVyZSBuZWVkcyBjbGVhbmluZyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRU5PVE5BTSkKKyAgRU5UUlkoRU5PVE5BTSwgIkVOT1ROQU0iLCAiTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChFTkFWQUlMKQorICBFTlRSWShFTkFWQUlMLCAiRU5BVkFJTCIsICJObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoRUlTTkFNKQorICBFTlRSWShFSVNOQU0sICJFSVNOQU0iLCAiSXMgYSBuYW1lZCB0eXBlIGZpbGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVSRU1PVEVJTykKKyAgRU5UUlkoRVJFTU9URUlPLCAiRVJFTU9URUlPIiwgIlJlbW90ZSBJL08gZXJyb3IiKSwKKyNlbmRpZgorICBFTlRSWSgwLCBOVUxMLCBOVUxMKQorfTsKKworI2lmZGVmIEVWTVNFUlIKKy8qIFRoaXMgaXMgbm90IGluIHRoZSB0YWJsZSwgYmVjYXVzZSB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBFVk1TRVJSICgzMjc2NykKKyAgIGxpZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2Ygc3lzX2Vycmxpc3RbXS4gICovCitzdGF0aWMgc3RydWN0IHsgaW50IHZhbHVlOyBjb25zdCBjaGFyICpuYW1lLCAqbXNnOyB9CisgIGV2bXNlcnIgPSB7IEVWTVNFUlIsICJFVk1TRVJSIiwgIlZNUy1zcGVjaWZpYyBlcnJvciIgfTsKKyNlbmRpZgorCisvKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUuICBJbmRleGVkIGJ5IHRoZQorICAgZXJybm8gdmFsdWUgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZS4gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiplcnJvcl9uYW1lczsKK3N0YXRpYyBpbnQgbnVtX2Vycm9yX25hbWVzID0gMDsKKworLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLCBpZiBpdCBkb2VzIG5vdAorICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudC4gIEluZGV4ZWQgYnkgdGhlIGVycm5vIHZhbHVlIHRvIGZpbmQKKyAgIHRoZSBkZXNjcmlwdGl2ZSBzdHJpbmcuCisKKyAgIFdlIGRvbid0IGV4cG9ydCBpdCBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBoYXMgdGhlCisgICBzYW1lIG5hbWUsIGl0IGRpZmZlcnMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhhdCBpdCBpcyBkeW5hbWljYWxseQorICAgaW5pdGlhbGl6ZWQgcmF0aGVyIHRoYW4gc3RhdGljYWxseSBpbml0aWFsaXplZC4gKi8KKworI2lmbmRlZiBIQVZFX1NZU19FUlJMSVNUCisKK3N0YXRpYyBpbnQgc3lzX25lcnI7CitzdGF0aWMgY29uc3QgY2hhciAqKnN5c19lcnJsaXN0OworCisjZWxzZQorCitleHRlcm4gaW50IHN5c19uZXJyOworZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107CisKKyNlbmRpZgorCisKKy8qCisKK05BTUUKKworCWluaXRfZXJyb3JfdGFibGVzIC0tIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBpbml0X2Vycm9yX3RhYmxlcyAoKTsKKworREVTQ1JJUFRJT04KKworCVVzaW5nIHRoZSBlcnJvcl90YWJsZSwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLCBnZW5lcmF0ZQorCXRoZSBlcnJvcl9uYW1lcyBhbmQgdGhlIHN5c19lcnJsaXN0IChpZiBuZWVkZWQpIHRhYmxlcywgd2hpY2ggYXJlCisJaW5kZXhlZCBhdCBydW50aW1lIGJ5IGEgc3BlY2lmaWMgZXJybm8gdmFsdWUuCisKK0JVR1MKKworCVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzIG1heSBmYWlsIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucywKKwlpbiB3aGljaCBjYXNlIHdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwsIGJ1dCB3ZSBkb24ndAorCWJvbWIgZWl0aGVyLiAgV2hvIGtub3dzLCBpdCBtaWdodCBzdWNjZWVkIGF0IGEgbGF0ZXIgcG9pbnQgaWYgd2UgZnJlZQorCXNvbWUgbWVtb3J5IGluIHRoZSBtZWFudGltZS4gIEluIGFueSBjYXNlLCB0aGUgb3RoZXIgcm91dGluZXMga25vdworCWhvdyB0byBkZWFsIHdpdGggbGFjayBvZiBhIHRhYmxlIGFmdGVyIHRyeWluZyB0byBpbml0aWFsaXplIGl0LiAgVGhpcworCW1heSBvciBtYXkgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcsIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5CisJd2FybiBhYm91dCB0aGlzIHBhcnRpY3VsYXIgZmFpbHVyZSBtb2RlLgorCisqLworCitzdGF0aWMgdm9pZAoraW5pdF9lcnJvcl90YWJsZXMgKCkKK3sKKyAgY29uc3Qgc3RydWN0IGVycm9yX2luZm8gKmVpcDsKKyAgaW50IG5ieXRlczsKKworICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgc2Nhbm5lZCB0aGUgZXJyb3JfdGFibGUgb25jZSB0byBmaW5kIHRoZSBtYXhpbXVtCisgICAgIGVycm5vIHZhbHVlLCB0aGVuIGdvIGZpbmQgaXQgbm93LiAqLworCisgIGlmIChudW1fZXJyb3JfbmFtZXMgPT0gMCkKKyAgICB7CisgICAgICBmb3IgKGVpcCA9IGVycm9yX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKKwl7CisJICBpZiAoZWlwIC0+IHZhbHVlID49IG51bV9lcnJvcl9uYW1lcykKKwkgICAgeworCSAgICAgIG51bV9lcnJvcl9uYW1lcyA9IGVpcCAtPiB2YWx1ZSArIDE7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBlcnJvcl9uYW1lcyB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCisgICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBlcnJvcl90YWJsZS4gKi8KKworICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBuYnl0ZXMgPSBudW1fZXJyb3JfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7CisgICAgICBpZiAoKGVycm9yX25hbWVzID0gKGNvbnN0IGNoYXIgKiopIG1hbGxvYyAobmJ5dGVzKSkgIT0gTlVMTCkKKwl7CisJICBtZW1zZXQgKGVycm9yX25hbWVzLCAwLCBuYnl0ZXMpOworCSAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCisJICAgIHsKKwkgICAgICBlcnJvcl9uYW1lc1tlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG5hbWU7CisJICAgIH0KKwl9CisgICAgfQorCisjaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKKworICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgc3lzX2Vycmxpc3QgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgorICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZXJyb3JfdGFibGUuICovCisKKyAgaWYgKHN5c19lcnJsaXN0ID09IE5VTEwpCisgICAgeworICAgICAgbmJ5dGVzID0gbnVtX2Vycm9yX25hbWVzICogc2l6ZW9mIChjaGFyICopOworICAgICAgaWYgKChzeXNfZXJybGlzdCA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCisJeworCSAgbWVtc2V0IChzeXNfZXJybGlzdCwgMCwgbmJ5dGVzKTsKKwkgIHN5c19uZXJyID0gbnVtX2Vycm9yX25hbWVzOworCSAgZm9yIChlaXAgPSBlcnJvcl90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCisJICAgIHsKKwkgICAgICBzeXNfZXJybGlzdFtlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG1zZzsKKwkgICAgfQorCX0KKyAgICB9CisKKyNlbmRpZgorCit9CisKKy8qCisKK05BTUUKKworCWVycm5vX21heCAtLSByZXR1cm4gdGhlIG1heCBlcnJubyB2YWx1ZQorCitTWU5PUFNJUworCisJaW50IGVycm5vX21heCAoKTsKKworREVTQ1JJUFRJT04KKworCVJldHVybnMgdGhlIG1heGltdW0gZXJybm8gdmFsdWUgZm9yIHdoaWNoIGEgY29ycmVzcG9uZGluZyBzeW1ib2xpYworCW5hbWUgb3IgbWVzc2FnZSBpcyBhdmFpbGFibGUuICBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUKKwl3ZSB1c2UgdGhlIHN5c19lcnJsaXN0IHN1cHBsaWVkIGJ5IHRoZSBzeXN0ZW0sIGl0IGlzIHBvc3NpYmxlIGZvcgorCXRoZXJlIHRvIGJlIG1vcmUgc3ltYm9saWMgbmFtZXMgdGhhbiBtZXNzYWdlcywgb3IgdmljZSB2ZXJzYS4KKwlJbiBmYWN0LCB0aGUgbWFudWFsIHBhZ2UgZm9yIHBlcnJvcigzQykgZXhwbGljaXRseSB3YXJucyB0aGF0IG9uZQorCXNob3VsZCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgKHN5c19uZXJyKSBiZWZvcmUgaW5kZXhpbmcgaXQsCisJc2luY2UgbmV3IGVycm9yIGNvZGVzIG1heSBiZSBhZGRlZCB0byB0aGUgc3lzdGVtIGJlZm9yZSB0aGV5IGFyZQorCWFkZGVkIHRvIHRoZSB0YWJsZS4gIFRodXMgc3lzX25lcnIgbWlnaHQgYmUgc21hbGxlciB0aGFuIHZhbHVlCisJaW1wbGllZCBieSB0aGUgbGFyZ2VzdCBlcnJubyB2YWx1ZSBkZWZpbmVkIGluIDxlcnJuby5oPi4KKworCVdlIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBhIG1lYW5pbmdmdWwKKwlzeW1ib2xpYyBuYW1lIG9yIG1lc3NhZ2UuCisKKyovCisKK2ludAorZXJybm9fbWF4ICgpCit7CisgIGludCBtYXhzaXplOworCisgIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOworICAgIH0KKyAgbWF4c2l6ZSA9IE1BWCAoc3lzX25lcnIsIG51bV9lcnJvcl9uYW1lcyk7CisgIHJldHVybiAobWF4c2l6ZSAtIDEpOworfQorCisjaWZuZGVmIEhBVkVfU1RSRVJST1IKKworLyoKKworTkFNRQorCisJc3RyZXJyb3IgLS0gbWFwIGFuIGVycm9yIG51bWJlciB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZworCitTWU5PUFNJUworCisJY2hhciAqc3RyZXJyb3IgKGludCBlcnJub3ZhbCkKKworREVTQ1JJUFRJT04KKworCU1hcHMgYW4gZXJybm8gbnVtYmVyIHRvIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGUgY29udGVudHMgb2YKKwl3aGljaCBhcmUgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4gIE9uIHN5c3RlbXMgd2hpY2ggaGF2ZSB0aGUgZXh0ZXJuYWwKKwl2YXJpYWJsZXMgc3lzX25lcnIgYW5kIHN5c19lcnJsaXN0LCB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgdGhlIHNhbWUKKwlhcyB0aGUgb25lcyB1c2VkIGJ5IHBlcnJvcigpLgorCisJSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKKwlmb3IgdGhlIHN5c19lcnJsaXN0LCBidXQgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCisJZXJyb3IgbnVtYmVyLCB0aGVuIHJldHVybnMgdGhlIHN0cmluZyAiRXJyb3IgTlVNIiwgd2hlcmUgTlVNIGlzIHRoZQorCWVycm9yIG51bWJlci4KKworCUlmIHRoZSBzdXBwbGllZCBlcnJvciBudW1iZXIgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byBzeXNfZXJybGlzdCwKKwlyZXR1cm5zIE5VTEwuCisKKwlUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbmx5IHVudGlsIHRoZQorCW5leHQgY2FsbCB0byBzdHJlcnJvci4KKworKi8KKworY2hhciAqCitzdHJlcnJvciAoZXJybm92YWwpCisgIGludCBlcnJub3ZhbDsKK3sKKyAgY2hhciAqbXNnOworICBzdGF0aWMgY2hhciBidWZbMzJdOworCisjaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKKworICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKKyAgICB9CisKKyNlbmRpZgorCisgIGlmICgoZXJybm92YWwgPCAwKSB8fCAoZXJybm92YWwgPj0gc3lzX25lcnIpKQorICAgIHsKKyNpZmRlZiBFVk1TRVJSCisgICAgICBpZiAoZXJybm92YWwgPT0gZXZtc2Vyci52YWx1ZSkKKwltc2cgPSBldm1zZXJyLm1zZzsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCisgICAgICBtc2cgPSBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoKHN5c19lcnJsaXN0ID09IE5VTEwpIHx8IChzeXNfZXJybGlzdFtlcnJub3ZhbF0gPT0gTlVMTCkpCisgICAgeworICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzeXNfZXJybGlzdCBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLworICAgICAgc3ByaW50ZiAoYnVmLCAiRXJyb3IgJWQiLCBlcnJub3ZhbCk7CisgICAgICBtc2cgPSBidWY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG1lc3NhZ2UuICBKdXN0IHJldHVybiB0aGUgbWVzc2FnZS4gKi8KKyAgICAgIG1zZyA9IChjaGFyICopIHN5c19lcnJsaXN0W2Vycm5vdmFsXTsKKyAgICB9CisgIAorICByZXR1cm4gKG1zZyk7Cit9CisKKyNlbmRpZgkvKiAhIEhBVkVfU1RSRVJST1IgKi8KKworCisvKgorCitOQU1FCisKKwlzdHJlcnJubyAtLSBtYXAgYW4gZXJyb3IgbnVtYmVyIHRvIGEgc3ltYm9saWMgbmFtZSBzdHJpbmcKKworU1lOT1BTSVMKKworCWNvbnN0IGNoYXIgKnN0cmVycm5vIChpbnQgZXJybm92YWwpCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhbiBlcnJvciBudW1iZXIgcmV0dXJuZWQgZnJvbSBhIHN5c3RlbSBjYWxsICh0eXBpY2FsbHkKKwlyZXR1cm5lZCBpbiBlcnJubyksIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCisJc3ltYm9saWMgbmFtZSBvZiB0aGF0IGVycm9yIG51bWJlciwgYXMgZm91bmQgaW4gPGVycm5vLmg+LgorCisJSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKKwlmb3Igc3ltYm9saWMgbmFtZXMsIGJ1dCBubyBuYW1lIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKKwllcnJvciBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJFcnJvciBOVU0iLCB3aGVyZSBOVU0gaXMKKwl0aGUgZXJyb3IgbnVtYmVyLgorCisJSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZSBvZiB2YWxpZAorCWluZGljZXMsIHRoZW4gcmV0dXJucyBOVUxMLgorCitCVUdTCisKKwlUaGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQorCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gc3RyZXJybm8uCisKKyovCisKK2NvbnN0IGNoYXIgKgorc3RyZXJybm8gKGVycm5vdmFsKQorICBpbnQgZXJybm92YWw7Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHN0YXRpYyBjaGFyIGJ1ZlszMl07CisKKyAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCisgICAgeworICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7CisgICAgfQorCisgIGlmICgoZXJybm92YWwgPCAwKSB8fCAoZXJybm92YWwgPj0gbnVtX2Vycm9yX25hbWVzKSkKKyAgICB7CisjaWZkZWYgRVZNU0VSUgorICAgICAgaWYgKGVycm5vdmFsID09IGV2bXNlcnIudmFsdWUpCisJbmFtZSA9IGV2bXNlcnIubmFtZTsKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCisgICAgICBuYW1lID0gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKChlcnJvcl9uYW1lcyA9PSBOVUxMKSB8fCAoZXJyb3JfbmFtZXNbZXJybm92YWxdID09IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gZXJyb3JfbmFtZXMgb3Igbm8gZW50cnkgYXQgdGhpcyBpbmRleC4gKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgIkVycm9yICVkIiwgZXJybm92YWwpOworICAgICAgbmFtZSA9IChjb25zdCBjaGFyICopIGJ1ZjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbmFtZS4gIEp1c3QgcmV0dXJuIHRoZSBuYW1lLiAqLworICAgICAgbmFtZSA9IGVycm9yX25hbWVzW2Vycm5vdmFsXTsKKyAgICB9CisKKyAgcmV0dXJuIChuYW1lKTsKK30KKworLyoKKworTkFNRQorCisJc3RydG9lcnJubyAtLSBtYXAgYSBzeW1ib2xpYyBlcnJubyBuYW1lIHRvIGEgbnVtZXJpYyB2YWx1ZQorCitTWU5PUFNJUworCisJaW50IHN0cnRvZXJybm8gKGNoYXIgKm5hbWUpCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiB0aGUgc3ltYm9saWMgbmFtZSBvZiBhIGVycm9yIG51bWJlciwgbWFwIGl0IHRvIGFuIGVycm5vIHZhbHVlLgorCUlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCByZXR1cm5zIDAuCisKKyovCisKK2ludAorc3RydG9lcnJubyAobmFtZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgaW50IGVycm5vdmFsID0gMDsKKworICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQorCXsKKwkgIGluaXRfZXJyb3JfdGFibGVzICgpOworCX0KKyAgICAgIGZvciAoZXJybm92YWwgPSAwOyBlcnJub3ZhbCA8IG51bV9lcnJvcl9uYW1lczsgZXJybm92YWwrKykKKwl7CisJICBpZiAoKGVycm9yX25hbWVzW2Vycm5vdmFsXSAhPSBOVUxMKSAmJgorCSAgICAgIChzdHJjbXAgKG5hbWUsIGVycm9yX25hbWVzW2Vycm5vdmFsXSkgPT0gMCkpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGlmIChlcnJub3ZhbCA9PSBudW1fZXJyb3JfbmFtZXMpCisJeworI2lmZGVmIEVWTVNFUlIKKwkgIGlmIChzdHJjbXAgKG5hbWUsIGV2bXNlcnIubmFtZSkgPT0gMCkKKwkgICAgZXJybm92YWwgPSBldm1zZXJyLnZhbHVlOworCSAgZWxzZQorI2VuZGlmCisJICBlcnJub3ZhbCA9IDA7CisJfQorICAgIH0KKyAgcmV0dXJuIChlcnJub3ZhbCk7Cit9CisKKworLyogQSBzaW1wbGUgbGl0dGxlIG1haW4gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHByaW50IGFsbCB0aGUgZXJybm8gdHJhbnNsYXRpb25zCisgICBpZiBNQUlOIGlzIGRlZmluZWQgYW5kIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkLiAqLworCisjaWZkZWYgTUFJTgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluICgpCit7CisgIGludCBlcnJuOworICBpbnQgZXJybm1heDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY2hhciAqbXNnOworICBjaGFyICpzdHJlcnJvciAoKTsKKworICBlcnJubWF4ID0gZXJybm9fbWF4ICgpOworICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG5hbWVzIHRhYmxlLlxuIiwgbnVtX2Vycm9yX25hbWVzKTsKKyAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBtZXNzYWdlcyB0YWJsZS5cbiIsIHN5c19uZXJyKTsKKyAgcHJpbnRmICgiJWQgaXMgbWF4IHVzZWZ1bCBpbmRleC5cbiIsIGVycm5tYXgpOworCisgIC8qIEtlZXAgcHJpbnRpbmcgdmFsdWVzIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mICpib3RoKiB0YWJsZXMsIG5vdAorICAgICAqZWl0aGVyKiB0YWJsZS4gIE5vdGUgdGhhdCBrbm93aW5nIHRoZSBtYXhpbXVtIHVzZWZ1bCBpbmRleCBkb2VzICpub3QqCisgICAgIHJlbGlldmUgdXMgb2YgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRlc3RpbmcgdGhlIHJldHVybiBwb2ludGVyIGZvcgorICAgICBOVUxMLiAqLworCisgIGZvciAoZXJybiA9IDA7IGVycm4gPD0gZXJybm1heDsgZXJybisrKQorICAgIHsKKyAgICAgIG5hbWUgPSBzdHJlcnJubyAoZXJybik7CisgICAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG5hbWU7CisgICAgICBtc2cgPSBzdHJlcnJvciAoZXJybik7CisgICAgICBtc2cgPSAobXNnID09IE5VTEwpID8gIjxOVUxMPiIgOiBtc2c7CisgICAgICBwcmludGYgKCIlLTRkJS0xOHMlc1xuIiwgZXJybiwgbmFtZSwgbXNnKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMgYi9saWJpYmVydHkvc3RybmNhc2VjbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDg1Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3N0cm5jYXNlY21wLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgorICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKKyAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCisgKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXN0cmNhc2VjbXAuYwk1LjUgKEJlcmtlbGV5KSAxMS8yNC84NyI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpZmRlZiBfX1NURENfXworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCisvKgorICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKKyAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKKyAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcm1hcFtdID0geworCSdcMDAwJywgJ1wwMDEnLCAnXDAwMicsICdcMDAzJywgJ1wwMDQnLCAnXDAwNScsICdcMDA2JywgJ1wwMDcnLAorCSdcMDEwJywgJ1wwMTEnLCAnXDAxMicsICdcMDEzJywgJ1wwMTQnLCAnXDAxNScsICdcMDE2JywgJ1wwMTcnLAorCSdcMDIwJywgJ1wwMjEnLCAnXDAyMicsICdcMDIzJywgJ1wwMjQnLCAnXDAyNScsICdcMDI2JywgJ1wwMjcnLAorCSdcMDMwJywgJ1wwMzEnLCAnXDAzMicsICdcMDMzJywgJ1wwMzQnLCAnXDAzNScsICdcMDM2JywgJ1wwMzcnLAorCSdcMDQwJywgJ1wwNDEnLCAnXDA0MicsICdcMDQzJywgJ1wwNDQnLCAnXDA0NScsICdcMDQ2JywgJ1wwNDcnLAorCSdcMDUwJywgJ1wwNTEnLCAnXDA1MicsICdcMDUzJywgJ1wwNTQnLCAnXDA1NScsICdcMDU2JywgJ1wwNTcnLAorCSdcMDYwJywgJ1wwNjEnLCAnXDA2MicsICdcMDYzJywgJ1wwNjQnLCAnXDA2NScsICdcMDY2JywgJ1wwNjcnLAorCSdcMDcwJywgJ1wwNzEnLCAnXDA3MicsICdcMDczJywgJ1wwNzQnLCAnXDA3NScsICdcMDc2JywgJ1wwNzcnLAorCSdcMTAwJywgJ1wxNDEnLCAnXDE0MicsICdcMTQzJywgJ1wxNDQnLCAnXDE0NScsICdcMTQ2JywgJ1wxNDcnLAorCSdcMTUwJywgJ1wxNTEnLCAnXDE1MicsICdcMTUzJywgJ1wxNTQnLCAnXDE1NScsICdcMTU2JywgJ1wxNTcnLAorCSdcMTYwJywgJ1wxNjEnLCAnXDE2MicsICdcMTYzJywgJ1wxNjQnLCAnXDE2NScsICdcMTY2JywgJ1wxNjcnLAorCSdcMTcwJywgJ1wxNzEnLCAnXDE3MicsICdcMTMzJywgJ1wxMzQnLCAnXDEzNScsICdcMTM2JywgJ1wxMzcnLAorCSdcMTQwJywgJ1wxNDEnLCAnXDE0MicsICdcMTQzJywgJ1wxNDQnLCAnXDE0NScsICdcMTQ2JywgJ1wxNDcnLAorCSdcMTUwJywgJ1wxNTEnLCAnXDE1MicsICdcMTUzJywgJ1wxNTQnLCAnXDE1NScsICdcMTU2JywgJ1wxNTcnLAorCSdcMTYwJywgJ1wxNjEnLCAnXDE2MicsICdcMTYzJywgJ1wxNjQnLCAnXDE2NScsICdcMTY2JywgJ1wxNjcnLAorCSdcMTcwJywgJ1wxNzEnLCAnXDE3MicsICdcMTczJywgJ1wxNzQnLCAnXDE3NScsICdcMTc2JywgJ1wxNzcnLAorCSdcMjAwJywgJ1wyMDEnLCAnXDIwMicsICdcMjAzJywgJ1wyMDQnLCAnXDIwNScsICdcMjA2JywgJ1wyMDcnLAorCSdcMjEwJywgJ1wyMTEnLCAnXDIxMicsICdcMjEzJywgJ1wyMTQnLCAnXDIxNScsICdcMjE2JywgJ1wyMTcnLAorCSdcMjIwJywgJ1wyMjEnLCAnXDIyMicsICdcMjIzJywgJ1wyMjQnLCAnXDIyNScsICdcMjI2JywgJ1wyMjcnLAorCSdcMjMwJywgJ1wyMzEnLCAnXDIzMicsICdcMjMzJywgJ1wyMzQnLCAnXDIzNScsICdcMjM2JywgJ1wyMzcnLAorCSdcMjQwJywgJ1wyNDEnLCAnXDI0MicsICdcMjQzJywgJ1wyNDQnLCAnXDI0NScsICdcMjQ2JywgJ1wyNDcnLAorCSdcMjUwJywgJ1wyNTEnLCAnXDI1MicsICdcMjUzJywgJ1wyNTQnLCAnXDI1NScsICdcMjU2JywgJ1wyNTcnLAorCSdcMjYwJywgJ1wyNjEnLCAnXDI2MicsICdcMjYzJywgJ1wyNjQnLCAnXDI2NScsICdcMjY2JywgJ1wyNjcnLAorCSdcMjcwJywgJ1wyNzEnLCAnXDI3MicsICdcMjczJywgJ1wyNzQnLCAnXDI3NScsICdcMjc2JywgJ1wyNzcnLAorCSdcMzAwJywgJ1wzNDEnLCAnXDM0MicsICdcMzQzJywgJ1wzNDQnLCAnXDM0NScsICdcMzQ2JywgJ1wzNDcnLAorCSdcMzUwJywgJ1wzNTEnLCAnXDM1MicsICdcMzUzJywgJ1wzNTQnLCAnXDM1NScsICdcMzU2JywgJ1wzNTcnLAorCSdcMzYwJywgJ1wzNjEnLCAnXDM2MicsICdcMzYzJywgJ1wzNjQnLCAnXDM2NScsICdcMzY2JywgJ1wzNjcnLAorCSdcMzcwJywgJ1wzNzEnLCAnXDM3MicsICdcMzMzJywgJ1wzMzQnLCAnXDMzNScsICdcMzM2JywgJ1wzMzcnLAorCSdcMzQwJywgJ1wzNDEnLCAnXDM0MicsICdcMzQzJywgJ1wzNDQnLCAnXDM0NScsICdcMzQ2JywgJ1wzNDcnLAorCSdcMzUwJywgJ1wzNTEnLCAnXDM1MicsICdcMzUzJywgJ1wzNTQnLCAnXDM1NScsICdcMzU2JywgJ1wzNTcnLAorCSdcMzYwJywgJ1wzNjEnLCAnXDM2MicsICdcMzYzJywgJ1wzNjQnLCAnXDM2NScsICdcMzY2JywgJ1wzNjcnLAorCSdcMzcwJywgJ1wzNzEnLCAnXDM3MicsICdcMzczJywgJ1wzNzQnLCAnXDM3NScsICdcMzc2JywgJ1wzNzcnLAorfTsKKworaW50CitzdHJuY2FzZWNtcChzMSwgczIsIG4pCisJY29uc3QgY2hhciAqczEsICpzMjsKKwlyZWdpc3RlciBzaXplX3QgbjsKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHUxLCB1MjsKKworICAgIGZvciAoOyBuICE9IDA7IC0tbikgeworCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOworCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOworCWlmIChjaGFybWFwW3UxXSAhPSBjaGFybWFwW3UyXSkgeworCSAgICByZXR1cm4gY2hhcm1hcFt1MV0gLSBjaGFybWFwW3UyXTsKKwl9CisJaWYgKHUxID09ICdcMCcpIHsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJyY2hyLmMgYi9saWJpYmVydHkvc3RycmNoci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDViY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvc3RycmNoci5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RycmNocigpLgorICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KKworLyoKK05BTUUKKwlzdHJyY2hyIC0tIHJldHVybiBwb2ludGVyIHRvIGxhc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCisKK1NZTk9QU0lTCisJY2hhciAqc3RycmNociAoY29uc3QgY2hhciAqcywgaW50IGMpCisKK0RFU0NSSVBUSU9OCisJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCisJc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KKwkKK0JVR1MKKwlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KKwlkZXBlbmRlbnQuCisqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKworY2hhciAqCitzdHJyY2hyIChzLCBjKQorICByZWdpc3RlciBjb25zdCBjaGFyICpzOworICBpbnQgYzsKK3sKKyAgY2hhciAqcnRudmFsID0gMDsKKworICBkbyB7CisgICAgaWYgKCpzID09IGMpCisgICAgICBydG52YWwgPSAoY2hhciopIHM7CisgIH0gd2hpbGUgKCpzKyspOworICByZXR1cm4gKHJ0bnZhbCk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3Ryc2lnbmFsLmMgYi9saWJpYmVydHkvc3Ryc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiYjEwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9zdHJzaWduYWwuYwpAQCAtMCwwICsxLDY0NCBAQAorLyogRXh0ZW5kZWQgc3VwcG9ydCBmb3IgdXNpbmcgc2lnbmFsIHZhbHVlcy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAgZm5mQGN5Z251cy5jb20KKyAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qIFdlIG5lZWQgdG8gZGVjbGFyZSBzeXNfc2lnbGlzdCwgYmVjYXVzZSBldmVuIGlmIHRoZSBzeXN0ZW0gcHJvdmlkZXMKKyAgIGl0IHdlIGNhbid0IGFzc3VtZSB0aGF0IGl0IGlzIGRlY2xhcmVkIGluIDxzaWduYWwuaD4gKGZvciBleGFtcGxlLAorICAgU3VuT1MgcHJvdmlkZXMgc3lzX3NpZ2xpc3QsIGJ1dCBpdCBkb2VzIG5vdCBkZWNsYXJlIGl0IGluIGFueQorICAgaGVhZGVyIGZpbGUpLiAgZkhvd2V2ZXIsIHdlIGNhbid0IGRlY2xhcmUgc3lzX3NpZ2xpc3QgcG9ydGFibHksCisgICBiZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyBpdCBpcyBkZWNsYXJlZCB3aXRoIGNvbnN0IGFuZCBvbiBzb21lCisgICBzeXN0ZW1zIGl0IGlzIGRlY2xhcmVkIHdpdGhvdXQgY29uc3QuICBJZiB3ZSB3ZXJlIHVzaW5nIGF1dG9jb25mLAorICAgd2UgY291bGQgd29yayBvdXQgdGhlIHJpZ2h0IGRlY2xhcmF0aW9uLiAgVW50aWwsIHRoZW4gd2UganVzdAorICAgaWdub3JlIGFueSBkZWNsYXJhdGlvbiBpbiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcywgYW5kIGFsd2F5cworICAgZGVjbGFyZSBpdCBvdXJzZWx2ZXMuICBXaXRoIGx1Y2ssIHRoaXMgd2lsbCBhbHdheXMgd29yay4gICovCisjZGVmaW5lIHN5c19zaWdsaXN0IG5vX3N1Y2hfc3ltYm9sCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKiAgUm91dGluZXMgaW1wb3J0ZWQgZnJvbSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyaWVzLiAqLworCisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRkZWYuaD4KK2V4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KK2V4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CQkJLyogNC4xMS42LjEgKi8KKyNlbHNlCS8qICFfX1NURENfXyAqLworZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsJCS8qIFN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0ZXIgKi8KK2V4dGVybiBjaGFyICptZW1zZXQgKCk7CisjZW5kaWYJLyogX19TVERDX18gKi8KKworLyogVW5kZWZpbmUgdGhlIG1hY3JvIHdlIHVzZWQgdG8gaGlkZSB0aGUgZGVmaW5pdGlvbiBvZiBzeXNfc2lnbGlzdAorICAgZm91bmQgaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIHN5c19zaWdsaXN0CisKKyNpZm5kZWYgTlVMTAorIyAgaWZkZWYgX19TVERDX18KKyMgICAgZGVmaW5lIE5VTEwgKHZvaWQgKikgMAorIyAgZWxzZQorIyAgICBkZWZpbmUgTlVMTCAwCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTUFYCisjICBkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbml0X3NpZ25hbF90YWJsZXMgUEFSQU1TICgodm9pZCkpOworCisvKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igc2lnbmFsIHZhbHVlcy4KKworICAgTm90ZSB0aGF0IHRoaXMgdGFibGUgaXMgZ2VuZXJhbGx5IG9ubHkgYWNjZXNzZWQgd2hlbiBpdCBpcyB1c2VkIGF0IHJ1bnRpbWUKKyAgIHRvIGluaXRpYWxpemUgc2lnbmFsIG5hbWUgYW5kIG1lc3NhZ2UgdGFibGVzIHRoYXQgYXJlIGluZGV4ZWQgYnkgc2lnbmFsCisgICB2YWx1ZS4KKworICAgTm90IGFsbCBvZiB0aGVzZSBzaWduYWxzIHdpbGwgZXhpc3Qgb24gYWxsIHN5c3RlbXMuICBUaGlzIHRhYmxlIGlzIHRoZSBvbmx5CisgICB0aGluZyB0aGF0IHNob3VsZCBoYXZlIHRvIGJlIHVwZGF0ZWQgYXMgbmV3IHNpZ25hbCBudW1iZXJzIGFyZSBpbnRyb2R1Y2VkLgorICAgSXQncyBzb3J0IG9mIHVnbHksIGJ1dCBhdCBsZWFzdCBpdHMgcG9ydGFibGUuICovCisKK3N0cnVjdCBzaWduYWxfaW5mbworeworICBpbnQgdmFsdWU7CQkvKiBUaGUgbnVtZXJpYyB2YWx1ZSBmcm9tIDxzaWduYWwuaD4gKi8KKyAgY29uc3QgY2hhciAqbmFtZTsJLyogVGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUgKi8KKyNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAorICBjb25zdCBjaGFyICptc2c7CS8qIFNob3J0IG1lc3NhZ2UgYWJvdXQgdGhpcyB2YWx1ZSAqLworI2VuZGlmCit9OworCisjaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKKyMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lLCBtc2d9CisjZWxzZQorIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWV9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaWduYWxfaW5mbyBzaWduYWxfdGFibGVbXSA9Cit7CisjaWYgZGVmaW5lZCAoU0lHSFVQKQorICBFTlRSWShTSUdIVVAsICJTSUdIVVAiLCAiSGFuZ3VwIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTlQpCisgIEVOVFJZKFNJR0lOVCwgIlNJR0lOVCIsICJJbnRlcnJ1cHQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1FVSVQpCisgIEVOVFJZKFNJR1FVSVQsICJTSUdRVUlUIiwgIlF1aXQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0lMTCkKKyAgRU5UUlkoU0lHSUxMLCAiU0lHSUxMIiwgIklsbGVnYWwgaW5zdHJ1Y3Rpb24iKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1RSQVApCisgIEVOVFJZKFNJR1RSQVAsICJTSUdUUkFQIiwgIlRyYWNlL2JyZWFrcG9pbnQgdHJhcCIpLAorI2VuZGlmCisvKiBQdXQgU0lHSU9UIGJlZm9yZSBTSUdBQlJULCBzbyB0aGF0IGlmIFNJR0lPVD09U0lHQUJSVCB0aGVuIFNJR0FCUlQKKyAgIG92ZXJyaWRlcyBTSUdJT1QuICBTSUdBQlJUIGlzIGluIEFOU0kgYW5kIFBPU0lYLjEsIGFuZCBTSUdJT1QgaXNuJ3QuICovCisjaWYgZGVmaW5lZCAoU0lHSU9UKQorICBFTlRSWShTSUdJT1QsICJTSUdJT1QiLCAiSU9UIHRyYXAiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0FCUlQpCisgIEVOVFJZKFNJR0FCUlQsICJTSUdBQlJUIiwgIkFib3J0ZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0VNVCkKKyAgRU5UUlkoU0lHRU1ULCAiU0lHRU1UIiwgIkVtdWxhdGlvbiB0cmFwIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdGUEUpCisgIEVOVFJZKFNJR0ZQRSwgIlNJR0ZQRSIsICJBcml0aG1ldGljIGV4Y2VwdGlvbiIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHS0lMTCkKKyAgRU5UUlkoU0lHS0lMTCwgIlNJR0tJTEwiLCAiS2lsbGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdCVVMpCisgIEVOVFJZKFNJR0JVUywgIlNJR0JVUyIsICJCdXMgZXJyb3IiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1NFR1YpCisgIEVOVFJZKFNJR1NFR1YsICJTSUdTRUdWIiwgIlNlZ21lbnRhdGlvbiBmYXVsdCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHU1lTKQorICBFTlRSWShTSUdTWVMsICJTSUdTWVMiLCAiQmFkIHN5c3RlbSBjYWxsIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQSVBFKQorICBFTlRSWShTSUdQSVBFLCAiU0lHUElQRSIsICJCcm9rZW4gcGlwZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHQUxSTSkKKyAgRU5UUlkoU0lHQUxSTSwgIlNJR0FMUk0iLCAiQWxhcm0gY2xvY2siKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1RFUk0pCisgIEVOVFJZKFNJR1RFUk0sICJTSUdURVJNIiwgIlRlcm1pbmF0ZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1VTUjEpCisgIEVOVFJZKFNJR1VTUjEsICJTSUdVU1IxIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVVNSMikKKyAgRU5UUlkoU0lHVVNSMiwgIlNJR1VTUjIiLCAiVXNlciBkZWZpbmVkIHNpZ25hbCAyIiksCisjZW5kaWYKKy8qIFB1dCBTSUdDTEQgYmVmb3JlIFNJR0NITEQsIHNvIHRoYXQgaWYgU0lHQ0xEPT1TSUdDSExEIHRoZW4gU0lHQ0hMRAorICAgb3ZlcnJpZGVzIFNJR0NMRC4gIFNJR0NITEQgaXMgaW4gUE9YSVguMSAqLworI2lmIGRlZmluZWQgKFNJR0NMRCkKKyAgRU5UUlkoU0lHQ0xELCAiU0lHQ0xEIiwgIkNoaWxkIHN0YXR1cyBjaGFuZ2VkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdDSExEKQorICBFTlRSWShTSUdDSExELCAiU0lHQ0hMRCIsICJDaGlsZCBzdGF0dXMgY2hhbmdlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUFdSKQorICBFTlRSWShTSUdQV1IsICJTSUdQV1IiLCAiUG93ZXIgZmFpbC9yZXN0YXJ0IiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdXSU5DSCkKKyAgRU5UUlkoU0lHV0lOQ0gsICJTSUdXSU5DSCIsICJXaW5kb3cgc2l6ZSBjaGFuZ2VkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdVUkcpCisgIEVOVFJZKFNJR1VSRywgIlNJR1VSRyIsICJVcmdlbnQgSS9PIGNvbmRpdGlvbiIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHSU8pCisgIC8qICJJL08gcGVuZGluZyIgaGFzIGFsc28gYmVlbiBzdWdnZXN0ZWQsIGJ1dCBpcyBtaXNsZWFkaW5nIHNpbmNlIHRoZQorICAgICBzaWduYWwgb25seSBoYXBwZW5zIHdoZW4gdGhlIHByb2Nlc3MgaGFzIGFza2VkIGZvciBpdCwgbm90IGV2ZXJ5dGltZQorICAgICBJL08gaXMgcGVuZGluZy4gKi8KKyAgRU5UUlkoU0lHSU8sICJTSUdJTyIsICJJL08gcG9zc2libGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BPTEwpCisgIEVOVFJZKFNJR1BPTEwsICJTSUdQT0xMIiwgIlBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTVE9QKQorICBFTlRSWShTSUdTVE9QLCAiU0lHU1RPUCIsICJTdG9wcGVkIChzaWduYWwpIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUU1RQKQorICBFTlRSWShTSUdUU1RQLCAiU0lHVFNUUCIsICJTdG9wcGVkICh1c2VyKSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHQ09OVCkKKyAgRU5UUlkoU0lHQ09OVCwgIlNJR0NPTlQiLCAiQ29udGludWVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUVElOKQorICBFTlRSWShTSUdUVElOLCAiU0lHVFRJTiIsICJTdG9wcGVkICh0dHkgaW5wdXQpIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUVE9VKQorICBFTlRSWShTSUdUVE9VLCAiU0lHVFRPVSIsICJTdG9wcGVkICh0dHkgb3V0cHV0KSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVlRBTFJNKQorICBFTlRSWShTSUdWVEFMUk0sICJTSUdWVEFMUk0iLCAiVmlydHVhbCB0aW1lciBleHBpcmVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQUk9GKQorICBFTlRSWShTSUdQUk9GLCAiU0lHUFJPRiIsICJQcm9maWxpbmcgdGltZXIgZXhwaXJlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHWENQVSkKKyAgRU5UUlkoU0lHWENQVSwgIlNJR1hDUFUiLCAiQ1BVIHRpbWUgbGltaXQgZXhjZWVkZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1hGU1opCisgIEVOVFJZKFNJR1hGU1osICJTSUdYRlNaIiwgIkZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHV0lORCkKKyAgRU5UUlkoU0lHV0lORCwgIlNJR1dJTkQiLCAiU0lHV0lORCIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUEhPTkUpCisgIEVOVFJZKFNJR1BIT05FLCAiU0lHUEhPTkUiLCAiU0lHUEhPTkUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0xPU1QpCisgIEVOVFJZKFNJR0xPU1QsICJTSUdMT1NUIiwgIlJlc291cmNlIGxvc3QiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1dBSVRJTkcpCisgIEVOVFJZKFNJR1dBSVRJTkcsICJTSUdXQUlUSU5HIiwgIlByb2Nlc3MncyBMV1BzIGFyZSBibG9ja2VkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdMV1ApCisgIEVOVFJZKFNJR0xXUCwgIlNJR0xXUCIsICJTaWduYWwgTFdQIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdEQU5HRVIpCisgIEVOVFJZKFNJR0RBTkdFUiwgIlNJR0RBTkdFUiIsICJTd2FwIHNwYWNlIGRhbmdlcm91c2x5IGxvdyIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHR1JBTlQpCisgIEVOVFJZKFNJR0dSQU5ULCAiU0lHR1JBTlQiLCAiTW9uaXRvciBtb2RlIGdyYW50ZWQiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1JFVFJBQ1QpCisgIEVOVFJZKFNJR1JFVFJBQ1QsICJTSUdSRVRSQUNUIiwgIk5lZWQgdG8gcmVsaW5ndWlzaCBtb25pdG9yIG1vZGUiKSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR01TRykKKyAgRU5UUlkoU0lHTVNHLCAiU0lHTVNHIiwgIk1vbml0b3IgbW9kZSBkYXRhIGF2YWlsYWJsZSIpLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHU09VTkQpCisgIEVOVFJZKFNJR1NPVU5ELCAiU0lHU09VTkQiLCAiU291bmQgY29tcGxldGVkIiksCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTQUspCisgIEVOVFJZKFNJR1NBSywgIlNJR1NBSyIsICJTZWN1cmUgYXR0ZW50aW9uIiksCisjZW5kaWYKKyAgRU5UUlkoMCwgTlVMTCwgTlVMTCkKK307CisKKy8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZS4gIEluZGV4ZWQgYnkgdGhlCisgICBzaWduYWwgdmFsdWUgdG8gZmluZCB0aGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZS4gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKipzaWduYWxfbmFtZXM7CitzdGF0aWMgaW50IG51bV9zaWduYWxfbmFtZXMgPSAwOworCisvKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUsIGlmIGl0IGRvZXMgbm90CisgICBhbHJlYWR5IGV4aXN0IGluIHRoZSBob3N0IGVudmlyb25tZW50LiAgSW5kZXhlZCBieSB0aGUgc2lnbmFsIHZhbHVlIHRvIGZpbmQKKyAgIHRoZSBkZXNjcmlwdGl2ZSBzdHJpbmcuCisKKyAgIFdlIGRvbid0IGV4cG9ydCBpdCBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMgYmVjYXVzZSBldmVuIHRob3VnaCBpdCBoYXMgdGhlCisgICBzYW1lIG5hbWUsIGl0IGRpZmZlcnMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhhdCBpdCBpcyBkeW5hbWljYWxseQorICAgaW5pdGlhbGl6ZWQgcmF0aGVyIHRoYW4gc3RhdGljYWxseSBpbml0aWFsaXplZC4gKi8KKworI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCisKK3N0YXRpYyBpbnQgc3lzX25zaWc7CitzdGF0aWMgY29uc3QgY2hhciAqKnN5c19zaWdsaXN0OworCisjZWxzZQorCisjaWZkZWYgTlNJRworc3RhdGljIGludCBzeXNfbnNpZyA9IE5TSUc7CisjZWxzZQorI2lmZGVmIF9OU0lHCitzdGF0aWMgaW50IHN5c19uc2lnID0gX05TSUc7CisjZW5kaWYKKyNlbmRpZgorZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfc2lnbGlzdFtdOworCisjZW5kaWYKKworCisvKgorCitOQU1FCisKKwlpbml0X3NpZ25hbF90YWJsZXMgLS0gaW5pdGlhbGl6ZSB0aGUgbmFtZSBhbmQgbWVzc2FnZSB0YWJsZXMKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKKworREVTQ1JJUFRJT04KKworCVVzaW5nIHRoZSBzaWduYWxfdGFibGUsIHdoaWNoIGlzIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZSwgZ2VuZXJhdGUKKwl0aGUgc2lnbmFsX25hbWVzIGFuZCB0aGUgc3lzX3NpZ2xpc3QgKGlmIG5lZWRlZCkgdGFibGVzLCB3aGljaCBhcmUKKwlpbmRleGVkIGF0IHJ1bnRpbWUgYnkgYSBzcGVjaWZpYyBzaWduYWwgdmFsdWUuCisKK0JVR1MKKworCVRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzIG1heSBmYWlsIHVuZGVyIGxvdyBtZW1vcnkgY29uZGl0aW9ucywKKwlpbiB3aGljaCBjYXNlIHdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwsIGJ1dCB3ZSBkb24ndAorCWJvbWIgZWl0aGVyLiAgV2hvIGtub3dzLCBpdCBtaWdodCBzdWNjZWVkIGF0IGEgbGF0ZXIgcG9pbnQgaWYgd2UgZnJlZQorCXNvbWUgbWVtb3J5IGluIHRoZSBtZWFudGltZS4gIEluIGFueSBjYXNlLCB0aGUgb3RoZXIgcm91dGluZXMga25vdworCWhvdyB0byBkZWFsIHdpdGggbGFjayBvZiBhIHRhYmxlIGFmdGVyIHRyeWluZyB0byBpbml0aWFsaXplIGl0LiAgVGhpcworCW1heSBvciBtYXkgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBidWcsIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5CisJd2FybiBhYm91dCB0aGlzIHBhcnRpY3VsYXIgZmFpbHVyZSBtb2RlLgorCisqLworCitzdGF0aWMgdm9pZAoraW5pdF9zaWduYWxfdGFibGVzICgpCit7CisgIGNvbnN0IHN0cnVjdCBzaWduYWxfaW5mbyAqZWlwOworICBpbnQgbmJ5dGVzOworCisgIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBzY2FubmVkIHRoZSBzaWduYWxfdGFibGUgb25jZSB0byBmaW5kIHRoZSBtYXhpbXVtCisgICAgIHNpZ25hbCB2YWx1ZSwgdGhlbiBnbyBmaW5kIGl0IG5vdy4gKi8KKworICBpZiAobnVtX3NpZ25hbF9uYW1lcyA9PSAwKQorICAgIHsKKyAgICAgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKKwl7CisJICBpZiAoZWlwIC0+IHZhbHVlID49IG51bV9zaWduYWxfbmFtZXMpCisJICAgIHsKKwkgICAgICBudW1fc2lnbmFsX25hbWVzID0gZWlwIC0+IHZhbHVlICsgMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNpZ25hbF9uYW1lcyB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCisgICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBzaWduYWxfdGFibGUuICovCisKKyAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIG5ieXRlcyA9IG51bV9zaWduYWxfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7CisgICAgICBpZiAoKHNpZ25hbF9uYW1lcyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCisJeworCSAgbWVtc2V0IChzaWduYWxfbmFtZXMsIDAsIG5ieXRlcyk7CisJICBmb3IgKGVpcCA9IHNpZ25hbF90YWJsZTsgZWlwIC0+IG5hbWUgIT0gTlVMTDsgZWlwKyspCisJICAgIHsKKwkgICAgICBzaWduYWxfbmFtZXNbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBuYW1lOworCSAgICB9CisJfQorICAgIH0KKworI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCisKKyAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHN5c19zaWdsaXN0IHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KKyAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHNpZ25hbF90YWJsZS4gKi8KKworICBpZiAoc3lzX3NpZ2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBuYnl0ZXMgPSBudW1fc2lnbmFsX25hbWVzICogc2l6ZW9mIChjaGFyICopOworICAgICAgaWYgKChzeXNfc2lnbGlzdCA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKG5ieXRlcykpICE9IE5VTEwpCisJeworCSAgbWVtc2V0IChzeXNfc2lnbGlzdCwgMCwgbmJ5dGVzKTsKKwkgIHN5c19uc2lnID0gbnVtX3NpZ25hbF9uYW1lczsKKwkgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKKwkgICAgeworCSAgICAgIHN5c19zaWdsaXN0W2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbXNnOworCSAgICB9CisJfQorICAgIH0KKworI2VuZGlmCisKK30KKworCisvKgorCitOQU1FCisKKwlzaWdub19tYXggLS0gcmV0dXJuIHRoZSBtYXggc2lnbm8gdmFsdWUKKworU1lOT1BTSVMKKworCWludCBzaWdub19tYXggKCk7CisKK0RFU0NSSVBUSU9OCisKKwlSZXR1cm5zIHRoZSBtYXhpbXVtIHNpZ25vIHZhbHVlIGZvciB3aGljaCBhIGNvcnJlc3BvbmRpbmcgc3ltYm9saWMKKwluYW1lIG9yIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIHdoZXJlCisJd2UgdXNlIHRoZSBzeXNfc2lnbGlzdCBzdXBwbGllZCBieSB0aGUgc3lzdGVtLCBpdCBpcyBwb3NzaWJsZSBmb3IKKwl0aGVyZSB0byBiZSBtb3JlIHN5bWJvbGljIG5hbWVzIHRoYW4gbWVzc2FnZXMsIG9yIHZpY2UgdmVyc2EuCisJSW4gZmFjdCwgdGhlIG1hbnVhbCBwYWdlIGZvciBwc2lnbmFsKDNiKSBleHBsaWNpdGx5IHdhcm5zIHRoYXQgb25lCisJc2hvdWxkIGNoZWNrIHRoZSBzaXplIG9mIHRoZSB0YWJsZSAoTlNJRykgYmVmb3JlIGluZGV4aW5nIGl0LAorCXNpbmNlIG5ldyBzaWduYWwgY29kZXMgbWF5IGJlIGFkZGVkIHRvIHRoZSBzeXN0ZW0gYmVmb3JlIHRoZXkgYXJlCisJYWRkZWQgdG8gdGhlIHRhYmxlLiAgVGh1cyBOU0lHIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB2YWx1ZQorCWltcGxpZWQgYnkgdGhlIGxhcmdlc3Qgc2lnbm8gdmFsdWUgZGVmaW5lZCBpbiA8c2lnbmFsLmg+LgorCisJV2UgcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gb2J0YWluIGEgbWVhbmluZ2Z1bAorCXN5bWJvbGljIG5hbWUgb3IgbWVzc2FnZS4KKworKi8KKworaW50CitzaWdub19tYXggKCkKK3sKKyAgaW50IG1heHNpemU7CisKKyAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKKyAgICB9CisgIG1heHNpemUgPSBNQVggKHN5c19uc2lnLCBudW1fc2lnbmFsX25hbWVzKTsKKyAgcmV0dXJuIChtYXhzaXplIC0gMSk7Cit9CisKKworLyoKKworTkFNRQorCisJc3Ryc2lnbmFsIC0tIG1hcCBhIHNpZ25hbCBudW1iZXIgdG8gYSBzaWduYWwgbWVzc2FnZSBzdHJpbmcKKworU1lOT1BTSVMKKworCWNvbnN0IGNoYXIgKnN0cnNpZ25hbCAoaW50IHNpZ25vKQorCitERVNDUklQVElPTgorCisJTWFwcyBhbiBzaWduYWwgbnVtYmVyIHRvIGFuIHNpZ25hbCBtZXNzYWdlIHN0cmluZywgdGhlIGNvbnRlbnRzIG9mCisJd2hpY2ggYXJlIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICBPbiBzeXN0ZW1zIHdoaWNoIGhhdmUgdGhlIGV4dGVybmFsCisJdmFyaWFibGUgc3lzX3NpZ2xpc3QsIHRoZXNlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lcyB1c2VkCisJYnkgcHNpZ25hbCgpLgorCisJSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCisJZm9yIHRoZSBzeXNfc2lnbGlzdCwgYnV0IG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgorCXNpZ25hbCBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJTaWduYWwgTlVNIiwgd2hlcmUgTlVNIGlzIHRoZQorCXNpZ25hbCBudW1iZXIuCisKKwlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIHN5c19zaWdsaXN0LAorCXJldHVybnMgTlVMTC4KKworCVRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIG9ubHkgdW50aWwgdGhlCisJbmV4dCBjYWxsIHRvIHN0cnNpZ25hbC4KKworKi8KKworI2lmbmRlZiBIQVZFX1NUUlNJR05BTAorCitjb25zdCBjaGFyICoKK3N0cnNpZ25hbCAoc2lnbm8pCisgIGludCBzaWdubzsKK3sKKyAgY29uc3QgY2hhciAqbXNnOworICBzdGF0aWMgY2hhciBidWZbMzJdOworCisjaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKKworICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCisgICAgeworICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOworICAgIH0KKworI2VuZGlmCisKKyAgaWYgKChzaWdubyA8IDApIHx8IChzaWdubyA+PSBzeXNfbnNpZykpCisgICAgeworICAgICAgLyogT3V0IG9mIHJhbmdlLCBqdXN0IHJldHVybiBOVUxMICovCisgICAgICBtc2cgPSBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoKHN5c19zaWdsaXN0ID09IE5VTEwpIHx8IChzeXNfc2lnbGlzdFtzaWdub10gPT0gTlVMTCkpCisgICAgeworICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBzeXNfc2lnbGlzdCBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLworICAgICAgc3ByaW50ZiAoYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOworICAgICAgbXNnID0gKGNvbnN0IGNoYXIgKikgYnVmOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBtZXNzYWdlLiAgSnVzdCByZXR1cm4gdGhlIG1lc3NhZ2UuICovCisgICAgICBtc2cgPSAoY29uc3QgY2hhciAqKSBzeXNfc2lnbGlzdFtzaWdub107CisgICAgfQorICAKKyAgcmV0dXJuIChtc2cpOworfQorCisjZW5kaWYgLyogISBIQVZFX1NUUlNJR05BTCAqLworCisvKgorCitOQU1FCisKKwlzdHJzaWdubyAtLSBtYXAgYW4gc2lnbmFsIG51bWJlciB0byBhIHN5bWJvbGljIG5hbWUgc3RyaW5nCisKK1NZTk9QU0lTCisKKwljb25zdCBjaGFyICpzdHJzaWdubyAoaW50IHNpZ25vKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYW4gc2lnbmFsIG51bWJlciwgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZworCXRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoYXQgc2lnbmFsIG51bWJlciwgYXMgZm91bmQgaW4gPHNpZ25hbC5oPi4KKworCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcworCWZvciBzeW1ib2xpYyBuYW1lcywgYnV0IG5vIG5hbWUgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgorCXNpZ25hbCBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJTaWduYWwgTlVNIiwgd2hlcmUgTlVNIGlzCisJdGhlIHNpZ25hbCBudW1iZXIuCisKKwlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZSBvZiB2YWxpZAorCWluZGljZXMsIHRoZW4gcmV0dXJucyBOVUxMLgorCitCVUdTCisKKwlUaGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZQorCXZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gc3Ryc2lnbm8uCisKKyovCisKK2NvbnN0IGNoYXIgKgorc3Ryc2lnbm8gKHNpZ25vKQorICBpbnQgc2lnbm87Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHN0YXRpYyBjaGFyIGJ1ZlszMl07CisKKyAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKKyAgICB9CisKKyAgaWYgKChzaWdubyA8IDApIHx8IChzaWdubyA+PSBudW1fc2lnbmFsX25hbWVzKSkKKyAgICB7CisgICAgICAvKiBPdXQgb2YgcmFuZ2UsIGp1c3QgcmV0dXJuIE5VTEwgKi8KKyAgICAgIG5hbWUgPSBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoKHNpZ25hbF9uYW1lcyA9PSBOVUxMKSB8fCAoc2lnbmFsX25hbWVzW3NpZ25vXSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIHNpZ25hbF9uYW1lcyBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLworICAgICAgc3ByaW50ZiAoYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOworICAgICAgbmFtZSA9IChjb25zdCBjaGFyICopIGJ1ZjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbmFtZS4gIEp1c3QgcmV0dXJuIHRoZSBuYW1lLiAqLworICAgICAgbmFtZSA9IHNpZ25hbF9uYW1lc1tzaWdub107CisgICAgfQorCisgIHJldHVybiAobmFtZSk7Cit9CisKKworLyoKKworTkFNRQorCisJc3RydG9zaWdubyAtLSBtYXAgYSBzeW1ib2xpYyBzaWduYWwgbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKKworU1lOT1BTSVMKKworCWludCBzdHJ0b3NpZ25vIChjaGFyICpuYW1lKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gdGhlIHN5bWJvbGljIG5hbWUgb2YgYSBzaWduYWwsIG1hcCBpdCB0byBhIHNpZ25hbCBudW1iZXIuCisJSWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQsIHJldHVybnMgMC4KKworKi8KKworaW50CitzdHJ0b3NpZ25vIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpbnQgc2lnbm8gPSAwOworCisgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQorCXsKKwkgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKKwl9CisgICAgICBmb3IgKHNpZ25vID0gMDsgc2lnbm8gPCBudW1fc2lnbmFsX25hbWVzOyBzaWdubysrKQorCXsKKwkgIGlmICgoc2lnbmFsX25hbWVzW3NpZ25vXSAhPSBOVUxMKSAmJgorCSAgICAgIChzdHJjbXAgKG5hbWUsIHNpZ25hbF9uYW1lc1tzaWdub10pID09IDApKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBpZiAoc2lnbm8gPT0gbnVtX3NpZ25hbF9uYW1lcykKKwl7CisJICBzaWdubyA9IDA7CisJfQorICAgIH0KKyAgcmV0dXJuIChzaWdubyk7Cit9CisKKworLyoKKworTkFNRQorCisJcHNpZ25hbCAtLSBwcmludCBtZXNzYWdlIGFib3V0IHNpZ25hbCB0byBzdGRlcnIKKworU1lOT1BTSVMKKworCXZvaWQgcHNpZ25hbCAodW5zaWduZWQgc2lnbm8sIGNoYXIgKm1lc3NhZ2UpOworCitERVNDUklQVElPTgorCisJUHJpbnQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHRoZSBtZXNzYWdlLCBmb2xsb3dlZCBieSBhIGNvbG9uLAorCWZvbGxvd2VkIGJ5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2lnbmFsIHNwZWNpZmllZCBieSBzaWdubywKKwlmb2xsb3dlZCBieSBhIG5ld2xpbmUuCisqLworCisjaWZuZGVmIEhBVkVfUFNJR05BTAorCit2b2lkCitwc2lnbmFsIChzaWdubywgbWVzc2FnZSkKKyAgdW5zaWduZWQgc2lnbm87CisgIGNoYXIgKm1lc3NhZ2U7Cit7CisgIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7CisgICAgfQorICBpZiAoKHNpZ25vIDw9IDApIHx8IChzaWdubyA+PSBzeXNfbnNpZykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVua25vd24gc2lnbmFsXG4iLCBtZXNzYWdlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG1lc3NhZ2UsIHN5c19zaWdsaXN0W3NpZ25vXSk7CisgICAgfQorfQorCisjZW5kaWYJLyogISBIQVZFX1BTSUdOQUwgKi8KKworCisvKiBBIHNpbXBsZSBsaXR0bGUgbWFpbiB0aGF0IGRvZXMgbm90aGluZyBidXQgcHJpbnQgYWxsIHRoZSBzaWduYWwgdHJhbnNsYXRpb25zCisgICBpZiBNQUlOIGlzIGRlZmluZWQgYW5kIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkLiAqLworCisjaWZkZWYgTUFJTgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluICgpCit7CisgIGludCBzaWdubzsKKyAgaW50IG1heHNpZ25vOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICptc2c7CisKKyAgbWF4c2lnbm8gPSBzaWdub19tYXggKCk7CisgIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbmFtZXMgdGFibGUuXG4iLCBudW1fc2lnbmFsX25hbWVzKTsKKyAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBtZXNzYWdlcyB0YWJsZS5cbiIsIHN5c19uc2lnKTsKKyAgcHJpbnRmICgiJWQgaXMgbWF4IHVzZWZ1bCBpbmRleC5cbiIsIG1heHNpZ25vKTsKKworICAvKiBLZWVwIHByaW50aW5nIHZhbHVlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiAqYm90aCogdGFibGVzLCBub3QKKyAgICAgKmVpdGhlciogdGFibGUuICBOb3RlIHRoYXQga25vd2luZyB0aGUgbWF4aW11bSB1c2VmdWwgaW5kZXggZG9lcyAqbm90KgorICAgICByZWxpZXZlIHVzIG9mIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0ZXN0aW5nIHRoZSByZXR1cm4gcG9pbnRlciBmb3IKKyAgICAgTlVMTC4gKi8KKworICBmb3IgKHNpZ25vID0gMDsgc2lnbm8gPD0gbWF4c2lnbm87IHNpZ25vKyspCisgICAgeworICAgICAgbmFtZSA9IHN0cnNpZ25vIChzaWdubyk7CisgICAgICBuYW1lID0gKG5hbWUgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG5hbWU7CisgICAgICBtc2cgPSBzdHJzaWduYWwgKHNpZ25vKTsKKyAgICAgIG1zZyA9IChtc2cgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG1zZzsKKyAgICAgIHByaW50ZiAoIiUtNGQlLTE4cyVzXG4iLCBzaWdubywgbmFtZSwgbXNnKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnN0ci5jIGIvbGliaWJlcnR5L3N0cnN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjM2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvc3Ryc3RyLmMKQEAgLTAsMCArMSw1MSBAQAorLyogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHN0cnN0ciBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgorICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCisKKy8qCisKK05BTUUKKworCXN0cnN0ciAtLSBsb2NhdGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGEgc3Vic3RyaW5nCisKK1NZTk9QU0lTCisKKwkjaW5jbHVkZSA8c3RyaW5nLmg+CisKKwljaGFyICpzdHJzdHIgKGNoYXIgKnMxLCBjaGFyICpzMikKKworREVTQ1JJUFRJT04KKworCUxvY2F0ZXMgdGhlIGZpcnN0IG9jY3VyYW5jZSBpbiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgUzEgb2YKKwl0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgUzIuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3Vic3RyaW5nCisJZm91bmQsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vdCBmb3VuZC4gIElmIFMyIHBvaW50cyB0byBhIHN0cmluZworCXdpdGggemVybyBsZW5ndGgsIHRoZSBmdW5jdGlvbiByZXR1cm5zIFMxLgorCQorQlVHUworCisqLworCisKKy8qIEZJWE1FOiAgVGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIEFOU0kgY29tcGlsaWFudC4gIFRoaXMgcm91dGluZSBoYXMgbm90CisgICBiZWVuIHZhbGlkYXRlZCB0byBjb21wbHkgd2l0aCBpdC4gIC1mbmYgKi8KKworY2hhciAqCitzdHJzdHIgKHMxLCBzMikKKyAgY2hhciAqczEsICpzMjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IHMxOworICBleHRlcm4gY2hhciAqc3RyY2hyICgpOworICBleHRlcm4gaW50IHN0cm5jbXAgKCk7CisjaWYgX19HTlVDX189PTIKKyAgZXh0ZXJuIF9fU0laRV9UWVBFX18gc3RybGVuICgpOworI2VuZGlmCisgIHJlZ2lzdGVyIGludCBsZW4gPSBzdHJsZW4gKHMyKTsKKworICBmb3IgKDsgKHAgPSBzdHJjaHIgKHAsICpzMikpICE9IDA7IHArKykKKyAgICB7CisgICAgICBpZiAoc3RybmNtcCAocCwgczIsIGxlbikgPT0gMCkKKwl7CisJICByZXR1cm4gKHApOworCX0KKyAgICB9CisgIHJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RydG9kLmMgYi9saWJpYmVydHkvc3RydG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2YzczZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS9zdHJ0b2QuYwpAQCAtMCwwICsxLDEyMiBAQAorLyogSW1wbGVtZW50YXRpb24gb2Ygc3RydG9kIGZvciBzeXN0ZW1zIHdpdGggYXRvZi4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKK3NvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQordGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcworY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKK3RoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK1RoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKK3RoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitleHRlcm4gZG91YmxlIGF0b2YgKCk7CisKKy8qIERpc2NsYWltZXI6IHRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBieSBDSElMTCBpbiBHREIgYW5kIHRoZXJlZm9yZQorICAgaGFzIG5vdCBiZWVuIHRlc3RlZCB3ZWxsLiAgSXQgbWF5IGhhdmUgYmVlbiB0ZXN0ZWQgZm9yIG5vdGhpbmcgZXhjZXB0CisgICB0aGF0IGl0IGNvbXBpbGVzLiAgKi8KKworZG91YmxlCitzdHJ0b2QgKHN0ciwgcHRyKQorICAgICBjaGFyICpzdHI7CisgICAgIGNoYXIgKipwdHI7Cit7CisgIGNoYXIgKnA7CisKKyAgaWYgKHB0ciA9PSAoY2hhciAqKikwKQorICAgIHJldHVybiBhdG9mIChzdHIpOworICAKKyAgcCA9IHN0cjsKKyAgCisgIHdoaWxlIChpc3NwYWNlICgqcCkpCisgICAgKytwOworICAKKyAgaWYgKCpwID09ICcrJyB8fCAqcCA9PSAnLScpCisgICAgKytwOworCisgIC8qIElORiBvciBJTkZJTklUWS4gICovCisgIGlmICgocFswXSA9PSAnaScgfHwgcFswXSA9PSAnSScpCisgICAgICAmJiAocFsxXSA9PSAnbicgfHwgcFsxXSA9PSAnTicpCisgICAgICAmJiAocFsyXSA9PSAnZicgfHwgcFsyXSA9PSAnRicpKQorICAgIHsKKyAgICAgIGlmICgocFszXSA9PSAnaScgfHwgcFszXSA9PSAnSScpCisJICAmJiAocFs0XSA9PSAnbicgfHwgcFs0XSA9PSAnTicpCisJICAmJiAocFs1XSA9PSAnaScgfHwgcFs1XSA9PSAnSScpCisJICAmJiAocFs2XSA9PSAndCcgfHwgcFs2XSA9PSAnVCcpCisJICAmJiAocFs3XSA9PSAneScgfHwgcFs3XSA9PSAnWScpKQorCXsKKwkgICpwdHIgPSBwICsgNzsKKwkgIHJldHVybiBhdG9mIChzdHIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqcHRyID0gcCArIDM7CisJICByZXR1cm4gYXRvZiAoc3RyKTsKKwl9CisgICAgfQorCisgIC8qIE5BTiBvciBOQU4oZm9vKS4gICovCisgIGlmICgocFswXSA9PSAnbicgfHwgcFswXSA9PSAnTicpCisgICAgICAmJiAocFsxXSA9PSAnYScgfHwgcFsxXSA9PSAnQScpCisgICAgICAmJiAocFsyXSA9PSAnbicgfHwgcFsyXSA9PSAnTicpKQorICAgIHsKKyAgICAgIHAgKz0gMzsKKyAgICAgIGlmICgqcCA9PSAnKCcpCisJeworCSAgKytwOworCSAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJyknKQorCSAgICArK3A7CisJICBpZiAoKnAgPT0gJyknKQorCSAgICArK3A7CisJfQorICAgICAgKnB0ciA9IHA7CisgICAgICByZXR1cm4gYXRvZiAoc3RyKTsKKyAgICB9CisKKyAgLyogZGlnaXRzLCB3aXRoIDAgb3IgMSBwZXJpb2RzIGluIGl0LiAgKi8KKyAgaWYgKGlzZGlnaXQgKCpwKSB8fCAqcCA9PSAnLicpCisgICAgeworICAgICAgaW50IGdvdF9kb3QgPSAwOworICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSB8fCAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKSkKKwl7CisJICBpZiAoKnAgPT0gJy4nKQorCSAgICBnb3RfZG90ID0gMTsKKwkgICsrcDsKKwl9CisKKyAgICAgIC8qIEV4cG9uZW50LiAgKi8KKyAgICAgIGlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQorCXsKKwkgIGludCBpOworCSAgaSA9IDE7CisJICBpZiAocFtpXSA9PSAnKycgfHwgcFtpXSA9PSAnLScpCisJICAgICsraTsKKwkgIGlmIChpc2RpZ2l0IChwW2ldKSkKKwkgICAgeworCSAgICAgIHdoaWxlIChpc2RpZ2l0IChwW2ldKSkKKwkJKytpOworCSAgICAgICpwdHIgPSBwICsgaTsKKwkgICAgICByZXR1cm4gYXRvZiAoc3RyKTsKKwkgICAgfQorCX0KKyAgICAgICpwdHIgPSBwOworICAgICAgcmV0dXJuIGF0b2YgKHN0cik7CisgICAgfQorICAvKiBEaWRuJ3QgZmluZCBhbnkgZGlnaXRzLiAgRG9lc24ndCBsb29rIGxpa2UgYSBudW1iZXIuICAqLworICAqcHRyID0gc3RyOworICByZXR1cm4gMC4wOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvbC5jIGIvbGliaWJlcnR5L3N0cnRvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDE3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvc3RydG9sLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZiAwCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorCisvKiBGSVhNRTogSXQnZCBiZSBuaWNlIHRvIGNvbmZpZ3VyZSBhcm91bmQgdGhlc2UsIGJ1dCB0aGUgaW5jbHVkZSBmaWxlcyBhcmUgdG9vCisgICBwYWluZnVsLiAgVGhlc2UgbWFjcm9zIHNob3VsZCBhdCBsZWFzdCBiZSBtb3JlIHBvcnRhYmxlIHRoYW4gaGFyZHdpcmVkIGhleAorICAgY29uc3RhbnRzLiAqLworCisjaWZuZGVmIFVMT05HX01BWAorI2RlZmluZQlVTE9OR19NQVgJKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkJLyogMHhGRkZGRkZGRiAqLworI2VuZGlmCisKKyNpZm5kZWYgTE9OR19NQVgKKyNkZWZpbmUJTE9OR19NQVgJKChsb25nKShVTE9OR19NQVggPj4gMSkpCS8qIDB4N0ZGRkZGRkYgKi8KKyNlbmRpZgorCisjaWZuZGVmIExPTkdfTUlOCisjZGVmaW5lCUxPTkdfTUlOCSgobG9uZykofkxPTkdfTUFYKSkJCS8qIDB4ODAwMDAwMDAgKi8KKyNlbmRpZgorCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgaW50ZWdlci4KKyAqCisgKiBJZ25vcmVzIGBsb2NhbGUnIHN0dWZmLiAgQXNzdW1lcyB0aGF0IHRoZSB1cHBlciBhbmQgbG93ZXIgY2FzZQorICogYWxwaGFiZXRzIGFuZCBkaWdpdHMgYXJlIGVhY2ggY29udGlndW91cy4KKyAqLworbG9uZworc3RydG9sKG5wdHIsIGVuZHB0ciwgYmFzZSkKKwljb25zdCBjaGFyICpucHRyOworCWNoYXIgKiplbmRwdHI7CisJcmVnaXN0ZXIgaW50IGJhc2U7Cit7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IG5wdHI7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhY2M7CisJcmVnaXN0ZXIgaW50IGM7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjdXRvZmY7CisJcmVnaXN0ZXIgaW50IG5lZyA9IDAsIGFueSwgY3V0bGltOworCisJLyoKKwkgKiBTa2lwIHdoaXRlIHNwYWNlIGFuZCBwaWNrIHVwIGxlYWRpbmcgKy8tIHNpZ24gaWYgYW55LgorCSAqIElmIGJhc2UgaXMgMCwgYWxsb3cgMHggZm9yIGhleCBhbmQgMCBmb3Igb2N0YWwsIGVsc2UKKwkgKiBhc3N1bWUgZGVjaW1hbDsgaWYgYmFzZSBpcyBhbHJlYWR5IDE2LCBhbGxvdyAweC4KKwkgKi8KKwlkbyB7CisJCWMgPSAqcysrOworCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCWlmIChjID09ICctJykgeworCQluZWcgPSAxOworCQljID0gKnMrKzsKKwl9IGVsc2UgaWYgKGMgPT0gJysnKQorCQljID0gKnMrKzsKKwlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgorCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKKwkJYyA9IHNbMV07CisJCXMgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKwlpZiAoYmFzZSA9PSAwKQorCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIGN1dG9mZiB2YWx1ZSBiZXR3ZWVuIGxlZ2FsIG51bWJlcnMgYW5kIGlsbGVnYWwKKwkgKiBudW1iZXJzLiAgVGhhdCBpcyB0aGUgbGFyZ2VzdCBsZWdhbCB2YWx1ZSwgZGl2aWRlZCBieSB0aGUKKwkgKiBiYXNlLiAgQW4gaW5wdXQgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUsIGlmCisJICogZm9sbG93ZWQgYnkgYSBsZWdhbCBpbnB1dCBjaGFyYWN0ZXIsIGlzIHRvbyBiaWcuICBPbmUgdGhhdAorCSAqIGlzIGVxdWFsIHRvIHRoaXMgdmFsdWUgbWF5IGJlIHZhbGlkIG9yIG5vdDsgdGhlIGxpbWl0CisJICogYmV0d2VlbiB2YWxpZCBhbmQgaW52YWxpZCBudW1iZXJzIGlzIHRoZW4gYmFzZWQgb24gdGhlIGxhc3QKKwkgKiBkaWdpdC4gIEZvciBpbnN0YW5jZSwgaWYgdGhlIHJhbmdlIGZvciBsb25ncyBpcworCSAqIFstMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0N10gYW5kIHRoZSBpbnB1dCBiYXNlIGlzIDEwLAorCSAqIGN1dG9mZiB3aWxsIGJlIHNldCB0byAyMTQ3NDgzNjQgYW5kIGN1dGxpbSB0byBlaXRoZXIKKwkgKiA3IChuZWc9PTApIG9yIDggKG5lZz09MSksIG1lYW5pbmcgdGhhdCBpZiB3ZSBoYXZlIGFjY3VtdWxhdGVkCisJICogYSB2YWx1ZSA+IDIxNDc0ODM2NCwgb3IgZXF1YWwgYnV0IHRoZSBuZXh0IGRpZ2l0IGlzID4gNyAob3IgOCksCisJICogdGhlIG51bWJlciBpcyB0b28gYmlnLCBhbmQgd2Ugd2lsbCByZXR1cm4gYSByYW5nZSBlcnJvci4KKwkgKgorCSAqIFNldCBhbnkgaWYgYW55IGBkaWdpdHMnIGNvbnN1bWVkOyBtYWtlIGl0IG5lZ2F0aXZlIHRvIGluZGljYXRlCisJICogb3ZlcmZsb3cuCisJICovCisJY3V0b2ZmID0gbmVnID8gLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOIDogTE9OR19NQVg7CisJY3V0bGltID0gY3V0b2ZmICUgKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwljdXRvZmYgLz0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwlmb3IgKGFjYyA9IDAsIGFueSA9IDA7OyBjID0gKnMrKykgeworCQlpZiAoaXNkaWdpdChjKSkKKwkJCWMgLT0gJzAnOworCQllbHNlIGlmIChpc2FscGhhKGMpKQorCQkJYyAtPSBpc3VwcGVyKGMpID8gJ0EnIC0gMTAgOiAnYScgLSAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWlmIChjID49IGJhc2UpCisJCQlicmVhazsKKwkJaWYgKGFueSA8IDAgfHwgYWNjID4gY3V0b2ZmIHx8IGFjYyA9PSBjdXRvZmYgJiYgYyA+IGN1dGxpbSkKKwkJCWFueSA9IC0xOworCQllbHNlIHsKKwkJCWFueSA9IDE7CisJCQlhY2MgKj0gYmFzZTsKKwkJCWFjYyArPSBjOworCQl9CisJfQorCWlmIChhbnkgPCAwKSB7CisJCWFjYyA9IG5lZyA/IExPTkdfTUlOIDogTE9OR19NQVg7CisJCWVycm5vID0gRVJBTkdFOworCX0gZWxzZSBpZiAobmVnKQorCQlhY2MgPSAtYWNjOworCWlmIChlbmRwdHIgIT0gMCkKKwkJKmVuZHB0ciA9IChjaGFyICopIChhbnkgPyBzIC0gMSA6IG5wdHIpOworCXJldHVybiAoYWNjKTsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b3VsLmMgYi9saWJpYmVydHkvc3RydG91bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNmYyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvc3RydG91bC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmIDAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNpZm5kZWYgVUxPTkdfTUFYCisjZGVmaW5lCVVMT05HX01BWAkoKHVuc2lnbmVkIGxvbmcpKH4wTCkpCQkvKiAweEZGRkZGRkZGICovCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLgorICoKKyAqIElnbm9yZXMgYGxvY2FsZScgc3R1ZmYuICBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCisgKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgorICovCit1bnNpZ25lZCBsb25nCitzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSkKKwljb25zdCBjaGFyICpucHRyOworCWNoYXIgKiplbmRwdHI7CisJcmVnaXN0ZXIgaW50IGJhc2U7Cit7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IG5wdHI7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhY2M7CisJcmVnaXN0ZXIgaW50IGM7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjdXRvZmY7CisJcmVnaXN0ZXIgaW50IG5lZyA9IDAsIGFueSwgY3V0bGltOworCisJLyoKKwkgKiBTZWUgc3RydG9sIGZvciBjb21tZW50cyBhcyB0byB0aGUgbG9naWMgdXNlZC4KKwkgKi8KKwlkbyB7CisJCWMgPSAqcysrOworCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCWlmIChjID09ICctJykgeworCQluZWcgPSAxOworCQljID0gKnMrKzsKKwl9IGVsc2UgaWYgKGMgPT0gJysnKQorCQljID0gKnMrKzsKKwlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgorCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKKwkJYyA9IHNbMV07CisJCXMgKz0gMjsKKwkJYmFzZSA9IDE2OworCX0KKwlpZiAoYmFzZSA9PSAwKQorCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7CisJY3V0b2ZmID0gKHVuc2lnbmVkIGxvbmcpVUxPTkdfTUFYIC8gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwljdXRsaW0gPSAodW5zaWduZWQgbG9uZylVTE9OR19NQVggJSAodW5zaWduZWQgbG9uZyliYXNlOworCWZvciAoYWNjID0gMCwgYW55ID0gMDs7IGMgPSAqcysrKSB7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJYyAtPSAnMCc7CisJCWVsc2UgaWYgKGlzYWxwaGEoYykpCisJCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOworCQllbHNlCisJCQlicmVhazsKKwkJaWYgKGMgPj0gYmFzZSkKKwkJCWJyZWFrOworCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgYWNjID09IGN1dG9mZiAmJiBjID4gY3V0bGltKQorCQkJYW55ID0gLTE7CisJCWVsc2UgeworCQkJYW55ID0gMTsKKwkJCWFjYyAqPSBiYXNlOworCQkJYWNjICs9IGM7CisJCX0KKwl9CisJaWYgKGFueSA8IDApIHsKKwkJYWNjID0gVUxPTkdfTUFYOworCQllcnJubyA9IEVSQU5HRTsKKwl9IGVsc2UgaWYgKG5lZykKKwkJYWNjID0gLWFjYzsKKwlpZiAoZW5kcHRyICE9IDApCisJCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKKwlyZXR1cm4gKGFjYyk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdG1wbmFtLmMgYi9saWJpYmVydHkvdG1wbmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2MTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS90bXBuYW0uYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBMX3RtcG5hbQorI2RlZmluZSBMX3RtcG5hbWUgMTAwCisjZW5kaWYKKyNpZm5kZWYgUF90bXBkaXIKKyNkZWZpbmUgUF90bXBkaXIgIi91c3IvdG1wIgorI2VuZGlmCisKK3N0YXRpYyBjaGFyIHRtcG5hbV9idWZmZXJbTF90bXBuYW1dOworc3RhdGljIGludCB0bXBuYW1fY291bnRlcjsKKworZXh0ZXJuIGludCBnZXRwaWQgKCk7CisKK2NoYXIgKgordG1wbmFtIChzKQorICAgICBjaGFyICpzOworeworICBpbnQgcGlkID0gZ2V0cGlkICgpOworCisgIGlmIChzID09IE5VTEwpCisgICAgcyA9IHRtcG5hbV9idWZmZXI7CisKKyAgLyogIEdlbmVyYXRlIHRoZSBmaWxlbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3Qgb25lIGNhbGxlZAorICAgICAgaXQgYWxyZWFkeS4gICovCisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgRklMRSAqZjsKKyAgICAgIHNwcmludGYgKHMsICIlcy8lcyV4LiV4IiwgUF90bXBkaXIsICJ0IiwgcGlkLCB0bXBuYW1fY291bnRlcik7CisgICAgICBmID0gZm9wZW4gKHMsICJyIik7CisgICAgICBpZiAoZiA9PSBOVUxMKQorCWJyZWFrOworICAgICAgdG1wbmFtX2NvdW50ZXIrKzsKKyAgICAgIGZjbG9zZSAoZik7CisgICAgfQorCisgIHJldHVybiBzOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Zhc3ByaW50Zi5jIGIvbGliaWJlcnR5L3Zhc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjgwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvdmFzcHJpbnRmLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIExpa2UgdnNwcmludGYgYnV0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9yYWdlLCB3aGljaCBtdXN0CisgICBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCitMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0xpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKworI2lmZGVmIFRFU1QKK2ludCBnbG9iYWxfdG90YWxfd2lkdGg7CisjZW5kaWYKKwordW5zaWduZWQgbG9uZyBzdHJ0b3VsICgpOworY2hhciAqbWFsbG9jICgpOworCitzdGF0aWMgaW50CitpbnRfdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgYXJncykKKyAgICAgY2hhciAqKnJlc3VsdDsKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9saXN0ICphcmdzOworeworICBjb25zdCBjaGFyICpwID0gZm9ybWF0OworICAvKiBBZGQgb25lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5ldmVyIHplcm8sIHdoaWNoIG1pZ2h0IGNhdXNlIG1hbGxvYworICAgICB0byByZXR1cm4gTlVMTC4gICovCisgIGludCB0b3RhbF93aWR0aCA9IHN0cmxlbiAoZm9ybWF0KSArIDE7CisgIHZhX2xpc3QgYXA7CisKKyAgbWVtY3B5ICgoUFRSKSAmYXAsIChQVFIpIGFyZ3MsIHNpemVvZiAodmFfbGlzdCkpOworCisgIHdoaWxlICgqcCAhPSAnXDAnKQorICAgIHsKKyAgICAgIGlmICgqcCsrID09ICclJykKKwl7CisJICB3aGlsZSAoc3RyY2hyICgiLSsgIzAiLCAqcCkpCisJICAgICsrcDsKKwkgIGlmICgqcCA9PSAnKicpCisJICAgIHsKKwkgICAgICArK3A7CisJICAgICAgdG90YWxfd2lkdGggKz0gYWJzICh2YV9hcmcgKGFwLCBpbnQpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB0b3RhbF93aWR0aCArPSBzdHJ0b3VsIChwLCAmcCwgMTApOworCSAgaWYgKCpwID09ICcuJykKKwkgICAgeworCSAgICAgICsrcDsKKwkgICAgICBpZiAoKnAgPT0gJyonKQorCQl7CisJCSAgKytwOworCQkgIHRvdGFsX3dpZHRoICs9IGFicyAodmFfYXJnIChhcCwgaW50KSk7CisJCX0KKwkgICAgICBlbHNlCisJICAgICAgdG90YWxfd2lkdGggKz0gc3RydG91bCAocCwgJnAsIDEwKTsKKwkgICAgfQorCSAgd2hpbGUgKHN0cmNociAoImhsTCIsICpwKSkKKwkgICAgKytwOworCSAgLyogU2hvdWxkIGJlIGJpZyBlbm91Z2ggZm9yIGFueSBmb3JtYXQgc3BlY2lmaWVyIGV4Y2VwdCAlcyBhbmQgZmxvYXRzLiAgKi8KKwkgIHRvdGFsX3dpZHRoICs9IDMwOworCSAgc3dpdGNoICgqcCkKKwkgICAgeworCSAgICBjYXNlICdkJzoKKwkgICAgY2FzZSAnaSc6CisJICAgIGNhc2UgJ28nOgorCSAgICBjYXNlICd1JzoKKwkgICAgY2FzZSAneCc6CisJICAgIGNhc2UgJ1gnOgorCSAgICBjYXNlICdjJzoKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgaW50KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnZic6CisJICAgIGNhc2UgJ2UnOgorCSAgICBjYXNlICdFJzoKKwkgICAgY2FzZSAnZyc6CisJICAgIGNhc2UgJ0cnOgorCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBkb3VibGUpOworCSAgICAgIC8qIFNpbmNlIGFuIGllZWUgZG91YmxlIGNhbiBoYXZlIGFuIGV4cG9uZW50IG9mIDMwNywgd2UnbGwKKwkJIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBjb3ZlciB0aGUgZ3Jvc3MgY2FzZS4gKi8KKwkgICAgICB0b3RhbF93aWR0aCArPSAzMDc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3MnOgorCSAgICAgIHRvdGFsX3dpZHRoICs9IHN0cmxlbiAodmFfYXJnIChhcCwgY2hhciAqKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3AnOgorCSAgICBjYXNlICduJzoKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgY2hhciAqKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisjaWZkZWYgVEVTVAorICBnbG9iYWxfdG90YWxfd2lkdGggPSB0b3RhbF93aWR0aDsKKyNlbmRpZgorICAqcmVzdWx0ID0gbWFsbG9jICh0b3RhbF93aWR0aCk7CisgIGlmICgqcmVzdWx0ICE9IE5VTEwpCisgICAgcmV0dXJuIHZzcHJpbnRmICgqcmVzdWx0LCBmb3JtYXQsICphcmdzKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK3Zhc3ByaW50ZiAocmVzdWx0LCBmb3JtYXQsIGFyZ3MpCisgICAgIGNoYXIgKipyZXN1bHQ7CisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyNpZiBkZWZpbmVkIChfQlNEX1ZBX0xJU1RfKSAmJiBkZWZpbmVkIChfX0ZyZWVCU0RfXykKKyAgICAgX0JTRF9WQV9MSVNUXyBhcmdzOworI2Vsc2UKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIHJldHVybiBpbnRfdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgJmFyZ3MpOworfQorCisjaWZkZWYgVEVTVAordm9pZAorY2hlY2tpdAorI2lmZGVmIF9fU1REQ19fCisgICAgIChjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikKKyNlbHNlCisgICAgICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyICpyZXN1bHQ7CisKKyNpZmRlZiBfX1NURENfXworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNlbHNlCisgIGNoYXIgKmZvcm1hdDsKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKyAgdmFzcHJpbnRmICgmcmVzdWx0LCBmb3JtYXQsIGFyZ3MpOworICBpZiAoc3RybGVuIChyZXN1bHQpIDwgZ2xvYmFsX3RvdGFsX3dpZHRoKQorICAgIHByaW50ZiAoIlBBU1M6ICIpOworICBlbHNlCisgICAgcHJpbnRmICgiRkFJTDogIik7CisgIHByaW50ZiAoIiVkICVzXG4iLCBnbG9iYWxfdG90YWxfd2lkdGgsIHJlc3VsdCk7Cit9CisKK2ludAorbWFpbiAoKQoreworICBjaGVja2l0ICgiJWQiLCAweDEyMzQ1Njc4KTsKKyAgY2hlY2tpdCAoIiUyMDBkIiwgNSk7CisgIGNoZWNraXQgKCIlLjMwMGQiLCA2KTsKKyAgY2hlY2tpdCAoIiUxMDAuMTUwZCIsIDcpOworICBjaGVja2l0ICgiJXMiLCAiampqampqampqaWlpaWlpaWlpaWlpaWlpb29vb29vb29vb29vb29vb29wcHBwcHBwcHBwcHBhYVxuXAorNzc3Nzc3Nzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzY2NjY2NjY2NjY2NjIyMjIyMjIyMjIyNzc3Nzc3Nzc3Nzc3NzMzMzMzIik7CisgIGNoZWNraXQgKCIlZiVzJWQlcyIsIDEuMCwgImZvbyIsIDc3LCAiYXNkamZmZmZmZmZmZmZmZmZmaWlpaWlpaWlpaWl4eHh4eCIpOworfQorI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92Zm9yay5jIGIvbGliaWJlcnR5L3Zmb3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNDU5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS92Zm9yay5jCkBAIC0wLDAgKzEsOCBAQAorLyogRW11bGF0ZSB2Zm9yayB1c2luZyBqdXN0IHBsYWluIGZvcmssIGZvciBzeXN0ZW1zIHdpdGhvdXQgYSByZWFsIHZmb3JrLgorICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KKworaW50Cit2Zm9yayAoKQoreworICByZXR1cm4gKGZvcmsgKCkpOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3ZmcHJpbnRmLmMgYi9saWJpYmVydHkvdmZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjdiMmZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3ZmcHJpbnRmLmMKQEAgLTAsMCArMSwyMSBAQAorLyogUHJvdmlkZSBhIHZlcnNpb24gdmZwcmludGYgaW4gdGVybXMgb2YgX2RvcHJudC4KKyAgIEJ5IEthdmVoIEdoYXppICAoZ2hhemlAY2FpcC5ydXRnZXJzLmVkdSkgIDMvMjkvOTgKKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqLworCisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyN1bmRlZiB2ZnByaW50ZgorCitpbnQKK3ZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXApCisgIEZJTEUgKiBzdHJlYW07CisgIGNvbnN0IGNoYXIgKiBmb3JtYXQ7CisgIHZhX2xpc3QgYXA7Cit7CisgIHJldHVybiBfZG9wcm50IChmb3JtYXQsIGFwLCBzdHJlYW0pOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Ztc2J1aWxkLmNvbSBiL2xpYmliZXJ0eS92bXNidWlsZC5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZGUzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS92bXNidWlsZC5jb20KQEAgLTAsMCArMSwxNjUgQEAKKyQhIGxpYmliZXJ0eS92bXNidWlsZC5jb20gLS0gYnVpbGQgbGliZXJ0eS5vbGIgZm9yIFZNUyBob3N0LCBWTVMgdGFyZ2V0CiskIQorJCBDQwk9ICJnY2MgL25vVmVyYm9zZS9EZWJ1Zy9JbmNsPShbXSxbLS5pbmNsdWRlXSkiCiskIExJQlIJPSAibGlicmFyeSAvT2JqIgorJCBMSU5LCT0gImxpbmsiCiskIERFTEVURT0gImRlbGV0ZSAvbm9Db25maXJtIgorJCBTRUFSQ0g9ICJzZWFyY2ggL0V4YWN0IgorJCBFQ0hPCT0gIndyaXRlIHN5cyRvdXRwdXQiCiskIEFCT1JUCT0gImV4aXQgJXgwMDJDIgorJCEKKyQgTElCX05BTUUgPSAibGliZXJ0eS5vbGIiCSF0aGlzIGlzIHdoYXQgd2UncmUgZ29pbmcgdG8gY29uc3RydWN0CiskIFdPUktfTElCID0gIm5ldy1saWIub2xiIgkhdXNlZCB0byBndWFyZCBhZ2FpbnN0IGFuIGluY29tcGxldGUgYnVpbGQKKyQKKyQhIG1hbnVhbGx5IGNvcGllZCBmcm9tIE1ha2VmaWxlLmluCiskIFJFUVVJUkVEX09GSUxFUyA9ICJhcmd2Lm8gYmFzZW5hbWUubyBjaG9vc2UtdGVtcC5vIGNvbmNhdC5vIGNwbHVzLWRlbS5vICItCisJKyAiZmRtYXRjaC5vIGZubWF0Y2gubyBnZXRvcHQubyBnZXRvcHQxLm8gZ2V0cnVudGltZS5vIGhleC5vICItCisJKyAiZmxvYXRmb3JtYXQubyBvYmphbGxvYy5vIG9ic3RhY2subyBzcGFjZXMubyBzdHJlcnJvci5vIHN0cnNpZ25hbC5vICItCisJKyAieGF0ZXhpdC5vIHhleGl0Lm8geG1hbGxvYy5vIHhzdHJkdXAubyB4c3RyZXJyb3IubyIKKyQhIGFueXRoaW5nIG5vdCBjYXVnaHQgYnkgbGluaytzZWFyY2ggb2YgZHVtbXkuKiBzaG91bGQgYmUgYWRkZWQgaGVyZQorJCBFWFRSQV9PRklMRVMgPSAiIgorJCEKKyQhIG1vdmUgdG8gdGhlIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGlzIGNvbW1hbmQgcHJvY2VkdXJlCiskIG9sZF9kaXIgPSBmJGVudmlyb24oIkRFRkFVTFQiKQorJCBuZXdfZGlyID0gZiRwYXJzZSgiXy5fOyIsZiRlbnZpcm9uKCJQUk9DRURVUkUiKSkgLSAiXy5fOyIKKyQgc2V0IGRlZmF1bHQgJ25ld19kaXInCiskCiskIEVDSE8gIlN0YXJ0aW5nIGxpYmliZXJ0eSBidWlsZC4uLiIKKyQgY3JlYXRlIGNvbmZpZy5oCisvKiBsaWJpYmVydHkgY29uZmlnLmggZm9yIFZNUyAqLworI2RlZmluZSBORUVEX3N5c19zaWdsaXN0CisjZGVmaW5lIE5FRURfc3Ryc2lnbmFsCisjZGVmaW5lIE5FRURfcHNpZ25hbAorI2RlZmluZSBORUVEX2Jhc2VuYW1lCiskIExJQlIgJ1dPUktfTElCJyAvQ3JlYXRlCiskCiskISBmaXJzdCBwYXNzOiBjb21waWxlICJyZXF1aXJlZCIgbW9kdWxlcworJCBvZmlsZXMgPSBSRVFVSVJFRF9PRklMRVMgKyAiICIgKyBFWFRSQV9PRklMRVMKKyQgcGFzcyA9IDEKKyQgZ29zdWIgZG9fb2ZpbGVzCiskCiskISBzZWNvbmQgcGFzczogcHJvY2VzcyBkdW1teS5jLCB1c2luZyB0aGUgZmlyc3QgcGFzcycgcmVzdWx0cworJCBFQ0hPICIgbm93IGNoZWNraW5nIHJ1bi10aW1lIGxpYnJhcnkgZm9yIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSIKKyQgaWYgZiRzZWFyY2goImR1bW15Lm9iaiIpLm5lcy4iIiB0aGVuICBERUxFVEUgZHVtbXkub2JqOyoKKyQgZGVmaW5lL25vTG9nIHN5cyRlcnJvciBfTkw6CSFjYW4ndCB1c2UgL1VzZXJfTW9kZSBoZXJlIGR1ZSB0byBnY2MKKyQgZGVmaW5lL25vTG9nIHN5cyRvdXRwdXQgX05MOgkhIGRyaXZlcidzIHVzZSBvZiBtdWx0aXBsZSBpbWFnZSBhY3RpdmF0aW9uCiskIG9uIGVycm9yIHRoZW4gY29udGludWUKKyQgJ0NDJyBkdW1teS5jCiskIGRlYXNzaWduIHN5cyRlcnJvciAgICFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKKyQgZGVhc3NpZ24gc3lzJG91dHB1dAorJCBpZiBmJHNlYXJjaCgiZHVtbXkub2JqIikuZXFzLiIiIHRoZW4gIGdvdG8gcGFzczJfZmFpbHVyZTEKKyQhIGxpbmsgZHVtbXkub2JqLCBjYXB0dXJpbmcgZnVsbCBsaW5rZXIgZmVlZGJhY2sgaW4gZHVtbXkubWFwCiskIG9sZG1zZyA9IGYkZW52aXJvbigiTUVTU0FHRSIpCiskIHNldCBtZXNzYWdlIC9GYWNpbGl0eS9TZXZlcml0eS9JZGVudGlmaWNhdGlvbi9UZXh0CiskIGRlZmluZS9Vc2VyIHN5cyRvdXRwdXQgX05MOgorJCBkZWZpbmUvVXNlciBzeXMkZXJyb3IgX05MOgorJCBMSU5LL01hcD1kdW1teS5tYXAvbm9FeGUgZHVtbXkub2JqLCdXT1JLX0xJQicvTGliciwtCisJZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWJyLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYnIKKyQgc2V0IG1lc3NhZ2UgJ29sZG1zZycKKyQgaWYgZiRzZWFyY2goImR1bW15Lm1hcCIpLmVxcy4iIiB0aGVuICBnb3RvIHBhc3MyX2ZhaWx1cmUyCiskIERFTEVURSBkdW1teS5vYmo7KgorJCBTRUFSQ0ggZHVtbXkubWFwICIlTElOSy1JLVVERlNZTSIgL091dHB1dD1kdW1teS5saXN0CiskIERFTEVURSBkdW1teS5tYXA7KgorJCBFQ0hPICIgY2hlY2sgY29tcGxldGVkIgorJCEgd2Ugbm93IGhhdmUgYSBmaWxlIHdpdGggb25lIGVudHJ5IHBlciBsaW5lIG9mIHVucmVzb2x2YWJsZSBzeW1ib2xzCiskIG9maWxlcyA9ICIiCiskIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCiskCW9wZW4vUmVhZCBpZmlsZSQgZHVtbXkubGlzdAorJGlsb29wOiByZWFkL0VuZD1pZG9uZSBpZmlsZSQgaWxpbmUKKyQJaWxpbmUgPSBmJGVkaXQoaWxpbmUsIkNPTVBSRVNTLFRSSU0sTE9XRVJDQVNFIikKKyQJb2ZpbGVzID0gb2ZpbGVzICsgIiAiICsgZiRlbGVtZW50KDEsIiAiLGlsaW5lKSArICIubyIKKyQJZ290byBpbG9vcAorJGlkb25lOiBjbG9zZSBpZmlsZSQKKyQgREVMRVRFIGR1bW15Lmxpc3Q7KgorJCBvbiBlcnJvciB0aGVuIEFCT1JUCiskCiskISB0aGlyZCBwYXNzOiBjb21waWxlICJtaXNzaW5nIiBtb2R1bGVzIGNvbGxlY3RlZCBpbiBwYXNzIDIKKyQgcGFzcyA9IDMKKyQgZ29zdWIgZG9fb2ZpbGVzCiskCiskISBmaW5pc2ggdXAKKyQgTElCUiAnV09SS19MSUInIC9Db21wcmVzcyAvT3V0cHV0PSdMSUJfTkFNRScJIW5ldy1saWIub2xiIC0+IGxpYmVydHkub2xiCiskIERFTEVURSAnV09SS19MSUInOyoKKyQKKyQhIGFsbCBkb25lCiskIEVDSE8gIkNvbXBsZXRlZCBsaWJpYmVydHkgYnVpbGQuIgorJCB0eXBlIHN5cyRpbnB1dDoKKworICBZb3UgbWFueSB3aXNoIHRvIGRvCisgICQgQ09QWSBMSUJFUlRZLk9MQiBHTlVfQ0M6WzAwMDAwMF0KKyAgc28gdGhhdCB0aGlzIHJ1bi10aW1lIGxpYnJhcnkgcmVzaWRlcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBnY2MncworICBzdXBwb3J0IGxpYnJhcnkuICBXaGVuIGJ1aWxkaW5nIGdhcywgYmUgc3VyZSB0byBsZWF2ZSB0aGUgb3JpZ2luYWwKKyAgY29weSBvZiBsaWJlcnR5Lm9sYiBoZXJlIHNvIHRoYXQgZ2FzJ3MgYnVpbGQgcHJvY2VkdXJlIGNhbiBmaW5kIGl0LgorCiskIHNldCBkZWZhdWx0ICdvbGRfZGlyJworJCBleGl0CiskCiskIQorJCEgY29tcGlsZSBlYWNoIGVsZW1lbnQgb2YgdGhlIHNwYWNlLWRlbGltaXRlZCBsaXN0ICdvZmlsZXMnCiskIQorJGRvX29maWxlczoKKyQgb2ZpbGVzID0gZiRlZGl0KG9maWxlcywiQ09NUFJFU1MsVFJJTSIpCiskIGkgPSAwCiskb2xvb3A6CiskIGYgPSBmJGVsZW1lbnQoaSwiICIsb2ZpbGVzKQorJCBpZiBmLmVxcy4iICIgdGhlbiAgZ290byBvZG9uZQorJCBmID0gZiAtICIubyIJIXN0cmlwIGR1bW15IHN1ZmZpeAorJCBFQ0hPICIgICcnZiciCiskIHNraXBfZiA9IDAKKyQgaWYgcGFzcy5lcS4zIC5hbmQuIGYkc2VhcmNoKCInJ2YnLmMiKS5lcXMuIiIgdGhlbiAgZ29zdWIgY2hrX2RlZmZ1bmMKKyQgaWYgLm5vdC5za2lwX2YKKyQgdGhlbgorJCAgICdDQycgJ2YnLmMKKyQgICBMSUJSICdXT1JLX0xJQicgJ2YnLm9iaiAvSW5zZXJ0CiskICAgREVMRVRFICdmJy5vYmo7KgorJCBlbmRpZgorJCBpID0gaSArIDEKKyQgZ290byBvbG9vcAorJG9kb25lOgorJCByZXR1cm4KKyQKKyQhCiskISBjaGVjayBmdW5jdGlvbnMuZGVmIGZvciBhIERFRkZVTkMoKSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIG1pc3NpbmcgZmlsZSAnZicuYworJCEKKyRjaGtfZGVmZnVuYzoKKyQgZGVmaW5lL1VzZXIgc3lzJG91dHB1dCBfTkw6CiskIGRlZmluZS9Vc2VyIHN5cyRlcnJvciBfTkw6CiskIFNFQVJDSCBmdW5jdGlvbnMuZGVmICJERUZGVU5DIiwiJydmJyIgL01hdGNoPUFORAorJCBpZiAoKCRzdGF0dXMuYW5kLiV4N0ZGRkZGRkYpIC5lcS4gMSkKKyQgdGhlbgorJCAgIHNraXBfZiA9IDEKKyQgICBvcGVuL0FwcGVuZCBjb25maWdfaCBjb25maWcuaAorJCAgIHdyaXRlIGNvbmZpZ19oICIjZGVmaW5lIE5FRURfJydmJyIKKyQgICBjbG9zZSBjb25maWdfaAorJCBlbmRpZgorJCByZXR1cm4KKyQKKyQhCiskcGFzczJfZmFpbHVyZTE6CiskISBpZiB3ZSByZWFjaCBoZXJlLCBkdW1teS5jIGZhaWxlZCB0byBjb21waWxlIGFuZCB3ZSdyZSByZWFsbHkgc3R1Y2sKKyQgdHlwZSBzeXMkaW5wdXQ6CisKKyAgQ2Fubm90IGNvbXBpbGUgdGhlIGxpYnJhcnkgY29udGVudHMgY2hlY2tlciAoZHVtbXkuYyArIGZ1bmN0aW9ucy5kZWYpLAorICBzbyBjYW5ub3QgY29udGludWUhCisKKyQhIGF0dGVtcHQgdGhlIGNvbXBpbGUgYWdhaW4sIHdpdGhvdXQgc3VwcHJlc3NpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGlzIHRpbWUKKyQgb24gZXJyb3IgdGhlbiBBQk9SVCArMCpmJHZlcmlmeSh2KQorJCB2ID0gZiR2ZXJpZnkoMSkKKyQgJ0NDJyBkdW1teS5jCiskIEFCT1JUICswKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCiskIQorJHBhc3MyX2ZhaWx1cmUyOgorJCEgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuLgorJCB0eXBlIHN5cyRpbnB1dDoKKworICBDYW5ub3QgbGluayB0aGUgbGlicmFyeSBjb250ZW50cyBjaGVja2VyIChkdW1teS5vYmopLCBzbyBjYW5ub3QgY29udGludWUhCisKKyQhIGF0dGVtcHQgdGhlIGxpbmsgYWdhaW4sIHdpdGhvdXQgc3VwcHJlc3NpbmcgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGlzIHRpbWUKKyQgb24gZXJyb3IgdGhlbiBBQk9SVCArMCpmJHZlcmlmeSh2KQorJCB2ID0gZiR2ZXJpZnkoMSkKKyQgTElOSy9NYXA9ZHVtbXkubWFwL25vRXhlIGR1bW15Lm9iaiwnV09SS19MSUInL0xpYnIsLQorCWdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvTGlicixzeXMkbGlicmFyeTp2YXhjcnRsLm9sYi9MaWJyCiskIEFCT1JUICswKmYkdmVyaWZ5KHYpCSEnZiR2ZXJpZnkoMCknCiskCiskISBub3QgcmVhY2hlZAorJCBleGl0CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnByaW50Zi5jIGIvbGliaWJlcnR5L3ZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWI0MjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3ZwcmludGYuYwpAQCAtMCwwICsxLDE1IEBACisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI3VuZGVmIHZwcmludGYKK2ludAordnByaW50ZiAoZm9ybWF0LCBhcCkKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9saXN0IGFwOworeworICByZXR1cm4gdmZwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcCk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnNwcmludGYuYyBiL2xpYmliZXJ0eS92c3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDc2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpYmVydHkvdnNwcmludGYuYwpAQCAtMCwwICsxLDU1IEBACisvKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdnNwcmludGYgZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KKyAgIEhpZ2hseSBzeXN0ZW0tZGVwZW5kZW50LCBidXQgc2hvdWxkIHdvcmsgb24gbW9zdCAidHJhZGl0aW9uYWwiCisgICBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RkaW87IG5ld2VyIG9uZXMgc2hvdWxkIGFscmVhZHkgaGF2ZSB2c3ByaW50Zi4KKyAgIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgb2YgQ3lnbnVzIFN1cHBvcnQuCisgICBCYXNlZCBvbiBsaWJnKysncyAiZm9ybSIgKHdyaXR0ZW4gYnkgRG91ZyBMZWE7IGRsQHJvY2t5Lm9zd2Vnby5lZHUpLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCit0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK0FzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCitjb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQordGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQordGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gKi8KKworI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjdW5kZWYgdnNwcmludGYKKworaW50Cit2c3ByaW50ZiAoYnVmLCBmb3JtYXQsIGFwKQorICAgICBjaGFyICpidWY7CisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfbGlzdCBhcDsKK3sKKyAgRklMRSBiOworICBpbnQgcmV0OworI2lmZGVmIFZNUworICBiLT5fZmxhZyA9IF9JT1dSVHxfSU9TVFJHOworICBiLT5fcHRyID0gYnVmOworICBiLT5fY250ID0gMTIwMDA7CisjZWxzZQorICBiLl9mbGFnID0gX0lPV1JUfF9JT1NUUkc7CisgIGIuX3B0ciA9IGJ1ZjsKKyAgYi5fY250ID0gMTIwMDA7CisjZW5kaWYKKyAgcmV0ID0gX2RvcHJudChmb3JtYXQsIGFwLCAmYik7CisgIHB1dGMoJ1wwJywgJmIpOworICByZXR1cm4gcmV0OworCit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkvd2FpdHBpZC5jIGIvbGliaWJlcnR5L3dhaXRwaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2RiMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3dhaXRwaWQuYwpAQCAtMCwwICsxLDExIEBACitpbnQKK3dhaXRwaWQgKHBpZCwgc3RhdF9sb2MsIG9wdGlvbnMpCisJaW50IHBpZCwgKnN0YXRfbG9jLCBvcHRpb25zOworeworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCB3cGlkID0gd2FpdChzdGF0X2xvYyk7CisgICAgICBpZiAod3BpZCA9PSBwaWQgfHwgd3BpZCA9PSAtMSkKKwlyZXR1cm4gd3BpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkveGF0ZXhpdC5jIGIvbGliaWJlcnR5L3hhdGV4aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ3NmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3hhdGV4aXQuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogJXNjY3MuaW5jbHVkZS5yZWRpc3QuYyUKKyAqLworCisvKiBBZGFwdGVkIGZyb20gbmV3bGliL2xpYmMvc3RkbGliL3ssYXR9ZXhpdC5bY2hdLgorICAgSWYgeW91IHVzZSB4YXRleGl0LCB5b3UgbXVzdCBjYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4gICovCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZworI2VuZGlmCisKKy8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KK1BUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CisKK3N0YXRpYyB2b2lkIHhhdGV4aXRfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gcnVuIGJ5IHhleGl0LiAgKi8KK2V4dGVybiB2b2lkICgqX3hleGl0X2NsZWFudXApIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZQlYQVRFWElUX1NJWkUgMzIKKworc3RydWN0IHhhdGV4aXQgeworCXN0cnVjdAl4YXRleGl0ICpuZXh0OwkJLyogbmV4dCBpbiBsaXN0ICovCisJaW50CWluZDsJCQkvKiBuZXh0IGluZGV4IGluIHRoaXMgdGFibGUgKi8KKwl2b2lkCSgqZm5zW1hBVEVYSVRfU0laRV0pIFBBUkFNUyAoKHZvaWQpKTsJLyogdGhlIHRhYmxlIGl0c2VsZiAqLworfTsKKworLyogQWxsb2NhdGUgb25lIHN0cnVjdCBzdGF0aWNhbGx5IHRvIGd1YXJhbnRlZSB0aGF0IHdlIGNhbiByZWdpc3RlcgorICAgYXQgbGVhc3QgYSBmZXcgaGFuZGxlcnMuICAqLworc3RhdGljIHN0cnVjdCB4YXRleGl0IHhhdGV4aXRfZmlyc3Q7CisKKy8qIFBvaW50cyB0byBoZWFkIG9mIExJRk8gc3RhY2suICAqLworc3RhdGljIHN0cnVjdCB4YXRleGl0ICp4YXRleGl0X2hlYWQgPSAmeGF0ZXhpdF9maXJzdDsKKworLyogUmVnaXN0ZXIgZnVuY3Rpb24gRk4gdG8gYmUgcnVuIGJ5IHhleGl0LgorICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LiAgKi8KKworaW50Cit4YXRleGl0IChmbikKKyAgICAgdm9pZCAoKmZuKSBQQVJBTVMgKCh2b2lkKSk7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOworCisgIC8qIFRlbGwgeGV4aXQgdG8gY2FsbCB4YXRleGl0X2NsZWFudXAuICAqLworICBpZiAoIV94ZXhpdF9jbGVhbnVwKQorICAgIF94ZXhpdF9jbGVhbnVwID0geGF0ZXhpdF9jbGVhbnVwOworCisgIHAgPSB4YXRleGl0X2hlYWQ7CisgIGlmIChwLT5pbmQgPj0gWEFURVhJVF9TSVpFKQorICAgIHsKKyAgICAgIGlmICgocCA9IChzdHJ1Y3QgeGF0ZXhpdCAqKSBtYWxsb2MgKHNpemVvZiAqcCkpID09IE5VTEwpCisJcmV0dXJuIC0xOworICAgICAgcC0+aW5kID0gMDsKKyAgICAgIHAtPm5leHQgPSB4YXRleGl0X2hlYWQ7CisgICAgICB4YXRleGl0X2hlYWQgPSBwOworICAgIH0KKyAgcC0+Zm5zW3AtPmluZCsrXSA9IGZuOworICByZXR1cm4gMDsKK30KKworLyogQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAoreGF0ZXhpdF9jbGVhbnVwICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOworICByZWdpc3RlciBpbnQgbjsKKworICBmb3IgKHAgPSB4YXRleGl0X2hlYWQ7IHA7IHAgPSBwLT5uZXh0KQorICAgIGZvciAobiA9IHAtPmluZDsgLS1uID49IDA7KQorICAgICAgKCpwLT5mbnNbbl0pICgpOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hleGl0LmMgYi9saWJpYmVydHkveGV4aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFiYmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3hleGl0LmMKQEAgLTAsMCArMSwzNiBAQAorLyogeGV4aXQuYyAtLSBSdW4gYW55IGV4aXQgaGFuZGxlcnMsIHRoZW4gZXhpdC4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KK0xpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZQordG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IHhhdGV4aXQgaWYgaXQgaXMgY2FsbGVkLiAgVGhpcyB3YXksIHhtYWxsb2MKKyAgIGRvZXNuJ3QgZHJhZyB4YXRleGl0IGludG8gdGhlIGxpbmsuICAqLwordm9pZCAoKl94ZXhpdF9jbGVhbnVwKSBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQKK3hleGl0IChjb2RlKQorICAgICBpbnQgY29kZTsKK3sKKyAgaWYgKF94ZXhpdF9jbGVhbnVwICE9IE5VTEwpCisgICAgKCpfeGV4aXRfY2xlYW51cCkgKCk7CisgIGV4aXQgKGNvZGUpOworfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3htYWxsb2MuYyBiL2xpYmliZXJ0eS94bWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4Mzc5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmliZXJ0eS94bWFsbG9jLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHdpdGggZXJyb3IgY2hlY2tpbmcuCisgICBDb3B5cmlnaHQgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCitMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0xpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgX19TVERDX18KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCisjZGVmaW5lIHB0cmRpZmZfdCBsb25nCisjZW5kaWYKKworI2lmIFZNUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXhsaWIuaD4KKyNlbHNlCisvKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoZXNlIG11c3QgYmUgZGVjbGFyZWQuICAqLworUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKK1BUUiByZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7CitQVFIgY2FsbG9jIFBBUkFNUyAoKHNpemVfdCwgc2l6ZV90KSk7CitQVFIgc2JyayBQQVJBTVMgKChwdHJkaWZmX3QpKTsKKyNlbmRpZgorCisvKiBUaGUgcHJvZ3JhbSBuYW1lIGlmIHNldC4gICovCitzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICIiOworCisjaWYgIWRlZmluZWQgKF9fQ1lHV0lOX18pICYmIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKKyNkZWZpbmUgX19DWUdXSU5fXyAxCisjZW5kaWYKKworI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX1VXSU5fXykKKy8qIFRoZSBpbml0aWFsIHNicmssIHNldCB3aGVuIHRoZSBwcm9ncmFtIG5hbWUgaXMgc2V0LiBOb3QgdXNlZCBmb3Igd2luMzIKKyAgIHBvcnRzIG90aGVyIHRoYW4gY3lnd2luMzIuICAqLworc3RhdGljIGNoYXIgKmZpcnN0X2JyZWFrID0gTlVMTDsKKyNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyB8fCBfX1VXSU5fXyAqLworCit2b2lkCit4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHMpCisgICAgIGNvbnN0IGNoYXIgKnM7Cit7CisgIG5hbWUgPSBzOworI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX1VXSU5fXykKKyAgLyogV2luMzIgcG9ydHMgb3RoZXIgdGhhbiBjeWd3aW4zMiBkb24ndCBoYXZlIGJyaygpICovCisgIGlmIChmaXJzdF9icmVhayA9PSBOVUxMKQorICAgIGZpcnN0X2JyZWFrID0gKGNoYXIgKikgc2JyayAoMCk7CisjZW5kaWYgLyogISBfV0lOMzIgfHwgX19DWUdXSU4gX18gfHwgX19VV0lOX18gKi8KK30KKworUFRSCit4bWFsbG9jIChzaXplKQorICAgIHNpemVfdCBzaXplOworeworICBQVFIgbmV3bWVtOworCisgIGlmIChzaXplID09IDApCisgICAgc2l6ZSA9IDE7CisgIG5ld21lbSA9IG1hbGxvYyAoc2l6ZSk7CisgIGlmICghbmV3bWVtKQorICAgIHsKKyNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19VV0lOX18pCisgICAgICBleHRlcm4gY2hhciAqKmVudmlyb247CisgICAgICBzaXplX3QgYWxsb2NhdGVkOworCisgICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKKwlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOworICAgICAgZWxzZQorCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKKwkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKKyNlbHNlCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplKTsKKyNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyB8fCBfX1VXSU5fXyAqLworICAgICAgeGV4aXQgKDEpOworICAgIH0KKyAgcmV0dXJuIChuZXdtZW0pOworfQorCitQVFIKK3hjYWxsb2MgKG5lbGVtLCBlbHNpemUpCisgIHNpemVfdCBuZWxlbSwgZWxzaXplOworeworICBQVFIgbmV3bWVtOworCisgIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQorICAgIG5lbGVtID0gZWxzaXplID0gMTsKKworICBuZXdtZW0gPSBjYWxsb2MgKG5lbGVtLCBlbHNpemUpOworICBpZiAoIW5ld21lbSkKKyAgICB7CisjaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCisgICAgICBleHRlcm4gY2hhciAqKmVudmlyb247CisgICAgICBzaXplX3QgYWxsb2NhdGVkOworCisgICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKKwlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOworICAgICAgZWxzZQorCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKKwkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSAobmVsZW0gKiBlbHNpemUpLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKKyNlbHNlCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IGFsbG9jYXRlICVsdSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAobmVsZW0gKiBlbHNpemUpKTsKKyNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyAqLworICAgICAgeGV4aXQgKDEpOworICAgIH0KKyAgcmV0dXJuIChuZXdtZW0pOworfQorCitQVFIKK3hyZWFsbG9jIChvbGRtZW0sIHNpemUpCisgICAgUFRSIG9sZG1lbTsKKyAgICBzaXplX3Qgc2l6ZTsKK3sKKyAgUFRSIG5ld21lbTsKKworICBpZiAoc2l6ZSA9PSAwKQorICAgIHNpemUgPSAxOworICBpZiAoIW9sZG1lbSkKKyAgICBuZXdtZW0gPSBtYWxsb2MgKHNpemUpOworICBlbHNlCisgICAgbmV3bWVtID0gcmVhbGxvYyAob2xkbWVtLCBzaXplKTsKKyAgaWYgKCFuZXdtZW0pCisgICAgeworI2lmbmRlZiBfX01JTkdXMzJfXworICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKKworICAgICAgaWYgKGZpcnN0X2JyZWFrICE9IE5VTEwpCisJYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSBmaXJzdF9icmVhazsKKyAgICAgIGVsc2UKKwlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIChjaGFyICopICZlbnZpcm9uOworICAgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAiXG4lcyVzQ2FuIG5vdCByZWFsbG9jYXRlICVsdSBieXRlcyBhZnRlciBhbGxvY2F0aW5nICVsdSBieXRlc1xuIiwKKwkgICAgICAgbmFtZSwgKm5hbWUgPyAiOiAiIDogIiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplLCAodW5zaWduZWQgbG9uZykgYWxsb2NhdGVkKTsKKyNlbHNlCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICJcbiVzJXNDYW4gbm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOworI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCisgICAgICB4ZXhpdCAoMSk7CisgICAgfQorICByZXR1cm4gKG5ld21lbSk7Cit9CmRpZmYgLS1naXQgYS9saWJpYmVydHkveHN0cmR1cC5jIGIvbGliaWJlcnR5L3hzdHJkdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZhYmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3hzdHJkdXAuYwpAQCAtMCwwICsxLDIyIEBACisvKiB4c3RyZHVwLmMgLS0gRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeSwgdXNpbmcgeG1hbGxvYy4KKyAgIFRoaXMgdHJpdmlhbCBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBEZWNlbWJlciAxOTk1LiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKK2NoYXIgKgoreHN0cmR1cCAocykKKyAgY29uc3QgY2hhciAqczsKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IGxlbiA9IHN0cmxlbiAocykgKyAxOworICByZWdpc3RlciBjaGFyICpyZXQgPSB4bWFsbG9jIChsZW4pOworICBtZW1jcHkgKHJldCwgcywgbGVuKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYyBiL2xpYmliZXJ0eS94c3RyZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBiNjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliaWJlcnR5L3hzdHJlcnJvci5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHhzdHJlcnJvci5jIC0tIGphY2tldCByb3V0aW5lIGZvciBtb3JlIHJvYnVzdCBzdHJlcnJvcigpIHVzYWdlLgorICAgRnJpIEp1biAxNiAxODozMDowMCAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KKyAgIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZmRlZiBWTVMKKyNpbmNsdWRlIDxlcnJuby5oPgorI2lmICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pICYmICFkZWZpbmVkIChfX0hJREVfRk9SQklEREVOX05BTUVTKQorZXh0ZXJuIGNoYXIgKnN0cmVycm9yIFBBUkFNUyAoKGludCwuLi4pKTsKKyNkZWZpbmUgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCisjZW5kaWYKKyNlbmRpZgkvKiBWTVMgKi8KKworI2lmbmRlZiBET05UX0RFQ0xBUkVfU1RSRVJST1IKK2V4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCisvKiBJZiBzdHJlcnJvciByZXR1cm5zIE5VTEwsIHdlJ2xsIGZvcm1hdCB0aGUgbnVtYmVyIGludG8gYSBzdGF0aWMgYnVmZmVyLiAgKi8KKworI2RlZmluZSBFUlJTVFJfRk1UICJ1bmRvY3VtZW50ZWQgZXJyb3IgIyVkIgorc3RhdGljIGNoYXIgeHN0cmVycm9yX2J1ZltzaXplb2YgRVJSU1RSX0ZNVCArIDIwXTsKKworLyogTGlrZSBzdHJlcnJvciwgYnV0IHJlc3VsdCBpcyBuZXZlciBhIG51bGwgcG9pbnRlci4gICovCisKK2NoYXIgKgoreHN0cmVycm9yIChlcnJudW0pCisgICAgIGludCBlcnJudW07Cit7CisgIGNoYXIgKmVycnN0cjsKKyNpZmRlZiBWTVMKKyAgY2hhciAqKCp2bXNsaWJfc3RyZXJyb3IpIFBBUkFNUyAoKGludCwuLi4pKTsKKworICAvKiBPdmVycmlkZSBhbnkgcG9zc2libHktY29uZmxpY3RpbmcgZGVjbGFyYXRpb24gZnJvbSBzeXN0ZW0gaGVhZGVyLiAgKi8KKyAgdm1zbGliX3N0cmVycm9yID0gKGNoYXIgKigqKSBQQVJBTVMgKChpbnQsLi4uKSkpIHN0cmVycm9yOworICAvKiBTZWNvbmQgYXJndW1lbnQgbWF0dGVycyBpZmYgZmlyc3QgaXMgRVZNU0VSUiwgYnV0IGl0J3Mgc2ltcGxlciB0bworICAgICBwYXNzIGl0IHVuY29uZGl0aW9uYWxseS4gIGB2YXhjJGVycm5vJyBpcyBkZWNsYXJlZCBpbiA8ZXJybm8uaD4KKyAgICAgYW5kIG1haW50YWluZWQgYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnkgaW4gcGFyYWxsZWwgdG8gYGVycm5vJy4KKyAgICAgV2UgYXNzdW1lIHRoYXQgYGVycm51bScgY29ycmVzcG9uZHMgdG8gdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgdG8KKyAgICAgZXJybm8gYnkgdGhlIHJ1bi10aW1lIGxpYnJhcnksIGhlbmNlIHZheGMkZXJybm8gd2lsbCBiZSByZWxldmFudC4gICovCisgIGVycnN0ciA9ICgqdm1zbGliX3N0cmVycm9yKSAoZXJybnVtLCB2YXhjJGVycm5vKTsKKyNlbHNlCisgIGVycnN0ciA9IHN0cmVycm9yIChlcnJudW0pOworI2VuZGlmCisKKyAgLyogSWYgYGVycm51bScgaXMgb3V0IG9mIHJhbmdlLCByZXN1bHQgbWlnaHQgYmUgTlVMTC4gIFdlJ2xsIGZpeCB0aGF0LiAgKi8KKyAgaWYgKCFlcnJzdHIpCisgICAgeworICAgICAgc3ByaW50ZiAoeHN0cmVycm9yX2J1ZiwgRVJSU1RSX0ZNVCwgZXJybnVtKTsKKyAgICAgIGVycnN0ciA9IHhzdHJlcnJvcl9idWY7CisgICAgfQorICByZXR1cm4gZXJyc3RyOworfQpkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYjMwNGZkCi0tLSAvZGV2L251bGwKKysrIGIvbHRjb25maWcKQEAgLTAsMCArMSwyODIyIEBACisjISAvYmluL3NoCisKKyMgbHRjb25maWcgLSBDcmVhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbC4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQSBsb3Qgb2YgdGhpcyBzY3JpcHQgaXMgdGFrZW4gZnJvbSBhdXRvY29uZi0yLjEwLgorCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorZWNobz1lY2hvCitpZiB0ZXN0ICJYJDEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAwCitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorICBleGVjICIkU0hFTEwiICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CitmaQorCisjIEZpbmQgdGhlIGNvcnJlY3QgUEFUSCBzZXBhcmF0b3IuICBVc3VhbGx5IHRoaXMgaXMgYDonLCBidXQKKyMgREpHUFAgdXNlcyBgOycgbGlrZSBET1MuCitpZiB0ZXN0ICJYJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSAiWHNldCI7IHRoZW4KKyAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQorICBjYXNlIFgkVU5BTUUgaW4KKyAgICAqLURPUykgUEFUSF9TRVBBUkFUT1I9JzsnIDs7CisgICAgKikgICAgIFBBVEhfU0VQQVJBVE9SPSc6JyA7OworICBlc2FjCitmaQorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSAiWHNldCI7IHRoZW4KKyAgIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KKyAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsICYmCisgICAgICAgZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiICYmCisgICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiAhPSAnWFx0JyB8fAorICAgdGVzdCAiWGAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiAhPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKKyAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZworICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJworICAjCisgICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KKworICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKKyAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KKyAgICBpZiB0ZXN0IC1mICRkaXIvZWNobyAmJgorICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICB0ZXN0ICJYYCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCisgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgdGVzdCAiWGAocHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgorICAgICAgZWNobz0ncHJpbnQgLXInCisgICAgZWxpZiB0ZXN0IC1mIC9iaW4va3NoICYmIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGx0Y29uZmlnIGFnYWluIHdpdGggaXQuCisgICAgICBPUklHSU5BTF9DT05GSUdfU0hFTEw9IiR7Q09ORklHX1NIRUxMLS9iaW4vc2h9IgorICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAorICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCisgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorICAgIGVsc2UKKyAgICAgICMgVHJ5IHVzaW5nIHByaW50Zi4KKyAgICAgIGVjaG89J3ByaW50ZiAiJXNcbiInCisgICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKwkgdGVzdCAiWGAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJIyBDb29sLCBwcmludGYgd29ya3MKKwk6CisgICAgICBlbGlmIHRlc3QgIlhgKCIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKwkgICB0ZXN0ICJYYCgiJE9SSUdJTkFMX0NPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgIiA9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJQ09ORklHX1NIRUxMPSIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIgorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwlTSEVMTD0iJENPTkZJR19TSEVMTCIKKwlleHBvcnQgU0hFTEwKKwllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsaWYgdGVzdCAiWGAoIiRDT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSAgIHRlc3QgIlhgKCIkQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsc2UKKwkjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgorCXByZXY9OgorCisJZm9yIGNtZCBpbiAnZWNobyB0ZXN0JyAnc2VkIDJxICIkMCInICdzZWQgMTBxICIkMCInICdzZWQgMjBxICIkMCInICdzZWQgNTBxICIkMCInOyBkbworCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGw7IHRoZW4KKwkgICAgYnJlYWsKKwkgIGZpCisJICBwcmV2PSIkY21kIgorCWRvbmUKKworCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiJDAiJzsgdGhlbgorCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKKwkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCisJICBleGVjICIke09SSUdJTkFMX0NPTkZJR19TSEVMTH0iICIkMCIgJHsxKyIkQCJ9CisJZWxzZQorCSAgIyBPb3BzLiAgV2UgbG9zdCBjb21wbGV0ZWx5LCBzbyBqdXN0IHN0aWNrIHdpdGggZWNoby4KKwkgIGVjaG89ZWNobworCWZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitmaQorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIHMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGAkXFxcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCitwcm9nbmFtZT1gJGVjaG8gIlgkMCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisjIENvbnN0YW50czoKK1BST0dSQU09bHRjb25maWcKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0xLjJmCitUSU1FU1RBTVA9IiAoMS4zODUgMTk5OS8wMy8xNSAxNzoyNDo1NCkiCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC5jIDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC5jICRMSUJTIDE+JjUnCitybT0icm0gLWYiCisKK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBHbG9iYWwgdmFyaWFibGVzOgorZGVmYXVsdF9vZmlsZT1saWJ0b29sCitjYW5fYnVpbGRfc2hhcmVkPXllcworZW5hYmxlX3NoYXJlZD15ZXMKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcuCitlbmFibGVfc3RhdGljPXllcworZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKK2VuYWJsZV9kbG9wZW49dW5rbm93bgorbHRtYWluPQorc2lsZW50PQorc3JjZGlyPQorYWNfY29uZmlnX2d1ZXNzPQorYWNfY29uZmlnX3N1Yj0KK2hvc3Q9Citub25vcHQ9CitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit2ZXJpZnlfaG9zdD15ZXMKK3dpdGhfZ2NjPW5vCit3aXRoX2dudV9sZD1ubworbmVlZF9sb2Nrcz15ZXMKK2FjX2V4dD1jCitvYmpleHQ9bworbGliZXh0PWEKK2NhY2hlX2ZpbGU9CisKK29sZF9BUj0iJEFSIgorb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorb2xkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCitvbGRfTEQ9IiRMRCIKK29sZF9MTl9TPSIkTE5fUyIKK29sZF9OTT0iJE5NIgorb2xkX1JBTkxJQj0iJFJBTkxJQiIKK29sZF9ETExUT09MPSIkRExMVE9PTCIKK29sZF9BUz0iJEFTIgorCisjIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KK2FyZ3M9CitwcmV2PQorZm9yIG9wdGlvbgorZG8KKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLSo9Kikgb3B0YXJnPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIG9wdGFyZz0gOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICBldmFsICIkcHJldj1cJG9wdGlvbiIKKyAgICBwcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLS1oZWxwKSBjYXQgPDxFT00KK1VzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gW0hPU1QgW0xUTUFJTl1dCisKK0dlbmVyYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wgc2NyaXB0LgorCisgICAgLS1kZWJ1ZyAgICAgICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCisgICAgLS1kaXNhYmxlLXNoYXJlZCAgICAgICBkbyBub3QgYnVpbGQgc2hhcmVkIGxpYnJhcmllcworICAgIC0tZGlzYWJsZS1zdGF0aWMgICAgICAgZG8gbm90IGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMKKyAgICAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIGRvIG5vdCBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24KKyAgICAtLWVuYWJsZS1kbG9wZW4gICAgICAgIGVuYWJsZSBkbG9wZW4gc3VwcG9ydAorICAgIC0tZW5hYmxlLWRsb3Blbi1zZWxmICAgZW5hYmxlIHN1cHBvcnQgZm9yIGRsb3BlbmluZyBwcm9ncmFtcworICAgIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAtLW5vLXZlcmlmeSAgICAgICAgICAgIGRvIG5vdCB2ZXJpZnkgdGhhdCBIT1NUIGlzIGEgdmFsaWQgaG9zdCB0eXBlCistbywgLS1vdXRwdXQ9RklMRSAgICAgICAgICBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBbZGVmYXVsdD0kZGVmYXVsdF9vZmlsZV0KKyAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKKyAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKKyAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCisgICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCisgICAgLS1kaXNhYmxlLWxvY2sgICAgICAgICBkaXNhYmxlIGZpbGUgbG9ja2luZworICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgY29uZmlndXJlIGNhY2hlIGZpbGUKKworTFRNQUlOIGlzIHRoZSBcYGx0bWFpbi5zaCcgc2hlbGwgc2NyaXB0IGZyYWdtZW50IG9yIFxgbHRtYWluLmMnIHByb2dyYW0KK3RoYXQgcHJvdmlkZXMgYmFzaWMgbGlidG9vbCBmdW5jdGlvbmFsaXR5LgorCitIT1NUIGlzIHRoZSBjYW5vbmljYWwgaG9zdCBzeXN0ZW0gbmFtZSBbZGVmYXVsdD1ndWVzc2VkXS4KK0VPTQorICBleGl0IDAKKyAgOzsKKworICAtLWRlYnVnKQorICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKyAgICBzZXQgLXgKKyAgICA7OworCisgIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKworICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7CisKKyAgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCkgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworCisgIC0tZW5hYmxlLWRsb3BlbikgZW5hYmxlX2Rsb3Blbj15ZXMgOzsKKworICAtLXF1aWV0IHwgLS1zaWxlbnQpIHNpbGVudD15ZXMgOzsKKworICAtLXNyY2RpcikgcHJldj1zcmNkaXIgOzsKKyAgLS1zcmNkaXI9Kikgc3JjZGlyPSIkb3B0YXJnIiA7OworCisgIC0tbm8tdmVyaWZ5KSB2ZXJpZnlfaG9zdD1ubyA7OworCisgIC0tb3V0cHV0IHwgLW8pIHByZXY9b2ZpbGUgOzsKKyAgLS1vdXRwdXQ9Kikgb2ZpbGU9IiRvcHRhcmciIDs7CisKKyAgLS12ZXJzaW9uKSBlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAiOyBleGl0IDAgOzsKKworICAtLXdpdGgtZ2NjKSB3aXRoX2djYz15ZXMgOzsKKyAgLS13aXRoLWdudS1sZCkgd2l0aF9nbnVfbGQ9eWVzIDs7CisKKyAgLS1kaXNhYmxlLWxvY2spIG5lZWRfbG9ja3M9bm8gOzsKKworICAtLWNhY2hlLWZpbGU9KikgY2FjaGVfZmlsZT0iJG9wdGFyZyIgOzsKKworICAtKikKKyAgICBlY2hvICIkcHJvZ25hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIgMT4mMgorICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCisgICAgICBsdG1haW49IiRvcHRpb24iCisgICAgZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KKyMgVGhpcyBnZW5lcmF0ZXMgYW4gdW5uZWNlc3Nhcnkgd2FybmluZyBmb3Igc3BhcmMtc3VuLXNvbGFyaXM0LjEuM19VMQorIyAgICAgIGlmIHRlc3QgLW4gImBlY2hvICRvcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisjICAgICAgICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmcgXGAkb3B0aW9uJyBpcyBub3QgYSB2YWxpZCBob3N0IHR5cGUiIDE+JjIKKyMgICAgICBmaQorICAgICAgaG9zdD0iJG9wdGlvbiIKKyAgICBlbHNlCisgICAgICBlY2hvICIkcHJvZ25hbWU6IHRvbyBtYW55IGFyZ3VtZW50cyIgMT4mMgorICAgICAgZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KKyAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTFRNQUlOIGZpbGUiIDE+JjIKKyAgZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0ICEgLWYgIiRsdG1haW4iOyB0aGVuCisgIGVjaG8gIiRwcm9nbmFtZTogXGAkbHRtYWluJyBkb2VzIG5vdCBleGlzdCIgMT4mMgorICBlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgUXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2x0Y29uZmlnX2FyZ3M9Citmb3IgYXJnCitkbworICBjYXNlICIkYXJnIiBpbgorICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAnJGFyZyciIDs7CisgICopIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICRhcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBBIHJlbGV2YW50IHN1YnNldCBvZiBBQ19JTklULgorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Pi4vY29uZmlnLmxvZworCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgorIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKKyMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCisKK2lmIHRlc3QgLW4gIiRjYWNoZV9maWxlIiAmJiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSB3aXRoaW4gbHRjb25maWciCisgIC4gJGNhY2hlX2ZpbGUKK2ZpCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgICMgQXNzdW1lIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIG9uZSBhcyB0aGUgcGF0aCB0byBMVE1BSU4uCisgIHNyY2Rpcj1gJGVjaG8gIlgkbHRtYWluIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgIHRlc3QgIiRzcmNkaXIiID0gIiRsdG1haW4iICYmIHNyY2Rpcj0uCitmaQorCit0cmFwICIkcm0gY29uZnRlc3QqOyBleGl0IDEiIDEgMiAxNQoraWYgdGVzdCAiJHZlcmlmeV9ob3N0IiA9IHllczsgdGhlbgorICAjIENoZWNrIGZvciBjb25maWcuZ3Vlc3MgYW5kIGNvbmZpZy5zdWIuCisgIGFjX2F1eF9kaXI9CisgIGZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyL2NvbmZpZy5ndWVzczsgdGhlbgorICAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZmluZCBjb25maWcuZ3Vlc3MgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjIKKyAgICBlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorICBhY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCisgIGFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorCisgICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyAgaWYgJFNIRUxMICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMgorICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CisKKyAgaG9zdF9hbGlhcz0kaG9zdAorICBjYXNlICIkaG9zdF9hbGlhcyIgaW4KKyAgIiIpCisgICAgaWYgaG9zdF9hbGlhcz1gJFNIRUxMICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlCisgICAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyCisgICAgICBlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkgOzsKKyAgZXNhYworICBob3N0PWAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCisgIGVjaG8gIiRhY190JGhvc3QiIDE+JjYKKworICAjIE1ha2Ugc3VyZSB0aGUgaG9zdCB2ZXJpZmllZC4KKyAgdGVzdCAteiAiJGhvc3QiICYmIGV4aXQgMQorCitlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgorICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBob3N0IHR5cGUgaWYgeW91IHVzZSBcYC0tbm8tdmVyaWZ5JyIgMT4mMgorICBlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2Vsc2UKKyAgaG9zdF9hbGlhcz0kaG9zdAorZmkKKworIyBUcmFuc2Zvcm0gbGludXgqIHRvICotKi1saW51eC1nbnUqLCB0byBzdXBwb3J0IG9sZCBjb25maWd1cmUgc2NyaXB0cy4KK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgtZ251KikgOzsKK2xpbnV4KikgaG9zdD1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKi0uKi1saW51eFwpXCguKlwpJC9cMS1nbnVcMi8nYAorZXNhYworCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKworY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSIGNydSAkb2xkbGliJG9sZG9ianMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCisjIFNldCBhIHNhbmUgZGVmYXVsdCBmb3IgYEFSJy4KK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKKworIyBJZiBSQU5MSUIgaXMgbm90IHNldCwgdGhlbiBydW4gdGhlIHRlc3QuCitpZiB0ZXN0ICIke1JBTkxJQitzZXR9IiAhPSAic2V0IjsgdGhlbgorICByZXN1bHQ9bm8KKworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmFubGliLi4uICRhY19jIiAxPiY2CisgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgorICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgaWYgdGVzdCAtZiAkZGlyL3JhbmxpYjsgdGhlbgorICAgICAgUkFOTElCPSJyYW5saWIiCisgICAgICByZXN1bHQ9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICBlY2hvICIkYWNfdCRyZXN1bHQiIDE+JjYKK2ZpCisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorZmkKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgYERMTFRPT0wnIGFuZCBgQVMnLCB1c2VkIG9uIGN5Z3dpbi4KK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKKworIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHVzaW5nIEdDQy4KK2lmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzIHx8IHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBJZiBDQyBpcyBub3Qgc2V0LCB0aGVuIHRyeSB0byBmaW5kIEdDQyBvciBhIHVzYWJsZSBDQy4KKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnY2MuLi4gJGFjX2MiIDE+JjYKKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKKyAgICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgorICAgICAgaWYgdGVzdCAtZiAkZGlyL2djYzsgdGhlbgorCUNDPSJnY2MiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJHNhdmVfaWZzIgorCisgICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgICAgZmkKKyAgZmkKKworICAjIE5vdCAiZ2NjIiwgc28gdHJ5ICJjYyIsIHJlamVjdGluZyAiL3Vzci91Y2IvY2MiLgorICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNjLi4uICRhY19jIiAxPiY2CisgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCisgICAgY2NfcmVqZWN0ZWQ9bm8KKyAgICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KKyAgICAgIGlmIHRlc3QgLWYgJGRpci9jYzsgdGhlbgorCWlmIHRlc3QgIiRkaXIvY2MiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorCSAgY2NfcmVqZWN0ZWQ9eWVzCisJICBjb250aW51ZQorCWZpCisJQ0M9ImNjIgorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICBpZiB0ZXN0ICRjY19yZWplY3RlZCA9IHllczsgdGhlbgorICAgICAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICAgICAgc2V0IGR1bW15ICRDQworICAgICAgc2hpZnQKKyAgICAgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKwkjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKwkjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKwkjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorCXNoaWZ0CisJc2V0IGR1bW15ICIkZGlyL2NjIiAiJEAiCisJc2hpZnQKKwlDQz0iJEAiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgc2VlIGlmIHRoZSBjb21waWxlciBpcyByZWFsbHkgR0NDLgorICB3aXRoX2djYz1ubworICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQy4uLiAkYWNfYyIgMT4mNgorICBlY2hvICIkcHJvZ25hbWU6NTY0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CisKKyAgJHJtIGNvbmZ0ZXN0LmMKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCisgIGlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1NzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIHdpdGhfZ2NjPXllcworICBmaQorICAkcm0gY29uZnRlc3QuYworICBlY2hvICIkYWNfdCR3aXRoX2djYyIgMT4mNgorZmkKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK3NldCBkdW1teSAkQ0MKK2NvbXBpbGVyPSIkMiIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9iamVjdCBzdWZmaXguLi4gJGFjX2MiIDE+JjYKKyRybSBjb25mdGVzdCoKK2VjaG8gJ2ludCBpID0gMTsnID4gY29uZnRlc3QuYworZWNobyAiJHByb2duYW1lOjU4NjogY2hlY2tpbmcgZm9yIG9iamVjdCBzdWZmaXgiID4mIDUKK2lmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfTsgdGhlbgorICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCisgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lio7IGRvCisgICAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouYykgOzsKKyAgICAqKSBvYmpleHQ9YGVjaG8gJGFjX2ZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC4vL2AgOzsKKyAgICBlc2FjCisgIGRvbmUKK2Vsc2UKKyAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC5jID4mNQorZmkKKyRybSBjb25mdGVzdCoKK2VjaG8gIiRhY190JG9iamV4dCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQy4uLiAkYWNfYyIgMT4mNgorcGljX2ZsYWc9CitzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Cit3bD0KK2xpbmtfc3RhdGljX2ZsYWc9Citub19idWlsdGluX2ZsYWc9CisKK2lmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgd2w9Jy1XbCwnCisgIGxpbmtfc3RhdGljX2ZsYWc9Jy1zdGF0aWMnCisKKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KikKKyAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICA7OworICBhaXgqKQorICAgICMgQmVsb3cgdGhlcmUgaXMgYSBkaXJ0eSBoYWNrIHRvIGZvcmNlIG5vcm1hbCBzdGF0aWMgbGlua2luZyB3aXRoIC1sZGwKKyAgICAjIFRoZSBwcm9ibGVtIGlzIGJlY2F1c2UgbGliZGwgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggYm90aCBsaWJjIGFuZAorICAgICMgbGliQyAoQUlYIEMrKyBsaWJyYXJ5KSwgd2hpY2ggb2J2aW91c2x5IGRvZXNuJ3QgaW5jbHVkZWQgaW4gbGlicmFyaWVzCisgICAgIyBsaXN0IGJ5IGdjYy4gVGhpcyBjYXVzZSB1bmRlZmluZWQgc3ltYm9scyB3aXRoIC1zdGF0aWMgZmxhZ3MuCisgICAgIyBUaGlzIGhhY2sgYWxsb3dzIEMgcHJvZ3JhbXMgdG8gYmUgbGlua2VkIHdpdGggIi1zdGF0aWMgLWxkbCIsIGJ1dAorICAgICMgd2Ugbm90IHN1cmUgYWJvdXQgQysrIHByb2dyYW1zLgorICAgIGxpbmtfc3RhdGljX2ZsYWc9IiRsaW5rX3N0YXRpY19mbGFnICR7d2x9LWxDIgorICAgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBvczIqKQorICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgorICAgIDs7CisgIGFtaWdhb3MqKQorICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgIHBpY19mbGFnPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgOzsKKyAgKikKKyAgICBwaWNfZmxhZz0nLWZQSUMnCisgICAgOzsKKyAgZXNhYworZWxzZQorICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyogfCBhaXg0KikKKyAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgIDs7CisKKyAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsaW5rX3N0YXRpY19mbGFnIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICB3bD0nLVdsLCcKKyAgICBsaW5rX3N0YXRpY19mbGFnPSIke3dsfS1hICR7d2x9YXJjaGl2ZSIKKyAgICBwaWNfZmxhZz0nK1onCisgICAgOzsKKworICBpcml4NSogfCBpcml4NiopCisgICAgd2w9Jy1XbCwnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCisgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCisgICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCisgICAgOzsKKworICBvc2YzKiB8IG9zZjQqKQorICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgIHdsPSctV2wsJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJworICAgIDs7CisKKyAgc2NvMy4ydjUqKQorICAgIHBpY19mbGFnPSctS3BpYycKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctZG4nCisgICAgc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPSctYmVsZicKKyAgICA7OworCisgIHNvbGFyaXMqKQorICAgIHBpY19mbGFnPSctS1BJQycKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKKyAgICB3bD0nLVdsLCcKKyAgICA7OworCisgIHN1bm9zNCopCisgICAgcGljX2ZsYWc9Jy1QSUMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCisgICAgd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICA7OworCisgIHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgcGljX2ZsYWc9Jy1LUElDJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJworICAgIHdsPSctV2wsJworICAgIDs7CisKKyAgdXRzNCopCisgICAgcGljX2ZsYWc9Jy1waWMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCisgICAgOzsKKworICAqKQorICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorCitpZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCisgIGVjaG8gIiRhY190JHBpY19mbGFnIiAxPiY2CisKKyAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBpY19mbGFnIGFjdHVhbGx5IHdvcmtzLgorICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2CisgICRybSBjb25mdGVzdCoKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgJHBpY19mbGFnIC1EUElDIgorICBlY2hvICIkcHJvZ25hbWU6NzE3OiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzIiA+JjUKKyAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo3MTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJG9iamV4dDsgdGhlbgorICAgICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAKKyAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgICMgT24gSFAtVVgsIGJvdGggQ0MgYW5kIEdDQyBvbmx5IHdhcm4gdGhhdCBQSUMgaXMgc3VwcG9ydGVkLi4uIHRoZW4gdGhleQorICAgICAgIyBjcmVhdGUgbm9uLVBJQyBvYmplY3RzLiAgU28sIGlmIHRoZXJlIHdlcmUgYW55IHdhcm5pbmdzLCB3ZSBhc3N1bWUgdGhhdAorICAgICAgIyBQSUMgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisJZWNobyAiJGFjX3Qibm8gMT4mNgorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKwlwaWNfZmxhZz0KKyAgICAgIGVsc2UKKwllY2hvICIkYWNfdCJ5ZXMgMT4mNgorCXBpY19mbGFnPSIgJHBpY19mbGFnIgorICAgICAgZmkKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGVjaG8gIiRhY190InllcyAxPiY2CisgICAgICBwaWNfZmxhZz0iICRwaWNfZmxhZyIKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgcGljX2ZsYWc9CisgICAgZWNobyAiJGFjX3Qibm8gMT4mNgorICBmaQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgJHJtIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICIkYWNfdCJub25lIDE+JjYKK2ZpCisKKyMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLW8gYW5kIC1jIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKK2VjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLm8uLi4gJGFjX2MiIDE+JjYKKyRybSBjb25mdGVzdCoKK2VjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYworc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9IiRDRkxBR1MgLWMgLW8gY29uZnRlc3QyLm8iCitlY2hvICIkcHJvZ25hbWU6NzYwOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5vIiA+JjUKK2lmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NzYxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Mi5vOyB0aGVuCisKKyAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgICAgIGNvbXBpbGVyX2Nfbz1ubworICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190InllcyAxPiY2CisgICAgICBjb21waWxlcl9jX289eWVzCisgICAgZmkKK2Vsc2UKKyAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgIGNvbXBpbGVyX2Nfbz1ubworICBlY2hvICIkYWNfdCJubyAxPiY2CitmaQorQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCiskcm0gY29uZnRlc3QqCisKK2lmIHRlc3QgeCIkY29tcGlsZXJfY19vIiA9IHgieWVzIjsgdGhlbgorICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gd3JpdGUgdG8gYSAubG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8uLi4gJGFjX2MiIDE+JjYKKyAgJHJtIGNvbmZ0ZXN0KgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYyAtbyBjb25mdGVzdC5sbyIKKyAgZWNobyAiJHByb2duYW1lOjc4ODogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8iID4mNQoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo3ODk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubG87IHRoZW4KKworICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorCWVjaG8gIiRhY190Im5vIDE+JjYKKwljb21waWxlcl9vX2xvPW5vCisgICAgICBlbHNlCisJZWNobyAiJGFjX3QieWVzIDE+JjYKKwljb21waWxlcl9vX2xvPXllcworICAgICAgZmkKKyAgZWxzZQorICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgY29tcGlsZXJfb19sbz1ubworICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgZmkKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICRybSBjb25mdGVzdCoKK2Vsc2UKKyAgY29tcGlsZXJfb19sbz1ubworZmkKKworIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIGRvIGhhcmQgbGlua3MgdG8gbG9jayBzb21lIGZpbGVzIGlmIG5lZWRlZAoraGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkYWNfYyIgMT4mNgorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBlY2hvICIkYWNfdCRoYXJkX2xpbmtzIiAxPiY2CisgICRybSBjb25mdGVzdCoKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICBlY2hvICIqKiogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyCisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK2lmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIGFyZSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLi4uICRhY19jIiAxPiY2CisgICRybSBjb25mdGVzdCoKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAtYyBjb25mdGVzdC5jIgorICBlY2hvICIkcHJvZ25hbWU6ODQwOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CisgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6ODQxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KKworICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorCWVjaG8gIiRhY190Im5vIDE+JjYKKwljb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgICAgIGVsc2UKKwllY2hvICIkYWNfdCJ5ZXMgMT4mNgorCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKKyAgICAgIGZpCisgIGVsc2UKKyAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubworICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgZmkKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgICRybSBjb25mdGVzdCoKKworICBpZiB0ZXN0ICIkY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9ICJ5ZXMiOyB0aGVuCisgICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMnCisgIGVsc2UKKyAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCisgIGZpCisgIAorZmkKKworIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCitpZiB0ZXN0IC1uICIkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzIjsgdGhlbgorICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmc6IFxgJENDJyByZXF1aXJlcyBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKKyAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZWdyZXAgLWUgIlsgCV0kc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzWyAJXSIgPi9kZXYvbnVsbDsgdGhlbiA6CisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGFkZCBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgMT4mMgorICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgZmkKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgorJHJtIGNvbmZ0ZXN0KgorZWNobyAnbWFpbigpe3JldHVybigwKTt9JyA+IGNvbmZ0ZXN0LmMKK3NhdmVfTERGTEFHUz0iJExERkxBR1MiCitMREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKK2VjaG8gIiRwcm9nbmFtZTo4ODQ6IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CitpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjg4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIGVjaG8gIiRhY190JGxpbmtfc3RhdGljX2ZsYWciIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3Qibm9uZSAxPiY2CisgIGxpbmtfc3RhdGljX2ZsYWc9CitmaQorTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyRybSBjb25mdGVzdCoKKworaWYgdGVzdCAteiAiJExOX1MiOyB0aGVuCisgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB1c2UgbG4gLXMsIG9yIHdlIG5lZWQgaGFyZCBsaW5rcy4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgorICAkcm0gY29uZnRlc3RkYXRhCisgIGlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsOyB0aGVuCisgICAgJHJtIGNvbmZ0ZXN0ZGF0YQorICAgIExOX1M9ImxuIC1zIgorICBlbHNlCisgICAgTE5fUz1sbgorICBmaQorICBpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKKyAgZWxzZQorICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgZmkKK2ZpCisKKyMgTWFrZSBzdXJlIExEIGlzIGFuIGFic29sdXRlIHBhdGguCitpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGFjX3Byb2c9bGQKKyAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgorICAgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQy4uLiAkYWNfYyIgMT4mNgorICAgIGVjaG8gIiRwcm9nbmFtZTo5MTc6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAorICAgIGNhc2UgIiRhY19wcm9nIiBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICAgIiIpCisgICAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlIG5vdCB1c2luZyBHQ0MuCisgICAgICBhY19wcm9nPWxkCisgICAgICA7OworICAgICopCisgICAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgICA7OworICAgIGVzYWMKKyAgZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgorICAgIGVjaG8gIiRwcm9nbmFtZTo5NDE6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorICBlbHNlCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgorICAgIGVjaG8gIiRwcm9nbmFtZTo5NDQ6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKKyAgZmkKKworICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorCUxEPSIkYWNfZGlyLyRhY19wcm9nIgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKwkjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisJIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisJaWYgIiRMRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKwkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKwllbHNlCisJICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworCWZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgZmkKKworICBpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgICAgZWNobyAiJGFjX3QkTEQiIDE+JjYKKyAgZWxzZQorICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgZmkKKworICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCisKKyMgQ2hlY2sgdG8gc2VlIGlmIGl0IHJlYWxseSBpcyBvciBpcyBub3QgR05VIGxkLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKKyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitpZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCisgIHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmkKK2VjaG8gIiRhY190JHdpdGhfZ251X2xkIiAxPiY2CisKKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2CisKK2FsbG93X3VuZGVmaW5lZF9mbGFnPQorbm9fdW5kZWZpbmVkX2ZsYWc9CituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgorbmVlZF92ZXJzaW9uPXVua25vd24KKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCithcmNoaXZlX2NtZHM9CithcmNoaXZlX2V4cHN5bV9jbWRzPQorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQordGhyZWFkX3NhZmVfZmxhZ19zcGVjPQoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CitoYXJkY29kZV9kaXJlY3Q9bm8KK2hhcmRjb2RlX21pbnVzX0w9bm8KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKK3J1bnBhdGhfdmFyPQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCitleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorIyBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIGxpc3QKK2luY2x1ZGVfZXhwc3ltcz0KKyMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBlZ3JlcCByZWd1bGFyIGV4cHJlc3Npb24gb2Ygc3ltYm9scyB0byBleGNsdWRlCisjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisjIGVuZCBvZiBsaW5lLiAgRXhhbXBsZTogYGF8YmN8LipkLionIHdpbGwgZXhjbHVkZSB0aGUgc3ltYm9scyBgYScgYW5kIGBiYycsCisjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KK2V4Y2x1ZGVfZXhwc3ltcz0KKworY2FzZSAiJGhvc3Rfb3MiIGluCitjeWd3aW4qIHwgbWluZ3cqKQorICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgIGlmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzOyB0aGVuCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgZmkKKyAgOzsKKworZnJlZWJzZDIqIHwgc3Vub3M0KikKKyAgZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgIDs7CisKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICB3bGFyYz0nJHt3bH0nCisKKyAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgIGNhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKiB8IGFpeDQqKQorICAgICMgT24gQUlYLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgIGxkX3NobGlicz1ubworICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiBjcnUgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICA7OworCisgIHN1bm9zNCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCisgICAgd2xhcmM9CisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgYmVvcyopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgZmkKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCisgICAgIyBFeHRyYWN0IHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QgZnJvbSBhbiBgLS1leHBvcnQtYWxsJyBkZWYgZmlsZSwKKyAgICAjIHRoZW4gcmVnZW5lcmF0ZSB0aGUgZGVmIGZpbGUgZnJvbSB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LCBzbyB0aGF0CisgICAgIyB0aGUgY29tcGlsZWQgZGxsIG9ubHkgZXhwb3J0cyB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LgorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9J3JtIC1mICRvYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgorICAgICAgc2VkIC1lICIvXiMgXC9cKiBsdGRsbC5jIHN0YXJ0cyBoZXJlIFwqXC8vLC9eIyBcL1wqIGx0ZGxsLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLzsgcDsgfSIgLWUgZCA8ICQwID4gJG9iamRpci8kc29uYW1lLWx0ZGxsLmN+CisgICAgICAoY2QgJG9iamRpciAmJiAkQ0MgLWMgJHNvbmFtZS1sdGRsbC5jKX4KKyAgICAgICRETExUT09MIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLW91dHB1dC1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianN+CisgICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgWzAtOV0qIDsgKi8vIiA8ICRvYmpkaXIvJHNvbmFtZS1kZWYgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdlY2hvIEVYUE9SVFMgPiAkb2JqZGlyLyRzb25hbWUtZGVmfgorICAgICAgX2x0X2hpbnQ9MTsKKyAgICAgIGZvciBzeW1ib2wgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbworICAgICAgICBlY2hvICIJXCRzeW1ib2wgQCBcJF9sdF9oaW50IDsgIiA+PiAkb2JqZGlyLyRzb25hbWUtZGVmOworCV9sdF9oaW50PWBleHByIDEgKyBcJF9sdF9oaW50YDsKKyAgICAgIGRvbmV+CisgICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+CisgICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb2JqZGlyLyRzb25hbWUtZXhwfgorICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb2JqZGlyLyRzb25hbWUtYmFzZSAkb2JqZGlyLyRzb25hbWUtZXhwIC1XbCwtLWRsbCAtbm9zdGFydGZpbGVzIC1XbCwtZSxfX2N5Z3dpbl9kbGxfZW50cnlAMTIgLW8gJGxpYiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+CisgICAgICAkRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWV4Y2x1ZGUtc3ltYm9scyBEbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMiAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tYmFzZS1maWxlICRvYmpkaXIvJHNvbmFtZS1iYXNlIC0tb3V0cHV0LWV4cCAkb2JqZGlyLyRzb25hbWUtZXhwfgorICAgICAgJENDICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKworICAgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1kZWYgJG9iamRpci8kc29uYW1lLWRlZiAtLW91dHB1dC1saWIgJG9iamRpci8kbGlibmFtZS5hJworICAgIDs7CisKKyAgKikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgZmkKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgIGZpCitlbHNlCisgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgIGFpeDMqKQorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRMRCAtbyAkb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJworICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorICAgICAgIyBicm9rZW4gY29sbGVjdDIuCisgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICBmaQorICAgIDs7CisKKyAgYWl4NCopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgorICAgICAgaWYgc3RyaW5ncyBgJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAgfCBcCisJIGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisgICAgICB0aGVuCisJIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgZWxzZQorCSMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwloYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LWJub2VudHJ5IC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCisgICAgZWxzZQorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWJNOlNSRSAke3dsfS1ibm9lbnRyeScKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBmaQorICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgIyBUaG91Z2ggTElCUEFUSCB2YXJpYWJsZSBoYXJkY29kZXMgc2hsaWJwYXRoIGludG8gZXhlY3V0YWJsZSwKKyAgICAjIGl0IGRvZXNuJ3QgYWZmZWN0IHNlYXJjaGluZyBmb3IgLWwqIGxpYnJhcmllczsgdGhpcyBjb25mdXNlcworICAgICMgdGVzdHMgaW4gbWRlbW8uCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgbGliZXh0PWxpYgorICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbyAkbGliICRsaWJvYmpzICRsaW5rb3B0cyBgZWNobyAiJGRlcGxpYnMiIHwgc2VkIC1lICdcJydzLyAtbGMkLy8nXCcnYCAtbGluayAtZGxsfmxpbmtuYW1lcz0nCisgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSd0cnVlJworICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisgICAgb2xkX2FyY2hpdmVfY21kcz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJworICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICRzcmNmaWxlYCcKKyAgICA7OworCisgIGZyZWVic2QxKikKKyAgICBsZF9zaGxpYnM9bm8KKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgOzsKKworICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAjIGV4dHJhIHNwYWNlKS4KKyAgZnJlZWJzZDIuMiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgL3Vzci9saWIvYysrcnQwLm8nCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPW5vICMgdmVyaWZpZWQgb24gMi4yLjYKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgIGZyZWVic2QyKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgIGZyZWVic2QqKQorICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPW5vCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgaHB1eDkqKQorICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvJHNvbmFtZX4kTEQgLWIgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+dGVzdCAkb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvYmpkaXIvJHNvbmFtZSAkbGliJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICA7OworCisgIGhwdXgxMCogfCBocHV4MTEqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICA7OworCisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC1vICRsaWInCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgOzsKKworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJyAgIyBhLm91dAorICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAgICAgIyBFTEYKKyAgICBmaQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBvcGVuYnNkKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIG9zMiopCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBEQVRBID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICRvYmpkaXIvJGxpYm5hbWUuZGVmJworICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb2JqZGlyLyRsaWJuYW1lLmEgJG9iamRpci8kbGlibmFtZS5kZWYnCisgICAgOzsKKworICBvc2YzKiB8IG9zZjQqKQorICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCisgICAgZWxzZQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLW8gJGxpYicKKyAgICBmaQorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICA7OworCisgIHNjbzMuMnY1KikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgOzsKKworICBzb2xhcmlzKikKKyAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCisgICAgIyAkQ0MgLXNoYXJlZCB3aXRob3V0IEdOVSBsZCB3aWxsIG5vdCBjcmVhdGUgYSBsaWJyYXJ5IGZyb20gQysrCisgICAgIyBvYmplY3QgZmlsZXMgYW5kIGEgc3RhdGljIGxpYnN0ZGMrKywgYmV0dGVyIGF2b2lkIGl0IGJ5IG5vdworICAgIGFyY2hpdmVfY21kcz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzfiRybSAkbGliLmV4cCcKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICAjIFdoeSBkbyB3ZSBuZWVkIC1Cc3RhdGljPyAgVG8gYXZvaWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMsIG1heWJlLi4uCisgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgorICAgICAgIyBVc2UgLWZQSUMgaGVyZSBiZWNhdXNlIGxpYmdjYyBpcyBtdWx0aWxpYmJlZAorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1Cc3RhdGljIC1mUElDIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJworICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIHN5c3Y0LjMqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCisgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgaGFyZGNvZGVfbWludXNfTD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgIDs7CisKKyAgdXRzNCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgaGFyZGNvZGVfbWludXNfTD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGRndXgqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAqKQorICAgIGxkX3NobGlicz1ubworICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorZWNobyAiJGFjX3QkbGRfc2hsaWJzIiAxPiY2CisKK2lmIHRlc3QgLXogIiROTSI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2CisgIGNhc2UgIiROTSIgaW4KKyAgLyogfCBbQS1aYS16XTpbL1xcXSopIDs7ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAqKQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci91Y2IgL3Vzci9jY3MvYmluIC9iaW47IGRvCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJICBOTT0iJGFjX2Rpci9ubSAtQiIKKwkgIGJyZWFrCisJZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwkgIE5NPSIkYWNfZGlyL25tIC1wIgorCSAgYnJlYWsKKwllbHNlCisJICBOTT0ke05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICBjb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworCWZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCisgICAgOzsKKyAgZXNhYworICBlY2hvICIkYWNfdCROTSIgMT4mNgorZmkKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKKworIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgorc3lteGZybT0nXDEgXDJcMyBcMycKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqKQorICBzeW1jb2RlPSdbQUJDREdJU1RXXScKKyAgOzsKK2hwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCisgIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICA7OworaXJpeCopCisgIHN5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW0JEVF0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgoraWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworZmkKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGdsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRzeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JC8kc3lteGZybS9wJyIKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworICAkcm0gY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCittYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitFT0YKKworICBlY2hvICIkcHJvZ25hbWU6MTQ0NzogY2hlY2tpbmcgaWYgZ2xvYmFsX3N5bWJvbF9waXBlIHdvcmtzIiA+JjUKKyAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxNDQ4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJG9iamV4dDsgdGhlbgorICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICAgIG5saXN0PWNvbmZ0ZXN0Lm5tCisgICAgaWYgeyBlY2hvICIkcHJvZ25hbWU6MTQ1MTogZXZhbCBcIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdFwiIiA+JjU7IGV2YWwgIiROTSBjb25mdGVzdC4kb2JqZXh0IHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdCAyPiY1IjsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisKKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCW12IC1mICIkbmxpc3QiVCAiJG5saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYycKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorCSAgc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCisJICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kb2JqZXh0IGNvbmZ0ZXN0bS4kb2JqZXh0CisJICBzYXZlX0xJQlM9IiRMSUJTIgorCSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdGVzdG0uJG9iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisJICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjE1MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZWxzZQorCSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKKwkgIGZpCisJICBMSUJTPSIkc2F2ZV9MSUJTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQorCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJG5saXN0IiA+JjUKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuYyA+JjUKKyAgZmkKKyAgJHJtIGNvbmZ0ZXN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGdsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK2VjaG8gIiRhY190JHBpcGVfd29ya3MiIDE+JjYKKworaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KK2ZpCisKKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkYWNfYyIgMT4mNgoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IG5vOyB0aGVuCisKKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCitlY2hvICIkYWNfdCRoYXJkY29kZV9hY3Rpb24iIDE+JjYKKworCityZWxvYWRfZmxhZz0KK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gJGFjX2MiIDE+JjYKKyMgUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK3JlbG9hZF9mbGFnPSctcicKK2VjaG8gIiRhY190JHJlbG9hZF9mbGFnIiAxPiY2Cit0ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgorCisjIFBPUlRNRSBGaWxsIGluIHlvdXIgbGQuc28gY2hhcmFjdGVyaXN0aWNzCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9Citwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmlsZV9tYWdpY19jbWQ9CitmaWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbcmVnZXhdJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZWdyZXAgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCitlY2hvICRhY19uICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJGFjX2MiIDE+JjYKK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIDs7CisKK2FpeDQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRob3VnaCBBSVg0LjIKKyAgIyBhbmQgbGF0ZXIgbGlua2VyIHN1cHBvcnRzIC5zbworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYW1pZ2FvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIjsgKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbycKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0uc28kbWFqb3IgJHtsaWJuYW1lfS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0uc28nCisgIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIDMyLWJpdCBMU0Igc2hhcmVkIG9iamVjdCcKKyAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwgJGxpYm5hbWUuYScKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5saWInCisgIGZpCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4Ni4qYXJjaGl0ZWN0dXJlOiBpMzg2JworICBmaWxlX21hZ2ljX2NtZD0nb2JqZHVtcCAtZicKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworICAKK2ZyZWVic2QqKQorICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAiJHZlcnNpb25fdHlwZSIgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBzaGFyZWQgb2JqZWN0JworICAgICAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLnNvJHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBPQkpGT1JNQVQ9IiciJG9iamZvcm1hdCInIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvciAkbGlibmFtZS5zbCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yJworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2lyaXg1KikKKyAgdmVyc2lvbl90eXBlPWlyaXgKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIDMyLWJpdCBNU0IgZHluYW1pYyBsaWIgTUlQUyAtIHZlcnNpb24gMSIgIyBvciBzaG91bGQgaXQgYmUgcGFzc19hbGw/CisgIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKmAKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIDs7CisKK2lyaXg2KikKKyAgdmVyc2lvbl90eXBlPWlyaXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJworICBjYXNlICIkTEQiIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgKi0zMnwqIi0zMiAiKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBldmVuIHRob3VnaCAvdXNyL2xvY2FsL2xpYiBpcyBhbHdheXMgc2VhcmNoZWQsIHRoZSBtYW4tcGFnZSBzYXlzCisgICMgc2hhcmVkIGxpYnJhcmllcyBzaG91bGQgbm90IGJlIGluc3RhbGxlZCB0aGVyZSBpZiB0aGV5IHVzZSBhbiBBQkkKKyAgIyBkaWZmZXJlbnQgZnJvbSAtMzIsIHNvIHdlJ2QgYmV0dGVyIG5vdCBzZWFyY2ggZm9yIHNoYXJlZCBsaWJyYXJpZXMKKyAgIyB0aGVyZSBlaXRoZXIKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliJHtsaWJzdWZmfSAvdXNyL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiR7bGlic3VmZn0gL3Vzci9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGICR7bGlibWFnaWN9IE1TQiBtaXBzLVsxMjM0XSBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIiAjIG9yIHNob3VsZCBpdCBiZSBwYXNzX2FsbD8KKyAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliJHtsaWJzdWZmfS9saWJjLnNvKmAKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgtZ251b2xkbGQqIHwgbGludXgtZ251YW91dCogfCBsaW51eC1nbnVjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgtZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliL2xpYmMuc28qIC9saWIvbGliYy0qLnNvYAorCisgIGlmIHRlc3QgLWYgL2xpYi9sZC5zby4xOyB0aGVuCisgICAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgZWxzZQorICAgICMgT25seSB0aGUgR05VIGxkLnNvIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMgb24gTWtMaW51eC4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgcG93ZXJwYyopIGR5bmFtaWNfbGlua2VyPW5vIDs7CisgICAgKikgZHluYW1pY19saW5rZXI9J0xpbnV4IGxkLnNvJyA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJHtsaWJuYW1lfS5zbycKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgIG5lZWRfdmVyc2lvbj1ubworICBmaQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgIyBkZXBsaWJzX2NoZWNrX21ldGhvZD0ncGFzc19hbGwnCisgICMgQWx0aG91Z2ggcGFzc19hbGwgYXBwZWFycyB0byB3b3JrLCBpdCBjb3BpZXMgc3ltYm9scyBmcm9tIHN0YXRpYyBsaWJyYXJpZXMKKyAgIyBpbnRvIHNoYXJlZCBvbmVzIGFuZCBleHBvcnRzIHRoZW0uICBTbywgd2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdHdvCisgICMgb3IgbW9yZSBsaWJyYXJpZXMgdGhhdCBoYXZlIGdvdCBjb3BpZXMgb2YgdGhlIHNhbWUgc3ltYm9scywgbGluayBmYWlscworICAjIFRoaXMgd2FzIG9ubHkgdGVzdGVkIG9uIG9zZjQ6CisgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIENPRkYgZm9ybWF0IGFscGhhIHNoYXJlZCBsaWJyYXJ5JworICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzY28zLjJ2NSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0tYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKKyAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAiJGhvc3RfdmVuZG9yIiBpbgorICAgIG5jcikKKyAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK2VjaG8gIiRhY190JGR5bmFtaWNfbGlua2VyIiAxPiY2Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgorZWNobyAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2CisKK2lmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSIgJiYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfY21kIjsgdGhlbgorICBjYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCisgICJmaWxlX21hZ2ljICIqKQorICAgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgorICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKyAgICAgICBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisgICAgICA6CisgICAgZWxzZQorICAgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorICAgIGZpIDs7CisgIGVzYWMKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworCithaXg0KikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgOzsKK2VzYWMKKworZWNobyAiJGFjX3QkZW5hYmxlX3NoYXJlZCIgMT4mNgorCisjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KK3Rlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworCitlY2hvICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gJGVuYWJsZV9zdGF0aWMiIDE+JjYKKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKK3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBvYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2VjaG8gIiRhY190JG9iamRpciIgMT4mNgorCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2Rsb3Blbicrc2V0fSdgXCIgIT0gc2V0IjsgdGhlbgorICBsdF9jdl9kbG9wZW49bm8gbHRfY3ZfZGxvcGVuX2xpYnM9CitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gIiRwcm9nbmFtZToxOTc3OiBjaGVja2luZyBmb3IgZGxvcGVuIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2Rsb3Blbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE5ODIgImx0Y29uZmlnIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgZGxvcGVuKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfZGxvcGVuKSB8fCBkZWZpbmVkIChfX3N0dWJfX19kbG9wZW4pCitjaG9rZSBtZQorI2Vsc2UKK2Rsb3BlbigpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX2Rsb3Blbj15ZXMiCitlbHNlCisgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nZGxvcGVuYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICIkcHJvZ25hbWU6MjAyMjogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gZGwnXydkbG9wZW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjAzMCAibHRjb25maWciCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGRsb3BlbigpOworCitpbnQgbWFpbigpIHsKK2Rsb3BlbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjA0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICIkcHJvZ25hbWU6MjA1OTogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gZGxkJ18nZGxkX2xpbmsgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNjcgImx0Y29uZmlnIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbGRfbGluaygpOworCitpbnQgbWFpbigpIHsKK2RsZF9saW5rKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMDc3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gIiRwcm9nbmFtZToyMDk2OiBjaGVja2luZyBmb3Igc2hsX2xvYWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfc2hsX2xvYWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTAxICJsdGNvbmZpZyIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHNobF9sb2FkKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2hsX2xvYWQoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9zaGxfbG9hZCkgfHwgZGVmaW5lZCAoX19zdHViX19fc2hsX2xvYWQpCitjaG9rZSBtZQorI2Vsc2UKK3NobF9sb2FkKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIxMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9eWVzIgorZWxzZQorICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3NobF9sb2FkPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nc2hsX2xvYWRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitlY2hvICRhY19uICJjaGVja2luZyBmb3IgTG9hZExpYnJhcnkiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiJHByb2duYW1lOjIxNDE6IGNoZWNraW5nIGZvciBMb2FkTGlicmFyeSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19Mb2FkTGlicmFyeScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxNDYgImx0Y29uZmlnIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgTG9hZExpYnJhcnkoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBMb2FkTGlicmFyeSgpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX0xvYWRMaWJyYXJ5KSB8fCBkZWZpbmVkIChfX3N0dWJfX19Mb2FkTGlicmFyeSkKK2Nob2tlIG1lCisjZWxzZQorTG9hZExpYnJhcnkoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjE2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19Mb2FkTGlicmFyeT15ZXMiCitlbHNlCisgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfTG9hZExpYnJhcnk9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydMb2FkTGlicmFyeWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgIAorZmkKKworICAgIAorZmkKKworICAKK2ZpCisKKworZmkKKworZmkKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZmkKKworICBjYXNlICIkbHRfY3ZfZGxvcGVuIiBpbgorICBkbG9wZW4pCitmb3IgYWNfaGRyIGluIGRsZmNuLmg7IGRvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gIiRwcm9nbmFtZToyMjEwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIxNSAibHRjb25maWciCisjaW5jbHVkZSA8JGFjX2hkcj4KK2ludCBmbm9yZCA9IDA7CitFT0YKK2FjX3RyeT0iJGFjX2NvbXBpbGUgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMjIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICAgaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzOyB0aGVuCisgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorICAgIGZpCisgICAgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICIkcHJvZ25hbWU6MjI0ODogY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCisgIGVsc2UKKyAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjbGluZSAyMjU2ICJsdGNvbmZpZyIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKKyNlbHNlCisjIGlmZGVmIERMX0dMT0JBTAorIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAorIyBlbHNlCisjICBkZWZpbmUgTFRETF9HTE9CQUwJMAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRETF9MQVpZX09SX05PVworIyBpZmRlZiBSVExEX0xBWlkKKyMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQorIyBlbHNlCisjICBpZmRlZiBETF9MQVpZCisjICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQorIyAgZWxzZQorIyAgIGlmZGVmIFJUTERfTk9XCisjICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCisjICAgZWxzZQorIyAgICBpZmRlZiBETF9OT1cKKyMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVworIyAgICBlbHNlCisjICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworZm5vcmQoKSB7IGludCBpPTQyO30KK21haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKKyAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKKwkgICAgICAgaWYocHRyMSB8fCBwdHIyKSBleGl0KDApOyB9IGV4aXQoMSk7IH0gCisKK0VPRgoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworZWxzZQorICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBsdF9jdl9kbG9wZW5fc2VsZj1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkbHRfY3ZfZGxvcGVuX3NlbGYiIDE+JjYKKworICBpZiB0ZXN0ICIkbHRfY3ZfZGxvcGVuX3NlbGYiID0geWVzOyB0aGVuCisgICAgTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gIiRwcm9nbmFtZToyMzIxOiBjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CitpZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcworICBlbHNlCisgICAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2xpbmUgMjMyOSAibHRjb25maWciCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgZGVmaW5lIExURExfR0xPQkFMCVJUTERfR0xPQkFMCisjZWxzZQorIyBpZmRlZiBETF9HTE9CQUwKKyMgIGRlZmluZSBMVERMX0dMT0JBTAlETF9HTE9CQUwKKyMgZWxzZQorIyAgZGVmaW5lIExURExfR0xPQkFMCTAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRETF9MQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExURExfTEFaWV9PUl9OT1cKKyMgaWZkZWYgUlRMRF9MQVpZCisjICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX0xBWlkKKyMgZWxzZQorIyAgaWZkZWYgRExfTEFaWQorIyAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX0xBWlkKKyMgIGVsc2UKKyMgICBpZmRlZiBSVExEX05PVworIyAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlSVExEX05PVworIyAgIGVsc2UKKyMgICAgaWZkZWYgRExfTk9XCisjICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9OT1cKKyMgICAgZWxzZQorIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJMAorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2Zub3JkKCkgeyBpbnQgaT00Mjt9CittYWluKCkgeyB2b2lkICpzZWxmLCAqcHRyMSwgKnB0cjI7IHNlbGY9ZGxvcGVuKDAsTFRETF9HTE9CQUx8TFRETF9MQVpZX09SX05PVyk7CisgICAgaWYoc2VsZikgeyBwdHIxPWRsc3ltKHNlbGYsImZub3JkIik7IHB0cjI9ZGxzeW0oc2VsZiwiX2Zub3JkIik7CisgICAgaWYocHRyMSB8fCBwdHIyKSBleGl0KDApOyB9IGV4aXQoMSk7IH0gCisKK0VPRgoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMzc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMKK2Vsc2UKKyAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIDE+JjYKK2ZpCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZiIgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICIkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKKyAgZXNhYworZmkKKworIyBDb3B5IGVjaG8gYW5kIHF1b3RlIHRoZSBjb3B5LCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCwgYmVjYXVzZSBpdCBpcworIyB1c2VkIGxhdGVyLgorbHRlY2hvPSIkZWNobyIKK2lmIHRlc3QgIlgkbHRlY2hvIiA9ICJYJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisgICBsdGVjaG89IiRDT05GSUdfU0hFTEwgXCQwIC0tZmFsbGJhY2stZWNobyIKK2ZpCitMVFNIRUxMPSIkU0hFTEwiCisKK0xUQ09ORklHX1ZFUlNJT049IiRWRVJTSU9OIgorCisjIE9ubHkgcXVvdGUgdmFyaWFibGVzIGlmIHdlJ3JlIHVzaW5nIGx0bWFpbi5zaC4KK2Nhc2UgIiRsdG1haW4iIGluCisqLnNoKQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzLgorICBmb3IgdmFyIGluIGx0ZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1Mgb2xkX0xEIG9sZF9OTSBvbGRfUkFOTElCIFwKKyAgICBvbGRfTE5fUyBvbGRfRExMVE9PTCBvbGRfQVMgQVIgQ0MgTEQgTE5fUyBOTSBMVFNIRUxMIExUQ09ORklHX1ZFUlNJT04gXAorICAgIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIHdsIFwKKyAgICBwaWNfZmxhZyBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAorICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYyB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBsaWJuYW1lX3NwZWMgXAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBcCisgICAgUkFOTElCIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCisgICAgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBhcmNoaXZlX2NtZHMgYXJjaGl2ZV9leHBzeW1fY21kcyBwb3N0aW5zdGFsbF9jbWRzIHBvc3R1bmluc3RhbGxfY21kcyBcCisgICAgZmlsZV9tYWdpY19jbWQgZXhwb3J0X3N5bWJvbHNfY21kcyBkZXBsaWJzX2NoZWNrX21ldGhvZCBhbGxvd191bmRlZmluZWRfZmxhZyBub191bmRlZmluZWRfZmxhZyBcCisgICAgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgZ2xvYmFsX3N5bWJvbF9waXBlIGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciAgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgY29tcGlsZXJfY19vIGNvbXBpbGVyX29fbG8gbmVlZF9sb2NrcyBleGNsdWRlX2V4cHN5bXMgaW5jbHVkZV9leHBzeW1zOyBkbworCisgICAgY2FzZSAiJHZhciIgaW4KKyAgICByZWxvYWRfY21kcyB8IG9sZF9hcmNoaXZlX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIGZpbmlzaF9jbWRzIHwgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICIkdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAiJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICIkbHRlY2hvIiBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdGVjaG89YCRlY2hvICJYJGx0ZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworICB0cmFwICIkcm0gXCIkb2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKKyAgZWNobyAiY3JlYXRpbmcgJG9maWxlIgorICAkcm0gIiRvZmlsZSIKKyAgY2F0IDw8RU9GID4gIiRvZmlsZSIKKyMhICRTSEVMTAorCisjIGAkZWNobyAiJG9maWxlIiB8IHNlZCAncyVeLiovJSUnYCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCkKKyMgTk9URTogQ2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Q6IGxvb2sgYXQgbHRjb25maWcgb3IgbHRtYWluLnNoLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9InNlZCAtZSBzL15YLy8iCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICJcJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCitFT0YKKyAgY2ZnZmlsZT0iJG9maWxlIgorICA7OworCisqKQorICAjIERvdWJsZS1xdW90ZSB0aGUgdmFyaWFibGVzIHRoYXQgbmVlZCBpdCAoZm9yIGFlc3RoZXRpY3MpLgorICBmb3IgdmFyIGluIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBvbGRfTEQgb2xkX05NIG9sZF9SQU5MSUIgXAorICAgIG9sZF9MTl9TIG9sZF9ETExUT09MIG9sZF9BUzsgZG8KKyAgICBldmFsICIkdmFyPVxcXCJcJHZhclxcXCIiCisgIGRvbmUKKworICAjIEp1c3QgY3JlYXRlIGEgY29uZmlnIGZpbGUuCisgIGNmZ2ZpbGU9IiRvZmlsZS5jZmciCisgIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgIGVjaG8gImNyZWF0aW5nICRjZmdmaWxlIgorICAkcm0gIiRjZmdmaWxlIgorICBjYXQgPDxFT0YgPiAiJGNmZ2ZpbGUiCisjIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gTGlidG9vbCBjb25maWd1cmF0aW9uIGZpbGUuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorRU9GCisgIDs7Citlc2FjCisKK2NhdCA8PEVPRiA+PiAiJGNmZ2ZpbGUiCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjIENDPSRvbGRfQ0MgQ0ZMQUdTPSRvbGRfQ0ZMQUdTIENQUEZMQUdTPSRvbGRfQ1BQRkxBR1MgXFwKKyMgTEQ9JG9sZF9MRCBOTT0kb2xkX05NIFJBTkxJQj0kb2xkX1JBTkxJQiBMTl9TPSRvbGRfTE5fUyBcXAorIyBETExUT09MPSIkb2xkX0RMTFRPT0wiIEFTPSIkb2xkX0FTIiBcXAorIyAgICQwJGx0Y29uZmlnX2FyZ3MKKyMKKyMgQ29tcGlsZXIgYW5kIG90aGVyIHRlc3Qgb3V0cHV0IHByb2R1Y2VkIGJ5ICRwcm9nbmFtZSwgdXNlZnVsIGZvcgorIyBkZWJ1Z2dpbmcgJHByb2duYW1lLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCisjIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KK0xUQ09ORklHX1ZFUlNJT049JExUQ09ORklHX1ZFUlNJT04KKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JExUU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAorCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0ZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRBUgorCisjIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCitDQz0kQ0MKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JExECisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JExOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kTk0KKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRyZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kd2wKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRvYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRwaWNfZmxhZworCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucworY29tcGlsZXJfY19vPSRjb21waWxlcl9jX28KKworIyBDYW4gd2Ugd3JpdGUgZGlyZWN0bHkgdG8gYSAubG8gPworY29tcGlsZXJfb19sbz0kY29tcGlsZXJfb19sbworCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KK25lZWRfbG9ja3M9JG5lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW49JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGxpbmtfc3RhdGljX2ZsYWcKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRub19idWlsdGluX2ZsYWcKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JHRocmVhZF9zYWZlX2ZsYWdfc3BlYworCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRSQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JG9sZF9hcmNoaXZlX2NtZHMKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRvbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRhcmNoaXZlX2NtZHMKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGFyY2hpdmVfZXhwc3ltX2NtZHMKK3Bvc3RpbnN0YWxsX2NtZHM9JHBvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMKK2ZpbGVfbWFnaWNfY21kPSRmaWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRub191bmRlZmluZWRfZmxhZworCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRmaW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRnbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRS5zbyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTAorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3ZhcgorCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKworIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoIgorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQKK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzCisKKyMgVGhlIGNvbW1hbmQgdG8gZXh0cmFjdCBleHBvcnRlZCBzeW1ib2xzCitleHBvcnRfc3ltYm9sc19jbWRzPSRleHBvcnRfc3ltYm9sc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scworZXhjbHVkZV9leHBzeW1zPSRleGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQKK2luY2x1ZGVfZXhwc3ltcz0kaW5jbHVkZV9leHBzeW1zCisKK0VPRgorCitjYXNlICIkbHRtYWluIiBpbgorKi5zaCkKKyAgZWNobyAnIyMjIEVORCBMSUJUT09MIENPTkZJRycgPj4gIiRvZmlsZSIKKyAgZWNobyA+PiAiJG9maWxlIgorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJG9maWxlIgorCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK0VPRgorICAgIDs7CisgIGVzYWMKKworICAjIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KKyAgY2F0ICIkbHRtYWluIiA+PiAiJG9maWxlIiB8fCAocm0gLWYgIiRvZmlsZSI7IGV4aXQgMSkKKworICBjaG1vZCAreCAiJG9maWxlIgorICA7OworCisqKQorICAjIENvbXBpbGUgdGhlIGxpYnRvb2wgcHJvZ3JhbS4KKyAgZWNobyAiRklYTUU6IHdvdWxkIGNvbXBpbGUgJGx0bWFpbiIKKyAgOzsKK2VzYWMKKwordGVzdCAtbiAiJGNhY2hlX2ZpbGUiIHx8IGV4aXQgMAorCisjIEFDX0NBQ0hFX1NBVkUKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbHRtYWluLnNoIGIvbHRtYWluLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODc4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9sdG1haW4uc2gKQEAgLTAsMCArMSwzNzgyIEBACisjIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KK2lmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PEVPRgorJCoKK0VPRgorICBleGl0IDAKK2VsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCisgICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRlY2hvIHdpbGwgd29yay4KKyAgZXhlYyAkU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KK2ZpCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgorcHJvZ25hbWU9YCRlY2hvICIkMCIgfCBzZWQgJ3MlXi4qLyUlJ2AKK21vZGVuYW1lPSIkcHJvZ25hbWUiCisKKyMgQ29uc3RhbnRzLgorUFJPR1JBTT1sdG1haW4uc2gKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0xLjJmCitUSU1FU1RBTVA9IiAoMS4zMyAxOTk5LzA0LzI2IDE2OjI4OjUzKSIKKworZGVmYXVsdF9tb2RlPQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWtkaXI9Im1rZGlyIgorbXY9Im12IC1mIgorcm09InJtIC1mIgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJworU1AyTkw9J3RyIFwwNDAgXDAxMicKK05MMlNQPSd0ciBcMDEyIFwwNDAnCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCisjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAorIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuCisgIHNhdmVfTENfQUxMPSIkTENfQUxMIjsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwKK2ZpCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc2F2ZV9MQU5HPSIkTEFORyI7IExBTkc9QzsgZXhwb3J0IExBTkcKK2ZpCisKK2lmIHRlc3QgIiRMVENPTkZJR19WRVJTSU9OIiAhPSAiJFZFUlNJT04iOyB0aGVuCisgIGVjaG8gIiRtb2RlbmFtZTogbHRjb25maWcgdmVyc2lvbiBcYCRMVENPTkZJR19WRVJTSU9OJyBkb2VzIG5vdCBtYXRjaCAkUFJPR1JBTSB2ZXJzaW9uIFxgJFZFUlNJT04nIiAxPiYyCisgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgMQorZmkKKworaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgorICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KK21vZGU9JGRlZmF1bHRfbW9kZQorbm9ub3B0PQorcHJldj0KK3ByZXZvcHQ9CitydW49CitzaG93PSIkZWNobyIKK3Nob3dfaGVscD0KK2V4ZWN1dGVfZGxmaWxlcz0KK2xvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKKworIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KK3doaWxlIHRlc3QgJCMgLWd0IDAKK2RvCisgIGFyZz0iJDEiCisgIHNoaWZ0CisKKyAgY2FzZSAiJGFyZyIgaW4KKyAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBvcHRhcmc9IDs7CisgIGVzYWMKKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgY2FzZSAiJHByZXYiIGluCisgICAgZXhlY3V0ZV9kbGZpbGVzKQorICAgICAgZXZhbCAiJHByZXY9XCJcJCRwcmV2IFwkYXJnXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICIkcHJldj1cJGFyZyIKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgcHJldj0KKyAgICBwcmV2b3B0PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PworICBjYXNlICIkYXJnIiBpbgorICAtLWhlbHApCisgICAgc2hvd19oZWxwPXllcworICAgIDs7CisKKyAgLS12ZXJzaW9uKQorICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKKyAgICBleGl0IDAKKyAgICA7OworCisgIC0tY29uZmlnKQorICAgIHNlZCAtZSAnMSwvXiMjIyBCRUdJTiBMSUJUT09MIENPTkZJRy9kJyAtZSAnL14jIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJDAKKyAgICBleGl0IDAKKyAgICA7OworCisgIC0tZGVidWcpCisgICAgZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgorICAgIHNldCAteAorICAgIDs7CisKKyAgLS1kcnktcnVuIHwgLW4pCisgICAgcnVuPToKKyAgICA7OworCisgIC0tZmVhdHVyZXMpCisgICAgZWNobyAiaG9zdDogJGhvc3QiCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGV4aXQgMAorICAgIDs7CisKKyAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKKworICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7CisgIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OworCisgIC0tcXVpZXQgfCAtLXNpbGVudCkKKyAgICBzaG93PToKKyAgICA7OworCisgIC1kbG9wZW4pCisgICAgcHJldm9wdD0iLWRsb3BlbiIKKyAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcworICAgIDs7CisKKyAgLSopCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgICAgOzsKKworICAqKQorICAgIG5vbm9wdD0iJGFyZyIKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgorCisgICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgorICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICBjYXNlICIkbm9ub3B0IiBpbgorICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCisgICAgICBtb2RlPWxpbmsKKyAgICAgIGZvciBhcmcKKyAgICAgIGRvCisJY2FzZSAiJGFyZyIgaW4KKwktYykKKwkgICBtb2RlPWNvbXBpbGUKKwkgICBicmVhaworCSAgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICAqZGIgfCAqZGJ4IHwgKnN0cmFjZSB8ICp0cnVzcykKKyAgICAgIG1vZGU9ZXhlY3V0ZQorICAgICAgOzsKKyAgICAqaW5zdGFsbCp8Y3B8bXYpCisgICAgICBtb2RlPWluc3RhbGwKKyAgICAgIDs7CisgICAgKnJtKQorICAgICAgbW9kZT11bmluc3RhbGwKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCisgICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKKworICAgICAgIyBKdXN0IHVzZSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gbW9kZS4KKyAgICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCisJZmkKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgorICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgorICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorCisgICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KKyAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KKyAgY2FzZSAiJG1vZGUiIGluCisgICMgbGlidG9vbCBjb21waWxlIG1vZGUKKyAgY29tcGlsZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgorICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIGxhc3Rhcmc9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisKKyAgICB1c2VyX3RhcmdldD1ubworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgorICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgIC1vKQorCWlmIHRlc3QgIiR1c2VyX3RhcmdldCIgIT0gIm5vIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCisJICBleGl0IDEKKwlmaQorCXVzZXJfdGFyZ2V0PW5leHQKKwk7OworCisgICAgICAtc3RhdGljKQorCWJ1aWxkX29sZF9saWJzPXllcworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgorICAgICAgbmV4dCkKKwkjIFRoZSBuZXh0IG9uZSBpcyB0aGUgLW8gdGFyZ2V0IG5hbWUKKwl1c2VyX3RhcmdldD15ZXMKKwljb250aW51ZQorCTs7CisgICAgICB5ZXMpCisJIyBXZSBnb3QgdGhlIG91dHB1dCBmaWxlCisJdXNlcl90YXJnZXQ9c2V0CisJbGlib2JqPSIkYXJnIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgorICAgICAgbGFzdGFyZz0iJHNyY2ZpbGUiCisgICAgICBzcmNmaWxlPSIkYXJnIgorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorCisgICAgICAjIEJhY2tzbGFzaGlmeSBhbnkgYmFja3NsYXNoZXMsIGRvdWJsZSBxdW90ZXMsIGFuZCBkb2xsYXIgc2lnbnMuCisgICAgICAjIFRoZXNlIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIHNwZWNpYWxseQorICAgICAgIyBpbnRlcnByZXRlZCBpbnNpZGUgb2YgZG91YmxlLXF1b3RlZCBzY3JpbmdzLgorICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5IGluIHNjYW4KKyAgICAgICMgc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgY2FzZSAiJGxhc3RhcmciIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKwlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZGQgdGhlIHByZXZpb3VzIGFyZ3VtZW50IHRvIGJhc2VfY29tcGlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCisJYmFzZV9jb21waWxlPSIkbGFzdGFyZyIKKyAgICAgIGVsc2UKKwliYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCisgICAgICBmaQorICAgIGRvbmUKKworICAgIGNhc2UgIiR1c2VyX3RhcmdldCIgaW4KKyAgICBzZXQpCisgICAgICA7OworICAgIG5vKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICA7OworICAgICopCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgeGZvcm09J1tjQ0ZTZm1zb10nCisgICAgY2FzZSAiJGxpYm9iaiIgaW4KKyAgICAqLmFkYSkgeGZvcm09YWRhIDs7CisgICAgKi5hZGIpIHhmb3JtPWFkYiA7OworICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKKyAgICAqLmFzbSkgeGZvcm09YXNtIDs7CisgICAgKi5jKyspIHhmb3JtPWMrKyA7OworICAgICouY2MpIHhmb3JtPWNjIDs7CisgICAgKi5jcHApIHhmb3JtPWNwcCA7OworICAgICouY3h4KSB4Zm9ybT1jeHggOzsKKyAgICAqLmY5MCkgeGZvcm09ZjkwIDs7CisgICAgKi5mb3IpIHhmb3JtPWZvciA7OworICAgIGVzYWMKKworICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKKworICAgIGNhc2UgIiRsaWJvYmoiIGluCisgICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAgOzsKKyAgICAqKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICByZW1vdmVsaXN0PSIkb2JqICRsaWJvYmoiCisgICAgZWxzZQorICAgICAgcmVtb3ZlbGlzdD0iJGxpYm9iaiIKKyAgICBmaQorCisgICAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKyAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKKworICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCisgICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCisgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgorICAgICAgb3V0cHV0X29iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuLiokJSUnYC4ke29iamV4dH0KKyAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgorICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmogJGxvY2tmaWxlIgorICAgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgMSIgMSAyIDE1CisgICAgZWxzZQorICAgICAgbmVlZF9sb2Nrcz1ubworICAgICAgbG9ja2ZpbGU9CisgICAgZmkKKworICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCisgICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgorICAgICAgdW50aWwgbG4gIiQwIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCWVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAxCisgICAgICBmaQorICAgICAgZWNobyAkc3JjZmlsZSA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgorICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgorICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KKyAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQorCisgICAgICAjIEFsbCBwbGF0Zm9ybXMgdXNlIC1EUElDLCB0byBub3RpZnkgcHJlcHJvY2Vzc2VkIGFzc2VtYmxlciBjb2RlLgorICAgICAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcGljX2ZsYWcgLURQSUMgJHNyY2ZpbGUiCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJbG9fbGlib2JqPSIkbGlib2JqIgorCWRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJaWYgdGVzdCAiWCRkaXIiID0gIlgkbGlib2JqIjsgdGhlbgorCSAgZGlyPSIkb2JqZGlyIgorCWVsc2UKKwkgIGRpcj0iJGRpci8kb2JqZGlyIgorCWZpCisJbGlib2JqPSIkZGlyLyJgJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKwlpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCSAgJHNob3cgIiRybSAkbGlib2JqIgorCSAgJHJ1biAkcm0gJGxpYm9iagorCWVsc2UKKwkgICRzaG93ICIkbWtkaXIgJGRpciIKKwkgICRydW4gJG1rZGlyICRkaXIKKwkgIHN0YXR1cz0kPworCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkZGlyOyB0aGVuCisJICAgIGV4aXQgJHN0YXR1cworCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9vX2xvIiA9IHllczsgdGhlbgorCW91dHB1dF9vYmo9IiRsaWJvYmoiCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCisgICAgICBlbGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJb3V0cHV0X29iaj0iJG9iaiIKKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKKyAgICAgIGZpCisKKyAgICAgICRzaG93ICIkY29tbWFuZCIKKyAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KKwllY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJGxpYm9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsaWJvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxpYm9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KKyAgICAgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgUmVuYW1lIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyIHRvIG9iagorCWlmIHRlc3QgLWYgJG9iajsgdGhlbgorCSAgJHNob3cgJHJtICRvYmoKKwkgICRydW4gJHJtICRvYmoKKwlmaQorCisJJHNob3cgIiRtdiAkbGlib2JqICRvYmoiCisJaWYgJHJ1biAkbXYgJGxpYm9iaiAkb2JqOyB0aGVuIDoKKwllbHNlCisJICBlcnJvcj0kPworCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwkgIGV4aXQgJGVycm9yCisJZmkKKworCSMgTm93IGFycmFuZ2UgdGhhdCBvYmogYW5kIGxvX2xpYm9iaiBiZWNvbWUgdGhlIHNhbWUgZmlsZQorCSRzaG93ICIkTE5fUyAkb2JqICRsb19saWJvYmoiCisJaWYgJHJ1biAkTE5fUyAkb2JqICRsb19saWJvYmo7IHRoZW4KKwkgIGV4aXQgMAorCWVsc2UKKwkgIGVycm9yPSQ/CisJICAkcnVuICRybSAkcmVtb3ZlbGlzdAorCSAgZXhpdCAkZXJyb3IKKwlmaQorICAgICAgZmkKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSIKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKKwlvdXRwdXRfb2JqPSIkb2JqIgorICAgICAgZmkKKworICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICAkc2hvdyAiJGNvbW1hbmQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6CisgICAgICBlbHNlCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KKwllY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJG9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkbyBub3QKKyAgICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKwkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgorCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiBcJGxpYm9iaiIgfHwgZXhpdCAkPworICAgICAgZWxzZQorCSMgTW92ZSB0aGUgLmxvIGZyb20gd2l0aGluIG9iamRpcgorCSRzaG93ICIkbXYgJGxpYm9iaiAkbG9fbGlib2JqIgorCWlmICRydW4gJG12ICRsaWJvYmogJGxvX2xpYm9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICAgICAkcm0gIiRsb2NrZmlsZSIKKyAgICBmaQorCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgbGluayBtb2RlCisgIGxpbmspCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKKyAgICBDX2NvbXBpbGVyPSIkQ0MiICMgc2F2ZSBpdCwgdG8gY29tcGlsZSBnZW5lcmF0ZWQgQyBzb3VyY2VzCisgICAgIyBDWUdOVVMgTE9DQUw6IHRyb21leS9qYXZhCisgICAgIyBBbHdheXMgcmVzcGVjdCB0aGUgQ0MgY29uZmlndXJlZCBpbiBieSBsdGNvbmZpZy4KKyAgICAjIENDPSIkbm9ub3B0IgorICAgICMgRU5EIENZR05VUyBMT0NBTAorICAgIGNhc2UgIiRob3N0IiBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQorICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAorICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAorICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQorICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9rYXRpb24uCisgICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubworCisgICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKKyAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90CisgICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQorICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCisgICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworCisgICAgICAjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGRsbHMgb24gV2luZG93cworICAgICAgIyBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKKyMgLyogbHRkbGwuYyBzdGFydHMgaGVyZSAqLworIyAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyMgI3VuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgI2luY2x1ZGUgPHN0ZGlvLmg+CisjCisjIEJPT0wgQVBJRU5UUlkgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCk7CisjCisjICNpbmNsdWRlIDxjeWd3aW4vY3lnd2luX2RsbC5oPgorIyBERUNMQVJFX0NZR1dJTl9ETEwoIERsbE1haW4gKTsKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBpbXBvcnQgbGlicmFyaWVzCisgICAgICAjIG9uIFdpbmRvd3MgZm9yIGRsbHMgd2hpY2ggbGFjayB0aGVtLiBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUKKyAgICAgICMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKKyMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KKyMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIAorIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxpYnRvb2wuCisjIAorIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMgICovCisjIAorIyAgI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmKCkgKi8KKyMgICNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGZvciBvcGVuKCksIGxzZWVrKCksIHJlYWQoKSAqLworIyAgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCisjICAjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3Igc3RyZHVwKCkgKi8KKyMgCisjICBzdGF0aWMgdW5zaWduZWQgaW50CisjICBwZV9nZXQxNiAoZmQsIG9mZnNldCkKKyMgICAgICAgaW50IGZkOworIyAgICAgICBpbnQgb2Zmc2V0OworIyAgeworIyAgICB1bnNpZ25lZCBjaGFyIGJbMl07CisjICAgIGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisjICAgIHJlYWQgKGZkLCBiLCAyKTsKKyMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7CisjICB9CisjIAorIyAgc3RhdGljIHVuc2lnbmVkIGludAorIyAgcGVfZ2V0MzIgKGZkLCBvZmZzZXQpCisjICAgICAgaW50IGZkOworIyAgICAgIGludCBvZmZzZXQ7CisjICB7CisjICAgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyMgICAgcmVhZCAoZmQsIGIsIDQpOworIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOworIyAgfQorIyAKKyMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyMgIHBlX2FzMzIgKHB0cikKKyMgICAgICAgdm9pZCAqcHRyOworIyAgeworIyAgICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOworIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOworIyAgfQorIyAKKyMgIGludAorIyAgbWFpbiAoYXJnYywgYXJndikKKyMgICAgICBpbnQgYXJnYzsKKyMgICAgICBjaGFyICphcmd2W107CisjICB7CisjICAgICAgaW50IGRsbDsKKyMgICAgICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOworIyAgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7CisjICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG5leHA7CisjICAgICAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7CisjICAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKKyMgCisjICAgICAgZmlsZW5hbWUgPSBhcmd2WzFdOworIyAKKyMgICAgICBkbGwgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7CisjICAgICAgaWYgKCFkbGwpCisjICAJcmV0dXJuIDE7CisjIAorIyAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWU7CisjICAgIAorIyAgICAgIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQorIyAgCWlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyAgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQorIyAgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKKyMgCisjICAgICAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOworIyAgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOworIyAgICAgIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKKyMgCisjICAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLworIyAgCXJldHVybiAxOworIyAKKyMgICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKKyMgICAgICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOworIyAgICAgIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsyKTsKKyMgICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCisjICAJICAgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOworIyAKKyMgICAgICBleHBwdHIgPSAwOworIyAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKKyMgICAgICB7CisjICAJY2hhciBzbmFtZVs4XTsKKyMgIAl1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7CisjICAJdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7CisjICAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7CisjICAJdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKKyMgIAlsc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKKyMgIAlyZWFkKGRsbCwgc25hbWUsIDgpOworIyAgCWlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKKyMgIAl7CisjICAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKKyMgIAkgICAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCisjICAJCWV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKKyMgIAkgICAgYnJlYWs7CisjICAJfQorIyAgICAgIH0KKyMgCisjICAgICAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoZXhwb3J0X3NpemUpOworIyAgICAgIGxzZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOworIyAgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOworIyAgICAgIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKKyMgCisjICAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOworIyAgICAgIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOworIyAKKyMgICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKKyMgICAgICBmb3IgKGkgPSAwOyBpPG5leHA7IGkrKykKKyMgICAgICB7CisjICAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7CisjICAJcHJpbnRmICgiXHQlcyBAICVsZCA7XG4iLCBlcnZhK25hbWVfcnZhLCAxKyBpKTsKKyMgICAgICB9CisjIAorIyAgICAgIHJldHVybiAwOworIyAgfQorIyAvKiBpbXBnZW4uYyBlbmRzIGhlcmUgKi8KKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIGNvbXBpbGVfY29tbWFuZD0iJENDIgorICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRDQyIKKworICAgIGNvbXBpbGVfcnBhdGg9CisgICAgZmluYWxpemVfcnBhdGg9CisgICAgY29tcGlsZV9zaGxpYnBhdGg9CisgICAgZmluYWxpemVfc2hsaWJwYXRoPQorICAgIGNvbnZlbmllbmNlPQorICAgIG9sZF9jb252ZW5pZW5jZT0KKyAgICBkZXBsaWJzPQorICAgIGxpbmtvcHRzPQorCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCisgICAgICBldmFsIGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlggXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKKyAgICBlbHNlCisgICAgICBsaWJfc2VhcmNoX3BhdGg9CisgICAgZmkKKyAgICAjIG5vdyBwcmVwZW5kIHRoZSBzeXN0ZW0tc3BlY2lmaWMgb25lcworICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wkbGliX3NlYXJjaF9wYXRoXCIKKyAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCisgICAgCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9CisgICAgbHRsaWJzPQorICAgIG1vZHVsZT1ubworICAgIG9ianM9CisgICAgcHJlbG9hZD1ubworICAgIHByZXY9CisgICAgcHJldmFyZz0KKyAgICByZWxlYXNlPQorICAgIHJwYXRoPQorICAgIHhycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdGhyZWFkX3NhZmU9bm8KKyAgICB2aW5mbz0KKworICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCisJaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCisJZmkKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwlicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwljYXNlICIkcHJldiIgaW4KKwlvdXRwdXQpCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAiJHByZXYiIGluCisJZGxmaWxlc3xkbHByZWZpbGVzKQorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgICBwcmVsb2FkPXllcworCSAgZmkKKwkgIGNhc2UgIiRhcmciIGluCisJICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgorCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKikKKwkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKwkgICAgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgICBwcmV2PQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlleHBzeW1zKQorCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCisJICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICAgIGV4aXQgMQorCSAgZmkKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJwYXRoKQorCSAgcnBhdGg9IiRycGF0aCAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhycGF0aCkKKwkgIHhycGF0aD0iJHhycGF0aCAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCSopCisJICBldmFsICIkcHJldj1cIlwkYXJnXCIiCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgcHJldmFyZz0iJGFyZyIKKworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgIC1hbGwtc3RhdGljKQorCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hbGxvdy11bmRlZmluZWQpCisJIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgorCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCisJY29udGludWUKKwk7OworCisgICAgICAtYXZvaWQtdmVyc2lvbikKKwlhdm9pZF92ZXJzaW9uPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRsb3BlbikKKwlwcmV2PWRsZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbHByZW9wZW4pCisJcHJldj1kbHByZWZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LWR5bmFtaWMpCisJaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiAhPSB5ZXM7IHRoZW4KKwkgIGV4cG9ydF9keW5hbWljPXllcworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKwkgIGVsc2UKKwkgICAgYXJnPQorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMiCisJICBleGl0IDEKKwlmaQorCWlmIHRlc3QgIiRhcmciID0gIi1leHBvcnQtc3ltYm9scyI7IHRoZW4KKwkgIHByZXY9ZXhwc3ltcworCWVsc2UKKwkgIHByZXY9ZXhwc3ltc19yZWdleAorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtTCopCisJZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi1MXCguKlwpJCVcMSUnYAorCWNhc2UgIiRkaXIiIGluCisJLyogfCBbQS1aYS16XTpbL1xcXSopCisJICAjIEFkZCB0aGUgY29ycmVzcG9uZGluZyBoYXJkY29kZV9saWJkaXJfZmxhZywgaWYgaXQgaXMgbm90IGlkZW50aWNhbC4KKwkgIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgLUwkZGlyJyBjYW5ub3Qgc3BlY2lmeSBhIHJlbGF0aXZlIGRpcmVjdG9yeSIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKwljYXNlICIgJGRlcGxpYnMgIiBpbgorCSoiICRhcmcgIiopIDs7CisJKikgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyI7OworCWVzYWMKKwljYXNlICIgJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJKiIgJGRpciAiKikgOzsKKwkqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciI7OworCWVzYWMKKwljYXNlICIkaG9zdCIgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKKwkgIGRsbHNlYXJjaGRpcj1gY2QgIiRkaXIiICYmIHB3ZCB8fCBlY2hvICIkZGlyImAKKwkgIGNhc2UgIjokZGxsc2VhcmNocGF0aDoiIGluCisJICA6OikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaGRpciI7OworCSAgKiI6JGRsbHNlYXJjaGRpcjoiKikgOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCTs7CisKKyAgICAgIC1sKikKKwlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJaWYgdGVzdCAiJG1vZHVsZSIgIT0geWVzOyB0aGVuCisJICBtb2R1bGU9eWVzCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCSAgZWxzZQorCSAgICBhcmc9CisJICBmaQorCWZpCisJOzsKKwkKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbykgcHJldj1vdXRwdXQgOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwl4cnBhdGg9IiR4cnBhdGggImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYykKKwkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KKwlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC10aHJlYWQtc2FmZSkKKwl0aHJlYWRfc2FmZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisJcHJldj12aW5mbworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgIiRhcmciIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJOzsKKworICAgICAgKi5vIHwgKi5vYmogfCAqLmEgfCAqLmxpYikKKwkjIEEgc3RhbmRhcmQgb2JqZWN0LgorCW9ianM9IiRvYmpzICRhcmciCisJOzsKKworICAgICAgKi5sbykKKwkjIEEgbGlicmFyeSBvYmplY3QuCisJaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW4iID0geWVzOyB0aGVuCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICBlbHNlCisJICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgIHByZXY9ZGxwcmVmaWxlcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgIHByZXY9CisJZmkKKwlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgorCTs7CisKKyAgICAgICoubGEpCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgorCisJZGxuYW1lPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAorCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGUgaW5zdGFsbGVkLgorCWluc3RhbGxlZD15ZXMKKworCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCWNhc2UgIiRhcmciIGluCisJKi8qIHwgKlxcKikgLiAkYXJnIDs7CisJKikgLiAuLyRhcmcgOzsKKwllc2FjCisKKwkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCisJbGlua2xpYj0KKwlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisJICBsaW5rbGliPSIkbCIKKwlkb25lCisKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCisJICBleGl0IDEKKwlmaQorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJbmFtZT1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKKworCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgIGRpcj0iJGxpYmRpciIKKwllbHNlCisJICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCSAgaWYgdGVzdCAiWCRkaXIiID0gIlgkYXJnIjsgdGhlbgorCSAgICBkaXI9IiRvYmpkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGRpci8kb2JqZGlyIgorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyI7IHRoZW4KKwkgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicworCSAgdGVtcF9kZXBsaWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICIkZGVwbGliIiBpbgorCSAgICAtUiopIHRlbXBfeHJwYXRoPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAorCQkgY2FzZSAiICRycGF0aCAkeHJwYXRoICIgaW4KKwkJICoiICR0ZW1wX3hycGF0aCAiKikgOzsKKwkJICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJIGVzYWM7OworCSAgICAtTCopIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgJHRlbXBfZGVwbGlicyAiIGluCisJCSAqIiAkZGVwbGliICIqKSA7OworCQkgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRkZXBsaWIiOzsKKwkJIGVzYWM7OworCSAgICAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OworCSAgICBlc2FjCisJICBkb25lCisJICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCisJZmkKKworCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCisJICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgZGVwbGlicz0iJGRlcGxpYnMkZGVwZW5kZW5jeV9saWJzIgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKKwkgIGNvbnRpbnVlCisJZmkKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fCB0ZXN0ICIkZGxvcGVuIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkgICAgcHJldj1kbHByZWZpbGVzCisJICBlbHNlCisJICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCisJICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgZmkKKwlmaQorCisJIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKKwkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgorCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKKwkgIGVsc2UKKwkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKKwkgIGZpCisJICBwcmV2PQorCWZpCisKKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9IiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzICRhcmciCisJICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGZpCisKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAiJGRpciIgaW4KKwkgIC8qIHwgW0EtWmEtel06Wy9cXF0qKSBhYnNkaXI9IiRkaXIiIDs7CisJICAqKQorCSAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJICAgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsaWJkaXInIiAxPiYyCisJICAgICAgZXhpdCAxCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICAKKwkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KKwkgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICMgc2VhcmNoIHBhdGgsIHVubGVzcyB0aGV5IGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCAtUi4KKwkgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKyAJICAqIiAkYWJzZGlyICIqKSA7OworCSAgKikKKwkgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIiAKKwkgICAgZXNhYworCSAgICA7OworIAkgIGVzYWMKKworCSAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorIAkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKQorCSAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCisJICAgIGVzYWMKKwkgICAgOzsKKyAJICBlc2FjCisKKwkgIGxpYl9saW5rZWQ9eWVzCisJICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgorCSAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCisJICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KKwkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKKwkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkZGlyLyRsaW5rbGliIgorCSAgICAgIGNhc2UgIiRob3N0IiBpbgorCSAgICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQorCQlkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCisJCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgorCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiCisJCWVsc2UKKwkJICBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIgorCQlmaQorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorCSAgICAgIGNhc2UgIiRob3N0IiBpbgorCSAgICAgICotKi1zdW5vcyopCisJCWNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICAgKiIgLUwkZGlyICIqKSA7OworCSAgICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKKwkgICAgICBlc2FjCisJICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCisJICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIC1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KKwkgICAgICAqIjokZGlyOiIqKSA7OworCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiI7OworCSAgICAgIGVzYWMKKwkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKKwkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgorCSAgICBlbHNlCisJICAgICAgbGliX2xpbmtlZD1ubworCSAgICBmaQorCSAgICA7OworCisJICByZWxpbmspCisJICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhYnNkaXIvJGxpbmtsaWIiCisJICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFic2Rpci8kbGlua2xpYiIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkgICAgICAqIiAtTCRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGFic2RpciI7OworCSAgICAgIGVzYWMKKwkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKKwkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRhYnNkaXIgLWwkbmFtZSIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KKwkgICAgICAqIjokYWJzZGlyOiIqKSA7OworCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWJzZGlyOiI7OworCSAgICAgIGVzYWMKKwkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKKwkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgorCSAgICBlbHNlCisJICAgICAgbGliX2xpbmtlZD1ubworCSAgICBmaQorCSAgICA7OworCisJICAqKQorCSAgICBsaWJfbGlua2VkPW5vCisJICAgIDs7CisJICBlc2FjCisKKwkgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKKwkgICAgZXhpdCAxCisJICBmaQorCisJICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKKwkgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLUwkbGliZGlyICIqKSA7OworCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKKwkgICAgZXNhYworCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgorCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkgICAgY2FzZSAiOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IiBpbgorCSAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiI7OworCSAgICBlc2FjCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCisJICBlbHNlCisJICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisJICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLUwkZGlyICIqKSA7OworCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKKwkgICAgZXNhYworCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgorCSAgZmkKKwllbHNlCisJICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KKwkgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgorCSAgICBleGl0IDEKKwkgIGZpCisKKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorCSAgZWxzZQorCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLUwkZGlyICIqKSA7OworCSAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIjs7CisJICAgIGVzYWMKKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCisJICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLUwkZGlyICIqKSA7OworCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIiOzsKKwkgICAgZXNhYworCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgorCSAgZmkKKwlmaQorCisJIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAiJGFyZyIgaW4KKwkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworCisgICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBvbGRsaWJzPQorICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKKyAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgorCisgICAgY2FzZSAiJG91dHB1dCIgaW4KKyAgICAiIikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworCisgICAgKi5hIHwgKi5saWIpCisgICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byBhcmNoaXZlcyIgMT4mMgorCWV4aXQgMQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBvbGRsaWJzPSIkb3V0cHV0IgorICAgICAgOzsKKworICAgICoubGEpCisgICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCisgICAgICBjYXNlICIkb3V0cHV0bmFtZSIgaW4KKyAgICAgIGxpYiopCisJbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRtb2R1bGUiID0gbm87IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKKwkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCWVsc2UKKwkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCisJb3V0cHV0X29iamRpcj0iJG9iamRpciIKKyAgICAgIGVsc2UKKwlvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgorICAgICAgZmkKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCisJZXhpdCAxCisgICAgICBmaQorCisgICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PworICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCisJICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBzaGFyZWQgbGlicmFyaWVzIGludG8gbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKKwkgZXhpdCAxCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIHNldCBkdW1teSAkcnBhdGgKKyAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgorICAgICAgZmkKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKKworICAgICAgb2xkbGlicz0KKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KKwkgIGxpYmV4dD1hbAorCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQorCSAgYnVpbGRfb2xkX2xpYnM9eWVzCisJZmkKKwlkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorCisJaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JworCXNldCBkdW1teSAkdmluZm8gMCAwIDAKKwlJRlM9IiRzYXZlX2lmcyIKKworCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwljdXJyZW50PSIkMiIKKwlyZXZpc2lvbj0iJDMiCisJYWdlPSIkNCIKKworCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCisJY2FzZSAiJGN1cnJlbnQiIGluCisJMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJY2FzZSAiJHJldmlzaW9uIiBpbgorCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJY2FzZSAiJGFnZSIgaW4KKwkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCisJbm9uZSkgOzsKKworCWlyaXgpCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kcmV2aXNpb24KKwkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KKwkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCisJICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAorCSAgICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKKwkgIGRvbmUKKwkgIDs7CisKKwlsaW51eCkKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlvc2YpCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRhZ2UKKwkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KKwkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKKwkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXN1bm9zKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7CisJICA7OworCisJd2luZG93cykKKwkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seQorCSAgIyB3YW50IG9uZSBleHRlbnNpb24gb24gV2luZG93cyA5NS4KKwkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iLSRtYWpvci0kYWdlLSRyZXZpc2lvbiIKKwkgIDs7CisKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCisJICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCisJaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3RyaW5nPSIwLjAiCisJICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICAgIHZlcnN1ZmZpeD0KKwkgIGVsc2UKKwkgICAgdmVyc3VmZml4PSIuMC4wIgorCSAgZmkKKwlmaQorCisJIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCisJaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3VmZml4PQorCSAgdmVyc3RyaW5nPSIiCisJZmkKKwkKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisJaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisJICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgIGZpCisJZWxzZQorCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisJZmkKKworCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCisJY2FzZSAiJGhvc3QiIGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCisJICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCisJICA7OworCSopCisJICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMuCisJICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCisJICA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KKyAgICAgIGlmIHRlc3QgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KKwkkc2hvdyAiJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKKwkkcnVuICR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKKyAgICAgIGVsc2UKKwkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgorCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCisJc3RhdHVzPSQ/CisJaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgorCSAgZXhpdCAkc3RhdHVzCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KKwlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCisJIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgorCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KKwluYW1lX3NhdmU9JG5hbWUKKwlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKKwlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKKwl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4CisJbWFqb3Jfc2F2ZT0kbWFqb3IKKwkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluaworCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bworCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PworCXJlbGVhc2U9IiIKKwl2ZXJzdWZmaXg9IiIKKwltYWpvcj0iIgorCW5ld2RlcGxpYnM9CisJZHJvcHBlZGRlcHM9bm8KKwljYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCisJcGFzc19hbGwpCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJCSAgICA7OyAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KKwkJICAgICAgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKwkJICAgICAgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KKwkJICAgICAgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAorCQkgICAgICAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3VyLgorCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJHJtIGNvbmZ0ZXN0LmMKKwkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKwkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQorRU9GCisJICAkcm0gY29uZnRlc3QKKwkgICRDX2NvbXBpbGVyIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKKwkgIGlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCisJICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgbmFtZT0iYGV4cHIgJGkgOiAnLWxcKC4qXCknYCIKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKwkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKKwkJc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQlkZXBsaWJfbWF0Y2g9JDIKKwkJaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgZWNobworCQkgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRpLiIKKwkJICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkJZmkKKwkgICAgICBlbHNlCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgIyBFcnJvciBvY2N1cmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UgdGhlIHNpdHVhdGlvbjoKKwkgICAgIyBDb21waWxlIGEgc2VwZXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgorCSAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisJICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgorCQkkcm0gY29uZnRlc3QKKwkJJENfY29tcGlsZXIgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQorCQkjIERpZCBpdCB3b3JrPworCQlpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgorCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCisJCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCisJCSAgICBkZXBsaWJfbWF0Y2g9JDIKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICBlY2hvCisJCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRpLiIKKwkJICAgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkJICAgIGZpCisJCWVsc2UKKwkJICBkcm9wcGVkZGVwcz15ZXMKKwkJICBlY2hvCisJCSAgZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgIGVjaG8gIioqKiAgbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKwkgIGRlcGxpYnM9JG5ld2RlcGxpYnMKKwkgIDs7CisJZmlsZV9tYWdpYyopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCIkMiBcKC4qXClcImAiCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9ImBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgIgorCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKwkgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgorCSAgICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkgICAgICBmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoOyBkbworCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCisJCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RsaWIiIDI+L2Rldi9udWxsIFwKKwkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KKwkJCWNvbnRpbnVlIAorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8IHNlZCAncy8uKiAtPiAvLydgCisJCQljYXNlICIkcG90bGlibGluayIgaW4KKwkJCS8qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7CisJCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7CisJCQllc2FjCisJCSAgICAgIGRvbmUKKwkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIFwKKwkJCSB8IHNlZCAxMHEgXAorCQkJIHwgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICAgIGRvbmUKKwkgICAgICBkb25lCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgIGZpCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwlub25lIHwgdW5rbm93biB8ICopIG5ld2RlcGxpYnM9IiIKKwkgIGlmICRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKKwkgICAgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnIC1lICdzL1sgCV0vL2cnIHwKKwkgICAgIGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCisJICAgIGVjaG8KKwkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgorCSAgICBlbHNlCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCisJICAgIGRyb3BwZWRkZXBzPXllcworCSAgZmkKKwkgIDs7CisJZXNhYworCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKKwltYWpvcj0kbWFqb3Jfc2F2ZQorCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQorCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQorCW5hbWU9JG5hbWVfc2F2ZQorCisJaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgZWNobworCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKKwkgICAgZWNobyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCisJICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgICBkbG5hbWU9CisJICAgIGxpYnJhcnlfbmFtZXM9CisJICBlbHNlCisJICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCisJICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgdGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJZGVwbGlicz0kbmV3ZGVwbGlicworCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorIAorCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXJlYWxuYW1lPSIkMiIKKwlzaGlmdDsgc2hpZnQKKworCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKwllbHNlCisJICBzb25hbWU9IiRyZWFsbmFtZSIKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJZm9yIGxpbmsKKwlkbworCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgorCWRvbmUKKworCSMgRW5zdXJlIHRoYXQgd2UgaGF2ZSAubyBvYmplY3RzIGZvciBsaW5rZXJzIHdoaWNoIGRpc2xpa2UgLmxvCisJIyAoZS5nLiBhaXgpIGluY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCisJZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KKwkgIG9sZG9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICB0ZXN0IC1mICRvbGRvYmogfHwgJHtMTl9TfSAkb2JqICRvbGRvYmoKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCisJaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIGZpCisJZWxzZQorCSAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbworCSAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCisJICAgIHhkaXI9IiR4bGliIngKKwkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICR4ZGlyIgorCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKwkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKKwkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgorCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCisJICAgICRydW4gbWtkaXIgIiR4ZGlyIgorCSAgICBzdGF0dXM9JD8KKwkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCisJICAgICAgZXhpdCAkc3RhdHVzCisJICAgIGZpCisJICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggLi4vJHhsaWIpIgorCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggLi4vXCR4bGliKSIgfHwgZXhpdCAkPworCisJICAgIGxpYm9ianM9IiRsaWJvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisJICBkb25lCisJZmkKKworCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCisJICBsaW5rb3B0cz0iJGxpbmtvcHRzICRmbGFnIgorCWZpCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICBleHBvcnRfc3ltYm9scz0iJG9iamRpci8kbGlibmFtZS5leHAiCisJICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scworCSAgICBldmFsIGNtZHM9XCIkZXhwb3J0X3N5bWJvbHNfY21kc1wiCisJICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgJHNob3cgIiRjbWQiCisJICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgICAkc2hvdyAiZWdyZXAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKKwkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCisJICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCWVsc2UKKwkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCWZpCisJSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwlmb3IgY21kIGluICRjbWRzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICAkc2hvdyAiJGNtZCIKKwkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKworCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisJZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisJICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCisJICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKwkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPworCSAgZmkKKwlkb25lCisKKwkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KKwkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgorCSAgZGxuYW1lPSIkc29uYW1lIgorCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgICoubG8gfCAqLm8gfCAqLm9iaikKKyAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIG9iamVjdHMiIDE+JjIKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBjYXNlICIkb3V0cHV0IiBpbgorICAgICAgKi5sbykKKwlpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwlsaWJvYmo9IiRvdXRwdXQiCisJb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwk7OworICAgICAgKikKKwlsaWJvYmo9CisJb2JqPSIkb3V0cHV0IgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KKyAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagorCisgICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKyAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCisgICAgICBvdXRwdXQ9IiRvYmoiCisgICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgorICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJSUZTPSIkc2F2ZV9pZnMiCisJJHNob3cgIiRjbWQiCisJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKworICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCisgICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiBleGl0IDAKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0IDAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KKwkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgorCXJlbG9hZF9vYmpzPSIkbGlib2JqcyIKKwlvdXRwdXQ9IiRsaWJvYmoiCisJZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKKwlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgICRzaG93ICIkY21kIgorCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorICAgICAgZWxzZQorCSMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgorCSRzaG93ICRybSAkbGlib2JqCisJJHJ1biAkcm0gJGxpYm9iagorCSRzaG93ICIkTE5fUyAkb2JqICRsaWJvYmoiCisJJHJ1biAkTE5fUyAkb2JqICRsaWJvYmogfHwgZXhpdCAkPworICAgICAgZmkKKworICAgICAgZXhpdCAwCisgICAgICA7OworCisgICAgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgKikKKyAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzOyB0aGVuCisJaWYgdGVzdCAiJGRsb3BlbiIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCisJICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgorCWZpIAorICAgICAgZmkKKyAgICAKKyAgICAgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzICYmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSBubzsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBcYC1kbG9wZW4gc2VsZicgcmVxdWlyZXMgXGAtZXhwb3J0LWR5bmFtaWMnIiAxPiYyCisJZXhpdCAxCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorCSAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisJICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCisJICBmaQorCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKworCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKKworICAgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgorCW91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCisgICAgICBlbHNlCisJb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZGxzeW1zPQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCisJY2FzZSAiJGRsc3ltcyIgaW4KKwkiIikgOzsKKwkqLmMpCisJICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCSAgbmxpc3Q9IiRvYmpkaXIvJHtvdXRwdXR9Lm5tIgorCisJICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KKwkgICAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKwkgICAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKwkgIGVsc2UKKwkgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgorCSAgICAkcnVuICRta2RpciAkb2JqZGlyCisJICAgIHN0YXR1cz0kPworCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvYmpkaXI7IHRoZW4KKwkgICAgICBleGl0ICRzdGF0dXMKKwkgICAgZmkKKwkgIGZpCisKKwkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisJICAkc2hvdyAiY3JlYXRpbmcgJG9iamRpci8kZGxzeW1zIgorCisJICAkZWNobyA+ICIkb2JqZGlyLyRkbHN5bXMiICJcCisvKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKy8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCisjZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAgIGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgorCisJICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KKwkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgICAgZG9uZQorCisJICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgJHJ1biBldmFsICdlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKwkgICAgCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKworCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvYmpkaXIvJG91dHB1dC5leHAiCisJICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgJHJ1biBldmFsICJzZWQgLW4gLWUgJy9eOiBAUFJPR1JBTUAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBlbHNlCisJICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgJHJ1biBldmFsICJzZWQgLWUgJ3MvXChbXVsuKl4kXVwpL1xcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvYmpkaXIvJG91dHB1dC5leHAiJworCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG9iamRpci8kb3V0cHV0LmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKwkgIGZpCisKKwkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgorCSAgICBuYW1lPWBlY2hvICIkYXJnIiB8IHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAkcnVuIGV2YWwgJ2VjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KKwkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAgIGVncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCisJICAgIGZpCisKKwkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwgc29ydCArMiB8IHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgorCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJworCSAgICBlbHNlCisJICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisJICAgIGZpCisKKwkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisKKyN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scworCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCitjb25zdCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdF9wdHJfdCBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorIgorCisJICAgIHNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcIlwxXCIsIChsdF9wdHJfdCkgMH0sL3AnIFwKKwkJLWUgJ3MvXi4gXChbXiBdKlwpIFwoW14gXSpcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvcCcgXAorCQkgIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisKKwkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwkgIGZpCisKKwkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KKyAgICAgICAgICBjYXNlICIkaG9zdCIgaW4KKwkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAorCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCisJICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCisJICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KKwkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCisJICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtRFBJQyAtREZSRUVCU0RfV09SS0FST1VORCI7OworCSAgICBlc2FjCisJICBlc2FjCisKKwkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJENfY29tcGlsZXIgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCisJICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRDX2NvbXBpbGVyIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPworCisJICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy4ke29iamV4dH0lImAKKwkgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy4ke29iamV4dH0lImAKKwkgIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCSMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisJIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQorCSMgcmVhbGx5IHdhcyByZXF1aXJlZC4KKworCSMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisJY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCisJIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCisJJHNob3cgIiRsaW5rX2NvbW1hbmQiCisJJHJ1biBldmFsICIkbGlua19jb21tYW5kIgorCWV4aXQgJD8KKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgorCXJwYXRoPQorCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCisJICBjYXNlICIkZGlyIiBpbgorCSAgLyogfCBbQS1aYS16XTpbL1xcXSopCisJICAgICMgQWJzb2x1dGUgcGF0aC4KKwkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICA7OworCSAgKikKKwkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgorCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwl0ZW1wX3JwYXRoPSIkcnBhdGgiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCisgICAgICBmaQorCisgICAgICBjb21waWxlX3Zhcj0KKyAgICAgIGZpbmFsaXplX3Zhcj0KKyAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KKwkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgZG9uZQorCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKwkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCQorCSMgQUdIISBGbGFtZSB0aGUgQUlYIGFuZCBIUC1VWCBwZW9wbGUgZm9yIG1lLCB3aWxsIHlhPworCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgorCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAorCSAgZWxzZQorCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKKwkgICAgcmVsaW5rX2NvbW1hbmQ9CisJICBmaQorCWVsc2UKKwkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAorICAgICAgCisgICAgICAjIENyZWF0ZSB0aGUgYmluYXJ5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCB0aGVuIHdyYXAgaXQuCisgICAgICBpZiB0ZXN0ICEgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KKwkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgorCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCisJc3RhdHVzPSQ/CisJaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb2JqZGlyOyB0aGVuCisJICBleGl0ICRzdGF0dXMKKwlmaQorICAgICAgZmkKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKyAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKKworICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCisgICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KKworICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGZpCisKKyAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgorICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKwljYXNlICIkMCIgaW4KKwkvKiB8IFtBLVphLXpdOlsvXFxdKikgcWVjaG89IiRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOzsKKwkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyQwIC0tZmFsbGJhY2stZWNobyI7OworCWVzYWMKKwlxZWNobz1gJGVjaG8gIlgkcWVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZWxzZQorCXFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGZpCisKKyAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKKwkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgorCWNhc2UgJG91dHB1dCBpbgorCSAgKi5leGUpIG91dHB1dD1gZWNobyAkb3V0cHV0fHNlZCAncywuZXhlJCwsJ2AgOzsKKwllc2FjCisJJHJtICRvdXRwdXQKKwl0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAxIiAxIDIgMTUKKworCSRlY2hvID4gJG91dHB1dCAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KK2lmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCisKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6CisgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9JyRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBlY2hvPVwiJHFlY2hvXCIKKyAgICBmaWxlPVwiXCQwXCIKKyAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgorICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICAgICAgc2hpZnQKKyAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCisgICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQorICAgICAgOgorICAgIGVsc2UKKyAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KKyAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQorICAgIGZpCisgIGZpXAorIgorCSRlY2hvID4+ICRvdXRwdXQgIlwKKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICAvKiB8IFtBLVphLXpdOlsvXFxdKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7CisgICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7CisgICAgICBlc2FjCisgICAgZmkKKworICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAorICBkb25lCisKKyAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KKyAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAorICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgorIgorCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgIGVjaG8gPj4gJG91dHB1dCAiXAorICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyAgCisgIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fCBcXAorICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgc2VkIDFxXGA7IFxcCisgICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KKworICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCisKKyAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgorICAgICAgJG1rZGlyIFwiXCRwcm9nZGlyXCIKKyAgICBlbHNlCisgICAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgICBmaSIKKworCSAgZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIChjZCBcIlwkdGhpc2RpclwiICYmIGV2YWwgXCRyZWxpbmtfY29tbWFuZCk7IHRoZW4gOgorICAgICAgZWxzZQorCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorCWV4aXQgMQorICAgICAgZmkKKyAgICBmaQorCisgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8CisgICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7CisgICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KKyAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgZmkiCisJZWxzZQorCSAgZWNobyA+PiAkb3V0cHV0ICJcCisgIHByb2dyYW09JyRvdXRwdXRuYW1lJworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorIgorCWZpCisKKwllY2hvID4+ICRvdXRwdXQgIlwKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKyIKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cgfCAqLSotb3MyKikKKwkgICMgd2luMzIgc3lzdGVtcyBuZWVkIHRvIHVzZSB0aGUgcHJvZyBwYXRoIGZvciBkbGwKKwkgICMgbG9va3VwIHRvIHdvcmsKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIGV4ZWMgXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCSopCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICAjIEV4cG9ydCB0aGUgcGF0aCB0byB0aGUgcHJvZ3JhbS4KKyAgICAgIFBBVEg9XCJcJHByb2dkaXI6XCRQQVRIXCIKKyAgICAgIGV4cG9ydCBQQVRICisKKyAgICAgIGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisJZXNhYworCSRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgorICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgorICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCisJY2htb2QgK3ggJG91dHB1dAorICAgICAgZmkKKyAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KKyAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbworCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCisJb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKKwlhZGRsaWJzPSIkY29udmVuaWVuY2UiCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KKwkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCisJICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwllbHNlCisJICBvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianNfc2F2ZSIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgIyBBZGQgaW4gbWVtYmVycyBmcm9tIGNvbnZlbmllbmNlIGFyY2hpdmVzLgorICAgICAgZm9yIHhsaWIgaW4gJGFkZGxpYnM7IGRvCisJIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorCXhkaXI9IiR4bGliIngKKwlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJHhkaXIiCisJeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisJJHNob3cgIiR7cm19ciAkeGRpciIKKwkkcnVuICR7cm19ciAiJHhkaXIiCisJJHNob3cgIm1rZGlyICR4ZGlyIgorCSRydW4gbWtkaXIgIiR4ZGlyIgorCXN0YXR1cz0kPworCWlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgorCSAgZXhpdCAkc3RhdHVzCisJZmkKKwkkc2hvdyAiKGNkICR4ZGlyICYmICRBUiB4IC4uLyR4bGliKSIKKwkkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggLi4vXCR4bGliKSIgfHwgZXhpdCAkPworCisJb2xkb2Jqcz0iJG9sZG9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKKyAgICAgIGRvbmUKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc1wiCisgICAgICBlbHNlCisJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorICAgICAgZmkKKyAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCUlGUz0iJHNhdmVfaWZzIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KKyAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgorICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCisgICAgZmkKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgIiRvdXRwdXQiIGluCisgICAgKi5sYSkKKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgorCWRvbmUKKwlkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgorICAgICAgZmkKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSRlY2hvID4gJG91dHB1dCAiXAorIyAkb3V0cHV0IC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD1ubworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpcidcCisiCisKKwkkcm0gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKKwlzZWQgJ3MvXmluc3RhbGxlZD1ubyQvaW5zdGFsbGVkPXllcy8nIFwKKwkgIDwgIiRvdXRwdXQiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkgfHwgZXhpdCAxCisgICAgICBmaQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgorICAgICAgJHJ1biBldmFsICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIgfHwgZXhpdCAkPworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCisgIGluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKKworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaDsgdGhlbgorICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICBlbHNlCisgICAgICBpbnN0YWxsX3Byb2c9CisgICAgICBhcmc9IiRub25vcHQiCisgICAgZmkKKworICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KKyAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgIiRhcmciIGluCisgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisgICAgICBhcmc9IlwiJGFyZ1wiIgorICAgICAgOzsKKyAgICBlc2FjCisgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCisJZmlsZXM9IiRmaWxlcyAkZGVzdCIKKwlkZXN0PSIkYXJnIgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpIHByZXY9Ii1mIiA7OworICAgICAgLWcpIHByZXY9Ii1nIiA7OworICAgICAgLW0pIHByZXY9Ii1tIiA7OworICAgICAgLW8pIHByZXY9Ii1vIiA7OworICAgICAgLXMpCisJc3RyaXBtZT0iIC1zIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIC0qKSA7OworCisgICAgICAqKQorCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKwlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwkgIHByZXY9CisJZWxzZQorCSAgZGVzdD0iJGFyZyIKKwkgIGNvbnRpbnVlCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgorICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgorICAgICAgZWxzZQorCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgorICAgICAgZmkKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCisgICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzCisgICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisgICAgICBmaQorICAgIGZpCisgICAgY2FzZSAiJGRlc3RkaXIiIGluCisgICAgLyogfCBbQS1aYS16XTpbL1xcXSopIDs7CisgICAgKikKKyAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKwljYXNlICIkZmlsZSIgaW4KKwkqLmxvKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgc3RhdGljbGlicz0KKyAgICBmdXR1cmVfbGliZGlycz0KKyAgICBjdXJyZW50X2xpYmRpcnM9CisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCisgICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgorICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAqLmEgfCAqLmxpYikKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgorCTs7CisKKyAgICAgICoubGEpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0IDEKKwlmaQorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwljYXNlICIkZmlsZSIgaW4KKwkqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJKikgLiAuLyRmaWxlIDs7CisJZXNhYworCisJIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCisJICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwllbHNlCisJICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCisJICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCisJZGlyPSJgJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8iCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KKwlkaXI9IiRkaXIkb2JqZGlyIgorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KKwkgIHJlYWxuYW1lPSIkMiIKKwkgIHNoaWZ0CisJICBzaGlmdAorCisJICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCisJICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisJICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRyZWFsbmFtZSIgJiYgZGxuYW1lPQorCisJICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgIGZvciBsaW5rbmFtZQorCSAgICBkbworCSAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJGxpbmtuYW1lIiAmJiBkbG5hbWU9CisJICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgorCQkkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisJCSRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgIyBJbnN0YWxsIHRoZSBkeW5hbWljYWxseS1sb2FkYWJsZSBsaWJyYXJ5LgorCSAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIKKwkgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIiB8fCBleGl0ICQ/CisJICBmaQorCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisJICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgIGV2YWwgY21kcz1cIiRwb3N0aW5zdGFsbF9jbWRzXCIKKwkgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJZmkKKworCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgorCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCisJaWYgdGVzdCAhIC1mICIkaW5zdG5hbWUiOyB0aGVuCisJICAjIEp1c3QgaW4gY2FzZSBpdCB3YXMgcmVtb3ZlZC4uLgorCSAgJHNob3cgIkNyZWF0aW5nICRpbnN0bmFtZSIKKwkgICRybSAiJGluc3RuYW1lIgorCSAgc2VkICdzL15pbnN0YWxsZWQ9bm8kL2luc3RhbGxlZD15ZXMvJyAiJGZpbGUiID4gIiRpbnN0bmFtZSIKKwlmaQorCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKKwkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/CisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKKwk7OworCisgICAgICAqLmxvKQorCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgorCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJY2FzZSAiJGRlc3RmaWxlIiBpbgorCSoubG8pCisJICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgOzsKKwkqLm8gfCAqLm9iaikKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKwlmaQorCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPworCWZpCisJZXhpdCAwCisJOzsKKworICAgICAgKikKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgIiRmaWxlIiBpbgorCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSAgKikgLiAuLyRmaWxlIDs7CisJICBlc2FjCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgorCSAgICBleGl0IDEKKwkgIGZpCisKKwkgIGZpbmFsaXplPXllcworCSAgZm9yIGxpYiBpbiAkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGliczsgZG8KKwkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorCSAgICBsaWJkaXI9CisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICAgICAgY2FzZSAiJGxpYiIgaW4KKwkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKKwkgICAgICAqKSAuIC4vJGxpYiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgbGliZmlsZT0iJGxpYmRpci9gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCIKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIG91dHB1dG5hbWU9CisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgorCSAgICAgIG91dHB1dG5hbWU9Ii90bXAvJCQtJGZpbGUiCisJICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgorCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCisJICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgICAgICBlbHNlCisJCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgorCQljb250aW51ZQorCSAgICAgIGZpCisJICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgorCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCisJJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/CisJdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICRybSAkb3V0cHV0bmFtZQorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCisgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/CisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdGluc3RhbGxfY21kc1wiCisgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwkkc2hvdyAiJGNtZCIKKwkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjICRTSEVMTCAkMCAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBmaW5pc2ggbW9kZQorICBmaW5pc2gpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgorICAgIGxpYmRpcnM9IiRub25vcHQiCisgICAgYWRtaW5jbWRzPQorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBkaXIKKyAgICAgIGRvCisJbGliZGlycz0iJGxpYmRpcnMgJGRpciIKKyAgICAgIGRvbmUKKworICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9jbWRzXCIKKwkgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZCIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgorCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKKwkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcworICAgICAgICRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgorICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAwCisKKyAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKKyAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworICAgICAgZWNobyAiICAgJGxpYmRpciIKKyAgICBkb25lCisgICAgZWNobworICAgIGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgorICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgIGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSBcYC1MTElCRElSJyIKKyAgICBlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisgICAgICBsaWJkaXI9TElCRElSCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICBmaQorICAgIGVjaG8KKyAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKyAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgIGV4aXQgMAorICAgIDs7CisKKyAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQorICBleGVjdXRlKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCisKKyAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgorICAgIGNtZD0iJG5vbm9wdCIKKyAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCisgICAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKKwkkZWNobyAiJGhlbHAiIDE+JjIKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGRpcj0KKyAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCisJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAiJGZpbGUiIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSopIC4gLi8kZmlsZSA7OworCWVzYWMKKworCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCisJICBjb250aW51ZQorCWZpCisKKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorCisJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCisJICBkaXI9IiRkaXIvJG9iamRpciIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCisJICBleGl0IDEKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgorCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisJOzsKKworICAgICAgKikKKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCisgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisgICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCisKKyAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCisgICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKKyAgICAgIGVsc2UKKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCisgICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgorCisgICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgorICAgIGFyZ3M9CisgICAgZm9yIGZpbGUKKyAgICBkbworICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAtKikgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICIkZmlsZSIgaW4KKwkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkgICopIC4gLi8kZmlsZSA7OworCSAgZXNhYworCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICAjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKyAgICAgIGV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb21lbnQgdmFyaWFibGVzCisgICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCisJTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KKwlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCisgICAgICBldmFsICJleGVjIFwkY21kJGFyZ3MiCisKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBleGVjIFwkY21kJGFyZ3MiCisgICAgICBleGl0IDEKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgICRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICAkZWNobyAiJGNtZCRhcmdzIgorICAgICAgZXhpdCAwCisgICAgZmkKKyAgICA7OworCisgICMgbGlidG9vbCB1bmluc3RhbGwgbW9kZQorICB1bmluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogdW5pbnN0YWxsIgorICAgIHJtPSIkbm9ub3B0IgorICAgIGZpbGVzPQorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKKyAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKyAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworICAgICAgcm1maWxlcz0iJGZpbGUiCisKKyAgICAgIGNhc2UgIiRuYW1lIiBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAuICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRuIgorCSAgICB0ZXN0ICJYJG4iID0gIlgkZGxuYW1lIiAmJiBkbG5hbWU9CisJICBkb25lCisJICB0ZXN0IC1uICIkZGxuYW1lIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRkbG5hbWUiCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgorCisJICAkc2hvdyAiJHJtICRybWZpbGVzIgorCSAgJHJ1biAkcm0gJHJtZmlsZXMKKworCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKKwkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkc2hvdyAiJGNtZCIKKwkgICAgICAkcnVuIGV2YWwgIiRjbWQiCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRzaG93ICIkY21kIgorCSAgICAgICRydW4gZXZhbCAiJGNtZCIKKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZpCisKKwkgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgorCWZpCisJOzsKKworICAgICAgKi5sbykKKwlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBvbGRvYmo9YCRlY2hvICJYJG5hbWUiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZG9iaiIKKwlmaQorCSRzaG93ICIkcm0gJHJtZmlsZXMiCisJJHJ1biAkcm0gJHJtZmlsZXMKKwk7OworCisgICAgICAqKQorCSRzaG93ICIkcm0gJHJtZmlsZXMiCisJJHJ1biAkcm0gJHJtZmlsZXMKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgICBleGl0IDAKKyAgICA7OworCisgICIiKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCisgICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworICBlc2FjCisKKyAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICBleGl0IDEKK2ZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKKworIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCitjYXNlICIkbW9kZSIgaW4KKyIiKSAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisKK1Byb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorCisgICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCistbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKKyAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCisgICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JworICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisKK01PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisKK01PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgorYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuIgorICBleGl0IDAKKyAgOzsKKworY29tcGlsZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKKyAgLXN0YXRpYyAgICAgICAgICAgYWx3YXlzIGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKKworQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKK2Zyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCisKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgIDs7CisKK2V4ZWN1dGUpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgIDs7CisKK2ZpbmlzaCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICA7OworCitpbnN0YWxsKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5CitCU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKKyAgOzsKKworbGluaykKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCisKK0xpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KK2NyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCisKK0xJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQorYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAorICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKKyAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCisgIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCisJCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKKyAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCisgIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cworICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgorICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCisgIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisJCSAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCisKK0FsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCisKK0V2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCit0cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQorb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKK29ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKK3JlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAordXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCitpcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICA7OworCit1bmluc3RhbGwpCisgICRlY2hvCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KKworUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgorT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgorICA7OworCisqKQorICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCisgICRlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKKyAgOzsKK2VzYWMKKworZWNobworJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKKworZXhpdCAwCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOnNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjoyCisjIEVuZDoKZGlmZiAtLWdpdCBhL21ha2VhbGwuYmF0IGIvbWFrZWFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNDE1ZgotLS0gL2Rldi9udWxsCisrKyBiL21ha2VhbGwuYmF0CkBAIC0wLDAgKzEsMTYgQEAKK0BlY2hvIG9mZg0KK2NoZGlyIGxpYmliZXJ0eQ0KK21ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxiZmQNCittYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQorY2hkaXIgLi5cb3Bjb2Rlcw0KK21ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxncHJvZg0KK21ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxiaW51dGlscw0KK21ha2UgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCitjaGRpciAuLlxnYXMNCittYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQorY2hkaXIgLi5cbGQNCittYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQorY2hkaXIgLi4NCmRpZmYgLS1naXQgYS9tYWtlZmlsZS52bXMgYi9tYWtlZmlsZS52bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllMzYzNAotLS0gL2Rldi9udWxsCisrKyBiL21ha2VmaWxlLnZtcwpAQCAtMCwwICsxLDcxIEBACisjCisjIG1ha2VmaWxlIGZvciBiZmQsIGJpbnV0aWxzIGFuZCBnYXMKKyMKKyMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQorIworIyBZb3UgbXVzdCB1c2UgVmVyc2lvbiAzLjc2IG9mIEdOVSBNYWtlCisjCisjCisKK2lmZXEgKCQoQVJDSCksQUxQSEEpCitDQyA9IGdjYworR0FTQ0MgPSAkKENDKQorZWxzZQorQ0MgPSBjYworR0FTQ0MgPSBnY2MKK2VuZGlmCisKK2lmZXEgKCQoQ0MpLGNjKQorICBDSEVDSy1DT01QSUxFUiA9IGNoZWNrX2NvbXBpbGVyCitlbHNlCisgIENIRUNLLUNPTVBJTEVSID0KK2VuZGlmCisKK2FsbDoJY2hlY2tfY2MgJChDSEVDSy1DT01QSUxFUikgWy5iaW51dGlsc11tYWtlZmlsZS52bXMKKwkkKENEKSBbLmJmZF0KKwlAZ21ha2UgIkNDPSQoQ0MpIgorCSQoQ0QpIFstLm9wY29kZXNdCisJQGdtYWtlICJDQz0kKENDKSIKKwkkKENEKSBbLS5saWJpYmVydHldCisJQGdtYWtlICJDQz0kKENDKSIKKwkkKENEKSBbLS5iaW51dGlsc10KKwlAZ21ha2UgIkNDPSQoQ0MpIgorCSQoQ0QpIFstLmdhc10KKwlAZ21ha2UgIkNDPSQoR0FTQ0MpIgorCSQoQ0QpIFstXQorCitjaGVja19jYzoKK2lmZXEgKCRDQywpCisJQCQoRUNITykgIlBsZWFzZSBlZGl0IE1BS0VGSUxFLlZNUyBhbmQgc2VsZWN0IGEgQyBDb21waWxlci4iCisJc3RvcAorZW5kaWYKKworY2hlY2tfY29tcGlsZXI6CisJQCQoRUNITykgIlBlcmZvcm0gYSAnJCQgQHNldHVwJyBiZWZvcmUgc3RhcnRpbmcgbWFrZSIKKworWy5iaW51dGlsc11tYWtlZmlsZS52bXM6CisJJChDRCkgWy5iaW51dGlsc10KKwkkJCBAY29uZmlndXJlCisJJChDRCkgWy1dCisKK2luc3RhbGw6IGFsbAorCSQoQ0QpIFsuYmludXRpbHNdCisJQGdtYWtlICJDQz0kKENDKSIgaW5zdGFsbAorCSQoQ0QpIFstXQorCSQoQ0QpIFsuZ2FzXQorCUBnbWFrZSAiQ0M9JChHQVNDQykiIGluc3RhbGwKKwkkKENEKSBbLV0KKworY2xlYW46CisJJChDRCkgWy5iZmRdCisJQGdtYWtlIGNsZWFuCisJJChDRCkgWy0ub3Bjb2Rlc10KKwlAZ21ha2UgY2xlYW4KKwkkKENEKSBbLS5saWJpYmVydHldCisJQGdtYWtlIGNsZWFuCisJJChDRCkgWy0uYmludXRpbHNdCisJQGdtYWtlIGNsZWFuCisJJChDRCkgWy0uZ2FzXQorCUBnbWFrZSBjbGVhbgorCSQoQ0QpIFstXQorCmRpZmYgLS1naXQgYS9taXNzaW5nIGIvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Nzg5NjUyCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZwpAQCAtMCwwICsxLDE5MCBAQAorIyEgL2Jpbi9zaAorIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBGcmFuYyxvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3LCBVU0EuCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK2Nhc2UgIiQxIiBpbgorCisgIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKyAgICBlY2hvICJcCiskMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KKworSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgorZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisKK1N1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKKyAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JworICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKKyAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKKyAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcworICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisgIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXSIKKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nIC0gR05VIGxpYml0IDAuMCIKKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCisgIGFjbG9jYWwpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50CisgICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCisgICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgY29uZmlndXJlLmluYAorICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgorICAgIHRvdWNoX2ZpbGVzPQorICAgIGZvciBmIGluICRmaWxlczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgY29uZmlndXJlLmluJy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGJpc29ufHlhY2MpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAorICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKKwljYXNlICIkTEFTVEFSRyIgaW4KKwkqLnkpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9jLydgCisJICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIFsgISAtZiB5LnRhYi5oIF07IHRoZW4KKwllY2hvID55LnRhYi5oCisgICAgZmkKKyAgICBpZiBbICEgLWYgeS50YWIuYyBdOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleHxmbGV4KQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC5sJyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEZsZXgnIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgRmxleCcgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgbGV4Lnl5LmMKKyAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAiJExBU1RBUkciIGluCisJKi5sKQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MvbCQvYy8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKKwkgICAgZmkKKwkgIDs7CisJZXNhYworICAgIGZpCisgICAgaWYgWyAhIC1mIGxleC55eS5jIF07IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCisgICAgZmkKKyAgICA7OworCisgIG1ha2VpbmZvKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQorICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCisgICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAorICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCisgICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorICAgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRmaWxlYAorICAgIGZpCisgICAgdG91Y2ggJGZpbGUKKyAgICA7OworCisgICopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCB5b3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBpdCBoYW5keSBvbiB5b3VyCisgICAgICAgICBzeXN0ZW0uICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXJlbWVudHMgZm9yIGluc3RhbGxpbmcKKyAgICAgICAgIHRoaXMgcGFja2FnZS4gIFlvdSBtYXkgYWxzbyBwZWVrIGF0IGFueSBHTlUgYXJjaGl2ZSBzaXRlLCBpbiBjYXNlCisgICAgICAgICBzb21lIG90aGVyIHBhY2thZ2Ugd291bGQgY29udGFpbiB0aGlzIG1pc3NpbmcgXGAkMScgcHJvZ3JhbS4iCisgICAgZXhpdCAxCisgICAgOzsKK2VzYWMKKworZXhpdCAwCmRpZmYgLS1naXQgYS9ta2luc3RhbGxkaXJzIGIvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzg3ODNlCi0tLSAvZGV2L251bGwKKysrIGIvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDM2IEBACisjISAvYmluL3NoCisjIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQorIyBBdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KKyMgQ3JlYXRlZDogMTk5My0wNS0xNgorIyBMYXN0IG1vZGlmaWVkOiAxOTk0LTAzLTI1CisjIFB1YmxpYyBkb21haW4KKworZXJyc3RhdHVzPTAKKworZm9yIGZpbGUgaW4gJHsxKyIkQCJ9IDsgZG8gCisgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorICAgc2hpZnQKKworICAgcGF0aGNvbXA9CisgICBmb3IgZCBpbiAkezErIiRAIn0gOyBkbworICAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCisgICAgIGNhc2UgIiRwYXRoY29tcCIgaW4KKyAgICAgICAtKiApIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7CisgICAgIGVzYWMKKworICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIiAxPiYyCisgICAgICAgIG1rZGlyICIkcGF0aGNvbXAiID4gL2Rldi9udWxsIDI+JjEgfHwgbGFzdGVycj0kPworICAgICBmaQorCisgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorCWVycnN0YXR1cz0kbGFzdGVycgorICAgICBmaQorCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgorICAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvbW92ZS1pZi1jaGFuZ2UgYi9tb3ZlLWlmLWNoYW5nZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTFiMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbW92ZS1pZi1jaGFuZ2UKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitpZgordGVzdCAtciAkMgordGhlbgoraWYKK2NtcCAkMSAkMiA+IC9kZXYvbnVsbAordGhlbgorZWNobyAkMiBpcyB1bmNoYW5nZWQKK3JtIC1mICQxCitlbHNlCittdiAtZiAkMSAkMgorZmkKK2Vsc2UKK212IC1mICQxICQyCitmaQpkaWZmIC0tZ2l0IGEvbXB3LVJFQURNRSBiL21wdy1SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3MTQwYgotLS0gL2Rldi9udWxsCisrKyBiL21wdy1SRUFETUUKQEAgLTAsMCArMSwzNzYgQEAKK1RoaXMgaXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1hY2ludG9zaCh0bSkgTVBXKHRtKSBwb3J0IG9mIHRoZQorR05VIHRvb2xzLiAgVGhlIGluZm9ybWF0aW9uIGJlbG93IGFwcGxpZXMgdG8gYm90aCBuYXRpdmUgYW5kIGNyb3NzCitjb21waWxlcnMuCisKKyhQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhpcyBmaWxlOyAibXB3LVJFQURNRSIKK2lzIHRoZSBzb3VyY2UgZm9ybSwgYW5kICJSZWFkIE1lIGZvciBNUFciIGlzIHRoZSBkaXN0cmlidXRpb24gZm9ybS4KKyJSZWFkIE1lIGZvciBNUFciIGhhcyA4LWJpdCBjaGFycyBzdWNoIGFzIFxPcHRpb24tZCBlbWJlZGRlZCBpbiBpdC4pCisKK0lOU1RBTExJTkcgR05VIFRPT0xTCisKKyogU3lzdGVtIFJlcXVpcmVtZW50cworCitUbyB1c2UgdGhlc2UgdG9vbHMsIHlvdSB3aWxsIG5lZWQgYSBNYWMgd2l0aCBhIDY4MDIwIG9yIGJldHRlciBvciBlbHNlCithbnkgUG93ZXJNYWMsIFN5c3RlbSA3LjEgb3IgbGF0ZXIsIGFuZCBNUFcgMy4zIG9yIDMuNC4gIFlvdSB3aWxsICpub3QqCituZWVkIGFueSBvdGhlciBNUFcgY29tcGlsZXIgdW5sZXNzIHlvdSB3YW50IHRvIHJlYnVpbGQgZnJvbSBzb3VyY2VzLAorbm9yIGV2ZW4gYW55IGluY2x1ZGUgZmlsZXMsIHVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGFjdHVhbCBNYWMKK2FwcGxpY2F0aW9ucy4gIEZvciBQb3dlck1hYyBuYXRpdmUgeW91IHdpbGwgbmVlZCBQUENMaW5rLCBob3dldmVyOworYWxzbyB0aGUgZXhlY3V0YWJsZXMgYXJlIFBvd2VyUEMtb25seS4KKworKiBBdXRvbWF0ZWQgSW5zdGFsbGF0aW9uCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBHTlUgdG9vbHMgaXMgdG8gcnVuIHRoZSBJbnN0YWxsIHNjcmlwdC4KK1RoZSBzY3JpcHQgd2lsbCBjb3B5IHRoaW5ncyB0byB3aGVyZSB5b3Ugd2FudCB0byBrZWVwIHRoZW0sIHdpbGwgYnVpbGQKK2EgVXNlclN0YXJ0dXAgZmlsZSB3aXRoIHNldHRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gd2hlcmUgdGhpbmdzIHdlcmUKK2NvcGllZCwgYW5kIG9mZmVyIHRvIHB1dCB0aGF0IFVzZXJTdGFydHVwIGZpbGUgaW4geW91ciBNUFcgZm9sZGVyLgorCitUaGUgSW5zdGFsbCBzY3JpcHQgZG9lcyBub3QgYWx0ZXIgYW55dGhpbmcgaW4gdGhlIFN5c3RlbSBGb2xkZXIsIGFuZAoraXQgZG9lcyBub3QgdGFrZSBhbnkgYWN0aW9uIHdpdGhvdXQgY29uZmlybWF0aW9uLgorCitUaGUgSW5zdGFsbCBzY3JpcHQgd2lsbCBiZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBiaW5hcnkKK2Rpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBpZgorcmVidWlsZGluZyBmcm9tIHNvdXJjZS4gIChUaGUgc291cmNlcyBpbmNsdWRlIGEgZmlsZSBjYWxsZWQKKyJtcHctaW5zdGFsbCIgYXQgdGhlIHRvcCBsZXZlbCwgYnV0IGl0IGlzIHRoZSBzb3VyY2UgdG8gdGhlIEluc3RhbGwKK3NjcmlwdCBhbmQgY2Fubm90IGJlIHJ1biBkaXJlY3RseS4pCisKKyogTWFudWFsIEluc3RhbGxhdGlvbgorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIEluc3RhbGwgc2NyaXB0LCB5b3UgY2FuIGRvIGluc3RhbGxhdGlvbgorbWFudWFsbHk7IHRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN0ZXBzIGludm9sdmVkLgorCitUaGUgR05VIHRvb2xzIGNhbiBnbyBpbiBhbnkgZGlyZWN0b3J5IHRoYXQgaXMgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QuCitXZSBnZW5lcmFsbHkgcHV0IGFsbCB0aGUgdG9vbHMgc29tZXdoZXJlIGxpa2Uge0Jvb3R9Q3lnbnVzOmxhdGVzdDpiaW4sCithbmQgdGhlbiBhZGQgdG8gYSBVc2VyU3RhcnR1cCBmaWxlOgorCisJc2V0IENvbW1hbmRzICJ7Qm9vdH1DeWdudXM6bGF0ZXN0OmJpbjose0NvbW1hbmRzfSIKKworSG93ZXZlciwgdGhlIGNwcCBhbmQgY2MxIHByb2dyYW1zIG9mIEdDQyBhcmUgbm90IG5vcm1hbGx5IHN0b3JlZCBoZXJlLgorSW5zdGVhZCwgdGhleSB3aWxsIGJlIGluIGEgImxpYiIgZGlyZWN0b3J5IHRoYXQgaXMgYWxvbmdzaWRlICJiaW4iLAorYW5kIG9yZ2FuaXplZCBieSB0YXJnZXQgYW5kIHZlcnNpb24gdW5kZXJuZWF0aCwgd2l0aCBuYW1lcyBsaWtlCisKKwk6bGliOmdjYy1saWI6PHRhcmdldD46Y3lnbnVzLTx2ZXJzaW9uPjoKKworSWYgeW91IGJ1aWxkIGFuZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91cnNlbGYgYWNjb3JkaW5nIHRvIHRoZSBidWlsZAoraW5zdHJ1Y3Rpb25zIGJlbG93LCB0aGVuIHlvdSB3aWxsIG5vdCBoYXZlIGFueSBwcm9ibGVtcy4gIEhvd2V2ZXIsIHlvdQorbWF5IGRpc2NvdmVyIHRoYXQgR0NDIHNlZW1zIHVuYWJsZSB0byBmaW5kIHRoZSByaWdodCBjcHAgYW5kIGNjMTsKK3VzdWFsbHkgdGhpcyB3aWxsIGJlIGJlY2F1c2UgZGlyZWN0b3J5IG5hbWVzIGhhdmUgY2hhbmdlZC4gIChFdmVuCityZW5hbWluZyB5b3VyIGhhcmQgZGlzayB3aWxsIG1ha2UgdGhpcyBoYXBwZW4uKSAgSW4gc3VjaCBjYXNlcywgeW91CitoYXZlIHNldmVyYWwgY2hvaWNlcy4gIE9uZSBpcyBqdXN0IHRvIGFkZCB0aGlzIGRpcmVjdG9yeSB0bwore0NvbW1hbmRzfSwgYnV0IHRoZW4geW91IHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IGFueSBvdGhlciBjcHAgb3IgY2MxLAorc3VjaCBhcyB0aG9zZSB1c2VkIGJ5IGEgZGlmZmVyZW50IHRhcmdldCBvciB2ZXJzaW9uLiAgQW5vdGhlciB3YXkgaXMKK3RvIHJlbmFtZSB5b3VyIGRpc2sgYW5kIGRpcmVjdG9yaWVzIHRvIG1hdGNoIHRoZSBwcmVmaXggdXNlZCB3aGVuIHRoZQordG9vbHMgd2VyZSBjb21waWxlZC4gIEZpbmFsbHksIHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZQorR0NDX0VYRUNfUFJFRklYIHRvIHBvaW50IHRvIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeToKKworCXNldCBHQ0NfRVhFQ19QUkVGSVggTXlEaXNrOlN0dWZmOmxpYjpnY2MtbGliOgorCWV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgKKworWW91IG1heSBhbHNvIHdhbnQgdG8gZWRpdCBNUFcncyBIRVhBIDEyOCByZXNvdXJjZS4gIFdoZW4gR0NDIGlzIGJ1aWx0Cit1c2luZyBhIG5hdGl2ZSBHQ0MsIGl0IGlzIGNvbXBpbGVkIHRvIHVzZSBhIHNwZWNpYWwgc3RhY2sgYWxsb2NhdG9yCitmdW5jdGlvbiBhbGxvY2EoKS4gIFdoaWxlIHRoaXMgaXMgdmVyeSBlZmZpY2llbnQsIGl0IG1lYW5zIHRoYXQgR0NDCit3aWxsIG5lZWQgY29uc2lkZXJhYmxlIHN0YWNrIHNwYWNlIHRvIHJ1biwgZXNwZWNpYWxseSB3aGVuIGNvbXBpbGluZworbGFyZ2UgcHJvZ3JhbXMgd2l0aCBvcHRpbWl6YXRpb24gdHVybmVkIG9uLiAgWW91IGdpdmUgTVBXIG1vcmUgc3RhY2sKK2J5IGVkaXRpbmcgdGhlIEhFWEEgMTI4IHJlc291cmNlIG9mIHRoZSBNUFcgU2hlbGwuICBBIHZhbHVlIG9mICIwMDA4CiswMDAwIiBnaXZlcyA1MTJLIG9mIHN0YWNrIHNpemUsIHdoaWNoIGlzIHVzdWFsbHkgc3VmZmljaWVudC4KKworVVNJTkcgR05VIFRPT0xTCisKKyogVXNpbmcgTmF0aXZlIFBvd2VyTWFjIEdDQworCitVc2luZyBhIG5hdGl2ZSBQb3dlck1hYyBHQ0MgdG8gcHJvZHVjZSBNUFcgdG9vbHMgb3IgTWFjT1MgYXBwbGljYXRpb25zCitpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4ganVzdCAiZ0MgZm9vLmMiLCBhbHRob3VnaCBubyBtb3JlIGNvbXBsaWNhdGVkCit0aGFuIHdpdGggb3RoZXIgTWFjIGNvbXBpbGVycy4KKworVG8gYnVpbGQgYSBuYXRpdmUgUG93ZXJNYWMgTVBXIHRvb2wsIHVzZSB0aGlzIHNlcXVlbmNlLCB3aGVyZSBoZWxsby5jCitpcyB0aGUgdXN1YWwgImhlbGxvIHdvcmxkIiBwcm9ncmFtLCBhbmQgZ2VuZXJpY2NmcmcuciBpcyB0aGUgUmV6IGZpbGUKK3dpdGggdGhlIGNvZGUgZnJhZ21lbnQgcmVzb3VyY2U6CisKK2dDIC1Je0NJbmNsdWRlc30gLWZuby1idWlsdGluIC1EcGFzY2FsPSAtYyAtZyBoZWxsby5jCitQUENMaW5rIGhlbGxvLm8gLW8gaGVsbG8gXE9wdGlvbi1kCisJIntQUENMaWJyYXJpZXN9IlN0ZENSdW50aW1lLm8gXE9wdGlvbi1kCisJIntTaGFyZWRMaWJyYXJpZXN9IkludGVyZmFjZUxpYiBcT3B0aW9uLWQKKwkie1NoYXJlZExpYnJhcmllc30iU3RkQ0xpYiBcT3B0aW9uLWQKKwkie1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubyBcT3B0aW9uLWQKKwkie1BQQ0xpYnJhcmllc30iUFBDQ1J1bnRpbWUubyBcT3B0aW9uLWQKKwkie0dDQ1BQQ0xpYnJhcmllc30ibGliZ2NjLnhjb2ZmCityZXogLWQgQVBQTkFNRT0nIidoZWxsbyciJyBHZW5lcmljQ0ZSRy5yIC1vIGhlbGxvCitzZXRmaWxlIC10ICdNUFNUJyAtYyAnTVBTICcgaGVsbG8KKworVGhlIHNhbWUgc2VxdWVuY2Ugd29ya3MgdG8gYnVpbGQgYSBNYWNPUyBhcHBsaWNhdGlvbiwgYnV0IHlvdSBzZXQgdGhlIGZpbGUKK3R5cGUgdG8gJ0FQUEwnIGFuZCBkb24ndCBsaW5rIGluIFBQQ1Rvb2xMaWJzLm8uICBGb3IgZnVydGhlciBkZXRhaWxzIG9uCit1c2luZyBNUFcgdG8gYnVpbGQgTWFjIGFwcGxpY2F0aW9ucywgc2VlIHRoZSBnZW5lcmFsIE1QVyBkb2N1bWVudGF0aW9uLgorCitSZWNlbnQgdmVyc2lvbnMgb2YgUFBDTGluayBoYXZlIGFuIG9wdGlvbiB0byBnZW5lcmF0ZSB0aGUgY29kZQorZnJhZ21lbnQgcmVzb3VyY2UgYW5kIGF1dG9tYXRpY2FsbHkgc2V0IGNyZWF0b3IgYW5kIGZpbGUgdHlwZTsKK2hlcmUgaXMgd2hhdCBHZW5lcmljQ0ZSRy5yIHNob3VsZCBsb29rIGxpa2UgaWYgeW91IGhhdmUgYW4gb2xkZXIKK1BQQ0xpbmsgb3IgYXJlIHVzaW5nIEdOVSBsZDoKKworI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCisKK3Jlc291cmNlICdjZnJnJyAoMCkgeworICAgICAgICB7CisgICAgICAgICAgICAgICAga1Bvd2VyUEMsCisgICAgICAgICAgICAgICAga0Z1bGxMaWIsCisgICAgICAgICAgICAgICAga05vVmVyc2lvbk51bSxrTm9WZXJzaW9uTnVtLAorICAgICAgICAgICAgICAgIDAsMCwKKyAgICAgICAgICAgICAgICBrSXNBcHAsa09uRGlza0ZsYXQsa1plcm9PZmZzZXQsa1dob2xlRm9yaywKKyAgICAgICAgICAgICAgICBBUFBOQU1FIC8vIG11c3QgYmUgZGVmaW5lZCBvbiBSZXogY29tbWFuZCBsaW5lIHdpdGggLWQgb3B0aW9uCisgICAgICAgIH0KK307CisKK0luIGdlbmVyYWwgdGhpcyBwb3J0IG9mIEdDQyBzdXBwb3J0cyB0aGUgc2FtZSBvcHRpb24gc3ludGF4IGFuZAorYmVoYXZpb3IgYXMgaXRzIFVuaXggY291bnRlcnBhcnQuICBJdCBhbHNvIGhhcyBzaW1pbGFyIGNvbXBpbGF0aW9uCitydWxlcywgc28gaXQgd2lsbCBydW4gdGhlIGFzc2VtYmxlciBvbiAucyBmaWxlcyBhbmQgc28gZm9ydGguCisKK1RoZSBHQ0MgbWFudWFsIGluY2x1ZGVzIGZ1bGwgaW5mb3JtYXRpb24gb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zLgorT25lIG9wdGlvbiB0aGF0IG1heSBiZSBlc3BlY2lhbGx5IHVzZWZ1bCBpcyAiLXYiLCB3aGljaCBzaG93cyB5b3Ugd2hhdAordG9vbHMgYW5kIG9wdGlvbnMgYXJlIGJlaW5nIHVzZWQ7IHVubGlrZSBtb3N0IE1hYyBDIGNvbXBpbGVycywgR0NDCitkaXJlY3RzIGFzc2VtYmx5IGFuZCBsaW5raW5nIGluIGFkZGl0aW9uIHRvIGNvbXBpbGF0aW9uLgorCitNUFcgR0NDIGRvZXMgZmVhdHVyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGUgb3B0aW9uIHN5bnRheDsgJy1kIG1hY3JvPW5hbWUnCit3b3JrcyBqdXN0IGFzICctRG1hY3JvPW5hbWUnIGRvZXMgaW4gVW5peCwgYW5kICctaSBkaXJlY3RvcnknIHdvcmtzIHRoZQorc2FtZSBhcyAnLUlkaXJlY3RvcnknLgorCitNUFcgR0NDIHN1cHBvcnRzIHRoZSB1c3VhbCBQYXNjYWwtc3R5bGUgc3RyaW5ncyBhbmQgYWxpZ25tZW50IHByYWdtYXMuCisKK1RvIGZpbmQgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyB5b3UgY2FuIHNldCB0aGUgdmFyaWFibGUgR0NDSW5jbHVkZXM6CisKKwlzZXQgR0NDSW5jbHVkZXMgTXlEaXNrOk15SW5jbHVkZXM6CisJZXhwb3J0IEdDQ0luY2x1ZGVzCisKK0dDQ0luY2x1ZGVzIGlzIHNpbWlsYXIgdG8gTVBXJ3MgQ0luY2x1ZGVzIG9yIENXJ3MgTVdDSW5jbHVkZXMuICBJbgorb3JkZXIgdG8gdXNlIE1QVydzIHVzdWFsIGluY2x1ZGUgZmlsZXMsIGp1c3Qgc2F5OgorCisJc2V0IEdDQ0luY2x1ZGVzICJ7Q0luY2x1ZGVzfSIKKwlleHBvcnQgR0NDSW5jbHVkZXMKKworKiBVc2luZyBHQ0MgYXMgYSBDcm9zcy1Db21waWxlcgorCitJZiB5b3UgaGF2ZSBhIGNyb3NzLWNvbXBpbGVyLCBhbmQgeW91IGhhdmUgYWxsIG9mIHRoZSBjb3JyZWN0Cit0YXJnZXQtc2lkZSBjcnQwIGFuZCBsaWJyYXJpZXMgYXZhaWxhYmxlLCB0aGVuIHRvIGNvbXBpbGUgYW5kIGxpbmsgYQorZmlsZSAiZm9vLmMiLCB5b3UgY2FuIHNheSBqdXN0CisKKwlnQyBmb28uYworCitUaGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBhbiBNUFcgYmluYXJ5IGZpbGUgbmFtZWQgImEub3V0IjsgdGhlIGZvcm1hdAorb2YgdGhlIGNvbnRlbnRzIHdpbGwgZGVwZW5kIG9uIHdoaWNoIHRhcmdldCBpcyBpbiB1c2UsIHNvIGZvciBpbnN0YW5jZQorYSBNSVBTLXRhcmdldGluZyBHQ0Mgd2lsbCBwcm9kdWNlIEVDT0ZGIG9yIEVMRiBleGVjdXRhYmxlcy4KKworTm90ZSB0aGF0IHVzaW5nIE1QVyBpbmNsdWRlIGZpbGVzIHdpdGggYSBjcm9zcy1jb21waWxlciBpcyBzb21ld2hhdAorZGFuZ2Vyb3VzLgorCisqIFVzaW5nIHRoZSBBc3NlbWJsZXIgYW5kIEZyaWVuZHMKKworVGhlIGFzc2VtYmxlciAoImFzIikgYW5kIGxpbmtlciAoImxkIikgYXJlIGZhaXRoZnVsIHBvcnRzIG9mIHRoZWlyCitVbml4IGNvdW50ZXJwYXJ0cy4gIFNpbWlsYXJseSwgdGhlIGJpbnV0aWxzICJhciIsICJjcGx1c2ZpbHQiLCAibm0iLAorIm9iamNvcHkiLCAib2JqZHVtcCIsICJyYW5saWIiLCAic2l6ZSIsICJzdHJpbmdzIiwgYW5kICJzdHJpcCIgYXJlIGFsbAorbGlrZSB0aGV5IGFyZSB1bmRlciBVbml4LiAgKE5vdGUgdGhhdCAiY3BsdXNmaWx0IiBpcyB1c3VhbGx5IGNhbGxlZAorImMrK2ZpbHQiIHVuZGVyIFVuaXguKQorCisqIFVzaW5nIEdEQgorCitUaGVyZSBhcmUgdHdvIGZsYXZvcnMgb2YgR0RCLiAgImdkYiIgaXMgYW4gTVBXIHRvb2wgdGhhdCB3b3JrcyB2ZXJ5CittdWNoIGxpa2UgaXQgZG9lcyBpbiBVbml4OyBwdXQgYSBjb21tYW5kIGludG8gdGhlIE1QVyB3b3Jrc2hlZXQgYW5kCit0eXBlIHRoZSA8ZW50ZXI+IGtleSB0byBzZW5kIGl0IHRvIEdEQi4gIFdoaWxlICJnZGIiIGlzIHJ1bm5pbmcsIHlvdQorY2Fubm90IGRvIGFueXRoaW5nIGVsc2UgaW4gTVBXLCBhbHRob3VnaCB5b3UgY2FuIHN3aXRjaCB0byBvdGhlcgorTWFjIGFwcGxpY2F0aW9ucyBhbmQgdXNlIHRoZW0uCisKKyJTaW93R0RCIiBpcyBhbHNvIGEgTWFjIGFwcGxpY2F0aW9uLCBidXQgaXQgaXMgR0RCIHVzaW5nIHRoZSBTSU9XCitwYWNrYWdlIHRvIHByb3ZpZGUgY29uc29sZSBlbXVsYXRpb24uICBDb21tYW5kcyBhcmUgZXhhY3RseSBhcyBmb3IgdGhlCitNUFcgdG9vbCwgYnV0IHNpbmNlIHRoaXMgaXMgaXRzIG93biBhcHBsaWNhdGlvbiwgeW91IGNhbiBzd2l0Y2gKK2JldHdlZW4gaXQgYW5kIE1QVy4KKworQlVJTERJTkcgR05VIFRPT0xTCisKK1RoaXMgcG9ydCBvZiB0aGUgR05VIHRvb2xzIHVzZXMgYSBjb25maWd1cmUgc2NyaXB0IHNpbWlsYXIgdG8KK3RoYXQgdXNlZCBmb3IgR05VIHRvb2xzIHVuZGVyIFVuaXgsIGJ1dCByZXdyaXR0ZW4gZm9yIE1QVy4gIEFzIHdpdGgKK1VuaXggY29uZmlndXJhdGlvbiwgdGhlcmUgaXMgYW4gIm9iamVjdCIgZGlyZWN0b3J5IHRoYXQgbWF5IGJlCitkaWZmZXJlbnQgZnJvbSB0aGUgInNvdXJjZSIgZGlyZWN0b3J5LiAgSW4gdGhlIGV4YW1wbGUgY29tbWFuZHMgYmVsb3csCit3ZSB3aWxsIGFzc3VtZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIGFuZCB0aGF0Cit0aGUgc291cmNlIGRpcmVjdG9yeSBpcyAie0Jvb3R9Q3lnbnVzOnNyYzoiLgorCisqIFJlcXVpcmVtZW50cyBmb3IgQnVpbGRpbmcKKworSW4gYWRkaXRpb24gdG8gdGhlIHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgYSBzZXQgb2YgdG9vbHMgdGhhdCB0aGUKK2NvbmZpZ3VyZSBhbmQgYnVpbGQgc2NyaXB0cyBhc3N1bWUgdG8gYmUgYXZhaWxhYmxlLiAgVGhlc2UgdG9vbHMKKyhhbmQgdGhlaXIgdmVyc2lvbnMsIGlmIHJlbGV2YW50KSBhcmUgYXMgZm9sbG93czoKKworCWJ5YWNjIHRvb2wKKwlmbGV4ICgyLjMuNykgdG9vbCAoYW5kIEZsZXguc2tlbCBmaWxlKQorCWZvcndhcmQtaW5jbHVkZSBzY3JpcHQKKwlNb3ZlSWZDaGFuZ2Ugc2NyaXB0CisJbXB3LXRvdWNoIHNjcmlwdAorCW1wdy10cnVlIHNjcmlwdAorCU5ld0ZvbGRlclJlY3Vyc2l2ZSBzY3JpcHQKKwludWxsLWNvbW1hbmQgc2NyaXB0CisJb3Blbi1icmFjZSBzY3JpcHQKKwlzZWQgKDEuMTMpIHRvb2wKKwl0ci03dG84IHNjcmlwdAorCXRydWUgc2NyaXB0CisKK1RoZSBzY3JpcHRzIGFyZSBpbiB0aGUgc291cmNlcywgdW5kZXIgdXRpbHM6bXB3Oi4gWW91IG11c3QgYXJyYW5nZSB0bworZ2V0IHRoZSBvdGhlciB0b29scyB5b3Vyc2VsZiAodGhleSBhcmUgcmVhZGlseSBhdmFpbGFibGUgZnJvbSB0aGUKKyJ1c3VhbCIgbmV0IHNpdGVzLCBhbmQgYXJlIGFsc28gb24gbWFueSBDRFJPTVMpLiAgSW4gYWRkaXRpb24sIHRoZXJlCit3aWxsIHVzdWFsbHkgYmUgYSBzZXQgb2YgdGhlc2UgYXZhaWxhYmxlIGF0IGZ0cC5jeWdudXMuY29tLCBpbiBwdWIvbWFjLgorCitZb3UgbWF5IHB1dCB0aGUgYnVpbGQgdG9vbHMgaW4geW91ciB1c3VhbCBUb29scyBvciBTY3JpcHRzCitkaXJlY3Rvcmllcywgb3Iga2VlcCB0aGVtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3JpZXMuICBXZSBwcmVmZXIgdG8KK21ha2UgYSBkaXJlY3RvcnkgY2FsbGVkICJidWlsZHRvb2xzIiBhbmQgd2UgcHV0IHRoaXMgaW4gb25lIG9mIG91cgorVXNlclN0YXJ0dXAgZmlsZXM6CisKKwlzZXQgQ29tbWFuZHMgIntCb290fUN5Z251czpidWlsZHRvb2xzOix7Q29tbWFuZHN9IgorCitGbGV4IHVzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgRkxFWF9TS0VMRVRPTiB0byBsb2NhdGUgaXRzIHNrZWxldG9uCitmaWxlLCBzbyB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLCBwcmVmZXJhYmx5IGluIGEgVXNlclN0YXJ0dXA6CisKKwlTZXQgRkxFWF9TS0VMRVRPTiAie0Jvb3R9IkN5Z251czpidWlsZHRvb2xzOkZsZXguc2tlbAorCUV4cG9ydCBGTEVYX1NLRUxFVE9OCisKKyogQ29uZmlndXJpbmcKKworQmVmb3JlIHlvdSBjYW4gYnVpbGQgYW55dGhpbmcsIHlvdSBtdXN0IGNvbmZpZ3VyZS4gIFlvdSBkbyB0aGlzIGJ5CitjcmVhdGluZyBhbiBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzIHdpbGwgYmUgc3RvcmVkLCBzZXRkaXJlY3RvcnkKK3RvIHRoYXQgZGlyZWN0b3J5IGFuZCBkbyBhIGNvbmZpZ3VyZSBjb21tYW5kOgorCisJe0Jvb3R9Q3lnbnVzOnNyYzptcHctY29uZmlndXJlIC0tdGFyZ2V0IDxuYW1lPiAtLWNjIDxjb21waWxlcj4gLS1zcmNkaXIge0Jvb3R9Q3lnbnVzOnNyYzogLS1wcmVmaXggPHdoYXRldmVyPgorCitJZiB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyBub3QgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QsIHRoZW4geW91IG11c3QKK3N1cHBseSBhIGZ1bGwgcGF0aG5hbWUgdG8gbXB3LWNvbmZpZ3VyZSwgc2luY2UgbXB3LWNvbmZpZ3VyZSBpbnZva2VzCitpdHNlbGYgYWZ0ZXIgc3dpdGNoaW5nIGludG8gZWFjaCBzdWJkaXJlY3RvcnkuICBVc2luZyBhIHJlbGF0aXZlCitwYXRobmFtZSwgZXZlbiBzb21ldGhpbmcgbGlrZSAnOm1wdy1jb25maWd1cmUnLCB3aWxsIHRoZXJlZm9yZSBub3Qgd29yay4KKworPG5hbWU+IG11c3QgYmUgYSBrbm93biB0YXJnZXQuICBWYWxpZCBvbmVzIGluY2x1ZGUgIm02OGstYXBwbGUtbWFjb3MiLAorInBvd2VycGMtYXBwbGUtbWFjb3MiLCAiaTM4Ni11bmtub3duLWdvMzIiLCAibWlwcy1pZHQtZWNvZmYiLCBhbmQKKyJzaC1oaXRhY2hpLWhtcyIuICBOb3QgYWxsIHRhcmdldCB0eXBlcyBhcmUgYWNjZXB0ZWQgZm9yIGFsbCBvZiB0aGUKK3Rvb2xzIHlldC4KKworPGNvbXBpbGVyPiBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byB1c2UuICBJdCBkZWZhdWx0cyB0byAibXB3YyIuCisKKwkobTY4aykKKwltcHdjCU1QVyBDCisJc2M2OGsJU3ltYW50ZWMgQworCW13YzY4awlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQorCWdjYzY4awlHQ0MKKworCShwb3dlcnBjKQorCXBwY2MJUFBDQworCW1yYwlNYWNpbnRvc2ggb24gUmlzQyAoTWlzdGVyIEMsIGFrYSg/KSBGcmFua2Vuc3RlaW4pCisJc2NwcGMJU3ltYW50ZWMgQworCW13Y3BwYwlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQorCWdjY3BwYwlHQ0MKKworTm90IGFsbCBjb21waWxlcnMgd2lsbCBjb21waWxlIGFsbCB0b29scyBlcXVhbGx5IHdlbGwhICBGb3IgbTY4ayBNYWNzLAorTVBXIEMgaGFzIHRoZSBiZXN0IHJlY29yZCBzbyBmYXIgKGl0IGhhcyBwcm9ibGVtcywgYnV0IHRoZXkgY2FuIGJlCit3b3JrZWQgYXJvdW5kKSwgd2hpbGUgZm9yIFBvd2VyTWFjcywgQ29kZVdhcnJpb3IgaXMgdGhlIG9ubHkgY29tcGlsZXIKK3RoYXQgaGFzIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBldmVyeXRoaW5nIGludG8gcnVubmluZyBjb2RlLgorCis8cHJlZml4PiBpcyB0aGUgcGF0aCB0aGF0ICJnY2MiIHdpbGwgcHJlcGVuZCB3aGVuIGxvb2tpbmcgZm9yIHRvb2xzCit0byBleGVjdXRlLiAgR0NDX0VYRUNfUFJFRklYIG92ZXJyaWRlcyB0aGlzIHZhbHVlLCBzbyB5b3UgbmVlZCBub3QKK2luY2x1ZGUgaXQgaWYgeW91IHBsYW4gdG8gdXNlIEdDQ19FWEVDX1BSRUZJWC4KKworQXMgYW4gZXhhbXBsZSwgaGVyZSBpcyB0aGUgY29uZmlndXJlIGxpbmUgdGhhdCB5b3UgY291bGQgdXNlIHRvIGJ1aWxkCituYXRpdmUgUG93ZXJNYWMgR0NDOgorCisie0Jvb3R9IkN5Z251czpzcmM6bXB3LWNvbmZpZ3VyZSAtLWNjIG13Y3BwYyAtLXRhcmdldCBwb3dlcnBjLWFwcGxlLW1hY29zIC0tc3JjZGlyICJ7Qm9vdH0iQ3lnbnVzOnNyYzogLS1wcmVmaXggIntCb290fSJHTlVUb29sczoKKworKiBCdWlsZGluZworCitJZiB5b3UgdXNlIENvZGVXYXJyaW9yLCB5b3UgKm11c3QqIGZpcnN0IHNldCBNV0NJbmNsdWRlcyB0bwore0NJbmNsdWRlc30uICBUaGlzIGlzIGJlY2F1c2UgeW91IHdpbGwgYmUgYnVpbGRpbmcgTVBXIHRvb2xzLCBhbmQKK3RoZWlyIHN0YW5kYXJkIEkvTyB3b3JrcyBieSBtYWtpbmcgcmVmZXJlbmNlcyB0byBkYXRhIHRoYXQgaXMgcGFydCBvZgordGhlIE1QVyBTaGVsbCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQKK3dpdGggbWFjcm9zIHRoYXQgcmVmZXIgdG8gdGhhdCBkYXRhLCBhbmQgdGhvc2UgbWFjcm9zIGFyZSBpbgore0NJbmNsdWRlc30sIG5vdCB0aGUgZGVmYXVsdCB7TVdDSW5jbHVkZXN9LiAgV2l0aG91dCB0aGlzIGNoYW5nZSwgeW91Cit3aWxsIGVuY291bnRlciBwcm9ibGVtcyBjb21waWxpbmcgbGliaWJlcnR5L21wdy5jLCBidXQgdHdlYWtpbmcgdGhhdAorZmlsZSBvbmx5IG1hc2tzIHRoZSByZWFsIHByb2JsZW0sIGFuZCBkb2VzIG5vdCBmaXggaXQuCisKK1RoZSBjb21tYW5kCisKKwltcHctYnVpbGQKKword2lsbCBidWlsZCBldmVyeXRoaW5nLiBCdWlsZGluZyB3aWxsIHRha2Ugb3ZlciBhbiBob3VyIG9uIGEgUXVhZHJhIDgwMAorb3IgUG93ZXJNYWMgODEwMC8xMTAsIGxvbmdlciBpZiB0aGUgc291cmNlcyBhcmUgb24gYSBzaGFyZWQgdm9sdW1lLgorCitZb3UgbWF5IHNlZSBzb21lIHdhcm5pbmdzOyB0aGVzZSBhcmUgbW9zdGx5IGxpa2VseSBiZW5pZ24sIHR5cGljYWxseQorZGlzYWdyZWVtZW50cyBhYm91dCBkZWNsYXJhdGlvbnMgb2YgbGlicmFyeSBhbmQgc3lzdGVtIGZ1bmN0aW9ucy4KKworKiBJbnN0YWxsaW5nCisKK1RvIGluc3RhbGwgdGhlIGp1c3QtYnVpbHQgdG9vbHMsIHVzZSB0aGUgY29tbWFuZAorCisJbXB3LWJ1aWxkIGluc3RhbGwKKworVGhpcyBwYXJ0IG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGp1c3QgY29waWVzIGZpbGVzIHRvIHRoZQorbG9jYXRpb24gc3BlY2lmaWVkIGF0IGNvbmZpZ3VyZSB0aW1lIGJ5IDxwcmVmaXg+LCBhbmQsIGluIHNvbWUgY2FzZXMsCityZW5hbWVzIHRoZW0gZnJvbSB0ZW1wb3JhcnkgaW50ZXJuYWwgbmFtZXMgdG8gdGhlaXIgdXN1YWwgbmFtZXMuIFRoaXMKK2luc3RhbGwgcHJvY2VzcyBpcyAqbm90KiB0aGUgc2FtZSBhcyB3aGF0IHRoZSBJbnN0YWxsIHNjcmlwdCBkb2VzOworSW5zdGFsbCBjYW4gY29weSB0b29scyBmcm9tIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gY2hvc2VuIGF0Citjb25maWd1cmF0aW9uIHRpbWUgdG8gYSB1c2VyLWNob3NlbiBwbGFjZSwgYW5kIHNldHMgdXAgYSBVc2VyU3RhcnR1cAorZmlsZS4gIE5vdGUgdGhhdCB3aGlsZSB0aGUgSW5zdGFsbCBzY3JpcHQgaXMgb3B0aW9uYWwsIHRoZSBpbnN0YWxsCitidWlsZCBhY3Rpb24gcGVyZm9ybXMgc29tZSB0YXNrcyB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gcmVwbGljYXRlCittYW51YWxseSwgc28geW91IHNob3VsZCBhbHdheXMgZG8gaXQgYmVmb3JlIHVzaW5nIHRoZSB0b29scy4KKworKiBLbm93biBQcm9ibGVtcyBXaXRoIFVzaW5nIFZhcmlvdXMgQ29tcGlsZXJzIHRvIEJ1aWxkCisKK01vc3QgdmVyc2lvbnMgb2YgTVBXIEMgaGF2ZSBwcm9ibGVtcyB3aXRoIGNvbXBpbGluZyBHTlUgc29mdHdhcmUuCisKK01QVyBDIDMuMi54IGhhcyBwcmVwcm9jZXNzaW5nIGJ1Z3MgdGhhdCByZW5kZXIgaXQgaW5jYXBhYmxlIG9mCitjb21waWxpbmcgdGhlIEJGRCBsaWJyYXJ5LCBzbyBpdCBjYW4ndCBiZSB1c2VkIGF0IGFsbCBmb3IgYnVpbGRpbmcgQkZELgorCitNUFcgQyAzLjMsIDMuMy4xLCBhbmQgMy4zLjIgd2lsbCBzcG9udGFuZW91c2x5IGNsYWltIHRvIGhhdmUgZm91bmQKK2Vycm9ycyBpbiB0aGUgc291cmNlIGNvZGUsIGJ1dCBpbiBmYWN0IHRoZSBjb2RlIGlzIHBlcmZlY3RseSBmaW5lLiAgSWYKK3RoaXMgaGFwcGVucywganVzdCBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJhY2sgdG8gdGhlIHRvcC1sZXZlbAorb2JqZGlyICh3aGVyZSB0aGUgY29uZmlndXJlIGNvbW1hbmQgYWJvdmUgd2FzIHBlcmZvcm1lZCksIGFuZCB0eXBlCisibXB3LWJ1aWxkIGFsbCIgYWdhaW4uICBJZiBpdCBnb2VzIG9uIHRocm91Z2ggdGhlIHN1cHBvc2VkIGVycm9yLCB0aGVuCit5b3UgZ290IG9uZSBvZiB0aGUgc3B1cmlvdXMgZXJyb3JzLiAgQSBmdWxsIGJ1aWxkIG1heSByZXF1aXJlIGEgbnVtYmVyCitvZiB0aGVzZSByZXN0YXJ0cy4KKworTVBXIEMgMy4zLjMgc2VlbXMgdG8gd29yayBPSywgYXQgbGVhc3Qgd2l0aCB0aGUgYWlkIG9mIGEgbnVtYmVyIG9mCit3b3JrYXJvdW5kcyB0aGF0IGFyZSBpbiB0aGUgc291cmNlcyAobG9vayBmb3IgI2lmZGVmIE1QV19DKS4KKworVmVyc2lvbnMgb2YgTVBXIE1ha2UgZWFybGllciB0aGFuIDQuMGQyIGhhdmUgZXhoaWJpdGVkIGJpemFycmUgYmVoYXZpb3IsCitmYWlsdXJlIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzIGFuZCB0aGUgbGlrZS4KKworTWV0cm93ZXJrcyBDVzYgUFBDIGxpbmtlciAoTVdMaW5rUFBDKSBzZWVtcyB0byBkbyBiYWQgdGhpbmdzIHdpdGggbWVtb3J5CitpZiB0aGUgIk1vZGVybiBNZW1vcnkgTWFuYWdlciIgaXMgdHVybmVkIG9uIChpbiB0aGUgTWVtb3J5IGNvbnRyb2wgcGFuZWwpLAorYnV0IHdvcmtzIE9LIGlmIGl0IGlzIHR1cm5lZCBvZmYuCisKK01ldHJvd2Vya3MgQ1c2IGxvc2VzIGJpZ3RpbWUgY29tcGlsaW5nIG9wY29kZXM6cHBjLW9wYy5jLCB3aGljaCBoYXMKK3NvbWUgZGVlcGx5IG5lc3RlZCBtYWNyb3MuICAoQ1c3IGlzIE9LLikgIFRoZXJlIGlzIGEgd2F5IHRvIHBhdGNoIHRoZQorZmlsZSwgYnkgc3Vic3RpdHV0aW5nIGNvbnN0YW50IHZhbHVlcy4gIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsCitjb250YWN0IHNoZWJzQGN5Z251cy5jb20gZm9yIGRldGFpbHMuCisKKzxHZXN0YWx0Lmg+IGlzIG1pc3NpbmcgZnJvbSB7Q0luY2x1ZGVzfSBpbiB0aGUgTVBXIHZlcnNpb24gdGhhdCBjb21lcword2l0aCBDVzcuICBZb3UgY2FuIGp1c3QgY29weSB0aGUgb25lIGluIENXNydzIHtNV0NJbmNsdWRlc30uCisKK0NXOCBhbmQgbGF0ZXIgaGF2ZSBjaGFuZ2VzIHRvIGhlYWRlcnMgYW5kIHN1Y2ggdGhhdCB3aWxsIHJlcXVpcmUgY2hhbmdlcwordG8gdGhlIHNvdXJjZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIHRvIHJlYnVpbGQuCisKK0tOT1dOIEJVR1MKKworVGhlIGRlY2xhcmF0aW9ucyBmb3IgbWVtY3B5IGFuZCBtZW1jbXAgaW4gc29tZSB2ZXJzaW9ucyBvZiBoZWFkZXIgZmlsZXMKK21heSBjb25mbGljdCB3aXRoIEdDQydzIGJ1aWx0aW4gZGVmaW5pdGlvbi4gIEVpdGhlciB1c2UgLWZuby1idWlsdGluCitvciBpZ25vcmUgdGhlIHdhcm5pbmdzLgorCitUaGlzIGlzIG5vdCBhIGJ1ZywgYnV0IC0gd2F0Y2ggb3V0IGZvciBjci9ubCB0cmFuc2xhdGlvbiEgIEZvciBpbnN0YW5jZSwKK2lmIGNvbmZpZy9tcHctbWgtbXB3IGlzIG5vdCBwcm9wZXJseSB0cmFuc2xhdGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4KK2NvcGllZCBvciB1cGRhdGVkIHNlcGFyYXRlbHksIHRoZW4gZXZlcnl0aGluZyB3aWxsIGFsbW9zdCBidWlsZCwgYnV0Cit5b3Ugd2lsbCBnZXQgcHV6emxpbmcgZXJyb3IgbWVzc2FnZXMgZnJvbSBtYWtlIG9yIHRoZSBjb21waWxlci4KKworJy8nIG9yICcgJyBlbWJlZGRlZCBpbiBhbnkgZGV2aWNlLCBkaXJlY3RvcnksIG9yIGZpbGUgbmFtZSBtYXkgb3IgbWF5Citub3Qgd29yay4KKworb2JqY29weSAtTyBzcmVjIGZvby5vIG1ha2VzIHJhbmRvbSBvdXRwdXQgZmlsZW5hbWVzLgorCitNYWMteC1taXBzIHJlcXVpcmVzIC1tZ2FzIGJ1dCBVbml4IGhvc3RzIGRvbid0LgorCitHREIgd2lsbCBmcmVxdWVudGx5IHJlcXVpcmUgYSAnLycgb24gdGhlIGZyb250IG9mIGEgZGV2aWNlIG5hbWUgaW4gb3JkZXIKK3RvIHJlY29nbml6ZSBpdCBhcyBhbiBhYnNvbHV0ZSByYXRoZXIgdGhhbiBhIHJlbGF0aXZlIHBhdGhuYW1lLgorCitHREIgZG9lc24ndCBzZWVtIHRvIHVzZSB0aGUgcHJpbnRlciBwb3J0IGNvcnJlY3RseSwgYWx0aG91Z2ggaXQgdHJpZXMuCisKK1RoZSBjdXJzb3IgZG9lc24ndCBhbHdheXMgc3BpbiBhcyBtdWNoIGFzIGl0IHNob3VsZC4gIFRvIGdldCBlbGFib3JhdGUKK3N0YXRpc3RpY3MgYW5kIHdhcm5pbmdzIGFib3V0IHNwaW4gcmF0ZXMsIGFkZCB0aGlzIHRvIFVzZXJTdGFydHVwOgorCisJc2V0IE1FQVNVUkVfU1BJTiBhbGwKKwlleHBvcnQgTUVBU1VSRV9TUElOCmRpZmYgLS1naXQgYS9tcHctYnVpbGQuaW4gYi9tcHctYnVpbGQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkOTUzMAotLS0gL2Rldi9udWxsCisrKyBiL21wdy1idWlsZC5pbgpAQCAtMCwwICsxLDIwNCBAQAorIyBUb3AtbGV2ZWwgc2NyaXB0IGZyYWdtZW50IHRvIGJ1aWxkIGV2ZXJ5dGhpbmcgZm9yIE1QVy4KKworU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgorCisjU2V0IEVjaG8gMQorCitTZXQgVGhpc1NjcmlwdCAiezB9IgorCitTZXQgb2JqZGlyICI6IgorCitTZXQgdmVyaWZ5IDAKKworU2V0IEJ1aWxkVGFyZ2V0ICJub25lIgorCisjIFBhcnNlIGFyZ3VtZW50cy4KKworTG9vcAorCUJyZWFrIElmIHsjfSA9PSAwCisJCUlmICJ7QnVpbGRUYXJnZXR9IiA9fiAvbm9uZS8KKwkJCVNldCBCdWlsZFRhcmdldCAiezF9IgorCQlFbHNlCisJCQlFY2hvIE9ubHkgb25lIGJ1aWxkIHRhcmdldCBhbGxvd2VkLCBpZ25vcmluZyAiezF9IgorCQlFbmQgSWYKKwlTaGlmdCAxCitFbmQgTG9vcAorCitJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL25vbmUvCisJU2V0IEJ1aWxkVGFyZ2V0ICJhbGwiCitFbmQgSWYKKworSWYge3ZlcmlmeX0gPT0gMQorCUVjaG8gIiMiIERvaW5nICJ7VGhpc1NjcmlwdH0iICJ7QnVpbGRUYXJnZXR9IiBpbiAiYERpcmVjdG9yeWAiIC4uLiAKK0VuZCBJZgorCitTZXQgcmFubWFrZSAwCisKK0lmICJgRXhpc3RzIE1ha2VmaWxlYCIgIT0gIiIKKwlFY2hvICJTZXQgRWNobyAxIiA+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0CisJTWFrZSAtZiBNYWtlZmlsZSB7QnVpbGRUYXJnZXR9ID4+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0CisJe0J1aWxkVGFyZ2V0fS5tYWtlb3V0CisJRGVsZXRlIHtCdWlsZFRhcmdldH0ubWFrZW91dAorCVNldCByYW5tYWtlIDEKK0VuZCBJZgorCitJZiAiYEV4aXN0cyBNYWtlZmlsZS5QUENgIiAhPSAiIgorCUVjaG8gIlNldCBFY2hvIDEiID57QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCisJTWFrZSAtZiBNYWtlZmlsZS5QUEMge0J1aWxkVGFyZ2V0fSA+PntCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKKwl7QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCisJRGVsZXRlIHtCdWlsZFRhcmdldH0ubWFrZW91dC5wcGMKKwlTZXQgcmFubWFrZSAxCitFbmQgSWYKKworSWYge3Jhbm1ha2V9ID09IDEKKwlFeGl0CitFbmQgSWYKKworIyBEaXNwYXRjaCBvbiB2YXJpb3VzIHBzZXVkby10YXJnZXRzLgorCitJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC8KKwlFY2hvIFN0YXJ0ZWQgYERhdGVgCisJIntUaGlzU2NyaXB0fSIgYWxsLWdjYworCSJ7VGhpc1NjcmlwdH0iIGFsbC1nZGIKKwlFY2hvIEZpbmlzaGVkIGBEYXRlYAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1saWJpYmVydHkvCisJIntUaGlzU2NyaXB0fSIgZG8tbGliaWJlcnR5CitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJmZC8KKwkie1RoaXNTY3JpcHR9IiBkby1iZmQKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtb3Bjb2Rlcy8KKwkie1RoaXNTY3JpcHR9IiBkby1vcGNvZGVzCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJ5YWNjLworCSJ7VGhpc1NjcmlwdH0iIGRvLWJ5YWNjCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWZsZXgvCisJIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQorCSJ7VGhpc1NjcmlwdH0iIGRvLWZsZXgKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtYmludXRpbHMvCisJIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQorCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKKwkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcworCSJ7VGhpc1NjcmlwdH0iIGRvLWJpbnV0aWxzCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdhcy8KKwkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5CisJIntUaGlzU2NyaXB0fSIgYWxsLWJmZAorCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCisJIntUaGlzU2NyaXB0fSIgZG8tZ2FzCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWdjYy8KKwkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5CisJIntUaGlzU2NyaXB0fSIgYWxsLWdhcworCSJ7VGhpc1NjcmlwdH0iIGFsbC1iaW51dGlscworCSJ7VGhpc1NjcmlwdH0iIGFsbC1sZAorCSJ7VGhpc1NjcmlwdH0iIGRvLWdjYworRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nZGIvCisJIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQorCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKKwkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcworCSJ7VGhpc1NjcmlwdH0iIGRvLWdkYgorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1ncmV6LworCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKKwkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCisJIntUaGlzU2NyaXB0fSIgZG8tZ3JlegorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1sZC8KKwkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5CisJIntUaGlzU2NyaXB0fSIgYWxsLWJmZAorCSJ7VGhpc1NjcmlwdH0iIGFsbC1vcGNvZGVzCisJIntUaGlzU2NyaXB0fSIgZG8tbGQKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1ieWFjYy8KKwlTZXREaXJlY3RvcnkgOmJ5YWNjOgorCTo6bXB3LWJ1aWxkIGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWZsZXgvCisJU2V0RGlyZWN0b3J5IDpmbGV4OgorCTo6bXB3LWJ1aWxkIF9ib290c3RyYXAKKwk6Om1wdy1idWlsZCBhbGwKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1iZmQvCisJU2V0RGlyZWN0b3J5IDpiZmQ6CisJOjptcHctYnVpbGQgYWxsCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbGliaWJlcnR5LworCVNldERpcmVjdG9yeSA6bGliaWJlcnR5OgorCTo6bXB3LWJ1aWxkIGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLW9wY29kZXMvCisJU2V0RGlyZWN0b3J5IDpvcGNvZGVzOgorCTo6bXB3LWJ1aWxkIGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWJpbnV0aWxzLworCVNldERpcmVjdG9yeSA6YmludXRpbHM6CisJOjptcHctYnVpbGQgc3RhbXBzCisJOjptcHctYnVpbGQgYWxsCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ2FzLworCVNldERpcmVjdG9yeSA6Z2FzOgorCTo6bXB3LWJ1aWxkIHN0YW1wcworCTo6bXB3LWJ1aWxkIGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdjYy8KKwlTZXREaXJlY3RvcnkgOmdjYzoKKwk6bXB3LWJ1aWxkIGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdkYi8KKwlTZXREaXJlY3RvcnkgOmdkYjoKKwk6Om1wdy1idWlsZCBhbGwKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1ncmV6LworCVNldERpcmVjdG9yeSA6Z3JlejoKKwk6Om1wdy1idWlsZCBhbGwKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1sZC8KKwlTZXREaXJlY3RvcnkgOmxkOgorCTo6bXB3LWJ1aWxkIGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLW5ld2xpYi8KKwlTZXREaXJlY3RvcnkgOm5ld2xpYjoKKwk6Om1wdy1idWlsZCBhbGwKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLworCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS10b3AKKwkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWJpbnV0aWxzCisJIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nYXMKKwkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdjYworCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtbGQKKwkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWdkYgorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtYmludXRpbHMvCisJU2V0RGlyZWN0b3J5IDpiaW51dGlsczoKKwk6Om1wdy1idWlsZCBpbnN0YWxsCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1nYXMvCisJU2V0RGlyZWN0b3J5IDpnYXM6CisJOjptcHctYnVpbGQgaW5zdGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2NjLworCVNldERpcmVjdG9yeSA6Z2NjOgorCTptcHctYnVpbGQgaW5zdGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2RiLworCVNldERpcmVjdG9yeSA6Z2RiOgorCTo6bXB3LWJ1aWxkIGluc3RhbGwKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdyZXovCisJU2V0RGlyZWN0b3J5IDpncmV6OgorCTo6bXB3LWJ1aWxkIGluc3RhbGwKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWxkLworCVNldERpcmVjdG9yeSA6bGQ6CisJOjptcHctYnVpbGQgaW5zdGFsbAorRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS8KKwkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktdG9wCisJIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWJpbnV0aWxzCisJIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdhcworCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nY2MKKwkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2RiCisJIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWxkCitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWJpbnV0aWxzLworCVNldERpcmVjdG9yeSA6YmludXRpbHM6CisJOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5CitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdhcy8KKwlTZXREaXJlY3RvcnkgOmdhczoKKwk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ2NjLworCVNldERpcmVjdG9yeSA6Z2NjOgorCTptcHctYnVpbGQgaW5zdGFsbC1vbmx5CitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdkYi8KKwlTZXREaXJlY3RvcnkgOmdkYjoKKwk6Om1wdy1idWlsZCBpbnN0YWxsLW9ubHkKK0Vsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHktZ3Jlei8KKwlTZXREaXJlY3RvcnkgOmdyZXo6CisJOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5CitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWxkLworCVNldERpcmVjdG9yeSA6bGQ6CisJOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5CitFbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LXRvcC8KKwlOZXdGb2xkZXJSZWN1cnNpdmUgIntwcmVmaXh9IgorCUlmICJ7cHJlZml4fSIgIT0gImBEaXJlY3RvcnlgIgorCQlEdXBsaWNhdGUgLXkgJ1JlYWQgTWUgZm9yIE1QVycgIntwcmVmaXh9IidSZWFkIE1lIGZvciBNUFcnCisJCUR1cGxpY2F0ZSAteSBJbnN0YWxsICJ7cHJlZml4fSJJbnN0YWxsCisJRW5kIElmCitFbHNlCisJRWNobyB7QnVpbGRUYXJnZXR9IG5vdCB1bmRlcnN0b29kLCBpZ25vcmluZworRW5kIElmCisKK1NldERpcmVjdG9yeSAie3NhdmVkaXJ9IgpkaWZmIC0tZ2l0IGEvbXB3LWNvbmZpZy5pbiBiL21wdy1jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyODczNwotLS0gL2Rldi9udWxsCisrKyBiL21wdy1jb25maWcuaW4KQEAgLTAsMCArMSwxMTMgQEAKKyMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQ3lnbnVzIHNvdXJjZSB0cmVlLgorCisjIENoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYWxsIHRoZSBzcGVjaWFsIHRvb2xzIHRoYXQgd2Ugd2lsbCBuZWVkLgorIyBUaGUgdGVzdCBmb3Igc2VkIGlzIHNlbWktcG9pbnRsZXNzLCBiZWNhdXNlIGl0J3MgYWxyZWFkeSBiZWVuIGludm9rZWQKKyMgYnkgdGhlIGNhbGN1bGF0aW9uIG9mIHRhcmdldF9jcHUgaW4gdGhlIG1haW4gY29uZmlndXJlIHNjcmlwdCwgYnV0CisjIHRoZSB0ZXN0IHdpbGwgYWxzbyBzaG93IHdoaWNoIG9uZSBpcyBiZWluZyB1c2VkLgorCitTZXQgRXhpdCAwCitFY2hvIGJ5YWNjIGlzIGBXaGljaCBieWFjY2AKK0VjaG8gZmxleCBpcyBgV2hpY2ggZmxleGAKK0VjaG8gZm9yd2FyZC1pbmNsdWRlIGlzIGBXaGljaCBmb3J3YXJkLWluY2x1ZGVgCitFY2hvIE1vdmVJZkNoYW5nZSBpcyBgV2hpY2ggTW92ZUlmQ2hhbmdlYAorRWNobyBtcHctdG91Y2ggaXMgYFdoaWNoIG1wdy10b3VjaGAKK0VjaG8gbXB3LXRydWUgaXMgYFdoaWNoIG1wdy10cnVlYAorRWNobyBOZXdGb2xkZXJSZWN1cnNpdmUgaXMgYFdoaWNoIE5ld0ZvbGRlclJlY3Vyc2l2ZWAKK0VjaG8gbnVsbC1jb21tYW5kIGlzIGBXaGljaCBudWxsLWNvbW1hbmRgCitFY2hvIG9wZW4tYnJhY2UgaXMgYFdoaWNoIG9wZW4tYnJhY2VgCitFY2hvIHNlZCBpcyBgV2hpY2ggc2VkYAorRWNobyAndHItN3RvOCcgaXMgYFdoaWNoIHRyLTd0bzhgCitFY2hvIHRydWUgaXMgYFdoaWNoIHRydWVgCitTZXQgRXhpdCAxCisKK1NldCBob3N0X2xpYnMgIm1tYWxsb2MgbGliaWJlcnR5IG9wY29kZXMgYmZkIHJlYWRsaW5lIGdhc2ggdGNsIHRrIHRjbFgiCisKK1NldCBob3N0X3Rvb2xzICJ0ZXhpbmZvIGJ5YWNjIGZsZXggYmlzb24gYmludXRpbHMgbGQgZ2FzIGdjYyBnZGIgbWFrZSBwYXRjaCBcT3B0aW9uLWQKKwkgICAgcHJtcyBzZW5kLXByIGdwcm9mIGdkYnRlc3QgdGdhcyBldGMgZXhwZWN0IGRlamFnbnUgc2ltIGJhc2ggXE9wdGlvbi1kCisJICAgIG00IGF1dG9jb25mIGlzcGVsbCBncmVwIGRpZmYgcmNzIGN2cyBmaWxldXRpbHMgc2hlbGx1dGlscyB0aW1lIFxPcHRpb24tZAorCSAgICB0ZXh0dXRpbHMgd2RpZmYgZmluZCBlbWFjcyBlbWFjczE5IHV1ZGVjb2RlIGhlbGxvIHRhciBnemlwIGluZGVudCBcT3B0aW9uLWQKKwkgICAgcmVjb2RlIHJlbGVhc2Ugc2VkIHV0aWxzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgZ2F3ayIKKworU2V0IHRhcmdldF9saWJzICJuZXdsaWIiCisKK1NldCB0YXJnZXRfdG9vbHMgImV4YW1wbGVzIgorCisjIENvbmZpZ3VyZSB0aGUgcmVzb3VyY2UgY29tcGlsZXIgaWYgdGFyZ2V0aW5nIE1hY3MuCitJZiB7dGFyZ2V0X29zfSA9fiAvbWFjb3MvIHx8IHt0YXJnZXRfb3N9ID1+IC9tcHcvCisJU2V0IGhvc3RfdG9vbHMgIntob3N0X3Rvb2xzfSBncmV6IgorRW5kIElmCisJCitTZXQgY29uZmlnZGlycyAie2hvc3RfbGlic30ge2hvc3RfdG9vbHN9IHt0YXJnZXRfbGlic30ge3RhcmdldF90b29sc30iCitFeHBvcnQgY29uZmlnZGlycworCisjIE1ha2UgdXAgYSBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5IHRoYXQgdG9vbHMgd2lsbCBzaGFyZS4KKworSWYgImBFeGlzdHMgIntvYmpkaXJ9ImV4dHJhLWluY2x1ZGVgIiA9PSAiIgorCU5ld0ZvbGRlciAie29iamRpcn0iZXh0cmEtaW5jbHVkZQorRW5kIElmCisKK1NldCBlZGlyICJ7b2JqZGlyfWV4dHJhLWluY2x1ZGU6IgorCitmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpmaWxlLmggIntlZGlyfSInc3lzL2ZpbGUuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOmlvY3RsLmggIntlZGlyfSInc3lzL2lvY3RsLmgnCitmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpwYXJhbS5oICJ7ZWRpcn0iJ3N5cy9wYXJhbS5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6cmVzb3VyY2UuaCAie2VkaXJ9IidzeXMvcmVzb3VyY2UuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnN0YXQuaCAie2VkaXJ9IidzeXMvc3RhdC5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6dGltZS5oICJ7ZWRpcn0iJ3N5cy90aW1lLmgnCitmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czp0eXBlcy5oICJ7ZWRpcn0iJ3N5cy90eXBlcy5oJworCitmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6YW91dDY0LmggIntlZGlyfSInYW91dC9hb3V0NjQuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDphci5oICJ7ZWRpcn0iJ2FvdXQvYXIuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpyYW5saWIuaCAie2VkaXJ9Iidhb3V0L3JhbmxpYi5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnJlbG9jLmggIntlZGlyfSInYW91dC9yZWxvYy5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnN0YWIuZGVmICJ7ZWRpcn0iJ2FvdXQvc3RhYi5kZWYnCitmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6c3RhYl9nbnUuaCAie2VkaXJ9Iidhb3V0L3N0YWJfZ251LmgnCisKK0lmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgorCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2FvdXQvJyJ7dGFyZ2V0X2NwdX0iJy5oJworRW5kIElmCisKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjplY29mZi5oICJ7ZWRpcn0iJ2NvZmYvZWNvZmYuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjppbnRlcm5hbC5oICJ7ZWRpcn0iJ2NvZmYvaW50ZXJuYWwuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjpzeW0uaCAie2VkaXJ9Iidjb2ZmL3N5bS5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnN5bWNvbnN0LmggIntlZGlyfSInY29mZi9zeW1jb25zdC5oJworCitJZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9Iidjb2ZmLycie3RhcmdldF9jcHV9IicuaCcKK0VuZCBJZgorSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnJzNjAwMC5oICJ7ZWRpcn0iJ2NvZmYvcnM2MDAwLmgnCitFbmQgSWYKKworZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6Y29tbW9uLmggIntlZGlyfSInZWxmL2NvbW1vbi5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZHdhcmYuaCAie2VkaXJ9IidlbGYvZHdhcmYuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmR3YXJmMi5oICJ7ZWRpcn0iJ2VsZi9kd2FyZjIuaCcKK2ZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmV4dGVybmFsLmggIntlZGlyfSInZWxmL2V4dGVybmFsLmgnCitmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjppbnRlcm5hbC5oICJ7ZWRpcn0iJ2VsZi9pbnRlcm5hbC5oJworCisjIEJlbGlldmUgaXQgb3Igbm90LCBHREIgbmVlZHMgdGhpcyBmb3IgYWxsIHRhcmdldHMuCitmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjptaXBzLmggIntlZGlyfSInZWxmL21pcHMuaCcKKworSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmVsZjoie3RhcmdldF9jcHV9Ii5oYCIgIT0gIiIKKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2VsZi8nInt0YXJnZXRfY3B1fSInLmgnCitFbmQgSWYKK0lmICJ7dGFyZ2V0X2NwdX0iID1+IC9wb3dlcnBjLworCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOnBwYy5oICJ7ZWRpcn0iJ2VsZi9wcGMuaCcKK0VuZCBJZgorCitJZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgorCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6b3Bjb2RlOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInb3Bjb2RlLycie3RhcmdldF9jcHV9IicuaCcKK0VuZCBJZgorSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6cHBjLmggIntlZGlyfSInb3Bjb2RlL3BwYy5oJworRW5kIElmCisKKyMgQWRkIHNvbWUgYmZkIGluY2x1ZGVzIHRoYXQgZ2V0IG1lbnRpb25lZCBvdXRzaWRlIHRoZSBiZmQgZGlyLgorCQorZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmxpYmNvZmYuaCAie2VkaXJ9IidiZmQvbGliY29mZi5oJworZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmxpYmVjb2ZmLmggIntlZGlyfSInYmZkL2xpYmVjb2ZmLmgnCisKKyMgVHJhbnNsYXRlIHJhbmRvbSBmaWxlcyBpbnRvIE1QVy1vbmx5IGNoYXJhY3RlciBzZXQuCisKK3RyLTd0bzggIntzcmNkaXJ9Im1wdy1SRUFETUUgPiAie29iamRpcn1SZWFkIE1lIGZvciBNUFciCit0ci03dG84ICJ7c3JjZGlyfSJtcHctaW5zdGFsbCA+ICJ7b2JqZGlyfSJJbnN0YWxsCmRpZmYgLS1naXQgYS9tcHctY29uZmlndXJlIGIvbXB3LWNvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ1MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbXB3LWNvbmZpZ3VyZQpAQCAtMCwwICsxLDQ0OCBAQAorIyBDb25maWd1cmF0aW9uIHNjcmlwdAorIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIyMgV0FSTklORworIyMjIFRoaXMgc2NyaXB0IG11c3QgTk9UIHVzZSBhbnkgOC1iaXQgY2hhcnMhCisjIyMgV0FSTklORworCisjIFRoaXMgaXMgYW4gTVBXIFNoZWxsIHNjcmlwdCB0aGF0IHNldHMgZXZlcnl0aGluZyB1cCBmb3IgY29tcGlsYXRpb24sCisjIG1haW5seSBjcmVhdGluZyBkaXJlY3RvcmllcywgYW5kIGVkaXRpbmcgY29waWVzIG9mIGZpbGVzLgorCitTZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCisKKyNTZXQgRWNobyAxCisKK1NldCBUaGlzU2NyaXB0ICJ7MH0iCisKK1NldCBzcmNyb290ICItLS0tLS0tLSIKKworU2V0IHNyY2RpciAiOiIKKworU2V0IG9iamRpciAiOiIKKworU2V0IHByZWZpeCAie01QV30iOkdOVVRvb2xzOgorCitTZXQgZXhlY19wcmVmaXggIiIKKworU2V0IGJpbmRpciAiIgorCitTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCisKK1NldCB0YXJnZXRfYWxpYXMge2hvc3RfYWxpYXN9CisKK1NldCBob3N0X2NjICJtcHdjIgorCitTZXQgd2l0aF9nbnVfbGQgMAorCitTZXQgaGVscG91dHB1dCAwCisKK1NldCByZWN1cnNlIDEKKworU2V0IHZlcmlmeSAwCitTZXQgdmVyaWZ5c3RyICIiCisKK1NldCBlbmFibGVfb3B0aW9ucyAiIgorU2V0IGRpc2FibGVfb3B0aW9ucyAiIgorCisjIFBhcnNlIGFyZ3VtZW50cy4KKworTG9vcAorCUJyZWFrIElmIHsjfSA9PSAwCisJSWYgInsxfSIgPX4gLy0tY2MvCisJCVNldCBob3N0X2NjICJ7Mn0iCisJCVNoaWZ0IDEKKwlFbHNlIElmICJ7MX0iID1+IC8tLWJpbmRpci8KKwkJU2V0IGJpbmRpciAiezJ9IgorCQlTaGlmdCAxCisJRWxzZSBJZiAiezF9IiA9fiAvLS1kaXNhYmxlLT8rLworCQlTZXQgYEVjaG8gezF9IHwgc2VkIC1lICdzLy0tZGlzYWJsZS0vZW5hYmxlXy8nYCBubworCQlTZXQgZGlzYWJsZV9vcHRpb25zICJ7ZGlzYWJsZV9vcHRpb25zfSAnezF9JyIKKwlFbHNlIElmICJ7MX0iID1+IC8tLWVuYWJsZS0/Ky8KKwkJU2V0IGBFY2hvIHsxfSB8IHNlZCAtZSAncy8tLWVuYWJsZS0vZW5hYmxlXy8nYCB5ZXMKKwkJU2V0IGVuYWJsZV9vcHRpb25zICJ7ZW5hYmxlX29wdGlvbnN9ICd7MX0nIgorCUVsc2UgSWYgInsxfSIgPX4gLy0tZXhlYy1wcmVmaXgvCisJCVNldCBleGVjX3ByZWZpeCAiezJ9IgorCQlTaGlmdCAxCisJRWxzZSBJZiAiezF9IiA9fiAvLS1oZWxwLworCQlTZXQgaGVscG91dHB1dCAxCisJRWxzZSBJZiAiezF9IiA9fiAvLS1ob3N0LworCQlTZXQgaG9zdF9hbGlhcyAiezJ9IgorCQlTaGlmdCAxCisJRWxzZSBJZiAiezF9IiA9fiAvLS1ub3JlY3Vyc2lvbi8KKwkJU2V0IHJlY3Vyc2UgMAorCUVsc2UgSWYgInsxfSIgPX4gLy0tcHJlZml4LworCQlTZXQgcHJlZml4ICJ7Mn0iCisJCVNoaWZ0IDEKKwlFbHNlIElmICJ7MX0iID1+IC8tLXNyY2Rpci8KKwkJU2V0IHNyY2RpciAiezJ9IgorCQlTaGlmdCAxCisJRWxzZSBJZiAiezF9IiA9fiAvLS1zcmNyb290LworCQlTZXQgc3Jjcm9vdCAiezJ9IgorCQlTaGlmdCAxCisJRWxzZSBJZiAiezF9IiA9fiAvLS10YXJnZXQvCisJCVNldCB0YXJnZXRfYWxpYXMgInsyfSIKKwkJU2hpZnQgMQorCUVsc2UgSWYgInsxfSIgPX4gLy12LworCQlTZXQgdmVyaWZ5IDEKKwkJU2V0IHZlcmlmeXN0ciAiLXYiCisJRWxzZSBJZiAiezF9IiA9fiAvLS13aXRoLWdudS1sZC8KKwkJU2V0IHdpdGhfZ251X2xkIDEKKwlFbHNlCisJCUVjaG8gLW4gJ21wdy1jb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246ICInCisJCUVjaG8gLW4gInsxfSIKKwkJRWNobyAnIjsgdXNlIC0taGVscCBmb3IgdXNhZ2UuJworCQlFeGl0IDEKKwlFbmQgSWYKKwlTaGlmdCAxCitFbmQgTG9vcAorCitJZiB7aGVscG91dHB1dH0gPT0gMQorCUVjaG8gIlVzYWdlOiBtcHctY29uZmlndXJlIFtPUFRJT05TXSIKKwlFY2hvICIiCisJRWNobyAiT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzXSIKKwlFY2hvICItLWJpbmRpciBESVIgICAgICBkaXJlY3RvcnkgZm9yIGJpbmFyaWVzIFtdIgorCUVjaG8gIi0tY2MgQ0MgICAgICAgICAgIHVzZSBDIGNvbXBpbGVyIENDIFttcHdjXSIKKwlFY2hvICItLWRpc2FibGUtRk9PICAgICBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTyIKKwlFY2hvICItLWVuYWJsZS1GT08gICAgICBpbmNsdWRlIGZlYXR1cmUgRk9PIgorCUVjaG8gIi0tZXhlYy1wcmVmaXggRElSIGluc3RhbGwgaG9zdC1kZXBlbmRlbnQgZmlsZXMgaW50byBESVIgW10iCisJRWNobyAiLS1oZWxwICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgorCUVjaG8gIi0taG9zdCBIT1NUICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbbTY4ay1hcHBsZS1tcHddIgorCUVjaG8gIi0tbm9yZWN1cnNpb24gICAgIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXSIKKwlFY2hvICItLXByZWZpeCBESVIgICAgICBpbnN0YWxsIGludG8gRElSIFt7TVBXfTpHTlVUb29sczpdIgorCUVjaG8gIi0tc3JjZGlyIERJUiAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFs6XSIKKwlFY2hvICItLXNyY3Jvb3QgRElSICAgICBmaW5kIHRoZSB0b3BsZXZlbCBzb3VyY2VzIGluIERJUiBbOl0iCisJRWNobyAiLS10YXJnZXQgVEFSR0VUICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXSIKKwlFY2hvICItdiAgICAgICAgICAgICAgICB2ZXJib3NlIgorCUVjaG8gIi0td2l0aC1nbnUtbGQgICAgIGxpbmsgdXNpbmcgR05VIGxkIFtub10iCisJRXhpdCAwCitFbmQgSWYKKworU2V0IEV4aXQgMAorCisjIERlZmF1bHQgZXhlY19wcmVmaXggZnJvbSBwcmVmaXguCisKK0lmICJ7ZXhlY19wcmVmaXh9IiA9PSAiIgorCVNldCBleGVjX3ByZWZpeCAie3ByZWZpeH0iCitFbmQgSWYKKworSWYgIntiaW5kaXJ9IiA9PSAiIgorCVNldCBiaW5kaXIgIntwcmVmaXh9ImJpbjoKK0VuZCBJZgorCisjIFBvaW50IHRvIHRoZSBjb3JyZWN0IHNldCBvZiB0b29scyB0byB1c2Ugd2l0aCB0aGUgY2hvc2VuIGNvbXBpbGVyLgorCitJZiAie2hvc3RfY2N9IiA9fiAvbXB3Yy8KKwlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCisJU2V0IGNjX25hbWUgJ3tDQ19NUFdfQ30nCisJU2V0IHNlZ21lbnRfZmxhZyAnLXMgJworCVNldCBhcl9uYW1lICd7QVJfTElCfScKKwlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCisJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9MSU5LfScKKwlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCisJU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JworCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JworCVNldCByZXpfbmFtZSAne1JFWl82OEt9JworRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2M2OGsvCisJU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgorCVNldCBjY19uYW1lICd7Q0NfU0N9JworCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKKwlTZXQgYXJfbmFtZSAne0FSX0xJQn0nCisJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JworCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTElOS30nCisJU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JworCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKKwlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKKwlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKK0Vsc2UgSWYgIntob3N0X2NjfSIgPX4gL213YzY4ay8KKwlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCisJU2V0IGNjX25hbWUgJ3tDQ19NV0M2OEt9JworCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKKwlTZXQgYXJfbmFtZSAne0FSX01XTElOSzY4S30nCisJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JworCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTVdMSU5LNjhLfScKKwlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCisJU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX01XQzY4S30nCisJU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCisJU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCitFbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCisJU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgorCVNldCBjY19uYW1lICd7Q0NfNjhLX0dDQ30nCisJU2V0IHNlZ21lbnRfZmxhZyAnLXMgJworCVNldCBhcl9uYW1lICd7QVJfNjhLX0FSfScKKwlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfUkFOTElCfScKKwlTZXQgY2NfbGRfbmFtZSAne0NDXzY4S19HQ0N9JworCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKKwlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCisJU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCisJU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCitFbHNlIElmICJ7aG9zdF9jY30iID1+IC9wcGNjLworCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKKwlTZXQgY2NfbmFtZSAne0NDX1BQQ0N9JworCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKKwlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JworCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKKwlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JworCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JworCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JworCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCisJU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCitFbHNlIElmICJ7aG9zdF9jY30iID1+IC9tcmMvCisJU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgorCVNldCBjY19uYW1lICd7Q0NfTVJDfScKKwlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCisJU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKKwlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCisJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKKwlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKKwlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKKwlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JworCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JworRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2NwcGMvCisJU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgorCVNldCBjY19uYW1lICd7Q0NfU0N9JworCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKKwlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JworCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKKwlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JworCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JworCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JworCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCisJU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCitFbHNlIElmICJ7aG9zdF9jY30iID1+IC9td2NwcGMvCisJU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgorCVNldCBjY19uYW1lICd7Q0NfTVdDUFBDfScKKwlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCisJU2V0IGFyX25hbWUgJ3tBUl9NV0xJTktQUEN9JworCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKKwlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX01XTElOS1BQQ30nCisJIyBNaXNsZWFkaW5nLCBidXQgd2UgZG9uJ3QgbmVlZCBhIFBFRiBzdGVwLgorCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKKwlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfTVdDUFBDfScKKwlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKKwlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKK0Vsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KKwlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCisJU2V0IGNjX25hbWUgJ3tDQ19QUENfR0NDfScKKwlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCisJU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKKwlJZiB7d2l0aF9nbnVfbGR9ID09IDEKKwkJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX1JBTkxJQn0nCisJCVNldCBjY19sZF9uYW1lICd7Q0NfTERfR0xEfScKKwlFbHNlCisJCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKKwkJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKKwlFbmQgSWYKKwlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKKwlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKKwlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JworCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JworRWxzZQorCUVjaG8gIntob3N0X2NjfSIgaXMgbm90IGEga25vd24gTVBXIGNvbXBpbGVyIHR5cGUKK0VuZCBJZgorCitTZXQgZGFzaF9jX2ZsYWcgJycKK0lmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCisJU2V0IGRhc2hfY19mbGFnICctYycKK0Vsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KKwlTZXQgZGFzaF9jX2ZsYWcgJy1jJworRW5kIElmCisKKyMgKHNob3VsZCBpbnRlcnByZXQgYWxpYXNlcyBpZiBub3QgaW4gY2Fub25pY2FsIGZvcm0pCisKK1NldCBob3N0X2Nhbm9uaWNhbCAie2hvc3RfYWxpYXN9IgorCitTZXQgdGFyZ2V0X2Nhbm9uaWNhbCAie3RhcmdldF9hbGlhc30iCisKK1NldCBjb25maWdkaXJzICIiCisKK0lmICJ7c3Jjcm9vdH0iID1+IC8tLS0tLS0tLS8KKwlTZXQgc3Jjcm9vdCAie3NyY2Rpcn0iCitFbmQgSWYKK0lmICJgRXhpc3RzICJ7c3JjZGlyfSJgIiA9PSAiIgorCUVjaG8gU291cmNlIGRpcmVjdG9yeSB7c3JjZGlyfSBkb2VzIG5vdCBleGlzdCEKKwlFeGl0IDEKK0VuZCBJZgorSWYgImBFeGlzdHMgIntzcmNyb290fSJgIiA9PSAiIgorCUVjaG8gVG9wLWxldmVsIHNvdXJjZSBkaXJlY3Rvcnkge3NyY3Jvb3R9IGRvZXMgbm90IGV4aXN0IQorCUV4aXQgMQorRW5kIElmCisKK1NldCB0YXJnZXRfY3B1ICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMS8nYCIKK1NldCB0YXJnZXRfdmVuZG9yICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMi8nYCIKK1NldCB0YXJnZXRfb3MgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wzLydgIgorCisjIENyZWF0ZSBhIGZpbGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9sZGVyIHRoYW4gYW55IG90aGVyIGhlcmUuCisKK0lmICJgRXhpc3RzICJ7b2JqZGlyfSJfb2xkZXN0YCIgPT0gIiIKKwltcHctdG91Y2ggX29sZGVzdAorRW5kIElmCisKKyMgUmVjb3JkIHRoaXMgYmVmb3JlIGNyZWF0aW5nIGFueSBmaWxlcywgbWFrZWZpbGVzIHNvbWV0aW1lcyBtZW50aW9uCisjIGRlcGVuZGVuY2llcyBvbiBjb25maWcuc3RhdHVzLgorCitFY2hvICIjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6IiA+Y29uZmlnLm5ldworRWNobyAie1RoaXNTY3JpcHR9IC0taG9zdCB7aG9zdF9hbGlhc30gLS10YXJnZXQge3RhcmdldF9hbGlhc30gLS1zcmNkaXIge3NyY2Rpcn0gIC0tc3Jjcm9vdCB7c3Jjcm9vdH0gIC0tcHJlZml4IHtwcmVmaXh9IC0tY2Mge2hvc3RfY2N9IHt2ZXJpZnlzdHJ9IHtlbmFibGVfb3B0aW9uc30ge2Rpc2FibGVfb3B0aW9uc30gLS1ub3JlY3Vyc2lvbiIgPj5jb25maWcubmV3CitNb3ZlSWZDaGFuZ2UgY29uZmlnLm5ldyBjb25maWcuc3RhdHVzCisKK0lmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctY29uZmlnLmluYCIgIT0gIiIKKwl0ci03dG84ICJ7c3JjZGlyfSJtcHctY29uZmlnLmluID4ie29iamRpcn0ibXB3LWNvbmZpZy5pbgorCUV4ZWN1dGUgIntvYmpkaXJ9Im1wdy1jb25maWcuaW4KK0VuZCBJZgorCisjIFN0YXJ0IE1ha2VmaWxlIGNvbnN0cnVjdGlvbiBieSBkZWZpbmluZyBhbGwgdGhlIHZhcmlhYmxlcyBjaG9zZW4gYnkKKyMgY29uZmlndXJhdGlvbi4KKworRWNobyAiIyBUaGlzIE1ha2VmaWxlIHByb2R1Y2VkIGJ5IG1wdy1jb25maWd1cmUuICBDaGFuZ2VzIG1heSBnZXQgbG9zdCEiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAic3Jjcm9vdCA9ICIge3NyY3Jvb3R9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAidG9wc3JjZGlyID0gIiB7c3Jjcm9vdH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJzcmNkaXIgPSAiIHtzcmNkaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAibXB3X3ByZWZpeCA9ICIge3ByZWZpeH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJtcHdfZXhlY19wcmVmaXggPSAiIHtleGVjX3ByZWZpeH0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0VjaG8gIm1wd19iaW5kaXIgPSAiIHtiaW5kaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAiaG9zdF9hbGlhcyA9ICIge2hvc3RfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJ0YXJnZXRfYWxpYXMgPSAiIHt0YXJnZXRfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJ0YXJnZXRfY3B1ID0gIiB7dGFyZ2V0X2NwdX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0VjaG8gInRhcmdldF92ZW5kb3IgPSAiIHt0YXJnZXRfdmVuZG9yfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAidGFyZ2V0X29zID0gIiB7dGFyZ2V0X29zfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0VjaG8gInRhcmdldF9jYW5vbmljYWwgPSAiIHt0YXJnZXRfY2Fub25pY2FsfQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJob3N0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAidGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWNobyAiQ0MgPSAiIHtjY19uYW1lfQkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJBUiA9ICIge2FyX25hbWV9CQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0VjaG8gIlJBTkxJQiA9ICIge3JhbmxpYl9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0VjaG8gIkNDX0xEID0gIiB7Y2NfbGRfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJQUk9HX0VYVCA9ICIge3Byb2dfZXh0X25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJFWFRSQUxJQlMgPSAiIHtleHRyYWxpYnNfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0VjaG8gIk1BS0VQRUYgPSAiIHttYWtlcGVmX25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFY2hvICJSRVogPSAiIHtyZXpfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCisKK0lmIHtob3N0X2NjfSA9fiAvZ2NjcHBjLworCUVjaG8gLW4gImRxID1cT3B0aW9uLWRcT3B0aW9uLWRcT3B0aW9uLWQiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAKKwlFY2hvICciJyAJCQkJID4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCisJdHItN3RvOCAgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAJPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCitFbHNlCisJRWNobyAtbiAiZHEgPSciIAkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KKwlFY2hvIC1uICciJyAJCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorCUVjaG8gICAgIiciIAkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCitFbmQgSWYKKworIyBBcHBlbmQgdGhlIG1hc3RlciBzZXQgb2YgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIGNvbXBpbGVycy4KKworSWYgImBFeGlzdHMgIntzcmNkaXJ9ImNvbmZpZzptcHctbWgtbXB3YCIgIT0gIiIKKwl0ci03dG84ICJ7c3JjZGlyfSJjb25maWc6bXB3LW1oLW1wdyA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KK0Vsc2UgSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3LW1oLW1wd2AiICE9ICIiCisJdHItN3RvOCAie3NyY3Jvb3R9ImNvbmZpZzptcHctbWgtbXB3ID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorRWxzZQorCUVjaG8gImNhbid0IGZpbmQgYSBob3N0IGNvbmZpZyBmaWxlISIKKwlFeGl0IDAKK0VuZCBJZgorCisjIEFwcGVuZCBhbnl0aGluZyBwcm9kdWNlZCBieSB0aGUgZGlyZWN0b3J5J3MgbXB3LWNvbmZpZy5pbi4KKworSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnRtcGAiICE9ICIiCisJQ2F0ZW5hdGUgIntvYmpkaXJ9Im1rLnRtcCA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KKwkjIEFuIG1wdy1jb25maWcuaW4gbWlnaHQgY2hhbmdlIHNvIGFzIG5vdCB0byBjcmVhdGUgdGhpcworCSMgYW55bW9yZSwgc28gZ2V0IHJpZCBvZiBpdCBub3cgdG8gYmUgc2FmZS4KKwlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Im1rLnRtcAorRW5kIElmCisKKyMgSWYgdGhlcmUgYXJlIHNlZCBzY3JpcHRzIHRvIGVkaXQgdGhlIFVuaXggTWFrZWZpbGUuaW4sIHVzZSB0aGVtOyBvdGhlcndpc2UKKyMgdXNlIGFuIG1wdy1tYWtlLmluIGlmIHByZXNlbnQuCisKK0lmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctbWFrZS5zZWRgIiAhPSAiIgorCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJoYWNrZWRfTWFrZWZpbGUuaW5gIiAhPSAiIgorCQlTZXQgTWFrZWZpbGVJbiAie29iamRpcn0iaGFja2VkX01ha2VmaWxlLmluCisJRWxzZQorCQlTZXQgTWFrZWZpbGVJbiAie3NyY2Rpcn0iTWFrZWZpbGUuaW4KKwlFbmQgSWYKKwkjIEZpbmQgdGhlIGdlbmVyaWMgbWFrZWZpbGUgZWRpdGluZyBzY3JpcHQuCisJSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKKwkJc2VkIC1mICJ7c3Jjcm9vdH0iY29uZmlnOm1wdzpnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKKwlFbHNlIElmICJgRXhpc3RzICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKKwkJc2VkIC1mICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQorCUVsc2UgSWYgImBFeGlzdHMgIntzcmNkaXJ9ImctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKKwkJc2VkIC1mICJ7c3JjZGlyfSJnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKKwlFbHNlCisJCUVjaG8gV2FybmluZzogZy1tcHctbWFrZS5zZWQgbm90IGZvdW5kLCBjb3B5aW5nICJ7TWFrZWZpbGVJbn0iIHZlcmJhdGltLi4uCisJCUNhdGVuYXRlICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQorCUVuZCBJZgorCXNlZCAtZiAie3NyY2Rpcn0ibXB3LW1ha2Uuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgorCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAtZSAncy9eZXhlY19wcmVmaXggPSAuKiQvZXhlY19wcmVmaXggPSB7bXB3X2V4ZWNfcHJlZml4fS9nJyAtZSAncy9eYmluZGlyID0gQGJpbmRpckAvYmluZGlyID0ge21wd19iaW5kaXJ9L2cnICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4ie29iamRpcn0iTWFrZWZpbGUudGVtMworCXNlZCAtZSAicy9AREFTSF9DX0ZMQUdAL3tkYXNoX2NfZmxhZ30vIiAtZSAicy9AU0VHTUVOVF9GTEFHKFwoW14pXSpcKSlAL3tzZWdtZW50X2ZsYWd9XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMyA+IntvYmpkaXJ9Im1wdy1tYWtlLmluCisJdHItN3RvOCAie29iamRpcn0ibXB3LW1ha2UuaW4gPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCisJSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnNlZGAiICE9ICIiCisJCXNlZCAtZiAie29iamRpcn0ibWsuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCisJCVJlbmFtZSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtMiAie29iamRpcn0iTWFrZWZpbGUudGVtCisJRW5kIElmCisJTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gIntvYmpkaXJ9Ik1ha2VmaWxlCisJRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW1bMTJdCisJSWYge3ZlcmlmeX0gPT0gMQorCQlFY2hvIENyZWF0ZWQgTWFrZWZpbGUgaW4gImBEaXJlY3RvcnlgIgorCUVuZCBJZgorRWxzZSBJZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LW1ha2UuaW5gIiAhPSAiIgorCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAie3NyY2Rpcn0ibXB3LW1ha2UuaW4gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCisJc2VkIC1lICJzL0BEQVNIX0NfRkxBR0Ave2Rhc2hfY19mbGFnfS8iIC1lICJzL0BTRUdNRU5UX0ZMQUcoXChbXildKlwpKUAve3NlZ21lbnRfZmxhZ319XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKKwl0ci03dG84ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay5zZWRgIiAhPSAiIgorCQlzZWQgLWYgIntvYmpkaXJ9Im1rLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgorCQlSZW5hbWUgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQorCUVuZCBJZgorCU1vdmVJZkNoYW5nZSAie29iamRpcn0iTWFrZWZpbGUudGVtICJ7b2JqZGlyfSJNYWtlZmlsZQorCURlbGV0ZSAtaSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtWzEyXQorCUlmIHt2ZXJpZnl9ID09IDEKKwkJRWNobyBDcmVhdGVkIE1ha2VmaWxlIGluICJgRGlyZWN0b3J5YCIKKwlFbmQgSWYKK0VuZCBJZgorCisjIFByb2R1Y2UgYSBidWlsZCBzY3JpcHQgaWYgdGhlIHNvdXJjZSBpcyBkZWZpbmVkLgorCitJZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LWJ1aWxkLmluYCIgIT0gIiIKKwlFY2hvICJTZXQgc3Jjcm9vdCAiIHtzcmNyb290fSA+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCisJRWNobyAiU2V0IHNyY2RpciAiIHtzcmNkaXJ9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCisJRWNobyAiU2V0IHRhcmdldF9jYW5vbmljYWwgIiB7dGFyZ2V0X2Nhbm9uaWNhbH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KKwlFY2hvICJTZXQgcHJlZml4ICIge3ByZWZpeH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KKwl0ci03dG84ICJ7c3JjZGlyfSJtcHctYnVpbGQuaW4gPj4ie29iamRpcn0ibXB3LWJ1aWxkLnRlbQorCU1vdmVJZkNoYW5nZSAie29iamRpcn0ibXB3LWJ1aWxkLnRlbSAie29iamRpcn0ibXB3LWJ1aWxkCisJSWYge3ZlcmlmeX0gPT0gMQorCQlFY2hvIENyZWF0ZWQgbXB3LWJ1aWxkIGluICJgRGlyZWN0b3J5YCIKKwlFbmQgSWYKK0VuZCBJZgorCisjIEFwcGx5IG91cnNlbHZlcyByZWN1cnNpdmVseSB0byB0aGUgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyB0byBjb25maWd1cmUuCisKK0lmIHtyZWN1cnNlfSA9PSAxCisJRm9yIHN1YmRpciBJbiB7Y29uZmlnZGlyc30KKwkJU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgorCQlJZiAiYEV4aXN0cyAie3NyY2Rpcn17c3ViZGlyfToiYCIgPT0gIiIKKwkJCUlmIHt2ZXJpZnl9ID09IDEKKwkJCQlFY2hvIE5vICJ7c3JjZGlyfXtzdWJkaXJ9OiIgZm91bmQsIHNraXBwaW5nCisJCQlFbmQgSWYKKwkJCUNvbnRpbnVlCisJCUVuZCBJZgorCQlJZiB7dmVyaWZ5fSA9PSAxCisJCQlFY2hvIENvbmZpZ3VyaW5nIHtzdWJkaXJ9Li4uCisJCUVuZCBJZgorCQlJZiAiYEV4aXN0cyAie29iamRpcn17c3ViZGlyfToiYCIgPT0gIiIKKwkJCU5ld0ZvbGRlciAie29iamRpcn17c3ViZGlyfSIKKwkJRW5kIElmCisJCVNldERpcmVjdG9yeSAie29iamRpcn17c3ViZGlyfToiCisJCSJ7VGhpc1NjcmlwdH0iIC0tdGFyZ2V0ICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iIC0tc3JjZGlyICJ7c3JjZGlyfXtzdWJkaXJ9OiIgLS1zcmNyb290ICJ7c3Jjcm9vdH0iIC0tcHJlZml4ICJ7cHJlZml4fSIgLS1jYyAie2hvc3RfY2N9IiB7dmVyaWZ5c3RyfSB7ZW5hYmxlX29wdGlvbnN9IHtkaXNhYmxlX29wdGlvbnN9CisJCVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgorCUVuZCBGb3IKK0VuZCBJZgorCitTZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1pbnN0YWxsIGIvbXB3LWluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjNWFhYwotLS0gL2Rldi9udWxsCisrKyBiL21wdy1pbnN0YWxsCkBAIC0wLDAgKzEsMTIyIEBACisjIEdOVSBJbnN0YWxsIHNjcmlwdCBmb3IgTVBXLgorCitTZXQgT2xkRXhpdCAie0V4aXR9IgorU2V0IEV4aXQgMAorCitTZXQgVGVtcFVzZXJTdGFydHVwICJ7VGVtcEZvbGRlcn0iX190ZW1wX19Vc2VyU3RhcnR1cAorCitFY2hvICcjIFVzZXJTdGFydHVwIGdlbmVyYXRlZCBieSBHTlUgSW5zdGFsbCBzY3JpcHQnID4gIntUZW1wVXNlclN0YXJ0dXB9IgorRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKKworIyAoc2hvdWxkKSBDaGVjayB0aGF0IGRpc2sgc3BhY2UgaXMgc3VmZmljaWVudCBmb3IgaW5zdGFsbGF0aW9uLgorCisjIEFzc3VtZSB0aGF0IHRoZSBpbnN0YWxsIHNjcmlwdCBpcyB3aGVyZSBldmVyeXRoaW5nIGVsc2UgaXMuCisKK1NldCB0aGlzZGlyICJgRGlyZWN0b3J5YCIKKworIyBDb3B5IHRoZSBiaW5hcmllcyB0byB0aGUgZGVzaXJlZCBwbGFjZS4KKworQ29uZmlybSAtdCAiQ29weSB0aGUgYmluYXJpZXMgdG8gc29tZXdoZXJlIGVsc2U/IgorU2V0IFRtcFN0YXR1cyB7U3RhdHVzfQorSWYge1RtcFN0YXR1c30gPT0gMAorCVNldCBiaW5kZXN0ICJgR2V0RmlsZU5hbWUgLWQgLW0gIldoZXJlIHRvIGluc3RhbGwgdGhlIGJpbmFyaWVzPyJgIgorCUlmIHtTdGF0dXN9ID09IDAKKwkJSWYgImBFeGlzdHMgInt0aGlzZGlyfWJpbiJgIiAhPSAiIgorCQkJRm9yIGFmaWxlIEluICJ7dGhpc2Rpcn0iYmluOlxPcHRpb24teAorCQkJCUR1cGxpY2F0ZSAteSAie2FmaWxlfSIgIntiaW5kZXN0fSIKKwkJCUVuZCBGb3IKKwkJRWxzZQorCQkJRWNobyAiYmluIGRpcmVjdG9yeSBub3QgZm91bmQsIGV4aXRpbmciCisJCQlFeGl0IDEKKwkJRW5kIElmCisJRWxzZQorCQlFY2hvICJObyBkZXN0aW5hdGlvbiBzdXBwbGllZCwgZXhpdGluZyIKKwkJRXhpdCAxCisJRW5kIElmCitFbHNlIElmIHtUbXBTdGF0dXN9ID09IDQKKwkjIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LgorCVNldCBiaW5kZXN0ICJ7dGhpc2Rpcn1iaW46IgorRWxzZQorCSMgQ2FuY2VsbGVkIGZyb20gY29uZmlybWF0aW9uLCBlc2NhcGUgYWx0b2dldGhlci4KKwlFeGl0IDEKK0VuZCBJZgorCisjIENvcHkgdGhlIGxpYnJhcmllcyB0byB0aGUgZGVzaXJlZCBwbGFjZS4KKworQ29uZmlybSAtdCAiQ29weSB0aGUgbGlicmFyaWVzIHRvIHNvbWV3aGVyZSBlbHNlPyIKK1NldCBUbXBTdGF0dXMge1N0YXR1c30KK0lmIHtUbXBTdGF0dXN9ID09IDAKKwlTZXQgbGliZGVzdCAiYEdldEZpbGVOYW1lIC1kIC1tICJXaGVyZSB0byBpbnN0YWxsIHRoZSBsaWJyYXJpZXM/ImAiCisJSWYge1N0YXR1c30gPT0gMAorCQlJZiAiYEV4aXN0cyAie3RoaXNkaXJ9bGliOiJgIiAhPSAiIgorCQkJRm9yIGFmaWxlIEluICJ7dGhpc2Rpcn0ibGliOlxPcHRpb24teAorCQkJCUR1cGxpY2F0ZSAteSAie2FmaWxlfSIgIntsaWJkZXN0fSIKKwkJCUVuZCBGb3IKKwkJRWxzZQorCQkJRWNobyAibGliIGRpcmVjdG9yeSBub3QgZm91bmQsIGV4aXRpbmciCisJCQlFeGl0IDEKKwkJRW5kIElmCisJRWxzZQorCQlFY2hvICJObyBkZXN0aW5hdGlvbiBzdXBwbGllZCwgZXhpdGluZyIKKwkJRXhpdCAxCisJRW5kIElmCitFbHNlIElmIHtUbXBTdGF0dXN9ID09IDQKKwkjIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LgorCVNldCBsaWJkZXN0ICJ7dGhpc2Rpcn1saWI6IgorRWxzZQorCSMgQ2FuY2VsbGVkIGZyb20gY29uZmlybWF0aW9uLCBlc2NhcGUgYWx0b2dldGhlci4KKwlFeGl0IDEKK0VuZCBJZgorCisKKyMgQWRkIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmluYXJpZXMgdG8gdGhlIGNvbW1hbmQgcGF0aC4KKworRWNobyAtbiAnU2V0IENvbW1hbmRzICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgorRWNobyAtbiAie2JpbmRlc3R9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCitFY2hvICAgICcse0NvbW1hbmRzfSInCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKK0VjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCisKKyMgU2V0IHVwIEdDQyBleGVjIHByZWZpeC4KKworU2V0IGdjY2xpYmRpciAie2xpYmRlc3R9ImdjYy1saWI6CisKK0VjaG8gLW4gJ1NldCBHQ0NfRVhFQ19QUkVGSVggIicJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCitFY2hvIC1uICJ7Z2NjbGliZGlyfSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgorRWNobyAgICAnIicJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKK0VjaG8gIkV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgiCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgorRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKKworIyBTZXQgdXAgcGF0aCB0byBsaWJnY2MueGNvZmYgZXRjLgorCitFY2hvIC1uICdTZXQgR0NDUFBDTGlicmFyaWVzICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgorRWNobyAtbiAie2xpYmRlc3R9IgkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCitFY2hvICAgICciJwkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgorRWNobyAiRXhwb3J0IEdDQ1BQQ0xpYnJhcmllcyIJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCitFY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgorCisjIERpc3BsYXkgY29udGVudHMgb2YgVXNlclN0YXJ0dXAsIGNvbmZpcm0gaW5zdGFsbGF0aW9uLgorCitTZXQgVXNlclN0YXJ0dXBOYW1lICJVc2VyU3RhcnR1cFxPcHRpb24tOEdOVSIKKworRWNobyAiQ29udGVudHMgb2YiIHtVc2VyU3RhcnR1cE5hbWV9ICJ3aWxsIGJlOiIKK0NhdGVuYXRlICJ7VGVtcFVzZXJTdGFydHVwfSIKKworQ29uZmlybSAiSW5zdGFsbCB7VXNlclN0YXJ0dXBOYW1lfSBpbnRvIHRoZSBNUFcgZm9sZGVyIHtNUFd9ID8iCitJZiB7U3RhdHVzfSA9PSAwCisJRHVwbGljYXRlICJ7VGVtcFVzZXJTdGFydHVwfSIgIntNUFd9e1VzZXJTdGFydHVwTmFtZX0iCisJRGVsZXRlIC15ICJ7VGVtcFVzZXJTdGFydHVwfSIKK0Vsc2UKKwlFY2hvICJ7VXNlclN0YXJ0dXBOYW1lfSBmaWxlIG5vdCBpbnN0YWxsZWQiCitFbmQgSWYKKworIyAoc2hvdWxkKSBDaGVjayBIRVhBIHJlc291cmNlLCB3YXJuIGlmIGxvdy4KKworIyAoc2hvdWxkKSBDaGVjayBmb3Igc3BhY2VzIGluIHBhdGhuYW1lcywgd2FybiBpZiBmb3VuZC4KKworRWNobyAiSW5zdGFsbGF0aW9uIHdhcyBzdWNjZXNzZnVsLiIKK0VjaG8gIiIKK0VjaG8gIkJlIHN1cmUgdG8gcmV2aWV3IHRoZSB1c2FnZSBub3RlcyBpbiAnUmVhZCBNZSBmb3IgTVBXJyBiZWZvcmUgcHJvY2VlZGluZyEiCisKKyMgUmVzdG9yZSBwcmV2aW91cyBzZXR0aW5ncy4KKworU2V0IEV4aXQgIntPbGRFeGl0fSIKZGlmZiAtLWdpdCBhL29wY29kZXMvQ2hhbmdlTG9nIGIvb3Bjb2Rlcy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZWExNwotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNTAzMyBAQAorMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCisKKzE5OTktMDQtMjIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIG1jb3JlLWRpcy5jIChwcmludF9pbnNuX21jb3JlKTogRGlzcGxheSBsb2NhaXRvbiBvZiBhZGRyZXNzIHBvb2wKKwlmb3IgTFJXIGluc3RydWN0aW9ucy4KKworMTk5OS0wNC0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogbWNvcmUtZGlzLmMgKHByaW50X2luc25fbWNvcmUpOiBEaXNwbGF5IGxvY2F0aW9uIG9mIGFkZHJlc3MgcG9vbAorCWZvciBKTVAgaW5zdHJ1Y3Rpb25zLgorCSogbWNvcmUtb3BjLmggKG1jb3JlX3RhYmxlKTogQWRkICdub3AnLgorCisxOTk5LTA0LTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmMsZnIzMC1vcGMuYzogUmVidWlsZC4KKwkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYzogUmVidWlsZC4KKworTW9uIEFwciAxMiAyMzo0NjoxNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAKKwlpbnN0cnVjdGlvbnMuCisKKzE5OTktMDQtMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1pYmxkLmM6IFJlYnVpbGQuCisJKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgorCisxOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBtY29yZS1kaXMuYzogTmV3IGZpbGU6IERpc2Fzc2VtYmxlIE1Db3JlIG9wY29kZXMuCisJKiBtY29yZS1vcGMuaDogTmV3IGZpbGU6IERlZmluaXRpb25zIG9mIE1Db3JlIG9wY29kZXMuCisJKiBNYWtlZmlsZS5hbTogQWRkIE1jb3JlIHNvdXJjZSBmaWxlcy4KKwkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgorCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGRpc2Fzc2VtYmxlLmM6IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgorCisxOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KKworCSogb3BpbnRsLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgorCisxOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KKworCSogaTM4Ni1kaXMuYyAoaW50ZWxfc3ludGF4LCBvcGVuX2NoYXIsIGNsb3NlX2NoYXIpOiBNYWtlIHN0YXRpYy4KKwkoc2VwYXJhdG9yX2NoYXIsIHNjYWxlX2NoYXIpOiBMaWtld2lzZS4KKwkocHJpbnRfaW5zbl94ODYpOiBMaWtld2lzZS4KKwkocHJpbnRfaW5zbl9pMzg2KTogTGlrZXdpc2UuICBBZGQgZGVjbGFyYXRpb24uCisKKzE5OTktMDMtMjYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogZnIzMC1kaXMuYzogUmVidWlsZC4KKwkqIG0zMnItZGlzLmM6IFJlYnVpbGQuCisKKzE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgorCisJKiBtNjhrLW9wYy5jOiBDaGFuZ2UgY29tcGFyZSBpbnN0cnVjdGlvbnMgdG8gdXNlICJAcyIgcmF0aGVyIHRoYW4KKwkiO3MiIHdoZW4gdXNlZCB3aXRoIGFuIGltbWVkaWF0ZSBvcGVyYW5kLgorCisxOTk5LTAzLTIyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IERlbGV0ZS4KKwkoY2dlbl9sb29rdXBfaW5zbik6IG1heF9pbnNuX3NpemUgcmVuYW1lZCB0byBtYXhfaW5zbl9iaXRzaXplLgorCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6CisJUmVidWlsZC4KKwkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOgorCVJlYnVpbGQuCisJKiBwby9vcGNvZGVzLnBvdDogUmVidWlsZC4KKworMTk5OS0wMy0xNiAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmMgKG12dHN5cyk6IFJlbW92ZSBGTEFHX0xLUi4KKworMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBOZXcgYXJnIGBpc2EnLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KKwkoY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lLGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtKTogTmV3IGZucy4KKwkoY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyk6IFJld3JpdGUgdGVzdCBmb3IgaGFyZGNvZGVkL29wZXJhbmQgaW5kZXguCisJKiBmcjMwLWFzbS5jLGZyMzAtZGVzYy5jLGZyMzAtZGVzYy5oLGZyMzAtZGlzLmMsZnIzMC1pYmxkLmM6IFJlYnVpbGQuCisJKiBtMzJyLWFzbS5jLG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItZGlzLmMsbTMyci1pYmxkLmM6IFJlYnVpbGQuCisJKiBtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgorCisxOTk5LTAyLTI1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4tb3BjLmMgKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZXdyaXRlLgorCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBSZXdyaXRlLgorCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgorCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgorCSogbTMyci1vcGluc3QuYzogUmVidWlsZC4KKworU2F0IEZlYiAxMyAxNDowNjoxOSAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhbHBoYS1vcGMuYzogQWRkIHNxcnQrZmxhZ3MgcGF0dGVybnMuICBBZGQgRVY2IFBBTGNvZGUgaW5zbnMuCisJKGluc2VydF9qaGludCk6IEZpeCBpbnNlcnRpb24gbWFzay4KKwkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogRGlzYXNzZW1ibGUgRVY2IFBBTGNvZGUgaW5zbnMuCisKKzE5OTktMDItMTAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKKzE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogaTk2MGMtYXNtLmMsaTk2MGMtZGlzLmMsaTk2MGMtb3BjLmMsaTk2MGMtb3BjLmg6IERlbGV0ZS4KKwkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IFJlbmFtZSBmcm9tIHByaW50X2luc25faTk2MF9vcmlnLgorCSogTWFrZWZpbGUuYW06IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZW0uCisJKEhGSUxFUyk6IEFkZCBmcjMwLWRlc2MuaCxtMzJyLWRlc2MuaC4KKwkoQ0ZJTEVTKTogQWRkIGZyMzAtZGVzYy5jLGZyMzAtaWJsZC5jLG0zMnItZGVzYy5jLG0zMnItaWJsZC5jLAorCW0zMnItb3BpbnN0LmMuCisJKEFMTF9NQUNISU5FUyk6IFVwZGF0ZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmVkbyBoYW5kbGluZyBvZiBjZ2VuX2ZpbGVzLgorCShiZmRfaTk2MF9hcmNoKTogRGVsZXRlIGk5NjBjLSoubG8gZmlsZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBjZ2VuLWFzbS5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCisJKGhhc2hfaW5zbl9hcnJheSk6IFJld3JpdGUuCisJKiBjZ2VuLWRpcy5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCisJKGhhc2hfaW5zbl9hcnJheSk6IFJld3JpdGUuCisJKiBjZ2VuLW9wYy5jICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCisJKGNnZW5fbG9va3VwX2luc24sY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyk6IERlZmluZSBoZXJlLgorCShjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IERpdHRvLgorCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KKwkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCisJKiBwby9QT1RGSUxFUy5pbjogUmVidWlsZC4KKwkqIHBvL29wY29kZXMucG90OiBSZWJ1aWxkLgorCitGcmkgRmViICA1IDAwOjA0OjI0IDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShIRklMRVMpOiBBZGQgZnIzMC1vcGMuaC4KKwkoQ0ZJTEVTKTogQWRkIGZyMzAtYXNtLmMsIGZyMzAtZGlzLmMsIGZyMzAtb3BjLmMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgQUNfUFJFUkVRIHRvIDIuMTMuICBSZW1vdmUgQU1fQ1lHV0lOMzIuCisJQ2hhbmdlIEFNX0VYRUVYVCB0byBBQ19FWEVFWFQgYW5kIEFNX1BST0dfSU5TVEFMTCB0bworCUFDX1BST0dfSU5TVEFMTC4KKwkqIGFjY29uZmlnLmg6IFJlbW92ZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCisJKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KKwkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCisJKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCisKK1RodSBGZWIgIDQgMTM6NDg6NTIgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG1vdmUgKG5vdCBtb3ZldykgdG8gc3RhdHVzIHdvcmQgb24gNTIwMC4KKworTW9uIEZlYiAgMSAyMDo1NDozNiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6ICBIYW5kbGUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheC4KKyAgICAgICAgKiBpMzg2LWRpcy5jICh4X21vZGUpOiAgRGVmaW5lLgorICAgICAgICAoZGlzMzg2KTogIFJlbW92ZS4KKyAgICAgICAgKGRpczM4Nl9hdHQpOiAgTmV3LgorICAgICAgICAoZGlzMzg2X2ludGVsKTogIE5ldy4KKyAgICAgICAgKGRpczM4Nl90d29ieXRlKTogIFJlbW92ZS4KKyAgICAgICAgKGRpczM4Nl90d29ieXRlX2F0dCk6ICBOZXcuCisgICAgICAgIChkaXMzODZfdHdvYnl0ZV9pbnRlbCk6ICBOZXcuCisgICAgICAgIChwcmludF9pbnNuX3g4Nik6ICBVc2UgbmV3IGFycmF5cy4KKyAgICAgICAgKGZsb2F0X21lbSk6ICBSZW1vdmUuCisgICAgICAgIChmbG9hdF9tZW1faW50ZWwpOiAgTmV3LgorICAgICAgICAoZmxvYXRfbWVtX2F0dCk6ICBOZXcuCisgICAgICAgIChkb2Zsb2F0KTogIFVzZSBuZXcgZmxvYXRfbWVtIGFycmF5cy4KKyAgICAgICAgKHByaW50X2luc25faTM4Nl9hdHQpOiAgTmV3LgorICAgICAgICAocHJpbnRfaW5zbl9pMzg2X2ludGVsKTogIE5ldy4KKyAgICAgICAgKHByaW50X2luc25faTM4Nik6ICBIYW5kbGUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheC4KKyAgICAgICAgKHB1dG9wKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCisgICAgICAgIChPUF9pbmRpckUpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KKyAgICAgICAgKE9QX0UpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KKyAgICAgICAgKE9QX0kpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KKyAgICAgICAgKE9QX3NJKTogIEhhbmRsZSBpbnRlbCBzeW50YXguCisgICAgICAgIChPUF9PRkYpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KKworCisKKzE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogZnIzMC1vcGMuaCxmcjMwLW9wYy5jOiBSZWJ1aWxkLgorCSogaTk2MGMtb3BjLmgsaTk2MGMtb3BjLmM6IFJlYnVpbGQuCisJKiBtMzJyLW9wYy5jOiBSZWJ1aWxkLgorCitUdWUgSmFuIDE5IDE4OjAxOjU0IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBocHBhLWRpcy5jOiByZXZlcnQgSFAgbWVyZ2UgY2hhbmdlcyB1bnRpbCBIUCBnaXZlcyB1cworCWFuIHVwZGF0ZWQgZmlsZS4KKwkKKzE5OTktMDEtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEaXNwbGF5IEFSTSBzeW50YXggZm9yIFBDIHJlbGF0aXZlCisJb2Zmc2V0cyBhcyB3ZWxsIGFzIHN5bWJsb2ljIGFkZHJlc3MuCisKK1R1ZSBKYW4gMTkgMTA6NTE6MDEgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIGhwcGEtZGlzLmM6IGZpeCBjb21tZW50cyBhbmQgc29tZSBpbmRlbnRhdGlvbi4KKworMTk5OS0wMS0xMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBmcjMwLW9wYy5jLGk5NjBjLW9wYy5jOiBSZWdlbmVyYXRlLgorCisxOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCisKKzE5OTktMDEtMDYgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KKworMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuaCxmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgorCSogaTk2MGMtYXNtLmMsaTk2MGMtZGlzLmMsaTk2MGMtb3BjLmgsaTk2MGMtb3BjLmM6IFJlZ2VuZXJhdGUuCisJKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgorCisxOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgorCisxOTk4LTEyLTMwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwczE2LW9wYy5jOiBNYXJrIGJyYW5jaCBpbnNucyB3aXRoIE1JUFMxNl9JTlNOX0JSQU5DSC4KKworV2VkIERlYyAxNiAxNjoxNzo0OSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgorCisxOTk4LTEyLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAoc2V0X21pcHNfaXNhX3R5cGUpOiBIYW5kbGUgYmZkX21hY2hfbWlwczQxMTEuCisKKzE5OTgtMTItMTUgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKworMTk5OC0xMi0xNCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgorCitUaHUgRGVjIDEwIDE4OjM5OjQ2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKworVGh1IERlYyAxMCAxMjo0OToyNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgorCitUdWUgRGVjICA4IDEzOjU2OjE4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiByZWZvcm1hdCB0byBHTlUgY29kaW5nCisJY29udmVudGlvbnMuICBjaGFuZ2Ugc3ByaW50ZiBjYWxsIHRvIGFuIHNwcmludGZfdm1hIGNhbGwuCisKK1R1ZSBEZWMgIDggMTM6MTI6NDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKworVHVlIERlYyAgOCAxMDo1MDo0NiAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkKKwlFbGVuYSBaYW5ub25pIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4sCisJRGF2aWQgVGF5bG9yIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4sIGFuZAorCUVkaXRoIEVwc3RlaW4gPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0bworCW1lcmdlIGluIGNoYW5nZXMgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgorCisJKiBkaXMtYnVmLmMgKGdlbmVyaWNfc3RyY2F0X2FkZHJlc3MpOiBuZXcgZnVuY3Rpb24uCisKKwkqIGhwcGEtZGlzLmM6IENoYW5nZXMgdG8gaW1wcm92ZSBocHBhIGRpc2Fzc2VtYmx5LgorCSAgQ2hhbmdlZCBmb3JtYXR0aW5nIGluIDogcmVnX25hbWVzLCBmcF9yZWdfbmFtZXMsY29udHJvbF9yZWcsIAorCSAgTmV3IHZhcmlhYmxlcyA6IHNpZ25fZXh0ZW5zaW9uX25hbWVzLCBkZXBvc2l0X25hbWVzLCBjb252ZXJzaW9uX25hbWVzCisJICAgIGZsb2F0X3Rlc3RfbmFtZXMsIGNvbXBhcmVfY29uZF9uYW1lc19kb3VibGUsIGFkZF9jb25kX25hbWVzX2RvdWJsZSwKKwkgICAgbG9naWNhbF9jb25kX25hbWVzX2RvdWJsZSwgdW5pdF9jb25kX25hbWVzX2RvdWJsZSwgCisJICAgIGJyYW5jaF9wdXNoX3BvcF9uYW1lcywgc2F0dXJhdGlvbl9uYW1lcywgc2hpZnRfbmFtZXMsIG1peF9uYW1lcywKKwkgIE5ldyBNYWNyb3MgOiAgIEdFVF9DT01QTF9PLCBHRVRfUFVTSF9QT1AsTUVSR0VEX1JFRyAKKwkgIE1vdmUgc29tZSBkZWZpbml0aW9ucyB0byBsaWJocHBhLmg6IEdFVF9GSUVMRCwgR0VUX0JJVAorCSAgKGZwdXRfY29uc3QpOiByZW5hbWVkIGFzIGZwdXRfaGV4X2NvbnN0CisJICAocHJpbnRfaW5zbl9ocHBhKToKKwkgICAtIHVzZSB0aGUgbWFjcm9zIGZwdXRzX2ZpbHRlcmVkIGFuZAorCSAgICAgZnB1dF9kZWNpbWFsX2NvbnN0IHdoZW5ldmVyIHBvc3NpYmxlOyBjYWxscyB0byBzaWduX2V4dGVuZCByZXF1aXJlCisJICAgICAyIHBhcmFtcyAtLSBhZGQgYSBtaXNzaW5nIHNlY29uZCBwYXJhbSBvZiAwLgorCSAgIC0gU29tZSBuZXcgY29kZSBpZmRlZmVkIGZvciBMT0NBTF9PTkxZLCBhbGwgcmVsYXRlZCB0byBmaWd1cmluZyBvdXQKKwkgICAgIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIG51bWJlciBvZiBjdXJyZW50IG1hY2hpbmUuIEhQIGZvbGtzIGFyZQorCSAgICAgdHJ5aW5nIHRvIGhhbmRsZSBzaXR1YXRpb24gd2hlcmUgdGhlIHRhcmdldCBwcm9ncmFtIHdhcyBjb21waWxlZAorCSAgICAgZm9yIFBBIDEueCAoMzItYml0KSwgYnV0IGlzIHJ1bm5pbmcgb24gYSBQQSAyLjAgbWFjaGluZSBhbmQgCisJICAgICB2aXNhIHZlcnNhLgorCSAgIC0gYWRkZWQgbmV3IGNhc2VzIDogJ2cnLCAnQicsICdtJworCSAgIC0gYWRkZWQgY2FzZXMgc3BlY2lmaWNhbGx5IGZvciBQQSAyLjAKKwkgICAtIGNoYW5nZWQgdGhlIGZvbGxvd2luZyBjYXNlcyA6ICciJywgJ24nLCAnTicsICdwJywgJ1onLCAKKwkgICAtIGNhbGxzIHRvIGZwdXRfY29uc3QgYmVjb21lIGNhbGxzIHRvIGZwdXRfaGV4X2NvbnN0CisKKzE5OTgtMTItMDcgIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGk5NjBjLWFzbSwgaTk2MGMtZGlzLmMsIGk5NjBjLW9wYy5jLgorCShBTExfTUFDSElORVMpOiBBZGQgaTk2MGMtYXNtLmxvLCBpOTYwYy1kaXMubG8sIGk5NjAtb3BjLmxvLgorCShpOTYwLWFzbS5sbywgaTk2MGMtZGlzLmxvLCBpOTYwYy1vcGMubG8pOiBOZXcgTWFrZWZpbGUgcnVsZXMuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIGNvbmZpZ3VyZS5pbiAoYmZkX2k5NjBfYXJjaCk6IEFkZCBpOTYwYy1vcGMubG8sIGk5NjAtYXNtLm8sCisJaTk2MC1kaXMuYyB0byB0YS4KKwkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IFJlbmFtZSB0byBwcmludF9pbnNuX2k5NjBfb3JpZy4KKwkqIGk5NjBjLWFzbS5jLCBpOTYwYy1kaXMuYywgaTk2MGMtb3BjLmMsIGk5NjBjLW9wYy5oOiBOZXcgZmlsZXMuCisJCitNb24gRGVjICA3IDE0OjMzOjQ0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCisKK1N1biBEZWMgIDYgMTQ6MDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IEFkZCBkbWZjMiBhbmQgZG10YzIuCisKKwkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQWRkIFBvd2VyUEM0MDMgR0NbWF0gaW5zdHJ1Y3Rpb25zLgorCUZyb20gU2FpdG9oIE1hc2Fub2J1IDxtc2FpdG9oQHNwYS5pcy51ZWMuYWMuanA+LgorCitGcmkgRGVjICA0IDE3OjQ1OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCisKK0ZyaSBEZWMgIDQgMTc6MDg6MDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKworVGh1IERlYyAgMyAxNDoyNjoyMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgorCitUaHUgRGVjICAzIDAwOjA5OjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCisKKzE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY2dlbi1kaXMuYyAoaGFzaF9pbnNuX2FycmF5KTogQ0dFTl9JTlNOX1ZBTFVFIC0+CisJQ0dFTl9JTlNOX0JBU0VfVkFMVUUuCisJKiBtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgorCSogZnIzMC1vcGMuYyxmcjMwLW9wYy5oLGZyMzAtYXNtLmMsZnIzMC1kaXMuYzogUmVnZW5lcmF0ZS4KKworVGh1IE5vdiAyNiAxMToyNjozMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KKworVHVlIE5vdiAyNCAxMToyMDo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCisKK01vbiBOb3YgMjMgMTg6Mjg6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKworMTk5OC0xMS0yMCAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgorCisJKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KKworVGh1IE5vdiAxOSAxNjowMjo0NiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgorCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCisJKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KKwkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgorCitUaHUgTm92IDE5IDA3OjU0OjE1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jIChzeW5jLnAsc3luYy5sKTogU3dhcCBpbnNuIHZhbHVlcy4KKworMTk5OC0xMS0xOSAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgorCisJKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgorCitXZWQgTm92IDE4IDIxOjM2OjM3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCisJKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKworMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYzogUmVidWlsZC4KKwkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgorCitXZWQgTm92IDE4IDExOjMwOjA0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCisKK01vbiBOb3YgMTYgMTk6MjE6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCQorCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCisJKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KKwkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgorCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCisKK1RodSBOb3YgMTIgMTk6MjQ6MTggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZWQuCisJKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KKwkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgorCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCisJKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KKworVHVlIE5vdiAxMCAxNToyNjoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBBZGQgc3VwcG9ydCBmb3IgRlIzMCB0YXJnZXQuCisJCitUdWUgTm92IDEwIDExOjAwOjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWJ1aWxkLgorCSogZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlYnVpbGQuCisKK01vbiBOb3YgIDkgMTg6MjI6NTUgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZS4KKwkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlLgorCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KKwkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGUuCisKK0ZyaSBOb3YgIDYgMTc6MjE6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1hc20uYzogUmVnZW5lcmF0ZS4KKworV2VkIE5vdiAgNCAxODo0Njo0NyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY2FzZSBmb3IgYmZkX2ZyMzBfYXJjaC4KKwkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGRlZCBmcjMwLWFzbS5jLCBmcjMwLWRpcy5jLCBmcjMwLW9wYy5jLgorCShBTExfTUFDSElORVMpOiBBZGRlZCBmcjMwLWFzbS5sbywgZnIzMC1kaXMubG8sIGZyMzAtb3BjLmxvLgorCShDTEVBTkZJTEVTKTogQWRkZWQgc3RhbXAtZnIzMC4KKwkoRlIzMF9ERVBTKTogQWRkZWQuCisJKiBmcjMwLWFzbS5jOiBOZXcgZmlsZS4KKwkqIGZyMzAtZGlzLmM6IE5ldyBmaWxlLgorCSogZnIzMC1vcGMuYzogTmV3IGZpbGUuCisJKiBmcjMwLW9wYy5oOiBOZXcgZmlsZS4KKwkqIHBvL1BPVEZJTEVTLmluOiBSZWdlbmVyYXRlZAorCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlZ2VuZXJhdGVkCisKK01vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKKyAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKworVHVlIE9jdCAyNyAwODo1ODozNyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYyAoSVNfTSk6IEFkZGVkLgorCitNb24gT2N0IDE5IDEzOjAzOjE5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5jLG0zMnItb3BjLmgsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgorCitGcmkgT2N0ICA5IDE0OjAxOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCisKK1N1biBPY3QgIDQgMjE6MDE6NDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LWRpcy5jIChPUF8zRE5vd1N1ZmZpeCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKE9QU1VGKTogRGVmaW5lLgorCShHUlAxNCk6IERlZmluZS4KKwkoZGlzMzg2X3R3b2J5dGUpOiBBZGQgR1JQMTQsIGZlbW1zLCBhbmQgM0ROb3cgZW50cmllcy4KKwkodHdvYnl0ZV9oYXNfbW9kcm0pOiBTZXQgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIEdSUDE0LCAzRE5vdy4KKwkoaW5zbl9jb2RlcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHByaW50X2luc25feDg2KTogSW5pdCBpbnNuX2NvZGVwIGFmdGVyIHByZWZpeGVzLgorCShncnBzKTogQWRkIEdSUDE0IGVudHJpZXMgZm9yIHByZWZldGNoLCBwcmVmZXRjaHcuCisJKE9QX1JFRyk6IFJlZm9ybWF0LgorCisJRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KKwkqIGkzODYtZGlzLmMgKFN1ZmZpeDNETm93KTogTmV3IHRhYmxlLgorCitXZWQgU2VwIDMwIDEwOjE3OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGQxMHYtb3BjLmM6IFRyZWF0IFRSQVAgYXMgaWYgaXQgd2VyZSBhIGJyYW5jaCB0eXBlIGluc3RydWN0aW9uLgorCitNb24gU2VwIDI4IDE0OjM1OjQzIDE5OTggIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogSWYgbnVtIGlzIG5vbnplcm8sIHRoZW4KKwlhZGQgT1BFUkFORF9BQ0MxLCBub3QgT1BFUkFORF9BQ0MwLgorCitUaHUgU2VwIDI0IDA5OjIwOjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmM6IEFkZCBGTEFHX0pTUiBhdHRyaWJ1dGUgdG8gREJULCBSRUlULCBSVEQsIGFuZCBUUkFQCisJaW5zbnMuIAorCitUdWUgU2VwIDIyIDE3OjU1OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmM6IEFkZCB1c2Ugb2YgRUlUSEVSX0JVVF9QUkVGRVJfTVUgZXhlY3V0aW9uIHVuaXQKKwljbGFzcy4gCisKK1R1ZSBTZXAgMTUgMTU6MTQ6NDUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jOiBBZGQgYmJwYyxiYnBzdyBzdXBwb3J0LgorCisxOTk4LTA5LTA5ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQyA3NTAgbW92ZQorCXRvL2Zyb20gU1BScy4KKworRnJpIFNlcCAgNCAxOTo0Mjo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6IERldGVjdCBUaHVtYiBzeW1ib2xzIGluIGVsZgorCW9iamVjdCBmaWxlcy4KKwkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogRGV0ZWN0IFRodW1iIHN5bWJvbHMgaW4gZWxmIG9iamVjdAorCWZpbGVzLiAKKworU2F0IEF1ZyAyOSAyMjoyNDowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFVzZSB0aGUgbWFjaGluZSB0eXBlIHRvCisJZGVjaWRlIHdoaWNoIFBBTGNvZGUgc2V0IHRvIGluY2x1ZGUuCisKK1N1biBBdWcgMjMgMDI6MTY6MTggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKEZCUlgpOiBGaXggdHlwbyBpbiAiLGEscG4gJWZjYzMiIGNhc2UuCisKK0ZyaSBBdWcgMjEgMTY6MDc6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBBZGQgRkxBR19NVUwzMiB0byBNQUMsIE1BQ1MsCisJTVNVQiBhbmQgTVNVQlMgaW5zdHJ1Y3Rpb25zLgorCitUaHUgQXVnIDEzIDE2OjIzOjA0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogT21pdCBwYXJlbnMgYXJvdW5kIGFkZGl0aW9ucyBpbgorCW9wZXJhbmQgbmFtZSBtYWNyb3MuCisKK1dlZCBBdWcgMTIgMTQ6MDA6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBQZXRlciBKZXJlbXkgPHBldGVyLmplcmVteUBhdXNzMi5hbGNhdGVsLmNvbS5hdT46CisJKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG11bHNsIGFuZCBtdWx1bCB0byB1c2UgcSByYXRoZXIgdGhhbiBELCBhLAorCSssIC0sIGFuZCBkIGZvciBDb2xkRmlyZS4KKworCUZyb20gUGV0ZXIgVGhpZW1hbm4gPHRoaWVtYW5uQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZT46CisJKiBwcGMtb3BjLmMgKGluc2VydF9tYmUpOiBIYW5kbGUgd3JhcHBpbmcgYml0bWFza3MuCisJKGV4dHJhY3RfbWJlKTogTGlrZXdpc2UuCisKK1dlZCBBdWcgMTIgMTE6MTE6MzQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtMTAzMDAtb3BjLmM6IEZpeCB0eXBvIGluIHVkZjIwIC4uIHVkZjI1IGluc3RydWN0aW9uIG9wY29kZXMuCisKKwkqIG0xMDMwMC1vcGMuYzogRmlyc3QgY3V0IGF0IFVERiBpbnN0cnVjdGlvbnMuCisKK01vbiBBdWcgMTAgMTQ6MDg6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZSAocmVtb3ZlIHNlbWFudGljIGRlc2NyaXB0aW9ucykuCisKK01vbiBBdWcgMTAgMTI6NTE6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6ICBGaXggaW5kZW50YXRpb24uCisgICAgICAgIChwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBMaWtld2lzZS4KKworU3VuIEF1ZyAgOSAyMDoxNzoyOCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogIENoZWNrIGZvciB0aHVtYiBzeW1ib2wKKyAgICAgICAgYXR0cmlidXRlcy4KKyAgICAgICAgKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgorCitNb24gQXVnICAzIDEyOjQzOjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJTW92ZSBhbGwgZ2xvYmFsIHN0YXRlIGRhdGEgaW50byBvcGNvZGUgdGFibGUgc3RydWN0LCBhbmQgdHJlYXQKKwlvcGNvZGUgdGFibGUgYXMgc29tZXRoaW5nIHRoYXQgaXMgIm9wZW5lZC9jbG9zZWQiLgorCSogY2dlbi1hc20uYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCisJKGNnZW5fYXNtX2luaXQpOiBEZWxldGUuCisJKGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4pOiBOZXcgZnVuY3Rpb24uCisJKiBjZ2VuLWRpcy5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KKwkoY2dlbl9kaXNfaW5pdCk6IERlbGV0ZS4KKwkqIGNnZW4tb3BjLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgorCShjZ2VuX2N1cnJlbnRfe29wY29kZV90YWJsZV9tYWNoLGVuZGlhbn0pOiBEZWxldGUuCisJKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgorCitUaHUgSnVsIDMwIDIxOjQxOjEwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQWRkIG5ldyAiTEtSIiBmbGFnIHRvIHNvbWUKKwlpbnN0cnVjdGlvbnMuCisKK1R1ZSBKdWwgMjggMTE6MDA6MDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtMTAzMDAtb3BjLmM6IEFkZCBlbnRyaWVzIGZvciAibm9fbWF0Y2hfb3BlcmFuZHMiIGZpZWxkIGluCisJdGhlIG9wY29kZSB0YWJsZS4KKworRnJpIEp1bCAyNCAxMTo0MTozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLWFzbS5jLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUgKC1XYWxsIGNsZWFudXBzKS4KKworVHVlIEp1bCAyMSAxMzo0MTowNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuaCxtMzJyLW9wYy5jLG0zMnItYXNtLmMsbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KKworTW9uIEp1bCAxMyAxNDo1Mzo1OSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGkzODYtZGlzLmMgKGNrcHJlZml4KTogSGFuZGxlIGZ3YWl0IHNwZWNpYWxseSBvbmx5IHdoZW4gaXQgaXNuJ3QKKwl0aGUgZmlyc3QgcHJlZml4LgorCShkb2Zsb2F0KTogQ29ycmVjdCB0ZXN0IGZvciBmbnN0c3cuICBQcmludCBgZm5zdHN3ICVheCcgcmF0aGVyCisJdGhhbiBgZm5zdHN3ICVlYXgnLgorCShPUF9KKTogUmVtb3ZlIHVubmVjZXNzYXJ5IHN1YnRyYWN0aW9uIHdoZW4gMTYtYml0IGRpc3BsYWNlbWVudAorCXdpbGwgYmUgbWFza2VkIGxhdGVyLgorCitUaHUgSnVsICAyIDE3OjExOjI3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5oIChDR0VOX01JTl9JTlNOX1NJWkUpOiBOZXcgI2RlZmluZS4KKworV2VkIEp1bCAgMSAxNjoxMToxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KKworRnJpIEp1biAyNiAxMTowODo1NSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG0xMDMwMC1kaXMuYzogT25seSByZWNvZ25pemUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGN1cnJlbnRseQorCXNlbGVjdGVkIG1hY2hpbmUuCisJKiBtMTAzMDAtb3BjLmM6IEFkZCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBwYXJ0aWN1bGFyIHZhcmlhbnQgb2YKKwl0aGUgbW4xMDMwMCBlYWNoIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbi4KKworRnJpIEp1biAyNiAxMjowNDoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRm9yIGJmZF92YXhfYXJjaCwgYnVpbGQgdmF4LWRpcy5sby4KKwkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKyAJKENGSUxFUyk6IEFkZCB2YXgtZGlzLmMuCisJKEFMTF9NQUNISU5FUyk6IEFkZCB2YXgtZGlzLmxvLgorCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGN1cnJlbnQgbGlidG9vbC4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBKdW4gMjYgMTI6MDM6MjAgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIHZheC1kaXMuYzogTmV3IGZpbGUsIGZyb20gd29yayBieSBQYXVsaW5lIE1pZGRlbGluaworCTxtaWRkZWxpbkBwb2x5d2FyZS5pYWYubmw+LgorCSogZGlzYXNzZW1ibGUuYyAoQVJDSF92YXgpOiBEZWZpbmUgaWYgQVJDSF9hbGwuCisJKGRpc2Fzc2VtYmxlcik6IEFkZCBjYXNlIGZvciBBUkNIX3ZheC4KKwkqIG1ha2VmaWxlLnZtczogU3VwcG9ydCBjb21waWxhdGlvbiBvbiB2bXMvdmF4LgorCitUdWUgSnVuIDIzIDE5OjQyOjE4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBGaXggdmFyaW91cyBub24tcG9ydGFiaWxpdGllcworCXJlbGF0ZWQgdG8gc2lnbiBleHRlbnNpb24gYW5kIHRoZSBzaXplIG9mIGludHMuCisKK1R1ZSBKdW4gMjMgMTA6NTk6MjYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtMTAzMDAtb3BjLmM6IFN1cHBvcnQgb25lIG9wZXJhbmQgImFzciIsICJsc3IiIGFuZCAiYXNsIgorCWluc3RydWN0aW9ucy4gIFN1cHBvcnQgKHNwKSBhZGRyZXNzaW5nIG1vZGUgYnkgZXhwYW5kaW5nIGl0IGludG8KKwkoMCxzcCkuCisKK1NhdCBKdW4gMjAgMTQ6NDY6MjAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IEZpeCBhcmd1bWVudCBpbnRlcmNoYW5nZSB0eXBvLgorCitGcmkgSnVuIDE5IDA5OjE2OjQyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbTEwMjAwLWRpcy5jIChwcmludF9pbnNuX21uMTAyMDApOiBSZWNvZ25pemUgJ2JyZWFrJyBwc2V1ZG8tb3AuCisKKzE5OTgtMDYtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jOiBBZGQgc3VwcG9ydCBmb3IgZnhzYXZlLCBmeHJzdG9yLCBzeXNlbnRlciBhbmQKKwlzeXNleGl0LgorCitUaHUgSnVuIDE4IDEwOjIyOjI0IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+CisKKwkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBQcmV2aW91c2x5LCBpbnN0cnVjdGlvbgorIAlwcmludGluZyByZWZlcmVuY2VzIHRoZSBzeW1ib2wgdGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCisgCWluc3RydWN0aW9uIHJlc2lkZXMgaW4gYSBibG9jayByZWd1bGFyIGluc3RydWN0aW9ucyBvciBtaXBzMTYKKyAJaW5zdHJ1Y3Rpb25zLiBIb3dldmVyLCB3aGVuIHRoZSBkaXNhc3NlbWJsZXIgZ2V0cyB1c2VkIGluIG90aGVyCisgCWVudmlyb25tZW50cyB3aGVyZSB0aGUgc3ltYm9sIHRhYmxlIGlzIG5vdCBwcmVzZW50LCB3ZSBubyBsb25nZXIKKyAJcmVseSBpbiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIsIHVzZSB0aGUgbG93IGJpdCBvZiB0aGUKKyAJaW5zdHJ1Y3Rpb25zIGFkZHJlc3MgdG8gZ3Vlc3MuIFRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2UgZm9yIHVzYWdlCisgCW9mIHRoZSBkaXNhc3NlbWJsZXIgaW4gaG9zdCBiYXNlZCBwcm9ncmFtcywgZ2RiLCBvYmpkdW1wLgorCShwcmludF9pbnNuX2JpZ19taXBzKTogZGl0dG8uCisJKHByaW50X2luc25fbWlwcyk6IGRpdHRvCisKK1dlZCBKdW4gMTcgMjE6MTk6MDEgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IERvbid0IGJvbWIgb24gdW5rbm93biBvcGNvZGVzLgorCitXZWQgSnVuIDE3IDE3OjQ5OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbTEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBDaGFuZ2Ugb3Bjb2RlIGZvciAic3lzY2FsbCIuCisKK1R1ZSBKdW4gMTYgMTM6MTA6NTEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgorCisJKiBpMzg2LWRpcy5jIChpbmRleDE2KTogQWRkICclJyB0byByZWdpc3RlciBuYW1lcy4gIFVzZSAnLCcKKwlpbnN0ZWFkIG9mICcrJy4KKworU2F0IEp1biAxMyAxMTozMzo1NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGkzODYtZGlzLmM6IERvbid0IHByaW50IG9wY29kZSBzdWZmaXggd2hlbiB3ZSBjYW4gZmlndXJlIG91dCB0aGUKKwlzaXplIChhbmQgZ2FzIGNhbiEpIGJ5IHJlZ2lzdGVyIG9wZXJhbmRzLCBvciBmcm9tIHRoZSBkZWZhdWx0CisJc2l6ZS4KKwkocHV0b3ApOiBIYW5kbGUgJ0EnLCAnQicsICdMJywgJ1AnLCAnUScsICdSJyBtYWNyb3MuICBSZW5hbWUgJ0MnCisJbWFjcm8gdG8gJ0UnLgorCShkaXMzODYsIGRpczM4Nl90d29ieXRlLCBncnBzKTogVXNlIG5ldyBzdWZmaXggbWFjcm9zLgorCShkaXMzODYpOiBDb3JyZWN0IGltdWwgSWIgdG8gaW11bCBzSWIuICBDaGFuZ2Ugam5sIHRvIGpnZSB0byBiZQorCWNvbnNpc3RlbnQuICBBZGQgc3VmZml4IGZvciBjYWxsLCBqbXAsIGxjYWxsLCBsam1wLCBpcmV0LiAgUmV2ZXJzZQorCW9yZGVyIG9mIGNtcHMgb3BlcmFuZHMgdG8gYWdyZWUgd2l0aCBJbnRlbCBkb2NzLiAgQ29ycmVjdCBvcGVyYW5kCisJb2YgYWFkIGFuZCBhYW0gKEliIC0+IHNJYikuICBDaGFuZ2UgdWQyYiBmcm9tIDBmYjggdG8gMGZiOSB0bworCWFncmVlIHdpdGggSW50ZWwgZG9jcy4KKwkocHJpbnRfaW5zbl94ODYpOiBQcmludCBvcnBoYW4gZndhaXQgYmVmb3JlIG90aGVyIHByZWZpeGVzLgorCVJldHVybiBjb3JyZWN0IGJ5dGUgY291bnQgZm9yIG9ycGhhbiBmd2FpdCB3aXRoIHByZWZpeGVzLiAgRG9uJ3QKKwlwcmludCBgYm91bmQnIG9wZXJhbmRzIGluIHJldmVyc2Ugb3JkZXIuCisJKGNrcHJlZml4KTogU3RvcCBhY2N1bXVsYXRpbmcgcHJlZml4ZXMgaWYgd2UgZ2V0IGZ3YWl0LgorCShPUF9ESVIpOiBQcmludCBgJCcgYmVmb3JlIEFwIG9wZXJhbmRzIG9mIGxqbXAsIGxjYWxsLgorCitGcmkgSnVuIDEyIDEzOjQwOjM4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogcG8vTWFrZS1pbiAoYWxsLXllcyk6IElmIG1haW50YWluZXIgbW9kZSwgZGVwZW5kIG9uIC5wb3QgZmlsZS4KKwkoJChQQUNLQUdFKS5wb3QpOiBVbmNvbmRpdGlvbmFsbHkgZGVwZW5kIG9uIFBPVEZJTEVTLgorCitGcmkgSnVuIDEyIDExOjA0OjA2IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJRml4IHByb2JsZW1zIHdoZW4gYmZkX3ZtYSBpcyB3aWRlciB0aGFuIGxvbmcuCisJKiBpMzg2LWRpcy5jOiBNYWtlIG9wX2FkZHJlc3MgYW5kIHN0YXJ0X3BjIHVuc2lnbmVkLgorCShzZXRfb3ApOiBNYWtlIHBhcmFtZXRlciB1bnNpZ25lZC4KKwkocHJpbnRfaW5zbl94ODYpOiBDYXN0IHRvIGJmZF92bWEgd2hlbiBwYXNzaW5nIGEgdmFsdWUgdG8KKwlwcmludF9hZGRyZXNzX2Z1bmMuCisJKiBuczMyay1kaXMuYyAoQ09SRV9BRERSKTogRG9uJ3QgZGVmaW5lLgorIAkocHJpbnRfaW5zbl9uczMyayk6IENoYW5nZSB0eXBlIG9mIGFkZHIgdG8gYmZkX3ZtYS4gIFVzZQorCWJmZF9zY2FuX3ZtYSB0byByZWFkIGJhY2sgYWRkcmVzcy4KKwkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2UgdHlwZSBvZiBhZGRyIHRvIGJmZF92bWEuICBVc2Ugc3ByaW50Zl92bWEKKwl0byBmb3JtYXQgaXQuCisJKiBtNjhrLWRpcy5jIChDT0VSQ0UzMik6IENhc3QgdG8gYmZkX3NpZ25lZF92bWEgdG8gYXZvaWQgb3ZlcmZsb3cuCisJKE5FWFRVTE9ORyk6IE5ldyBkZWZpbml0aW9uLgorCShwcmludF9pbnNuX202OGspOiBBdm9pZCBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyB0aGlyZCBhcmd1bWVudCBvZgorCXByaW50X2luc25fYXJnLgorCShwcmludF9pbnNuX2FyZyk6IFVzZSBORVhUVUxPTkcgdG8gZmV0Y2ggMzIgYml0IGFkZHJlc3MgdmFsdWVzLgorCVVzZSBkaXNwIGluc3RlYWQgb2YgdmFsIHRvIHN0b3JlIG9mZnNldCB2YWx1ZXMuCisJKHByaW50X2luZGV4ZWQpOiBVc2UgYmFzZV9kaXNwIGluc3RlYWQgb2Ygd29yZCB0byBzdG9yZSBiYXNlCisJZGlzcGxhY2VtZW50LCB0byBhdm9pZCBvdmVyZmxvdy4KKwkqIG0xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBDYXN0IHZhbHVlIHRvIGxvbmcgd2hlbiBjb21wdXRpbmcKKwlwYy1yZWxhdGl2ZSBhZGRyZXNzLCB0byBnZXQgY29ycmVjdCBzaWduIGV4dGVuc2lvbi4KKworV2VkIEp1biAxMCAxNTo1ODozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgorCitUdWUgSnVuICA5IDE0OjI3OjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFybS1vcGMuaCAodGh1bWJfb3Bjb2Rlcyk6IERpc3BsYXkgJ2FkZCByeCwgclksICMwJyBpbnNucyBhcworCSdtb3YgclgsIHJZJy4gIFBhdGNoIGNvdXJ0ZXN5IG9mIFRvbnkgVGhvbXBzb24gPFRvbnkuVGhvbXBzb25AYXJtLmNvbT4KKworTW9uIEp1biAgOCAxODoxNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkMzB2LW9wYy5jOiBSZW1vdmUgRkFMR19NVUwzMiBhdHRyaWJ5dGUgZnJvbSBNVUxYMkggaW5zbi4KKworRnJpIEp1biAgNSAyMzo0Nzo1NSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGkzODYtZGlzLmM6ICBDb21iaW5lIGFmbGFnIGFuZCBkZmxhZyBpbnRvIHNpemVmbGFnLiAgQ2hhbmdlIE9QXyoKKwlmdW5jdGlvbnMgdG8gdm9pZC4KKwkoT1BfRFNyZWcpOiBSZW5hbWUgZnJvbSBPUF9EU1NJLgorCShPUF9FU3JlZyk6IFJlbmFtZSBmcm9tIE9QX0VTREkuCisJKFhiLCBYdiwgWWIsIFl2KTogVXNlIGluZGV4IHJlZyBjb2RlLCBub3QgYl9tb2RlIG9yIHZfbW9kZS4KKwkoRFNCWCk6IERlZmluZS4KKwkoYXBwZW5kX3NlZyk6IFJlbmFtZSBmcm9tIGFwcGVuZF9wcmVmaXguCisJKHB0cl9yZWcpOiBOZXcgZnVuY3Rpb24uCisJKGRpczM4Nik6IEFkZCBTIHN1ZmZpeCB0byBwdXNoZiwgcG9wZiwgcmV0LCBscmV0LCBlbnRlciwgbGVhdmUuCisJQWRkIERTQlggZm9yIHhsYXQuCisJKFBSRUZJWF9BRERSKTogUmVuYW1lIGZyb20gUFJFRklYX0FEUi4KKwkoZmxvYXRfcmVnKTogQWRkIG5vbi1icm9rZW4gb3Bjb2RlcyBmb3IgcGVvcGxlIHdobyBkb24ndCB3YW50CisJVU5JWFdBUkVfQ09NUEFULgorCitGcmkgSnVuICA1IDE5OjE1OjA0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrLW9wYy5jICh0c3RiLCB0c3R3LCB0c3RsKTogRG9uJ3QgYWxsb3cgcGNyZWwgb24KKwk2ODAwMC82ODAwOC82ODAxMC4KKworV2VkIEp1biAgMyAxODo1NjoyMiAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+CisKKwkqIGkzODYtZGlzLmMgKGRpczM4Nik6IENoYW5nZSAweDYwIHRvICJwdXNoYVMiLCAweDYxIHRvICJwb3BhUyIuCisKK1R1ZSBKdW4gIDIgMTU6MDY6NDYgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KKworCSogcHBjLW9wYy5jIChwb3dlcnBjX21hY3Jvcyk6IFN1cHBvcnQgc2hpZnRzIGFuZCByb3RhdGVzIG9mIHNpemUKKwkwOyBwcm9kdWNlIGVycm9yIG1lc3NhZ2UgZm9yIHNoaWZ0cyBvZiBzaXplIDMyIChvciA2NCBmb3IgNjQtYml0CisJc2hpZnRzKSwgYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IHRoZW0uCisKK1dlZCBNYXkgMjcgMTU6Mjk6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZDMwdi1vcGMuYzogQWRkIG5ldyBvcGVyYW5kOiBSYTMuICBDaGFuZ2UgU0hPUlRfQjMsIFNIT1JUX0IzYiwKKwlMT05HXzIsIExPTkdfMmIgZm9ybWF0cyB0byB1c2UgdGhpcyBuZXcgb3BlcmFuZC4KKworVHVlIE1heSAyNiAyMDo0Nzo0OCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKGNvbXB1dGVfYXJjaF9tYXNrKTogQWRkZWQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgorCitUdWUgTWF5IDI2IDIwOjQ1OjMzIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBiaWcgZW5kaWFuIGluc3RydWN0aW9uIC8gbGl0dGxlCisJZW5kaWFuIGRhdGEgc3VwcG9ydC4KKworVHVlIE1heSAyNiAxNjoxNDozOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IENoYW5nZSBkZWZpbml0aW9uIG9mIFNIT1JUX0IzCisJYW5kIFNIT1JUX0IzYiBmb3JtYXRzIHRvIHVzZSBSYiBpbnN0ZWFkIG9mIFJhLgorCisJQWRkIEZMQUdfTVVMMTYgdG8gTVVMMlhIIG9wY29kZS4KKworCUFkZCBGTEFHX0FERFNVQnBwcCB0byBTUkMgYW5kIFNBVEhwIG9wY29kZXMgdG8gaW1wbGVtZW50IGV4dGVuc2lvbgorCXRvIGV4aXN0aW5nIDEuMS4xIHBhcmFsbGVsaXNhdGlvbiBwcm9oaWJpdGlvbiBwcm9jZWR1cmUuCisKK0ZyaSBNYXkgMjIgMTY6MDA6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgorCitUdWUgTWF5IDE5IDE3OjM2OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogSGFuZGxlIHR5cGUgJ10nIGNvcnJlY3RseQorCXdpdGggYSBzaGlmdCBjb3VudCBvZiAwLgorCitGcmkgTWF5IDE1IDE0OjU4OjMxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLW9wYy5jIChjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lKTogUmVuYW1lZCBmcm9tIGNnZW5faHdfbG9va3VwLgorCShjZ2VuX2h3X2xvb2t1cF9ieV9udW0pOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBNYXkgMTMgMTc6MDM6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1hc20uYzogUmVnZW5lcmF0ZSAoaGFuZGxlIHVwcGVyY2FzZSBISUdIL1NISUdIL0xPVy9TREEpLgorCitXZWQgTWF5IDEzIDE0OjM0OjMxIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBBbHdheXMgZmV0Y2ggaW5zdHJ1Y3Rpb25zCisJYXMgYmlnLWVuZGlhbiBvbiBTUEFSQ2xpdGUuCisKK1R1ZSBNYXkgMTIgMTE6NDY6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXIpOiBSZW1vdmUgYWxpYXMgZm9yIHIwLgorCitTdW4gTWF5IDEwIDIyOjM3OjIyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KKworVGh1IE1heSAgNyAxNzoxNTo1OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoV0lOMzJMSUJBREQpOiBBZGQgLWxpbnRsIG9uIGN5Z3dpbjMyLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUaHUgTWF5ICA3IDEyOjQ5OjQ2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmMgKHRlcSx0Z2UsdGdldSx0bHQsdGx0dSx0bmUpOiBBZGRlZCB0aHJlZS1vcGVyYW5kCisgCXZhcmlldHkgb2YgSVNBMiBpbnN0cnVjdGlvbnMgdG8gc2V0IGJvdHRvbSB0ZW4gYml0cyBvZiB0cmFwIGNvZGUuCisKK1RodSBNYXkgIDcgMTE6NTQ6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5hbSAoY29uZmlnLnN0YXR1cyk6IEFkZCBleHBsaWNpdCB0YXJnZXQgc28gdGhhdAorCWNvbmZpZy5zdGF0dXMgZGVwZW5kcyB1cG9uIGJmZC9jb25maWd1cmUuaW4uCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVGh1IE1heSAgNyAwOTozMzowMiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jIChicmVhaywgc2RiYnApOiBBZGRlZCB0d28tb3BlcmFuZCB2YXJpZXR5IG9mIElTQTEKKwlpbnN0cnVjdGlvbnMgdG8gc2V0IGJvdHRvbSB0ZW4gYml0cyBvZiBicmVhayBjb2RlLgorCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBJbXBsZW1lbnQgJ3EnIG9wZXJhbmQgZm9ybWF0IHVzZWQKKwlmb3IgYWJvdmUgb3B0aW9uYWwgYXJndW1lbnQuCisKK1dlZCBNYXkgIDYgMTU6MzA6MDYgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2VmaWxlLnZtczogUnVuIGRlYyBjIHdpdGggL25vZGVidWcuCisKK01vbiBNYXkgIDQgMTA6MTk6NTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KKwkqIE1ha2VmaWxlLmFtOiBSZWdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgd2l0aCBta2RlcC4KKworCSogb3BpbnRsLmggKF8pOiBEZWZpbmUgYXMgZGdldHRleHQuCisKK1R1ZSBBcHIgMjggMTQ6MTI6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY2dlbi1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBtMzJyLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIG0zMnItZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogbTMyci1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisKKwkqIGFjbG9jYWwubTQ6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIE1ha2VmaWxlLmFtIChQT1RGSUxFUyk6IFJlbW92ZSBpbmNsdXNpb24gb2YgQkZEX0guCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKwkqIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWx0IHVzaW5nIHJ1bGUgaW4gTWFrZWZpbGUuaW4uCisJKiBwby9vcGNvZGVzLnBvdDogUmVidWlsdCBhZnRlciBjaGFuZ2luZyBQT1RGSUxFUy5pbi4KKworVHVlIEFwciAyOCAxMzoxMzoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19JU0NfUE9TSVggbmVhciBzdGFydC4gIE1vdmUgQ1lfR05VX0dFVFRFWFQKKwlhZnRlciBBQ19QUk9HX0NDLgorCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KKworTW9uIEFwciAyNyAxNDozMTowMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBvcGludGwuaDogTmV3IGZpbGUgLSBjb250YWlucyBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdXNlZAorCWJ5IHNvdXJjZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeS4KKwkqIHBvLzogTmV3IHN1YmRpcmVjdG9yeSAtIGNvbnRhaW5zIGludGVybmF0aW9uYWxpc2F0aW9uIGZpbGVzLgorCSogcG8vTWFrZS1pbjogTmV3IGZpbGUgLSBNYWtlZmlsZSBjb25zdHJ1Y3Rvci4KKwkqIHBvL1BPVEZJTEVTLmluOiBOZXcgZmlsZSAtIGxpc3Qgb2YgZmlsZXMgaW4gb3Bjb2RlcyBkaXJlY3RvcnkKKwl0aGF0IHNob3VsZCBiZSBzY2FuIGZvciBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MuCisJKiBwby9vcGNvZGVzLnBvdDogTmV3IGZpbGUgLSBsaXN0IG9mIGludGVybmF0aW9uaXNhdGlvbiBzdHJpbmdzCisJZm91bmQgaW4gZmlsZXMgbWVudGlvbmVkIGluIHBvL1BPVEZJTEVTLmluLgorCSogTWFrZWZpbGUuYW06IEFkZCBydWxlIHRvIGJ1aWxkIHBvL1BPVEZJTEVTLmluLiAgQWRkIFNVQkRJUlMKKwllbnRyeS4gIEFkZCBpbnRsIGRpcmVjdG9yeSB0byBpbmNsdWRlIHBhdGhzLgorCSogYWNjb25maWcuaDogQWRkIEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRFWFQsCisJSEFWRV9TVFJDUFksIEhBVkVfTENfTUVTU0FHRVMKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHJ1bGUgdG8gYnVpbGQgTWFrZWZpbGUgaW4gcG8gc3ViZGlyZWN0b3J5LgorCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCisJKiBhY2xvY2FsLm00OiBSZWJ1aWx0LgorCSogY29uZmlnLmluOiBSZWJ1aWx0LgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogYWxwaGEtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogYXJjLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIGFyYy1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBhcm0tZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogY2dlbi1hc20uYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBkMzB2LWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIGRpcy1idWYuYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBoODMwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBoODUwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBpMzg2LWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIG0xMDIwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBtMTAzMDAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogbTY4ay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisJKiBtODhrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIG1pcHMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogbnMzMmstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogb3BpbnRsLmg6IEludGVybmF0aW9uYWxpc2VkLgorCSogcHBjLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIHNwYXJjLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KKwkqIHY4NTAtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgorCSogdjg1MC1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCisKK01vbiBBcHIgMjcgMTA6MzM6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tYXNtLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCisJKGFzbV9oYXNoX3RhYmxlX2VudHJpZXMpOiBOZXcgdmFyaWFibGUuCisJKGNnZW5fYXNtX2luaXQpOiBGcmVlIGFzbV9oYXNoX3RhYmxlX2VudHJpZXMuCisJKGhhc2hfaW5zbl9hcnJheSxoYXNoX2luc25fbGlzdCk6IE5ldyBmdW5jdGlvbnMuCisJKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogVXNlIHRoZW0uICBIYXNoIG1hY3JvIGluc25zIGFzIHdlbGwuCisJKGNnZW5fYXNtX2xvb2t1cF9pbnNuKTogVXBkYXRlLgorCSogY2dlbl9kaXMuYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KKwkoZGlzX2hhc2hfdGFibGVfZW50cmllcyk6IE5ldyB2YXJpYWJsZS4KKwkoY2dlbl9kaXNfaW5pdCk6IEZyZWUgZGlzX2hhc2hfdGFibGVfZW50cmllcy4KKwkoaGFzaF9pbnNuX2FycmF5LGhhc2hfaW5zbl9saXN0KTogTmV3IGZ1bmN0aW9ucy4KKwkoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBVc2UgdGhlbS4gIEhhc2ggbWFjcm8gaW5zbnMgYXMgd2VsbC4KKwkoY2dlbl9kaXNfbG9va3VwX2luc24pOiBVcGRhdGUuCisJKiBjZ2VuLW9wYy5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgorCShjZ2VuX3NldF9jcHUsY2dlbl9od19sb29rdXAsY2dlbl9pbnNuX2NvdW50KTogVXBkYXRlLgorCShjZ2VuX21hY3JvX2luc25fY291bnQpOiBOZXcgZnVuY3Rpb24uCisJKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgorCitGcmkgQXByIDI0IDE2OjA3OjU3IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogaTM4Ni1kaXMuYyAoT1BfRFNTSSk6IFByaW50IHNlZ21lbnQgb3ZlcnJpZGUuCisKK01vbiBBcHIgMTMgMTY6NTk6MzkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IEFkZCAiX2FsbCIgZXh0ZW5zaW9uIHRvICdDJworCW9wZXJhdG9yLgorCitNb24gQXByIDEzIDE2OjUwOjI3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKGxpYm9wY29kZXNfbGFfTElCQUREKTogQWRkIEBXSU4zMkxJQkFEREAuCisJKGxpYm9wY29kZXNfbGFfTERGTEFHUyk6IEFkZCBAV0lOMzJMREZMQUdTQC4KKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFdJTjMyTERGTEFHUyBhbmQKKwlXSU4zMkxJQkFERC4KKwkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK0ZyaSBBcHIgMTAgMTg6MTQ6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KKworU3VuIEFwciAgNSAxNjowNDozOSAxOTk4ICBILkouIEx1ICA8aGpsQGdudS5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChzdGFtcC1saWIpOiBDaGVjayB0aGF0IC5saWJzL2xpYm9wY29kZXMuYSBleGlzdHMKKwliZWZvcmUgdHJ5aW5nIHRvIGNvcHkgaXQuCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KKworVGh1IEFwciAgMiAxNzoyNTo0OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5jOiBVc2Ugc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgZm9yIENNUFVJIGluc3RydWN0aW9uLgorCitXZWQgQXByICAxIDE2OjIwOjI3IDE5OTggIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KKworICAgICAgICAqIG5zMzJrLWRpcy5jIChiaXRfZXh0cmFjdF9zaW1wbGUpOiBOZXcgZnVuY3Rpb24gdG8gZXh0cmFjdCBiaXRzCisgICAgICAgIGZyb20gYW4gYXJiaXRyYXJ5IHZhbGlkIGJ1ZmZlciBpbnN0ZWFkIG9mIGZldGNoaW5nIHRoZW0gb24gZGVtYW5kCisgICAgICAgIHVzaW5nIGZldGNoX2RhdGEoKS4KKyAgICAgICAgKGludmFsaWRfZmxvYXQpOiB1c2UgYml0X2V4dHJhY3Rfc2ltcGxlKCkgaW5zdGVhZCBvZiBiaXRfZXh0cmFjdCgpLgorCitUdWUgTWFyIDMxIDExOjA5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgorCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogQ2hhbmdlIDB4OGMgYW5kIDB4OGUgdG8gbW92UywgYW5kIGNoYW5nZSBFdworCXRvIEV2IGZvciBib3RoLgorCitNb24gTWFyIDMwIDE3OjMyOjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgorCitNb24gTWFyIDMwIDE1OjE4OjAwIDE5OTggIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYpOiBEb24ndCB1c2UgdW5pbml0aWFsaXplZCAibnVtIiB3aGVuCisJZGlzYXNzZW1ibGluZyBsYXN0IDQgYnl0ZXMgb2YgYSBzZWN0aW9uLgorCitGcmkgTWFyIDI3IDE4OjA4OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZpeCBzb21lIGdjYyAtV2FsbCB3YXJuaW5nczoKKwkqIGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KKwkqIGNnZW4tb3BjLmMgKGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSk6IExpa2V3aXNlLgorCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcsIGRpc18yX3Nob3J0KTogTGlrZXdpc2UuCisJKiBtMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTGlrZXdpc2UuCisJKiBtMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTGlrZXdpc2UuCisJKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9uczMyayk6IExpa2V3aXNlLgorCSogcHBjLW9wYy5jIChpbnNlcnRfcmFsLCBpbnNlcnRfcmFtKTogTGlrZXdpc2UuCisJKiBjZ2VuLWRpcy5jIChidWlsZF9kaXNfaGFzaF90YWJsZSk6IFJlbW92ZSB1c2VkIGxvY2FsIHZhcmlhYmxlcy4KKwkqIGNnZW4tb3BjLmMgKGNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dCk6IExpa2V3aXNlLgorCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcsIGRpc18yX3Nob3J0KTogTGlrZXdpc2UuCisJKiBkMzB2LWRpcy5jIChwcmludF9pbnNuX2QzMHYsIGxvb2t1cF9vcGNvZGUpOiBMaWtld2lzZS4KKwkqIG5zMzJrLWRpcy5jIChiaXRfZXh0cmFjdCwgcHJpbnRfaW5zbl9uczMyayk6IExpa2V3aXNlLgorCSogdGljODAtZGlzLmMgKHByaW50X29uZV9pbnN0cnVjdGlvbik6IExpa2V3aXNlLgorCSogdzY1LWRpcy5jIChwcmludF9vcGVyYW5kKTogTGlrZXdpc2UuCisJKiB6OGstZGlzLmMgKGZldGNoX2RhdGEpOiBMaWtld2lzZS4KKwkqIGEyOWstZGlzLmM6IEFkZCByZXR1cm4gdHlwZSBmb3IgZmluZF9ieXRlX2Z1bmNfdHlwZS4KKwkqIGFyYy1vcGMuYzogSW5jbHVkZSA8c3RkaW8uaD4uICBSZW1vdmUgZGVjbGFyYXRpb25zIG9mCisJaW5zZXJ0X211bHRzaGlmdCBhbmQgZXh0cmFjdF9tdWx0c2hpZnQuCisJKiBkMzB2LWRpcy5jIChsb29rdXBfb3Bjb2RlKTogUGFyZW50aGVzaXplIGFzc2lnbm1lbnRzIGluCisJY29uZGl0aW9uYWxzLgorCShleHRyYWN0X3ZhbHVlKTogRnVsbHkgcGFyZW50aGVzaXplIGV4cHJlc3Npb24uCisJKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorCSogaDg1MDAtb3BjLmggKGg4NTAwX3RhYmxlKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXplci4KKwkqIHc2NS1vcGMuaCAob3B0YWJsZSk6IExpa2V3aXNlLgorCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBEZWNsYXJlIGFmbGFnIGFuZCBmbGFnIHBhcmFtZXRlcnMuCisJKiBpMzg2LWRpcy5jIChPUF9FKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCisJKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IExpa2V3aXNlLgorCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBMaWtld2lzZS4KKwkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IExpa2V3aXNlLgorCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogTGlrZXdpc2UuCisJKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEZWNsYXJlLgorCShnZXRfZGlzcGxhY2VtZW50LCBpbnZhbGlkX2Zsb2F0KTogRGVjbGFyZS4KKwkobGlzdF9zZWFyY2gsIHNpZ25fZXh0ZW5kLCBmbGlwX2J5dGVzKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KKwkoZ2V0X2Rpc3BsYWNlbWVudCk6IExpa2V3aXNlLgorCShwcmludF9pbnNuX2FyZyk6IExpa2V3aXNlLiAgTWFrZSBkIGludC4gIEZpeCBzcHJpbnRmIGZvcm1hdAorCXN0cmluZy4KKwkocHJpbnRfaW5zbl9uczMyayk6IE1ha2UgaSB1bnNpZ25lZC4KKwkoaW52YWxpZF9mbG9hdCk6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZSB0eXBlIG9mIHZhbC4KKwkqIHRpYzMwLWRpcy5jIChwcmludF9wYXJfaW5zbik6IE1ha2UgaSBzaXplX3QuICBEb24ndCBjaGVjayBzdHJsZW4KKwlvbiBlYWNoIGZvciBpdGVyYXRpb24uCisJKiB0aWMzMC1kaXMuYyAoZ2V0X2luZGlyZWN0X29wZXJhbmQpOiBMaWtld2lzZS4KKwkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96ODAwMSk6IERlY2xhcmUgcmV0dXJuIHR5cGUuCisJKHByaW50X2luc25fejgwMDIpOiBMaWtld2lzZS4KKwkodW5wYXJzZV9pbnN0cik6IEZpeCBzcHJpbnRmIGZvcm1hdCBzdHJpbmdzLgorCitGcmkgTWFyIDI3IDAwOjA1OjIzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYzogQWRkICJzeW5jLmwiIGFuZCAic3luYy5wIi4KKworV2VkIE1hciAyNSAxNDozMjo0OCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KKworCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogVXNlIGluZm8tPm1hY2ggdG8gc2VsZWN0IHRoZQorCWRlZmF1bHQgbTY4ayB2YXJpYW50IHRvIHJlY29nbml6ZS4KKworCSogaTk2MC1kaXMuYyAocGluc24pOiBDaGFuZ2UgdHlwZSBvZiBmaXJzdCBhcmd1bWVudCB0byBiZmRfdm1hLgorCShjdHJsLCBjb2JyLCBtZW0sIGVhKTogTGlrZXdpc2UuCisJKHByaW50X2FkZHIpOiBMaWtld2lzZS4gIFJlbW92ZSBjYXN0LgorCShlYSk6IENhc3QgYXJndW1lbnQgb2YgcHJpbnRfYWRkciB0byBiZmRfdm1hLgorCisJKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyKTogRml4IHR5cGUgb2YgbG9jYWwKKwl2YXJpYWJsZSB2YWx1ZS4KKwkoY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyKTogTGlrZXdpc2UuCisJKGNnZW5fcGFyc2VfYWRkcmVzcyk6IExpa2V3aXNlLgorCitXZWQgTWFyIDI1IDE0OjMxOjMxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaTk2MC1kaXMuYyAoY3RybCk6IEFkZCBmdWxsIGJyYWNlcyB0byBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCisJKGNvYnIsIG1lbSwgcmVnKTogTGlrZXdpc2UuCisJKGVhKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIGluIGV4cHJlc3Npb24uCisKKwkqIGNnZW4tYXNtLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgorCShidWlsZF9hc21faGFzaF90YWJsZSk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KKwkoY2dlbl9wYXJzZV9rZXl3b3JkKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCisJKiBhcm0tZGlzLmMgKHByaW50X2luc25fYmlnX2FybSk6IE9ubHkgY2FsbCBjb2Zmc3ltYm9sIGZvciBhIENPRkYKKwlzeW1ib2wuICBGaXggaW5kZW50YXRpb24uCisJKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgorCitGcmkgTWFyIDIwIDE4OjU1OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBVc2UgQU1fRElTQUJMRV9TSEFSRUQuCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KKworVGh1IE1hciAxOSAxNTo0Njo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJVGhlc2UgcGF0Y2hlcyBhcmUgY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255IFRob21wc29uCisJKGF0aG9tcHNvQGNhbWJyaWRnZS5hcm0uY29tKS4KKworCSogYXJtLWRpcy5jIChwcmludF9pbnNuX3RodW1iKTogSWdub3JlIGJvdHRvbSB0d28gYml0cyBvZiBQQworCXJlbGF0aXZlIGFkZHJlc3Nlcy4KKworCSogYXJtLW9wYy5oICh0aHVtYl9vcGNvZGVzKTogQW5ub3RhdGUgUEMgcmVsYXRpdmUgYWRkcmVzc2VzIHdpdGgKKwlib3RoIHRoZSBvZmZzZXQgYW5kIHRoZSBsYWJlbCBjbG9zZXN0IHRvIHRoZSBkZXN0aW5hdGlvbi4KKworU2F0IE1hciAxNCAyMzo0NzoxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KKworV2VkIE1hciAgNCAxMjowODoxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgorCitTYXQgRmViIDI4IDE2OjAyOjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtLCBwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBEbyBub3QKKwlhc3N1bWUgdGhhdCBpbmZvLT5zeW1ib2xzIGlzIG5vbi1lbXB0eS4KKworU2F0IEZlYiAyOCAxMjoxOTowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBhbHBoYS1vcGMuYyAoY3Z0cXMpIFRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcuCisJKGN2dHRxKTogTWlzc2luZyBtb3N0IG9mIHRoZSAvKmQgdmFyaWFudHMuCisKK1RodSBGZWIgMjYgMTU6NTM6MDkgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogSW5kaWNhdGUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQorCWRlbGF5ZWQgYnJhbmNoZXMgb3IganVtcHMuCisKK1R1ZSBGZWIgMjQgMTA6NDY6NDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYXJtLWRpcy5jIChwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9hcm0pOiBpbmZvLT5zeW1ib2wgY2hhbmdlZAorCXRvICppbmZvLT5zeW1ib2xzLgorCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fbWlwcyk6IExpa2V3aXNlLgorCSogdGljMzAtZGlzLmMgKHByaW50X2JyYW5jaCk6IExpa2V3aXNlLgorCitUdWUgRmViIDI0IDExOjA2OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtLCBwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBSZW1vdmUKKwlzYXZlZF9zeW1ib2wgY29kZSBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCitNb24gRmViIDIzIDEzOjE2OjE3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLWFzbS5jOiBJbmNsdWRlIHN5bWNhdC5oLgorCSogY2dlbi1kaXMuYyxjZ2VuLW9wYy5jOiBEaXR0by4KKwkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCisKK01vbiBGZWIgMjMgMTA6MzQ6NTggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERvIG5vdCBwcmVmaXggJ1AnIGFyZ3VtZW50cyB3aXRoICckJy4KKworVGh1IEZlYiAxOSAxNjo1MToxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLW9wYy5bY2hdOiBSZWdlbmVyYXRlLgorCitUdWUgRmViIDE3IDE3OjE0OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX3tzaWduZWQsdW5zaWduZWR9X2ludGVnZXIpOiBEZWxldGUgbWluLG1heAorCWFyZ3VtZW50cy4gIERvbid0IHBlcmZvcm0gdmFsaWRhdGlvbiBoZXJlLgorCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCisKK0ZyaSBGZWIgMTMgMTQ6MjY6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KKworRnJpIEZlYiAxMyAxNDo1MzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCisKK0ZyaSBGZWIgMTMgMTA6MjE6MDkgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtMTAzMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDMwMCk6IFJlY29nbml6ZSBicmVhayBpbnN0cnVjdGlvbi4KKworRnJpIEZlYiAxMyAxMzoxMjoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogR2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIEJGRC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgorCSogTWFrZWZpbGUuYW0gKGxpYm9wY29kZXNfbGFfTERGTEFHUyk6IERlZmluZS4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCitGcmkgRmViIDEzIDA5OjUwOjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCisJKiBtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgorCitUaHUgRmViIDEyIDExOjAxOjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCisKK1RodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6CisJKiBkMTB2LW9wYy5jIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzLCBkMTB2X29wZXJhbmRzLCBkMTB2X29wY29kZXMpOgorCVNwbGl0IE9QRVJBTkRfQUNDIGludG8gT1BFUkFORF9BQ0MwIGFuZCBPUEVSQU5EX0FDQzEuCisJSW50cm9kdWNlIE9QRVJBTkRfR1BSLgorCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IExpa2V3aXNlLgorCitXZWQgRmViIDExIDE4OjU4OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBEZWxldGUgaW5pdCBvZiBodyBsaXN0IGBuZXh0JyBjaGFpbi4KKwkoY2dlbl9od19sb29rdXApOiBNYWtlIHJlc3VsdCBjb25zdC4KKwkqIG0zMnItb3BjLmgsIG0zMnItb3BjLmMsIG0zMnItYXNtLmMsIG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCisKK1NhdCBGZWIgIDcgMTU6MzA6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KKworVGh1IEZlYiAgNSAxNzo1NjoxMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZDMwdi1vcGMuYyAocmVwZWF0eyxpfSBpbnN0cnVjdGlvbnMpOiBSZXBlYXQvcmVwZWF0aQorCWluc3RydWN0aW9ucyB1c2UgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG5vdCBhYnNvbHV0ZS4KKworV2VkIEZlYiAgNCAxOToxNzozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYnRvb2xfZW5hYmxlX3NoYXJlZCByYXRoZXIgdGhhbgorCWxpYnRvb2xfc2hhcmVkLiAgUmVtb3ZlIGRpdmVyc2lvbiBoYWNrLgorCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgorCitUdWUgRmViICAzIDE3OjE5OjQwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLW9wYy5jIChjZ2VuX3NldF9jcHUpOiBJbml0aWFsaXplIGhhcmR3YXJlIHRhYmxlLgorCSogbTMyci1vcGMuaCwgbTMyci1vcGMuYywgbTMyci1hc20uYywgbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KKworTW9uIEZlYiAgMiAxOToyMjoxNSAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgorCisJKiB0aWMzMC1kaXMuYzogTmV3IGZpbGUuCisJKiBkaXNhc3NlbWJsZS5jCShkaXNhc3NlbWJsZXIpOiBBZGQgYmZkX2FyY2hfdGljMzAgY2FzZS4KKwkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGJmZF90aWMzMF9hcmNoLgorCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgorCShDRklMRVMpOiBBZGQgdGljMzAtZGlzLmMKKwkoQUxMX01BQ0hJTkVTKTogQWRkIHRpYzMwLWRpcy5sby4KKwkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCisKK1RodSBKYW4gMjkgMTM6MDI6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuaCAoSEFWRV9DUFVfTTMyUik6IERlZmluZS4KKworV2VkIEphbiAyOCAwOTo1NTowMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB2ODUwLW9wYy5jIChpbnNlcnRpb24gcm91dGluZXMpOiBJZiBib3RoIGFsaWdubWVudCBhbmQgc2l6ZSBpcworCXdyb25nIHRoZW4gcmVwb3J0IHRoaXMuCisKK1R1ZSBKYW4gMjcgMjE6NTI6NTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogU2V0IHRhcmdldF9wcm9jZXNzb3IgYXMgYXBwcm9wcmlhdGUuCisJT25seSByZWNvZ25pemUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY3VycmVudCB0YXJnZXRfcHJvY2Vzc29yLgorCitUaHUgSmFuIDIyIDE2OjIwOjE3IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkMTB2LWRpcy5jIChQQ19NQVNLKTogQ29ycmVjdCB2YWx1ZS4KKwkocHJpbnRfb3BlcmFuZCk6IElmIHRoZXJlJ3MgYSByZWxvYywgZG9uJ3QgY2FsY3VsYXRlIHRoZQorIAlhZGRyZXNzIGJlY2F1c2UgdGhleSBjb3VsZCBiZSBpbiBkaWZmZXJlbnQgc2VjdGlvbnMuCisKK0ZyaSBKYW4gMTYgMTU6Mjk6MTEgMTk5OCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IE1vdmUgNDAxMCdzICJhZGRjaXUiCisgCWluc3RydWN0aW9uIGFmdGVyIHRoZSA0NjUwJ3MgIm11bCIgaW5zdHJ1Y3Rpb247IG5vYm9keSdzIHVzaW5nIHRoZQorIAk0MDEwIHRoZXNlIGRheXMuICBJZiBvYmplY3QgZmlsZXMgc29tZWRheSBpbmRpY2F0ZSB3aGljaCBwcm9jZXNzb3IKKwl2YXJpYW50IHRoZXkncmUgaW50ZW5kZWQgZm9yLCB3ZSBjYW4gZG8gYSBiZXR0ZXIgam9iIGF0IHRoaXMuCisKK01vbiBKYW4gMTIgMTQ6NDM6NTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tYXNtLmMgKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogVHJhdmVyc2UgY29tcGlsZWQgaW4gdGFibGUgdXNpbmcKKwl0YWJsZSBwcm92aWRlZCBlbnRyeSBzaXplLiAgVXNlIENHRU5fSU5TTl9NTkVNT05JQy4KKwkoY2dlbl9wYXJzZV9rZXl3b3JkKTogUmV3cml0ZS4KKwkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogVHJhdmVyc2UgY29tcGlsZWQgaW4gdGFibGUgdXNpbmcKKwl0YWJsZSBwcm92aWRlZCBlbnRyeSBzaXplLiAgVXNlIENHRU5fSU5TTl9NQVNLX0JJVFNJWkUuCisJKiBjZ2VuLW9wYy5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgorCShjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlKTogSGFuZGxlICIiIGVudHJ5LgorCShjZ2VuX2tleXdvcmRfYWRkKTogTGlrZXdpc2UuCisKK01vbiBEZWMgMjIgMTI6Mzc6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBBZGQgRlBfRCB0byBzLmQgaW5zdHJ1Y3Rpb24gZmxhZ3MuCisKK1dlZCBEZWMgMTcgMTE6Mzg6MjkgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGstb3BjLmMgKGhhbHQsIHB1bHNlKTogRW5hYmxlIHRoZW0gb24gdGhlIDY4MDYwLgorCitUdWUgRGVjIDE2IDE1OjIyOjUzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IFJldmVydCBjaGFuZ2UgdGhhdCBwdXQgdGhlIDMyIGJpdAorCVBDIHJlbGF0aXZlIG9mZnNldCBmb3JtcyBiZWZvcmUgdGhlIDE1IGJpdCBmb3Jtcy4gIEFuIGFzc2VtYmxlciBjb21tYW5kCisJbGluZSBvcHRpb24gbm93IGNob29zZXMgdGhlIGRlZmF1bHQuCisKK1R1ZSBEZWMgMTYgMTU6MjI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogU2V0IG5ldyBmbGFncyBiaXRzCisJRkxBR197MldPUkQsTVVMezE2LDMyfSxBRERTVUJwcHB9LCBpbiBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbnMuCisKKzE5OTctMTItMTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBPbmx5IGJ1aWxkIGxpYm9wY29kZXMgc2hhcmVkIGlmIC0tZW5hYmxlLXNoYXJlZCdzIHZhbHVlCisJd2FzIGB5ZXMnLCBvciB3YXMgc2V0IHRvIGAqb3Bjb2RlcyonLgorCSogYWNsb2NhbC5tNDogTGlrZXdpc2UuCisJKiBOT1RFOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBmaXhlZCBpbiBsaWJ0b29sL2xpYnRvb2wubTQsIHRoZQorCW9yaWdpbmFsIHNvdXJjZSBvZiB0aGlzIGJpdCBvZiBjb2RlLiAgSXQncyBub3QgY2xlYXIgd2hhdCB0aGUgYmVzdCBmaXgKKwl3b3VsZCBiZSwgdGhvdWdoLgorCitGcmkgRGVjIDEyIDExOjU3OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAoT0ZGX1NMX1BDLCBPRkZfU0xfQlIpOiBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZS4KKwkodGljODBfb3Bjb2Rlcyk6IFJlb3JkZXIgdGFibGUgZW50cmllcyB0byBwdXQgdGhlIDMyIGJpdCBQQyByZWxhdGl2ZQorIAlvZmZzZXQgZm9ybXMgYmVmb3JlIHRoZSAxNSBiaXQgZm9ybXMsIHRvIGRlZmF1bHQgdG8gdGhlIGxvbmcgZm9ybXMuCisKK0ZyaSBEZWMgMTIgMDE6MzI6MzAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogYWxwaGEtb3BjLmMgKGN2dHRxLyp1Kik6IFJlbW92ZSwgYXMgdGhhdCBzdWZmaXggaXMgaW52YWxpZC4KKworV2VkIERlYyAxMCAxNzo0MjozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm0tZGlzLmMgKHByaW50X2luc25fbGl0dGxlX2FybSk6IFByZXZlbnQgZXhhbWluYXRpb24gb2Ygc3RvcmVkCisJc3ltYm9sIGlmIG5vbmUgaXMgcHJlc2VudC4KKwkocHJpbnRfaW5zbl9iaWdfYXJtKTogIFByZXZlbnQgZXhhbWluYXRpb24gb2Ygc3RvcmVkIHN5bWJvbCBpZgorCW5vbmUgaXMgcHJlc2VudC4KKworVGh1IE9jdCAyMyAyMToxMzozNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQ29ycmVjdCBlbnRyeSBmb3IgUlRFLgorCitNb24gRGVjICA4IDExOjIxOjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGRpc2Fzc2VtYmxlLmM6IFJlbW92ZSBkaXNhc21fc3ltYWRkcigpIGZ1bmN0aW9uLgorCisJKiBhcm0tZGlzLmM6IFVzZSBpbmZvLT5zeW1ib2wgaW5zdGVhZCBvZiBpbmZvLT5mbGFncyB0byBkZXRlcm1pbmUKKwlpZiBkaXNhc3NtYmx5IHNob3VsZCBiZSBpbiBUaHVtYiBvciBBcm0gbW9kZS4KKworVHVlIERlYyAgMiAwOTo1NDoyNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm0tZGlzLmM6IEFkZCBzdXBwb3J0IGZvciBkaXNhc3NlbWJsaW5nIFRodW1iIG9wY29kZXMuCisJKHByaW50X2luc25fdGh1bWIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGRpc2Fzc2VtYmxlLmMgKGRpc2FzbV9zeW1hZGRyKTogTmV3IGZ1bmN0aW9uLgorCisJKiBhcm0tb3BjLmg6IERpc3BsYXkgbm9wIHBzZXVkbyBvcHMgYWxvbmdzaWRlIGVxdWl2YWxlbnQgZGlzYXNzZW1ibHkuCisJKHRodW1iX29wY29kZXMpOiBUYWJsZSBvZiBUaHVtYiBvcGNvZGVzLgorCitNb24gRGVjICAxIDEyOjI1OjU3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrLW9wYy5jIChidHN0KTogQ2hhbmdlIERkQHMgdG8gRGQ7Yi4KKworCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZWNvZ25pemUgJ20nLCAnbicsICdvJywgJ3AnLCAncScsCisJYW5kICd2JyBhcyBvcGVyYW5kIHR5cGVzLgorCitNb24gRGVjICAxIDExOjU2OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYzogQWRkIGFyZ3VtZW50IGZvciBscHN0b3AuICBGcm9tIE9saXZpZXIgQ2FybW9uYQorCTxvbGl2aWVyLmNhcm1vbmFAZGkuZXBmbC5jaD4uCisJKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGxwc3RvcCwKKwl3aGljaCBoYXMgYSB0d28gd29yZCBvcGNvZGUgd2l0aCBhIG9uZSB3b3JkIGFyZ3VtZW50LgorCitTdW4gTm92IDIzIDIyOjI1OjIxIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSwgY2FzZSBjbXB1KTogSW1tZWRpYXRlIGZpZWxkIGlzCisJdW5zaWduZWQsIG5vdCBzaWduZWQuCisJKGQzMHZfZm9ybWF0X3RhYmxlKTogQWRkIFNIT1JUX0NNUFUgY2FzZXMgZm9yIGNtcHUuCisKK1R1ZSBOb3YgMTggMjM6MTA6MDMgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6CisJU3BsaXQgT1BFUkFORF9GTEFHIGludG8gT1BFUkFORF9GRkxBRyBhbmQgT1BFUkFORF9DRkxBRy4KKworVHVlIE5vdiAxOCAxODo0NToxNCAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBkMTB2LW9wYy5jIChPUEVSQU5EX0ZMQUcpOiBTcGxpdCBpbnRvOgorCShPUEVSQU5EX0ZGTEFHLCBPUEVSQU5EX0NGTEFHKSAuCisJKEZTUkMpOiBTcGxpdCBpbnRvOgorCShGRlNSQywgQ0ZTUkMpLgorCitUaHUgTm92IDEzIDExOjA1OjMzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBNb3ZlIHRoZSBJTlNOX01BQ1JPIElTQSB2YWx1ZSB0byB0aGUgbWVtYmVyc2hpcAorCWZpZWxkIGZvciBhbGwgSU5TTl9NQUNSTydzLgorCSogbWlwczE2LW9wYy5jOiBzYW1lCisKK1dlZCBOb3YgMTIgMTA6MTY6NTcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmMgKHN5bmMsY2FjaGUpOiBUaGVzZSBhcmUgMzkwMCBpbnNucy4KKworVHVlIE5vdiAxMSAyMzo1Mzo0MSAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwlzaC1vcGMuaCAoc2hfdGFibGUpOiBSZW1vdmUgZnRzdC9uYW4uCisKK1R1ZSBPY3QgMjggMTc6NTk6MzIgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmMgKGZmYywgZmZzKTogRml4IG1hc2suCisKK1R1ZSBPY3QgMjggMTY6MzQ6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCBlaXRfdmIsIGludF9zLCBhbmQgaW50X20KKwljb250cm9sIHJlZ2lzdGVycy4KKworTW9uIE9jdCAyNyAyMjozNDowMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYzogRml4IGJ1ZyBpbiBtYXNrIGZvciAibm90IiBwc2V1ZG8taW5zdHJ1Y3Rpb24uCisJKFdSX0hJTE8sIFJEX0hJTE8sIE1PRF9ISUxPKTogTmV3IG1hY3Jvcy4KKworTW9uIE9jdCAyNyAyMjozNDowMyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYzogRml4IGJ1ZyBpbiBtYXNrIGZvciAibm90IiBwc2V1ZG8taW5zdHJ1Y3Rpb24uCisJKFdSX0hJTE8sIFJEX0hJTE8sIE1PRF9ISUxPKTogTmV3IG1hY3Jvcy4KKworVGh1IE9jdCAyMyAxNDo1Nzo1OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFJlcGxhY2UgLy8gd2l0aCAvKiAuLi4gKi8KKworV2VkIE9jdCAyMiAxNzozMzoyMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBzcGFyYy1vcGMuYzogQWRkIHdyICYgcmQgZm9yIHY5YSBhc3Incy4KKwkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVjb2duaXplICdfJyBhbmQgJy8nIGZvciB2OWEgYXNyJ3MuCisJKHY5YV9hc3JfcmVnX25hbWVzKTogTmV3IHZhcmlhYmxlLgorCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KKworV2VkIE9jdCAyMiAxNzoxODowMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisJKiBzcGFyYy1vcGMuYyAodjlub3R2OWEpOiBOZXcgaW5zbiB0eXBlLgorCShJTVBERVApOiBNb3ZlIHRvIHRoZSBlbmQgdG8gbm90IGNvbmZsaWN0IHdpdGggZWRnZTggZXQgYWwuCisJUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgorCitGcmkgT2N0IDE3IDEzOjE4OjUzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jIChibmV6bCxiZXF6bCk6IE1hcmsgdGhlc2UgYXMgYWxzbyB0eDM5LgorCitUaHUgT2N0IDE2IDExOjU1OjIwIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBOb3RlIHRoYXQgJ2phbHgnIGlzIChwcm9iYWJseSBpbmNvcnJlY3RseSkgbWFya2VkIEkxLgorCitUdWUgT2N0IDE0IDE2OjEwOjMxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlIG5ldyBzeW1ib2xfYXRfYWRkcmVzc19mdW5jKCkgZmllbGQKKwlvZiBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdHVyZSB0byBkZXRlcm1pbmUgaWYgYW4gb3ZlcmxheSBhZGRyZXNzCisJaGFzIGEgbWF0Y2hpbmcgc3ltYm9sIGluIGxvdyBtZW1vcnkuCisKKwkqIGRpcy1idWYuYyAoZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcyk6IE5ldyAoZHVtbXkpIGZ1bmN0aW9uIGZvcgorCW5ldyBzeW1ib2xfYXRfYWRkcmVzc19mdW5jIGZpZWxkIGluIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0dXJlLgorCitGcmkgT2N0IDEwIDE2OjQ0OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKGV4dHJhY3RfZDIyKTogVXNlIHNpZ25lZCBhcml0aG1hdGljLgorCitUdWUgT2N0ICA3IDIzOjQwOjQzIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBUaHJlZSBvcCBtdWx0IGlzIG5vdCBhbiBJU0EgaW5zbi4KKworVHVlIE9jdCAgNyAyMzozNzoyMSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYzogRml4IGZvcm1hdHRpbmcuCisKK0ZyaSBPY3QgIDMgMTc6MjY6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jIChPUF9FKTogRXhwbGljaXRseSBzaWduIGV4dGVuZCA4IGJpdCB2YWx1ZXMsIHJhdGhlcgorIAl0aGFuIGFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQuICBFeHBsaWNpdGx5IHNpZ24gZXh0ZW5kIDE2IGJpdAorCXZhbHVlcywgcmF0aGVyIHRoYW4gYXNzdW1pbmcgdGhhdCBzaG9ydCBpcyAxNiBiaXRzLgorCShPUF9zSSwgT1BfSiwgT1BfRElSKTogTGlrZXdpc2UuCisKK1RodSBPY3QgIDIgMTM6MzY6NDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC1kaXMuYyAodjg1MF9zcmVnX25hbWVzKTogVXNlIHN5bWJvbGljIG5hbWVzIGZvciBoaWdoZXIKKwlzeXN0ZW0gcmVnaXN0ZXJzLgorCitXZWQgT2N0ICAxIDE2OjU4OjU0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQuCisKKwkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHRlc3Qgb2YgcHJvY2Vzc29yIHR5cGUgd2hlbgorCWRldGVybWluaW5nIG9wY29kZXMuCisKK1dlZCBPY3QgIDEgMTQ6MTA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBhIGRpdmVyc2lvbiB0byBzZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgdGhlCisJYXJndW1lbnRzIGFyZSBwYXJzZWQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1RodSBTZXAgMjUgMTM6MDQ6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jIChUQkwxKTogVXNlICEgcmF0aGVyIHRoYW4gYC4KKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVtb3ZlIGAgb3BlcmFuZCBzcGVjaWZpZXIuCisKK1dlZCBTZXAgMjQgMTE6Mjk6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jOiBDb3JyZWN0IGJjaGcsIGJjbHIsIGJzZXQsIGFuZCBidHN0IG9uIENvbGRGaXJlLgorCisJKiBtNjhrLW9wYy5jOiBBY2NlcHQgdHN0e2IsdyxsfSB3aXRoIGltbWVkaWF0ZSBvcGVyYW5kcyBvbiBjcHUzMi4KKworCSogbTY4ay1vcGMuYzogQ29ycmVjdCBtb3ZldyBvZiBhbiBpbW1lZGlhdGUgb3BlcmFuZCB0byAlc3Igb3IgJWNjcgorCWZvciBtY2Y1MjAwLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfVE9PTCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgorCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgU2VwIDE5IDExOjQ1OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdjg1MC1vcGMuYyAoImNtb3YiKTogT3JkZXIgcmVnIHBhcmFtIHIxLCByMiBub3QgcjIsIHIyLgorCitUaHUgU2VwIDE4IDExOjIxOjQzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLW9wYy5jIChzcGFyY2xldF9jcHJlZ190YWJsZSk6IEFkZCAlY2NzcjIsICVjY2NyciwgJWNjcnN0ci4KKworVHVlIFNlcCAxNiAxNToxODoyMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGdXJ0aGVyIHJlYXJyYW5nZW1lbnRzLgorCitUdWUgU2VwIDE2IDE2OjEyOjExIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBkMzB2LW9wYy5jIChyb3QyaCwgc3JhMmgsIHNybDJoIGluc25zKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgorCitUdWUgU2VwIDE2IDA5OjQ4OjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpZWxkcyByZW9yZGVyZWQgdG8gYWxsb3cgYXNzZW1ibGVyCisJcGFyc2VyIHRvIHdvcmsuCisKK1R1ZSBTZXAgMTYgMTA6MDE6MDAgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmM6IEFkZGVkIHR4MzkgaW5zbnMgc2RiYnAsIHJmZSwgYW5kIGRlcmV0LgorCitNb24gU2VwIDE1IDE4OjMxOjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmM6IEluaXRpYWxpc2UgcHJvY2Vzc29ycyBmaWVsZCBvZiB2ODUwX29wY29kZSBzdHJ1Y3R1cmUuCisKK1dlZCBBdWcgMjcgMjE6NDI6MzkgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlNZXJnZSBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6CisKKwkqIGQzMHYtb3BjLmM6IENoYW5nZSBtdmZhY2MgdG8gYWNjZXB0IDYtYml0IHVuc2lnbmVkIHZhbHVlcy4KKworCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGNvbnRyb2wgcmVnaXN0ZXJzIGZyb20gMC02My4KKwkoZDMwdl9vcGNvZGVfdGFiZWwpOiBBZGQgZGJ0LCBydGQsIHNyYWgsIGFuZCBzcmxoIGluc3RydWN0aW9ucy4gRml4CisJcm90MmgsIHNyYTJoLCBhbmQgc3JsMmggdG8gdXNlIG5ldyBTSE9SVF9BNVMgZm9ybWF0LgorCisJKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogRml4IGRpc2Fzc2VtYmx5IG9mIFNIT1JUX0QyIG9wY29kZXMuCisKKwkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBGaXJzdCBvcGVyYW5kIG9mIGQqaSAoZGVsYXllZAorCWJyYW5jaCkgaW5zdHJ1Y3Rpb25zIGlzIHJlbGF0aXZlLgorCisJKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IENoYW5nZSBmb3JtIGZvciByZXBlYXRpLgorCShkMzB2X29wZXJhbmRfdGFibGUpOiBBZGQgSU1NNlMzIHR5cGUuCisJKGQzMHZfZm9ybWF0X3RhYmxlKTogQ2hhbmdlIFNIT1JUX0QyLiBBZGQgTE9OR19EYi4KKworCSogZDMwdi1kaXMuYzogRml4IGJ1ZyB3aXRoICIucyIgYW5kICIubCIgZXh0ZW5zaW9ucworCWFuZCBjbXAgaW5zdHJ1Y3Rpb25zLgorCisJKiBkMzB2LW9wYy5jOiBDb3JyZWN0IGVudHJpZXMgZm9yIHJlcGVhdCosIGFuZCBzYXQqLgorCU1ha2UgSU1NNSB1bnNpZ25lZC4gQ3JlYXRlIElNTTZVIGFuZCBJTU0xMlMzVSBvcGVyYW5kCisJdHlwZXMuIENvcnJlY3Qgc2V2ZXJhbCBmb3JtYXRzLgorCisJKiBkMzB2LW9wYy5jOiAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGRwc3cgYW5kIGRwYy4KKworCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQ2hhbmdlIGNvbnRyb2wgcmVnaXN0ZXJzLgorCisJKiBkMzB2LW9wYy5jIChkMzB2X2Zvcm1hdF90YWJsZSk6IENvcnJlY3QgU0hPUlRfQzEgYW5kCisJU0hPUlRfQzIuICBNYW51YWwgd2FzIGluY29ycmVjdC4KKworCSogZDMwdi1kaXMuYyAobG9va3VwX29wY29kZSk6ICBSZXR1cm4gdmFsdWUgbm93IGluZGljYXRlcworCWlmIGFuIG9wY29kZSBoYXMgYSBzaG9ydCBhbmQgYSBsb25nIGZvcm0uICBVc2VkIGZvciBkZWNpZGluZworCXRvIGFwcGVuZCBhICIucyIgb3IgIi5sIi4KKwkocHJpbnRfaW5zbik6IEFwcGVuZCBhICIucyIgdG8gYW4gaW5zdHJ1Y3Rpb24gaWYgaXQgaXMKKyAJdGhlIHNob3J0IGZvcm0gYW5kICIubCIgaWYgaXQgaXMgYSBsb25nIGZvcm0uIERvIG5vdCBhcHBlbmQKKwlhbnl0aGluZyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG9ubHkgb25lIHBvc3NpYmxlIHNpemUuCisKKwkqIGQzMHYtb3BjLmM6IENoYW5nZSBtdWx4MmggdG8gcmVxdWlyZSBhbiBldmVuIHJlZ2lzdGVyLgorCU5ldyBmb3JtOiBTSE9SVF9BMjsgYSBTSE9SVF9BIGZvcm0gdGhhdCBuZWVkcyBhbiBldmVuCisJcmVnaXN0ZXIgYXMgdGhlIGZpcnN0IG9wZXJhbmQuCisKKwkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdik6IEZpeCBwcm9ibGVtIHdoZXJlIHRoZSBsYXN0CisJaW5zdHJ1Y3Rpb24gd2FzIG5vdCBiZWluZyBkaXNhc3NlbWJsZWQgaWYgdGhlcmUgd2VyZSBhbiBvZGQKKwludW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorCisJKiBkMzB2LW9wYy5jIChTSE9SVF9NMiwgTE9OR19NMik6ICBUd28gbmV3IGZvcm1zLgorCitGcmkgU2VwIDEyIDExOjQzOjU0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSW1wcm92ZWQgZGlzcGxheSBvZiByZWdpc3RlciBsaXN0cy4KKworVGh1IFNlcCAxMSAxNzozNToxMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBhc3NlbWJsZXIgYXJncyB0bworCWZ6ZXJvcywgZm9uZXMsIGZzcmMxLCBmc3JjMXMsIGZzcmMycywgZm5vdDEsIGZub3QxcywgZm5vdDJzLAorCWZvcnMsIGZub3JzLCBmYW5kcywgZm5hbmRzLCBmeG9ycywgZnhub3JzLCBmb3Jub3QxcywgZm9ybm90MnMsCisJZmFuZG5vdDFzLCBmYW5kbm90MnMuCisKK1R1ZSBTZXAgIDkgMTA6MDM6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggb3AzIGZpZWxkIGZvciBmY21wcS9mY21wZXEuCisKK01vbiBTZXAgIDggMTQ6MDY6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2dlbi1hc20uYyAoY2dlbl9wYXJzZV9hZGRyZXNzKTogTmV3IGFyZ3VtZW50IHJlc3VsdHAuCisJQWxsIGNhbGxlcnMgdXBkYXRlZC4KKwkqIG0zMnItYXNtLmMgKHBhcnNlX2hfaGkxNik6IFJpZ2h0IHNoaWZ0IG51bWJlcnMgYnkgMTYuCisKK1R1ZSBTZXAgIDIgMTg6Mzk6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogbW4xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJlCisgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCisKK1R1ZSBTZXAgIDIgMTU6NDE6NTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBPbmx5IHNpZ25lZCBleHRlbmQgdmFsdWVzIHRoYXQgYXJlIG5vdAorCXJldHVybmVkIGJ5IGV4dHJhY3QgZnVuY3Rpb25zLgorCVJlbW92ZSB1c2Ugb2YgVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkgZmxhZy4KKworVHVlIFNlcCAgMiAxNTozOTo0MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB2ODUwLW9wYy5jOiBVcGRhdGUgY29tbWVudHMuICBSZW1vdmUgdXNlIG9mCisJVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkuICBGaXggc2V2ZXJhbCBvcGVyYW5kIHBhdHRlcm5zLgorCitUdWUgQXVnIDI2IDA5OjQyOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKE1PVkhJKTogSW1tZWRpYXRlIHBhcmFtZXRlciBpcyB1bnNpZ25lZC4KKworTW9uIEF1ZyAyNSAxNTo1ODowNyAxOTk3ICBDaHJpc3RvcGhlciBQcm92ZW56YW5vICA8cHJvdmVuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVidWlsdCB3aXRoIGxhdGVzdCBkZXZvIGF1dG9jb25mIGZvciBOVCBzdXBwb3J0LgorCitGcmkgQXVnIDIyIDEwOjM1OjE1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlIGN1cmx5IGJyYWNlIHN5bnRheCBmb3IgcmVnaXN0ZXIKKwlsaXN0cy4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBBZGQgTk9UX1IwIGZsYWcgdG8gZGVjZWN0IGNhc2VzCisJd2hlcmUgcjAgaXMgYmVpbmcgdXNlZCBhcyBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgorCitUaHUgQXVnIDIxIDExOjA5OjA5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogTW92ZSBkaXZoIG9wY29kZXMgbmV4dCB0byBlYWNoIG90aGVyLgorCitUdWUgQXVnIDE5IDEwOjU5OjU5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGFscGhhLW9wYy5jIChhbHBoYV9vcGNvZGVzKTogRml4IGh3X3JlaV9zdGFsbCBtdW5nYWdlLgorCitNb24gQXVnIDE4IDExOjEwOjAzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlc1tdKTogUmVtb3ZlIHVzZSBvZiBmbGFnIGZpZWxkLgorCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBBZGQgc3VwcG9ydCBmb3IgcmV2ZXJzZWQgc2hvcnQgbG9hZAorCW9wY29kZXMuLgorCitNb24gQXVnIDE4IDExOjA4OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSAoY2dlbl9maWxlcyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKGNnZW5fZmlsZXMpOiAgQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KKworTW9uIEF1ZyAxOCAxMTowODoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUgKGNnZW5fZmlsZXMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6ICBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KKworRnJpIEF1ZyAxNSAwNToxNzo0OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGJmZF9hcmNfYXJjaCk6IEFkZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmFtIChBTExfTUFDSElORVMpOiBBZGQgYXJjLWRpcy5sbywgYXJjLW9wYy5sby4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgorCSogYXJjLWRpcy5jLCBhcmMtb3BjLmM6IE5ldyBmaWxlcy4KKwkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfYWxsKTogRGVmaW5lIEFSQ0hfYXJjLgorCShkaXNhc3NlbWJsZXIpOiBBZGQgQVJDIHN1cHBvcnQuCisKK1dlZCBBdWcgMTMgMTg6NTI6MTEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MEVBIGluc3RydWN0aW9ucy4KKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2KTogTmV3IEZ1bmN0aW9ucy4KKwkodjg1MF9vcGNvZGVzKTogQWRkIHY4NTBFQSBpbnN0cnVjdGlvbnMuCisKKwkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBFIGluc3RydWN0aW9ucy4KKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q1XzQsIGV4dHJhY3RfZDVfNCwgaW5zZXJ0X2QxNl8xNiwKKwlleHRyYWN0X2QxNl8xNiwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBpbnNlcnRfdTksIGV4dHJhY3RfdTksCisJaW5zZXJ0X3NwZSwgZXh0cmFjdF9zcGUpOiBOZXcgRnVuY3Rpb25zLgorCSh2ODUwX29wY29kZXMpOiBBZGQgdjg1MEUgaW5zdHJ1Y3Rpb25zLgorCisJKiB2ODUwLW9wYy5jOiBSZW9yZ2FuaXNlZCBhbmQgcmUtbGF5ZWQgb3V0IHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKKwlhbmQgcG9ydGFiaWxpdHkuCisKK1R1ZSBBdWcgIDUgMjM6MDk6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLjEuCisKK01vbiBBdWcgIDQgMTI6MDI6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UgcGF0Y2hlcy4KKworRnJpIEF1ZyAgMSAxMzowMjowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTC4KKwkqIGFjaW5jbHVkZS5tNDogSnVzdCBpbmNsdWRlIGFjaW5jbHVkZS5tNCBmcm9tIEJGRC4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IEp1bCAzMSAyMTo0NDo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgorCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLgorCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLgorCVJlbW92ZWQgc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCisJQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwKKwlBTV9DWUdXSU4zMiwgYW5kIEFNX0VYRUVYVC4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGgKKwlBTV9QUk9HX0lOU1RBTEwuICBDaGFuZ2UgYWxsIC5vIGZpbGVzIHRvIC5sby4gIFJlbW92ZSBzdGFtcC1oCisJaGFuZGxpbmcgaW4gQUNfT1VUUFVULgorCSogZGVwLWluLnNlZDogQ2hhbmdlIC5vIHRvIC5sby4KKwkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KKwkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCisJKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KKworTW9uIEp1bCAyOCAyMTo1MjoyNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1pcHMtb3BjLmM6IEZpeCB0eXBvL3RoaW5rbyBpbiAiZXJldCIgaW5zdHJ1Y3Rpb24uCisKK1RodSBKdWwgMjQgMTM6MDM6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggc3BlbGxpbmcgb24gZnBhZGRYLCBmcHN1YlggaW5zbnMuCisJTWFrZSBhcnJheSBjb25zdC4KKwkqIHNwYXJjLWRpcy5jIChzb3J0ZWRfb3Bjb2Rlcyk6IE5ldyBzdGF0aWMgbG9jYWwuCisJKHN0cnVjdCBvcGNvZGVfaGFzaCk6IGBvcGNvZGUnIGlzIHBvaW50ZXIgdG8gY29uc3QgZWxlbWVudC4KKwkoYnVpbGRfaGFzaCk6IEZpcnN0IGFyZyBpcyBub3cgdGFibGUgb2Ygc29ydGVkIHBvaW50ZXJzLgorCShwcmludF9pbnNuX3NwYXJjKTogU29ydCBvcGNvZGVzIGJ5IHNvcnRpbmcgdGFibGUgb2YgcG9pbnRlcnMuCisJKGNvbXBhcmVfb3Bjb2Rlcyk6IFVwZGF0ZS4KKworVHVlIEp1bCAxNSAxMjowNToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLW9wYy5jOiAjaW5jbHVkZSA8Y3R5cGUuaD4uCisJKGhhc2hfa2V5d29yZF9uYW1lKTogTmV3IGFyZyBgY2FzZV9zZW5zaXRpdmVfcCcuICBDYWxsZXJzIHVwZGF0ZWQuCisJSGFuZGxlIGNhc2UgaW5zZW5zaXRpdmUgaGFzaGluZy4KKwkoaGFzaF9rZXl3b3JkX3ZhbHVlKTogQ2hhbmdlIHR5cGUgb2YgYHZhbHVlJyB0byB1bnNpZ25lZCBpbnQuCisKK1RodSBKdWwgMTAgMTI6NTY6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jIChtaXBzX2J1aWx0aW5fb3Bjb2Rlcyk6IElmIGFuIGluc24gdXNlcyBzaW5nbGUKKwlwcmVjaXNpb24gRlAsIG1hcmsgaXQgYXMgc3VjaC4gIExpa2V3aXNlIGZvciBkb3VibGUgcHJlY2lzaW9uCisJRlAuICBNYXJrIElTQTEgaW5zbnMuICBDb25zb2xpZGF0ZSBkdXBsaWNhdGUgb3Bjb2RlcyB3aGVyZQorCXBvc3NpYmxlLgorCitXZWQgSnVuIDI1IDE1OjI1OjU3IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY2lyZGFuLmN5Z251cy5jb20+CisKKwkqIHBwYy1vcGMuYyAoZXh0cmFjdF9uc2kpOiBtYWtlIHVuc2lnbmVkIGV4cHJlc3Npb24gc2lnbmVkIGJlZm9yZQorIAluZWdhdGluZyBpdC4KKwkoVU5VU0VEKTogcmVtb3ZlIG9uZSBsZXZlbCBvZiBwYXJlbnMsIHNvIE1TVkMgZG9lc24ndCBjaG9rZSBvbgorIAluZXN0aW5nIGRlcHRoIHdoZW4gYWxsIHRoZSBtYWNyb3MgYXJlIGV4cGFuZGVkLgorCitUdWUgSnVuIDE3IDE3OjAyOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmM6IFRoZSBmY21wIHY5YSBpbnN0cnVjdGlvbnMgdGFrZSBhbiBpbnRlZ2VyIHJlZ2lzdGVyCisJYXMgYSBkZXN0aW5hdGlvbiwgbm90IGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBGcm9tIENocmlzdGlhbgorCUt1ZWhua2UgPENocmlzdGlhbi5LdWVobmtlQGFyYmkuSW5mb3JtYXRpay5VbmktT2xkZW5idXJnLkRFPi4KKworTW9uIEp1biAxNiAxNDoxMzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY2FzZSA3LjIgdXNpbmcgJXBjQCgpCisJc3ludGF4LiAgRnJvbSBSb21hbiBIb2RlaworCTxybmhvZGVrQGZhdWkyMmMuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+LgorCisJKiBpMzg2LWRpcy5jICh0d29ieXRlX2hhc19tb2RybSk6IEZpeCBwYW5kLgorCitNb24gSnVuIDE2IDE0OjA4OjM4IDE5OTcgIE1pY2hhZWwgVGF5bG9yICA8bWJ0QG1pdC5lZHU+CisKKwkqIGkzODYtZGlzLmMgKGRpczM4Nl90d29ieXRlKTogRml4IHBhbmQgYW5kIHBhbmRuLgorCitUdWUgSnVuIDEwIDExOjI2OjQ3IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+CisKKwkqIGFybS1kaXMuYzogQWRkIHByb3RvdHlwZXMgZm9yIGFybV9kZWNvZGVfc2hpZnQgYW5kCisJcHJpbnRfaW5zbl9hcm0uCisKK01vbiBKdW4gIDIgMTE6Mzk6MDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmM6IEFkZCByMzkwMCBpbnNucy4KKworVHVlIE1heSAyNyAxNTo1NTo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IENoYW5nZSByZWxtYXNrIHRvIGJmZF92bWEuICBEb24ndAorCXByaW50IGRlbGF5IHNsb3QgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBzYW1lIGxpbmUuICBXaGVuIHVzaW5nIGEgUEMKKwlyZWxhdGl2ZSBsb2FkLCBhZGQgYSBjb21tZW50IHdpdGggdGhlIHZhbHVlIGJlaW5nIGxvYWRlZCBpZiBpdCBjYW4KKwliZSBvYnRhaW5lZC4KKworVHVlIE1heSAyNyAxMTowMjowOCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+CisKKwkqIGkzODYtZGlzLmMgKGRpczM4NltdLCBkaXMzODZfdHdvYnl0ZVtdKTogY2hhbmdlIHB1c2hsL3BvcGwKKwl0byBwdXNoUy9wb3BTIGZvciBzZWdtZW50IHJlZ3MgYW5kIGJ5dGUgY29uc3RhbnQgc28gdGhhdAorCXB1c2h3L3BvcHcgcHJpbnRlZCB3aGVuIGluIDE2IGJpdCBkYXRhIG1vZGUuCisKKwkqIGkzODYtZGlzLmMgKGRpczM4NltdKTogY2hhbmdlIGN3dGwsIGNsdGQgdG8gY1d0UywgY1N0ZCB0bworCXByaW50IGNidHcsIGN3dGQgaW4gMTYgYml0IGRhdGEgbW9kZS4KKwkqIGkzODYtZGlzLmMgKHB1dG9wKTogZXh0cmEgY2FzZSBXIHRvIHN1cHBvcnQgYWJvdmUuCisKKwkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogcHJpbnQgYWRkcjMyIHByZWZpeCB3aGVuIGdpdmVuCisJYWRkcmVzcyBzaXplIHByZWZpeCBpbiAxNiBiaXQgYWRkcmVzcyBtb2RlLgorCitGcmkgTWF5IDIzIDE2OjQ3OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2gtZGlzLmM6IFJlaW5kZW50LiAgUmVuYW1lIGxvY2FsIHZhcmlhYmxlIGZwcmludGYgdG8KKwlmcHJpbnRmX2ZuLgorCitUaHUgTWF5IDIyIDE0OjA2OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG0zMnItb3BjLmMgKG0zMnJfY2dlbl9pbnNuX3RhYmxlLCBjbXB1aSk6IFVuZG8gcGF0Y2ggb2YgTWF5IDIuCisKK1R1ZSBNYXkgMjAgMTE6MjY6MjcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogTW92ZWQgSU5TTl9JU0EgZmllbGQgaW50byBuZXcKKwkgIGZpZWxkIG1lbWJlcnNoaXAuCisJKiBtaXBzMTYtb3BjLmMgKG1pcDE2X29wY29kZXMpOiBzYW1lLgorCitNb24gTWF5IDEyIDE1OjEwOjUzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobW92ZWIpOiBDaGFuZ2UgJGQgdG8gJWQuCisKK01vbiBNYXkgIDUgMTQ6Mjg6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jOiAoZGlzMzg2X3R3b2J5dGUpOiBBZGQgTU1YIGluc3RydWN0aW9ucy4KKwkodHdvYnl0ZV9oYXNfbW9kcm0pOiBMaWtld2lzZS4KKwkoZ3Jwcyk6IExpa2V3aXNlLgorCShPUF9NTVgsIE9QX0VNLCBPUF9NUyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgorCisJKiBpMzg2LWRpcy5jOiBSZXZlcnQgcGF0Y2ggb2YgQXByaWwgNC4gIFRoZSBvdXRwdXQgbm93IG1hdGNoZXMKKwl3aGF0IGdjYyBnZW5lcmF0ZXMuCisKK0ZyaSBNYXkgIDIgMTI6NDg6MzcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuYyAobTMycl9jZ2VuX2luc25fdGFibGUsIGNtcHVpKTogVXNlICR1aW1tMTYgaW5zdGVhZAorCW9mICRzaW1tMTYuCisKK1RodSBNYXkgIDEgMTU6MzQ6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1vcGMuaCAoQ0dFTl9BUkNIKTogUmVuYW1lZCBmcm9tIENHRU5fQ1BVLgorCitUdWUgQXByIDE1IDEyOjQwOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgdXBvbiBpbnN0YWxsZGlycy4KKwkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgorCitNb24gQXByIDE0IDEyOjEzOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKKwkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1N1biBBcHIgMTMgMTc6NTA6NDEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2dlbi0qLmMsIG0zMnItKi5jOiAjaW5jbHVkZSBzeXNkZXAuaCBpbnN0ZWFkIG9mIGNvbmZpZy5oLgorCURlbGV0ZSBzdHJpbmd7LHN9Lmggc3VwcG9ydC4KKworVGh1IEFwciAxMCAxNDo0NDo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pOiBOZXcgZ2xvYmFsLgorCShjZ2VuX3BhcnNlX3t7LHVufXNpZ25lZF9pbnRlZ2VyLGFkZHJlc3N9KTogVXBkYXRlIGNhbGwgdG8KKwljZ2VuX3BhcnNlX29wZXJhbmRfZm4uCisJKGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgorCSogbTMyci1hc20uYyAocGFyc2VfaW5zbl9ub3JtYWwpOiBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCByZW5hbWVkCisJZnJvbSBjZ2VuX2FzbV9pbml0X3BhcnNlLgorCShtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbik6IE5ldyBvcGVyYW5kIGBlcnJtc2cnLgorCURlbGV0ZSBjYWxsIHRvIGFzX2JhZCwgcmV0dXJuIGVycm9yIG1lc3NhZ2UgdG8gY2FsbGVyLgorCShtMzJyX2NnZW5fYXNtX2hhc2hfa2V5d29yZHMpOiAjaWYgMCBvdXQuCisKK1dlZCBBcHIgIDkgMTI6MDU6MjUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKSBbY2FzZSAnZCddOiBQcmludCBhcyBhZGRyZXNzIHJlZ2lzdGVyLAorCW5vdCBkYXRhIHJlZ2lzdGVyLgorCVtjYXNlICdKJ106IEZpeCB0eXBvIGluIHJlZ2lzdGVyIG5hbWUuCisKK01vbiBBcHIgIDcgMTY6NDg6MjIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgU0hMSUJfTElCUy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChTSExJQl9MSUJTKTogTmV3IHZhcmlhYmxlLgorCSgkKFNITElCKSk6IFVzZSAkKFNITElCX0xJQlMpLgorCitNb24gQXByICA3IDExOjQ1OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogRml4IHhtYWxsb2Mgc2l6ZSBjb21wdXRhdGlvbi4KKworCSogY2dlbi1vcGMuYyAoaGFzaF9rZXl3b3JkX25hbWUpOiBJbXByb3ZlIGFsZ29yaXRobS4KKworCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIG0zMnIuCisKK0ZyaSBBcHIgIDQgMTI6Mjk6MzggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1hc20uYywgbTMyci1kaXMuYywgbTMyci1vcGMuYywgbTMyci1vcGMuaDogTmV3IGZpbGVzLgorCSogY2dlbi1hc20uYywgY2dlbi1kaXMuYywgY2dlbi1vcGMuYzogTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCB0aGVtLgorCShBTExfTUFDSElORVMpOiBBZGQgdGhlbS4KKwkoZGVwZW5kZW5jaWVzKTogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6IE5ldyB2YXJpYWJsZS4KKwkoYmZkX20zMnJfYXJjaCk6IEFkZCBlbnRyeS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworRnJpIEFwciAgNCAxNDowNDoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBmaWxlIG5hbWVzIGZvciBiZmRfbW4xMFsyM10wMF9hcmNoLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCisKKwkqIGQxMHYtZGlzLmM6IEluY2x1ZGUgImFuc2lkZWNsLmgiIGJlZm9yZSAib3Bjb2RlL2QxMHYuaCIuCisKKwkqIGkzODYtZGlzLmMgKGZsb2F0X3JlZyk6IFN3YXAgZnN1YnJwIGFuZCBmc3VicC4gIFN3YXAgZmRpdnJwIGFuZAorCWZkaXZwLgorCitUaHUgQXByICAzIDEzOjIyOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgorCitXZWQgQXByICAyIDEyOjIzOjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTEwMjAwLWRpcy5jOiBSZW5hbWUgZnJvbSBtbjEwMjAwLWRpcy5jLgorCSogbTEwMjAwLW9wYy5jOiBSZW5hbWUgZnJvbSBtbjEwMjAwLW9wYy5jLgorCSogbTEwMzAwLWRpcy5jOiBSZW5hbWUgZnJvbSBtbjEwMzAwLWRpcy5jCisJKiBtMTAzMDAtb3BjLmM6IFJlbmFtZSBmcm9tIG1uMTAzMDAtb3BjLmMuCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgorCisJKiBtaXBzMTYtb3BjLmM6IEFkZCBtdWwgYW5kIGRtdWwgbWFjcm9zLgorCitUdWUgQXByICAxIDE2OjI3OjQ1IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSBDRkxBR1MsIGFkZCBjbGVhbiB0YXJnZXQuCisKK0ZyaSBNYXIgMjggMTI6MTA6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBBZGQgIndhaXQiLiAgRnJvbSBSYWxmIEJhZWNobGUKKwk8cmFsZkBnbnUuYWkubWl0LmVkdT4uCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN0ZGxpYi5oIHRvIEFDX0NIRUNLX0hFQURFUlMgbGlzdC4KKwkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgorCSogc3lzZGVwLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCisJKiBzcGFyYy1kaXMuYzogSW5jbHVkZSA8c3RkaW8uaD4gYW5kICJzeXNkZXAuaCIuICBEb24ndCBpbmNsdWRlCisJPHN0cmluZy5oPi4KKwkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KKworVGh1IE1hciAyNyAxNDoyNDo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHBwYy1vcGMuYzogQWRkIFBQQyA0MDMgaW5zdHJ1Y3Rpb25zIGFuZCBleHRlbmRlZCBvcGNvZGVzLiAgRnJvbQorCUFuZHJldyBCcmF5IDxhbmR5QG1hZGhvdXNlLmRlbW9uLmNvLnVrPi4KKworCSogbWlwcy1vcGMuYzogQWRkIGNhc3Qgd2hlbiBzZXR0aW5nIG1pcHNfb3Bjb2Rlcy4KKworVHVlIE1hciAyNSAyMzowNDowMCAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6ICBGaXggc2lnbiBleHRlbnNpb24gcHJvYmxlbS4KKwkqIHY4NTAtb3BjLmMgKGV4dHJhY3RfZCopOiAgRml4IHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zIHRvIG1ha2UKKwlkaXNhc3NlbWJseSBjYWxjdWxhdGUgYnJhbmNoIG9mZnNldHMgY29ycmVjdGx5LgorCitNb24gTWFyIDI0IDEzOjIyOjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc2gtb3BjLmg6IEFkZCBiZi9zIGFuZCBidC9zIGFzIHN5bm9ueW1zIGZvciBiZi5zIGFuZCBidC5zLgorCisJKiBtaXBzLW9wYy5jOiBBZGQgZGN0ciBhbmQgZGN0dy4KKworU3VuIE1hciAyMyAxODowODoxMCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IENoYW5nZSB0aGUgd2F5IHNpZ25lZCBjb25zdGFudHMKKwlhcmUgZGlzcGxheWVkLgorCitGcmkgTWFyIDIxIDE0OjM3OjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJGRF9IKTogTmV3IHZhcmlhYmxlLgorCShIRklMRVMpOiBOZXcgdmFyaWFibGUuCisJKENGSUxFUyk6IEFkZCBhbGwgQyBmaWxlcy4KKwkoLmRlcCwgLmRlcDEsIGRlcC5zZWQsIGRlcCwgZGVwLWluKTogTmV3IHRhcmdldHMuCisJRGVsZXRlIG9sZCBkZXBlbmRlbmNpZXMsIGFuZCBidWlsZCBuZXcgb25lcy4KKwkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgorCitUaHUgTWFyIDIwIDE5OjAzOjMwIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGRlZCBibG8gYW5kIGJsb3tzLGIsdyxsfS4KKworVHVlIE1hciAxOCAxNDoxNzowMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAtb3BjLmM6IENoYW5nZSAidHJhcCIgdG8gInN5c2NhbGwiLgorCSogbW4xMDMwMC1vcGMuYzogQWRkIG5ldyAic3lzY2FsbCIgaW5zdHJ1Y3Rpb24uCisKK01vbiBNYXIgMTcgMDg6NDg6MDMgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBQcm92aWRlIGNvcnJlY3QgZW50cmllcyBmb3IgbXVsc2wgYW5kCisgCW11bHVsIGluc25zIG9uIHRoZSBjb2xkZmlyZS4KKworU2F0IE1hciAxNSAxNzoxMzowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9hcm0pOiBEb24ndCBwcmludCBpbnN0cnVjdGlvbiBieXRlcy4KKwkocHJpbnRfaW5zbl9iaWdfYXJtKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCisJKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgorCitGcmkgTWFyIDE0IDE1OjA4OjU5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbHVjb24ub3JnPjoKKwkqIGkzODYtZGlzLmMgKGZldGNoX2RhdGEpOiBBZGQgcHJvdG90eXBlLgorCSogbTY4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6IEFkZCBwcm90b3R5cGUuCisJKGR1bW15X3ByaW50X2FkZHJlc3MpOiBBZGQgcHJvdG90eXBlLiAgTWFrZSBzdGF0aWMuCisJKiBwcGMtb3BjLmMgKHZhbGlkX2JvKTogQWRkIHByb3RvdHlwZS4KKwkqIHNwYXJjLWRpcy5jIChidWlsZF9oYXNoX3RhYmxlKTogQWRkIHByb3RvdHlwZS4KKwkoaXNfZGVsYXllZF9icmFuY2gsIGNvbXB1dGVfYXJjaF9tYXNrKTogQWRkIHByb3RvdHlwZXMuCisJKHByaW50X2luc25fc3BhcmMpOiBNYWtlIHNldmVyYWwgbG9jYWwgdmFyaWFibGVzIGNvbnN0LgorCShjb21wYXJlX29wY29kZXMpOiBDaGFuZ2UgYXJndW1lbnRzIHRvIGNvbnN0IFBUUi4gIEFkZCBwcm90b3R5cGUuCisJKiBzcGFyYy1vcGMuYyAoYXJnKTogQ2hhbmdlIG5hbWUgZmllbGQgdG8gYmUgY29uc3QuCisJKGxvb2t1cF9uYW1lLCBsb29rdXBfdmFsdWUpOiBBZGQgcHJvdG90eXBlcy4gIENoYW5nZSB0YWJsZSBhbmQKKwluYW1lIHBhcmFtZXRlcnMgdG8gYmUgY29uc3QuCisJKHNwYXJjX2VuY29kZV9hc2kpOiBDaGFuZ2UgbmFtZSBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCisJKHNwYXJjX2VuY29kZV9tZW1iYXIsIHNwYXJjX2VuY29kZV9wcmVmZXRjaCk6IExpa2V3aXNlLgorCShzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcpOiBMaWtld2lzZS4KKwkoc3BhcmNfZGVjb2RlX2FzaSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBiZSBjb25zdC4KKwkoc3BhcmNfZGVjb2RlX21lbWJhciwgc3BhcmNfZGVjb2RlX3ByZWZldGNoKTogTGlrZXdpc2UuCisJKHNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyk6IExpa2V3aXNlLgorCitGcmkgTWFyICA3IDEwOjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IEp1c3QgdXNlIGxuIC1zLCBub3QgbG4gLXNmLCBzaW5jZQorCVNvbGFyaXMgZG9lc24ndCBsaWtlIHRoZSBjb21iaW5lZCBvcHRpb25zLCBhbmQgdGhlIC1mIGlzCisJdW5uZWNlc3NhcnkuCisJKHN0YW1wLXRzaGxpbmssIGluc3RhbGwpOiBMaWtld2lzZS4KKworVGh1IE1hciAgNiAxNjo1MToxMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtb3BjLmMgKElNTTE2X1BDUkVMLCBTRDhOX1BDUkVMLCBEMTZfU0hJRlQpOiBNYXJrIHRoZXNlCisJYXMgcmVsYXhhYmxlLgorCitUdWUgTWFyICA0IDA2OjEwOjM2IDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggbGFzdCBjaGFuZ2UgZm9yIHRoZSBtYzY4MDEwLgorCitNb24gTWFyICAzIDA3OjQ1OjIwIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBBZGRlZCBlbnRyaWVzIGZvciB0aGUgdHN0IGluc25zIG9uCisgCXRoZSBtYzY4MDAwLgorCitUaHUgRmViIDI3IDE0OjA0OjMyIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZGVkIHN3YmVnbCBwc2V1ZG8taW5zdHJ1Y3Rpb24uCisKK1RodSBGZWIgMjcgMTE6MzY6NDEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogU2V0IGluZm8tPmJ5dGVzX3Blcl9saW5lIHRvIDguCisKK1dlZCBGZWIgMjYgMTU6MzQ6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBEZWZpbmUgcjI1IHByb3Blcmx5LgorCitXZWQgRmViIDI2IDEzOjM4OjMwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrLWRpcy5jIChORVhUU0lOR0xFLCBORVhURE9VQkxFLCBORVhURVhURU5EKTogVXNlCisJZmxvYXRmb3JtYXRfdG9fZG91YmxlIHRvIG1ha2UgcG9ydGFibGUuCisJKHByaW50X2luc25fYXJnKTogVXNlIE5FWFRFWFRFTkQgbWFjcm8gd2hlbiBleHRyYWN0aW5nIGV4dGVuZGVkCisJcHJlY2lzaW9uIGZsb2F0LgorCitNb24gRmViIDI0IDE5OjI2OjEyIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYzogSW5pdGlhbGl6ZSBtaXBzX29wY29kZXMgdG8gbWlwc19idWlsdGluX29wY29kZXMsCisJYW5kIGJmZF9taXBzX251bV9vcGNvZGVzIHRvIGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXMuCisKK01vbiBGZWIgMjQgMTU6MTk6MDEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYtZGlzLmMsIGQxMHYtb3BjLmM6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8KKwlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCisKK01vbiBGZWIgMjQgMTQ6MzM6MjYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLW9wYy5jIChMU0lfU0NBTEVEKTogUmVuYW1lZCBmcm9tIHRoaXMgLi4uCisJKE9GRl9TTF9CUl9TQ0FMRUQpOiAuLi4gdG8gdGhpcywgYW5kIGFkZGVkIHRoZSBmbGFnCisJVElDODBfT1BFUkFORF9CQVNFUkVMIHRvIHRoZSBmbGFncyB3b3JkLgorCSh0aWM4MF9vcGNvZGVzKTogUmVwbGFjZSBhbGwgb2NjdXJhbmNlcyBvZiBMU0lfU0NBTEVEIHdpdGgKKwlPRkZfU0xfQlJfU0NBTEVELgorCitTYXQgRmViIDIyIDIxOjI1OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYzogQWRkIG1hY3JvcyBmb3IgY29wMCwgY29wMSBjb3AyIGFuZCBjb3AzLgorCUNoYW5nZSBtaXBzX29wY29kZXMgZnJvbSBjb25zdCBhcnJheSB0byBhIHBvaW50ZXIsCisJYW5kIGNoYW5nZSBiZmRfbWlwc19udW1fb3Bjb2RlcyBmcm9tIGNvbnN0IGludCB0byBpbnQsCisJc28gdGhhdCB3ZSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG1pcHMgb3Bjb2RlcyB0YWJsZQorCWR5bmFtaWNhbGx5LgorCitTYXQgRmViIDIyIDIxOjAzOjQ3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogUmV2ZXJ0IGNoYW5nZSB0bworCXN0b3JlIEJJVE5VTSB2YWx1ZXMgaW4gdGhlIHRhYmxlIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybQorCXRvIG1hdGNoIGJlaGF2aW9yIHdoZW4gYXNzZW1ibGVyIGlzIGdpdmVuIGEgcmF3IG51bWVyaWMKKwl2YWx1ZSBmb3IgYSBCSVROVU0gb3BlcmFuZC4KKwkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2JpdG51bSk6IERpdHRvLgorCitGcmkgRmViIDIxIDE2OjMxOjE4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMzB2LW9wYy5jOiBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gRkxBR19YLgorCitXZWQgRmViIDE5IDE0OjUxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRlbmNpZXMgb24gLi4vYmZkL2JmZC5oIGFzIHJlcXVpcmVkLgorCitUdWUgRmViIDE4IDE3OjQzOjQzIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogQWRkZWQgZDMwdiBvYmplY3QgZmlsZXMuCisJKiBjb25maWd1cmU6IChiZmRfZDMwdl9hcmNoKSBSZWJ1aWx0LgorCSogY29uZmlndXJlLmluOiAoYmZkX2QzMHZfYXJjaCkgQWRkZWQgbmV3IGNhc2UuCisJKiBkMzB2LWRpcy5jOiBOZXcgZmlsZS4KKwkqIGQzMHYtb3BjLmM6IE5ldyBmaWxlLgorCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKSBBZGQgZW50cnkgZm9yIGQzMHYuCisKK1R1ZSBGZWIgMTggMTY6MzI6MDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBBZGQgc3ltYm9saWMKKwlyZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBCSVROVU0gdmFsdWVzLgorCitGcmkgRmViIDE0IDEyOjE0OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogU3RvcmUgQklUTlVNIHZhbHVlcworCWluIHRoZSB0YWJsZSBpbiBvbmUncyBjb21wbGVtZW50IGZvcm0sIGFzIHRoZXkgYXBwZWFyIGluIHRoZQorCWFjdHVhbCBpbnN0cnVjdGlvbi4KKwkodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogVXNlIG1hY3JvcyB0byBhY2Nlc3MgcHJlZGVmaW5lZAorCXN5bWJvbCBmaWVsZHMuCisJKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IERpdHRvLgorCSh0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgorCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfYml0bnVtKTogUmVtb3ZlIGNvZGUgdGhhdCBkaWQKKwlvbmUncyBjb21wbGVtZW50IGZvciBCSVROVU0gdmFsdWVzLgorCitUaHUgRmViIDEzIDIxOjU2OjUxIDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzLiAgVXBkYXRlIHRvIGxhdGVzdAorCWdjYyByZWxlYXNlLgorCitUaHUgRmViIDEzIDIwOjQxOjIyIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBzd2JlZyBwc2V1ZG8taW5zdHJ1Y3Rpb24uCisKK1RodSBGZWIgMTMgMTY6MzA6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwLW9wYy5jIChJTU0xNl9QQ1JFTCk6IFRoaXMgaXMgYSBzaWduZWQgb3BlcmFuZC4KKwkoSU1NMjRfUENSRUwpOiBMaWtld2lzZS4KKworVGh1IEZlYiAxMyAxMzoyODo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1pcHMtZGlzLmMgKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IFVzZSBtZW1hZGRyIC0gMiBhcyB0aGUgYmFzZQorCWFkZHJlc3MgZm9yIGFuIGV4dGVuZGVkIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIHRoYXQgaXMgbm90IGEKKwlicmFuY2guCisKK1dlZCBGZWIgMTIgMTI6Mjc6NDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kCisJYnl0ZXNfcGVyX2xpbmUuCisKK1R1ZSBGZWIgMTEgMTY6MzY6MzEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEZpeCB0eXBvICcrJyAtPiAnfCcuCisJKHRpYzgwX29wY29kZXMpOiBTb3J0IGVudHJpZXMgc28gdGhhdCBsb25nIGltbWVkaWF0ZSBmb3JtcworCWNvbWUgYWZ0ZXIgc2hvcnQgaW1tZWRpYXRlIGZvcm1zLCBtYWtpbmcgaXQgZWFzaWVyIGZvcgorCWFzc2VtYmxlciB0byBzZWxlY3QgdGhlIHJpZ2h0IG9uZSBmb3IgYSBnaXZlbiBvcGVyYW5kLgorCitUdWUgRmViIDExIDE1OjI2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAoX3ByaW50X2luc25fbWlwcyk6IFNldCBieXRlc19wZXJfY2h1bmsgYW5kCisJZGlzcGxheV9lbmRpYW4uCisJKHByaW50X2luc25fbWlwczE2KTogTGlrZXdpc2UuCisKK01vbiBGZWIgMTAgMTA6MTI6NDEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRpYzgwLW9wYy5jICh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBDaGFuZ2VkIHRvIGFjY2VwdAorCWEgc3ltYm9sIGNsYXNzIHRoYXQgcmVzdHJpY3RzIHRyYW5zbGF0aW9uIHRvIGp1c3QgdGhhdAorCWNsYXNzIChnZW5lcmFsIHJlZ2lzdGVyLCBjb25kaXRpb24gY29kZSwgZXRjKS4KKworVGh1IEZlYiAgNiAxNzozNDowOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFJFR18wX0UsIFJFR18yMl9FLAorCWFuZCBSRUdfREVTVF9FIGZvciByZWdpc3RlciBvcGVyYW5kcyB0aGF0IGhhdmUgdG8gYmUKKwlhbiBldmVuIG51bWJlcmVkIHJlZ2lzdGVyLiAgQWRkIFJFR19GUEEgZm9yIG9wZXJhbmRzIHRoYXQKKwlhcmUgb25lIG9mIHRoZSBmbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3RlcnMuCisJQWRkIFRJQzgwX09QRVJBTkRfTUFTSyB0byBmbGFncyBmb3IgRU5ETUFTSyBvcGVyYW5kLgorCSh0aWM4MF9vcGNvZGVzKTogQ2hhbmdlIGVudHJpZXMgdGhhdCBuZWVkIGV2ZW4gbnVtYmVyZWQKKwlyZWdpc3RlciBvcGVyYW5kcyB0byB1c2UgdGhlIG5ldyBvcGVyYW5kIHRhYmxlIGVudHJpZXMuCisJQWRkICJvciIgZW50cmllcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gIm9yLnR0IiBlbnRyaWVzLgorCitXZWQgRmViICA1IDExOjEyOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwczE2LW9wYy5jOiBBZGQgbmV3IGNhc2VzIG9mIGV4aXQgaW5zdHJ1Y3Rpb24gZm9yCisJZGlzYXNzZW1ibGVyLgorCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogRGlzcGxheSBmbG9hdGluZyBwb2ludAorCXJlZ2lzdGVycyBpbiBvcGVyYW5kcyBvZiBleGl0IGluc3RydWN0aW9uLiAgUHJpbnQgYCQnIGJlZm9yZQorCXJlZ2lzdGVyIG5hbWVzIGluIG9wZXJhbmRzIG9mIGVudHJ5IGFuZCBleGl0IGluc3RydWN0aW9ucy4KKworVGh1IEphbiAzMCAxNDowOTowMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IFRhYmxlIG9mIG5hbWUvdmFsdWUKKwlwYWlycyBmb3IgYWxsIHByZWRlZmluZWQgc3ltYm9scyByZWNvZ25pemVkIGJ5IHRoZSBhc3NlbWJsZXIuCisJQWxzbyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsaW5nIHJvdXRpbmVzLgorCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBOZXcgZnVuY3Rpb24uCisJKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KKwkqIHRpYzgwLWRpcy5jIChwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIsCisgCXByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUsIHByaW50X29wZXJhbmRfYml0bnVtKToKKwlSZW1vdmUgcHJpdmF0ZSB0YWJsZXMgYW5kIHVzZSB0aWM4MF92YWx1ZV90b19zeW1ib2wgZnVuY3Rpb24uCisKK1RodSBKYW4gMzAgMTE6MzA6NDUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBDaGFuZ2UgYWRkcmVzcyBwcmludGluZworCXRvIGNvcnJlY3RseSBoYW5kbGUgUEMgd3JhcHBpbmcuICBGaXhlcyBQUjExNDkwLgorCitXZWQgSmFuIDI5IDA5OjM5OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IE1ha2UgOCBhbmQgMTYgYml0IHBjLXJlbGF0aXZlCisJYnJhbmNoZXMgcmVsYXhhYmxlLgorCitUdWUgSmFuIDI4IDE1OjU3OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBTZXQgaW5zbl9pbmZvIGluZm9ybWF0aW9uLgorCShwcmludF9taXBzMTZfaW5zbl9hcmcpOiBMaWtld2lzZS4KKworCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBCZXR0ZXIgaGFuZGxpbmcgb2YgYW4gZXh0ZW5kCisgCW9wY29kZSBmb2xsb3dlZCBieSBhbiBpbnN0cnVjdGlvbiB3aGljaCBjYW4gbm90IGJlIGV4dGVuZGVkLgorCitGcmkgSmFuIDI0IDEyOjA4OjIxIDE5OTcgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDaGFuZ2VkIG9wZXJhbmQgc3BlY2lmaWVyIGZvciB0aGUKKyAJY29sZGZpcmUgbW92ZWIgaW5zdHJ1Y3Rpb24gdG8gbm90IGFsbG93IGFuIGFkZHJlc3MgcmVnaXN0ZXIgYXMKKyAJZGVzdGluYXRpb24uICBBbHRob3VnaCB0aGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0CisJdGhpcyBpcyBpbnZhbGlkLCBleHBlcmltZW50cyB1bmNvdmVyZWQgdW5leHBlY3RlZCBiZWhhdmlvci4KKwlBZGRlZCBhIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uLiAgVGhhbmtzIHRvIEFuZHJlYXMKKwlTY2h3YWIgZm9yIHBvaW50aW5nIHRoaXMgb3V0IHRvIG1lLgorCitXZWQgSmFuIDIyIDIwOjEzOjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAodGljODBfb3Bjb2Rlcyk6IEV4cGFuZCBjb21tZW50IHRvIG5vdGUgdGhhdCB0aGUKKyAJZW50cmllcyBhcmUgcHJlc29ydGVkIHNvIHRoYXQgZW50cmllcyB3aXRoIHRoZSBzYW1lIG1uZW1vbmljIGFyZQorCWFkamFjZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHRhYmxlLiAgU29ydCB0aGUgZW50cmllcyBmb3IgZWFjaAorCWluc3RydWN0aW9uIHNvIHRoYXQgdGhpcyBpcyB0cnVlLgorCitNb24gSmFuIDIwIDEyOjQ4OjU3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrLWRpcy5jOiBJbmNsdWRlIDxsaWJpYmVydHkuaD4uCisJKHByaW50X2luc25fbTY4ayk6IFNvcnQgdGhlIG9wY29kZSB0YWJsZSBvbiB0aGUgbW9zdCBzaWduaWZpY2FudAorCW5pYmJsZSBvZiB0aGUgb3Bjb2RlLgorCitTYXQgSmFuIDE4IDE1OjE1OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1kaXMuYyAodGljODBfb3Bjb2Rlcyk6IEFkZCAid3JjciIsICJ2bXB5IiwgInZybmQiLAorCSJ2c3ViIiwgInZzdCIsICJ4bm9yIiwgYW5kICJ4b3IiIGluc3RydWN0aW9ucy4KKwkoVl9hMSk6IFJlbmFtZWQgZnJvbSBWX2EsIG1zYiBvZiBhY2N1bXVsYXRvciByZWcgbnVtYmVyLgorCShWX2EwKTogQWRkIG1hY3JvLCBsc2Igb2YgYWNjdW11bGF0b3IgcmVnIG51bWJlci4KKworRnJpIEphbiAxNyAxODoyNDozMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBCcm9rZSBleGNlc3NpdmVseSBsb25nCisJZnVuY3Rpb24gdXAgaW50byBzZXZlcmFsIHNtYWxsZXIgb25lcyBhbmQgYXJyYW5nZWQgZm9yCisJdGhlIGluc3RydWN0aW9uIHByaW50aW5nIGZ1bmN0aW9uIHRvIGJlIGNhbGxhYmxlIHJlY3Vyc2l2ZWx5CisJdG8gcHJpbnQgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYm90aCBhIGxvYWQgYW5kIGEKKwltYXRoIGluc3RydWN0aW9uIHBhY2tlZCBpbnRvIGEgc2luZ2xlIG9wY29kZS4KKwkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogRXhwYW5kIGNvbW1lbnQgZm9yIHZsZCBvcGNvZGUKKwl0byBleHBsYWluIHdoeSBpdCBjb21lcyBhZnRlciB0aGUgb3RoZXIgdmVjdG9yIG9wY29kZXMuCisKK0ZyaSBKYW4gMTcgMTY6MTk6MTUgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBhZGQgYiwgdywgb3IgbCBzcGVjaWZpZXIgdG8gY29sZGZpcmUKKwltb3ZlIGluc25zIHRvIGhhbmRsZSBpbW1lZGlhdGUgb3BlcmFuZHMuCisKK1RodSBKYW4gMTcgMTY6MTk6MDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IERlbGV0ZSBkdXBsaWNhdGUgZW50cnkgZm9yICJjbXBpbCIuCisJZml4IG9wZXJhbmQgbWFzayBpbiB0aGUgIm1vdmVtbCIgZW50cmllcyBmb3IgdGhlIGNvbGRmaXJlLgorCitUaHUgSmFuIDE2IDIwOjU0OjQwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAoVl9hLCBWX20sIFZfUywgVl9aLCBWX3AsIE9QX1YsIE1BU0tfVik6CisJTmV3IG1hY3JvcyBmb3IgYnVpbGRpbmcgdmVjdG9yIGluc3RydWN0aW9uIG9wY29kZXMuCisJKHRpYzgwX29wY29kZXMpOiBSZW1vdmUgYWxsIHVzZXMgb2YgRk1UX1NJLCBGTVRfUkVHLCBhbmQKKwlGTVRfTEksIHdoaWNoIHdlcmUgdW51c2VkLiAgVGhlIGZpZWxkIGlzIG5vdyBhIGZsYWdzIGZpZWxkLgorCVJlbW92ZSBzb21lIG9wY29kZXMgdGhhdCBhcmUgcG9zc2libGUsIGJ1dCBpbGxlZ2FsLCBzdWNoCisJYXMgbG9uZyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIHdpdGggZG91YmxlcyBmb3IgaW1tZWRpYXRlCisJdmFsdWVzLiAgQWRkICJ2YWRkIiBhbmQgInZsZCIgaW5zdHJ1Y3Rpb25zLgorCitXZWQgSmFuIDE1IDE4OjU5OjUxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBSZW9yZGVyIHNvbWUgdGFibGUgZW50cmllcyB0byBtYWtlCisJdGhlIG9yZGVyIG1vcmUgbG9naWNhbC4gIE1vdmUgdGhlIHNoaWZ0IGFsaWFzIGluc3RydWN0aW9ucyAoInJvdGwiLAorCSJzaGwiLCAiaW5zIiwgInJvdHIiLCAiZXh0dSIsICJleHRzIiwgInNybCIsIGFuZCAic3JhIiB0byBiZQorIAlpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcmVndWxhciBzci54IGFuZCBzbC54IGluc3RydWN0aW9ucy4gIEFkZAorCWFuZCB0ZXN0IG5ldyBpbnN0cnVjdGlvbiBvcGNvZGVzIGZvciAic2wiLCAic2xpIiwgInNyIiwgInNyaSIsICJzdCIsCisgCSJzdWIiLCAic3VidSIsICJzd2NyIiwgYW5kICJ0cmFwIi4KKworVHVlIEphbiAxNCAxOTo0Mjo1MCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtb3BjLmMgKE9GRl9TU19QQyk6IFJlbmFtZWQgZnJvbSBPRkZfU1MuCisJKE9GRl9TTF9QQyk6IFJlbmFtZWQgZnJvbSBPRkZfU0wuCisJKE9GRl9TU19CUik6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVsYXRpdmUgb3BlcmFuZC4KKwkoT0ZGX1NMX0JSKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWxhdGl2ZSBvcGVyYW5kLgorCShSRUdfQkFTRSk6IE5ldyBvcGVyYW5kIHR5cGUgZm9yIGJhc2UgcmVnaXN0ZXIgb3BlcmFuZC4KKwkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCAiZm1weSIsICJmcm5kbSIsICJmcm5kbiIsICJmcm5kcCIsCisJImZybmR6IiwgImZzcXJ0IiwgImZzdWIiLCAiaWxsb3AwIiwgImlsbG9wRiIsICJpbnMiLCAianNyIiwKKwkibGQiLCAibGQudSIsICJsbW8iLCAib3IiLCAicmRjciIsICJybW8iLCAicm90bCIsIGFuZCAicm90ciIKKwlpbnN0cnVjdGlvbnMuCisJKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IG9wY29kZSBuYW1lIHdpdGggZml4ZWQgd2lkdGgKKyAJMTAgY2hhciBmaWVsZCwgcGFkZGVkIHdpdGggc3BhY2VzIG9uIHJocywgcmF0aGVyIHRoYW4gYSBzdHJpbmcKKyAJZm9sbG93ZWQgYnkgYSB0YWIuICBVc2UgcmVuYW1lZCBUSUM4MF9PUEVSQU5EX1BDUkVMIGZsYWcgYml0IHJhdGhlcgorIAl0aGFuIG9sZCBUSUM4MF9PUEVSQU5EX1JFTEFUSVZFLiAgQWRkIHN1cHBvcnQgZm9yIG5ldworCVRJQzgwX09QRVJBTkRfQkFTRVJFTCBmbGFnIGJpdC4KKworTW9uIEphbiAxMyAxNTo1ODo1NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBmbG9hdGluZyBwb2ludCBvcGVyYW5kcworCWFzIGZsb2F0cy4KKwkqIHRpYzgwLW9wYy5jIChTUEZJKTogQWRkIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQKKwlpbW1lZGlhdGUgb3BlcmFuZCB0eXBlLgorCShST1RBVEUpOiBBZGQgcm90YXRlIG9wZXJhbmQgdHlwZSBmb3Igc2hpZnRzLgorCShFTkRNQVNLKTogQWRkIGZvciBzaGlmdHMuCisJKG4pOiBNYWNybyBmb3IgdGhlICduJyBiaXQuCisJKGkpOiBNYWNybyBmb3IgdGhlICdpJyBiaXQuCisJKFBEKTogTWFjcm8gZm9yIHRoZSAnUEQnIGZpZWxkLgorCShQMik6IE1hY3JvIGZvciB0aGUgJ1AyJyBmaWVsZC4KKwkoUDEpOiBNYWNybyBmb3IgdGhlICdQMScgZmllbGQuCisJKHRpYzgwX29wY29kZXMpOiBBZGQgZW50cmllcyBmb3IgImV4dHMiLCAiZXh0dSIsICJmYWRkIiwKKwkiZmNtcCIsIGFuZCAiZmRpdiIuCisKK01vbiBKYW4gIDYgMTU6MDY6NTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1hc2sgb2ZmIHVud2FudGVkIGJpdHMgYWZ0ZXIKKwlhZGRpbmcgaW4gY3VycmVudCBhZGRyZXNzIGZvciBwYy1yZWxhdGl2ZSBvcGVyYW5kcy4KKworTW9uIEphbiAgNiAxMDo1NjoyNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtZGlzLmMgKFJfU0NBTEVEKTogQWRkIG1hY3JvIHRvIHRlc3QgZm9yICI6cyIgbW9kaWZpZXIgYml0LgorCShwcmludF9pbnNuX3RpYzgwKTogSWYgUl9TQ0FMRUQgdGhlbiBwcmludCAiOnMiIG1vZGlmaWVyIGZvciBvcGVyYW5kLgorCSogdGljODAtb3BjLmMgKFJFRzAsIFJFRzIyLCBSRUcyNywgU1NPRkYsIExTT0ZGKTogTmFtZXMKKwljaGFuZ2VkIHRvIFJFR18wLCBSRUdfMjIsIFJFR19ERVNULCBPRkZfU1MsIE9GRl9TTCByZXNwZWN0aXZlbHkuCisJKFNJQ1IsIExJQ1IsIFJFR01fU0ksIFJFR01fTEkpOiBOYW1lcyBjaGFuZ2VkIHRvIENSX1NJLCBDUl9MSSwKKwlSRUdfQkFTRV9NX1NJLCBSRUdfQkFTRV9NX0xJIHJlc3BlY3RpdmVseS4KKwkoUkVHX1NDQUxFRCwgTFNJX1NDQUxFRCk6IE5ldyBvcGVyYW5kIHR5cGVzLgorCShFKTogTmV3IG1hY3JvIGZvciAnRScgYml0IGF0IGJpdCAyNy4KKwkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCBkbGQsIGRsZC51LCBkc3QsIGVzdG9wLCBhbmQgZXRyYXAKKwlvcGNvZGVzLCBpbmNsdWRpbmcgdGhlIHZhcmlvdXMgc2l6ZSBmbGF2b3JzIChiLGgsdyxkKSBmb3IKKwl0aGUgZGlyZWN0IGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucy4KKworU3VuIEphbiAgNSAxMjoxODoxNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtZGlzLmMgKE1fU0ksIE1fTEkpOiBBZGQgbWFjcm9zIHRvIHRlc3QgZm9yICI6bSIgbW9kaWZpZXIgYml0CisgCWluIGFuIGluc3RydWN0aW9uLgorCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBDaGFuZ2UgY29tbWEgYW5kIHBhcmVuIGhhbmRsaW5nLgorICAJVXNlIE1fU0kgYW5kIE1fTEkgbWFjcm9zIHRvIGNoZWNrIGZvciAiOm0iIG1vZGlmaWVyIGZvciBHUFIgb3BlcmFuZHMuCisJKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgUkVHTV9TSSBhbmQgUkVHTV9MSSBvcGVyYW5kcy4KKwkoRiwgTV9SRUcsIE1fTEksIE1fU0ksIFNaX1JFRywgU1pfTEksIFNaX1NJLCBELCBTKTogTmV3CWJpdC10d2lkZGxlcnMuCisJKE1BU0tfTElfTSwgTUFTS19TSV9NLCBNQVNLX1JFR19NKTogUmVtb3ZlIGFuZCByZXBsYWNlIGluIG9wY29kZQorCW1hc2tzIHdpdGggIk1BU0tfKiAmIH5NXyoiIHRvIGdldCB0aGUgTSBiaXQgcmVzZXQuCisJKHRpYzgwX29wY29kZXMpOiBBZGQgYnNyLCBic3IuYSwgY21uZCwgY21wLCBkY2FjaGVjLCBhbmQgZGNhY2hlZi4KKworU2F0IEphbiAgNCAxOTowNTowNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBQcmludCBUSUM4MF9PUEVSQU5EX1JFTEFUSVZFCisJY29ycmVjdGx5LiAgQWRkIHN1cHBvcnQgZm9yIHByaW50aW5nIFRJQzgwX09QRVJBTkRfQklUTlVNIGFuZAorCVRJQzgwX09QRVJBTkRfQ0MsIGFuZCBUSUM4MF9PUEVSQU5EX0NSIG9wZXJhbmRzIGluIHN5bWJvbGljCisJZm9ybS4KKwkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBTU09GRiwgTFNPRkYsIEJJVE5VTSwKKwlDQywgU0lDUiwgYW5kIExJQ1IgdGFibGUgZW50cmllcy4KKwkodGljODBfb3Bjb2Rlcyk6IEFkZCBhbmQgdGVzdCAibm9wIiwgImJyIiwgImJibyIsICJiYnoiLAorCSJiY25kIiwgYW5kICJicmNyIiBvcGNvZGVzLgorCitGcmkgSmFuICAzIDE4OjMyOjExIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBNYWtlIGNvbW1lbnQgbWF0Y2ggdGhlCisJYWN0dWFsIGZpZWxkcyAobm8gc2hpZnQgZmllbGQpLgorCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBEb2N1bWVudCB3aHkgdGhpcyBjYW5ub3QgYmUgImNvbnN0Ii4KKwkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUmVwbGFjZSBhYm9ydCBzdHViIHdpdGggYQorCXBhcnRpYWwgaW1wbGVtZW50YXRpb24sIHdvcmsgaW4gcHJvZ3Jlc3MuCisJKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBCZWdpbiBjb25zdHJ1Y3Rpb24gb3BlcmFuZHMgdGFibGUuCisJKHRpYzgwX29wY29kZXMpOiBDb250aW51ZSBwb3B1bGF0aW5nIG9wY29kZXMgdGFibGUgYW5kIHN0YXJ0CisJZmlsbGluZyBpbiB0aGUgb3BlcmFuZCBpbmRpY2VzLgorCSh0aWM4MF9udW1fb3Bjb2Rlcyk6IEFkZCB0aGlzLgorCitGcmkgSmFuICAzIDEyOjEzOjUyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYzogQWRkICNCIGNhc2UgZm9yIG1vdmVxLgorCitUaHUgSmFuICAyIDEyOjE0OjI5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYWtlIHN1cmUgYWxsIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQKKwliZWZvcmUgdGhleSBhcmUgdXNlZC4KKworVHVlIERlYyAzMSAxMjoyMDozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IFB1dCBjdXJseS1icmFjZXMgYXJvdW5kIG9wZXJhbmRzCisJZm9yICJicmVha3BvaW50IiBpbnN0cnVjdGlvbi4KKworVHVlIERlYyAzMSAxNTozODoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCisJKGRlcCk6IFVzZSBBTExfQ0ZMQUdTIHJhdGhlciB0aGFuIENGTEFHUy4KKworVHVlIERlYyAzMSAxNTowOToxNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKEQ4X3s2LDd9KTogU2V0IFY4NTBfT1BFUkFORF9BREpVU1RfU0hPUlRfTUVNT1JZCisJZmxhZy4KKworTW9uIERlYyAzMCAxNzowMjoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG02OGstb3BjLm8sIGFscGhhLW9wYy5vKTogUmVtb3ZlIGRpcy1hc20uaCBkZXBlbmRlbmN5LgorCSh0aWM4MC1kaXMubywgdGljODAtb3BjLm8pOiBBZGQgcnVsZXMgcGVyIGNvbW1lbnQgaW4gTWFrZWZpbGUuaW4uCisKK01vbiBEZWMgMzAgMTE6Mzg6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzMTYtb3BjLmM6IEFkZCAiYWJzIi4KKworU3VuIERlYyAyOSAxMDo1ODoyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCB0aWM4MC1kaXMubyBhbmQgdGljODAtb3BjLm8uCisJKiBkaXNhc3NlbWJsZS5jIChBUkNIX3RpYzgwKTogRGVmaW5lIGlmIEFSQ0hfYWxsIGlzIGRlZmluZWQuCisJKGRpc2Fzc2VtYmxlcik6IEFkZCBiZmRfYXJjaF90aWM4MCBzdXBwb3J0IHRvIHNldCBkaXNhc3NlbWJsZQorIAl0byBwcmludF9pbnNuX3RpYzgwLgorCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBBZGQgc3R1Yi4KKworRnJpIERlYyAyNyAyMjozMDo1NyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChhcmNoIGluICRzZWxhcmNocyk6IEFkZCBiZmRfdGljODBfYXJjaCBlbnRyeS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgorCSogdGljODAtZGlzLmM6IEFkZCBmaWxlLgorCSogdGljODAtb3BjLmM6IEFkZCBmaWxlLgorCitGcmkgRGVjIDIwIDE0OjMwOjE5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiAgQWRkIGNyWzAtMTVdLCBkcGMsIGRwc3csIGxpbmsuCisKK01vbiBEZWMgMTYgMTM6MDA6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogQWRkIFNJTU0xNk4uCisJKG1uMTAyMDBfb3Bjb2Rlcyk6IFVzZSBpdCBmb3Igc29tZSBsb2dpY2FscyBhbmQgYnRzdCBpbnNucy4KKwlBZGQgImJyZWFrIiBhbmQgInRyYXAiIGluc3RydWN0aW9ucy4KKworCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkICJicmVhayIgaW5zdHJ1Y3Rpb24uCisKKwkqIG1uMTAyMDAtb3BjLmM6IEFkZCBwc2V1ZG8tb3BzIGZvciAibW92IChhbiksYW0iIGFuZCAibW92IGFuLChhbSkiLgorCitTYXQgRGVjIDE0IDIyOjM2OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogVGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDCisJcmVsYXRpdmUgbG9hZCBvciBhZGQgbm93IGRlcGVuZHMgdXBvbiB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcworCWluIGEgZGVsYXkgc2xvdC4KKworV2VkIERlYyAxMSAwOToyMzo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAtZGlzLmM6IEZpbmlzaCB3cml0aW5nIGRpc2Fzc2VtYmxlci4KKwkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciAibW92IGltbTgsZG4iLgorCUZpeCBtYXNrIGZvciAiam1wIChhbikiLgorCisJKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSwgcHJpbnRfaW5zbl9tbjEwMzAwKTogQ29ycmVudGx5CisJaGFuZGxlIGVuZGlhbm5lc3MgaXNzdWVzIGZvciBtbjEwMzAwLgorCisJKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiBGaXggb3BlcmFuZHMgZm9yICJtb3ZiIGRtLChhbikiLgorCitUdWUgRGVjIDEwIDEyOjA4OjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogIm1vdiBpbW04LGQwIiBpcyBhIGZvcm1hdCAyCisJaW5zdHJ1Y3Rpb24uICBGaXggb3Bjb2RlIGZpZWxkIGZvciAibW92YiAoaW1tMjQpLGRuIi4KKworCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGVyYW5kcyk6IEZpeCBpbnNlcnRpb24gcG9zaXRpb24KKwlmb3IgREkgb3BlcmFuZC4KKworTW9uIERlYyAgOSAxNjo0Mjo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAtb3BjLmM6IENyZWF0ZSBtbjEwMjAwIG9wY29kZSB0YWJsZS4KKwkqIG1uMTAyMDAtZGlzLmM6IEZsZXNoIG91dCBtbjEwMjAwIGRpc2Fzc2VtYmxlci4gIE5vdCByZWFkeSwKKwlidXQgbW92aW5nIGFsb25nIG5pY2VseS4KKworU3VuIERlYyAgOCAwNDoyODozMSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiAgQWRkIG1pcHMxNi1vcGMuby4KKworRnJpIERlYyAgNiAxNjo0Nzo0MCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcmhpbm8uY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogUmV2ZXJ0IGNoYW5nZSB0byB1c2UgPCBhbmQgPgorCXNwZWNpZmllcnMgZm9yIGZtb3ZlbSogaW5zdHJ1Y3Rpb25zLgorCitGcmkgRGVjICA2IDE0OjQ4OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBSZW1vdmUgJyQnIHJlZ2lzdGVyIHByZWZpeGluZy4KKworRnJpIERlYyAgNiAxNzozNDozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1pcHMxNi1vcGMuYzogQ2hhbmdlIG9wY29kZSBmb3IgZW50cnkvZXhpdCB0byBhdm9pZCBjb25mbGljdGluZworCXdpdGggZHNybC4KKworRnJpIERlYyAgNiAxNDo0ODowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtb3BjLmM6IEFkZCBzb21lIGNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIHZhcmlvdXMKKyAJb3BlcmFuZHMgYW5kIHN1Y2guCisKKwkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogRml4IG1pbm9yIGdjYyAtV2FsbCB3YXJuaW5ncy4KKworVGh1IERlYyAgNSAxMjowOTo0OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyA8IGFuZCA+IG9wZXJhbmQKKwlzcGVjaWZpZXJzLgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBTaW1wbGlmeSB0YWJsZSBieSB1c2luZyA8IGFuZCA+CisJb3BlcmFuZCBzcGVjaWZpZXJzIGluIGZtb3ZtKiBpbnN0cnVjdGlvbnMuCisKK1dlZCBEZWMgIDQgMTQ6NTI6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwcGMtb3BjLmMgKGluc2VydF9saSk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlIG9mZnNldCBoYXMgdGhlIHR3bworCWxlYXN0IHNpZ25pZmljYW50IGJpdHMgc2V0LgorCitXZWQgTm92IDI3IDEzOjA5OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9taXBzMTYpOiBTZXBhcmF0ZSB0aGUgaW5zdHJ1Y3Rpb24gZnJvbQorCXRoZSBhcmd1bWVudHMgd2l0aCBhIHRhYiwgbm90IGEgc3BhY2UuCisKK1R1ZSBOb3YgMjYgMTM6MjQ6MTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLWRpcy5jIChkaXNhc2VtYmxlKTogRmluaXNoIGNvbnZlcnNpb24gdG8gJyQnIGFzCisJcmVnaXN0ZXIgcHJlZml4LgorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggbWFzayBmaWVsZCBmb3IKKwltb3YgYW0sKGltbTMyLHNwKS4KKworVHVlIE5vdiAyNiAxMDo1MzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCisKKwlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6CisJKiBtaXBzMTYtb3BjLmM6IE5ldyBmaWxlLgorCSogbWlwcy1kaXMuYzogSW5jbHVkZSAiZWxmLWJmZC5oIiBhbmQgImVsZi9taXBzLmgiLgorCShtaXBzMTZfcmVnX25hbWVzKTogTmV3IHN0YXRpYyBhcnJheS4KKwkocHJpbnRfaW5zbl9iaWdfbWlwcyk6IFVzZSBwcmludF9pbnNuX21pcHMxNiBpbiAxNiBiaXQgbW9kZSBvcgorCWFmdGVyIHNlZWluZyBhIDE2IGJpdCBzeW1ib2wuCisJKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBMaWtld2lzZS4KKwkocHJpbnRfaW5zbl9taXBzMTYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShwcmludF9taXBzMTZfaW5zbl9hcmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCSogbWlwcy1vcGMuYzogQWRkIGphbHggaW5zdHJ1Y3Rpb24uCisJKiBNYWtlZmlsZS5pbiAobWlwczE2LW9wYy5vKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbjogVXNlIG1pcHMxNi1vcGMubyBmb3IgYmZkX21pcHNfYXJjaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworTW9uIE5vdiAyNSAxNjoxNToxNyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogU2ltcGxpZnkgdGFibGUgYnkgdXNpbmcgPCBhbmQgPgorIAlvcGVyYW5kIHNwZWNpZmllcnMgaW4gKnNhdmUsICpyZXN0b3JlIGFuZCBtb3ZlbSogaW5zdHJ1Y3Rpb25zLgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggbW92ZSBhbmQgbW92ZW0gaW5zdHJ1Y3Rpb25zIGZvcgorIAl0aGUgY29sZGZpcmUuCisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFRoZSBjb2xkZmlyZSAobWNmNTIwMCkgY2FuIG9ubHkgdXNlCisgCXJlZ2lzdGVyIG9wZXJhbmRzIGZvciBpbW1lZGlhdGUgYXJpdGhtZXRpYywgbm90LCBuZWcsIG5lZ3gsIGFuZAorCXNldCBhY2NvcmRpbmcgdG8gY29uZGl0aW9uIGluc3RydWN0aW9ucy4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ29uc2lzdGFudGx5IFVzZSAicyIgYXMgdGhlIHN0b3JhZ2UKKyAJc3BlY2lmaWVyIG9mIHRoZSBlZmZlY3RpdmUtYWRkcmVzcyBvcGVyYW5kIGluIGltbWVkaWF0ZSBmb3JtcyBvZgorIAlhcml0aG1ldGljIGluc3RydWN0aW9ucy4gIFRoZSBzcGVjaWZpZXIgZm9yIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAorIAlub3RlcyBob3cgYW5kIHdoZXJlIHRoZSBjb25zdGFudCB3aWxsIGJlIHN0b3JlZC4KKworTW9uIE5vdiAyNSAxMToxNzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFJlbW92ZSByZWR1bmRhbnQgImxjYyIKKwlvcGNvZGUuCisKKwkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogVXNlICckJyBpbnN0ZWFkIG9mICclJyBmb3IKKwlyZWdpc3RlciBwcmVmaXguCisKKwkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUHJlZml4IHJlZ2lzdGVycyB3aXRoICclJy4KKworV2VkIE5vdiAyMCAxMDozNzoxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSGFuZGxlIHJlZ2lzdGVyIGxpc3RzLgorCisJKiBtbjEwMzAwLW9wYy5jOiBGaXggaGFuZGxpbmcgb2YgcmVnaXN0ZXIgbGlzdCBvcGVyYW5kIGZvcgorCSJjYWxsIiwgInJldCIsIGFuZCAicmV0cyIgaW5zdHJ1Y3Rpb25zLgorCisJKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFByaW50IFBDLXJlbGF0aXZlIGFuZCBtZW1vcnkKKwlhZGRyZXNzZXMgc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLgorCSogbW4xMDMwMC1vcGMuYzogRGlzdGluZ3Vpc2ggYmV0d2VlbiBhYnNvbHV0ZSBtZW1vcnkgYWRkcmVzc2VzLAorCXBjLXJlbGF0aXZlIG9mZnNldHMgJiByYW5kb20gaW1tZWRpYXRlcy4KKworCSogbW4xMDMwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMzAwKTogRml4IGZldGNoIG9mIGxhc3QgYnl0ZQorCWluIDcgYnl0ZSBpbnNucy4KKwkoZGlzYXNzZW1ibGUpOiBIYW5kbGUgU1BMSVQgYW5kIEVYVEVOREVEIG9wZXJhbmRzLgorCitUdWUgTm92IDE5IDEzOjMzOjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC1kaXMuYzogUm91Z2ggY3V0IGF0IHByaW50aW5nIHNvbWUgb3BlcmFuZHMuCisKKwkqIG1uMTAzMDAtZGlzLmM6IFN0YXJ0IHdvcmtpbmcgb24gZGlzYXNzZW1ibGVyIHN1cHBvcnQuCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggbWFza3Mgb24gc2V2ZXJhbCBpbnNucy4KKworCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEFkZCAiUkVHUyIgZm9yIGEgcmVnaXN0ZXIKKwlsaXN0LgorCShtbjEwMzAwX29wY29kZXMpOiBVc2UgUkVHUyBmb3IgcmVnaXN0ZXIgbGlzdCBpbiAibW92bSIgaW5zdHJ1Y3Rpb25zLgorCitNb24gTm92IDE4IDE1OjIwOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQWRkMyBzZXRzIHRoZSBjYXJyeS4KKworRnJpIE5vdiAxNSAxMzo0MzoxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IERlbWFuZCBwYXJlbnMgYXJvdW5kCisJcmVnaXN0ZXIgYXJndW1lbnQgaXMgY2FsbHMgYW5kIGptcCBpbnN0cnVjdGlvbnMuCisKK1RodSBOb3YgIDcgMDA6MjY6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBVc2UgRE4wMSBmb3IgcHV0eCBhbmQKKwlnZXR4IG9wZXJhbmQuICBGaXggb3Bjb2RlIGZvciBtdWxxdSBpbW0sZG4uCisKK1dlZCBOb3YgIDYgMTM6NDI6MzIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogSGlqYWNrICJiaXRzIiBmaWVsZAorCWluIE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kcyBmb3IgaG93IG1hbnkgYml0cworCWFwcGVhciBpbiB0aGUgYmFzaWMgaW5zbiB3b3JkLiAgQWRkIElNTTMyX0hJR0gyNCwKKwlJTU0zMl9ISUdIMjRfTE9XU0hJRlQ4LCBJTU04RV9TSElGVDguCisJKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBuZXcgb3BlcmFuZHMgYXMgbmVlZGVkLgorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIElNTTMyX0xPV1NISUZUOAorCWZvciBic2V0LCBiY2xyLCBidHN0IGluc3RydWN0aW9ucy4KKwkobW4xMDMwMF9vcGNvZGVzKTogVXNlIG5ldyBJTU0zMl9MT1dTSElGVDggYXMgbmVlZGVkLgorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogUmVtb3ZlIG1hbnkgcmVkdW5kYW50CisJb3BlcmFuZHMuICBVcGRhdGUgb3Bjb2RlIHRhYmxlIGFzIGFwcHJvcHJpYXRlLgorCShJTU0zMik6IEFkZCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgZmxhZy4KKwkobW4xMDMwMF9vcGNvZGVzKTogRml4IHNpbmdsZSBiaXQgZXJyb3IgaW4gbW92IGltbTMyLGRuIGluc24uCisKK1R1ZSBOb3YgIDUgMTM6MjY6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIEROMiwgRE0yLCBBTjIsIEFNMgorCW9wZXJhbmRzIChmb3IgaW5kZXhlZCBsb2FkL3N0b3JlcykuICBGaXggYml0cG9zIGZvciBESQorCW9wZXJhbmQuICBBZGQgU044Tl9TSElGVDgsIElNTThfU0hJRlQ4LCBhbmQgRDE2X1NISUZUIGZvciB0aGUKKwlmZXcgaW5zdHJ1Y3Rpb25zIHRoYXQgaW5zZXJ0IGltbWVkaWF0ZXMvZGlzcGxhY2VtZW50cyBpbiB0aGUKKwltaWRkbGUgb2YgdGhlIGluc3RydWN0aW9uLiAgQWRkIElNTThFIGZvciA4IGJpdCBpbW1lZGlhdGUgaW4KKwl0aGUgZXh0ZW5kZWQgcGFydCBvZiBhbiBpbnN0cnVjdGlvbi4KKwkobW4xMDMwMF9vcGVyYW5kcyk6IFVzZSBuZXcgb3Bjb2RlcyBhcyBhcHByb3ByaWF0ZS4KKworVHVlIE5vdiAgNSAxMDozMDo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogRGVjbGFyZSB0aGUgdHJhcCBpbnN0cnVjdGlvbgorIAlzZXF1ZW50aWFsIHNvIHRoZSBhc3NlbWJsZXIgbmV2ZXIgcGFyYWxsZWxpemVzIGl0IHdpdGgKKwlvdGhlciBpbnN0cnVjdGlvbnMuCisKK01vbiBOb3YgIDQgMTI6NTA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkIEROMDEgYW5kIEFOMDEgZm9yCisJYSBkYXRhL2FkZHJlc3MgcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHJlZ2lzdGVyIGZpZWxkIDAKKwlhbmQgcmVnaXN0ZXIgZmllbGQgMS4KKwkobW4xMDMwMF9vcGNvZGVzKTogVXNlIEROMDEgYW5kIEFOMDEgZm9yIG1vdi9jbXAgaW1tOCxETi9BTgorCitGcmkgTm92ICAxIDEwOjI5OjExIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFVzZSBuZXcgTk9QQUwgbWFzayBmb3IKKwlzdGFuZGFyZCBkaXNhc3NlbWJseS4KKworCSogYWxwaGEtb3BjLmMgKGFscGhhX29wZXJhbmRzKTogUmVhcnJhbmdlIGZsYWdzIHNsb3QuCisJKGFscGhhX29wY29kZXMpOiBBZGQgbmV3IEJXWCwgQ0lYLCBhbmQgTUFYIGluc3RydWN0aW9ucy4KKwlSZWNhdGVnb3JpemUgUEFMY29kZSBpbnN0cnVjdGlvbnMuCisKK1dlZCBPY3QgMzAgMTY6NDY6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgcmVsYXhpbmcgImpiciIuCisKK1R1ZSBPY3QgMjkgMTY6MzA6MjggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogRG9uJ3QgcHJpbnQgYSB0cmFpbGluZyB0YWIgaWYKKwl0aGVyZSBhcmUgbm8gb3BlcmFuZCB0eXBlcy4KKworVHVlIE9jdCAyOSAxMjoyMjoyMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHY4NTAtb3BjLmMgKEQ5X1JFTEFYKTogUmVuYW1lZCBmcm9tIEQ5LCBhbGwgcmVmZXJlbmNlcworCWNoYW5nZWQuCisJKHY4NTBfb3BlcmFuZHMpOiBNYWtlIHN1cmUgRDIyIGltbWVkaWF0ZWx5IGZvbGxvd3MgRDlfUkVMQVguCisKK0ZyaSBPY3QgMjUgMTI6MTI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IFNldCBpbmZvLT5ieXRlc19wZXJfbGluZSB0byA1LgorCitUaHUgT2N0IDI0IDE3OjUzOjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q4XzYpOiBGaXggb3BlcmFuZCBpbnNlcnRpb24gZm9yIHNsZC53CisJYW5kIHNzdC53IGluc3RydWN0aW9ucy4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkICJqQ0MiIGluc3RydWN0aW9ucyAoYWxpYXNlcyBmb3IKKwkiYkNDImluc3RydWN0aW9ucykuCisKK1RodSBPY3QgMjQgMTc6MjE6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogVXNlIGEgdGFiIGJldHdlZW4gdGhlIGluc3RydWN0aW9uCisJYW5kIHRoZSBhcmd1bWVudHMuCisKK1R1ZSBPY3QgMjIgMjM6MzI6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBwcGMtb3BjLmMgKFBQQ1BXUjIpOiBEZWZpbmUuCisJKHBvd2VycGNfb3Bjb2Rlcyk6IFVzZSBQUENQV1IyIGZvciBmc3FydCwgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcKKwlpdC4KKworRnJpIE9jdCAxMSAxNjowMzo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvIGluIG9wY29kZQorCWZpZWxkIGZvciBtb3ZodSBpbnN0cnVjdGlvbi4KKworCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBGb3IgVjg1MF9PUEVSQU5EX1NJR05FRCBvcGVyYW5kcywKKwljYXN0IHZhbHVlIHRvICJsb25nIiBub3QgInNpZ25lZCBsb25nIiB0byBrZWVwIGhwdXgxMAorCWNvbXBpbGVyIHF1aWV0LgorCitUaHUgT2N0IDEwIDEwOjI1OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG8gaW4gb3Bjb2RlIGZpZWxkCisJZm9yIG1vdiAoYWJzMTYpLEROLgorCisJKiBtbjEwMzAwLW9wYy5jIChGTVQqKTogUmVtb3ZlIGRlZmluaXRpb25zLgorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggZGVzdGluYXRpb24gcmVnaXN0ZXIKKwlmb3Igc2hpZnQtYnktcmVnaXN0ZXIgb3Bjb2Rlcy4KKworCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IEJyZWFrIEROLCBETSwgQU4sIEFNCisJaW50byBbQURdW01OXVswMV0gZm9yIGVuY29kaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVnaXN0ZXIKKwlpbiB0aGUgb3Bjb2RlLgorCitXZWQgT2N0ICA5IDExOjE5OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkICJleHRlbmRlZCIgaW5zdHJ1Y3Rpb25zLAorCSJwdXR4IiwgImdldHgiLCAibXVscSIsICJtdWxxdSIsICJzYXQxNiIsICJzYXQyNCIsICJic2NoIi4KKworVHVlIE9jdCAgOCAxMTo1NTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBSZW1vdmUgIlJFR1MiIG9wZXJhbmQuCisJRml4IHZhcmlvdXMgdHlwb3MuICBBZGQgIlBBUkVOIiBvcGVyYW5kLgorCShNRU0sIE1FTTIpOiBEZWZpbmUuCisJKG1uMTAzMDBfb3Bjb2Rlcyk6IFN1cnJvdW5kIGFsbCBtZW1vcnkgYWRkcmVzc2VzIHdpdGggIlBBUkVOIgorCW9wZXJhbmRzLiAgRml4IHNldmVyYWwgdHlwb3MuCisKKwkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCB0eXBvcyBpbiB5ZXN0ZXJkYXkncworCWNoYW5nZXMuCisKK01vbiBPY3QgIDcgMTY6NDg6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLW9wYy5jIChGTVRfWFgpOiBSZW51bWJlciBzdGFydGluZyBhdCBvbmUuCisJKG1uMTAzMDBfb3BlcmFuZHMpOiBSb3VnaCBjdXQuICBFbm91Z2ggdG8gcGFyc2UgIm1vdiIgaW5zdHJ1Y3Rpb25zCisJYXQgdGhpcyB0aW1lLgorCShtbjEwMzAwX29wY29kZXMpOiBCcmVhayBvcGNvZGUgZm9ybWF0IG91dCBpbnRvIGl0cyBvd24gZmllbGQuCisJVXBkYXRlIG1hbnkgb3BlcmFuZCBmaWVsZHMgdG8gZGVhbCB3aXRoIHNpZ25lZCB2cyB1bnNpZ25lZAorCWlzc3Vlcy4gIEZpeCBvbmUgb3IgdHdvIHR5cG9zIGluIHRoZSAibW92IiBpbnN0cnVjdGlvbgorCW9wY29kZSwgbWFzayBhbmQvb3Igb3BlcmFuZCBmaWVsZHMuCisKK01vbiBPY3QgIDcgMTE6Mzk6NDkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+CisKKwkqIG02OGstb3BjLmMgKHBsdXNoYSk6IFByZWZlciBlbmNvZGluZyBmb3IgbTY4MDQwdXAsIGluIGNhc2UKKwltNjg4NTEgd2Fzbid0IHJlc2V0LgorCitUaHUgT2N0ICAzIDE3OjE3OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogQWRkIG9wY29kZSAmIG1hc2tzIGZvcgorCWFsbCBvcGNvZGVzLiAgVmVyeSByb3VnaCBjdXQgYXQgb3BlcmFuZHMgZm9yIGFsbCBvcGNvZGVzLgorCisJKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBTdGFydCBmbGVzaGluZyBvdXQgdGhlCisJb3Bjb2RlIHRhYmxlLgorCitUaHUgT2N0ICAzIDEwOjA2OjA3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDIwMC1vcGMuYywgbW4xMDMwMC1vcGMuYzogTmV3IGZpbGVzLgorCSogbW4xMDIwMC1kaXMuYywgbW4xMDMwMC1kaXMuYzogTmV3IGZpbGVzLgorCSogbW4xMHgwMC1vcGMuYywgbW4xMHgwMC1kaXMuYzogRGVsZXRlZC4KKwkqIGRpc2Fzc2VtYmxlLmM6IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIDEwMjAwIGFuZCAxMDMwMAorCXN1cHBvcnQuCisJKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCitUaHUgT2N0ICAzIDE1OjU5OjEyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChNT1NUTFlDTEVBTik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCisKK1dlZCBPY3QgIDIgMjM6Mjg6NDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEweDAwLW9wYy5jLCBtbjEweDAwLWRpcy5jOiBOZXcgZmlsZXMgZm9yIE1hdHN1c2hpdGEKKwlNTjEweDAwIHByb2Nlc3NvcnMuCisJKiBkaXNhc3NlbWJsZSAoQVJDSF9tbjEweDAwKTogRGVmaW5lLgorCShkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX2FyY2hfbW4xMHgwMC4KKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGJmZF9tbjEweDAwX2FyY2guCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK1R1ZSBPY3QgIDEgMTA6NDk6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jIChvcF9ydG4pOiBDaGFuZ2UgdG8gYmUgYSBwb2ludGVyLiAgQWRqdXN0IHVzZXMKKwlhY2NvcmRpbmdseS4gIERvbid0IGRlY2xhcmUgZnVuY3Rpb25zIHVzaW5nIG9wX3J0bi4KKworRnJpIFNlcCAyNyAxODoyODo1OSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6ICBBZGQgbWVtYWRkciBhcmd1bWVudC4gIFJlLWFycmFuZ2UKKwlwYXJhbXMgdG8gYmUgbW9yZSBzdGFuZGFyZC4KKwkqIChkaXNhc3NlbWJsZSk6ICBQcmludCBhYnNvbHV0ZSBhZGRyZXNzZXMgYW5kIHN5bWJvbGljIG5hbWVzIGZvcgorCWJyYW5jaCBhbmQganVtcCB0YXJnZXRzLgorCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kKTogIEFkZCBkaXNwbGFjZW1lbnQgZmxhZyB0byA5IGFuZCAyMgorCWJpdCBvcGVyYW5kcy4KKwkqICh2ODUwX29wY29kZXMpOiAgQWRkIGJyZWFrcG9pbnQgaW5zbi4KKworTW9uIFNlcCAyMyAxMjozMjoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGstb3BjLmM6IE1vdmUgdGhlIGZtb3ZlbXggZGF0YSByZWdpc3RlciBjYXNlcyBiZWZvcmUgdGhlCisgCW90aGVyIGNhc2VzLCBzbyB0aGF0IHRoZXkgZ2V0IHJlY29nbml6ZWQgYmVmb3JlIHRoZSBkYXRhIHJlZ2lzdGVyCisgCWRvZXMgZ2V0cyB0cmVhdGVkIGFzIGEgZGVnZW5lcmF0ZSByZWdpc3RlciBsaXN0LgorCitUdWUgU2VwIDE3IDEyOjA2OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYzogQWRkIGEgY2FzZSBmb3IgImRpdiIgYW5kICJkaXZ1IiB3aXRoIHR3byByZWdpc3RlcnMKKwlhbmQgYSBkZXN0aW5hdGlvbiBvZiAkMC4KKworVHVlIFNlcCAxMCAxNjoxMjozOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+CisKKwkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogQWRkIHByb3RvdHlwZS4KKwkoX3ByaW50X2luc25fbWlwcyk6IERpdHRvLgorCitNb24gU2VwICA5IDE0OjI2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjb25kaXRpb24gY29kZSByZWdpc3RlcnMgYXMKKyAJJGZjY04uCisKK1R1ZSBTZXAgIDMgMTI6MDk6NDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBBZGQgc2V0dXcsIHNldHN3LCBzZXR4LgorCitUdWUgU2VwICAzIDEyOjA1OjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBNYWtlIHN0YXRpYy4gIFByb3ZpZGUgcHJvdG90eXBlLgorCitTdW4gU2VwICAxIDIyOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q5LCBpbnNlcnRfZDIyKTogRml4IGJvdW5kYXJ5IGNhc2UKKwlpbiByYW5nZSBjaGVja3MuCisKK1NhdCBBdWcgMzEgMDE6Mjc6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEhhbmRsZSBpbnNlcnRpb24gb2YgJywnLCAnWycgYW5kCisJJ10nIGNoYXJhY3RlcnMgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2RlczogUmVtb3ZlIHNpemUgZmllbGQgZnJvbSBhbGwgb3Bjb2Rlcy4KKwlBZGQgIm1lbW9wIiBmaWVsZCB0byBhbGwgb3Bjb2RlcyAoZm9yIHRoZSBkaXNhc3NlbWJsZXIpLgorCVJlb3JkZXIgb3Bjb2RlcyBzbyB0aGF0ICJub3AiIGNvbWVzIGJlZm9yZSAibW92IiBhbmQgImpyIgorCWNvbWVzIGJlZm9yZSAiamFybCIuCisKKwkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgorCisJKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBQcm9wZXJseSBoYW5kbGUgZGlzYXNzZW1ibGluZworCWEgdHdvIGJ5dGUgaW5zbiBhdCB0aGUgZW5kIG9mIGEgbWVtb3J5IHJlZ2lvbiB3aGVuIHRoZSBtZW1vcnkKKwlyZWdpb24ncyBzaXplIGlzIG9ubHkgdHdvIGJ5dGUgYWxpZ25lZC4KKworCSogdjg1MC1kaXMuYyAodjg1MF9jY19uYW1lcyk6IEZpeCBzdHVwaWQgdGhpbmtvcy4KKworCSogdjg1MC1kaXMuYyAodjg1MF9yZWdfbmFtZXMpOiBEZWZpbmUuCisJKHY4NTBfc3JlZ19uYW1lcywgdjg1MF9jY19uYW1lcyk6IExpa2V3aXNlLgorCShkaXNhc3NlbWJsZSk6IFZlcnkgcm91Z2ggY3V0IGF0IHByaW50aW5nIG9wZXJhbmRzICh1bmZvcm1hdHRlZCkuCisKKwkqIHY4NTAtb3BjLmMgKEJPUF9NQVNLKTogRml4LgorCSh2ODUwX29wY29kZXMpOiBGaXggbWFzayBmb3IgamFybCBhbmQganIuCisKKwkqIHY4NTAtZGlzLmM6IE5ldyBmaWxlLiAgU2tlbGV0b24gZm9yIGRpc2Fzc2VtYmxlciBzdXBwb3J0LgorCSogTWFrZWZpbGUuaW4gUmVtb3ZlIHY4NTAgcmVmZXJlbmNlcywgdGhleSdyZSBub3QgbmVlZGVkIGhlcmUuCisJKiBjb25maWd1cmUuaW46IEFkZCB2ODUwLWRpcy5vIHdoZW4gYnVpbGRpbmcgdjg1MCB0b29sY2hhaW5zLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogQ2FsbCB2ODUwIGRpc2Fzc2VtYmxlci4KKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q4XzcsIGV4dHJhY3RfZDhfNyk6IE5ldyBmdW5jdGlvbnMuCisJKGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYpOiBOZXcgZnVuY3Rpb25zLgorCSh2ODUwX29wZXJhbmRzKTogUmVuYW1lIEQ3UyB0byBENzsgb3BlcmFuZCBmb3IgRDcgaXMgdW5zaWduZWQuCisJUmVuYW1lIEQ4IHRvIEQ4XzcsIHVzZSB7aW5zZXJ0LGV4dHJhY3R9X2Q4Xzcgcm91dGluZXMuCisJQWRkIEQ4XzYuCisJKElGNEEsIElGNEIpOiBVc2UgIkQ3IiBpbnN0ZWFkIG9mICJEN1MiLgorCShJRjRDLCBJRjREKTogVXNlICJEOF83IiBpbnN0ZWFkIG9mICJEOCIuCisJKElGNEUsIElGNEYpOiBOZXcuICBVc2UgIkQ4XzYiLgorCSh2ODUwX29wY29kZXMpOiBVc2UgSUY0QS9JRjRCIGZvciBzbGQuYi9zc3QuYi4gIFVzZSBJRjRDL0lGNEQgZm9yCisJc2xkLmgvc3N0LmguICBVc2UgSUY0RS9JRjRGIGZvciBzbGQudy9zc3Qudy4KKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUpOiBOZXcgZnVuY3Rpb25zLgorCSh2ODUwX29wZXJhbmRzKTogQ2hhbmdlIEQxNiB0byBEMTZfMTUsIHVzZSBzcGVjaWFsIGluc2VydC9leHRyYWN0CisJcm91dGluZXMuICBOZXcgbmV3IEQxNiB0aGF0IHVzZXMgdGhlIGdlbmVyaWMgaW5zZXJ0L2V4dHJhY3QgY29kZS4KKwkoSUY3QSwgSUY3Qik6IFVzZSBEMTZfMTUuCisJKElGN0MsIElGN0QpOiBOZXcuICBVc2UgRDE2LgorCSh2ODUwX29wY29kZXMpOiBVc2UgSUY3QyBhbmQgSUY3RCBmb3IgbGQuYiBhbmQgc3QuYi4KKworCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2Q5LCBpbnNlcnRfZDIyKTogU2xpZ2h0bHkgaW1wcm92ZSBlcnJvcgorCW1lc3NhZ2UuICBJc3N1ZSBhbiBlcnJvciBpZiB0aGUgYnJhbmNoIG9mZnNldCBpcyBvZGQuCisKKwkqIHY4NTAtb3BjLmM6IEFkZCBub3RlcyBhYm91dCBuZWVkaW5nIHNwZWNpYWwgaW5zZXJ0L2V4dHJhY3QKKwlmb3IgYWxsIHRoZSBsb2FkL3N0b3JlIGluc25zLCBleGNlcHQgImxkLmIiIGFuZCAic3QuYiIuCisKKwkqIHY4NTAtb3BjLmMgKGluc2VydF9kMjIsIGV4dHJhY3RfZDIyKTogTmV3IGZ1bmN0aW9ucy4KKwkodjg1MF9vcGVyYW5kcyk6IFVzZSBpbnNlcnRfZDIyIGFuZCBleHRyYWN0X2QyMiBmb3IKKwlEMjIgb3BlcmFuZHMuCisJKGluc2VydF9kOSk6IEZpeCByYW5nZSBjaGVjay4KKworRnJpIEF1ZyAzMCAxODowMTowMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCBWODUwX09QRVJBTkRfU0lHTkVEIGZsYWcKKwlhbmQgc2V0IGJpdHMgZmllbGQgdG8gRDkgYW5kIEQyMiBvcGVyYW5kcy4KKworVGh1IEF1ZyAyOSAxMToxMDo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEZWZpbmUgU1IyIG9wZXJhbmQuCisJKHY4NTBfb3Bjb2Rlcyk6ICJsZHNyIiB1c2VzIFIxLFNSMi4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9wY29kZSBzcGVjcyBmb3IKKwlzbGQudywgc3N0LmIsIHNzdC5oLCBzc3QudywgYW5kIG5vcC4KKworV2VkIEF1ZyAyOCAxNTo1NTo0MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCBudWxsIG9wY29kZSB0byBtYXJrIHRoZQorCWVuZCBvZiB0aGUgb3Bjb2RlIHRhYmxlLgorCitNb24gQXVnIDI2IDEzOjM1OjUzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGRlZCByZWdpc3RlciBwYWlycywKKwkicjAtcjEiLCAicjItcjMiLCBldGMuCisKK0ZyaSBBdWcgMjMgMDA6Mjc6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogTWFrZSBJMTYgYmUgYSBzaWduZWQgb3BlcmFuZC4KKwlDcmVhdGUgSTE2VSBmb3IgYW4gdW5zaWduZWQgMTZiaXQgbW1lZGlhdGUgb3BlcmFuZC4KKwkodjg1MF9vcGNvZGVzKTogVXNlIEkxNlUgZm9yICJvcmkiLCAiYW5kaSIgYW5kICJ4b3JpIi4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IERlZmluZSBFUCBvcGVyYW5kLgorCShJRjRBLCBJRjRCLCBJRjRDLCBJRjREKTogVXNlIEVQLgorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3Bjb2RlIG51bWJlcnMgZm9yICJtb3YiCisJd2l0aCBpbW1lZGlhdGUgb3BlcmFuZCwgIm1vdmhpIi4gIFR3ZWFrICJsZHNyIi4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogR2V0IGxkLltiaHddIGFuZCBzdC5bYmh3XQorCWNvcnJlY3QuICBHZXQgc2xkLltiaHddIGFuZCBzc3QuW2Jod10gY2xvc2VyLgorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogIm5vdCIgaXMgYSB0d28gYnl0ZSBpbnNuCisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IENvcnJlY3QgYml0IHBhdHRlcm4gZm9yIHNldGYuCisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBEMTYgaW5zZXJ0cyBhdCBvZmZzZXQgMTYhCisKKwkqIHY4NTAtb3BjLmMgKHR3byk6IEdldCBvcmRlciBvZiB3b3JkcyBjb3JyZWN0LgorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogSTE2IGluc2VydHMgYXQgb2Zmc2V0IDE2IQorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkICJTUjEiIGFuZCAiU1IyIiBmb3Igc3lzdGVtCisJcmVnaXN0ZXIgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvcGVyYW5kcy4KKwkodjg1MF9vcGNvZGVzKTogVXNlIFNSMSBhbmQgU1IyIGZvciAibGRzciIgYW5kICJzdHNyIi4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IHRoaW5rbyBpbiAiam1wIiBvcGNvZGUuICBGaXgKKwlzYW1lIHRoaW5rbyBpbiAidHJhcCIgb3Bjb2RlLgorCisJKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgaW5pdGlhbGl6ZXIgZm9yIHNpemUgZmllbGQKKwlvbiBhbGwgb3Bjb2Rlcy4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEQ2IC0+IERTNy4gIFJlZmVyZW5jZXMgY2hhbmdlZC4KKwlBZGQgRDggZm9yIDgtYml0IHVuc2lnbmVkIGZpZWxkIGluIHNob3J0IGxvYWQvc3RvcmUgaW5zbnMuCisJKElGNEEsIElGNEQpOiBUaGVzZSBib3RoIG5lZWQgdHdvIHJlZ2lzdGVycy4KKwkoSUY0QywgSUY0RCk6IERlZmluZS4gIFVzZSA4LWJpdCB1bnNpZ25lZCBmaWVsZC4KKwkodjg1MF9vcGNvZGVzKTogRm9yICJzbGQuaCIsICJzbGQudyIsICJzc3QuaCIsICJzc3QudyIsIHVzZQorCUlGNEMgJiBJRjRELiAgRm9yICJ0cmFwIiB1c2UgSTVVLCBub3QgSTUuICBBZGQgSUYxIG9wZXJhbmQKKwlmb3IgImxkc3IiIGFuZCAic3RzciIuCisJKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogMy1iaXQgaW1tZWRpYXRlIGZvciBiaXQgaW5zbnMKKwlpcyB1bnNpZ25lZC4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQ29ycmVjdCBzaG9ydCBzdG9yZSBoYWxmIChzc3QuaCkgYW5kCisJc2hvcnQgc3RvcmUgd29yZCAoc3N0LncpLgorCitUaHUgQXVnIDIyIDE2OjU3OjI3IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZGVkIGluc2VydCBhbmQgZXh0cmFjdCBmaWVsZHMsCisgCXBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB1bnVzdWFsIG9wZXJhbmQgZW5jb2RpbmdzLgorCitUaHUgQXVnIDIyIDAxOjA1OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRW5hYmxlICJ0cmFwIi4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRml4IG9yZGVyIG9mIGRpc3BsYWNlbWVudAorCWFuZCByZWdpc3RlciBmb3IgInNldDEiLCAiY2xyMSIsICJub3QxIiwgYW5kICJ0c3QxIi4KKworV2VkIEF1ZyAyMSAxODo0NjoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgIkIzIiBzdXBwb3J0LgorCSh2ODUwX29wY29kZXMpOiBGaXggYW5kIGVuYWJsZSAic2V0MSIsICJjbHIxIiwgIm5vdDEiCisJYW5kICJ0c3QxIi4KKworCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogImptcCIgaGFzIG9ubHkgYW4gUjEgb3BlcmFuZC4KKworCSogdjg1MC1vcGMuYzogQ2xvc2UgdW50ZXJtaW5hdGVkIGNvbW1lbnQuCisKK1dlZCBBdWcgMjEgMTc6MzE6MjYgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+CisKKwkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgZmxhZ3MgZmllbGQuCisgCSh2ODUwX29wY29kZXMpOiBhZGQgbW92ZSBvcGNvZGVzLgorCitUdWUgQXVnIDIwIDE0OjQxOjAzIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHY4NTAtb3BjLm8uCisJKiBjb25maWd1cmU6IChiZmRfdjg1MHZfYXJjaCkgQWRkIG5ldyBjYXNlLgorCSogY29uZmlndXJlLmluOiAoYmZkX3Y4NTBfYXJjaCkgQWRkIG5ldyBjYXNlLgorCSogdjg1MC1vcGMuYzogTmV3IGZpbGUuCisKK01vbiBBdWcgMTkgMTU6MjE6MzggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgbGl0dGxlIGVuZGlhbiBzcGFyY3MuCisKK1RodSBBdWcgMTUgMTM6MTQ6NDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYtb3BjLmM6IEFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBvcGNvZGUKKwl0YWJsZSB0byBoZWxwIGRldGVybWluaW5lIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgZG9uZQorCWluIHBhcmFsbGVsLgorCitUaHUgQXVnIDE1IDEzOjExOjEzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgZWRpdGluZyBvZiBpbmNsdWRlIHBhdGhuYW1lcyB0byBiZQorCW1vcmUgZ2VuZXJhbC4KKworVGh1IEF1ZyAxNSAxNjoyODo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGFybS1vcGMuaDogQWRkZWQgImJ4IiBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLgorCitXZWQgQXVnIDE0IDE3OjAwOjA0IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgorCisJKiBhbHBoYS1vcGMuYyAoRVY0RVhUSFdJTkRFWCk6IEZpZWxkIHdpZHRoIHNob3VsZCBiZSA4IG5vdCA1LgorCitNb24gQXVnIDEyIDE0OjMwOjM3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBNaW5vciBmaXhlcyB0byBhZGRpIGFuZCBibC5sLgorCitGcmkgQXVnICA5IDEzOjIxOjU5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBDb3JyZWN0ICdtdicgdW5pdCBlbnRyeSB0byBFSVRIRVIuCisKK1RodSBBdWcgIDggMTI6NDM6NTIgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+CisKKwkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBhbHBoYS1vcGMgY2hhbmdlcy4KKworV2VkIEF1ZyAgNyAxMTo1NToxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IEFjdHVhbGx5IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZS4KKyAJKE9ORSwgT1BfT05FKTogI2lmZGVmIG91dDsgbm90IHVzZWQuCisKK0ZyaSBBdWcgIDIgMTc6NDc6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IEFkZGVkIDIgYWNjdW11bGF0b3Igc3ViIGluc3RydWN0aW9ucy4KKwlDaGFuZ2VkIHN1Ymkgb3BlcmFuZCB0eXBlIHRvIHRyZWF0IDAgYXMgMTYuCisKK1dlZCBKdWwgMzEgMTY6MjE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jOiBBZGQgY3B1c2hsIGZvciB0aGUgbWNmNTIwMC4gIEZyb20gS2VuIFJvc2UKKwk8cm9zZUBuZXRjb20uY29tPi4KKworV2VkIEp1bCAzMSAxNDozOToyNyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGFybS1vcGMuaDogKGFybV9vcGNvZGVzKTogQWRkZWQgaGFsZndvcmQgYW5kIHNpZ24tZXh0ZW5zaW9uCisgCW1lbW9yeSB0cmFuc2ZlciBpbnN0cnVjdGlvbnMuIEFkZCBuZXcgZm9ybWF0IHN0cmluZyBlbnRyaWVzICVoIGFuZCAlcy4KKwkqIGFybS1kaXMuYzogKHByaW50X2luc25fYXJtKTogUHJvdmlkZSBkZWNvZGluZyBvZiB0aGUgbmV3CisJZm9ybWF0cyAlaCBhbmQgJXMuCisKK0ZyaSBKdWwgMjYgMTE6NDU6MDQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYtb3BjLmMgKGQxMHZfb3BlcmFuZHMpOiBBZGRlZCBVTlVNNFM7IGEgNC1iaXQgYWNjdW11bGF0b3Igc2hpZnQuCisgCShkMTB2X29wY29kZXMpOiBNb2RpZmllZCBhY2N1bXVsYXRvciBzaGlmdCBpbnN0cnVjdGlvbnMgdG8gdXNlIFVOVU00Uy4KKworRnJpIEp1bCAyNiAxNDowMTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhX29zZik6IFJlbW92ZS4KKwkocHJpbnRfaW5zbl9hbHBoYV92bXMpOiBSZW1vdmUuCisJKHByaW50X2luc25fYWxwaGEpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaG9zZSB0aGUgcmVnaXN0ZXIKKwluYW1lcyBiYXNlZCBvbiBpbmZvLT5mbGF2b3VyLgorCSogZGlzYXNzZW1ibGUuYzogQWx3YXlzIHJldHVybiBwcmludF9pbnNuX2FscGhhIGZvciB0aGUgYWxwaGEuCisKK1RodSBKdWwgMjUgMTU6MjQ6MTcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHYtZGlzLmMgKGRpc19sb25nKTogSGFuZGxlIHVua25vd24gb3Bjb2Rlcy4KKworVGh1IEp1bCAyNSAxMjowODowOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi1vcGMuYzogQ2hhbmdlcyB0byBzdXBwb3J0IHNpZ25lZCBhbmQgdW5zaWduZWQgbnVtYmVycy4KKwlBbGwgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0IGhhdmUgbG9uZyBhbmQgc2hvcnQgZm9ybXMKKwlub3cgZW5kIGluICIubCIgb3IgIi5zIi4gIERpdnMgYWRkZWQuCisJKiBkMTB2LWRpcy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgc2lnbmVkIGFuZCB1bnNpZ25lZCBudW1iZXJzLgorCitUdWUgSnVsIDIzIDExOjAyOjUzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LWRpcy5jOiBDaGFuZ2UgYWxsIGZ1bmN0aW9ucyB0byB1c2UgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jLgorCitNb24gSnVsIDIyIDE1OjM4OjUzIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBNYWtlIG9wY29kZSBtYXNrcyBmb3IgdGhlIENvbGRGaXJlCisgCW1vdmUgY2NyL3NyIGluc25zIG1vcmUgc3RyaWN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBvbmx5CisgCXNlbGVjdHMgdGhlbSB3aGVuIHRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgZGF0YSByZWdpc3Rlci4KKworTW9uIEp1bCAyMiAxMToyNToyNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKyAgICAgICAgKiBkMTB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiAgRGVjbGFyZS4KKyAgICAgICAgKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogTm93IHVzZXMgcHJlX2RlZmluZWRfcmVnaXN0ZXJzCisgICAgICAgIHRvIHBpY2sgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIHJlZ2lzdGVycy4KKworTW9uIEp1bCAyMiAxMzo0NzoyMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNwYXJjLW9wYy5jOiBGaXggb3Bjb2RlIHZhbHVlcyBmb3IgZnBhY2sxNiwgYW5kIGZwYWNrZml4LiAgRml4CisJb3BlcmFuZHMgZm9yIGZleHBhbmQgYW5kIGZwbWVyZ2UuICBGcm9tIENocmlzdGlhbiBLdWVobmtlCisJPENocmlzdGlhbi5LdWVobmtlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlPi4KKworTW9uIEp1bCAyMiAxMzoxNzowNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KKworCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBObyBsb25nZXIgdGhlIHVzZXItdmlzaWJsZQorCXByaW50IHJvdXRpbmUuICBUYWtlIG5ldyByZWduYW1lcyBhbmQgY3B1bWFzayBhcmd1bWVudHMuCisJS2lsbCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm9uc2Vuc2UuCisJKHByaW50X2luc25fYWxwaGFfb3NmKTogTmV3IGZ1bmN0aW9uLiAgRG8gT1NGLzEgc3R5bGUgcmVnbmFtZXMuCisJKHByaW50X2luc25fYWxwaGFfdm1zKTogTmV3IGZ1bmN0aW9uLiAgRG8gVk1TIHN0eWxlIHJlZ25hbWVzLgorCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogVGVzdCBiZmQgZmxhdm91ciB0byBwaWNrCisJYmV0d2VlbiBPU0YgYW5kIFZNUyByb3V0aW5lcy4gIERlZmF1bHQgdG8gT1NGLgorCitUaHUgSnVsIDE4IDE3OjE5OjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1NVQlNUIChJTlNUQUxMX1NITElCKS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogVXNlIEBJTlNUQUxMX1NITElCQC4KKworV2VkIEp1bCAxNyAxNDozOTowNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiAoYmZkX2QxMHZfYXJjaCkgQWRkIG5ldyBjYXNlLgorCSogY29uZmlndXJlLmluOiAoYmZkX2QxMHZfYXJjaCkgQWRkIG5ldyBjYXNlLgorCSogZDEwdi1kaXMuYzogTmV3IGZpbGUuCisJKiBkMTB2LW9wYy5jOiBOZXcgZmlsZS4KKwkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcikgQWRkIGVudHJ5IGZvciBkMTB2LgorCitXZWQgSnVsIDE3IDEwOjEyOjA1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRml4IGJ1Z3MgaW4gY29sZGZpcmUgaW5zbnMgcmVsYXRpbmcKKyAJdG8gYmNjLCB0cmFwZmwsIHN1YnhsLCBhbmQgd2RkYXRhIGRpc2NvdmVyZWQgYnkgQW5kcmVhcyBTY2h3YWIuCisKK01vbiBKdWwgMTUgMTY6NTk6NTUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogaTM4Ni1kaXMuYzogIEdldCByaWQgb2YgcHJpbnRfaW5zbl9pODA4Ni4gIFVzZSBpbmZvLm1hY2ggdG8KKwlkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlhbnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQuCisJKiBzcGFyYy1kaXMuYzogIEdldCByaWQgb2YgcHJpbnRfaW5zbl9zcGFyY2xpdGUuICBVc2UgaW5mby5tYWNoIHRvCisJZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YXJpYW50cyBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0LgorCitGcmkgSnVsIDEyIDEwOjEyOjAxIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTgwODYpOiAgTmV3IHJvdXRpbmUgdG8gZGlzYXNzZW1ibGUgdXNpbmcKKwl0aGUgODA4NiBpbnN0cnVjdGlvbiBzZXQuCisJKiBpMzg2LWRpcy5jOiAgR2VuZXJhbCBjbGVhbnVwcy4gIE1ha2UgbW9zdCB0aGluZ3Mgc3RhdGljLiAgQWRkCisJcHJvdG90eXBlcy4gIEdldCByaWQgb2Ygc3RhdGljIHZhcmlhYmxlcyBhZmxhZ3MgYW5kIGRmbGFncy4gIFBhc3MKKwl0aGVtIGFzIGFyZ3MgKHRvIGFsbW9zdCBldmVyeXRoaW5nKS4KKworVGh1IEp1bCAxMSAxMTo1ODo0NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBIYW5kbGUgbWFjcmVncyBpbiBsZG1hYyBpbnNucy4KKworCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEhhbmRsZSAibGRtLmwiIGFuZCAic3RtLmwiLgorCisJKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogImFicyIgaXMgaW1wbGljaXRseSB0d28KKwlpZiB0aGUgbmV4dCBhcmcgaXMgbWFya2VkIHdpdGggU1JDX0lOX0RTVC4gIEdyb3NzLgorCisJKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUHJpbnQgImV4ciIgd2hlbgorCXdlJ3JlIGxvb2tpbmcgZm9yIGFuZCBmaW5kIEVYUi4KKworCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFdlIGRvbid0IGhhdmUgYSBtYXRjaAorCWlmIHdlJ3JlIGxvb2tpbmcgZm9yIEtCSVQgYW5kIHdlIGRvbid0IGZpbmQgaXQuCisKKwkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBNYXNrIG9mZiB1bndhbnRlZCBiaXRzCisJZm9yIExfMyBhbmQgTF8yLgorCisJKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogRG9uJ3Qgc2V0IHBsZW4gZm9yCisJM2JpdCBpbW1lZGlhdGUgb3BlcmFuZHMuCisKK1R1ZSBKdWwgIDkgMTA6NTU6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCisKKwkqIGFscGhhLW9wYy5jOiBBZGQgbmV3IGNhc2Ugb2YgIm1vdiIuICBGcm9tIEtsYXVzIEthZW1wZgorCTxra2FlbXBmQHByb2dpcy5hYy1uZXQuZGU+LgorCitUaHUgSnVsICA0IDExOjQyOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWxwaGEtb3BjLmM6IENvcnJlY3Qgc2Vjb25kIGNhc2Ugb2YgIm1vdiIgdG8gdXNlIE9QUkwuCisKK1dlZCBKdWwgIDMgMTY6MDM6NDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmNsaXRlKTogIE5ldyByb3V0aW5lIHRvIHByaW50CisJc3BhcmNsaXRlIGluc3RydWN0aW9ucy4KKworV2VkIEp1bCAgMyAxNDoyMToxOCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZCBjb2xkZmlyZSBzdXBwb3J0LgorCitGcmkgSnVuIDI4IDE1OjUzOjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLW9wYy5jIChhc2lfdGFibGUpOiBBZGQgI0FTSV9OLCAjQVNJX05fTCwgI0FTSV9OVUNMRVVTLAorCSNBU0lfTlVDTEVVU19MSVRUTEUuICBSZW5hbWUgI0FTSV9BU19JRl9VU0VSX3tQUklNQVJZLFNFQ09OREFSWX1fTAorCXRvICNBU0lfQVNfSUZfVVNFUl97UFJJTUFSWSxTRUNPTkRBUll9X0xJVFRMRS4KKworVHVlIEp1biAyNSAyMjo1ODozMSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpcik6CisJVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisJKGRvY2Rpciwgb2xkaW5jbHVkZWRpcik6IFJlbW92ZWQuCisJKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCisKK0ZyaSBKdW4gMjEgMTM6NTM6MzYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+CisKKwkqIGFscGhhLW9wYy5jOiBOZXcgZmlsZS4KKwkqIGFscGhhLW9wYy5oOiBSZW1vdmUuCisJKiBhbHBoYS1kaXMuYzogQ29tcGxldGUgcmV3cml0ZSB0byB1c2UgbmV3IG9wY29kZSB0YWJsZS4KKwkqIGNvbmZpZ3VyZS5pbjogRm9yIGJmZF9hbHBoYV9hcmNoLCB1c2UgYWxwaGEtb3BjLm8uCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgorCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBhbHBoYS1vcGMuby4KKwkoYWxwaGEtZGlzLm8pOiBEZXBlbmQgdXBvbiAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgsIG5vdAorCWFscGhhLW9wYy5oLgorCShhbHBoYS1vcGMubyk6IE5ldyB0YXJnZXQuCisKK1dlZCBKdW4gMTkgMTU6NTU6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgaS4KKwlTZXQgaW1tX2FkZGVkX3RvX3JzMSBldmVuIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisJYXJlIG5vdCB0aGUgc2FtZS4KKworCSogc3BhcmMtb3BjLmM6IEFkZCBzb21lIHR3byBvcGVyYW5kIGZvcm1zIG9mIHRoZSB3ciBpbnN0cnVjdGlvbi4KKworVHVlIEp1biAxOCAxNTo1ODoyNyAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFJlbmFtZSAiaG1vZGUiIGFyZ3VtZW50CisJdG8ganVzdCAibW9kZSIuCisKKwkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBIOC9TLgorCSogaDgzMDAtZGlzLmMgKHByaW50X2luc25faDgzMDBzKTogTmV3IGZ1bmN0aW9uIGZvciBIOC9TLgorCitUdWUgSnVuIDE4IDE4OjA2OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmM6IEFkZCBiZXEvdGVxIGFzIGFsaWFzZXMgZm9yIGJlL3RlLgorCisJKiBwcGMtb3BjLmM6IEZpeCBmY21wbyBvcGNvZGUuICBGcm9tIFNlcmdlaSBTdGVzaGVua28KKwk8c2VyZ2VpQG1zaWwuc3BzLm1vdC5jb20+LgorCitUdWUgSnVuIDE4IDE1OjA4OjU0IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgorCisJKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgorCisJKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFByaW50IGxkYSByYSxsaXQocnopIGFzIG1vdi4KKworTW9uIEp1biAxMCAxODo1MDozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBBbHdheXMgcHJpbnQgQUJTOE1FTSB3aXRoIDo4LAorCXJlZ2FyZGxlc3Mgb2YgcGxlbi4KKworVHVlIEp1biAgNCAwOToxNTo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jIChPUF9PRkYpOiBDYWxsIGFwcGVuZF9wcmVmaXguCisKK1RodSBNYXkgMjMgMTU6MTg6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwcGMtb3BjLmMgKGluc3RydWN0aW9uIGVuY29kaW5nIG1hY3Jvcyk6IEFkZCBleHBsaWNpdCBjYXN0cyB0bworCXVuc2lnbmVkIGxvbmcgdG8gc2lsZW5jZSBhIHdhcm5pbmcgZnJvbSB0aGUgU29sYXJpcyBQb3dlclBDCisJY29tcGlsZXIuCisKK1RodSBBcHIgMjUgMTk6MzM6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBBZGQgdWx0cmFzcGFyYyB2aXMgZXh0ZW5zaW9ucy4KKworTW9uIEFwciAyMiAxNzoxMjozNSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLWRpcy5jIChYX0lNTSxYX1NJTU0pOiBOZXcgbWFjcm9zLgorCShYX0lNTTEzKTogRGVsZXRlLgorCShwcmludF9pbnNuX3NwYXJjKTogTWVyZ2UgY2FzZXMgaSxJLGogdG9nZXRoZXIuICBOZXcgY2FzZXMgWCxZLgorCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBVc2UgWCBmb3IgNSBiaXQgc2hpZnQgY29uc3RhbnRzLAorCVkgZm9yIDYgYml0IHNoaWZ0IGNvbnN0YW50cy4gIFJld3JpdGUgZW50cmllcyBmb3IgY3JkY3h0LCBjd3JjeHQsCisJY3B1c2gsIGNwdXNoYSwgY3B1bGwgc3BhcmNsZXQgaW5zbnMuCisKK1dlZCBBcHIgMTcgMTQ6MjA6MjIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKGNvbXB1dGVfYXJjaF9tYXNrKTogUmVwbGFjZSBBTlNJIHN0eWxlIGRlZiB3aXRoIEsmUi4KKworVGh1IEFwciAxMSAxNzozMDowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNwYXJjLW9wYy5jOiBTZXQgRl9GQlIgb24gZmxvYXRpbmcgcG9pbnQgYnJhbmNoIGluc3RydWN0aW9ucy4KKwlTZXQgRl9GTE9BVCBvbiBvdGhlciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuCisKK01vbiBBcHIgIDggMTc6MDI6NDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwcGMtb3BjLmMgKFBQQzg2MCk6IE1hY3JvIGZvciA4NjAvODIxIHNwZWNpZmljIGluc3RydWN0aW9ucyBhbmQKKwlyZWdpc3RlcnMuCisgCShwb3dlcnBjX29wY29kZXMpOiBBZGQgODYwLzgyMSBzcGVjaWZpYyBTUFJzLgorCitNb24gQXByICA4IDE0OjAwOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCisJZGlyZWN0b3JpZXMuICBTZXQgYW5kIHN1YnN0aXR1dGUgQkZEX1BJQ0xJU1QuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoQkZEX1BJQ0xJU1QpOiBSZW5hbWUgZnJvbSBCRkRfTElTVC4gIENoYW5nZSBhbGwKKwl1c2VzLiAgU2V0IHRvIEBCRkRfUElDTElTVEAuCisKK0ZyaSBBcHIgIDUgMTc6MTI6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogVXNlICJiaXQiIGZvciBMXzMgaW1tZWRpYXRlcywKKwlub3QgImFicyIsIHdoaWNoIG1heSBiZSBuZWVkZWQgZm9yIHRoZSBhYnNvbHV0ZSBpbiBzb21ldGhpbmcKKwlsaWtlIGJ0c3QgIzAsQDEwOjguICBQcmludCBMXzMgaW1tZWRpYXRlcyBzZXBhcmF0ZWx5IGZyb20gb3RoZXIKKwlpbW1lZGlhdGVzLiAgQ2hhbmdlIEFCU01PViByZWZlcmVuY2UgdG8gQUJTOE1FTS4KKworV2VkIEFwciAgMyAxMDo0MDo0NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy1kaXMuYyAob3Bjb2Rlc19pbml0aWFsaXplZCk6IE1vdmUgaW5zaWRlIHByaW50X2luc25fc3BhcmMuCisJKGN1cnJlbnRfYXJjaF9tYXNrKTogTmV3IHN0YXRpYyBnbG9iYWwuCisJKGNvbXB1dGVfYXJjaF9tYXNrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkocHJpbnRfaW5zbl9zcGFyYyk6IERlbGV0ZSBzcGFyY192OV9wLiAgTmV3IHN0YXRpYyBsb2NhbAorCWN1cnJlbnRfbWFjaC4gIFJlc29ydCBvcGNvZGUgdGFibGUgaWYgY3VycmVudF9tYWNoIGNoYW5nZXMuCisJR2VuZXJhbGl6ZSAiaW5zbiBub3Qgc3VwcG9ydGVkIiB0ZXN0LgorCShjb21wYXJlX29wY29kZXMpOiBQcmVmZXIgc3VwcG9ydGVkIG9wY29kZXMgdG8gbm9uc3VwcG9ydGVkIG9uZXMuCisJRGVsZXRlIHRlc3QgZm9yIHY5LyF2OS4KKwkqIHNwYXJjLW9wYy5jIChNQVNLXyopOiBVc2UgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSy4KKwkodjZub3RsZXQpOiBEZWZpbmUuCisJKGJyZmMpOiBTcGxpdCBpbnRvIENCUiBhbmQgRkJSIGZvciBjb3Byb2Nlc3Nvci9mcCBicmFuY2hlcy4KKwkoYnJmY3gpOiBSZW5hbWVkIHRvIEZCUlguCisJKGNvbmRmYyk6IFJlbmFtZWQgdG8gQ09OREZDLiAgUGFzcyB2Nm5vdGxldCB0byBDQlIgKHN0YW5kYXJkCisJY29wcm9jZXNzb3IgbW5lbW9uaWNzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGFyY2xldCkuCisJKGNvbmRmKTogUmVuYW1lZCB0byBDT05ERi4KKwkoU0xDQkNDMik6IERlbGV0ZSBGX0FMSUFTIGZsYWcuCisKK1NhdCBNYXIgMzAgMjE6NDU6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiByZCBtdXN0IGJlIDAgZm9yCisJbW92IGZvbyx7JXksJXBzciwld2ltLCV0YnJ9LiAgU3VwcG9ydCBtb3YgZm9vLCVhc3JYLgorCitGcmkgTWFyIDI5IDEzOjAyOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBCRkQgVkVSU0lPTiBmaWxlLCBzbworCXRoYXQgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyIGlzIHNldCBjb3JyZWN0bHkuCisKK1R1ZSBNYXIgMjYgMTU6NDc6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgYXIgYW5kIHJhbmxpYi4gIEZyb20KKwlNaWxlcyBCYWRlciA8bWlsZXNAZ251LmFpLm1pdC5lZHU+LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitTYXQgTWFyIDE2IDEzOjA0OjA3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB6OGtnZW4uYyAoaW50ZXJuYWwsIGdhcyk6IENhbGwgeG1hbGxvYyByYXRoZXIgdGhhbiB1bmNoZWNrZWQKKwltYWxsb2MuCisKK1R1ZSBNYXIgMTIgMTI6MTQ6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCisKK1RodSBNYXIgIDcgMTU6MTE6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlICdPJyBvcGVyYW5kIGNoYXIgbGlrZSAncicuCisJKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IFVzZSAnTycgb3BlcmFuZCBjaGFyIGZvciBgbmVnIHJlZycuCisKK1R1ZSBNYXIgIDUgMTU6NTE6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IERvbid0IHNldCBTSExJQiBvciBTSExJTksgdG8gYW4gZW1wdHkgc3RyaW5nLAorCXNpbmNlIHRoZXkgYXBwZWFyIGFzIHRhcmdldHMgaW4gTWFrZWZpbGUuaW4uCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK01vbiBGZWIgMjYgMTM6MDM6NDAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYml0cy4KKworVHVlIEZlYiAyMCAyMDo0ODoyOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHY4LHY2bm90djkpOiBBZGQgTUFTS19TUEFSQ0xFVC4KKwkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogQWRkIE1BU0tfVjggdG8gc3BhcmNsZXQgZW50cnkuCisJKHNwYXJjX29wY29kZXMpOiBBZGQgc3BhcmNsZXQgaW5zbnMuCisJKHNwYXJjbGV0X2NwcmVnX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3NwYXJjbGV0X2NwcmVnKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSGFuZGxlIHNwYXJjbGV0IGNwcmVncy4KKworVHVlIEZlYiAyMCAxMTowMjo0NCAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBtdWxsZXQuTGV2ZWxzLlVuaVNBLkVkdS5BdT4KKworCSogaTM4Ni1kaXMuYyAoaW5kZXgxNik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHB1dG9wKTogUHJpbnQgamVjeHogZm9yIDMyIGJpdCBjYXNlLCBqY3h6IGZvciAxNiBiaXQsIG5vdCB0aGUKKwlvdGhlciB3YXkgYXJvdW5kLgorCShPUF9pbmRpckUpOiBSZXR1cm4gcmVzdWx0IG9mIE9QX0UuCisJKE9QX0UpOiBDaGVjayBmb3IgMTYgYml0IGFkZHJlc3NpbmcgbW9kZSwgYW5kIGRpc2Fzc2VtYmxlCisJY29ycmVjdGx5LiAgT3B0aW1pc2VkIDMyIGJpdCBjYXNlIGEgbGl0dGxlLiAgRG9uJ3QgcHJpbnQKKwkiKGJhc2UsaW5kZXgsc2NhbGUpIiB3aGVuIHNpYiBzcGVjaWZpZXMgb25seSBhbiBvZmZzZXQuCisKK01vbiBGZWIgMTkgMTI6MzI6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBTSExJQl9ERVAuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoU0hMSUJfREVQKTogTmV3IHZhcmlhYmxlLgorCShMSUJJQkVSVFlfTElTVFMsIEJGRF9MSVNUKTogTmV3IHZhcmlhYmxlcy4KKwkoc3RhbXAtcGljbGlzdCk6IERlcGVuZCB1cG9uIExJQklCRVJUWV9MSVNUUyBhbmQgQkZEX0xJU1QuICBJZgorCUNPTU1PTl9TSExJQiwgYWRkIHRoZW0gdG8gcGljbGlzdCB3aXRoIGFwcHJvcHJpYXRlIG1vZGlmaWNhdGlvbnMuCisJKCQoU0hMSUIpKTogRGVwZW5kIHVwb24gJChTSExJQl9ERVApLiAgRG9uJ3QgY2hlY2sgQ09NTU9OX1NITElCCisJaGVyZToganVzdCB1c2UgcGljbGlzdC4KKworTW9uIEZlYiAxOSAwMjowMzo1MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKE1BU0tfVjksVjlfT05MWV9QLFY5X1ApOiBEZWZpbmUuCisJKHByaW50X2luc25fc3BhcmMpOiBSZXdyaXRlIHY5L25vdC12OSB0ZXN0cy4KKwkoY29tcGFyZV9vcGNvZGVzKTogTGlrZXdpc2UuCisJKiBzcGFyYy1vcGMuYyAoTUFTS188QVJDSD4pOiBEZWZpbmUuCisJKHY2LHY3LHY4LHNwYXJjbGl0ZSx2OSx2OWEpOiBSZWRlZmluZS4KKwkoc3BhcmNsZXQsdjZub3R2OSk6IERlZmluZS4KKwkoc3BhcmNfb3Bjb2RlX2FyY2hzKTogRGVsZXRlIG1lbWJlciBgY29uZmxpY3RzJy4gIEFkZCBgc3VwcG9ydGVkJy4KKwkoc3BhcmNfb3Bjb2Rlcyk6IERlbGV0ZSBGX05PVFY5LCB1c2UgdjZub3R2OSBpbnN0ZWFkLgorCitUaHUgRmViIDE1IDE0OjQ1OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlIGNvbmZpZ3VyZS5ob3N0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBNYWtlZmlsZS5pbiAoU09OQU1FKTogUmVtb3ZlIGxlYWRpbmcgLi4vYmZkLyBmcm9tICQoU0hMSUIpLgorCitXZWQgRmViIDE0IDE5OjAxOjI3IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KKworCSogaTM4Ni1kaXMuYyAob25lYnl0ZV9oYXNfbW9kcm0pOiBOZXcgc3RhdGljIGFycmF5LgorCSh0d29ieXRlX2hhc19tb2RybSk6IE5ldyBzdGF0aWMgYXJyYXkuCisJKHByaW50X2luc25faTM4Nik6IE9ubHkgZmV0Y2ggdGhlIG1vZC9yZWcvcm0gYnl0ZSBpZiBpdCBpcyBuZWVkZWQuCisKK1R1ZSBGZWIgMTMgMTU6MTU6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogQ2hlY2sgdHMgYWdhaW5zdCAkKFNITElCKSwgbm90CisJJChTSExJTkspLgorCitNb24gRmViIDEyIDE2OjI2OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcHBjLW9wYy5jIChQUEMpOiBVbmRlZiwgc28gZGVmYXVsdCBkZWZpbmF0aW9uIG9uIFdpbmRvd3MgTlQKKwlkb2Vzbid0IGNvbmZsaWN0LgorCitXZWQgRmViICA3IDEzOjU5OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogVGhlIGJrcHQgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkIG9uCisJbTY4MDEwdXAsIG5vdCBqdXN0IG02ODAyMHVwIHwgY3B1MzIuCisKKwkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBOZXcgdmFyaWFibGUuCisJKCQoU0hMSU5LKSk6IE1ha2UgYSBsaW5rIHRvIHRoZSB0cmFuc2Zvcm1lZCBuYW1lLCBhcyB3ZWxsLgorCShzdGFtcC10c2hsaW5rKTogTmV3IHRhcmdldC4KKwkoaW5zdGFsbCk6IFNraXAgc3RhbXAtdHNobGluayBkdXJpbmcgaW5zdGFsbC4KKworVHVlIEZlYiAgNiAxMjoyODo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19BUkdfUFJPR1JBTS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogTmV3IHZhcmlhYmxlLgorCShpbnN0YWxsKTogVHJhbnNmb3JtIGxpYnJhcnkgbmFtZSBiZWZvcmUgaW5zdGFsbGluZyBpdC4KKworTW9uIEZlYiAgNSAxNjoxNDo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGk5NjAtZGlzLmMgKG1lbSk6IEFkZCBIWCBkY2ludmEgaW5zdHJ1Y3Rpb24uCisKKwlTdXBwb3J0IGZvciBidWlsZGluZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20KKwlBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46CisJKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBzaGFyZWQgYW5kIGNvbW1vbmJmZGxpYi4KKwlOZXcgc3Vic3RpdHV0aW9uczogQUxMTElCUywgUElDRkxBRywgU0hMSUIsIFNITElCX0NDLAorCVNITElCX0NGTEFHUywgQ09NTU9OX1NITElCLCBTSExJTksuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoQUxMTElCUyk6IE5ldyB2YXJpYWJsZS4KKwkoUElDRkxBRywgU0hMSUIsIFNITElCX0NDLCBTSExJQl9DRkxBR1MpOiBOZXcgdmFyaWFibGVzLgorCShDT01NT05fU0hMSUIsIFNITElOSyk6IE5ldyB2YXJpYWJsZXMuCisJKC5jLm8pOiBJZiBQSUNGTEFHIGlzIHNldCwgY29tcGlsZSB0d2ljZSwgb25jZSBQSUMsIG9uY2Ugbm9ybWFsLgorCShTVEFHRVNUVUZGKTogUmVtb3ZlIHZhcmlhYmxlLgorCShhbGwpOiBEZXBlbmQgdXBvbiAkKEFMTExJQlMpIHJhdGhlciB0aGFuICQoVEFSR0VUTElCKS4KKwkoc3RhbXAtcGljbGlzdCwgcGljbGlzdCk6IE5ldyB0YXJnZXRzLgorCSgkKFNITElCKSwgJChTSExJTkspKTogTmV3IHRhcmdldHMuCisJKCQoT0ZJTEVTKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KKwkoZGlzYXNzZW1ibGUubyk6IEJ1aWxkIHR3aWNlIGlmIFBJQ0ZMQUcgaXMgc2V0LgorCShNT1NUTFlDTEVBTik6IEFkZCBwaWMvKi5vLgorCShjbGVhbik6IFJlbW92ZSAkKFNITElCKSwgJChTSExJTkspLCBwaWNsaXN0LCBhbmQgc3RhbXAtcGljbGlzdC4KKwkoZGlzdGNsZWFuKTogUmVtb3ZlIHBpYyBhbmQgc3RhbXAtcGljZGlyLgorCShpbnN0YWxsKTogSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzLgorCShzdGFtcC1waWNkaXIpOiBOZXcgdGFyZ2V0LgorCitGcmkgRmViICAyIDE3OjE1OjI1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IERlbGV0ZSBESVNBU01fUkFXX0lOU04gc3VwcG9ydC4KKwlQcmludCB1bmtub3duIGluc3RydWN0aW9uIGFzICJ1bmtub3duIiwgcmF0aGVyIHRoYW4gaW4gaGV4LgorCitUdWUgSmFuIDMwIDE0OjA2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZGlzLWJ1Zi5jOiBJbmNsdWRlICJzeXNkZXAuaCIgYmVmb3JlICJkaXMtYXNtLmgiLgorCitUaHUgSmFuIDI1IDIwOjI0OjA3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2RlX2FyY2hzKTogTWFyayB2OC9zcGFyY2xpdGUgYXMgY29uZmxpY3RpbmcuCisKK1RodSBKYW4gMjUgMTE6NTY6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX2kzODYpOiBPbmx5IGZldGNoIHRoZSBtb2QvcmVnL3JtIGJ5dGUKKwl3aGVuIG5lY2Vzc2FyeS4gIEZyb20gVWxyaWNoIERyZXBwZXIKKwk8ZHJlcHBlckBteXdhcmUucnoudW5pLWthcmxzcnVoZS5kZT4uCisKK1RodSBKYW4gMjUgMDM6Mzk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogTlVNT1BDT0RFUyByZXBsYWNlZCB3aXRoCisJc3BhcmNfbnVtX29wY29kZXMuICBVcGRhdGUgYXJjaGl0ZWN0dXJlIGVudW0gdmFsdWVzLgorCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZV9hcmNocyk6IFJlcGxhY2VzIGFyY2hpdGVjdHVyZV9wbmFtZS4KKwkoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogTmV3IGZ1bmN0aW9uLgorCShzcGFyY19udW1fb3Bjb2Rlcyk6IFJlbmFtZWQgZnJvbSBiZmRfc3BhcmNfbnVtX29wY29kZXMuCisJKHNwYXJjX29wY29kZXMpOiBBZGQgdjlhIHNodXRkb3duIGluc24uCisKK01vbiBKYW4gMjIgMDg6Mjk6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVuYW1lZCBmcm9tIHByaW50X2luc24uCisJSWYgRElTQVNNX1JBV19JTlNOLCBwcmludCBpbnNuIGluIGhleC4gIEhhbmRsZSB2OWEgYXMgb3Bjb2RlCisJYXJjaGl0ZWN0dXJlLgorCShwcmludF9pbnNuX3NwYXJjNjQpOiBEZWxldGVkLgorCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyLCBjYXNlIGJmZF9hcmNoX3NwYXJjKTogQWx3YXlzIHVzZQorCXByaW50X2luc25fc3BhcmMuCisKKwkqIHNwYXJjLW9wYy5jIChhcmNoaXRlY3R1cmVfcG5hbWUpOiBBZGQgdjlhLgorCitGcmkgSmFuIDEyIDE0OjM1OjU4IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQEFaU3Rhck5ldC5jb20+CisKKwkqIGFscGhhLW9wYy5oIChhbHBoYV9pbnNuX3NldCk6IFZBWCBmbG9hdGluZyBwb2ludCBvcGNvZGUgd2FzCisgCWluY29ycmVjdGx5IGRlZmluZWQgYXMgMHgxNiB3aGVuIGl0IHNob3VsZCBiZSAweDE1LgorCShGTE9BVF9GT1JNQVRfTUFTSyk6IGZ1bmN0aW9uIGNvZGUgaXMgMTEgYml0cywgbm90IGp1c3QgNyBiaXRzIQorCShhbHBoYV9pbnNuX3NldCk6IGFkZGVkIGN2dHN0IGFuZCBjdnR0cSBmbG9hdCBvcHMuICBBbHNvIGFkZGVkCisgCWV4Y2IgKGV4Y2VwdGlvbiBiYXJyaWVyKSB3aGljaCBpcyBkZWZpbmVkIGluIHRoZSBBbHBoYQorIAlBcmNoaXRlY3R1cmUgSGFuZGJvb2sgdmVyc2lvbiAyLgorCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBGaXhlZCBzcGVjaWFsLWNhc2UgZGVjb2RpbmcgZm9yCisgCU9QRVJBVEVfRk9STUFUX0NPREUgdHlwZSBpbnN0cnVjdGlvbnMuICBUaGUgYnVnIGNhdXNlZCBtdWxxIHRvIGJlCisgCWRpc2Fzc2VtYmxlZCBhcyBvciwgZm9yIGV4YW1wbGUuCisKK1dlZCBKYW4gMTAgMTI6Mzc6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNhc2VzICdpJyBhbmQgJ3UnIGluIGhleC4KKwkoX3ByaW50X2luc25fbWlwcyk6IENoYW5nZSBpIGZyb20gaW50IHRvIHVuc2lnbmVkIGludC4KKworVGh1IEphbiAgNCAxNzoyMToxMCAxOTk2ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KKworCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiB0bGJpIFBPV0VSIG9wY29kZSBmb3JtIGRpZmZlcmVudAorCWZyb20gdGxiaWUgUG93ZXJQQyBvcGNvZGUuICBBZGQgUFBDNjAzIHRsYmxkIGFuZCB0bGJsaS4KKworVGh1IERlYyAyOCAxMzoyOToxOSAxOTk1ICBKb2huIEhhc3NleSAgPGhhc3NleUBydHAuZGcuY29tPgorCisJKiBpMzg2LWRpcy5jOiBBZGRlZCBQZW50aXVtIFBybyBpbnN0cnVjdGlvbnMuCisKK1R1ZSBEZWMgMTkgMjI6NTY6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwcGMtb3BjLmMgKGZzcXJ0eywufSk6IER1cGxpY2F0ZSBmb3IgUG93ZXJQQyBpbiBhZGRpdGlvbiB0bworCWJlaW5nIGZvciBQb3dlcjIuCisKK0ZyaSBEZWMgMTUgMTQ6MTQ6MTUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUpOiBBZGRlZCBSRUdfQi4KKwkoc2hfYXJnX3R5cGUpOiBBZGRlZCBBX1JFR19CLgorCShzaF90YWJsZSk6IEFkZGVkIHByZWYgYW5kIGJhbmsgcmVnIHZlcnNpb25zIG9mIGxkYywgbGRjLmwsIHN0YworIAlhbmQgc3RjLmwgb3Bjb2Rlcy4KKwkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZGVkIGNhc2VzIGZvciBSRUdfQiBhbmQgQV9SRUdfQi4KKworRnJpIERlYyAxNSAxNjo0NDozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCisKK1R1ZSBEZWMgMTIgMTI6MjI6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHN0YW1wLWguICBGcm9tIFJvbmFsZAorCUYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KKworVHVlIERlYyAgNSAxMzo0Mjo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlGcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+OgorCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBmaXhlZCBkZWNvZGluZyBvZiBjcHlzCisgCWluc3RydWN0aW9uLgorCitNb24gRGVjICA0IDEyOjI5OjA1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogc2gtb3BjLmggKHNoX2FyZ190eXBlKTogQWRkZWQgQV9TU1IgYW5kIEFfU1BDLgorCShzaF90YWJsZSk6IEFkZGVkIG1hbnkgU0gzIG9wY29kZXMuCisJKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGRlZCBjYXNlcyBmb3IgQV9TU1IgYW5kIEFfU1BDLgorCitGcmkgRGVjICAxIDA3OjQyOjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcHBjLW9wYy5jIChzdWJmYy4sIHN1YmZjbyk6IE1hcmsgdGhpcyBQUENDT00sIG5vdCBQUEMuCisJKHN1YmNvLHN1YmNvLik6IE1hcmsgdGhpcyBQUEMsIG5vdCBQUENDT00uCisKK01vbiBOb3YgMjcgMTM6MDk6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjcuCisKK1R1ZSBOb3YgMjEgMTg6Mjg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCisKK1dlZCBOb3YgMTUgMTk6MDI6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU29ydCBsaXN0IG9mIGFyY2hpdGVjdHVyZXMuICBBY2NlcHQgYnV0IGRvIG5vdGhpbmcKKwlmb3IgYWxsaWFudCwgY29udmV4LCBweXJhbWlkLCByb21wLCBhbmQgdGFob2UuCisKK1dlZCBOb3YgIDggMjA6MTg6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhMjlrLWRpcy5jIChwcmludF9zcGVjaWFsKTogQ2hhbmdlIG51bSB0byB1bnNpZ25lZCBpbnQuCisKK1dlZCBOb3YgIDggMjA6MTA6MzUgMTk5NSAgRXJpYyBGcmV1ZGVudGhhbCA8ZnJldWRlbnRoYWxAbnl1LmVkdT4KKworCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IENhc3QgaW5zbjI0IHRvIHVuc2lnbmVkIGxvbmcgd2hlbgorCXNoaWZ0aW5nIGl0LgorCitUdWUgTm92ICA3IDE1OjIxOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1BST0cgdG8gZmluZCBhbmQgY2FjaGUgQVIuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK01vbiBOb3YgIDYgMTc6Mzk6NDcgMTk5NSAgSGFycnkgRG9sYW4gIDxkb2xhbkBzc2QuaW50ZWwuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBiZmRfaTg2MF9hcmNoLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgTm92ICAzIDEyOjQ1OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQ29ycmVjdCBmbW92ZW1sIG9wZXJhbmRzLgorCSogbTY4ay1kaXMuYyAoTkVYVFNJTkdMRSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KKwkoTkVYVERPVUJMRSk6IExpa2V3aXNlLgorCShwcmludF9pbnNuX202OGspOiBEb24ndCBtYXRjaCBmbW92ZW1sIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKKwlyZWdpc3RlciBpbiB0aGUgbGlzdC4KKwkocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgYSBwbGFjZSBvZiAnOCcgZm9yIGEgdHlwZSBvZiAnTCcuCisKK1RodSBOb3YgIDIgMjM6MDY6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jOiBVc2UgI1cgcmF0aGVyIHRoYW4gI3cuCisJKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgJ1cnIHBsYWNlLgorCitXZWQgTm92ICAxIDEzOjMwOjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBkYmZ3IGFzIGFuIGFsaWFzIGZvciBkYmYsCisJYW5kIGxpa2V3aXNlIGZvciBhbGwgdGhlIGRieHggb3Bjb2Rlcy4KKworTW9uIE9jdCAzMCAyMDo1MDo0MCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogYXJjLWRpcy5jOiBJbmNsdWRlIGVsZi1iZmQuaCByYXRoZXIgdGhhbiBsaWJlbGYuaC4KKworTW9uIE9jdCAyMyAxMToxMTozNCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KKworCSogbWlwcy1vcGMuYzogQWRkZWQgc2hvcnRoYW5kIChWMSkgZm9yIElOU05fNDEwMCBtYW5pZmVzdC4gQWRkZWQKKyAJdGhlIFZSNDEwMCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gdGhlIG1pcHNfb3Bjb2RlcyBzdHJ1Y3R1cmUuCisKK1RodSBPY3QgMTkgMTE6MDU6MjMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluLCBtcHctbWFrZS5zZWQ6IFJlbW92ZSB1Z2x5IHdvcmthcm91bmQgZm9yCisJdWdseSBNZXRyb3dlcmtzIGJ1ZyBpbiBDVzYsIGlzIGZpeGVkIGluIENXNy4KKworTW9uIE9jdCAxNiAxMjo1OTowMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwYy1vcGMuYyAod2hvbGUgZmlsZSk6IEFkZCBmbGFncyBmb3IgY29tbW9uL2FueSBzdXBwb3J0LgorCitUdWUgT2N0IDEwIDExOjA2OjA3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCisJKEZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgQklTT04uCisKK0ZyaSBPY3QgIDYgMTY6MjY6NDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorCisJKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBSZWNvZ25pemUgYWxsIHR3by13b3JkCisJaW5zdHJ1Y3Rpb25zIHRoYXQgdGFrZSBubyBhcmdzIGJ5IGxvb2tpbmcgYXQgdGhlIG1hdGNoIG1hc2suCisgIAkocHJpbnRfaW5zbl9hcmcpOiBBbHdheXMgcHJpbnQgIiUiIGJlZm9yZSByZWdpc3RlciBuYW1lcy4KKwlbY2FzZSAnYyddOiBVc2UgIm5jIiBmb3IgdGhlIG5vLWNhY2hlIGNhc2UsIGFzIHJlY29nbml6ZWQgYnkgZ2FzLgorCVtjYXNlICdfJ106IERvbid0IHByaW50ICJAIyIgYmVmb3JlIGFkZHJlc3MuCisJW2Nhc2UgJ0onXTogVXNlICIlcyIgYXMgZm9ybWF0IHN0cmluZywgbm90IHJlZ2lzdGVyIG5hbWUuCisJW2Nhc2UgJ0InXTogVHJlYXQgcGxhY2UgPT0gJ0MnIGxpa2UgJ2wnIGFuZCAnTCcuCisKK1RodSBPY3QgIDUgMjI6MTY6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+CisKKwkqIGkzODYtZGlzLmM6IERlc2NyaWJlIGNtcHhjaGc4YiBvcGVyYW5kLCBhbmQgc3BlbGwgdGhlIG9wY29kZQorCW5hbWUgY29ycmVjdGx5LgorCitUdWUgT2N0ICAzIDA4OjMwOjIwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwlGcm9tIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+CisKKwkqIGFscGhhLW9wYy5oIChNRU1PUllfRlVOQ1RJT05fRk9STUFUX01BU0spOiBhZGRlZC4KKyAgCShhbHBoYV9pbnNuX3NldCk6IGFkZGVkIGRlZmluaXRpb25zIGZvciBWQVggZmxvYXRpbmcgcG9pbnQKKyAJaW5zdHJ1Y3Rpb25zIChVbml4IGNvbXBpbGVycyBkb24ndCBnZW5lcmF0ZSB0aGVzZSwgYnV0IGhhbmRjb2RlZAorIAlhc3NlbWJseSBtaWdodCBzdGlsbCB1c2UgdGhlbSkuCisKKwkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogYWRkZWQgc3VwcG9ydCBmb3IgZGlzYXNzZW1ibGluZworIAl0aGUgbWlzY2VsbGFuZW91cyBpbnN0cnVjdGlvbnMgaW4gdGhlIEFscGhhIGluc3RydWN0aW9uIHNldC4KKworVHVlIFNlcCAyNiAxODo0NzoyMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1jb25maWcuaW46IEFkZCBtNjhrLW9wYy5jLm8gdG8gQkZEX01BQ0hJTkVTIGZvciBtNjhrLAorCW5vIGxvbmdlciBjcmVhdGUgc3lzZGVwLmgsIHNlZCBwcGMtb3BjLmMgdG8gd29yayBhcm91bmQgYQorCXNlcmlvdXMgTWV0cm93ZXJrcyBDIGJ1Zy4KKwkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCisJKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCB1c2VkIGJ5IG1wdy1jb25maWd1cmUgdG8gZWRpdAorCU1ha2VmaWxlLmluIGludG8gYW4gTVBXIG1ha2VmaWxlLgorCitXZWQgU2VwIDIwIDEyOjU1OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgcmVhbGNsZWFuLgorCitUdWUgU2VwIDE5IDE1OjI4OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbTY4ay1vcGMuYzogU3BsaXQgcG1vdmUgcGF0dGVybnMgd2hpY2ggdXNlICdQJyBpbnRvIHBhdHRlcm5zCisJd2hpY2ggdXNlICcwJywgJzEnLCBhbmQgJzInIGluc3RlYWQuICBTcGVjaWZ5IHRoZSBwcm9wZXIgc2l6ZSBmb3IKKwlhIHBtb3ZlIGltbWVkaWF0ZSBvcGVyYW5kLiAgQ29ycmVjdCB0aGUgcG1vdmVmZCBwYXR0ZXJucyB0byBiZQorCW1vdmVzIHRvIGEgcmVnaXN0ZXIsIG5vdCBmcm9tIGEgcmVnaXN0ZXIuCisJKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlcGxhY2UgJ1AnIHdpdGggJzAnLCAnMScsICcyJy4KKworVGh1IFNlcCAxNCAxMTo1ODoyMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IE1hcmsgYWxsIGluc25zIHRoYXQgcmVmZXJlbmNlCisJJXBzciwgJXdpbSwgJXRiciBhcyBGX05PVFY5LgorCitGcmkgU2VwICA4IDAxOjA3OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogSnVzdCByZWJ1aWxkIE1ha2VmaWxlIHdoZW4gcnVubmluZworCWNvbmZpZy5zdGF0dXMuCisJKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMuCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiBhbmQgQUNfQ0FOT05JQ0FMX1NZU1RFTQorCWVhcmxpZXIuICBEb24ndCBib3RoZXIgdG8gY2FsbCBBQ19BUkdfUFJPR1JBTS4gIFRvdWNoIHN0YW1wLWggd2hlbgorCXJlYnVpbGRpbmcgY29uZmlnLmguCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKwkqIG1pcHMtb3BjLmM6IENoYW5nZSB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyB3aXRoICJ0LEEiCisJb3BlcmFuZHMgdG8gdXNlICJ0LEEoYikiLgorCitUaHUgU2VwICA3IDE5OjAyOjQ2IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkIEZfRlIwIHN1cHBvcnQuCisKK1RodSBTZXAgIDcgMTk6MDI6NDYgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBDaGFuZ2UgbG9vcCBvdmVyIG9wLT5hcmdbbl0gdG8gaXRlcmF0ZQorCXVudGlsIDMgaW5zdGVhZCBvZiB1bnRpbCAyLgorCitXZWQgU2VwICA2IDIxOjIxOjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBEZWZpbmUuCisJKC5jLm8sIGRpc2Fzc2VtYmxlLm8pOiBVc2UgJChBTExfQ0ZMQUdTKS4KKwkoTU9TVExZQ0xFQU4pOiBBZGQgY29uZmlnLmxvZy4KKwkoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIGNvbmZpZy5sb2cuCisJKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgSERFRklORVMuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBTZXAgIDYgMTU6MDg6MDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGQgRl9GUjAuCisJKHNoX3RhYmxlLCBjYXNlIGZtYWMpOiBBZGQgRl9GUjAgYXMgZmlyc3QgYXJndW1lbnQuCisKK1dlZCBTZXAgIDYgMTU6MDg6MDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBzaC1vcGMuaCAoc2hfb3Bjb2RlX2luZm8pOiBJbmNyZWFzZSBhcmcgYXJyYXkgc2l6ZSB0byA0LgorCitUdWUgU2VwICA1IDE4OjI4OjEwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLWRpcy5jOiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gTk9fVjkuCisKK1R1ZSBTZXAgIDUgMjA6MDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00OiBKdXN0IGluY2x1ZGUgLi4vYmZkL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1R1ZSBTZXAgIDUgMTY6MDk6NTkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtZGlzLmMgKFhfRElTUDE5KTogRGVmaW5lLgorCShwcmludF9pbnNuLCBjYXNlICdHJyk6IFVzZSBpdC4KKwkocHJpbnRfaW5zbiwgY2FzZSAnTCcpOiBTaWduIGV4dGVuZCBkaXNwbGFjZW1lbnQuCisKK01vbiBTZXAgIDQgMTQ6Mjg6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFJ1biAuLi9iZmQvY29uZmlndXJlLmhvc3QgYmVmb3JlIEFDX1BST0dfQ0MuCisJU3Vic2l0dXRlIENGTEFHUyBhbmQgQVIuICBDYWxsIEFDX1BST0dfSU5TVEFMTC4gIERvbid0IHN1YnN0aXR1dGUKKwlob3N0X21ha2VmaWxlX2ZyYWcgb3IgZnJhZ3MuCisJKiBhY2xvY2FsLm00OiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KKwkoSU5TVEFMTF9QUk9HUkFNKTogU2V0IHRvIEBJTlNUQUxMX1BST0dSQU1ALgorCShJTlNUQUxMX0RBVEEpOiBTZXQgdG8gQElOU1RBTExfREFUQUAuCisJKEFSKTogU2V0IHRvIEBBUkAuCisJKEFSX0ZMQUdTKTogU2V0IHRvIHJjIHJhdGhlciB0aGFuIHFjLgorCShDQyk6IERlZmluZSBhcyBAQ0NALgorCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCisJKEBob3N0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgorCShjb25maWcuc3RhdHVzKTogUmVtb3ZlIGRlcGVuZGVuY3kgdXBvbiBAZnJhZ3NALgorCisJKiBjb25maWd1cmUuaW46IC4uL2JmZC9jb25maWcuYmZkIG5vdyBqdXN0IHNldHMgc2hlbGwgdmFyaWFibGVzLgorCVVzZSB0aGVtIHJhdGhlciB0aGFuIGxvb2tpbmcgdGhyb3VnaCB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnRzLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUaHUgQXVnIDMxIDEyOjM1OjMyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogc2gtb3BjLmggKGZ0cmMpOiBDaGFuZ2UgRlBVTF9OIHRvIEZQVUxfTS4KKworV2VkIEF1ZyAzMCAxMzo1MjoyOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IERlbGV0ZSBkdXBsaWNhdGUgd3IgJXkgaW5zbi4KKwlBZGQgY2xyeCwgaXByZWZldGNoLCBzaWdueCwgY2xydXcsIGNhcywgY2FzbCwgY2FzeCwgY2FzeGwgc3ludGhldGljCisJc3BhcmM2NCBpbnNucy4KKworCSogc3BhcmMtb3BjLmMgKHNwYXJjX29wY29kZXMpOiBGaXggcHJlZmV0Y2hhIGluc24uCisJKGxvb2t1cF97bmFtZSx2YWx1ZX0pOiBOZXcgZnVuY3Rpb25zLgorCShwcmVmZXRjaF90YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWwuCisJKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV9wcmVmZXRjaCk6IE5ldyBmdW5jdGlvbnMuCisJKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbik6IEhhbmRsZSAnKicgYXJnIChwcmVmZXRjaCBmdW5jdGlvbikuCisKK1dlZCBBdWcgMzAgMTE6MTE6NTggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBzaC1vcGMuaDogQWRkIGJsYW5rIGxpbmVzIHRvIGltcHJvdmUgcmVhZGFiaWxpbHR5IG9mIHNoM2UKKwlpbnN0cnVjdGlvbnMuCisKK1dlZCBBdWcgMzAgMTE6MDk6MzggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBzaC1kaXMuYzogQ29ycmVjdCBjb21tZW50IG9uIGZpcnN0IGxpbmUgb2YgZmlsZS4KKworVHVlIEF1ZyAyOSAxNTozNzoxOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgYmZkX21hY2hfc3BhcmM2NC4KKworCSogc3BhcmMtb3BjLmMgKGFzaSwgbWVtYmFyKTogTmV3IHN0YXRpYyBsb2NhbHMuCisJKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV97YXNpLG1lbWJhcn0pOiBOZXcgZnVuY3Rpb25zLgorCShzcGFyY19vcGNvZGVzLCBtZW1iYXIgaW5zbik6IEZpeC4KKwkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuKTogQ2FsbCBzcGFyY19kZWNvZGVfYXNpLgorCVN1cHBvcnQgZGVjb2Rpbmcgb2YgbWVtYmFyIG1hc2tzLgorCShYX01FTUJBUik6IERlZmluZS4KKworU2F0IEF1ZyAyNiAyMToyMjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgYnIsIGJycywgYnJiLCBicncsIGJybC4KKworTW9uIEF1ZyAyMSAxNzozMzozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQgYmhpYiBhcyBhbiBhbGlhcyBmb3IgYmhpcywKKwlhbmQgbGlrZXdpc2UgZm9yIHRoZSBvdGhlciBicmFuY2hlcy4gIEFkZCBiaHMgYXMgYW4gYWxpYXMgZm9yIGJjYywKKwlhbmQgbGlrZXdpc2UgZm9yIHRoZSBzaXplIHZhcmlhbnRzLiAgQWRkIGRiaHMgYXMgYW4gYWxpYXMgZm9yCisJZGJjYy4KKworRnJpIEF1ZyAxMSAxMzo0MDoyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc2gtb3BjLmggKEZQIHN0cyBpbnN0cnVjdGlvbnMpOiBVcGRhdGUgdG8gbWF0Y2ggcmVhbGl0eS4KKworTW9uIEF1ZyAgNyAxNjoxMjo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG02OGstZGlzLmM6IChmcGNyX25hbWVzKTogQWRkICUgYmVmb3JlIGFsbCByZWdpc3RlciBuYW1lcy4KKwkocmVnX25hbWVzKTogTGlrZXdpc2UuCisJKHByaW50X2luc25fYXJnKTogRG9uJ3QgZXhwbGljaXRseSBwcmludCAlIGJlZm9yZSByZWdpc3RlciBuYW1lcy4KKwlBZGQgJSBiZWZvcmUgcmVnaXN0ZXIgbmFtZXMgaW4gc3RhdGljIGFycmF5IG5hbWVzLiAgSW4gY2FzZSAncicsCisJcHJpbnQgZGF0YSByZWdpc3RlcnMgYXMgYEAoRG4pJywgbm90IGBEbkAnLiAgV2hlbiBwcmludGluZyBhCisJbWVtb3J5IGFkZHJlc3MsIGRvbid0IHByaW50IEAjIGJlZm9yZSBpdC4KKwkocHJpbnRfaW5kZXhlZCk6IENoYW5nZSBiYXNlX2Rpc3AgYW5kIG91dGVyX2Rpc3AgZnJvbSBpbnQgdG8KKwliZmRfdm1hLiAgUHJpbnQgdXNpbmcgTUlUIHN5bnRheCwgbm90IG11dGFudCBpbnZhbGlkIE1vdG9yb2xhCisJc3ludGF4LiAgU2lnbiBleHRlbmQgOCBieXRlIGRpc3BsYWNlbWVudCBjb3JyZWN0bHkuCisJKHByaW50X2Jhc2UpOiBQcmludCB1c2luZyBNSVQgc3ludGF4LiAgUHJpbnQgenBjIHdoZW4gYXBwcm9wcmlhdGUuCisJQ2hhbmdlIHBhcmFtZXRlciBkaXNwIGZyb20gaW50IHRvIGJmZF92bWEuCisKKwkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2RlX2FsaWFzZXMpOiBBZGQganNybCBhbmQganNycyBhcyBhbGlhc2VzCisJZm9yIGpzci4KKworTW9uIEF1ZyAgNyAwMjoyMTo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGVzIEZfUkVHX04sCisJRl9SRUdfTSwgRlBTQ1JfTSwgRlBTQ1JfTiwgRlBVTF9NIGFuZCBGUFVMX04uCisJKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGQgbmV3IG9wZXJhbmQgdHlwZXMuCisJKHNoX3RhYmxlKTogQWRkIG5ldyBvcGNvZGVzIGZyb20gU0gzRSBGbG9hdGluZyBQb2ludCBJU0EuCisKK1NhdCBBdWcgIDUgMTY6NTA6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgY29uZmlnLmguCisKK1NhdCBBdWcgIDUgMTY6NTA6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgY29uZmlnLmguCisKK1dlZCBBdWcgIDIgMTg6MzM6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtNjhrLW9wYy5jOiBOZXcgZmlsZSwgaG9sZGluZyB0YWJsZXMgZnJvbSBpbmNsdWRlL29wY29kZS9tNjhrLmguCisJQ2xlYW4gdXAgdGFibGVzLgorCSogbTY4ay1kaXMuYzogUmVtb3ZlIEJSRUFLX1VQX0JJR19ERUNMIHN0dWZmLgorCShvcGNvZGUpOiBSZW1vdmUuCisJKHByaW50X2luc25fbTY4ayk6IENoYW5nZSBkIHRvIGJlIGNvbnN0LiAgVXNlIG02OGtfbnVtb3Bjb2RlcworCXJhdGhlciB0aGFuIG51bW9wY29kZXMuICBVc2UgbTY4a19vcGNvZGVzIHJhdGhlciB0aGFuIHJlbW92ZWQKKwlvcGNvZGUgZnVuY3Rpb24uICBEb24ndCBjaGVjayBGX0FMSUFTLgorCShwcmludF9pbnNuX2FyZyk6IENoYW5nZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqLgorCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBtNjhrLW9wYy5vLgorCShtNjhrLW9wYy5vKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgbTY4ay1vcGMubyBmb3IgYmZkX202OGtfYXJjaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIEF1ZyAgMiAwODoyMzozOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy1kaXMuYyAoSEFTSF9TSVpFLCBIQVNIX0lOU04pOiBEZWZpbmUuCisJKG9wY29kZV9iaXRzLCBvcGNvZGVfaGFzaF90YWJsZSk6IE5ldyB2YXJpYWJsZXMuCisJKG9wY29kZXNfaW5pdGlhbGl6ZWQpOiBSZW5hbWVkIGZyb20gb3Bjb2Rlc19zb3J0ZWQuCisJKGJ1aWxkX2hhc2hfdGFibGUpOiBOZXcgZnVuY3Rpb24uCisJKGlzX2RlbGF5ZWRfYnJhbmNoKTogVXNlIGhhc2ggdGFibGUuCisJKHByaW50X2luc24pOiBSZW5hbWVkIGZyb20gcHJpbnRfaW5zbl9zcGFyYywgbWFkZSBzdGF0aWMuCisJQnVpbGQgYW5kIHVzZSBoYXNoIHRhYmxlLiAgSWYgIXNwYXJjNjQsIGlnbm9yZSBzcGFyYzY0IGluc25zLAorCWFuZCB2aWNlLXZlcnNhIGlmIHNwYXJjNjQuCisJKHByaW50X2luc25fc3BhcmMsIHByaW50X2luc25fc3BhcmM2NCk6IE5ldyBmdW5jdGlvbnMuCisJKGNvbXBhcmVfb3Bjb2Rlcyk6IE1vdmUgc3BhcmM2NCBvcGNvZGVzIHRvIGVuZC4KKwlQcmludCBjb21tdXRhdGl2ZSBpbnNucyB3aXRoIGNvbnN0YW50IHNlY29uZC4KKwkqIHNwYXJjLW9wYy5jIChhbGwgbm9uLXY5IGluc25zKTogVXNlIGZsYWcgRl9OT1RWOSBpbnN0ZWFkIG9mIEZfQUxJQVMuCisKK1R1ZSBBdWcgIDEgMDA6MTI6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGRzbG90LiAgVXNlCisJcHJpbnRfYWRkcmVzc19mdW5jIGZvciBBX0JESVNQMTIgYW5kIEFfQkRJU1A4LiAgQ29ycmVjdCB0ZXN0IHdoaWNoCisJYXZvaWRzIHByaW50aW5nIGEgZGVsYXkgc2xvdCBpbiBhIGRlbGF5IHNsb3QuCisJKiBzaC1vcGMuaCAoc2hfdGFibGUpOiBGdWxseSBicmFja2V0IGxhc3QgZW50cnkuCisKK01vbiBKdWwgMzEgMTI6MDQ6NDcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3BhcmMtb3BjLmMgKHNsbHgsIHNyYXgsIHNybHgpOiBGaXggZGlzYXNzZW1ibHkuCisKK1dlZCBKdWwgMTIgMDA6NTk6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogR2V0IGhvc3RfbWFrZWZpbGVfZnJhZyBmcm9tICR7c3JjZGlyfS4KKworCSogY29uZmlndXJlLmluOiBBdXRvY29uZmlzY2F0ZWQuICBDaGVjayBmb3Igc3RyaW5nW3NdLmguICBDcmVhdGUKKwljb25maWcuaCBmcm9tIGNvbmZpZy5pbi4gIERvbid0IHNldCB1cCBzeXNkZXAuaCBsaW5rLgorCSogc3lzZGVwLmg6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IE5ldyBmaWxlcywgZ2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluLgorCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGF1dG9jb25mLXN0eWxlLgorCShkaXN0Y2xlYW4pOiBLZWVwIHN5c2RlcC5oLiAgUmVtb3ZlIGNvbmZpZy5sb2cgYW5kIGNvbmZpZy5jYWNoZS4KKwkoTWFrZWZpbGUpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cy4KKwkoY29uZmlnLnN0YXR1cyk6IE5ldyBydWxlLgorCSogY29uZmlndXJlLmJhdDogVXBkYXRlIE1ha2VmaWxlIHN1YnN0aXR1dGlvbnMuCisKK1R1ZSBKdWwgMTEgMTQ6MjM6MzcgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+CisKKwkqIG1pcHMtb3BjLmMgKEwxKTogRGVmaW5lLgorCShtaXBzX29wY29kZXMpOiBBZGQgUjQwMTAgaW5zdHJ1Y3Rpb25zOiBmbHVzaGksIGZsdXNoZCwgZmx1c2hpZCwKKwlhZGRjaXUsIG1hZGQsIG1hZGR1LCBmZmMsIGZmcywgbXN1YiwgbXN1YnUsIHNlbHNpLCBzZWxzciwgd2FpdGksCisJYW5kIHdiLgorCitUdWUgSnVsIDExIDExOjQ5OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogRm9yIHRoZSBtb3ZlIHBzZXVkby1vcCwgcHJlZmVyIGRhZGR1CisJaWYgSVNBIDMgYW5kIGFkZHUgb3RoZXJ3aXNlLCByZXBsYWNpbmcgb3IsIHNpbmNlIHNvbWUgTUlQUyBjaGlwcworCWhhdmUgbXVsdGlwbGUgYWRkIHVuaXRzIGJ1dCBvbmx5IGEgc2luZ2xlIGxvZ2ljYWwgdW5pdC4KKworCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogQ2hhbmdlIENSIHRvIHVzZSBhIGJpdHNpemUgb2YgMywKKwlzaGlmdGVkIGJ5IDE4LCB3aXRob3V0IGFueSBpbnNlcnRpb24gb3IgZXh0cmFjdGlvbiBmdW5jdGlvbi4KKwkoaW5zZXJ0X2NyLCBleHRyYWN0X2NyKTogUmVtb3ZlLgorCitXZWQgSnVuIDIxIDIwOjA1OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+CisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnLCBwcmludF9pbmRleGVkKTogUHJpbnQgIiUiIGJlZm9yZQorCXJlZ2lzdGVyIG5hbWVzLgorCitUaHUgSnVuIDE1IDE3OjIzOjMxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LWNvbmZpZy5pbjogQWRkIHNoIGFuZCBpMzg2IGNvbmZpZ3MsIHJlbW92ZSBzcGFyYyBjb25maWcuCisJKiBzaC1vcGMuaDogQWRkIGNvcHlyaWdodC4KKworTW9uIEp1biAgNSAwMzozMDo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjcnVuY2gtbTY4ayk6IERlbGV0ZSBleHRyYSB0YXJnZXQgYWNjaWRlbnRhbGx5CisJY2hlY2tlZCBpbiBhIHdoaWxlIGFnby4KKworV2VkIE1heSAyNCAxNjoyMjoxMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIHNoLW9wYy5oIChzaF90YWJsZSk6IEFkZCBTSDMgc3VwcG9ydC4KKworV2VkIE1heSAyNCAxNDoxNjowOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBzaC1vcGMuaDogQWRkZWQgYnNyZiBhbmQgYnJhZi4KKworV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKKworCSogYXJtLW9wYy5oIChhcm1fb3Bjb2Rlcyk6IEFkZCA2NC1iaXQgbXVsdGlwbHkgcGF0dGVybnMuICBEZWxldGUKKwlib2d1cyBbbHNdZm17ZWEsZmR9IHBhdHRlcm5zLgorCisJKiBhcm0tb3BjLmggKGFybV9vcGNvZGVzKTogQ29ycmVjdCB0eXBvcyBpbiBzdG0sIGxkbSwgc3RkLCBhbmQgbGRjLgorCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IE1ha2UgR0lWRU4gYSBwYXJhbWV0ZXIsIGRvbid0IHRyeSBhbmQKKwlpbml0aWFsaXplIGl0IGZyb20gbWVtb3J5LiAgTWFrZSBmdW5jdGlvbiBzdGF0aWMuCisJKHByaW50X2luc25fe2JpZyxsaXR0bGV9X2FybSk6IE5ldyBmdW5jdGlvbnMuCisJKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIsIGNhc2UgYmZkX2FyY2hfYXJtKTogRGlzYXNzZW1ibGUgZm9yCisJdGhlIGNvcnJlY3QgZW5kaWFubmVzcy4KKworTW9uIEFwciAyNCAxNDoxODowNSAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20+CisKKwkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSwgc2hfYXJnX3R5cGUpOiByZW1vdmUgdHJhaWxpbmcgLCBmcm9tCisJZW51bSBsaXN0LgorCitXZWQgQXByIDE5IDE0OjA3OjAzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogbTY4ay1kaXMuYyAob3Bjb2RlKTogRmluaXNoIGNoYW5nZSBtYWRlIGJ5IEt1bmcgSHN1IG9uIEFwcmlsCisJMTd0aCwgc28gdGhhdCBpdCBidWlsZHMgYWdhaW4gdXNpbmcgR0NDIGFzIHRoZSBjb21waWxlci4KKworVHVlIEFwciAxOCAxMjoxNDo1MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgorCisJKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2xpdHRsZV9taXBzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbQorCWJmZF9nZXRsMzIgZnJvbSBiZmRfdm1hIHRvIHVuc2lnbmVkIGxvbmcsIGJlY2F1c2UgX3ByaW50X2luc25fbWlwcworCWV4cGVjdHMgYW4gdW5zaWduZWQgbG9uZywgYW5kIHRoYXQgbWlnaHQgYmUgZmV3ZXIgd29yZHMgb2YKKwlhcmd1bWVudCBzdG9yYWdlIChlLmcuLCBpZiBiZmRfdm1hIGlzIGxvbmcgbG9uZyBvbiBhIDMyLWJpdAorCW1hY2hpbmUpLgorCShwcmludF9pbnNuX2JpZ19taXBzKTogTGlrZXdpc2Ugd2l0aCBiZmRfZ2V0YjMyIHZhbHVlLgorCShfcHJpbnRfaW5zbl9taXBzKTogTm93IHN0YXRpYy4KKworTW9uIEFwciAxNyAxMjoyMzoyOCAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAcnRsLmN5Z251cy5jb20+CisKKwkqIG02OGstZGlzLmM6IFRha2Ugb3V0ICNkZWZpbmUgQlJFQUtfVVBfQklHX0RFQ0wga2x1ZGdlLCBiZWNhdXNlCisJZ2NjIG1lbW9yeSBob2cgcHJvYmxlbSB3aXRoIGluaXRpYWxpemVyIGlzIGZpeGVkLgorCitNb24gQXByIDEwIDE1OjU1OjAxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgorCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCisKKwkqIG1wdy1jb25maWcuaW4gKGFyY2huYW1lKTogQ29tcHV0ZSBmcm9tIHRoZSBjb25maWcuCisJKEJGRF9NQUNISU5FUywgQVJDSERFRlMpOiBQdXQgaW50byBtay50bXAuCisKKwkqIG1wdy1jb25maWcuaW4gKHRhcmdldF9hcmNoKTogQ29tcHV0ZSBmcm9tIGNhbm9uaWNhbCB0YXJnZXQuCisJKG02OGssIG1pcHMsIHBvd2VycGMsIHNwYXJjKTogQWRkIGFyY2hpdGVjdHVyZXMuCisJKiBtcHctbWFrZS5pbiAoZGlzYXNzZW1ibGUuYy5vKTogQWRkLgorCShBTExfQ0ZMQUdTKTogUmVtb3ZlIHNwZWNpYWwgZmxhZ3MgKC1tYzY4MDIwIC1tYzY4ODgxIC1tb2RlbCBmYXIpLgorCisJKiBtcHctY29uZmlnLmluIChCRkRfTUFDSElORVMpOiBTZXQgdG8gYSBkZWZhdWx0IHZhbHVlLgorCSogbXB3LW1ha2UuaW4gKEJGRF9NQUNISU5FUyk6IFJlbW92ZSB3aXJlZC1pbiB2YWx1ZS4KKworCSogbXB3LW1ha2UuaW4gKENTRUFSQ0gpOiBBZGQgZXh0cmEtaW5jbHVkZSB0byBzZWFyY2ggcGF0aC4KKworCSogbXB3LWNvbmZpZy5pbiAodmFyYXJncy5oKTogRG9uJ3QgY3JlYXRlLgorCShzeXNkZXAuaCk6IENyZWF0ZSB1c2luZyBmb3J3YXJkLWluY2x1ZGUuCisJKiBtcHctbWFrZS5pbiAoQ1NFQVJDSCk6IEFkZCBpbmNsdWRlL21wdyB0byBzZWFyY2ggcGF0aC4KKworCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KKwkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCisKK0ZyaSBNYXIgMzEgMTQ6MjM6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBQdXQgZW1wdHkgc3RhdGVtZW50IGFmdGVyCisJZGVmYXVsdCBsYWJlbC4KKworVHVlIE1hciAyMSAxMDo1MTo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS1kaXMuYyAoc2lnbl9leHRlbmQpOiBEZWxldGUsIHJlZHVuZGFudCB3aXRoIGxpYmhwcGEuaCB2ZXJzaW9uLgorCShsb3dfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KKwkoZ2V0X2ZpZWxkKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KKwkoc2V0X2ZpZWxkLCBkZXBvc2l0XzE0LCBkZXBvc2l0XzIxKTogTGlrZXdpc2UuCisKK0ZyaSBNYXIgMTcgMTU6NTU6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jOiBTdXBwb3J0IGZvciBtb3JlIHBlbnRpdW0gb3Bjb2Rlcy4gIEZyb20gR3V5IEhhcnJpcworCSAgKGd1eUBuZXRhcHAuY29tKS4KKworVHVlIE1hciAxNCAwMDo1Mjo1NyAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKKworCVNhdCBGZWIgMTEgMTc6MjI6NDEgMTk5NSAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBkaWR5bXVzLnJtaS5kZSkKKworCSogYWxwaGEtb3BjLmggKE9TRl9BU01DT0RFKTogZGVmaW5lCisJcHJpbnQgcGFsLWNvZGUgbmFtZXMgYXMgZGVmaW5lZCBpbiBBcHAgQyBvZiB0aGUKKwlBbHBoYSBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIE1hbnVhbAorCisJKiBhbHBoYS1kaXMuYzogY2xlYW5lZCB1cCBvdXRwdXQKKwlwcmludCBzdHlsaXplZCBjb2RlIGZvcm1zIGFzIGRlZmluZWQgaW4gQXBwIEEuNC4zIG9mIHRoZQorCUFscGhhIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgTWFudWFsCisKK1dlZCBNYXIgIDggMTU6MjE6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBBZGQgbmV3IG1pcHM0IGluc3RydWN0aW9ucy4gIERvbid0IHNldCBJTlNOX1JGRSBmb3IKKwlgcmZlJy4KKwkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyBhcmd1bWVudCB0eXBlcyAnaCcsICdSJywKKwknTicsIGFuZCAnTScuCisKK1dlZCBNYXIgIDggMDI6NTQ6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbTY4ay1kaXMuYyAob3Bjb2RlKTogTmV3IGZ1bmN0aW9uLiAgUmV0dXJucyBhZGRyZXNzIG9mIG9wY29kZQorCXRhYmxlIGVudHJ5IGdpdmVuIGluZGV4LCBldmVuIGlmIHRoZSBvcGNvZGUgdGFibGUgd2FzIHNwbGl0IHRvCisJd29yayBhcm91bmQgZ2NjIGJ1Z3MuCisJKHByaW50X2luc25fbTY4ayk6IENhbGwgb3Bjb2RlIGluc3RlYWQgb2YgcmVmZXJlbmNpbmcgbTY4a19vcGNvZGVzCisJZGlyZWN0bHkuCisJKEJSRUFLX1VQX0JJR19ERUNMKTogTWFrZSBzZWNvbmRhcnkgYXJyYXkgc3RhdGljIGFuZCBjb25zdC4KKwkocmVnX25hbWVzKTogTm93IGNvbnN0LgorCShwcmludF9pbnNuX2FyZyk6IEFycmF5cyBjYWNoZUZpZWxkTmFtZSBhbmQgbmFtZXMgbm93IGNvbnN0LgorCShwcmludF9pbmRleGVkKTogQXJyYXkgc2NhbGVzIG5vdyBjb25zdC4KKworVHVlIE1hciAgNyAxNjo0MToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHBwYy1vcGMuYzogU29ydCByZWNlbnRseSBhZGRlZCBpbnN0cnVjdGlvbnMgYnkgbWlub3Igb3Bjb2RlCisJbnVtYmVyIHdpdGhpbiBtYWpvciBvcGNvZGUgbnVtYmVyLgorCitNb24gTWFyICA2IDEwOjA0OjM2IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLWRpcy5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KKworRnJpIEZlYiAyNCAxOToxNTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmM6IENoYW5nZSBkbGkgdG8gdXNlIE1fRExJLCBhbmQgYWRkIGRsYS4KKworTW9uIEZlYiAyMCAyMzo1NDozOCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiAgQWRkIHc2NS1kaXMuby4KKworVGh1IEZlYiAxNiAxNzozNDo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIG1pcHMtb3BjLmM6IEFkZCByNDY1MCBtdWwgaW5zdHJ1Y3Rpb24uCisKK1dlZCBGZWIgMTUgMTU6NDU6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBBZGQgdWxkIGFuZCB1c2QgbWFjcm9zIGZvciB1bmFsaWduZWQgZG91YmxlIGxvYWQgYW5kCisgICAgICAgIHN0b3JlLgorCitUdWUgRmViIDE0IDEzOjE3OjM3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgNDAzR0Egb3Bjb2RlcyByZmNpLCBkY2NjaSwKKwltZmRjciwgbXRkY3IsIGljYnQsIGljY2NpLgorCitUaHUgRmViICA5IDEyOjI4OjEzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogaTk2MC1kaXMuYyAoc3RydWN0IHRhYmVudCwgc3RydWN0IHNwYXJzZV90YWJlbnQpOiBDaGFuZ2UgdGhlCisgICAgICAgIHNpZ25lZCBjaGFyIGZpZWxkcyB0byBzaG9ydHMsIG1vcmUgcG9ydGFibGUuCisKK1dlZCBGZWIgIDggMTc6Mjk6MjkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBpOTYwLWRpcy5jIChzdHJ1Y3QgdGFiZW50LCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IERlY2xhcmUgdGhlCisgICAgICAgIGNoYXIgZmllbGRzIGFzIHNpZ25lZCBjaGFycywgc2luY2UgdGhleSBtYXkgaGF2ZSBuZWdhdGl2ZSB2YWx1ZXMuCisKK01vbiBGZWIgIDYgMTA6NTI6MDYgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBpMzg2LWRpcy5jIChkaXMzODZfdHdvYnl0ZSk6IEFkZCBjcHVpZCwgRnJvbSBDaGFybGVzIEhhbm51bQorCSAgKG15Y3JvZnRAbmV0YnNkLm9yZykuCisKK01vbiBKYW4gMzAgMTI6Mzg6MDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSAiTG9nZywgRWQiIDxlbG9nZ0BlYS5jb20+OgorCSogcHBjLW9wYy5jIChleHRyYWN0X2JkbSk6IENvcnJlY3QgcGFyZW50aGV6aXNhdGlvbi4KKwkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogUHJpbnQgLmxvbmcgYmVmb3JlIHVucmVjb2duaXplZAorCXZhbHVlLgorCitUaHUgSmFuIDI2IDE4OjMyOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcHBjLW9wYy5jOiBDaGFuZ2VzIGJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4KKwk8ZWRlbHNvaG5AbWhwY2MuZWR1Pi4KKwkocG93ZXJwY19vcGVyYW5kcyk6IEFkZCBvcGVyYW5kcyBTUFJCQVQgYW5kIFNQUkcuIFNwbGl0IFRCUiBvdXQgb2YKKwlTUFIuCisJKEZYTV9NQVNLKTogRGVmaW5lLgorCShpbnNlcnRfdGJyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoZXh0cmFjdF90YnIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShYRlhGWE1fTUFTSywgWEZYTSk6IERlZmluZS4KKwkoWFNQUkJBVF9NQVNLLCBYU1BSR19NQVNLKTogRGVmaW5lLgorCShwb3dlcnBjX29wY29kZXMpOiBBZGQgaW5zdHJ1Y3Rpb25zIHRvIGFjY2VzcyBzcGVjaWFsIHJlZ2lzdGVycyBieQorCW5hbWUuICBBZGQgbXRjciBhbmQgbWZ0YnUuCisKK1R1ZSBKYW4gMTcgMTA6NTY6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jIChQMyk6IERlZmluZS4KKwkobWlwc19vcGNvZGVzKTogQWRkIG1hZCBhbmQgbWFkdS4KKworU3VuIEphbiAxNSAxNjozMjo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogY29uZmlndXJlLmluOiBBZGQgVzY1IHN1cHBvcnQuCisJKiBkaXNhc3NlbWJsZS5jOiBMaWtld2lzZS4KKwkqIHc2NS1vcGMuaCwgdzY1LWRpcy5jOiBOZXcgZmlsZXMuCisKK1dlZCBEZWMgMjggMjI6MTU6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciAyIGJpdAorCWltbWVkaWF0ZXMuCisKK1R1ZSBEZWMgMjAgMTE6MjU6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBBZGQgZGxpIGFzIGEgc3lub255bSBmb3IgbGkuCisKK1RodSBEZWMgIDggMTg6MjM6MzEgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBIYW5kbGUgY2FsbF9wYWwgaW5zdHJ1Y3Rpb24sIGFuZAorCXByaW50IHNvbWV0aGluZyBmb3IgcmVzZXJ2ZWQgb3Bjb2RlIHZhbHVlcywgZXZlbiBpZiBpdCB3b24ndAorCWFzc2VtYmxlIGFnYWluLgorCisJKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogV2hlbiBpbml0aWFsaXppbmcsIHNoaWZ0IHJpZ2h0CisJYW5kIG1hc2ssIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zIG9uIHRoZSBBbHBoYS4KKworCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIGNhc2UgJ0onKTogSGFuZGxlIGJ1c2NyIGFuZCBwY3IKKwljb250cm9sIHJlZ2lzdGVycy4KKworV2VkIE5vdiAyMyAyMjozNDo1MSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBzaC1vcGMuaCAobW92LmwgZ2JyKTogR2V0IGRpcmVjdGlvbiByaWdodC4KKwkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IE5ldyBmdW5jdGlvbi4KKwkocHJpbnRfaW5zbl9zaGwsIHByaW50X2luc25fc2gpOiBDYWxsIHByaW50X2luc25fc2h4IHRvCisJcHJpbnQgb3Bjb2RlcyB3aXRoIHJpZ2h0IGJ5dGUgb3JkZXIuCisKK1RodSBOb3YgIDMgMTk6MzI6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KKworCSogbnMzMmstZGlzLmMgKHN0cnVjdCBuczMya19vcHRpb24pOiBSZW5hbWVkIGZyb20gc3RydWN0IG9wdGlvbiwKKwl0byBhdm9pZCBjb25mbGljdHMgd2l0aCBnZXRvcHQuCisKK01vbiBPY3QgMzEgMTg6NDg6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBSZWFkIHRoZSBpbnN0cnVjdGlvbiB1c2luZworCWJmZF9nZXRiMzIsIHNvIHRoYXQgaXQgd29ya3Mgb24gYSBsaXR0bGUgZW5kaWFuIG9yIDY0IGJpdCBob3N0LgorCVJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgb3AuCisKK1R1ZSBPY3QgMjUgMTc6MDc6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBtaXBzLW9wYy5jOiBVc2Ugb3IgaW5zdGVhZCBvZiBhZGR1IGZvciBwc2V1ZG8tb3AgbW92ZSwgc2luY2UKKwlhZGR1IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGlmIC1taXBzMy4KKworV2VkIE9jdCAxOSAxMzo0MDoxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGEyOWstZGlzLmMgKHByaW50X3NwZWNpYWwpOiBBZGQgc3BlY2lhbCByZWdpc3RlciBuYW1lcyBkZWZpbmVkCisJb24gMjkwMzAsIDI5MDQwIGFuZCAyOTA1MC4KKwkocHJpbnRfaW5zbik6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdJJy4KKworV2VkIE9jdCAxMiAxMTo1OTo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIHRvcCBsZXZlbCBpbnN0YWxsLnNoIHNjcmlwdC4KKworV2VkIE9jdCAgNSAxOToxNjoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLWRpcy5jOiBSZXdyaXRlIHRvIHVzZSBiaXRmaWVsZHMsIHJhdGhlciB0aGFuIGEgdW5pb24sIHNvCisJdGhhdCBpdCB3b3JrcyBvbiBhIGxpdHRsZSBlbmRpYW4gaG9zdC4KKworVHVlIE9jdCAgNCAxMjoxNDoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KKworV2VkIFNlcCAyMSAxODo0OToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6ICJkYWJzIiBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIC1taXBzMy4KKworVGh1IFNlcCAxNSAxNjozMDoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBQcmludCB0aGUgb3Bjb2RlLgorCitXZWQgU2VwIDE0IDE3OjUyOjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogU2V0IFdSX3QgZm9yIHNjIGFuZCBzY2QuCisKK1N1biBTZXAgMTEgMjI6MzI6MTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtZGlzLmMgKHJlZ19uYW1lcyk6IFVzZSByMjYtcjIzIGZvciBhcmcwLWFyZzMuCisKK1R1ZSBTZXAgIDYgMTE6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBTZXQgSU5TTl9TVE9SRV9NRU1PUlkgZmxhZyBmb3IgYWxsIGluc3RydWN0aW9ucworCXdoaWNoIHN0b3JlIGEgdmFsdWUgaW50byBtZW1vcnkuCisKK1N1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKworCSogY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbiwgZGlzYXNzZW1ibGUuYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBBUk0uCisJKiBhcm0tZGlzLmMsIGFybS1vcGMuaDogTmV3IGZpbGVzLgorCitGcmkgQXVnICA1IDE0OjAwOjA1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKG5zMzJrLWRpcy5vKTogQWRkIGRlcGVuZGVuY3kuCisJKiBuczMyay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBEZWNsYXJlIGluaXRpYWxpemVkIGxvY2FsIGFzCisJc3RyaW5nLCBub3QgYXMgYXJyYXkgb2YgY2hhcnMuCisKK1RodSBKdWwgMjggMTg6MTQ6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKKworCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSAneCcuCisKKwkqIHNwYXJjLW9wYy5jOiBBZGRlZCBzcGFyY2xpdGUgZXh0ZW5kZWQgRlAgb3BlcmF0aW9ucywgYW5kCisJdmVyc2lvbnMgb2YgdjkgaW1wZGVwKiBpbnN0cnVjdGlvbnMgcGVybWl0dGluZyBzcGVjaWZpY2F0aW9uIG9mCisJdGhlIE9QRiBmaWVsZC4KKworVHVlIEp1bCAyNiAxNjozNjowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBpOTYwLWRpcy5jIChyZWdfbmFtZXMpOiBOb3cgY29uc3QuCisJKHN0cnVjdCBzcGFyc2VfdGFiZW50KTogTmV3IHR5cGUsIGNvcGllZCBmcm9tIGFycmF5IHR5cGUgaW4gbWVtCisJZnVuY3Rpb24uCisJKGN0cmwpOiBMb2NhbCBzdGF0aWMgYXJyYXkgY3RybF90YWIgbm93IGNvbnN0LgorCShjb2JyKTogTG9jYWwgc3RhdGljIGFycmF5IGNvYnJfdGFiIG5vdyBjb25zdC4KKwkobWVtKTogTG9jYWwgdmFyaWFibGVzIHJlZzEsIHJlZzIsIHJlZzMgbm93IHBvaW50IHRvIGNvbnN0LiAgTG9jYWwKKwlzdGF0aWMgdmFyaWFibGUgbWVtX3RhYiBubyBsb25nZXIgZXhwbGljaXRseSBpbml0aWFsaXplZC4gIENoYW5nZWQKKwltZW1faW5pdCB0byBjb25zdCBhcnJheSBvZiBzdHJ1Y3Qgc3BhcnNlX3RhYmVudC4KKwkocmVnKTogTG9jYWwgc3RhdGljIHZhcmlhYmxlIHJlZ190YWIgbm8gbG9uZ2VyIGV4cGxpY2l0bHkKKwlpbml0aWFsaXplZC4gIENoYW5nZWQgcmVnX2luaXQgdG8gY29uc3QgYXJyYXkgb2Ygc3RydWN0CisJc3BhcnNlX3RhYmVudC4KKwkoZWEpOiBMb2NhbCBzdGF0aWMgYXJyYXkgc2NhbGVfdGFiIG5vdyBjb25zdC4KKworCSogaTk2MC1kaXMuYyAocmVnKTogQWRkZWQgaTk2MEpYIGluc3RydWN0aW9ucyB0byByZWdfaW5pdCB0YWJsZS4KKwkoUkVHX01BWCk6IFVwZGF0ZWQuCisKK1R1ZSBKdWwgMTkgMjE6MDA6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQorCisJKiBjb25maWd1cmUuYmF0OiB0aGUgZGlzYXNzZW1iZXIgbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IKKwkib2JqZHVtcCAtZCIgdG8gd29yayBpbiBkamdwcC4KKworV2VkIEp1bCAxMyAxODowMTo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBuczMyay1kaXMuYzogRGVsZXRlZCBhbGwgY29kZSBpbiAiI2lmZGVmIEdEQiIuCisJKGludmFsaWRfZmxvYXQpOiBFbmFibGVkIGdlbmVyYWwgdmVyc2lvbiwgZG9lc24ndCByZXF1aXJlIHJ1bm5pbmcKKwlvbiBuczMyayBob3N0LiAgQ2hhbmdlZCB0byB0YWtlIGNoYXIqIGFyZ3VtZW50LCBhbmQgdGVzdCBmb3IKKwlleHBsaWNpdGx5IHNwZWNpZmllZCBzaXplcywgaW5zdGVhZCBvZiB1c2luZyBzaXplb2YoKSBvbiBob3N0IENQVQorCXR5cGVzLgorCShJTlZBTElEX0ZMT0FUKTogQ2FzdCBmaXJzdCBhcmd1bWVudC4KKwkob3B0X3UsIG9wdF9VLCBvcHRfTywgb3B0X0MsIG9wdF9TLCBsaXN0X1A1MzIsIGxpc3RfTTUzMiwKKwlsaXN0X1AwMzIsIGxpc3RfTTAzMik6IE5vdyBjb25zdC4KKwkob3B0bGlzdCwgbGlzdF9zZWFyY2gpOiBNYWRlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBub3cgcG9pbnQgdG8KKwljb25zdC4KKwkocHJpbnRfaW5zbl9hcmcpOiBDaGFuZ2VkIHN0YXRpYyBhcnJheSBvZiBvbmUtY2hhcmFjdGVyLXN0cmluZworCXBvaW50ZXJzIGludG8gYSBzdGF0aWMgY29uc3QgYXJyYXkgb2YgY2hhcmFjdGVyczsgZml4ZWQgc3ByaW50ZgorCXN0YXRlbWVudCBhY2NvcmRpbmdseS4KKworU3VuIEp1bCAxMCAwMDoyNzo0NyAxOTk0ICBJYW4gRGFsbCAgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSkKKworCSogb3Bjb2Rlcy9uczMyay1kaXMuYzogU2VtaS1uZXcgZmlsZS4gIEhhZCBhcHBhcmVudGx5IGJlZW4gZHJvcHBlZAorCWZyb20gZGlzdHJpYnV0aW9uLiBBIG5zMzJrLWRpcy5jIGZyb20gYSBwcmV2aW91cyBkaXN0cmlidXRpb24gaGFzCisJYmVlbiBicm91Z2h0IHVwIHRvIGRhdGUgYW5kIHN1cHBvcnRzIHRoZSBuZXcgaW50ZXJmYWNlLgorCisJKiBkaXNhc3NlbWJsZS5jOiBkZWZpbmUgQVJDSF9uczMyayBhbmQgYWRkIGNhc2UgYmZkX2FyY2hfbnMzMmsuCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGJmZF9uczMya19hcmNoIHRhcmdldCBzdXBwb3J0LgorCisJKiBNYWtlZmlsZS5pbjogYWRkIG5zMzJrLWRpcy5vIHRvIEFMTF9NQUNISU5FUy4KKwlBZGQgbnMzMmstZGlzLmMgdG8gQ0ZJTEVTLiBBZGQgZGVwZW5kZW5jaWVzIGZvciBuczMyay1kaXMuby4KKworV2VkIEp1biAyOSAyMjoxMDozNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogR2V0IDE2Yml0IGJyYW5jaAorCWRpc2Fzc2VtYmx5IHJpZ2h0LgorCitUdWUgSnVuIDI4IDEzOjIyOjA2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogaDgzMDAtZGlzLmMsIG1pcHMtZGlzLmM6IERvbid0IHVzZSB0cnVlIGFuZCBmYWxzZS4KKworVGh1IEp1biAyMyAxMjo1MzoxOSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCisKK1dlZCBKdW4gMjIgMTM6Mzg6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogQnVpbGQgYSBzdGF0aWMgaGFzaCB0YWJsZSBtYXBwaW5nCisJb3Bjb2RlcyB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2l0aCB0aGF0IG9wY29kZSwgdG8gc3BlZWQKKwlkaXNhc3NlbWJseSBvZiBsYXJnZSBmaWxlcy4gIEZyb20gcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaAorCUNhbXBiZWxsKS4KKworVHVlIEp1biAgNyAxMjo0OTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IEZpeCB0eXBvICh3YXMgbW9zdHljbGVhbikuCisKK1dlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQorCisJKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCisKK1NhdCBNYXkgIDcgMTc6MTM6MjEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFByaW50ICd4JyB0eXBlIG9wZXJhbmQgaW4gaGV4LgorCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IFByaW50IDE2Yml0IHJlbHMgY29ycmVjdGx5LgorCSogc2gtZGlzLmMgKHByaW50X2luc25fc2gpOiBEb24ndCByZWN1ciBlbmRsZXNzbHkgaWYgZGVsYXkKKwlzbG90IGluc24gaXMgaW4gYSBkZWxheSBzbG90LgorCSogejhrLW9wYy5oOiAocmVzZmxnKTogRml4IHBhdHRlcm5zLgorCSogaDg1MDAtb3BjLmggRml4IENSIGluc24gcGF0dGVybnMuCisKK0ZyaSBNYXkgIDYgMTQ6MzQ6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IFB1dCBQb3dlclBDIHZlcnNpb25zIG9mICJjbXAiIGFuZAorCSJjbXBsIiBiZWZvcmUgUE9XRVIgdmVyc2lvbnMsIHNvIHRoYXQgZ2FzIC1tYW55IHVzZXMgdGhlbS4KKworVGh1IEFwciAyOCAxODozMjozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiBkaXNhc3NlbWJsZS5jOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChPRklMRVMpOiBBZGQgZGlzYXNzZW1ibGUuby4KKwkoZGlzYXNzZW1ibGUubyk6IFByb3ZpZGUgZGVwZW5kZW5jaWVzOyBjb21waWxlIHdpdGggJChBUkNIREVGUykuCisJKiBjb25maWd1cmUuaW46IERlZmluZSBBUkNIREVGUyBpbiBNYWtlZmlsZS4gIENvZGUgdGFrZW4gZnJvbQorCWJpbnV0aWxzL2NvbmZpZ3VyZS5pbi4KKworCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogSWYgRl9BTElBUyBmbGFnIGlzIHNldCwgc2tpcCB0aGUKKwlvcGNvZGUgYmVpbmcgZXhhbWluZWQuCisKK1RodSBBcHIgMjEgMTc6MDg6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBBZGRlZCBSQUwsIFJBTSBhbmQgUkFTLgorCShpbnNlcnRfcmFsLCBpbnNlcnRfcmFtLCBpbnNlcnRfcmFzKTogTmV3IGZ1bmN0aW9ucy4KKwkocG93ZXJwY19vcGNvZGVzKTogVXNlIFJBTCBmb3IgbG9hZCB3aXRoIHVwZGF0ZSwgUkFNIGZvciBsbXcsIGFuZAorCVJBUyBmb3Igc3RvcmUgd2l0aCB1cGRhdGUuCisKK1NhdCBBcHIgMTYgMjM6NDE6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IENvcnJlY3QgZmNpci4gIEZyb20gRGF2aWQgRWRlbHNvaG4KKwkoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KS4KKworV2VkIEFwciAgNiAxNzoxMTo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMtb3BjLmMgKG1pcHNfb3Bjb2Rlcyk6IENvcnJlY3Qgb3BlcmFuZHMgb2YgIm5vciIgd2l0aCBhbgorCWltbWVkaWF0ZSBhcmd1bWVudC4KKworTW9uIEFwciAgNCAxNjozMDo0NiAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCAicmQgJWZwcnMsJWwwIi4KKworTW9uIEFwciAgNCAxMzoyMjowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IFRoZSBzaWduZWRwIGZpZWxkIGhhcyBiZWVuCisJcmVtb3ZlZCwgc28gZG9uJ3QgaW5pdGlhbGl6ZSBpdC4gIFNldCB0aGUgUFBDX09QRVJBTkRfU0lHTkVEIGZsYWcKKwlpbnN0ZWFkLiAgQWRkIG5ldyBvcGVyYW5kIFNJU0lHTk9QVC4KKwkocG93ZXJwY19vcGNvZGVzKTogRm9yIGxpcywgbGl1LCBhZGRpcywgYW5kIGNhdSB1c2UgU0lTSUdOT1BULgorCUJhc2VkIG9uIHBhdGNoIGZyb20gRGF2aWQgRWRlbHNvaG4gKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkuCisJKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IENoZWNrIFBQQ19PUEVSQU5EX1NJR05FRCByYXRoZXIKKwl0aGFuIHNpZ25lZHAgZmllbGQuCisKK1dlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBpMzg2LWRpcy5jIChzdHJ1Y3QgcHJpdmF0ZSk6ICBSZW5hbWVkIHRvIGRpc19wcml2YXRlLiBgcHJpdmF0ZScKKwlpcyBhIHJlc2VydmVkIHdvcmQgZm9yIGR5bml4IGNjLgorCitNb24gTWFyIDI4IDEzOjAwOjE1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSB0byByZWZlciB0byBiZmQvY29uZmlnLmJmZAorCXJhdGhlciB0aGFuIGJmZC9jb25maWd1cmUuaW4uCisKK01vbiBNYXIgMjggMTI6Mjg6MzAgMTk5NCAgRGF2aWQgRWRlbHNvaG4gIChlZGVsc29obkBucGFjLnN5ci5lZHUpCisKKwkqIHBwYy1vcGMuYzogRGVmaW5lIFBPV0VSMiBhcyBzaG9ydCBhbGlhcyBmbGFnLgorCShwb3dlcnBjX29wY29kZXMpOiBBZGQgUE9XRVIvMiBvcGNvZGVzIGxmcSosIHN0ZnEqLCBmY2lyW3pdLCBhbmQKKwlmc3FydC4KKworV2VkIE1hciAyMyAxMjoyMzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IERvbid0IHJlYWQgYSBzZWNvbmQgd29yZCBmb3IKKwlvcGNvZGVzIDAsIDEsIDIgYW5kIDMuCisKK1dlZCBNYXIgMTYgMTU6Mzc6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG02ODg4MS1leHQubyBmb3IgYmZkX202OGtfYXJjaC4KKworTW9uIE1hciAxNCAxNDo1Mzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG02ODg4MS1leHQuYzogUmVtb3ZlZDsgbm8gbG9uZ2VyIHVzZWQuCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKworCSogbTY4ay1kaXMuYyAoZXh0X2Zvcm1hdF82ODg4MSk6IERvbid0IGRlY2xhcmUuCisJKHByaW50X2luc25fbTY4ayk6IElmIGFuIGluc3RydWN0aW9uIHVzZXMgcGxhY2UgJ2knLCBpdCB1c2VzIGF0CisJbGVhc3QgZm91ciBmaXhlZCBieXRlcy4KKwkocHJpbnRfaW5zbl9hcmcpOiBEb24ndCBidW1wIHAgYnkgMiBmb3IgY2FzZSAnSScsIHBsYWNlICdpJy4gIEZvcgorCWV4dGVuZGVkIGZsb2F0LCBjb252ZXJ0IHRvIGRvdWJsZSB1c2luZyBmbG9hdGZvcm1hdF90b19kb3VibGUsIG5vdAorCWllZWVfZXh0ZW5kZWRfdG9fZG91YmxlLCBhbmQgZmV0Y2ggdGhlIGRhdGEgYmVmb3JlIGNvbnZlcnRpbmcgaXQuCisKK1R1ZSBNYXIgIDggMTg6MTI6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBJdCdzIHNxcnQucywgbm90IHNxcnQudy4gIEZyb20KKwlkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pLgorCitUdWUgRmViICA4IDE2OjU1OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBUaGUgUE9XRVIgdXNlcyBiZG5bbF1bYV0gd2hlcmUgdGhlCisJUG93ZXJQQyB1c2VzIGJkbnpbbF1bYV0uCisKK1R1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkaXMtYnVmLmMsIGkzODYtZGlzLmM6ICBJbmNsdWRlIHN5c2RlcC5oLgorCitNb24gRmViICA3IDE5OjIyOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChiZmRfcG93ZXJwY19hcmNoKTogVXNlIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vLgorCisJKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IE1hcmsgUE9XRVIgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZAorCWJ5IE1vdG9yb2xhIFBvd2VyUEMgNjAxIHdpdGggUFBDX09QQ09ERV82MDEuCisJKiBwcGMtZGlzLmMgKHByaW50X2luc25fYmlnX3Bvd2VycGMsIHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMpOgorCURpc2Fzc2VtYmxlIE1vdG9yb2xhIFBvd2VyUEMgNjAxIGluc3RydWN0aW9ucyBhcyB3ZWxsIGFzIG5vcm1hbAorCVBvd2VyUEMgaW5zdHJ1Y3Rpb25zLgorCitTdW4gRmViICA2IDA3OjQ1OjE3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpOTYwLWRpcy5jIChyZWcsIG1lbSk6IEp1c3QgdXNlIGEgc3RhdGljIGFycmF5IGluc3RlYWQgb2YKKwljYWxsaW5nIHhtYWxsb2MuCisKK1NhdCBGZWIgIDUgMDA6MDQ6MDIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEZvciAnPycgYW5kICdAJyBvbmx5IGFkanVzdCB0aGUKKwljb25kaXRpb24gbmFtZSBpbmRleCBpZiB0aGlzIGlzIGZvciBhIG5lZ2F0ZWQgY29uZGl0aW9uLgorCisJKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBObyBzcGFjZSBiZWZvcmUgJ0gnIG9wZXJhbmQuCisJRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGZvciAnSCcgb3BlcmFuZCBpcyBiYWNrd2FyZHMgZnJvbSBub3JtYWwKKwljYXNlICgwID09IGRvdWJsZSwgMSA9PSBzaW5nbGUpLiAgRm9yICc0JywgJzYnLCAnNycsICc5JywgYW5kICc4JworCW9wZXJhbmRzIChmbXB5YWRkIGFuZCBmbXB5c3ViKSwgaGFuZGxlIGJpemFycmUgcmVnaXN0ZXIKKwl0cmFuc2xhdGlvbiBjb3JyZWN0bHkgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm9ybWF0LgorCisJKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBEbyBub3QgZW1pdCBhIHNwYWNlIGFmdGVyICdGJworCW9yICdJJyBvcGVyYW5kcyBpZiB0aGUgbmV4dCBmb3JtYXQgc3BlY2lmaWVyIGlzICdNJyAoZmNtcAorCWNvbmRpdGlvbiBjb21wbGV0ZXIpLgorCitGZWIgIDQgMjM6Mzg6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBOZXcgb3BlcmFuZCB0eXBlIE1CRSB0byBoYW5kbGUgYQorCXNpbmdsZSBudW1iZXIgZ2l2aW5nIGEgYml0bWFzayBmb3IgdGhlIE1CIGFuZCBNRSBmaWVsZHMgb2YgYW4gTQorCWZvcm0gaW5zdHJ1Y3Rpb24uICBDaGFuZ2UgTkIgdG8gYWNjZXB0IDMyLCBhbmQgdHVybiBpdCBpbnRvIDA7CisJYWxzbyB0dXJuIDAgaW50byAzMiB3aGVuIGRpc2Fzc2VtYmxpbmcuICBTZXBlcmF0ZWQgU0ggZnJvbSBOQi4KKwkoaW5zZXJ0X21iZSwgZXh0cmFjdF9tYmUpOiBOZXcgZnVuY3Rpb25zLgorCShpbnNlcnRfbmIsIGV4dHJhY3RfbmIpOiBOZXcgZnVuY3Rpb25zLgorCShTQ19NQVNLKTogTWFzayBvdXQgU0EgYW5kIExLIGJpdHMuCisJKHBvd2VycGNfb3Bjb2Rlcyk6IENoYW5nZSAiY2FsIiB0byB1c2UgUlQsIEQsIFJBIHJhdGhlciB0aGFuIFJULAorCVJBLCBTSS4gIENoYW5nZSAibGl1IiBhbmQgImNhdSIgdG8gdXNlIFVJIHJhdGhlciB0aGFuIFNJLiAgTWFyaworCSJiY3RyIiBhbmQgImJjdHJsIiBhcyBhY2NlcHRlZCBieSBQT1dFUi4gIENoYW5nZSAicmx3aW1pIiwKKwkicmxpbWkiLCAicmx3aW1pLiIsICJybGltaS4iLCAicmx3aW5tIiwgInJsaW5tIiwgInJsd2lubS4iLAorCSJybGlubS4iLCAicmxtaSIsICJybG1pLiIsICJybHdubSIsICJybG5tIiwgInJsd25tLiIsICJybG5tLiIgdG8KKwl1c2UgTUJFIHJhdGhlciB0aGFuIE1CLiAgQWRkICJtZm1xIiBhbmQgIm10bXEiIFBPV0VSIGluc3RydWN0aW9ucy4KKwkocG93ZXJwY19tYWNyb3MpOiBEZWZpbmUgdGFibGUgb2YgbWFjcm8gZGVmaW5pdGlvbnMuCisJKHBvd2VycGNfbnVtX21hY3Jvcyk6IERlZmluZS4KKworCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBEb24ndCBza2lwIG9wdGlvbmFsIG9wZXJhbmRzCisJaWYgUFBDX09QRVJBTkRfTkVYVCBpcyBzZXQuCisKK1NhdCBKYW4gMjIgMjM6MTA6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBNYWtlIGJ1ZmZlciBiZmRfYnl0ZSBpbnN0ZWFkIG9mCisJY2hhci4gIFJldHJpZXZlIGNvbnRlbnRzIHVzaW5nIGJmZF9nZXRsMzIgaW5zdGVhZCBvZiBzaGlmdGluZy4KKworRnJpIEphbiAyMSAxOTowMTozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHBwYy1vcGMuYzogTmV3IGZpbGUuICBPcGNvZGUgdGFibGUgZm9yIFBvd2VyUEMsIGluY2x1ZGluZworCW9wY29kZXMgZm9yIFBPV0VSIChSUy82MDAwKS4KKwkqIHBwYy1kaXMuYzogTmV3IGZpbGUuICBQb3dlclBDIGFuZCBQb3dlciAoUlMvNjAwMCkgZGlzYXNzZW1ibGVyLgorCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBwcGMtZGlzLm8gYW5kIHBwYy1vcGMuby4KKwkoQ0ZJTEVTKTogQWRkIHBwYy1kaXMuYy4KKwkocHBjLWRpcy5vLCBwcGMtb3BjLm8pOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8gZm9yIGJmZF9yczYwMDBfYXJjaC4KKworTW9uIEphbiAxNyAyMDowNTo0OSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICdOJyBpbiBhc3NlbWJsZXIgdGVtcGxhdGUuCisJTm8gc3BhY2UgYmVmb3JlICd1JywgJ2YnLCBvciAnTicuCisKK1N1biBKYW4gMTYgMTQ6MjA6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IEFkZCBGSVhNRSBjb21tZW50IHJlZ2FyZGluZyByZWFkaW5nCisJZmFydGhlciB0aGFuIHdlIHNob3VsZC4KKworCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogVXNlIFliIGFuZCBZdiBmb3Igc2Nhc2IgYW5kIHNjYXNTLgorCitUaHUgSmFuICA2IDEyOjM4OjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc3BhcmMtZGlzLmMgbTY4ay1kaXMuYyBhbHBoYS1kaXMuYyBhMjlrLWRpcy5jOiBGaXggY29tbWVudHMuCisKK1dlZCBKYW4gIDUgMTE6NTY6MjEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBpOTYwLWRpcy5jIChwcmludF9pbnNuX2k5NjApOiBPbmx5IHJlYWQgd29yZDIgaWYgdGhlIGluc3RydWN0aW9uCisJbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLgorCitXZWQgTm92IDE3IDE3OjIwOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuaDogVXNlIG1hY3JvIGZvciBqIGluc3RydWN0aW9uLCB0byBzdXBwb3J0IFNWUjQgUElDLgorCVJlbW92ZWQgdCxBIGNhc2UgZm9yIGxhOyBhbHdheXMgdXNlIHQsQShiKSBjYXNlLgorCitNb24gTm92ICA4IDEyOjM3OjM2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCUZyb20gVGVkIExlbWVuIDxtZWxsb25AcGVwcGVyLm5jZC5jb20+CisJKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAnaycuCisJKiBtaXBzLW9wYy5jOiBNYWtlIGNhY2hlIHVzZSBrLCBub3QgdC4KKworU3VuIE5vdiAgNyAyMzo1MjozNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFscGhhLW9wYy5oLCBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6ICBBZGQKKwlGTE9BVF9NRU1PUllfRk9STUFUX0NPREUsIEZMT0FUX0JSQU5DSF9GT1JNQVRfQ09ERSwgY29ycmVjdAorCUZMT0FUX0ZPUk1BVF9DT0RFIHRvIHB1dCBvdXQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZXMuCisKK01vbiBOb3YgIDEgMTg6MTc6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBVc2UgbWFjcm9zIGZvciBqYWwgdmFyaWFudHMsIHRvIHN1cHBvcnQgU1ZSNCBQSUMuCisKK1RodSBPY3QgMjggMTc6NDI6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogVXNlIDB4JTA4eCwgbm90IDB4JTh4LgorCitXZWQgT2N0IDI3IDExOjQ4OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYyAoZHNsbCwgZHNyYSwgZHNybCk6IEFkZGVkICc+JyBjYXNlcyBmb3Igc2hpZnQgY291bnRzCisJbGFyZ2VyIHRoYW4gMzIuICBNb3ZlZCBkc3h4MzIgdmFyaWFudHMgZmlyc3QgZm9yIGRpc2Fzc2VtYmxlci4KKworTW9uIE9jdCAyNSAxMTozMzoxNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiB6OGtnZW4uYywgejhrLW9wYy5oOiBBZGQgZnVsbCBsZGEgaW5mb3JtYXRpb24uCisKK1R1ZSBPY3QgMTkgMTI6Mzk6MjUgMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0Bjcy51dGFoLmVkdSkKKworCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRG8gbm90IGVtaXQgYSBzcGFjZSBhZnRlcgorCW1vdmIgaW5zdHJ1Y3Rpb25zLiAgQW55IG5lY2Vzc2FyeSBzcGFjZSB3aWxsIGJlIGVtaXR0ZWQgYnkKKwl0aGUgY29kZSB0byBoYW5kbGUgbnVsbGlmaWNhdGlvbiBjb21wbGV0ZXJzLgorCitXZWQgT2N0IDEzIDE2OjE5OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYzogTW92ZWQgbC5kIGRvd24gc28gdGhhdCBpdCBkaXNhc3NlbWJsZXMgYXMgbGRjMS4KKworRnJpIE9jdCAgOCAwMjozNDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFscGhhLW9wYy5oOiAgQWRkIGxkbF9sLCBmaXggdHlwbyBmb3IgbGRxX3UuCisJKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6ICBBZGQgY29kZSBmb3IgUEFMX0ZPUk1BVF9DT0RFLgorCitUdWUgT2N0ICA1IDE3OjQ3OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYzogQ29ycmVjdCBsd3Ugb3Bjb2RlIHZhbHVlIChib29rIGhhZCBpdCB3cm9uZykuCisKK1RodSBTZXAgMzAgMTE6MjY6MTggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogejhrLWRpcy5jIChGRVRDSF9EQVRBKTogZ2V0IGp1c3QgdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhLgorCSh1bnBhY2tfaW5zdHIpOiBDb3BlIHdpdGggQVJHX0lNTTRNMSB0eXBlIGluc3RydWN0aW9ucy4KKworV2VkIFNlcCAyOSAxNjoyNDo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIG04OGstZGlzLmMgKG04OGtkaXMpOiBjb21tZW50IGNoYW5nZS4gIFJlbW92ZSBzcGFjZSBhZnRlcgorCSAgcHJpbnRpbmcgbW5lbW9uaWMuCisJICAocHJpbnRvcCk6IGhhbmRsZSBuZXcgYXJnIHR5cGVzIERFQyBhbmQgWFJFRyBmb3IgbTg4MTEwLgorCitUdWUgU2VwIDI4IDE5OjIwOjE2IDE5OTMgIEplZmZyZXkgQSBMYXcgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICd6JyBvcGVyYW5kCisJdHlwZSBmb3IgYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3Nlcy4gIERlbGV0ZSBzcGVjaWFsCisJImJsZSIgYW5kICJiZSIgY29kZSBpbiAnVycgb3BlcmFuZCBjb2RlLgorCitGcmkgU2VwIDI0IDE0OjA4OjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYzogU2V0IGhhemFyZCBpbmZvcm1hdGlvbiBjb3JyZWN0bHkgZm9yIGJyYW5jaAorCWxpa2VseSBpbnN0cnVjdGlvbnMuCisKK0ZyaSBTZXAgMTcgMDQ6NDE6MTcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSksIGFscGhhLW9wYy5oOiAgRml4IGJ1Z3MsIHVzZQorCWluZm8tPmZwcmludGZfZnVuYyBmb3IgcHJpbnRpbmcgYW5kIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyBmb3IKKwlhZGRyZXNzIG91dHB1dC4KKworV2VkIFNlcCAxNSAxMjoxMjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHMtb3BjLmM6IFNldCBJTlNOX1RSQVAgZm9yIHRYWCBpbnN0cnVjdGlvbnMuCisKK1RodSBTZXAgIDkgMTA6MTE6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6CisJQ29ycmVjdGVkIHNlY29uZCBjYXNlIG9mICJiIiBmb3IgZGlzYXNzZW1ibGVyLgorCitUdWUgU2VwICA3IDE0OjI1OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1kaXMuYywgbTg4ay1kaXMuYzogRG9uJ3QgaW5jbHVkZSBsaWJiZmQuaC4gIENoYW5nZWQgY2FsbHMKKwl0byBCRkQgc3dhcHBpbmcgcm91dGluZXMgdG8gY29ycmVzcG9uZCB0byBCRkQgbmFtZSBjaGFuZ2VzLgorCitUaHUgU2VwICAyIDEwOjM1OjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYzogQ2hhbmdlIGRpdiBtYWNoaW5lIGluc3RydWN0aW9uIHRvIGJlIHoscyx0IHJhdGhlcgorCXRoYW4gcyx0LiAgQ2hhbmdlIGRpdiBtYWNybyB0byBiZSBkLHYsdCByYXRoZXIgdGhhbiBkLHMsdC4KKwlMaWtld2lzZSBmb3IgZGl2dSwgZGRpdiwgZGRpdnUuICBBZGRlZCB6LHMsdCBjYXNlIGZvciBkcmVtLCBkcmVtdSwKKwlyZW0gYW5kIHJlbXUgd2hpY2ggZ2VuZXJhdGVzIG9ubHkgdGhlIGNvcnJlc3BvbmRpbmcgZGl2CisJaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgYXNzZW1ibGVyLAorCXdoaWNoIG9ubHkgZ2VuZXJhdGVzIHRoZSBzaW1wbGUgbWFjaGluZSBpbnN0cnVjdGlvbiB3aGVuIGFuCisJZXhwbGljaXQgZGVzdGluYXRpb24gb2YgJDAgaXMgdXNlZC4KKwkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICd6JyAoYWx3YXlzIHJlZ2lzdGVyIHplcm8pLgorCitUaHUgQXVnIDI2IDE3OjQxOjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYzogRnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOiBTZXQKKwlXUl8zMSBoYXphcmQgZm9yIGJhbCwgYmdlemFsLCBibHR6YWwuCisKK1RodSBBdWcgMjYgMTc6MjA6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFVzZSBwcmludCBmdW5jdGlvbgorCWZyb20gd2l0aGluIHRoZSBkaXNhc3NlbWJsZV9pbmZvLCBub3QgZnByaW50Zl9maWx0ZXJlZC4KKworV2VkIEF1ZyAyNSAxMzo1MTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IEhhbmRsZSAnfCcgbGlrZSAnPicuICAoRnJvbSBKZWZmCisJTGF3LCBsYXdAY3MudXRhaC5lZHUuKQorCitNb24gQXVnIDIzIDEyOjQ0OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy1vcGMuYyAoImFic3UiKTogUmVtb3ZlZC4KKwkoImRhYnMiKTogQWRkZWQuCisKK0ZyaSBBdWcgMjAgMTA6NTI6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBBZGRlZCByNjAwMCBhbmQgcjQwMDAgaW5zdHJ1Y3Rpb25zIGFuZCBtYWNyb3MuCisJQ2hhbmdlZCBoYXphcmQgaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZW1vcnkgbG9hZAorCWRlbGF5cyBhbmQgY29wcm9jZXNzb3IgbG9hZCBkZWxheXMuCisKK1dlZCBBdWcgMTggMTU6Mzk6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBsaS5kIHVzZXMgIlQsTCIsIG5vdCAiUyxGIi4gIEFkZGVkIGxpLnMuCisKK1R1ZSBBdWcgMTcgMDk6NDQ6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IERvbid0IHBhc3MgY3B1IHRvIGNvbmZpZy5iZmQuCisKK1R1ZSBBdWcgMTcgMTI6MjM6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtODhrLWRpcy5jIChtODhrZGlzKTogTWFrZSBjbGFzcyB1bnNpZ25lZC4KKworVGh1IEF1ZyAxMiAxNTowODoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogT25lIGJyYW5jaCBmb3JtYXQgY2FzZSB3YXMKKwltaXNzaW5nIHRoZSBpbnN0cnVjdGlvbiBuYW1lLgorCitXZWQgQXVnIDExIDE5OjI5OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IFJlbmFtZWQgZnJvbSBESVNfTElCUy4KKwlBZGQgdGhlIGFyY2gtc3BlY2lmaWMgYXV4aWxpYXJ5IGZpbGVzLgorCShPRklMRVMpOiBSZW1vdmUgdGhlIGFyY2gtc3BlY2lmaWMgYXV4aWxpYXJ5IGZpbGVzCisJYW5kIHVzZSBCRkRfTUFDSElORVMgaW5zdGVhZCBvZiBESVNfTElCUy4KKwkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRF9NQUNISU5FUyBiYXNlZCBvbiAtLXdpdGgtdGFyZ2V0cyBvcHRpb24uCisKK1RodSBBdWcgMTIgMTI6MDQ6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBBZGRlZCBsd2MxIEUsQShiKSB0byBnbyB3aXRoIGx3YzEgVCxBKGIpLiAgU2ltaWxhcmx5CisJZm9yIHN3YzEuCisKK1N1biBBdWcgIDggMTU6MDk6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNwYXJjLW9wYy5jOiBDaGFuZ2UgQ09OU1QgdG8gY29uc3QgdG8gZGVhbCB3aXRoIGdjYworCS1EY29uc3Q9X19jb25zdCAtdHJhZGl0aW9uYWwuCisKK0ZyaSBBdWcgIDYgMTA6NTg6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6IFRvb2sKKwljb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgb3V0IG9mICNpZiAwLCBhbmQgbWFkZSB0aGVtIHVzZSBuZXcKKwlhcmd1bWVudCB0eXBlICJDIi4KKworVGh1IEF1ZyAgNSAxNzoxMTowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3BhcmMtZGlzLmM6IEluY2x1ZGUgYW5zaWRlY2wuaCBiZWZvcmUgb3Bjb2Rlcy9zcGFyYy5oLgorCitGcmkgSnVsIDMwIDE4OjQ4OjE1IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBzcGFyYy1vcGMuYzogIEFkZCBGX0pTUiwgRl9VTkJSLCBvciBGX0NPTkRCUiBmbGFncyB0byBlYWNoIGJyYW5jaAorCWluc3RydWN0aW9uLCBmb3IgdXNlIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCisKKwkqIHNwYXJjLWRpcy5jIChTRVgpOiAgQWRkIHNpZ24gZXh0ZW5zaW9uIG1hY3JvLiAgUmVwbGFjZSBtYW55CisJaGFuZC1jb2RlZCBzaWduIGV4dGVuc2lvbnMgdGhhdCBkZXBlbmRlZCBvbiAzMi1iaXQgaG9zdCBpbnRzLgorCUZJWE1FLCB3ZSBzdGlsbCBkZXBlbmQgb24gYmlnLWVuZGlhbiBob3N0IGJpdGZpZWxkIG9yZGVyaW5nLgorCShzcGFyY19wcmludF9pbnNuKTogIFNldCB0aGUgaW5zbl9pbmZvX3ZhbGlkIGZpZWxkLCBhbmQgdGhlCisJb3RoZXIgZmllbGRzIHRoYXQgZGVzY3JpYmUgdGhlIGluc3RydWN0aW9uIGJlaW5nIHByaW50ZWQuCisKK1R1ZSBKdWwgMjcgMTc6MDQ6NTggMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBzcGFyYy1vcGMuYyAoY2FsbCk6IEFjY2VwdCBhbGwgNiBhZGRyZXNzaW5nIG1vZGVzIHZhbGlkIGZvcgorCWBqbXAnIGluc3RlYWQgb2YganVzdCBvbmUgb2YgdGhlbS4KKworV2VkIEp1bCAyMSAxMTo0MzozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogaHBwYS1kaXMuYzogTW92ZSBmbG9hdGluZyByZWdpc3RlcnMgZnJvbSByZWdfbmFtZXMgdG8gZnBfcmVnX25hbWVzLgorCShmcHV0X2ZwX3JlZ19yKTogUmVuYW1lZCBmcm9tIGZwdXRfcmVnX3IuCisJKGZwdXRfZnBfcmVnKTogTmV3IGZ1bmN0aW9uLgorCShwcmludF9pbnNuX2hwcGEpOiBVc2UgZnB1dF9mcF9yZWd7LF9yfSB3aGVyZSBhcHByb3ByaWF0ZS4KKworCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlcyAnYScsICdkJyk6IFByaW50IHNwYWNlIGFmdGVyd2FyZHMuCisKKwkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSwgY2FzZSAnZCcpOiBVc2UgR0VUX0NPTkQgbm90IEdFVF9GSUVMRC4KKworTW9uIEp1bCAxOSAxMzo1MjoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogVXNlIGV4dHJhY3RfNXJfc3RvcmUgZm9yICdyJy4KKworCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICc+Jyk6IElmIG5leHQgY2hhcmFjdGVyIGlzICduJywKKwlkb24ndCBvdXRwdXQgYSBzcGFjZS4KKworCSogaHBwYS1kaXMuYyAoZmxvYXRfZm9ybWF0X25hbWVzKTogMTAgaXMgdW5kZWZpbmVkLCBhbmQgMTEgaXMgcXVhZC4KKworU3VuIEp1bCAxOCAxNjozMDowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCisKKwkqIG1pcHMtb3BjLmM6IE5ldyBmaWxlLCBjb250YWluaW5nIG9wY29kZSB0YWJsZSBmcm9tCisJLi4vaW5jbHVkZS9vcGNvZGUvbWlwcy5oLgorCSogTWFrZWZpbGUuaW46IEFkZCBpdC4KKworVGh1IEp1bCAxNSAxMjozNzowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG04OGstZGlzLmM6IE5ldyBmaWxlLCBtb3ZlZCBpbiBmcm9tIGdkYiBhbmQgY2hhbmdlZCB0byB1c2UgdGhlCisJbmV3IGRpcy1hc20uaCBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLgorCSogTWFrZWZpbGUuaW4gKERJU19MSUJTKTogQWRkZWQgbTg4ay1kaXMuby4KKwkobTg4ay1kaXMubyk6IE5ldyB0YXJnZXQuCisKK1R1ZSBKdWwgMTMgMTA6MDQ6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZywgX3ByaW50X2luc25fbWlwcyk6IE1hZGUgcG9pbnRlciB0bworCWFyZ3VtZW50IHN0cmluZyBjb25zdCBjaGFyICogdG8gY29ycmVzcG9uZCB0byBvcGNvZGUvbWlwcy5oLgorCitUdWUgSnVsICA2IDE1OjE4OjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy1kaXMuYzogVXBkYXRlZCB0byBhY2NvdW50IGZvciBuYW1lIGNoYW5nZXMgaW4gbmV3IHZlcnNpb24KKwlvZiBvcGNvZGUvbWlwcy5oLgorCSogTWFrZWZpbGUuaW46IEFkZGVkIGhlYWRlciBmaWxlIGRlcGVuZGVuY2llcy4KKworU2F0IEp1bCAgMyAyMzo0Nzo1NiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQ29ycmVjdCBmZXRjaGluZyBvZiBpbnN0cnVjdGlvbi4KKworVGh1IEp1bCAgMSAxMjoyMzozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbTY4ay1kaXMuYyAoTkVYVFdPUkQsIE5FWFRMT05HKTogVXNlICgoeCkgXiAweDgwMDApIC0gMHg4MDAwIHRvIHNpZ24KKwlleHRlbmQsIHJhdGhlciB0aGFuIHNoaWZ0cy4KKworU3VuIEp1biAyMCAyMDo1Njo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFVuZG8gMTUgSnVuZSBjaGFuZ2UuCisKK0ZyaSBKdW4gMTggMTQ6MTU6MTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogIENoYW5nZSByZXR1cm4gdmFsdWUgdG8gYnl0ZSBjb3VudAorCW9yIGVycm9yIGNvZGUuCisJKiBtNjhrLWRpcy5jOiAgUmUtd3JpdGUgdG8gZGV0ZWN0IGludmFsaWQgb3BlcmFuZHMgYmVmb3JlCisJcHJpbnRpbmcgYW55dGhpbmcsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyB0aGUgc2FtZSB3YXkgd2UKKwloYW5kbGUgaW52YWxpZCBvcGNvZGVzLgorCitUaHUgSnVuIDE3IDE1OjAxOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIHNoLWRpcy5jLCBzaC1vcGMuaDogVW5kZXJzdGFuZCBzb21lIG1vcmUgb3Bjb2Rlcy4KKworV2VkIEp1biAxNiAxMzo0ODowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgPGFuc2lkZWNsLmg+IGFuZCBzeXNkZXAuaCBiZWZvcmUgb3RoZXIKKwloZWFkZXIgZmlsZXMuCisKK1R1ZSBKdW4gMTUgMjE6NDU6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBzcGFyYy1kaXMuYzogRG9uJ3QgZGVjbGFyZSBxc29ydCwgc2luY2Ugc3lzZGVwLmggbWlnaHQuCisKKwkqIGNvbmZpZ3VyZS5pbjogRG8gbWFrZSBzeXNkZXAuaCBsaW5rLgorCSogTWFrZWZpbGUuaW46IFNlYXJjaCAuLi9pbmNsdWRlLiAgRG9uJ3Qgc2VhcmNoIC4uL2JmZC4KKworVHVlIEp1biAxNSAxMzozNjoxMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJQ2hhbmdlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6CisJKiBocHBhLWRpcy5jOiBGaXggdHlwby4gICdhJyBhbmQgJ2QnIHdlcmUgcmV2ZXJzZWQuCisJRG8gbm90IHByaW50IGEgc3BhY2UgYmVmb3JlIHRoZSBjb21wbGV0ZXJzIHNwZWNpZmllZCBieQorCSdhJyBhbmQgJ2QnLgorCitGcmkgSnVuIDExIDE4OjQwOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jOiBObyBsb25nZXIgbmVlZCB0byBib21iIG91dCBpZiBIT1NUXzY0X0JJVCBpcworCWRlZmluZWQsIHNpbmNlIGdkYiBoYXMgYmVlbiBmaXhlZC4KKworCUNoYW5nZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgorCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogTGFzdCBhcmd1bWVudCB0byBmcHV0X3JlZywKKwlmcHV0X3JlZ19yLCBmcHV0X2NyZWcsIGZwdXRfY29uc3QsIGFuZCBmcHV0c19maWx0ZXJlZCBzaG91bGQKKwliZSBhICpkaXNhc3NlbWJsZV9pbmZvLCBub3QgYSAqRklMRS4KKwkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ2QnLCAnIScsIGFuZCAnYScuCisJKiBocHBhLWRpcy5jOiBTdXBwb3J0ICdzJyB0byBleHRyYWN0IGEgMiBiaXQgc3BhY2UgcmVnaXN0ZXIuCisJKiBocHBhLWRpcy5jOiBEZWxldGUgY2FzZXMgd2hpY2ggYXJlIG5vIGxvbmdlciBuZWVkZWQuCisKK0ZyaSBKdW4gMTEgMDc6NTM6NDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIG02OGstZGlzLmMgKHByaW50X2luc25fe202OGssYXJnfSk6IEFkZCBNTVUgY29kZXMuCisKK1R1ZSBKdW4gIDggMTI6MjU6MDEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogaDgzMDAtZGlzLmM6IE5ldyBmaWxlLCByZW1vdmVkIGZyb20gYmZkL2NwdS1oODMwMC5jLCB3aXRoCisJSDgvMzAwLUggb3Bjb2Rlcy4KKworTW9uIEp1biAgNyAxMjo1ODo0OSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDU0VBUkNIKTogQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCisJKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgorCitUaHUgSnVuICAzIDE1OjU2OjQ5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIFBhdGNoZXMgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KKwkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ0knLCAnSicsIGFuZCAnSycgaW4gb3V0cHV0CisJdGVtcGxhdGVzIGZvciAxLjEgRlAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbnMuCisKK1R1ZSBNYXkgMjUgMTM6MDU6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBoODUwMC1kaXMuYyAocHJpbnRfaW5zbl9oODUwMCk6IEFkZHJlc3MgYXJndW1lbnQgaXMgdHlwZQorCWJmZF92bWEuCisJKiB6OGstZGlzLmMgKHByaW50X2luc25fejhrLCBwcmludF9pbnNuX3o4MDAxLCBwcmludF9pbnNuX3o4MDAyKToKKwlEaXR0by4KKworCSogaDg1MDAtb3BjLmggKGFkZHJfY2xhc3NfdHlwZSk6IE5vIGNvbW1hIGF0IGVuZCBvZiBlbnVtZXJhdG9yLgorCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlLCBzaF9hcmdfdHlwZSk6IERpdHRvLgorCisJKiBzcGFyYy1kaXMuYyAoY29tcGFyZV9vcGNvZGVzKTogTW92ZSBzdGF0aWMgZGVjbGFyYXRpb24gdG8KKwl0b3AtbGV2ZWwuCisKK0ZyaSBNYXkgMjEgMTQ6MTc6MzcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEltcGxlbWVudCAnbicgYXJndW1lbnQgZm9yIHVuaW1wCisJaW5zdHJ1Y3Rpb24sIHJlbW92ZSB1bmltcCBoYWNrIGZyb20gJ2wnIGFyZ3VtZW50LgorCitXZWQgTWF5IDE5IDE1OjM1OjU0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6ICBVc2UgdW5zaWduZWQgY2hhciB0byBtYWtlIGFuY2llbnQgZ2NjJ3MKKwloYXBweS4KKworRnJpIE1heSAxNCAxNToyMjo0NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgorCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ0MnIGZvciBnZW5lcmFsIGNvcHJvY2Vzc29yCisJaW5zdHJ1Y3Rpb25zLgorCitGcmkgTWF5IDE0IDAwOjA5OjE0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogaHBwYS1kaXMuYzogSW5jbHVkZSBkaXMtYXNtLmggYmVmb3JlIHN5c2RlcC5oLiAgQ2hhbmdlZCBzb21lCisJYXJyYXlzIG9mIHN0cmluZyBwb2ludGVycyB0byAyLWQgYXJyYXlzIG9mIGNoYXJzLCB0byBzYXZlCisJc3BhY2UuCisKK1RodSBNYXkgIDYgMjA6NTE6MTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGEyOWstZGlzLmMsIGFscGhhLWRpcy5jLCBpOTYwLWRpcy5jLCBzcGFyYy1kaXMuYywgejhrLWRpcy5jOgorCUNhc3Qgc2Vjb25kIGFyZyB0byByZWFkX21lbW9yeV9mdW5jIHRvICJiZmRfYnl0ZSAqIiwgYXMgbmVjZXNzYXJ5LgorCitUdWUgTWF5ICA0IDIwOjMxOjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogaHBwYS1kaXMuYzogTmV3IGZpbGUgZnJvbSBVdGFoLCBhZGFwdGVkIHRvIG5ldyBkaXNhc3NlbWJsZXIKKwljYWxsaW5nIGludGVyZmFjZS4KKwkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGl0LgorCitNb24gQXByIDI2IDE4OjE3OjQyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzaC1kaXMuYywgc2gtb3BjLmg6IE5ldyBmaWxlcy4KKworRnJpIEFwciAyMyAxODo1MToyMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogYWxwaGEtZGlzLmMsIGFscGhhLW9wYy5oOiBOZXcgZmlsZXMuCisKK1R1ZSBBcHIgIDYgMTI6NTQ6MDggMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzLWRpcy5jOiBTaWduIGV4dGVuZCAnaicgYW5kICdiJyBhcmd1bWVudHMsIGRlbHRhIGlzIGEgc2lnbmVkCisJdmFsdWUuCisKK01vbiBBcHIgIDUgMTc6Mzc6MzcgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHNwYXJjLWRpcy5jOiBNYWtlICJ0YSIgdGhlIGRlZmF1bHQgdHJhcCBpbnN0cnVjdGlvbiwgInQiIHRoZSBhbGlhcy4KKworRnJpIEFwciAgMiAwNzoyNDoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGEyOWstZGlzLmMsIHNwYXJjLWRpcy5jLCBzcGFyYy1vcGMuYzogVXNlIENPTlNUIHJhdGhlciB0aGFuCisJY29uc3QuCisKK1RodSBBcHIgIDEgMTE6MjA6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHNwYXJjLWRpcy5jOiBVc2UgZnByaW50Zl9mdW5jIGEgZmV3IHBsYWNlcyB3aGVyZSBJIGZvcmdvdCwKKwlhbmQgZG91YmxlIHBlcmNlbnQgc2lnbnMgYSBmZXcgcGxhY2VzLgorCisJKiBhMjlrLWRpcy5jLCBpOTYwLWRpcy5jOiBOZXcsIG1lcmdlZCBmcm9tIGdkYiBhbmQgYmludXRpbHMuCisKKwkqIGkzODYtZGlzLmMsIG02OGstZGlzLmMsIG1pcHMtZGlzLmMsIHNwYXJjLWRpcy5jOgorCVVzZSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgbm90IHByaW50X2FkZHJlc3MuCisKKwkqIGRpcy1idWYuYyAoZ2VuZXJpY19wcmludF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgorCitXZWQgTWFyIDMxIDEwOjA3OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIHNwYXJjLWRpcy5jLgorCXNwYXJjLWRpcy5jOiBOZXcgZmlsZSwgbWVyZ2VzIGJpbnV0aWxzIGFuZCBnZGIgdmVyc2lvbnMgYXMgZm9sbG93czoKKwlGcm9tIEdEQjoKKwkgICAgQWRkIGBhZGQnIGluc3RydWN0aW9uIHRvIHRoZSBzZXQgdGhhdCBnZXQgY2hlY2tlZAorCSAgICBmb3IgYSBwcmVjZWRpbmcgYHNldGhpJyBpbiBvcmRlciB0byBwcmludCBhbiBhYnNvbHV0ZSBhZGRyZXNzLgorCSAgICAqIChwcmludF9pbnNuKTogIERpc2Fzc2VtYmx5IHByZWZlcnMgcmVhbCBpbnN0cnVjdGlvbnMuCisJICAgIChpc19kZWxheWVkX2JyYW5jaCk6ICBTcGVlZCB1cC4KKwkgICAgKiBzcGFyYy1vcGNvZGUuaDogQWRkIEFMSUFTIGJpdCB0byBhbGlhc2VzLiAgRml4IHVwIG9wY29kZSB0YWJsZXMuCisJICAgIFN0aWxsIG1pc3Npbmcgc29tZSBmbG9hdCBvcHMsIGFuZCBuZWVkcyB0ZXN0aW5nLgorCSAgICAqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiBFbGltaW5hdGUgJ3NldCcgdGVzdCwgc3Vic3VtZWQgYnkKKwkgICAgRl9BTElBUy4gIFVzZSBwcmludGYsIG5vdCBmcHJpbnRmLCB3aGVuIG5vdCBwYXNzaW5nIGEgZmlsZQorCSAgICBwb2ludGVyLi4uCisJICAgIChjb21wYXJlX29wY29kZXMpOiBDaGVjayB0aGF0IGlkZW50aWNhbCBpbnN0cnVjdGlvbnMgaGF2ZQorCSAgICBpZGVudGljYWwgb3Bjb2RlcywgY29tcGxhaW4gb3RoZXJ3aXNlLgorCUZyb20gYmludXRpbHM6CisJICAgICogTmV3ICdtJyBhcmcuCisJICAgICogSW5jbHVkZSByZWdfbmFtZXMuCisJRnJvbSBuZWl0aGVyOgorCSAgICBVc2UgZGlzLWFzbS5oL3JlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgorCitXZWQgTWFyIDMxIDIwOjQ5OjA2IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogaDg1MDAtZGlzLmMsIGkzODYtZGlzLmMsIG02OGstZGlzLmMsIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6CisJICBkZWxpYmVyYXRlbHkgcmV0dXJuIG5vbi16ZXJvIHRvIHNldGptcCBmcm9tIGxvbmdqbXAuICBPdGhlcndpc2UKKwkgIHRoaXMgY29kZSBmYWlscyB0byBjb21waWxlLgorCitXZWQgTWFyIDMxIDE3OjA0OjMxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIG02OGstZGlzLmM6ICBGaXggcHJvdG90eXBlIGZvciBmZXRjaF9hcmcoKS4KKworV2VkIE1hciAzMSAxMDowNzowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGlzLWJ1Zi5jOiBOZXcgZmlsZSwgZm9yIG5ldyByZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KKwlNYWtlZmlsZS5pbiAoT0ZJTEVTKTogSW5jbHVkZSBpdC4KKwltNjhrLWRpcy5jLCBpMzg2LWRpcy5jLCBoODUwMC1kaXMuYywgbWlwcy1kaXMuYywgejhrLWRpcy5jOgorCVVzZSBuZXcgcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCisKK01vbiBNYXIgMjkgMTQ6MDI6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogR2V0IHNpZ24gb2YgZnAgb2Zmc2V0cyByaWdodC4KKwkqIGg4NTAwLW9wYy5oOiBGaXggY291cGxlIG9mIG9wY29kZXMuCisKK1dlZCBNYXIgMjQgMDI6MDM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgZHZpICYgaW5zdGFsbGNoZWNrIHRhcmdldHMKKworTW9uIE1hciAyMiAxODo1NTowNCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIGg4NTAwLWRpcy5jLgorCitGcmkgTWFyIDE5IDE0OjI3OjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBoODUwMC1kaXMuYywgaDg1MDAtb3BjLmg6IE5ldyBmaWxlcworCitUaHUgTWFyIDE4IDE0OjEyOjM3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogbWlwcy1kaXMuYywgejhrLWRpcy5jOiAgQ29udmVydGVkIHRvIHVzZSBpbnRlcmZhY2UgZGVmaW5lZCBpbgorCS4uL2luY2x1ZGUvZGlzLWFzbS5oLgorCSogbTY4ay1kaXMuYzogIE5ldyBmaWxlIChtZXJnZSBvZiAuLi9iaW51dGlscy9tNjhrLXBpbnNuLmMKKwlhbmQgLi4vZ2RiL202OGstcGluc24uYykuCisJKiBpMzg2LWRpcy5jOiAgTmV3IGZpbGUgKG1lcmdlIG9mIC4uL2JpbnV0aWxzL2kzODYtcGluc24uYworCWFuZCAuLi9nZGIvaTM4Ni1waW5zbi5jKS4KKwkqIG02ODg4MS1leHQuYzogIE5ldyBmaWxlLiAgTW92ZWQgZGVmaW5pdGlvbiBvZgorCWV4dF9mb3JtYXQgZXh0X2Zvcm1hdF82ODg4MSBmcm9tIC4uL2dkYi9tNjhrLXRkZXAuYy4KKwkqIE1ha2VmaWxlLmluOiAgQWRqdXN0IGZvciBuZXcgZmlsZXMuCisJKiBpMzg2LWRpcy5jOiAgUGF0Y2hlcyBmcm9tIEpvaG4gSGFzc2V5IChoYXNzZXlAZGctcnRwLmRnLmNvbSkuCisJKiBtNjhrLWRpcy5jOiAgUmVjb2duaXplICc5JyBwbGFjZW1lbnQgY29kZSwgc28gKHNheSkgcGZsdXNoCisJY2FuIGJlIGRpcy1hc3NlbWJsZWQuCisKK1dlZCBGZWIgMTcgMDk6MTk6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IE5vdyByZXR1cm5zIHZvaWQuCisKK01vbiBKYW4gMTEgMTY6MDk6MTYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1pcHMtZGlzLmMgKGFuc2lkZWNsLmgpOiAgSW5jbHVkZSBmb3IgYmVuZWZpdCBvZiBzeXNkZXAuaAorCWZpbGVzIHRoYXQgdXNlIHRoZSBtYWNyb3MuCisKK1RodSBKYW4gIDcgMTM6MTU6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLWRpcy5jOiBOZXcgZmlsZSwgZnJvbSBnZGIvbWlwcy1waW5zbi5jLgorCSogTWFrZWZpbGUuaW4gKERJU19MSUJTKTogQWRkZWQgbWlwcy1kaXMuby4KKwkoQ0ZJTEVTKTogQWRkZWQgbWlwcy1kaXMuYy4KKworVGh1IEphbiAgNyAwNzozNjozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworICAgIAkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96ODAwMSwgcHJpbnRfaW5zbl96ODAwMik6IG5ldyByb3V0aW5lcworCSogejhrZ2VuLmMsIHo4ay1vcGMuaDogZml4IHNpemVzIG9mIHNvbWUgc2hpZnRzLgorCitUdWUgRGVjIDIyIDE1OjQyOjQ0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBJbXByb3ZlICpjbGVhbiBydWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IGEgZGVmYXVsdCBob3N0LgorCitUdWUgTm92IDE3IDE5OjUzOjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFsc28gdXNlIC1JJChzcmNkaXIpLy4uL2JmZCwgc2luY2Ugc29tZSBzeXNkZXAKKwlmaWxlcyBpbmNsdWRlIG90aGVyIHN5c2RlcCBmaWxlcworCitUaHUgTm92IDEyIDE2OjEwOjM3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiB6OGstZGlzLmMgejhrLW9wYy5oIHo4a2dlbi5jOiBjaGVja3BvaW50CisKK0ZyaSBPY3QgIDkgMDQ6NTY6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEZvciBob3N0IHN1cHBvcnQsIHVzZSAuLi9iZmQvY29uZmlndXJlLmhvc3QKKwlzbyBpdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIC4uL2JmZC9ob3N0cyBkYXRhYmFzZS4KKworVGh1IE9jdCAgMSAyMzozODo1NCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzCisKK1dlZCBTZXAgMzAgMTY6MDk6MjAgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKKworCSogejhrLWRpcy5jICh1bnBhcnNlX2luc3RyKTogZml4IGJ1ZyB3aGVyZSBvcGNvZGUgcmV0dXJuZWQgd2FzCisJKmFsd2F5cyogdGhlIHdyb25nIG9uZS4KKworV2VkIFNlcCAzMCAwNzo0MjoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogejhrZ2VuLmM6IGFkZGVkIGNvcHlyaWdodCBpbmZvCisKK1R1ZSBTZXAgMjkgMTI6MjA6MjEgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHo4ay1kaXMuYyAodW5wYXJzZV9pbnN0cik6IHByZXR0aWVyIHRhYnMKKwkqIHo4a2dlbi5jIC0+IHo4ay1vcGMuaDogYnVnIGZpeGVzIGluIHRhYmxlcworCitGcmkgU2VwIDI1IDEyOjUwOjMyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBuY3IqIGNvbmZpZ3VyYXRpb24uCisJKiB6OGstZGlzLmMgKHN0cnVjdCBpbnN0cl9kYXRhX3MpOiAgTWFrZSBpbnN0cl9hc21zcmMgY2hhciB0byBtYWtlCisJcGljYXl1bmUgQU5TSSBjb21waWxlcnMgaGFwcHkuCisKK1NlcCAyMCAwODo1MDo1NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChpMzg2KTogIE1ha2UgaTM4NiBhbmQgaTQ4NiBzeW5vbnltb3VzIGZvciBub3cuCisJKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zeXN2NCk6ICBBZGQgbXlfaG9zdCBkZWZpbml0aW9uLgorCitGcmkgU2VwIDE4IDE3OjAxOjIzIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBGaXggdHlwby4KKworRnJpIFNlcCAxOCAwMjowNDoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKG1ha2UpOiAgUmVtb3ZlIG9ic29sZXRlIGNydWQuCisJKHNwYXJjLW9wYy5vKTogIEF2b2lkIFN1biBNYWtlIFZQQVRIIGJ1Zy4KKworVHVlIFNlcCAgOCAxNzoyOToyNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBzaW5jZSB0aGVyZSBhcmUgbm8gU1VCRElSUywgcmVtb3ZlIHJ1bGUgYW5kCisJcmVmZXJlbmNlcyBvZiBzdWJkaXJfZG8uCisKK1R1ZSBTZXAgIDggMTc6MDI6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEdldCB0aGUgbGlicmFyeSBuYW1lIHJpZ2h0IGhlcmUgdG9vLgorCURvbid0IGluc3RhbGwgYmZkLmgsIHNpbmNlIGl0J3MgdW5yZWxhdGVkIHRvIHRoaXMgbGlicmFyeS4gIE5vCisJc3ViZGlycyB0byByZWN1cnNlIGludG8sIGVpdGhlci4KKwkoQ0ZJTEVTKTogVGhlIHNvdXJjZSBmaWxlIGhhcyBhIC5jIHN1ZmZpeCwgbm90IC5vLgorCisJKiBzcGFyYy1vcGMuYzogTmV3IGZpbGUsIG1vdmVkIGZyb20gQkZELgorCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEJ1aWxkIGl0LgorCitUaHUgU2VwICAzIDE2OjU5OjIwIDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCisKKwkqIHo4ay1kaXMuYzogZml4ZWQgZm9yd2FyZCByZWZmZXJlbmNlcyBvZiBzb21lIGRlY2xhcmF0aW9ucy4KKworTW9uIEF1ZyAzMSAxNjowOTo0NSAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogZ2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHJpZ2h0CisKK01vbiBBdWcgMzEgMTM6NDc6MzUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHo4ay1kaXMuYzoga25vd3MgaG93IHRvIGRpc2Fzc2VtYmxlIHo4ayBzdHVmZgorCSogejhrLW9wYy5oOiBuZXcgZmlsZSBmdWxsIG9mIHo4MDAwIG9wY29kZXMKKworDAorTG9jYWwgVmFyaWFibGVzOgordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9NYWtlZmlsZS5hbSBiL29wY29kZXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5NzI5OAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNDggQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KKworQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cworCitTVUJESVJTID0gcG8KKworSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKK0JGRERJUiA9ICQoc3JjZGlyKS8uLi9iZmQKK0RFUCA9IG1rZGVwCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYm9wY29kZXMubGEKKworIyBUaGlzIGlzIHdoZXJlIGJmZC5oIGxpdmVzLgorQkZEX0ggPSAuLi9iZmQvYmZkLmgKKworIyBIZWFkZXIgZmlsZXMuCitIRklMRVMgPSBcCisJYXJtLW9wYy5oIFwKKwlmcjMwLWRlc2MuaCBmcjMwLW9wYy5oIFwKKwloODUwMC1vcGMuaCBcCisJbTMyci1kZXNjLmggbTMyci1vcGMuaCBcCisJbWNvcmUtb3BjLmggXAorCXNoLW9wYy5oIFwKKwlzeXNkZXAuaCBcCisJdzY1LW9wYy5oIFwKKwl6OGstb3BjLmgKKworIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KK0NGSUxFUyA9IFwKKwlhMjlrLWRpcy5jIFwKKwlhbHBoYS1kaXMuYyBcCisJYWxwaGEtb3BjLmMgXAorCWFybS1kaXMuYyBcCisJY2dlbi1hc20uYyBcCisJY2dlbi1kaXMuYyBcCisJY2dlbi1vcGMuYyBcCisJZDEwdi1kaXMuYyBcCisJZDEwdi1vcGMuYyBcCisJZDMwdi1kaXMuYyBcCisJZDMwdi1vcGMuYyBcCisJZGlzLWJ1Zi5jIFwKKwlkaXNhc3NlbWJsZS5jIFwKKwlmcjMwLWFzbS5jIFwKKwlmcjMwLWRlc2MuYyBcCisJZnIzMC1kaXMuYyBcCisJZnIzMC1pYmxkLmMgXAorCWZyMzAtb3BjLmMgXAorCWg4MzAwLWRpcy5jIFwKKwloODUwMC1kaXMuYyBcCisJaHBwYS1kaXMuYyBcCisJaTM4Ni1kaXMuYyBcCisJaTk2MC1kaXMuYyBcCisJbTMyci1hc20uYyBcCisJbTMyci1kZXNjLmMgXAorCW0zMnItZGlzLmMgXAorCW0zMnItaWJsZC5jIFwKKwltMzJyLW9wYy5jIFwKKwltMzJyLW9waW5zdC5jIFwKKwltNjhrLWRpcy5jIFwKKwltNjhrLW9wYy5jIFwKKwltODhrLWRpcy5jIFwKKwltY29yZS1kaXMuYyBcCisJbWlwcy1kaXMuYyBcCisJbWlwcy1vcGMuYyBcCisJbWlwczE2LW9wYy5jIFwKKwltMTAyMDAtZGlzLmMgXAorCW0xMDIwMC1vcGMuYyBcCisJbTEwMzAwLWRpcy5jIFwKKwltMTAzMDAtb3BjLmMgXAorCW5zMzJrLWRpcy5jIFwKKwlwcGMtZGlzLmMgXAorCXBwYy1vcGMuYyBcCisJc2gtZGlzLmMgXAorCXNwYXJjLWRpcy5jIFwKKwlzcGFyYy1vcGMuYyBcCisJdGljMzAtZGlzLmMgXAorCXRpYzgwLWRpcy5jIFwKKwl0aWM4MC1vcGMuYyBcCisJdmF4LWRpcy5jIFwKKwl3NjUtZGlzLmMgXAorCXo4ay1kaXMuYyBcCisJejhrZ2VuLmMKKworQUxMX01BQ0hJTkVTID0gXAorCWEyOWstZGlzLmxvIFwKKwlhbHBoYS1kaXMubG8gXAorCWFscGhhLW9wYy5sbyBcCisJYXJjLWRpcy5sbyBcCisJYXJjLW9wYy5sbyBcCisJYXJtLWRpcy5sbyBcCisJY2dlbi1hc20ubG8gXAorCWNnZW4tZGlzLmxvIFwKKwljZ2VuLW9wYy5sbyBcCisJZDEwdi1kaXMubG8gXAorCWQxMHYtb3BjLmxvIFwKKwlkMzB2LWRpcy5sbyBcCisJZDMwdi1vcGMubG8gXAorCWZyMzAtYXNtLmxvIFwKKwlmcjMwLWRlc2MubG8gXAorCWZyMzAtZGlzLmxvIFwKKwlmcjMwLWlibGQubG8gXAorCWZyMzAtb3BjLmxvIFwKKwloODMwMC1kaXMubG8gXAorCWg4NTAwLWRpcy5sbyBcCisJaHBwYS1kaXMubG8gXAorCWkzODYtZGlzLmxvIFwKKwlpOTYwLWRpcy5sbyBcCisJbTMyci1hc20ubG8gXAorCW0zMnItZGVzYy5sbyBcCisJbTMyci1kaXMubG8gXAorCW0zMnItaWJsZC5sbyBcCisJbTMyci1vcGMubG8gXAorCW0zMnItb3BpbnN0LmxvIFwKKwltNjhrLWRpcy5sbyBcCisJbTY4ay1vcGMubG8gXAorCW04OGstZGlzLmxvIFwKKwltMTAyMDAtZGlzLmxvIFwKKwltMTAyMDAtb3BjLmxvIFwKKwltMTAzMDAtZGlzLmxvIFwKKwltMTAzMDAtb3BjLmxvIFwKKwltY29yZS1kaXMubG8gXAorCW1pcHMtZGlzLmxvIFwKKwltaXBzLW9wYy5sbyBcCisJbWlwczE2LW9wYy5sbyBcCisJcHBjLWRpcy5sbyBcCisJcHBjLW9wYy5sbyBcCisJbnMzMmstZGlzLmxvIFwKKwlzaC1kaXMubG8gXAorCXNwYXJjLWRpcy5sbyBcCisJc3BhcmMtb3BjLmxvIFwKKwl0aWMzMC1kaXMubG8gXAorCXRpYzgwLWRpcy5sbyBcCisJdGljODAtb3BjLmxvIFwKKwl2ODUwLWRpcy5sbyBcCisJdjg1MC1vcGMubG8gXAorCXZheC1kaXMubG8gXAorCXc2NS1kaXMubG8gXAorCXo4ay1kaXMubG8KKworT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKKworSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCisKK2Rpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYworCitsaWJvcGNvZGVzX2xhX1NPVVJDRVMgPSAgZGlzLWJ1Zi5jIGRpc2Fzc2VtYmxlLmMKK2xpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpCitsaWJvcGNvZGVzX2xhX0xJQkFERCA9ICQoT0ZJTEVTKSBAV0lOMzJMSUJBRERACitsaWJvcGNvZGVzX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACisKKyMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYm9wY29kZXMuYS4gIFdlIGNyZWF0ZSBsaWJvcGNvZGVzLmEgaW4KKyMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlCisjIHByb2dyYW1zIHRoYXQgdXNlIGxpYm9wY29kZXMuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoCisjIHNob3VsZCBiZSByZW1vdmVkIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgorCitub2luc3RfTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5hCisKK3N0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQorCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAorCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCisJICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCisJZWxzZSB0cnVlOyBmaQorCXRvdWNoIHN0YW1wLWxpYgorCitsaWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCisKK1BPVEZJTEVTID0gJChIRklMRVMpICQoQ0ZJTEVTKQorcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKKwlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKKwkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KKworIyBXZSBzaG91bGQgcmVjb25maWd1cmUgd2hlbmV2ZXIgYmZkL2NvbmZpZ3VyZS5pbiBjaGFuZ2VzLCBiZWNhdXNlCisjIHRoYXQncyB3aGVyZSB0aGUgdmVyc2lvbiBudW1iZXIgY29tZXMgZnJvbS4KK2NvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpLy4uL2JmZC9jb25maWd1cmUuaW4KKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKK0NMRUFORklMRVMgPSBcCisJbGlib3Bjb2Rlcy5hIHN0YW1wLWxpYiBkZXAuc2VkIC5kZXAgLmRlcDEKKworCisKKyMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCisKKworCisKKyMgVGhpcyBkZXBlbmRlbmN5IHN0dWZmIGlzIGNvcGllZCBmcm9tIEJGRC4KKworLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGNvbmZpZy5oCisJcm0gLWYgLmRlcDEKKwkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKKwlzZWQgLWYgZGVwLnNlZCA8IC5kZXAxID4gLmRlcAorCisuZGVwMTogJChDRklMRVMpCisJcm0gLWYgLmRlcDIgLmRlcDJhCisJZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgorCWVjaG8gPiAuZGVwMmEKKwkkKERFUCkgLWYgLmRlcDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPworCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCAuZGVwMmEgPj4gLmRlcDIKKwlybSAtZiAuZGVwMmEKKwkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKKworZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCisJc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCisJCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCisJCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKKwkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAorCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJworCitkZXA6IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCisJJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQorCitkZXAtaW46IC5kZXAKKwlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgorCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgorCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCisKK2RlcC1hbTogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCisJJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KKworLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQorCisjIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgorIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgorYTI5ay1kaXMubG86IGEyOWstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCithbHBoYS1kaXMubG86IGFscGhhLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKKyAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgKK2FscGhhLW9wYy5sbzogYWxwaGEtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKKyAgJChCRkRfSCkgb3BpbnRsLmgKK2FybS1kaXMubG86IGFybS1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL2Fuc2lkZWNsLmggYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAorICAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCisgICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCisgICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAorY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgb3BpbnRsLmgKK2NnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAorY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCitkMTB2LWRpcy5sbzogZDEwdi1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKK2QxMHYtb3BjLmxvOiBkMTB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oCitkMzB2LWRpcy5sbzogZDMwdi1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKK2QzMHYtb3BjLmxvOiBkMzB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCitkaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpIG9waW50bC5oCitkaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKK2ZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgZnIzMC1vcGMuaCBvcGludGwuaAorZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIGZyMzAtb3BjLmggb3BpbnRsLmgKK2ZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBmcjMwLW9wYy5oIG9waW50bC5oCitmcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBmcjMwLW9wYy5oIG9waW50bC5oCitmcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIGZyMzAtb3BjLmgKK2g4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgJChJTkNESVIpL29wY29kZS9oODMwMC5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAoraDg1MDAtZGlzLmxvOiBoODUwMC1kaXMuYyBoODUwMC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKK2hwcGEtZGlzLmxvOiBocHBhLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCitpMzg2LWRpcy5sbzogaTM4Ni1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggY29uZmlnLmggb3BpbnRsLmgKK2k5NjAtZGlzLmxvOiBpOTYwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvYW5zaWRlY2wuaAorbTMyci1hc20ubG86IG0zMnItYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBtMzJyLW9wYy5oIG9waW50bC5oCittMzJyLWRlc2MubG86IG0zMnItZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgbTMyci1vcGMuaCBvcGludGwuaAorbTMyci1kaXMubG86IG0zMnItZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIG0zMnItb3BjLmggb3BpbnRsLmgKK20zMnItaWJsZC5sbzogbTMyci1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIG0zMnItb3BjLmggb3BpbnRsLmgKK20zMnItb3BjLmxvOiBtMzJyLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgbTMyci1vcGMuaAorbTMyci1vcGluc3QubG86IG0zMnItb3BpbnN0LmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBtMzJyLW9wYy5oCittNjhrLWRpcy5sbzogbTY4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2Zsb2F0Zm9ybWF0Lmggb3BpbnRsLmggXAorICAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAorbTY4ay1vcGMubG86IG02OGstb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tNjhrLmgKK204OGstZGlzLmxvOiBtODhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL204OGsuaCBvcGludGwuaAorbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBtY29yZS1vcGMuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKK21pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCittaXBzLW9wYy5sbzogbWlwcy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAorbWlwczE2LW9wYy5sbzogbWlwczE2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCittMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmggXAorICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCittMTAyMDAtb3BjLmxvOiBtMTAyMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKK20xMDMwMC1kaXMubG86IG0xMDMwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKK20xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAorbnMzMmstZGlzLmxvOiBuczMyay1kaXMuYyAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCisgIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKKyAgb3BpbnRsLmgKK3BwYy1kaXMubG86IHBwYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCisgIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9wcGMuaAorcHBjLW9wYy5sbzogcHBjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggXAorICBvcGludGwuaAorc2gtZGlzLmxvOiBzaC1kaXMuYyBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL2Fuc2lkZWNsLmgKK3NwYXJjLWRpcy5sbzogc3BhcmMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAorICBjb25maWcuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9saWJpYmVydHkuaCBvcGludGwuaAorc3BhcmMtb3BjLmxvOiBzcGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKK3RpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAordGljODAtZGlzLmxvOiB0aWM4MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggXAorICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCit0aWM4MC1vcGMubG86IHRpYzgwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAordmF4LWRpcy5sbzogdmF4LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvdmF4LmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCit3NjUtZGlzLmxvOiB3NjUtZGlzLmMgdzY1LW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAorejhrLWRpcy5sbzogejhrLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSB6OGstb3BjLmgKK3o4a2dlbi5sbzogejhrZ2VuLmMgc3lzZGVwLmggY29uZmlnLmgKKyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9NYWtlZmlsZS5pbiBiL29wY29kZXMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZjY0ZgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw4NTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKworU0hFTEwgPSBAU0hFTExACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2JpbmRpciA9IEBiaW5kaXJACitzYmluZGlyID0gQHNiaW5kaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2xpYmRpciA9IEBsaWJkaXJACitpbmZvZGlyID0gQGluZm9kaXJACittYW5kaXIgPSBAbWFuZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQorCitERVNURElSID0KKworcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKKwordG9wX2J1aWxkZGlyID0gLgorCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK3RyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK0FSID0gQEFSQAorQVMgPSBAQVNACitCRkRfTUFDSElORVMgPSBAQkZEX01BQ0hJTkVTQAorQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorQ0MgPSBAQ0NACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACitETExUT09MID0gQERMTFRPT0xACitFWEVFWFQgPSBARVhFRVhUQAorRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAorR01PRklMRVMgPSBAR01PRklMRVNACitHTVNHRk1UID0gQEdNU0dGTVRACitHVF9OTyA9IEBHVF9OT0AKK0dUX1lFUyA9IEBHVF9ZRVNACitIREVGSU5FUyA9IEBIREVGSU5FU0AKK0lOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKK0lOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKK0lOVExERVBTID0gQElOVExERVBTQAorSU5UTExJQlMgPSBASU5UTExJQlNACitJTlRMT0JKUyA9IEBJTlRMT0JKU0AKK0xEID0gQExEQAorTElCVE9PTCA9IEBMSUJUT09MQAorTE5fUyA9IEBMTl9TQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKK01TR0ZNVCA9IEBNU0dGTVRACitOTSA9IEBOTUAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BPRklMRVMgPSBAUE9GSUxFU0AKK1BPU1VCID0gQFBPU1VCQAorUkFOTElCID0gQFJBTkxJQkAKK1VTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAorVVNFX05MUyA9IEBVU0VfTkxTQAorVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK1dJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACitXSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKK2FyY2hkZWZzID0gQGFyY2hkZWZzQAorY2dlbiA9IEBjZ2VuQAorY2dlbmRpciA9IEBjZ2VuZGlyQAorbCA9IEBsQAorCitBVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCisKK1NVQkRJUlMgPSBwbworCitJTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQorQkZERElSID0gJChzcmNkaXIpLy4uL2JmZAorREVQID0gbWtkZXAKKworbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQorCisjIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCitCRkRfSCA9IC4uL2JmZC9iZmQuaAorCisjIEhlYWRlciBmaWxlcy4KK0hGSUxFUyA9IFwKKwlhcm0tb3BjLmggXAorCWZyMzAtZGVzYy5oIGZyMzAtb3BjLmggXAorCWg4NTAwLW9wYy5oIFwKKwltMzJyLWRlc2MuaCBtMzJyLW9wYy5oIFwKKwltY29yZS1vcGMuaCBcCisJc2gtb3BjLmggXAorCXN5c2RlcC5oIFwKKwl3NjUtb3BjLmggXAorCXo4ay1vcGMuaAorCisKKyMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCitDRklMRVMgPSBcCisJYTI5ay1kaXMuYyBcCisJYWxwaGEtZGlzLmMgXAorCWFscGhhLW9wYy5jIFwKKwlhcm0tZGlzLmMgXAorCWNnZW4tYXNtLmMgXAorCWNnZW4tZGlzLmMgXAorCWNnZW4tb3BjLmMgXAorCWQxMHYtZGlzLmMgXAorCWQxMHYtb3BjLmMgXAorCWQzMHYtZGlzLmMgXAorCWQzMHYtb3BjLmMgXAorCWRpcy1idWYuYyBcCisJZGlzYXNzZW1ibGUuYyBcCisJZnIzMC1hc20uYyBcCisJZnIzMC1kZXNjLmMgXAorCWZyMzAtZGlzLmMgXAorCWZyMzAtaWJsZC5jIFwKKwlmcjMwLW9wYy5jIFwKKwloODMwMC1kaXMuYyBcCisJaDg1MDAtZGlzLmMgXAorCWhwcGEtZGlzLmMgXAorCWkzODYtZGlzLmMgXAorCWk5NjAtZGlzLmMgXAorCW0zMnItYXNtLmMgXAorCW0zMnItZGVzYy5jIFwKKwltMzJyLWRpcy5jIFwKKwltMzJyLWlibGQuYyBcCisJbTMyci1vcGMuYyBcCisJbTMyci1vcGluc3QuYyBcCisJbTY4ay1kaXMuYyBcCisJbTY4ay1vcGMuYyBcCisJbTg4ay1kaXMuYyBcCisJbWNvcmUtZGlzLmMgXAorCW1pcHMtZGlzLmMgXAorCW1pcHMtb3BjLmMgXAorCW1pcHMxNi1vcGMuYyBcCisJbTEwMjAwLWRpcy5jIFwKKwltMTAyMDAtb3BjLmMgXAorCW0xMDMwMC1kaXMuYyBcCisJbTEwMzAwLW9wYy5jIFwKKwluczMyay1kaXMuYyBcCisJcHBjLWRpcy5jIFwKKwlwcGMtb3BjLmMgXAorCXNoLWRpcy5jIFwKKwlzcGFyYy1kaXMuYyBcCisJc3BhcmMtb3BjLmMgXAorCXRpYzMwLWRpcy5jIFwKKwl0aWM4MC1kaXMuYyBcCisJdGljODAtb3BjLmMgXAorCXZheC1kaXMuYyBcCisJdzY1LWRpcy5jIFwKKwl6OGstZGlzLmMgXAorCXo4a2dlbi5jCisKKworQUxMX01BQ0hJTkVTID0gXAorCWEyOWstZGlzLmxvIFwKKwlhbHBoYS1kaXMubG8gXAorCWFscGhhLW9wYy5sbyBcCisJYXJjLWRpcy5sbyBcCisJYXJjLW9wYy5sbyBcCisJYXJtLWRpcy5sbyBcCisJY2dlbi1hc20ubG8gXAorCWNnZW4tZGlzLmxvIFwKKwljZ2VuLW9wYy5sbyBcCisJZDEwdi1kaXMubG8gXAorCWQxMHYtb3BjLmxvIFwKKwlkMzB2LWRpcy5sbyBcCisJZDMwdi1vcGMubG8gXAorCWZyMzAtYXNtLmxvIFwKKwlmcjMwLWRlc2MubG8gXAorCWZyMzAtZGlzLmxvIFwKKwlmcjMwLWlibGQubG8gXAorCWZyMzAtb3BjLmxvIFwKKwloODMwMC1kaXMubG8gXAorCWg4NTAwLWRpcy5sbyBcCisJaHBwYS1kaXMubG8gXAorCWkzODYtZGlzLmxvIFwKKwlpOTYwLWRpcy5sbyBcCisJbTMyci1hc20ubG8gXAorCW0zMnItZGVzYy5sbyBcCisJbTMyci1kaXMubG8gXAorCW0zMnItaWJsZC5sbyBcCisJbTMyci1vcGMubG8gXAorCW0zMnItb3BpbnN0LmxvIFwKKwltNjhrLWRpcy5sbyBcCisJbTY4ay1vcGMubG8gXAorCW04OGstZGlzLmxvIFwKKwltMTAyMDAtZGlzLmxvIFwKKwltMTAyMDAtb3BjLmxvIFwKKwltMTAzMDAtZGlzLmxvIFwKKwltMTAzMDAtb3BjLmxvIFwKKwltY29yZS1kaXMubG8gXAorCW1pcHMtZGlzLmxvIFwKKwltaXBzLW9wYy5sbyBcCisJbWlwczE2LW9wYy5sbyBcCisJcHBjLWRpcy5sbyBcCisJcHBjLW9wYy5sbyBcCisJbnMzMmstZGlzLmxvIFwKKwlzaC1kaXMubG8gXAorCXNwYXJjLWRpcy5sbyBcCisJc3BhcmMtb3BjLmxvIFwKKwl0aWMzMC1kaXMubG8gXAorCXRpYzgwLWRpcy5sbyBcCisJdGljODAtb3BjLmxvIFwKKwl2ODUwLWRpcy5sbyBcCisJdjg1MC1vcGMubG8gXAorCXZheC1kaXMubG8gXAorCXc2NS1kaXMubG8gXAorCXo4ay1kaXMubG8KKworCitPRklMRVMgPSBAQkZEX01BQ0hJTkVTQAorCitJTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChJTkNESVIpIC1JJChCRkRESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwKKworbGlib3Bjb2Rlc19sYV9TT1VSQ0VTID0gZGlzLWJ1Zi5jIGRpc2Fzc2VtYmxlLmMKK2xpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpCitsaWJvcGNvZGVzX2xhX0xJQkFERCA9ICQoT0ZJTEVTKSBAV0lOMzJMSUJBRERACitsaWJvcGNvZGVzX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACisKKyMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYm9wY29kZXMuYS4gIFdlIGNyZWF0ZSBsaWJvcGNvZGVzLmEgaW4KKyMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlCisjIHByb2dyYW1zIHRoYXQgdXNlIGxpYm9wY29kZXMuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoCisjIHNob3VsZCBiZSByZW1vdmVkIGlmIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgorCitub2luc3RfTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5hCisKK1BPVEZJTEVTID0gJChIRklMRVMpICQoQ0ZJTEVTKQorCitDTEVBTkZJTEVTID0gXAorCWxpYm9wY29kZXMuYSBzdGFtcC1saWIgZGVwLnNlZCAuZGVwIC5kZXAxCisKKworCisKKyMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Citta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCitDT05GSUdfSEVBREVSID0gY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9IAorTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKKworCitERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KK0NQUEZMQUdTID0gQENQUEZMQUdTQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCUyA9IEBMSUJTQAorbGlib3Bjb2Rlc19hX0xJQkFERCA9IAorbGlib3Bjb2Rlc19hX1NPVVJDRVMgPSBsaWJvcGNvZGVzLmEuYworbGlib3Bjb2Rlc19hX09CSkVDVFMgPSAgbGlib3Bjb2Rlcy5hLm8KK0xUTElCUkFSSUVTID0gICQobGliX0xUTElCUkFSSUVTKQorCitsaWJvcGNvZGVzX2xhX09CSkVDVFMgPSAgZGlzLWJ1Zi5sbyBkaXNhc3NlbWJsZS5sbworQ0ZMQUdTID0gQENGTEFHU0AKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACitESVNUX0NPTU1PTiA9ICAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKK2FjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluCisKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKworVEFSID0gdGFyCitHWklQX0VOViA9IC0tYmVzdAorU09VUkNFUyA9IGxpYm9wY29kZXMuYS5jICQobGlib3Bjb2Rlc19sYV9TT1VSQ0VTKQorT0JKRUNUUyA9IGxpYm9wY29kZXMuYS5vICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKQorCithbGw6IGFsbC1yZWRpcmVjdAorLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuUyAuYyAubG8gLm8gLnMKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAorCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAorCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCiskKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKKwljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKKworY29uZmlnLmg6IHN0YW1wLWgKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkJcm0gLWYgc3RhbXAtaDsgXAorCQkkKE1BS0UpIHN0YW1wLWg7IFwKKwllbHNlIDo7IGZpCitzdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKKwkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCiskKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKKwkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAorCWVsc2UgOjsgZmkKKyQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAorCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQorCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAorCittb3N0bHljbGVhbi1oZHI6CisKK2NsZWFuLWhkcjoKKworZGlzdGNsZWFuLWhkcjoKKwktcm0gLWYgY29uZmlnLmgKKworbWFpbnRhaW5lci1jbGVhbi1oZHI6CisKK21vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUzoKKworY2xlYW4tbm9pbnN0TElCUkFSSUVTOgorCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCisKK2Rpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVM6CisKK21haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTOgorCisuYy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworLnMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKKy5TLm86CisJJChDT01QSUxFKSAtYyAkPAorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKKworY2xlYW4tY29tcGlsZToKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgorCisuYy5sbzoKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKKworLnMubG86CisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8CisKKy5TLmxvOgorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitkaXN0Y2xlYW4tbGlidG9vbDoKKworbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgorCittb3N0bHljbGVhbi1saWJMVExJQlJBUklFUzoKKworY2xlYW4tbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCisKK2Rpc3RjbGVhbi1saWJMVExJQlJBUklFUzoKKworbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUzoKKworaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAorCSAgICBlY2hvICIkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKKwkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCWxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgJChMSUJUT09MKSAgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAorCWRvbmUKKworbGlib3Bjb2Rlcy5sYTogJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpICQobGlib3Bjb2Rlc19sYV9ERVBFTkRFTkNJRVMpCisJJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlib3Bjb2Rlc19sYV9MREZMQUdTKSAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykgJChsaWJvcGNvZGVzX2xhX0xJQkFERCkgJChMSUJTKQorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorCitAU0VUX01BS0VACisKK2FsbC1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKK2luc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorY2hlY2stcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCittb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXJldj0nJzsgbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gIi4iICYmIGRvdF9zZWVuPXllczsgXAorCWRvbmU7IFwKKwl0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyIgJiYgcmV2PSIuICQkcmV2IjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCisKK3RhZ3M6IFRBR1MKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKKwkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKKwkgICYmIG1raWQgLWYkJGhlcmUvSUQgJCR1bmlxdWUgJChMSVNQKQorCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKyAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisgICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAorCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKWNvbmZpZy5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgKGNkICQoc3JjZGlyKSAmJiBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyBjb25maWcuaW4gJCR1bmlxdWUgJChMSVNQKSAtbyAkJGhlcmUvVEFHUykKKworbW9zdGx5Y2xlYW4tdGFnczoKKworY2xlYW4tdGFnczoKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQKKworbWFpbnRhaW5lci1jbGVhbi10YWdzOgorCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKKworIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgorIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgorIyB0YXJmaWxlLgorZGlzdGNoZWNrOiBkaXN0CisJLXJtIC1yZiAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgenhmICQoZGlzdGRpcikudGFyLmd6CisJbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKKwlta2RpciAkKGRpc3RkaXIpLz1pbnN0CisJZGNfaW5zdGFsbF9iYXNlPWBjZCAkKGRpc3RkaXIpLz1pbnN0ICYmIHB3ZGA7IFwKKwljZCAkKGRpc3RkaXIpLz1idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QKKwktcm0gLXJmICQoZGlzdGRpcikKKwlAYmFubmVyPSIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAorCWRhc2hlcz1gZWNobyAiJCRiYW5uZXIiIHwgc2VkIHMvLi89L2dgOyBcCisJZWNobyAiJCRkYXNoZXMiOyBcCisJZWNobyAiJCRiYW5uZXIiOyBcCisJZWNobyAiJCRkYXNoZXMiCitkaXN0OiBkaXN0ZGlyCisJLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQorCS1ybSAtcmYgJChkaXN0ZGlyKQorZGlzdC1hbGw6IGRpc3RkaXIKKwktY2htb2QgLVIgYStyICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCisJLXJtIC1yZiAkKGRpc3RkaXIpCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwktcm0gLXJmICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpCisJLWNobW9kIDc3NyAkKGRpc3RkaXIpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXByICQkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgfHwgOjsgXAorCSAgZmk7IFwKKwlkb25lCisJZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIGNobW9kIDc3NyAkKGRpc3RkaXIpLyQkc3ViZGlyOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0uLi8kKGRpc3RkaXIpIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2luZm8tYW06CitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorZHZpLWFtOgorZHZpOiBkdmktcmVjdXJzaXZlCitjaGVjay1hbToKK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2luc3RhbGxjaGVjay1hbToKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1pbmZvLWFtOiAKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1saWJMVExJQlJBUklFUworaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCisKK2luc3RhbGwtZGF0YS1hbToKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoTFRMSUJSQVJJRVMpIGNvbmZpZy5oCithbGwtcmVkaXJlY3Q6IGFsbC1yZWN1cnNpdmUtYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgorCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKGxpYmRpcikKKworCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKK21vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCisJCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJCW1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIG1vc3RseWNsZWFuLXRhZ3MgXAorCQltb3N0bHljbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06ICBjbGVhbi1oZHIgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCisJCWNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBcCisJCW1vc3RseWNsZWFuLWFtCisKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1jb21waWxlIFwKKwkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYkxUTElCUkFSSUVTIFwKKwkJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0KKwktcm0gLWYgbGlidG9vbAorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCittYWludGFpbmVyLWNsZWFuLWFtOiAgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAorCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCisJCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAorCQltYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tdGFncyBcCisJCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCisuUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCittb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBcCitjbGVhbi1ub2luc3RMSUJSQVJJRVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAorbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKK21haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKK2NsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWxpYkxUTElCUkFSSUVTIFwKK2Rpc3RjbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJMVExJQlJBUklFUyBcCittYWludGFpbmVyLWNsZWFuLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUyBcCitpbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgdW5pbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKK2luc3RhbGwtZXhlYy1yZWN1cnNpdmUgdW5pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCit1bmluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBcCitpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIFwKK21haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4tdGFncyBcCitkaXN0Y2xlYW4tdGFncyBjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCitkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKK2luc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAoraW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCithbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKK2Rpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKK21vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCisKKworZGlzYXNzZW1ibGUubG86IGRpc2Fzc2VtYmxlLmMgJChJTkNESVIpL2Rpcy1hc20uaAorCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyBAYXJjaGRlZnNAICQoc3JjZGlyKS9kaXNhc3NlbWJsZS5jCisKK3N0YW1wLWxpYjogbGlib3Bjb2Rlcy5sYQorCWlmIFsgLWYgLmxpYnMvbGlib3Bjb2Rlcy5hIF07IHRoZW4gXAorCSAgY3AgLmxpYnMvbGlib3Bjb2Rlcy5hIGxpYm9wY29kZXMudG1wOyBcCisJICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGlib3Bjb2Rlcy50bXAgbGlib3Bjb2Rlcy5hOyBcCisJZWxzZSB0cnVlOyBmaQorCXRvdWNoIHN0YW1wLWxpYgorCitsaWJvcGNvZGVzLmE6IHN0YW1wLWxpYiA7IEB0cnVlCitwby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQorCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAorCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgorCisjIFdlIHNob3VsZCByZWNvbmZpZ3VyZSB3aGVuZXZlciBiZmQvY29uZmlndXJlLmluIGNoYW5nZXMsIGJlY2F1c2UKKyMgdGhhdCdzIHdoZXJlIHRoZSB2ZXJzaW9uIG51bWJlciBjb21lcyBmcm9tLgorY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvLi4vYmZkL2NvbmZpZ3VyZS5pbgorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworCisKKworIyBUaGlzIGRlcGVuZGVuY3kgc3R1ZmYgaXMgY29waWVkIGZyb20gQkZELgorCisuZGVwOiBkZXAuc2VkICQoQ0ZJTEVTKSAkKEhGSUxFUykgY29uZmlnLmgKKwlybSAtZiAuZGVwMQorCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQorCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwCisKKy5kZXAxOiAkKENGSUxFUykKKwlybSAtZiAuZGVwMiAuZGVwMmEKKwllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCisJZWNobyA+IC5kZXAyYQorCSQoREVQKSAtZiAuZGVwMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/CisJc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IC5kZXAyYSA+PiAuZGVwMgorCXJtIC1mIC5kZXAyYQorCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQorCitkZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKKwlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKKwkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKKwkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAorCQktZSAncyFAQkZERElSQCEkKEJGRERJUikhJwlcCisJCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCisKK2RlcDogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKKwljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKKwkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCisKK2RlcC1pbjogLmRlcAorCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCisJY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCisJJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KKworZGVwLWFtOiAuZGVwCisJc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KKwljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KKwkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQorCisuUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCisKKyMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCisjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCithMjlrLWRpcy5sbzogYTI5ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKK2FscGhhLWRpcy5sbzogYWxwaGEtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAorICBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaAorYWxwaGEtb3BjLmxvOiBhbHBoYS1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAorICAkKEJGRF9IKSBvcGludGwuaAorYXJtLWRpcy5sbzogYXJtLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvYW5zaWRlY2wuaCBhcm0tb3BjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisgICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKKyAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKKyAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCitjZ2VuLWFzbS5sbzogY2dlbi1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBvcGludGwuaAorY2dlbi1kaXMubG86IGNnZW4tZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCitjZ2VuLW9wYy5sbzogY2dlbi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKK2QxMHYtZGlzLmxvOiBkMTB2LWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQorZDEwdi1vcGMubG86IGQxMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmgKK2QzMHYtZGlzLmxvOiBkMzB2LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAorZDMwdi1vcGMubG86IGQzMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKK2Rpcy1idWYubG86IGRpcy1idWYuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgb3BpbnRsLmgKK2Rpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQorZnIzMC1hc20ubG86IGZyMzAtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBmcjMwLW9wYy5oIG9waW50bC5oCitmcjMwLWRlc2MubG86IGZyMzAtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgZnIzMC1vcGMuaCBvcGludGwuaAorZnIzMC1kaXMubG86IGZyMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIGZyMzAtb3BjLmggb3BpbnRsLmgKK2ZyMzAtaWJsZC5sbzogZnIzMC1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIGZyMzAtb3BjLmggb3BpbnRsLmgKK2ZyMzAtb3BjLmxvOiBmcjMwLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgZnIzMC1vcGMuaAoraDgzMDAtZGlzLmxvOiBoODMwMC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmggXAorICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCitoODUwMC1kaXMubG86IGg4NTAwLWRpcy5jIGg4NTAwLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAorICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAoraHBwYS1kaXMubG86IGhwcGEtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKK2kzODYtZGlzLmxvOiBpMzg2LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBjb25maWcuaCBvcGludGwuaAoraTk2MC1kaXMubG86IGk5NjAtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9hbnNpZGVjbC5oCittMzJyLWFzbS5sbzogbTMyci1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIG0zMnItb3BjLmggb3BpbnRsLmgKK20zMnItZGVzYy5sbzogbTMyci1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBtMzJyLW9wYy5oIG9waW50bC5oCittMzJyLWRpcy5sbzogbTMyci1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgbTMyci1vcGMuaCBvcGludGwuaAorbTMyci1pYmxkLmxvOiBtMzJyLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKKyAgbTMyci1vcGMuaCBvcGludGwuaAorbTMyci1vcGMubG86IG0zMnItb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAorICBtMzJyLW9wYy5oCittMzJyLW9waW5zdC5sbzogbTMyci1vcGluc3QuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCisgIG0zMnItb3BjLmgKK202OGstZGlzLmxvOiBtNjhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaCBvcGludGwuaCBcCisgICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCittNjhrLW9wYy5sbzogbTY4ay1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAorbTg4ay1kaXMubG86IG04OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCisgICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTg4ay5oIG9waW50bC5oCittY29yZS1kaXMubG86IG1jb3JlLWRpcy5jIG1jb3JlLW9wYy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQorbWlwcy1kaXMubG86IG1pcHMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAorICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAorICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKK21pcHMtb3BjLmxvOiBtaXBzLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCittaXBzMTYtb3BjLmxvOiBtaXBzMTYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKK20xMDIwMC1kaXMubG86IG0xMDIwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKK20xMDIwMC1vcGMubG86IG0xMDIwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAorbTEwMzAwLWRpcy5sbzogbTEwMzAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oIFwKKyAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAorbTEwMzAwLW9wYy5sbzogbTEwMzAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCituczMyay1kaXMubG86IG5zMzJrLWRpcy5jICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKKyAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAorICBvcGludGwuaAorcHBjLWRpcy5sbzogcHBjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKKyAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCitwcGMtb3BjLmxvOiBwcGMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9wcGMuaCBcCisgIG9waW50bC5oCitzaC1kaXMubG86IHNoLWRpcy5jIHNoLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAorICAkKElOQ0RJUikvYW5zaWRlY2wuaAorc3BhcmMtZGlzLmxvOiBzcGFyYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCisgIGNvbmZpZy5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL2xpYmliZXJ0eS5oIG9waW50bC5oCitzcGFyYy1vcGMubG86IHNwYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAordGljMzAtZGlzLmxvOiB0aWMzMC1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKKyAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCit0aWM4MC1kaXMubG86IHRpYzgwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaCBcCisgICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKK3RpYzgwLW9wYy5sbzogdGljODAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCit2YXgtZGlzLmxvOiB2YXgtZGlzLmMgJChJTkNESVIpL29wY29kZS92YXguaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKKyAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKK3c2NS1kaXMubG86IHc2NS1kaXMuYyB3NjUtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCit6OGstZGlzLmxvOiB6OGstZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCisgICQoQkZEX0gpIHo4ay1vcGMuaAorejhrZ2VuLmxvOiB6OGtnZW4uYyBzeXNkZXAuaCBjb25maWcuaAorIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL29wY29kZXMvYTI5ay1kaXMuYyBiL29wY29kZXMvYTI5ay1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjk1OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9hMjlrLWRpcy5jCkBAIC0wLDAgKzEsMzUzIEBACisvKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQU1EIDI5MDAwCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSmltIEtpbmdkb24uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgorCisvKiBQcmludCBhIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2VuZXJhbC1wdXJwb3NlCisgICByZWdpc3RlciBudW1iZXIgTlVNIG9uIFNUUkVBTS4KKyAgIE5VTSBpcyBhIG51bWJlciBhcyBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG5vdCBhcyBmb3VuZCBpbgorICAgZGVidWdnaW5nIHN5bWJvbHM7IGl0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAtMjU1LiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9nZW5lcmFsIChudW0sIGluZm8pCisgICAgIGludCBudW07CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpZiAobnVtIDwgMTI4KQorICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZ3IlZCIsIG51bSk7CisgIGVsc2UKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImxyJWQiLCBudW0gLSAxMjgpOworfQorCisvKiBMaWtlIHByaW50X2dlbmVyYWwgYnV0IGEgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyLgorICAgCisgICBUaGUgbW5lbW9uaWNzIHVzZWQgYnkgdGhlIEFNRCBhc3NlbWJsZXIgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZQorICAgYXMgdGhlIG9uZXMgaW4gdGhlIFVzZXIncyBNYW51YWwuICBXZSB1c2UgdGhlIG9uZXMgdGhhdCB0aGUKKyAgIGFzc2VtYmxlciB1c2VzLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9zcGVjaWFsIChudW0sIGluZm8pCisgICAgIHVuc2lnbmVkIGludCBudW07CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMC1TUEVDMF9OVU0tMS4gICovCisgIHN0YXRpYyBjaGFyICpzcGVjMF9uYW1lc1tdID0geworICAgICJ2YWIiLCAib3BzIiwgImNwcyIsICJjZmciLCAiY2hhIiwgImNoZCIsICJjaGMiLCAicmJwIiwgInRtYyIsICJ0bXIiLAorICAgICJwYzAiLCAicGMxIiwgInBjMiIsICJtbXUiLCAibHJ1IiwgInJzbiIsICJybWEwIiwgInJtYzAiLCAicm1hMSIsICJybWMxIiwKKyAgICAic3BjMCIsICJzcGMxIiwgInNwYzIiLCAiaWJhMCIsICJpYmMwIiwgImliYTEiLCAiaWJjMSIsICJkYmEiLCAiZGJjIiwKKyAgICAiY2lyIiwgImNkciIKKyAgICB9OworI2RlZmluZSBTUEVDMF9OVU0gKChzaXplb2Ygc3BlYzBfbmFtZXMpIC8gKHNpemVvZiBzcGVjMF9uYW1lc1swXSkpCisKKyAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDEyOC0xMjgrU1BFQzEyOF9OVU0tMS4gICovCisgIHN0YXRpYyBjaGFyICpzcGVjMTI4X25hbWVzW10gPSB7CisgICAgImlwYyIsICJpcGEiLCAiaXBiIiwgInEiLCAiYWx1IiwgImJwIiwgImZjIiwgImNyIgorICAgIH07CisjZGVmaW5lIFNQRUMxMjhfTlVNICgoc2l6ZW9mIHNwZWMxMjhfbmFtZXMpIC8gKHNpemVvZiBzcGVjMTI4X25hbWVzWzBdKSkKKworICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMTYwLTE2MCtTUEVDMTYwX05VTS0xLiAgKi8KKyAgc3RhdGljIGNoYXIgKnNwZWMxNjBfbmFtZXNbXSA9IHsKKyAgICAiZnBlIiwgImludGUiLCAiZnBzIiwgInNyMTYzIiwgImV4b3AiCisgICAgfTsKKyNkZWZpbmUgU1BFQzE2MF9OVU0gKChzaXplb2Ygc3BlYzE2MF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMxNjBfbmFtZXNbMF0pKQorCisgIGlmIChudW0gPCBTUEVDMF9OVU0pCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMwX25hbWVzW251bV0pOworICBlbHNlIGlmIChudW0gPj0gMTI4ICYmIG51bSA8IDEyOCArIFNQRUMxMjhfTlVNKQorICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMTI4X25hbWVzW251bS0xMjhdKTsKKyAgZWxzZSBpZiAobnVtID49IDE2MCAmJiBudW0gPCAxNjAgKyBTUEVDMTYwX05VTSkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzE2MF9uYW1lc1tudW0tMTYwXSk7CisgIGVsc2UKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNyJWQiLCBudW0pOworfQorCisvKiBJcyBhbiBpbnN0cnVjdGlvbiB3aXRoIE9QQ09ERSBhIGRlbGF5ZWQgYnJhbmNoPyAgKi8KK3N0YXRpYyBpbnQKK2lzX2RlbGF5ZWRfYnJhbmNoIChvcGNvZGUpCisgICAgIGludCBvcGNvZGU7Cit7CisgIHJldHVybiAob3Bjb2RlID09IDB4YTggfHwgb3Bjb2RlID09IDB4YTkgfHwgb3Bjb2RlID09IDB4YTAgfHwgb3Bjb2RlID09IDB4YTEKKwkgIHx8IG9wY29kZSA9PSAweGE0IHx8IG9wY29kZSA9PSAweGE1CisJICB8fCBvcGNvZGUgPT0gMHhiNCB8fCBvcGNvZGUgPT0gMHhiNQorCSAgfHwgb3Bjb2RlID09IDB4YzQgfHwgb3Bjb2RlID09IDB4YzAKKwkgIHx8IG9wY29kZSA9PSAweGFjIHx8IG9wY29kZSA9PSAweGFkCisJICB8fCBvcGNvZGUgPT0gMHhjYyk7Cit9CisKKy8qIE5vdyBmaW5kIHRoZSBmb3VyIGJ5dGVzIG9mIElOU04gYW5kIHB1dCB0aGVtIGluICpJTlNOezAsOCwxNiwyNH0uICAqLworc3RhdGljIHZvaWQKK2ZpbmRfYnl0ZXNfYmlnIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQorICAgICBjaGFyICppbnNuOworICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7CisgICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OworeworICAqaW5zbjI0ID0gaW5zblswXTsKKyAgKmluc24xNiA9IGluc25bMV07CisgICppbnNuOCAgPSBpbnNuWzJdOworICAqaW5zbjAgID0gaW5zblszXTsKK30KKworc3RhdGljIHZvaWQKK2ZpbmRfYnl0ZXNfbGl0dGxlIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQorICAgICBjaGFyICppbnNuOworICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7CisgICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OworeworICAqaW5zbjI0ID0gaW5zblszXTsKKyAgKmluc24xNiA9IGluc25bMl07CisgICppbnNuOCA9IGluc25bMV07CisgICppbnNuMCA9IGluc25bMF07Cit9CisKK3R5cGVkZWYgdm9pZCAoKmZpbmRfYnl0ZV9mdW5jX3R5cGUpCisgICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCisJICAgICAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKKworLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCisgICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBhMjlrKS4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc24gKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIC8qIFRoZSByYXcgaW5zdHJ1Y3Rpb24uICAqLworICBjaGFyIGluc25bNF07CisKKyAgLyogVGhlIGZvdXIgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgdW5zaWduZWQgY2hhciBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wOworCisgIGZpbmRfYnl0ZV9mdW5jX3R5cGUgZmluZF9ieXRlX2Z1bmMgPSAoZmluZF9ieXRlX2Z1bmNfdHlwZSlpbmZvLT5wcml2YXRlX2RhdGE7CisKKyAgc3RydWN0IGEyOWtfb3Bjb2RlIENPTlNUICogb3Bjb2RlOworCisgIHsKKyAgICBpbnQgc3RhdHVzID0KKyAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIChiZmRfYnl0ZSAqKSAmaW5zblswXSwgNCwgaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgeworCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgfQorCisgICgqZmluZF9ieXRlX2Z1bmMpIChpbnNuLCAmaW5zbjAsICZpbnNuOCwgJmluc24xNiwgJmluc24yNCk7CisKKyAgcHJpbnRmICgiJTAyeCUwMnglMDJ4JTAyeCAiLCBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wKTsKKworICAvKiBIYW5kbGUgdGhlIG5vcCAoYXNlcSAweDQwLGdyMSxncjEpIHNwZWNpYWxseSAqLworICBpZiAoKGluc24yND09MHg3MCkgJiYgKGluc24xNj09MHg0MCkgJiYgKGluc244PT0weDAxKSAmJiAoaW5zbjA9PTB4MDEpKSB7CisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIm5vcCIpOworICAgIHJldHVybiA0OworICB9CisKKyAgLyogVGhlIG9wY29kZSBpcyBhbHdheXMgaW4gaW5zbjI0LiAgKi8KKyAgZm9yIChvcGNvZGUgPSAmYTI5a19vcGNvZGVzWzBdOworICAgICAgIG9wY29kZSA8ICZhMjlrX29wY29kZXNbbnVtX29wY29kZXNdOworICAgICAgICsrb3Bjb2RlKQorICAgIHsKKyAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIGluc24yNCA8PCAyNCkgPT0gb3Bjb2RlLT5vcGNvZGUpCisJeworCSAgY2hhciAqczsKKwkgIAorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLCBvcGNvZGUtPm5hbWUpOworCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKCpzKQorCQl7CisJCWNhc2UgJ2EnOgorCQkgIHByaW50X2dlbmVyYWwgKGluc244LCBpbmZvKTsKKwkJICBicmVhazsKKwkJICAKKwkJY2FzZSAnYic6CisJCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjAsIGluZm8pOworCQkgIGJyZWFrOworCisJCWNhc2UgJ2MnOgorCQkgIHByaW50X2dlbmVyYWwgKGluc24xNiwgaW5mbyk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wKTsKKwkJICBicmVhazsKKworCQljYXNlICd4JzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCAoaW5zbjE2IDw8IDgpICsgaW5zbjApOworCQkgIGJyZWFrOworCisJCWNhc2UgJ2gnOgorCQkgIC8qIFRoaXMgdXNlZCB0byBiZSAleCBmb3IgYmludXRpbHMuICAqLworCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCisJCQkJICAgIChpbnNuMTYgPDwgMjQpICsgKGluc24wIDw8IDE2KSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCisJCQkJICAgICgoaW5zbjE2IDw8IDgpICsgaW5zbjApIHwgMHhmZmZmMDAwMCk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnUCc6CisJCSAgLyogVGhpcyBvdXRwdXQgbG9va3MganVzdCBsaWtlIGFic29sdXRlIGFkZHJlc3NpbmcsIGJ1dAorCQkgICAgIG1heWJlIHRoYXQncyBPSyAoaXQncyB3aGF0IHRoZSBHREIgbTY4ayBhbmQgRUJNT04KKwkJICAgICBhMjlrIGRpc2Fzc2VtYmxlcnMgZG8pLiAgKi8KKwkJICAvKiBBbGwgdGhlIHNoaWZ0aW5nIGlzIHRvIHNpZ24tZXh0ZW5kIGl0LiAgcCovCisJCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCisJCSAgICAobWVtYWRkciArCisJCSAgICAgKCgoaW50KSgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSkgPDwgMTQpID4+IDE0KSwKKwkJICAgICBpbmZvKTsKKwkJICBicmVhazsKKworCQljYXNlICdBJzoKKwkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKKwkJICAgICgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSwgaW5mbyk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnZSc6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiA+PiA3KTsKKwkJICBicmVhazsKKworCQljYXNlICduJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYgJiAweDdmKTsKKwkJICBicmVhazsKKworCQljYXNlICd2JzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYpOworCQkgIGJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkgIHByaW50X3NwZWNpYWwgKGluc244LCBpbmZvKTsKKwkJICBicmVhazsKKworCQljYXNlICd1JzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjAgPj4gNyk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAncic6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMCA+PiA0KSAmIDcpOworCQkgIGJyZWFrOworCisJCWNhc2UgJ0knOgorCQkgIGlmICgoaW5zbjE2ICYgMykgIT0gMCkKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgJiAzKTsKKwkJICBicmVhazsKKworCQljYXNlICdkJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24wID4+IDIpICYgMyk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnZic6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wICYgMyk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnRic6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMTYgPj4gMikgJiAxNSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnQyc6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiAmIDMpOworCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKKwkJfQorCSAgICB9CisKKwkgIC8qIE5vdyB3ZSBsb29rIGZvciBhIGNvbnN0LGNvbnN0aCBwYWlyIG9mIGluc3RydWN0aW9ucywKKwkgICAgIGluIHdoaWNoIGNhc2Ugd2UgdHJ5IHRvIHByaW50IHRoZSBzeW1ib2xpYyBhZGRyZXNzLiAgKi8KKwkgIGlmIChpbnNuMjQgPT0gMikgIC8qIGNvbnN0aCAqLworCSAgICB7CisJICAgICAgaW50IGVycmNvZGU7CisJICAgICAgY2hhciBwcmV2X2luc25bNF07CisJICAgICAgdW5zaWduZWQgY2hhciBwcmV2X2luc24wLCBwcmV2X2luc244LCBwcmV2X2luc24xNiwgcHJldl9pbnNuMjQ7CisJICAgICAgCisJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LAorCQkJCQkJICAgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sCisJCQkJCQkgICA0LAorCQkJCQkJICAgaW5mbyk7CisJICAgICAgaWYgKGVycmNvZGUgPT0gMCkKKwkJeworCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKKwkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhY2ggdG8gaGFuZGxlCisJCSAgICAgdGhpbmdzIGxpa2UKKwkJICAgICAKKwkJICAgICBjb25zdCBfZm9vCisJCSAgICAgY2FsbCBfcHJpbnRmCisJCSAgICAgY29uc3RoIF9mb28KKwkJICAgICAqLworCQkgICgqZmluZF9ieXRlX2Z1bmMpIChwcmV2X2luc24sICZwcmV2X2luc24wLCAmcHJldl9pbnNuOCwKKwkJCQkgICAgICZwcmV2X2luc24xNiwgJnByZXZfaW5zbjI0KTsKKwkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbjI0KSkKKwkJICAgIHsKKwkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKKwkJCShtZW1hZGRyIC0gOCwgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sIDQsIGluZm8pOworCQkgICAgICAoKmZpbmRfYnl0ZV9mdW5jKSAocHJldl9pbnNuLCAmcHJldl9pbnNuMCwgJnByZXZfaW5zbjgsCisJCQkJCSAmcHJldl9pbnNuMTYsICZwcmV2X2luc24yNCk7CisJCSAgICB9CisJCX0KKwkJICAKKwkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQorCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3QgY29uc3QuICAqLworCSAgICAgIGlmIChlcnJjb2RlID09IDApCisJCXsKKwkJICAvKiBJcyBpdCBjb25zdCB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCisJCSAgaWYgKHByZXZfaW5zbjI0ID09IDMKKwkJICAgICAgJiYgcHJldl9pbnNuOCA9PSBpbnNuOCkKKwkJICAgIHsKKwkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDsgIik7CisJCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQorCQkJKCgoaW5zbjE2IDw8IDI0KSArIChpbnNuMCA8PCAxNikKKwkJCSAgKyAocHJldl9pbnNuMTYgPDwgOCkgKyAocHJldl9pbnNuMCkpLAorCQkJIGluZm8pOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgcmV0dXJuIDQ7CisJfQorICAgIH0KKyAgLyogVGhpcyB1c2VkIHRvIGJlICU4eCBmb3IgYmludXRpbHMuICAqLworICAoKmluZm8tPmZwcmludGZfZnVuYykKKyAgICAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHglMDh4IiwKKyAgICAgKGluc24yNCA8PCAyNCkgKyAoaW5zbjE2IDw8IDE2KSArIChpbnNuOCA8PCA4KSArIGluc24wKTsKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIERpc2Fzc2VtYmxlIGFuIGJpZy1lbmRpYW4gYTI5ayBpbnN0cnVjdGlvbi4gICovCitpbnQKK3ByaW50X2luc25fYmlnX2EyOWsgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpIGZpbmRfYnl0ZXNfYmlnOworICByZXR1cm4gcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbyk7Cit9CisKKy8qIERpc2Fzc2VtYmxlIGEgbGl0dGxlLWVuZGlhbiBhMjlrIGluc3RydWN0aW9uLiAgKi8KK2ludAorcHJpbnRfaW5zbl9saXR0bGVfYTI5ayAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgZmluZF9ieXRlc19saXR0bGU7CisgIHJldHVybiBwcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKTsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvYWNpbmNsdWRlLm00IGIvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMDliOQotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvYWNpbmNsdWRlLm00CkBAIC0wLDAgKzEgQEAKK3NpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCmRpZmYgLS1naXQgYS9vcGNvZGVzL2FjbG9jYWwubTQgYi9vcGNvZGVzL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4NzExZAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvYWNsb2NhbC5tNApAQCAtMCwwICsxLDExMTEgQEAKK2RubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40CisKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKK2RubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitkbmwgUEFSVElDVUxBUiBQVVJQT1NFLgorCitzaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KKyMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgorIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KKworIyBzZXJpYWwgMQorCitkbmwgVXNhZ2U6CitkbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQorCitBQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCitQQUNLQUdFPVskMV0KK0FDX1NVQlNUKFBBQ0tBR0UpCitWRVJTSU9OPVskMl0KK0FDX1NVQlNUKFZFUlNJT04pCitkbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAoraWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCitmaQoraWZlbHNlKFskM10sLAorQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCitBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQorQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQorZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgorIworCitBQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCisgICBmaQorICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCisgICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCisgICBmaQorCisgICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCitmaQorcm0gLWYgY29uZnRlc3QqCitBQ19NU0dfUkVTVUxUKHllcyldKQorCitkbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKK2RubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCitBQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCitbQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgJDE9JDIKKyAgIEFDX01TR19SRVNVTFQoZm91bmQpCitlbHNlCisgICAkMT0iJDMvbWlzc2luZyAkMiIKKyAgIEFDX01TR19SRVNVTFQobWlzc2luZykKK2ZpCitBQ19TVUJTVCgkMSldKQorCisKKyMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAorQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAorW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorCisjIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKK0FDX0NBQ0hFX1NBVkUKKworIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KK0NDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAorTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAorRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKKyR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKKyRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCit8fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCisKKyMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKK0FDX0NBQ0hFX0xPQUQKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKK0FDX1NVQlNUKExJQlRPT0wpZG5sCisKKyMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90CisjIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgorZXhlYyA1Pj4uL2NvbmZpZy5sb2cKK10pCisKK0FDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCitbQUNfUFJFUkVRKDIuMTMpZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAorQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAorZG5sCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCitsaWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgordGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKK3Rlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCit0ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKK3Rlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKK3Rlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgIiRob3N0IiBpbgorKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTMyIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKKyAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKworKi0qLWN5Z3dpbiopCisgIEFDX1NZU19MSUJUT09MX0NZR1dJTgorICA7OworCitlc2FjCisKKyMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAorCitBQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKK1sgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCituZWVkX2xvY2tzPSRlbmFibGV2YWwsCituZWVkX2xvY2tzPXllcykKKworaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgorICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKK2ZpCitdKQorCisjIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0CitBQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQorCisjIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCisjIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KKyMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KKyMgICBgeWVzJy4KK0FDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCitbZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoc2hhcmVkLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAorY2hhbmdlcXVvdGUoWywgXSlkbmwKK1twPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKK25vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisqKQorICBlbmFibGVfc2hhcmVkPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhY10sCitlbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKK10pCisKKyMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAorQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCitbQUNfRU5BQkxFX1NIQVJFRChubyldKQorCisjIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCisjIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KKyMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KKyMgICBgeWVzJy4KK0FDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCitbZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoc3RhdGljLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAorY2hhbmdlcXVvdGUoWywgXSlkbmwKK1twPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKK25vKSBlbmFibGVfc3RhdGljPW5vIDs7CisqKQorICBlbmFibGVfc3RhdGljPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhY10sCitlbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKK10pCisKKyMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYworQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCitbQUNfRU5BQkxFX1NUQVRJQyhubyldKQorCisKKyMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKKyMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQorIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bworIyAgIGB5ZXMnLgorQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKK1tkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCitjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCis8PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKK2NoYW5nZXF1b3RlKFssIF0pZG5sCitbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CitubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OworKikKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCitdKQorCisjIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAorQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCitbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQorCisKKyMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oQUNfUFJPR19MRCwKK1tBQ19BUkdfV0lUSChnbnUtbGQsCitbICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKK3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCithY19wcm9nPWxkCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCisgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKKyAgY2FzZSAiJGFjX3Byb2ciIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCitjaGFuZ2VxdW90ZSgsKWRubAorICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQorICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJworY2hhbmdlcXVvdGUoWyxdKWRubAorICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCitlbHNlCisgIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQorZmkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAorW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCisgICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworICAgICAgZWxzZQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitlbHNlCisgIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGFjX2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitBQ19TVUJTVChMRCkKK0FDX1BST0dfTERfR05VCitdKQorCitBQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICBhY19jdl9wcm9nX2dudV9sZD15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KK2ZpXSkKK10pCisKKyMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oQUNfUFJPR19OTSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKK1tpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBhY19jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKyAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCisJYnJlYWsKKyAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKKwlicmVhaworICAgICAgZWxzZQorCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KK2ZpXSkKK05NPSIkYWNfY3ZfcGF0aF9OTSIKK0FDX01TR19SRVNVTFQoWyROTV0pCitBQ19TVUJTVChOTSkKK10pCisKKyMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCisjIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KK0FDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCitBQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKK1sjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9CisKK2NoYW5nZXF1b3RlKCwpZG5sCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCithY19zeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK2FjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK2FjX3N5bXhmcm09J1wxIFwyXDMgXDMnCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2FjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4KikKKyAgYWNfc3ltY29kZT0nW0JDRFRdJworICA7OworY3lnd2luKiB8IG1pbmd3KikKKyAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikKKyAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisgIDs7Citpcml4KikKKyAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK3NvbGFyaXMqKQorICBhY19zeW1jb2RlPSdbQkRUXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitpZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKyAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCitmaQorY2hhbmdlcXVvdGUoWyxdKWRubAorCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIGFjX3BpcGVfd29ya3M9bm8KKyAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitjaGFyIG5tX3Rlc3RfdmFyOwordm9pZCBubV90ZXN0X2Z1bmMoKXt9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgoraW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgorCisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KKyAgCisgICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KKworICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRhY19ubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJworCisJICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyX3QgYWRkcmVzczsKK30KK2NoYW5nZXF1b3RlKCwpZG5sCitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK2NoYW5nZXF1b3RlKFssXSlkbmwKK3sKK0VPRgorCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYworCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYworICB7MCwgKGx0X3B0cl90KSAwfQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKKwkgIGFjX3NhdmVfTElCUz0iJExJQlMiCisJICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKKwkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKwkgICAgYWNfcGlwZV93b3Jrcz15ZXMKKwkgIGVsc2UKKwkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCisJICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKKwkgIGZpCisJICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQworCWZpCisgICAgICBlbHNlCisJZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCisgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgIGVsc2UKKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworICAgIGZpCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCitdKQorCithY19yZXN1bHQ9eWVzCitpZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgIGFjX3Jlc3VsdD1ubworZmkKK0FDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKK10pCisKKyMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCitBQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCitbQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKK0FDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKK10pCisKKyMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KK0FDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCitbYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCit2b2lkIG5tX3Rlc3RfZnVuYygpe30KK2ludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KK0VPRgoraWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCisgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisgICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgorICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisgICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCisgICAgZWxzZQorICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCisgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKK2ZpCitybSAtcmYgY29uZnRlc3QqCitdKQorQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQorVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQorQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAorXSkKKworIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQorQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWworQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKK0FDX0NIRUNLX0xJQihtLCBjb3MpCitdKQorCisjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgorIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KKyMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCisjIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKKyMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKKyMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAorIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKKyMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KK0FDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKKyAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgorICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKKyAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcworICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OworICBlc2FjCisgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQorXSkKKworIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKKyMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCisjIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgorIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCisjIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCisjICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCisjIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCisjIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KK0FDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKKyAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKKyAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KKyAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7CisgICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCisgICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OworICAgIGVzYWMKKyAgXSkKKyAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgorICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCisgIGZpCitdKQorCitkbmwgb2xkIG5hbWVzCitBQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAorQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKK0FDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCitBQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCitBQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCitBQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCitBQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCitBQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAorQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKK0FDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCisKKyMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KKworQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKK1tBQ19QUkVSRVEoWzIuMTJdKQorQUNfQ09ORklHX0hFQURFUihbJDFdKQorZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCitkbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCitkbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAorZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgorQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAoraWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAorPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKKzw8YW1faW5keD0xCitmb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCisgIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KKyAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KKyAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAorICAgIDs7CisgIGVzYWMKKyAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCitkb25lPDw+PmRubD4+KQorY2hhbmdlcXVvdGUoWyxdKSldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KKyMgRnJvbSBKaW0gTWV5ZXJpbmcKKworIyBzZXJpYWwgMQorCitBQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCisgIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKK1sgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQorICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQorICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICBBQ19TVUJTVChNQUlOVClkbmwKK10KKykKKworIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KKworQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCitbQUNfU1VCU1QoJDFfVFJVRSkKK0FDX1NVQlNUKCQxX0ZBTFNFKQoraWYgJDI7IHRoZW4KKyAgJDFfVFJVRT0KKyAgJDFfRkFMU0U9JyMnCitlbHNlCisgICQxX1RSVUU9JyMnCisgICQxX0ZBTFNFPQorZmldKQorCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCitBQ19ERUZVTihDWV9XSVRIX05MUywKKyAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKKyAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUworICAgIEFDX0FSR19FTkFCTEUobmxzLAorICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCisgICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQorICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCisgICAgQUNfU1VCU1QoVVNFX05MUykKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCisgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTLCAxLCBbRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfQVJHX1dJVEgoaW5jbHVkZWQtZ2V0dGV4dCwKKyAgICAgICAgWyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmVdLAorICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsLAorICAgICAgICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vKQorICAgICAgQUNfTVNHX1JFU1VMVCgkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCkKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgZG5sIFVzZXIgZG9lcyBub3QgaW5zaXN0IG9uIHVzaW5nIEdOVSBOTFMgbGlicmFyeS4gIEZpZ3VyZSBvdXQgd2hhdAorICAgICAgICBkbmwgdG8gdXNlLiAgSWYgZ2V0dGV4dCBvciBjYXRnZXRzIGFyZSBhdmFpbGFibGUgKGluIHRoaXMgb3JkZXIpIHdlCisgICAgICAgIGRubCB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gR05VIE5MUyBsaWJyYXJ5LgorCWRubCBjYXRnZXRzIGlzIG9ubHkgdXNlZCBpZiBwZXJtaXR0ZWQgYnkgb3B0aW9uIC0td2l0aC1jYXRnZXRzLgorCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlBQ19DSEVDS19IRUFERVIobGliaW50bC5oLAorCSAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJjXSwgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMsCisJICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD5dLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCisJICAgICAgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcywgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8pXSkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIEFDX0NIRUNLX0xJQihpbnRsLCBiaW5kdGV4dGRvbWFpbiwKKwkgICAgICAgW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsXSwKKwkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsLAorCQkgW0FDX1RSWV9MSU5LKFtdLCBbcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMsCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubyldKV0pCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKKwkJCVtEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC5dKQorCSAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJCVt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbm8pZG5sCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlBQ19DSEVDS19GVU5DUyhkY2dldHRleHQpCisJCUFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQorCQlBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKKwkJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCisJCUFDX1RSWV9MSU5LKCwgW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cl0sCisJCSAgW0NBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlXSwKKwkJICBbQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWJdKQorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJXSkKKworCWRubCBJbiB0aGUgc3RhbmRhcmQgZ2V0dGV4dCwgd2Ugd291bGQgbm93IGNoZWNrIGZvciBjYXRnZXRzLgorICAgICAgICBkbmwgSG93ZXZlciwgd2UgbmV2ZXIgd2FudCB0byB1c2UgY2F0Z2V0cyBmb3Igb3VyIHJlbGVhc2VzLgorCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICBkbmwgTmVpdGhlciBnZXR0ZXh0IG5vciBjYXRnZXRzIGluIGluY2x1ZGVkIGluIHRoZSBDIGxpYnJhcnkuCisJICBkbmwgRmFsbCBiYWNrIG9uIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCisJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIEdOVSBOTFMgbGlicmFyeS4KKyAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKKwkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiXSwgbXNnZm10KQorICAgICAgICBBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKyAgICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIl0sIDopCisgICAgICAgIEFDX1NVQlNUKE1TR0ZNVCkKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgeGdldHRleHQuCisgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCWRubCBJZiBpdCBpcyBubyBHTlUgeGdldHRleHQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKKwlkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgorCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIEFDX01TR19SRVNVTFQoCisJICAgIFtmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICBkbmwgVGhlc2UgcnVsZXMgYXJlIHNvbGVseSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBnb2FsLiAgV2hpbGUgZG9pbmcgdGhpcworICAgIGRubCB3ZSBvbmx5IGhhdmUgdG8ga2VlcCBleGFjdGx5IG9uZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgY2F0YWxvZ3MKKyAgICBkbmwgaW4gY29uZmlndXJlLmluLgorICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgorICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCisgICAgZG9uZQorCisgICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCisgICAgQUNfU1VCU1QoVVNFX0lOQ0xVREVEX0xJQklOVEwpCisgICAgQUNfU1VCU1QoQ0FUQUxPR1MpCisgICAgQUNfU1VCU1QoQ0FUT0JKRVhUKQorICAgIEFDX1NVQlNUKERBVEFESVJOQU1FKQorICAgIEFDX1NVQlNUKEdNT0ZJTEVTKQorICAgIEFDX1NVQlNUKElOU1RPQkpFWFQpCisgICAgQUNfU1VCU1QoSU5UTERFUFMpCisgICAgQUNfU1VCU1QoSU5UTExJQlMpCisgICAgQUNfU1VCU1QoSU5UTE9CSlMpCisgICAgQUNfU1VCU1QoUE9GSUxFUykKKyAgICBBQ19TVUJTVChQT1NVQikKKyAgXSkKKworQUNfREVGVU4oQ1lfR05VX0dFVFRFWFQsCisgIFtBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorICAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAorICAgQUNfUkVRVUlSRShbQUNfSVNDX1BPU0lYXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfQ19JTkxJTkVdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19UWVBFX1NJWkVfVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19GVU5DX01NQVBdKWRubAorCisgICBBQ19DSEVDS19IRUFERVJTKFthcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaF0pCisgICBBQ19DSEVDS19GVU5DUyhbZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dF0pCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgQUNfQ0hFQ0tfRlVOQ1Moc3RwY3B5KQorICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIEFDX0RFRklORShIQVZFX1NUUENQWSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uXSkKKyAgIGZpCisKKyAgIEFNX0xDX01FU1NBR0VTCisgICBDWV9XSVRIX05MUworCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkKQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgQUNfTVNHX1JFU1VMVCgkTElOR1VBUykKKyAgICAgZmkKKworICAgICBkbmwgQ29uc3RydWN0IGxpc3Qgb2YgbmFtZXMgb2YgY2F0YWxvZyBmaWxlcyB0byBiZSBjb25zdHJ1Y3RlZC4KKyAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQorICAgICBmaQorICAgZmkKKworICAgZG5sIFRoZSByZWZlcmVuY2UgdG8gPGxvY2FsZS5oPiBpbiB0aGUgaW5zdGFsbGVkIDxsaWJpbnRsLmg+IGZpbGUKKyAgIGRubCBtdXN0IGJlIHJlc29sdmVkIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdCB0aGUgdXNlcnMgb2YgdGhpcworICAgZG5sIHRvIGRlZmluZSBIQVZFX0xPQ0FMRV9ILgorICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCisgICBlbHNlCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKKy8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKKyAgIGZpCisgICBBQ19TVUJTVChJTkNMVURFX0xPQ0FMRV9IKQorCisgICBkbmwgRGV0ZXJtaW5lIHdoaWNoIGNhdGFsb2cgZm9ybWF0IHdlIGhhdmUgKGlmIGFueSBpcyBuZWVkZWQpCisgICBkbmwgRm9yIG5vdyB3ZSBrbm93IGFib3V0IHR3byBkaWZmZXJlbnQgZm9ybWF0czoKKyAgIGRubCAgIExpbnV4IGxpYmMtNSBhbmQgdGhlIG5vcm1hbCBYL09wZW4gZm9ybWF0CisgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZlcnNpb24uaCwgbXNnZm9ybWF0PWxpbnV4LCBtc2dmb3JtYXQ9eG9wZW4pCisKKwkgZG5sIFRyYW5zZm9ybSB0aGUgU0VEIHNjcmlwdHMgd2hpbGUgY29weWluZyBiZWNhdXNlIHNvbWUgZHVtYiBTRURzCisgICAgICAgICBkbmwgY2Fubm90IGhhbmRsZSBjb21tZW50cy4KKwkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgZG5sIHBvMnRibC5zZWQgaXMgYWx3YXlzIG5lZWRlZC4KKyAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAorCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCisgICBmaQorCisgICBkbmwgSW4gdGhlIGludGwvTWFrZWZpbGUuaW4gd2UgaGF2ZSBhIHNwZWNpYWwgZGVwZW5kZW5jeSB3aGljaCBtYWtlcworICAgZG5sIG9ubHkgc2Vuc2UgZm9yIGdldHRleHQuICBXZSBjb21tZW50IHRoaXMgb3V0IGZvciBub24tZ2V0dGV4dAorICAgZG5sIHBhY2thZ2VzLgorICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIEFDX1NVQlNUKEdUX05PKQorICAgQUNfU1VCU1QoR1RfWUVTKQorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICBBQ19TVUJTVChNS0lOU1RBTExESVJTKQorCisgICBkbmwgKioqIEZvciBub3cgdGhlIGxpYnRvb2wgc3VwcG9ydCBpbiBpbnRsL01ha2VmaWxlIGlzIG5vdCBmb3IgcmVhbC4KKyAgIGw9CisgICBBQ19TVUJTVChsKQorCisgICBkbmwgR2VuZXJhdGUgbGlzdCBvZiBmaWxlcyB0byBiZSBwcm9jZXNzZWQgYnkgeGdldHRleHQgd2hpY2ggd2lsbAorICAgZG5sIGJlIGluY2x1ZGVkIGluIHBvL01ha2VmaWxlLiAgQnV0IG9ubHkgZG8gdGhpcyBpZiB0aGUgcG8gZGlyZWN0b3J5CisgICBkbmwgZXhpc3RzIGluIHNyY2Rpci4KKyAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICBdKQorCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCitkbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCitkbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCitBQ19ERUZVTihBTV9QQVRIX1BST0dfV0lUSF9URVNULAorWyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKK0FDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAorW2Nhc2UgIlskXSQxIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluIGlmZWxzZShbJDVdLCAsICRQQVRILCBbJDVdKTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgWyQzXTsgdGhlbgorCWFjX2N2X3BhdGhfJDE9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2RubCBJZiBubyA0dGggYXJnIGlzIGdpdmVuLCBsZWF2ZSB0aGUgY2FjaGUgdmFyaWFibGUgdW5zZXQsCitkbmwgc28gQUNfUEFUSF9QUk9HUyB3aWxsIGtlZXAgbG9va2luZy4KK2lmZWxzZShbJDRdLCAsICwgWyAgdGVzdCAteiAiWyRdYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDQiCitdKWRubAorICA7OworZXNhY10pZG5sCiskMT0iJGFjX2N2X3BhdGhfJDEiCitpZiB0ZXN0IC1uICJbJF0kMSI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVChbJF0kMSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitBQ19TVUJTVCgkMSlkbmwKK10pCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworQUNfREVGVU4oQU1fTENfTUVTU0FHRVMsCisgIFtpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIExDX01FU1NBR0VTXSwgYW1fY3ZfdmFsX0xDX01FU1NBR0VTLAorICAgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bG9jYWxlLmg+XSwgW3JldHVybiBMQ19NRVNTQUdFU10sCisgICAgICAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcywgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vKV0pCisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBBQ19ERUZJTkUoSEFWRV9MQ19NRVNTQUdFUywgMSwKKwkJW0RlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuXSkKKyAgICBmaQorICBmaV0pCisKZGlmZiAtLWdpdCBhL29wY29kZXMvYWxwaGEtZGlzLmMgYi9vcGNvZGVzL2FscGhhLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTU3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2FscGhhLWRpcy5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiBhbHBoYS1kaXMuYyAtLSBEaXNhc3NlbWJsZSBBbHBoYSBBWFAgaW5zdHJ1Y3Rpb25zCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAorICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIGhhbmRsaW5nIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgorCisvKiBPU0YgcmVnaXN0ZXIgbmFtZXMuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9zZl9yZWduYW1lc1s2NF0gPQoreworICAidjAiLCAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiLCAidDUiLCAidDYiLAorICAidDciLCAiczAiLCAiczEiLCAiczIiLCAiczMiLCAiczQiLCAiczUiLCAiZnAiLAorICAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAidDgiLCAidDkiLAorICAidDEwIiwgInQxMSIsICJyYSIsICJ0MTIiLCAiYXQiLCAiZ3AiLCAic3AiLCAiemVybyIsCisgICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLCAiJGY0IiwgIiRmNSIsICIkZjYiLCAiJGY3IiwKKyAgIiRmOCIsICIkZjkiLCAiJGYxMCIsICIkZjExIiwgIiRmMTIiLCAiJGYxMyIsICIkZjE0IiwgIiRmMTUiLAorICAiJGYxNiIsICIkZjE3IiwgIiRmMTgiLCAiJGYxOSIsICIkZjIwIiwgIiRmMjEiLCAiJGYyMiIsICIkZjIzIiwKKyAgIiRmMjQiLCAiJGYyNSIsICIkZjI2IiwgIiRmMjciLCAiJGYyOCIsICIkZjI5IiwgIiRmMzAiLCAiJGYzMSIKK307CisKKy8qIFZNUyByZWdpc3RlciBuYW1lcy4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1zX3JlZ25hbWVzWzY0XSA9Cit7CisgICJSMCIsICJSMSIsICJSMiIsICJSMyIsICJSNCIsICJSNSIsICJSNiIsICJSNyIsCisgICJSOCIsICJSOSIsICJSMTAiLCAiUjExIiwgIlIxMiIsICJSMTMiLCAiUjE0IiwgIlIxNSIsCisgICJSMTYiLCAiUjE3IiwgIlIxOCIsICJSMTkiLCAiUjIwIiwgIlIyMSIsICJSMjIiLCAiUjIzIiwKKyAgIlIyNCIsICJBSSIsICJSQSIsICJQViIsICJBVCIsICJGUCIsICJTUCIsICJSWiIsCisgICJGMCIsICJGMSIsICJGMiIsICJGMyIsICJGNCIsICJGNSIsICJGNiIsICJGNyIsCisgICJGOCIsICJGOSIsICJGMTAiLCAiRjExIiwgIkYxMiIsICJGMTMiLCAiRjE0IiwgIkYxNSIsCisgICJGMTYiLCAiRjE3IiwgIkYxOCIsICJGMTkiLCAiRjIwIiwgIkYyMSIsICJGMjIiLCAiRjIzIiwKKyAgIkYyNCIsICJGMjUiLCAiRjI2IiwgIkYyNyIsICJGMjgiLCAiRjI5IiwgIkYzMCIsICJGWiIKK307CisKKy8qIERpc2Fzc2VtYmxlIEFscGhhIGluc3RydWN0aW9ucy4gICovCisKK2ludAorcHJpbnRfaW5zbl9hbHBoYSAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZV9pbmRleFtBWFBfTk9QUysxXTsKKyAgY29uc3QgY2hhciAqIGNvbnN0ICogcmVnbmFtZXM7CisgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZSwgKm9wY29kZV9lbmQ7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7CisgIHVuc2lnbmVkIGluc24sIG9wLCBpc2FfbWFzazsKKyAgaW50IG5lZWRfY29tbWE7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWFqb3JvcCB0YWJsZSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoICovCisgIGlmICghb3Bjb2RlX2luZGV4WzBdKQorICAgIHsKKyAgICAgIG9wY29kZSA9IGFscGhhX29wY29kZXM7CisgICAgICBvcGNvZGVfZW5kID0gb3Bjb2RlICsgYWxwaGFfbnVtX29wY29kZXM7CisKKyAgICAgIGZvciAob3AgPSAwOyBvcCA8IEFYUF9OT1BTOyArK29wKQorICAgICAgICB7CisgICAgICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKKyAgICAgICAgICB3aGlsZSAob3Bjb2RlIDwgb3Bjb2RlX2VuZCAmJiBvcCA9PSBBWFBfT1AgKG9wY29kZS0+b3Bjb2RlKSkKKwkgICAgKytvcGNvZGU7CisgICAgICAgIH0KKyAgICAgIG9wY29kZV9pbmRleFtvcF0gPSBvcGNvZGU7CisgICAgfQorCisgIGlmIChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZXZheF9mbGF2b3VyKQorICAgIHJlZ25hbWVzID0gdm1zX3JlZ25hbWVzOworICBlbHNlCisgICAgcmVnbmFtZXMgPSBvc2ZfcmVnbmFtZXM7CisKKyAgaXNhX21hc2sgPSBBWFBfT1BDT0RFX05PUEFMOworICBzd2l0Y2ggKGluZm8tPm1hY2gpCisgICAgeworICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY0OgorICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NToKKyAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjY6CisgICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNjsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBSZWFkIHRoZSBpbnNuIGludG8gYSBob3N0IHdvcmQgKi8KKyAgeworICAgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgICBpbnQgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IDApCisgICAgICB7CisgICAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisgIH0KKworICAvKiBHZXQgdGhlIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBvcCA9IEFYUF9PUCAoaW5zbik7CisKKyAgLyogRmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCisgIG9wY29kZV9lbmQgPSBvcGNvZGVfaW5kZXhbb3ArMV07CisgIGZvciAob3Bjb2RlID0gb3Bjb2RlX2luZGV4W29wXTsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgKytvcGNvZGUpCisgICAgeworICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZSkKKwljb250aW51ZTsKKworICAgICAgaWYgKCEob3Bjb2RlLT5mbGFncyAmIGlzYV9tYXNrKSkKKwljb250aW51ZTsKKworICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCisJIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQorCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCisgICAgICB7CisgICAgICAgIGludCBpbnZhbGlkID0gMDsKKyAgICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQorCSAgeworICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OworCSAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKKwkgICAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAmaW52YWxpZCk7CisJICB9CisgICAgICAgIGlmIChpbnZhbGlkKQorCSAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCisgICAgICBnb3RvIGZvdW5kOworICAgIH0KKworICAvKiBObyBpbnN0cnVjdGlvbiBmb3VuZCAqLworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nICUjMDh4IiwgaW5zbik7CisgICAgCisgIHJldHVybiA0OworCitmb3VuZDoKKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7CisgIGlmIChvcGNvZGUtPm9wZXJhbmRzWzBdICE9IDApCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOworCisgIC8qIE5vdyBleHRyYWN0IGFuZCBwcmludCB0aGUgb3BlcmFuZHMuICAqLworICBuZWVkX2NvbW1hID0gMDsKKyAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gYWxwaGFfb3BlcmFuZHMgKyAqb3BpbmRleDsKKyAgICAgIGludCB2YWx1ZTsKKworICAgICAgLyogT3BlcmFuZHMgdGhhdCBhcmUgbWFya2VkIEZBS0UgYXJlIHNpbXBseSBpZ25vcmVkLiAgV2UKKwkgYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCB0aGUgZXh0cmFjdCBmdW5jdGlvbiBjb25zaWRlcmVkCisJIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCisgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkgIT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCisJdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOworICAgICAgZWxzZQorCXsKKwkgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7CisJICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpCisJICAgIHsKKwkgICAgICBpbnQgc2lnbmJpdCA9IDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKTsKKwkgICAgICB2YWx1ZSA9ICh2YWx1ZSBeIHNpZ25iaXQpIC0gc2lnbmJpdDsKKwkgICAgfQorCX0KKworICAgICAgaWYgKG5lZWRfY29tbWEgJiYKKwkgICgob3BlcmFuZC0+ZmxhZ3MgJiAoQVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BKSkKKwkgICAhPSBBWFBfT1BFUkFORF9QQVJFTlMpKQorCXsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOworCX0KKyAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKKworICAgICAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KKyAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0lSKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWduYW1lc1t2YWx1ZV0pOworICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GUFIpCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlKzMyXSk7CisgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKQorCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKyB2YWx1ZSwgaW5mbyk7CisgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOworICAgICAgZWxzZQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSN4IiwgdmFsdWUpOworCisgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9QQVJFTlMpCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7CisgICAgICBuZWVkX2NvbW1hID0gMTsKKyAgICB9CisKKyAgcmV0dXJuIDQ7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FscGhhLW9wYy5jIGIvb3Bjb2Rlcy9hbHBoYS1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2VhZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9hbHBoYS1vcGMuYwpAQCAtMCwwICsxLDE1NDYgQEAKKy8qIGFscGhhLW9wYy5jIC0tIEFscGhhIEFYUCBvcGNvZGUgbGlzdAorICAgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEBjeWdudXMuY29tPiwKKyAgIHBhdHRlcm5lZCBhZnRlciB0aGUgUFBDIG9wY29kZSBoYW5kbGluZyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQorICAgdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgICAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQorICAgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgIm9waW50bC5oIgorCisvKiBUaGlzIGZpbGUgaG9sZHMgdGhlIEFscGhhIEFYUCBvcGNvZGUgdGFibGUuICBUaGUgb3Bjb2RlIHRhYmxlIGluY2x1ZGVzCisgICBhbG1vc3QgYWxsIG9mIHRoZSBleHRlbmRlZCBpbnN0cnVjdGlvbiBtbmVtb25pY3MuICBUaGlzIHBlcm1pdHMgdGhlCisgICBkaXNhc3NlbWJsZXIgdG8gdXNlIHRoZW0sIGFuZCBzaW1wbGlmaWVzIHRoZSBhc3NlbWJsZXIgbG9naWMsIGF0IHRoZQorICAgY29zdCBvZiBpbmNyZWFzaW5nIHRoZSB0YWJsZSBzaXplLiAgVGhlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50CisgICBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgorCisgICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQgaW5zZXJ0aW5nCisgICBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMgZmlsZS4KKworICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYmFzZSBpbnN0cnVjdGlvbiBzZXQgd2FzIGNvbXBpbGVkIGZyb20gdGhlCisgICBfQWxwaGEgQXJjaGl0ZWN0dXJlIEhhbmRib29rXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUUQyS0ItVEUsCisgICB2ZXJzaW9uIDIuCisKKyAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBvc3QtZXY1IGFyY2hpdGVjdHVyZSBleHRlbnNpb25zIEJXWCwgQ0lYIGFuZAorICAgTUFYIGNhbWUgZnJvbSB2ZXJzaW9uIDMgb2YgdGhpcyBzYW1lIGRvY3VtZW50LCB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZQorICAgb24tbGluZSBhdCBodHRwOi8vZnRwLmRpZ2l0YWwuY29tL3B1Yi9EaWdpdGFsL2luZm8vc2VtaWNvbmR1Y3RvcgorICAgL2xpdGVyYXR1cmUvYWxwaGFoYjIucGRmCisKKyAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNCBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQorICAgX0RFQ2NoaXAgMjEwNjQgYW5kIERFQ2NoaXAgMjEwNjRBIEFscGhhIEFYUCBNaWNyb3Byb2Nlc3NvcnMgSGFyZHdhcmUKKyAgIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsIE9yZGVyIE51bWJlciBFQy1ROVpVQS1URSwgcHJlbGltaW5hcnkKKyAgIHJldmlzaW9uIGRhdGVkIEp1bmUgMTk5NC4KKworICAgVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgRVY1IFBBTGNvZGUgaW5zdHJ1Y3Rpb25zIHdhcyBjb21waWxlZCBmcm9tCisgICBfQWxwaGEgMjExNjQgTWljcm9wcm9jZXNzb3IgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbF8sIERpZ2l0YWwKKyAgIE9yZGVyIE51bWJlciBFQy1RQUVRQi1URSwgcHJlbGltaW5hcnkgcmV2aXNpb24gZGF0ZWQgQXByaWwgMTk5NS4gICovCisMCisvKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmJhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOworc3RhdGljIHVuc2lnbmVkIGluc2VydF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3phIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOworc3RhdGljIHVuc2lnbmVkIGluc2VydF96YiBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOworc3RhdGljIHVuc2lnbmVkIGluc2VydF9qaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnNlcnRfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKKworc3RhdGljIGludCBleHRyYWN0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOworc3RhdGljIGludCBleHRyYWN0X3JjYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOworc3RhdGljIGludCBleHRyYWN0X3phIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7CitzdGF0aWMgaW50IGV4dHJhY3RfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKK3N0YXRpYyBpbnQgZXh0cmFjdF96YyBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOworc3RhdGljIGludCBleHRyYWN0X2JkaXNwIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7CitzdGF0aWMgaW50IGV4dHJhY3RfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKK3N0YXRpYyBpbnQgZXh0cmFjdF9ldjZod2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7CisKKwwKKy8qIFRoZSBvcGVyYW5kcyB0YWJsZSAgKi8KKworY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgYWxwaGFfb3BlcmFuZHNbXSA9Cit7CisgIC8qIFRoZSBmaWVsZHMgYXJlIGJpdHMsIHNoaWZ0LCBpbnNlcnQsIGV4dHJhY3QsIGZsYWdzICovCisgIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgZW5kLW9mLWxpc3QgKi8KKyNkZWZpbmUgVU5VU0VECQkwCisgIHsgMCwgMCwgMCwgMCwgMCB9LAorCisgIC8qIFRoZSBwbGFpbiBpbnRlZ2VyIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBSQQkJKFVOVVNFRCArIDEpCisgIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0lSLCAwLCAwIH0sCisjZGVmaW5lIFJCCQkoUkEgKyAxKQorICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAorI2RlZmluZSBSQwkJKFJCICsgMSkKKyAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAorCisgIC8qIFRoZSBwbGFpbiBmcCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgRkEJCShSQyArIDEpCisgIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAorI2RlZmluZSBGQgkJKEZBICsgMSkKKyAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRlBSLCAwLCAwIH0sCisjZGVmaW5lIEZDCQkoRkIgKyAxKQorICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAorCisgIC8qIFRoZSBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVuIHRoZXkgYXJlIFpFUk8gKi8KKyNkZWZpbmUgWkEJCShGQyArIDEpCisgIHsgNSwgMjEsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YSwgZXh0cmFjdF96YSB9LAorI2RlZmluZSBaQgkJKFpBICsgMSkKKyAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3piLCBleHRyYWN0X3piIH0sCisjZGVmaW5lIFpDCQkoWkIgKyAxKQorICB7IDUsIDAsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YywgZXh0cmFjdF96YyB9LAorCisgIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzICovCisjZGVmaW5lIFBSQgkJKFpDICsgMSkKKyAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TLCAwLCAwIH0sCisKKyAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbmVlZHMgcGFyZW50aGVzZXMgX2FuZF8gYSBwcmVjZWRpbmcgY29tbWEgKi8KKyNkZWZpbmUgQ1BSQgkJKFBSQiArIDEpCisgIHsgNSwgMTYsIDAsCisgICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BLCAwLCAwIH0sCisKKyAgLyogVGhlIFJCIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgKi8KKyNkZWZpbmUgUkJBCQkoQ1BSQiArIDEpCisgIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF9yYmEsIGV4dHJhY3RfcmJhIH0sCisKKyAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgUkIgZmllbGQgKi8KKyNkZWZpbmUgUkNBCQkoUkJBICsgMSkKKyAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmNhLCBleHRyYWN0X3JjYSB9LAorCisgIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KKyNkZWZpbmUgRFJDMQkJKFJDQSArIDEpCisgIHsgNSwgMCwgMCwKKyAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCisKKyAgLyogVGhlIFJDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLworI2RlZmluZSBEUkMyCQkoRFJDMSArIDEpCisgIHsgNSwgMCwgMCwKKyAgICBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAorCisgIC8qIFRoZSBGQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkEgKi8KKyNkZWZpbmUgREZDMQkJKERSQzIgKyAxKQorICB7IDUsIDAsIDAsCisgICAgQVhQX09QRVJBTkRfRlBSfEFYUF9PUEVSQU5EX0RFRkFVTFRfRklSU1QsIDAsIDAgfSwKKworICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJCICovCisjZGVmaW5lIERGQzIJCShERkMxICsgMSkKKyAgeyA1LCAwLCAwLAorICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCwgMCwgMCB9LAorCisgIC8qIFRoZSB1bnNpZ25lZCA4LWJpdCBsaXRlcmFsIG9mIE9wZXJhdGUgZm9ybWF0IGluc25zICovCisjZGVmaW5lIExJVAkJKERGQzIgKyAxKQorICB7IDgsIDEzLCAtTElULCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAorCisgIC8qIFRoZSBzaWduZWQgMTYtYml0IGRpc3BsYWNlbWVudCBvZiBNZW1vcnkgZm9ybWF0IGluc25zLiAgRnJvbSBoZXJlCisgICAgIHdlIGNhbid0IHRlbGwgd2hhdCByZWxvY2F0aW9uIHNob3VsZCBiZSB1c2VkLCBzbyBkb24ndCB1c2UgYSBkZWZhdWx0LiAqLworI2RlZmluZSBNRElTUAkJKExJVCArIDEpCisgIHsgMTYsIDAsIC1NRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCisKKyAgLyogVGhlIHNpZ25lZCAiMjMtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiBCcmFuY2ggZm9ybWF0IGluc25zICovCisjZGVmaW5lIEJESVNQCQkoTURJU1AgKyAxKQorICB7IDIxLCAwLCBCRkRfUkVMT0NfMjNfUENSRUxfUzIsIAorICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFLCBpbnNlcnRfYmRpc3AsIGV4dHJhY3RfYmRpc3AgfSwKKworICAvKiBUaGUgMjYtYml0IFBBTGNvZGUgZnVuY3Rpb24gKi8KKyNkZWZpbmUgUEFMRk4JCShCRElTUCArIDEpCisgIHsgMjYsIDAsIC1QQUxGTiwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKKworICAvKiBUaGUgb3B0aW9uYWwgc2lnbmVkICIxNi1iaXQiIGFsaWduZWQgZGlzcGxhY2VtZW50IG9mIHRoZSBKTVAvSlNSIGhpbnQgKi8KKyNkZWZpbmUgSk1QSElOVAkJKFBBTEZOICsgMSkKKyAgeyAxNCwgMCwgQkZEX1JFTE9DX0FMUEhBX0hJTlQsCisgICAgQVhQX09QRVJBTkRfUkVMQVRJVkV8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPfEFYUF9PUEVSQU5EX05PT1ZFUkZMT1csCisgICAgaW5zZXJ0X2poaW50LCBleHRyYWN0X2poaW50IH0sCisKKyAgLyogVGhlIG9wdGlvbmFsIGhpbnQgdG8gUkVUL0pTUl9DT1JPVVRJTkUgKi8KKyNkZWZpbmUgUkVUSElOVAkJKEpNUEhJTlQgKyAxKQorICB7IDE0LCAwLCAtUkVUSElOVCwKKyAgICBBWFBfT1BFUkFORF9VTlNJR05FRHxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk8sIDAsIDAgfSwKKworICAvKiBUaGUgMTItYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2WzQ2XSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KKyNkZWZpbmUgRVY0SFdESVNQCShSRVRISU5UICsgMSkKKyNkZWZpbmUgRVY2SFdESVNQCShFVjRIV0RJU1ApCisgIHsgMTIsIDAsIC1FVjRIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAorCisgIC8qIFRoZSA1LWJpdCBpbmRleCBmb3IgdGhlIGV2NCBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KKyNkZWZpbmUgRVY0SFdJTkRFWAkoRVY0SFdESVNQICsgMSkKKyAgeyA1LCAwLCAtRVY0SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKKworICAvKiBUaGUgOC1iaXQgaW5kZXggZm9yIHRoZSBvZGRseSB1bnF1YWxpZmllZCBod19tW3RmXXByIGluc25zCisgICAgIHRoYXQgb2NjdXIgaW4gREVDIFBBTGNvZGUuICAqLworI2RlZmluZSBFVjRFWFRIV0lOREVYCShFVjRIV0lOREVYICsgMSkKKyAgeyA4LCAwLCAtRVY0RVhUSFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKKworICAvKiBUaGUgMTAtYml0IGRpc3BsYWNlbWVudCBmb3IgdGhlIGV2NSBod197bGQsc3R9IChwYWwxYi9wYWwxZikgaW5zbnMgKi8KKyNkZWZpbmUgRVY1SFdESVNQCShFVjRFWFRIV0lOREVYICsgMSkKKyAgeyAxMCwgMCwgLUVWNUhXRElTUCwgQVhQX09QRVJBTkRfU0lHTkVELCAwLCAwIH0sCisKKyAgLyogVGhlIDE2LWJpdCBpbmRleCBmb3IgdGhlIGV2NSBod19tW2Z0XXByIChwYWwxOS9wYWwxZCkgaW5zbnMgKi8KKyNkZWZpbmUgRVY1SFdJTkRFWAkoRVY1SFdESVNQICsgMSkKKyAgeyAxNiwgMCwgLUVWNUhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCisKKyAgLyogVGhlIDE2LWJpdCBjb21iaW5lZCBpbmRleC9zY29yZWJvYXJkIG1hc2sgZm9yIHRoZSBldjYKKyAgICAgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCisjZGVmaW5lIEVWNkhXSU5ERVgJKEVWNUhXSU5ERVggKyAxKQorICB7IDE2LCAwLCAtRVY2SFdJTkRFWCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKKworICAvKiBUaGUgMTMtYml0IGJyYW5jaCBoaW50IGZvciB0aGUgZXY2IGh3X2ptcC9qc3IgKHBhbDFlKSBpbnNuICovCisjZGVmaW5lIEVWNkhXSk1QSElOVAkoRVY2SFdJTkRFWCsgMSkKKyAgeyA4LCAwLCAtRVY2SFdKTVBISU5ULAorICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAorICAgIGluc2VydF9ldjZod2poaW50LCBleHRyYWN0X2V2Nmh3amhpbnQgfQorfTsKKworY29uc3QgaW50IGFscGhhX251bV9vcGVyYW5kcyA9IHNpemVvZihhbHBoYV9vcGVyYW5kcykvc2l6ZW9mKCphbHBoYV9vcGVyYW5kcyk7CisKKy8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBSQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnNuLgorICAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBmYWtlLiAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcworICAgdGhlIFJBIGZpZWxkIGludG8gdGhlIFJCIGZpZWxkLCBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdAorICAgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlIHNhbWUuICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHVuc2lnbmVkCitpbnNlcnRfcmJhKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKK30KKworc3RhdGljIGludAorZXh0cmFjdF9yYmEoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKKyAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTYpICYgMHgxZikpCisgICAgKmludmFsaWQgPSAxOworICByZXR1cm4gMDsKK30KKworCisvKiBUaGUgc2FtZSBmb3IgdGhlIFJDIGZpZWxkICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHVuc2lnbmVkCitpbnNlcnRfcmNhKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgcmV0dXJuIGluc24gfCAoKGluc24gPj4gMjEpICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbnQKK2V4dHJhY3RfcmNhKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCisgICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKGluc24gJiAweDFmKSkKKyAgICAqaW52YWxpZCA9IDE7CisgIHJldHVybiAwOworfQorCisKKy8qIEZha2UgYXJndW1lbnRzIGluIHdoaWNoIHRoZSByZWdpc3RlcnMgbXVzdCBiZSBzZXQgdG8gWkVSTyAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB1bnNpZ25lZAoraW5zZXJ0X3phKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgcmV0dXJuIGluc24gfCAoMzEgPDwgMjEpOworfQorCitzdGF0aWMgaW50CitleHRyYWN0X3phKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAzMSkKKyAgICAqaW52YWxpZCA9IDE7CisgIHJldHVybiAwOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB1bnNpZ25lZAoraW5zZXJ0X3piKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgcmV0dXJuIGluc24gfCAoMzEgPDwgMTYpOworfQorCitzdGF0aWMgaW50CitleHRyYWN0X3piKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMICYmICgoaW5zbiA+PiAxNikgJiAweDFmKSAhPSAzMSkKKyAgICAqaW52YWxpZCA9IDE7CisgIHJldHVybiAwOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB1bnNpZ25lZAoraW5zZXJ0X3pjKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgcmV0dXJuIGluc24gfCAzMTsKK30KKworc3RhdGljIGludAorZXh0cmFjdF96YyhpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoaW5zbiAmIDB4MWYpICE9IDMxKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGRpc3BsYWNlbWVudCBmaWVsZCBvZiBhIEJyYW5jaCBmb3JtYXQgaW5zbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZAoraW5zZXJ0X2JkaXNwKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQorICAgICplcnJtc2cgPSBfKCJicmFuY2ggb3BlcmFuZCB1bmFsaWduZWQiKTsKKyAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDFGRkZGRik7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGludAorZXh0cmFjdF9iZGlzcChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRkZGKSBeIDB4MTAwMDAwKSAtIDB4MTAwMDAwKTsKK30KKworCisvKiBUaGUgaGludCBmaWVsZCBvZiBhIEpNUC9KU1IgaW5zbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZAoraW5zZXJ0X2poaW50KGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKilOVUxMICYmICh2YWx1ZSAmIDMpKQorICAgICplcnJtc2cgPSBfKCJqdW1wIGhpbnQgdW5hbGlnbmVkIik7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgzRkZGKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgaW50CitleHRyYWN0X2poaW50KGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgzRkZGKSBeIDB4MjAwMCkgLSAweDIwMDApOworfQorCisvKiBUaGUgaGludCBmaWVsZCBvZiBhbiBFVjYgSFdfSk1QL0pTUiBpbnNuLiAgKi8KKworc3RhdGljIHVuc2lnbmVkCitpbnNlcnRfZXY2aHdqaGludChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBpbnNuOworICAgICBpbnQgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKKyAgICAqZXJybXNnID0gXygianVtcCBoaW50IHVuYWxpZ25lZCIpOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4MUZGRik7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGludAorZXh0cmFjdF9ldjZod2poaW50KGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgcmV0dXJuIDQgKiAoKChpbnNuICYgMHgxRkZGKSBeIDB4MTAwMCkgLSAweDEwMDApOworfQorCisMCisvKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMgKi8KKworLyogVGhlIG1haW4gb3Bjb2RlICovCisjZGVmaW5lIE9QKHgpCQkoKCh4KSAmIDB4M0YpIDw8IDI2KQorI2RlZmluZSBPUF9NQVNLCQkweEZDMDAwMDAwCisKKy8qIEJyYW5jaCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIEJSQV8ob28pCU9QKG9vKQorI2RlZmluZSBCUkFfTUFTSwlPUF9NQVNLCisjZGVmaW5lIEJSQShvbykJCUJSQV8ob28pLCBCUkFfTUFTSworCisvKiBGbG9hdGluZyBwb2ludCBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIEZQXyhvbyxmZmYpCShPUChvbykgfCAoKChmZmYpICYgMHg3RkYpIDw8IDUpKQorI2RlZmluZSBGUF9NQVNLCQkoT1BfTUFTSyB8IDB4RkZFMCkKKyNkZWZpbmUgRlAob28sZmZmKQlGUF8ob28sZmZmKSwgRlBfTUFTSworCisvKiBNZW1vcnkgZm9ybWF0IGluc3RydWN0aW9ucyAqLworI2RlZmluZSBNRU1fKG9vKQlPUChvbykKKyNkZWZpbmUgTUVNX01BU0sJT1BfTUFTSworI2RlZmluZSBNRU0ob28pCQlNRU1fKG9vKSwgTUVNX01BU0sKKworLyogTWVtb3J5L0Z1bmMgQ29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIE1GQ18ob28sZmZmZikJKE9QKG9vKSB8ICgoZmZmZikgJiAweEZGRkYpKQorI2RlZmluZSBNRkNfTUFTSwkoT1BfTUFTSyB8IDB4RkZGRikKKyNkZWZpbmUgTUZDKG9vLGZmZmYpCU1GQ18ob28sZmZmZiksIE1GQ19NQVNLCisKKy8qIE1lbW9yeS9CcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLworI2RlZmluZSBNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDMpIDw8IDE0KSkKKyNkZWZpbmUgTUJSX01BU0sJKE9QX01BU0sgfCAweEMwMDApCisjZGVmaW5lIE1CUihvbyxoKQlNQlJfKG9vLGgpLCBNQlJfTUFTSworCisvKiBPcGVyYXRlIGZvcm1hdCBpbnN0cnVjdGlvbnMuICBUaGUgT1BSTCB2YXJpYW50IHNwZWNpZmllcyBhCisgICBsaXRlcmFsIHNlY29uZCBhcmd1bWVudC4gKi8KKyNkZWZpbmUgT1BSXyhvbyxmZikJKE9QKG9vKSB8ICgoKGZmKSAmIDB4N0YpIDw8IDUpKQorI2RlZmluZSBPUFJMXyhvbyxmZikJKE9QUl8oKG9vKSwoZmYpKSB8IDB4MTAwMCkKKyNkZWZpbmUgT1BSX01BU0sJKE9QX01BU0sgfCAweDFGRTApCisjZGVmaW5lIE9QUihvbyxmZikJT1BSXyhvbyxmZiksIE9QUl9NQVNLCisjZGVmaW5lIE9QUkwob28sZmYpCU9QUkxfKG9vLGZmKSwgT1BSX01BU0sKKworLyogR2VuZXJpYyBQQUxjb2RlIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgUENEXyhvbykJT1Aob28pCisjZGVmaW5lIFBDRF9NQVNLCU9QX01BU0sKKyNkZWZpbmUgUENEKG9vKQkJUENEXyhvbyksIFBDRF9NQVNLCisKKy8qIFNwZWNpZmljIFBBTGNvZGUgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFNQQ0RfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHgzRkZGRkZGKSkKKyNkZWZpbmUgU1BDRF9NQVNLCTB4RkZGRkZGRkYKKyNkZWZpbmUgU1BDRChvbyxmZmZmKQlTUENEXyhvbyxmZmZmKSwgU1BDRF9NQVNLCisKKy8qIEhhcmR3YXJlIG1lbW9yeSAoaHdfe2xkLHN0fSkgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIEVWNEhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKKyNkZWZpbmUgRVY0SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKKyNkZWZpbmUgRVY0SFdNRU0ob28sZikJRVY0SFdNRU1fKG9vLGYpLCBFVjRIV01FTV9NQVNLCisKKyNkZWZpbmUgRVY1SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4M0YpIDw8IDEwKSkKKyNkZWZpbmUgRVY1SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjgwMCkKKyNkZWZpbmUgRVY1SFdNRU0ob28sZikJRVY1SFdNRU1fKG9vLGYpLCBFVjVIV01FTV9NQVNLCisKKyNkZWZpbmUgRVY2SFdNRU1fKG9vLGYpCShPUChvbykgfCAoKChmKSAmIDB4RikgPDwgMTIpKQorI2RlZmluZSBFVjZIV01FTV9NQVNLCShPUF9NQVNLIHwgMHhGMDAwKQorI2RlZmluZSBFVjZIV01FTShvbyxmKQlFVjZIV01FTV8ob28sZiksIEVWNkhXTUVNX01BU0sKKworI2RlZmluZSBFVjZIV01CUl8ob28saCkJKE9QKG9vKSB8ICgoKGgpICYgNykgPDwgMTMpKQorI2RlZmluZSBFVjZIV01CUl9NQVNLCShPUF9NQVNLIHwgMHhFMDAwKQorI2RlZmluZSBFVjZIV01CUihvbyxoKQlFVjZIV01CUl8ob28saCksIEVWNkhXTUJSX01BU0sKKworLyogQWJicmV2aWF0aW9ucyBmb3IgaW5zdHJ1Y3Rpb24gc3Vic2V0cy4gICovCisjZGVmaW5lIEJBU0UJCQlBWFBfT1BDT0RFX0JBU0UKKyNkZWZpbmUgRVY0CQkJQVhQX09QQ09ERV9FVjQKKyNkZWZpbmUgRVY1CQkJQVhQX09QQ09ERV9FVjUKKyNkZWZpbmUgRVY2CQkJQVhQX09QQ09ERV9FVjYKKyNkZWZpbmUgQldYCQkJQVhQX09QQ09ERV9CV1gKKyNkZWZpbmUgQ0lYCQkJQVhQX09QQ09ERV9DSVgKKyNkZWZpbmUgTUFYCQkJQVhQX09QQ09ERV9NQVgKKworLyogQ29tbW9uIGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHMgKi8KKyNkZWZpbmUgQVJHX05PTkUJCXsgMCB9CisjZGVmaW5lIEFSR19CUkEJCQl7IFJBLCBCRElTUCB9CisjZGVmaW5lIEFSR19GQlJBCQl7IEZBLCBCRElTUCB9CisjZGVmaW5lIEFSR19GUAkJCXsgRkEsIEZCLCBERkMxIH0KKyNkZWZpbmUgQVJHX0ZQWjEJCXsgWkEsIEZCLCBERkMxIH0KKyNkZWZpbmUgQVJHX01FTQkJCXsgUkEsIE1ESVNQLCBQUkIgfQorI2RlZmluZSBBUkdfRk1FTQkJeyBGQSwgTURJU1AsIFBSQiB9CisjZGVmaW5lIEFSR19PUFIJCQl7IFJBLCBSQiwgRFJDMSB9CisjZGVmaW5lIEFSR19PUFJMCQl7IFJBLCBMSVQsIERSQzEgfQorI2RlZmluZSBBUkdfT1BSWjEJCXsgWkEsIFJCLCBEUkMxIH0KKyNkZWZpbmUgQVJHX09QUkxaMQkJeyBaQSwgTElULCBSQyB9CisjZGVmaW5lIEFSR19QQ0QJCQl7IFBBTEZOIH0KKyNkZWZpbmUgQVJHX0VWNEhXTUVNCQl7IFJBLCBFVjRIV0RJU1AsIFBSQiB9CisjZGVmaW5lIEFSR19FVjRIV01QUgkJeyBSQSwgUkJBLCBFVjRIV0lOREVYIH0KKyNkZWZpbmUgQVJHX0VWNUhXTUVNCQl7IFJBLCBFVjVIV0RJU1AsIFBSQiB9CisjZGVmaW5lIEFSR19FVjZIV01FTQkJeyBSQSwgRVY2SFdESVNQLCBQUkIgfQorDAorLyogVGhlIG9wY29kZSB0YWJsZS4KKworICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgorCisgICBOQU1FIE9QQ09ERSBNQVNLIHsgT1BFUkFORFMgfQorCisgICBOQU1FCQlpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisKKyAgIE9QQ09ERQlpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorCisgICBNQVNLCQlpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKKyAgICAgICAgICAgIAl3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgorCisgICBPUEVSQU5EUwlpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KKworICAgVGhlIHByZWNlZGluZyBtYWNyb3MgbWVyZ2UgdGhlIHRleHQgb2YgdGhlIE9QQ09ERSBhbmQgTUFTSyBmaWVsZHMuCisKKyAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0CisgICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQorICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLgorCisgICBPdGhlcndpc2UsIGl0IGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgYW5kIG1pbm9yIGZ1bmN0aW9uIGNvZGUuCisKKyAgIFRoZXJlIGFyZSB0aHJlZSBjbGFzc2VzIG9mIG5vdC1yZWFsbHktaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdGFibGU6CisKKyAgIEFMSUFTCWlzIGFub3RoZXIgbmFtZSBmb3IgYW5vdGhlciBpbnN0cnVjdGlvbi4gIFNvbWUgb2YKKwkJdGhlc2UgY29tZSBmcm9tIHRoZSBBcmNoaXRlY3R1cmUgSGFuZGJvb2ssIHNvbWUKKwkJY29tZSBmcm9tIHRoZSBvcmlnaW5hbCBnYXMgb3Bjb2RlIHRhYmxlcy4gIEluIGFsbAorCQljYXNlcywgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9wY29kZSBpcyB1bmNoYW5nZWQuCisKKyAgIFBTRVVETwlhIHN0eWxpemVkIGNvZGUgZm9ybSBlbmRvcnNlZCBieSBDaGFwdGVyIEEuNCBvZiB0aGUKKwkJQXJjaGl0ZWN0dXJlIEhhbmRib29rLgorCisgICBFWFRSQQlhIHN0eWxpemVkIGNvZGUgZm9ybSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgZ2FzIHRhYmxlcy4KKworICAgQW5kIHR3byBhbm5vdGF0aW9uczoKKworICAgRVY1NiBCVVQJb3Bjb2RlcyB0aGF0IGFyZSBvZmZpY2lhbGx5IGludHJvZHVjZWQgYXMgb2YgdGhlIGV2NTYsCisgICAJCWJ1dCB3aXRoIGRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMuCisKKyAgIEVWNTYgVU5BCW9wY29kZXMgdGhhdCB3ZXJlIGludHJvZHVjZWQgYXMgb2YgdGhlIGV2NTYgd2l0aAorICAgCQlwcmVzdW1hYmx5IHVuZGVmaW5lZCByZXN1bHRzIG9uIHByZXZpb3VzIGltcGxlbWVudGF0aW9ucworCQl0aGF0IHdlcmUgbm90IGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBleHRlbnNpb24uCisqLworCitjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlIGFscGhhX29wY29kZXNbXSA9IHsKKyAgeyAiaGFsdCIsCQlTUENEKDB4MDAsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKKyAgeyAiZHJhaW5hIiwJCVNQQ0QoMHgwMCwweDAwMDIpLCBCQVNFLCBBUkdfTk9ORSB9LAorICB7ICJicHQiLAkJU1BDRCgweDAwLDB4MDA4MCksIEJBU0UsIEFSR19OT05FIH0sCisgIHsgImNhbGxzeXMiLAkJU1BDRCgweDAwLDB4MDA4MyksIEJBU0UsIEFSR19OT05FIH0sCisgIHsgImNobWsiLCAJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAorICB7ICJpbWIiLAkJU1BDRCgweDAwLDB4MDA4NiksIEJBU0UsIEFSR19OT05FIH0sCisgIHsgImNhbGxfcGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAorICB7ICJwYWwiLAkJUENEKDB4MDApLCBCQVNFLCBBUkdfUENEIH0sCQkvKiBhbGlhcyAqLworCisgIHsgImxkYSIsCQlNRU0oMHgwOCksIEJBU0UsIEFSR19NRU0gfSwKKyAgeyAibGRhaCIsCQlNRU0oMHgwOSksIEJBU0UsIEFSR19NRU0gfSwKKyAgeyAibGRidSIsCQlNRU0oMHgwQSksIEJXWCwgQVJHX01FTSB9LAorICB7ICJ1bm9wIiwJCU1FTSgweDBCKSwgQkFTRSwgeyBaQSB9IH0sCQkvKiBwc2V1ZG8gKi8KKyAgeyAibGRxX3UiLAkJTUVNKDB4MEIpLCBCQVNFLCBBUkdfTUVNIH0sCisgIHsgImxkd3UiLAkJTUVNKDB4MEMpLCBCV1gsIEFSR19NRU0gfSwKKyAgeyAic3R3IiwJCU1FTSgweDBEKSwgQldYLCBBUkdfTUVNIH0sCisgIHsgInN0YiIsCQlNRU0oMHgwRSksIEJXWCwgQVJHX01FTSB9LAorICB7ICJzdHFfdSIsCQlNRU0oMHgwRiksIEJBU0UsIEFSR19NRU0gfSwKKworICB7ICJzZXh0bCIsCQlPUFIoMHgxMCwweDAwKSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzZXh0bCIsCQlPUFJMKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCisgIHsgImFkZGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiYWRkbCIsCQlPUFJMKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgInM0YWRkbCIsCQlPUFIoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJzNGFkZGwiLAkJT1BSTCgweDEwLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJuZWdsIiwJCU9QUigweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCisgIHsgIm5lZ2wiLAkJT1BSTCgweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJsIiwJCU9QUigweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInN1YmwiLAkJT1BSTCgweDEwLDB4MDkpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJzNHN1YmwiLAkJT1BSKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiczRzdWJsIiwJCU9QUkwoMHgxMCwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiY21wYmdlIiwJCU9QUigweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImNtcGJnZSIsCQlPUFJMKDB4MTAsMHgwRiksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgInM4YWRkbCIsCQlPUFIoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJzOGFkZGwiLAkJT1BSTCgweDEwLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJzOHN1YmwiLAkJT1BSKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiczhzdWJsIiwJCU9QUkwoMHgxMCwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiY21wdWx0IiwJCU9QUigweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImNtcHVsdCIsCQlPUFJMKDB4MTAsMHgxRCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImFkZHEiLAkJT1BSKDB4MTAsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiYWRkcSIsCQlPUFJMKDB4MTAsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgInM0YWRkcSIsCQlPUFIoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJzNGFkZHEiLAkJT1BSTCgweDEwLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJuZWdxIiwgCQlPUFIoMHgxMCwweDI5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLworICB7ICJuZWdxIiwgCQlPUFJMKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCisgIHsgInN1YnEiLAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAic3VicSIsCQlPUFJMKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgInM0c3VicSIsCQlPUFIoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJzNHN1YnEiLAkJT1BSTCgweDEwLDB4MkIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJjbXBlcSIsCQlPUFIoMHgxMCwweDJEKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJjbXBlcSIsCQlPUFJMKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgInM4YWRkcSIsCQlPUFIoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJzOGFkZHEiLAkJT1BSTCgweDEwLDB4MzIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJzOHN1YnEiLAkJT1BSKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiczhzdWJxIiwJCU9QUkwoMHgxMCwweDNCKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiY21wdWxlIiwJCU9QUigweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImNtcHVsZSIsCQlPUFJMKDB4MTAsMHgzRCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImFkZGwvdiIsCQlPUFIoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJhZGRsL3YiLAkJT1BSTCgweDEwLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJuZWdsL3YiLAkJT1BSKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KKyAgeyAibmVnbC92IiwJCU9QUkwoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KKyAgeyAic3VibC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInN1YmwvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImNtcGx0IiwJCU9QUigweDEwLDB4NEQpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImNtcGx0IiwJCU9QUkwoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiYWRkcS92IiwJCU9QUigweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImFkZHEvdiIsCQlPUFJMKDB4MTAsMHg2MCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgIm5lZ3EvdiIsCQlPUFIoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLworICB7ICJuZWdxL3YiLAkJT1BSTCgweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAic3VicS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiY21wbGUiLAkJT1BSKDB4MTAsMHg2RCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiY21wbGUiLAkJT1BSTCgweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSTCB9LAorCisgIHsgImFuZCIsCQlPUFIoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJhbmQiLAkJT1BSTCgweDExLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJhbmRub3QiLAkJT1BSKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KKyAgeyAiYW5kbm90IiwJCU9QUkwoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KKyAgeyAiYmljIiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImJpYyIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImNtb3ZsYnMiLAkJT1BSKDB4MTEsMHgxNCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiY21vdmxicyIsCQlPUFJMKDB4MTEsMHgxNCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImNtb3ZsYmMiLAkJT1BSKDB4MTEsMHgxNiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiY21vdmxiYyIsCQlPUFJMKDB4MTEsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgIm5vcCIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgWkIsIFpDIH0gfSwgLyogcHNldWRvICovCisgIHsgImNsciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgWkIsIFJDIH0gfSwgLyogcHNldWRvICovCisgIHsgIm1vdiIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgUkIsIFJDIH0gfSwgLyogcHNldWRvICovCisgIHsgIm1vdiIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgeyBSQSwgUkJBLCBSQyB9IH0sIC8qIHBzZXVkbyAqLworICB7ICJtb3YiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCB7IFpBLCBMSVQsIFJDIH0gfSwgLyogcHNldWRvICovCisgIHsgIm9yIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCisgIHsgIm9yIiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KKyAgeyAiYmlzIiwJCU9QUigweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImJpcyIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImNtb3ZlcSIsCQlPUFIoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJjbW92ZXEiLAkJT1BSTCgweDExLDB4MjQpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJjbW92bmUiLAkJT1BSKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiY21vdm5lIiwJCU9QUkwoMHgxMSwweDI2KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAibm90IiwJCU9QUigweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCisgIHsgIm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCisgIHsgIm9ybm90IiwJCU9QUigweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgIm9ybm90IiwJCU9QUkwoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAieG9yIiwJCU9QUigweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInhvciIsCQlPUFJMKDB4MTEsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImNtb3ZsdCIsCQlPUFIoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJjbW92bHQiLAkJT1BSTCgweDExLDB4NDQpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJjbW92Z2UiLAkJT1BSKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiY21vdmdlIiwJCU9QUkwoMHgxMSwweDQ2KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiZXF2IiwJCU9QUigweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImVxdiIsCQlPUFJMKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgInhvcm5vdCIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLworICB7ICJ4b3Jub3QiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAkvKiBhbGlhcyAqLworICB7ICJhbWFzayIsCQlPUFIoMHgxMSwweDYxKSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIGV2NTYgYnV0ICovCisgIHsgImFtYXNrIiwJCU9QUkwoMHgxMSwweDYxKSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBldjU2IGJ1dCAqLworICB7ICJjbW92bGUiLAkJT1BSKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiY21vdmxlIiwJCU9QUkwoMHgxMSwweDY0KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiY21vdmd0IiwJCU9QUigweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImNtb3ZndCIsCQlPUFJMKDB4MTEsMHg2NiksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImltcGx2ZXIiLAkJT1BSTF8oMHgxMSwweDZDKXwoMzE8PDIxKXwoMTw8MTMpLAorICAgIAkJCTB4RkZGRkZGRTAsIEJBU0UsIHsgUkMgfSB9LAkJLyogZXY1NiBidXQgKi8KKworICB7ICJtc2tibCIsCQlPUFIoMHgxMiwweDAyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJtc2tibCIsCQlPUFJMKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImV4dGJsIiwJCU9QUigweDEyLDB4MDYpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImV4dGJsIiwJCU9QUkwoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiaW5zYmwiLAkJT1BSKDB4MTIsMHgwQiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiaW5zYmwiLAkJT1BSTCgweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJtc2t3bCIsCQlPUFIoMHgxMiwweDEyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJtc2t3bCIsCQlPUFJMKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImV4dHdsIiwJCU9QUigweDEyLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImV4dHdsIiwJCU9QUkwoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiaW5zd2wiLAkJT1BSKDB4MTIsMHgxQiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiaW5zd2wiLAkJT1BSTCgweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJtc2tsbCIsCQlPUFIoMHgxMiwweDIyKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJtc2tsbCIsCQlPUFJMKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImV4dGxsIiwJCU9QUigweDEyLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImV4dGxsIiwJCU9QUkwoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiaW5zbGwiLAkJT1BSKDB4MTIsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiaW5zbGwiLAkJT1BSTCgweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJ6YXAiLAkJT1BSKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiemFwIiwJCU9QUkwoMHgxMiwweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiemFwbm90IiwJCU9QUigweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInphcG5vdCIsCQlPUFJMKDB4MTIsMHgzMSksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgIm1za3FsIiwJCU9QUigweDEyLDB4MzIpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgIm1za3FsIiwJCU9QUkwoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAic3JsIiwJCU9QUigweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInNybCIsCQlPUFJMKDB4MTIsMHgzNCksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImV4dHFsIiwJCU9QUigweDEyLDB4MzYpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImV4dHFsIiwJCU9QUkwoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAic2xsIiwJCU9QUigweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInNsbCIsCQlPUFJMKDB4MTIsMHgzOSksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgImluc3FsIiwJCU9QUigweDEyLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgImluc3FsIiwJCU9QUkwoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAic3JhIiwJCU9QUigweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgInNyYSIsCQlPUFJMKDB4MTIsMHgzQyksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgIm1za3doIiwJCU9QUigweDEyLDB4NTIpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgIm1za3doIiwJCU9QUkwoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiaW5zd2giLAkJT1BSKDB4MTIsMHg1NyksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiaW5zd2giLAkJT1BSTCgweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJleHR3aCIsCQlPUFIoMHgxMiwweDVBKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJleHR3aCIsCQlPUFJMKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgIm1za2xoIiwJCU9QUigweDEyLDB4NjIpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgIm1za2xoIiwJCU9QUkwoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiaW5zbGgiLAkJT1BSKDB4MTIsMHg2NyksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiaW5zbGgiLAkJT1BSTCgweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJleHRsaCIsCQlPUFIoMHgxMiwweDZBKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJleHRsaCIsCQlPUFJMKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFJMIH0sCisgIHsgIm1za3FoIiwJCU9QUigweDEyLDB4NzIpLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgIm1za3FoIiwJCU9QUkwoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAiaW5zcWgiLAkJT1BSKDB4MTIsMHg3NyksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAiaW5zcWgiLAkJT1BSTCgweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJleHRxaCIsCQlPUFIoMHgxMiwweDdBKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJleHRxaCIsCQlPUFJMKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFJMIH0sCisKKyAgeyAibXVsbCIsCQlPUFIoMHgxMywweDAwKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJtdWxsIiwJCU9QUkwoMHgxMywweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAibXVscSIsCQlPUFIoMHgxMywweDIwKSwgQkFTRSwgQVJHX09QUiB9LAorICB7ICJtdWxxIiwJCU9QUkwoMHgxMywweDIwKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAidW11bGgiLAkJT1BSKDB4MTMsMHgzMCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAidW11bGgiLAkJT1BSTCgweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSTCB9LAorICB7ICJtdWxsL3YiLAkJT1BSKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKKyAgeyAibXVsbC92IiwJCU9QUkwoMHgxMywweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKKyAgeyAibXVscS92IiwJCU9QUigweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSIH0sCisgIHsgIm11bHEvdiIsCQlPUFJMKDB4MTMsMHg2MCksIEJBU0UsIEFSR19PUFJMIH0sCisKKyAgeyAiaXRvZnMiLAkJRlAoMHgxNCwweDAwNCksIENJWCwgeyBSQSwgWkIsIEZDIH0gfSwKKyAgeyAic3FydGYvYyIsCQlGUCgweDE0LDB4MDBBKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0cy9jIiwJCUZQKDB4MTQsMHgwMEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgIml0b2ZmIiwJCUZQKDB4MTQsMHgwMTQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCisgIHsgIml0b2Z0IiwJCUZQKDB4MTQsMHgwMjQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCisgIHsgInNxcnRnL2MiLAkJRlAoMHgxNCwweDAyQSksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHQvYyIsCQlGUCgweDE0LDB4MDJCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0cy9tIiwJCUZQKDB4MTQsMHgwNEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L20iLAkJRlAoMHgxNCwweDA2QiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydGYiLAkJRlAoMHgxNCwweDA4QSksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHMiLAkJRlAoMHgxNCwweDA4QiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydGciLAkJRlAoMHgxNCwweDBBQSksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHQiLAkJRlAoMHgxNCwweDBBQiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHMvZCIsCQlGUCgweDE0LDB4MENCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0dC9kIiwJCUZQKDB4MTQsMHgwRUIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRmL3VjIiwJCUZQKDB4MTQsMHgxMEEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3VjIiwJCUZQKDB4MTQsMHgxMEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRnL3VjIiwJCUZQKDB4MTQsMHgxMkEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3VjIiwJCUZQKDB4MTQsMHgxMkIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3VtIiwJCUZQKDB4MTQsMHgxNEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3VtIiwJCUZQKDB4MTQsMHgxNkIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRmL3UiLAkJRlAoMHgxNCwweDE4QSksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHMvdSIsCQlGUCgweDE0LDB4MThCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0Zy91IiwJCUZQKDB4MTQsMHgxQUEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3UiLAkJRlAoMHgxNCwweDFBQiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHMvdWQiLAkJRlAoMHgxNCwweDFDQiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHQvdWQiLAkJRlAoMHgxNCwweDFFQiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydGYvc2MiLAkJRlAoMHgxNCwweDQwQSksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydGcvc2MiLAkJRlAoMHgxNCwweDQyQSksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydGYvcyIsCQlGUCgweDE0LDB4NDhBKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0Zy9zIiwJCUZQKDB4MTQsMHg0QUEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRmL3N1YyIsCUZQKDB4MTQsMHg1MEEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3N1YyIsCUZQKDB4MTQsMHg1MEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRnL3N1YyIsCUZQKDB4MTQsMHg1MkEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3N1YyIsCUZQKDB4MTQsMHg1MkIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3N1bSIsCUZQKDB4MTQsMHg1NEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3N1bSIsCUZQKDB4MTQsMHg1NkIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRmL3N1IiwJCUZQKDB4MTQsMHg1OEEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3N1IiwJCUZQKDB4MTQsMHg1OEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRnL3N1IiwJCUZQKDB4MTQsMHg1QUEpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3N1IiwJCUZQKDB4MTQsMHg1QUIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3N1ZCIsCUZQKDB4MTQsMHg1Q0IpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3N1ZCIsCUZQKDB4MTQsMHg1RUIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnRzL3N1aWMiLAlGUCgweDE0LDB4NzBCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0dC9zdWljIiwJRlAoMHgxNCwweDcyQiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHMvc3VpbSIsCUZQKDB4MTQsMHg3NEIpLCBDSVgsIEFSR19GUFoxIH0sCisgIHsgInNxcnR0L3N1aW0iLAlGUCgweDE0LDB4NzZCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0cy9zdWkiLAlGUCgweDE0LDB4NzhCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0dC9zdWkiLAlGUCgweDE0LDB4N0FCKSwgQ0lYLCBBUkdfRlBaMSB9LAorICB7ICJzcXJ0cy9zdWlkIiwJRlAoMHgxNCwweDdDQiksIENJWCwgQVJHX0ZQWjEgfSwKKyAgeyAic3FydHQvc3VpZCIsCUZQKDB4MTQsMHg3RUIpLCBDSVgsIEFSR19GUFoxIH0sCisKKyAgeyAiYWRkZi9jIiwJCUZQKDB4MTUsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3ViZi9jIiwJCUZQKDB4MTUsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsZi9jIiwJCUZQKDB4MTUsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2Zi9jIiwJCUZQKDB4MTUsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0ZGcvYyIsCQlGUCgweDE1LDB4MDFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkZy9jIiwJCUZQKDB4MTUsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3ViZy9jIiwJCUZQKDB4MTUsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsZy9jIiwJCUZQKDB4MTUsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2Zy9jIiwJCUZQKDB4MTUsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0Z2YvYyIsCQlGUCgweDE1LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0Z2QvYyIsCQlGUCgweDE1LDB4MDJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0Z3EvYyIsCQlGUCgweDE1LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0cWYvYyIsCQlGUCgweDE1LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0cWcvYyIsCQlGUCgweDE1LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkZiIsCQlGUCgweDE1LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm5lZ2YiLAkJRlAoMHgxNSwweDA4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsZiIsCQlGUCgweDE1LDB4MDgyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmYiLAkJRlAoMHgxNSwweDA4MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnRkZyIsCQlGUCgweDE1LDB4MDlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkZyIsCQlGUCgweDE1LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm5lZ2ciLAkJRlAoMHgxNSwweDBBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsZyIsCQlGUCgweDE1LDB4MEEyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmciLAkJRlAoMHgxNSwweDBBMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXBnZXEiLAkJRlAoMHgxNSwweDBBNSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXBnbHQiLAkJRlAoMHgxNSwweDBBNiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXBnbGUiLAkJRlAoMHgxNSwweDBBNyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnRnZiIsCQlGUCgweDE1LDB4MEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0Z2QiLAkJRlAoMHgxNSwweDBBRCksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdxIiwJCUZQKDB4MTUsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxZiIsCQlGUCgweDE1LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0cWciLAkJRlAoMHgxNSwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGYvdWMiLAkJRlAoMHgxNSwweDEwMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJmL3VjIiwJCUZQKDB4MTUsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsZi91YyIsCQlGUCgweDE1LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmYvdWMiLAkJRlAoMHgxNSwweDEwMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnRkZy91YyIsCQlGUCgweDE1LDB4MTFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkZy91YyIsCQlGUCgweDE1LDB4MTIwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YmcvdWMiLAkJRlAoMHgxNSwweDEyMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxnL3VjIiwJCUZQKDB4MTUsMHgxMjIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2Zy91YyIsCQlGUCgweDE1LDB4MTIzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGdmL3VjIiwJCUZQKDB4MTUsMHgxMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRnZC91YyIsCQlGUCgweDE1LDB4MTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0Z3EvdmMiLAkJRlAoMHgxNSwweDEyRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGYvdSIsCQlGUCgweDE1LDB4MTgwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YmYvdSIsCQlGUCgweDE1LDB4MTgxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bGYvdSIsCQlGUCgweDE1LDB4MTgyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmYvdSIsCQlGUCgweDE1LDB4MTgzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGRnL3UiLAkJRlAoMHgxNSwweDE5RSksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGcvdSIsCQlGUCgweDE1LDB4MUEwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YmcvdSIsCQlGUCgweDE1LDB4MUExKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bGcvdSIsCQlGUCgweDE1LDB4MUEyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmcvdSIsCQlGUCgweDE1LDB4MUEzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGdmL3UiLAkJRlAoMHgxNSwweDFBQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdkL3UiLAkJRlAoMHgxNSwweDFBRCksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdxL3YiLAkJRlAoMHgxNSwweDFBRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGYvc2MiLAkJRlAoMHgxNSwweDQwMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJmL3NjIiwJCUZQKDB4MTUsMHg0MDEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsZi9zYyIsCQlGUCgweDE1LDB4NDAyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmYvc2MiLAkJRlAoMHgxNSwweDQwMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnRkZy9zYyIsCQlGUCgweDE1LDB4NDFFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkZy9zYyIsCQlGUCgweDE1LDB4NDIwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1Ymcvc2MiLAkJRlAoMHgxNSwweDQyMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxnL3NjIiwJCUZQKDB4MTUsMHg0MjIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2Zy9zYyIsCQlGUCgweDE1LDB4NDIzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGdmL3NjIiwJCUZQKDB4MTUsMHg0MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRnZC9zYyIsCQlGUCgweDE1LDB4NDJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0Z3Evc2MiLAkJRlAoMHgxNSwweDQyRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGYvcyIsCQlGUCgweDE1LDB4NDgwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm5lZ2YvcyIsCQlGUCgweDE1LDB4NDgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCisgIHsgInN1YmYvcyIsCQlGUCgweDE1LDB4NDgxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bGYvcyIsCQlGUCgweDE1LDB4NDgyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmYvcyIsCQlGUCgweDE1LDB4NDgzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGRnL3MiLAkJRlAoMHgxNSwweDQ5RSksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGcvcyIsCQlGUCgweDE1LDB4NEEwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm5lZ2cvcyIsCQlGUCgweDE1LDB4NEExKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCisgIHsgInN1YmcvcyIsCQlGUCgweDE1LDB4NEExKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bGcvcyIsCQlGUCgweDE1LDB4NEEyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmcvcyIsCQlGUCgweDE1LDB4NEEzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImNtcGdlcS9zIiwJCUZQKDB4MTUsMHg0QTUpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY21wZ2x0L3MiLAkJRlAoMHgxNSwweDRBNiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXBnbGUvcyIsCQlGUCgweDE1LDB4NEE3KSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGdmL3MiLAkJRlAoMHgxNSwweDRBQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdkL3MiLAkJRlAoMHgxNSwweDRBRCksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdxL3MiLAkJRlAoMHgxNSwweDRBRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGYvc3VjIiwJCUZQKDB4MTUsMHg1MDApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3ViZi9zdWMiLAkJRlAoMHgxNSwweDUwMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxmL3N1YyIsCQlGUCgweDE1LDB4NTAyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmYvc3VjIiwJCUZQKDB4MTUsMHg1MDMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0ZGcvc3VjIiwJRlAoMHgxNSwweDUxRSksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZGcvc3VjIiwJCUZQKDB4MTUsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3ViZy9zdWMiLAkJRlAoMHgxNSwweDUyMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxnL3N1YyIsCQlGUCgweDE1LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdmcvc3VjIiwJCUZQKDB4MTUsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0Z2Yvc3VjIiwJRlAoMHgxNSwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdkL3N1YyIsCUZQKDB4MTUsMHg1MkQpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRncS9zdmMiLAlGUCgweDE1LDB4NTJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkZi9zdSIsCQlGUCgweDE1LDB4NTgwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YmYvc3UiLAkJRlAoMHgxNSwweDU4MSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxmL3N1IiwJCUZQKDB4MTUsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2Zi9zdSIsCQlGUCgweDE1LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dGRnL3N1IiwJCUZQKDB4MTUsMHg1OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJhZGRnL3N1IiwJCUZQKDB4MTUsMHg1QTApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3ViZy9zdSIsCQlGUCgweDE1LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bGcvc3UiLAkJRlAoMHgxNSwweDVBMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZnL3N1IiwJCUZQKDB4MTUsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0Z2Yvc3UiLAkJRlAoMHgxNSwweDVBQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dGdkL3N1IiwJCUZQKDB4MTUsMHg1QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRncS9zdiIsCQlGUCgweDE1LDB4NUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKworICB7ICJhZGRzL2MiLAkJRlAoMHgxNiwweDAwMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL2MiLAkJRlAoMHgxNiwweDAwMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxzL2MiLAkJRlAoMHgxNiwweDAwMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZzL2MiLAkJRlAoMHgxNiwweDAwMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L2MiLAkJRlAoMHgxNiwweDAyMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJ0L2MiLAkJRlAoMHgxNiwweDAyMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWx0L2MiLAkJRlAoMHgxNiwweDAyMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L2MiLAkJRlAoMHgxNiwweDAyMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy9jIiwJCUZQKDB4MTYsMHgwMkMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnR0cS9jIiwJCUZQKDB4MTYsMHgwMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxcy9jIiwJCUZQKDB4MTYsMHgwM0MpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxdC9jIiwJCUZQKDB4MTYsMHgwM0UpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJhZGRzL20iLAkJRlAoMHgxNiwweDA0MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL20iLAkJRlAoMHgxNiwweDA0MSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxzL20iLAkJRlAoMHgxNiwweDA0MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZzL20iLAkJRlAoMHgxNiwweDA0MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L20iLAkJRlAoMHgxNiwweDA2MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJ0L20iLAkJRlAoMHgxNiwweDA2MSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWx0L20iLAkJRlAoMHgxNiwweDA2MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L20iLAkJRlAoMHgxNiwweDA2MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy9tIiwJCUZQKDB4MTYsMHgwNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnR0cS9tIiwJCUZQKDB4MTYsMHgwNkYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxcy9tIiwJCUZQKDB4MTYsMHgwN0MpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxdC9tIiwJCUZQKDB4MTYsMHgwN0UpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJhZGRzIiwJCUZQKDB4MTYsMHgwODApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibmVncyIsIAkJRlAoMHgxNiwweDA4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJzIiwJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVscyIsCQlGUCgweDE2LDB4MDgyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnMiLAkJRlAoMHgxNiwweDA4MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0IiwJCUZQKDB4MTYsMHgwQTApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibmVndCIsIAkJRlAoMHgxNiwweDBBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJ0IiwJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdCIsCQlGUCgweDE2LDB4MEEyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnQiLAkJRlAoMHgxNiwweDBBMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXB0dW4iLAkJRlAoMHgxNiwweDBBNCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXB0ZXEiLAkJRlAoMHgxNiwweDBBNSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXB0bHQiLAkJRlAoMHgxNiwweDBBNiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXB0bGUiLAkJRlAoMHgxNiwweDBBNyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cyIsCQlGUCgweDE2LDB4MEFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEiLAkJRlAoMHgxNiwweDBBRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dHFzIiwJCUZQKDB4MTYsMHgwQkMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxdCIsCQlGUCgweDE2LDB4MEJFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy9kIiwJCUZQKDB4MTYsMHgwQzApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3Vicy9kIiwJCUZQKDB4MTYsMHgwQzEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVscy9kIiwJCUZQKDB4MTYsMHgwQzIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2cy9kIiwJCUZQKDB4MTYsMHgwQzMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiYWRkdC9kIiwJCUZQKDB4MTYsMHgwRTApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3VidC9kIiwJCUZQKDB4MTYsMHgwRTEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC9kIiwJCUZQKDB4MTYsMHgwRTIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2dC9kIiwJCUZQKDB4MTYsMHgwRTMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0dHMvZCIsCQlGUCgweDE2LDB4MEVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvZCIsCQlGUCgweDE2LDB4MEVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0cXMvZCIsCQlGUCgweDE2LDB4MEZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0cXQvZCIsCQlGUCgweDE2LDB4MEZFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy91YyIsCQlGUCgweDE2LDB4MTAwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YnMvdWMiLAkJRlAoMHgxNiwweDEwMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxzL3VjIiwJCUZQKDB4MTYsMHgxMDIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2cy91YyIsCQlGUCgweDE2LDB4MTAzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImFkZHQvdWMiLAkJRlAoMHgxNiwweDEyMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJ0L3VjIiwJCUZQKDB4MTYsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC91YyIsCQlGUCgweDE2LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnQvdWMiLAkJRlAoMHgxNiwweDEyMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy91YyIsCQlGUCgweDE2LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvdmMiLAkJRlAoMHgxNiwweDEyRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZHMvdW0iLAkJRlAoMHgxNiwweDE0MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL3VtIiwJCUZQKDB4MTYsMHgxNDEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVscy91bSIsCQlGUCgweDE2LDB4MTQyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnMvdW0iLAkJRlAoMHgxNiwweDE0MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L3VtIiwJCUZQKDB4MTYsMHgxNjApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3VidC91bSIsCQlGUCgweDE2LDB4MTYxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHQvdW0iLAkJRlAoMHgxNiwweDE2MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L3VtIiwJCUZQKDB4MTYsMHgxNjMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY3Z0dHMvdW0iLAkJRlAoMHgxNiwweDE2QyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dHRxL3ZtIiwJCUZQKDB4MTYsMHgxNkYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJhZGRzL3UiLAkJRlAoMHgxNiwweDE4MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL3UiLAkJRlAoMHgxNiwweDE4MSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxzL3UiLAkJRlAoMHgxNiwweDE4MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZzL3UiLAkJRlAoMHgxNiwweDE4MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L3UiLAkJRlAoMHgxNiwweDFBMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJ0L3UiLAkJRlAoMHgxNiwweDFBMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWx0L3UiLAkJRlAoMHgxNiwweDFBMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L3UiLAkJRlAoMHgxNiwweDFBMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy91IiwJCUZQKDB4MTYsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnR0cS92IiwJCUZQKDB4MTYsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJhZGRzL3VkIiwJCUZQKDB4MTYsMHgxQzApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3Vicy91ZCIsCQlGUCgweDE2LDB4MUMxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHMvdWQiLAkJRlAoMHgxNiwweDFDMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZzL3VkIiwJCUZQKDB4MTYsMHgxQzMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiYWRkdC91ZCIsCQlGUCgweDE2LDB4MUUwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YnQvdWQiLAkJRlAoMHgxNiwweDFFMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWx0L3VkIiwJCUZQKDB4MTYsMHgxRTIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2dC91ZCIsCQlGUCgweDE2LDB4MUUzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHRzL3VkIiwJCUZQKDB4MTYsMHgxRUMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnR0cS92ZCIsCQlGUCgweDE2LDB4MUVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0c3QiLAkJRlAoMHgxNiwweDJBQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZHMvc3VjIiwJCUZQKDB4MTYsMHg1MDApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3Vicy9zdWMiLAkJRlAoMHgxNiwweDUwMSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxzL3N1YyIsCQlGUCgweDE2LDB4NTAyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnMvc3VjIiwJCUZQKDB4MTYsMHg1MDMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiYWRkdC9zdWMiLAkJRlAoMHgxNiwweDUyMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJ0L3N1YyIsCQlGUCgweDE2LDB4NTIxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHQvc3VjIiwJCUZQKDB4MTYsMHg1MjIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2dC9zdWMiLAkJRlAoMHgxNiwweDUyMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy9zdWMiLAlGUCgweDE2LDB4NTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvc3ZjIiwJRlAoMHgxNiwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZHMvc3VtIiwJCUZQKDB4MTYsMHg1NDApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAic3Vicy9zdW0iLAkJRlAoMHgxNiwweDU0MSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJtdWxzL3N1bSIsCQlGUCgweDE2LDB4NTQyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnMvc3VtIiwJCUZQKDB4MTYsMHg1NDMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiYWRkdC9zdW0iLAkJRlAoMHgxNiwweDU2MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJ0L3N1bSIsCQlGUCgweDE2LDB4NTYxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHQvc3VtIiwJCUZQKDB4MTYsMHg1NjIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2dC9zdW0iLAkJRlAoMHgxNiwweDU2MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy9zdW0iLAlGUCgweDE2LDB4NTZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvc3ZtIiwJRlAoMHgxNiwweDU2RiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImFkZHMvc3UiLAkJRlAoMHgxNiwweDU4MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJuZWdzL3N1IiwJCUZQKDB4MTYsMHg1ODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KKyAgeyAic3Vicy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHMvc3UiLAkJRlAoMHgxNiwweDU4MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZzL3N1IiwJCUZQKDB4MTYsMHg1ODMpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiYWRkdC9zdSIsCQlGUCgweDE2LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm5lZ3Qvc3UiLAkJRlAoMHgxNiwweDVBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJ0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC9zdSIsCQlGUCgweDE2LDB4NUEyKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImRpdnQvc3UiLAkJRlAoMHgxNiwweDVBMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXB0dW4vc3UiLAlGUCgweDE2LDB4NUE0KSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImNtcHRlcS9zdSIsCUZQKDB4MTYsMHg1QTUpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiY21wdGx0L3N1IiwJRlAoMHgxNiwweDVBNiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjbXB0bGUvc3UiLAlGUCgweDE2LDB4NUE3KSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHRzL3N1IiwJCUZQKDB4MTYsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnR0cS9zdiIsCQlGUCgweDE2LDB4NUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy9zdWQiLAkJRlAoMHgxNiwweDVDMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL3N1ZCIsCQlGUCgweDE2LDB4NUMxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHMvc3VkIiwJCUZQKDB4MTYsMHg1QzIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2cy9zdWQiLAkJRlAoMHgxNiwweDVDMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L3N1ZCIsCQlGUCgweDE2LDB4NUUwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YnQvc3VkIiwJCUZQKDB4MTYsMHg1RTEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC9zdWQiLAkJRlAoMHgxNiwweDVFMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L3N1ZCIsCQlGUCgweDE2LDB4NUUzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHRzL3N1ZCIsCUZQKDB4MTYsMHg1RUMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnR0cS9zdmQiLAlGUCgweDE2LDB4NUVGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0c3QvcyIsCQlGUCgweDE2LDB4NkFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy9zdWljIiwJRlAoMHgxNiwweDcwMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL3N1aWMiLAlGUCgweDE2LDB4NzAxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHMvc3VpYyIsCUZQKDB4MTYsMHg3MDIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2cy9zdWljIiwJRlAoMHgxNiwweDcwMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L3N1aWMiLAlGUCgweDE2LDB4NzIwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YnQvc3VpYyIsCUZQKDB4MTYsMHg3MjEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC9zdWljIiwJRlAoMHgxNiwweDcyMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L3N1aWMiLAlGUCgweDE2LDB4NzIzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHRzL3N1aWMiLAlGUCgweDE2LDB4NzJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvc3ZpYyIsCUZQKDB4MTYsMHg3MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxcy9zdWljIiwJRlAoMHgxNiwweDczQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dHF0L3N1aWMiLAlGUCgweDE2LDB4NzNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy9zdWltIiwJRlAoMHgxNiwweDc0MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL3N1aW0iLAlGUCgweDE2LDB4NzQxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHMvc3VpbSIsCUZQKDB4MTYsMHg3NDIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2cy9zdWltIiwJRlAoMHgxNiwweDc0MyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L3N1aW0iLAlGUCgweDE2LDB4NzYwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YnQvc3VpbSIsCUZQKDB4MTYsMHg3NjEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC9zdWltIiwJRlAoMHgxNiwweDc2MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L3N1aW0iLAlGUCgweDE2LDB4NzYzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHRzL3N1aW0iLAlGUCgweDE2LDB4NzZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvc3ZpbSIsCUZQKDB4MTYsMHg3NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxcy9zdWltIiwJRlAoMHgxNiwweDc3QyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dHF0L3N1aW0iLAlGUCgweDE2LDB4NzdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy9zdWkiLAkJRlAoMHgxNiwweDc4MCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJuZWdzL3N1aSIsIAlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCisgIHsgInN1YnMvc3VpIiwJCUZQKDB4MTYsMHg3ODEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVscy9zdWkiLAkJRlAoMHgxNiwweDc4MiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZzL3N1aSIsCQlGUCgweDE2LDB4NzgzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImFkZHQvc3VpIiwJCUZQKDB4MTYsMHg3QTApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibmVndC9zdWkiLCAJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLworICB7ICJzdWJ0L3N1aSIsCQlGUCgweDE2LDB4N0ExKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHQvc3VpIiwJCUZQKDB4MTYsMHg3QTIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2dC9zdWkiLAkJRlAoMHgxNiwweDdBMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJjdnR0cy9zdWkiLAlGUCgweDE2LDB4N0FDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvc3ZpIiwJRlAoMHgxNiwweDdBRiksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dHFzL3N1aSIsCUZQKDB4MTYsMHg3QkMpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxdC9zdWkiLAlGUCgweDE2LDB4N0JFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiYWRkcy9zdWlkIiwJRlAoMHgxNiwweDdDMCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJzdWJzL3N1aWQiLAlGUCgweDE2LDB4N0MxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgIm11bHMvc3VpZCIsCUZQKDB4MTYsMHg3QzIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZGl2cy9zdWlkIiwJRlAoMHgxNiwweDdDMyksIEJBU0UsIEFSR19GUCB9LAorICB7ICJhZGR0L3N1aWQiLAlGUCgweDE2LDB4N0UwKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgInN1YnQvc3VpZCIsCUZQKDB4MTYsMHg3RTEpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXVsdC9zdWlkIiwJRlAoMHgxNiwweDdFMiksIEJBU0UsIEFSR19GUCB9LAorICB7ICJkaXZ0L3N1aWQiLAlGUCgweDE2LDB4N0UzKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHRzL3N1aWQiLAlGUCgweDE2LDB4N0VDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiY3Z0dHEvc3ZpZCIsCUZQKDB4MTYsMHg3RUYpLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxcy9zdWlkIiwJRlAoMHgxNiwweDdGQyksIEJBU0UsIEFSR19GUFoxIH0sCisgIHsgImN2dHF0L3N1aWQiLAlGUCgweDE2LDB4N0ZFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKworICB7ICJjdnRscSIsCQlGUCgweDE3LDB4MDEwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKyAgeyAiZm5vcCIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBaQSwgWkIsIFpDIH0gfSwJLyogcHNldWRvICovCisgIHsgImZjbHIiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBGQyB9IH0sCS8qIHBzZXVkbyAqLworICB7ICJmYWJzIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KKyAgeyAiZm1vdiIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgeyBGQSwgUkJBLCBGQyB9IH0sIC8qIHBzZXVkbyAqLworICB7ICJjcHlzIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZm5lZyIsCQlGUCgweDE3LDB4MDIxKSwgQkFTRSwgeyBGQSwgUkJBLCBGQyB9IH0sIC8qIHBzZXVkbyAqLworICB7ICJjcHlzbiIsCQlGUCgweDE3LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImNweXNlIiwJCUZQKDB4MTcsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAibXRfZnBjciIsCQlGUCgweDE3LDB4MDI0KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAorICB7ICJtZl9mcGNyIiwJCUZQKDB4MTcsMHgwMjUpLCBCQVNFLCB7IEZBLCBSQkEsIFJDQSB9IH0sCisgIHsgImZjbW92ZXEiLAkJRlAoMHgxNywweDAyQSksIEJBU0UsIEFSR19GUCB9LAorICB7ICJmY21vdm5lIiwJCUZQKDB4MTcsMHgwMkIpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZmNtb3ZsdCIsCQlGUCgweDE3LDB4MDJDKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImZjbW92Z2UiLAkJRlAoMHgxNywweDAyRCksIEJBU0UsIEFSR19GUCB9LAorICB7ICJmY21vdmxlIiwJCUZQKDB4MTcsMHgwMkUpLCBCQVNFLCBBUkdfRlAgfSwKKyAgeyAiZmNtb3ZndCIsCQlGUCgweDE3LDB4MDJGKSwgQkFTRSwgQVJHX0ZQIH0sCisgIHsgImN2dHFsIiwJCUZQKDB4MTcsMHgwMzApLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxbC92IiwJCUZQKDB4MTcsMHgxMzApLCBCQVNFLCBBUkdfRlBaMSB9LAorICB7ICJjdnRxbC9zdiIsCQlGUCgweDE3LDB4NTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKKworICB7ICJ0cmFwYiIsCQlNRkMoMHgxOCwweDAwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAorICB7ICJkcmFpbnQiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwJLyogYWxpYXMgKi8KKyAgeyAiZXhjYiIsCQlNRkMoMHgxOCwweDA0MDApLCBCQVNFLCBBUkdfTk9ORSB9LAorICB7ICJtYiIsCQlNRkMoMHgxOCwweDQwMDApLCBCQVNFLCBBUkdfTk9ORSB9LAorICB7ICJ3bWIiLAkJTUZDKDB4MTgsMHg0NDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKKyAgeyAiZmV0Y2giLAkJTUZDKDB4MTgsMHg4MDAwKSwgQkFTRSwgeyBQUkIgfSB9LAorICB7ICJmZXRjaF9tIiwJCU1GQygweDE4LDB4QTAwMCksIEJBU0UsIHsgUFJCIH0gfSwKKyAgeyAicnBjYyIsCQlNRkMoMHgxOCwweEMwMDApLCBCQVNFLCB7IFJBIH0gfSwKKyAgeyAicmMiLAkJTUZDKDB4MTgsMHhFMDAwKSwgQkFTRSwgeyBSQSB9IH0sCisgIHsgImVjYiIsCQlNRkMoMHgxOCwweEU4MDApLCBCQVNFLCB7IFBSQiB9IH0sCS8qIGV2NTYgdW5hICovCisgIHsgInJzIiwJCU1GQygweDE4LDB4RjAwMCksIEJBU0UsIHsgUkEgfSB9LAorICB7ICJ3aDY0IiwJCU1GQygweDE4LDB4RjgwMCksIEJBU0UsIHsgUFJCIH0gfSwJLyogZXY1NiB1bmEgKi8KKworICB7ICJod19tZnByIiwJCU9QUigweDE5LDB4MDApLCBFVjQsIHsgUkEsIFJCQSwgRVY0RVhUSFdJTkRFWCB9IH0sCisgIHsgImh3X21mcHIiLAkJT1AoMHgxOSksIE9QX01BU0ssIEVWNSwgeyBSQSwgUkJBLCBFVjVIV0lOREVYIH0gfSwKKyAgeyAiaHdfbWZwciIsCQlPUCgweDE5KSwgT1BfTUFTSywgRVY2LCB7IFJBLCBaQiwgRVY2SFdJTkRFWCB9IH0sCisgIHsgImh3X21mcHIvaSIsCU9QUigweDE5LDB4MDEpLCBFVjQsIEFSR19FVjRIV01QUiB9LAorICB7ICJod19tZnByL2EiLAlPUFIoMHgxOSwweDAyKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKKyAgeyAiaHdfbWZwci9haSIsCU9QUigweDE5LDB4MDMpLCBFVjQsIEFSR19FVjRIV01QUiB9LAorICB7ICJod19tZnByL3AiLAlPUFIoMHgxOSwweDA0KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKKyAgeyAiaHdfbWZwci9waSIsCU9QUigweDE5LDB4MDUpLCBFVjQsIEFSR19FVjRIV01QUiB9LAorICB7ICJod19tZnByL3BhIiwJT1BSKDB4MTksMHgwNiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCisgIHsgImh3X21mcHIvcGFpIiwJT1BSKDB4MTksMHgwNyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCisgIHsgInBhbDE5IiwJCVBDRCgweDE5KSwgQkFTRSwgQVJHX1BDRCB9LAorCisgIHsgImptcCIsCQlNQlIoMHgxQSwwKSwgQkFTRSwgeyBSQSwgQ1BSQiwgSk1QSElOVCB9IH0sCisgIHsgImpzciIsCQlNQlIoMHgxQSwxKSwgQkFTRSwgeyBSQSwgQ1BSQiwgSk1QSElOVCB9IH0sCisgIHsgInJldCIsCQlNQlIoMHgxQSwyKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sCisgIHsgImpjciIsCQlNQlIoMHgxQSwzKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sIC8qIGFsaWFzICovCisgIHsgImpzcl9jb3JvdXRpbmUiLAlNQlIoMHgxQSwzKSwgQkFTRSwgeyBSQSwgQ1BSQiwgUkVUSElOVCB9IH0sCisKKyAgeyAiaHdfbGRsIiwJCUVWNEhXTUVNKDB4MUIsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRsIiwJCUVWNUhXTUVNKDB4MUIsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbCIsCQlFVjZIV01FTSgweDFCLDB4OCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkbC9hIiwJCUVWNEhXTUVNKDB4MUIsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRsL2EiLAkJRVY1SFdNRU0oMHgxQiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL2EiLAkJRVY2SFdNRU0oMHgxQiwweEMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAorICB7ICJod19sZGwvYWwiLAlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvYXIiLAlFVjRIV01FTSgweDFCLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvYXciLAlFVjVIV01FTSgweDFCLDB4MTgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL2wiLAkJRVY1SFdNRU0oMHgxQiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3AiLAkJRVY0SFdNRU0oMHgxQiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZGwvcCIsCQlFVjVIV01FTSgweDFCLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvcCIsCQlFVjZIV01FTSgweDFCLDB4MCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkbC9wYSIsCUVWNEhXTUVNKDB4MUIsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3BhIiwJRVY1SFdNRU0oMHgxQiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9wYXIiLAlFVjRIV01FTSgweDFCLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkbC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9wYXciLAlFVjVIV01FTSgweDFCLDB4MzgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3BsIiwJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3ByIiwJRVY0SFdNRU0oMHgxQiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZGwvcHYiLAlFVjVIV01FTSgweDFCLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3B3IiwJRVY1SFdNRU0oMHgxQiwweDI4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbC9yIiwJCUVWNEhXTUVNKDB4MUIsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3YiLAkJRVY1SFdNRU0oMHgxQiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3YiLAkJRVY2SFdNRU0oMHgxQiwweDQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAorICB7ICJod19sZGwvdmwiLAlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvdyIsCQlFVjVIV01FTSgweDFCLDB4MDgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGwvdyIsCQlFVjZIV01FTSgweDFCLDB4QSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkbC93YSIsCUVWNkhXTUVNKDB4MUIsMHhFKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3dsIiwJRVY1SFdNRU0oMHgxQiwweDA5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbF9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbF9sL2EiLAlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGxfbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbF9sL2F3IiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvcCIsCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbF9sL3AiLAlFVjZIV01FTSgweDFCLDB4MiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkbF9sL3BhIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbF9sL3B2IiwJRVY1SFdNRU0oMHgxQiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvcHciLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGxfbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZGxfbC92IiwJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRsX2wvdyIsCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkbF9sL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxIiwJCUVWNEhXTUVNKDB4MUIsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRxIiwJCUVWNUhXTUVNKDB4MUIsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcSIsCQlFVjZIV01FTSgweDFCLDB4OSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkcS9hIiwJCUVWNEhXTUVNKDB4MUIsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRxL2EiLAkJRVY1SFdNRU0oMHgxQiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL2EiLAkJRVY2SFdNRU0oMHgxQiwweEQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAorICB7ICJod19sZHEvYWwiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvYXIiLAlFVjRIV01FTSgweDFCLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkcS9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9hdmwiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvYXciLAlFVjVIV01FTSgweDFCLDB4MWMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL2wiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3AiLAkJRVY0SFdNRU0oMHgxQiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZHEvcCIsCQlFVjVIV01FTSgweDFCLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvcCIsCQlFVjZIV01FTSgweDFCLDB4MSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkcS9wYSIsCUVWNEhXTUVNKDB4MUIsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3BhIiwJRVY1SFdNRU0oMHgxQiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9wYXIiLAlFVjRIV01FTSgweDFCLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkcS9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9wYXciLAlFVjVIV01FTSgweDFCLDB4M2MpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9wYXd2IiwJRVY1SFdNRU0oMHgxQiwweDNlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3BsIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3ByIiwJRVY0SFdNRU0oMHgxQiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZHEvcHYiLAlFVjVIV01FTSgweDFCLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvcHZsIiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3B3IiwJRVY1SFdNRU0oMHgxQiwweDJjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcS9yIiwJCUVWNEhXTUVNKDB4MUIsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3YiLAkJRVY1SFdNRU0oMHgxQiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3YiLAkJRVY2SFdNRU0oMHgxQiwweDUpLCBFVjYsIEFSR19FVjZIV01FTSB9LAorICB7ICJod19sZHEvdmwiLAlFVjVIV01FTSgweDFCLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvdyIsCQlFVjVIV01FTSgweDFCLDB4MGMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHEvdyIsCQlFVjZIV01FTSgweDFCLDB4QiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkcS93YSIsCUVWNkhXTUVNKDB4MUIsMHhGKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3dsIiwJRVY1SFdNRU0oMHgxQiwweDBkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxL3d2bCIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcV9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcV9sL2EiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHFfbC9hdiIsCUVWNUhXTUVNKDB4MUIsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcV9sL2F3IiwJRVY1SFdNRU0oMHgxQiwweDFkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvYXd2IiwJRVY1SFdNRU0oMHgxQiwweDFmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvcCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcV9sL3AiLAlFVjZIV01FTSgweDFCLDB4MyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X2xkcV9sL3BhIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDNkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcV9sL3B2IiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvcHciLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHFfbC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZHFfbC92IiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGRxX2wvdyIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkcV9sL3d2IiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQiLAkJRVY0SFdNRU0oMHgxQiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZCIsCQlFVjVIV01FTSgweDFCLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9hIiwJCUVWNEhXTUVNKDB4MUIsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGQvYSIsCQlFVjVIV01FTSgweDFCLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9hbCIsCQlFVjVIV01FTSgweDFCLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9hcSIsCQlFVjRIV01FTSgweDFCLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkL2FxIiwJCUVWNUhXTUVNKDB4MUIsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL2FxbCIsCUVWNUhXTUVNKDB4MUIsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL2FxdiIsCUVWNUhXTUVNKDB4MUIsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL2FxdmwiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9hciIsCQlFVjRIV01FTSgweDFCLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkL2FycSIsCUVWNEhXTUVNKDB4MUIsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGQvYXYiLAkJRVY1SFdNRU0oMHgxQiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvYXciLAkJRVY1SFdNRU0oMHgxQiwweDE4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvYXdsIiwJRVY1SFdNRU0oMHgxQiwweDE5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvYXdxIiwJRVY1SFdNRU0oMHgxQiwweDFjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvYXdxbCIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL2F3cXYiLAlFVjVIV01FTSgweDFCLDB4MWUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9hd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL2F3dmwiLAlFVjVIV01FTSgweDFCLDB4MWIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3AiLAkJRVY0SFdNRU0oMHgxQiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZC9wIiwJCUVWNUhXTUVNKDB4MUIsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3BhIiwJCUVWNEhXTUVNKDB4MUIsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGEiLAkJRVY1SFdNRU0oMHgxQiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGFsIiwJRVY1SFdNRU0oMHgxQiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGFxIiwJRVY0SFdNRU0oMHgxQiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZC9wYXEiLAlFVjVIV01FTSgweDFCLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wYXFsIiwJRVY1SFdNRU0oMHgxQiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGFxdiIsCUVWNUhXTUVNKDB4MUIsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3BhcXZsIiwJRVY1SFdNRU0oMHgxQiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZC9wYXJxIiwJRVY0SFdNRU0oMHgxQiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZC9wYXYiLAlFVjVIV01FTSgweDFCLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wYXZsIiwJRVY1SFdNRU0oMHgxQiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGF3bCIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3Bhd3EiLAlFVjVIV01FTSgweDFCLDB4M2MpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wYXdxbCIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3Bhd3F2IiwJRVY1SFdNRU0oMHgxQiwweDNlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGF3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDNmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3Bhd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDNiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcGwiLAkJRVY1SFdNRU0oMHgxQiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcHEiLAkJRVY0SFdNRU0oMHgxQiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZC9wcSIsCQlFVjVIV01FTSgweDFCLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wcWwiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wcXYiLAlFVjVIV01FTSgweDFCLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wcXZsIiwJRVY1SFdNRU0oMHgxQiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcHIiLAkJRVY0SFdNRU0oMHgxQiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19sZC9wcnEiLAlFVjRIV01FTSgweDFCLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkL3B2IiwJCUVWNUhXTUVNKDB4MUIsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3B3IiwJCUVWNUhXTUVNKDB4MUIsMHgyOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3B3bCIsCUVWNUhXTUVNKDB4MUIsMHgyOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3B3cSIsCUVWNUhXTUVNKDB4MUIsMHgyYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3B3cWwiLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wd3F2IiwJRVY1SFdNRU0oMHgxQiwweDJlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcHdxdmwiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wd3YiLAlFVjVIV01FTSgweDFCLDB4MmEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC9wd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcSIsCQlFVjRIV01FTSgweDFCLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkL3EiLAkJRVY1SFdNRU0oMHgxQiwweDA0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcWwiLAkJRVY1SFdNRU0oMHgxQiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcXYiLAkJRVY1SFdNRU0oMHgxQiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvcXZsIiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfbGQvciIsCQlFVjRIV01FTSgweDFCLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X2xkL3JxIiwJCUVWNEhXTUVNKDB4MUIsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfbGQvdiIsCQlFVjVIV01FTSgweDFCLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC92bCIsCQlFVjVIV01FTSgweDFCLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC93IiwJCUVWNUhXTUVNKDB4MUIsMHgwOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3dsIiwJCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3dxIiwJCUVWNUhXTUVNKDB4MUIsMHgwYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3dxbCIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3dxdiIsCUVWNUhXTUVNKDB4MUIsMHgwZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X2xkL3dxdmwiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC93diIsCQlFVjVIV01FTSgweDFCLDB4MGEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19sZC93dmwiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJwYWwxYiIsCQlQQ0QoMHgxQiksIEJBU0UsIEFSR19QQ0QgfSwKKworICB7ICJzZXh0YiIsCQlPUFIoMHgxQywgMHgwMCksIEJXWCwgQVJHX09QUloxIH0sCisgIHsgInNleHR3IiwJCU9QUigweDFDLCAweDAxKSwgQldYLCBBUkdfT1BSWjEgfSwKKyAgeyAiY3Rwb3AiLAkJT1BSKDB4MUMsIDB4MzApLCBDSVgsIEFSR19PUFJaMSB9LAorICB7ICJwZXJyIiwJCU9QUigweDFDLCAweDMxKSwgTUFYLCBBUkdfT1BSIH0sCisgIHsgImN0bHoiLAkJT1BSKDB4MUMsIDB4MzIpLCBDSVgsIEFSR19PUFJaMSB9LAorICB7ICJjdHR6IiwJCU9QUigweDFDLCAweDMzKSwgQ0lYLCBBUkdfT1BSWjEgfSwKKyAgeyAidW5wa2J3IiwJCU9QUigweDFDLCAweDM0KSwgTUFYLCBBUkdfT1BSWjEgfSwKKyAgeyAidW5wa2JsIiwJCU9QUigweDFDLCAweDM1KSwgTUFYLCBBUkdfT1BSWjEgfSwKKyAgeyAicGt3YiIsCQlPUFIoMHgxQywgMHgzNiksIE1BWCwgQVJHX09QUloxIH0sCisgIHsgInBrbGIiLAkJT1BSKDB4MUMsIDB4MzcpLCBNQVgsIEFSR19PUFJaMSB9LAorICB7ICJtaW5zYjgiLCAJCU9QUigweDFDLCAweDM4KSwgTUFYLCBBUkdfT1BSIH0sCisgIHsgIm1pbnNiOCIsIAkJT1BSTCgweDFDLCAweDM4KSwgTUFYLCBBUkdfT1BSTCB9LAorICB7ICJtaW5zdzQiLCAJCU9QUigweDFDLCAweDM5KSwgTUFYLCBBUkdfT1BSIH0sCisgIHsgIm1pbnN3NCIsIAkJT1BSTCgweDFDLCAweDM5KSwgTUFYLCBBUkdfT1BSTCB9LAorICB7ICJtaW51YjgiLCAJCU9QUigweDFDLCAweDNBKSwgTUFYLCBBUkdfT1BSIH0sCisgIHsgIm1pbnViOCIsIAkJT1BSTCgweDFDLCAweDNBKSwgTUFYLCBBUkdfT1BSTCB9LAorICB7ICJtaW51dzQiLCAJCU9QUigweDFDLCAweDNCKSwgTUFYLCBBUkdfT1BSIH0sCisgIHsgIm1pbnV3NCIsIAkJT1BSTCgweDFDLCAweDNCKSwgTUFYLCBBUkdfT1BSTCB9LAorICB7ICJtYXh1YjgiLAkJT1BSKDB4MUMsIDB4M0MpLCBNQVgsIEFSR19PUFIgfSwKKyAgeyAibWF4dWI4IiwJCU9QUkwoMHgxQywgMHgzQyksIE1BWCwgQVJHX09QUkwgfSwKKyAgeyAibWF4dXc0IiwJCU9QUigweDFDLCAweDNEKSwgTUFYLCBBUkdfT1BSIH0sCisgIHsgIm1heHV3NCIsCQlPUFJMKDB4MUMsIDB4M0QpLCBNQVgsIEFSR19PUFJMIH0sCisgIHsgIm1heHNiOCIsCQlPUFIoMHgxQywgMHgzRSksIE1BWCwgQVJHX09QUiB9LAorICB7ICJtYXhzYjgiLAkJT1BSTCgweDFDLCAweDNFKSwgTUFYLCBBUkdfT1BSTCB9LAorICB7ICJtYXhzdzQiLAkJT1BSKDB4MUMsIDB4M0YpLCBNQVgsIEFSR19PUFIgfSwKKyAgeyAibWF4c3c0IiwJCU9QUkwoMHgxQywgMHgzRiksIE1BWCwgQVJHX09QUkwgfSwKKyAgeyAiZnRvaXQiLAkJRlAoMHgxQywgMHg3MCksIENJWCwgeyBGQSwgWkIsIFJDIH0gfSwKKyAgeyAiZnRvaXMiLAkJRlAoMHgxQywgMHg3OCksIENJWCwgeyBGQSwgWkIsIFJDIH0gfSwKKworICB7ICJod19tdHByIiwJCU9QUigweDFELDB4MDApLCBFVjQsIHsgUkEsIFJCQSwgRVY0RVhUSFdJTkRFWCB9IH0sCisgIHsgImh3X210cHIiLAkJT1AoMHgxRCksIE9QX01BU0ssIEVWNSwgeyBSQSwgUkJBLCBFVjVIV0lOREVYIH0gfSwKKyAgeyAiaHdfbXRwciIsCQlPUCgweDFEKSwgT1BfTUFTSywgRVY2LCB7IFpBLCBSQiwgRVY2SFdJTkRFWCB9IH0sCisgIHsgImh3X210cHIvaSIsIAlPUFIoMHgxRCwweDAxKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKKyAgeyAiaHdfbXRwci9hIiwgCU9QUigweDFELDB4MDIpLCBFVjQsIEFSR19FVjRIV01QUiB9LAorICB7ICJod19tdHByL2FpIiwJT1BSKDB4MUQsMHgwMyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCisgIHsgImh3X210cHIvcCIsIAlPUFIoMHgxRCwweDA0KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKKyAgeyAiaHdfbXRwci9waSIsCU9QUigweDFELDB4MDUpLCBFVjQsIEFSR19FVjRIV01QUiB9LAorICB7ICJod19tdHByL3BhIiwJT1BSKDB4MUQsMHgwNiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCisgIHsgImh3X210cHIvcGFpIiwJT1BSKDB4MUQsMHgwNyksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCisgIHsgInBhbDFkIiwJCVBDRCgweDFEKSwgQkFTRSwgQVJHX1BDRCB9LAorCisgIHsgImh3X3JlaSIsCQlTUENEKDB4MUUsMHgzRkY4MDAwKSwgRVY0fEVWNSwgQVJHX05PTkUgfSwKKyAgeyAiaHdfcmVpX3N0YWxsIiwJU1BDRCgweDFFLDB4M0ZGQzAwMCksIEVWNSwgQVJHX05PTkUgfSwKKyAgeyAiaHdfam1wIiwgCQlFVjZIV01CUigweDFFLDB4MCksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAorICB7ICJod19qc3IiLCAJCUVWNkhXTUJSKDB4MUUsMHgyKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCisgIHsgImh3X3JldCIsIAkJRVY2SFdNQlIoMHgxRSwweDQpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCisgIHsgImh3X2pjciIsIAkJRVY2SFdNQlIoMHgxRSwweDYpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCisgIHsgImh3X2Nvcm91dGluZSIsCUVWNkhXTUJSKDB4MUUsMHg2KSwgRVY2LCB7IFpBLCBQUkIgfSB9LCAvKiBhbGlhcyAqLworICB7ICJod19qbXAvc3RhbGwiLAlFVjZIV01CUigweDFFLDB4MSksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAorICB7ICJod19qc3Ivc3RhbGwiLCAJRVY2SFdNQlIoMHgxRSwweDMpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKKyAgeyAiaHdfcmV0L3N0YWxsIiwJRVY2SFdNQlIoMHgxRSwweDUpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCisgIHsgImh3X2pjci9zdGFsbCIsIAlFVjZIV01CUigweDFFLDB4NyksIEVWNiwgeyBaQSwgUFJCIH0gfSwKKyAgeyAiaHdfY29yb3V0aW5lL3N0YWxsIiwgRVY2SFdNQlIoMHgxRSwweDcpLCBFVjYsIHsgWkEsIFBSQiB9IH0sIC8qIGFsaWFzICovCisgIHsgInBhbDFlIiwJCVBDRCgweDFFKSwgQkFTRSwgQVJHX1BDRCB9LAorCisgIHsgImh3X3N0bCIsCQlFVjRIV01FTSgweDFGLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X3N0bCIsCQlFVjVIV01FTSgweDFGLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdGwiLAkJRVY2SFdNRU0oMHgxRiwweDQpLCBFVjYsIEFSR19FVjZIV01FTSB9LCAvKiA/Pz8gOCAqLworICB7ICJod19zdGwvYSIsCQlFVjRIV01FTSgweDFGLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X3N0bC9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bC9hIiwJCUVWNkhXTUVNKDB4MUYsMHhDKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKKyAgeyAiaHdfc3RsL2FjIiwJRVY1SFdNRU0oMHgxRiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsL2FyIiwJRVY0SFdNRU0oMHgxRiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdGwvYXYiLAlFVjVIV01FTSgweDFGLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdGwvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsL2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3AiLAkJRVY0SFdNRU0oMHgxRiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdGwvcCIsCQlFVjVIV01FTSgweDFGLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdGwvcCIsCQlFVjZIV01FTSgweDFGLDB4MCksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X3N0bC9wYSIsCUVWNEhXTUVNKDB4MUYsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3BhIiwJRVY1SFdNRU0oMHgxRiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bC9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdGwvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bC9wYyIsCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bC9wciIsCUVWNEhXTUVNKDB4MUYsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3B2IiwJRVY1SFdNRU0oMHgxRiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bC9yIiwJCUVWNEhXTUVNKDB4MUYsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3YiLAkJRVY1SFdNRU0oMHgxRiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsL3ZjIiwJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsX2MiLAkJRVY1SFdNRU0oMHgxRiwweDAxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsX2MvYSIsCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bF9jL2F2IiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsX2MvcCIsCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0bF9jL3AiLAlFVjZIV01FTSgweDFGLDB4MiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCisgIHsgImh3X3N0bF9jL3BhIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsX2MvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RsX2MvcHYiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdGxfYy92IiwJRVY1SFdNRU0oMHgxRiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxIiwJCUVWNEhXTUVNKDB4MUYsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RxIiwJCUVWNUhXTUVNKDB4MUYsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0cSIsCQlFVjZIV01FTSgweDFGLDB4NSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sIC8qID8/PyA5ICovCisgIHsgImh3X3N0cS9hIiwJCUVWNEhXTUVNKDB4MUYsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RxL2EiLAkJRVY1SFdNRU0oMHgxRiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxL2EiLAkJRVY2SFdNRU0oMHgxRiwweEQpLCBFVjYsIEFSR19FVjZIV01FTSB9LAorICB7ICJod19zdHEvYWMiLAlFVjVIV01FTSgweDFGLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHEvYXIiLAlFVjRIV01FTSgweDFGLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X3N0cS9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0cS9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHEvYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHEvcCIsCQlFVjRIV01FTSgweDFGLDB4OSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X3N0cS9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0cS9wIiwJCUVWNkhXTUVNKDB4MUYsMHgxKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3BhIiwJRVY0SFdNRU0oMHgxRiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdHEvcGEiLAlFVjVIV01FTSgweDFGLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHEvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3BhciIsCUVWNEhXTUVNKDB4MUYsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3BhciIsCUVWNEhXTUVNKDB4MUYsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0cS9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3BjIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3ByIiwJRVY0SFdNRU0oMHgxRiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdHEvcHYiLAlFVjVIV01FTSgweDFGLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHEvcHZjIiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxL3IiLAkJRVY0SFdNRU0oMHgxRiwweDMpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdHEvdiIsCQlFVjVIV01FTSgweDFGLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHEvdmMiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHFfYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHFfYy9hIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxX2MvYXYiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHFfYy9wIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3RxX2MvcCIsCUVWNkhXTUVNKDB4MUYsMHgzKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKKyAgeyAiaHdfc3RxX2MvcGEiLAlFVjVIV01FTSgweDFGLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHFfYy9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdHFfYy9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0cV9jL3YiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdCIsCQlFVjRIV01FTSgweDFGLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X3N0IiwJCUVWNUhXTUVNKDB4MUYsMHgwMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L2EiLAkJRVY0SFdNRU0oMHgxRiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L2FjIiwJCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L2FxIiwJCUVWNEhXTUVNKDB4MUYsMHg1KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3QvYXEiLAkJRVY1SFdNRU0oMHgxRiwweDE0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvYXFjIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvYXF2IiwJRVY1SFdNRU0oMHgxRiwweDE2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvYXF2YyIsCUVWNUhXTUVNKDB4MUYsMHgxNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L2FyIiwJCUVWNEhXTUVNKDB4MUYsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3QvYXJxIiwJRVY0SFdNRU0oMHgxRiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9hdiIsCQlFVjVIV01FTSgweDFGLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9hdmMiLAlFVjVIV01FTSgweDFGLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3AiLAkJRVY0SFdNRU0oMHgxRiwweDgpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9wIiwJCUVWNUhXTUVNKDB4MUYsMHgyMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3BhIiwJCUVWNEhXTUVNKDB4MUYsMHhDKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKKyAgeyAiaHdfc3QvcGEiLAkJRVY1SFdNRU0oMHgxRiwweDMwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcGFjIiwJRVY1SFdNRU0oMHgxRiwweDMxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcGFxIiwJRVY0SFdNRU0oMHgxRiwweEQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9wYXEiLAlFVjVIV01FTSgweDFGLDB4MzQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9wYXFjIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcGFxdiIsCUVWNUhXTUVNKDB4MUYsMHgzNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3BhcXZjIiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcGFyIiwJRVY0SFdNRU0oMHgxRiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9wYXJxIiwJRVY0SFdNRU0oMHgxRiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9wYXZjIiwJRVY1SFdNRU0oMHgxRiwweDMzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcGMiLAkJRVY1SFdNRU0oMHgxRiwweDIxKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcHEiLAkJRVY0SFdNRU0oMHgxRiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9wcSIsCQlFVjVIV01FTSgweDFGLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9wcWMiLAlFVjVIV01FTSgweDFGLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9wcXYiLAlFVjVIV01FTSgweDFGLDB4MjYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAorICB7ICJod19zdC9wcXZjIiwJRVY1SFdNRU0oMHgxRiwweDI3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKKyAgeyAiaHdfc3QvcHIiLAkJRVY0SFdNRU0oMHgxRiwweEEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9wcnEiLAlFVjRIV01FTSgweDFGLDB4QiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCisgIHsgImh3X3N0L3B2IiwJCUVWNUhXTUVNKDB4MUYsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3EiLAkJRVY0SFdNRU0oMHgxRiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC9xIiwJCUVWNUhXTUVNKDB4MUYsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3FjIiwJCUVWNUhXTUVNKDB4MUYsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3F2IiwJCUVWNUhXTUVNKDB4MUYsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3F2YyIsCUVWNUhXTUVNKDB4MUYsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3IiLAkJRVY0SFdNRU0oMHgxRiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAorICB7ICJod19zdC92IiwJCUVWNUhXTUVNKDB4MUYsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgImh3X3N0L3ZjIiwJCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCisgIHsgInBhbDFmIiwJCVBDRCgweDFGKSwgQkFTRSwgQVJHX1BDRCB9LAorCisgIHsgImxkZiIsCQlNRU0oMHgyMCksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgImxkZyIsCQlNRU0oMHgyMSksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgImxkcyIsCQlNRU0oMHgyMiksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgImxkdCIsCQlNRU0oMHgyMyksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgInN0ZiIsCQlNRU0oMHgyNCksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgInN0ZyIsCQlNRU0oMHgyNSksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgInN0cyIsCQlNRU0oMHgyNiksIEJBU0UsIEFSR19GTUVNIH0sCisgIHsgInN0dCIsCQlNRU0oMHgyNyksIEJBU0UsIEFSR19GTUVNIH0sCisKKyAgeyAibGRsIiwJCU1FTSgweDI4KSwgQkFTRSwgQVJHX01FTSB9LAorICB7ICJsZHEiLAkJTUVNKDB4MjkpLCBCQVNFLCBBUkdfTUVNIH0sCisgIHsgImxkbF9sIiwJCU1FTSgweDJBKSwgQkFTRSwgQVJHX01FTSB9LAorICB7ICJsZHFfbCIsCQlNRU0oMHgyQiksIEJBU0UsIEFSR19NRU0gfSwKKyAgeyAic3RsIiwJCU1FTSgweDJDKSwgQkFTRSwgQVJHX01FTSB9LAorICB7ICJzdHEiLAkJTUVNKDB4MkQpLCBCQVNFLCBBUkdfTUVNIH0sCisgIHsgInN0bF9jIiwJCU1FTSgweDJFKSwgQkFTRSwgQVJHX01FTSB9LAorICB7ICJzdHFfYyIsCQlNRU0oMHgyRiksIEJBU0UsIEFSR19NRU0gfSwKKworICB7ICJiciIsCQlCUkEoMHgzMCksIEJBU0UsIHsgWkEsIEJESVNQIH0gfSwJLyogcHNldWRvICovCisgIHsgImJyIiwJCUJSQSgweDMwKSwgQkFTRSwgQVJHX0JSQSB9LAorICB7ICJmYmVxIiwJCUJSQSgweDMxKSwgQkFTRSwgQVJHX0ZCUkEgfSwKKyAgeyAiZmJsdCIsCQlCUkEoMHgzMiksIEJBU0UsIEFSR19GQlJBIH0sCisgIHsgImZibGUiLAkJQlJBKDB4MzMpLCBCQVNFLCBBUkdfRkJSQSB9LAorICB7ICJic3IiLAkJQlJBKDB4MzQpLCBCQVNFLCBBUkdfQlJBIH0sCisgIHsgImZibmUiLAkJQlJBKDB4MzUpLCBCQVNFLCBBUkdfRkJSQSB9LAorICB7ICJmYmdlIiwJCUJSQSgweDM2KSwgQkFTRSwgQVJHX0ZCUkEgfSwKKyAgeyAiZmJndCIsCQlCUkEoMHgzNyksIEJBU0UsIEFSR19GQlJBIH0sCisgIHsgImJsYmMiLAkJQlJBKDB4MzgpLCBCQVNFLCBBUkdfQlJBIH0sCisgIHsgImJlcSIsCQlCUkEoMHgzOSksIEJBU0UsIEFSR19CUkEgfSwKKyAgeyAiYmx0IiwJCUJSQSgweDNBKSwgQkFTRSwgQVJHX0JSQSB9LAorICB7ICJibGUiLAkJQlJBKDB4M0IpLCBCQVNFLCBBUkdfQlJBIH0sCisgIHsgImJsYnMiLAkJQlJBKDB4M0MpLCBCQVNFLCBBUkdfQlJBIH0sCisgIHsgImJuZSIsCQlCUkEoMHgzRCksIEJBU0UsIEFSR19CUkEgfSwKKyAgeyAiYmdlIiwJCUJSQSgweDNFKSwgQkFTRSwgQVJHX0JSQSB9LAorICB7ICJiZ3QiLAkJQlJBKDB4M0YpLCBCQVNFLCBBUkdfQlJBIH0sCit9OworCitjb25zdCBpbnQgYWxwaGFfbnVtX29wY29kZXMgPSBzaXplb2YoYWxwaGFfb3Bjb2Rlcykvc2l6ZW9mKCphbHBoYV9vcGNvZGVzKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvYXJjLWRpcy5jIGIvb3Bjb2Rlcy9hcmMtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyYjA3YgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvYXJjLWRpcy5jCkBAIC0wLDAgKzEsMjY3IEBACisvKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQVJDLgorICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKyAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgImVsZi9hcmMuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworc3RhdGljIGludCBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZSBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICosIGludCwgaW50KSk7CisKKy8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KKyAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKDQgb3IgOCBmb3IgdGhlIEFSQykuICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc24gKHBjLCBpbmZvLCBtYWNoLCBiaWdfcCkKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgaW50IG1hY2g7CisgICAgIGludCBiaWdfcDsKK3sKKyAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKKyAgYmZkX2J5dGUgYnVmZmVyWzRdOworICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07CisgIGZwcmludGZfZnR5cGUgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKKyAgaW50IHN0YXR1czsKKyAgLyogRmlyc3QgZWxlbWVudCBpcyBpbnNuLCBzZWNvbmQgZWxlbWVudCBpcyBsaW1tIChpZiBwcmVzZW50KS4gICovCisgIGFyY19pbnNuIGluc25bMl07CisgIGludCBnb3RfbGltbV9wID0gMDsKKyAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgIHN0YXRpYyBpbnQgY3VycmVudF9tYWNoID0gMDsKKworICBpZiAoIWluaXRpYWxpemVkIHx8IG1hY2ggIT0gY3VycmVudF9tYWNoKQorICAgIHsKKyAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICAgIGN1cnJlbnRfbWFjaCA9IGFyY19nZXRfb3Bjb2RlX21hY2ggKG1hY2gsIGJpZ19wKTsKKyAgICAgIGFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGN1cnJlbnRfbWFjaCk7CisgICAgfQorCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWZmZXIsIDQsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKGJpZ19wKQorICAgIGluc25bMF0gPSBiZmRfZ2V0YjMyIChidWZmZXIpOworICBlbHNlCisgICAgaW5zblswXSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisKKyAgKCpmdW5jKSAoc3RyZWFtLCAiJTA4bHhcdCIsIGluc25bMF0pOworCisgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBsaXN0cyBoYXNoZWQgYnkgdGhlIGluc24gY29kZQorICAgICAodGhvdWdoIHdlIG5lZWRuJ3QgY2FyZSBob3cgdGhleSdyZSBoYXNoZWQpLiAgKi8KKworICBvcGNvZGUgPSBhcmNfb3Bjb2RlX2xvb2t1cF9kaXMgKGluc25bMF0pOworICBmb3IgKCA7IG9wY29kZSAhPSBOVUxMOyBvcGNvZGUgPSBBUkNfT1BDT0RFX05FWFRfRElTIChvcGNvZGUpKQorICAgIHsKKyAgICAgIGNoYXIgKnN5bjsKKyAgICAgIGludCBtb2RzLGludmFsaWQ7CisgICAgICBsb25nIHZhbHVlOworICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpvcHZhbDsKKworICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KKyAgICAgIGlmICgoaW5zblswXSAmIG9wY29kZS0+bWFzaykgIT0gb3Bjb2RlLT52YWx1ZSkKKwljb250aW51ZTsKKworICAgICAgLyogU3VwcG9ydGVkIGJ5IHRoaXMgY3B1PyAgKi8KKyAgICAgIGlmICghIGFyY19vcGNvZGVfc3VwcG9ydGVkIChvcGNvZGUpKQorCWNvbnRpbnVlOworCisgICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KKwkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCisJIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KKworICAgICAgYXJjX29wY29kZV9pbml0X2V4dHJhY3QgKCk7CisgICAgICBpbnZhbGlkID0gMDsKKworICAgICAgLyogPz8/IEdyYW50ZWQsIHRoaXMgaXMgc2xvd2VyIHRoYW4gdGhlIGBwcGMnIHdheS4gIE1heWJlIHdoZW4gdGhpcyBpcworCSBkb25lIGl0J2xsIGJlIGNsZWFyIHdoYXQgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIGlzLiAgKi8KKyAgICAgIC8qIEluc3RydWN0aW9ucyBsaWtlICJhZGQuZiByMCxyMSwxIiBhcmUgdHJpY2t5IGJlY2F1c2UgdGhlICIuZiIgZ2V0cworCSBwcmludGVkIGZpcnN0LCBidXQgd2UgZG9uJ3Qga25vdyBob3cgdG8gcHJpbnQgaXQgdW50aWwgd2UndmUgcHJvY2Vzc2VkCisJIHRoZSByZWdzLiAgU2luY2Ugd2UncmUgc2Nhbm5pbmcgYWxsIHRoZSBhcmdzIGJlZm9yZSBwcmludGluZyB0aGUgaW5zbgorCSBhbnl3YXlzLCBpdCdzIGFjdHVhbGx5IHF1aXRlIGVhc3kuICAqLworCisgICAgICBmb3IgKHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luOyArK3N5bikKKwl7CisJICBpbnQgYzsKKworCSAgaWYgKCpzeW4gIT0gJyUnIHx8ICorK3N5biA9PSAnJScpCisJICAgIGNvbnRpbnVlOworCSAgbW9kcyA9IDA7CisJICBjID0gKnN5bjsKKwkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzKSkKKwkgICAgeworCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7CisJICAgICAgKytzeW47CisJICAgICAgYyA9ICpzeW47CisJICAgIH0KKwkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbY107CisJICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKKwkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKKwkJCQkgKGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKikgTlVMTCwKKwkJCQkgJmludmFsaWQpOworCX0KKyAgICAgIGlmIChpbnZhbGlkKQorCWNvbnRpbnVlOworCisgICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLworCisgICAgICAvKiBJZiB3ZSBoYXZlIGFuIGluc24gd2l0aCBhIGxpbW0sIGZldGNoIGl0IG5vdy4gIFNjYW5uaW5nIHRoZSBpbnNucworCSB0d2ljZSBsZXRzIHVzIGRvIHRoaXMuICAqLworICAgICAgaWYgKGFyY19vcGNvZGVfbGltbV9wIChOVUxMKSkKKwl7CisJICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYyArIDQsIGJ1ZmZlciwgNCwgaW5mbyk7CisJICBpZiAoc3RhdHVzICE9IDApCisJICAgIHsKKwkgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisJICBpZiAoYmlnX3ApCisJICAgIGluc25bMV0gPSBiZmRfZ2V0YjMyIChidWZmZXIpOworCSAgZWxzZQorCSAgICBpbnNuWzFdID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKKwkgIGdvdF9saW1tX3AgPSAxOworCX0KKworICAgICAgZm9yIChzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5bjsgKytzeW4pCisJeworCSAgaW50IGM7CisKKwkgIGlmICgqc3luICE9ICclJyB8fCAqKytzeW4gPT0gJyUnKQorCSAgICB7CisJICAgICAgKCpmdW5jKSAoc3RyZWFtLCAiJWMiLCAqc3luKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICBGZXRjaCBhbnkgc3BlY2lhbCBtb2RpZmllcnMuICAqLworCSAgbW9kcyA9IDA7CisJICBjID0gKnN5bjsKKwkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbY11dLmZsYWdzKSkKKwkgICAgeworCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7CisJICAgICAgKytzeW47CisJICAgICAgYyA9ICpzeW47CisJICAgIH0KKwkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbY107CisKKwkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KKwkgIG9wdmFsID0gTlVMTDsKKwkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQorCSAgICB7CisJICAgICAgdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAorCQkJCQkgICAmb3B2YWwsIChpbnQgKikgTlVMTCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHZhbHVlID0gKGluc25bMF0gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7CisJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkKKwkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkpCisJCXZhbHVlIC09IDEgPDwgb3BlcmFuZC0+Yml0czsKKworCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzdWZmaXggb3BlcmFuZCwgc2V0IGBvcHZhbCcuICAqLworCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKKwkJb3B2YWwgPSBhcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggKG9wZXJhbmQsIHZhbHVlKTsKKwkgICAgfQorCisJICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLworCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfRkFLRSkKKwkgICAgOyAvKiBub3RoaW5nIHRvIGRvICg/Pz8gYXQgbGVhc3Qgbm90IHlldCkgKi8KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQorCSAgICB7CisJICAgICAgLyogRGVmYXVsdCBzdWZmaXhlcyBhcmVuJ3QgcHJpbnRlZC4gIEZvcnR1bmF0ZWx5LCB0aGV5IGFsbCBoYXZlCisJCSB6ZXJvIHZhbHVlcy4gIEFsc28sIHplcm8gdmFsdWVzIGZvciBib29sZWFuIHN1ZmZpeGVzIGFyZQorCQkgcmVwcmVzZW50ZWQgYnkgdGhlIGFic2VuY2Ugb2YgdGV4dC4gICovCisKKwkgICAgICBpZiAodmFsdWUgIT0gMCkKKwkJeworCQkgIC8qID8/PyBPUFZBTCBzaG91bGQgaGF2ZSBhIHZhbHVlLiAgSWYgaXQgZG9lc24ndCBqdXN0IGNvcGUKKwkJICAgICBhcyB3ZSB3YW50IGRpc2Fzc2VtYmx5IHRvIGJlIHJlYXNvbmFibHkgcm9idXN0LgorCQkgICAgIEFsc28gcmVtZW1iZXIgdGhhdCBzZXZlcmFsIGNvbmRpdGlvbiBjb2RlIHZhbHVlcyAoMTYtMzEpCisJCSAgICAgYXJlbid0IGRlZmluZWQgeWV0LiAgRm9yIHRoZXNlIGNhc2VzIGp1c3QgcHJpbnQgdGhlCisJCSAgICAgbnVtYmVyIHN1aXRhYmx5IGRlY29yYXRlZC4gICovCisJCSAgaWYgKG9wdmFsKQorCQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMlcyIsCisJCQkgICAgIG1vZHMgJiBBUkNfTU9EX0RPVCA/ICIuIiA6ICIiLAorCQkJICAgICBvcHZhbC0+bmFtZSk7CisJCSAgZWxzZQorCQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMlYyVkIiwKKwkJCSAgICAgbW9kcyAmIEFSQ19NT0RfRE9UID8gIi4iIDogIiIsCisJCQkgICAgIG9wZXJhbmQtPmZtdCwgdmFsdWUpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIKQorCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHBjICsgNCArIHZhbHVlLCBpbmZvKTsKKwkgIC8qID8/PyBOb3QgYWxsIGNhc2VzIG9mIHRoaXMgYXJlIGN1cnJlbnRseSBjYXVnaHQuICAqLworCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9BQlNPTFVURV9CUkFOQ0gpCisJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIHZhbHVlICYgMHhmZmZmZmZmZiwgaW5mbyk7CisJICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FERFJFU1MpCisJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIHZhbHVlICYgMHhmZmZmZmZmZiwgaW5mbyk7CisJICBlbHNlIGlmIChvcHZhbCkKKwkgICAgLyogTm90ZSB0aGF0IHRoaXMgY2FzZSBjYXRjaGVzIGJvdGggbm9ybWFsIGFuZCBhdXhpbGlhcnkgcmVncy4gICovCisJICAgICgqZnVuYykgKHN0cmVhbSwgIiVzIiwgb3B2YWwtPm5hbWUpOworCSAgZWxzZQorCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlbGQiLCB2YWx1ZSk7CisJfQorCisgICAgICAvKiBXZSBoYXZlIGZvdW5kIGFuZCBwcmludGVkIGFuIGluc3RydWN0aW9uOyByZXR1cm4uICAqLworICAgICAgcmV0dXJuIGdvdF9saW1tX3AgPyA4IDogNDsKKyAgICB9CisKKyAgKCpmdW5jKSAoc3RyZWFtLCBfKCIqdW5rbm93bioiKSk7CisgIHJldHVybiA0OworfQorCisvKiBHaXZlbiBNQUNILCBvbmUgb2YgYmZkX21hY2hfYXJjX3h4eCwgcmV0dXJuIHRoZSBwcmludF9pbnNuIGZ1bmN0aW9uIHRvIHVzZS4KKyAgIFRoaXMgZG9lcyB0aGluZ3MgYSBub24tc3RhbmRhcmQgd2F5ICh0aGUgInN0YW5kYXJkIiB3YXkgd291bGQgYmUgdG8gY29weQorICAgdGhpcyBjb2RlIGludG8gZGlzYXNzZW1ibGUuYykuICBTaW5jZSB0aGVyZSBhcmUgbW9yZSB0aGFuIGEgY291cGxlIG9mCisgICB2YXJpYW50cywgaGlkaW5nIGFsbCB0aGlzIGNydWQgaGVyZSBzZWVtcyBjbGVhbmVyLiAgKi8KKworZGlzYXNzZW1ibGVyX2Z0eXBlCithcmNfZ2V0X2Rpc2Fzc2VtYmxlciAobWFjaCwgYmlnX3ApCisgICAgIGludCBtYWNoOworICAgICBpbnQgYmlnX3A7Cit7CisgIHN3aXRjaCAobWFjaCkKKyAgICB7CisgICAgY2FzZSBiZmRfbWFjaF9hcmNfYmFzZToKKyAgICAgIHJldHVybiBiaWdfcCA/IHByaW50X2luc25fYXJjX2Jhc2VfYmlnIDogcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGU7CisgICAgfQorICByZXR1cm4gcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlIChwYywgaW5mbykKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmV0dXJuIHByaW50X2luc24gKHBjLCBpbmZvLCBiZmRfbWFjaF9hcmNfYmFzZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fYXJjX2Jhc2VfYmlnIChwYywgaW5mbykKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmV0dXJuIHByaW50X2luc24gKHBjLCBpbmZvLCBiZmRfbWFjaF9hcmNfYmFzZSwgMSk7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FyYy1vcGMuYyBiL29wY29kZXMvYXJjLW9wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGY2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2FyYy1vcGMuYwpAQCAtMCwwICsxLDExMzEgQEAKKy8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEFSQy4KKyAgIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisjZGVmaW5lIElOU0VSVF9GTihmbikgXAorc3RhdGljIGFyY19pbnNuIGZuIFBBUkFNUyAoKGFyY19pbnNuLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAorCQkJICAgIGludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICosIGxvbmcsIFwKKwkJCSAgICBjb25zdCBjaGFyICoqKSkKKyNkZWZpbmUgRVhUUkFDVF9GTihmbikgXAorc3RhdGljIGxvbmcgZm4gUEFSQU1TICgoYXJjX2luc24gKiwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIFwKKwkJCWludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqLCBpbnQgKikpCisKK0lOU0VSVF9GTiAoaW5zZXJ0X3JlZyk7CitJTlNFUlRfRk4gKGluc2VydF9zaGltbWZpbmlzaCk7CitJTlNFUlRfRk4gKGluc2VydF9saW1tZmluaXNoKTsKK0lOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tb2Zmc2V0KTsKK0lOU0VSVF9GTiAoaW5zZXJ0X3NoaW1temVybyk7CitJTlNFUlRfRk4gKGluc2VydF9mbGFnKTsKK0lOU0VSVF9GTiAoaW5zZXJ0X2ZsYWdmaW5pc2gpOworSU5TRVJUX0ZOIChpbnNlcnRfY29uZCk7CitJTlNFUlRfRk4gKGluc2VydF9mb3JjZWxpbW0pOworSU5TRVJUX0ZOIChpbnNlcnRfcmVsYWRkcik7CitJTlNFUlRfRk4gKGluc2VydF9hYnNhZGRyKTsKK0lOU0VSVF9GTiAoaW5zZXJ0X3Vub3BtYWNybyk7CisKK0VYVFJBQ1RfRk4gKGV4dHJhY3RfcmVnKTsKK0VYVFJBQ1RfRk4gKGV4dHJhY3RfZmxhZyk7CitFWFRSQUNUX0ZOIChleHRyYWN0X2NvbmQpOworRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWxhZGRyKTsKK0VYVFJBQ1RfRk4gKGV4dHJhY3RfdW5vcG1hY3JvKTsKKworLyogVmFyaW91cyB0eXBlcyBvZiBBUkMgb3BlcmFuZHMsIGluY2x1ZGluZyBpbnNuIHN1ZmZpeGVzLiAgKi8KKworLyogSW5zbiBmb3JtYXQgdmFsdWVzOgorCisgICAnYScJUkVHQQkJcmVnaXN0ZXIgQSBmaWVsZAorICAgJ2InCVJFR0IJCXJlZ2lzdGVyIEIgZmllbGQKKyAgICdjJwlSRUdDCQlyZWdpc3RlciBDIGZpZWxkCisgICAnUycJU0hJTU1GSU5JU0gJZmluaXNoIGluc2VydGluZyBhIHNoaW1tIHZhbHVlCisgICAnTCcJTElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgbGltbSB2YWx1ZQorICAgJ2QnCVNISU1NT0ZGU0VUCXNoaW1tIG9mZnNldCBpbiBsZCxzdCBpbnNucworICAgJzAnCVNISU1NWkVSTwkwIHNoaW1tIHZhbHVlIGluIGxkLHN0IGluc25zCisgICAnZicJRkxBRwkJRiBmbGFnCisgICAnRicJRkxBR0ZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIHRoZSBGIGZsYWcKKyAgICdHJwlGTEFHSU5TTglpbnNlcnQgRiBmbGFnIGluICJmbGFnIiBpbnNuCisgICAnbicJREVMQVkJCU4gZmllbGQgKG51bGxpZnkgZmllbGQpCisgICAncScJQ09ORAkJY29uZGl0aW9uIGNvZGUgZmllbGQKKyAgICdRJwlGT1JDRUxJTU0Jc2V0IGBjb25kX3AnIHRvIDEgdG8gZW5zdXJlIGEgY29uc3RhbnQgaXMgYSBsaW1tCisgICAnQicJQlJBTkNICQlicmFuY2ggYWRkcmVzcyAoMjIgYml0IHBjIHJlbGF0aXZlKQorICAgJ0onCUpVTVAJCWp1bXAgYWRkcmVzcyAoMjYgYml0IGFic29sdXRlKQorICAgJ3onCVNJWkUxCQlzaXplIGZpZWxkIGluIGxkIGEsW2IsY10KKyAgICdaJwlTSVpFMTAJCXNpemUgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KKyAgICd5JwlTSVpFMjIJCXNpemUgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KKyAgICd4JwlTSUdOMAkJc2lnbiBleHRlbmQgZmllbGQgbGQgYSxbYixjXQorICAgJ1gnCVNJR045CQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLHNoaW1tXQorICAgJ3cnCUFERFJFU1MzCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixjXQorICAgJ1cnCUFERFJFU1MxMgl3cml0ZS1iYWNrIGZpZWxkIGluIGxkIGEsW2Isc2hpbW1dCisgICAndicJQUREUkVTUzI0CXdyaXRlLWJhY2sgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KKyAgICdlJwlDQUNIRUJZUEFTUzUJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2IsY10KKyAgICdFJwlDQUNIRUJZUEFTUzE0CWNhY2hlIGJ5cGFzcyBpbiBsZCBhLFtiLHNoaW1tXQorICAgJ0QnCUNBQ0hFQllQQVNTMjYJY2FjaGUgYnlwYXNzIGluIHN0IGMsW2Isc2hpbW1dCisgICAnVScJVU5PUE1BQ1JPCWZha2Ugb3BlcmFuZCB0byBjb3B5IFJFR0IgdG8gUkVHQyBmb3IgdW5vcCBtYWNyb3MKKworICAgVGhlIGZvbGxvd2luZyBtb2RpZmllcnMgbWF5IGFwcGVhciBiZXR3ZWVuIHRoZSAlIGFuZCBjaGFyIChlZzogJS5mKToKKworICAgJy4nCU1PRERPVAkJJy4nIHByZWZpeCBtdXN0IGJlIHByZXNlbnQKKyAgICdyJwlSRUcJCWdlbmVyaWMgcmVnaXN0ZXIgdmFsdWUsIGZvciByZWdpc3RlciB0YWJsZQorICAgJ0EnCUFVWFJFRwkJYXV4aWxpYXJ5IHJlZ2lzdGVyIGluIGxyIGEsW2JdLCBzciBjLFtiXQorCisgICBGaWVsZHMgYXJlOgorCisgICBDSEFSIEJJVFMgU0hJRlQgRkxBR1MgSU5TRVJUX0ZOIEVYVFJBQ1RfRk4KKyovCisKK2NvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCBhcmNfb3BlcmFuZHNbXSA9Cit7CisvKiBwbGFjZSBob2xkZXIgKD8/PyBub3Qgc3VyZSBpZiBuZWVkZWQpICovCisjZGVmaW5lIFVOVVNFRCAwCisgIHsgMCB9LAorCisvKiByZWdpc3RlciBBIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCisjZGVmaW5lIFJFR0EgKFVOVVNFRCArIDEpCisgIHsgJ2EnLCA2LCBBUkNfU0hJRlRfUkVHQSwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAorCisvKiByZWdpc3RlciBCIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCisjZGVmaW5lIFJFR0IgKFJFR0EgKyAxKQorICB7ICdiJywgNiwgQVJDX1NISUZUX1JFR0IsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKKworLyogcmVnaXN0ZXIgQyBvciBzaGltbS9saW1tIGluZGljYXRvciAqLworI2RlZmluZSBSRUdDIChSRUdCICsgMSkKKyAgeyAnYycsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCisKKy8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBzaGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFNISU1NRklOSVNIIChSRUdDICsgMSkKKyAgeyAnUycsIDksIDAsIEFSQ19PUEVSQU5EX1NJR05FRCArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbWZpbmlzaCwgMCB9LAorCisvKiBmYWtlIG9wZXJhbmQgdXNlZCB0byBpbnNlcnQgbGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zLiAgKi8KKyNkZWZpbmUgTElNTUZJTklTSCAoU0hJTU1GSU5JU0ggKyAxKQorICB7ICdMJywgMzIsIDMyLCBBUkNfT1BFUkFORF9BRERSRVNTICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9saW1tZmluaXNoLCAwIH0sCisKKy8qIHNoaW1tIG9wZXJhbmQgd2hlbiB0aGVyZSBpcyBubyByZWcgaW5kaWNhdG9yIChsZCxzdCkgKi8KKyNkZWZpbmUgU0hJTU1PRkZTRVQgKExJTU1GSU5JU0ggKyAxKQorICB7ICdkJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfc2hpbW1vZmZzZXQsIDAgfSwKKworLyogMCBzaGltbSBvcGVyYW5kIGZvciBsZCxzdCBpbnNucyAqLworI2RlZmluZSBTSElNTVpFUk8gKFNISU1NT0ZGU0VUICsgMSkKKyAgeyAnMCcsIDksIDAsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbXplcm8sIDAgfSwKKworLyogZmxhZyB1cGRhdGUgYml0IChpbnNlcnRpb24gaXMgZGVmZXJlZCB1bnRpbCB3ZSBrbm93IGhvdykgKi8KKyNkZWZpbmUgRkxBRyAoU0hJTU1aRVJPICsgMSkKKyAgeyAnZicsIDEsIDgsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2ZsYWcsIGV4dHJhY3RfZmxhZyB9LAorCisvKiBmYWtlIHV0aWxpdHkgb3BlcmFuZCB0byBmaW5pc2ggJ2YnIHN1ZmZpeCBoYW5kbGluZyAqLworI2RlZmluZSBGTEFHRklOSVNIIChGTEFHICsgMSkKKyAgeyAnRicsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnZmluaXNoLCAwIH0sCisKKy8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIHNldCB0aGUgJ2YnIGZsYWcgZm9yIHRoZSAiZmxhZyIgaW5zbiAqLworI2RlZmluZSBGTEFHSU5TTiAoRkxBR0ZJTklTSCArIDEpCisgIHsgJ0cnLCAxLCA4LCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZmxhZywgMCB9LAorCisvKiBicmFuY2ggZGVsYXkgdHlwZXMgKi8KKyNkZWZpbmUgREVMQVkgKEZMQUdJTlNOICsgMSkKKyAgeyAnbicsIDIsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAorCisvKiBjb25kaXRpb25zICovCisjZGVmaW5lIENPTkQgKERFTEFZICsgMSkKKyAgeyAncScsIDUsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2NvbmQsIGV4dHJhY3RfY29uZCB9LAorCisvKiBzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyB0cmVhdGVkIGFzIGEgbGltbSAqLworI2RlZmluZSBGT1JDRUxJTU0gKENPTkQgKyAxKQorICB7ICdRJywgMCwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZvcmNlbGltbSB9LAorCisvKiBicmFuY2ggYWRkcmVzczsgYiwgYmwsIGFuZCBscCBpbnNucyAqLworI2RlZmluZSBCUkFOQ0ggKEZPUkNFTElNTSArIDEpCisgIHsgJ0InLCAyMCwgNywgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIICsgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVsYWRkciwgZXh0cmFjdF9yZWxhZGRyIH0sCisKKy8qIGp1bXAgYWRkcmVzczsgaiBpbnNuICh0aGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyAnTCcgZXhjZXB0IHRoYXQgdGhlCisgICB2YWx1ZSBpcyByaWdodCBzaGlmdGVkIGJ5IDIpICovCisjZGVmaW5lIEpVTVAgKEJSQU5DSCArIDEpCisgIHsgJ0onLCAyNCwgMzIsIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCArIEFSQ19PUEVSQU5EX0xJTU0gKyBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfYWJzYWRkciB9LAorCisvKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEsMiAqLworI2RlZmluZSBTSVpFMSAoSlVNUCArIDEpCisgIHsgJ3onLCAyLCAxLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKKworLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAxMCwxMSAqLworI2RlZmluZSBTSVpFMTAgKFNJWkUxICsgMSkKKyAgeyAnWicsIDIsIDEwLCBBUkNfT1BFUkFORF9TVUZGSVgsIH0sCisKKy8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMjIsMjMgKi8KKyNkZWZpbmUgU0laRTIyIChTSVpFMTAgKyAxKQorICB7ICd5JywgMiwgMjIsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKKworLyogc2lnbiBleHRlbmQgZmllbGQsIHN0b3JlZCBpbiBiaXQgMCAqLworI2RlZmluZSBTSUdOMCAoU0laRTIyICsgMSkKKyAgeyAneCcsIDEsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAorCisvKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCA5ICovCisjZGVmaW5lIFNJR045IChTSUdOMCArIDEpCisgIHsgJ1gnLCAxLCA5LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKKworLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDMgKi8KKyNkZWZpbmUgQUREUkVTUzMgKFNJR045ICsgMSkKKyAgeyAndycsIDEsIDMsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAorCisvKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMTIgKi8KKyNkZWZpbmUgQUREUkVTUzEyIChBRERSRVNTMyArIDEpCisgIHsgJ1cnLCAxLCAxMiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCisKKy8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAyNCAqLworI2RlZmluZSBBRERSRVNTMjQgKEFERFJFU1MxMiArIDEpCisgIHsgJ3YnLCAxLCAyNCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCisKKy8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCA1ICovCisjZGVmaW5lIENBQ0hFQllQQVNTNSAoQUREUkVTUzI0ICsgMSkKKyAgeyAnZScsIDEsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAorCisvKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMTQgKi8KKyNkZWZpbmUgQ0FDSEVCWVBBU1MxNCAoQ0FDSEVCWVBBU1M1ICsgMSkKKyAgeyAnRScsIDEsIDE0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKKworLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDI2ICovCisjZGVmaW5lIENBQ0hFQllQQVNTMjYgKENBQ0hFQllQQVNTMTQgKyAxKQorICB7ICdEJywgMSwgMjYsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAorCisvKiB1bm9wIG1hY3JvLCB1c2VkIHRvIGNvcHkgUkVHQiB0byBSRUdDICovCisjZGVmaW5lIFVOT1BNQUNSTyAoQ0FDSEVCWVBBU1MyNiArIDEpCisgIHsgJ1UnLCA2LCBBUkNfU0hJRlRfUkVHQywgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3Vub3BtYWNybywgZXh0cmFjdF91bm9wbWFjcm8gfSwKKworLyogJy4nIG1vZGlmaWVyICgnLicgcmVxdWlyZWQpLiAgKi8KKyNkZWZpbmUgTU9ERE9UIChVTk9QTUFDUk8gKyAxKQorICB7ICcuJywgMSwgMCwgQVJDX01PRF9ET1QgfSwKKworLyogRHVtbXkgJ3InIG1vZGlmaWVyIGZvciB0aGUgcmVnaXN0ZXIgdGFibGUuCisgICBJdCdzIGNhbGxlZCBhICJkdW1teSIgYmVjYXVzZSB0aGVyZSdzIG5vIHBvaW50IGluIGluc2VydGluZyBhbiAncicgaW50byBhbGwKKyAgIHRoZSAlYS8lYi8lYyBvY2N1cnJlbmNlcyBpbiB0aGUgaW5zbiB0YWJsZS4gICovCisjZGVmaW5lIFJFRyAoTU9ERE9UICsgMSkKKyAgeyAncicsIDYsIDAsIEFSQ19NT0RfUkVHIH0sCisKKy8qIEtub3duIGF1eGlsaWFyeSByZWdpc3RlciBtb2RpZmllciAoc3RvcmVkIGluIHNoaW1tIGZpZWxkKS4gICovCisjZGVmaW5lIEFVWFJFRyAoUkVHICsgMSkKKyAgeyAnQScsIDksIDAsIEFSQ19NT0RfQVVYUkVHIH0sCisKKy8qIGVuZCBvZiBsaXN0IHBsYWNlIGhvbGRlciAqLworICB7IDAgfQorfTsKKwwKKy8qIEdpdmVuIGEgZm9ybWF0IGxldHRlciwgeWllbGRzIHRoZSBpbmRleCBpbnRvIGBhcmNfb3BlcmFuZHMnLgorICAgZWc6IGFyY19vcGVyYW5kX21hcFsnYSddID0gUkVHQS4gICovCit1bnNpZ25lZCBjaGFyIGFyY19vcGVyYW5kX21hcFsyNTZdOworCisjZGVmaW5lIEkoeCkgKCgoeCkgJiAzMSkgPDwgMjcpCisjZGVmaW5lIEEoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdBKQorI2RlZmluZSBCKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQikKKyNkZWZpbmUgQyh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0MpCisjZGVmaW5lIFIoeCxiLG0pICgoKHgpICYgKG0pKSA8PCAoYikpCS8qIHZhbHVlIFgsIG1hc2sgTSwgYXQgYml0IEIgKi8KKworLyogQVJDIGluc3RydWN0aW9ucy4KKworICAgTG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIG11c3QgYXBwZWFyIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGlmIGdhcyBzZWVzCisgICAibHNyIHIyLHIzLDEiIHdoZW4gaXQncyBwYXJzaW5nICJsc3IgJWEsJWIiIGl0IHdpbGwgdGhpbmsgdGhlICIsMSIgaXMKKyAgIGp1bmspLiAgVGhpcyBpc24ndCBuZWNlc3NhcnkgZm9yIGBsZCcgYmVjYXVzZSBvZiB0aGUgdHJhaWxpbmcgJ10nLgorCisgICBJbnN0cnVjdGlvbnMgdGhhdCBhcmUgcmVhbGx5IG1hY3JvcyBiYXNlZCBvbiBvdGhlciBpbnNucyBtdXN0IGFwcGVhcgorICAgYmVmb3JlIHRoZSByZWFsIGluc24gc28gdGhleSdyZSBjaG9zZW4gd2hlbiBkaXNhc3NlbWJsaW5nLiAgRWc6IFRoZSBgbW92JworICAgaW5zbiBpcyByZWFsbHkgdGhlIGBhbmQnIGluc24uCisKKyAgIFRoaXMgdGFibGUgaXMgYmVzdCB2aWV3ZWQgb24gYSB3aWRlIHNjcmVlbiAoMTYxIGNvbHVtbnMpLiAgSSdkIHByZWZlciB0bworICAga2VlcCBpdCB0aGlzIHdheS4gIFRoZSByZXN0IG9mIHRoZSBmaWxlLCBob3dldmVyLCBzaG91bGQgYmUgdmlld2FibGUgb24gYW4KKyAgIDgwIGNvbHVtbiB0ZXJtaW5hbC4gICovCisKKy8qID8/PyBUaGlzIHRhYmxlIGFsc28gaW5jbHVkZXMgbWFjcm9zOiBhc2wsIGxzbCwgYW5kIG1vdi4gIFRoZSBwcGMgcG9ydCBoYXMKKyAgIGEgbW9yZSBnZW5lcmFsIGZhY2lsaXR5IGZvciBkZWFsaW5nIHdpdGggbWFjcm9zIHdoaWNoIGNvdWxkIGJlIHVzZWQgaWYKKyAgIHdlIG5lZWQgdG8uICAqLworCisvKiBUaGlzIHRhYmxlIGNhbid0IGJlIGBjb25zdCcgYmVjYXVzZSBtZW1iZXJzIGBuZXh0X2FzbScgYW5kIGBuZXh0X2RpcycgYXJlCisgICBjb21wdXRlZCBhdCBydW4tdGltZS4gIFdlIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28sIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbQorICAgd29ydGggaXQuICAqLworCitzdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdID0geworCisgIC8qIE1hY3JvcyBhcHBlYXIgZmlyc3QuICAqLworICAvKiAibW92IiBpcyByZWFsbHkgYW4gImFuZCIuICAqLworICB7ICJtb3YlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoMTIpIH0sCisgIC8qICJhc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCisgIHsgImFzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAorICAvKiAibHNsIiBpcyByZWFsbHkgYW4gImFkZCIuICAqLworICB7ICJsc2wlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOCkgfSwKKyAgLyogIm5vcCIgaXMgcmVhbGx5IGFuICJ4b3IiLiAgKi8KKyAgeyAibm9wIiwJCQkJMHhmZmZmZmZmZiwJMHg3ZmZmZmZmZiB9LAorICAvKiAicmxjIiBpcyByZWFsbHkgYW4gImFkYyIuICAqLworICB7ICJybGMlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOSkgfSwKKworICAvKiBUaGUgcmVzdCBvZiB0aGVzZSBuZWVkbid0IGJlIHNvcnRlZCwgYnV0IGl0IGhlbHBzIHRvIGZpbmQgdGhlbSBpZiB0aGV5IGFyZS4gICovCisgIHsgImFkYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoOSkgfSwKKyAgeyAiYWRkJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg4KSB9LAorICB7ICJhbmQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEyKSB9LAorICB7ICJhc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygxKSB9LAorICB7ICJiaWMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE0KSB9LAorICB7ICJiJXElLm4gJUIiLAkJCUkoLTEpLAkJSSg0KSwJCUFSQ19PUENPREVfQ09ORF9CUkFOQ0ggfSwKKyAgeyAiYmwlcSUubiAlQiIsCQkJSSgtMSksCQlJKDUpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAorICB7ICJleHRiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNykgfSwKKyAgeyAiZXh0dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDgpIH0sCisgIHsgImZsYWclLnEgJWIlRyVTJUwiLAkJCUkoLTEpK0EoLTEpK0MoLTEpLAkJSSgzKStBKEFSQ19SRUdfU0hJTU1fVVBEQVRFKStDKDApIH0sCisgIC8qICVROiBmb3JjZSBjb25kX3A9MSAtLT4gbm8gc2hpbW0gdmFsdWVzICovCisgIC8qID8/PyBUaGlzIGluc24gYWxsb3dzIGFuIG9wdGlvbmFsIGZsYWdzIHNwZWMuICAqLworICB7ICJqJXElUSUubiUuZiAlYiVKIiwJCQlJKC0xKStBKC0xKStDKC0xKStSKC0xLDcsMSksCUkoNykrQSgwKStDKDApK1IoMCw3LDEpIH0sCisgIC8qIFB1dCBvcGNvZGUgMSBsZCBpbnNucyBmaXJzdCBzbyBzaGltbSBnZXRzIHByZWZlcmVkIG92ZXIgbGltbS4gICovCisgIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCisgIHsgImxkJVolLlglLlclLkUgJTAlYSxbJWJdJUwiLAlJKC0xKStSKC0xLDEzLDEpK1IoLTEsMCw1MTEpLAlJKDEpK1IoMCwxMywxKStSKDAsMCw1MTEpIH0sCisgIHsgImxkJVolLlglLlclLkUgJWEsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDEzLDEpLAkJSSgxKStSKDAsMTMsMSkgfSwKKyAgeyAibGQleiUueCUudyUuZSVRICVhLFslYiwlY10lTCIsCUkoLTEpK1IoLTEsNCwxKStSKC0xLDYsNyksCUkoMCkrUigwLDQsMSkrUigwLDYsNykgfSwKKyAgeyAibHAlcSUubiAlQiIsCQkJSSgtMSksCQlJKDYpLCB9LAorICB7ICJsciAlYSxbJUFiXSVTJUwiLAkJCUkoLTEpK0MoLTEpLAlJKDEpK0MoMHgxMCkgfSwKKyAgeyAibHNyJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoMikgfSwKKyAgeyAib3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEzKSB9LAorICB7ICJyb3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygzKSB9LAorICB7ICJycmMlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg0KSB9LAorICB7ICJzYmMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDExKSB9LAorICB7ICJzZXhiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNSkgfSwKKyAgeyAic2V4dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDYpIH0sCisgIHsgInNyICVjLFslQWJdJVMlTCIsCQkJSSgtMSkrQSgtMSksCUkoMikrQSgweDEwKSB9LAorICAvKiAiWyViXSIgaXMgYmVmb3JlICJbJWIsJWRdIiBzbyAwIG9mZnNldHMgZG9uJ3QgZ2V0IHByaW50ZWQuICAqLworICB7ICJzdCV5JS52JS5EJVEgJTAlYyxbJWJdJUwiLAkJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpK1IoLTEsMCw1MTEpLAlJKDIpK1IoMCwyNSwxKStSKDAsMjEsMSkrUigwLDAsNTExKSB9LAorICB7ICJzdCV5JS52JS5EICVjLFslYiwlZF0lUyVMIiwJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpLAkJCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKSB9LAorICB7ICJzdWIlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEwKSB9LAorICB7ICJ4b3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE1KSB9Cit9OworY29uc3QgaW50IGFyY19vcGNvZGVzX2NvdW50ID0gc2l6ZW9mIChhcmNfb3Bjb2RlcykgLyBzaXplb2YgKGFyY19vcGNvZGVzWzBdKTsKKworY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIGFyY19yZWdfbmFtZXNbXSA9Cit7CisgIC8qIFNvcnQgdGhpcyBzbyB0aGF0IHRoZSBmaXJzdCA2MSBlbnRyaWVzIGFyZSBzZXF1ZW50aWFsLgorICAgICBJRTogRm9yIGVhY2ggaSAoaTw2MSksIGFyY19yZWdfbmFtZXNbaV0udmFsdWUgPT0gaS4gICovCisKKyAgeyAicjAiLCAwLCBSRUcgfSwgeyAicjEiLCAxLCBSRUcgfSwgeyAicjIiLCAyLCBSRUcgfSwgeyAicjMiLCAzLCBSRUcgfSwKKyAgeyAicjQiLCA0LCBSRUcgfSwgeyAicjUiLCA1LCBSRUcgfSwgeyAicjYiLCA2LCBSRUcgfSwgeyAicjciLCA3LCBSRUcgfSwKKyAgeyAicjgiLCA4LCBSRUcgfSwgeyAicjkiLCA5LCBSRUcgfSwgeyAicjEwIiwgMTAsIFJFRyB9LCB7ICJyMTEiLCAxMSwgUkVHIH0sCisgIHsgInIxMiIsIDEyLCBSRUcgfSwgeyAicjEzIiwgMTMsIFJFRyB9LCB7ICJyMTQiLCAxNCwgUkVHIH0sIHsgInIxNSIsIDE1LCBSRUcgfSwKKyAgeyAicjE2IiwgMTYsIFJFRyB9LCB7ICJyMTciLCAxNywgUkVHIH0sIHsgInIxOCIsIDE4LCBSRUcgfSwgeyAicjE5IiwgMTksIFJFRyB9LAorICB7ICJyMjAiLCAyMCwgUkVHIH0sIHsgInIyMSIsIDIxLCBSRUcgfSwgeyAicjIyIiwgMjIsIFJFRyB9LCB7ICJyMjMiLCAyMywgUkVHIH0sCisgIHsgInIyNCIsIDI0LCBSRUcgfSwgeyAicjI1IiwgMjUsIFJFRyB9LCB7ICJyMjYiLCAyNiwgUkVHIH0sIHsgImZwIiwgMjcsIFJFRyB9LAorICB7ICJzcCIsIDI4LCBSRUcgfSwgeyAiaWxpbmsxIiwgMjksIFJFRyB9LCB7ICJpbGluazIiLCAzMCwgUkVHIH0sIHsgImJsaW5rIiwgMzEsIFJFRyB9LAorICB7ICJyMzIiLCAzMiwgUkVHIH0sIHsgInIzMyIsIDMzLCBSRUcgfSwgeyAicjM0IiwgMzQsIFJFRyB9LCB7ICJyMzUiLCAzNSwgUkVHIH0sCisgIHsgInIzNiIsIDM2LCBSRUcgfSwgeyAicjM3IiwgMzcsIFJFRyB9LCB7ICJyMzgiLCAzOCwgUkVHIH0sIHsgInIzOSIsIDM5LCBSRUcgfSwKKyAgeyAicjQwIiwgNDAsIFJFRyB9LCB7ICJyNDEiLCA0MSwgUkVHIH0sIHsgInI0MiIsIDQyLCBSRUcgfSwgeyAicjQzIiwgNDMsIFJFRyB9LAorICB7ICJyNDQiLCA0NCwgUkVHIH0sIHsgInI0NSIsIDQ1LCBSRUcgfSwgeyAicjQ2IiwgNDYsIFJFRyB9LCB7ICJyNDciLCA0NywgUkVHIH0sCisgIHsgInI0OCIsIDQ4LCBSRUcgfSwgeyAicjQ5IiwgNDksIFJFRyB9LCB7ICJyNTAiLCA1MCwgUkVHIH0sIHsgInI1MSIsIDUxLCBSRUcgfSwKKyAgeyAicjUyIiwgNTIsIFJFRyB9LCB7ICJyNTMiLCA1MywgUkVHIH0sIHsgInI1NCIsIDU0LCBSRUcgfSwgeyAicjU1IiwgNTUsIFJFRyB9LAorICB7ICJyNTYiLCA1NiwgUkVHIH0sIHsgInI1NyIsIDU3LCBSRUcgfSwgeyAicjU4IiwgNTgsIFJFRyB9LCB7ICJyNTkiLCA1OSwgUkVHIH0sCisgIHsgImxwX2NvdW50IiwgNjAsIFJFRyB9LAorCisgIC8qIEknZCBwcmVmZXIgdG8gb3V0cHV0IHRoZXNlIGFzICJmcCIgYW5kICJzcCIgYnkgZGVmYXVsdCwgYnV0IHdlIHN0aWxsIG5lZWQKKyAgICAgdG8gcmVjb2duaXplIHRoZSBjYW5vbmljYWwgdmFsdWVzLiAgKi8KKyAgeyAicjI3IiwgMjcsIFJFRyB9LCB7ICJyMjgiLCAyOCwgUkVHIH0sCisKKyAgLyogU29tZW9uZSBtYXkgd2lzaCB0byByZWZlciB0byB0aGVzZSBpbiB0aGlzIHdheSwgYW5kIGl0J3MgcHJvYmFibHkgYQorICAgICBnb29kIGlkZWEgdG8gcmVzZXJ2ZSB0aGVtIGFzIHN1Y2ggYW55d2F5LiAgKi8KKyAgeyAicjI5IiwgMjksIFJFRyB9LCB7ICJyMzAiLCAzMCwgUkVHIH0sIHsgInIzMSIsIDMxLCBSRUcgfSwgeyAicjYwIiwgNjAsIFJFRyB9LAorCisgIC8qIFN0YW5kYXJkIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLworICB7ICJzdGF0dXMiLAkwLCBBVVhSRUcgfSwKKyAgeyAic2VtYXBob3JlIiwgMSwgQVVYUkVHIH0sCisgIHsgImxwX3N0YXJ0IiwJMiwgQVVYUkVHIH0sCisgIHsgImxwX2VuZCIsCTMsIEFVWFJFRyB9LAorICB7ICJpZGVudGl0eSIsCTQsIEFVWFJFRyB9LAorICB7ICJkZWJ1ZyIsCTUsIEFVWFJFRyB9LAorfTsKK2NvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50ID0gc2l6ZW9mIChhcmNfcmVnX25hbWVzKSAvIHNpemVvZiAoYXJjX3JlZ19uYW1lc1swXSk7CisKKy8qIFRoZSBzdWZmaXggdGFibGUuCisgICBPcGVyYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBiZSBzdG9yZWQgdG9nZXRoZXIuICAqLworCitjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW10gPQoreworICAvKiBFbnRyeSAwIGlzIHNwZWNpYWwsIGRlZmF1bHQgdmFsdWVzIGFyZW4ndCBwcmludGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICAqLworICB7ICIiLCAwLCAtMSB9LAorICB7ICJhbCIsIDAsIENPTkQgfSwKKyAgeyAicmEiLCAwLCBDT05EIH0sCisgIHsgImVxIiwgMSwgQ09ORCB9LAorICB7ICJ6IiwgMSwgQ09ORCB9LAorICB7ICJuZSIsIDIsIENPTkQgfSwKKyAgeyAibnoiLCAyLCBDT05EIH0sCisgIHsgInAiLCAzLCBDT05EIH0sCisgIHsgInBsIiwgMywgQ09ORCB9LAorICB7ICJuIiwgNCwgQ09ORCB9LAorICB7ICJtaSIsIDQsIENPTkQgfSwKKyAgeyAiYyIsIDUsIENPTkQgfSwKKyAgeyAiY3MiLCA1LCBDT05EIH0sCisgIHsgImxvIiwgNSwgQ09ORCB9LAorICB7ICJuYyIsIDYsIENPTkQgfSwKKyAgeyAiY2MiLCA2LCBDT05EIH0sCisgIHsgImhzIiwgNiwgQ09ORCB9LAorICB7ICJ2IiwgNywgQ09ORCB9LAorICB7ICJ2cyIsIDcsIENPTkQgfSwKKyAgeyAibnYiLCA4LCBDT05EIH0sCisgIHsgInZjIiwgOCwgQ09ORCB9LAorICB7ICJndCIsIDksIENPTkQgfSwKKyAgeyAiZ2UiLCAxMCwgQ09ORCB9LAorICB7ICJsdCIsIDExLCBDT05EIH0sCisgIHsgImxlIiwgMTIsIENPTkQgfSwKKyAgeyAiaGkiLCAxMywgQ09ORCB9LAorICB7ICJscyIsIDE0LCBDT05EIH0sCisgIHsgInBueiIsIDE1LCBDT05EIH0sCisgIHsgImYiLCAxLCBGTEFHIH0sCisgIHsgIm5kIiwgQVJDX0RFTEFZX05PTkUsIERFTEFZIH0sCisgIHsgImQiLCBBUkNfREVMQVlfTk9STUFMLCBERUxBWSB9LAorICB7ICJqZCIsIEFSQ19ERUxBWV9KVU1QLCBERUxBWSB9LAorLyp7ICJiIiwgNywgU0laRUVYVCB9LCovCisvKnsgImIiLCA1LCBTSVpFU0VYIH0sKi8KKyAgeyAiYiIsIDEsIFNJWkUxIH0sCisgIHsgImIiLCAxLCBTSVpFMTAgfSwKKyAgeyAiYiIsIDEsIFNJWkUyMiB9LAorLyp7ICJ3IiwgOCwgU0laRUVYVCB9LCovCisvKnsgInciLCA2LCBTSVpFU0VYIH0sKi8KKyAgeyAidyIsIDIsIFNJWkUxIH0sCisgIHsgInciLCAyLCBTSVpFMTAgfSwKKyAgeyAidyIsIDIsIFNJWkUyMiB9LAorICB7ICJ4IiwgMSwgU0lHTjAgfSwKKyAgeyAieCIsIDEsIFNJR045IH0sCisgIHsgImEiLCAxLCBBRERSRVNTMyB9LAorICB7ICJhIiwgMSwgQUREUkVTUzEyIH0sCisgIHsgImEiLCAxLCBBRERSRVNTMjQgfSwKKyAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzUgfSwKKyAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzE0IH0sCisgIHsgImRpIiwgMSwgQ0FDSEVCWVBBU1MyNiB9LAorfTsKK2NvbnN0IGludCBhcmNfc3VmZml4ZXNfY291bnQgPSBzaXplb2YgKGFyY19zdWZmaXhlcykgLyBzaXplb2YgKGFyY19zdWZmaXhlc1swXSk7CisKKy8qIEluZGV4ZWQgYnkgZmlyc3QgbGV0dGVyIG9mIG9wY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZQorICAgZmlyc3QgbGV0dGVyLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlX21hcFsyNiArIDFdOworCisvKiBJbmRleGVkIGJ5IGluc24gY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZSBpbnNuIGNvZGUuICAqLworc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICppY29kZV9tYXBbMzJdOworDAorLyogQ29uZmlndXJhdGlvbiBmbGFncy4gICovCisKKy8qIFZhcmlvdXMgQVJDX0hBVkVfWFhYIGJpdHMuICAqLworc3RhdGljIGludCBjcHVfdHlwZTsKKworLyogVHJhbnNsYXRlIGEgYmZkX21hY2hfYXJjX3h4eCB2YWx1ZSB0byBhIEFSQ19NQUNIX1hYWCB2YWx1ZS4gICovCisKK2ludAorYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2gsIGJpZ19wKQorICAgICBpbnQgYmZkX21hY2gsIGJpZ19wOworeworICBzdGF0aWMgaW50IG1hY2hfdHlwZV9tYXBbXSA9CisgICAgeworICAgICAgQVJDX01BQ0hfQkFTRQorICAgIH07CisKKyAgcmV0dXJuIG1hY2hfdHlwZV9tYXBbYmZkX21hY2hdIHwgKGJpZ19wID8gQVJDX01BQ0hfQklHIDogMCk7Cit9CisKKy8qIEluaXRpYWxpemUgYW55IHRhYmxlcyB0aGF0IG5lZWQgaXQuCisgICBNdXN0IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwIChvciB3aGVuIGZpcnN0IG5lZWRlZCkuCisKKyAgIEZMQUdTIGlzIGEgc2V0IG9mIGJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIHRoZSBjcHUgd2UgaGF2ZSwKKyAgIGFuZCBpbiBwYXJ0aWN1bGFyIGF0IGxlYXN0IChvbmUgb2YpIEFSQ19NQUNIX1hYWC4gICovCisKK3ZvaWQKK2FyY19vcGNvZGVfaW5pdF90YWJsZXMgKGZsYWdzKQorICAgICBpbnQgZmxhZ3M7Cit7CisgIHN0YXRpYyBpbnQgaW5pdF9wID0gMDsKKworICBjcHVfdHlwZSA9IGZsYWdzOworCisgIC8qIFdlIG1heSBiZSBpbnRlbnRpb25hbGx5IGNhbGxlZCBtb3JlIHRoYW4gb25jZSAoZm9yIGV4YW1wbGUgZ2RiIHdpbGwgY2FsbAorICAgICB1cyBlYWNoIHRpbWUgdGhlIHVzZXIgc3dpdGNoZXMgY3B1KS4gIFRoZXNlIHRhYmxlcyBvbmx5IG5lZWQgdG8gYmUgaW5pdCdkCisgICAgIG9uY2UgdGhvdWdoLiAgKi8KKyAgLyogPz8/IFdlIGNhbiByZW1vdmUgdGhlIG5lZWQgZm9yIGFyY19vcGNvZGVfc3VwcG9ydGVkIGJ5IHRha2luZyBpdCBpbnRvCisgICAgIGFjY291bnQgaGVyZSwgYnV0IEknbSBub3Qgc3VyZSBJIHdhbnQgdG8gZG8gdGhhdCB5ZXQgKGlmIGV2ZXIpLiAgKi8KKyAgaWYgKCFpbml0X3ApCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGksbjsKKworICAgICAgbWVtc2V0IChhcmNfb3BlcmFuZF9tYXAsIDAsIHNpemVvZiAoYXJjX29wZXJhbmRfbWFwKSk7CisgICAgICBuID0gc2l6ZW9mIChhcmNfb3BlcmFuZHMpIC8gc2l6ZW9mIChhcmNfb3BlcmFuZHNbMF0pOworICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwlhcmNfb3BlcmFuZF9tYXBbYXJjX29wZXJhbmRzW2ldLmZtdF0gPSBpOworCisgICAgICBtZW1zZXQgKG9wY29kZV9tYXAsIDAsIHNpemVvZiAob3Bjb2RlX21hcCkpOworICAgICAgbWVtc2V0IChpY29kZV9tYXAsIDAsIHNpemVvZiAoaWNvZGVfbWFwKSk7CisgICAgICAvKiBTY2FuIHRoZSB0YWJsZSBiYWNrd2FyZHMgc28gbWFjcm9zIGFwcGVhciBhdCB0aGUgZnJvbnQuICAqLworICAgICAgZm9yIChpID0gYXJjX29wY29kZXNfY291bnQgLSAxOyBpID49IDA7IC0taSkKKwl7CisJICBpbnQgb3Bjb2RlX2hhc2ggPSBBUkNfSEFTSF9PUENPREUgKGFyY19vcGNvZGVzW2ldLnN5bnRheCk7CisJICBpbnQgaWNvZGVfaGFzaCA9IEFSQ19IQVNIX0lDT0RFIChhcmNfb3Bjb2Rlc1tpXS52YWx1ZSk7CisKKwkgIGFyY19vcGNvZGVzW2ldLm5leHRfYXNtID0gb3Bjb2RlX21hcFtvcGNvZGVfaGFzaF07CisJICBvcGNvZGVfbWFwW29wY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKKworCSAgYXJjX29wY29kZXNbaV0ubmV4dF9kaXMgPSBpY29kZV9tYXBbaWNvZGVfaGFzaF07CisJICBpY29kZV9tYXBbaWNvZGVfaGFzaF0gPSAmYXJjX29wY29kZXNbaV07CisJfQorCisgICAgICBpbml0X3AgPSAxOworICAgIH0KK30KKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIE9QQ09ERSBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCisgICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCisKK2ludAorYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKK3sKKyAgaWYgKEFSQ19PUENPREVfQ1BVIChvcGNvZGUtPmZsYWdzKSA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BWQUwgaXMgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpZWQgY3B1LgorICAgQ3B1IHNlbGVjdGlvbiBpcyBtYWRlIHdoZW4gY2FsbGluZyBgYXJjX29wY29kZV9pbml0X3RhYmxlcycuICAqLworCitpbnQKK2FyY19vcHZhbF9zdXBwb3J0ZWQgKG9wdmFsKQorICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOworeworICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSAmIEFSQ19IQVZFX0NQVSAoY3B1X3R5cGUpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgYXNzZW1ibGluZyBJTlNOLiAgKi8KKworY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgorYXJjX29wY29kZV9sb29rdXBfYXNtIChpbnNuKQorICAgICBjb25zdCBjaGFyICppbnNuOworeworICByZXR1cm4gb3Bjb2RlX21hcFtBUkNfSEFTSF9PUENPREUgKGluc24pXTsKK30KKworLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgZGlzYXNzZW1ibGluZyBJTlNOLiAgKi8KKworY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgorYXJjX29wY29kZV9sb29rdXBfZGlzIChpbnNuKQorICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKK3sKKyAgcmV0dXJuIGljb2RlX21hcFtBUkNfSEFTSF9JQ09ERSAoaW5zbildOworfQorDAorLyogTm9uemVybyBpZiB3ZSd2ZSBzZWVuIGFuICdmJyBzdWZmaXggKGluIGNlcnRhaW4gaW5zbnMpLiAgKi8KK3N0YXRpYyBpbnQgZmxhZ19wOworCisvKiBOb256ZXJvIGlmIHdlJ3ZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlICdmJyBzdWZmaXguICAqLworc3RhdGljIGludCBmbGFnc2hpbW1faGFuZGxlZF9wOworCisvKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYSAncScgc3VmZml4IChjb25kaXRpb24gY29kZSkuICAqLworc3RhdGljIGludCBjb25kX3A7CisKKy8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBzaGltbS4gICovCitzdGF0aWMgaW50IHNoaW1tX3A7CisKKy8qIFRoZSB2YWx1ZSBvZiB0aGUgc2hpbW0gd2UgaW5zZXJ0ZWQgKGVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KKyAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCitzdGF0aWMgaW50IHNoaW1tOworCisvKiBOb256ZXJvIGlmIHdlJ3ZlIGluc2VydGVkIGEgbGltbSAoZHVyaW5nIGFzc2VtYmx5KSBvciBzZWVuIGEgbGltbQorICAgKGR1cmluZyBkaXNhc3NlbWJseSkuICAqLworc3RhdGljIGludCBsaW1tX3A7CisKKy8qIFRoZSB2YWx1ZSBvZiB0aGUgbGltbSB3ZSBpbnNlcnRlZC4gIEVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KKyAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCitzdGF0aWMgbG9uZyBsaW1tOworDAorLyogSW5zZXJ0aW9uIGZ1bmN0aW9ucy4gICovCisKKy8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGJlZm9yZSBwYXJzaW5nIGFuIGluc3RydWN0aW9uLiAgKi8KKwordm9pZAorYXJjX29wY29kZV9pbml0X2luc2VydCAoKQoreworICBmbGFnX3AgPSAwOworICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKKyAgY29uZF9wID0gMDsKKyAgc2hpbW1fcCA9IDA7CisgIGxpbW1fcCA9IDA7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBoYXMgYSBsaW1tIG9wZXJhbmQuCisgICBBbHNvIGNhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBjb250YWlucyBhIGxpbW0uICAqLworCitpbnQKK2FyY19vcGNvZGVfbGltbV9wIChsaW1tcCkKKyAgICAgbG9uZyAqbGltbXA7Cit7CisgIGlmIChsaW1tcCkKKyAgICAqbGltbXAgPSBsaW1tOworICByZXR1cm4gbGltbV9wOworfQorCisvKiBJbnNlcnQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIgZmllbGQuCisgICBJZiBSRUcgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGFjdHVhbGx5IGEgY29uc3RhbnQuCisKKyAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICAqLworCitzdGF0aWMgYXJjX2luc24KK2luc2VydF9yZWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKKyAgICAgYXJjX2luc24gaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworICAgICBpbnQgbW9kczsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOworCisgIGlmIChyZWcgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGEgY29uc3RhbnQgdGhhdCBhbHNvIHJlcXVpcmVzIGEgdmFsdWUgc3RvcmVkIGluIGEgcmVnaXN0ZXIKKwkgZmllbGQuICBIYW5kbGUgdGhlc2UgYnkgdXBkYXRpbmcgdGhlIHJlZ2lzdGVyIGZpZWxkIGFuZCBzYXZpbmcgdGhlCisJIHZhbHVlIGZvciBsYXRlciBoYW5kbGluZyBieSBlaXRoZXIgJVMgKHNoaW1tKSBvciAlTCAobGltbSkuICAqLworCisgICAgICAvKiBUcnkgdG8gdXNlIGEgc2hpbW0gdmFsdWUgYmVmb3JlIGEgbGltbSBvbmUuICAqLworICAgICAgaWYgKEFSQ19TSElNTV9DT05TVF9QICh2YWx1ZSkKKwkgIC8qIElmIHdlJ3ZlIHNlZW4gYSBjb25kaXRpb25hbCBzdWZmaXggd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KKwkgICYmICFjb25kX3AKKwkgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIHNoaW1tIHZhbHVlIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gb3VycworCSAgICAgd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KKwkgICYmICghc2hpbW1fcCB8fCBzaGltbSA9PSB2YWx1ZSkpCisJeworCSAgaW50IG1hcmtlciA9IGZsYWdfcCA/IEFSQ19SRUdfU0hJTU1fVVBEQVRFIDogQVJDX1JFR19TSElNTTsKKwkgIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAxOworCSAgc2hpbW1fcCA9IDE7CisJICBzaGltbSA9IHZhbHVlOworCSAgaW5zbiB8PSBtYXJrZXIgPDwgb3BlcmFuZC0+c2hpZnQ7CisJICAvKiBpbnNuIHw9IHZhbHVlICYgNTExOyAtIGRvbmUgbGF0ZXIgKi8KKwl9CisgICAgICAvKiBXZSBoYXZlIHRvIHVzZSBhIGxpbW0uICBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb25lIHRoZXkgbXVzdCBtYXRjaC4gICovCisgICAgICBlbHNlIGlmICghbGltbV9wIHx8IGxpbW0gPT0gdmFsdWUpCisJeworCSAgbGltbV9wID0gMTsKKwkgIGxpbW0gPSB2YWx1ZTsKKwkgIGluc24gfD0gQVJDX1JFR19MSU1NIDw8IG9wZXJhbmQtPnNoaWZ0OworCSAgLyogVGhlIGNvbnN0YW50IGlzIHN0b3JlZCBsYXRlci4gICovCisJfQorICAgICAgZWxzZQorCXsKKwkgICplcnJtc2cgPSBfKCJ1bmFibGUgdG8gZml0IGRpZmZlcmVudCB2YWx1ZWQgY29uc3RhbnRzIGludG8gaW5zdHJ1Y3Rpb24iKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBoYW5kbGUgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLworCisgICAgICBpZiAocmVnLT50eXBlID09IEFVWFJFRykKKwl7CisJICBpZiAoIShtb2RzICYgQVJDX01PRF9BVVhSRUcpKQorCSAgICAqZXJybXNnID0gXygiYXV4aWxpYXJ5IHJlZ2lzdGVyIG5vdCBhbGxvd2VkIGhlcmUiKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGluc24gfD0gQVJDX1JFR19TSElNTSA8PCBvcGVyYW5kLT5zaGlmdDsKKwkgICAgICBpbnNuIHw9IHJlZy0+dmFsdWUgPDwgYXJjX29wZXJhbmRzW3JlZy0+dHlwZV0uc2hpZnQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBhbiBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBoZXJlLiAgKi8KKwkgIGlmICgodW5zaWduZWQgaW50KSByZWctPnZhbHVlID4gNjApCisJICAgIHsKKwkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICAgIHNwcmludGYgKGJ1ZiwgXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgYCVkJyIpLCByZWctPnZhbHVlKTsKKwkgICAgICAqZXJybXNnID0gYnVmOworCSAgICB9CisJICBlbHNlCisJICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBvcGVyYW5kLT5zaGlmdDsKKwl9CisgICAgfQorCisgIHJldHVybiBpbnNuOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYW4gJ2YnIGZsYWcuICAqLworCitzdGF0aWMgYXJjX2luc24KK2luc2VydF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCisgICAgIGFyY19pbnNuIGluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICAvKiBXZSBjYW4ndCBzdG9yZSBhbnl0aGluZyBpbiB0aGUgaW5zbiB1bnRpbCB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4KKyAgICAgSnVzdCByZWNvcmQgdGhlIGZhY3QgdGhhdCB3ZSd2ZSBnb3QgdGhpcyBmbGFnLiAgYGluc2VydF9yZWcnIHdpbGwgdXNlIGl0CisgICAgIHRvIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIChBUkNfUkVHX1NISU1NX1VQREFURSBvciBiaXQgMHgxMDApLiAgKi8KKyAgZmxhZ19wID0gMTsKKworICByZXR1cm4gaW5zbjsKK30KKworLyogQ2FsbGVkIGFmdGVyIGNvbXBsZXRlbHkgYnVpbGRpbmcgYW4gaW5zbiB0byBlbnN1cmUgdGhlICdmJyBmbGFnIGdldHMgc2V0CisgICBwcm9wZXJseS4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gc2V0IHRoaXMgZmxhZyB1bnRpbAorICAgd2UndmUgcGFyc2VkIHRoZSByZWdpc3RlcnMuICAqLworCitzdGF0aWMgYXJjX2luc24KK2luc2VydF9mbGFnZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCisgICAgIGFyY19pbnNuIGluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAoZmxhZ19wICYmICFmbGFnc2hpbW1faGFuZGxlZF9wKQorICAgIHsKKyAgICAgIGlmIChzaGltbV9wKQorCWFib3J0ICgpOworICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7CisgICAgICBpbnNuIHw9ICgxIDw8IG9wZXJhbmQtPnNoaWZ0KTsKKyAgICB9CisgIHJldHVybiBpbnNuOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYSBjb25kaXRpb25hbCBmbGFnIChlZzogLmVxKS4gICovCisKK3N0YXRpYyBhcmNfaW5zbgoraW5zZXJ0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKKyAgICAgYXJjX2luc24gaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworICAgICBpbnQgbW9kczsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIGNvbmRfcCA9IDE7CisgIGluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OworICByZXR1cm4gaW5zbjsKK30KKworLyogVXNlZCBpbiB0aGUgImoiIGluc3RydWN0aW9uIHRvIHByZXZlbnQgY29uc3RhbnRzIGZyb20gYmVpbmcgaW50ZXJwcmV0ZWQgYXMKKyAgIHNoaW1tIHZhbHVlcyAod2hpY2ggdGhlIGp1bXAgaW5zbiBkb2Vzbid0IGFjY2VwdCkuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQKKyAgIHRvIGZvcmNlIHRoZSB1c2Ugb2YgbGltbSB2YWx1ZXMgaW4gb3RoZXIgc2l0dWF0aW9ucyAoZWc6IGxkIHIwLFtmb29dIHVzZXMKKyAgIHRoaXMpLgorICAgPz8/IFRoZSBtZWNoYW5pc20gaXMgc291bmQuICBBY2Nlc3MgdG8gaXQgaXMgYSBiaXQga2x1bmt5IHJpZ2h0IG5vdy4gICovCisKK3N0YXRpYyBhcmNfaW5zbgoraW5zZXJ0X2ZvcmNlbGltbSAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQorICAgICBhcmNfaW5zbiBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGludCBtb2RzOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgY29uZF9wID0gMTsKKyAgcmV0dXJuIGluc247Cit9CisKKy8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgdG8gaGFuZGxlIHRoZSBzaGltbSBvZmZzZXQgZmllbGQuICAqLworCitzdGF0aWMgYXJjX2luc24KK2luc2VydF9zaGltbW9mZnNldCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQorICAgICBhcmNfaW5zbiBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGludCBtb2RzOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgbG9uZyBtaW52YWwsIG1heHZhbDsKKyAgc3RhdGljIGNoYXIgYnVmWzEwMF07CisKKyAgaWYgKHJlZyAhPSBOVUxMKQorICAgIHsKKyAgICAgICplcnJtc2cgPSAicmVnaXN0ZXIgYXBwZWFycyB3aGVyZSBzaGltbSB2YWx1ZSBleHBlY3RlZCI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhpcyBpcyAqd2F5KiBtb3JlIGdlbmVyYWwgdGhhbiBuZWNlc3NhcnksIGJ1dCBtYXliZSBzb21lIGRheSBpdCdsbAorCSBiZSB1c2VmdWwuICAqLworICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQorCXsKKwkgIG1pbnZhbCA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKKwkgIG1heHZhbCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWludmFsID0gMDsKKwkgIG1heHZhbCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKKwl9CisgICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCisJeworCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgIHNwcmludGYgKGJ1ZiwgXygidmFsdWUgd29uJ3QgZml0IGluIHJhbmdlICVsZCAtICVsZCIpLAorCQkgICBtaW52YWwsIG1heHZhbCk7CisJICAqZXJybXNnID0gYnVmOworCX0KKyAgICAgIGVsc2UKKwlpbnNuIHw9ICh2YWx1ZSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKKyAgICB9CisgIHJldHVybiBpbnNuOworfQorCisvKiBVc2VkIGluIGxkL3N0IGluc25zIHdoZW4gdGhlIHNoaW1tIG9mZnNldCBpcyAwLiAgKi8KKworc3RhdGljIGFyY19pbnNuCitpbnNlcnRfc2hpbW16ZXJvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCisgICAgIGFyY19pbnNuIGluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBzaGltbV9wID0gMTsKKyAgc2hpbW0gPSAwOworICByZXR1cm4gaW5zbjsKK30KKworLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIHNoaW1tCisgICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4gICovCisKK3N0YXRpYyBhcmNfaW5zbgoraW5zZXJ0X3NoaW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCisgICAgIGFyY19pbnNuIGluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAoc2hpbW1fcCkKKyAgICBpbnNuIHw9IChzaGltbSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKKyAgcmV0dXJuIGluc247Cit9CisKKy8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHByb2Nlc3Npbmcgbm9ybWFsIGluc25zIChlZzogYWRkKSB0byBpbnNlcnQgYSBsaW1tCisgICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4KKworICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQorICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCisKKy8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCisgICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQorICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0CisgICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKKyAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KKworc3RhdGljIGFyY19pbnNuCitpbnNlcnRfbGltbWZpbmlzaCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQorICAgICBhcmNfaW5zbiBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGludCBtb2RzOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKGxpbW1fcCkKKyAgICA7IC8qIG5vdGhpbmcgdG8gZG8sIGdhcyBkb2VzIGl0ICovCisgIHJldHVybiBpbnNuOworfQorCisvKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB1bmFyeSBvcGVyYW5kIG1hY3JvcyB0byBjb3B5IHRoZSBCIGZpZWxkIHRvIEMuICAqLworCitzdGF0aWMgYXJjX2luc24KK2luc2VydF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKKyAgICAgYXJjX2luc24gaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworICAgICBpbnQgbW9kczsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIGluc24gfD0gKChpbnNuID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykgPDwgb3BlcmFuZC0+c2hpZnQ7CisgIHJldHVybiBpbnNuOworfQorCisvKiBJbnNlcnQgYSByZWxhdGl2ZSBhZGRyZXNzIGZvciBhIGJyYW5jaCBpbnNuIChiLCBibCwgb3IgbHApLiAgKi8KKworc3RhdGljIGFyY19pbnNuCitpbnNlcnRfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQorICAgICBhcmNfaW5zbiBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGludCBtb2RzOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKHZhbHVlICYgMykKKyAgICAqZXJybXNnID0gXygiYnJhbmNoIGFkZHJlc3Mgbm90IG9uIDQgYnl0ZSBib3VuZGFyeSIpOworICBpbnNuIHw9ICgodmFsdWUgPj4gMikgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7CisgIHJldHVybiBpbnNuOworfQorCisvKiBJbnNlcnQgYSBsaW1tIHZhbHVlIGFzIGEgMjYgYml0IGFkZHJlc3MgcmlnaHQgc2hpZnRlZCAyIGludG8gdGhlIGluc24uCisKKyAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgdG8gaGFuZGxlIGluc3RydWN0aW9ucyAod2l0aCA0IGJ5dGUKKyAgIGltbWVkaWF0ZSBvcGVyYW5kcykuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gaGFuZGxlIGRhdGEuICAqLworCisvKiA/Pz8gQWN0dWFsbHksIHRoZXJlJ3Mgbm90aGluZyBmb3IgdXMgdG8gZG8gYXMgd2UgY2FuJ3QgY2FsbCBmcmFnX21vcmUsIHRoZQorICAgY2FsbGVyIG11c3QgZG8gdGhhdC4gIFRoZSBleHRyYWN0IGZucyB0YWtlIGEgcG9pbnRlciB0byB0d28gd29yZHMuICBUaGUKKyAgIGluc2VydCBmbnMgY291bGQgYmUgY29udmVydGVkIGFuZCB0aGVuIHdlIGNvdWxkIGRvIHNvbWV0aGluZyB1c2VmdWwsIGJ1dAorICAgdGhlbiB0aGUgcmVsb2MgaGFuZGxlcnMgd291bGQgaGF2ZSB0byBrbm93IHRvIHdvcmsgb24gdGhlIHNlY29uZCB3b3JkIG9mCisgICBhIDIgd29yZCBxdWFudGl0eS4gIFRoYXQncyB0b28gbXVjaCBzbyB3ZSBkb24ndCBoYW5kbGUgdGhlbS4gICovCisKK3N0YXRpYyBhcmNfaW5zbgoraW5zZXJ0X2Fic2FkZHIgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKKyAgICAgYXJjX2luc24gaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOworICAgICBpbnQgbW9kczsKKyAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIGlmIChsaW1tX3ApCisgICAgOyAvKiBub3RoaW5nIHRvIGRvICovCisgIHJldHVybiBpbnNuOworfQorDAorLyogRXh0cmFjdGlvbiBmdW5jdGlvbnMuCisKKyAgIFRoZSBzdWZmaXggZXh0cmFjdGlvbiBmdW5jdGlvbnMnIHJldHVybiB2YWx1ZSBpcyByZWR1bmRhbnQgc2luY2UgaXQgY2FuIGJlCisgICBvYnRhaW5lZCBmcm9tICgqT1BWQUwpLT52YWx1ZS4gIEhvd2V2ZXIsIHRoZSBib29sZWFuIHN1ZmZpeGVzIGRvbid0IGhhdmUKKyAgIGEgc3VmZml4IHRhYmxlIGVudHJ5IGZvciB0aGUgImZhbHNlIiBjYXNlLCBzbyB2YWx1ZXMgb2YgemVybyBtdXN0IGJlCisgICBvYnRhaW5lZCBmcm9tIHRoZSByZXR1cm4gdmFsdWUgKCpPUFZBTCA9PSBOVUxMKS4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmxvb2t1cF9yZWdpc3RlciAoaW50IHR5cGUsIGxvbmcgcmVnbm8pOworCisvKiBDYWxsZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBiZWZvcmUgcHJpbnRpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLworCit2b2lkCithcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKQoreworICBmbGFnX3AgPSAwOworICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKKyAgc2hpbW1fcCA9IDA7CisgIGxpbW1fcCA9IDA7Cit9CisKKy8qIEFzIHdlJ3JlIGV4dHJhY3RpbmcgcmVnaXN0ZXJzLCBrZWVwIGFuIGV5ZSBvdXQgZm9yIHRoZSAnZicgaW5kaWNhdG9yCisgICAoQVJDX1JFR19TSElNTV9VUERBVEUpLiAgSWYgd2UgZmluZCBhIHJlZ2lzdGVyIChub3QgYSBjb25zdGFudCBtYXJrZXIsCisgICBsaWtlIEFSQ19SRUdfU0hJTU0pLCBzZXQgT1BWQUwgc28gb3VyIGNhbGxlciB3aWxsIGtub3cgdGhpcyBpcyBhIHJlZ2lzdGVyLgorCisgICBXZSBtdXN0IGFsc28gaGFuZGxlIGF1eGlsaWFyeSByZWdpc3RlcnMgZm9yIGxyL3NyIGluc25zLiAgVGhleSBhcmUganVzdAorICAgY29uc3RhbnRzIHdpdGggc3BlY2lhbCBuYW1lcy4gICovCisKK3N0YXRpYyBsb25nCitleHRyYWN0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCisgICAgIGFyY19pbnNuICppbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGludCBtb2RzOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKKyAgICAgaW50ICppbnZhbGlkOworeworICBpbnQgcmVnbm87CisgIGxvbmcgdmFsdWU7CisKKyAgLyogR2V0IHRoZSByZWdpc3RlciBudW1iZXIuICAqLworICByZWdubyA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOworCisgIC8qIElzIGl0IGEgY29uc3RhbnQgbWFya2VyPyAgKi8KKyAgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU0pCisgICAgeworICAgICAgdmFsdWUgPSBpbnNuWzBdICYgNTExOworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkKKwkgICYmICh2YWx1ZSAmIDI1NikpCisJdmFsdWUgLT0gNTEyOworICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7CisgICAgfQorICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX1NISU1NX1VQREFURSkKKyAgICB7CisgICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7CisgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQorCSAgJiYgKHZhbHVlICYgMjU2KSkKKwl2YWx1ZSAtPSA1MTI7CisgICAgICBmbGFnX3AgPSAxOworICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7CisgICAgfQorICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX0xJTU0pCisgICAgeworICAgICAgdmFsdWUgPSBpbnNuWzFdOworICAgICAgbGltbV9wID0gMTsKKyAgICB9CisgIC8qIEl0J3MgYSByZWdpc3Rlciwgc2V0IE9QVkFMICh0aGF0J3MgdGhlIG9ubHkgd2F5IHdlIGRpc3Rpbmd1aXNoIHJlZ2lzdGVycworICAgICBmcm9tIGNvbnN0YW50cyBoZXJlKS4gICovCisgIGVsc2UKKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoUkVHLCByZWdubyk7CisKKyAgICAgIGlmIChyZWcgPT0gTlVMTCkKKwlhYm9ydCAoKTsKKyAgICAgIGlmIChvcHZhbCAhPSBOVUxMKQorCSpvcHZhbCA9IHJlZzsKKyAgICAgIHZhbHVlID0gcmVnbm87CisgICAgfQorCisgIC8qIElmIHRoaXMgZmllbGQgdGFrZXMgYW4gYXV4aWxpYXJ5IHJlZ2lzdGVyLCBzZWUgaWYgaXQncyBhIGtub3duIG9uZS4gICovCisgIGlmICgobW9kcyAmIEFSQ19NT0RfQVVYUkVHKQorICAgICAgJiYgQVJDX1JFR19DT05TVEFOVF9QIChyZWdubykpCisgICAgeworICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBsb29rdXBfcmVnaXN0ZXIgKEFVWFJFRywgdmFsdWUpOworCisgICAgICAvKiBUaGlzIGlzIHJlYWxseSBhIGNvbnN0YW50LCBidXQgdGVsbCB0aGUgY2FsbGVyIGl0IGhhcyBhIHNwZWNpYWwKKwkgbmFtZS4gICovCisgICAgICBpZiAocmVnICE9IE5VTEwgJiYgb3B2YWwgIT0gTlVMTCkKKwkqb3B2YWwgPSByZWc7CisgICAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgImZsYWcgdXBkYXRlIiBmaWVsZCBmb3Igc2hpbW0gaW5zbnMuCisgICBUaGlzIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgZmllbGQuICAqLworCitzdGF0aWMgbG9uZworZXh0cmFjdF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKKyAgICAgYXJjX2luc24gKmluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIGludCBmOworICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKKworICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKKyAgICBmID0gZmxhZ19wICE9IDA7CisgIGVsc2UKKyAgICBmID0gKGluc25bMF0gJiAoMSA8PCBvcGVyYW5kLT5zaGlmdCkpICE9IDA7CisKKyAgLyogVGhlcmUgaXMgbm8gdGV4dCBmb3IgemVybyB2YWx1ZXMuICAqLworICBpZiAoZiA9PSAwKQorICAgIHJldHVybiAwOworCisgIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgMSk7CisgIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQorICAgICpvcHZhbCA9IHZhbDsKKyAgcmV0dXJuIHZhbC0+dmFsdWU7Cit9CisKKy8qIEV4dHJhY3QgdGhlIGNvbmRpdGlvbiBjb2RlIChpZiBpdCBleGlzdHMpLgorICAgSWYgd2UndmUgc2VlbiBhIHNoaW1tIHZhbHVlIGluIHRoaXMgaW5zbiAobWVhbmluZyB0aGF0IHRoZSBpbnNuIGNhbid0IGhhdmUKKyAgIGEgY29uZGl0aW9uIGNvZGUgZmllbGQpLCB0aGVuIHdlIGRvbid0IHN0b3JlIGFueXRoaW5nIGluIE9QVkFMIGFuZCByZXR1cm4KKyAgIHplcm8uICAqLworCitzdGF0aWMgbG9uZworZXh0cmFjdF9jb25kIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKKyAgICAgYXJjX2luc24gKmluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIGxvbmcgY29uZDsKKyAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICp2YWw7CisKKyAgaWYgKGZsYWdzaGltbV9oYW5kbGVkX3ApCisgICAgcmV0dXJuIDA7CisKKyAgY29uZCA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOworICB2YWwgPSBhcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggKG9wZXJhbmQsIGNvbmQpOworCisgIC8qIElnbm9yZSBOVUxMIHZhbHVlcyBvZiBgdmFsJy4gIFNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzIGFyZQorICAgICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9ucy4gICovCisgIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQorICAgICpvcHZhbCA9IHZhbDsKKyAgcmV0dXJuIGNvbmQ7Cit9CisKKy8qIEV4dHJhY3QgYSBicmFuY2ggYWRkcmVzcy4KKyAgIFdlIHJldHVybiB0aGUgdmFsdWUgYXMgYSByZWFsIGFkZHJlc3MgKG5vdCByaWdodCBzaGlmdGVkIGJ5IDIpLiAgKi8KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCisgICAgIGFyY19pbnNuICppbnNuOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGludCBtb2RzOworICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKKyAgICAgaW50ICppbnZhbGlkOworeworICBsb25nIGFkZHI7CisKKyAgYWRkciA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOworICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQorICAgICAgJiYgKGFkZHIgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkpCisgICAgYWRkciAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7CisKKyAgcmV0dXJuIGFkZHIgPDwgMjsKK30KKworLyogVGhlIG9ubHkgdGhpbmcgdGhpcyBkb2VzIGlzIHNldCB0aGUgYGludmFsaWQnIGZsYWcgaWYgQiAhPSBDLgorICAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgIm1vdiIgbWFjcm8gYXBwZWFycyBiZWZvcmUgaXQncyByZWFsIGluc24gImFuZCIKKyAgIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBkaXNhc3NlbWJsZXIgdG8gY29uZnVzZSB0aGVtLiAgKi8KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfdW5vcG1hY3JvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKKyAgICAgYXJjX2luc24gKmluc247CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKKyAgICAgaW50IG1vZHM7CisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIC8qIFRoaXMgbWlzc2VzIHRoZSBjYXNlIHdoZXJlIEIgPT0gQVJDX1JFR19TSElNTV9VUERBVEUgJiYKKyAgICAgQyA9PSBBUkNfUkVHX1NISU1NIChvciB2aWNlIHZlcnNhKS4gIE5vIGJpZyBkZWFsLiAgVGhvc2UgaW5zbnMgd2lsbCBnZXQKKyAgICAgcHJpbnRlZCBhcyAiYW5kInMuICAqLworICBpZiAoKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykKKyAgICAgICE9ICgoaW5zblswXSA+PiBBUkNfU0hJRlRfUkVHQykgJiBBUkNfTUFTS19SRUcpKQorICAgIGlmIChpbnZhbGlkICE9IE5VTEwpCisgICAgICAqaW52YWxpZCA9IDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFV0aWxpdHkgZm9yIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9ucyB0byByZXR1cm4gdGhlIGluZGV4IGludG8KKyAgIGBhcmNfc3VmZml4ZXMnLiAgKi8KKworY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoKK2FyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAodHlwZSwgdmFsdWUpCisgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqdHlwZTsKKyAgICAgaW50IHZhbHVlOworeworICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnYsKmVuZDsKKworICAvKiA/Pz8gVGhpcyBpcyBhIGxpdHRsZSBzbG93IGFuZCBjYW4gYmUgc3BlZWRlZCB1cC4gICovCisKKyAgZm9yICh2ID0gYXJjX3N1ZmZpeGVzLCBlbmQgPSBhcmNfc3VmZml4ZXMgKyBhcmNfc3VmZml4ZXNfY291bnQ7IHYgPCBlbmQ7ICsrdikKKyAgICBpZiAodHlwZSA9PSAmYXJjX29wZXJhbmRzW3YtPnR5cGVdCisJJiYgdmFsdWUgPT0gdi0+dmFsdWUpCisgICAgICByZXR1cm4gdjsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgorbG9va3VwX3JlZ2lzdGVyICh0eXBlLCByZWdubykKKyAgICAgaW50IHR5cGU7CisgICAgIGxvbmcgcmVnbm87Cit7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqciwqZW5kOworCisgIGlmICh0eXBlID09IFJFRykKKyAgICByZXR1cm4gJmFyY19yZWdfbmFtZXNbcmVnbm9dOworCisgIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KKworICBmb3IgKHIgPSBhcmNfcmVnX25hbWVzLCBlbmQgPSBhcmNfcmVnX25hbWVzICsgYXJjX3JlZ19uYW1lc19jb3VudDsKKyAgICAgICByIDwgZW5kOyArK3IpCisgICAgaWYgKHR5cGUgPT0gci0+dHlwZQkmJiByZWdubyA9PSByLT52YWx1ZSkKKyAgICAgIHJldHVybiByOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJtLWRpcy5jIGIvb3Bjb2Rlcy9hcm0tZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhYmY3MgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvYXJtLWRpcy5jCkBAIC0wLDAgKzEsODg3IEBACisvKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQVJNCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKKyAgIE1vZGlmaWNhdGlvbiBieSBKYW1lcyBHLiBTbWl0aCAoanNtaXRoQGN5Z251cy5jby51aykKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlib3Bjb2Rlcy4gCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uIAorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKK0FOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorbW9yZSBkZXRhaWxzLiAKKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRpcy1hc20uaCIKKyNkZWZpbmUgREVGSU5FX1RBQkxFCisjaW5jbHVkZSAiYXJtLW9wYy5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBkb25lIGhlcmUgKi8KKyNpbmNsdWRlICJlbGYtYmZkLmgiCisjaW5jbHVkZSAiZWxmL2ludGVybmFsLmgiCisjaW5jbHVkZSAiZWxmL2FybS5oIgorCitzdGF0aWMgY2hhciAqYXJtX2NvbmRpdGlvbmFsW10gPQoreyJlcSIsICJuZSIsICJjcyIsICJjYyIsICJtaSIsICJwbCIsICJ2cyIsICJ2YyIsCisgImhpIiwgImxzIiwgImdlIiwgImx0IiwgImd0IiwgImxlIiwgIiIsICJudiJ9OworCitzdGF0aWMgY2hhciAqYXJtX3JlZ25hbWVzW10gPQoreyJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisgInI4IiwgInI5IiwgInNsIiwgImZwIiwgImlwIiwgInNwIiwgImxyIiwgInBjIn07CisKK3N0YXRpYyBjaGFyICphcm1fZnBfY29uc3RbXSA9Cit7IjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsICI0LjAiLCAiNS4wIiwgIjAuNSIsICIxMC4wIn07CisKK3N0YXRpYyBjaGFyICphcm1fc2hpZnRbXSA9IAoreyJsc2wiLCAibHNyIiwgImFzciIsICJyb3IifTsKKworc3RhdGljIGludCBwcmludF9pbnNuX2FybSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAorCQkJCSAgIGxvbmcpKTsKKworc3RhdGljIHZvaWQKK2FybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pCisgICAgIGxvbmcgZ2l2ZW47CisgICAgIGZwcmludGZfZnR5cGUgZnVuYzsKKyAgICAgdm9pZCAqc3RyZWFtOworeworICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOworICBpZiAoKGdpdmVuICYgMHhmZjApICE9IDApCisgICAgeworICAgICAgaWYgKChnaXZlbiAmIDB4MTApID09IDApCisJeworCSAgaW50IGFtb3VudCA9IChnaXZlbiAmIDB4ZjgwKSA+PiA3OworCSAgaW50IHNoaWZ0ID0gKGdpdmVuICYgMHg2MCkgPj4gNTsKKwkgIGlmIChhbW91bnQgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChzaGlmdCA9PSAzKQorCQl7CisJCSAgZnVuYyAoc3RyZWFtLCAiLCBycngiKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBhbW91bnQgPSAzMjsKKwkgICAgfQorCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyAjJWQiLCBhcm1fc2hpZnRbc2hpZnRdLCBhbW91bnQpOworCX0KKyAgICAgIGVsc2UKKwlmdW5jIChzdHJlYW0sICIsICVzICVzIiwgYXJtX3NoaWZ0WyhnaXZlbiAmIDB4NjApID4+IDVdLAorCSAgICAgIGFybV9yZWduYW1lc1soZ2l2ZW4gJiAweGYwMCkgPj4gOF0pOworICAgIH0KK30KKworLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgorICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoYWx3YXlzIDQgb24gQVJNKS4gKi8KKworc3RhdGljIGludAorcHJpbnRfaW5zbl9hcm0gKHBjLCBpbmZvLCBnaXZlbikKKyAgICAgYmZkX3ZtYSAgICAgICAgIHBjOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgbG9uZyBnaXZlbjsKK3sKKyAgc3RydWN0IGFybV9vcGNvZGUgKiAgaW5zbjsKKyAgdm9pZCAqICAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOworICBmcHJpbnRmX2Z0eXBlICAgICAgICBmdW5jICAgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7CisKKyAgZm9yIChpbnNuID0gYXJtX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQorICAgIHsKKyAgICAgIGlmICgoZ2l2ZW4gJiBpbnNuLT5tYXNrKSA9PSBpbnNuLT52YWx1ZSkKKwl7CisJICBjaGFyICogYzsKKwkgIAorCSAgZm9yIChjID0gaW5zbi0+YXNzZW1ibGVyOyAqYzsgYysrKQorCSAgICB7CisJICAgICAgaWYgKCpjID09ICclJykKKwkJeworCQkgIHN3aXRjaCAoKisrYykKKwkJICAgIHsKKwkJICAgIGNhc2UgJyUnOgorCQkgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnYSc6CisJCSAgICAgIGlmICgoKGdpdmVuICYgMHgwMDBmMDAwMCkgPT0gMHgwMDBmMDAwMCkKKwkJCSAgJiYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApKQorCQkJeworCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKKwkJCSAgCisJCQkgIGZ1bmMgKHN0cmVhbSwgIltwYyIpOworIAorCQkJICBpZiAoZ2l2ZW4gJiAweDAxMDAwMDAwKQorCQkJICAgIHsKKwkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQorCQkJCW9mZnNldCA9IC0gb2Zmc2V0OworCQkJICAKKwkJCSAgICAgIC8qIHByZS1pbmRleGVkICovCisJCQkgICAgICBmdW5jIChzdHJlYW0sICIsICMleF0iLCBvZmZzZXQpOworCisJCQkgICAgICBvZmZzZXQgKz0gcGMgKyA4OworCisJCQkgICAgICAvKiBDb3BlIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIHdyaXRlLWJhY2sgYmVpbmcgdXNlZC4KKwkJCQkgUHJvYmFibHkgYSB2ZXJ5IGRhbmdlcm91cyB0aGluZyBmb3IgdGhlIHByb2dyYW1tZXIKKwkJCQkgdG8gZG8sIGJ1dCB3aG8gYXJlIHdlIHRvIGFyZ3VlID8gICovCisJCQkgICAgICBpZiAoZ2l2ZW4gJiAweDAwMjAwMDAwKQorCQkJCWZ1bmMgKHN0cmVhbSwgIiEiKTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICAvKiBwb3N0IGluZGV4ZWQgKi8KKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0sICMleCIsIG9mZnNldCk7CisKKwkJCSAgICAgIG9mZnNldCA9IHBjICsgODsgIC8qIGllIGlnbm9yZSB0aGUgb2Zmc2V0ICovCisJCQkgICAgfQorCQkJICAKKwkJCSAgZnVuYyAoc3RyZWFtLCAiXHQ7ICIpOworCQkJICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCwgaW5mbyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgCisJCQkJYXJtX3JlZ25hbWVzWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKKwkJCSAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCisJCQkgICAgeworCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApCisJCQkJeworCQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7CisJCQkJICBpZiAob2Zmc2V0KQorCQkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkIiwKKwkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOworCQkJCX0KKwkJCSAgICAgIGVsc2UKKwkJCQl7CisJCQkJICBmdW5jIChzdHJlYW0sICIsICVzIiwKKwkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQorCQkJCQkgPyAiLSIgOiAiIikpOworCQkJCSAgYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSk7CisJCQkJfQorCisJCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLCAKKwkJCQkgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDApID8gIiEiIDogIiIpOworCQkJICAgIH0KKwkJCSAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQorCQkJCXsKKwkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOworCQkJCSAgaWYgKG9mZnNldCkKKwkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAorCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKKwkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7CisJCQkJICBlbHNlIAorCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7CisJCQkJfQorCQkJICAgICAgZWxzZQorCQkJCXsKKwkJCQkgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIiwKKwkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKSAKKwkJCQkJID8gIi0iIDogIiIpKTsKKwkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOworCQkJCX0KKwkJCSAgICB9CisJCQl9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgMHgwMDRmMDAwMCkgPT0gMHgwMDRmMDAwMCkKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUEMgcmVsYXRpdmUgd2l0aCBpbW1lZGlhdGUgb2Zmc2V0ICovCisJCQkgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKKwkJCSAgaWYgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCQkgICAgb2Zmc2V0ID0gLW9mZnNldDsKKwkJCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCisJCQkgICAgKG9mZnNldCArIHBjICsgOCwgaW5mbyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgCisJCQkJYXJtX3JlZ25hbWVzWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKKwkJCSAgaWYgKChnaXZlbiAmIDB4MDEwMDAwMDApICE9IDApCisJCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlLWluZGV4ZWQgKi8KKwkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwNDAwMDAwKSA9PSAweDAwNDAwMDAwKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKChnaXZlbiAmIDB4ZjAwKSA+PiA0KSB8IChnaXZlbiAmIDB4Zik7CisJCQkJICBpZiAob2Zmc2V0KQorCQkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkIiwKKwkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOworCQkJCX0KKwkJCSAgICAgIGVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgKi8KKwkJCQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMlcyIsCisJCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKKwkJCQkJID8gIi0iIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOworCQkJCX0KKworCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSVzIiwgCisJCQkJICAgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0LWluZGV4ZWQgKi8KKwkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwNDAwMDAwKSA9PSAweDAwNDAwMDAwKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1lZGlhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKChnaXZlbiAmIDB4ZjAwKSA+PiA0KSB8IChnaXZlbiAmIDB4Zik7CisJCQkJICBpZiAob2Zmc2V0KQorCQkJCSAgICBmdW5jIChzdHJlYW0sICJdLCAlcyMlZCIsCisJCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQorCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKKwkJCQkgIGVsc2UgCisJCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0iKTsKKwkJCQl9CisJCQkgICAgICBlbHNlCisJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyICovCisJCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyVzIiwKKwkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQorCQkJCQkgPyAiLSIgOiAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJICAgICAgYnJlYWs7CisJCQkgIAorCQkgICAgY2FzZSAnYic6CisJCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQorCQkJKEJESVNQIChnaXZlbikgKiA0ICsgcGMgKyA4LCBpbmZvKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2MnOgorCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsCisJCQkgICAgYXJtX2NvbmRpdGlvbmFsIFsoZ2l2ZW4gPj4gMjgpICYgMHhmXSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdtJzoKKwkJICAgICAgeworCQkJaW50IHN0YXJ0ZWQgPSAwOworCQkJaW50IHJlZzsKKworCQkJZnVuYyAoc3RyZWFtLCAieyIpOworCQkJZm9yIChyZWcgPSAwOyByZWcgPCAxNjsgcmVnKyspCisJCQkgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQorCQkJICAgIHsKKwkJCSAgICAgIGlmIChzdGFydGVkKQorCQkJCWZ1bmMgKHN0cmVhbSwgIiwgIik7CisJCQkgICAgICBzdGFydGVkID0gMTsKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOworCQkJICAgIH0KKwkJCWZ1bmMgKHN0cmVhbSwgIn0iKTsKKwkJICAgICAgfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnbyc6CisJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSAhPSAwKQorCQkJeworCQkJICBpbnQgcm90YXRlID0gKGdpdmVuICYgMHhmMDApID4+IDc7CisJCQkgIGludCBpbW1lZCA9IChnaXZlbiAmIDB4ZmYpOworCQkJICBmdW5jIChzdHJlYW0sICIjJWQiLAorCQkJCSgoaW1tZWQgPDwgKDMyIC0gcm90YXRlKSkKKwkJCQkgfCAoaW1tZWQgPj4gcm90YXRlKSkgJiAweGZmZmZmZmZmKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdwJzoKKwkJICAgICAgaWYgKChnaXZlbiAmIDB4MDAwMGYwMDApID09IDB4MDAwMGYwMDApCisJCQlmdW5jIChzdHJlYW0sICJwIik7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICd0JzoKKwkJICAgICAgaWYgKChnaXZlbiAmIDB4MDEyMDAwMDApID09IDB4MDAyMDAwMDApCisJCQlmdW5jIChzdHJlYW0sICJ0Iik7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdoJzoKKwkJICAgICAgaWYgKChnaXZlbiAmIDB4MDAwMDAwMjApID09IDB4MDAwMDAwMjApCisJCQlmdW5jIChzdHJlYW0sICJoIik7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiYiIpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnQSc6CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIGFybV9yZWduYW1lcyBbKGdpdmVuID4+IDE2KSAmIDB4Zl0pOworCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMTAwMDAwMCkgIT0gMCkKKwkJCXsKKwkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKKwkJCSAgaWYgKG9mZnNldCkKKwkJCSAgICBmdW5jIChzdHJlYW0sICIsICVzIyVkXSVzIiwKKwkJCQkgICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwID8gIi0iIDogIiIpLAorCQkJCSAgb2Zmc2V0ICogNCwKKwkJCQkgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwID8gIiEiIDogIiIpKTsKKwkJCSAgZWxzZQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0iKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmOworCQkJICBpZiAob2Zmc2V0KQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKKwkJCQkgICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwID8gIi0iIDogIiIpLAorCQkJCSAgb2Zmc2V0ICogNCk7CisJCQkgIGVsc2UKKwkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7CisJCQl9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdDJzoKKwkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDAwOTAwMDApCisJCQl7CisJCQlkZWZhdWx0OgorCQkJICBmdW5jIChzdHJlYW0sICJfPz8/Iik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDkwMDAwOgorCQkJICBmdW5jIChzdHJlYW0sICJfYWxsIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDEwMDAwOgorCQkJICBmdW5jIChzdHJlYW0sICJfY3RsIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDgwMDAwOgorCQkJICBmdW5jIChzdHJlYW0sICJfZmxnIik7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnRic6CisJCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwNDA4MDAwKQorCQkJeworCQkJY2FzZSAwOgorCQkJICBmdW5jIChzdHJlYW0sICI0Iik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDgwMDA6CisJCQkgIGZ1bmMgKHN0cmVhbSwgIjEiKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDB4MDA0MDAwMDA6CisJCQkgIGZ1bmMgKHN0cmVhbSwgIjIiKTsKKwkJCSAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICBmdW5jIChzdHJlYW0sICIzIik7CisJCQl9CisJCSAgICAgIGJyZWFrOworCQkJCisJCSAgICBjYXNlICdQJzoKKwkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDAwODAwODApCisJCQl7CisJCQljYXNlIDA6CisJCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDB4ODA6CisJCQkgIGZ1bmMgKHN0cmVhbSwgImQiKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDB4MDAwODAwMDA6CisJCQkgIGZ1bmMgKHN0cmVhbSwgImUiKTsKKwkJCSAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICBmdW5jIChzdHJlYW0sIF8oIjxpbGxlZ2FsIHByZWNpc2lvbj4iKSk7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ1EnOgorCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKKwkJCXsKKwkJCWNhc2UgMDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAicyIpOworCQkJICBicmVhazsKKwkJCWNhc2UgMHg4MDAwOgorCQkJICBmdW5jIChzdHJlYW0sICJkIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDAwNDAwMDAwOgorCQkJICBmdW5jIChzdHJlYW0sICJlIik7CisJCQkgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdSJzoKKwkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4NjApCisJCQl7CisJCQljYXNlIDA6CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDIwOgorCQkJICBmdW5jIChzdHJlYW0sICJwIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDQwOgorCQkJICBmdW5jIChzdHJlYW0sICJtIik7CisJCQkgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAieiIpOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogCisJCSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJCSAgICAgIHsKKwkJCWludCBiaXRzdGFydCA9ICpjKysgLSAnMCc7CisJCQlpbnQgYml0ZW5kID0gMDsKKwkJCXdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQorCQkJICBiaXRzdGFydCA9IChiaXRzdGFydCAqIDEwKSArICpjKysgLSAnMCc7CisKKwkJCXN3aXRjaCAoKmMpCisJCQkgIHsKKwkJCSAgY2FzZSAnLSc6CisJCQkgICAgYysrOworCQkJICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQorCQkJICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7CisJCQkgICAgaWYgKCFiaXRlbmQpCisJCQkgICAgICBhYm9ydCAoKTsKKwkJCSAgICBzd2l0Y2ggKCpjKQorCQkJICAgICAgeworCQkJICAgICAgY2FzZSAncic6CisJCQkJeworCQkJCSAgbG9uZyByZWc7CisJCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKKwkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7CisJCQkJICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlICdkJzoKKwkJCQl7CisJCQkJICBsb25nIHJlZzsKKwkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OworCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKKwkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlICd4JzoKKwkJCQl7CisJCQkJICBsb25nIHJlZzsKKwkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OworCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKKwkJCQkgIGZ1bmMgKHN0cmVhbSwgIjB4JTA4eCIsIHJlZyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJICAgICAgY2FzZSAnZic6CisJCQkJeworCQkJCSAgbG9uZyByZWc7CisJCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKKwkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7CisJCQkJICBpZiAocmVnID4gNykKKwkJCQkgICAgZnVuYyAoc3RyZWFtLCAiIyVzIiwKKwkJCQkJICBhcm1fZnBfY29uc3RbcmVnICYgN10pOworCQkJCSAgZWxzZQorCQkJCSAgICBmdW5jIChzdHJlYW0sICJmJWQiLCByZWcpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgICAgIGRlZmF1bHQ6CisJCQkJYWJvcnQgKCk7CisJCQkgICAgICB9CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ2AnOgorCQkJICAgIGMrKzsKKwkJCSAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSA9PSAwKQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ1wnJzoKKwkJCSAgICBjKys7CisJCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICc/JzoKKwkJCSAgICArK2M7CisJCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMrKyk7CisJCQkgICAgZWxzZQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqKytjKTsKKwkJCSAgICBicmVhazsKKwkJCSAgZGVmYXVsdDoKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgfQorCQkJYnJlYWs7CisKKwkJICAgICAgZGVmYXVsdDoKKwkJCWFib3J0ICgpOworCQkgICAgICB9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCSAgICB9CisJICByZXR1cm4gNDsKKwl9CisgICAgfQorICBhYm9ydCAoKTsKK30KKworLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgorICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KKworc3RhdGljIGludAorcHJpbnRfaW5zbl90aHVtYiAocGMsIGluZm8sIGdpdmVuKQorICAgICBiZmRfdm1hICAgICAgICAgcGM7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBsb25nIGdpdmVuOworeworICBzdHJ1Y3QgdGh1bWJfb3Bjb2RlICppbnNuOworICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07CisgIGZwcmludGZfZnR5cGUgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKKworICBmb3IgKGluc24gPSB0aHVtYl9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKKyAgICB7CisgICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpjID0gaW5zbi0+YXNzZW1ibGVyOworCisgICAgICAgICAgLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBUaHVtYiAyIGluc3RydWN0aW9uIEJMIHNlcXVlbmNlOiAqLworICAgICAgICAgIGlmICghKmMpIC8qIGNoZWNrIGZvciBlbXB0eSAobm90IE5VTEwpIGFzc2VtYmxlciBzdHJpbmcgKi8KKyAgICAgICAgICAgIHsKKwkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OworCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7CisJICAgICAgCisgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiUwNHhcdGJsXHQiLCBnaXZlbiAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQorICAgICAgICAgICAgICAgIChCRElTUDIzIChnaXZlbikgKiAyICsgcGMgKyA0LCBpbmZvKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7CisJICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgID0gNDsKKwkgIAkgICAgICAKKyAgICAgICAgICAgICAgZ2l2ZW4gJj0gMHhmZmZmOworICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlMDR4XHQiLCBnaXZlbik7CisgICAgICAgICAgICAgIGZvciAoOyAqYzsgYysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICgqYyA9PSAnJScpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrcGMgPSAwOworICAgICAgICAgICAgICAgICAgICAgIGludCBkb21hc2tsciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqKytjKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiUlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IChnaXZlbiA+PiAzKSAmIDB4NzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGdpdmVuICYgMHg3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2NvbmRpdGlvbmFsIFsoZ2l2ZW4gPj4gOCkgJiAweGZdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2l2ZW4gJiAoMSA8PCA4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21hc2tsciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYyA9PSAnTycgJiYgKGdpdmVuICYgKDEgPDwgOCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFza3BjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgInsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNwb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMsIGFuZCBnZW5lcmF0ZSB0aGUgclMtckUgZm9ybWF0OiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVnID0gMDsgKHJlZyA8IDgpOyByZWcrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrbHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJsciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbWFza3BjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJwYyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAifSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRlbmQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RhcnQgPSAoYml0c3RhcnQgKiAxMCkgKyAqYysrIC0gJzAnOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqYyA+PSAnMCcgJiYgKmMgPD0gJzknKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiaXRlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnIDw8IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6CisJCQkJICAgICAgLyogUEMtcmVsYXRpdmUgYWRkcmVzcyAtLSB0aGUgYm90dG9tIHR3bworCQkJCQkgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgZHJvcHBlZCBiZWZvcmUKKwkJCQkJIHRoZSBjYWxjdWxhdGlvbi4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYworCQkJCQkoKChwYyArIDQpICYgfjMpICsgKHJlZyA8PCAyKSwgaW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiMHglMDR4IiwgcmVnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSAoKHJlZyBeICgxIDw8IGJpdGVuZCkpIC0gKDEgPDwgYml0ZW5kKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWcgKiAyICsgcGMgKyA0LCBpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKyspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqKytjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiAyOworICAgICAgIH0KKyAgICB9CisKKyAgLyogbm8gbWF0Y2ggKi8KKyAgYWJvcnQgKCk7Cit9CisKKy8qIE5PVEU6IFRoZXJlIGFyZSBubyBjaGVja3MgaW4gdGhlc2Ugcm91dGluZXMgdGhhdCB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgZXhpc3QgKi8KKworaW50CitwcmludF9pbnNuX2JpZ19hcm0gKHBjLCBpbmZvKQorICAgICBiZmRfdm1hIHBjOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgdW5zaWduZWQgY2hhciAgICAgIGJbNF07CisgIGxvbmcgICAgICAgICAgICAgICBnaXZlbjsKKyAgaW50ICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgY29mZl9zeW1ib2xfdHlwZSAgICpjczsKKyAgZWxmX3N5bWJvbF90eXBlICAgICplczsKKyAgaW50ICAgICAgICAgICAgICAgIGlzX3RodW1iOworICAKKyAgaXNfdGh1bWIgPSBmYWxzZTsKKyAgaWYgKGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKKyAgICB7CisgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKKyAgICAgeworICAgICAgIGNzID0gY29mZnN5bWJvbCAoKmluZm8tPnN5bWJvbHMpOworICAgICAgIGlzX3RodW1iID0gKGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFQKKyAgICAgICAgICAgICAgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVAorICAgICAgICAgICAgICAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAorICAgICAgICAgICAgICAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCisgICAgICAgICAgICAgICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DKTsKKyAgCisgICAgIH0KKyAgICBlbHNlIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKyAgICAgeworICAgICAgIGVzID0gKihlbGZfc3ltYm9sX3R5cGUgKiopKGluZm8tPnN5bWJvbHMpOworICAgICAgIGlzX3RodW1iID0gRUxGX1NUX1RZUEUgKGVzLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pID09CisJIFNUVF9BUk1fVEZVTkM7CisgICAgICB9CisgICB9CisKKyAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKKyAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKKworICAvKiBBbHdheXMgZmV0Y2ggd29yZCBhbGlnbmVkIHZhbHVlcy4gICovCisgIAorICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYyAmIH4gMHgzLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoaXNfdGh1bWIpCisgICAgeworICAgICAgaWYgKHBjICYgMHgyKQorCXsKKwkgIGdpdmVuID0gKGJbMl0gPDwgOCkgfCBiWzNdOworCisJICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICgocGMgKyA0KSAmIH4gMHgzLCAoYmZkX2J5dGUgKikgYiwgNCwgaW5mbyk7CisJICBpZiAoc3RhdHVzICE9IDApCisJICAgIHsKKwkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBwYyArIDQsIGluZm8pOworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCSAgCisJICBnaXZlbiB8PSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGdpdmVuID0gKGJbMF0gPDwgOCkgfCBiWzFdIHwgKGJbMl0gPDwgMjQpIHwgKGJbM10gPDwgMTYpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnaXZlbiA9IChiWzBdIDw8IDI0KSB8IChiWzFdIDw8IDE2KSB8IChiWzJdIDw8IDgpIHwgKGJbM10pOworICAgIH0KKworICBpZiAoaXNfdGh1bWIpCisgICAgeworICAgICAgc3RhdHVzID0gcHJpbnRfaW5zbl90aHVtYiAocGMsIGluZm8sIGdpdmVuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSBwcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKTsKKyAgICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworaW50CitwcmludF9pbnNuX2xpdHRsZV9hcm0gKHBjLCBpbmZvKQorICAgICBiZmRfdm1hIHBjOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Cit7CisgIHVuc2lnbmVkIGNoYXIgICAgICBiWzRdOworICBsb25nICAgICAgICAgICAgICAgZ2l2ZW47CisgIGludCAgICAgICAgICAgICAgICBzdGF0dXM7CisgIGNvZmZfc3ltYm9sX3R5cGUgICAqY3M7CisgIGVsZl9zeW1ib2xfdHlwZSAgICAqZXM7CisgIGludCAgICAgICAgICAgICAgICBpc190aHVtYjsKKworICBpc190aHVtYiA9IGZhbHNlOworICBpZiAoaW5mby0+c3ltYm9scyAhPSBOVUxMKQorICAgIHsKKyAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorICAgICB7CisgICAgICAgY3MgPSBjb2Zmc3ltYm9sICgqaW5mby0+c3ltYm9scyk7CisgICAgICAgaXNfdGh1bWIgPSAoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVAorICAgICAgICAgICAgICAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFUCisgICAgICAgICAgICAgICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkxBQkVMCisgICAgICAgICAgICAgICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMKKyAgICAgICAgICAgICAgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMpOworICAKKyAgICAgfQorICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgICB7CisgICAgICAgZXMgPSAqKGVsZl9zeW1ib2xfdHlwZSAqKikoaW5mby0+c3ltYm9scyk7CisgICAgICAgaXNfdGh1bWIgPSBFTEZfU1RfVFlQRSAoZXMtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykgPT0KKwkgU1RUX0FSTV9URlVOQzsKKyAgICAgIH0KKyAgIH0KKworICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OworICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOworCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDAgJiYgaXNfdGh1bWIpCisgICAgeworICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKKworICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAocGMsIChiZmRfYnl0ZSAqKSBiLCAyLCBpbmZvKTsKKyAgICAgIGJbM10gPSBiWzJdID0gMDsKKyAgICB9CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGdpdmVuID0gKGJbMF0pIHwgKGJbMV0gPDwgOCkgfCAoYlsyXSA8PCAxNikgfCAoYlszXSA8PCAyNCk7CisKKyAgaWYgKGlzX3RodW1iKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RhdHVzID0gcHJpbnRfaW5zbl9hcm0gKHBjLCBpbmZvLCBnaXZlbik7CisgICAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FybS1vcGMuaCBiL29wY29kZXMvYXJtLW9wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTI5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2FybS1vcGMuaApAQCAtMCwwICsxLDI4MSBAQAorLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJNLgorCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCitzdHJ1Y3QgYXJtX29wY29kZSB7CisgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWFzazsJLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KKyAgICBjaGFyICphc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLworfTsKKworc3RydWN0IHRodW1iX29wY29kZQoreworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLworICAgIGNoYXIgKiBhc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLworfTsKKworLyogZm9ybWF0IG9mIHRoZSBhc3NlbWJsZXIgc3RyaW5nIDoKKyAgIAorICAgJSUJCQklCisgICAlPGJpdGZpZWxkPmQJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBkZWNpbWFsCisgICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKKyAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCisgICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhCisJCQlmbG9hdGluZyBwb2ludCByZWdpc3RlcgorICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCisgICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KKyAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgorICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCisgICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKKyAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KKyAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgorICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1CisgICAldAkJCXByaW50ICd0JyBpZmYgYml0IDIxIHNldCBhbmQgYml0IDI0IGNsZWFyCisgICAlaCAgICAgICAgICAgICAgICAgICBwcmludCAnaCcgaWZmIGJpdCA1IHNldCwgZWxzZSBwcmludCAnYicKKyAgICVvCQkJcHJpbnQgb3BlcmFuZDIgKGltbWVkaWF0ZSBvciByZWdpc3RlciArIHNoaWZ0KQorICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCisgICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KKyAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCisgICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgorICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCisgICAlQwkJCXByaW50IHRoZSBQU1Igc3ViIHR5cGUuCisgICAlRgkJCXByaW50IHRoZSBDT1VOVCBmaWVsZCBvZiBhIExGTS9TRk0gaW5zdHJ1Y3Rpb24uCitUaHVtYiBzcGVjaWZpYyBmb3JtYXQgb3B0aW9uczoKKyAgICVEICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIChiaXRzIDAuLjIgYXMgaGlnaCBudW1iZXIgaWYgYml0IDcgc2V0KQorICAgJVMgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMy4uNSBhcyBoaWdoIG51bWJlciBpZiBiaXQgNiBzZXQpCisgICAlPGJpdGZpZWxkPkkgICAgICAgICBwcmludCBiaXRmaWVsZCBhcyBhIHNpZ25lZCBkZWNpbWFsCisgICAJCQkJKHRvcCBiaXQgb2YgcmFuZ2UgYmVpbmcgdGhlIHNpZ24gYml0KQorICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzaworICAgJU4gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBMUikKKyAgICVPICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggUEMpCisgICAlVCAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgOC0xMSkKKyAgICU8Yml0ZmllbGQ+QiAgICAgICAgIHByaW50IFRodW1iIGJyYW5jaCBkZXN0aW5hdGlvbiAoc2lnbmVkIGRpc3BsYWNlbWVudCkKKyAgICU8Yml0ZmllbGQ+VyAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgZGVjaW1hbAorICAgJTxiaXRmaWVsZD5IICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogMikgYXMgYSBkZWNpbWFsCisgICAlPGJpdGZpZWxkPmEgICAgICAgICBwcmludCAoYml0ZmllbGQgKiA0KSBhcyBhIHBjLXJlbCBvZmZzZXQgKyBkZWNvZGVkIHN5bWJvbAorKi8KKworLyogTm90ZTogVGhlcmUgaXMgYSBwYXJ0aWFsIG9yZGVyaW5nIGluIHRoaXMgdGFibGUgLSBpdCBtdXN0IGJlIHNlYXJjaGVkIGZyb20KKyAgIHRoZSB0b3AgdG8gb2J0YWluIGEgY29ycmVjdCBtYXRjaC4gKi8KKworc3RhdGljIHN0cnVjdCBhcm1fb3Bjb2RlIGFybV9vcGNvZGVzW10gPSB7CisgICAgLyogQVJNIGluc3RydWN0aW9ucyAqLworICAgIHsweGUxYTAwMDAwLCAweGZmZmZmZmZmLCAibm9wXHRcdFx0KG1vdiByMCxyMCkifSwKKyAgICB7MHgwMTJGRkYxMCwgMHgwZmZmZmZmMCwgImJ4JWNcdCUwLTNyIn0sCisgICAgezB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlYyUyMCdzXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgICAgezB4MDAyMDAwOTAsIDB4MGZlMDAwZjAsICJtbGElYyUyMCdzXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyLCAlMTItMTVyIn0sCisgICAgezB4MDEwMDAwOTAsIDB4MGZiMDBmZjAsICJzd3AlYyUyMidiXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCisgICAgezB4MDA4MDAwOTAsIDB4MGZhMDAwZjAsICIlMjI/c3VtdWxsJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorICAgIHsweDAwYTAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bWxhbCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAgICB7MHgwMDAwMDA5MCwgMHgwZTEwMDA5MCwgInN0ciVjJTYncyVoXHQlMTItMTVyLCAlcyJ9LAorICAgIHsweDAwMTAwMDkwLCAweDBlMTAwMDkwLCAibGRyJWMlNidzJWhcdCUxMi0xNXIsICVzIn0sCisgICAgezB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICAgIHsweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKKyAgICB7MHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgICAgezB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICAgIHsweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKKyAgICB7MHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgICAgezB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICAgIHsweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKKyAgICB7MHgwMTIwZjAwMCwgMHgwZGI2ZjAwMCwgIm1zciVjXHQlMjI/c2Nwc3IlQywgJW8ifSwKKyAgICB7MHgwMTBmMDAwMCwgMHgwZmJmMGZmZiwgIm1ycyVjXHQlMTItMTVyLCAlMjI/c2Nwc3IifSwKKyAgICB7MHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXBcdCUxNi0xOXIsICVvIn0sCisgICAgezB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwXHQlMTYtMTlyLCAlbyJ9LAorICAgIHsweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcFx0JTE2LTE5ciwgJW8ifSwKKyAgICB7MHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXBcdCUxNi0xOXIsICVvIn0sCisgICAgezB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICAgIHsweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAnc1x0JTEyLTE1ciwgJW8ifSwKKyAgICB7MHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgICAgezB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzXHQlMTItMTVyLCAlbyJ9LAorICAgIHsweDA0MDAwMDAwLCAweDBlMTAwMDAwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAorICAgIHsweDA2MDAwMDAwLCAweDBlMTAwZmYwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAorICAgIHsweDA0MDAwMDAwLCAweDBjMTAwMDEwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAorICAgIHsweDA2MDAwMDEwLCAweDBlMDAwMDEwLCAidW5kZWZpbmVkIn0sCisgICAgezB4MDQxMDAwMDAsIDB4MGMxMDAwMDAsICJsZHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCisgICAgezB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCisgICAgezB4MDgxMDAwMDAsIDB4MGUxMDAwMDAsICJsZG0lYyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCisgICAgezB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJTI0J2wlY1x0JWIifSwKKyAgICB7MHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgInN3aSVjXHQlMC0yM3gifSwKKworICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLworICAgIHsweDBlMDAwMTAwLCAweDBmZjA4ZjEwLCAiYWRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlMTAwMTAwLCAweDBmZjA4ZjEwLCAibXVmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlMjAwMTAwLCAweDBmZjA4ZjEwLCAic3VmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlMzAwMTAwLCAweDBmZjA4ZjEwLCAicnNmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlNDAwMTAwLCAweDBmZjA4ZjEwLCAiZHZmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlNTAwMTAwLCAweDBmZjA4ZjEwLCAicmRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlNjAwMTAwLCAweDBmZjA4ZjEwLCAicG93JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlNzAwMTAwLCAweDBmZjA4ZjEwLCAicnB3JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlODAwMTAwLCAweDBmZjA4ZjEwLCAicm1mJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlOTAwMTAwLCAweDBmZjA4ZjEwLCAiZm1sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlYTAwMTAwLCAweDBmZjA4ZjEwLCAiZmR2JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlYjAwMTAwLCAweDBmZjA4ZjEwLCAiZnJkJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlYzAwMTAwLCAweDBmZjA4ZjEwLCAicG9sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlMDA4MTAwLCAweDBmZjA4ZjEwLCAibXZmJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlMTA4MTAwLCAweDBmZjA4ZjEwLCAibW5mJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlMjA4MTAwLCAweDBmZjA4ZjEwLCAiYWJzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlMzA4MTAwLCAweDBmZjA4ZjEwLCAicm5kJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlNDA4MTAwLCAweDBmZjA4ZjEwLCAic3F0JWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlNTA4MTAwLCAweDBmZjA4ZjEwLCAibG9nJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlNjA4MTAwLCAweDBmZjA4ZjEwLCAibGduJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlNzA4MTAwLCAweDBmZjA4ZjEwLCAiZXhwJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlODA4MTAwLCAweDBmZjA4ZjEwLCAic2luJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlOTA4MTAwLCAweDBmZjA4ZjEwLCAiY29zJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlYTA4MTAwLCAweDBmZjA4ZjEwLCAidGFuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlYjA4MTAwLCAweDBmZjA4ZjEwLCAiYXNuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlYzA4MTAwLCAweDBmZjA4ZjEwLCAiYWNzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlZDA4MTAwLCAweDBmZjA4ZjEwLCAiYXRuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlZTA4MTAwLCAweDBmZjA4ZjEwLCAidXJkJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlZjA4MTAwLCAweDBmZjA4ZjEwLCAibnJtJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICAgIHsweDBlMDAwMTEwLCAweDBmZjAwZjFmLCAiZmx0JWMlUCVSXHQlMTYtMThmLCAlMTItMTVyIn0sCisgICAgezB4MGUxMDAxMTAsIDB4MGZmZjBmOTgsICJmaXglYyVSXHQlMTItMTVyLCAlMC0yZiJ9LAorICAgIHsweDBlMjAwMTEwLCAweDBmZmYwZmZmLCAid2ZzJWNcdCUxMi0xNXIifSwKKyAgICB7MHgwZTMwMDExMCwgMHgwZmZmMGZmZiwgInJmcyVjXHQlMTItMTVyIn0sCisgICAgezB4MGU0MDAxMTAsIDB4MGZmZjBmZmYsICJ3ZmMlY1x0JTEyLTE1ciJ9LAorICAgIHsweDBlNTAwMTEwLCAweDBmZmYwZmZmLCAicmZjJWNcdCUxMi0xNXIifSwKKyAgICB7MHgwZTkwZjExMCwgMHgwZmY4ZmZmMCwgImNtZiVjXHQlMTYtMThmLCAlMC0zZiJ9LAorICAgIHsweDBlYjBmMTEwLCAweDBmZjhmZmYwLCAiY25mJWNcdCUxNi0xOGYsICUwLTNmIn0sCisgICAgezB4MGVkMGYxMTAsIDB4MGZmOGZmZjAsICJjbWZlJWNcdCUxNi0xOGYsICUwLTNmIn0sCisgICAgezB4MGVmMGYxMTAsIDB4MGZmOGZmZjAsICJjbmZlJWNcdCUxNi0xOGYsICUwLTNmIn0sCisgICAgezB4MGMwMDAxMDAsIDB4MGUxMDBmMDAsICJzdGYlYyVRXHQlMTItMTRmLCAlQSJ9LAorICAgIHsweDBjMTAwMTAwLCAweDBlMTAwZjAwLCAibGRmJWMlUVx0JTEyLTE0ZiwgJUEifSwKKyAgICB7MHgwYzAwMDIwMCwgMHgwZTEwMGYwMCwgInNmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKKyAgICB7MHgwYzEwMDIwMCwgMHgwZTEwMGYwMCwgImxmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKKworICAgIC8qIEdlbmVyaWMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCisgICAgezB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlY1x0JTgtMTFkLCAlMjAtMjNkLCBjciUxMi0xNWQsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAorICAgIHsweDBlMTAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWNcdCU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCisgICAgezB4MGUwMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlY1x0JTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKKyAgICB7MHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyJ2xcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAorICAgIHsweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjInbFx0JTgtMTFkLCBjciUxMi0xNWQsICVBIn0sCisgICAgLyogdGhlIHJlc3QgKi8KKyAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgifSwKKyAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0KK307CisKKyNkZWZpbmUgQkRJU1AoeCkgKCgoKHgpICYgMHhmZmZmZmYpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDApIC8qIDI2IGJpdCAqLworCitzdGF0aWMgc3RydWN0IHRodW1iX29wY29kZSB0aHVtYl9vcGNvZGVzW10gPQoreworICAvKiBUaHVtYiBpbnN0cnVjdGlvbnMgKi8KKyAgezB4NDZDMCwgMHhGRkZGLCAibm9wXHRcdFx0KG1vdiByOCxyOCkifSwgLyogZm9ybWF0IDUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCB1cGRhdGUgdGhlIFBTUiAqLworICB7MHgxQzAwLCAweEZGQzAsICJtb3ZcdCUwLTJyLCAlMy01clx0XHQoYWRkICUwLTJyLCAlMy01ciwgIyU2LThkKSJ9LAorICAvKiBmb3JtYXQgNCAqLworICB7MHg0MDAwLCAweEZGQzAsICJhbmRcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MDQwLCAweEZGQzAsICJlb3JcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MDgwLCAweEZGQzAsICJsc2xcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MEMwLCAweEZGQzAsICJsc3JcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MTAwLCAweEZGQzAsICJhc3JcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MTQwLCAweEZGQzAsICJhZGNcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MTgwLCAweEZGQzAsICJzYmNcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MUMwLCAweEZGQzAsICJyb3JcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MjAwLCAweEZGQzAsICJ0c3RcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MjQwLCAweEZGQzAsICJuZWdcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MjgwLCAweEZGQzAsICJjbXBcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MkMwLCAweEZGQzAsICJjbW5cdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MzAwLCAweEZGQzAsICJvcnJcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MzQwLCAweEZGQzAsICJtdWxcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0MzgwLCAweEZGQzAsICJiaWNcdCUwLTJyLCAlMy01ciJ9LAorICB7MHg0M0MwLCAweEZGQzAsICJtdm5cdCUwLTJyLCAlMy01ciJ9LAorICAvKiBmb3JtYXQgMTMgKi8KKyAgezB4QjAwMCwgMHhGRjgwLCAiYWRkXHRzcCwgIyUwLTZXIn0sCisgIHsweEIwODAsIDB4RkY4MCwgInN1Ylx0c3AsICMlMC02VyJ9LAorICAvKiBmb3JtYXQgNSAqLworICB7MHg0NzAwLCAweEZGODAsICJieFx0JVMifSwKKyAgezB4NDQwMCwgMHhGRjAwLCAiYWRkXHQlRCwgJVMifSwKKyAgezB4NDUwMCwgMHhGRjAwLCAiY21wXHQlRCwgJVMifSwKKyAgezB4NDYwMCwgMHhGRjAwLCAibW92XHQlRCwgJVMifSwKKyAgLyogZm9ybWF0IDE0ICovCisgIHsweEI0MDAsIDB4RkUwMCwgInB1c2hcdCVOIn0sCisgIHsweEJDMDAsIDB4RkUwMCwgInBvcFx0JU8ifSwKKyAgLyogZm9ybWF0IDIgKi8KKyAgezB4MTgwMCwgMHhGRTAwLCAiYWRkXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCisgIHsweDFBMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAlNi04ciJ9LAorICB7MHgxQzAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCisgIHsweDFFMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKKyAgLyogZm9ybWF0IDggKi8KKyAgezB4NTIwMCwgMHhGRTAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCisgIHsweDVBMDAsIDB4RkUwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAorICB7MHg1NjAwLCAweEY2MDAsICJsZHMlMTE/aGJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAorICAvKiBmb3JtYXQgNyAqLworICB7MHg1MDAwLCAweEZBMDAsICJzdHIlMTAnYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCisgIHsweDU4MDAsIDB4RkEwMCwgImxkciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKKyAgLyogZm9ybWF0IDEgKi8KKyAgezB4MDAwMCwgMHhGODAwLCAibHNsXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKKyAgezB4MDgwMCwgMHhGODAwLCAibHNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKKyAgezB4MTAwMCwgMHhGODAwLCAiYXNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKKyAgLyogZm9ybWF0IDMgKi8KKyAgezB4MjAwMCwgMHhGODAwLCAibW92XHQlOC0xMHIsICMlMC03ZCJ9LAorICB7MHgyODAwLCAweEY4MDAsICJjbXBcdCU4LTEwciwgIyUwLTdkIn0sCisgIHsweDMwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCAjJTAtN2QifSwKKyAgezB4MzgwMCwgMHhGODAwLCAic3ViXHQlOC0xMHIsICMlMC03ZCJ9LAorICAvKiBmb3JtYXQgNiAqLworICB7MHg0ODAwLCAweEY4MDAsICJsZHJcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sICAvKiBUT0RPOiBEaXNhc3NlbWJsZSBQQyByZWxhdGl2ZSAiTERSIHJELD08c3ltYm9saWM+IiAqLworICAvKiBmb3JtYXQgOSAqLworICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCisgIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKKyAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKKyAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKKyAgLyogZm9ybWF0IDEwICovCisgIHsweDgwMDAsIDB4RjgwMCwgInN0cmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCisgIHsweDg4MDAsIDB4RjgwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCisgIC8qIGZvcm1hdCAxMSAqLworICB7MHg5MDAwLCAweEY4MDAsICJzdHJcdCU4LTEwciwgW3NwLCAjJTAtN1ddIn0sCisgIHsweDk4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKKyAgLyogZm9ybWF0IDEyICovCisgIHsweEEwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCBwYywgIyUwLTdXXHQoYWRyICU4LTEwciwlMC03YSkifSwKKyAgezB4QTgwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHNwLCAjJTAtN1cifSwKKyAgLyogZm9ybWF0IDE1ICovCisgIHsweEMwMDAsIDB4RjgwMCwgInN0bWlhXHQlOC0xMHIhLCVNIn0sCisgIHsweEM4MDAsIDB4RjgwMCwgImxkbWlhXHQlOC0xMHIhLCVNIn0sCisgIC8qIGZvcm1hdCAxOCAqLworICB7MHhFMDAwLCAweEY4MDAsICJiXHQlMC0xMEIifSwKKyAgezB4RTgwMCwgMHhGODAwLCAidW5kZWZpbmVkIn0sCisgIC8qIGZvcm1hdCAxOSAqLworICB7MHhGMDAwLCAweEY4MDAsICIifSwgLyogc3BlY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGluIGRpc2Fzc2VtYmxlciAqLworICB7MHhGODAwLCAweEY4MDAsICJzZWNvbmQgaGFsZiBvZiBCTCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKKyAgLyogZm9ybWF0IDE2ICovCisgIHsweEQwMDAsIDB4RkYwMCwgImJlcVx0JTAtN0IifSwKKyAgezB4RDEwMCwgMHhGRjAwLCAiYm5lXHQlMC03QiJ9LAorICB7MHhEMjAwLCAweEZGMDAsICJiY3NcdCUwLTdCIn0sCisgIHsweEQzMDAsIDB4RkYwMCwgImJjY1x0JTAtN0IifSwKKyAgezB4RDQwMCwgMHhGRjAwLCAiYm1pXHQlMC03QiJ9LAorICB7MHhENTAwLCAweEZGMDAsICJicGxcdCUwLTdCIn0sCisgIHsweEQ2MDAsIDB4RkYwMCwgImJ2c1x0JTAtN0IifSwKKyAgezB4RDcwMCwgMHhGRjAwLCAiYnZjXHQlMC03QiJ9LAorICB7MHhEODAwLCAweEZGMDAsICJiaGlcdCUwLTdCIn0sCisgIHsweEQ5MDAsIDB4RkYwMCwgImJsc1x0JTAtN0IifSwKKyAgezB4REEwMCwgMHhGRjAwLCAiYmdlXHQlMC03QiJ9LAorICB7MHhEQjAwLCAweEZGMDAsICJibHRcdCUwLTdCIn0sCisgIHsweERDMDAsIDB4RkYwMCwgImJndFx0JTAtN0IifSwKKyAgezB4REQwMCwgMHhGRjAwLCAiYmxlXHQlMC03QiJ9LAorICAvKiBmb3JtYXQgMTcgKi8KKyAgezB4REUwMCwgMHhGRjAwLCAidW5kZWZpbmVkIn0sCisgIHsweERGMDAsIDB4RkYwMCwgInN3aVx0JTAtN2QifSwKKyAgLyogZm9ybWF0IDkgKi8KKyAgezB4NjAwMCwgMHhGODAwLCAic3RyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAorICB7MHg2ODAwLCAweEY4MDAsICJsZHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCisgIHsweDcwMDAsIDB4RjgwMCwgInN0cmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCisgIHsweDc4MDAsIDB4RjgwMCwgImxkcmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCisgIC8qIHRoZSByZXN0ICovCisgIHsweDAwMDAsIDB4MDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKKyAgezB4MDAwMCwgMHgwMDAwLCAwfQorfTsKKworI2RlZmluZSBCRElTUDIzKHgpICgoKCgoKHgpICYgMHgwN2ZmKSA8PCAxMSkgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE2KSkgXAorICAgICAgICAgICAgICAgICAgICAgXiAweDIwMDAwMCkgLSAweDIwMDAwMCkgLyogMjNiaXQgKi8KKwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jIGIvb3Bjb2Rlcy9jZ2VuLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDY5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2NnZW4tYXNtLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qIENHRU4gZ2VuZXJpYyBhc3NlbWJsZXIgc3VwcG9ydCBjb2RlLgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKy8qIFNldCB0aGUgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGNhbGxiYWNrLiAgKi8KKwordm9pZAorY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbiAoY2QsIGZuKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gZm47Cit7CisgIGNkLT5wYXJzZV9vcGVyYW5kX2ZuID0gZm47Cit9CisKKy8qIENhbGxlZCB3aGVuZXZlciBzdGFydGluZyB0byBwYXJzZSBhbiBpbnNuLiAgKi8KKwordm9pZAorY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICAvKiBUaGlzIHRlbGxzIHRoZSBjYWxsYmFjayB0byByZS1pbml0aWFsaXplLiAgKi8KKyAgKHZvaWQpICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQorICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOSVQsIE5VTEwsIDAsIDAsIE5VTEwsIE5VTEwpOworfQorCisvKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KKworICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBJTlNOUy4KKyAgIEVOVFNJWkUgaXMgc2l6ZW9mIChDR0VOX0lCQVNFKSBmb3IgdGhlIHRhcmdldC4KKyAgID8/PyBObyBsb25nZXIgdXNlZCBidXQgbGVhdmUgaW4gZm9yIG5vdy4KKyAgIEhUQUJMRSBwb2ludHMgdG8gdGhlIGhhc2ggdGFibGUuCisgICBIRU5UQlVGIGlzIGEgcG9pbnRlciB0byBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyIG9mIGhhc2ggZW50cmllcy4KKyAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IHRvIHVzZS4KKworICAgVGhlIHRhYmxlIGlzIHNjYW5uZWQgYmFja3dhcmRzIGFzIGFkZGl0aW9ucyBhcmUgbWFkZSB0byB0aGUgZnJvbnQgb2YgdGhlCisgICBsaXN0IGFuZCB3ZSB3YW50IGVhcmxpZXIgb25lcyB0byBiZSBwcmVmZXJlZC4gICovCisKK3N0YXRpYyBDR0VOX0lOU05fTElTVCAqCitoYXNoX2luc25fYXJyYXkgKGNkLCBpbnNucywgY291bnQsIGVudHNpemUsIGh0YWJsZSwgaGVudGJ1ZikKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuczsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgZW50c2l6ZTsKKyAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7CisgICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGhhc2g7CisgICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSAmaW5zbnNbaV07CisKKyAgICAgIGlmICghICgqIGNkLT5hc21faGFzaF9wKSAoaW5zbikpCisJY29udGludWU7CisgICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7CisgICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOworICAgICAgaGVudGJ1Zi0+aW5zbiA9IGluc247CisgICAgICBodGFibGVbaGFzaF0gPSBoZW50YnVmOworICAgIH0KKworICByZXR1cm4gaGVudGJ1ZjsKK30KKworLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCisgICBUaGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBoYXNoX2luc25fYXJyYXkgZXhjZXB0IHRoZSBpbnNucyBhcmUKKyAgIGluIGEgbGlzdC4gICovCisKK3N0YXRpYyBDR0VOX0lOU05fTElTVCAqCitoYXNoX2luc25fbGlzdCAoY2QsIGluc25zLCBodGFibGUsIGhlbnRidWYpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuczsKKyAgICAgQ0dFTl9JTlNOX0xJU1QgKipodGFibGU7CisgICAgIENHRU5fSU5TTl9MSVNUICpoZW50YnVmOworeworICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7CisKKyAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBoYXNoOworCisgICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKKwljb250aW51ZTsKKyAgICAgIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChDR0VOX0lOU05fTU5FTU9OSUMgKGlsaXN0LT5pbnNuKSk7CisgICAgICBoZW50YnVmLT5uZXh0ID0gaHRhYmxlW2hhc2hdOworICAgICAgaGVudGJ1Zi0+aW5zbiA9IGlsaXN0LT5pbnNuOworICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKKyAgICB9CisKKyAgcmV0dXJuIGhlbnRidWY7Cit9CisKKy8qIEJ1aWxkIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitidWlsZF9hc21faGFzaF90YWJsZSAoY2QpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7Cit7CisgIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7CisgIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICZjZC0+aW5zbl90YWJsZTsKKyAgQ0dFTl9JTlNOX1RBQkxFICptYWNyb19pbnNuX3RhYmxlID0gJmNkLT5tYWNyb19pbnNuX3RhYmxlOworICB1bnNpZ25lZCBpbnQgaGFzaF9zaXplID0gY2QtPmFzbV9oYXNoX3NpemU7CisgIENHRU5fSU5TTl9MSVNUICpoYXNoX2VudHJ5X2J1ZjsKKyAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKKyAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7CisKKyAgLyogVGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgorICAgICB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGhhc2ggbGlzdHMuICAqLworCisgIGFzbV9oYXNoX3RhYmxlID0gKENHRU5fSU5TTl9MSVNUICoqKQorICAgIHhtYWxsb2MgKGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOworICBtZW1zZXQgKGFzbV9oYXNoX3RhYmxlLCAwLCBoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKKyAgYXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGhhc2hfZW50cnlfYnVmID0gKENHRU5fSU5TTl9MSVNUICopCisgICAgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUKSk7CisKKyAgLyogQWRkIGNvbXBpbGVkIGluIGluc25zLgorICAgICBEb24ndCBpbmNsdWRlIHRoZSBmaXJzdCBvbmUgYXMgaXQgaXMgYSByZXNlcnZlZCBlbnRyeS4gICovCisgIC8qID8/PyBJdCB3YXMgdGhlIGVuZCBvZiBhbGwgaGFzaCBjaGFpbnMsIGFuZCBhbHNvIHRoZSBzcGVjaWFsCisgICAgICJpbnZhbGlkIGluc24iIG1hcmtlci4gIE1heSBiZSBhYmxlIHRvIGRvIGl0IGRpZmZlcmVudGx5IG5vdy4gICovCisKKyAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLAorCQkJCSAgICBpbnNuX3RhYmxlLT5pbml0X2VudHJpZXMgKyAxLAorCQkJCSAgICBpbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzIC0gMSwKKwkJCQkgICAgaW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKKwkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKKworICAvKiBBZGQgY29tcGlsZWQgaW4gbWFjcm8taW5zbnMuICAqLworCisgIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwgbWFjcm9faW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzLAorCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzLAorCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5lbnRyeV9zaXplLAorCQkJCSAgICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOworCisgIC8qIEFkZCBydW50aW1lIGFkZGVkIGluc25zLgorICAgICBMYXRlciBhZGRlZCBpbnNucyB3aWxsIGJlIHByZWZlcmVkIG92ZXIgZWFybGllciBvbmVzLiAgKi8KKworICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9saXN0IChjZCwgaW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCisJCQkJICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKKworICAvKiBBZGQgcnVudGltZSBhZGRlZCBtYWNyby1pbnNucy4gICovCisKKyAgaGFzaF9pbnNuX2xpc3QgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5uZXdfZW50cmllcywKKwkJICBhc21faGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOworCisgIGNkLT5hc21faGFzaF90YWJsZSA9IGFzbV9oYXNoX3RhYmxlOworICBjZC0+YXNtX2hhc2hfdGFibGVfZW50cmllcyA9IGFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Cit9CisKKy8qIFJldHVybiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2ggbGlzdCBmb3IgSU5TTi4gICovCisKK0NHRU5fSU5TTl9MSVNUICoKK2NnZW5fYXNtX2xvb2t1cF9pbnNuIChjZCwgaW5zbikKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgY2hhciAqaW5zbjsKK3sKKyAgdW5zaWduZWQgaW50IGhhc2g7CisKKyAgaWYgKGNkLT5hc21faGFzaF90YWJsZSA9PSBOVUxMKQorICAgIGJ1aWxkX2FzbV9oYXNoX3RhYmxlIChjZCk7CisKKyAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKGluc24pOworICByZXR1cm4gY2QtPmFzbV9oYXNoX3RhYmxlW2hhc2hdOworfQorDAorLyogS2V5d29yZCBwYXJzZXIuCisgICBUaGUgcmVzdWx0IGlzIE5VTEwgdXBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIG1lc3NhZ2UuCisgICBJZiBzdWNjZXNzZnVsLCAqU1RSUCBpcyB1cGRhdGVkIHRvIHBvaW50IHBhc3NlZCB0aGUga2V5d29yZC4KKworICAgPz8/IEF0IHByZXNlbnQgd2UgaGF2ZSBhIHN0YXRpYyBub3Rpb24gb2YgaG93IHRvIHBpY2sgb3V0IGEga2V5d29yZC4KKyAgIExhdGVyIHdlIGNhbiBhbGxvdyBhIHRhcmdldCB0byBjdXN0b21pemUgdGhpcyBpZiBuZWNlc3NhcnkgW3NheSBieQorICAgcmVjb3JkaW5nIHNvbWV0aGluZyBpbiB0aGUga2V5d29yZCB0YWJsZV0uICAqLworCitjb25zdCBjaGFyICoKK2NnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsIGtleXdvcmRfdGFibGUsIHZhbHVlcCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgY2hhciAqKnN0cnA7CisgICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKKyAgICAgbG9uZyAqdmFsdWVwOworeworICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOworICBjaGFyIGJ1ZlsyNTZdOworICBjb25zdCBjaGFyICpwLCpzdGFydDsKKworICBwID0gc3RhcnQgPSAqc3RycDsKKworICAvKiBBbGxvdyBhbnkgZmlyc3QgY2hhcmFjdGVyLgorICAgICBOb3RlIHRoYXQgdGhpcyBhbGxvd3MgcmVjb2duaXppbmcgIixhIiBmb3IgdGhlIGFubnVsIGZsYWcgaW4gc3BhcmMKKyAgICAgZXZlbiB0aG91Z2ggIiwiIGlzIHN1YnNlcXVlbnRseSBub3QgYSB2YWxpZCBrZXl3b3JkIGNoYXIuICAqLworICBpZiAoKnApCisgICAgKytwOworCisgIC8qIE5vdyBhbGxvdyBsZXR0ZXJzLCBkaWdpdHMsIGFuZCBfLiAgKi8KKyAgd2hpbGUgKCgocCAtIHN0YXJ0KSA8IChpbnQpIHNpemVvZiAoYnVmKSkKKwkgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJ18nKSkKKyAgICArK3A7CisKKyAgaWYgKHAgLSBzdGFydCA+PSAoaW50KSBzaXplb2YgKGJ1ZikpCisgICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiKTsKKworICBtZW1jcHkgKGJ1Ziwgc3RhcnQsIHAgLSBzdGFydCk7CisgIGJ1ZltwIC0gc3RhcnRdID0gMDsKKworICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfbmFtZSAoa2V5d29yZF90YWJsZSwgYnVmKTsKKworICBpZiAoa2UgIT0gTlVMTCkKKyAgICB7CisgICAgICAqdmFsdWVwID0ga2UtPnZhbHVlOworICAgICAgLyogRG9uJ3QgYWR2YW5jZSBwb2ludGVyIGlmIHdlIHJlY29nbml6ZWQgdGhlIG51bGwga2V5d29yZC4gICovCisgICAgICBpZiAoa2UtPm5hbWVbMF0gIT0gMCkKKwkqc3RycCA9IHA7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuICJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIjsKK30KKworLyogUGFyc2UgYSBzbWFsbCBzaWduZWQgaW50ZWdlciBwYXJzZXIuCisgICA/Pz8gVkFMVUVQIGlzIG5vdCBhIGJmZF92bWEgKiBvbiBwdXJwb3NlLCB0aG91Z2ggdGhpcyBpcyBjb25mdXNpbmcuCisgICBOb3RlIHRoYXQgaWYgdGhlIGNhbGxlciBleHBlY3RzIGEgYmZkX3ZtYSByZXN1bHQsIGl0IHNob3VsZCBjYWxsCisgICBjZ2VuX3BhcnNlX2FkZHJlc3MuICAqLworCitjb25zdCBjaGFyICoKK2NnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgbG9uZyAqdmFsdWVwOworeworICBiZmRfdm1hIHZhbHVlOworICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OworICBjb25zdCBjaGFyICplcnJtc2c7CisKKyAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCisgICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCisgICAgICZyZXN1bHQsICZ2YWx1ZSk7CisgIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KKyAgaWYgKCFlcnJtc2cpCisgICAgKnZhbHVlcCA9IHZhbHVlOworICByZXR1cm4gZXJybXNnOworfQorCisvKiBQYXJzZSBhIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgcGFyc2VyLgorICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgorICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAorICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KKworY29uc3QgY2hhciAqCitjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOworeworICBiZmRfdm1hIHZhbHVlOworICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0OworICBjb25zdCBjaGFyICplcnJtc2c7CisKKyAgZXJybXNnID0gKCogY2QtPnBhcnNlX29wZXJhbmRfZm4pCisgICAgKGNkLCBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX05PTkUsCisgICAgICZyZXN1bHQsICZ2YWx1ZSk7CisgIC8qIEZJWE1FOiBFeGFtaW5lIGByZXN1bHQnLiAgKi8KKyAgaWYgKCFlcnJtc2cpCisgICAgKnZhbHVlcCA9IHZhbHVlOworICByZXR1cm4gZXJybXNnOworfQorCisvKiBBZGRyZXNzIHBhcnNlci4gICovCisKK2NvbnN0IGNoYXIgKgorY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgb3BpbmZvLCByZXN1bHRwLCB2YWx1ZXApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgaW50IG9waW5mbzsKKyAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICpyZXN1bHRwOworICAgICBiZmRfdm1hICp2YWx1ZXA7Cit7CisgIGJmZF92bWEgdmFsdWU7CisgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKKyAgY29uc3QgY2hhciAqZXJybXNnOworCisgIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQorICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0FERFJFU1MsIHN0cnAsIG9waW5kZXgsIG9waW5mbywKKyAgICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOworICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCisgIGlmICghZXJybXNnKQorICAgIHsKKyAgICAgIGlmIChyZXN1bHRwICE9IE5VTEwpCisJKnJlc3VsdHAgPSByZXN1bHRfdHlwZTsKKyAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICB9CisgIHJldHVybiBlcnJtc2c7Cit9CisMCisvKiBTaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuICAqLworCitjb25zdCBjaGFyICoKK2NnZW5fdmFsaWRhdGVfc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKKyAgICAgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Cit7CisgIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKKworICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKKwkJICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKKyAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBVbnNpZ25lZCBpbnRlZ2VyIHZhbGlkYXRpb24gcm91dGluZS4KKyAgIFN1cHBseWluZyBgbWluJyBoZXJlIG1heSBzZWVtIHVubmVjZXNzYXJ5LCBidXQgd2UgYWxzbyB3YW50IHRvIGhhbmRsZQorICAgY2FzZXMgd2hlcmUgbWluICE9IDAgKGFuZCBtYXggPiBMT05HX01BWCkuICAqLworCitjb25zdCBjaGFyICoKK2NnZW5fdmFsaWRhdGVfdW5zaWduZWRfaW50ZWdlciAodmFsdWUsIG1pbiwgbWF4KQorICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtaW4sIG1heDsKK3sKKyAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KQorICAgIHsKKyAgICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOworCisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgc3ByaW50ZiAoYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIpLAorCSAgICAgICB2YWx1ZSwgbWluLCBtYXgpOworICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tZGlzLmMgYi9vcGNvZGVzL2NnZW4tZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiMWNkOQotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvY2dlbi1kaXMuYwpAQCAtMCwwICsxLDIyNiBAQAorLyogQ0dFTiBnZW5lcmljIGRpc2Fzc2VtYmxlciBzdXBwb3J0IGNvZGUuCisKKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCisKKy8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfZGlzX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgorCisgICBDT1VOVCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIElOU05TLgorICAgRU5UU0laRSBpcyBzaXplb2YgKENHRU5fSUJBU0UpIGZvciB0aGUgdGFyZ2V0LgorICAgPz8/IE5vIGxvbmdlciB1c2VkIGJ1dCBsZWF2ZSBpbiBmb3Igbm93LgorICAgSFRBQkxFIHBvaW50cyB0byB0aGUgaGFzaCB0YWJsZS4KKyAgIEhFTlRCVUYgaXMgYSBwb2ludGVyIHRvIHN1ZmZpY2llbnRseSBsYXJnZSBidWZmZXIgb2YgaGFzaCBlbnRyaWVzLgorICAgVGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZW50cnkgdG8gdXNlLgorCisgICBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgYWRkaXRpb25zIGFyZSBtYWRlIHRvIHRoZSBmcm9udCBvZiB0aGUKKyAgIGxpc3QgYW5kIHdlIHdhbnQgZWFybGllciBvbmVzIHRvIGJlIHByZWZlcmVkLiAgKi8KKworc3RhdGljIENHRU5fSU5TTl9MSVNUICoKK2hhc2hfaW5zbl9hcnJheSAoY2QsIGluc25zLCBjb3VudCwgZW50c2l6ZSwgaHRhYmxlLCBoZW50YnVmKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuczsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgZW50c2l6ZTsKKyAgICAgQ0dFTl9JTlNOX0xJU1QgKiogaHRhYmxlOworICAgICBDR0VOX0lOU05fTElTVCAqIGhlbnRidWY7Cit7CisgIGludCBiaWdfcCA9IENHRU5fQ1BVX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gY291bnQgLSAxOyBpID49IDA7IC0taSwgKytoZW50YnVmKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBoYXNoOworICAgICAgY2hhciBidWYgWzRdOworICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9ICZpbnNuc1tpXTsKKworICAgICAgaWYgKCEgKCogY2QtPmRpc19oYXNoX3ApIChpbnNuKSkKKwljb250aW51ZTsKKworICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSB0YXJnZXQgdXNlcyB0aGUgYnVmZmVyIG9yIHRoZSBiYXNlIGluc24KKwkgdG8gaGFzaCBvbiwgc28gc2V0IGJvdGggdXAuICAqLworCisgICAgICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKKyAgICAgIHN3aXRjaCAoQ0dFTl9JTlNOX01BU0tfQklUU0laRSAoaW5zbikpCisJeworCWNhc2UgODoKKwkgIGJ1ZlswXSA9IHZhbHVlOworCSAgYnJlYWs7CisJY2FzZSAxNjoKKwkgIGlmIChiaWdfcCkKKwkgICAgYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOworCSAgZWxzZQorCSAgICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7CisJICBicmVhazsKKwljYXNlIDMyOgorCSAgaWYgKGJpZ19wKQorCSAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7CisJICBlbHNlCisJICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKKyAgICAgIGhlbnRidWYtPm5leHQgPSBodGFibGVbaGFzaF07CisgICAgICBoZW50YnVmLT5pbnNuID0gaW5zbjsKKyAgICAgIGh0YWJsZVtoYXNoXSA9IGhlbnRidWY7CisgICAgfQorCisgIHJldHVybiBoZW50YnVmOworfQorCisvKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIHRvIGFkZCBJTlNOUyB0byB0aGUgaGFzaCB0YWJsZS4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGhhc2hfaW5zbl9hcnJheSBleGNlcHQgdGhlIGluc25zIGFyZQorICAgaW4gYSBsaXN0LiAgKi8KKworc3RhdGljIENHRU5fSU5TTl9MSVNUICoKK2hhc2hfaW5zbl9saXN0IChjZCwgaW5zbnMsIGh0YWJsZSwgaGVudGJ1ZikKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25zOworICAgICBDR0VOX0lOU05fTElTVCAqKmh0YWJsZTsKKyAgICAgQ0dFTl9JTlNOX0xJU1QgKmhlbnRidWY7Cit7CisgIGludCBiaWdfcCA9IENHRU5fQ1BVX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKKyAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OworCisgIGZvciAoaWxpc3QgPSBpbnNuczsgaWxpc3QgIT0gTlVMTDsgaWxpc3QgPSBpbGlzdC0+bmV4dCwgKysgaGVudGJ1ZikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKKyAgICAgIGNoYXIgYnVmWzRdOworICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworICAgICAgaWYgKCEgKCogY2QtPmRpc19oYXNoX3ApIChpbGlzdC0+aW5zbikpCisJY29udGludWU7CisKKyAgICAgIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdGFyZ2V0IHVzZXMgdGhlIGJ1ZmZlciBvciB0aGUgYmFzZSBpbnNuCisJIHRvIGhhc2ggb24sIHNvIHNldCBib3RoIHVwLiAgKi8KKworICAgICAgdmFsdWUgPSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaWxpc3QtPmluc24pOworICAgICAgc3dpdGNoIChDR0VOX0lOU05fTUFTS19CSVRTSVpFIChpbGlzdC0+aW5zbikpCisJeworCWNhc2UgODoKKwkgIGJ1ZlswXSA9IHZhbHVlOworCSAgYnJlYWs7CisJY2FzZSAxNjoKKwkgIGlmIChiaWdfcCkKKwkgICAgYmZkX3B1dGIxNiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOworCSAgZWxzZQorCSAgICBiZmRfcHV0bDE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7CisJICBicmVhazsKKwljYXNlIDMyOgorCSAgaWYgKGJpZ19wKQorCSAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7CisJICBlbHNlCisJICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIGhhc2ggPSAoKiBjZC0+ZGlzX2hhc2gpIChidWYsIHZhbHVlKTsKKyAgICAgIGhlbnRidWYtPm5leHQgPSBodGFibGUgW2hhc2hdOworICAgICAgaGVudGJ1Zi0+aW5zbiA9IGlsaXN0LT5pbnNuOworICAgICAgaHRhYmxlIFtoYXNoXSA9IGhlbnRidWY7CisgICAgfQorCisgIHJldHVybiBoZW50YnVmOworfQorCisvKiBCdWlsZCB0aGUgZGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfZGlzX2hhc2hfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBpbnQgY291bnQgPSBjZ2VuX2luc25fY291bnQgKGNkKSArIGNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpOworICBDR0VOX0lOU05fVEFCTEUgKmluc25fdGFibGUgPSAmIGNkLT5pbnNuX3RhYmxlOworICBDR0VOX0lOU05fVEFCTEUgKm1hY3JvX2luc25fdGFibGUgPSAmIGNkLT5tYWNyb19pbnNuX3RhYmxlOworICB1bnNpZ25lZCBpbnQgaGFzaF9zaXplID0gY2QtPmRpc19oYXNoX3NpemU7CisgIENHRU5fSU5TTl9MSVNUICpoYXNoX2VudHJ5X2J1ZjsKKyAgQ0dFTl9JTlNOX0xJU1QgKipkaXNfaGFzaF90YWJsZTsKKyAgQ0dFTl9JTlNOX0xJU1QgKmRpc19oYXNoX3RhYmxlX2VudHJpZXM7CisKKyAgLyogVGhlIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhhc2ggdGFibGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgorICAgICB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIGhhc2ggbGlzdHMuICAqLworCisgIGRpc19oYXNoX3RhYmxlID0gKENHRU5fSU5TTl9MSVNUICoqKQorICAgIHhtYWxsb2MgKGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOworICBtZW1zZXQgKGRpc19oYXNoX3RhYmxlLCAwLCBoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKKyAgZGlzX2hhc2hfdGFibGVfZW50cmllcyA9IGhhc2hfZW50cnlfYnVmID0gKENHRU5fSU5TTl9MSVNUICopCisgICAgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUKSk7CisKKyAgLyogQWRkIGNvbXBpbGVkIGluIGluc25zLgorICAgICBEb24ndCBpbmNsdWRlIHRoZSBmaXJzdCBvbmUgYXMgaXQgaXMgYSByZXNlcnZlZCBlbnRyeS4gICovCisgIC8qID8/PyBJdCB3YXMgdGhlIGVuZCBvZiBhbGwgaGFzaCBjaGFpbnMsIGFuZCBhbHNvIHRoZSBzcGVjaWFsCisgICAgICJpbnZhbGlkIGluc24iIG1hcmtlci4gIE1heSBiZSBhYmxlIHRvIGRvIGl0IGRpZmZlcmVudGx5IG5vdy4gICovCisKKyAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLAorCQkJCSAgICBpbnNuX3RhYmxlLT5pbml0X2VudHJpZXMgKyAxLAorCQkJCSAgICBpbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzIC0gMSwKKwkJCQkgICAgaW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKKwkJCQkgICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKKworICAvKiBBZGQgY29tcGlsZWQgaW4gbWFjcm8taW5zbnMuICAqLworCisgIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwgbWFjcm9faW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzLAorCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5udW1faW5pdF9lbnRyaWVzLAorCQkJCSAgICBtYWNyb19pbnNuX3RhYmxlLT5lbnRyeV9zaXplLAorCQkJCSAgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOworCisgIC8qIEFkZCBydW50aW1lIGFkZGVkIGluc25zLgorICAgICBMYXRlciBhZGRlZCBpbnNucyB3aWxsIGJlIHByZWZlcmVkIG92ZXIgZWFybGllciBvbmVzLiAgKi8KKworICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9saXN0IChjZCwgaW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCisJCQkJICAgZGlzX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKKworICAvKiBBZGQgcnVudGltZSBhZGRlZCBtYWNyby1pbnNucy4gICovCisKKyAgaGFzaF9pbnNuX2xpc3QgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5uZXdfZW50cmllcywKKwkJICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOworCisgIGNkLT5kaXNfaGFzaF90YWJsZSA9IGRpc19oYXNoX3RhYmxlOworICBjZC0+ZGlzX2hhc2hfdGFibGVfZW50cmllcyA9IGRpc19oYXNoX3RhYmxlX2VudHJpZXM7Cit9CisKKy8qIFJldHVybiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2ggbGlzdCBmb3IgSU5TTi4gICovCisKK0NHRU5fSU5TTl9MSVNUICoKK2NnZW5fZGlzX2xvb2t1cF9pbnNuIChjZCwgYnVmLCB2YWx1ZSkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgY2hhciAqIGJ1ZjsKKyAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKK3sKKyAgdW5zaWduZWQgaW50IGhhc2g7CisKKyAgaWYgKGNkLT5kaXNfaGFzaF90YWJsZSA9PSBOVUxMKQorICAgIGJ1aWxkX2Rpc19oYXNoX3RhYmxlIChjZCk7CisKKyAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOworCisgIHJldHVybiBjZC0+ZGlzX2hhc2hfdGFibGVbaGFzaF07Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NnZW4tb3BjLmMgYi9vcGNvZGVzL2NnZW4tb3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4NDBhNgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvY2dlbi1vcGMuYwpAQCAtMCwwICsxLDU5NyBAQAorLyogQ0dFTiBnZW5lcmljIG9wY29kZSBzdXBwb3J0LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX25hbWUKKyAgUEFSQU1TICgoY29uc3QgQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfa2V5d29yZF92YWx1ZQorICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgdm9pZCBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzCisgIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqKSk7CisKKy8qIFJldHVybiBudW1iZXIgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIHRvIHVzZSBmb3IgTiBlbGVtZW50cy4gICovCisjZGVmaW5lIEtFWVdPUkRfSEFTSF9TSVpFKG4pICgobikgPD0gMzEgPyAxNyA6IDMxKQorCisvKiBMb29rIHVwICpOQU1FUCBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KKyAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLworCitjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgorY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lIChrdCwgbmFtZSkKKyAgICAgQ0dFTl9LRVlXT1JEICprdDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKKyAgY29uc3QgY2hhciAqcCwqbjsKKworICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQorICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKKworICBrZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCAwKV07CisKKyAgLyogV2UgZG8gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29ucy4KKyAgICAgSWYgdGhhdCBldmVyIGJlY29tZXMgYSBwcm9ibGVtLCBhZGQgYW4gYXR0cmlidXRlIHRoYXQgZGVub3RlcworICAgICAiZG8gY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbnMiLiAgKi8KKworICB3aGlsZSAoa2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBuID0gbmFtZTsKKyAgICAgIHAgPSBrZS0+bmFtZTsKKworICAgICAgd2hpbGUgKCpwCisJICAgICAmJiAoKnAgPT0gKm4KKwkJIHx8IChpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApCisJCSAgICAgJiYgKHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcCkKKwkJCSA9PSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKm4pKSkpKQorCSsrbiwgKytwOworCisgICAgICBpZiAoISpwICYmICEqbikKKwlyZXR1cm4ga2U7CisKKyAgICAgIGtlID0ga2UtPm5leHRfbmFtZTsKKyAgICB9CisKKyAgaWYgKGt0LT5udWxsX2VudHJ5KQorICAgIHJldHVybiBrdC0+bnVsbF9lbnRyeTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIExvb2sgdXAgVkFMVUUgaW4gdGhlIGtleXdvcmQgdGFibGUgS1QuCisgICBUaGUgcmVzdWx0IGlzIHRoZSBrZXl3b3JkIGVudHJ5IG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KKworY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoKK2NnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGt0LCB2YWx1ZSkKKyAgICAgQ0dFTl9LRVlXT1JEICprdDsKKyAgICAgaW50IHZhbHVlOworeworICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOworCisgIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCisgICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOworCisgIGtlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpXTsKKworICB3aGlsZSAoa2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAodmFsdWUgPT0ga2UtPnZhbHVlKQorCXJldHVybiBrZTsKKyAgICAgIGtlID0ga2UtPm5leHRfdmFsdWU7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBBZGQgYW4gZW50cnkgdG8gYSBrZXl3b3JkIHRhYmxlLiAgKi8KKwordm9pZAorY2dlbl9rZXl3b3JkX2FkZCAoa3QsIGtlKQorICAgICBDR0VOX0tFWVdPUkQgKmt0OworICAgICBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOworeworICB1bnNpZ25lZCBpbnQgaGFzaDsKKworICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQorICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKKworICBoYXNoID0gaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBrZS0+bmFtZSwgMCk7CisgIGtlLT5uZXh0X25hbWUgPSBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdOworICBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7CisKKyAgaGFzaCA9IGhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIGtlLT52YWx1ZSk7CisgIGtlLT5uZXh0X3ZhbHVlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF07CisgIGt0LT52YWx1ZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7CisKKyAgaWYgKGtlLT5uYW1lWzBdID09IDApCisgICAga3QtPm51bGxfZW50cnkgPSBrZTsKK30KKworLyogRklYTUU6IE5lZWQgZnVuY3Rpb24gdG8gcmV0dXJuIGNvdW50IG9mIGtleXdvcmRzLiAgKi8KKworLyogSW5pdGlhbGl6ZSBhIGtleXdvcmQgdGFibGUgc2VhcmNoLgorICAgU1BFQyBpcyBhIHNwZWNpZmljYXRpb24gb2Ygd2hhdCB0byBzZWFyY2ggZm9yLgorICAgQSB2YWx1ZSBvZiBOVUxMIG1lYW5zIHRvIGZpbmQgZXZlcnkga2V5d29yZC4KKyAgIEN1cnJlbnRseSBOVUxMIGlzIHRoZSBvbmx5IGFjY2VwdGFibGUgdmFsdWUgW2Z1cnRoZXIgc3BlY2lmaWNhdGlvbgorICAgZGVmZXJyZWRdLgorICAgVGhlIHJlc3VsdCBpcyBhbiBvcGFxdWUgZGF0YSBpdGVtIHVzZWQgdG8gcmVjb3JkIHRoZSBzZWFyY2ggc3RhdHVzLgorICAgSXQgaXMgcGFzc2VkIHRvIGVhY2ggY2FsbCB0byBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQuICAqLworCitDR0VOX0tFWVdPUkRfU0VBUkNICitjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKGt0LCBzcGVjKQorICAgICBDR0VOX0tFWVdPUkQgKmt0OworICAgICBjb25zdCBjaGFyICpzcGVjOworeworICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaDsKKworICAvKiBGSVhNRTogTmVlZCB0byBzcGVjaWZ5IGZvcm1hdCBvZiBQQVJBTVMuICAqLworICBpZiAoc3BlYyAhPSBOVUxMKQorICAgIGFib3J0ICgpOworCisgIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCisgICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOworCisgIHNlYXJjaC50YWJsZSA9IGt0OworICBzZWFyY2guc3BlYyA9IHNwZWM7CisgIHNlYXJjaC5jdXJyZW50X2hhc2ggPSAwOworICBzZWFyY2guY3VycmVudF9lbnRyeSA9IE5VTEw7CisgIHJldHVybiBzZWFyY2g7Cit9CisKKy8qIFJldHVybiB0aGUgbmV4dCBrZXl3b3JkIHNwZWNpZmllZCBieSBTRUFSQ0guCisgICBUaGUgcmVzdWx0IGlzIHRoZSBuZXh0IGVudHJ5IG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUuICAqLworCitjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgorY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0IChzZWFyY2gpCisgICAgIENHRU5fS0VZV09SRF9TRUFSQ0ggKnNlYXJjaDsKK3sKKyAgLyogSGFzIHNlYXJjaCBmaW5pc2hlZD8gICovCisgIGlmIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA9PSBzZWFyY2gtPnRhYmxlLT5oYXNoX3RhYmxlX3NpemUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogU2VhcmNoIGluIHByb2dyZXNzPyAgKi8KKyAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMCisgICAgICAvKiBBbnl0aGluZyBsZWZ0IG9uIHRoaXMgaGFzaCBjaGFpbj8gICovCisgICAgICAmJiBzZWFyY2gtPmN1cnJlbnRfZW50cnktPm5leHRfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lOworICAgICAgcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKKyAgICB9CisKKyAgLyogTW92ZSB0byBuZXh0IGhhc2ggY2hhaW4gW3VubGVzcyB3ZSBoYXZlbid0IHN0YXJ0ZWQgeWV0XS4gICovCisgIGlmIChzZWFyY2gtPmN1cnJlbnRfZW50cnkgIT0gTlVMTCkKKyAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOworCisgIHdoaWxlIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA8IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKKyAgICB7CisgICAgICBzZWFyY2gtPmN1cnJlbnRfZW50cnkgPSBzZWFyY2gtPnRhYmxlLT5uYW1lX2hhc2hfdGFibGVbc2VhcmNoLT5jdXJyZW50X2hhc2hdOworICAgICAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQorCXJldHVybiBzZWFyY2gtPmN1cnJlbnRfZW50cnk7CisgICAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIE5BTUUuCisgICBJZiBDQVNFX1NFTlNJVElWRV9QIGlzIG5vbi16ZXJvLCByZXR1cm4gYSBjYXNlIHNlbnNpdGl2ZSBoYXNoLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAoraGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCBjYXNlX3NlbnNpdGl2ZV9wKQorICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgY2FzZV9zZW5zaXRpdmVfcDsKK3sKKyAgdW5zaWduZWQgaW50IGhhc2g7CisKKyAgaWYgKGNhc2Vfc2Vuc2l0aXZlX3ApCisgICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKKyAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSAqbmFtZTsKKyAgZWxzZQorICAgIGZvciAoaGFzaCA9IDA7ICpuYW1lOyArK25hbWUpCisgICAgICBoYXNoID0gKGhhc2ggKiA5NykgKyAodW5zaWduZWQgY2hhcikgdG9sb3dlciAoKm5hbWUpOworICByZXR1cm4gaGFzaCAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Cit9CisKKy8qIFJldHVybiBmaXJzdCBlbnRyeSBpbiBoYXNoIGNoYWluIGZvciBWQUxVRS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2hhc2hfa2V5d29yZF92YWx1ZSAoa3QsIHZhbHVlKQorICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OworICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Cit7CisgIHJldHVybiB2YWx1ZSAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Cit9CisKKy8qIEJ1aWxkIGEga2V5d29yZCB0YWJsZSdzIGhhc2ggdGFibGVzLgorICAgV2UgcHJvYmFibHkgbmVlZG4ndCBidWlsZCB0aGUgdmFsdWUgaGFzaCB0YWJsZSBmb3IgdGhlIGFzc2VtYmxlciB3aGVuCisgICB3ZSdyZSB1c2luZyB0aGUgZGlzYXNzZW1ibGVyLCBidXQgd2Uga2VlcCB0aGluZ3Mgc2ltcGxlLiAgKi8KKworc3RhdGljIHZvaWQKK2J1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KQorICAgICBDR0VOX0tFWVdPUkQgKmt0OworeworICBpbnQgaTsKKyAgLyogVXNlIHRoZSBudW1iZXIgb2YgY29tcGlsZWQgaW4gZW50cmllcyBhcyBhbiBlc3RpbWF0ZSBmb3IgdGhlCisgICAgIHR5cGljYWwgc2l6ZWQgdGFibGUgW25vdCB0b28gbWFueSBhZGRlZCBhdCBydW50aW1lXS4gICovCisgIHVuc2lnbmVkIGludCBzaXplID0gS0VZV09SRF9IQVNIX1NJWkUgKGt0LT5udW1faW5pdF9lbnRyaWVzKTsKKworICBrdC0+aGFzaF90YWJsZV9zaXplID0gc2l6ZTsKKyAga3QtPm5hbWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCisgICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKKyAgbWVtc2V0IChrdC0+bmFtZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOworICBrdC0+dmFsdWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCisgICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKKyAgbWVtc2V0IChrdC0+dmFsdWVfaGFzaF90YWJsZSwgMCwgc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKKworICAvKiBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgd2Ugd2FudCBrZXl3b3JkcyBhcHBlYXJpbmcgZWFybGllciB0bworICAgICBiZSBwcmVmZXJlZCBvdmVyIGxhdGVyIG9uZXMuICAqLworICBmb3IgKGkgPSBrdC0+bnVtX2luaXRfZW50cmllcyAtIDE7IGkgPj0gMDsgLS1pKQorICAgIGNnZW5fa2V5d29yZF9hZGQgKGt0LCAma3QtPmluaXRfZW50cmllc1tpXSk7Cit9CisMCisvKiBIYXJkd2FyZSBzdXBwb3J0LiAgKi8KKworLyogTG9va3VwIGEgaGFyZHdhcmUgZWxlbWVudCBieSBpdHMgbmFtZS4KKyAgIFJldHVybnMgTlVMTCBpZiBOQU1FIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgbWFjaC9pc2EuICAqLworCitjb25zdCBDR0VOX0hXX0VOVFJZICoKK2NnZW5faHdfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpbnQgaTsKKyAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7CisKKyAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQorICAgIGlmIChod1tpXSAmJiBzdHJjbXAgKG5hbWUsIGh3W2ldLT5uYW1lKSA9PSAwKQorICAgICAgcmV0dXJuIGh3W2ldOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBudW1iZXIuCisgICBIYXJkd2FyZSBlbGVtZW50cyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKKyAgIGF0IHJ1bnRpbWUsIHRodXMgSFdOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KKyAgIFJldHVybnMgTlVMTCBpZiBIV05VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFjaC4gICovCisKK2NvbnN0IENHRU5fSFdfRU5UUlkgKgorY2dlbl9od19sb29rdXBfYnlfbnVtIChjZCwgaHdudW0pCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGludCBod251bTsKK3sKKyAgaW50IGk7CisgIGNvbnN0IENHRU5fSFdfRU5UUlkgKipodyA9IGNkLT5od190YWJsZS5lbnRyaWVzOworCisgIC8qID8/PyBUaGlzIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQorICAgIGlmIChod1tpXSAmJiBod251bSA9PSBod1tpXS0+dHlwZSkKKyAgICAgIHJldHVybiBod1tpXTsKKworICByZXR1cm4gTlVMTDsKK30KKwwKKy8qIE9wZXJhbmQgc3VwcG9ydC4gICovCisKKy8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBuYW1lLgorICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICBtYWNoL2lzYS4gICovCisKK2NvbnN0IENHRU5fT1BFUkFORCAqCitjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBpbnQgaTsKKyAgY29uc3QgQ0dFTl9PUEVSQU5EICoqb3AgPSBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzOworCisgIGZvciAoaSA9IDA7IGkgPCBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllczsgKytpKQorICAgIGlmIChvcFtpXSAmJiBzdHJjbXAgKG5hbWUsIG9wW2ldLT5uYW1lKSA9PSAwKQorICAgICAgcmV0dXJuIG9wW2ldOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBMb29rdXAgYW4gb3BlcmFuZCBieSBpdHMgbnVtYmVyLgorICAgT3BlcmFuZHMgYXJlIGVudW1lcmF0ZWQsIGhvd2V2ZXIgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFkZCBzb21lCisgICBhdCBydW50aW1lLCB0aHVzIE9QTlVNIGlzIG5vdCBhbiBlbnVtIHR5cGUgYnV0IHJhdGhlciBhbiBpbnQuCisgICBSZXR1cm5zIE5VTEwgaWYgT1BOVU0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICBtYWNoL2lzYS4gICovCisKK2NvbnN0IENHRU5fT1BFUkFORCAqCitjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9wbnVtKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBpbnQgb3BudW07Cit7CisgIHJldHVybiBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzW29wbnVtXTsKK30KKwwKKy8qIEluc3RydWN0aW9uIHN1cHBvcnQuICAqLworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLworCitpbnQKK2NnZW5faW5zbl9jb3VudCAoY2QpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7Cit7CisgIGludCBjb3VudCA9IGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7CisgIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5pbnNuX3RhYmxlLm5ld19lbnRyaWVzOworCisgIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKKyAgICArK2NvdW50OworCisgIHJldHVybiBjb3VudDsKK30KKworLyogUmV0dXJuIG51bWJlciBvZiBtYWNyby1pbnN0cnVjdGlvbnMuCisgICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW50aW1lLiAgKi8KKworaW50CitjZ2VuX21hY3JvX2luc25fY291bnQgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBpbnQgY291bnQgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzOworICBDR0VOX0lOU05fTElTVCAqcnRfaW5zbnMgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5uZXdfZW50cmllczsKKworICBmb3IgKCA7IHJ0X2luc25zICE9IE5VTEw7IHJ0X2luc25zID0gcnRfaW5zbnMtPm5leHQpCisgICAgKytjb3VudDsKKworICByZXR1cm4gY291bnQ7Cit9CisKKy8qIENvdmVyIGZ1bmN0aW9uIHRvIHJlYWQgYW5kIHByb3Blcmx5IGJ5dGVzd2FwIGFuIGluc24gdmFsdWUuICAqLworCitDR0VOX0lOU05fSU5UCitjZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKKworICBzd2l0Y2ggKGxlbmd0aCkKKyAgICB7CisgICAgY2FzZSA4OgorICAgICAgdmFsdWUgPSAqYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQorCXZhbHVlID0gYmZkX2dldGIxNiAoYnVmKTsKKyAgICAgIGVsc2UKKwl2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCisJdmFsdWUgPSBiZmRfZ2V0YjMyIChidWYpOworICAgICAgZWxzZQorCXZhbHVlID0gYmZkX2dldGwzMiAoYnVmKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKiBDb3ZlciBmdW5jdGlvbiB0byBzdG9yZSBhbiBpbnNuIHZhbHVlIHByb3Blcmx5IGJ5dGVzd2FwcGVkLiAgKi8KKwordm9pZAorY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCB2YWx1ZSkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgbGVuZ3RoOworICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOworeworICBzd2l0Y2ggKGxlbmd0aCkKKyAgICB7CisgICAgY2FzZSA4OgorICAgICAgYnVmWzBdID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCisJYmZkX3B1dGIxNiAodmFsdWUsIGJ1Zik7CisgICAgICBlbHNlCisJYmZkX3B1dGwxNiAodmFsdWUsIGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCisJYmZkX3B1dGIzMiAodmFsdWUsIGJ1Zik7CisgICAgICBlbHNlCisJYmZkX3B1dGwzMiAodmFsdWUsIGJ1Zik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorDAorLyogTG9vayB1cCBpbnN0cnVjdGlvbiBJTlNOXypfVkFMVUUgYW5kIGV4dHJhY3QgaXRzIGZpZWxkcy4KKyAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgorICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KKyAgIElOU04sIGlmIG5vbi1udWxsLCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeS4KKyAgIE90aGVyd2lzZSBJTlNOXypfVkFMVUUgaXMgZXhhbWluZWQgdG8gY29tcHV0ZSBpdC4KKyAgIExFTkdUSCBpcyB0aGUgYml0IGxlbmd0aCBvZiBJTlNOXypfVkFMVUUgaWYga25vd24sIG90aGVyd2lzZSAwLgorICAgMCBpcyBvbmx5IHZhbGlkIGlmIGBpbnNuID09IE5VTEwgJiYgISBDR0VOX0lOVF9JTlNOX1AnLgorICAgSWYgSU5TTiAhPSBOVUxMLCBMRU5HVEggbXVzdCBiZSB2YWxpZC4KKyAgIEFMSUFTX1AgaXMgbm9uLXplcm8gaWYgYWxpYXMgaW5zbnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guCisKKyAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuIHRhYmxlIGVudHJ5LCBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbgorICAgd2Fzbid0IHJlY29nbml6ZWQuICAqLworCisvKiA/Pz8gV2lsbCBuZWVkIHRvIGJlIHJldmlzaXRlZCBmb3IgVkxJVyBhcmNoaXRlY3R1cmVzLiAgKi8KKworY29uc3QgQ0dFTl9JTlNOICoKK2NnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwgbGVuZ3RoLCBmaWVsZHMsCisJCSAgYWxpYXNfcCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOworICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLworICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOworICAgICBpbnQgbGVuZ3RoOworICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICBpbnQgYWxpYXNfcDsKK3sKKyAgdW5zaWduZWQgY2hhciAqYnVmOworICBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbjsKKyAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKKyAgQ0dFTl9FWFRSQUNUX0lORk8gKmluZm87CisKKyAgaWYgKGNkLT5pbnRfaW5zbl9wKQorICAgIHsKKyAgICAgIGluZm8gPSBOVUxMOworICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgYWxsb2NhIChjZC0+bWF4X2luc25fYml0c2l6ZSAvIDgpOworICAgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCBpbnNuX2ludF92YWx1ZSk7CisgICAgICBiYXNlX2luc24gPSBpbnNuX2ludF92YWx1ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbmZvID0gJmV4X2luZm87CisgICAgICBleF9pbmZvLmRpc19pbmZvID0gTlVMTDsKKyAgICAgIGV4X2luZm8uaW5zbl9ieXRlcyA9IGluc25fYnl0ZXNfdmFsdWU7CisgICAgICBleF9pbmZvLnZhbGlkID0gLTE7CisgICAgICBidWYgPSBpbnNuX2J5dGVzX3ZhbHVlOworICAgICAgYmFzZV9pbnNuID0gY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoKTsKKyAgICB9CisKKyAgaWYgKCFpbnNuKQorICAgIHsKKyAgICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7CisKKyAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgorCSBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCisKKyAgICAgIGluc25fbGlzdCA9IGNnZW5fZGlzX2xvb2t1cF9pbnNuIChjZCwgYnVmLCBiYXNlX2luc24pOworICAgICAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQorCXsKKwkgIGluc24gPSBpbnNuX2xpc3QtPmluc247CisKKwkgIGlmIChhbGlhc19wCisJICAgICAgLyogRklYTUU6IEVuc3VyZSBBTElBUyBhdHRyaWJ1dGUgYWx3YXlzIGhhcyBzYW1lIGluZGV4LiAgKi8KKwkgICAgICB8fCAhIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQorCSAgICB7CisJICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KKwkgICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlCisJCSBleHRyYWN0IGhhbmRsZXIuICAqLworCSAgICAgIGlmICgoYmFzZV9pbnNuICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCisJCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQorCQl7CisJCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCisJCSAgaW50IGVsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQorCQkgICAgKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOworCQkgIGlmIChlbGVuZ3RoID4gMCkKKwkJICAgIHsKKwkJICAgICAgLyogc2FuaXR5IGNoZWNrICovCisJCSAgICAgIGlmIChsZW5ndGggIT0gMCAmJiBsZW5ndGggIT0gZWxlbmd0aCkKKwkJCWFib3J0ICgpOworCQkgICAgICByZXR1cm4gaW5zbjsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIGluc25fbGlzdCA9IGluc25fbGlzdC0+bmV4dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU2FuaXR5IGNoZWNrOiBjYW4ndCBwYXNzIGFuIGFsaWFzIGluc24gaWYgISBhbGlhc19wLiAgKi8KKyAgICAgIGlmICghIGFsaWFzX3AKKwkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQorCWFib3J0ICgpOworICAgICAgLyogU2FuaXR5IGNoZWNrOiBsZW5ndGggbXVzdCBiZSBjb3JyZWN0LiAgKi8KKyAgICAgIGlmIChsZW5ndGggIT0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKQorCWFib3J0ICgpOworCisgICAgICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KKyAgICAgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCisJKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOworICAgICAgLyogU2FuaXR5IGNoZWNrOiBtdXN0IHN1Y2NlZWQuCisJIENvdWxkIHJlbGF4IHRoaXMgbGF0ZXIgaWYgaXQgZXZlciBwcm92ZXMgdXNlZnVsLiAgKi8KKyAgICAgIGlmIChsZW5ndGggPT0gMCkKKwlhYm9ydCAoKTsKKyAgICAgIHJldHVybiBpbnNuOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogRmlsbCBpbiB0aGUgb3BlcmFuZCBpbnN0YW5jZXMgdXNlZCBieSBJTlNOIHdob3NlIG9wZXJhbmRzIGFyZSBGSUVMRFMuCisgICBJTkRJQ0VTIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBvZiBNQVhfT1BFUkFORF9JTlNUQU5DRVMgaW50cyB0byBiZSBmaWxsZWQKKyAgIGluLiAgKi8KKwordm9pZAorY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGZpZWxkcywgaW5kaWNlcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICBpbnQgKmluZGljZXM7Cit7CisgIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7CisgIGludCBpOworCisgIGlmIChpbnNuLT5vcGluc3QgPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKyAgZm9yIChpID0gMCwgb3BpbnN0ID0gaW5zbi0+b3BpbnN0OyBvcGluc3QtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOyArK2ksICsrb3BpbnN0KQorICAgIHsKKyAgICAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgb3BfdHlwZSA9IG9waW5zdC0+b3BfdHlwZTsKKyAgICAgIGlmIChvcF90eXBlID09IENHRU5fT1BFUkFORF9OSUwpCisJaW5kaWNlc1tpXSA9IG9waW5zdC0+aW5kZXg7CisgICAgICBlbHNlCisJaW5kaWNlc1tpXSA9ICgqY2QtPmdldF9pbnRfb3BlcmFuZCkgKGNkLCBvcF90eXBlLCBmaWVsZHMpOworICAgIH0KK30KKworLyogQ292ZXIgZnVuY3Rpb24gdG8gY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyB3aGVuIGVpdGhlciBJTlNOIG9yIEZJRUxEUworICAgaXNuJ3Qga25vd24uCisgICBUaGUgSU5TTiwgSU5TTl8qX1ZBTFVFLCBhbmQgTEVOR1RIIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCisgICBjZ2VuX2xvb2t1cF9pbnNuIHVuY2hhbmdlZC4KKyAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgorICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KKworICAgVGhlIHJlc3VsdCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeSBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiB3YXNuJ3QKKyAgIHJlY29nbml6ZWQuICAqLworCitjb25zdCBDR0VOX0lOU04gKgorY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKKwkJCSAgICAgICBsZW5ndGgsIGluZGljZXMsIGZpZWxkcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOworICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLworICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOworICAgICBpbnQgbGVuZ3RoOworICAgICBpbnQgKmluZGljZXM7CisgICAgIENHRU5fRklFTERTICpmaWVsZHM7Cit7CisgIC8qIFBhc3Mgbm9uLXplcm8gZm9yIEFMSUFTX1Agb25seSBpZiBJTlNOICE9IE5VTEwuCisgICAgIElmIElOU04gPT0gTlVMTCwgd2Ugd2FudCBhIHJlYWwgaW5zbi4gICovCisgIGluc24gPSBjZ2VuX2xvb2t1cF9pbnNuIChjZCwgaW5zbiwgaW5zbl9pbnRfdmFsdWUsIGluc25fYnl0ZXNfdmFsdWUsCisJCQkgICBsZW5ndGgsIGZpZWxkcywgaW5zbiAhPSBOVUxMKTsKKyAgaWYgKCEgaW5zbikKKyAgICByZXR1cm4gTlVMTDsKKworICBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKTsKKyAgcmV0dXJuIGluc247Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZy5pbiBiL29wY29kZXMvY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGEzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2NvbmZpZy5pbgpAQCAtMCwwICsxLDEzNSBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1ZBTFVFU19ICisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI3VuZGVmIFZFUlNJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlIGIvb3Bjb2Rlcy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzFjZmYxMgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvY29uZmlndXJlCkBAIC0wLDAgKzEsNDc1NCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9bm9dIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtY2dlbi1tYWludFs9ZGlyXSAgICBidWlsZCBjZ2VuIGdlbmVyYXRlZCBmaWxlcyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9ejhrLWRpcy5jCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5NjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTc6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYzNTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjYwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc3MzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKKworI2xpbmUgNzg0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgxNTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgyMDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODI5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg0ODogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg4MDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCisKKyMgV2UgY3VycmVudGx5IG9ubHkgdXNlIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIG5hbWUgb2YgYW55IHNoYXJlZAorIyBsaWJyYXJ5LiAgRm9yIHVzZXIgY29udmVuaWVuY2UsIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUgdmVyc2lvbgorIyBudW1iZXIgdGhhdCBCRkQgaXMgdXNpbmcuCitCRkRfVkVSU0lPTj1gZ3JlcCBJTklUX0FVVE9NQUtFICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmluIHwgc2VkIC1uIC1lICdzL1sgCV0vL2cnIC1lICdzL14uKixcKC4qXCkpLiokL1wxL3AnYAorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkxODogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NzE6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCisgICBmaQorICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KKyAgIGZpCisKKyAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIieWVzIiAxPiY2CitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAyODogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisKK1BBQ0tBR0U9b3Bjb2RlcworCitWRVJTSU9OPSR7QkZEX1ZFUlNJT059CisKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQorZmkKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorRU9GCisKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorRU9GCisKKworCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA3NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYWNsb2NhbCAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFDTE9DQUw9YWNsb2NhbAorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBQ0xPQ0FMPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhY2xvY2FsIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDg3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPQ09ORj1hdXRvY29uZgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMDA6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9NQUtFPWF1dG9tYWtlCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTEzOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChhdXRvaGVhZGVyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT0hFQURFUj1hdXRvaGVhZGVyCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIEFVVE9IRUFERVI9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9oZWFkZXIiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMjY6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIE1BS0VJTkZPPW1ha2VpbmZvCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCisKKworaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KKyAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KK2Vsc2UKKyAgYWNfdG9vbF9wcmVmaXg9CitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiIgJiYgYWNfY3ZfcHJvZ19BUj0iYXIiCitmaQorZmkKK0FSPSIkYWNfY3ZfcHJvZ19BUiIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTgxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjEzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorICBSQU5MSUI9IjoiCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCisgIHA9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Oworbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyopCisgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc2hhcmVkPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitlbHNlCisgIGVuYWJsZV9zaGFyZWQ9bm8KK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKK25vKSBlbmFibGVfc3RhdGljPW5vIDs7CisqKQorICBlbmFibGVfc3RhdGljPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKK25vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisqKQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZWxzZQorICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzE5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKKyAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaQorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNTg6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1CisgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKKyAgY2FzZSAiJGFjX3Byb2ciIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgLyogfCBbQS1aYS16XTpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM4MjogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CitlbHNlCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzg1OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZWxzZQorICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkYWNfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCit0ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorCitlY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQyMTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KK2lmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ251X2xkPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQzNzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgYWNfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKyAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisgICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisgICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgorCWJyZWFrCisgICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCisJYnJlYWsKKyAgICAgIGVsc2UKKwlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAorCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCitmaQorZmkKKworTk09IiRhY19jdl9wYXRoX05NIgorZWNobyAiJGFjX3QiIiROTSIgMT4mNgorCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitlY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0NzU6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorYWNfc3ltY29kZT0nW0JDREVHUlNUXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCithY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJworCisjIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCithY19zeW14ZnJtPSdcMSBcMlwzIFwzJworCisjIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCithY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeCopCisgIGFjX3N5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyopCisgIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopCisgIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICA7OworaXJpeCopCisgIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgYWNfc3ltY29kZT0nW0JEVF0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgoraWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisgIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJworZmkKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KK2ZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KKworICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBhY19waXBlX3dvcmtzPW5vCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKKworICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1Mzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBhY19ubGlzdD1jb25mdGVzdC5ubQorICAKKyAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NDI6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCisKKyAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisgICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgorCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgorICAgICAgZWxzZQorCXJtIC1mICIkYWNfbmxpc3QiVAorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYworCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYworICB7MCwgKGx0X3B0cl90KSAwfQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKKwkgIGFjX3NhdmVfTElCUz0iJExJQlMiCisJICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKKwkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisJICAgIGFjX3BpcGVfd29ya3M9eWVzCisJICBlbHNlCisJICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisJICAgIGNhdCBjb25mdGVzdC5jID4mNQorCSAgZmkKKwkgIExJQlM9IiRhY19zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1CisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICAgIGNhdCBjb25mdGVzdC5jID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgIGVsc2UKKyAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworICAgIGZpCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCisKK2ZpCisKKworYWNfcmVzdWx0PXllcworaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgICBhY19yZXN1bHQ9bm8KK2ZpCitlY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY0MDogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgordm9pZCBubV90ZXN0X2Z1bmMoKXt9CitpbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjUyOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgorICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KKyAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcworICAgIGVsc2UKKyAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1CisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuYyA+JjUKK2ZpCitybSAtcmYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2CitVU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2Nzg6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIHJtIC1mIGNvbmZ0ZXN0ZGF0YQoraWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKK3RoZW4KKyAgcm0gLWYgY29uZnRlc3RkYXRhCisgIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCitlbHNlCisgIGFjX2N2X3Byb2dfTE5fUz1sbgorZmkKK2ZpCitMTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgoraWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCitsaWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgordGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKK3Rlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCit0ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKK3Rlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKK3Rlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgIiRob3N0IiBpbgorKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICcjbGluZSAxNzE0ICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzE1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTMyIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MzY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzQxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBsdF9jdl9jY19uZWVkc19iZWxmPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKKworKi0qLWN5Z3dpbiopCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc3MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgoraWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCisgIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCitmaQorZmkKK0RMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCitpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorICBETExUT09MPSJmYWxzZSIKK2ZpCitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitBUz0iJGFjX2N2X3Byb2dfQVMiCitpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhczsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODcwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCitmaQorZmkKK0FTPSIkYWNfY3ZfcHJvZ19BUyIKK2lmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2Vsc2UKKyAgQVM9ImZhbHNlIgorZmkKK2ZpCisKKworICA7OworCitlc2FjCisKKyMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisgIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAorZWxzZQorICBuZWVkX2xvY2tzPXllcworZmkKKworCitpZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCisgIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgorZmkKKworCisjIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKKworIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KK0NDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAorTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAorRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKKyR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKKyRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCit8fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9CisKKyMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCisKKyMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90CisjIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgorZXhlYyA1Pj4uL2NvbmZpZy5sb2cKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgICAgICAgIDs7CisgIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWMKK2ZpCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OworICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OworICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKK2ZpCisKKworCisKKworaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDQ5OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX01BSU5UQUlORVJfTU9ERT1ubworZmkKKworICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKKyAgCisKK2lmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9CisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKK2Vsc2UKKyAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCisgIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KK2ZpCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICAKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA3MjogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA3NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisjaWZuZGVmIF9fQ1lHV0lOX18KKyNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KKyNlbmRpZgorcmV0dXJuIF9fQ1lHV0lOX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2N5Z3dpbj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY3lnd2luPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2CitDWUdXSU49Cit0ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjEwNTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTEwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gX19NSU5HVzMyX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X21pbmd3MzI9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X21pbmd3MzI9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2CitNSU5HVzMyPQordGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTM2OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgorICBhY19jdl9leGVleHQ9LmV4ZQorZWxzZQorICBybSAtZiBjb25mdGVzdCoKKyAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X2V4ZWV4dD0KKyAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCisgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKKyAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0KgorICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCitmaQorZmkKKworRVhFRVhUPSIiCit0ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgorYWNfZXhlZXh0PSRFWEVFWFQKKworCisjIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE3MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyODU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDIyOTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzMyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNjA6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKworQUxMX0xJTkdVQVM9CitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM5NDogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDA5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDMyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQ5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDc0OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDc5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1MDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjUyMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjU3ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY1MzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNjYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9ICRhY19rdyBmb28oKSB7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY2NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2OTM6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI2OTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjcyNjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzMxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzYxOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjc2NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzczOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc5NDogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDX0FMTE9DQSAxCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODU5OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg2NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4ODk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4OTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkxNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworRU9GCisKKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitkb25lCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTQ0OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk1MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CittYWluICgpCit7CisgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitFT0YKKworZmkKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5OTY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDAxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDA2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwMzU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA4ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyNjQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMwNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzMwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzYxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFBDUFkgMQorRU9GCisKKyAgIGZpCisKKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQyMzogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDI4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIExDX01FU1NBR0VTCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2CisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCitFT0YKKworICAgIGZpCisgIGZpCisgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0NTY6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKKyAgVVNFX05MUz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9OTFM9eWVzCitmaQorCisgICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2CisgICAgCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitFT0YKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQ3NjogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaQorCisgICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDk1OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTAwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MDU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTIyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1MjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzU1MDogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CithY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxpbnRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kdGV4dGRvbWFpbigpOworCitpbnQgbWFpbigpIHsKK2JpbmR0ZXh0ZG9tYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTg1OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1OTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzYyNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY1OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzY2NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjg3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNzE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzc1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNzgyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzgyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4NTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgIAorCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgICBJTlNUT0JKRVhUPS5tbworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCisJSU5UTExJQlM9JElOVExERVBTCisJTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisJCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2CisJICBYR0VUVEVYVD0iOiIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisgICAgICBQT1NVQj1wbworICAgIGVsc2UKKyAgICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgIGZpCisKKyAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCisgICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBVU0VfTkxTPXllcworICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgorICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCisgICAgZG9uZQorCisgICAgICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozOTgyOiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgorICAgICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQorICAgICBmaQorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCisgICBlbHNlCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKKy8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKKyAgIGZpCisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDEwOiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MDE1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjQwMjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBtc2dmb3JtYXQ9bGludXgKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Cittc2dmb3JtYXQ9eG9wZW4KK2ZpCisKKworCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAorCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KKyAgICAgR1RfTk89IiNOTyMiCisgICAgIEdUX1lFUz0KKyAgIGVsc2UKKyAgICAgR1RfTk89CisgICAgIEdUX1lFUz0iI1lFUyMiCisgICBmaQorICAgCisgICAKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgCisKKyAgICAgIGw9CisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCisgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCisgICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgorCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgorCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCisJIGVsc2UKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgorCSBmaQorICAgICAgZWxzZQorCSBwb3NyY3ByZWZpeD0iLi4vIgorICAgICAgZmkKKyAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCisgICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKKwkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKKyAgIGZpCisgIAorCisuICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwOTc6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworZm9yIGFjX2hkciBpbiBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTU0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDE1OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NDE2NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworCit1c2luZ19jZ2VuPW5vCisKKyMgSG9ycmlibGUgaGFja3MgdG8gYnVpbGQgRExMcyBvbiBXaW5kb3dzLgorV0lOMzJMREZMQUdTPQorV0lOMzJMSUJBREQ9CitjYXNlICIke2hvc3R9IiBpbgorKi0qLWN5Z3dpbiopCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgV0lOMzJMREZMQUdTPSItbm8tdW5kZWZpbmVkIgorICAgIFdJTjMyTElCQUREPSItTGBwd2RgLy4uL2JmZCAtbGJmZCAtTGBwd2RgLy4uL2xpYmliZXJ0eSAtbGliZXJ0eSAtTGBwd2RgLy4uL2ludGwgLWxpbnRsIC1sY3lnd2luIgorICBmaQorICA7OworZXNhYworCisKKworIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6CisKKyMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgoraWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KKyAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAorICAgIGRvCisJcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKKwlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KKwkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKKwllbHNlCisJICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCisJICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgorCWZpCisgICAgZG9uZQorZmkKKworYWxsX3RhcmdldHM9ZmFsc2UKK3NlbGFyY2hzPQorZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cworZG8KKyAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiIDsgdGhlbgorICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCisgICAgZWxzZQorCS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAorCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCisgICAgZmkKK2RvbmUJCisKKyMgVXRpbGl0eSB2YXIsIGRvY3VtZW50cyBnZW5lcmljIGNnZW4gc3VwcG9ydCBmaWxlcy4KKworY2dlbl9maWxlcz0iY2dlbi1vcGMubG8gY2dlbi1hc20ubG8gY2dlbi1kaXMubG8iCisKKyMgV2UgZG9uJ3QgZG8gYW55IGxpbmtzIGJhc2VkIG9uIHRoZSB0YXJnZXQgc3lzdGVtLCBqdXN0IG1ha2VmaWxlIGNvbmZpZy4KKworaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4ZmFsc2UgOyB0aGVuCisKKyAgICAjIFRhcmdldCBhcmNoaXRlY3R1cmUgLm8gZmlsZXMuCisgICAgdGE9CisKKyAgICBmb3IgYXJjaCBpbiAkc2VsYXJjaHMKKyAgICBkbworCWFkPWBlY2hvICRhcmNoIHwgc2VkIC1lIHMvYmZkXy8vZyAtZSBzL19hcmNoLy9nYAorCWFyY2hkZWZzPSIkYXJjaGRlZnMgLURBUkNIXyRhZCIKKwljYXNlICIkYXJjaCIgaW4KKwliZmRfYTI5a19hcmNoKQkJdGE9IiR0YSBhMjlrLWRpcy5sbyIgOzsKKwliZmRfYWxsaWFudF9hcmNoKQk7OworCWJmZF9hbHBoYV9hcmNoKQkJdGE9IiR0YSBhbHBoYS1kaXMubG8gYWxwaGEtb3BjLmxvIiA7OworCWJmZF9hcmNfYXJjaCkJCXRhPSIkdGEgYXJjLWRpcy5sbyBhcmMtb3BjLmxvIiA7OworCWJmZF9hcm1fYXJjaCkJCXRhPSIkdGEgYXJtLWRpcy5sbyIgOzsKKwliZmRfY29udmV4X2FyY2gpCTs7CisJYmZkX2QxMHZfYXJjaCkJCXRhPSIkdGEgZDEwdi1kaXMubG8gZDEwdi1vcGMubG8iIDs7CisJYmZkX2QzMHZfYXJjaCkJCXRhPSIkdGEgZDMwdi1kaXMubG8gZDMwdi1vcGMubG8iIDs7CisJYmZkX2ZyMzBfYXJjaCkgICAgICAgICAgdGE9IiR0YSBmcjMwLWFzbS5sbyBmcjMwLWRlc2MubG8gZnIzMC1kaXMubG8gZnIzMC1pYmxkLmxvIGZyMzAtb3BjLmxvIiB1c2luZ19jZ2VuPXllcyA7OworCWJmZF9oODMwMF9hcmNoKQkJdGE9IiR0YSBoODMwMC1kaXMubG8iIDs7CisJYmZkX2g4NTAwX2FyY2gpCQl0YT0iJHRhIGg4NTAwLWRpcy5sbyIgOzsKKwliZmRfaHBwYV9hcmNoKQkJdGE9IiR0YSBocHBhLWRpcy5sbyIgOzsKKwliZmRfaTM4Nl9hcmNoKQkJdGE9IiR0YSBpMzg2LWRpcy5sbyIgOzsKKwliZmRfaTg2MF9hcmNoKQkJOzsKKwliZmRfaTk2MF9hcmNoKQkJdGE9IiR0YSBpOTYwLWRpcy5sbyIgOzsKKwliZmRfbTMycl9hcmNoKQkJdGE9IiR0YSBtMzJyLWFzbS5sbyBtMzJyLWRlc2MubG8gbTMyci1kaXMubG8gbTMyci1pYmxkLmxvIG0zMnItb3BjLmxvIG0zMnItb3BpbnN0LmxvIiB1c2luZ19jZ2VuPXllcyA7OworCWJmZF9tNjhrX2FyY2gpCQl0YT0iJHRhIG02OGstZGlzLmxvIG02OGstb3BjLmxvIiA7OworCWJmZF9tODhrX2FyY2gpCQl0YT0iJHRhIG04OGstZGlzLmxvIiA7OworCWJmZF9tY29yZV9hcmNoKQkJdGE9IiR0YSBtY29yZS1kaXMubG8iIDs7CisJYmZkX21pcHNfYXJjaCkJCXRhPSIkdGEgbWlwcy1kaXMubG8gbWlwcy1vcGMubG8gbWlwczE2LW9wYy5sbyIgOzsKKwliZmRfbW4xMDIwMF9hcmNoKQl0YT0iJHRhIG0xMDIwMC1kaXMubG8gbTEwMjAwLW9wYy5sbyIgOzsKKwliZmRfbW4xMDMwMF9hcmNoKQl0YT0iJHRhIG0xMDMwMC1kaXMubG8gbTEwMzAwLW9wYy5sbyIgOzsKKwliZmRfbnMzMmtfYXJjaCkJCXRhPSIkdGEgbnMzMmstZGlzLmxvIiA7OworCWJmZF9wb3dlcnBjX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OworCWJmZF9weXJhbWlkX2FyY2gpCTs7CisJYmZkX3JvbXBfYXJjaCkJCTs7CisJYmZkX3JzNjAwMF9hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKKwliZmRfc2hfYXJjaCkJCXRhPSIkdGEgc2gtZGlzLmxvIiA7OworCWJmZF9zcGFyY19hcmNoKQkJdGE9IiR0YSBzcGFyYy1kaXMubG8gc3BhcmMtb3BjLmxvIiA7OworCWJmZF90YWhvZV9hcmNoKQkJOzsKKwliZmRfdGljMzBfYXJjaCkJCXRhPSIkdGEgdGljMzAtZGlzLmxvIiA7OworCWJmZF90aWM4MF9hcmNoKQkJdGE9IiR0YSB0aWM4MC1kaXMubG8gdGljODAtb3BjLmxvIiA7OworCWJmZF92ODUwX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OworCWJmZF92ODUwZV9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKKwliZmRfdjg1MGVhX2FyY2gpCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7CisJYmZkX3ZheF9hcmNoKQkJdGE9IiR0YSB2YXgtZGlzLmxvIiA7OworCWJmZF93NjVfYXJjaCkJCXRhPSIkdGEgdzY1LWRpcy5sbyIgOzsKKwliZmRfd2UzMmtfYXJjaCkJCTs7CisJYmZkX3o4a19hcmNoKQkJdGE9IiR0YSB6OGstZGlzLmxvIiA7OworCisJIiIpCQkJOzsKKwkqKQkJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAqKiogdW5rbm93biB0YXJnZXQgYXJjaGl0ZWN0dXJlICRhcmNoIiAxPiYyOyBleGl0IDE7IH0gOzsKKwllc2FjCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KKwl0YT0iJHRhICRjZ2VuX2ZpbGVzIgorICAgIGZpCisKKyAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KKyAgICBmPSIiCisgICAgZm9yIGkgaW4gJHRhIDsgZG8KKwljYXNlICIgJGYgIiBpbgorCSoiICRpICIqKSA7OworCSopIGY9IiRmICRpIiA7OworCWVzYWMKKyAgICBkb25lCisgICAgdGE9IiRmIgorCisgICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgorICAgIGY9IiIKKyAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbworCWNhc2UgIiAkZiAiIGluCisJKiIgJGkgIiopIDs7CisJKikgZj0iJGYgJGkiIDs7CisJZXNhYworICAgIGRvbmUKKyAgICBhcmNoZGVmcz0iJGYiCisKKyAgICBCRkRfTUFDSElORVM9IiR0YSIKKworZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKKyAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCisgICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCitmaQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQEZGTEFHU0AlJEZGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKK3MlQFZFUlNJT05AJSRWRVJTSU9OJWcKK3MlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKK3MlQEFVVE9DT05GQCUkQVVUT0NPTkYlZworcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCitzJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCitzJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVATERAJSRMRCVnCitzJUBOTUAlJE5NJWcKK3MlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCitzJUBMTl9TQCUkTE5fUyVnCitzJUBETExUT09MQCUkRExMVE9PTCVnCitzJUBBU0AlJEFTJWcKK3MlQExJQlRPT0xAJSRMSUJUT09MJWcKK3MlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZworcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKK3MlQENHRU5fTUFJTlRfVFJVRUAlJENHRU5fTUFJTlRfVFJVRSVnCitzJUBDR0VOX01BSU5UX0ZBTFNFQCUkQ0dFTl9NQUlOVF9GQUxTRSVnCitzJUBjZ2VuZGlyQCUkY2dlbmRpciVnCitzJUBjZ2VuQCUkY2dlbiVnCitzJUBXSU4zMkxERkxBR1NAJSRXSU4zMkxERkxBR1MlZworcyVAV0lOMzJMSUJBRERAJSRXSU4zMkxJQkFERCVnCitzJUBhcmNoZGVmc0AlJGFyY2hkZWZzJWcKK3MlQEJGRF9NQUNISU5FU0AlJEJGRF9NQUNISU5FUyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgordGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKK3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQorZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL29wY29kZXMvY29uZmlndXJlLmJhdCBiL29wY29kZXMvY29uZmlndXJlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJjNmQxCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9jb25maWd1cmUuYmF0CkBAIC0wLDAgKzEsMjQgQEAKK0BlY2hvIG9mZg0KK2VjaG8gQ29uZmlndXJpbmcgb3Bjb2RlcyBmb3IgZ28zMg0KK3JlbSBUaGlzIGJhdGNoIGZpbGUgYXNzdW1lcyBhIHVuaXgtdHlwZSAic2VkIiBwcm9ncmFtDQorDQorZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQorDQoraWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KKw0KK2VjaG8gIi9cLm9bIAldKjovIHMvY29uZmlnLnN0YXR1cy8vCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL0NDID0gY2MvQ0MgPSBnY2MvCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy9AQkZEX01BQ0hJTkVTQC9pMzg2LWRpcy5vLwkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicy9AYXJjaGRlZnNALy1EQVJDSF9pMzg2LwkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvQGZyYWdzQC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KK2VjaG8gInMvQHNyY2RpckAvLwkJCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzIUBwcmVmaXhAIS91c3IvbG9jYWwhCQkJCSI+PiBjb25maWcuc2VkDQorZWNobyAicyFAZXhlY19wcmVmaXhAIS91c3IvbG9jYWwhCQkJIj4+IGNvbmZpZy5zZWQNCitlY2hvICJzL0BSQU5MSUJAL3JhbmxpYi8JCQkJIj4+IGNvbmZpZy5zZWQNCisNCitlY2hvICJzL15bIAldKnJtLwktcm0vCQkJCSI+PiBjb25maWcuc2VkDQorDQorc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KK3NlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KK2RlbCBjb25maWcuc2VkDQorZGVsIGNvbmZpZzIuc2VkDQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jb25maWd1cmUuaW4gYi9vcGNvZGVzL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc4NTgwCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwyMTEgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sCisKK0FDX1BSRVJFUSgyLjEzKQorQUNfSU5JVCh6OGstZGlzLmMpCisKK0FDX0NBTk9OSUNBTF9TWVNURU0KK0FDX0lTQ19QT1NJWAorCisjIFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBuYW1lIG9mIGFueSBzaGFyZWQKKyMgbGlicmFyeS4gIEZvciB1c2VyIGNvbnZlbmllbmNlLCB3ZSBhbHdheXMgdXNlIHRoZSBzYW1lIHZlcnNpb24KKyMgbnVtYmVyIHRoYXQgQkZEIGlzIHVzaW5nLgorY2hhbmdlcXVvdGUoLClkbmwKK0JGRF9WRVJTSU9OPWBncmVwIElOSVRfQVVUT01BS0UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaW4gfCBzZWQgLW4gLWUgJ3MvWyAJXS8vZycgLWUgJ3MvXi4qLFwoLipcKSkuKiQvXDEvcCdgCitjaGFuZ2VxdW90ZShbLF0pZG5sCisKK0FNX0lOSVRfQVVUT01BS0Uob3Bjb2RlcywgJHtCRkRfVkVSU0lPTn0pCisKK2RubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50CitkbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgorQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQorCitkbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCitkbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCitBTV9ESVNBQkxFX1NIQVJFRAorCitBTV9QUk9HX0xJQlRPT0wKKworQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAorWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKKyAgICAgICAgICAgIDs7CisgIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKKyAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKK2VzYWNdKWRubAorQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCitbICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OworICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OworICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3Igb3Bjb2RlcyBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKK2VzYWNdKWRubAorCitBTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKKworaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKK2ZpCitBQ19BUkdfUFJPR1JBTQorCitBTV9NQUlOVEFJTkVSX01PREUKK0FDX0VYRUVYVAorCisjIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6CisKK0FDX1BST0dfQ0MKKworQUxMX0xJTkdVQVM9CitDWV9HTlVfR0VUVEVYVAorCisuICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworQUNfU1VCU1QoSERFRklORVMpCitBQ19QUk9HX0lOU1RBTEwKKworQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmgpCisKKwordXNpbmdfY2dlbj1ubworCisjIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KK1dJTjMyTERGTEFHUz0KK1dJTjMyTElCQUREPQorY2FzZSAiJHtob3N0fSIgaW4KKyotKi1jeWd3aW4qKQorICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgorICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKKyAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9iZmQgLWxiZmQgLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiIKKyAgZmkKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFdJTjMyTERGTEFHUykKK0FDX1NVQlNUKFdJTjMyTElCQUREKQorCisjIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKKworIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCitpZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgorICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCisgICAgZG8KKwlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAorCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgorCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgorCWVsc2UKKwkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KKwkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCisJZmkKKyAgICBkb25lCitmaQorCithbGxfdGFyZ2V0cz1mYWxzZQorc2VsYXJjaHM9Citmb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCitkbworICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCIgOyB0aGVuCisgICAgICAgIGFsbF90YXJnZXRzPXRydWUKKyAgICBlbHNlCisJLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCisJc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKKyAgICBmaQorZG9uZQkKKworIyBVdGlsaXR5IHZhciwgZG9jdW1lbnRzIGdlbmVyaWMgY2dlbiBzdXBwb3J0IGZpbGVzLgorCitjZ2VuX2ZpbGVzPSJjZ2VuLW9wYy5sbyBjZ2VuLWFzbS5sbyBjZ2VuLWRpcy5sbyIKKworIyBXZSBkb24ndCBkbyBhbnkgbGlua3MgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGp1c3QgbWFrZWZpbGUgY29uZmlnLgorCitpZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHhmYWxzZSA7IHRoZW4KKworICAgICMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KKyAgICB0YT0KKworICAgIGZvciBhcmNoIGluICRzZWxhcmNocworICAgIGRvCisJYWQ9YGVjaG8gJGFyY2ggfCBzZWQgLWUgcy9iZmRfLy9nIC1lIHMvX2FyY2gvL2dgCisJYXJjaGRlZnM9IiRhcmNoZGVmcyAtREFSQ0hfJGFkIgorCWNhc2UgIiRhcmNoIiBpbgorCWJmZF9hMjlrX2FyY2gpCQl0YT0iJHRhIGEyOWstZGlzLmxvIiA7OworCWJmZF9hbGxpYW50X2FyY2gpCTs7CisJYmZkX2FscGhhX2FyY2gpCQl0YT0iJHRhIGFscGhhLWRpcy5sbyBhbHBoYS1vcGMubG8iIDs7CisJYmZkX2FyY19hcmNoKQkJdGE9IiR0YSBhcmMtZGlzLmxvIGFyYy1vcGMubG8iIDs7CisJYmZkX2FybV9hcmNoKQkJdGE9IiR0YSBhcm0tZGlzLmxvIiA7OworCWJmZF9jb252ZXhfYXJjaCkJOzsKKwliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKKwliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKKwliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7CisJYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKKwliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OworCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OworCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OworCWJmZF9pODYwX2FyY2gpCQk7OworCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OworCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7CisJYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7CisJYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7CisJYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKKwliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OworCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OworCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OworCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7CisJYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7CisJYmZkX3B5cmFtaWRfYXJjaCkJOzsKKwliZmRfcm9tcF9hcmNoKQkJOzsKKwliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OworCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7CisJYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7CisJYmZkX3RhaG9lX2FyY2gpCQk7OworCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7CisJYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7CisJYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7CisJYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OworCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKKwliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7CisJYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OworCWJmZF93ZTMya19hcmNoKQkJOzsKKwliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7CisKKwkiIikJCQk7OworCSopCQlBQ19NU0dfRVJST1IoKioqIHVua25vd24gdGFyZ2V0IGFyY2hpdGVjdHVyZSAkYXJjaCkgOzsKKwllc2FjCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KKwl0YT0iJHRhICRjZ2VuX2ZpbGVzIgorICAgIGZpCisKKyAgICAjIFdlZWQgb3V0IGR1cGxpY2F0ZSAubyBmaWxlcy4KKyAgICBmPSIiCisgICAgZm9yIGkgaW4gJHRhIDsgZG8KKwljYXNlICIgJGYgIiBpbgorCSoiICRpICIqKSA7OworCSopIGY9IiRmICRpIiA7OworCWVzYWMKKyAgICBkb25lCisgICAgdGE9IiRmIgorCisgICAgIyBBbmQgZHVwbGljYXRlIC1EIGZsYWdzLgorICAgIGY9IiIKKyAgICBmb3IgaSBpbiAkYXJjaGRlZnMgOyBkbworCWNhc2UgIiAkZiAiIGluCisJKiIgJGkgIiopIDs7CisJKikgZj0iJGYgJGkiIDs7CisJZXNhYworICAgIGRvbmUKKyAgICBhcmNoZGVmcz0iJGYiCisKKyAgICBCRkRfTUFDSElORVM9IiR0YSIKKworZWxzZQkjIGFsbF90YXJnZXRzIGlzIHRydWUKKyAgICBhcmNoZGVmcz0tREFSQ0hfYWxsCisgICAgQkZEX01BQ0hJTkVTPSckKEFMTF9NQUNISU5FUyknCitmaQorCitBQ19TVUJTVChhcmNoZGVmcykKK0FDX1NVQlNUKEJGRF9NQUNISU5FUykKKworQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCitbc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL29wY29kZXMvZDEwdi1kaXMuYyBiL29wY29kZXMvZDEwdi1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjFhN2QzCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9kMTB2LWRpcy5jCkBAIC0wLDAgKzEsMzAxIEBACisvKiBEaXNhc3NlbWJsZSBEMTBWIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIgCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorCisvKiB0aGUgUEMgd3JhcHMgYXQgMTggYml0cywgZXhjZXB0IGZvciB0aGUgc2VnbWVudCBudW1iZXIgKi8KKy8qIHNvIHVzZSB0aGlzIG1hc2sgdG8ga2VlcCB0aGUgcGFydHMgd2Ugd2FudCAqLworI2RlZmluZSBQQ19NQVNLCTB4MDMwM0ZGRkYKKworc3RhdGljIHZvaWQgZGlzXzJfc2hvcnQgUEFSQU1TICgodW5zaWduZWQgbG9uZyBpbnNuLCBiZmRfdm1hIG1lbWFkZHIsIAorCQkJCSBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgaW50IG9yZGVyKSk7CitzdGF0aWMgdm9pZCBkaXNfbG9uZyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGJmZF92bWEgbWVtYWRkciwgCisJCQkgICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOworCitpbnQgCitwcmludF9pbnNuX2QxMHYgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGludCBzdGF0dXM7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOworCisgIHN0YXR1cyA9IGluc24gJiBGTTExOworICBzd2l0Y2ggKHN0YXR1cykgeworICBjYXNlIDA6CisgICAgZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIDIpOworICAgIGJyZWFrOworICBjYXNlIEZNMDE6CisgICAgZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIDApOworICAgIGJyZWFrOworICBjYXNlIEZNMTA6CisgICAgZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIDEpOworICAgIGJyZWFrOworICBjYXNlIEZNMTE6CisgICAgZGlzX2xvbmcgKGluc24sIG1lbWFkZHIsIGluZm8pOworICAgIGJyZWFrOworICB9CisgIHJldHVybiA0OworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfb3BlcmFuZCAob3BlciwgaW5zbiwgb3AsIG1lbWFkZHIsIGluZm8pCisgICAgIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wZXI7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50IG51bSwgc2hpZnQ7CisKKyAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRNSU5VUykKKyAgICB7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAtIik7ICAgCisgICAgICByZXR1cm47CisgICAgfQorICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9NSU5VUykKKyAgICB7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsgICAKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX1BMVVMpCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7ICAgCisgICAgICByZXR1cm47CisgICAgfQorICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFNJR04pCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAIik7ICAgCisgICAgICByZXR1cm47CisgICAgfQorICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKKyAgICB7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7ICAgCisgICAgICByZXR1cm47CisgICAgfQorCisgIHNoaWZ0ID0gb3Blci0+c2hpZnQ7CisKKyAgLyogdGhlIExPTkdfTCBmb3JtYXQgc2hpZnRzIHJlZ2lzdGVycyBvdmVyIGJ5IDE1ICovCisgIGlmIChvcC0+Zm9ybWF0ID09IExPTkdfTCAmJiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykpCisgICAgc2hpZnQgKz0gMTU7CisKKyAgbnVtID0gKGluc24gPj4gc2hpZnQpICYgKDB4N0ZGRkZGRkYgPj4gKDMxIC0gb3Blci0+Yml0cykpOworCisgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IG1hdGNoPTA7CisgICAgICBudW0gKz0gKG9wZXItPmZsYWdzCisJICAgICAgJiAoT1BFUkFORF9HUFJ8T1BFUkFORF9GRkxBR3xPUEVSQU5EX0NGTEFHfE9QRVJBTkRfQ09OVFJPTCkpOworICAgICAgaWYgKG9wZXItPmZsYWdzICYgKE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzEpKQorCW51bSArPSBudW0gPyBPUEVSQU5EX0FDQzEgOiBPUEVSQU5EX0FDQzA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZDEwdl9yZWdfbmFtZV9jbnQoKTsgaSsrKQorCXsKKwkgIGlmIChudW0gPT0gZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS52YWx1ZSkKKwkgICAgeworCSAgICAgIGlmIChkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLnBuYW1lKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLnBuYW1lKTsKKwkgICAgICBlbHNlCisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ubmFtZSk7CisJICAgICAgbWF0Y2g9MTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGlmIChtYXRjaCA9PSAwKQorCXsKKwkgIC8qIHRoaXMgd291bGQgb25seSBnZXQgZXhlY3V0ZWQgaWYgYSByZWdpc3RlciB3YXMgbm90IGluIHRoZSAKKwkgICAgIHJlZ2lzdGVyIHRhYmxlICovCisJICBpZiAob3Blci0+ZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiYSIpOworCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiY3IiKTsKKwkgIGVsc2UgaWYob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyIik7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIixudW0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBhZGRyZXNzZXMgYXJlIHJpZ2h0LXNoaWZ0ZWQgYnkgMiAqLworICAgICAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9BRERSKQorCXsKKwkgIGxvbmcgbWF4OworCSAgaW50IG5lZz0wOworCSAgbWF4ID0gKDEgPDwgKG9wZXItPmJpdHMgLSAxKSk7CisJICBpZiAobnVtICYgbWF4KQorCSAgICB7CisJICAgICAgbnVtID0gLW51bSAmICgoMSA8PCBvcGVyLT5iaXRzKS0xKTsKKwkgICAgICBuZWcgPSAxOworCSAgICB9CisJICBudW0gPSBudW08PDI7CisJICBpZiAoaW5mby0+ZmxhZ3MgJiBJTlNOX0hBU19SRUxPQykKKwkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChudW0gJiBQQ19NQVNLLCBpbmZvKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChuZWcpCisJCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgLSBudW0pICYgUENfTUFTSywgaW5mbyk7CisJICAgICAgZWxzZQorCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICsgbnVtKSAmIFBDX01BU0ssIGluZm8pOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0lHTkVEKQorCSAgICB7CisJICAgICAgaW50IG1heCA9ICgxIDw8IChvcGVyLT5iaXRzIC0gMSkpOworCSAgICAgIGlmIChudW0gJiBtYXgpCisJCXsKKwkJICBudW0gPSAtbnVtICYgKCgxIDw8IG9wZXItPmJpdHMpLTEpOworCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOworCQl9CisJICAgIH0KKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsbnVtKTsKKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitkaXNfbG9uZyAoaW5zbiwgbWVtYWRkciwgaW5mbykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpbnQgaTsKKyAgY2hhciBidWZbMzJdOworICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2RlczsKKyAgc3RydWN0IGQxMHZfb3BlcmFuZCAqb3BlcjsKKyAgaW50IG5lZWRfcGFyZW4gPSAwOworICBpbnQgbWF0Y2ggPSAwOworCisgIHdoaWxlIChvcC0+bmFtZSkKKyAgICB7CisgICAgICBpZiAoKG9wLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgJiYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUpKQorCXsKKwkgIG1hdGNoID0gMTsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsgICAKKwkgIGZvciAoIGk9MDsgb3AtPm9wZXJhbmRzW2ldOyBpKyspCisJICAgIHsKKwkgICAgICBvcGVyID0gKHN0cnVjdCBkMTB2X29wZXJhbmQgKikmZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dOworCSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQorCQluZWVkX3BhcmVuID0gMTsKKwkgICAgICBwcmludF9vcGVyYW5kIChvcGVyLCBpbnNuLCBvcCwgbWVtYWRkciwgaW5mbyk7CisJICAgICAgaWYgKG9wLT5vcGVyYW5kc1tpKzFdICYmIG9wZXItPmJpdHMgJiYKKwkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYKKwkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX01JTlVTKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwgIik7ICAgCisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIG9wKys7CisgICAgfQorCisgIGlmICghbWF0Y2gpCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHglMDh4IixpbnNuKTsgICAKKworICBpZiAobmVlZF9wYXJlbikKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsgICAKK30KKworc3RhdGljIHZvaWQKK2Rpc18yX3Nob3J0IChpbnNuLCBtZW1hZGRyLCBpbmZvLCBvcmRlcikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBpbnQgb3JkZXI7Cit7CisgIGludCBpLGo7CisgIGNoYXIgYXN0clsyXVszMl07CisgIHVuc2lnbmVkIGludCBpbnNbMl07CisgIHN0cnVjdCBkMTB2X29wY29kZSAqb3A7CisgIGNoYXIgYnVmWzMyXTsKKyAgaW50IG1hdGNoLCBudW1fbWF0Y2g9MDsKKyAgc3RydWN0IGQxMHZfb3BlcmFuZCAqb3BlcjsKKyAgaW50IG5lZWRfcGFyZW4gPSAwOworCisgIGluc1swXSA9IChpbnNuICYgMHgzRkZGRkZGRikgPj4gMTU7CisgIGluc1sxXSA9IGluc24gJiAweDAwMDA3RkZGOworCisgIGZvcihqPTA7ajwyO2orKykKKyAgICB7CisgICAgICBvcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7CisgICAgICBtYXRjaD0wOworICAgICAgd2hpbGUgKG9wLT5uYW1lKQorCXsKKwkgIGlmICgob3AtPmZvcm1hdCAmIFNIT1JUX09QQ09ERSkgJiYgKChvcC0+bWFzayAmIGluc1tqXSkgPT0gb3AtPm9wY29kZSkpCisJICAgIHsKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLG9wLT5uYW1lKTsgICAKKwkgICAgICBmb3IgKGk9MDsgb3AtPm9wZXJhbmRzW2ldOyBpKyspCisJCXsKKwkJICBvcGVyID0gKHN0cnVjdCBkMTB2X29wZXJhbmQgKikmZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dOworCQkgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQorCQkgICAgbmVlZF9wYXJlbiA9IDE7CisJCSAgcHJpbnRfb3BlcmFuZCAob3BlciwgaW5zW2pdLCBvcCwgbWVtYWRkciwgaW5mbyk7CisJCSAgaWYgKG9wLT5vcGVyYW5kc1tpKzFdICYmIG9wZXItPmJpdHMgJiYgCisJCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmCisJCSAgZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MgIT0gT1BFUkFORF9NSU5VUykKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCAiKTsgICAKKwkJfQorCSAgICAgIG1hdGNoID0gMTsKKwkgICAgICBudW1fbWF0Y2grKzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgb3ArKzsKKwl9CisgICAgICBpZiAoIW1hdGNoKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAidW5rbm93biIpOyAgIAorCisgICAgICBzd2l0Y2ggKG9yZGVyKQorCXsKKwljYXNlIDA6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0LT5cdCIpOyAgIAorCSAgb3JkZXIgPSAtMTsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ8LVx0Iik7ICAgCisJICBvcmRlciA9IC0xOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdHx8XHQiKTsgICAKKwkgIG9yZGVyID0gLTE7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAobnVtX21hdGNoID09IDApCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHglMDh4IixpbnNuKTsgICAKKworICBpZiAobmVlZF9wYXJlbikKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsgICAKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvZDEwdi1vcGMuYyBiL29wY29kZXMvZDEwdi1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGEwMmQwCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9kMTB2LW9wYy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBkMTB2LW9wYy5jIC0tIEQxMFYgb3Bjb2RlIGxpc3QKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIgorCisKKy8qICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCitjb25zdCBzdHJ1Y3QgcGRfcmVnIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbXSA9Cit7CisgIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MwKzAgfSwKKyAgeyAiYTEiLCBOVUxMLCBPUEVSQU5EX0FDQzErMSB9LAorICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAorICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKKyAgeyAiYyIsIE5VTEwsIE9QRVJBTkRfQ0ZMQUcrMyB9LAorICB7ICJjcjAiLCAicHN3IiwgT1BFUkFORF9DT05UUk9MIH0sCisgIHsgImNyMSIsICJicHN3IiwgT1BFUkFORF9DT05UUk9MKzEgfSwKKyAgeyAiY3IxMCIsICJtb2RfcyIsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAorICB7ICJjcjExIiwgIm1vZF9lIiwgT1BFUkFORF9DT05UUk9MKzExIH0sCisgIHsgImNyMTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTIgfSwKKyAgeyAiY3IxMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMyB9LAorICB7ICJjcjE0IiwgImliYSIsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAorICB7ICJjcjE1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE1IH0sCisgIHsgImNyMiIsICJwYyIsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCisgIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAorICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCisgIHsgImNyNSIsICJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAorICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAorICB7ICJjcjciLCAicnB0X2MiLCBPUEVSQU5EX0NPTlRST0wrNyB9LAorICB7ICJjcjgiLCAicnB0X3MiLCBPUEVSQU5EX0NPTlRST0wrOCB9LAorICB7ICJjcjkiLCAicnB0X2UiLCBPUEVSQU5EX0NPTlRST0wrOSB9LAorICB7ICJkcGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNSB9LAorICB7ICJkcHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQgfSwKKyAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzAgfSwKKyAgeyAiZjEiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzEgfSwKKyAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCisgIHsgImxpbmsiLCAicjEzIiwgT1BFUkFORF9HUFIrMTMgfSwKKyAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKKyAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKKyAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAorICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMCB9LAorICB7ICJyMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzAgfSwKKyAgeyAicjAtcjEiLCBOVUxMLCBPUEVSQU5EX0dQUiswfSwKKyAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCisgIHsgInIxIiwgTlVMTCwgT1BFUkFORF9HUFIrMSB9LAorICB7ICJyMTAiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAorICB7ICJyMTAtcjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTAgfSwKKyAgeyAicjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTEgfSwKKyAgeyAicjEyIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKKyAgeyAicjEyLXIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEyIH0sCisgIHsgInIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEzIH0sCisgIHsgInIxNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCisgIHsgInIxNC1yMTUiLCBOVUxMLCBPUEVSQU5EX0dQUisxNCB9LAorICB7ICJyMTUiLCAic3AiLCBPUEVSQU5EX0dQUisxNSB9LAorICB7ICJyMiIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKKyAgeyAicjItcjMiLCBOVUxMLCBPUEVSQU5EX0dQUisyIH0sCisgIHsgInIzIiwgTlVMTCwgT1BFUkFORF9HUFIrMyB9LAorICB7ICJyNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKKyAgeyAicjQtcjUiLCBOVUxMLCBPUEVSQU5EX0dQUis0IH0sCisgIHsgInI1IiwgTlVMTCwgT1BFUkFORF9HUFIrNSB9LAorICB7ICJyNiIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKKyAgeyAicjYtcjciLCBOVUxMLCBPUEVSQU5EX0dQUis2IH0sCisgIHsgInI3IiwgTlVMTCwgT1BFUkFORF9HUFIrNyB9LAorICB7ICJyOCIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKKyAgeyAicjgtcjkiLCBOVUxMLCBPUEVSQU5EX0dQUis4IH0sCisgIHsgInI5IiwgTlVMTCwgT1BFUkFORF9HUFIrOSB9LAorICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCisgIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKKyAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAorICB7ICJzcCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE1IH0sCit9OworCitpbnQgCitkMTB2X3JlZ19uYW1lX2NudCgpCit7CisgIHJldHVybiAoc2l6ZW9mKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKK30KKworY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW10gPQoreworI2RlZmluZSBVTlVTRUQJKDApCisgIHsgMCwgMCwgMCB9LAorI2RlZmluZSBSU1JDCShVTlVTRUQgKyAxKQorICB7IDQsIDEsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCisjZGVmaW5lIFJEU1QJKFJTUkMgKyAxKQorICB7IDQsIDUsIE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAorI2RlZmluZSBBU1JDCShSRFNUICsgMSkKKyAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCisjZGVmaW5lIEFTUkMwT05MWSAoQVNSQyArIDEpCisgIHsgMSwgNCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfUkVHIH0sCisjZGVmaW5lIEFEU1QJKEFTUkMwT05MWSArIDEpCisgIHsgMSwgOCwgT1BFUkFORF9ERVNUfE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgUlNSQ0UJKEFEU1QgKyAxKQorICB7IDQsIDEsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAorI2RlZmluZSBSRFNURQkoUlNSQ0UgKyAxKQorICB7IDQsIDUsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0RFU1R8T1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgTlVNMTYJKFJEU1RFICsgMSkKKyAgeyAxNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKKyNkZWZpbmUgTlVNMwkoTlVNMTYgKyAxKQkJCS8qIHJhYywgcmFjaGkgKi8KKyAgeyAzLCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAorI2RlZmluZSBOVU00CShOVU0zICsgMSkKKyAgeyA0LCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAorI2RlZmluZSBVTlVNNAkoTlVNNCArIDEpCisgIHsgNCwgMSwgT1BFUkFORF9OVU0gfSwKKyNkZWZpbmUgVU5VTTRTCShVTlVNNCArIDEpCQkJLyogYWRkaSwgc2xsaSwgc3JhaSwgc3JsaSwgc3ViaSAqLworICB7IDQsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKKyNkZWZpbmUgVU5VTTgJKFVOVU00UyArIDEpCQkJLyogcmVwaSAqLworICB7IDgsIDE2LCBPUEVSQU5EX05VTSB9LAorI2RlZmluZSBVTlVNMTYJKFVOVU04ICsgMSkJCQkvKiBjbXB1aSAqLworICB7IDE2LCAwLCBPUEVSQU5EX05VTSB9LAorI2RlZmluZSBBTlVNMTYJKFVOVU0xNiArIDEpCisgIHsgMTYsIDAsIE9QRVJBTkRfQUREUnxPUEVSQU5EX1NJR05FRCB9LAorI2RlZmluZSBBTlVNOAkoQU5VTTE2ICsgMSkKKyAgeyA4LCAwLCBPUEVSQU5EX0FERFJ8T1BFUkFORF9TSUdORUQgfSwKKyNkZWZpbmUgQVNSQzIJKEFOVU04ICsgMSkKKyAgeyAxLCA4LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCisjZGVmaW5lIFJTUkMyCShBU1JDMiArIDEpCisgIHsgNCwgNSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgUlNSQzJFCShSU1JDMiArIDEpCisgIHsgNCwgNSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUd8T1BFUkFORF9FVkVOIH0sCisjZGVmaW5lIEFTUkMwCShSU1JDMkUgKyAxKQorICB7IDEsIDAsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgQURTVDAJKEFTUkMwICsgMSkKKyAgeyAxLCAwLCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAorI2RlZmluZSBGRlNSQwkoQURTVDAgKyAxKQorICB7IDIsIDEsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GRkxBRyB9LAorI2RlZmluZSBDRlNSQwkoRkZTUkMgKyAxKQorICB7IDIsIDEsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9DRkxBRyB9LAorI2RlZmluZSBGRFNUCShDRlNSQyArIDEpCisgIHsgMSwgNSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZGTEFHIHwgT1BFUkFORF9ERVNUfSwKKyNkZWZpbmUgQVRTSUdOCShGRFNUICsgMSkKKyAgeyAwLCAwLCBPUEVSQU5EX0FUU0lHTn0sCisjZGVmaW5lIEFUUEFSCShBVFNJR04gKyAxKQkvKiAiQCgiICovCisgIHsgMCwgMCwgT1BFUkFORF9BVFBBUn0sCisjZGVmaW5lIFBMVVMJKEFUUEFSICsgMSkJLyogcG9zdGluY3JlbWVudCAqLworICB7IDAsIDAsIE9QRVJBTkRfUExVU30sCisjZGVmaW5lIE1JTlVTCShQTFVTICsgMSkJLyogcG9zdGRlY3JlbWVudCAqLworICB7IDAsIDAsIE9QRVJBTkRfTUlOVVN9LAorI2RlZmluZSBBVE1JTlVTCShNSU5VUyArIDEpCS8qIHByZWRlY3JlbWVudCAqLworICB7IDAsIDAsIE9QRVJBTkRfQVRNSU5VU30sCisjZGVmaW5lIENTUkMJKEFUTUlOVVMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCisgIHsgNCwgMSwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfSwKKyNkZWZpbmUgQ0RTVAkoQ1NSQyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgeyA0LCA1LCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x8T1BFUkFORF9ERVNUfSwKK307CisKK2NvbnN0IHN0cnVjdCBkMTB2X29wY29kZSBkMTB2X29wY29kZXNbXSA9IHsKKyAgeyAiYWJzIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQ2MDcsIDB4N2UxZiwgeyBSRFNUIH0gfSwKKyAgeyAiYWJzIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NTYwNywgMHg3ZWZmLCB7IEFEU1QgfSB9LAorICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAweDAyMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjAxLCAweDdlZTMsIHsgQURTVCwgUlNSQ0UgfSB9LAorICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKKyAgeyAiYWRkMnciLCBTSE9SVF8yLCAyLCBJVSwgUEFSfFdDQVIsIDB4MTIwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCisgIHsgImFkZDMiLCBMT05HX0wsIDEsIE1VLCBTRVF8V0NBUiwgMHgxMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKKyAgeyAiYWRkYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMjAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAorICB7ICJhZGRhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAyMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKKyAgeyAiYWRkYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTIwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKKyAgeyAiYWRkYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTIwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAorICB7ICJhZGRpIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgIDB4MjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTRTIH0gfSwKKyAgeyAiYW5kIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4YzAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCisgIHsgImFuZDMiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NjAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCisgIHsgImJjbHJpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHhjMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCisgIHsgImJsIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAorICB7ICJibC5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg0OTAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAorICB7ICJibC5sIiwgTE9OR19CLCAzLCBNVSwgQlJBTkNIX0xJTkt8U0VRLCAweDI0ODAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCisgIHsgImJub3RpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHhhMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCisgIHsgImJyYSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKKyAgeyAiYnJhLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUiwgMHg0ODAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAorICB7ICJicmEubCIsIExPTkdfQiwgMywgTVUsIEJSQU5DSHxTRVEsIDB4MjQwMDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKKyAgeyAiYnJmMGYiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCisgIHsgImJyZjBmLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUnxSRjAsIDB4NGEwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKKyAgeyAiYnJmMGYubCIsIExPTkdfQiwgMywgTVUsIFNFUSwgMHgyNTAwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAorICB7ICJicmYwdCIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKKyAgeyAiYnJmMHQucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSfFJGMCwgMHg0YjAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAorICB7ICJicmYwdC5sIiwgTE9OR19CLCAzLCBNVSwgU0VRLCAweDI1ODAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCisgIHsgImJzZXRpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg4MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCisgIHsgImJ0c3RpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4ZTAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAorICB7ICJjbHJhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTYwMSwgMHg3ZWZmLCB7IEFEU1QgfSB9LAorICB7ICJjbXAiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NjAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAorICB7ICJjbXAiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgxNjAzLCAweDdlZWYsIHsgQVNSQzIsIEFTUkMgfSB9LAorICB7ICJjbXBlcSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCisgIHsgImNtcGVxIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MTQwMywgMHg3ZWVmLCB7IEFTUkMyLCBBU1JDIH0gfSwKKyAgeyAiY21wZXFpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAorICB7ICJjbXBlcWkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0MDEsIDB4N2UwMSwgeyBSU1JDMiwgTlVNNCB9IH0sCisgIHsgImNtcGVxaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKKyAgeyAiY21waSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKKyAgeyAiY21waS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDYwMSwgMHg3ZTAxLCB7IFJTUkMyLCBOVU00IH0gfSwKKyAgeyAiY21waS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKKyAgeyAiY21wdSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0NjAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAorICB7ICJjbXB1aSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgyMzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgVU5VTTE2IH0gfSwKKyAgeyAiY3BmZyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NGUwOSwgMHg3ZmQ5LCB7IEZEU1QsIEZGU1JDIH0gfSwKKyAgeyAiY3BmZyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NGUwOSwgMHg3ZmQ5LCB7IEZEU1QsIENGU1JDIH0gfSwKKyAgeyAiZGJ0IiwgU0hPUlRfMiwgNSwgTVUsIFBBUiwgMHg1ZjIwLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImRpdnMiLCBMT05HX0wsIDEsIEJPVEgsIFNFUSwgMHgxNDAwMjgwMCwgMHgzZjEwZmUyMSwgeyBSRFNURSwgUlNSQyB9IH0sCisgIHsgImV4ZWYwZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTA0LCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZWYwdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTI0LCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZWYxZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTQwLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZWYxdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTQyLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZWZhZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTAwLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZWZhdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTAyLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZXRhZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTIwLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4ZXRhdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTIyLCAweDdmZmYsIHsgMCB9IH0sCisgIHsgImV4cCIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNTAwMmEwMCwgMHgzZmZmZmUwMywgeyBSRFNULCBSU1JDRSB9IH0sCisgIHsgImV4cCIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNTAwMmEwMiwgMHgzZmZmZmUwZiwgeyBSRFNULCBBU1JDIH0gfSwKKyAgeyAiamwiLCBTSE9SVF8yLCAzLCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDRkMDAsIDB4N2ZlMSwgeyBSU1JDIH0gfSwKKyAgeyAiam1wIiwgU0hPUlRfMiwgMywgTVUsIEJSQU5DSHxQQVIsIDB4NGMwMCwgMHg3ZmUxLCB7IFJTUkMgfSB9LAorICB7ICJsZCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMDAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAorICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2NDAxLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCisgIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYwMDEsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAorICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MDAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKKyAgeyAibGQydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMTAwMDAwMCwgMHgzZjEwMDAwMCwgeyBSRFNURSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKKyAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2NjAxLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAorICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKKyAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MjAwLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQyB9IH0sCisgIHsgImxkYiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzODAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAorICB7ICJsZGIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzAwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCisgIHsgImxkaSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKKyAgeyAibGRpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSTUVNLCAweDQwMDEsIDB4N2UwMSAsIHsgUkRTVCwgTlVNNCB9IH0sCisgIHsgImxkaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJEU1QsIE5VTTE2IH0gfSwKKyAgeyAibGR1YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzOTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAorICB7ICJsZHViIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDcyMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAorICB7ICJtYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAorICB7ICJtYWNzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCisgIHsgIm1hY3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAorICB7ICJtYXgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCisgIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDAsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCisgIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDIsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKKyAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MjYwMSwgMHg3ZTAxICwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMSwgMHg3ZWUzICwgeyBBRFNULCBSU1JDRSB9IH0sCisgIHsgIm1pbiIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKKyAgeyAibXNiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKKyAgeyAibXNic3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDE4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAorICB7ICJtc2J1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKKyAgeyAibXVsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyZTAwLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAorICB7ICJtdWx4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKKyAgeyAibXVseHN1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKKyAgeyAibXVseHUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAorICB7ICJtdiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAibXYydyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCisgIHsgIm12MndmYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDAsIDB4N2UyZiwgeyBSRFNURSwgQVNSQyB9IH0sCisgIHsgIm12Mnd0YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDEsIDB4N2VlMywgeyBSU1JDRSwgQURTVCB9IH0sCisgIHsgIm12YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKKyAgeyAibXZiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCisgIHsgIm12ZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8UkYwLCAweDQ0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAibXZmMHQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAorICB7ICJtdmZhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDQsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKKyAgeyAibXZmYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAorICB7ICJtdmZhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAyLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCisgIHsgIm12ZmMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDUyMDAsIDB4N2UwMSwgeyBSRFNULCBDU1JDIH0gfSwKKyAgeyAibXZ0YWNnIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTQxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCisgIHsgIm12dGFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKKyAgeyAibXZ0YWNsbyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUyMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAorICB7ICJtdnRjIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1NjAwLCAweDdlMDEsIHsgUlNSQywgQ0RTVCB9IH0sCisgIHsgIm12dWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDEsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAibmVnIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDYwNSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAorICB7ICJuZWciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU2MDUsIDB4N2VmZiwgeyBBRFNUIH0gfSwKKyAgeyAibm9wIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NWUwMCwgMHg3ZmZmLCB7IDAgfSB9LAorICB7ICJub3QiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjAzLCAweDdlMWYsIHsgUkRTVCB9IH0sCisgIHsgIm9yIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4ODAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCisgIHsgIm9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKKyAgeyAicmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NTIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBU1JDME9OTFksIE5VTTMgfSB9LAorICB7ICJyYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDQyMDEsIDB4N2UwMSwgeyBSRFNULCBBU1JDLCBOVU0zIH0gfSwKKyAgeyAicmVwIiwgTE9OR19MLCAyLCBNVSwgU0VRLCAweDI3MDAwMDAwLCAweDNmZjAwMDAwLCB7IFJTUkMsIEFOVU0xNiB9IH0sCisgIHsgInJlcGkiLCBMT05HX0wsIDIsIE1VLCBTRVEsIDB4MmYwMDAwMDAsIDB4M2YwMDAwMDAsIHsgVU5VTTgsIEFOVU0xNiB9IH0sCisgIHsgInJ0ZCIsIFNIT1JUXzIsIDMsIE1VLCBQQVIsIDB4NWY2MCwgMHg3ZmZmLCB7IDAgfSB9LAorICB7ICJydGUiLCBTSE9SVF8yLCAzLCBNVSwgUEFSLCAweDVmNDAsIDB4N2ZmZiwgeyAwIH0gfSwKKyAgeyAic2FkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIyMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAorICB7ICJzZXRmMGYiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJGMCwgMHg0NjExLCAweDdlMWYsIHsgUkRTVCB9IH0sCisgIHsgInNldGYwdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8UkYwLCAweDQ2MTMsIDB4N2UxZiwgeyBSRFNUIH0gfSwKKyAgeyAic2xlZXAiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmYzAsIDB4N2ZmZiwgeyAwIH0gfSwKKyAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCisgIHsgInNsbCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzIwMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAorICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAorICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAxLCAweDdlZTEsIHsgQURTVCwgVU5VTTRTIH0gfSwKKyAgeyAic2x4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjAsIDB4NDYwYiwgMHg3ZTFmLCB7IFJEU1QgfSB9LAorICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAic3JhIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzNDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCisgIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCisgIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAorICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAic3JsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCisgIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCisgIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAorICB7ICJzcngiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjA5LCAweDdlMWYsIHsgUkRTVCB9IH0sCisgIHsgInN0IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJTUkMyLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAorICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCisgIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZjMWYsIDB4N2UxZiwgeyBSU1JDMiwgQVRNSU5VUywgUlNSQyB9IH0sCisgIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDEsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKKyAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKKyAgeyAic3QydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzNTAwMDAwMCwgMHgzZjEwMDAwMCwgeyBSU1JDMkUsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCisgIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmEwMCwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDIH0gfSwKKyAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ZTFmLCAweDdlM2YsIHsgUlNSQzJFLCBBVE1JTlVTLCBSU1JDIH0gfSwKKyAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAxLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAorICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAorICB7ICJzdGIiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4M2MwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUlNSQzIsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCisgIHsgInN0YiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg3ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCisgIHsgInN0b3AiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmZTAsIDB4N2ZmZiwgeyAwIH0gfSwKKyAgeyAic3ViIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgMHgwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCisgIHsgInN1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTAwMSwgMHg3ZWUzLCB7IEFEU1QsIFJTUkMgfSB9LAorICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEwMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKKyAgeyAic3ViMnciLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdDQVIsIDB4MTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCisgIHsgInN1YmFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDAwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKKyAgeyAic3ViYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMDAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCisgIHsgInN1YmFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEwMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCisgIHsgInN1YmFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEwMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKKyAgeyAic3ViaSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNFMgfSB9LAorICB7ICJ0cmFwIiwgU0hPUlRfMiwgNSwgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg1ZjAwLCAweDdmZTEsIHsgVU5VTTQgfSB9LAorICB7ICJ0c3QwaSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg3MDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCisgIHsgInRzdDFpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweGYwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKKyAgeyAid2FpdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWY4MCwgMHg3ZmZmLCB7IDAgfSB9LAorICB7ICJ4b3IiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHhhMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKKyAgeyAieG9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg1MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKKyAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCB7IDAgfSB9LAorfTsKKworCmRpZmYgLS1naXQgYS9vcGNvZGVzL2QzMHYtZGlzLmMgYi9vcGNvZGVzL2QzMHYtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OGI3NQotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvZDMwdi1kaXMuYwpAQCAtMCwwICsxLDM5OSBAQAorLyogRGlzYXNzZW1ibGUgRDMwViBpbnN0cnVjdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiIAorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworI2RlZmluZSBQQ19NQVNLIDB4RkZGRkZGRkYKKworc3RhdGljIGludCBsb29rdXBfb3Bjb2RlIFBBUkFNUyAoKCBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuLCBsb25nIG51bSwgaW50IGlzX2xvbmcgKSk7CitzdGF0aWMgdm9pZCBwcmludF9pbnNuIFBBUkFNUyAoKCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgYmZkX3ZtYSBtZW1hZGRyLCBsb25nIGxvbmcgbnVtLCAKKwkJCQkgc3RydWN0IGQzMHZfaW5zbiAqaW5zbiwgaW50IGlzX2xvbmcsIGludCBzaG93X2V4dCApKTsKK3N0YXRpYyBpbnQgZXh0cmFjdF92YWx1ZSBQQVJBTVMgKCggbG9uZyBsb25nIG51bSwgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlciwgaW50IGlzX2xvbmcgKSk7CisKK2ludCAKK3ByaW50X2luc25fZDMwdiAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50IHN0YXR1cywgcmVzdWx0OworICBiZmRfYnl0ZSBidWZmZXJbMTJdOworICB1bnNpZ25lZCBsb25nIGluMSxpbjI7CisgIHN0cnVjdCBkMzB2X2luc24gaW5zbjsKKyAgbG9uZyBsb25nIG51bTsKKworICBpbnNuLmZvcm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopTlVMTDsKKworICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7CisgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7CisgIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaW4xID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyKzQsIGJ1ZmZlciwgNCwgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDg7CisgICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOworICAgICAgZWxzZQorCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgKGxvbmcgbG9uZykgaW4xLCAmaW5zbiwgMCwgcmVzdWx0KTsKKyAgICAgIHJldHVybiA0OyAgICAgIAorICAgIH0KKyAgaW4yID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKKyAgCisgIGlmIChpbjEgJiBpbjIgJiBGTTAxKQorICAgIHsKKyAgICAgIC8qIExPTkcgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIGlmICghKHJlc3VsdCA9IGxvb2t1cF9vcGNvZGUoJmluc24sIGluMSwgMSkpKQorCXsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JXgsMHgleCIsaW4xLGluMik7CisJICByZXR1cm4gODsKKwl9CisgICAgICBudW0gPSAobG9uZyBsb25nKWluMSA8PCAzMiB8IGluMjsKKyAgICAgIHByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMSwgcmVzdWx0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBudW0gPSBpbjE7CisgICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDApKSkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjEpOworICAgICAgZWxzZQorCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKKyAgICAgIAorICAgICAgc3dpdGNoICggKChpbjE+PjMxKTw8MSkgfCAoaW4yPj4zMSkgKQorCXsKKwljYXNlIDA6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAorCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdC0+XHQiKTsgICAKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQ8LVx0Iik7ICAgCisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIAorICAgICAgaW5zbi5mb3JtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKU5VTEw7CisgICAgICBudW0gPSBpbjI7CisgICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjIsIDApKSkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4IixpbjIpOworICAgICAgZWxzZQorCXByaW50X2luc24oaW5mbywgbWVtYWRkciwgbnVtLCAmaW5zbiwgMCwgcmVzdWx0KTsKKworICAgIH0KKyAgcmV0dXJuIDg7Cit9CisKKworLyogcmV0dXJucyAwIGlmIGxvb2t1cCBmYWlscyAqLworLyogMSBpZiBmb3VuZCBhbmQgb25seSBvbmUgZm9ybSAqLworLyogMiBpZiBmb3VuZCBhbmQgdGhlcmUgYXJlIHNob3J0IGFuZCBsb25nIGZvcm1zICovCitzdGF0aWMgaW50Citsb29rdXBfb3Bjb2RlIChpbnNuLCBudW0sIGlzX2xvbmcpCisgICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247CisgICAgIGxvbmcgbnVtOworICAgICBpbnQgaXNfbG9uZzsKK3sKKyAgaW50IGk9MCwgaW5kZXg7CisgIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZjsKKyAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgZDMwdl9vcGNvZGUgKilkMzB2X29wY29kZV90YWJsZTsKKyAgaW50IG9wMSA9IChudW0gPj4gMjUpICYgMHg3OworICBpbnQgb3AyID0gKG51bSA+PiAyMCkgJiAweDFmOworICBpbnQgbW9kID0gKG51bSA+PiAxOCkgJiAweDM7CisKKyAgLyogZmluZCB0aGUgb3Bjb2RlICovCisgIGRvIHsKKyAgICBpZiAoKG9wLT5vcDEgPT0gb3AxKSAmJiAob3AtPm9wMiA9PSBvcDIpKQorICAgICAgYnJlYWs7CisgICAgb3ArKzsKKyAgfSB3aGlsZSAob3AtPm5hbWUpOworCisgIGlmICghb3AgfHwgIW9wLT5uYW1lKQorICAgIHJldHVybiAwOworCisgIHdoaWxlIChvcC0+b3AxID09IG9wMSAmJiBvcC0+b3AyID09IG9wMikKKyAgICB7CisgICAgICAvKiBzY2FuIHRocm91Z2ggYWxsIHRoZSBmb3JtYXRzIGZvciB0aGUgb3Bjb2RlICAqLworICAgICAgaW5kZXggPSBvcC0+Zm9ybWF0W2krK107CisgICAgICBkbyAKKwl7CisJICBmID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVtpbmRleF07CisJICB3aGlsZSAoZi0+Zm9ybSA9PSBpbmRleCkKKwkgICAgeworCSAgICAgIGlmICgoIWlzX2xvbmcgfHwgZi0+Zm9ybSA+PSBMT05HKSAmJiAoZi0+bW9kaWZpZXIgPT0gbW9kKSkKKwkJeworCQkgIGluc24tPmZvcm0gPSBmOworCQkgIGJyZWFrOworCQl9CisJICAgICAgZisrOworCSAgICB9CisJICBpZiAoaW5zbi0+Zm9ybSkKKwkgICAgYnJlYWs7CisJfSB3aGlsZSAoKGluZGV4ID0gb3AtPmZvcm1hdFtpKytdKSAhPSAwKTsKKyAgICAgIGlmIChpbnNuLT5mb3JtKQorCWJyZWFrOworICAgICAgb3ArKzsKKyAgICAgIGk9MDsKKyAgICB9CisgIGlmIChpbnNuLT5mb3JtID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaW5zbi0+b3AgPSBvcDsKKyAgaW5zbi0+ZWNjID0gKG51bSA+PiAyOCkgJiAweDc7CisgIGlmIChvcC0+Zm9ybWF0WzFdKQorICAgIHJldHVybiAyOworICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgCitwcmludF9pbnNuICggaW5mbywgbWVtYWRkciwgbnVtLCBpbnNuLCBpc19sb25nLCBzaG93X2V4dCApCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGxvbmcgbG9uZyBudW07CisgICAgIHN0cnVjdCBkMzB2X2luc24gKmluc247CisgICAgIGludCBpc19sb25nOworICAgICBpbnQgc2hvd19leHQ7Cit7CisgIGludCB2YWwsIG9wbnVtLCBuZWVkX2NvbW1hPTA7CisgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXI7CisgIGludCBpLCBtYXRjaCwgb3BpbmQ9MCwgbmVlZF9wYXJlbj0wLCBmb3VuZF9jb250cm9sPTA7CisKKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsaW5zbi0+b3AtPm5hbWUpOworCisgIC8qIGNoZWNrIGZvciBDTVAgb3IgQ01QVSAqLworICBpZiAoZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXS5mbGFncyAmIE9QRVJBTkRfTkFNRSkKKyAgICB7CisgICAgICBvcGluZCsrOworICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzBdXSxpc19sb25nKTsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQzMHZfY2NfbmFtZXNbdmFsXSk7CisgICAgfQorCisgIC8qIGFkZCBpbiAiLnMiIG9yICIubCIgKi8KKyAgaWYgKHNob3dfZXh0ID09IDIpCisgICAgeworICAgICAgaWYgKGlzX2xvbmcpCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubCIpOworICAgICAgZWxzZQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLnMiKTsKKyAgICB9CisKKyAgaWYgKGluc24tPmVjYykKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8lcyIsZDMwdl9lY2NfbmFtZXNbaW5zbi0+ZWNjXSk7CisKKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOworCisgIHdoaWxlICgob3BudW0gPSBpbnNuLT5mb3JtLT5vcGVyYW5kc1tvcGluZCsrXSkgIT0gMCkKKyAgICB7CisgICAgICBpbnQgYml0czsKKyAgICAgIG9wZXIgPSAoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbb3BudW1dOworICAgICAgYml0cyA9IG9wZXItPmJpdHM7CisgICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQorCWJpdHMgKz0gMzsKKworICAgICAgaWYgKG5lZWRfY29tbWEgJiYgb3Blci0+ZmxhZ3MgIT0gT1BFUkFORF9QTFVTICYmIG9wZXItPmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCisJeworCSAgbmVlZF9jb21tYT0wOworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOworCX0KKworICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRNSU5VUykKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAtIik7CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9NSU5VUykKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsgICAKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX1BMVVMpCisJeworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7ICAgCisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFNJR04pCisJeworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAIik7ICAgCisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVFBBUikKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7ICAgCisJICBuZWVkX3BhcmVuID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfU1BFQ0lBTCkKKwljb250aW51ZTsKKworICAgICAgdmFsID0gZXh0cmFjdF92YWx1ZShudW0sIG9wZXIsIGlzX2xvbmcpOworICAgICAgCisgICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1JFRykKKwl7CisJICBtYXRjaCA9IDA7CisJICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyMyA9IAorCQkoc3RydWN0IGQzMHZfb3BlcmFuZCAqKSZkMzB2X29wZXJhbmRfdGFibGVbaW5zbi0+Zm9ybS0+b3BlcmFuZHNbMl1dOwkgICAgICAKKwkgICAgICBpbnQgaWQgPSBleHRyYWN0X3ZhbHVlIChudW0sIG9wZXIzLCBpc19sb25nICk7CisJICAgICAgZm91bmRfY29udHJvbCA9IDE7CisJICAgICAgc3dpdGNoICggaWQgKQorCQl7CisJCWNhc2UgMDoKKwkJICB2YWwgfD0gT1BFUkFORF9DT05UUk9MOworCQkgIGJyZWFrOworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJICB2YWwgPSBPUEVSQU5EX0NPTlRST0wgKyBNQVhfQ09OVFJPTF9SRUcgKyBpZDsKKwkJICBicmVhazsKKwkJY2FzZSAzOgorCQkgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgZnByaW50ZihzdGRlcnIsImlsbGVnYWwgaWQgKCVkKVxuIixpZCk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FDQykKKwkgICAgdmFsIHw9IE9QRVJBTkRfQUNDOworCSAgZWxzZSBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCisJICAgIHZhbCB8PSBPUEVSQU5EX0ZMQUc7CisJICBmb3IgKGk9MDtpPHJlZ19uYW1lX2NudCgpO2krKykKKwkgICAgeworCSAgICAgIGlmICh2YWwgPT0gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQorCQl7CisJCSAgaWYgKHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSkKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQorCQkgICAgICAoaW5mby0+c3RyZWFtLCAiJXMiLHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5wbmFtZSk7CisJCSAgZWxzZQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCisJCSAgICAgIChpbmZvLT5zdHJlYW0sICIlcyIscHJlX2RlZmluZWRfcmVnaXN0ZXJzW2ldLm5hbWUpOworCQkgIG1hdGNoPTE7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgaWYgKG1hdGNoPT0wKQorCSAgICB7CisJICAgICAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAorCQkgcmVnaXN0ZXIgdGFibGUgKi8KKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKKwkJKGluZm8tPnN0cmVhbSwgXygiPHVua25vd24gcmVnaXN0ZXIgJWQ+IiksIHZhbCAmIDB4M0YpOwkgICAgICAKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX1BDUkVMIHx8IAorCSAgICAgICAob3BpbmQgPT0gMSAmJiAoaW5zbi0+Zm9ybS0+Zm9ybSA9PSBTSE9SVF9EMiB8fCBpbnNuLT5mb3JtLT5mb3JtID09IExPTkdfRCkpKQorCXsKKwkgIGxvbmcgbWF4OworCSAgaW50IG5lZz0wOworCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSk7CisJICBpZiAodmFsICYgbWF4KQorCSAgICB7CisJICAgICAgaWYgKGJpdHMgPT0gMzIpCisJCXZhbCA9IC12YWw7CisJICAgICAgZWxzZQorCQl2YWwgPSAtdmFsICYgKCgxIDw8IGJpdHMpLTEpOworCSAgICAgIG5lZyA9IDE7CisJICAgIH0KKwkgIGlmIChvcGluZCA9PSAxICYmIChpbnNuLT5mb3JtLT5mb3JtID09IFNIT1JUX0QyIHx8IGluc24tPmZvcm0tPmZvcm0gPT0gTE9OR19EKSkKKwkgICAgeworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXgiLHZhbCk7CisJICAgIH0KKwkgIGVsc2UgeworCSAgICBpZiAobmVnKQorCSAgICAgIHsKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXhcdCgiLHZhbCk7CisJCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgLSB2YWwpICYgUENfTUFTSywgaW5mbyk7CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleFx0KCIsdmFsKTsKKwkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIHZhbCkgJiBQQ19NQVNLLCBpbmZvKTsKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7CisJICAgICAgfQorCSAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGluc24tPm9wLT5yZWxvY19mbGFnID09IFJFTE9DX0FCUykKKwl7CisJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfU0lHTkVEKQorCSAgICB7CisJICAgICAgaW50IG1heCA9ICgxIDw8IChiaXRzIC0gMSkpOworCSAgICAgIGlmICh2YWwgJiBtYXgpCisJCXsKKwkJICB2YWwgPSAtdmFsOworCQkgIGlmIChiaXRzIDwgMzIpCisJCSAgICB2YWwgJj0gKCgxIDw8IGJpdHMpIC0gMSk7CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7CisJCX0KKwkgICAgfQorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4Iix2YWwpOworCX0KKyAgICAgIC8qIGlmIHRoZXJlIGlzIGFub3RoZXIgb3BlcmFuZCwgdGhlbiB3cml0ZSBhIGNvbW1hIGFuZCBzcGFjZSAqLworICAgICAgaWYgKGluc24tPmZvcm0tPm9wZXJhbmRzW29waW5kXSAmJiAhKGZvdW5kX2NvbnRyb2wgJiYgb3BpbmQgPT0gMikpCisJbmVlZF9jb21tYSA9IDE7CisgICAgfQorICBpZiAobmVlZF9wYXJlbikKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKK30KKworCisKK3N0YXRpYyBpbnQKK2V4dHJhY3RfdmFsdWUgKG51bSwgb3BlciwgaXNfbG9uZykKKyAgICAgbG9uZyBsb25nIG51bTsKKyAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjsKKyAgICAgaW50IGlzX2xvbmc7Cit7CisgIGludCB2YWw7CisgIGludCBzaGlmdCA9IDEyIC0gb3Blci0+cG9zaXRpb247CisgIGludCBtYXNrID0gKDB4RkZGRkZGRkYgPj4gKDMyIC0gb3Blci0+Yml0cykpOworCisgIGlmIChpc19sb25nKQorICAgIHsKKyAgICAgIGlmIChvcGVyLT5iaXRzID09IDMyKSAKKwl7CisJICAvKiBwaWVjZSB0b2dldGhlciAzMi1iaXQgY29uc3RhbnQgKi8KKwkgIHZhbCA9ICgobnVtICYgMHgzRkZGRikKKwkJIHwgKChudW0gJiAweEZGMDAwMDApID4+IDIpCisJCSB8ICgobnVtICYgMHgzRjAwMDAwMDAwTEwpID4+IDYpKTsKKwl9CisgICAgICBlbHNlCQorCXZhbCA9IChudW0gPj4gKDMyICsgc2hpZnQpKSAmIG1hc2s7CQorICAgIH0KKyAgZWxzZQorICAgIHZhbCA9IChudW0gPj4gc2hpZnQpICYgbWFzazsKKworICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQorICAgIHZhbCA8PD0gMzsKKworICByZXR1cm4gdmFsOworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMzB2LW9wYy5jIGIvb3Bjb2Rlcy9kMzB2LW9wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2QzMHYtb3BjLmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qIGQzMHYtb3BjLmMgLS0gRDMwViBvcGNvZGUgbGlzdAorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiCisKKworLyogVGhpcyB0YWJsZSBpcyBzb3J0ZWQuICovCisvKiBJZiB5b3UgYWRkIGFueXRoaW5nLCBpdCBNVVNUIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlciAqLworLyogVGhlIGZpcnN0IGZpZWxkIGlzIHRoZSBuYW1lIHRoZSBhc3NlbWJsZXIgdXNlcyB3aGVuIGxvb2tpbmcgKi8KKy8qIHVwIG9yY29kZXMuICBUaGUgc2Vjb25kIGZpZWxkIGlzIHRoZSBuYW1lIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCB1c2UuICovCisvKiBUaGlzIGFsbG93cyB0aGUgYXNzZW1ibGVyIHRvIGFzc2VtYmxlIHJlZmVyZW5jZXMgdG8gcjYzIChmb3IgZXhhbXBsZSkgKi8KKy8qIG9yICJzcCIuICBUaGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHVzZSB0aGUgcHJlZmVycmVkIGZvcm0gKHNwKSAqLworY29uc3Qgc3RydWN0IHBkX3JlZyBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbXSA9Cit7CisgIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MrMCB9LAorICB7ICJhMSIsIE5VTEwsIE9QRVJBTkRfQUNDKzEgfSwKKyAgeyAiYnBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMgfSwKKyAgeyAiYnBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCisgIHsgImMiLCAiYyIsIE9QRVJBTkRfRkxBRys3IH0sCisgIHsgImNyMCIsICJwc3ciLCBPUEVSQU5EX0NPTlRST0wgfSwKKyAgeyAiY3IxIiwgImJwc3ciLCBPUEVSQU5EX0NPTlRST0wrMSB9LAorICB7ICJjcjEwIiwgIm1vZF9zIiwgT1BFUkFORF9DT05UUk9MKzEwIH0sCisgIHsgImNyMTEiLCAibW9kX2UiLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKKyAgeyAiY3IxMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMiB9LAorICB7ICJjcjEzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEzIH0sCisgIHsgImNyMTQiLCAiaWJhIiwgT1BFUkFORF9DT05UUk9MKzE0IH0sCisgIHsgImNyMTUiLCAiZWl0X3ZiIiwgT1BFUkFORF9DT05UUk9MKzE1IH0sCisgIHsgImNyMTYiLCAiaW50X3MiLCBPUEVSQU5EX0NPTlRST0wrMTYgfSwKKyAgeyAiY3IxNyIsICJpbnRfbSIsIE9QRVJBTkRfQ09OVFJPTCsxNyB9LAorICB7ICJjcjE4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE4IH0sCisgIHsgImNyMTkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTkgfSwKKyAgeyAiY3IyIiwgInBjIiwgT1BFUkFORF9DT05UUk9MKzIgfSwKKyAgeyAiY3IyMCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMCB9LAorICB7ICJjcjIxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIxIH0sCisgIHsgImNyMjIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjIgfSwKKyAgeyAiY3IyMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMyB9LAorICB7ICJjcjI0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI0IH0sCisgIHsgImNyMjUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjUgfSwKKyAgeyAiY3IyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNiB9LAorICB7ICJjcjI3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI3IH0sCisgIHsgImNyMjgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjggfSwKKyAgeyAiY3IyOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyOSB9LAorICB7ICJjcjMiLCAiYnBjIiwgT1BFUkFORF9DT05UUk9MKzMgfSwKKyAgeyAiY3IzMCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMCB9LAorICB7ICJjcjMxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMxIH0sCisgIHsgImNyMzIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzIgfSwKKyAgeyAiY3IzMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMyB9LAorICB7ICJjcjM0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM0IH0sCisgIHsgImNyMzUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzUgfSwKKyAgeyAiY3IzNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNiB9LAorICB7ICJjcjM3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM3IH0sCisgIHsgImNyMzgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzggfSwKKyAgeyAiY3IzOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszOSB9LAorICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCisgIHsgImNyNDAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDAgfSwKKyAgeyAiY3I0MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MSB9LAorICB7ICJjcjQyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQyIH0sCisgIHsgImNyNDMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDMgfSwKKyAgeyAiY3I0NCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NCB9LAorICB7ICJjcjQ1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ1IH0sCisgIHsgImNyNDYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDYgfSwKKyAgeyAiY3I0NyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NyB9LAorICB7ICJjcjQ4IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ4IH0sCisgIHsgImNyNDkiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDkgfSwKKyAgeyAiY3I1IiwiZHBjIiwgT1BFUkFORF9DT05UUk9MKzUgfSwKKyAgeyAiY3I1MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MCB9LAorICB7ICJjcjUxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUxIH0sCisgIHsgImNyNTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTIgfSwKKyAgeyAiY3I1MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MyB9LAorICB7ICJjcjU0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU0IH0sCisgIHsgImNyNTUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTUgfSwKKyAgeyAiY3I1NiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NiB9LAorICB7ICJjcjU3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU3IH0sCisgIHsgImNyNTgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTggfSwKKyAgeyAiY3I1OSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1OSB9LAorICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAorICB7ICJjcjYwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYwIH0sCisgIHsgImNyNjEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjEgfSwKKyAgeyAiY3I2MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MiB9LAorICB7ICJjcjYzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYzIH0sCisgIHsgImNyNyIsICJycHRfYyIsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCisgIHsgImNyOCIsICJycHRfcyIsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCisgIHsgImNyOSIsICJycHRfZSIsIE9QRVJBTkRfQ09OVFJPTCs5IH0sCisgIHsgImRwYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1IH0sCisgIHsgImRwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNCB9LAorICB7ICJlaXRfdmIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKKyAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMCB9LAorICB7ICJmMSIsIE5VTEwsIE9QRVJBTkRfRkxBRysxIH0sCisgIHsgImYyIiwgTlVMTCwgT1BFUkFORF9GTEFHKzIgfSwKKyAgeyAiZjMiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMyB9LAorICB7ICJmNCIsICJzIiwgT1BFUkFORF9GTEFHKzQgfSwKKyAgeyAiZjUiLCAidiIsIE9QRVJBTkRfRkxBRys1IH0sCisgIHsgImY2IiwgInZhIiwgT1BFUkFORF9GTEFHKzYgfSwKKyAgeyAiZjciLCAiYyIsIE9QRVJBTkRfRkxBRys3IH0sCisgIHsgImliYSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAorICB7ICJpbnRfbSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNyB9LAorICB7ICJpbnRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNiB9LAorICB7ICJsaW5rIiwgInI2MiIsIDYyIH0sCisgIHsgIm1vZF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzExIH0sCisgIHsgIm1vZF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEwIH0sCisgIHsgInBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIgfSwKKyAgeyAicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MIH0sCisgIHsgInBzd2giLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrTUFYX0NPTlRST0xfUkVHKzIgfSwKKyAgeyAicHN3bCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMSB9LAorICB7ICJyMCIsIE5VTEwsIDAgfSwKKyAgeyAicjEiLCBOVUxMLCAxIH0sCisgIHsgInIxMCIsIE5VTEwsIDEwIH0sCisgIHsgInIxMSIsIE5VTEwsIDExIH0sCisgIHsgInIxMiIsIE5VTEwsIDEyIH0sCisgIHsgInIxMyIsIE5VTEwsIDEzIH0sCisgIHsgInIxNCIsIE5VTEwsIDE0IH0sCisgIHsgInIxNSIsIE5VTEwsIDE1IH0sCisgIHsgInIxNiIsIE5VTEwsIDE2IH0sCisgIHsgInIxNyIsIE5VTEwsIDE3IH0sCisgIHsgInIxOCIsIE5VTEwsIDE4IH0sCisgIHsgInIxOSIsIE5VTEwsIDE5IH0sCisgIHsgInIyIiwgTlVMTCwgMiB9LAorICB7ICJyMjAiLCBOVUxMLCAyMCB9LAorICB7ICJyMjEiLCBOVUxMLCAyMSB9LAorICB7ICJyMjIiLCBOVUxMLCAyMiB9LAorICB7ICJyMjMiLCBOVUxMLCAyMyB9LAorICB7ICJyMjQiLCBOVUxMLCAyNCB9LAorICB7ICJyMjUiLCBOVUxMLCAyNSB9LAorICB7ICJyMjYiLCBOVUxMLCAyNiB9LAorICB7ICJyMjciLCBOVUxMLCAyNyB9LAorICB7ICJyMjgiLCBOVUxMLCAyOCB9LAorICB7ICJyMjkiLCBOVUxMLCAyOSB9LAorICB7ICJyMyIsIE5VTEwsIDMgfSwKKyAgeyAicjMwIiwgTlVMTCwgMzAgfSwKKyAgeyAicjMxIiwgTlVMTCwgMzEgfSwKKyAgeyAicjMyIiwgTlVMTCwgMzIgfSwKKyAgeyAicjMzIiwgTlVMTCwgMzMgfSwKKyAgeyAicjM0IiwgTlVMTCwgMzQgfSwKKyAgeyAicjM1IiwgTlVMTCwgMzUgfSwKKyAgeyAicjM2IiwgTlVMTCwgMzYgfSwKKyAgeyAicjM3IiwgTlVMTCwgMzcgfSwKKyAgeyAicjM4IiwgTlVMTCwgMzggfSwKKyAgeyAicjM5IiwgTlVMTCwgMzkgfSwKKyAgeyAicjQiLCBOVUxMLCA0IH0sCisgIHsgInI0MCIsIE5VTEwsIDQwIH0sCisgIHsgInI0MSIsIE5VTEwsIDQxIH0sCisgIHsgInI0MiIsIE5VTEwsIDQyIH0sCisgIHsgInI0MyIsIE5VTEwsIDQzIH0sCisgIHsgInI0NCIsIE5VTEwsIDQ0IH0sCisgIHsgInI0NSIsIE5VTEwsIDQ1IH0sCisgIHsgInI0NiIsIE5VTEwsIDQ2IH0sCisgIHsgInI0NyIsIE5VTEwsIDQ3IH0sCisgIHsgInI0OCIsIE5VTEwsIDQ4IH0sCisgIHsgInI0OSIsIE5VTEwsIDQ5IH0sCisgIHsgInI1IiwgTlVMTCwgNSB9LAorICB7ICJyNTAiLCBOVUxMLCA1MCB9LAorICB7ICJyNTEiLCBOVUxMLCA1MSB9LAorICB7ICJyNTIiLCBOVUxMLCA1MiB9LAorICB7ICJyNTMiLCBOVUxMLCA1MyB9LAorICB7ICJyNTQiLCBOVUxMLCA1NCB9LAorICB7ICJyNTUiLCBOVUxMLCA1NSB9LAorICB7ICJyNTYiLCBOVUxMLCA1NiB9LAorICB7ICJyNTciLCBOVUxMLCA1NyB9LAorICB7ICJyNTgiLCBOVUxMLCA1OCB9LAorICB7ICJyNTkiLCBOVUxMLCA1OSB9LAorICB7ICJyNiIsIE5VTEwsIDYgfSwKKyAgeyAicjYwIiwgTlVMTCwgNjAgfSwKKyAgeyAicjYxIiwgTlVMTCwgNjEgfSwKKyAgeyAicjYyIiwgImxpbmsiLCA2MiB9LAorICB7ICJyNjMiLCAic3AiLCA2MyB9LAorICB7ICJyNyIsIE5VTEwsIDcgfSwKKyAgeyAicjgiLCBOVUxMLCA4IH0sCisgIHsgInI5IiwgTlVMTCwgOSB9LAorICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCisgIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKKyAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAorICB7ICJzIiwgTlVMTCwgT1BFUkFORF9GTEFHKzQgfSwKKyAgeyAic3AiLCBOVUxMLCA2MyB9LAorICB7ICJ2IiwgTlVMTCwgT1BFUkFORF9GTEFHKzUgfSwKKyAgeyAidmEiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNiB9LAorfTsKKworaW50IAorcmVnX25hbWVfY250KCkKK3sKKyAgcmV0dXJuIChzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSk7Cit9CisKKy8qIE9QQ09ERSBUQUJMRSAqLworLyogVGhlIGZvcm1hdCBvZiB0aGlzIHRhYmxlIGlzIGRlZmluZWQgaW4gb3Bjb2RlL2QzMHYuaCAqLworY29uc3Qgc3RydWN0IGQzMHZfb3Bjb2RlIGQzMHZfb3Bjb2RlX3RhYmxlW10gPSB7CisgIHsgImFicyIsIElBTFUxLCAweDgsIHsgU0hPUlRfVSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAiYWRkIiwgSUFMVTEsIDB4MCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCBGTEFHX0NWVkEsIDAgfSwKKyAgeyAiYWRkMmgiLCBJQUxVMSwgMHgxLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAiYWRkYyIsIElBTFUxLCAweDQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQywgRkxBR19DVlZBLCAwIH0sCisgIHsgImFkZGhsbGwiLCBJQUxVMSwgMHgxMCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJhZGRobGxoIiwgSUFMVTEsIDB4MTEsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKKyAgeyAiYWRkaGxobCIsIElBTFUxLCAweDEyLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCisgIHsgImFkZGhsaGgiLCBJQUxVMSwgMHgxMywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJhZGRoaGxsIiwgSUFMVTEsIDB4MTQsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKKyAgeyAiYWRkaGhsaCIsIElBTFUxLCAweDE1LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCisgIHsgImFkZGhoaGwiLCBJQUxVMSwgMHgxNiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJhZGRoaGhoIiwgSUFMVTEsIDB4MTcsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKKyAgeyAiYWRkcyIsIElBTFUxLCAweDYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJhZGRzMmgiLCBJQUxVMSwgMHg3LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgImFuZCIsIExPR0lDLCAweDE4LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgImFuZGZnIiwgTE9HSUMsIDB4OCwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJhdmciLCBJQUxVMSwgMHhhLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAiYXZnMmgiLCBJQUxVMSwgMHhiLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAiYmNsciIsIExPR0lDLCAweDMsIHsgU0hPUlRfQSB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAorICB7ICJibm90IiwgTE9HSUMsIDB4MSwgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCisgIHsgImJyYSIsIEJSQSwgMCwgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCisgIHsgImJyYXRueiIsIEJSQSwgMHg0LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCisgIHsgImJyYXR6ciIsIEJSQSwgMHg0LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19QQ1JFTCB9LAorICB7ICJic2V0IiwgTE9HSUMsIDB4MiwgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCisgIHsgImJzciIsIEJSQSwgMHgyLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKKyAgeyAiYnNydG56IiwgQlJBLCAweDYsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKKyAgeyAiYnNydHpyIiwgQlJBLCAweDYsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX1BDUkVMIH0sCisgIHsgImJ0c3QiLCBMT0dJQywgMCwgeyBTSE9SVF9BRiB9LCBFSVRIRVJfQlVUX1BSRUZFUl9NVSwgMCwgMCwgMCB9LAorICB7ICJjbXAiLCBMT0dJQywgMHhDLCB7IFNIT1JUX0NNUCwgTE9OR19DTVAgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgImNtcHUiLCBMT0dJQywgMHhELCB7IFNIT1JUX0NNUFUsIExPTkdfQ01QIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJkYnJhIiwgQlJBLCAweDEwLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKKyAgeyAiZGJyYWkiLCBCUkEsIDB4MTQsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAorICB7ICJkYnNyIiwgQlJBLCAweDEyLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKKyAgeyAiZGJzcmkiLCBCUkEsIDB4MTYsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAorICB7ICJkYnQiLCBCUkEsIDB4YiwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX0pTUiwgRkxBR19MS1IsIDAgfSwKKyAgeyAiZGptcCIsIEJSQSwgMHgxMSwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAorICB7ICJkam1waSIsIEJSQSwgMHgxNSwgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX0FCUyB9LAorICB7ICJkanNyIiwgQlJBLCAweDEzLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCisgIHsgImRqc3JpIiwgQlJBLCAweDE3LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSlNSIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCisgIHsgImptcCIsIEJSQSwgMHgxLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCisgIHsgImptcHRueiIsIEJSQSwgMHg1LCB7IFNIT1JUX0IzYiwgTE9OR18yYiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX0FCUyB9LAorICB7ICJqbXB0enIiLCBCUkEsIDB4NSwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCisgIHsgImpvaW5sbCIsIElBTFUxLCAweEMsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAiam9pbmxoIiwgSUFMVTEsIDB4RCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJqb2luaGwiLCBJQUxVMSwgMHhFLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgImpvaW5oaCIsIElBTFUxLCAweEYsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAianNyIiwgQlJBLCAweDMsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKKyAgeyAianNydG56IiwgQlJBLCAweDcsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfQUJTIH0sCisgIHsgImpzcnR6ciIsIEJSQSwgMHg3LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKKyAgeyAibGQyaCIsIElNRU0sIDB4MywgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKKyAgeyAibGQydyIsIElNRU0sIDB4NiwgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgRkxBR19NRU0gfCBGTEFHXzJXT1JELCAwLCAwIH0sCisgIHsgImxkNGJoIiwgSU1FTSwgMHg1LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAsIDAgfSwKKyAgeyAibGQ0Ymh1IiwgSU1FTSwgMHhkLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAorICB7ICJsZGIiLCBJTUVNLCAwLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKKyAgeyAibGRidSIsIElNRU0sIDB4OSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCisgIHsgImxkaCIsIElNRU0sIDB4MiwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCisgIHsgImxkaGgiLCBJTUVNLCAweDEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAorICB7ICJsZGh1IiwgSU1FTSwgMHhhLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKKyAgeyAibGR3IiwgSU1FTSwgMHg0LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKKyAgeyAibWFjMCIsIElBTFUyLCAweDE0LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKKyAgeyAibWFjMSIsIElBTFUyLCAweDE0LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCisgIHsgIm1hY3MwIiwgSUFMVTIsIDB4MTUsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAorICB7ICJtYWNzMSIsIElBTFUyLCAweDE1LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCisgIHsgIm1vZGRlYyIsIElNRU0sIDB4NywgeyBTSE9SVF9NT0RERUMgfSwgTVUsIDAsIDAsIDAgfSwKKyAgeyAibW9kaW5jIiwgSU1FTSwgMHg3LCB7IFNIT1JUX01PRElOQyB9LCBNVSwgMCwgMCwgMCB9LAorICB7ICJtc3ViMCIsIElBTFUyLCAweDE2LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKKyAgeyAibXN1YjEiLCBJQUxVMiwgMHgxNiwgeyBTSE9SVF9BMSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAorICB7ICJtc3ViczAiLCBJQUxVMiwgMHgxNywgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCisgIHsgIm1zdWJzMSIsIElBTFUyLCAweDE3LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCisgIHsgIm11bCIsIElBTFUyLCAweDEwLCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKKyAgeyAibXVsMmgiLCBJQUxVMiwgMCwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCisgIHsgIm11bGh4bGwiLCBJQUxVMiwgMHg0LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKKyAgeyAibXVsaHhsaCIsIElBTFUyLCAweDUsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAorICB7ICJtdWxoeGhsIiwgSUFMVTIsIDB4NiwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCisgIHsgIm11bGh4aGgiLCBJQUxVMiwgMHg3LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKKyAgeyAibXVseCIsIElBTFUyLCAweDE4LCB7IFNIT1JUX0FBIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCisgIHsgIm11bHgyaCIsIElBTFUyLCAweDEsIHsgU0hPUlRfQTIgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKKyAgeyAibXVseHMiLCBJQUxVMiwgMHgxOSwgeyBTSE9SVF9BQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAorICB7ICJtdmZhY2MiLCBJQUxVMiwgMHgxZiwgeyBTSE9SVF9SQSB9LCBJVSwgMCwgMCwgMCB9LAorICB7ICJtdmZzeXMiLCBCUkEsIDB4MWUsIHsgU0hPUlRfQzEgfSwgTVUsIEZMQUdfQUxMLCBGTEFHX0FMTCwgMCB9LAorICB7ICJtdnRhY2MiLCBJQUxVMiwgMHhmLCB7IFNIT1JUX0FBIH0sIElVLCAwLCAwLCAwIH0sCisgIHsgIm12dHN5cyIsIEJSQSwgMHhlLCB7IFNIT1JUX0MyIH0sIE1VLCBGTEFHX0FMTCwgRkxBR19BTEwsIDAgfSwKKyAgeyAibm9wIiwgQlJBLCAweEYsIHsgU0hPUlRfTk9ORSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAibm90IiwgTE9HSUMsIDB4MTksIHsgU0hPUlRfVSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAibm90ZmciLCBMT0dJQywgMHg5LCB7IFNIT1JUX1VGIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJvciIsIExPR0lDLCAweDFhLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgIm9yZmciLCBMT0dJQywgMHhhLCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgInJlaXQiLCBCUkEsIDB4OCwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX1NNIHwgRkxBR19KTVAsIEZMQUdfU00gfCBGTEFHX0xLUiwgMCB9LAorICB7ICJyZXBlYXQiLCBCUkEsIDB4MTgsIHsgU0hPUlRfRDEsIExPTkdfMiB9LCBNVSwgRkxBR19SUCwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKKyAgeyAicmVwZWF0aSIsIEJSQSwgMHgxYSwgeyBTSE9SVF9EMkIsIExPTkdfRGIgfSwgTVUsIEZMQUdfUlAsIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCisgIHsgInJvdCIsIExPR0lDLCAweDE0LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgInJvdDJoIiwgTE9HSUMsIDB4MTUsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAicnRkIiwgQlJBLCAweGEsIHsgU0hPUlRfTk9ORSB9LCBNVSwgRkxBR19KTVAsIEZMQUdfTEtSLCAwIH0sCisgIHsgInNhdCIsIElBTFUyLCAweDgsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKKyAgeyAic2F0MmgiLCBJQUxVMiwgMHg5LCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCisgIHsgInNhdGhsIiwgSUFMVTIsIDB4MWMsIHsgU0hPUlRfQTUgfSwgSVUsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCisgIHsgInNhdGhoIiwgSUFMVTIsIDB4MWQsIHsgU0hPUlRfQTUgfSwgSVUsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCisgIHsgInNhdHoiLCBJQUxVMiwgMHhhLCB7IFNIT1JUX0E1IH0sIElVLCAwLCAwLCAwIH0sCisgIHsgInNhdHoyaCIsIElBTFUyLCAweGIsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKKyAgeyAic3JhIiwgTE9HSUMsIDB4MTAsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAic3JhMmgiLCBMT0dJQywgMHgxMSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJzcmFoaCIsIExPR0lDLCAweDUsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAic3JhaGwiLCBMT0dJQywgMHg0LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgInNyYyIsIExPR0lDLCAweDE2LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgMCwgMCB9LAorICB7ICJzcmwiLCBMT0dJQywgMHgxMiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJzcmwyaCIsIExPR0lDLCAweDEzLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCisgIHsgInNybGhoIiwgTE9HSUMsIDB4NywgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJzcmxobCIsIExPR0lDLCAweDYsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyAic3QyaCIsIElNRU0sIDB4MTMsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCisgIHsgInN0MnciLCBJTUVNLCAweDE2LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAgfSwKKyAgeyAic3Q0aGIiLCBJTUVNLCAweDE1LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCAwLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAgfSwKKyAgeyAic3RiIiwgSU1FTSwgMHgxMCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCisgIHsgInN0aCIsIElNRU0sIDB4MTIsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAorICB7ICJzdGhoIiwgSU1FTSwgMHgxMSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCisgIHsgInN0dyIsIElNRU0sIDB4MTQsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCAwLCBGTEFHX01FTSwgMCB9LAorICB7ICJzdWIiLCBJQUxVMSwgMHgyLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWIyaCIsIElBTFUxLCAweDMsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJzdWJiIiwgSUFMVTEsIDB4NSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0MsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJobGxsIiwgSUFMVTEsIDB4MTgsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJobGxoIiwgSUFMVTEsIDB4MTksIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJobGhsIiwgSUFMVTEsIDB4MWEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJobGhoIiwgSUFMVTEsIDB4MWIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJoaGxsIiwgSUFMVTEsIDB4MWMsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJoaGxoIiwgSUFMVTEsIDB4MWQsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJoaGhsIiwgSUFMVTEsIDB4MWUsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJzdWJoaGhoIiwgSUFMVTEsIDB4MWYsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAorICB7ICJ0cmFwIiwgQlJBLCAweDksIHsgU0hPUlRfQjEsIFNIT1JUX1R9LCBNVSwgRkxBR19KU1IsIEZMQUdfU00gfCBGTEFHX0xLUiwgMCB9LAorICB7ICJ4b3IiLCBMT0dJQywgMHgxYiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAorICB7ICJ4b3JmZyIsIExPR0lDLCAweGIsIHsgU0hPUlRfRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKKyAgeyBOVUxMLCAwLCAwLCB7IDAgfSwgMCwgMCwgMCwgMCB9LAorfTsKKworCisvKiBub3cgZGVmaW5lIHRoZSBvcGVyYW5kIHR5cGVzICovCisvKiBmb3JtYXQgaXMgbGVuZ3RoLCBiaXRzLCBwb3NpdGlvbiwgZmxhZ3MgKi8KK2NvbnN0IHN0cnVjdCBkMzB2X29wZXJhbmQgZDMwdl9vcGVyYW5kX3RhYmxlW10gPQoreworI2RlZmluZSBVTlVTRUQJKDApCisgIHsgMCwgMCwgMCwgMCB9LAorI2RlZmluZSBSYQkoVU5VU0VEICsgMSkKKyAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1QgfSwKKyNkZWZpbmUgUmEyCShSYSArIDEpCisgIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9ERVNUfE9QRVJBTkRfMlJFRyB9LAorI2RlZmluZSBSYTMJKFJhMiArIDEpCisgIHsgNiwgNiwgMCwgT1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgUmIJKFJhMyArIDEpCisgIHsgNiwgNiwgNiwgT1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgUmMJKFJiICsgMSkKKyAgeyA2LCA2LCAxMiwgT1BFUkFORF9SRUcgfSwKKyNkZWZpbmUgQWEJKFJjICsgMSkKKyAgeyA2LCAxLCAwLCBPUEVSQU5EX0FDQ3xPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1QgfSwKKyNkZWZpbmUgQWIJKEFhICsgMSkKKyAgeyA2LCAxLCA2LCBPUEVSQU5EX0FDQ3xPUEVSQU5EX1JFRyB9LAorI2RlZmluZSBJTU01CShBYiArIDEpCisgIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNIH0sCisjZGVmaW5lIElNTTVVCShJTU01ICsgMSkKKyAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKKyNkZWZpbmUgSU1NNVMzCShJTU01VSArIDEpCisgIHsgNiwgNSwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCisjZGVmaW5lIElNTTYJKElNTTVTMyArIDEpCisgIHsgNiwgNiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEIH0sCisjZGVmaW5lIElNTTZVCShJTU02ICsgMSkKKyAgeyA2LCA2LCAwLCBPUEVSQU5EX05VTSB9LAorI2RlZmluZSBJTU02VTIJKElNTTZVICsgMSkKKyAgeyA2LCA2LCAxMiwgT1BFUkFORF9OVU0gfSwKKyNkZWZpbmUgSU1NNlMzCShJTU02VTIgKyAxKQorICB7IDYsIDYsIDAsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKKyNkZWZpbmUgSU1NMTJTMwkoSU1NNlMzICsgMSkKKyAgeyAxMiwgMTIsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxPUEVSQU5EX1NISUZUIH0sCisjZGVmaW5lIElNTTEyUzNVIChJTU0xMlMzICsgMSkKKyAgeyAxMiwgMTIsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NISUZUIH0sCisjZGVmaW5lIElNTTE4UzMJKElNTTEyUzNVICsgMSkKKyAgeyAxOCwgMTgsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRHxPUEVSQU5EX1NISUZUIH0sCisjZGVmaW5lIElNTTMyCShJTU0xOFMzICsgMSkKKyAgeyAzMiwgMzIsIDAsIE9QRVJBTkRfTlVNIH0sCisjZGVmaW5lIEZhCShJTU0zMiArIDEpCisgIHsgNiwgMywgMCwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZMQUcgfCBPUEVSQU5EX0RFU1QgfSwKKyNkZWZpbmUgRmIJKEZhICsgMSkKKyAgeyA2LCAzLCA2LCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB9LAorI2RlZmluZSBGYwkoRmIgKyAxKQorICB7IDYsIDMsIDEyLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB9LAorI2RlZmluZSBBVFNJR04JKEZjICsgMSkKKyAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUU0lHTn0sCisjZGVmaW5lIEFUUEFSCShBVFNJR04gKyAxKQkvKiAiQCgiICovCisgIHsgMCwgMCwgMCwgT1BFUkFORF9BVFBBUn0sCisjZGVmaW5lIFBMVVMJKEFUUEFSICsgMSkJLyogcG9zdGluY3JlbWVudCAqLworICB7IDAsIDAsIDAsIE9QRVJBTkRfUExVU30sCisjZGVmaW5lIE1JTlVTCShQTFVTICsgMSkJLyogcG9zdGRlY3JlbWVudCAqLworICB7IDAsIDAsIDAsIE9QRVJBTkRfTUlOVVN9LAorI2RlZmluZSBBVE1JTlVTCShNSU5VUyArIDEpCS8qIHByZWRlY3JlbWVudCAqLworICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRNSU5VU30sCisjZGVmaW5lIENhCShBVE1JTlVTICsgMSkJLyogY29udHJvbCByZWdpc3RlciAqLworICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfQ09OVFJPTHxPUEVSQU5EX0RFU1R9LAorI2RlZmluZSBDYgkoQ2EgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCisgIHsgNiwgNiwgNiwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfSwKKyNkZWZpbmUgQ0MJKENiICsgMSkJLyogY29uZGl0aW9uIGNvZGUgKENNUGNjIGFuZCBDTVBVY2MpICovCisgIHsgMywgMywgLTMsIE9QRVJBTkRfTkFNRX0sCisjZGVmaW5lIEZhMgkoQ0MgKyAxKQkvKiBmbGFnIHJlZ2lzdGVyIChDTVBjYyBhbmQgQ01QVWNjKSAqLworICB7IDMsIDMsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfRkxBR3xPUEVSQU5EX0RFU1R9LAorI2RlZmluZSBGYWtlCShGYTIgKyAxKQkvKiBwbGFjZSBob2xkZXIgZm9yICJpZCIgZmllbGQgaW4gbXZmc3lzIGFuZCBtdnRzeXMgKi8KKyAgeyA2LCAyLCAxMiwgT1BFUkFORF9TUEVDSUFMfSwKK307CisKKy8qIG5vdyB3ZSBuZWVkIHRvIGRlZmluZSB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cyAqLworY29uc3Qgc3RydWN0IGQzMHZfZm9ybWF0IGQzMHZfZm9ybWF0X3RhYmxlW10gPQoreworICB7IDAsIDAsIHsgMCB9IH0sCisgIHsgU0hPUlRfTSwgMCwgeyBSYSwgQVRQQVIsIFJiLCBSYyB9IH0sCS8qIFJhLEAoUmIsUmMpICovCisgIHsgU0hPUlRfTSwgMSwgeyBSYSwgQVRQQVIsIFJiLCBQTFVTLCBSYyB9IH0sCS8qIFJhLEAoUmIrLFJjKSAqLworICB7IFNIT1JUX00sIDIsIHsgUmEsIEFUUEFSLCBSYiwgSU1NNiB9IH0sCS8qIFJhLEAoUmIsaW1tNikgKi8KKyAgeyBTSE9SVF9NLCAzLCB7IFJhLCBBVFBBUiwgUmIsIE1JTlVTLCBSYyB9IH0sCS8qIFJhLEAoUmItLFJjKSAqLworICB7IFNIT1JUX00yLCAwLCB7IFJhMiwgQVRQQVIsIFJiLCBSYyB9IH0sCS8qIFJhLEAoUmIsUmMpICovCisgIHsgU0hPUlRfTTIsIDEsIHsgUmEyLCBBVFBBUiwgUmIsIFBMVVMsIFJjIH0gfSwJLyogUmEsQChSYissUmMpICovCisgIHsgU0hPUlRfTTIsIDIsIHsgUmEyLCBBVFBBUiwgUmIsIElNTTYgfSB9LAkvKiBSYSxAKFJiLGltbTYpICovCisgIHsgU0hPUlRfTTIsIDMsIHsgUmEyLCBBVFBBUiwgUmIsIE1JTlVTLCBSYyB9IH0sCS8qIFJhLEAoUmItLFJjKSAqLworICB7IFNIT1JUX0EsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLworICB7IFNIT1JUX0EsIDIsIHsgUmEsIFJiLCBJTU02IH0gfSwJCS8qIFJhLFJiLGltbTYgKi8KKyAgeyBTSE9SVF9CMSwgMCwgeyBSYyB9IH0sCQkJLyogUmMgKi8KKyAgeyBTSE9SVF9CMiwgMiwgeyBJTU0xOFMzIH0gfSwJCQkvKiBpbW0xOCAqLworICB7IFNIT1JUX0IzLCAwLCB7IFJhMywgUmMgfSB9LAkJCS8qIFJhLFJjICovCisgIHsgU0hPUlRfQjMsIDIsIHsgUmEzLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyICovCisgIHsgU0hPUlRfQjNiLCAxLCB7IFJhMywgUmMgfSB9LAkJLyogUmEsUmMgKi8KKyAgeyBTSE9SVF9CM2IsIDMsIHsgUmEzLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyICovCisgIHsgU0hPUlRfRDEsIDAsIHsgUmEsIFJjIH0gfSwJCQkvKiBSYSxSYyAqLworICB7IFNIT1JUX0QxLCAyLCB7IFJhLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyczMgKi8KKyAgeyBTSE9SVF9EMiwgMCwgeyBJTU02UzMsIFJjIH0gfSwJCS8qIGltbTZzMyxSYyAqLworICB7IFNIT1JUX0QyLCAyLCB7IElNTTZTMywgSU1NMTJTMyB9IH0sCQkvKiBpbW02czMsaW1tMTJzMyAqLworICB7IFNIT1JUX0QyQiwgMCwgeyBJTU02VSwgUmMgfSB9LAkJLyogaW1tNnUsUmMgKi8KKyAgeyBTSE9SVF9EMkIsIDIsIHsgSU1NNlUsIElNTTEyUzNVIH0gfSwJLyogaW1tNnUsaW1tMTJzM3UgKi8KKyAgeyBTSE9SVF9VLCAwLCB7IFJhLCBSYiB9IH0sCQkJLyogUmEsUmIgKi8KKyAgeyBTSE9SVF9VLCAyLCB7IFJhLCBJTU0xMlMzIH0gfSwJCS8qIFJhLGltbTEyIChyZXBlYXQpICovCisgIHsgU0hPUlRfRiwgMCwgeyBGYSwgRmIsIEZjIH0gfSwJCS8qIEZhLEZiLEZjICAob3JmZywgeG9yZmcpICovCisgIHsgU0hPUlRfRiwgMiwgeyBGYSwgRmIsIElNTTYgfSB9LAkJLyogRmEsRmIsaW1tNiAqLworICB7IFNIT1JUX0FGLCAwLCB7IEZhLCBSYiwgUmMgfSB9LAkJLyogRmEsUmIsUmMgKi8KKyAgeyBTSE9SVF9BRiwgMiwgeyBGYSwgUmIsIElNTTYgfSB9LAkJLyogRmEsUmIsaW1tNiAqLworICB7IFNIT1JUX1QsIDIsIHsgSU1NNSB9IH0sCQkJLyogaW1tNXMzICAgKHRyYXApICovCisgIHsgU0hPUlRfQTUsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLworICB7IFNIT1JUX0E1LCAyLCB7IFJhLCBSYiwgSU1NNSB9IH0sCQkvKiBSYSxSYixpbW01ICAgIChzYXQqKSAqLworICB7IFNIT1JUX0NNUCwgMCwgeyBDQywgRmEyLCBSYiwgUmN9IH0sCQkvKiBDQyAgRmEyLFJiLFJjICovCisgIHsgU0hPUlRfQ01QLCAyLCB7IENDLCBGYTIsIFJiLCBJTU02fSB9LAkvKiBDQyAgRmEyLFJiLGltbTYgKi8KKyAgeyBTSE9SVF9DTVBVLCAwLCB7IENDLCBGYTIsIFJiLCBSY30gfSwJLyogQ0MgIEZhMixSYixSYyAqLworICB7IFNIT1JUX0NNUFUsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTZVMn0gfSwJLyogQ0MgIEZhMixSYixpbW02ICovCisgIHsgU0hPUlRfQTEsIDEsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyBmb3IgTUFDIHdoZXJlIGE9MSAqLworICB7IFNIT1JUX0ExLCAzLCB7IFJhLCBSYiwgSU1NNiB9IH0sCQkvKiBSYSxSYixpbW02IGZvciBNQUMgd2hlcmUgYT0xICovCisgIHsgU0hPUlRfQUEsIDAsIHsgQWEsIFJiLCBSYyB9IH0sCQkvKiBBYSxSYixSYyAqLworICB7IFNIT1JUX0FBLCAyLCB7IEFhLCBSYiwgSU1NNiB9IH0sCQkvKiBBYSxSYixpbW02ICovCisgIHsgU0hPUlRfUkEsIDAsIHsgUmEsIEFiLCBSYyB9IH0sCQkvKiBSYSxBYixSYyAqLworICB7IFNIT1JUX1JBLCAyLCB7IFJhLCBBYiwgSU1NNlUyIH0gfSwJCS8qIFJhLEFiLGltbTZ1ICovCisgIHsgU0hPUlRfTU9ESU5DLCAxLCB7IFJiLCBJTU01IH0gfSwJCS8qIFJiLGltbTUgKG1vZGluYykgKi8KKyAgeyBTSE9SVF9NT0RERUMsIDMsIHsgUmIsIElNTTUgfSB9LAkJLyogUmIsaW1tNSAobW9kZGVjKSAqLworICB7IFNIT1JUX0MxLCAwLCB7IFJhLCBDYiwgRmFrZSB9IH0sCQkvKiBSYSxDYiAobXZmc3lzKSAqLworICB7IFNIT1JUX0MyLCAwLCB7IENhLCBSYiwgRmFrZSB9IH0sCQkvKiBDYSxSYiAobXZ0c3lzKSAqLworICB7IFNIT1JUX1VGLCAwLCB7IEZhLCBGYiB9IH0sCQkJLyogRmEsRmIgIChub3RmZykgKi8KKyAgeyBTSE9SVF9BMiwgMCwgeyBSYTIsIFJiLCBSYyB9IH0sCQkvKiBSYTIsUmIsUmMgKi8KKyAgeyBTSE9SVF9BMiwgMiwgeyBSYTIsIFJiLCBJTU02IH0gfSwJCS8qIFJhMixSYixpbW02ICovCisgIHsgU0hPUlRfQTVTLCAwLCB7IFJhLCBSYiwgUmMgfSB9LAkJLyogUmEsUmIsUmMgKi8KKyAgeyBTSE9SVF9BNVMsIDIsIHsgUmEsIFJiLCBJTU01VSB9IH0sCQkvKiBSYSxSYixpbW01dSAgIChzaGlmdHMpICovCisgIHsgU0hPUlRfTk9ORSwgMCwgeyAwIH0gfSwJCQkvKiBubyBvcGVyYW5kcyAobm9wLCByZWl0KSAqLworICB7IExPTkcsIDIsIHsgUmEsIFJiLCBJTU0zMiB9IH0sCQkvKiBSYSxSYixpbW0zMiAqLworICB7IExPTkdfVSwgMiwgeyBJTU0zMiB9IH0sCQkJLyogaW1tMzIgKi8KKyAgeyBMT05HX0FGLCAyLCB7IEZhLCBSYiwgSU1NMzIgfSB9LAkJLyogRmEsUmIsaW1tMzIgKi8KKyAgeyBMT05HX0NNUCwgMiwgeyBDQywgRmEyLCBSYiwgSU1NMzJ9IH0sCS8qIENDICBGYTIsUmIsaW1tMzIgKi8KKyAgeyBMT05HX00sIDIsIHsgUmEsIEFUUEFSLCBSYiwgSU1NMzIgfSB9LAkvKiBSYSxAKFJiLGltbTMyKSAqLworICB7IExPTkdfTTIsIDIsIHsgUmEyLCBBVFBBUiwgUmIsIElNTTMyIH0gfSwJLyogUmEsQChSYixpbW0zMikgKi8KKyAgeyBMT05HXzIsIDIsIHsgUmEzLCBJTU0zMiB9IH0sCQkvKiBSYSxpbW0zMiAqLworICB7IExPTkdfMmIsIDMsIHsgUmEzLCBJTU0zMiB9IH0sCQkvKiBSYSxpbW0zMiAqLworICB7IExPTkdfRCwgMiwgeyBJTU02UzMsIElNTTMyIH0gfSwJCS8qIGltbTZzMyxpbW0zMiAqLworICB7IExPTkdfRGIsIDIsIHsgSU1NNlUsIElNTTMyIH0gfSwJCS8qIGltbTYsaW1tMzIgKi8KKyAgeyAwLCAwLCB7IDAgfSB9LAorfTsKKworY29uc3QgY2hhciAqZDMwdl9lY2NfbmFtZXNbXSA9Cit7CisgICJhbCIsCisgICJ0eCIsCisgICJmeCIsCisgICJ4dCIsCisgICJ4ZiIsCisgICJ0dCIsCisgICJ0ZiIsCisgICJyZXMiCit9OworCitjb25zdCBjaGFyICpkMzB2X2NjX25hbWVzW10gPQoreworICAiZXEiLAorICAibmUiLAorICAiZ3QiLAorICAiZ2UiLAorICAibHQiLAorICAibGUiLAorICAicHMiLAorICAibmciLAorICBOVUxMCit9OwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kZXAtaW4uc2VkIGIvb3Bjb2Rlcy9kZXAtaW4uc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGRlZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9kZXAtaW4uc2VkCkBAIC0wLDAgKzEsMjAgQEAKKzpsb29wCisvXFwkL04KK3MvXFxcbiAqLyAvZwordCBsb29wCisKK3MhXC5vOiEubG86IQorcyEgQEJGRF9IQCEgJChCRkRfSCkhZworcyFASU5DRElSQCEkKElOQ0RJUikhZworcyFAQkZERElSQCEkKEJGRERJUikhZworcyFAU1JDRElSQC8hIWcKKworcy9cXFxuICovIC9nCisKK3MvICokLy8KK3MvICAqLyAvZworcy8gKjovOi9nCisvOiQvZAorCitzL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAorICAvZwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kaXMtYnVmLmMgYi9vcGNvZGVzL2Rpcy1idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZiZTJlCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9kaXMtYnVmLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qIERpc2Fzc2VtYmxlIGZyb20gYSBidWZmZXIsIGZvciBHTlUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJvcGludGwuaCIKKworLyogR2V0IExFTkdUSCBieXRlcyBmcm9tIGluZm8ncyBidWZmZXIsIGF0IHRhcmdldCBhZGRyZXNzIG1lbWFkZHIuCisgICBUcmFuc2ZlciB0aGVtIHRvIG15YWRkci4gICovCitpbnQKK2J1ZmZlcl9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW5ndGgsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgYmZkX2J5dGUgKm15YWRkcjsKKyAgICAgaW50IGxlbmd0aDsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGlmIChtZW1hZGRyIDwgaW5mby0+YnVmZmVyX3ZtYQorICAgICAgfHwgbWVtYWRkciArIGxlbmd0aCA+IGluZm8tPmJ1ZmZlcl92bWEgKyBpbmZvLT5idWZmZXJfbGVuZ3RoKQorICAgIC8qIE91dCBvZiBib3VuZHMuICBVc2UgRUlPIGJlY2F1c2UgR0RCIHVzZXMgaXQuICAqLworICAgIHJldHVybiBFSU87CisgIG1lbWNweSAobXlhZGRyLCBpbmZvLT5idWZmZXIgKyAobWVtYWRkciAtIGluZm8tPmJ1ZmZlcl92bWEpLCBsZW5ndGgpOworICByZXR1cm4gMDsKK30KKworLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvCisgICBhbiBlcnJvciByZXR1cm4gZnJvbSBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwordm9pZAorcGVycm9yX21lbW9yeSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKQorICAgICBpbnQgc3RhdHVzOworICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpZiAoc3RhdHVzICE9IEVJTykKKyAgICAvKiBDYW4ndCBoYXBwZW4uICAqLworICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCBfKCJVbmtub3duIGVycm9yICVkXG4iKSwgc3RhdHVzKTsKKyAgZWxzZQorICAgIC8qIEFjdHVhbGx5LCBhZGRyZXNzIGJldHdlZW4gbWVtYWRkciBhbmQgbWVtYWRkciArIGxlbiB3YXMKKyAgICAgICBvdXQgb2YgYm91bmRzLiAgKi8KKyAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwKKwkJCV8oIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIiksIG1lbWFkZHIpOworfQorCisvKiBUaGlzIGNvdWxkIGJlIGluIGEgc2VwYXJhdGUgZmlsZSwgdG8gc2F2ZSBtaW5pc2N1bGUgYW1vdW50cyBvZiBzcGFjZQorICAgaW4gc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuICAqLworCisvKiBKdXN0IHByaW50IHRoZSBhZGRyZXNzIGlzIGhleC4gIFRoaXMgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcyBldmVuCisgICB0aG91Z2ggYm90aCBHREIgYW5kIG9iamR1bXAgcHJvdmlkZSB0aGVpciBvd24gKHRvIHByaW50IHN5bWJvbGljCisgICBhZGRyZXNzZXMpLiAgKi8KKwordm9pZAorZ2VuZXJpY19wcmludF9hZGRyZXNzIChhZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIGFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBhZGRyKTsKK30KKworLyogSnVzdCBjb25jYXRlbmF0ZSB0aGUgYWRkcmVzcyBhcyBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvcgorICAgY29tcGxldGVuZXNzIGV2ZW4gdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0bworICAgcHJpbnQgc3ltYm9saWMgYWRkcmVzc2VzKS4gICovCisKK3ZvaWQKK2dlbmVyaWNfc3RyY2F0X2FkZHJlc3MgKGFkZHIsIGJ1ZiwgbGVuKQorICAgICBiZmRfdm1hIGFkZHI7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaWYgKGJ1ZiAhPSAoY2hhciAqKU5VTEwgJiYgbGVuID4gMCkKKyAgICB7CisgICAgICBjaGFyIHRtcEJ1ZlszMF07CisKKyAgICAgIHNwcmludGZfdm1hICh0bXBCdWYsIGFkZHIpOworICAgICAgaWYgKChzdHJsZW4gKGJ1ZikgKyBzdHJsZW4gKHRtcEJ1ZikpIDw9IGxlbikKKwlzdHJjYXQgKGJ1ZiwgdG1wQnVmKTsKKyAgICAgIGVsc2UKKwlzdHJuY2F0IChidWYsIHRtcEJ1ZiwgKGxlbiAtIHN0cmxlbihidWYpKSk7CisgICAgfQorICByZXR1cm47Cit9CisKKy8qIEp1c3QgcmV0dXJuIHRoZSBnaXZlbiBhZGRyZXNzLiAgKi8KKworaW50CitnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzIChhZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIGFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKK3sKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMgYi9vcGNvZGVzL2Rpc2Fzc2VtYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5OGI0MgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvZGlzYXNzZW1ibGUuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogU2VsZWN0IGRpc2Fzc2VtYmx5IHJvdXRpbmUgZm9yIHNwZWNpZmllZCBhcmNoaXRlY3R1cmUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKworI2lmZGVmIEFSQ0hfYWxsCisjZGVmaW5lIEFSQ0hfYTI5aworI2RlZmluZSBBUkNIX2FscGhhCisjZGVmaW5lIEFSQ0hfYXJjCisjZGVmaW5lIEFSQ0hfYXJtCisjZGVmaW5lIEFSQ0hfZDEwdgorI2RlZmluZSBBUkNIX2QzMHYKKyNkZWZpbmUgQVJDSF9oODMwMAorI2RlZmluZSBBUkNIX2g4NTAwCisjZGVmaW5lIEFSQ0hfaHBwYQorI2RlZmluZSBBUkNIX2kzODYKKyNkZWZpbmUgQVJDSF9pOTYwCisjZGVmaW5lIEFSQ0hfZnIzMAorI2RlZmluZSBBUkNIX20zMnIKKyNkZWZpbmUgQVJDSF9tNjhrCisjZGVmaW5lIEFSQ0hfbTg4aworI2RlZmluZSBBUkNIX21jb3JlCisjZGVmaW5lIEFSQ0hfbWlwcworI2RlZmluZSBBUkNIX21uMTAyMDAKKyNkZWZpbmUgQVJDSF9tbjEwMzAwCisjZGVmaW5lIEFSQ0hfbnMzMmsKKyNkZWZpbmUgQVJDSF9wb3dlcnBjCisjZGVmaW5lIEFSQ0hfcnM2MDAwCisjZGVmaW5lIEFSQ0hfc2gKKyNkZWZpbmUgQVJDSF9zcGFyYworI2RlZmluZSBBUkNIX3RpYzMwCisjZGVmaW5lIEFSQ0hfdGljODAKKyNkZWZpbmUgQVJDSF92ODUwCisjZGVmaW5lIEFSQ0hfdmF4CisjZGVmaW5lIEFSQ0hfdzY1CisjZGVmaW5lIEFSQ0hfejhrCisjZW5kaWYKKworCitkaXNhc3NlbWJsZXJfZnR5cGUKK2Rpc2Fzc2VtYmxlciAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYSA9IGJmZF9nZXRfYXJjaCAoYWJmZCk7CisgIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZTsKKworICBzd2l0Y2ggKGEpCisgICAgeworICAgICAgLyogSWYgeW91IGFkZCBhIGNhc2UgdG8gdGhpcyB0YWJsZSwgYWxzbyBhZGQgaXQgdG8gdGhlCisJIEFSQ0hfYWxsIGRlZmluaXRpb24gcmlnaHQgYWJvdmUgdGhpcyBmdW5jdGlvbi4gICovCisjaWZkZWYgQVJDSF9hMjlrCisgICAgY2FzZSBiZmRfYXJjaF9hMjlrOgorICAgICAgLyogQXMgZmFyIGFzIEkga25vdyB3ZSBvbmx5IGhhbmRsZSBiaWctZW5kaWFuIDI5ayBvYmplY3RzLiAgKi8KKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfYTI5azsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9hbHBoYQorICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYWxwaGE7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfYXJjCisgICAgY2FzZSBiZmRfYXJjaF9hcmM6CisgICAgICB7CisJZGlzYXNzZW1ibGUgPSBhcmNfZ2V0X2Rpc2Fzc2VtYmxlciAoYmZkX2dldF9tYWNoIChhYmZkKSwKKwkJCQkJICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSk7CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBBUkNIX2FybQorICAgIGNhc2UgYmZkX2FyY2hfYXJtOgorICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKKwlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX2FybTsKKyAgICAgIGVsc2UKKwlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX2FybTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9kMTB2CisgICAgY2FzZSBiZmRfYXJjaF9kMTB2OgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2QxMHY7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfZDMwdgorICAgIGNhc2UgYmZkX2FyY2hfZDMwdjoKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9kMzB2OworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX2g4MzAwCisgICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKKyAgICAgIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoKQorCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODMwMGg7CisgICAgICBlbHNlIGlmIChiZmRfZ2V0X21hY2goYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQorCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODMwMHM7CisgICAgICBlbHNlIAorCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODMwMDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9oODUwMAorICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faDg1MDA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfaHBwYQorICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9ocHBhOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX2kzODYKKyAgICBjYXNlIGJmZF9hcmNoX2kzODY6CisgICAgICBpZiAoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQorICAgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTM4Nl9pbnRlbDsKKyAgICAgIGVsc2UKKyAgICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2kzODZfYXR0OworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX2k5NjAKKyAgICBjYXNlIGJmZF9hcmNoX2k5NjA6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTk2MDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9mcjMwCisgICAgY2FzZSBiZmRfYXJjaF9mcjMwOgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2ZyMzA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfbTMycgorICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tMzJyOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX202OGsKKyAgICBjYXNlIGJmZF9hcmNoX202OGs6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTY4azsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9tODhrCisgICAgY2FzZSBiZmRfYXJjaF9tODhrOgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX204OGs7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfbnMzMmsKKyAgICBjYXNlIGJmZF9hcmNoX25zMzJrOgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX25zMzJrOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX21jb3JlCisgICAgY2FzZSBiZmRfYXJjaF9tY29yZToKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tY29yZTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9taXBzCisgICAgY2FzZSBiZmRfYXJjaF9taXBzOgorICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKKwlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX21pcHM7CisgICAgICBlbHNlCisJZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9taXBzOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX21uMTAyMDAKKyAgICBjYXNlIGJmZF9hcmNoX21uMTAyMDA6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbW4xMDIwMDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9tbjEwMzAwCisgICAgY2FzZSBiZmRfYXJjaF9tbjEwMzAwOgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21uMTAzMDA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfcG93ZXJwYworICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKKyAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCisJZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19wb3dlcnBjOworICAgICAgZWxzZQorCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYzsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9yczYwMDAKKyAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9yczYwMDA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfc2gKKyAgICBjYXNlIGJmZF9hcmNoX3NoOgorICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKKwlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fc2g7CisgICAgICBlbHNlCisJZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3NobDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF9zcGFyYworICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fc3BhcmM7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfdGljMzAKKyAgICBjYXNlIGJmZF9hcmNoX3RpYzMwOgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3RpYzMwOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX3RpYzgwCisgICAgY2FzZSBiZmRfYXJjaF90aWM4MDoKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl90aWM4MDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF92ODUwCisgICAgY2FzZSBiZmRfYXJjaF92ODUwOgorICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3Y4NTA7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEFSQ0hfdzY1CisgICAgY2FzZSBiZmRfYXJjaF93NjU6CisgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdzY1OworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBBUkNIX3o4aworICAgIGNhc2UgYmZkX2FyY2hfejhrOgorICAgICAgaWYgKGJmZF9nZXRfbWFjaChhYmZkKSA9PSBiZmRfbWFjaF96ODAwMSkKKwlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fejgwMDE7CisgICAgICBlbHNlIAorCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl96ODAwMjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQVJDSF92YXgKKyAgICBjYXNlIGJmZF9hcmNoX3ZheDoKKyAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl92YXg7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiBkaXNhc3NlbWJsZTsKK30KKwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWFzbS5jIGIvb3Bjb2Rlcy9mcjMwLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWNjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2ZyMzAtYXNtLmMKQEAgLTAsMCArMSw1NjAgQEAKKy8qIEFzc2VtYmxlciBpbnRlcmZhY2UgZm9yIHRhcmdldHMgdXNpbmcgQ0dFTi4gLSotIEMgLSotCisgICBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCistIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1hc20uaW4gaXNuJ3QKKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qID8/PyBFdmVudHVhbGx5IG1vcmUgYW5kIG1vcmUgb2YgdGhpcyBzdHVmZiBjYW4gZ28gdG8gY3B1LWluZGVwZW5kZW50IGZpbGVzLgorICAgS2VlcCB0aGF0IGluIG1pbmQuICAqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltY2F0LmgiCisjaW5jbHVkZSAiZnIzMC1kZXNjLmgiCisjaW5jbHVkZSAiZnIzMC1vcGMuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworI3VuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI3VuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCitzdGF0aWMgY29uc3QgY2hhciAqIHBhcnNlX2luc25fbm9ybWFsCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLCBjb25zdCBjaGFyICoqLCBDR0VOX0ZJRUxEUyAqKSk7CisMCisvKiAtLSBhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLworCisvKiAtLSBhc20uYyAqLworLyogSGFuZGxlIHJlZ2lzdGVyIGxpc3RzIGZvciBMRE14IGFuZCBTVE14ICAqLworCitzdGF0aWMgaW50CitwYXJzZV9yZWdpc3Rlcl9udW1iZXIgKHN0cnApCisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworeworICBpbnQgcmVnbm87CisgIGlmICgqKnN0cnAgPCAnMCcgfHwgKipzdHJwID4gJzknKQorICAgIHJldHVybiAtMTsgLyogZXJyb3IgKi8KKyAgcmVnbm8gPSAqKnN0cnAgLSAnMCc7CisgICsrKnN0cnA7CisKKyAgaWYgKCoqc3RycCA+PSAnMCcgJiYgKipzdHJwIDw9ICc5JykKKyAgICB7CisgICAgICByZWdubyA9IHJlZ25vICogMTAgKyAoKipzdHJwIC0gJzAnKTsKKyAgICAgICsrKnN0cnA7CisgICAgfQorCisgIHJldHVybiByZWdubzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgaGlnaF9sb3csIGxvYWRfc3RvcmUpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOworICAgICBpbnQgaGlnaF9sb3c7ICAgLyogMCA9PSBoaWdoLCAxID09IGxvdyAqLworICAgICBpbnQgbG9hZF9zdG9yZTsgLyogMCA9PSBsb2FkLCAxID09IHN0b3JlICovCit7CisgIGludCByZWdubzsKKyAgKnZhbHVlcCA9IDA7CisgIHdoaWxlICgqKnN0cnAgJiYgKipzdHJwICE9ICcpJykKKyAgICB7CisgICAgICBpZiAoKipzdHJwICE9ICdSJyAmJiAqKnN0cnAgIT0gJ3InKQorCWJyZWFrOworICAgICAgKysqc3RycDsKKworICAgICAgcmVnbm8gPSBwYXJzZV9yZWdpc3Rlcl9udW1iZXIgKHN0cnApOworICAgICAgaWYgKHJlZ25vID09IC0xKQorCXJldHVybiAiUmVnaXN0ZXIgbnVtYmVyIGlzIG5vdCB2YWxpZCI7CisgICAgICBpZiAocmVnbm8gPiA3ICYmICFoaWdoX2xvdykKKwlyZXR1cm4gIlJlZ2lzdGVyIG11c3QgYmUgYmV0d2VlbiByMCBhbmQgcjciOworICAgICAgaWYgKHJlZ25vIDwgOCAmJiBoaWdoX2xvdykKKwlyZXR1cm4gIlJlZ2lzdGVyIG11c3QgYmUgYmV0d2VlbiByOCBhbmQgcjE1IjsKKworICAgICAgaWYgKGhpZ2hfbG93KQorCXJlZ25vIC09IDg7CisKKyAgICAgIGlmIChsb2FkX3N0b3JlKSAvKiBtYXNrIGlzIHJldmVyc2VkIGZvciBzdG9yZSAqLworCSp2YWx1ZXAgfD0gMHg4MCA+PiByZWdubzsKKyAgICAgIGVsc2UKKwkqdmFsdWVwIHw9IDEgPDwgcmVnbm87CisKKyAgICAgIGlmICgqKnN0cnAgPT0gJywnKQorCXsKKwkgIGlmICgqKCpzdHJwICsgMSkgPT0gJyknKQorCSAgICBicmVhazsKKwkgICsrKnN0cnA7CisJfQorICAgIH0KKworICBpZiAoISpzdHJwIHx8ICoqc3RycCAhPSAnKScpCisgICAgcmV0dXJuICJSZWdpc3RlciBsaXN0IGlzIG5vdCB2YWxpZCI7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICoqc3RycDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKK3sKKyAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAwLypsb2FkKi8pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICoqc3RycDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKK3sKKyAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDEvKmhpZ2gqLywgMC8qbG9hZCovKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFyc2VfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWVwOworeworICByZXR1cm4gcGFyc2VfcmVnaXN0ZXJfbGlzdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCwgMC8qbG93Ki8sIDEvKnN0b3JlKi8pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICoqc3RycDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKK3sKKyAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDEvKmhpZ2gqLywgMS8qc3RvcmUqLyk7Cit9CisKKy8qIC0tICovCisKKy8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgcGFyc2luZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucworICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKKyAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KKyAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCisgICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKKyAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0CisgICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgorICAgdGhlIGhhbmRsZXJzLgorKi8KKworY29uc3QgY2hhciAqCitmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHN0cnAsIGZpZWxkcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIGNvbnN0IGNoYXIgKiogc3RycDsKKyAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Cit7CisgIGNvbnN0IGNoYXIgKiBlcnJtc2c7CisKKyAgc3dpdGNoIChvcGluZGV4KQorICAgIHsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX0NSaSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsICYgZmllbGRzLT5mX0NSaik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTMsICYgZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsICYgZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTUsICYgZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9SaWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JqKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmpjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgJiBmaWVsZHMtPmZfUnMxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgJiBmaWVsZHMtPmZfUnMyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9DQywgJmZpZWxkcy0+Zl9jYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0NDQywgJmZpZWxkcy0+Zl9jY2MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjEwLCAmZmllbGRzLT5mX2RpcjEwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJUjgsICZmaWVsZHMtPmZfZGlyOCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVI5LCAmZmllbGRzLT5mX2RpcjkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDEwLCAmZmllbGRzLT5mX2Rpc3AxMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJU1A4LCAmZmllbGRzLT5mX2Rpc3A4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElTUDksICZmaWVsZHMtPmZfZGlzcDkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9JMjAsICZmaWVsZHMtPmZfaTIwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfSTMyLCAmZmllbGRzLT5mX2kzMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfSTgsICZmaWVsZHMtPmZfaTgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6CisgICAgICB7CisgICAgICAgIGJmZF92bWEgdmFsdWU7CisgICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9MQUJFTDEyLCAwLCBOVUxMLCAgJiB2YWx1ZSk7CisgICAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKKyAgICAgIHsKKyAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKKyAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0xBQkVMOSwgMCwgTlVMTCwgICYgdmFsdWUpOworICAgICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9NNCwgJmZpZWxkcy0+Zl9tNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzLCAmIGZpZWxkcy0+Zl9uaWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6CisgICAgICBlcnJtc2cgPSBwYXJzZV9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQsICZmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKKyAgICAgIGVycm1zZyA9IHBhcnNlX2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKKyAgICAgIGVycm1zZyA9IHBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xELCAmZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKKyAgICAgIGVycm1zZyA9IHBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCAmZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1MxMCwgJmZpZWxkcy0+Zl9zMTApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VMTAsICZmaWVsZHMtPmZfdTEwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VNCwgJmZpZWxkcy0+Zl91NCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U0QywgJmZpZWxkcy0+Zl91NGMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1U4LCAmZmllbGRzLT5mX3U4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVURJU1A2LCAmZmllbGRzLT5mX3VkaXNwNik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iKSwgb3BpbmRleCk7CisgICAgICBhYm9ydCAoKTsKKyAgfQorCisgIHJldHVybiBlcnJtc2c7Cit9CisKK2NnZW5fcGFyc2VfZm4gKiBjb25zdCBmcjMwX2NnZW5fcGFyc2VfaGFuZGxlcnNbXSA9IAoreworICBwYXJzZV9pbnNuX25vcm1hbCwKK307CisKK3ZvaWQKK2ZyMzBfY2dlbl9pbml0X2FzbSAoY2QpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7Cit7CisgIGZyMzBfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOworICBmcjMwX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7CisgIGNkLT5wYXJzZV9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX3BhcnNlX2hhbmRsZXJzWzBdOworICBjZC0+cGFyc2Vfb3BlcmFuZCA9IGZyMzBfY2dlbl9wYXJzZV9vcGVyYW5kOworfQorCisMCisvKiBEZWZhdWx0IGluc24gcGFyc2VyLgorCisgICBUaGUgc3ludGF4IHN0cmluZyBpcyBzY2FubmVkIGFuZCBvcGVyYW5kcyBhcmUgcGFyc2VkIGFuZCBzdG9yZWQgaW4gRklFTERTLgorICAgUmVsb2NzIGFyZSBxdWV1ZWQgYXMgd2UgZ28gdmlhIG90aGVyIGNhbGxiYWNrcy4KKworICAgPz8/IE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBhbiBhbGwtb3Itbm90aGluZyBwYXJzZXIuICBJZiB3ZSBmYWlsIHRvCisgICBwYXJzZSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHJldHVybiAwIGFuZCB0aGUgY2FsbGVyIHdpbGwgc3RhcnQgb3ZlciBmcm9tCisgICB0aGUgYmVnaW5uaW5nLiAgQmFja3RyYWNraW5nIHdpbGwgYmUgbmVjZXNzYXJ5IGluIHBhcnNpbmcgc3ViZXhwcmVzc2lvbnMsCisgICBidXQgdGhhdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS4gIE5vdCBoYW5kbGluZyBiYWNrdHJhY2tpbmcgaGVyZSBtYXkgZ2V0CisgICBleHBlbnNpdmUgaW4gdGhlIGNhc2Ugb2YgdGhlIG02OGsuICBEZWFsIHdpdGggbGF0ZXIuCisKKyAgIFJldHVybnMgTlVMTCBmb3Igc3VjY2VzcywgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZmFpbHVyZS4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX2luc25fbm9ybWFsIChjZCwgaW5zbiwgc3RycCwgZmllbGRzKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBDR0VOX0lOU04gKmluc247CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworeworICAvKiA/Pz8gUnVudGltZSBhZGRlZCBpbnNucyBub3QgaGFuZGxlZCB5ZXQuICAqLworICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7CisgIGNvbnN0IGNoYXIgKnN0ciA9ICpzdHJwOworICBjb25zdCBjaGFyICplcnJtc2c7CisgIGNvbnN0IGNoYXIgKnA7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47CisjaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUworICAvKiBGSVhNRTogd2lwICovCisgIGludCBwYXN0X29wY29kZV9wOworI2VuZGlmCisKKyAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIG1uZW1vbmljIGlzIGZpcnN0ICh0aGVyZSBhcmUgbm8gbGVhZGluZyBvcGVyYW5kcykuCisgICAgIFdlIGNhbiBwYXJzZSBpdCB3aXRob3V0IG5lZWRpbmcgdG8gc2V0IHVwIG9wZXJhbmQgcGFyc2luZy4KKyAgICAgR0FTJ3MgaW5wdXQgc2NydWJiZXIgd2lsbCBlbnN1cmUgbW5lbW9uaWNzIGFyZSBsb3dlcmNhc2UsIGJ1dCB3ZSBtYXkKKyAgICAgbm90IGJlIGNhbGxlZCBmcm9tIEdBUy4gICovCisgIHAgPSBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pOworICB3aGlsZSAoKnAgJiYgdG9sb3dlciAoKnApID09IHRvbG93ZXIgKCpzdHIpKQorICAgICsrcCwgKytzdHI7CisgIAorICBpZiAoKiBwIHx8ICgqIHN0ciAmJiAhaXNzcGFjZSAoKiBzdHIpKSkKKyAgICByZXR1cm4gXygidW5yZWNvZ25pemVkIGluc3RydWN0aW9uIik7CisKKyAgQ0dFTl9JTklUX1BBUlNFIChjZCk7CisgIGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCk7CisjaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUworICBwYXN0X29wY29kZV9wID0gMDsKKyNlbmRpZgorCisgIC8qIFdlIGRvbid0IGNoZWNrIGZvciAoKnN0ciAhPSAnXDAnKSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBwYXJzZQorICAgICBhbnkgdHJhaWxpbmcgZmFrZSBhcmd1bWVudHMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLworICBzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7CisKKyAgLyogTW5lbW9uaWNzIGNvbWUgZmlyc3QgZm9yIG5vdywgZW5zdXJlIHZhbGlkIHN0cmluZy4gICovCisgIGlmICghIENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCogc3luKSkKKyAgICBhYm9ydCAoKTsKKworICArK3N5bjsKKworICB3aGlsZSAoKiBzeW4gIT0gMCkKKyAgICB7CisgICAgICAvKiBOb24gb3BlcmFuZCBjaGFycyBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLworICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQorCXsKKwkgIGlmICgqc3RyID09IENHRU5fU1lOVEFYX0NIQVIgKCogc3luKSkKKwkgICAgeworI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKKwkgICAgICBpZiAoKiBzeW4gPT0gJyAnKQorCQlwYXN0X29wY29kZV9wID0gMTsKKyNlbmRpZgorCSAgICAgICsrIHN5bjsKKwkgICAgICArKyBzdHI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFN5bnRheCBjaGFyIGRpZG4ndCBtYXRjaC4gIENhbid0IGJlIHRoaXMgaW5zbi4gICovCisJICAgICAgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCisJCSAiZXhwZWN0ZWQgY2hhciBgYyciICovCisJICAgICAgcmV0dXJuIF8oInN5bnRheCBlcnJvciIpOworCSAgICB9CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZCBvZiBzb21lIHNvcnQuICAqLworICAgICAgZXJybXNnID0gZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCisJCQkJCSAgJnN0ciwgZmllbGRzKTsKKyAgICAgIGlmIChlcnJtc2cpCisJcmV0dXJuIGVycm1zZzsKKworICAgICAgLyogRG9uZSB3aXRoIHRoaXMgb3BlcmFuZCwgY29udGludWUgd2l0aCBuZXh0IG9uZS4gICovCisgICAgICArKyBzeW47CisgICAgfQorCisgIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN5bnRheCBzdHJpbmcsIHdlJ3JlIGRvbmUuICAqLworICBpZiAoKiBzeW4gPT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBGSVhNRTogRm9yIHRoZSBtb21lbnQgd2UgYXNzdW1lIGEgdmFsaWQgYHN0cicgY2FuIG9ubHkgY29udGFpbgorCSBibGFua3Mgbm93LiAgSUU6IFdlIG5lZWRuJ3QgdHJ5IGFnYWluIHdpdGggYSBsb25nZXIgdmVyc2lvbiBvZgorCSB0aGUgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKKwkgYmVmb3JlIHNob3J0ZXIgb25lcyAoZWc6IGxzciByMixyMywxIHZzIGxzciByMixyMykuICAqLworICAgICAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKKwkrKyBzdHI7CisKKyAgICAgIGlmICgqIHN0ciAhPSAnXDAnKQorCXJldHVybiBfKCJqdW5rIGF0IGVuZCBvZiBsaW5lIik7IC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgYHN0cicgKi8KKworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFdlIGNvdWxkbid0IHBhcnNlIGl0LiAgKi8KKyAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOworfQorDAorLyogTWFpbiBlbnRyeSBwb2ludC4KKyAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLgorICAgU1RSIHBvaW50cyB0byB0aGUgaW5zbiB0byBiZSBhc3NlbWJsZWQuCisgICBXZSBhc3N1bWUgYWxsIG5lY2Vzc2FyeSB0YWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgorICAgVGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiwgbGVzcyBhbnkgZml4dXBzLCBpcyBzdG9yZWQgaW4gQlVGLgorICAgUmVtZW1iZXIgdGhhdCBpZiBDR0VOX0lOVF9JTlNOX1AgdGhlbiBCVUYgaXMgYW4gaW50IGFuZCB0aHVzIHRoZSB2YWx1ZQorICAgc3RpbGwgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHRhcmdldCBieXRlIG9yZGVyLCBvdGhlcndpc2UgQlVGIGlzIGFuIGFycmF5CisgICBvZiBieXRlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KKyAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuJ3MgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZSwKKyAgIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJlZCAoYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuCisgICBwcmludGVkKS4KKworICAgTm90ZSB0aGF0IHdoZW4gcHJvY2Vzc2luZyAobm9uLWFsaWFzKSBtYWNyby1pbnNucywKKyAgIHRoaXMgZnVuY3Rpb24gcmVjdXJzZXMuCisKKyAgID8/PyBJdCdzIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBjcHUtaW5kZXBlbmRlbnQuCisgICBPbmUgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggYSBmZXcgbWlub3IgdGhpbmdzLgorICAgQXQgdGhpcyBwb2ludCBpbiB0aW1lIGRvaW5nIHNvIHdvdWxkIGJlIG1vcmUgb2YgYSBjdXJpb3NpdHkgdGhhbiB1c2VmdWwKKyAgIFtmb3IgZXhhbXBsZSB0aGlzIGZpbGUgaXNuJ3QgX3RoYXRfIGJpZ10sIGJ1dCBrZWVwaW5nIHRoZSBwb3NzaWJpbGl0eSBpbgorICAgbWluZCBoZWxwcyBrZWVwIHRoZSBkZXNpZ24gY2xlYW4uICAqLworCitjb25zdCBDR0VOX0lOU04gKgorZnIzMF9jZ2VuX2Fzc2VtYmxlX2luc24gKGNkLCBzdHIsIGZpZWxkcywgYnVmLCBlcnJtc2cpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKKyAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7CisgICAgIGNoYXIgKiplcnJtc2c7Cit7CisgIGNvbnN0IGNoYXIgKnN0YXJ0OworICBDR0VOX0lOU05fTElTVCAqaWxpc3Q7CisKKyAgLyogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLiAgKi8KKyAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKKyAgICArKyBzdHI7CisKKyAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2hlZCBsaXN0cy4KKyAgICAgR2V0IHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4gICovCisgIGlsaXN0ID0gQ0dFTl9BU01fTE9PS1VQX0lOU04gKGNkLCBzdHIpOworCisgIC8qIEtlZXAgbG9va2luZyB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guICAqLworCisgIHN0YXJ0ID0gc3RyOworICBmb3IgKCA7IGlsaXN0ICE9IE5VTEwgOyBpbGlzdCA9IENHRU5fQVNNX05FWFRfSU5TTiAoaWxpc3QpKQorICAgIHsKKyAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGlsaXN0LT5pbnNuOworCisjaWYgMCAvKiBub3QgbmVlZGVkIGFzIHVuc3VwcG9ydGVkIG9wY29kZXMgc2hvdWxkbid0IGJlIGluIHRoZSBoYXNoIGxpc3RzICovCisgICAgICAvKiBJcyB0aGlzIGluc24gc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLworICAgICAgaWYgKCEgZnIzMF9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCisJY29udGludWU7CisjZW5kaWYKKworICAgICAgLyogSWYgdGhlIFJFTEFYIGF0dHJpYnV0ZSBpcyBzZXQsIHRoaXMgaXMgYW4gaW5zbiB0aGF0IHNob3VsZG4ndCBiZQorCSBjaG9zZW4gaW1tZWRpYXRlbHkuICBJbnN0ZWFkLCBpdCBpcyB1c2VkIGR1cmluZyBhc3NlbWJsZXIvbGlua2VyCisJIHJlbGF4YXRpb24gaWYgcG9zc2libGUuICAqLworICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpICE9IDApCisJY29udGludWU7CisKKyAgICAgIHN0ciA9IHN0YXJ0OworCisgICAgICAvKiBBbGxvdyBwYXJzZS9pbnNlcnQgaGFuZGxlcnMgdG8gb2J0YWluIGxlbmd0aCBvZiBpbnNuLiAgKi8KKyAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykgPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7CisKKyAgICAgIGlmICghIENHRU5fUEFSU0VfRk4gKGNkLCBpbnNuKSAoY2QsIGluc24sICYgc3RyLCBmaWVsZHMpKQorCXsKKwkgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLworCSAgaWYgKENHRU5fSU5TRVJUX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCBmaWVsZHMsIGJ1ZiwgKGJmZF92bWEpIDApCisJICAgICAgIT0gTlVMTCkKKwkgICAgY29udGludWU7CisJICAvKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGFjdHVhbGx5IG91dHB1dCB0aGUgaW5zbiBhbmQgYW55CisJICAgICBxdWV1ZWQgcmVsb2NzLiAgKi8KKwkgIHJldHVybiBpbnNuOworCX0KKworICAgICAgLyogVHJ5IHRoZSBuZXh0IGVudHJ5LiAgKi8KKyAgICB9CisKKyAgLyogRklYTUU6IFdlIGNhbiByZXR1cm4gYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGFuIHRoaXMuCisgICAgIE5lZWQgdG8gdHJhY2sgd2h5IGl0IGZhaWxlZCBhbmQgcGljayB0aGUgcmlnaHQgb25lLiAgKi8KKyAgeworICAgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOworICAgIGlmIChzdHJsZW4gKHN0YXJ0KSA+IDUwKQorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciKSwgc3RhcnQpOworICAgIGVsc2UgCisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgc3ByaW50ZiAoZXJyYnVmLCBfKCJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIpLCBzdGFydCk7CisgICAgICAKKyAgICAqZXJybXNnID0gZXJyYnVmOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisMCisjaWYgMCAvKiBUaGlzIGNhbGxzIGJhY2sgdG8gR0FTIHdoaWNoIHdlIGNhbid0IGRvIHdpdGhvdXQgY2FyZS4gICovCisKKy8qIFJlY29yZCBlYWNoIG1lbWJlciBvZiBPUFZBTFMgaW4gdGhlIGFzc2VtYmxlcidzIHN5bWJvbCB0YWJsZS4KKyAgIFRoaXMgbGV0cyBHQVMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4KKyAgID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICAqLworCisvKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCisgICBGSVhNRTogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KKwordm9pZAorZnIzMF9jZ2VuX2FzbV9oYXNoX2tleXdvcmRzIChjZCwgb3B2YWxzKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBDR0VOX0tFWVdPUkQgKm9wdmFsczsKK3sKKyAgQ0dFTl9LRVlXT1JEX1NFQVJDSCBzZWFyY2ggPSBjZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKG9wdmFscywgTlVMTCk7CisgIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqIGtlOworCisgIHdoaWxlICgoa2UgPSBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQgKCYgc2VhcmNoKSkgIT0gTlVMTCkKKyAgICB7CisjaWYgMCAvKiBVbm5lY2Vzc2FyeSwgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIHNlYXJjaCByb3V0aW5lLiAgKi8KKyAgICAgIGlmICghIGZyMzBfY2dlbl9vcHZhbF9zdXBwb3J0ZWQgKGtlKSkKKwljb250aW51ZTsKKyNlbmRpZgorICAgICAgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIChjZCwga2UtPm5hbWUsIGtlLT52YWx1ZSk7CisgICAgfQorfQorCisjZW5kaWYgLyogMCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWRlc2MuYyBiL29wY29kZXMvZnIzMC1kZXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwZjA0YgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvZnIzMC1kZXNjLmMKQEAgLTAsMCArMSwxNjQzIEBACisvKiBDUFUgZGF0YSBmb3IgZnIzMC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgImZyMzAtZGVzYy5oIgorI2luY2x1ZGUgImZyMzAtb3BjLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKy8qIEF0dHJpYnV0ZXMuICAqLworCitzdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIGJvb2xfYXR0cltdID0KK3sKKyAgeyAiI2YiLCAwIH0sCisgIHsgIiN0IiwgMSB9LAorICB7IDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBNQUNIX2F0dHJbXSA9Cit7CisgIHsgImJhc2UiLCBNQUNIX0JBU0UgfSwKKyAgeyAiZnIzMCIsIE1BQ0hfRlIzMCB9LAorICB7ICJtYXgiLCBNQUNIX01BWCB9LAorICB7IDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBJU0FfYXR0cltdID0KK3sKKyAgeyAiZnIzMCIsIElTQV9GUjMwIH0sCisgIHsgIm1heCIsIElTQV9NQVggfSwKKyAgeyAwLCAwIH0KK307CisKK2NvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUkVTRVJWRUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgMCwgMCwgMCB9Cit9OworCitjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAwLCAwLCAwIH0KK307CisKK2NvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQoreworICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKKyAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7IDAsIDAsIDAgfQorfTsKKworY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiTk9ULUlOLURFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgMCwgMCwgMCB9Cit9OworCisvKiBJbnN0cnVjdGlvbiBzZXQgdmFyaWFudHMuICAqLworCitzdGF0aWMgY29uc3QgQ0dFTl9JU0EgZnIzMF9jZ2VuX2lzYV90YWJsZVtdID0geworICB7ICJmcjMwIiwgMTYsIDE2LCAxNiwgNDgsICB9LAorICB7IDAgfQorfTsKKworLyogTWFjaGluZSB2YXJpYW50cy4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX01BQ0ggZnIzMF9jZ2VuX21hY2hfdGFibGVbXSA9IHsKKyAgeyAiZnIzMCIsICJmcjMwIiwgTUFDSF9GUjMwIH0sCisgIHsgMCB9Cit9OworCitzdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzW10gPQoreworICB7ICJyMCIsIDAgfSwKKyAgeyAicjEiLCAxIH0sCisgIHsgInIyIiwgMiB9LAorICB7ICJyMyIsIDMgfSwKKyAgeyAicjQiLCA0IH0sCisgIHsgInI1IiwgNSB9LAorICB7ICJyNiIsIDYgfSwKKyAgeyAicjciLCA3IH0sCisgIHsgInI4IiwgOCB9LAorICB7ICJyOSIsIDkgfSwKKyAgeyAicjEwIiwgMTAgfSwKKyAgeyAicjExIiwgMTEgfSwKKyAgeyAicjEyIiwgMTIgfSwKKyAgeyAicjEzIiwgMTMgfSwKKyAgeyAicjE0IiwgMTQgfSwKKyAgeyAicjE1IiwgMTUgfSwKKyAgeyAiYWMiLCAxMyB9LAorICB7ICJmcCIsIDE0IH0sCisgIHsgInNwIiwgMTUgfQorfTsKKworQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcyA9Cit7CisgICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbMF0sCisgIDE5Cit9OworCitzdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzW10gPQoreworICB7ICJjcjAiLCAwIH0sCisgIHsgImNyMSIsIDEgfSwKKyAgeyAiY3IyIiwgMiB9LAorICB7ICJjcjMiLCAzIH0sCisgIHsgImNyNCIsIDQgfSwKKyAgeyAiY3I1IiwgNSB9LAorICB7ICJjcjYiLCA2IH0sCisgIHsgImNyNyIsIDcgfSwKKyAgeyAiY3I4IiwgOCB9LAorICB7ICJjcjkiLCA5IH0sCisgIHsgImNyMTAiLCAxMCB9LAorICB7ICJjcjExIiwgMTEgfSwKKyAgeyAiY3IxMiIsIDEyIH0sCisgIHsgImNyMTMiLCAxMyB9LAorICB7ICJjcjE0IiwgMTQgfSwKKyAgeyAiY3IxNSIsIDE1IH0KK307CisKK0NHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMgPQoreworICAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lc19lbnRyaWVzWzBdLAorICAxNgorfTsKKworc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1tdID0KK3sKKyAgeyAidGJyIiwgMCB9LAorICB7ICJycCIsIDEgfSwKKyAgeyAic3NwIiwgMiB9LAorICB7ICJ1c3AiLCAzIH0sCisgIHsgIm1kaCIsIDQgfSwKKyAgeyAibWRsIiwgNSB9Cit9OworCitDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzID0KK3sKKyAgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXNfZW50cmllc1swXSwKKyAgNgorfTsKKworc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzW10gPQoreworICB7ICJwcyIsIDAgfQorfTsKKworQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3BzID0KK3sKKyAgJiBmcjMwX2NnZW5fb3B2YWxfaF9wc19lbnRyaWVzWzBdLAorICAxCit9OworCitzdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzW10gPQoreworICB7ICJyMTMiLCAwIH0KK307CisKK0NHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTMgPQoreworICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxM19lbnRyaWVzWzBdLAorICAxCit9OworCitzdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzW10gPQoreworICB7ICJyMTQiLCAwIH0KK307CisKK0NHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTQgPQoreworICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNF9lbnRyaWVzWzBdLAorICAxCit9OworCitzdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzW10gPQoreworICB7ICJyMTUiLCAwIH0KK307CisKK0NHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTUgPQoreworICAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNV9lbnRyaWVzWzBdLAorICAxCit9OworCisKKworLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KKworI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQorCitjb25zdCBDR0VOX0hXX0VOVFJZIGZyMzBfY2dlbl9od190YWJsZVtdID0KK3sKKyAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtZHIiLCBIV19IX0RSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXBzIiwgSFdfSF9QUywgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXIxMyIsIEhXX0hfUjEzLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXIxNCIsIEhXX0hfUjE0LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXIxNSIsIEhXX0hfUjE1LCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLW5iaXQiLCBIV19IX05CSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC16Yml0IiwgSFdfSF9aQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtdmJpdCIsIEhXX0hfVkJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLWNiaXQiLCBIV19IX0NCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1pYml0IiwgSFdfSF9JQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtc2JpdCIsIEhXX0hfU0JJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXRiaXQiLCBIV19IX1RCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1kMGJpdCIsIEhXX0hfRDBCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1kMWJpdCIsIEhXX0hfRDFCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1jY3IiLCBIV19IX0NDUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXNjciIsIEhXX0hfU0NSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtaWxtIiwgSFdfSF9JTE0sIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAwIH0KK307CisKKyN1bmRlZiBBCisKKy8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCisKKyNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQorCitjb25zdCBDR0VOX0lGTEQgZnIzMF9jZ2VuX2lmbGRfdGFibGVbXSA9Cit7CisgIHsgRlIzMF9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfT1AxLCAiZi1vcDEiLCAwLCAxNiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfT1AyLCAiZi1vcDIiLCAwLCAxNiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfT1AzLCAiZi1vcDMiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfT1A0LCAiZi1vcDQiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX09QNSwgImYtb3A1IiwgMCwgMTYsIDQsIDEsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX0NDLCAiZi1jYyIsIDAsIDE2LCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9DQ0MsICJmLWNjYyIsIDE2LCAxNiwgMCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfUkosICJmLVJqIiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX1JJLCAiZi1SaSIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfUlMxLCAiZi1SczEiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfUlMyLCAiZi1SczIiLCAwLCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX1JKQywgImYtUmpjIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9SSUMsICJmLVJpYyIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX0NSSiwgImYtQ1JqIiwgMTYsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9DUkksICJmLUNSaSIsIDE2LCAxNiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX1U0LCAiZi11NCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9VNEMsICJmLXU0YyIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfSTQsICJmLWk0IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX000LCAiZi1tNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9VOCwgImYtdTgiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfSTgsICJmLWk4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX0kyMF80LCAiZi1pMjAtNCIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9JMjBfMTYsICJmLWkyMC0xNiIsIDE2LCAxNiwgMCwgMTYsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX0kzMiwgImYtaTMyIiwgMTYsIDMyLCAwLCAzMiwgeyAwfEEoU0lHTl9PUFQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfVURJU1A2LCAiZi11ZGlzcDYiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfRElTUDgsICJmLWRpc3A4IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX0RJU1A5LCAiZi1kaXNwOSIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9ESVNQMTAsICJmLWRpc3AxMCIsIDAsIDE2LCA0LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9TMTAsICJmLXMxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9VMTAsICJmLXUxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9SRUw5LCAiZi1yZWw5IiwgMCwgMTYsIDgsIDgsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfRElSOCwgImYtZGlyOCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9ESVI5LCAiZi1kaXI5IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgRlIzMF9GX0RJUjEwLCAiZi1kaXIxMCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9SRUwxMiwgImYtcmVsMTIiLCAwLCAxNiwgNSwgMTEsIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfUkVHTElTVF9ISV9TVCwgImYtcmVnbGlzdF9oaV9zdCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9SRUdMSVNUX0xPV19TVCwgImYtcmVnbGlzdF9sb3dfc3QiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBGUjMwX0ZfUkVHTElTVF9ISV9MRCwgImYtcmVnbGlzdF9oaV9sZCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEZSMzBfRl9SRUdMSVNUX0xPV19MRCwgImYtcmVnbGlzdF9sb3dfbGQiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyAwIH0KK307CisKKyN1bmRlZiBBCisKKy8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KKworI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCisjZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCisKK2NvbnN0IENHRU5fT1BFUkFORCBmcjMwX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KK3sKKy8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KKyAgeyAicGMiLCBGUjMwX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCisgICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIFJpOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLworICB7ICJSaSIsIEZSMzBfT1BFUkFORF9SSSwgSFdfSF9HUiwgMTIsIDQsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIFJqOiBzb3VyY2UgcmVnaXN0ZXIgKi8KKyAgeyAiUmoiLCBGUjMwX09QRVJBTkRfUkosIEhXX0hfR1IsIDgsIDQsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIFJpYzogdGFyZ2V0IHJlZ2lzdGVyIGNvcHJvYyBpbnNuICovCisgIHsgIlJpYyIsIEZSMzBfT1BFUkFORF9SSUMsIEhXX0hfR1IsIDEyLCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBSamM6IHNvdXJjZSByZWdpc3RlciBjb3Byb2MgaW5zbiAqLworICB7ICJSamMiLCBGUjMwX09QRVJBTkRfUkpDLCBIV19IX0dSLCA4LCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBDUmk6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCisgIHsgIkNSaSIsIEZSMzBfT1BFUkFORF9DUkksIEhXX0hfQ1IsIDEyLCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBDUmo6IGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCisgIHsgIkNSaiIsIEZSMzBfT1BFUkFORF9DUkosIEhXX0hfQ1IsIDgsIDQsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIFJzMTogZGVkaWNhdGVkIHJlZ2lzdGVyICovCisgIHsgIlJzMSIsIEZSMzBfT1BFUkFORF9SUzEsIEhXX0hfRFIsIDgsIDQsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIFJzMjogZGVkaWNhdGVkIHJlZ2lzdGVyICovCisgIHsgIlJzMiIsIEZSMzBfT1BFUkFORF9SUzIsIEhXX0hfRFIsIDEyLCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBSMTM6IEdlbmVyYWwgUmVnaXN0ZXIgMTMgKi8KKyAgeyAiUjEzIiwgRlIzMF9PUEVSQU5EX1IxMywgSFdfSF9SMTMsIDAsIDAsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIFIxNDogR2VuZXJhbCBSZWdpc3RlciAxNCAqLworICB7ICJSMTQiLCBGUjMwX09QRVJBTkRfUjE0LCBIV19IX1IxNCwgMCwgMCwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogUjE1OiBHZW5lcmFsIFJlZ2lzdGVyIDE1ICovCisgIHsgIlIxNSIsIEZSMzBfT1BFUkFORF9SMTUsIEhXX0hfUjE1LCAwLCAwLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBwczogUHJvZ3JhbSBTdGF0dXMgcmVnaXN0ZXIgKi8KKyAgeyAicHMiLCBGUjMwX09QRVJBTkRfUFMsIEhXX0hfUFMsIDAsIDAsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHU0OiA0ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCisgIHsgInU0IiwgRlIzMF9PUEVSQU5EX1U0LCBIV19IX1VJTlQsIDgsIDQsCisgICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHU0YzogNCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLworICB7ICJ1NGMiLCBGUjMwX09QRVJBTkRfVTRDLCBIV19IX1VJTlQsIDEyLCA0LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiB1ODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLworICB7ICJ1OCIsIEZSMzBfT1BFUkFORF9VOCwgSFdfSF9VSU5ULCA4LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBpODogOCAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLworICB7ICJpOCIsIEZSMzBfT1BFUkFORF9JOCwgSFdfSF9VSU5ULCA0LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiB1ZGlzcDY6IDYgIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KKyAgeyAidWRpc3A2IiwgRlIzMF9PUEVSQU5EX1VESVNQNiwgSFdfSF9VSU5ULCA4LCA0LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkaXNwODogOCAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLworICB7ICJkaXNwOCIsIEZSMzBfT1BFUkFORF9ESVNQOCwgSFdfSF9TSU5ULCA0LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkaXNwOTogOSAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLworICB7ICJkaXNwOSIsIEZSMzBfT1BFUkFORF9ESVNQOSwgSFdfSF9TSU5ULCA0LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkaXNwMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KKyAgeyAiZGlzcDEwIiwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgSFdfSF9TSU5ULCA0LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBzMTA6IDEwIGJpdCBzaWduZWQgICBpbW1lZGlhdGUgKi8KKyAgeyAiczEwIiwgRlIzMF9PUEVSQU5EX1MxMCwgSFdfSF9TSU5ULCA4LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiB1MTA6IDEwIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KKyAgeyAidTEwIiwgRlIzMF9PUEVSQU5EX1UxMCwgSFdfSF9VSU5ULCA4LCA4LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBpMzI6IDMyIGJpdCBpbW1lZGlhdGUgKi8KKyAgeyAiaTMyIiwgRlIzMF9PUEVSQU5EX0kzMiwgSFdfSF9VSU5ULCAwLCAzMiwKKyAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogbTQ6IDQgIGJpdCBuZWdhdGl2ZSBpbW1lZGlhdGUgKi8KKyAgeyAibTQiLCBGUjMwX09QRVJBTkRfTTQsIEhXX0hfU0lOVCwgOCwgNCwKKyAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogaTIwOiAyMCBiaXQgaW1tZWRpYXRlICovCisgIHsgImkyMCIsIEZSMzBfT1BFUkFORF9JMjAsIEhXX0hfVUlOVCwgMCwgMjAsCisgICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoVklSVFVBTCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogZGlyODogOCAgYml0IGRpcmVjdCBhZGRyZXNzICovCisgIHsgImRpcjgiLCBGUjMwX09QRVJBTkRfRElSOCwgSFdfSF9VSU5ULCA4LCA4LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkaXI5OiA5ICBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KKyAgeyAiZGlyOSIsIEZSMzBfT1BFUkFORF9ESVI5LCBIV19IX1VJTlQsIDgsIDgsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGRpcjEwOiAxMCBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KKyAgeyAiZGlyMTAiLCBGUjMwX09QRVJBTkRfRElSMTAsIEhXX0hfVUlOVCwgOCwgOCwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogbGFiZWw5OiA5ICBiaXQgcGMgcmVsYXRpdmUgYWRkcmVzcyAqLworICB7ICJsYWJlbDkiLCBGUjMwX09QRVJBTkRfTEFCRUw5LCBIV19IX0lBRERSLCA4LCA4LAorICAgIHsgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGxhYmVsMTI6IDEyIGJpdCBwYyByZWxhdGl2ZSBhZGRyZXNzICovCisgIHsgImxhYmVsMTIiLCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgSFdfSF9JQUREUiwgNSwgMTEsCisgICAgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogcmVnbGlzdF9sb3dfbGQ6IDggYml0IGxvdyByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KKyAgeyAicmVnbGlzdF9sb3dfbGQiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQsIEhXX0hfVUlOVCwgOCwgOCwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogcmVnbGlzdF9oaV9sZDogOCBiaXQgaGlnaCByZWdpc3RlciBtYXNrIGZvciBsZG0gKi8KKyAgeyAicmVnbGlzdF9oaV9sZCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCBIV19IX1VJTlQsIDgsIDgsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHJlZ2xpc3RfbG93X3N0OiA4IGJpdCBsb3cgcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCisgIHsgInJlZ2xpc3RfbG93X3N0IiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCBIV19IX1VJTlQsIDgsIDgsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHJlZ2xpc3RfaGlfc3Q6IDggYml0IGhpZ2ggcmVnaXN0ZXIgbWFzayBmb3Igc3RtICovCisgIHsgInJlZ2xpc3RfaGlfc3QiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgSFdfSF9VSU5ULCA4LCA4LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBjYzogY29uZGl0aW9uIGNvZGVzICovCisgIHsgImNjIiwgRlIzMF9PUEVSQU5EX0NDLCBIV19IX1VJTlQsIDQsIDQsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGNjYzogY29wcm9jZXNzb3IgY2FsYyAqLworICB7ICJjY2MiLCBGUjMwX09QRVJBTkRfQ0NDLCBIV19IX1VJTlQsIDAsIDgsCisgICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIG5iaXQ6IG5lZ2F0aXZlICAgYml0ICovCisgIHsgIm5iaXQiLCBGUjMwX09QRVJBTkRfTkJJVCwgSFdfSF9OQklULCAwLCAwLAorICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiB2Yml0OiBvdmVyZmxvdyAgIGJpdCAqLworICB7ICJ2Yml0IiwgRlIzMF9PUEVSQU5EX1ZCSVQsIEhXX0hfVkJJVCwgMCwgMCwKKyAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogemJpdDogemVybyAgICAgICBiaXQgKi8KKyAgeyAiemJpdCIsIEZSMzBfT1BFUkFORF9aQklULCBIV19IX1pCSVQsIDAsIDAsCisgICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGNiaXQ6IGNhcnJ5ICAgICAgYml0ICovCisgIHsgImNiaXQiLCBGUjMwX09QRVJBTkRfQ0JJVCwgSFdfSF9DQklULCAwLCAwLAorICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBpYml0OiBpbnRlcnJ1cHQgIGJpdCAqLworICB7ICJpYml0IiwgRlIzMF9PUEVSQU5EX0lCSVQsIEhXX0hfSUJJVCwgMCwgMCwKKyAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc2JpdDogc3RhY2sgICAgICBiaXQgKi8KKyAgeyAic2JpdCIsIEZSMzBfT1BFUkFORF9TQklULCBIV19IX1NCSVQsIDAsIDAsCisgICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHRiaXQ6IHRyYWNlIHRyYXAgYml0ICovCisgIHsgInRiaXQiLCBGUjMwX09QRVJBTkRfVEJJVCwgSFdfSF9UQklULCAwLCAwLAorICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkMGJpdDogZGl2aXNpb24gMCBiaXQgKi8KKyAgeyAiZDBiaXQiLCBGUjMwX09QRVJBTkRfRDBCSVQsIEhXX0hfRDBCSVQsIDAsIDAsCisgICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGQxYml0OiBkaXZpc2lvbiAxIGJpdCAqLworICB7ICJkMWJpdCIsIEZSMzBfT1BFUkFORF9EMUJJVCwgSFdfSF9EMUJJVCwgMCwgMCwKKyAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogY2NyOiBjb25kaXRpb24gY29kZSBiaXRzICovCisgIHsgImNjciIsIEZSMzBfT1BFUkFORF9DQ1IsIEhXX0hfQ0NSLCAwLCAwLAorICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBzY3I6IHN5c3RlbSBjb25kaXRpb24gYml0cyAqLworICB7ICJzY3IiLCBGUjMwX09QRVJBTkRfU0NSLCBIV19IX1NDUiwgMCwgMCwKKyAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogaWxtOiBpbnRlcnJ1cHQgbGV2ZWwgbWFzayAqLworICB7ICJpbG0iLCBGUjMwX09QRVJBTkRfSUxNLCBIV19IX0lMTSwgMCwgMCwKKyAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IDAgfQorfTsKKworI3VuZGVmIEEKKworI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSU5TTl8sYSkpCisjZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCisKKy8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX0lCQVNFIGZyMzBfY2dlbl9pbnNuX3RhYmxlW01BWF9JTlNOU10gPQoreworICAvKiBTcGVjaWFsIG51bGwgZmlyc3QgZW50cnkuCisgICAgIEEgYG51bScgdmFsdWUgb2YgemVybyBpcyB0aHVzIGludmFsaWQuCisgICAgIEFsc28sIHRoZSBzcGVjaWFsIGBpbnZhbGlkJyBpbnNuIHJlc2lkZXMgaGVyZS4gICovCisgIHsgMCwgMCwgMCB9LAorLyogYWRkICRSaiwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BREQsICJhZGQiLCAiYWRkIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYWRkICR1NCwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BRERJLCAiYWRkaSIsICJhZGQiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhZGQyICRtNCwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BREQyLCAiYWRkMiIsICJhZGQyIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYWRkYyAkUmosJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQUREQywgImFkZGMiLCAiYWRkYyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFkZG4gJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0FERE4sICJhZGRuIiwgImFkZG4iLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhZGRuICR1NCwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BREROSSwgImFkZG5pIiwgImFkZG4iLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhZGRuMiAkbTQsJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQURETjIsICJhZGRuMiIsICJhZGRuMiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN1YiAkUmosJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN1YmMgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX1NVQkMsICJzdWJjIiwgInN1YmMiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdWJuICRSaiwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVUJOLCAic3VibiIsICJzdWJuIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wICRSaiwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9DTVAsICJjbXAiLCAiY21wIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wICR1NCwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9DTVBJLCAiY21waSIsICJjbXAiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXAyICRtNCwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9DTVAyLCAiY21wMiIsICJjbXAyIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYW5kICRSaiwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogb3IgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBlb3IgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0VPUiwgImVvciIsICJlb3IiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmQgJFJqLEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BTkRNLCAiYW5kbSIsICJhbmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmRoICRSaixAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQU5ESCwgImFuZGgiLCAiYW5kaCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFuZGIgJFJqLEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9BTkRCLCAiYW5kYiIsICJhbmRiIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogb3IgJFJqLEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9PUk0sICJvcm0iLCAib3IiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBvcmggJFJqLEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9PUkgsICJvcmgiLCAib3JoIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogb3JiICRSaixAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fT1JCLCAib3JiIiwgIm9yYiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGVvciAkUmosQCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0VPUk0sICJlb3JtIiwgImVvciIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGVvcmggJFJqLEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9FT1JILCAiZW9yaCIsICJlb3JoIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZW9yYiAkUmosQCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0VPUkIsICJlb3JiIiwgImVvcmIiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiYW5kbCAkdTQsQCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0JBTkRMLCAiYmFuZGwiLCAiYmFuZGwiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBib3JsICR1NCxAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQk9STCwgImJvcmwiLCAiYm9ybCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJlb3JsICR1NCxAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQkVPUkwsICJiZW9ybCIsICJiZW9ybCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJhbmRoICR1NCxAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQkFOREgsICJiYW5kaCIsICJiYW5kaCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJvcmggJHU0LEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CT1JILCAiYm9yaCIsICJib3JoIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmVvcmggJHU0LEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CRU9SSCwgImJlb3JoIiwgImJlb3JoIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnRzdGwgJHU0LEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CVFNUTCwgImJ0c3RsIiwgImJ0c3RsIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnRzdGggJHU0LEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CVFNUSCwgImJ0c3RoIiwgImJ0c3RoIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbXVsICRSaiwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9NVUwsICJtdWwiLCAibXVsIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbXVsdSAkUmosJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTVVMVSwgIm11bHUiLCAibXVsdSIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG11bGggJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX01VTEgsICJtdWxoIiwgIm11bGgiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtdWx1aCAkUmosJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTVVMVUgsICJtdWx1aCIsICJtdWx1aCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRpdjBzICRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0RJVjBTLCAiZGl2MHMiLCAiZGl2MHMiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkaXYwdSAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ESVYwVSwgImRpdjB1IiwgImRpdjB1IiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2MSAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ESVYxLCAiZGl2MSIsICJkaXYxIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2MiAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ESVYyLCAiZGl2MiIsICJkaXYyIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2MyAqLworICB7CisgICAgRlIzMF9JTlNOX0RJVjMsICJkaXYzIiwgImRpdjMiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkaXY0cyAqLworICB7CisgICAgRlIzMF9JTlNOX0RJVjRTLCAiZGl2NHMiLCAiZGl2NHMiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsc2wgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xTTCwgImxzbCIsICJsc2wiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsc2wgJHU0LCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xTTEksICJsc2xpIiwgImxzbCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxzbDIgJHU0LCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xTTDIsICJsc2wyIiwgImxzbDIiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsc3IgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xTUiwgImxzciIsICJsc3IiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsc3IgJHU0LCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xTUkksICJsc3JpIiwgImxzciIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxzcjIgJHU0LCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xTUjIsICJsc3IyIiwgImxzcjIiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhc3IgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0FTUiwgImFzciIsICJhc3IiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhc3IgJHU0LCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0FTUkksICJhc3JpIiwgImFzciIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFzcjIgJHU0LCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0FTUjIsICJhc3IyIiwgImFzcjIiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGk6OCAkaTgsJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTERJOCwgImxkaTgiLCAibGRpOjgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGk6MjAgJGkyMCwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9MREkyMCwgImxkaTIwIiwgImxkaToyMCIsIDMyLAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaTozMiAkaTMyLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xESTMyLCAibGRpMzIiLCAibGRpOjMyIiwgNDgsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgQCRSaiwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9MRCwgImxkIiwgImxkIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR1aCBAJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xEVUgsICJsZHVoIiwgImxkdWgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHViIEAkUmosJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkIEAoJFIxMywkUmopLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xEUjEzLCAibGRyMTMiLCAibGQiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xEUjEzVUgsICJsZHIxM3VoIiwgImxkdWgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHViIEAoJFIxMywkUmopLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xEUjEzVUIsICJsZHIxM3ViIiwgImxkdWIiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZCBAKCRSMTQsJGRpc3AxMCksJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTERSMTQsICJsZHIxNCIsICJsZCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTERSMTRVSCwgImxkcjE0dWgiLCAibGR1aCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTERSMTRVQiwgImxkcjE0dWIiLCAibGR1YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9MRFIxNSwgImxkcjE1IiwgImxkIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgQCRSMTUrLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0xEUjE1R1IsICJsZHIxNWdyIiwgImxkIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgQCRSMTUrLCRSczIgKi8KKyAgeworICAgIEZSMzBfSU5TTl9MRFIxNURSLCAibGRyMTVkciIsICJsZCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkIEAkUjE1KywkcHMgKi8KKyAgeworICAgIEZSMzBfSU5TTl9MRFIxNVBTLCAibGRyMTVwcyIsICJsZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRSaSxAJFJqICovCisgIHsKKyAgICBGUjMwX0lOU05fU1QsICJzdCIsICJzdCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0aCAkUmksQCRSaiAqLworICB7CisgICAgRlIzMF9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdGIgJFJpLEAkUmogKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3QgJFJpLEAoJFIxMywkUmopICovCisgIHsKKyAgICBGUjMwX0lOU05fU1RSMTMsICJzdHIxMyIsICJzdCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0aCAkUmksQCgkUjEzLCRSaikgKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVFIxM0gsICJzdHIxM2giLCAic3RoIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLworICB7CisgICAgRlIzMF9JTlNOX1NUUjEzQiwgInN0cjEzYiIsICJzdGIiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCisgIHsKKyAgICBGUjMwX0lOU05fU1RSMTQsICJzdHIxNCIsICJzdCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVFIxNEgsICJzdHIxNGgiLCAic3RoIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RiICRSaSxAKCRSMTQsJGRpc3A4KSAqLworICB7CisgICAgRlIzMF9JTlNOX1NUUjE0QiwgInN0cjE0YiIsICJzdGIiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCisgIHsKKyAgICBGUjMwX0lOU05fU1RSMTUsICJzdHIxNSIsICJzdCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRSaSxALSRSMTUgKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVFIxNUdSLCAic3RyMTVnciIsICJzdCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRSczIsQC0kUjE1ICovCisgIHsKKyAgICBGUjMwX0lOU05fU1RSMTVEUiwgInN0cjE1ZHIiLCAic3QiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkcHMsQC0kUjE1ICovCisgIHsKKyAgICBGUjMwX0lOU05fU1RSMTVQUywgInN0cjE1cHMiLCAic3QiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtb3YgJFJqLCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX01PViwgIm1vdiIsICJtb3YiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtb3YgJFJzMSwkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9NT1ZEUiwgIm1vdmRyIiwgIm1vdiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG1vdiAkcHMsJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fTU9WUFMsICJtb3ZwcyIsICJtb3YiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtb3YgJFJpLCRSczEgKi8KKyAgeworICAgIEZSMzBfSU5TTl9NT1YyRFIsICJtb3YyZHIiLCAibW92IiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbW92ICRSaSwkcHMgKi8KKyAgeworICAgIEZSMzBfSU5TTl9NT1YyUFMsICJtb3YycHMiLCAibW92IiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogam1wIEAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBqbXA6ZCBAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fSk1QRCwgImptcGQiLCAiam1wOmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY2FsbCBAJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fQ0FMTFIsICJjYWxsciIsICJjYWxsIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjYWxsOmQgQCRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0NBTExSRCwgImNhbGxyZCIsICJjYWxsOmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY2FsbCAkbGFiZWwxMiAqLworICB7CisgICAgRlIzMF9JTlNOX0NBTEwsICJjYWxsIiwgImNhbGwiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNhbGw6ZCAkbGFiZWwxMiAqLworICB7CisgICAgRlIzMF9JTlNOX0NBTExELCAiY2FsbGQiLCAiY2FsbDpkIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJldCAqLworICB7CisgICAgRlIzMF9JTlNOX1JFVCwgInJldCIsICJyZXQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJldDpkICovCisgIHsKKyAgICBGUjMwX0lOU05fUkVUX0QsICJyZXQ6ZCIsICJyZXQ6ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBpbnQgJHU4ICovCisgIHsKKyAgICBGUjMwX0lOU05fSU5ULCAiaW50IiwgImludCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogaW50ZSAqLworICB7CisgICAgRlIzMF9JTlNOX0lOVEUsICJpbnRlIiwgImludGUiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJldGkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9SRVRJLCAicmV0aSIsICJyZXRpIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnJhOmQgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JSQUQsICJicmFkIiwgImJyYTpkIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJyYSAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQlJBLCAiYnJhIiwgImJyYSIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm5vOmQgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JOT0QsICJibm9kIiwgImJubzpkIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibm8gJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JOTywgImJubyIsICJibm8iLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiZXE6ZCAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkVRRCwgImJlcWQiLCAiYmVxOmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJlcSAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJuZTpkICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CTkVELCAiYm5lZCIsICJibmU6ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm5lICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmM6ZCAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkNELCAiYmNkIiwgImJjOmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJjICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CQywgImJjIiwgImJjIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm5jOmQgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JOQ0QsICJibmNkIiwgImJuYzpkIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibmMgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JOQywgImJuYyIsICJibmMiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibjpkICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CTkQsICJibmQiLCAiYm46ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm4gJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JOLCAiYm4iLCAiYm4iLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBicDpkICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CUEQsICJicGQiLCAiYnA6ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnAgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JQLCAiYnAiLCAiYnAiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBidjpkICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CVkQsICJidmQiLCAiYnY6ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnYgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JWLCAiYnYiLCAiYnYiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibnY6ZCAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQk5WRCwgImJudmQiLCAiYm52OmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJudiAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQk5WLCAiYm52IiwgImJudiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsdDpkICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CTFRELCAiYmx0ZCIsICJibHQ6ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmx0ICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CTFQsICJibHQiLCAiYmx0IiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmdlOmQgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JHRUQsICJiZ2VkIiwgImJnZTpkIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiZ2UgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JHRSwgImJnZSIsICJiZ2UiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibGU6ZCAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkxFRCwgImJsZWQiLCAiYmxlOmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsZSAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkxFLCAiYmxlIiwgImJsZSIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJndDpkICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CR1RELCAiYmd0ZCIsICJiZ3Q6ZCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmd0ICRsYWJlbDkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9CR1QsICJiZ3QiLCAiYmd0IiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmxzOmQgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JMU0QsICJibHNkIiwgImJsczpkIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibHMgJGxhYmVsOSAqLworICB7CisgICAgRlIzMF9JTlNOX0JMUywgImJscyIsICJibHMiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiaGk6ZCAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkhJRCwgImJoaWQiLCAiYmhpOmQiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJoaSAkbGFiZWw5ICovCisgIHsKKyAgICBGUjMwX0lOU05fQkhJLCAiYmhpIiwgImJoaSIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3YgJFIxMyxAJGRpcjEwICovCisgIHsKKyAgICBGUjMwX0lOU05fRE1PVlIxMywgImRtb3ZyMTMiLCAiZG1vdiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3ZoICRSMTMsQCRkaXI5ICovCisgIHsKKyAgICBGUjMwX0lOU05fRE1PVlIxM0gsICJkbW92cjEzaCIsICJkbW92aCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCisgIHsKKyAgICBGUjMwX0lOU05fRE1PVlIxM0IsICJkbW92cjEzYiIsICJkbW92YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WUjEzUEksICJkbW92cjEzcGkiLCAiZG1vdiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WUjEzUElILCAiZG1vdnIxM3BpaCIsICJkbW92aCIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WUjEzUElCLCAiZG1vdnIxM3BpYiIsICJkbW92YiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3YgQCRSMTUrLEAkZGlyMTAgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WUjE1UEksICJkbW92cjE1cGkiLCAiZG1vdiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3YgQCRkaXIxMCwkUjEzICovCisgIHsKKyAgICBGUjMwX0lOU05fRE1PVjJSMTMsICJkbW92MnIxMyIsICJkbW92IiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZG1vdmggQCRkaXI5LCRSMTMgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WMlIxM0gsICJkbW92MnIxM2giLCAiZG1vdmgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkbW92YiBAJGRpcjgsJFIxMyAqLworICB7CisgICAgRlIzMF9JTlNOX0RNT1YyUjEzQiwgImRtb3YycjEzYiIsICJkbW92YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCAiZG1vdjJyMTNwaSIsICJkbW92IiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZG1vdmggQCRkaXI5LEAkUjEzKyAqLworICB7CisgICAgRlIzMF9JTlNOX0RNT1YyUjEzUElILCAiZG1vdjJyMTNwaWgiLCAiZG1vdmgiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkbW92YiBAJGRpcjgsQCRSMTMrICovCisgIHsKKyAgICBGUjMwX0lOU05fRE1PVjJSMTNQSUIsICJkbW92MnIxM3BpYiIsICJkbW92YiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KKyAgeworICAgIEZSMzBfSU5TTl9ETU9WMlIxNVBELCAiZG1vdjJyMTVwZCIsICJkbW92IiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRyZXMgQCRSaSssJHU0ICovCisgIHsKKyAgICBGUjMwX0lOU05fTERSRVMsICJsZHJlcyIsICJsZHJlcyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0cmVzICR1NCxAJFJpKyAqLworICB7CisgICAgRlIzMF9JTlNOX1NUUkVTLCAic3RyZXMiLCAic3RyZXMiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCisgIHsKKyAgICBGUjMwX0lOU05fQ09QT1AsICJjb3BvcCIsICJjb3BvcCIsIDMyLAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9DT1BMRCwgImNvcGxkIiwgImNvcGxkIiwgMzIsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLworICB7CisgICAgRlIzMF9JTlNOX0NPUFNULCAiY29wc3QiLCAiY29wc3QiLCAzMiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCisgIHsKKyAgICBGUjMwX0lOU05fQ09QU1YsICJjb3BzdiIsICJjb3BzdiIsIDMyLAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vcCAqLworICB7CisgICAgRlIzMF9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmRjY3IgJHU4ICovCisgIHsKKyAgICBGUjMwX0lOU05fQU5EQ0NSLCAiYW5kY2NyIiwgImFuZGNjciIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG9yY2NyICR1OCAqLworICB7CisgICAgRlIzMF9JTlNOX09SQ0NSLCAib3JjY3IiLCAib3JjY3IiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdGlsbSAkdTggKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVElMTSwgInN0aWxtIiwgInN0aWxtIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYWRkc3AgJHMxMCAqLworICB7CisgICAgRlIzMF9JTlNOX0FERFNQLCAiYWRkc3AiLCAiYWRkc3AiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBleHRzYiAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9FWFRTQiwgImV4dHNiIiwgImV4dHNiIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZXh0dWIgJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fRVhUVUIsICJleHR1YiIsICJleHR1YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGV4dHNoICRSaSAqLworICB7CisgICAgRlIzMF9JTlNOX0VYVFNILCAiZXh0c2giLCAiZXh0c2giLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBleHR1aCAkUmkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9FWFRVSCwgImV4dHVoIiwgImV4dHVoIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRtMCAoJHJlZ2xpc3RfbG93X2xkKSAqLworICB7CisgICAgRlIzMF9JTlNOX0xETTAsICJsZG0wIiwgImxkbTAiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9MRE0xLCAibGRtMSIsICJsZG0xIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RtMCAoJHJlZ2xpc3RfbG93X3N0KSAqLworICB7CisgICAgRlIzMF9JTlNOX1NUTTAsICJzdG0wIiwgInN0bTAiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KKyAgeworICAgIEZSMzBfSU5TTl9TVE0xLCAic3RtMSIsICJzdG0xIiwgMTYsCisgICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZW50ZXIgJHUxMCAqLworICB7CisgICAgRlIzMF9JTlNOX0VOVEVSLCAiZW50ZXIiLCAiZW50ZXIiLCAxNiwKKyAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZWF2ZSAqLworICB7CisgICAgRlIzMF9JTlNOX0xFQVZFLCAibGVhdmUiLCAibGVhdmUiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiB4Y2hiIEAkUmosJFJpICovCisgIHsKKyAgICBGUjMwX0lOU05fWENIQiwgInhjaGIiLCAieGNoYiIsIDE2LAorICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKK307CisKKyN1bmRlZiBBCisjdW5kZWYgTU5FTQorI3VuZGVmIE9QCisKKy8qIEluaXRpYWxpemUgYW55dGhpbmcgbmVlZGVkIHRvIGJlIGRvbmUgb25jZSwgYmVmb3JlIGFueSBjcHVfb3BlbiBjYWxsLiAgKi8KKworc3RhdGljIHZvaWQKK2luaXRfdGFibGVzICgpCit7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGxvb2sgdXAgYSBtYWNoIHZpYSBpdHMgYmZkIG5hbWUuICAqLworCitzdGF0aWMgY29uc3QgQ0dFTl9NQUNIICoKK2xvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAodGFibGUsIG5hbWUpCisgICAgIGNvbnN0IENHRU5fTUFDSCAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHdoaWxlICh0YWJsZS0+bmFtZSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChuYW1lLCB0YWJsZS0+YmZkX25hbWUpID09IDApCisJcmV0dXJuIHRhYmxlOworICAgICAgKyt0YWJsZTsKKyAgICB9CisgIGFib3J0ICgpOworfQorCisvKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfaHdfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Cit7CisgIGludCBpOworICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7CisgIGNvbnN0IENHRU5fSFdfRU5UUlkgKmluaXQgPSAmIGZyMzBfY2dlbl9od190YWJsZVswXTsKKyAgLyogTUFYX0hXIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgorICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCisgICAgIHRoZSB0YWJsZS4gICovCisgIGNvbnN0IENHRU5fSFdfRU5UUlkgKipzZWxlY3RlZCA9CisgICAgKGNvbnN0IENHRU5fSFdfRU5UUlkgKiopIHhtYWxsb2MgKE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7CisKKyAgY2QtPmh3X3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7CisgIGNkLT5od190YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0hXX0VOVFJZKTsKKyAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKKyAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaHMgdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCisgIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCisgICAgaWYgKENHRU5fSFdfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fSFdfTUFDSCkKKwkmIG1hY2hzKQorICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOworICBjZC0+aHdfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOworICBjZC0+aHdfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfSFc7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitidWlsZF9pZmllbGRfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Cit7CisgIGNkLT5pZmxkX3RhYmxlID0gJiBmcjMwX2NnZW5faWZsZF90YWJsZVswXTsKK30KKworLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2J1aWxkX29wZXJhbmRfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Cit7CisgIGludCBpOworICBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7CisgIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdCA9ICYgZnIzMF9jZ2VuX29wZXJhbmRfdGFibGVbMF07CisgIC8qIE1BWF9PUEVSQU5EUyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KKyAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgorICAgICB0aGUgdGFibGUuICAqLworICBjb25zdCBDR0VOX09QRVJBTkQgKipzZWxlY3RlZCA9CisgICAgKGNvbnN0IENHRU5fT1BFUkFORCAqKikgeG1hbGxvYyAoTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOworCisgIGNkLT5vcGVyYW5kX3RhYmxlLmluaXRfZW50cmllcyA9IGluaXQ7CisgIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fT1BFUkFORCk7CisgIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKKyAgLyogPz8/IEZvciBub3cgd2UganVzdCB1c2UgbWFjaCB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KKyAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKKyAgICBpZiAoQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX09QRVJBTkRfTUFDSCkKKwkmIG1hY2hzKQorICAgICAgc2VsZWN0ZWRbaW5pdFtpXS50eXBlXSA9ICZpbml0W2ldOworICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7CisgIGNkLT5vcGVyYW5kX3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX09QRVJBTkRTOworfQorCisvKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuCisgICA/Pz8gVGhpcyBjb3VsZCBsZWF2ZSBvdXQgaW5zbnMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3BlY2lmaWVkIG1hY2gvaXNhLAorICAgYnV0IHRoYXQgd291bGQgY2F1c2UgZXJyb3JzIGxpa2UgImZvbyBvbmx5IHN1cHBvcnRlZCBieSBiYXIiIHRvIGJlY29tZQorICAgInVua25vd24gaW5zbiIsIHNvIGZvciBub3cgd2UgaW5jbHVkZSBhbGwgaW5zbnMgYW5kIHJlcXVpcmUgdGhlIGFwcCB0bworICAgZG8gdGhlIGNoZWNraW5nIGxhdGVyLgorICAgPz8/IE9uIHRoZSBvdGhlciBoYW5kLCBwYXJzaW5nIG9mIHN1Y2ggaW5zbnMgbWF5IHJlcXVpcmUgdGhlaXIgaGFyZHdhcmUgb3IKKyAgIG9wZXJhbmQgZWxlbWVudHMgdG8gYmUgaW4gdGhlIHRhYmxlIFt3aGljaCB0aGV5IG1pZ2h0bid0IGJlXS4gICovCisKK3N0YXRpYyB2b2lkCitidWlsZF9pbnNuX3RhYmxlIChjZCkKKyAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOworeworICBpbnQgaTsKKyAgY29uc3QgQ0dFTl9JQkFTRSAqaWIgPSAmIGZyMzBfY2dlbl9pbnNuX3RhYmxlWzBdOworICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOworCisgIG1lbXNldCAoaW5zbnMsIDAsIE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKKyAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOworICBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMgPSBpbnNuczsKKyAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7CisgIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIHJlYnVpbGQgdGhlIHRhYmxlcy4gICovCisKK3N0YXRpYyB2b2lkCitmcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKQorICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Cit7CisgIGludCBpLG5faXNhcyxuX21hY2hzOworICB1bnNpZ25lZCBpbnQgaXNhcyA9IGNkLT5pc2FzOworICB1bnNpZ25lZCBpbnQgbWFjaHMgPSBjZC0+bWFjaHM7CisKKyAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7CisKKyAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIGlzYSBzcGVjLiAgKi8KKyNkZWZpbmUgVU5TRVQgKENHRU5fU0laRV9VTktOT1dOICsgMSkKKyAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gVU5TRVQ7CisgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IFVOU0VUOworICBjZC0+bWluX2luc25fYml0c2l6ZSA9IDY1NTM1OyAvKiBzb21lIHJpZGljdWxvdXNseSBiaWcgbnVtYmVyICovCisgIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9JU0FTOyArK2kpCisgICAgaWYgKCgoMSA8PCBpKSAmIGlzYXMpICE9IDApCisgICAgICB7CisJY29uc3QgQ0dFTl9JU0EgKmlzYSA9ICYgZnIzMF9jZ2VuX2lzYV90YWJsZVtpXTsKKworCS8qIERlZmF1bHQgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAorCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLworCWlmIChjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCisJICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplOworCWVsc2UgaWYgKGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPT0gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplKQorCSAgOyAvKiB0aGlzIGlzIG9rICovCisJZWxzZQorCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047CisKKwkvKiBCYXNlIGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKKwkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KKwlpZiAoY2QtPmJhc2VfaW5zbl9iaXRzaXplID09IFVOU0VUKQorCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gaXNhLT5iYXNlX2luc25fYml0c2l6ZTsKKwllbHNlIGlmIChpc2EtPmJhc2VfaW5zbl9iaXRzaXplID09IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKKwkgIDsgLyogdGhpcyBpcyBvayAqLworCWVsc2UKKwkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOworCisJLyogU2V0IG1pbixtYXggaW5zbiBzaXplcy4gICovCisJaWYgKGlzYS0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5taW5faW5zbl9iaXRzaXplKQorCSAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSBpc2EtPm1pbl9pbnNuX2JpdHNpemU7CisJaWYgKGlzYS0+bWF4X2luc25fYml0c2l6ZSA+IGNkLT5tYXhfaW5zbl9iaXRzaXplKQorCSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSBpc2EtPm1heF9pbnNuX2JpdHNpemU7CisKKwkrK25faXNhczsKKyAgICAgIH0KKworICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgbWFjaCBzcGVjLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUNIUzsgKytpKQorICAgIGlmICgoKDEgPDwgaSkgJiBtYWNocykgIT0gMCkKKyAgICAgIHsKKwljb25zdCBDR0VOX01BQ0ggKm1hY2ggPSAmIGZyMzBfY2dlbl9tYWNoX3RhYmxlW2ldOworCisJKytuX21hY2hzOworICAgICAgfQorCisgIC8qIERldGVybWluZSB3aGljaCBodyBlbGVtZW50cyBhcmUgdXNlZCBieSBNQUNILiAgKi8KKyAgYnVpbGRfaHdfdGFibGUgKGNkKTsKKworICAvKiBCdWlsZCB0aGUgaWZpZWxkIHRhYmxlLiAgKi8KKyAgYnVpbGRfaWZpZWxkX3RhYmxlIChjZCk7CisKKyAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmRzIGFyZSB1c2VkIGJ5IE1BQ0gvSVNBLiAgKi8KKyAgYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpOworCisgIC8qIEJ1aWxkIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCisgIGJ1aWxkX2luc25fdGFibGUgKGNkKTsKK30KKworLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KKyAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLgorICAgVGhlIGFyZ3VtZW50cyBhcmUgYSBzZXQgb2YgKHR5cGUvdmFsdWUpIHBhaXJzLCB0ZXJtaW5hdGVkIHdpdGgKKyAgIENHRU5fQ1BVX09QRU5fRU5ELgorCisgICBDdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlczoKKyAgIENHRU5fQ1BVX09QRU5fSVNBUzogICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIGlzYV9hdHRyCisgICBDR0VOX0NQVV9PUEVOX01BQ0hTOiAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBtYWNoX2F0dHIKKyAgIENHRU5fQ1BVX09QRU5fQkZETUFDSDogc3BlY2lmeSAxIG1hY2ggdXNpbmcgYmZkIG5hbWUKKyAgIENHRU5fQ1BVX09QRU5fRU5ESUFOOiAgc3BlY2lmeSBlbmRpYW4gY2hvaWNlCisgICBDR0VOX0NQVV9PUEVOX0VORDogICAgIHRlcm1pbmF0ZXMgYXJndW1lbnRzCisKKyAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCisgICBwcmVjbHVkZWQuCisKKyAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgorICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQorICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCisKK0NHRU5fQ1BVX0RFU0MKK2ZyMzBfY2dlbl9jcHVfb3BlbiAoZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyBhcmdfdHlwZSwgLi4uKQoreworICBDR0VOX0NQVV9UQUJMRSAqY2QgPSAoQ0dFTl9DUFVfVEFCTEUgKikgeG1hbGxvYyAoc2l6ZW9mIChDR0VOX0NQVV9UQUJMRSkpOworICBzdGF0aWMgaW50IGluaXRfcDsKKyAgdW5zaWduZWQgaW50IGlzYXMgPSAwOyAgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KKyAgdW5zaWduZWQgaW50IG1hY2hzID0gMDsgLyogMCA9ICJ1bnNwZWNpZmllZCIgKi8KKyAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW4gPSBDR0VOX0VORElBTl9VTktOT1dOOworICB2YV9saXN0IGFwOworCisgIGlmICghIGluaXRfcCkKKyAgICB7CisgICAgICBpbml0X3RhYmxlcyAoKTsKKyAgICAgIGluaXRfcCA9IDE7CisgICAgfQorCisgIG1lbXNldCAoY2QsIDAsIHNpemVvZiAoKmNkKSk7CisKKyAgdmFfc3RhcnQgKGFwLCBhcmdfdHlwZSk7CisgIHdoaWxlIChhcmdfdHlwZSAhPSBDR0VOX0NQVV9PUEVOX0VORCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGFyZ190eXBlKQorCXsKKwljYXNlIENHRU5fQ1BVX09QRU5fSVNBUyA6CisJICBpc2FzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKKwkgIGJyZWFrOworCWNhc2UgQ0dFTl9DUFVfT1BFTl9NQUNIUyA6CisJICBtYWNocyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7CisJICBicmVhazsKKwljYXNlIENHRU5fQ1BVX09QRU5fQkZETUFDSCA6CisJICB7CisJICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOworCSAgICBjb25zdCBDR0VOX01BQ0ggKm1hY2ggPQorCSAgICAgIGxvb2t1cF9tYWNoX3ZpYV9iZmRfbmFtZSAoZnIzMF9jZ2VuX21hY2hfdGFibGUsIG5hbWUpOworCisJICAgIG1hY2hzIHw9IG1hY2gtPm51bSA8PCAxOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIENHRU5fQ1BVX09QRU5fRU5ESUFOIDoKKwkgIGVuZGlhbiA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9lbmRpYW4pOworCSAgYnJlYWs7CisJZGVmYXVsdCA6CisJICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IHVuc3VwcG9ydGVkIGFyZ3VtZW50IGAlZCdcbiIsCisJCSAgIGFyZ190eXBlKTsKKwkgIGFib3J0ICgpOyAvKiA/Pz8gcmV0dXJuIE5VTEw/ICovCisJfQorICAgICAgYXJnX3R5cGUgPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTsKKyAgICB9CisgIHZhX2VuZCAoYXApOworCisgIC8qIG1hY2ggdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KKyAgaWYgKG1hY2hzID09IDApCisgICAgbWFjaHMgPSAoMSA8PCBNQVhfTUFDSFMpIC0gMTsKKyAgLyogYmFzZSBtYWNoIGlzIGFsd2F5cyBzZWxlY3RlZCAqLworICBtYWNocyB8PSAxOworICAvKiBpc2EgdW5zcGVjaWZpZWQgbWVhbnMgImFsbCIgKi8KKyAgaWYgKGlzYXMgPT0gMCkKKyAgICBpc2FzID0gKDEgPDwgTUFYX0lTQVMpIC0gMTsKKyAgaWYgKGVuZGlhbiA9PSBDR0VOX0VORElBTl9VTktOT1dOKQorICAgIHsKKyAgICAgIC8qID8/PyBJZiB0YXJnZXQgaGFzIG9ubHkgb25lLCBjb3VsZCBoYXZlIGEgZGVmYXVsdC4gICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJmcjMwX2NnZW5fY3B1X29wZW46IG5vIGVuZGlhbm5lc3Mgc3BlY2lmaWVkXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBjZC0+aXNhcyA9IGlzYXM7CisgIGNkLT5tYWNocyA9IG1hY2hzOworICBjZC0+ZW5kaWFuID0gZW5kaWFuOworICAvKiBGSVhNRTogZm9yIHRoZSBzcGFyYyBjYXNlIHdlIGNhbiBkZXRlcm1pbmUgaW5zbi1lbmRpYW5uZXNzIHN0YXRpY2FsbHkuCisgICAgIFRoZSB3b3JyeSBoZXJlIGlzIHdoZXJlIGJvdGggZGF0YSBhbmQgaW5zbiBlbmRpYW4gY2FuIGJlIGluZGVwZW5kZW50bHkKKyAgICAgY2hvc2VuLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIGFub3RoZXIgYXJndW1lbnQuCisgICAgIEFjdHVhbGx5LCB3aWxsIHdhbnQgdG8gYWxsb3cgZm9yIG1vcmUgYXJndW1lbnRzIGluIHRoZSBmdXR1cmUgYW55d2F5LiAgKi8KKyAgY2QtPmluc25fZW5kaWFuID0gZW5kaWFuOworCisgIC8qIFRhYmxlIChyZSlidWlsZGVyLiAgKi8KKyAgY2QtPnJlYnVpbGRfdGFibGVzID0gZnIzMF9jZ2VuX3JlYnVpbGRfdGFibGVzOworICBmcjMwX2NnZW5fcmVidWlsZF90YWJsZXMgKGNkKTsKKworICByZXR1cm4gKENHRU5fQ1BVX0RFU0MpIGNkOworfQorCisvKiBDb3ZlciBmbiB0byBmcjMwX2NnZW5fY3B1X29wZW4gdG8gaGFuZGxlIHRoZSBzaW1wbGUgY2FzZSBvZiAxIGlzYSwgMSBtYWNoLgorICAgTUFDSF9OQU1FIGlzIHRoZSBiZmQgbmFtZSBvZiB0aGUgbWFjaC4gICovCisKK0NHRU5fQ1BVX0RFU0MKK2ZyMzBfY2dlbl9jcHVfb3Blbl8xIChtYWNoX25hbWUsIGVuZGlhbikKKyAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOworICAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKK3sKKyAgcmV0dXJuIGZyMzBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCisJCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIGVuZGlhbiwKKwkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORCk7Cit9CisKKy8qIENsb3NlIGEgY3B1IHRhYmxlLgorICAgPz8/IFRoaXMgY2FuIGxpdmUgaW4gYSBtYWNoaW5lIGluZGVwZW5kZW50IGZpbGUsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseQorICAgbm8gcGxhY2UgdG8gcHV0IHRoaXMgZmlsZSAodGhlcmUncyBubyBsaWJjZ2VuKS4gIGxpYm9wY29kZXMgaXMgdGhlIHdyb25nCisgICBwbGFjZSBhcyBzb21lIHNpbXVsYXRvciBwb3J0cyB1c2UgdGhpcyBidXQgdGhleSBkb24ndCB1c2UgbGlib3Bjb2Rlcy4gICovCisKK3ZvaWQKK2ZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBpZiAoY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKQorICAgIGZyZWUgKChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzKTsKKyAgaWYgKGNkLT5od190YWJsZS5lbnRyaWVzKQorICAgIGZyZWUgKChDR0VOX0hXX0VOVFJZICopIGNkLT5od190YWJsZS5lbnRyaWVzKTsKKyAgZnJlZSAoY2QpOworfQorCmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtZGVzYy5oIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjg5MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9mcjMwLWRlc2MuaApAQCAtMCwwICsxLDI2NiBAQAorLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBmcjMwLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaWZuZGVmIEZSMzBfQ1BVX0gKKyNkZWZpbmUgRlIzMF9DUFVfSAorCisjZGVmaW5lIENHRU5fQVJDSCBmcjMwCisKKy8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gZnIzMF9jZ2VuXzxTPi4gICovCisjZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKGZyMzAsX2NnZW5fLHMpCisKKy8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCisjZGVmaW5lIEhBVkVfQ1BVX0ZSMzBCRgorCisjZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAorCisvKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCisjZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA2CisKKyNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDAKKworLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLworCisvKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCisgICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKKyAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLworI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCisvKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBhbnkgaW5zbiBvciBtYWNyby1pbnNuIGhhcy4gICovCisjZGVmaW5lIENHRU5fTUFYX0lOU05fT1BFUkFORFMgMTYKKworLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyA3CisKKy8qIEVudW1zLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDEgZW51bXMuICAqLwordHlwZWRlZiBlbnVtIGluc25fb3AxIHsKKyAgT1AxXzAsIE9QMV8xLCBPUDFfMiwgT1AxXzMKKyAsIE9QMV80LCBPUDFfNSwgT1AxXzYsIE9QMV83CisgLCBPUDFfOCwgT1AxXzksIE9QMV9BLCBPUDFfQgorICwgT1AxX0MsIE9QMV9ELCBPUDFfRSwgT1AxX0YKK30gSU5TTl9PUDE7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AyIGVudW1zLiAgKi8KK3R5cGVkZWYgZW51bSBpbnNuX29wMiB7CisgIE9QMl8wLCBPUDJfMSwgT1AyXzIsIE9QMl8zCisgLCBPUDJfNCwgT1AyXzUsIE9QMl82LCBPUDJfNworICwgT1AyXzgsIE9QMl85LCBPUDJfQSwgT1AyX0IKKyAsIE9QMl9DLCBPUDJfRCwgT1AyX0UsIE9QMl9GCit9IElOU05fT1AyOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMyBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9vcDMgeworICBPUDNfMCwgT1AzXzEsIE9QM18yLCBPUDNfMworICwgT1AzXzQsIE9QM181LCBPUDNfNiwgT1AzXzcKKyAsIE9QM184LCBPUDNfOSwgT1AzX0EsIE9QM19CCisgLCBPUDNfQywgT1AzX0QsIE9QM19FLCBPUDNfRgorfSBJTlNOX09QMzsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDQgZW51bXMuICAqLwordHlwZWRlZiBlbnVtIGluc25fb3A0IHsKKyAgT1A0XzAKK30gSU5TTl9PUDQ7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3A1IGVudW1zLiAgKi8KK3R5cGVkZWYgZW51bSBpbnNuX29wNSB7CisgIE9QNV8wLCBPUDVfMQorfSBJTlNOX09QNTsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBjYyBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9jYyB7CisgIENDX1JBLCBDQ19OTywgQ0NfRVEsIENDX05FCisgLCBDQ19DLCBDQ19OQywgQ0NfTiwgQ0NfUAorICwgQ0NfViwgQ0NfTlYsIENDX0xULCBDQ19HRQorICwgQ0NfTEUsIENDX0dULCBDQ19MUywgQ0NfSEkKK30gSU5TTl9DQzsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KK3R5cGVkZWYgZW51bSBncl9uYW1lcyB7CisgIEhfR1JfUjAgPSAwLCBIX0dSX1IxID0gMSwgSF9HUl9SMiA9IDIsIEhfR1JfUjMgPSAzCisgLCBIX0dSX1I0ID0gNCwgSF9HUl9SNSA9IDUsIEhfR1JfUjYgPSA2LCBIX0dSX1I3ID0gNworICwgSF9HUl9SOCA9IDgsIEhfR1JfUjkgPSA5LCBIX0dSX1IxMCA9IDEwLCBIX0dSX1IxMSA9IDExCisgLCBIX0dSX1IxMiA9IDEyLCBIX0dSX1IxMyA9IDEzLCBIX0dSX1IxNCA9IDE0LCBIX0dSX1IxNSA9IDE1CisgLCBIX0dSX0FDID0gMTMsIEhfR1JfRlAgPSAxNCwgSF9HUl9TUCA9IDE1Cit9IEdSX05BTUVTOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwordHlwZWRlZiBlbnVtIGNyX25hbWVzIHsKKyAgSF9DUl9DUjAsIEhfQ1JfQ1IxLCBIX0NSX0NSMiwgSF9DUl9DUjMKKyAsIEhfQ1JfQ1I0LCBIX0NSX0NSNSwgSF9DUl9DUjYsIEhfQ1JfQ1I3CisgLCBIX0NSX0NSOCwgSF9DUl9DUjksIEhfQ1JfQ1IxMCwgSF9DUl9DUjExCisgLCBIX0NSX0NSMTIsIEhfQ1JfQ1IxMywgSF9DUl9DUjE0LCBIX0NSX0NSMTUKK30gQ1JfTkFNRVM7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCit0eXBlZGVmIGVudW0gZHJfbmFtZXMgeworICBIX0RSX1RCUiwgSF9EUl9SUCwgSF9EUl9TU1AsIEhfRFJfVVNQCisgLCBIX0RSX01ESCwgSF9EUl9NREwKK30gRFJfTkFNRVM7CisKKy8qIEF0dHJpYnV0ZXMuICAqLworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtYWNoaW5lIHR5cGUgc2VsZWN0aW9uLiAgKi8KK3R5cGVkZWYgZW51bSBtYWNoX2F0dHIgeworICBNQUNIX0JBU0UsIE1BQ0hfRlIzMCwgTUFDSF9NQVgKK30gTUFDSF9BVFRSOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbiBzZXQgc2VsZWN0aW9uLiAgKi8KK3R5cGVkZWYgZW51bSBpc2FfYXR0ciB7CisgIElTQV9GUjMwLCBJU0FfTUFYCit9IElTQV9BVFRSOworCisvKiBOdW1iZXIgb2YgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzLiAgKi8KKyNkZWZpbmUgTUFYX0lTQVMgIDEKKyNkZWZpbmUgTUFYX01BQ0hTICgoaW50KSBNQUNIX01BWCkKKworLyogSWZpZWxkIHN1cHBvcnQuICAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IGNnZW5faWZsZCBmcjMwX2NnZW5faWZsZF90YWJsZVtdOworCisvKiBJZmllbGQgYXR0cmlidXRlIGluZGljZXMuICAqLworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2lmbGQgYXR0cnMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faWZsZF9hdHRyIHsKKyAgQ0dFTl9JRkxEX1ZJUlRVQUwsIENHRU5fSUZMRF9QQ1JFTF9BRERSLCBDR0VOX0lGTERfQUJTX0FERFIsIENHRU5fSUZMRF9SRVNFUlZFRAorICwgQ0dFTl9JRkxEX1NJR05fT1BULCBDR0VOX0lGTERfU0lHTkVELCBDR0VOX0lGTERfRU5EX0JPT0xTLCBDR0VOX0lGTERfU1RBUlRfTkJPT0xTID0gMzEKKyAsIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfRU5EX05CT09MUworfSBDR0VOX0lGTERfQVRUUjsKKworLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZF9hdHRyLiAgKi8KKyNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIChDR0VOX0lGTERfRU5EX05CT09MUyAtIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgLSAxKQorCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIGlmaWVsZCB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gaWZpZWxkX3R5cGUgeworICBGUjMwX0ZfTklMLCBGUjMwX0ZfT1AxLCBGUjMwX0ZfT1AyLCBGUjMwX0ZfT1AzCisgLCBGUjMwX0ZfT1A0LCBGUjMwX0ZfT1A1LCBGUjMwX0ZfQ0MsIEZSMzBfRl9DQ0MKKyAsIEZSMzBfRl9SSiwgRlIzMF9GX1JJLCBGUjMwX0ZfUlMxLCBGUjMwX0ZfUlMyCisgLCBGUjMwX0ZfUkpDLCBGUjMwX0ZfUklDLCBGUjMwX0ZfQ1JKLCBGUjMwX0ZfQ1JJCisgLCBGUjMwX0ZfVTQsIEZSMzBfRl9VNEMsIEZSMzBfRl9JNCwgRlIzMF9GX000CisgLCBGUjMwX0ZfVTgsIEZSMzBfRl9JOCwgRlIzMF9GX0kyMF80LCBGUjMwX0ZfSTIwXzE2CisgLCBGUjMwX0ZfSTIwLCBGUjMwX0ZfSTMyLCBGUjMwX0ZfVURJU1A2LCBGUjMwX0ZfRElTUDgKKyAsIEZSMzBfRl9ESVNQOSwgRlIzMF9GX0RJU1AxMCwgRlIzMF9GX1MxMCwgRlIzMF9GX1UxMAorICwgRlIzMF9GX1JFTDksIEZSMzBfRl9ESVI4LCBGUjMwX0ZfRElSOSwgRlIzMF9GX0RJUjEwCisgLCBGUjMwX0ZfUkVMMTIsIEZSMzBfRl9SRUdMSVNUX0hJX1NULCBGUjMwX0ZfUkVHTElTVF9MT1dfU1QsIEZSMzBfRl9SRUdMSVNUX0hJX0xECisgLCBGUjMwX0ZfUkVHTElTVF9MT1dfTEQsIEZSMzBfRl9NQVgKK30gSUZJRUxEX1RZUEU7CisKKyNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIEZSMzBfRl9NQVgpCisKKy8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKKyAgQ0dFTl9IV19WSVJUVUFMLCBDR0VOX0hXX0NBQ0hFX0FERFIsIENHRU5fSFdfUEMsIENHRU5fSFdfUFJPRklMRQorICwgQ0dFTl9IV19FTkRfQk9PTFMsIENHRU5fSFdfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSFdfTUFDSCwgQ0dFTl9IV19FTkRfTkJPT0xTCit9IENHRU5fSFdfQVRUUjsKKworLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faHdfYXR0ci4gICovCisjZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKENHRU5fSFdfRU5EX05CT09MUyAtIENHRU5fSFdfU1RBUlRfTkJPT0xTIC0gMSkKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBoYXJkd2FyZSB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9od190eXBlIHsKKyAgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5ULCBIV19IX0FERFIKKyAsIEhXX0hfSUFERFIsIEhXX0hfUEMsIEhXX0hfR1IsIEhXX0hfQ1IKKyAsIEhXX0hfRFIsIEhXX0hfUFMsIEhXX0hfUjEzLCBIV19IX1IxNAorICwgSFdfSF9SMTUsIEhXX0hfTkJJVCwgSFdfSF9aQklULCBIV19IX1ZCSVQKKyAsIEhXX0hfQ0JJVCwgSFdfSF9JQklULCBIV19IX1NCSVQsIEhXX0hfVEJJVAorICwgSFdfSF9EMEJJVCwgSFdfSF9EMUJJVCwgSFdfSF9DQ1IsIEhXX0hfU0NSCisgLCBIV19IX0lMTSwgSFdfTUFYCit9IENHRU5fSFdfVFlQRTsKKworI2RlZmluZSBNQVhfSFcgKChpbnQpIEhXX01BWCkKKworLyogT3BlcmFuZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5fb3BlcmFuZCBhdHRycy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX2F0dHIgeworICBDR0VOX09QRVJBTkRfVklSVFVBTCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIsIENHRU5fT1BFUkFORF9BQlNfQUREUiwgQ0dFTl9PUEVSQU5EX1NJR05fT1BUCisgLCBDR0VOX09QRVJBTkRfU0lHTkVELCBDR0VOX09QRVJBTkRfTkVHQVRJVkUsIENHRU5fT1BFUkFORF9SRUxBWCwgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZCisgLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgsIENHRU5fT1BFUkFORF9FTkRfQk9PTFMsIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9PUEVSQU5EX01BQ0gKKyAsIENHRU5fT1BFUkFORF9FTkRfTkJPT0xTCit9IENHRU5fT1BFUkFORF9BVFRSOworCisvKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9vcGVyYW5kX2F0dHIuICAqLworI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgKENHRU5fT1BFUkFORF9FTkRfTkJPT0xTIC0gQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyAtIDEpCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgb3BlcmFuZCB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgeworICBGUjMwX09QRVJBTkRfUEMsIEZSMzBfT1BFUkFORF9SSSwgRlIzMF9PUEVSQU5EX1JKLCBGUjMwX09QRVJBTkRfUklDCisgLCBGUjMwX09QRVJBTkRfUkpDLCBGUjMwX09QRVJBTkRfQ1JJLCBGUjMwX09QRVJBTkRfQ1JKLCBGUjMwX09QRVJBTkRfUlMxCisgLCBGUjMwX09QRVJBTkRfUlMyLCBGUjMwX09QRVJBTkRfUjEzLCBGUjMwX09QRVJBTkRfUjE0LCBGUjMwX09QRVJBTkRfUjE1CisgLCBGUjMwX09QRVJBTkRfUFMsIEZSMzBfT1BFUkFORF9VNCwgRlIzMF9PUEVSQU5EX1U0QywgRlIzMF9PUEVSQU5EX1U4CisgLCBGUjMwX09QRVJBTkRfSTgsIEZSMzBfT1BFUkFORF9VRElTUDYsIEZSMzBfT1BFUkFORF9ESVNQOCwgRlIzMF9PUEVSQU5EX0RJU1A5CisgLCBGUjMwX09QRVJBTkRfRElTUDEwLCBGUjMwX09QRVJBTkRfUzEwLCBGUjMwX09QRVJBTkRfVTEwLCBGUjMwX09QRVJBTkRfSTMyCisgLCBGUjMwX09QRVJBTkRfTTQsIEZSMzBfT1BFUkFORF9JMjAsIEZSMzBfT1BFUkFORF9ESVI4LCBGUjMwX09QRVJBTkRfRElSOQorICwgRlIzMF9PUEVSQU5EX0RJUjEwLCBGUjMwX09QRVJBTkRfTEFCRUw5LCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xECisgLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgRlIzMF9PUEVSQU5EX0NDCisgLCBGUjMwX09QRVJBTkRfQ0NDLCBGUjMwX09QRVJBTkRfTkJJVCwgRlIzMF9PUEVSQU5EX1ZCSVQsIEZSMzBfT1BFUkFORF9aQklUCisgLCBGUjMwX09QRVJBTkRfQ0JJVCwgRlIzMF9PUEVSQU5EX0lCSVQsIEZSMzBfT1BFUkFORF9TQklULCBGUjMwX09QRVJBTkRfVEJJVAorICwgRlIzMF9PUEVSQU5EX0QwQklULCBGUjMwX09QRVJBTkRfRDFCSVQsIEZSMzBfT1BFUkFORF9DQ1IsIEZSMzBfT1BFUkFORF9TQ1IKKyAsIEZSMzBfT1BFUkFORF9JTE0sIEZSMzBfT1BFUkFORF9NQVgKK30gQ0dFTl9PUEVSQU5EX1RZUEU7CisKKy8qIE51bWJlciBvZiBvcGVyYW5kcyB0eXBlcy4gICovCisjZGVmaW5lIE1BWF9PUEVSQU5EUyAoKGludCkgRlIzMF9PUEVSQU5EX01BWCkKKworLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVmZXJlbmNlZCBieSBhbnkgaW5zbi4gICovCisjZGVmaW5lIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyA4CisKKy8qIEluc24gYXR0cmlidXRlIGluZGljZXMuICAqLworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2luc24gYXR0cnMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKKyAgQ0dFTl9JTlNOX0FMSUFTLCBDR0VOX0lOU05fVklSVFVBTCwgQ0dFTl9JTlNOX1VOQ09ORF9DVEksIENHRU5fSU5TTl9DT05EX0NUSQorICwgQ0dFTl9JTlNOX1NLSVBfQ1RJLCBDR0VOX0lOU05fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX1JFTEFYQUJMRSwgQ0dFTl9JTlNOX1JFTEFYCisgLCBDR0VOX0lOU05fTk9fRElTLCBDR0VOX0lOU05fUEJCLCBDR0VOX0lOU05fTk9UX0lOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9FTkRfQk9PTFMKKyAsIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9JTlNOX01BQ0gsIENHRU5fSU5TTl9FTkRfTkJPT0xTCit9IENHRU5fSU5TTl9BVFRSOworCisvKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pbnNuX2F0dHIuICAqLworI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgKENHRU5fSU5TTl9FTkRfTkJPT0xTIC0gQ0dFTl9JTlNOX1NUQVJUX05CT09MUyAtIDEpCisKKy8qIGNnZW4uaCB1c2VzIHRoaW5ncyB3ZSBqdXN0IGRlZmluZWQuICAqLworI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCisKKy8qIEF0dHJpYnV0ZXMuICAqLworZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdOworZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXTsKK2V4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdOworZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faW5zbl9hdHRyX3RhYmxlW107CisKKy8qIEhhcmR3YXJlIGRlY2xzLiAgKi8KKworZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXM7CitleHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lczsKK2V4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzOworZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9wczsKK2V4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjEzOworZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTQ7CitleHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNTsKKworCisKKworI2VuZGlmIC8qIEZSMzBfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1kaXMuYyBiL29wY29kZXMvZnIzMC1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdjMThjCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9mcjMwLWRpcy5jCkBAIC0wLDAgKzEsNjMwIEBACisvKiBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQorICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tZGlzLmluIGlzbid0CisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KKyAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltY2F0LmgiCisjaW5jbHVkZSAiZnIzMC1kZXNjLmgiCisjaW5jbHVkZSAiZnIzMC1vcGMuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworLyogRGVmYXVsdCB0ZXh0IHRvIHByaW50IGlmIGFuIGluc3RydWN0aW9uIGlzbid0IHJlY29nbml6ZWQuICAqLworI2RlZmluZSBVTktOT1dOX0lOU05fTVNHIF8oIip1bmtub3duKiIpCisKK3N0YXRpYyB2b2lkIHByaW50X25vcm1hbAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7CitzdGF0aWMgdm9pZCBwcmludF9hZGRyZXNzCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHByaW50X2tleXdvcmQKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBDR0VOX0tFWVdPUkQgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7CitzdGF0aWMgdm9pZCBwcmludF9pbnNuX25vcm1hbAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGNvbnN0IENHRU5fSU5TTiAqLCBDR0VOX0ZJRUxEUyAqLAorCSAgICAgIGJmZF92bWEsIGludCkpOworc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsCisJCQkgICAgICAgZGlzYXNzZW1ibGVfaW5mbyAqLCBjaGFyICosIGludCkpOworc3RhdGljIGludCBkZWZhdWx0X3ByaW50X2luc24KKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisMCisvKiAtLSBkaXNhc3NlbWJsZXIgcm91dGluZXMgaW5zZXJ0ZWQgaGVyZSAqLworCisvKiAtLSBkaXMuYyAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCBvZmZzZXQsIGxvYWRfc3RvcmUpCisgICAgIFBUUiBkaXNfaW5mbzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgbG9uZyBvZmZzZXQ7CisgICAgIGludCBsb2FkX3N0b3JlOyAvKiAwID09IGxvYWQsIDEgPT0gc3RvcmUgKi8KK3sKKyAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IGRpc19pbmZvOworICBpbnQgbWFzazsKKyAgaW50IGluZGV4ID0gMDsKKyAgY2hhciogY29tbWEgPSAiIjsKKworICBpZiAobG9hZF9zdG9yZSkKKyAgICBtYXNrID0gMHg4MDsKKyAgZWxzZQorICAgIG1hc2sgPSAxOworCisgIGlmICh2YWx1ZSAmIG1hc2spCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWkiLCBpbmRleCArIG9mZnNldCk7CisgICAgICBjb21tYSA9ICIsIjsKKyAgICB9CisgICAgCisgIGZvciAoaW5kZXggPSAxOyBpbmRleCA8PSA3OyArK2luZGV4KQorICAgIHsKKyAgICAgIGlmIChsb2FkX3N0b3JlKQorCW1hc2sgPj49IDE7CisgICAgICBlbHNlCisJbWFzayA8PD0gMTsKKworICAgICAgaWYgKHZhbHVlICYgbWFzaykKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzciVpIiwgY29tbWEsIGluZGV4ICsgb2Zmc2V0KTsKKwkgIGNvbW1hID0gIiwiOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgOCwgMC8qbG9hZCovKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2xvd19yZWdpc3Rlcl9saXN0X2xkIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMC8qbG9hZCovKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBQVFIgZGlzX2luZm87CisgICAgIGxvbmcgdmFsdWU7CisgICAgIHVuc2lnbmVkIGludCBhdHRyczsKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgcHJpbnRfcmVnaXN0ZXJfbGlzdCAoZGlzX2luZm8sIHZhbHVlLCA4LCAxLypzdG9yZSovKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgMCwgMS8qc3RvcmUqLyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9tNCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIFBUUiBkaXNfaW5mbzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgdW5zaWduZWQgaW50IGF0dHJzOworICAgICBiZmRfdm1hIHBjOworICAgICBpbnQgbGVuZ3RoOworeworICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87CisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOworfQorLyogLS0gKi8KKworLyogTWFpbiBlbnRyeSBwb2ludCBmb3IgcHJpbnRpbmcgb3BlcmFuZHMuCisgICBYSU5GTyBpcyBhIGB2b2lkIConIGFuZCBub3QgYSBgZGlzYXNzZW1ibGVfaW5mbyAqJyB0byBub3QgcHV0IGEgcmVxdWlyZW1lbnQKKyAgIG9mIGRpcy1hc20uaCBvbiBjZ2VuLmguCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKKyAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0CisgICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCisgICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAorICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCisgICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAorICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKKyAgIHRoZSBoYW5kbGVycy4KKyovCisKK3ZvaWQKK2ZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgeGluZm8sIGZpZWxkcywgYXR0cnMsIHBjLCBsZW5ndGgpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGludCBvcGluZGV4OworICAgICBQVFIgeGluZm87CisgICAgIENHRU5fRklFTERTICpmaWVsZHM7CisgICAgIHZvaWQgY29uc3QgKmF0dHJzOworICAgICBiZmRfdm1hIHBjOworICAgICBpbnQgbGVuZ3RoOworeworIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSB4aW5mbzsKKworICBzd2l0Y2ggKG9waW5kZXgpCisgICAgeworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6CisgICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9DUmksIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX0NSaiwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgorICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCBmaWVsZHMtPmZfbmlsLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6CisgICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTQsIGZpZWxkcy0+Zl9uaWwsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSwgZmllbGRzLT5mX25pbCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6CisgICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgorICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmljLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JqLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6CisgICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SamMsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgZmllbGRzLT5mX1JzMSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgorICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCBmaWVsZHMtPmZfUnMyLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9jYywgMCwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2NjYywgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyMTAsIDAsIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyOCwgMCwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXI5LCAwLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDEwLCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pMjAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9WSVJUVUFMKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2kzMiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKXwoMTw8Q0dFTl9PUEVSQU5EX1NJR05fT1BUKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTgsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6CisgICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3JlbDEyLCAwfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKKyAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVsOSwgMHwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKKyAgICAgIHByaW50X200IChjZCwgaW5mbywgZmllbGRzLT5mX200LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6CisgICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgZmllbGRzLT5mX25pbCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKKyAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCwgMCwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKKyAgICAgIHByaW50X2hpX3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCwgMCwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6CisgICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCwgMCwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6CisgICAgICBwcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3MxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91MTAsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U0LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTRjLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91OCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VkaXNwNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iKSwKKwkgICAgICAgb3BpbmRleCk7CisgICAgYWJvcnQgKCk7CisgIH0KK30KKworY2dlbl9wcmludF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1tdID0gCit7CisgIHByaW50X2luc25fbm9ybWFsLAorfTsKKworCit2b2lkCitmcjMwX2NnZW5faW5pdF9kaXMgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKKyAgZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOworICBjZC0+cHJpbnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9wcmludF9oYW5kbGVyc1swXTsKKyAgY2QtPnByaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fcHJpbnRfb3BlcmFuZDsKK30KKworDAorLyogRGVmYXVsdCBwcmludCBoYW5kbGVyLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X25vcm1hbCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIFBUUiBkaXNfaW5mbzsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgdW5zaWduZWQgaW50IGF0dHJzOworICAgICBiZmRfdm1hIHBjOworICAgICBpbnQgbGVuZ3RoOworeworICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87CisKKyNpZmRlZiBDR0VOX1BSSU5UX05PUk1BTAorICBDR0VOX1BSSU5UX05PUk1BTCAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7CisjZW5kaWYKKworICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCisgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCisgICAgOyAvKiBub3RoaW5nIHRvIGRvICovCisgIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7CisgIGVsc2UKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOworfQorCisvKiBEZWZhdWx0IGFkZHJlc3MgaGFuZGxlci4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9hZGRyZXNzIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBiZmRfdm1hIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKKworI2lmZGVmIENHRU5fUFJJTlRfQUREUkVTUworICBDR0VOX1BSSU5UX0FERFJFU1MgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOworI2VuZGlmCisKKyAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLworICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQorICAgIDsgLyogbm90aGluZyB0byBkbyAqLworICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSkKKyAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKKyAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfQUJTX0FERFIpKQorICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOworICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQorICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgKGxvbmcpIHZhbHVlKTsKKyAgZWxzZQorICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCAobG9uZykgdmFsdWUpOworfQorCisvKiBLZXl3b3JkIHByaW50IGhhbmRsZXIuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfa2V5d29yZCAoY2QsIGRpc19pbmZvLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZSwgYXR0cnMpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIFBUUiBkaXNfaW5mbzsKKyAgICAgQ0dFTl9LRVlXT1JEICprZXl3b3JkX3RhYmxlOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Cit7CisgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKKyAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKKworICBrZSA9IGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGtleXdvcmRfdGFibGUsIHZhbHVlKTsKKyAgaWYgKGtlICE9IE5VTEwpCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGtlLT5uYW1lKTsKKyAgZWxzZQorICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPz8/Iik7Cit9CisMCisvKiBEZWZhdWx0IGluc24gcHJpbnRlci4KKworICAgRElTX0lORk8gaXMgZGVmaW5lZCBhcyBgUFRSJyBzbyB0aGUgZGlzYXNzZW1ibGVyIG5lZWRuJ3Qga25vdyBhbnl0aGluZworICAgYWJvdXQgZGlzYXNzZW1ibGVfaW5mby4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9pbnNuX25vcm1hbCAoY2QsIGRpc19pbmZvLCBpbnNuLCBmaWVsZHMsIHBjLCBsZW5ndGgpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIFBUUiBkaXNfaW5mbzsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICBiZmRfdm1hIHBjOworICAgICBpbnQgbGVuZ3RoOworeworICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7CisgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3luOworCisgIENHRU5fSU5JVF9QUklOVCAoY2QpOworCisgIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKKyAgICB7CisgICAgICBpZiAoQ0dFTl9TWU5UQVhfTU5FTU9OSUNfUCAoKnN5bikpCisJeworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOworCSAgY29udGludWU7CisJfQorICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKnN5bikpCisJeworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIENHRU5fU1lOVEFYX0NIQVIgKCpzeW4pKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgKi8KKyAgICAgIGZyMzBfY2dlbl9wcmludF9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLCBpbmZvLAorCQkJCSBmaWVsZHMsIENHRU5fSU5TTl9BVFRSUyAoaW5zbiksIHBjLCBsZW5ndGgpOworICAgIH0KK30KKwwKKy8qIFV0aWxpdHkgdG8gcHJpbnQgYW4gaW5zbi4KKyAgIEJVRiBpcyB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLCB0YXJnZXQgYnl0ZSBvcmRlciwgQlVGTEVOIGJ5dGVzIGxvbmcuCisgICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgorICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQorICAgYmVlbiBjYWxsZWQpLiAgKi8KKworc3RhdGljIGludAorcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGJ1ZmxlbikKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgYnVmbGVuOworeworICB1bnNpZ25lZCBsb25nIGluc25fdmFsdWU7CisgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7CisgIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87CisKKyAgZXhfaW5mby5kaXNfaW5mbyA9IGluZm87CisgIGV4X2luZm8udmFsaWQgPSAoMSA8PCAoY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCkpIC0gMTsKKyAgZXhfaW5mby5pbnNuX2J5dGVzID0gYnVmOworCisgIHN3aXRjaCAoYnVmbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBpbnNuX3ZhbHVlID0gYnVmWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMTYgKGJ1ZikgOiBiZmRfZ2V0bDE2IChidWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgaW5zbl92YWx1ZSA9IGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRyA/IGJmZF9nZXRiMzIgKGJ1ZikgOiBiZmRfZ2V0bDMyIChidWYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gaGFzaCBsaXN0cy4KKyAgICAgUGljayB0aGUgZmlyc3Qgb25lIGFuZCBrZWVwIHRyeWluZyB1bnRpbCB3ZSBmaW5kIHRoZSByaWdodCBvbmUuICAqLworCisgIGluc25fbGlzdCA9IENHRU5fRElTX0xPT0tVUF9JTlNOIChjZCwgYnVmLCBpbnNuX3ZhbHVlKTsKKyAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbiA9IGluc25fbGlzdC0+aW5zbjsKKyAgICAgIENHRU5fRklFTERTIGZpZWxkczsKKyAgICAgIGludCBsZW5ndGg7CisKKyNpZiAwIC8qIG5vdCBuZWVkZWQgYXMgaW5zbiBzaG91bGRuJ3QgYmUgaW4gaGFzaCBsaXN0cyBpZiBub3Qgc3VwcG9ydGVkICovCisgICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLworICAgICAgaWYgKCEgZnIzMF9jZ2VuX2luc25fc3VwcG9ydGVkIChjZCwgaW5zbikpCisJY29udGludWU7CisjZW5kaWYKKworICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KKyAgICAgIC8qID8/PyBNYXkgd2lzaCB0byBhbGxvdyB0YXJnZXQgdG8gZGVmZXIgdGhpcyBjaGVjayB1bnRpbCB0aGUgZXh0cmFjdAorCSBoYW5kbGVyLiAgKi8KKyAgICAgIGlmICgoaW5zbl92YWx1ZSAmIENHRU5fSU5TTl9CQVNFX01BU0sgKGluc24pKQorCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQorCXsKKwkgIC8qIFByaW50aW5nIGlzIGhhbmRsZWQgaW4gdHdvIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHBhcnNlcyB0aGUKKwkgICAgIG1hY2hpbmUgaW5zbiBhbmQgZXh0cmFjdHMgdGhlIGZpZWxkcy4gIFRoZSBzZWNvbmQgcGFzcyBwcmludHMKKwkgICAgIHRoZW0uICAqLworCisJICBsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQorCSAgICAoY2QsIGluc24sICZleF9pbmZvLCBpbnNuX3ZhbHVlLCAmZmllbGRzLCBwYyk7CisJICAvKiBsZW5ndGggPCAwIC0+IGVycm9yICovCisJICBpZiAobGVuZ3RoIDwgMCkKKwkgICAgcmV0dXJuIGxlbmd0aDsKKwkgIGlmIChsZW5ndGggPiAwKQorCSAgICB7CisJICAgICAgQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pIChjZCwgaW5mbywgaW5zbiwgJmZpZWxkcywgcGMsIGxlbmd0aCk7CisJICAgICAgLyogbGVuZ3RoIGlzIGluIGJpdHMsIHJlc3VsdCBpcyBpbiBieXRlcyAqLworCSAgICAgIHJldHVybiBsZW5ndGggLyA4OworCSAgICB9CisJfQorCisgICAgICBpbnNuX2xpc3QgPSBDR0VOX0RJU19ORVhUX0lOU04gKGluc25fbGlzdCk7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWZhdWx0IHZhbHVlIGZvciBDR0VOX1BSSU5UX0lOU04uCisgICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJ5dGVzIG9yIHplcm8gZm9yIGFuIHVua25vd24gaW5zbgorICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZCBmZXRjaGluZyBieXRlcy4gICovCisKKyNpZm5kZWYgQ0dFTl9QUklOVF9JTlNOCisjZGVmaW5lIENHRU5fUFJJTlRfSU5TTiBkZWZhdWx0X3ByaW50X2luc24KKyNlbmRpZgorCitzdGF0aWMgaW50CitkZWZhdWx0X3ByaW50X2luc24gKGNkLCBwYywgaW5mbykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgY2hhciBidWZbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKKyAgaW50IHN0YXR1czsKKworICAvKiBSZWFkIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24uICAqLworCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvLCBidWYsIGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpOworfQorCisvKiBNYWluIGVudHJ5IHBvaW50LgorICAgUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgorICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoaW4gYnl0ZXMpLiAgKi8KKworaW50CitwcmludF9pbnNuX2ZyMzAgKHBjLCBpbmZvKQorICAgICBiZmRfdm1hIHBjOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBzdGF0aWMgQ0dFTl9DUFVfREVTQyBjZCA9IDA7CisgIHN0YXRpYyBwcmV2X2lzYSxwcmV2X21hY2gscHJldl9lbmRpYW47CisgIGludCBsZW5ndGg7CisgIGludCBpc2EsbWFjaDsKKyAgaW50IGVuZGlhbiA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKKwkJPyBDR0VOX0VORElBTl9CSUcKKwkJOiBDR0VOX0VORElBTl9MSVRUTEUpOworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKworICAvKiA/Pz8gZ2RiIHdpbGwgc2V0IG1hY2ggYnV0IGxlYXZlIHRoZSBhcmNoaXRlY3R1cmUgYXMgInVua25vd24iICovCisjaWZuZGVmIENHRU5fQkZEX0FSQ0gKKyNkZWZpbmUgQ0dFTl9CRkRfQVJDSCBiZmRfYXJjaF9mcjMwCisjZW5kaWYKKyAgYXJjaCA9IGluZm8tPmFyY2g7CisgIGlmIChhcmNoID09IGJmZF9hcmNoX3Vua25vd24pCisgICAgYXJjaCA9IENHRU5fQkZEX0FSQ0g7CisgICAgICAKKyAgLyogVGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gY29tcHV0ZSB0aGUgaXNhIG51bWJlciAoZS5nLiBmb3IgYXJtIHRodW1iKQorICAgICBzbyB3ZSBsZWF2ZSBpdCB0byB0aGUgdGFyZ2V0LiAgKi8KKyNpZmRlZiBDR0VOX0NPTVBVVEVfSVNBCisgIGlzYSA9IENHRU5fQ09NUFVURV9JU0EgKGluZm8pOworI2Vsc2UKKyAgaXNhID0gMDsKKyNlbmRpZgorCisgIG1hY2ggPSBpbmZvLT5tYWNoOworCisgIC8qIElmIHdlJ3ZlIHN3aXRjaGVkIGNwdSdzLCBjbG9zZSB0aGUgY3VycmVudCB0YWJsZSBhbmQgb3BlbiBhIG5ldyBvbmUuICAqLworICBpZiAoY2QKKyAgICAgICYmIChpc2EgIT0gcHJldl9pc2EKKwkgIHx8IG1hY2ggIT0gcHJldl9tYWNoCisJICB8fCBlbmRpYW4gIT0gcHJldl9lbmRpYW4pKQorICAgIHsKKyAgICAgIGZyMzBfY2dlbl9jcHVfY2xvc2UgKGNkKTsKKyAgICAgIGNkID0gMDsKKyAgICB9CisKKyAgLyogSWYgd2UgaGF2ZW4ndCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlIG9wY29kZSB0YWJsZS4gICovCisgIGlmICghIGNkKQorICAgIHsKKyAgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaF90eXBlID0gYmZkX2xvb2t1cF9hcmNoIChhcmNoLCBtYWNoKTsKKyAgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKKworICAgICAgaWYgKCFhcmNoX3R5cGUpCisJYWJvcnQgKCk7CisgICAgICBtYWNoX25hbWUgPSBhcmNoX3R5cGUtPnByaW50YWJsZV9uYW1lOworCisgICAgICBwcmV2X2lzYSA9IGlzYTsKKyAgICAgIHByZXZfbWFjaCA9IG1hY2g7CisgICAgICBwcmV2X2VuZGlhbiA9IGVuZGlhbjsKKyAgICAgIGNkID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0lTQVMsIHByZXZfaXNhLAorCQkJCSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKKwkJCQkgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sIHByZXZfZW5kaWFuLAorCQkJCSBDR0VOX0NQVV9PUEVOX0VORCk7CisgICAgICBpZiAoIWNkKQorCWFib3J0ICgpOworICAgICAgZnIzMF9jZ2VuX2luaXRfZGlzIChjZCk7CisgICAgfQorCisgIC8qIFdlIHRyeSB0byBoYXZlIGFzIG11Y2ggY29tbW9uIGNvZGUgYXMgcG9zc2libGUuCisgICAgIEJ1dCBhdCB0aGlzIHBvaW50IHNvbWUgdGFyZ2V0cyBuZWVkIHRvIHRha2Ugb3Zlci4gICovCisgIC8qID8/PyBTb21lIHRhcmdldHMgbWF5IG5lZWQgYSBob29rIGVsc2V3aGVyZS4gIFRyeSB0byBhdm9pZCB0aGlzLAorICAgICBidXQgaWYgbm90IHBvc3NpYmxlIHRyeSB0byBtb3ZlIHRoaXMgaG9vayBlbHNld2hlcmUgcmF0aGVyIHRoYW4KKyAgICAgaGF2ZSB0d28gaG9va3MuICAqLworICBsZW5ndGggPSBDR0VOX1BSSU5UX0lOU04gKGNkLCBwYywgaW5mbyk7CisgIGlmIChsZW5ndGggPiAwKQorICAgIHJldHVybiBsZW5ndGg7CisgIGlmIChsZW5ndGggPCAwKQorICAgIHJldHVybiAtMTsKKworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7CisgIHJldHVybiBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgLyA4OworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWlibGQuYyBiL29wY29kZXMvZnIzMC1pYmxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2NjEzZAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvZnIzMC1pYmxkLmMKQEAgLTAsMCArMSwxNTA2IEBACisvKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIGZyMzAuIC0qLSBDIC0qLQorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgorLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCisgICBLZWVwIHRoYXQgaW4gbWluZC4gICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltY2F0LmgiCisjaW5jbHVkZSAiZnIzMC1kZXNjLmgiCisjaW5jbHVkZSAiZnIzMC1vcGMuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworI3VuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI3VuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisvKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCisKK3N0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKK3N0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAorCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKKworc3RhdGljIGludCBleHRyYWN0X25vcm1hbAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAorCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKKwkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7CitzdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCisJICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOworDAorLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLworCisjaWYgISBDR0VOX0lOVF9JTlNOX1AKKworLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KKworc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKK2luc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOworICAgICB1bnNpZ25lZCBjaGFyICpidWZwOworeworICB1bnNpZ25lZCBsb25nIHgsbWFzazsKKyAgaW50IHNoaWZ0OworICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKKworICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQorICAgIHsKKyAgICBjYXNlIDg6CisgICAgICB4ID0gKmJ1ZnA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgaWYgKGJpZ19wKQorCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKKyAgICAgIGVsc2UKKwl4ID0gYmZkX2dldGwxNiAoYnVmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5CisJIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCisgICAgICBpZiAoYmlnX3ApCisJeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKKyAgICAgIGVsc2UKKwl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgaWYgKGJpZ19wKQorCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKKyAgICAgIGVsc2UKKwl4ID0gYmZkX2dldGwzMiAoYnVmcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLworICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKKyAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCisgICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKKyAgZWxzZQorICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7CisgIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKKworICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQorICAgIHsKKyAgICBjYXNlIDg6CisgICAgICAqYnVmcCA9IHg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgaWYgKGJpZ19wKQorCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOworICAgICAgZWxzZQorCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQorCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLworICAgICAgaWYgKGJpZ19wKQorCXsKKwkgIGJ1ZnBbMF0gPSB4ID4+IDE2OworCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKKwkgIGJ1ZnBbMl0gPSB4ID4+IDE2OworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBpZiAoYmlnX3ApCisJYmZkX3B1dGIzMiAoeCwgYnVmcCk7CisgICAgICBlbHNlCisJYmZkX3B1dGwzMiAoeCwgYnVmcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCisKKy8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCisKKyAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgorICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KKyAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KKyAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgorICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KKyAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCisKKyAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLworCisvKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKKyAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLworLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgorICAgbmVjZXNzYXJ5LiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAorCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgdW5zaWduZWQgaW50IGF0dHJzOworICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7CisgICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOworeworICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKKyAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKKworICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLworICBpZiAobGVuZ3RoID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKENHRU5fSU5UX0lOU05fUAorICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAod29yZF9sZW5ndGggPiAzMikKKyAgICBhYm9ydCAoKTsKKworICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCisgICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KKyAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQorICAgIHsKKyAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCisJICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKKwl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKKyAgICB9CisKKyAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KKyAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7CisgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQorCXsKKwkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICBzcHJpbnRmIChlcnJidWYsCisJCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAorCQkgICB2YWx1ZSwgbWF4dmFsKTsKKwkgIHJldHVybiBlcnJidWY7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKKyAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOworICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQorCXsKKwkgIHNwcmludGYKKwkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKKwkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7CisJICByZXR1cm4gZXJyYnVmOworCX0KKyAgICB9CisKKyNpZiBDR0VOX0lOVF9JTlNOX1AKKworICB7CisgICAgaW50IHNoaWZ0OworCisgICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCisgICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOworICAgIGVsc2UKKyAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOworICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKKyAgfQorCisjZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLworCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OworCisgICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOworICB9CisKKyNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLworCisgIHJldHVybiBOVUxMOworfQorCisvKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgorICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCisgICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCisgICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQorICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgorICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2luc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKKyAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7CisgICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOworICAgICBiZmRfdm1hIHBjOworeworICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47CisKKyAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOworICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKKworICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAorICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCisKKyNpZiBDR0VOX0lOVF9JTlNOX1AKKworICAqYnVmZmVyID0gdmFsdWU7CisKKyNlbHNlCisKKyAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCisJCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAorCQkgICAgICAgdmFsdWUpOworCisjZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KKworICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KKyAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKKyAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KKyAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KKworICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKKworICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQorCWNvbnRpbnVlOworCisgICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAorCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOworICAgICAgaWYgKGVycm1zZykKKwlyZXR1cm4gZXJybXNnOworICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKwwKKy8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCisKKyNpZiAhIENHRU5fSU5UX0lOU05fUAorCisvKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgorICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgorICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgorICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgorICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KKworc3RhdGljIENHRU5fSU5MSU5FIGludAorZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKKyAgICAgaW50IG9mZnNldCwgYnl0ZXM7CisgICAgIGJmZF92bWEgcGM7Cit7CisgIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCisgICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLworICBpbnQgbWFzazsKKyAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOworCisgIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLworICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKKyAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCisgICAgcmV0dXJuIDE7CisKKyAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLworICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKKyAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKKyAgICAgIGJyZWFrOworCisgIGlmIChieXRlcykKKyAgICB7CisgICAgICBpbnQgc3RhdHVzOworCisgICAgICBwYyArPSBvZmZzZXQ7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCisJKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7CisKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwl7CisJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisvKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KKworc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKK2V4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87CisgICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7CisgICAgIGJmZF92bWEgcGM7Cit7CisgIHVuc2lnbmVkIGxvbmcgeCxtYXNrOworICBpbnQgc2hpZnQ7CisgIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOworCisgIHN3aXRjaCAod29yZF9sZW5ndGgpCisgICAgeworICAgIGNhc2UgODoKKyAgICAgIHggPSAqYnVmcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBpZiAoYmlnX3ApCisJeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOworICAgICAgZWxzZQorCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKKwkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KKyAgICAgIGlmIChiaWdfcCkKKwl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOworICAgICAgZWxzZQorCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBpZiAoYmlnX3ApCisJeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOworICAgICAgZWxzZQorCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCisgIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOworICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKKyAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOworICBlbHNlCisgICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKKyAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Cit9CisKKyNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLworCisvKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KKworICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAorICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCisgICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KKyAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAorICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgorICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KKyAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KKyAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgorICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KKyAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCisKKyAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCisKKy8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCisKKy8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KKyAgIG5lY2Vzc2FyeS4gICovCisKK3N0YXRpYyBpbnQKK2V4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAorCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKKyAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgbG9uZyAqdmFsdWVwOworeworICBDR0VOX0lOU05fSU5UIHZhbHVlOworCisgIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQorICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCisgIGlmIChsZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAqdmFsdWVwID0gMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoQ0dFTl9JTlRfSU5TTl9QCisgICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQorICAgIGFib3J0ICgpOworCisgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQorICAgIGFib3J0ICgpOworCisgIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKKyAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLworICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCisgICAgeworICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKKwkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQorCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOworICAgIH0KKworICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCisKKyAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCisgICAgeworICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KKyAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7CisKKyAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQorCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOworICAgICAgZWxzZQorCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKKyAgICAgIHZhbHVlICY9IG1hc2s7CisgICAgICAvKiBzaWduIGV4dGVuZD8gKi8KKyAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCisJICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCisJdmFsdWUgfD0gfm1hc2s7CisgICAgfQorCisjaWYgISBDR0VOX0lOVF9JTlNOX1AKKworICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7CisKKyAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQorCWFib3J0ICgpOworCisgICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOworICAgIH0KKworI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCisKKyAgKnZhbHVlcCA9IHZhbHVlOworCisgIHJldHVybiAxOworfQorCisvKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgorCisgICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCisgICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KKyAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCisgICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAorICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQorICAgYmVlbiBjYWxsZWQpLiAgKi8KKworc3RhdGljIGludAorZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKKyAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87CisgICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKKyAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKKyAgICAgYmZkX3ZtYSBwYzsKK3sKKyAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47CisKKyAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKKworICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOworCisgIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKKyAgICB7CisgICAgICBpbnQgbGVuZ3RoOworCisgICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKKwljb250aW51ZTsKKworICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCisJCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOworICAgICAgaWYgKGxlbmd0aCA8PSAwKQorCXJldHVybiBsZW5ndGg7CisgICAgfQorCisgIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KKyAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKK30KKwwKKy8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLworCisvKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucworICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKKyAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KKyAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCisgICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKKyAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0CisgICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgorICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKKyAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgorKi8KKworY29uc3QgY2hhciAqCitmcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGludCBvcGluZGV4OworICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKKyAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7CisgICAgIGJmZF92bWEgcGM7Cit7CisgIGNvbnN0IGNoYXIgKiBlcnJtc2c7CisgIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOworCisgIHN3aXRjaCAob3BpbmRleCkKKyAgICB7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfQ1JpLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9DUmosIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9uaWwsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaWMsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUmosIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SamMsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUnMxLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfUnMyLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfY2MsIDAsIDAsIDQsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9jY2MsIDAsIDE2LCAwLCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOworICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgyKSk7CisgICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9kaXI4LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlyOTsKKyAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMSkpOworICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKKyAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMikpOworICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7CisgICAgICAgIHZhbHVlID0gKChpbnQpICh2YWx1ZSkgPj4gKDEpKTsKKyAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6CisgICAgICB7Cit7CisgIEZMRCAoZl9pMjBfNCkgPSAoKHVuc2lnbmVkIGludCkgKEZMRCAoZl9pMjApKSA+PiAoMTYpKTsKKyAgRkxEIChmX2kyMF8xNikgPSAoKEZMRCAoZl9pMjApKSAmICg2NTUzNSkpOworfQorICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kyMF80LCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgICBpZiAoZXJybXNnKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2kyMF8xNiwgMCwgMTYsIDAsIDE2LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgICBpZiAoZXJybXNnKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTMyLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAxNiwgMCwgMzIsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2k4LCAwLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfcmVsMTI7CisgICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSArICgyKSkpKSkgPj4gKDEpKTsKKyAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA1LCAxMSwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfcmVsOTsKKyAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICsgKDIpKSkpKSA+PiAoMSkpOworICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7CisgICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgJiAoMTUpKTsKKyAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9uaWwsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfczEwOworICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7CisgICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKKyAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOworICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3U0LCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTRjLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKKyAgICAgICAgdmFsdWUgPSAoKHVuc2lnbmVkIGludCkgKHZhbHVlKSA+PiAoMikpOworICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGJ1aWxkaW5nIGluc24uXG4iKSwKKwkgICAgICAgb3BpbmRleCk7CisgICAgICBhYm9ydCAoKTsKKyAgfQorCisgIHJldHVybiBlcnJtc2c7Cit9CisKKy8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgZXh0cmFjdGlvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucworICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKKyAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KKyAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCisgICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKKyAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwcmludF9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0CisgICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHByaW50X2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgorICAgdGhlIGhhbmRsZXJzLgorKi8KKworaW50CitmcjMwX2NnZW5fZXh0cmFjdF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOworICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7CisgICAgIENHRU5fRklFTERTICogZmllbGRzOworICAgICBiZmRfdm1hIHBjOworeworICBpbnQgbGVuZ3RoOworICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoID0gQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKTsKKworICBzd2l0Y2ggKG9waW5kZXgpCisgICAgeworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX0NSaik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfbmlsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmljKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JqKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmpjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SczIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfY2MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9jY2MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlOworICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOworICAgICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlyOCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKKyAgICAgIHsKKyAgICAgICAgbG9uZyB2YWx1ZTsKKyAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKKyAgICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOworICAgICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfZGlzcDgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlOworICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgPDwgKDEpKTsKKyAgICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgorICAgICAgeworICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMjBfNCk7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDAsIDE2LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTIwXzE2KTsKK3sKKyAgRkxEIChmX2kyMCkgPSAoKCgoRkxEIChmX2kyMF80KSkgPDwgKDE2KSkpIHwgKEZMRCAoZl9pMjBfMTYpKSk7Cit9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTl9PUFQpLCAxNiwgMCwgMzIsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMzIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaTgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgNSwgMTEsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOworICAgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOworICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7CisgICAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOworICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIHwgKCgoLTEpIDw8ICg0KSkpKTsKKyAgICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOworICAgICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlOworICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOworICAgICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91NCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3U0Yyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91OCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlOworICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMikpOworICAgICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKKwkgICAgICAgb3BpbmRleCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBmcjMwX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKK3sKKyAgaW5zZXJ0X2luc25fbm9ybWFsLAorfTsKKworY2dlbl9leHRyYWN0X2ZuICogY29uc3QgZnIzMF9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAoreworICBleHRyYWN0X2luc25fbm9ybWFsLAorfTsKKworLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCisgICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KKyAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKKyAgIG5vdCBhcHByb3ByaWF0ZS4gICovCisKK2ludAorZnIzMF9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOworeworICBpbnQgdmFsdWU7CisKKyAgc3dpdGNoIChvcGluZGV4KQorICAgIHsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSajsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpYzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqYzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2M7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2NjOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfczEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0YzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAorCQkgICAgICAgb3BpbmRleCk7CisgICAgICBhYm9ydCAoKTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworYmZkX3ZtYQorZnIzMF9jZ2VuX2dldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOworeworICBiZmRfdm1hIHZhbHVlOworCisgIHN3aXRjaCAob3BpbmRleCkKKyAgICB7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSaTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmo7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SaWM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SajsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SamM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2NjYzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2RpcjEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTIwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2k4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbTQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3MxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91MTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91NGM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91ZGlzcDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKKwkJICAgICAgIG9waW5kZXgpOworICAgICAgYWJvcnQgKCk7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCisgICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KKyAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQorICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KKwordm9pZAorZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGludCBvcGluZGV4OworICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKKyAgICAgaW50IHZhbHVlOworeworICBzd2l0Y2ggKG9waW5kZXgpCisgICAgeworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6CisgICAgICBmaWVsZHMtPmZfQ1JpID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgorICAgICAgZmllbGRzLT5mX0NSaiA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKKyAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6CisgICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgorICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgorICAgICAgZmllbGRzLT5mX1JpID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgorICAgICAgZmllbGRzLT5mX1JpYyA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgorICAgICAgZmllbGRzLT5mX1JqID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgorICAgICAgZmllbGRzLT5mX1JqYyA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKKyAgICAgIGZpZWxkcy0+Zl9SczEgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6CisgICAgICBmaWVsZHMtPmZfUnMyID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6CisgICAgICBmaWVsZHMtPmZfY2MgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6CisgICAgICBmaWVsZHMtPmZfY2NjID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6CisgICAgICBmaWVsZHMtPmZfZGlyMTAgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgorICAgICAgZmllbGRzLT5mX2RpcjggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgorICAgICAgZmllbGRzLT5mX2RpcjkgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6CisgICAgICBmaWVsZHMtPmZfZGlzcDEwID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6CisgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKKyAgICAgIGZpZWxkcy0+Zl9kaXNwOSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKKyAgICAgIGZpZWxkcy0+Zl9pMjAgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6CisgICAgICBmaWVsZHMtPmZfaTMyID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6CisgICAgICBmaWVsZHMtPmZfaTggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgorICAgICAgZmllbGRzLT5mX3JlbDEyID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgorICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKKyAgICAgIGZpZWxkcy0+Zl9tNCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgorICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6CisgICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6CisgICAgICBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgorICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6CisgICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6CisgICAgICBmaWVsZHMtPmZfczEwID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgorICAgICAgZmllbGRzLT5mX3UxMCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgorICAgICAgZmllbGRzLT5mX3U0ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgorICAgICAgZmllbGRzLT5mX3U0YyA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgorICAgICAgZmllbGRzLT5mX3U4ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgorICAgICAgZmllbGRzLT5mX3VkaXNwNiA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCisJCSAgICAgICBvcGluZGV4KTsKKyAgICAgIGFib3J0ICgpOworICB9Cit9CisKK3ZvaWQKK2ZyMzBfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7CisgICAgIGJmZF92bWEgdmFsdWU7Cit7CisgIHN3aXRjaCAob3BpbmRleCkKKyAgICB7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKKyAgICAgIGZpZWxkcy0+Zl9DUmkgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6CisgICAgICBmaWVsZHMtPmZfQ1JqID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgorICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKKyAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6CisgICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6CisgICAgICBmaWVsZHMtPmZfUmkgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6CisgICAgICBmaWVsZHMtPmZfUmljID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6CisgICAgICBmaWVsZHMtPmZfUmogPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6CisgICAgICBmaWVsZHMtPmZfUmpjID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgorICAgICAgZmllbGRzLT5mX1JzMSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKKyAgICAgIGZpZWxkcy0+Zl9SczIgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKKyAgICAgIGZpZWxkcy0+Zl9jYyA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKKyAgICAgIGZpZWxkcy0+Zl9jY2MgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKKyAgICAgIGZpZWxkcy0+Zl9kaXIxMCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6CisgICAgICBmaWVsZHMtPmZfZGlyOCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6CisgICAgICBmaWVsZHMtPmZfZGlyOSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKKyAgICAgIGZpZWxkcy0+Zl9kaXNwMTAgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKKyAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgorICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgorICAgICAgZmllbGRzLT5mX2kyMCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKKyAgICAgIGZpZWxkcy0+Zl9pMzIgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKKyAgICAgIGZpZWxkcy0+Zl9pOCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6CisgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6CisgICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgorICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6CisgICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKKyAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKKyAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6CisgICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKKyAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKKyAgICAgIGZpZWxkcy0+Zl9zMTAgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6CisgICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6CisgICAgICBmaWVsZHMtPmZfdTQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6CisgICAgICBmaWVsZHMtPmZfdTRjID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6CisgICAgICBmaWVsZHMtPmZfdTggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6CisgICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKKwkJICAgICAgIG9waW5kZXgpOworICAgICAgYWJvcnQgKCk7CisgIH0KK30KKworLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIGluc3RydWN0aW9uIGJ1aWxkZXIgdGFibGVzLiAgKi8KKwordm9pZAorZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7Cit7CisgIGNkLT5pbnNlcnRfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9pbnNlcnRfaGFuZGxlcnNbMF07CisgIGNkLT5leHRyYWN0X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1swXTsKKworICBjZC0+aW5zZXJ0X29wZXJhbmQgPSBmcjMwX2NnZW5faW5zZXJ0X29wZXJhbmQ7CisgIGNkLT5leHRyYWN0X29wZXJhbmQgPSBmcjMwX2NnZW5fZXh0cmFjdF9vcGVyYW5kOworCisgIGNkLT5nZXRfaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fZ2V0X2ludF9vcGVyYW5kOworICBjZC0+c2V0X2ludF9vcGVyYW5kID0gZnIzMF9jZ2VuX3NldF9pbnRfb3BlcmFuZDsKKyAgY2QtPmdldF92bWFfb3BlcmFuZCA9IGZyMzBfY2dlbl9nZXRfdm1hX29wZXJhbmQ7CisgIGNkLT5zZXRfdm1hX29wZXJhbmQgPSBmcjMwX2NnZW5fc2V0X3ZtYV9vcGVyYW5kOworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLW9wYy5jIGIvb3Bjb2Rlcy9mcjMwLW9wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjEwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2ZyMzAtb3BjLmMKQEAgLTAsMCArMSwxMzY4IEBACisvKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUgZm9yIGZyMzAuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgImZyMzAtZGVzYy5oIgorI2luY2x1ZGUgImZyMzAtb3BjLmgiCisKKy8qIFRoZSBoYXNoIGZ1bmN0aW9ucyBhcmUgcmVjb3JkZWQgaGVyZSB0byBoZWxwIGtlZXAgYXNzZW1ibGVyIGNvZGUgb3V0IG9mCisgICB0aGUgZGlzYXNzZW1ibGVyIGFuZCB2aWNlIHZlcnNhLiAgKi8KKworc3RhdGljIGludCBhc21faGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgZGlzX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGRpc19oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7CisKKy8qIEluc3RydWN0aW9uIGZvcm1hdHMuICAqLworCisjZGVmaW5lIEYoZikgJiBmcjMwX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChGUjMwXyxmKV0KKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VtcHR5ID0geworICAwLCAwLCAweDAsIHsgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SSiksIEYgKEZfUkkpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRpID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VNCksIEYgKEZfUkkpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQyID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9NNCksIEYgKEZfUkkpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYwcyA9IHsKKyAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdjMgPSB7CisgIDE2LCAxNiwgMHhmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfT1A0KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOCA9IHsKKyAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0k4KSwgRiAoRl9SSSksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTIwID0geworICAxNiwgMzIsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfSTIwKSwgRiAoRl9PUDIpLCBGIChGX1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMzIgPSB7CisgIDE2LCA0OCwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMzIpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0ID0geworICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDEwKSwgRiAoRl9SSSksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0dWggPSB7CisgIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQOSksIEYgKEZfUkkpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNHViID0geworICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDgpLCBGIChGX1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTUgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1VESVNQNiksIEYgKEZfUkkpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNWRyID0geworICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JTMiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X21vdmRyID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SUzEpLCBGIChGX1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY2FsbCA9IHsKKyAgMTYsIDE2LCAweGY4MDAsIHsgRiAoRl9PUDEpLCBGIChGX09QNSksIEYgKEZfUkVMMTIpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9pbnQgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1U4KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhZCA9IHsKKyAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX0NDKSwgRiAoRl9SRUw5KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxMyA9IHsKKyAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSMTApLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzaCA9IHsKKyAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSOSksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTNiID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVI4KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY29wb3AgPSB7CisgIDE2LCAzMiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQ0MpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9DUkopLCBGIChGX1U0QyksIEYgKEZfQ1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY29wbGQgPSB7CisgIDE2LCAzMiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQ0MpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSkMpLCBGIChGX1U0QyksIEYgKEZfQ1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY29wc3QgPSB7CisgIDE2LCAzMiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQ0MpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9DUkopLCBGIChGX1U0QyksIEYgKEZfUklDKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkc3AgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1MxMCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkbTAgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfTE9XX0xEKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRtMSA9IHsKKyAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9ISV9MRCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0bTAgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfTE9XX1NUKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RtMSA9IHsKKyAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9ISV9TVCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VudGVyID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VMTApLCAwIH0KK307CisKKyN1bmRlZiBGCisKKyNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQorI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KKyNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoRlIzMF9PUEVSQU5EXyxvcCkKKyNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKKworLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KKworc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIGZyMzBfY2dlbl9pbnNuX29wY29kZV90YWJsZVtNQVhfSU5TTlNdID0KK3sKKyAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgorICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgorICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLworICB7IHsgMCB9IH0sCisvKiBhZGQgJFJqLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4YTYwMCB9CisgIH0sCisvKiBhZGQgJHU0LCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweGE0MDAgfQorICB9LAorLyogYWRkMiAkbTQsJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQyLCB7IDB4YTUwMCB9CisgIH0sCisvKiBhZGRjICRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweGE3MDAgfQorICB9LAorLyogYWRkbiAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhhMjAwIH0KKyAgfSwKKy8qIGFkZG4gJHU0LCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweGEwMDAgfQorICB9LAorLyogYWRkbjIgJG00LCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkMiwgeyAweGExMDAgfQorICB9LAorLyogc3ViICRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweGFjMDAgfQorICB9LAorLyogc3ViYyAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhhZDAwIH0KKyAgfSwKKy8qIHN1Ym4gJFJqLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4YWUwMCB9CisgIH0sCisvKiBjbXAgJFJqLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4YWEwMCB9CisgIH0sCisvKiBjbXAgJHU0LCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweGE4MDAgfQorICB9LAorLyogY21wMiAkbTQsJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQyLCB7IDB4YTkwMCB9CisgIH0sCisvKiBhbmQgJFJqLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4ODIwMCB9CisgIH0sCisvKiBvciAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg5MjAwIH0KKyAgfSwKKy8qIGVvciAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg5YTAwIH0KKyAgfSwKKy8qIGFuZCAkUmosQCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg4NDAwIH0KKyAgfSwKKy8qIGFuZGggJFJqLEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4ODUwMCB9CisgIH0sCisvKiBhbmRiICRSaixAJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDg2MDAgfQorICB9LAorLyogb3IgJFJqLEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4OTQwMCB9CisgIH0sCisvKiBvcmggJFJqLEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4OTUwMCB9CisgIH0sCisvKiBvcmIgJFJqLEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4OTYwMCB9CisgIH0sCisvKiBlb3IgJFJqLEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4OWMwMCB9CisgIH0sCisvKiBlb3JoICRSaixAJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDlkMDAgfQorICB9LAorLyogZW9yYiAkUmosQCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg5ZTAwIH0KKyAgfSwKKy8qIGJhbmRsICR1NCxAJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZGksIHsgMHg4MDAwIH0KKyAgfSwKKy8qIGJvcmwgJHU0LEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweDkwMDAgfQorICB9LAorLyogYmVvcmwgJHU0LEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweDk4MDAgfQorICB9LAorLyogYmFuZGggJHU0LEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweDgxMDAgfQorICB9LAorLyogYm9yaCAkdTQsQCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4OTEwMCB9CisgIH0sCisvKiBiZW9yaCAkdTQsQCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4OTkwMCB9CisgIH0sCisvKiBidHN0bCAkdTQsQCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4ODgwMCB9CisgIH0sCisvKiBidHN0aCAkdTQsQCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4ODkwMCB9CisgIH0sCisvKiBtdWwgJFJqLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4YWYwMCB9CisgIH0sCisvKiBtdWx1ICRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweGFiMDAgfQorICB9LAorLyogbXVsaCAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhiZjAwIH0KKyAgfSwKKy8qIG11bHVoICRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweGJiMDAgfQorICB9LAorLyogZGl2MHMgJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzQwIH0KKyAgfSwKKy8qIGRpdjB1ICRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4OTc1MCB9CisgIH0sCisvKiBkaXYxICRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4OTc2MCB9CisgIH0sCisvKiBkaXYyICRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4OTc3MCB9CisgIH0sCisvKiBkaXYzICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjMsIHsgMHg5ZjYwIH0KKyAgfSwKKy8qIGRpdjRzICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjMsIHsgMHg5ZjcwIH0KKyAgfSwKKy8qIGxzbCAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhiNjAwIH0KKyAgfSwKKy8qIGxzbCAkdTQsJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4YjQwMCB9CisgIH0sCisvKiBsc2wyICR1NCwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZGksIHsgMHhiNTAwIH0KKyAgfSwKKy8qIGxzciAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhiMjAwIH0KKyAgfSwKKy8qIGxzciAkdTQsJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4YjAwMCB9CisgIH0sCisvKiBsc3IyICR1NCwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZGksIHsgMHhiMTAwIH0KKyAgfSwKKy8qIGFzciAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhiYTAwIH0KKyAgfSwKKy8qIGFzciAkdTQsJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGRpLCB7IDB4YjgwMCB9CisgIH0sCisvKiBhc3IyICR1NCwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZGksIHsgMHhiOTAwIH0KKyAgfSwKKy8qIGxkaTo4ICRpOCwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChJOCksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2xkaTgsIHsgMHhjMDAwIH0KKyAgfSwKKy8qIGxkaToyMCAkaTIwLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKEkyMCksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2xkaTIwLCB7IDB4OWIwMCB9CisgIH0sCisvKiBsZGk6MzIgJGkzMiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMzIpLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9sZGkzMiwgeyAweDlmODAgfQorICB9LAorLyogbGQgQCRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4NDAwIH0KKyAgfSwKKy8qIGxkdWggQCRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4NTAwIH0KKyAgfSwKKy8qIGxkdWIgQCRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4NjAwIH0KKyAgfSwKKy8qIGxkIEAoJFIxMywkUmopLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MCB9CisgIH0sCisvKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MTAwIH0KKyAgfSwKKy8qIGxkdWIgQCgkUjEzLCRSaiksJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgyMDAgfQorICB9LAorLyogbGQgQCgkUjE0LCRkaXNwMTApLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQMTApLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2xkcjE0LCB7IDB4MjAwMCB9CisgIH0sCisvKiBsZHVoIEAoJFIxNCwkZGlzcDkpLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOSksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfbGRyMTR1aCwgeyAweDQwMDAgfQorICB9LAorLyogbGR1YiBAKCRSMTQsJGRpc3A4KSwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDgpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2xkcjE0dWIsIHsgMHg2MDAwIH0KKyAgfSwKKy8qIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE1KSwgJywnLCBPUCAoVURJU1A2KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9sZHIxNSwgeyAweDMwMCB9CisgIH0sCisvKiBsZCBAJFIxNSssJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4NzAwIH0KKyAgfSwKKy8qIGxkIEAkUjE1KywkUnMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFJTMiksIDAgfSB9LAorICAgICYgaWZtdF9sZHIxNWRyLCB7IDB4NzgwIH0KKyAgfSwKKy8qIGxkIEAkUjE1KywkcHMgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUFMpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MywgeyAweDc5MCB9CisgIH0sCisvKiBzdCAkUmksQCRSaiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsIE9QIChSSiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxNDAwIH0KKyAgfSwKKy8qIHN0aCAkUmksQCRSaiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsIE9QIChSSiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxNTAwIH0KKyAgfSwKKy8qIHN0YiAkUmksQCRSaiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsIE9QIChSSiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxNjAwIH0KKyAgfSwKKy8qIHN0ICRSaSxAKCRSMTMsJFJqKSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MTAwMCB9CisgIH0sCisvKiBzdGggJFJpLEAoJFIxMywkUmopICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxMTAwIH0KKyAgfSwKKy8qIHN0YiAkUmksQCgkUjEzLCRSaikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDEyMDAgfQorICB9LAorLyogc3QgJFJpLEAoJFIxNCwkZGlzcDEwKSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1AxMCksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2xkcjE0LCB7IDB4MzAwMCB9CisgIH0sCisvKiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDkpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZHIxNHVoLCB7IDB4NTAwMCB9CisgIH0sCisvKiBzdGIgJFJpLEAoJFIxNCwkZGlzcDgpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDgpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZHIxNHViLCB7IDB4NzAwMCB9CisgIH0sCisvKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE1KSwgJywnLCBPUCAoVURJU1A2KSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfbGRyMTUsIHsgMHgxMzAwIH0KKyAgfSwKKy8qIHN0ICRSaSxALSRSMTUgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MHMsIHsgMHgxNzAwIH0KKyAgfSwKKy8qIHN0ICRSczIsQC0kUjE1ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUlMyKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAorICAgICYgaWZtdF9sZHIxNWRyLCB7IDB4MTc4MCB9CisgIH0sCisvKiBzdCAkcHMsQC0kUjE1ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUFMpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjMsIHsgMHgxNzkwIH0KKyAgfSwKKy8qIG1vdiAkUmosJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg4YjAwIH0KKyAgfSwKKy8qIG1vdiAkUnMxLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJTMSksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X21vdmRyLCB7IDB4YjcwMCB9CisgIH0sCisvKiBtb3YgJHBzLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFBTKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MHMsIHsgMHgxNzEwIH0KKyAgfSwKKy8qIG1vdiAkUmksJFJzMSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCBPUCAoUlMxKSwgMCB9IH0sCisgICAgJiBpZm10X21vdmRyLCB7IDB4YjMwMCB9CisgIH0sCisvKiBtb3YgJFJpLCRwcyAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCBPUCAoUFMpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MHMsIHsgMHg3MTAgfQorICB9LAorLyogam1wIEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4OTcwMCB9CisgIH0sCisvKiBqbXA6ZCBAJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9kaXYwcywgeyAweDlmMDAgfQorICB9LAorLyogY2FsbCBAJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9kaXYwcywgeyAweDk3MTAgfQorICB9LAorLyogY2FsbDpkIEAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4OWYxMCB9CisgIH0sCisvKiBjYWxsICRsYWJlbDEyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUwxMiksIDAgfSB9LAorICAgICYgaWZtdF9jYWxsLCB7IDB4ZDAwMCB9CisgIH0sCisvKiBjYWxsOmQgJGxhYmVsMTIgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDEyKSwgMCB9IH0sCisgICAgJiBpZm10X2NhbGwsIHsgMHhkODAwIH0KKyAgfSwKKy8qIHJldCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sIDAgfSB9LAorICAgICYgaWZtdF9kaXYzLCB7IDB4OTcyMCB9CisgIH0sCisvKiByZXQ6ZCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sIDAgfSB9LAorICAgICYgaWZtdF9kaXYzLCB7IDB4OWYyMCB9CisgIH0sCisvKiBpbnQgJHU4ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKKyAgICAmIGlmbXRfaW50LCB7IDB4MWYwMCB9CisgIH0sCisvKiBpbnRlICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjMsIHsgMHg5ZjMwIH0KKyAgfSwKKy8qIHJldGkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MywgeyAweDk3MzAgfQorICB9LAorLyogYnJhOmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZjAwMCB9CisgIH0sCisvKiBicmEgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZTAwMCB9CisgIH0sCisvKiBibm86ZCAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhmMTAwIH0KKyAgfSwKKy8qIGJubyAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlMTAwIH0KKyAgfSwKKy8qIGJlcTpkICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGYyMDAgfQorICB9LAorLyogYmVxICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGUyMDAgfQorICB9LAorLyogYm5lOmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZjMwMCB9CisgIH0sCisvKiBibmUgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZTMwMCB9CisgIH0sCisvKiBiYzpkICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGY0MDAgfQorICB9LAorLyogYmMgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZTQwMCB9CisgIH0sCisvKiBibmM6ZCAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhmNTAwIH0KKyAgfSwKKy8qIGJuYyAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlNTAwIH0KKyAgfSwKKy8qIGJuOmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZjYwMCB9CisgIH0sCisvKiBibiAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlNjAwIH0KKyAgfSwKKy8qIGJwOmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZjcwMCB9CisgIH0sCisvKiBicCAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlNzAwIH0KKyAgfSwKKy8qIGJ2OmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZjgwMCB9CisgIH0sCisvKiBidiAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlODAwIH0KKyAgfSwKKy8qIGJudjpkICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGY5MDAgfQorICB9LAorLyogYm52ICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGU5MDAgfQorICB9LAorLyogYmx0OmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZmEwMCB9CisgIH0sCisvKiBibHQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZWEwMCB9CisgIH0sCisvKiBiZ2U6ZCAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhmYjAwIH0KKyAgfSwKKy8qIGJnZSAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlYjAwIH0KKyAgfSwKKy8qIGJsZTpkICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGZjMDAgfQorICB9LAorLyogYmxlICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGVjMDAgfQorICB9LAorLyogYmd0OmQgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZmQwMCB9CisgIH0sCisvKiBiZ3QgJGxhYmVsOSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAorICAgICYgaWZtdF9icmFkLCB7IDB4ZWQwMCB9CisgIH0sCisvKiBibHM6ZCAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhmZTAwIH0KKyAgfSwKKy8qIGJscyAkbGFiZWw5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYWQsIHsgMHhlZTAwIH0KKyAgfSwKKy8qIGJoaTpkICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGZmMDAgfQorICB9LAorLyogYmhpICRsYWJlbDkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYnJhZCwgeyAweGVmMDAgfQorICB9LAorLyogZG1vdiAkUjEzLEAkZGlyMTAgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjEwKSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHgxODAwIH0KKyAgfSwKKy8qIGRtb3ZoICRSMTMsQCRkaXI5ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVI5KSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4MTkwMCB9CisgIH0sCisvKiBkbW92YiAkUjEzLEAkZGlyOCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSOCksIDAgfSB9LAorICAgICYgaWZtdF9kbW92cjEzYiwgeyAweDFhMDAgfQorICB9LAorLyogZG1vdiBAJFIxMyssQCRkaXIxMCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjEwKSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHgxYzAwIH0KKyAgfSwKKy8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVI5KSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4MWQwMCB9CisgIH0sCisvKiBkbW92YiBAJFIxMyssQCRkaXI4ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSOCksIDAgfSB9LAorICAgICYgaWZtdF9kbW92cjEzYiwgeyAweDFlMDAgfQorICB9LAorLyogZG1vdiBAJFIxNSssQCRkaXIxMCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsICdAJywgT1AgKERJUjEwKSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHgxYjAwIH0KKyAgfSwKKy8qIGRtb3YgQCRkaXIxMCwkUjEzICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgT1AgKFIxMyksIDAgfSB9LAorICAgICYgaWZtdF9kbW92cjEzLCB7IDB4ODAwIH0KKyAgfSwKKy8qIGRtb3ZoIEAkZGlyOSwkUjEzICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI5KSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4OTAwIH0KKyAgfSwKKy8qIGRtb3ZiIEAkZGlyOCwkUjEzICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI4KSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4YTAwIH0KKyAgfSwKKy8qIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAorICAgICYgaWZtdF9kbW92cjEzLCB7IDB4YzAwIH0KKyAgfSwKKy8qIGRtb3ZoIEAkZGlyOSxAJFIxMysgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjkpLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4ZDAwIH0KKyAgfSwKKy8qIGRtb3ZiIEAkZGlyOCxAJFIxMysgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjgpLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCisgICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4ZTAwIH0KKyAgfSwKKy8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAorICAgICYgaWZtdF9kbW92cjEzLCB7IDB4YjAwIH0KKyAgfSwKKy8qIGxkcmVzIEAkUmkrLCR1NCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAnKycsICcsJywgT1AgKFU0KSwgMCB9IH0sCisgICAgJiBpZm10X2FkZGksIHsgMHhiYzAwIH0KKyAgfSwKKy8qIHN0cmVzICR1NCxAJFJpKyAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksICcrJywgMCB9IH0sCisgICAgJiBpZm10X2FkZGksIHsgMHhiZDAwIH0KKyAgfSwKKy8qIGNvcG9wICR1NGMsJGNjYywkQ1JqLCRDUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChDUkopLCAnLCcsIE9QIChDUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfY29wb3AsIHsgMHg5ZmMwIH0KKyAgfSwKKy8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChSSkMpLCAnLCcsIE9QIChDUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfY29wbGQsIHsgMHg5ZmQwIH0KKyAgfSwKKy8qIGNvcHN0ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChDUkopLCAnLCcsIE9QIChSSUMpLCAwIH0gfSwKKyAgICAmIGlmbXRfY29wc3QsIHsgMHg5ZmUwIH0KKyAgfSwKKy8qIGNvcHN2ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChDUkopLCAnLCcsIE9QIChSSUMpLCAwIH0gfSwKKyAgICAmIGlmbXRfY29wc3QsIHsgMHg5ZmYwIH0KKyAgfSwKKy8qIG5vcCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sIDAgfSB9LAorICAgICYgaWZtdF9kaXYzLCB7IDB4OWZhMCB9CisgIH0sCisvKiBhbmRjY3IgJHU4ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKKyAgICAmIGlmbXRfaW50LCB7IDB4ODMwMCB9CisgIH0sCisvKiBvcmNjciAkdTggKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAorICAgICYgaWZtdF9pbnQsIHsgMHg5MzAwIH0KKyAgfSwKKy8qIHN0aWxtICR1OCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCisgICAgJiBpZm10X2ludCwgeyAweDg3MDAgfQorICB9LAorLyogYWRkc3AgJHMxMCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFMxMCksIDAgfSB9LAorICAgICYgaWZtdF9hZGRzcCwgeyAweGEzMDAgfQorICB9LAorLyogZXh0c2IgJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzgwIH0KKyAgfSwKKy8qIGV4dHViICRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjBzLCB7IDB4OTc5MCB9CisgIH0sCisvKiBleHRzaCAkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAorICAgICYgaWZtdF9kaXYwcywgeyAweDk3YTAgfQorICB9LAorLyogZXh0dWggJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2MHMsIHsgMHg5N2IwIH0KKyAgfSwKKy8qIGxkbTAgKCRyZWdsaXN0X2xvd19sZCkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfTE9XX0xEKSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfbGRtMCwgeyAweDhjMDAgfQorICB9LAorLyogbGRtMSAoJHJlZ2xpc3RfaGlfbGQpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0hJX0xEKSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfbGRtMSwgeyAweDhkMDAgfQorICB9LAorLyogc3RtMCAoJHJlZ2xpc3RfbG93X3N0KSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9MT1dfU1QpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9zdG0wLCB7IDB4OGUwMCB9CisgIH0sCisvKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfSElfU1QpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9zdG0xLCB7IDB4OGYwMCB9CisgIH0sCisvKiBlbnRlciAkdTEwICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTEwKSwgMCB9IH0sCisgICAgJiBpZm10X2VudGVyLCB7IDB4ZjAwIH0KKyAgfSwKKy8qIGxlYXZlICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgMCB9IH0sCisgICAgJiBpZm10X2RpdjMsIHsgMHg5ZjkwIH0KKyAgfSwKKy8qIHhjaGIgQCRSaiwkUmkgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4OGEwMCB9CisgIH0sCit9OworCisjdW5kZWYgQQorI3VuZGVmIE1ORU0KKyN1bmRlZiBPUEVSQU5ECisjdW5kZWYgT1AKKworLyogRm9ybWF0cyBmb3IgQUxJQVMgbWFjcm8taW5zbnMuICAqLworCisjZGVmaW5lIEYoZikgJiBmcjMwX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChGUjMwXyxmKV0KKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaThtID0geworICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfSTgpLCBGIChGX1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMjBtID0geworICAxNiwgMzIsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfSTIwKSwgRiAoRl9PUDIpLCBGIChGX1JJKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMzJtID0geworICAxNiwgNDgsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfSTMyKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KK307CisKKyN1bmRlZiBGCisKKy8qIEVhY2ggbm9uLXNpbXBsZSBtYWNybyBlbnRyeSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMuICAqLworCisjZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKKyNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCisjZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCisjZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCisKKy8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiB0YWJsZS4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX0lCQVNFIGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlW10gPQoreworLyogbGRpOCAkaTgsJFJpICovCisgIHsKKyAgICAtMSwgImxkaThtIiwgImxkaTgiLCAxNiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRpMjAgJGkyMCwkUmkgKi8KKyAgeworICAgIC0xLCAibGRpMjBtIiwgImxkaTIwIiwgMzIsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaTMyICRpMzIsJFJpICovCisgIHsKKyAgICAtMSwgImxkaTMybSIsICJsZGkzMiIsIDQ4LAorICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCit9OworCisvKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLiAgKi8KKworc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIGZyMzBfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVtdID0KK3sKKy8qIGxkaTggJGk4LCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKEk4KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfbGRpOG0sIHsgMHhjMDAwIH0KKyAgfSwKKy8qIGxkaTIwICRpMjAsJFJpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTIwKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKKyAgICAmIGlmbXRfbGRpMjBtLCB7IDB4OWIwMCB9CisgIH0sCisvKiBsZGkzMiAkaTMyLCRSaSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKEkzMiksICcsJywgT1AgKFJJKSwgMCB9IH0sCisgICAgJiBpZm10X2xkaTMybSwgeyAweDlmODAgfQorICB9LAorfTsKKworI3VuZGVmIEEKKyN1bmRlZiBNTkVNCisjdW5kZWYgT1BFUkFORAorI3VuZGVmIE9QCisKKyNpZm5kZWYgQ0dFTl9BU01fSEFTSF9QCisjZGVmaW5lIENHRU5fQVNNX0hBU0hfUChpbnNuKSAxCisjZW5kaWYKKworI2lmbmRlZiBDR0VOX0RJU19IQVNIX1AKKyNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9QKGluc24pIDEKKyNlbmRpZgorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyB0byBiZSBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4KKyAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSF9QIGluIHRoZSAub3BjIGZpbGUuICAqLworCitzdGF0aWMgaW50Cithc21faGFzaF9pbnNuX3AgKGluc24pCisgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKK3sKKyAgcmV0dXJuIENHRU5fQVNNX0hBU0hfUCAoaW5zbik7Cit9CisKK3N0YXRpYyBpbnQKK2Rpc19oYXNoX2luc25fcCAoaW5zbikKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworeworICAvKiBJZiBidWlsZGluZyB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIE5PLURJUyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwKKyAgICAgaWdub3JlLiAgKi8KKyAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fTk9fRElTKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIENHRU5fRElTX0hBU0hfUCAoaW5zbik7Cit9CisKKyNpZm5kZWYgQ0dFTl9BU01fSEFTSAorI2RlZmluZSBDR0VOX0FTTV9IQVNIX1NJWkUgMTI3CisjaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUworI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKQorI2Vsc2UKKyNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkgLypGSVhNRSovCisjZW5kaWYKKyNlbmRpZgorCisvKiBJdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byBwcm92aWRlIGEgZGVmYXVsdCBoZXJlLAorICAgYnV0IHdoaWxlIHRoaXMgaXMgdW5kZXIgZGV2ZWxvcG1lbnQgd2UgZG8uCisgICBCVUZGRVIgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgorICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLworCisjaWZuZGVmIENHRU5fRElTX0hBU0gKKyNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDI1NgorI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZiwgdmFsdWUpICgqKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZikpCisjZW5kaWYKKworLyogVGhlIHJlc3VsdCBpcyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgaW5zbi4KKyAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorYXNtX2hhc2hfaW5zbiAobW5lbSkKKyAgICAgY29uc3QgY2hhciAqIG1uZW07Cit7CisgIHJldHVybiBDR0VOX0FTTV9IQVNIIChtbmVtKTsKK30KKworLyogQlVGIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KKyAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorZGlzX2hhc2hfaW5zbiAoYnVmLCB2YWx1ZSkKKyAgICAgY29uc3QgY2hhciAqIGJ1ZjsKKyAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKK3sKKyAgcmV0dXJuIENHRU5fRElTX0hBU0ggKGJ1ZiwgdmFsdWUpOworfQorCisvKiBTZXQgdGhlIHJlY29yZGVkIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiB0aGUgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KKworc3RhdGljIHZvaWQKK3NldF9maWVsZHNfYml0c2l6ZSAoZmllbGRzLCBzaXplKQorICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICBpbnQgc2l6ZTsKK3sKKyAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IHNpemU7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLgorICAgVGhpcyBwbHVncyB0aGUgb3Bjb2RlIGVudHJpZXMgYW5kIG1hY3JvIGluc3RydWN0aW9ucyBpbnRvIHRoZSBjcHUgdGFibGUuICAqLworCit2b2lkCitmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBpbnQgaTsKKyAgaW50IG51bV9tYWNyb3MgPSAoc2l6ZW9mIChmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZSkgLworCQkgICAgc2l6ZW9mIChmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXSkpOworICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbMF07CisgIGNvbnN0IENHRU5fT1BDT0RFICpvYyA9ICYgZnIzMF9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlWzBdOworICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKKyAgbWVtc2V0IChpbnNucywgMCwgbnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fbWFjcm9zOyArK2kpCisgICAgeworICAgICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKKyAgICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKKyAgICB9CisgIGNkLT5tYWNyb19pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOworICBjZC0+bWFjcm9faW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKKyAgY2QtPm1hY3JvX2luc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IG51bV9tYWNyb3M7CisKKyAgb2MgPSAmIGZyMzBfY2dlbl9pbnNuX29wY29kZV90YWJsZVswXTsKKyAgaW5zbnMgPSAoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllczsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQorICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKKworICBjZC0+c2l6ZW9mX2ZpZWxkcyA9IHNpemVvZiAoQ0dFTl9GSUVMRFMpOworICBjZC0+c2V0X2ZpZWxkc19iaXRzaXplID0gc2V0X2ZpZWxkc19iaXRzaXplOworCisgIGNkLT5hc21faGFzaF9wID0gYXNtX2hhc2hfaW5zbl9wOworICBjZC0+YXNtX2hhc2ggPSBhc21faGFzaF9pbnNuOworICBjZC0+YXNtX2hhc2hfc2l6ZSA9IENHRU5fQVNNX0hBU0hfU0laRTsKKworICBjZC0+ZGlzX2hhc2hfcCA9IGRpc19oYXNoX2luc25fcDsKKyAgY2QtPmRpc19oYXNoID0gZGlzX2hhc2hfaW5zbjsKKyAgY2QtPmRpc19oYXNoX3NpemUgPSBDR0VOX0RJU19IQVNIX1NJWkU7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtb3BjLmggYi9vcGNvZGVzL2ZyMzAtb3BjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4N2VkNQotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvZnIzMC1vcGMuaApAQCAtMCwwICsxLDE1MCBAQAorLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgZnIzMC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBGUjMwX09QQ19ICisjZGVmaW5lIEZSMzBfT1BDX0gKKworLyogLS0gb3BjLmggKi8KKworLyogPz8/IFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24uICAqLworI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQorI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMTYKKyN1bmRlZiBDR0VOX0RJU19IQVNICisjZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMF0gPj4gNCkKKworLyogLS0gKi8KKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgaW5zdHJ1Y3Rpb24gdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faW5zbl90eXBlIHsKKyAgRlIzMF9JTlNOX0lOVkFMSUQsIEZSMzBfSU5TTl9BREQsIEZSMzBfSU5TTl9BRERJLCBGUjMwX0lOU05fQUREMgorICwgRlIzMF9JTlNOX0FEREMsIEZSMzBfSU5TTl9BREROLCBGUjMwX0lOU05fQURETkksIEZSMzBfSU5TTl9BREROMgorICwgRlIzMF9JTlNOX1NVQiwgRlIzMF9JTlNOX1NVQkMsIEZSMzBfSU5TTl9TVUJOLCBGUjMwX0lOU05fQ01QCisgLCBGUjMwX0lOU05fQ01QSSwgRlIzMF9JTlNOX0NNUDIsIEZSMzBfSU5TTl9BTkQsIEZSMzBfSU5TTl9PUgorICwgRlIzMF9JTlNOX0VPUiwgRlIzMF9JTlNOX0FORE0sIEZSMzBfSU5TTl9BTkRILCBGUjMwX0lOU05fQU5EQgorICwgRlIzMF9JTlNOX09STSwgRlIzMF9JTlNOX09SSCwgRlIzMF9JTlNOX09SQiwgRlIzMF9JTlNOX0VPUk0KKyAsIEZSMzBfSU5TTl9FT1JILCBGUjMwX0lOU05fRU9SQiwgRlIzMF9JTlNOX0JBTkRMLCBGUjMwX0lOU05fQk9STAorICwgRlIzMF9JTlNOX0JFT1JMLCBGUjMwX0lOU05fQkFOREgsIEZSMzBfSU5TTl9CT1JILCBGUjMwX0lOU05fQkVPUkgKKyAsIEZSMzBfSU5TTl9CVFNUTCwgRlIzMF9JTlNOX0JUU1RILCBGUjMwX0lOU05fTVVMLCBGUjMwX0lOU05fTVVMVQorICwgRlIzMF9JTlNOX01VTEgsIEZSMzBfSU5TTl9NVUxVSCwgRlIzMF9JTlNOX0RJVjBTLCBGUjMwX0lOU05fRElWMFUKKyAsIEZSMzBfSU5TTl9ESVYxLCBGUjMwX0lOU05fRElWMiwgRlIzMF9JTlNOX0RJVjMsIEZSMzBfSU5TTl9ESVY0UworICwgRlIzMF9JTlNOX0xTTCwgRlIzMF9JTlNOX0xTTEksIEZSMzBfSU5TTl9MU0wyLCBGUjMwX0lOU05fTFNSCisgLCBGUjMwX0lOU05fTFNSSSwgRlIzMF9JTlNOX0xTUjIsIEZSMzBfSU5TTl9BU1IsIEZSMzBfSU5TTl9BU1JJCisgLCBGUjMwX0lOU05fQVNSMiwgRlIzMF9JTlNOX0xESTgsIEZSMzBfSU5TTl9MREkyMCwgRlIzMF9JTlNOX0xESTMyCisgLCBGUjMwX0lOU05fTEQsIEZSMzBfSU5TTl9MRFVILCBGUjMwX0lOU05fTERVQiwgRlIzMF9JTlNOX0xEUjEzCisgLCBGUjMwX0lOU05fTERSMTNVSCwgRlIzMF9JTlNOX0xEUjEzVUIsIEZSMzBfSU5TTl9MRFIxNCwgRlIzMF9JTlNOX0xEUjE0VUgKKyAsIEZSMzBfSU5TTl9MRFIxNFVCLCBGUjMwX0lOU05fTERSMTUsIEZSMzBfSU5TTl9MRFIxNUdSLCBGUjMwX0lOU05fTERSMTVEUgorICwgRlIzMF9JTlNOX0xEUjE1UFMsIEZSMzBfSU5TTl9TVCwgRlIzMF9JTlNOX1NUSCwgRlIzMF9JTlNOX1NUQgorICwgRlIzMF9JTlNOX1NUUjEzLCBGUjMwX0lOU05fU1RSMTNILCBGUjMwX0lOU05fU1RSMTNCLCBGUjMwX0lOU05fU1RSMTQKKyAsIEZSMzBfSU5TTl9TVFIxNEgsIEZSMzBfSU5TTl9TVFIxNEIsIEZSMzBfSU5TTl9TVFIxNSwgRlIzMF9JTlNOX1NUUjE1R1IKKyAsIEZSMzBfSU5TTl9TVFIxNURSLCBGUjMwX0lOU05fU1RSMTVQUywgRlIzMF9JTlNOX01PViwgRlIzMF9JTlNOX01PVkRSCisgLCBGUjMwX0lOU05fTU9WUFMsIEZSMzBfSU5TTl9NT1YyRFIsIEZSMzBfSU5TTl9NT1YyUFMsIEZSMzBfSU5TTl9KTVAKKyAsIEZSMzBfSU5TTl9KTVBELCBGUjMwX0lOU05fQ0FMTFIsIEZSMzBfSU5TTl9DQUxMUkQsIEZSMzBfSU5TTl9DQUxMCisgLCBGUjMwX0lOU05fQ0FMTEQsIEZSMzBfSU5TTl9SRVQsIEZSMzBfSU5TTl9SRVRfRCwgRlIzMF9JTlNOX0lOVAorICwgRlIzMF9JTlNOX0lOVEUsIEZSMzBfSU5TTl9SRVRJLCBGUjMwX0lOU05fQlJBRCwgRlIzMF9JTlNOX0JSQQorICwgRlIzMF9JTlNOX0JOT0QsIEZSMzBfSU5TTl9CTk8sIEZSMzBfSU5TTl9CRVFELCBGUjMwX0lOU05fQkVRCisgLCBGUjMwX0lOU05fQk5FRCwgRlIzMF9JTlNOX0JORSwgRlIzMF9JTlNOX0JDRCwgRlIzMF9JTlNOX0JDCisgLCBGUjMwX0lOU05fQk5DRCwgRlIzMF9JTlNOX0JOQywgRlIzMF9JTlNOX0JORCwgRlIzMF9JTlNOX0JOCisgLCBGUjMwX0lOU05fQlBELCBGUjMwX0lOU05fQlAsIEZSMzBfSU5TTl9CVkQsIEZSMzBfSU5TTl9CVgorICwgRlIzMF9JTlNOX0JOVkQsIEZSMzBfSU5TTl9CTlYsIEZSMzBfSU5TTl9CTFRELCBGUjMwX0lOU05fQkxUCisgLCBGUjMwX0lOU05fQkdFRCwgRlIzMF9JTlNOX0JHRSwgRlIzMF9JTlNOX0JMRUQsIEZSMzBfSU5TTl9CTEUKKyAsIEZSMzBfSU5TTl9CR1RELCBGUjMwX0lOU05fQkdULCBGUjMwX0lOU05fQkxTRCwgRlIzMF9JTlNOX0JMUworICwgRlIzMF9JTlNOX0JISUQsIEZSMzBfSU5TTl9CSEksIEZSMzBfSU5TTl9ETU9WUjEzLCBGUjMwX0lOU05fRE1PVlIxM0gKKyAsIEZSMzBfSU5TTl9ETU9WUjEzQiwgRlIzMF9JTlNOX0RNT1ZSMTNQSSwgRlIzMF9JTlNOX0RNT1ZSMTNQSUgsIEZSMzBfSU5TTl9ETU9WUjEzUElCCisgLCBGUjMwX0lOU05fRE1PVlIxNVBJLCBGUjMwX0lOU05fRE1PVjJSMTMsIEZSMzBfSU5TTl9ETU9WMlIxM0gsIEZSMzBfSU5TTl9ETU9WMlIxM0IKKyAsIEZSMzBfSU5TTl9ETU9WMlIxM1BJLCBGUjMwX0lOU05fRE1PVjJSMTNQSUgsIEZSMzBfSU5TTl9ETU9WMlIxM1BJQiwgRlIzMF9JTlNOX0RNT1YyUjE1UEQKKyAsIEZSMzBfSU5TTl9MRFJFUywgRlIzMF9JTlNOX1NUUkVTLCBGUjMwX0lOU05fQ09QT1AsIEZSMzBfSU5TTl9DT1BMRAorICwgRlIzMF9JTlNOX0NPUFNULCBGUjMwX0lOU05fQ09QU1YsIEZSMzBfSU5TTl9OT1AsIEZSMzBfSU5TTl9BTkRDQ1IKKyAsIEZSMzBfSU5TTl9PUkNDUiwgRlIzMF9JTlNOX1NUSUxNLCBGUjMwX0lOU05fQUREU1AsIEZSMzBfSU5TTl9FWFRTQgorICwgRlIzMF9JTlNOX0VYVFVCLCBGUjMwX0lOU05fRVhUU0gsIEZSMzBfSU5TTl9FWFRVSCwgRlIzMF9JTlNOX0xETTAKKyAsIEZSMzBfSU5TTl9MRE0xLCBGUjMwX0lOU05fU1RNMCwgRlIzMF9JTlNOX1NUTTEsIEZSMzBfSU5TTl9FTlRFUgorICwgRlIzMF9JTlNOX0xFQVZFLCBGUjMwX0lOU05fWENIQiwgRlIzMF9JTlNOX01BWAorfSBDR0VOX0lOU05fVFlQRTsKKworLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgRlIzMF9JTlNOX0lOVkFMSUQKKworLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KKyNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBGUjMwX0lOU05fTUFYKQorCisvKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLworc3RydWN0IGNnZW5fZmllbGRzCit7CisgIGludCBsZW5ndGg7CisgIGxvbmcgZl9uaWw7CisgIGxvbmcgZl9vcDE7CisgIGxvbmcgZl9vcDI7CisgIGxvbmcgZl9vcDM7CisgIGxvbmcgZl9vcDQ7CisgIGxvbmcgZl9vcDU7CisgIGxvbmcgZl9jYzsKKyAgbG9uZyBmX2NjYzsKKyAgbG9uZyBmX1JqOworICBsb25nIGZfUmk7CisgIGxvbmcgZl9SczE7CisgIGxvbmcgZl9SczI7CisgIGxvbmcgZl9SamM7CisgIGxvbmcgZl9SaWM7CisgIGxvbmcgZl9DUmo7CisgIGxvbmcgZl9DUmk7CisgIGxvbmcgZl91NDsKKyAgbG9uZyBmX3U0YzsKKyAgbG9uZyBmX2k0OworICBsb25nIGZfbTQ7CisgIGxvbmcgZl91ODsKKyAgbG9uZyBmX2k4OworICBsb25nIGZfaTIwXzQ7CisgIGxvbmcgZl9pMjBfMTY7CisgIGxvbmcgZl9pMjA7CisgIGxvbmcgZl9pMzI7CisgIGxvbmcgZl91ZGlzcDY7CisgIGxvbmcgZl9kaXNwODsKKyAgbG9uZyBmX2Rpc3A5OworICBsb25nIGZfZGlzcDEwOworICBsb25nIGZfczEwOworICBsb25nIGZfdTEwOworICBsb25nIGZfcmVsOTsKKyAgbG9uZyBmX2Rpcjg7CisgIGxvbmcgZl9kaXI5OworICBsb25nIGZfZGlyMTA7CisgIGxvbmcgZl9yZWwxMjsKKyAgbG9uZyBmX3JlZ2xpc3RfaGlfc3Q7CisgIGxvbmcgZl9yZWdsaXN0X2xvd19zdDsKKyAgbG9uZyBmX3JlZ2xpc3RfaGlfbGQ7CisgIGxvbmcgZl9yZWdsaXN0X2xvd19sZDsKK307CisKKyNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCit7XAorfQorI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCit7XAorfQorI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAore1wKK30KKyNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCit7XAorfQorCisKKyNlbmRpZiAvKiBGUjMwX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4MzAwLWRpcy5jIGIvb3Bjb2Rlcy9oODMwMC1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc1M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9oODMwMC1kaXMuYwpAQCAtMCwwICsxLDQ1NyBAQAorLyogRGlzYXNzZW1ibGUgaDgzMDAgaW5zdHJ1Y3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIERFRklORV9UQUJMRQorCisjZGVmaW5lIGg4X29wY29kZXMgaDhvcHMKKyNpbmNsdWRlICJvcGNvZGUvaDgzMDAuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKworLyogUnVuIHRocm91Z2ggdGhlIG9wY29kZXMgYW5kIHNvcnQgdGhlbSBpbnRvIG9yZGVyIHRvIG1ha2UgdGhlbSBlYXN5CisgICB0byBkaXNhc3NlbWJsZQorICovCitzdGF0aWMgdm9pZAorYmZkX2g4X2Rpc2Fzc2VtYmxlX2luaXQgKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKworICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworCisgIGZvciAocCA9IGg4X29wY29kZXM7IHAtPm5hbWU7IHArKykKKyAgICB7CisgICAgICBpbnQgbjEgPSAwOworICAgICAgaW50IG4yID0gMDsKKworICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzBdIDwgMTYpCisJeworCSAgbjEgPSAoaW50KSBwLT5kYXRhLm5pYlswXTsKKwl9CisgICAgICBlbHNlCisJbjEgPSAwOworICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzFdIDwgMTYpCisJeworCSAgbjIgPSAoaW50KSBwLT5kYXRhLm5pYlsxXTsKKwl9CisgICAgICBlbHNlCisJbjIgPSAwOworCisgICAgICAvKiBKdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmUgYW4gZXZlbiBudW1iZXIgb2YgbmliYmxlcyBpbiBpdCwgYW5kCisJIHRoYXQgdGhlIGNvdW50IGlzIHRoZSBzYW1lIHMgdGhlIGxlbmd0aCAqLworICAgICAgZm9yIChpID0gMDsgcC0+ZGF0YS5uaWJbaV0gIT0gRTsgaSsrKQorCS8qRU1QVFkqLyA7CisgICAgICBpZiAoaSAmIDEpCisJYWJvcnQgKCk7CisgICAgICBwLT5sZW5ndGggPSBpIC8gMjsKKyAgICB9CisKK30KKworCit1bnNpZ25lZCBpbnQKK2JmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbywgbW9kZSkKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBpbnQgbW9kZTsKK3sKKyAgLyogRmluZCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHRhYmxlIGZvciB0aGlzIG9wY29kZSAqLworICBzdGF0aWMgQ09OU1QgY2hhciAqcmVnbmFtZXNbXSA9CisgICAgeworICAgICAgInIwaCIsICJyMWgiLCAicjJoIiwgInIzaCIsICJyNGgiLCAicjVoIiwgInI2aCIsICJyN2giLAorICAgICAgInIwbCIsICJyMWwiLCAicjJsIiwgInIzbCIsICJyNGwiLCAicjVsIiwgInI2bCIsICJyN2wifTsKKyAgCisgIHN0YXRpYyBDT05TVCBjaGFyICp3cmVnbmFtZXNbXSA9CisgICAgeworICAgICAgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKKyAgICAgICJlMCIsICJlMSIsICJlMiIsICJlMyIsICJlNCIsICJlNSIsICJlNiIsICJlNyIKKyAgICAgIH07CisgIAorICBzdGF0aWMgQ09OU1QgY2hhciAqbHJlZ25hbWVzW10gPQorICAgIHsKKyAgICAgICJlcjAiLCAiZXIxIiwgImVyMiIsICJlcjMiLCAiZXI0IiwgImVyNSIsICJlcjYiLCAiZXI3IiwKKyAgICAgICJlcjAiLCAiZXIxIiwgImVyMiIsICJlcjMiLCAiZXI0IiwgImVyNSIsICJlcjYiLCAiZXI3IgorICAgICAgfQorICA7CisKKyAgaW50IHJzID0gMDsKKyAgaW50IHJkID0gMDsKKyAgaW50IHJkaXNwID0gMDsKKyAgaW50IGFicyA9IDA7CisgIGludCBiaXQgPSAwOworICBpbnQgcGxlbiA9IDA7CisgIHN0YXRpYyBib29sZWFuIGluaXQgPSAwOworICBzdHJ1Y3QgaDhfb3Bjb2RlICpxID0gaDhfb3Bjb2RlczsKKyAgY2hhciBDT05TVCAqKnByZWduYW1lcyA9IG1vZGUgIT0gMCA/IGxyZWduYW1lcyA6IHdyZWduYW1lczsKKyAgaW50IHN0YXR1czsKKyAgaW50IGw7CisgIAorICB1bnNpZ25lZCBjaGFyIGRhdGFbMjBdOyAgCisgIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgZnByaW50Zl9mdHlwZSBmcHJpbnRmID0gaW5mby0+ZnByaW50Zl9mdW5jOworCisgIGlmICghaW5pdCkKKyAgICB7CisgICAgICBiZmRfaDhfZGlzYXNzZW1ibGVfaW5pdCAoKTsKKyAgICAgIGluaXQgPSAxOworICAgIH0KKworICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKGFkZHIsIGRhdGEsIDIsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApIAorICAgIHsKKyAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKHN0YXR1cywgYWRkciwgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBmb3IgKGwgPSAyOyBzdGF0dXMgPT0gMCAmJiBsIDwgMTA7IGwrPTIpCisgICAgeworICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhhZGRyK2wsIGRhdGErbCwgMiwgaW5mbyk7CisgICAgfQorICAKKyAgCisKKyAgLyogRmluZCB0aGUgZXhhY3Qgb3Bjb2RlL2FyZyBjb21ibyAqLworICB3aGlsZSAocS0+bmFtZSkKKyAgICB7CisgICAgICBvcF90eXBlICpuaWI7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworICAgICAgbmliID0gcS0+ZGF0YS5uaWI7CisgICAgICAKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIG9wX3R5cGUgbG9va2luZ19mb3IgPSAqbmliOworCSAgaW50IHRoaXNuaWIgPSBkYXRhW2xlbiA+PiAxXTsKKwkgIAorCSAgdGhpc25pYiA9IChsZW4gJiAxKSA/ICh0aGlzbmliICYgMHhmKSA6ICgodGhpc25pYiA+PiA0KSAmIDB4Zik7CisJICAKKwkgIGlmIChsb29raW5nX2ZvciA8IDE2ICYmIGxvb2tpbmdfZm9yID49MCkgCisJICAgIHsKKwkgICAgICAKKwkgICAgICBpZiAobG9va2luZ19mb3IgIT0gdGhpc25pYikgCisJCWdvdG8gZmFpbDsKKwkgICAgfQorCSAgCisJICBlbHNlIAorCSAgICB7CisJICAgICAgCisJICAgICAgaWYgKChpbnQpIGxvb2tpbmdfZm9yICYgKGludCkgQjMxKQorCQl7CisJCSAgaWYgKCEgKCgoaW50KSB0aGlzbmliICYgMHg4KSAhPSAwKSkgCisJCSAgICBnb3RvIGZhaWw7CisJCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMSk7CisJCX0KKwkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzApCisJCXsKKwkJICBpZiAoISgoKGludCkgdGhpc25pYiAmIDB4OCkgPT0gMCkpIAorCQkgICAgZ290byBmYWlsOworCQkgIGxvb2tpbmdfZm9yID0gKG9wX3R5cGUpICgoaW50KSBsb29raW5nX2ZvciAmIH4oaW50KSBCMzApOworCQl9CisKKwkgICAgICBpZiAobG9va2luZ19mb3IgJiBEQklUKQorCQl7CisJCSAgaWYgKChsb29raW5nX2ZvciAmIDUpICE9ICh0aGlzbmliICY1KSkgZ290byBmYWlsOworCQkgIGFicyA9ICh0aGlzbmliICYgMHg4KSA/IDIgOiAxOworCQl9CQkgIAorCSAgICAgIAorCSAgICAgIGVsc2UgIGlmIChsb29raW5nX2ZvciAmIChSRUcgfCBJTkR8SU5DfERFQykpCisJCXsKKwkJICBpZiAobG9va2luZ19mb3IgJiBTUkMpCisJCSAgICB7CisJCSAgICAgIHJzID0gdGhpc25pYjsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHJkID0gdGhpc25pYjsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8xNikKKwkJeworCQkgIGFicyA9IChkYXRhW2xlbiA+PiAxXSkgKiAyNTYgKyBkYXRhWyhsZW4gKyAyKSA+PiAxXTsKKwkJICBwbGVuID0gMTY7CisJICAgICAgCisJCX0KKwkgICAgICBlbHNlIGlmKGxvb2tpbmdfZm9yICYgQUJTSk1QKQorCQl7CisJCSAgYWJzID0KKwkJICAgIChkYXRhWzFdIDw8IDE2KQorCQkgICAgICB8IChkYXRhWzJdIDw8IDgpCisJCQl8IChkYXRhWzNdKTsKKwkJfQorCSAgICAgIGVsc2UgaWYobG9va2luZ19mb3IgJiBNRU1JTkQpCisJCXsKKwkJICBhYnMgPSBkYXRhWzFdOworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMyKQorCQl7CisJCSAgaW50IGkgPSBsZW4gPj4gMTsKKwkJICBhYnMgPSAoZGF0YVtpXSA8PCAyNCkKKwkJICAgIHwgKGRhdGFbaSArIDFdIDw8IDE2KQorCQkgICAgICB8IChkYXRhW2kgKyAyXSA8PCA4KQorCQkJfCAoZGF0YVtpKyAzXSk7CisKKwkJICBwbGVuID0zMjsKKwkgICAgICAKKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yNCkKKwkJeworCQkgIGludCBpID0gbGVuID4+IDE7CisJCSAgYWJzID0gKGRhdGFbaV0gPDwgMTYpIHwgKGRhdGFbaSArIDFdIDw8IDgpfCAgKGRhdGFbaSsyXSk7CisJCSAgcGxlbiA9MjQ7CisJCX0KKwkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIElHTk9SRSkKKwkJeworCQkgIAorCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBESVNQUkVHKQorCQl7CisJCSAgcmRpc3AgPSB0aGlzbmliOworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBLQklUKQorCQl7CisJCSAgc3dpdGNoICh0aGlzbmliKSAKKwkJICAgIHsKKwkJICAgIGNhc2UgOToKKwkJICAgICAgYWJzID0gNDsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDg6CisJCSAgICAgIGFicyA9IDI7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAwOgorCQkgICAgICBhYnMgPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGdvdG8gZmFpbDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF84KQorCQl7CisJCSAgcGxlbiA9IDg7CQkgIAorCQkgIGFicyA9IGRhdGFbbGVuID4+IDFdOworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMpCisJCXsKKwkJICBiaXQgPSB0aGlzbmliICYgMHg3OworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzIpCisJCXsKKwkJICBwbGVuID0gMjsKKwkJICBhYnMgPSB0aGlzbmliICYgMHgzOworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBNQUNSRUcpCisJCXsKKwkJICBhYnMgPSAodGhpc25pYiA9PSAzKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yID09IEUpCisJCXsKKworCQkgIHsKKwkJICAgIGludCBpOworCisJCSAgICBmb3IgKGkgPSAwOyBpIDwgcS0+bGVuZ3RoOyBpKyspCisJCSAgICAgIHsKKwkJCWZwcmludGYgKHN0cmVhbSwgIiUwMnggIiwgZGF0YVtpXSk7CisJCSAgICAgIH0KKwkJICAgIGZvciAoOyBpIDwgNjsgaSsrKQorCQkgICAgICB7CisJCQlmcHJpbnRmIChzdHJlYW0sICIgICAiKTsKKwkJICAgICAgfQorCQkgIH0KKwkJICBmcHJpbnRmIChzdHJlYW0sICIlc1x0IiwgcS0+bmFtZSk7CisKKwkJICAvKiBHcm9zcy4gIERpc2d1c3RpbmcuICAqLworCQkgIGlmIChzdHJjbXAgKHEtPm5hbWUsICJsZG0ubCIpID09IDApCisJCSAgICB7CisJCSAgICAgIGludCBjb3VudCwgaGlnaDsKKworCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOworCQkgICAgICBoaWdoID0gZGF0YVszXSAmIDB4NzsKKworCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJAc3ArLGVyJWQtZXIlZCIsIGhpZ2ggLSBjb3VudCwgaGlnaCk7CisJCSAgICAgIHJldHVybiBxLT5sZW5ndGg7CisJCSAgICB9CisKKwkJICBpZiAoc3RyY21wIChxLT5uYW1lLCAic3RtLmwiKSA9PSAwKQorCQkgICAgeworCQkgICAgICBpbnQgY291bnQsIGxvdzsKKworCQkgICAgICBjb3VudCA9IChkYXRhWzFdID4+IDQpICYgMHgzOworCQkgICAgICBsb3cgPSBkYXRhWzNdICYgMHg3OworCisJCSAgICAgIGZwcmludGYgKHN0cmVhbSwgImVyJWQtZXIlZCxALXNwIiwgbG93LCBsb3cgKyBjb3VudCk7CisJCSAgICAgIHJldHVybiBxLT5sZW5ndGg7CisJCSAgICB9CisKKwkJICAvKiBGaWxsIGluIHRoZSBhcmdzICovCisJCSAgeworCQkgICAgb3BfdHlwZSAqYXJncyA9IHEtPmFyZ3MubmliOworCQkgICAgaW50IGhhZG9uZSA9IDA7CisKKworCQkgICAgd2hpbGUgKCphcmdzICE9IEUpCisJCSAgICAgIHsKKwkJCWludCB4ID0gKmFyZ3M7CisJCQlpZiAoaGFkb25lKQorCQkJICBmcHJpbnRmIChzdHJlYW0sICIsIik7CisKKworCQkJaWYgKHggJiBMXzMpCisJCQkgIHsKKwkJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjMHgleCIsICh1bnNpZ25lZCkgYml0KTsKKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIChJTU18S0JJVHxEQklUKSkKKwkJCSAgeworCQkJICAgIC8qIEJsZXRjaC4gIEZvciBzaGFsICMyLGVyMCBhbmQgZnJpZW5kcy4gICovCisJCQkgICAgaWYgKCooYXJncysxKSAmIFNSQ19JTl9EU1QpCisJCQkgICAgICBhYnMgPSAyOworCisJCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiIzB4JXgiLCAodW5zaWduZWQpIGFicyk7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiBSRUcpCisJCQkgIHsKKwkJCSAgICBpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOworCQkJICAgIHN3aXRjaCAoeCAmIFNJWkUpCisJCQkgICAgICB7CisJCQkgICAgICBjYXNlIExfODoKKwkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIHJlZ25hbWVzW3JuXSk7CisJCQkJYnJlYWs7CisJCQkgICAgICBjYXNlIExfMTY6CisJCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCB3cmVnbmFtZXNbcm5dKTsKKwkJCQlicmVhazsKKwkJCSAgICAgIGNhc2UgTF9QOgorCQkJICAgICAgY2FzZSBMXzMyOgorCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgbHJlZ25hbWVzW3JuXSk7CisJCQkJYnJlYWs7CisJCSAgICAKKwkJCSAgICAgIH0KKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIE1BQ1JFRykKKwkJCSAgeworCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIm1hYyVjIiwgYWJzID8gJ2wnIDogJ2gnKTsKKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIElOQykKKwkJCSAgeworCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAlcysiLCBwcmVnbmFtZXNbcnNdKTsKKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIERFQykKKwkJCSAgeworCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAtJXMiLCBwcmVnbmFtZXNbcmRdKTsKKwkJCSAgfQorCisJCQllbHNlIGlmICh4ICYgSU5EKQorCQkJICB7CisJCQkgICAgaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKKwkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAJXMiLCBwcmVnbmFtZXNbcm5dKTsKKwkJCSAgfQorCisJCQllbHNlIGlmICh4ICYgQUJTOE1FTSkKKwkJCSAgeworCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OjgiLCAodW5zaWduZWQpIGFicyk7CisJCQkgIH0KKworCQkJZWxzZSBpZiAoeCAmIChBQlN8QUJTSk1QKSkKKwkJCSAgeworCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAweCV4OiVkIiwgKHVuc2lnbmVkKSBhYnMsIHBsZW4pOworCQkJICB9CisKKwkJCWVsc2UgaWYgKHggJiBNRU1JTkQpCisJCQkgIHsKKwkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAQCVkICgleCkiLCBhYnMsIGFicyk7CisJCQkgIH0KKworCQkJZWxzZSBpZiAoeCAmIFBDUkVMKQorCQkJICB7CisJCQkgICAgaWYgKHggJiBMXzE2KSAKKwkJCSAgICAgIHsKKwkJCQlhYnMgICs9MjsKKwkJCQlmcHJpbnRmIChzdHJlYW0sICIuJXMlZCAoJXgpIiwgKHNob3J0KSBhYnMgPiAwID8gIisiIDogIiIsIChzaG9ydCkgYWJzLAorCQkJCQkgYWRkciArIChzaG9ydCkgYWJzICsgMik7CisJCQkgICAgICB9CisJCQkgICAgZWxzZSB7CisJCQkgICAgICBmcHJpbnRmIChzdHJlYW0sICIuJXMlZCAoJXgpIiwgKGNoYXIpIGFicyA+IDAgPyAiKyIgOiAiIiwgKGNoYXIpIGFicywKKwkJCQkgICAgICAgYWRkciArIChjaGFyKSBhYnMgKyAyKTsKKwkJCSAgICB9CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiBESVNQKQorCQkJICB7CisJCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCgweCV4OiVkLCVzKSIsIGFicyxwbGVuLCBwcmVnbmFtZXNbcmRpc3BdKTsKKwkJCSAgfQorCisJCQllbHNlIGlmICh4ICYgQ0NSKQorCQkJICB7CisJCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiY2NyIik7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiBFWFIpCisJCQkgIHsKKwkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJleHIiKTsKKwkJCSAgfQorCQkJZWxzZQorCQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkJICBmcHJpbnRmIChzdHJlYW0sIF8oIkhtbW1tICV4IiksIHgpOworCQkJaGFkb25lID0gMTsKKwkJCWFyZ3MrKzsKKwkJICAgICAgfQorCQkgIH0KKwkJICByZXR1cm4gcS0+bGVuZ3RoOworCQl9CisKKyAgICAgIAorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJCSAgZnByaW50ZiAoc3RyZWFtLCBfKCJEb24ndCB1bmRlcnN0YW5kICV4IFxuIiksIGxvb2tpbmdfZm9yKTsKKwkJfQorCSAgICB9CisJICAKKwkgIGxlbisrOworCSAgbmliKys7CisJfQorICAgICAgCisgICAgZmFpbDoKKyAgICAgIHErKzsKKyAgICB9CisKKyAgLyogRmVsbCBvZiB0aGUgZW5kICovCisgIGZwcmludGYgKHN0cmVhbSwgIiUwMnggJTAyeCAgICAgICAgLndvcmRcdEgnJXgsSCcleCIsCisJICAgZGF0YVswXSwgZGF0YVsxXSwKKwkgICBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgcmV0dXJuIDI7Cit9CisKK2ludCAKK3ByaW50X2luc25faDgzMDAgKGFkZHIsIGluZm8pCitiZmRfdm1hIGFkZHI7IAorZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDApOworfQorCitpbnQgCitwcmludF9pbnNuX2g4MzAwaCAoYWRkciwgaW5mbykKK2JmZF92bWEgYWRkcjsKK2Rpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAxKTsKK30KKworaW50IAorcHJpbnRfaW5zbl9oODMwMHMgKGFkZHIsIGluZm8pCitiZmRfdm1hIGFkZHI7CitkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMik7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2g4NTAwLWRpcy5jIGIvb3Bjb2Rlcy9oODUwMC1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjg1OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9oODUwMC1kaXMuYwpAQCAtMCwwICsxLDM0NyBAQAorLyogRGlzYXNzZW1ibGUgaDg1MDAgaW5zdHJ1Y3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIERJU0FTU0VNQkxFUl9UQUJMRQorI2RlZmluZSBERUZJTkVfVEFCTEUKKworI2luY2x1ZGUgImg4NTAwLW9wYy5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworLyogTWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBNQVhMRU4gOAorCisjaW5jbHVkZSA8c2V0am1wLmg+CisKK3N0cnVjdCBwcml2YXRlCit7CisgIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KKyAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOworICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07CisgIGJmZF92bWEgaW5zbl9zdGFydDsKKyAgam1wX2J1ZiBiYWlsb3V0OworfTsKKworLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQorICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCisgICBvbiBlcnJvci4gICovCisjZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAorICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKKyAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKKworc3RhdGljIGludAorZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGJmZF9ieXRlICphZGRyOworeworICBpbnQgc3RhdHVzOworICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKSBpbmZvLT5wcml2YXRlX2RhdGE7CisgIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCisJCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCisJCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAorCQkJCSAgICAgIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOworICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7CisgICAgfQorICBlbHNlCisgICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKmNybmFtZVtdID0KK3sic3IiLCAiY2NyIiwgIioiLCAiYnIiLCAiZXAiLCAiZHAiLCAiKiIsICJ0cCJ9OworCitpbnQKK3ByaW50X2luc25faDg1MDAgKGFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKKyAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOworICBmcHJpbnRmX2Z0eXBlIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7CisKKyAgc3RydWN0IHByaXZhdGUgcHJpdjsKKyAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKKworICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmIHByaXY7CisgIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7CisgIHByaXYuaW5zbl9zdGFydCA9IGFkZHI7CisgIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKKyAgICAvKiBFcnJvciByZXR1cm4uICAqLworICAgIHJldHVybiAtMTsKKworaWYgKDApICB7CisgICAgc3RhdGljICAgIGludCBvbmU7CisgICAgaWYgKCFvbmUgKSAKKyAgICAgIHsKKwlvbmUgPSAxOworCWZvciAob3Bjb2RlID0gaDg1MDBfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisJICB7CisJICAgIGlmICgob3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyAmIDB4OCkgPT0gMCkKKwkgICAgICBwcmludGYoIiVzXG4iLCBvcGNvZGUtPm5hbWUpOworCSAgfQorICAgICAgfQorICB9CisKKworICAvKiBSdW4gZG93biB0aGUgdGFibGUgdG8gZmluZCB0aGUgb25lIHdoaWNoIG1hdGNoZXMgKi8KKyAgZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBpbnQgYnl0ZTsKKyAgICAgIGludCBybiA9IDA7CisgICAgICBpbnQgcmQgPSAwOworICAgICAgaW50IHJzID0gMDsKKyAgICAgIGludCBkaXNwID0gMDsKKyAgICAgIGludCBhYnMgPSAwOworICAgICAgaW50IGltbSA9IDA7CisgICAgICBpbnQgcGNyZWwgPSAwOworICAgICAgaW50IHFpbSA9IDA7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBjciA9IDA7CisgICAgICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgb3Bjb2RlLT5sZW5ndGg7IGJ5dGUrKykKKwl7CisJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMSk7CisJICBpZiAoKGJ1ZmZlcltieXRlXSAmIG9wY29kZS0+Ynl0ZXNbYnl0ZV0ubWFzaykKKwkgICAgICAhPSAob3Bjb2RlLT5ieXRlc1tieXRlXS5jb250ZW50cykpCisJICAgIHsKKwkgICAgICBnb3RvIG5leHQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIGV4dHJhY3QgYW55IGluZm8gcGFydHMgKi8KKwkgICAgICBzd2l0Y2ggKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uaW5zZXJ0KQorCQl7CisJCWNhc2UgMDoKKwkJY2FzZSBGUDoKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkgIGZ1bmMgKHN0cmVhbSwgXygiY2FuJ3QgY29wZSB3aXRoIGluc2VydCAlZFxuIiksCisJCQlvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCk7CisJCSAgYnJlYWs7CisJCWNhc2UgUk46CisJCSAgcm4gPSBidWZmZXJbYnl0ZV0gJiAweDc7CisJCSAgYnJlYWs7CisJCWNhc2UgUlM6CisJCSAgcnMgPSBidWZmZXJbYnl0ZV0gJiAweDc7CisJCSAgYnJlYWs7CisJCWNhc2UgQ1JCOgorCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OworCQkgIGlmIChjciA9PSAwKQorCQkgICAgZ290byBuZXh0OworCQkgIGJyZWFrOworCQljYXNlIENSVzoKKwkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKKwkJICBpZiAoY3IgIT0gMCkKKwkJICAgIGdvdG8gbmV4dDsKKwkJICBicmVhazsKKwkJY2FzZSBESVNQMTY6CisJCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOworCQkgIGRpc3AgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOworCQkgIGJyZWFrOworCQljYXNlIEZQSU5EX0Q4OgorCQljYXNlIERJU1A4OgorCQkgIGRpc3AgPSAoKGNoYXIpIChidWZmZXJbYnl0ZV0pKTsKKwkJICBicmVhazsKKwkJY2FzZSBSRDoKKwkJY2FzZSBSRElORDoKKwkJICByZCA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKKwkJICBicmVhazsKKwkJY2FzZSBBQlMyNDoKKwkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMyk7CisJCSAgYWJzID0KKwkJICAgIChidWZmZXJbYnl0ZV0gPDwgMTYpCisJCSAgICB8IChidWZmZXJbYnl0ZSArIDFdIDw8IDgpCisJCSAgICB8IChidWZmZXJbYnl0ZSArIDJdKTsKKwkJICBicmVhazsKKwkJY2FzZSBBQlMxNjoKKwkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7CisJCSAgYWJzID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKKwkJICBicmVhazsKKwkJY2FzZSBBQlM4OgorCQkgIGFicyA9IChidWZmZXJbYnl0ZV0pOworCQkgIGJyZWFrOworCQljYXNlIElNTTE2OgorCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKKwkJICBpbW0gPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOworCQkgIGJyZWFrOworCQljYXNlIElNTTQ6CisJCSAgaW1tID0gKGJ1ZmZlcltieXRlXSkgJiAweGY7CisJCSAgYnJlYWs7CisJCWNhc2UgSU1NODoKKwkJY2FzZSBSTElTVDoKKwkJICBpbW0gPSAoYnVmZmVyW2J5dGVdKTsKKwkJICBicmVhazsKKwkJY2FzZSBQQ1JFTDE2OgorCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKKwkJICBwY3JlbCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgUENSRUw4OgorCQkgIHBjcmVsID0gKGJ1ZmZlcltieXRlXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgUUlNOgorCQkgIHN3aXRjaCAoYnVmZmVyW2J5dGVdICYgMHg3KQorCQkgICAgeworCQkgICAgY2FzZSAwOgorCQkgICAgICBxaW0gPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgMToKKwkJICAgICAgcWltID0gMjsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDQ6CisJCSAgICAgIHFpbSA9IC0xOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgNToKKwkJICAgICAgcWltID0gLTI7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGJyZWFrOworCisJCX0KKwkgICAgfQorCX0KKyAgICAgIC8qIFdlIGdldCBoZXJlIHdoZW4gYWxsIHRoZSBtYXNrcyBoYXZlIHBhc3NlZCBzbyB3ZSBjYW4gb3V0cHV0IHRoZQorCSBvcGVyYW5kcyovCisgICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBvcGNvZGUtPmxlbmd0aCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgb3Bjb2RlLT5sZW5ndGg7IGkrKykKKwl7CisJICAoZnVuYykgKHN0cmVhbSwgIiUwMnggIiwgYnVmZmVyW2ldKTsKKwl9CisgICAgICBmb3IgKDsgaSA8IDY7IGkrKykKKwl7CisJICAoZnVuYykgKHN0cmVhbSwgIiAgICIpOworCX0KKyAgICAgIChmdW5jKSAoc3RyZWFtLCAiJXNcdCIsIG9wY29kZS0+bmFtZSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgb3Bjb2RlLT5uYXJnczsgaSsrKQorCXsKKwkgIGlmIChpKQorCSAgICAoZnVuYykgKHN0cmVhbSwgIiwiKTsKKwkgIHN3aXRjaCAob3Bjb2RlLT5hcmdfdHlwZVtpXSkKKwkgICAgeworCSAgICBjYXNlIEZQOgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgImZwIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUk5JTkRfRDE2OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDoxNixyJWQpIiwgZGlzcCwgcm4pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOSU5EX0Q4OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDo4ICglZCksciVkKSIsIGRpc3AgJiAweGZmLCBkaXNwLCBybik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkRJTkRfRDE2OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDoxNixyJWQpIiwgZGlzcCwgcmQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJESU5EX0Q4OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDo4ICglZCksIHIlZCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcmQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEZQSU5EX0Q4OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDo4ICglZCksIGZwKSIsIGRpc3AgJiAweGZmLCBkaXNwLCBybik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ1JCOgorCSAgICBjYXNlIENSVzoKKwkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGNybmFtZVtjcl0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOOgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJuKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSRDoKKwkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCByZCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlM6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcnMpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOREVDOgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAtciVkIiwgcm4pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOSU5DOgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQrIiwgcm4pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOSU5EOgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQiLCBybik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkRJTkQ6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCIsIHJkKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTUElOQzoKKwkgICAgICBmdW5jIChzdHJlYW0sICJAc3ArIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1BERUM6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiQC1zcCIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFCUzI0OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDoyNCIsIGFicyk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQUJTMTY6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjE2IiwgYWJzICYgMHhmZmZmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBQlM4OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDo4IiwgYWJzICYgMHhmZik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSU1NMTY6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjE2IiwgaW1tICYgMHhmZmZmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSTElTVDoKKwkgICAgICB7CisJCWludCBpOworCQlpbnQgbmMgPSAwOworCQlmdW5jIChzdHJlYW0sICIoIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCSAgeworCQkgICAgaWYgKGltbSAmICgxIDw8IGkpKQorCQkgICAgICB7CisJCQlmdW5jIChzdHJlYW0sICJyJWQiLCBpKTsKKwkJCWlmIChuYykKKwkJCSAgZnVuYyAoc3RyZWFtLCAiLCIpOworCQkJbmMgPSAxOworCQkgICAgICB9CisJCSAgfQorCQlmdW5jIChzdHJlYW0sICIpIik7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIElNTTg6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjgiLCBpbW0gJiAweGZmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQQ1JFTDE2OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIjB4JTB4OjE2IiwgKHBjcmVsICsgYWRkciArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUENSRUw4OgorCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDo4IiwKKwkJICAgICgoY2hhcikgcGNyZWwgKyBhZGRyICsgb3Bjb2RlLT5sZW5ndGgpICYgMHhmZmZmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBRSU06CisJICAgICAgZnVuYyAoc3RyZWFtLCAiIyVkOnEiLCBxaW0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIElNTTQ6CisJICAgICAgZnVuYyAoc3RyZWFtLCAiIyVkOjQiLCBpbW0pOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIG9wY29kZS0+bGVuZ3RoOworICAgIG5leHQ6OworICAgIH0KKworICAvKiBDb3VsZG4ndCB1bmRlcnN0YW5kIGFueXRoaW5nICovCisgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgIGZ1bmMgKHN0cmVhbSwgXygiJTAyeFx0XHQqdW5rbm93bioiKSwgYnVmZmVyWzBdKTsKKyAgcmV0dXJuIDE7CisKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvaDg1MDAtb3BjLmggYi9vcGNvZGVzL2g4NTAwLW9wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTQ5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2g4NTAwLW9wYy5oCkBAIC0wLDAgKzEsMzgzNiBAQAordHlwZWRlZiBlbnVtCit7CisgIEdSMCxHUjEsR1IyLEdSMyxHUjQsR1I1LEdSNixHUjcsCisgIEdQUjAsIEdQUjEsIEdQUjIsIEdQUjMsIEdQUjQsIEdQUjUsIEdQUjYsIEdQUjcsCisgIEdDQ1IsIEdQQywgCisgIEdTRUdDLCBHU0VHRCwgR1NFR0UsIEdTRUdULEdMQVNUCit9IGdkYnJlZ190eXBlOworI2RlZmluZSBPX1hPUkMgMQorI2RlZmluZSBPX1hPUiAyCisjZGVmaW5lIE9fWENIIDMKKyNkZWZpbmUgT19VTkxLIDQKKyNkZWZpbmUgT19UU1QgNQorI2RlZmluZSBPX1RSQVBBIDYKKyNkZWZpbmUgT19UUkFQX1ZTIDcKKyNkZWZpbmUgT19UQVMgOAorI2RlZmluZSBPX1NXQVAgOQorI2RlZmluZSBPX1NVQlggMTAKKyNkZWZpbmUgT19TVUJTIDExCisjZGVmaW5lIE9fU1VCIDEyCisjZGVmaW5lIE9fU1RNIDEzCisjZGVmaW5lIE9fU1RDIDE0CisjZGVmaW5lIE9fU0xFRVAgMTUKKyNkZWZpbmUgT19TSExSIDE2CisjZGVmaW5lIE9fU0hMTCAxNworI2RlZmluZSBPX1NIQVIgMTgKKyNkZWZpbmUgT19TSEFMIDE5CisjZGVmaW5lIE9fU0NCX05FIDIwCisjZGVmaW5lIE9fU0NCX0YgMjEKKyNkZWZpbmUgT19TQ0JfRVEgMjIKKyNkZWZpbmUgT19SVFMgMjMKKyNkZWZpbmUgT19SVEQgMjQKKyNkZWZpbmUgT19ST1RYUiAyNQorI2RlZmluZSBPX1JPVFhMIDI2CisjZGVmaW5lIE9fUk9UUiAyNworI2RlZmluZSBPX1JPVEwgMjgKKyNkZWZpbmUgT19QUlRTIDI5CisjZGVmaW5lIE9fUFJURCAzMAorI2RlZmluZSBPX1BKU1IgMzEKKyNkZWZpbmUgT19QSk1QIDMyCisjZGVmaW5lIE9fT1JDIDMzCisjZGVmaW5lIE9fT1IgMzQKKyNkZWZpbmUgT19OT1QgMzUKKyNkZWZpbmUgT19OT1AgMzYKKyNkZWZpbmUgT19ORUcgMzcKKyNkZWZpbmUgT19NVUxYVSAzOAorI2RlZmluZSBPX01PVlRQRSAzOQorI2RlZmluZSBPX01PVkZQRSA0MAorI2RlZmluZSBPX01PViA0MQorI2RlZmluZSBPX0xJTksgNDIKKyNkZWZpbmUgT19MRE0gNDMKKyNkZWZpbmUgT19MREMgNDQKKyNkZWZpbmUgT19KU1IgNDUKKyNkZWZpbmUgT19KTVAgNDYKKyNkZWZpbmUgT19FWFRVIDQ3CisjZGVmaW5lIE9fRVhUUyA0OAorI2RlZmluZSBPX0RTVUIgNDkKKyNkZWZpbmUgT19ESVZYVSA1MAorI2RlZmluZSBPX0RBREQgNTEKKyNkZWZpbmUgT19DTVAgNTIKKyNkZWZpbmUgT19DTFIgNTMKKyNkZWZpbmUgT19CVlMgNTQKKyNkZWZpbmUgT19CVkMgNTUKKyNkZWZpbmUgT19CVFNUIDU2CisjZGVmaW5lIE9fQlQgNTcKKyNkZWZpbmUgT19CU1IgNTgKKyNkZWZpbmUgT19CU0VUIDU5CisjZGVmaW5lIE9fQlJOIDYwCisjZGVmaW5lIE9fQlJBIDYxCisjZGVmaW5lIE9fQlBUIDYyCisjZGVmaW5lIE9fQlBMIDYzCisjZGVmaW5lIE9fQk5PVCA2NAorI2RlZmluZSBPX0JORSA2NQorI2RlZmluZSBPX0JNSSA2NgorI2RlZmluZSBPX0JMVCA2NworI2RlZmluZSBPX0JMUyA2OAorI2RlZmluZSBPX0JMTyA2OQorI2RlZmluZSBPX0JMRSA3MAorI2RlZmluZSBPX0JIUyA3MQorI2RlZmluZSBPX0JISSA3MgorI2RlZmluZSBPX0JHVCA3MworI2RlZmluZSBPX0JHRSA3NAorI2RlZmluZSBPX0JGIDc1CisjZGVmaW5lIE9fQkVRIDc2CisjZGVmaW5lIE9fQkNTIDc3CisjZGVmaW5lIE9fQkNMUiA3OAorI2RlZmluZSBPX0JDQyA3OQorI2RlZmluZSBPX0FOREMgODAKKyNkZWZpbmUgT19BTkQgODEKKyNkZWZpbmUgT19BRERYIDgyCisjZGVmaW5lIE9fQUREUyA4MworI2RlZmluZSBPX0FERCA4NAorI2RlZmluZSBPX0JZVEUgMTI4CisjZGVmaW5lIE9fV09SRCAweDAwMAorI2RlZmluZSBPX1VOU1ogMHgwMDAKKyNkZWZpbmUgRlBJTkRfRDgJMTAKKyNkZWZpbmUgUkRJTkRfRDE2CTExCisjZGVmaW5lIFJESU5EX0Q4CTEyCisjZGVmaW5lIFNQREVDCTEzCisjZGVmaW5lIFJESU5ECTE0CisjZGVmaW5lIFJOCTE1CisjZGVmaW5lIFJOSU5EX0Q4CTE2CisjZGVmaW5lIFJOSU5EX0QxNgkxNworI2RlZmluZSBSTkRFQwkxOAorI2RlZmluZSBSTklOQwkxOQorI2RlZmluZSBSTklORAkyMAorI2RlZmluZSBTUElOQwkyMQorI2RlZmluZSBBQlMxNgkyMgorI2RlZmluZSBBQlMyNAkyMworI2RlZmluZSBQQ1JFTDE2CTI0CisjZGVmaW5lIFBDUkVMOAkyNQorI2RlZmluZSBBQlM4CTI2CisjZGVmaW5lIENSQgkyNworI2RlZmluZSBDUgkyOAorI2RlZmluZSBDUlcJMjkKKyNkZWZpbmUgRElTUDE2CTMwCisjZGVmaW5lIERJU1A4CTMxCisjZGVmaW5lIEZQCTMyCisjZGVmaW5lIElNTTE2CTMzCisjZGVmaW5lIElNTTQJMzQKKyNkZWZpbmUgSU1NOAkzNQorI2RlZmluZSBSTElTVAkzNgorI2RlZmluZSBRSU0JMzcKKyNkZWZpbmUgUkQJMzgKKyNkZWZpbmUgUlMJMzkKKyNkZWZpbmUgU1AJNDAKK3R5cGVkZWYgZW51bSB7IEFDX0JBRCwgQUNfRUksIEFDX1JJLCBBQ19ELCBBQ18sQUNfRVJSLCBBQ19YLEFDX0IsIEFDX0VFLEFDX1JSLEFDX0lFLAorIEFDX1JFLEFDX0UsIEFDX0ksIEFDX0VSLEFDX0lSUiwgQUNfSVIsIEFDX1JFUiwgQUNfRVJFLEFDX0VJRSB9IGFkZHJfY2xhc3NfdHlwZTsgCit0eXBlZGVmIHN0cnVjdCB7CisJc2hvcnQgaW50IGlkeDsKKwljaGFyIGZsYWdzLHNyYzEsc3JjMixkc3Q7CisJdW5zaWduZWQgY2hhciBmbGF2b3I7CisJY2hhciAqbmFtZTsKKwlpbnQgbmFyZ3M7CisJaW50IGFyZ190eXBlWzJdOworCWludCBsZW5ndGg7CisJc3RydWN0IHsgdW5zaWduZWQgY2hhciBjb250ZW50czt1bnNpZ25lZCBjaGFyIG1hc2s7IGNoYXIgaW5zZXJ0OyB9IGJ5dGVzWzZdOworfSBoODUwMF9vcGNvZGVfaW5mbzsKK2g4NTAwX29wY29kZV9pbmZvIGg4NTAwX3RhYmxlW10KKyNpZmRlZiBBU1NFTUJMRVJfVEFCTEUKKyNpZmRlZiBERUZJTkVfVEFCTEUKKz17CisvKgorezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LAorCQkJCQkJCQkgICB7MHgwMCwweDAwLEFCUzE2IH0sCisJCQkJCQkJCSAgIHsweDAwLDB4MDAsIH0sCisJCQkJCQkJCSAgIHsweDA3LDB4ZmYsIH0sCisJCQkJCQkJCSAgIHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sKi8KKworezEsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX1dPUkQsInhvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LENSVyB9fX0sCit7MiwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fQllURSwieG9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjgsMHhmOCxDUkIgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKK3szLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKK3s0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKK3s1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAorezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKK3s1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKK3s1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NiwnLScsJ1gnLCchJywnIScsT19YQ0h8T19XT1JELCJ4Y2gudyIsMix7UlMsUkR9LDIsCXt7MHhhOCwweGY4LFJTIH0sezB4OTAsMHhmOCxSRCB9fX0sCit7NywnLScsJ1gnLCchJywnIScsT19YQ0h8T19VTlNaLCJ4Y2giLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAorezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAorezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKK3s5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAorezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTYsMHhmZiwgfX19LAorezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAorezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCit7MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCit7MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAorezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAorezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTYsMHhmZiwgfX19LAorezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAorezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAorezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMiwnLScsJ0knLCchJywnIScsT19UUkFQQXxPX1VOU1osInRyYXBhIiwxLHtJTU00LDB9LDIsCXt7MHgwOCwweGZmLCB9LHsweDEwLDB4ZjAsSU1NNCB9fX0sCit7MTMsJy0nLCdCJywnIScsJyEnLE9fVFJBUF9WU3xPX1VOU1osInRyYXAvdnMiLDAsezAsMH0sMSwJe3sweDA5LDB4ZmYsIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCit7MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAorezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCit7MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAorezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE3LDB4ZmYsIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAorezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCit7MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCit7MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKK3sxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAorezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCit7MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKK3sxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAorezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNywweGZmLCB9fX0sCit7MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNywweGZmLCB9fX0sCit7MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNywweGZmLCB9fX0sCit7MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAorezE2LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19CWVRFLCJzd2FwLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTAsMHhmZiwgfX19LAorezE3LCdtJywnRCcsJyEnLCdEJyxPX1NXQVB8T19VTlNaLCJzd2FwIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCit7MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCit7MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKK3syMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCit7MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3syMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCit7MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCit7MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKK3syMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKK3syMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKK3syMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKK3syMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKK3syMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKK3syMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKK3syNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKK3syOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCit7MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCit7MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCit7MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCit7MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSVyB9fX0sCit7MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAorezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKK3syOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAorezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk59LDIsCQl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3syOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3syOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3syOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3syOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3syOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAorezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAorezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3szMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAorezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKK3szMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCit7MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAorezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3szMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUlcgfX19LAorezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3szMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAorezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKK3szMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKK3szMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUlcgfX19LAorezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MzEsJy0nLCchJywnIScsJyEnLE9fU0xFRVB8T19VTlNaLCJzbGVlcCIsMCx7MCwwfSwxLAl7ezB4MWEsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKK3szMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCit7MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYiwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAorezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKK3szMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAorezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKK3szNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCit7MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKK3szNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCit7MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKK3szNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAorezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCit7MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKK3szNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKK3szNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKK3szNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKK3szNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKK3szNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKK3szNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCit7MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCit7MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYSwweGZmLCB9fX0sCit7MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCit7MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKK3szNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCit7MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKK3szNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAorezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCit7MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKK3szNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCit7MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKK3szOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKK3szOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCit7MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKK3s0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCit7NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKK3s0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCit7NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAorezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCit7NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKK3s0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAorezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCit7NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAorezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAorezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCit7NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCit7NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAorezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCit7NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCit7NDQsJy0nLCdCJywnUycsJ1MnLE9fU0NCX05FfE9fVU5TWiwic2NiL25lIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNiwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7NDUsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0Z8T19VTlNaLCJzY2IvZiIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDEsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezQ2LCctJywnQicsJ1MnLCdTJyxPX1NDQl9FUXxPX1VOU1osInNjYi9lcSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDcsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezQ3LCctJywnQicsJyEnLCchJyxPX1JUU3xPX1VOU1osInJ0cyIsMCx7MCwwfSwxLAl7ezB4MTksMHhmZiwgfX19LAorezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NOCwwfSwyLAl7ezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAorezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAorezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCit7NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAorezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAorezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAorezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZSwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAorezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAorezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCit7NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAorezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCit7NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAorezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAorezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAorezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCit7NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCit7NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAorezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCit7NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKK3s2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKK3s2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFjLDB4ZmYsIH19fSwKK3s2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCit7NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKK3s2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAorezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAorezYxLCctJywnQicsJyEnLCchJyxPX1BSVFN8T19VTlNaLCJwcnRzIiwwLHswLDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweDE5LDB4ZmYsIH19fSwKK3s2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s2MywnLScsJ0onLCchJywnIScsT19QSlNSfE9fVU5TWiwicGpzciIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzgsMHhmOCxSRElORCB9fX0sCit7NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKK3s2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCit7NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse0FCUzI0LDB9LDQsCXt7MHgxMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKK3s2NSwncycsJ0knLCdDJywnQycsT19PUkN8T19XT1JELCJvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCit7NjYsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fQllURSwib3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0OCwweGY4LENSQiB9fX0sCit7NjcsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fVU5TWiwib3JjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAorezY3LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1VOU1osIm9yYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCit7NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKK3s3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKK3s3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCit7NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCit7NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCit7NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAorezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAorezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCit7NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCit7NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCit7NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCit7NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCit7NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAorezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAorezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAorezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCit7NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCit7NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAorezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAorezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKK3s4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOLFJEfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOREVDLFJEfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0Q4LFJEfSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlM4LFJEfSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtBQlMxNixSRH0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6cy53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCit7ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAorezg3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpzIiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCit7ODgsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmwudyIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAorezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKK3s5MCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6bCIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAorezkxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmkiLCAgMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUse3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYse3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKKworezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3s5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3s5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3s5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezk2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezk2LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpmLnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezk3LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezk3LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpmLmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezk4LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpmIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKK3s5OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCit7OTksJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmUuYiIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEwMCwnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZSIsMix7SU1NOCxSRH0sMiwJe3sweDUwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCit7MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCit7MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCit7MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3sxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAxLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCisKK3sxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODAsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAorezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3sxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTAsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAorezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKK3sxMDIsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKK3sxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3sxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKK3sxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCit7MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCit7MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCisvKnsxMDMsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJEfSwyLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sKi8KK3sxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORH0sMywJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklOQ30sMywJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMywnbScsJ0knLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3sxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAorezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3sxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwNSwnLScsJ0UnLCchJywnQycsT19MRE18T19VTlNaLCJsZG0iLDIse1NQSU5DLFJMSVNUfSwyLAl7ezB4MDIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKK3sxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOLENSV30sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAorezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5JTkQsQ1JXfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5DLENSV30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCit7MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTkRFQyxDUld9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAorezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7QUJTOCxDUld9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0Q4LENSV30sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODgsMHhmOCxDUlcgfX19LAorezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCit7MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5EX0QxNixDUld9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOLENSQn0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAorezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5ERUMsQ1JCfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAorezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzgsQ1JCfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAorezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAorezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOLENSV30sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCit7MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklOQyxDUld9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAorezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5ERUMsQ1JXfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORCxDUld9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAorezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSV30sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlM4LENSQn0sMywJCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU04LENSQn0sMywJCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUld9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtBQlMxNixDUld9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKK3sxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORF9EMTYsQ1JXfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCit7MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDE2LENSQn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAorezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAorezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse0FCUzE2LDB9LDMsCXt7MHgxOCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKK3sxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKK3sxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkMCwweGY4LFJEIH19fSwKK3sxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAorezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCit7MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGYwLDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCit7MTExLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19CWVRFLCJleHR1LmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTIsMHhmZiwgfX19LAorezExMiwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fVU5TWiwiZXh0dSIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCit7MTEzLCdzJywnRCcsJyEnLCdEJyxPX0VYVFN8T19CWVRFLCJleHRzLmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAorezExNCwncycsJ0QnLCchJywnRCcsT19FWFRTfE9fVU5TWiwiZXh0cyIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCit7MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE5LCdzJywnRCcsJyEnLCchJyxPX0RBRER8T19VTlNaLCJkYWRkIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezEyMCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyMSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6aSIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LHt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjYsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmUiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOLFJEfSwyLAkJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjcsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTixSRH0sMiwJCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyOCwnYScsJ0QnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMiwJe3sweDQwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyOSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTgsUkR9LDIsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjksJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtBQlM4LFJEfSwzLAkJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk59LDQsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyOSwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCit7MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCit7MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCit7MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCit7MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCit7MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCit7MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCit7MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTMsMHhmZiwgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCit7MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAorezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAorezEzMywnLScsJ0InLCchJywnIScsT19CVlN8T19XT1JELCJidnMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezEzNSwnLScsJ0InLCchJywnIScsT19CVlN8T19VTlNaLCJidnMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTM1LCctJywnQicsJyEnLCchJyxPX0JWU3xPX1VOU1osImJ2cyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTM2LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1dPUkQsImJ2Yy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTM4LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1VOU1osImJ2YyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxMzgsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fVU5TWiwiYnZjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAorezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAorezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAorezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezE0MSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQyLCctJywnQicsJyEnLCchJyxPX0JUfE9fV09SRCwiYnQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTQzLCctJywnQicsJyEnLCchJyxPX0JUfE9fQllURSwiYnQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNDQsJy0nLCdCJywnIScsJyEnLE9fQlR8T19VTlNaLCJidCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTQ1LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1dPUkQsImJzci53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNDYsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fQllURSwiYnNyLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTQ3LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1VOU1osImJzciIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNDcsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fVU5TWiwiYnNyIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE1MCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTUxLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1dPUkQsImJybi53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTUzLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1VOU1osImJybiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNTMsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fVU5TWiwiYnJuIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNTQsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fV09SRCwiYnJhLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE1NSwnLScsJ0InLCchJywnIScsT19CUkF8T19CWVRFLCJicmEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNTYsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fVU5TWiwiYnJhIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE1NiwnLScsJ0InLCchJywnIScsT19CUkF8T19VTlNaLCJicmEiLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKK3sxNTgsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fV09SRCwiYnBsLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE1OSwnLScsJ0InLCchJywnIScsT19CUEx8T19CWVRFLCJicGwuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNjAsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fVU5TWiwiYnBsIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE2MCwnLScsJ0InLCchJywnIScsT19CUEx8T19VTlNaLCJicGwiLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAorezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAorezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAorezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAorezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAorezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAorezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAorezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAorezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAorezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAorezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAorezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAorezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3sxNjQsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fV09SRCwiYm5lLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNjYsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fVU5TWiwiYm5lIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE2NiwnLScsJ0InLCchJywnIScsT19CTkV8T19VTlNaLCJibmUiLDEse1BDUkVMMTYsMH0sMywJe3sweDM2LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE2NywnLScsJ0InLCchJywnIScsT19CTUl8T19XT1JELCJibWkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTY4LCctJywnQicsJyEnLCchJyxPX0JNSXxPX0JZVEUsImJtaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE2OSwnLScsJ0InLCchJywnIScsT19CTUl8T19VTlNaLCJibWkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTY5LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1VOU1osImJtaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTcwLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1dPUkQsImJsdC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNzEsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fQllURSwiYmx0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTcyLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1VOU1osImJsdCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNzIsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fVU5TWiwiYmx0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNzMsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fV09SRCwiYmxzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxNzUsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fVU5TWiwiYmxzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE3NSwnLScsJ0InLCchJywnIScsT19CTFN8T19VTlNaLCJibHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDMzLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE3NiwnLScsJ0InLCchJywnIScsT19CTE98T19XT1JELCJibG8udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTc3LCctJywnQicsJyEnLCchJyxPX0JMT3xPX0JZVEUsImJsby5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE3OCwnLScsJ0InLCchJywnIScsT19CTE98T19VTlNaLCJibG8iLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTc4LCctJywnQicsJyEnLCchJyxPX0JMT3xPX1VOU1osImJsbyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTc5LCctJywnQicsJyEnLCchJyxPX0JMRXxPX1dPUkQsImJsZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTgxLCctJywnQicsJyEnLCchJyxPX0JMRXxPX1VOU1osImJsZSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxODEsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fVU5TWiwiYmxlIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxODIsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fV09SRCwiYmhzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE4MywnLScsJ0InLCchJywnIScsT19CSFN8T19CWVRFLCJiaHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxODQsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fVU5TWiwiYmhzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE4NCwnLScsJ0InLCchJywnIScsT19CSFN8T19VTlNaLCJiaHMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE4NywnLScsJ0InLCchJywnIScsT19CSEl8T19VTlNaLCJiaGkiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTg3LCctJywnQicsJyEnLCchJyxPX0JISXxPX1VOU1osImJoaSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxODksJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fQllURSwiYmd0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTkwLCctJywnQicsJyEnLCchJyxPX0JHVHxPX1VOU1osImJndCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxOTAsJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fVU5TWiwiYmd0IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE5MiwnLScsJ0InLCchJywnIScsT19CR0V8T19CWVRFLCJiZ2UuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxOTMsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fVU5TWiwiYmdlIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE5MywnLScsJ0InLCchJywnIScsT19CR0V8T19VTlNaLCJiZ2UiLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE5NCwnLScsJ0InLCchJywnIScsT19CRnxPX1dPUkQsImJmLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE5NSwnLScsJ0InLCchJywnIScsT19CRnxPX0JZVEUsImJmLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTk2LCctJywnQicsJyEnLCchJyxPX0JGfE9fVU5TWiwiYmYiLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE5NywnLScsJ0InLCchJywnIScsT19CRVF8T19XT1JELCJiZXEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTk4LCctJywnQicsJyEnLCchJyxPX0JFUXxPX0JZVEUsImJlcS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE5OSwnLScsJ0InLCchJywnIScsT19CRVF8T19VTlNaLCJiZXEiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTk5LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1VOU1osImJlcSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MjAwLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1dPUkQsImJjcy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3syMDEsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fQllURSwiYmNzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MjAyLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1VOU1osImJjcyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3syMDIsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fVU5TWiwiYmNzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3syMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAorezIwNSwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjA2LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1dPUkQsImJjYy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3syMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MjA4LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1VOU1osImJjYyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3syMDgsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fVU5TWiwiYmNjIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3syMDksJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1dPUkQsImFuZGMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCit7MjEwLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19CWVRFLCJhbmRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCit7MjExLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19VTlNaLCJhbmRjIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAorezIxMSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fVU5TWiwiYW5kYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LENSVyB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKKzAsMCwwfQorI2VuZGlmCis7CisjZW5kaWYKKyNpZmRlZiBESVNBU1NFTUJMRVJfVEFCTEUKKyNpZmRlZiBERUZJTkVfVEFCTEUKKz17Cit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKK3s0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCit7MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKK3syNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKK3s0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCit7MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKK3syNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAorezYsJy0nLCdYJywnIScsJyEnLE9fWENIfE9fV09SRCwieGNoLnciLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAorezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAorezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAorezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKK3syNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCit7MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKK3syNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKK3syNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKK3sxNiwnbScsJ0QnLCchJywnRCcsT19TV0FQfE9fV09SRCwic3dhcC5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKK3syMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAorezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKK3syMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCit7MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKK3syMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAorezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezIsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX0JZVEUsInhvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDY4LDB4ZjgsQ1JCIH19fSwKK3sxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNiwweGZmLCB9fX0sCit7MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTcsMHhmZiwgfX19LAorezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKK3syMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKK3s0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKK3syOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3sxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKK3sxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCit7MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAorezEyLCctJywnSScsJyEnLCchJyxPX1RSQVBBfE9fVU5TWiwidHJhcGEiLDEse0lNTTQsMH0sMiwJe3sweDA4LDB4ZmYsIH0sezB4MTAsMHhmMCxJTU00IH19fSwKK3sxMywnLScsJ0InLCchJywnIScsT19UUkFQX1ZTfE9fVU5TWiwidHJhcC92cyIsMCx7MCwwfSwxLAl7ezB4MDksMHhmZiwgfX19LAorezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKK3sxLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19XT1JELCJ4b3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxDUlcgfX19LAorezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKK3s5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCit7MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDMwLDB4ZjgsUkQgfX19LAorezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAorezgsJy0nLCdCJywnIScsJyEnLE9fVU5MS3xPX1VOU1osInVubGsiLDEse0ZQLDB9LDEsCXt7MHgwZiwweGZmLCB9fX0sCit7MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKK3syMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCit7NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAorezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKK3syNywnLScsJ0knLCchJywnRScsT19TVE18T19VTlNaLCJzdG0iLDIse1JMSVNULFNQREVDfSwyLAl7ezB4MTIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKK3sxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCit7MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKK3sxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAorezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCit7MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAorezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKK3sxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCit7OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKK3szMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCit7MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKK3szNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWEsMHhmZiwgfX19LAorezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWIsMHhmZiwgfX19LAorezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKK3szNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKK3szNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCit7MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAorezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKK3szMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKK3szOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCit7MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKK3szOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCit7MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKK3szOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE5LDB4ZmYsIH19fSwKK3szOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKK3szMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKK3szOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCit7MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAorezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTksMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAorezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKK3szMSwnLScsJyEnLCchJywnIScsT19TTEVFUHxPX1VOU1osInNsZWVwIiwwLHswLDB9LDEsCXt7MHgxYSwweGZmLCB9fX0sCit7MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAorezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKK3s0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKK3s0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAorezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKK3s1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKK3s1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOCwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKK3s0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAorezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKK3s0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAorezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKK3s1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAorezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZiwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAorezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKK3s0NSwnLScsJ0InLCdTJywnUycsT19TQ0JfRnxPX1VOU1osInNjYi9mIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwMSwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWYsMHhmZiwgfX19LAorezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCit7NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCit7NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s0NCwnLScsJ0InLCdTJywnUycsT19TQ0JfTkV8T19VTlNaLCJzY2IvbmUiLDIse1JTLFBDUkVMOH0sMywJe3sweDA2LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3s0NiwnLScsJ0InLCdTJywnUycsT19TQ0JfRVF8T19VTlNaLCJzY2IvZXEiLDIse1JTLFBDUkVMOH0sMywJe3sweDA3LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3s0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOCwweGZmLCB9fX0sCit7NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKK3s0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAorezQ4LCctJywnQicsJyEnLCchJyxPX1JURHxPX1VOU1osInJ0ZCIsMSx7SU1NMTYsMH0sMywJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTgsMH0sMiwJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3s0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCit7NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCit7NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCit7NDcsJy0nLCdCJywnIScsJyEnLE9fUlRTfE9fVU5TWiwicnRzIiwwLHswLDB9LDEsCXt7MHgxOSwweGZmLCB9fX0sCit7NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAorezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAorezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAorezk5LCdtJywnSScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3s5NywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDgwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKK3s5NiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKK3s5NywnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDkwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKK3s5NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKK3s5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKK3s5MSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezg5LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpsLmIiLDIse0FCUzgsUkR9LDIsCXt7MHg2MCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKK3s4OCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6bC53IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCit7ODYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OnMuYiIsMix7UlMsQUJTOH0sMiwJe3sweDcwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAorezg1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpzLnciLDIse1JTLEFCUzh9LDIsCXt7MHg3OCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk4sUkR9LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5ERUMsUkR9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAorezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKK3s1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAorezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKK3s3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCit7NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKK3s3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCit7NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAorezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKK3s1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCit7NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAorezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAorezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCit7NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse0FCUzI0LDB9LDQsCXt7MHgwMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY2LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX0JZVEUsIm9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAorezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE0LDB4ZmYsIH19fSwKK3s1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFjLDB4ZmYsIH19fSwKK3s2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCit7NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKK3s3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNSwweGZmLCB9fX0sCit7NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAorezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKK3s5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezc0LCctJywnIScsJyEnLCchJyxPX05PUHxPX1VOU1osIm5vcCIsMCx7MCwwfSwxLAl7ezB4MDAsMHhmZiwgfX19LAorezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezY1LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1dPUkQsIm9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsQ1JXIH19fSwKK3s3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCit7NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAorezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDAsMHhmOCxSRCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAorezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKK3s1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFkLDB4ZmYsIH19fSwKK3s2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4YzAsMHhmOCxSRElORCB9fX0sCit7NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGM4LDB4ZjgsUkRJTkQgfX19LAorezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU04LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3s2MSwnLScsJ0InLCchJywnIScsT19QUlRTfE9fVU5TWiwicHJ0cyIsMCx7MCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHgxOSwweGZmLCB9fX0sCit7NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweDFjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3s2NCwnLScsJ0onLCchJywnIScsT19QSk1QfE9fVU5TWiwicGptcCIsMSx7QUJTMjQsMH0sNCwJe3sweDEzLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMyNCB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAorezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCit7NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKK3s3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGE4LDB4ZjgsUkQgfX19LAorezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKK3s1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKK3s5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkMsUkR9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAorezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDgsUkR9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0lNTTgsUkR9LDQsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzgsUkR9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAorezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZCwweGZmLCB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCit7OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKKworCit7OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKKworezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAorezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCisKK3s5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAorCisKK3s5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCisKKworezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAorCit7OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCit7OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCit7OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCit7OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKKworezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCisKKworezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKK3s5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKK3s4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTMTYsUkR9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCit7ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAorezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKKworezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCisKK3s5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKKworezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCit7NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAorezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKK3s5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCit7NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCit7NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKK3s1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCit7NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKK3s2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKK3s3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAorezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKK3s1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCit7MTI1LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk4sQ1JCfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMjAsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTksJ3MnLCdEJywnIScsJyEnLE9fREFERHxPX1VOU1osImRhZGQiLDIse1JTLFJEfSwzLAl7ezB4YTAsMHhmOCxSUyB9LHsweDAwLDB4ZmYsIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MTE1LCdzJywnRCcsJyEnLCchJyxPX0RTVUJ8T19VTlNaLCJkc3ViIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGIwLDB4ZjgsUkQgfX19LAorezExMywncycsJ0QnLCchJywnRCcsT19FWFRTfE9fQllURSwiZXh0cy5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKK3sxMTEsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX0JZVEUsImV4dHUuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMiwweGZmLCB9fX0sCit7MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EOCxDUkJ9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0QxNixDUkJ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTAsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAorezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQwLDB4ZjgsUkQgfX19LAorezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGQ4LDB4ZjgsUkQgfX19LAorezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGUwLDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCit7MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4ZTgsMHhmOCxSRElORF9EOCB9LHsweDAwLDB4MDAsIH19fSwKK3sxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjAsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKK3sxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORF9EMTYsMH0sNCwJe3sweDExLDB4ZmYsIH0sezB4ZjgsMHhmOCxSRElORF9EMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKK3sxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTgsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAorezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAorezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKK3sxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKK3sxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCit7MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlM4LENSQn0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAorezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTA1LCctJywnRScsJyEnLCdDJyxPX0xETXxPX1VOU1osImxkbSIsMix7U1BJTkMsUkxJU1R9LDIsCXt7MHgwMiwweGZmLCB9LHsweDAwLDB4MDAsUkxJU1QgfX19LAorezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCit7MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAorezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAorezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAorezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCit7MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKK3sxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTE2fSwzLAl7ezB4MWYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAorezEwNCwnLScsJ1MnLCdJJywnIScsT19MSU5LfE9fVU5TWiwibGluayIsMix7RlAsSU1NOH0sMiwJe3sweDE3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKK3sxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCit7MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxMywweGZmLCB9fX0sCit7MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCit7MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAorezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAorezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAorezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAorezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAorezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKK3sxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAorezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAorezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAorezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCit7MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCit7MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCit7MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKK3sxMzcsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fQllURSwiYnZjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTM0LCctJywnQicsJyEnLCchJyxPX0JWU3xPX0JZVEUsImJ2cy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezEzNiwnLScsJ0InLCchJywnIScsT19CVkN8T19XT1JELCJidmMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTMzLCctJywnQicsJyEnLCchJyxPX0JWU3xPX1dPUkQsImJ2cy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKK3sxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAorezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCit7MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAorezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YzAsMHhmMCxJTU00IH19fSwKK3sxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ2LCctJywnQicsJyEnLCchJyxPX0JTUnxPX0JZVEUsImJzci5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAorezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCit7MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCit7MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKK3sxNDUsJy0nLCdCJywnIScsJyEnLE9fQlNSfE9fV09SRCwiYnNyLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDFlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3syMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3sxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAorezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAorezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3syMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAorezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAorezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAorezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKK3syMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAorezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3sxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAorezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3sxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3syMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAorezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhlMCwweGYwLElNTTQgfX19LAorezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1OCwweGY4LFJTIH19fSwKK3syMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKK3sxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAorezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAorezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKK3sxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAorezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCit7MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAorezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAorezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMTAsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX0JZVEUsImFuZGMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKK3syMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3sxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAorezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKK3syMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAorezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAorezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCit7MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjA5LCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19XT1JELCJhbmRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxDUlcgfX19LAorezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKK3syMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKK3syMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezE1NywnLScsJyEnLCchJywnIScsT19CUFR8T19VTlNaLCJicHQiLDAsezAsMH0sMSwJe3sweDBiLDB4ZmYsIH19fSwKK3syMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhkMCwweGYwLElNTTQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCit7MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAorezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKK3syMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCit7MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCit7MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKK3syMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKK3syMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKK3syMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAorezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAorezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCit7MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKK3sxNTUsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fQllURSwiYnJhLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCit7MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCit7MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAorezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCit7MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKK3sxNTIsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fQllURSwiYnJuLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTg2LCctJywnQicsJyEnLCchJyxPX0JISXxPX0JZVEUsImJoaS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE3NCwnLScsJ0InLCchJywnIScsT19CTFN8T19CWVRFLCJibHMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3syMDcsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fQllURSwiYmNjLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MjAxLCctJywnQicsJyEnLCchJyxPX0JDU3xPX0JZVEUsImJjcy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE2NSwnLScsJ0InLCchJywnIScsT19CTkV8T19CWVRFLCJibmUuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxOTgsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fQllURSwiYmVxLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjcsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTU5LCctJywnQicsJyEnLCchJyxPX0JQTHxPX0JZVEUsImJwbC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE2OCwnLScsJ0InLCchJywnIScsT19CTUl8T19CWVRFLCJibWkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxOTIsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fQllURSwiYmdlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTcxLCctJywnQicsJyEnLCchJyxPX0JMVHxPX0JZVEUsImJsdC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAorezE4OSwnLScsJ0InLCchJywnIScsT19CR1R8T19CWVRFLCJiZ3QuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKK3sxODAsJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fQllURSwiYmxlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCit7MTU0LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1dPUkQsImJyYS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNTEsJy0nLCdCJywnIScsJyEnLE9fQlJOfE9fV09SRCwiYnJuLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE4NSwnLScsJ0InLCchJywnIScsT19CSEl8T19XT1JELCJiaGkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTczLCctJywnQicsJyEnLCchJyxPX0JMU3xPX1dPUkQsImJscy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3syMDYsJy0nLCdCJywnIScsJyEnLE9fQkNDfE9fV09SRCwiYmNjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezIwMCwnLScsJ0InLCchJywnIScsT19CQ1N8T19XT1JELCJiY3MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTY0LCctJywnQicsJyEnLCchJyxPX0JORXxPX1dPUkQsImJuZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxOTcsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fV09SRCwiYmVxLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE1OCwnLScsJ0InLCchJywnIScsT19CUEx8T19XT1JELCJicGwudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2EsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTY3LCctJywnQicsJyEnLCchJyxPX0JNSXxPX1dPUkQsImJtaS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxOTEsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fV09SRCwiYmdlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorezE3MCwnLScsJ0InLCchJywnIScsT19CTFR8T19XT1JELCJibHQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2QsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCit7MTg4LCctJywnQicsJyEnLCchJyxPX0JHVHxPX1dPUkQsImJndC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKK3sxNzksJy0nLCdCJywnIScsJyEnLE9fQkxFfE9fV09SRCwiYmxlLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAorLyogCitSTixSRCAgJ20nLCdFJywnRCcsJ0QnCitDUkIsUk4gICdzJywnQycsJyEnLCdFJworUk4sUkQgICdtJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJworQ1JCLFJOREVDICAncycsJ0MnLCchJywnRScKK1JOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKK1JOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKK0NSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCitSTklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCitDUkIsUk5JTkQgICdzJywnQycsJyEnLCdFJworUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJworQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKK1JOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJworQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCitSTklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJworUk4sUkQgICdtJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitJTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJworUk4sUkQgICdhJywnRScsJ0QnLCdEJworUlMsUkQgICctJywnWCcsJyEnLCchJworUk4sMCAgJ2EnLCdFJywnIScsJyEnCitSUyxSRCAgJy0nLCdYJywnIScsJyEnCitSTiwwICAnYScsJ0UnLCchJywnIScKK1JOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOREVDLDAgICdhJywnRScsJyEnLCchJworUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJworUk5ERUMsMCAgJ2EnLCdFJywnIScsJyEnCitSTklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklOQywwICAnYScsJ0UnLCchJywnIScKK1JOSU5DLDAgICdhJywnRScsJyEnLCchJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsMCAgJ2EnLCdFJywnIScsJyEnCitSTklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORCwwICAnYScsJ0UnLCchJywnIScKK1JOSU5EX0Q4LDAgICdhJywnRScsJyEnLCchJworUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCitSTklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworUk4sMCAgJ2EnLCdFJywnIScsJyEnCitSTklORCwwICAnYScsJ0UnLCchJywnIScKK1JOREVDLDAgICdhJywnRScsJyEnLCchJworUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCitBQlM4LDAgICdhJywnRScsJyEnLCchJworUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJyEnCitSRCwwICAnbScsJ0QnLCchJywnRCcKK0FCUzE2LDAgICdhJywnRScsJyEnLCchJworUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCchJworUk4sMCAgJ3MnLCdFJywnIScsJ0UnCitSTixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTkRFQywwICAncycsJ0UnLCchJywnRScKK1JOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5DLDAgICdzJywnRScsJyEnLCdFJworUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJworUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCitSTklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCwwICAncycsJ0UnLCchJywnRScKK1JOLDAgICdzJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ3MnLCdFJywnIScsJ0UnCitSTklOQywwICAncycsJ0UnLCchJywnRScKK1JOREVDLDAgICdzJywnRScsJyEnLCdFJworSU1NOCwwICAncycsJ0UnLCchJywnRScKK0FCUzgsMCAgJ3MnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAncycsJ0UnLCchJywnRScKK0FCUzE2LDAgICdzJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJworUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJworUkQsMCAgJ20nLCdEJywnIScsJ0QnCitSTklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LDAgICdzJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2EnLCdFJywnIScsJyEnCitSTixSRCAgJy0nLCdFJywnRCcsJ0QnCitSTixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTixSRCAgJy0nLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKK1JOLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsMCAgJ2EnLCdFJywnIScsJyEnCitJTU04LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTgsUkQgICctJywnRScsJ0QnLCdEJworSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitJTU04LENSQiAgJ3MnLCdFJywnQycsJ0MnCitJTU04LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTgsMCAgJ2EnLCdFJywnIScsJyEnCitJTU04LDAgICdzJywnRScsJyEnLCdFJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICdtJywnRScsJ0QnLCdEJworQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlM4LDAgICdhJywnRScsJyEnLCchJworQUJTOCwwICAncycsJ0UnLCchJywnRScKK1JOLFJEICAnLScsJ0UnLCdEJywnRCcKK1JOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICctJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKK0lNTTQsMCAgJy0nLCdJJywnIScsJyEnCiswLDAgICctJywnQicsJyEnLCchJworSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJworSU1NMTYsQ1JXICAncycsJ0UnLCdDJywnQycKK0lNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTE2LDAgICdhJywnRScsJyEnLCchJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICdtJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlM4LDAgICdhJywnRScsJyEnLCchJworRlAsMCAgJy0nLCdCJywnIScsJyEnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCitDUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJworUk4sUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitJTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworUkxJU1QsU1BERUMgICctJywnSScsJyEnLCdFJworQ1JXLFJOICAncycsJ0MnLCchJywnRScKK0NSVyxSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCitDUlcsUk5JTkMgICdzJywnQycsJyEnLCdFJworQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKK0NSVyxBQlM4ICAncycsJ0MnLCchJywnRScKK0NSVyxSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCitDUlcsQUJTMTYgICdzJywnQycsJyEnLCdFJworQ1JXLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlMxNiwwICAnYScsJ0UnLCchJywnIScKK0FCUzE2LDAgICdzJywnRScsJyEnLCdFJworQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJworQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCitDUlcsUk4gICdzJywnQycsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitDUkIsUk5ERUMgICdzJywnQycsJyEnLCdFJworQ1JXLFJOSU5EICAncycsJ0MnLCchJywnRScKK0NSVyxSTklOQyAgJ3MnLCdDJywnIScsJ0UnCitDUlcsUk5ERUMgICdzJywnQycsJyEnLCdFJworQ1JCLFJOSU5EICAncycsJ0MnLCchJywnRScKK0NSQixSTklOQyAgJ3MnLCdDJywnIScsJ0UnCitDUlcsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJworQ1JCLEFCUzggICdzJywnQycsJyEnLCdFJworQ1JCLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKK0NSVyxBQlM4ICAncycsJ0MnLCchJywnRScKK0NSVyxSTklORF9EMTYgICdzJywnQycsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitDUkIsQUJTMTYgICdzJywnQycsJyEnLCdFJworQ1JCLFJOSU5EX0QxNiAgJ3MnLCdDJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworQ1JXLEFCUzE2ICAncycsJ0MnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitDUkIsUk4gICdzJywnQycsJyEnLCdFJworUk4sMCAgJ2gnLCdFJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK1JOSU5ELDAgICdoJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5ELDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK0lNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU04LDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK0lNTTE2LDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5ELDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworSU1NOCwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU0xNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCiswLDAgICctJywnIScsJyEnLCchJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk4sMCAgJ2gnLCdFJywnIScsJ0UnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJworSU1NOCwwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU0xNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworUk4sMCAgJ2gnLCdFJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk4sMCAgJ2gnLCdFJywnIScsJ0UnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5ELDAgICdoJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJworSU1NOCwwICAnaCcsJ0UnLCchJywnRScKK0lNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK0lNTTE2LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK1JTLFBDUkVMOCAgJy0nLCdCJywnUycsJ1MnCitSUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU0xNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworQUJTOCwwICAnaCcsJ0UnLCchJywnRScKK0lNTTE2LDAgICctJywnQicsJyEnLCchJworSU1NOCwwICAnLScsJ0InLCchJywnIScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKKzAsMCAgJy0nLCdCJywnIScsJyEnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5ELDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU04LFJEICAnbScsJ0knLCchJywnRCcKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitGUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCitGUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCitSUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCitSTixSRCAgJ20nLCdFJywnIScsJ0QnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JTLFJOREVDICAnbScsJ1MnLCchJywnRScKK1JOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsUkQgICdtJywnSScsJyEnLCdEJworQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCitBQlM4LFJEICAnbScsJ0UnLCchJywnRCcKK1JTLEFCUzggICdtJywnUycsJyEnLCdFJworUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCitSTixSRCAgJy0nLCdFJywnIScsJ0QnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOLFJEICAnbScsJ0UnLCchJywnRCcKK1JOREVDLFJEICAnbScsJ0UnLCchJywnRCcKK1JOREVDLFJEICAnLScsJ0UnLCchJywnRCcKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitSUyxSTiAgJy0nLCdTJywnIScsJ0UnCitSTiwwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk4sUkQgICdtJywnRScsJ0QnLCdEJworUk4sUkQgICdwJywnRScsJ0QnLCdEJworUk4sMCAgJ2EnLCdFJywnIScsJ0UnCitSTiwwICAnbScsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk4sUkQgICdtJywnRScsJ0QnLCdEJworUk4sUkQgICdwJywnRScsJ0QnLCdEJworUk4sMCAgJ2EnLCdFJywnIScsJ0UnCitSTiwwICAnbScsJ0UnLCchJywnRScKK1JOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKK1JTLFJOREVDICAnLScsJ1MnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCitSTklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK1JOLDAgICdoJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5DLDAgICdoJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK1JOREVDLDAgICdhJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ20nLCdFJywnIScsJ0UnCitSTkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTkRFQywwICAnbScsJ0UnLCchJywnRScKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCitSTklOQywwICAnbScsJ0UnLCchJywnRScKK1JOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKK1JOSU5DLDAgICdhJywnRScsJyEnLCdFJworSU1NOCxDUkIgICdzJywnSScsJ0MnLCdDJworSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKK1JOSU5DLDAgICdtJywnRScsJyEnLCdFJworUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORCwwICAnYScsJ0UnLCchJywnRScKK1JOSU5ELDAgICdtJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORCwwICAnYScsJ0UnLCchJywnRScKK1JOSU5ELDAgICdtJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORF9EOCwwICAnYScsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORF9EOCwwICAnYScsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCitJTU0xNixSRCAgJ20nLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzI0LDAgICctJywnSicsJyEnLCchJworSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitJTU04LENSQiAgJ3MnLCdJJywnQycsJ0MnCitJTU04LDAgICdhJywnRScsJyEnLCdFJworSU1NOCwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsUkQgICdtJywnRScsJ0QnLCdEJworUk4sUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKK1JOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK0lNTTgsMCAgJ20nLCdFJywnIScsJ0UnCitBQlM4LDAgICdhJywnRScsJyEnLCdFJworQUJTOCwwICAnbScsJ0UnLCchJywnRScKK1JOLDAgICdtJywnRScsJyEnLCdFJworUk5JTkQsMCAgJ20nLCdFJywnIScsJ0UnCitSTkRFQywwICAnbScsJ0UnLCchJywnRScKK1JOSU5DLDAgICdtJywnRScsJyEnLCdFJworQUJTOCwwICAnbScsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdtJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCitJTU0xNiwwICAnbScsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnbScsJ0UnLCchJywnRScKK0lNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKKzAsMCAgJy0nLCchJywnIScsJyEnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJworSU1NMTYsQ1JXICAncycsJ0knLCdDJywnQycKK0lNTTE2LDAgICdhJywnRScsJyEnLCdFJworSU1NMTYsMCAgJ20nLCdFJywnIScsJ0UnCitJTU0xNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsUkQgICdtJywnRScsJ0QnLCdEJworQUJTOCwwICAnYScsJ0UnLCchJywnRScKK0FCUzgsMCAgJ20nLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworUkRJTkQsMCAgJy0nLCdKJywnIScsJyEnCitSRElORCwwICAnLScsJ0onLCchJywnIScKK0lNTTgsMCAgJy0nLCdCJywnIScsJyEnCiswLDAgICctJywnQicsJyEnLCchJworSU1NMTYsMCAgJy0nLCdCJywnIScsJyEnCitBQlMyNCwwICAnLScsJ0onLCchJywnIScKK0FCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKK1JOLDAgICdhJywnRScsJyEnLCdFJworUk5ERUMsMCAgJ2EnLCdFJywnIScsJ0UnCitSTklOQywwICAnYScsJ0UnLCchJywnRScKK1JOSU5ELDAgICdhJywnRScsJyEnLCdFJworQUJTOCwwICAnYScsJ0UnLCchJywnRScKK1JOSU5EX0Q4LDAgICdhJywnRScsJyEnLCdFJworQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCitJTU0xNiwwICAnYScsJ0UnLCchJywnRScKK1JOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnRScKK1JOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKK1JOREVDLDAgICdoJywnRScsJyEnLCdFJworUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKK0lNTTgsUkQgICdwJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCitJTU0xNixSRCAgJ3AnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKK0FCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCitSUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCitBQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCitSTixSRCAgJ3AnLCdFJywnRCcsJ0QnCitSTklORCxSRCAgJ3AnLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAncCcsJ0UnLCdEJywnRCcKK0lNTTE2LFJEICAncCcsJ0UnLCdEJywnRCcKK0FCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCitSUyxSTklOQyAgJy0nLCdTJywnIScsJ0UnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK1JTLFJOSU5EICAnLScsJ1MnLCchJywnRScKK1JOSU5ELDAgICdoJywnRScsJyEnLCdFJworUlMsUk5JTkRfRDggICctJywnUycsJyEnLCdFJworUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKK1JTLFJOSU5EX0QxNiAgJy0nLCdTJywnIScsJ0UnCitSUyxBQlM4ICAnLScsJ1MnLCchJywnRScKK1JTLFJOICAnLScsJ1MnLCchJywnRScKK1JTLFJOREVDICAnLScsJ1MnLCchJywnRScKK1JTLFJOSU5EICAnLScsJ1MnLCchJywnRScKK1JTLFJOSU5DICAnLScsJ1MnLCchJywnRScKK1JTLEFCUzggICctJywnUycsJyEnLCdFJworUk5JTkQsUkQgICctJywnRScsJyEnLCdEJworUlMsQUJTMTYgICctJywnUycsJyEnLCdFJworUlMsUk5JTkRfRDE2ICAnLScsJ1MnLCchJywnRScKK1JOSU5DLFJEICAnLScsJ0UnLCchJywnRCcKK1JOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EX0Q4ICAnLScsJ1MnLCchJywnRScKK1JOSU5EX0Q4LFJEICAnLScsJ0UnLCchJywnRCcKK0lNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJworUk5JTkRfRDE2LFJEICAnLScsJ0UnLCchJywnRCcKK0lNTTgsUkQgICctJywnRScsJyEnLCdEJworQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCitSTixSRCAgJy0nLCdFJywnIScsJ0QnCitSTklOQywwICAnaCcsJ0UnLCchJywnRScKK1JOSU5ELFJEICAnLScsJ0UnLCchJywnRCcKK1JOREVDLFJEICAnLScsJ0UnLCchJywnRCcKK0lNTTgsUkQgICctJywnRScsJyEnLCdEJworQUJTOCxSRCAgJy0nLCdFJywnIScsJ0QnCitSTklORF9EOCxSRCAgJy0nLCdFJywnIScsJ0QnCitBQlMxNixSRCAgJy0nLCdFJywnIScsJ0QnCitSTklORF9EMTYsUkQgICctJywnRScsJyEnLCdEJworUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCitSTklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKK1JTLEFCUzggICdtJywnUycsJyEnLCdFJworUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJworUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJworQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSTkRFQywwICAnaCcsJ0UnLCchJywnRScKK0lNTTE2LFJEICAnbScsJ0knLCchJywnRCcKK1JTLFJOREVDICAnbScsJ1MnLCchJywnRScKK1JTLFJOSU5DICAnbScsJ1MnLCchJywnRScKK1JOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EICAnbScsJ1MnLCchJywnRScKK1JOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKK0lNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCitBQlM4LDAgICdoJywnRScsJyEnLCdFJworUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCitSTklOQyxSRCAgJy0nLCdFJywnIScsJ0QnCitJTU04LFJOREVDICAnbScsJ0knLCchJywnRScKK0lNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKK1JOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5DICAnbScsJ1MnLCchJywnRScKK0lNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJworUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJworUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJworSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixSTklORCAgJ20nLCdJJywnIScsJ0UnCitSTklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCitJTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJworUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU04LFJEICAnbScsJ0UnLCchJywnRCcKK0FCUzgsUkQgICdtJywnRScsJyEnLCdEJworUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCitJTU04LEFCUzggICdtJywnSScsJyEnLCdFJworSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCitJTU0xNiwwICAnaCcsJ0UnLCchJywnRScKK0FCUzgsUkQgICdtJywnRScsJyEnLCdEJworQUJTMTYsUkQgICctJywnRScsJyEnLCdEJworUlMsQUJTMTYgICctJywnUycsJyEnLCdFJworSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCitBQlMxNiwwICAnYScsJ0UnLCchJywnRScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJworUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJworQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJworQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCitBQlMxNiwwICAnaCcsJ0UnLCchJywnRScKK1JTLFJOSU5DICAnbScsJ1MnLCchJywnRScKK1JOLFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EICAnbScsJ1MnLCchJywnRScKK1JOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOREVDICAnbScsJ1MnLCchJywnRScKK1JOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKK1JOREVDLFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKK1JTLEFCUzggICdtJywnUycsJyEnLCdFJworUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJworSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCitBQlM4LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJworSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCitJTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKK0lNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCitSUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJworSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJworSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJworUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJworUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKK0FCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKK0lNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJworSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCitJTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJworQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCitBQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCitBQlMxNiwwICAnbScsJ0UnLCchJywnRScKK0FCUzE2LDAgICdoJywnRScsJyEnLCdFJworUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJworRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJworQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCitJTU04LFJEICAnbScsJ0knLCchJywnRCcKK1JTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKK1JTLEFCUzggICdtJywnUycsJyEnLCdFJworQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCitSUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCitSUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCitSTklORCxSRCAgJ20nLCdFJywnIScsJ0QnCitGUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSTklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCitSTixSRCAgJ20nLCdFJywnIScsJ0QnCitSTkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxBQlM4ICAnbScsJ1MnLCchJywnRScKK1JOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKK0lNTTE2LFJEICAnbScsJ0knLCchJywnRCcKK0FCUzgsUkQgICdtJywnRScsJyEnLCdEJworSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJworUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKK1JTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKK0FCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKK1JOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCitJTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKK0lNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCitGUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxBQlM4ICAnbScsJ1MnLCchJywnRScKK1JOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EICAnbScsJ1MnLCchJywnRScKK1JTLFJOSU5DICAnbScsJ1MnLCchJywnRScKK1JTLFJOREVDICAnbScsJ1MnLCchJywnRScKK1JOREVDLFJEICAnbScsJ0UnLCchJywnRCcKK1JTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKK1JOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKK1JOLFJEICAnbScsJ0UnLCchJywnRCcKK0FCUzgsUkQgICdtJywnRScsJyEnLCdEJworSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCitJTU04LFJEICAnbScsJ0UnLCchJywnRCcKK1JTLEFCUzggICdtJywnUycsJyEnLCdFJworSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCitJTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKK0lNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJworUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJworQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCitJTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKK0FCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCitSUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCitSUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJworUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJworSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJworQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCitSUyxBQlM4ICAnbScsJ1MnLCchJywnRScKK1JOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKK1JTLFJOSU5EICAnbScsJ1MnLCchJywnRScKK1JTLFJOSU5DICAnbScsJ1MnLCchJywnRScKK1JTLFJOREVDICAnbScsJ1MnLCchJywnRScKK1JOLFJEICAnbScsJ0UnLCchJywnRCcKK1JTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKK1JOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKK0ZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTgsUkQgICdtJywnSScsJyEnLCdEJworUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJworUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJworSU1NOCxSTklORCAgJ20nLCdJJywnIScsJ0UnCitJTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKK0lNTTgsUk5ERUMgICdtJywnSScsJyEnLCdFJworUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJworUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCitBQlM4LFJEICAnbScsJ0UnLCchJywnRCcKK0lNTTE2LFJEICAnbScsJ0knLCchJywnRCcKK0lNTTgsQUJTOCAgJ20nLCdJJywnIScsJ0UnCitSUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJworSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5JTkMgICdtJywnSScsJyEnLCdFJworSU1NMTYsUk5ERUMgICdtJywnSScsJyEnLCdFJworUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJworSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJworSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCitSTklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJworQUJTMTYsUkQgICdtJywnRScsJyEnLCdEJworSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJworSU1NOCxBQlMxNiAgJ20nLCdJJywnIScsJ0UnCitJTU0xNixBQlM4ICAnbScsJ0knLCchJywnRScKK0lNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKK0lNTTE2LEFCUzE2ICAnbScsJ0knLCchJywnRScKK0lNTTE2LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCitJTU04LFJEICAnYScsJ0QnLCdJJywnIScKK1JOLFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsUk4gICdhJywnRScsJ0knLCchJworUk4sQ1JXICAncycsJ0UnLCchJywnQycKK1JOSU5ELENSVyAgJ3MnLCdFJywnIScsJ0MnCitSTklOQyxDUlcgICdzJywnRScsJyEnLCdDJworUk5ERUMsQ1JXICAncycsJ0UnLCchJywnQycKK1JOLFJEICAnYScsJ0QnLCdFJywnIScKK1JOSU5EX0Q4LENSVyAgJ3MnLCdFJywnIScsJ0MnCitJTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCitBQlMxNixDUlcgICdzJywnRScsJyEnLCdDJworUk5JTkRfRDE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCitSTixDUkIgICdzJywnRScsJyEnLCdDJworQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJworSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJworUk4sUkQgICdzJywnRScsJ0QnLCdEJworUlMsUkQgICdzJywnRCcsJyEnLCchJworUlMsUkQgICdzJywnRCcsJyEnLCchJworUkQsMCAgJ3MnLCdEJywnIScsJ0QnCitSRCwwICAncycsJ0QnLCchJywnRCcKK1JOLFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCitSTixDUkIgICdzJywnRScsJyEnLCdDJworUk5JTkMsQ1JXICAncycsJ0UnLCchJywnQycKK1JOSU5ELENSQiAgJ3MnLCdFJywnIScsJ0MnCitSTkRFQyxDUlcgICdzJywnRScsJyEnLCdDJworUk5JTkQsQ1JXICAncycsJ0UnLCchJywnQycKK1JOREVDLENSQiAgJ3MnLCdFJywnIScsJ0MnCitSTklOQyxDUkIgICdzJywnRScsJyEnLCdDJworQUJTOCxDUlcgICdzJywnRScsJyEnLCdDJworQUJTOCxDUkIgICdzJywnRScsJyEnLCdDJworSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJworUk5JTkRfRDgsQ1JXICAncycsJ0UnLCchJywnQycKK1JOSU5EX0Q4LENSQiAgJ3MnLCdFJywnIScsJ0MnCitBQlMxNixDUkIgICdzJywnRScsJyEnLCdDJworQUJTMTYsQ1JXICAncycsJ0UnLCchJywnQycKK0lNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCitSTklORF9EMTYsQ1JXICAncycsJ0UnLCchJywnQycKK1JOSU5EX0QxNixDUkIgICdzJywnRScsJyEnLCdDJworUk5JTkRfRDE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCitBQlMxNiwwICAnLScsJ0InLCchJywnIScKK1JESU5ELDAgICctJywnQicsJyEnLCchJworUkRJTkQsMCAgJy0nLCdCJywnIScsJyEnCitSRElORF9EOCwwICAnLScsJ0InLCchJywnIScKK1JESU5EX0Q4LDAgICctJywnQicsJyEnLCchJworUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJworUkRJTkRfRDE2LDAgICctJywnQicsJyEnLCchJworQUJTMTYsMCAgJy0nLCdCJywnIScsJyEnCitSRCwwICAncycsJ0QnLCchJywnRCcKK0FCUzE2LENSQiAgJ3MnLCdFJywnIScsJ0MnCitSRCwwICAncycsJ0QnLCchJywnRCcKK1JOLENSVyAgJ3MnLCdFJywnIScsJ0MnCitSTkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCitSTklOQyxDUkIgICdzJywnRScsJyEnLCdDJworUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdzJywnRScsJ0QnLCdEJworUk5JTkQsQ1JCICAncycsJ0UnLCchJywnQycKK1JOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJworSU1NOCxDUkIgICdzJywnRScsJyEnLCdDJworSU1NOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAncycsJ0UnLCdEJywnRCcKK0lNTTE2LFJEICAncycsJ0UnLCdEJywnRCcKK0FCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKK0FCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKK1JOLFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5DLFJEICAncycsJ0UnLCdEJywnRCcKK1JOREVDLFJEICAncycsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAncycsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICdzJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdzJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdzJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICdzJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKK0FCUzgsQ1JCICAncycsJ0UnLCchJywnQycKK0FCUzgsUkQgICdzJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJworUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJworUk5ERUMsQ1JCICAncycsJ0UnLCchJywnQycKK0lNTTgsUk5ERUMgICdhJywnRScsJ0knLCchJworSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJworUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJworUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJworSU1NOCxSTklOQyAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCitSTklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCitSTklORCxSRCAgJ2EnLCdEJywnRScsJyEnCitJTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKK1JOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKK1JOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJworSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJworUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJworUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCitSTklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJworU1BJTkMsUkxJU1QgICctJywnRScsJyEnLCdDJworSU1NOCxSRCAgJ2EnLCdEJywnRScsJyEnCitBQlM4LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsQUJTOCAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCitBQlM4LFJEICAnYScsJ0QnLCdFJywnIScKK0FCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJworSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJworQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJworRlAsSU1NMTYgICctJywnUycsJ0knLCchJworUk4sUkQgICdhJywnRCcsJ0UnLCchJworUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJworUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJworUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJworUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJworQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCitJTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCitBQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCitSTklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJworSU1NMTYsUk5JTkRfRDggICdhJywnRScsJ0knLCchJworSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCitJTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJworSU1NMTYsQUJTMTYgICdhJywnRScsJ0knLCchJworRlAsSU1NOCAgJy0nLCdTJywnSScsJyEnCitJTU04LFJEICAnYScsJ0QnLCdJJywnIScKK1JOLFJEICAnYScsJ0QnLCdFJywnIScKK1JOREVDLFJEICAnYScsJ0QnLCdFJywnIScKK1JOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKK1JOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKK1JOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKK0FCUzgsUkQgICdhJywnRCcsJ0UnLCchJworSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJworSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJworSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJworUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKK0FCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LEFCUzggICdhJywnRScsJ0knLCchJworSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKK1JOLFJEICAnYScsJ0QnLCdFJywnIScKK1JOREVDLFJEICAnYScsJ0QnLCdFJywnIScKK1JOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsUkQgICdhJywnRCcsJ0knLCchJworUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJworSU1NOCxSTiAgJ2EnLCdFJywnSScsJyEnCitJTU04LFJOSU5EICAnYScsJ0UnLCdJJywnIScKK0lNTTgsUk5JTkMgICdhJywnRScsJ0knLCchJworSU1NOCxSTkRFQyAgJ2EnLCdFJywnSScsJyEnCitBQlM4LFJEICAnYScsJ0QnLCdFJywnIScKK1JOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsUkQgICdhJywnRCcsJ0UnLCchJworSU1NOCxBQlM4ICAnYScsJ0UnLCdJJywnIScKK0FCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsUk5JTkRfRDggICdhJywnRScsJ0knLCchJworUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTgsQUJTMTYgICdhJywnRScsJ0knLCchJworSU1NOCxSTklORF9EMTYgICdhJywnRScsJ0knLCchJworUk4sUkQgICdhJywnRCcsJ0UnLCchJworSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCitSTklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCitSTklORCxSRCAgJ2EnLCdEJywnRScsJyEnCitSTkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCitJTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCitSTklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCitBQlM4LFJEICAnYScsJ0QnLCdFJywnIScKK0lNTTE2LFJOICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKK1JOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCitJTU0xNixSTklOQyAgJ2EnLCdFJywnSScsJyEnCitBQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCitJTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCitJTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKK0lNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCitJTU00LFJOICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk4gICdiJywnRScsJ0knLCdFJworUlMsUk4gICdiJywnRScsJ1MnLCdFJworUlMsUk4gICdiJywnRScsJ1MnLCdFJworUk4sMCAgJ2MnLCchJywnIScsJ0UnCitJTU00LFJOICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk4gICdiJywnRScsJ0knLCdFJworUk5ERUMsMCAgJ2MnLCchJywnIScsJ0UnCitSTklOQywwICAnYycsJyEnLCchJywnRScKK1JOSU5ELDAgICdjJywnIScsJyEnLCdFJworUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJworUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCitJTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJworUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJworUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJworSU1NOCwwICAnYycsJyEnLCchJywnRScKK0FCUzgsMCAgJ2MnLCchJywnIScsJ0UnCitSTiwwICAnYycsJyEnLCchJywnRScKK1JOSU5ELDAgICdjJywnIScsJyEnLCdFJworUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCitSTkRFQywwICAnYycsJyEnLCchJywnRScKK0FCUzgsMCAgJ2MnLCchJywnIScsJ0UnCitSTklORF9EOCwwICAnYycsJyEnLCchJywnRScKK0lNTTE2LDAgICdjJywnIScsJyEnLCdFJworQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCitSTklORF9EMTYsMCAgJ2MnLCchJywnIScsJ0UnCitJTU00LEFCUzggICdiJywnRScsJ0knLCdFJworUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUlMsUk4gICdiJywnRScsJ1MnLCdFJworSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCitSUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCitSTkRFQywwICAnYycsJyEnLCchJywnRScKK0lNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJworUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJworSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKK1JOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJworSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJworUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKK0lNTTE2LDAgICdjJywnIScsJyEnLCdFJworSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKK1JTLEFCUzggICdiJywnRScsJ1MnLCdFJworQUJTOCwwICAnYycsJyEnLCchJywnRScKK0lNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJworUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJworQUJTMTYsMCAgJ2MnLCchJywnIScsJ0UnCitJTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKK1JTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKK0FCUzE2LDAgICdjJywnIScsJyEnLCdFJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitSUyxSTiAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJworUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJworUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJworUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCitJTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKK0lNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCitSUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJworSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJworUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK0lNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKK1JTLFJOREVDICAnYicsJ0UnLCdTJywnRScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitSUyxSTiAgJ2InLCdFJywnUycsJ0UnCitSTiwwICAnYycsJyEnLCchJywnRScKK0lNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJworUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKK1JOSU5DLDAgICdjJywnIScsJyEnLCdFJworSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKK1JOSU5ELDAgICdjJywnIScsJyEnLCdFJworSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJworSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKK1JTLEFCUzggICdiJywnRScsJ1MnLCdFJworSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKK1JTLEFCUzggICdiJywnRScsJ1MnLCdFJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCitJTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKK1JTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitSUyxSTiAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJworUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJworUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJworUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCitJTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJworUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCitJTU00LEFCUzggICdiJywnRScsJ0knLCdFJworSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJworUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJworSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCitJTU00LFJOICAnYicsJ0UnLCdJJywnRScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitRSU0sUk4gICdhJywnSScsJ0UnLCdFJworUk4sUkQgICctJywnRScsJ0QnLCdEJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1JOLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOLFJEICAnbScsJ0UnLCdEJywnRCcKK1JTLFJOICAnYicsJ0UnLCdTJywnRScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitSUyxSTiAgJ2InLCdFJywnUycsJ0UnCitSTixSRCAgJ2EnLCdFJywnRCcsJ0QnCitJTU00LFJOICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk4gICdiJywnRScsJ0knLCdFJworUUlNLFJOICAnYScsJ0knLCdFJywnRScKK1JOLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOLFJEICAnLScsJ0UnLCdEJywnRCcKK1JOLFJEICAnbScsJ0UnLCdEJywnRCcKK1JTLFJOICAnYicsJ0UnLCdTJywnRScKK1JTLFJOICAnYicsJ0UnLCdTJywnRScKK1JOLFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJworSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCitRSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJworUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJworUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJworUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJworUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJworSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCitJTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKK1FJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCitSTkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCitSUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCitSUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCitSTkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCitJTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKK1JTLFJOICAnYicsJ0UnLCdTJywnRScKK1JTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJworSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCitSUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJworUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCitJTU00LEFCUzggICdiJywnRScsJ0knLCdFJworUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJworSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCitJTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1JOSU5DLFJEICAnLScsJ0UnLCdEJywnRCcKK1JTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitRSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJworUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1JOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJworUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitJTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1JOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitSTklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKK1FJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1JOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKK1JTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKK1JTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKK1JOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJworSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCitRSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJworUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJworUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCitJTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKK1FJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitSUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCitSUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitJTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJworUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKK1JOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKK1JTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKK1FJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJworUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKK1JTLFJOICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJworSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCitSUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCitSUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk4gICdiJywnRScsJ0knLCdFJworUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJworSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKK1JTLEFCUzggICdiJywnRScsJ1MnLCdFJworSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCitJTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKK1JTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCitSUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCitJTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCitSUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworUENSRUw4LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1JOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworSU1NOCxDUkIgICdzJywnSScsJ1MnLCdTJworSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKK1JOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKK1JOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJworUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKK0lNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKK0lNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKK1FJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJworUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCitSUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJworUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKK1JOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitJTU04LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTgsUkQgICctJywnRScsJ0QnLCdEJworSU1NOCxSRCAgJ20nLCdFJywnRCcsJ0QnCitJTU04LENSQiAgJ3MnLCdJJywnUycsJ1MnCitJTU04LFJEICAnYScsJ0UnLCdEJywnRCcKK1JOLFJEICAnbScsJ0UnLCdEJywnRCcKK1JOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKK1JOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJworUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKK0lNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCitJTU00LEFCUzggICdiJywnRScsJ0knLCdFJworUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICdtJywnRScsJ0QnLCdEJworUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCitSUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKK0FCUzgsUkQgICdhJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICctJywnRScsJ0QnLCdEJworSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJworSU1NMTYsQ1JXICAncycsJ0knLCdTJywnUycKK0lNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCitRSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCitBQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKK0FCUzgsUkQgICctJywnRScsJ0QnLCdEJworUk4sUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitJTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworMCwwICAnLScsJyEnLCchJywnIScKK0lNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCitBQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKK1JTLEFCUzggICdiJywnRScsJ1MnLCdFJworUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCitBQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKK0lNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJworQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJworQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJworUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJworQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJworSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCitBQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCitSUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitSTixSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitSTkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCitBQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKK0FCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKK0lNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKK1JOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCitJTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKK1FJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCitSUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCitJTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKK1FJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCitRSU0sUk4gICdhJywnSScsJ0UnLCdFJworUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKK1FJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCitRSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJworUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJworUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKK1FJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCitRSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMOCwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKK1BDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCitQQ1JFTDE2LDAgICctJywnQicsJyEnLCchJworUk4sUkQgICdhJywnRScsJ0QnLCdEJworUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitJTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworUk4sUkQgICdhJywnRScsJ0QnLCdEJworUUlNLFJOICAnYScsJ0knLCdFJywnRScKK1FJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCitSTkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitRSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJworUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKK1JOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKK1FJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKK1FJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCitBQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKK0FCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKK1FJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJworSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJworUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKK1JOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTixSRCAgJ2EnLCdFJywnRCcsJ0QnCitRSU0sUk4gICdhJywnSScsJ0UnLCdFJworUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKK1JOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKK1FJTSxSTklORCAgJ2EnLCdJJywnRScsJ0UnCitSTklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitRSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJworUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJworUUlNLFJOSU5EX0Q4ICAnYScsJ0knLCdFJywnRScKK0lNTTgsUkQgICdhJywnRScsJ0QnLCdEJworUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJworQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitRSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKK1FJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCitBQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCitSTklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJworUk4sUkQgICdhJywnRScsJ0QnLCdEJworUUlNLFJOICAnYScsJ0knLCdFJywnRScKK1FJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCitSTkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCitRSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJworUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKK1JOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKK1JOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKK1FJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKK1FJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCitSTklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCitBQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKK0FCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKK1FJTSxSTklORF9EMTYgICdhJywnSScsJ0UnLCdFJworSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJworUUlNLEFCUzE2ICAnYScsJ0knLCdFJywnRScKK1JOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCisqLyAKK3swLDAsMH19CisjZW5kaWYKKzsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9ocHBhLWRpcy5jIGIvb3Bjb2Rlcy9ocHBhLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDVkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL2hwcGEtZGlzLmMKQEAgLTAsMCArMSw2MzEgQEAKKy8qIERpc2Fzc2VtYmxlciBmb3IgdGhlIFBBLVJJU0MuIFNvbWV3aGF0IGRlcml2ZWQgZnJvbSBzcGFyYy1waW5zbi5jLgorICAgQ29weXJpZ2h0IDE5ODksIDE5OTAsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgImxpYmhwcGEuaCIKKyNpbmNsdWRlICJvcGNvZGUvaHBwYS5oIgorCisvKiBJbnRlZ2VyIHJlZ2lzdGVyIG5hbWVzLCBpbmRleGVkIGJ5IHRoZSBudW1iZXJzIHdoaWNoIGFwcGVhciBpbiB0aGUKKyAgIG9wY29kZXMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlZ19uYW1lc1tdID0gCisgeyJmbGFncyIsICJyMSIsICJycCIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsCisgICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLAorICAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwgInIyNCIsICJyMjUiLCAicjI2IiwgImRwIiwgInJldDAiLCAicmV0MSIsCisgICJzcCIsICJyMzEifTsKKworLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZXMsIGluZGV4ZWQgYnkgdGhlIG51bWJlcnMgd2hpY2ggYXBwZWFyIGluIHRoZQorICAgb3Bjb2Rlcy4gICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnBfcmVnX25hbWVzW10gPSAKKyB7ImZwc3IiLCAiZnBlMiIsICJmcGU0IiwgImZwZTYiLCAKKyAgImZyNCIsICJmcjUiLCAiZnI2IiwgImZyNyIsICJmcjgiLCAKKyAgImZyOSIsICJmcjEwIiwgImZyMTEiLCAiZnIxMiIsICJmcjEzIiwgImZyMTQiLCAiZnIxNSIsIAorICAiZnIxNiIsICJmcjE3IiwgImZyMTgiLCAiZnIxOSIsICJmcjIwIiwgImZyMjEiLCAiZnIyMiIsICJmcjIzIiwKKyAgImZyMjQiLCAiZnIyNSIsICJmcjI2IiwgImZyMjciLCAiZnIyOCIsICJmcjI5IiwgImZyMzAiLCAiZnIzMSJ9OworCit0eXBlZGVmIHVuc2lnbmVkIGludCBDT1JFX0FERFI7CisKKy8qIEdldCBhdCB2YXJpb3VzIHJlbGV2ZW50IGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbiB3b3JkLiAqLworCisjZGVmaW5lIE1BU0tfNSAweDFmCisjZGVmaW5lIE1BU0tfMTEgMHg3ZmYKKyNkZWZpbmUgTUFTS18xNCAweDNmZmYKKyNkZWZpbmUgTUFTS18yMSAweDFmZmZmZgorCisvKiBUaGlzIG1hY3JvIGdldHMgYml0IGZpZWxkcyB1c2luZyBIUCdzIG51bWJlcmluZyAoTVNCID0gMCkgKi8KKworI2RlZmluZSBHRVRfRklFTEQoWCwgRlJPTSwgVE8pIFwKKyAgKChYKSA+PiAoMzEgLSAoVE8pKSAmICgoMSA8PCAoKFRPKSAtIChGUk9NKSArIDEpKSAtIDEpKQorCisvKiBTb21lIG9mIHRoZXNlIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gMi1kIGFycmF5cyBiZWNhdXNlIHRoZXkKKyAgIGNvbnN1bWUgbGVzcyBzdG9yYWdlIHRoaXMgd2F5LiAgSWYgdGhlIG1haW50ZW5hbmNlIGJlY29tZXMgYQorICAgcHJvYmxlbSwgY29udmVydCB0aGVtIGJhY2sgdG8gY29uc3QgMS1kIHBvaW50ZXIgYXJyYXlzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGNvbnRyb2xfcmVnW11bNl0gPSB7CisgICJyY3RyIiwgImNyMSIsICJjcjIiLCAiY3IzIiwgImNyNCIsICJjcjUiLCAiY3I2IiwgImNyNyIsCisgICJwaWRyMSIsICJwaWRyMiIsICJjY3IiLCAic2FyIiwgInBpZHIzIiwgInBpZHI0IiwKKyAgIml2YSIsICJlaWVtIiwgIml0bXIiLCAicGNzcSIsICJwY29xIiwgImlpciIsICJpc3IiLAorICAiaW9yIiwgImlwc3ciLCAiZWlyciIsICJ0cjAiLCAidHIxIiwgInRyMiIsICJ0cjMiLAorICAidHI0IiwgInRyNSIsICJ0cjYiLCAidHI3IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgY29tcGFyZV9jb25kX25hbWVzW11bNV0gPSB7CisgICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgIiw8PCIsICIsPDw9IiwgIixzdiIsCisgICIsb2QiLCAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLD4+PSIsCisgICIsPj4iLCAiLG5zdiIsICIsZXYiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgYWRkX2NvbmRfbmFtZXNbXVs1XSA9IHsKKyAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLG51diIsICIsem52IiwgIixzdiIsCisgICIsb2QiLCAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAiLHV2IiwKKyAgIix2bnoiLCAiLG5zdiIsICIsZXYiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxvZ2ljYWxfY29uZF9uYW1lc1tdID0geworICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsIDAsIDAsIDAsICIsb2QiLAorICAiLHRyIiwgIiw8PiIsICIsPj0iLCAiLD4iLCAwLCAwLCAwLCAiLGV2In07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdW5pdF9jb25kX25hbWVzW10gPSB7CisgICIiLCAwLCAiLHNieiIsICIsc2h6IiwgIixzZGMiLCAwLCAiLHNiYyIsICIsc2hjIiwKKyAgIix0ciIsIDAsICIsbmJ6IiwgIixuaHoiLCAiLG5kYyIsIDAsICIsbmJjIiwgIixuaGMiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgc2hpZnRfY29uZF9uYW1lc1tdWzRdID0geworICAiIiwgIiw9IiwgIiw8IiwgIixvZCIsICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsZXYiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgaW5kZXhfY29tcGxfbmFtZXNbXVs0XSA9IHsiIiwgIixtIiwgIixzIiwgIixzbSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgc2hvcnRfbGRzdF9jb21wbF9uYW1lc1tdWzRdID0geyIiLCAiLG1hIiwgIiIsICIsbWIifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzaG9ydF9ieXRlc19jb21wbF9uYW1lc1tdID0geworICAiIiwgIixiLG0iLCAiLGUiLCAiLGUsbSIKK307CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmxvYXRfZm9ybWF0X25hbWVzW10gPSB7IixzZ2wiLCAiLGRibCIsICIiLCAiLHF1YWQifTsKK3N0YXRpYyBjb25zdCBjaGFyIGZsb2F0X2NvbXBfbmFtZXNbXVs4XSA9Cit7CisgICIsZmFsc2U/IiwgIixmYWxzZSIsICIsPyIsICIsITw9PiIsICIsPSIsICIsPXQiLCAiLD89IiwgIiwhPD4iLAorICAiLCE/Pj0iLCAiLDwiLCAiLD88IiwgIiwhPj0iLCAiLCE/PiIsICIsPD0iLCAiLD88PSIsICIsIT4iLAorICAiLCE/PD0iLCAiLD4iLCAiLD8+IiwgIiwhPD0iLCAiLCE/PCIsICIsPj0iLCAiLD8+PSIsICIsITwiLAorICAiLCE/PSIsICIsPD4iLCAiLCE9IiwgIiwhPXQiLCAiLCE/IiwgIiw8PT4iLCAiLHRydWU/IiwgIix0cnVlIgorfTsKKworLyogRm9yIGEgYnVuY2ggb2YgZGlmZmVyZW50IGluc3RydWN0aW9ucyBmb3JtIGFuIGluZGV4IGludG8gYSAKKyAgIGNvbXBsZXRlciBuYW1lIHRhYmxlLiAqLworI2RlZmluZSBHRVRfQ09NUEwoaW5zbikgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSB8IFwKKwkJCSBHRVRfRklFTEQgKGluc24sIDE4LCAxOCkgPDwgMSkKKworI2RlZmluZSBHRVRfQ09ORChpbnNuKSAoR0VUX0ZJRUxEICgoaW5zbiksIDE2LCAxOCkgKyBcCisJCQkoR0VUX0ZJRUxEICgoaW5zbiksIDE5LCAxOSkgPyA4IDogMCkpCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgcmVnaXN0ZXJzLiAgUHV0IHRoZXNlIGZpcnN0LCBzbyBnY2MncyBmdW5jdGlvbgorICAgaW5saW5pbmcgY2FuIGRvIGl0cyBzdHVmZi4gICovCisKKyNkZWZpbmUgZnB1dHNfZmlsdGVyZWQoU1RSLEYpCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBTVFIpCisKK3N0YXRpYyB2b2lkCitmcHV0X3JlZyAocmVnLCBpbmZvKQorICAgICB1bnNpZ25lZCByZWc7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCByZWcgPyByZWdfbmFtZXNbcmVnXSA6ICJyMCIpOworfQorCitzdGF0aWMgdm9pZAorZnB1dF9mcF9yZWcgKHJlZywgaW5mbykKKyAgICAgdW5zaWduZWQgcmVnOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgcmVnID8gZnBfcmVnX25hbWVzW3JlZ10gOiAiZnIwIik7Cit9CisKK3N0YXRpYyB2b2lkCitmcHV0X2ZwX3JlZ19yIChyZWcsIGluZm8pCisgICAgIHVuc2lnbmVkIHJlZzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgLyogU3BlY2lhbCBjYXNlIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiByZWdpc3RlcnMuICAqLworICBpZiAocmVnIDwgNCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImZwZSVkIiwgcmVnICogMiArIDEpOworICBlbHNlCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1IiLCByZWcgPyBmcF9yZWdfbmFtZXNbcmVnXSAKKwkJCQkJCSAgICA6ICJmcjAiKTsKK30KKworc3RhdGljIHZvaWQKK2ZwdXRfY3JlZyAocmVnLCBpbmZvKQorICAgICB1bnNpZ25lZCByZWc7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBjb250cm9sX3JlZ1tyZWddKTsKK30KKworLyogcHJpbnQgY29uc3RhbnRzIHdpdGggc2lnbiAqLworCitzdGF0aWMgdm9pZAorZnB1dF9jb25zdCAobnVtLCBpbmZvKQorICAgICB1bnNpZ25lZCBudW07CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGlmICgoaW50KW51bSA8IDApCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXgiLCAtKGludCludW0pOworICBlbHNlCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIleCIsIG51bSk7Cit9CisKKy8qIFJvdXRpbmVzIHRvIGV4dHJhY3QgdmFyaW91cyBzaXplZCBjb25zdGFudHMgb3V0IG9mIGhwcGEKKyAgIGluc3RydWN0aW9ucy4gKi8KKworLyogZXh0cmFjdCBhIDMtYml0IHNwYWNlIHJlZ2lzdGVyIG51bWJlciBmcm9tIGEgYmUsIGJsZSwgbXRzcCBvciBtZnNwICovCitzdGF0aWMgaW50CitleHRyYWN0XzMgKHdvcmQpCisgICAgIHVuc2lnbmVkIHdvcmQ7Cit7CisgIHJldHVybiBHRVRfRklFTEQgKHdvcmQsIDE4LCAxOCkgPDwgMiB8IEdFVF9GSUVMRCAod29yZCwgMTYsIDE3KTsKK30KKworc3RhdGljIGludAorZXh0cmFjdF81X2xvYWQgKHdvcmQpCisgICAgIHVuc2lnbmVkIHdvcmQ7Cit7CisgIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgPj4gMTYgJiBNQVNLXzUsIDUpOworfQorCisvKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIHN0e2Jod31zIGluc3RydWN0aW9uICovCitzdGF0aWMgaW50CitleHRyYWN0XzVfc3RvcmUgKHdvcmQpCisgICAgIHVuc2lnbmVkIHdvcmQ7Cit7CisgIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzUsIDUpOworfQorCisvKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIGJyZWFrIGluc3RydWN0aW9uICovCitzdGF0aWMgdW5zaWduZWQKK2V4dHJhY3RfNXJfc3RvcmUgKHdvcmQpCisgICAgIHVuc2lnbmVkIHdvcmQ7Cit7CisgIHJldHVybiAod29yZCAmIE1BU0tfNSk7Cit9CisKKy8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEge3NyfXNtIGluc3RydWN0aW9uICovCitzdGF0aWMgdW5zaWduZWQKK2V4dHJhY3RfNVJfc3RvcmUgKHdvcmQpCisgICAgIHVuc2lnbmVkIHdvcmQ7Cit7CisgIHJldHVybiAod29yZCA+PiAxNiAmIE1BU0tfNSk7Cit9CisKKy8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgYmIgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF81UV9zdG9yZSAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuICh3b3JkID4+IDIxICYgTUFTS181KTsKK30KKworLyogZXh0cmFjdCBhbiAxMSBiaXQgaW1tZWRpYXRlIGZpZWxkICovCitzdGF0aWMgaW50CitleHRyYWN0XzExICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xMSwgMTEpOworfQorCisvKiBleHRyYWN0IGEgMTQgYml0IGltbWVkaWF0ZSBmaWVsZCAqLworc3RhdGljIGludAorZXh0cmFjdF8xNCAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfMTQsIDE0KTsKK30KKworLyogZXh0cmFjdCBhIDIxIGJpdCBjb25zdGFudCAqLworCitzdGF0aWMgaW50CitleHRyYWN0XzIxICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICBpbnQgdmFsOworCisgIHdvcmQgJj0gTUFTS18yMTsKKyAgd29yZCA8PD0gMTE7CisgIHZhbCA9IEdFVF9GSUVMRCAod29yZCwgMjAsIDIwKTsKKyAgdmFsIDw8PSAxMTsKKyAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgOSwgMTkpOworICB2YWwgPDw9IDI7CisgIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDUsIDYpOworICB2YWwgPDw9IDU7CisgIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDAsIDQpOworICB2YWwgPDw9IDI7CisgIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDcsIDgpOworICByZXR1cm4gc2lnbl9leHRlbmQgKHZhbCwgMjEpIDw8IDExOworfQorCisvKiBleHRyYWN0IGEgMTIgYml0IGNvbnN0YW50IGZyb20gYnJhbmNoIGluc3RydWN0aW9ucyAqLworCitzdGF0aWMgaW50CitleHRyYWN0XzEyICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICByZXR1cm4gc2lnbl9leHRlbmQgKEdFVF9GSUVMRCAod29yZCwgMTksIDI4KSB8CisgICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAyOSwgMjkpIDw8IDEwIHwKKyAgICAgICAgICAgICAgICAgICAgICAod29yZCAmIDB4MSkgPDwgMTEsIDEyKSA8PCAyOworfQorCisvKiBleHRyYWN0IGEgMTcgYml0IGNvbnN0YW50IGZyb20gYnJhbmNoIGluc3RydWN0aW9ucywgcmV0dXJuaW5nIHRoZQorICAgMTkgYml0IHNpZ25lZCB2YWx1ZS4gKi8KKworc3RhdGljIGludAorZXh0cmFjdF8xNyAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRCAod29yZCwgMjksIDI5KSA8PCAxMCB8CisgICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAxMSwgMTUpIDw8IDExIHwKKyAgICAgICAgICAgICAgICAgICAgICAod29yZCAmIDB4MSkgPDwgMTYsIDE3KSA8PCAyOworfQorCisvKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24uICAqLworaW50CitwcmludF9pbnNuX2hwcGEgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgYmZkX2J5dGUgYnVmZmVyWzRdOworICB1bnNpZ25lZCBpbnQgaW5zbiwgaTsKKworICB7CisgICAgaW50IHN0YXR1cyA9CisgICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgeworCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgfQorCisgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc3RydWN0IHBhX29wY29kZSAqb3Bjb2RlID0gJnBhX29wY29kZXNbaV07CisgICAgICBpZiAoKGluc24gJiBvcGNvZGUtPm1hc2spID09IG9wY29kZS0+bWF0Y2gpCisJeworCSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKwkgIAorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7CisKKwkgIGlmICghc3RyY2hyICgiY2ZDWTw/IUAtKyZVPn5uSE5aRklNYWR1fCIsIG9wY29kZS0+YXJnc1swXSkpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOworCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKCpzKQorCQl7CisJCWNhc2UgJ3gnOgorCQkgIGZwdXRfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICdYJzoKKyAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI1LCAyNSkpCisJCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7CisJCSAgZWxzZQorCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnYic6CisJCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnXic6CisJCSAgZnB1dF9jcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0UnOgorICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKKwkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOworCQkgIGVsc2UKKwkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAndCc6CisJCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3YnOgorICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKKwkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKKwkJICBlbHNlCisJCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICd5JzoKKwkJICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnNCc6CisJCSAgeworCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApOworCisJCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKKwkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQljYXNlICc2JzoKKwkJICB7CisJCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpOworCisJCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKKwkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQljYXNlICc3JzoKKwkJICB7CisJCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpOworCisJCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKKwkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQljYXNlICc4JzoKKwkJICB7CisJCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApOworCisJCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKKwkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQljYXNlICc5JzoKKwkJICB7CisJCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjUpOworCisJCSAgICByZWcgfD0gKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA8PCA0KTsKKwkJICAgIGZwdXRfZnBfcmVnIChyZWcsIGluZm8pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQljYXNlICc1JzoKKwkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVfbG9hZCAoaW5zbiksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICdzJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwKKwkJCQkJICJzciVkIiwgR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTcpKTsKKwkJICBicmVhazsKKwkJY2FzZSAnUyc6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzciVkIiwgZXh0cmFjdF8zIChpbnNuKSk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKKwkJCQkgICAgaW5kZXhfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOworCQkgIGJyZWFrOworCQljYXNlICdDJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCisJCQkJICAgIHNob3J0X2xkc3RfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOworCQkgIGJyZWFrOworCQljYXNlICdZJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCisJCQkJICAgIHNob3J0X2J5dGVzX2NvbXBsX25hbWVzW0dFVF9DT01QTCAoaW5zbildKTsKKwkJICBicmVhazsKKwkJLyogdGhlc2UgZm91ciBjb25kaXRpb25zIGFyZSBmb3IgdGhlIHNldCBvZiBpbnN0cnVjdGlvbnMKKwkJICAgd2hpY2ggZGlzdGluZ3Vpc2ggdHJ1ZS9mYWxzZSBjb25kaXRpb25zIGJ5IG9wY29kZSByYXRoZXIKKwkJICAgdGhhbiBieSB0aGUgJ2YnIGJpdCAoc2lnaCk6IGNvbWIsIGNvbWliLCBhZGRiLCBhZGRpYiAqLworCQljYXNlICc8JzoKKwkJICBmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0sCisJCQkJICBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnPyc6CisJCSAgZnB1dHNfZmlsdGVyZWQgKGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCkKKwkJCQkgICsgR0VUX0ZJRUxEIChpbnNuLCA0LCA0KSAqIDhdLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnQCc6CisJCSAgZnB1dHNfZmlsdGVyZWQgKGFkZF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KQorCQkJCSAgKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICdhJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCisJCQkJCSBjb21wYXJlX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKKwkJCQkJIGFkZF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOworCQkgIGJyZWFrOworCQljYXNlICchJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCQkgICAgYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSk7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAnJic6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAorCQkJCSAgICBsb2dpY2FsX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1UnOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKKwkJCQkgICAgdW5pdF9jb25kX25hbWVzW0dFVF9DT05EIChpbnNuKV0pOworCQkgIGJyZWFrOworCQljYXNlICd8JzoKKwkJY2FzZSAnPic6CisJCWNhc2UgJ34nOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKQorCQkgICAgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJICAgICBzaGlmdF9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KV0pOworCisJCSAgLyogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGluIGFyZ3MgaXMgJ24nLCBpdCB3aWxsIGhhbmRsZQorCQkgICAgIHB1dHRpbmcgb3V0IHRoZSBzcGFjZS4gICovCisJCSAgaWYgKHNbMV0gIT0gJ24nKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNV9zdG9yZSAoaW5zbiksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICdyJzoKKwkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVyX3N0b3JlIChpbnNuKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1InOgorCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNVJfc3RvcmUgKGluc24pLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnUSc6CisJCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81UV9zdG9yZSAoaW5zbiksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICdpJzoKKwkJICBmcHV0X2NvbnN0IChleHRyYWN0XzExIChpbnNuKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2onOgorCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTQgKGluc24pLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnayc6CisJCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8yMSAoaW5zbiksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICduJzoKKwkJICBpZiAoaW5zbiAmIDB4MikKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7CisJCSAgZWxzZQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ04nOgorCQkgIGlmICgoaW5zbiAmIDB4MjApICYmIHNbMV0pCisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuICIpOworCQkgIGVsc2UgaWYgKGluc24gJiAweDIwKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiIpOworCQkgIGVsc2UgaWYgKHNbMV0pCisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKKwkJICBicmVhazsKKwkJY2FzZSAndyc6CisJCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChtZW1hZGRyICsgOCArIGV4dHJhY3RfMTIgKGluc24pLAorCQkJCQkgICAgICAgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1cnOgorCQkgIC8qIDE3IGJpdCBQQy1yZWxhdGl2ZSBicmFuY2guICAqLworCQkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyA4IAorCQkJCQkJKyBleHRyYWN0XzE3IChpbnNuKSksCisJCQkJCSAgICAgICBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAneic6CisJCSAgLyogMTcgYml0IGRpc3BsYWNlbWVudC4gIFRoaXMgaXMgYW4gb2Zmc2V0IGZyb20gYSByZWdpc3RlcgorCQkgICAgIHNvIGl0IGdldHMgZGlzYXNzc2VtYmxlZCBhcyBqdXN0IGEgbnVtYmVyLCBub3QgYW55IHNvcnQKKwkJICAgICBvZiBhZGRyZXNzLiAgKi8KKwkJICBmcHV0X2NvbnN0IChleHRyYWN0XzE3IChpbnNuKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAorCQkJCSAgICAzMSAtIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAorCQkJCSAgICBHRVRfRklFTEQgKGluc24sIDIyLCAyNikpOworCQkgIGJyZWFrOworCQljYXNlICdUJzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKKwkJCQkgICAgMzIgLSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpOworCQkgIGJyZWFrOworCQljYXNlICdBJzoKKwkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDE4KSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1onOgorCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDI2LCAyNikpCisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixtICIpOworCQkgIGVsc2UKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOworCQkgIGJyZWFrOworCQljYXNlICdEJzoKKwkJICBmcHV0X2NvbnN0IChHRVRfRklFTEQgKGluc24sIDYsIDMxKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgR0VUX0ZJRUxEIChpbnNuLCAyMywgMjUpKTsKKwkJICBicmVhazsKKwkJY2FzZSAnTyc6CisJCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwyMCkgPDwgNSB8CisJCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ28nOgorCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjApLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnMyc6CisJCSAgeworCQkgICAgaW50IHJlZyA9IEdFVF9GSUVMRCAoaW5zbiwgMjEsIDIyKTsKKwkJICAgIHJlZyB8PSBHRVRfRklFTEQgKGluc24sIDE2LCAxOCkgPDwgMjsKKwkJICAgIGlmIChHRVRfRklFTEQgKGluc24sIDIzLCAyMykgIT0gMCkKKwkJICAgICAgZnB1dF9mcF9yZWdfciAocmVnLCBpbmZvKTsKKwkJICAgIGVsc2UKKwkJICAgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7CisJCSAgICBicmVhazsKKwkJICB9CisKKwkJY2FzZSAnMic6CisJCSAgZnB1dF9jb25zdCAoKEdFVF9GSUVMRCAoaW5zbiwgNiwgMjIpIDw8IDUgfAorCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICcxJzoKKwkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMjApIDw8IDUgfAorCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICcwJzoKKwkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCAxNiwgMjApIDw8IDUgfAorCQkJICAgICAgIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSksIGluZm8pOworCQkgIGJyZWFrOworCQljYXNlICd1JzoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlZCIsIEdFVF9GSUVMRCAoaW5zbiwgMjMsIDI1KSk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0YnOgorCQkgIC8qIGlmIG5vIGRlc3RpbmF0aW9uIGNvbXBsZXRlciBhbmQgbm90IGJlZm9yZSBhIGNvbXBsZXRlcgorCQkgICAgIGZvciBmY21wLCBuZWVkIGEgc3BhY2UgaGVyZSAqLworCQkgIGlmIChHRVRfRklFTEQgKGluc24sIDIxLCAyMikgPT0gMSB8fCBzWzFdID09ICdNJykKKwkJICAgIGZwdXRzX2ZpbHRlcmVkIChmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxOSwgMjApXSwKKwkJCQkgICAgaW5mbyk7CisJCSAgZWxzZQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAorCQkJCQkgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxECisJCQkJCQkJICAgICAgKGluc24sIDE5LCAyMCldKTsKKwkJICBicmVhazsKKwkJY2FzZSAnRyc6CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAorCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLAorCQkJCQkJCQkgIDE3LCAxOCldKTsKKwkJICBicmVhazsKKwkJY2FzZSAnSCc6CisJCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSA9PSAxKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAorCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbMF0pOworCQkgIGVsc2UKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKKwkJCQkgICAgZmxvYXRfZm9ybWF0X25hbWVzWzFdKTsKKwkJICBicmVhazsKKwkJY2FzZSAnSSc6CisJCSAgLyogaWYgbm8gZGVzdGluYXRpb24gY29tcGxldGVyIGFuZCBub3QgYmVmb3JlIGEgY29tcGxldGVyCisJCSAgICAgZm9yIGZjbXAsIG5lZWQgYSBzcGFjZSBoZXJlICovCisJCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjEsIDIyKSA9PSAxIHx8IHNbMV0gPT0gJ00nKQorCQkgICAgZnB1dHNfZmlsdGVyZWQgKGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDIwLCAyMCldLAorCQkJCSAgICBpbmZvKTsKKwkJICBlbHNlCisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCisJCQkJCSAgIGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQKKwkJCQkJCQkgICAgICAoaW5zbiwgMjAsIDIwKV0pOworCQkgIGJyZWFrOworCQljYXNlICdKJzoKKyAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDI0LCAyNCkpCisJCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKKwkJICBlbHNlCisJCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7CisJCSAgICAgIAorCQkgIGJyZWFrOworCQljYXNlICdLJzoKKyAgICAgICAgICAgICAgICAgIGlmIChHRVRfRklFTEQgKGluc24sIDE5LCAxOSkpCisJCSAgICAgIGZwdXRfZnBfcmVnX3IgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7CisJCSAgZWxzZQorCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKKwkJICBicmVhazsKKwkJY2FzZSAnTSc6CisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCisJCQkJCSAgIGZsb2F0X2NvbXBfbmFtZXNbR0VUX0ZJRUxECisJCQkJCQkJICAgICAgKGluc24sIDI3LCAzMSldKTsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKnMpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIHJldHVybiBzaXplb2YoaW5zbik7CisJfQorICAgIH0KKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJTh4IiwgaW5zbik7CisgIHJldHVybiBzaXplb2YoaW5zbik7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL2kzODYtZGlzLmMgYi9vcGNvZGVzL2kzODYtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxNDRjYgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvaTM4Ni1kaXMuYwpAQCAtMCwwICsxLDMyNjggQEAKKy8qIFByaW50IGkzODYgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDg5LCA5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIDgwMzg2IGluc3RydWN0aW9uIHByaW50ZXIgYnkgUGFjZSBXaWxsaXNzb24gKHBhY2VAcHJlcC5haS5taXQuZWR1KQorICogSnVseSAxOTg4CisgKiAgbW9kaWZpZWQgYnkgSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKQorICovCisKKy8qCisgKiBUaGUgbWFpbiB0YWJsZXMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb25zIGlzIGVzc2VudGlhbGx5IGEgY29weQorICogb2YgdGhlICJPcGNvZGUgTWFwIiBjaGFwdGVyIChBcHBlbmRpeCBBKSBvZiB0aGUgSW50ZWwgODAzODYKKyAqIFByb2dyYW1tZXJzIE1hbnVhbC4gIFVzdWFsbHksIHRoZXJlIGlzIGEgY2FwaXRhbCBsZXR0ZXIsIGZvbGxvd2VkCisgKiBieSBhIHNtYWxsIGxldHRlci4gIFRoZSBjYXBpdGFsIGxldHRlciB0ZWxsIHRoZSBhZGRyZXNzaW5nIG1vZGUsCisgKiBhbmQgdGhlIHNtYWxsIGxldHRlciB0ZWxscyBhYm91dCB0aGUgb3BlcmFuZCBzaXplLiAgUmVmZXIgdG8KKyAqIHRoZSBJbnRlbCBtYW51YWwgZm9yIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworI2RlZmluZSBNQVhMRU4gMjAKKworI2luY2x1ZGUgPHNldGptcC5oPgorCisjaWZuZGVmIFVOSVhXQVJFX0NPTVBBVAorLyogU2V0IG5vbi16ZXJvIGZvciBicm9rZW4sIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgU2V0IHRvIHplcm8gZm9yCisgICBub24tYnJva2VuIG9wY29kZXMuICAqLworI2RlZmluZSBVTklYV0FSRV9DT01QQVQgMQorI2VuZGlmCisKKworc3RhdGljIGludCBmZXRjaF9kYXRhIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF9ieXRlICopKTsKKworc3RydWN0IGRpc19wcml2YXRlCit7CisgIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KKyAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOworICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07CisgIGJmZF92bWEgaW5zbl9zdGFydDsKKyAgam1wX2J1ZiBiYWlsb3V0OworfTsKKworLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQorICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCisgICBvbiBlcnJvci4gICovCisjZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAorICAoKGFkZHIpIDw9ICgoc3RydWN0IGRpc19wcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCisgICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCisKK3N0YXRpYyBpbnQKK2ZldGNoX2RhdGEgKGluZm8sIGFkZHIpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgaW50IHN0YXR1czsKKyAgc3RydWN0IGRpc19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBkaXNfcHJpdmF0ZSAqKWluZm8tPnByaXZhdGVfZGF0YTsKKyAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKKwkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKKwkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCisJCQkJICAgICAgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7CisgICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIEViIE9QX0UsIGJfbW9kZQorI2RlZmluZSBpbmRpckViIE9QX2luZGlyRSwgYl9tb2RlCisjZGVmaW5lIEdiIE9QX0csIGJfbW9kZQorI2RlZmluZSBFdiBPUF9FLCB2X21vZGUKKyNkZWZpbmUgaW5kaXJFdiBPUF9pbmRpckUsIHZfbW9kZQorI2RlZmluZSBFdyBPUF9FLCB3X21vZGUKKyNkZWZpbmUgTWEgT1BfRSwgdl9tb2RlCisjZGVmaW5lIE0gT1BfRSwgMAorI2RlZmluZSBNcCBPUF9FLCAwCQkvKiA/ICovCisjZGVmaW5lIEd2IE9QX0csIHZfbW9kZQorI2RlZmluZSBHdyBPUF9HLCB3X21vZGUKKyNkZWZpbmUgUncgT1Bfcm0sIHdfbW9kZQorI2RlZmluZSBSZCBPUF9ybSwgZF9tb2RlCisjZGVmaW5lIEliIE9QX0ksIGJfbW9kZQorI2RlZmluZSBzSWIgT1Bfc0ksIGJfbW9kZQkvKiBzaWduIGV4dGVuZWQgYnl0ZSAqLworI2RlZmluZSBJdiBPUF9JLCB2X21vZGUKKyNkZWZpbmUgSXcgT1BfSSwgd19tb2RlCisjZGVmaW5lIEpiIE9QX0osIGJfbW9kZQorI2RlZmluZSBKdiBPUF9KLCB2X21vZGUKKyNpZiAwCisjZGVmaW5lIE9ORSBPUF9PTkUsIDAKKyNlbmRpZgorI2RlZmluZSBDZCBPUF9DLCBkX21vZGUKKyNkZWZpbmUgRGQgT1BfRCwgZF9tb2RlCisjZGVmaW5lIFRkIE9QX1QsIGRfbW9kZQorCisjZGVmaW5lIGVBWCBPUF9SRUcsIGVBWF9yZWcKKyNkZWZpbmUgZUJYIE9QX1JFRywgZUJYX3JlZworI2RlZmluZSBlQ1ggT1BfUkVHLCBlQ1hfcmVnCisjZGVmaW5lIGVEWCBPUF9SRUcsIGVEWF9yZWcKKyNkZWZpbmUgZVNQIE9QX1JFRywgZVNQX3JlZworI2RlZmluZSBlQlAgT1BfUkVHLCBlQlBfcmVnCisjZGVmaW5lIGVTSSBPUF9SRUcsIGVTSV9yZWcKKyNkZWZpbmUgZURJIE9QX1JFRywgZURJX3JlZworI2RlZmluZSBBTCBPUF9SRUcsIGFsX3JlZworI2RlZmluZSBDTCBPUF9SRUcsIGNsX3JlZworI2RlZmluZSBETCBPUF9SRUcsIGRsX3JlZworI2RlZmluZSBCTCBPUF9SRUcsIGJsX3JlZworI2RlZmluZSBBSCBPUF9SRUcsIGFoX3JlZworI2RlZmluZSBDSCBPUF9SRUcsIGNoX3JlZworI2RlZmluZSBESCBPUF9SRUcsIGRoX3JlZworI2RlZmluZSBCSCBPUF9SRUcsIGJoX3JlZworI2RlZmluZSBBWCBPUF9SRUcsIGF4X3JlZworI2RlZmluZSBEWCBPUF9SRUcsIGR4X3JlZworI2RlZmluZSBpbmRpckRYIE9QX1JFRywgaW5kaXJfZHhfcmVnCisKKyNkZWZpbmUgU3cgT1BfU0VHLCB3X21vZGUKKyNkZWZpbmUgQXAgT1BfRElSLCBscHRyCisjZGVmaW5lIEF2IE9QX0RJUiwgdl9tb2RlCisjZGVmaW5lIE9iIE9QX09GRiwgYl9tb2RlCisjZGVmaW5lIE92IE9QX09GRiwgdl9tb2RlCisjZGVmaW5lIFhiIE9QX0RTcmVnLCBlU0lfcmVnCisjZGVmaW5lIFh2IE9QX0RTcmVnLCBlU0lfcmVnCisjZGVmaW5lIFliIE9QX0VTcmVnLCBlRElfcmVnCisjZGVmaW5lIFl2IE9QX0VTcmVnLCBlRElfcmVnCisjZGVmaW5lIERTQlggT1BfRFNyZWcsIGVCWF9yZWcKKworI2RlZmluZSBlcyBPUF9SRUcsIGVzX3JlZworI2RlZmluZSBzcyBPUF9SRUcsIHNzX3JlZworI2RlZmluZSBjcyBPUF9SRUcsIGNzX3JlZworI2RlZmluZSBkcyBPUF9SRUcsIGRzX3JlZworI2RlZmluZSBmcyBPUF9SRUcsIGZzX3JlZworI2RlZmluZSBncyBPUF9SRUcsIGdzX3JlZworCisjZGVmaW5lIE1YIE9QX01NWCwgMAorI2RlZmluZSBFTSBPUF9FTSwgdl9tb2RlCisjZGVmaW5lIE1TIE9QX01TLCBiX21vZGUKKyNkZWZpbmUgT1BTVUYgT1BfM0ROb3dTdWZmaXgsIDAKKworLyogYml0cyBpbiBzaXplZmxhZyAqLworI2lmIDAgLyogbGVhdmUgdW5kZWZpbmVkIHVudGlsIHNvbWVvbmUgYWRkcyB0aGUgZXh0cmEgZmxhZyB0byBvYmpkdW1wICovCisjZGVmaW5lIFNVRkZJWF9BTFdBWVMgNAorI2VuZGlmCisjZGVmaW5lIEFGTEFHIDIKKyNkZWZpbmUgREZMQUcgMQorCit0eXBlZGVmIHZvaWQgKCpvcF9ydG4pIFBBUkFNUyAoKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnICkpOworCitzdGF0aWMgdm9pZCBPUF9FIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF9HIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF9JIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF9pbmRpckUgUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIE9QX3NJIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF9SRUcgUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIE9QX0ogUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIE9QX0RJUiBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1BfT0ZGIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF9FU3JlZyBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1BfRFNyZWcgUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIE9QX1NFRyBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1BfQyBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1BfRCBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1BfVCBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1Bfcm0gUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIE9QX1NUIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF9TVGkgIFBBUkFNUyAoKGludCwgaW50KSk7CisjaWYgMAorc3RhdGljIHZvaWQgT1BfT05FIFBBUkFNUyAoKGludCwgaW50KSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIE9QX01NWCBQQVJBTVMgKChpbnQsIGludCkpOworc3RhdGljIHZvaWQgT1BfRU0gUEFSQU1TICgoaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIE9QX01TIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBPUF8zRE5vd1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOworCitzdGF0aWMgdm9pZCBhcHBlbmRfc2VnIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNldF9vcCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgb3ApKTsKK3N0YXRpYyB2b2lkIHB1dG9wIFBBUkFNUyAoKGNoYXIgKnRlbXBsYXRlLCBpbnQgc2l6ZWZsYWcpKTsKK3N0YXRpYyB2b2lkIGRvZmxvYXQgUEFSQU1TICgoaW50IHNpemVmbGFnKSk7CitzdGF0aWMgaW50IGdldDE2IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgZ2V0MzIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgY2twcmVmaXggUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcHRyX3JlZyBQQVJBTVMgKChpbnQsIGludCkpOworCisjZGVmaW5lIGJfbW9kZSAxCisjZGVmaW5lIHZfbW9kZSAyCisjZGVmaW5lIHdfbW9kZSAzCisjZGVmaW5lIGRfbW9kZSA0CisjZGVmaW5lIHhfbW9kZSA1CisKKyNkZWZpbmUgZXNfcmVnIDEwMAorI2RlZmluZSBjc19yZWcgMTAxCisjZGVmaW5lIHNzX3JlZyAxMDIKKyNkZWZpbmUgZHNfcmVnIDEwMworI2RlZmluZSBmc19yZWcgMTA0CisjZGVmaW5lIGdzX3JlZyAxMDUKKyNkZWZpbmUgZUFYX3JlZyAxMDcKKyNkZWZpbmUgZUNYX3JlZyAxMDgKKyNkZWZpbmUgZURYX3JlZyAxMDkKKyNkZWZpbmUgZUJYX3JlZyAxMTAKKyNkZWZpbmUgZVNQX3JlZyAxMTEKKyNkZWZpbmUgZUJQX3JlZyAxMTIKKyNkZWZpbmUgZVNJX3JlZyAxMTMKKyNkZWZpbmUgZURJX3JlZyAxMTQKKworI2RlZmluZSBscHRyIDExNQorCisjZGVmaW5lIGFsX3JlZyAxMTYKKyNkZWZpbmUgY2xfcmVnIDExNworI2RlZmluZSBkbF9yZWcgMTE4CisjZGVmaW5lIGJsX3JlZyAxMTkKKyNkZWZpbmUgYWhfcmVnIDEyMAorI2RlZmluZSBjaF9yZWcgMTIxCisjZGVmaW5lIGRoX3JlZyAxMjIKKyNkZWZpbmUgYmhfcmVnIDEyMworCisjZGVmaW5lIGF4X3JlZyAxMjQKKyNkZWZpbmUgY3hfcmVnIDEyNQorI2RlZmluZSBkeF9yZWcgMTI2CisjZGVmaW5lIGJ4X3JlZyAxMjcKKyNkZWZpbmUgc3BfcmVnIDEyOAorI2RlZmluZSBicF9yZWcgMTI5CisjZGVmaW5lIHNpX3JlZyAxMzAKKyNkZWZpbmUgZGlfcmVnIDEzMQorCisjZGVmaW5lIGluZGlyX2R4X3JlZyAxNTAKKworI2RlZmluZSBHUlAxYiBOVUxMLCBOVUxMLCAwCisjZGVmaW5lIEdSUDFTIE5VTEwsIE5VTEwsIDEKKyNkZWZpbmUgR1JQMVNzIE5VTEwsIE5VTEwsIDIKKyNkZWZpbmUgR1JQMmIgTlVMTCwgTlVMTCwgMworI2RlZmluZSBHUlAyUyBOVUxMLCBOVUxMLCA0CisjZGVmaW5lIEdSUDJiX29uZSBOVUxMLCBOVUxMLCA1CisjZGVmaW5lIEdSUDJTX29uZSBOVUxMLCBOVUxMLCA2CisjZGVmaW5lIEdSUDJiX2NsIE5VTEwsIE5VTEwsIDcKKyNkZWZpbmUgR1JQMlNfY2wgTlVMTCwgTlVMTCwgOAorI2RlZmluZSBHUlAzYiBOVUxMLCBOVUxMLCA5CisjZGVmaW5lIEdSUDNTIE5VTEwsIE5VTEwsIDEwCisjZGVmaW5lIEdSUDQgIE5VTEwsIE5VTEwsIDExCisjZGVmaW5lIEdSUDUgIE5VTEwsIE5VTEwsIDEyCisjZGVmaW5lIEdSUDYgIE5VTEwsIE5VTEwsIDEzCisjZGVmaW5lIEdSUDcgTlVMTCwgTlVMTCwgMTQKKyNkZWZpbmUgR1JQOCBOVUxMLCBOVUxMLCAxNQorI2RlZmluZSBHUlA5IE5VTEwsIE5VTEwsIDE2CisjZGVmaW5lIEdSUDEwIE5VTEwsIE5VTEwsIDE3CisjZGVmaW5lIEdSUDExIE5VTEwsIE5VTEwsIDE4CisjZGVmaW5lIEdSUDEyIE5VTEwsIE5VTEwsIDE5CisjZGVmaW5lIEdSUDEzIE5VTEwsIE5VTEwsIDIwCisjZGVmaW5lIEdSUDE0IE5VTEwsIE5VTEwsIDIxCisKKyNkZWZpbmUgRkxPQVRDT0RFIDUwCisjZGVmaW5lIEZMT0FUIE5VTEwsIE5VTEwsIEZMT0FUQ09ERQorCitzdHJ1Y3QgZGlzMzg2IHsKKyAgY2hhciAqbmFtZTsKKyAgb3BfcnRuIG9wMTsKKyAgaW50IGJ5dGVtb2RlMTsKKyAgb3BfcnRuIG9wMjsKKyAgaW50IGJ5dGVtb2RlMjsKKyAgb3BfcnRuIG9wMzsKKyAgaW50IGJ5dGVtb2RlMzsKK307CisKKy8qIFVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaGVyZSBhcmUgbWFjcm9zLgorICAgJ0EnID0+IHByaW50ICdiJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKKyAgICdCJyA9PiBwcmludCAnYicgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCisgICAnRScgPT4gcHJpbnQgJ2UnIGlmIDMyLWJpdCBmb3JtIG9mIGpjeHoKKyAgICdMJyA9PiBwcmludCAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCisgICAnTicgPT4gcHJpbnQgJ24nIGlmIGluc3RydWN0aW9uIGhhcyBubyB3YWl0ICJwcmVmaXgiCisgICAnUCcgPT4gcHJpbnQgJ3cnIG9yICdsJyBpZiBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCBzaXplIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQorICAgJ1EnID0+IHByaW50ICd3JyBvciAnbCcgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCisgICAnUicgPT4gcHJpbnQgJ3cnIG9yICdsJworICAgJ1MnID0+IHByaW50ICd3JyBvciAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCisgICAnVycgPT4gcHJpbnQgJ2InIG9yICd3JworKi8KKworc3RhdGljIHN0cnVjdCBkaXMzODYgZGlzMzg2X2F0dFtdID0geworICAvKiAwMCAqLworICB7ICJhZGRCIiwJRWIsIEdiIH0sCisgIHsgImFkZFMiLAlFdiwgR3YgfSwKKyAgeyAiYWRkQiIsCUdiLCBFYiB9LAorICB7ICJhZGRTIiwJR3YsIEV2IH0sCisgIHsgImFkZEIiLAlBTCwgSWIgfSwKKyAgeyAiYWRkUyIsCWVBWCwgSXYgfSwKKyAgeyAicHVzaFAiLAllcyB9LAorICB7ICJwb3BQIiwJZXMgfSwKKyAgLyogMDggKi8KKyAgeyAib3JCIiwJRWIsIEdiIH0sCisgIHsgIm9yUyIsCUV2LCBHdiB9LAorICB7ICJvckIiLAlHYiwgRWIgfSwKKyAgeyAib3JTIiwJR3YsIEV2IH0sCisgIHsgIm9yQiIsCUFMLCBJYiB9LAorICB7ICJvclMiLAllQVgsIEl2IH0sCisgIHsgInB1c2hQIiwJY3MgfSwKKyAgeyAiKGJhZCkiIH0sCS8qIDB4MGYgZXh0ZW5kZWQgb3Bjb2RlIGVzY2FwZSAqLworICAvKiAxMCAqLworICB7ICJhZGNCIiwJRWIsIEdiIH0sCisgIHsgImFkY1MiLAlFdiwgR3YgfSwKKyAgeyAiYWRjQiIsCUdiLCBFYiB9LAorICB7ICJhZGNTIiwJR3YsIEV2IH0sCisgIHsgImFkY0IiLAlBTCwgSWIgfSwKKyAgeyAiYWRjUyIsCWVBWCwgSXYgfSwKKyAgeyAicHVzaFAiLAlzcyB9LAorICB7ICJwb3BQIiwJc3MgfSwKKyAgLyogMTggKi8KKyAgeyAic2JiQiIsCUViLCBHYiB9LAorICB7ICJzYmJTIiwJRXYsIEd2IH0sCisgIHsgInNiYkIiLAlHYiwgRWIgfSwKKyAgeyAic2JiUyIsCUd2LCBFdiB9LAorICB7ICJzYmJCIiwJQUwsIEliIH0sCisgIHsgInNiYlMiLAllQVgsIEl2IH0sCisgIHsgInB1c2hQIiwJZHMgfSwKKyAgeyAicG9wUCIsCWRzIH0sCisgIC8qIDIwICovCisgIHsgImFuZEIiLAlFYiwgR2IgfSwKKyAgeyAiYW5kUyIsCUV2LCBHdiB9LAorICB7ICJhbmRCIiwJR2IsIEViIH0sCisgIHsgImFuZFMiLAlHdiwgRXYgfSwKKyAgeyAiYW5kQiIsCUFMLCBJYiB9LAorICB7ICJhbmRTIiwJZUFYLCBJdiB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgRVMgcHJlZml4ICovCisgIHsgImRhYSIgfSwKKyAgLyogMjggKi8KKyAgeyAic3ViQiIsCUViLCBHYiB9LAorICB7ICJzdWJTIiwJRXYsIEd2IH0sCisgIHsgInN1YkIiLAlHYiwgRWIgfSwKKyAgeyAic3ViUyIsCUd2LCBFdiB9LAorICB7ICJzdWJCIiwJQUwsIEliIH0sCisgIHsgInN1YlMiLAllQVgsIEl2IH0sCisgIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBDUyBwcmVmaXggKi8KKyAgeyAiZGFzIiB9LAorICAvKiAzMCAqLworICB7ICJ4b3JCIiwJRWIsIEdiIH0sCisgIHsgInhvclMiLAlFdiwgR3YgfSwKKyAgeyAieG9yQiIsCUdiLCBFYiB9LAorICB7ICJ4b3JTIiwJR3YsIEV2IH0sCisgIHsgInhvckIiLAlBTCwgSWIgfSwKKyAgeyAieG9yUyIsCWVBWCwgSXYgfSwKKyAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIFNTIHByZWZpeCAqLworICB7ICJhYWEiIH0sCisgIC8qIDM4ICovCisgIHsgImNtcEIiLAlFYiwgR2IgfSwKKyAgeyAiY21wUyIsCUV2LCBHdiB9LAorICB7ICJjbXBCIiwJR2IsIEViIH0sCisgIHsgImNtcFMiLAlHdiwgRXYgfSwKKyAgeyAiY21wQiIsCUFMLCBJYiB9LAorICB7ICJjbXBTIiwJZUFYLCBJdiB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgRFMgcHJlZml4ICovCisgIHsgImFhcyIgfSwKKyAgLyogNDAgKi8KKyAgeyAiaW5jUyIsCWVBWCB9LAorICB7ICJpbmNTIiwJZUNYIH0sCisgIHsgImluY1MiLAllRFggfSwKKyAgeyAiaW5jUyIsCWVCWCB9LAorICB7ICJpbmNTIiwJZVNQIH0sCisgIHsgImluY1MiLAllQlAgfSwKKyAgeyAiaW5jUyIsCWVTSSB9LAorICB7ICJpbmNTIiwJZURJIH0sCisgIC8qIDQ4ICovCisgIHsgImRlY1MiLAllQVggfSwKKyAgeyAiZGVjUyIsCWVDWCB9LAorICB7ICJkZWNTIiwJZURYIH0sCisgIHsgImRlY1MiLAllQlggfSwKKyAgeyAiZGVjUyIsCWVTUCB9LAorICB7ICJkZWNTIiwJZUJQIH0sCisgIHsgImRlY1MiLAllU0kgfSwKKyAgeyAiZGVjUyIsCWVESSB9LAorICAvKiA1MCAqLworICB7ICJwdXNoUyIsCWVBWCB9LAorICB7ICJwdXNoUyIsCWVDWCB9LAorICB7ICJwdXNoUyIsCWVEWCB9LAorICB7ICJwdXNoUyIsCWVCWCB9LAorICB7ICJwdXNoUyIsCWVTUCB9LAorICB7ICJwdXNoUyIsCWVCUCB9LAorICB7ICJwdXNoUyIsCWVTSSB9LAorICB7ICJwdXNoUyIsCWVESSB9LAorICAvKiA1OCAqLworICB7ICJwb3BTIiwJZUFYIH0sCisgIHsgInBvcFMiLAllQ1ggfSwKKyAgeyAicG9wUyIsCWVEWCB9LAorICB7ICJwb3BTIiwJZUJYIH0sCisgIHsgInBvcFMiLAllU1AgfSwKKyAgeyAicG9wUyIsCWVCUCB9LAorICB7ICJwb3BTIiwJZVNJIH0sCisgIHsgInBvcFMiLAllREkgfSwKKyAgLyogNjAgKi8KKyAgeyAicHVzaGFQIiB9LAorICB7ICJwb3BhUCIgfSwKKyAgeyAiYm91bmRTIiwJR3YsIE1hIH0sCisgIHsgImFycGwiLAlFdywgR3cgfSwKKyAgeyAiKGJhZCkiIH0sCQkJLyogc2VnIGZzICovCisgIHsgIihiYWQpIiB9LAkJCS8qIHNlZyBncyAqLworICB7ICIoYmFkKSIgfSwJCQkvKiBvcCBzaXplIHByZWZpeCAqLworICB7ICIoYmFkKSIgfSwJCQkvKiBhZHIgc2l6ZSBwcmVmaXggKi8KKyAgLyogNjggKi8KKyAgeyAicHVzaFAiLAlJdiB9LAkJLyogMzg2IGJvb2sgd3JvbmcgKi8KKyAgeyAiaW11bFMiLAlHdiwgRXYsIEl2IH0sCisgIHsgInB1c2hQIiwJc0liIH0sCQkvKiBwdXNoIG9mIGJ5dGUgcmVhbGx5IHB1c2hlcyAyIG9yIDQgYnl0ZXMgKi8KKyAgeyAiaW11bFMiLAlHdiwgRXYsIHNJYiB9LAorICB7ICJpbnNiIiwJWWIsIGluZGlyRFggfSwKKyAgeyAiaW5zUiIsCVl2LCBpbmRpckRYIH0sCisgIHsgIm91dHNiIiwJaW5kaXJEWCwgWGIgfSwKKyAgeyAib3V0c1IiLAlpbmRpckRYLCBYdiB9LAorICAvKiA3MCAqLworICB7ICJqbyIsCUpiIH0sCisgIHsgImpubyIsCUpiIH0sCisgIHsgImpiIiwJSmIgfSwKKyAgeyAiamFlIiwJSmIgfSwKKyAgeyAiamUiLAlKYiB9LAorICB7ICJqbmUiLAlKYiB9LAorICB7ICJqYmUiLAlKYiB9LAorICB7ICJqYSIsCUpiIH0sCisgIC8qIDc4ICovCisgIHsgImpzIiwJSmIgfSwKKyAgeyAiam5zIiwJSmIgfSwKKyAgeyAianAiLAlKYiB9LAorICB7ICJqbnAiLAlKYiB9LAorICB7ICJqbCIsCUpiIH0sCisgIHsgImpnZSIsCUpiIH0sCisgIHsgImpsZSIsCUpiIH0sCisgIHsgImpnIiwJSmIgfSwKKyAgLyogODAgKi8KKyAgeyBHUlAxYiB9LAorICB7IEdSUDFTIH0sCisgIHsgIihiYWQpIiB9LAorICB7IEdSUDFTcyB9LAorICB7ICJ0ZXN0QiIsCUViLCBHYiB9LAorICB7ICJ0ZXN0UyIsCUV2LCBHdiB9LAorICB7ICJ4Y2hnQiIsCUViLCBHYiB9LAorICB7ICJ4Y2hnUyIsCUV2LCBHdiB9LAorICAvKiA4OCAqLworICB7ICJtb3ZCIiwJRWIsIEdiIH0sCisgIHsgIm1vdlMiLAlFdiwgR3YgfSwKKyAgeyAibW92QiIsCUdiLCBFYiB9LAorICB7ICJtb3ZTIiwJR3YsIEV2IH0sCisgIHsgIm1vdlEiLAlFdiwgU3cgfSwKKyAgeyAibGVhUyIsCUd2LCBNIH0sCisgIHsgIm1vdlEiLAlTdywgRXYgfSwKKyAgeyAicG9wUSIsCUV2IH0sCisgIC8qIDkwICovCisgIHsgIm5vcCIgfSwKKyAgeyAieGNoZ1MiLAllQ1gsIGVBWCB9LAorICB7ICJ4Y2hnUyIsCWVEWCwgZUFYIH0sCisgIHsgInhjaGdTIiwJZUJYLCBlQVggfSwKKyAgeyAieGNoZ1MiLAllU1AsIGVBWCB9LAorICB7ICJ4Y2hnUyIsCWVCUCwgZUFYIH0sCisgIHsgInhjaGdTIiwJZVNJLCBlQVggfSwKKyAgeyAieGNoZ1MiLAllREksIGVBWCB9LAorICAvKiA5OCAqLworICB7ICJjV3RSIiB9LAorICB7ICJjUnRkIiB9LAorICB7ICJsY2FsbFAiLAlBcCB9LAorICB7ICIoYmFkKSIgfSwJCS8qIGZ3YWl0ICovCisgIHsgInB1c2hmUCIgfSwKKyAgeyAicG9wZlAiIH0sCisgIHsgInNhaGYiIH0sCisgIHsgImxhaGYiIH0sCisgIC8qIGEwICovCisgIHsgIm1vdkIiLAlBTCwgT2IgfSwKKyAgeyAibW92UyIsCWVBWCwgT3YgfSwKKyAgeyAibW92QiIsCU9iLCBBTCB9LAorICB7ICJtb3ZTIiwJT3YsIGVBWCB9LAorICB7ICJtb3ZzYiIsCVliLCBYYiB9LAorICB7ICJtb3ZzUiIsCVl2LCBYdiB9LAorICB7ICJjbXBzYiIsCVhiLCBZYiB9LAorICB7ICJjbXBzUiIsCVh2LCBZdiB9LAorICAvKiBhOCAqLworICB7ICJ0ZXN0QiIsCUFMLCBJYiB9LAorICB7ICJ0ZXN0UyIsCWVBWCwgSXYgfSwKKyAgeyAic3Rvc0IiLAlZYiwgQUwgfSwKKyAgeyAic3Rvc1MiLAlZdiwgZUFYIH0sCisgIHsgImxvZHNCIiwJQUwsIFhiIH0sCisgIHsgImxvZHNTIiwJZUFYLCBYdiB9LAorICB7ICJzY2FzQiIsCUFMLCBZYiB9LAorICB7ICJzY2FzUyIsCWVBWCwgWXYgfSwKKyAgLyogYjAgKi8KKyAgeyAibW92QiIsCUFMLCBJYiB9LAorICB7ICJtb3ZCIiwJQ0wsIEliIH0sCisgIHsgIm1vdkIiLAlETCwgSWIgfSwKKyAgeyAibW92QiIsCUJMLCBJYiB9LAorICB7ICJtb3ZCIiwJQUgsIEliIH0sCisgIHsgIm1vdkIiLAlDSCwgSWIgfSwKKyAgeyAibW92QiIsCURILCBJYiB9LAorICB7ICJtb3ZCIiwJQkgsIEliIH0sCisgIC8qIGI4ICovCisgIHsgIm1vdlMiLAllQVgsIEl2IH0sCisgIHsgIm1vdlMiLAllQ1gsIEl2IH0sCisgIHsgIm1vdlMiLAllRFgsIEl2IH0sCisgIHsgIm1vdlMiLAllQlgsIEl2IH0sCisgIHsgIm1vdlMiLAllU1AsIEl2IH0sCisgIHsgIm1vdlMiLAllQlAsIEl2IH0sCisgIHsgIm1vdlMiLAllU0ksIEl2IH0sCisgIHsgIm1vdlMiLAllREksIEl2IH0sCisgIC8qIGMwICovCisgIHsgR1JQMmIgfSwKKyAgeyBHUlAyUyB9LAorICB7ICJyZXRQIiwJSXcgfSwKKyAgeyAicmV0UCIgfSwKKyAgeyAibGVzUyIsCUd2LCBNcCB9LAorICB7ICJsZHNTIiwJR3YsIE1wIH0sCisgIHsgIm1vdkEiLAlFYiwgSWIgfSwKKyAgeyAibW92USIsCUV2LCBJdiB9LAorICAvKiBjOCAqLworICB7ICJlbnRlclAiLAlJdywgSWIgfSwKKyAgeyAibGVhdmVQIiB9LAorICB7ICJscmV0UCIsCUl3IH0sCisgIHsgImxyZXRQIiB9LAorICB7ICJpbnQzIiB9LAorICB7ICJpbnQiLAlJYiB9LAorICB7ICJpbnRvIiB9LAorICB7ICJpcmV0UCIgfSwKKyAgLyogZDAgKi8KKyAgeyBHUlAyYl9vbmUgfSwKKyAgeyBHUlAyU19vbmUgfSwKKyAgeyBHUlAyYl9jbCB9LAorICB7IEdSUDJTX2NsIH0sCisgIHsgImFhbSIsCXNJYiB9LAorICB7ICJhYWQiLAlzSWIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgInhsYXQiLAlEU0JYIH0sCisgIC8qIGQ4ICovCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICAvKiBlMCAqLworICB7ICJsb29wbmUiLAlKYiB9LAorICB7ICJsb29wZSIsCUpiIH0sCisgIHsgImxvb3AiLAlKYiB9LAorICB7ICJqRWN4eiIsCUpiIH0sCisgIHsgImluQiIsCUFMLCBJYiB9LAorICB7ICJpblMiLAllQVgsIEliIH0sCisgIHsgIm91dEIiLAlJYiwgQUwgfSwKKyAgeyAib3V0UyIsCUliLCBlQVggfSwKKyAgLyogZTggKi8KKyAgeyAiY2FsbFAiLAlBdiB9LAorICB7ICJqbXBQIiwJSnYgfSwKKyAgeyAibGptcFAiLAlBcCB9LAorICB7ICJqbXAiLAlKYiB9LAorICB7ICJpbkIiLAlBTCwgaW5kaXJEWCB9LAorICB7ICJpblMiLAllQVgsIGluZGlyRFggfSwKKyAgeyAib3V0QiIsCWluZGlyRFgsIEFMIH0sCisgIHsgIm91dFMiLAlpbmRpckRYLCBlQVggfSwKKyAgLyogZjAgKi8KKyAgeyAiKGJhZCkiIH0sCQkJLyogbG9jayBwcmVmaXggKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAkJCS8qIHJlcG5lICovCisgIHsgIihiYWQpIiB9LAkJCS8qIHJlcHogKi8KKyAgeyAiaGx0IiB9LAorICB7ICJjbWMiIH0sCisgIHsgR1JQM2IgfSwKKyAgeyBHUlAzUyB9LAorICAvKiBmOCAqLworICB7ICJjbGMiIH0sCisgIHsgInN0YyIgfSwKKyAgeyAiY2xpIiB9LAorICB7ICJzdGkiIH0sCisgIHsgImNsZCIgfSwKKyAgeyAic3RkIiB9LAorICB7IEdSUDQgfSwKKyAgeyBHUlA1IH0sCit9OworCitzdGF0aWMgc3RydWN0IGRpczM4NiBkaXMzODZfaW50ZWxbXSA9IHsKKyAgLyogMDAgKi8KKyAgeyAiYWRkQiIsCUViLCBHYiB9LAorICB7ICJhZGRTIiwJRXYsIEd2IH0sCisgIHsgImFkZEIiLAlHYiwgRWIgfSwKKyAgeyAiYWRkUyIsCUd2LCBFdiB9LAorICB7ICJhZGRCIiwJQUwsIEliIH0sCisgIHsgImFkZFMiLAllQVgsIEl2IH0sCisgIHsgInB1c2hQIiwJZXMgfSwKKyAgeyAicG9wUCIsCWVzIH0sCisgIC8qIDA4ICovCisgIHsgIm9yQiIsCUViLCBHYiB9LAorICB7ICJvclMiLAlFdiwgR3YgfSwKKyAgeyAib3JCIiwJR2IsIEViIH0sCisgIHsgIm9yUyIsCUd2LCBFdiB9LAorICB7ICJvckIiLAlBTCwgSWIgfSwKKyAgeyAib3JTIiwJZUFYLCBJdiB9LAorICB7ICJwdXNoUCIsCWNzIH0sCisgIHsgIihiYWQpIiB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KKyAgLyogMTAgKi8KKyAgeyAiYWRjQiIsCUViLCBHYiB9LAorICB7ICJhZGNTIiwJRXYsIEd2IH0sCisgIHsgImFkY0IiLAlHYiwgRWIgfSwKKyAgeyAiYWRjUyIsCUd2LCBFdiB9LAorICB7ICJhZGNCIiwJQUwsIEliIH0sCisgIHsgImFkY1MiLAllQVgsIEl2IH0sCisgIHsgInB1c2hQIiwJc3MgfSwKKyAgeyAicG9wUCIsCXNzIH0sCisgIC8qIDE4ICovCisgIHsgInNiYkIiLAlFYiwgR2IgfSwKKyAgeyAic2JiUyIsCUV2LCBHdiB9LAorICB7ICJzYmJCIiwJR2IsIEViIH0sCisgIHsgInNiYlMiLAlHdiwgRXYgfSwKKyAgeyAic2JiQiIsCUFMLCBJYiB9LAorICB7ICJzYmJTIiwJZUFYLCBJdiB9LAorICB7ICJwdXNoUCIsCWRzIH0sCisgIHsgInBvcFAiLAlkcyB9LAorICAvKiAyMCAqLworICB7ICJhbmRCIiwJRWIsIEdiIH0sCisgIHsgImFuZFMiLAlFdiwgR3YgfSwKKyAgeyAiYW5kQiIsCUdiLCBFYiB9LAorICB7ICJhbmRTIiwJR3YsIEV2IH0sCisgIHsgImFuZEIiLAlBTCwgSWIgfSwKKyAgeyAiYW5kUyIsCWVBWCwgSXYgfSwKKyAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIEVTIHByZWZpeCAqLworICB7ICJkYWEiIH0sCisgIC8qIDI4ICovCisgIHsgInN1YkIiLAlFYiwgR2IgfSwKKyAgeyAic3ViUyIsCUV2LCBHdiB9LAorICB7ICJzdWJCIiwJR2IsIEViIH0sCisgIHsgInN1YlMiLAlHdiwgRXYgfSwKKyAgeyAic3ViQiIsCUFMLCBJYiB9LAorICB7ICJzdWJTIiwJZUFYLCBJdiB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgQ1MgcHJlZml4ICovCisgIHsgImRhcyIgfSwKKyAgLyogMzAgKi8KKyAgeyAieG9yQiIsCUViLCBHYiB9LAorICB7ICJ4b3JTIiwJRXYsIEd2IH0sCisgIHsgInhvckIiLAlHYiwgRWIgfSwKKyAgeyAieG9yUyIsCUd2LCBFdiB9LAorICB7ICJ4b3JCIiwJQUwsIEliIH0sCisgIHsgInhvclMiLAllQVgsIEl2IH0sCisgIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBTUyBwcmVmaXggKi8KKyAgeyAiYWFhIiB9LAorICAvKiAzOCAqLworICB7ICJjbXBCIiwJRWIsIEdiIH0sCisgIHsgImNtcFMiLAlFdiwgR3YgfSwKKyAgeyAiY21wQiIsCUdiLCBFYiB9LAorICB7ICJjbXBTIiwJR3YsIEV2IH0sCisgIHsgImNtcEIiLAlBTCwgSWIgfSwKKyAgeyAiY21wUyIsCWVBWCwgSXYgfSwKKyAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIERTIHByZWZpeCAqLworICB7ICJhYXMiIH0sCisgIC8qIDQwICovCisgIHsgImluY1MiLAllQVggfSwKKyAgeyAiaW5jUyIsCWVDWCB9LAorICB7ICJpbmNTIiwJZURYIH0sCisgIHsgImluY1MiLAllQlggfSwKKyAgeyAiaW5jUyIsCWVTUCB9LAorICB7ICJpbmNTIiwJZUJQIH0sCisgIHsgImluY1MiLAllU0kgfSwKKyAgeyAiaW5jUyIsCWVESSB9LAorICAvKiA0OCAqLworICB7ICJkZWNTIiwJZUFYIH0sCisgIHsgImRlY1MiLAllQ1ggfSwKKyAgeyAiZGVjUyIsCWVEWCB9LAorICB7ICJkZWNTIiwJZUJYIH0sCisgIHsgImRlY1MiLAllU1AgfSwKKyAgeyAiZGVjUyIsCWVCUCB9LAorICB7ICJkZWNTIiwJZVNJIH0sCisgIHsgImRlY1MiLAllREkgfSwKKyAgLyogNTAgKi8KKyAgeyAicHVzaFMiLAllQVggfSwKKyAgeyAicHVzaFMiLAllQ1ggfSwKKyAgeyAicHVzaFMiLAllRFggfSwKKyAgeyAicHVzaFMiLAllQlggfSwKKyAgeyAicHVzaFMiLAllU1AgfSwKKyAgeyAicHVzaFMiLAllQlAgfSwKKyAgeyAicHVzaFMiLAllU0kgfSwKKyAgeyAicHVzaFMiLAllREkgfSwKKyAgLyogNTggKi8KKyAgeyAicG9wUyIsCWVBWCB9LAorICB7ICJwb3BTIiwJZUNYIH0sCisgIHsgInBvcFMiLAllRFggfSwKKyAgeyAicG9wUyIsCWVCWCB9LAorICB7ICJwb3BTIiwJZVNQIH0sCisgIHsgInBvcFMiLAllQlAgfSwKKyAgeyAicG9wUyIsCWVTSSB9LAorICB7ICJwb3BTIiwJZURJIH0sCisgIC8qIDYwICovCisgIHsgInB1c2hhUCIgfSwKKyAgeyAicG9wYVAiIH0sCisgIHsgImJvdW5kUyIsCUd2LCBNYSB9LAorICB7ICJhcnBsIiwJRXcsIEd3IH0sCisgIHsgIihiYWQpIiB9LAkJCS8qIHNlZyBmcyAqLworICB7ICIoYmFkKSIgfSwJCQkvKiBzZWcgZ3MgKi8KKyAgeyAiKGJhZCkiIH0sCQkJLyogb3Agc2l6ZSBwcmVmaXggKi8KKyAgeyAiKGJhZCkiIH0sCQkJLyogYWRyIHNpemUgcHJlZml4ICovCisgIC8qIDY4ICovCisgIHsgInB1c2hQIiwJSXYgfSwJCS8qIDM4NiBib29rIHdyb25nICovCisgIHsgImltdWxTIiwJR3YsIEV2LCBJdiB9LAorICB7ICJwdXNoUCIsCXNJYiB9LAkJLyogcHVzaCBvZiBieXRlIHJlYWxseSBwdXNoZXMgMiBvciA0IGJ5dGVzICovCisgIHsgImltdWxTIiwJR3YsIEV2LCBzSWIgfSwKKyAgeyAiaW5zYiIsCVliLCBpbmRpckRYIH0sCisgIHsgImluc1IiLAlZdiwgaW5kaXJEWCB9LAorICB7ICJvdXRzYiIsCWluZGlyRFgsIFhiIH0sCisgIHsgIm91dHNSIiwJaW5kaXJEWCwgWHYgfSwKKyAgLyogNzAgKi8KKyAgeyAiam8iLAlKYiB9LAorICB7ICJqbm8iLAlKYiB9LAorICB7ICJqYiIsCUpiIH0sCisgIHsgImphZSIsCUpiIH0sCisgIHsgImplIiwJSmIgfSwKKyAgeyAiam5lIiwJSmIgfSwKKyAgeyAiamJlIiwJSmIgfSwKKyAgeyAiamEiLAlKYiB9LAorICAvKiA3OCAqLworICB7ICJqcyIsCUpiIH0sCisgIHsgImpucyIsCUpiIH0sCisgIHsgImpwIiwJSmIgfSwKKyAgeyAiam5wIiwJSmIgfSwKKyAgeyAiamwiLAlKYiB9LAorICB7ICJqZ2UiLAlKYiB9LAorICB7ICJqbGUiLAlKYiB9LAorICB7ICJqZyIsCUpiIH0sCisgIC8qIDgwICovCisgIHsgR1JQMWIgfSwKKyAgeyBHUlAxUyB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyBHUlAxU3MgfSwKKyAgeyAidGVzdEIiLAlFYiwgR2IgfSwKKyAgeyAidGVzdFMiLAlFdiwgR3YgfSwKKyAgeyAieGNoZ0IiLAlFYiwgR2IgfSwKKyAgeyAieGNoZ1MiLAlFdiwgR3YgfSwKKyAgLyogODggKi8KKyAgeyAibW92QiIsCUViLCBHYiB9LAorICB7ICJtb3ZTIiwJRXYsIEd2IH0sCisgIHsgIm1vdkIiLAlHYiwgRWIgfSwKKyAgeyAibW92UyIsCUd2LCBFdiB9LAorICB7ICJtb3ZRIiwJRXYsIFN3IH0sCisgIHsgImxlYVMiLAlHdiwgTSB9LAorICB7ICJtb3ZRIiwJU3csIEV2IH0sCisgIHsgInBvcFEiLAlFdiB9LAorICAvKiA5MCAqLworICB7ICJub3AiIH0sCisgIHsgInhjaGdTIiwJZUNYLCBlQVggfSwKKyAgeyAieGNoZ1MiLAllRFgsIGVBWCB9LAorICB7ICJ4Y2hnUyIsCWVCWCwgZUFYIH0sCisgIHsgInhjaGdTIiwJZVNQLCBlQVggfSwKKyAgeyAieGNoZ1MiLAllQlAsIGVBWCB9LAorICB7ICJ4Y2hnUyIsCWVTSSwgZUFYIH0sCisgIHsgInhjaGdTIiwJZURJLCBlQVggfSwKKyAgLyogOTggKi8KKyAgeyAiY1d0UiIgfSwKKyAgeyAiY1J0ZCIgfSwKKyAgeyAibGNhbGxQIiwJQXAgfSwKKyAgeyAiKGJhZCkiIH0sCQkvKiBmd2FpdCAqLworICB7ICJwdXNoZlAiIH0sCisgIHsgInBvcGZQIiB9LAorICB7ICJzYWhmIiB9LAorICB7ICJsYWhmIiB9LAorICAvKiBhMCAqLworICB7ICJtb3ZCIiwJQUwsIE9iIH0sCisgIHsgIm1vdlMiLAllQVgsIE92IH0sCisgIHsgIm1vdkIiLAlPYiwgQUwgfSwKKyAgeyAibW92UyIsCU92LCBlQVggfSwKKyAgeyAibW92c2IiLAlZYiwgWGIgfSwKKyAgeyAibW92c1IiLAlZdiwgWHYgfSwKKyAgeyAiY21wc2IiLAlYYiwgWWIgfSwKKyAgeyAiY21wc1IiLAlYdiwgWXYgfSwKKyAgLyogYTggKi8KKyAgeyAidGVzdEIiLAlBTCwgSWIgfSwKKyAgeyAidGVzdFMiLAllQVgsIEl2IH0sCisgIHsgInN0b3NCIiwJWWIsIEFMIH0sCisgIHsgInN0b3NTIiwJWXYsIGVBWCB9LAorICB7ICJsb2RzQiIsCUFMLCBYYiB9LAorICB7ICJsb2RzUyIsCWVBWCwgWHYgfSwKKyAgeyAic2Nhc0IiLAlBTCwgWWIgfSwKKyAgeyAic2Nhc1MiLAllQVgsIFl2IH0sCisgIC8qIGIwICovCisgIHsgIm1vdkIiLAlBTCwgSWIgfSwKKyAgeyAibW92QiIsCUNMLCBJYiB9LAorICB7ICJtb3ZCIiwJREwsIEliIH0sCisgIHsgIm1vdkIiLAlCTCwgSWIgfSwKKyAgeyAibW92QiIsCUFILCBJYiB9LAorICB7ICJtb3ZCIiwJQ0gsIEliIH0sCisgIHsgIm1vdkIiLAlESCwgSWIgfSwKKyAgeyAibW92QiIsCUJILCBJYiB9LAorICAvKiBiOCAqLworICB7ICJtb3ZTIiwJZUFYLCBJdiB9LAorICB7ICJtb3ZTIiwJZUNYLCBJdiB9LAorICB7ICJtb3ZTIiwJZURYLCBJdiB9LAorICB7ICJtb3ZTIiwJZUJYLCBJdiB9LAorICB7ICJtb3ZTIiwJZVNQLCBJdiB9LAorICB7ICJtb3ZTIiwJZUJQLCBJdiB9LAorICB7ICJtb3ZTIiwJZVNJLCBJdiB9LAorICB7ICJtb3ZTIiwJZURJLCBJdiB9LAorICAvKiBjMCAqLworICB7IEdSUDJiIH0sCisgIHsgR1JQMlMgfSwKKyAgeyAicmV0UCIsCUl3IH0sCisgIHsgInJldFAiIH0sCisgIHsgImxlc1MiLAlHdiwgTXAgfSwKKyAgeyAibGRzUyIsCUd2LCBNcCB9LAorICB7ICJtb3ZBIiwJRWIsIEliIH0sCisgIHsgIm1vdlEiLAlFdiwgSXYgfSwKKyAgLyogYzggKi8KKyAgeyAiZW50ZXJQIiwJSXcsIEliIH0sCisgIHsgImxlYXZlUCIgfSwKKyAgeyAibHJldFAiLAlJdyB9LAorICB7ICJscmV0UCIgfSwKKyAgeyAiaW50MyIgfSwKKyAgeyAiaW50IiwJSWIgfSwKKyAgeyAiaW50byIgfSwKKyAgeyAiaXJldFAiIH0sCisgIC8qIGQwICovCisgIHsgR1JQMmJfb25lIH0sCisgIHsgR1JQMlNfb25lIH0sCisgIHsgR1JQMmJfY2wgfSwKKyAgeyBHUlAyU19jbCB9LAorICB7ICJhYW0iLAlzSWIgfSwKKyAgeyAiYWFkIiwJc0liIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJ4bGF0IiwJRFNCWCB9LAorICAvKiBkOCAqLworICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgLyogZTAgKi8KKyAgeyAibG9vcG5lIiwJSmIgfSwKKyAgeyAibG9vcGUiLAlKYiB9LAorICB7ICJsb29wIiwJSmIgfSwKKyAgeyAiakVjeHoiLAlKYiB9LAorICB7ICJpbkIiLAlBTCwgSWIgfSwKKyAgeyAiaW5TIiwJZUFYLCBJYiB9LAorICB7ICJvdXRCIiwJSWIsIEFMIH0sCisgIHsgIm91dFMiLAlJYiwgZUFYIH0sCisgIC8qIGU4ICovCisgIHsgImNhbGxQIiwJQXYgfSwKKyAgeyAiam1wUCIsCUp2IH0sCisgIHsgImxqbXBQIiwJQXAgfSwKKyAgeyAiam1wIiwJSmIgfSwKKyAgeyAiaW5CIiwJQUwsIGluZGlyRFggfSwKKyAgeyAiaW5TIiwJZUFYLCBpbmRpckRYIH0sCisgIHsgIm91dEIiLAlpbmRpckRYLCBBTCB9LAorICB7ICJvdXRTIiwJaW5kaXJEWCwgZUFYIH0sCisgIC8qIGYwICovCisgIHsgIihiYWQpIiB9LAkJCS8qIGxvY2sgcHJlZml4ICovCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiByZXBuZSAqLworICB7ICIoYmFkKSIgfSwJCQkvKiByZXB6ICovCisgIHsgImhsdCIgfSwKKyAgeyAiY21jIiB9LAorICB7IEdSUDNiIH0sCisgIHsgR1JQM1MgfSwKKyAgLyogZjggKi8KKyAgeyAiY2xjIiB9LAorICB7ICJzdGMiIH0sCisgIHsgImNsaSIgfSwKKyAgeyAic3RpIiB9LAorICB7ICJjbGQiIH0sCisgIHsgInN0ZCIgfSwKKyAgeyBHUlA0IH0sCisgIHsgR1JQNSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfYXR0W10gPSB7CisgIC8qIDAwICovCisgIHsgR1JQNiB9LAorICB7IEdSUDcgfSwKKyAgeyAibGFyUyIsIEd2LCBFdyB9LAorICB7ICJsc2xTIiwgR3YsIEV3IH0sCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAiY2x0cyIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIC8qIDA4ICovCisgIHsgImludmQiIH0sCisgIHsgIndiaW52ZCIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgInVkMmEiIH0sCisgIHsgIihiYWQpIiB9LAorICB7IEdSUDE0IH0sCisgIHsgImZlbW1zIiB9LAorICB7ICIiLCBNWCwgRU0sIE9QU1VGIH0sIC8qIFNlZSBPUF8zRE5vd1N1ZmZpeCAqLworICAvKiAxMCAqLworICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIDE4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgLyogMjAgKi8KKyAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCisgIHsgIm1vdkwiLCBSZCwgQ2QgfSwKKyAgeyAibW92TCIsIFJkLCBEZCB9LAorICB7ICJtb3ZMIiwgQ2QsIFJkIH0sCisgIHsgIm1vdkwiLCBEZCwgUmQgfSwKKyAgeyAibW92TCIsIFJkLCBUZCB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAibW92TCIsIFRkLCBSZCB9LAorICB7ICIoYmFkKSIgfSwKKyAgLyogMjggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiAzMCAqLworICB7ICJ3cm1zciIgfSwgIHsgInJkdHNjIiB9LCAgeyAicmRtc3IiIH0sICB7ICJyZHBtYyIgfSwKKyAgeyAic3lzZW50ZXIiIH0sICB7ICJzeXNleGl0IiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgLyogMzggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiA0MCAqLworICB7ICJjbW92byIsIEd2LEV2IH0sIHsgImNtb3ZubyIsIEd2LEV2IH0sIHsgImNtb3ZiIiwgR3YsRXYgfSwgeyAiY21vdmFlIiwgR3YsRXYgfSwKKyAgeyAiY21vdmUiLCBHdixFdiB9LCB7ICJjbW92bmUiLCBHdixFdiB9LCB7ICJjbW92YmUiLCBHdixFdiB9LCB7ICJjbW92YSIsIEd2LEV2IH0sCisgIC8qIDQ4ICovCisgIHsgImNtb3ZzIiwgR3YsRXYgfSwgeyAiY21vdm5zIiwgR3YsRXYgfSwgeyAiY21vdnAiLCBHdixFdiB9LCB7ICJjbW92bnAiLCBHdixFdiB9LAorICB7ICJjbW92bCIsIEd2LEV2IH0sIHsgImNtb3ZnZSIsIEd2LEV2IH0sIHsgImNtb3ZsZSIsIEd2LEV2IH0sIHsgImNtb3ZnIiwgR3YsRXYgfSwKKyAgLyogNTAgKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiA1OCAqLworICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIDYwICovCisgIHsgInB1bnBja2xidyIsIE1YLCBFTSB9LAorICB7ICJwdW5wY2tsd2QiLCBNWCwgRU0gfSwKKyAgeyAicHVucGNrbGRxIiwgTVgsIEVNIH0sCisgIHsgInBhY2tzc3diIiwgTVgsIEVNIH0sCisgIHsgInBjbXBndGIiLCBNWCwgRU0gfSwKKyAgeyAicGNtcGd0dyIsIE1YLCBFTSB9LAorICB7ICJwY21wZ3RkIiwgTVgsIEVNIH0sCisgIHsgInBhY2t1c3diIiwgTVgsIEVNIH0sCisgIC8qIDY4ICovCisgIHsgInB1bnBja2hidyIsIE1YLCBFTSB9LAorICB7ICJwdW5wY2tod2QiLCBNWCwgRU0gfSwKKyAgeyAicHVucGNraGRxIiwgTVgsIEVNIH0sCisgIHsgInBhY2tzc2R3IiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIm1vdmQiLCBNWCwgRXYgfSwKKyAgeyAibW92cSIsIE1YLCBFTSB9LAorICAvKiA3MCAqLworICB7ICIoYmFkKSIgfSwKKyAgeyBHUlAxMCB9LAorICB7IEdSUDExIH0sCisgIHsgR1JQMTIgfSwKKyAgeyAicGNtcGVxYiIsIE1YLCBFTSB9LAorICB7ICJwY21wZXF3IiwgTVgsIEVNIH0sCisgIHsgInBjbXBlcWQiLCBNWCwgRU0gfSwKKyAgeyAiZW1tcyIgfSwKKyAgLyogNzggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIm1vdmQiLCBFdiwgTVggfSwKKyAgeyAibW92cSIsIEVNLCBNWCB9LAorICAvKiA4MCAqLworICB7ICJqbyIsIEp2IH0sCisgIHsgImpubyIsIEp2IH0sCisgIHsgImpiIiwgSnYgfSwKKyAgeyAiamFlIiwgSnYgfSwKKyAgeyAiamUiLCBKdiB9LAorICB7ICJqbmUiLCBKdiB9LAorICB7ICJqYmUiLCBKdiB9LAorICB7ICJqYSIsIEp2IH0sCisgIC8qIDg4ICovCisgIHsgImpzIiwgSnYgfSwKKyAgeyAiam5zIiwgSnYgfSwKKyAgeyAianAiLCBKdiB9LAorICB7ICJqbnAiLCBKdiB9LAorICB7ICJqbCIsIEp2IH0sCisgIHsgImpnZSIsIEp2IH0sCisgIHsgImpsZSIsIEp2IH0sCisgIHsgImpnIiwgSnYgfSwKKyAgLyogOTAgKi8KKyAgeyAic2V0byIsIEViIH0sCisgIHsgInNldG5vIiwgRWIgfSwKKyAgeyAic2V0YiIsIEViIH0sCisgIHsgInNldGFlIiwgRWIgfSwKKyAgeyAic2V0ZSIsIEViIH0sCisgIHsgInNldG5lIiwgRWIgfSwKKyAgeyAic2V0YmUiLCBFYiB9LAorICB7ICJzZXRhIiwgRWIgfSwKKyAgLyogOTggKi8KKyAgeyAic2V0cyIsIEViIH0sCisgIHsgInNldG5zIiwgRWIgfSwKKyAgeyAic2V0cCIsIEViIH0sCisgIHsgInNldG5wIiwgRWIgfSwKKyAgeyAic2V0bCIsIEViIH0sCisgIHsgInNldGdlIiwgRWIgfSwKKyAgeyAic2V0bGUiLCBFYiB9LAorICB7ICJzZXRnIiwgRWIgfSwKKyAgLyogYTAgKi8KKyAgeyAicHVzaFAiLCBmcyB9LAorICB7ICJwb3BQIiwgZnMgfSwKKyAgeyAiY3B1aWQiIH0sCisgIHsgImJ0UyIsIEV2LCBHdiB9LAorICB7ICJzaGxkUyIsIEV2LCBHdiwgSWIgfSwKKyAgeyAic2hsZFMiLCBFdiwgR3YsIENMIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgLyogYTggKi8KKyAgeyAicHVzaFAiLCBncyB9LAorICB7ICJwb3BQIiwgZ3MgfSwKKyAgeyAicnNtIiB9LAorICB7ICJidHNTIiwgRXYsIEd2IH0sCisgIHsgInNocmRTIiwgRXYsIEd2LCBJYiB9LAorICB7ICJzaHJkUyIsIEV2LCBHdiwgQ0wgfSwKKyAgeyBHUlAxMyB9LAorICB7ICJpbXVsUyIsIEd2LCBFdiB9LAorICAvKiBiMCAqLworICB7ICJjbXB4Y2hnQiIsIEViLCBHYiB9LAorICB7ICJjbXB4Y2hnUyIsIEV2LCBHdiB9LAorICB7ICJsc3NTIiwgR3YsIE1wIH0sCS8qIDM4NiBsaXN0cyBvbmx5IE1wICovCisgIHsgImJ0clMiLCBFdiwgR3YgfSwKKyAgeyAibGZzUyIsIEd2LCBNcCB9LAkvKiAzODYgbGlzdHMgb25seSBNcCAqLworICB7ICJsZ3NTIiwgR3YsIE1wIH0sCS8qIDM4NiBsaXN0cyBvbmx5IE1wICovCisgIHsgIm1vdnpiUiIsIEd2LCBFYiB9LAorICB7ICJtb3Z6d1IiLCBHdiwgRXcgfSwgLyogeWVzLCB0aGVyZSByZWFsbHkgaXMgbW92end3ICEgKi8KKyAgLyogYjggKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgInVkMmIiIH0sCisgIHsgR1JQOCB9LAorICB7ICJidGNTIiwgRXYsIEd2IH0sCisgIHsgImJzZlMiLCBHdiwgRXYgfSwKKyAgeyAiYnNyUyIsIEd2LCBFdiB9LAorICB7ICJtb3ZzYlIiLCBHdiwgRWIgfSwKKyAgeyAibW92c3dSIiwgR3YsIEV3IH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnN3dyAhICovCisgIC8qIGMwICovCisgIHsgInhhZGRCIiwgRWIsIEdiIH0sCisgIHsgInhhZGRTIiwgRXYsIEd2IH0sCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyBHUlA5IH0sCisgIC8qIGM4ICovCisgIHsgImJzd2FwIiwgZUFYIH0sCS8qIGJzd2FwIGRvZXNuJ3Qgc3VwcG9ydCAxNiBiaXQgcmVncyAqLworICB7ICJic3dhcCIsIGVDWCB9LAorICB7ICJic3dhcCIsIGVEWCB9LAorICB7ICJic3dhcCIsIGVCWCB9LAorICB7ICJic3dhcCIsIGVTUCB9LAorICB7ICJic3dhcCIsIGVCUCB9LAorICB7ICJic3dhcCIsIGVTSSB9LAorICB7ICJic3dhcCIsIGVESSB9LAorICAvKiBkMCAqLworICB7ICIoYmFkKSIgfSwKKyAgeyAicHNybHciLCBNWCwgRU0gfSwKKyAgeyAicHNybGQiLCBNWCwgRU0gfSwKKyAgeyAicHNybHEiLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgInBtdWxsdyIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiBkOCAqLworICB7ICJwc3VidXNiIiwgTVgsIEVNIH0sCisgIHsgInBzdWJ1c3ciLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgInBhbmQiLCBNWCwgRU0gfSwKKyAgeyAicGFkZHVzYiIsIE1YLCBFTSB9LAorICB7ICJwYWRkdXN3IiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJwYW5kbiIsIE1YLCBFTSB9LAorICAvKiBlMCAqLworICB7ICIoYmFkKSIgfSwKKyAgeyAicHNyYXciLCBNWCwgRU0gfSwKKyAgeyAicHNyYWQiLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJwbXVsaHciLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgLyogZTggKi8KKyAgeyAicHN1YnNiIiwgTVgsIEVNIH0sCisgIHsgInBzdWJzdyIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAicG9yIiwgTVgsIEVNIH0sCisgIHsgInBhZGRzYiIsIE1YLCBFTSB9LAorICB7ICJwYWRkc3ciLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgInB4b3IiLCBNWCwgRU0gfSwKKyAgLyogZjAgKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgInBzbGx3IiwgTVgsIEVNIH0sCisgIHsgInBzbGxkIiwgTVgsIEVNIH0sCisgIHsgInBzbGxxIiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJwbWFkZHdkIiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIGY4ICovCisgIHsgInBzdWJiIiwgTVgsIEVNIH0sCisgIHsgInBzdWJ3IiwgTVgsIEVNIH0sCisgIHsgInBzdWJkIiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJwYWRkYiIsIE1YLCBFTSB9LAorICB7ICJwYWRkdyIsIE1YLCBFTSB9LAorICB7ICJwYWRkZCIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfQorfTsKKworc3RhdGljIHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfaW50ZWxbXSA9IHsKKyAgLyogMDAgKi8KKyAgeyBHUlA2IH0sCisgIHsgR1JQNyB9LAorICB7ICJsYXJTIiwgR3YsIEV3IH0sCisgIHsgImxzbFMiLCBHdiwgRXcgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJjbHRzIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgLyogMDggKi8KKyAgeyAiaW52ZCIgfSwKKyAgeyAid2JpbnZkIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAidWQyYSIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgR1JQMTQgfSwKKyAgeyAiZmVtbXMiIH0sCisgIHsgIiIsIE1YLCBFTSwgT1BTVUYgfSwgLyogU2VlIE9QXzNETm93U3VmZml4ICovCisgIC8qIDEwICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgLyogMTggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiAyMCAqLworICAvKiB0aGVzZSBhcmUgYWxsIGJhY2t3YXJkIGluIGFwcGVuZGl4IEEgb2YgdGhlIGludGVsIGJvb2sgKi8KKyAgeyAibW92TCIsIFJkLCBDZCB9LAorICB7ICJtb3ZMIiwgUmQsIERkIH0sCisgIHsgIm1vdkwiLCBDZCwgUmQgfSwKKyAgeyAibW92TCIsIERkLCBSZCB9LAorICB7ICJtb3ZMIiwgUmQsIFRkIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJtb3ZMIiwgVGQsIFJkIH0sCisgIHsgIihiYWQpIiB9LAorICAvKiAyOCAqLworICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIDMwICovCisgIHsgIndybXNyIiB9LCAgeyAicmR0c2MiIH0sICB7ICJyZG1zciIgfSwgIHsgInJkcG1jIiB9LAorICB7ICJzeXNlbnRlciIgfSwgIHsgInN5c2V4aXQiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiAzOCAqLworICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIDQwICovCisgIHsgImNtb3ZvIiwgR3YsRXYgfSwgeyAiY21vdm5vIiwgR3YsRXYgfSwgeyAiY21vdmIiLCBHdixFdiB9LCB7ICJjbW92YWUiLCBHdixFdiB9LAorICB7ICJjbW92ZSIsIEd2LEV2IH0sIHsgImNtb3ZuZSIsIEd2LEV2IH0sIHsgImNtb3ZiZSIsIEd2LEV2IH0sIHsgImNtb3ZhIiwgR3YsRXYgfSwKKyAgLyogNDggKi8KKyAgeyAiY21vdnMiLCBHdixFdiB9LCB7ICJjbW92bnMiLCBHdixFdiB9LCB7ICJjbW92cCIsIEd2LEV2IH0sIHsgImNtb3ZucCIsIEd2LEV2IH0sCisgIHsgImNtb3ZsIiwgR3YsRXYgfSwgeyAiY21vdmdlIiwgR3YsRXYgfSwgeyAiY21vdmxlIiwgR3YsRXYgfSwgeyAiY21vdmciLCBHdixFdiB9LAorICAvKiA1MCAqLworICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIDU4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgLyogNjAgKi8KKyAgeyAicHVucGNrbGJ3IiwgTVgsIEVNIH0sCisgIHsgInB1bnBja2x3ZCIsIE1YLCBFTSB9LAorICB7ICJwdW5wY2tsZHEiLCBNWCwgRU0gfSwKKyAgeyAicGFja3Nzd2IiLCBNWCwgRU0gfSwKKyAgeyAicGNtcGd0YiIsIE1YLCBFTSB9LAorICB7ICJwY21wZ3R3IiwgTVgsIEVNIH0sCisgIHsgInBjbXBndGQiLCBNWCwgRU0gfSwKKyAgeyAicGFja3Vzd2IiLCBNWCwgRU0gfSwKKyAgLyogNjggKi8KKyAgeyAicHVucGNraGJ3IiwgTVgsIEVNIH0sCisgIHsgInB1bnBja2h3ZCIsIE1YLCBFTSB9LAorICB7ICJwdW5wY2toZHEiLCBNWCwgRU0gfSwKKyAgeyAicGFja3NzZHciLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAibW92ZCIsIE1YLCBFdiB9LAorICB7ICJtb3ZxIiwgTVgsIEVNIH0sCisgIC8qIDcwICovCisgIHsgIihiYWQpIiB9LAorICB7IEdSUDEwIH0sCisgIHsgR1JQMTEgfSwKKyAgeyBHUlAxMiB9LAorICB7ICJwY21wZXFiIiwgTVgsIEVNIH0sCisgIHsgInBjbXBlcXciLCBNWCwgRU0gfSwKKyAgeyAicGNtcGVxZCIsIE1YLCBFTSB9LAorICB7ICJlbW1zIiB9LAorICAvKiA3OCAqLworICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgeyAibW92ZCIsIEV2LCBNWCB9LAorICB7ICJtb3ZxIiwgRU0sIE1YIH0sCisgIC8qIDgwICovCisgIHsgImpvIiwgSnYgfSwKKyAgeyAiam5vIiwgSnYgfSwKKyAgeyAiamIiLCBKdiB9LAorICB7ICJqYWUiLCBKdiB9LAorICB7ICJqZSIsIEp2IH0sCisgIHsgImpuZSIsIEp2IH0sCisgIHsgImpiZSIsIEp2IH0sCisgIHsgImphIiwgSnYgfSwKKyAgLyogODggKi8KKyAgeyAianMiLCBKdiB9LAorICB7ICJqbnMiLCBKdiB9LAorICB7ICJqcCIsIEp2IH0sCisgIHsgImpucCIsIEp2IH0sCisgIHsgImpsIiwgSnYgfSwKKyAgeyAiamdlIiwgSnYgfSwKKyAgeyAiamxlIiwgSnYgfSwKKyAgeyAiamciLCBKdiB9LAorICAvKiA5MCAqLworICB7ICJzZXRvIiwgRWIgfSwKKyAgeyAic2V0bm8iLCBFYiB9LAorICB7ICJzZXRiIiwgRWIgfSwKKyAgeyAic2V0YWUiLCBFYiB9LAorICB7ICJzZXRlIiwgRWIgfSwKKyAgeyAic2V0bmUiLCBFYiB9LAorICB7ICJzZXRiZSIsIEViIH0sCisgIHsgInNldGEiLCBFYiB9LAorICAvKiA5OCAqLworICB7ICJzZXRzIiwgRWIgfSwKKyAgeyAic2V0bnMiLCBFYiB9LAorICB7ICJzZXRwIiwgRWIgfSwKKyAgeyAic2V0bnAiLCBFYiB9LAorICB7ICJzZXRsIiwgRWIgfSwKKyAgeyAic2V0Z2UiLCBFYiB9LAorICB7ICJzZXRsZSIsIEViIH0sCisgIHsgInNldGciLCBFYiB9LAorICAvKiBhMCAqLworICB7ICJwdXNoUCIsIGZzIH0sCisgIHsgInBvcFAiLCBmcyB9LAorICB7ICJjcHVpZCIgfSwKKyAgeyAiYnRTIiwgRXYsIEd2IH0sCisgIHsgInNobGRTIiwgRXYsIEd2LCBJYiB9LAorICB7ICJzaGxkUyIsIEV2LCBHdiwgQ0wgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAorICAvKiBhOCAqLworICB7ICJwdXNoUCIsIGdzIH0sCisgIHsgInBvcFAiLCBncyB9LAorICB7ICJyc20iIH0sCisgIHsgImJ0c1MiLCBFdiwgR3YgfSwKKyAgeyAic2hyZFMiLCBFdiwgR3YsIEliIH0sCisgIHsgInNocmRTIiwgRXYsIEd2LCBDTCB9LAorICB7IEdSUDEzIH0sCisgIHsgImltdWxTIiwgR3YsIEV2IH0sCisgIC8qIGIwICovCisgIHsgImNtcHhjaGdCIiwgRWIsIEdiIH0sCisgIHsgImNtcHhjaGdTIiwgRXYsIEd2IH0sCisgIHsgImxzc1MiLCBHdiwgTXAgfSwJLyogMzg2IGxpc3RzIG9ubHkgTXAgKi8KKyAgeyAiYnRyUyIsIEV2LCBHdiB9LAorICB7ICJsZnNTIiwgR3YsIE1wIH0sCS8qIDM4NiBsaXN0cyBvbmx5IE1wICovCisgIHsgImxnc1MiLCBHdiwgTXAgfSwJLyogMzg2IGxpc3RzIG9ubHkgTXAgKi8KKyAgeyAibW92engiLCBHdiwgRWIgfSwKKyAgeyAibW92engiLCBHdiwgRXcgfSwKKyAgLyogYjggKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgInVkMmIiIH0sCisgIHsgR1JQOCB9LAorICB7ICJidGNTIiwgRXYsIEd2IH0sCisgIHsgImJzZlMiLCBHdiwgRXYgfSwKKyAgeyAiYnNyUyIsIEd2LCBFdiB9LAorICB7ICJtb3ZzeCIsIEd2LCBFYiB9LAorICB7ICJtb3ZzeCIsIEd2LCBFdyB9LAorICAvKiBjMCAqLworICB7ICJ4YWRkQiIsIEViLCBHYiB9LAorICB7ICJ4YWRkUyIsIEV2LCBHdiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgR1JQOSB9LAorICAvKiBjOCAqLworICB7ICJic3dhcCIsIGVBWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KKyAgeyAiYnN3YXAiLCBlQ1ggfSwKKyAgeyAiYnN3YXAiLCBlRFggfSwKKyAgeyAiYnN3YXAiLCBlQlggfSwKKyAgeyAiYnN3YXAiLCBlU1AgfSwKKyAgeyAiYnN3YXAiLCBlQlAgfSwKKyAgeyAiYnN3YXAiLCBlU0kgfSwKKyAgeyAiYnN3YXAiLCBlREkgfSwKKyAgLyogZDAgKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgInBzcmx3IiwgTVgsIEVNIH0sCisgIHsgInBzcmxkIiwgTVgsIEVNIH0sCisgIHsgInBzcmxxIiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJwbXVsbHciLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKKyAgLyogZDggKi8KKyAgeyAicHN1YnVzYiIsIE1YLCBFTSB9LAorICB7ICJwc3VidXN3IiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJwYW5kIiwgTVgsIEVNIH0sCisgIHsgInBhZGR1c2IiLCBNWCwgRU0gfSwKKyAgeyAicGFkZHVzdyIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAicGFuZG4iLCBNWCwgRU0gfSwKKyAgLyogZTAgKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgInBzcmF3IiwgTVgsIEVNIH0sCisgIHsgInBzcmFkIiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAicG11bGh3IiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCisgIC8qIGU4ICovCisgIHsgInBzdWJzYiIsIE1YLCBFTSB9LAorICB7ICJwc3Vic3ciLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgInBvciIsIE1YLCBFTSB9LAorICB7ICJwYWRkc2IiLCBNWCwgRU0gfSwKKyAgeyAicGFkZHN3IiwgTVgsIEVNIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJweG9yIiwgTVgsIEVNIH0sCisgIC8qIGYwICovCisgIHsgIihiYWQpIiB9LAorICB7ICJwc2xsdyIsIE1YLCBFTSB9LAorICB7ICJwc2xsZCIsIE1YLCBFTSB9LAorICB7ICJwc2xscSIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAicG1hZGR3ZCIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAorICAvKiBmOCAqLworICB7ICJwc3ViYiIsIE1YLCBFTSB9LAorICB7ICJwc3VidyIsIE1YLCBFTSB9LAorICB7ICJwc3ViZCIsIE1YLCBFTSB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAicGFkZGIiLCBNWCwgRU0gfSwKKyAgeyAicGFkZHciLCBNWCwgRU0gfSwKKyAgeyAicGFkZGQiLCBNWCwgRU0gfSwKKyAgeyAiKGJhZCkiIH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG9uZWJ5dGVfaGFzX21vZHJtWzI1Nl0gPSB7CisgIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsCisgIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsCisgIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsCisgIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDEsMSwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsCisgIDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsCisgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDEKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfaGFzX21vZHJtWzI1Nl0gPSB7CisgIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsIC8qIDBmICovCisgIC8qIDEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCisgIC8qIDIwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIDJmICovCisgIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCisgIC8qIDQwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDRmICovCisgIC8qIDUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDVmICovCisgIC8qIDYwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsIC8qIDZmICovCisgIC8qIDcwICovIDAsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsIC8qIDdmICovCisgIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCisgIC8qIDkwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDlmICovCisgIC8qIGEwICovIDAsMCwwLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsIC8qIGFmICovCisgIC8qIGIwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwxLDEsIC8qIGJmICovCisgIC8qIGMwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCisgIC8qIGQwICovIDAsMSwxLDEsMCwxLDAsMCwxLDEsMCwxLDEsMSwwLDEsIC8qIGRmICovCisgIC8qIGUwICovIDAsMSwxLDAsMCwxLDAsMCwxLDEsMCwxLDEsMSwwLDEsIC8qIGVmICovCisgIC8qIGYwICovIDAsMSwxLDEsMCwxLDAsMCwxLDEsMSwwLDEsMSwxLDAgIC8qIGZmICovCit9OworCitzdGF0aWMgY2hhciBvYnVmWzEwMF07CitzdGF0aWMgY2hhciAqb2J1ZnA7CitzdGF0aWMgY2hhciBzY3JhdGNoYnVmWzEwMF07CitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3RhcnRfY29kZXA7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5zbl9jb2RlcDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2RlcDsKK3N0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICp0aGVfaW5mbzsKK3N0YXRpYyBpbnQgbW9kOworc3RhdGljIGludCBybTsKK3N0YXRpYyBpbnQgcmVnOworc3RhdGljIHZvaWQgb2FwcGVuZCBQQVJBTVMgKChjaGFyICpzKSk7CisKK3N0YXRpYyBjaGFyICpuYW1lczMyW109eworICAiJWVheCIsIiVlY3giLCIlZWR4IiwiJWVieCIsICIlZXNwIiwiJWVicCIsIiVlc2kiLCIlZWRpIiwKK307CitzdGF0aWMgY2hhciAqbmFtZXMxNltdID0geworICAiJWF4IiwiJWN4IiwiJWR4IiwiJWJ4IiwiJXNwIiwiJWJwIiwiJXNpIiwiJWRpIiwKK307CitzdGF0aWMgY2hhciAqbmFtZXM4W10gPSB7CisgICIlYWwiLCIlY2wiLCIlZGwiLCIlYmwiLCIlYWgiLCIlY2giLCIlZGgiLCIlYmgiLAorfTsKK3N0YXRpYyBjaGFyICpuYW1lc19zZWdbXSA9IHsKKyAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAorfTsKK3N0YXRpYyBjaGFyICppbmRleDE2W10gPSB7CisgICIlYngsJXNpIiwiJWJ4LCVkaSIsIiVicCwlc2kiLCIlYnAsJWRpIiwiJXNpIiwiJWRpIiwiJWJwIiwiJWJ4IgorfTsKKworc3RhdGljIHN0cnVjdCBkaXMzODYgZ3Jwc1tdWzhdID0geworICAvKiBHUlAxYiAqLworICB7CisgICAgeyAiYWRkQSIsCUViLCBJYiB9LAorICAgIHsgIm9yQSIsCUViLCBJYiB9LAorICAgIHsgImFkY0EiLAlFYiwgSWIgfSwKKyAgICB7ICJzYmJBIiwJRWIsIEliIH0sCisgICAgeyAiYW5kQSIsCUViLCBJYiB9LAorICAgIHsgInN1YkEiLAlFYiwgSWIgfSwKKyAgICB7ICJ4b3JBIiwJRWIsIEliIH0sCisgICAgeyAiY21wQSIsCUViLCBJYiB9CisgIH0sCisgIC8qIEdSUDFTICovCisgIHsKKyAgICB7ICJhZGRRIiwJRXYsIEl2IH0sCisgICAgeyAib3JRIiwJRXYsIEl2IH0sCisgICAgeyAiYWRjUSIsCUV2LCBJdiB9LAorICAgIHsgInNiYlEiLAlFdiwgSXYgfSwKKyAgICB7ICJhbmRRIiwJRXYsIEl2IH0sCisgICAgeyAic3ViUSIsCUV2LCBJdiB9LAorICAgIHsgInhvclEiLAlFdiwgSXYgfSwKKyAgICB7ICJjbXBRIiwJRXYsIEl2IH0KKyAgfSwKKyAgLyogR1JQMVNzICovCisgIHsKKyAgICB7ICJhZGRRIiwJRXYsIHNJYiB9LAorICAgIHsgIm9yUSIsCUV2LCBzSWIgfSwKKyAgICB7ICJhZGNRIiwJRXYsIHNJYiB9LAorICAgIHsgInNiYlEiLAlFdiwgc0liIH0sCisgICAgeyAiYW5kUSIsCUV2LCBzSWIgfSwKKyAgICB7ICJzdWJRIiwJRXYsIHNJYiB9LAorICAgIHsgInhvclEiLAlFdiwgc0liIH0sCisgICAgeyAiY21wUSIsCUV2LCBzSWIgfQorICB9LAorICAvKiBHUlAyYiAqLworICB7CisgICAgeyAicm9sQSIsCUViLCBJYiB9LAorICAgIHsgInJvckEiLAlFYiwgSWIgfSwKKyAgICB7ICJyY2xBIiwJRWIsIEliIH0sCisgICAgeyAicmNyQSIsCUViLCBJYiB9LAorICAgIHsgInNobEEiLAlFYiwgSWIgfSwKKyAgICB7ICJzaHJBIiwJRWIsIEliIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAic2FyQSIsCUViLCBJYiB9LAorICB9LAorICAvKiBHUlAyUyAqLworICB7CisgICAgeyAicm9sUSIsCUV2LCBJYiB9LAorICAgIHsgInJvclEiLAlFdiwgSWIgfSwKKyAgICB7ICJyY2xRIiwJRXYsIEliIH0sCisgICAgeyAicmNyUSIsCUV2LCBJYiB9LAorICAgIHsgInNobFEiLAlFdiwgSWIgfSwKKyAgICB7ICJzaHJRIiwJRXYsIEliIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAic2FyUSIsCUV2LCBJYiB9LAorICB9LAorICAvKiBHUlAyYl9vbmUgKi8KKyAgeworICAgIHsgInJvbEEiLAlFYiB9LAorICAgIHsgInJvckEiLAlFYiB9LAorICAgIHsgInJjbEEiLAlFYiB9LAorICAgIHsgInJjckEiLAlFYiB9LAorICAgIHsgInNobEEiLAlFYiB9LAorICAgIHsgInNockEiLAlFYiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInNhckEiLAlFYiB9LAorICB9LAorICAvKiBHUlAyU19vbmUgKi8KKyAgeworICAgIHsgInJvbFEiLAlFdiB9LAorICAgIHsgInJvclEiLAlFdiB9LAorICAgIHsgInJjbFEiLAlFdiB9LAorICAgIHsgInJjclEiLAlFdiB9LAorICAgIHsgInNobFEiLAlFdiB9LAorICAgIHsgInNoclEiLAlFdiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInNhclEiLAlFdiB9LAorICB9LAorICAvKiBHUlAyYl9jbCAqLworICB7CisgICAgeyAicm9sQSIsCUViLCBDTCB9LAorICAgIHsgInJvckEiLAlFYiwgQ0wgfSwKKyAgICB7ICJyY2xBIiwJRWIsIENMIH0sCisgICAgeyAicmNyQSIsCUViLCBDTCB9LAorICAgIHsgInNobEEiLAlFYiwgQ0wgfSwKKyAgICB7ICJzaHJBIiwJRWIsIENMIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAic2FyQSIsCUViLCBDTCB9LAorICB9LAorICAvKiBHUlAyU19jbCAqLworICB7CisgICAgeyAicm9sUSIsCUV2LCBDTCB9LAorICAgIHsgInJvclEiLAlFdiwgQ0wgfSwKKyAgICB7ICJyY2xRIiwJRXYsIENMIH0sCisgICAgeyAicmNyUSIsCUV2LCBDTCB9LAorICAgIHsgInNobFEiLAlFdiwgQ0wgfSwKKyAgICB7ICJzaHJRIiwJRXYsIENMIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAic2FyUSIsCUV2LCBDTCB9CisgIH0sCisgIC8qIEdSUDNiICovCisgIHsKKyAgICB7ICJ0ZXN0QSIsCUViLCBJYiB9LAorICAgIHsgIihiYWQpIiwJRWIgfSwKKyAgICB7ICJub3RBIiwJRWIgfSwKKyAgICB7ICJuZWdBIiwJRWIgfSwKKyAgICB7ICJtdWxCIiwJQUwsIEViIH0sCisgICAgeyAiaW11bEIiLAlBTCwgRWIgfSwKKyAgICB7ICJkaXZCIiwJQUwsIEViIH0sCisgICAgeyAiaWRpdkIiLAlBTCwgRWIgfQorICB9LAorICAvKiBHUlAzUyAqLworICB7CisgICAgeyAidGVzdFEiLAlFdiwgSXYgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJub3RRIiwJRXYgfSwKKyAgICB7ICJuZWdRIiwJRXYgfSwKKyAgICB7ICJtdWxTIiwJZUFYLCBFdiB9LAorICAgIHsgImltdWxTIiwJZUFYLCBFdiB9LAorICAgIHsgImRpdlMiLAllQVgsIEV2IH0sCisgICAgeyAiaWRpdlMiLAllQVgsIEV2IH0sCisgIH0sCisgIC8qIEdSUDQgKi8KKyAgeworICAgIHsgImluY0EiLCBFYiB9LAorICAgIHsgImRlY0EiLCBFYiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICB9LAorICAvKiBHUlA1ICovCisgIHsKKyAgICB7ICJpbmNRIiwJRXYgfSwKKyAgICB7ICJkZWNRIiwJRXYgfSwKKyAgICB7ICJjYWxsUCIsCWluZGlyRXYgfSwKKyAgICB7ICJjYWxsUCIsCWluZGlyRXYgfSwKKyAgICB7ICJqbXBQIiwJaW5kaXJFdiB9LAorICAgIHsgImxqbXBQIiwJaW5kaXJFdiB9LAorICAgIHsgInB1c2hRIiwJRXYgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogR1JQNiAqLworICB7CisgICAgeyAic2xkdCIsCUV3IH0sCisgICAgeyAic3RyIiwJRXcgfSwKKyAgICB7ICJsbGR0IiwJRXcgfSwKKyAgICB7ICJsdHIiLAlFdyB9LAorICAgIHsgInZlcnIiLAlFdyB9LAorICAgIHsgInZlcnciLAlFdyB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9CisgIH0sCisgIC8qIEdSUDcgKi8KKyAgeworICAgIHsgInNnZHQiLCBFdyB9LAorICAgIHsgInNpZHQiLCBFdyB9LAorICAgIHsgImxnZHQiLCBFdyB9LAorICAgIHsgImxpZHQiLCBFdyB9LAorICAgIHsgInNtc3ciLCBFdyB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgImxtc3ciLCBFdyB9LAorICAgIHsgImludmxwZyIsIEV3IH0sCisgIH0sCisgIC8qIEdSUDggKi8KKyAgeworICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgImJ0USIsCUV2LCBJYiB9LAorICAgIHsgImJ0c1EiLAlFdiwgSWIgfSwKKyAgICB7ICJidHJRIiwJRXYsIEliIH0sCisgICAgeyAiYnRjUSIsCUV2LCBJYiB9LAorICB9LAorICAvKiBHUlA5ICovCisgIHsKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJjbXB4Y2hnOGIiLCBFdiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICB9LAorICAvKiBHUlAxMCAqLworICB7CisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAicHNybHciLCBNUywgSWIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJwc3JhdyIsIE1TLCBJYiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInBzbGx3IiwgTVMsIEliIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCisgIC8qIEdSUDExICovCisgIHsKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJwc3JsZCIsIE1TLCBJYiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInBzcmFkIiwgTVMsIEliIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAicHNsbGQiLCBNUywgSWIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogR1JQMTIgKi8KKyAgeworICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInBzcmxxIiwgTVMsIEliIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAicHNsbHEiLCBNUywgSWIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogR1JQMTMgKi8KKyAgeworICAgIHsgImZ4c2F2ZSIsIEV2IH0sCisgICAgeyAiZnhyc3RvciIsIEV2IH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCisgIC8qIEdSUDE0ICovCisgIHsKKyAgICB7ICJwcmVmZXRjaCIsIEViIH0sCisgICAgeyAicHJlZmV0Y2h3IiwgRWIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfQorCit9OworCisjZGVmaW5lIFBSRUZJWF9SRVBaIDEKKyNkZWZpbmUgUFJFRklYX1JFUE5aIDIKKyNkZWZpbmUgUFJFRklYX0xPQ0sgNAorI2RlZmluZSBQUkVGSVhfQ1MgOAorI2RlZmluZSBQUkVGSVhfU1MgMHgxMAorI2RlZmluZSBQUkVGSVhfRFMgMHgyMAorI2RlZmluZSBQUkVGSVhfRVMgMHg0MAorI2RlZmluZSBQUkVGSVhfRlMgMHg4MAorI2RlZmluZSBQUkVGSVhfR1MgMHgxMDAKKyNkZWZpbmUgUFJFRklYX0RBVEEgMHgyMDAKKyNkZWZpbmUgUFJFRklYX0FERFIgMHg0MDAKKyNkZWZpbmUgUFJFRklYX0ZXQUlUIDB4ODAwCisKK3N0YXRpYyBpbnQgcHJlZml4ZXM7CisKK3N0YXRpYyB2b2lkCitja3ByZWZpeCAoKQoreworICBwcmVmaXhlcyA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOworICAgICAgc3dpdGNoICgqY29kZXApCisJeworCWNhc2UgMHhmMzoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOworCSAgYnJlYWs7CisJY2FzZSAweGYyOgorCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOworCSAgYnJlYWs7CisJY2FzZSAweGYwOgorCSAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7CisJICBicmVhazsKKwljYXNlIDB4MmU6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfQ1M7CisJICBicmVhazsKKwljYXNlIDB4MzY6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfU1M7CisJICBicmVhazsKKwljYXNlIDB4M2U6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7CisJICBicmVhazsKKwljYXNlIDB4MjY6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfRVM7CisJICBicmVhazsKKwljYXNlIDB4NjQ6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfRlM7CisJICBicmVhazsKKwljYXNlIDB4NjU6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfR1M7CisJICBicmVhazsKKwljYXNlIDB4NjY6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfREFUQTsKKwkgIGJyZWFrOworCWNhc2UgMHg2NzoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9BRERSOworCSAgYnJlYWs7CisJY2FzZSAweDliOgorCSAgLyogZndhaXQgaXMgcmVhbGx5IGFuIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgYXJlIHByZWZpeGVzCisJICAgICBiZWZvcmUgdGhlIGZ3YWl0LCB0aGV5IGJlbG9uZyB0byB0aGUgZndhaXQsICpub3QqIHRvIHRoZQorCSAgICAgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgKi8KKwkgIGlmIChwcmVmaXhlcykKKwkgICAgeworCSAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKKwkgICAgICBjb2RlcCsrOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgcHJlZml4ZXMgPSBQUkVGSVhfRldBSVQ7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcmV0dXJuOworCX0KKyAgICAgIGNvZGVwKys7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBvcDFvdXRbMTAwXSwgb3Ayb3V0WzEwMF0sIG9wM291dFsxMDBdOworc3RhdGljIGludCBvcF9hZCwgb3BfaW5kZXhbM107CitzdGF0aWMgdW5zaWduZWQgaW50IG9wX2FkZHJlc3NbM107CitzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0X3BjOworCisMCisvKgorICogICBPbiB0aGUgMzg2J3Mgb2YgMTk4OCwgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uIGlzIDE1IGJ5dGVzLgorICogICAoc2VlIHRvcGljICJSZWR1bmRhbnQgcHJlZml4ZXMiIGluIHRoZSAiRGlmZmVyZW5jZXMgZnJvbSA4MDg2IgorICogICBzZWN0aW9uIG9mIHRoZSAiVmlydHVhbCA4MDg2IE1vZGUiIGNoYXB0ZXIuKQorICogJ3BjJyBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgdGhpcyBpbnN0cnVjdGlvbiwgaXQgd2lsbAorICogICBiZSB1c2VkIHRvIHByaW50IHRoZSB0YXJnZXQgYWRkcmVzcyBpZiB0aGlzIGlzIGEgcmVsYXRpdmUganVtcCBvciBjYWxsCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCisgKi8KKworc3RhdGljIGludCBwcmludF9pbnNuX3g4NgorICBQQVJBTVMgKChiZmRfdm1hIHBjLCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBpbnQgc2l6ZWZsYWcpKTsKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbl9pMzg2CisgIFBBUkFNUyAoKGJmZF92bWEgcGMsIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKKworc3RhdGljIGNoYXIgaW50ZWxfc3ludGF4Oworc3RhdGljIGNoYXIgb3Blbl9jaGFyOworc3RhdGljIGNoYXIgY2xvc2VfY2hhcjsKK3N0YXRpYyBjaGFyIHNlcGFyYXRvcl9jaGFyOworc3RhdGljIGNoYXIgc2NhbGVfY2hhcjsKKworaW50CitwcmludF9pbnNuX2kzODZfYXR0IChwYywgaW5mbykKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50ZWxfc3ludGF4ID0gMDsKKyAgb3Blbl9jaGFyID0gJygnOworICBjbG9zZV9jaGFyID0gICcpJzsKKyAgc2VwYXJhdG9yX2NoYXIgPSAnLCc7CisgIHNjYWxlX2NoYXIgPSAnLCc7CisKKyAgcmV0dXJuIHByaW50X2luc25faTM4NiAocGMsIGluZm8pOworfQorCitpbnQKK3ByaW50X2luc25faTM4Nl9pbnRlbCAocGMsIGluZm8pCisgICAgIGJmZF92bWEgcGM7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGludGVsX3N5bnRheCA9IDE7CisgIG9wZW5fY2hhciA9ICdbJzsKKyAgY2xvc2VfY2hhciA9ICddJzsKKyAgc2VwYXJhdG9yX2NoYXIgPSAnKyc7CisgIHNjYWxlX2NoYXIgPSAnKic7CisKKyAgcmV0dXJuIHByaW50X2luc25faTM4NiAocGMsIGluZm8pOworfQorCitzdGF0aWMgaW50CitwcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKQorICAgICBiZmRfdm1hIHBjOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpbnQgZmxhZ3M7CisgIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgorICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KQorICAgIGZsYWdzID0gQUZMQUd8REZMQUc7CisgIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKKyAgICBmbGFncyA9IDA7CisgIGVsc2UKKyAgICBhYm9ydCAoKTsKKyAgcmV0dXJuIHByaW50X2luc25feDg2IChwYywgaW5mbywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitwcmludF9pbnNuX3g4NiAocGMsIGluZm8sIHNpemVmbGFnKQorICAgICBiZmRfdm1hIHBjOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIHN0cnVjdCBkaXMzODYgKmRwOworICBpbnQgaTsKKyAgaW50IHR3b19zb3VyY2Vfb3BzOworICBjaGFyICpmaXJzdCwgKnNlY29uZCwgKnRoaXJkOworICBpbnQgbmVlZGNvbW1hOworICB1bnNpZ25lZCBjaGFyIG5lZWRfbW9kcm07CisKKyAgc3RydWN0IGRpc19wcml2YXRlIHByaXY7CisgIGJmZF9ieXRlICppbmJ1ZiA9IHByaXYudGhlX2J1ZmZlcjsKKworICAvKiBUaGUgb3V0cHV0IGxvb2tzIGJldHRlciBpZiB3ZSBwdXQgNSBieXRlcyBvbiBhIGxpbmUsIHNpbmNlIHRoYXQKKyAgICAgcHV0cyBsb25nIHdvcmQgaW5zdHJ1Y3Rpb25zIG9uIGEgc2luZ2xlIGxpbmUuICAqLworICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDU7CisKKyAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7CisgIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7CisgIHByaXYuaW5zbl9zdGFydCA9IHBjOworICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCisgICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgb2J1ZlswXSA9IDA7CisgIG9wMW91dFswXSA9IDA7CisgIG9wMm91dFswXSA9IDA7CisgIG9wM291dFswXSA9IDA7CisKKyAgb3BfaW5kZXhbMF0gPSBvcF9pbmRleFsxXSA9IG9wX2luZGV4WzJdID0gLTE7CisKKyAgdGhlX2luZm8gPSBpbmZvOworICBzdGFydF9wYyA9IHBjOworICBzdGFydF9jb2RlcCA9IGluYnVmOworICBjb2RlcCA9IGluYnVmOworCisgIGNrcHJlZml4ICgpOworCisgIGluc25fY29kZXAgPSBjb2RlcDsKKworICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOworICB0d29fc291cmNlX29wcyA9ICgqY29kZXAgPT0gMHg2MikgfHwgKCpjb2RlcCA9PSAweGM4KTsKKworICBvYnVmcCA9IG9idWY7CisKKyAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkKKyAgICAgICYmICgoKmNvZGVwIDwgMHhkOCkgfHwgKCpjb2RlcCA+IDB4ZGYpKSkKKyAgICB7CisgICAgICAvKiBmd2FpdCBub3QgZm9sbG93ZWQgYnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmd2FpdCIpOworICAgICAgLyogVGhlcmUgbWF5IGJlIG90aGVyIHByZWZpeGVzLiAgU2tpcCBhbnkgYmVmb3JlIHRoZSBmd2FpdC4gICovCisgICAgICByZXR1cm4gY29kZXAgLSBpbmJ1ZjsKKyAgICB9CisKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUFopCisgICAgb2FwcGVuZCAoInJlcHogIik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBOWikKKyAgICBvYXBwZW5kICgicmVwbnogIik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9MT0NLKQorICAgIG9hcHBlbmQgKCJsb2NrICIpOworCisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQorICAgIHNpemVmbGFnIF49IERGTEFHOworCisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9BRERSKQorICAgIHsKKyAgICAgIHNpemVmbGFnIF49IEFGTEFHOworICAgICAgaWYgKHNpemVmbGFnICYgQUZMQUcpCisgICAgICAgIG9hcHBlbmQgKCJhZGRyMzIgIik7CisgICAgICBlbHNlCisJb2FwcGVuZCAoImFkZHIxNiAiKTsKKyAgICB9CisKKyAgaWYgKCpjb2RlcCA9PSAweDBmKQorICAgIHsKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMik7CisgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICBkcCA9ICZkaXMzODZfdHdvYnl0ZV9pbnRlbFsqKytjb2RlcF07CisgICAgICBlbHNlCisgICAgICAgIGRwID0gJmRpczM4Nl90d29ieXRlX2F0dFsqKytjb2RlcF07CisgICAgICBuZWVkX21vZHJtID0gdHdvYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICBkcCA9ICZkaXMzODZfaW50ZWxbKmNvZGVwXTsKKyAgICAgIGVsc2UKKyAgICAgICAgZHAgPSAmZGlzMzg2X2F0dFsqY29kZXBdOworICAgICAgbmVlZF9tb2RybSA9IG9uZWJ5dGVfaGFzX21vZHJtWypjb2RlcF07CisgICAgfQorICBjb2RlcCsrOworCisgIGlmIChuZWVkX21vZHJtKQorICAgIHsKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGNvZGVwICsgMSk7CisgICAgICBtb2QgPSAoKmNvZGVwID4+IDYpICYgMzsKKyAgICAgIHJlZyA9ICgqY29kZXAgPj4gMykgJiA3OworICAgICAgcm0gPSAqY29kZXAgJiA3OworICAgIH0KKworICBpZiAoZHAtPm5hbWUgPT0gTlVMTCAmJiBkcC0+Ynl0ZW1vZGUxID09IEZMT0FUQ09ERSkKKyAgICB7CisgICAgICBkb2Zsb2F0IChzaXplZmxhZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRwLT5uYW1lID09IE5VTEwpCisJZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOworCisgICAgICBwdXRvcCAoZHAtPm5hbWUsIHNpemVmbGFnKTsKKworICAgICAgb2J1ZnAgPSBvcDFvdXQ7CisgICAgICBvcF9hZCA9IDI7CisgICAgICBpZiAoZHAtPm9wMSkKKwkoKmRwLT5vcDEpKGRwLT5ieXRlbW9kZTEsIHNpemVmbGFnKTsKKworICAgICAgb2J1ZnAgPSBvcDJvdXQ7CisgICAgICBvcF9hZCA9IDE7CisgICAgICBpZiAoZHAtPm9wMikKKwkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKKworICAgICAgb2J1ZnAgPSBvcDNvdXQ7CisgICAgICBvcF9hZCA9IDA7CisgICAgICBpZiAoZHAtPm9wMykKKwkoKmRwLT5vcDMpKGRwLT5ieXRlbW9kZTMsIHNpemVmbGFnKTsKKyAgICB9CisKKyAgb2J1ZnAgPSBvYnVmICsgc3RybGVuIChvYnVmKTsKKyAgZm9yIChpID0gc3RybGVuIChvYnVmKTsgaSA8IDY7IGkrKykKKyAgICBvYXBwZW5kICgiICIpOworICBvYXBwZW5kICgiICIpOworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb2J1Zik7CisKKyAgLyogVGhlIGVudGVyIGFuZCBib3VuZCBpbnN0cnVjdGlvbnMgYXJlIHByaW50ZWQgd2l0aCBvcGVyYW5kcyBpbiB0aGUgc2FtZQorICAgICBvcmRlciBhcyB0aGUgaW50ZWwgYm9vazsgZXZlcnl0aGluZyBlbHNlIGlzIHByaW50ZWQgaW4gcmV2ZXJzZSBvcmRlci4gICovCisgIGlmIChpbnRlbF9zeW50YXggfHwgdHdvX3NvdXJjZV9vcHMpIAorICAgIHsKKyAgICAgIGZpcnN0ID0gb3Axb3V0OworICAgICAgc2Vjb25kID0gb3Ayb3V0OworICAgICAgdGhpcmQgPSBvcDNvdXQ7CisgICAgICBvcF9hZCA9IG9wX2luZGV4WzBdOworICAgICAgb3BfaW5kZXhbMF0gPSBvcF9pbmRleFsyXTsKKyAgICAgIG9wX2luZGV4WzJdID0gb3BfYWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmlyc3QgPSBvcDNvdXQ7CisgICAgICBzZWNvbmQgPSBvcDJvdXQ7CisgICAgICB0aGlyZCA9IG9wMW91dDsKKyAgICB9CisgIG5lZWRjb21tYSA9IDA7CisgIGlmICgqZmlyc3QpCisgICAgeworICAgICAgaWYgKG9wX2luZGV4WzBdICE9IC0xKQorCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMF1dLCBpbmZvKTsKKyAgICAgIGVsc2UKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgZmlyc3QpOworICAgICAgbmVlZGNvbW1hID0gMTsKKyAgICB9CisgIGlmICgqc2Vjb25kKQorICAgIHsKKyAgICAgIGlmIChuZWVkY29tbWEpCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7CisgICAgICBpZiAob3BfaW5kZXhbMV0gIT0gLTEpCisJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFsxXV0sIGluZm8pOworICAgICAgZWxzZQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBzZWNvbmQpOworICAgICAgbmVlZGNvbW1hID0gMTsKKyAgICB9CisgIGlmICgqdGhpcmQpCisgICAgeworICAgICAgaWYgKG5lZWRjb21tYSkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKyAgICAgIGlmIChvcF9pbmRleFsyXSAhPSAtMSkKKwkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzJdXSwgaW5mbyk7CisgICAgICBlbHNlCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHRoaXJkKTsKKyAgICB9CisgIHJldHVybiBjb2RlcCAtIGluYnVmOworfQorCitzdGF0aWMgY2hhciAqZmxvYXRfbWVtX2F0dFtdID0geworICAvKiBkOCAqLworICAiZmFkZHMiLAorICAiZm11bHMiLAorICAiZmNvbXMiLAorICAiZmNvbXBzIiwKKyAgImZzdWJzIiwKKyAgImZzdWJycyIsCisgICJmZGl2cyIsCisgICJmZGl2cnMiLAorICAvKiAgZDkgKi8KKyAgImZsZHMiLAorICAiKGJhZCkiLAorICAiZnN0cyIsCisgICJmc3RwcyIsCisgICJmbGRlbnYiLAorICAiZmxkY3ciLAorICAiZk5zdGVudiIsCisgICJmTnN0Y3ciLAorICAvKiBkYSAqLworICAiZmlhZGRsIiwKKyAgImZpbXVsbCIsCisgICJmaWNvbWwiLAorICAiZmljb21wbCIsCisgICJmaXN1YmwiLAorICAiZmlzdWJybCIsCisgICJmaWRpdmwiLAorICAiZmlkaXZybCIsCisgIC8qIGRiICovCisgICJmaWxkbCIsCisgICIoYmFkKSIsCisgICJmaXN0bCIsCisgICJmaXN0cGwiLAorICAiKGJhZCkiLAorICAiZmxkdCIsCisgICIoYmFkKSIsCisgICJmc3RwdCIsCisgIC8qIGRjICovCisgICJmYWRkbCIsCisgICJmbXVsbCIsCisgICJmY29tbCIsCisgICJmY29tcGwiLAorICAiZnN1YmwiLAorICAiZnN1YnJsIiwKKyAgImZkaXZsIiwKKyAgImZkaXZybCIsCisgIC8qIGRkICovCisgICJmbGRsIiwKKyAgIihiYWQpIiwKKyAgImZzdGwiLAorICAiZnN0cGwiLAorICAiZnJzdG9yIiwKKyAgIihiYWQpIiwKKyAgImZOc2F2ZSIsCisgICJmTnN0c3ciLAorICAvKiBkZSAqLworICAiZmlhZGQiLAorICAiZmltdWwiLAorICAiZmljb20iLAorICAiZmljb21wIiwKKyAgImZpc3ViIiwKKyAgImZpc3ViciIsCisgICJmaWRpdiIsCisgICJmaWRpdnIiLAorICAvKiBkZiAqLworICAiZmlsZCIsCisgICIoYmFkKSIsCisgICJmaXN0IiwKKyAgImZpc3RwIiwKKyAgImZibGQiLAorICAiZmlsZGxsIiwKKyAgImZic3RwIiwKKyAgImZpc3RwbGwiLAorfTsKKworc3RhdGljIGNoYXIgKmZsb2F0X21lbV9pbnRlbFtdID0geworICAvKiBkOCAqLworICAiZmFkZCIsCisgICJmbXVsIiwKKyAgImZjb20iLAorICAiZmNvbXAiLAorICAiZnN1YiIsCisgICJmc3ViciIsCisgICJmZGl2IiwKKyAgImZkaXZyIiwKKyAgLyogIGQ5ICovCisgICJmbGQiLAorICAiKGJhZCkiLAorICAiZnN0IiwKKyAgImZzdHAiLAorICAiZmxkZW52IiwKKyAgImZsZGN3IiwKKyAgImZOc3RlbnYiLAorICAiZk5zdGN3IiwKKyAgLyogZGEgKi8KKyAgImZpYWRkIiwKKyAgImZpbXVsIiwKKyAgImZpY29tIiwKKyAgImZpY29tcCIsCisgICJmaXN1YiIsCisgICJmaXN1YnIiLAorICAiZmlkaXYiLAorICAiZmlkaXZyIiwKKyAgLyogZGIgKi8KKyAgImZpbGQiLAorICAiKGJhZCkiLAorICAiZmlzdCIsCisgICJmaXN0cCIsCisgICIoYmFkKSIsCisgICJmbGQiLAorICAiKGJhZCkiLAorICAiZnN0cCIsCisgIC8qIGRjICovCisgICJmYWRkIiwKKyAgImZtdWwiLAorICAiZmNvbSIsCisgICJmY29tcCIsCisgICJmc3ViIiwKKyAgImZzdWJyIiwKKyAgImZkaXYiLAorICAiZmRpdnIiLAorICAvKiBkZCAqLworICAiZmxkIiwKKyAgIihiYWQpIiwKKyAgImZzdCIsCisgICJmc3RwIiwKKyAgImZyc3RvciIsCisgICIoYmFkKSIsCisgICJmTnNhdmUiLAorICAiZk5zdHN3IiwKKyAgLyogZGUgKi8KKyAgImZpYWRkIiwKKyAgImZpbXVsIiwKKyAgImZpY29tIiwKKyAgImZpY29tcCIsCisgICJmaXN1YiIsCisgICJmaXN1YnIiLAorICAiZmlkaXYiLAorICAiZmlkaXZyIiwKKyAgLyogZGYgKi8KKyAgImZpbGQiLAorICAiKGJhZCkiLAorICAiZmlzdCIsCisgICJmaXN0cCIsCisgICJmYmxkIiwKKyAgImZpbGQiLAorICAiZmJzdHAiLAorICAiZmlzdHBsbCIsCit9OworCisjZGVmaW5lIFNUIE9QX1NULCAwCisjZGVmaW5lIFNUaSBPUF9TVGksIDAKKworI2RlZmluZSBGR1JQZDlfMiBOVUxMLCBOVUxMLCAwCisjZGVmaW5lIEZHUlBkOV80IE5VTEwsIE5VTEwsIDEKKyNkZWZpbmUgRkdSUGQ5XzUgTlVMTCwgTlVMTCwgMgorI2RlZmluZSBGR1JQZDlfNiBOVUxMLCBOVUxMLCAzCisjZGVmaW5lIEZHUlBkOV83IE5VTEwsIE5VTEwsIDQKKyNkZWZpbmUgRkdSUGRhXzUgTlVMTCwgTlVMTCwgNQorI2RlZmluZSBGR1JQZGJfNCBOVUxMLCBOVUxMLCA2CisjZGVmaW5lIEZHUlBkZV8zIE5VTEwsIE5VTEwsIDcKKyNkZWZpbmUgRkdSUGRmXzQgTlVMTCwgTlVMTCwgOAorCitzdGF0aWMgc3RydWN0IGRpczM4NiBmbG9hdF9yZWdbXVs4XSA9IHsKKyAgLyogZDggKi8KKyAgeworICAgIHsgImZhZGQiLAlTVCwgU1RpIH0sCisgICAgeyAiZm11bCIsCVNULCBTVGkgfSwKKyAgICB7ICJmY29tIiwJU1RpIH0sCisgICAgeyAiZmNvbXAiLAlTVGkgfSwKKyAgICB7ICJmc3ViIiwJU1QsIFNUaSB9LAorICAgIHsgImZzdWJyIiwJU1QsIFNUaSB9LAorICAgIHsgImZkaXYiLAlTVCwgU1RpIH0sCisgICAgeyAiZmRpdnIiLAlTVCwgU1RpIH0sCisgIH0sCisgIC8qIGQ5ICovCisgIHsKKyAgICB7ICJmbGQiLAlTVGkgfSwKKyAgICB7ICJmeGNoIiwJU1RpIH0sCisgICAgeyBGR1JQZDlfMiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgRkdSUGQ5XzQgfSwKKyAgICB7IEZHUlBkOV81IH0sCisgICAgeyBGR1JQZDlfNiB9LAorICAgIHsgRkdSUGQ5XzcgfSwKKyAgfSwKKyAgLyogZGEgKi8KKyAgeworICAgIHsgImZjbW92YiIsCVNULCBTVGkgfSwKKyAgICB7ICJmY21vdmUiLAlTVCwgU1RpIH0sCisgICAgeyAiZmNtb3ZiZSIsU1QsIFNUaSB9LAorICAgIHsgImZjbW92dSIsCVNULCBTVGkgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7IEZHUlBkYV81IH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCisgIC8qIGRiICovCisgIHsKKyAgICB7ICJmY21vdm5iIixTVCwgU1RpIH0sCisgICAgeyAiZmNtb3ZuZSIsU1QsIFNUaSB9LAorICAgIHsgImZjbW92bmJlIixTVCwgU1RpIH0sCisgICAgeyAiZmNtb3ZudSIsU1QsIFNUaSB9LAorICAgIHsgRkdSUGRiXzQgfSwKKyAgICB7ICJmdWNvbWkiLAlTVCwgU1RpIH0sCisgICAgeyAiZmNvbWkiLAlTVCwgU1RpIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCisgIC8qIGRjICovCisgIHsKKyAgICB7ICJmYWRkIiwJU1RpLCBTVCB9LAorICAgIHsgImZtdWwiLAlTVGksIFNUIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisjaWYgVU5JWFdBUkVfQ09NUEFUCisgICAgeyAiZnN1YiIsCVNUaSwgU1QgfSwKKyAgICB7ICJmc3ViciIsCVNUaSwgU1QgfSwKKyAgICB7ICJmZGl2IiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXZyIiwJU1RpLCBTVCB9LAorI2Vsc2UKKyAgICB7ICJmc3ViciIsCVNUaSwgU1QgfSwKKyAgICB7ICJmc3ViIiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXZyIiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXYiLAlTVGksIFNUIH0sCisjZW5kaWYKKyAgfSwKKyAgLyogZGQgKi8KKyAgeworICAgIHsgImZmcmVlIiwJU1RpIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiZnN0IiwJU1RpIH0sCisgICAgeyAiZnN0cCIsCVNUaSB9LAorICAgIHsgImZ1Y29tIiwJU1RpIH0sCisgICAgeyAiZnVjb21wIiwJU1RpIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCisgIC8qIGRlICovCisgIHsKKyAgICB7ICJmYWRkcCIsCVNUaSwgU1QgfSwKKyAgICB7ICJmbXVscCIsCVNUaSwgU1QgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7IEZHUlBkZV8zIH0sCisjaWYgVU5JWFdBUkVfQ09NUEFUCisgICAgeyAiZnN1YnAiLAlTVGksIFNUIH0sCisgICAgeyAiZnN1YnJwIiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXZwIiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXZycCIsCVNUaSwgU1QgfSwKKyNlbHNlCisgICAgeyAiZnN1YnJwIiwJU1RpLCBTVCB9LAorICAgIHsgImZzdWJwIiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXZycCIsCVNUaSwgU1QgfSwKKyAgICB7ICJmZGl2cCIsCVNUaSwgU1QgfSwKKyNlbmRpZgorICB9LAorICAvKiBkZiAqLworICB7CisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyBGR1JQZGZfNCB9LAorICAgIHsgImZ1Y29taXAiLFNULCBTVGkgfSwKKyAgICB7ICJmY29taXAiLCBTVCwgU1RpIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCit9OworCisKK3N0YXRpYyBjaGFyICpmZ3Jwc1tdWzhdID0geworICAvKiBkOV8yICAwICovCisgIHsKKyAgICAiZm5vcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKKyAgfSwKKworICAvKiBkOV80ICAxICovCisgIHsKKyAgICAiZmNocyIsImZhYnMiLCIoYmFkKSIsIihiYWQpIiwiZnRzdCIsImZ4YW0iLCIoYmFkKSIsIihiYWQpIiwKKyAgfSwKKworICAvKiBkOV81ICAyICovCisgIHsKKyAgICAiZmxkMSIsImZsZGwydCIsImZsZGwyZSIsImZsZHBpIiwiZmxkbGcyIiwiZmxkbG4yIiwiZmxkeiIsIihiYWQpIiwKKyAgfSwKKworICAvKiBkOV82ICAzICovCisgIHsKKyAgICAiZjJ4bTEiLCJmeWwyeCIsImZwdGFuIiwiZnBhdGFuIiwiZnh0cmFjdCIsImZwcmVtMSIsImZkZWNzdHAiLCJmaW5jc3RwIiwKKyAgfSwKKworICAvKiBkOV83ICA0ICovCisgIHsKKyAgICAiZnByZW0iLCJmeWwyeHAxIiwiZnNxcnQiLCJmc2luY29zIiwiZnJuZGludCIsImZzY2FsZSIsImZzaW4iLCJmY29zIiwKKyAgfSwKKworICAvKiBkYV81ICA1ICovCisgIHsKKyAgICAiKGJhZCkiLCJmdWNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKKyAgfSwKKworICAvKiBkYl80ICA2ICovCisgIHsKKyAgICAiZmVuaSgyODcgb25seSkiLCJmZGlzaSgyODcgb25seSkiLCJmTmNsZXgiLCJmTmluaXQiLAorICAgICJmTnNldHBtKDI4NyBvbmx5KSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCisgIH0sCisKKyAgLyogZGVfMyAgNyAqLworICB7CisgICAgIihiYWQpIiwiZmNvbXBwIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKKyAgfSwKKworICAvKiBkZl80ICA4ICovCisgIHsKKyAgICAiZk5zdHN3IiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAorICB9LAorfTsKKworc3RhdGljIHZvaWQKK2RvZmxvYXQgKHNpemVmbGFnKQorICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIHN0cnVjdCBkaXMzODYgKmRwOworICB1bnNpZ25lZCBjaGFyIGZsb2F0b3A7CisKKyAgZmxvYXRvcCA9IGNvZGVwWy0xXTsKKworICBpZiAobW9kICE9IDMpCisgICAgeworICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgcHV0b3AgKGZsb2F0X21lbV9pbnRlbFsoZmxvYXRvcCAtIDB4ZDggKSAqIDggKyByZWddLCBzaXplZmxhZyk7CisgICAgICBlbHNlCisgICAgICAgIHB1dG9wIChmbG9hdF9tZW1fYXR0WyhmbG9hdG9wIC0gMHhkOCApICogOCArIHJlZ10sIHNpemVmbGFnKTsKKyAgICAgIG9idWZwID0gb3Axb3V0OworICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkYikKKyAgICAgICAgT1BfRSAoeF9tb2RlLCBzaXplZmxhZyk7CisgICAgICBlbHNlIGlmIChmbG9hdG9wID09IDB4ZGQpCisgICAgICAgIE9QX0UgKGRfbW9kZSwgc2l6ZWZsYWcpOworICAgICAgZWxzZSAKKyAgICAgICAgT1BfRSAodl9tb2RlLCBzaXplZmxhZyk7CisgICAgICByZXR1cm47CisgICAgfQorICBjb2RlcCsrOworCisgIGRwID0gJmZsb2F0X3JlZ1tmbG9hdG9wIC0gMHhkOF1bcmVnXTsKKyAgaWYgKGRwLT5uYW1lID09IE5VTEwpCisgICAgeworICAgICAgcHV0b3AgKGZncnBzW2RwLT5ieXRlbW9kZTFdW3JtXSwgc2l6ZWZsYWcpOworCisgICAgICAvKiBpbnN0cnVjdGlvbiBmbnN0c3cgaXMgb25seSBvbmUgd2l0aCBzdHJhbmdlIGFyZyAqLworICAgICAgaWYgKGZsb2F0b3AgPT0gMHhkZiAmJiBjb2RlcFstMV0gPT0gMHhlMCkKKwlzdHJjcHkgKG9wMW91dCwgbmFtZXMxNlswXSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHV0b3AgKGRwLT5uYW1lLCBzaXplZmxhZyk7CisKKyAgICAgIG9idWZwID0gb3Axb3V0OworICAgICAgaWYgKGRwLT5vcDEpCisJKCpkcC0+b3AxKShkcC0+Ynl0ZW1vZGUxLCBzaXplZmxhZyk7CisgICAgICBvYnVmcCA9IG9wMm91dDsKKyAgICAgIGlmIChkcC0+b3AyKQorCSgqZHAtPm9wMikoZHAtPmJ5dGVtb2RlMiwgc2l6ZWZsYWcpOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitPUF9TVCAoaWdub3JlLCBzaXplZmxhZykKKyAgICAgaW50IGlnbm9yZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBvYXBwZW5kICgiJXN0Iik7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorT1BfU1RpIChpZ25vcmUsIHNpemVmbGFnKQorICAgICBpbnQgaWdub3JlOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXN0KCVkKSIsIHJtKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKKworLyogY2FwaXRhbCBsZXR0ZXJzIGluIHRlbXBsYXRlIGFyZSBtYWNyb3MgKi8KK3N0YXRpYyB2b2lkCitwdXRvcCAodGVtcGxhdGUsIHNpemVmbGFnKQorICAgICBjaGFyICp0ZW1wbGF0ZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBjaGFyICpwOworCisgIGZvciAocCA9IHRlbXBsYXRlOyAqcDsgcCsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKnApCisJeworCWRlZmF1bHQ6CisJICAqb2J1ZnArKyA9ICpwOworCSAgYnJlYWs7CisJY2FzZSAnQSc6CisgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgIGJyZWFrOworCSAgaWYgKG1vZCAhPSAzCisjaWZkZWYgU1VGRklYX0FMV0FZUworCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCisjZW5kaWYKKwkgICAgICApCisJICAgICpvYnVmcCsrID0gJ2InOworCSAgYnJlYWs7CisJY2FzZSAnQic6CisgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNVRkZJWF9BTFdBWVMKKwkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCisJICAgICpvYnVmcCsrID0gJ2InOworI2VuZGlmCisJICBicmVhazsKKwljYXNlICdFJzoJCS8qIEZvciBqY3h6L2plY3h6ICovCisJICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKKwkgICAgKm9idWZwKysgPSAnZSc7CisJICBicmVhazsKKwljYXNlICdMJzoKKyAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU1VGRklYX0FMV0FZUworCSAgaWYgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKKwkgICAgKm9idWZwKysgPSAnbCc7CisjZW5kaWYKKwkgIGJyZWFrOworCWNhc2UgJ04nOgorCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkgPT0gMCkKKwkgICAgKm9idWZwKysgPSAnbic7CisJICBicmVhazsKKwljYXNlICdQJzoKKyAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICAgICAgYnJlYWs7CisJICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCisjaWZkZWYgU1VGRklYX0FMV0FZUworCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCisjZW5kaWYKKwkgICAgICApCisJICAgIHsKKwkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwkJKm9idWZwKysgPSAnbCc7CisJICAgICAgZWxzZQorCQkqb2J1ZnArKyA9ICd3JzsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnUSc6CisgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgIGJyZWFrOworCSAgaWYgKG1vZCAhPSAzCisjaWZkZWYgU1VGRklYX0FMV0FZUworCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCisjZW5kaWYKKwkgICAgICApCisJICAgIHsKKwkgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwkJKm9idWZwKysgPSAnbCc7CisJICAgICAgZWxzZQorCQkqb2J1ZnArKyA9ICd3JzsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnUic6CisgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgIGJyZWFrOworCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCisJICAgICpvYnVmcCsrID0gJ2wnOworCSAgZWxzZQorCSAgICAqb2J1ZnArKyA9ICd3JzsKKwkgIGJyZWFrOworCWNhc2UgJ1MnOgorICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTVUZGSVhfQUxXQVlTCisJICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQorCSAgICB7CisJICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCisJCSpvYnVmcCsrID0gJ2wnOworCSAgICAgIGVsc2UKKwkJKm9idWZwKysgPSAndyc7CisJICAgIH0KKyNlbmRpZgorCSAgYnJlYWs7CisJY2FzZSAnVyc6CisgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgICAgIGJyZWFrOworCSAgLyogb3BlcmFuZCBzaXplIGZsYWcgZm9yIGN3dGwsIGNidHcgKi8KKwkgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCSAgICAqb2J1ZnArKyA9ICd3JzsKKwkgIGVsc2UKKwkgICAgKm9idWZwKysgPSAnYic7CisJICBicmVhazsKKwl9CisgICAgfQorICAqb2J1ZnAgPSAwOworfQorCitzdGF0aWMgdm9pZAorb2FwcGVuZCAocykKKyAgICAgY2hhciAqczsKK3sKKyAgc3RyY3B5IChvYnVmcCwgcyk7CisgIG9idWZwICs9IHN0cmxlbiAocyk7Cit9CisKK3N0YXRpYyB2b2lkCithcHBlbmRfc2VnICgpCit7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9DUykKKyAgICBvYXBwZW5kICgiJWNzOiIpOworICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRFMpCisgICAgb2FwcGVuZCAoIiVkczoiKTsKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX1NTKQorICAgIG9hcHBlbmQgKCIlc3M6Iik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9FUykKKyAgICBvYXBwZW5kICgiJWVzOiIpOworICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRlMpCisgICAgb2FwcGVuZCAoIiVmczoiKTsKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX0dTKQorICAgIG9hcHBlbmQgKCIlZ3M6Iik7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9pbmRpckUgKGJ5dGVtb2RlLCBzaXplZmxhZykKKyAgICAgaW50IGJ5dGVtb2RlOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIGlmICghaW50ZWxfc3ludGF4KQorICAgIG9hcHBlbmQgKCIqIik7CisgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpCisgICAgIGludCBieXRlbW9kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBpbnQgZGlzcDsKKworICAvKiBza2lwIG1vZC9ybSBieXRlICovCisgIGNvZGVwKys7CisKKyAgaWYgKG1vZCA9PSAzKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYnl0ZW1vZGUpCisJeworCWNhc2UgYl9tb2RlOgorCSAgb2FwcGVuZCAobmFtZXM4W3JtXSk7CisJICBicmVhazsKKwljYXNlIHdfbW9kZToKKwkgIG9hcHBlbmQgKG5hbWVzMTZbcm1dKTsKKwkgIGJyZWFrOworCWNhc2Ugdl9tb2RlOgorCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCisJICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKKwkgIGVsc2UKKwkgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIG9hcHBlbmQgKCI8YmFkIGRpcyB0YWJsZT4iKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZGlzcCA9IDA7CisgIGFwcGVuZF9zZWcgKCk7CisKKyAgaWYgKHNpemVmbGFnICYgQUZMQUcpIC8qIDMyIGJpdCBhZGRyZXNzIG1vZGUgKi8KKyAgICB7CisgICAgICBpbnQgaGF2ZXNpYjsKKyAgICAgIGludCBoYXZlYmFzZTsKKyAgICAgIGludCBiYXNlOworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIGludCBzY2FsZSA9IDA7CisKKyAgICAgIGhhdmVzaWIgPSAwOworICAgICAgaGF2ZWJhc2UgPSAxOworICAgICAgYmFzZSA9IHJtOworCisgICAgICBpZiAoYmFzZSA9PSA0KQorCXsKKwkgIGhhdmVzaWIgPSAxOworCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7CisJICBzY2FsZSA9ICgqY29kZXAgPj4gNikgJiAzOworCSAgaW5kZXggPSAoKmNvZGVwID4+IDMpICYgNzsKKwkgIGJhc2UgPSAqY29kZXAgJiA3OworCSAgY29kZXArKzsKKwl9CisKKyAgICAgIHN3aXRjaCAobW9kKQorCXsKKwljYXNlIDA6CisJICBpZiAoYmFzZSA9PSA1KQorCSAgICB7CisJICAgICAgaGF2ZWJhc2UgPSAwOworCSAgICAgIGRpc3AgPSBnZXQzMiAoKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7CisJICBkaXNwID0gKmNvZGVwKys7CisJICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQorCSAgICBkaXNwIC09IDB4MTAwOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgZGlzcCA9IGdldDMyICgpOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoIWludGVsX3N5bnRheCkKKyAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOworICAgICAgICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisgICAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoaGF2ZWJhc2UgfHwgKGhhdmVzaWIgJiYgKGluZGV4ICE9IDQgfHwgc2NhbGUgIT0gMCkpKQorCXsKKyAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGJfbW9kZToKKyAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkJZVEUgUFRSICIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSB3X21vZGU6CisgICAgICAgICAgICAgICAgICBvYXBwZW5kKCJXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Ugdl9tb2RlOgorICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiRFdPUkQgUFRSICIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBkX21vZGU6CisgICAgICAgICAgICAgICAgICBvYXBwZW5kKCJRV09SRCBQVFIgIik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIHhfbW9kZToKKyAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIlhXT1JEIFBUUiAiKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7CisgICAgICAgICAgKm9idWZwID0gJ1wwJzsKKwkgIGlmIChoYXZlYmFzZSkKKwkgICAgb2FwcGVuZCAobmFtZXMzMltiYXNlXSk7CisJICBpZiAoaGF2ZXNpYikKKwkgICAgeworCSAgICAgIGlmIChpbmRleCAhPSA0KQorCQl7CisgICAgICAgICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmViYXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZnArKyA9IHNlcGFyYXRvcl9jaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAqb2J1ZnAgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlcyIsIG5hbWVzMzJbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorCQkgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiwlcyIsIG5hbWVzMzJbaW5kZXhdKTsKKwkJICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKwkJfQorICAgICAgICAgICAgICBpZiAoIWludGVsX3N5bnRheAorICAgICAgICAgICAgICAgICAgfHwgKGludGVsX3N5bnRheCAKKyAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSBiX21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB3X21vZGUKKyAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB2X21vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICpvYnVmcCsrID0gc2NhbGVfY2hhcjsKKyAgICAgICAgICAgICAgICAgICpvYnVmcCA9ICdcMCc7CisJICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIDEgPDwgc2NhbGUpOworCSAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisJICAgIH0KKyAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQorICAgICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIERvbid0IHByaW50IHplcm8gZGlzcGxhY2VtZW50cyAqLworICAgICAgICAgICAgICAgIGlmIChkaXNwID4gMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIislZCIsIGRpc3ApOworICAgICAgICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwIDwgMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7CisgICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKwkgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKKyAgICAgICAgICAqb2J1ZnAgPSAnXDAnOworCX0KKyAgICAgIGVsc2UgaWYgKGludGVsX3N5bnRheCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCisgICAgICAgICAgICB7CisJICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUworCQkJICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKQorCQk7CisJICAgICAgZWxzZQorCQl7CisJCSAgb2FwcGVuZCAobmFtZXNfc2VnWzNdKTsKKwkJICBvYXBwZW5kICgiOiIpOworCQl9CisgICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7CisgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeyAvKiAxNiBiaXQgYWRkcmVzcyBtb2RlICovCisgICAgICBzd2l0Y2ggKG1vZCkKKwl7CisJY2FzZSAwOgorCSAgaWYgKHJtID09IDYpCisJICAgIHsKKwkgICAgICBkaXNwID0gZ2V0MTYgKCk7CisJICAgICAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQorCQlkaXNwIC09IDB4MTAwMDA7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOworCSAgZGlzcCA9ICpjb2RlcCsrOworCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKKwkgICAgZGlzcCAtPSAweDEwMDsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIGRpc3AgPSBnZXQxNiAoKTsKKwkgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKKwkgICAgZGlzcCAtPSAweDEwMDAwOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoIWludGVsX3N5bnRheCkKKyAgICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtID09IDYpCisgICAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7CisgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgICAgICAgICB9CisKKyAgICAgIGlmIChtb2QgIT0gMCB8fCBybSAhPSA2KQorCXsKKwkgICpvYnVmcCsrID0gb3Blbl9jaGFyOworICAgICAgICAgICpvYnVmcCA9ICdcMCc7CisJICBvYXBwZW5kIChpbmRleDE2W3JtXSk7CisgICAgICAgICAgKm9idWZwKysgPSBjbG9zZV9jaGFyOworICAgICAgICAgICpvYnVmcCA9ICdcMCc7CisJfQorICAgIH0KK30KKworI2RlZmluZSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IgXygiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKQorCitzdGF0aWMgdm9pZAorT1BfRyAoYnl0ZW1vZGUsIHNpemVmbGFnKQorICAgICBpbnQgYnl0ZW1vZGU7CisgICAgIGludCBzaXplZmxhZzsKK3sKKyAgc3dpdGNoIChieXRlbW9kZSkKKyAgICB7CisgICAgY2FzZSBiX21vZGU6CisgICAgICBvYXBwZW5kIChuYW1lczhbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHdfbW9kZToKKyAgICAgIG9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGRfbW9kZToKKyAgICAgIG9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCW9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7CisgICAgICBlbHNlCisJb2FwcGVuZCAobmFtZXMxNltyZWddKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50CitnZXQzMiAoKQoreworICBpbnQgeCA9IDA7CisKKyAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgNCk7CisgIHggPSAqY29kZXArKyAmIDB4ZmY7CisgIHggfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgODsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAxNjsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAyNDsKKyAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQKK2dldDE2ICgpCit7CisgIGludCB4ID0gMDsKKworICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAyKTsKKyAgeCA9ICpjb2RlcCsrICYgMHhmZjsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OworICByZXR1cm4geDsKK30KKworc3RhdGljIHZvaWQKK3NldF9vcCAob3ApCisgICAgIHVuc2lnbmVkIGludCBvcDsKK3sKKyAgb3BfaW5kZXhbb3BfYWRdID0gb3BfYWQ7CisgIG9wX2FkZHJlc3Nbb3BfYWRdID0gb3A7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9SRUcgKGNvZGUsIHNpemVmbGFnKQorICAgICBpbnQgY29kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBjaGFyICpzOworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBpbmRpcl9keF9yZWc6CisgICAgICBzID0gIiglZHgpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYXhfcmVnOiBjYXNlIGN4X3JlZzogY2FzZSBkeF9yZWc6IGNhc2UgYnhfcmVnOgorICAgIGNhc2Ugc3BfcmVnOiBjYXNlIGJwX3JlZzogY2FzZSBzaV9yZWc6IGNhc2UgZGlfcmVnOgorICAgICAgcyA9IG5hbWVzMTZbY29kZSAtIGF4X3JlZ107CisgICAgICBicmVhazsKKyAgICBjYXNlIGVzX3JlZzogY2FzZSBzc19yZWc6IGNhc2UgY3NfcmVnOgorICAgIGNhc2UgZHNfcmVnOiBjYXNlIGZzX3JlZzogY2FzZSBnc19yZWc6CisgICAgICBzID0gbmFtZXNfc2VnW2NvZGUgLSBlc19yZWddOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhbF9yZWc6IGNhc2UgYWhfcmVnOiBjYXNlIGNsX3JlZzogY2FzZSBjaF9yZWc6CisgICAgY2FzZSBkbF9yZWc6IGNhc2UgZGhfcmVnOiBjYXNlIGJsX3JlZzogY2FzZSBiaF9yZWc6CisgICAgICBzID0gbmFtZXM4W2NvZGUgLSBhbF9yZWddOworICAgICAgYnJlYWs7CisgICAgY2FzZSBlQVhfcmVnOiBjYXNlIGVDWF9yZWc6IGNhc2UgZURYX3JlZzogY2FzZSBlQlhfcmVnOgorICAgIGNhc2UgZVNQX3JlZzogY2FzZSBlQlBfcmVnOiBjYXNlIGVTSV9yZWc6IGNhc2UgZURJX3JlZzoKKyAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKKyAgICAgIGVsc2UKKwlzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZ107CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcyA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgb2FwcGVuZCAocyk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9JIChieXRlbW9kZSwgc2l6ZWZsYWcpCisgICAgIGludCBieXRlbW9kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBpbnQgb3A7CisKKyAgc3dpdGNoIChieXRlbW9kZSkKKyAgICB7CisgICAgY2FzZSBiX21vZGU6CisgICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKKyAgICAgIG9wID0gKmNvZGVwKysgJiAweGZmOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwlvcCA9IGdldDMyICgpOworICAgICAgZWxzZQorCW9wID0gZ2V0MTYgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHdfbW9kZToKKyAgICAgIG9wID0gZ2V0MTYgKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGludGVsX3N5bnRheCkKKyAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9wKTsKKyAgZWxzZQorICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisgIHNjcmF0Y2hidWZbMF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZAorT1Bfc0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKKyAgICAgaW50IGJ5dGVtb2RlOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIGludCBvcDsKKworICBzd2l0Y2ggKGJ5dGVtb2RlKQorICAgIHsKKyAgICBjYXNlIGJfbW9kZToKKyAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOworICAgICAgb3AgPSAqY29kZXArKzsKKyAgICAgIGlmICgob3AgJiAweDgwKSAhPSAwKQorCW9wIC09IDB4MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwlvcCA9IGdldDMyICgpOworICAgICAgZWxzZQorCXsKKwkgIG9wID0gZ2V0MTYoKTsKKwkgIGlmICgob3AgJiAweDgwMDApICE9IDApCisJICAgIG9wIC09IDB4MTAwMDA7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB3X21vZGU6CisgICAgICBvcCA9IGdldDE2ICgpOworICAgICAgaWYgKChvcCAmIDB4ODAwMCkgIT0gMCkKKwlvcCAtPSAweDEwMDAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoaW50ZWxfc3ludGF4KQorICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIG9wKTsKKyAgZWxzZQorICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9KIChieXRlbW9kZSwgc2l6ZWZsYWcpCisgICAgIGludCBieXRlbW9kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBpbnQgZGlzcDsKKyAgaW50IG1hc2sgPSAtMTsKKworICBzd2l0Y2ggKGJ5dGVtb2RlKQorICAgIHsKKyAgICBjYXNlIGJfbW9kZToKKyAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOworICAgICAgZGlzcCA9ICpjb2RlcCsrOworICAgICAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKKwlkaXNwIC09IDB4MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwlkaXNwID0gZ2V0MzIgKCk7CisgICAgICBlbHNlCisJeworCSAgZGlzcCA9IGdldDE2ICgpOworCSAgLyogZm9yIHNvbWUgcmVhc29uLCBhIGRhdGExNiBwcmVmaXggb24gYSBqdW1wIGluc3RydWN0aW9uCisJICAgICBtZWFucyB0aGF0IHRoZSBwYyBpcyBtYXNrZWQgdG8gMTYgYml0cyBhZnRlciB0aGUKKwkgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCEgICovCisJICBtYXNrID0gMHhmZmZmOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZGlzcCA9IChzdGFydF9wYyArIGNvZGVwIC0gc3RhcnRfY29kZXAgKyBkaXNwKSAmIG1hc2s7CisgIHNldF9vcCAoZGlzcCk7CisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK09QX1NFRyAoZHVtbXksIHNpemVmbGFnKQorICAgICBpbnQgZHVtbXk7CisgICAgIGludCBzaXplZmxhZzsKK3sKKyAgc3RhdGljIGNoYXIgKnNyZWdbXSA9IHsKKyAgICAiJWVzIiwiJWNzIiwiJXNzIiwiJWRzIiwiJWZzIiwiJWdzIiwiJT8iLCIlPyIsCisgIH07CisKKyAgb2FwcGVuZCAoc3JlZ1tyZWddKTsKK30KKworc3RhdGljIHZvaWQKK09QX0RJUiAoc2l6ZSwgc2l6ZWZsYWcpCisgICAgIGludCBzaXplOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIGludCBzZWcsIG9mZnNldDsKKworICBzd2l0Y2ggKHNpemUpCisgICAgeworICAgIGNhc2UgbHB0cjoKKyAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCXsKKwkgIG9mZnNldCA9IGdldDMyICgpOworCSAgc2VnID0gZ2V0MTYgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG9mZnNldCA9IGdldDE2ICgpOworCSAgc2VnID0gZ2V0MTYgKCk7CisJfQorICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiQweCV4LCQweCV4Iiwgc2VnLCBvZmZzZXQpOworICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCW9mZnNldCA9IGdldDMyICgpOworICAgICAgZWxzZQorCXsKKwkgIG9mZnNldCA9IGdldDE2ICgpOworCSAgaWYgKChvZmZzZXQgJiAweDgwMDApICE9IDApCisJICAgIG9mZnNldCAtPSAweDEwMDAwOworCX0KKworICAgICAgb2Zmc2V0ID0gc3RhcnRfcGMgKyBjb2RlcCAtIHN0YXJ0X2NvZGVwICsgb2Zmc2V0OworICAgICAgc2V0X29wIChvZmZzZXQpOworICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBvZmZzZXQpOworICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitPUF9PRkYgKGlnbm9yZSwgc2l6ZWZsYWcpCisgICAgIGludCBpZ25vcmU7CisgICAgIGludCBzaXplZmxhZzsKK3sKKyAgaW50IG9mZjsKKworICBhcHBlbmRfc2VnICgpOworCisgIGlmIChzaXplZmxhZyAmIEFGTEFHKQorICAgIG9mZiA9IGdldDMyICgpOworICBlbHNlCisgICAgb2ZmID0gZ2V0MTYgKCk7CisKKyAgaWYgKGludGVsX3N5bnRheCkKKyAgICB7CisgICAgICBpZiAoIShwcmVmaXhlcyAmIChQUkVGSVhfQ1MgfCBQUkVGSVhfU1MgfCBQUkVGSVhfRFMKKwkJICAgICAgICB8IFBSRUZJWF9FUyB8IFBSRUZJWF9GUyB8IFBSRUZJWF9HUykpKQorCXsKKwkgIG9hcHBlbmQgKG5hbWVzX3NlZ1szXSk7CisJICBvYXBwZW5kICgiOiIpOworCX0KKyAgICB9CisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4Iiwgb2ZmKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitwdHJfcmVnIChjb2RlLCBzaXplZmxhZykKKyAgICAgaW50IGNvZGU7CisgICAgIGludCBzaXplZmxhZzsKK3sKKyAgY2hhciAqczsKKyAgb2FwcGVuZCAoIigiKTsKKyAgaWYgKHNpemVmbGFnICYgQUZMQUcpCisgICAgcyA9IG5hbWVzMzJbY29kZSAtIGVBWF9yZWddOworICBlbHNlCisgICAgcyA9IG5hbWVzMTZbY29kZSAtIGVBWF9yZWddOworICBvYXBwZW5kIChzKTsKKyAgb2FwcGVuZCAoIikiKTsKK30KKworc3RhdGljIHZvaWQKK09QX0VTcmVnIChjb2RlLCBzaXplZmxhZykKKyAgICAgaW50IGNvZGU7CisgICAgIGludCBzaXplZmxhZzsKK3sKKyAgb2FwcGVuZCAoIiVlczoiKTsKKyAgcHRyX3JlZyAoY29kZSwgc2l6ZWZsYWcpOworfQorCitzdGF0aWMgdm9pZAorT1BfRFNyZWcgKGNvZGUsIHNpemVmbGFnKQorICAgICBpbnQgY29kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBpZiAoKHByZWZpeGVzCisgICAgICAgJiAoUFJFRklYX0NTCisJICB8IFBSRUZJWF9EUworCSAgfCBQUkVGSVhfU1MKKwkgIHwgUFJFRklYX0VTCisJICB8IFBSRUZJWF9GUworCSAgfCBQUkVGSVhfR1MpKSA9PSAwKQorICAgIHByZWZpeGVzIHw9IFBSRUZJWF9EUzsKKyAgYXBwZW5kX3NlZygpOworICBwdHJfcmVnIChjb2RlLCBzaXplZmxhZyk7Cit9CisKKyNpZiAwCisvKiBOb3QgdXNlZC4gICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorT1BfT05FIChkdW1teSwgc2l6ZWZsYWcpCisgICAgIGludCBkdW1teTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBvYXBwZW5kICgiMSIpOworfQorCisjZW5kaWYKKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitPUF9DIChkdW1teSwgc2l6ZWZsYWcpCisgICAgIGludCBkdW1teTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBjb2RlcCsrOyAvKiBza2lwIG1vZC9ybSAqLworICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVjciVkIiwgcmVnKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorT1BfRCAoZHVtbXksIHNpemVmbGFnKQorICAgICBpbnQgZHVtbXk7CisgICAgIGludCBzaXplZmxhZzsKK3sKKyAgY29kZXArKzsgLyogc2tpcCBtb2Qvcm0gKi8KKyAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlZGIlZCIsIHJlZyk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK09QX1QgKGR1bW15LCBzaXplZmxhZykKKyAgICAgaW50IGR1bW15OworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIGNvZGVwKys7IC8qIHNraXAgbW9kL3JtICovCisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXRyJWQiLCByZWcpOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK09QX3JtIChieXRlbW9kZSwgc2l6ZWZsYWcpCisgICAgIGludCBieXRlbW9kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBzd2l0Y2ggKGJ5dGVtb2RlKQorICAgIHsKKyAgICBjYXNlIGRfbW9kZToKKyAgICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugd19tb2RlOgorICAgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorT1BfTU1YIChpZ25vcmUsIHNpemVmbGFnKQorICAgICBpbnQgaWdub3JlOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJW1tJWQiLCByZWcpOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK09QX0VNIChieXRlbW9kZSwgc2l6ZWZsYWcpCisgICAgIGludCBieXRlbW9kZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICBpZiAobW9kICE9IDMpCisgICAgeworICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29kZXArKzsKKyAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJtKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9NUyAoaWdub3JlLCBzaXplZmxhZykKKyAgICAgaW50IGlnbm9yZTsKKyAgICAgaW50IHNpemVmbGFnOworeworICArK2NvZGVwOworICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVtbSVkIiwgcm0pOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKlN1ZmZpeDNETm93W10gPSB7CisvKiAwMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDA4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAwQyAqLwlOVUxMLAkJInBpMmZkIiwJTlVMTCwJCU5VTEwsCisvKiAxMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDE4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAxQyAqLwlOVUxMLAkJInBmMmlkIiwJTlVMTCwJCU5VTEwsCisvKiAyMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAyQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDM0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAzOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogM0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDQwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA0NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNDggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDRDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA1MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDU4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA1QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDY0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA2OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDcwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA3NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDdDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA4MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogODQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDg4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA4QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogOTAgKi8JInBmY21wZ2UiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA5NCAqLwkicGZtaW4iLAlOVUxMLAkJInBmcmNwIiwJInBmcnNxcnQiLAorLyogOTggKi8JTlVMTCwJCU5VTEwsCQkicGZzdWIiLAlOVUxMLAorLyogOUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhZGQiLAlOVUxMLAorLyogQTAgKi8JInBmY21wZ3QiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBBNCAqLwkicGZtYXgiLAlOVUxMLAkJInBmcmNwaXQxIiwJInBmcnNxaXQxIiwKKy8qIEE4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViciIsCU5VTEwsCisvKiBBQyAqLwlOVUxMLAkJTlVMTCwJCSJwZmFjYyIsCU5VTEwsCisvKiBCMCAqLwkicGZjbXBlcSIsCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEI0ICovCSJwZm11bCIsCU5VTEwsCQkicGZyY3BpdDIiLAkicGZtdWxocnciLAorLyogQjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEJDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwYXZndXNiIiwKKy8qIEMwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBDNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogQzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIENDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBEMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEQ4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBEQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEU0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBFOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRUMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEYwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBGNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEZDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCit9OworCitzdGF0aWMgdm9pZAorT1BfM0ROb3dTdWZmaXggKGJ5dGVtb2RlLCBzaXplZmxhZykKKyAgICAgaW50IGJ5dGVtb2RlOworICAgICBpbnQgc2l6ZWZsYWc7Cit7CisgIGNvbnN0IGNoYXIgKm1uZW1vbmljOworCisgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOworICAvKiBBTUQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3BlY2lmaWVkIGJ5IGFuIG9wY29kZSBzdWZmaXggaW4gdGhlCisgICAgIHBsYWNlIHdoZXJlIGFuIDgtYml0IGltbWVkaWF0ZSB3b3VsZCBub3JtYWxseSBnby4gIGllLiB0aGUgbGFzdAorICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCisgIG1uZW1vbmljID0gU3VmZml4M0ROb3dbKmNvZGVwKytdOworICBpZiAobW5lbW9uaWMpCisgICAgc3RyY2F0IChvYnVmLCBtbmVtb25pYyk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaW5jZSBhIHZhcmlhYmxlIHNpemVkIG1vZHJtL3NpYiBjaHVuayBpcyBiZXR3ZWVuIHRoZSBzdGFydAorCSBvZiB0aGUgb3Bjb2RlICgweDBmMGYpIGFuZCB0aGUgb3Bjb2RlIHN1ZmZpeCwgd2UgbmVlZCB0byBkbworCSBhbGwgdGhlIG1vZHJtIHByb2Nlc3NpbmcgZmlyc3QsIGFuZCBkb24ndCBrbm93IHVudGlsIG5vdyB0aGF0CisJIHdlIGhhdmUgYSBiYWQgb3Bjb2RlLiAgVGhpcyBuZWNlc3NpdGF0ZXMgc29tZSBjbGVhbmluZyB1cC4gICovCisgICAgICBvcDFvdXRbMF0gPSAwOworICAgICAgb3Ayb3V0WzBdID0gMDsKKyAgICAgIGNvZGVwID0gaW5zbl9jb2RlcCArIDE7CisgICAgICBzdHJjYXQgKG9idWYsICIoYmFkKSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wY29kZXMvaTk2MC1kaXMuYyBiL29wY29kZXMvaTk2MC1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJkODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9pOTYwLWRpcy5jCkBAIC0wLDAgKzEsOTE0IEBACisvKiBEaXNhc3NlbWJsZSBpODA5NjAgaW5zdHJ1Y3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKKy8qICAwICovCSJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCAKKy8qICA4ICovCSJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwKKy8qIDE2ICovCSJnMCIsICAiZzEiLCAgImcyIiwgICJnMyIsICAiZzQiLCAgImc1IiwgICJnNiIsICAiZzciLCAKKy8qIDI0ICovCSJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCAKKy8qIDMyICovCSJwYyIsICAiYWMiLCAgImlwIiwgICJ0YyIsICAiZnAwIiwgImZwMSIsICJmcDIiLCAiZnAzIiAKK307CisKKworc3RhdGljIEZJTEUgKnN0cmVhbTsJCS8qIE91dHB1dCBnb2VzIGhlcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3N0YXRpYyB2b2lkIHByaW50X2FkZHIoKTsKK3N0YXRpYyB2b2lkIGN0cmwoKTsKK3N0YXRpYyB2b2lkIGNvYnIoKTsKK3N0YXRpYyB2b2lkIHJlZygpOworc3RhdGljIGludCBtZW0oKTsKK3N0YXRpYyB2b2lkIGVhKCk7CitzdGF0aWMgdm9pZCBkc3RvcCgpOworc3RhdGljIHZvaWQgcmVnb3AoKTsKK3N0YXRpYyB2b2lkIGludmFsaWQoKTsKK3N0YXRpYyBpbnQgcGluc24oKTsKK3N0YXRpYyB2b2lkIHB1dF9hYnMoKTsKKworCisvKiBQcmludCB0aGUgaTk2MCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICdtZW1hZGRyJyBpbiBkZWJ1Z2dlZCBtZW1vcnksCisgICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KKworaW50CitwcmludF9pbnNuX2k5NjAgKG1lbWFkZHIsIGluZm9fYXJnKQorICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb19hcmc7Cit7CisgIHVuc2lnbmVkIGludCB3b3JkMSwgd29yZDIgPSAweGRlYWRiZWVmOworICBiZmRfYnl0ZSBidWZmZXJbOF07CisgIGludCBzdGF0dXM7CisKKyAgaW5mbyA9IGluZm9fYXJnOworICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07CisKKyAgLyogUmVhZCB3b3JkMS4gIE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgbmVlZHMgaXQsIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgKi8KKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCAoYmZkX2J5dGUgKikgYnVmZmVyLCA0LCBpbmZvKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICB3b3JkMSA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisKKyAgLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlLiAgKi8KKyAgc3dpdGNoICggKHdvcmQxID4+IDI4KSAmIDB4ZiApCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODoKKyAgICBjYXNlIDB4OToKKyAgICBjYXNlIDB4YToKKyAgICBjYXNlIDB4YjoKKyAgICBjYXNlIDB4YzoKKyAgICAgIC8qIFJlYWQgd29yZDIuICAqLworICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKQorCShtZW1hZGRyICsgNCwgKGJmZF9ieXRlICopIChidWZmZXIgKyA0KSwgNCwgaW5mbyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgd29yZDIgPSBiZmRfZ2V0bDMyIChidWZmZXIgKyA0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOworfQorDAorI2RlZmluZSBJTl9HREIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglBbGwgY29kZSBiZWxvdyB0aGlzIHBvaW50IHNob3VsZCBiZSBpZGVudGljYWwgd2l0aCB0aGF0IG9mCisgKgl0aGUgZGlzYXNzZW1ibGVyIGluIGdkbXA5NjAuCisKKyBBIG5vYmxlIHNlbnRpbWVudCwgYnV0IGF0IGxlYXN0IGluIGNvc21ldGljIHdheXMgKGluZm8tPmZwcmludGZfZnVuYyksIGl0CisganVzdCBhaW4ndCBzby4gLWtpbmdkb24sIDMxIE1hciA5MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgdGFiZW50IHsKKyAgY2hhciAqbmFtZTsKKyAgc2hvcnQgbnVtb3BzOworfTsKKworc3RydWN0IHNwYXJzZV90YWJlbnQgeworICBpbnQgb3Bjb2RlOworICBjaGFyICpuYW1lOworICBzaG9ydCBudW1vcHM7Cit9OworCitzdGF0aWMgaW50CitwaW5zbiggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKKyAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Cit7CisJaW50IGluc3RyX2xlbjsKKworCWluc3RyX2xlbiA9IDQ7CisJcHV0X2Ficyggd29yZDEsIHdvcmQyICk7CisKKwkvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUqLworCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKKwljYXNlIDB4MDoKKwljYXNlIDB4MToKKwkJY3RybCggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7CisJCWJyZWFrOworCWNhc2UgMHgyOgorCWNhc2UgMHgzOgorCQljb2JyKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJY2FzZSAweDY6CisJY2FzZSAweDc6CisJCXJlZyggd29yZDEgKTsKKwkJYnJlYWs7CisJY2FzZSAweDg6CisJY2FzZSAweDk6CisJY2FzZSAweGE6CisJY2FzZSAweGI6CisJY2FzZSAweGM6CisJCWluc3RyX2xlbiA9IG1lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCAwICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGludmFsaWQgaW5zdHJ1Y3Rpb24sIHByaW50IGFzIGRhdGEgd29yZCAqLyAKKwkJaW52YWxpZCggd29yZDEgKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBpbnN0cl9sZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ1RSTCBmb3JtYXQJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2N0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCisgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOworeworCWludCBpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFiZW50IGN0cmxfdGFiW10gPSB7CisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDAwICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDAxICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDAyICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDAzICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDA0ICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDA1ICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDA2ICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDA3ICovCisJICB7ICJiIiwJCTEsIH0sCS8qIDB4MDggKi8KKwkgIHsgImNhbGwiLAkJMSwgfSwJLyogMHgwOSAqLworCSAgeyAicmV0IiwJCTAsIH0sCS8qIDB4MGEgKi8KKwkgIHsgImJhbCIsCQkxLCB9LAkvKiAweDBiICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDBjICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDBkICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDBlICovCisJICB7IE5VTEwsCQkwLCB9LAkvKiAweDBmICovCisJICB7ICJibm8iLAkJMSwgfSwJLyogMHgxMCAqLworCSAgeyAiYmciLAkJMSwgfSwJLyogMHgxMSAqLworCSAgeyAiYmUiLAkJMSwgfSwJLyogMHgxMiAqLworCSAgeyAiYmdlIiwJCTEsIH0sCS8qIDB4MTMgKi8KKwkgIHsgImJsIiwJCTEsIH0sCS8qIDB4MTQgKi8KKwkgIHsgImJuZSIsCQkxLCB9LAkvKiAweDE1ICovCisJICB7ICJibGUiLAkJMSwgfSwJLyogMHgxNiAqLworCSAgeyAiYm8iLAkJMSwgfSwJLyogMHgxNyAqLworCSAgeyAiZmF1bHRubyIsCQkwLCB9LAkvKiAweDE4ICovCisJICB7ICJmYXVsdGciLAkJMCwgfSwJLyogMHgxOSAqLworCSAgeyAiZmF1bHRlIiwJCTAsIH0sCS8qIDB4MWEgKi8KKwkgIHsgImZhdWx0Z2UiLAkJMCwgfSwJLyogMHgxYiAqLworCSAgeyAiZmF1bHRsIiwJCTAsIH0sCS8qIDB4MWMgKi8KKwkgIHsgImZhdWx0bmUiLAkJMCwgfSwJLyogMHgxZCAqLworCSAgeyAiZmF1bHRsZSIsCQkwLCB9LAkvKiAweDFlICovCisJICB7ICJmYXVsdG8iLAkJMCwgfSwJLyogMHgxZiAqLworCX07CisKKwlpID0gKHdvcmQxID4+IDI0KSAmIDB4ZmY7CisJaWYgKCAoY3RybF90YWJbaV0ubmFtZSA9PSBOVUxMKSB8fCAoKHdvcmQxICYgMSkgIT0gMCkgKXsKKwkJaW52YWxpZCggd29yZDEgKTsKKwkJcmV0dXJuOworCX0KKworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgY3RybF90YWJbaV0ubmFtZSApOworCWlmICggd29yZDEgJiAyICl7CQkvKiBQcmVkaWN0cyBicmFuY2ggbm90IHRha2VuICovCisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoIHN0cmVhbSwgIi5mIiApOworCX0KKworCWlmICggY3RybF90YWJbaV0ubnVtb3BzID09IDEgKXsKKwkJLyogRVhUUkFDVCBESVNQTEFDRU1FTlQgQU5EIENPTlZFUlQgVE8gQUREUkVTUyAqLworCQl3b3JkMSAmPSAweDAwZmZmZmZmOworCQlpZiAoIHdvcmQxICYgMHgwMDgwMDAwMCApewkJLyogU2lnbiBiaXQgaXMgc2V0ICovCisJCQl3b3JkMSB8PSAoLTEgJiB+MHhmZmZmZmYpOwkvKiBTaWduIGV4dGVuZCAqLworCQl9CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7CisJCXByaW50X2FkZHIoIHdvcmQxICsgbWVtYWRkciApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDT0JSIGZvcm1hdAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICkKKyAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7Cit7CisJaW50IHNyYzE7CisJaW50IHNyYzI7CisJaW50IGk7CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjb2JyX3RhYltdID0geworCSAgeyAidGVzdG5vIiwJMSwgfSwJLyogMHgyMCAqLworCSAgeyAidGVzdGciLAkxLCB9LAkvKiAweDIxICovCisJICB7ICJ0ZXN0ZSIsCTEsIH0sCS8qIDB4MjIgKi8KKwkgIHsgInRlc3RnZSIsCTEsIH0sCS8qIDB4MjMgKi8KKwkgIHsgInRlc3RsIiwJMSwgfSwJLyogMHgyNCAqLworCSAgeyAidGVzdG5lIiwJMSwgfSwJLyogMHgyNSAqLworCSAgeyAidGVzdGxlIiwJMSwgfSwJLyogMHgyNiAqLworCSAgeyAidGVzdG8iLAkxLCB9LAkvKiAweDI3ICovCisJICB7IE5VTEwsCTAsIH0sCS8qIDB4MjggKi8KKwkgIHsgTlVMTCwJMCwgfSwJLyogMHgyOSAqLworCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJhICovCisJICB7IE5VTEwsCTAsIH0sCS8qIDB4MmIgKi8KKwkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYyAqLworCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJkICovCisJICB7IE5VTEwsCTAsIH0sCS8qIDB4MmUgKi8KKwkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZiAqLworCSAgeyAiYmJjIiwJMywgfSwJLyogMHgzMCAqLworCSAgeyAiY21wb2JnIiwJMywgfSwJLyogMHgzMSAqLworCSAgeyAiY21wb2JlIiwJMywgfSwJLyogMHgzMiAqLworCSAgeyAiY21wb2JnZSIsCTMsIH0sCS8qIDB4MzMgKi8KKwkgIHsgImNtcG9ibCIsCTMsIH0sCS8qIDB4MzQgKi8KKwkgIHsgImNtcG9ibmUiLAkzLCB9LAkvKiAweDM1ICovCisJICB7ICJjbXBvYmxlIiwJMywgfSwJLyogMHgzNiAqLworCSAgeyAiYmJzIiwJMywgfSwJLyogMHgzNyAqLworCSAgeyAiY21waWJubyIsCTMsIH0sCS8qIDB4MzggKi8KKwkgIHsgImNtcGliZyIsCTMsIH0sCS8qIDB4MzkgKi8KKwkgIHsgImNtcGliZSIsCTMsIH0sCS8qIDB4M2EgKi8KKwkgIHsgImNtcGliZ2UiLAkzLCB9LAkvKiAweDNiICovCisJICB7ICJjbXBpYmwiLAkzLCB9LAkvKiAweDNjICovCisJICB7ICJjbXBpYm5lIiwJMywgfSwJLyogMHgzZCAqLworCSAgeyAiY21waWJsZSIsCTMsIH0sCS8qIDB4M2UgKi8KKwkgIHsgImNtcGlibyIsCTMsIH0sCS8qIDB4M2YgKi8KKwl9OworCisJaSA9ICgod29yZDEgPj4gMjQpICYgMHhmZikgLSAweDIwOworCWlmICggY29icl90YWJbaV0ubmFtZSA9PSBOVUxMICl7CisJCWludmFsaWQoIHdvcmQxICk7CisJCXJldHVybjsKKwl9CisKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGNvYnJfdGFiW2ldLm5hbWUgKTsKKwlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLworCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKKwl9CisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJcdCIgKTsKKworCXNyYzEgPSAod29yZDEgPj4gMTkpICYgMHgxZjsKKwlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7CisKKwlpZiAoIHdvcmQxICYgMHgwMjAwMCApewkJLyogTTEgaXMgMSAqLworCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgc3JjMSApOworCX0gZWxzZSB7CQkJLyogTTEgaXMgMCAqLworCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3NyYzFdICk7CisJfQorCisJaWYgKCBjb2JyX3RhYltpXS5udW1vcHMgPiAxICl7CisJCWlmICggd29yZDEgJiAxICl7CQkvKiBTMiBpcyAxICovCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIixzZiVkLCIsIHNyYzIgKTsKKwkJfSBlbHNlIHsJCQkvKiBTMSBpcyAwICovCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwlcywiLCByZWdfbmFtZXNbc3JjMl0gKTsKKwkJfQorCisJCS8qIEV4dHJhY3QgZGlzcGxhY2VtZW50IGFuZCBjb252ZXJ0IHRvIGFkZHJlc3MKKwkJICovCisJCXdvcmQxICY9IDB4MDAwMDFmZmM7CisJCWlmICggd29yZDEgJiAweDAwMDAxMDAwICl7CS8qIE5lZ2F0aXZlIGRpc3BsYWNlbWVudCAqLworCQkJd29yZDEgfD0gKC0xICYgfjB4MWZmZik7CS8qIFNpZ24gZXh0ZW5kICovCisJCX0KKwkJcHJpbnRfYWRkciggbWVtYWRkciArIHdvcmQxICk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1FTSBmb3JtYXQJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAkJCQkvKiByZXR1cm5zIGluc3RydWN0aW9uIGxlbmd0aDogNCBvciA4ICovCittZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgbm9wcmludCApCisgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOworICAgIGludCBub3ByaW50OwkJLyogSWYgVFJVRSwgcmV0dXJuIGluc3RydWN0aW9uIGxlbmd0aCwgYnV0CisJCQkJICogZG9uJ3Qgb3V0cHV0IGFueSB0ZXh0LgorCQkJCSAqLworeworCWludCBpLCBqOworCWludCBsZW47CisJaW50IG1vZGU7CisJaW50IG9mZnNldDsKKwljb25zdCBjaGFyICpyZWcxLCAqcmVnMiwgKnJlZzM7CisKKwkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90CisJICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCisJICAgYXQgcnVudGltZS4gICovCisKKwkvKgorCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgorCSAqCSAxOiBzaW5nbGUgb3BlcmFuZAorCSAqCSAyOiAyIG9wZXJhbmRzLCBsb2FkIGluc3RydWN0aW9uCisJICoJLTI6IDIgb3BlcmFuZHMsIHN0b3JlIGluc3RydWN0aW9uCisJICovCisJc3RhdGljIHN0cnVjdCB0YWJlbnQgKm1lbV90YWI7CisvKiBPcGNvZGVzIG9mIDB4OFgsIDlYLCBhWCwgYlgsIGFuZCBjWCBtdXN0IGJlIGluIHRoZSB0YWJsZS4gICovCisjZGVmaW5lIE1FTV9NSU4JMHg4MAorI2RlZmluZSBNRU1fTUFYCTB4Y2YKKyNkZWZpbmUgTUVNX1NJWgkoICogc2l6ZW9mKHN0cnVjdCB0YWJlbnQpKQorCisJc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IG1lbV9pbml0W10gPSB7CisJICB7IDB4ODAsCSJsZG9iIiwJIDIgfSwKKwkgIHsgMHg4MiwJInN0b2IiLAktMiB9LAorCSAgeyAweDg0LAkiYngiLAkgMSB9LAorCSAgeyAweDg1LAkiYmFseCIsCSAyIH0sCisJICB7IDB4ODYsCSJjYWxseCIsIDEgfSwKKwkgIHsgMHg4OCwJImxkb3MiLAkgMiB9LAorCSAgeyAweDhhLAkic3RvcyIsCS0yIH0sCisJICB7IDB4OGMsCSJsZGEiLAkgMiB9LAorCSAgeyAweDkwLAkibGQiLAkgMiB9LAorCSAgeyAweDkyLAkic3QiLAktMiB9LAorCSAgeyAweDk4LAkibGRsIiwJIDIgfSwKKwkgIHsgMHg5YSwJInN0bCIsCS0yIH0sCisJICB7IDB4YTAsCSJsZHQiLAkgMiB9LAorCSAgeyAweGEyLAkic3R0IiwJLTIgfSwKKwkgIHsgMHhhYywJImRjaW52YSIsIDEgfSwKKwkgIHsgMHhiMCwJImxkcSIsCSAyIH0sCisJICB7IDB4YjIsCSJzdHEiLAktMiB9LAorCSAgeyAweGMwLAkibGRpYiIsCSAyIH0sCisJICB7IDB4YzIsCSJzdGliIiwJLTIgfSwKKwkgIHsgMHhjOCwJImxkaXMiLAkgMiB9LAorCSAgeyAweGNhLAkic3RpcyIsCS0yIH0sCisJICB7IDAsCQlOVUxMLAkwIH0KKwl9OworCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IG1lbV90YWJfYnVmW01FTV9NQVggLSBNRU1fTUlOICsgMV07CisKKwlpZiAoIG1lbV90YWIgPT0gTlVMTCApeworCQltZW1fdGFiID0gbWVtX3RhYl9idWY7CisJCWZvciAoIGkgPSAwOyBtZW1faW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7CisJCQlqID0gbWVtX2luaXRbaV0ub3Bjb2RlIC0gTUVNX01JTjsKKwkJCW1lbV90YWJbal0ubmFtZSA9IG1lbV9pbml0W2ldLm5hbWU7CisJCQltZW1fdGFiW2pdLm51bW9wcyA9IG1lbV9pbml0W2ldLm51bW9wczsKKwkJfQorCX0KKworCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gTUVNX01JTjsKKwltb2RlID0gKHdvcmQxID4+IDEwKSAmIDB4ZjsKKworCWlmICggKG1lbV90YWJbaV0ubmFtZSAhPSBOVUxMKQkJLyogVmFsaWQgaW5zdHJ1Y3Rpb24gKi8KKwkmJiAgICgobW9kZSA9PSA1KSB8fCAobW9kZSA+PTEyKSkgKXsJLyogV2l0aCAzMi1iaXQgZGlzcGxhY2VtZW50ICovCisJCWxlbiA9IDg7CisJfSBlbHNlIHsKKwkJbGVuID0gNDsKKwl9CisKKwlpZiAoIG5vcHJpbnQgKXsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiAoIChtZW1fdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKG1vZGUgPT0gNikgKXsKKwkJaW52YWxpZCggd29yZDEgKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzXHQiLCBtZW1fdGFiW2ldLm5hbWUgKTsKKworCXJlZzEgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxOSkgJiAweDFmIF07CS8qIE1FTUIgb25seSAqLworCXJlZzIgPSByZWdfbmFtZXNbICh3b3JkMSA+PiAxNCkgJiAweDFmIF07CisJcmVnMyA9IHJlZ19uYW1lc1sgd29yZDEgJiAweDFmIF07CQkvKiBNRU1CIG9ubHkgKi8KKwlvZmZzZXQgPSB3b3JkMSAmIDB4ZmZmOwkJCQkvKiBNRU1BIG9ubHkgICovCisKKwlzd2l0Y2ggKCBtZW1fdGFiW2ldLm51bW9wcyApeworCisJY2FzZSAyOiAvKiBMT0FEIElOU1RSVUNUSU9OICovCisJCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLworCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOworCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7CisJCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOworCQkJaWYgKG1vZGUgJiA4KSB7CisJCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOworCQkJfQorCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMiLCByZWcxICk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIC0yOiAvKiBTVE9SRSBJTlNUUlVDVElPTiAqLworCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsIiwgcmVnMSApOworCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOworCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLworCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlcywweCV4IiwgcmVnMSwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKKwkJCWlmIChtb2RlICYgOCkgeworCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgMTogLyogQlgvQ0FMTFggSU5TVFJVQ1RJT04gKi8KKwkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCisJCQllYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICk7CisJCX0gZWxzZSB7CQkJCS8qIE1FTUEgRk9STUFUICovCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjB4JXgiLCAodW5zaWduZWQpIG9mZnNldCApOworCQkJaWYgKG1vZGUgJiA4KSB7CisJCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVHIGZvcm1hdAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcmVnKCB3b3JkMSApCisgICAgdW5zaWduZWQgbG9uZyB3b3JkMTsKK3sKKwlpbnQgaSwgajsKKwlpbnQgb3Bjb2RlOworCWludCBmcDsKKwlpbnQgbTEsIG0yLCBtMzsKKwlpbnQgczEsIHMyOworCWludCBzcmMsIHNyYzIsIGRzdDsKKwljaGFyICptbmVtcDsKKworCS8qIFRoaXMgbG9va3VwIHRhYmxlIGlzIHRvbyBzcGFyc2UgdG8gbWFrZSBpdCB3b3J0aCB0eXBpbmcgaW4sIGJ1dCBub3QKKwkgICBzbyBsYXJnZSBhcyB0byBtYWtlIGEgc3BhcnNlIGFycmF5IG5lY2Vzc2FyeS4gIFdlIGNyZWF0ZSB0aGUgdGFibGUKKwkgICBhdCBydW50aW1lLiAgKi8KKworCS8qCisJICogTk9URTogSW4gdGhpcyB0YWJsZSwgdGhlIG1lYW5pbmcgb2YgJ251bW9wcycgaXM6CisJICoJIDE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBpcyBOT1QgYSBkZXN0aW5hdGlvbi4KKwkgKgktMTogc2luZ2xlIG9wZXJhbmQsIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCisJICoJIDI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCisJICoJLTI6IDIgb3BlcmFuZHMsIHRoZSAybmQgb2Ygd2hpY2ggSVMgYSBkZXN0aW5hdGlvbi4KKwkgKgkgMzogMyBvcGVyYW5kcworCSAqCisJICoJSWYgYW4gb3Bjb2RlIG1uZW1vbmljIGJlZ2lucyB3aXRoICJGIiwgaXQgaXMgYSBmbG9hdGluZy1wb2ludAorCSAqCW9wY29kZSAodGhlICJGIiBpcyBub3QgcHJpbnRlZCkuCisJICovCisKKwlzdGF0aWMgc3RydWN0IHRhYmVudCAqcmVnX3RhYjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJzZV90YWJlbnQgcmVnX2luaXRbXSA9IHsKKyNkZWZpbmUgUkVHX01JTgkweDU4MAorCSAgeyAweDU4MCwJIm5vdGJpdCIsCTMgfSwKKwkgIHsgMHg1ODEsCSJhbmQiLAkJMyB9LAorCSAgeyAweDU4MiwJImFuZG5vdCIsCTMgfSwKKwkgIHsgMHg1ODMsCSJzZXRiaXQiLAkzIH0sCisJICB7IDB4NTg0LAkibm90YW5kIiwJMyB9LAorCSAgeyAweDU4NiwJInhvciIsCQkzIH0sCisJICB7IDB4NTg3LAkib3IiLAkJMyB9LAorCSAgeyAweDU4OCwJIm5vciIsCQkzIH0sCisJICB7IDB4NTg5LAkieG5vciIsCQkzIH0sCisJICB7IDB4NThhLAkibm90IiwJCS0yIH0sCisJICB7IDB4NThiLAkib3Jub3QiLAkzIH0sCisJICB7IDB4NThjLAkiY2xyYml0IiwJMyB9LAorCSAgeyAweDU4ZCwJIm5vdG9yIiwJMyB9LAorCSAgeyAweDU4ZSwJIm5hbmQiLAkJMyB9LAorCSAgeyAweDU4ZiwJImFsdGVyYml0IiwJMyB9LAorCSAgeyAweDU5MCwgCSJhZGRvIiwJCTMgfSwKKwkgIHsgMHg1OTEsIAkiYWRkaSIsCQkzIH0sCisJICB7IDB4NTkyLCAJInN1Ym8iLAkJMyB9LAorCSAgeyAweDU5MywgCSJzdWJpIiwJCTMgfSwKKwkgIHsgMHg1OTQsCSJjbXBvYiIsCTIgfSwKKwkgIHsgMHg1OTUsCSJjbXBpYiIsCTIgfSwKKwkgIHsgMHg1OTYsCSJjbXBvcyIsCTIgfSwKKwkgIHsgMHg1OTcsCSJjbXBpcyIsCTIgfSwKKwkgIHsgMHg1OTgsIAkic2hybyIsCQkzIH0sCisJICB7IDB4NTlhLCAJInNocmRpIiwJMyB9LAorCSAgeyAweDU5YiwgCSJzaHJpIiwJCTMgfSwKKwkgIHsgMHg1OWMsIAkic2hsbyIsCQkzIH0sCisJICB7IDB4NTlkLCAJInJvdGF0ZSIsCTMgfSwKKwkgIHsgMHg1OWUsIAkic2hsaSIsCQkzIH0sCisJICB7IDB4NWEwLCAJImNtcG8iLAkJMiB9LAorCSAgeyAweDVhMSwgCSJjbXBpIiwJCTIgfSwKKwkgIHsgMHg1YTIsIAkiY29uY21wbyIsCTIgfSwKKwkgIHsgMHg1YTMsIAkiY29uY21waSIsCTIgfSwKKwkgIHsgMHg1YTQsIAkiY21waW5jbyIsCTMgfSwKKwkgIHsgMHg1YTUsIAkiY21waW5jaSIsCTMgfSwKKwkgIHsgMHg1YTYsIAkiY21wZGVjbyIsCTMgfSwKKwkgIHsgMHg1YTcsIAkiY21wZGVjaSIsCTMgfSwKKwkgIHsgMHg1YWMsIAkic2NhbmJ5dGUiLAkyIH0sCisJICB7IDB4NWFkLAkiYnN3YXAiLAktMiB9LAorCSAgeyAweDVhZSwgCSJjaGtiaXQiLAkyIH0sCisJICB7IDB4NWIwLCAJImFkZGMiLAkJMyB9LAorCSAgeyAweDViMiwgCSJzdWJjIiwJCTMgfSwKKwkgIHsgMHg1YjQsCSJpbnRkaXMiLAkwIH0sCisJICB7IDB4NWI1LAkiaW50ZW4iLAkwIH0sCisJICB7IDB4NWNjLAkibW92IiwJCS0yIH0sCisJICB7IDB4NWQ4LAkiZXNocm8iLAkzIH0sCisJICB7IDB4NWRjLAkibW92bCIsCQktMiB9LAorCSAgeyAweDVlYywJIm1vdnQiLAkJLTIgfSwKKwkgIHsgMHg1ZmMsCSJtb3ZxIiwJCS0yIH0sCisJICB7IDB4NjAwLAkic3lubW92IiwJMiB9LAorCSAgeyAweDYwMSwJInN5bm1vdmwiLAkyIH0sCisJICB7IDB4NjAyLAkic3lubW92cSIsCTIgfSwKKwkgIHsgMHg2MDMsCSJjbXBzdHIiLAkzIH0sCisJICB7IDB4NjA0LAkibW92cXN0ciIsCTMgfSwKKwkgIHsgMHg2MDUsCSJtb3ZzdHIiLAkzIH0sCisJICB7IDB4NjEwLAkiYXRtb2QiLAkzIH0sCisJICB7IDB4NjEyLAkiYXRhZGQiLAkzIH0sCisJICB7IDB4NjEzLAkiaW5zcGFjYyIsCS0yIH0sCisJICB7IDB4NjE0LAkibGRwaHkiLAktMiB9LAorCSAgeyAweDYxNSwJInN5bmxkIiwJLTIgfSwKKwkgIHsgMHg2MTcsCSJmaWxsIiwJCTMgfSwKKwkgIHsgMHg2MzAsCSJzZG1hIiwJCTMgfSwKKwkgIHsgMHg2MzEsCSJ1ZG1hIiwJCTAgfSwKKwkgIHsgMHg2NDAsCSJzcGFuYml0IiwJLTIgfSwKKwkgIHsgMHg2NDEsCSJzY2FuYml0IiwJLTIgfSwKKwkgIHsgMHg2NDIsCSJkYWRkYyIsCTMgfSwKKwkgIHsgMHg2NDMsCSJkc3ViYyIsCTMgfSwKKwkgIHsgMHg2NDQsCSJkbW92dCIsCS0yIH0sCisJICB7IDB4NjQ1LAkibW9kYWMiLAkzIH0sCisJICB7IDB4NjQ2LAkiY29uZHJlYyIsCS0yIH0sCisJICB7IDB4NjUwLAkibW9kaWZ5IiwJMyB9LAorCSAgeyAweDY1MSwJImV4dHJhY3QiLAkzIH0sCisJICB7IDB4NjU0LAkibW9kdGMiLAkzIH0sCisJICB7IDB4NjU1LAkibW9kcGMiLAkzIH0sCisJICB7IDB4NjU2LAkicmVjZWl2ZSIsCS0yIH0sCisJICB7IDB4NjU4LAkiaW50Y3RsIiwJLTIgfSwKKwkgIHsgMHg2NTksCSJzeXNjdGwiLAkzIH0sCisJICB7IDB4NjViLAkiaWNjdGwiLAkzIH0sCisJICB7IDB4NjVjLAkiZGNjdGwiLAkzIH0sCisJICB7IDB4NjVkLAkiaGFsdCIsCQkwIH0sCisJICB7IDB4NjYwLAkiY2FsbHMiLAkxIH0sCisJICB7IDB4NjYyLAkic2VuZCIsCQkzIH0sCisJICB7IDB4NjYzLAkic2VuZHNlcnYiLAkxIH0sCisJICB7IDB4NjY0LAkicmVzdW1wcmNzIiwJMSB9LAorCSAgeyAweDY2NSwJInNjaGVkcHJjcyIsCTEgfSwKKwkgIHsgMHg2NjYsCSJzYXZlcHJjcyIsCTAgfSwKKwkgIHsgMHg2NjgsCSJjb25kd2FpdCIsCTEgfSwKKwkgIHsgMHg2NjksCSJ3YWl0IiwJCTEgfSwKKwkgIHsgMHg2NmEsCSJzaWduYWwiLAkxIH0sCisJICB7IDB4NjZiLAkibWFyayIsCQkwIH0sCisJICB7IDB4NjZjLAkiZm1hcmsiLAkwIH0sCisJICB7IDB4NjZkLAkiZmx1c2hyZWciLAkwIH0sCisJICB7IDB4NjZmLAkic3luY2YiLAkwIH0sCisJICB7IDB4NjcwLAkiZW11bCIsCQkzIH0sCisJICB7IDB4NjcxLAkiZWRpdiIsCQkzIH0sCisJICB7IDB4NjczLCAJImxkdGltZSIsCS0xIH0sCisJICB7IDB4Njc0LAkiRmN2dGlyIiwJLTIgfSwKKwkgIHsgMHg2NzUsCSJGY3Z0aWxyIiwJLTIgfSwKKwkgIHsgMHg2NzYsCSJGc2NhbGVybCIsCTMgfSwKKwkgIHsgMHg2NzcsCSJGc2NhbGVyIiwJMyB9LAorCSAgeyAweDY4MCwJIkZhdGFuciIsCTMgfSwKKwkgIHsgMHg2ODEsCSJGbG9nZXByIiwJMyB9LAorCSAgeyAweDY4MiwJIkZsb2dyIiwJMyB9LAorCSAgeyAweDY4MywJIkZyZW1yIiwJMyB9LAorCSAgeyAweDY4NCwJIkZjbXBvciIsCTIgfSwKKwkgIHsgMHg2ODUsCSJGY21wciIsCTIgfSwKKwkgIHsgMHg2ODgsCSJGc3FydHIiLAktMiB9LAorCSAgeyAweDY4OSwJIkZleHByIiwJLTIgfSwKKwkgIHsgMHg2OGEsCSJGbG9nYm5yIiwJLTIgfSwKKwkgIHsgMHg2OGIsCSJGcm91bmRyIiwJLTIgfSwKKwkgIHsgMHg2OGMsCSJGc2luciIsCS0yIH0sCisJICB7IDB4NjhkLAkiRmNvc3IiLAktMiB9LAorCSAgeyAweDY4ZSwJIkZ0YW5yIiwJLTIgfSwKKwkgIHsgMHg2OGYsCSJGY2xhc3NyIiwJMSB9LAorCSAgeyAweDY5MCwJIkZhdGFucmwiLAkzIH0sCisJICB7IDB4NjkxLAkiRmxvZ2VwcmwiLAkzIH0sCisJICB7IDB4NjkyLAkiRmxvZ3JsIiwJMyB9LAorCSAgeyAweDY5MywJIkZyZW1ybCIsCTMgfSwKKwkgIHsgMHg2OTQsCSJGY21wb3JsIiwJMiB9LAorCSAgeyAweDY5NSwJIkZjbXBybCIsCTIgfSwKKwkgIHsgMHg2OTgsCSJGc3FydHJsIiwJLTIgfSwKKwkgIHsgMHg2OTksCSJGZXhwcmwiLAktMiB9LAorCSAgeyAweDY5YSwJIkZsb2dibnJsIiwJLTIgfSwKKwkgIHsgMHg2OWIsCSJGcm91bmRybCIsCS0yIH0sCisJICB7IDB4NjljLAkiRnNpbnJsIiwJLTIgfSwKKwkgIHsgMHg2OWQsCSJGY29zcmwiLAktMiB9LAorCSAgeyAweDY5ZSwJIkZ0YW5ybCIsCS0yIH0sCisJICB7IDB4NjlmLAkiRmNsYXNzcmwiLAkxIH0sCisJICB7IDB4NmMwLAkiRmN2dHJpIiwJLTIgfSwKKwkgIHsgMHg2YzEsCSJGY3Z0cmlsIiwJLTIgfSwKKwkgIHsgMHg2YzIsCSJGY3Z0enJpIiwJLTIgfSwKKwkgIHsgMHg2YzMsCSJGY3Z0enJpbCIsCS0yIH0sCisJICB7IDB4NmM5LAkiRm1vdnIiLAktMiB9LAorCSAgeyAweDZkOSwJIkZtb3ZybCIsCS0yIH0sCisJICB7IDB4NmUxLCAJIkZtb3ZyZSIsCS0yIH0sCisJICB7IDB4NmUyLCAJIkZjcHlzcmUiLAkzIH0sCisJICB7IDB4NmUzLCAJIkZjcHlyc3JlIiwJMyB9LAorCSAgeyAweDcwMSwJIm11bG8iLAkJMyB9LAorCSAgeyAweDcwOCwJInJlbW8iLAkJMyB9LAorCSAgeyAweDcwYiwJImRpdm8iLAkJMyB9LAorCSAgeyAweDc0MSwJIm11bGkiLAkJMyB9LAorCSAgeyAweDc0OCwJInJlbWkiLAkJMyB9LAorCSAgeyAweDc0OSwJIm1vZGkiLAkJMyB9LAorCSAgeyAweDc0YiwJImRpdmkiLAkJMyB9LAorCSAgeyAweDc4MCwJImFkZG9ubyIsCTMgfSwKKwkgIHsgMHg3ODEsCSJhZGRpbm8iLAkzIH0sCisJICB7IDB4NzgyLAkic3Vib25vIiwJMyB9LAorCSAgeyAweDc4MywJInN1YmlubyIsCTMgfSwKKwkgIHsgMHg3ODQsCSJzZWxubyIsCTMgfSwKKwkgIHsgMHg3OGIsCSJGZGl2ciIsCTMgfSwKKwkgIHsgMHg3OGMsCSJGbXVsciIsCTMgfSwKKwkgIHsgMHg3OGQsCSJGc3ViciIsCTMgfSwKKwkgIHsgMHg3OGYsCSJGYWRkciIsCTMgfSwKKwkgIHsgMHg3OTAsCSJhZGRvZyIsCTMgfSwKKwkgIHsgMHg3OTEsCSJhZGRpZyIsICAgICAgICAzIH0sCisJICB7IDB4NzkyLAkic3Vib2ciLAkzIH0sCisJICB7IDB4NzkzLAkic3ViaWciLAkzIH0sCisJICB7IDB4Nzk0LAkic2VsZyIsCQkzIH0sCisJICB7IDB4NzliLAkiRmRpdnJsIiwJMyB9LAorCSAgeyAweDc5YywJIkZtdWxybCIsCTMgfSwKKwkgIHsgMHg3OWQsCSJGc3VicmwiLAkzIH0sCisJICB7IDB4NzlmLAkiRmFkZHJsIiwJMyB9LAorCSAgeyAweDdhMCwJImFkZG9lIiwJMyB9LAorCSAgeyAweDdhMSwJImFkZGllIiwgICAgICAgIDMgfSwKKwkgIHsgMHg3YTIsCSJzdWJvZSIsCTMgfSwKKwkgIHsgMHg3YTMsCSJzdWJpZSIsCTMgfSwKKwkgIHsgMHg3YTQsCSJzZWxlIiwJCTMgfSwKKwkgIHsgMHg3YjAsCSJhZGRvZ2UiLAkzIH0sCisJICB7IDB4N2IxLAkiYWRkaWdlIiwJMyB9LAorCSAgeyAweDdiMiwJInN1Ym9nZSIsCTMgfSwKKwkgIHsgMHg3YjMsCSJzdWJpZ2UiLAkzIH0sCisJICB7IDB4N2I0LAkic2VsZ2UiLAkzIH0sCisJICB7IDB4N2MwLAkiYWRkb2wiLAkzIH0sCisJICB7IDB4N2MxLAkiYWRkaWwiLAkzIH0sCisJICB7IDB4N2MyLAkic3Vib2wiLAkzIH0sCisJICB7IDB4N2MzLAkic3ViaWwiLAkzIH0sCisJICB7IDB4N2M0LAkic2VsbCIsCQkzIH0sCisJICB7IDB4N2QwLAkiYWRkb25lIiwJMyB9LAorCSAgeyAweDdkMSwJImFkZGluZSIsCTMgfSwKKwkgIHsgMHg3ZDIsCSJzdWJvbmUiLAkzIH0sCisJICB7IDB4N2QzLAkic3ViaW5lIiwJMyB9LAorCSAgeyAweDdkNCwJInNlbG5lIiwJMyB9LAorCSAgeyAweDdlMCwJImFkZG9sZSIsCTMgfSwKKwkgIHsgMHg3ZTEsCSJhZGRpbGUiLAkzIH0sCisJICB7IDB4N2UyLAkic3Vib2xlIiwJMyB9LAorCSAgeyAweDdlMywJInN1YmlsZSIsCTMgfSwKKwkgIHsgMHg3ZTQsCSJzZWxsZSIsCTMgfSwKKwkgIHsgMHg3ZjAsCSJhZGRvbyIsCTMgfSwKKwkgIHsgMHg3ZjEsCSJhZGRpbyIsCTMgfSwKKwkgIHsgMHg3ZjIsCSJzdWJvbyIsCTMgfSwKKwkgIHsgMHg3ZjMsCSJzdWJpbyIsCTMgfSwKKwkgIHsgMHg3ZjQsCSJzZWxvIiwJCTMgfSwKKyNkZWZpbmUgUkVHX01BWCAweDdmNAorCSAgeyAwLAkJTlVMTCwJCTAgfQorCX07CisJc3RhdGljIHN0cnVjdCB0YWJlbnQgcmVnX3RhYl9idWZbUkVHX01BWCAtIFJFR19NSU4gKyAxXTsKKworCWlmICggcmVnX3RhYiA9PSBOVUxMICl7CisJCXJlZ190YWIgPSByZWdfdGFiX2J1ZjsKKwkJZm9yICggaSA9IDA7IHJlZ19pbml0W2ldLm9wY29kZSAhPSAwOyBpKysgKXsKKwkJCWogPSByZWdfaW5pdFtpXS5vcGNvZGUgLSBSRUdfTUlOOworCQkJcmVnX3RhYltqXS5uYW1lID0gcmVnX2luaXRbaV0ubmFtZTsKKwkJCXJlZ190YWJbal0ubnVtb3BzID0gcmVnX2luaXRbaV0ubnVtb3BzOworCQl9CisJfQorCisJb3Bjb2RlID0gKCh3b3JkMSA+PiAyMCkgJiAweGZmMCkgfCAoKHdvcmQxID4+IDcpICYgMHhmKTsKKwlpID0gb3Bjb2RlIC0gUkVHX01JTjsKKworCWlmICggKG9wY29kZTxSRUdfTUlOKSB8fCAob3Bjb2RlPlJFR19NQVgpIHx8IChyZWdfdGFiW2ldLm5hbWU9PU5VTEwpICl7CisJCWludmFsaWQoIHdvcmQxICk7CisJCXJldHVybjsKKwl9CisKKwltbmVtcCA9IHJlZ190YWJbaV0ubmFtZTsKKwlpZiAoICptbmVtcCA9PSAnRicgKXsKKwkJZnAgPSAxOworCQltbmVtcCsrOworCX0gZWxzZSB7CisJCWZwID0gMDsKKwl9CisKKwkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgbW5lbXAgKTsKKworCXMxICAgPSAod29yZDEgPj4gNSkgICYgMTsKKwlzMiAgID0gKHdvcmQxID4+IDYpICAmIDE7CisJbTEgICA9ICh3b3JkMSA+PiAxMSkgJiAxOworCW0yICAgPSAod29yZDEgPj4gMTIpICYgMTsKKwltMyAgID0gKHdvcmQxID4+IDEzKSAmIDE7CisJc3JjICA9ICB3b3JkMSAgICAgICAgJiAweDFmOworCXNyYzIgPSAod29yZDEgPj4gMTQpICYgMHgxZjsKKwlkc3QgID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7CisKKwlpZiAgKCByZWdfdGFiW2ldLm51bW9wcyAhPSAwICl7CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7CisKKwkJc3dpdGNoICggcmVnX3RhYltpXS5udW1vcHMgKXsKKwkJY2FzZSAxOgorCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOworCQkJYnJlYWs7CisJCWNhc2UgLTE6CisJCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7CisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7CisJCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOworCQkJYnJlYWs7CisJCWNhc2UgLTI6CisJCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7CisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7CisJCQlkc3RvcCggbTMsIGRzdCwgZnAgKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlyZWdvcCggbTEsIHMxLCBzcmMsIGZwICk7CisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiwiICk7CisJCQlyZWdvcCggbTIsIHMyLCBzcmMyLCBmcCApOworCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOworCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogUHJpbnQgb3V0IGVmZmVjdGl2ZSBhZGRyZXNzIGZvciBtZW1iIGluc3RydWN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK2VhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGludCBtb2RlOworICAgICBjaGFyICpyZWcyLCAqcmVnMzsKKyAgICAgaW50IHdvcmQxOworICAgICB1bnNpZ25lZCBpbnQgd29yZDI7Cit7CisJaW50IHNjYWxlOworCXN0YXRpYyBjb25zdCBpbnQgc2NhbGVfdGFiW10gPSB7IDEsIDIsIDQsIDgsIDE2IH07CisKKwlzY2FsZSA9ICh3b3JkMSA+PiA3KSAmIDB4MDc7CisJaWYgKCAoc2NhbGUgPiA0KSB8fCAoKCh3b3JkMSA+PiA1KSAmIDB4MDMpICE9IDApICl7CisJCWludmFsaWQoIHdvcmQxICk7CisJCXJldHVybjsKKwl9CisJc2NhbGUgPSBzY2FsZV90YWJbc2NhbGVdOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSA0OgkgCQkJCQkvKiAocmVnKSAqLworCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7CisJCWJyZWFrOworCWNhc2UgNToJCQkJCQkvKiBkaXNwbCs4KGlwKSAqLworCQlwcmludF9hZGRyKCB3b3JkMis4K21lbWFkZHIgKTsKKwkJYnJlYWs7CisJY2FzZSA3OgkJCQkJCS8qIChyZWcpW2luZGV4KnNjYWxlXSAqLworCQlpZiAoc2NhbGUgPT0gMSkgeworCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzXSIsIHJlZzIsIHJlZzMgKTsKKwkJfSBlbHNlIHsKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslcyolZF0iLHJlZzIscmVnMyxzY2FsZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxMjoJCQkJCS8qIGRpc3BsYWNlbWVudCAqLworCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOworCQlicmVhazsKKwljYXNlIDEzOgkJCQkJLyogZGlzcGwocmVnKSAqLworCQlwcmludF9hZGRyKCAoYmZkX3ZtYSl3b3JkMiApOworCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7CisJCWJyZWFrOworCWNhc2UgMTQ6CQkJCQkvKiBkaXNwbFtpbmRleCpzY2FsZV0gKi8KKwkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKKwkJaWYgKHNjYWxlID09IDEpIHsKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzXSIsIHJlZzMgKTsKKwkJfSBlbHNlIHsKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiWyVzKiVkXSIsIHJlZzMsIHNjYWxlICk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxNToJCQkJLyogZGlzcGwocmVnKVtpbmRleCpzY2FsZV0gKi8KKwkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKKwkJaWYgKHNjYWxlID09IDEpIHsKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7CisJCX0gZWxzZSB7CisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUgKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbnZhbGlkKCB3b3JkMSApOworCQlyZXR1cm47CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZWdpc3RlciBJbnN0cnVjdGlvbiBPcGVyYW5kICAJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3JlZ29wKCBtb2RlLCBzcGVjLCByZWcsIGZwICkKKyAgICBpbnQgbW9kZSwgc3BlYywgcmVnLCBmcDsKK3sKKwlpZiAoIGZwICl7CQkJCS8qIEZMT0FUSU5HIFBPSU5UIElOU1RSVUNUSU9OICovCisJCWlmICggbW9kZSA9PSAxICl7CQkJLyogRlAgb3BlcmFuZCAqLworCQkJc3dpdGNoICggcmVnICl7CisJCQljYXNlIDA6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMCIgKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDE6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMSIgKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDI6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMiIgKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDM6ICAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgImZwMyIgKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDE2OiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMC4wIiApOworCQkJICBicmVhazsKKwkJCWNhc2UgMjI6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiMGYxLjAiICk7CisJCQkgIGJyZWFrOworCQkJZGVmYXVsdDogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICI/IiApOworCQkJICBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsJCQkJLyogTm9uLUZQIHJlZ2lzdGVyICovCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgcmVnX25hbWVzW3JlZ10gKTsKKwkJfQorCX0gZWxzZSB7CQkJCS8qIE5PVCBGTE9BVElORyBQT0lOVCAqLworCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIExpdGVyYWwgKi8KKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJWQiLCByZWcgKTsKKwkJfSBlbHNlIHsJCQkJLyogUmVnaXN0ZXIgKi8KKwkJCWlmICggc3BlYyA9PSAwICl7CisJCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7CisJCQl9IGVsc2UgeworCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAic2YlZCIsIHJlZyApOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gRGVzdGluYXRpb24gT3BlcmFuZAkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkc3RvcCggbW9kZSwgcmVnLCBmcCApCisgICAgaW50IG1vZGUsIHJlZywgZnA7Cit7CisJLyogJ2RzdCcgb3BlcmFuZCBjYW4ndCBiZSBhIGxpdGVyYWwuIE9uIG5vbi1GUCBpbnN0cnVjdGlvbnMsICByZWdpc3RlcgorCSAqIG1vZGUgaXMgYXNzdW1lZCBhbmQgIm0zIiBhY3RzIGFzIGlmIHdlcmUgInMzIjsgIG9uIEZQLWluc3RydWN0aW9ucywKKwkgKiBzZiByZWdpc3RlcnMgYXJlIG5vdCBhbGxvd2VkIHNvIG0zIGFjdHMgbm9ybWFsbHkuCisJICovCisJIGlmICggZnAgKXsKKwkJcmVnb3AoIG1vZGUsIDAsIHJlZywgZnAgKTsKKwkgfSBlbHNlIHsKKwkJcmVnb3AoIDAsIG1vZGUsIHJlZywgZnAgKTsKKwkgfQorfQorCisKK3N0YXRpYyB2b2lkCitpbnZhbGlkKCB3b3JkMSApCisgICAgaW50IHdvcmQxOworeworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLndvcmRcdDB4JTA4eCIsICh1bnNpZ25lZCkgd29yZDEgKTsKK30JCisKK3N0YXRpYyB2b2lkCitwcmludF9hZGRyKGEpCitiZmRfdm1hIGE7Cit7CisgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYSwgaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkCitwdXRfYWJzKCB3b3JkMSwgd29yZDIgKQorICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOworeworI2lmZGVmIElOX0dEQgorCXJldHVybjsKKyNlbHNlCisJaW50IGxlbjsKKworCXN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKXsKKwljYXNlIDB4ODoKKwljYXNlIDB4OToKKwljYXNlIDB4YToKKwljYXNlIDB4YjoKKwljYXNlIDB4YzoKKwkJLyogTUVNIGZvcm1hdCBpbnN0cnVjdGlvbiAqLworCQlsZW4gPSBtZW0oIDAsIHdvcmQxLCB3b3JkMiwgMSApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsZW4gPSA0OworCQlicmVhazsKKwl9CisKKwlpZiAoIGxlbiA9PSA4ICl7CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJTA4eCAlMDh4XHQiLCB3b3JkMSwgd29yZDIgKTsKKwl9IGVsc2UgeworCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggICAgICAgICBcdCIsIHdvcmQxICk7CisJfQorOworCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMjAwLWRpcy5jIGIvb3Bjb2Rlcy9tMTAyMDAtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyYzdlMwotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTEwMjAwLWRpcy5jCkBAIC0wLDAgKzEsMzQxIEBACisvKiBEaXNhc3NlbWJsZSBNTjEwMjAwIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIgCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgIm9waW50bC5oIgorCitzdGF0aWMgdm9pZCBkaXNhc3NlbWJsZSBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAorCQkJCSB1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcsCisJCQkJIHVuc2lnbmVkIGludCkpOworCitpbnQgCitwcmludF9pbnNuX21uMTAyMDAgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGludCBzdGF0dXM7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworICB1bnNpZ25lZCBsb25nIGV4dGVuc2lvbiA9IDA7CisgIHVuc2lnbmVkIGludCBjb25zdW1lOworCisgIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgb3Bjb2RlIGlzLiAgKi8KKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAxLCBpbmZvKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKKworICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLworICBpZiAoKGluc24gJiAweGYwKSA9PSAweDAwCisgICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKKyAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgyMAorICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDMwCisgICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDgwCisJICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKKyAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg5MAorICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweGEwCisgICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKKyAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlYgorICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY2CisgICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmUKKyAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZikKKyAgICB7CisgICAgICBleHRlbnNpb24gPSAwOworICAgICAgY29uc3VtZSA9IDE7CisgICAgfQorCisgIC8qIFRoZXNlIGFyZSB0d28gYnl0ZSBpbnNucy4gICovCisgIGVsc2UgaWYgKChpbnNuICYgMHhmMCkgPT0gMHg0MAorCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg1MAorCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg2MAorCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAorCSAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg4MAorCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAorCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkNAorCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkOAorCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhlMAorCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhlNAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlOAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlOQorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhlYQorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMykKKyAgICB7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgIHJldHVybiAtMTsKKwl9CisgICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKKyAgICAgIGNvbnN1bWUgPSAyOworICAgIH0KKworICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucyB3aXRoIGEgMTZiaXQgb3BlcmFuZCBpbiBsaXR0bGUKKyAgICAgZW5kaWFuIGZvcm0uICAqLworICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4YzAKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZGMKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZWMKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjgKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmEKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmIKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmMKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmQpCisgICAgeworICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgaW5zbiA8PD0gMTY7CisgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7CisgICAgICBleHRlbnNpb24gPSAwOworICAgICAgY29uc3VtZSA9IDM7CisgICAgfQorICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucyB0b28sIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIG1lc3Mgd2l0aAorICAgICBlbmRpYW5uZXNzIHN0dWZmLiAgKi8KKyAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY1KQorICAgIHsKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGluc24gPDw9IDE2OworICAgICAgaW5zbiB8PSBiZmRfZ2V0YjE2IChidWZmZXIpOworICAgICAgZXh0ZW5zaW9uID0gMDsKKyAgICAgIGNvbnN1bWUgPSAzOworICAgIH0KKworICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KKyAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY3KQorICAgIHsKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7CisgICAgICBpbnNuIDw8PSAxNjsKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKKyAgICAgIGV4dGVuc2lvbiA9IDA7CisgICAgICBjb25zdW1lID0gNDsKKyAgICB9CisKKyAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCisgIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmNCkKKyAgICB7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOworICAgICAgaW5zbiA8PD0gMTY7CisKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA0LCBidWZmZXIsIDEsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGluc24gfD0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlciA8PCA4KSAmIDB4ZmYwMDsKKworICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDMsIGJ1ZmZlciwgMSwgaW5mbyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgaW5zbiB8PSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyKSAmIDB4ZmY7CisKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDEsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGV4dGVuc2lvbiA9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIpICYgMHhmZjsKKyAgICAgIGNvbnN1bWUgPSA1OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwMngiKSwgaW5zbik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGV4dGVuc2lvbiwgY29uc3VtZSk7CisKKyAgcmV0dXJuIGNvbnN1bWU7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgZXh0ZW5zaW9uLCBzaXplKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKiltbjEwMjAwX29wY29kZXM7CisgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKm9wZXJhbmQ7CisgIGludCBtYXRjaCA9IDA7CisKKyAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KKyAgd2hpbGUgKG9wLT5uYW1lKQorICAgIHsKKyAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OworCisgICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMSkKKwlteXNpemUgPSAxOworICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMgorCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF80KQorCW15c2l6ZSA9IDI7CisgICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8zCisJICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzUpCisJbXlzaXplID0gMzsKKyAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzYpCisJbXlzaXplID0gNDsKKyAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzcpCisJbXlzaXplID0gNTsKKyAgICAgIGVsc2UKKwlhYm9ydCAoKTsKKwkKKyAgICAgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8yIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzUpCisJZXh0cmFfc2hpZnQgPSA4OworICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfMworCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF82CisJICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzcpCisJZXh0cmFfc2hpZnQgPSAxNjsKKyAgICAgIGVsc2UKKwlleHRyYV9zaGlmdCA9IDA7CisKKyAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCisJICAmJiBzaXplID09ICh1bnNpZ25lZCBpbnQpIG15c2l6ZSkKKwl7CisJICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKKwkgIHVuc2lnbmVkIGludCBub2NvbW1hOworCSAgaW50IHBhcmVuID0gMDsKKwkgIAorCSAgbWF0Y2ggPSAxOworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOworCisJICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KKwkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG5vY29tbWEgPSAxOworCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKKwkgICAgICAgb3BpbmRleF9wdHIrKykKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKKworCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfRVhURU5ERUQpICE9IDApCisJCXsKKwkJICB2YWx1ZSA9IChpbnNuICYgMHhmZmZmKSA8PCA4OworCQkgIHZhbHVlIHw9IGV4dGVuc2lvbjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHZhbHVlID0gKChpbnNuID4+IChvcGVyYW5kLT5zaGlmdCkpCisJCQkgICAmICgoMUwgPDwgb3BlcmFuZC0+Yml0cykgLSAxTCkpOworCQl9CisKKwkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKKwkJdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQorCQkJICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7CisKKwkgICAgICBpZiAoIW5vY29tbWEKKwkJICAmJiAoIXBhcmVuCisJCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUEFSRU4pID09IDApKSkKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7CisKKwkgICAgICBub2NvbW1hID0gMDsKKwkJCisJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9EUkVHKSAhPSAwKQorCQl7CisJCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQorCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCB2YWx1ZSk7CisJCX0KKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9BUkVHKSAhPSAwKQorCQl7CisJCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQorCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCB2YWx1ZSk7CisJCX0KKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QU1cpICE9IDApCisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAicHN3Iik7CisKKwkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTURSKSAhPSAwKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm1kciIpOworCisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BBUkVOKSAhPSAwKQorCQl7CisJCSAgaWYgKHBhcmVuKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKKwkJICAgICAgbm9jb21tYSA9IDE7CisJCSAgICB9CisJCSAgcGFyZW4gPSAhcGFyZW47CisJCX0KKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKKwkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgodmFsdWUgKyBtZW1hZGRyICsgbXlzaXplKSAmIDB4ZmZmZmZmLCBpbmZvKTsKKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRU1BRERSKSAhPSAwKQorCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKKworCSAgICAgIGVsc2UgCisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOworCSAgICB9CisJICAvKiBBbGwgZG9uZS4gKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIG9wKys7CisgICAgfQorCisgIGlmICghbWF0Y2gpCisgICAgeworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNGx4IiksIGluc24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMjAwLW9wYy5jIGIvb3Bjb2Rlcy9tMTAyMDAtb3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3MGI5MAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTEwMjAwLW9wYy5jCkBAIC0wLDAgKzEsMzYwIEBACisvKiBBc3NlbWJsZSBNYXRzdXNoaXRhIE1OMTAyMDAgaW5zdHJ1Y3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgorCisMCitjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXSA9IHsKKyNkZWZpbmUgVU5VU0VECTAKKyAgezAsIDAsIDB9LCAKKworLyogZG4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBETjAgICAgICAoVU5VU0VEKzEpCisgIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCisKKy8qIGRuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEROMSAgICAgIChETjArMSkKKyAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKKworLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBETTAgICAgICAoRE4xKzEpCisgIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCisKKy8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIERNMSAgICAgIChETTArMSkKKyAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKKworLyogYW4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBBTjAgICAgICAoRE0xKzEpCisgIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCisKKy8qIGFuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEFOMSAgICAgIChBTjArMSkKKyAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKKworLyogYW0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBBTTAgICAgICAoQU4xKzEpCisgIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCisKKy8qIGFtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEFNMSAgICAgIChBTTArMSkKKyAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKKworLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKKyAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCisjZGVmaW5lIElNTTggICAgKEFNMSsxKQorICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAorCisvKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKKyAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCisjZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCisgIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAorCisvKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKKyAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCisjZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQorICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAorCisvKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKKyAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KKyNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQorICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAorCisvKiAyNCBpbW1lZGlhdGUsIGxvdyAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCisgICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4gICovCisKKyNkZWZpbmUgSU1NMjQgICAgKElNTTE2X01FTSsxKQorICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRH0sCisKKy8qIDMyYml0IHBjLXJlbGF0aXZlIG9mZnNldC4gICovCisjZGVmaW5lIElNTTI0X1BDUkVMICAgIChJTU0yNCsxKQorICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAorCisvKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgSU1NMjRfTUVNICAgIChJTU0yNF9QQ1JFTCsxKQorICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9NRU1BRERSfSwKKworLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KKyNkZWZpbmUgUFNXICAgIChJTU0yNF9NRU0rMSkKKyAgezAsIDAsIE1OMTAyMDBfT1BFUkFORF9QU1d9LAorCisvKiBNRFIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBNRFIgICAgKFBTVysxKQorICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX01EUn0sCisKKy8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgREkgKE1EUisxKQorICB7MiwgNCwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAorCisvKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGFjZW1lbnQuICAqLworI2RlZmluZSBTRDggICAgKERJKzEpCisgIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAorCisvKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGFjZW1lbnQuICAqLworI2RlZmluZSBTRDE2ICAgIChTRDgrMSkKKyAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAorCisvKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLworI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDE2KzEpCisgIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYfSwKKworLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KKyNkZWZpbmUgU0lNTTggICAgKFNEOE5fUENSRUwrMSkKKyAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCisKKy8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0ICBpbW1lZGlhdGUuICAqLworI2RlZmluZSBTSU1NMTYgICAgKFNJTU04KzEpCisgIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKKworLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IG5vdCBwcm9tb3RlLiAgKi8KKyNkZWZpbmUgU0lNTTE2TiAgICAoU0lNTTE2KzEpCisgIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLfSwKKworLyogRWl0aGVyIGFuIG9wZW4gcGFyZW4gb3IgY2xvc2UgcGFyZW4uICAqLworI2RlZmluZSBQQVJFTgkoU0lNTTE2TisxKQorICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BBUkVOfSwgCisKKy8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLworI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKKyAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKKworLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCisjZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCisgIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFRyB8IE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRH0sCit9IDsgCisKKyNkZWZpbmUgTUVNKEFERFIpIFBBUkVOLCBBRERSLCBQQVJFTiAKKyNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCisMCisvKiBUaGUgb3Bjb2RlIHRhYmxlLgorCisgICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6CisKKyAgIE5BTUUJCU9QQ09ERQkJTUFTSwkJeyBPUEVSQU5EUyB9CisKKyAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgorICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCisgICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgorICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgorICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCisKKyAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0CisgICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQorICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbworICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCisKK2NvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSBtbjEwMjAwX29wY29kZXNbXSA9IHsKK3sgIm1vdiIsCTB4ODAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7U0lNTTgsIEROMDF9fSwKK3sgIm1vdiIsCTB4ODAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoreyAibW92IiwJMHhmMjMwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTEsIEFOMH19LAoreyAibW92IiwJMHhmMmYwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoreyAibW92IiwJMHhmMjcwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoreyAibW92IiwJMHhmM2YwLAkJMHhmZmZjLAkJRk1UXzQsIHtQU1csIEROMH19LAoreyAibW92IiwJMHhmM2QwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIFBTV319LAoreyAibW92IiwJMHhmM2UwLAkJMHhmZmZjLAkJRk1UXzQsIHtNRFIsIEROMH19LAoreyAibW92IiwJMHhmM2MwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIE1EUn19LAoreyAibW92IiwJMHgyMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKK3sgIm1vdiIsCTB4NjAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoreyAibW92IiwJMHhmN2MwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoreyAibW92IiwJMHhmNDgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoreyAibW92IiwJMHhmMTQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKK3sgIm1vdiIsCTB4YzgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCit7ICJtb3YiLAkweGY0YzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKK3sgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsQU4xKSwgQU0wfX0sCit7ICJtb3YiLAkweDcwMDAsCQkweGYwMDAsCQlGTVRfMiwge01FTShBTjEpLCBBTTB9fSwKK3sgIm1vdiIsCTB4ZjdiMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBBTTB9fSwKK3sgIm1vdiIsCTB4ZjRmMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBBTTB9fSwKK3sgIm1vdiIsCTB4ZjEwMCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgQU0wfX0sCit7ICJtb3YiLAkweGY3MzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge01FTShJTU0xNl9NRU0pLCBBTjB9fSwKK3sgIm1vdiIsCTB4ZjRkMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEFOMH19LAoreyAibW92IiwJMHgwMCwJCTB4ZjAsCQlGTVRfMSwge0RNMCwgTUVNKEFOMSl9fSwKK3sgIm1vdiIsCTB4NDAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7RE0wLCBNRU0yKFNEOCwgQU4xKX19LAoreyAibW92IiwJMHhmNzgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoreyAibW92IiwJMHhmNDAwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKK3sgIm1vdiIsCTB4ZjFjMCwJCTB4ZmZjMCwJCUZNVF80LCB7RE0wLCBNRU0yKERJLCBBTjEpfX0sCit7ICJtb3YiLAkweGMwMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoreyAibW92IiwJMHhmNDQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCit7ICJtb3YiLAkweDUwMDAsCQkweGYwMDAsCQlGTVRfMiwge0FNMCwgTUVNMihTRDgsIEFOMSl9fSwKK3sgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0oQU4xKX19LAoreyAibW92IiwJMHhmN2EwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtBTTAsIE1FTTIoU0QxNiwgQU4xKX19LAoreyAibW92IiwJMHhmNDEwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtBTTAsIE1FTTIoSU1NMjQsQU4xKX19LAoreyAibW92IiwJMHhmMTgwLAkJMHhmZmMwLAkJRk1UXzQsIHtBTTAsIE1FTTIoREksIEFOMSl9fSwKK3sgIm1vdiIsCTB4ZjcyMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7QU4wLCBNRU0oSU1NMTZfTUVNKX19LAoreyAibW92IiwJMHhmNDUwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtBTjAsIE1FTShJTU0yNF9NRU0pfX0sCit7ICJtb3YiLAkweGY4MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7U0lNTTE2LCBETjB9fSwKK3sgIm1vdiIsCTB4ZjQ3MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoreyAibW92IiwJMHhkYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKK3sgIm1vdiIsCTB4ZjQ3NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAorCit7ICJtb3Z4IiwJMHhmNTcwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKK3sgIm1vdngiLAkweGY3NzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCit7ICJtb3Z4IiwJMHhmNGIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoreyAibW92eCIsCTB4ZjU1MDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCit7ICJtb3Z4IiwJMHhmNzYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoreyAibW92eCIsCTB4ZjQzMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCisKK3sgIm1vdmIiLAkweGY1MjAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoreyAibW92YiIsCTB4ZjdkMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKK3sgIm1vdmIiLAkweGY0YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCit7ICJtb3ZiIiwJMHhmMDQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKK3sgIm1vdmIiLAkweGY0YzQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKK3sgIm1vdmIiLAkweDEwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoreyAibW92YiIsCTB4ZjUxMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCit7ICJtb3ZiIiwJMHhmNzkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoreyAibW92YiIsCTB4ZjQyMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCit7ICJtb3ZiIiwJMHhmMGMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKK3sgIm1vdmIiLAkweGM0MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoreyAibW92YiIsCTB4ZjQ0NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7RE4wLCBNRU0oSU1NMjRfTUVNKX19LAorCit7ICJtb3ZidSIsCTB4MzAsCQkweGYwLAkJRk1UXzEsIHtNRU0oQU4xKSwgRE0wfX0sCit7ICJtb3ZidSIsCTB4ZjUzMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCit7ICJtb3ZidSIsCTB4Zjc1MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKK3sgIm1vdmJ1IiwJMHhmNDkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoreyAibW92YnUiLAkweGYwODAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoreyAibW92YnUiLAkweGNjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7TUVNKElNTTE2X01FTSksIEROMH19LAoreyAibW92YnUiLAkweGY0YzgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKKworeyAiZXh0IiwJMHhmM2MxLAkJMHhmZmYzLAkJRk1UXzQsIHtETjF9fSwKK3sgImV4dHgiLAkweGIwLCAJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoreyAiZXh0eHUiLAkweGI0LAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCit7ICJleHR4YiIsCTB4YjgsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKK3sgImV4dHhidSIsCTB4YmMsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKKworeyAiYWRkIiwJMHg5MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCit7ICJhZGQiLAkweGYyMDAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCit7ICJhZGQiLAkweGYyYzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCit7ICJhZGQiLAkweGYyNDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCit7ICJhZGQiLAkweGQ0MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKK3sgImFkZCIsCTB4ZjcxODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKK3sgImFkZCIsCTB4ZjQ2MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoreyAiYWRkIiwJMHhkMDAwLAkJMHhmYzAwLAkJRk1UXzIsIHtTSU1NOCwgQU4wfX0sCit7ICJhZGQiLAkweGY3MDgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNiwgQU4wfX0sCit7ICJhZGQiLAkweGY0NjQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKK3sgImFkZGMiLAkweGYyODAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCit7ICJhZGRuZiIsCTB4ZjUwYzAwLAkweGZmZmMwMCwJRk1UXzUsIHtTSU1NOCwgQU4wfX0sCisKK3sgInN1YiIsCTB4YTAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoreyAic3ViIiwJMHhmMjEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIEFOMH19LAoreyAic3ViIiwJMHhmMmQwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoreyAic3ViIiwJMHhmMjUwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoreyAic3ViIiwJMHhmNzFjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgRE4wfX0sCit7ICJzdWIiLAkweGY0NjgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKK3sgInN1YiIsCTB4ZjcwYzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7SU1NMTYsIEFOMH19LAoreyAic3ViIiwJMHhmNDZjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCit7ICJzdWJjIiwJMHhmMjkwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAorCit7ICJtdWwiLAkweGYzNDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCit7ICJtdWx1IiwJMHhmMzUwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAorCit7ICJkaXZ1IiwJMHhmMzYwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAorCit7ICJjbXAiLAkweGYzOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCit7ICJjbXAiLAkweGYyMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCit7ICJjbXAiLAkweGYyZTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCit7ICJjbXAiLAkweGYyNjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCit7ICJjbXAiLAkweGQ4MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKK3sgImNtcCIsCTB4Zjc0ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKK3sgImNtcCIsCTB4ZjQ3ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoreyAiY21wIiwJMHhlYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKK3sgImNtcCIsCTB4ZjQ3YzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAorCit7ICJhbmQiLAkweGYzMDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCit7ICJhbmQiLAkweGY1MDAwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCit7ICJhbmQiLAkweGY3MDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoreyAiYW5kIiwJMHhmNzEwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBQU1d9fSwKK3sgIm9yIiwJCTB4ZjMxMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKK3sgIm9yIiwJCTB4ZjUwODAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKK3sgIm9yIiwJCTB4Zjc0MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCit7ICJvciIsCQkweGY3MTQwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoreyAieG9yIiwJMHhmMzIwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoreyAieG9yIiwJMHhmNzRjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKK3sgIm5vdCIsCTB4ZjNlNCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCisKK3sgImFzciIsCTB4ZjMzOCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCit7ICJsc3IiLAkweGYzM2MsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoreyAicm9yIiwJMHhmMzM0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKK3sgInJvbCIsCTB4ZjMzMCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCisKK3sgImJ0c3QiLAkweGY1MDQwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCit7ICJidHN0IiwJMHhmNzA0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKK3sgImJzZXQiLAkweGYwMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKK3sgImJjbHIiLAkweGYwMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKKworeyAiYmVxIiwJMHhlODAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCit7ICJibmUiLAkweGU5MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKK3sgImJsdCIsCTB4ZTAwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoreyAiYmxlIiwJMHhlMzAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCit7ICJiZ2UiLAkweGUyMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKK3sgImJndCIsCTB4ZTEwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoreyAiYmNzIiwJMHhlNDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCit7ICJibHMiLAkweGU3MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKK3sgImJjYyIsCTB4ZTYwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoreyAiYmhpIiwJMHhlNTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCit7ICJidmMiLAkweGY1ZmMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYnZzIiwJMHhmNWZkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKK3sgImJuYyIsCTB4ZjVmZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCit7ICJibnMiLAkweGY1ZmYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYnJhIiwJMHhlYTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCisKK3sgImJlcXgiLAkweGY1ZTgwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYm5leCIsCTB4ZjVlOTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCit7ICJibHR4IiwJMHhmNWUwMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKK3sgImJsZXgiLAkweGY1ZTMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYmdleCIsCTB4ZjVlMjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCit7ICJiZ3R4IiwJMHhmNWUxMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKK3sgImJjc3giLAkweGY1ZTQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYmxzeCIsCTB4ZjVlNzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCit7ICJiY2N4IiwJMHhmNWU2MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKK3sgImJoaXgiLAkweGY1ZTUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYnZjeCIsCTB4ZjVlYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCit7ICJidnN4IiwJMHhmNWVkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKK3sgImJuY3giLAkweGY1ZWUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoreyAiYm5zeCIsCTB4ZjVlZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCisKK3sgImptcCIsCTB4ZmMwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoreyAiam1wIiwJMHhmNGUwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoreyAiam1wIiwJMHhmMDAwLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKK3sgImpzciIsCTB4ZmQwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoreyAianNyIiwJMHhmNGUxMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoreyAianNyIiwJMHhmMDAxLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKKworeyAibm9wIiwJMHhmNiwJCTB4ZmYsCQlGTVRfMSwge1VOVVNFRH19LAorCit7ICJydHMiLAkweGZlLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCit7ICJydGkiLAkweGViLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCisKKy8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKKyAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KK3sgInN5c2NhbGwiLAkweGYwMTAsCQkweGZmZmYsCQlGTVRfNCwge1VOVVNFRH19LAorCisvKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KKyAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0CisgICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQorICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQorICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KKyAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KK3sgImJyZWFrIiwgICAgICAweGZmLCAgICAgICAgICAgMHhmZiwgICAgICAgICAgIEZNVF8xLCB7VU5VU0VEfX0sCisKK3sgMCwgMCwgMCwgMCwgezB9fSwKKworfSA7CisKK2NvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzID0KKyAgc2l6ZW9mIChtbjEwMjAwX29wY29kZXMpIC8gc2l6ZW9mIChtbjEwMjAwX29wY29kZXNbMF0pOworCisMCmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDMwMC1kaXMuYyBiL29wY29kZXMvbTEwMzAwLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL20xMDMwMC1kaXMuYwpAQCAtMCwwICsxLDU0OCBAQAorLyogRGlzYXNzZW1ibGUgTU4xMDMwMCBpbnN0cnVjdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiIAorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworc3RhdGljIHZvaWQgZGlzYXNzZW1ibGUgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwKKwkJCQkgdW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBpbnQpKTsKKworaW50IAorcHJpbnRfaW5zbl9tbjEwMzAwIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpbnQgc3RhdHVzOworICBiZmRfYnl0ZSBidWZmZXJbNF07CisgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgdW5zaWduZWQgaW50IGNvbnN1bWU7CisKKyAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBpbnNuID0gKih1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKKworICAvKiBUaGVzZSBhcmUgb25lIGJ5dGUgaW5zbnMuICAqLworICBpZiAoKGluc24gJiAweGYzKSA9PSAweDAwCisgICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MTAKKyAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHgzYworICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQxCisgICAgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDAKKyAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1MAorICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU0CisgICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NjAKKyAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHg3MAorICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg4MAorCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCisgICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweDkwCisJICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKKyAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YTAKKwkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQorICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhiMAorCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCisgICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2IKKyAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkMAorICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0CisgICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDgKKyAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhlMAorICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQorICAgIHsKKyAgICAgIGNvbnN1bWUgPSAxOworICAgIH0KKworICAvKiBUaGVzZSBhcmUgdHdvIGJ5dGUgaW5zbnMuICAqLworICBlbHNlIGlmICgoaW5zbiAmIDB4ZjApID09IDB4ODAKKwkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4OTAKKwkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKKwkgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YjAKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjAKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjgKKwkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDMKKwkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4NDIKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTgKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NWMKKwkgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGMwCisJICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjYgorCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2MKKwkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNkKQorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMQorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMgorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmMworCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNQorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmNikKKyAgICB7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgIHJldHVybiAtMTsKKwl9CisgICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKKyAgICAgIGNvbnN1bWUgPSAyOworICAgIH0KKworICAvKiBUaGVzZSBhcmUgdGhyZWUgYnl0ZSBpbnNucy4gICovCisgIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmOAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhjYyAKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjkKKwkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDEKKwkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDIKKwkgICB8fCAoaW5zbiAmIDB4ZjMpID09IDB4MDMKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MjQKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MmMKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzAKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzQKKwkgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4MzgKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGUKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGYKKwkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MpCisgICAgeworICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwl7CisJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKKyAgICAgIGluc24gPDw9IDg7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAxLCBpbmZvKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwl7CisJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBpbnNuIHw9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKKyAgICAgIGNvbnN1bWUgPSAzOworICAgIH0KKworICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIGluc25zLiAgKi8KKyAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGZhCisJICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZiKQorICAgIHsKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7CisgICAgICBjb25zdW1lID0gNDsKKyAgICB9CisKKyAgLyogVGhlc2UgYXJlIGZpdmUgYnl0ZSBpbnNucy4gICovCisgIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhjZAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhkYykKKyAgICB7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOworICAgICAgY29uc3VtZSA9IDU7CisgICAgfQorCisgIC8qIFRoZXNlIGFyZSBzaXggYnl0ZSBpbnNucy4gICovCisgIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmZAorCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYykKKyAgICB7CisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKworICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7CisgICAgICBjb25zdW1lID0gNjsKKyAgICB9CisKKyAgLyogRWxzZSBpdHMgYSBzZXZlbiBieXRlIGluc25zIChpbiB0aGVvcnkpLiAgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKKyAgICAgIGNvbnN1bWUgPSA3OworICAgIH0KKworICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgY29uc3VtZSk7CisKKyAgcmV0dXJuIGNvbnN1bWU7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgc2l6ZSkKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcCA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiltbjEwMzAwX29wY29kZXM7CisgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gPSAwOworICBpbnQgc3RhdHVzLCBtYXRjaCA9IDA7CisKKyAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KKyAgd2hpbGUgKG9wLT5uYW1lKQorICAgIHsKKyAgICAgIGludCBteXNpemUsIGV4dHJhX3NoaWZ0OworCisgICAgICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzApCisJbXlzaXplID0gMTsKKyAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MxCisJICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0QwKQorCW15c2l6ZSA9IDI7CisgICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMgorCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMSkKKwlteXNpemUgPSAzOworICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzQpCisJbXlzaXplID0gNTsKKyAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyKQorCW15c2l6ZSA9IDQ7CisgICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9ENCkKKwlteXNpemUgPSA2OworICAgICAgZWxzZQorCW15c2l6ZSA9IDc7CisJCisgICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQorCSAgJiYgc2l6ZSA9PSAodW5zaWduZWQgaW50KSBteXNpemUKKwkgICYmIChvcC0+bWFjaGluZSA9PSAwCisJICAgICAgfHwgb3AtPm1hY2hpbmUgPT0gaW5mby0+bWFjaCkpCisJeworCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7CisJICB1bnNpZ25lZCBpbnQgbm9jb21tYTsKKwkgIGludCBwYXJlbiA9IDA7CisJICAKKwkgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMSB8fCBvcC0+Zm9ybWF0ID09IEZNVF9TMSkKKwkgICAgZXh0cmFfc2hpZnQgPSA4OworCSAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDQKKwkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzQKKwkJICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzYgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDUpCisJICAgIGV4dHJhX3NoaWZ0ID0gMTY7CisJICBlbHNlCisJICAgIGV4dHJhX3NoaWZ0ID0gMDsKKworCSAgaWYgKHNpemUgPT0gMSB8fCBzaXplID09IDIpCisJICAgIHsKKwkgICAgICBleHRlbnNpb24gPSAwOworCSAgICB9CisJICBlbHNlIGlmIChzaXplID09IDMKKwkJICAgJiYgKG9wLT5mb3JtYXQgPT0gRk1UX0QxCisJCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGYwMDAwCisJCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZGUwMDAwKSkKKwkgICAgeworCSAgICAgIGV4dGVuc2lvbiA9IDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKHNpemUgPT0gMykKKwkgICAgeworCSAgICAgIGluc24gJj0gMHhmZjAwMDA7CisJICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7CisJICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJCSAgcmV0dXJuOworCQl9CisKKwkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7CisJICAgICAgZXh0ZW5zaW9uID0gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoc2l6ZSA9PSA0CisJCSAgICYmIChvcC0+b3Bjb2RlID09IDB4ZmFmODAwMDAKKwkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWYwMDAwMAorCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGZhZjQwMDAwKSkKKwkgICAgeworCSAgICAgIGV4dGVuc2lvbiA9IDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKHNpemUgPT0gNCkKKwkgICAgeworCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKKwkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCAyLCBpbmZvKTsKKwkgICAgICBpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKwkJICByZXR1cm47CisJCX0KKworCSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKKwkgICAgICBleHRlbnNpb24gPSAwOworCSAgICB9CisJICBlbHNlIGlmIChzaXplID09IDUgJiYgb3AtPm9wY29kZSA9PSAweGRjMDAwMDAwKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKKwkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKKwkgICAgICBpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisKKwkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7CisJICAgICAgaW5zbiB8PSAodGVtcCAmIDB4ZmZmZmZmMDApID4+IDg7CisJICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmY7CisJICAgIH0KKwkgIGVsc2UgaWYgKHNpemUgPT0gNSkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7CisJICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7CisJICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgdGVtcCB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOworCisJICAgICAgaW5zbiAmPSAweGZmMDAwMGZmOworCSAgICAgIGluc24gfD0gdGVtcCA8PCA4OworCisJICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDQsIGJ1ZmZlciwgMSwgaW5mbyk7CisJICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgZXh0ZW5zaW9uID0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOworCSAgICB9CisJICBlbHNlIGlmIChzaXplID09IDYpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOworCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDQsIGluZm8pOworCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwkJeworCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKKworCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKKwkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDE2KSAmIDB4ZmZmZjsKKwkgICAgICBleHRlbnNpb24gPSB0ZW1wICYgMHhmZmZmOworCSAgICB9CisJICBlbHNlIGlmIChzaXplID09IDcgJiYgb3AtPm9wY29kZSA9PSAweGRkMDAwMDAwKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKKwkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCA0LCBpbmZvKTsKKwkgICAgICBpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisKKwkgICAgICBpbnNuICY9IDB4ZmYwMDAwMDA7CisJICAgICAgaW5zbiB8PSAodGVtcCA+PiA4KSAmIDB4ZmZmZmZmOworCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZikgPDwgMTY7CisJICAgICAgCisJICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDUsIGJ1ZmZlciwgMiwgaW5mbyk7CisJICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgZXh0ZW5zaW9uIHw9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7CisJICAgIH0KKwkgIGVsc2UgaWYgKHNpemUgPT0gNykKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7CisJICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgNCwgaW5mbyk7CisJICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOworCisJICAgICAgaW5zbiAmPSAweGZmZmYwMDAwOworCSAgICAgIGluc24gfD0gKHRlbXAgPj4gMTYpICYgMHhmZmZmOworCSAgICAgIGV4dGVuc2lvbiA9ICh0ZW1wICYgMHhmZmZmKSA8PCA4OworCSAgICAgIAorCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA2LCBidWZmZXIsIDEsIGluZm8pOworCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwkJeworCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIGV4dGVuc2lvbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7CisJICAgIH0KKworCSAgbWF0Y2ggPSAxOworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOworCisJICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLiAgKi8KKwkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG5vY29tbWEgPSAxOworCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKKwkgICAgICAgb3BpbmRleF9wdHIrKykKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKKworCisJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUExJVCkgIT0gMCkKKwkJeworCQkgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKwkJICB2YWx1ZSA9IGluc24gJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKKwkJICB2YWx1ZSA8PD0gKDMyIC0gb3BlcmFuZC0+Yml0cyk7CisJCSAgdGVtcCA9IGV4dGVuc2lvbiA+PiBvcGVyYW5kLT5zaGlmdDsKKwkJICB0ZW1wICY9ICgoMSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKTsKKwkJICB2YWx1ZSB8PSB0ZW1wOworCQl9CisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKSAhPSAwKQorCQl7CisJCSAgdmFsdWUgPSAoKGV4dGVuc2lvbiA+PiAob3BlcmFuZC0+c2hpZnQpKQorCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQpKQorCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7CisJCX0KKworCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwCisJCSAgKQorCQl2YWx1ZSA9ICgobG9uZykodmFsdWUgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpCisJCQkgID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKTsKKworCSAgICAgIGlmICghbm9jb21tYQorCQkgICYmICghcGFyZW4KKwkJICAgICAgfHwgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikgPT0gMCkpKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKworCSAgICAgIG5vY29tbWEgPSAwOworCQkKKwkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0RSRUcpICE9IDApCisJCXsKKwkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCisJCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQlZCIsIHZhbHVlKTsKKwkJfQorCisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0FSRUcpICE9IDApCisJCXsKKwkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCisJCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImElZCIsIHZhbHVlKTsKKwkJfQorCisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQKSAhPSAwKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNwIik7CisKKwkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUFNXKSAhPSAwKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInBzdyIpOworCisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX01EUikgIT0gMCkKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJtZHIiKTsKKworCisJICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BBUkVOKSAhPSAwKQorCQl7CisJCSAgaWYgKHBhcmVuKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKKwkJICAgICAgbm9jb21tYSA9IDE7CisJCSAgICB9CisJCSAgcGFyZW4gPSAhcGFyZW47CisJCX0KKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKKwkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobG9uZykgdmFsdWUgKyBtZW1hZGRyLCBpbmZvKTsKKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRU1BRERSKSAhPSAwKQorCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKKworCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVCkgIT0gMCkKKwkJeworCQkgIGludCBjb21tYSA9IDA7CisKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlsiKTsKKwkJICBpZiAodmFsdWUgJiAweDgwKQorCQkgICAgeworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQyIik7CisJCSAgICAgIGNvbW1hID0gMTsKKwkJICAgIH0KKworCQkgIGlmICh2YWx1ZSAmIDB4NDApCisJCSAgICB7CisJCSAgICAgIGlmIChjb21tYSkKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQzIik7CisJCSAgICAgIGNvbW1hID0gMTsKKwkJICAgIH0KKworCQkgIGlmICh2YWx1ZSAmIDB4MjApCisJCSAgICB7CisJCSAgICAgIGlmIChjb21tYSkKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEyIik7CisJCSAgICAgIGNvbW1hID0gMTsKKwkJICAgIH0KKworCQkgIGlmICh2YWx1ZSAmIDB4MTApCisJCSAgICB7CisJCSAgICAgIGlmIChjb21tYSkKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImEzIik7CisJCSAgICAgIGNvbW1hID0gMTsKKwkJICAgIH0KKworCQkgIGlmICh2YWx1ZSAmIDB4MDgpCisJCSAgICB7CisJCSAgICAgIGlmIChjb21tYSkKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIm90aGVyIik7CisJCSAgICAgIGNvbW1hID0gMTsKKwkJICAgIH0KKworCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOworCQl9CisKKwkgICAgICBlbHNlIAorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOworCSAgICB9CisJICAvKiBBbGwgZG9uZS4gKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIG9wKys7CisgICAgfQorCisgIGlmICghbWF0Y2gpCisgICAgeworICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCJ1bmtub3duXHQweCUwNHgiKSwgaW5zbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMgYi9vcGNvZGVzL20xMDMwMC1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBjMGYzCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKQEAgLTAsMCArMSw2ODMgQEAKKy8qIEFzc2VtYmxlIE1hdHN1c2hpdGEgTU4xMDMwMCBpbnN0cnVjdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBpcyBmb3JtYXR0ZWQgYXQgPiA4MCBjb2x1bW5zLiAgQXR0ZW1wdGluZyB0byByZWFkIGl0IG9uIGEKKyAgIHNjcmVlZW4gd2l0aCBsZXNzIHRoYW4gODAgY29sdW1ucyB3aWxsIGJlIGRpZmZpY3VsdC4gICovCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIgorCisMCitjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kIG1uMTAzMDBfb3BlcmFuZHNbXSA9IHsKKyNkZWZpbmUgVU5VU0VECTAKKyAgezAsIDAsIDB9LCAKKworLyogZG4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBETjAgICAgICAoVU5VU0VEKzEpCisgIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCisKKy8qIGRuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEROMSAgICAgIChETjArMSkKKyAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKKworLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBETjIgICAgICAoRE4xKzEpCisgIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCisKKy8qIGRtIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KKyNkZWZpbmUgRE0wICAgICAgKEROMisxKQorICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAorCisvKiBkbSByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBETTEgICAgICAoRE0wKzEpCisgIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCisKKy8qIGRtIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KKyNkZWZpbmUgRE0yICAgICAgKERNMSsxKQorICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAorCisvKiBhbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEFOMCAgICAgIChETTIrMSkKKyAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKKworLyogYW4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KKyNkZWZpbmUgQU4xICAgICAgKEFOMCsxKQorICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAorCisvKiBhbiByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEFOMiAgICAgIChBTjErMSkKKyAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKKworLyogYW0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBBTTAgICAgICAoQU4yKzEpCisgIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCisKKy8qIGFtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCisjZGVmaW5lIEFNMSAgICAgIChBTTArMSkKKyAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKKworLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLworI2RlZmluZSBBTTIgICAgICAoQU0xKzEpCisgIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCisKKy8qIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDE2Yml0CisgICB1bnNpZ25lZCBpbW1lZGlhdGUuICAqLworI2RlZmluZSBJTU04ICAgIChBTTIrMSkKKyAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKKworLyogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDMyYml0CisgICB1bnNpZ25lZCBpbW1lZGlhdGUuICAqLworI2RlZmluZSBJTU0xNiAgICAoSU1NOCsxKQorICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKKworLyogMTYgYml0IHBjLXJlbGF0aXZlIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byBhIDE2Yml0CisgICBwYy1yZWxhdGl2ZSBpbW1lZGlhdGUuICAqLworI2RlZmluZSBJTU0xNl9QQ1JFTCAgICAoSU1NMTYrMSkKKyAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfUENSRUwgfCBNTjEwMzAwX09QRVJBTkRfUkVMQVggfCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKKworLyogMTZiaXQgdW5zaWduZWQgZGlzcGFjZW1lbnQgaW4gYSBtZW1vcnkgb3BlcmF0aW9uIHdoaWNoCisgICBtYXkgcHJvbW90ZSB0byBhIDMyYml0IGRpc3BsYWNlbWVudC4gICovCisjZGVmaW5lIElNTTE2X01FTSAgICAoSU1NMTZfUENSRUwrMSkKKyAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKKworLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDE2IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KKyAgIHdvcmQsIDE2Yml0cyBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuIAorCisgICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKKyAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KKyNkZWZpbmUgSU1NMzIgICAgKElNTTE2X01FTSsxKQorICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVH0sCisKKy8qIDMyYml0IHBjLXJlbGF0aXZlIG9mZnNldC4gICovCisjZGVmaW5lIElNTTMyX1BDUkVMICAgIChJTU0zMisxKQorICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCisKKy8qIDMyYml0IG1lbW9yeSBvZmZzZXQuICAqLworI2RlZmluZSBJTU0zMl9NRU0gICAgKElNTTMyX1BDUkVMKzEpCisgIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAorCisvKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMTYgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgorICAgd29yZCwgMTZiaXRzIGluIHRoZSBleHRlbnNpb24gd29yZCwgbG93IDE2Yml0cyBhcmUgbGVmdAorICAgc2hpZnRlZCA4IHBsYWNlcy4gCisKKyAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQorICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLworI2RlZmluZSBJTU0zMl9MT1dTSElGVDggICAgKElNTTMyX01FTSsxKQorICB7MTYsIDgsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9NRU1BRERSfSwKKworLyogMzJiaXQgaW1tZWRpYXRlLCBoaWdoIDI0IGJpdHMgaW4gdGhlIG1haW4gaW5zdHJ1Y3Rpb24KKyAgIHdvcmQsIDggaW4gdGhlIGV4dGVuc2lvbiB3b3JkLgorCisgICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKKyAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KKyNkZWZpbmUgSU1NMzJfSElHSDI0ICAgIChJTU0zMl9MT1dTSElGVDgrMSkKKyAgezI0LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAorCisvKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMjQgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgorICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQsIGxvdyA4IGJpdHMgYXJlIGxlZnQKKyAgIHNoaWZ0ZWQgMTYgcGxhY2VzLiAKKworICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCisgICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCisjZGVmaW5lIElNTTMyX0hJR0gyNF9MT1dTSElGVDE2ICAgIChJTU0zMl9ISUdIMjQrMSkKKyAgezI0LCAxNiwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKKworLyogU3RhY2sgcG9pbnRlci4gICovCisjZGVmaW5lIFNQICAgIChJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNisxKQorICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQfSwKKworLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KKyNkZWZpbmUgUFNXICAgIChTUCsxKQorICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BTV30sCisKKy8qIE1EUiByZWdpc3Rlci4gICovCisjZGVmaW5lIE1EUiAgICAoUFNXKzEpCisgIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfTURSfSwKKworLyogSW5kZXggcmVnaXN0ZXIuICAqLworI2RlZmluZSBESSAoTURSKzEpCisgIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCisKKy8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDE2Yml0IHNpZ25lZCBkaXNwYWNlbWVudC4gICovCisjZGVmaW5lIFNEOCAgICAoREkrMSkKKyAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCisKKy8qIDE2IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAzMmJpdCBkaXNwYWNlbWVudC4gICovCisjZGVmaW5lIFNEMTYgICAgKFNEOCsxKQorICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCisKKy8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgdGhhdCBjYW4gbm90IHByb21vdGUuICAqLworI2RlZmluZSBTRDhOICAgIChTRDE2KzEpCisgIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKKworLyogOCBiaXQgcGMtcmVsYXRpdmUgZGlzcGxhY2VtZW50LiAgKi8KKyNkZWZpbmUgU0Q4Tl9QQ1JFTCAgICAoU0Q4TisxKQorICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWH0sCisKKy8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgc2hpZnRlZCBsZWZ0IDggYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTRDhOX1NISUZUOCAgICAoU0Q4Tl9QQ1JFTCsxKQorICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCisKKy8qIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGltbWVkaWF0ZS4gICovCisjZGVmaW5lIFNJTU04ICAgIChTRDhOX1NISUZUOCsxKQorICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKKworLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgIGltbWVkaWF0ZS4gICovCisjZGVmaW5lIFNJTU0xNiAgICAoU0lNTTgrMSkKKyAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAorCisvKiBFaXRoZXIgYW4gb3BlbiBwYXJlbiBvciBjbG9zZSBwYXJlbi4gICovCisjZGVmaW5lIFBBUkVOCShTSU1NMTYrMSkKKyAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9QQVJFTn0sIAorCisvKiBkbiByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIgcG9zaXRpb25zLiAgKi8KKyNkZWZpbmUgRE4wMSAgICAgKFBBUkVOKzEpCisgIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCisKKy8qIGFuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLworI2RlZmluZSBBTjAxICAgICAoRE4wMSsxKQorICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUcgfCBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUR9LAorCisvKiAxNmJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQgd2hpY2ggbWF5IHByb21vdGUgdG8gMzJiaXQgcGMtcmVsYXRpdmUKKyAgIGRpc3BsYWNlbWVudC4gICovCisjZGVmaW5lIEQxNl9TSElGVCAoQU4wMSsxKQorICB7MTYsIDgsIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAorCisvKiA4IGJpdCBpbW1lZGlhdGUgZm91bmQgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLiAgKi8KKyNkZWZpbmUgSU1NOEUgICAgKEQxNl9TSElGVCsxKQorICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEfSwKKworLyogUmVnaXN0ZXIgbGlzdCBmb3VuZCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQgc2hpZnRlZCA4IGJpdHMgbGVmdC4gICovCisjZGVmaW5lIFJFR1NFX1NISUZUOCAgICAoSU1NOEUrMSkKKyAgezgsIDgsIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCisKKy8qIFJlZ2lzdGVyIGxpc3Qgc2hpZnRlZCA4IGJpdHMgbGVmdC4gICovCisjZGVmaW5lIFJFR1NfU0hJRlQ4IChSRUdTRV9TSElGVDggKyAxKQorICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKKworLyogUmVpZ3N0ZXIgbGlzdC4gICovCisjZGVmaW5lIFJFR1MgICAgKFJFR1NfU0hJRlQ4KzEpCisgIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAorCisKK30gOyAKKworI2RlZmluZSBNRU0oQUREUikgUEFSRU4sIEFERFIsIFBBUkVOIAorI2RlZmluZSBNRU1JTkMoQUREUikgUEFSRU4sIEFERFIsIFBMVVMsIFBBUkVOIAorI2RlZmluZSBNRU1JTkMyKEFERFIsSU5DKSBQQVJFTiwgQUREUiwgUExVUywgSU5DLCBQQVJFTiAKKyNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCisMCisvKiBUaGUgb3Bjb2RlIHRhYmxlLgorCisgICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6CisKKyAgIE5BTUUJCU9QQ09ERQkJTUFTSwlNQVRDSF9NQVNLLCBGT1JNQVQsIFBST0NFU1NPUgl7IE9QRVJBTkRTIH0KKworICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KKyAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCisgICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCisgICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KKworICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKKyAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCisgICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCisgICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KKworY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlIG1uMTAzMDBfb3Bjb2Rlc1tdID0geworeyAibW92IiwJMHg4MDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoreyAibW92IiwJMHg4MCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJtb3YiLAkweGYxZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCit7ICJtb3YiLAkweGYxZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCit7ICJtb3YiLAkweDkwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKK3sgIm1vdiIsCTB4OTAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoreyAibW92IiwJMHgzYywJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe1NQLCBBTjB9fSwKK3sgIm1vdiIsCTB4ZjJmMCwJICAgICAweGZmZjMsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBTUH19LAoreyAibW92IiwJMHhmMmU0LAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQU1csIEROMH19LAoreyAibW92IiwJMHhmMmYzLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIFBTV319LAoreyAibW92IiwJMHhmMmUwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtNRFIsIEROMH19LAoreyAibW92IiwJMHhmMmYyLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1EUn19LAoreyAibW92IiwJMHg3MCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe01FTShBTTApLCBETjF9fSwKK3sgIm1vdiIsCTB4NTgwMCwJICAgICAweGZjZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCit7ICJtb3YiLAkweDMwMDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKK3sgIm1vdiIsCTB4ZjAwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEFOMX19LAoreyAibW92IiwJMHg1YzAwLAkgICAgIDB4ZmNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBBTjB9fSwKK3sgIm1vdiIsCTB4ZmFhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNKElNTTE2X01FTSksIEFOMH19LAoreyAibW92IiwJMHg2MCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKK3sgIm1vdiIsCTB4NDIwMCwJICAgICAweGYzZmYsCSAgMCwgICAgRk1UX1MxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCit7ICJtb3YiLAkweDAxMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKK3sgIm1vdiIsCTB4ZjAxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBNRU0oQU4wKX19LAoreyAibW92IiwJMHg0MzAwLAkgICAgIDB4ZjNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtBTTEsIE1FTShTUCl9fSwKK3sgIm1vdiIsCTB4ZmE4MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0oSU1NMTZfTUVNKX19LAoreyAibW92IiwJMHg1YzAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0yKElNTTgsIFNQKSwgQU4wfX0sCit7ICJtb3YiLAkweGY4MDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKK3sgIm1vdiIsCTB4ZmEwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKK3sgIm1vdiIsCTB4NTgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoreyAibW92IiwJMHhmYWI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoreyAibW92IiwJMHhmMzAwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKK3sgIm1vdiIsCTB4ZjgyMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsQU0wKSwgQU4xfX0sCit7ICJtb3YiLAkweGZhMjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgQU4xfX0sCit7ICJtb3YiLAkweGZhYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgQU4wfX0sCit7ICJtb3YiLAkweGYzODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEFOMn19LAoreyAibW92IiwJMHg0MzAwLAkgICAgIDB4ZjMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtBTTEsIE1FTTIoSU1NOCwgU1ApfX0sCit7ICJtb3YiLAkweGY4MTAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKK3sgIm1vdiIsCTB4ZmExMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKK3sgIm1vdiIsCTB4NDIwMCwJICAgICAweGYzMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoreyAibW92IiwJMHhmYTkxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoreyAibW92IiwJMHhmMzQwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKK3sgIm1vdiIsCTB4ZjgzMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7QU0xLCBNRU0yKFNEOCwgQU4wKX19LAoreyAibW92IiwJMHhmYTMwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTTIoU0QxNiwgQU4wKX19LAoreyAibW92IiwJMHhmYTkwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTTIoSU1NMTYsIFNQKX19LAoreyAibW92IiwJMHhmM2MwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTIsIE1FTTIoREksIEFOMCl9fSwKKworLyogVGhlc2UgbXVzdCBjb21lIGFmdGVyIG1vc3Qgb2YgdGhlIG90aGVyIG1vdmUgaW5zdHJ1Y3Rpb25zIHRvIGF2b2lkIG1hdGNoaW5nCisgICBhIHN5bWJvbGljIG5hbWUgd2l0aCBJTU14eCBvcGVyYW5kcy4gIFVnaC4gICovCit7ICJtb3YiLAkweDJjMDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1NJTU0xNiwgRE4wfX0sCit7ICJtb3YiLAkweGZjY2MwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgIm1vdiIsCTB4MjQwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7SU1NMTYsIEFOMH19LAoreyAibW92IiwJMHhmY2RjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCit7ICJtb3YiLAkweGZjYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBETjB9fSwKK3sgIm1vdiIsCTB4ZmNhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEFOMH19LAoreyAibW92IiwJMHhmYzgxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCit7ICJtb3YiLAkweGZjODAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNKElNTTMyX01FTSl9fSwKK3sgIm1vdiIsCTB4ZmMwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKK3sgIm1vdiIsCTB4ZmNiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKK3sgIm1vdiIsCTB4ZmMyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBBTjF9fSwKK3sgIm1vdiIsCTB4ZmNiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBBTjB9fSwKK3sgIm1vdiIsCTB4ZmMxMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKK3sgIm1vdiIsCTB4ZmM5MTAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKK3sgIm1vdiIsCTB4ZmMzMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0yKElNTTMyLEFOMCl9fSwKK3sgIm1vdiIsCTB4ZmM5MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0yKElNTTMyLCBTUCl9fSwKKy8qIFRoZXNlIG5vbi1wcm9tb3RpbmcgdmFyaWFudHMgbmVlZCB0byBjb21lIGFmdGVyIGFsbCB0aGUgb3RoZXIgbWVtb3J5CisgICBtb3Zlcy4gICovCit7ICJtb3YiLAkweGY4ZjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe01FTTIoU0Q4TiwgQU0wKSwgU1B9fSwKK3sgIm1vdiIsCTB4ZjhmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U1AsIE1FTTIoU0Q4TiwgQU4wKX19LAorCisKKworeyAibW92YnUiLAkweGYwNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTShBTTApLCBETjF9fSwKK3sgIm1vdmJ1IiwJMHhmODQwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCwgQU0wKSwgRE4xfX0sCit7ICJtb3ZidSIsCTB4ZmE0MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKK3sgIm1vdmJ1IiwJMHhmOGI4MDAsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0oU1ApLCBETjB9fSwKK3sgIm1vdmJ1IiwJMHhmOGI4MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCit7ICJtb3ZidSIsCTB4ZmFiODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBETjB9fSwKK3sgIm1vdmJ1IiwJMHhmNDAwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKK3sgIm1vdmJ1IiwJMHgzNDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCit7ICJtb3ZidSIsCTB4ZjA1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoreyAibW92YnUiLAkweGY4NTAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKK3sgIm1vdmJ1IiwJMHhmYTUwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoreyAibW92YnUiLAkweGY4OTIwMCwgICAgMHhmZmYzZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNKFNQKX19LAoreyAibW92YnUiLAkweGY4OTIwMCwgICAgMHhmZmYzMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihJTU04LCBTUCl9fSwKK3sgIm1vdmJ1IiwJMHhmYTkyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoreyAibW92YnUiLAkweGY0NDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoreyAibW92YnUiLAkweDAyMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKK3sgIm1vdmJ1IiwJMHhmYzQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoreyAibW92YnUiLAkweGZjYjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCit7ICJtb3ZidSIsCTB4ZmNhODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoreyAibW92YnUiLAkweGZjNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCit7ICJtb3ZidSIsCTB4ZmM5MjAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKK3sgIm1vdmJ1IiwJMHhmYzgyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCisKK3sgIm1vdmh1IiwJMHhmMDYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCit7ICJtb3ZodSIsCTB4Zjg2MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoreyAibW92aHUiLAkweGZhNjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCit7ICJtb3ZodSIsCTB4ZjhiYzAwLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNKFNQKSwgRE4wfX0sCit7ICJtb3ZodSIsCTB4ZjhiYzAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihJTU04LCBTUCksIEROMH19LAoreyAibW92aHUiLAkweGZhYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCit7ICJtb3ZodSIsCTB4ZjQ4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCit7ICJtb3ZodSIsCTB4MzgwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoreyAibW92aHUiLAkweGYwNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKK3sgIm1vdmh1IiwJMHhmODcwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCit7ICJtb3ZodSIsCTB4ZmE3MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKK3sgIm1vdmh1IiwJMHhmODkzMDAsICAgIDB4ZmZmM2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTShTUCl9fSwKK3sgIm1vdmh1IiwJMHhmODkzMDAsICAgIDB4ZmZmMzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCit7ICJtb3ZodSIsCTB4ZmE5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKElNTTE2LCBTUCl9fSwKK3sgIm1vdmh1IiwJMHhmNGMwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTIsIE1FTTIoREksIEFOMCl9fSwKK3sgIm1vdmh1IiwJMHgwMzAwMDAsICAgIDB4ZjMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtETTEsIE1FTShJTU0xNl9NRU0pfX0sCit7ICJtb3ZodSIsCTB4ZmM2MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKK3sgIm1vdmh1IiwJMHhmY2JjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEROMH19LAoreyAibW92aHUiLAkweGZjYWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTShJTU0zMl9NRU0pLCBETjB9fSwKK3sgIm1vdmh1IiwJMHhmYzcwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoreyAibW92aHUiLAkweGZjOTMwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMiwgU1ApfX0sCit7ICJtb3ZodSIsCTB4ZmM4MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0oSU1NMzJfTUVNKX19LAorCit7ICJleHQiLAkweGYyZDAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAorCit7ICJleHRiIiwJMHgxMCwgCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKKworeyAiZXh0YnUiLAkweDE0LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCisKK3sgImV4dGgiLAkweDE4LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCisKK3sgImV4dGh1IiwJMHgxYywJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAorCit7ICJtb3ZtIiwJMHhjZTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBSRUdTfX0sCit7ICJtb3ZtIiwJMHhjZjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtSRUdTLCBNRU0oU1ApfX0sCisKK3sgImNsciIsCTB4MDAsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtETjF9fSwKKworeyAiYWRkIiwJMHhlMCwJICAgICAweGYwLAkgIDAsICAgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJhZGQiLAkweGYxNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCit7ICJhZGQiLAkweGYxNTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCit7ICJhZGQiLAkweGYxNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgQU4wfX0sCit7ICJhZGQiLAkweDI4MDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgImFkZCIsCTB4ZmFjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBETjB9fSwKK3sgImFkZCIsCTB4MjAwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEFOMH19LAoreyAiYWRkIiwJMHhmYWQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEFOMH19LAoreyAiYWRkIiwJMHhmOGZlMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgU1B9fSwKK3sgImFkZCIsCTB4ZmFmZTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBTUH19LAoreyAiYWRkIiwJMHhmY2MwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJhZGQiLAkweGZjZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKK3sgImFkZCIsCTB4ZmNmZTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIFNQfX0sCisKK3sgImFkZGMiLAkweGYxNDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCisKK3sgInN1YiIsCTB4ZjEwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInN1YiIsCTB4ZjEyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKK3sgInN1YiIsCTB4ZjExMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKK3sgInN1YiIsCTB4ZjEzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBBTjB9fSwKK3sgInN1YiIsCTB4ZmNjNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAic3ViIiwJMHhmY2Q0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgQU4wfX0sCisKK3sgInN1YmMiLAkweGYxODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCisKK3sgIm11bCIsCTB4ZjI0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKKworeyAibXVsdSIsCTB4ZjI1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKKworeyAiZGl2IiwJMHhmMjYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAorCit7ICJkaXZ1IiwJMHhmMjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAorCit7ICJpbmMiLAkweDQwLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4xfX0sCit7ICJpbmMiLAkweDQxLAkgICAgIDB4ZjMsCSAgMCwgICAgRk1UX1MwLCAwLAl7QU4xfX0sCisKK3sgImluYzQiLAkweDUwLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7QU4wfX0sCisKK3sgImNtcCIsCTB4YTAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMDF9fSwKK3sgImNtcCIsCTB4YTAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtETTEsIEROMH19LAoreyAiY21wIiwJMHhmMWEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoreyAiY21wIiwJMHhmMTkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoreyAiY21wIiwJMHhiMDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtJTU04LCBBTjAxfX0sCit7ICJjbXAiLAkweGIwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7QU0xLCBBTjB9fSwKK3sgImNtcCIsCTB4ZmFjODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7U0lNTTE2LCBETjB9fSwKK3sgImNtcCIsCTB4ZmFkODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEFOMH19LAoreyAiY21wIiwJMHhmY2M4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJjbXAiLAkweGZjZDgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKKworeyAiYW5kIiwJMHhmMjAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAiYW5kIiwJMHhmOGUwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgImFuZCIsCTB4ZmFlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoreyAiYW5kIiwJMHhmYWZjMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgUFNXfX0sCit7ICJhbmQiLAkweGZjZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKKworeyAib3IiLAkJMHhmMjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAib3IiLAkJMHhmOGU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgIm9yIiwJCTB4ZmFlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTYsIEROMH19LAoreyAib3IiLAkJMHhmYWZkMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgUFNXfX0sCit7ICJvciIsCQkweGZjZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKKworeyAieG9yIiwJMHhmMjIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAieG9yIiwJMHhmYWU4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCit7ICJ4b3IiLAkweGZjZTgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKKworeyAibm90IiwJMHhmMjMwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtETjB9fSwKKworeyAiYnRzdCIsCTB4ZjhlYzAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJidHN0IiwJMHhmYWVjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCit7ICJidHN0IiwJMHhmY2VjMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJidHN0IiwJMHhmZTAyMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKK3sgImJ0c3QiLAkweGZhZjgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LCBBTjApfX0sCisKK3sgImJzZXQiLAkweGYwODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKK3sgImJzZXQiLAkweGZlMDAwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoreyAiYnNldCIsCTB4ZmFmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCwgQU4wKX19LAorCit7ICJiY2xyIiwJMHhmMDkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCit7ICJiY2xyIiwJMHhmZTAxMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDUsIDAsCXtJTU04RSwgTUVNKElNTTMyX0xPV1NISUZUOCl9fSwKK3sgImJjbHIiLAkweGZhZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsQU4wKX19LAorCit7ICJhc3IiLAkweGYyYjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJhc3IiLAkweGY4YzgwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAiYXNyIiwJMHhmOGM4MDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKKworeyAibHNyIiwJMHhmMmEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAibHNyIiwJMHhmOGM0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgImxzciIsCTB4ZjhjNDAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCisKK3sgImFzbCIsCTB4ZjI5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgImFzbCIsCTB4ZjhjMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJhc2wiLAkweGY4YzAwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAorCit7ICJhc2wyIiwJMHg1NCwJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAorCit7ICJyb3IiLAkweGYyODQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAorCit7ICJyb2wiLAkweGYyODAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAorCit7ICJiZXEiLAkweGM4MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKK3sgImJuZSIsCTB4YzkwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoreyAiYmd0IiwJMHhjMTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCit7ICJiZ2UiLAkweGMyMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKK3sgImJsZSIsCTB4YzMwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoreyAiYmx0IiwJMHhjMDAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCit7ICJiaGkiLAkweGM1MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKK3sgImJjYyIsCTB4YzYwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoreyAiYmxzIiwJMHhjNzAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCit7ICJiY3MiLAkweGM0MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKK3sgImJ2YyIsCTB4ZjhlODAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoreyAiYnZzIiwJMHhmOGU5MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCit7ICJibmMiLAkweGY4ZWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKK3sgImJucyIsCTB4ZjhlYjAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoreyAiYnJhIiwJMHhjYTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCisKK3sgImxlcSIsCTB4ZDgsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxuZSIsCTB4ZDksCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxndCIsCTB4ZDEsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxnZSIsCTB4ZDIsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxsZSIsCTB4ZDMsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxsdCIsCTB4ZDAsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxoaSIsCTB4ZDUsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxjYyIsCTB4ZDYsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxscyIsCTB4ZDcsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxjcyIsCTB4ZDQsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgImxyYSIsCTB4ZGEsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKK3sgInNldGxiIiwJMHhkYiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAorCit7ICJqbXAiLAkweGYwZjQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BBUkVOLEFOMCxQQVJFTn19LAoreyAiam1wIiwJMHhjYzAwMDAsICAgIDB4ZmYwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtJTU0xNl9QQ1JFTH19LAoreyAiam1wIiwJMHhkYzAwMDAwMCwgIDB4ZmYwMDAwMDAsICAwLCAgICBGTVRfUzQsIDAsCXtJTU0zMl9ISUdIMjR9fSwKK3sgImNhbGwiLAkweGNkMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNCwgMCwJe0QxNl9TSElGVCxSRUdTLElNTThFfX0sCit7ICJjYWxsIiwJMHhkZDAwMDAwMCwgIDB4ZmYwMDAwMDAsICAwLCAgICBGTVRfUzYsIDAsCXtJTU0zMl9ISUdIMjRfTE9XU0hJRlQxNiwgUkVHU0VfU0hJRlQ4LElNTThFfX0sCit7ICJjYWxscyIsCTB4ZjBmMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UEFSRU4sQU4wLFBBUkVOfX0sCit7ICJjYWxscyIsCTB4ZmFmZjAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NMTZfUENSRUx9fSwKK3sgImNhbGxzIiwJMHhmY2ZmMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMl9QQ1JFTH19LAorCit7ICJyZXQiLAkweGRmMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1JFR1NfU0hJRlQ4LCBJTU04fX0sCit7ICJyZXRmIiwJMHhkZTAwMDAsICAgIDB4ZmYwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtSRUdTX1NISUZUOCwgSU1NOH19LAoreyAicmV0cyIsCTB4ZjBmYywJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCit7ICJydGkiLAkweGYwZmQsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoreyAidHJhcCIsCTB4ZjBmZSwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCit7ICJydG0iLAkweGYwZmYsCSAgICAgMHhmZmZmLAkgIDAsICAgIEZNVF9EMCwgMCwJe1VOVVNFRH19LAoreyAibm9wIiwJMHhjYiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAorCisvKiBVREYgaW5zdHJ1Y3Rpb25zLiAgKi8KK3sgInVkZjAwIiwJMHhmNjAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMDAiLAkweGY5MDAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgInVkZjAwIiwJMHhmYjAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCit7ICJ1ZGYwMCIsCTB4ZmQwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmMDEiLAkweGY2MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYwMSIsCTB4ZjkxMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoreyAidWRmMDEiLAkweGZiMTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKK3sgInVkZjAxIiwJMHhmZDEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGYwMiIsCTB4ZjYyMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjAyIiwJMHhmOTIwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCit7ICJ1ZGYwMiIsCTB4ZmIyMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoreyAidWRmMDIiLAkweGZkMjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZjAzIiwJMHhmNjMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMDMiLAkweGY5MzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgInVkZjAzIiwJMHhmYjMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCit7ICJ1ZGYwMyIsCTB4ZmQzMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmMDQiLAkweGY2NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYwNCIsCTB4Zjk0MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoreyAidWRmMDQiLAkweGZiNDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKK3sgInVkZjA0IiwJMHhmZDQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGYwNSIsCTB4ZjY1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjA1IiwJMHhmOTUwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCit7ICJ1ZGYwNSIsCTB4ZmI1MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoreyAidWRmMDUiLAkweGZkNTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZjA2IiwJMHhmNjYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMDYiLAkweGY5NjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgInVkZjA2IiwJMHhmYjYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCit7ICJ1ZGYwNiIsCTB4ZmQ2MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmMDciLAkweGY2NzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYwNyIsCTB4Zjk3MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoreyAidWRmMDciLAkweGZiNzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKK3sgInVkZjA3IiwJMHhmZDcwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGYwOCIsCTB4ZjY4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjA4IiwJMHhmOTgwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCit7ICJ1ZGYwOCIsCTB4ZmI4MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoreyAidWRmMDgiLAkweGZkODAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZjA5IiwJMHhmNjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMDkiLAkweGY5OTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgInVkZjA5IiwJMHhmYjkwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCit7ICJ1ZGYwOSIsCTB4ZmQ5MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmMTAiLAkweGY2YTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYxMCIsCTB4ZjlhMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoreyAidWRmMTAiLAkweGZiYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKK3sgInVkZjEwIiwJMHhmZGEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGYxMSIsCTB4ZjZiMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjExIiwJMHhmOWIwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCit7ICJ1ZGYxMSIsCTB4ZmJiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoreyAidWRmMTEiLAkweGZkYjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZjEyIiwJMHhmNmMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMTIiLAkweGY5YzAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgInVkZjEyIiwJMHhmYmMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCit7ICJ1ZGYxMiIsCTB4ZmRjMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmMTMiLAkweGY2ZDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYxMyIsCTB4ZjlkMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoreyAidWRmMTMiLAkweGZiZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKK3sgInVkZjEzIiwJMHhmZGQwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGYxNCIsCTB4ZjZlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjE0IiwJMHhmOWUwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCit7ICJ1ZGYxNCIsCTB4ZmJlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoreyAidWRmMTQiLAkweGZkZTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZjE1IiwJMHhmNmYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMTUiLAkweGY5ZjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKK3sgInVkZjE1IiwJMHhmYmYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCit7ICJ1ZGYxNSIsCTB4ZmRmMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmMjAiLAkweGY1MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYyMSIsCTB4ZjUxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjIyIiwJMHhmNTIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMjMiLAkweGY1MzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYyNCIsCTB4ZjU0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjI1IiwJMHhmNTUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMjYiLAkweGY1NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYyNyIsCTB4ZjU3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjI4IiwJMHhmNTgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMjkiLAkweGY1OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYzMCIsCTB4ZjVhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjMxIiwJMHhmNWIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMzIiLAkweGY1YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGYzMyIsCTB4ZjVkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKK3sgInVkZjM0IiwJMHhmNWUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoreyAidWRmMzUiLAkweGY1ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCit7ICJ1ZGZ1MDAiLAkweGY5MDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAidWRmdTAwIiwJMHhmYjA0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKK3sgInVkZnUwMCIsCTB4ZmQwNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmdTAxIiwJMHhmOTE0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgInVkZnUwMSIsCTB4ZmIxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCit7ICJ1ZGZ1MDEiLAkweGZkMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZnUwMiIsCTB4ZjkyNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJ1ZGZ1MDIiLAkweGZiMjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoreyAidWRmdTAyIiwJMHhmZDI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGZ1MDMiLAkweGY5MzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAidWRmdTAzIiwJMHhmYjM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKK3sgInVkZnUwMyIsCTB4ZmQzNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmdTA0IiwJMHhmOTQ0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgInVkZnUwNCIsCTB4ZmI0NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCit7ICJ1ZGZ1MDQiLAkweGZkNDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZnUwNSIsCTB4Zjk1NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJ1ZGZ1MDUiLAkweGZiNTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoreyAidWRmdTA1IiwJMHhmZDU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGZ1MDYiLAkweGY5NjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAidWRmdTA2IiwJMHhmYjY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKK3sgInVkZnUwNiIsCTB4ZmQ2NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmdTA3IiwJMHhmOTc0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgInVkZnUwNyIsCTB4ZmI3NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCit7ICJ1ZGZ1MDciLAkweGZkNzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZnUwOCIsCTB4Zjk4NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJ1ZGZ1MDgiLAkweGZiODQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoreyAidWRmdTA4IiwJMHhmZDg0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGZ1MDkiLAkweGY5OTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAidWRmdTA5IiwJMHhmYjk0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKK3sgInVkZnUwOSIsCTB4ZmQ5NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmdTEwIiwJMHhmOWE0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgInVkZnUxMCIsCTB4ZmJhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCit7ICJ1ZGZ1MTAiLAkweGZkYTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZnUxMSIsCTB4ZjliNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJ1ZGZ1MTEiLAkweGZiYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoreyAidWRmdTExIiwJMHhmZGI0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGZ1MTIiLAkweGY5YzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAidWRmdTEyIiwJMHhmYmM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKK3sgInVkZnUxMiIsCTB4ZmRjNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoreyAidWRmdTEzIiwJMHhmOWQ0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKK3sgInVkZnUxMyIsCTB4ZmJkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCit7ICJ1ZGZ1MTMiLAkweGZkZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKK3sgInVkZnUxNCIsCTB4ZjllNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCit7ICJ1ZGZ1MTQiLAkweGZiZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoreyAidWRmdTE0IiwJMHhmZGU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCit7ICJ1ZGZ1MTUiLAkweGY5ZjQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoreyAidWRmdTE1IiwJMHhmYmY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKK3sgInVkZnUxNSIsCTB4ZmRmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAorCit7ICJwdXR4IiwJMHhmNTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETjAxfX0sCit7ICJnZXR4IiwJMHhmNmYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETjAxfX0sCit7ICJtdWxxIiwJMHhmNjAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoreyAibXVscSIsCTB4ZjkwMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U0lNTTgsIEROMH19LAoreyAibXVscSIsCTB4ZmIwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCBBTTMwLAl7U0lNTTE2LCBETjB9fSwKK3sgIm11bHEiLAkweGZkMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMCwJe0lNTTMyLCBETjB9fSwKK3sgIm11bHF1IiwJMHhmNjEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAoreyAibXVscXUiLAkweGY5MTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgQU0zMCwJe1NJTU04LCBETjB9fSwKK3sgIm11bHF1IiwJMHhmYjE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIEFNMzAsCXtTSU1NMTYsIEROMH19LAoreyAibXVscXUiLAkweGZkMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgQU0zMCwJe0lNTTMyLCBETjB9fSwKK3sgInNhdDE2IiwJMHhmNjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAorCit7ICJzYXQyNCIsCTB4ZjY1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKKworeyAiYnNjaCIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCBBTTMwLAl7RE0xLCBETjB9fSwKKworLyogRXh0ZW5zaW9uLiAgV2UgbmVlZCBzb21lIGluc3RydWN0aW9uIHRvIHRyaWdnZXIgImVtdWxhdGVkIHN5c2NhbGxzIgorICAgZm9yIG91ciBzaW11bGF0b3IuICAqLworeyAic3lzY2FsbCIsICAgIDB4ZjBjMCwgICAgICAweGZmZmYsICAgICAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCisKKy8qIEV4dGVuc2lvbi4gIFdoZW4gdGFsa2luZyB0byB0aGUgc2ltdWxhdG9yLCBnZGIgcmVxdWlyZXMgc29tZSBpbnN0cnVjdGlvbgorICAgdGhhdCB3aWxsIHRyaWdnZXIgYSAiYnJlYWtwb2ludCIgKHJlYWxseSBqdXN0IGFuIGluc3RydWN0aW9uIHRoYXQgaXNuJ3QKKyAgIG90aGVyd2lzZSB1c2VkIGJ5IHRoZSB0b29scy4gIFRoaXMgaW5zdHJ1Y3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBzaXplCisgICBhcyB0aGUgc21hbGxlc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIHRhcmdldCBtYWNoaW5lLiAgSW4gdGhlIGNhc2Ugb2YgdGhlCisgICBtbjEweDAwIHRoZSAiYnJlYWsiIGluc3RydWN0aW9uIG11c3QgYmUgb25lIGJ5dGUuICAweGZmIGlzIGF2YWlsYWJsZSBvbgorICAgYm90aCBtbjEweDAwIGFyY2hpdGVjdHVyZXMuICAqLworeyAiYnJlYWsiLAkweGZmLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCisKKyAKK3sgMCwgMCwgMCwgMCwgMCwgMCwgezB9fSwKKworfSA7CisKK2NvbnN0IGludCBtbjEwMzAwX251bV9vcGNvZGVzID0KKyAgc2l6ZW9mIChtbjEwMzAwX29wY29kZXMpIC8gc2l6ZW9mIChtbjEwMzAwX29wY29kZXNbMF0pOworCisMCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItYXNtLmMgYi9vcGNvZGVzL20zMnItYXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4Y2Q3MwotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTMyci1hc20uYwpAQCAtMCwwICsxLDU1NiBAQAorLyogQXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KKyAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKy0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWFzbS5pbiBpc24ndAorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCisgICBLZWVwIHRoYXQgaW4gbWluZC4gICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJtMzJyLWRlc2MuaCIKKyNpbmNsdWRlICJtMzJyLW9wYy5oIgorI2luY2x1ZGUgIm9waW50bC5oIgorCisjdW5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjdW5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisKK3N0YXRpYyBjb25zdCBjaGFyICogcGFyc2VfaW5zbl9ub3JtYWwKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IGNoYXIgKiosIENHRU5fRklFTERTICopKTsKKwwKKy8qIC0tIGFzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCisKKy8qIC0tIGFzbS5jICovCisKKy8qIEhhbmRsZSAnIycgcHJlZml4ZXMgKGkuZS4gc2tpcCBvdmVyIHRoZW0pLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFyc2VfaGFzaCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgY2hhciAqKnN0cnA7CisgICAgIGludCBvcGluZGV4OworICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Cit7CisgIGlmICgqKnN0cnAgPT0gJyMnKQorICAgICsrKnN0cnA7CisgIHJldHVybiBOVUxMOworfQorCisvKiBIYW5kbGUgc2hpZ2goKSwgaGlnaCgpLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFyc2VfaGkxNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgY2hhciAqKnN0cnA7CisgICAgIGludCBvcGluZGV4OworICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Cit7CisgIGNvbnN0IGNoYXIgKmVycm1zZzsKKyAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOworICBiZmRfdm1hIHZhbHVlOworCisgIGlmICgqKnN0cnAgPT0gJyMnKQorICAgICsrKnN0cnA7CisKKyAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImhpZ2goIiwgNSkgPT0gMCkKKyAgICB7CisgICAgICAqc3RycCArPSA1OworICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCisJCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOworICAgICAgaWYgKCoqc3RycCAhPSAnKScpCisJcmV0dXJuICJtaXNzaW5nIGApJyI7CisgICAgICArKypzdHJwOworICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCisgIAkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQorCXZhbHVlID4+PSAxNjsKKyAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgIHJldHVybiBlcnJtc2c7CisgICAgfQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzaGlnaCgiLCA2KSA9PSAwKQorICAgIHsKKyAgICAgICpzdHJwICs9IDY7CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywKKyAJCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOworICAgICAgaWYgKCoqc3RycCAhPSAnKScpCisJcmV0dXJuICJtaXNzaW5nIGApJyI7CisgICAgICArKypzdHJwOworICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCisJICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKKwl2YWx1ZSA9ICh2YWx1ZSA+PiAxNikgKyAodmFsdWUgJiAweDgwMDAgPyAxIDogMCk7CisgICAgICAqdmFsdWVwID0gdmFsdWU7CisgICAgICByZXR1cm4gZXJybXNnOworICAgIH0KKworICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKK30KKworLyogSGFuZGxlIGxvdygpIGluIGEgc2lnbmVkIGNvbnRleHQuICBBbHNvIGhhbmRsZSBzZGEoKS4KKyAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbworICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGNvbnN0IGNoYXIgKipzdHJwOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgbG9uZyAqdmFsdWVwOworeworICBjb25zdCBjaGFyICplcnJtc2c7CisgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKKyAgYmZkX3ZtYSB2YWx1ZTsKKworICBpZiAoKipzdHJwID09ICcjJykKKyAgICArKypzdHJwOworCisgIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKKyAgICB7CisgICAgICAqc3RycCArPSA0OworICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKKwkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7CisgICAgICBpZiAoKipzdHJwICE9ICcpJykKKwlyZXR1cm4gIm1pc3NpbmcgYCknIjsKKyAgICAgICsrKnN0cnA7CisgICAgICBpZiAoZXJybXNnID09IE5VTEwKKwkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQorCXZhbHVlICY9IDB4ZmZmZjsKKyAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgIHJldHVybiBlcnJtc2c7CisgICAgfQorCisgIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzZGEoIiwgNCkgPT0gMCkKKyAgICB7CisgICAgICAqc3RycCArPSA0OworICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfU0RBMTYsCisJCQkJICAgTlVMTCwgJnZhbHVlKTsKKyAgICAgIGlmICgqKnN0cnAgIT0gJyknKQorCXJldHVybiAibWlzc2luZyBgKSciOworICAgICAgKysqc3RycDsKKyAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKKyAgICAgIHJldHVybiBlcnJtc2c7CisgICAgfQorCisgIHJldHVybiBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKK30KKworLyogSGFuZGxlIGxvdygpIGluIGFuIHVuc2lnbmVkIGNvbnRleHQuCisgICBUaGUgc2lnbmVkbmVzcyBvZiB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgdG8gbG93KCksIGJ1dCB0aGlzIGFsc28KKyAgIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbG93KCkgaXNuJ3QgcHJlc2VudC4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3VsbzE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICoqc3RycDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKK3sKKyAgY29uc3QgY2hhciAqZXJybXNnOworICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7CisgIGJmZF92bWEgdmFsdWU7CisKKyAgaWYgKCoqc3RycCA9PSAnIycpCisgICAgKysqc3RycDsKKworICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAibG93KCIsIDQpID09IDApCisgICAgeworICAgICAgKnN0cnAgKz0gNDsKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0xPMTYsCisJCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOworICAgICAgaWYgKCoqc3RycCAhPSAnKScpCisJcmV0dXJuICJtaXNzaW5nIGApJyI7CisgICAgICArKypzdHJwOworICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCisJICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKKwl2YWx1ZSAmPSAweGZmZmY7CisgICAgICAqdmFsdWVwID0gdmFsdWU7CisgICAgICByZXR1cm4gZXJybXNnOworICAgIH0KKworICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKK30KKworLyogLS0gKi8KKworLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBwYXJzaW5nLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCisgICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAorICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgorICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKKyAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAorICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgorCisgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKKyAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCisgICB0aGUgaGFuZGxlcnMuCisqLworCitjb25zdCBjaGFyICoKK20zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgb3BpbmRleCwgc3RycCwgZmllbGRzKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgY29uc3QgY2hhciAqKiBzdHJwOworICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKK3sKKyAgY29uc3QgY2hhciAqIGVycm1zZzsKKworICBzd2l0Y2ggKG9waW5kZXgpCisgICAgeworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKKyAgICAgIHsKKyAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKKyAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgMCwgTlVMTCwgICYgdmFsdWUpOworICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgorICAgICAgeworICAgICAgICBiZmRfdm1hIHZhbHVlOworICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDI0LCAwLCBOVUxMLCAgJiB2YWx1ZSk7CisgICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKKyAgICAgIHsKKyAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKKyAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1A4LCAwLCBOVUxMLCAgJiB2YWx1ZSk7CisgICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgorICAgICAgZXJybXNnID0gcGFyc2VfaGFzaCAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9IQVNILCAmZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKKyAgICAgIGVycm1zZyA9IHBhcnNlX2hpMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSEkxNiwgJmZpZWxkcy0+Zl9oaTE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTE2LCAmZmllbGRzLT5mX3NpbW0xNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NJTU04LCAmZmllbGRzLT5mX3NpbW04KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKKyAgICAgIGVycm1zZyA9IHBhcnNlX3NsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NMTzE2LCAmZmllbGRzLT5mX3NpbW0xNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6CisgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMTYsICZmaWVsZHMtPmZfdWltbTE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6CisgICAgICB7CisgICAgICAgIGJmZF92bWEgdmFsdWU7CisgICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIDAsIE5VTEwsICAmIHZhbHVlKTsKKyAgICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgorICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU00LCAmZmllbGRzLT5mX3VpbW00KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKKyAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NNSwgJmZpZWxkcy0+Zl91aW1tNSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6CisgICAgICBlcnJtc2cgPSBwYXJzZV91bG8xNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VTE8xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIiksIG9waW5kZXgpOworICAgICAgYWJvcnQgKCk7CisgIH0KKworICByZXR1cm4gZXJybXNnOworfQorCitjZ2VuX3BhcnNlX2ZuICogY29uc3QgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzW10gPSAKK3sKKyAgcGFyc2VfaW5zbl9ub3JtYWwsCit9OworCit2b2lkCittMzJyX2NnZW5faW5pdF9hc20gKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBtMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKKyAgbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOworICBjZC0+cGFyc2VfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9wYXJzZV9oYW5kbGVyc1swXTsKKyAgY2QtPnBhcnNlX29wZXJhbmQgPSBtMzJyX2NnZW5fcGFyc2Vfb3BlcmFuZDsKK30KKworDAorLyogRGVmYXVsdCBpbnNuIHBhcnNlci4KKworICAgVGhlIHN5bnRheCBzdHJpbmcgaXMgc2Nhbm5lZCBhbmQgb3BlcmFuZHMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIEZJRUxEUy4KKyAgIFJlbG9jcyBhcmUgcXVldWVkIGFzIHdlIGdvIHZpYSBvdGhlciBjYWxsYmFja3MuCisKKyAgID8/PyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYW4gYWxsLW9yLW5vdGhpbmcgcGFyc2VyLiAgSWYgd2UgZmFpbCB0bworICAgcGFyc2UgdGhlIGluc3RydWN0aW9uLCB3ZSByZXR1cm4gMCBhbmQgdGhlIGNhbGxlciB3aWxsIHN0YXJ0IG92ZXIgZnJvbQorICAgdGhlIGJlZ2lubmluZy4gIEJhY2t0cmFja2luZyB3aWxsIGJlIG5lY2Vzc2FyeSBpbiBwYXJzaW5nIHN1YmV4cHJlc3Npb25zLAorICAgYnV0IHRoYXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuICBOb3QgaGFuZGxpbmcgYmFja3RyYWNraW5nIGhlcmUgbWF5IGdldAorICAgZXhwZW5zaXZlIGluIHRoZSBjYXNlIG9mIHRoZSBtNjhrLiAgRGVhbCB3aXRoIGxhdGVyLgorCisgICBSZXR1cm5zIE5VTEwgZm9yIHN1Y2Nlc3MsIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9pbnNuX25vcm1hbCAoY2QsIGluc24sIHN0cnAsIGZpZWxkcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworICAgICBjb25zdCBjaGFyICoqc3RycDsKKyAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKK3sKKyAgLyogPz8/IFJ1bnRpbWUgYWRkZWQgaW5zbnMgbm90IGhhbmRsZWQgeWV0LiAgKi8KKyAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOworICBjb25zdCBjaGFyICpzdHIgPSAqc3RycDsKKyAgY29uc3QgY2hhciAqZXJybXNnOworICBjb25zdCBjaGFyICpwOworICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOworI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKKyAgLyogRklYTUU6IHdpcCAqLworICBpbnQgcGFzdF9vcGNvZGVfcDsKKyNlbmRpZgorCisgIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBtbmVtb25pYyBpcyBmaXJzdCAodGhlcmUgYXJlIG5vIGxlYWRpbmcgb3BlcmFuZHMpLgorICAgICBXZSBjYW4gcGFyc2UgaXQgd2l0aG91dCBuZWVkaW5nIHRvIHNldCB1cCBvcGVyYW5kIHBhcnNpbmcuCisgICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgZW5zdXJlIG1uZW1vbmljcyBhcmUgbG93ZXJjYXNlLCBidXQgd2UgbWF5CisgICAgIG5vdCBiZSBjYWxsZWQgZnJvbSBHQVMuICAqLworICBwID0gQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKTsKKyAgd2hpbGUgKCpwICYmIHRvbG93ZXIgKCpwKSA9PSB0b2xvd2VyICgqc3RyKSkKKyAgICArK3AsICsrc3RyOworICAKKyAgaWYgKCogcCB8fCAoKiBzdHIgJiYgIWlzc3BhY2UgKCogc3RyKSkpCisgICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOworCisgIENHRU5fSU5JVF9QQVJTRSAoY2QpOworICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOworI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKKyAgcGFzdF9vcGNvZGVfcCA9IDA7CisjZW5kaWYKKworICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKKyAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KKyAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOworCisgIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLworICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCisgICAgYWJvcnQgKCk7CisKKyAgKytzeW47CisKKyAgd2hpbGUgKCogc3luICE9IDApCisgICAgeworICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KKyAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKKwl7CisJICBpZiAoKnN0ciA9PSBDR0VOX1NZTlRBWF9DSEFSICgqIHN5bikpCisJICAgIHsKKyNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCisJICAgICAgaWYgKCogc3luID09ICcgJykKKwkJcGFzdF9vcGNvZGVfcCA9IDE7CisjZW5kaWYKKwkgICAgICArKyBzeW47CisJICAgICAgKysgc3RyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uICAqLworCSAgICAgIC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQorCQkgImV4cGVjdGVkIGNoYXIgYGMnIiAqLworCSAgICAgIHJldHVybiBfKCJzeW50YXggZXJyb3IiKTsKKwkgICAgfQorCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQgb2Ygc29tZSBzb3J0LiAgKi8KKyAgICAgIGVycm1zZyA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAorCQkJCQkgICZzdHIsIGZpZWxkcyk7CisgICAgICBpZiAoZXJybXNnKQorCXJldHVybiBlcnJtc2c7CisKKyAgICAgIC8qIERvbmUgd2l0aCB0aGlzIG9wZXJhbmQsIGNvbnRpbnVlIHdpdGggbmV4dCBvbmUuICAqLworICAgICAgKysgc3luOworICAgIH0KKworICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KKyAgaWYgKCogc3luID09ICdcMCcpCisgICAgeworICAgICAgLyogRklYTUU6IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4KKwkgYmxhbmtzIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YKKwkgdGhlIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCisJIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KKyAgICAgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCisJKysgc3RyOworCisgICAgICBpZiAoKiBzdHIgIT0gJ1wwJykKKwlyZXR1cm4gXygianVuayBhdCBlbmQgb2YgbGluZSIpOyAvKiBGSVhNRTogd291bGQgbGlrZSB0byBpbmNsdWRlIGBzdHInICovCisKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAvKiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4gICovCisgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKK30KKwwKKy8qIE1haW4gZW50cnkgcG9pbnQuCisgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4KKyAgIFNUUiBwb2ludHMgdG8gdGhlIGluc24gdG8gYmUgYXNzZW1ibGVkLgorICAgV2UgYXNzdW1lIGFsbCBuZWNlc3NhcnkgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgIFRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24sIGxlc3MgYW55IGZpeHVwcywgaXMgc3RvcmVkIGluIEJVRi4KKyAgIFJlbWVtYmVyIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIHRoZW4gQlVGIGlzIGFuIGludCBhbmQgdGh1cyB0aGUgdmFsdWUKKyAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0YXJnZXQgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRiBpcyBhbiBhcnJheQorICAgb2YgYnl0ZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCisgICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbidzIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUsCisgICBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQgKGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBoYXZlIGFscmVhZHkgYmVlbgorICAgcHJpbnRlZCkuCisKKyAgIE5vdGUgdGhhdCB3aGVuIHByb2Nlc3NpbmcgKG5vbi1hbGlhcykgbWFjcm8taW5zbnMsCisgICB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzLgorCisgICA/Pz8gSXQncyBwb3NzaWJsZSB0byBtYWtlIHRoaXMgY3B1LWluZGVwZW5kZW50LgorICAgT25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoIGEgZmV3IG1pbm9yIHRoaW5ncy4KKyAgIEF0IHRoaXMgcG9pbnQgaW4gdGltZSBkb2luZyBzbyB3b3VsZCBiZSBtb3JlIG9mIGEgY3VyaW9zaXR5IHRoYW4gdXNlZnVsCisgICBbZm9yIGV4YW1wbGUgdGhpcyBmaWxlIGlzbid0IF90aGF0XyBiaWddLCBidXQga2VlcGluZyB0aGUgcG9zc2liaWxpdHkgaW4KKyAgIG1pbmQgaGVscHMga2VlcCB0aGUgZGVzaWduIGNsZWFuLiAgKi8KKworY29uc3QgQ0dFTl9JTlNOICoKK20zMnJfY2dlbl9hc3NlbWJsZV9pbnNuIChjZCwgc3RyLCBmaWVsZHMsIGJ1ZiwgZXJybXNnKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBjaGFyICpzdHI7CisgICAgIENHRU5fRklFTERTICpmaWVsZHM7CisgICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmOworICAgICBjaGFyICoqZXJybXNnOworeworICBjb25zdCBjaGFyICpzdGFydDsKKyAgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OworCisgIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCisgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCisgICAgKysgc3RyOworCisgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoZWQgbGlzdHMuCisgICAgIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLworICBpbGlzdCA9IENHRU5fQVNNX0xPT0tVUF9JTlNOIChjZCwgc3RyKTsKKworICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KKworICBzdGFydCA9IHN0cjsKKyAgZm9yICggOyBpbGlzdCAhPSBOVUxMIDsgaWxpc3QgPSBDR0VOX0FTTV9ORVhUX0lOU04gKGlsaXN0KSkKKyAgICB7CisgICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbGlzdC0+aW5zbjsKKworI2lmIDAgLyogbm90IG5lZWRlZCBhcyB1bnN1cHBvcnRlZCBvcGNvZGVzIHNob3VsZG4ndCBiZSBpbiB0aGUgaGFzaCBsaXN0cyAqLworICAgICAgLyogSXMgdGhpcyBpbnNuIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgY3B1PyAgKi8KKyAgICAgIGlmICghIG0zMnJfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQorCWNvbnRpbnVlOworI2VuZGlmCisKKyAgICAgIC8qIElmIHRoZSBSRUxBWCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGlzIGlzIGFuIGluc24gdGhhdCBzaG91bGRuJ3QgYmUKKwkgY2hvc2VuIGltbWVkaWF0ZWx5LiAgSW5zdGVhZCwgaXQgaXMgdXNlZCBkdXJpbmcgYXNzZW1ibGVyL2xpbmtlcgorCSByZWxheGF0aW9uIGlmIHBvc3NpYmxlLiAgKi8KKyAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSAhPSAwKQorCWNvbnRpbnVlOworCisgICAgICBzdHIgPSBzdGFydDsKKworICAgICAgLyogQWxsb3cgcGFyc2UvaW5zZXJ0IGhhbmRsZXJzIHRvIG9idGFpbiBsZW5ndGggb2YgaW5zbi4gICovCisgICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOworCisgICAgICBpZiAoISBDR0VOX1BBUlNFX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCAmIHN0ciwgZmllbGRzKSkKKwl7CisJICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KKwkgIGlmIChDR0VOX0lOU0VSVF9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgZmllbGRzLCBidWYsIChiZmRfdm1hKSAwKQorCSAgICAgICE9IE5VTEwpCisJICAgIGNvbnRpbnVlOworCSAgLyogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhY3R1YWxseSBvdXRwdXQgdGhlIGluc24gYW5kIGFueQorCSAgICAgcXVldWVkIHJlbG9jcy4gICovCisJICByZXR1cm4gaW5zbjsKKwl9CisKKyAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCisgICAgfQorCisgIC8qIEZJWE1FOiBXZSBjYW4gcmV0dXJuIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhhbiB0aGlzLgorICAgICBOZWVkIHRvIHRyYWNrIHdoeSBpdCBmYWlsZWQgYW5kIHBpY2sgdGhlIHJpZ2h0IG9uZS4gICovCisgIHsKKyAgICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKKyAgICBpZiAoc3RybGVuIChzdGFydCkgPiA1MCkKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIiksIHN0YXJ0KTsKKyAgICBlbHNlIAorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciKSwgc3RhcnQpOworICAgICAgCisgICAgKmVycm1zZyA9IGVycmJ1ZjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorDAorI2lmIDAgLyogVGhpcyBjYWxscyBiYWNrIHRvIEdBUyB3aGljaCB3ZSBjYW4ndCBkbyB3aXRob3V0IGNhcmUuICAqLworCisvKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCisgICBUaGlzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCisgICA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KKworLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgorICAgRklYTUU6IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCisKK3ZvaWQKK20zMnJfY2dlbl9hc21faGFzaF9rZXl3b3JkcyAoY2QsIG9wdmFscykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgQ0dFTl9LRVlXT1JEICpvcHZhbHM7Cit7CisgIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0IChvcHZhbHMsIE5VTEwpOworICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKiBrZTsKKworICB3aGlsZSAoKGtlID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0ICgmIHNlYXJjaCkpICE9IE5VTEwpCisgICAgeworI2lmIDAgLyogVW5uZWNlc3NhcnksIHNob3VsZCBiZSBkb25lIGluIHRoZSBzZWFyY2ggcm91dGluZS4gICovCisgICAgICBpZiAoISBtMzJyX2NnZW5fb3B2YWxfc3VwcG9ydGVkIChrZSkpCisJY29udGludWU7CisjZW5kaWYKKyAgICAgIGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAoY2QsIGtlLT5uYW1lLCBrZS0+dmFsdWUpOworICAgIH0KK30KKworI2VuZGlmIC8qIDAgKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmMgYi9vcGNvZGVzL20zMnItZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjU0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL20zMnItZGVzYy5jCkBAIC0wLDAgKzEsMTE1MCBAQAorLyogQ1BVIGRhdGEgZm9yIG0zMnIuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJtMzJyLWRlc2MuaCIKKyNpbmNsdWRlICJtMzJyLW9wYy5oIgorI2luY2x1ZGUgIm9waW50bC5oIgorCisvKiBBdHRyaWJ1dGVzLiAgKi8KKworc3RhdGljIGNvbnN0IENHRU5fQVRUUl9FTlRSWSBib29sX2F0dHJbXSA9Cit7CisgIHsgIiNmIiwgMCB9LAorICB7ICIjdCIsIDEgfSwKKyAgeyAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgTUFDSF9hdHRyW10gPQoreworICB7ICJiYXNlIiwgTUFDSF9CQVNFIH0sCisgIHsgIm0zMnIiLCBNQUNIX00zMlIgfSwKKyAgeyAibWF4IiwgTUFDSF9NQVggfSwKKyAgeyAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgSVNBX2F0dHJbXSA9Cit7CisgIHsgIm0zMnIiLCBJU0FfTTMyUiB9LAorICB7ICJtYXgiLCBJU0FfTUFYIH0sCisgIHsgMCwgMCB9Cit9OworCitjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW10gPQoreworICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKKyAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlJFU0VSVkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJSRUxPQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAwLCAwLCAwIH0KK307CisKK2NvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdID0KK3sKKyAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCisgIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIkNBQ0hFLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlBDIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJQUk9GSUxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7IDAsIDAsIDAgfQorfTsKKworY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiTkVHQVRJVkUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJTRU0tT05MWSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIkhBU0gtUFJFRklYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7IDAsIDAsIDAgfQorfTsKKworY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiRklMTC1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7IDAsIDAsIDAgfQorfTsKKworLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KKworc3RhdGljIGNvbnN0IENHRU5fSVNBIG0zMnJfY2dlbl9pc2FfdGFibGVbXSA9IHsKKyAgeyAibTMyciIsIDMyLCAzMiwgMTYsIDMyLCAgfSwKKyAgeyAwIH0KK307CisKKy8qIE1hY2hpbmUgdmFyaWFudHMuICAqLworCitzdGF0aWMgY29uc3QgQ0dFTl9NQUNIIG0zMnJfY2dlbl9tYWNoX3RhYmxlW10gPSB7CisgIHsgIm0zMnIiLCAibTMyciIsIE1BQ0hfTTMyUiB9LAorICB7IDAgfQorfTsKKworc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1tdID0KK3sKKyAgeyAiZnAiLCAxMyB9LAorICB7ICJsciIsIDE0IH0sCisgIHsgInNwIiwgMTUgfSwKKyAgeyAicjAiLCAwIH0sCisgIHsgInIxIiwgMSB9LAorICB7ICJyMiIsIDIgfSwKKyAgeyAicjMiLCAzIH0sCisgIHsgInI0IiwgNCB9LAorICB7ICJyNSIsIDUgfSwKKyAgeyAicjYiLCA2IH0sCisgIHsgInI3IiwgNyB9LAorICB7ICJyOCIsIDggfSwKKyAgeyAicjkiLCA5IH0sCisgIHsgInIxMCIsIDEwIH0sCisgIHsgInIxMSIsIDExIH0sCisgIHsgInIxMiIsIDEyIH0sCisgIHsgInIxMyIsIDEzIH0sCisgIHsgInIxNCIsIDE0IH0sCisgIHsgInIxNSIsIDE1IH0KK307CisKK0NHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMgPQoreworICAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lc19lbnRyaWVzWzBdLAorICAxOQorfTsKKworc3RhdGljIENHRU5fS0VZV09SRF9FTlRSWSBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1tdID0KK3sKKyAgeyAicHN3IiwgMCB9LAorICB7ICJjYnIiLCAxIH0sCisgIHsgInNwaSIsIDIgfSwKKyAgeyAic3B1IiwgMyB9LAorICB7ICJicGMiLCA2IH0sCisgIHsgImJicHN3IiwgOCB9LAorICB7ICJiYnBjIiwgMTQgfSwKKyAgeyAiY3IwIiwgMCB9LAorICB7ICJjcjEiLCAxIH0sCisgIHsgImNyMiIsIDIgfSwKKyAgeyAiY3IzIiwgMyB9LAorICB7ICJjcjQiLCA0IH0sCisgIHsgImNyNSIsIDUgfSwKKyAgeyAiY3I2IiwgNiB9LAorICB7ICJjcjciLCA3IH0sCisgIHsgImNyOCIsIDggfSwKKyAgeyAiY3I5IiwgOSB9LAorICB7ICJjcjEwIiwgMTAgfSwKKyAgeyAiY3IxMSIsIDExIH0sCisgIHsgImNyMTIiLCAxMiB9LAorICB7ICJjcjEzIiwgMTMgfSwKKyAgeyAiY3IxNCIsIDE0IH0sCisgIHsgImNyMTUiLCAxNSB9Cit9OworCitDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzID0KK3sKKyAgJiBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXNfZW50cmllc1swXSwKKyAgMjMKK307CisKKworCisvKiBUaGUgaGFyZHdhcmUgdGFibGUuICAqLworCisjZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9IV18sYSkpCisKK2NvbnN0IENHRU5fSFdfRU5UUlkgbTMycl9jZ2VuX2h3X3RhYmxlW10gPQoreworICB7ICJoLW1lbW9yeSIsIEhXX0hfTUVNT1JZLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtc2ludCIsIEhXX0hfU0lOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXVpbnQiLCBIV19IX1VJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1hZGRyIiwgSFdfSF9BRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtaWFkZHIiLCBIV19IX0lBRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtcGMiLCBIV19IX1BDLCBDR0VOX0FTTV9OT05FLCAwLCB7IDB8QShQUk9GSUxFKXxBKFBDKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1oaTE2IiwgSFdfSF9ISTE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtc2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtdWxvMTYiLCBIV19IX1VMTzE2LCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtZ3IiLCBIV19IX0dSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgeyAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAiaC1jciIsIEhXX0hfQ1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtY29uZCIsIEhXX0hfQ09ORCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLXBzdyIsIEhXX0hfUFNXLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgImgtYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLWJicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7ICJoLWxvY2siLCBIV19IX0xPQ0ssIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyAwIH0KK307CisKKyN1bmRlZiBBCisKKy8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCisKKyNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lGTERfLGEpKQorCitjb25zdCBDR0VOX0lGTEQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXSA9Cit7CisgIHsgTTMyUl9GX05JTCwgImYtbmlsIiwgMCwgMCwgMCwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfT1AxLCAiZi1vcDEiLCAwLCAzMiwgMCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfT1AyLCAiZi1vcDIiLCAwLCAzMiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfQ09ORCwgImYtY29uZCIsIDAsIDMyLCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IE0zMlJfRl9SMSwgImYtcjEiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfUjIsICJmLXIyIiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IE0zMlJfRl9TSU1NOCwgImYtc2ltbTgiLCAwLCAzMiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfU0lNTTE2LCAiZi1zaW1tMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IE0zMlJfRl9TSElGVF9PUDIsICJmLXNoaWZ0LW9wMiIsIDAsIDMyLCA4LCAzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IE0zMlJfRl9VSU1NNCwgImYtdWltbTQiLCAwLCAzMiwgMTIsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgTTMyUl9GX1VJTU01LCAiZi11aW1tNSIsIDAsIDMyLCAxMSwgNSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfVUlNTTE2LCAiZi11aW1tMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IE0zMlJfRl9VSU1NMjQsICJmLXVpbW0yNCIsIDAsIDMyLCA4LCAyNCwgeyAwfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBNMzJSX0ZfSEkxNiwgImYtaGkxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgTTMyUl9GX0RJU1A4LCAiZi1kaXNwOCIsIDAsIDMyLCA4LCA4LCB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgTTMyUl9GX0RJU1AxNiwgImYtZGlzcDE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IE0zMlJfRl9ESVNQMjQsICJmLWRpc3AyNCIsIDAsIDMyLCA4LCAyNCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IDAgfQorfTsKKworI3VuZGVmIEEKKworLyogVGhlIG9wZXJhbmQgdGFibGUuICAqLworCisjZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9PUEVSQU5EXyxhKSkKKyNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKKworY29uc3QgQ0dFTl9PUEVSQU5EIG0zMnJfY2dlbl9vcGVyYW5kX3RhYmxlW10gPQoreworLyogcGM6IHByb2dyYW0gY291bnRlciAqLworICB7ICJwYyIsIE0zMlJfT1BFUkFORF9QQywgSFdfSF9QQywgMCwgMCwKKyAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc3I6IHNvdXJjZSByZWdpc3RlciAqLworICB7ICJzciIsIE0zMlJfT1BFUkFORF9TUiwgSFdfSF9HUiwgMTIsIDQsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGRyOiBkZXN0aW5hdGlvbiByZWdpc3RlciAqLworICB7ICJkciIsIE0zMlJfT1BFUkFORF9EUiwgSFdfSF9HUiwgNCwgNCwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc3JjMTogc291cmNlIHJlZ2lzdGVyIDEgKi8KKyAgeyAic3JjMSIsIE0zMlJfT1BFUkFORF9TUkMxLCBIV19IX0dSLCA0LCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBzcmMyOiBzb3VyY2UgcmVnaXN0ZXIgMiAqLworICB7ICJzcmMyIiwgTTMyUl9PUEVSQU5EX1NSQzIsIEhXX0hfR1IsIDEyLCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBzY3I6IHNvdXJjZSBjb250cm9sIHJlZ2lzdGVyICovCisgIHsgInNjciIsIE0zMlJfT1BFUkFORF9TQ1IsIEhXX0hfQ1IsIDEyLCA0LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkY3I6IGRlc3RpbmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgeyAiZGNyIiwgTTMyUl9PUEVSQU5EX0RDUiwgSFdfSF9DUiwgNCwgNCwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc2ltbTg6IDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KKyAgeyAic2ltbTgiLCBNMzJSX09QRVJBTkRfU0lNTTgsIEhXX0hfU0lOVCwgOCwgOCwKKyAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc2ltbTE2OiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqLworICB7ICJzaW1tMTYiLCBNMzJSX09QRVJBTkRfU0lNTTE2LCBIV19IX1NJTlQsIDE2LCAxNiwKKyAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogdWltbTQ6IDQgYml0IHRyYXAgbnVtYmVyICovCisgIHsgInVpbW00IiwgTTMyUl9PUEVSQU5EX1VJTU00LCBIV19IX1VJTlQsIDEyLCA0LAorICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiB1aW1tNTogNSBiaXQgc2hpZnQgY291bnQgKi8KKyAgeyAidWltbTUiLCBNMzJSX09QRVJBTkRfVUlNTTUsIEhXX0hfVUlOVCwgMTEsIDUsCisgICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHVpbW0xNjogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLworICB7ICJ1aW1tMTYiLCBNMzJSX09QRVJBTkRfVUlNTTE2LCBIV19IX1VJTlQsIDE2LCAxNiwKKyAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogaGFzaDogIyBwcmVmaXggKi8KKyAgeyAiaGFzaCIsIE0zMlJfT1BFUkFORF9IQVNILCBIV19IX1NJTlQsIDAsIDAsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGhpMTY6IGhpZ2ggMTYgYml0IGltbWVkaWF0ZSwgc2lnbiBvcHRpb25hbCAqLworICB7ICJoaTE2IiwgTTMyUl9PUEVSQU5EX0hJMTYsIEhXX0hfSEkxNiwgMTYsIDE2LAorICAgIHsgMHxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBzbG8xNjogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLworICB7ICJzbG8xNiIsIE0zMlJfT1BFUkFORF9TTE8xNiwgSFdfSF9TTE8xNiwgMTYsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiB1bG8xNjogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSwgZm9yIGxvdygpICovCisgIHsgInVsbzE2IiwgTTMyUl9PUEVSQU5EX1VMTzE2LCBIV19IX1VMTzE2LCAxNiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIHVpbW0yNDogMjQgYml0IGFkZHJlc3MgKi8KKyAgeyAidWltbTI0IiwgTTMyUl9PUEVSQU5EX1VJTU0yNCwgSFdfSF9BRERSLCA4LCAyNCwKKyAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShSRUxPQyl8QShBQlNfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogZGlzcDg6IDggYml0IGRpc3BsYWNlbWVudCAqLworICB7ICJkaXNwOCIsIE0zMlJfT1BFUkFORF9ESVNQOCwgSFdfSF9JQUREUiwgOCwgOCwKKyAgICB7IDB8QShSRUxBWCl8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBkaXNwMTY6IDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KKyAgeyAiZGlzcDE2IiwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgSFdfSF9JQUREUiwgMTYsIDE2LAorICAgIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGRpc3AyNDogMjQgYml0IGRpc3BsYWNlbWVudCAqLworICB7ICJkaXNwMjQiLCBNMzJSX09QRVJBTkRfRElTUDI0LCBIV19IX0lBRERSLCA4LCAyNCwKKyAgICB7IDB8QShSRUxBWCl8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBjb25kYml0OiBjb25kaXRpb24gYml0ICovCisgIHsgImNvbmRiaXQiLCBNMzJSX09QRVJBTkRfQ09OREJJVCwgSFdfSF9DT05ELCAwLCAwLAorICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBhY2N1bTogYWNjdW11bGF0b3IgKi8KKyAgeyAiYWNjdW0iLCBNMzJSX09QRVJBTkRfQUNDVU0sIEhXX0hfQUNDVU0sIDAsIDAsCisgICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyAwIH0KK307CisKKyN1bmRlZiBBCisKKyNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQorI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQorCisvKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLworCitzdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBtMzJyX2NnZW5faW5zbl90YWJsZVtNQVhfSU5TTlNdID0KK3sKKyAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgorICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgorICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLworICB7IDAsIDAsIDAgfSwKKy8qIGFkZCAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fQURELCAiYWRkIiwgImFkZCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLworICB7CisgICAgTTMyUl9JTlNOX0FERDMsICJhZGQzIiwgImFkZDMiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmQgJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX0FORCwgImFuZCIsICJhbmQiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLworICB7CisgICAgTTMyUl9JTlNOX0FORDMsICJhbmQzIiwgImFuZDMiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBvciAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fT1IsICJvciIsICJvciIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fT1IzLCAib3IzIiwgIm9yMyIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHhvciAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fWE9SLCAieG9yIiwgInhvciIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fWE9SMywgInhvcjMiLCAieG9yMyIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFkZGkgJGRyLCRzaW1tOCAqLworICB7CisgICAgTTMyUl9JTlNOX0FEREksICJhZGRpIiwgImFkZGkiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhZGR2ICRkciwkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9BRERWLCAiYWRkdiIsICJhZGR2IiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYWRkdjMgJGRyLCRzciwkc2ltbTE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fQUREVjMsICJhZGR2MyIsICJhZGR2MyIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFkZHggJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX0FERFgsICJhZGR4IiwgImFkZHgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiYy5zICRkaXNwOCAqLworICB7CisgICAgTTMyUl9JTlNOX0JDOCwgImJjOCIsICJiYy5zIiwgMTYsCisgICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmMubCAkZGlzcDI0ICovCisgIHsKKyAgICBNMzJSX0lOU05fQkMyNCwgImJjMjQiLCAiYmMubCIsIDMyLAorICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fQkVRLCAiYmVxIiwgImJlcSIsIDMyLAorICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJlcXogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgTTMyUl9JTlNOX0JFUVosICJiZXF6IiwgImJlcXoiLCAzMiwKKyAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KKyAgeworICAgIE0zMlJfSU5TTl9CR0VaLCAiYmdleiIsICJiZ2V6IiwgMzIsCisgICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fQkdUWiwgImJndHoiLCAiYmd0eiIsIDMyLAorICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsZXogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgTTMyUl9JTlNOX0JMRVosICJibGV6IiwgImJsZXoiLCAzMiwKKyAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KKyAgeworICAgIE0zMlJfSU5TTl9CTFRaLCAiYmx0eiIsICJibHR6IiwgMzIsCisgICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fQk5FWiwgImJuZXoiLCAiYm5leiIsIDMyLAorICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsLnMgJGRpc3A4ICovCisgIHsKKyAgICBNMzJSX0lOU05fQkw4LCAiYmw4IiwgImJsLnMiLCAxNiwKKyAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibC5sICRkaXNwMjQgKi8KKyAgeworICAgIE0zMlJfSU5TTl9CTDI0LCAiYmwyNCIsICJibC5sIiwgMzIsCisgICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibmMucyAkZGlzcDggKi8KKyAgeworICAgIE0zMlJfSU5TTl9CTkM4LCAiYm5jOCIsICJibmMucyIsIDE2LAorICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJuYy5sICRkaXNwMjQgKi8KKyAgeworICAgIE0zMlJfSU5TTl9CTkMyNCwgImJuYzI0IiwgImJuYy5sIiwgMzIsCisgICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KKyAgeworICAgIE0zMlJfSU5TTl9CTkUsICJibmUiLCAiYm5lIiwgMzIsCisgICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnJhLnMgJGRpc3A4ICovCisgIHsKKyAgICBNMzJSX0lOU05fQlJBOCwgImJyYTgiLCAiYnJhLnMiLCAxNiwKKyAgICB7IDB8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBicmEubCAkZGlzcDI0ICovCisgIHsKKyAgICBNMzJSX0lOU05fQlJBMjQsICJicmEyNCIsICJicmEubCIsIDMyLAorICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wICRzcmMxLCRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fQ01QLCAiY21wIiwgImNtcCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcGkgJHNyYzIsJHNpbW0xNiAqLworICB7CisgICAgTTMyUl9JTlNOX0NNUEksICJjbXBpIiwgImNtcGkiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXB1ICRzcmMxLCRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fQ01QVSwgImNtcHUiLCAiY21wdSIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KKyAgeworICAgIE0zMlJfSU5TTl9DTVBVSSwgImNtcHVpIiwgImNtcHVpIiwgMzIsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2ICRkciwkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9ESVYsICJkaXYiLCAiZGl2IiwgMzIsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2dSAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fRElWVSwgImRpdnUiLCAiZGl2dSIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJlbSAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fUkVNLCAicmVtIiwgInJlbSIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJlbXUgJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX1JFTVUsICJyZW11IiwgInJlbXUiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBqbCAkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9KTCwgImpsIiwgImpsIiwgMTYsCisgICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogam1wICRzciAqLworICB7CisgICAgTTMyUl9JTlNOX0pNUCwgImptcCIsICJqbXAiLCAxNiwKKyAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkICRkcixAJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fTEQsICJsZCIsICJsZCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkICRkcixAKCRzbG8xNiwkc3IpICovCisgIHsKKyAgICBNMzJSX0lOU05fTERfRCwgImxkLWQiLCAibGQiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGIgJGRyLEAkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9MREIsICJsZGIiLCAibGRiIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCisgIHsKKyAgICBNMzJSX0lOU05fTERCX0QsICJsZGItZCIsICJsZGIiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGggJGRyLEAkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9MREgsICJsZGgiLCAibGRoIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCisgIHsKKyAgICBNMzJSX0lOU05fTERIX0QsICJsZGgtZCIsICJsZGgiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHViICRkcixAJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fTERVQiwgImxkdWIiLCAibGR1YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KKyAgeworICAgIE0zMlJfSU5TTl9MRFVCX0QsICJsZHViLWQiLCAibGR1YiIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdWggJGRyLEAkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9MRFVILCAibGR1aCIsICJsZHVoIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLworICB7CisgICAgTTMyUl9JTlNOX0xEVUhfRCwgImxkdWgtZCIsICJsZHVoIiwgMzIsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgJGRyLEAkc3IrICovCisgIHsKKyAgICBNMzJSX0lOU05fTERfUExVUywgImxkLXBsdXMiLCAibGQiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZDI0ICRkciwkdWltbTI0ICovCisgIHsKKyAgICBNMzJSX0lOU05fTEQyNCwgImxkMjQiLCAibGQyNCIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaTggJGRyLCRzaW1tOCAqLworICB7CisgICAgTTMyUl9JTlNOX0xESTgsICJsZGk4IiwgImxkaTgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KKyAgeworICAgIE0zMlJfSU5TTl9MREkxNiwgImxkaTE2IiwgImxkaTE2IiwgMzIsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbG9jayAkZHIsQCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX0xPQ0ssICJsb2NrIiwgImxvY2siLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtYWNoaSAkc3JjMSwkc3JjMiAqLworICB7CisgICAgTTMyUl9JTlNOX01BQ0hJLCAibWFjaGkiLCAibWFjaGkiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtYWNsbyAkc3JjMSwkc3JjMiAqLworICB7CisgICAgTTMyUl9JTlNOX01BQ0xPLCAibWFjbG8iLCAibWFjbG8iLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KKyAgeworICAgIE0zMlJfSU5TTl9NQUNXSEksICJtYWN3aGkiLCAibWFjd2hpIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQorICB9LAorLyogbWFjd2xvICRzcmMxLCRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fTUFDV0xPLCAibWFjd2xvIiwgIm1hY3dsbyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KKyAgfSwKKy8qIG11bCAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fTVVMLCAibXVsIiwgIm11bCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG11bGhpICRzcmMxLCRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fTVVMSEksICJtdWxoaSIsICJtdWxoaSIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KKyAgfSwKKy8qIG11bGxvICRzcmMxLCRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fTVVMTE8sICJtdWxsbyIsICJtdWxsbyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KKyAgfSwKKy8qIG11bHdoaSAkc3JjMSwkc3JjMiAqLworICB7CisgICAgTTMyUl9JTlNOX01VTFdISSwgIm11bHdoaSIsICJtdWx3aGkiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtdWx3bG8gJHNyYzEsJHNyYzIgKi8KKyAgeworICAgIE0zMlJfSU5TTl9NVUxXTE8sICJtdWx3bG8iLCAibXVsd2xvIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQorICB9LAorLyogbXYgJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX01WLCAibXYiLCAibXYiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtdmZhY2hpICRkciAqLworICB7CisgICAgTTMyUl9JTlNOX01WRkFDSEksICJtdmZhY2hpIiwgIm12ZmFjaGkiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtdmZhY2xvICRkciAqLworICB7CisgICAgTTMyUl9JTlNOX01WRkFDTE8sICJtdmZhY2xvIiwgIm12ZmFjbG8iLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtdmZhY21pICRkciAqLworICB7CisgICAgTTMyUl9JTlNOX01WRkFDTUksICJtdmZhY21pIiwgIm12ZmFjbWkiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtdmZjICRkciwkc2NyICovCisgIHsKKyAgICBNMzJSX0lOU05fTVZGQywgIm12ZmMiLCAibXZmYyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG12dGFjaGkgJHNyYzEgKi8KKyAgeworICAgIE0zMlJfSU5TTl9NVlRBQ0hJLCAibXZ0YWNoaSIsICJtdnRhY2hpIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQorICB9LAorLyogbXZ0YWNsbyAkc3JjMSAqLworICB7CisgICAgTTMyUl9JTlNOX01WVEFDTE8sICJtdnRhY2xvIiwgIm12dGFjbG8iLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBtdnRjICRzciwkZGNyICovCisgIHsKKyAgICBNMzJSX0lOU05fTVZUQywgIm12dGMiLCAibXZ0YyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5lZyAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fTkVHLCAibmVnIiwgIm5lZyIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vcCAqLworICB7CisgICAgTTMyUl9JTlNOX05PUCwgIm5vcCIsICJub3AiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3QgJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX05PVCwgIm5vdCIsICJub3QiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiByYWMgKi8KKyAgeworICAgIE0zMlJfSU5TTl9SQUMsICJyYWMiLCAicmFjIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQorICB9LAorLyogcmFjaCAqLworICB7CisgICAgTTMyUl9JTlNOX1JBQ0gsICJyYWNoIiwgInJhY2giLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9CisgIH0sCisvKiBydGUgKi8KKyAgeworICAgIE0zMlJfSU5TTl9SVEUsICJydGUiLCAicnRlIiwgMTYsCisgICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fU0VUSCwgInNldGgiLCAic2V0aCIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNsbCAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fU0xMLCAic2xsIiwgInNsbCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCisgIHsKKyAgICBNMzJSX0lOU05fU0xMMywgInNsbDMiLCAic2xsMyIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNsbGkgJGRyLCR1aW1tNSAqLworICB7CisgICAgTTMyUl9JTlNOX1NMTEksICJzbGxpIiwgInNsbGkiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzcmEgJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX1NSQSwgInNyYSIsICJzcmEiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLworICB7CisgICAgTTMyUl9JTlNOX1NSQTMsICJzcmEzIiwgInNyYTMiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzcmFpICRkciwkdWltbTUgKi8KKyAgeworICAgIE0zMlJfSU5TTl9TUkFJLCAic3JhaSIsICJzcmFpIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3JsICRkciwkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9TUkwsICJzcmwiLCAic3JsIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3JsMyAkZHIsJHNyLCRzaW1tMTYgKi8KKyAgeworICAgIE0zMlJfSU5TTl9TUkwzLCAic3JsMyIsICJzcmwzIiwgMzIsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3JsaSAkZHIsJHVpbW01ICovCisgIHsKKyAgICBNMzJSX0lOU05fU1JMSSwgInNybGkiLCAic3JsaSIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRzcmMxLEAkc3JjMiAqLworICB7CisgICAgTTMyUl9JTlNOX1NULCAic3QiLCAic3QiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KKyAgeworICAgIE0zMlJfSU5TTl9TVF9ELCAic3QtZCIsICJzdCIsIDMyLAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KKyAgeworICAgIE0zMlJfSU5TTl9TVEIsICJzdGIiLCAic3RiIiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLworICB7CisgICAgTTMyUl9JTlNOX1NUQl9ELCAic3RiLWQiLCAic3RiIiwgMzIsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RoICRzcmMxLEAkc3JjMiAqLworICB7CisgICAgTTMyUl9JTlNOX1NUSCwgInN0aCIsICJzdGgiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCisgIHsKKyAgICBNMzJSX0lOU05fU1RIX0QsICJzdGgtZCIsICJzdGgiLCAzMiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkc3JjMSxAKyRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fU1RfUExVUywgInN0LXBsdXMiLCAic3QiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkc3JjMSxALSRzcmMyICovCisgIHsKKyAgICBNMzJSX0lOU05fU1RfTUlOVVMsICJzdC1taW51cyIsICJzdCIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN1YiAkZHIsJHNyICovCisgIHsKKyAgICBNMzJSX0lOU05fU1VCLCAic3ViIiwgInN1YiIsIDE2LAorICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN1YnYgJGRyLCRzciAqLworICB7CisgICAgTTMyUl9JTlNOX1NVQlYsICJzdWJ2IiwgInN1YnYiLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdWJ4ICRkciwkc3IgKi8KKyAgeworICAgIE0zMlJfSU5TTl9TVUJYLCAic3VieCIsICJzdWJ4IiwgMTYsCisgICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogdHJhcCAkdWltbTQgKi8KKyAgeworICAgIE0zMlJfSU5TTl9UUkFQLCAidHJhcCIsICJ0cmFwIiwgMTYsCisgICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogdW5sb2NrICRzcmMxLEAkc3JjMiAqLworICB7CisgICAgTTMyUl9JTlNOX1VOTE9DSywgInVubG9jayIsICJ1bmxvY2siLCAxNiwKKyAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCit9OworCisjdW5kZWYgQQorI3VuZGVmIE1ORU0KKyN1bmRlZiBPUAorCisvKiBJbml0aWFsaXplIGFueXRoaW5nIG5lZWRlZCB0byBiZSBkb25lIG9uY2UsIGJlZm9yZSBhbnkgY3B1X29wZW4gY2FsbC4gICovCisKK3N0YXRpYyB2b2lkCitpbml0X3RhYmxlcyAoKQoreworfQorCisvKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBsb29rIHVwIGEgbWFjaCB2aWEgaXRzIGJmZCBuYW1lLiAgKi8KKworc3RhdGljIGNvbnN0IENHRU5fTUFDSCAqCitsb29rdXBfbWFjaF92aWFfYmZkX25hbWUgKHRhYmxlLCBuYW1lKQorICAgICBjb25zdCBDR0VOX01BQ0ggKnRhYmxlOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICB3aGlsZSAodGFibGUtPm5hbWUpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdGFibGUtPmJmZF9uYW1lKSA9PSAwKQorCXJldHVybiB0YWJsZTsKKyAgICAgICsrdGFibGU7CisgICAgfQorICBhYm9ydCAoKTsKK30KKworLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2J1aWxkX2h3X3RhYmxlIChjZCkKKyAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOworeworICBpbnQgaTsKKyAgaW50IG1hY2hzID0gY2QtPm1hY2hzOworICBjb25zdCBDR0VOX0hXX0VOVFJZICppbml0ID0gJiBtMzJyX2NnZW5faHdfdGFibGVbMF07CisgIC8qIE1BWF9IVyBpcyBvbmx5IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgZW50cmllcy4KKyAgICAgSG93ZXZlciBlYWNoIGVudHJ5IGlzIGluZGV4ZWQgYnkgaXQncyBlbnVtIHNvIHRoZXJlIGNhbiBiZSBob2xlcyBpbgorICAgICB0aGUgdGFibGUuICAqLworICBjb25zdCBDR0VOX0hXX0VOVFJZICoqc2VsZWN0ZWQgPQorICAgIChjb25zdCBDR0VOX0hXX0VOVFJZICoqKSB4bWFsbG9jIChNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOworCisgIGNkLT5od190YWJsZS5pbml0X2VudHJpZXMgPSBpbml0OworICBjZC0+aHdfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9IV19FTlRSWSk7CisgIG1lbXNldCAoc2VsZWN0ZWQsIDAsIE1BWF9IVyAqIHNpemVvZiAoQ0dFTl9IV19FTlRSWSAqKSk7CisgIC8qID8/PyBGb3Igbm93IHdlIGp1c3QgdXNlIG1hY2hzIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLworICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQorICAgIGlmIChDR0VOX0hXX0FUVFJfVkFMVUUgKCZpbml0W2ldLCBDR0VOX0hXX01BQ0gpCisJJiBtYWNocykKKyAgICAgIHNlbGVjdGVkW2luaXRbaV0udHlwZV0gPSAmaW5pdFtpXTsKKyAgY2QtPmh3X3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKKyAgY2QtPmh3X3RhYmxlLm51bV9lbnRyaWVzID0gTUFYX0hXOworfQorCisvKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfaWZpZWxkX3RhYmxlIChjZCkKKyAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOworeworICBjZC0+aWZsZF90YWJsZSA9ICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbMF07Cit9CisKKy8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitidWlsZF9vcGVyYW5kX3RhYmxlIChjZCkKKyAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOworeworICBpbnQgaTsKKyAgaW50IG1hY2hzID0gY2QtPm1hY2hzOworICBjb25zdCBDR0VOX09QRVJBTkQgKmluaXQgPSAmIG0zMnJfY2dlbl9vcGVyYW5kX3RhYmxlWzBdOworICAvKiBNQVhfT1BFUkFORFMgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCisgICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KKyAgICAgdGhlIHRhYmxlLiAgKi8KKyAgY29uc3QgQ0dFTl9PUEVSQU5EICoqc2VsZWN0ZWQgPQorICAgIChjb25zdCBDR0VOX09QRVJBTkQgKiopIHhtYWxsb2MgKE1BWF9PUEVSQU5EUyAqIHNpemVvZiAoQ0dFTl9PUEVSQU5EICopKTsKKworICBjZC0+b3BlcmFuZF90YWJsZS5pbml0X2VudHJpZXMgPSBpbml0OworICBjZC0+b3BlcmFuZF90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX09QRVJBTkQpOworICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7CisgIC8qID8/PyBGb3Igbm93IHdlIGp1c3QgdXNlIG1hY2ggdG8gZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2Ugd2FudC4gICovCisgIGZvciAoaSA9IDA7IGluaXRbaV0ubmFtZSAhPSBOVUxMOyArK2kpCisgICAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9PUEVSQU5EX01BQ0gpCisJJiBtYWNocykKKyAgICAgIHNlbGVjdGVkW2luaXRbaV0udHlwZV0gPSAmaW5pdFtpXTsKKyAgY2QtPm9wZXJhbmRfdGFibGUuZW50cmllcyA9IHNlbGVjdGVkOworICBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllcyA9IE1BWF9PUEVSQU5EUzsKK30KKworLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLgorICAgPz8/IFRoaXMgY291bGQgbGVhdmUgb3V0IGluc25zIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBtYWNoL2lzYSwKKyAgIGJ1dCB0aGF0IHdvdWxkIGNhdXNlIGVycm9ycyBsaWtlICJmb28gb25seSBzdXBwb3J0ZWQgYnkgYmFyIiB0byBiZWNvbWUKKyAgICJ1bmtub3duIGluc24iLCBzbyBmb3Igbm93IHdlIGluY2x1ZGUgYWxsIGluc25zIGFuZCByZXF1aXJlIHRoZSBhcHAgdG8KKyAgIGRvIHRoZSBjaGVja2luZyBsYXRlci4KKyAgID8/PyBPbiB0aGUgb3RoZXIgaGFuZCwgcGFyc2luZyBvZiBzdWNoIGluc25zIG1heSByZXF1aXJlIHRoZWlyIGhhcmR3YXJlIG9yCisgICBvcGVyYW5kIGVsZW1lbnRzIHRvIGJlIGluIHRoZSB0YWJsZSBbd2hpY2ggdGhleSBtaWdodG4ndCBiZV0uICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfaW5zbl90YWJsZSAoY2QpCisgICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKK3sKKyAgaW50IGk7CisgIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBtMzJyX2NnZW5faW5zbl90YWJsZVswXTsKKyAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAoTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKKworICBtZW1zZXQgKGluc25zLCAwLCBNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCisgICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKKyAgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7CisgIGNkLT5pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOworICBjZC0+aW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gTUFYX0lOU05TOworfQorCisvKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byByZWJ1aWxkIHRoZSB0YWJsZXMuICAqLworCitzdGF0aWMgdm9pZAorbTMycl9jZ2VuX3JlYnVpbGRfdGFibGVzIChjZCkKKyAgICAgQ0dFTl9DUFVfVEFCTEUgKmNkOworeworICBpbnQgaSxuX2lzYXMsbl9tYWNoczsKKyAgdW5zaWduZWQgaW50IGlzYXMgPSBjZC0+aXNhczsKKyAgdW5zaWduZWQgaW50IG1hY2hzID0gY2QtPm1hY2hzOworCisgIGNkLT5pbnRfaW5zbl9wID0gQ0dFTl9JTlRfSU5TTl9QOworCisgIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBpc2Egc3BlYy4gICovCisjZGVmaW5lIFVOU0VUIChDR0VOX1NJWkVfVU5LTk9XTiArIDEpCisgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IFVOU0VUOworICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBVTlNFVDsKKyAgY2QtPm1pbl9pbnNuX2JpdHNpemUgPSA2NTUzNTsgLyogc29tZSByaWRpY3Vsb3VzbHkgYmlnIG51bWJlciAqLworICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSVNBUzsgKytpKQorICAgIGlmICgoKDEgPDwgaSkgJiBpc2FzKSAhPSAwKQorICAgICAgeworCWNvbnN0IENHRU5fSVNBICppc2EgPSAmIG0zMnJfY2dlbl9pc2FfdGFibGVbaV07CisKKwkvKiBEZWZhdWx0IGluc24gc2l6ZXMgb2YgYWxsIHNlbGVjdGVkIGlzYXMgbXVzdCBiZSBlcXVhbCBvciB3ZSBzZXQKKwkgICB0aGUgcmVzdWx0IHRvIDAsIG1lYW5pbmcgInVua25vd24iLiAgKi8KKwlpZiAoY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID09IFVOU0VUKQorCSAgY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplID0gaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZTsKKwllbHNlIGlmIChpc2EtPmRlZmF1bHRfaW5zbl9iaXRzaXplID09IGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSkKKwkgIDsgLyogdGhpcyBpcyBvayAqLworCWVsc2UKKwkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IENHRU5fU0laRV9VTktOT1dOOworCisJLyogQmFzZSBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0CisJICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCisJaWYgKGNkLT5iYXNlX2luc25fYml0c2l6ZSA9PSBVTlNFVCkKKwkgIGNkLT5iYXNlX2luc25fYml0c2l6ZSA9IGlzYS0+YmFzZV9pbnNuX2JpdHNpemU7CisJZWxzZSBpZiAoaXNhLT5iYXNlX2luc25fYml0c2l6ZSA9PSBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCisJICA7IC8qIHRoaXMgaXMgb2sgKi8KKwllbHNlCisJICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKKworCS8qIFNldCBtaW4sbWF4IGluc24gc2l6ZXMuICAqLworCWlmIChpc2EtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+bWluX2luc25fYml0c2l6ZSkKKwkgIGNkLT5taW5faW5zbl9iaXRzaXplID0gaXNhLT5taW5faW5zbl9iaXRzaXplOworCWlmIChpc2EtPm1heF9pbnNuX2JpdHNpemUgPiBjZC0+bWF4X2luc25fYml0c2l6ZSkKKwkgIGNkLT5tYXhfaW5zbl9iaXRzaXplID0gaXNhLT5tYXhfaW5zbl9iaXRzaXplOworCisJKytuX2lzYXM7CisgICAgICB9CisKKyAgLyogRGF0YSBkZXJpdmVkIGZyb20gdGhlIG1hY2ggc3BlYy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUFDSFM7ICsraSkKKyAgICBpZiAoKCgxIDw8IGkpICYgbWFjaHMpICE9IDApCisgICAgICB7CisJY29uc3QgQ0dFTl9NQUNIICptYWNoID0gJiBtMzJyX2NnZW5fbWFjaF90YWJsZVtpXTsKKworCSsrbl9tYWNoczsKKyAgICAgIH0KKworICAvKiBEZXRlcm1pbmUgd2hpY2ggaHcgZWxlbWVudHMgYXJlIHVzZWQgYnkgTUFDSC4gICovCisgIGJ1aWxkX2h3X3RhYmxlIChjZCk7CisKKyAgLyogQnVpbGQgdGhlIGlmaWVsZCB0YWJsZS4gICovCisgIGJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpOworCisgIC8qIERldGVybWluZSB3aGljaCBvcGVyYW5kcyBhcmUgdXNlZCBieSBNQUNIL0lTQS4gICovCisgIGJ1aWxkX29wZXJhbmRfdGFibGUgKGNkKTsKKworICAvKiBCdWlsZCB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLworICBidWlsZF9pbnNuX3RhYmxlIChjZCk7Cit9CisKKy8qIEluaXRpYWxpemUgYSBjcHUgdGFibGUgYW5kIHJldHVybiBhIGRlc2NyaXB0b3IuCisgICBJdCdzIG11Y2ggbGlrZSBvcGVuaW5nIGEgZmlsZSwgYW5kIG11c3QgYmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGNhbGxlZC4KKyAgIFRoZSBhcmd1bWVudHMgYXJlIGEgc2V0IG9mICh0eXBlL3ZhbHVlKSBwYWlycywgdGVybWluYXRlZCB3aXRoCisgICBDR0VOX0NQVV9PUEVOX0VORC4KKworICAgQ3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXM6CisgICBDR0VOX0NQVV9PUEVOX0lTQVM6ICAgIGJpdG1hcCBvZiB2YWx1ZXMgaW4gZW51bSBpc2FfYXR0cgorICAgQ0dFTl9DUFVfT1BFTl9NQUNIUzogICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gbWFjaF9hdHRyCisgICBDR0VOX0NQVV9PUEVOX0JGRE1BQ0g6IHNwZWNpZnkgMSBtYWNoIHVzaW5nIGJmZCBuYW1lCisgICBDR0VOX0NQVV9PUEVOX0VORElBTjogIHNwZWNpZnkgZW5kaWFuIGNob2ljZQorICAgQ0dFTl9DUFVfT1BFTl9FTkQ6ICAgICB0ZXJtaW5hdGVzIGFyZ3VtZW50cworCisgICA/Pz8gU2ltdWx0YW5lb3VzIG11bHRpcGxlIGlzYXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UsIGJ1dCBpdCdzIG5vdCAoeWV0KQorICAgcHJlY2x1ZGVkLgorCisgICA/Pz8gV2Ugb25seSBzdXBwb3J0IElTTyBDIHN0ZGFyZ3MgaGVyZSwgbm90IEsmUi4KKyAgIExhemluZXNzLCBwbHVzIGV4cGVyaW1lbnQgdG8gc2VlIGlmIGFueXRoaW5nIHJlcXVpcmVzIEsmUiAtIGV2ZW50dWFsbHkKKyAgIEsmUiB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgLSBlLmcuIEdEQiBpcyBjdXJyZW50bHkgdHJ5aW5nIHRoaXMuICAqLworCitDR0VOX0NQVV9ERVNDCittMzJyX2NnZW5fY3B1X29wZW4gKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcgYXJnX3R5cGUsIC4uLikKK3sKKyAgQ0dFTl9DUFVfVEFCTEUgKmNkID0gKENHRU5fQ1BVX1RBQkxFICopIHhtYWxsb2MgKHNpemVvZiAoQ0dFTl9DUFVfVEFCTEUpKTsKKyAgc3RhdGljIGludCBpbml0X3A7CisgIHVuc2lnbmVkIGludCBpc2FzID0gMDsgIC8qIDAgPSAidW5zcGVjaWZpZWQiICovCisgIHVuc2lnbmVkIGludCBtYWNocyA9IDA7IC8qIDAgPSAidW5zcGVjaWZpZWQiICovCisgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuID0gQ0dFTl9FTkRJQU5fVU5LTk9XTjsKKyAgdmFfbGlzdCBhcDsKKworICBpZiAoISBpbml0X3ApCisgICAgeworICAgICAgaW5pdF90YWJsZXMgKCk7CisgICAgICBpbml0X3AgPSAxOworICAgIH0KKworICBtZW1zZXQgKGNkLCAwLCBzaXplb2YgKCpjZCkpOworCisgIHZhX3N0YXJ0IChhcCwgYXJnX3R5cGUpOworICB3aGlsZSAoYXJnX3R5cGUgIT0gQ0dFTl9DUFVfT1BFTl9FTkQpCisgICAgeworICAgICAgc3dpdGNoIChhcmdfdHlwZSkKKwl7CisJY2FzZSBDR0VOX0NQVV9PUEVOX0lTQVMgOgorCSAgaXNhcyA9IHZhX2FyZyAoYXAsIHVuc2lnbmVkIGludCk7CisJICBicmVhazsKKwljYXNlIENHRU5fQ1BVX09QRU5fTUFDSFMgOgorCSAgbWFjaHMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOworCSAgYnJlYWs7CisJY2FzZSBDR0VOX0NQVV9PUEVOX0JGRE1BQ0ggOgorCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcCwgY29uc3QgY2hhciAqKTsKKwkgICAgY29uc3QgQ0dFTl9NQUNIICptYWNoID0KKwkgICAgICBsb29rdXBfbWFjaF92aWFfYmZkX25hbWUgKG0zMnJfY2dlbl9tYWNoX3RhYmxlLCBuYW1lKTsKKworCSAgICBtYWNocyB8PSBtYWNoLT5udW0gPDwgMTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBDR0VOX0NQVV9PUEVOX0VORElBTiA6CisJICBlbmRpYW4gPSB2YV9hcmcgKGFwLCBlbnVtIGNnZW5fZW5kaWFuKTsKKwkgIGJyZWFrOworCWRlZmF1bHQgOgorCSAgZnByaW50ZiAoc3RkZXJyLCAibTMycl9jZ2VuX2NwdV9vcGVuOiB1bnN1cHBvcnRlZCBhcmd1bWVudCBgJWQnXG4iLAorCQkgICBhcmdfdHlwZSk7CisJICBhYm9ydCAoKTsgLyogPz8/IHJldHVybiBOVUxMPyAqLworCX0KKyAgICAgIGFyZ190eXBlID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2NwdV9vcGVuX2FyZyk7CisgICAgfQorICB2YV9lbmQgKGFwKTsKKworICAvKiBtYWNoIHVuc3BlY2lmaWVkIG1lYW5zICJhbGwiICovCisgIGlmIChtYWNocyA9PSAwKQorICAgIG1hY2hzID0gKDEgPDwgTUFYX01BQ0hTKSAtIDE7CisgIC8qIGJhc2UgbWFjaCBpcyBhbHdheXMgc2VsZWN0ZWQgKi8KKyAgbWFjaHMgfD0gMTsKKyAgLyogaXNhIHVuc3BlY2lmaWVkIG1lYW5zICJhbGwiICovCisgIGlmIChpc2FzID09IDApCisgICAgaXNhcyA9ICgxIDw8IE1BWF9JU0FTKSAtIDE7CisgIGlmIChlbmRpYW4gPT0gQ0dFTl9FTkRJQU5fVU5LTk9XTikKKyAgICB7CisgICAgICAvKiA/Pz8gSWYgdGFyZ2V0IGhhcyBvbmx5IG9uZSwgY291bGQgaGF2ZSBhIGRlZmF1bHQuICAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCAibTMycl9jZ2VuX2NwdV9vcGVuOiBubyBlbmRpYW5uZXNzIHNwZWNpZmllZFxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgY2QtPmlzYXMgPSBpc2FzOworICBjZC0+bWFjaHMgPSBtYWNoczsKKyAgY2QtPmVuZGlhbiA9IGVuZGlhbjsKKyAgLyogRklYTUU6IGZvciB0aGUgc3BhcmMgY2FzZSB3ZSBjYW4gZGV0ZXJtaW5lIGluc24tZW5kaWFubmVzcyBzdGF0aWNhbGx5LgorICAgICBUaGUgd29ycnkgaGVyZSBpcyB3aGVyZSBib3RoIGRhdGEgYW5kIGluc24gZW5kaWFuIGNhbiBiZSBpbmRlcGVuZGVudGx5CisgICAgIGNob3NlbiwgaW4gd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCBhbm90aGVyIGFyZ3VtZW50LgorICAgICBBY3R1YWxseSwgd2lsbCB3YW50IHRvIGFsbG93IGZvciBtb3JlIGFyZ3VtZW50cyBpbiB0aGUgZnV0dXJlIGFueXdheS4gICovCisgIGNkLT5pbnNuX2VuZGlhbiA9IGVuZGlhbjsKKworICAvKiBUYWJsZSAocmUpYnVpbGRlci4gICovCisgIGNkLT5yZWJ1aWxkX3RhYmxlcyA9IG0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlczsKKyAgbTMycl9jZ2VuX3JlYnVpbGRfdGFibGVzIChjZCk7CisKKyAgcmV0dXJuIChDR0VOX0NQVV9ERVNDKSBjZDsKK30KKworLyogQ292ZXIgZm4gdG8gbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGhhbmRsZSB0aGUgc2ltcGxlIGNhc2Ugb2YgMSBpc2EsIDEgbWFjaC4KKyAgIE1BQ0hfTkFNRSBpcyB0aGUgYmZkIG5hbWUgb2YgdGhlIG1hY2guICAqLworCitDR0VOX0NQVV9ERVNDCittMzJyX2NnZW5fY3B1X29wZW5fMSAobWFjaF9uYW1lLCBlbmRpYW4pCisgICAgIGNvbnN0IGNoYXIgKm1hY2hfbmFtZTsKKyAgICAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Cit7CisgIHJldHVybiBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAorCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBlbmRpYW4sCisJCQkgICAgICAgQ0dFTl9DUFVfT1BFTl9FTkQpOworfQorCisvKiBDbG9zZSBhIGNwdSB0YWJsZS4KKyAgID8/PyBUaGlzIGNhbiBsaXZlIGluIGEgbWFjaGluZSBpbmRlcGVuZGVudCBmaWxlLCBidXQgdGhlcmUncyBjdXJyZW50bHkKKyAgIG5vIHBsYWNlIHRvIHB1dCB0aGlzIGZpbGUgKHRoZXJlJ3Mgbm8gbGliY2dlbikuICBsaWJvcGNvZGVzIGlzIHRoZSB3cm9uZworICAgcGxhY2UgYXMgc29tZSBzaW11bGF0b3IgcG9ydHMgdXNlIHRoaXMgYnV0IHRoZXkgZG9uJ3QgdXNlIGxpYm9wY29kZXMuICAqLworCit2b2lkCittMzJyX2NnZW5fY3B1X2Nsb3NlIChjZCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKK3sKKyAgaWYgKGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcykKKyAgICBmcmVlICgoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyk7CisgIGlmIChjZC0+aHdfdGFibGUuZW50cmllcykKKyAgICBmcmVlICgoQ0dFTl9IV19FTlRSWSAqKSBjZC0+aHdfdGFibGUuZW50cmllcyk7CisgIGZyZWUgKGNkKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMzJyLWRlc2MuaCBiL29wY29kZXMvbTMyci1kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNjM2YwotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTMyci1kZXNjLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qIENQVSBkYXRhIGhlYWRlciBmb3IgbTMyci4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBNMzJSX0NQVV9ICisjZGVmaW5lIE0zMlJfQ1BVX0gKKworI2RlZmluZSBDR0VOX0FSQ0ggbTMycgorCisvKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIG0zMnJfY2dlbl88Uz4uICAqLworI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChtMzJyLF9jZ2VuXyxzKQorCisvKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLworI2RlZmluZSBIQVZFX0NQVV9NMzJSQkYKKworI2RlZmluZSBDR0VOX0lOU05fTFNCMF9QIDAKKworLyogTWF4aW11bSBzaXplIG9mIGFueSBpbnNuIChpbiBieXRlcykuICAqLworI2RlZmluZSBDR0VOX01BWF9JTlNOX1NJWkUgNAorCisjZGVmaW5lIENHRU5fSU5UX0lOU05fUCAxCisKKy8qIEZJWE1FOiBOZWVkIHRvIGNvbXB1dGUgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTLiAgKi8KKworLyogQ0dFTl9NTkVNT05JQ19PUEVSQU5EUyBpcyBkZWZpbmVkIGlmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzLgorICAgZS5nLiBJbiAiYixhIGZvbyIgdGhlICIsYSIgaXMgYW4gb3BlcmFuZC4gIElmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzCisgICB3ZSBjYW4ndCBoYXNoIG9uIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIHNwYWNlLiAgKi8KKyNkZWZpbmUgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUworLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgYW55IGluc24gb3IgbWFjcm8taW5zbiBoYXMuICAqLworI2RlZmluZSBDR0VOX01BWF9JTlNOX09QRVJBTkRTIDE2CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgNworCisvKiBFbnVtcy4gICovCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gZm9ybWF0IGVudW1zLiAgKi8KK3R5cGVkZWYgZW51bSBpbnNuX29wMSB7CisgIE9QMV8wLCBPUDFfMSwgT1AxXzIsIE9QMV8zCisgLCBPUDFfNCwgT1AxXzUsIE9QMV82LCBPUDFfNworICwgT1AxXzgsIE9QMV85LCBPUDFfMTAsIE9QMV8xMQorICwgT1AxXzEyLCBPUDFfMTMsIE9QMV8xNCwgT1AxXzE1Cit9IElOU05fT1AxOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBvcDIgZW51bXMuICAqLwordHlwZWRlZiBlbnVtIGluc25fb3AyIHsKKyAgT1AyXzAsIE9QMl8xLCBPUDJfMiwgT1AyXzMKKyAsIE9QMl80LCBPUDJfNSwgT1AyXzYsIE9QMl83CisgLCBPUDJfOCwgT1AyXzksIE9QMl8xMCwgT1AyXzExCisgLCBPUDJfMTIsIE9QMl8xMywgT1AyXzE0LCBPUDJfMTUKK30gSU5TTl9PUDI7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCit0eXBlZGVmIGVudW0gZ3JfbmFtZXMgeworICBIX0dSX0ZQID0gMTMsIEhfR1JfTFIgPSAxNCwgSF9HUl9TUCA9IDE1LCBIX0dSX1IwID0gMAorICwgSF9HUl9SMSA9IDEsIEhfR1JfUjIgPSAyLCBIX0dSX1IzID0gMywgSF9HUl9SNCA9IDQKKyAsIEhfR1JfUjUgPSA1LCBIX0dSX1I2ID0gNiwgSF9HUl9SNyA9IDcsIEhfR1JfUjggPSA4CisgLCBIX0dSX1I5ID0gOSwgSF9HUl9SMTAgPSAxMCwgSF9HUl9SMTEgPSAxMSwgSF9HUl9SMTIgPSAxMgorICwgSF9HUl9SMTMgPSAxMywgSF9HUl9SMTQgPSAxNCwgSF9HUl9SMTUgPSAxNQorfSBHUl9OQU1FUzsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KK3R5cGVkZWYgZW51bSBjcl9uYW1lcyB7CisgIEhfQ1JfUFNXID0gMCwgSF9DUl9DQlIgPSAxLCBIX0NSX1NQSSA9IDIsIEhfQ1JfU1BVID0gMworICwgSF9DUl9CUEMgPSA2LCBIX0NSX0JCUFNXID0gOCwgSF9DUl9CQlBDID0gMTQsIEhfQ1JfQ1IwID0gMAorICwgSF9DUl9DUjEgPSAxLCBIX0NSX0NSMiA9IDIsIEhfQ1JfQ1IzID0gMywgSF9DUl9DUjQgPSA0CisgLCBIX0NSX0NSNSA9IDUsIEhfQ1JfQ1I2ID0gNiwgSF9DUl9DUjcgPSA3LCBIX0NSX0NSOCA9IDgKKyAsIEhfQ1JfQ1I5ID0gOSwgSF9DUl9DUjEwID0gMTAsIEhfQ1JfQ1IxMSA9IDExLCBIX0NSX0NSMTIgPSAxMgorICwgSF9DUl9DUjEzID0gMTMsIEhfQ1JfQ1IxNCA9IDE0LCBIX0NSX0NSMTUgPSAxNQorfSBDUl9OQU1FUzsKKworLyogQXR0cmlidXRlcy4gICovCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwordHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7CisgIE1BQ0hfQkFTRSwgTUFDSF9NMzJSCisgLCBNQUNIX01BWAorfSBNQUNIX0FUVFI7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9uIHNldCBzZWxlY3Rpb24uICAqLwordHlwZWRlZiBlbnVtIGlzYV9hdHRyIHsKKyAgSVNBX00zMlIsIElTQV9NQVgKK30gSVNBX0FUVFI7CisKKy8qIE51bWJlciBvZiBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLworI2RlZmluZSBNQVhfSVNBUyAgMQorI2RlZmluZSBNQVhfTUFDSFMgKChpbnQpIE1BQ0hfTUFYKQorCisvKiBJZmllbGQgc3VwcG9ydC4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2dlbl9pZmxkIG0zMnJfY2dlbl9pZmxkX3RhYmxlW107CisKKy8qIElmaWVsZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faWZsZCBhdHRycy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9pZmxkX2F0dHIgeworICBDR0VOX0lGTERfVklSVFVBTCwgQ0dFTl9JRkxEX1BDUkVMX0FERFIsIENHRU5fSUZMRF9BQlNfQUREUiwgQ0dFTl9JRkxEX1JFU0VSVkVECisgLCBDR0VOX0lGTERfU0lHTl9PUFQsIENHRU5fSUZMRF9TSUdORUQsIENHRU5fSUZMRF9SRUxPQywgQ0dFTl9JRkxEX0VORF9CT09MUworICwgQ0dFTl9JRkxEX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lGTERfTUFDSCwgQ0dFTl9JRkxEX0VORF9OQk9PTFMKK30gQ0dFTl9JRkxEX0FUVFI7CisKKy8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2lmbGRfYXR0ci4gICovCisjZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoQ0dFTl9JRkxEX0VORF9OQk9PTFMgLSBDR0VOX0lGTERfU1RBUlRfTkJPT0xTIC0gMSkKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBpZmllbGQgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKKyAgTTMyUl9GX05JTCwgTTMyUl9GX09QMSwgTTMyUl9GX09QMiwgTTMyUl9GX0NPTkQKKyAsIE0zMlJfRl9SMSwgTTMyUl9GX1IyLCBNMzJSX0ZfU0lNTTgsIE0zMlJfRl9TSU1NMTYKKyAsIE0zMlJfRl9TSElGVF9PUDIsIE0zMlJfRl9VSU1NNCwgTTMyUl9GX1VJTU01LCBNMzJSX0ZfVUlNTTE2CisgLCBNMzJSX0ZfVUlNTTI0LCBNMzJSX0ZfSEkxNiwgTTMyUl9GX0RJU1A4LCBNMzJSX0ZfRElTUDE2CisgLCBNMzJSX0ZfRElTUDI0CisgLCBNMzJSX0ZfTUFYCit9IElGSUVMRF9UWVBFOworCisjZGVmaW5lIE1BWF9JRkxEICgoaW50KSBNMzJSX0ZfTUFYKQorCisvKiBIYXJkd2FyZSBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5faHcgYXR0cnMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faHdfYXR0ciB7CisgIENHRU5fSFdfVklSVFVBTCwgQ0dFTl9IV19DQUNIRV9BRERSLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKKyAsIENHRU5fSFdfRU5EX0JPT0xTLCBDR0VOX0hXX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0hXX01BQ0gsIENHRU5fSFdfRU5EX05CT09MUworfSBDR0VOX0hXX0FUVFI7CisKKy8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX2h3X2F0dHIuICAqLworI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIChDR0VOX0hXX0VORF9OQk9PTFMgLSBDR0VOX0hXX1NUQVJUX05CT09MUyAtIDEpCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgaGFyZHdhcmUgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faHdfdHlwZSB7CisgIEhXX0hfTUVNT1JZLCBIV19IX1NJTlQsIEhXX0hfVUlOVCwgSFdfSF9BRERSCisgLCBIV19IX0lBRERSLCBIV19IX1BDLCBIV19IX0hJMTYsIEhXX0hfU0xPMTYKKyAsIEhXX0hfVUxPMTYsIEhXX0hfR1IsIEhXX0hfQ1IsIEhXX0hfQUNDVU0KKyAsIEhXX0hfQ09ORCwgSFdfSF9QU1csIEhXX0hfQlBTVywgSFdfSF9CQlBTVworICwgSFdfSF9MT0NLLCBIV19NQVgKK30gQ0dFTl9IV19UWVBFOworCisjZGVmaW5lIE1BWF9IVyAoKGludCkgSFdfTUFYKQorCisvKiBPcGVyYW5kIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9vcGVyYW5kIGF0dHJzLiAgKi8KK3R5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfYXR0ciB7CisgIENHRU5fT1BFUkFORF9WSVJUVUFMLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiwgQ0dFTl9PUEVSQU5EX0FCU19BRERSLCBDR0VOX09QRVJBTkRfU0lHTl9PUFQKKyAsIENHRU5fT1BFUkFORF9TSUdORUQsIENHRU5fT1BFUkFORF9ORUdBVElWRSwgQ0dFTl9PUEVSQU5EX1JFTEFYLCBDR0VOX09QRVJBTkRfU0VNX09OTFkKKyAsIENHRU5fT1BFUkFORF9SRUxPQywgQ0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYLCBDR0VOX09QRVJBTkRfRU5EX0JPT0xTLCBDR0VOX09QRVJBTkRfU1RBUlRfTkJPT0xTID0gMzEKKyAsIENHRU5fT1BFUkFORF9NQUNILCBDR0VOX09QRVJBTkRfRU5EX05CT09MUworfSBDR0VOX09QRVJBTkRfQVRUUjsKKworLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5fb3BlcmFuZF9hdHRyLiAgKi8KKyNkZWZpbmUgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTIChDR0VOX09QRVJBTkRfRU5EX05CT09MUyAtIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgLSAxKQorCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIG9wZXJhbmQgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIHsKKyAgTTMyUl9PUEVSQU5EX1BDLCBNMzJSX09QRVJBTkRfU1IsIE0zMlJfT1BFUkFORF9EUiwgTTMyUl9PUEVSQU5EX1NSQzEKKyAsIE0zMlJfT1BFUkFORF9TUkMyLCBNMzJSX09QRVJBTkRfU0NSLCBNMzJSX09QRVJBTkRfRENSLCBNMzJSX09QRVJBTkRfU0lNTTgKKyAsIE0zMlJfT1BFUkFORF9TSU1NMTYsIE0zMlJfT1BFUkFORF9VSU1NNCwgTTMyUl9PUEVSQU5EX1VJTU01LCBNMzJSX09QRVJBTkRfVUlNTTE2CisgLCBNMzJSX09QRVJBTkRfSEFTSCwgTTMyUl9PUEVSQU5EX0hJMTYsIE0zMlJfT1BFUkFORF9TTE8xNiwgTTMyUl9PUEVSQU5EX1VMTzE2CisgLCBNMzJSX09QRVJBTkRfVUlNTTI0LCBNMzJSX09QRVJBTkRfRElTUDgsIE0zMlJfT1BFUkFORF9ESVNQMTYsIE0zMlJfT1BFUkFORF9ESVNQMjQKKyAsIE0zMlJfT1BFUkFORF9DT05EQklULCBNMzJSX09QRVJBTkRfQUNDVU0sIE0zMlJfT1BFUkFORF9NQVgKK30gQ0dFTl9PUEVSQU5EX1RZUEU7CisKKy8qIE51bWJlciBvZiBvcGVyYW5kcyB0eXBlcy4gICovCisjZGVmaW5lIE1BWF9PUEVSQU5EUyAoKGludCkgTTMyUl9PUEVSQU5EX01BWCkKKworLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVmZXJlbmNlZCBieSBhbnkgaW5zbi4gICovCisjZGVmaW5lIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyAxMQorCisvKiBJbnNuIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pbnNuIGF0dHJzLiAgKi8KK3R5cGVkZWYgZW51bSBjZ2VuX2luc25fYXR0ciB7CisgIENHRU5fSU5TTl9BTElBUywgQ0dFTl9JTlNOX1ZJUlRVQUwsIENHRU5fSU5TTl9VTkNPTkRfQ1RJLCBDR0VOX0lOU05fQ09ORF9DVEkKKyAsIENHRU5fSU5TTl9TS0lQX0NUSSwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9SRUxBWEFCTEUsIENHRU5fSU5TTl9SRUxBWAorICwgQ0dFTl9JTlNOX05PX0RJUywgQ0dFTl9JTlNOX1BCQiwgQ0dFTl9JTlNOX0ZJTExfU0xPVCwgQ0dFTl9JTlNOX1NQRUNJQUwKKyAsIENHRU5fSU5TTl9FTkRfQk9PTFMsIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9JTlNOX01BQ0gsIENHRU5fSU5TTl9QSVBFCisgLCBDR0VOX0lOU05fRU5EX05CT09MUworfSBDR0VOX0lOU05fQVRUUjsKKworLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faW5zbl9hdHRyLiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIChDR0VOX0lOU05fRU5EX05CT09MUyAtIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgLSAxKQorCisvKiBjZ2VuLmggdXNlcyB0aGluZ3Mgd2UganVzdCBkZWZpbmVkLiAgKi8KKyNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgorCisvKiBBdHRyaWJ1dGVzLiAgKi8KK2V4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXTsKK2V4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2lmaWVsZF9hdHRyX3RhYmxlW107CitleHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXTsKK2V4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2luc25fYXR0cl90YWJsZVtdOworCisvKiBIYXJkd2FyZSBkZWNscy4gICovCisKK2V4dGVybiBDR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzOworZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfY3JfbmFtZXM7CisKKworCisKKyNlbmRpZiAvKiBNMzJSX0NQVV9IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItZGlzLmMgYi9vcGNvZGVzL20zMnItZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNTkxYQotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTMyci1kaXMuYwpAQCAtMCwwICsxLDU1NyBAQAorLyogRGlzYXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KKyAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKy0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWRpcy5pbiBpc24ndAorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCisgICBLZWVwIHRoYXQgaW4gbWluZC4gICovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgIm0zMnItZGVzYy5oIgorI2luY2x1ZGUgIm0zMnItb3BjLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKy8qIERlZmF1bHQgdGV4dCB0byBwcmludCBpZiBhbiBpbnN0cnVjdGlvbiBpc24ndCByZWNvZ25pemVkLiAgKi8KKyNkZWZpbmUgVU5LTk9XTl9JTlNOX01TRyBfKCIqdW5rbm93bioiKQorCitzdGF0aWMgdm9pZCBwcmludF9ub3JtYWwKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOworc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzcworICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGJmZF92bWEsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7CitzdGF0aWMgdm9pZCBwcmludF9rZXl3b3JkCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgQ0dFTl9LRVlXT1JEICosIGxvbmcsIHVuc2lnbmVkIGludCkpOworc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9ub3JtYWwKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9GSUVMRFMgKiwKKwkgICAgICBiZmRfdm1hLCBpbnQpKTsKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLAorCQkJICAgICAgIGRpc2Fzc2VtYmxlX2luZm8gKiwgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgZGVmYXVsdF9wcmludF9pbnNuCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOworDAorLyogLS0gZGlzYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KKworLyogLS0gZGlzLmMgKi8KKworLyogSW1tZWRpYXRlIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAnIycuICAqLworCisjZGVmaW5lIENHRU5fUFJJTlRfTk9STUFMKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpIFwKK2RvIHsgXAorICBpZiAoQ0dFTl9CT09MX0FUVFIgKChhdHRycyksIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCkpIFwKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsgXAorfSB3aGlsZSAoMCkKKworLyogSGFuZGxlICcjJyBwcmVmaXhlcyBhcyBvcGVyYW5kcy4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9oYXNoIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7Cit9CisKKyN1bmRlZiBDR0VOX1BSSU5UX0lOU04KKyNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIG15X3ByaW50X2luc24KKworc3RhdGljIGludAorbXlfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBiZmRfdm1hIHBjOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBjaGFyIGJ1ZmZlcltDR0VOX01BWF9JTlNOX1NJWkVdOworICBjaGFyICpidWYgPSBidWZmZXI7CisgIGludCBzdGF0dXM7CisgIGludCBidWZsZW4gPSAocGMgJiAzKSA9PSAwID8gNCA6IDI7CisKKyAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBidWZsZW4sIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiAzMiBiaXQgaW5zbj8gICovCisgIGlmICgocGMgJiAzKSA9PSAwICYmIChidWZbMF0gJiAweDgwKSAhPSAwKQorICAgIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKTsKKworICAvKiBQcmludCB0aGUgZmlyc3QgaW5zbi4gICovCisgIGlmICgocGMgJiAzKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7CisgICAgICBidWYgKz0gMjsKKyAgICB9CisKKyAgaWYgKGJ1ZlswXSAmIDB4ODApCisgICAgeworICAgICAgLyogUGFyYWxsZWwuICAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgfHwgIik7CisgICAgICBidWZbMF0gJj0gMHg3ZjsKKyAgICB9CisgIGVsc2UKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAtPiAiKTsKKworICAvKiBUaGUgIiYgMyIgaXMgdG8gcGFzcyBhIGNvbnNpc3RlbnQgYWRkcmVzcy4KKyAgICAgUGFyYWxsZWwgaW5zbnMgYXJndWFibHkgYm90aCBiZWdpbiBvbiB0aGUgd29yZCBib3VuZGFyeS4KKyAgICAgQWxzbywgYnJhbmNoIGluc25zIGFyZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSB3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgaWYgKHByaW50X2luc24gKGNkLCBwYyAmIH4gKGJmZF92bWEpIDMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7CisKKyAgcmV0dXJuIChwYyAmIDMpID8gMiA6IDQ7Cit9CisKKy8qIC0tICovCisKKy8qIE1haW4gZW50cnkgcG9pbnQgZm9yIHByaW50aW5nIG9wZXJhbmRzLgorICAgWElORk8gaXMgYSBgdm9pZCAqJyBhbmQgbm90IGEgYGRpc2Fzc2VtYmxlX2luZm8gKicgdG8gbm90IHB1dCBhIHJlcXVpcmVtZW50CisgICBvZiBkaXMtYXNtLmggb24gY2dlbi5oLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCisgICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAorICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgorICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKKyAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAorICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgorCisgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKKyAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCisgICB0aGUgaGFuZGxlcnMuCisqLworCit2b2lkCittMzJyX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHhpbmZvLCBmaWVsZHMsIGF0dHJzLCBwYywgbGVuZ3RoKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgUFRSIHhpbmZvOworICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICB2b2lkIGNvbnN0ICphdHRyczsKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgeGluZm87CisKKyAgc3dpdGNoIChvcGluZGV4KQorICAgIHsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgorICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKKyAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDE2LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKKyAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDI0LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgorICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1JFTEFYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgorICAgICAgcHJpbnRfaGFzaCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9uaWwsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdOX09QVCksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKKyAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgorICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6CisgICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgorICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMjQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9BQlNfQUREUiksIHBjLCBsZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgorICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW00LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKKyAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tNSwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6CisgICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTE2LCAwLCBwYywgbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAorCSAgICAgICBvcGluZGV4KTsKKyAgICBhYm9ydCAoKTsKKyAgfQorfQorCitjZ2VuX3ByaW50X2ZuICogY29uc3QgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKK3sKKyAgcHJpbnRfaW5zbl9ub3JtYWwsCit9OworCisKK3ZvaWQKK20zMnJfY2dlbl9pbml0X2RpcyAoY2QpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7Cit7CisgIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOworICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7CisgIGNkLT5wcmludF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOworICBjZC0+cHJpbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9wcmludF9vcGVyYW5kOworfQorCisMCisvKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKKworI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCisgIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKKyNlbmRpZgorCisgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KKyAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKKyAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKKyAgZWxzZQorICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Cit9CisKKy8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBQVFIgZGlzX2luZm87CisgICAgIGJmZF92bWEgdmFsdWU7CisgICAgIHVuc2lnbmVkIGludCBhdHRyczsKKyAgICAgYmZkX3ZtYSBwYzsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOworCisjaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCisgIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7CisjZW5kaWYKKworICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCisgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCisgICAgOyAvKiBub3RoaW5nIHRvIGRvICovCisgIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQorICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOworICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCisgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7CisgIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOworICBlbHNlCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Cit9CisKKy8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7CisgICAgIGxvbmcgdmFsdWU7CisgICAgIHVuc2lnbmVkIGludCBhdHRyczsKK3sKKyAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOworICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOworCisgIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOworICBpZiAoa2UgIT0gTlVMTCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOworICBlbHNlCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKK30KKwwKKy8qIERlZmF1bHQgaW5zbiBwcmludGVyLgorCisgICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCisgICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgUFRSIGRpc19pbmZvOworICAgICBjb25zdCBDR0VOX0lOU04gKmluc247CisgICAgIENHRU5fRklFTERTICpmaWVsZHM7CisgICAgIGJmZF92bWEgcGM7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKKyAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47CisKKyAgQ0dFTl9JTklUX1BSSU5UIChjZCk7CisKKyAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQorICAgIHsKKyAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLworICAgICAgbTMycl9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCisJCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7CisgICAgfQorfQorDAorLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgorICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KKyAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCisgICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCisgICBiZWVuIGNhbGxlZCkuICAqLworCitzdGF0aWMgaW50CitwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBiZmRfdm1hIHBjOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBjaGFyICpidWY7CisgICAgIGludCBidWZsZW47Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKKyAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKKyAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKKworICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKKyAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOworICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7CisKKyAgc3dpdGNoIChidWZsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIGluc25fdmFsdWUgPSBidWZbMF07CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgorICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCisKKyAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOworICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOworICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOworICAgICAgaW50IGxlbmd0aDsKKworI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCisgICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKKwljb250aW51ZTsKKyNlbmRpZgorCisgICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLworICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0CisJIGhhbmRsZXIuICAqLworICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCisJICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCisJeworCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQorCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cworCSAgICAgdGhlbS4gICovCisKKwkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCisJICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKKwkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KKwkgIGlmIChsZW5ndGggPCAwKQorCSAgICByZXR1cm4gbGVuZ3RoOworCSAgaWYgKGxlbmd0aCA+IDApCisJICAgIHsKKwkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKKwkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCisJICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7CisJICAgIH0KKwl9CisKKyAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KKyAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCisgICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KKworI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KKyNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2RlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBiZmRfdm1hIHBjOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOworICBpbnQgc3RhdHVzOworCisgIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Cit9CisKKy8qIE1haW4gZW50cnkgcG9pbnQuCisgICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCisgICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLworCitpbnQKK3ByaW50X2luc25fbTMyciAocGMsIGluZm8pCisgICAgIGJmZF92bWEgcGM7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKKyAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKKyAgaW50IGxlbmd0aDsKKyAgaW50IGlzYSxtYWNoOworICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRworCQk/IENHRU5fRU5ESUFOX0JJRworCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7CisgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworCisgIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KKyNpZm5kZWYgQ0dFTl9CRkRfQVJDSAorI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX20zMnIKKyNlbmRpZgorICBhcmNoID0gaW5mby0+YXJjaDsKKyAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKKyAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKKyAgICAgIAorICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCisgICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLworI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKKyAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7CisjZWxzZQorICBpc2EgPSAwOworI2VuZGlmCisKKyAgbWFjaCA9IGluZm8tPm1hY2g7CisKKyAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCisgIGlmIChjZAorICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQorCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKKwkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCisgICAgeworICAgICAgbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpOworICAgICAgY2QgPSAwOworICAgIH0KKworICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KKyAgaWYgKCEgY2QpCisgICAgeworICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOworICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOworCisgICAgICBpZiAoIWFyY2hfdHlwZSkKKwlhYm9ydCAoKTsKKyAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7CisKKyAgICAgIHByZXZfaXNhID0gaXNhOworICAgICAgcHJldl9tYWNoID0gbWFjaDsKKyAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOworICAgICAgY2QgPSBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCisJCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAorCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCisJCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKKyAgICAgIGlmICghY2QpCisJYWJvcnQgKCk7CisgICAgICBtMzJyX2NnZW5faW5pdF9kaXMgKGNkKTsKKyAgICB9CisKKyAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KKyAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KKyAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCisgICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgorICAgICBoYXZlIHR3byBob29rcy4gICovCisgIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKKyAgaWYgKGxlbmd0aCA+IDApCisgICAgcmV0dXJuIGxlbmd0aDsKKyAgaWYgKGxlbmd0aCA8IDApCisgICAgcmV0dXJuIC0xOworCisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKKyAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItaWJsZC5jIGIvb3Bjb2Rlcy9tMzJyLWlibGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE1ZDdlCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tMzJyLWlibGQuYwpAQCAtMCwwICsxLDExMjAgQEAKKy8qIEluc3RydWN0aW9uIGJ1aWxkaW5nL2V4dHJhY3Rpb24gc3VwcG9ydCBmb3IgbTMyci4gLSotIEMgLSotCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCistIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1pYmxkLmluIGlzbid0CisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KKyAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJtMzJyLWRlc2MuaCIKKyNpbmNsdWRlICJtMzJyLW9wYy5oIgorI2luY2x1ZGUgIm9waW50bC5oIgorCisjdW5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjdW5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisKKy8qIFVzZWQgYnkgdGhlIGlmaWVsZCBydHggZnVuY3Rpb24uICAqLworI2RlZmluZSBGTEQoZikgKGZpZWxkcy0+ZikKKworc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfbm9ybWFsCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGxvbmcsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgQ0dFTl9JTlNOX0JZVEVTX1BUUikpOworc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfaW5zbl9ub3JtYWwKKyAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosCisJICAgICAgQ0dFTl9GSUVMRFMgKiwgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgYmZkX3ZtYSkpOworCitzdGF0aWMgaW50IGV4dHJhY3Rfbm9ybWFsCisgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIENHRU5fRVhUUkFDVF9JTkZPICosIENHRU5fSU5TTl9JTlQsCisJICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBsb25nICopKTsKK3N0YXRpYyBpbnQgZXh0cmFjdF9pbnNuX25vcm1hbAorICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9FWFRSQUNUX0lORk8gKiwKKwkgICAgICBDR0VOX0lOU05fSU5ULCBDR0VOX0ZJRUxEUyAqLCBiZmRfdm1hKSk7CisMCisvKiBPcGVyYW5kIGluc2VydGlvbi4gICovCisKKyNpZiAhIENHRU5fSU5UX0lOU05fUAorCisvKiBTdWJyb3V0aW5lIG9mIGluc2VydF9ub3JtYWwuICAqLworCitzdGF0aWMgQ0dFTl9JTkxJTkUgdm9pZAoraW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Cit7CisgIHVuc2lnbmVkIGxvbmcgeCxtYXNrOworICBpbnQgc2hpZnQ7CisgIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOworCisgIHN3aXRjaCAod29yZF9sZW5ndGgpCisgICAgeworICAgIGNhc2UgODoKKyAgICAgIHggPSAqYnVmcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBpZiAoYmlnX3ApCisJeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOworICAgICAgZWxzZQorCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKKwkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KKyAgICAgIGlmIChiaWdfcCkKKwl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOworICAgICAgZWxzZQorCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBpZiAoYmlnX3ApCisJeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOworICAgICAgZWxzZQorCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCisgIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOworICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKKyAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOworICBlbHNlCisgICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKKyAgeCA9ICh4ICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOworCisgIHN3aXRjaCAod29yZF9sZW5ndGgpCisgICAgeworICAgIGNhc2UgODoKKyAgICAgICpidWZwID0geDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBpZiAoYmlnX3ApCisJYmZkX3B1dGIxNiAoeCwgYnVmcCk7CisgICAgICBlbHNlCisJYmZkX3B1dGwxNiAoeCwgYnVmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5CisJIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCisgICAgICBpZiAoYmlnX3ApCisJeworCSAgYnVmcFswXSA9IHggPj4gMTY7CisJICBiZmRfcHV0YjE2ICh4LCBidWZwICsgMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJmZF9wdXRsMTYgKHgsIGJ1ZnApOworCSAgYnVmcFsyXSA9IHggPj4gMTY7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgIGlmIChiaWdfcCkKKwliZmRfcHV0YjMyICh4LCBidWZwKTsKKyAgICAgIGVsc2UKKwliZmRfcHV0bDMyICh4LCBidWZwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisjZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KKworLyogRGVmYXVsdCBpbnNlcnRpb24gcm91dGluZS4KKworICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuCisgICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgorICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgorICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCisgICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgorICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KKworICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCisKKy8qID8/PyBUaGlzIGR1cGxpY2F0ZXMgZnVuY3Rpb25hbGl0eSB3aXRoIGJmZCdzIGhvd3RvIHRhYmxlIGFuZAorICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCisvKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCisgICBuZWNlc3NhcnkuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsCisJICAgICAgIHRvdGFsX2xlbmd0aCwgYnVmZmVyKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBsb25nIHZhbHVlOworICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7CisgICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKKyAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Cit7CisgIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOworICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLworICB1bnNpZ25lZCBsb25nIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOworCisgIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZS4gICovCisgIGlmIChsZW5ndGggPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoQ0dFTl9JTlRfSU5TTl9QCisgICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQorICAgIGFib3J0ICgpOworCisgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQorICAgIGFib3J0ICgpOworCisgIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBiYXNlLWluc24tYml0c2l6ZSwKKyAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLworICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCisgICAgeworICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKKwkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQorCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOworICAgIH0KKworICAvKiBFbnN1cmUgVkFMVUUgd2lsbCBmaXQuICAqLworICBpZiAoISBDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbWF4dmFsID0gbWFzazsKKyAgICAgIGlmICgodW5zaWduZWQgbG9uZykgdmFsdWUgPiBtYXh2YWwpCisJeworCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgIHNwcmludGYgKGVycmJ1ZiwKKwkJICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAwIGFuZCAlbHUpIiksCisJCSAgIHZhbHVlLCBtYXh2YWwpOworCSAgcmV0dXJuIGVycmJ1ZjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbG9uZyBtaW52YWwgPSAtICgxTCA8PCAobGVuZ3RoIC0gMSkpOworICAgICAgbG9uZyBtYXh2YWwgPSAoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDE7CisgICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCisJeworCSAgc3ByaW50ZgorCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICAoZXJyYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpLAorCSAgICAgdmFsdWUsIG1pbnZhbCwgbWF4dmFsKTsKKwkgIHJldHVybiBlcnJidWY7CisJfQorICAgIH0KKworI2lmIENHRU5fSU5UX0lOU05fUAorCisgIHsKKyAgICBpbnQgc2hpZnQ7CisKKyAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKKyAgICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7CisgICAgZWxzZQorICAgICAgc2hpZnQgPSB3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCk7CisgICAgKmJ1ZmZlciA9ICgqYnVmZmVyICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOworICB9CisKKyNlbHNlIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCisKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXIgKyB3b3JkX29mZnNldCAvIDg7CisKKyAgICBpbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCk7CisgIH0KKworI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIERlZmF1bHQgaW5zbiBidWlsZGVyIChpbnNlcnQgaGFuZGxlcikuCisgICBUaGUgaW5zdHJ1Y3Rpb24gaXMgcmVjb3JkZWQgaW4gQ0dFTl9JTlRfSU5TTl9QIGJ5dGUgb3JkZXIKKyAgIChtZWFuaW5nIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIEJVRkZFUiBpcyBhbiBpbnQgKiBhbmQgdGh1cyB0aGUgdmFsdWUgaXMKKyAgIHJlY29yZGVkIGluIGhvc3QgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRkZFUiBpcyBhbiBhcnJheSBvZiBieXRlcyBhbmQgdGhlCisgICB2YWx1ZSBpcyByZWNvcmRlZCBpbiB0YXJnZXQgYnl0ZSBvcmRlcikuCisgICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraW5zZXJ0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZmllbGRzLCBidWZmZXIsIHBjKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuOworICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKKyAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7CisgICAgIGJmZF92bWEgcGM7Cit7CisgIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKKworICBDR0VOX0lOSVRfSU5TRVJUIChjZCk7CisgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOworCisgIC8qIElmIHdlJ3JlIHJlY29yZGluZyBpbnNucyBhcyBudW1iZXJzIChyYXRoZXIgdGhhbiBhIHN0cmluZyBvZiBieXRlcyksCisgICAgIHRhcmdldCBieXRlIG9yZGVyIGhhbmRsaW5nIGlzIGRlZmVycmVkIHVudGlsIGxhdGVyLiAgKi8KKworI2lmIENHRU5fSU5UX0lOU05fUAorCisgICpidWZmZXIgPSB2YWx1ZTsKKworI2Vsc2UKKworICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmZmVyLCBtaW4gKGNkLT5iYXNlX2luc25fYml0c2l6ZSwKKwkJCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSksCisJCSAgICAgICB2YWx1ZSk7CisKKyNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLworCisgIC8qID8/PyBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gc2NhbiB0aGUgZm9ybWF0J3MgZmllbGRzLgorICAgICBTdGlsbCBuZWVkIHRvIGJlIGFibGUgdG8gaW5zZXJ0IGEgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgdGhvdWdoOworICAgICBlLmcuIHN0b3JpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IHRoYXQgZ290IHJlc29sdmVkIGxhdGVyLgorICAgICBOZWVkcyBtb3JlIHRob3VnaHQgZmlyc3QuICAqLworCisgIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqIHN5biAhPSAnXDAnOyArKyBzeW4pCisgICAgeworICAgICAgY29uc3QgY2hhciAqZXJybXNnOworCisgICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCisJY29udGludWU7CisKKyAgICAgIGVycm1zZyA9ICgqIGNkLT5pbnNlcnRfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCisJCQkJICAgICAgIGZpZWxkcywgYnVmZmVyLCBwYyk7CisgICAgICBpZiAoZXJybXNnKQorCXJldHVybiBlcnJtc2c7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorDAorLyogT3BlcmFuZCBleHRyYWN0aW9uLiAgKi8KKworI2lmICEgQ0dFTl9JTlRfSU5TTl9QCisKKy8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuCisgICBFbnN1cmUgc3VmZmljaWVudCBieXRlcyBhcmUgY2FjaGVkIGluIEVYX0lORk8uCisgICBPRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCisgICBCWVRFUyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBuZWVkZWQgdmFsdWUuCisgICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLworCitzdGF0aWMgQ0dFTl9JTkxJTkUgaW50CitmaWxsX2NhY2hlIChjZCwgZXhfaW5mbywgb2Zmc2V0LCBieXRlcywgcGMpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOworICAgICBpbnQgb2Zmc2V0LCBieXRlczsKKyAgICAgYmZkX3ZtYSBwYzsKK3sKKyAgLyogSXQncyBkb3VidGZ1bCB0aGF0IHRoZSBtaWRkbGUgcGFydCBoYXMgYWxyZWFkeSBiZWVuIGZldGNoZWQgc28KKyAgICAgd2UgZG9uJ3Qgb3B0aW1pemUgdGhhdCBjYXNlLiAga2lzcy4gICovCisgIGludCBtYXNrOworICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZXhfaW5mby0+ZGlzX2luZm87CisKKyAgLyogRmlyc3QgZG8gYSBxdWljayBjaGVjay4gICovCisgIG1hc2sgPSAoMSA8PCBieXRlcykgLSAxOworICBpZiAoKChleF9pbmZvLT52YWxpZCA+PiBvZmZzZXQpICYgbWFzaykgPT0gbWFzaykKKyAgICByZXR1cm4gMTsKKworICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBieXRlIHdlIG5lZWQgdG8gcmVhZC4gICovCisgIGZvciAobWFzayA9IDEgPDwgb2Zmc2V0OyBieXRlcyA+IDA7IC0tYnl0ZXMsICsrb2Zmc2V0LCBtYXNrIDw8PSAxKQorICAgIGlmICghIChtYXNrICYgZXhfaW5mby0+dmFsaWQpKQorICAgICAgYnJlYWs7CisKKyAgaWYgKGJ5dGVzKQorICAgIHsKKyAgICAgIGludCBzdGF0dXM7CisKKyAgICAgIHBjICs9IG9mZnNldDsKKyAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKKwkocGMsIGV4X2luZm8tPmluc25fYnl0ZXMgKyBvZmZzZXQsIGJ5dGVzLCBpbmZvKTsKKworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgZXhfaW5mby0+dmFsaWQgfD0gKCgxIDw8IGJ5dGVzKSAtIDEpIDw8IG9mZnNldDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuICAqLworCitzdGF0aWMgQ0dFTl9JTkxJTkUgbG9uZworZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKKyAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKKyAgICAgYmZkX3ZtYSBwYzsKK3sKKyAgdW5zaWduZWQgbG9uZyB4LG1hc2s7CisgIGludCBzaGlmdDsKKyAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7CisKKyAgc3dpdGNoICh3b3JkX2xlbmd0aCkKKyAgICB7CisgICAgY2FzZSA4OgorICAgICAgeCA9ICpidWZwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIGlmIChiaWdfcCkKKwl4ID0gYmZkX2dldGIxNiAoYnVmcCk7CisgICAgICBlbHNlCisJeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQorCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLworICAgICAgaWYgKGJpZ19wKQorCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7CisgICAgICBlbHNlCisJeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgIGlmIChiaWdfcCkKKwl4ID0gYmZkX2dldGIzMiAoYnVmcCk7CisgICAgICBlbHNlCisJeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KKyAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7CisgIGlmIChDR0VOX0lOU05fTFNCMF9QKQorICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7CisgIGVsc2UKKyAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOworICByZXR1cm4gKHggPj4gc2hpZnQpICYgbWFzazsKK30KKworI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCisKKy8qIERlZmF1bHQgZXh0cmFjdGlvbiByb3V0aW5lLgorCisgICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIG9mIHRoZSBpbnNuIGluIGhvc3Qgb3JkZXIsCisgICBvciBzb21ldGltZXMgbGVzcyBmb3IgY2FzZXMgbGlrZSB0aGUgbTMyciB3aGVyZSB0aGUgYmFzZSBpbnNuIHNpemUgaXMgMzIKKyAgIGJ1dCBzb21lIGluc25zIGFyZSAxNiBiaXRzLgorICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuICBXZSBvbmx5IG5lZWQgYFNJR05FRCcsCisgICBidXQgZm9yIGdlbmVyYWxpdHkgd2UgdGFrZSBhIGJpdG1hc2sgb2YgYWxsIG9mIHRoZW0uCisgICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgorICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgorICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCisgICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgorICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KKworICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KKworLyogPz8/IFRoZSByZXR1cm4gY29kZSBpc24ndCBwcm9wZXJseSB1c2VkLiAgd2lwLiAgKi8KKworLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgorICAgbmVjZXNzYXJ5LiAgKi8KKworc3RhdGljIGludAorZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsCisJCXdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGgsIHBjLCB2YWx1ZXApCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOworICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7CisgICAgIHVuc2lnbmVkIGludCBhdHRyczsKKyAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOworICAgICBiZmRfdm1hIHBjOworICAgICBsb25nICp2YWx1ZXA7Cit7CisgIENHRU5fSU5TTl9JTlQgdmFsdWU7CisKKyAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlCisgICAgIHNvIGdpdmUgaXQgYSBzdGFuZGFyZCB2YWx1ZSBvZiB6ZXJvLiAgKi8KKyAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICp2YWx1ZXAgPSAwOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmIChDR0VOX0lOVF9JTlNOX1AKKyAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCisgICAgYWJvcnQgKCk7CisKKyAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGluc24tYmFzZS1iaXRzaXplLAorICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCisgIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKKyAgICB7CisgICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAorCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCisJd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7CisgICAgfQorCisgIC8qIERvZXMgdGhlIHZhbHVlIHJlc2lkZSBpbiBJTlNOX1ZBTFVFPyAgKi8KKworICBpZiAod29yZF9vZmZzZXQgPT0gMCkKKyAgICB7CisgICAgICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLworICAgICAgQ0dFTl9JTlNOX0lOVCBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKKworICAgICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCisJdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICgoc3RhcnQgKyAxKSAtIGxlbmd0aCk7CisgICAgICBlbHNlCisJdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOworICAgICAgdmFsdWUgJj0gbWFzazsKKyAgICAgIC8qIHNpZ24gZXh0ZW5kPyAqLworICAgICAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkKKwkgICYmICh2YWx1ZSAmICgxTCA8PCAobGVuZ3RoIC0gMSkpKSkKKwl2YWx1ZSB8PSB+bWFzazsKKyAgICB9CisKKyNpZiAhIENHRU5fSU5UX0lOU05fUAorCisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gZXhfaW5mby0+aW5zbl9ieXRlcyArIHdvcmRfb2Zmc2V0IC8gODsKKworICAgICAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCisJYWJvcnQgKCk7CisKKyAgICAgIGlmIChmaWxsX2NhY2hlIChjZCwgZXhfaW5mbywgd29yZF9vZmZzZXQgLyA4LCB3b3JkX2xlbmd0aCAvIDgsIHBjKSA9PSAwKQorCXJldHVybiAwOworCisgICAgICB2YWx1ZSA9IGV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYyk7CisgICAgfQorCisjZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KKworICAqdmFsdWVwID0gdmFsdWU7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIERlZmF1bHQgaW5zbiBleHRyYWN0b3IuCisKKyAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMsIHRyYW5zbGF0ZWQgdG8gaG9zdCBvcmRlci4KKyAgIFRoZSBleHRyYWN0ZWQgZmllbGRzIGFyZSBzdG9yZWQgaW4gRklFTERTLgorICAgRVhfSU5GTyBpcyB1c2VkIHRvIGhhbmRsZSByZWFkaW5nIHZhcmlhYmxlIGxlbmd0aCBpbnNucy4KKyAgIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMsIG9yIDAgaWYgbm8gbWF0Y2gsCisgICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCisgICBiZWVuIGNhbGxlZCkuICAqLworCitzdGF0aWMgaW50CitleHRyYWN0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKKyAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOworICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICBiZmRfdm1hIHBjOworeworICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKKworICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOworCisgIENHRU5fSU5JVF9FWFRSQUNUIChjZCk7CisKKyAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQorICAgIHsKKyAgICAgIGludCBsZW5ndGg7CisKKyAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQorCWNvbnRpbnVlOworCisgICAgICBsZW5ndGggPSAoKiBjZC0+ZXh0cmFjdF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKKwkJCQkJZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYyk7CisgICAgICBpZiAobGVuZ3RoIDw9IDApCisJcmV0dXJuIGxlbmd0aDsKKyAgICB9CisKKyAgLyogV2UgcmVjb2duaXplZCBhbmQgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCB0aGlzIGluc24uICAqLworICByZXR1cm4gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOworfQorDAorLyogbWFjaGluZSBnZW5lcmF0ZWQgY29kZSBhZGRlZCBoZXJlICovCisKKy8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgaW5zZXJ0aW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCisgICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAorICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgorICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKKyAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAorICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgorCisgICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKKyAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCisgICB0aGUgaGFuZGxlcnMuICBJdCdzIGFsc28gbmVlZGVkIGJ5IEdBUyB0byBpbnNlcnQgb3BlcmFuZHMgdGhhdCBjb3VsZG4ndCBiZQorICAgcmVzb2x2ZWQgZHVyaW5nIHBhcnNpbmcuCisqLworCitjb25zdCBjaGFyICoKK20zMnJfY2dlbl9pbnNlcnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgYnVmZmVyLCBwYykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIENHRU5fRklFTERTICogZmllbGRzOworICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKKyAgICAgYmZkX3ZtYSBwYzsKK3sKKyAgY29uc3QgY2hhciAqIGVycm1zZzsKKyAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7CisKKyAgc3dpdGNoIChvcGluZGV4KQorICAgIHsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OworICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAocGMpKSkgPj4gKDIpKTsKKyAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgorICAgICAgeworICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKKyAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKHBjKSkpID4+ICgyKSk7CisgICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7CisgICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtICgoKHBjKSAmICgtNCkpKSkpID4+ICgyKSk7CisgICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaGkxNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tOCwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjIsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTI0LCAwfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfQUJTX0FERFIpLCAwLCA4LCAyNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKKyAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTQsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgorICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tNSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6CisgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0xNiwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIiksCisJICAgICAgIG9waW5kZXgpOworICAgICAgYWJvcnQgKCk7CisgIH0KKworICByZXR1cm4gZXJybXNnOworfQorCisvKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGV4dHJhY3Rpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKKyAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0CisgICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCisgICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAorICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCisgICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcHJpbnRfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAorICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwcmludF9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKKyAgIHRoZSBoYW5kbGVycy4KKyovCisKK2ludAorbTMycl9jZ2VuX2V4dHJhY3Rfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGludCBvcGluZGV4OworICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKKyAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOworICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKKyAgICAgYmZkX3ZtYSBwYzsKK3sKKyAgaW50IGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7CisKKyAgc3dpdGNoIChvcGluZGV4KQorICAgIHsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKKyAgICAgIHsKKyAgICAgICAgbG9uZyB2YWx1ZTsKKyAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKHBjKSk7CisgICAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6CisgICAgICB7CisgICAgICAgIGxvbmcgdmFsdWU7CisgICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSAoKCgodmFsdWUpIDw8ICgyKSkpICsgKHBjKSk7CisgICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKKyAgICAgIHsKKyAgICAgICAgbG9uZyB2YWx1ZTsKKyAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArICgoKHBjKSAmICgtNCkpKSk7CisgICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05fT1BUKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfaGkxNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW04KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3NpbW0xNik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX0FCU19BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMjQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgorICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW00KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKKyAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTEsIDUsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6CisgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3VpbW0xNik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iKSwKKwkgICAgICAgb3BpbmRleCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworY2dlbl9pbnNlcnRfZm4gKiBjb25zdCBtMzJyX2NnZW5faW5zZXJ0X2hhbmRsZXJzW10gPSAKK3sKKyAgaW5zZXJ0X2luc25fbm9ybWFsLAorfTsKKworY2dlbl9leHRyYWN0X2ZuICogY29uc3QgbTMycl9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbXSA9IAoreworICBleHRyYWN0X2luc25fbm9ybWFsLAorfTsKKworLyogR2V0dGluZyB2YWx1ZXMgZnJvbSBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCisgICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IHJldHVybi4KKyAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgcmVzdWx0IHR5cGUKKyAgIG5vdCBhcHByb3ByaWF0ZS4gICovCisKK2ludAorbTMycl9jZ2VuX2dldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcykKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIGNvbnN0IENHRU5fRklFTERTICogZmllbGRzOworeworICBpbnQgdmFsdWU7CisKKyAgc3dpdGNoIChvcGluZGV4KQorICAgIHsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaGkxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0yNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW00OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKKwkJICAgICAgIG9waW5kZXgpOworICAgICAgYWJvcnQgKCk7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKK2JmZF92bWEKK20zMnJfY2dlbl9nZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7CisgICAgIGludCBvcGluZGV4OworICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKK3sKKyAgYmZkX3ZtYSB2YWx1ZTsKKworICBzd2l0Y2ggKG9waW5kZXgpCisgICAgeworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDI0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9oaTE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW04OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTI0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgorICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6CisgICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKKyAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAorCQkgICAgICAgb3BpbmRleCk7CisgICAgICBhYm9ydCAoKTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworLyogU3R1ZmZpbmcgdmFsdWVzIGluIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KKyAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgYWNjZXB0LgorICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSBhcmd1bWVudCB0eXBlCisgICBub3QgYXBwcm9wcmlhdGUuICAqLworCit2b2lkCittMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKKyAgICAgaW50IG9waW5kZXg7CisgICAgIENHRU5fRklFTERTICogZmllbGRzOworICAgICBpbnQgdmFsdWU7Cit7CisgIHN3aXRjaCAob3BpbmRleCkKKyAgICB7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKKyAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKKyAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6CisgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6CisgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKKyAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6CisgICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKKyAgICAgIGZpZWxkcy0+Zl9oaTE2ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgorICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgorICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgorICAgICAgZmllbGRzLT5mX3NpbW04ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6CisgICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6CisgICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgorICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKKyAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKKyAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6CisgICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6CisgICAgICBmaWVsZHMtPmZfdWltbTQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKKyAgICAgIGZpZWxkcy0+Zl91aW1tNSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgorICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCisJCSAgICAgICBvcGluZGV4KTsKKyAgICAgIGFib3J0ICgpOworICB9Cit9CisKK3ZvaWQKK20zMnJfY2dlbl9zZXRfdm1hX29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHZhbHVlKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworICAgICBpbnQgb3BpbmRleDsKKyAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7CisgICAgIGJmZF92bWEgdmFsdWU7Cit7CisgIHN3aXRjaCAob3BpbmRleCkKKyAgICB7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKKyAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKKyAgICAgIGZpZWxkcy0+Zl9kaXNwMTYgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6CisgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6CisgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKKyAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6CisgICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKKyAgICAgIGZpZWxkcy0+Zl9oaTE2ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgorICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgorICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgorICAgICAgZmllbGRzLT5mX3NpbW04ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6CisgICAgICBmaWVsZHMtPmZfc2ltbTE2ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6CisgICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgorICAgICAgZmllbGRzLT5mX3IxID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKKyAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKKyAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6CisgICAgICBmaWVsZHMtPmZfdWltbTI0ID0gdmFsdWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6CisgICAgICBmaWVsZHMtPmZfdWltbTQgPSB2YWx1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKKyAgICAgIGZpZWxkcy0+Zl91aW1tNSA9IHZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgorICAgICAgZmllbGRzLT5mX3VpbW0xNiA9IHZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIiksCisJCSAgICAgICBvcGluZGV4KTsKKyAgICAgIGFib3J0ICgpOworICB9Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBpbnN0cnVjdGlvbiBidWlsZGVyIHRhYmxlcy4gICovCisKK3ZvaWQKK20zMnJfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBjZC0+aW5zZXJ0X2hhbmRsZXJzID0gJiBtMzJyX2NnZW5faW5zZXJ0X2hhbmRsZXJzWzBdOworICBjZC0+ZXh0cmFjdF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX2V4dHJhY3RfaGFuZGxlcnNbMF07CisKKyAgY2QtPmluc2VydF9vcGVyYW5kID0gbTMycl9jZ2VuX2luc2VydF9vcGVyYW5kOworICBjZC0+ZXh0cmFjdF9vcGVyYW5kID0gbTMycl9jZ2VuX2V4dHJhY3Rfb3BlcmFuZDsKKworICBjZC0+Z2V0X2ludF9vcGVyYW5kID0gbTMycl9jZ2VuX2dldF9pbnRfb3BlcmFuZDsKKyAgY2QtPnNldF9pbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9zZXRfaW50X29wZXJhbmQ7CisgIGNkLT5nZXRfdm1hX29wZXJhbmQgPSBtMzJyX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kOworICBjZC0+c2V0X3ZtYV9vcGVyYW5kID0gbTMycl9jZ2VuX3NldF92bWFfb3BlcmFuZDsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGMuYyBiL29wY29kZXMvbTMyci1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2VkZjlhCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tMzJyLW9wYy5jCkBAIC0wLDAgKzEsMTMzMSBAQAorLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlIGZvciBtMzJyLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJtMzJyLWRlc2MuaCIKKyNpbmNsdWRlICJtMzJyLW9wYy5oIgorCisvKiBUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIHJlY29yZGVkIGhlcmUgdG8gaGVscCBrZWVwIGFzc2VtYmxlciBjb2RlIG91dCBvZgorICAgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdmljZSB2ZXJzYS4gICovCisKK3N0YXRpYyBpbnQgYXNtX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGFzbV9oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IGRpc19oYXNoX2luc25fcCBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOworc3RhdGljIHVuc2lnbmVkIGludCBkaXNfaGFzaF9pbnNuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgQ0dFTl9JTlNOX0lOVCkpOworCisvKiBJbnN0cnVjdGlvbiBmb3JtYXRzLiAgKi8KKworI2RlZmluZSBGKGYpICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoTTMyUl8sZildCisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9lbXB0eSA9IHsKKyAgMCwgMCwgMHgwLCB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZCA9IHsKKyAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkMyA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYW5kMyA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfVUlNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfb3IzID0geworICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRpID0geworICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NJTU04KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkdjMgPSB7CisgIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjOCA9IHsKKyAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjMjQgPSB7CisgIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JlcSA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfRElTUDE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmVxeiA9IHsKKyAgMzIsIDMyLCAweGZmZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfRElTUDE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY21wID0geworICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXBpID0geworICAzMiwgMzIsIDB4ZmZmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYgPSB7CisgIDMyLCAzMiwgMHhmMGYwZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2psID0geworICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZDI0ID0geworICAzMiwgMzIsIDB4ZjAwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9VSU1NMjQpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkxNiA9IHsKKyAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYWNoaSA9IHsKKyAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZmYyA9IHsKKyAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YWNoaSA9IHsKKyAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbXZ0YyA9IHsKKyAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbm9wID0geworICAxNiwgMTYsIDB4ZmZmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zZXRoID0geworICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ISTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc2xsaSA9IHsKKyAgMTYsIDE2LCAweGYwZTAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSElGVF9PUDIpLCBGIChGX1VJTU01KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfZCA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfdHJhcCA9IHsKKyAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1VJTU00KSwgMCB9Cit9OworCisjdW5kZWYgRgorCisjZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKKyNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCisjZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCisjZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCisKKy8qIFRoZSBpbnN0cnVjdGlvbiB0YWJsZS4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBtMzJyX2NnZW5faW5zbl9vcGNvZGVfdGFibGVbTUFYX0lOU05TXSA9Cit7CisgIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KKyAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KKyAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KKyAgeyB7IDAgfSB9LAorLyogYWRkICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweGEwIH0KKyAgfSwKKy8qIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCisgICAgJiBpZm10X2FkZDMsIHsgMHg4MGEwMDAwMCB9CisgIH0sCisvKiBhbmQgJGRyLCRzciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4YzAgfQorICB9LAorLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoVUlNTTE2KSwgMCB9IH0sCisgICAgJiBpZm10X2FuZDMsIHsgMHg4MGMwMDAwMCB9CisgIH0sCisvKiBvciAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhlMCB9CisgIH0sCisvKiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFVMTzE2KSwgMCB9IH0sCisgICAgJiBpZm10X29yMywgeyAweDgwZTAwMDAwIH0KKyAgfSwKKy8qIHhvciAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHhkMCB9CisgIH0sCisvKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChVSU1NMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYW5kMywgeyAweDgwZDAwMDAwIH0KKyAgfSwKKy8qIGFkZGkgJGRyLCRzaW1tOCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweDQwMDAgfQorICB9LAorLyogYWRkdiAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg4MCB9CisgIH0sCisvKiBhZGR2MyAkZHIsJHNyLCRzaW1tMTYgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCisgICAgJiBpZm10X2FkZHYzLCB7IDB4ODA4MDAwMDAgfQorICB9LAorLyogYWRkeCAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHg5MCB9CisgIH0sCisvKiBiYy5zICRkaXNwOCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCisgICAgJiBpZm10X2JjOCwgeyAweDdjMDAgfQorICB9LAorLyogYmMubCAkZGlzcDI0ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCisgICAgJiBpZm10X2JjMjQsIHsgMHhmYzAwMDAwMCB9CisgIH0sCisvKiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCisgICAgJiBpZm10X2JlcSwgeyAweGIwMDAwMDAwIH0KKyAgfSwKKy8qIGJlcXogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmVxeiwgeyAweGIwODAwMDAwIH0KKyAgfSwKKy8qIGJnZXogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmVxeiwgeyAweGIwYjAwMDAwIH0KKyAgfSwKKy8qIGJndHogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmVxeiwgeyAweGIwZDAwMDAwIH0KKyAgfSwKKy8qIGJsZXogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmVxeiwgeyAweGIwYzAwMDAwIH0KKyAgfSwKKy8qIGJsdHogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmVxeiwgeyAweGIwYTAwMDAwIH0KKyAgfSwKKy8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmVxeiwgeyAweGIwOTAwMDAwIH0KKyAgfSwKKy8qIGJsLnMgJGRpc3A4ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmM4LCB7IDB4N2UwMCB9CisgIH0sCisvKiBibC5sICRkaXNwMjQgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmMyNCwgeyAweGZlMDAwMDAwIH0KKyAgfSwKKy8qIGJuYy5zICRkaXNwOCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCisgICAgJiBpZm10X2JjOCwgeyAweDdkMDAgfQorICB9LAorLyogYm5jLmwgJGRpc3AyNCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAorICAgICYgaWZtdF9iYzI0LCB7IDB4ZmQwMDAwMDAgfQorICB9LAorLyogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAorICAgICYgaWZtdF9iZXEsIHsgMHhiMDEwMDAwMCB9CisgIH0sCisvKiBicmEucyAkZGlzcDggKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAorICAgICYgaWZtdF9iYzgsIHsgMHg3ZjAwIH0KKyAgfSwKKy8qIGJyYS5sICRkaXNwMjQgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmMyNCwgeyAweGZmMDAwMDAwIH0KKyAgfSwKKy8qIGNtcCAkc3JjMSwkc3JjMiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCisgICAgJiBpZm10X2NtcCwgeyAweDQwIH0KKyAgfSwKKy8qIGNtcGkgJHNyYzIsJHNpbW0xNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfY21waSwgeyAweDgwNDAwMDAwIH0KKyAgfSwKKy8qIGNtcHUgJHNyYzEsJHNyYzIgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAorICAgICYgaWZtdF9jbXAsIHsgMHg1MCB9CisgIH0sCisvKiBjbXB1aSAkc3JjMiwkc2ltbTE2ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAorICAgICYgaWZtdF9jbXBpLCB7IDB4ODA1MDAwMDAgfQorICB9LAorLyogZGl2ICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdiwgeyAweDkwMDAwMDAwIH0KKyAgfSwKKy8qIGRpdnUgJGRyLCRzciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2LCB7IDB4OTAxMDAwMDAgfQorICB9LAorLyogcmVtICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2RpdiwgeyAweDkwMjAwMDAwIH0KKyAgfSwKKy8qIHJlbXUgJGRyLCRzciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfZGl2LCB7IDB4OTAzMDAwMDAgfQorICB9LAorLyogamwgJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfamwsIHsgMHgxZWMwIH0KKyAgfSwKKy8qIGptcCAkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9qbCwgeyAweDFmYzAgfQorICB9LAorLyogbGQgJGRyLEAkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MjBjMCB9CisgIH0sCisvKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9hZGQzLCB7IDB4YTBjMDAwMDAgfQorICB9LAorLyogbGRiICRkcixAJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDIwODAgfQorICB9LAorLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2FkZDMsIHsgMHhhMDgwMDAwMCB9CisgIH0sCisvKiBsZGggJGRyLEAkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MjBhMCB9CisgIH0sCisvKiBsZGggJGRyLEAoJHNsbzE2LCRzcikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkMywgeyAweGEwYTAwMDAwIH0KKyAgfSwKKy8qIGxkdWIgJGRyLEAkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MjA5MCB9CisgIH0sCisvKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2FkZDMsIHsgMHhhMDkwMDAwMCB9CisgIH0sCisvKiBsZHVoICRkcixAJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDIwYjAgfQorICB9LAorLyogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9hZGQzLCB7IDB4YTBiMDAwMDAgfQorICB9LAorLyogbGQgJGRyLEAkc3IrICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgJysnLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MjBlMCB9CisgIH0sCisvKiBsZDI0ICRkciwkdWltbTI0ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NMjQpLCAwIH0gfSwKKyAgICAmIGlmbXRfbGQyNCwgeyAweGUwMDAwMDAwIH0KKyAgfSwKKy8qIGxkaTggJGRyLCRzaW1tOCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkaSwgeyAweDYwMDAgfQorICB9LAorLyogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCisgICAgJiBpZm10X2xkaTE2LCB7IDB4OTBmMDAwMDAgfQorICB9LAorLyogbG9jayAkZHIsQCRzciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgyMGQwIH0KKyAgfSwKKy8qIG1hY2hpICRzcmMxLCRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKKyAgICAmIGlmbXRfY21wLCB7IDB4MzA0MCB9CisgIH0sCisvKiBtYWNsbyAkc3JjMSwkc3JjMiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCisgICAgJiBpZm10X2NtcCwgeyAweDMwNTAgfQorICB9LAorLyogbWFjd2hpICRzcmMxLCRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKKyAgICAmIGlmbXRfY21wLCB7IDB4MzA2MCB9CisgIH0sCisvKiBtYWN3bG8gJHNyYzEsJHNyYzIgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAorICAgICYgaWZtdF9jbXAsIHsgMHgzMDcwIH0KKyAgfSwKKy8qIG11bCAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxMDYwIH0KKyAgfSwKKy8qIG11bGhpICRzcmMxLCRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKKyAgICAmIGlmbXRfY21wLCB7IDB4MzAwMCB9CisgIH0sCisvKiBtdWxsbyAkc3JjMSwkc3JjMiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCisgICAgJiBpZm10X2NtcCwgeyAweDMwMTAgfQorICB9LAorLyogbXVsd2hpICRzcmMxLCRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKKyAgICAmIGlmbXRfY21wLCB7IDB4MzAyMCB9CisgIH0sCisvKiBtdWx3bG8gJHNyYzEsJHNyYzIgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAorICAgICYgaWZtdF9jbXAsIHsgMHgzMDMwIH0KKyAgfSwKKy8qIG12ICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDEwODAgfQorICB9LAorLyogbXZmYWNoaSAkZHIgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAorICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMCB9CisgIH0sCisvKiBtdmZhY2xvICRkciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCisgICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYxIH0KKyAgfSwKKy8qIG12ZmFjbWkgJGRyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKKyAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjIgfQorICB9LAorLyogbXZmYyAkZHIsJHNjciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0NSKSwgMCB9IH0sCisgICAgJiBpZm10X212ZmMsIHsgMHgxMDkwIH0KKyAgfSwKKy8qIG12dGFjaGkgJHNyYzEgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCisgICAgJiBpZm10X212dGFjaGksIHsgMHg1MDcwIH0KKyAgfSwKKy8qIG12dGFjbG8gJHNyYzEgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgMCB9IH0sCisgICAgJiBpZm10X212dGFjaGksIHsgMHg1MDcxIH0KKyAgfSwKKy8qIG12dGMgJHNyLCRkY3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksICcsJywgT1AgKERDUiksIDAgfSB9LAorICAgICYgaWZtdF9tdnRjLCB7IDB4MTBhMCB9CisgIH0sCisvKiBuZWcgJGRyLCRzciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MzAgfQorICB9LAorLyogbm9wICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgMCB9IH0sCisgICAgJiBpZm10X25vcCwgeyAweDcwMDAgfQorICB9LAorLyogbm90ICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweGIwIH0KKyAgfSwKKy8qIHJhYyAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sIDAgfSB9LAorICAgICYgaWZtdF9ub3AsIHsgMHg1MDkwIH0KKyAgfSwKKy8qIHJhY2ggKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAwIH0gfSwKKyAgICAmIGlmbXRfbm9wLCB7IDB4NTA4MCB9CisgIH0sCisvKiBydGUgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAwIH0gfSwKKyAgICAmIGlmbXRfbm9wLCB7IDB4MTBkNiB9CisgIH0sCisvKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKEhJMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfc2V0aCwgeyAweGQwYzAwMDAwIH0KKyAgfSwKKy8qIHNsbCAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxMDQwIH0KKyAgfSwKKy8qIHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAorICAgICYgaWZtdF9hZGR2MywgeyAweDkwYzAwMDAwIH0KKyAgfSwKKy8qIHNsbGkgJGRyLCR1aW1tNSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKKyAgICAmIGlmbXRfc2xsaSwgeyAweDUwNDAgfQorICB9LAorLyogc3JhICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDEwMjAgfQorICB9LAorLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCisgICAgJiBpZm10X2FkZHYzLCB7IDB4OTBhMDAwMDAgfQorICB9LAorLyogc3JhaSAkZHIsJHVpbW01ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAorICAgICYgaWZtdF9zbGxpLCB7IDB4NTAyMCB9CisgIH0sCisvKiBzcmwgJGRyLCRzciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkLCB7IDB4MTAwMCB9CisgIH0sCisvKiBzcmwzICRkciwkc3IsJHNpbW0xNiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKKyAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MDgwMDAwMCB9CisgIH0sCisvKiBzcmxpICRkciwkdWltbTUgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCisgICAgJiBpZm10X3NsbGksIHsgMHg1MDAwIH0KKyAgfSwKKy8qIHN0ICRzcmMxLEAkc3JjMiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKKyAgICAmIGlmbXRfY21wLCB7IDB4MjA0MCB9CisgIH0sCisvKiBzdCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X3N0X2QsIHsgMHhhMDQwMDAwMCB9CisgIH0sCisvKiBzdGIgJHNyYzEsQCRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAorICAgICYgaWZtdF9jbXAsIHsgMHgyMDAwIH0KKyAgfSwKKy8qIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X3N0X2QsIHsgMHhhMDAwMDAwMCB9CisgIH0sCisvKiBzdGggJHNyYzEsQCRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAorICAgICYgaWZtdF9jbXAsIHsgMHgyMDIwIH0KKyAgfSwKKy8qIHN0aCAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X3N0X2QsIHsgMHhhMDIwMDAwMCB9CisgIH0sCisvKiBzdCAkc3JjMSxAKyRzcmMyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKycsIE9QIChTUkMyKSwgMCB9IH0sCisgICAgJiBpZm10X2NtcCwgeyAweDIwNjAgfQorICB9LAorLyogc3QgJHNyYzEsQC0kc3JjMiAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJy0nLCBPUCAoU1JDMiksIDAgfSB9LAorICAgICYgaWZtdF9jbXAsIHsgMHgyMDcwIH0KKyAgfSwKKy8qIHN1YiAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgyMCB9CisgIH0sCisvKiBzdWJ2ICRkciwkc3IgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCisgICAgJiBpZm10X2FkZCwgeyAweDAgfQorICB9LAorLyogc3VieCAkZHIsJHNyICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAorICAgICYgaWZtdF9hZGQsIHsgMHgxMCB9CisgIH0sCisvKiB0cmFwICR1aW1tNCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFVJTU00KSwgMCB9IH0sCisgICAgJiBpZm10X3RyYXAsIHsgMHgxMGYwIH0KKyAgfSwKKy8qIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCisgICAgJiBpZm10X2NtcCwgeyAweDIwNTAgfQorICB9LAorfTsKKworI3VuZGVmIEEKKyN1bmRlZiBNTkVNCisjdW5kZWYgT1BFUkFORAorI3VuZGVmIE9QCisKKy8qIEZvcm1hdHMgZm9yIEFMSUFTIG1hY3JvLWluc25zLiAgKi8KKworI2RlZmluZSBGKGYpICYgbTMycl9jZ2VuX2lmbGRfdGFibGVbQ09OQ0FUMiAoTTMyUl8sZildCisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzhyID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmMyNHIgPSB7CisgIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JsOHIgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibDI0ciA9IHsKKyAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYm5jOHIgPSB7CisgIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmMyNHIgPSB7CisgIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JyYThyID0geworICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhMjRyID0geworICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZF8yID0geworICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZF9kMiA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRiXzIgPSB7CisgIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkYl9kMiA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRoXzIgPSB7CisgIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaF9kMiA9IHsKKyAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1Yl8yID0geworICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHViX2QyID0geworICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHVoXzIgPSB7CisgIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWhfZDIgPSB7CisgIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3BvcCA9IHsKKyAgMTYsIDE2LCAweGYwZmYsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOGEgPSB7CisgIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0lNTTgpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGkxNmEgPSB7CisgIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0XzIgPSB7CisgIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0X2QyID0geworICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGJfMiA9IHsKKyAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RiX2QyID0geworICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGhfMiA9IHsKKyAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RoX2QyID0geworICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9wdXNoID0geworICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KK307CisKKyN1bmRlZiBGCisKKy8qIEVhY2ggbm9uLXNpbXBsZSBtYWNybyBlbnRyeSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMuICAqLworCisjZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKKyNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCisjZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCisjZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCisKKy8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiB0YWJsZS4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX0lCQVNFIG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlW10gPQoreworLyogYmMgJGRpc3A4ICovCisgIHsKKyAgICAtMSwgImJjOHIiLCAiYmMiLCAxNiwKKyAgICB7IDB8QShSRUxBWEFCTEUpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmMgJGRpc3AyNCAqLworICB7CisgICAgLTEsICJiYzI0ciIsICJiYyIsIDMyLAorICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsICRkaXNwOCAqLworICB7CisgICAgLTEsICJibDhyIiwgImJsIiwgMTYsCisgICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsICRkaXNwMjQgKi8KKyAgeworICAgIC0xLCAiYmwyNHIiLCAiYmwiLCAzMiwKKyAgICB7IDB8QShSRUxBWCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJuYyAkZGlzcDggKi8KKyAgeworICAgIC0xLCAiYm5jOHIiLCAiYm5jIiwgMTYsCisgICAgeyAwfEEoUkVMQVhBQkxFKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJuYyAkZGlzcDI0ICovCisgIHsKKyAgICAtMSwgImJuYzI0ciIsICJibmMiLCAzMiwKKyAgICB7IDB8QShSRUxBWCl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBicmEgJGRpc3A4ICovCisgIHsKKyAgICAtMSwgImJyYThyIiwgImJyYSIsIDE2LAorICAgIHsgMHxBKFJFTEFYQUJMRSl8QShGSUxMX1NMT1QpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBicmEgJGRpc3AyNCAqLworICB7CisgICAgLTEsICJicmEyNHIiLCAiYnJhIiwgMzIsCisgICAgeyAwfEEoUkVMQVgpfEEoVU5DT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZCAkZHIsQCgkc3IpICovCisgIHsKKyAgICAtMSwgImxkLTIiLCAibGQiLCAxNiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgJGRyLEAoJHNyLCRzbG8xNikgKi8KKyAgeworICAgIC0xLCAibGQtZDIiLCAibGQiLCAzMiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRiICRkcixAKCRzcikgKi8KKyAgeworICAgIC0xLCAibGRiLTIiLCAibGRiIiwgMTYsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkYiAkZHIsQCgkc3IsJHNsbzE2KSAqLworICB7CisgICAgLTEsICJsZGItZDIiLCAibGRiIiwgMzIsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaCAkZHIsQCgkc3IpICovCisgIHsKKyAgICAtMSwgImxkaC0yIiwgImxkaCIsIDE2LAorICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGggJGRyLEAoJHNyLCRzbG8xNikgKi8KKyAgeworICAgIC0xLCAibGRoLWQyIiwgImxkaCIsIDMyLAorICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHViICRkcixAKCRzcikgKi8KKyAgeworICAgIC0xLCAibGR1Yi0yIiwgImxkdWIiLCAxNiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR1YiAkZHIsQCgkc3IsJHNsbzE2KSAqLworICB7CisgICAgLTEsICJsZHViLWQyIiwgImxkdWIiLCAzMiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR1aCAkZHIsQCgkc3IpICovCisgIHsKKyAgICAtMSwgImxkdWgtMiIsICJsZHVoIiwgMTYsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdWggJGRyLEAoJHNyLCRzbG8xNikgKi8KKyAgeworICAgIC0xLCAibGR1aC1kMiIsICJsZHVoIiwgMzIsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHBvcCAkZHIgKi8KKyAgeworICAgIC0xLCAicG9wIiwgInBvcCIsIDE2LAorICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaSAkZHIsJHNpbW04ICovCisgIHsKKyAgICAtMSwgImxkaThhIiwgImxkaSIsIDE2LAorICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaSAkZHIsJGhhc2gkc2xvMTYgKi8KKyAgeworICAgIC0xLCAibGRpMTZhIiwgImxkaSIsIDMyLAorICAgIHsgMHxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRzcmMxLEAoJHNyYzIpICovCisgIHsKKyAgICAtMSwgInN0LTIiLCAic3QiLCAxNiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3QgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCisgIHsKKyAgICAtMSwgInN0LWQyIiwgInN0IiwgMzIsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0YiAkc3JjMSxAKCRzcmMyKSAqLworICB7CisgICAgLTEsICJzdGItMiIsICJzdGIiLCAxNiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RiICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLworICB7CisgICAgLTEsICJzdGItZDIiLCAic3RiIiwgMzIsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0aCAkc3JjMSxAKCRzcmMyKSAqLworICB7CisgICAgLTEsICJzdGgtMiIsICJzdGgiLCAxNiwKKyAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RoICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLworICB7CisgICAgLTEsICJzdGgtZDIiLCAic3RoIiwgMzIsCisgICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHB1c2ggJHNyYzEgKi8KKyAgeworICAgIC0xLCAicHVzaCIsICJwdXNoIiwgMTYsCisgICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorfTsKKworLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIG9wY29kZSB0YWJsZS4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX09QQ09ERSBtMzJyX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbXSA9Cit7CisvKiBiYyAkZGlzcDggKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAorICAgICYgaWZtdF9iYzhyLCB7IDB4N2MwMCB9CisgIH0sCisvKiBiYyAkZGlzcDI0ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCisgICAgJiBpZm10X2JjMjRyLCB7IDB4ZmMwMDAwMDAgfQorICB9LAorLyogYmwgJGRpc3A4ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKKyAgICAmIGlmbXRfYmw4ciwgeyAweDdlMDAgfQorICB9LAorLyogYmwgJGRpc3AyNCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAorICAgICYgaWZtdF9ibDI0ciwgeyAweGZlMDAwMDAwIH0KKyAgfSwKKy8qIGJuYyAkZGlzcDggKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAorICAgICYgaWZtdF9ibmM4ciwgeyAweDdkMDAgfQorICB9LAorLyogYm5jICRkaXNwMjQgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKKyAgICAmIGlmbXRfYm5jMjRyLCB7IDB4ZmQwMDAwMDAgfQorICB9LAorLyogYnJhICRkaXNwOCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCisgICAgJiBpZm10X2JyYThyLCB7IDB4N2YwMCB9CisgIH0sCisvKiBicmEgJGRpc3AyNCAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAorICAgICYgaWZtdF9icmEyNHIsIHsgMHhmZjAwMDAwMCB9CisgIH0sCisvKiBsZCAkZHIsQCgkc3IpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZF8yLCB7IDB4MjBjMCB9CisgIH0sCisvKiBsZCAkZHIsQCgkc3IsJHNsbzE2KSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZF9kMiwgeyAweGEwYzAwMDAwIH0KKyAgfSwKKy8qIGxkYiAkZHIsQCgkc3IpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZGJfMiwgeyAweDIwODAgfQorICB9LAorLyogbGRiICRkcixAKCRzciwkc2xvMTYpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2xkYl9kMiwgeyAweGEwODAwMDAwIH0KKyAgfSwKKy8qIGxkaCAkZHIsQCgkc3IpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZGhfMiwgeyAweDIwYTAgfQorICB9LAorLyogbGRoICRkcixAKCRzciwkc2xvMTYpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2xkaF9kMiwgeyAweGEwYTAwMDAwIH0KKyAgfSwKKy8qIGxkdWIgJGRyLEAoJHNyKSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfbGR1Yl8yLCB7IDB4MjA5MCB9CisgIH0sCisvKiBsZHViICRkcixAKCRzciwkc2xvMTYpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2xkdWJfZDIsIHsgMHhhMDkwMDAwMCB9CisgIH0sCisvKiBsZHVoICRkcixAKCRzcikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X2xkdWhfMiwgeyAweDIwYjAgfQorICB9LAorLyogbGR1aCAkZHIsQCgkc3IsJHNsbzE2KSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9sZHVoX2QyLCB7IDB4YTBiMDAwMDAgfQorICB9LAorLyogcG9wICRkciAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCisgICAgJiBpZm10X3BvcCwgeyAweDIwZWYgfQorICB9LAorLyogbGRpICRkciwkc2ltbTggKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNJTU04KSwgMCB9IH0sCisgICAgJiBpZm10X2xkaThhLCB7IDB4NjAwMCB9CisgIH0sCisvKiBsZGkgJGRyLCRoYXNoJHNsbzE2ICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChIQVNIKSwgT1AgKFNMTzE2KSwgMCB9IH0sCisgICAgJiBpZm10X2xkaTE2YSwgeyAweDkwZjAwMDAwIH0KKyAgfSwKKy8qIHN0ICRzcmMxLEAoJHNyYzIpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfc3RfMiwgeyAweDIwNDAgfQorICB9LAorLyogc3QgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9zdF9kMiwgeyAweGEwNDAwMDAwIH0KKyAgfSwKKy8qIHN0YiAkc3JjMSxAKCRzcmMyKSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCisgICAgJiBpZm10X3N0Yl8yLCB7IDB4MjAwMCB9CisgIH0sCisvKiBzdGIgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCisgIHsKKyAgICB7IDAsIDAsIDAsIDAgfSwKKyAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9zdGJfZDIsIHsgMHhhMDAwMDAwMCB9CisgIH0sCisvKiBzdGggJHNyYzEsQCgkc3JjMikgKi8KKyAgeworICAgIHsgMCwgMCwgMCwgMCB9LAorICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAorICAgICYgaWZtdF9zdGhfMiwgeyAweDIwMjAgfQorICB9LAorLyogc3RoICRzcmMxLEAoJHNyYzIsJHNsbzE2KSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKKyAgICAmIGlmbXRfc3RoX2QyLCB7IDB4YTAyMDAwMDAgfQorICB9LAorLyogcHVzaCAkc3JjMSAqLworICB7CisgICAgeyAwLCAwLCAwLCAwIH0sCisgICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKKyAgICAmIGlmbXRfcHVzaCwgeyAweDIwN2YgfQorICB9LAorfTsKKworI3VuZGVmIEEKKyN1bmRlZiBNTkVNCisjdW5kZWYgT1BFUkFORAorI3VuZGVmIE9QCisKKyNpZm5kZWYgQ0dFTl9BU01fSEFTSF9QCisjZGVmaW5lIENHRU5fQVNNX0hBU0hfUChpbnNuKSAxCisjZW5kaWYKKworI2lmbmRlZiBDR0VOX0RJU19IQVNIX1AKKyNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9QKGluc24pIDEKKyNlbmRpZgorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyB0byBiZSBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4KKyAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSF9QIGluIHRoZSAub3BjIGZpbGUuICAqLworCitzdGF0aWMgaW50Cithc21faGFzaF9pbnNuX3AgKGluc24pCisgICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKK3sKKyAgcmV0dXJuIENHRU5fQVNNX0hBU0hfUCAoaW5zbik7Cit9CisKK3N0YXRpYyBpbnQKK2Rpc19oYXNoX2luc25fcCAoaW5zbikKKyAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOworeworICAvKiBJZiBidWlsZGluZyB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIE5PLURJUyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwKKyAgICAgaWdub3JlLiAgKi8KKyAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fTk9fRElTKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIENHRU5fRElTX0hBU0hfUCAoaW5zbik7Cit9CisKKyNpZm5kZWYgQ0dFTl9BU01fSEFTSAorI2RlZmluZSBDR0VOX0FTTV9IQVNIX1NJWkUgMTI3CisjaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUworI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKQorI2Vsc2UKKyNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkgLypGSVhNRSovCisjZW5kaWYKKyNlbmRpZgorCisvKiBJdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byBwcm92aWRlIGEgZGVmYXVsdCBoZXJlLAorICAgYnV0IHdoaWxlIHRoaXMgaXMgdW5kZXIgZGV2ZWxvcG1lbnQgd2UgZG8uCisgICBCVUZGRVIgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgorICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLworCisjaWZuZGVmIENHRU5fRElTX0hBU0gKKyNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDI1NgorI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZiwgdmFsdWUpICgqKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZikpCisjZW5kaWYKKworLyogVGhlIHJlc3VsdCBpcyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgaW5zbi4KKyAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorYXNtX2hhc2hfaW5zbiAobW5lbSkKKyAgICAgY29uc3QgY2hhciAqIG1uZW07Cit7CisgIHJldHVybiBDR0VOX0FTTV9IQVNIIChtbmVtKTsKK30KKworLyogQlVGIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KKyAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorZGlzX2hhc2hfaW5zbiAoYnVmLCB2YWx1ZSkKKyAgICAgY29uc3QgY2hhciAqIGJ1ZjsKKyAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKK3sKKyAgcmV0dXJuIENHRU5fRElTX0hBU0ggKGJ1ZiwgdmFsdWUpOworfQorCisvKiBTZXQgdGhlIHJlY29yZGVkIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiB0aGUgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KKworc3RhdGljIHZvaWQKK3NldF9maWVsZHNfYml0c2l6ZSAoZmllbGRzLCBzaXplKQorICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOworICAgICBpbnQgc2l6ZTsKK3sKKyAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IHNpemU7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLgorICAgVGhpcyBwbHVncyB0aGUgb3Bjb2RlIGVudHJpZXMgYW5kIG1hY3JvIGluc3RydWN0aW9ucyBpbnRvIHRoZSBjcHUgdGFibGUuICAqLworCit2b2lkCittMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKQorICAgICBDR0VOX0NQVV9ERVNDIGNkOworeworICBpbnQgaTsKKyAgaW50IG51bV9tYWNyb3MgPSAoc2l6ZW9mIChtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZSkgLworCQkgICAgc2l6ZW9mIChtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXSkpOworICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgbTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbMF07CisgIGNvbnN0IENHRU5fT1BDT0RFICpvYyA9ICYgbTMycl9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlWzBdOworICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKKyAgbWVtc2V0IChpbnNucywgMCwgbnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fbWFjcm9zOyArK2kpCisgICAgeworICAgICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKKyAgICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKKyAgICB9CisgIGNkLT5tYWNyb19pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOworICBjZC0+bWFjcm9faW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKKyAgY2QtPm1hY3JvX2luc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IG51bV9tYWNyb3M7CisKKyAgb2MgPSAmIG0zMnJfY2dlbl9pbnNuX29wY29kZV90YWJsZVswXTsKKyAgaW5zbnMgPSAoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllczsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQorICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKKworICBjZC0+c2l6ZW9mX2ZpZWxkcyA9IHNpemVvZiAoQ0dFTl9GSUVMRFMpOworICBjZC0+c2V0X2ZpZWxkc19iaXRzaXplID0gc2V0X2ZpZWxkc19iaXRzaXplOworCisgIGNkLT5hc21faGFzaF9wID0gYXNtX2hhc2hfaW5zbl9wOworICBjZC0+YXNtX2hhc2ggPSBhc21faGFzaF9pbnNuOworICBjZC0+YXNtX2hhc2hfc2l6ZSA9IENHRU5fQVNNX0hBU0hfU0laRTsKKworICBjZC0+ZGlzX2hhc2hfcCA9IGRpc19oYXNoX2luc25fcDsKKyAgY2QtPmRpc19oYXNoID0gZGlzX2hhc2hfaW5zbjsKKyAgY2QtPmRpc19oYXNoX3NpemUgPSBDR0VOX0RJU19IQVNIX1NJWkU7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BjLmggYi9vcGNvZGVzL20zMnItb3BjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1N2RhYQotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTMyci1vcGMuaApAQCAtMCwwICsxLDEyNiBAQAorLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgbTMyci4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBNMzJSX09QQ19ICisjZGVmaW5lIE0zMlJfT1BDX0gKKworLyogLS0gb3BjLmggKi8KKworI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQorI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2CisjdW5kZWYgQ0dFTl9ESVNfSEFTSAorI2RlZmluZSBYKGIpICgoKHVuc2lnbmVkIGNoYXIgKikgKGIpKVswXSAmIDB4ZjApCisjZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgXAorKFggKGJ1ZmZlcikgfCBcCisgKFggKGJ1ZmZlcikgPT0gMHg0MCB8fCBYIChidWZmZXIpID09IDB4ZTAgfHwgWCAoYnVmZmVyKSA9PSAweDYwIHx8IFggKGJ1ZmZlcikgPT0gMHg1MCA/IDAgXAorICA6IFggKGJ1ZmZlcikgPT0gMHg3MCB8fCBYIChidWZmZXIpID09IDB4ZjAgPyAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSAmIDB4ZikgXAorICA6IFggKGJ1ZmZlcikgPT0gMHgzMCA/ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4NzApID4+IDQpIFwKKyAgOiAoKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMV0gJiAweGYwKSA+PiA0KSkpCisKKy8qIC0tICovCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGluc3RydWN0aW9uIHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bSBjZ2VuX2luc25fdHlwZSB7CisgIE0zMlJfSU5TTl9JTlZBTElELCBNMzJSX0lOU05fQURELCBNMzJSX0lOU05fQUREMywgTTMyUl9JTlNOX0FORAorICwgTTMyUl9JTlNOX0FORDMsIE0zMlJfSU5TTl9PUiwgTTMyUl9JTlNOX09SMywgTTMyUl9JTlNOX1hPUgorICwgTTMyUl9JTlNOX1hPUjMsIE0zMlJfSU5TTl9BRERJLCBNMzJSX0lOU05fQUREViwgTTMyUl9JTlNOX0FERFYzCisgLCBNMzJSX0lOU05fQUREWCwgTTMyUl9JTlNOX0JDOCwgTTMyUl9JTlNOX0JDMjQsIE0zMlJfSU5TTl9CRVEKKyAsIE0zMlJfSU5TTl9CRVFaLCBNMzJSX0lOU05fQkdFWiwgTTMyUl9JTlNOX0JHVFosIE0zMlJfSU5TTl9CTEVaCisgLCBNMzJSX0lOU05fQkxUWiwgTTMyUl9JTlNOX0JORVosIE0zMlJfSU5TTl9CTDgsIE0zMlJfSU5TTl9CTDI0CisgLCBNMzJSX0lOU05fQk5DOCwgTTMyUl9JTlNOX0JOQzI0LCBNMzJSX0lOU05fQk5FLCBNMzJSX0lOU05fQlJBOAorICwgTTMyUl9JTlNOX0JSQTI0CisgLCBNMzJSX0lOU05fQ01QLCBNMzJSX0lOU05fQ01QSSwgTTMyUl9JTlNOX0NNUFUsIE0zMlJfSU5TTl9DTVBVSQorICwgTTMyUl9JTlNOX0RJViwgTTMyUl9JTlNOX0RJVlUsIE0zMlJfSU5TTl9SRU0sIE0zMlJfSU5TTl9SRU1VCisgLCBNMzJSX0lOU05fSkwsIE0zMlJfSU5TTl9KTVAsIE0zMlJfSU5TTl9MRCwgTTMyUl9JTlNOX0xEX0QKKyAsIE0zMlJfSU5TTl9MREIsIE0zMlJfSU5TTl9MREJfRCwgTTMyUl9JTlNOX0xESCwgTTMyUl9JTlNOX0xESF9ECisgLCBNMzJSX0lOU05fTERVQiwgTTMyUl9JTlNOX0xEVUJfRCwgTTMyUl9JTlNOX0xEVUgsIE0zMlJfSU5TTl9MRFVIX0QKKyAsIE0zMlJfSU5TTl9MRF9QTFVTLCBNMzJSX0lOU05fTEQyNCwgTTMyUl9JTlNOX0xESTgsIE0zMlJfSU5TTl9MREkxNgorICwgTTMyUl9JTlNOX0xPQ0ssIE0zMlJfSU5TTl9NQUNISQorICwgTTMyUl9JTlNOX01BQ0xPCisgLCBNMzJSX0lOU05fTUFDV0hJCisgLCBNMzJSX0lOU05fTUFDV0xPCisgLCBNMzJSX0lOU05fTVVMLCBNMzJSX0lOU05fTVVMSEkKKyAsIE0zMlJfSU5TTl9NVUxMTworICwgTTMyUl9JTlNOX01VTFdISQorICwgTTMyUl9JTlNOX01VTFdMTworICwgTTMyUl9JTlNOX01WLCBNMzJSX0lOU05fTVZGQUNISQorICwgTTMyUl9JTlNOX01WRkFDTE8KKyAsIE0zMlJfSU5TTl9NVkZBQ01JCisgLCBNMzJSX0lOU05fTVZGQywgTTMyUl9JTlNOX01WVEFDSEkKKyAsIE0zMlJfSU5TTl9NVlRBQ0xPCisgLCBNMzJSX0lOU05fTVZUQywgTTMyUl9JTlNOX05FRywgTTMyUl9JTlNOX05PUCwgTTMyUl9JTlNOX05PVAorICwgTTMyUl9JTlNOX1JBQworICwgTTMyUl9JTlNOX1JBQ0gKKyAsIE0zMlJfSU5TTl9SVEUsIE0zMlJfSU5TTl9TRVRILCBNMzJSX0lOU05fU0xMLCBNMzJSX0lOU05fU0xMMworICwgTTMyUl9JTlNOX1NMTEksIE0zMlJfSU5TTl9TUkEsIE0zMlJfSU5TTl9TUkEzLCBNMzJSX0lOU05fU1JBSQorICwgTTMyUl9JTlNOX1NSTCwgTTMyUl9JTlNOX1NSTDMsIE0zMlJfSU5TTl9TUkxJLCBNMzJSX0lOU05fU1QKKyAsIE0zMlJfSU5TTl9TVF9ELCBNMzJSX0lOU05fU1RCLCBNMzJSX0lOU05fU1RCX0QsIE0zMlJfSU5TTl9TVEgKKyAsIE0zMlJfSU5TTl9TVEhfRCwgTTMyUl9JTlNOX1NUX1BMVVMsIE0zMlJfSU5TTl9TVF9NSU5VUywgTTMyUl9JTlNOX1NVQgorICwgTTMyUl9JTlNOX1NVQlYsIE0zMlJfSU5TTl9TVUJYLCBNMzJSX0lOU05fVFJBUCwgTTMyUl9JTlNOX1VOTE9DSworICwgTTMyUl9JTlNOX01BWAorfSBDR0VOX0lOU05fVFlQRTsKKworLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KKyNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgTTMyUl9JTlNOX0lOVkFMSUQKKworLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KKyNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBNMzJSX0lOU05fTUFYKQorCisvKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLworc3RydWN0IGNnZW5fZmllbGRzCit7CisgIGludCBsZW5ndGg7CisgIGxvbmcgZl9uaWw7CisgIGxvbmcgZl9vcDE7CisgIGxvbmcgZl9vcDI7CisgIGxvbmcgZl9jb25kOworICBsb25nIGZfcjE7CisgIGxvbmcgZl9yMjsKKyAgbG9uZyBmX3NpbW04OworICBsb25nIGZfc2ltbTE2OworICBsb25nIGZfc2hpZnRfb3AyOworICBsb25nIGZfdWltbTQ7CisgIGxvbmcgZl91aW1tNTsKKyAgbG9uZyBmX3VpbW0xNjsKKyAgbG9uZyBmX3VpbW0yNDsKKyAgbG9uZyBmX2hpMTY7CisgIGxvbmcgZl9kaXNwODsKKyAgbG9uZyBmX2Rpc3AxNjsKKyAgbG9uZyBmX2Rpc3AyNDsKK307CisKKyNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCit7XAorfQorI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCit7XAorfQorI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAore1wKK30KKyNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCit7XAorfQorCisKKyNlbmRpZiAvKiBNMzJSX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BpbnN0LmMgYi9vcGNvZGVzL20zMnItb3BpbnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzYTQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbTMyci1vcGluc3QuYwpAQCAtMCwwICsxLDU2MiBAQAorLyogU2VtYW50aWMgb3BlcmFuZCBpbnN0YW5jZXMgZm9yIG0zMnIuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWNhdC5oIgorI2luY2x1ZGUgIm0zMnItZGVzYy5oIgorI2luY2x1ZGUgIm0zMnItb3BjLmgiCisKKy8qIE9wZXJhbmQgcmVmZXJlbmNlcy4gICovCisKKyNkZWZpbmUgSU5QVVQgQ0dFTl9PUElOU1RfSU5QVVQKKyNkZWZpbmUgT1VUUFVUIENHRU5fT1BJTlNUX09VVFBVVAorI2RlZmluZSBFTkQgQ0dFTl9PUElOU1RfRU5ECisjZGVmaW5lIENPTkRfUkVGIENHRU5fT1BJTlNUX0NPTkRfUkVGCisjZGVmaW5lIE9QX0VOVChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9lbXB0eV9vcHNbXSA9IHsKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9hZGRfb3BzW10gPSB7CisgIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZDNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9hbmQzX29wc1tdID0geworICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJ1aW1tMTYiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU0xNiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9vcjNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInVsbzE2IiwgSFdfSF9VTE8xNiwgQ0dFTl9NT0RFX1VJTlQsIE9QX0VOVCAoVUxPMTYpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkaV9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IElOUFVULCAic2ltbTgiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTgpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkdl9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkdjNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzaW1tMTYiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAorICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkeF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9iYzhfb3BzW10gPSB7CisgIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIENPTkRfUkVGIH0sCisgIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JjMjRfb3BzW10gPSB7CisgIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgQ09ORF9SRUYgfSwKKyAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmVxX29wc1tdID0geworICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAorICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAorICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9iZXF6X29wc1tdID0geworICB7IElOUFVULCAiZGlzcDE2IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMTYpLCAwLCBDT05EX1JFRiB9LAorICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ibDhfb3BzW10gPSB7CisgIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgMCB9LAorICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JsMjRfb3BzW10gPSB7CisgIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCisgIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYnJhOF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImRpc3A4IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQOCksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9icmEyNF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImRpc3AyNCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDI0KSwgMCwgMCB9LAorICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2NtcF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9jbXBpX29wc1tdID0geworICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9kaXZfb3BzW10gPSB7CisgIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCisgIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIENPTkRfUkVGIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfamxfb3BzW10gPSB7CisgIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfZ3JfMTQiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIDAsIDE0LCAwIH0sCisgIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfam1wX29wc1tdID0geworICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRfb3BzW10gPSB7CisgIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZF9kX29wc1tdID0geworICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkYl9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkYl9kX29wc1tdID0geworICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkaF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9ISSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkaF9kX29wc1tdID0geworICB7IElOUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkX3BsdXNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZDI0X29wc1tdID0geworICB7IElOUFVULCAidWltbTI0IiwgSFdfSF9BRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFVJTU0yNCksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGk4X29wc1tdID0geworICB7IElOUFVULCAic2ltbTgiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0lNTTgpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRpMTZfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbG9ja19vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImhfbWVtb3J5X3NyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbWFjaGlfb3BzW10gPSB7CisgIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAorICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbXVsaGlfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdl9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X212ZmFjaGlfb3BzW10gPSB7CisgIHsgSU5QVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X212ZmNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzY3IiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNDUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdnRhY2hpX29wc1tdID0geworICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X212dGNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkY3IiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERDUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ub3Bfb3BzW10gPSB7CisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfcmFjX29wc1tdID0geworICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3J0ZV9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCisgIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgImhfY3JfMTQiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCAxNCwgMCB9LAorICB7IElOUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAorICB7IE9VVFBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKKyAgeyBPVVRQVVQsICJoX3BzdyIsIEhXX0hfUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCisgIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc2V0aF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImhpMTYiLCBIV19IX0hJMTYsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChISTE2KSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3NsbDNfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzaW1tMTYiLCBIV19IX1NJTlQsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTSU1NMTYpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zbGxpX29wc1tdID0geworICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJ1aW1tNSIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChVSU1NNSksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdF9kX29wc1tdID0geworICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAorICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAorICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdGJfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1FJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1FJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RiX2Rfb3BzW10gPSB7CisgIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1FJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCisgIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcmMyX3NsbzE2IiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAorICB7IEVORCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3N0aF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiaF9tZW1vcnlfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKKyAgeyBFTkQgfQorfTsKKworc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdGhfZF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfSEksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX1ZNX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RfcGx1c19vcHNbXSA9IHsKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJoX21lbW9yeV9uZXdfc3JjMiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfdHJhcF9vcHNbXSA9IHsKKyAgeyBJTlBVVCwgImhfYnBzdyIsIEhXX0hfQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAorICB7IElOUFVULCAiaF9wc3ciLCBIV19IX1BTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAorICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCisgIHsgSU5QVVQsICJ1aW1tNCIsIEhXX0hfVUlOVCwgQ0dFTl9NT0RFX1VJTlQsIE9QX0VOVCAoVUlNTTQpLCAwLCAwIH0sCisgIHsgT1VUUFVULCAiaF9iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKKyAgeyBPVVRQVVQsICJoX2NyXzE0IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgMTQsIDAgfSwKKyAgeyBPVVRQVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCisgIHsgT1VUUFVULCAiaF9wc3ciLCBIV19IX1BTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAorICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCisgIHsgRU5EIH0KK307CisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfdW5sb2NrX29wc1tdID0geworICB7IElOUFVULCAiaF9sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKKyAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIENPTkRfUkVGIH0sCisgIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgQ09ORF9SRUYgfSwKKyAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAorICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCBDT05EX1JFRiB9LAorICB7IEVORCB9Cit9OworCisjdW5kZWYgSU5QVVQKKyN1bmRlZiBPVVRQVVQKKyN1bmRlZiBFTkQKKyN1bmRlZiBDT05EX1JFRgorI3VuZGVmIE9QX0VOVAorCisvKiBPcGVyYW5kIGluc3RhbmNlIGxvb2t1cCB0YWJsZS4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX09QSU5TVCAqbTMycl9jZ2VuX29waW5zdF90YWJsZVtNQVhfSU5TTlNdID0geworICAwLAorICAmIGZtdF9hZGRfb3BzWzBdLAorICAmIGZtdF9hZGQzX29wc1swXSwKKyAgJiBmbXRfYWRkX29wc1swXSwKKyAgJiBmbXRfYW5kM19vcHNbMF0sCisgICYgZm10X2FkZF9vcHNbMF0sCisgICYgZm10X29yM19vcHNbMF0sCisgICYgZm10X2FkZF9vcHNbMF0sCisgICYgZm10X2FuZDNfb3BzWzBdLAorICAmIGZtdF9hZGRpX29wc1swXSwKKyAgJiBmbXRfYWRkdl9vcHNbMF0sCisgICYgZm10X2FkZHYzX29wc1swXSwKKyAgJiBmbXRfYWRkeF9vcHNbMF0sCisgICYgZm10X2JjOF9vcHNbMF0sCisgICYgZm10X2JjMjRfb3BzWzBdLAorICAmIGZtdF9iZXFfb3BzWzBdLAorICAmIGZtdF9iZXF6X29wc1swXSwKKyAgJiBmbXRfYmVxel9vcHNbMF0sCisgICYgZm10X2JlcXpfb3BzWzBdLAorICAmIGZtdF9iZXF6X29wc1swXSwKKyAgJiBmbXRfYmVxel9vcHNbMF0sCisgICYgZm10X2JlcXpfb3BzWzBdLAorICAmIGZtdF9ibDhfb3BzWzBdLAorICAmIGZtdF9ibDI0X29wc1swXSwKKyAgJiBmbXRfYmM4X29wc1swXSwKKyAgJiBmbXRfYmMyNF9vcHNbMF0sCisgICYgZm10X2JlcV9vcHNbMF0sCisgICYgZm10X2JyYThfb3BzWzBdLAorICAmIGZtdF9icmEyNF9vcHNbMF0sCisgICYgZm10X2NtcF9vcHNbMF0sCisgICYgZm10X2NtcGlfb3BzWzBdLAorICAmIGZtdF9jbXBfb3BzWzBdLAorICAmIGZtdF9jbXBpX29wc1swXSwKKyAgJiBmbXRfZGl2X29wc1swXSwKKyAgJiBmbXRfZGl2X29wc1swXSwKKyAgJiBmbXRfZGl2X29wc1swXSwKKyAgJiBmbXRfZGl2X29wc1swXSwKKyAgJiBmbXRfamxfb3BzWzBdLAorICAmIGZtdF9qbXBfb3BzWzBdLAorICAmIGZtdF9sZF9vcHNbMF0sCisgICYgZm10X2xkX2Rfb3BzWzBdLAorICAmIGZtdF9sZGJfb3BzWzBdLAorICAmIGZtdF9sZGJfZF9vcHNbMF0sCisgICYgZm10X2xkaF9vcHNbMF0sCisgICYgZm10X2xkaF9kX29wc1swXSwKKyAgJiBmbXRfbGRiX29wc1swXSwKKyAgJiBmbXRfbGRiX2Rfb3BzWzBdLAorICAmIGZtdF9sZGhfb3BzWzBdLAorICAmIGZtdF9sZGhfZF9vcHNbMF0sCisgICYgZm10X2xkX3BsdXNfb3BzWzBdLAorICAmIGZtdF9sZDI0X29wc1swXSwKKyAgJiBmbXRfbGRpOF9vcHNbMF0sCisgICYgZm10X2xkaTE2X29wc1swXSwKKyAgJiBmbXRfbG9ja19vcHNbMF0sCisgICYgZm10X21hY2hpX29wc1swXSwKKyAgJiBmbXRfbWFjaGlfb3BzWzBdLAorICAmIGZtdF9tYWNoaV9vcHNbMF0sCisgICYgZm10X21hY2hpX29wc1swXSwKKyAgJiBmbXRfYWRkX29wc1swXSwKKyAgJiBmbXRfbXVsaGlfb3BzWzBdLAorICAmIGZtdF9tdWxoaV9vcHNbMF0sCisgICYgZm10X211bGhpX29wc1swXSwKKyAgJiBmbXRfbXVsaGlfb3BzWzBdLAorICAmIGZtdF9tdl9vcHNbMF0sCisgICYgZm10X212ZmFjaGlfb3BzWzBdLAorICAmIGZtdF9tdmZhY2hpX29wc1swXSwKKyAgJiBmbXRfbXZmYWNoaV9vcHNbMF0sCisgICYgZm10X212ZmNfb3BzWzBdLAorICAmIGZtdF9tdnRhY2hpX29wc1swXSwKKyAgJiBmbXRfbXZ0YWNoaV9vcHNbMF0sCisgICYgZm10X212dGNfb3BzWzBdLAorICAmIGZtdF9tdl9vcHNbMF0sCisgICYgZm10X25vcF9vcHNbMF0sCisgICYgZm10X212X29wc1swXSwKKyAgJiBmbXRfcmFjX29wc1swXSwKKyAgJiBmbXRfcmFjX29wc1swXSwKKyAgJiBmbXRfcnRlX29wc1swXSwKKyAgJiBmbXRfc2V0aF9vcHNbMF0sCisgICYgZm10X2FkZF9vcHNbMF0sCisgICYgZm10X3NsbDNfb3BzWzBdLAorICAmIGZtdF9zbGxpX29wc1swXSwKKyAgJiBmbXRfYWRkX29wc1swXSwKKyAgJiBmbXRfc2xsM19vcHNbMF0sCisgICYgZm10X3NsbGlfb3BzWzBdLAorICAmIGZtdF9hZGRfb3BzWzBdLAorICAmIGZtdF9zbGwzX29wc1swXSwKKyAgJiBmbXRfc2xsaV9vcHNbMF0sCisgICYgZm10X3N0X29wc1swXSwKKyAgJiBmbXRfc3RfZF9vcHNbMF0sCisgICYgZm10X3N0Yl9vcHNbMF0sCisgICYgZm10X3N0Yl9kX29wc1swXSwKKyAgJiBmbXRfc3RoX29wc1swXSwKKyAgJiBmbXRfc3RoX2Rfb3BzWzBdLAorICAmIGZtdF9zdF9wbHVzX29wc1swXSwKKyAgJiBmbXRfc3RfcGx1c19vcHNbMF0sCisgICYgZm10X2FkZF9vcHNbMF0sCisgICYgZm10X2FkZHZfb3BzWzBdLAorICAmIGZtdF9hZGR4X29wc1swXSwKKyAgJiBmbXRfdHJhcF9vcHNbMF0sCisgICYgZm10X3VubG9ja19vcHNbMF0sCit9OworCisvKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4gICovCisKK3ZvaWQKK20zMnJfY2dlbl9pbml0X29waW5zdF90YWJsZSAoY2QpCisgICAgIENHRU5fQ1BVX0RFU0MgY2Q7Cit7CisgIGludCBpOworICBjb25zdCBDR0VOX09QSU5TVCAqKm9pID0gJiBtMzJyX2NnZW5fb3BpbnN0X3RhYmxlWzBdOworICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXM7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKKyAgICBpbnNuc1tpXS5vcGluc3QgPSBvaVtpXTsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbTY4ay1kaXMuYyBiL29wY29kZXMvbTY4ay1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzE2YzIxCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tNjhrLWRpcy5jCkBAIC0wLDAgKzEsMTI0MyBAQAorLyogUHJpbnQgTW90b3JvbGEgNjhrIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgorI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgorI2luY2x1ZGUgIm9waW50bC5oIgorCisjaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKKworLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitzdGF0aWMgaW50CitmZXRjaF9kYXRhIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJmZF9ieXRlICopKTsKKworc3RhdGljIHZvaWQKK2R1bW15X3ByaW50X2FkZHJlc3MgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOworCitzdGF0aWMgaW50CitmZXRjaF9hcmcgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKK3N0YXRpYyB2b2lkCitwcmludF9iYXNlIFBBUkFNUyAoKGludCwgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorcHJpbnRfaW5kZXhlZCBQQVJBTVMgKChpbnQsIHVuc2lnbmVkIGNoYXIgKiwgYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7CisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fYXJnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCisJCQliZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKKworQ09OU1QgY2hhciAqIENPTlNUIGZwY3JfbmFtZXNbXSA9IHsKKyAgIiIsICIlZnBpYXIiLCAiJWZwc3IiLCAiJWZwaWFyLyVmcHNyIiwgIiVmcGNyIiwKKyAgIiVmcGlhci8lZnBjciIsICIlZnBzci8lZnBjciIsICIlZnBpYXIvJWZwc3IvJWZwY3IifTsKKworc3RhdGljIGNoYXIgKmNvbnN0IHJlZ19uYW1lc1tdID0geworICAiJWQwIiwgIiVkMSIsICIlZDIiLCAiJWQzIiwgIiVkNCIsICIlZDUiLCAiJWQ2IiwgIiVkNyIsCisgICIlYTAiLCAiJWExIiwgIiVhMiIsICIlYTMiLCAiJWE0IiwgIiVhNSIsICIlZnAiLCAiJXNwIiwKKyAgIiVwcyIsICIlcGMifTsKKworLyogU2lnbi1leHRlbmQgYW4gKHVuc2lnbmVkIGNoYXIpLiAqLworI2lmIF9fU1REQ19fID09IDEKKyNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKHNpZ25lZCBjaGFyKShjaCkpCisjZWxzZQorI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoaW50KSgoKGNoKSBeIDB4ODApICYgMHhGRikgLSAxMjgpCisjZW5kaWYKKworLyogR2V0IGEgMSBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KKyNkZWZpbmUgTkVYVEJZVEUocCkgIChwICs9IDIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBDT0VSQ0VfU0lHTkVEX0NIQVIocFstMV0pKQorCisvKiBHZXQgYSAyIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLworI2RlZmluZSBDT0VSQ0UxNih4KSAoKGludCkgKCgoeCkgXiAweDgwMDApIC0gMHg4MDAwKSkKKyNkZWZpbmUgTkVYVFdPUkQocCkgIFwKKyAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKKyAgIENPRVJDRTE2ICgocFstMl0gPDwgOCkgKyBwWy0xXSkpCisKKy8qIEdldCBhIDQgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCisjZGVmaW5lIENPRVJDRTMyKHgpICgoYmZkX3NpZ25lZF92bWEpICgoeCkgXiAweDgwMDAwMDAwKSAtIDB4ODAwMDAwMDApCisjZGVmaW5lIE5FWFRMT05HKHApICBcCisgIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCisgICAoQ09FUkNFMzIgKCgoKCgocFstNF0gPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0xXSkpKQorCisvKiBHZXQgYSA0IGJ5dGUgdW5zaWduZWQgaW50ZWdlci4gICovCisjZGVmaW5lIE5FWFRVTE9ORyhwKSAgXAorICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAorICAgKHVuc2lnbmVkIGludCkgKCgoKCgocFstNF0gPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0xXSkpCisKKy8qIEdldCBhIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQuICAqLworI2RlZmluZSBORVhUU0lOR0xFKHZhbCwgcCkgXAorICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAorICAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnLCAoY2hhciAqKSBwIC0gNCwgJnZhbCkpCisKKy8qIEdldCBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQuICAqLworI2RlZmluZSBORVhURE9VQkxFKHZhbCwgcCkgXAorICAocCArPSA4LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAorICAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnLCAoY2hhciAqKSBwIC0gOCwgJnZhbCkpCisKKy8qIEdldCBhbiBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQuICAqLworI2RlZmluZSBORVhURVhURU5EKHZhbCwgcCkgXAorICAocCArPSAxMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKKyAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsIChjaGFyICopIHAgLSAxMiwgJnZhbCkpCisKKy8qIE5lZWQgYSBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gcGFja2VkIHRvIGRvdWJsZQorICAgcHJlY2lzaW9uLiAgIEFjdHVhbGx5LCBpdCdzIGVhc2llciB0byBwcmludCBhCisgICBwYWNrZWQgbnVtYmVyIHRoYW4gYSBkb3VibGUgYW55d2F5LCBzbyBtYXliZQorICAgdGhlcmUgc2hvdWxkIGJlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSB0aGlzLi4uICovCisjZGVmaW5lIE5FWFRQQUNLRUQocCkgXAorICAocCArPSAxMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIDAuMCkKKworDAorLyogTWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBNQVhMRU4gMjIKKworI2luY2x1ZGUgPHNldGptcC5oPgorCitzdHJ1Y3QgcHJpdmF0ZQoreworICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCisgIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKKyAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOworICBiZmRfdm1hIGluc25fc3RhcnQ7CisgIGptcF9idWYgYmFpbG91dDsKK307CisKKy8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKKyAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcworICAgb24gZXJyb3IuICAqLworI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKKyAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCisgICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCisKK3N0YXRpYyBpbnQKK2ZldGNoX2RhdGEgKGluZm8sIGFkZHIpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgaW50IHN0YXR1czsKKyAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7CisgIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCisJCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCisJCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAorCQkJCSAgICAgIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOworICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7CisgICAgfQorICBlbHNlCisgICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOworICByZXR1cm4gMTsKK30KKwwKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcmludCB0byB0aGUgYml0LWJ1Y2tldC4gKi8KK3N0YXRpYyBpbnQKKyNpZmRlZiBfX1NURENfXworZHVtbXlfcHJpbnRlciAoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBmb3JtYXQsIC4uLikKKyNlbHNlCitkdW1teV9wcmludGVyIChmaWxlKSBGSUxFICpmaWxlOworI2VuZGlmCisgeyByZXR1cm4gMDsgfQorCitzdGF0aWMgdm9pZAorZHVtbXlfcHJpbnRfYWRkcmVzcyAodm1hLCBpbmZvKQorICAgICBiZmRfdm1hIHZtYTsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7Cit9CisKKy8qIFByaW50IHRoZSBtNjhrIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCisgICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KKworaW50CitwcmludF9pbnNuX202OGsgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7CisgIHVuc2lnbmVkIGNoYXIgKnNhdmVfcDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBiZXN0bWFzazsKKyAgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICpiZXN0ID0gMDsKKyAgdW5zaWduZWQgaW50IGFyY2hfbWFzazsKKyAgc3RydWN0IHByaXZhdGUgcHJpdjsKKyAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKKyAgZnByaW50Zl9mdHlwZSBzYXZlX3ByaW50ZXIgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7CisgIHZvaWQgKCpzYXZlX3ByaW50X2FkZHJlc3MpIFBBUkFNUygoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8qKSkKKyAgICA9IGluZm8tPnByaW50X2FkZHJlc3NfZnVuYzsKKyAgaW50IG1ham9yX29wY29kZTsKKyAgc3RhdGljIGludCBudW1vcGNvZGVzWzE2XTsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqKm9wY29kZXNbMTZdOworCisgIGlmICghb3Bjb2Rlc1swXSkKKyAgICB7CisgICAgICAvKiBTcGVlZCB1cCB0aGUgbWF0Y2hpbmcgYnkgc29ydGluZyB0aGUgb3Bjb2RlIHRhYmxlIG9uIHRoZSB1cHBlcgorCSBmb3VyIGJpdHMgb2YgdGhlIG9wY29kZS4gICovCisgICAgICBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKipvcGNfcG9pbnRlclsxNl07CisKKyAgICAgIC8qIEZpcnN0IGNvdW50IGhvdyBtYW55IG9wY29kZXMgYXJlIGluIGVhY2ggb2YgdGhlIHNpeHRlZW4gYnVja2V0cy4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCisJbnVtb3Bjb2Rlc1sobTY4a19vcGNvZGVzW2ldLm9wY29kZSA+PiAyOCkgJiAxNV0rKzsKKworICAgICAgLyogVGhlbiBjcmVhdGUgYSBzb3J0ZWQgdGFibGUgb2YgcG9pbnRlcnMgdGhhdCBwb2ludCBpbnRvIHRoZQorCSB1bnNvcnRlZCB0YWJsZS4gICovCisgICAgICBvcGNfcG9pbnRlclswXSA9ICgoY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICoqKQorCQkJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbTY4a19vcGNvZGUgKikKKwkJCQkgKiBtNjhrX251bW9wY29kZXMpKTsKKyAgICAgIG9wY29kZXNbMF0gPSBvcGNfcG9pbnRlclswXTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQorCXsKKwkgIG9wY19wb2ludGVyW2ldID0gb3BjX3BvaW50ZXJbaSAtIDFdICsgbnVtb3Bjb2Rlc1tpIC0gMV07CisJICBvcGNvZGVzW2ldID0gb3BjX3BvaW50ZXJbaV07CisJfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1vcGNvZGVzOyBpKyspCisJKm9wY19wb2ludGVyWyhtNjhrX29wY29kZXNbaV0ub3Bjb2RlID4+IDI4KSAmIDE1XSsrID0gJm02OGtfb3Bjb2Rlc1tpXTsKKworICAgIH0KKworICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKKyAgLyogVGVsbCBvYmpkdW1wIHRvIHVzZSB0d28gYnl0ZXMgcGVyIGNodW5rIGFuZCBzaXggYnl0ZXMgcGVyIGxpbmUgZm9yCisgICAgIGRpc3BsYXlpbmcgcmF3IGRhdGEuICAqLworICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOworICBpbmZvLT5ieXRlc19wZXJfbGluZSA9IDY7CisgIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gQkZEX0VORElBTl9CSUc7CisgIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7CisgIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7CisgIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKKyAgICAvKiBFcnJvciByZXR1cm4uICAqLworICAgIHJldHVybiAtMTsKKworICBzd2l0Y2ggKGluZm8tPm1hY2gpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgYXJjaF9tYXNrID0gKHVuc2lnbmVkIGludCkgLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX202ODAwMDoKKyAgICAgIGFyY2hfbWFzayA9IG02ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfbTY4MDA4OgorICAgICAgYXJjaF9tYXNrID0gbTY4MDA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6CisgICAgICBhcmNoX21hc2sgPSBtNjgwMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX202ODAyMDoKKyAgICAgIGFyY2hfbWFzayA9IG02ODAyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfbTY4MDMwOgorICAgICAgYXJjaF9tYXNrID0gbTY4MDMwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6CisgICAgICBhcmNoX21hc2sgPSBtNjgwNDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJmZF9tYWNoX202ODA2MDoKKyAgICAgIGFyY2hfbWFzayA9IG02ODA2MDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBhcmNoX21hc2sgfD0gbTY4ODgxIHwgbTY4ODUxOworCisgIGJlc3RtYXNrID0gMDsKKyAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMik7CisgIG1ham9yX29wY29kZSA9IChidWZmZXJbMF0gPj4gNCkgJiAxNTsKKyAgZm9yIChpID0gMDsgaSA8IG51bW9wY29kZXNbbWFqb3Jfb3Bjb2RlXTsgaSsrKQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqb3BjID0gb3Bjb2Rlc1ttYWpvcl9vcGNvZGVdW2ldOworICAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUgPSBvcGMtPm9wY29kZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbWF0Y2ggPSBvcGMtPm1hdGNoOworCisgICAgICBpZiAoKCgweGZmICYgYnVmZmVyWzBdICYgKG1hdGNoID4+IDI0KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDI0KSkpCisJICAmJiAoKDB4ZmYgJiBidWZmZXJbMV0gJiAobWF0Y2ggPj4gMTYpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gMTYpKSkKKwkgIC8qIE9ubHkgZmV0Y2ggdGhlIG5leHQgdHdvIGJ5dGVzIGlmIHdlIG5lZWQgdG8uICAqLworCSAgJiYgKCgoMHhmZmZmICYgbWF0Y2gpID09IDApCisJICAgICAgfHwKKwkgICAgICAoRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgNCkKKwkgICAgICAgJiYgKCgweGZmICYgYnVmZmVyWzJdICYgKG1hdGNoID4+IDgpKSA9PSAoMHhmZiAmIChvcGNvZGUgPj4gOCkpKQorCSAgICAgICAmJiAoKDB4ZmYgJiBidWZmZXJbM10gJiBtYXRjaCkgPT0gKDB4ZmYgJiBvcGNvZGUpKSkKKwkgICAgICApCisJICAmJiAob3BjLT5hcmNoICYgYXJjaF9tYXNrKSAhPSAwKQorCXsKKwkgIC8qIERvbid0IHVzZSBmb3IgcHJpbnRvdXQgdGhlIHZhcmlhbnRzIG9mIGRpdnVsIGFuZCBkaXZzbAorCSAgICAgdGhhdCBoYXZlIHRoZSBzYW1lIHJlZ2lzdGVyIG51bWJlciBpbiB0d28gcGxhY2VzLgorCSAgICAgVGhlIG1vcmUgZ2VuZXJhbCB2YXJpYW50cyB3aWxsIG1hdGNoIGluc3RlYWQuICAqLworCSAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQorCSAgICBpZiAoZFsxXSA9PSAnRCcpCisJICAgICAgYnJlYWs7CisKKwkgIC8qIERvbid0IHVzZSBmb3IgcHJpbnRvdXQgdGhlIHZhcmlhbnRzIG9mIG1vc3QgZmxvYXRpbmcKKwkgICAgIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyB3aGljaCB1c2UgdGhlIHNhbWUKKwkgICAgIHJlZ2lzdGVyIG51bWJlciBpbiB0d28gcGxhY2VzLCBhcyBhYm92ZS4gKi8KKwkgIGlmICgqZCA9PSAnXDAnKQorCSAgICBmb3IgKGQgPSBvcGMtPmFyZ3M7ICpkOyBkICs9IDIpCisJICAgICAgaWYgKGRbMV0gPT0gJ3QnKQorCQlicmVhazsKKworCSAgLyogRG9uJ3QgbWF0Y2ggZm1vdmVsIHdpdGggbW9yZSB0aGFuIG9uZSByZWdpc3Rlcjsgd2FpdCBmb3IKKyAgICAgICAgICAgICBmbW92ZW1sLiAgKi8KKwkgIGlmICgqZCA9PSAnXDAnKQorCSAgICB7CisJICAgICAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQorCQl7CisJCSAgaWYgKGRbMF0gPT0gJ3MnICYmIGRbMV0gPT0gJzgnKQorCQkgICAgeworCQkgICAgICBpbnQgdmFsOworCisJCSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBkWzFdLCAzLCBpbmZvKTsKKwkJICAgICAgaWYgKCh2YWwgJiAodmFsIC0gMSkpICE9IDApCisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIGlmICgqZCA9PSAnXDAnICYmIG1hdGNoID4gYmVzdG1hc2spCisJICAgIHsKKwkgICAgICBiZXN0ID0gb3BjOworCSAgICAgIGJlc3RtYXNrID0gbWF0Y2g7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmIChiZXN0ID09IDApCisgICAgZ290byBpbnZhbGlkOworCisgIC8qIFBvaW50IGF0IGZpcnN0IHdvcmQgb2YgYXJndW1lbnQgZGF0YSwKKyAgICAgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0IGFyZ3VtZW50LiAgKi8KKyAgcCA9IGJ1ZmZlciArIDI7CisgIAorICAvKiBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSBmaXhlZC1zaXplIHBvcnRpb24gb2YgdGhlIGluc3RydWN0aW9uIGlzLgorICAgICBUaGUgb25seSBwbGFjZSB0aGlzIGlzIHN0b3JlZCBpbiB0aGUgb3Bjb2RlIHRhYmxlIGlzCisgICAgIGluIHRoZSBhcmd1bWVudHMtLWxvb2sgZm9yIGFyZ3VtZW50cyB3aGljaCBzcGVjaWZ5IGZpZWxkcyBpbiB0aGUgMm5kCisgICAgIG9yIDNyZCB3b3JkcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBmb3IgKGQgPSBiZXN0LT5hcmdzOyAqZDsgZCArPSAyKQorICAgIHsKKyAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgaXQgaXMgbmVjZXNzYXJ5IHRvIGJlIGNoZWNraW5nIGRbMF0gaGVyZTsgSSBzdXNwZWN0CisJIGFsbCB0aGlzIGNvdWxkIGJlIG1vdmVkIHRvIHRoZSBjYXNlIHN0YXRlbWVudCBiZWxvdy4gICovCisgICAgICBpZiAoZFswXSA9PSAnIycpCisJeworCSAgaWYgKGRbMV0gPT0gJ2wnICYmIHAgLSBidWZmZXIgPCA2KQorCSAgICBwID0gYnVmZmVyICsgNjsKKwkgIGVsc2UgaWYgKHAgLSBidWZmZXIgPCA0ICYmIGRbMV0gIT0gJ0MnICYmIGRbMV0gIT0gJzgnICkKKwkgICAgcCA9IGJ1ZmZlciArIDQ7CisJfQorICAgICAgaWYgKChkWzBdID09ICdMJyB8fCBkWzBdID09ICdsJykgJiYgZFsxXSA9PSAndycgJiYgcCAtIGJ1ZmZlciA8IDQpCisJcCA9IGJ1ZmZlciArIDQ7CisgICAgICBzd2l0Y2ggKGRbMV0pCisJeworCWNhc2UgJzEnOgorCWNhc2UgJzInOgorCWNhc2UgJzMnOgorCWNhc2UgJzcnOgorCWNhc2UgJzgnOgorCWNhc2UgJzknOgorCWNhc2UgJ2knOgorCSAgaWYgKHAgLSBidWZmZXIgPCA0KQorCSAgICBwID0gYnVmZmVyICsgNDsKKwkgIGJyZWFrOworCWNhc2UgJzQnOgorCWNhc2UgJzUnOgorCWNhc2UgJzYnOgorCSAgaWYgKHAgLSBidWZmZXIgPCA2KQorCSAgICBwID0gYnVmZmVyICsgNjsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIHBmbHVzaGEgaXMgYW4gZXhjZXB0aW9ucy4gIEl0IHRha2VzIG5vIGFyZ3VtZW50cyBidXQgaXMgdHdvIHdvcmRzCisgICAgIGxvbmcuICBSZWNvZ25pemUgaXQgYnkgbG9va2luZyBhdCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgbWFzay4gICovCisgIGlmIChwIC0gYnVmZmVyIDwgNCAmJiAoYmVzdC0+bWF0Y2ggJiAweEZGRkYpICE9IDApCisgICAgcCA9IGJ1ZmZlciArIDQ7CisKKyAgLyogbHBzdG9wIGlzIGFub3RoZXIgZXhjZXB0aW9uLiAgSXQgdGFrZXMgYSBvbmUgd29yZCBhcmd1bWVudCBidXQgaXMKKyAgICAgdGhyZWUgd29yZHMgbG9uZy4gICovCisgIGlmIChwIC0gYnVmZmVyIDwgNgorICAgICAgJiYgKGJlc3QtPm1hdGNoICYgMHhmZmZmKSA9PSAweGZmZmYKKyAgICAgICYmIGJlc3QtPmFyZ3NbMF0gPT0gJyMnCisgICAgICAmJiBiZXN0LT5hcmdzWzFdID09ICd3JykKKyAgICB7CisgICAgICAvKiBDb3B5IHRoZSBvbmUgd29yZCBhcmd1bWVudCBpbnRvIHRoZSB1c3VhbCBsb2NhdGlvbiBmb3IgYSBvbmUKKwkgd29yZCBhcmd1bWVudCwgdG8gc2ltcGxpZnkgcHJpbnRpbmcgaXQuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aAorCSB0aGlzIGJlY2F1c2Ugd2Uga25vdyBleGFjdGx5IHdoYXQgdGhlIHNlY29uZCB3b3JkIGlzLCBhbmQgd2UKKwkgYXJlbid0IGdvaW5nIHRvIHByaW50IGFueXRoaW5nIGJhc2VkIG9uIGl0LiAgKi8KKyAgICAgIHAgPSBidWZmZXIgKyA2OworICAgICAgRkVUQ0hfREFUQSAoaW5mbywgcCk7CisgICAgICBidWZmZXJbMl0gPSBidWZmZXJbNF07CisgICAgICBidWZmZXJbM10gPSBidWZmZXJbNV07CisgICAgfQorCisgIEZFVENIX0RBVEEgKGluZm8sIHApOworICAKKyAgZCA9IGJlc3QtPmFyZ3M7CisKKyAgLyogV2UgY2FuIHRoZSBvcGVyYW5kcyB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIGRvbid0IHByaW50IGFueXRoaW5nLAorICAgICBidXQgbG9vayBmb3IgZXJyb3JzLiAqLworCisgIHNhdmVfcCA9IHA7CisgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IGR1bW15X3ByaW50X2FkZHJlc3M7CisgIGluZm8tPmZwcmludGZfZnVuYyA9IChmcHJpbnRmX2Z0eXBlKWR1bW15X3ByaW50ZXI7CisgIGZvciAoIDsgKmQ7IGQgKz0gMikKKyAgICB7CisgICAgICBpbnQgZWF0ZW4gPSBwcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwLCBtZW1hZGRyICsgKHAgLSBidWZmZXIpLCBpbmZvKTsKKyAgICAgIGlmIChlYXRlbiA+PSAwKQorCXAgKz0gZWF0ZW47CisgICAgICBlbHNlIGlmIChlYXRlbiA9PSAtMSkKKwlnb3RvIGludmFsaWQ7CisgICAgICBlbHNlCisJeworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKGluZm8tPnN0cmVhbSwKKwkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkJCV8oIjxpbnRlcm5hbCBlcnJvciBpbiBvcGNvZGUgdGFibGU6ICVzICVzPlxuIiksCisJCQkJYmVzdC0+bmFtZSwKKwkJCQliZXN0LT5hcmdzKTsKKwkgIGdvdG8gaW52YWxpZDsKKwl9CisKKyAgICB9CisgIHAgPSBzYXZlX3A7CisgIGluZm8tPmZwcmludGZfZnVuYyA9IHNhdmVfcHJpbnRlcjsKKyAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jID0gc2F2ZV9wcmludF9hZGRyZXNzOworCisgIGQgPSBiZXN0LT5hcmdzOworCisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBiZXN0LT5uYW1lKTsKKworICBpZiAoKmQpCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7CisKKyAgd2hpbGUgKCpkKQorICAgIHsKKyAgICAgIHAgKz0gcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcCwgbWVtYWRkciArIChwIC0gYnVmZmVyKSwgaW5mbyk7CisgICAgICBkICs9IDI7CisgICAgICBpZiAoKmQgJiYgKihkIC0gMikgIT0gJ0knICYmICpkICE9ICdrJykKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKyAgICB9CisgIHJldHVybiBwIC0gYnVmZmVyOworCisgaW52YWxpZDoKKyAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLworICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSBzYXZlX3ByaW50ZXI7CisgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IHNhdmVfcHJpbnRfYWRkcmVzczsKKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwJW8iLAorCQkJIChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV0pOworICByZXR1cm4gMjsKK30KKworLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgImVhdGVuIiBieSB0aGUgb3BlcmFuZCwgb3IKKyAgIHJldHVybiAtMSBpZiBhbiBpbnZhbGlkIG9wZXJhbmQgd2FzIGZvdW5kLCBvciAtMiBpZgorICAgYW4gb3Bjb2RlIHRhYmUgZXJyb3Igd2FzIGZvdW5kLiAqLworCitzdGF0aWMgaW50CitwcmludF9pbnNuX2FyZyAoZCwgYnVmZmVyLCBwMCwgYWRkciwgaW5mbykKKyAgICAgY29uc3QgY2hhciAqZDsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICB1bnNpZ25lZCBjaGFyICpwMDsKKyAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJlZ2lzdGVyIGludCB2YWwgPSAwOworICByZWdpc3RlciBpbnQgcGxhY2UgPSBkWzFdOworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwID0gcDA7CisgIGludCByZWdubzsKKyAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqcmVnbmFtZTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDE7CisgIGRvdWJsZSBmbHZhbDsKKyAgaW50IGZsdF9wOworICBiZmRfc2lnbmVkX3ZtYSBkaXNwOworICB1bnNpZ25lZCBpbnQgdXZhbDsKKworICBzd2l0Y2ggKCpkKQorICAgIHsKKyAgICBjYXNlICdjJzoJCS8qIGNhY2hlIGlkZW50aWZpZXIgKi8KKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGNoYXIgKmNvbnN0IGNhY2hlRmllbGROYW1lW10gPSB7ICJuYyIsICJkYyIsICJpYyIsICJiYyIgfTsKKyAgICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAyLCBpbmZvKTsKKyAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIGNhY2hlRmllbGROYW1lW3ZhbF0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgJ2EnOgkJLyogYWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiBDZi4gY2FzZSAnKycuICovCisgICAgICB7CisgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQorCSAgKGluZm8tPnN0cmVhbSwKKwkgICAiJXNAIiwKKwkgICByZWdfbmFtZXMgW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgY2FzZSAnXyc6CQkvKiAzMi1iaXQgYWJzb2x1dGUgYWRkcmVzcyBmb3IgbW92ZTE2LiAqLworICAgICAgeworICAgICAgICB1dmFsID0gTkVYVFVMT05HIChwKTsKKwkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHV2YWwsIGluZm8pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgJ0MnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWNjciIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdTJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzciIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdVJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV1c3AiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnSic6CisgICAgICB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGludCB2YWx1ZTsgfSBuYW1lc1tdCisJICA9IHt7IiVzZmMiLCAweDAwMH0sIHsiJWRmYyIsIDB4MDAxfSwgeyIlY2FjciIsIDB4MDAyfSwKKwkgICAgIHsiJXRjIiwgIDB4MDAzfSwgeyIlaXR0MCIsMHgwMDR9LCB7IiVpdHQxIiwgMHgwMDV9LAorICAgICAgICAgICAgIHsiJWR0dDAiLDB4MDA2fSwgeyIlZHR0MSIsMHgwMDd9LCB7IiVidXNjciIsMHgwMDh9LAorCSAgICAgeyIldXNwIiwgMHg4MDB9LCB7IiV2YnIiLCAweDgwMX0sIHsiJWNhYXIiLCAweDgwMn0sCisJICAgICB7IiVtc3AiLCAweDgwM30sIHsiJWlzcCIsIDB4ODA0fSwKKworCSAgICAgLyogU2hvdWxkIHdlIGJlIGNhbGxpbmcgdGhpcyBwc3IgbGlrZSB3ZSBkbyBpbiBjYXNlICdZJz8gICovCisJICAgICB7IiVtbXVzciIsMHg4MDV9LAorCisgICAgICAgICAgICAgeyIldXJwIiwgMHg4MDZ9LCB7IiVzcnAiLCAweDgwN30sIHsiJXBjciIsIDB4ODA4fX07CisKKwl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDEyLCBpbmZvKTsKKwlmb3IgKHJlZ25vID0gc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdIC0gMTsgcmVnbm8gPj0gMDsgcmVnbm8tLSkKKwkgIGlmIChuYW1lc1tyZWdub10udmFsdWUgPT0gdmFsKQorCSAgICB7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWVzW3JlZ25vXS5uYW1lKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCWlmIChyZWdubyA8IDApCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUSc6CisgICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOworICAgICAgLyogMCBtZWFucyA4LCBleGNlcHQgZm9yIHRoZSBia3B0IGluc3RydWN0aW9uLi4uICovCisgICAgICBpZiAodmFsID09IDAgJiYgZFsxXSAhPSAncycpCisJdmFsID0gODsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnTSc6CisgICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDgsIGluZm8pOworICAgICAgaWYgKHZhbCAmIDB4ODApCisJdmFsID0gdmFsIC0gMHgxMDA7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1QnOgorICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCSAgICAgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyldKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQSc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKKwkoaW5mby0+c3RyZWFtLCAiJXMiLAorCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDAxMF0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdSJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQorCShpbmZvLT5zdHJlYW0sICIlcyIsCisJIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3InOgorICAgICAgcmVnbm8gPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDQsIGluZm8pOworICAgICAgaWYgKHJlZ25vID4gNykKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCIsIHJlZ19uYW1lc1tyZWdub10pOworICAgICAgZWxzZQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCglcykiLCByZWdfbmFtZXNbcmVnbm9dKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRic6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKKwkoaW5mby0+c3RyZWFtLCAiJSVmcCVkIiwKKwkgZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ08nOgorICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA2LCBpbmZvKTsKKyAgICAgIGlmICh2YWwgJiAweDIwKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXMgW3ZhbCAmIDddKTsKKyAgICAgIGVsc2UKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKyc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKKwkoaW5mby0+c3RyZWFtLCAiJXNAKyIsCisJIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICctJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQorCShpbmZvLT5zdHJlYW0sICIlc0AtIiwKKwkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2snOgorICAgICAgaWYgKHBsYWNlID09ICdrJykKKwkoKmluZm8tPmZwcmludGZfZnVuYykKKwkgIChpbmZvLT5zdHJlYW0sICJ7JXN9IiwKKwkgICByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKV0pOworICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ0MnKQorCXsKKwkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNywgaW5mbyk7CisJICBpZiAoIHZhbCA+IDYzICkJCS8qIFRoaXMgaXMgYSBzaWduZWQgY29uc3RhbnQuICovCisJICAgIHZhbCAtPSAxMjg7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInsjJWR9IiwgdmFsKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIC0yOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcjJzoKKyAgICBjYXNlICdeJzoKKyAgICAgIHAxID0gYnVmZmVyICsgKCpkID09ICcjJyA/IDIgOiA0KTsKKyAgICAgIGlmIChwbGFjZSA9PSAncycpCisJdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKKyAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdDJykKKwl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDcsIGluZm8pOworICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJzgnKQorCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyk7CisgICAgICBlbHNlIGlmIChwbGFjZSA9PSAnMycpCisJdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKKyAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdiJykKKwl2YWwgPSBORVhUQllURSAocDEpOworICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ3cnIHx8IHBsYWNlID09ICdXJykKKwl2YWwgPSBORVhUV09SRCAocDEpOworICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2wnKQorCXZhbCA9IE5FWFRMT05HIChwMSk7CisgICAgICBlbHNlCisJcmV0dXJuIC0yOworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdCJzoKKyAgICAgIGlmIChwbGFjZSA9PSAnYicpCisJZGlzcCA9IE5FWFRCWVRFIChwKTsKKyAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdCJykKKwlkaXNwID0gQ09FUkNFX1NJR05FRF9DSEFSKGJ1ZmZlclsxXSk7CisgICAgICBlbHNlIGlmIChwbGFjZSA9PSAndycgfHwgcGxhY2UgPT0gJ1cnKQorCWRpc3AgPSBORVhUV09SRCAocCk7CisgICAgICBlbHNlIGlmIChwbGFjZSA9PSAnbCcgfHwgcGxhY2UgPT0gJ0wnIHx8IHBsYWNlID09ICdDJykKKwlkaXNwID0gTkVYVExPTkcgKHApOworICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2cnKQorCXsKKwkgIGRpc3AgPSBORVhUQllURSAoYnVmZmVyKTsKKwkgIGlmIChkaXNwID09IDApCisJICAgIGRpc3AgPSBORVhUV09SRCAocCk7CisJICBlbHNlIGlmIChkaXNwID09IC0xKQorCSAgICBkaXNwID0gTkVYVExPTkcgKHApOworCX0KKyAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdjJykKKwl7CisJICBpZiAoYnVmZmVyWzFdICYgMHg0MCkJCS8qIElmIGJpdCBzaXggaXMgb25lLCBsb25nIG9mZnNldCAqLworCSAgICBkaXNwID0gTkVYVExPTkcgKHApOworCSAgZWxzZQorCSAgICBkaXNwID0gTkVYVFdPUkQgKHApOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gLTI7CisKKyAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIGRpc3AsIGluZm8pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgIHZhbCA9IE5FWFRXT1JEIChwKTsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQorCShpbmZvLT5zdHJlYW0sICIlc0AoJWQpIiwKKwkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyA4XSwgdmFsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncyc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCSAgICAgZnBjcl9uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0knOgorICAgICAgLyogR2V0IGNvcHJvY2Vzc29yIElELi4uICovCisgICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ2QnLCAzLCBpbmZvKTsKKyAgICAgIAorICAgICAgaWYgKHZhbCAhPSAxKQkJCQkvKiBVbnVzdWFsIGNvcHJvY2Vzc29yIElEPyAqLworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKGNwaWQ9JWQpICIsIHZhbCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyonOgorICAgIGNhc2UgJ34nOgorICAgIGNhc2UgJyUnOgorICAgIGNhc2UgJzsnOgorICAgIGNhc2UgJ0AnOgorICAgIGNhc2UgJyEnOgorICAgIGNhc2UgJyQnOgorICAgIGNhc2UgJz8nOgorICAgIGNhc2UgJy8nOgorICAgIGNhc2UgJyYnOgorICAgIGNhc2UgJ3wnOgorICAgIGNhc2UgJzwnOgorICAgIGNhc2UgJz4nOgorICAgIGNhc2UgJ20nOgorICAgIGNhc2UgJ24nOgorICAgIGNhc2UgJ28nOgorICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ3EnOgorICAgIGNhc2UgJ3YnOgorCisgICAgICBpZiAocGxhY2UgPT0gJ2QnKQorCXsKKwkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAneCcsIDYsIGluZm8pOworCSAgdmFsID0gKCh2YWwgJiA3KSA8PCAzKSArICgodmFsID4+IDMpICYgNyk7CisJfQorICAgICAgZWxzZQorCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCAncycsIDYsIGluZm8pOworCisgICAgICAvKiBHZXQgcmVnaXN0ZXIgbnVtYmVyIGFzc3VtaW5nIGFkZHJlc3MgcmVnaXN0ZXIuICAqLworICAgICAgcmVnbm8gPSAodmFsICYgNykgKyA4OworICAgICAgcmVnbmFtZSA9IHJlZ19uYW1lc1tyZWdub107CisgICAgICBzd2l0Y2ggKHZhbCA+PiAzKQorCXsKKwljYXNlIDA6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzW3ZhbF0pOworCSAgYnJlYWs7CisKKwljYXNlIDE6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnbmFtZSk7CisJICBicmVhazsKKworCWNhc2UgMjoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAIiwgcmVnbmFtZSk7CisJICBicmVhazsKKworCWNhc2UgMzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKyIsIHJlZ25hbWUpOworCSAgYnJlYWs7CisKKwljYXNlIDQ6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQC0iLCByZWduYW1lKTsKKwkgIGJyZWFrOworCisJY2FzZSA1OgorCSAgdmFsID0gTkVYVFdPUkQgKHApOworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AoJWQpIiwgcmVnbmFtZSwgdmFsKTsKKwkgIGJyZWFrOworCisJY2FzZSA2OgorCSAgcCA9IHByaW50X2luZGV4ZWQgKHJlZ25vLCBwLCBhZGRyLCBpbmZvKTsKKwkgIGJyZWFrOworCisJY2FzZSA3OgorCSAgc3dpdGNoICh2YWwgJiA3KQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICB2YWwgPSBORVhUV09SRCAocCk7CisJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgMToKKwkgICAgICB1dmFsID0gTkVYVFVMT05HIChwKTsKKwkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHV2YWwsIGluZm8pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgMjoKKwkgICAgICB2YWwgPSBORVhUV09SRCAocCk7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXBjQCgiKTsKKwkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyB2YWwsIGluZm8pOworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgMzoKKwkgICAgICBwID0gcHJpbnRfaW5kZXhlZCAoLTEsIHAsIGFkZHIsIGluZm8pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgNDoKKwkgICAgICBmbHRfcCA9IDE7CS8qIEFzc3VtZSBpdCdzIGEgZmxvYXQuLi4gKi8KKwkgICAgICBzd2l0Y2goIHBsYWNlICkKKwkgICAgICB7CisJCWNhc2UgJ2InOgorCQkgIHZhbCA9IE5FWFRCWVRFIChwKTsKKwkJICBmbHRfcCA9IDA7CisJCSAgYnJlYWs7CisKKwkJY2FzZSAndyc6CisJCSAgdmFsID0gTkVYVFdPUkQgKHApOworCQkgIGZsdF9wID0gMDsKKwkJICBicmVhazsKKworCQljYXNlICdsJzoKKwkJICB2YWwgPSBORVhUTE9ORyAocCk7CisJCSAgZmx0X3AgPSAwOworCQkgIGJyZWFrOworCisJCWNhc2UgJ2YnOgorCQkgIE5FWFRTSU5HTEUoZmx2YWwsIHApOworCQkgIGJyZWFrOworCisJCWNhc2UgJ0YnOgorCQkgIE5FWFRET1VCTEUoZmx2YWwsIHApOworCQkgIGJyZWFrOworCisJCWNhc2UgJ3gnOgorCQkgIE5FWFRFWFRFTkQoZmx2YWwsIHApOworCQkgIGJyZWFrOworCisJCWNhc2UgJ3AnOgorCQkgIGZsdmFsID0gTkVYVFBBQ0tFRChwKTsKKwkJICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgIHJldHVybiAtMTsKKwkgICAgICB9CisJICAgICAgaWYgKCBmbHRfcCApCS8qIFByaW50IGEgZmxvYXQ/ICovCisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVnIiwgZmx2YWwpOworCSAgICAgIGVsc2UKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjJWQiLCB2YWwpOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdMJzoKKyAgICBjYXNlICdsJzoKKwlpZiAocGxhY2UgPT0gJ3cnKQorCSAgeworCSAgICBjaGFyIGRvbmVhbnk7CisJICAgIHAxID0gYnVmZmVyICsgMjsKKwkgICAgdmFsID0gTkVYVFdPUkQgKHAxKTsKKwkgICAgLyogTW92ZSB0aGUgcG9pbnRlciBhaGVhZCBpZiB0aGlzIHBvaW50IGlzIGZhcnRoZXIgYWhlYWQKKwkgICAgICAgdGhhbiB0aGUgbGFzdC4gICovCisJICAgIHAgPSBwMSA+IHAgPyBwMSA6IHA7CisJICAgIGlmICh2YWwgPT0gMCkKKwkgICAgICB7CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIzAiKTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBpZiAoKmQgPT0gJ2wnKQorCSAgICAgIHsKKwkJcmVnaXN0ZXIgaW50IG5ld3ZhbCA9IDA7CisJCWZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyArK3JlZ25vKQorCQkgIGlmICh2YWwgJiAoMHg4MDAwID4+IHJlZ25vKSkKKwkJICAgIG5ld3ZhbCB8PSAxIDw8IHJlZ25vOworCQl2YWwgPSBuZXd2YWw7CisJICAgICAgfQorCSAgICB2YWwgJj0gMHhmZmZmOworCSAgICBkb25lYW55ID0gMDsKKwkgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgMTY7ICsrcmVnbm8pCisJICAgICAgaWYgKHZhbCAmICgxIDw8IHJlZ25vKSkKKwkJeworCQkgIGludCBmaXJzdF9yZWdubzsKKwkJICBpZiAoZG9uZWFueSkKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyIpOworCQkgIGRvbmVhbnkgPSAxOworCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbcmVnbm9dKTsKKwkJICBmaXJzdF9yZWdubyA9IHJlZ25vOworCQkgIHdoaWxlICh2YWwgJiAoMSA8PCAocmVnbm8gKyAxKSkpCisJCSAgICArK3JlZ25vOworCQkgIGlmIChyZWdubyA+IGZpcnN0X3JlZ25vKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXMiLAorCQkJCQkgICByZWdfbmFtZXNbcmVnbm9dKTsKKwkJfQorCSAgfQorCWVsc2UgaWYgKHBsYWNlID09ICczJykKKwkgIHsKKwkgICAgLyogYGZtb3ZlbScgaW5zbi4gICovCisJICAgIGNoYXIgZG9uZWFueTsKKwkgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA4LCBpbmZvKTsKKwkgICAgaWYgKHZhbCA9PSAwKQorCSAgICAgIHsKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjMCIpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGlmICgqZCA9PSAnbCcpCisJICAgICAgeworCQlyZWdpc3RlciBpbnQgbmV3dmFsID0gMDsKKwkJZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgODsgKytyZWdubykKKwkJICBpZiAodmFsICYgKDB4ODAgPj4gcmVnbm8pKQorCQkgICAgbmV3dmFsIHw9IDEgPDwgcmVnbm87CisJCXZhbCA9IG5ld3ZhbDsKKwkgICAgICB9CisJICAgIHZhbCAmPSAweGZmOworCSAgICBkb25lYW55ID0gMDsKKwkgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgODsgKytyZWdubykKKwkgICAgICBpZiAodmFsICYgKDEgPDwgcmVnbm8pKQorCQl7CisJCSAgaW50IGZpcnN0X3JlZ25vOworCQkgIGlmIChkb25lYW55KQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIvIik7CisJCSAgZG9uZWFueSA9IDE7CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWZwJWQiLCByZWdubyk7CisJCSAgZmlyc3RfcmVnbm8gPSByZWdubzsKKwkJICB3aGlsZSAodmFsICYgKDEgPDwgKHJlZ25vICsgMSkpKQorCQkgICAgKytyZWdubzsKKwkJICBpZiAocmVnbm8gPiBmaXJzdF9yZWdubykKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSUlZnAlZCIsIHJlZ25vKTsKKwkJfQorCSAgfQorCWVsc2UgaWYgKHBsYWNlID09ICc4JykKKwkgIHsKKwkgICAgLyogZm1vdmVtbCBmb3IgRlAgc3RhdHVzIHJlZ2lzdGVycyAqLworCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCQkgICBmcGNyX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywKKwkJCQkJCQkgaW5mbyldKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gLTI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1gnOgorICAgICAgcGxhY2UgPSAnOCc7CisgICAgY2FzZSAnWSc6CisgICAgY2FzZSAnWic6CisgICAgY2FzZSAnVyc6CisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgICB7CisJaW50IHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7CisJY2hhciAqbmFtZSA9IDA7CisJc3dpdGNoICh2YWwpCisJICB7CisJICBjYXNlIDI6IG5hbWUgPSAiJXR0MCI7IGJyZWFrOworCSAgY2FzZSAzOiBuYW1lID0gIiV0dDEiOyBicmVhazsKKwkgIGNhc2UgMHgxMDogbmFtZSA9ICIldGMiOyBicmVhazsKKwkgIGNhc2UgMHgxMTogbmFtZSA9ICIlZHJwIjsgYnJlYWs7CisJICBjYXNlIDB4MTI6IG5hbWUgPSAiJXNycCI7IGJyZWFrOworCSAgY2FzZSAweDEzOiBuYW1lID0gIiVjcnAiOyBicmVhazsKKwkgIGNhc2UgMHgxNDogbmFtZSA9ICIlY2FsIjsgYnJlYWs7CisJICBjYXNlIDB4MTU6IG5hbWUgPSAiJXZhbCI7IGJyZWFrOworCSAgY2FzZSAweDE2OiBuYW1lID0gIiVzY2MiOyBicmVhazsKKwkgIGNhc2UgMHgxNzogbmFtZSA9ICIlYWMiOyBicmVhazsKKyAJICBjYXNlIDB4MTg6IG5hbWUgPSAiJXBzciI7IGJyZWFrOworCSAgY2FzZSAweDE5OiBuYW1lID0gIiVwY3NyIjsgYnJlYWs7CisJICBjYXNlIDB4MWM6CisJICBjYXNlIDB4MWQ6CisJICAgIHsKKwkgICAgICBpbnQgYnJlYWtfcmVnID0gKChidWZmZXJbM10gPj4gMikgJiA3KTsKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKKwkJKGluZm8tPnN0cmVhbSwgdmFsID09IDB4MWMgPyAiJSViYWQlZCIgOiAiJSViYWMlZCIsCisJCSBicmVha19yZWcpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI8bW11IHJlZ2lzdGVyICVkPiIsIHZhbCk7CisJICB9CisJaWYgKG5hbWUpCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2YnOgorICAgICAgeworCWludCBmYyA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7CisJaWYgKGZjID09IDEpCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlZGZjIik7CisJZWxzZSBpZiAoZmMgPT0gMCkKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVzZmMiKTsKKwllbHNlCisJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oIjxmdW5jdGlvbiBjb2RlICVkPiIpLCBmYyk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1YnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJXZhbCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd0JzoKKyAgICAgIHsKKwlpbnQgbGV2ZWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBsZXZlbCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgIHJldHVybiBwIC0gcDA7Cit9CisKKy8qIEZldGNoIEJJVFMgYml0cyBmcm9tIGEgcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBDT0RFLgorICAgQ09ERSBpcyBhICJwbGFjZSB0byBwdXQgYW4gYXJndW1lbnQiLCBvciAneCcgZm9yIGEgZGVzdGluYXRpb24KKyAgIHRoYXQgaXMgYSBnZW5lcmFsIGFkZHJlc3MgKG1vZGUgYW5kIHJlZ2lzdGVyKS4KKyAgIEJVRkZFUiBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgaW50CitmZXRjaF9hcmcgKGJ1ZmZlciwgY29kZSwgYml0cywgaW5mbykKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgY29kZTsKKyAgICAgaW50IGJpdHM7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJlZ2lzdGVyIGludCB2YWwgPSAwOworICBzd2l0Y2ggKGNvZGUpCisgICAgeworICAgIGNhc2UgJ3MnOgorICAgICAgdmFsID0gYnVmZmVyWzFdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoJCQkvKiBEZXN0aW5hdGlvbiwgZm9yIHJlZ2lzdGVyIG9yIHF1aWNrLiAgKi8KKyAgICAgIHZhbCA9IChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV07CisgICAgICB2YWwgPj49IDk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3gnOgkJCS8qIERlc3RpbmF0aW9uLCBmb3IgZ2VuZXJhbCBhcmcgKi8KKyAgICAgIHZhbCA9IChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV07CisgICAgICB2YWwgPj49IDY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2snOgorICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7CisgICAgICB2YWwgPSAoYnVmZmVyWzNdID4+IDQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdDJzoKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOworICAgICAgdmFsID0gYnVmZmVyWzNdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcxJzoKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOworICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKKyAgICAgIHZhbCA+Pj0gMTI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzInOgorICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7CisgICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOworICAgICAgdmFsID4+PSA2OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICdqJzoKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOworICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnNCc6CisgICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKKyAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07CisgICAgICB2YWwgPj49IDEyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc1JzoKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOworICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKKyAgICAgIHZhbCA+Pj0gNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnNic6CisgICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKKyAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzcnOgorICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7CisgICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOworICAgICAgdmFsID4+PSA3OworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlICc4JzoKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOworICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKKyAgICAgIHZhbCA+Pj0gMTA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzknOgorICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7CisgICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOworICAgICAgdmFsID4+PSA1OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdlJzoKKyAgICAgIHZhbCA9IChidWZmZXJbMV0gPj4gNik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgc3dpdGNoIChiaXRzKQorICAgIHsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gdmFsICYgMzsKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdmFsICYgNzsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gdmFsICYgMDE3OworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiB2YWwgJiAwMzc7CisgICAgY2FzZSA2OgorICAgICAgcmV0dXJuIHZhbCAmIDA3NzsKKyAgICBjYXNlIDc6CisgICAgICByZXR1cm4gdmFsICYgMDE3NzsKKyAgICBjYXNlIDg6CisgICAgICByZXR1cm4gdmFsICYgMDM3NzsKKyAgICBjYXNlIDEyOgorICAgICAgcmV0dXJuIHZhbCAmIDA3Nzc3OworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFByaW50IGFuIGluZGV4ZWQgYXJndW1lbnQuICBUaGUgYmFzZSByZWdpc3RlciBpcyBCQVNFUkVHICgtMSBmb3IgcGMpLgorICAgUCBwb2ludHMgdG8gZXh0ZW5zaW9uIHdvcmQsIGluIGJ1ZmZlci4KKyAgIEFERFIgaXMgdGhlIG5vbWluYWwgY29yZSBhZGRyZXNzIG9mIHRoYXQgZXh0ZW5zaW9uIHdvcmQuICAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitwcmludF9pbmRleGVkIChiYXNlcmVnLCBwLCBhZGRyLCBpbmZvKQorICAgICBpbnQgYmFzZXJlZzsKKyAgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICByZWdpc3RlciBpbnQgd29yZDsKKyAgc3RhdGljIGNoYXIgKmNvbnN0IHNjYWxlc1tdID0geyIiLCAiOjIiLCAiOjQiLCAiOjgifTsKKyAgYmZkX3ZtYSBiYXNlX2Rpc3A7CisgIGJmZF92bWEgb3V0ZXJfZGlzcDsKKyAgY2hhciBidWZbNDBdOworICBjaGFyIHZtYWJ1Zls1MF07CisKKyAgd29yZCA9IE5FWFRXT1JEIChwKTsKKworICAvKiBHZW5lcmF0ZSB0aGUgdGV4dCBmb3IgdGhlIGluZGV4IHJlZ2lzdGVyLgorICAgICBXaGVyZSB0aGlzIHdpbGwgYmUgb3V0cHV0IGlzIG5vdCB5ZXQgZGV0ZXJtaW5lZC4gICovCisgIHNwcmludGYgKGJ1ZiwgIiVzOiVjJXMiLAorCSAgIHJlZ19uYW1lc1sod29yZCA+PiAxMikgJiAweGZdLAorCSAgICh3b3JkICYgMHg4MDApID8gJ2wnIDogJ3cnLAorCSAgIHNjYWxlc1sod29yZCA+PiA5KSAmIDNdKTsKKworICAvKiBIYW5kbGUgdGhlIDY4MDAwIHN0eWxlIG9mIGluZGV4aW5nLiAgKi8KKworICBpZiAoKHdvcmQgJiAweDEwMCkgPT0gMCkKKyAgICB7CisgICAgICBiYXNlX2Rpc3AgPSB3b3JkICYgMHhmZjsKKyAgICAgIGlmICgoYmFzZV9kaXNwICYgMHg4MCkgIT0gMCkKKwliYXNlX2Rpc3AgLT0gMHgxMDA7CisgICAgICBpZiAoYmFzZXJlZyA9PSAtMSkKKwliYXNlX2Rpc3AgKz0gYWRkcjsKKyAgICAgIHByaW50X2Jhc2UgKGJhc2VyZWcsIGJhc2VfZGlzcCwgaW5mbyk7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcykiLCBidWYpOworICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgIC8qIEhhbmRsZSB0aGUgZ2VuZXJhbGl6ZWQga2luZC4gICovCisgIC8qIEZpcnN0LCBjb21wdXRlIHRoZSBkaXNwbGFjZW1lbnQgdG8gYWRkIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLiAgKi8KKworICBpZiAod29yZCAmIDAyMDApCisgICAgeworICAgICAgaWYgKGJhc2VyZWcgPT0gLTEpCisJYmFzZXJlZyA9IC0zOworICAgICAgZWxzZQorCWJhc2VyZWcgPSAtMjsKKyAgICB9CisgIGlmICh3b3JkICYgMDEwMCkKKyAgICBidWZbMF0gPSAnXDAnOworICBiYXNlX2Rpc3AgPSAwOworICBzd2l0Y2ggKCh3b3JkID4+IDQpICYgMykKKyAgICB7CisgICAgY2FzZSAyOgorICAgICAgYmFzZV9kaXNwID0gTkVYVFdPUkQgKHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgYmFzZV9kaXNwID0gTkVYVExPTkcgKHApOworICAgIH0KKyAgaWYgKGJhc2VyZWcgPT0gLTEpCisgICAgYmFzZV9kaXNwICs9IGFkZHI7CisKKyAgLyogSGFuZGxlIHNpbmdsZS1sZXZlbCBjYXNlIChub3QgaW5kaXJlY3QpICovCisKKyAgaWYgKCh3b3JkICYgNykgPT0gMCkKKyAgICB7CisgICAgICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOworICAgICAgaWYgKGJ1ZlswXSAhPSAnXDAnKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOworICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgIC8qIFR3byBsZXZlbC4gIENvbXB1dGUgZGlzcGxhY2VtZW50IHRvIGFkZCBhZnRlciBpbmRpcmVjdGlvbi4gICovCisKKyAgb3V0ZXJfZGlzcCA9IDA7CisgIHN3aXRjaCAod29yZCAmIDMpCisgICAgeworICAgIGNhc2UgMjoKKyAgICAgIG91dGVyX2Rpc3AgPSBORVhUV09SRCAocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBvdXRlcl9kaXNwID0gTkVYVExPTkcgKHApOworICAgIH0KKworICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOworICBpZiAoKHdvcmQgJiA0KSA9PSAwICYmIGJ1ZlswXSAhPSAnXDAnKQorICAgIHsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgYnVmKTsKKyAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgfQorICBzcHJpbnRmX3ZtYSAodm1hYnVmLCBvdXRlcl9kaXNwKTsKKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpQCglcyIsIHZtYWJ1Zik7CisgIGlmIChidWZbMF0gIT0gJ1wwJykKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7CisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOworCisgIHJldHVybiBwOworfQorCisvKiBQcmludCBhIGJhc2UgcmVnaXN0ZXIgUkVHTk8gYW5kIGRpc3BsYWNlbWVudCBESVNQLCBvbiBJTkZPLT5TVFJFQU0uCisgICBSRUdOTyA9IC0xIGZvciBwYywgLTIgZm9yIG5vbmUgKHN1cHByZXNzZWQpLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2Jhc2UgKHJlZ25vLCBkaXNwLCBpbmZvKQorICAgICBpbnQgcmVnbm87CisgICAgIGJmZF92bWEgZGlzcDsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVwY0AoIik7CisgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGRpc3AsIGluZm8pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzUwXTsKKworICAgICAgaWYgKHJlZ25vID09IC0yKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IC0zKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV6cGNAKCIpOworICAgICAgZWxzZQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKCIsIHJlZ19uYW1lc1tyZWdub10pOworCisgICAgICBzcHJpbnRmX3ZtYSAoYnVmLCBkaXNwKTsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBidWYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbTY4ay1vcGMuYyBiL29wY29kZXMvbTY4ay1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWUxYjhkCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tNjhrLW9wYy5jCkBAIC0wLDAgKzEsMjA5MCBAQAorLyogT3Bjb2RlIHRhYmxlIGZvciBtNjgwWzAxMjM0Nl0wL202ODg4WzEyXS9tNjg4NTEvbWNmNTIwMC4KKyAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCisKKyNkZWZpbmUgb25lKHgpICgodW5zaWduZWQgaW50KSAoeCkgPDwgMTYpCisjZGVmaW5lIHR3byh4LCB5KSAoKCh1bnNpZ25lZCBpbnQpICh4KSA8PCAxNikgKyAoeSkpCisKKy8qIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QKKyAgIGJlIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0CisgICBydW50aW1lLiAgKi8KKworY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlIG02OGtfb3Bjb2Rlc1tdID0KK3sKK3siYWJjZCIsCW9uZSgwMTQwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCit7ImFiY2QiLAlvbmUoMDE0MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAorCit7ImFkZGF3IiwJb25lKDAxNTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKK3siYWRkYWwiLAlvbmUoMDE1MDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJhZGRpYiIsCW9uZSgwMDAzMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7ImFkZGl3IiwJb25lKDAwMDMxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKK3siYWRkaWwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoreyJhZGRpbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKKworeyJhZGRxYiIsCW9uZSgwMDUwMDAwKSwJb25lKDAxNzA3MDApLCAiUWQkYiIsIG02ODAwMHVwIH0sCit7ImFkZHF3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKK3siYWRkcWwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworLyogVGhlIGFkZCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBhZGRhLCBhZGRpLCBhbmQgYWRkcSBpbnN0cnVjdGlvbnMuICAqLworeyJhZGRiIiwJb25lKDAwNTAwMDApLAlvbmUoMDE3MDcwMCksICJRZCRiIiwgbTY4MDAwdXAgfSwKK3siYWRkYiIsCW9uZSgwMDAzMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7ImFkZGIiLAlvbmUoMDE1MDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoreyJhZGRiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDcwMCksICJEZH5iIiwgbTY4MDAwdXAgfSwKK3siYWRkdyIsCW9uZSgwMDUwMTAwKSwJb25lKDAxNzA3MDApLCAiUWQldyIsIG02ODAwMHVwIH0sCit7ImFkZHciLAlvbmUoMDE1MDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoreyJhZGR3IiwJb25lKDAwMDMxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKK3siYWRkdyIsCW9uZSgwMTUwMTAwKSwJb25lKDAxNzA3MDApLCAiKndEZCIsIG02ODAwMHVwIH0sCit7ImFkZHciLAlvbmUoMDE1MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAoreyJhZGRsIiwJb25lKDAwNTAyMDApLAlvbmUoMDE3MDcwMCksICJRZCVsIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImFkZGwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoreyJhZGRsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmNTIwMCB9LAoreyJhZGRsIiwJb25lKDAxNTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImFkZGwiLAlvbmUoMDE1MDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYWRkbCIsCW9uZSgwMTUwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+bCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7ImFkZHhiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKK3siYWRkeGIiLAlvbmUoMDE1MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoreyJhZGR4dyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCit7ImFkZHh3IiwJb25lKDAxNTA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKK3siYWRkeGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYWRkeGwiLAlvbmUoMDE1MDYxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAorCit7ImFuZGliIiwJb25lKDAwMDEwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKK3siYW5kaWIiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJhbmRpdyIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCit7ImFuZGl3IiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKK3siYW5kaWwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoreyJhbmRpbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKK3siYW5kaSIsCW9uZSgwMDAxMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCit7ImFuZGkiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJhbmRpIiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKKworLyogVGhlIGFuZCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBhbmRpIGluc3RydWN0aW9uLiAgKi8KK3siYW5kYiIsCW9uZSgwMDAxMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7ImFuZGIiLAlvbmUoMDAwMTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJhbmRiIiwJb25lKDAxNDAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKK3siYW5kYiIsCW9uZSgwMTQwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+YiIsIG02ODAwMHVwIH0sCit7ImFuZHciLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoreyJhbmR3IiwJb25lKDAwMDExNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKK3siYW5kdyIsCW9uZSgwMTQwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCit7ImFuZHciLAlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnciLCBtNjgwMDB1cCB9LAoreyJhbmRsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKK3siYW5kbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKK3siYW5kbCIsCW9uZSgwMTQwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJhbmRsIiwJb25lKDAxNDA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5sIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImFuZCIsCQlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHciLCBtNjgwMDB1cCB9LAoreyJhbmQiLAkJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKK3siYW5kIiwJCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCit7ImFuZCIsCQlvbmUoMDE0MDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoreyJhbmQiLAkJb25lKDAxNDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKKworeyJhc2xiIiwJb25lKDAxNjA0MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKK3siYXNsYiIsCW9uZSgwMTYwNDQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCit7ImFzbHciLAlvbmUoMDE2MDUwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJhc2x3IiwJb25lKDAxNjA1NDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKK3siYXNsdyIsCW9uZSgwMTYwNzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCit7ImFzbGwiLAlvbmUoMDE2MDYwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYXNsbCIsCW9uZSgwMTYwNjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7ImFzcmIiLAlvbmUoMDE2MDAwMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJhc3JiIiwJb25lKDAxNjAwNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKK3siYXNydyIsCW9uZSgwMTYwMTAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7ImFzcnciLAlvbmUoMDE2MDE0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJhc3J3IiwJb25lKDAxNjAzMDApLAlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKK3siYXNybCIsCW9uZSgwMTYwMjAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJhc3JsIiwJb25lKDAxNjAyNDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKK3siYmhpdyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmxzdyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmNjdyIsCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmNzdyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYm5ldyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmVxdyIsCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYnZjdyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYnZzdyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYnBsdyIsCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYm1pdyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmdldyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmx0dyIsCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmd0dyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmxldyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJiaGlsIiwJb25lKDAwNjEzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siYmxzbCIsCW9uZSgwMDYxNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7ImJjY2wiLAlvbmUoMDA2MjM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJiY3NsIiwJb25lKDAwNjI3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siYm5lbCIsCW9uZSgwMDYzMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7ImJlcWwiLAlvbmUoMDA2Mzc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJidmNsIiwJb25lKDAwNjQzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siYnZzbCIsCW9uZSgwMDY0Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7ImJwbGwiLAlvbmUoMDA2NTM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJibWlsIiwJb25lKDAwNjU3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siYmdlbCIsCW9uZSgwMDY2Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7ImJsdGwiLAlvbmUoMDA2Njc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJiZ3RsIiwJb25lKDAwNjczNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siYmxlbCIsCW9uZSgwMDY3Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCisKK3siYmhpcyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmxzcyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmNjcyIsCW9uZSgwMDYyMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmNzcyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYm5lcyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmVxcyIsCW9uZSgwMDYzNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYnZjcyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYnZzcyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYnBscyIsCW9uZSgwMDY1MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYm1pcyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmdlcyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmx0cyIsCW9uZSgwMDY2NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmd0cyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmxlcyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJqaGkiLAkJb25lKDAwNjEwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqbHMiLAkJb25lKDAwNjE0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqY2MiLAkJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqY3MiLAkJb25lKDAwNjI0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqbmUiLAkJb25lKDAwNjMwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqZXEiLAkJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqdmMiLAkJb25lKDAwNjQwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqdnMiLAkJb25lKDAwNjQ0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqcGwiLAkJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqbWkiLAkJb25lKDAwNjU0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqZ2UiLAkJb25lKDAwNjYwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqbHQiLAkJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqZ3QiLAkJb25lKDAwNjcwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJqbGUiLAkJb25lKDAwNjc0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7ImJjaGciLAlvbmUoMDAwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3siYmNoZyIsCW9uZSgwMDA0MTAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7ImJjaGciLAlvbmUoMDAwNDEwMCksCW9uZSgwMTc3NzAwKSwgIiNicXMiLCBtY2Y1MjAwIH0sCisKK3siYmNsciIsCW9uZSgwMDAwNjAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCit7ImJjbHIiLAlvbmUoMDAwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkdnMiLCBtY2Y1MjAwIH0sCit7ImJjbHIiLAlvbmUoMDAwNDIwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoreyJiY2xyIiwJb25lKDAwMDQyMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmNTIwMCB9LAorCit7ImJmY2hnIiwJdHdvKDAxNjUzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCit7ImJmY2xyIiwJdHdvKDAxNjYzMDAsIDApLCB0d28oMDE3NzcwMCwgMDE3MDAwMCksCSI/c08yTzMiLCAgIG02ODAyMHVwIH0sCit7ImJmZXh0cyIsCXR3bygwMTY1NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoreyJiZmV4dHUiLAl0d28oMDE2NDcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKK3siYmZmZm8iLAl0d28oMDE2NjcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIi9zTzJPM0QxIiwgbTY4MDIwdXAgfSwKK3siYmZpbnMiLAl0d28oMDE2NzcwMCwgMCksIHR3bygwMTc3NzAwLCAwMTAwMDAwKSwJIkQxP3NPMk8zIiwgbTY4MDIwdXAgfSwKK3siYmZzZXQiLAl0d28oMDE2NzMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKK3siYmZ0c3QiLAl0d28oMDE2NDMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIi9zTzJPMyIsICAgbTY4MDIwdXAgfSwKKworeyJiZ25kIiwJb25lKDAwNDUzNzIpLAkJb25lKDAxNzc3NzcpLCAiIiwgY3B1MzIgfSwKKworeyJia3B0IiwJb25lKDAwNDQxMTApLAkJb25lKDAxNzc3NzApLCAidHMiLCBtNjgwMTB1cCB9LAorCit7ImJyYXciLAlvbmUoMDA2MDAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImJyYWwiLAlvbmUoMDA2MDM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJicmFzIiwJb25lKDAwNjAwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7ImJzZXQiLAlvbmUoMDAwMDcwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoreyJic2V0IiwJb25lKDAwMDA3MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmNTIwMCB9LAoreyJic2V0IiwJb25lKDAwMDQzMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKK3siYnNldCIsCW9uZSgwMDA0MzAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZjUyMDAgfSwKKworeyJic3J3IiwJb25lKDAwNjA0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJic3JsIiwJb25lKDAwNjA3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siYnNycyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJidHN0IiwJb25lKDAwMDA0MDApLAlvbmUoMDE3MDcwMCksICJEZDtiIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImJ0c3QiLAlvbmUoMDAwNDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoreyJidHN0IiwJb25lKDAwMDQwMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmNTIwMCB9LAorCit7ImNhbGxtIiwJb25lKDAwMDMzMDApLAkJb25lKDAxNzc3MDApLCAiI2IhcyIsIG02ODAyMCB9LAorCit7ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCit7ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCit7ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCit7ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCisKK3siY2FzYiIsCXR3bygwMDA1MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKK3siY2FzdyIsCXR3bygwMDA2MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKK3siY2FzbCIsCXR3bygwMDA3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKKworeyJjaGsyYiIsIHR3bygwMDAwMzAwLDAwMDQwMDApLCB0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJjaGsydyIsIHR3bygwMDAxMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJjaGsybCIsIHR3bygwMDAyMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAorCit7ImNoa2wiLAlvbmUoMDA0MDQwMCksCQlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfSwKK3siY2hrdyIsCW9uZSgwMDQwNjAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAorCisjZGVmaW5lIFNDT1BFX0xJTkUgKDB4MSA8PCAzKQorI2RlZmluZSBTQ09QRV9QQUdFICgweDIgPDwgMykKKyNkZWZpbmUgU0NPUEVfQUxMICAoMHgzIDw8IDMpCisKK3siY2ludmEiLAlvbmUoMHhmNDAwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoreyJjaW52bCIsCW9uZSgweGY0MDB8U0NPUEVfTElORSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCit7ImNpbnZwIiwJb25lKDB4ZjQwMHxTQ09QRV9QQUdFKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKKworeyJjcHVzaGEiLAlvbmUoMHhmNDIwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoreyJjcHVzaGwiLAlvbmUoMHhmNDIwfFNDT1BFX0xJTkUpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAoreyJjcHVzaGwiLAlvbmUoMHgwNGU4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCAgIG1jZjUyMDAgIH0sCit7ImNwdXNocCIsCW9uZSgweGY0MjB8U0NPUEVfUEFHRSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCisKKyN1bmRlZiBTQ09QRV9MSU5FCisjdW5kZWYgU0NPUEVfUEFHRQorI3VuZGVmIFNDT1BFX0FMTAorCit7ImNscmIiLAlvbmUoMDA0MTAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImNscnciLAlvbmUoMDA0MTEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImNscmwiLAlvbmUoMDA0MTIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKK3siY21wMmIiLAl0d28oMDAwMDMwMCwwKSwgdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siY21wMnciLAl0d28oMDAwMTMwMCwwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3siY21wMmwiLAl0d28oMDAwMjMwMCwwKSwJdHdvKDAxNzc3MDAsMDc3NzcpLCAiIXNSMSIsIG02ODAyMHVwIHwgY3B1MzIgfSwKKworeyJjbXBhdyIsCW9uZSgwMTMwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCit7ImNtcGFsIiwJb25lKDAxMzA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKK3siY21waWIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoreyJjbXBpdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCit7ImNtcGlsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKK3siY21waWwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2Y1MjAwIH0sCisKK3siY21wbWIiLAlvbmUoMDEzMDQxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoreyJjbXBtdyIsCW9uZSgwMTMwNTEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCit7ImNtcG1sIiwJb25lKDAxMzA2MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKKworLyogVGhlIGNtcCBvcGNvZGUgY2FuIGdlbmVyYXRlIHRoZSBjbXBhLCBjbXBtLCBhbmQgY21waSBpbnN0cnVjdGlvbnMuICAqLworeyJjbXBiIiwJb25lKDAwMDYwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKK3siY21wYiIsCW9uZSgwMTMwNDEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCit7ImNtcGIiLAlvbmUoMDEzMDAwMCksCW9uZSgwMTcwNzAwKSwgIjtiRGQiLCBtNjgwMDB1cCB9LAoreyJjbXB3IiwJb25lKDAxMzAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKK3siY21wdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCit7ImNtcHciLAlvbmUoMDEzMDUxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAoreyJjbXB3IiwJb25lKDAxMzAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKK3siY21wbCIsCW9uZSgwMTMwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJjbXBsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKK3siY21wbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKK3siY21wbCIsCW9uZSgwMTMwNjEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCit7ImNtcGwiLAlvbmUoMDEzMDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJkYmNjIiwJb25lKDAwNTIzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKK3siZGJjcyIsCW9uZSgwMDUyNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCit7ImRiZXEiLAlvbmUoMDA1MzcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoreyJkYmYiLAkJb25lKDAwNTA3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKK3siZGJnZSIsCW9uZSgwMDU2MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCit7ImRiZ3QiLAlvbmUoMDA1NzMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoreyJkYmhpIiwJb25lKDAwNTEzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKK3siZGJsZSIsCW9uZSgwMDU3NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCit7ImRibHMiLAlvbmUoMDA1MTcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoreyJkYmx0IiwJb25lKDAwNTY3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKK3siZGJtaSIsCW9uZSgwMDU1NzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCit7ImRibmUiLAlvbmUoMDA1MzMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoreyJkYnBsIiwJb25lKDAwNTUzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKK3siZGJ0IiwJCW9uZSgwMDUwMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCit7ImRidmMiLAlvbmUoMDA1NDMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoreyJkYnZzIiwJb25lKDAwNTQ3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKKworeyJkaXZzdyIsCW9uZSgwMTAwNzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAorCit7ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCit7ImRpdnNsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCisKK3siZGl2c2xsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKK3siZGl2c2xsIiwgdHdvKDAwNDYxMDAsMDAwNDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgbTY4MDIwdXB8Y3B1MzIgfSwKKworeyJkaXZ1dyIsCW9uZSgwMTAwMzAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAorCit7ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCit7ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCisKK3siZGl2dWxsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKK3siZGl2dWxsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgbTY4MDIwdXB8Y3B1MzIgfSwKKworeyJlb3JpYiIsCW9uZSgwMDA1MDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7ImVvcmliIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKK3siZW9yaXciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoreyJlb3JpdyIsCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCit7ImVvcmlsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKK3siZW9yaWwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2Y1MjAwIH0sCit7ImVvcmkiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJlb3JpIiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKK3siZW9yaSIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCisKKy8qIFRoZSBlb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgZW9yaSBpbnN0cnVjdGlvbi4gICovCit7ImVvcmIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoreyJlb3JiIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKK3siZW9yYiIsCW9uZSgwMTMwNDAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCit7ImVvcnciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoreyJlb3J3IiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKK3siZW9ydyIsCW9uZSgwMTMwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCit7ImVvcmwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoreyJlb3JsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmNTIwMCB9LAoreyJlb3JsIiwJb25lKDAxMzA2MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImVvciIsCQlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJlb3IiLAkJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKK3siZW9yIiwJCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCit7ImVvciIsCQlvbmUoMDEzMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAorCit7ImV4ZyIsCQlvbmUoMDE0MDUwMCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJleGciLAkJb25lKDAxNDA1MTApLAlvbmUoMDE3MDc3MCksICJBZEFzIiwgbTY4MDAwdXAgfSwKK3siZXhnIiwJCW9uZSgwMTQwNjEwKSwJb25lKDAxNzA3NzApLCAiRGRBcyIsIG02ODAwMHVwIH0sCit7ImV4ZyIsCQlvbmUoMDE0MDYxMCksCW9uZSgwMTcwNzcwKSwgIkFzRGQiLCBtNjgwMDB1cCB9LAorCit7ImV4dHciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDAwdXB8bWNmNTIwMCB9LAoreyJleHRsIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZjUyMDAgfSwKK3siZXh0YmwiLAlvbmUoMDA0NDcwMCksCW9uZSgwMTc3NzcwKSwgIkRzIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAorCisvKiBmbG9hdCBzdHVmZiBzdGFydHMgaGVyZSAqLworCit7ImZhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmYWJzZCIsCXR3bygweEYwMDAsIDB4NTQxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZmFic2wiLAl0d28oMHhGMDAwLCAweDQwMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmYWJzcyIsCXR3bygweEYwMDAsIDB4NDQxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZmFic3ciLAl0d28oMHhGMDAwLCAweDUwMTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmYWJzeCIsCXR3bygweEYwMDAsIDB4NDgxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZmFic3giLAl0d28oMHhGMDAwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZnNhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZzYWJzZCIsCXR3bygweEYwMDAsIDB4NTQ1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoreyJmc2Fic2wiLAl0d28oMHhGMDAwLCAweDQwNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKK3siZnNhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCit7ImZzYWJzcyIsCXR3bygweEYwMDAsIDB4NDQ1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoreyJmc2Fic3ciLAl0d28oMHhGMDAwLCAweDUwNTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDU4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCit7ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4NDg1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoreyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDAwNTgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKKworeyJmZGFic2IiLAl0d28oMHhGMDAwLCAweDU4NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXB9LAoreyJmZGFic2QiLAl0d28oMHhGMDAwLCAweDU0NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXB9LAoreyJmZGFic2wiLAl0d28oMHhGMDAwLCAweDQwNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXB9LAoreyJmZGFic3AiLAl0d28oMHhGMDAwLCAweDRDNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXB9LAoreyJmZGFic3MiLAl0d28oMHhGMDAwLCAweDQ0NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXB9LAoreyJmZGFic3ciLAl0d28oMHhGMDAwLCAweDUwNWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXB9LAoreyJmZGFic3giLAl0d28oMHhGMDAwLCAweDAwNWMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXB9LAoreyJmZGFic3giLAl0d28oMHhGMDAwLCAweDQ4NWMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXB9LAoreyJmZGFic3giLAl0d28oMHhGMDAwLCAweDAwNWMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXB9LAorCit7ImZhY29zYiIsCXR3bygweEYwMDAsIDB4NTgxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZmFjb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmYWNvc2wiLAl0d28oMHhGMDAwLCAweDQwMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZhY29zcCIsCXR3bygweEYwMDAsIDB4NEMxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZmFjb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmYWNvc3ciLAl0d28oMHhGMDAwLCAweDUwMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZhY29zeCIsCXR3bygweEYwMDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZmFkZGIiLAl0d28oMHhGMDAwLCAweDU4MjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmYWRkbCIsCXR3bygweEYwMDAsIDB4NDAyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmFkZHAiLAl0d28oMHhGMDAwLCAweDRDMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmYWRkdyIsCXR3bygweEYwMDAsIDB4NTAyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmFkZHgiLAl0d28oMHhGMDAwLCAweDAwMjIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAorCit7ImZzYWRkYiIsCXR3bygweEYwMDAsIDB4NTg2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoreyJmc2FkZGQiLAl0d28oMHhGMDAwLCAweDU0NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKK3siZnNhZGRsIiwJdHdvKDB4RjAwMCwgMHg0MDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCit7ImZzYWRkcCIsCXR3bygweEYwMDAsIDB4NEM2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoreyJmc2FkZHMiLAl0d28oMHhGMDAwLCAweDQ0NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKK3siZnNhZGR3IiwJdHdvKDB4RjAwMCwgMHg1MDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCit7ImZzYWRkeCIsCXR3bygweEYwMDAsIDB4MDA2MiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoreyJmc2FkZHgiLAl0d28oMHhGMDAwLCAweDQ4NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKKworeyJmZGFkZGIiLAl0d28oMHhGMDAwLCAweDU4NjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKK3siZmRhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCit7ImZkYWRkbCIsCXR3bygweEYwMDAsIDB4NDA2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmZGFkZHAiLAl0d28oMHhGMDAwLCAweDRDNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKK3siZmRhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZkYWRkdyIsCXR3bygweEYwMDAsIDB4NTA2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoreyJmZGFkZHgiLAl0d28oMHhGMDAwLCAweDAwNjYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKK3siZmRhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCisKK3siZmFzaW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmYXNpbmQiLAl0d28oMHhGMDAwLCAweDU0MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZhc2lubCIsCXR3bygweEYwMDAsIDB4NDAwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmFzaW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmYXNpbnMiLAl0d28oMHhGMDAwLCAweDQ0MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZhc2ludyIsCXR3bygweEYwMDAsIDB4NTAwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmFzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDQ4MEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZhc2lueCIsCXR3bygweEYwMDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmYXRhbmIiLAl0d28oMHhGMDAwLCAweDU4MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZhdGFuZCIsCXR3bygweEYwMDAsIDB4NTQwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZmF0YW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmYXRhbnAiLAl0d28oMHhGMDAwLCAweDRDMEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZhdGFucyIsCXR3bygweEYwMDAsIDB4NDQwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZmF0YW53IiwJdHdvKDB4RjAwMCwgMHg1MDBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZhdGFueCIsCXR3bygweEYwMDAsIDB4NDgwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZmF0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZhdGFuaGIiLAl0d28oMHhGMDAwLCAweDU4MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaGQiLAl0d28oMHhGMDAwLCAweDU0MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaGwiLAl0d28oMHhGMDAwLCAweDQwMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaHAiLAl0d28oMHhGMDAwLCAweDRDMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaHMiLAl0d28oMHhGMDAwLCAweDQ0MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaHciLAl0d28oMHhGMDAwLCAweDUwMEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDQ4MEQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZhdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZmJlcSIsCW9uZSgweEYwODEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZiZiIsCQlvbmUoMHhGMDgwKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYmdlIiwJb25lKDB4RjA5MyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJnbCIsCW9uZSgweEYwOTYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZiZ2xlIiwJb25lKDB4RjA5NyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJndCIsCW9uZSgweEYwOTIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZibGUiLAlvbmUoMHhGMDk1KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYmx0IiwJb25lKDB4RjA5NCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJuZSIsCW9uZSgweEYwOEUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZibmdlIiwJb25lKDB4RjA5QyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJuZ2wiLAlvbmUoMHhGMDk5KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYm5nbGUiLAlvbmUoMHhGMDk4KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYm5ndCIsCW9uZSgweEYwOUQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZibmxlIiwJb25lKDB4RjA5QSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJubHQiLAlvbmUoMHhGMDlCKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYm9nZSIsCW9uZSgweEYwODMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZib2dsIiwJb25lKDB4RjA4NiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJvZ3QiLAlvbmUoMHhGMDgyKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYm9sZSIsCW9uZSgweEYwODUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZib2x0IiwJb25lKDB4RjA4NCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJvciIsCW9uZSgweEYwODcpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZic2VxIiwJb25lKDB4RjA5MSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJzZiIsCW9uZSgweEYwOTApLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZic25lIiwJb25lKDB4RjA5RSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJzdCIsCW9uZSgweEYwOUYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZidCIsCQlvbmUoMHhGMDhGKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYnVlcSIsCW9uZSgweEYwODkpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZidWdlIiwJb25lKDB4RjA4QiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJ1Z3QiLAlvbmUoMHhGMDhBKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoreyJmYnVsZSIsCW9uZSgweEYwOEQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCit7ImZidWx0IiwJb25lKDB4RjA4QyksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKK3siZmJ1biIsCW9uZSgweEYwODgpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCisKK3siZmJlcWwiLAlvbmUoMHhGMEMxKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYmZsIiwJb25lKDB4RjBDMCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJnZWwiLAlvbmUoMHhGMEQzKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYmdsbCIsCW9uZSgweEYwRDYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZiZ2xlbCIsCW9uZSgweEYwRDcpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZiZ3RsIiwJb25lKDB4RjBEMiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJsZWwiLAlvbmUoMHhGMEQ1KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYmx0bCIsCW9uZSgweEYwRDQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZibmVsIiwJb25lKDB4RjBDRSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJuZ2VsIiwJb25lKDB4RjBEQyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJuZ2xsIiwJb25lKDB4RjBEOSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJuZ2xlbCIsCW9uZSgweEYwRDgpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZibmd0bCIsCW9uZSgweEYwREQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZibmxlbCIsCW9uZSgweEYwREEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZibmx0bCIsCW9uZSgweEYwREIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZib2dlbCIsCW9uZSgweEYwQzMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZib2dsbCIsCW9uZSgweEYwQzYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZib2d0bCIsCW9uZSgweEYwQzIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZib2xlbCIsCW9uZSgweEYwQzUpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZib2x0bCIsCW9uZSgweEYwQzQpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZib3JsIiwJb25lKDB4RjBDNyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJzZXFsIiwJb25lKDB4RjBEMSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKK3siZmJzZmwiLAlvbmUoMHhGMEQwKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnNuZWwiLAlvbmUoMHhGMERFKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnN0bCIsCW9uZSgweEYwREYpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCit7ImZidGwiLAlvbmUoMHhGMENGKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnVlcWwiLAlvbmUoMHhGMEM5KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnVnZWwiLAlvbmUoMHhGMENCKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnVndGwiLAlvbmUoMHhGMENBKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnVsZWwiLAlvbmUoMHhGMENEKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnVsdGwiLAlvbmUoMHhGMENDKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoreyJmYnVubCIsCW9uZSgweEYwQzgpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCisKK3siZmplcSIsCW9uZSgweEYwODEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqZiIsCQlvbmUoMHhGMDgwKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmamdlIiwJb25lKDB4RjA5MyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpnbCIsCW9uZSgweEYwOTYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqZ2xlIiwJb25lKDB4RjA5NyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpndCIsCW9uZSgweEYwOTIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqbGUiLAlvbmUoMHhGMDk1KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmamx0IiwJb25lKDB4RjA5NCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpuZSIsCW9uZSgweEYwOEUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqbmdlIiwJb25lKDB4RjA5QyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpuZ2wiLAlvbmUoMHhGMDk5KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmam5nbGUiLAlvbmUoMHhGMDk4KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmam5ndCIsCW9uZSgweEYwOUQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqbmxlIiwJb25lKDB4RjA5QSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpubHQiLAlvbmUoMHhGMDlCKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmam9nZSIsCW9uZSgweEYwODMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqb2dsIiwJb25lKDB4RjA4NiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpvZ3QiLAlvbmUoMHhGMDgyKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmam9sZSIsCW9uZSgweEYwODUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqb2x0IiwJb25lKDB4RjA4NCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpvciIsCW9uZSgweEYwODcpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqc2VxIiwJb25lKDB4RjA5MSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpzZiIsCW9uZSgweEYwOTApLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqc25lIiwJb25lKDB4RjA5RSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmpzdCIsCW9uZSgweEYwOUYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqdCIsCQlvbmUoMHhGMDhGKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmanVlcSIsCW9uZSgweEYwODkpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqdWdlIiwJb25lKDB4RjA4QiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmp1Z3QiLAlvbmUoMHhGMDhBKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoreyJmanVsZSIsCW9uZSgweEYwOEQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCit7ImZqdWx0IiwJb25lKDB4RjA4QyksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKK3siZmp1biIsCW9uZSgweEYwODgpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCisKK3siZmNtcGIiLAl0d28oMHhGMDAwLCAweDU4MzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZjbXBkIiwJdHdvKDB4RjAwMCwgMHg1NDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmY21wbCIsCXR3bygweEYwMDAsIDB4NDAzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmNtcHAiLAl0d28oMHhGMDAwLCAweDRDMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZjbXBzIiwJdHdvKDB4RjAwMCwgMHg0NDM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmY21wdyIsCXR3bygweEYwMDAsIDB4NTAzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmNtcHgiLAl0d28oMHhGMDAwLCAweDAwMzgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZjbXB4IiwJdHdvKDB4RjAwMCwgMHg0ODM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAorCit7ImZjb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmY29zZCIsCXR3bygweEYwMDAsIDB4NTQxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZmNvc2wiLAl0d28oMHhGMDAwLCAweDQwMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZjb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmY29zcyIsCXR3bygweEYwMDAsIDB4NDQxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZmNvc3ciLAl0d28oMHhGMDAwLCAweDUwMUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmY29zeCIsCXR3bygweEYwMDAsIDB4NDgxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZmNvc3giLAl0d28oMHhGMDAwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZmNvc2hiIiwJdHdvKDB4RjAwMCwgMHg1ODE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmY29zaGQiLAl0d28oMHhGMDAwLCAweDU0MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZjb3NobCIsCXR3bygweEYwMDAsIDB4NDAxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmNvc2hwIiwJdHdvKDB4RjAwMCwgMHg0QzE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmY29zaHMiLAl0d28oMHhGMDAwLCAweDQ0MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZjb3NodyIsCXR3bygweEYwMDAsIDB4NTAxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDQ4MTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmZGJlcSIsCXR3bygweEYwNDgsIDB4MDAwMSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRiZiIsCXR3bygweEYwNDgsIDB4MDAwMCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRiZ2UiLAl0d28oMHhGMDQ4LCAweDAwMTMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYmdsIiwJdHdvKDB4RjA0OCwgMHgwMDE2KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJnbGUiLAl0d28oMHhGMDQ4LCAweDAwMTcpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYmd0IiwJdHdvKDB4RjA0OCwgMHgwMDEyKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJsZSIsCXR3bygweEYwNDgsIDB4MDAxNSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRibHQiLAl0d28oMHhGMDQ4LCAweDAwMTQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYm5lIiwJdHdvKDB4RjA0OCwgMHgwMDBFKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJuZ2UiLAl0d28oMHhGMDQ4LCAweDAwMUMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYm5nbCIsCXR3bygweEYwNDgsIDB4MDAxOSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRibmdsZSIsCXR3bygweEYwNDgsIDB4MDAxOCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRibmd0IiwJdHdvKDB4RjA0OCwgMHgwMDFEKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJubGUiLAl0d28oMHhGMDQ4LCAweDAwMUEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYm5sdCIsCXR3bygweEYwNDgsIDB4MDAxQiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRib2dlIiwJdHdvKDB4RjA0OCwgMHgwMDAzKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJvZ2wiLAl0d28oMHhGMDQ4LCAweDAwMDYpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYm9ndCIsCXR3bygweEYwNDgsIDB4MDAwMiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRib2xlIiwJdHdvKDB4RjA0OCwgMHgwMDA1KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJvbHQiLAl0d28oMHhGMDQ4LCAweDAwMDQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYm9yIiwJdHdvKDB4RjA0OCwgMHgwMDA3KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJzZXEiLAl0d28oMHhGMDQ4LCAweDAwMTEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYnNmIiwJdHdvKDB4RjA0OCwgMHgwMDEwKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJzbmUiLAl0d28oMHhGMDQ4LCAweDAwMUUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYnN0IiwJdHdvKDB4RjA0OCwgMHgwMDFGKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJ0IiwJdHdvKDB4RjA0OCwgMHgwMDBGKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJ1ZXEiLAl0d28oMHhGMDQ4LCAweDAwMDkpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYnVnZSIsCXR3bygweEYwNDgsIDB4MDAwQiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRidWd0IiwJdHdvKDB4RjA0OCwgMHgwMDBBKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoreyJmZGJ1bGUiLAl0d28oMHhGMDQ4LCAweDAwMEQpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCit7ImZkYnVsdCIsCXR3bygweEYwNDgsIDB4MDAwQyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKK3siZmRidW4iLAl0d28oMHhGMDQ4LCAweDAwMDgpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCisKK3siZmRpdmIiLAl0d28oMHhGMDAwLCAweDU4MjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmZGl2bCIsCXR3bygweEYwMDAsIDB4NDAyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmRpdnAiLAl0d28oMHhGMDAwLCAweDRDMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmZGl2dyIsCXR3bygweEYwMDAsIDB4NTAyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmRpdngiLAl0d28oMHhGMDAwLCAweDAwMjApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAorCit7ImZzZGl2YiIsCXR3bygweEYwMDAsIDB4NTg2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoreyJmc2RpdmQiLAl0d28oMHhGMDAwLCAweDU0NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKK3siZnNkaXZsIiwJdHdvKDB4RjAwMCwgMHg0MDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCit7ImZzZGl2cCIsCXR3bygweEYwMDAsIDB4NEM2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoreyJmc2RpdnMiLAl0d28oMHhGMDAwLCAweDQ0NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKK3siZnNkaXZ3IiwJdHdvKDB4RjAwMCwgMHg1MDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCit7ImZzZGl2eCIsCXR3bygweEYwMDAsIDB4MDA2MCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoreyJmc2RpdngiLAl0d28oMHhGMDAwLCAweDQ4NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKKworeyJmZGRpdmIiLAl0d28oMHhGMDAwLCAweDU4NjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKK3siZmRkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCit7ImZkZGl2bCIsCXR3bygweEYwMDAsIDB4NDA2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmZGRpdnAiLAl0d28oMHhGMDAwLCAweDRDNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKK3siZmRkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZkZGl2dyIsCXR3bygweEYwMDAsIDB4NTA2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoreyJmZGRpdngiLAl0d28oMHhGMDAwLCAweDAwNjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKK3siZmRkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCisKK3siZmV0b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmZXRveGQiLAl0d28oMHhGMDAwLCAweDU0MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZldG94bCIsCXR3bygweEYwMDAsIDB4NDAxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmV0b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmZXRveHMiLAl0d28oMHhGMDAwLCAweDQ0MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZldG94dyIsCXR3bygweEYwMDAsIDB4NTAxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDQ4MTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZldG94eCIsCXR3bygweEYwMDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmZXRveG0xYiIsCXR3bygweEYwMDAsIDB4NTgwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZmV0b3htMWQiLAl0d28oMHhGMDAwLCAweDU0MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZldG94bTFsIiwJdHdvKDB4RjAwMCwgMHg0MDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmZXRveG0xcCIsCXR3bygweEYwMDAsIDB4NEMwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZmV0b3htMXMiLAl0d28oMHhGMDAwLCAweDQ0MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZldG94bTF3IiwJdHdvKDB4RjAwMCwgMHg1MDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDQ4MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHgwMDA4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZnZXRleHBiIiwJdHdvKDB4RjAwMCwgMHg1ODFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmZ2V0ZXhwZCIsCXR3bygweEYwMDAsIDB4NTQxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZmdldGV4cGwiLAl0d28oMHhGMDAwLCAweDQwMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZnZXRleHBwIiwJdHdvKDB4RjAwMCwgMHg0QzFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmZ2V0ZXhwcyIsCXR3bygweEYwMDAsIDB4NDQxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZmdldGV4cHciLAl0d28oMHhGMDAwLCAweDUwMUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4NDgxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDAwMUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZmdldG1hbmIiLAl0d28oMHhGMDAwLCAweDU4MUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZnZXRtYW5kIiwJdHdvKDB4RjAwMCwgMHg1NDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmZ2V0bWFubCIsCXR3bygweEYwMDAsIDB4NDAxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmdldG1hbnAiLAl0d28oMHhGMDAwLCAweDRDMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZnZXRtYW5zIiwJdHdvKDB4RjAwMCwgMHg0NDFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmZ2V0bWFudyIsCXR3bygweEYwMDAsIDB4NTAxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHg0ODFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmaW50YiIsCXR3bygweEYwMDAsIDB4NTgwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZmludGQiLAl0d28oMHhGMDAwLCAweDU0MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZpbnRsIiwJdHdvKDB4RjAwMCwgMHg0MDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmaW50cCIsCXR3bygweEYwMDAsIDB4NEMwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZmludHMiLAl0d28oMHhGMDAwLCAweDQ0MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZpbnR3IiwJdHdvKDB4RjAwMCwgMHg1MDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmaW50eCIsCXR3bygweEYwMDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZmludHgiLAl0d28oMHhGMDAwLCAweDQ4MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHgwMDAxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZpbnRyemIiLAl0d28oMHhGMDAwLCAweDU4MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZpbnRyemQiLAl0d28oMHhGMDAwLCAweDU0MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZpbnRyemwiLAl0d28oMHhGMDAwLCAweDQwMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZpbnRyenAiLAl0d28oMHhGMDAwLCAweDRDMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZpbnRyenMiLAl0d28oMHhGMDAwLCAweDQ0MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZpbnRyenciLAl0d28oMHhGMDAwLCAweDUwMDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDQ4MDMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZpbnRyengiLAl0d28oMHhGMDAwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZmxvZzEwYiIsCXR3bygweEYwMDAsIDB4NTgxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZmxvZzEwZCIsCXR3bygweEYwMDAsIDB4NTQxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZmxvZzEwbCIsCXR3bygweEYwMDAsIDB4NDAxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmxvZzEwcCIsCXR3bygweEYwMDAsIDB4NEMxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZmxvZzEwcyIsCXR3bygweEYwMDAsIDB4NDQxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZmxvZzEwdyIsCXR3bygweEYwMDAsIDB4NTAxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmxvZzEweCIsCXR3bygweEYwMDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZmxvZzEweCIsCXR3bygweEYwMDAsIDB4NDgxNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZmxvZzEweCIsCXR3bygweEYwMDAsIDB4MDAxNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmbG9nMmIiLAl0d28oMHhGMDAwLCAweDU4MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZsb2cyZCIsCXR3bygweEYwMDAsIDB4NTQxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZmxvZzJsIiwJdHdvKDB4RjAwMCwgMHg0MDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmbG9nMnAiLAl0d28oMHhGMDAwLCAweDRDMTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZsb2cycyIsCXR3bygweEYwMDAsIDB4NDQxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZmxvZzJ3IiwJdHdvKDB4RjAwMCwgMHg1MDE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4NDgxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZsb2duYiIsCXR3bygweEYwMDAsIDB4NTgxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZmxvZ25kIiwJdHdvKDB4RjAwMCwgMHg1NDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmbG9nbmwiLAl0d28oMHhGMDAwLCAweDQwMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZsb2ducCIsCXR3bygweEYwMDAsIDB4NEMxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZmxvZ25zIiwJdHdvKDB4RjAwMCwgMHg0NDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmbG9nbnciLAl0d28oMHhGMDAwLCAweDUwMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZsb2dueCIsCXR3bygweEYwMDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZmxvZ254IiwJdHdvKDB4RjAwMCwgMHg0ODE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZmxvZ25wMWIiLAl0d28oMHhGMDAwLCAweDU4MDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZsb2ducDFkIiwJdHdvKDB4RjAwMCwgMHg1NDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmbG9nbnAxbCIsCXR3bygweEYwMDAsIDB4NDAwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZmxvZ25wMXAiLAl0d28oMHhGMDAwLCAweDRDMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZsb2ducDFzIiwJdHdvKDB4RjAwMCwgMHg0NDA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmbG9nbnAxdyIsCXR3bygweEYwMDAsIDB4NTAwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHg0ODA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmbW9kYiIsCXR3bygweEYwMDAsIDB4NTgyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZm1vZGQiLAl0d28oMHhGMDAwLCAweDU0MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZtb2RsIiwJdHdvKDB4RjAwMCwgMHg0MDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmbW9kcCIsCXR3bygweEYwMDAsIDB4NEMyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZm1vZHMiLAl0d28oMHhGMDAwLCAweDQ0MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZtb2R3IiwJdHdvKDB4RjAwMCwgMHg1MDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmbW9keCIsCXR3bygweEYwMDAsIDB4MDAyMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZm1vZHgiLAl0d28oMHhGMDAwLCAweDQ4MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCisKK3siZm1vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmbW92ZWIiLAl0d28oMHhGMDAwLCAweDc4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRiIiwgbWZsb2F0IH0sCit7ImZtb3ZlZCIsCXR3bygweEYwMDAsIDB4NTQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZm1vdmVkIiwJdHdvKDB4RjAwMCwgMHg3NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjd+RiIsIG1mbG9hdCB9LAoreyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4NjAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGwiLCBtZmxvYXQgfSwKKy8qIEZJWE1FOiB0aGUgbmV4dCB0d28gdmFyaWFudHMgc2hvdWxkIG5vdCBwZXJtaXQgbW92aW5nIGFuIGFkZHJlc3MKKyAgIHJlZ2lzdGVyIHRvIGFueXRoaW5nIGJ1dCB0aGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIuICAqLworeyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCit7ImZtb3ZlbCIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaSpsczgiLCBtZmxvYXQgfSwKK3siZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmbW92ZXAiLAl0d28oMHhGMDAwLCAweDZDMDApLCB0d28oMHhGMUMwLCAweEZDMDApLCAiSWlGN35wa0MiLCBtZmxvYXQgfSwKK3siZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg3QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzBGKSwgIklpRjd+cERrIiwgbWZsb2F0IH0sCit7ImZtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZm1vdmVzIiwJdHdvKDB4RjAwMCwgMHg2NDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckZiIsIG1mbG9hdCB9LAoreyJmbW92ZXciLAl0d28oMHhGMDAwLCAweDUwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZtb3ZldyIsCXR3bygweEYwMDAsIDB4NzAwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JHciLCBtZmxvYXQgfSwKK3siZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDQ4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4NjgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3fngiLCBtZmxvYXQgfSwKKworeyJmc21vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZzbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0NDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKK3siZnNtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDA0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmc21vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZzbW92ZXciLAl0d28oMHhGMDAwLCAweDUwNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZnNtb3ZleCIsCXR3bygweEYwMDAsIDB4MDA0MCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoreyJmc21vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCit7ImZzbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKKworeyJmZG1vdmViIiwJdHdvKDB4RjAwMCwgMHg1ODQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZkbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0NDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKK3siZmRtb3ZlbCIsCXR3bygweEYwMDAsIDB4NDA0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmZG1vdmVzIiwJdHdvKDB4RjAwMCwgMHg0NDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZkbW92ZXciLAl0d28oMHhGMDAwLCAweDUwNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZmRtb3ZleCIsCXR3bygweEYwMDAsIDB4MDA0NCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoreyJmZG1vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCit7ImZkbW92ZXAiLAl0d28oMHhGMDAwLCAweDRDNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKKworeyJmbW92ZWNyeCIsCXR3bygweEYwMDAsIDB4NUMwMCksIHR3bygweEYxRkYsIDB4RkMwMCksICJJaSNDRjciLCBtZmxvYXQgfSwKKworeyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpRGsmcyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpRGstcyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpJnNEayIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpK3NEayIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkbDMmcyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkIzMmcyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnNsMyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnMjMyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkTDMtcyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkIzMtcyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3NsMyIsIG1mbG9hdCB9LAoreyJmbW92ZW14IiwJdHdvKDB4RjAxOCwgMHhEMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkK3MjMyIsIG1mbG9hdCB9LAorCit7ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlzOCVzIiwgbWZsb2F0IH0sCit7ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlMOH5zIiwgbWZsb2F0IH0sCisvKiBGSVhNRTogSW4gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHdlIHNob3VsZCBvbmx5IHBlcm1pdCAlZG4gaWYgdGhlCisgICB0YXJnZXQgaXMgYSBzaW5nbGUgcmVnaXN0ZXIuICBXZSBzaG91bGQgb25seSBwZXJtaXQgJWFuIGlmIHRoZQorICAgdGFyZ2V0IGlzIGEgc2luZ2xlICVmcGlhci4gICovCit7ImZtb3ZlbWwiLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqbEw4IiwgbWZsb2F0IH0sCisKK3siZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkTDMtcyIsIG1mbG9hdCB9LAoreyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEYwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWRsMyZzIiwgbWZsb2F0IH0sCit7ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzbDMiLCBtZmxvYXQgfSwKK3siZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnNsMyIsIG1mbG9hdCB9LAoreyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEUwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQjMy1zIiwgbWZsb2F0IH0sCit7ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaURrLXMiLCBtZmxvYXQgfSwKK3siZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkIzMmcyIsIG1mbG9hdCB9LAoreyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEY4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWlEayZzIiwgbWZsb2F0IH0sCit7ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzIzMiLCBtZmxvYXQgfSwKK3siZm1vdmVtIiwJdHdvKDB4RjAxOCwgMHhEODAwKSwgdHdvKDB4RjFGOCwgMHhGRjhGKSwgIklpK3NEayIsIG1mbG9hdCB9LAoreyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQwMDApLCB0d28oMHhGMUMwLCAweEZGMDApLCAiSWQmcyMzIiwgbWZsb2F0IH0sCit7ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaSZzRGsiLCBtZmxvYXQgfSwKK3siZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoreyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqc3M4IiwgbWZsb2F0IH0sCit7ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaUw4fnMiLCBtZmxvYXQgfSwKK3siZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjJDMCwgMHhFM0ZGKSwgIklpKnNMOCIsIG1mbG9hdCB9LAorCit7ImZtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmbXVsZCIsCXR3bygweEYwMDAsIDB4NTQyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZm11bGwiLAl0d28oMHhGMDAwLCAweDQwMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmbXVscyIsCXR3bygweEYwMDAsIDB4NDQyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZm11bHciLAl0d28oMHhGMDAwLCAweDUwMjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDIzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmbXVseCIsCXR3bygweEYwMDAsIDB4NDgyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKKworeyJmc211bGIiLAl0d28oMHhGMDAwLCAweDU4NjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKK3siZnNtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCit7ImZzbXVsbCIsCXR3bygweEYwMDAsIDB4NDA2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmc211bHAiLAl0d28oMHhGMDAwLCAweDRDNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKK3siZnNtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZzbXVsdyIsCXR3bygweEYwMDAsIDB4NTA2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoreyJmc211bHgiLAl0d28oMHhGMDAwLCAweDAwNjMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKK3siZnNtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCisKK3siZmRtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZkbXVsZCIsCXR3bygweEYwMDAsIDB4NTQ2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoreyJmZG11bGwiLAl0d28oMHhGMDAwLCAweDQwNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKK3siZmRtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCit7ImZkbXVscyIsCXR3bygweEYwMDAsIDB4NDQ2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoreyJmZG11bHciLAl0d28oMHhGMDAwLCAweDUwNjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZmRtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDY3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCit7ImZkbXVseCIsCXR3bygweEYwMDAsIDB4NDg2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAorCit7ImZuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmbmVnZCIsCXR3bygweEYwMDAsIDB4NTQxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZm5lZ2wiLAl0d28oMHhGMDAwLCAweDQwMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmbmVncyIsCXR3bygweEYwMDAsIDB4NDQxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZm5lZ3ciLAl0d28oMHhGMDAwLCAweDUwMUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmbmVneCIsCXR3bygweEYwMDAsIDB4NDgxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZm5lZ3giLAl0d28oMHhGMDAwLCAweDAwMUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZnNuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZzbmVnZCIsCXR3bygweEYwMDAsIDB4NTQ1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoreyJmc25lZ2wiLAl0d28oMHhGMDAwLCAweDQwNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKK3siZnNuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCit7ImZzbmVncyIsCXR3bygweEYwMDAsIDB4NDQ1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoreyJmc25lZ3ciLAl0d28oMHhGMDAwLCAweDUwNUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCit7ImZzbmVneCIsCXR3bygweEYwMDAsIDB4NDg1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoreyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDAwNUEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKKworeyJmZG5lZ2IiLAl0d28oMHhGMDAwLCAweDU4NUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKK3siZmRuZWdkIiwJdHdvKDB4RjAwMCwgMHg1NDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCit7ImZkbmVnbCIsCXR3bygweEYwMDAsIDB4NDA1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmZG5lZ3AiLAl0d28oMHhGMDAwLCAweDRDNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKK3siZmRuZWdzIiwJdHdvKDB4RjAwMCwgMHg0NDVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZkbmVndyIsCXR3bygweEYwMDAsIDB4NTA1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoreyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDAwNUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKK3siZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHg0ODVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCit7ImZkbmVneCIsCXR3bygweEYwMDAsIDB4MDA1RSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAorCit7ImZub3AiLAl0d28oMHhGMjgwLCAweDAwMDApLCB0d28oMHhGRkZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKKworeyJmcmVtYiIsCXR3bygweEYwMDAsIDB4NTgyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZnJlbWQiLAl0d28oMHhGMDAwLCAweDU0MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZyZW1sIiwJdHdvKDB4RjAwMCwgMHg0MDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmcmVtcCIsCXR3bygweEYwMDAsIDB4NEMyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZnJlbXMiLAl0d28oMHhGMDAwLCAweDQ0MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZyZW13IiwJdHdvKDB4RjAwMCwgMHg1MDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmcmVteCIsCXR3bygweEYwMDAsIDB4MDAyNSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZnJlbXgiLAl0d28oMHhGMDAwLCAweDQ4MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCisKK3siZnJlc3RvcmUiLAlvbmUoMHhGMTQwKSwJCW9uZSgweEYxQzApLCAiSWQ8cyIsIG1mbG9hdCB9LAorCit7ImZzYXZlIiwJb25lKDB4RjEwMCksCQlvbmUoMHhGMUMwKSwgIklkPnMiLCBtZmxvYXQgfSwKKworeyJmc2NhbGViIiwJdHdvKDB4RjAwMCwgMHg1ODI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGVkIiwJdHdvKDB4RjAwMCwgMHg1NDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGVsIiwJdHdvKDB4RjAwMCwgMHg0MDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGVwIiwJdHdvKDB4RjAwMCwgMHg0QzI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGVzIiwJdHdvKDB4RjAwMCwgMHg0NDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGV3IiwJdHdvKDB4RjAwMCwgMHg1MDI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGV4IiwJdHdvKDB4RjAwMCwgMHgwMDI2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmc2NhbGV4IiwJdHdvKDB4RjAwMCwgMHg0ODI2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAorCisvKiAkIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHRoZSBhc3NlbWJsZXIgZnJvbSB1c2luZyBQQy1yZWxhdGl2ZS4KKyAgIElmIEAgd2VyZSB1c2VkLCAibGFiZWw6IGZzZXEgbGFiZWwiIGNvdWxkIHByb2R1Y2UgImZ0cmFwZXEiLAorICAgYmVjYXVzZSAibGFiZWwiIGJlY2FtZSAicGNAbGFiZWwiLiAgKi8KK3siZnNlcSIsCXR3bygweEYwNDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzZiIsCQl0d28oMHhGMDQwLCAweDAwMDApLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc2dlIiwJdHdvKDB4RjA0MCwgMHgwMDEzKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNnbCIsCXR3bygweEYwNDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzZ2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE3KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNndCIsCXR3bygweEYwNDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzbGUiLAl0d28oMHhGMDQwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc2x0IiwJdHdvKDB4RjA0MCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNuZSIsCXR3bygweEYwNDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzbmdlIiwJdHdvKDB4RjA0MCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNuZ2wiLAl0d28oMHhGMDQwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc25nbGUiLAl0d28oMHhGMDQwLCAweDAwMTgpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc25ndCIsCXR3bygweEYwNDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzbmxlIiwJdHdvKDB4RjA0MCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNubHQiLAl0d28oMHhGMDQwLCAweDAwMUIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc29nZSIsCXR3bygweEYwNDAsIDB4MDAwMyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzb2dsIiwJdHdvKDB4RjA0MCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNvZ3QiLAl0d28oMHhGMDQwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc29sZSIsCXR3bygweEYwNDAsIDB4MDAwNSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzb2x0IiwJdHdvKDB4RjA0MCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNvciIsCXR3bygweEYwNDAsIDB4MDAwNyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzc2VxIiwJdHdvKDB4RjA0MCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNzZiIsCXR3bygweEYwNDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzc25lIiwJdHdvKDB4RjA0MCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnNzdCIsCXR3bygweEYwNDAsIDB4MDAxRiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzdCIsCQl0d28oMHhGMDQwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc3VlcSIsCXR3bygweEYwNDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzdWdlIiwJdHdvKDB4RjA0MCwgMHgwMDBCKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnN1Z3QiLAl0d28oMHhGMDQwLCAweDAwMEEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoreyJmc3VsZSIsCXR3bygweEYwNDAsIDB4MDAwRCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCit7ImZzdWx0IiwJdHdvKDB4RjA0MCwgMHgwMDBDKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKK3siZnN1biIsCXR3bygweEYwNDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCisKK3siZnNnbGRpdmIiLAl0d28oMHhGMDAwLCAweDU4MjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZzZ2xkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmc2dsZGl2bCIsCXR3bygweEYwMDAsIDB4NDAyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZnNnbGRpdnAiLAl0d28oMHhGMDAwLCAweDRDMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZzZ2xkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmc2dsZGl2dyIsCXR3bygweEYwMDAsIDB4NTAyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDAwMjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4MDAyNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmc2dsbXVsYiIsCXR3bygweEYwMDAsIDB4NTgyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZnNnbG11bGQiLAl0d28oMHhGMDAwLCAweDU0MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZzZ2xtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmc2dsbXVscCIsCXR3bygweEYwMDAsIDB4NEMyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZnNnbG11bHMiLAl0d28oMHhGMDAwLCAweDQ0MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZzZ2xtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4MDAyNyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDQ4MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDI3KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZzaW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmc2luZCIsCXR3bygweEYwMDAsIDB4NTQwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZnNpbmwiLAl0d28oMHhGMDAwLCAweDQwMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZzaW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmc2lucyIsCXR3bygweEYwMDAsIDB4NDQwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZnNpbnciLAl0d28oMHhGMDAwLCAweDUwMEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmc2lueCIsCXR3bygweEYwMDAsIDB4NDgwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZnNpbngiLAl0d28oMHhGMDAwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZnNpbmNvc2IiLAl0d28oMHhGMDAwLCAweDU4MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7YkYzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc2QiLAl0d28oMHhGMDAwLCAweDU0MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7RkYzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc2wiLAl0d28oMHhGMDAwLCAweDQwMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7bEYzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc3AiLAl0d28oMHhGMDAwLCAweDRDMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7cEYzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7ZkYzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc3ciLAl0d28oMHhGMDAwLCAweDUwMzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7d0YzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc3giLAl0d28oMHhGMDAwLCAweDAwMzApLCB0d28oMHhGMUMwLCAweEUwNzgpLCAiSWlGOEYzRjciLCBtZmxvYXQgfSwKK3siZnNpbmNvc3giLAl0d28oMHhGMDAwLCAweDQ4MzApLCB0d28oMHhGMUMwLCAweEZDNzgpLCAiSWk7eEYzRjciLCBtZmxvYXQgfSwKKworeyJmc2luaGIiLAl0d28oMHhGMDAwLCAweDU4MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZzaW5oZCIsCXR3bygweEYwMDAsIDB4NTQwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZnNpbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmc2luaHAiLAl0d28oMHhGMDAwLCAweDRDMDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZzaW5ocyIsCXR3bygweEYwMDAsIDB4NDQwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZnNpbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDAwMDIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4NDgwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTgwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZnNxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmc3FydGwiLAl0d28oMHhGMDAwLCAweDQwMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEMwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZnNxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmc3FydHciLAl0d28oMHhGMDAwLCAweDUwMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZnNzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTg0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoreyJmc3NxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCit7ImZzc3FydGwiLAl0d28oMHhGMDAwLCAweDQwNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKK3siZnNzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEM0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoreyJmc3NxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZzc3FydHciLAl0d28oMHhGMDAwLCAweDUwNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0MSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoreyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCit7ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKKworeyJmZHNxcnRiIiwJdHdvKDB4RjAwMCwgMHg1ODQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZkc3FydGQiLAl0d28oMHhGMDAwLCAweDU0NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKK3siZmRzcXJ0bCIsCXR3bygweEYwMDAsIDB4NDA0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmZHNxcnRwIiwJdHdvKDB4RjAwMCwgMHg0QzQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCit7ImZkc3FydHMiLAl0d28oMHhGMDAwLCAweDQ0NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKK3siZmRzcXJ0dyIsCXR3bygweEYwMDAsIDB4NTA0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoreyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQ1KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCit7ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDQ4NDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKK3siZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0NSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAorCit7ImZzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmc3ViZCIsCXR3bygweEYwMDAsIDB4NTQyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZnN1YmwiLAl0d28oMHhGMDAwLCAweDQwMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmc3VicyIsCXR3bygweEYwMDAsIDB4NDQyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZnN1YnciLAl0d28oMHhGMDAwLCAweDUwMjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDI4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmc3VieCIsCXR3bygweEYwMDAsIDB4NDgyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZnN1YngiLAl0d28oMHhGMDAwLCAweDAwMjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZnNzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCit7ImZzc3ViZCIsCXR3bygweEYwMDAsIDB4NTQ2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoreyJmc3N1YmwiLAl0d28oMHhGMDAwLCAweDQwNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKK3siZnNzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCit7ImZzc3VicyIsCXR3bygweEYwMDAsIDB4NDQ2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoreyJmc3N1YnciLAl0d28oMHhGMDAwLCAweDUwNjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKK3siZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDY4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCit7ImZzc3VieCIsCXR3bygweEYwMDAsIDB4NDg2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoreyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDAwNjgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKKworeyJmZHN1YmIiLAl0d28oMHhGMDAwLCAweDU4NmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKK3siZmRzdWJkIiwJdHdvKDB4RjAwMCwgMHg1NDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCit7ImZkc3VibCIsCXR3bygweEYwMDAsIDB4NDA2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoreyJmZHN1YnAiLAl0d28oMHhGMDAwLCAweDRDNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKK3siZmRzdWJzIiwJdHdvKDB4RjAwMCwgMHg0NDZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCit7ImZkc3VidyIsCXR3bygweEYwMDAsIDB4NTA2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoreyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDAwNmMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKK3siZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHg0ODZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCit7ImZkc3VieCIsCXR3bygweEYwMDAsIDB4MDA2YyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtNjgwNDB1cCB9LAorCit7ImZ0YW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmdGFuZCIsCXR3bygweEYwMDAsIDB4NTQwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKK3siZnRhbmwiLAl0d28oMHhGMDAwLCAweDQwMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCit7ImZ0YW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmdGFucyIsCXR3bygweEYwMDAsIDB4NDQwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKK3siZnRhbnciLAl0d28oMHhGMDAwLCAweDUwMEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCit7ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmdGFueCIsCXR3bygweEYwMDAsIDB4NDgwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKK3siZnRhbngiLAl0d28oMHhGMDAwLCAweDAwMEYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCisKK3siZnRhbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoreyJmdGFuaGQiLAl0d28oMHhGMDAwLCAweDU0MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZ0YW5obCIsCXR3bygweEYwMDAsIDB4NDAwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZnRhbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoreyJmdGFuaHMiLAl0d28oMHhGMDAwLCAweDQ0MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZ0YW5odyIsCXR3bygweEYwMDAsIDB4NTAwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDA5KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoreyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDQ4MDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJmdGVudG94YiIsCXR3bygweEYwMDAsIDB4NTgxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKK3siZnRlbnRveGQiLAl0d28oMHhGMDAwLCAweDU0MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCit7ImZ0ZW50b3hsIiwJdHdvKDB4RjAwMCwgMHg0MDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoreyJmdGVudG94cCIsCXR3bygweEYwMDAsIDB4NEMxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKK3siZnRlbnRveHMiLAl0d28oMHhGMDAwLCAweDQ0MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCit7ImZ0ZW50b3h3IiwJdHdvKDB4RjAwMCwgMHg1MDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoreyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKK3siZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDQ4MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCit7ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDEyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAorCit7ImZ0cmFwZXEiLAl0d28oMHhGMDdDLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXBmIiwJdHdvKDB4RjA3QywgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwZ2UiLAl0d28oMHhGMDdDLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXBnbCIsCXR3bygweEYwN0MsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcGdsZSIsCXR3bygweEYwN0MsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcGd0IiwJdHdvKDB4RjA3QywgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwbGUiLAl0d28oMHhGMDdDLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXBsdCIsCXR3bygweEYwN0MsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG5lIiwJdHdvKDB4RjA3QywgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmdlIiwJdHdvKDB4RjA3QywgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmdsIiwJdHdvKDB4RjA3QywgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmdsZSIsCXR3bygweEYwN0MsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG5ndCIsCXR3bygweEYwN0MsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG5sZSIsCXR3bygweEYwN0MsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG5sdCIsCXR3bygweEYwN0MsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG9nZSIsCXR3bygweEYwN0MsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG9nbCIsCXR3bygweEYwN0MsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG9ndCIsCXR3bygweEYwN0MsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG9sZSIsCXR3bygweEYwN0MsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG9sdCIsCXR3bygweEYwN0MsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcG9yIiwJdHdvKDB4RjA3QywgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwc2VxIiwJdHdvKDB4RjA3QywgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCit7ImZ0cmFwc2YiLAl0d28oMHhGMDdDLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXBzbmUiLAl0d28oMHhGMDdDLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXBzdCIsCXR3bygweEYwN0MsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoreyJmdHJhcHQiLAl0d28oMHhGMDdDLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXB1ZXEiLAl0d28oMHhGMDdDLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXB1Z2UiLAl0d28oMHhGMDdDLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXB1Z3QiLAl0d28oMHhGMDdDLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXB1bGUiLAl0d28oMHhGMDdDLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXB1bHQiLAl0d28oMHhGMDdDLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKK3siZnRyYXB1biIsCXR3bygweEYwN0MsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAorICAgICAgICAKK3siZnRyYXBlcXciLAl0d28oMHhGMDdBLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcGZ3IiwJdHdvKDB4RjA3QSwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBnZXciLAl0d28oMHhGMDdBLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcGdsdyIsCXR3bygweEYwN0EsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwZ2xldyIsCXR3bygweEYwN0EsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwZ3R3IiwJdHdvKDB4RjA3QSwgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBsZXciLAl0d28oMHhGMDdBLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcGx0dyIsCXR3bygweEYwN0EsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwbmV3IiwJdHdvKDB4RjA3QSwgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBuZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBuZ2x3IiwJdHdvKDB4RjA3QSwgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBuZ2xldyIsCXR3bygweEYwN0EsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwbmd0dyIsCXR3bygweEYwN0EsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwbmxldyIsCXR3bygweEYwN0EsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwbmx0dyIsCXR3bygweEYwN0EsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwb2dldyIsCXR3bygweEYwN0EsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwb2dsdyIsCXR3bygweEYwN0EsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwb2d0dyIsCXR3bygweEYwN0EsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwb2xldyIsCXR3bygweEYwN0EsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwb2x0dyIsCXR3bygweEYwN0EsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwb3J3IiwJdHdvKDB4RjA3QSwgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBzZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKK3siZnRyYXBzZnciLAl0d28oMHhGMDdBLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHNuZXciLAl0d28oMHhGMDdBLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHN0dyIsCXR3bygweEYwN0EsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCit7ImZ0cmFwdHciLAl0d28oMHhGMDdBLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHVlcXciLAl0d28oMHhGMDdBLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHVnZXciLAl0d28oMHhGMDdBLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHVndHciLAl0d28oMHhGMDdBLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHVsZXciLAl0d28oMHhGMDdBLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHVsdHciLAl0d28oMHhGMDdBLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoreyJmdHJhcHVudyIsCXR3bygweEYwN0EsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCisKK3siZnRyYXBlcWwiLAl0d28oMHhGMDdCLCAweDAwMDEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcGZsIiwJdHdvKDB4RjA3QiwgMHgwMDAwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBnZWwiLAl0d28oMHhGMDdCLCAweDAwMTMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcGdsbCIsCXR3bygweEYwN0IsIDB4MDAxNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwZ2xlbCIsCXR3bygweEYwN0IsIDB4MDAxNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwZ3RsIiwJdHdvKDB4RjA3QiwgMHgwMDEyKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBsZWwiLAl0d28oMHhGMDdCLCAweDAwMTUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcGx0bCIsCXR3bygweEYwN0IsIDB4MDAxNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmVsIiwJdHdvKDB4RjA3QiwgMHgwMDBFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBuZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDFDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBuZ2xsIiwJdHdvKDB4RjA3QiwgMHgwMDE5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBuZ2xlbCIsCXR3bygweEYwN0IsIDB4MDAxOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmd0bCIsCXR3bygweEYwN0IsIDB4MDAxRCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmxlbCIsCXR3bygweEYwN0IsIDB4MDAxQSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwbmx0bCIsCXR3bygweEYwN0IsIDB4MDAxQiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwb2dlbCIsCXR3bygweEYwN0IsIDB4MDAwMyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwb2dsbCIsCXR3bygweEYwN0IsIDB4MDAwNiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwb2d0bCIsCXR3bygweEYwN0IsIDB4MDAwMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwb2xlbCIsCXR3bygweEYwN0IsIDB4MDAwNSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwb2x0bCIsCXR3bygweEYwN0IsIDB4MDAwNCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwb3JsIiwJdHdvKDB4RjA3QiwgMHgwMDA3KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBzZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDExKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKK3siZnRyYXBzZmwiLAl0d28oMHhGMDdCLCAweDAwMTApLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHNuZWwiLAl0d28oMHhGMDdCLCAweDAwMUUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHN0bCIsCXR3bygweEYwN0IsIDB4MDAxRiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCit7ImZ0cmFwdGwiLAl0d28oMHhGMDdCLCAweDAwMEYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHVlcWwiLAl0d28oMHhGMDdCLCAweDAwMDkpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHVnZWwiLAl0d28oMHhGMDdCLCAweDAwMEIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHVndGwiLAl0d28oMHhGMDdCLCAweDAwMEEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHVsZWwiLAl0d28oMHhGMDdCLCAweDAwMEQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHVsdGwiLAl0d28oMHhGMDdCLCAweDAwMEMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoreyJmdHJhcHVubCIsCXR3bygweEYwN0IsIDB4MDAwOCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCisKK3siZnRzdGIiLAl0d28oMHhGMDAwLCAweDU4M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YiIsIG1mbG9hdCB9LAoreyJmdHN0ZCIsCXR3bygweEYwMDAsIDB4NTQzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGIiwgbWZsb2F0IH0sCit7ImZ0c3RsIiwJdHdvKDB4RjAwMCwgMHg0MDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2wiLCBtZmxvYXQgfSwKK3siZnRzdHAiLAl0d28oMHhGMDAwLCAweDRDM0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cCIsIG1mbG9hdCB9LAoreyJmdHN0cyIsCXR3bygweEYwMDAsIDB4NDQzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmIiwgbWZsb2F0IH0sCit7ImZ0c3R3IiwJdHdvKDB4RjAwMCwgMHg1MDNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3ciLCBtZmxvYXQgfSwKK3siZnRzdHgiLAl0d28oMHhGMDAwLCAweDAwM0EpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOCIsIG1mbG9hdCB9LAoreyJmdHN0eCIsCXR3bygweEYwMDAsIDB4NDgzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4IiwgbWZsb2F0IH0sCisKK3siZnR3b3RveGIiLAl0d28oMHhGMDAwLCAweDU4MTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCit7ImZ0d290b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoreyJmdHdvdG94bCIsCXR3bygweEYwMDAsIDB4NDAxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKK3siZnR3b3RveHAiLAl0d28oMHhGMDAwLCAweDRDMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCit7ImZ0d290b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoreyJmdHdvdG94dyIsCXR3bygweEYwMDAsIDB4NTAxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKK3siZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCit7ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoreyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKKworeyJoYWx0IiwJb25lKDAwNDUzMTApLAlvbmUoMDE3Nzc3NyksICIiLCAgICAgbTY4MDYwIHwgbWNmNTIwMCB9LAorCit7ImlsbGVnYWwiLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsICAgICBtNjgwMDB1cCB9LAorCit7ImptcCIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKK3sianJhIiwJCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3sianJhIiwJCW9uZSgwMDQ3MzAwKSwJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJqc3IiLAkJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7Impic3IiLAlvbmUoMDA2MDQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7Impic3IiLAlvbmUoMDA0NzIwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKK3sibGVhIiwJCW9uZSgwMDQwNzAwKSwJb25lKDAxNzA3MDApLCAiIXNBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7Imxwc3RvcCIsCXR3bygwMTc0MDAwLDAwMDA3MDApLHR3bygwMTc3Nzc3LDAxNzc3NzcpLCIjdyIsIGNwdTMyfG02ODA2MCB9LAorCit7Imxpbmt3IiwJb25lKDAwNDcxMjApLAlvbmUoMDE3Nzc3MCksICJBcyN3IiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImxpbmtsIiwJb25lKDAwNDQwMTApLAlvbmUoMDE3Nzc3MCksICJBcyNsIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJsaW5rIiwJb25lKDAwNDcxMjApLAlvbmUoMDE3Nzc3MCksICJBcyNXIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImxpbmsiLAlvbmUoMDA0NDAxMCksCW9uZSgwMTc3NzcwKSwgIkFzI2wiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCisKK3sibHNsYiIsCW9uZSgwMTYwNDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7ImxzbGIiLAlvbmUoMDE2MDQ1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJsc2x3IiwJb25lKDAxNjA1MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKK3sibHNsdyIsCW9uZSgwMTYwNTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCit7ImxzbHciLAlvbmUoMDE2MTcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoreyJsc2xsIiwJb25lKDAxNjA2MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7ImxzbGwiLAlvbmUoMDE2MDY1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJsc3JiIiwJb25lKDAxNjAwMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKK3sibHNyYiIsCW9uZSgwMTYwMDUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCit7ImxzcnciLAlvbmUoMDE2MDExMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJsc3J3IiwJb25lKDAxNjAxNTApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKK3sibHNydyIsCW9uZSgwMTYxMzAwKSwJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCit7ImxzcmwiLAlvbmUoMDE2MDIxMCksCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3sibHNybCIsCW9uZSgwMTYwMjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCisvKiBOT1RFOiBUaGUgbWNmNTIwMCBmYW1pbHkgcHJvZ3JhbW1lcidzIHJlZmVyZW5jZSBtYW51YWwgZG9lcyBub3QgCisgICBpbmRpY2F0ZSB0aGUgYnl0ZSBmb3JtIG9mIHRoZSBtb3ZlYSBpbnN0cnVjdGlvbiBpcyBpbnZhbGlkIChhcyBpdAorICAgaXMgb24gNjgwMDAgZmFtaWx5IGNwdXMpLiAgSG93ZXZlciwgZXhwZXJpbWVudHMgb24gdGhlIDUyMDIgeWVpbGQKKyAgIHVuZXhwZWN0ZWQgcmVzdWx0cy4gIFRoZSB2YWx1ZSBpcyBjb3BpZWQsIGJ1dCBpdCBpcyBub3Qgc2lnbiBleHRlbmRlZAorICAgKGFzIGlzIGRvbmUgd2l0aCBtb3ZlYS53KSBhbmQgdGhlIHRvcCB0aHJlZSBieXRlcyBpbiB0aGUgYWRkcmVzcyAKKyAgIHJlZ2lzdGVyIGFyZSBub3QgZGlzdHVyYmVkLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIGludGVuZGVkCisgICBiZWhhdmlvciAtLS0gaXQgY291bGQgYmUgYSBob2xlIGluIGluc3RydWN0aW9uIGRlY29kaW5nIChNb3Rvcm9sYQorICAgZGVjaWRlZCBub3QgdG8gdHJhcCBhbGwgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpCisgICAtLS0gYnV0IEkgc3VzcGVjdCB0aGF0IGl0IGlzIG5vdC4gICAKKworICAgSSByZXBvcnRlZCB0aGlzIHRvIE1vdG9yb2xhIElTRCBUZWNobmljYWwgQ29tbXVuaWNhdGlvbnMgU3VwcG9ydCwgCisgICB3aGljaCByZXBsaWVkIHRoYXQgb3RoZXIgY29sZGZpcmUgYXNzZW1ibGVycyByZWplY3QgbW92ZWEuYi4gIEZvciAKKyAgIHRoaXMgcmVhc29uIEkndmUgZGVjaWRlZCB0byBub3QgYWxsb3cgbW92ZWFiLiAKKworCWp0Y0BjeWdudXMuY29tIC0gOTcvMDEvMjQKKyAqLworCit7Im1vdmVhbCIsCW9uZSgwMDIwMTAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJtb3ZlYXciLAlvbmUoMDAzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJtb3ZlYyIsCW9uZSgwMDQ3MTczKSwJb25lKDAxNzc3NzcpLCAiUjFKaiIsIG02ODAxMHVwIHwgbWNmNTIwMCB9LAoreyJtb3ZlYyIsCW9uZSgwMDQ3MTczKSwJb25lKDAxNzc3NzcpLCAiUjEjaiIsIG02ODAxMHVwIHwgbWNmNTIwMCB9LAoreyJtb3ZlYyIsCW9uZSgwMDQ3MTcyKSwJb25lKDAxNzc3NzcpLCAiSmpSMSIsIG02ODAxMHVwIH0sCit7Im1vdmVjIiwJb25lKDAwNDcxNzIpLAlvbmUoMDE3Nzc3NyksICIjalIxIiwgbTY4MDEwdXAgfSwKKworeyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbXciLAlvbmUoMDA0NDI0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoreyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NDM0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAorLyogRklYTUU6IG5lZWQgc3BlY2lmaWVyIGZvciBtb2RlIDIgYW5kIDUgdG8gc2ltcGxpZnkgYmVsb3cgaW5zbiBwYXR0ZXJucyAqLworeyJtb3ZlbWwiLAlvbmUoMDA0NDMyMCksCW9uZSgwMTc3NzcwKSwgIkx3YXMiLCBtY2Y1MjAwIH0sCit7Im1vdmVtbCIsCW9uZSgwMDQ0MzIwKSwJb25lKDAxNzc3NzApLCAiI3dhcyIsIG1jZjUyMDAgfSwKK3sibW92ZW1sIiwJb25lKDAwNDQzNTApLAlvbmUoMDE3Nzc3MCksICJMd2RzIiwgbWNmNTIwMCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NDM1MCksCW9uZSgwMTc3NzcwKSwgIiN3ZHMiLCBtY2Y1MjAwIH0sCit7Im1vdmVtbCIsCW9uZSgwMDQ2MzIwKSwJb25lKDAxNzc3NzApLCAiYXNMdyIsIG1jZjUyMDAgfSwKK3sibW92ZW1sIiwJb25lKDAwNDYzMjApLAlvbmUoMDE3Nzc3MCksICJhcyN3IiwgbWNmNTIwMCB9LAoreyJtb3ZlbWwiLAlvbmUoMDA0NjM1MCksCW9uZSgwMTc3NzcwKSwgImRzTHciLCBtY2Y1MjAwIH0sCit7Im1vdmVtbCIsCW9uZSgwMDQ2MzUwKSwJb25lKDAxNzc3NzApLCAiZHMjdyIsIG1jZjUyMDAgfSwKKworeyJtb3ZlcHciLAlvbmUoMDAwMDQxMCksCW9uZSgwMTcwNzcwKSwgImRzRGQiLCBtNjgwMDB1cCB9LAoreyJtb3ZlcHciLAlvbmUoMDAwMDYxMCksCW9uZSgwMTcwNzcwKSwgIkRkZHMiLCBtNjgwMDB1cCB9LAoreyJtb3ZlcGwiLAlvbmUoMDAwMDUxMCksCW9uZSgwMTcwNzcwKSwgImRzRGQiLCBtNjgwMDB1cCB9LAoreyJtb3ZlcGwiLAlvbmUoMDAwMDcxMCksCW9uZSgwMTcwNzcwKSwgIkRkZHMiLCBtNjgwMDB1cCB9LAorCit7Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICJNc0RkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICIjQkRkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKKy8qIFRoZSBtb3ZlIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIG1vdmVhIGFuZCBtb3ZlcSBpbnN0cnVjdGlvbnMuICAqLworeyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAiO2IkZCIsIG02ODAwMHVwIH0sCit7Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmNTIwMCB9LAoreyJtb3ZlYiIsCW9uZSgwMDEwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZjUyMDAgfSwKK3sibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9ibWQiLCBtY2Y1MjAwIH0sCisKK3sibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIip3JWQiLCBtNjgwMDB1cCB9LAoreyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZjUyMDAgfSwKK3sibW92ZXciLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2Y1MjAwIH0sCit7Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmNTIwMCB9LAoreyJtb3ZldyIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3MDApLCAiU3MkcyIsIG02ODAwMHVwIH0sCit7Im1vdmV3IiwJb25lKDAwNDAzMDApLAlvbmUoMDE3Nzc3MCksICJTc0RzIiwgbWNmNTIwMCB9LAoreyJtb3ZldyIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3MDApLCAiQ3MkcyIsIG02ODAxMHVwIH0sCit7Im1vdmV3IiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmNTIwMCB9LAoreyJtb3ZldyIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiO3dDZCIsIG02ODAwMHVwIH0sCit7Im1vdmV3IiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmNTIwMCB9LAoreyJtb3ZldyIsCW9uZSgwMDQyMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dDZCIsIG1jZjUyMDAgfSwKK3sibW92ZXciLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIjt3U2QiLCBtNjgwMDB1cCB9LAoreyJtb3ZldyIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiRHNTZCIsIG1jZjUyMDAgfSwKK3sibW92ZXciLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2Y1MjAwIH0sCisKK3sibW92ZWwiLAlvbmUoMDA3MDAwMCksCW9uZSgwMTcwNDAwKSwgIk1zRGQiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKK3sibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIipsJWQiLCBtNjgwMDB1cCB9LAoreyJtb3ZlbCIsCW9uZSgwMDIwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZjUyMDAgfSwKK3sibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2Y1MjAwIH0sCit7Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICJvbG1kIiwgbWNmNTIwMCB9LAoreyJtb3ZlbCIsCW9uZSgwMDQ3MTQwKSwJb25lKDAxNzc3NzApLCAiQXNVZCIsIG02ODAwMHVwIH0sCit7Im1vdmVsIiwJb25lKDAwNDcxNTApLAlvbmUoMDE3Nzc3MCksICJVZEFzIiwgbTY4MDAwdXAgfSwKKworeyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICIqdyVkIiwgbTY4MDAwdXAgfSwKK3sibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibXMlZCIsIG1jZjUyMDAgfSwKK3sibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZjUyMDAgfSwKK3sibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAib3dtZCIsIG1jZjUyMDAgfSwKK3sibW92ZSIsCW9uZSgwMDQwMzAwKSwJb25lKDAxNzc3MDApLCAiU3MkcyIsIG02ODAwMHVwIH0sCit7Im1vdmUiLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzcwKSwgIlNzRHMiLCBtY2Y1MjAwIH0sCit7Im1vdmUiLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoreyJtb3ZlIiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmNTIwMCB9LAoreyJtb3ZlIiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICI7d0NkIiwgbTY4MDAwdXAgfSwKK3sibW92ZSIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiRHNDZCIsIG1jZjUyMDAgfSwKK3sibW92ZSIsCW9uZSgwMDQyMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dDZCIsIG1jZjUyMDAgfSwKK3sibW92ZSIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiO3dTZCIsIG02ODAwMHVwIH0sCit7Im1vdmUiLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2Y1MjAwIH0sCit7Im1vdmUiLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2Y1MjAwIH0sCisKK3sibW92ZSIsCW9uZSgwMDQ3MTQwKSwJb25lKDAxNzc3NzApLCAiQXNVZCIsIG02ODAwMHVwIH0sCit7Im1vdmUiLAlvbmUoMDA0NzE1MCksCW9uZSgwMTc3NzcwKSwgIlVkQXMiLCBtNjgwMDB1cCB9LAorCit7Im1vdmVzYiIsCXR3bygwMDA3MDAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKK3sibW92ZXNiIiwJdHdvKDAwMDcwMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAoreyJtb3Zlc3ciLAl0d28oMDAwNzEwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCit7Im1vdmVzdyIsCXR3bygwMDA3MTAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKK3sibW92ZXNsIiwJdHdvKDAwMDcyMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoreyJtb3Zlc2wiLAl0d28oMDAwNzIwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCisKK3sibW92ZTE2IiwJdHdvKDB4ZjYyMCwgMHg4MDAwKSwgdHdvKDB4ZmZmOCwgMHg4ZmZmKSwgIitzKzEiLCBtNjgwNDB1cCB9LAoreyJtb3ZlMTYiLAlvbmUoMHhmNjAwKSwJCW9uZSgweGZmZjgpLCAiK3NfTCIsIG02ODA0MHVwIH0sCit7Im1vdmUxNiIsCW9uZSgweGY2MDgpLAkJb25lKDB4ZmZmOCksICJfTCtzIiwgbTY4MDQwdXAgfSwKK3sibW92ZTE2IiwJb25lKDB4ZjYxMCksCQlvbmUoMHhmZmY4KSwgImFzX0wiLCBtNjgwNDB1cCB9LAoreyJtb3ZlMTYiLAlvbmUoMHhmNjE4KSwJCW9uZSgweGZmZjgpLCAiX0xhcyIsIG02ODA0MHVwIH0sCisKK3sibXVsc3ciLAlvbmUoMDE0MDcwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXB8bWNmNTIwMCB9LAoreyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEMSIsIG02ODAyMHVwfGNwdTMyIH0sCit7Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICJxc0QxIiwgbWNmNTIwMCB9LAoreyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNjAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAorCit7Im11bHV3IiwJb25lKDAxNDAzMDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwfG1jZjUyMDAgfSwKK3sibXVsdWwiLAl0d28oMDA0NjAwMCwwMDAwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJtdWx1bCIsCXR3bygwMDQ2MDAwLDAwMDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAicXNEMSIsIG1jZjUyMDAgfSwKK3sibXVsdWwiLAl0d28oMDA0NjAwMCwwMDIwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKKworeyJuYmNkIiwJb25lKDAwNDQwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCisKK3sibmVnYiIsCW9uZSgwMDQyMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJuZWd3IiwJb25lKDAwNDIxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCit7Im5lZ2wiLAlvbmUoMDA0MjIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKK3sibmVnbCIsCW9uZSgwMDQyMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwfSwKKworeyJuZWd4YiIsCW9uZSgwMDQwMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJuZWd4dyIsCW9uZSgwMDQwMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJuZWd4bCIsCW9uZSgwMDQwMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJuZWd4bCIsCW9uZSgwMDQwMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwfSwKKworeyJub3AiLAkJb25lKDAwNDcxNjEpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB8IG1jZjUyMDB9LAorCit7Im5vdGIiLAlvbmUoMDA0MzAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKK3sibm90dyIsCW9uZSgwMDQzMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJub3RsIiwJb25lKDAwNDMyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCit7Im5vdGwiLAlvbmUoMDA0MzIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMH0sCisKK3sib3JpYiIsCW9uZSgwMDAwMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7Im9yaWIiLAlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJvcml3IiwJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKK3sib3JpdyIsCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCit7Im9yaWwiLAlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoreyJvcmlsIiwJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmNTIwMCB9LAoreyJvcmkiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKK3sib3JpIiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCit7Im9yaSIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAorCisvKiBUaGUgb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgb3JpIGluc3RydWN0aW9uLiAgKi8KK3sib3JiIiwJCW9uZSgwMDAwMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCit7Im9yYiIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoreyJvcmIiLAkJb25lKDAxMDAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKK3sib3JiIiwJCW9uZSgwMTAwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCit7Im9ydyIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoreyJvcnciLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKK3sib3J3IiwJCW9uZSgwMTAwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCit7Im9ydyIsCQlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoreyJvcmwiLAkJb25lKDAwMDAyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKK3sib3JsIiwJCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKK3sib3JsIiwJCW9uZSgwMTAwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJvcmwiLAkJb25lKDAxMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7Im9yIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCit7Im9yIiwJCW9uZSgwMDAwMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCit7Im9yIiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCit7Im9yIiwJCW9uZSgwMTAwMTAwKSwJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCit7Im9yIiwJCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCisKK3sicGFjayIsCW9uZSgwMTAwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCN3IiwgbTY4MDIwdXAgfSwKK3sicGFjayIsCW9uZSgwMTAwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCN3IiwgbTY4MDIwdXAgfSwKKworeyJwYmFjIiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCit7InBiYWN3IiwJb25lKDB4ZjA4NyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCit7InBiYXMiLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKK3sicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKK3sicGJiYyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoreyJwYmJjdyIsCW9uZSgweGYwODEpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoreyJwYmJzIiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCit7InBiYnN3IiwJb25lKDB4ZjA4MCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCit7InBiY2MiLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKK3sicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKK3sicGJjcyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoreyJwYmNzdyIsCW9uZSgweGYwOGUpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoreyJwYmdjIiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCit7InBiZ2N3IiwJb25lKDB4ZjA4ZCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCit7InBiZ3MiLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKK3sicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKK3sicGJpYyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoreyJwYmljdyIsCW9uZSgweGYwOGIpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoreyJwYmlzIiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCit7InBiaXN3IiwJb25lKDB4ZjA4YSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCit7InBibGMiLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKK3sicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKK3sicGJscyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoreyJwYmxzdyIsCW9uZSgweGYwODIpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoreyJwYnNjIiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCit7InBic2N3IiwJb25lKDB4ZjA4NSksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCit7InBic3MiLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKK3sicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKK3sicGJ3YyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoreyJwYndjdyIsCW9uZSgweGYwODkpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoreyJwYndzIiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCit7InBid3N3IiwJb25lKDB4ZjA4OCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCisKK3sicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoreyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCit7InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKK3sicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoreyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCit7InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKK3sicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoreyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCit7InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKK3sicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoreyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCit7InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKK3sicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoreyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCit7InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKK3sicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAorCit7InBlYSIsCQlvbmUoMDA0NDEwMCksCQlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwfG1jZjUyMDAgfSwKKworeyJwZmx1c2hhIiwJb25lKDB4ZjUxOCksCQlvbmUoMHhmZmY4KSwgIiIsIG02ODA0MHVwIH0sCit7InBmbHVzaGEiLAl0d28oMHhmMDAwLDB4MjQwMCksIHR3bygweGZmZmYsMHhmZmZmKSwgIiIsIG02ODAzMCB8IG02ODg1MSB9LAorCit7InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMTApLCB0d28oMHhmZmMwLDB4ZmUxMCksICJUM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODEwKSwgdHdvKDB4ZmZjMCwweGZlMTApLCAiVDNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoreyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDA4KSwgdHdvKDB4ZmZjMCwweGZlMTgpLCAiRDNUOSIsIG02ODAzMHxtNjg4NTEgfSwKK3sicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgwOCksIHR3bygweGZmYzAsMHhmZTE4KSwgIkQzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKK3sicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAwMCksIHR3bygweGZmYzAsMHhmZTFlKSwgImYzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MDApLCB0d28oMHhmZmMwLDB4ZmUxZSksICJmM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCit7InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJBcyIsIG02ODA0MHVwIH0sCisKK3sicGZsdXNoYW4iLAlvbmUoMHhmNTEwKSwJCW9uZSgweGZmZjgpLCAiIiwgbTY4MDQwdXAgfSwKK3sicGZsdXNobiIsCW9uZSgweGY1MDApLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCit7InBmbHVzaG4iLAlvbmUoMHhmNTAwKSwJCW9uZSgweGZmZjgpLCAiQXMiLCBtNjgwNDB1cCB9LAorCit7InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLCB0d28oMHhmZmMwLCAweGZmZmYpLCAifHMiLCBtNjg4NTEgfSwKKworeyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwgdHdvKDB4ZmZmOCwgMHhmZTEwKSwgIlQzVDkiLCBtNjg4NTEgfSwKK3sicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MxMCksIHR3bygweGZmZjgsIDB4ZmUxMCksICJUM1Q5JnMiLCBtNjg4NTEgfSwKK3sicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksIHR3bygweGZmZjgsIDB4ZmUxOCksICJEM1Q5IiwgbTY4ODUxIH0sCit7InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLCB0d28oMHhmZmY4LCAweGZlMTgpLCAiRDNUOSZzIiwgbTY4ODUxIH0sCit7InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDApLCB0d28oMHhmZmY4LCAweGZlMWUpLCAiZjNUOSIsIG02ODg1MSB9LAoreyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwgdHdvKDB4ZmZmOCwgMHhmZTFlKSwgImYzVDkmcyIsIG02ODg1MSB9LAorCit7InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCisKK3sicGxwYXIiLAlvbmUoMHhmNWM4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKK3sicGxwYXciLAlvbmUoMHhmNTg4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKKworeyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqbDA4IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDVjMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqdzE4IiwgbTY4ODUxIH0sCit7InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIipiMjgiLCBtNjg4NTEgfSwKK3sicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMDglcyIsIG02ODAzMHxtNjg4NTEgfSwKK3sicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg1ZTAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMTglcyIsIG02ODg1MSB9LAoreyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICIyOCVzIiwgbTY4ODUxIH0sCit7InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIlc4fnMiLCBtNjgwMzB8bTY4ODUxIH0sCit7InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjIwMCksIHR3bygweGZmYzAsMHhlM2UzKSwgIip3WDMiLCBtNjg4NTEgfSwKK3sicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MDAwKSwgdHdvKDB4ZmZjMCwweGUzZTMpLCAiWDMlcyIsIG02ODg1MSB9LAoreyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqd1k4IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYyMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJZOCVzIiwgbTY4MDMwfG02ODg1MSB9LAoreyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDY2MDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJaOCVzIiwgbTY4ODUxIH0sCit7InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4MDgwMCksIHR3bygweGZmYzAsMHhmYmZmKSwgIipsMzgiLCBtNjgwMzAgfSwKK3sicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHgwYTAwKSwgdHdvKDB4ZmZjMCwweGZiZmYpLCAiMzglcyIsIG02ODAzMCB9LAorCit7InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDQxMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLCAiKmwwOCIsIG02ODAzMCB9LAoreyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHg0MTAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzAgfSwKK3sicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4MDkwMCksCXR3bygweGZmYzAsIDB4ZmJmZiksICIqbDM4IiwgbTY4MDMwIH0sCisKK3sicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLCAiPHMiLCBtNjg4NTEgfSwKKworeyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksICI+cyIsIG02ODg1MSB9LAorCit7InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKK3sicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoreyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCit7InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKK3sicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoreyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCit7InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKK3sicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoreyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCit7InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKK3sicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoreyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCit7InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKK3sicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoreyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCit7InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKKworeyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIxMCksIHR3bygweGZmYzAsIDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCit7InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCit7InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKK3sicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKK3sicHRlc3RyIiwJb25lKDB4ZjU2OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCisKK3sicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMTApLCB0d28oMHhmZmMwLDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCit7InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCit7InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODEwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoreyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKK3sicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKK3sicHRlc3R3IiwJb25lKDB4ZjU0OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCisKK3sicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKK3sicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKK3sicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAorCit7InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCit7InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCit7InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKKworeyJwdHJhcGJjdyIsCXR3bygweGYwN2EsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoreyJwdHJhcGJjbCIsCXR3bygweGYwN2IsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoreyJwdHJhcGJjIiwJdHdvKDB4ZjA3YywgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCisKK3sicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKK3sicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKK3sicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAorCit7InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCit7InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCit7InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKKworeyJwdHJhcGNzdyIsCXR3bygweGYwN2EsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoreyJwdHJhcGNzbCIsCXR3bygweGYwN2IsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoreyJwdHJhcGNzIiwJdHdvKDB4ZjA3YywgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCisKK3sicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKK3sicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKK3sicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAorCit7InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCit7InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCit7InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKKworeyJwdHJhcGljdyIsCXR3bygweGYwN2EsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoreyJwdHJhcGljbCIsCXR3bygweGYwN2IsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoreyJwdHJhcGljIiwJdHdvKDB4ZjA3YywgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCisKK3sicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKK3sicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKK3sicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAorCit7InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCit7InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCit7InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKKworeyJwdHJhcGxzdyIsCXR3bygweGYwN2EsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoreyJwdHJhcGxzbCIsCXR3bygweGYwN2IsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoreyJwdHJhcGxzIiwJdHdvKDB4ZjA3YywgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCisKK3sicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKK3sicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKK3sicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAorCit7InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCit7InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCit7InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKKworeyJwdHJhcHdjdyIsCXR3bygweGYwN2EsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoreyJwdHJhcHdjbCIsCXR3bygweGYwN2IsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoreyJwdHJhcHdjIiwJdHdvKDB4ZjA3YywgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCisKK3sicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKK3sicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKK3sicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAorCit7InB1bHNlIiwJb25lKDAwNDUzMTQpLAkJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDYwIHwgbWNmNTIwMCB9LAorCit7InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksICJWcyZzIiwgbTY4ODUxIH0sCit7InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksICJBMyZzIiwgbTY4ODUxIH0sCisKKworeyJyZXNldCIsCW9uZSgwMDQ3MTYwKSwJCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIH0sCisKK3sicm9sYiIsCW9uZSgwMTYwNDMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJyb2xiIiwJb25lKDAxNjA0NzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCit7InJvbHciLAlvbmUoMDE2MDUzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKK3sicm9sdyIsCW9uZSgwMTYwNTcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJyb2x3IiwJb25lKDAxNjM3MDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCit7InJvbGwiLAlvbmUoMDE2MDYzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKK3sicm9sbCIsCW9uZSgwMTYwNjcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAorCit7InJvcmIiLAlvbmUoMDE2MDAzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKK3sicm9yYiIsCW9uZSgwMTYwMDcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJyb3J3IiwJb25lKDAxNjAxMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7InJvcnciLAlvbmUoMDE2MDE3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKK3sicm9ydyIsCW9uZSgwMTYzMzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoreyJyb3JsIiwJb25lKDAxNjAyMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7InJvcmwiLAlvbmUoMDE2MDI3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKKworeyJyb3hsYiIsCW9uZSgwMTYwNDIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJyb3hsYiIsCW9uZSgwMTYwNDYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJyb3hsdyIsCW9uZSgwMTYwNTIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJyb3hsdyIsCW9uZSgwMTYwNTYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoreyJyb3hsdyIsCW9uZSgwMTYyNzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoreyJyb3hsbCIsCW9uZSgwMTYwNjIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoreyJyb3hsbCIsCW9uZSgwMTYwNjYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAorCit7InJveHJiIiwJb25lKDAxNjAwMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7InJveHJiIiwJb25lKDAxNjAwNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCit7InJveHJ3IiwJb25lKDAxNjAxMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7InJveHJ3IiwJb25lKDAxNjAxNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCit7InJveHJ3IiwJb25lKDAxNjIzMDApLAkJb25lKDAxNzc3MDApLCAifnMiLCAgIG02ODAwMHVwIH0sCit7InJveHJsIiwJb25lKDAxNjAyMjApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCit7InJveHJsIiwJb25lKDAxNjAyNjApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCisKK3sicnRkIiwJCW9uZSgwMDQ3MTY0KSwJCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDEwdXAgfSwKKworeyJydGUiLAkJb25lKDAwNDcxNjMpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2Y1MjAwIH0sCisKK3sicnRtIiwJCW9uZSgwMDAzMzAwKSwJCW9uZSgwMTc3NzYwKSwgIlJzIiwgbTY4MDIwIH0sCisKK3sicnRyIiwJCW9uZSgwMDQ3MTY3KSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXAgfSwKKworeyJydHMiLAkJb25lKDAwNDcxNjUpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2Y1MjAwIH0sCisKK3sic2JjZCIsCW9uZSgwMTAwNDAwKSwJCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoreyJzYmNkIiwJb25lKDAxMDA0MTApLAkJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCisKKworeyJzY2MiLAkJb25lKDAwNTIzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCit7InNjYyIsCQlvbmUoMDA1MjMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMCB9LAoreyJzY3MiLAkJb25lKDAwNTI3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCit7InNjcyIsCQlvbmUoMDA1MjcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMCB9LAoreyJzZXEiLAkJb25lKDAwNTM3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCit7InNlcSIsCQlvbmUoMDA1MzcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmNTIwMCB9LAoreyJzZiIsCQlvbmUoMDA1MDcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKK3sic2YiLAkJb25lKDAwNTA3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic2dlIiwJCW9uZSgwMDU2MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzZ2UiLAkJb25lKDAwNTYzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic2d0IiwJCW9uZSgwMDU3MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzZ3QiLAkJb25lKDAwNTczMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic2hpIiwJCW9uZSgwMDUxMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzaGkiLAkJb25lKDAwNTEzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic2xlIiwJCW9uZSgwMDU3NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzbGUiLAkJb25lKDAwNTc3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic2xzIiwJCW9uZSgwMDUxNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzbHMiLAkJb25lKDAwNTE3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic2x0IiwJCW9uZSgwMDU2NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzbHQiLAkJb25lKDAwNTY3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic21pIiwJCW9uZSgwMDU1NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzbWkiLAkJb25lKDAwNTU3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic25lIiwJCW9uZSgwMDUzMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzbmUiLAkJb25lKDAwNTMzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic3BsIiwJCW9uZSgwMDU1MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoreyJzcGwiLAkJb25lKDAwNTUzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZjUyMDAgfSwKK3sic3QiLAkJb25lKDAwNTAzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCit7InN0IiwJCW9uZSgwMDUwMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwIH0sCit7InN2YyIsCQlvbmUoMDA1NDMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKK3sic3ZjIiwJCW9uZSgwMDU0MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwIH0sCit7InN2cyIsCQlvbmUoMDA1NDcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKK3sic3ZzIiwJCW9uZSgwMDU0NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Y1MjAwIH0sCisKK3sic3RvcCIsCW9uZSgwMDQ3MTYyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJzdWJhbCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJzdWJhdyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCisKK3sic3ViaWIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoreyJzdWJpdyIsCW9uZSgwMDAyMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCit7InN1YmlsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKK3sic3ViaWwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2Y1MjAwIH0sCisKK3sic3VicWIiLAlvbmUoMDA1MDQwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoreyJzdWJxdyIsCW9uZSgwMDUwNTAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCit7InN1YnFsIiwJb25lKDAwNTA2MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCisKKy8qIFRoZSBzdWIgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgc3ViYSwgc3ViaSwgYW5kIHN1YnEgaW5zdHJ1Y3Rpb25zLiAgKi8KK3sic3ViYiIsCW9uZSgwMDUwNDAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCit7InN1YmIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoreyJzdWJiIiwJb25lKDAxMTAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKK3sic3ViYiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCit7InN1YnciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoreyJzdWJ3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKK3sic3VidyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCit7InN1YnciLAlvbmUoMDExMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoreyJzdWJ3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKK3sic3VibCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJzdWJsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKK3sic3VibCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZjUyMDAgfSwKK3sic3VibCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAoreyJzdWJsIiwJb25lKDAxMTAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7InN1YmwiLAlvbmUoMDExMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJzdWJ4YiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCit7InN1YnhiIiwJb25lKDAxMTA0MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKK3sic3VieHciLAlvbmUoMDExMDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoreyJzdWJ4dyIsCW9uZSgwMTEwNTEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCit7InN1YnhsIiwJb25lKDAxMTA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7InN1YnhsIiwJb25lKDAxMTA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKKworeyJzd2FwIiwJb25lKDAwNDQxMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCisvKiBzd2JlZyBhbmQgc3diZWdsIGFyZSBtYWdpYyBjb25zdGFudHMgdXNlZCBvbiBzeXNWNjguICBUaGUgY29tcGlsZXIKKyAgIGdlbmVyYXRlcyB0aGVtIGJlZm9yZSBhIHN3aXRjaCB0YWJsZS4gIFRoZXkgdGVsbCB0aGUgZGVidWdnZXIgYW5kCisgICBkaXNhc3NlbWJsZXIgdGhhdCBhIHN3aXRjaCB0YWJsZSBmb2xsb3dzLiAgVGhlIHBhcmFtZXRlciBpcyB0aGUKKyAgIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdGFibGUuICBzd2JlZyBtZWFucyB0aGF0IHRoZSBlbnRyaWVzIGluCisgICB0aGUgdGFibGUgYXJlIHdvcmQgKDIgYnl0ZSkgc2l6ZWQsIGFuZCBzd2JlZ2wgbWVhbnMgdGhhdCB0aGUKKyAgIGVudHJpZXMgaW4gdGhlIHRhYmxlIGFyZSBsb25nd29yZCAoNCBieXRlKSBzaXplZC4gICovCit7InN3YmVnIiwJb25lKDAwNDUzNzQpLAlvbmUoMDE3Nzc3NyksICIjdyIsICAgbTY4MDAwdXAgfCBtY2Y1MjAwIH0sCit7InN3YmVnbCIsCW9uZSgwMDQ1Mzc1KSwJb25lKDAxNzc3NzcpLCAiI2wiLCAgIG02ODAwMHVwIHwgbWNmNTIwMCB9LAorCit7InRhcyIsCQlvbmUoMDA0NTMwMCksCQlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCisKKyNkZWZpbmUgVEJMMShuYW1lLHNpZ25lZCxyb3VuZCxzaXplKQkJCQkJXAorICB7bmFtZSwgdHdvKDAxNzQwMDAsIChzaWduZWQ8PDExKXwoIXJvdW5kPDwxMCl8KHNpemU8PDYpfDAwMDA0MDApLAlcCisgICAgIHR3bygwMTc3NzAwLDAxMDc3NzcpLCAiIXNEMSIsIGNwdTMyIH0sCQkJCVwKKyAge25hbWUsIHR3bygwMTc0MDAwLCAoc2lnbmVkPDwxMSl8KCFyb3VuZDw8MTApfChzaXplPDw2KSksCQlcCisgICAgIHR3bygwMTc3NzcwLDAxMDc3NzApLCAiRHNEM0QxIiwgY3B1MzIgfQorI2RlZmluZSBUQkwobmFtZTEsIG5hbWUyLCBuYW1lMywgcywgcikgXAorICBUQkwxKG5hbWUxLCBzLCByLCAwKSwgVEJMMShuYW1lMiwgcywgciwgMSksIFRCTDEobmFtZTMsIHMsIHIsIDIpCitUQkwoInRibHNiIiwgInRibHN3IiwgInRibHNsIiwgMSwgMSksCitUQkwoInRibHNuYiIsICJ0YmxzbnciLCAidGJsc25sIiwgMSwgMCksCitUQkwoInRibHViIiwgInRibHV3IiwgInRibHVsIiwgMCwgMSksCitUQkwoInRibHVuYiIsICJ0Ymx1bnciLCAidGJsdW5sIiwgMCwgMCksCisKK3sidHJhcCIsCW9uZSgwMDQ3MTAwKSwJb25lKDAxNzc3NjApLCAiVHMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJ0cmFwY2MiLAlvbmUoMDA1MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3sidHJhcGNzIiwJb25lKDAwNTI3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7InRyYXBlcSIsCW9uZSgwMDUzNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJ0cmFwZiIsCW9uZSgwMDUwNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB8IG1jZjUyMDAgfSwKK3sidHJhcGdlIiwJb25lKDAwNTYzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7InRyYXBndCIsCW9uZSgwMDU3Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJ0cmFwaGkiLAlvbmUoMDA1MTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3sidHJhcGxlIiwJb25lKDAwNTc3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7InRyYXBscyIsCW9uZSgwMDUxNzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJ0cmFwbHQiLAlvbmUoMDA1Njc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3sidHJhcG1pIiwJb25lKDAwNTU3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7InRyYXBuZSIsCW9uZSgwMDUzMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoreyJ0cmFwcGwiLAlvbmUoMDA1NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3sidHJhcHQiLAlvbmUoMDA1MDM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKK3sidHJhcHZjIiwJb25lKDAwNTQzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCit7InRyYXB2cyIsCW9uZSgwMDU0Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAorCit7InRyYXBjY3ciLAlvbmUoMDA1MjM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcGNzdyIsCW9uZSgwMDUyNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwZXF3IiwJb25lKDAwNTM3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBmdyIsCW9uZSgwMDUwNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMnxtY2Y1MjAwfSwKK3sidHJhcGdldyIsCW9uZSgwMDU2MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwZ3R3IiwJb25lKDAwNTczNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBoaXciLAlvbmUoMDA1MTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcGxldyIsCW9uZSgwMDU3NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwbHN3IiwJb25lKDAwNTE3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBsdHciLAlvbmUoMDA1Njc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcG1pdyIsCW9uZSgwMDU1NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwbmV3IiwJb25lKDAwNTMzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBwbHciLAlvbmUoMDA1NTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcHR3IiwJb25lKDAwNTAzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXB2Y3ciLAlvbmUoMDA1NDM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcHZzdyIsCW9uZSgwMDU0NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAorCit7InRyYXBjY2wiLAlvbmUoMDA1MjM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcGNzbCIsCW9uZSgwMDUyNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwZXFsIiwJb25lKDAwNTM3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBmbCIsCW9uZSgwMDUwNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMnxtY2Y1MjAwfSwKK3sidHJhcGdlbCIsCW9uZSgwMDU2MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwZ3RsIiwJb25lKDAwNTczNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBoaWwiLAlvbmUoMDA1MTM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcGxlbCIsCW9uZSgwMDU3NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwbHNsIiwJb25lKDAwNTE3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBsdGwiLAlvbmUoMDA1Njc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcG1pbCIsCW9uZSgwMDU1NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoreyJ0cmFwbmVsIiwJb25lKDAwNTMzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXBwbGwiLAlvbmUoMDA1NTM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcHRsIiwJb25lKDAwNTAzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCit7InRyYXB2Y2wiLAlvbmUoMDA1NDM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKK3sidHJhcHZzbCIsCW9uZSgwMDU0NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAorCit7InRyYXB2IiwJb25lKDAwNDcxNjYpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB9LAorCit7InRzdGIiLAlvbmUoMDA0NTAwMCksCW9uZSgwMTc3NzAwKSwgIjtiIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAoreyJ0c3RiIiwJb25lKDAwNDUwMDApLAlvbmUoMDE3NzcwMCksICIkYiIsIG02ODAwMHVwIH0sCit7InRzdHciLAlvbmUoMDA0NTEwMCksCW9uZSgwMTc3NzAwKSwgIip3IiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAoreyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIkdyIsIG02ODAwMHVwIH0sCit7InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIipsIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmNTIwMCB9LAoreyJ0c3RsIiwJb25lKDAwNDUyMDApLAlvbmUoMDE3NzcwMCksICIkbCIsIG02ODAwMHVwIH0sCisKK3sidW5sayIsCW9uZSgwMDQ3MTMwKSwJb25lKDAxNzc3NzApLCAiQXMiLCBtNjgwMDB1cCB8IG1jZjUyMDAgfSwKKworeyJ1bnBrIiwJb25lKDAxMDA2MDApLAlvbmUoMDE3MDc3MCksICJEc0RkI3ciLCBtNjgwMjB1cCB9LAoreyJ1bnBrIiwJb25lKDAxMDA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kI3ciLCBtNjgwMjB1cCB9LAorCit7IndkZGF0YWIiLAlvbmUoMDE3MjAwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2Y1MjAwIH0sCit7IndkZGF0YXciLAlvbmUoMDE3MjEwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2Y1MjAwIH0sCit7IndkZGF0YWwiLAlvbmUoMDE3MjIwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2Y1MjAwIH0sCisKK307CisKK2NvbnN0IGludCBtNjhrX251bW9wY29kZXMgPSBzaXplb2YgbTY4a19vcGNvZGVzIC8gc2l6ZW9mIG02OGtfb3Bjb2Rlc1swXTsKKworLyogVGhlc2UgYWxpYXNlcyB1c2VkIHRvIGJlIGluIHRoZSBhYm92ZSB0YWJsZSwgZWFjaCBvbmUgZHVwbGljYXRpbmcKKyAgIGFsbCBvZiB0aGUgZW50cmllcyBmb3IgaXRzIHByaW1hcnkgZXhhY3RseS4gIFRoaXMgdGFibGUgd2FzCisgICBjb25zdHJ1Y3RlZCBieSBtZWNoYW5pY2FsIHByb2Nlc3Npbmcgb2YgdGhlIG9wY29kZSB0YWJsZSwgd2l0aCBhCisgICBzbWFsbCBudW1iZXIgb2YgdHdlYWtzIGRvbmUgYnkgaGFuZC4gIFRoZXJlIGFyZSBwcm9iYWJseSBhIGxvdCBtb3JlCisgICBhbGlhc2VzIGFib3ZlIHRoYXQgY291bGQgYmUgbW92ZWQgZG93biBoZXJlLCBleGNlcHQgZm9yIHZlcnkgbWlub3IKKyAgIGRpZmZlcmVuY2VzLiAgKi8KKworY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzIG02OGtfb3Bjb2RlX2FsaWFzZXNbXSA9Cit7CisgIHsgImFkZCIsCSJhZGR3IiwgfSwKKyAgeyAiYWRkYSIsCSJhZGRhdyIsIH0sCisgIHsgImFkZGkiLAkiYWRkaXciLCB9LAorICB7ICJhZGRxIiwJImFkZHF3IiwgfSwKKyAgeyAiYWRkeCIsCSJhZGR4dyIsIH0sCisgIHsgImFzbCIsCSJhc2x3IiwgfSwKKyAgeyAiYXNyIiwJImFzcnciLCB9LAorICB7ICJiaGkiLAkiYmhpdyIsIH0sCisgIHsgImJscyIsCSJibHN3IiwgfSwKKyAgeyAiYmNjIiwJImJjY3ciLCB9LAorICB7ICJiY3MiLAkiYmNzdyIsIH0sCisgIHsgImJuZSIsCSJibmV3IiwgfSwKKyAgeyAiYmVxIiwJImJlcXciLCB9LAorICB7ICJidmMiLAkiYnZjdyIsIH0sCisgIHsgImJ2cyIsCSJidnN3IiwgfSwKKyAgeyAiYnBsIiwJImJwbHciLCB9LAorICB7ICJibWkiLAkiYm1pdyIsIH0sCisgIHsgImJnZSIsCSJiZ2V3IiwgfSwKKyAgeyAiYmx0IiwJImJsdHciLCB9LAorICB7ICJiZ3QiLAkiYmd0dyIsIH0sCisgIHsgImJsZSIsCSJibGV3IiwgfSwKKyAgeyAiYnJhIiwJImJyYXciLCB9LAorICB7ICJic3IiLAkiYnNydyIsIH0sCisgIHsgImJoaWIiLAkiYmhpcyIsIH0sCisgIHsgImJsc2IiLAkiYmxzcyIsIH0sCisgIHsgImJjY2IiLAkiYmNjcyIsIH0sCisgIHsgImJjc2IiLAkiYmNzcyIsIH0sCisgIHsgImJuZWIiLAkiYm5lcyIsIH0sCisgIHsgImJlcWIiLAkiYmVxcyIsIH0sCisgIHsgImJ2Y2IiLAkiYnZjcyIsIH0sCisgIHsgImJ2c2IiLAkiYnZzcyIsIH0sCisgIHsgImJwbGIiLAkiYnBscyIsIH0sCisgIHsgImJtaWIiLAkiYm1pcyIsIH0sCisgIHsgImJnZWIiLAkiYmdlcyIsIH0sCisgIHsgImJsdGIiLAkiYmx0cyIsIH0sCisgIHsgImJndGIiLAkiYmd0cyIsIH0sCisgIHsgImJsZWIiLAkiYmxlcyIsIH0sCisgIHsgImJyYWIiLAkiYnJhcyIsIH0sCisgIHsgImJzcmIiLAkiYnNycyIsIH0sCisgIHsgImJocyIsCSJiY2N3IiB9LAorICB7ICJiaHNzIiwJImJjY3MiIH0sCisgIHsgImJoc2IiLAkiYmNjcyIgfSwKKyAgeyAiYmhzdyIsCSJiY2N3IiB9LAorICB7ICJiaHNsIiwJImJjY2wiIH0sCisgIHsgImJsbyIsCSJiY3N3IiB9LAorICB7ICJibG9zIiwJImJjc3MiIH0sCisgIHsgImJsb2IiLAkiYmNzcyIgfSwKKyAgeyAiYmxvdyIsCSJiY3N3IiB9LAorICB7ICJibG9sIiwJImJjc2wiIH0sCisgIHsgImJyIiwJImJyYXciLCB9LAorICB7ICJicnMiLAkiYnJhcyIsIH0sCisgIHsgImJyYiIsCSJicmFzIiwgfSwKKyAgeyAiYnJ3IiwJImJyYXciLCB9LAorICB7ICJicmwiLAkiYnJhbCIsIH0sCisgIHsgImpmbmx0IiwJImJjYyIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KKyAgeyAiamZuZ3QiLAkiYmxlIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLworICB7ICJqZmVxIiwJImJlcXMiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCisgIHsgImJjaGdiIiwJImJjaGciLCB9LAorICB7ICJiY2hnbCIsCSJiY2hnIiwgfSwKKyAgeyAiYmNscmIiLAkiYmNsciIsIH0sCisgIHsgImJjbHJsIiwJImJjbHIiLCB9LAorICB7ICJic2V0YiIsCSJic2V0IiwgfSwKKyAgeyAiYnNldGwiLAkiYnNldCIsIH0sCisgIHsgImJ0c3RiIiwJImJ0c3QiLCB9LAorICB7ICJidHN0bCIsCSJidHN0IiwgfSwKKyAgeyAiY2FzMiIsCSJjYXMydyIsIH0sCisgIHsgImNhcyIsCSJjYXN3IiwgfSwKKyAgeyAiY2hrMiIsCSJjaGsydyIsIH0sCisgIHsgImNoayIsCSJjaGt3IiwgfSwKKyAgeyAiY2xyIiwJImNscnciLCB9LAorICB7ICJjbXAyIiwJImNtcDJ3IiwgfSwKKyAgeyAiY21wYSIsCSJjbXBhdyIsIH0sCisgIHsgImNtcGkiLAkiY21waXciLCB9LAorICB7ICJjbXBtIiwJImNtcG13IiwgfSwKKyAgeyAiY21wIiwJImNtcHciLCB9LAorICB7ICJkYmNjdyIsCSJkYmNjIiwgfSwKKyAgeyAiZGJjc3ciLAkiZGJjcyIsIH0sCisgIHsgImRiZXF3IiwJImRiZXEiLCB9LAorICB7ICJkYmZ3IiwJImRiZiIsIH0sCisgIHsgImRiZ2V3IiwJImRiZ2UiLCB9LAorICB7ICJkYmd0dyIsCSJkYmd0IiwgfSwKKyAgeyAiZGJoaXciLAkiZGJoaSIsIH0sCisgIHsgImRibGV3IiwJImRibGUiLCB9LAorICB7ICJkYmxzdyIsCSJkYmxzIiwgfSwKKyAgeyAiZGJsdHciLAkiZGJsdCIsIH0sCisgIHsgImRibWl3IiwJImRibWkiLCB9LAorICB7ICJkYm5ldyIsCSJkYm5lIiwgfSwKKyAgeyAiZGJwbHciLAkiZGJwbCIsIH0sCisgIHsgImRidHciLAkiZGJ0IiwgfSwKKyAgeyAiZGJ2Y3ciLAkiZGJ2YyIsIH0sCisgIHsgImRidnN3IiwJImRidnMiLCB9LAorICB7ICJkYmhzIiwJImRiY2MiLCB9LAorICB7ICJkYmhzdyIsCSJkYmNjIiwgfSwKKyAgeyAiZGJyYSIsCSJkYmYiLCB9LAorICB7ICJkYnJhdyIsCSJkYmYiLCB9LAorICB7ICJ0ZGl2c2wiLAkiZGl2c2wiLCB9LAorICB7ICJkaXZzIiwJImRpdnN3IiwgfSwKKyAgeyAiZGl2dSIsCSJkaXZ1dyIsIH0sCisgIHsgImV4dCIsCSJleHR3IiwgfSwKKyAgeyAiZXh0YnciLAkiZXh0dyIsIH0sCisgIHsgImV4dHdsIiwJImV4dGwiLCB9LAorICB7ICJmYm5lcSIsCSJmYm5lIiwgfSwKKyAgeyAiZmJzbmVxIiwJImZic25lIiwgfSwKKyAgeyAiZmRibmVxIiwJImZkYm5lIiwgfSwKKyAgeyAiZmRic25lcSIsCSJmZGJzbmUiLCB9LAorICB7ICJmbW92ZWNyIiwJImZtb3ZlY3J4IiwgfSwKKyAgeyAiZm1vdm0iLAkiZm1vdmVtIiwgfSwKKyAgeyAiZnNuZXEiLAkiZnNuZSIsIH0sCisgIHsgImZzc25lcSIsCSJmc3NuZSIsIH0sCisgIHsgImZ0cmFwbmVxIiwJImZ0cmFwbmUiLCB9LAorICB7ICJmdHJhcHNuZXEiLCAiZnRyYXBzbmUiLCB9LAorICB7ICJmam5lcSIsCSJmam5lIiwgfSwKKyAgeyAiZmpzbmVxIiwJImZqc25lIiwgfSwKKyAgeyAiam1wbCIsCSJqbXAiLCB9LAorICB7ICJqbXBzIiwJImptcCIsIH0sCisgIHsgImpzcmwiLAkianNyIiwgfSwKKyAgeyAianNycyIsCSJqc3IiLCB9LAorICB7ICJsZWFsIiwJImxlYSIsIH0sCisgIHsgImxzbCIsCSJsc2x3IiwgfSwKKyAgeyAibHNyIiwJImxzcnciLCB9LAorICB7ICJtb3ZlYSIsCSJtb3ZlYXciLCB9LAorICB7ICJtb3ZlbSIsCSJtb3ZlbXciLCB9LAorICB7ICJtb3ZtbCIsCSJtb3ZlbWwiLCB9LAorICB7ICJtb3ZtdyIsCSJtb3ZlbXciLCB9LAorICB7ICJtb3ZtIiwJIm1vdmVtdyIsIH0sCisgIHsgIm1vdmVwIiwJIm1vdmVwdyIsIH0sCisgIHsgIm1vdnB3IiwJIm1vdmVwdyIsIH0sCisgIHsgIm1vdmVzIiwJIm1vdmVzdyIgfSwKKyAgeyAibXVscyIsCSJtdWxzdyIsIH0sCisgIHsgIm11bHUiLAkibXVsdXciLCB9LAorICB7ICJuYmNkYiIsCSJuYmNkIiB9LAorICB7ICJuZWciLAkibmVndyIsIH0sCisgIHsgIm5lZ3giLAkibmVneHciLCB9LAorICB7ICJub3QiLAkibm90dyIsIH0sCisgIHsgInBlYWwiLAkicGVhIiwgfSwKKyAgeyAicm9sIiwJInJvbHciLCB9LAorICB7ICJyb3IiLAkicm9ydyIsIH0sCisgIHsgInJveGwiLAkicm94bHciLCB9LAorICB7ICJyb3hyIiwJInJveHJ3IiwgfSwKKyAgeyAic2JjZGIiLAkic2JjZCIsIH0sCisgIHsgInNjY2IiLAkic2NjIiwgfSwKKyAgeyAic2NzYiIsCSJzY3MiLCB9LAorICB7ICJzZXFiIiwJInNlcSIsIH0sCisgIHsgInNmYiIsCSJzZiIsIH0sCisgIHsgInNnZWIiLAkic2dlIiwgfSwKKyAgeyAic2d0YiIsCSJzZ3QiLCB9LAorICB7ICJzaGliIiwJInNoaSIsIH0sCisgIHsgInNsZWIiLAkic2xlIiwgfSwKKyAgeyAic2xzYiIsCSJzbHMiLCB9LAorICB7ICJzbHRiIiwJInNsdCIsIH0sCisgIHsgInNtaWIiLAkic21pIiwgfSwKKyAgeyAic25lYiIsCSJzbmUiLCB9LAorICB7ICJzcGxiIiwJInNwbCIsIH0sCisgIHsgInN0YiIsCSJzdCIsIH0sCisgIHsgInN2Y2IiLAkic3ZjIiwgfSwKKyAgeyAic3ZzYiIsCSJzdnMiLCB9LAorICB7ICJzZmdlIiwJInNnZSIsIH0sCisgIHsgInNmZ3QiLAkic2d0IiwgfSwKKyAgeyAic2ZsZSIsCSJzbGUiLCB9LAorICB7ICJzZmx0IiwJInNsdCIsIH0sCisgIHsgInNmbmVxIiwJInNuZSIsIH0sCisgIHsgInN1YmEiLAkic3ViYXciLCB9LAorICB7ICJzdWJpIiwJInN1Yml3IiwgfSwKKyAgeyAic3VicSIsCSJzdWJxdyIsIH0sCisgIHsgInN1YiIsCSJzdWJ3IiwgfSwKKyAgeyAic3VieCIsCSJzdWJ4dyIsIH0sCisgIHsgInN3YXB3IiwJInN3YXAiLCB9LAorICB7ICJ0YXNiIiwJInRhcyIsIH0sCisgIHsgInRwY2MiLAkidHJhcGNjIiwgfSwKKyAgeyAidGNjIiwJInRyYXBjYyIsIH0sCisgIHsgInRzdCIsCSJ0c3R3IiwgfSwKKyAgeyAiamJyYSIsCSJqcmEiLCB9LAorICB7ICJqYmhpIiwJImpoaSIsIH0sCisgIHsgImpibHMiLAkiamxzIiwgfSwKKyAgeyAiamJjYyIsCSJqY2MiLCB9LAorICB7ICJqYmNzIiwJImpjcyIsIH0sCisgIHsgImpibmUiLAkiam5lIiwgfSwKKyAgeyAiamJlcSIsCSJqZXEiLCB9LAorICB7ICJqYnZjIiwJImp2YyIsIH0sCisgIHsgImpidnMiLAkianZzIiwgfSwKKyAgeyAiamJwbCIsCSJqcGwiLCB9LAorICB7ICJqYm1pIiwJImptaSIsIH0sCisgIHsgImpiZ2UiLAkiamdlIiwgfSwKKyAgeyAiamJsdCIsCSJqbHQiLCB9LAorICB7ICJqYmd0IiwJImpndCIsIH0sCisgIHsgImpibGUiLAkiamxlIiwgfSwKKyAgeyAibW92cWwiLAkibW92ZXEiLCB9LAorICB7ICJtb3ZlcWwiLAkibW92ZXEiLCB9LAorICB7ICJtb3ZsIiwJIm1vdmVsIiwgfSwKKyAgeyAibW92cSIsCSJtb3ZlcSIsIH0sCisgIHsgIm1vdmFsIiwJIm1vdmVhbCIsIH0sCisgIHsgIm1vdmF3IiwJIm1vdmVhdyIsIH0sCisgIHsgIm1vdmIiLAkibW92ZWIiLCB9LAorICB7ICJtb3ZjIiwJIm1vdmVjIiwgfSwKKyAgeyAibW92ZWNsIiwJIm1vdmVjIiwgfSwKKyAgeyAibW92cGwiLAkibW92ZXBsIiwgfSwKKyAgeyAibW92dyIsCSJtb3ZldyIsIH0sCisgIHsgIm1vdnNiIiwJIm1vdmVzYiIsIH0sCisgIHsgIm1vdnNsIiwJIm1vdmVzbCIsIH0sCisgIHsgIm1vdnN3IiwJIm1vdmVzdyIsIH0sCisKKyAgeyAidGRpdnVsIiwJImRpdnVsIiwgfSwJLyogZm9yIG02OGstc3ZyNCAqLworICB7ICJmbW92YiIsCSJmbW92ZWIiLCB9LAorICB7ICJmc21vdmIiLAkiZnNtb3ZlYiIsIH0sCisgIHsgImZkbW92YiIsCSJmZG1vdmViIiwgfSwKKyAgeyAiZm1vdmQiLAkiZm1vdmVkIiwgfSwKKyAgeyAiZnNtb3ZkIiwJImZzbW92ZWQiLCB9LAorICB7ICJmbW92bCIsCSJmbW92ZWwiLCB9LAorICB7ICJmc21vdmwiLAkiZnNtb3ZlbCIsIH0sCisgIHsgImZkbW92bCIsCSJmZG1vdmVsIiwgfSwKKyAgeyAiZm1vdnAiLAkiZm1vdmVwIiwgfSwKKyAgeyAiZnNtb3ZwIiwJImZzbW92ZXAiLCB9LAorICB7ICJmZG1vdnAiLAkiZmRtb3ZlcCIsIH0sCisgIHsgImZtb3ZzIiwJImZtb3ZlcyIsIH0sCisgIHsgImZzbW92cyIsCSJmc21vdmVzIiwgfSwKKyAgeyAiZmRtb3ZzIiwJImZkbW92ZXMiLCB9LAorICB7ICJmbW92dyIsCSJmbW92ZXciLCB9LAorICB7ICJmc21vdnciLAkiZnNtb3ZldyIsIH0sCisgIHsgImZkbW92dyIsCSJmZG1vdmV3IiwgfSwKKyAgeyAiZm1vdngiLAkiZm1vdmV4IiwgfSwKKyAgeyAiZnNtb3Z4IiwJImZzbW92ZXgiLCB9LAorICB7ICJmZG1vdngiLAkiZmRtb3ZleCIsIH0sCisgIHsgImZtb3ZjciIsCSJmbW92ZWNyIiwgfSwKKyAgeyAiZm1vdmNyeCIsCSJmbW92ZWNyeCIsIH0sCisgIHsgImZ0ZXN0YiIsCSJmdHN0YiIsIH0sCisgIHsgImZ0ZXN0ZCIsCSJmdHN0ZCIsIH0sCisgIHsgImZ0ZXN0bCIsCSJmdHN0bCIsIH0sCisgIHsgImZ0ZXN0cCIsCSJmdHN0cCIsIH0sCisgIHsgImZ0ZXN0cyIsCSJmdHN0cyIsIH0sCisgIHsgImZ0ZXN0dyIsCSJmdHN0dyIsIH0sCisgIHsgImZ0ZXN0eCIsCSJmdHN0eCIsIH0sCit9OworCitjb25zdCBpbnQgbTY4a19udW1hbGlhc2VzID0KKyAgc2l6ZW9mIG02OGtfb3Bjb2RlX2FsaWFzZXMgLyBzaXplb2YgbTY4a19vcGNvZGVfYWxpYXNlc1swXTsKZGlmZiAtLWdpdCBhL29wY29kZXMvbTg4ay1kaXMuYyBiL29wY29kZXMvbTg4ay1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY2Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tODhrLWRpcy5jCkBAIC0wLDAgKzEsMzMwIEBACisvKiBQcmludCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMCwgZm9yIEdEQiBhbmQgR05VIEJpbnV0aWxzLgorICAgQ29weXJpZ2h0IChjKSAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdGEgR2VuZXJhbCBDb3Jwb3JhdGlvbiwgTm92ZW1iZXIgMTk4OS4KKyAgIFBhcnRpYWxseSBkZXJpdmVkIGZyb20gYW4gZWFybGllciBwcmludGNtZC5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIHRoZSBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAib3Bjb2RlL204OGsuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworSU5TVEFCICAqaGFzaHRhYmxlW0hBU0hWQUxdID0gezB9OworCitzdGF0aWMgaW50CittODhrZGlzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKKworc3RhdGljIHZvaWQKK3ByaW50b3AgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgT1BTUEVDICosCisJCSB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2luaXRfZGlzYXNtIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2luc3RhbGwgUEFSQU1TICgoSU5TVEFCICppbnN0cHRyKSk7CisKKy8qCisqCQlEaXNhc3NlbWJsZSBhbiBNODgwMDAgSW5zdHJ1Y3Rpb24KKyoKKyoKKyogICAgICAgVGhpcyBtb2R1bGUgZGVjb2RlcyB0aGUgaW5zdHJ1Y3Rpb24gYXQgbWVtYWRkci4KKyoKKyoJCQlSZXZpc2lvbiBIaXN0b3J5CisqCisqICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZSBieSBNb3Rvcm9sYQorKgkJCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCB0byBHREIgaW50ZXJmYWNlLgorKgkJCTA3LzEyLzkzCUlhbiBMYW5jZSBUYXlsb3IgdXBkYXRlZCB0bworKgkJCQkJYmludXRpbHMgaW50ZXJmYWNlLgorKi8KKworaW50CitwcmludF9pbnNuX204OGsgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgaW50IHN0YXR1czsKKworICAvKiBJbnN0cnVjdGlvbiBhZGRyZXNzZXMgbWF5IGhhdmUgbG93IHR3byBiaXRzIHNldC4gQ2xlYXIgdGhlbS4JKi8KKyAgbWVtYWRkciAmPX4gKGJmZF92bWEpIDM7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gbTg4a2RpcyAobWVtYWRkciwgYmZkX2dldGIzMiAoYnVmZmVyKSwgaW5mbyk7Cit9CisKKy8qCisgKiBkaXNhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24gaW4gJ2luc3RydWN0aW9uJy4KKyAqICdwYycgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGl0IHdpbGwKKyAqICAgYmUgdXNlZCB0byBwcmludCB0aGUgdGFyZ2V0IGFkZHJlc3MgaWYgdGhpcyBpcyBhIHJlbGF0aXZlIGp1bXAgb3IgY2FsbAorICogdGhlIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbiBpcyB3cml0dGVuIHRvICdpbmZvJy4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAqLworCitzdGF0aWMgaW50CittODhrZGlzIChwYywgaW5zdHJ1Y3Rpb24sIGluZm8pCisgICAgIGJmZF92bWEgcGM7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb247CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBzdGF0aWMgaW50IGloYXNodGFiX2luaXRpYWxpemVkID0gMDsKKyAgdW5zaWduZWQgaW50IG9wY29kZTsKKyAgSU5TVEFCICplbnRyeV9wdHI7CisgIGludCBvcG1hc2s7CisgIHVuc2lnbmVkIGludCBjbGFzczsKKworICBpZiAoISBpaGFzaHRhYl9pbml0aWFsaXplZCkKKyAgICBpbml0X2Rpc2FzbSAoKTsKKworICAvKiBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gaXNvbGF0ZSB0aGUgb3Bjb2RlICovCisgIG9wbWFzayA9IERFRk1BU0s7CisgIGNsYXNzID0gaW5zdHJ1Y3Rpb24gJiBERUZNQVNLOworICBpZiAoKGNsYXNzID49IFNGVTApICYmIChjbGFzcyA8PSBTRlU3KSkKKyAgICB7CisgICAgICBpZiAoaW5zdHJ1Y3Rpb24gPCBTRlUxKQorCW9wbWFzayA9IENUUkxNQVNLOworICAgICAgZWxzZQorCW9wbWFzayA9IFNGVU1BU0s7CisgICAgfQorICBlbHNlIGlmIChjbGFzcyA9PSBSUlIpCisgICAgb3BtYXNrID0gUlJSTUFTSzsKKyAgZWxzZSBpZiAoY2xhc3MgPT0gUlJJMTApCisgICAgb3BtYXNrID0gUlJJMTBNQVNLOworCisgIC8qIGlzb2xhdGUgdGhlIG9wY29kZSAqLworICBvcGNvZGUgPSBpbnN0cnVjdGlvbiAmIG9wbWFzazsKKworICAvKiBzZWFyY2ggdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgaXNvbGF0ZWQgb3Bjb2RlICovCisgIGZvciAoZW50cnlfcHRyID0gaGFzaHRhYmxlW29wY29kZSAlIEhBU0hWQUxdOworICAgICAgIChlbnRyeV9wdHIgIT0gTlVMTCkgJiYgKGVudHJ5X3B0ci0+b3Bjb2RlICE9IG9wY29kZSk7CisgICAgICAgZW50cnlfcHRyID0gZW50cnlfcHRyLT5uZXh0KQorICAgIDsKKworICBpZiAoZW50cnlfcHRyID09IE5VTEwpCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ3b3JkXHQlMDh4IiwgaW5zdHJ1Y3Rpb24pOworICBlbHNlCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGVudHJ5X3B0ci0+bW5lbW9uaWMpOworICAgICAgcHJpbnRvcCAoaW5mbywgJihlbnRyeV9wdHItPm9wMSksIGluc3RydWN0aW9uLCBwYywgMSk7CisgICAgICBwcmludG9wIChpbmZvLCAmKGVudHJ5X3B0ci0+b3AyKSwgaW5zdHJ1Y3Rpb24sIHBjLCAwKTsKKyAgICAgIHByaW50b3AgKGluZm8sICYoZW50cnlfcHRyLT5vcDMpLCBpbnN0cnVjdGlvbiwgcGMsIDApOworICAgIH0KKworICByZXR1cm4gNDsKK30KKwwKKy8qCisqICAgICAgICAgICAgICAgICAgICAgIERlY29kZSBhbiBPcGVyYW5kIG9mIGFuIEluc3RydWN0aW9uCisqCisqCQkJRnVuY3Rpb25hbCBEZXNjcmlwdGlvbgorKgorKiAgICAgICBUaGlzIG1vZHVsZSBmb3JtYXRzIGFuZCB3cml0ZXMgYW4gb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiB0byBpbmZvCisqICAgICAgIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHNwZWNpZmljYXRpb24uICBXaGVuIHRoZSBmaXJzdCBmbGFnIGlzIHNldCB0aGlzCisqICAgICAgIGlzIHRoZSBmaXJzdCBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uLiAgVW5kZWZpbmVkIG9wZXJhbmQgdHlwZXMKKyogICAgICAgY2F1c2UgYSA8ZGlzIGVycm9yPiBtZXNzYWdlLgorKgorKgkJCVBhcmFtZXRlcnMKKyoJZGlzYXNzZW1ibGVfaW5mbwl3aGVyZSB0aGUgb3BlcmFuZCBtYXkgYmUgcHJpbnRlZAorKiAgICAgICBPUFNQRUMgICpvcHB0ciAgICAgICAgICBQb2ludGVyIHRvIGFuIG9wZXJhbmQgc3BlY2lmaWNhdGlvbgorKiAgICAgICBVSU5UICAgIGluc3QgICAgICAgICAgICBJbnN0cnVjdGlvbiBmcm9tIHdoaWNoIG9wZXJhbmQgaXMgZXh0cmFjdGVkCisqCVVJTlQgICAgcGMJCVBDIG9mIGluc3RydWN0aW9uOyB1c2VkIGZvciBwYy1yZWxhdGl2ZSBkaXNwLgorKiAgICAgICBpbnQgICAgIGZpcnN0ICAgICAgICAgICBGbGFnIHdoaWNoIGlmIG5vbnplcm8gaW5kaWNhdGVzIHRoZSBmaXJzdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uCisqCisqCQkJT3V0cHV0CisqCisqICAgICAgIFRoZSBvcGVyYW5kIHNwZWNpZmllZCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGlzCisqICAgICAgIHdyaXR0ZW4gdG8gYnVmIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkLiBUaGUgb3BlcmFuZCBpcyBwcmVjZWRlZAorKiAgICAgICBieSBhIGNvbW1hIGlmIGl0IGlzIG5vdCB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiBhbmQgaXQKKyogICAgICAgaXMgbm90IGEgcmVnaXN0ZXIgaW5kaXJlY3QgZm9ybS4gIFJlZ2lzdGVycyBhcmUgcHJlY2VkZWQgYnkgJ3InIGFuZAorKiAgICAgICBoZXggdmFsdWVzIGJ5ICcweCcuCisqCisqCQkJUmV2aXNpb24gSGlzdG9yeQorKgorKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKKyovCisKK3N0YXRpYyB2b2lkCitwcmludG9wIChpbmZvLCBvcHB0ciwgaW5zdCwgcGMsIGZpcnN0KQorICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgT1BTUEVDICpvcHB0cjsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnN0OworICAgICBiZmRfdm1hIHBjOworICAgICBpbnQgZmlyc3Q7Cit7CisgIGludCBleHRyYWN0ZWRfZmllbGQ7CisgIGNoYXIgKmNvbmRfbWFza19zeW07CisKKyAgaWYgKG9wcHRyLT53aWR0aCA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoISBmaXJzdCkKKyAgICB7CisgICAgICBzd2l0Y2ggKG9wcHRyLT50eXBlKQorCXsKKwljYXNlIFJFR1NDOgorCWNhc2UgQ09OVDoKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgc3dpdGNoIChvcHB0ci0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBDUlJFRzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiY3IlZCIsCisJCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZDUlJFRzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZmNyJWQiLAorCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUdTQzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiW3IlZF0iLAorCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRUc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlZCIsCisJCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFhSRUc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInglZCIsCisJCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhFWDoKKyAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7CisgICAgICBpZiAoZXh0cmFjdGVkX2ZpZWxkID09IDApCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwIik7CisgICAgICBlbHNlCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCUwMngiLCBleHRyYWN0ZWRfZmllbGQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERFQzoKKyAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgZXh0cmFjdGVkX2ZpZWxkKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDT05ETUFTSzoKKyAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7CisgICAgICBzd2l0Y2ggKGV4dHJhY3RlZF9maWVsZCAmIDB4MGYpCisJeworCWNhc2UgMHgxOiBjb25kX21hc2tfc3ltID0gImd0MCI7IGJyZWFrOworCWNhc2UgMHgyOiBjb25kX21hc2tfc3ltID0gImVxMCI7IGJyZWFrOworCWNhc2UgMHgzOiBjb25kX21hc2tfc3ltID0gImdlMCI7IGJyZWFrOworCWNhc2UgMHhjOiBjb25kX21hc2tfc3ltID0gImx0MCI7IGJyZWFrOworCWNhc2UgMHhkOiBjb25kX21hc2tfc3ltID0gIm5lMCI7IGJyZWFrOworCWNhc2UgMHhlOiBjb25kX21hc2tfc3ltID0gImxlMCI7IGJyZWFrOworCWRlZmF1bHQ6IGNvbmRfbWFza19zeW0gPSBOVUxMOyBicmVhazsKKwl9CisgICAgICBpZiAoY29uZF9tYXNrX3N5bSAhPSBOVUxMKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb25kX21hc2tfc3ltKTsKKyAgICAgIGVsc2UKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgZXh0cmFjdGVkX2ZpZWxkKTsKKyAgICAgIGJyZWFrOworCQkJCisgICAgY2FzZSBQQ1JFTDoKKyAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQorCShwYyArICg0ICogKFNFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpKSwKKwkgaW5mbyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ09OVDoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQsciVkIiwKKwkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSksCisJCQkgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRjoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQ8JWQ+IiwKKwkJCSAgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpLAorCQkJICAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSkpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCIjIDxkaXMgZXJyb3I6ICUwOHg+IiksIGluc3QpOworICAgIH0KK30KKworLyoKKyogICAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIERpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQorKgorKiAgICAgICBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIGFuZCBpbnN0cnVjdGlvbiB0YWJsZSBmb3IgdGhlIGRpc2Fzc2VtYmxlci4KKyogICAgICAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIGRpc2FzbSgpLgorKgorKgkJCVBhcmFtZXRlcnMKKyoKKyoJCQlPdXRwdXQKKyoKKyogICAgICAgSWYgdGhlIGRlYnVnIG9wdGlvbiBpcyBzZWxlY3RlZCwgY2VydGFpbiBzdGF0aXN0aWNzIGFib3V0IHRoZSBoYXNoaW5nCisqICAgICAgIGRpc3RyaWJ1dGlvbiBhcmUgd3JpdHRlbiB0byBzdGRvdXQuCisqCisqCQkJUmV2aXNpb24gSGlzdG9yeQorKgorKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKKyovCisKK3N0YXRpYyB2b2lkCitpbml0X2Rpc2FzbSAoKQoreworICAgaW50IGksIHNpemU7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBIQVNIVkFMOyBpKyspCisgICAgIGhhc2h0YWJsZVtpXSA9IE5VTEw7CisKKyAgIHNpemUgPSBzaXplb2YgKGluc3RydWN0aW9ucykgLyBzaXplb2YgKElOU1RBQik7CisgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICBpbnN0YWxsICgmaW5zdHJ1Y3Rpb25zW2ldKTsKK30KKworLyoKKyogICAgICAgSW5zZXJ0IGFuIGluc3RydWN0aW9uIGludG8gdGhlIGRpc2Fzc2VtYmxlciB0YWJsZSBieSBoYXNoaW5nIHRoZQorKiAgICAgICBvcGNvZGUgYW5kIGluc2VydGluZyBpdCBpbnRvIHRoZSBsaW5rZWQgbGlzdCBmb3IgdGhhdCBoYXNoIHZhbHVlLgorKgorKgkJCVBhcmFtZXRlcnMKKyoKKyogICAgICAgSU5TVEFCICppbnN0cHRyICAgICAgICAgUG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZAorKgorKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKKyoJCQkwNS8xMS84OQlSLiBUUkFXSUNLIEFEQVBURUQgRlJPTSBNT1RPUk9MQQorKi8KKworc3RhdGljIHZvaWQKK2luc3RhbGwgKGluc3RwdHIpCisgICAgIElOU1RBQiAqaW5zdHB0cjsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgaSA9IChpbnN0cHRyLT5vcGNvZGUpICUgSEFTSFZBTDsKKyAgaW5zdHB0ci0+bmV4dCA9IGhhc2h0YWJsZVtpXTsKKyAgaGFzaHRhYmxlW2ldID0gaW5zdHB0cjsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbWFrZWZpbGUudm1zIGIvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4NzA0OAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbWFrZWZpbGUudm1zCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGxpYm9wY29kZXMgdW5kZXIgb3BlblZNUyBWQVggYW5kIEFscGhhCisjCisjIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCisjCisjIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQorIworIworaWZlcSAoJChBUkNIKSxhbHBoYSkKK09CSlM9YWxwaGEtZGlzLm9iaixhbHBoYS1vcGMub2JqLGRpcy1idWYub2JqLGRpc2Fzc2VtYmxlLm9iagorRk9STUFUPU9CSl9FVkFYCitBUkNIREVGPSJBUkNIX2FscGhhIgorZWxzZQorT0JKUz12YXgtZGlzLm9iaixkaXMtYnVmLm9iaixkaXNhc3NlbWJsZS5vYmoKK0ZPUk1BVD1PQkpfVkFYCitBUkNIREVGPSJBUkNIX3ZheCIKK2VuZGlmCisKK2lmZXEgKCQoQ0MpLGdjYykKK0RFRlM9L2RlZmluZT0oJChGT1JNQVQpKQorQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUykKK2Vsc2UKK0RFRlM9L2RlZmluZT0oJChGT1JNQVQpLCJjb25zdD0iKQorQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSxbLS5iZmRdKSQoREVGUylcCisvd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMsbG9uZ2V4dGVybikKK2VuZGlmCisKK2xpYm9wY29kZXMub2xiOiBzeXNkZXAuaCAkKE9CSlMpCisJcHVyZ2UKKwlsaWIvY3JlYXRlIGxpYm9wY29kZXMgKi5vYmoKKworZGlzYXNzZW1ibGUub2JqOiBkaXNhc3NlbWJsZS5jCisJJChDQykkKENGTEFHUykvZGVmaW5lPSgkKEFSQ0hERUYpKSAkPAorCitzeXNkZXAuaDogWy0uYmZkLmhvc3RzXSQoQVJDSCl2bXMuaAorCSQoQ1ApICQ8ICRACisKK2NsZWFuOgorCSQkIHB1cmdlCisJJChSTSkgKi5vYmo7CisJJChSTSkgc3lzZGVwLmg7CisJJChSTSkgbGlib3Bjb2Rlcy5vbGI7CmRpZmYgLS1naXQgYS9vcGNvZGVzL21jb3JlLWRpcy5jIGIvb3Bjb2Rlcy9tY29yZS1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmMxNzkzYgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvbWNvcmUtZGlzLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qIERpc2Fzc2VtYmxlIE1vdG9yb2xsYSBNKkNvcmUgaW5zdHJ1Y3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIFNUQVRJQ19UQUJMRQorI2RlZmluZSBERUZJTkVfVEFCTEUKKworI2luY2x1ZGUgIm1jb3JlLW9wYy5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKworLyogTWFzayBmb3IgZWFjaCBtY29yZV9vcGNsYXNzOiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGltc2tbXSA9Cit7CisgICAgLyogTzAgICovIDB4RkZGRiwKKyAgICAvKiBPVCAgKi8gMHhGRkZDLAorICAgIC8qIE8xICAqLyAweEZGRjAsCisgICAgLyogT0MgICovIDB4RkZFMCwKKyAgICAvKiBPMiAgKi8gMHhGRjAwLAorICAgIC8qIFgxICAqLyAweEZGRjAsCisgICAgLyogT0kgICovIDB4RkUwMCwKKyAgICAvKiBPQiAgKi8gMHhGRTAwLAorCSAgICAgIAorICAgIC8qIE9NYSAqLyAweEZGRjAsCisgICAgLyogU0kgICovIDB4RkUwMCwKKyAgICAvKiBJNyAgKi8gMHhGODAwLAorICAgIC8qIExTICAqLyAweEYwMDAsCisgICAgLyogQlIgICovIDB4RjgwMCwKKyAgICAvKiBCTCAgKi8gMHhGRjAwLAorICAgIC8qIExSICAqLyAweEYwMDAsCisgICAgLyogTEogICovIDB4RkYwMCwKKwkgICAgICAKKyAgICAvKiBSTSAgKi8gMHhGRkYwLAorICAgIC8qIFJRICAqLyAweEZGRjAsCisgICAgLyogSlNSICovIDB4RkZGMCwKKyAgICAvKiBKTVAgKi8gMHhGRkYwLAorICAgIC8qIE9CUmEqLyAweEZGRjAsCisgICAgLyogT0JSYiovIDB4RkY4MCwKKyAgICAvKiBPQlJjKi8gMHhGRjAwLAorICAgIC8qIE9CUjIqLyAweEZFMDAsCisJICAgICAgCisgICAgLyogTzFSMSovIDB4RkZGMCwKKyAgICAvKiBPTWIgKi8gMHhGRjgwLAorICAgIC8qIE9NYyAqLyAweEZGMDAsCisgICAgLyogU0lhICovIDB4RkUwMCwKKworCQkgCisgICAgLyogSkMgICovIDAsCQkvKiBKQyxKVSxKTCBkb24ndCBhcHBlYXIgaW4gb2JqZWN0ICovCisgICAgLyogSlUgICovIDAsCisgICAgLyogSkwgICovIDAsCisgICAgLyogUlNJICovIDAsCisgICAgLyogRE8yMSovIDAsCisgICAgLyogT0IyICovIDAgCQkvKiBPQjIgd29uJ3QgYXBwZWFyIGluIG9iamVjdC4gKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogZ3JuYW1lW10gPQoreworICJyMCIsICAicjEiLCAgInIyIiwgICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLAorICJyOCIsICAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciBYW10gPSAiPz8iOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNybmFtZVtdID0KK3sKKyAgInBzciIsICAidmJyIiwgImVwc3IiLCAiZnBzciIsICJlcGMiLCAgImZwYyIsICAic3MwIiwgICJzczEiLAorICAic3MyIiwgICJzczMiLCAic3M0IiwgICJnY3IiLCAgImdzciIsICAgICBYLCAgICAgIFgsICAgICAgWCwKKyAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgWCwgICAgICBYLCAgICAgIFgsCisgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgIFgsICAgICAgWCwgICAgICBYCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaXNpeltdID0geyAyLCAwLCAxLCAwIH07CisKK2ludCAKK3ByaW50X2luc25fbWNvcmUgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOworeworICB1bnNpZ25lZCBjaGFyICAgICAgIGlieXRlc1s0XTsKKyAgZnByaW50Zl9mdHlwZSAgICAgICBmcHJpbnRmID0gaW5mby0+ZnByaW50Zl9mdW5jOworICB2b2lkICogICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgdW5zaWduZWQgc2hvcnQgICAgICBpbnN0OworICBtY29yZV9vcGNvZGVfaW5mbyAqIG9wOworICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKKworICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpYnl0ZXMsIDIsIGluZm8pOworCisgIGlmIChzdGF0dXMgIT0gMCkgCisgICAgeworICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGluc3QgPSAoaWJ5dGVzWzBdIDw8IDgpIHwgaWJ5dGVzWzFdOworCisgIC8qIEp1c3QgYSBsaW5lYXIgc2VhcmNoIG9mIHRoZSB0YWJsZS4gICovCisgIGZvciAob3AgPSBtY29yZV90YWJsZTsgb3AtPm5hbWUgIT0gMDsgb3AgKyspCisgICAgeworICAgICAgaWYgKG9wLT5pbnN0ID09IChpbnN0ICYgaW1za1tvcC0+b3BjbGFzc10pKQorCWJyZWFrOworICAgIH0KKworICBpZiAob3AtPm5hbWUgPT0gMCkKKyAgICBmcHJpbnRmIChzdHJlYW0sICIud29yZCAweCUwNHgiLCBpbnN0KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKiBuYW1lID0gZ3JuYW1lW2luc3QgJiAweDBGXTsKKyAgICAgIAorICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7CisgICAgICAKKyAgICAgIHN3aXRjaCAob3AtPm9wY2xhc3MpCisJeworCWNhc2UgTzA6IGJyZWFrOworCWNhc2UgT1Q6IGZwcmludGYgKHN0cmVhbSwgIlx0JWQiLCBpbnN0ICYgMHgzKTsgYnJlYWs7CisJY2FzZSBPMToKKwljYXNlIEpNUDoKKwljYXNlIEpTUjogZnByaW50ZiAoc3RyZWFtLCAiXHQlcyIsIG5hbWUpOyBicmVhazsKKwljYXNlIE9DOiAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJXMiLCBuYW1lLCBjcm5hbWVbKGluc3QgPj4gNCkgJiAweDFGXSk7IGJyZWFrOworCWNhc2UgTzFSMTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgcjEiLCBuYW1lKTsgYnJlYWs7CisJY2FzZSBPMjogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJXMiLCBuYW1lLCBncm5hbWVbKGluc3QgPj4gNCkgJiAweEZdKTsgYnJlYWs7CisJY2FzZSBYMTogZnByaW50ZiAoc3RyZWFtLCAiXHRyMSwgJXMiLCBuYW1lKTsgYnJlYWs7CisJY2FzZSBPSTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJWQiLCBuYW1lLCAoKGluc3QgPj4gNCkgJiAweDFGKSArIDEpOyBicmVhazsKKwljYXNlIFJNOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLXIxNSwgKHIwKSIsIG5hbWUpOyBicmVhazsKKwljYXNlIFJROiBmcHJpbnRmIChzdHJlYW0sICJcdHI0LXI3LCAoJXMpIiwgbmFtZSk7IGJyZWFrOworCWNhc2UgT0I6CisJY2FzZSBPQlJhOgorCWNhc2UgT0JSYjoKKwljYXNlIE9CUmM6CisJY2FzZSBTSToKKwljYXNlIFNJYToKKwljYXNlIE9NYToKKwljYXNlIE9NYjoKKwljYXNlIE9NYzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJWQiLCBuYW1lLCAoaW5zdCA+PiA0KSAmIDB4MUYpOyBicmVhazsKKwljYXNlIEk3OiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAlZCIsIG5hbWUsIChpbnN0ID4+IDQpICYgMHg3Rik7IGJyZWFrOworCWNhc2UgTFM6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICglcywgJWQpIiwgZ3JuYW1lWyhpbnN0ID4+IDgpICYgMHhGXSwKKwkJCSAgbmFtZSwgKChpbnN0ID4+IDQpICYgMHhGKSA8PCBpc2l6WyhpbnN0ID4+IDEzKSAmIDNdKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSBCUjoKKwkgIHsKKwkgICAgbG9uZyB2YWwgPSBpbnN0ICYgMHgzRkY7CisJICAgIAorCSAgICBpZiAoaW5zdCAmIDB4NDAwKQorCSAgICAgIHZhbCB8PSAweEZGRkZGQzAwOworCSAgICAKKwkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQweCV4IiwgbWVtYWRkciArIDIgKyAodmFsPDwxKSk7CisJICAgIAorCSAgICBpZiAoc3RyY21wIChvcC0+bmFtZSwgImJzciIpID09IDApCisJICAgICAgeworCQkvKiBmb3IgYnNyLCB3ZSdsbCB0cnkgdG8gZ2V0IGEgc3ltYm9sIGZvciB0aGUgdGFyZ2V0ICovCisJCXZhbCA9IG1lbWFkZHIgKyAyICsgKHZhbCA8PCAxKTsKKwkJCisJCWlmIChpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgJiYgdmFsICE9IDApCisJCSAgeworCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQvLyAiKTsKKwkJICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBpbmZvKTsKKwkJICB9CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJICAKKwljYXNlIEJMOgorCSAgeworCSAgICBsb25nIHZhbDsKKwkgICAgdmFsID0gKGluc3QgJiAweDAwMEYpOworCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAweCV4IiwKKwkJICAgIGdybmFtZVsoaW5zdCA+PiA0KSAmIDB4Rl0sIG1lbWFkZHIgLSAodmFsIDw8IDEpKTsKKwkgIH0KKwkgIGJyZWFrOworCSAgCisJY2FzZSBMUjoKKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyB2YWw7CisJICAgIAorCSAgICB2YWwgPSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDOworCSAgICAKKwkgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAodmFsLCBpYnl0ZXMsIDQsIGluZm8pOworCSAgICBpZiAoc3RhdHVzICE9IDApIAorCSAgICAgIHsKKwkJaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJCXJldHVybiAtMTsKKwkgICAgICB9CisJICAgIAorCSAgICB2YWwgPSAoaWJ5dGVzWzBdIDw8IDI0KSB8IChpYnl0ZXNbMV0gPDwgMTYpCisJICAgICAgfCAoaWJ5dGVzWzJdIDw8IDgpIHwgKGlieXRlc1szXSk7CisJICAgIAorCSAgICAvKiBSZW1vdmVkIFtdIGFyb3VuZCBsaXRlcmFsIHZhbHVlIHRvIG1hdGNoIEFCSSBzeW50YXggMTIvOTUuICAqLworCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAweCVYIiwgZ3JuYW1lWyhpbnN0ID4+IDgpICYgMHhGXSwgdmFsKTsKKworCSAgICBpZiAodmFsID09IDApCisJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKKwkJICAgICAgIChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkMpOworCSAgfQorCSAgYnJlYWs7CisJICAKKwljYXNlIExKOgorCSAgeworCSAgICB1bnNpZ25lZCBsb25nIHZhbDsKKwkgICAgCisJICAgIHZhbCA9IChtZW1hZGRyICsgMiArICgoaW5zdCAmIDB4RkYpIDw8IDIpKSAmIDB4RkZGRkZGRkM7CisJICAgIAorCSAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICh2YWwsIGlieXRlcywgNCwgaW5mbyk7CisJICAgIGlmIChzdGF0dXMgIT0gMCkgCisJICAgICAgeworCQlpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKwkJcmV0dXJuIC0xOworCSAgICAgIH0KKwkgICAgCisJICAgIHZhbCA9IChpYnl0ZXNbMF0gPDwgMjQpIHwgKGlieXRlc1sxXSA8PCAxNikKKwkgICAgICB8IChpYnl0ZXNbMl0gPDwgOCkgfCAoaWJ5dGVzWzNdKTsKKwkgICAgCisJICAgIC8qIFJlbW92ZWQgW10gYXJvdW5kIGxpdGVyYWwgdmFsdWUgdG8gbWF0Y2ggQUJJIHN5bnRheCAxMi85NS4gICovCisJICAgIGZwcmludGYgKHN0cmVhbSwgIlx0MHglWCIsIHZhbCk7CisJICAgIC8qIEZvciBqbXBpL2pzcmksIHdlJ2xsIHRyeSB0byBnZXQgYSBzeW1ib2wgZm9yIHRoZSB0YXJnZXQuICAqLworCSAgICBpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQorCSAgICAgIHsKKwkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyAiKTsKKwkJaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICh2YWwsIGluZm8pOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJZnByaW50ZiAoc3RyZWFtLCAiXHQvLyBmcm9tIGFkZHJlc3MgcG9vbCBhdCAweCV4IiwKKwkJCSAobWVtYWRkciArIDIgKyAoKGluc3QgJiAweEZGKSA8PCAyKSkgJiAweEZGRkZGRkZDKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwkgIAorCWRlZmF1bHQ6CisJICAvKiBpZiB0aGUgZGlzYXNzZW1ibGVyIGxhZ3MgdGhlIGluc3RydWN0aW9uIHNldCAqLworCSAgZnByaW50ZiAoc3RyZWFtLCAiXHR1bmRlY29kZWQgb3BlcmFuZHMsIGluc3QgaXMgMHglMDR4IiwgaW5zdCk7CisJICBicmVhazsKKwl9CisgICAgfQorICAKKyAgLyogU2F5IGhvdyBtYW55IGJ5dGVzIHdlIGNvbnN1bWVkPyAqLworICByZXR1cm4gMjsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvbWNvcmUtb3BjLmggYi9vcGNvZGVzL21jb3JlLW9wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNmJhODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL21jb3JlLW9wYy5oCkBAIC0wLDAgKzEsMjAyIEBACisvKiBBc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zIGZvciBNb3Rvcm9sbGEncyBNY29yZSBwcm9jZXNzb3IKKyAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKwordHlwZWRlZiBlbnVtCit7CisgIE8wLCAgICBPVCwgICBPMSwgICBPQywgICBPMiwgICAgWDEsICAgIE9JLCAgICBPQiwKKyAgT01hLCAgIFNJLCAgIEk3LCAgIExTLCAgIEJSLCAgICBCTCwgICAgTFIsICAgIExKLAorICBSTSwgICAgUlEsICAgSlNSLCAgSk1QLCAgT0JSYSwgIE9CUmIsICBPQlJjLCAgT0JSMiwKKyAgTzFSMSwgIE9NYiwgIE9NYywgIFNJYSwKKyAgSkMsICAgIEpVLCAgIEpMLCAgIFJTSSwgIERPMjEsICBPQjIKK30KK21jb3JlX29wY2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IGluc3QKK3sKKyAgY2hhciAqICAgICAgICAgbmFtZTsKKyAgbWNvcmVfb3BjbGFzcyAgb3BjbGFzczsKKyAgdW5zaWduZWQgY2hhciAgdHJhbnNmZXI7CisgIHVuc2lnbmVkIHNob3J0IGluc3Q7Cit9CittY29yZV9vcGNvZGVfaW5mbzsKKworI2lmZGVmIERFRklORV9UQUJMRQorbWNvcmVfb3Bjb2RlX2luZm8gbWNvcmVfdGFibGVbXSA9Cit7CisgIHsgImJrcHQiLAlPMCwJMCwJMHgwMDAwIH0sCisgIHsgInN5bmMiLAlPMCwJMCwJMHgwMDAxIH0sCisgIHsgInJ0ZSIsCU8wLAkxLAkweDAwMDIgfSwKKyAgeyAicmZlIiwJTzAsCTEsCTB4MDAwMiB9LAorICB7ICJyZmkiLAlPMCwJMSwJMHgwMDAzIH0sCisgIHsgInN0b3AiLAlPMCwJMCwJMHgwMDA0IH0sCisgIHsgIndhaXQiLAlPMCwJMCwJMHgwMDA1IH0sCisgIHsgImRvemUiLAlPMCwJMCwJMHgwMDA2IH0sCisgIHsgInRyYXAiLAlPVCwJMCwJMHgwMDA4IH0sCisvKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAtIDB4MDAwRiAqLworLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgLSAweDAwMUYgKi8KKyAgeyAibXZjIiwJTzEsCTAsCTB4MDAyMCB9LAorICB7ICJtdmN2IiwJTzEsCTAsCTB4MDAzMCB9LAorICB7ICJsZHEiLAlSUSwJMCwJMHgwMDQwIH0sCisgIHsgInN0cSIsCVJRLAkwLAkweDAwNTAgfSwKKyAgeyAibGRtIiwJUk0sCTAsCTB4MDA2MCB9LAorICB7ICJzdG0iLAlSTSwJMCwJMHgwMDcwIH0sCisgIHsgImRlY3QiLAlPMSwJMCwJMHgwMDgwIH0sCisgIHsgImRlY2YiLAlPMSwJMCwJMHgwMDkwIH0sCisgIHsgImluY3QiLAlPMSwJMCwJMHgwMEEwIH0sCisgIHsgImluY2YiLAlPMSwJMCwJMHgwMEIwIH0sCisgIHsgImptcCIsCUpNUCwJMiwJMHgwMEMwIH0sCisjZGVmaW5lCU1DT1JFX0lOU1RfSk1QCTB4MDBDMAorICB7ICJqc3IiLAlKU1IsCTAsCTB4MDBEMCB9LAorI2RlZmluZQlNQ09SRV9JTlNUX0pTUgkweDAwRTAKKyAgeyAiZmYxIiwJTzEsCTAsCTB4MDBFMCB9LAorICB7ICJicmV2IiwJTzEsCTAsCTB4MDBGMCB9LAorICB7ICJ4dHJiMyIsCVgxLAkwLAkweDAxMDAgfSwKKyAgeyAieHRyYjIiLAlYMSwJMCwJMHgwMTEwIH0sCisgIHsgInh0cmIxIiwJWDEsCTAsCTB4MDEyMCB9LAorICB7ICJ4dHJiMCIsCVgxLAkwLAkweDAxMzAgfSwKKyAgeyAiemV4dGIiLAlPMSwJMCwJMHgwMTQwIH0sCisgIHsgInNleHRiIiwJTzEsCTAsCTB4MDE1MCB9LAorICB7ICJ6ZXh0aCIsCU8xLAkwLAkweDAxNjAgfSwKKyAgeyAic2V4dGgiLAlPMSwJMCwJMHgwMTcwIH0sCisgIHsgImRlY2x0IiwJTzEsCTAsCTB4MDE4MCB9LAorICB7ICJ0c3RuYnoiLAlPMSwJMCwJMHgwMTkwIH0sCisgIHsgImRlY2d0IiwJTzEsCTAsCTB4MDFBMCB9LAorICB7ICJkZWNuZSIsCU8xLAkwLAkweDAxQjAgfSwKKyAgeyAiY2xydCIsCU8xLAkwLAkweDAxQzAgfSwKKyAgeyAiY2xyZiIsCU8xLAkwLAkweDAxRDAgfSwKKyAgeyAiYWJzIiwJTzEsCTAsCTB4MDFFMCB9LAorICB7ICJub3QiLAlPMSwJMCwJMHgwMUYwIH0sCisgIHsgIm1vdnQiLAlPMiwJMCwJMHgwMjAwIH0sCisgIHsgIm11bHQiLAlPMiwJMCwJMHgwMzAwIH0sCisgIHsgImxvb3B0IiwJQkwsCTAsCTB4MDQwMCB9LAorICB7ICJzdWJ1IiwJTzIsCTAsCTB4MDUwMCB9LAorICB7ICJzdWIiLAlPMiwJMCwJMHgwNTAwIH0sIC8qIE9mZmljaWFsIGFsaWFzLiAgKi8KKyAgeyAiYWRkYyIsCU8yLAkwLAkweDA2MDAgfSwKKyAgeyAic3ViYyIsCU8yLAkwLAkweDA3MDAgfSwKKy8qIFNQQUNFOiAweDA4MDAtMHgwOGZmIGZvciBhIGRpYWRpYyBvcGVyYXRpb24gKi8KKy8qIFNQQUNFOiAweDA5MDAtMHgwOWZmIGZvciBhIGRpYWRpYyBvcGVyYXRpb24gKi8KKyAgeyAibW92ZiIsCU8yLAkwLAkweDBBMDAgfSwKKyAgeyAibHNyIiwJTzIsCTAsCTB4MEIwMCB9LAorICB7ICJjbXBocyIsCU8yLAkwLAkweDBDMDAgfSwKKyAgeyAiY21wbHQiLAlPMiwJMCwJMHgwRDAwIH0sCisgIHsgInRzdCIsCU8yLAkwLAkweDBFMDAgfSwKKyAgeyAiY21wbmUiLAlPMiwJMCwJMHgwRjAwIH0sCisgIHsgIm1mY3IiLAlPQywJMCwJMHgxMDAwIH0sCisgIHsgIm1vdiIsCU8yLAkwLAkweDEyMDAgfSwKKyAgeyAiYmdlbnIiLAlPMiwJMCwJMHgxMzAwIH0sCisgIHsgInJzdWIiLAlPMiwJMCwJMHgxNDAwIH0sCisgIHsgIml4dyIsCU8yLAkwLAkweDE1MDAgfSwKKyAgeyAiYW5kIiwJTzIsCTAsCTB4MTYwMCB9LAorICB7ICJ4b3IiLAlPMiwJMCwJMHgxNzAwIH0sCisgIHsgIm10Y3IiLAlPQywJMCwJMHgxODAwIH0sCisgIHsgImFzciIsCU8yLAkwLAkweDFBMDAgfSwKKyAgeyAibHNsIiwJTzIsCTAsCTB4MUIwMCB9LAorICB7ICJhZGR1IiwJTzIsCTAsCTB4MUMwMCB9LAorICB7ICJpeGgiLAlPMiwJMCwJMHgxRDAwIH0sCisgIHsgIm9yIiwJTzIsCTAsCTB4MUUwMCB9LAorICB7ICJhbmRuIiwJTzIsCTAsCTB4MUYwMCB9LAorICB7ICJhZGRpIiwJT0ksCTAsCTB4MjAwMCB9LAorI2RlZmluZQlNQ09SRV9JTlNUX0FEREkJMHgyMDAwCisgIHsgImNtcGx0aSIsCU9JLAkwLAkweDIyMDAgfSwKKyAgeyAic3ViaSIsCU9JLAkwLAkweDI0MDAgfSwKKy8qIFNQQUNFOiAweDI2MDAtMHgyN2ZmIG9wZW4gZm9yIGEgcmVnaXN0ZXIraW1tZWRpYXRlICBvcGVyYXRpb24gKi8KKyAgeyAicnN1YmkiLAlPQiwJMCwJMHgyODAwIH0sCisgIHsgImNtcG5laSIsCU9CLAkwLAkweDJBMDAgfSwKKyAgeyAiYm1hc2tpIiwJT01hLAkwLAkweDJDMDAgfSwKKyAgeyAiZGl2dSIsCU8xUjEsCTAsCTB4MkMxMCB9LAorLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDJjMjAgLSAweDJjN2YgKi8gIAorICB7ICJibWFza2kiLAlPTWIsCTAsCTB4MkM4MCB9LAorICB7ICJibWFza2kiLAlPTWMsCTAsCTB4MkQwMCB9LAorICB7ICJhbmRpIiwJT0IsCTAsCTB4MkUwMCB9LAorICB7ICJiY2xyaSIsCU9CLAkwLAkweDMwMDAgfSwKKy8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgzMjAwIC0gMHgzMjBmICovCisgIHsgImRpdnMiLAlPMVIxLAkwLAkweDMyMTAgfSwKKy8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgzMjIwIC0gMHgzMjZmICovICAKKyAgeyAiYmdlbmkiLAlPQlJhLAkwLAkweDMyNzAgfSwKKyAgeyAiYmdlbmkiLAlPQlJiLAkwLAkweDMyODAgfSwKKyAgeyAiYmdlbmkiLAlPQlJjLAkwLAkweDMzMDAgfSwKKyAgeyAiYnNldGkiLAlPQiwJMCwJMHgzNDAwIH0sCisgIHsgImJ0c3RpIiwJT0IsCTAsCTB4MzYwMCB9LAorICB7ICJ4c3IiLAlPMSwJMCwJMHgzODAwIH0sCisgIHsgInJvdGxpIiwJU0lhLAkwLAkweDM4MDAgfSwKKyAgeyAiYXNyYyIsCU8xLAkwLAkweDNBMDAgfSwKKyAgeyAiYXNyaSIsCVNJYSwJMCwJMHgzQTAwIH0sCisgIHsgImxzbGMiLAlPMSwJMCwJMHgzQzAwIH0sCisgIHsgImxzbGkiLAlTSWEsCTAsCTB4M0MwMCB9LAorICB7ICJsc3JjIiwJTzEsCTAsCTB4M0UwMCB9LAorICB7ICJsc3JpIiwJU0lhLAkwLAkweDNFMDAgfSwKKy8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwIC0gMHg1ZmZmICovCisgIHsgIm1vdmkiLAlJNywJMCwJMHg2MDAwIH0sCisjZGVmaW5lIE1DT1JFX0lOU1RfQk1BU0tJX0FMVAkweDYwMDAKKyNkZWZpbmUgTUNPUkVfSU5TVF9CR0VOSV9BTFQJMHg2MDAwCisvKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4NjkwMCAtIDB4NkZGRiAqLworICB7ICJqbXBpIiwJTEosCTEsCTB4NzAwMCB9LAorICB7ICJqc3JpIiwJTEosCTAsCTB4N0YwMCB9LAorI2RlZmluZQlNQ09SRV9JTlNUX0pNUEkJMHg3MDAwCisgIHsgImxydyIsCUxSLAkwLAkweDcwMDAgfSwKKyNkZWZpbmUJTUNPUkVfSU5TVF9KU1JJCTB4N0YwMAorICB7ICJsZCIsCUxTLAkwLAkweDgwMDAgfSwKKyAgeyAibGR3IiwJTFMsCTAsCTB4ODAwMCB9LAorICB7ICJsZC53IiwJTFMsCTAsCTB4ODAwMCB9LAorICB7ICJzdCIsCUxTLAkwLAkweDkwMDAgfSwKKyAgeyAic3R3IiwJTFMsCTAsCTB4OTAwMCB9LAorICB7ICJzdC53IiwJTFMsCTAsCTB4OTAwMCB9LAorICB7ICJsZGIiLAlMUywJMCwJMHhBMDAwIH0sCisgIHsgImxkLmIiLAlMUywJMCwJMHhBMDAwIH0sCisgIHsgInN0YiIsCUxTLAkwLAkweEIwMDAgfSwKKyAgeyAic3QuYiIsCUxTLAkwLAkweEIwMDAgfSwKKyAgeyAibGRoIiwJTFMsCTAsCTB4QzAwMCB9LAorICB7ICJsZC5oIiwJTFMsCTAsCTB4QzAwMCB9LAorICB7ICJzdGgiLAlMUywJMCwJMHhEMDAwIH0sCisgIHsgInN0LmgiLAlMUywJMCwJMHhEMDAwIH0sCisgIHsgImJ0IiwJQlIsCTAsCTB4RTAwMCB9LAorICB7ICJiZiIsCUJSLAkwLAkweEU4MDAgfSwKKyAgeyAiYnIiLAlCUiwJMSwJMHhGMDAwIH0sCisjZGVmaW5lCU1DT1JFX0lOU1RfQlIJMHhGMDAwCisgIHsgImJzciIsCUJSLAkwLAkweEY4MDAgfSwKKyNkZWZpbmUJTUNPUkVfSU5TVF9CU1IJMHhGODAwCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHJlbGF4YWJsZSBicmFuY2hlcyAqLworICB7ICJqYnQiLAlKQywJMCwJMHhFMDAwIH0sCisgIHsgImpiZiIsCUpDLAkwLAkweEU4MDAgfSwKKyAgeyAiamJyIiwJSlUsCTEsCTB4RjAwMCB9LAorICB7ICJqYnNyIiwJSkwsCTAsCTB4RjgwMCB9LAorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBhbGlhc2VzIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKi8KKyAgeyAicnRzIiwJTzAsCTIsCTB4MDBDRiB9LCAgLyogam1wIHIxNSAqLworICB7ICJyb2xjIiwJRE8yMSwJMCwJMHgwNjAwIH0sICAvKiBhZGRjIHJkLHJkICovCisgIHsgInJvdGxjIiwJRE8yMSwgICAwLAkweDA2MDAgfSwgIC8qIGFkZGMgcmQscmQgKi8KKyAgeyAic2V0YyIsCU8wLAkwLAkweDBDMDAgfSwgIC8qIGNtcGhzIHIwLHIwICovCisgIHsgImNscmMiLAlPMCwJMCwJMHgwRjAwIH0sICAvKiBjbXBuZSByMCxyMCAqLworICB7ICJ0c3RsZSIsCU8xLAkwLAkweDIyMDAgfSwgIC8qIGNtcGx0aSByZCwxICovCisgIHsgImNtcGxlaSIsCU9CLAkwLAkweDIyMDAgfSwgIC8qIGNtcGxlaSByZCxYIC0+IGNtcGx0aSByZCxYKzEgKi8KKyAgeyAibmVnIiwJTzEsCTAsCTB4MjgwMCB9LCAgLyogcnN1YmkgcmQsMCAqLworICB7ICJ0c3RuZSIsCU8xLAkwLAkweDJBMDAgfSwgIC8qIGNtcG5laSByZCwwICovCisgIHsgInRzdGx0IiwJTzEsCTAsCTB4MzdGMCB9LCAgLyogYnRzdGkgcngsMzEgKi8KKyAgeyAibWNscmkiLAlPQjIsCTAsCTB4MzAwMCB9LCAgLyogYmNscmkgcngsbG9nMihpbW0pICovCisgIHsgIm1nZW5pIiwJT0JSMiwJMCwJMHgzMjAwIH0sICAvKiBiZ2VuaSByeCxsb2cyKGltbSkgKi8KKyAgeyAibXNldGkiLAlPQjIsCTAsCTB4MzQwMCB9LCAgLyogYnNldGkgcngsbG9nMihpbW0pICovCisgIHsgIm10c3RpIiwJT0IyLAkwLAkweDM2MDAgfSwgIC8qIGJ0c3RpIHJ4LGxvZzIoaW1tKSAqLworICB7ICJyb3JpIiwJUlNJLAkwLAkweDM4MDAgfSwKKyAgeyAicm90cmkiLAlSU0ksICAgIDAsCTB4MzgwMCB9LAorICB7ICJub3AiLAlPMCwgICAgIDAsCTB4MTIwMCB9LCAgLyogbW92IHIwLCByMCAqLworICB7IDAsCQkwLAkwLCAgICAgIDAgfQorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLWRpcy5jIGIvb3Bjb2Rlcy9taXBzLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzU3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL21pcHMtZGlzLmMKQEAgLTAsMCArMSwxMDY4IEBACisvKiBQcmludCBtaXBzIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBvciBmb3Igb2JqZHVtcC4KKyAgIENvcHlyaWdodCAoYykgMTk4OSwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBOb2J1eXVraSBIaWtpY2hpKGhpa2ljaGlAc3JhLmNvLmpwKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworLyogRklYTUU6IFRoZXNlIGFyZSBuZWVkZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgY29kZSBpcyBtaXBzMTYgb3IKKyAgIG5vdC4gVGhlIGxvdyBiaXQgb2YgdGhlIGFkZHJlc3MgaXMgb2Z0ZW4gYSBnb29kIGluZGljYXRvci4gIE5vCisgICBzeW1ib2wgdGFibGUgaXMgYXZhaWxhYmxlIHdoZW4gdGhpcyBjb2RlIHJ1bnMgb3V0IGluIGFuIGVtYmVkZGVkCisgICBzeXN0ZW0gYXMgd2hlbiBpdCBpcyB1c2VkIGZvciBkaXNhc3NlbWJsZXIgc3VwcG9ydCBpbiBhIG1vbml0b3IuICovCisKKyNpZiAhZGVmaW5lZChFTUJFRERFRF9FTlYpCisjZGVmaW5lIFNZTVRBQl9BVkFJTEFCTEUgMQorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvbWlwcy5oIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbl9taXBzMTYgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOworc3RhdGljIHZvaWQgcHJpbnRfbWlwczE2X2luc25fYXJnCisgIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICosIGludCwgYm9vbGVhbiwgaW50LCBiZmRfdm1hLAorCSAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKKworLyogTWlwcyBpbnN0cnVjdGlvbnMgYXJlIG5ldmVyIGxvbmdlciB0aGFuIHRoaXMgbWFueSBieXRlcy4gICovCisjZGVmaW5lIE1BWExFTiA0CisKK3N0YXRpYyB2b2lkIHByaW50X2luc25fYXJnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSwKKwkJCQkgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOworc3RhdGljIGludCBfcHJpbnRfaW5zbl9taXBzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcgaW50LAorCQkJCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOworCisMCisvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgc2hhcmVkIHdpdGggZ2RiIHNvbWVob3cuICAqLworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAJXAorICAgIHsJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLCBcCisJInQwIiwJInQxIiwJInQyIiwJInQzIiwJInQ0IiwJInQ1IiwJInQ2IiwJInQ3IiwgXAorCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsIFwKKwkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiczgiLAkicmEiLCBcCisJInNyIiwJImxvIiwJImhpIiwJImJhZCIsCSJjYXVzZSIsInBjIiwgICAgXAorCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwgXAorCSJmOCIsICAgImY5IiwgICAiZjEwIiwgICJmMTEiLCAgImYxMiIsICAiZjEzIiwgICJmMTQiLCAgImYxNSIsIFwKKwkiZjE2IiwgICJmMTciLCAgImYxOCIsICAiZjE5IiwgICJmMjAiLCAgImYyMSIsICAiZjIyIiwgICJmMjMiLFwKKwkiZjI0IiwgICJmMjUiLCAgImYyNiIsICAiZjI3IiwgICJmMjgiLCAgImYyOSIsICAiZjMwIiwgICJmMzEiLFwKKwkiZnNyIiwgICJmaXIiLCAgImZwIiwgICAiaW54IiwgICJyYW5kIiwgInRsYmxvIiwiY3R4dCIsICJ0bGJoaSIsXAorCSJlcGMiLCAgInByaWQiXAorICAgIH0KKworc3RhdGljIENPTlNUIGNoYXIgKiBDT05TVCByZWdfbmFtZXNbXSA9IFJFR0lTVEVSX05BTUVTOworCisvKiBUaGUgbWlwczE2IHJlZ2lzdGVyIG5hbWVzLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwczE2X3JlZ19uYW1lc1tdID0KK3sKKyAgInMwIiwgInMxIiwgInYwIiwgInYxIiwgImEwIiwgImExIiwgImEyIiwgImEzIgorfTsKKwwKKy8qIHN1YnJvdXRpbmUgKi8KK3N0YXRpYyB2b2lkCitwcmludF9pbnNuX2FyZyAoZCwgbCwgcGMsIGluZm8pCisgICAgIGNvbnN0IGNoYXIgKmQ7CisgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IGw7CisgICAgIGJmZF92bWEgcGM7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpbnQgZGVsdGE7CisKKyAgc3dpdGNoICgqZCkKKyAgICB7CisgICAgY2FzZSAnLCc6CisgICAgY2FzZSAnKCc6CisgICAgY2FzZSAnKSc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgKmQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdzJzoKKyAgICBjYXNlICdiJzoKKyAgICBjYXNlICdyJzoKKyAgICBjYXNlICd2JzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKKwkJCSAgICAgcmVnX25hbWVzWyhsID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlNdKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndCc6CisgICAgY2FzZSAndyc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCisJCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2knOgorICAgIGNhc2UgJ3UnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKKwkJCShsID4+IE9QX1NIX0lNTUVESUFURSkgJiBPUF9NQVNLX0lNTUVESUFURSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2onOiAvKiBzYW1lIGFzIGksIGJ1dCBzaWduLWV4dGVuZGVkICovCisgICAgY2FzZSAnbyc6CisgICAgICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7CisgICAgICBpZiAoZGVsdGEgJiAweDgwMDApCisJZGVsdGEgfD0gfjB4ZmZmZjsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAorCQkJICAgICBkZWx0YSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2gnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKKwkJCSAgICAgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX1BSRUZYKQorCQkJCQkgICAgICYgT1BfTUFTS19QUkVGWCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdrJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCisJCQkgICAgICh1bnNpZ25lZCBpbnQpICgobCA+PiBPUF9TSF9DQUNIRSkKKwkJCQkJICAgICAmIE9QX01BU0tfQ0FDSEUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYSc6CisgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKKwkoKChwYyAmIDB4RjAwMDAwMDApIHwgKCgobCA+PiBPUF9TSF9UQVJHRVQpICYgT1BfTUFTS19UQVJHRVQpIDw8IDIpKSwKKwkgaW5mbyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3AnOgorICAgICAgLyogc2lnbiBleHRlbmQgdGhlIGRpc3BsYWNlbWVudCAqLworICAgICAgZGVsdGEgPSAobCA+PiBPUF9TSF9ERUxUQSkgJiBPUF9NQVNLX0RFTFRBOworICAgICAgaWYgKGRlbHRhICYgMHg4MDAwKQorCWRlbHRhIHw9IH4weGZmZmY7CisgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKKwkoKGRlbHRhIDw8IDIpICsgcGMgKyA0LAorCSBpbmZvKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCisJCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3onOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMF0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc8JzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCisJCQkgICAgIChsID4+IE9QX1NIX1NIQU1UKSAmIE9QX01BU0tfU0hBTVQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdjJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCisJCQkgICAgIChsID4+IE9QX1NIX0NPREUpICYgT1BfTUFTS19DT0RFKTsKKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlICdxJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCisJCQkgICAgIChsID4+IE9QX1NIX0NPREUyKSAmIE9QX01BU0tfQ09ERTIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdDJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCisJCQkgICAgIChsID4+IE9QX1NIX0NPUFopICYgT1BfTUFTS19DT1BaKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQic6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAorCQkJICAgICAobCA+PiBPUF9TSF9TWVNDQUxMKSAmIE9QX01BU0tfU1lTQ0FMTCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1MnOgorICAgIGNhc2UgJ1YnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKKwkJCSAgICAgKGwgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUyk7CisgICAgICBicmVhazsKKworCisgICAgY2FzZSAnVCc6CisgICAgY2FzZSAnVyc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAorCQkJICAgICAobCA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAorCQkJICAgICAobCA+PiBPUF9TSF9GRCkgJiBPUF9NQVNLX0ZEKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUic6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmJWQiLAorCQkJICAgICAobCA+PiBPUF9TSF9GUikgJiBPUF9NQVNLX0ZSKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnRSc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZCIsCisJCQkgICAgIChsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdHJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVkIiwKKwkJCSAgICAgKGwgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ04nOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZmNjJWQiLAorCQkJICAgICAobCA+PiBPUF9TSF9CQ0MpICYgT1BfTUFTS19CQ0MpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdNJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGZjYyVkIiwKKwkJCSAgICAgKGwgPj4gT1BfU0hfQ0NDKSAmIE9QX01BU0tfQ0NDKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKKwkJCSAgICAgKGwgPj4gT1BfU0hfUEVSRlJFRykgJiBPUF9NQVNLX1BFUkZSRUcpOworICAgICAgYnJlYWs7CisKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCisJCQkgICAgIF8oIiMgaW50ZXJuYWwgZXJyb3IsIHVuZGVmaW5lZCBtb2RpZmllciglYykiKSwKKwkJCSAgICAgKmQpOworICAgICAgYnJlYWs7CisgICAgfQorfQorDAorI2lmIFNZTVRBQl9BVkFJTEFCTEUKKworLyogRmlndXJlIG91dCB0aGUgTUlQUyBJU0EgYW5kIENQVSBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuCisgICBGSVhNRTogV2hhdCBkb2VzIHRoaXMgaGF2ZSB0byBkbyB3aXRoIFNZTVRBQl9BVkFJTEFCTEU/ICAqLworCitzdGF0aWMgdm9pZAorc2V0X21pcHNfaXNhX3R5cGUgKG1hY2gsIGlzYSwgY3B1dHlwZSkKKyAgICAgaW50IG1hY2g7CisgICAgIGludCAqaXNhOworICAgICBpbnQgKmNwdXR5cGU7Cit7CisgIGludCB0YXJnZXRfcHJvY2Vzc29yID0gMDsKKyAgaW50IG1pcHNfaXNhID0gMDsKKworICBzd2l0Y2ggKG1hY2gpCisgICAgeworICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMzAwMDoKKwl0YXJnZXRfcHJvY2Vzc29yID0gMzAwMDsKKwltaXBzX2lzYSA9IDE7CisJYnJlYWs7CisgICAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgorCXRhcmdldF9wcm9jZXNzb3IgPSAzOTAwOworCW1pcHNfaXNhID0gMTsKKwlicmVhazsKKyAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMDA6CisJdGFyZ2V0X3Byb2Nlc3NvciA9IDQwMDA7CisJbWlwc19pc2EgPSAzOworCWJyZWFrOworICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDAxMDoKKwl0YXJnZXRfcHJvY2Vzc29yID0gNDAxMDsKKwltaXBzX2lzYSA9IDI7CisJYnJlYWs7CisgICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTAwOgorCXRhcmdldF9wcm9jZXNzb3IgPSA0MTAwOworCW1pcHNfaXNhID0gMzsKKwlicmVhazsKKyAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMTE6CisJdGFyZ2V0X3Byb2Nlc3NvciA9IDQxMDA7CisJbWlwc19pc2EgPSAzOworCWJyZWFrOworICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKKwl0YXJnZXRfcHJvY2Vzc29yID0gNDMwMDsKKwltaXBzX2lzYSA9IDM7CisJYnJlYWs7CisgICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NDAwOgorCXRhcmdldF9wcm9jZXNzb3IgPSA0NDAwOworCW1pcHNfaXNhID0gMzsKKwlicmVhazsKKyAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2MDA6CisJdGFyZ2V0X3Byb2Nlc3NvciA9IDQ2MDA7CisJbWlwc19pc2EgPSAzOworCWJyZWFrOworICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDY1MDoKKwl0YXJnZXRfcHJvY2Vzc29yID0gNDY1MDsKKwltaXBzX2lzYSA9IDM7CisJYnJlYWs7CisgICAgICBjYXNlIGJmZF9tYWNoX21pcHM1MDAwOgorCXRhcmdldF9wcm9jZXNzb3IgPSA1MDAwOworCW1pcHNfaXNhID0gNDsKKwlicmVhazsKKyAgICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6CisJdGFyZ2V0X3Byb2Nlc3NvciA9IDYwMDA7CisJbWlwc19pc2EgPSAyOworCWJyZWFrOworICAgICAgY2FzZSBiZmRfbWFjaF9taXBzODAwMDoKKwl0YXJnZXRfcHJvY2Vzc29yID0gODAwMDsKKwltaXBzX2lzYSA9IDQ7CisJYnJlYWs7CisgICAgICBjYXNlIGJmZF9tYWNoX21pcHMxMDAwMDoKKwl0YXJnZXRfcHJvY2Vzc29yID0gMTAwMDA7CisJbWlwc19pc2EgPSA0OworCWJyZWFrOworICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMTY6CisJdGFyZ2V0X3Byb2Nlc3NvciA9IDE2OworCW1pcHNfaXNhID0gMzsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJdGFyZ2V0X3Byb2Nlc3NvciA9IDMwMDA7CisJbWlwc19pc2EgPSAzOworCWJyZWFrOworCisgICAgfQorCisgICppc2EgPSBtaXBzX2lzYTsKKyAgKmNwdXR5cGUgPSB0YXJnZXRfcHJvY2Vzc29yOworfQorCisjZW5kaWYgLyogU1lNVEFCX0FWQUlMQUJMRSAqLworCisvKiBQcmludCB0aGUgbWlwcyBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAorICAgb24gdXNpbmcgSU5GTy4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMsIHdoaWNoIGlzCisgICBhbHdheXMgNC4gIEJJR0VORElBTiBtdXN0IGJlIDEgaWYgdGhpcyBpcyBiaWctZW5kaWFuIGNvZGUsIDAgaWYKKyAgIHRoaXMgaXMgbGl0dGxlLWVuZGlhbiBjb2RlLiAgKi8KKworc3RhdGljIGludAorX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgd29yZCwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICB1bnNpZ25lZCBsb25nIGludCB3b3JkOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKKyAgaW50IHRhcmdldF9wcm9jZXNzb3IsIG1pcHNfaXNhOworICBzdGF0aWMgYm9vbGVhbiBpbml0ID0gMDsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19oYXNoW09QX01BU0tfT1AgKyAxXTsKKworICAvKiBCdWlsZCBhIGhhc2ggdGFibGUgdG8gc2hvcnRlbiB0aGUgc2VhcmNoIHRpbWUuICAqLworICBpZiAoISBpbml0KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IE9QX01BU0tfT1A7IGkrKykKKwl7CisJICBmb3IgKG9wID0gbWlwc19vcGNvZGVzOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCisJICAgIHsKKwkgICAgICBpZiAob3AtPnBpbmZvID09IElOU05fTUFDUk8pCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChpID09ICgob3AtPm1hdGNoID4+IE9QX1NIX09QKSAmIE9QX01BU0tfT1ApKQorCQl7CisJCSAgbWlwc19oYXNoW2ldID0gb3A7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorICAgICAgICB9CisKKyAgICAgIGluaXQgPSAxOworICAgIH0KKworI2lmICEgU1lNVEFCX0FWQUlMQUJMRQorICAvKiBUaGlzIGlzIHJ1bm5pbmcgb3V0IG9uIGEgdGFyZ2V0IG1hY2hpbmUsIG5vdCBpbiBhIGhvc3QgdG9vbC4KKyAgICAgRklYTUU6IFdoZXJlIGRvZXMgbWlwc190YXJnZXRfaW5mbyBjb21lIGZyb20/ICAqLworICB0YXJnZXRfcHJvY2Vzc29yID0gbWlwc190YXJnZXRfaW5mby5wcm9jZXNzb3I7CisgIG1pcHNfaXNhID0gbWlwc190YXJnZXRfaW5mby5pc2E7CisjZWxzZSAgCisgIHNldF9taXBzX2lzYV90eXBlIChpbmZvLT5tYWNoLCAmbWlwc19pc2EsICZ0YXJnZXRfcHJvY2Vzc29yKTsKKyNlbmRpZiAgCisKKyAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKKyAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBpbmZvLT5lbmRpYW47CisKKyAgb3AgPSBtaXBzX2hhc2hbKHdvcmQgPj4gT1BfU0hfT1ApICYgT1BfTUFTS19PUF07CisgIGlmIChvcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCisJeworCSAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPICYmICh3b3JkICYgb3AtPm1hc2spID09IG9wLT5tYXRjaCkKKwkgICAgeworCSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmQ7CisJICAgICAgaW50IGluc25faXNhOworCisJICAgICAgaWYgKChvcC0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTEpCisJCWluc25faXNhID0gMTsKKwkgICAgICBlbHNlIGlmICgob3AtPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0EyKQorCQlpbnNuX2lzYSA9IDI7CisJICAgICAgZWxzZSBpZiAoKG9wLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMykKKwkJaW5zbl9pc2EgPSAzOworCSAgICAgIGVsc2UgaWYgKChvcC0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTQpCisJCWluc25faXNhID0gNDsKKwkgICAgICBlbHNlCisJCWluc25faXNhID0gMTU7CisKKwkgICAgICBpZiAoaW5zbl9pc2EgPiBtaXBzX2lzYQorCQkgICYmICh0YXJnZXRfcHJvY2Vzc29yID09IDQ2NTAKKwkJICAgICAgJiYgb3AtPm1lbWJlcnNoaXAgJiBJTlNOXzQ2NTApID09IDAKKwkJICAmJiAodGFyZ2V0X3Byb2Nlc3NvciA9PSA0MDEwCisJCSAgICAgICYmIG9wLT5tZW1iZXJzaGlwICYgSU5TTl80MDEwKSA9PSAwCisJCSAgJiYgKHRhcmdldF9wcm9jZXNzb3IgPT0gNDEwMAorCQkgICAgICAmJiBvcC0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgPT0gMAorCQkgICYmICh0YXJnZXRfcHJvY2Vzc29yID09IDM5MDAKKwkJICAgICAgJiYgb3AtPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApID09IDApCisJCWNvbnRpbnVlOworCisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKKworCSAgICAgIGQgPSBvcC0+YXJnczsKKwkgICAgICBpZiAoZCAhPSBOVUxMICYmICpkICE9ICdcMCcpCisJCXsKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKKwkJICBmb3IgKDsgKmQgIT0gJ1wwJzsgZCsrKQorCQkgICAgICBwcmludF9pbnNuX2FyZyAoZCwgd29yZCwgbWVtYWRkciwgaW5mbyk7CisJCX0KKworCSAgICAgIHJldHVybiA0OworCSAgICB9CisJfQorICAgIH0KKworICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gICovCisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIHdvcmQpOworICByZXR1cm4gNDsKK30KKworCisvKiBJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB3ZSBkbyBub3Qga25vdyB0aGUgc3ltYm9sIHR5cGUgb2YgdGhlCisgICBpbnN0cnVjdGlvbiB3ZSBhcmUgZm9yY2VkIHRvIGFzc3VtZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0IG9mIHRoZQorICAgaW5zdHJ1Y3Rpb25zJyBhZGRyZXNzIG1heSBtYXJrIGl0IGFzIGEgbWlwczE2IGluc3RydWN0aW9uLiAgSWYgd2UKKyAgIGFyZSBzaW5nbGUgc3RlcHBpbmcsIG9yIHRoZSBwYyBpcyB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlZCBmdW5jdGlvbiwKKyAgIHRoaXMgd29ya3MuICBPdGhlcndpc2UsIHdlIG5lZWQgYSBjbHVlLiAgU29tZXRpbWVzLiAgKi8KKworaW50CitwcmludF9pbnNuX2JpZ19taXBzIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBiZmRfYnl0ZSBidWZmZXJbNF07CisgIGludCBzdGF0dXM7CisKKyNpZiAxCisgIC8qIEZJWE1FOiBJZiBvZGQgYWRkcmVzcywgdGhpcyBpcyBDTEVBUkxZIGEgbWlwcyAxNiBpbnN0cnVjdGlvbi4gICovCisgIC8qIE9ubHkgYSBmZXcgdG9vbHMgd2lsbCB3b3JrIHRoaXMgd2F5LiAgKi8KKyAgaWYgKG1lbWFkZHIgJiAweDAxKQorICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7CisjZW5kaWYgIAorCisjaWYgU1lNVEFCX0FWQUlMQUJMRQorICBpZiAoaW5mby0+bWFjaCA9PSAxNgorICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCisJICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgorCSAgICAgID09IFNUT19NSVBTMTYpKSkKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOworI2VuZGlmICAKKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOworICBpZiAoc3RhdHVzID09IDApCisgICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0YjMyIChidWZmZXIpLAorCQkJICAgICBpbmZvKTsKKyAgZWxzZQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworaW50CitwcmludF9pbnNuX2xpdHRsZV9taXBzIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBiZmRfYnl0ZSBidWZmZXJbNF07CisgIGludCBzdGF0dXM7CisKKworI2lmIDEKKyAgaWYgKG1lbWFkZHIgJiAweDAxKQorICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7CisjZW5kaWYgIAorCisjaWYgU1lNVEFCX0FWQUlMQUJMRQorICBpZiAoaW5mby0+bWFjaCA9PSAxNgorICAgICAgfHwgKGluZm8tPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgorCSAgJiYgaW5mby0+c3ltYm9scyAhPSBOVUxMCisJICAmJiAoKCooZWxmX3N5bWJvbF90eXBlICoqKSBpbmZvLT5zeW1ib2xzKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcgorCSAgICAgID09IFNUT19NSVBTMTYpKSkKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOworI2VuZGlmICAKKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOworICBpZiAoc3RhdHVzID09IDApCisgICAgcmV0dXJuIF9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0bDMyIChidWZmZXIpLAorCQkJICAgICBpbmZvKTsKKyAgZWxzZQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwwKKy8qIERpc2Fzc2VtYmxlIG1pcHMxNiBpbnN0cnVjdGlvbnMuICAqLworCitzdGF0aWMgaW50CitwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50IHN0YXR1czsKKyAgYmZkX2J5dGUgYnVmZmVyWzJdOworICBpbnQgbGVuZ3RoOworICBpbnQgaW5zbjsKKyAgYm9vbGVhbiB1c2VfZXh0ZW5kOworICBpbnQgZXh0ZW5kID0gMDsKKyAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcCwgKm9wZW5kOworCisgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7CisgIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gaW5mby0+ZW5kaWFuOworCisgIGluZm8tPmluc25faW5mb192YWxpZCA9IDE7CisgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7CisgIGluZm8tPmRhdGFfc2l6ZSA9IDA7CisgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7CisgIGluZm8tPnRhcmdldCA9IDA7CisgIGluZm8tPnRhcmdldDIgPSAwOworCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgbGVuZ3RoID0gMjsKKworICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQorICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOworICBlbHNlCisgICAgaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7CisKKyAgLyogSGFuZGxlIHRoZSBleHRlbmQgb3Bjb2RlIHNwZWNpYWxseS4gICovCisgIHVzZV9leHRlbmQgPSBmYWxzZTsKKyAgaWYgKChpbnNuICYgMHhmODAwKSA9PSAweGYwMDApCisgICAgeworICAgICAgdXNlX2V4dGVuZCA9IHRydWU7CisgICAgICBleHRlbmQgPSBpbnNuICYgMHg3ZmY7CisKKyAgICAgIG1lbWFkZHIgKz0gMjsKKworICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKKwkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKKwkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworCSAgcmV0dXJuIC0xOworCX0KKworICAgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKKwlpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKKyAgICAgIGVsc2UKKwlpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKKworICAgICAgLyogQ2hlY2sgZm9yIGFuIGV4dGVuZCBvcGNvZGUgZm9sbG93ZWQgYnkgYW4gZXh0ZW5kIG9wY29kZS4gICovCisgICAgICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImV4dGVuZCAweCV4IiwKKwkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKKwkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOworCSAgcmV0dXJuIGxlbmd0aDsKKwl9CisKKyAgICAgIGxlbmd0aCArPSAyOworICAgIH0KKworICAvKiBGSVhNRTogU2hvdWxkIHByb2JhYmx5IHVzZSBhIGhhc2ggdGFibGUgb24gdGhlIG1ham9yIG9wY29kZSBoZXJlLiAgKi8KKworICBvcGVuZCA9IG1pcHMxNl9vcGNvZGVzICsgYmZkX21pcHMxNl9udW1fb3Bjb2RlczsKKyAgZm9yIChvcCA9IG1pcHMxNl9vcGNvZGVzOyBvcCA8IG9wZW5kOyBvcCsrKQorICAgIHsKKyAgICAgIGlmIChvcC0+cGluZm8gIT0gSU5TTl9NQUNSTyAmJiAoaW5zbiAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCisJeworCSAgY29uc3QgY2hhciAqczsKKworCSAgaWYgKHN0cmNociAob3AtPmFyZ3MsICdhJykgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICh1c2VfZXh0ZW5kKQorCQl7CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCisJCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOworCQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOworCQkgIHJldHVybiBsZW5ndGggLSAyOworCQl9CisKKwkgICAgICB1c2VfZXh0ZW5kID0gZmFsc2U7CisKKwkgICAgICBtZW1hZGRyICs9IDI7CisKKwkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsCisJCQkJCQkgIGluZm8pOworCSAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwkJeworCQkgIHVzZV9leHRlbmQgPSB0cnVlOworCQkgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCisJCSAgICBleHRlbmQgPSBiZmRfZ2V0YjE2IChidWZmZXIpOworCQkgIGVsc2UKKwkJICAgIGV4dGVuZCA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7CisJCSAgbGVuZ3RoICs9IDI7CisJCX0KKwkgICAgfQorCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOworCSAgaWYgKG9wLT5hcmdzWzBdICE9ICdcMCcpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKKworCSAgZm9yIChzID0gb3AtPmFyZ3M7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGlmICgqcyA9PSAnLCcKKwkJICAmJiBzWzFdID09ICd3JworCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkKKwkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlkpKSkKKwkJeworCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLworCQkgICsrczsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGlmICgqcyA9PSAnLCcKKwkJICAmJiBzWzFdID09ICd2JworCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWikKKwkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpKSkKKwkJeworCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLworCQkgICsrczsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIHByaW50X21pcHMxNl9pbnNuX2FyZyAoKnMsIG9wLCBpbnNuLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsCisJCQkJICAgICBpbmZvKTsKKwkgICAgfQorCisJICBpZiAoKG9wLT5waW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkgIT0gMCkKKwkgICAgeworCSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7CisJICAgICAgaWYgKGluZm8tPmluc25fdHlwZSAhPSBkaXNfanNyKQorCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOworCSAgICB9CisKKwkgIHJldHVybiBsZW5ndGg7CisJfQorICAgIH0KKworICBpZiAodXNlX2V4dGVuZCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBleHRlbmQgfCAweGYwMDApOworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuKTsKKyAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogRGlzYXNzZW1ibGUgYW4gb3BlcmFuZCBmb3IgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfbWlwczE2X2luc25fYXJnICh0eXBlLCBvcCwgbCwgdXNlX2V4dGVuZCwgZXh0ZW5kLCBtZW1hZGRyLCBpbmZvKQorICAgICBpbnQgdHlwZTsKKyAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcDsKKyAgICAgaW50IGw7CisgICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKKyAgICAgaW50IGV4dGVuZDsKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICcsJzoKKyAgICBjYXNlICcoJzoKKyAgICBjYXNlICcpJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCB0eXBlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneSc6CisgICAgY2FzZSAndyc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCisJCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JZKQorCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKV0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd4JzoKKyAgICBjYXNlICd2JzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKKwkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlgpCisJCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlgpXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3onOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAorCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWikKKwkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWildKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWic6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCisJCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCisJCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfTU9WRTMyWildKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnMCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1swXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1MnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMjldKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRwYyIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdSJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzMxXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1gnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAorCQkJICAgICByZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKKwkJCQkJJiBNSVBTMTZPUF9NQVNLX1JFR1IzMildKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWSc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCisJCQkgICAgIHJlZ19uYW1lc1tNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAobCldKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPCc6CisgICAgY2FzZSAnPic6CisgICAgY2FzZSAnWyc6CisgICAgY2FzZSAnXSc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnSCc6CisgICAgY2FzZSAnVyc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAnaic6CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnVic6CisgICAgY2FzZSAnQyc6CisgICAgY2FzZSAnVSc6CisgICAgY2FzZSAnayc6CisgICAgY2FzZSAnSyc6CisgICAgY2FzZSAncCc6CisgICAgY2FzZSAncSc6CisgICAgY2FzZSAnQSc6CisgICAgY2FzZSAnQic6CisgICAgY2FzZSAnRSc6CisgICAgICB7CisJaW50IGltbWVkLCBuYml0cywgc2hpZnQsIHNpZ25lZHAsIGV4dGJpdHMsIHBjcmVsLCBleHR1LCBicmFuY2g7CisKKwlzaGlmdCA9IDA7CisJc2lnbmVkcCA9IDA7CisJZXh0Yml0cyA9IDE2OworCXBjcmVsID0gMDsKKwlleHR1ID0gMDsKKwlicmFuY2ggPSAwOworCXN3aXRjaCAodHlwZSkKKwkgIHsKKwkgIGNhc2UgJzwnOgorCSAgICBuYml0cyA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKKwkgICAgZXh0Yml0cyA9IDU7CisJICAgIGV4dHUgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJz4nOgorCSAgICBuYml0cyA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKKwkgICAgZXh0Yml0cyA9IDU7CisJICAgIGV4dHUgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ1snOgorCSAgICBuYml0cyA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWjsKKwkgICAgZXh0Yml0cyA9IDY7CisJICAgIGV4dHUgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ10nOgorCSAgICBuYml0cyA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWDsKKwkgICAgZXh0Yml0cyA9IDY7CisJICAgIGV4dHUgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJzQnOgorCSAgICBuYml0cyA9IDQ7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNCkgJiBNSVBTMTZPUF9NQVNLX0lNTTQ7CisJICAgIHNpZ25lZHAgPSAxOworCSAgICBleHRiaXRzID0gMTU7CisJICAgIGJyZWFrOworCSAgY2FzZSAnNSc6CisJICAgIG5iaXRzID0gNTsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKKwkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7CisJICAgIGluZm8tPmRhdGFfc2l6ZSA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAnSCc6CisJICAgIG5iaXRzID0gNTsKKwkgICAgc2hpZnQgPSAxOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OworCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKKwkgICAgaW5mby0+ZGF0YV9zaXplID0gMjsKKwkgICAgYnJlYWs7CisJICBjYXNlICdXJzoKKwkgICAgbmJpdHMgPSA1OworCSAgICBzaGlmdCA9IDI7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7CisJICAgIGlmICgob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9QQykgPT0gMAorCQkmJiAob3AtPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9TUCkgPT0gMCkKKwkgICAgICB7CisJCWluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCQlpbmZvLT5kYXRhX3NpemUgPSA0OworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlICdEJzoKKwkgICAgbmJpdHMgPSA1OworCSAgICBzaGlmdCA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7CisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OworCSAgICBicmVhazsKKwkgIGNhc2UgJ2onOgorCSAgICBuYml0cyA9IDU7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7CisJICAgIHNpZ25lZHAgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJzYnOgorCSAgICBuYml0cyA9IDY7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNikgJiBNSVBTMTZPUF9NQVNLX0lNTTY7CisJICAgIGJyZWFrOworCSAgY2FzZSAnOCc6CisJICAgIG5iaXRzID0gODsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKKwkgICAgYnJlYWs7CisJICBjYXNlICdWJzoKKwkgICAgbmJpdHMgPSA4OworCSAgICBzaGlmdCA9IDI7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIC8qIEZJWE1FOiBUaGlzIG1pZ2h0IGJlIGx3LCBvciBpdCBtaWdodCBiZSBhZGRpdSB0byAkc3Agb3IKKyAgICAgICAgICAgICAgICRwYy4gIFdlIGFzc3VtZSBpdCdzIGxvYWQuICAqLworCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKKwkgICAgaW5mby0+ZGF0YV9zaXplID0gNDsKKwkgICAgYnJlYWs7CisJICBjYXNlICdDJzoKKwkgICAgbmJpdHMgPSA4OworCSAgICBzaGlmdCA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OworCSAgICBicmVhazsKKwkgIGNhc2UgJ1UnOgorCSAgICBuYml0cyA9IDg7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIGV4dHUgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2snOgorCSAgICBuYml0cyA9IDg7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIHNpZ25lZHAgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ0snOgorCSAgICBuYml0cyA9IDg7CisJICAgIHNoaWZ0ID0gMzsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKKwkgICAgc2lnbmVkcCA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAncCc6CisJICAgIG5iaXRzID0gODsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU04KSAmIE1JUFMxNk9QX01BU0tfSU1NODsKKwkgICAgc2lnbmVkcCA9IDE7CisJICAgIHBjcmVsID0gMTsKKwkgICAgYnJhbmNoID0gMTsKKwkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2NvbmRicmFuY2g7CisJICAgIGJyZWFrOworCSAgY2FzZSAncSc6CisJICAgIG5iaXRzID0gMTE7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NMTEpICYgTUlQUzE2T1BfTUFTS19JTU0xMTsKKwkgICAgc2lnbmVkcCA9IDE7CisJICAgIHBjcmVsID0gMTsKKwkgICAgYnJhbmNoID0gMTsKKwkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKKwkgICAgYnJlYWs7CisJICBjYXNlICdBJzoKKwkgICAgbmJpdHMgPSA4OworCSAgICBzaGlmdCA9IDI7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIHBjcmVsID0gMTsKKwkgICAgLyogRklYTUU6IFRoaXMgY2FuIGJlIGx3IG9yIGxhLiAgV2UgYXNzdW1lIGl0IGlzIGx3LiAgKi8KKwkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7CisJICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAnQic6CisJICAgIG5iaXRzID0gNTsKKwkgICAgc2hpZnQgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OworCSAgICBwY3JlbCA9IDE7CisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCSAgICBpbmZvLT5kYXRhX3NpemUgPSA4OworCSAgICBicmVhazsKKwkgIGNhc2UgJ0UnOgorCSAgICBuYml0cyA9IDU7CisJICAgIHNoaWZ0ID0gMjsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKKwkgICAgcGNyZWwgPSAxOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGFib3J0ICgpOworCSAgfQorCisJaWYgKCEgdXNlX2V4dGVuZCkKKwkgIHsKKwkgICAgaWYgKHNpZ25lZHAgJiYgaW1tZWQgPj0gKDEgPDwgKG5iaXRzIC0gMSkpKQorCSAgICAgIGltbWVkIC09IDEgPDwgbmJpdHM7CisJICAgIGltbWVkIDw8PSBzaGlmdDsKKwkgICAgaWYgKCh0eXBlID09ICc8JyB8fCB0eXBlID09ICc+JyB8fCB0eXBlID09ICdbJyB8fCB0eXBlID09ICddJykKKwkJJiYgaW1tZWQgPT0gMCkKKwkgICAgICBpbW1lZCA9IDg7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoZXh0Yml0cyA9PSAxNikKKwkgICAgICBpbW1lZCB8PSAoKGV4dGVuZCAmIDB4MWYpIDw8IDExKSB8IChleHRlbmQgJiAweDdlMCk7CisJICAgIGVsc2UgaWYgKGV4dGJpdHMgPT0gMTUpCisJICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweGYpIDw8IDExKSB8IChleHRlbmQgJiAweDdmMCk7CisJICAgIGVsc2UKKwkgICAgICBpbW1lZCA9ICgoZXh0ZW5kID4+IDYpICYgMHgxZikgfCAoZXh0ZW5kICYgMHgyMCk7CisJICAgIGltbWVkICY9ICgxIDw8IGV4dGJpdHMpIC0gMTsKKwkgICAgaWYgKCEgZXh0dSAmJiBpbW1lZCA+PSAoMSA8PCAoZXh0Yml0cyAtIDEpKSkKKwkgICAgICBpbW1lZCAtPSAxIDw8IGV4dGJpdHM7CisJICB9CisKKwlpZiAoISBwY3JlbCkKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbW1lZCk7CisJZWxzZQorCSAgeworCSAgICBiZmRfdm1hIGJhc2VhZGRyOworCSAgICBiZmRfdm1hIHZhbDsKKworCSAgICBpZiAoYnJhbmNoKQorCSAgICAgIHsKKwkJaW1tZWQgKj0gMjsKKwkJYmFzZWFkZHIgPSBtZW1hZGRyICsgMjsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHVzZV9leHRlbmQpCisJICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW50IHN0YXR1czsKKwkJYmZkX2J5dGUgYnVmZmVyWzJdOworCisJCWJhc2VhZGRyID0gbWVtYWRkcjsKKworCQkvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGEganIKKyAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICBqciBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGphbHIKKyAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICBqYWxyIGluc3RydWN0aW9uLiAgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGU6IHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBwcmV2aW91cyB3b3JkIGlzCisgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gb3IgZGF0YS4gICovCisJCXN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LCBidWZmZXIsIDIsCisJCQkJCQkgICAgaW5mbyk7CisJCWlmIChzdGF0dXMgPT0gMAorCQkgICAgJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCisJCQkgID8gYmZkX2dldGIxNiAoYnVmZmVyKQorCQkJICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCisJCQkgJiAweGY4MDApID09IDB4MTgwMCkpCisJCSAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gNDsKKwkJZWxzZQorCQkgIHsKKwkJICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSAyLCBidWZmZXIsCisJCQkJCQkJMiwgaW5mbyk7CisJCSAgICBpZiAoc3RhdHVzID09IDAKKwkJCSYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRworCQkJICAgICAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCisJCQkgICAgICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCisJCQkgICAgICYgMHhmODFmKSA9PSAweGU4MDApKQorCQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOworCQkgIH0KKwkgICAgICB9CisJICAgIHZhbCA9IChiYXNlYWRkciAmIH4gKCgxIDw8IHNoaWZ0KSAtIDEpKSArIGltbWVkOworCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbCwgaW5mbyk7CisJICAgIGluZm8tPnRhcmdldCA9IHZhbDsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYSc6CisgICAgICBpZiAoISB1c2VfZXh0ZW5kKQorCWV4dGVuZCA9IDA7CisgICAgICBsID0gKChsICYgMHgxZikgPDwgMjMpIHwgKChsICYgMHgzZTApIDw8IDEzKSB8IChleHRlbmQgPDwgMik7CisgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyICYgMHhmMDAwMDAwMCkgfCBsLCBpbmZvKTsKKyAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7CisgICAgICBpbmZvLT50YXJnZXQgPSAobWVtYWRkciAmIDB4ZjAwMDAwMDApIHwgbDsKKyAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgJ0wnOgorICAgICAgeworCWludCBuZWVkX2NvbW1hLCBhbWFzaywgc21hc2s7CisKKwluZWVkX2NvbW1hID0gMDsKKworCWwgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU02KSAmIE1JUFMxNk9QX01BU0tfSU1NNjsKKworCWFtYXNrID0gKGwgPj4gMykgJiA3OworCisJaWYgKGFtYXNrID4gMCAmJiBhbWFzayA8IDUpCisJICB7CisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzRdKTsKKwkgICAgaWYgKGFtYXNrID4gMSkKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kJXMiLAorCQkJCSAgICAgcmVnX25hbWVzW2FtYXNrICsgM10pOworCSAgICBuZWVkX2NvbW1hID0gMTsKKwkgIH0KKworCXNtYXNrID0gKGwgPj4gMSkgJiAzOworCWlmIChzbWFzayA9PSAzKQorCSAgeworCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzPz8iLAorCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7CisJICAgIG5lZWRfY29tbWEgPSAxOworCSAgfQorCWVsc2UgaWYgKHNtYXNrID4gMCkKKwkgIHsKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCisJCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAorCQkJCSAgIHJlZ19uYW1lc1sxNl0pOworCSAgICBpZiAoc21hc2sgPiAxKQorCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSQlcyIsCisJCQkJICAgICByZWdfbmFtZXNbc21hc2sgKyAxNV0pOworCSAgICBuZWVkX2NvbW1hID0gMTsKKwkgIH0KKworCWlmIChsICYgMSkKKwkgIHsKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyQlcyIsCisJCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAorCQkJCSAgIHJlZ19uYW1lc1szMV0pOworCSAgICBuZWVkX2NvbW1hID0gMTsKKwkgIH0KKworCWlmIChhbWFzayA9PSA1IHx8IGFtYXNrID09IDYpCisJICB7CisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkZjAiLAorCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIik7CisJICAgIGlmIChhbWFzayA9PSA2KQorCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSRmMSIpOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLW9wYy5jIGIvb3Bjb2Rlcy9taXBzLW9wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjQ2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL21pcHMtb3BjLmMKQEAgLTAsMCArMSw3NzIgQEAKKy8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUmFscGggQ2FtcGJlbGwgYW5kIE9TRgorICAgQ29tbWVudGVkIGFuZCBtb2RpZmllZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCisKKy8qIFNob3J0IGhhbmQgc28gdGhlIGxpbmVzIGFyZW4ndCB0b28gbG9uZy4gICovCisKKyNkZWZpbmUgTEREICAgICBJTlNOX0xPQURfTUVNT1JZX0RFTEFZCisjZGVmaW5lIExDRAlJTlNOX0xPQURfQ09QUk9DX0RFTEFZCisjZGVmaW5lIFVCRCAgICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCisjZGVmaW5lIENCRAlJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCisjZGVmaW5lIENPRCAgICAgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQorI2RlZmluZSBDTEQJSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZCisjZGVmaW5lIENCTAlJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWQorI2RlZmluZSBUUkFQCUlOU05fVFJBUAorI2RlZmluZSBTTQlJTlNOX1NUT1JFX01FTU9SWQorCisjZGVmaW5lIFdSX2QgICAgSU5TTl9XUklURV9HUFJfRAorI2RlZmluZSBXUl90ICAgIElOU05fV1JJVEVfR1BSX1QKKyNkZWZpbmUgV1JfMzEgICBJTlNOX1dSSVRFX0dQUl8zMSAgICAgICAKKyNkZWZpbmUgV1JfRCAgICBJTlNOX1dSSVRFX0ZQUl9EICAgICAgICAKKyNkZWZpbmUgV1JfVAlJTlNOX1dSSVRFX0ZQUl9UCisjZGVmaW5lIFdSX1MJSU5TTl9XUklURV9GUFJfUworI2RlZmluZSBSRF9zICAgIElOU05fUkVBRF9HUFJfUyAgICAgICAgIAorI2RlZmluZSBSRF9iICAgIElOU05fUkVBRF9HUFJfUyAgICAgICAgIAorI2RlZmluZSBSRF90ICAgIElOU05fUkVBRF9HUFJfVCAgICAgICAgIAorI2RlZmluZSBSRF9TICAgIElOU05fUkVBRF9GUFJfUyAgICAgICAgIAorI2RlZmluZSBSRF9UICAgIElOU05fUkVBRF9GUFJfVCAgICAgICAgIAorI2RlZmluZSBSRF9SCUlOU05fUkVBRF9GUFJfUgorI2RlZmluZSBXUl9DQwlJTlNOX1dSSVRFX0NPTkRfQ09ERQorI2RlZmluZSBSRF9DQwlJTlNOX1JFQURfQ09ORF9DT0RFCisjZGVmaW5lIFJEX0MwICAgSU5TTl9DT1AKKyNkZWZpbmUgUkRfQzEJSU5TTl9DT1AKKyNkZWZpbmUgUkRfQzIgICBJTlNOX0NPUAorI2RlZmluZSBSRF9DMyAgIElOU05fQ09QCisjZGVmaW5lIFdSX0MwICAgSU5TTl9DT1AKKyNkZWZpbmUgV1JfQzEJSU5TTl9DT1AKKyNkZWZpbmUgV1JfQzIgICBJTlNOX0NPUAorI2RlZmluZSBXUl9DMyAgIElOU05fQ09QCisKKyNkZWZpbmUgV1JfSEkJSU5TTl9XUklURV9ISQorI2RlZmluZSBSRF9ISQlJTlNOX1JFQURfSEkKKyNkZWZpbmUgTU9EX0hJICBXUl9ISXxSRF9ISQorCisjZGVmaW5lIFdSX0xPCUlOU05fV1JJVEVfTE8KKyNkZWZpbmUgUkRfTE8JSU5TTl9SRUFEX0xPCisjZGVmaW5lIE1PRF9MTyAgV1JfTE98UkRfTE8KKworI2RlZmluZSBXUl9ISUxPIFdSX0hJfFdSX0xPCisjZGVmaW5lIFJEX0hJTE8gUkRfSEl8UkRfTE8KKyNkZWZpbmUgTU9EX0hJTE8gV1JfSElMT3xSRF9ISUxPCisKKyNkZWZpbmUgSVNfTSAgICBJTlNOX01VTFQKKworI2RlZmluZSBJMQlJTlNOX0lTQTEKKyNkZWZpbmUgSTIJSU5TTl9JU0EyCisjZGVmaW5lIEkzCUlOU05fSVNBMworI2RlZmluZSBJNAlJTlNOX0lTQTQKKyNkZWZpbmUgUDMJSU5TTl80NjUwCisjZGVmaW5lIEwxCUlOU05fNDAxMAorI2RlZmluZSBWMSAgICAgIElOU05fNDEwMAorI2RlZmluZSBUMyAgICAgIElOU05fMzkwMAorCisjZGVmaW5lIEcxICAgICAgKFQzICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIEcyICAgICAgKFQzICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIEczIChJNCAgICAgICAgICAgICBcCisgICAgICAgICAgICApCisKKy8qIFRoZSBvcmRlciBvZiBvdmVybG9hZGVkIGluc3RydWN0aW9ucyBtYXR0ZXJzLiAgTGFiZWwgYXJndW1lbnRzIGFuZAorICAgcmVnaXN0ZXIgYXJndW1lbnRzIGxvb2sgdGhlIHNhbWUuIEluc3RydWN0aW9ucyB0aGF0IGNhbiBoYXZlIGVpdGhlcgorICAgZm9yIGFyZ3VtZW50cyBtdXN0IGFwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoaXMgdGFibGUgZm9yIHRoZQorICAgYXNzZW1ibGVyIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZS4gSW4gb3RoZXIgd29yZHMsIGVudHJpZXMgd2l0aAorICAgaW1tZWRpYXRlIG9wZXJhbmRzIG11c3QgYXBlYXIgYWZ0ZXIgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gd2l0aAorICAgcmVnaXN0ZXJzLgorCisgICBNYW55IGluc3RydWN0aW9ucyBhcmUgc2hvcnQgaGFuZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIChpLmUuLCBUaGUKKyAgIGphbCA8cmVnaXN0ZXI+IGluc3RydWN0aW9uIGlzIHNob3J0IGZvciBqYWxyIDxyZWdpc3Rlcj4pLiAgKi8KKworY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW10gPSB7CisvKiBUaGVzZSBpbnN0cnVjdGlvbnMgYXBwZWFyIGZpcnN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGZpbmQKKyAgIHRoZW0gZmlyc3QuICBUaGUgYXNzZW1ibGVycyB1c2VzIGEgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUKKyAgIGluc3RydWN0aW9uIG5hbWUgYW55aG93LiAgKi8KKy8qIG5hbWUsCWFyZ3MsCW1hc2ssCQltYXRjaCwJcGluZm8gKi8KK3sibm9wIiwgICAgICIiLAkJMHgwMDAwMDAwMCwgMHhmZmZmZmZmZiwJMCwJCUkxCX0sCit7ImxpIiwgICAgICAidCxqIiwgICAgICAweDI0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAkJSTEJfSwgLyogYWRkaXUgKi8KK3sibGkiLAkgICAgInQsaSIsCTB4MzQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQlJMQl9LCAvKiBvcmkgKi8KK3sibGkiLCAgICAgICJ0LEkiLAkwLCAgICAoaW50KSBNX0xJLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMmQsIDB4ZmMxZjA3ZmYsIFdSX2R8UkRfcywJSTMJfSwvKiBkYWRkdSAqLworeyJtb3ZlIiwgICAgImQscyIsCTB4MDAwMDAwMjEsIDB4ZmMxZjA3ZmYsIFdSX2R8UkRfcywJSTEJfSwvKiBhZGR1ICovCit7Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyNSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLAlJMQl9LC8qIG9yICovCit7ImIiLCAgICAgICAicCIsCTB4MTAwMDAwMDAsIDB4ZmZmZjAwMDAsCVVCRCwJCUkxCX0sLyogYmVxIDAsMCAqLworeyJiIiwgICAgICAgInAiLAkweDA0MDEwMDAwLCAweGZmZmYwMDAwLAlVQkQsCQlJMQl9LC8qIGJnZXogMCAqLworeyJiYWwiLCAgICAgInAiLAkweDA0MTEwMDAwLCAweGZmZmYwMDAwLAlVQkR8V1JfMzEsCUkxCX0sLyogYmdlemFsIDAqLworCit7ImFicyIsICAgICAiZCx2IiwJMCwgICAgKGludCkgTV9BQlMsCUlOU05fTUFDUk8sCUkxCX0sCit7ImFicy5zIiwgICAiRCxWIiwJMHg0NjAwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCit7ImFicy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCit7ImFkZCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIwLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKK3siYWRkIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7ImFkZC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMX0sCit7ImFkZC5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMX0sCit7ImFkZGkiLCAgICAidCxyLGoiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCit7ImFkZGl1IiwgICAidCxyLGoiLAkweDI0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCit7ImFkZHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDIxLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKK3siYWRkdSIsICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJhbmQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCit7ImFuZCIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FORF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJhbmRpIiwgICAgInQscixpIiwJMHgzMDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAorLyogYiBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCisvKiBiYWwgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLworeyJiYzBmIiwgICAgInAiLAkweDQxMDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCit7ImJjMGZsIiwgICAicCIsCTB4NDEwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKK3siYmMxZiIsICAgICJwIiwJMHg0NTAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUkxCX0sCit7ImJjMWYiLCAgICAiTixwIiwJMHg0NTAwMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCUk0CX0sCit7ImJjMWZsIiwgICAicCIsCTB4NDUwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJMnxUMwl9LAoreyJiYzFmbCIsICAgIk4scCIsCTB4NDUwMjAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQ3xGUF9TLAlJNAl9LAoreyJiYzJmIiwgICAgInAiLAkweDQ5MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCit7ImJjMmZsIiwgICAicCIsCTB4NDkwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKK3siYmMzZiIsICAgICJwIiwJMHg0ZDAwMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoreyJiYzNmbCIsICAgInAiLAkweDRkMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCit7ImJjMHQiLCAgICAicCIsCTB4NDEwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKK3siYmMwdGwiLCAgICJwIiwJMHg0MTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoreyJiYzF0IiwgICAgInAiLAkweDQ1MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTEJfSwKK3siYmMxdCIsICAgICJOLHAiLAkweDQ1MDEwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTQJfSwKK3siYmMxdGwiLCAgICJwIiwJMHg0NTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUkyfFQzCX0sCit7ImJjMXRsIiwgICAiTixwIiwJMHg0NTAzMDAwMCwgMHhmZmUzMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUk0CX0sCit7ImJjMnQiLCAgICAicCIsCTB4NDkwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKK3siYmMydGwiLCAgICJwIiwJMHg0OTAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoreyJiYzN0IiwgICAgInAiLAkweDRkMDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCit7ImJjM3RsIiwgICAicCIsCTB4NGQwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKK3siYmVxeiIsICAgICJzLHAiLAkweDEwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKK3siYmVxemwiLCAgICJzLHAiLAkweDUwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKK3siYmVxIiwgICAgICJzLHQscCIsCTB4MTAwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCUkxCX0sCit7ImJlcSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJiZXFsIiwgICAgInMsdCxwIiwJMHg1MDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JMfFJEX3N8UkRfdCwJSTJ8VDMJfSwKK3siYmVxbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkVRTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJiZ2UiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0UsCUlOU05fTUFDUk8sCUkxCX0sCit7ImJnZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJiZ2VsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VMLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJiZ2VsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VMX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7ImJnZXUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRVUsCUlOU05fTUFDUk8sCUkxCX0sCit7ImJnZXUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3siYmdldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVUwsCUlOU05fTUFDUk8sCUkyCX0sCit7ImJnZXVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRVVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7ImJnZXoiLCAgICAicyxwIiwJMHgwNDAxMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCit7ImJnZXpsIiwgICAicyxwIiwJMHgwNDAzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCit7ImJnZXphbCIsICAicyxwIiwJMHgwNDExMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCit7ImJnZXphbGwiLCAicyxwIiwJMHgwNDEzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCit7ImJndCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVCwJSU5TTl9NQUNSTywJSTEJfSwKK3siYmd0IiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7ImJndGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVEwsCUlOU05fTUFDUk8sCUkyCX0sCit7ImJndGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVExfSSwJSU5TTl9NQUNSTywJSTIJfSwKK3siYmd0dSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUVSwJSU5TTl9NQUNSTywJSTEJfSwKK3siYmd0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJiZ3R1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVTCwJSU5TTl9NQUNSTywJSTIJfSwKK3siYmd0dWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKK3siYmd0eiIsICAgICJzLHAiLAkweDFjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKK3siYmd0emwiLCAgICJzLHAiLAkweDVjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKK3siYmxlIiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJibGUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3siYmxlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFTCwJSU5TTl9NQUNSTywJSTIJfSwKK3siYmxlbCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJibGV1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJibGV1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7ImJsZXVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRVVMLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJibGV1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJibGV6IiwgICAgInMscCIsCTB4MTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoreyJibGV6bCIsICAgInMscCIsCTB4NTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoreyJibHQiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFQsCUlOU05fTUFDUk8sCUkxCX0sCit7ImJsdCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJibHRsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRMLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJibHRsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTFRMX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7ImJsdHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFUsCUlOU05fTUFDUk8sCUkxCX0sCit7ImJsdHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3siYmx0dWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUVUwsCUlOU05fTUFDUk8sCUkyCX0sCit7ImJsdHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7ImJsdHoiLCAgICAicyxwIiwJMHgwNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCit7ImJsdHpsIiwgICAicyxwIiwJMHgwNDAyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCit7ImJsdHphbCIsICAicyxwIiwJMHgwNDEwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCUkxCX0sCit7ImJsdHphbGwiLCAicyxwIiwJMHgwNDEyMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCit7ImJuZXoiLCAgICAicyxwIiwJMHgxNDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCit7ImJuZXpsIiwgICAicyxwIiwJMHg1NDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCit7ImJuZSIsICAgICAicyx0LHAiLAkweDE0MDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAlJMQl9LAoreyJibmUiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3siYm5lbCIsICAgICJzLHQscCIsCTB4NTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsIAlJMnxUMwl9LAoreyJibmVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTkVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7ImJyZWFrIiwgICAiIiwJCTB4MDAwMDAwMGQsIDB4ZmZmZmZmZmYsCVRSQVAsCQlJMQl9LAoreyJicmVhayIsICAgImMiLAkweDAwMDAwMDBkLCAweGZjMDBmZmZmLAlUUkFQLAkJSTEJfSwKK3siYnJlYWsiLCAgICJjLHEiLAkweDAwMDAwMDBkLCAweGZjMDAwMDNmLAlUUkFQLAkJSTEJfSwKK3siYy5mLmQiLCAgICJTLFQiLAkweDQ2MjAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKK3siYy5mLmQiLCAgICJNLFMsVCIsCTB4NDYyMDAwMzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoreyJjLmYucyIsICAgIlMsVCIsCTB4NDYwMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjLmYucyIsICAgIk0sUyxUIiwJMHg0NjAwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCit7ImMudW4uZCIsICAiUyxUIiwJMHg0NjIwMDAzMSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCit7ImMudW4uZCIsICAiTSxTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKK3siYy51bi5zIiwgICJTLFQiLAkweDQ2MDAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKK3siYy51bi5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoreyJjLmVxLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoreyJjLmVxLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCit7ImMuZXEucyIsICAiUyxUIiwJMHg0NjAwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCit7ImMuZXEucyIsICAiTSxTLFQiLAkweDQ2MDAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKK3siYy51ZXEuZCIsICJTLFQiLAkweDQ2MjAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKK3siYy51ZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoreyJjLnVlcS5zIiwgIlMsVCIsCTB4NDYwMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjLnVlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCit7ImMub2x0LmQiLCAiUyxUIiwJMHg0NjIwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCit7ImMub2x0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKK3siYy5vbHQucyIsICJTLFQiLAkweDQ2MDAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKK3siYy5vbHQucyIsICJNLFMsVCIsCTB4NDYwMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoreyJjLnVsdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoreyJjLnVsdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCit7ImMudWx0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCit7ImMudWx0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKK3siYy5vbGUuZCIsICJTLFQiLAkweDQ2MjAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKK3siYy5vbGUuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoreyJjLm9sZS5zIiwgIlMsVCIsCTB4NDYwMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjLm9sZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCit7ImMudWxlLmQiLCAiUyxUIiwJMHg0NjIwMDAzNywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCit7ImMudWxlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKK3siYy51bGUucyIsICJTLFQiLAkweDQ2MDAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKK3siYy51bGUucyIsICJNLFMsVCIsCTB4NDYwMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoreyJjLnNmLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoreyJjLnNmLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzOCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCit7ImMuc2YucyIsICAiUyxUIiwJMHg0NjAwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCit7ImMuc2YucyIsICAiTSxTLFQiLAkweDQ2MDAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKK3siYy5uZ2xlLmQiLCJTLFQiLAkweDQ2MjAwMDM5LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKK3siYy5uZ2xlLmQiLCJNLFMsVCIsCTB4NDYyMDAwMzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoreyJjLm5nbGUucyIsIlMsVCIsCTB4NDYwMDAwMzksIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjLm5nbGUucyIsIk0sUyxUIiwJMHg0NjAwMDAzOSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCit7ImMuc2VxLmQiLCAiUyxUIiwJMHg0NjIwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCit7ImMuc2VxLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKK3siYy5zZXEucyIsICJTLFQiLAkweDQ2MDAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKK3siYy5zZXEucyIsICJNLFMsVCIsCTB4NDYwMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoreyJjLm5nbC5kIiwgIlMsVCIsCTB4NDYyMDAwM2IsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoreyJjLm5nbC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCit7ImMubmdsLnMiLCAiUyxUIiwJMHg0NjAwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCit7ImMubmdsLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKK3siYy5sdC5kIiwgICJTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKK3siYy5sdC5kIiwgICJNLFMsVCIsCTB4NDYyMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoreyJjLmx0LnMiLCAgIlMsVCIsCTB4NDYwMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjLmx0LnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCit7ImMubmdlLmQiLCAiUyxUIiwJMHg0NjIwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCit7ImMubmdlLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKK3siYy5uZ2UucyIsICJTLFQiLAkweDQ2MDAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKK3siYy5uZ2UucyIsICJNLFMsVCIsCTB4NDYwMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoreyJjLmxlLmQiLCAgIlMsVCIsCTB4NDYyMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoreyJjLmxlLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCit7ImMubGUucyIsICAiUyxUIiwJMHg0NjAwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCit7ImMubGUucyIsICAiTSxTLFQiLAkweDQ2MDAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKK3siYy5uZ3QuZCIsICJTLFQiLAkweDQ2MjAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKK3siYy5uZ3QuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoreyJjLm5ndC5zIiwgIlMsVCIsCTB4NDYwMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjLm5ndC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCit7ImNhY2hlIiwgICAiayxvKGIpIiwJMHhiYzAwMDAwMCwgMHhmYzAwMDAwMCwgUkRfYiwJCUkzfFQzCX0sCit7ImNlaWwubC5kIiwgIkQsUyIsCTB4NDYyMDAwMGEsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoreyJjZWlsLmwucyIsICJELFMiLAkweDQ2MDAwMDBhLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKK3siY2VpbC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCit7ImNlaWwudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoreyJjZmMwIiwgICAgInQsRyIsCTB4NDA0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAlJMQl9LAoreyJjZmMxIiwgICAgInQsRyIsCTB4NDQ0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MxfEZQX1MsCUkxCX0sCit7ImNmYzEiLCAgICAidCxTIiwJMHg0NDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzF8RlBfUywJSTEJfSwKK3siY2ZjMiIsICAgICJ0LEciLAkweDQ4NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMiwJSTEJfSwKK3siY2ZjMyIsICAgICJ0LEciLAkweDRjNDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMywJSTEJfSwKK3siY3RjMCIsICAgICJ0LEciLAkweDQwYzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKK3siY3RjMSIsICAgICJ0LEciLAkweDQ0YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQ3xGUF9TLAlJMQl9LAoreyJjdGMxIiwgICAgInQsUyIsCTB4NDRjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDfEZQX1MsCUkxCX0sCit7ImN0YzIiLCAgICAidCxHIiwJMHg0OGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCit7ImN0YzMiLCAgICAidCxHIiwJMHg0Y2MwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCUkxCX0sCit7ImN2dC5kLmwiLCAiRCxTIiwJMHg0NmEwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkzCX0sCit7ImN2dC5kLnMiLCAiRCxTIiwJMHg0NjAwMDAyMSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0R8RlBfUywJSTEJfSwKK3siY3Z0LmQudyIsICJELFMiLAkweDQ2ODAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKK3siY3Z0LmwuZCIsICJELFMiLAkweDQ2MjAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTMJfSwKK3siY3Z0LmwucyIsICJELFMiLAkweDQ2MDAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKK3siY3Z0LnMubCIsICJELFMiLAkweDQ2YTAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTMJfSwKK3siY3Z0LnMuZCIsICJELFMiLAkweDQ2MjAwMDIwLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAlJMQl9LAoreyJjdnQucy53IiwgIkQsUyIsCTB4NDY4MDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoreyJjdnQudy5kIiwgIkQsUyIsCTB4NDYyMDAwMjQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoreyJjdnQudy5zIiwgIkQsUyIsCTB4NDYwMDAwMjQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoreyJkYWJzIiwgICAgImQsdiIsCTAsICAgIChpbnQpIE1fREFCUywJSU5TTl9NQUNSTywJSTMJfSwKK3siZGFkZCIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAlJMwl9LAoreyJkYWRkIiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREX0ksCUlOU05fTUFDUk8sCUkzCX0sCit7ImRhZGRpIiwgICAidCxyLGoiLAkweDYwMDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sCit7ImRhZGRpdSIsICAidCxyLGoiLAkweDY0MDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX3MsCUkzCX0sCit7ImRhZGR1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJkLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJSTMJfSwKK3siZGFkZHUiLCAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fREFERFVfSSwJSU5TTl9NQUNSTywJSTMJfSwKKy8qIGRjdHIgYW5kIGRjdHcgYXJlIHVzZWQgb24gdGhlIHI1MDAwLiAgKi8KK3siZGN0ciIsICAgICJvKGIpIiwJMHhiYzA1MDAwMCwgMHhmYzFmMDAwMCwgUkRfYiwJSTMJfSwKK3siZGN0dyIsICAgICJvKGIpIiwJMHhiYzA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfYiwJSTMJfSwKK3siZGVyZXQiLCAgICIiLCAgICAgICAgIDB4NDIwMDAwMWYsIDB4ZmZmZmZmZmYsICAgIDAsCUcyCX0sCisvKiBGb3IgZGRpdiwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLworeyJkZGl2IiwgICAgInoscyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoreyJkZGl2IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ERElWXzMsCUlOU05fTUFDUk8sCUkzCX0sCit7ImRkaXYiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RESVZfM0ksCUlOU05fTUFDUk8sCUkzCX0sCisvKiBGb3IgZGRpdnUsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KK3siZGRpdnUiLCAgICJ6LHMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKK3siZGRpdnUiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVlVfMywJSU5TTl9NQUNSTywJSTMJfSwKK3siZGRpdnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRERJVlVfM0ksCUlOU05fTUFDUk8sCUkzCX0sCisvKiBUaGUgTUlQUyBhc3NlbWJsZXIgdHJlYXRzIHRoZSBkaXYgb3Bjb2RlIHdpdGggdHdvIG9wZXJhbmRzIGFzCisgICB0aG91Z2ggdGhlIGZpcnN0IG9wZXJhbmQgYXBwZWFyZWQgdHdpY2UgKHRoZSBmaXJzdCBvcGVyYW5kIGlzIGJvdGgKKyAgIGEgc291cmNlIGFuZCBhIGRlc3RpbmF0aW9uKS4gIFRvIGdldCB0aGUgZGl2IG1hY2hpbmUgaW5zdHJ1Y3Rpb24sCisgICB5b3UgbXVzdCB1c2UgYW4gZXhwbGljaXQgZGVzdGluYXRpb24gb2YgJDAuICAqLworeyJkaXYiLCAgICAgInoscyx0IiwJMHgwMDAwMDAxYSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoreyJkaXYiLCAgICAgInosdCIsCTB4MDAwMDAwMWEsIDB4ZmZlMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKK3siZGl2IiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRElWXzMsCUlOU05fTUFDUk8sCUkxCX0sCit7ImRpdiIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RJVl8zSSwJSU5TTl9NQUNSTywJSTEJfSwKK3siZGl2LmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sCit7ImRpdi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAzLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAorLyogRm9yIGRpdnUsIHNlZSB0aGUgY29tbWVudHMgYWJvdXQgZGl2LiAgKi8KK3siZGl2dSIsICAgICJ6LHMsdCIsCTB4MDAwMDAwMWIsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKK3siZGl2dSIsICAgICJ6LHQiLAkweDAwMDAwMDFiLCAweGZmZTBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCit7ImRpdnUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RJVlVfMywJSU5TTl9NQUNSTywJSTEJfSwKK3siZGl2dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRElWVV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKK3siZGxhIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0RMQV9BQiwJSU5TTl9NQUNSTywJSTMJfSwKK3siZGxpIiwgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCUkzCX0sIC8qIGFkZGl1ICovCit7ImRsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJSTMJfSwgLyogb3JpICovCit7ImRsaSIsICAgICAidCxJIiwJMCwgICAgKGludCkgTV9ETEksCUlOU05fTUFDUk8sCUkzCX0sCisKK3siZG1hZGQxNiIsICJzLHQiLCAgICAgIDB4MDAwMDAwMjksIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9MT3xSRF9MTywJVjEJfSwKK3siZG1mYzAiLCAgICJ0LEciLAkweDQwMjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9DMCwJSTMJfSwKK3siZG10YzAiLCAgICJ0LEciLAkweDQwYTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9DMHxXUl9DQywJSTMJfSwKK3siZG1mYzEiLCAgICJ0LFMiLAkweDQ0MjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9TfEZQX1MsCUkzCX0sCit7ImRtdGMxIiwgICAidCxTIiwJMHg0NGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9TLAlJMwl9LAoreyJkbWZjMiIsICAgInQsUyIsCTB4NDgyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX1N8RlBfUywJSTMJfSwKK3siZG10YzIiLCAgICJ0LFMiLAkweDQ4YTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9TfEZQX1MsCUkzCX0sCit7ImRtdWwiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUwsCUlOU05fTUFDUk8sCUkzCX0sCit7ImRtdWwiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxfSSwJSU5TTl9NQUNSTywJSTMJfSwKK3siZG11bG8iLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTE8sCUlOU05fTUFDUk8sCUkzCX0sCit7ImRtdWxvIiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPX0ksCUlOU05fTUFDUk8sCUkzCX0sCit7ImRtdWxvdSIsICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPVSwJSU5TTl9NQUNSTywJSTMJfSwKK3siZG11bG91IiwgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTE9VX0ksCUlOU05fTUFDUk8sCUkzCX0sCit7ImRtdWx0IiwgICAicyx0IiwJMHgwMDAwMDAxYywgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkgICAgSTN9LAoreyJkbXVsdHUiLCAgInMsdCIsCTB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywgICAgICBJM30sCit7ImRuZWciLCAgICAiZCx3IiwJMHgwMDAwMDAyZSwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMwl9LCAvKiBkc3ViIDAgKi8KK3siZG5lZ3UiLCAgICJkLHciLAkweDAwMDAwMDJmLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkzCX0sIC8qIGRzdWJ1IDAqLworeyJkcmVtIiwgICAgInoscyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoreyJkcmVtIiwgICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNXzMsCUlOU05fTUFDUk8sCUkzCX0sCit7ImRyZW0iLCAgICAiZCx2LEkiLAkzLCAgICAoaW50KSBNX0RSRU1fM0ksCUlOU05fTUFDUk8sCUkzCX0sCit7ImRyZW11IiwgICAieixzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCit7ImRyZW11IiwgICAiZCx2LHQiLAkzLCAgICAoaW50KSBNX0RSRU1VXzMsCUlOU05fTUFDUk8sCUkzCX0sCit7ImRyZW11IiwgICAiZCx2LEkiLAkzLCAgICAoaW50KSBNX0RSRU1VXzNJLAlJTlNOX01BQ1JPLAlJMwl9LAoreyJkc2xsdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCit7ImRzbGwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCit7ImRzbGwiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNsbHYgKi8KK3siZHNsbCIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2MsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNsbDMyICovCit7ImRzbGwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDM4LCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCit7ImRzcmF2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKK3siZHNyYTMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2YsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKK3siZHNyYSIsICAgICJkLHcscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc3JhdiAqLworeyJkc3JhIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzZiwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc3JhMzIgKi8KK3siZHNyYSIsICAgICJkLHcsPCIsCTB4MDAwMDAwM2IsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKK3siZHNybHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoreyJkc3JsMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzZSwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoreyJkc3JsIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzcmx2ICovCit7ImRzcmwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzcmwzMiAqLworeyJkc3JsIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzYSwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoreyJkc3ViIiwgICAgImQsdix0IiwJMHgwMDAwMDAyZSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkzCX0sCit7ImRzdWIiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RTVUJfSSwJSU5TTl9NQUNSTywJSTMJfSwKK3siZHN1YnUiLCAgICJkLHYsdCIsCTB4MDAwMDAwMmYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMwl9LAoreyJkc3VidSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9EU1VCVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAoreyJlcmV0IiwgICAgIiIsCQkweDQyMDAwMDE4LCAweGZmZmZmZmZmLAkwLAlJMwl9LAoreyJmbG9vci5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCit7ImZsb29yLmwucyIsICJELFMiLAkweDQ2MDAwMDBiLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKK3siZmxvb3Iudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoreyJmbG9vci53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCit7ImZsdXNoaSIsICAiIiwJCTB4YmMwMTAwMDAsIDB4ZmZmZmZmZmYsIDAsCQlMMQl9LAoreyJmbHVzaGQiLCAgIiIsCQkweGJjMDIwMDAwLCAweGZmZmZmZmZmLCAwLCBMMQkJfSwKK3siZmx1c2hpZCIsICIiLAkJMHhiYzAzMDAwMCwgMHhmZmZmZmZmZiwgMCwgTDEJCX0sCit7ImhpYmVybmF0ZSIsIiIsICAgICAgICAweDQyMDAwMDIzLCAweGZmZmZmZmZmLAkwLCBWMQl9LAoreyJqciIsICAgICAgInMiLAkweDAwMDAwMDA4LCAweGZjMWZmZmZmLAlVQkR8UkRfcywJSTEJfSwKK3siaiIsICAgICAgICJzIiwJMHgwMDAwMDAwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCUkxCX0sIC8qIGpyICovCisvKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGosIHNvIGl0IG11c3QgYmUgYQorICAgbWFjcm8uICAqLworeyJqIiwJICAgICJhIiwJMCwgICAgIChpbnQpIE1fSl9BLAlJTlNOX01BQ1JPLAlJMQl9LAorLyogVGhpcyBmb3JtIG9mIGogaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyIGFuZCBpbnRlcm5hbGx5IGJ5IHRoZQorICAgYXNzZW1ibGVyLCBidXQgd2lsbCBuZXZlciBtYXRjaCB1c2VyIGlucHV0IChiZWNhdXNlIHRoZSBsaW5lIGFib3ZlCisgICB3aWxsIG1hdGNoIGZpcnN0KS4gICovCit7ImoiLCAgICAgICAiYSIsCTB4MDgwMDAwMDAsIDB4ZmMwMDAwMDAsCVVCRCwJCUkxCX0sCit7ImphbHIiLCAgICAicyIsCTB4MDAwMGY4MDksIDB4ZmMxZmZmZmYsCVVCRHxSRF9zfFdSX2QsCUkxCX0sCit7ImphbHIiLCAgICAiZCxzIiwJMHgwMDAwMDAwOSwgMHhmYzFmMDdmZiwJVUJEfFJEX3N8V1JfZCwJSTEJfSwKKy8qIFNWUjQgUElDIGNvZGUgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3IgamFsLCBzbyBpdCBtdXN0IGJlIGEKKyAgIG1hY3JvLiAgKi8KK3siamFsIiwgICAgICJkLHMiLAkwLCAgICAgKGludCkgTV9KQUxfMiwJSU5TTl9NQUNSTywJSTEJfSwKK3siamFsIiwgICAgICJzIiwJMCwgICAgIChpbnQpIE1fSkFMXzEsCUlOU05fTUFDUk8sCUkxCX0sCit7ImphbCIsICAgICAiYSIsCTAsICAgICAoaW50KSBNX0pBTF9BLAlJTlNOX01BQ1JPLAlJMQl9LAorLyogVGhpcyBmb3JtIG9mIGphbCBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCisgICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKKyAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KK3siamFsIiwgICAgICJhIiwJMHgwYzAwMDAwMCwgMHhmYzAwMDAwMCwJVUJEfFdSXzMxLAlJMQl9LAorICAvKiBqYWx4IHJlYWxseSBzaG91bGQgb25seSBiZSBhdmFsaWFibGUgaWYgbWlwczE2IGlzIGF2YWlsYWJsZSwKKyAgICAgYnV0IGZvciBub3cgbWFrZSBpdCBJMS4gKi8KK3siamFseCIsICAgICJhIiwJMHg3NDAwMDAwMCwgMHhmYzAwMDAwMCwgVUJEfFdSXzMxLAlJMSAgICAgIH0sCit7ImxhIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sibGIiLCAgICAgICJ0LG8oYikiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoreyJsYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7ImxidSIsICAgICAidCxvKGIpIiwJMHg5MDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKK3sibGJ1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xCVV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sibGQiLAkgICAgInQsbyhiKSIsICAgMHhkYzAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9iLAlJMwl9LAoreyJsZCIsICAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fTERfT0IsCUlOU05fTUFDUk8sCUkxCX0sCit7ImxkIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sibGRjMSIsICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sCit7ImxkYzEiLCAgICAiRSxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LAoreyJsZGMxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKK3sibGRjMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCit7ImwuZCIsICAgICAiVCxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAlJMgl9LCAvKiBsZGMxICovCit7ImwuZCIsICAgICAiVCxvKGIpIiwJMCwgICAgKGludCkgTV9MX0RPQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sibC5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xfREFCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsZGMyIiwgICAgIkUsbyhiKSIsCTB4ZDgwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX0NDLAlJMgl9LAoreyJsZGMyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMl9BQiwJSU5TTl9NQUNSTywJSTIJfSwKK3sibGRjMyIsICAgICJFLG8oYikiLAkweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9DQywJSTIJfSwKK3sibGRjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzNfQUIsCUlOU05fTUFDUk8sCUkyCX0sCit7ImxkbCIsCSAgICAidCxvKGIpIiwJMHg2ODAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFdSX3R8UkRfYiwJSTMJfSwKK3sibGRsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xETF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKK3sibGRyIiwJICAgICJ0LG8oYikiLAkweDZjMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8V1JfdHxSRF9iLAlJMwl9LAoreyJsZHIiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERSX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoreyJsZHhjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDEsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYiwJSTQJfSwKK3sibGgiLCAgICAgICJ0LG8oYikiLAkweDg0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoreyJsaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7ImxodSIsICAgICAidCxvKGIpIiwJMHg5NDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKK3sibGh1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xIVV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKKy8qIGxpIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLworeyJsaS5kIiwgICAgInQsRiIsCTAsICAgIChpbnQpIE1fTElfRCwJSU5TTl9NQUNSTywJSTEJfSwKK3sibGkuZCIsICAgICJULEwiLAkwLCAgICAoaW50KSBNX0xJX0RELAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsaS5zIiwgICAgInQsZiIsCTAsICAgIChpbnQpIE1fTElfUywJSU5TTl9NQUNSTywJSTEJfSwKK3sibGkucyIsICAgICJULGwiLAkwLCAgICAoaW50KSBNX0xJX1NTLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsbCIsCSAgICAidCxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJSTIJfSwKK3sibGwiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExfQUIsCUlOU05fTUFDUk8sCUkyCX0sCit7ImxsZCIsCSAgICAidCxvKGIpIiwJMHhkMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJSTMJfSwKK3sibGxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xMRF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKK3sibHVpIiwgICAgICJ0LHUiLAkweDNjMDAwMDAwLCAweGZmZTAwMDAwLAlXUl90LAkJSTEJfSwKK3sibHciLCAgICAgICJ0LG8oYikiLAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoreyJsdyIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7Imx3YzAiLCAgICAiRSxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCit7Imx3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsd2MxIiwgICAgIlQsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwKK3sibHdjMSIsICAgICJFLG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sCit7Imx3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsd2MxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sibC5zIiwgICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCUkxCX0sIC8qIGx3YzEgKi8KK3sibC5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7Imx3YzIiLCAgICAiRSxvKGIpIiwJMHhjODAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCit7Imx3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MyX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsd2MzIiwgICAgIkUsbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAlJMQl9LAoreyJsd2MzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDM19BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sibHdsIiwgICAgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoreyJsd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJsY2FjaGUiLCAgInQsbyhiKSIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkyCX0sIC8qIHNhbWUgKi8KK3sibGNhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgbHdsICovCit7Imx3ciIsICAgICAidCxvKGIpIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTEJfSwKK3sibHdyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3siZmx1c2giLCAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMgl9LCAvKiBzYW1lICovCit7ImZsdXNoIiwgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIGx3ciAqLworeyJsd3UiLCAgICAgInQsbyhiKSIsCTB4OWMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkzCX0sCit7Imx3dSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1VfQUIsCUlOU05fTUFDUk8sCUkzCX0sCit7Imx3eGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMCwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAorCisKK3sibWFkIiwJICAgICJzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVAzCX0sCit7Im1hZHUiLCAgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlQMwl9LAoreyJtYWRkLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCit7Im1hZGQucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjAsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKK3sibWFkZCIsICAgICJzLHQiLAkweDAwMDAwMDFjLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCQlMMQl9LAoreyJtYWRkIiwgICAgInMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAkgICAgICAgIEcxCX0sCit7Im1hZGQiLCAgICAiZCxzLHQiLAkweDcwMDAwMDAwLCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLAlHMQl9LAoreyJtYWRkdSIsICAgInMsdCIsCTB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJCUwxCX0sCit7Im1hZGR1IiwgICAicyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUcxfSwKK3sibWFkZHUiLCAgICJkLHMsdCIsCTB4NzAwMDAwMDEsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sCUcxfSwKK3sibWFkZDE2IiwgICJzLHQiLCAgICAgIDB4MDAwMDAwMjgsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJVjEJfSwKK3sibWZjMCIsICAgICJ0LEciLAkweDQwMDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJSTEJfSwKK3sibWZjMSIsICAgICJ0LFMiLAkweDQ0MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9TfEZQX1MsCUkxCX0sCit7Im1mYzEiLCAgICAidCxHIiwJMHg0NDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfU3xGUF9TLAlJMQl9LAoreyJtZmMyIiwgICAgInQsRyIsCTB4NDgwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAlJMQl9LAoreyJtZmMzIiwgICAgInQsRyIsCTB4NGMwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAlJMQl9LAoreyJtZmhpIiwgICAgImQiLAkweDAwMDAwMDEwLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0hJLAlJMQl9LAoreyJtZmxvIiwgICAgImQiLAkweDAwMDAwMDEyLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0xPLAlJMQl9LAoreyJtb3YuZCIsICAgIkQsUyIsCTB4NDYyMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoreyJtb3YucyIsICAgIkQsUyIsCTB4NDYwMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoreyJtb3ZmIiwgICAgImQscyxOIiwJMHgwMDAwMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDfEZQX0R8RlBfUywJSTQJfSwKK3sibW92Zi5kIiwgICJELFMsTiIsCTB4NDYyMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAlJNAl9LAoreyJtb3ZmLnMiLCAgIkQsUyxOIiwJMHg0NjAwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX1MsCUk0CX0sCit7Im1vdm4iLCAgICAiZCx2LHQiLAkweDAwMDAwMDBiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTQJfSwKK3siZmZjIiwgICAgICJkLHYiLAkweDAwMDAwMDBiLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsTDEJfSwKK3sibW92bi5kIiwgICJELFMsdCIsCTB4NDYyMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsCUk0CX0sCit7Im1vdm4ucyIsICAiRCxTLHQiLAkweDQ2MDAwMDEzLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9TLAlJNAl9LAoreyJtb3Z0IiwgICAgImQscyxOIiwJMHgwMDAxMDAwMSwgMHhmYzAzMDdmZiwgV1JfZHxSRF9zfFJEX0NDLAlJNAl9LAoreyJtb3Z0LmQiLCAgIkQsUyxOIiwJMHg0NjIxMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk0CX0sCit7Im1vdnQucyIsICAiRCxTLE4iLAkweDQ2MDEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfUywJSTQJfSwKK3sibW92eiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMGEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJNAl9LAoreyJmZnMiLCAgICAgImQsdiIsCTB4MDAwMDAwMGEsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcyxMMQl9LAoreyJtb3Z6LmQiLCAgIkQsUyx0IiwJMHg0NjIwMDAxMiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfRCwJSTQJfSwKK3sibW92ei5zIiwgICJELFMsdCIsCTB4NDYwMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsCUk0CX0sCisvKiBtb3ZlIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KK3sibXN1Yi5kIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyOSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoreyJtc3ViLnMiLCAgIkQsUixTLFQiLAkweDRjMDAwMDI4LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCit7Im1zdWIiLCAgICAicyx0IiwJMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLEwxCX0sCit7Im1zdWJ1IiwgICAicyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLEwxCX0sCit7Im10YzAiLCAgICAidCxHIiwJMHg0MDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCUkxCX0sCit7Im10YzEiLCAgICAidCxTIiwJMHg0NDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfU3xGUF9TLAlJMQl9LAoreyJtdGMxIiwgICAgInQsRyIsCTB4NDQ4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfUywJSTEJfSwKK3sibXRjMiIsICAgICJ0LEciLAkweDQ4ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMnxXUl9DQywJSTEJfSwKK3sibXRjMyIsICAgICJ0LEciLAkweDRjODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DM3xXUl9DQywJSTEJfSwKK3sibXRoaSIsICAgICJzIiwJMHgwMDAwMDAxMSwgMHhmYzFmZmZmZiwJUkRfc3xXUl9ISSwJSTEJfSwKK3sibXRsbyIsICAgICJzIiwJMHgwMDAwMDAxMywgMHhmYzFmZmZmZiwJUkRfc3xXUl9MTywJSTEJfSwKK3sibXVsLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sCit7Im11bC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAoreyJtdWwiLCAgICAgImQsdix0IiwJMHg3MDAwMDAwMiwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSEl8V1JfTE8sUDN9LAoreyJtdWwiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUwsCUlOU05fTUFDUk8sCUkxCX0sCit7Im11bCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJtdWxvIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUxPLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJtdWxvIiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxPX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7Im11bG91IiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE9VLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJtdWxvdSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9NVUxPVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJtdWx0IiwgICAgInMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xJU19NLAlJMX0sCit7Im11bHQiLCAgICAiZCxzLHQiLAkweDAwMDAwMDE4LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98V1JfZHxJU19NLCBHMX0sCit7Im11bHR1IiwgICAicyx0IiwJMHgwMDAwMDAxOSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUkxfSwKK3sibXVsdHUiLCAgICJkLHMsdCIsCTB4MDAwMDAwMTksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sIEcxfSwKK3sibmVnIiwgICAgICJkLHciLAkweDAwMDAwMDIyLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkxCX0sIC8qIHN1YiAwICovCit7Im5lZ3UiLCAgICAiZCx3IiwJMHgwMDAwMDAyMywgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAlJMQl9LCAvKiBzdWJ1IDAgKi8KK3sibmVnLmQiLCAgICJELFYiLAkweDQ2MjAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKK3sibmVnLnMiLCAgICJELFYiLAkweDQ2MDAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKK3sibm1hZGQuZCIsICJELFIsUyxUIiwJMHg0YzAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoreyJubWFkZC5zIiwgIkQsUixTLFQiLAkweDRjMDAwMDMwLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCit7Im5tc3ViLmQiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzksIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKK3sibm1zdWIucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAorLyogbm9wIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLworeyJub3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCit7Im5vciIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX05PUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJub3QiLCAgICAgImQsdiIsCTB4MDAwMDAwMjcsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LC8qbm9yIGQscywwKi8KK3sib3IiLCAgICAgICJkLHYsdCIsCTB4MDAwMDAwMjUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoreyJvciIsICAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9PUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJvcmkiLCAgICAgInQscixpIiwJMHgzNDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAlJMQl9LAorCisKK3sicHJlZiIsICAgICJrLG8oYikiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLAkJRzMJfSwKK3sicHJlZngiLCAgICJoLHQoYikiLAkweDRjMDAwMDBmLCAweGZjMDAwN2ZmLCBSRF9ifFJEX3QsCUk0CX0sCisKKworeyJyZWNpcC5kIiwgIkQsUyIsCTB4NDYyMDAwMTUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJNAl9LAoreyJyZWNpcC5zIiwgIkQsUyIsCTB4NDYwMDAwMTUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJNAl9LAoreyJyZW0iLCAgICAgInoscyx0IiwJMHgwMDAwMDAxYSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMSB9LAoreyJyZW0iLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1fMywJSU5TTl9NQUNSTywJSTEJfSwKK3sicmVtIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJyZW11IiwgICAgInoscyx0IiwJMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMSB9LAoreyJyZW11IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1VXzMsCUlOU05fTUFDUk8sCUkxCX0sCit7InJlbXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JFTVVfM0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InJmZSIsICAgICAiIiwJCTB4NDIwMDAwMTAsIDB4ZmZmZmZmZmYsCTAsCUkxfFQzCQl9LAoreyJyb2wiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST0wsCUlOU05fTUFDUk8sCUkxCX0sCit7InJvbCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPTF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJyb3IiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST1IsCUlOU05fTUFDUk8sCUkxCX0sCit7InJvciIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPUl9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJyb3VuZC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCit7InJvdW5kLmwucyIsICJELFMiLAkweDQ2MDAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTMJfSwKK3sicm91bmQudy5kIiwgIkQsUyIsCTB4NDYyMDAwMGMsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoreyJyb3VuZC53LnMiLCAiRCxTIiwJMHg0NjAwMDAwYywgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCit7InJzcXJ0LmQiLCAiRCxTIiwJMHg0NjIwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUk0CX0sCit7InJzcXJ0LnMiLCAiRCxTIiwJMHg0NjAwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUk0CX0sCit7InNiIiwgICAgICAidCxvKGIpIiwJMHhhMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoreyJzYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7InNjIiwJICAgICJ0LG8oYikiLAkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJSTIJfSwKK3sic2MiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0NfQUIsCUlOU05fTUFDUk8sCUkyCX0sCit7InNjZCIsCSAgICAidCxvKGIpIiwJMHhmMDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfdHxXUl90fFJEX2IsCUkzCX0sCit7InNjZCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ0RfQUIsCUlOU05fTUFDUk8sCUkzCX0sCit7InNkIiwJICAgICJ0LG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCit7InNkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9TRF9PQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sic2QiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzZGJicCIsICAgIiIsCQkweDAwMDAwMDBlLCAweGZmZmZmZmZmLAlUUkFQLCAgICAgICAgICAgRzIJfSwKK3sic2RiYnAiLCAgICJjIiwJMHgwMDAwMDAwZSwgMHhmYzAwZmZmZiwJVFJBUCwJCUcyCX0sCit7InNkYmJwIiwgICAiYyxxIiwJMHgwMDAwMDAwZSwgMHhmYzAwMDAzZiwJVFJBUCwJCUcyCX0sCit7InNkYzEiLCAgICAiVCxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCit7InNkYzEiLCAgICAiRSxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCUkyCX0sCit7InNkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJzZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKK3sic2RjMiIsICAgICJFLG8oYikiLAkweGY4MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DMnxSRF9iLAlJMgl9LAoreyJzZGMyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMl9BQiwJSU5TTl9NQUNSTywJSTIJfSwKK3sic2RjMyIsICAgICJFLG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DM3xSRF9iLAlJMgl9LAoreyJzZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDM19BQiwJSU5TTl9NQUNSTywJSTIJfSwKK3sicy5kIiwgICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKK3sicy5kIiwgICAgICJULG8oYikiLAkwLCAgICAoaW50KSBNX1NfRE9CLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzLmQiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU19EQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7InNkbCIsICAgICAidCxvKGIpIiwJMHhiMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoreyJzZGwiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RMX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoreyJzZHIiLCAgICAgInQsbyhiKSIsCTB4YjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKK3sic2RyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEUl9BQiwJSU5TTl9NQUNSTywJSTMJfSwKK3sic2R4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDksIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNAl9LAoreyJzZWxzbCIsICAgImQsdix0IiwJMHgwMDAwMDAwNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsTDEJfSwKK3sic2Vsc3IiLCAgICJkLHYsdCIsCTB4MDAwMDAwMDEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LEwxCX0sCit7InNlcSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NFUSwJSU5TTl9NQUNSTywJSTEJfSwKK3sic2VxIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0VRX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InNnZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRSwJSU5TTl9NQUNSTywJSTEJfSwKK3sic2dlIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dFX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InNnZXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRVUsCUlOU05fTUFDUk8sCUkxCX0sCit7InNnZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3sic2d0IiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dULAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzZ3QiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3sic2d0dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dUVSwJSU5TTl9NQUNSTywJSTEJfSwKK3sic2d0dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzaCIsICAgICAgInQsbyhiKSIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKK3sic2giLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NIX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzbGUiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEUsCUlOU05fTUFDUk8sCUkxCX0sCit7InNsZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzbGV1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEVVLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzbGV1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTEVVX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InNsbHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKK3sic2xsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzbGx2ICovCit7InNsbCIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAwLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCit7InNsdCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDJhLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKK3sic2x0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InNsdGkiLCAgICAidCxyLGoiLAkweDI4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCit7InNsdGl1IiwgICAidCxyLGoiLAkweDJjMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCit7InNsdHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKK3sic2x0dSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzbmUiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTkUsCUlOU05fTUFDUk8sCUkxCX0sCit7InNuZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NORV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzcXJ0LmQiLCAgIkQsUyIsCTB4NDYyMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoreyJzcXJ0LnMiLCAgIkQsUyIsCTB4NDYwMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMgl9LAoreyJzcmF2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCit7InNyYSIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc3JhdiAqLworeyJzcmEiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMywgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoreyJzcmx2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sCit7InNybCIsICAgICAiZCx3LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwgLyogc3JsdiAqLworeyJzcmwiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMQl9LAoreyJzdGFuZGJ5IiwgIiIsICAgICAgICAgMHg0MjAwMDAyMSwgMHhmZmZmZmZmZiwJMCwJCVYxCX0sCit7InN1YiIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIyLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKK3sic3ViIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InN1Yi5kIiwgICAiRCxWLFQiLAkweDQ2MjAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAlJMQl9LCAgICAgCit7InN1Yi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAlJMQl9LAoreyJzdWJ1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCit7InN1YnUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NVQlVfSSwJSU5TTl9NQUNSTywJSTEJfSwKK3sic3VzcGVuZCIsICIiLCAgICAgICAgIDB4NDIwMDAwMjIsIDB4ZmZmZmZmZmYsCTAsCQlWMQl9LAoreyJzdyIsICAgICAgInQsbyhiKSIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKK3sic3ciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzd2MwIiwgICAgIkUsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MwfFJEX2IsCUkxCX0sCit7InN3YzAiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MwX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzd2MxIiwgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LAoreyJzd2MxIiwgICAgIkUsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAlJMQl9LAoreyJzd2MxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKK3sic3djMSIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7InMucyIsICAgICAiVCxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sIC8qIHN3YzEgKi8KK3sicy5zIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7InN3YzIiLCAgICAiRSxvKGIpIiwJMHhlODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzJ8UkRfYiwJSTEJfSwKK3sic3djMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7InN3YzMiLCAgICAiRSxvKGIpIiwJMHhlYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzN8UkRfYiwJSTEJfSwKK3sic3djMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzNfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7InN3bCIsICAgICAidCxvKGIpIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoreyJzd2wiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dMX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJzY2FjaGUiLCAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJSTIJfSwgLyogc2FtZSAqLworeyJzY2FjaGUiLCAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBzd2wgKi8KK3sic3dyIiwgICAgICJ0LG8oYikiLAkweGI4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCit7InN3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV1JfQUIsCUlOU05fTUFDUk8sCUkxCX0sCit7ImludmFsaWRhdGUiLCAidCxvKGIpIiwweGI4MDAwMDAwLCAweGZjMDAwMDAwLAlSRF90fFJEX2IsCUkyCX0sIC8qIHNhbWUgKi8KK3siaW52YWxpZGF0ZSIsICJ0LEEoYikiLDAsICAgIChpbnQpIE1fU1dSX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBzd3IgKi8KK3sic3d4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDgsIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9iLAlJNAl9LAoreyJzeW5jIiwgICAgIiIsCQkweDAwMDAwMDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyfEcxCX0sCit7InN5bmMucCIsICAiIiwJCTB4MDAwMDA0MGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTIJfSwKK3sic3luYy5sIiwgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMgl9LAoreyJzeXNjYWxsIiwgIiIsCQkweDAwMDAwMDBjLCAweGZmZmZmZmZmLAlUUkFQLAlJMQkJfSwKK3sic3lzY2FsbCIsICJCIiwJMHgwMDAwMDAwYywgMHhmYzAwMDAzZiwJVFJBUCwJSTEJCX0sCit7InRlcWkiLCAgICAicyxqIiwJMHgwNDBjMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LAoreyJ0ZXEiLAkgICAgInMsdCIsCTB4MDAwMDAwMzQsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgl9LAoreyJ0ZXEiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzNCwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCX0sCit7InRlcSIsICAgICAicyxqIiwJMHgwNDBjMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgl9LCAvKiB0ZXFpICovCit7InRlcSIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9URVFfSSwJSU5TTl9NQUNSTywJSTIJfSwKK3sidGdlaSIsICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sCit7InRnZSIsCSAgICAicyx0IiwJMHgwMDAwMDAzMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFRSQVAsCUkyCX0sCit7InRnZSIsCSAgICAicyx0LHEiLAkweDAwMDAwMDMwLCAweGZjMDAwMDNmLAlSRF9zfFJEX3R8VFJBUCwJSTIJfSwKK3sidGdlIiwgICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sIC8qIHRnZWkgKi8KK3sidGdlIiwJICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RHRV9JLCAgICBJTlNOX01BQ1JPLAlJMgl9LAoreyJ0Z2VpdSIsICAgInMsaiIsCTB4MDQwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCit7InRnZXUiLCAgICAicyx0IiwJMHgwMDAwMDAzMSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoreyJ0Z2V1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoreyJ0Z2V1IiwgICAgInMsaiIsCTB4MDQwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRnZWl1ICovCit7InRnZXUiLCAgICAicyxJIiwJMCwgICAgKGludCkgTV9UR0VVX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7InRsYnAiLCAgICAiIiwJCTB4NDIwMDAwMDgsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMQl9LAoreyJ0bGJyIiwgICAgIiIsCQkweDQyMDAwMDAxLCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTEJfSwKK3sidGxid2kiLCAgICIiLAkJMHg0MjAwMDAwMiwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxCX0sCit7InRsYndyIiwgICAiIiwJCTB4NDIwMDAwMDYsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMQl9LAoreyJ0bHRpIiwgICAgInMsaiIsCTB4MDQwYTAwMDAsIDB4ZmMxZjAwMDAsCVJEX3N8VFJBUCwJSTIJCX0sCit7InRsdCIsICAgICAicyx0IiwJMHgwMDAwMDAzMiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoreyJ0bHQiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzMiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoreyJ0bHQiLCAgICAgInMsaiIsCTB4MDQwYTAwMDAsIDB4ZmMxZjAwMDAsCVJEX3N8VFJBUCwJSTIJCX0sIC8qIHRsdGkgKi8KK3sidGx0IiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RMVF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoreyJ0bHRpdSIsICAgInMsaiIsCTB4MDQwYjAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sCit7InRsdHUiLCAgICAicyx0IiwJMHgwMDAwMDAzMywgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoreyJ0bHR1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMywgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCUkyCSB9LAoreyJ0bHR1IiwgICAgInMsaiIsCTB4MDQwYjAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJCX0sIC8qIHRsdGl1ICovCit7InRsdHUiLCAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTFRVX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7InRuZWkiLCAgICAicyxqIiwJMHgwNDBlMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKK3sidG5lIiwgICAgICJzLHQiLAkweDAwMDAwMDM2LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCit7InRuZSIsICAgICAicyx0LHEiLAkweDAwMDAwMDM2LCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCit7InRuZSIsICAgICAicyxqIiwJMHgwNDBlMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdG5laSAqLworeyJ0bmUiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVE5FX0ksCUlOU05fTUFDUk8sCUkyCX0sCit7InRydW5jLmwuZCIsICJELFMiLAkweDQ2MjAwMDA5LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKK3sidHJ1bmMubC5zIiwgIkQsUyIsCTB4NDYwMDAwMDksIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoreyJ0cnVuYy53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCit7InRydW5jLncuZCIsICJELFMseCIsCTB4NDYyMDAwMGQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMgl9LAoreyJ0cnVuYy53LmQiLCAiRCxTLHQiLAkwLCAgICAoaW50KSBNX1RSVU5DV0QsCUlOU05fTUFDUk8sCUkxCX0sCit7InRydW5jLncucyIsICJELFMiLAkweDQ2MDAwMDBkLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTIJfSwKK3sidHJ1bmMudy5zIiwgIkQsUyx4IiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkyCX0sCit7InRydW5jLncucyIsICJELFMsdCIsCTAsICAgIChpbnQpIE1fVFJVTkNXUywJSU5TTl9NQUNSTywJSTEJfSwKK3sidWxkIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMRCwJSU5TTl9NQUNSTywJSTMJfSwKK3sidWxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMRF9BLAlJTlNOX01BQ1JPLAlJMwl9LAoreyJ1bGgiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxILAlJTlNOX01BQ1JPLAlJMQl9LAoreyJ1bGgiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxIX0EsCUlOU05fTUFDUk8sCUkxCX0sCit7InVsaHUiLCAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEhVLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJ1bGh1IiwgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxIVV9BLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJ1bHciLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxXLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJ1bHciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxXX0EsCUlOU05fTUFDUk8sCUkxCX0sCit7InVzZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU0QsCUlOU05fTUFDUk8sCUkzCX0sCit7InVzZCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU0RfQSwJSU5TTl9NQUNSTywJSTMJfSwKK3sidXNoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTSCwJSU5TTl9NQUNSTywJSTEJfSwKK3sidXNoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTSF9BLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJ1c3ciLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNXLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJ1c3ciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNXX0EsCUlOU05fTUFDUk8sCUkxCX0sCit7InhvciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKK3sieG9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fWE9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCit7InhvcmkiLCAgICAidCxyLGkiLAkweDM4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCit7IndhaXQiLCAgICAiIiwJCTB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsCVRSQVAsCUkzCX0sCit7IndhaXRpIiwgICAiIiwJCTB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsCVRSQVAsCUwxCX0sCit7IndiIiwgCSAgICAibyhiKSIsCTB4YmMwNDAwMDAsIDB4ZmMxZjAwMDAsIFNNfFJEX2IsCUwxCX0sCisvKiBObyBoYXphcmQgcHJvdGVjdGlvbiBvbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMtLXRoZXkgc2hvdWxkbid0CisgICBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBwcm9jZXNzb3IgYW5kIGlmIHRoZXkgZG8gaXQncyB1cCB0byB0aGUKKyAgIHVzZXIgdG8gcHV0IGluIG5vcHMgYXMgbmVjZXNzYXJ5LiAgVGhlc2UgYXJlIGF0IHRoZSBlbmQgc28gdGhhdCB0aGUKKyAgIGRpc2FzZW1ibGVyIHJlY29nbml6ZXMgbW9yZSBzcGVjaWZpYyB2ZXJzaW9ucyBmaXJzdC4gICovCit7ImMwIiwgICAgICAiQyIsCTB4NDIwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoreyJjMSIsICAgICAgIkMiLAkweDQ2MDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKK3siYzIiLCAgICAgICJDIiwJMHg0YTAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCit7ImMzIiwgICAgICAiQyIsCTB4NGUwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoreyJjb3AwIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AwLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJjb3AxIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AxLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJjb3AyIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AyLAlJTlNOX01BQ1JPLAlJMQl9LAoreyJjb3AzIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AzLAlJTlNOX01BQ1JPLAlJMQl9LAorCisgIC8qIENvbmZsaWN0cyB3aXRoIHRoZSA0NjUwJ3MgIm11bCIgaW5zdHJ1Y3Rpb24uICBOb2JvZHkncyB1c2luZyB0aGUKKyAgICAgNDAxMCBhbnkgbW9yZSwgc28gbW92ZSB0aGlzIGluc24gb3V0IG9mIHRoZSB3YXkuICBJZiB0aGUgb2JqZWN0CisgICAgIGZvcm1hdCBnYXZlIHVzIG1vcmUgaW5mbywgd2UgY291bGQgZG8gdGhpcyByaWdodC4gICovCit7ImFkZGNpdSIsICAidCxyLGoiLAkweDcwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsTDEJfSwKK307CisKKyNkZWZpbmUgTUlQU19OVU1fT1BDT0RFUyBcCisJKChzaXplb2YgbWlwc19idWlsdGluX29wY29kZXMpIC8gKHNpemVvZiAobWlwc19idWlsdGluX29wY29kZXNbMF0pKSkKK2NvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKKworLyogY29uc3QgcmVtb3ZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgdG8gYWxsb3cgZm9yIGR5bmFtaWMgZXh0ZW5zaW9ucyB0byB0aGUgCisgKiBidWlsdC1pbiBpbnN0cnVjdGlvbiBzZXQuICovCitzdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfb3Bjb2RlcyA9CisgIChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgbWlwc19idWlsdGluX29wY29kZXM7CitpbnQgYmZkX21pcHNfbnVtX29wY29kZXMgPSBNSVBTX05VTV9PUENPREVTOworI3VuZGVmIE1JUFNfTlVNX09QQ09ERVMKKwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzMTYtb3BjLmMgYi9vcGNvZGVzL21pcHMxNi1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQyZGJiCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9taXBzMTYtb3BjLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIG1pcHMxNi1vcGMuYy4gIE1pcHMxNiBvcGNvZGUgdGFibGUuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQordGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisxLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQord2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCit3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCiswMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCisKKy8qIFRoaXMgaXMgdGhlIG9wY29kZXMgdGFibGUgZm9yIHRoZSBtaXBzMTYgcHJvY2Vzc29yLiAgVGhlIGZvcm1hdCBvZgorICAgdGhpcyB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb25lIGluIG1pcHMtb3BjLmMuCisgICBIb3dldmVyLCB0aGUgc3BlY2lhbCBsZXR0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBhcmd1bWVudCBzdHJpbmcgYXJlCisgICBkaWZmZXJlbnQsIGFuZCB0aGUgdGFibGUgdXNlcyBzb21lIGRpZmZlcmVudCBmbGFncy4gICovCisKKy8qIFVzZSBzb21lIHNob3J0IGhhbmQgbWFjcm9zIHRvIGtlZXAgZG93biB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lcyBpbgorICAgdGhlIG9wY29kZXMgdGFibGUuICAqLworCisjZGVmaW5lIFVCRCAgICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCisjZGVmaW5lIEJSICAgICAgTUlQUzE2X0lOU05fQlJBTkNICisKKyNkZWZpbmUgV1JfeAlNSVBTMTZfSU5TTl9XUklURV9YCisjZGVmaW5lIFdSX3kJTUlQUzE2X0lOU05fV1JJVEVfWQorI2RlZmluZSBXUl96CU1JUFMxNl9JTlNOX1dSSVRFX1oKKyNkZWZpbmUgV1JfVAlNSVBTMTZfSU5TTl9XUklURV9UCisjZGVmaW5lIFdSX1NQCU1JUFMxNl9JTlNOX1dSSVRFX1NQCisjZGVmaW5lIFdSXzMxCU1JUFMxNl9JTlNOX1dSSVRFXzMxCisjZGVmaW5lIFdSX1kJTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kKKworI2RlZmluZSBSRF94CU1JUFMxNl9JTlNOX1JFQURfWAorI2RlZmluZSBSRF95CU1JUFMxNl9JTlNOX1JFQURfWQorI2RlZmluZSBSRF9aCU1JUFMxNl9JTlNOX1JFQURfWgorI2RlZmluZSBSRF9UCU1JUFMxNl9JTlNOX1JFQURfVAorI2RlZmluZSBSRF9TUAlNSVBTMTZfSU5TTl9SRUFEX1NQCisjZGVmaW5lIFJEXzMxCU1JUFMxNl9JTlNOX1JFQURfMzEKKyNkZWZpbmUgUkRfUEMJTUlQUzE2X0lOU05fUkVBRF9QQworI2RlZmluZSBSRF9YCU1JUFMxNl9JTlNOX1JFQURfR1BSX1gKKworI2RlZmluZSBXUl9ISQlJTlNOX1dSSVRFX0hJCisjZGVmaW5lIFdSX0xPCUlOU05fV1JJVEVfTE8KKyNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCisjZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTworCisjZGVmaW5lIFRSQVAJSU5TTl9UUkFQCisKKyNkZWZpbmUgSTMJSU5TTl9JU0EzCisKKyNkZWZpbmUgVDMgICAgICBJTlNOXzM5MDAKKworY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW10gPSB7Cit7Im5vcCIsCSAgICAiIiwJCTB4NjUwMCwgMHhmZmZmLCBSRF9aIH0sIC8qIG1vdmUgJDAsJFogKi8KK3sibGEiLAkgICAgIngsQSIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCit7ImFicyIsCSAgICAieCx3IiwJMCwgKGludCkgTV9BQlMsIElOU05fTUFDUk8gfSwKK3siYWRkaXUiLCAgICJ5LHgsNCIsCTB4NDAwMCwgMHhmODEwLCBXUl95fFJEX3ggfSwKK3siYWRkaXUiLCAgICJ4LGsiLAkweDQ4MDAsIDB4ZjgwMCwgV1JfeHxSRF94IH0sCit7ImFkZGl1IiwgICAiUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCit7ImFkZGl1IiwgICAiUyxTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKK3siYWRkaXUiLCAgICJ4LFAsViIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCit7ImFkZGl1IiwgICAieCxTLFYiLAkweDAwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoreyJhZGR1IiwgICAgInosdix5IiwJMHhlMDAxLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95IH0sCit7ImFkZHUiLCAgICAieSx4LDQiLAkweDQwMDAsIDB4ZjgxMCwgV1JfeXxSRF94IH0sCit7ImFkZHUiLCAgICAieCxrIiwJMHg0ODAwLCAweGY4MDAsIFdSX3h8UkRfeCB9LAoreyJhZGR1IiwgICAgIlMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoreyJhZGR1IiwgICAgIlMsUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCit7ImFkZHUiLCAgICAieCxQLFYiLAkweDA4MDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoreyJhZGR1IiwgICAgIngsUyxWIiwJMHgwMDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKK3siYW5kIiwJICAgICJ4LHkiLAkweGU4MGMsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKK3siYiIsCSAgICAicSIsCTB4MTAwMCwgMHhmODAwLCBCUn0sCit7ImJlcSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JFUSwgSU5TTl9NQUNSTyB9LAoreyJiZXEiLCAgICAgIngsVSxwIiwJMCwgKGludCkgTV9CRVFfSSwgSU5TTl9NQUNSTyB9LAoreyJiZXF6IiwgICAgIngscCIsCTB4MjAwMCwgMHhmODAwLCBCUnxSRF94IH0sCit7ImJnZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHRSwgSU5TTl9NQUNSTyB9LAoreyJiZ2UiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR0VfSSwgSU5TTl9NQUNSTyB9LAoreyJiZ2V1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CR0VVLCBJTlNOX01BQ1JPIH0sCit7ImJnZXUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHRVVfSSwgSU5TTl9NQUNSTyB9LAoreyJiZ3QiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CR1QsIElOU05fTUFDUk8gfSwKK3siYmd0IiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdUX0ksIElOU05fTUFDUk8gfSwKK3siYmd0dSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdUVSwgSU5TTl9NQUNSTyB9LAoreyJiZ3R1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR1RVX0ksIElOU05fTUFDUk8gfSwKK3siYmxlIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxFLCBJTlNOX01BQ1JPIH0sCit7ImJsZSIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMRV9JLCBJTlNOX01BQ1JPIH0sCit7ImJsZXUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMRVUsIElOU05fTUFDUk8gfSwKK3siYmxldSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxFVV9JLCBJTlNOX01BQ1JPIH0sCit7ImJsdCIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMVCwgSU5TTl9NQUNSTyB9LAoreyJibHQiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTFRfSSwgSU5TTl9NQUNSTyB9LAoreyJibHR1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CTFRVLCBJTlNOX01BQ1JPIH0sCit7ImJsdHUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMVFVfSSwgSU5TTl9NQUNSTyB9LAoreyJibmUiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTkUsIElOU05fTUFDUk8gfSwKK3siYm5lIiwgICAgICJ4LFUscCIsCTAsIChpbnQpIE1fQk5FX0ksIElOU05fTUFDUk8gfSwKK3siYm5leiIsICAgICJ4LHAiLAkweDI4MDAsIDB4ZjgwMCwgQlJ8UkRfeCB9LAoreyJicmVhayIsICAgIjYiLAkweGU4MDUsIDB4ZjgxZiwgVFJBUCB9LAoreyJidGVxeiIsICAgInAiLAkweDYwMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoreyJidG5leiIsICAgInAiLAkweDYxMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoreyJjbXBpIiwgICAgIngsVSIsCTB4NzAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKK3siY21wIiwJICAgICJ4LHkiLAkweGU4MGEsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKK3siY21wIiwgICAgICJ4LFUiLAkweDcwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCit7ImRsYSIsCSAgICAieSxFIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCit7ImRhZGRpdSIsICAieSx4LDQiLAkweDQwMTAsIDB4ZjgxMCwgV1JfeXxSRF94LCBJMyB9LAoreyJkYWRkaXUiLCAgInksaiIsCTB4ZmQwMCwgMHhmZjAwLCBXUl95fFJEX3ksIEkzIH0sCit7ImRhZGRpdSIsICAiUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoreyJkYWRkaXUiLCAgIlMsUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoreyJkYWRkaXUiLCAgInksUCxXIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCit7ImRhZGRpdSIsICAieSxTLFciLAkweGZmMDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKK3siZGFkZHUiLCAgICJ6LHYseSIsCTB4ZTAwMCwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSwgSTMgfSwKK3siZGFkZHUiLCAgICJ5LHgsNCIsCTB4NDAxMCwgMHhmODEwLCBXUl95fFJEX3gsIEkzIH0sCit7ImRhZGR1IiwgICAieSxqIiwJMHhmZDAwLCAweGZmMDAsIFdSX3l8UkRfeSwgSTMgfSwKK3siZGFkZHUiLCAgICJTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCit7ImRhZGR1IiwgICAiUyxTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCit7ImRhZGR1IiwgICAieSxQLFciLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKK3siZGFkZHUiLCAgICJ5LFMsVyIsCTB4ZmYwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoreyJkZGl2IiwgICAgIjAseCx5IiwJMHhlODFlLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKK3siZGRpdiIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRERJVl8zLCBJTlNOX01BQ1JPIH0sCit7ImRkaXZ1IiwgICAiMCx4LHkiLAkweGU4MWYsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoreyJkZGl2dSIsICAgInosdix5IiwJMCwgKGludCkgTV9ERElWVV8zLCBJTlNOX01BQ1JPIH0sCit7ImRpdiIsICAgICAiMCx4LHkiLAkweGU4MWEsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCit7ImRpdiIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVl8zLCBJTlNOX01BQ1JPIH0sCit7ImRpdnUiLCAgICAiMCx4LHkiLAkweGU4MWIsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCit7ImRpdnUiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVlVfMywgSU5TTl9NQUNSTyB9LAoreyJkbXVsIiwgICAgInosdix5IiwJMCwgKGludCkgTV9ETVVMLCBJTlNOX01BQ1JPLCBJMyB9LAoreyJkbXVsdCIsICAgIngseSIsCTB4ZTgxYywgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCit7ImRtdWx0dSIsICAieCx5IiwJMHhlODFkLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKK3siZHJlbSIsICAgICIwLHgseSIsCTB4ZTgxZSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCit7ImRyZW0iLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RSRU1fMywgSU5TTl9NQUNSTyB9LAoreyJkcmVtdSIsICAgIjAseCx5IiwJMHhlODFmLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKK3siZHJlbXUiLCAgICJ6LHYseSIsCTAsIChpbnQpIE1fRFJFTVVfMywgSU5TTl9NQUNSTyB9LAoreyJkc2xsdiIsICAgInkseCIsCTB4ZTgxNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKK3siZHNsbCIsICAgICJ4LHcsWyIsCTB4MzAwMSwgMHhmODAzLCBXUl94fFJEX3ksIEkzIH0sCit7ImRzbGwiLCAgICAieSx4IiwJMHhlODE0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoreyJkc3JhdiIsICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKK3siZHNyYSIsICAgICJ5LF0iLAkweGU4MTMsIDB4ZjgxZiwgV1JfeXxSRF95LCBJMyB9LAoreyJkc3JhIiwgICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKK3siZHNybHYiLCAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCit7ImRzcmwiLCAgICAieSxdIiwJMHhlODA4LCAweGY4MWYsIFdSX3l8UkRfeSwgSTMgfSwKK3siZHNybCIsICAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCit7ImRzdWJ1IiwgICAieix2LHkiLAkweGUwMDIsIDB4ZjgwMywgV1JfenxSRF94fFJEX3ksIEkzIH0sCit7ImRzdWJ1IiwgICAieSx4LDQiLAkwLCAoaW50KSBNX0RTVUJVX0ksIElOU05fTUFDUk8gfSwKK3siZHN1YnUiLCAgICJ5LGoiLAkwLCAoaW50KSBNX0RTVUJVX0lfMiwgSU5TTl9NQUNSTyB9LAoreyJleGl0IiwgICAgIkwiLAkweGVkMDksIDB4ZmYxZiwgVFJBUCB9LAoreyJleGl0IiwgICAgIkwiLAkweGVlMDksIDB4ZmYxZiwgVFJBUCB9LAoreyJleGl0IiwgICAgIkwiLAkweGVmMDksIDB4ZmYxZiwgVFJBUCB9LAoreyJlbnRyeSIsICAgImwiLAkweGU4MDksIDB4ZjgxZiwgVFJBUCB9LAoreyJleHRlbmQiLCAgImUiLAkweGYwMDAsIDB4ZjgwMCwgMCB9LAoreyJqYWxyIiwgICAgIngiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKK3siamFsciIsICAgICJSLHgiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKK3siamFsIiwgICAgICJ4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCit7ImphbCIsICAgICAiUix4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCit7ImphbCIsCSAgICAiYSIsCTB4MTgwMCwgMHhmYzAwLCBVQkR8V1JfMzEgfSwKK3siamFseCIsICAgICJhIiwJMHgxYzAwLCAweGZjMDAsIFVCRHxXUl8zMSB9LAoreyJqciIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoreyJqciIsCSAgICAiUiIsCTB4ZTgyMCwgMHhmZmZmLCBVQkR8UkRfMzEgfSwKK3siaiIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoreyJqIiwJICAgICJSIiwJMHhlODIwLCAweGZmZmYsIFVCRHxSRF8zMSB9LAoreyJsYiIsCSAgICAieSw1KHgpIiwJMHg4MDAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoreyJsYnUiLAkgICAgInksNSh4KSIsCTB4YTAwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKK3sibGQiLAkgICAgInksRCh4KSIsCTB4MzgwMCwgMHhmODAwLCBXUl95fFJEX3gsIEkzIH0sCit7ImxkIiwJICAgICJ5LEIiLAkweGZjMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKK3sibGQiLAkgICAgInksRChQKSIsCTB4ZmMwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoreyJsZCIsCSAgICAieSxEKFMpIiwJMHhmODAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCit7ImxoIiwJICAgICJ5LEgoeCkiLAkweDg4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCit7ImxodSIsCSAgICAieSxIKHgpIiwJMHhhODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoreyJsaSIsCSAgICAieCxVIiwJMHg2ODAwLCAweGY4MDAsIFdSX3ggfSwKK3sibHciLAkgICAgInksVyh4KSIsCTB4OTgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKK3sibHciLAkgICAgIngsQSIsCTB4YjAwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCit7Imx3IiwJICAgICJ4LFYoUCkiLAkweGIwMDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoreyJsdyIsCSAgICAieCxWKFMpIiwJMHg5MDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKK3sibHd1IiwgICAgICJ5LFcoeCkiLAkweGI4MDAsIDB4ZjgwMCwgV1JfeXxSRF94LCBJMyB9LAoreyJtZmhpIiwgICAgIngiLAkweGU4MTAsIDB4ZjhmZiwgV1JfeHxSRF9ISSB9LAoreyJtZmxvIiwgICAgIngiLAkweGU4MTIsIDB4ZjhmZiwgV1JfeHxSRF9MTyB9LAoreyJtb3ZlIiwgICAgInksWCIsCTB4NjcwMCwgMHhmZjAwLCBXUl95fFJEX1ggfSwKK3sibW92ZSIsICAgICJZLFoiLAkweDY1MDAsIDB4ZmYwMCwgV1JfWXxSRF9aIH0sCit7Im11bCIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX01VTCwgSU5TTl9NQUNSTyB9LAoreyJtdWx0IiwgICAgIngseSIsCTB4ZTgxOCwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKK3sibXVsdHUiLCAgICJ4LHkiLAkweGU4MTksIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCit7Im5lZyIsCSAgICAieCx3IiwJMHhlODBiLCAweGY4MWYsIFdSX3h8UkRfeSB9LAoreyJub3QiLAkgICAgIngsdyIsCTB4ZTgwZiwgMHhmODFmLCBXUl94fFJEX3kgfSwKK3sib3IiLAkgICAgIngseSIsCTB4ZTgwZCwgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAoreyJyZW0iLCAgICAgIjAseCx5IiwJMHhlODFhLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoreyJyZW0iLCAgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1fMywgSU5TTl9NQUNSTyB9LAoreyJyZW11IiwgICAgIjAseCx5IiwJMHhlODFiLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoreyJyZW11IiwgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1VXzMsIElOU05fTUFDUk8gfSwKK3sic2IiLAkgICAgInksNSh4KSIsCTB4YzAwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKK3sic2QiLAkgICAgInksRCh4KSIsCTB4NzgwMCwgMHhmODAwLCBSRF95fFJEX3gsIEkzIH0sCit7InNkIiwJICAgICJ5LEQoUykiLAkweGY5MDAsIDB4ZmYwMCwgUkRfeXxSRF9QQywgSTMgfSwKK3sic2QiLAkgICAgIlIsQyhTKSIsCTB4ZmEwMCwgMHhmZjAwLCBSRF8zMXxSRF9QQyB9LAoreyJzaCIsCSAgICAieSxIKHgpIiwJMHhjODAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoreyJzbGx2IiwgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoreyJzbGwiLAkgICAgIngsdyw8IiwJMHgzMDAwLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoreyJzbGwiLCAgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoreyJzbHRpIiwgICAgIngsOCIsCTB4NTAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKK3sic2x0IiwJICAgICJ4LHkiLAkweGU4MDIsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKK3sic2x0IiwgICAgICJ4LDgiLAkweDUwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCit7InNsdGl1IiwgICAieCw4IiwJMHg1ODAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoreyJzbHR1IiwgICAgIngseSIsCTB4ZTgwMywgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoreyJzbHR1IiwgICAgIngsOCIsCTB4NTgwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKK3sic3JhdiIsICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKK3sic3JhIiwJICAgICJ4LHcsPCIsCTB4MzAwMywgMHhmODAzLCBXUl94fFJEX3kgfSwKK3sic3JhIiwgICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKK3sic3JsdiIsICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKK3sic3JsIiwJICAgICJ4LHcsPCIsCTB4MzAwMiwgMHhmODAzLCBXUl94fFJEX3kgfSwKK3sic3JsIiwgICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKK3sic3VidSIsICAgICJ6LHYseSIsCTB4ZTAwMywgMHhmODAzLCBXUl96fFJEX3h8UkRfeSB9LAoreyJzdWJ1IiwgICAgInkseCw0IiwJMCwgKGludCkgTV9TVUJVX0ksIElOU05fTUFDUk8gfSwKK3sic3VidSIsICAgICJ4LGsiLAkwLCAoaW50KSBNX1NVQlVfSV8yLCBJTlNOX01BQ1JPIH0sCit7InN3IiwJICAgICJ5LFcoeCkiLAkweGQ4MDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCit7InN3IiwJICAgICJ4LFYoUykiLAkweGQwMDAsIDB4ZjgwMCwgUkRfeHxSRF9TUCB9LAoreyJzdyIsCSAgICAiUixWKFMpIiwJMHg2MjAwLCAweGZmMDAsIFJEXzMxfFJEX1NQIH0sCit7InhvciIsCSAgICAieCx5IiwJMHhlODBlLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCit9OworCitjb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlcyA9CisgICgoc2l6ZW9mIG1pcHMxNl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHMxNl9vcGNvZGVzWzBdKSkpOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctY29uZmlnLmluIGIvb3Bjb2Rlcy9tcHctY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOWJlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL21wdy1jb25maWcuaW4KQEAgLTAsMCArMSwyNyBAQAorIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBvcGNvZGVzLgorCitTZXQgdGFyZ2V0X2FyY2ggYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy0uKi0uKi8vJ2AKKworU2V0IGFyY2huYW1lIEFSQ0hfe3RhcmdldF9hcmNofQorCitJZiAie3RhcmdldF9hcmNofSIgPX4gL202OGsvCisJU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ibTY4ay1kaXMuYy5vICJ7b30ibTY4ay1vcGMuYy5vJworRWxzZSBJZiAie3RhcmdldF9hcmNofSIgPX4gL3Bvd2VycGMvCisJU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30icHBjLWRpcy5jLm8gIntvfSJwcGMtb3BjLmMubycKK0Vsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9pMzg2LworCVNldCBCRkRfTUFDSElORVMgICcie299ImkzODYtZGlzLmMubycKK0Vsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9taXBzLworCVNldCBCRkRfTUFDSElORVMgICcie299Im1pcHMtZGlzLmMubyAie299Im1pcHMtb3BjLmMubycKK0Vsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9zaC8KKwlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJzaC1kaXMuYy5vJworRW5kIElmCisKK0VjaG8gJyMgU3RhcnQgZnJvbSBtcHctY29uZmlnLmluJwkJCSA+ICJ7b30ibWsudG1wCitFY2hvICJCRkRfTUFDSElORVMgPSAiIHtCRkRfTUFDSElORVN9CQkJPj4gIntvfSJtay50bXAKK0VjaG8gIkFSQ0hERUZTID0gLWQiIHthcmNobmFtZX0JCQkJPj4gIntvfSJtay50bXAKK0VjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKKworRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKK0VjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkgCQkJPj4gIntvfSJjb25maWcubmV3CisKK01vdmVJZkNoYW5nZSAie299ImNvbmZpZy5uZXcgIntvfSJjb25maWcuaApkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctbWFrZS5zZWQgYi9vcGNvZGVzL21wdy1tYWtlLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTYwNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKQEAgLTAsMCArMSwyNSBAQAorIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBvcGNvZGVzIE1ha2VmaWxlLmluIGludG8gTVBXIHN5bnRheC4KKworIyBFbXB0eSBIREVGSU5FUy4KKy9IREVGSU5FUy9zL0BIREVGSU5FU0AvLworCisjIEZpeCBwYXRobmFtZXMgdG8gaW5jbHVkZSBkaXJlY3Rvcmllcy4KKy9eSU5DRElSID0gL3MvXklOQ0RJUiA9IC4qJC9JTkNESVIgPSAie3RvcHNyY2Rpcn0iaW5jbHVkZS8KKy9eQ1NFQVJDSCA9IC9zLyQvIC1pICJ7SU5DRElSfSI6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LworCisvQkZEX01BQ0hJTkVTL3MvQEJGRF9NQUNISU5FU0Ave0JGRF9NQUNISU5FU30vCisvYXJjaGRlZnMvcy9AYXJjaGRlZnNAL3tBUkNIREVGU30vCisKKyMgTm8gUElDIGZvb2xlcnkgaW4gdGhpcyBlbnZpcm9ubWVudC4KKy9AQUxMTElCU0Avcy9AQUxMTElCU0Ave1RBUkdFVExJQn0vCisvQFBJQ0xJU1RAL3MvQFBJQ0xJU1RALy8KKy9AUElDRkxBR0Avcy9AUElDRkxBR0AvLworL157T0ZJTEVTfSBcXE9wdGlvbi1mIHN0YW1wLXBpY2Rpci8sL14kL2QKKworIyBSZW1vdmUgdGhlIHBpYyB0cmlja2VyeSBmcm9tIHRoZSBkZWZhdWx0IGJ1aWxkIHJ1bGUuCisvXlwuY1wubyBcXE9wdGlvbi1mIC8sL0VuZCBJZi9jXAorLmMubyBcXE9wdGlvbi1mIC5jCisKKyMgUmVtb3ZlIHBpYyB0cmlja2VyeSBmcm9tIG90aGVyIHJ1bGVzIC0gYWltZWQgYXQgdGhlIHJ1bGUKKyMgZm9yIGRpc2Fzc2VtYmxlLm8gaW4gcGFydGljdWxhci4KKy8tbiAie1BJQ0ZMQUd9Ii8sL0VuZCBJZi9kCmRpZmYgLS1naXQgYS9vcGNvZGVzL25zMzJrLWRpcy5jIGIvb3Bjb2Rlcy9uczMyay1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTAyNjZiCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9uczMyay1kaXMuYwpAQCAtMCwwICsxLDg5NCBAQAorLyogUHJpbnQgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMCBpbnN0cnVjdGlvbnMuCisgICBDb3B5cmlnaHQgKGMpIDE5ODYsIDg4LCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Bjb2RlcyBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaWYgIWRlZmluZWQoY29uc3QpICYmICFkZWZpbmVkKF9fU1REQ19fKQorI2RlZmluZSBjb25zdAorI2VuZGlmCisjaW5jbHVkZSAib3Bjb2RlL25zMzJrLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKK3N0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICpkaXNfaW5mbzsKKworLyoKKyAqIEhhY2tzIHRvIGdldCBpdCB0byBjb21waWxlIDw9IFJFQUQgVEhFU0UgQVMgRklYRVMgTkVFREVECisgKi8KKyNkZWZpbmUgSU5WQUxJRF9GTE9BVCh2YWwsIHNpemUpIGludmFsaWRfZmxvYXQoKGNoYXIgKil2YWwsIHNpemUpCisKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmcKKyAgUEFSQU1TICgoaW50LCBpbnQsIGludCAqLCBjaGFyICosIGJmZF92bWEsIGNoYXIgKiwgaW50KSk7CitzdGF0aWMgaW50IGdldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoY2hhciAqLCBpbnQgKikpOworc3RhdGljIGludCBpbnZhbGlkX2Zsb2F0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBsb25nIHJlYWRfbWVtb3J5X2ludGVnZXIoYWRkciwgbnIpCisgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7CisgICAgIGludCBucjsKK3sKKyAgbG9uZyB2YWw7CisgIGludCBpOworICBmb3IgKHZhbCA9IDAsIGkgPSBuciAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgdmFsID0gICh2YWwgPDwgOCk7CisgICAgdmFsIHw9ICgweGZmICYgKihhZGRyICsgaSkpOworICB9CisgIHJldHVybiB2YWw7Cit9CisKKy8qIDMyMDAwIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcy4gICovCisjZGVmaW5lIE1BWExFTiA2MgorCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworc3RydWN0IHByaXZhdGUKK3sKKyAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLworICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7CisgIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKKyAgYmZkX3ZtYSBpbnNuX3N0YXJ0OworICBqbXBfYnVmIGJhaWxvdXQ7Cit9OworCisKKy8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKKyAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcworICAgb24gZXJyb3IuICAqLworI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKKyAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCisgICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCisKK3N0YXRpYyBpbnQKK2ZldGNoX2RhdGEgKGluZm8sIGFkZHIpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBiZmRfYnl0ZSAqYWRkcjsKK3sKKyAgaW50IHN0YXR1czsKKyAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7CisgIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCisJCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCisJCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAorCQkJCSAgICAgIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOworICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7CisgICAgfQorICBlbHNlCisgICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOworICByZXR1cm4gMTsKK30KKy8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KKyNkZWZpbmUgTk9QQ09ERVMgKHNpemVvZiBuczMya19vcGNvZGVzIC8gc2l6ZW9mIG5zMzJrX29wY29kZXNbMF0pCisKKyNkZWZpbmUgTkVYVF9JU19BRERSCSd8JworCisMCitzdHJ1Y3QgbnMzMmtfb3B0aW9uIHsKKyAgY2hhciAqcGF0dGVybjsJCS8qIHRoZSBvcHRpb24gaXRzZWxmICovCisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CQkvKiBiaW5hcnkgdmFsdWUgb2YgdGhlIG9wdGlvbiAqLworICB1bnNpZ25lZCBsb25nIG1hdGNoOwkJLyogdGhlc2UgYml0cyBtdXN0IG1hdGNoICovCit9OworCisMCitzdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfdVtdPSAvKiByZXN0b3JlLCBleGl0ICovCit7CisgIHsgInIwIiwJMHg4MCwJMHg4MAl9LAorICB7ICJyMSIsCTB4NDAsCTB4NDAJfSwKKyAgeyAicjIiLAkweDIwLAkweDIwCX0sCisgIHsgInIzIiwJMHgxMCwJMHgxMAl9LAorICB7ICJyNCIsCTB4MDgsCTB4MDgJfSwKKyAgeyAicjUiLAkweDA0LAkweDA0CX0sCisgIHsgInI2IiwJMHgwMiwJMHgwMgl9LAorICB7ICJyNyIsCTB4MDEsCTB4MDEJfSwKKyAgeyAgMCAsCTB4MDAsCTB4MDAJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X1VbXT0gLyogc2F2ZSwgZW50ZXIgKi8KK3sKKyAgeyAicjAiLAkweDAxLAkweDAxCX0sCisgIHsgInIxIiwJMHgwMiwJMHgwMgl9LAorICB7ICJyMiIsCTB4MDQsCTB4MDQJfSwKKyAgeyAicjMiLAkweDA4LAkweDA4CX0sCisgIHsgInI0IiwJMHgxMCwJMHgxMAl9LAorICB7ICJyNSIsCTB4MjAsCTB4MjAJfSwKKyAgeyAicjYiLAkweDQwLAkweDQwCX0sCisgIHsgInI3IiwJMHg4MCwJMHg4MAl9LAorICB7ICAwICwJMHgwMCwJMHgwMAl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfT1tdPSAvKiBzZXRjZmcgKi8KK3sKKyAgeyAiYyIsCTB4OCwJMHg4CX0sCisgIHsgIm0iLAkweDQsCTB4NAl9LAorICB7ICJmIiwJMHgyLAkweDIJfSwKKyAgeyAiaSIsCTB4MSwJMHgxCX0sCisgIHsgIDAgLAkweDAsCTB4MAl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfQ1tdPSAvKiBjaW52ICovCit7CisgIHsgImEiLAkweDQsCTB4NAl9LAorICB7ICJpIiwJMHgyLAkweDIJfSwKKyAgeyAiZCIsCTB4MSwJMHgxCX0sCisgIHsgIDAgLAkweDAsCTB4MAl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfU1tdPSAvKiBzdHJpbmcgaW5zdCAqLworeworICB7ICJiIiwJMHgxLAkweDEJfSwKKyAgeyAidSIsCTB4NiwJMHg2CX0sCisgIHsgInciLAkweDIsCTB4Mgl9LAorICB7ICAwICwJMHgwLAkweDAJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9QNTMyW109IC8qIGxwciBzcHIgKi8KK3sKKyAgeyAidXMiLAkweDAsCTB4Zgl9LAorICB7ICJkY3IiLAkweDEsCTB4Zgl9LAorICB7ICJicGMiLAkweDIsCTB4Zgl9LAorICB7ICJkc3IiLAkweDMsCTB4Zgl9LAorICB7ICJjYXIiLAkweDQsCTB4Zgl9LAorICB7ICJmcCIsCTB4OCwJMHhmCX0sCisgIHsgInNwIiwJMHg5LAkweGYJfSwKKyAgeyAic2IiLAkweGEsCTB4Zgl9LAorICB7ICJ1c3AiLAkweGIsCTB4Zgl9LAorICB7ICJjZmciLAkweGMsCTB4Zgl9LAorICB7ICJwc3IiLAkweGQsCTB4Zgl9LAorICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKKyAgeyAibW9kIiwJMHhmLAkweGYJfSwKKyAgeyAgMCAsCTB4MDAsCTB4Zgl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X001MzJbXT0gLyogbG1yIHNtciAqLworeworICB7ICJtY3IiLAkweDksCTB4Zgl9LAorICB7ICJtc3IiLAkweGEsCTB4Zgl9LAorICB7ICJ0ZWFyIiwJMHhiLAkweGYJfSwKKyAgeyAicHRiMCIsCTB4YywJMHhmCX0sCisgIHsgInB0YjEiLAkweGQsCTB4Zgl9LAorICB7ICJpdmFyMCIsCTB4ZSwJMHhmCX0sCisgIHsgIml2YXIxIiwJMHhmLAkweGYJfSwKKyAgeyAgMCAsCTB4MCwJMHhmCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfUDAzMltdPSAvKiBscHIgc3ByICovCit7CisgIHsgInVwc3IiLAkweDAsCTB4Zgl9LAorICB7ICJmcCIsCTB4OCwJMHhmCX0sCisgIHsgInNwIiwJMHg5LAkweGYJfSwKKyAgeyAic2IiLAkweGEsCTB4Zgl9LAorICB7ICJwc3IiLAkweGIsCTB4Zgl9LAorICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKKyAgeyAibW9kIiwJMHhmLAkweGYJfSwKKyAgeyAgMCAsCTB4MCwJMHhmCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfTTAzMltdPSAvKiBsbXIgc21yICovCit7CisgIHsgImJwcjAiLAkweDAsCTB4Zgl9LAorICB7ICJicHIxIiwJMHgxLAkweGYJfSwKKyAgeyAicGYwIiwJMHg0LAkweGYJfSwKKyAgeyAicGYxIiwJMHg1LAkweGYJfSwKKyAgeyAic2MiLAkweDgsCTB4Zgl9LAorICB7ICJtc3IiLAkweGEsCTB4Zgl9LAorICB7ICJiY250IiwJMHhiLAkweGYJfSwKKyAgeyAicHRiMCIsCTB4YywJMHhmCX0sCisgIHsgInB0YjEiLAkweGQsCTB4Zgl9LAorICB7ICJlaWEiLAkweGYsCTB4Zgl9LAorICB7ICAwICwJMHgwLAkweGYJfQorfTsKKworCisvKgorICogZmlndXJlIG91dCB3aGljaCBvcHRpb25zIGFyZSBwcmVzZW50CisgKi8KK3N0YXRpYyB2b2lkCitvcHRsaXN0KG9wdGlvbnMsIG9wdGlvblAsIHJlc3VsdCkKKyAgICAgaW50IG9wdGlvbnM7CisgICAgIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CisgICAgIGNoYXIgKnJlc3VsdDsKK3sKKyAgICBpZiAob3B0aW9ucyA9PSAwKSB7CisJc3ByaW50ZihyZXN1bHQsICJbXSIpOworCXJldHVybjsKKyAgICB9CisgICAgc3ByaW50ZihyZXN1bHQsICJbIik7CisKKyAgICBmb3IgKDsgKG9wdGlvbnMgIT0gMCkgJiYgb3B0aW9uUC0+cGF0dGVybjsgb3B0aW9uUCsrKSB7CisJaWYgKChvcHRpb25zICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7CisJICAgIC8qIHdlIGZvdW5kIGEgbWF0Y2gsIHVwZGF0ZSByZXN1bHQgYW5kIG9wdGlvbnMgKi8KKwkgICAgc3RyY2F0KHJlc3VsdCwgb3B0aW9uUC0+cGF0dGVybik7CisJICAgIG9wdGlvbnMgJj0gfm9wdGlvblAtPnZhbHVlOworCSAgICBpZiAob3B0aW9ucyAhPSAwKQkvKiBtb3JlIG9wdGlvbnMgdG8gY29tZSAqLworCQlzdHJjYXQocmVzdWx0LCAiLCIpOworCX0KKyAgICB9CisgICAgaWYgKG9wdGlvbnMgIT0gMCkKKwlzdHJjYXQocmVzdWx0LCAidW5kZWZpbmVkIik7CisKKyAgICBzdHJjYXQocmVzdWx0LCAiXSIpOworfQorCitzdGF0aWMgdm9pZAorbGlzdF9zZWFyY2ggKHJlZ192YWx1ZSwgb3B0aW9uUCwgcmVzdWx0KQorICAgICBpbnQgcmVnX3ZhbHVlOworICAgICBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOworICAgICBjaGFyICpyZXN1bHQ7Cit7CisgICAgZm9yICg7IG9wdGlvblAtPnBhdHRlcm47IG9wdGlvblArKykgeworCWlmICgocmVnX3ZhbHVlICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7CisJICAgIHNwcmludGYocmVzdWx0LCAiJXMiLCBvcHRpb25QLT5wYXR0ZXJuKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisgICAgc3ByaW50ZihyZXN1bHQsICJ1bmRlZmluZWQiKTsKK30KKwwKKy8qCisgKiBleHRyYWN0ICJjb3VudCIgYml0cyBzdGFydGluZyAib2Zmc2V0IiBiaXRzCisgKiBpbnRvIGJ1ZmZlcgorICovCisKK3N0YXRpYyBpbnQKK2JpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgY291bnQpCisgICAgIGJmZF9ieXRlICpidWZmZXI7CisgICAgIGludCBvZmZzZXQ7CisgICAgIGludCBjb3VudDsKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IGJpdDsKKworICBidWZmZXIgKz0gb2Zmc2V0ID4+IDM7CisgIG9mZnNldCAmPSA3OworICBiaXQgPSAxOworICByZXN1bHQgPSAwOworICB3aGlsZSAoY291bnQtLSkKKyAgICB7CisgICAgICBGRVRDSF9EQVRBKGRpc19pbmZvLCBidWZmZXIgKyAxKTsKKyAgICAgIGlmICgoKmJ1ZmZlciAmICgxIDw8IG9mZnNldCkpKQorCXJlc3VsdCB8PSBiaXQ7CisgICAgICBpZiAoKytvZmZzZXQgPT0gOCkKKwl7CisJICBvZmZzZXQgPSAwOworCSAgYnVmZmVyKys7CisJfQorICAgICAgYml0IDw8PSAxOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogTGlrZSBiaXQgZXh0cmFjdCBidXQgdGhlIGJ1ZmZlciBpcyB2YWxpZCBhbmQgZG9lbid0IG5lZWQgdG8gYmUKKyAqIGZldGNoZWQKKyAqLworc3RhdGljIGludAorYml0X2V4dHJhY3Rfc2ltcGxlIChidWZmZXIsIG9mZnNldCwgY291bnQpCisgICAgIGJmZF9ieXRlICpidWZmZXI7CisgICAgIGludCBvZmZzZXQ7CisgICAgIGludCBjb3VudDsKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IG1hc2s7CisgIGludCBiaXQ7CisKKyAgYnVmZmVyICs9IG9mZnNldCA+PiAzOworICBvZmZzZXQgJj0gNzsKKyAgYml0ID0gMTsKKyAgcmVzdWx0ID0gMDsKKyAgd2hpbGUgKGNvdW50LS0pCisgICAgeworICAgICAgaWYgKCgqYnVmZmVyICYgKDEgPDwgb2Zmc2V0KSkpCisJcmVzdWx0IHw9IGJpdDsKKyAgICAgIGlmICgrK29mZnNldCA9PSA4KQorCXsKKwkgIG9mZnNldCA9IDA7CisJICBidWZmZXIrKzsKKwl9CisgICAgICBiaXQgPDw9IDE7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorYml0X2NvcHkgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwgdG8pCisgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgaW50IGNvdW50OworICAgICBjaGFyICp0bzsKK3sKKyAgZm9yKDsgY291bnQgPiA4OyBjb3VudCAtPSA4LCB0bysrLCBvZmZzZXQgKz0gOCkKKyAgICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIDgpOworICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKK30KKworCitzdGF0aWMgaW50CitzaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCisgICAgIGludCB2YWx1ZSwgYml0czsKK3sKKyAgdmFsdWUgPSB2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpOworICByZXR1cm4gKHZhbHVlICYgKDEgPDwgKGJpdHMtMSkpCisJICA/IHZhbHVlIHwgKH4oKDEgPDwgYml0cykgLSAxKSkKKwkgIDogdmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorZmxpcF9ieXRlcyAocHRyLCBjb3VudCkKKyAgICAgY2hhciAqcHRyOworICAgICBpbnQgY291bnQ7Cit7CisgIGNoYXIgdG1wOworCisgIHdoaWxlIChjb3VudCA+IDApCisgICAgeworICAgICAgdG1wID0gcHRyWzBdOworICAgICAgcHRyWzBdID0gcHRyW2NvdW50LTFdOworICAgICAgcHRyW2NvdW50LTFdID0gdG1wOworICAgICAgcHRyKys7CisgICAgICBjb3VudCAtPSAyOworICAgIH0KK30KKwwKKy8qIEdpdmVuIGEgY2hhcmFjdGVyIEMsIGRvZXMgaXQgcmVwcmVzZW50IGEgZ2VuZXJhbCBhZGRyZXNzaW5nIG1vZGU/ICAqLworI2RlZmluZSBJc19nZW4oYykgXAorICAoKGMpID09ICdGJyB8fCAoYykgPT0gJ0wnIHx8IChjKSA9PSAnQicgXAorICAgfHwgKGMpID09ICdXJyB8fCAoYykgPT0gJ0QnIHx8IChjKSA9PSAnQScgfHwgKGMpID09ICdJJyB8fCAoYykgPT0gJ1onKQorCisvKiBBZHJlc3NpbmcgbW9kZXMuICAqLworI2RlZmluZSBBZHJtb2RfaW5kZXhfYnl0ZSAweDFjCisjZGVmaW5lIEFkcm1vZF9pbmRleF93b3JkIDB4MWQKKyNkZWZpbmUgQWRybW9kX2luZGV4X2RvdWJsZXdvcmQgMHgxZQorI2RlZmluZSBBZHJtb2RfaW5kZXhfcXVhZHdvcmQgMHgxZgorCisvKiBJcyBNT0RFIGFuIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlPyAgKi8KKyNkZWZpbmUgQWRybW9kX2lzX2luZGV4KG1vZGUpIFwKKyAgKG1vZGUgPT0gQWRybW9kX2luZGV4X2J5dGUgXAorICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfd29yZCBcCisgICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF9kb3VibGV3b3JkIFwKKyAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X3F1YWR3b3JkKQorCisMCisvKiBQcmludCB0aGUgMzIwMDAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKKyAgIG9uIFNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLworCitpbnQKK3ByaW50X2luc25fbnMzMmsgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKmQ7CisgIHVuc2lnbmVkIHNob3J0IGZpcnN0X3dvcmQ7CisgIGludCBpb2Zmc2V0OwkJLyogYml0cyBpbnRvIGluc3RydWN0aW9uICovCisgIGludCBhb2Zmc2V0OwkJLyogYml0cyBpbnRvIGFyZ3VtZW50cyAqLworICBjaGFyIGFyZ19idWZzW01BWF9BUkdTKzFdW0FSR19MRU5dOworICBpbnQgYXJnbnVtOworICBpbnQgbWF4YXJnOworICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OworICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOworICBkaXNfaW5mbyA9IGluZm87CisKKyAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7CisgIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7CisgIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7CisgIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKKyAgICAvKiBFcnJvciByZXR1cm4uICAqLworICAgIHJldHVybiAtMTsKKworICAvKiBMb29rIGZvciA4Yml0IG9wY29kZXMgZmlyc3QuIE90aGVyIHdpc2UsIGZldGNoaW5nIHR3byBieXRlcyBjb3VsZCB0YWtlCisgICAqIHVzIG92ZXIgdGhlIGVuZCBvZiBhY2Nlc3NpYmxlIGRhdGEgdW5uZWNlc3NhcmlsbHkKKyAgICovCisgIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMSk7CisgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQorICAgIGlmIChuczMya19vcGNvZGVzW2ldLm9wY29kZV9pZF9zaXplIDw9IDgKKwkmJiAoKGJ1ZmZlclswXQorCSAgICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCisJICAgID09IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NlZWQpKQorICAgICAgYnJlYWs7CisgIGlmIChpID09IE5PUENPREVTKSB7CisgICAgLyogTWF5YmUgaXQgaXMgOSB0byAxNiBiaXRzIGJpZyAqLworICAgIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMik7CisgICAgZmlyc3Rfd29yZCA9IHJlYWRfbWVtb3J5X2ludGVnZXIoYnVmZmVyLCAyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQorICAgICAgaWYgKChmaXJzdF93b3JkCisJICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCisJICA9PSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zZWVkKQorCWJyZWFrOworCisgICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLworICAgIGlmIChpID09IE5PUENPREVTKQorICAgICAgeworCSgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIjAlbyIsIGJ1ZmZlclswXSk7CisJcmV0dXJuIDE7CisgICAgICB9CisgIH0KKworICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlcyIsIG5zMzJrX29wY29kZXNbaV0ubmFtZSk7CisKKyAgaW9mZnNldCA9IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NpemU7CisgIGFvZmZzZXQgPSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zaXplOworICBkID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGVyYW5kczsKKworICBpZiAoKmQpCisgICAgeworICAgICAgLyogT2Zmc2V0IGluIGJpdHMgb2YgdGhlIGZpcnN0IHRoaW5nIGJleW9uZCBlYWNoIGluZGV4IGJ5dGUuCisJIEVsZW1lbnQgMCBpcyBmb3Igb3BlcmFuZCBBIGFuZCBlbGVtZW50IDEgaXMgZm9yIG9wZXJhbmQgQi4KKwkgVGhlIHJlc3QgYXJlIGlycmVsZXZhbnQsIGJ1dCB3ZSBwdXQgdGhlbSBoZXJlIHNvIHdlIGRvbid0CisJIGluZGV4IG91dHNpZGUgdGhlIGFycmF5LiAgKi8KKyAgICAgIGludCBpbmRleF9vZmZzZXRbTUFYX0FSR1NdOworCisgICAgICAvKiAwIGZvciBvcGVyYW5kIEEsIDEgZm9yIG9wZXJhbmQgQiwgZ3JlYXRlciBmb3Igb3RoZXIgYXJncy4gICovCisgICAgICBpbnQgd2hpY2hhcmcgPSAwOworICAgICAgCisgICAgICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICJcdCIpOworCisgICAgICBtYXhhcmcgPSAwOworCisgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IGJ5dGVzLAorCSBpZiB3ZSBhcmUgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlLCBzaW5jZSB0aGUgaW5kZXgKKwkgYnl0ZXMgb2NjdXIgcmlnaHQgYWZ0ZXIgdGhlIGJhc2ljIGluc3RydWN0aW9uLCBub3QgYXMgcGFydAorCSBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICAqLworICAgICAgaWYgKElzX2dlbihkWzFdKSkKKwl7CisJICBpbnQgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldCAtIDUsIDUpOworCisJICBpZiAoQWRybW9kX2lzX2luZGV4IChhZGRyX21vZGUpKQorCSAgICB7CisJICAgICAgYW9mZnNldCArPSA4OworCSAgICAgIGluZGV4X29mZnNldFswXSA9IGFvZmZzZXQ7CisJICAgIH0KKwl9CisgICAgICBpZiAoZFsyXSAmJiBJc19nZW4oZFszXSkpCisJeworCSAgaW50IGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQgLSAxMCwgNSk7CisKKwkgIGlmIChBZHJtb2RfaXNfaW5kZXggKGFkZHJfbW9kZSkpCisJICAgIHsKKwkgICAgICBhb2Zmc2V0ICs9IDg7CisJICAgICAgaW5kZXhfb2Zmc2V0WzFdID0gYW9mZnNldDsKKwkgICAgfQorCX0KKworICAgICAgd2hpbGUgKCpkKQorCXsKKwkgIGFyZ251bSA9ICpkIC0gJzEnOworCSAgZCsrOworCSAgaWYgKGFyZ251bSA+IG1heGFyZyAmJiBhcmdudW0gPCBNQVhfQVJHUykKKwkgICAgbWF4YXJnID0gYXJnbnVtOworCSAgaW9mZnNldCA9IHByaW50X2luc25fYXJnICgqZCwgaW9mZnNldCwgJmFvZmZzZXQsIGJ1ZmZlciwKKwkJCQkgICAgbWVtYWRkciwgYXJnX2J1ZnNbYXJnbnVtXSwKKwkJCQkgICAgaW5kZXhfb2Zmc2V0W3doaWNoYXJnXSk7CisJICBkKys7CisJICB3aGljaGFyZysrOworCX0KKyAgICAgIGZvciAoYXJnbnVtID0gMDsgYXJnbnVtIDw9IG1heGFyZzsgYXJnbnVtKyspCisJeworCSAgYmZkX3ZtYSBhZGRyOworCSAgY2hhciAqY2g7CisJICBmb3IgKGNoID0gYXJnX2J1ZnNbYXJnbnVtXTsgKmNoOykKKwkgICAgeworCSAgICAgIGlmICgqY2ggPT0gTkVYVF9JU19BRERSKQorCQl7CisJCSAgKytjaDsKKwkJICBhZGRyID0gYmZkX3NjYW5fdm1hIChjaCwgTlVMTCwgMTYpOworCQkgICgqZGlzX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIsIGRpc19pbmZvKTsKKwkJICB3aGlsZSAoKmNoICYmICpjaCAhPSBORVhUX0lTX0FERFIpCisJCSAgICArK2NoOworCQkgIGlmICgqY2gpCisJCSAgICArK2NoOworCQl9CisJICAgICAgZWxzZQorCQkoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlYyIsICpjaCsrKTsKKwkgICAgfQorCSAgaWYgKGFyZ251bSA8IG1heGFyZykKKwkgICAgKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiLCAiKTsKKwl9CisgICAgfQorICByZXR1cm4gYW9mZnNldCAvIDg7Cit9CisKKy8qIFByaW50IGFuIGluc3RydWN0aW9uIG9wZXJhbmQgb2YgY2F0ZWdvcnkgZ2l2ZW4gYnkgZC4gIElPRkZTRVQgaXMKKyAgIHRoZSBiaXQgcG9zaXRpb24gYmVsb3cgd2hpY2ggc21hbGwgKDwxIGJ5dGUpIHBhcnRzIG9mIHRoZSBvcGVyYW5kIGNhbgorICAgYmUgZm91bmQgKHVzdWFsbHkgaW4gdGhlIGJhc2ljIGluc3RydWN0aW9uLCBidXQgZm9yIGluZGV4ZWQKKyAgIGFkZHJlc3NpbmcgaXQgY2FuIGJlIGluIHRoZSBpbmRleCBieXRlKS4gIEFPRkZTRVRQIGlzIGEgcG9pbnRlciB0byB0aGUKKyAgIGJpdCBwb3NpdGlvbiBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICBCVUZGRVIgY29udGFpbnMgdGhlCisgICBpbnN0cnVjdGlvbi4gIEFERFIgaXMgd2hlcmUgQlVGRkVSIHdhcyByZWFkIGZyb20uICBQdXQgdGhlIGRpc2Fzc2VtYmxlZAorICAgdmVyc2lvbiBvZiB0aGUgb3BlcmFuZCBpbiBSRVNVTFQuICBJTkRFWF9PRkZTRVQgaXMgdGhlIGJpdCBwb3NpdGlvbgorICAgb2YgdGhlIGluZGV4IGJ5dGUgKGl0IGNvbnRhaW5zIGdhcmJhZ2UgaWYgdGhpcyBvcGVyYW5kIGlzIG5vdCBhCisgICBnZW5lcmFsIG9wZXJhbmQgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlKS4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fYXJnIChkLCBpb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLCByZXN1bHQsIGluZGV4X29mZnNldCkKKyAgICAgaW50IGQ7CisgICAgIGludCBpb2Zmc2V0LCAqYW9mZnNldHA7CisgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBjaGFyICpyZXN1bHQ7CisgICAgIGludCBpbmRleF9vZmZzZXQ7Cit7CisgIGludCBhZGRyX21vZGU7CisgIGZsb2F0IEZ2YWx1ZTsKKyAgZG91YmxlIEx2YWx1ZTsKKyAgaW50IEl2YWx1ZTsKKyAgaW50IGRpc3AxLCBkaXNwMjsKKyAgaW50IGluZGV4OworICBpbnQgc2l6ZTsKKworICBzd2l0Y2ggKGQpCisgICAgeworICAgIGNhc2UgJ2YnOgorICAgICAgLyogYSAiZ2VuIiBvcGVyYW5kIGJ1dCA1IGJpdHMgZnJvbSB0aGUgZW5kIG9mIGluc3RydWN0aW9uICovCisgICAgICBpb2Zmc2V0IC09IDU7CisgICAgY2FzZSAnWic6CisgICAgY2FzZSAnRic6CisgICAgY2FzZSAnTCc6CisgICAgY2FzZSAnSSc6CisgICAgY2FzZSAnQic6CisgICAgY2FzZSAnVyc6CisgICAgY2FzZSAnRCc6CisgICAgY2FzZSAnQSc6CisgICAgICBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTUsIDUpOworICAgICAgaW9mZnNldCAtPSA1OworICAgICAgc3dpdGNoIChhZGRyX21vZGUpCisJeworCWNhc2UgMHgwOiBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgorCWNhc2UgMHg0OiBjYXNlIDB4NTogY2FzZSAweDY6IGNhc2UgMHg3OgorCSAgLyogcmVnaXN0ZXIgbW9kZSBSMCAtLSBSNyAqLworCSAgc3dpdGNoIChkKQorCSAgICB7CisJICAgIGNhc2UgJ0YnOgorCSAgICBjYXNlICdMJzoKKwkgICAgY2FzZSAnWic6CisJICAgICAgc3ByaW50ZiAocmVzdWx0LCAiZiVkIiwgYWRkcl9tb2RlKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBzcHJpbnRmIChyZXN1bHQsICJyJWQiLCBhZGRyX21vZGUpOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDB4ODogY2FzZSAweDk6IGNhc2UgMHhhOiBjYXNlIDB4YjoKKwljYXNlIDB4YzogY2FzZSAweGQ6IGNhc2UgMHhlOiBjYXNlIDB4ZjoKKwkgIC8qIFJlZ2lzdGVyIHJlbGF0aXZlIGRpc3AoUjAgLS0gUjcpICovCisJICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOworCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQociVkKSIsIGRpc3AxLCBhZGRyX21vZGUgJiA3KTsKKwkgIGJyZWFrOworCWNhc2UgMHgxMDoKKwljYXNlIDB4MTE6CisJY2FzZSAweDEyOgorCSAgLyogTWVtb3J5IHJlbGF0aXZlIGRpc3AyKGRpc3AxKEZQLCBTUCwgU0IpKSAqLworCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgIGRpc3AyID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7CisJICBzcHJpbnRmIChyZXN1bHQsICIlZCglZCglcykpIiwgZGlzcDIsIGRpc3AxLAorCQkgICBhZGRyX21vZGU9PTB4MTA/ImZwIjphZGRyX21vZGU9PTB4MTE/InNwIjoic2IiKTsKKwkgIGJyZWFrOworCWNhc2UgMHgxMzoKKwkgIC8qIHJlc2VydmVkICovCisJICBzcHJpbnRmIChyZXN1bHQsICJyZXNlcnZlZCIpOworCSAgYnJlYWs7CisJY2FzZSAweDE0OgorCSAgLyogSW1tZWRpYXRlICovCisJICBzd2l0Y2ggKGQpCisJICAgIHsKKwkgICAgY2FzZSAnSSc6IGNhc2UgJ1onOiBjYXNlICdBJzoKKwkgICAgICAvKiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQorCSAgICAgICAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgorCSAgICAgICAqIGFuIGltbWVkaWF0ZSBlaXRoZXIuIFdlIGRvbid0IGtub3cgaG93IG11Y2ggdG8gaW5jcmVhc2UKKwkgICAgICAgKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KKwkgICAgICAgKiBhbnl3YXkhCisJICAgICAgICovCisJICAgICAgc3ByaW50ZiAocmVzdWx0LCBfKCIkPHVuZGVmaW5lZD4iKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ0InOgorCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7CisJICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgOCk7CisJICAgICAgKmFvZmZzZXRwICs9IDg7CisJICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnVyc6CisJICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7CisJICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZSwgMik7CisJICAgICAgKmFvZmZzZXRwICs9IDE2OworCSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDE2KTsKKwkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdEJzoKKwkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDMyKTsKKwkgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKKwkgICAgICAqYW9mZnNldHAgKz0gMzI7CisJICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnRic6CisJICAgICAgYml0X2NvcHkgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMiwgKGNoYXIgKikgJkZ2YWx1ZSk7CisJICAgICAgZmxpcF9ieXRlcyAoJkZ2YWx1ZSwgNCk7CisJICAgICAgKmFvZmZzZXRwICs9IDMyOworCSAgICAgIGlmIChJTlZBTElEX0ZMT0FUICgmRnZhbHVlLCA0KSkKKwkJc3ByaW50ZiAocmVzdWx0LCAiPDxpbnZhbGlkIGZsb2F0IDB4JS44eD4+IiwgKihpbnQgKikgJkZ2YWx1ZSk7CisJICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLworCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBGdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdMJzoKKwkgICAgICBiaXRfY29weSAoYnVmZmVyLCAqYW9mZnNldHAsIDY0LCAoY2hhciAqKSAmTHZhbHVlKTsKKwkgICAgICBmbGlwX2J5dGVzICgmTHZhbHVlLCA4KTsKKwkgICAgICAqYW9mZnNldHAgKz0gNjQ7CisJICAgICAgaWYgKElOVkFMSURfRkxPQVQgKCZMdmFsdWUsIDgpKQorCQlzcHJpbnRmIChyZXN1bHQsICI8PGludmFsaWQgbG9uZyAweCUuOHglLjh4Pj4iLAorCQkJICooKChpbnQgKikgJkx2YWx1ZSkgKyAxKSwgKihpbnQgKikgJkx2YWx1ZSk7CisJICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLworCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBMdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDB4MTU6CisJICAvKiBBYnNvbHV0ZSBAZGlzcCAqLworCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgIHNwcmludGYgKHJlc3VsdCwgIkB8JWR8IiwgZGlzcDEpOworCSAgYnJlYWs7CisJY2FzZSAweDE2OgorCSAgLyogRXh0ZXJuYWwgRVhUKGRpc3AxKSArIGRpc3AyIChNb2QgdGFibGUgc3R1ZmYpICovCisJICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOworCSAgZGlzcDIgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgIHNwcmludGYgKHJlc3VsdCwgIkVYVCglZCkgKyAlZCIsIGRpc3AxLCBkaXNwMik7CisJICBicmVhazsKKwljYXNlIDB4MTc6CisJICAvKiBUb3Agb2Ygc3RhY2sgdG9zICovCisJICBzcHJpbnRmIChyZXN1bHQsICJ0b3MiKTsKKwkgIGJyZWFrOworCWNhc2UgMHgxODoKKwkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKEZQKSAqLworCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgIHNwcmludGYgKHJlc3VsdCwgIiVkKGZwKSIsIGRpc3AxKTsKKwkgIGJyZWFrOworCWNhc2UgMHgxOToKKwkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNQKSAqLworCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNwKSIsIGRpc3AxKTsKKwkgIGJyZWFrOworCWNhc2UgMHgxYToKKwkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNCKSAqLworCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNiKSIsIGRpc3AxKTsKKwkgIGJyZWFrOworCWNhc2UgMHgxYjoKKwkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFBDKSAqLworCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKKwkgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKKwkgIHNwcmludGZfdm1hIChyZXN1bHQsIGFkZHIgKyBkaXNwMSk7CisJICByZXN1bHQgKz0gc3RybGVuIChyZXN1bHQpOworCSAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOworCSAgKnJlc3VsdCA9ICdcMCc7CisJICBicmVhazsKKwljYXNlIDB4MWM6CisJY2FzZSAweDFkOgorCWNhc2UgMHgxZToKKwljYXNlIDB4MWY6CisJICAvKiBTY2FsZWQgaW5kZXggYmFzZW1vZGVbUjAgLS0gUjc6QixXLEQsUV0gKi8KKwkgIGluZGV4ID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW5kZXhfb2Zmc2V0IC0gOCwgMyk7CisJICBwcmludF9pbnNuX2FyZyAoZCwgaW5kZXhfb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLAorCQkJICByZXN1bHQsIDApOworCSAgeworCSAgICBzdGF0aWMgY29uc3QgY2hhciAqaW5kID0gImJ3ZHEiOworCSAgICBjaGFyICpvZmY7CisKKwkgICAgb2ZmID0gcmVzdWx0ICsgc3RybGVuIChyZXN1bHQpOworCSAgICBzcHJpbnRmIChvZmYsICJbciVkOiVjXSIsIGluZGV4LAorCQkgICAgIGluZFthZGRyX21vZGUgJiAzXSk7CisJICB9CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlICdIJzoKKyAgICBjYXNlICdxJzoKKyAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtNCwgNCk7CisgICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA0KTsKKyAgICAgIHNwcmludGYgKHJlc3VsdCwgIiVkIiwgSXZhbHVlKTsKKyAgICAgIGlvZmZzZXQgLT0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgorICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC0zLCAzKTsKKyAgICAgIHNwcmludGYgKHJlc3VsdCwgInIlZCIsIEl2YWx1ZSY3KTsKKyAgICAgIGlvZmZzZXQgLT0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICAgIEl2YWx1ZSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOworICAgICAgLyoKKyAgICAgICAqIFdhcm5pbmchISAgSEFDSyBBTEVSVCEKKyAgICAgICAqIE9wZXJhbmQgdHlwZSAnYicgaXMgb25seSB1c2VkIGJ5IHRoZSBjbXB7Yix3LGR9IGFuZAorICAgICAgICogbW92bXtiLHcsZH0gaW5zdHJ1Y3Rpb25zOyB3ZSBuZWVkIHRvIGtub3cgd2hldGhlcgorICAgICAgICogaXQncyBhIGBiJyBvciBgdycgb3IgYGQnIGluc3RydWN0aW9uOyBhbmQgZm9yIGJvdGgKKyAgICAgICAqIGNtcG0gYW5kIG1vdm0gaXQncyBzdG9yZWQgYXQgdGhlIHNhbWUgcGxhY2Ugc28gd2UKKyAgICAgICAqIGp1c3QgZ3JhYiB0d28gYml0cyBvZiB0aGUgb3Bjb2RlIGFuZCBsb29rIGF0IGl0Li4uCisgICAgICAgKiAKKyAgICAgICAqLworICAgICAgc2l6ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC02LCAyKTsKKyAgICAgIGlmIChzaXplID09IDApCQkvKiAwMCA9PiBiICovCisJc2l6ZSA9IDE7CisgICAgICBlbHNlIGlmIChzaXplID09IDEpCS8qIDAxID0+IHcgKi8KKwlzaXplID0gMjsKKyAgICAgIGVsc2UKKwlzaXplID0gNDsJCS8qIDExID0+IGQgKi8KKworICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCAoSXZhbHVlIC8gc2l6ZSkgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOworICAgICAgc3ByaW50Zl92bWEgKHJlc3VsdCwgYWRkciArIGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApKTsKKyAgICAgIHJlc3VsdCArPSBzdHJsZW4gKHJlc3VsdCk7CisgICAgICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7CisgICAgICAqcmVzdWx0ID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKKyAgICAgICphb2Zmc2V0cCArPSA4OworICAgICAgc3ByaW50ZiAocmVzdWx0LCAiMHgleCIsIEl2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd1JzoKKyAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7CisgICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X3UsIHJlc3VsdCk7CisgICAgICAqYW9mZnNldHAgKz0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1UnOgorICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDgpOworICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9VLCByZXN1bHQpOworICAgICAgKmFvZmZzZXRwICs9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlICdPJzoKKyAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC05LCA5KTsKKyAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfTywgcmVzdWx0KTsKKyAgICAgIGlvZmZzZXQgLT0gOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0MnOgorICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOworICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9DLCByZXN1bHQpOworICAgICAgaW9mZnNldCAtPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6CisgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQgLSA4LCA4KTsKKyAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfUywgcmVzdWx0KTsKKyAgICAgIGlvZmZzZXQgLT0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ00nOgorICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOworICAgICAgbGlzdF9zZWFyY2goSXZhbHVlLCAwID8gbGlzdF9NMDMyIDogbGlzdF9NNTMyLCByZXN1bHQpOworICAgICAgaW9mZnNldCAtPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUCc6CisgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7CisgICAgICBsaXN0X3NlYXJjaChJdmFsdWUsIDAgPyBsaXN0X1AwMzIgOiBsaXN0X1A1MzIsIHJlc3VsdCk7CisgICAgICBpb2Zmc2V0IC09IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoKKyAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCAzKTsKKyAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUpOworICAgICAgKmFvZmZzZXRwICs9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlICdHJzoKKyAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCA1KTsKKyAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUgKyAxKTsKKyAgICAgICphb2Zmc2V0cCArPSA1OworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gaW9mZnNldDsKK30KKworc3RhdGljIGludAorZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkKKyAgICAgY2hhciAqYnVmZmVyOworICAgICBpbnQgKmFvZmZzZXRwOworeworICBpbnQgSXZhbHVlOworICBzaG9ydCBJdmFsdWUyOworCisgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7CisgIHN3aXRjaCAoSXZhbHVlICYgMHhjMCkKKyAgICB7CisgICAgY2FzZSAweDAwOgorICAgIGNhc2UgMHg0MDoKKyAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDcpOworICAgICAgKmFvZmZzZXRwICs9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODA6CisgICAgICBJdmFsdWUyID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7CisgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlMiwgMik7CisgICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlMiwgMTQpOworICAgICAgKmFvZmZzZXRwICs9IDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGMwOgorICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMik7CisgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKKyAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDMwKTsKKyAgICAgICphb2Zmc2V0cCArPSAzMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIEl2YWx1ZTsKK30KKwwKKworI2lmIDEgLyogYSB2ZXJzaW9uIHRoYXQgc2hvdWxkIHdvcmsgb24gbnMzMmsgZidzJmQncyBvbiBhbnkgbWFjaGluZSAqLworc3RhdGljIGludAoraW52YWxpZF9mbG9hdCAocCwgbGVuKQorICAgICByZWdpc3RlciBjaGFyICpwOworICAgICByZWdpc3RlciBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgdmFsOworCisgIGlmICggbGVuID09IDQgKQorICAgIHZhbCA9IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMjMsIDgpLypleHBvbmVudCovID09IDB4ZmYKKwkgICB8fCAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDIzLCA4KS8qZXhwb25lbnQqLyA9PSAwICYmCisJICAgICAgIGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAyMykvKm1hbnRpc2EqLyAhPSAwKSk7CisgIGVsc2UgaWYgKCBsZW4gPT0gOCApCisgICAgdmFsID0gKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDB4N2ZmCisJICAgfHwgKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDAKKwkgICAgICAgJiYgKGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAzMikvKmxvdyBtYW50aXNhKi8gIT0gMAorCQkgICB8fCBiaXRfZXh0cmFjdF9zaW1wbGUocCwgMzIsIDIwKS8qaGlnaCBtYW50aXNhKi8gIT0gMCkpKTsKKyAgZWxzZQorICAgIHZhbCA9IDE7CisgIHJldHVybiAodmFsKTsKK30KKyNlbHNlCisKKy8qIGFzc3VtZXMgdGhlIGJ5dGVzIGhhdmUgYmVlbiBzd2FwcGVkIHRvIGxvY2FsIG9yZGVyICovCit0eXBlZGVmIHVuaW9uIHsgZG91YmxlIGQ7CisJCWZsb2F0IGY7CisJCXN0cnVjdCB7IHVuc2lnbmVkIG06MjMsIGU6OCwgOjE7fSBzZjsKKwkJc3RydWN0IHsgdW5zaWduZWQgbG07IHVuc2lnbmVkIG06MjAsIGU6MTEsIDoxO30gc2Q7CisJICAgICAgfSBmbG9hdF90eXBlX3U7CisKK3N0YXRpYyBpbnQKK2ludmFsaWRfZmxvYXQgKHAsIGxlbikKKyAgICAgcmVnaXN0ZXIgZmxvYXRfdHlwZV91ICpwOworICAgICByZWdpc3RlciBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgdmFsOworICBpZiAoIGxlbiA9PSBzaXplb2YgKGZsb2F0KSApCisgICAgdmFsID0gKHAtPnNmLmUgPT0gMHhmZgorCSAgIHx8IChwLT5zZi5lID09IDAgJiYgcC0+c2YubSAhPSAwKSk7CisgIGVsc2UgaWYgKCBsZW4gPT0gc2l6ZW9mIChkb3VibGUpICkKKyAgICB2YWwgPSAocC0+c2QuZSA9PSAweDdmZgorCSAgIHx8IChwLT5zZC5lID09IDAgJiYgKHAtPnNkLm0gIT0gMCB8fCBwLT5zZC5sbSAhPSAwKSkpOworICBlbHNlCisgICAgdmFsID0gMTsKKyAgcmV0dXJuICh2YWwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL29waW50bC5oIGIvb3Bjb2Rlcy9vcGludGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTkwMTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9vcGludGwuaApAQCAtMCwwICsxLDMwIEBACisvKiBvcGludGwuaCAtIG9wY29kZXMgc3BlY2lmaWMgaGVhZGVyIGZvciBnZXR0ZXh0IGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBvcGNvZGVzIGxpYnJhcnkgdXNlZCBieSBHQVMgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2lmZGVmIEVOQUJMRV9OTFMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorIyBkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCisjIGlmZGVmIGdldHRleHRfbm9vcAorIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCisjIGVsc2UKKyMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCisjIGVuZGlmCisjZWxzZQorLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KKyMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQorIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCisjIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCisjIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQorIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCisjIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vTWFrZS1pbiBiL29wY29kZXMvcG8vTWFrZS1pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTUyZGIxCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9wby9NYWtlLWluCkBAIC0wLDAgKzEsMjUxIEBACisjIE1ha2VmaWxlIGZvciBwcm9ncmFtIHNvdXJjZSBkaXJlY3RvcnkgaW4gR05VIE5MUyB1dGlsaXRpZXMgcGFja2FnZS4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCitQQUNLQUdFID0gQFBBQ0tBR0VACitWRVJTSU9OID0gQFZFUlNJT05ACisKK1NIRUxMID0gL2Jpbi9zaAorQFNFVF9NQUtFQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitkYXRhZGlyID0gJChwcmVmaXgpL0BEQVRBRElSTkFNRUAKK2xvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCitnbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCitnZXR0ZXh0c3JjZGlyID0gJChwcmVmaXgpL3NoYXJlL2dldHRleHQvcG8KK3N1YmRpciA9IHBvCisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACisKK0NDID0gQENDQAorR0VOQ0FUID0gQEdFTkNBVEAKK0dNU0dGTVQgPSBQQVRIPS4uL3NyYzokJFBBVEggQEdNU0dGTVRACitNU0dGTVQgPSBATVNHRk1UQAorWEdFVFRFWFQgPSBQQVRIPS4uL3NyYzokJFBBVEggQFhHRVRURVhUQAorTVNHTUVSR0UgPSBQQVRIPS4uL3NyYzokJFBBVEggbXNnbWVyZ2UKKworREVGUyA9IEBERUZTQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorCitJTkNMVURFUyA9IC1JLi4gLUkkKHRvcF9zcmNkaXIpL2ludGwKKworQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKKworU09VUkNFUyA9IGNhdC1pZC10YmwuYworUE9GSUxFUyA9IEBQT0ZJTEVTQAorR01PRklMRVMgPSBAR01PRklMRVNACitESVNURklMRVMgPSBDaGFuZ2VMb2cgTWFrZWZpbGUuaW4uaW4gUE9URklMRVMuaW4gJChQQUNLQUdFKS5wb3QgXAorc3RhbXAtY2F0LWlkICQoUE9GSUxFUykgJChHTU9GSUxFUykgJChTT1VSQ0VTKQorCitQT1RGSUxFUyA9IFwKKworQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACitDQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAorSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5vIC5wbyAucG94IC5nbW8gLm1vIC5tc2cgLmNhdAorCisuYy5vOgorCSQoQ09NUElMRSkgJDwKKworLnBvLnBveDoKKwkkKE1BS0UpICQoUEFDS0FHRSkucG90CisJJChNU0dNRVJHRSkgJDwgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IC1vICQqLnBveAorCisucG8ubW86CisJJChNU0dGTVQpIC1vICRAICQ8CisKKy5wby5nbW86CisJZmlsZT0kKHNyY2RpcikvYGVjaG8gJCogfCBzZWQgJ3MsLiovLCwnYC5nbW8gXAorCSAgJiYgcm0gLWYgJCRmaWxlICYmICQoR01TR0ZNVCkgLW8gJCRmaWxlICQ8CisKKy5wby5jYXQ6CisJc2VkIC1mIC4uL2ludGwvcG8ybXNnLnNlZCA8ICQ8ID4gJCoubXNnIFwKKwkgICYmIHJtIC1mICRAICYmICQoR0VOQ0FUKSAkQCAkKi5tc2cKKworCithbGw6IGFsbC1AVVNFX05MU0AKKworYWxsLXllczogJChDQVRBTE9HUykgQE1BSU5UQCAkKFBBQ0tBR0UpLnBvdAorYWxsLW5vOgorCiskKHNyY2RpcikvJChQQUNLQUdFKS5wb3Q6ICQoUE9URklMRVMpCisJJChYR0VUVEVYVCkgLS1kZWZhdWx0LWRvbWFpbj0kKFBBQ0tBR0UpIC0tZGlyZWN0b3J5PSQodG9wX3NyY2RpcikgXAorCSAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKKwkgIC0tZmlsZXMtZnJvbT0kKHNyY2RpcikvUE9URklMRVMuaW4KKwlybSAtZiAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKKwltdiAkKFBBQ0tBR0UpLnBvICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAorCiskKHNyY2RpcikvY2F0LWlkLXRibC5jOiBzdGFtcC1jYXQtaWQ7IEA6CiskKHNyY2Rpcikvc3RhbXAtY2F0LWlkOiAkKFBBQ0tBR0UpLnBvdAorCXJtIC1mIGNhdC1pZC10YmwudG1wCisJc2VkIC1mIC4uL2ludGwvcG8ydGJsLnNlZCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgXAorCQl8IHNlZCAtZSAicy9AUEFDS0FHRSBOQU1FQC8kKFBBQ0tBR0UpLyIgPiBjYXQtaWQtdGJsLnRtcAorCWlmIGNtcCAtcyBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyB0aGVuIFwKKwkgIHJtIGNhdC1pZC10YmwudG1wOyBcCisJZWxzZSBcCisJICBlY2hvIGNhdC1pZC10YmwuYyBjaGFuZ2VkOyBcCisJICBybSAtZiAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCisJICBtdiBjYXQtaWQtdGJsLnRtcCAkKHNyY2RpcikvY2F0LWlkLXRibC5jOyBcCisJZmkKKwljZCAkKHNyY2RpcikgJiYgcm0gLWYgc3RhbXAtY2F0LWlkICYmIGVjaG8gdGltZXN0YW1wID4gc3RhbXAtY2F0LWlkCisKKworaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQoraW5zdGFsbC1leGVjOgoraW5zdGFsbC1pbmZvOgoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtQFVTRV9OTFNACitpbnN0YWxsLWRhdGEtbm86IGFsbAoraW5zdGFsbC1kYXRhLXllczogYWxsCisJaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKKwkgICQoTUtJTlNUQUxMRElSUykgJChkYXRhZGlyKTsgXAorCWVsc2UgXAorCSAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZGF0YWRpcik7IFwKKwlmaQorCUBjYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCisJZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCisJICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAorCSAgY2FzZSAiJCRjYXQiIGluIFwKKwkgICAgKi5nbW8pIGRlc3RkaXI9JChnbnVsb2NhbGVkaXIpOzsgXAorCSAgICAqKSAgICAgZGVzdGRpcj0kKGxvY2FsZWRpcik7OyBcCisJICBlc2FjOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIGRpcj0kJGRlc3RkaXIvJCRsYW5nL0xDX01FU1NBR0VTOyBcCisJICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAorCSAgICAkKE1LSU5TVEFMTERJUlMpICQkZGlyOyBcCisJICBlbHNlIFwKKwkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQkZGlyOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtciAkJGNhdDsgdGhlbiBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0IGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAorCSAgZWxzZSBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKKwkgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKKwkJICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1yICQkY2F0Lm07IHRoZW4gXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQubSAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQubSBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAorCSAgZWxzZSBcCisJICAgIGlmIHRlc3QgLXIgJChzcmNkaXIpLyQkY2F0Lm0gOyB0aGVuIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0Lm0gXAorCQkkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICAgICAgZWNobyAiaW5zdGFsbGluZyAkKHNyY2RpcikvJCRjYXQgYXMiIFwKKwkJICAgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCisJICAgIGVsc2UgXAorCSAgICAgIHRydWU7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZG9uZQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiOyB0aGVuIFwKKwkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCisJICAgICQoTUtJTlNUQUxMRElSUykgJChnZXR0ZXh0c3JjZGlyKTsgXAorCSAgZWxzZSBcCisJICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGdldHRleHRzcmNkaXIpOyBcCisJICBmaTsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NYWtlZmlsZS5pbi5pbiBcCisJCQkgICQoZ2V0dGV4dHNyY2RpcikvTWFrZWZpbGUuaW4uaW47IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKworIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgoraW5zdGFsbGNoZWNrOgorCit1bmluc3RhbGw6CisJY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAorCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAorCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKKwkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAorCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAorCSAgcm0gLWYgJChsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCisJICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCisJICBybSAtZiAkKGdudWxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKKwlkb25lCisJcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS9wby1NYWtlZmlsZS5pbi5pbgorCitjaGVjazogYWxsCisKK2NhdC1pZC10YmwubzogLi4vaW50bC9saWJnZXR0ZXh0LmgKKworZHZpIGluZm8gdGFncyBUQUdTIElEOgorCittb3N0bHljbGVhbjoKKwlybSAtZiBjb3JlIGNvcmUuKiAqLnBveCAkKFBBQ0tBR0UpLnBvICoub2xkLnBvIGNhdC1pZC10YmwudG1wCisJcm0gLWZyICoubworCitjbGVhbjogbW9zdGx5Y2xlYW4KKworZGlzdGNsZWFuOiBjbGVhbgorCXJtIC1mIE1ha2VmaWxlIE1ha2VmaWxlLmluIFBPVEZJTEVTICoubW8gKi5tc2cgKi5jYXQgKi5jYXQubQorCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwlybSAtZiAkKEdNT0ZJTEVTKQorCitkaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorZGlzdCBkaXN0ZGlyOiB1cGRhdGUtcG8gJChESVNURklMRVMpCisJZGlzdHM9IiQoRElTVEZJTEVTKSI7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKKwkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCisJZG9uZQorCit1cGRhdGUtcG86IE1ha2VmaWxlCisJJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAorCVBBVEg9YHB3ZGAvLi4vc3JjOiQkUEFUSDsgXAorCWNkICQoc3JjZGlyKTsgXAorCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKKwlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKKwkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCisJICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKKwkgIG12ICQkbGFuZy5wbyAkJGxhbmcub2xkLnBvOyBcCisJICBlY2hvICIkJGxhbmc6IjsgXAorCSAgaWYgJChNU0dNRVJHRSkgJCRsYW5nLm9sZC5wbyAkKFBBQ0tBR0UpLnBvdCAtbyAkJGxhbmcucG87IHRoZW4gXAorCSAgICBybSAtZiAkJGxhbmcub2xkLnBvOyBcCisJICBlbHNlIFwKKwkgICAgZWNobyAibXNnbWVyZ2UgZm9yICQkY2F0IGZhaWxlZCEiOyBcCisJICAgIHJtIC1mICQkbGFuZy5wbzsgXAorCSAgICBtdiAkJGxhbmcub2xkLnBvICQkbGFuZy5wbzsgXAorCSAgZmk7IFwKKwlkb25lCisKK1BPVEZJTEVTOiBQT1RGSUxFUy5pbgorCSggaWYgdGVzdCAneCQoc3JjZGlyKScgIT0gJ3guJzsgdGhlbiBcCisJICAgIHBvc3JjcHJlZml4PSckKHRvcF9zcmNkaXIpLyc7IFwKKwkgIGVsc2UgXAorCSAgICBwb3NyY3ByZWZpeD0iLi4vIjsgXAorCSAgZmk7IFwKKwkgIHJtIC1mICRALXQgJEAgXAorCSAgICAmJiAoc2VkIC1lICcvXiMvZCcgLWUgJy9eWyAJXSokJC9kJyBcCisJCSAgICAtZSAic0AuKkAJJCRwb3NyY3ByZWZpeCYgXFxcXEAiIDwgJChzcmNkaXIpLyRALmluIFwKKwkJfCBzZWQgLWUgJyQkcy9cXCQkLy8nKSA+ICRALXQgXAorCSAgICAmJiBjaG1vZCBhLXcgJEAtdCBcCisJICAgICYmIG12ICRALXQgJEAgKQorCitQT1RGSUxFUy5pbjogQE1BSU5UQCAuLi9NYWtlZmlsZQorCWNkIC4uICYmICQoTUFLRSkgcG8vUE9URklMRVMuaW4KKworTWFrZWZpbGU6IE1ha2UtaW4gLi4vY29uZmlnLnN0YXR1cyBQT1RGSUxFUworCWNkIC4uIFwKKwkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvTWFrZWZpbGUuaW46JChzdWJkaXIpL01ha2UtaW4gXAorCSAgICAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL1BPVEZJTEVTLmluIGIvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDcyY2NhCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9wby9QT1RGSUxFUy5pbgpAQCAtMCwwICsxLDY5IEBACithMjlrLWRpcy5jCithbHBoYS1kaXMuYworYWxwaGEtb3BjLmMKK2FyYy1kaXMuYworYXJjLW9wYy5jCithcm0tZGlzLmMKK2FybS1vcGMuaAorY2dlbi1hc20uYworY2dlbi1kaXMuYworY2dlbi1vcGMuYworZDEwdi1kaXMuYworZDEwdi1vcGMuYworZDMwdi1kaXMuYworZDMwdi1vcGMuYworZGlzLWJ1Zi5jCitkaXNhc3NlbWJsZS5jCitmcjMwLWFzbS5jCitmcjMwLWRlc2MuYworZnIzMC1kZXNjLmgKK2ZyMzAtZGlzLmMKK2ZyMzAtaWJsZC5jCitmcjMwLW9wYy5jCitmcjMwLW9wYy5oCitoODMwMC1kaXMuYworaDg1MDAtZGlzLmMKK2g4NTAwLW9wYy5oCitocHBhLWRpcy5jCitpMzg2LWRpcy5jCitpOTYwLWRpcy5jCittMTAyMDAtZGlzLmMKK20xMDIwMC1vcGMuYworbTEwMzAwLWRpcy5jCittMTAzMDAtb3BjLmMKK20zMnItYXNtLmMKK20zMnItZGVzYy5jCittMzJyLWRlc2MuaAorbTMyci1kaXMuYworbTMyci1pYmxkLmMKK20zMnItb3BjLmMKK20zMnItb3BjLmgKK20zMnItb3BpbnN0LmMKK202OGstZGlzLmMKK202OGstb3BjLmMKK204OGstZGlzLmMKK21jb3JlLWRpcy5jCittY29yZS1vcGMuaAorbWlwcy1kaXMuYworbWlwcy1vcGMuYworbWlwczE2LW9wYy5jCituczMyay1kaXMuYworb3BpbnRsLmgKK3BwYy1kaXMuYworcHBjLW9wYy5jCitzaC1kaXMuYworc2gtb3BjLmgKK3NwYXJjLWRpcy5jCitzcGFyYy1vcGMuYworc3lzZGVwLmgKK3RpYzMwLWRpcy5jCit0aWM4MC1kaXMuYwordGljODAtb3BjLmMKK3Y4NTAtZGlzLmMKK3Y4NTAtb3BjLmMKK3ZheC1kaXMuYwordzY1LWRpcy5jCit3NjUtb3BjLmgKK3o4ay1kaXMuYworejhrLW9wYy5oCit6OGtnZW4uYwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9wby9vcGNvZGVzLnBvdCBiL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlM2YwZgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKQEAgLTAsMCArMSwyNDIgQEAKKyMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KKyMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk5LTA0LTE4IDE5OjAxLTA0MDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgorCisjOiBhbHBoYS1vcGMuYzozMzUKK21zZ2lkICJicmFuY2ggb3BlcmFuZCB1bmFsaWduZWQiCittc2dzdHIgIiIKKworIzogYWxwaGEtb3BjLmM6MzU4IGFscGhhLW9wYy5jOjM4MAorbXNnaWQgImp1bXAgaGludCB1bmFsaWduZWQiCittc2dzdHIgIiIKKworIzogYXJtLWRpcy5jOjM4OAorbXNnaWQgIjxpbGxlZ2FsIHByZWNpc2lvbj4iCittc2dzdHIgIiIKKworIzogY2dlbi1hc20uYzoyMjQKK21zZ2lkICJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIgorbXNnc3RyICIiCisKKyM6IGNnZW4tYXNtLmM6MzMyIGZyMzAtaWJsZC5jOjIyMyBtMzJyLWlibGQuYzoyMjMKKyMsIGMtZm9ybWF0Cittc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiCittc2dzdHIgIiIKKworIzogY2dlbi1hc20uYzozNTMKKyMsIGMtZm9ybWF0Cittc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAlbHUgYW5kICVsdSkiCittc2dzdHIgIiIKKworIzogZDMwdi1kaXMuYzozMDUKKyMsIGMtZm9ybWF0Cittc2dpZCAiPHVua25vd24gcmVnaXN0ZXIgJWQ+IgorbXNnc3RyICIiCisKKyMuIENhbid0IGhhcHBlbi4KKyM6IGRpcy1idWYuYzo1MAorIywgYy1mb3JtYXQKK21zZ2lkICJVbmtub3duIGVycm9yICVkXG4iCittc2dzdHIgIiIKKworIzogZGlzLWJ1Zi5jOjU1CisjLCBjLWZvcm1hdAorbXNnaWQgIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLlxuIgorbXNnc3RyICIiCisKKyM6IGZyMzAtYXNtLmM6MzAzIG0zMnItYXNtLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIgorbXNnc3RyICIiCisKKyMuIFdlIGNvdWxkbid0IHBhcnNlIGl0LgorIzogZnIzMC1hc20uYzozNjcgZnIzMC1hc20uYzo0MzYgbTMyci1hc20uYzozODMgbTMyci1hc20uYzo0NTIKK21zZ2lkICJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iCittc2dzdHIgIiIKKworIy4gU3ludGF4IGNoYXIgZGlkbid0IG1hdGNoLiAgQ2FuJ3QgYmUgdGhpcyBpbnNuLgorIy4gRklYTUU6IHdvdWxkIGxpa2UgdG8gcmV0dXJuIHNvbWV0aGluZyBsaWtlCisjLiAiZXhwZWN0ZWQgY2hhciBgYyciCisjOiBmcjMwLWFzbS5jOjQwNCBtMzJyLWFzbS5jOjQyMAorbXNnaWQgInN5bnRheCBlcnJvciIKK21zZ3N0ciAiIgorCisjOiBmcjMwLWFzbS5jOjQzMCBtMzJyLWFzbS5jOjQ0NgorbXNnaWQgImp1bmsgYXQgZW5kIG9mIGxpbmUiCittc2dzdHIgIiIKKworIzogZnIzMC1hc20uYzo1MjMgbTMyci1hc20uYzo1MzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlLjUwcy4uLiciCittc2dzdHIgIiIKKworIzogZnIzMC1hc20uYzo1MjYgbTMyci1hc20uYzo1NDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciCittc2dzdHIgIiIKKworIzogZnIzMC1kaXMuYzozMDAgbTMyci1kaXMuYzoyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHByaW50aW5nIGluc24uXG4iCittc2dzdHIgIiIKKworIzogZnIzMC1pYmxkLmM6MjEwIG0zMnItaWJsZC5jOjIxMAorIywgYy1mb3JtYXQKK21zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuIDAgYW5kICVsdSkiCittc2dzdHIgIiIKKworIzogZnIzMC1pYmxkLmM6NzQ5IG0zMnItaWJsZC5jOjY4MworIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIKK21zZ3N0ciAiIgorCisjOiBmcjMwLWlibGQuYzo5NTIgbTMyci1pYmxkLmM6ODE5CisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIgorbXNnc3RyICIiCisKKyM6IGZyMzAtaWJsZC5jOjEwOTYgbTMyci1pYmxkLmM6OTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIgorbXNnc3RyICIiCisKKyM6IGZyMzAtaWJsZC5jOjEyMjUgbTMyci1pYmxkLmM6MTAzMAorIywgYy1mb3JtYXQKK21zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIKK21zZ3N0ciAiIgorCisjOiBmcjMwLWlibGQuYzoxMzU4IG0zMnItaWJsZC5jOjExMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgaW50IG9wZXJhbmQuXG4iCittc2dzdHIgIiIKKworIzogZnIzMC1pYmxkLmM6MTQ4NCBtMzJyLWlibGQuYzoxMjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBzZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgorbXNnc3RyICIiCisKKyM6IGg4MzAwLWRpcy5jOjQwNAorIywgYy1mb3JtYXQKK21zZ2lkICJIbW1tbSAleCIKK21zZ3N0ciAiIgorCisjOiBoODMwMC1kaXMuYzo0MTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRG9uJ3QgdW5kZXJzdGFuZCAleCBcbiIKK21zZ3N0ciAiIgorCisjOiBoODUwMC1kaXMuYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY2FuJ3QgY29wZSB3aXRoIGluc2VydCAlZFxuIgorbXNnc3RyICIiCisKKyMuIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcKKyM6IGg4NTAwLWRpcy5jOjM0NAorIywgYy1mb3JtYXQKK21zZ2lkICIlMDJ4XHRcdCp1bmtub3duKiIKK21zZ3N0ciAiIgorCisjOiBtMTAyMDAtZGlzLmM6MTk5CisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd25cdDB4JTAyeCIKK21zZ3N0ciAiIgorCisjOiBtMTAyMDAtZGlzLmM6MzM5CisjLCBjLWZvcm1hdAorbXNnaWQgInVua25vd25cdDB4JTA0bHgiCittc2dzdHIgIiIKKworIzogbTEwMzAwLWRpcy5jOjcwNgorIywgYy1mb3JtYXQKK21zZ2lkICJ1bmtub3duXHQweCUwNHgiCittc2dzdHIgIiIKKworIzogbTY4ay1kaXMuYzo0MTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGludGVybmFsIGVycm9yIGluIG9wY29kZSB0YWJsZTogJXMgJXM+XG4iCittc2dzdHIgIiIKKworIzogbTY4ay1kaXMuYzo5NjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiPGZ1bmN0aW9uIGNvZGUgJWQ+IgorbXNnc3RyICIiCisKKyM6IG04OGstZGlzLmM6MjczCisjLCBjLWZvcm1hdAorbXNnaWQgIiMgPGRpcyBlcnJvcjogJTA4eD4iCittc2dzdHIgIiIKKworIzogbWlwcy1kaXMuYzozNzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIyBpbnRlcm5hbCBlcnJvciwgdW5kZWZpbmVkIG1vZGlmaWVyKCVjKSIKK21zZ3N0ciAiIgorCisjLiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQorIy4gKiBBIGlzIGFuIGFkZHJlc3MgYW5kIHdlIGNhbmB0IGhhdmUgdGhlIGFkZHJlc3Mgb2YKKyMuICogYW4gaW1tZWRpYXRlIGVpdGhlci4gV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB0byBpbmNyZWFzZQorIy4gKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KKyMuICogYW55d2F5IQorIy4KKyM6IG5zMzJrLWRpcy5jOjYxOAorbXNnaWQgIiQ8dW5kZWZpbmVkPiIKK21zZ3N0ciAiIgorCisjOiBwcGMtb3BjLmM6NTg2IHBwYy1vcGMuYzo2MTcKK21zZ2lkICJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIKK21zZ3N0ciAiIgorCisjOiBwcGMtb3BjLmM6NjE5Cittc2dpZCAiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiCittc2dzdHIgIiIKKworIzogcHBjLW9wYy5jOjY3NAorbXNnaWQgImlnbm9yaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgaW4gYnJhbmNoIG9mZnNldCIKK21zZ3N0ciAiIgorCisjOiBwcGMtb3BjLmM6NzA5IHBwYy1vcGMuYzo3NDYKK21zZ2lkICJpbGxlZ2FsIGJpdG1hc2siCittc2dzdHIgIiIKKworIzogcHBjLW9wYy5jOjgxNQorbXNnaWQgInZhbHVlIG91dCBvZiByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBwcGMtb3BjLmM6ODg5Cittc2dpZCAiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIKK21zZ3N0ciAiIgorCisjOiBwcGMtb3BjLmM6OTA0Cittc2dpZCAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciCittc2dzdHIgIiIKKworIy4gTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24KKyM6IHNwYXJjLWRpcy5jOjczOQorbXNnaWQgInVua25vd24iCittc2dzdHIgIiIKKworIzogc3BhcmMtZGlzLmM6ODExCisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIGVycm9yOiAgYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iCittc2dzdHIgIiIKKworIzogc3BhcmMtZGlzLmM6ODIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKK21zZ3N0ciAiIgorCisjOiBzcGFyYy1kaXMuYzo4NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiID09IFwiJXNcIlxuIgorbXNnc3RyICIiCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BwYy1kaXMuYyBiL29wY29kZXMvcHBjLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzE2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3BwYy1kaXMuYwpAQCAtMCwwICsxLDIzOCBAQAorLyogcHBjLWRpcy5jIC0tIERpc2Fzc2VtYmxlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgorCisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zLCBhbGwgb2Ygd2hpY2ggdXNlCisgICB0aGUgZGlzYXNzZW1ibGVyIGludGVyZmFjZSBkZWZpbmVkIGluIGRpcy1hc20uaC4gIFNldmVyYWwgZnVuY3Rpb25zCisgICBhcmUgcHJvdmlkZWQgYmVjYXVzZSB0aGlzIGZpbGUgaGFuZGxlcyBkaXNhc3NlbWJseSBmb3IgdGhlIFBvd2VyUEMKKyAgIGluIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1vZGUgYW5kIGFsc28gZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkKKyAgIGNoaXAuICAqLworCitzdGF0aWMgaW50IHByaW50X2luc25fcG93ZXJwYyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAorCQkJCSAgICAgICBpbnQgYmlnZW5kaWFuLCBpbnQgZGlhbGVjdCkpOworCisvKiBQcmludCBhIGJpZyBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbworICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLworCitpbnQKK3ByaW50X2luc25fYmlnX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsCisJCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOworfQorCisvKiBQcmludCBhIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbworICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLworCitpbnQKK3ByaW50X2luc25fbGl0dGxlX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDAsCisJCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOworfQorCisvKiBQcmludCBhIFBPV0VSIChSUy82MDAwKSBpbnN0cnVjdGlvbi4gICovCisKK2ludAorcHJpbnRfaW5zbl9yczYwMDAgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsIFBQQ19PUENPREVfUE9XRVIpOworfQorCisvKiBQcmludCBhIFBvd2VyUEMgb3IgUE9XRVIgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgaW50CitwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIGJpZ2VuZGlhbiwgZGlhbGVjdCkKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgaW50IGJpZ2VuZGlhbjsKKyAgICAgaW50IGRpYWxlY3Q7Cit7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgaW50IHN0YXR1czsKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKKyAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOworICB1bnNpZ25lZCBsb25nIG9wOworCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKGJpZ2VuZGlhbikKKyAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKKyAgZWxzZQorICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOworCisgIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCisgIG9wID0gUFBDX09QIChpbnNuKTsKKworICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgV2UgY291bGQgc3BlZWQgdGhpcyB1cAorICAgICBhIGJpdCBieSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIG1ham9yIG9wY29kZS4gICovCisgIG9wY29kZV9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOworICBmb3IgKG9wY29kZSA9IHBvd2VycGNfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9vcDsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7CisgICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOworICAgICAgaW50IGludmFsaWQ7CisgICAgICBpbnQgbmVlZF9jb21tYTsKKyAgICAgIGludCBuZWVkX3BhcmVuOworCisgICAgICB0YWJsZV9vcCA9IFBQQ19PUCAob3Bjb2RlLT5vcGNvZGUpOworICAgICAgaWYgKG9wIDwgdGFibGVfb3ApCisJYnJlYWs7CisgICAgICBpZiAob3AgPiB0YWJsZV9vcCkKKwljb250aW51ZTsKKworICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZQorCSAgfHwgKG9wY29kZS0+ZmxhZ3MgJiBkaWFsZWN0KSA9PSAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KKwkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCisJIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KKyAgICAgIGludmFsaWQgPSAwOworICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQorCXsKKwkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7CisJICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKKwkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgJmludmFsaWQpOworCX0KKyAgICAgIGlmIChpbnZhbGlkKQorCWNvbnRpbnVlOworCisgICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7CisgICAgICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKKworICAgICAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCisgICAgICBuZWVkX2NvbW1hID0gMDsKKyAgICAgIG5lZWRfcGFyZW4gPSAwOworICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQorCXsKKwkgIGxvbmcgdmFsdWU7CisKKwkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7CisKKwkgIC8qIE9wZXJhbmRzIHRoYXQgYXJlIG1hcmtlZCBGQUtFIGFyZSBzaW1wbHkgaWdub3JlZC4gIFdlCisJICAgICBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKKwkgICAgIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCisJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KKwkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQorCSAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOworCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKKwkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkgIT0gMCkKKwkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOworCSAgICB9CisKKwkgIC8qIElmIHRoZSBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgdGhlIHZhbHVlIGlzIHplcm8sIGRvbid0CisJICAgICBwcmludCBhbnl0aGluZy4gICovCisJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKKwkgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSA9PSAwCisJICAgICAgJiYgdmFsdWUgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIGlmIChuZWVkX2NvbW1hKQorCSAgICB7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7CisJICAgICAgbmVlZF9jb21tYSA9IDA7CisJICAgIH0KKworCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KKwkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFIpICE9IDApCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKKwkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZQUikgIT0gMCkKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmJWxkIiwgdmFsdWUpOworCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDApCisJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIHZhbHVlLCBpbmZvKTsKKwkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQorCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOworCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQ1IpID09IDAKKwkJICAgfHwgKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BQQykgPT0gMCkKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAzKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyJWQiLCB2YWx1ZSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgc3RhdGljIGNvbnN0IGNoYXIgKmNibmFtZXNbNF0gPSB7ICJsdCIsICJndCIsICJlcSIsICJzbyIgfTsKKwkJICBpbnQgY3I7CisJCSAgaW50IGNjOworCisJCSAgY3IgPSB2YWx1ZSA+PiAyOworCQkgIGlmIChjciAhPSAwKQorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI0KmNyJWQiLCBjcik7CisJCSAgY2MgPSB2YWx1ZSAmIDM7CisJCSAgaWYgKGNjICE9IDApCisJCSAgICB7CisJCSAgICAgIGlmIChjciAhPSAwKQorCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7CisJCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjYm5hbWVzW2NjXSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICBpZiAobmVlZF9wYXJlbikKKwkgICAgeworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOworCSAgICAgIG5lZWRfcGFyZW4gPSAwOworCSAgICB9CisKKwkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpID09IDApCisJICAgIG5lZWRfY29tbWEgPSAxOworCSAgZWxzZQorCSAgICB7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7CisJICAgICAgbmVlZF9wYXJlbiA9IDE7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCisgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgLyogV2UgY291bGQgbm90IGZpbmQgYSBtYXRjaC4gICovCisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgMHglbHgiLCBpbnNuKTsKKworICByZXR1cm4gNDsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLW9wYy5jIGIvb3Bjb2Rlcy9wcGMtb3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyMTg4MAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvcHBjLW9wYy5jCkBAIC0wLDAgKzEsMzEyNCBAQAorLyogcHBjLW9wYy5jIC0tIFBvd2VyUEMgb3Bjb2RlIGxpc3QKKyAgIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKzAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgorI2luY2x1ZGUgIm9waW50bC5oIgorCisvKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZQorICAgaW5jbHVkZXMgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcworICAgcGVybWl0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyCisgICBsb2dpYywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcworICAgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbgorICAgdGhlIC50ZXh0IHNlY3Rpb24uCisKKyAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAorICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcworICAgZmlsZS4gICovCisMCisvKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JhdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgbG9uZyBleHRyYWN0X2JhdCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JiYSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgbG9uZyBleHRyYWN0X2JiYSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfYmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZG0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9iZG0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZHAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9iZHAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyBpbnQgdmFsaWRfYm8gUEFSQU1TICgobG9uZykpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JvIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfYm8gUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ib2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9ib2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9kcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgbG9uZyBleHRyYWN0X2RzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbGkgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9saSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgbG9uZyBleHRyYWN0X21iZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgbG9uZyBleHRyYWN0X21iNiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X25iIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfbmIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9uc2kgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9uc2kgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYWwgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhbSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYnMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9yYnMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zaDYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9zaDYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zcHIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF9zcHIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF90YnIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOworc3RhdGljIGxvbmcgZXh0cmFjdF90YnIgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKKwwKKy8qIFRoZSBvcGVyYW5kcyB0YWJsZS4KKworICAgVGhlIGZpZWxkcyBhcmUgYml0cywgc2hpZnQsIGluc2VydCwgZXh0cmFjdCwgZmxhZ3MuCisKKyAgIFdlIHVzZWQgdG8gcHV0IHBhcmVucyBhcm91bmQgdGhlIHZhcmlvdXMgYWRkaXRpb25zLCBsaWtlIHRoZSBvbmUKKyAgIGZvciBCQSBqdXN0IGJlbG93LiAgSG93ZXZlciwgdGhhdCBjYXVzZWQgdHJvdWJsZSB3aXRoIGZlZWJsZQorICAgY29tcGlsZXJzIHdpdGggYSBsaW1pdCBvbiBkZXB0aCBvZiBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgbGlrZQorICAgKHJlcG9ydGVkbHkpIHRoZSBjb21waWxlciBpbiBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyA1LiAgU28gd2UKKyAgIG9taXQgdGhlIHBhcmVucywgc2luY2UgdGhlIG1hY3JvcyBhcmUgbmV2ZXIgdXNlZCBpbiBhIGNvbnRleHQgd2hlcmUKKyAgIHRoZSBhZGRpdGlvbiB3aWxsIGJlIGFtYmlndW91cy4gICovCisKK2NvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgcG93ZXJwY19vcGVyYW5kc1tdID0KK3sKKyAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mCisgICAgIG9wZXJhbmRzLiAgKi8KKyNkZWZpbmUgVU5VU0VEIDAKKyAgeyAwLCAwLCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCQSBVTlVTRUQgKyAxCisjZGVmaW5lIEJBX01BU0sgKDB4MWYgPDwgMTYpCisgIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCisKKyAgLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lCisgICAgIGFzIHRoZSBCVCBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJBVCBCQSArIDEKKyAgeyA1LCAxNiwgaW5zZXJ0X2JhdCwgZXh0cmFjdF9iYXQsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKKworICAvKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJCIEJBVCArIDEKKyNkZWZpbmUgQkJfTUFTSyAoMHgxZiA8PCAxMSkKKyAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKKworICAvKiBUaGUgQkIgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUKKyAgICAgYXMgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQkJBIEJCICsgMQorICB7IDUsIDExLCBpbnNlcnRfYmJhLCBleHRyYWN0X2JiYSwgUFBDX09QRVJBTkRfRkFLRSB9LAorCisgIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKKyAgICAgZm9yY2VkIHRvIHplcm8uICAqLworI2RlZmluZSBCRCBCQkEgKyAxCisgIHsgMTYsIDAsIGluc2VydF9iZCwgZXh0cmFjdF9iZCwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzCisgICAgIHVzZWQuICAqLworI2RlZmluZSBCREEgQkQgKyAxCisgIHsgMTYsIDAsIGluc2VydF9iZCwgZXh0cmFjdF9iZCwgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgorICAgICBUaGlzIHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KKyNkZWZpbmUgQkRNIEJEQSArIDEKKyAgeyAxNiwgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCisgICAgICBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQKKyAgICAgYW5kIGFic29sdXRlIGFkZHJlc3MgaXMgdXNlZC4gICovCisjZGVmaW5lIEJETUEgQkRNICsgMQorICB7IDE2LCAwLCBpbnNlcnRfYmRtLCBleHRyYWN0X2JkbSwKKyAgICAgIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZC4KKyAgICAgVGhpcyBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgYXBwcm9wcmlhdGVseS4gICovCisjZGVmaW5lIEJEUCBCRE1BICsgMQorICB7IDE2LCAwLCBpbnNlcnRfYmRwLCBleHRyYWN0X2JkcCwKKyAgICAgIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZAorICAgICBhbmQgYWJzb2x1dGUgYWRkcmVzc2luZyBpcyB1c2VkLiAgKi8KKyNkZWZpbmUgQkRQQSBCRFAgKyAxCisgIHsgMTYsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAorICAgICAgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgQkYgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQkYgQkRQQSArIDEKKyAgeyAzLCAyMywgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKKworICAvKiBBbiBvcHRpb25hbCBCRiBmaWVsZC4gIFRoaXMgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMsCisgICAgIGluIHdoaWNoIGFuIG9taXR0ZWQgQkYgZmllbGQgaXMgdGFrZW4gYXMgemVyby4gICovCisjZGVmaW5lIE9CRiBCRiArIDEKKyAgeyAzLCAyMywgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBCRkEgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQkZBIE9CRiArIDEKKyAgeyAzLCAxOCwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKKworICAvKiBUaGUgQkkgZmllbGQgaW4gYSBCIGZvcm0gb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJJIEJGQSArIDEKKyNkZWZpbmUgQklfTUFTSyAoMHgxZiA8PCAxNikKKyAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfSwKKworICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBDZXJ0YWluIHZhbHVlcyBhcmUKKyAgICAgaWxsZWdhbC4gICovCisjZGVmaW5lIEJPIEJJICsgMQorI2RlZmluZSBCT19NQVNLICgweDFmIDw8IDIxKQorICB7IDUsIDIxLCBpbnNlcnRfYm8sIGV4dHJhY3RfYm8sIDAgfSwKKworICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBvciAtIG1vZGlmaWVyIGlzCisgICAgIHVzZWQuICBUaGlzIGlzIGxpa2UgdGhlIEJPIGZpZWxkLCBidXQgaXQgbXVzdCBiZSBldmVuLiAgKi8KKyNkZWZpbmUgQk9FIEJPICsgMQorICB7IDUsIDIxLCBpbnNlcnRfYm9lLCBleHRyYWN0X2JvZSwgMCB9LAorCisgIC8qIFRoZSBCVCBmaWVsZCBpbiBhbiBYIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCVCBCT0UgKyAxCisgIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCisKKyAgLyogVGhlIGNvbmRpdGlvbiByZWdpc3RlciBudW1iZXIgcG9ydGlvbiBvZiB0aGUgQkkgZmllbGQgaW4gYSBCIGZvcm0KKyAgICAgb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGV4dGVuZGVkCisgICAgIGNvbmRpdGlvbmFsIGJyYW5jaCBtbmVtb25pY3MsIHdoaWNoIHNldCB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlCisgICAgIEJJIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIENSIEJUICsgMQorICB7IDMsIDE4LCAwLCAwLCBQUENfT1BFUkFORF9DUiB8IFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKKyAgLyogVGhlIEQgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGEgZGlzcGxhY2VtZW50IG9mZgorICAgICBhIHJlZ2lzdGVyLCBhbmQgaW1wbGllcyB0aGF0IHRoZSBuZXh0IG9wZXJhbmQgaXMgYSByZWdpc3RlciBpbgorICAgICBwYXJlbnRoZXNlcy4gICovCisjZGVmaW5lIEQgQ1IgKyAxCisgIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1BBUkVOUyB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBEUyBmaWVsZCBpbiBhIERTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgRCwgYnV0IHRoZQorICAgICBsb3dlciB0d28gYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICAqLworI2RlZmluZSBEUyBEICsgMQorICB7IDE2LCAwLCBpbnNlcnRfZHMsIGV4dHJhY3RfZHMsIFBQQ19PUEVSQU5EX1BBUkVOUyB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBFIGZpZWxkIGluIGEgd3J0ZWVpIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRSBEUyArIDEKKyAgeyAxLCAxNSwgMCwgMCwgMCB9LAorCisgIC8qIFRoZSBGTDEgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRkwxIEUgKyAxCisgIHsgNCwgMTIsIDAsIDAsIDAgfSwKKworICAvKiBUaGUgRkwyIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEZMMiBGTDEgKyAxCisgIHsgMywgMiwgMCwgMCwgMCB9LAorCisgIC8qIFRoZSBGTE0gZmllbGQgaW4gYW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBGTE0gRkwyICsgMQorICB7IDgsIDE3LCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIEZSQSBmaWVsZCBpbiBhbiBYIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEZSQSBGTE0gKyAxCisjZGVmaW5lIEZSQV9NQVNLICgweDFmIDw8IDE2KQorICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKKworICAvKiBUaGUgRlJCIGZpZWxkIGluIGFuIFggb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRlJCIEZSQSArIDEKKyNkZWZpbmUgRlJCX01BU0sgKDB4MWYgPDwgMTEpCisgIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAorCisgIC8qIFRoZSBGUkMgZmllbGQgaW4gYW4gQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRlJDIEZSQiArIDEKKyNkZWZpbmUgRlJDX01BU0sgKDB4MWYgPDwgNikKKyAgeyA1LCA2LCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKKworICAvKiBUaGUgRlJTIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiBvciB0aGUgRlJUIGZpZWxkIGluIGEgRCwgWAorICAgICBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBGUlMgRlJDICsgMQorI2RlZmluZSBGUlQgRlJTCisgIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0ZQUiB9LAorCisgIC8qIFRoZSBGWE0gZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRlhNIEZSUyArIDEKKyNkZWZpbmUgRlhNX01BU0sgKDB4ZmYgPDwgMTIpCisgIHsgOCwgMTIsIDAsIDAsIDAgfSwKKworICAvKiBUaGUgTCBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTCBGWE0gKyAxCisgIHsgMSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKKyAgLyogVGhlIExFViBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBMRVYgTCArIDEKKyAgeyA3LCA1LCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKKyAgICAgZm9yY2VkIHRvIHplcm8uICAqLworI2RlZmluZSBMSSBMRVYgKyAxCisgIHsgMjYsIDAsIGluc2VydF9saSwgZXh0cmFjdF9saSwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uIHdoZW4gdXNlZCBhcyBhbiBhYnNvbHV0ZQorICAgICBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgTElBIExJICsgMQorICB7IDI2LCAwLCBpbnNlcnRfbGksIGV4dHJhY3RfbGksIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIE1CIGZpZWxkIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIE1CIExJQSArIDEKKyNkZWZpbmUgTUJfTUFTSyAoMHgxZiA8PCA2KQorICB7IDUsIDYsIDAsIDAsIDAgfSwKKworICAvKiBUaGUgTUUgZmllbGQgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTUUgTUIgKyAxCisjZGVmaW5lIE1FX01BU0sgKDB4MWYgPDwgMSkKKyAgeyA1LCAxLCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhIHNpbmdsZQorICAgICBvcGVyYW5kIHdoaWNoIGlzIGEgYml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGJpdHMgdG8gc2VsZWN0LiAgVGhpcworICAgICBpcyBhIHR3byBvcGVyYW5kIGZvcm0gdXNpbmcgUFBDX09QRVJBTkRfTkVYVC4gIFNlZSB0aGUKKyAgICAgZGVzY3JpcHRpb24gaW4gb3Bjb2RlL3BwYy5oIGZvciB3aGF0IHRoaXMgbWVhbnMuICAqLworI2RlZmluZSBNQkUgTUUgKyAxCisgIHsgNSwgNiwgMCwgMCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfCBQUENfT1BFUkFORF9ORVhUIH0sCisgIHsgMzIsIDAsIGluc2VydF9tYmUsIGV4dHJhY3RfbWJlLCAwIH0sCisKKyAgLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2gKKyAgICAgYml0IGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLworI2RlZmluZSBNQjYgTUJFICsgMgorI2RlZmluZSBNRTYgTUI2CisjZGVmaW5lIE1CNl9NQVNLICgweDNmIDw8IDUpCisgIHsgNiwgNSwgaW5zZXJ0X21iNiwgZXh0cmFjdF9tYjYsIDAgfSwKKworICAvKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcworICAgICAwLiAgKi8KKyNkZWZpbmUgTkIgTUI2ICsgMQorICB7IDYsIDExLCBpbnNlcnRfbmIsIGV4dHJhY3RfbmIsIDAgfSwKKworICAvKiBUaGUgTlNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAgU0kgZmllbGQsIG9ubHkgbmVnYXRlZC4gICovCisjZGVmaW5lIE5TSSBOQiArIDEKKyAgeyAxNiwgMCwgaW5zZXJ0X25zaSwgZXh0cmFjdF9uc2ksCisgICAgICBQUENfT1BFUkFORF9ORUdBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBELCBEUywgWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgUkEgTlNJICsgMQorI2RlZmluZSBSQV9NQVNLICgweDFmIDw8IDE2KQorICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKKworICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZworICAgICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKKyAgICAgZXF1YWwgdGhlIFJUIGZpZWxkLiAgKi8KKyNkZWZpbmUgUkFMIFJBICsgMQorICB7IDUsIDE2LCBpbnNlcnRfcmFsLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKKworICAvKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQorICAgICByZXN0cmljdGlvbnMuICAqLworI2RlZmluZSBSQU0gUkFMICsgMQorICB7IDUsIDE2LCBpbnNlcnRfcmFtLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKKworICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZworICAgICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQorICAgICBmaWVsZCBtYXkgbm90IGJlIHplcm8uICAqLworI2RlZmluZSBSQVMgUkFNICsgMQorICB7IDUsIDE2LCBpbnNlcnRfcmFzLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKKworICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgUkIgUkFTICsgMQorI2RlZmluZSBSQl9NQVNLICgweDFmIDw8IDExKQorICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKKworICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcworICAgICB0aGUgUlMgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZAorICAgICBtbmVtb25pY3MgbGlrZSBtci4gICovCisjZGVmaW5lIFJCUyBSQiArIDEKKyAgeyA1LCAxLCBpbnNlcnRfcmJzLCBleHRyYWN0X3JicywgUFBDX09QRVJBTkRfRkFLRSB9LAorCisgIC8qIFRoZSBSUyBmaWVsZCBpbiBhIEQsIERTLCBYLCBYRlgsIFhTLCBNLCBNRCBvciBNRFMgZm9ybQorICAgICBpbnN0cnVjdGlvbiBvciB0aGUgUlQgZmllbGQgaW4gYSBELCBEUywgWCwgWEZYIG9yIFhPIGZvcm0KKyAgICAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBSUyBSQlMgKyAxCisjZGVmaW5lIFJUIFJTCisjZGVmaW5lIFJUX01BU0sgKDB4MWYgPDwgMjEpCisgIHsgNSwgMjEsIDAsIDAsIFBQQ19PUEVSQU5EX0dQUiB9LAorCisgIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBYIG9yIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNIIFJTICsgMQorI2RlZmluZSBTSF9NQVNLICgweDFmIDw8IDExKQorICB7IDUsIDExLCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KKyNkZWZpbmUgU0g2IFNIICsgMQorI2RlZmluZSBTSDZfTUFTSyAoKDB4MWYgPDwgMTEpIHwgKDEgPDwgMSkpCisgIHsgNiwgMSwgaW5zZXJ0X3NoNiwgZXh0cmFjdF9zaDYsIDAgfSwKKworICAvKiBUaGUgU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTSSBTSDYgKyAxCisgIHsgMTYsIDAsIDAsIDAsIFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHdlIGFjY2VwdCBhIHdpZGUgcmFuZ2UKKyAgICAgb2YgcG9zaXRpdmUgdmFsdWVzLiAgKi8KKyNkZWZpbmUgU0lTSUdOT1BUIFNJICsgMQorICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9TSUdORUQgfCBQUENfT1BFUkFORF9TSUdOT1BUIH0sCisKKyAgLyogVGhlIFNQUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZmxpcHBlZC0tdGhlCisgICAgIGxvd2VyIDUgYml0cyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciA1IGFuZCB2aWNlLSB2ZXJzYS4gICovCisjZGVmaW5lIFNQUiBTSVNJR05PUFQgKyAxCisjZGVmaW5lIFNQUl9NQVNLICgweDNmZiA8PCAxMSkKKyAgeyAxMCwgMTEsIGluc2VydF9zcHIsIGV4dHJhY3Rfc3ByLCAwIH0sCisKKyAgLyogVGhlIEJBVCBpbmRleCBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1pYmF0W2x1XSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNQUkJBVCBTUFIgKyAxCisjZGVmaW5lIFNQUkJBVF9NQVNLICgweDMgPDwgMTcpCisgIHsgMiwgMTcsIDAsIDAsIDAgfSwKKworICAvKiBUaGUgU1BSRyByZWdpc3RlciBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1zcHJnIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgU1BSRyBTUFJCQVQgKyAxCisjZGVmaW5lIFNQUkdfTUFTSyAoMHgzIDw8IDE2KQorICB7IDIsIDE2LCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIFNSIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNSIFNQUkcgKyAxCisgIHsgNCwgMTYsIDAsIDAsIDAgfSwKKworICAvKiBUaGUgU1YgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgU1YgU1IgKyAxCisgIHsgMTQsIDIsIDAsIDAsIDAgfSwKKworICAvKiBUaGUgVEJSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIHRoZSBTUFIKKyAgICAgZmllbGQsIGJ1dCBpdCBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIFRCUiBTViArIDEKKyAgeyAxMCwgMTEsIGluc2VydF90YnIsIGV4dHJhY3RfdGJyLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBUTyBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVE8gVEJSICsgMQorI2RlZmluZSBUT19NQVNLICgweDFmIDw8IDIxKQorICB7IDUsIDIxLCAwLCAwLCAwIH0sCisKKyAgLyogVGhlIFUgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVSBUTyArIDEKKyAgeyA0LCAxMiwgMCwgMCwgMCB9LAorCisgIC8qIFRoZSBVSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFVJIFUgKyAxCisgIHsgMTYsIDAsIDAsIDAsIDAgfSwKK307CisKKy8qIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBpbnNlcnQgYW5kIGV4dHJhY3QgY29tcGxpY2F0ZWQgb3BlcmFuZHMuICAqLworCisvKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKKyAgIHRoZSBCVCBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4KKyAgIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJUIGZpZWxkIGludG8gdGhlIEJBIGZpZWxkLAorICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCisgICBzYW1lLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2JhdCAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMjEpICYgMHgxZikgPDwgMTYpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9iYXQgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKKyAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTYpICYgMHgxZikpCisgICAgKmludmFsaWQgPSAxOworICByZXR1cm4gMDsKK30KKworLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCisgICB0aGUgQkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuCisgICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCQSBmaWVsZCBpbnRvIHRoZSBCQiBmaWVsZCwKKyAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQorICAgc2FtZS4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9iYmEgKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDE2KSAmIDB4MWYpIDw8IDExKTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfYmJhIChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCisgICAgICAmJiAoKGluc24gPj4gMTYpICYgMHgxZikgIT0gKChpbnNuID4+IDExKSAmIDB4MWYpKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKKyAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2JkIChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgbG9uZworZXh0cmFjdF9iZCAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKKyAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKKyAgZWxzZQorICAgIHJldHVybiBpbnNuICYgMHhmZmZjOworfQorCisvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgorICAgVGhpcyBtb2RpZmllciBtZWFucyB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLgorICAgV2UgbXVzdCBzZXQgdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCB0byAxIGlmIHRoZSBvZmZzZXQgaXMKKyAgIG5lZ2F0aXZlLiAgV2hlbiBleHRyYWN0aW5nLCB3ZSByZXF1aXJlIHRoYXQgdGhlIHkgYml0IGJlIDEgYW5kIHRoYXQKKyAgIHRoZSBvZmZzZXQgYmUgcG9zaXRpdmUsIHNpbmNlIGlmIHRoZSB5IGJpdCBpcyAwIHdlIGp1c3Qgd2FudCB0bworICAgcHJpbnQgdGhlIG5vcm1hbCBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9iZG0gKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgIT0gMCkKKyAgICBpbnNuIHw9IDEgPDwgMjE7CisgIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfYmRtIChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCisgICAgICAmJiAoKGluc24gJiAoMSA8PCAyMSkpID09IDAKKwkgIHx8IChpbnNuICYgKDEgPDwgMTUpKSA9PSAwKSkKKyAgICAqaW52YWxpZCA9IDE7CisgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKKyAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKKyAgZWxzZQorICAgIHJldHVybiBpbnNuICYgMHhmZmZjOworfQorCisvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkLgorICAgVGhpcyBpcyBsaWtlIEJETSwgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUKKyAgIHRha2VuLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2JkcCAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAoKHZhbHVlICYgMHg4MDAwKSA9PSAwKQorICAgIGluc24gfD0gMSA8PCAyMTsKKyAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9iZHAgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKKyAgICAgICYmICgoaW5zbiAmICgxIDw8IDIxKSkgPT0gMAorCSAgfHwgKGluc24gJiAoMSA8PCAxNSkpICE9IDApKQorICAgICppbnZhbGlkID0gMTsKKyAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQorICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOworICBlbHNlCisgICAgcmV0dXJuIGluc24gJiAweGZmZmM7Cit9CisKKy8qIENoZWNrIGZvciBsZWdhbCB2YWx1ZXMgb2YgYSBCTyBmaWVsZC4gICovCisKK3N0YXRpYyBpbnQKK3ZhbGlkX2JvICh2YWx1ZSkKKyAgICAgbG9uZyB2YWx1ZTsKK3sKKyAgLyogQ2VydGFpbiBlbmNvZGluZ3MgaGF2ZSBiaXRzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIHplcm8uICBUaGVzZQorICAgICBhcmUgKHogbXVzdCBiZSB6ZXJvLCB5IG1heSBiZSBhbnl0aGluZyk6CisgICAgICAgICAwMDF6eQorCSAwMTF6eQorCSAxejAweQorCSAxejAxeQorCSAxejF6egorICAgICAqLworICBzd2l0Y2ggKHZhbHVlICYgMHgxNCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDB4NDoKKyAgICAgIHJldHVybiAodmFsdWUgJiAweDIpID09IDA7CisgICAgY2FzZSAweDEwOgorICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4OCkgPT0gMDsKKyAgICBjYXNlIDB4MTQ6CisgICAgICByZXR1cm4gdmFsdWUgPT0gMHgxNDsKKyAgICB9Cit9CisKKy8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFdhcm4gYWJvdXQgYXR0ZW1wdHMgdG8gc2V0CisgICB0aGUgZmllbGQgdG8gYW4gaWxsZWdhbCB2YWx1ZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfYm8gKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTAorICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQorICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIpOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAyMSk7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X2JvIChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgbG9uZyB2YWx1ZTsKKworICB2YWx1ZSA9IChpbnNuID4+IDIxKSAmIDB4MWY7CisgIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAorICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBvciAtIG1vZGlmaWVyIGlzCisgICB1c2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBCTyBmaWVsZCwgYnV0IGl0IG11c3QgYmUgZXZlbi4gIFdoZW4KKyAgIGV4dHJhY3RpbmcgaXQsIHdlIGZvcmNlIGl0IHRvIGJlIGV2ZW4uICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2JvZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIHZhbGlkX2JvICh2YWx1ZSkpCisJKmVycm1zZyA9IF8oImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIik7CisgICAgICBlbHNlIGlmICgodmFsdWUgJiAxKSAhPSAwKQorCSplcnJtc2cgPSBfKCJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIpOworICAgIH0KKyAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMjEpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9ib2UgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBsb25nIHZhbHVlOworCisgIHZhbHVlID0gKGluc24gPj4gMjEpICYgMHgxZjsKKyAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCisgICAgICAmJiAhIHZhbGlkX2JvICh2YWx1ZSkpCisgICAgKmludmFsaWQgPSAxOworICByZXR1cm4gdmFsdWUgJiAweDFlOworfQorCisvKiBUaGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKKyAgIGxvd2VyIHR3byBiaXRzIGFyZSBmb3JjZWQgdG8gemVyby4gICovCisKKy8qQVJHU1VTRUQqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9kcyAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGxvbmcKK2V4dHJhY3RfZHMgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCisgICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7CisgIGVsc2UKKyAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKK30KKworLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKKyAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2xpIChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIGlmICgodmFsdWUgJiAzKSAhPSAwICYmIGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKKyAgICAqZXJybXNnID0gXygiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0Iik7CisgIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHgzZmZmZmZjKTsKK30KKworLypBUkdTVVNFRCovCitzdGF0aWMgbG9uZworZXh0cmFjdF9saSAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIGlmICgoaW5zbiAmIDB4MjAwMDAwMCkgIT0gMCkKKyAgICByZXR1cm4gKGluc24gJiAweDNmZmZmZmMpIC0gMHg0MDAwMDAwOworICBlbHNlCisgICAgcmV0dXJuIGluc24gJiAweDNmZmZmZmM7Cit9CisKKy8qIFRoZSBNQiBhbmQgTUUgZmllbGRzIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbiBleHByZXNzZWQgYXMgYSBzaW5nbGUKKyAgIG9wZXJhbmQgd2hpY2ggaXMgaXRzZWxmIGEgYml0bWFzay4gIFRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGFsd2F5cworICAgbWFya3MgaXQgYXMgaW52YWxpZCwgc2luY2Ugd2UgbmV2ZXIgd2FudCB0byByZWNvZ25pemUgYW4KKyAgIGluc3RydWN0aW9uIHdoaWNoIHVzZXMgYSBmaWVsZCBvZiB0aGlzIHR5cGUuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X21iZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICB1bnNpZ25lZCBsb25nIHV2YWwsIG1hc2s7CisgIGludCBtYiwgbWUsIG14LCBjb3VudCwgbGFzdDsKKworICB1dmFsID0gdmFsdWU7CisKKyAgaWYgKHV2YWwgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQorCSplcnJtc2cgPSBfKCJpbGxlZ2FsIGJpdG1hc2siKTsKKyAgICAgIHJldHVybiBpbnNuOworICAgIH0KKworICBtYiA9IDA7CisgIG1lID0gMzI7CisgIGlmICgodXZhbCAmIDEpICE9IDApCisgICAgbGFzdCA9IDE7CisgIGVsc2UKKyAgICBsYXN0ID0gMDsKKyAgY291bnQgPSAwOworCisgIC8qIG1iOiBsb2NhdGlvbiBvZiBsYXN0IDAtPjEgdHJhbnNpdGlvbiAqLworICAvKiBtZTogbG9jYXRpb24gb2YgbGFzdCAxLT4wIHRyYW5zaXRpb24gKi8KKyAgLyogY291bnQ6ICMgdHJhbnNpdGlvbnMgKi8KKworICBmb3IgKG14ID0gMCwgbWFzayA9IDEgPDwgMzE7IG14IDwgMzI7ICsrbXgsIG1hc2sgPj49IDEpCisgICAgeworICAgICAgaWYgKCh1dmFsICYgbWFzaykgJiYgIWxhc3QpCisJeworCSAgKytjb3VudDsKKwkgIG1iID0gbXg7CisJICBsYXN0ID0gMTsKKwl9CisgICAgICBlbHNlIGlmICghKHV2YWwgJiBtYXNrKSAmJiBsYXN0KQorCXsKKwkgICsrY291bnQ7CisJICBtZSA9IG14OworCSAgbGFzdCA9IDA7CisJfQorICAgIH0KKyAgaWYgKG1lID09IDApCisgICAgbWUgPSAzMjsKKworICBpZiAoY291bnQgIT0gMiAmJiAoY291bnQgIT0gMCB8fCAhIGxhc3QpKQorICAgIHsKKyAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCisJKmVycm1zZyA9IF8oImlsbGVnYWwgYml0bWFzayIpOworICAgIH0KKworICByZXR1cm4gaW5zbiB8IChtYiA8PCA2KSB8ICgobWUgLSAxKSA8PCAxKTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfbWJlIChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgbG9uZyByZXQ7CisgIGludCBtYiwgbWU7CisgIGludCBpOworCisgIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCkKKyAgICAqaW52YWxpZCA9IDE7CisKKyAgbWIgPSAoaW5zbiA+PiA2KSAmIDB4MWY7CisgIG1lID0gKGluc24gPj4gMSkgJiAweDFmOworICBpZiAobWIgPCBtZSArIDEpCisgICAgeworICAgICAgcmV0ID0gMDsKKyAgICAgIGZvciAoaSA9IG1iOyBpIDw9IG1lOyBpKyspCisJcmV0IHw9IChsb25nKSAxIDw8ICgzMSAtIGkpOworICAgIH0KKyAgZWxzZSBpZiAobWIgPT0gbWUgKyAxKQorICAgIHJldCA9IH4wOworICBlbHNlIC8qIChtYiA+IG1lICsgMSkgKi8KKyAgICB7CisgICAgICByZXQgPSB+IChsb25nKSAwOworICAgICAgZm9yIChpID0gbWUgKyAxOyBpIDwgbWI7IGkrKykKKwlyZXQgJj0gfiAoKGxvbmcpIDEgPDwgKDMxIC0gaSkpOworICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggYml0CisgICBpcyB3cmFwcGVkIHRvIHRoZSBsb3cgZW5kLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X21iNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCA2KSB8ICh2YWx1ZSAmIDB4MjApOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBsb25nCitleHRyYWN0X21iNiAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIHJldHVybiAoKGluc24gPj4gNikgJiAweDFmKSB8IChpbnNuICYgMHgyMCk7Cit9CisKKy8qIFRoZSBOQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgdmFsdWUgMzIgaXMgc3RvcmVkIGFzCisgICAwLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9uYiAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMzIpCisgICAgKmVycm1zZyA9IF8oInZhbHVlIG91dCBvZiByYW5nZSIpOworICBpZiAodmFsdWUgPT0gMzIpCisgICAgdmFsdWUgPSAwOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGxvbmcKK2V4dHJhY3RfbmIgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBsb25nIHJldDsKKworICByZXQgPSAoaW5zbiA+PiAxMSkgJiAweDFmOworICBpZiAocmV0ID09IDApCisgICAgcmV0ID0gMzI7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBOU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBTSQorICAgZmllbGQsIG9ubHkgbmVnYXRlZC4gIFRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGFsd2F5cyBtYXJrcyBpdCBhcworICAgaW52YWxpZCwgc2luY2Ugd2UgbmV2ZXIgd2FudCB0byByZWNvZ25pemUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcworICAgYSBmaWVsZCBvZiB0aGlzIHR5cGUuICAqLworCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfbnNpIChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIHJldHVybiBpbnNuIHwgKCgtIHZhbHVlKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X25zaSAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCkKKyAgICAqaW52YWxpZCA9IDE7CisgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKKyAgICByZXR1cm4gLSAoKGxvbmcpKGluc24gJiAweGZmZmYpIC0gMHgxMDAwMCk7CisgIGVsc2UKKyAgICByZXR1cm4gLSAobG9uZykoaW5zbiAmIDB4ZmZmZik7Cit9CisKKy8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCisgICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKKyAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfcmFsIChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIGlmICh2YWx1ZSA9PSAwCisgICAgICB8fCAodW5zaWduZWQgbG9uZykgdmFsdWUgPT0gKChpbnNuID4+IDIxKSAmIDB4MWYpKQorICAgICplcnJtc2cgPSAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Cit9CisKKy8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCisgICByZXN0cmljdGlvbnMuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3JhbSAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID49ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKKyAgICAqZXJybXNnID0gXygiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIpOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Cit9CisKKy8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCisgICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQorICAgZmllbGQgbWF5IG5vdCBiZSB6ZXJvLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9yYXMgKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKK3sKKyAgaWYgKHZhbHVlID09IDApCisgICAgKmVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIik7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KTsKK30KKworLyogVGhlIFJCIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKKyAgIHRoZSBSUyBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkCisgICBtbmVtb25pY3MgbGlrZSBtci4gIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgRkFLRS4gIFRoZSBpbnNlcnRpb24KKyAgIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwgYW5kIHRoZQorICAgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3JicyAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMjEpICYgMHgxZikgPDwgMTEpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9yYnMgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKKyAgICAgICYmICgoaW5zbiA+PiAyMSkgJiAweDFmKSAhPSAoKGluc24gPj4gMTEpICYgMHgxZikpCisgICAgKmludmFsaWQgPSAxOworICByZXR1cm4gMDsKK30KKworLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3NoNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSkgfCAoKHZhbHVlICYgMHgyMCkgPj4gNCk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIGxvbmcKK2V4dHJhY3Rfc2g2IChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqaW52YWxpZDsKK3sKKyAgcmV0dXJuICgoaW5zbiA+PiAxMSkgJiAweDFmKSB8ICgoaW5zbiA8PCA0KSAmIDB4MjApOworfQorCisvKiBUaGUgU1BSIGZpZWxkIGluIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBmbGlwcGVkLS10aGUKKyAgIGxvd2VyIDUgYml0cyBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciA1IGFuZCB2aWNlLSB2ZXJzYS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfc3ByIChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Cit7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNlMCkgPDwgNik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X3NwciAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKmludmFsaWQ7Cit7CisgIHJldHVybiAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7Cit9CisKKy8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgVGhpcyBpcyBqdXN0IGxpa2UgU1BSLCBidXQgaXQKKyAgIGlzIG9wdGlvbmFsLiAgV2hlbiBUQlIgaXMgb21pdHRlZCwgaXQgbXVzdCBiZSBpbnNlcnRlZCBhcyAyNjggKHRoZQorICAgbWFnaWMgbnVtYmVyIG9mIHRoZSBUQiByZWdpc3RlcikuICBUaGVzZSBmdW5jdGlvbnMgdHJlYXQgMAorICAgKGluZGljYXRpbmcgYW4gb21pdHRlZCBvcHRpb25hbCBvcGVyYW5kKSBhcyAyNjguICBUaGlzIG1lYW5zIHRoYXQKKyAgIGBgbWZ0YiA0LDAnJyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGlzIGRvZXMgbm90IG1hdHRlciB2ZXJ5CisgICBtdWNoLCBzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBkb2VzIG5vdCBkZWZpbmUgbWZ0YiBhcworICAgYWNjZXB0aW5nIGFueSB2YWx1ZXMgb3RoZXIgdGhhbiAyNjggb3IgMjY5LiAgKi8KKworI2RlZmluZSBUQiAoMjY4KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3RiciAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqZXJybXNnOworeworICBpZiAodmFsdWUgPT0gMCkKKyAgICB2YWx1ZSA9IFRCOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZTApIDw8IDYpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF90YnIgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICppbnZhbGlkOworeworICBsb25nIHJldDsKKworICByZXQgPSAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7CisgIGlmIChyZXQgPT0gVEIpCisgICAgcmV0ID0gMDsKKyAgcmV0dXJuIHJldDsKK30KKwwKKy8qIE1hY3JvcyB1c2VkIHRvIGZvcm0gb3Bjb2Rlcy4gICovCisKKy8qIFRoZSBtYWluIG9wY29kZS4gICovCisjZGVmaW5lIE9QKHgpICgoKCh1bnNpZ25lZCBsb25nKSh4KSkgJiAweDNmKSA8PCAyNikKKyNkZWZpbmUgT1BfTUFTSyBPUCAoMHgzZikKKworLyogVGhlIG1haW4gb3Bjb2RlIGNvbWJpbmVkIHdpdGggYSB0cmFwIGNvZGUgaW4gdGhlIFRPIGZpZWxkIG9mIGEgRAorICAgZm9ybSBpbnN0cnVjdGlvbi4gIFVzZWQgZm9yIGV4dGVuZGVkIG1uZW1vbmljcyBmb3IgdGhlIHRyYXAKKyAgIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIE9QVE8oeCx0bykgKE9QICh4KSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQorI2RlZmluZSBPUFRPX01BU0sgKE9QX01BU0sgfCBUT19NQVNLKQorCisvKiBUaGUgbWFpbiBvcGNvZGUgY29tYmluZWQgd2l0aCBhIGNvbXBhcmlzb24gc2l6ZSBiaXQgaW4gdGhlIEwgZmllbGQKKyAgIG9mIGEgRCBmb3JtIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gIFVzZWQgZm9yIGV4dGVuZGVkIG1uZW1vbmljcyBmb3IKKyAgIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIE9QTCh4LGwpIChPUCAoeCkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQorI2RlZmluZSBPUExfTUFTSyBPUEwgKDB4M2YsMSkKKworLyogQW4gQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQShvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmKSA8PCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKKyNkZWZpbmUgQV9NQVNLIEEgKDB4M2YsIDB4MWYsIDEpCisKKy8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkIgZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBBRlJCX01BU0sgKEFfTUFTSyB8IEZSQl9NQVNLKQorCisvKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJDIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgQUZSQ19NQVNLIChBX01BU0sgfCBGUkNfTUFTSykKKworLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQSBhbmQgRlJDIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIEFGUkFGUkNfTUFTSyAoQV9NQVNLIHwgRlJBX01BU0sgfCBGUkNfTUFTSykKKworLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCKG9wLCBhYSwgbGspIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGFhKSkgJiAxKSA8PCAxKSB8ICgobGspICYgMSkpCisjZGVmaW5lIEJfTUFTSyBCICgweDNmLCAxLCAxKQorCisvKiBBIEIgZm9ybSBpbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBCTyBmaWVsZC4gICovCisjZGVmaW5lIEJCTyhvcCwgYm8sIGFhLCBsaykgKEIgKChvcCksIChhYSksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGJvKSkgJiAweDFmKSA8PCAyMSkpCisjZGVmaW5lIEJCT19NQVNLIEJCTyAoMHgzZiwgMHgxZiwgMSwgMSkKKworLyogQSBCQk9fTUFTSyB3aXRoIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgcmVtb3ZlZC4gIFRoaXMgcGVybWl0cworICAgbWF0Y2hpbmcgYSBjb25kaXRpb25hbCBicmFuY2ggcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiB0aGUgeQorICAgYml0LiAgKi8KKyNkZWZpbmUgWV9NQVNLICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjEpCisjZGVmaW5lIEJCT1lfTUFTSyAoQkJPX01BU0sgJn4gWV9NQVNLKQorCisvKiBBIEIgZm9ybSBpbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBCTyBmaWVsZCBhbmQgdGhlIGNvbmRpdGlvbiBiaXRzIG9mCisgICB0aGUgQkkgZmllbGQuICAqLworI2RlZmluZSBCQk9DQihvcCwgYm8sIGNiLCBhYSwgbGspIFwKKyAgKEJCTyAoKG9wKSwgKGJvKSwgKGFhKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoY2IpKSAmIDB4MykgPDwgMTYpKQorI2RlZmluZSBCQk9DQl9NQVNLIEJCT0NCICgweDNmLCAweDFmLCAweDMsIDEsIDEpCisKKy8qIEEgQkJPQ0JfTUFTSyB3aXRoIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgcmVtb3ZlZC4gICovCisjZGVmaW5lIEJCT1lDQl9NQVNLIChCQk9DQl9NQVNLICZ+IFlfTUFTSykKKworLyogQSBCQk9ZQ0JfTUFTSyBpbiB3aGljaCB0aGUgQkkgZmllbGQgaXMgZml4ZWQuICAqLworI2RlZmluZSBCQk9ZQklfTUFTSyAoQkJPWUNCX01BU0sgfCBCSV9NQVNLKQorCisvKiBUaGUgbWFpbiBvcGNvZGUgbWFzayB3aXRoIHRoZSBSQSBmaWVsZCBjbGVhci4gICovCisjZGVmaW5lIERSQV9NQVNLIChPUF9NQVNLIHwgUkFfTUFTSykKKworLyogQSBEUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRFNPKG9wLCB4b3ApIChPUCAob3ApIHwgKCh4b3ApICYgMHgzKSkKKyNkZWZpbmUgRFNfTUFTSyBEU08gKDB4M2YsIDMpCisKKy8qIEFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIE0ob3AsIHJjKSAoT1AgKG9wKSB8ICgocmMpICYgMSkpCisjZGVmaW5lIE1fTUFTSyBNICgweDNmLCAxKQorCisvKiBBbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTUUgZmllbGQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgTU1FKG9wLCBtZSwgcmMpIChNICgob3ApLCAocmMpKSB8ICgoKCh1bnNpZ25lZCBsb25nKShtZSkpICYgMHgxZikgPDwgMSkpCisKKy8qIEFuIE1fTUFTSyB3aXRoIHRoZSBNQiBhbmQgTUUgZmllbGRzIGZpeGVkLiAgKi8KKyNkZWZpbmUgTU1CTUVfTUFTSyAoTV9NQVNLIHwgTUJfTUFTSyB8IE1FX01BU0spCisKKy8qIEFuIE1fTUFTSyB3aXRoIHRoZSBTSCBhbmQgTUUgZmllbGRzIGZpeGVkLiAgKi8KKyNkZWZpbmUgTVNITUVfTUFTSyAoTV9NQVNLIHwgU0hfTUFTSyB8IE1FX01BU0spCisKKy8qIEFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBNRChvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDcpIDw8IDIpIHwgKChyYykgJiAxKSkKKyNkZWZpbmUgTURfTUFTSyBNRCAoMHgzZiwgMHg3LCAxKQorCisvKiBBbiBNRF9NQVNLIHdpdGggdGhlIE1CIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgTURNQl9NQVNLIChNRF9NQVNLIHwgTUI2X01BU0spCisKKy8qIEFuIE1EX01BU0sgd2l0aCB0aGUgU0ggZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBNRFNIX01BU0sgKE1EX01BU0sgfCBTSDZfTUFTSykKKworLyogQW4gTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBNRFMob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHhmKSA8PCAxKSB8ICgocmMpICYgMSkpCisjZGVmaW5lIE1EU19NQVNLIE1EUyAoMHgzZiwgMHhmLCAxKQorCisvKiBBbiBNRFNfTUFTSyB3aXRoIHRoZSBNQiBmaWVsZCBmaXhlZC4gICovCisjZGVmaW5lIE1EU01CX01BU0sgKE1EU19NQVNLIHwgTUI2X01BU0spCisKKy8qIEFuIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTQyhvcCwgc2EsIGxrKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKShzYSkpICYgMSkgPDwgMSkgfCAoKGxrKSAmIDEpKQorI2RlZmluZSBTQ19NQVNLIChPUF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykweDNmZikgPDwgMTYpIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxKSB8IDEpCisKKy8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFgob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCisKKy8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBSQyBiaXQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgWFJDKG9wLCB4b3AsIHJjKSAoWCAoKG9wKSwgKHhvcCkpIHwgKChyYykgJiAxKSkKKworLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhfTUFTSyBYUkMgKDB4M2YsIDB4M2ZmLCAxKQorCisvKiBBbiBYX01BU0sgd2l0aCB0aGUgUkEgZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBYUkFfTUFTSyAoWF9NQVNLIHwgUkFfTUFTSykKKworLyogQW4gWF9NQVNLIHdpdGggdGhlIFJCIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgWFJCX01BU0sgKFhfTUFTSyB8IFJCX01BU0spCisKKy8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSVCBmaWVsZCBmaXhlZC4gICovCisjZGVmaW5lIFhSVF9NQVNLIChYX01BU0sgfCBSVF9NQVNLKQorCisvKiBBbiBYX01BU0sgd2l0aCB0aGUgUkEgYW5kIFJCIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIFhSQVJCX01BU0sgKFhfTUFTSyB8IFJBX01BU0sgfCBSQl9NQVNLKQorCisvKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgYW5kIFJBIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIFhSVFJBX01BU0sgKFhfTUFTSyB8IFJUX01BU0sgfCBSQV9NQVNLKQorCisvKiBBbiBYIGZvcm0gY29tcGFyaXNvbiBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhDTVBMKG9wLCB4b3AsIGwpIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQorCisvKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYQ01QX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjIpKQorCisvKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTCBmaWVsZAorICAgZml4ZWQuICAqLworI2RlZmluZSBYQ01QTF9NQVNLIChYQ01QX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIxKSkKKworLyogQW4gWCBmb3JtIHRyYXAgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgVE8gZmllbGQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgWFRPKG9wLCB4b3AsIHRvKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHRvKSkgJiAweDFmKSA8PCAyMSkpCisjZGVmaW5lIFhUT19NQVNLIChYX01BU0sgfCBUT19NQVNLKQorCisvKiBBbiBYRkwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhGTChvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCisjZGVmaW5lIFhGTF9NQVNLIChYRkwgKDB4M2YsIDB4M2ZmLCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjUpIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxNikpCisKKy8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTEsgZmllbGQgc2V0IHRvIDAuICAqLworI2RlZmluZSBYTChvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4M2ZmKSA8PCAxKSkKKworLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIHRoZSBMSyBmaWVsZC4gICovCisjZGVmaW5lIFhMTEsob3AsIHhvcCwgbGspIChYTCAoKG9wKSwgKHhvcCkpIHwgKChsaykgJiAxKSkKKworLyogVGhlIG1hc2sgZm9yIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYTF9NQVNLIFhMTEsgKDB4M2YsIDB4M2ZmLCAxKQorCisvKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGV4cGxpY2l0bHkgc2V0cyB0aGUgQk8gZmllbGQuICAqLworI2RlZmluZSBYTE8ob3AsIGJvLCB4b3AsIGxrKSBcCisgIChYTExLICgob3ApLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYm8pKSAmIDB4MWYpIDw8IDIxKSkKKyNkZWZpbmUgWExPX01BU0sgKFhMX01BU0sgfCBCT19NQVNLKQorCisvKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGV4cGxpY2l0bHkgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPCisgICBmaWVsZC4gICovCisjZGVmaW5lIFhMWUxLKG9wLCB4b3AsIHksIGxrKSAoWExMSyAoKG9wKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHkpKSAmIDEpIDw8IDIxKSkKKyNkZWZpbmUgWExZTEtfTUFTSyAoWExfTUFTSyB8IFlfTUFTSykKKworLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBzZXRzIHRoZSBCTyBmaWVsZCBhbmQgdGhlIGNvbmRpdGlvbgorICAgYml0cyBvZiB0aGUgQkkgZmllbGQuICAqLworI2RlZmluZSBYTE9DQihvcCwgYm8sIGNiLCB4b3AsIGxrKSBcCisgIChYTE8gKChvcCksIChibyksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShjYikpICYgMykgPDwgMTYpKQorI2RlZmluZSBYTE9DQl9NQVNLIFhMT0NCICgweDNmLCAweDFmLCAweDMsIDB4M2ZmLCAxKQorCisvKiBBbiBYTF9NQVNLIG9yIFhMWUxLX01BU0sgb3IgWExPQ0JfTUFTSyB3aXRoIHRoZSBCQiBmaWVsZCBmaXhlZC4gICovCisjZGVmaW5lIFhMQkJfTUFTSyAoWExfTUFTSyB8IEJCX01BU0spCisjZGVmaW5lIFhMWUJCX01BU0sgKFhMWUxLX01BU0sgfCBCQl9NQVNLKQorI2RlZmluZSBYTEJPQ0JCQl9NQVNLIChYTE9DQl9NQVNLIHwgQkJfTUFTSykKKworLyogQW4gWExfTUFTSyB3aXRoIHRoZSBCTyBhbmQgQkIgZmllbGRzIGZpeGVkLiAgKi8KKyNkZWZpbmUgWExCT0JCX01BU0sgKFhMX01BU0sgfCBCT19NQVNLIHwgQkJfTUFTSykKKworLyogQW4gWExfTUFTSyB3aXRoIHRoZSBCTywgQkkgYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIFhMQk9CSUJCX01BU0sgKFhMX01BU0sgfCBCT19NQVNLIHwgQklfTUFTSyB8IEJCX01BU0spCisKKy8qIEFuIFhPIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYTyhvcCwgeG9wLCBvZSwgcmMpIFwKKyAgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmZikgPDwgMSkgfCAoKCgodW5zaWduZWQgbG9uZykob2UpKSAmIDEpIDw8IDEwKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKKyNkZWZpbmUgWE9fTUFTSyBYTyAoMHgzZiwgMHgxZmYsIDEsIDEpCisKKy8qIEFuIFhPX01BU0sgd2l0aCB0aGUgUkIgZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBYT1JCX01BU0sgKFhPX01BU0sgfCBSQl9NQVNLKQorCisvKiBBbiBYUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWFMob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDIpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQorI2RlZmluZSBYU19NQVNLIFhTICgweDNmLCAweDFmZiwgMSkKKworLyogQSBtYXNrIGZvciB0aGUgRlhNIHZlcnNpb24gb2YgYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYRlhGWE1fTUFTSyAoWF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMCkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDExKSkKKworLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgRlhNIGZpZWxkIGZpbGxlZCBpbi4gICovCisjZGVmaW5lIFhGWE0ob3AsIHhvcCwgZnhtKSBcCisgIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoZnhtKSkgJiAweGZmKSA8PCAxMikpCisKKy8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4uICAqLworI2RlZmluZSBYU1BSKG9wLCB4b3AsIHNwcikgXAorICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNwcikpICYgMHgxZikgPDwgMTYpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNwcikpICYgMHgzZTApIDw8IDYpKQorI2RlZmluZSBYU1BSX01BU0sgKFhfTUFTSyB8IFNQUl9NQVNLKQorCisvKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluIGV4Y2VwdCBmb3IgdGhlCisgICBTUFJCQVQgZmllbGQuICAqLworI2RlZmluZSBYU1BSQkFUX01BU0sgKFhTUFJfTUFTSyAmfiBTUFJCQVRfTUFTSykKKworLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbiBleGNlcHQgZm9yIHRoZQorICAgU1BSRyBmaWVsZC4gICovCisjZGVmaW5lIFhTUFJHX01BU0sgKFhTUFJfTUFTSyAmfiBTUFJHX01BU0spCisKKy8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgZmlsbGVkIGluIGV4Y2VwdCB0aGUgRSBmaWVsZC4gICovCisjZGVmaW5lIFhFX01BU0sgKDB4ZmZmZjdmZmYpCisKKy8qIFRoZSBCTyBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCBjb25kaXRpb25hbCBicmFuY2ggbW5lbW9uaWNzLiAgKi8KKyNkZWZpbmUgQk9ETlpGCSgweDApCisjZGVmaW5lIEJPRE5aRlAJKDB4MSkKKyNkZWZpbmUgQk9EWkYJKDB4MikKKyNkZWZpbmUgQk9EWkZQCSgweDMpCisjZGVmaW5lIEJPRgkoMHg0KQorI2RlZmluZSBCT0ZQCSgweDUpCisjZGVmaW5lIEJPRE5aVAkoMHg4KQorI2RlZmluZSBCT0ROWlRQCSgweDkpCisjZGVmaW5lIEJPRFpUCSgweGEpCisjZGVmaW5lIEJPRFpUUAkoMHhiKQorI2RlZmluZSBCT1QJKDB4YykKKyNkZWZpbmUgQk9UUAkoMHhkKQorI2RlZmluZSBCT0ROWgkoMHgxMCkKKyNkZWZpbmUgQk9ETlpQCSgweDExKQorI2RlZmluZSBCT0RaCSgweDEyKQorI2RlZmluZSBCT0RaUAkoMHgxMykKKyNkZWZpbmUgQk9VCSgweDE0KQorCisvKiBUaGUgQkkgY29uZGl0aW9uIGJpdCBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCBjb25kaXRpb25hbCBicmFuY2gKKyAgIG1uZW1vbmljcy4gICovCisjZGVmaW5lIENCTFQJKDApCisjZGVmaW5lIENCR1QJKDEpCisjZGVmaW5lIENCRVEJKDIpCisjZGVmaW5lIENCU08JKDMpCisKKy8qIFRoZSBUTyBlbmNvZGluZ3MgdXNlZCBpbiBleHRlbmRlZCB0cmFwIG1uZW1vbmljcy4gICovCisjZGVmaW5lIFRPTEdUCSgweDEpCisjZGVmaW5lIFRPTExUCSgweDIpCisjZGVmaW5lIFRPRVEJKDB4NCkKKyNkZWZpbmUgVE9MR0UJKDB4NSkKKyNkZWZpbmUgVE9MTkwJKDB4NSkKKyNkZWZpbmUgVE9MTEUJKDB4NikKKyNkZWZpbmUgVE9MTkcJKDB4NikKKyNkZWZpbmUgVE9HVAkoMHg4KQorI2RlZmluZSBUT0dFCSgweGMpCisjZGVmaW5lIFRPTkwJKDB4YykKKyNkZWZpbmUgVE9MVAkoMHgxMCkKKyNkZWZpbmUgVE9MRQkoMHgxNCkKKyNkZWZpbmUgVE9ORwkoMHgxNCkKKyNkZWZpbmUgVE9ORQkoMHgxOCkKKyNkZWZpbmUgVE9VCSgweDFmKQorDAorLyogU21hbGxlciBuYW1lcyBmb3IgdGhlIGZsYWdzIHNvIGVhY2ggZW50cnkgaW4gdGhlIG9wY29kZXMgdGFibGUgd2lsbAorICAgZml0IG9uIGEgc2luZ2xlIGxpbmUuICAqLworI3VuZGVmCVBQQworI2RlZmluZSBQUEMgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9BTlkKKyNkZWZpbmUgUFBDQ09NCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQorI2RlZmluZSBQUEMzMiAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV8zMiB8IFBQQ19PUENPREVfQU5ZCisjZGVmaW5lIFBQQzY0ICAgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzY0IHwgUFBDX09QQ09ERV9BTlkKKyNkZWZpbmUgUFBDT05MWQlQUENfT1BDT0RFX1BQQworI2RlZmluZSBQUEM0MDMJUFBDCisjZGVmaW5lIFBQQzc1MAlQUEMKKyNkZWZpbmUgUFBDODYwCVBQQworI2RlZmluZQlQT1dFUiAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX0FOWQorI2RlZmluZQlQT1dFUjIJUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUE9XRVIyIHwgUFBDX09QQ09ERV9BTlkKKyNkZWZpbmUgUFBDUFdSMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMiB8IFBQQ19PUENPREVfQU5ZCisjZGVmaW5lCVBPV0VSMzIJUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfQU5ZIHwgUFBDX09QQ09ERV8zMgorI2RlZmluZQlDT00gICAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkKKyNkZWZpbmUJQ09NMzIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZIHwgUFBDX09QQ09ERV8zMgorI2RlZmluZQlNNjAxICAgIFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFXzYwMSB8IFBQQ19PUENPREVfQU5ZCisjZGVmaW5lIFBXUkNPTQlQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCisjZGVmaW5lCU1GREVDMQlQUENfT1BDT0RFX1BPV0VSCisjZGVmaW5lCU1GREVDMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxCisMCisvKiBUaGUgb3Bjb2RlIHRhYmxlLgorCisgICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6CisKKyAgIE5BTUUJICAgICBPUENPREUJTUFTSwkJRkxBR1MJCXsgT1BFUkFORFMgfQorCisgICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKKyAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KKyAgIEZMQUdTIGFyZSBmbGFncyBpbmRpY2F0ZWQgd2hhdCBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9uLgorICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCisKKyAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0CisgICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQorICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbworICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCisKK2NvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSBwb3dlcnBjX29wY29kZXNbXSA9IHsKK3sgInRkbGd0aSIsICBPUFRPKDIsVE9MR1QpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRsbHRpIiwgIE9QVE8oMixUT0xMVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGVxaSIsICAgT1BUTygyLFRPRVEpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRsZ2VpIiwgIE9QVE8oMixUT0xHRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGxubGkiLCAgT1BUTygyLFRPTE5MKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkbGxlaSIsICBPUFRPKDIsVE9MTEUpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRsbmdpIiwgIE9QVE8oMixUT0xORyksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGd0aSIsICAgT1BUTygyLFRPR1QpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRnZWkiLCAgIE9QVE8oMixUT0dFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkbmxpIiwgICBPUFRPKDIsVE9OTCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGx0aSIsICAgT1BUTygyLFRPTFQpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRsZWkiLCAgIE9QVE8oMixUT0xFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkbmdpIiwgICBPUFRPKDIsVE9ORyksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZG5laSIsICAgT1BUTygyLFRPTkUpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRpIiwgICAgIE9QKDIpLAlPUF9NQVNLLAlQUEM2NCwJCXsgVE8sIFJBLCBTSSB9IH0sCisKK3sgInR3bGd0aSIsICBPUFRPKDMsVE9MR1QpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsZ3RpIiwgICBPUFRPKDMsVE9MR1QpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bGx0aSIsICBPUFRPKDMsVE9MTFQpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsbHRpIiwgICBPUFRPKDMsVE9MTFQpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3ZXFpIiwgICBPUFRPKDMsVE9FUSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidGVxaSIsICAgIE9QVE8oMyxUT0VRKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2xnZWkiLCAgT1BUTygzLFRPTEdFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bGdlaSIsICAgT1BUTygzLFRPTEdFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2xubGkiLCAgT1BUTygzLFRPTE5MKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bG5saSIsICAgT1BUTygzLFRPTE5MKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2xsZWkiLCAgT1BUTygzLFRPTExFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bGxlaSIsICAgT1BUTygzLFRPTExFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2xuZ2kiLCAgT1BUTygzLFRPTE5HKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bG5naSIsICAgT1BUTygzLFRPTE5HKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2d0aSIsICAgT1BUTygzLFRPR1QpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRndGkiLCAgICBPUFRPKDMsVE9HVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHdnZWkiLCAgIE9QVE8oMyxUT0dFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0Z2VpIiwgICAgT1BUTygzLFRPR0UpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bmxpIiwgICBPUFRPKDMsVE9OTCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidG5saSIsICAgIE9QVE8oMyxUT05MKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2x0aSIsICAgT1BUTygzLFRPTFQpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsdGkiLCAgICBPUFRPKDMsVE9MVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHdsZWkiLCAgIE9QVE8oMyxUT0xFKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bGVpIiwgICAgT1BUTygzLFRPTEUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bmdpIiwgICBPUFRPKDMsVE9ORyksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidG5naSIsICAgIE9QVE8oMyxUT05HKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d25laSIsICAgT1BUTygzLFRPTkUpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRuZWkiLCAgICBPUFRPKDMsVE9ORSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHdpIiwgICAgIE9QKDMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFRPLCBSQSwgU0kgfSB9LAoreyAidGkiLCAgICAgIE9QKDMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFRPLCBSQSwgU0kgfSB9LAorCit7ICJtdWxsaSIsICAgT1AoNyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCit7ICJtdWxpIiwgICAgT1AoNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCisKK3sgInN1YmZpYyIsICBPUCg4KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKK3sgInNmaSIsICAgICBPUCg4KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKKworeyAiZG96aSIsICAgIE9QKDkpLAlPUF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFNJIH0gfSwKKworeyAiY21wbHdpIiwgIE9QTCgxMCwwKSwJT1BMX01BU0ssCVBQQ0NPTSwJCXsgT0JGLCBSQSwgVUkgfSB9LAoreyAiY21wbGRpIiwgIE9QTCgxMCwxKSwgT1BMX01BU0ssCVBQQzY0LAkJeyBPQkYsIFJBLCBVSSB9IH0sCit7ICJjbXBsaSIsICAgT1AoMTApLAlPUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgVUkgfSB9LAoreyAiY21wbGkiLCAgIE9QKDEwKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFVJIH0gfSwKKworeyAiY21wd2kiLCAgIE9QTCgxMSwwKSwJT1BMX01BU0ssCVBQQ0NPTSwJCXsgT0JGLCBSQSwgU0kgfSB9LAoreyAiY21wZGkiLCAgIE9QTCgxMSwxKSwJT1BMX01BU0ssCVBQQzY0LAkJeyBPQkYsIFJBLCBTSSB9IH0sCit7ICJjbXBpIiwgICAgT1AoMTEpLAlPUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgU0kgfSB9LAoreyAiY21waSIsICAgIE9QKDExKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFNJIH0gfSwKKworeyAiYWRkaWMiLCAgIE9QKDEyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKK3sgImFpIiwJICAgICBPUCgxMiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCit7ICJzdWJpYyIsICAgT1AoMTIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKKworeyAiYWRkaWMuIiwgIE9QKDEzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKK3sgImFpLiIsICAgICBPUCgxMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCit7ICJzdWJpYy4iLCAgT1AoMTMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKKworeyAibGkiLAkgICAgIE9QKDE0KSwJRFJBX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFNJIH0gfSwKK3sgImxpbCIsICAgICBPUCgxNCksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSSB9IH0sCit7ICJhZGRpIiwgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoreyAiY2FsIiwgICAgIE9QKDE0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoreyAic3ViaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCit7ICJsYSIsCSAgICAgT1AoMTQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQSB9IH0sCisKK3sgImxpcyIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoreyAibGl1IiwgICAgIE9QKDE1KSwJRFJBX01BU0ssCVBXUkNPTSwJCXsgUlQsIFNJU0lHTk9QVCB9IH0sCit7ICJhZGRpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULFJBLFNJU0lHTk9QVCB9IH0sCit7ICJjYXUiLCAgICAgT1AoMTUpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULFJBLFNJU0lHTk9QVCB9IH0sCit7ICJzdWJpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgTlNJIH0gfSwKKworeyAiYmRuei0iLCAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCit7ICJiZG56KyIsICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKK3sgImJkbnoiLCAgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCit7ICJiZG4iLCAgICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoreyAiYmRuemwtIiwgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCit7ICJiZG56bCsiLCAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKK3sgImJkbnpsIiwgICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCit7ICJiZG5sIiwgICAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoreyAiYmRuemEtIiwgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoreyAiYmRuemErIiwgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoreyAiYmRuemEiLCAgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFBDQ09NLAl7IEJEQSB9IH0sCit7ICJiZG5hIiwgICAgQkJPKDE2LEJPRE5aLDEsMCksIEJCT1lCSV9NQVNLLCBQV1JDT00sCXsgQkRBIH0gfSwKK3sgImJkbnpsYS0iLCBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKK3sgImJkbnpsYSsiLCBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKK3sgImJkbnpsYSIsICBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoreyAiYmRubGEiLCAgIEJCTygxNixCT0ROWiwxLDEpLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCit7ICJiZHotIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKK3sgImJkeisiLCAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoreyAiYmR6IiwgICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEIH0gfSwKK3sgImJkemwtIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoreyAiYmR6bCsiLCAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCit7ICJiZHpsIiwgICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkQgfSB9LAoreyAiYmR6YS0iLCAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoreyAiYmR6YSsiLCAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoreyAiYmR6YSIsICAgIEJCTygxNixCT0RaLDEsMCksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEQSB9IH0sCit7ICJiZHpsYS0iLCAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCit7ICJiZHpsYSsiLCAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCit7ICJiZHpsYSIsICAgQkJPKDE2LEJPRFosMSwxKSwgIEJCT1lCSV9NQVNLLCBDT00sCXsgQkRBIH0gfSwKK3sgImJsdC0iLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYmx0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJibHQiLCAgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYmx0bC0iLCAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJibHRsKyIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJsdGwiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJibHRhLSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJibHRhKyIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJibHRhIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJsdGxhLSIsICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJsdGxhKyIsICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJsdGxhIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYmd0LSIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJiZ3QrIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJndCIsICAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJiZ3RsLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJndGwrIiwgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYmd0bCIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJndGEtIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJndGErIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJndGEiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYmd0bGEtIiwgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYmd0bGErIiwgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmd0bGEiLCAgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJiZXEtIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJlcSsiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYmVxIiwgICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJlcWwtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYmVxbCsiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJiZXFsIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYmVxYS0iLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYmVxYSsiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmVxYSIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJiZXFsYS0iLCAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJiZXFsYSsiLCAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJiZXFsYSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJzby0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYnNvKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJic28iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYnNvbC0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJic29sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJzb2wiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJic29hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJic29hKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJic29hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJzb2xhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJzb2xhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJzb2xhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYnVuLSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJidW4rIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJ1biIsICAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCit7ICJidW5sLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJ1bmwrIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYnVubCIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKK3sgImJ1bmEtIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJ1bmErIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJ1bmEiLCAgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoreyAiYnVubGEtIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYnVubGErIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYnVubGEiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCit7ICJiZ2UtIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJnZSsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYmdlIiwgICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJnZWwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYmdlbCsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJiZ2VsIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYmdlYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYmdlYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmdlYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJiZ2VsYS0iLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJiZ2VsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJiZ2VsYSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJubC0iLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYm5sKyIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJibmwiLCAgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYm5sbC0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJibmxsKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJubGwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJibmxhLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJibmxhKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJibmxhIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJubGxhLSIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJubGxhKyIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJubGxhIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYmxlLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJibGUrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJsZSIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJibGVsLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJsZWwrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYmxlbCIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJsZWEtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJsZWErIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJsZWEiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYmxlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYmxlbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmxlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJibmctIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJuZysiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYm5nIiwgICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJuZ2wtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYm5nbCsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJibmdsIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYm5nYS0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYm5nYSsiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5nYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJibmdsYS0iLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJibmdsYSsiLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJibmdsYSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJuZS0iLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYm5lKyIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJibmUiLCAgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoreyAiYm5lbC0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJibmVsKyIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJuZWwiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJibmVhLSIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJibmVhKyIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJibmVhIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJuZWxhLSIsICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJuZWxhKyIsICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJuZWxhIiwgICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYm5zLSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCit7ICJibnMrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKK3sgImJucyIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCit7ICJibnNsLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJuc2wrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYm5zbCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJuc2EtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKK3sgImJuc2ErIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKK3sgImJuc2EiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYm5zbGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYm5zbGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5zbGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJibnUtIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKK3sgImJudSsiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoreyAiYm51IiwgICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKK3sgImJudWwtIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoreyAiYm51bCsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCit7ICJibnVsIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoreyAiYm51YS0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoreyAiYm51YSsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm51YSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCit7ICJibnVsYS0iLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCit7ICJibnVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCit7ICJibnVsYSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKK3sgImJkbnp0LSIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoreyAiYmRuenQrIiwgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCit7ICJiZG56dCIsICAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmRuenRsLSIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCit7ICJiZG56dGwrIiwgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKK3sgImJkbnp0bCIsICBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiZG56dGEtIiwgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCit7ICJiZG56dGErIiwgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCit7ICJiZG56dGEiLCAgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJkbnp0bGEtIixCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKK3sgImJkbnp0bGErIixCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKK3sgImJkbnp0bGEiLCBCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmRuemYtIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCit7ICJiZG56ZisiLCAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKK3sgImJkbnpmIiwgICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiZG56ZmwtIiwgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKK3sgImJkbnpmbCsiLCBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoreyAiYmRuemZsIiwgIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKK3sgImJkbnpmYS0iLCBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKK3sgImJkbnpmYSsiLCBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKK3sgImJkbnpmYSIsICBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmRuemZsYS0iLEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoreyAiYmRuemZsYSsiLEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoreyAiYmRuemZsYSIsIEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCit7ICJidC0iLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCit7ICJidCsiLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCit7ICJidCIsCSAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmJ0IiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKK3sgImJ0bC0iLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKK3sgImJ0bCsiLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKK3sgImJ0bCIsICAgICBCQk8oMTYsQk9ULDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiYnRsIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoreyAiYnRhLSIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKK3sgImJ0YSsiLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCit7ICJidGEiLCAgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJidGEiLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYnRsYS0iLCAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKK3sgImJ0bGErIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCit7ICJidGxhIiwgICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJidGxhIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmYtIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoreyAiYmYrIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoreyAiYmYiLAkgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKK3sgImJiZiIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiZmwtIiwgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCit7ICJiZmwrIiwgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCit7ICJiZmwiLCAgICAgQkJPKDE2LEJPRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmJmbCIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKK3sgImJmYS0iLCAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCit7ICJiZmErIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoreyAiYmZhIiwgICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCit7ICJiYmZhIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJmbGEtIiwgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCit7ICJiZmxhKyIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoreyAiYmZsYSIsICAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCit7ICJiYmZsYSIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJkenQtIiwgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoreyAiYmR6dCsiLCAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCit7ICJiZHp0IiwgICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiZHp0bC0iLCAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKK3sgImJkenRsKyIsICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoreyAiYmR6dGwiLCAgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmR6dGEtIiwgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoreyAiYmR6dGErIiwgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoreyAiYmR6dGEiLCAgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJkenRsYS0iLCBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKK3sgImJkenRsYSsiLCBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKK3sgImJkenRsYSIsICBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCit7ICJiZHpmLSIsICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKK3sgImJkemYrIiwgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoreyAiYmR6ZiIsICAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmR6ZmwtIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCit7ICJiZHpmbCsiLCAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKK3sgImJkemZsIiwgICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKK3sgImJkemZhLSIsICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKK3sgImJkemZhKyIsICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKK3sgImJkemZhIiwgICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCit7ICJiZHpmbGEtIiwgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCit7ICJiZHpmbGErIiwgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCit7ICJiZHpmbGEiLCAgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmMtIiwgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE0gfSB9LAoreyAiYmMrIiwgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRFAgfSB9LAoreyAiYmMiLAkgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEIH0gfSwKK3sgImJjbC0iLCAgICBCKDE2LDAsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNIH0gfSwKK3sgImJjbCsiLCAgICBCKDE2LDAsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQIH0gfSwKK3sgImJjbCIsICAgICBCKDE2LDAsMSksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCRCB9IH0sCit7ICJiY2EtIiwgICAgQigxNiwxLDApLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETUEgfSB9LAoreyAiYmNhKyIsICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRFBBIH0gfSwKK3sgImJjYSIsICAgICBCKDE2LDEsMCksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCREEgfSB9LAoreyAiYmNsYS0iLCAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE1BIH0gfSwKK3sgImJjbGErIiwgICBCKDE2LDEsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQQSB9IH0sCit7ICJiY2xhIiwgICAgQigxNiwxLDEpLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkRBIH0gfSwKKworeyAic2MiLCAgICAgIFNDKDE3LDEsMCksIDB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCit7ICJzdmMiLCAgICAgU0MoMTcsMCwwKSwgU0NfTUFTSywJUE9XRVIsCQl7IExFViwgRkwxLCBGTDIgfSB9LAoreyAic3ZjbCIsICAgIFNDKDE3LDAsMSksIFNDX01BU0ssCVBPV0VSLAkJeyBMRVYsIEZMMSwgRkwyIH0gfSwKK3sgInN2Y2EiLCAgICBTQygxNywxLDApLCBTQ19NQVNLLAlQV1JDT00sCQl7IFNWIH0gfSwKK3sgInN2Y2xhIiwgICBTQygxNywxLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgU1YgfSB9LAorCit7ICJiIiwJICAgICBCKDE4LDAsMCksCUJfTUFTSywJCUNPTSwJeyBMSSB9IH0sCit7ICJibCIsICAgICAgQigxOCwwLDEpLAlCX01BU0ssCQlDT00sCXsgTEkgfSB9LAoreyAiYmEiLCAgICAgIEIoMTgsMSwwKSwJQl9NQVNLLAkJQ09NLAl7IExJQSB9IH0sCit7ICJibGEiLCAgICAgQigxOCwxLDEpLAlCX01BU0ssCQlDT00sCXsgTElBIH0gfSwKKworeyAibWNyZiIsICAgIFhMKDE5LDApLAlYTEJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCisKK3sgImJsciIsICAgICBYTE8oMTksQk9VLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCit7ICJiciIsICAgICAgWExPKDE5LEJPVSwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFdSQ09NLAl7IDAgfSB9LAoreyAiYmxybCIsICAgIFhMTygxOSxCT1UsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKK3sgImJybCIsICAgICBYTE8oMTksQk9VLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQV1JDT00sCXsgMCB9IH0sCit7ICJiZG56bHIiLCAgWExPKDE5LEJPRE5aLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCit7ICJiZG56bHItIiwgWExPKDE5LEJPRE5aLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCit7ICJiZG56bHIrIiwgWExPKDE5LEJPRE5aUCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoreyAiYmRuemxybCIsIFhMTygxOSxCT0ROWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoreyAiYmRuemxybC0iLFhMTygxOSxCT0ROWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoreyAiYmRuemxybCsiLFhMTygxOSxCT0ROWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKK3sgImJkemxyIiwgICBYTE8oMTksQk9EWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoreyAiYmR6bHItIiwgIFhMTygxOSxCT0RaLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCit7ICJiZHpscisiLCAgWExPKDE5LEJPRFpQLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCit7ICJiZHpscmwiLCAgWExPKDE5LEJPRFosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKK3sgImJkemxybC0iLCBYTE8oMTksQk9EWiwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoreyAiYmR6bHJsKyIsIFhMTygxOSxCT0RaUCwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoreyAiYmx0bHIiLCAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYmx0bHItIiwgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmx0bHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJsdHIiLCAgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJsdGxybCIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJsdGxybC0iLCBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJsdGxybCsiLCBYTE9DQigxOSxCT1RQLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibHRybCIsICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJiZ3RsciIsICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJiZ3Rsci0iLCAgWExPQ0IoMTksQk9ULENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJiZ3RscisiLCAgWExPQ0IoMTksQk9UUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmd0ciIsICAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoreyAiYmd0bHJsIiwgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYmd0bHJsLSIsIFhMT0NCKDE5LEJPVCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmd0bHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJndHJsIiwgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJlcWxyIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJlcWxyLSIsICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJlcWxyKyIsICBYTE9DQigxOSxCT1RQLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJiZXFyIiwgICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJiZXFscmwiLCAgWExPQ0IoMTksQk9ULENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJiZXFscmwtIiwgWExPQ0IoMTksQk9ULENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJiZXFscmwrIiwgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmVxcmwiLCAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoreyAiYnNvbHIiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYnNvbHItIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYnNvbHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJzb3IiLCAgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJzb2xybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJzb2xybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJzb2xybCsiLCBYTE9DQigxOSxCT1RQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJic29ybCIsICAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJidW5sciIsICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJidW5sci0iLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJidW5scisiLCAgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYnVubHJsIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYnVubHJsLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYnVubHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJnZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJnZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJnZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJiZ2VyIiwgICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJiZ2VscmwiLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJiZ2VscmwtIiwgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJiZ2VscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmdlcmwiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoreyAiYm5sbHIiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYm5sbHItIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYm5sbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJubHIiLCAgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJubGxybCIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJubGxybC0iLCBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJubGxybCsiLCBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibmxybCIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJibGVsciIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJibGVsci0iLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibGVscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmxlciIsICAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoreyAiYmxlbHJsIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYmxlbHJsLSIsIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYmxlbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJsZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuZ2xyIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuZ2xyLSIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJuZ2xyKyIsICBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibmdyIiwgICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJibmdscmwiLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJibmdscmwtIiwgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibmdscmwrIiwgWExPQ0IoMTksQk9GUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYm5ncmwiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoreyAiYm5lbHIiLCAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYm5lbHItIiwgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYm5lbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJuZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuZWxybCIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJuZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibmVybCIsICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCit7ICJibnNsciIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJibnNsci0iLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibnNscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYm5zciIsICAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoreyAiYm5zbHJsIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoreyAiYm5zbHJsLSIsIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYm5zbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJuc3JsIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJudWxyIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJudWxyLSIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKK3sgImJudWxyKyIsICBYTE9DQigxOSxCT0ZQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibnVscmwiLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCit7ICJibnVscmwtIiwgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCit7ICJibnVscmwrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoreyAiYnRsciIsICAgIFhMTygxOSxCT1QsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYnRsci0iLCAgIFhMTygxOSxCT1QsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYnRscisiLCAgIFhMTygxOSxCT1RQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJidHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKK3sgImJ0bHJsIiwgICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJ0bHJsLSIsICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJ0bHJsKyIsICBYTE8oMTksQk9UUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiYnRybCIsICAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCit7ICJiZmxyIiwgICAgWExPKDE5LEJPRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJiZmxyLSIsICAgWExPKDE5LEJPRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZmxyKyIsICAgWExPKDE5LEJPRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmJmciIsICAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoreyAiYmZscmwiLCAgIFhMTygxOSxCT0YsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmZscmwtIiwgIFhMTygxOSxCT0YsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmZscmwrIiwgIFhMTygxOSxCT0ZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJiZnJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKK3sgImJkbnp0bHIiLCBYTE8oMTksQk9ETlpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJkbnp0bHItIixYTE8oMTksQk9ETlpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJkbnp0bHIrIixYTE8oMTksQk9ETlpUUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZG56dGxybCIsWExPKDE5LEJPRE5aVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJiZG56dGxybC0iLFhMTygxOSxCT0ROWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmRuenRscmwrIixYTE8oMTksQk9ETlpUUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZG56ZmxyIiwgWExPKDE5LEJPRE5aRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJiZG56ZmxyLSIsWExPKDE5LEJPRE5aRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZG56ZmxyKyIsWExPKDE5LEJPRE5aRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmRuemZscmwiLFhMTygxOSxCT0ROWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmRuemZscmwtIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJkbnpmbHJsKyIsWExPKDE5LEJPRE5aRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmR6dGxyIiwgIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJiZHp0bHItIiwgWExPKDE5LEJPRFpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJkenRscisiLCBYTE8oMTksQk9EWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJkenRscmwiLCBYTE8oMTksQk9EWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmR6dGxybC0iLFhMTygxOSxCT0RaVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZHp0bHJsKyIsWExPKDE5LEJPRFpUUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZHpmbHIiLCAgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJkemZsci0iLCBYTE8oMTksQk9EWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmR6ZmxyKyIsIFhMTygxOSxCT0RaRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoreyAiYmR6ZmxybCIsIFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJiZHpmbHJsLSIsWExPKDE5LEJPRFpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJkemZscmwrIixYTE8oMTksQk9EWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJjbHIiLCAgICBYTExLKDE5LDE2LDApLCBYTFlCQl9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSB9IH0sCit7ICJiY2xybCIsICAgWExMSygxOSwxNiwxKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoreyAiYmNscisiLCAgIFhMWUxLKDE5LDE2LDEsMCksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCit7ICJiY2xybCsiLCAgWExZTEsoMTksMTYsMSwxKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKK3sgImJjbHItIiwgICBYTFlMSygxOSwxNiwwLDApLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoreyAiYmNscmwtIiwgIFhMWUxLKDE5LDE2LDAsMSksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCit7ICJiY3IiLCAgICAgWExMSygxOSwxNiwwKSwgWExCQl9NQVNLLAlQV1JDT00sCQl7IEJPLCBCSSB9IH0sCit7ICJiY3JsIiwgICAgWExMSygxOSwxNiwxKSwgWExCQl9NQVNLLAlQV1JDT00sCQl7IEJPLCBCSSB9IH0sCisKK3sgImNybm90IiwgICBYTCgxOSwzMyksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAoreyAiY3Jub3IiLCAgIFhMKDE5LDMzKSwJWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKKworeyAicmZpIiwgICAgIFhMKDE5LDUwKSwJMHhmZmZmZmZmZiwJQ09NLAkJeyAwIH0gfSwKK3sgInJmY2kiLCAgICBYTCgxOSw1MSksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCisKK3sgInJmc3ZjIiwgICBYTCgxOSw4MiksCTB4ZmZmZmZmZmYsCVBPV0VSLAkJeyAwIH0gfSwKKworeyAiY3JhbmRjIiwgIFhMKDE5LDEyOSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCisKK3sgImlzeW5jIiwgICBYTCgxOSwxNTApLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoreyAiaWNzIiwgICAgIFhMKDE5LDE1MCksIDB4ZmZmZmZmZmYsCVBXUkNPTSwJCXsgMCB9IH0sCisKK3sgImNyY2xyIiwgICBYTCgxOSwxOTMpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQVQsIEJCQSB9IH0sCit7ICJjcnhvciIsICAgWEwoMTksMTkzKSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKKworeyAiY3JuYW5kIiwgIFhMKDE5LDIyNSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCisKK3sgImNyYW5kIiwgICBYTCgxOSwyNTcpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAorCit7ICJjcnNldCIsICAgWEwoMTksMjg5KSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkFULCBCQkEgfSB9LAoreyAiY3JlcXYiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCisKK3sgImNyb3JjIiwgICBYTCgxOSw0MTcpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAorCit7ICJjcm1vdmUiLCAgWEwoMTksNDQ5KSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkEsIEJCQSB9IH0sCit7ICJjcm9yIiwgICAgWEwoMTksNDQ5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKKworeyAiYmN0ciIsICAgIFhMTygxOSxCT1UsNTI4LDApLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCit7ICJiY3RybCIsICAgWExPKDE5LEJPVSw1MjgsMSksIFhMQk9CSUJCX01BU0ssIENPTSwJeyAwIH0gfSwKK3sgImJsdGN0ciIsICBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmx0Y3RyLSIsIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibHRjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJsdGN0cmwiLCBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmx0Y3RybC0iLFhMT0NCKDE5LEJPVCxDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibHRjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJndGN0ciIsICBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmd0Y3RyLSIsIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJiZ3RjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJndGN0cmwiLCBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmd0Y3RybC0iLFhMT0NCKDE5LEJPVCxDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJiZ3RjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJlcWN0ciIsICBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmVxY3RyLSIsIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJiZXFjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkVRLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJlcWN0cmwiLCBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmVxY3RybC0iLFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJiZXFjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkVRLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJzb2N0ciIsICBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYnNvY3RyLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJic29jdHIrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJzb2N0cmwiLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYnNvY3RybC0iLFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJic29jdHJsKyIsWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJ1bmN0ciIsICBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYnVuY3RyLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJidW5jdHIrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJ1bmN0cmwiLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYnVuY3RybC0iLFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJidW5jdHJsKyIsWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJnZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmdlY3RyLSIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJiZ2VjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJnZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmdlY3RybC0iLFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJiZ2VjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJubGN0ciIsICBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5sY3RyLSIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibmxjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJubGN0cmwiLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5sY3RybC0iLFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibmxjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJsZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmxlY3RyLSIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibGVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJsZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmxlY3RybC0iLFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibGVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJuZ2N0ciIsICBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5nY3RyLSIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibmdjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJuZ2N0cmwiLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5nY3RybC0iLFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibmdjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJuZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5lY3RyLSIsIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibmVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJuZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5lY3RybC0iLFhMT0NCKDE5LEJPRixDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibmVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkVRLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJuc2N0ciIsICBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5zY3RyLSIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibnNjdHIrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJuc2N0cmwiLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5zY3RybC0iLFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibnNjdHJsKyIsWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJudWN0ciIsICBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm51Y3RyLSIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibnVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJudWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm51Y3RybC0iLFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCit7ICJibnVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUFBDLAl7IENSIH0gfSwKK3sgImJ0Y3RyIiwgICBYTE8oMTksQk9ULDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYnRjdHItIiwgIFhMTygxOSxCT1QsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJidGN0cisiLCAgWExPKDE5LEJPVFAsNTI4LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJ0Y3RybCIsICBYTE8oMTksQk9ULDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYnRjdHJsLSIsIFhMTygxOSxCT1QsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJidGN0cmwrIiwgWExPKDE5LEJPVFAsNTI4LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJmY3RyIiwgICBYTE8oMTksQk9GLDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmZjdHItIiwgIFhMTygxOSxCT0YsNTI4LDApLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZmN0cisiLCAgWExPKDE5LEJPRlAsNTI4LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJmY3RybCIsICBYTE8oMTksQk9GLDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmZjdHJsLSIsIFhMTygxOSxCT0YsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCit7ICJiZmN0cmwrIiwgWExPKDE5LEJPRlAsNTI4LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKK3sgImJjY3RyIiwgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk8sIEJJIH0gfSwKK3sgImJjY3RyLSIsICBYTFlMSygxOSw1MjgsMCwwKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCit7ICJiY2N0cisiLCAgWExZTEsoMTksNTI4LDEsMCksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoreyAiYmNjdHJsIiwgIFhMTEsoMTksNTI4LDEpLCAgICAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCTywgQkkgfSB9LAoreyAiYmNjdHJsLSIsIFhMWUxLKDE5LDUyOCwwLDEpLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKK3sgImJjY3RybCsiLCBYTFlMSygxOSw1MjgsMSwxKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCit7ICJiY2MiLCAgICAgWExMSygxOSw1MjgsMCksICAgICBYTEJCX01BU0ssICAgUFdSQ09NLAl7IEJPLCBCSSB9IH0sCit7ICJiY2NsIiwgICAgWExMSygxOSw1MjgsMSksICAgICBYTEJCX01BU0ssICAgUFdSQ09NLAl7IEJPLCBCSSB9IH0sCisKK3sgInJsd2ltaSIsICBNKDIwLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCit7ICJybGltaSIsICAgTSgyMCwwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAorCit7ICJybHdpbWkuIiwgTSgyMCwxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoreyAicmxpbWkuIiwgIE0oMjAsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKKworeyAicm90bHdpIiwgIE1NRSgyMSwzMSwwKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKK3sgImNscmx3aSIsICBNTUUoMjEsMzEsMCksIE1TSE1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBNQiB9IH0sCit7ICJybHdpbm0iLCAgTSgyMSwwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoreyAicmxpbm0iLCAgIE0oMjEsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKK3sgInJvdGx3aS4iLCBNTUUoMjEsMzEsMSksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsUlMsU0ggfSB9LAoreyAiY2xybHdpLiIsIE1NRSgyMSwzMSwxKSwgTVNITUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIE1CIH0gfSwKK3sgInJsd2lubS4iLCBNKDIxLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCit7ICJybGlubS4iLCAgTSgyMSwxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAorCit7ICJybG1pIiwgICAgTSgyMiwwKSwJTV9NQVNLLAkJTTYwMSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKK3sgInJsbWkuIiwgICBNKDIyLDEpLAlNX01BU0ssCQlNNjAxLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAorCit7ICJyb3RsdyIsICAgTU1FKDIzLDMxLDApLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAicmx3bm0iLCAgIE0oMjMsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKK3sgInJsbm0iLCAgICBNKDIzLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCit7ICJyb3Rsdy4iLCAgTU1FKDIzLDMxLDEpLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAicmx3bm0uIiwgIE0oMjMsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKK3sgInJsbm0uIiwgICBNKDIzLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCisKK3sgIm5vcCIsICAgICBPUCgyNCksCTB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCit7ICJvcmkiLCAgICAgT1AoMjQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoreyAib3JpbCIsICAgIE9QKDI0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKKworeyAib3JpcyIsICAgIE9QKDI1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKK3sgIm9yaXUiLCAgICBPUCgyNSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCisKK3sgInhvcmkiLCAgICBPUCgyNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCit7ICJ4b3JpbCIsICAgT1AoMjYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAorCit7ICJ4b3JpcyIsICAgT1AoMjcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoreyAieG9yaXUiLCAgIE9QKDI3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKKworeyAiYW5kaS4iLCAgIE9QKDI4KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKK3sgImFuZGlsLiIsICBPUCgyOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCisKK3sgImFuZGlzLiIsICBPUCgyOSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCit7ICJhbmRpdS4iLCAgT1AoMjkpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAorCit7ICJyb3RsZGkiLCAgTUQoMzAsMCwwKSwgTURNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoreyAiY2xybGRpIiwgIE1EKDMwLDAsMCksIE1EU0hfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgTUI2IH0gfSwKK3sgInJsZGljbCIsICBNRCgzMCwwLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCit7ICJyb3RsZGkuIiwgTUQoMzAsMCwxKSwgTURNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoreyAiY2xybGRpLiIsIE1EKDMwLDAsMSksIE1EU0hfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgTUI2IH0gfSwKK3sgInJsZGljbC4iLCBNRCgzMCwwLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCisKK3sgInJsZGljciIsICBNRCgzMCwxLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1FNiB9IH0sCit7ICJybGRpY3IuIiwgTUQoMzAsMSwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNRTYgfSB9LAorCit7ICJybGRpYyIsICAgTUQoMzAsMiwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoreyAicmxkaWMuIiwgIE1EKDMwLDIsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKKworeyAicmxkaW1pIiwgIE1EKDMwLDMsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKK3sgInJsZGltaS4iLCBNRCgzMCwzLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCisKK3sgInJvdGxkIiwgICBNRFMoMzAsOCwwKSwgTURTTUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAicmxkY2wiLCAgIE1EUygzMCw4LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1CNiB9IH0sCit7ICJyb3RsZC4iLCAgTURTKDMwLDgsMSksIE1EU01CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInJsZGNsLiIsICBNRFMoMzAsOCwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNQjYgfSB9LAorCit7ICJybGRjciIsICAgTURTKDMwLDksMCksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKK3sgInJsZGNyLiIsICBNRFMoMzAsOSwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNRTYgfSB9LAorCit7ICJjbXB3IiwgICAgWENNUEwoMzEsMCwwKSwgWENNUExfTUFTSywgUFBDQ09NLAkJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXBkIiwgICAgWENNUEwoMzEsMCwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKK3sgImNtcCIsICAgICBYKDMxLDApLAlYQ01QX01BU0ssCVBQQ09OTFksCXsgQkYsIEwsIFJBLCBSQiB9IH0sCit7ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUExfTUFTSywJUFdSQ09NLAkJeyBCRiwgUkEsIFJCIH0gfSwKKworeyAidHdsZ3QiLCAgIFhUTygzMSw0LFRPTEdUKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsZ3QiLCAgICBYVE8oMzEsNCxUT0xHVCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0d2xsdCIsICAgWFRPKDMxLDQsVE9MTFQpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGxsdCIsICAgIFhUTygzMSw0LFRPTExUKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3ZXEiLCAgICBYVE8oMzEsNCxUT0VRKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRlcSIsICAgICBYVE8oMzEsNCxUT0VRKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bGdlIiwgICBYVE8oMzEsNCxUT0xHRSksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0bGdlIiwgICAgWFRPKDMxLDQsVE9MR0UpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdsbmwiLCAgIFhUTygzMSw0LFRPTE5MKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsbmwiLCAgICBYVE8oMzEsNCxUT0xOTCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0d2xsZSIsICAgWFRPKDMxLDQsVE9MTEUpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGxsZSIsICAgIFhUTygzMSw0LFRPTExFKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bG5nIiwgICBYVE8oMzEsNCxUT0xORyksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0bG5nIiwgICAgWFRPKDMxLDQsVE9MTkcpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdndCIsICAgIFhUTygzMSw0LFRPR1QpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGd0IiwgICAgIFhUTygzMSw0LFRPR1QpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdnZSIsICAgIFhUTygzMSw0LFRPR0UpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGdlIiwgICAgIFhUTygzMSw0LFRPR0UpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdubCIsICAgIFhUTygzMSw0LFRPTkwpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidG5sIiwgICAgIFhUTygzMSw0LFRPTkwpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdsdCIsICAgIFhUTygzMSw0LFRPTFQpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGx0IiwgICAgIFhUTygzMSw0LFRPTFQpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdsZSIsICAgIFhUTygzMSw0LFRPTEUpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGxlIiwgICAgIFhUTygzMSw0LFRPTEUpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHduZyIsICAgIFhUTygzMSw0LFRPTkcpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidG5nIiwgICAgIFhUTygzMSw0LFRPTkcpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHduZSIsICAgIFhUTygzMSw0LFRPTkUpLCBYVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidG5lIiwgICAgIFhUTygzMSw0LFRPTkUpLCBYVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHJhcCIsICAgIFhUTygzMSw0LFRPVSksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCit7ICJ0dyIsICAgICAgWCgzMSw0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBUTywgUkEsIFJCIH0gfSwKK3sgInQiLCAgICAgICBYKDMxLDQpLAlYX01BU0ssCQlQV1JDT00sCQl7IFRPLCBSQSwgUkIgfSB9LAorCit7ICJzdWJmYyIsICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic2YiLCAgICAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmMiLCAgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCit7ICJzdWJmYy4iLCAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic2YuIiwgICAgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmMuIiwgICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJCLCBSQSB9IH0sCit7ICJzdWJmY28iLCAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic2ZvIiwgICAgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmNvIiwgICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCit7ICJzdWJmY28uIiwgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic2ZvLiIsICAgIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmNvLiIsICBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCisKK3sgIm11bGhkdSIsICBYTygzMSw5LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGhkdS4iLCBYTygzMSw5LDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiYWRkYyIsICAgIFhPKDMxLDEwLDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJhIiwgICAgICAgWE8oMzEsMTAsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFkZGMuIiwgICBYTygzMSwxMCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYS4iLCAgICAgIFhPKDMxLDEwLDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJhZGRjbyIsICAgWE8oMzEsMTAsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFvIiwgICAgICBYTygzMSwxMCwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkY28uIiwgIFhPKDMxLDEwLDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJhby4iLCAgICAgWE8oMzEsMTAsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibXVsaHd1IiwgIFhPKDMxLDExLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxod3UuIiwgWE8oMzEsMTEsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibWZjciIsICAgIFgoMzEsMTkpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJUIH0gfSwKKworeyAibHdhcngiLCAgIFgoMzEsMjApLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJsZHgiLCAgICAgWCgzMSwyMSksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibHd6eCIsICAgIFgoMzEsMjMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibHgiLCAgICAgIFgoMzEsMjMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJzbHciLCAgICAgWFJDKDMxLDI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzbCIsICAgICAgWFJDKDMxLDI0LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzbHcuIiwgICAgWFJDKDMxLDI0LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzbC4iLCAgICAgWFJDKDMxLDI0LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImNudGx6dyIsICBYUkMoMzEsMjYsMCksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCit7ICJjbnRseiIsICAgWFJDKDMxLDI2LDApLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAoreyAiY250bHp3LiIsIFhSQygzMSwyNiwxKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKK3sgImNudGx6LiIsICBYUkMoMzEsMjYsMSksIFhSQl9NQVNLLCAJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAorCit7ICJzbGQiLCAgICAgWFJDKDMxLDI3LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsZC4iLCAgICBYUkMoMzEsMjcsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJhbmQiLCAgICAgWFJDKDMxLDI4LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJhbmQuIiwgICAgWFJDKDMxLDI4LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgIm1hc2tnIiwgICBYUkMoMzEsMjksMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJtYXNrZy4iLCAgWFJDKDMxLDI5LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJjbXBsdyIsICAgWENNUEwoMzEsMzIsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXBsZCIsICAgWENNUEwoMzEsMzIsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXBsIiwgICAgWCgzMSwzMiksCVhDTVBfTUFTSywJIFBQQ09OTFksCXsgQkYsIEwsIFJBLCBSQiB9IH0sCit7ICJjbXBsIiwgICAgWCgzMSwzMiksCVhDTVBMX01BU0ssCSBQV1JDT00sCXsgQkYsIFJBLCBSQiB9IH0sCisKK3sgInN1YmYiLCAgICBYTygzMSw0MCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic3ViIiwgICAgIFhPKDMxLDQwLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCit7ICJzdWJmLiIsICAgWE8oMzEsNDAsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1Yi4iLCAgICBYTygzMSw0MCwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoreyAic3ViZm8iLCAgIFhPKDMxLDQwLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJvIiwgICAgWE8oMzEsNDAsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKK3sgInN1YmZvLiIsICBYTygzMSw0MCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic3Viby4iLCAgIFhPKDMxLDQwLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCisKK3sgImxkdXgiLCAgICBYKDMxLDUzKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQUwsIFJCIH0gfSwKKworeyAiZGNic3QiLCAgIFgoMzEsNTQpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAorCit7ICJsd3p1eCIsICAgWCgzMSw1NSksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAoreyAibHV4IiwgICAgIFgoMzEsNTUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJjbnRsemQiLCAgWFJDKDMxLDU4LDApLCBYUkJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUyB9IH0sCit7ICJjbnRsemQuIiwgWFJDKDMxLDU4LDEpLCBYUkJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUyB9IH0sCisKK3sgImFuZGMiLCAgICBYUkMoMzEsNjAsMCksIFhfTUFTSywJQ09NLAl7IFJBLCBSUywgUkIgfSB9LAoreyAiYW5kYy4iLCAgIFhSQygzMSw2MCwxKSwgWF9NQVNLLAlDT00sCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInRkbGd0IiwgICBYVE8oMzEsNjgsVE9MR1QpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGxsdCIsICAgWFRPKDMxLDY4LFRPTExUKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRlcSIsICAgIFhUTygzMSw2OCxUT0VRKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbGdlIiwgICBYVE8oMzEsNjgsVE9MR0UpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGxubCIsICAgWFRPKDMxLDY4LFRPTE5MKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRsbGUiLCAgIFhUTygzMSw2OCxUT0xMRSksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbG5nIiwgICBYVE8oMzEsNjgsVE9MTkcpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGd0IiwgICAgWFRPKDMxLDY4LFRPR1QpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRnZSIsICAgIFhUTygzMSw2OCxUT0dFKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbmwiLCAgICBYVE8oMzEsNjgsVE9OTCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGx0IiwgICAgWFRPKDMxLDY4LFRPTFQpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRsZSIsICAgIFhUTygzMSw2OCxUT0xFKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbmciLCAgICBYVE8oMzEsNjgsVE9ORyksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZG5lIiwgICAgWFRPKDMxLDY4LFRPTkUpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGQiLAkgICAgIFgoMzEsNjgpLAlYX01BU0ssCQkgUFBDNjQsCQl7IFRPLCBSQSwgUkIgfSB9LAorCit7ICJtdWxoZCIsICAgWE8oMzEsNzMsMCwwKSwgWE9fTUFTSywJIFBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGhkLiIsICBYTygzMSw3MywwLDEpLCBYT19NQVNLLAkgUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtdWxodyIsICAgWE8oMzEsNzUsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGh3LiIsICBYTygzMSw3NSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtZm1zciIsICAgWCgzMSw4MyksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlQgfSB9LAorCit7ICJsZGFyeCIsICAgWCgzMSw4NCksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiZGNiZiIsICAgIFgoMzEsODYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAorCit7ICJsYnp4IiwgICAgWCgzMSw4NyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgIm5lZyIsICAgICBYTygzMSwxMDQsMCwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCit7ICJuZWcuIiwgICAgWE8oMzEsMTA0LDAsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAibmVnbyIsICAgIFhPKDMxLDEwNCwxLDApLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgIm5lZ28uIiwgICBYTygzMSwxMDQsMSwxKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCisKK3sgIm11bCIsICAgICBYTygzMSwxMDcsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWwuIiwgICAgWE8oMzEsMTA3LDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbyIsICAgIFhPKDMxLDEwNywxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bG8uIiwgICBYTygzMSwxMDcsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImNsZiIsICAgICBYKDMxLDExOCksIFhSQl9NQVNLLAlQT1dFUiwJCXsgUlQsIFJBIH0gfSwKKworeyAibGJ6dXgiLCAgIFgoMzEsMTE5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCisKK3sgIm5vdCIsICAgICBYUkMoMzEsMTI0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoreyAibm9yIiwgICAgIFhSQygzMSwxMjQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgIm5vdC4iLCAgICBYUkMoMzEsMTI0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQlMgfSB9LAoreyAibm9yLiIsICAgIFhSQygzMSwxMjQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAid3J0ZWUiLCAgIFgoMzEsMTMxKSwJWFJBUkJfTUFTSywJUFBDNDAzLAkJeyBSUyB9IH0sCisKK3sgInN1YmZlIiwgICBYTygzMSwxMzYsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmZSIsICAgICBYTygzMSwxMzYsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmZlLiIsICBYTygzMSwxMzYsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmZS4iLCAgICBYTygzMSwxMzYsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmZlbyIsICBYTygzMSwxMzYsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmZW8iLCAgICBYTygzMSwxMzYsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1YmZlby4iLCBYTygzMSwxMzYsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmZW8uIiwgICBYTygzMSwxMzYsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiYWRkZSIsICAgIFhPKDMxLDEzOCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWUiLCAgICAgIFhPKDMxLDEzOCwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkZS4iLCAgIFhPKDMxLDEzOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWUuIiwgICAgIFhPKDMxLDEzOCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkZW8iLCAgIFhPKDMxLDEzOCwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWVvIiwgICAgIFhPKDMxLDEzOCwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkZW8uIiwgIFhPKDMxLDEzOCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWVvLiIsICAgIFhPKDMxLDEzOCwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtdGNyIiwgICAgWEZYTSgzMSwxNDQsMHhmZiksIFhGWEZYTV9NQVNLfEZYTV9NQVNLLCBDT00sCXsgUlMgfX0sCit7ICJtdGNyZiIsICAgWCgzMSwxNDQpLAlYRlhGWE1fTUFTSywJQ09NLAkJeyBGWE0sIFJTIH0gfSwKKworeyAibXRtc3IiLCAgIFgoMzEsMTQ2KSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSUyB9IH0sCisKK3sgInN0ZHgiLCAgICBYKDMxLDE0OSksIFhfTUFTSywJCVBQQzY0LAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAic3R3Y3guIiwgIFhSQygzMSwxNTAsMSksIFhfTUFTSywJUFBDLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAic3R3eCIsICAgIFgoMzEsMTUxKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0eCIsICAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgInNscSIsICAgICBYUkMoMzEsMTUyLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic2xxLiIsICAgIFhSQygzMSwxNTIsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInNsZSIsICAgICBYUkMoMzEsMTUzLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic2xlLiIsICAgIFhSQygzMSwxNTMsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgIndydGVlaSIsICBYKDMxLDE2MyksCVhFX01BU0ssCVBQQzQwMywJCXsgRSB9IH0sCisKK3sgInN0ZHV4IiwgICBYKDMxLDE4MSksCVhfTUFTSywJCVBQQzY0LAkJeyBSUywgUkFTLCBSQiB9IH0sCisKK3sgInN0d3V4IiwgICBYKDMxLDE4MyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAoreyAic3R1eCIsICAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAic2xpcSIsICAgIFhSQygzMSwxODQsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzbGlxLiIsICAgWFJDKDMxLDE4NCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKKworeyAic3ViZnplIiwgIFhPKDMxLDIwMCwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInNmemUiLCAgICBYTygzMSwyMDAsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzdWJmemUuIiwgWE8oMzEsMjAwLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic2Z6ZS4iLCAgIFhPKDMxLDIwMCwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInN1YmZ6ZW8iLCBYTygzMSwyMDAsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzZnplbyIsICAgWE8oMzEsMjAwLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic3ViZnplby4iLFhPKDMxLDIwMCwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInNmemVvLiIsICBYTygzMSwyMDAsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCisKK3sgImFkZHplIiwgICBYTygzMSwyMDIsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhemUiLCAgICAgWE8oMzEsMjAyLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYWRkemUuIiwgIFhPKDMxLDIwMiwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImF6ZS4iLCAgICBYTygzMSwyMDIsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhZGR6ZW8iLCAgWE8oMzEsMjAyLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYXplbyIsICAgIFhPKDMxLDIwMiwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImFkZHplby4iLCBYTygzMSwyMDIsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhemVvLiIsICAgWE8oMzEsMjAyLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAorCit7ICJtdHNyIiwgICAgWCgzMSwyMTApLAlYUkJfTUFTS3woMTw8MjApLCBDT00zMiwJeyBTUiwgUlMgfSB9LAorCit7ICJzdGRjeC4iLCAgWFJDKDMxLDIxNCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgInN0YngiLCAgICBYKDMxLDIxNSksCVhfTUFTSywJCUNPTSwJeyBSUywgUkEsIFJCIH0gfSwKKworeyAic2xscSIsICAgIFhSQygzMSwyMTYsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzbGxxLiIsICAgWFJDKDMxLDIxNiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAic2xlcSIsICAgIFhSQygzMSwyMTcsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzbGVxLiIsICAgWFJDKDMxLDIxNywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAic3ViZm1lIiwgIFhPKDMxLDIzMiwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInNmbWUiLCAgICBYTygzMSwyMzIsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzdWJmbWUuIiwgWE8oMzEsMjMyLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic2ZtZS4iLCAgIFhPKDMxLDIzMiwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInN1YmZtZW8iLCBYTygzMSwyMzIsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzZm1lbyIsICAgWE8oMzEsMjMyLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic3ViZm1lby4iLFhPKDMxLDIzMiwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInNmbWVvLiIsICBYTygzMSwyMzIsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCisKK3sgIm11bGxkIiwgICBYTygzMSwyMzMsMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbGQuIiwgIFhPKDMxLDIzMywwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxsZG8iLCAgWE8oMzEsMjMzLDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGxkby4iLCBYTygzMSwyMzMsMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJhZGRtZSIsICAgWE8oMzEsMjM0LDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYW1lIiwgICAgIFhPKDMxLDIzNCwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImFkZG1lLiIsICBYTygzMSwyMzQsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhbWUuIiwgICAgWE8oMzEsMjM0LDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYWRkbWVvIiwgIFhPKDMxLDIzNCwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImFtZW8iLCAgICBYTygzMSwyMzQsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhZGRtZW8uIiwgWE8oMzEsMjM0LDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYW1lby4iLCAgIFhPKDMxLDIzNCwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKKworeyAibXVsbHciLCAgIFhPKDMxLDIzNSwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVscyIsICAgIFhPKDMxLDIzNSwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbHcuIiwgIFhPKDMxLDIzNSwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVscy4iLCAgIFhPKDMxLDIzNSwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbHdvIiwgIFhPKDMxLDIzNSwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsc28iLCAgIFhPKDMxLDIzNSwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbHdvLiIsIFhPKDMxLDIzNSwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsc28uIiwgIFhPKDMxLDIzNSwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtdHNyaW4iLCAgWCgzMSwyNDIpLAlYUkFfTUFTSywJUFBDMzIsCQl7IFJTLCBSQiB9IH0sCit7ICJtdHNyaSIsICAgWCgzMSwyNDIpLAlYUkFfTUFTSywJUE9XRVIzMiwJeyBSUywgUkIgfSB9LAorCit7ICJkY2J0c3QiLCAgWCgzMSwyNDYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAorCit7ICJzdGJ1eCIsICAgWCgzMSwyNDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKKworeyAic2xsaXEiLCAgIFhSQygzMSwyNDgsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzbGxpcS4iLCAgWFJDKDMxLDI0OCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKKworeyAiZG96IiwgICAgIFhPKDMxLDI2NCwwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRvei4iLCAgICBYTygzMSwyNjQsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkb3pvIiwgICAgWE8oMzEsMjY0LDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZG96by4iLCAgIFhPKDMxLDI2NCwxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiYWRkIiwgICAgIFhPKDMxLDI2NiwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4IiwgICAgIFhPKDMxLDI2NiwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkLiIsICAgIFhPKDMxLDI2NiwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4LiIsICAgIFhPKDMxLDI2NiwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkbyIsICAgIFhPKDMxLDI2NiwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4byIsICAgIFhPKDMxLDI2NiwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkby4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4by4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJsc2NieCIsICAgWFJDKDMxLDI3NywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxzY2J4LiIsICBYUkMoMzEsMjc3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJkY2J0IiwgICAgWCgzMSwyNzgpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAorCit7ICJsaHp4IiwgICAgWCgzMSwyNzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJpY2J0IiwgICAgWCgzMSwyNjIpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAorCit7ICJlcXYiLCAgICAgWFJDKDMxLDI4NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAiZXF2LiIsICAgIFhSQygzMSwyODQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAidGxiaWUiLCAgIFgoMzEsMzA2KSwJWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCit7ICJ0bGJpIiwgICAgWCgzMSwzMDYpLAlYUlRfTUFTSywJUE9XRVIsCQl7IFJBLCBSQiB9IH0sCisKK3sgImVjaXd4IiwgICBYKDMxLDMxMCksIFhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImxoenV4IiwgICBYKDMxLDMxMSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAorCit7ICJ4b3IiLCAgICAgWFJDKDMxLDMxNiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAieG9yLiIsICAgIFhSQygzMSwzMTYsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAibWZleGlzciIsIFhTUFIoMzEsMzIzLDY0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZleGllciIsIFhTUFIoMzEsMzIzLDY2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZicjAiLCAgIFhTUFIoMzEsMzIzLDEyOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mYnIxIiwgICBYU1BSKDMxLDMyMywxMjkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmJyMiIsICAgWFNQUigzMSwzMjMsMTMwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZicjMiLCAgIFhTUFIoMzEsMzIzLDEzMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mYnI0IiwgICBYU1BSKDMxLDMyMywxMzIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmJyNSIsICAgWFNQUigzMSwzMjMsMTMzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZicjYiLCAgIFhTUFIoMzEsMzIzLDEzNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mYnI3IiwgICBYU1BSKDMxLDMyMywxMzUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmJlYXIiLCAgWFNQUigzMSwzMjMsMTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZiZXNyIiwgIFhTUFIoMzEsMzIzLDE0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1maW9jciIsICBYU1BSKDMxLDMyMywxNjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWNyMCIsIFhTUFIoMzEsMzIzLDE5MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY3QwIiwgWFNQUigzMSwzMjMsMTkzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFkYTAiLCBYU1BSKDMxLDMyMywxOTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYXNhMCIsIFhTUFIoMzEsMzIzLDE5NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY2MwIiwgWFNQUigzMSwzMjMsMTk2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjcjEiLCBYU1BSKDMxLDMyMywyMDApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWN0MSIsIFhTUFIoMzEsMzIzLDIwMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hZGExIiwgWFNQUigzMSwzMjMsMjAyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFzYTEiLCBYU1BSKDMxLDMyMywyMDMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWNjMSIsIFhTUFIoMzEsMzIzLDIwNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY3IyIiwgWFNQUigzMSwzMjMsMjA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjdDIiLCBYU1BSKDMxLDMyMywyMDkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWRhMiIsIFhTUFIoMzEsMzIzLDIxMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hc2EyIiwgWFNQUigzMSwzMjMsMjExKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjYzIiLCBYU1BSKDMxLDMyMywyMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWNyMyIsIFhTUFIoMzEsMzIzLDIxNiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY3QzIiwgWFNQUigzMSwzMjMsMjE3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFkYTMiLCBYU1BSKDMxLDMyMywyMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYXNhMyIsIFhTUFIoMzEsMzIzLDIxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY2MzIiwgWFNQUigzMSwzMjMsMjIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFzciIsIFhTUFIoMzEsMzIzLDIyNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZGNyIiwgICBYKDMxLDMyMyksCVhfTUFTSywJCVBQQywJCXsgUlQsIFNQUiB9IH0sCisKK3sgImRpdiIsICAgICBYTygzMSwzMzEsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXYuIiwgICAgWE8oMzEsMzMxLDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2byIsICAgIFhPKDMxLDMzMSwxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdm8uIiwgICBYTygzMSwzMzEsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgIm1mbXEiLCAgICAgWFNQUigzMSwzMzksMCksICAgWFNQUl9NQVNLLCBNNjAxLAl7IFJUIH0gfSwKK3sgIm1meGVyIiwgICAgWFNQUigzMSwzMzksMSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mcnRjdSIsICAgWFNQUigzMSwzMzksNCksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mcnRjbCIsICAgWFNQUigzMSwzMzksNSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mZGVjIiwgICAgWFNQUigzMSwzMzksNiksICAgWFNQUl9NQVNLLCBNRkRFQzEsCXsgUlQgfSB9LAoreyAibWZsciIsICAgICBYU1BSKDMxLDMzOSw4KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoreyAibWZjdHIiLCAgICBYU1BSKDMxLDMzOSw5KSwgICBYU1BSX01BU0ssIENPTSwJCXsgUlQgfSB9LAoreyAibWZ0aWQiLCAgICBYU1BSKDMxLDMzOSwxNyksICBYU1BSX01BU0ssIFBPV0VSLAl7IFJUIH0gfSwKK3sgIm1mZHNpc3IiLCAgWFNQUigzMSwzMzksMTgpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mZGFyIiwgICAgWFNQUigzMSwzMzksMTkpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mZGVjIiwgICAgWFNQUigzMSwzMzksMjIpLCAgWFNQUl9NQVNLLCBNRkRFQzIsCXsgUlQgfSB9LAoreyAibWZzZHIwIiwgICBYU1BSKDMxLDMzOSwyNCksICBYU1BSX01BU0ssIFBPV0VSLAl7IFJUIH0gfSwKK3sgIm1mc2RyMSIsICAgWFNQUigzMSwzMzksMjUpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mc3JyMCIsICAgWFNQUigzMSwzMzksMjYpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mc3JyMSIsICAgWFNQUigzMSwzMzksMjcpLCAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKK3sgIm1mY21wYSIsICAgWFNQUigzMSwzMzksMTQ0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZjbXBiIiwgICBYU1BSKDMxLDMzOSwxNDUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmNtcGMiLCAgIFhTUFIoMzEsMzM5LDE0NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mY21wZCIsICAgWFNQUigzMSwzMzksMTQ3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZpY3IiLCAgICBYU1BSKDMxLDMzOSwxNDgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmRlciIsICAgIFhTUFIoMzEsMzM5LDE0OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mY291bnRhIiwgWFNQUigzMSwzMzksMTUwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZjb3VudGIiLCBYU1BSKDMxLDMzOSwxNTEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmNtcGUiLCAgIFhTUFIoMzEsMzM5LDE1MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mY21wZiIsICAgWFNQUigzMSwzMzksMTUzKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZjbXBnIiwgICBYU1BSKDMxLDMzOSwxNTQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmNtcGgiLCAgIFhTUFIoMzEsMzM5LDE1NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbGN0cmwxIiwgWFNQUigzMSwzMzksMTU2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZsY3RybDIiLCBYU1BSKDMxLDMzOSwxNTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmljdHJsIiwgIFhTUFIoMzEsMzM5LDE1OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mYmFyIiwgICAgWFNQUigzMSwzMzksMTU5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZzcHJnIiwgICBYU1BSKDMxLDMzOSwyNzIpLCBYU1BSR19NQVNLLCBQUEMsCXsgUlQsIFNQUkcgfSB9LAoreyAibWZzcHJnMCIsICBYU1BSKDMxLDMzOSwyNzIpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoreyAibWZzcHJnMSIsICBYU1BSKDMxLDMzOSwyNzMpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoreyAibWZzcHJnMiIsICBYU1BSKDMxLDMzOSwyNzQpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoreyAibWZzcHJnMyIsICBYU1BSKDMxLDMzOSwyNzUpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoreyAibWZhc3IiLCAgICBYU1BSKDMxLDMzOSwyODApLCBYU1BSX01BU0ssIFBQQzY0LAl7IFJUIH0gfSwKK3sgIm1mZWFyIiwgICAgWFNQUigzMSwzMzksMjgyKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKK3sgIm1mcHZyIiwgICAgWFNQUigzMSwzMzksMjg3KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKK3sgIm1maWJhdHUiLCAgWFNQUigzMSwzMzksNTI4KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCit7ICJtZmliYXRsIiwgIFhTUFIoMzEsMzM5LDUyOSksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoreyAibWZkYmF0dSIsICBYU1BSKDMxLDMzOSw1MzYpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKK3sgIm1mZGJhdGwiLCAgWFNQUigzMSwzMzksNTM3KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCit7ICJtZmljX2NzdCIsIFhTUFIoMzEsMzM5LDU2MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1maWNfYWRyIiwgWFNQUigzMSwzMzksNTYxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZpY19kYXQiLCBYU1BSKDMxLDMzOSw1NjIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmRjX2NzdCIsIFhTUFIoMzEsMzM5LDU2OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mZGNfYWRyIiwgWFNQUigzMSwzMzksNTY5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZkY19kYXQiLCBYU1BSKDMxLDMzOSw1NzApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmRwZHIiLCAgIFhTUFIoMzEsMzM5LDYzMCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mZHBpciIsICAgWFNQUigzMSwzMzksNjMxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZpbW1yIiwgICBYU1BSKDMxLDMzOSw2MzgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1pX2N0ciIsIFhTUFIoMzEsMzM5LDc4NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfYXAiLCAgWFNQUigzMSwzMzksNzg2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtaV9lcG4iLCBYU1BSKDMxLDMzOSw3ODcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1pX3R3YyIsIFhTUFIoMzEsMzM5LDc4OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfcnBuIiwgWFNQUigzMSwzMzksNzkwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9jdHIiLCBYU1BSKDMxLDMzOSw3OTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1fY2FzaWQiLFhTUFIoMzEsMzM5LDc5MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWRfYXAiLCAgWFNQUigzMSwzMzksNzk0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9lcG4iLCBYU1BSKDMxLDMzOSw3OTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1kX3R3YiIsIFhTUFIoMzEsMzM5LDc5NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWRfdHdjIiwgWFNQUigzMSwzMzksNzk3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9ycG4iLCBYU1BSKDMxLDMzOSw3OTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1fdHciLCAgIFhTUFIoMzEsMzM5LDc5OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfZGJjYW0iLFhTUFIoMzEsMzM5LDgxNiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfZGJyYW0wIixYU1BSKDMxLDMzOSw4MTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1pX2RicmFtMSIsWFNQUigzMSwzMzksODE4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9kYmNhbSIsIFhTUFIoMzEsMzM5LDgyNCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWRfZGJyYW0wIixYU1BSKDMxLDMzOSw4MjUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1kX2RicmFtMSIsWFNQUigzMSwzMzksODI2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZ6cHIiLCAgIFhTUFIoMzEsMzM5LDk0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mcGlkIiwgICBYU1BSKDMxLDMzOSw5NDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmljZGJkciIsWFNQUigzMSwzMzksOTc5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZ1bW1jcjAiLAlYU1BSKDMxLDMzOSw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZ1cG1jMSIsCVhTUFIoMzEsMzM5LDkzNyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnVwbWMyIiwJWFNQUigzMSwzMzksOTM4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mdXNpYSIsCVhTUFIoMzEsMzM5LDkzOSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnVtbWNyMSIsCVhTUFIoMzEsMzM5LDk0MCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnVwbWMzIiwJWFNQUigzMSwzMzksOTQxKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mdXBtYzQiLAlYU1BSKDMxLDMzOSw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZtbWNyMCIsCVhTUFIoMzEsMzM5LDk1MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnBtYzEiLAlYU1BSKDMxLDMzOSw5NTMpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZwbWMyIiwJWFNQUigzMSwzMzksOTU0KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mc2lhIiwJWFNQUigzMSwzMzksOTU1KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mbW1jcjEiLAlYU1BSKDMxLDMzOSw5NTYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZwbWMzIiwJWFNQUigzMSwzMzksOTU3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mcG1jNCIsCVhTUFIoMzEsMzM5LDk1OCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZmVzciIsICAgWFNQUigzMSwzMzksOTgwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkZWFyIiwgIFhTUFIoMzEsMzM5LDk4MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZXZwciIsICBYU1BSKDMxLDMzOSw5ODIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmNkYmNyIiwgWFNQUigzMSwzMzksOTgzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZ0c3IiLCAgIFhTUFIoMzEsMzM5LDk4NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mdGNyIiwgICBYU1BSKDMxLDMzOSw5ODYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnBpdCIsICAgWFNQUigzMSwzMzksOTg3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZ0YmhpIiwgIFhTUFIoMzEsMzM5LDk4OCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mdGJsbyIsICBYU1BSKDMxLDMzOSw5ODkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnNycjIiLCAgWFNQUigzMSwzMzksOTkwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZzcnIzIiwgIFhTUFIoMzEsMzM5LDk5MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZGJzciIsICBYU1BSKDMxLDMzOSwxMDA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZpYWMxIiwgIFhTUFIoMzEsMzM5LDEwMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmlhYzIiLCAgWFNQUigzMSwzMzksMTAxMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZGFjMSIsICBYU1BSKDMxLDMzOSwxMDE0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkYWMyIiwgIFhTUFIoMzEsMzM5LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRjY3IiLCAgWFNQUigzMSwzMzksMTAxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1maWNjciIsICBYU1BSKDMxLDMzOSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZwYmwxIiwgIFhTUFIoMzEsMzM5LDEwMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnBidTEiLCAgWFNQUigzMSwzMzksMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mcGJsMiIsICBYU1BSKDMxLDMzOSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZwYnUyIiwgIFhTUFIoMzEsMzM5LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmwyY3IiLAlYU1BSKDMxLDMzOSwxMDE3KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZpY3RjIiwJWFNQUigzMSwzMzksMTAxOSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mdGhybTEiLAlYU1BSKDMxLDMzOSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZ0aHJtMiIsCVhTUFIoMzEsMzM5LDEwMjEpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnRocm0zIiwJWFNQUigzMSwzMzksMTAyMiksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mc3ByIiwgICBYKDMxLDMzOSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFNQUiB9IH0sCisKK3sgImx3YXgiLCAgICBYKDMxLDM0MSksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibGhheCIsICAgIFgoMzEsMzQzKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiZGNjY2kiLCAgIFgoMzEsNDU0KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKKworeyAiYWJzIiwgICAgIFhPKDMxLDM2MCwwLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCit7ICJhYnMuIiwgICAgWE8oMzEsMzYwLDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKK3sgImFic28iLCAgICBYTygzMSwzNjAsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoreyAiYWJzby4iLCAgIFhPKDMxLDM2MCwxLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCisKK3sgImRpdnMiLCAgICBYTygzMSwzNjMsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZzLiIsICAgWE8oMzEsMzYzLDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2c28iLCAgIFhPKDMxLDM2MywxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdnNvLiIsICBYTygzMSwzNjMsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgInRsYmlhIiwgICBYKDMxLDM3MCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCisKK3sgIm1mdGJ1IiwgICBYU1BSKDMxLDM3MSwyNjkpLCBYU1BSX01BU0ssIFBQQywJCXsgUlQgfSB9LAoreyAibWZ0YiIsICAgIFgoMzEsMzcxKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgVEJSIH0gfSwKKworeyAibHdhdXgiLCAgIFgoMzEsMzczKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQUwsIFJCIH0gfSwKKworeyAibGhhdXgiLCAgIFgoMzEsMzc1KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCisKK3sgInN0aHgiLCAgICBYKDMxLDQwNyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImxmcXgiLCAgICBYKDMxLDc5MSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJULCBSQSwgUkIgfSB9LAorCit7ICJsZnF1eCIsICAgWCgzMSw4MjMpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKKworeyAic3RmcXgiLCAgIFgoMzEsOTE5KSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlMsIFJBLCBSQiB9IH0sCisKK3sgInN0ZnF1eCIsICBYKDMxLDk1MSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAorCit7ICJvcmMiLCAgICAgWFJDKDMxLDQxMiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAib3JjLiIsICAgIFhSQygzMSw0MTIsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAic3JhZGkiLCAgIFhTKDMxLDQxMywwKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKK3sgInNyYWRpLiIsICBYUygzMSw0MTMsMSksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCisKK3sgInNsYmllIiwgICBYKDMxLDQzNCksCVhSVFJBX01BU0ssCVBQQzY0LAkJeyBSQiB9IH0sCisKK3sgImVjb3d4IiwgICBYKDMxLDQzOCksCVhfTUFTSywJCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgInN0aHV4IiwgICBYKDMxLDQzOSksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAorCit7ICJtciIsCSAgICAgWFJDKDMxLDQ0NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKK3sgIm9yIiwgICAgICBYUkMoMzEsNDQ0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJtci4iLCAgICAgWFJDKDMxLDQ0NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKK3sgIm9yLiIsICAgICBYUkMoMzEsNDQ0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgIm10ZXhpc3IiLCBYU1BSKDMxLDQ1MSw2NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZXhpZXIiLCBYU1BSKDMxLDQ1MSw2NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10YnIwIiwgICBYU1BSKDMxLDQ1MSwxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGJyMSIsICAgWFNQUigzMSw0NTEsMTI5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRicjIiLCAgIFhTUFIoMzEsNDUxLDEzMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10YnIzIiwgICBYU1BSKDMxLDQ1MSwxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGJyNCIsICAgWFNQUigzMSw0NTEsMTMyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRicjUiLCAgIFhTUFIoMzEsNDUxLDEzMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10YnI2IiwgICBYU1BSKDMxLDQ1MSwxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGJyNyIsICAgWFNQUigzMSw0NTEsMTM1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRiZWFyIiwgIFhTUFIoMzEsNDUxLDE0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10YmVzciIsICBYU1BSKDMxLDQ1MSwxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGlvY3IiLCAgWFNQUigzMSw0NTEsMTYwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFjcjAiLCBYU1BSKDMxLDQ1MSwxOTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYWN0MCIsIFhTUFIoMzEsNDUxLDE5MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hZGEwIiwgWFNQUigzMSw0NTEsMTk0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFzYTAiLCBYU1BSKDMxLDQ1MSwxOTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYWNjMCIsIFhTUFIoMzEsNDUxLDE5NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hY3IxIiwgWFNQUigzMSw0NTEsMjAwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFjdDEiLCBYU1BSKDMxLDQ1MSwyMDEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYWRhMSIsIFhTUFIoMzEsNDUxLDIwMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hc2ExIiwgWFNQUigzMSw0NTEsMjAzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFjYzEiLCBYU1BSKDMxLDQ1MSwyMDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYWNyMiIsIFhTUFIoMzEsNDUxLDIwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hY3QyIiwgWFNQUigzMSw0NTEsMjA5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFkYTIiLCBYU1BSKDMxLDQ1MSwyMTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYXNhMiIsIFhTUFIoMzEsNDUxLDIxMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hY2MyIiwgWFNQUigzMSw0NTEsMjEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFjcjMiLCBYU1BSKDMxLDQ1MSwyMTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYWN0MyIsIFhTUFIoMzEsNDUxLDIxNyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hZGEzIiwgWFNQUigzMSw0NTEsMjE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkbWFzYTMiLCBYU1BSKDMxLDQ1MSwyMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRtYWNjMyIsIFhTUFIoMzEsNDUxLDIyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZG1hc3IiLCBYU1BSKDMxLDQ1MSwyMjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdHVtbWNyMCIsCVhTUFIoMzEsNDUxLDkzNiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtdHVwbWMxIiwJWFNQUigzMSw0NTEsOTM3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm10dXBtYzIiLAlYU1BSKDMxLDQ1MSw5MzgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXR1c2lhIiwJWFNQUigzMSw0NTEsOTM5KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm10dW1tY3IxIiwJWFNQUigzMSw0NTEsOTQwKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm10dXBtYzMiLAlYU1BSKDMxLDQ1MSw5NDEpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXR1cG1jNCIsCVhTUFIoMzEsNDUxLDk0MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtdG1tY3IwIiwJWFNQUigzMSw0NTEsOTUyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm10cG1jMSIsCVhTUFIoMzEsNDUxLDk1MyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtdHBtYzIiLAlYU1BSKDMxLDQ1MSw5NTQpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXRzaWEiLAlYU1BSKDMxLDQ1MSw5NTUpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXRtbWNyMSIsCVhTUFIoMzEsNDUxLDk1NiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtdHBtYzMiLAlYU1BSKDMxLDQ1MSw5NTcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXRwbWM0IiwJWFNQUigzMSw0NTEsOTU4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm10bDJjciIsCVhTUFIoMzEsNDUxLDEwMTcpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtdGljdGMiLAlYU1BSKDMxLDQ1MSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXR0aHJtMSIsCVhTUFIoMzEsNDUxLDEwMjApLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtdHRocm0yIiwJWFNQUigzMSw0NTEsMTAyMSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm10dGhybTMiLAlYU1BSKDMxLDQ1MSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibXRkY3IiLCAgIFgoMzEsNDUxKSwJWF9NQVNLLAkJUFBDLAkJeyBTUFIsIFJTIH0gfSwKKworeyAiZGl2ZHUiLCAgIFhPKDMxLDQ1NywwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZkdS4iLCAgWE8oMzEsNDU3LDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdmR1byIsICBYTygzMSw0NTcsMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2ZHVvLiIsIFhPKDMxLDQ1NywxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImRpdnd1IiwgICBYTygzMSw0NTksMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdnd1LiIsICBYTygzMSw0NTksMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdnd1byIsICBYTygzMSw0NTksMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdnd1by4iLCBYTygzMSw0NTksMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibXRtcSIsICAgIFhTUFIoMzEsNDY3LDApLCAgIFhTUFJfTUFTSywgICAgTTYwMSwJeyBSUyB9IH0sCit7ICJtdHhlciIsICAgWFNQUigzMSw0NjcsMSksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoreyAibXRsciIsICAgIFhTUFIoMzEsNDY3LDgpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKK3sgIm10Y3RyIiwgICBYU1BSKDMxLDQ2Nyw5KSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCit7ICJtdHRpZCIsICAgWFNQUigzMSw0NjcsMTcpLCAgWFNQUl9NQVNLLCAgICBQT1dFUiwJeyBSUyB9IH0sCit7ICJtdGRzaXNyIiwgWFNQUigzMSw0NjcsMTgpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoreyAibXRkYXIiLCAgIFhTUFIoMzEsNDY3LDE5KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKK3sgIm10cnRjdSIsICBYU1BSKDMxLDQ2NywyMCksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCit7ICJtdHJ0Y2wiLCAgWFNQUigzMSw0NjcsMjEpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoreyAibXRkZWMiLCAgIFhTUFIoMzEsNDY3LDIyKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKK3sgIm10c2RyMCIsICBYU1BSKDMxLDQ2NywyNCksICBYU1BSX01BU0ssICAgIFBPV0VSLAl7IFJTIH0gfSwKK3sgIm10c2RyMSIsICBYU1BSKDMxLDQ2NywyNSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCit7ICJtdHNycjAiLCAgWFNQUigzMSw0NjcsMjYpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoreyAibXRzcnIxIiwgIFhTUFIoMzEsNDY3LDI3KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKK3sgIm10Y21wYSIsICAgWFNQUigzMSw0NjcsMTQ0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibXRjbXBiIiwgICBYU1BSKDMxLDQ2NywxNDUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtdGNtcGMiLCAgIFhTUFIoMzEsNDY3LDE0NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm10Y21wZCIsICAgWFNQUigzMSw0NjcsMTQ3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibXRpY3IiLCAgICBYU1BSKDMxLDQ2NywxNDgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtdGRlciIsICAgIFhTUFIoMzEsNDY3LDE0OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm10Y291bnRhIiwgWFNQUigzMSw0NjcsMTUwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibXRjb3VudGIiLCBYU1BSKDMxLDQ2NywxNTEpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtdGNtcGUiLCAgIFhTUFIoMzEsNDY3LDE1MiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm10Y21wZiIsICAgWFNQUigzMSw0NjcsMTUzKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibXRjbXBnIiwgICBYU1BSKDMxLDQ2NywxNTQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtdGNtcGgiLCAgIFhTUFIoMzEsNDY3LDE1NSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm10bGN0cmwxIiwgWFNQUigzMSw0NjcsMTU2KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibXRsY3RybDIiLCBYU1BSKDMxLDQ2NywxNTcpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtdGljdHJsIiwgIFhTUFIoMzEsNDY3LDE1OCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm10YmFyIiwgICAgWFNQUigzMSw0NjcsMTU5KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibXRzcHJnIiwgIFhTUFIoMzEsNDY3LDI3MiksIFhTUFJHX01BU0ssICAgUFBDLAl7IFNQUkcsIFJTIH0gfSwKK3sgIm10c3ByZzAiLCBYU1BSKDMxLDQ2NywyNzIpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCit7ICJtdHNwcmcxIiwgWFNQUigzMSw0NjcsMjczKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoreyAibXRzcHJnMiIsIFhTUFIoMzEsNDY3LDI3NCksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKK3sgIm10c3ByZzMiLCBYU1BSKDMxLDQ2NywyNzUpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCit7ICJtdGFzciIsICAgWFNQUigzMSw0NjcsMjgwKSwgWFNQUl9NQVNLLCAgICBQUEM2NCwJeyBSUyB9IH0sCit7ICJtdGVhciIsICAgWFNQUigzMSw0NjcsMjgyKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoreyAibXR0YmwiLCAgIFhTUFIoMzEsNDY3LDI4NCksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKK3sgIm10dGJ1IiwgICBYU1BSKDMxLDQ2NywyODUpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCit7ICJtdGliYXR1IiwgWFNQUigzMSw0NjcsNTI4KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdGliYXRsIiwgWFNQUigzMSw0NjcsNTI5KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdGRiYXR1IiwgWFNQUigzMSw0NjcsNTM2KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdGRiYXRsIiwgWFNQUigzMSw0NjcsNTM3KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdHpwciIsICAgWFNQUigzMSw0NjcsOTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRwaWQiLCAgIFhTUFIoMzEsNDY3LDk0NSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10aWNkYmRyIixYU1BSKDMxLDQ2Nyw5NzkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGVzciIsICAgWFNQUigzMSw0NjcsOTgwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRldnByIiwgIFhTUFIoMzEsNDY3LDk4MiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10Y2RiY3IiLCBYU1BSKDMxLDQ2Nyw5ODMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdHRzciIsICAgWFNQUigzMSw0NjcsOTg0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXR0Y3IiLCAgIFhTUFIoMzEsNDY3LDk4NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10cGl0IiwgICBYU1BSKDMxLDQ2Nyw5ODcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdHRiaGkiLCAgWFNQUigzMSw0NjcsOTg4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXR0YmxvIiwgIFhTUFIoMzEsNDY3LDk4OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10c3JyMiIsICBYU1BSKDMxLDQ2Nyw5OTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdHNycjMiLCAgWFNQUigzMSw0NjcsOTkxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkYnNyIiwgIFhTUFIoMzEsNDY3LDEwMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGlhYzEiLCAgWFNQUigzMSw0NjcsMTAxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10aWFjMiIsICBYU1BSKDMxLDQ2NywxMDEzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRkYWMxIiwgIFhTUFIoMzEsNDY3LDEwMTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdGRhYzIiLCAgWFNQUigzMSw0NjcsMTAxNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10ZGNjciIsICBYU1BSKDMxLDQ2NywxMDE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRpY2NyIiwgIFhTUFIoMzEsNDY3LDEwMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdHBibDEiLCAgWFNQUigzMSw0NjcsMTAyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10cGJ1MSIsICBYU1BSKDMxLDQ2NywxMDIxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibXRwYmwyIiwgIFhTUFIoMzEsNDY3LDEwMjIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtdHBidTIiLCAgWFNQUigzMSw0NjcsMTAyMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm10c3ByIiwgICBYKDMxLDQ2NyksCSAgICAgICBYX01BU0ssCSAgICAgQ09NLAl7IFNQUiwgUlMgfSB9LAorCit7ICJkY2JpIiwgICAgWCgzMSw0NzApLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAorCit7ICJuYW5kIiwgICAgWFJDKDMxLDQ3NiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAibmFuZC4iLCAgIFhSQygzMSw0NzYsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAiZGNyZWFkIiwgIFgoMzEsNDg2KSwJWFJUX01BU0ssCVBQQzQwMywJCXsgUkEsIFJCIH0gfSwKKworeyAibmFicyIsICAgIFhPKDMxLDQ4OCwwLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCit7ICJuYWJzLiIsICAgWE8oMzEsNDg4LDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKK3sgIm5hYnNvIiwgICBYTygzMSw0ODgsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoreyAibmFic28uIiwgIFhPKDMxLDQ4OCwxLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCisKK3sgImRpdmQiLCAgICBYTygzMSw0ODksMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2ZC4iLCAgIFhPKDMxLDQ4OSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZkbyIsICAgWE8oMzEsNDg5LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdmRvLiIsICBYTygzMSw0ODksMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJkaXZ3IiwgICAgWE8oMzEsNDkxLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZ3LiIsICAgWE8oMzEsNDkxLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZ3byIsICAgWE8oMzEsNDkxLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZ3by4iLCAgWE8oMzEsNDkxLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgInNsYmlhIiwgICBYKDMxLDQ5OCksCTB4ZmZmZmZmZmYsCVBQQzY0LAkJeyAwIH0gfSwKKworeyAiY2xpIiwgICAgIFgoMzEsNTAyKSwgWFJCX01BU0ssCVBPV0VSLAkJeyBSVCwgUkEgfSB9LAorCit7ICJtY3J4ciIsICAgWCgzMSw1MTIpLAlYUkFSQl9NQVNLfCgzPDwyMSksIENPTSwJeyBCRiB9IH0sCisKK3sgImNsY3MiLCAgICBYKDMxLDUzMSksIFhSQl9NQVNLLAlNNjAxLAkJeyBSVCwgUkEgfSB9LAorCit7ICJsc3d4IiwgICAgWCgzMSw1MzMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibHN4IiwgICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibHdicngiLCAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxicngiLCAgICBYKDMxLDUzNCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImxmc3giLCAgICBYKDMxLDUzNSksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQSwgUkIgfSB9LAorCit7ICJzcnciLCAgICAgWFJDKDMxLDUzNiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3IiLCAgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNydy4iLCAgICBYUkMoMzEsNTM2LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzci4iLCAgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJycmliIiwgICAgWFJDKDMxLDUzNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInJyaWIuIiwgICBYUkMoMzEsNTM3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzcmQiLCAgICAgWFJDKDMxLDUzOSwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzcmQuIiwgICAgWFJDKDMxLDUzOSwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgIm1hc2tpciIsICBYUkMoMzEsNTQxLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAibWFza2lyLiIsIFhSQygzMSw1NDEsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInRsYnN5bmMiLCBYKDMxLDU2NiksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCisKK3sgImxmc3V4IiwgICBYKDMxLDU2NyksCVhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKKworeyAibWZzciIsICAgIFgoMzEsNTk1KSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgUlQsIFNSIH0gfSwKKworeyAibHN3aSIsICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIE5CIH0gfSwKK3sgImxzaSIsICAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCisKK3sgInN5bmMiLCAgICBYKDMxLDU5OCksIDB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCit7ICJkY3MiLCAgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAorCit7ICJsZmR4IiwgICAgWCgzMSw1OTkpLCBYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKKworeyAibWZzcmkiLCAgIFgoMzEsNjI3KSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiZGNsc3QiLCAgIFgoMzEsNjMwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUlMsIFJBIH0gfSwKKworeyAibGZkdXgiLCAgIFgoMzEsNjMxKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBUywgUkIgfSB9LAorCit7ICJtZnNyaW4iLCAgWCgzMSw2NTkpLCBYUkFfTUFTSywJUFBDMzIsCQl7IFJULCBSQiB9IH0sCisKK3sgInN0c3d4IiwgICBYKDMxLDY2MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdHN4IiwgICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAorCit7ICJzdHdicngiLCAgWCgzMSw2NjIpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RicngiLCAgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAic3Rmc3giLCAgIFgoMzEsNjYzKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBLCBSQiB9IH0sCisKK3sgInNycSIsICAgICBYUkMoMzEsNjY0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JxLiIsICAgIFhSQygzMSw2NjQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInNyZSIsICAgICBYUkMoMzEsNjY1LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JlLiIsICAgIFhSQygzMSw2NjUsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInN0ZnN1eCIsICBYKDMxLDY5NSksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQVMsIFJCIH0gfSwKKworeyAic3JpcSIsICAgIFhSQygzMSw2OTYsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzcmlxLiIsICAgWFJDKDMxLDY5NiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKKworeyAic3Rzd2kiLCAgIFgoMzEsNzI1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIE5CIH0gfSwKK3sgInN0c2kiLCAgICBYKDMxLDcyNSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCisKK3sgInN0ZmR4IiwgICBYKDMxLDcyNyksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAorCit7ICJzcmxxIiwgICAgWFJDKDMxLDcyOCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNybHEuIiwgICBYUkMoMzEsNzI4LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzcmVxIiwgICAgWFJDKDMxLDcyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNyZXEuIiwgICBYUkMoMzEsNzI5LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzdGZkdXgiLCAgWCgzMSw3NTkpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkFTLCBSQiB9IH0sCisKK3sgInNybGlxIiwgICBYUkMoMzEsNzYwLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoreyAic3JsaXEuIiwgIFhSQygzMSw3NjAsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCisKK3sgImxoYnJ4IiwgICBYKDMxLDc5MCksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgInNyYXciLCAgICBYUkMoMzEsNzkyLDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzcmEiLCAgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3Jhdy4iLCAgIFhSQygzMSw3OTIsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNyYS4iLCAgICBYUkMoMzEsNzkyLDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInNyYWQiLCAgICBYUkMoMzEsNzk0LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNyYWQuIiwgICBYUkMoMzEsNzk0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAicmFjIiwgICAgIFgoMzEsODE4KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAic3Jhd2kiLCAgIFhSQygzMSw4MjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKK3sgInNyYWkiLCAgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzcmF3aS4iLCAgWFJDKDMxLDgyNCwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoreyAic3JhaS4iLCAgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKKworeyAiZWllaW8iLCAgIFgoMzEsODU0KSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKKworeyAidGxic3giLCAgIFhSQygzMSw5MTQsMCksIFhfTUFTSywgUFBDNDAzLAl7IFJULCBSQSwgUkIgfSB9LAoreyAidGxic3guIiwgIFhSQygzMSw5MTQsMSksIFhfTUFTSywgUFBDNDAzLAl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJzdGhicngiLCAgWCgzMSw5MTgpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAorCit7ICJzcmFxIiwgICAgWFJDKDMxLDkyMCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNyYXEuIiwgICBYUkMoMzEsOTIwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzcmVhIiwgICAgWFJDKDMxLDkyMSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNyZWEuIiwgICBYUkMoMzEsOTIxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJleHRzaCIsICAgWFJDKDMxLDkyMiwwKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKK3sgImV4dHMiLCAgICBYUkMoMzEsOTIyLDApLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAoreyAiZXh0c2guIiwgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCit7ICJleHRzLiIsICAgWFJDKDMxLDkyMiwxKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKKworeyAidGxicmUiLCAgIFgoMzEsOTQ2KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSVCwgUkEsIFNIIH0gfSwKKworeyAic3JhaXEiLCAgIFhSQygzMSw5NTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzcmFpcS4iLCAgWFJDKDMxLDk1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKKworeyAiZXh0c2IiLCAgIFhSQygzMSw5NTQsMCksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSU30gfSwKK3sgImV4dHNiLiIsICBYUkMoMzEsOTU0LDEpLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlN9IH0sCisKK3sgImljY2NpIiwgICBYKDMxLDk2NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCisKK3sgInRsYmxkIiwgICBYKDMxLDk3OCksCVhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAoreyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSUywgUkEsIFNIIH0gfSwKKworeyAiaWNiaSIsICAgIFgoMzEsOTgyKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKKworeyAic3RmaXd4IiwgIFgoMzEsOTgzKSwJWF9NQVNLLAkJUFBDLAkJeyBGUlMsIFJBLCBSQiB9IH0sCisKK3sgImV4dHN3IiwgICBYUkMoMzEsOTg2LDApLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlMgfSB9LAoreyAiZXh0c3cuIiwgIFhSQygzMSw5ODYsMSksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSUyB9IH0sCisKK3sgImljcmVhZCIsICBYKDMxLDk5OCksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCisKK3sgInRsYmxpIiwgICBYKDMxLDEwMTApLCBYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKKworeyAiZGNieiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCit7ICJkY2x6IiwgICAgWCgzMSwxMDE0KSwgWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKKworeyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoreyAibCIsCSAgICAgT1AoMzIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCisKK3sgImx3enUiLCAgICBPUCgzMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCit7ICJsdSIsICAgICAgT1AoMzMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCisKK3sgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKKworeyAibGJ6dSIsICAgIE9QKDM1KSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKKworeyAic3R3IiwgICAgIE9QKDM2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkEgfSB9LAoreyAic3QiLCAgICAgIE9QKDM2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAorCit7ICJzdHd1IiwgICAgT1AoMzcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQVMgfSB9LAoreyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEgfSB9LAorCit7ICJzdGIiLCAgICAgT1AoMzgpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCisKK3sgInN0YnUiLCAgICBPUCgzOSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCisKK3sgImxoeiIsICAgICBPUCg0MCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKKworeyAibGh6dSIsICAgIE9QKDQxKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKKworeyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAorCit7ICJsaGF1IiwgICAgT1AoNDMpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAorCit7ICJzdGgiLCAgICAgT1AoNDQpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQSB9IH0sCisKK3sgInN0aHUiLCAgICBPUCg0NSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCisKK3sgImxtdyIsICAgICBPUCg0NiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTSB9IH0sCit7ICJsbSIsICAgICAgT1AoNDYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCisKK3sgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKK3sgInN0bSIsICAgICBPUCg0NyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKKworeyAibGZzIiwgICAgIE9QKDQ4KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKKworeyAibGZzdSIsICAgIE9QKDQ5KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBUyB9IH0sCisKK3sgImxmZCIsICAgICBPUCg1MCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQSB9IH0sCisKK3sgImxmZHUiLCAgICBPUCg1MSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAorCit7ICJzdGZzIiwgICAgT1AoNTIpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEgfSB9LAorCit7ICJzdGZzdSIsICAgT1AoNTMpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKKworeyAic3RmZCIsICAgIE9QKDU0KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKKworeyAic3RmZHUiLCAgIE9QKDU1KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCisKK3sgImxmcSIsICAgICBPUCg1NiksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCisKK3sgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCisKK3sgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKKworeyAibGR1IiwgICAgIERTTyg1OCwxKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkFMIH0gfSwKKworeyAibHdhIiwgICAgIERTTyg1OCwyKSwgRFNfTUFTSywJUFBDNjQsCQl7IFJULCBEUywgUkEgfSB9LAorCit7ICJmZGl2cyIsICAgQSg1OSwxOCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZmRpdnMuIiwgIEEoNTksMTgsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZnN1YnMiLCAgIEEoNTksMjAsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZzdWJzLiIsICBBKDU5LDIwLDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImZhZGRzIiwgICBBKDU5LDIxLDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmYWRkcy4iLCAgQSg1OSwyMSwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJmc3FydHMiLCAgQSg1OSwyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZzcXJ0cy4iLCBBKDU5LDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmcmVzIiwgICAgQSg1OSwyNCwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyZXMuIiwgICBBKDU5LDI0LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmbXVscyIsICAgQSg1OSwyNSwwKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoreyAiZm11bHMuIiwgIEEoNTksMjUsMSksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKKworeyAiZm1zdWJzIiwgIEEoNTksMjgsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm1zdWJzLiIsIEEoNTksMjgsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAorCit7ICJmbWFkZHMiLCAgQSg1OSwyOSwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbWFkZHMuIiwgQSg1OSwyOSwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImZubXN1YnMiLCBBKDU5LDMwLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZubXN1YnMuIixBKDU5LDMwLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKKworeyAiZm5tYWRkcyIsIEEoNTksMzEsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm5tYWRkcy4iLEEoNTksMzEsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAorCit7ICJzdGZxIiwgICAgT1AoNjApLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAorCit7ICJzdGZxdSIsICAgT1AoNjEpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAorCit7ICJzdGQiLCAgICAgRFNPKDYyLDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlMsIERTLCBSQSB9IH0sCisKK3sgInN0ZHUiLCAgICBEU08oNjIsMSksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBUyB9IH0sCisKK3sgImZjbXB1IiwgICBYKDYzLDApLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAorCit7ICJmcnNwIiwgICAgWFJDKDYzLDEyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcnNwLiIsICAgWFJDKDYzLDEyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImZjdGl3IiwgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjaXIiLCAgICBYUkMoNjMsMTQsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjdGl3LiIsICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjaXIuIiwgICBYUkMoNjMsMTQsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZmN0aXd6IiwgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmNpcnoiLCAgIFhSQyg2MywxNSwwKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmN0aXd6LiIsIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmNpcnouIiwgIFhSQyg2MywxNSwxKSwgWFJBX01BU0ssCVBPV0VSMiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmZGl2IiwgICAgQSg2MywxOCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZmQiLCAgICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZkaXYuIiwgICBBKDYzLDE4LDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmZC4iLCAgICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJmc3ViIiwgICAgQSg2MywyMCwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZnMiLCAgICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZzdWIuIiwgICBBKDYzLDIwLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmcy4iLCAgICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJmYWRkIiwgICAgQSg2MywyMSwwKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZmEiLCAgICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZhZGQuIiwgICBBKDYzLDIxLDEpLCBBRlJDX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmYS4iLCAgICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJmc3FydCIsICAgQSg2MywyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKK3sgImZzcXJ0LiIsICBBKDYzLDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQ1BXUjIsCXsgRlJULCBGUkIgfSB9LAorCit7ICJmc2VsIiwgICAgQSg2MywyMywwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmc2VsLiIsICAgQSg2MywyMywxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImZtdWwiLCAgICBBKDYzLDI1LDApLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCit7ICJmbSIsICAgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoreyAiZm11bC4iLCAgIEEoNjMsMjUsMSksIEFGUkJfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKK3sgImZtLiIsICAgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCisKK3sgImZyc3FydGUiLCBBKDYzLDI2LDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJzcXJ0ZS4iLEEoNjMsMjYsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImZtc3ViIiwgICBBKDYzLDI4LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtcyIsICAgICBBKDYzLDI4LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtc3ViLiIsICBBKDYzLDI4LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtcy4iLCAgICBBKDYzLDI4LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKKworeyAiZm1hZGQiLCAgIEEoNjMsMjksMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm1hIiwgICAgIEEoNjMsMjksMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm1hZGQuIiwgIEEoNjMsMjksMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm1hLiIsICAgIEEoNjMsMjksMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAorCit7ICJmbm1zdWIiLCAgQSg2MywzMCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1zIiwgICAgQSg2MywzMCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1zdWIuIiwgQSg2MywzMCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1zLiIsICAgQSg2MywzMCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImZubWFkZCIsICBBKDYzLDMxLDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZubWEiLCAgICBBKDYzLDMxLDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZubWFkZC4iLCBBKDYzLDMxLDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZubWEuIiwgICBBKDYzLDMxLDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKKworeyAiZmNtcG8iLCAgIFgoNjMsMzIpLAlYX01BU0t8KDM8PDIxKSwJQ09NLAkJeyBCRiwgRlJBLCBGUkIgfSB9LAorCit7ICJtdGZzYjEiLCAgWFJDKDYzLDM4LDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKK3sgIm10ZnNiMS4iLCBYUkMoNjMsMzgsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAorCit7ICJmbmVnIiwgICAgWFJDKDYzLDQwLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmbmVnLiIsICAgWFJDKDYzLDQwLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgIm1jcmZzIiwgICBYKDYzLDY0KSwJWFJCX01BU0t8KDM8PDIxKXwoMzw8MTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCisKK3sgIm10ZnNiMCIsICBYUkMoNjMsNzAsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAoreyAibXRmc2IwLiIsIFhSQyg2Myw3MCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCisKK3sgImZtciIsICAgICBYUkMoNjMsNzIsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZtci4iLCAgICBYUkMoNjMsNzIsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKKworeyAibXRmc2ZpIiwgIFhSQyg2MywxMzQsMCksIFhSQV9NQVNLfCgzPDwyMSl8KDE8PDExKSwgQ09NLCB7IEJGLCBVIH0gfSwKK3sgIm10ZnNmaS4iLCBYUkMoNjMsMTM0LDEpLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCisKK3sgImZuYWJzIiwgICBYUkMoNjMsMTM2LDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmbmFicy4iLCAgWFJDKDYzLDEzNiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmYWJzIiwgICAgWFJDKDYzLDI2NCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmFicy4iLCAgIFhSQyg2MywyNjQsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKKworeyAibWZmcyIsICAgIFhSQyg2Myw1ODMsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKK3sgIm1mZnMuIiwgICBYUkMoNjMsNTgzLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCisKK3sgIm10ZnNmIiwgICBYRkwoNjMsNzExLDApLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCit7ICJtdGZzZi4iLCAgWEZMKDYzLDcxMSwxKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAorCit7ICJmY3RpZCIsICAgWFJDKDYzLDgxNCwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmY3RpZC4iLCAgWFJDKDYzLDgxNCwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImZjdGlkeiIsICBYUkMoNjMsODE1LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjdGlkei4iLCBYUkMoNjMsODE1LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZmNmaWQiLCAgIFhSQyg2Myw4NDYsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmNmaWQuIiwgIFhSQyg2Myw4NDYsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAorCit9OworCitjb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlcyA9CisgIHNpemVvZiAocG93ZXJwY19vcGNvZGVzKSAvIHNpemVvZiAocG93ZXJwY19vcGNvZGVzWzBdKTsKKwwKKy8qIFRoZSBtYWNybyB0YWJsZS4gIFRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIuICAqLworCisvKiBUaGUgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm0gKC14ICEgMzEpICYgKHggfCAzMSkgaGF2ZSB0aGUgdmFsdWUgMAorICAgd2hlbiB4PTA7IDMyLXggd2hlbiB4IGlzIGJldHdlZW4gMSBhbmQgMzE7IGFyZSBuZWdhdGl2ZSBpZiB4IGlzCisgICBuZWdhdGl2ZTsgYW5kIGFyZSAzMiBvciBtb3JlIG90aGVyd2lzZS4gIFRoaXMgaXMgd2hhdCB5b3Ugd2FudAorICAgd2hlbiwgZm9yIGluc3RhbmNlLCB5b3UgYXJlIGVtdWxhdGluZyBhIHJpZ2h0IHNoaWZ0IGJ5IGEKKyAgIHJvdGF0ZS1sZWZ0LWFuZC1tYXNrLCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9ucyBzdXBwb3J0CisgICBzaGlmdHMgb2Ygc2l6ZSAwIGJ1dCBub3Qgc2hpZnRzIG9mIHNpemUgMzIuICBCeSBjb21wYXJpc29uLCB3aGVuCisgICBleHRyYWN0aW5nIHggYml0cyBmcm9tIHNvbWUgd29yZCB5b3Ugd2FudCB0byB1c2UganVzdCAzMi14LCBiZWNhdXNlCisgICB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbnMgZG9uJ3Qgc3VwcG9ydCBleHRyYWN0aW5nIDAgYml0cyBidXQgZG8KKyAgIHN1cHBvcnQgZXh0cmFjdGluZyB0aGUgd2hvbGUgd29yZCAoMzIgYml0cyBpbiB0aGlzIGNhc2UpLiAgKi8KKworY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gcG93ZXJwY19tYWNyb3NbXSA9IHsKK3sgImV4dGxkaSIsICA0LCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLCUzLCglMiktMSIgfSwKK3sgImV4dGxkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMywoJTIpLTEiIH0sCit7ICJleHRyZGkiLCAgNCwgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKK3sgImV4dHJkaS4iLCA0LCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoJTIpKyglMyksNjQtKCUyKSIgfSwKK3sgImluc3JkaSIsICA0LCAgIFBQQzY0LAkicmxkaW1pICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoreyAiaW5zcmRpLiIsIDQsICAgUFBDNjQsCSJybGRpbWkuICUwLCUxLDY0LSgoJTIpKyglMykpLCUzIiB9LAoreyAicm90cmRpIiwgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksMCIgfSwKK3sgInJvdHJkaS4iLCAzLCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwwIiB9LAoreyAic2xkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsJTIsNjMtKCUyKSIgfSwKK3sgInNsZGkuIiwgICAzLCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwlMiw2My0oJTIpIiB9LAoreyAic3JkaSIsICAgIDMsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCit7ICJzcmRpLiIsICAgMywgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksJTIiIH0sCit7ICJjbHJyZGkiLCAgMywgICBQUEM2NCwJInJsZGljciAlMCwlMSwwLDYzLSglMikiIH0sCit7ICJjbHJyZGkuIiwgMywgICBQUEM2NCwJInJsZGljci4gJTAsJTEsMCw2My0oJTIpIiB9LAoreyAiY2xybHNsZGkiLDQsICAgUFBDNjQsCSJybGRpYyAlMCwlMSwlMywoJTIpLSglMykiIH0sCit7ICJjbHJsc2xkaS4iLDQsICBQUEM2NCwJInJsZGljLiAlMCwlMSwlMywoJTIpLSglMykiIH0sCisKK3sgImV4dGx3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywwLCglMiktMSIgfSwKK3sgImV4dGx3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsMCwoJTIpLTEiIH0sCit7ICJleHRyd2kiLCAgNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKCUyKSsoJTMpLDMyLSglMiksMzEiIH0sCit7ICJleHRyd2kuIiwgNCwgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCglMikrKCUzKSwzMi0oJTIpLDMxIiB9LAoreyAiaW5zbHdpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLCgtKCUzKSEzMSkmKCglMyl8MzEpLCUzLCglMikrKCUzKS0xIiB9LAoreyAiaW5zbHdpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwoLSglMykhMzEpJigoJTMpfDMxKSwlMywoJTIpKyglMyktMSJ9LAoreyAiaW5zcndpIiwgIDQsICAgUFBDQ09NLAkicmx3aW1pICUwLCUxLDMyLSgoJTIpKyglMykpLCUzLCglMikrKCUzKS0xIiB9LAoreyAiaW5zcndpLiIsIDQsICAgUFBDQ09NLAkicmx3aW1pLiAlMCwlMSwzMi0oKCUyKSsoJTMpKSwlMywoJTIpKyglMyktMSJ9LAoreyAicm90cndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCit7ICJyb3Ryd2kuIiwgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLDAsMzEiIH0sCit7ICJzbHdpIiwgICAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoreyAic2xpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoreyAic2x3aS4iLCAgIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMiwwLDMxLSglMikiIH0sCit7ICJzbGkuIiwgICAgMywgICBQV1JDT00sCSJybGlubS4gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoreyAic3J3aSIsICAgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoreyAic3JpIiwgICAgIDMsICAgUFdSQ09NLAkicmxpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCit7ICJzcndpLiIsICAgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoreyAic3JpLiIsICAgIDMsICAgUFdSQ09NLAkicmxpbm0uICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoreyAiY2xycndpIiwgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLDAsMCwzMS0oJTIpIiB9LAoreyAiY2xycndpLiIsIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwwLDAsMzEtKCUyKSIgfSwKK3sgImNscmxzbHdpIiw0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMywoJTIpLSglMyksMzEtKCUzKSIgfSwKK3sgImNscmxzbHdpLiIsNCwgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTMsKCUyKS0oJTMpLDMxLSglMykiIH0sCisKK307CisKK2NvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3MgPQorICBzaXplb2YgKHBvd2VycGNfbWFjcm9zKSAvIHNpemVvZiAocG93ZXJwY19tYWNyb3NbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1kaXMuYyBiL29wY29kZXMvc2gtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViZmRiNgotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvc2gtZGlzLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qIERpc2Fzc2VtYmxlIFNIIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBTVEFUSUNfVEFCTEUKKyNkZWZpbmUgREVGSU5FX1RBQkxFCisKKyNpbmNsdWRlICJzaC1vcGMuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisKKyNkZWZpbmUgTElUVExFX0JJVCAyCisKK3N0YXRpYyBpbnQgCitwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgZnByaW50Zl9mdHlwZSBmcHJpbnRmX2ZuID0gaW5mby0+ZnByaW50Zl9mdW5jOworICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07CisgIHVuc2lnbmVkIGNoYXIgaW5zblsyXTsKKyAgdW5zaWduZWQgY2hhciBuaWJzWzRdOworICBpbnQgc3RhdHVzOworICBiZmRfdm1hIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAwOworICBzaF9vcGNvZGVfaW5mbyAqb3A7CisKKyAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgaW5zbiwgMiwgaW5mbyk7CisKKyAgaWYgKHN0YXR1cyAhPSAwKSAKKyAgICB7CisgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgCisgICAgeworICAgICAgbmlic1swXSA9IChpbnNuWzFdID4+IDQpICYgMHhmOworICAgICAgbmlic1sxXSA9IGluc25bMV0gJiAweGY7CisKKyAgICAgIG5pYnNbMl0gPSAoaW5zblswXSA+PiA0KSAmIDB4ZjsKKyAgICAgIG5pYnNbM10gPSBpbnNuWzBdICYgMHhmOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBuaWJzWzBdID0gKGluc25bMF0gPj4gNCkgJiAweGY7CisgICAgICBuaWJzWzFdID0gaW5zblswXSAmIDB4ZjsKKworICAgICAgbmlic1syXSA9IChpbnNuWzFdID4+IDQpICYgMHhmOworICAgICAgbmlic1szXSA9IGluc25bMV0gJiAweGY7CisgICAgfQorCisgIGZvciAob3AgPSBzaF90YWJsZTsgb3AtPm5hbWU7IG9wKyspIAorICAgIHsKKyAgICAgIGludCBuOworICAgICAgaW50IGltbSA9IDA7CisgICAgICBpbnQgcm4gPSAwOworICAgICAgaW50IHJtID0gMDsKKyAgICAgIGludCByYiA9IDA7CisgICAgICBpbnQgZGlzcF9wYzsKKyAgICAgIGJmZF92bWEgZGlzcF9wY19hZGRyID0gMDsKKworICAgICAgZm9yIChuID0gMDsgbiA8IDQ7IG4rKykKKwl7CisJICBpbnQgaSA9IG9wLT5uaWJibGVzW25dOworCisJICBpZiAoaSA8IDE2KSAKKwkgICAgeworCSAgICAgIGlmIChuaWJzW25dID09IGkpCisJCWNvbnRpbnVlOworCSAgICAgIGdvdG8gZmFpbDsKKwkgICAgfQorCSAgc3dpdGNoIChpKQorCSAgICB7CisJICAgIGNhc2UgQlJBTkNIXzg6CisJICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7CSAgCisJICAgICAgaWYgKGltbSAmIDB4ODApCisJCWltbSB8PSB+MHhmZjsKKwkgICAgICBpbW0gPSAoKGNoYXIpaW1tKSAqIDIgKyA0IDsKKwkgICAgICBnb3RvIG9rOworCSAgICBjYXNlIEJSQU5DSF8xMjoKKwkgICAgICBpbW0gPSAoKG5pYnNbMV0pIDw8IDgpIHwgKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7CisJICAgICAgaWYgKGltbSAmIDB4ODAwKQorCQlpbW0gfD0gfjB4ZmZmOworCSAgICAgIGltbSA9IGltbSAqIDIgKyA0OworCSAgICAgIGdvdG8gb2s7CisJICAgIGNhc2UgSU1NXzQ6CisJICAgICAgaW1tID0gbmlic1szXTsKKwkgICAgICBnb3RvIG9rOworCSAgICBjYXNlIElNTV80QlkyOgorCSAgICAgIGltbSA9IG5pYnNbM10gPDwxOworCSAgICAgIGdvdG8gb2s7CisJICAgIGNhc2UgSU1NXzRCWTQ6CisJICAgICAgaW1tID0gbmlic1szXSA8PDI7CisJICAgICAgZ290byBvazsKKwkgICAgY2FzZSBJTU1fODoKKwkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IG5pYnNbM107CisJICAgICAgZ290byBvazsKKwkgICAgY2FzZSBQQ1JFTElNTV84QlkyOgorCSAgICAgIGltbSA9ICgobmlic1syXSA8PCA0KSB8IG5pYnNbM10pIDw8MTsKKwkgICAgICByZWxtYXNrID0gfiAoYmZkX3ZtYSkgMTsKKwkgICAgICBnb3RvIG9rOworCSAgICBjYXNlIFBDUkVMSU1NXzhCWTQ6CisJICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwyOworCSAgICAgIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAzOworCSAgICAgIGdvdG8gb2s7CisJICAgIGNhc2UgSU1NXzhCWTI6CisJICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwxOworCSAgICAgIGdvdG8gb2s7CisJICAgIGNhc2UgSU1NXzhCWTQ6CisJICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwyOworCSAgICAgIGdvdG8gb2s7CisJICAgIGNhc2UgRElTUF84OgorCSAgICAgIGltbSA9IChuaWJzWzJdIDw8IDQpIHwgKG5pYnNbM10pOwkgIAorCSAgICAgIGdvdG8gb2s7CisJICAgIGNhc2UgRElTUF80OgorCSAgICAgIGltbSA9IG5pYnNbM107CisJICAgICAgZ290byBvazsKKwkgICAgY2FzZSBSRUdfTjoKKwkgICAgICBybiA9IG5pYnNbbl07CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkVHX006CisJICAgICAgcm0gPSBuaWJzW25dOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJFR19OTToKKwkgICAgICBybiA9IChuaWJzW25dICYgMHhjKSA+PiAyOworCSAgICAgIHJtID0gKG5pYnNbbl0gJiAweDMpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJFR19COgorCSAgICAgIHJiID0gbmlic1tuXSAmIDB4MDc7CisJICAgICAgYnJlYWs7CQorCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwl9CisKKyAgICBvazoKKyAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwiJXNcdCIsIG9wLT5uYW1lKTsKKyAgICAgIGRpc3BfcGMgPSAwOworICAgICAgZm9yIChuID0gMDsgbiA8IDMgJiYgb3AtPmFyZ1tuXSAhPSBBX0VORDsgbisrKSAKKwl7CisJICBpZiAobiAmJiBvcC0+YXJnWzFdICE9IEFfRU5EKQorCSAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIsIik7CisJICBzd2l0Y2ggKG9wLT5hcmdbbl0pIAorCSAgICB7CisJICAgIGNhc2UgQV9JTU06CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiIyVkIiwgKGNoYXIpKGltbSkpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfUjA6CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicjAiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1JFR19OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZCIsIHJuKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0lOQ19OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrIiwgcm4pOwkKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0RFQ19OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAtciVkIiwgcm4pOwkKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0lORF9OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQiLCBybik7CQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfRElTUF9SRUdfTjoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLHIlZCkiLCBpbW0sIHJuKTsJCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9SRUdfTToKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWQiLCBybSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9JTkNfTToKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkKyIsIHJtKTsJCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9ERUNfTToKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJALXIlZCIsIHJtKTsJCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9JTkRfTToKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAciVkIiwgcm0pOwkKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0RJU1BfUkVHX006CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQCglZCxyJWQpIiwgaW1tLCBybSk7CQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfUkVHX0I6CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkX2JhbmsiLCByYik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9ESVNQX1BDOgorCSAgICAgIGRpc3BfcGMgPSAxOworCSAgICAgIGRpc3BfcGNfYWRkciA9IGltbSArIDQgKyAobWVtYWRkciAmIHJlbG1hc2spOworCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoZGlzcF9wY19hZGRyLCBpbmZvKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0lORF9SMF9SRUdfTjoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLHIlZCkiLCBybik7CisJICAgICAgYnJlYWs7IAorCSAgICBjYXNlIEFfSU5EX1IwX1JFR19NOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsciVkKSIsIHJtKTsKKwkgICAgICBicmVhazsgCisJICAgIGNhc2UgQV9ESVNQX0dCUjoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLGdicikiLGltbSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9SMF9HQlI6CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxnYnIpIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9CRElTUDEyOgorCSAgICBjYXNlIEFfQkRJU1A4OgorCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW1tICsgbWVtYWRkciwgaW5mbyk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TUjoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzciIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfR0JSOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImdiciIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfVkJSOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInZiciIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfU1NSOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNzciIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfU1BDOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNwYyIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfTUFDSDoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJtYWNoIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9NQUNMOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSAsIm1hY2wiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1BSOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInByIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TR1I6CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic2dyIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9EQlI6CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZGJyIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRkRfUkVHX046CisJICAgICAgaWYgKDApCisJCWdvdG8gZF9yZWdfbjsKKwkgICAgY2FzZSBGX1JFR19OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyJWQiLCBybik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRl9SRUdfTToKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmciVkIiwgcm0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERYX1JFR19OOgorCSAgICAgIGlmIChybiAmIDEpCisJCXsKKwkJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4ZCVkIiwgcm4gJiB+MSk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgZF9yZWdfbjoKKwkgICAgY2FzZSBEX1JFR19OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImRyJWQiLCBybik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFhfUkVHX006CisJICAgICAgaWYgKHJtICYgMSkKKwkJeworCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInhkJWQiLCBybSAmIH4xKTsKKwkJICBicmVhazsKKwkJfQorCSAgICBjYXNlIERfUkVHX006CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZHIlZCIsIHJtKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBGUFNDUl9NOgorCSAgICBjYXNlIEZQU0NSX046CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnBzY3IiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBGUFVMX006CisJICAgIGNhc2UgRlBVTF9OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZwdWwiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBGX0ZSMDoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcjAiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBWX1JFR19OOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZ2JWQiLCBybio0KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBWX1JFR19NOgorCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZ2JWQiLCBybSo0KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBYTVRSWF9NNDoKKwkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJ4bXRyeCIpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwl9CisKKyNpZiAwCisgICAgICAvKiBUaGlzIGNvZGUgcHJpbnRzIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90cyBvbiB0aGUgc2FtZSBsaW5lCisgICAgICAgICBhcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgdGhlIGRlbGF5IHNsb3RzLiAgVGhpcyBjYW4gYmUKKyAgICAgICAgIGNvbmZ1c2luZywgc2luY2Ugb3RoZXIgZGlzYXNzZW1ibGVyIGRvbid0IHdvcmsgdGhpcyB3YXksIGFuZAorICAgICAgICAgaXQgbWVhbnMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgYWxsIGluIGEgbGluZS4gIFNvIEkKKyAgICAgICAgIGRpc2FibGVkIGl0LiAgSWFuLiAgKi8KKyAgICAgIGlmICghKGluZm8tPmZsYWdzICYgMSkKKwkgICYmIChvcC0+bmFtZVswXSA9PSAnaicKKwkgICAgICB8fCAob3AtPm5hbWVbMF0gPT0gJ2InCisJCSAgJiYgKG9wLT5uYW1lWzFdID09ICdyJyAKKwkJICAgICAgfHwgb3AtPm5hbWVbMV0gPT0gJ3MnKSkKKwkgICAgICB8fCAob3AtPm5hbWVbMF0gPT0gJ3InICYmIG9wLT5uYW1lWzFdID09ICd0JykKKwkgICAgICB8fCAob3AtPm5hbWVbMF0gPT0gJ2InICYmIG9wLT5uYW1lWzJdID09ICcuJykpKQorCXsKKwkgIGluZm8tPmZsYWdzIHw9IDE7CisJICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdChzbG90ICIpOworCSAgcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIgKyAyLCBpbmZvKTsKKwkgIGluZm8tPmZsYWdzICY9IH4xOworCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAiKSIpOworCSAgcmV0dXJuIDQ7CisJfQorI2VuZGlmCisKKyAgICAgIGlmIChkaXNwX3BjICYmIHN0cmNtcCAob3AtPm5hbWUsICJtb3ZhIikgIT0gMCkKKwl7CisJICBpbnQgc2l6ZTsKKwkgIGJmZF9ieXRlIGJ5dGVzWzRdOworCisJICBpZiAocmVsbWFzayA9PSB+IChiZmRfdm1hKSAxKQorCSAgICBzaXplID0gMjsKKwkgIGVsc2UKKwkgICAgc2l6ZSA9IDQ7CisJICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChkaXNwX3BjX2FkZHIsIGJ5dGVzLCBzaXplLCBpbmZvKTsKKwkgIGlmIChzdGF0dXMgPT0gMCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCB2YWw7CisKKwkgICAgICBpZiAoc2l6ZSA9PSAyKQorCQl7CisJCSAgaWYgKChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpICE9IDApCisJCSAgICB2YWwgPSBiZmRfZ2V0bDE2IChieXRlcyk7CisJCSAgZWxzZQorCQkgICAgdmFsID0gYmZkX2dldGIxNiAoYnl0ZXMpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKChpbmZvLT5mbGFncyAmIExJVFRMRV9CSVQpICE9IDApCisJCSAgICB2YWwgPSBiZmRfZ2V0bDMyIChieXRlcyk7CisJCSAgZWxzZQorCQkgICAgdmFsID0gYmZkX2dldGIzMiAoYnl0ZXMpOworCQl9CisJICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiXHQhIDB4JXgiLCB2YWwpOworCSAgICB9CisJfQorCisgICAgICByZXR1cm4gMjsKKyAgICBmYWlsOgorICAgICAgOworCisgICAgfQorICBmcHJpbnRmX2ZuIChzdHJlYW0sICIud29yZCAweCV4JXgleCV4Iiwgbmlic1swXSwgbmlic1sxXSwgbmlic1syXSwgbmlic1szXSk7CisgIHJldHVybiAyOworfQorCitpbnQgCitwcmludF9pbnNuX3NobCAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50IHI7CisKKyAgaW5mby0+ZmxhZ3MgPSBMSVRUTEVfQklUOworICByID0gcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pOworICByZXR1cm4gcjsKK30KKworaW50IAorcHJpbnRfaW5zbl9zaCAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50IHI7CisKKyAgaW5mby0+ZmxhZ3MgPSAwOworICByID0gcHJpbnRfaW5zbl9zaHggKG1lbWFkZHIsIGluZm8pOworICByZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvc2gtb3BjLmggYi9vcGNvZGVzL3NoLW9wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMWFhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3NoLW9wYy5oCkBAIC0wLDAgKzEsNTczIEBACisvKiBEZWZpbml0aW9ucyBmb3IgU0ggb3Bjb2Rlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlIRVhfMCwKKwlIRVhfMSwKKwlIRVhfMiwKKwlIRVhfMywKKwlIRVhfNCwKKwlIRVhfNSwKKwlIRVhfNiwKKwlIRVhfNywKKwlIRVhfOCwKKwlIRVhfOSwKKwlIRVhfQSwKKwlIRVhfQiwKKwlIRVhfQywKKwlIRVhfRCwKKwlIRVhfRSwKKwlIRVhfRiwKKwlSRUdfTiwKKwlSRUdfTSwKKwlSRUdfTk0sCisgICAgICAgIFJFR19CLAorCUJSQU5DSF8xMiwKKwlCUkFOQ0hfOCwKKwlESVNQXzgsCisJRElTUF80LAorCUlNTV80LAorCUlNTV80QlkyLAorCUlNTV80Qlk0LAorCVBDUkVMSU1NXzhCWTIsCisJUENSRUxJTU1fOEJZNCwKKwlJTU1fOCwKKwlJTU1fOEJZMiwKKwlJTU1fOEJZNAorfSBzaF9uaWJibGVfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlBX0VORCwKKwlBX0JESVNQMTIsCisJQV9CRElTUDgsCisJQV9ERUNfTSwKKwlBX0RFQ19OLAorCUFfRElTUF9HQlIsCisJQV9ESVNQX1BDLAorCUFfRElTUF9SRUdfTSwKKwlBX0RJU1BfUkVHX04sCisJQV9HQlIsCisJQV9JTU0sCisJQV9JTkNfTSwKKwlBX0lOQ19OLAorCUFfSU5EX00sCisJQV9JTkRfTiwKKwlBX0lORF9SMF9SRUdfTSwKKwlBX0lORF9SMF9SRUdfTiwKKwlBX01BQ0gsCisJQV9NQUNMLAorCUFfUFIsCisJQV9SMCwKKwlBX1IwX0dCUiwKKwlBX1JFR19NLAorCUFfUkVHX04sCisJQV9SRUdfQiwKKwlBX1NSLAorCUFfVkJSLAorCUFfU1NSLAorCUFfU1BDLAorCUFfU0dSLAorCUFfREJSLAorCUZfUkVHX04sCisJRl9SRUdfTSwKKwlEX1JFR19OLAorCURfUkVHX00sCisJWF9SRUdfTiwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCisJWF9SRUdfTSwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCisJRFhfUkVHX04sCisJRFhfUkVHX00sCisJVl9SRUdfTiwKKwlWX1JFR19NLAorCUZEX1JFR19OLAorCVhNVFJYX000LAorCUZfRlIwLAorCUZQVUxfTiwKKwlGUFVMX00sCisJRlBTQ1JfTiwKKwlGUFNDUl9NCit9IHNoX2FyZ190eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKm5hbWU7CisgIHNoX2FyZ190eXBlIGFyZ1s0XTsKKyAgc2hfbmliYmxlX3R5cGUgbmliYmxlc1s0XTsKK30gc2hfb3Bjb2RlX2luZm87CisKKyNpZmRlZiBERUZJTkVfVEFCTEUKKworc2hfb3Bjb2RlX2luZm8gc2hfdGFibGVbXSA9IHsKKworLyogMDExMW5ubm5pOCoxLi4uLiBhZGQgIzxpbW0+LDxSRUdfTj4gICoveyJhZGQiLHtBX0lNTSxBX1JFR19OfSx7SEVYXzcsUkVHX04sSU1NXzh9fSwKKworLyogMDAxMW5ubm5tbW1tMTEwMCBhZGQgPFJFR19NPiw8UkVHX04+ICoveyJhZGQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0N9fSwKKworLyogMDAxMW5ubm5tbW1tMTExMCBhZGRjIDxSRUdfTT4sPFJFR19OPioveyJhZGRjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9FfX0sCisKKy8qIDAwMTFubm5ubW1tbTExMTEgYWRkdiA8UkVHX00+LDxSRUdfTj4qL3siYWRkdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRn19LAorCisvKiAxMTAwMTAwMWk4KjEuLi4uIGFuZCAjPGltbT4sUjAgICAgICAgKi97ImFuZCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOSxJTU1fOH19LAorCisvKiAwMDEwbm5ubm1tbW0xMDAxIGFuZCA8UkVHX00+LDxSRUdfTj4gKi97ImFuZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfOX19LAorCisvKiAxMTAwMTEwMWk4KjEuLi4uIGFuZC5iICM8aW1tPixAKFIwLEdCUikqL3siYW5kLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9ELElNTV84fX0sCisKKy8qIDEwMTBpMTIuLi4uLi4uLi4gYnJhIDxiZGlzcDEyPiAgICAgICAqL3siYnJhIix7QV9CRElTUDEyfSx7SEVYX0EsQlJBTkNIXzEyfX0sCisKKy8qIDEwMTFpMTIuLi4uLi4uLi4gYnNyIDxiZGlzcDEyPiAgICAgICAqL3siYnNyIix7QV9CRElTUDEyfSx7SEVYX0IsQlJBTkNIXzEyfX0sCisKKy8qIDEwMDAxMDAxaThwMS4uLi4gYnQgPGJkaXNwOD4gICAgICAgICAqL3siYnQiLHtBX0JESVNQOH0se0hFWF84LEhFWF85LEJSQU5DSF84fX0sCisKKy8qIDEwMDAxMDExaThwMS4uLi4gYmYgPGJkaXNwOD4gICAgICAgICAqL3siYmYiLHtBX0JESVNQOH0se0hFWF84LEhFWF9CLEJSQU5DSF84fX0sCisKKy8qIDEwMDAxMTAxaThwMS4uLi4gYnQucyA8YmRpc3A4PiAgICAgICAqL3siYnQucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9fSwKKworLyogMTAwMDExMDFpOHAxLi4uLiBidC9zIDxiZGlzcDg+ICAgICAgICoveyJidC9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH19LAorCisvKiAxMDAwMTExMWk4cDEuLi4uIGJmLnMgPGJkaXNwOD4gICAgICAgKi97ImJmLnMiLHtBX0JESVNQOH0se0hFWF84LEhFWF9GLEJSQU5DSF84fX0sCisKKy8qIDEwMDAxMTExaThwMS4uLi4gYmYvcyA8YmRpc3A4PiAgICAgICAqL3siYmYvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9fSwKKworLyogMDAwMDAwMDAwMDEwMTAwMCBjbHJtYWMgICAgICAgICAgICAgICoveyJjbHJtYWMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYXzh9fSwKKworLyogMDAwMDAwMDAwMTAwMTAwMCBjbHJzICAgICAgICAgICAgICAgICoveyJjbHJzIix7MH0se0hFWF8wLEhFWF8wLEhFWF80LEhFWF84fX0sCisKKy8qIDAwMDAwMDAwMDAwMDEwMDAgY2xydCAgICAgICAgICAgICAgICAqL3siY2xydCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOH19LAorCisvKiAxMDAwMTAwMGk4KjEuLi4uIGNtcC9lcSAjPGltbT4sUjAgICAgKi97ImNtcC9lcSIse0FfSU1NLEFfUjB9LHtIRVhfOCxIRVhfOCxJTU1fOH19LAorCisvKiAwMDExbm5ubm1tbW0wMDAwIGNtcC9lcSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2VxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8wfX0sCisKKy8qIDAwMTFubm5ubW1tbTAwMTEgY21wL2dlIDxSRUdfTT4sPFJFR19OPioveyJjbXAvZ2UiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzN9fSwKKworLyogMDAxMW5ubm5tbW1tMDExMSBjbXAvZ3QgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ndCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfN319LAorCisvKiAwMDExbm5ubm1tbW0wMTEwIGNtcC9oaSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hpIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF82fX0sCisKKy8qIDAwMTFubm5ubW1tbTAwMTAgY21wL2hzIDxSRUdfTT4sPFJFR19OPioveyJjbXAvaHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzJ9fSwKKworLyogMDEwMG5ubm4wMDAxMDEwMSBjbXAvcGwgPFJFR19OPiAgICAgICoveyJjbXAvcGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzV9fSwKKworLyogMDEwMG5ubm4wMDAxMDAwMSBjbXAvcHogPFJFR19OPiAgICAgICoveyJjbXAvcHoiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzF9fSwKKworLyogMDAxMG5ubm5tbW1tMTEwMCBjbXAvc3RyIDxSRUdfTT4sPFJFR19OPioveyJjbXAvc3RyIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9DfX0sCisKKy8qIDAwMTBubm5ubW1tbTAxMTEgZGl2MHMgPFJFR19NPiw8UkVHX04+Ki97ImRpdjBzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF83fX0sCisKKy8qIDAwMDAwMDAwMDAwMTEwMDEgZGl2MHUgICAgICAgICAgICAgICAqL3siZGl2MHUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzl9fSwKKworLyogMDAxMW5ubm5tbW1tMDEwMCBkaXYxIDxSRUdfTT4sPFJFR19OPioveyJkaXYxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF80fX0sCisKKy8qIDAxMTBubm5ubW1tbTExMTAgZXh0cy5iIDxSRUdfTT4sPFJFR19OPioveyJleHRzLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0V9fSwKKworLyogMDExMG5ubm5tbW1tMTExMSBleHRzLncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRn19LAorCisvKiAwMTEwbm5ubm1tbW0xMTAwIGV4dHUuYiA8UkVHX00+LDxSRUdfTj4qL3siZXh0dS5iIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9DfX0sCisKKy8qIDAxMTBubm5ubW1tbTExMDEgZXh0dS53IDxSRUdfTT4sPFJFR19OPioveyJleHR1LnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0R9fSwKKworLyogMDEwMG5ubm4wMDEwMTAxMSBqbXAgQDxSRUdfTj4gICAgICAgICoveyJqbXAiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0J9fSwKKworLyogMDEwMG5ubm4wMDAwMTAxMSBqc3IgQDxSRUdfTj4gICAgICAgICoveyJqc3IiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0J9fSwKKworLyogMDEwMG5ubm4wMDAwMTExMCBsZGMgPFJFR19OPixTUiAgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfRX19LAorCisvKiAwMTAwbm5ubjAwMDExMTEwIGxkYyA8UkVHX04+LEdCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfRX19LAorCisvKiAwMTAwbm5ubjAwMTAxMTEwIGxkYyA8UkVHX04+LFZCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9WQlJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfRX19LAorCisvKiAwMTAwbm5ubjAwMTExMTEwIGxkYyA8UkVHX04+LFNTUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfRX19LAorCisvKiAwMTAwbm5ubjAxMDAxMTEwIGxkYyA8UkVHX04+LFNQQyAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUEN9LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfRX19LAorCisvKiAwMTAwbm5ubjAxMTExMTEwIGxkYyA8UkVHX04+LERCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9EQlJ9LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfRX19LAorCisvKiAwMTAwbm5ubjF4eHgxMTEwIGxkYyA8UkVHX04+LFJuX0JBTksgKi97ImxkYyIse0FfUkVHX04sQV9SRUdfQn0se0hFWF80LFJFR19OLFJFR19CLEhFWF9FfX0sCisKKy8qIDAxMDBubm5uMDAwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNSICAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfN319LAorCisvKiAwMTAwbm5ubjAwMDEwMTExIGxkYy5sIEA8UkVHX04+KyxHQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0dCUn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF83fX0sCisKKy8qIDAxMDBubm5uMDAxMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFZCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfVkJSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzd9fSwKKworLyogMDEwMG5ubm4wMDExMDExMSBsZGMubCBAPFJFR19OPissU1NSICoveyJsZGMubCIse0FfSU5DX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfN319LAorCisvKiAwMTAwbm5ubjAxMDAwMTExIGxkYy5sIEA8UkVHX04+KyxTUEMgKi97ImxkYy5sIix7QV9JTkNfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF83fX0sCisKKy8qIDAxMDBubm5uMDExMTAxMTEgbGRjLmwgQDxSRUdfTj4rLERCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzd9fSwKKworLyogMDEwMG5ubm4xeHh4MDExMSBsZGMubCA8UkVHX04+LFJuX0JBTksgKi97ImxkYy5sIix7QV9JTkNfTixBX1JFR19CfSx7SEVYXzQsUkVHX04sUkVHX0IsSEVYXzd9fSwKKworLyogMDEwMG5ubm4wMDAwMTAxMCBsZHMgPFJFR19OPixNQUNIICAgICoveyJsZHMiLHtBX1JFR19OLEFfTUFDSH0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9BfX0sCisKKy8qIDAxMDBubm5uMDAwMTEwMTAgbGRzIDxSRUdfTj4sTUFDTCAgICAqL3sibGRzIix7QV9SRUdfTixBX01BQ0x9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQX19LAorCisvKiAwMTAwbm5ubjAwMTAxMDEwIGxkcyA8UkVHX04+LFBSICAgICAgKi97ImxkcyIse0FfUkVHX04sQV9QUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9BfX0sCisKKy8qIDAxMDBubm5uMDEwMTEwMTAgbGRzIDxSRUdfTj4sRlBVTCAgICAqL3sibGRzIix7QV9SRUdfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfQX19LAorCisvKiAwMTAwbm5ubjAxMTAxMDEwIGxkcyA8UkVHX00+LEZQU0NSICAgKi97ImxkcyIse0FfUkVHX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF9BfX0sCisKKy8qIDAxMDBubm5uMDAwMDAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0gqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDSH0se0hFWF80LFJFR19OLEhFWF8wLEhFWF82fX0sCisKKy8qIDAxMDBubm5uMDAwMTAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0wqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDTH0se0hFWF80LFJFR19OLEhFWF8xLEhFWF82fX0sCisKKy8qIDAxMDBubm5uMDAxMDAxMTAgbGRzLmwgQDxSRUdfTj4rLFBSICAqL3sibGRzLmwiLHtBX0lOQ19OLEFfUFJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfNn19LAorCisvKiAwMTAwbm5ubjAxMDEwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFVMKi97Imxkcy5sIix7QV9JTkNfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfNn19LAorCisvKiAwMTAwbm5ubjAxMTAwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFNDUioveyJsZHMubCIse0FfSU5DX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF82fX0sCisKKy8qIDAwMDAwMDAwMDAxMTEwMDAgbGR0bGIgICAgICAgICAgICAgICAqL3sibGR0bGIiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzMsSEVYXzh9fSwKKworLyogMDEwMG5ubm5tbW1tMTExMSBtYWMudyBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy53Iix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0Z9fSwKKworLyogMTExMG5ubm5pOCoxLi4uLiBtb3YgIzxpbW0+LDxSRUdfTj4gICoveyJtb3YiLHtBX0lNTSxBX1JFR19OfSx7SEVYX0UsUkVHX04sSU1NXzh9fSwKKworLyogMDExMG5ubm5tbW1tMDAxMSBtb3YgPFJFR19NPiw8UkVHX04+ICoveyJtb3YiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzN9fSwKKworLyogMDAwMG5ubm5tbW1tMDEwMCBtb3YuYiA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF80fX0sCisKKy8qIDAwMTBubm5ubW1tbTAxMDAgbW92LmIgPFJFR19NPixALTxSRUdfTj4qL3sibW92LmIiLHsgQV9SRUdfTSxBX0RFQ19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzR9fSwKKworLyogMDAxMG5ubm5tbW1tMDAwMCBtb3YuYiA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi5iIix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8wfX0sCisKKy8qIDEwMDAwMTAwbW1tbWk0KjEgbW92LmIgQCg8ZGlzcD4sPFJFR19NPiksUjAqL3sibW92LmIiLHtBX0RJU1BfUkVHX00sQV9SMH0se0hFWF84LEhFWF80LFJFR19NLElNTV80fX0sCisKKy8qIDExMDAwMTAwaTgqMS4uLi4gbW92LmIgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YuYiIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF80LElNTV84fX0sCisKKy8qIDAwMDBubm5ubW1tbTExMDAgbW92LmIgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5iIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9DfX0sCisKKy8qIDAxMTBubm5ubW1tbTAxMDAgbW92LmIgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmIiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNH19LAorCisvKiAwMTEwbm5ubm1tbW0wMDAwIG1vdi5iIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmIiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMH19LAorCisvKiAxMDAwMDAwMG1tbW1pNCoxIG1vdi5iIFIwLEAoPGRpc3A+LDxSRUdfTT4pKi97Im1vdi5iIix7QV9SMCxBX0RJU1BfUkVHX019LHtIRVhfOCxIRVhfMCxSRUdfTSxJTU1fNH19LAorCisvKiAxMTAwMDAwMGk4KjEuLi4uIG1vdi5iIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMCxJTU1fOH19LAorCisvKiAwMDAxbm5ubm1tbW1pNCo0IG1vdi5sIDxSRUdfTT4sQCg8ZGlzcD4sPFJFR19OPikqL3sibW92LmwiLHsgQV9SRUdfTSxBX0RJU1BfUkVHX059LHtIRVhfMSxSRUdfTixSRUdfTSxJTU1fNEJZNH19LAorCisvKiAwMDAwbm5ubm1tbW0wMTEwIG1vdi5sIDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YubCIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzZ9fSwKKworLyogMDAxMG5ubm5tbW1tMDExMCBtb3YubCA8UkVHX00+LEAtPFJFR19OPioveyJtb3YubCIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNn19LAorCisvKiAwMDEwbm5ubm1tbW0wMDEwIG1vdi5sIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmwiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzJ9fSwKKworLyogMDEwMW5ubm5tbW1taTQqNCBtb3YubCBAKDxkaXNwPiw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9ESVNQX1JFR19NLEFfUkVHX059LHtIRVhfNSxSRUdfTixSRUdfTSxJTU1fNEJZNH19LAorCisvKiAxMTAwMDExMGk4KjQuLi4uIG1vdi5sIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmwiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNixJTU1fOEJZNH19LAorCisvKiAxMTAxbm5ubmk4cDQuLi4uIG1vdi5sIEAoPGRpc3A+LFBDKSw8UkVHX04+Ki97Im1vdi5sIix7QV9ESVNQX1BDLEFfUkVHX059LHtIRVhfRCxSRUdfTixQQ1JFTElNTV84Qlk0fX0sCisKKy8qIDAwMDBubm5ubW1tbTExMTAgbW92LmwgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9FfX0sCisKKy8qIDAxMTBubm5ubW1tbTAxMTAgbW92LmwgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmwiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNn19LAorCisvKiAwMTEwbm5ubm1tbW0wMDEwIG1vdi5sIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmwiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMn19LAorCisvKiAxMTAwMDAxMGk4KjQuLi4uIG1vdi5sIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmwiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMixJTU1fOEJZNH19LAorCisvKiAwMDAwbm5ubm1tbW0wMTAxIG1vdi53IDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YudyIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzV9fSwKKworLyogMDAxMG5ubm5tbW1tMDEwMSBtb3YudyA8UkVHX00+LEAtPFJFR19OPioveyJtb3YudyIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNX19LAorCisvKiAwMDEwbm5ubm1tbW0wMDAxIG1vdi53IDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LnciLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzF9fSwKKworLyogMTAwMDAxMDFtbW1taTQqMiBtb3YudyBAKDxkaXNwPiw8UkVHX00+KSxSMCoveyJtb3YudyIse0FfRElTUF9SRUdfTSxBX1IwfSx7SEVYXzgsSEVYXzUsUkVHX00sSU1NXzRCWTJ9fSwKKworLyogMTEwMDAxMDFpOCoyLi4uLiBtb3YudyBAKDxkaXNwPixHQlIpLFIwKi97Im1vdi53Iix7QV9ESVNQX0dCUixBX1IwfSx7SEVYX0MsSEVYXzUsSU1NXzhCWTJ9fSwKKworLyogMTAwMW5ubm5pOHAyLi4uLiBtb3YudyBAKDxkaXNwPixQQyksPFJFR19OPioveyJtb3YudyIse0FfRElTUF9QQyxBX1JFR19OfSx7SEVYXzksUkVHX04sUENSRUxJTU1fOEJZMn19LAorCisvKiAwMDAwbm5ubm1tbW0xMTAxIG1vdi53IEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YudyIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRH19LAorCisvKiAwMTEwbm5ubm1tbW0wMTAxIG1vdi53IEA8UkVHX00+Kyw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkNfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzV9fSwKKworLyogMDExMG5ubm5tbW1tMDAwMSBtb3YudyBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzF9fSwKKworLyogMTAwMDAwMDFtbW1taTQqMiBtb3YudyBSMCxAKDxkaXNwPiw8UkVHX00+KSoveyJtb3YudyIse0FfUjAsQV9ESVNQX1JFR19NfSx7SEVYXzgsSEVYXzEsUkVHX00sSU1NXzRCWTJ9fSwKKworLyogMTEwMDAwMDFpOCoyLi4uLiBtb3YudyBSMCxAKDxkaXNwPixHQlIpKi97Im1vdi53Iix7QV9SMCxBX0RJU1BfR0JSfSx7SEVYX0MsSEVYXzEsSU1NXzhCWTJ9fSwKKworLyogMTEwMDAxMTFpOHA0Li4uLiBtb3ZhIEAoPGRpc3A+LFBDKSxSMCoveyJtb3ZhIix7QV9ESVNQX1BDLEFfUjB9LHtIRVhfQyxIRVhfNyxQQ1JFTElNTV84Qlk0fX0sCisvKiAwMDAwbm5ubjExMDAwMDExIG1vdmNhLmwgUjAsQDxSRUdfTj4gKi97Im1vdmNhLmwiLHtBX1IwLEFfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQyxIRVhfM319LAorCisKKy8qIDAwMDBubm5uMDAxMDEwMDEgbW92dCA8UkVHX04+ICAgICAgICAqL3sibW92dCIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfOX19LAorCisvKiAwMDEwbm5ubm1tbW0xMTExIG11bHMgPFJFR19NPiw8UkVHX04+Ki97Im11bHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9fSwKKworLyogMDAwMG5ubm5tbW1tMDExMSBtdWwubCA8UkVHX00+LDxSRUdfTj4qL3sibXVsLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzd9fSwKKworLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1IDxSRUdfTT4sPFJFR19OPioveyJtdWx1Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfX0sCisKKy8qIDAxMTBubm5ubW1tbTEwMTEgbmVnIDxSRUdfTT4sPFJFR19OPiAqL3sibmVnIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9CfX0sCisKKy8qIDAxMTBubm5ubW1tbTEwMTAgbmVnYyA8UkVHX00+LDxSRUdfTj4qL3sibmVnYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQX19LAorCisvKiAwMDAwMDAwMDAwMDAxMDAxIG5vcCAgICAgICAgICAgICAgICAgKi97Im5vcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOX19LAorCisvKiAwMTEwbm5ubm1tbW0wMTExIG5vdCA8UkVHX00+LDxSRUdfTj4gKi97Im5vdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfN319LAorLyogMDAwMG5ubm4xMDAxMDAxMSBvY2JpIEA8UkVHX04+ICAgICAgICoveyJvY2JpIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF85LEhFWF8zfX0sCisKKy8qIDAwMDBubm5uMTAxMDAwMTEgb2NicCBAPFJFR19OPiAgICAgICAqL3sib2NicCIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQSxIRVhfM319LAorCisvKiAwMDAwbm5ubjEwMTEwMDExIG9jYndiIEA8UkVHX04+ICAgICAgKi97Im9jYndiIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF9CLEhFWF8zfX0sCisKKworLyogMTEwMDEwMTFpOCoxLi4uLiBvciAjPGltbT4sUjAgICAgICAgICoveyJvciIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfQixJTU1fOH19LAorCisvKiAwMDEwbm5ubm1tbW0xMDExIG9yIDxSRUdfTT4sPFJFR19OPiAgKi97Im9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9CfX0sCisKKy8qIDExMDAxMTExaTgqMS4uLi4gb3IuYiAjPGltbT4sQChSMCxHQlIpKi97Im9yLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9GLElNTV84fX0sCisKKy8qIDAwMDBubm5uMTAwMDAwMTEgcHJlZiBAPFJFR19OPiAgICAgICAqL3sicHJlZiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfOCxIRVhfM319LAorCisvKiAwMTAwbm5ubjAwMTAwMTAwIHJvdGNsIDxSRUdfTj4gICAgICAgKi97InJvdGNsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF80fX0sCisKKy8qIDAxMDBubm5uMDAxMDAxMDEgcm90Y3IgPFJFR19OPiAgICAgICAqL3sicm90Y3IiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzV9fSwKKworLyogMDEwMG5ubm4wMDAwMDEwMCByb3RsIDxSRUdfTj4gICAgICAgICoveyJyb3RsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF80fX0sCisKKy8qIDAxMDBubm5uMDAwMDAxMDEgcm90ciA8UkVHX04+ICAgICAgICAqL3sicm90ciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNX19LAorCisvKiAwMDAwMDAwMDAwMTAxMDExIHJ0ZSAgICAgICAgICAgICAgICAgKi97InJ0ZSIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMixIRVhfQn19LAorCisvKiAwMDAwMDAwMDAwMDAxMDExIHJ0cyAgICAgICAgICAgICAgICAgKi97InJ0cyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfQn19LAorCisvKiAwMDAwMDAwMDAxMDExMDAwIHNldHMgICAgICAgICAgICAgICAgKi97InNldHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzUsSEVYXzh9fSwKKy8qIDAwMDAwMDAwMDAwMTEwMDAgc2V0dCAgICAgICAgICAgICAgICAqL3sic2V0dCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfOH19LAorCisvKiAwMTAwbm5ubm1tbW0xMTAwIHNoYWQgPFJFR19NPiw8UkVHX04+Ki97InNoYWQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0N9fSwKKworLyogMDEwMG5ubm5tbW1tMTEwMSBzaGxkIDxSRUdfTT4sPFJFR19OPioveyJzaGxkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF80LFJFR19OLFJFR19NLEhFWF9EfX0sCisKKy8qIDAxMDBubm5uMDAxMDAwMDAgc2hhbCA8UkVHX04+ICAgICAgICAqL3sic2hhbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfMH19LAorCisvKiAwMTAwbm5ubjAwMTAwMDAxIHNoYXIgPFJFR19OPiAgICAgICAgKi97InNoYXIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzF9fSwKKworLyogMDEwMG5ubm4wMDAwMDAwMCBzaGxsIDxSRUdfTj4gICAgICAgICoveyJzaGxsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8wfX0sCisKKy8qIDAxMDBubm5uMDAxMDEwMDAgc2hsbDE2IDxSRUdfTj4gICAgICAqL3sic2hsbDE2Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF84fX0sCisKKy8qIDAxMDBubm5uMDAwMDEwMDAgc2hsbDIgPFJFR19OPiAgICAgICAqL3sic2hsbDIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzh9fSwKKworLyogMDEwMG5ubm4wMDAxMTAwMCBzaGxsOCA8UkVHX04+ICAgICAgICoveyJzaGxsOCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfOH19LAorCisvKiAwMTAwbm5ubjAwMDAwMDAxIHNobHIgPFJFR19OPiAgICAgICAgKi97InNobHIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzF9fSwKKworLyogMDEwMG5ubm4wMDEwMTAwMSBzaGxyMTYgPFJFR19OPiAgICAgICoveyJzaGxyMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzl9fSwKKworLyogMDEwMG5ubm4wMDAwMTAwMSBzaGxyMiA8UkVHX04+ICAgICAgICoveyJzaGxyMiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfOX19LAorCisvKiAwMTAwbm5ubjAwMDExMDAxIHNobHI4IDxSRUdfTj4gICAgICAgKi97InNobHI4Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF85fX0sCisKKy8qIDAwMDAwMDAwMDAwMTEwMTEgc2xlZXAgICAgICAgICAgICAgICAqL3sic2xlZXAiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYX0J9fSwKKworLyogMDAwMG5ubm4wMDAwMDAxMCBzdGMgU1IsPFJFR19OPiAgICAgICoveyJzdGMiLHtBX1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfMn19LAorCisvKiAwMDAwbm5ubjAwMDEwMDEwIHN0YyBHQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfR0JSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMSxIRVhfMn19LAorCisvKiAwMDAwbm5ubjAwMTAwMDEwIHN0YyBWQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfVkJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfMn19LAorCisvKiAwMDAwbm5ubjAwMTEwMDEwIHN0YyBTU1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfMn19LAorCisvKiAwMDAwbm5ubjAxMDAwMDEwIHN0YyBTUEMsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1BDLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNCxIRVhfMn19LAorCisvKiAwMDAwbm5ubjAxMTAwMDEwIHN0YyBTR1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU0dSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfMn19LAorCisvKiAwMDAwbm5ubjAxMTEwMDEwIHN0YyBEQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfREJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNyxIRVhfMn19LAorCisvKiAwMDAwbm5ubjF4eHgwMDEyIHN0YyBSbl9CQU5LLDxSRUdfTj4gKi97InN0YyIse0FfUkVHX0IsQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19CLEhFWF8yfX0sCisKKy8qIDAxMDBubm5uMDAwMDAwMTEgc3RjLmwgU1IsQC08UkVHX04+ICAqL3sic3RjLmwiLHtBX1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfM319LAorCisvKiAwMTAwbm5ubjAwMDEwMDExIHN0Yy5sIEdCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9HQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8zfX0sCisKKy8qIDAxMDBubm5uMDAxMDAwMTEgc3RjLmwgVkJSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1ZCUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzN9fSwKKworLyogMDEwMG5ubm4wMDExMDAxMSBzdGMubCBTU1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfM319LAorCisvKiAwMTAwbm5ubjAxMDAwMDExIHN0Yy5sIFNQQyxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9TUEMsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF80LEhFWF8zfX0sCisKKy8qIDAxMDBubm5uMDExMDAwMTEgc3RjLmwgU0dSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1NHUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYXzN9fSwKKworLyogMDEwMG5ubm4wMTExMDAxMSBzdGMubCBEQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfREJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfM319LAorCisvKiAwMTAwbm5ubjF4eHgwMDEyIHN0Yy5sIFJuX0JBTkssQC08UkVHX04+ICoveyJzdGMubCIse0FfUkVHX0IsQV9ERUNfTn0se0hFWF80LFJFR19OLFJFR19CLEhFWF8zfX0sCisKKy8qIDAwMDBubm5uMDAwMDEwMTAgc3RzIE1BQ0gsPFJFR19OPiAgICAqL3sic3RzIix7QV9NQUNILEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfQX19LAorCisvKiAwMDAwbm5ubjAwMDExMDEwIHN0cyBNQUNMLDxSRUdfTj4gICAgKi97InN0cyIse0FfTUFDTCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzEsSEVYX0F9fSwKKworLyogMDAwMG5ubm4wMDEwMTAxMCBzdHMgUFIsPFJFR19OPiAgICAgICoveyJzdHMiLHtBX1BSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfQX19LAorCisvKiAwMDAwbm5ubjAxMDExMDEwIHN0cyBGUFVMLDxSRUdfTj4gICAgKi97InN0cyIse0ZQVUxfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzUsSEVYX0F9fSwKKworLyogMDAwMG5ubm4wMTEwMTAxMCBzdHMgRlBTQ1IsPFJFR19OPiAgICoveyJzdHMiLHtGUFNDUl9NLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfQX19LAorCisvKiAwMTAwbm5ubjAwMDAwMDEwIHN0cy5sIE1BQ0gsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNILEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMn19LAorCisvKiAwMTAwbm5ubjAwMDEwMDEwIHN0cy5sIE1BQ0wsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNMLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMn19LAorCisvKiAwMTAwbm5ubjAwMTAwMDEwIHN0cy5sIFBSLEAtPFJFR19OPiAgKi97InN0cy5sIix7QV9QUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzJ9fSwKKworLyogMDEwMG5ubm4wMTAxMDAxMCBzdHMubCBGUFVMLEAtPFJFR19OPioveyJzdHMubCIse0ZQVUxfTSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzUsSEVYXzJ9fSwKKworLyogMDEwMG5ubm4wMTEwMDAxMCBzdHMubCBGUFNDUixALTxSRUdfTj4qL3sic3RzLmwiLHtGUFNDUl9NLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfMn19LAorCisvKiAwMDExbm5ubm1tbW0xMDAwIHN1YiA8UkVHX00+LDxSRUdfTj4gKi97InN1YiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfOH19LAorCisvKiAwMDExbm5ubm1tbW0xMDEwIHN1YmMgPFJFR19NPiw8UkVHX04+Ki97InN1YmMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0F9fSwKKworLyogMDAxMW5ubm5tbW1tMTAxMSBzdWJ2IDxSRUdfTT4sPFJFR19OPioveyJzdWJ2Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9CfX0sCisKKy8qIDAxMTBubm5ubW1tbTEwMDAgc3dhcC5iIDxSRUdfTT4sPFJFR19OPioveyJzd2FwLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzh9fSwKKworLyogMDExMG5ubm5tbW1tMTAwMSBzd2FwLncgPFJFR19NPiw8UkVHX04+Ki97InN3YXAudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOX19LAorCisvKiAwMTAwbm5ubjAwMDExMDExIHRhcy5iIEA8UkVHX04+ICAgICAgKi97InRhcy5iIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF9CfX0sCisKKy8qIDExMDAwMDExaTgqMS4uLi4gdHJhcGEgIzxpbW0+ICAgICAgICAqL3sidHJhcGEiLHtBX0lNTX0se0hFWF9DLEhFWF8zLElNTV84fX0sCisKKy8qIDExMDAxMDAwaTgqMS4uLi4gdHN0ICM8aW1tPixSMCAgICAgICAqL3sidHN0Iix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF84LElNTV84fX0sCisKKy8qIDAwMTBubm5ubW1tbTEwMDAgdHN0IDxSRUdfTT4sPFJFR19OPiAqL3sidHN0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF84fX0sCisKKy8qIDExMDAxMTAwaTgqMS4uLi4gdHN0LmIgIzxpbW0+LEAoUjAsR0JSKSoveyJ0c3QuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0MsSU1NXzh9fSwKKworLyogMTEwMDEwMTBpOCoxLi4uLiB4b3IgIzxpbW0+LFIwICAgICAgICoveyJ4b3IiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYX0EsSU1NXzh9fSwKKworLyogMDAxMG5ubm5tbW1tMTAxMCB4b3IgPFJFR19NPiw8UkVHX04+ICoveyJ4b3IiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0F9fSwKKworLyogMTEwMDExMTBpOCoxLi4uLiB4b3IuYiAjPGltbT4sQChSMCxHQlIpKi97Inhvci5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRSxJTU1fOH19LAorCisvKiAwMDEwbm5ubm1tbW0xMTAxIHh0cmN0IDxSRUdfTT4sPFJFR19OPioveyJ4dHJjdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRH19LAorCisvKiAwMDAwbm5ubm1tbW0wMTExIG11bC5sIDxSRUdfTT4sPFJFR19OPioveyJtdWwubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfN319LAorCisvKiAwMTAwbm5ubjAwMDEwMDAwIGR0IDxSRUdfTj4gICAgICAgICAgKi97ImR0Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8wfX0sCisKKy8qIDAwMTFubm5ubW1tbTExMDEgZG11bHMubCA8UkVHX00+LDxSRUdfTj4qL3siZG11bHMubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRH19LAorCisvKiAwMDExbm5ubm1tbW0wMTAxIGRtdWx1LmwgPFJFR19NPiw8UkVHX04+Ki97ImRtdWx1LmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzV9fSwKKworLyogMDAwMG5ubm5tbW1tMTExMSBtYWMubCBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy5sIix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0Z9fSwKKworLyogMDAwMG5ubm4wMDEwMDAxMSBicmFmIDxSRUdfTj4gICAgICAgKi97ImJyYWYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzN9fSwKKworLyogMDAwMG5ubm4wMDAwMDAxMSBic3JmIDxSRUdfTj4gICAgICAgKi97ImJzcmYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzN9fSwKKworLyogMTExMW5ubm4wMTAxMTEwMSBmYWJzIDxGX1JFR19OPiAgICAgKi97ImZhYnMiLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF81LEhFWF9EfX0sCisKKy8qIDExMTFubm5ubW1tbTAwMDAgZmFkZCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZhZGQiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMH19LAorLyogMTExMW5ubjBtbW0wMDAwMCBmYWRkIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmFkZCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8wfX0sCisKKy8qIDExMTFubm5ubW1tbTAxMDAgZmNtcC9lcSA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZXEiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNH19LAorLyogMTExMW5ubjBtbW0wMDEwMCBmY21wL2VxIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmNtcC9lcSIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF80fX0sCisKKy8qIDExMTFubm5ubW1tbTAxMDEgZmNtcC9ndCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZ3QiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNX19LAorLyogMTExMW5ubjBtbW0wMDEwMSBmY21wL2d0IDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmNtcC9ndCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF81fX0sCisKKy8qIDExMTFubm4wMTAxMTExMDEgZmNudmRzIDxEX1JFR19OPixGUFVMKi97ImZjbnZkcyIse0RfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYX0IsSEVYX0R9fSwKKworLyogMTExMW5ubjAxMDEwMTEwMSBmY252c2QgRlBVTCw8RF9SRUdfTj4qL3siZmNudnNkIix7RlBVTF9NLERfUkVHX059LHtIRVhfRixSRUdfTixIRVhfQSxIRVhfRH19LAorCisvKiAxMTExbm5ubm1tbW0wMDExIGZkaXYgPEZfUkVHX00+LDxGX1JFR19OPioveyJmZGl2Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzN9fSwKKy8qIDExMTFubm4wbW1tMDAwMTEgZmRpdiA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZkaXYiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfM319LAorCisvKiAxMTExbm5tbTExMTAxMTAxIGZpcHIgPFZfUkVHX00+LDxWX1JFR19OPioveyJmaXByIix7Vl9SRUdfTSxWX1JFR19OfSx7SEVYX0YsUkVHX05NLEhFWF9FLEhFWF9EfX0sCisKKy8qIDExMTFubm5uMTAwMDExMDEgZmxkaTAgPEZfUkVHX04+ICAgICoveyJmbGRpMCIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfOCxIRVhfRH19LAorCisvKiAxMTExbm5ubjEwMDExMTAxIGZsZGkxIDxGX1JFR19OPiAgICAqL3siZmxkaTEiLHtGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzksSEVYX0R9fSwKKworLyogMTExMW5ubm4wMDAxMTEwMSBmbGRzIDxGX1JFR19OPixGUFVMKi97ImZsZHMiLHtGX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF8xLEhFWF9EfX0sCisKKy8qIDExMTFubm5uMDAxMDExMDEgZmxvYXQgRlBVTCw8RkRfUkVHX04+Ki97ImZsb2F0Iix7RlBVTF9NLEZEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzIsSEVYX0R9fSwKKworLyogMTExMW5ubm5tbW1tMTExMCBmbWFjIEZSMCw8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZtYWMiLHtGX0ZSMCxGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfRX19LAorCisvKiAxMTExbm5ubm1tbW0xMTAwIGZtb3YgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9fSwKKy8qIDExMTFubm5ubW1tbTExMDAgZm1vdiA8RFhfUkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9fSwKKworLyogMTExMW5ubm5tbW1tMTAwMCBmbW92IEA8UkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKKy8qIDExMTFubm5ubW1tbTEwMDAgZm1vdiBAPFJFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKKworLyogMTExMW5ubm5tbW1tMTAxMCBmbW92IDxGX1JFR19NPixAPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKKy8qIDExMTFubm5ubW1tbTEwMTAgZm1vdiA8RFhfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKKworLyogMTExMW5ubm5tbW1tMTAwMSBmbW92IEA8UkVHX00+Kyw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCisvKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YgQDxSRUdfTT4rLDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAorCisvKiAxMTExbm5ubm1tbW0xMDExIGZtb3YgPEZfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKKy8qIDExMTFubm5ubW1tbTEwMTEgZm1vdiA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7RFhfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfX0sCisKKy8qIDExMTFubm5ubW1tbTAxMTAgZm1vdiBAKFIwLDxSRUdfTT4pLDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCisvKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9SMF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCisKKy8qIDExMTFubm5ubW1tbTAxMTEgZm1vdiA8Rl9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCisvKiAxMTExbm5ubm1tbW0wMTExIGZtb3YgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCisKKy8qIDExMTFubm5ubW1tbTEwMDAgZm1vdi5kIEA8UkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkRfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCisKKy8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5kIDxEWF9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdi5kIix7RFhfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfX0sCisKKy8qIDExMTFubm5ubW1tbTEwMDEgZm1vdi5kIEA8UkVHX00+Kyw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAorCisvKiAxMTExbm5ubm1tbW0xMDExIGZtb3YuZCA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92LmQiLHtEWF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKKworLyogMTExMW5ubm5tbW1tMDExMCBmbW92LmQgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5EX1IwX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9fSwKKworLyogMTExMW5ubm5tbW1tMDExMSBmbW92LmQgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YuZCIse0RYX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9fSwKKworLyogMTExMW5ubm5tbW1tMTAwMCBmbW92LnMgQDxSRUdfTT4sPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5EX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCisKKy8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5zIDxGX1JFR19NPixAPFJFR19OPioveyJmbW92LnMiLHtGX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX19LAorCisvKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YucyBAPFJFR19NPissPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCisKKy8qIDExMTFubm5ubW1tbTEwMTEgZm1vdi5zIDxGX1JFR19NPixALTxSRUdfTj4qL3siZm1vdi5zIix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKKworLyogMTExMW5ubm5tbW1tMDExMCBmbW92LnMgQChSMCw8UkVHX00+KSw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCisKKy8qIDExMTFubm5ubW1tbTAxMTEgZm1vdi5zIDxGX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YucyIse0ZfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN319LAorCisvKiAxMTExbm5ubm1tbW0wMDEwIGZtdWwgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbXVsIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzJ9fSwKKy8qIDExMTFubm4wbW1tMDAwMTAgZm11bCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZtdWwiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMn19LAorCisvKiAxMTExbm5ubjAxMDAxMTAxIGZuZWcgPEZEX1JFR19OPiAgICAgKi97ImZuZWciLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF80LEhFWF9EfX0sCisKKy8qIDExMTExMDExMTExMTExMDEgZnJjaGcgICAgICAgICAgICAgICAqL3siZnJjaGciLHswfSx7SEVYX0YsSEVYX0IsSEVYX0YsSEVYX0R9fSwKKworLyogMTExMTAwMTExMTExMTEwMSBmc2NoZyAgICAgICAgICAgICAgICoveyJmc2NoZyIsezB9LHtIRVhfRixIRVhfMyxIRVhfRixIRVhfRH19LAorCisvKiAxMTExbm5ubjAxMTAxMTAxIGZzcXJ0IDxGRF9SRUdfTj4gICAgKi97ImZzcXJ0Iix7RkRfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNixIRVhfRH19LAorCisvKiAxMTExbm5ubjAwMDAxMTAxIGZzdHMgRlBVTCw8Rl9SRUdfTj4qL3siZnN0cyIse0ZQVUxfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzAsSEVYX0R9fSwKKworLyogMTExMW5ubm5tbW1tMDAwMSBmc3ViIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZnN1YiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8xfX0sCisvKiAxMTExbm5uMG1tbTAwMDAxIGZzdWIgPERfUkVHX00+LDxEX1JFR19OPioveyJmc3ViIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzF9fSwKKworLyogMTExMW5ubm4wMDExMTEwMSBmdHJjIDxGRF9SRUdfTj4sRlBVTCoveyJmdHJjIix7RkRfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYXzMsSEVYX0R9fSwKKworLyogMTExMW5uMDExMTExMTEwMSBmdHJ2IFhNVFJYX000LDxWX1JFR19uPioveyJmdHJ2Iix7WE1UUlhfTTQsVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRixIRVhfRH19LAorCit7IDAgfSAKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYyBiL29wY29kZXMvc3BhcmMtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3NWIyOAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvc3BhcmMtZGlzLmMKQEAgLTAsMCArMSw5NjkgQEAKKy8qIFByaW50IFNQQVJDIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKKy8qIEJpdG1hc2sgb2YgdjkgYXJjaGl0ZWN0dXJlcy4gICovCisjZGVmaW5lIE1BU0tfVjkgKCgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KSBcCisJCSB8ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkpCisvKiAxIGlmIElOU04gaXMgZm9yIHY5IG9ubHkuICAqLworI2RlZmluZSBWOV9PTkxZX1AoaW5zbikgKCEgKChpbnNuKS0+YXJjaGl0ZWN0dXJlICYgfk1BU0tfVjkpKQorLyogMSBpZiBJTlNOIGlzIGZvciB2OS4gICovCisjZGVmaW5lIFY5X1AoaW5zbikgKCgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIE1BU0tfVjkpICE9IDApCisKKy8qIFRoZSBzb3J0ZWQgb3Bjb2RlIHRhYmxlLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqc29ydGVkX29wY29kZXM7CisKKy8qIEZvciBmYXN0ZXIgbG9va3VwLCBhZnRlciBpbnNucyBhcmUgc29ydGVkIHRoZXkgYXJlIGhhc2hlZC4gICovCisvKiA/Pz8gSSB0aGluayB0aGVyZSBpcyByb29tIGZvciBldmVuIG1vcmUgaW1wcm92ZW1lbnQuICAqLworCisjZGVmaW5lIEhBU0hfU0laRSAyNTYKKy8qIEl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG9ubHkgbG9vayBhdCBpbnNuIGNvZGUgYml0cyBhcyB0aGF0IGlzIGhvdyB0aGUKKyAgIG9wY29kZSB0YWJsZSBpcyBoYXNoZWQuICBPUENPREVfQklUUyBpcyBhIHRhYmxlIG9mIHZhbGlkIGJpdHMgZm9yIGVhY2gKKyAgIG9mIHRoZSBtYWluIHR5cGVzICgwLDEsMiwzKS4gICovCitzdGF0aWMgaW50IG9wY29kZV9iaXRzWzRdID0geyAweDAxYzAwMDAwLCAweDAsIDB4MDFmODAwMDAsIDB4MDFmODAwMDAgfTsKKyNkZWZpbmUgSEFTSF9JTlNOKElOU04pIFwKKyAgKCgoKElOU04pID4+IDI0KSAmIDB4YzApIHwgKCgoSU5TTikgJiBvcGNvZGVfYml0c1soKElOU04pID4+IDMwKSAmIDNdKSA+PiAxOSkpCitzdHJ1Y3Qgb3Bjb2RlX2hhc2ggeworICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm5leHQ7CisgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZTsKK307CitzdGF0aWMgc3RydWN0IG9wY29kZV9oYXNoICpvcGNvZGVfaGFzaF90YWJsZVtIQVNIX1NJWkVdOworCitzdGF0aWMgdm9pZCBidWlsZF9oYXNoX3RhYmxlCisgIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiosIHN0cnVjdCBvcGNvZGVfaGFzaCAqKiwgaW50KSk7CitzdGF0aWMgaW50IGlzX2RlbGF5ZWRfYnJhbmNoIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKK3N0YXRpYyBpbnQgY29tcGFyZV9vcGNvZGVzIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7CitzdGF0aWMgaW50IGNvbXB1dGVfYXJjaF9tYXNrIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKKworLyogU2lnbi1leHRlbmQgYSB2YWx1ZSB3aGljaCBpcyBOIGJpdHMgbG9uZy4gICovCisjZGVmaW5lCVNFWCh2YWx1ZSwgYml0cykgXAorCSgoKChpbnQpKHZhbHVlKSkgPDwgKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpKQlcCisJCQkgPj4gKCg4ICogc2l6ZW9mIChpbnQpKSAtIGJpdHMpICkKKworc3RhdGljICBjaGFyICpyZWdfbmFtZXNbXSA9Cit7ICJnMCIsICJnMSIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsICJnNiIsICJnNyIsCQorICAibzAiLCAibzEiLCAibzIiLCAibzMiLCAibzQiLCAibzUiLCAic3AiLCAibzciLAkKKyAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJCisgICJpMCIsICJpMSIsICJpMiIsICJpMyIsICJpNCIsICJpNSIsICJmcCIsICJpNyIsCQorICAiZjAiLCAiZjEiLCAiZjIiLCAiZjMiLCAiZjQiLCAiZjUiLCAiZjYiLCAiZjciLAkKKyAgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwJCisgICJmMTYiLCAiZjE3IiwgImYxOCIsICJmMTkiLCAiZjIwIiwgImYyMSIsICJmMjIiLCAiZjIzIiwKKyAgImYyNCIsICJmMjUiLCAiZjI2IiwgImYyNyIsICJmMjgiLCAiZjI5IiwgImYzMCIsICJmMzEiLAorICAiZjMyIiwgImYzMyIsICJmMzQiLCAiZjM1IiwgImYzNiIsICJmMzciLCAiZjM4IiwgImYzOSIsCQorICAiZjQwIiwgImY0MSIsICJmNDIiLCAiZjQzIiwgImY0NCIsICJmNDUiLCAiZjQ2IiwgImY0NyIsCQorICAiZjQ4IiwgImY0OSIsICJmNTAiLCAiZjUxIiwgImY1MiIsICJmNTMiLCAiZjU0IiwgImY1NSIsCisgICJmNTYiLCAiZjU3IiwgImY1OCIsICJmNTkiLCAiZjYwIiwgImY2MSIsICJmNjIiLCAiZjYzIiwKKy8qIHBzciwgd2ltLCB0YnIsIGZwc3IsIGNwc3IgYXJlIHY4IG9ubHkuICAqLworICAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiZnBzciIsICJjcHNyIgorfTsKKworI2RlZmluZQlmcmVnX25hbWVzCSgmcmVnX25hbWVzWzQgKiA4XSkKKworLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgorICAgcmRwciBhbmQgd3JwciBpbnNucy4gICovCitzdGF0aWMgY2hhciAqdjlfcHJpdl9yZWdfbmFtZXNbXSA9Cit7CisgICJ0cGMiLCAidG5wYyIsICJ0c3RhdGUiLCAidHQiLCAidGljayIsICJ0YmEiLCAicHN0YXRlIiwgInRsIiwKKyAgInBpbCIsICJjd3AiLCAiY2Fuc2F2ZSIsICJjYW5yZXN0b3JlIiwgImNsZWFud2luIiwgIm90aGVyd2luIiwKKyAgIndzdGF0ZSIsICJmcSIKKyAgLyogInZlciIgLSBzcGVjaWFsIGNhc2VkICovCit9OworCisvKiBUaGVzZSBhcmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlcmUgcmVnaXN0ZXIgbnVtYmVyIGluCisgICByZCBhbmQgd3IgaW5zbnMgKC0xNikuICAqLworc3RhdGljIGNoYXIgKnY5YV9hc3JfcmVnX25hbWVzW10gPQoreworICAicGNyIiwgInBpYyIsICJkY3IiLCAiZ3NyIiwgInNldF9zb2Z0aW50IiwgImNsZWFyX3NvZnRpbnQiLAorICAic29mdGludCIsICJ0aWNrX2NtcHIiCit9OworCisvKiBNYWNyb3MgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcy4gIE5vdCBhbGwgZmllbGRzIGhhdmUKKyAgIG1hY3JvcyBkZWZpbmVkIGhlcmUsIG9ubHkgdGhvc2Ugd2hpY2ggYXJlIGFjdHVhbGx5IHVzZWQuICAqLworCisjZGVmaW5lIFhfUkQoaSkgKCgoaSkgPj4gMjUpICYgMHgxZikKKyNkZWZpbmUgWF9SUzEoaSkgKCgoaSkgPj4gMTQpICYgMHgxZikKKyNkZWZpbmUgWF9MRFNUX0koaSkgKCgoaSkgPj4gMTMpICYgMSkKKyNkZWZpbmUgWF9BU0koaSkgKCgoaSkgPj4gNSkgJiAweGZmKQorI2RlZmluZSBYX1JTMihpKSAoKChpKSA+PiAwKSAmIDB4MWYpCisjZGVmaW5lIFhfSU1NKGksbikgKCgoaSkgPj4gMCkgJiAoKDEgPDwgKG4pKSAtIDEpKQorI2RlZmluZSBYX1NJTU0oaSxuKSBTRVggKFhfSU1NICgoaSksIChuKSksIChuKSkKKyNkZWZpbmUgWF9ESVNQMjIoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZikKKyNkZWZpbmUgWF9JTU0yMihpKSBYX0RJU1AyMiAoaSkKKyNkZWZpbmUgWF9ESVNQMzAoaSkgKCgoaSkgPj4gMCkgJiAweDNmZmZmZmZmKQorCisvKiBUaGVzZSBhcmUgZm9yIHY5LiAgKi8KKyNkZWZpbmUgWF9ESVNQMTYoaSkgKCgoKChpKSA+PiAyMCkgJiAzKSA8PCAxNCkgfCAoKChpKSA+PiAwKSAmIDB4M2ZmZikpCisjZGVmaW5lIFhfRElTUDE5KGkpICgoKGkpID4+IDApICYgMHg3ZmZmZikKKyNkZWZpbmUgWF9NRU1CQVIoaSkgKChpKSAmIDB4N2YpCisKKy8qIEhlcmUgaXMgdGhlIHVuaW9uIHdoaWNoIHdhcyB1c2VkIHRvIGV4dHJhY3QgaW5zdHJ1Y3Rpb24gZmllbGRzCisgICBiZWZvcmUgdGhlIHNoaWZ0IGFuZCBtYXNrIG1hY3JvcyB3ZXJlIHdyaXR0ZW4uCisKKyAgIHVuaW9uIHNwYXJjX2luc24KKyAgICAgeworICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGNvZGU7CisgICAgICAgc3RydWN0CisJIHsKKwkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOworCSAgICNkZWZpbmUJb3AJbGRzdC5hbm9wCisJICAgdW5zaWduZWQgaW50IGFucmQ6NTsKKwkgICAjZGVmaW5lCXJkCWxkc3QuYW5yZAorCSAgIHVuc2lnbmVkIGludCBvcDM6NjsKKwkgICB1bnNpZ25lZCBpbnQgYW5yczE6NTsKKwkgICAjZGVmaW5lCXJzMQlsZHN0LmFucnMxCisJICAgdW5zaWduZWQgaW50IGk6MTsKKwkgICB1bnNpZ25lZCBpbnQgYW5hc2k6ODsKKwkgICAjZGVmaW5lCWFzaQlsZHN0LmFuYXNpCisJICAgdW5zaWduZWQgaW50IGFucnMyOjU7CisJICAgI2RlZmluZQlyczIJbGRzdC5hbnJzMgorCSAgICNkZWZpbmUJc2hjbnQJcnMyCisJIH0gbGRzdDsKKyAgICAgICBzdHJ1Y3QKKwkgeworCSAgIHVuc2lnbmVkIGludCBhbm9wOjIsIGFucmQ6NSwgb3AzOjYsIGFucnMxOjUsIGk6MTsKKwkgICB1bnNpZ25lZCBpbnQgSU1NMTM6MTM7CisJICAgI2RlZmluZQlpbW0xMwlJTU0xMy5JTU0xMworCSB9IElNTTEzOworICAgICAgIHN0cnVjdAorCSB7CisJICAgdW5zaWduZWQgaW50IGFub3A6MjsKKwkgICB1bnNpZ25lZCBpbnQgYToxOworCSAgIHVuc2lnbmVkIGludCBjb25kOjQ7CisJICAgdW5zaWduZWQgaW50IG9wMjozOworCSAgIHVuc2lnbmVkIGludCBESVNQMjI6MjI7CisJICAgI2RlZmluZQlkaXNwMjIJYnJhbmNoLkRJU1AyMgorCSAgICNkZWZpbmUJaW1tMjIJZGlzcDIyCisJIH0gYnJhbmNoOworICAgICAgIHN0cnVjdAorCSB7CisJICAgdW5zaWduZWQgaW50IGFub3A6MjsKKwkgICB1bnNpZ25lZCBpbnQgYToxOworCSAgIHVuc2lnbmVkIGludCB6OjE7CisJICAgdW5zaWduZWQgaW50IHJjb25kOjM7CisJICAgdW5zaWduZWQgaW50IG9wMjozOworCSAgIHVuc2lnbmVkIGludCBESVNQMTZISToyOworCSAgIHVuc2lnbmVkIGludCBwOjE7CisJICAgdW5zaWduZWQgaW50IF9yczE6NTsKKwkgICB1bnNpZ25lZCBpbnQgRElTUDE2TE86MTQ7CisJIH0gYnJhbmNoMTY7CisgICAgICAgc3RydWN0CisJIHsKKwkgICB1bnNpZ25lZCBpbnQgYW5vcDoyOworCSAgIHVuc2lnbmVkIGludCBhZGlzcDMwOjMwOworCSAgICNkZWZpbmUJZGlzcDMwCWNhbGwuYWRpc3AzMAorCSB9IGNhbGw7CisgICAgIH07CisKKyAgICovCisKKy8qIE5vbnplcm8gaWYgSU5TTiBpcyB0aGUgb3Bjb2RlIGZvciBhIGRlbGF5ZWQgYnJhbmNoLiAgKi8KK3N0YXRpYyBpbnQKK2lzX2RlbGF5ZWRfYnJhbmNoIChpbnNuKQorICAgICB1bnNpZ25lZCBsb25nIGluc247Cit7CisgIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7CisKKyAgZm9yIChvcCA9IG9wY29kZV9oYXNoX3RhYmxlW0hBU0hfSU5TTiAoaW5zbildOyBvcDsgb3AgPSBvcC0+bmV4dCkKKyAgICB7CisgICAgICBDT05TVCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGUgPSBvcC0+b3Bjb2RlOworICAgICAgaWYgKChvcGNvZGUtPm1hdGNoICYgaW5zbikgPT0gb3Bjb2RlLT5tYXRjaAorCSAgJiYgKG9wY29kZS0+bG9zZSAmIGluc24pID09IDApCisJcmV0dXJuIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBleHRlcm4gdm9pZCBxc29ydCAoKTsgKi8KKworLyogUmVjb3JkcyBjdXJyZW50IG1hc2sgb2YgU1BBUkNfT1BDT0RFX0FSQ0hfRk9PIHZhbHVlcywgdXNlZCB0byBwYXNzIHZhbHVlCisgICB0byBjb21wYXJlX29wY29kZXMuICAqLworc3RhdGljIHVuc2lnbmVkIGludCBjdXJyZW50X2FyY2hfbWFzazsKKworLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCisKKyAgIFdlIHN1ZmZpeCB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGNvbW1lbnQgdGhhdCBnaXZlcyB0aGUgYWJzb2x1dGUKKyAgIGFkZHJlc3MgaW52b2x2ZWQsIGFzIHdlbGwgYXMgaXRzIHN5bWJvbGljIGZvcm0sIGlmIHRoZSBpbnN0cnVjdGlvbgorICAgaXMgcHJlY2VkZWQgYnkgYSBmaW5kYWJsZSBgc2V0aGknIGFuZCBpdCBlaXRoZXIgYWRkcyBhbiBpbW1lZGlhdGUKKyAgIGRpc3BsYWNlbWVudCB0byB0aGF0IHJlZ2lzdGVyLCBvciBpdCBpcyBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uCisgICBvbiB0aGF0IHJlZ2lzdGVyLiAgKi8KKworaW50CitwcmludF9pbnNuX3NwYXJjIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIEZJTEUgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgYmZkX2J5dGUgYnVmZmVyWzRdOworICB1bnNpZ25lZCBsb25nIGluc247CisgIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3A7CisgIC8qIE5vbnplcm8gb2Ygb3Bjb2RlIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KKyAgc3RhdGljIGludCBvcGNvZGVzX2luaXRpYWxpemVkID0gMDsKKyAgLyogYmZkIG1hY2ggbnVtYmVyIG9mIGxhc3QgY2FsbC4gICovCisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfbWFjaCA9IDA7CisgIGJmZF92bWEgKCpnZXR3b3JkKSBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKKworICBpZiAoIW9wY29kZXNfaW5pdGlhbGl6ZWQKKyAgICAgIHx8IGluZm8tPm1hY2ggIT0gY3VycmVudF9tYWNoKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBjdXJyZW50X2FyY2hfbWFzayA9IGNvbXB1dGVfYXJjaF9tYXNrIChpbmZvLT5tYWNoKTsKKworICAgICAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkKQorCXNvcnRlZF9vcGNvZGVzID0gKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopCisJICB4bWFsbG9jIChzcGFyY19udW1fb3Bjb2RlcyAqIHNpemVvZiAoc3RydWN0IHNwYXJjX29wY29kZSAqKSk7CisgICAgICAvKiBSZXNldCB0aGUgc29ydGVkIHRhYmxlIHNvIHdlIGNhbiByZXNvcnQgaXQuICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHNwYXJjX251bV9vcGNvZGVzOyArK2kpCisJc29ydGVkX29wY29kZXNbaV0gPSAmc3BhcmNfb3Bjb2Rlc1tpXTsKKyAgICAgIHFzb3J0ICgoY2hhciAqKSBzb3J0ZWRfb3Bjb2Rlcywgc3BhcmNfbnVtX29wY29kZXMsCisJICAgICBzaXplb2YgKHNvcnRlZF9vcGNvZGVzWzBdKSwgY29tcGFyZV9vcGNvZGVzKTsKKworICAgICAgYnVpbGRfaGFzaF90YWJsZSAoc29ydGVkX29wY29kZXMsIG9wY29kZV9oYXNoX3RhYmxlLCBzcGFyY19udW1fb3Bjb2Rlcyk7CisgICAgICBjdXJyZW50X21hY2ggPSBpbmZvLT5tYWNoOworICAgICAgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDE7CisgICAgfQorCisgIHsKKyAgICBpbnQgc3RhdHVzID0KKyAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IDApCisgICAgICB7CisJKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJcmV0dXJuIC0xOworICAgICAgfQorICB9CisKKyAgLyogT24gU1BBUkNsaXRlIHZhcmlhbnRzIHN1Y2ggYXMgREFObGl0ZSAoc3BhcmM4NngpLCBpbnN0cnVjdGlvbnMKKyAgICAgYXJlIGFsd2F5cyBiaWctZW5kaWFuIGV2ZW4gd2hlbiB0aGUgbWFjaGluZSBpcyBpbiBsaXR0bGUtZW5kaWFuIG1vZGUuICovCisgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUpCisgICAgZ2V0d29yZCA9IGJmZF9nZXRiMzI7CisgIGVsc2UKKyAgICBnZXR3b3JkID0gYmZkX2dldGwzMjsKKworICBpbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKKworICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAxOwkJCS8qIFdlIGRvIHJldHVybiB0aGlzIGluZm8gKi8KKyAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsJCS8qIEFzc3VtZSBub24gYnJhbmNoIGluc24gKi8KKyAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsJCQkvKiBBc3N1bWUgbm8gZGVsYXkgKi8KKyAgaW5mby0+dGFyZ2V0ID0gMDsJCQkJLyogQXNzdW1lIG5vIHRhcmdldCBrbm93biAqLworCisgIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCisgICAgeworICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKKworICAgICAgLyogSWYgdGhlIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwgc2tpcCBpdC4gICovCisgICAgICBpZiAoISAob3Bjb2RlLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCisJY29udGludWU7CisKKyAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKKwkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQorCXsKKwkgIC8qIE5vbnplcm8gbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGFuIGluc3RydWN0aW9uIHdoaWNoIGhhcworCSAgICAgdGhlIGVmZmVjdCBvZiBhZGRpbmcgb3Igb3InaW5nIHRoZSBpbW0xMyBmaWVsZCB0byByczEuICAqLworCSAgaW50IGltbV9hZGRlZF90b19yczEgPSAwOworCisJICAvKiBOb256ZXJvIG1lYW5zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhIHBsdXMgc2lnbiBpbiB0aGUgYXJncworCSAgICAgZmllbGQgb2YgdGhlIG9wY29kZSB0YWJsZS4gICovCisJICBpbnQgZm91bmRfcGx1cyA9IDA7CisJICAKKwkgIC8qIE5vbnplcm8gbWVhbnMgd2UgaGF2ZSBhbiBhbm51bGxlZCBicmFuY2guICAqLworCSAgaW50IGlzX2FubnVsbGVkID0gMDsKKworCSAgLyogRG8gd2UgaGF2ZSBhbiBgYWRkJyBvciBgb3InIGluc3RydWN0aW9uIGNvbWJpbmluZyBhbgorICAgICAgICAgICAgIGltbWVkaWF0ZSB3aXRoIHJzMT8gICovCisJICBpZiAob3Bjb2RlLT5tYXRjaCA9PSAweDgwMTAyMDAwIHx8IG9wY29kZS0+bWF0Y2ggPT0gMHg4MDAwMjAwMCkKKwkgIC8qCQkJICAob3IpCQkJCSAoYWRkKSAgKi8KKwkgICAgaW1tX2FkZGVkX3RvX3JzMSA9IDE7CisKKwkgIGlmIChYX1JTMSAoaW5zbikgIT0gWF9SRCAoaW5zbikKKwkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+YXJncywgJ3InKSAhPSAwKQorCSAgICAgIC8qIENhbid0IGRvIHNpbXBsZSBmb3JtYXQgaWYgc291cmNlIGFuZCBkZXN0IGFyZSBkaWZmZXJlbnQuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgaWYgKFhfUlMyIChpbnNuKSAhPSBYX1JEIChpbnNuKQorCSAgICAgICYmIHN0cmNociAob3Bjb2RlLT5hcmdzLCAnTycpICE9IDApCisJICAgICAgLyogQ2FuJ3QgZG8gc2ltcGxlIGZvcm1hdCBpZiBzb3VyY2UgYW5kIGRlc3QgYXJlIGRpZmZlcmVudC4gICovCisJICAgICAgY29udGludWU7CisKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCBvcGNvZGUtPm5hbWUpOworCisJICB7CisJICAgIHJlZ2lzdGVyIENPTlNUIGNoYXIgKnM7CisKKwkgICAgaWYgKG9wY29kZS0+YXJnc1swXSAhPSAnLCcpCisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIgIik7CisJICAgIGZvciAocyA9IG9wY29kZS0+YXJnczsgKnMgIT0gJ1wwJzsgKytzKQorCSAgICAgIHsKKwkJd2hpbGUgKCpzID09ICcsJykKKwkJICB7CisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiwiKTsKKwkJICAgICsrczsKKwkJICAgIHN3aXRjaCAoKnMpIHsKKwkJICAgIGNhc2UgJ2EnOgorCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgImEiKTsKKwkJICAgICAgaXNfYW5udWxsZWQgPSAxOworCQkgICAgICArK3M7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgY2FzZSAnTic6CisJCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicG4iKTsKKwkJICAgICAgKytzOworCQkgICAgICBjb250aW51ZTsKKworCQkgICAgY2FzZSAnVCc6CisJCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAicHQiKTsKKwkJICAgICAgKytzOworCQkgICAgICBjb250aW51ZTsKKworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CQkvKiBzd2l0Y2ggb24gYXJnICovCisJCSAgfQkJLyogd2hpbGUgdGhlcmUgYXJlIGNvbW1hIHN0YXJ0ZWQgYXJncyAqLworCisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiICIpOworCQkJCisJCXN3aXRjaCAoKnMpCisJCSAgeworCQkgIGNhc2UgJysnOgorCQkgICAgZm91bmRfcGx1cyA9IDE7CisKKwkJICAgIC8qIG5vdGUgZmFsbC10aHJvdWdoICovCisJCSAgZGVmYXVsdDoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWMiLCAqcyk7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJyMnOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7CisJCSAgICBicmVhazsKKworI2RlZmluZQlyZWcobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwgcmVnX25hbWVzW25dKQorCQkgIGNhc2UgJzEnOgorCQkgIGNhc2UgJ3InOgorCQkgICAgcmVnIChYX1JTMSAoaW5zbikpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICcyJzoKKwkJICBjYXNlICdPJzoKKwkJICAgIHJlZyAoWF9SUzIgKGluc24pKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnZCc6CisJCSAgICByZWcgKFhfUkQgKGluc24pKTsKKwkJICAgIGJyZWFrOworI3VuZGVmCXJlZworCisjZGVmaW5lCWZyZWcobikJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbbl0pCisjZGVmaW5lCWZyZWd4KG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIGZyZWdfbmFtZXNbKChuKSAmIH4xKSB8ICgoKG4pICYgMSkgPDwgNSldKQorCQkgIGNhc2UgJ2UnOgorCQkgICAgZnJlZyAoWF9SUzEgKGluc24pKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgJ3YnOgkvKiBkb3VibGUvZXZlbiAqLworCQkgIGNhc2UgJ1YnOgkvKiBxdWFkL211bHRpcGxlIG9mIDQgKi8KKwkJICAgIGZyZWd4IChYX1JTMSAoaW5zbikpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdmJzoKKwkJICAgIGZyZWcgKFhfUlMyIChpbnNuKSk7CisJCSAgICBicmVhazsKKwkJICBjYXNlICdCJzoJLyogZG91YmxlL2V2ZW4gKi8KKwkJICBjYXNlICdSJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCisJCSAgICBmcmVneCAoWF9SUzIgKGluc24pKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnZyc6CisJCSAgICBmcmVnIChYX1JEIChpbnNuKSk7CisJCSAgICBicmVhazsKKwkJICBjYXNlICdIJzoJLyogZG91YmxlL2V2ZW4gKi8KKwkJICBjYXNlICdKJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCisJCSAgICBmcmVneCAoWF9SRCAoaW5zbikpOworCQkgICAgYnJlYWs7CisjdW5kZWYJZnJlZworI3VuZGVmCWZyZWd4CisKKyNkZWZpbmUJY3JlZyhuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYyV1IiwgKHVuc2lnbmVkIGludCkgKG4pKQorCQkgIGNhc2UgJ2InOgorCQkgICAgY3JlZyAoWF9SUzEgKGluc24pKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnYyc6CisJCSAgICBjcmVnIChYX1JTMiAoaW5zbikpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdEJzoKKwkJICAgIGNyZWcgKFhfUkQgKGluc24pKTsKKwkJICAgIGJyZWFrOworI3VuZGVmCWNyZWcKKworCQkgIGNhc2UgJ2gnOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWhpKCUjeCkiLAorCQkJCQkgICAoMHhGRkZGRkZGRgorCQkJCQkgICAgJiAoKGludCkgWF9JTU0yMiAoaW5zbikgPDwgMTApKSk7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ2knOgkvKiAxMyBiaXQgaW1tZWRpYXRlICovCisJCSAgY2FzZSAnSSc6CS8qIDExIGJpdCBpbW1lZGlhdGUgKi8KKwkJICBjYXNlICdqJzoJLyogMTAgYml0IGltbWVkaWF0ZSAqLworCQkgICAgeworCQkgICAgICBpbnQgaW1tOworCisJCSAgICAgIGlmICgqcyA9PSAnaScpCisJCSAgICAgICAgaW1tID0gWF9TSU1NIChpbnNuLCAxMyk7CisJCSAgICAgIGVsc2UgaWYgKCpzID09ICdJJykKKwkJCWltbSA9IFhfU0lNTSAoaW5zbiwgMTEpOworCQkgICAgICBlbHNlCisJCQlpbW0gPSBYX1NJTU0gKGluc24sIDEwKTsKKworCQkgICAgICAvKiBDaGVjayB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgMStpLCBhbmQgdGFrZQorCQkJIG5vdGUgb2YgdGhhdCBmYWN0LgorCisJCQkgTm90ZTogYmVjYXVzZSBvZiB0aGUgd2F5IHdlIHNvcnQgdGhlIHRhYmxlLAorCQkJIHdlIHdpbGwgYmUgbWF0Y2hpbmcgMStpIHJhdGhlciB0aGFuIGkrMSwKKwkJCSBzbyBpdCBpcyBPSyB0byBhc3N1bWUgdGhhdCBpIGlzIGFmdGVyICssCisJCQkgbm90IGJlZm9yZSBpdC4gICovCisJCSAgICAgIGlmIChmb3VuZF9wbHVzKQorCQkJaW1tX2FkZGVkX3RvX3JzMSA9IDE7CisJCSAgICAgIAorCQkgICAgICBpZiAoaW1tIDw9IDkpCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgaW1tKTsKKwkJICAgICAgZWxzZQorCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlI3giLCBpbW0pOworCQkgICAgfQorCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdYJzoJLyogNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCisJCSAgY2FzZSAnWSc6CS8qIDYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLworCQkgICAgeworCQkgICAgICBpbnQgaW1tID0gWF9JTU0gKGluc24sICpzID09ICdYJyA/IDUgOiA2KTsKKworCQkgICAgICBpZiAoaW1tIDw9IDkpCisJCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBpbW0pOworCQkgICAgICBlbHNlCisJCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSN4IiwgKHVuc2lnbmVkKSBpbW0pOworCQkgICAgfQorCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdLJzoKKwkJICAgIHsKKwkJICAgICAgaW50IG1hc2sgPSBYX01FTUJBUiAoaW5zbik7CisJCSAgICAgIGludCBiaXQgPSAweDQwLCBwcmludGVkX29uZSA9IDA7CisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKwkJICAgICAgaWYgKG1hc2sgPT0gMCkKKwkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIwIik7CisJCSAgICAgIGVsc2UKKwkJCXdoaWxlIChiaXQpCisJCQkgIHsKKwkJCSAgICBpZiAobWFzayAmIGJpdCkKKwkJCSAgICAgIHsKKwkJCQlpZiAocHJpbnRlZF9vbmUpCisJCQkJICAoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAifCIpOworCQkJCW5hbWUgPSBzcGFyY19kZWNvZGVfbWVtYmFyIChiaXQpOworCQkJCShpbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOworCQkJCXByaW50ZWRfb25lID0gMTsKKwkJCSAgICAgIH0KKwkJCSAgICBiaXQgPj49IDE7CisJCQkgIH0KKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisKKwkJICBjYXNlICdrJzoKKwkJICAgIGluZm8tPnRhcmdldCA9IG1lbWFkZHIgKyBTRVggKFhfRElTUDE2IChpbnNuKSwgMTYpICogNDsKKwkJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnRyc6CisJCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AxOSAoaW5zbiksIDE5KSAqIDQ7CisJCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJzYnOgorCQkgIGNhc2UgJzcnOgorCQkgIGNhc2UgJzgnOgorCQkgIGNhc2UgJzknOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZjYyVjIiwgKnMgLSAnNicgKyAnMCcpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICd6JzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVpY2MiKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnWic6CisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUleGNjIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ0UnOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWNjciIpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdzJzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcHJzIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ28nOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzaSIpOworCQkgICAgYnJlYWs7CisJCSAgICAKKwkJICBjYXNlICdXJzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0aWNrIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ1AnOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBjIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJz8nOgorCQkgICAgaWYgKFhfUlMxIChpbnNuKSA9PSAzMSkKKwkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXZlciIpOworCQkgICAgZWxzZSBpZiAoKHVuc2lnbmVkKSBYX1JTMSAoaW5zbikgPCAxNikKKwkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKKwkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JTMSAoaW5zbildKTsKKwkJICAgIGVsc2UKKwkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJyEnOgorCQkgICAgaWYgKCh1bnNpZ25lZCkgWF9SRCAoaW5zbikgPCAxNSkKKwkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKKwkJCQkJICAgICB2OV9wcml2X3JlZ19uYW1lc1tYX1JEIChpbnNuKV0pOworCQkgICAgZWxzZQorCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnLyc6CisJCSAgICBpZiAoWF9SUzEgKGluc24pIDwgMTYgfHwgWF9SUzEgKGluc24pID4gMjMpCisJCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOworCQkgICAgZWxzZQorCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAorCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUlMxIChpbnNuKS0xNl0pOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdfJzoKKwkJICAgIGlmIChYX1JEIChpbnNuKSA8IDE2IHx8IFhfUkQgKGluc24pID4gMjMpCisJCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOworCQkgICAgZWxzZQorCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLAorCQkJCQkgICAgIHY5YV9hc3JfcmVnX25hbWVzW1hfUkQgKGluc24pLTE2XSk7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJyonOgorCQkgICAgeworCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3ByZWZldGNoIChYX1JEIChpbnNuKSk7CisKKwkJICAgICAgaWYgKG5hbWUpCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7CisJCSAgICAgIGVsc2UKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLCBYX1JEIChpbnNuKSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgICAgCisJCSAgY2FzZSAnTSc6CisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNyJWQiLCBYX1JTMSAoaW5zbikpOworCQkgICAgYnJlYWs7CisJCSAgICAKKwkJICBjYXNlICdtJzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc3IlZCIsIFhfUkQgKGluc24pKTsKKwkJICAgIGJyZWFrOworCQkgICAgCisJCSAgY2FzZSAnTCc6CisJCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AzMCAoaW5zbiksIDMwKSAqIDQ7CisJCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ24nOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCisJCSAgICAgIChzdHJlYW0sICIlI3giLCBTRVggKFhfRElTUDIyIChpbnNuKSwgMjIpKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnbCc6CisJCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AyMiAoaW5zbiksIDIyKSAqIDQ7CisJCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ0EnOgorCQkgICAgeworCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX2FzaSAoWF9BU0kgKGluc24pKTsKKworCQkgICAgICBpZiAobmFtZSkKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKKwkJICAgICAgZWxzZQorCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIoJWQpIiwgWF9BU0kgKGluc24pKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisKKwkJICBjYXNlICdDJzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjc3IiKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAnRic6CisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnNyIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ3AnOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXBzciIpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdxJzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmcSIpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICdRJzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcSIpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICd0JzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV0YnIiKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSAndyc6CisJCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUld2ltIik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ3gnOgorCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsCisJCQkJCSAgICgoWF9MRFNUX0kgKGluc24pIDw8IDgpCisJCQkJCSAgICArIFhfQVNJIChpbnNuKSkpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlICd5JzoKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV5Iik7CisJCSAgICBicmVhazsKKworCQkgIGNhc2UgJ3UnOgorCQkgIGNhc2UgJ1UnOgorCQkgICAgeworCQkgICAgICBpbnQgdmFsID0gKnMgPT0gJ1UnID8gWF9SUzEgKGluc24pIDogWF9SRCAoaW5zbik7CisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcgKHZhbCk7CisKKwkJICAgICAgaWYgKG5hbWUpCisJCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7CisJCSAgICAgIGVsc2UKKwkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjcHJlZyglZCkiLCB2YWwpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgfQorCisJICAvKiBJZiB3ZSBhcmUgYWRkaW5nIG9yIG9yJ2luZyBzb21ldGhpbmcgdG8gcnMxLCB0aGVuCisJICAgICBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzCisJICAgICBhIHNldGhpIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIGluIHRoZSBzZXRoaS4KKwkgICAgIElmIHNvLCBhdHRlbXB0IHRvIHByaW50IHRoZSByZXN1bHQgb2YgdGhlIGFkZCBvcgorCSAgICAgb3IgKGluIHRoaXMgY29udGV4dCBhZGQgYW5kIG9yIGRvIHRoZSBzYW1lIHRoaW5nKQorCSAgICAgYW5kIGl0cyBzeW1ib2xpYyB2YWx1ZS4gICovCisJICBpZiAoaW1tX2FkZGVkX3RvX3JzMSkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgcHJldl9pbnNuOworCSAgICAgIGludCBlcnJjb2RlOworCisJICAgICAgZXJyY29kZSA9CisJCSgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKKwkJICAobWVtYWRkciAtIDQsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKKwkgICAgICBwcmV2X2luc24gPSBnZXR3b3JkIChidWZmZXIpOworCisJICAgICAgaWYgKGVycmNvZGUgPT0gMCkKKwkJeworCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKKwkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhbmNoLiAgVGhpcyBoYW5kbGVzCisJCSAgICAgc2VxdWVuY2VzIHN1Y2ggYXMKKworCQkgICAgIHNldGhpICVvMSwgJWhpKF9mb28pLCAlbzEKKwkJICAgICBjYWxsIF9wcmludGYKKwkJICAgICBvciAlbzEsICVsbyhfZm9vKSwgJW8xCisJCSAgICAgKi8KKworCQkgIGlmIChpc19kZWxheWVkX2JyYW5jaCAocHJldl9pbnNuKSkKKwkJICAgIHsKKwkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKKwkJCShtZW1hZGRyIC0gOCwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksIGluZm8pOworCQkgICAgICBwcmV2X2luc24gPSBnZXR3b3JkIChidWZmZXIpOworCQkgICAgfQorCQl9CisKKwkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQorCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3Qgc2V0aGkuICAqLworCSAgICAgIGlmIChlcnJjb2RlID09IDApCisJCXsKKwkJICAvKiBJcyBpdCBzZXRoaSB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCisJCSAgaWYgKChwcmV2X2luc24gJiAweGMxYzAwMDAwKSA9PSAweDAxMDAwMDAwCisJCSAgICAgICYmIFhfUkQgKHByZXZfaW5zbikgPT0gWF9SUzEgKGluc24pKQorCQkgICAgeworCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIlx0ISAiKTsKKwkJICAgICAgaW5mby0+dGFyZ2V0ID0gCisJCQkoMHhGRkZGRkZGRiAmIChpbnQpIFhfSU1NMjIgKHByZXZfaW5zbikgPDwgMTApCisJCQl8IFhfU0lNTSAoaW5zbiwgMTMpOworCQkgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJCSAgICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCQkgICAgICBpbmZvLT5kYXRhX3NpemUgPSA0OyAgLyogRklYTUUhISEgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIGlmIChvcGNvZGUtPmZsYWdzICYgKEZfVU5CUnxGX0NPTkRCUnxGX0pTUikpCisJICAgIHsKKwkJLyogRklYTUUgLS0gY2hlY2sgaXNfYW5udWxsZWQgZmxhZyAqLworCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9VTkJSKQorCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOworCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9DT05EQlIpCisJCWluZm8tPmluc25fdHlwZSA9IGRpc19jb25kYnJhbmNoOworCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9KU1IpCisJCWluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7CisJICAgICAgaWYgKG9wY29kZS0+ZmxhZ3MgJiBGX0RFTEFZRUQpCisJCWluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7CisJICAgIH0KKworCSAgcmV0dXJuIHNpemVvZiAoYnVmZmVyKTsKKwl9CisgICAgfQorCisgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwkvKiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbiAqLworICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgXygidW5rbm93biIpKTsKKyAgcmV0dXJuIHNpemVvZiAoYnVmZmVyKTsKK30KKworLyogR2l2ZW4gQkZEIG1hY2ggbnVtYmVyLCByZXR1cm4gYSBtYXNrIG9mIFNQQVJDX09QQ09ERV9BUkNIX0ZPTyB2YWx1ZXMuICAqLworCitzdGF0aWMgaW50Citjb21wdXRlX2FyY2hfbWFzayAobWFjaCkKKyAgICAgdW5zaWduZWQgbG9uZyBtYWNoOworeworICBzd2l0Y2ggKG1hY2gpCisgICAgeworICAgIGNhc2UgMCA6CisgICAgY2FzZSBiZmRfbWFjaF9zcGFyYyA6CisgICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpOworICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQgOgorICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKTsKKyAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZSA6CisgICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUgOgorICAgICAgLyogc3BhcmNsaXRlcyBpbnNucyBhcmUgcmVjb2duaXplZCBieSBkZWZhdWx0IChiZWNhdXNlIHRoYXQncyBob3cKKwkgdGhleSd2ZSBhbHdheXMgYmVlbiB0cmVhdGVkLCBmb3IgYmV0dGVyIG9yIHdvcnNlKS4gIEtsdWRnZSB0aGlzIGJ5CisJIGluZGljYXRpbmcgZ2VuZXJpYyB2OCBpcyBhbHNvIHNlbGVjdGVkLiAgKi8KKyAgICAgIHJldHVybiAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMSVRFKQorCSAgICAgIHwgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjgpKTsKKyAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyA6CisgICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OSA6CisgICAgICByZXR1cm4gU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjkpOworICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSA6CisgICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OWEgOgorICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5QSk7CisgICAgfQorICBhYm9ydCAoKTsKK30KKworLyogQ29tcGFyZSBvcGNvZGVzIEEgYW5kIEIuICAqLworCitzdGF0aWMgaW50Citjb21wYXJlX29wY29kZXMgKGEsIGIpCisgICAgIGNvbnN0IFBUUiBhOworICAgICBjb25zdCBQVFIgYjsKK3sKKyAgc3RydWN0IHNwYXJjX29wY29kZSAqb3AwID0gKiAoc3RydWN0IHNwYXJjX29wY29kZSAqKikgYTsKKyAgc3RydWN0IHNwYXJjX29wY29kZSAqb3AxID0gKiAoc3RydWN0IHNwYXJjX29wY29kZSAqKikgYjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbWF0Y2gwID0gb3AwLT5tYXRjaCwgbWF0Y2gxID0gb3AxLT5tYXRjaDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbG9zZTAgPSBvcDAtPmxvc2UsIGxvc2UxID0gb3AxLT5sb3NlOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKworICAvKiBJZiBvbmUgKGFuZCBvbmx5IG9uZSkgaW5zbiBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlLAorICAgICBwcmVmZXIgdGhlIG9uZSB0aGF0IGlzLiAgSWYgbmVpdGhlciBhcmUgc3VwcG9ydGVkLCBidXQgdGhleSdyZSBib3RoIGZvcgorICAgICB0aGUgc2FtZSBhcmNoaXRlY3R1cmUsIGNvbnRpbnVlIHByb2Nlc3NpbmcuICBPdGhlcndpc2UgKGJvdGggdW5zdXBwb3J0ZWQKKyAgICAgYW5kIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyksIHByZWZlciBsb3dlciBudW1iZXJlZCBhcmNoJ3MgKGZ1ZGdlZAorICAgICBieSBjb21wYXJpbmcgdGhlIGJpdG1hc2tzKS4gICovCisgIGlmIChvcDAtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQorICAgIHsKKyAgICAgIGlmICghIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKSkKKwlyZXR1cm4gLTE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG9wMS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spCisJcmV0dXJuIDE7CisgICAgICBlbHNlIGlmIChvcDAtPmFyY2hpdGVjdHVyZSAhPSBvcDEtPmFyY2hpdGVjdHVyZSkKKwlyZXR1cm4gb3AwLT5hcmNoaXRlY3R1cmUgLSBvcDEtPmFyY2hpdGVjdHVyZTsKKyAgICB9CisKKyAgLyogSWYgYSBiaXQgaXMgc2V0IGluIGJvdGggbWF0Y2ggYW5kIGxvc2UsIHRoZXJlIGlzIHNvbWV0aGluZworICAgICB3cm9uZyB3aXRoIHRoZSBvcGNvZGUgdGFibGUuICAqLworICBpZiAobWF0Y2gwICYgbG9zZTApCisgICAgeworICAgICAgZnByaW50ZgorCShzdGRlcnIsCisJIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJIF8oIkludGVybmFsIGVycm9yOiAgYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKKwkgb3AwLT5uYW1lLCBtYXRjaDAsIGxvc2UwKTsKKyAgICAgIG9wMC0+bG9zZSAmPSB+b3AwLT5tYXRjaDsKKyAgICAgIGxvc2UwID0gb3AwLT5sb3NlOworICAgIH0KKworICBpZiAobWF0Y2gxICYgbG9zZTEpCisgICAgeworICAgICAgZnByaW50ZgorCShzdGRlcnIsCisJIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIpLAorCSBvcDEtPm5hbWUsIG1hdGNoMSwgbG9zZTEpOworICAgICAgb3AxLT5sb3NlICY9IH5vcDEtPm1hdGNoOworICAgICAgbG9zZTEgPSBvcDEtPmxvc2U7CisgICAgfQorCisgIC8qIEJlY2F1c2UgdGhlIGJpdHMgdGhhdCBhcmUgdmFyaWFibGUgaW4gb25lIG9wY29kZSBhcmUgY29uc3RhbnQgaW4KKyAgICAgYW5vdGhlciwgaXQgaXMgaW1wb3J0YW50IHRvIG9yZGVyIHRoZSBvcGNvZGVzIGluIHRoZSByaWdodCBvcmRlci4gICovCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHggPSAxIDw8IGk7CisgICAgICBpbnQgeDAgPSAobWF0Y2gwICYgeCkgIT0gMDsKKyAgICAgIGludCB4MSA9IChtYXRjaDEgJiB4KSAhPSAwOworCisgICAgICBpZiAoeDAgIT0geDEpCisJcmV0dXJuIHgxIC0geDA7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHggPSAxIDw8IGk7CisgICAgICBpbnQgeDAgPSAobG9zZTAgJiB4KSAhPSAwOworICAgICAgaW50IHgxID0gKGxvc2UxICYgeCkgIT0gMDsKKworICAgICAgaWYgKHgwICE9IHgxKQorCXJldHVybiB4MSAtIHgwOworICAgIH0KKworICAvKiBUaGV5IGFyZSBmdW5jdGlvbmFsbHkgZXF1YWwuICBTbyBhcyBsb25nIGFzIHRoZSBvcGNvZGUgdGFibGUgaXMKKyAgICAgdmFsaWQsIHdlIGNhbiBwdXQgd2hpY2hldmVyIG9uZSBmaXJzdCB3ZSB3YW50LCBvbiBhZXN0aGV0aWMgZ3JvdW5kcy4gICovCisKKyAgLyogT3VyIGZpcnN0IGFlc3RoZXRpYyBncm91bmQgaXMgdGhhdCBhbGlhc2VzIGRlZmVyIHRvIHJlYWwgaW5zbnMuICAqLworICB7CisgICAgaW50IGFsaWFzX2RpZmYgPSAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC0gKG9wMS0+ZmxhZ3MgJiBGX0FMSUFTKTsKKyAgICBpZiAoYWxpYXNfZGlmZiAhPSAwKQorICAgICAgLyogUHV0IHRoZSBvbmUgdGhhdCBpc24ndCBhbiBhbGlhcyBmaXJzdC4gICovCisgICAgICByZXR1cm4gYWxpYXNfZGlmZjsKKyAgfQorCisgIC8qIEV4Y2VwdCBmb3IgYWxpYXNlcywgdHdvICJpZGVudGljYWwiIGluc3RydWN0aW9ucyBoYWQKKyAgICAgYmV0dGVyIGhhdmUgdGhlIHNhbWUgb3Bjb2RlLiAgVGhpcyBpcyBhIHNhbml0eSBjaGVjayBvbiB0aGUgdGFibGUuICAqLworICBpID0gc3RyY21wIChvcDAtPm5hbWUsIG9wMS0+bmFtZSk7CisgIGlmIChpKQorICAgIHsKKyAgICAgIGlmIChvcDAtPmZsYWdzICYgRl9BTElBUykgLyogSWYgdGhleSdyZSBib3RoIGFsaWFzZXMsIGJlIGFyYml0cmFyeS4gKi8KKwlyZXR1cm4gaTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmIChzdGRlcnIsCisJCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkgXygiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiID09IFwiJXNcIlxuIiksCisJCSBvcDAtPm5hbWUsIG9wMS0+bmFtZSk7CisgICAgfQorCisgIC8qIEZld2VyIGFyZ3VtZW50cyBhcmUgcHJlZmVycmVkLiAgKi8KKyAgeworICAgIGludCBsZW5ndGhfZGlmZiA9IHN0cmxlbiAob3AwLT5hcmdzKSAtIHN0cmxlbiAob3AxLT5hcmdzKTsKKyAgICBpZiAobGVuZ3RoX2RpZmYgIT0gMCkKKyAgICAgIC8qIFB1dCB0aGUgb25lIHdpdGggZmV3ZXIgYXJndW1lbnRzIGZpcnN0LiAgKi8KKyAgICAgIHJldHVybiBsZW5ndGhfZGlmZjsKKyAgfQorCisgIC8qIFB1dCAxK2kgYmVmb3JlIGkrMS4gICovCisgIHsKKyAgICBjaGFyICpwMCA9IChjaGFyICopIHN0cmNociAob3AwLT5hcmdzLCAnKycpOworICAgIGNoYXIgKnAxID0gKGNoYXIgKikgc3RyY2hyIChvcDEtPmFyZ3MsICcrJyk7CisKKyAgICBpZiAocDAgJiYgcDEpCisgICAgICB7CisJLyogVGhlcmUgaXMgYSBwbHVzIGluIGJvdGggb3BlcmFuZHMuICBOb3RlIHRoYXQgYSBwbHVzCisJICAgc2lnbiBjYW5ub3QgYmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBhcmdzLAorCSAgIHNvIHRoZSBmb2xsb3dpbmcgWy0xXSdzIGFyZSB2YWxpZC4gICovCisJaWYgKHAwWy0xXSA9PSAnaScgJiYgcDFbMV0gPT0gJ2knKQorCSAgLyogb3AwIGlzIGkrMSBhbmQgb3AxIGlzIDEraSwgc28gb3AxIGdvZXMgZmlyc3QuICAqLworCSAgcmV0dXJuIDE7CisJaWYgKHAwWzFdID09ICdpJyAmJiBwMVstMV0gPT0gJ2knKQorCSAgLyogb3AwIGlzIDEraSBhbmQgb3AxIGlzIGkrMSwgc28gb3AwIGdvZXMgZmlyc3QuICAqLworCSAgcmV0dXJuIC0xOworICAgICAgfQorICB9CisKKyAgLyogUHV0IDEsaSBiZWZvcmUgaSwxLiAgKi8KKyAgeworICAgIGludCBpMCA9IHN0cm5jbXAgKG9wMC0+YXJncywgImksMSIsIDMpID09IDA7CisgICAgaW50IGkxID0gc3RybmNtcCAob3AxLT5hcmdzLCAiaSwxIiwgMykgPT0gMDsKKworICAgIGlmIChpMCBeIGkxKQorICAgICAgcmV0dXJuIGkwIC0gaTE7CisgIH0KKworICAvKiBUaGV5IGFyZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBpZGVudGljYWwuCisgICAgIFNpbmNlIHFzb3J0IG1heSBoYXZlIHJlYXJyYW5nZWQgdGhlIHRhYmxlIHBhcnRpYWxseSwgdGhlcmUgaXMKKyAgICAgbm8gd2F5IHRvIHRlbGwgd2hpY2ggb25lIHdhcyBmaXJzdCBpbiB0aGUgb3Bjb2RlIHRhYmxlIGFzCisgICAgIHdyaXR0ZW4sIHNvIGp1c3Qgc2F5IHRoZXJlIGFyZSBlcXVhbC4gICovCisgIC8qID8/PyBUaGlzIGlzIG5vIGxvbmdlciB0cnVlIG5vdyB0aGF0IHdlIHNvcnQgYSB2ZWN0b3Igb2YgcG9pbnRlcnMsCisgICAgIG5vdCB0aGUgdGFibGUgaXRzZWxmLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEJ1aWxkIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBvcGNvZGUgdGFibGUuCisgICBPUENPREVfVEFCTEUgaXMgYSBzb3J0ZWQgbGlzdCBvZiBwb2ludGVycyBpbnRvIHRoZSBvcGNvZGUgdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfaGFzaF90YWJsZSAob3Bjb2RlX3RhYmxlLCBoYXNoX3RhYmxlLCBudW1fb3Bjb2RlcykKKyAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKm9wY29kZV90YWJsZTsKKyAgICAgc3RydWN0IG9wY29kZV9oYXNoICoqaGFzaF90YWJsZTsKKyAgICAgaW50IG51bV9vcGNvZGVzOworeworICByZWdpc3RlciBpbnQgaTsKKyAgaW50IGhhc2hfY291bnRbSEFTSF9TSVpFXTsKKyAgc3RhdGljIHN0cnVjdCBvcGNvZGVfaGFzaCAqaGFzaF9idWYgPSBOVUxMOworCisgIC8qIFN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIGFuZCB3b3JrIGJhY2t3YXJkcyBzbyB0aGF0IGVhY2gKKyAgICAgY2hhaW4gaXMgc29ydGVkLiAgKi8KKworICBtZW1zZXQgKGhhc2hfdGFibGUsIDAsIEhBU0hfU0laRSAqIHNpemVvZiAoaGFzaF90YWJsZVswXSkpOworICBtZW1zZXQgKGhhc2hfY291bnQsIDAsIEhBU0hfU0laRSAqIHNpemVvZiAoaGFzaF9jb3VudFswXSkpOworICBpZiAoaGFzaF9idWYgIT0gTlVMTCkKKyAgICBmcmVlIChoYXNoX2J1Zik7CisgIGhhc2hfYnVmID0gKHN0cnVjdCBvcGNvZGVfaGFzaCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcGNvZGVfaGFzaCkgKiBudW1fb3Bjb2Rlcyk7CisgIGZvciAoaSA9IG51bV9vcGNvZGVzIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGhhc2ggPSBIQVNIX0lOU04gKG9wY29kZV90YWJsZVtpXS0+bWF0Y2gpOworICAgICAgcmVnaXN0ZXIgc3RydWN0IG9wY29kZV9oYXNoICpoID0gJmhhc2hfYnVmW2ldOworICAgICAgaC0+bmV4dCA9IGhhc2hfdGFibGVbaGFzaF07CisgICAgICBoLT5vcGNvZGUgPSBvcGNvZGVfdGFibGVbaV07CisgICAgICBoYXNoX3RhYmxlW2hhc2hdID0gaDsKKyAgICAgICsraGFzaF9jb3VudFtoYXNoXTsKKyAgICB9CisKKyNpZiAwIC8qIGZvciBkZWJ1Z2dpbmcgKi8KKyAgeworICAgIGludCBtaW5fY291bnQgPSBudW1fb3Bjb2RlcywgbWF4X2NvdW50ID0gMDsKKyAgICBpbnQgdG90YWw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpCisgICAgICB7CisgICAgICAgIGlmIChoYXNoX2NvdW50W2ldIDwgbWluX2NvdW50KQorCSAgbWluX2NvdW50ID0gaGFzaF9jb3VudFtpXTsKKwlpZiAoaGFzaF9jb3VudFtpXSA+IG1heF9jb3VudCkKKwkgIG1heF9jb3VudCA9IGhhc2hfY291bnRbaV07CisJdG90YWwgKz0gaGFzaF9jb3VudFtpXTsKKyAgICAgIH0KKworICAgIHByaW50ZiAoIk9wY29kZSBoYXNoIHRhYmxlIHN0YXRzOiBtaW4gJWQsIG1heCAlZCwgYXZlICVmXG4iLAorCSAgICBtaW5fY291bnQsIG1heF9jb3VudCwgKGRvdWJsZSkgdG90YWwgLyBIQVNIX1NJWkUpOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvc3BhcmMtb3BjLmMgYi9vcGNvZGVzL3NwYXJjLW9wYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGIzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3NwYXJjLW9wYy5jCkBAIC0wLDAgKzEsMTkyMCBAQAorLyogVGFibGUgb2Ygb3Bjb2RlcyBmb3IgdGhlIHNwYXJjLgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBCRkQgbGlicmFyeS4KKworQkZEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworQkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLworCisvKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKKyAgIGluc3RydWN0aW9uJ3MgbmFtZSByYXRoZXIgdGhhbiB0aGUgYXJncy4gIFRoaXMgd291bGQgbWFrZSBnYXMgZmFzdGVyLCBwaW5zbgorICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgorCisvKiBTb21lIGRlZmluZXMgdG8gbWFrZSBsaWZlIGVhc3kuICAqLworI2RlZmluZSBNQVNLX1Y2CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WNikKKyNkZWZpbmUgTUFTS19WNwkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjcpCisjZGVmaW5lIE1BU0tfVjgJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KQorI2RlZmluZSBNQVNLX1NQQVJDTEVUCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKQorI2RlZmluZSBNQVNLX1NQQVJDTElURQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xJVEUpCisjZGVmaW5lIE1BU0tfVjkJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KQorI2RlZmluZSBNQVNLX1Y5QQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpCisKKy8qIEJpdCBtYXNrcyBvZiBhcmNoaXRlY3R1cmVzIHN1cHBvcnRpbmcgdGhlIGluc24uICAqLworCisjZGVmaW5lIHY2CQkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCBcCisJCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKKy8qIHY2IGluc25zIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwYXJjbGV0ICovCisjZGVmaW5lIHY2bm90bGV0CShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggXAorCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCisjZGVmaW5lIHY3CQkoTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIFwKKwkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQorLyogQWx0aG91Z2ggbm90IGFsbCBpbnNucyBhcmUgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUsIHNwYXJjbGl0ZSBpcyBkZWZpbmVkCisgICB0byBiZSBhIHN1cGVyc2V0IG9mIHY4LiAgVW5pbXBsZW1lbnRlZCBpbnNucyB0cmFwIGFuZCBhcmUgdGhlbiB0aGVvcmV0aWNhbGx5CisgICBpbXBsZW1lbnRlZCBpbiBzb2Z0d2FyZS4KKyAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhlIHNhbWUgaXMgdHJ1ZSBmb3Igc3BhcmNsZXQsIGFsdGhvdWdoIHRoZSBkb2NzCisgICBzdWdnZXN0IGl0IGlzLiAgUmF0aGVyIHRoYW4gY29tcGxpY2F0aW5nIHRoaW5ncywgdGhlIHNwYXJjbGV0IGFzc2VtYmxlcgorICAgcmVjb2duaXplcyBhbGwgdjggaW5zbnMuICAqLworI2RlZmluZSB2OAkJKE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCisjZGVmaW5lIHNwYXJjbGV0CShNQVNLX1NQQVJDTEVUKQorI2RlZmluZSBzcGFyY2xpdGUJKE1BU0tfU1BBUkNMSVRFKQorI2RlZmluZSB2OQkJKE1BU0tfVjkgfCBNQVNLX1Y5QSkKKyNkZWZpbmUgdjlhCQkoTUFTS19WOUEpCisvKiB2NiBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHY5ICovCisjZGVmaW5lIHY2bm90djkJCShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggXAorCQkJIHwgTUFTS19TUEFSQ0xFVCB8IE1BU0tfU1BBUkNMSVRFKQorLyogdjlhIGluc3RydWN0aW9ucyB3aGljaCB3b3VsZCBhcHBlYXIgdG8gYmUgYWxpYXNlcyB0byB2OSdzIGltcGRlcCdzCisgICBvdGhlcndpc2UgKi8KKyNkZWZpbmUgdjlub3R2OWEJKE1BU0tfVjkpCisKKy8qIFRhYmxlIG9mIG9wY29kZSBhcmNoaXRlY3R1cmVzLgorICAgVGhlIG9yZGVyIGlzIGRlZmluZWQgaW4gb3Bjb2RlL3NwYXJjLmguICAqLworCitjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggc3BhcmNfb3Bjb2RlX2FyY2hzW10gPSB7CisgIHsgInY2IiwgTUFTS19WNiB9LAorICB7ICJ2NyIsIE1BU0tfVjYgfCBNQVNLX1Y3IH0sCisgIHsgInY4IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IH0sCisgIHsgInNwYXJjbGV0IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCB9LAorICB7ICJzcGFyY2xpdGUiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTElURSB9LAorICAvKiA/Pz8gRG9uJ3Qgc29tZSB2OCBwcml2aWxlZGdlZCBpbnNucyBjb25mbGljdCB3aXRoIHY5PyAgKi8KKyAgeyAidjkiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1Y5IH0sCisgIC8qIHY5IHdpdGggdWx0cmFzcGFyYyBhZGRpdGlvbnMgKi8KKyAgeyAidjlhIiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19WOSB8IE1BU0tfVjlBIH0sCisgIHsgTlVMTCwgMCB9Cit9OworCisvKiBHaXZlbiBOQU1FLCByZXR1cm4gaXQncyBhcmNoaXRlY3R1cmUgZW50cnkuICAqLworCitlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbAorc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggKnA7CisKKyAgZm9yIChwID0gJnNwYXJjX29wY29kZV9hcmNoc1swXTsgcC0+bmFtZTsgKytwKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCisJcmV0dXJuIChlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCkgKHAgLSAmc3BhcmNfb3Bjb2RlX2FyY2hzWzBdKTsKKyAgICB9CisKKyAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX0JBRDsKK30KKwwKKy8qIEJyYW5jaCBjb25kaXRpb24gZmllbGQuICAqLworI2RlZmluZSBDT05EKHgpCQkoKCh4KSYweGYpPDwyNSkKKworLyogdjk6IE1vdmUgKE1PVmNjIGFuZCBGTU9WY2MpIGNvbmRpdGlvbiBmaWVsZC4gICovCisjZGVmaW5lIE1DT05EKHgsaV9vcl9mKQkoKCgoaV9vcl9mKSYxKTw8MTgpfCgoKHgpPj4xMSkmKDB4Zjw8MTQpKSkgLyogdjkgKi8KKworLyogdjk6IE1vdmUgcmVnaXN0ZXIgKE1PVlJjYyBhbmQgRk1PVlJjYykgY29uZGl0aW9uIGZpZWxkLiAgKi8KKyNkZWZpbmUgUkNPTkQoeCkJKCgoeCkmMHg3KTw8MTApCS8qIHY5ICovCisKKyNkZWZpbmUgQ09OREEJKENPTkQoMHg4KSkKKyNkZWZpbmUgQ09ORENDCShDT05EKDB4ZCkpCisjZGVmaW5lIENPTkRDUwkoQ09ORCgweDUpKQorI2RlZmluZSBDT05ERQkoQ09ORCgweDEpKQorI2RlZmluZSBDT05ERwkoQ09ORCgweGEpKQorI2RlZmluZSBDT05ER0UJKENPTkQoMHhiKSkKKyNkZWZpbmUgQ09OREdVCShDT05EKDB4YykpCisjZGVmaW5lIENPTkRMCShDT05EKDB4MykpCisjZGVmaW5lIENPTkRMRQkoQ09ORCgweDIpKQorI2RlZmluZSBDT05ETEVVCShDT05EKDB4NCkpCisjZGVmaW5lIENPTkROCShDT05EKDB4MCkpCisjZGVmaW5lIENPTkRORQkoQ09ORCgweDkpKQorI2RlZmluZSBDT05ETkVHCShDT05EKDB4NikpCisjZGVmaW5lIENPTkRQT1MJKENPTkQoMHhlKSkKKyNkZWZpbmUgQ09ORFZDCShDT05EKDB4ZikpCisjZGVmaW5lIENPTkRWUwkoQ09ORCgweDcpKQorCisjZGVmaW5lIENPTkROWglDT05ETkUKKyNkZWZpbmUgQ09ORFoJQ09OREUKKyNkZWZpbmUgQ09OREdFVQlDT05EQ0MKKyNkZWZpbmUgQ09ORExVCUNPTkRDUworCisjZGVmaW5lIEZDT05EQQkJKENPTkQoMHg4KSkKKyNkZWZpbmUgRkNPTkRFCQkoQ09ORCgweDkpKQorI2RlZmluZSBGQ09OREcJCShDT05EKDB4NikpCisjZGVmaW5lIEZDT05ER0UJCShDT05EKDB4YikpCisjZGVmaW5lIEZDT05ETAkJKENPTkQoMHg0KSkKKyNkZWZpbmUgRkNPTkRMRQkJKENPTkQoMHhkKSkKKyNkZWZpbmUgRkNPTkRMRwkJKENPTkQoMHgyKSkKKyNkZWZpbmUgRkNPTkROCQkoQ09ORCgweDApKQorI2RlZmluZSBGQ09ORE5FCQkoQ09ORCgweDEpKQorI2RlZmluZSBGQ09ORE8JCShDT05EKDB4ZikpCisjZGVmaW5lIEZDT05EVQkJKENPTkQoMHg3KSkKKyNkZWZpbmUgRkNPTkRVRQkJKENPTkQoMHhhKSkKKyNkZWZpbmUgRkNPTkRVRwkJKENPTkQoMHg1KSkKKyNkZWZpbmUgRkNPTkRVR0UJKENPTkQoMHhjKSkKKyNkZWZpbmUgRkNPTkRVTAkJKENPTkQoMHgzKSkKKyNkZWZpbmUgRkNPTkRVTEUJKENPTkQoMHhlKSkKKworI2RlZmluZSBGQ09ORE5aCUZDT05ETkUKKyNkZWZpbmUgRkNPTkRaCUZDT05ERQorCisjZGVmaW5lIElDQyAoMCkJLyogdjkgKi8KKyNkZWZpbmUgWENDICgxPDwxMikgLyogdjkgKi8KKyNkZWZpbmUgRkNDKHgpCSgoKHgpJjB4Myk8PDExKSAvKiB2OSAqLworI2RlZmluZSBGQkZDQyh4KQkoKCh4KSYweDMpPDwyMCkJLyogdjkgKi8KKwwKKy8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGUgdGFibGUgaXMgc2lnbmlmaWNhbnQ6CisJCisJKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0CisJYmUgY29uc2VjdXRpdmUuCUlmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgorCisJKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuCisKKyovCisKKy8qIEVudHJpZXMgZm9yIGNvbW11dGF0aXZlIGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gICovCisvKiA/Pz8gTW9yZSBlbnRyaWVzIGNhbiBtYWtlIHVzZSBvZiB0aGlzLiAgKi8KKyNkZWZpbmUgQ09NTVVURU9QKG9wY29kZSwgb3AzLCBhcmNoX21hc2spIFwKK3sgb3Bjb2RlLAlGMygyLCBvcDMsIDApLCBGMyh+Miwgfm9wMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIGFyY2hfbWFzayB9LCBcCit7IG9wY29kZSwJRjMoMiwgb3AzLCAxKSwgRjMofjIsIH5vcDMsIH4xKSwJCSIxLGksZCIsIDAsIGFyY2hfbWFzayB9LCBcCit7IG9wY29kZSwJRjMoMiwgb3AzLCAxKSwgRjMofjIsIH5vcDMsIH4xKSwJCSJpLDEsZCIsIDAsIGFyY2hfbWFzayB9CisKK2NvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdID0geworCit7ICJsZCIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKSwJCSJbMSsyXSxkIiwgMCwgdjYgfSwKK3sgImxkIiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApfFJTMl9HMCwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KK3sgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoreyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCit7ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCit7ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KK3sgImxkIiwJRjMoMywgMHgyMCwgMCksIEYzKH4zLCB+MHgyMCwgfjApLAkJIlsxKzJdLGciLCAwLCB2NiB9LAoreyAibGQiLAlGMygzLCAweDIwLCAwKSwgRjMofjMsIH4weDIwLCB+MCl8UlMyX0cwLAkiWzFdLGciLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLworeyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSksCQkiWzEraV0sZyIsIDAsIHY2IH0sCit7ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKSwJCSJbaSsxXSxnIiwgMCwgdjYgfSwKK3sgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpfFJTMV9HMCwJIltpXSxnIiwgMCwgdjYgfSwKK3sgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZyIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLworCit7ICJsZCIsCUYzKDMsIDB4MjEsIDApLCBGMyh+MywgfjB4MjEsIH4wKXxSRCh+MCksCSJbMSsyXSxGIiwgMCwgdjYgfSwKK3sgImxkIiwJRjMoMywgMHgyMSwgMCksIEYzKH4zLCB+MHgyMSwgfjApfFJTMl9HMHxSRCh+MCksIlsxXSxGIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KK3sgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4wKSwJIlsxK2ldLEYiLCAwLCB2NiB9LAoreyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjApLAkiW2krMV0sRiIsIDAsIHY2IH0sCit7ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSUzFfRzB8UkQofjApLCJbaV0sRiIsIDAsIHY2IH0sCit7ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxTSU1NMTMofjApfFJEKH4wKSwiWzFdLEYiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KKworeyAibGQiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCksCQkiWzErMl0sRCIsIDAsIHY2bm90djkgfSwKK3sgImxkIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApfFJTMl9HMCwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLworeyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiWzEraV0sRCIsIDAsIHY2bm90djkgfSwKK3sgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIltpKzFdLEQiLCAwLCB2Nm5vdHY5IH0sCit7ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxSUzFfRzAsCSJbaV0sRCIsIDAsIHY2bm90djkgfSwKK3sgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSswXSxkICovCit7ICJsZCIsCUYzKDMsIDB4MzEsIDApLCBGMyh+MywgfjB4MzEsIH4wKSwJCSJbMSsyXSxDIiwgMCwgdjZub3R2OSB9LAoreyAibGQiLAlGMygzLCAweDMxLCAwKSwgRjMofjMsIH4weDMxLCB+MCl8UlMyX0cwLAkiWzFdLEMiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCit7ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKSwJCSJbMStpXSxDIiwgMCwgdjZub3R2OSB9LAoreyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSksCQkiW2krMV0sQyIsIDAsIHY2bm90djkgfSwKK3sgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpfFJTMV9HMCwJIltpXSxDIiwgMCwgdjZub3R2OSB9LAoreyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxDIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KKworLyogVGhlIHY5IExEVVcgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCAnbGQnIG9wY29kZSwgaXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQorICAgJ2xkJyBwc2V1ZG8tb3AgaW4gdjkuICAqLworeyAibGR1dyIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKSwJCSJbMSsyXSxkIiwgRl9BTElBUywgdjkgfSwKK3sgImxkdXciLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCl8UlMyX0cwLAkiWzFdLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLworeyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbMStpXSxkIiwgRl9BTElBUywgdjkgfSwKK3sgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiW2krMV0sZCIsIEZfQUxJQVMsIHY5IH0sCit7ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgRl9BTElBUywgdjkgfSwKK3sgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCisKK3sgImxkZCIsCUYzKDMsIDB4MDMsIDApLCBGMyh+MywgfjB4MDMsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCit7ICJsZGQiLAlGMygzLCAweDAzLCAwKSwgRjMofjMsIH4weDAzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLworeyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoreyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoreyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKK3sgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSswXSxkICovCit7ICJsZGQiLAlGMygzLCAweDIzLCAwKSwgRjMofjMsIH4weDIzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEgiLCAwLCB2NiB9LAoreyAibGRkIiwJRjMoMywgMHgyMywgMCksIEYzKH4zLCB+MHgyMywgfjApfEFTSV9SUzIofjApLAkiWzFdLEgiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KK3sgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKSwJCSJbMStpXSxIIiwgMCwgdjYgfSwKK3sgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKSwJCSJbaSsxXSxIIiwgMCwgdjYgfSwKK3sgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKXxSUzFfRzAsCSJbaV0sSCIsIDAsIHY2IH0sCit7ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxIIiwgMCwgdjYgfSwgLyogbGRkIFtyczErMF0sZCAqLworCit7ICJsZGQiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEQiLCAwLCB2Nm5vdHY5IH0sCit7ICJsZGQiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCit7ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiWzEraV0sRCIsIDAsIHY2bm90djkgfSwKK3sgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbaSsxXSxEIiwgMCwgdjZub3R2OSB9LAoreyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFJTMV9HMCwJIltpXSxEIiwgMCwgdjZub3R2OSB9LAoreyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGRkIFtyczErMF0sZCAqLworCit7ICJsZHEiLAlGMygzLCAweDIyLCAwKSwgRjMofjMsIH4weDIyLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEoiLCAwLCB2OSB9LAoreyAibGRxIiwJRjMoMywgMHgyMiwgMCksIEYzKH4zLCB+MHgyMiwgfjApfEFTSV9SUzIofjApLAkiWzFdLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KK3sgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKSwJCSJbMStpXSxKIiwgMCwgdjkgfSwKK3sgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKSwJCSJbaSsxXSxKIiwgMCwgdjkgfSwKK3sgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKXxSUzFfRzAsCSJbaV0sSiIsIDAsIHY5IH0sCit7ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErMF0sZCAqLworCit7ICJsZHNiIiwJRjMoMywgMHgwOSwgMCksIEYzKH4zLCB+MHgwOSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKK3sgImxkc2IiLAlGMygzLCAweDA5LCAwKSwgRjMofjMsIH4weDA5LCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2IgW3JzMSslZzBdLGQgKi8KK3sgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCit7ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoreyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCit7ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2IgW3JzMSswXSxkICovCisKK3sgImxkc2giLAlGMygzLCAweDBhLCAwKSwgRjMofjMsIH4weDBhLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2ggW3JzMSslZzBdLGQgKi8KK3sgImxkc2giLAlGMygzLCAweDBhLCAwKSwgRjMofjMsIH4weDBhLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoreyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKK3sgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCit7ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKK3sgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzaCBbcnMxKzBdLGQgKi8KKworeyAibGRzdHViIiwJRjMoMywgMHgwZCwgMCksIEYzKH4zLCB+MHgwZCwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKK3sgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDApLCBGMyh+MywgfjB4MGQsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzdHViIFtyczErJWcwXSxkICovCit7ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCit7ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCit7ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoreyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc3R1YiBbcnMxKzBdLGQgKi8KKworeyAibGRzdyIsCUYzKDMsIDB4MDgsIDApLCBGMyh+MywgfjB4MDgsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY5IH0sCit7ICJsZHN3IiwJRjMoMywgMHgwOCwgMCksIEYzKH4zLCB+MHgwOCwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHN3IFtyczErJWcwXSxkICovCit7ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2OSB9LAoreyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjkgfSwKK3sgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2OSB9LAoreyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHN3IFtyczErMF0sZCAqLworCit7ICJsZHViIiwJRjMoMywgMHgwMSwgMCksIEYzKH4zLCB+MHgwMSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKK3sgImxkdWIiLAlGMygzLCAweDAxLCAwKSwgRjMofjMsIH4weDAxLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWIgW3JzMSslZzBdLGQgKi8KK3sgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCit7ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoreyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCit7ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWIgW3JzMSswXSxkICovCisKK3sgImxkdWgiLAlGMygzLCAweDAyLCAwKSwgRjMofjMsIH4weDAyLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoreyAibGR1aCIsCUYzKDMsIDB4MDIsIDApLCBGMyh+MywgfjB4MDIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1aCBbcnMxKyVnMF0sZCAqLworeyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKK3sgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCit7ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKK3sgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1aCBbcnMxKzBdLGQgKi8KKworeyAibGR4IiwJRjMoMywgMHgwYiwgMCksIEYzKH4zLCB+MHgwYiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjkgfSwKK3sgImxkeCIsCUYzKDMsIDB4MGIsIDApLCBGMyh+MywgfjB4MGIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGR4IFtyczErJWcwXSxkICovCit7ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSksCQkiWzEraV0sZCIsIDAsIHY5IH0sCit7ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSksCQkiW2krMV0sZCIsIDAsIHY5IH0sCit7ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2OSB9LAoreyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkeCBbcnMxKzBdLGQgKi8KKworeyAibGR4IiwJRjMoMywgMHgyMSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjApfFJEKH4xKSwJIlsxKzJdLEYiLCAwLCB2OSB9LAoreyAibGR4IiwJRjMoMywgMHgyMSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjApfFJTMl9HMHxSRCh+MSksCSJbMV0sRiIsIDAsIHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCit7ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjEpLAkiWzEraV0sRiIsIDAsIHY5IH0sCit7ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjEpLAkiW2krMV0sRiIsIDAsIHY5IH0sCit7ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UlMxX0cwfFJEKH4xKSwJIltpXSxGIiwgMCwgdjkgfSwKK3sgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxTSU1NMTMofjApfFJEKH4xKSwiWzFdLEYiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KKworeyAibGRhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKK3sgImxkYSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KK3sgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCit7ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoreyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCit7ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLworeyAibGRhIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApLAkJIlsxKzJdQSxnIiwgMCwgdjkgfSwKK3sgImxkYSIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKXxSUzJfRzAsCSJbMV1BLGciLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KK3sgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbMStpXW8sZyIsIDAsIHY5IH0sCit7ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiW2krMV1vLGciLCAwLCB2OSB9LAoreyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFJTMV9HMCwJIltpXW8sZyIsIDAsIHY5IH0sCit7ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZyIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLworCit7ICJsZGRhIiwJRjMoMywgMHgxMywgMCksIEYzKH4zLCB+MHgxMywgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKK3sgImxkZGEiLAlGMygzLCAweDEzLCAwKSwgRjMofjMsIH4weDEzLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRkYSBbcnMxKyVnMF0sZCAqLworeyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCit7ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKK3sgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLworCit7ICJsZGRhIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApLAkJIlsxKzJdQSxIIiwgMCwgdjkgfSwKK3sgImxkZGEiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8UlMyX0cwLAkiWzFdQSxIIiwgMCwgdjkgfSwgLyogbGRkYSBbcnMxKyVnMF0sZCAqLworeyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbMStpXW8sSCIsIDAsIHY5IH0sCit7ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIltpKzFdbyxIIiwgMCwgdjkgfSwKK3sgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8UlMxX0cwLAkiW2ldbyxIIiwgMCwgdjkgfSwKK3sgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sSCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLworCit7ICJsZHFhIiwJRjMoMywgMHgzMiwgMCksIEYzKH4zLCB+MHgzMiwgfjApLAkJIlsxKzJdQSxKIiwgMCwgdjkgfSwKK3sgImxkcWEiLAlGMygzLCAweDMyLCAwKSwgRjMofjMsIH4weDMyLCB+MCl8UlMyX0cwLAkiWzFdQSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCit7ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpLAkJIlsxK2ldbyxKIiwgMCwgdjkgfSwKK3sgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSksCQkiW2krMV1vLEoiLCAwLCB2OSB9LAoreyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKXxSUzFfRzAsCSJbaV1vLEoiLCAwLCB2OSB9LAoreyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErMF0sZCAqLworCit7ICJsZHNiYSIsCUYzKDMsIDB4MTksIDApLCBGMyh+MywgfjB4MTksIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCit7ICJsZHNiYSIsCUYzKDMsIDB4MTksIDApLCBGMyh+MywgfjB4MTksIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHNiYSBbcnMxKyVnMF0sZCAqLworeyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoreyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoreyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KKworeyAibGRzaGEiLAlGMygzLCAweDFhLCAwKSwgRjMofjMsIH4weDFhLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoreyAibGRzaGEiLAlGMygzLCAweDFhLCAwKSwgRjMofjMsIH4weDFhLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzaGEgW3JzMSslZzBdLGQgKi8KK3sgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKK3sgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCit7ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCisKK3sgImxkc3R1YmEiLAlGMygzLCAweDFkLCAwKSwgRjMofjMsIH4weDFkLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoreyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDApLCBGMyh+MywgfjB4MWQsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWJhIFtyczErJWcwXSxkICovCit7ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoreyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoreyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCisKK3sgImxkc3dhIiwJRjMoMywgMHgxOCwgMCksIEYzKH4zLCB+MHgxOCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjkgfSwKK3sgImxkc3dhIiwJRjMoMywgMHgxOCwgMCksIEYzKH4zLCB+MHgxOCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLworeyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoreyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoreyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KKworeyAibGR1YmEiLAlGMygzLCAweDExLCAwKSwgRjMofjMsIH4weDExLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoreyAibGR1YmEiLAlGMygzLCAweDExLCAwKSwgRjMofjMsIH4weDExLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGR1YmEgW3JzMSslZzBdLGQgKi8KK3sgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKK3sgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCit7ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCisKK3sgImxkdWhhIiwJRjMoMywgMHgxMiwgMCksIEYzKH4zLCB+MHgxMiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKK3sgImxkdWhhIiwJRjMoMywgMHgxMiwgMCksIEYzKH4zLCB+MHgxMiwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkdWhhIFtyczErJWcwXSxkICovCit7ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCit7ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCit7ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoreyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLworCit7ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKSwJCSJbMSsyXUEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkdXdhID09PSBsZGEgKi8KK3sgImxkdXdhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLworeyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiWzEraV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoreyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiW2krMV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoreyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgRl9BTElBUywgdjkgfSwKK3sgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KKworeyAibGR4YSIsCUYzKDMsIDB4MWIsIDApLCBGMyh+MywgfjB4MWIsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY5IH0sIC8qIGxkdXdhID09PSBsZGEgKi8KK3sgImxkeGEiLAlGMygzLCAweDFiLCAwKSwgRjMofjMsIH4weDFiLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjkgfSwgLyogbGRhIFtyczErJWcwXSxkICovCit7ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKK3sgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoreyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoreyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCisKK3sgInN0IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCQkiZCxbMSsyXSIsIDAsIHY2IH0sCit7ICJzdCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCit7ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCQkiZCxbMStpXSIsIDAsIHY2IH0sCit7ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCQkiZCxbaSsxXSIsIDAsIHY2IH0sCit7ICJzdCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCQkiZCxbaV0iLCAwLCB2NiB9LAoreyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLworeyAic3QiLAlGMygzLCAweDI0LCAwKSwgRjMofjMsIH4weDI0LCB+MCl8QVNJKH4wKSwJCSJnLFsxKzJdIiwgMCwgdjYgfSwKK3sgInN0IiwJRjMoMywgMHgyNCwgMCksIEYzKH4zLCB+MHgyNCwgfjApfEFTSV9SUzIofjApLAkJImcsWzFdIiwgMCwgdjYgfSwgLyogc3QgZFtyczErJWcwXSAqLworeyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSksCQkJImcsWzEraV0iLCAwLCB2NiB9LAoreyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSksCQkJImcsW2krMV0iLCAwLCB2NiB9LAoreyAic3QiLAlGMygzLCAweDI0LCAxKSwgRjMofjMsIH4weDI0LCB+MSl8UlMxX0cwLAkJImcsW2ldIiwgMCwgdjYgfSwKK3sgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpfFNJTU0xMyh+MCksCQkiZyxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KKworeyAic3QiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8QVNJKH4wKSwJCSJELFsxKzJdIiwgMCwgdjZub3R2OSB9LAoreyAic3QiLAlGMygzLCAweDM0LCAwKSwgRjMofjMsIH4weDM0LCB+MCl8QVNJX1JTMih+MCksCQkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCit7ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCQkiRCxbMStpXSIsIDAsIHY2bm90djkgfSwKK3sgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJCSJELFtpKzFdIiwgMCwgdjZub3R2OSB9LAoreyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8UlMxX0cwLAkJIkQsW2ldIiwgMCwgdjZub3R2OSB9LAoreyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSl8U0lNTTEzKH4wKSwJCSJELFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKzBdICovCit7ICJzdCIsCUYzKDMsIDB4MzUsIDApLCBGMyh+MywgfjB4MzUsIH4wKXxBU0kofjApLAkJIkMsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdCIsCUYzKDMsIDB4MzUsIDApLCBGMyh+MywgfjB4MzUsIH4wKXxBU0lfUlMyKH4wKSwJCSJDLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KK3sgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpLAkJCSJDLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoreyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSksCQkJIkMsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKXxSUzFfRzAsCQkiQyxbaV0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKXxTSU1NMTMofjApLAkJIkMsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KKworeyAic3QiLAlGMygzLCAweDI1LCAwKSwgRjMofjMsIH4weDI1LCB+MCl8UkRfRzB8QVNJKH4wKSwJIkYsWzErMl0iLCAwLCB2NiB9LAoreyAic3QiLAlGMygzLCAweDI1LCAwKSwgRjMofjMsIH4weDI1LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJGLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCit7ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMCwJCSJGLFsxK2ldIiwgMCwgdjYgfSwKK3sgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwLAkJIkYsW2krMV0iLCAwLCB2NiB9LAoreyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzB8UlMxX0cwLAkJIkYsW2ldIiwgMCwgdjYgfSwKK3sgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJGLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGQsW3JzMSswXSAqLworCit7ICJzdHciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoreyAic3R3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLworeyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoreyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoreyAic3R3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjkgfSwKK3sgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KKworeyAic3RhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKK3sgInN0YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCit7ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoreyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKK3sgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoreyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KKworeyAic3RhIiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApLAkJImcsWzErMl1BIiwgMCwgdjkgfSwKK3sgInN0YSIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxSUzIofjApLAkiZyxbMV1BIiwgMCwgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCit7ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkiZyxbMStpXW8iLCAwLCB2OSB9LAoreyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJImcsW2krMV1vIiwgMCwgdjkgfSwKK3sgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxSUzFfRzAsCSJnLFtpXW8iLCAwLCB2OSB9LAoreyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFNJTU0xMyh+MCksCSJnLFsxXW8iLCAwLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KKworeyAic3R3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCit7ICJzdHdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KK3sgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoreyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCit7ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCit7ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KKworeyAic3RiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKK3sgInN0YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RiIGQsW3JzMSslZzBdICovCit7ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCit7ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCit7ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoreyAic3RiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KKworeyAic3RiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCit7ICJzdGJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCit7ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKK3sgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoreyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoreyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLworCit7ICJzdGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoreyAic3RkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KK3sgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCit7ICJzdGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLworCit7ICJzdGQiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJKH4wKSwJInEsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdGQiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJX1JTMih+MCksCSJxLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCit7ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSksCQkicSxbMStpXSIsIDAsIHY2bm90djkgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJxLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoreyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFJTMV9HMCwJInEsW2ldIiwgMCwgdjZub3R2OSB9LAoreyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpfFNJTU0xMyh+MCksCSJxLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLworeyAic3RkIiwJRjMoMywgMHgyNywgMCksIEYzKH4zLCB+MHgyNywgfjApfEFTSSh+MCksCSJILFsxKzJdIiwgMCwgdjYgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MjcsIDApLCBGMyh+MywgfjB4MjcsIH4wKXxBU0lfUlMyKH4wKSwJIkgsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCit7ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSksCQkiSCxbMStpXSIsIDAsIHY2IH0sCit7ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSksCQkiSCxbaSsxXSIsIDAsIHY2IH0sCit7ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSl8UlMxX0cwLAkiSCxbaV0iLCAwLCB2NiB9LAoreyAic3RkIiwJRjMoMywgMHgyNywgMSksIEYzKH4zLCB+MHgyNywgfjEpfFNJTU0xMyh+MCksCSJILFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KKworeyAic3RkIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSSh+MCksCSJRLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoreyAic3RkIiwJRjMoMywgMHgzNiwgMCksIEYzKH4zLCB+MHgzNiwgfjApfEFTSV9SUzIofjApLAkiUSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLworeyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIlEsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiUSxbaSsxXSIsIDAsIHY2bm90djkgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxSUzFfRzAsCSJRLFtpXSIsIDAsIHY2bm90djkgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxTSU1NMTMofjApLAkiUSxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KK3sgInN0ZCIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxBU0kofjApLAkiRCxbMSsyXSIsIDAsIHY2bm90djkgfSwKK3sgInN0ZCIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxBU0lfUlMyKH4wKSwJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KK3sgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJELFsxK2ldIiwgMCwgdjZub3R2OSB9LAoreyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkQsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8UlMxX0cwLAkiRCxbaV0iLCAwLCB2Nm5vdHY5IH0sCit7ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8U0lNTTEzKH4wKSwJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCisKK3sgInN0ZGEiLAlGMygzLCAweDE3LCAwKSwgRjMofjMsIH4weDE3LCB+MCksCQkiZCxbMSsyXUEiLCAwLCB2NiB9LAoreyAic3RkYSIsCUYzKDMsIDB4MTcsIDApLCBGMyh+MywgfjB4MTcsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RkYSBkLFtyczErJWcwXSAqLworeyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKSwJCSJkLFsxK2ldbyIsIDAsIHY5IH0sCit7ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKK3sgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgMCwgdjkgfSwKK3sgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIDAsIHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KK3sgInN0ZGEiLAlGMygzLCAweDM3LCAwKSwgRjMofjMsIH4weDM3LCB+MCksCQkiSCxbMSsyXUEiLCAwLCB2OSB9LAoreyAic3RkYSIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKXxSUzIofjApLAkiSCxbMV1BIiwgMCwgdjkgfSwgLyogc3RkYSBkLFtyczErJWcwXSAqLworeyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKSwJCSJILFsxK2ldbyIsIDAsIHY5IH0sCit7ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkgsW2krMV1vIiwgMCwgdjkgfSwKK3sgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8UlMxX0cwLAkiSCxbaV1vIiwgMCwgdjkgfSwKK3sgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSl8U0lNTTEzKH4wKSwJIkgsWzFdbyIsIDAsIHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KKworeyAic3RoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgMCwgdjYgfSwKK3sgInN0aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RoIGQsW3JzMSslZzBdICovCit7ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIDAsIHY2IH0sCit7ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIDAsIHY2IH0sCit7ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCAwLCB2NiB9LAoreyAic3RoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KKworeyAic3RoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCit7ICJzdGhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KK3sgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoreyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCit7ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCit7ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCisKK3sgInN0eCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY5IH0sCit7ICJzdHgiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErJWcwXSAqLworeyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpLAkJImQsWzEraV0iLCAwLCB2OSB9LAoreyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpLAkJImQsW2krMV0iLCAwLCB2OSB9LAoreyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjkgfSwKK3sgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCisKK3sgInN0eCIsCUYzKDMsIDB4MjUsIDApfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4wKXxBU0kofjApfFJEKH4xKSwJIkYsWzErMl0iLCAwLCB2OSB9LAoreyAic3R4IiwJRjMoMywgMHgyNSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjApfEFTSV9SUzIofjApfFJEKH4xKSwiRixbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKyVnMF0gKi8KK3sgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRCh+MSksCQkiRixbMStpXSIsIDAsIHY5IH0sCit7ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UkQofjEpLAkJIkYsW2krMV0iLCAwLCB2OSB9LAoreyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJTMV9HMHxSRCh+MSksCSJGLFtpXSIsIDAsIHY5IH0sCit7ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8U0lNTTEzKH4wKXxSRCh+MSksIkYsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLworCit7ICJzdHhhIiwJRjMoMywgMHgxZSwgMCksIEYzKH4zLCB+MHgxZSwgfjApLAkJImQsWzErMl1BIiwgMCwgdjkgfSwKK3sgInN0eGEiLAlGMygzLCAweDFlLCAwKSwgRjMofjMsIH4weDFlLCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY5IH0sIC8qIHN0eGEgZCxbcnMxKyVnMF0gKi8KK3sgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoreyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCit7ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCit7ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCisKK3sgInN0cSIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0kofjApLAkiSixbMSsyXSIsIDAsIHY5IH0sCit7ICJzdHEiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJX1JTMih+MCksCSJKLFsxXSIsIDAsIHY5IH0sIC8qIHN0cSBbcnMxKyVnMF0gKi8KK3sgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJKLFsxK2ldIiwgMCwgdjkgfSwKK3sgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJKLFtpKzFdIiwgMCwgdjkgfSwKK3sgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxSUzFfRzAsCSJKLFtpXSIsIDAsIHY5IH0sCit7ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8U0lNTTEzKH4wKSwJIkosWzFdIiwgMCwgdjkgfSwgLyogc3RxIFtyczErMF0gKi8KKworeyAic3RxYSIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0kofjApLAkiSixbMSsyXUEiLCAwLCB2OSB9LAoreyAic3RxYSIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0lfUlMyKH4wKSwJIkosWzFdQSIsIDAsIHY5IH0sIC8qIHN0cWEgW3JzMSslZzBdICovCit7ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIkosWzEraV1vIiwgMCwgdjkgfSwKK3sgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiSixbaSsxXW8iLCAwLCB2OSB9LAoreyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxSUzFfRzAsCSJKLFtpXW8iLCAwLCB2OSB9LAoreyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxTSU1NMTMofjApLAkiSixbMV1vIiwgMCwgdjkgfSwgLyogc3RxYSBbcnMxKzBdICovCisKK3sgInN3YXAiLAlGMygzLCAweDBmLCAwKSwgRjMofjMsIH4weDBmLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NyB9LAoreyAic3dhcCIsCUYzKDMsIDB4MGYsIDApLCBGMyh+MywgfjB4MGYsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjcgfSwgLyogc3dhcCBbcnMxKyVnMF0sZCAqLworeyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjcgfSwKK3sgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSksCQkiW2krMV0sZCIsIDAsIHY3IH0sCit7ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjcgfSwKK3sgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjcgfSwgLyogc3dhcCBbcnMxKzBdLGQgKi8KKworeyAic3dhcGEiLAlGMygzLCAweDFmLCAwKSwgRjMofjMsIH4weDFmLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NyB9LAoreyAic3dhcGEiLAlGMygzLCAweDFmLCAwKSwgRjMofjMsIH4weDFmLCB+MCl8UlMyKH4wKSwJIlsxXUEsZCIsIDAsIHY3IH0sIC8qIHN3YXBhIFtyczErJWcwXSxkICovCit7ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCit7ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCit7ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoreyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIHN3YXAgW3JzMSswXSxkICovCisKK3sgInJlc3RvcmUiLAlGMygyLCAweDNkLCAwKSwgRjMofjIsIH4weDNkLCB+MCl8QVNJKH4wKSwJCQkiMSwyLGQiLCAwLCB2NiB9LAoreyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDApLCBGMyh+MiwgfjB4M2QsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSIiLCAwLCB2NiB9LCAvKiByZXN0b3JlICVnMCwlZzAsJWcwICovCit7ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMSksIEYzKH4yLCB+MHgzZCwgfjEpLAkJCQkiMSxpLGQiLCAwLCB2NiB9LAoreyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDEpLCBGMyh+MiwgfjB4M2QsIH4xKXxSRF9HMHxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY2IH0sIC8qIHJlc3RvcmUgJWcwLDAsJWcwICovCisKK3sgInJldHQiLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjErMiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgcnMxK3JzMiAqLworeyAicmV0dCIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IHJzMSwlZzAgKi8KK3sgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzAsCQkiMStpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCByczErWCAqLworeyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMCwJCSJpKzEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IFgrcnMxICovCit7ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCBYK3JzMSAqLworeyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgWCAqLworeyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgcnMxKzAgKi8KKworeyAic2F2ZSIsCUYzKDIsIDB4M2MsIDApLCBGMyh+MiwgfjB4M2MsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoreyAic2F2ZSIsCUYzKDIsIDB4M2MsIDEpLCBGMyh+MiwgfjB4M2MsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJzYXZlIiwJMHg4MWUwMDAwMCwJfjB4ODFlMDAwMDAsCQkJIiIsIEZfQUxJQVMsIHY2IH0sCisKK3sgInJldCIsICBGMygyLCAweDM4LCAxKXxSUzEoMHgxZil8U0lNTTEzKDgpLCBGMyh+MiwgfjB4MzgsIH4xKXxTSU1NMTMofjgpLAkgICAgICAgIiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWk3KzgsJWcwICovCit7ICJyZXRsIiwgRjMoMiwgMHgzOCwgMSl8UlMxKDB4MGYpfFNJTU0xMyg4KSwgRjMofjIsIH4weDM4LCB+MSl8UlMxKH4weDBmKXxTSU1NMTMofjgpLCAiIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlbzcrOCwlZzAgKi8KKworeyAiam1wbCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxBU0kofjApLAkiMSsyLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCit7ICJqbXBsIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfEFTSV9SUzIofjApLAkiMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsZCAqLworeyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxTSU1NMTMofjApLAkiMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLGQgKi8KK3sgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UlMxX0cwLAkiaSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLGQgKi8KK3sgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSksCQkiMStpLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCit7ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpLAkJImkrMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAorCit7ICJkb25lIiwJRjMoMiwgMHgzZSwgMCl8UkQoMCksIEYzKH4yLCB+MHgzZSwgfjApfFJEKH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCit7ICJyZXRyeSIsCUYzKDIsIDB4M2UsIDApfFJEKDEpLCBGMyh+MiwgfjB4M2UsIH4wKXxSRCh+MSl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoreyAic2F2ZWQiLAlGMygyLCAweDMxLCAwKXxSRCgwKSwgRjMofjIsIH4weDMxLCB+MCl8UkQofjApfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKK3sgInJlc3RvcmVkIiwJRjMoMiwgMHgzMSwgMCl8UkQoMSksIEYzKH4yLCB+MHgzMSwgfjApfFJEKH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCit7ICJzaXIiLAlGMygyLCAweDMwLCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCQkiaSIsIDAsIHY5IH0sCisKK3sgImZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSSh+MCksCSIxKzIiLCAwLCB2OCB9LAoreyAiZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJX1JTMih+MCksCSIxIiwgMCwgdjggfSwgLyogZmx1c2ggcnMxKyVnMCAqLworeyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8U0lNTTEzKH4wKSwJIjEiLCAwLCB2OCB9LCAvKiBmbHVzaCByczErMCAqLworeyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8UlMxX0cwLAkiaSIsIDAsIHY4IH0sIC8qIGZsdXNoICVnMCtpICovCit7ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSIxK2kiLCAwLCB2OCB9LAoreyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiaSsxIiwgMCwgdjggfSwKKworLyogSUZMVVNIIHdhcyByZW5hbWVkIHRvIEZMVVNIIGluIHY4LiAgKi8KK3sgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0kofjApLAkiMSsyIiwgRl9BTElBUywgdjYgfSwKK3sgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCBGX0FMSUFTLCB2NiB9LCAvKiBmbHVzaCByczErJWcwICovCit7ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8U0lNTTEzKH4wKSwJIjEiLCBGX0FMSUFTLCB2NiB9LCAvKiBmbHVzaCByczErMCAqLworeyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFJTMV9HMCwJImkiLCBGX0FMSUFTLCB2NiB9LAoreyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJIjEraSIsIEZfQUxJQVMsIHY2IH0sCit7ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiaSsxIiwgRl9BTElBUywgdjYgfSwKKworeyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfEFTSSh+MCksCSIxKzIiLCAwLCB2OSB9LAoreyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfEFTSV9SUzIofjApLAkiMSIsIDAsIHY5IH0sIC8qIHJldHVybiByczErJWcwICovCit7ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8U0lNTTEzKH4wKSwJIjEiLCAwLCB2OSB9LCAvKiByZXR1cm4gcnMxKzAgKi8KK3sgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSUzFfRzAsCSJpIiwgMCwgdjkgfSwgLyogcmV0dXJuICVnMCtpICovCit7ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSksCQkiMStpIiwgMCwgdjkgfSwKK3sgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKSwJCSJpKzEiLCAwLCB2OSB9LAorCit7ICJmbHVzaHciLAlGMygyLCAweDJiLCAwKSwgRjMofjIsIH4weDJiLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiIiwgMCwgdjkgfSwKKworeyAibWVtYmFyIiwJRjMoMiwgMHgyOCwgMSl8UlMxKDB4ZiksIEYzKH4yLCB+MHgyOCwgfjEpfFJEX0cwfFJTMSh+MHhmKXxTSU1NMTMofjEyNyksICJLIiwgMCwgdjkgfSwKK3sgInN0YmFyIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDB4ZiksIEYzKH4yLCB+MHgyOCwgfjApfFJEX0cwfFJTMSh+MHhmKXxTSU1NMTMofjApLCAiIiwgMCwgdjggfSwKKworeyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAwKSwgRjMofjMsIH4weDJkLCB+MCksCQkiWzErMl0sKiIsIDAsIHY5IH0sCit7ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDApLCBGMyh+MywgfjB4MmQsIH4wKXxSUzJfRzAsCSJbMV0sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoIFtyczErJWcwXSxwcmVmZXRjaF9mY24gKi8KK3sgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpLAkJIlsxK2ldLCoiLCAwLCB2OSB9LAoreyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSksCQkiW2krMV0sKiIsIDAsIHY5IH0sCit7ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKXxSUzFfRzAsCSJbaV0sKiIsIDAsIHY5IH0sCit7ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKXxTSU1NMTMofjApLAkiWzFdLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaCBbcnMxKzBdLHByZWZldGNoX2ZjbiAqLworeyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMCksIEYzKH4zLCB+MHgzZCwgfjApLAkJIlsxKzJdQSwqIiwgMCwgdjkgfSwKK3sgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDApLCBGMyh+MywgfjB4M2QsIH4wKXxSUzJfRzAsCSJbMV1BLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaGEgW3JzMSslZzBdLHByZWZldGNoX2ZjbiAqLworeyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpLAkJIlsxK2ldbywqIiwgMCwgdjkgfSwKK3sgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKSwJCSJbaSsxXW8sKiIsIDAsIHY5IH0sCit7ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSl8UlMxX0cwLAkiW2ldbywqIiwgMCwgdjkgfSwKK3sgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKXxTSU1NMTMofjApLAkiWzFdbywqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2hhIFtyczErMF0sZCAqLworCit7ICJzbGwiLAlGMygyLCAweDI1LCAwKSwgRjMofjIsIH4weDI1LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJzbGwiLAlGMygyLCAweDI1LCAxKSwgRjMofjIsIH4weDI1LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCit7ICJzcmEiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJzcmEiLAlGMygyLCAweDI3LCAxKSwgRjMofjIsIH4weDI3LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCit7ICJzcmwiLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJzcmwiLAlGMygyLCAweDI2LCAxKSwgRjMofjIsIH4weDI2LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCisKK3sgInNsbHgiLAlGMygyLCAweDI1LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjUsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCit7ICJzbGx4IiwJRjMoMiwgMHgyNSwgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI1LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAoreyAic3JheCIsCUYzKDIsIDB4MjcsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNywgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKK3sgInNyYXgiLAlGMygyLCAweDI3LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjcsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCit7ICJzcmx4IiwJRjMoMiwgMHgyNiwgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI2LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoreyAic3JseCIsCUYzKDIsIDB4MjYsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNiwgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKKworeyAibXVsc2NjIiwJRjMoMiwgMHgyNCwgMCksIEYzKH4yLCB+MHgyNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJtdWxzY2MiLAlGMygyLCAweDI0LCAxKSwgRjMofjIsIH4weDI0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAorCit7ICJkaXZzY2MiLAlGMygyLCAweDFkLCAwKSwgRjMofjIsIH4weDFkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsaXRlIH0sCit7ICJkaXZzY2MiLAlGMygyLCAweDFkLCAxKSwgRjMofjIsIH4weDFkLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xpdGUgfSwKKworeyAic2NhbiIsCUYzKDIsIDB4MmMsIDApLCBGMyh+MiwgfjB4MmMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xldHxzcGFyY2xpdGUgfSwKK3sgInNjYW4iLAlGMygyLCAweDJjLCAxKSwgRjMofjIsIH4weDJjLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xldHxzcGFyY2xpdGUgfSwKKworeyAicG9wYyIsCUYzKDIsIDB4MmUsIDApLCBGMyh+MiwgfjB4MmUsIH4wKXxSUzJfRzB8QVNJKH4wKSwiMixkIiwgMCwgdjkgfSwKK3sgInBvcGMiLAlGMygyLCAweDJlLCAxKSwgRjMofjIsIH4weDJlLCB+MSl8UlMyX0cwLAkiaSxkIiwgMCwgdjkgfSwKKworeyAiY2xyIiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJImQiLCBGX0FMSUFTLCB2NiB9LCAvKiBvciAlZzAsJWcwLGQgKi8KK3sgImNsciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJCSJkIiwgRl9BTElBUywgdjYgfSwgLyogb3IgJWcwLDAsZAkqLworeyAiY2xyIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfFJEX0cwfEFTSSh+MCksCQkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ICVnMCxbcnMxKyVnMF0gKi8KK3sgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMCwJCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwLAkJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCit7ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzB8UlMxX0cwLAkJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCQkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgJWcwLFtyczErMF0gKi8KKworeyAiY2xyYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiAlZzAsW3JzMSslZzBdICovCit7ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKK3sgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKK3sgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiAlZzAsW3JzMSswXSAqLworCit7ICJjbHJoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCit7ICJjbHJoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoICVnMCxbcnMxKyVnMF0gKi8KK3sgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCit7ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoreyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoICVnMCxbcnMxKzBdICovCisKK3sgImNscngiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjkgfSwKK3sgImNscngiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdHggJWcwLFtyczErJWcwXSAqLworeyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY5IH0sCit7ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjkgfSwKK3sgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY5IH0sCit7ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdHggJWcwLFtyczErMF0gKi8KKworeyAib3JjYyIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoreyAib3JjYyIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJvcmNjIiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKKworLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCit7ICJvcm5jYyIsCUYzKDIsIDB4MTYsIDApLCBGMyh+MiwgfjB4MTYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoreyAib3JuY2MiLAlGMygyLCAweDE2LCAxKSwgRjMofjIsIH4weDE2LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAorCisvKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KK3sgIm9ybiIsCUYzKDIsIDB4MDYsIDApLCBGMyh+MiwgfjB4MDYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoreyAib3JuIiwJRjMoMiwgMHgwNiwgMSksIEYzKH4yLCB+MHgwNiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKKworeyAidHN0IiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIDAsIHY2IH0sIC8qIG9yY2MgcnMxLCAlZzAsICVnMCAqLworeyAidHN0IiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfFJEX0cwfFJTMV9HMHxBU0kofjApLAkiMiIsIDAsIHY2IH0sIC8qIG9yY2MgJWcwLCByczIsICVnMCAqLworeyAidHN0IiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgMCwgdjYgfSwgLyogb3JjYyByczEsIDAsICVnMCAqLworCit7ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8QVNJKH4wKSwJCSIxLDIsbSIsIDAsIHY4IH0sIC8qIHdyIHIsciwlYXNyWCAqLworeyAid3IiLAlGMygyLCAweDMwLCAxKSwJCUYzKH4yLCB+MHgzMCwgfjEpLAkJCSIxLGksbSIsIDAsIHY4IH0sIC8qIHdyIHIsaSwlYXNyWCAqLworeyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfEFTSV9SUzIofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwlZzAsJWFzclggKi8KK3sgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHkiLCAwLCB2NiB9LCAvKiB3ciByLHIsJXkgKi8KK3sgIndyIiwJRjMoMiwgMHgzMCwgMSksCQlGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSIxLGkseSIsIDAsIHY2IH0sIC8qIHdyIHIsaSwleSAqLworeyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLCVnMCwleSAqLworeyAid3IiLAlGMygyLCAweDMxLCAwKSwJCUYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIscCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCVwc3IgKi8KK3sgIndyIiwJRjMoMiwgMHgzMSwgMSksCQlGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSIxLGkscCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCVwc3IgKi8KK3sgIndyIiwJRjMoMiwgMHgzMSwgMCksCQlGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwlcHNyICovCit7ICJ3ciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix3IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXdpbSAqLworeyAid3IiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJIjEsaSx3IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXdpbSAqLworeyAid3IiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV3aW0gKi8KK3sgIndyIiwJRjMoMiwgMHgzMywgMCksCQlGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHQiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwldGJyICovCit7ICJ3ciIsCUYzKDIsIDB4MzMsIDEpLAkJRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiMSxpLHQiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwldGJyICovCit7ICJ3ciIsCUYzKDIsIDB4MzMsIDApLAkJRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXRiciAqLworCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Mil8QVNJKH4wKSwJIjEsMixFIiwgMCwgdjkgfSwgLyogd3IgcixyLCVjY3IgKi8KK3sgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yKSwJCSIxLGksRSIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlY2NyICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDMpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Myl8QVNJKH4wKSwJIjEsMixvIiwgMCwgdjkgfSwgLyogd3IgcixyLCVhc2kgKi8KK3sgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4zKSwJCSIxLGksbyIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlYXNpICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDYpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Nil8QVNJKH4wKSwJIjEsMixzIiwgMCwgdjkgfSwgLyogd3IgcixyLCVmcHJzICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDYpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+NiksCQkiMSxpLHMiLCAwLCB2OSB9LCAvKiB3ciByLGksJWZwcnMgKi8KKworeyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxNiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xNil8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlcGNyICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE2KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE2KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXBjciAqLworeyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxNyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xNyl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlcGljICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE3KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE3KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXBpYyAqLworeyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxOCksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xOCl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlZGNyICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE4KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE4KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWRjciAqLworeyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxOSksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xOSl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlZ3NyICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE5KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE5KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWdzciAqLworeyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMCksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMCl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlc2V0X3NvZnRpbnQgKi8KK3sgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjApLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjApLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlc2V0X3NvZnRpbnQgKi8KK3sgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjEpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjEpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWNsZWFyX3NvZnRpbnQgKi8KK3sgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjEpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjEpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlY2xlYXJfc29mdGludCAqLworeyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMil8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlc29mdGludCAqLworeyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMiksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVzb2Z0aW50ICovCit7ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIzKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIzKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCV0aWNrX2NtcHIgKi8KK3sgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjMpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjMpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwldGlja19jbXByICovCisKK3sgInJkIiwJRjMoMiwgMHgyOCwgMCksCQkJRjMofjIsIH4weDI4LCB+MCl8U0lNTTEzKH4wKSwJCSJNLGQiLCAwLCB2OCB9LCAvKiByZCAlYXNyWCxyICovCit7ICJyZCIsCUYzKDIsIDB4MjgsIDApLAkJCUYzKH4yLCB+MHgyOCwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkieSxkIiwgMCwgdjYgfSwgLyogcmQgJXksciAqLworeyAicmQiLAlGMygyLCAweDI5LCAwKSwJCQlGMyh+MiwgfjB4MjksIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInAsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXBzcixyICovCit7ICJyZCIsCUYzKDIsIDB4MmEsIDApLAkJCUYzKH4yLCB+MHgyYSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidyxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAld2ltLHIgKi8KK3sgInJkIiwJRjMoMiwgMHgyYiwgMCksCQkJRjMofjIsIH4weDJiLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ0LGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICV0YnIsciAqLworCit7ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Mil8U0lNTTEzKH4wKSwJIkUsZCIsIDAsIHY5IH0sIC8qIHJkICVjY3IsciAqLworeyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjMpfFNJTU0xMyh+MCksCSJvLGQiLCAwLCB2OSB9LCAvKiByZCAlYXNpLHIgKi8KK3sgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDQpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH40KXxTSU1NMTMofjApLAkiVyxkIiwgMCwgdjkgfSwgLyogcmQgJXRpY2ssciAqLworeyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNSksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjUpfFNJTU0xMyh+MCksCSJQLGQiLCAwLCB2OSB9LCAvKiByZCAlcGMsciAqLworeyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjYpfFNJTU0xMyh+MCksCSJzLGQiLCAwLCB2OSB9LCAvKiByZCAlZnBycyxyICovCisKK3sgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE2KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTYpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXBjcixyICovCit7ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxNyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE3KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVwaWMsciAqLworeyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTgpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xOCl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlZGNyLHIgKi8KK3sgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE5KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTkpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJWdzcixyICovCit7ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyMiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIyKXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVzb2Z0aW50LHIgKi8KK3sgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIzKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MjMpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXRpY2tfY21wcixyICovCisKK3sgInJkcHIiLAlGMygyLCAweDJhLCAwKSwJCUYzKH4yLCB+MHgyYSwgfjApfFNJTU0xMyh+MCksCSI/LGQiLCAwLCB2OSB9LCAgIC8qIHJkcHIgJXByaXYsciAqLworeyAid3JwciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCksCQkiMSwyLCEiLCAwLCB2OSB9LCAvKiB3cnByIHIxLHIyLCVwcml2ICovCit7ICJ3cnByIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxTSU1NMTMofjApLAkiMSwhIiwgMCwgdjkgfSwgICAvKiB3cnByIHIxLCVwcml2ICovCit7ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKSwJCSIxLGksISIsIDAsIHY5IH0sIC8qIHdycHIgcjEsaSwlcHJpdiAqLworeyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSksCQkiaSwxLCEiLCBGX0FMSUFTLCB2OSB9LCAvKiB3cnByIGkscjEsJXByaXYgKi8KK3sgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpfFJTMSh+MCksCSJpLCEiLCAwLCB2OSB9LCAgIC8qIHdycHIgaSwlcHJpdiAqLworCisvKiA/Pz8gVGhpcyBncm91cCBzZWVtcyB3cm9uZy4gIEEgdGhyZWUgb3BlcmFuZCBtb3ZlPyAgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxBU0kofjApLAkJIjEsMixtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcixyLCVhc3JYICovCit7ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSksCQkJIjEsaSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcixpLCVhc3JYICovCit7ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcixyLCV5ICovCit7ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiMSxpLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByLGksJXkgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzEsIDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwlcHNyICovCit7ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiMSxpLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwlcHNyICovCit7ICJtb3YiLAlGMygyLCAweDMyLCAwKSwgRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXdpbSAqLworeyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJIjEsaSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXdpbSAqLworeyAibW92IiwJRjMoMiwgMHgzMywgMCksIEYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCV0YnIgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSIxLGksdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCV0YnIgKi8KKworeyAibW92IiwJRjMoMiwgMHgyOCwgMCksIEYzKH4yLCB+MHgyOCwgfjApfFNJTU0xMyh+MCksCQkiTSxkIiwgRl9BTElBUywgdjggfSwgLyogcmQgJWFzcjEsciAqLworeyAibW92IiwJRjMoMiwgMHgyOCwgMCksIEYzKH4yLCB+MHgyOCwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkieSxkIiwgRl9BTElBUywgdjYgfSwgLyogcmQgJXksciAqLworeyAibW92IiwJRjMoMiwgMHgyOSwgMCksIEYzKH4yLCB+MHgyOSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkicCxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAlcHNyLHIgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MmEsIDApLCBGMyh+MiwgfjB4MmEsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIncsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXdpbSxyICovCit7ICJtb3YiLAlGMygyLCAweDJiLCAwKSwgRjMofjIsIH4weDJiLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ0LGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICV0YnIsciAqLworCit7ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8QVNJX1JTMih+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLCVnMCwlYXNyWCAqLworeyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpLAkJCSJpLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciAlZzAsaSwlYXNyWCAqLworeyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLDAsJWFzclggKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwlZzAsJXkgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSJpLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciAlZzAsaSwleSAqLworeyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsMCwleSAqLworeyAibW92IiwJRjMoMiwgMHgzMSwgMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCVwc3IgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSJpLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCVwc3IgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwlcHNyICovCit7ICJtb3YiLAlGMygyLCAweDMyLCAwKSwgRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXdpbSAqLworeyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJImksdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXdpbSAqLworeyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCV3aW0gKi8KK3sgIm1vdiIsCUYzKDIsIDB4MzMsIDApLCBGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwldGJyICovCit7ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiaSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwldGJyICovCit7ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXRiciAqLworCit7ICJtb3YiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8UlMxX0cwfEFTSSh+MCksCSIyLGQiLCAwLCB2NiB9LCAvKiBvciAlZzAscnMyLGQgKi8KK3sgIm1vdiIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxSUzFfRzAsCQkiaSxkIiwgMCwgdjYgfSwgLyogb3IgJWcwLGksZAkqLworeyAibW92IiwgICAgICAgIEYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLGQiLCAwLCB2NiB9LCAvKiBvciByczEsJWcwLGQgICAqLworeyAibW92IiwgICAgICAgIEYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxTSU1NMTMofjApLAkJIjEsZCIsIDAsIHY2IH0sIC8qIG9yIHJzMSwwLGQgKi8KKworeyAib3IiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgIm9yIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKK3sgIm9yIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKKworeyAiYnNldCIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwJLyogb3IgcmQscnMyLHJkICovCit7ICJic2V0IiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sCS8qIG9yIHJkLGkscmQgKi8KKworLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCit7ICJhbmRuIiwJRjMoMiwgMHgwNSwgMCksIEYzKH4yLCB+MHgwNSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJhbmRuIiwJRjMoMiwgMHgwNSwgMSksIEYzKH4yLCB+MHgwNSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKKworLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCit7ICJhbmRuY2MiLAlGMygyLCAweDE1LCAwKSwgRjMofjIsIH4weDE1LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgImFuZG5jYyIsCUYzKDIsIDB4MTUsIDEpLCBGMyh+MiwgfjB4MTUsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCisKK3sgImJjbHIiLAlGMygyLCAweDA1LCAwKSwgRjMofjIsIH4weDA1LCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZG4gcmQscnMyLHJkICovCit7ICJiY2xyIiwJRjMoMiwgMHgwNSwgMSksIEYzKH4yLCB+MHgwNSwgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZG4gcmQsaSxyZCAqLworCit7ICJjbXAiLAlGMygyLCAweDE0LCAwKSwgRjMofjIsIH4weDE0LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMiIsIDAsIHY2IH0sCS8qIHN1YmNjIHJzMSxyczIsJWcwICovCit7ICJjbXAiLAlGMygyLCAweDE0LCAxKSwgRjMofjIsIH4weDE0LCB+MSl8UkRfRzAsCQkiMSxpIiwgMCwgdjYgfSwJLyogc3ViY2MgcnMxLGksJWcwICovCisKK3sgInN1YiIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoreyAic3ViIiwJRjMoMiwgMHgwNCwgMSksIEYzKH4yLCB+MHgwNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKKworeyAic3ViY2MiLAlGMygyLCAweDE0LCAwKSwgRjMofjIsIH4weDE0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgInN1YmNjIiwJRjMoMiwgMHgxNCwgMSksIEYzKH4yLCB+MHgxNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKKworeyAic3VieCIsCUYzKDIsIDB4MGMsIDApLCBGMyh+MiwgfjB4MGMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCit7ICJzdWJ4IiwJRjMoMiwgMHgwYywgMSksIEYzKH4yLCB+MHgwYywgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoreyAic3ViYyIsCUYzKDIsIDB4MGMsIDApLCBGMyh+MiwgfjB4MGMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoreyAic3ViYyIsCUYzKDIsIDB4MGMsIDEpLCBGMyh+MiwgfjB4MGMsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCisKK3sgInN1YnhjYyIsCUYzKDIsIDB4MWMsIDApLCBGMyh+MiwgfjB4MWMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCit7ICJzdWJ4Y2MiLAlGMygyLCAweDFjLCAxKSwgRjMofjIsIH4weDFjLCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCit7ICJzdWJjY2MiLAlGMygyLCAweDFjLCAwKSwgRjMofjIsIH4weDFjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKK3sgInN1YmNjYyIsCUYzKDIsIDB4MWMsIDEpLCBGMyh+MiwgfjB4MWMsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCisKK3sgImFuZCIsCUYzKDIsIDB4MDEsIDApLCBGMyh+MiwgfjB4MDEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoreyAiYW5kIiwJRjMoMiwgMHgwMSwgMSksIEYzKH4yLCB+MHgwMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKK3sgImFuZCIsCUYzKDIsIDB4MDEsIDEpLCBGMyh+MiwgfjB4MDEsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCisKK3sgImFuZGNjIiwJRjMoMiwgMHgxMSwgMCksIEYzKH4yLCB+MHgxMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCisKK3sgImRlYyIsCUYzKDIsIDB4MDQsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MDQsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogc3ViIHJkLDEscmQgKi8KK3sgImRlYyIsCUYzKDIsIDB4MDQsIDEpLAkJICAgIEYzKH4yLCB+MHgwNCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBzdWIgcmQsaW1tLHJkICovCit7ICJkZWNjYyIsCUYzKDIsIDB4MTQsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MTQsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogc3ViY2MgcmQsMSxyZCAqLworeyAiZGVjY2MiLAlGMygyLCAweDE0LCAxKSwJCSAgICBGMyh+MiwgfjB4MTQsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogc3ViY2MgcmQsaW1tLHJkICovCit7ICJpbmMiLAlGMygyLCAweDAwLCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDAwLCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFkZCByZCwxLHJkICovCit7ICJpbmMiLAlGMygyLCAweDAwLCAxKSwJCSAgICBGMyh+MiwgfjB4MDAsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogYWRkIHJkLGltbSxyZCAqLworeyAiaW5jY2MiLAlGMygyLCAweDEwLCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDEwLCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFkZGNjIHJkLDEscmQgKi8KK3sgImluY2NjIiwJRjMoMiwgMHgxMCwgMSksCQkgICAgRjMofjIsIH4weDEwLCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIGFkZGNjIHJkLGltbSxyZCAqLworCit7ICJidHN0IiwJRjMoMiwgMHgxMSwgMCksIEYzKH4yLCB+MHgxMSwgfjApfFJEX0cwfEFTSSh+MCksICIxLDIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRjYyByczEscnMyLCVnMCAqLworeyAiYnRzdCIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKXxSRF9HMCwgImksMSIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZGNjIHJzMSxpLCVnMCAqLworCit7ICJuZWciLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8UlMxX0cwfEFTSSh+MCksICIyLGQiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdWIgJWcwLHJzMixyZCAqLworeyAibmVnIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfFJTMV9HMHxBU0kofjApLCAiTyIsIEZfQUxJQVMsIHY2IH0sIC8qIHN1YiAlZzAscmQscmQgKi8KKworeyAiYWRkIiwJRjMoMiwgMHgwMCwgMCksIEYzKH4yLCB+MHgwMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJhZGQiLAlGMygyLCAweDAwLCAxKSwgRjMofjIsIH4weDAwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoreyAiYWRkIiwJRjMoMiwgMHgwMCwgMSksIEYzKH4yLCB+MHgwMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKK3sgImFkZGNjIiwJRjMoMiwgMHgxMCwgMCksIEYzKH4yLCB+MHgxMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDEpLCBGMyh+MiwgfjB4MTAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDEpLCBGMyh+MiwgfjB4MTAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCisKK3sgImFkZHgiLAlGMygyLCAweDA4LCAwKSwgRjMofjIsIH4weDA4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoreyAiYWRkeCIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKK3sgImFkZHgiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiaSwxLGQiLCAwLCB2Nm5vdHY5IH0sCit7ICJhZGRjIiwJRjMoMiwgMHgwOCwgMCksIEYzKH4yLCB+MHgwOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCit7ICJhZGRjIiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKK3sgImFkZGMiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiaSwxLGQiLCAwLCB2OSB9LAorCit7ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAwKSwgRjMofjIsIH4weDE4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoreyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoreyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJImksMSxkIiwgMCwgdjZub3R2OSB9LAoreyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMCksIEYzKH4yLCB+MHgxOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCit7ICJhZGRjY2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoreyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJImksMSxkIiwgMCwgdjkgfSwKKworeyAic211bCIsCUYzKDIsIDB4MGIsIDApLCBGMyh+MiwgfjB4MGIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoreyAic211bCIsCUYzKDIsIDB4MGIsIDEpLCBGMyh+MiwgfjB4MGIsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCit7ICJzbXVsIiwJRjMoMiwgMHgwYiwgMSksIEYzKH4yLCB+MHgwYiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKK3sgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDApLCBGMyh+MiwgfjB4MWIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoreyAic211bGNjIiwJRjMoMiwgMHgxYiwgMSksIEYzKH4yLCB+MHgxYiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKK3sgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDEpLCBGMyh+MiwgfjB4MWIsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCit7ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMCksIEYzKH4yLCB+MHgwYSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCit7ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMSksIEYzKH4yLCB+MHgwYSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKK3sgInVtdWwiLAlGMygyLCAweDBhLCAxKSwgRjMofjIsIH4weDBhLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoreyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMCksIEYzKH4yLCB+MHgxYSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCit7ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAxKSwgRjMofjIsIH4weDFhLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoreyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMSksIEYzKH4yLCB+MHgxYSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKK3sgInNkaXYiLAlGMygyLCAweDBmLCAwKSwgRjMofjIsIH4weDBmLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKK3sgInNkaXYiLAlGMygyLCAweDBmLCAxKSwgRjMofjIsIH4weDBmLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoreyAic2RpdiIsCUYzKDIsIDB4MGYsIDEpLCBGMyh+MiwgfjB4MGYsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCit7ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAwKSwgRjMofjIsIH4weDFmLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKK3sgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDEpLCBGMyh+MiwgfjB4MWYsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCit7ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAxKSwgRjMofjIsIH4weDFmLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoreyAidWRpdiIsCUYzKDIsIDB4MGUsIDApLCBGMyh+MiwgfjB4MGUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoreyAidWRpdiIsCUYzKDIsIDB4MGUsIDEpLCBGMyh+MiwgfjB4MGUsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCit7ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMSksIEYzKH4yLCB+MHgwZSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKK3sgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDApLCBGMyh+MiwgfjB4MWUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoreyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMSksIEYzKH4yLCB+MHgxZSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKK3sgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDEpLCBGMyh+MiwgfjB4MWUsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCisKK3sgIm11bHgiLAlGMygyLCAweDA5LCAwKSwgRjMofjIsIH4weDA5LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKK3sgIm11bHgiLAlGMygyLCAweDA5LCAxKSwgRjMofjIsIH4weDA5LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoreyAic2RpdngiLAlGMygyLCAweDJkLCAwKSwgRjMofjIsIH4weDJkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKK3sgInNkaXZ4IiwJRjMoMiwgMHgyZCwgMSksIEYzKH4yLCB+MHgyZCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKK3sgInVkaXZ4IiwJRjMoMiwgMHgwZCwgMCksIEYzKH4yLCB+MHgwZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCit7ICJ1ZGl2eCIsCUYzKDIsIDB4MGQsIDEpLCBGMyh+MiwgfjB4MGQsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCisKK3sgImNhbGwiLAlGMSgweDEpLCBGMSh+MHgxKSwgIkwiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCit7ICJjYWxsIiwJRjEoMHgxKSwgRjEofjB4MSksICJMLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCisKK3sgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0kofjApLAkiMSsyIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStyczIsJW83ICovCit7ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJKH4wKSwJIjErMiwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoreyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSV9SUzIofjApLAkiMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLCVvNyAqLworeyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSV9SUzIofjApLAkiMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoreyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJIjEraSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczEraSwlbzcgKi8KK3sgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSIxK2ksIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKK3sgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSJpKzEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgaStyczEsJW83ICovCit7ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiaSsxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCit7ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8UlMxX0cwLAkiaSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSwlbzcgKi8KK3sgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCSJpLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCit7ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8U0lNTTEzKH4wKSwJIjEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsJW83ICovCit7ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8U0lNTTEzKH4wKSwJIjEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKKworCisvKiBDb25kaXRpb25hbCBpbnN0cnVjdGlvbnMuCisKKyAgIEJlY2F1c2UgdGhpcyBwYXJ0IG9mIHRoZSB0YWJsZSB3YXMgc3VjaCBhIG1lc3MgZWFybGllciwgSSBoYXZlCisgICBtYWNyb2ZpZWQgaXQgc28gdGhhdCBhbGwgdGhlIGJyYW5jaGVzIGFuZCB0cmFwcyBhcmUgZ2VuZXJhdGVkIGZyb20KKyAgIGEgc2luZ2xlLWxpbmUgZGVzY3JpcHRpb24gb2YgZWFjaCBjb25kaXRpb24gdmFsdWUuICBKb2huIEdpbG1vcmUuICovCisKKy8qIERlZmluZSBicmFuY2hlcyAtLSBvbmUgYW5udWxsZWQsIG9uZSB3aXRob3V0LCBldGMuICovCisjZGVmaW5lIGJyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKKyB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICAgICAgICIsYSBsIiwgICAoZmxhZ3MpLCB2NiB9LCBcCisgeyBvcGNvZGUsIChtYXNrKSAgICAgICwgKGxvc2UpfEFOTlVMLCAibCIsICAgICAoZmxhZ3MpLCB2NiB9CisKKyNkZWZpbmUgYnJ4KG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKKyB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIlosRyIsICAgICAgKGZsYWdzKSwgdjkgfSwgXAorIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiLFQgWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCisgeyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhLFQgWixHIiwgKGZsYWdzKSwgdjkgfSwgXAorIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKSwgQU5OVUx8QlBSRUR8KGxvc2UpLCAiLE4gWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCisgeyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEFOTlVMLCBCUFJFRHwobG9zZSksICIsYSxOIFosRyIsIChmbGFncyksIHY5IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSl8KDI8PDIwKSwgInosRyIsICAgICAgKGZsYWdzKSwgdjkgfSwgXAorIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKXwoMjw8MjApLCAiLFQgeixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCisgeyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpfCgyPDwyMCksICIsYSB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSl8KDI8PDIwKSwgIixhLFQgeixHIiwgKGZsYWdzKSwgdjkgfSwgXAorIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfEJQUkVEfChsb3NlKXwoMjw8MjApLCAiLE4geixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCisgeyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgQlBSRUR8KGxvc2UpfCgyPDwyMCksICIsYSxOIHosRyIsIChmbGFncyksIHY5IH0KKworLyogRGVmaW5lIGZvdXIgdHJhcHM6IHJlZytyZWcsIHJlZyArIGltbWVkaWF0ZSwgaW1tZWRpYXRlIGFsb25lLCByZWcgYWxvbmUuICovCisjZGVmaW5lIHRyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKKyB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCSJaLGkiLCAgIChmbGFncyksIHY5IH0sIC8qICVnMCArIGltbSAqLyBcCisgeyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpfElNTUVELCAobG9zZSksCSJaLDEraSIsIChmbGFncyksIHY5IH0sIC8qIHJzMSArIGltbSAqLyBcCisgeyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpLCBJTU1FRHwobG9zZSksCSJaLDErMiIsIChmbGFncyksIHY5IH0sIC8qIHJzMSArIHJzMiAqLyBcCisgeyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkiWiwxIiwgICAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyAlZzAgKi8gXAorIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCSJ6LGkiLCAgIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogJWcwICsgaW1tICovIFwKKyB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSksCSJ6LDEraSIsIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgaW1tICovIFwKKyB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSksCSJ6LDErMiIsIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgcnMyICovIFwKKyB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkieiwxIiwgICAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArICVnMCAqLyBcCisgeyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJCSJpIiwgICAgIChmbGFncyksIHY2IH0sIC8qICVnMCArIGltbSAqLyBcCisgeyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpLAkJIjEraSIsICAgKGZsYWdzKSwgdjYgfSwgLyogcnMxICsgaW1tICovIFwKKyB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSksCQkiMSsyIiwgICAoZmxhZ3MpLCB2NiB9LCAvKiByczEgKyByczIgKi8gXAorIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKXxSUzJfRzAsCQkiMSIsICAgICAoZmxhZ3MpLCB2NiB9IC8qIHJzMSArICVnMCAqLworCisvKiB2OTogV2UgbXVzdCBwdXQgYGJyeCcgYmVmb3JlIGBicicsIHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIG1hdGNoIHNvbWV0aGluZworICAgdjk6IGFnYWluc3QgYW4gZXhwcmVzc2lvbiB1bmxlc3MgaXQgaXMgYW4gZXhwcmVzc2lvbi4gIE90aGVyd2lzZSwgd2UgZW5kCisgICB2OTogdXAgd2l0aCB1bmRlZmluZWQgc3ltYm9sIHRhYmxlcyBlbnRyaWVzLCBiZWNhdXNlIHRoZXkgZ2V0IGFkZGVkLCBidXQKKyAgIHY5OiBhcmUgbm90IGRlbGV0ZWQgaWYgdGhlIHBhdHRlcm4gZmFpbHMgdG8gbWF0Y2guICAqLworCisvKiBEZWZpbmUgYm90aCBicmFuY2hlcyBhbmQgdHJhcHMgYmFzZWQgb24gY29uZGl0aW9uIG1hc2sgKi8KKyNkZWZpbmUgY29uZChib3AsIHRvcCwgbWFzaywgZmxhZ3MpIFwKKyAgYnJ4KGJvcCwgRjIoMCwgMSl8KG1hc2spLCBGMih+MCwgfjEpfCgofm1hc2spJkNPTkQofjApKSwgRl9ERUxBWUVEfChmbGFncykpLCAvKiB2OSAqLyBcCisgIGJyKGJvcCwgIEYyKDAsIDIpfChtYXNrKSwgRjIofjAsIH4yKXwoKH5tYXNrKSZDT05EKH4wKSksIEZfREVMQVlFRHwoZmxhZ3MpKSwgXAorICB0cih0b3AsICBGMygyLCAweDNhLCAwKXwobWFzayksIEYzKH4yLCB+MHgzYSwgMCl8KCh+bWFzaykmQ09ORCh+MCkpLCAoKGZsYWdzKSAmIH4oRl9VTkJSfEZfQ09OREJSKSkpCisKKy8qIERlZmluZSBhbGwgdGhlIGNvbmRpdGlvbnMsIGFsbCB0aGUgYnJhbmNoZXMsIGFsbCB0aGUgdHJhcHMuICAqLworCisvKiBTdGFuZGFyZCBicmFuY2gsIHRyYXAgbW5lbW9uaWNzICovCitjb25kICgiYiIsCSJ0YSIsICAgQ09OREEsIEZfVU5CUiksCisvKiBBbHRlcm5hdGl2ZSBmb3JtIChqdXN0IGZvciBhc3NlbWJseSwgbm90IGZvciBkaXNhc3NlbWJseSkgKi8KK2NvbmQgKCJiYSIsCSJ0IiwgICAgQ09OREEsIEZfVU5CUnxGX0FMSUFTKSwKKworY29uZCAoImJjYyIsCSJ0Y2MiLCAgQ09ORENDLCBGX0NPTkRCUiksCitjb25kICgiYmNzIiwJInRjcyIsICBDT05EQ1MsIEZfQ09OREJSKSwKK2NvbmQgKCJiZSIsCSJ0ZSIsICAgQ09OREUsIEZfQ09OREJSKSwKK2NvbmQgKCJiZXEiLAkidGVxIiwgIENPTkRFLCBGX0NPTkRCUnxGX0FMSUFTKSwKK2NvbmQgKCJiZyIsCSJ0ZyIsICAgQ09OREcsIEZfQ09OREJSKSwKK2NvbmQgKCJiZ3QiLAkidGd0IiwgIENPTkRHLCBGX0NPTkRCUnxGX0FMSUFTKSwKK2NvbmQgKCJiZ2UiLAkidGdlIiwgIENPTkRHRSwgRl9DT05EQlIpLAorY29uZCAoImJnZXUiLAkidGdldSIsIENPTkRHRVUsIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgY2MgKi8KK2NvbmQgKCJiZ3UiLAkidGd1IiwgIENPTkRHVSwgRl9DT05EQlIpLAorY29uZCAoImJsIiwJInRsIiwgICBDT05ETCwgRl9DT05EQlIpLAorY29uZCAoImJsdCIsCSJ0bHQiLCAgQ09OREwsIEZfQ09OREJSfEZfQUxJQVMpLAorY29uZCAoImJsZSIsCSJ0bGUiLCAgQ09ORExFLCBGX0NPTkRCUiksCitjb25kICgiYmxldSIsCSJ0bGV1IiwgQ09ORExFVSwgRl9DT05EQlIpLAorY29uZCAoImJsdSIsCSJ0bHUiLCAgQ09ORExVLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGNzICovCitjb25kICgiYm4iLAkidG4iLCAgIENPTkROLCBGX0NPTkRCUiksCitjb25kICgiYm5lIiwJInRuZSIsICBDT05ETkUsIEZfQ09OREJSKSwKK2NvbmQgKCJibmVnIiwJInRuZWciLCBDT05ETkVHLCBGX0NPTkRCUiksCitjb25kICgiYm56IiwJInRueiIsICBDT05ETlosIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgbmUgKi8KK2NvbmQgKCJicG9zIiwJInRwb3MiLCBDT05EUE9TLCBGX0NPTkRCUiksCitjb25kICgiYnZjIiwJInR2YyIsICBDT05EVkMsIEZfQ09OREJSKSwKK2NvbmQgKCJidnMiLAkidHZzIiwgIENPTkRWUywgRl9DT05EQlIpLAorY29uZCAoImJ6IiwJInR6IiwgICBDT05EWiwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBlICovCisKKyN1bmRlZiBjb25kCisjdW5kZWYgYnIKKyN1bmRlZiBicnIgLyogdjkgKi8KKyN1bmRlZiB0cgorCisjZGVmaW5lIGJycihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCisgeyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiMSxrIiwgICAgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAorIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIixUIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCisgeyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEsVCAxLGsiLCBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAorIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfEJQUkVEfChsb3NlKSwgIixOIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCBCUFJFRHwobG9zZSksICIsYSxOIDEsayIsIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9CisKKyNkZWZpbmUgY29uZHIoYm9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAorICBicnIoYm9wLCBGMigwLCAzKXxDT05EKG1hc2spLCBGMih+MCwgfjMpfENPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCisKKy8qIHY5ICovIGNvbmRyKCJicm56IiwgMHg1LCBGX0NPTkRCUiksCisvKiB2OSAqLyBjb25kcigiYnJ6IiwgMHgxLCBGX0NPTkRCUiksCisvKiB2OSAqLyBjb25kcigiYnJnZXoiLCAweDcsIEZfQ09OREJSKSwKKy8qIHY5ICovIGNvbmRyKCJicmx6IiwgMHgzLCBGX0NPTkRCUiksCisvKiB2OSAqLyBjb25kcigiYnJsZXoiLCAweDIsIEZfQ09OREJSKSwKKy8qIHY5ICovIGNvbmRyKCJicmd6IiwgMHg2LCBGX0NPTkRCUiksCisKKyN1bmRlZiBjb25kciAvKiB2OSAqLworI3VuZGVmIGJyciAvKiB2OSAqLworCisjZGVmaW5lIG1vdnIob3Bjb2RlLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAorIHsgb3Bjb2RlLCBGMygyLCAweDJmLCAwKXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDJmLCB+MCl8UkNPTkQofihtYXNrKSksICIxLDIsZCIsIChmbGFncyksIHY5IH0sIFwKKyB7IG9wY29kZSwgRjMoMiwgMHgyZiwgMSl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgyZiwgfjEpfFJDT05EKH4obWFzaykpLCAiMSxqLGQiLCAoZmxhZ3MpLCB2OSB9CisKKyNkZWZpbmUgZm1ycnMob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAorIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsZixnIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KKyNkZWZpbmUgZm1ycmQob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAorIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsQixIIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KKyNkZWZpbmUgZm1ycnEob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAorIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsUixKIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KKworI2RlZmluZSBmbW92cnMobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAorICBmbXJycyhtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDUpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH41KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KKyNkZWZpbmUgZm1vdnJkKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKKyAgZm1ycmQobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg2KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+Nil8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCisjZGVmaW5lIGZtb3ZycShtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCisgIGZtcnJxKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNyl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjcpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLworCisvKiB2OSAqLyBtb3ZyKCJtb3ZybmUiLCAweDUsIDApLAorLyogdjkgKi8gbW92cigibW92cmUiLCAweDEsIDApLAorLyogdjkgKi8gbW92cigibW92cmdleiIsIDB4NywgMCksCisvKiB2OSAqLyBtb3ZyKCJtb3ZybHoiLCAweDMsIDApLAorLyogdjkgKi8gbW92cigibW92cmxleiIsIDB4MiwgMCksCisvKiB2OSAqLyBtb3ZyKCJtb3ZyZ3oiLCAweDYsIDApLAorLyogdjkgKi8gbW92cigibW92cm56IiwgMHg1LCBGX0FMSUFTKSwKKy8qIHY5ICovIG1vdnIoIm1vdnJ6IiwgMHgxLCBGX0FMSUFTKSwKKworLyogdjkgKi8gZm1vdnJzKCJmbW92cnNuZSIsIDB4NSwgMCksCisvKiB2OSAqLyBmbW92cnMoImZtb3Zyc2UiLCAweDEsIDApLAorLyogdjkgKi8gZm1vdnJzKCJmbW92cnNnZXoiLCAweDcsIDApLAorLyogdjkgKi8gZm1vdnJzKCJmbW92cnNseiIsIDB4MywgMCksCisvKiB2OSAqLyBmbW92cnMoImZtb3Zyc2xleiIsIDB4MiwgMCksCisvKiB2OSAqLyBmbW92cnMoImZtb3Zyc2d6IiwgMHg2LCAwKSwKKy8qIHY5ICovIGZtb3ZycygiZm1vdnJzbnoiLCAweDUsIEZfQUxJQVMpLAorLyogdjkgKi8gZm1vdnJzKCJmbW92cnN6IiwgMHgxLCBGX0FMSUFTKSwKKworLyogdjkgKi8gZm1vdnJkKCJmbW92cmRuZSIsIDB4NSwgMCksCisvKiB2OSAqLyBmbW92cmQoImZtb3ZyZGUiLCAweDEsIDApLAorLyogdjkgKi8gZm1vdnJkKCJmbW92cmRnZXoiLCAweDcsIDApLAorLyogdjkgKi8gZm1vdnJkKCJmbW92cmRseiIsIDB4MywgMCksCisvKiB2OSAqLyBmbW92cmQoImZtb3ZyZGxleiIsIDB4MiwgMCksCisvKiB2OSAqLyBmbW92cmQoImZtb3ZyZGd6IiwgMHg2LCAwKSwKKy8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbnoiLCAweDUsIEZfQUxJQVMpLAorLyogdjkgKi8gZm1vdnJkKCJmbW92cmR6IiwgMHgxLCBGX0FMSUFTKSwKKworLyogdjkgKi8gZm1vdnJxKCJmbW92cnFuZSIsIDB4NSwgMCksCisvKiB2OSAqLyBmbW92cnEoImZtb3ZycWUiLCAweDEsIDApLAorLyogdjkgKi8gZm1vdnJxKCJmbW92cnFnZXoiLCAweDcsIDApLAorLyogdjkgKi8gZm1vdnJxKCJmbW92cnFseiIsIDB4MywgMCksCisvKiB2OSAqLyBmbW92cnEoImZtb3ZycWxleiIsIDB4MiwgMCksCisvKiB2OSAqLyBmbW92cnEoImZtb3ZycWd6IiwgMHg2LCAwKSwKKy8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbnoiLCAweDUsIEZfQUxJQVMpLAorLyogdjkgKi8gZm1vdnJxKCJmbW92cnF6IiwgMHgxLCBGX0FMSUFTKSwKKworI3VuZGVmIG1vdnIgLyogdjkgKi8KKyN1bmRlZiBmbW92ciAvKiB2OSAqLworI3VuZGVmIGZtcnIgLyogdjkgKi8KKworI2RlZmluZSBtb3ZpY2Mob3Bjb2RlLCBjb25kLCBmbGFncykgLyogdjkgKi8gXAorICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8TUNPTkQoY29uZCwxKXxJQ0MsIEYzKH4yLCB+MHgyYywgfjApfE1DT05EKH5jb25kLH4xKXxYQ0N8KDE8PDExKSwgInosMixkIiwgZmxhZ3MsIHY5IH0sIFwKKyAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfE1DT05EKGNvbmQsMSl8SUNDLCBGMyh+MiwgfjB4MmMsIH4xKXxNQ09ORCh+Y29uZCx+MSl8WENDfCgxPDwxMSksICJ6LEksZCIsIGZsYWdzLCB2OSB9LCBcCisgIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxNQ09ORChjb25kLDEpfFhDQywgRjMofjIsIH4weDJjLCB+MCl8TUNPTkQofmNvbmQsfjEpfCgxPDwxMSksICAgICAiWiwyLGQiLCBmbGFncywgdjkgfSwgXAorICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8TUNPTkQoY29uZCwxKXxYQ0MsIEYzKH4yLCB+MHgyYywgfjEpfE1DT05EKH5jb25kLH4xKXwoMTw8MTEpLCAgICAgIlosSSxkIiwgZmxhZ3MsIHY5IH0KKworI2RlZmluZSBtb3ZmY2Mob3Bjb2RlLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKKyAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygwKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjApfEYzKH4yLCB+MHgyYywgfjApLCAiNiwyLGQiLCBmbGFncywgdjkgfSwgXAorICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDApfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MCl8RjMofjIsIH4weDJjLCB+MSksICI2LEksZCIsIGZsYWdzLCB2OSB9LCBcCisgIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMSl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4xKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjcsMixkIiwgZmxhZ3MsIHY5IH0sIFwKKyAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygxKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjEpfEYzKH4yLCB+MHgyYywgfjEpLCAiNyxJLGQiLCBmbGFncywgdjkgfSwgXAorICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDIpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Mil8RjMofjIsIH4weDJjLCB+MCksICI4LDIsZCIsIGZsYWdzLCB2OSB9LCBcCisgIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMil8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4yKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjgsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKKyAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygzKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjMpfEYzKH4yLCB+MHgyYywgfjApLCAiOSwyLGQiLCBmbGFncywgdjkgfSwgXAorICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDMpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Myl8RjMofjIsIH4weDJjLCB+MSksICI5LEksZCIsIGZsYWdzLCB2OSB9CisKKyNkZWZpbmUgbW92Y2Mob3Bjb2RlLCBjb25kLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKKyAgbW92ZmNjIChvcGNvZGUsIGZjb25kLCBmbGFncyksIC8qIHY5ICovIFwKKyAgbW92aWNjIChvcGNvZGUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLworCisvKiB2OSAqLyBtb3ZjYyAgKCJtb3ZhIiwJQ09OREEsIEZDT05EQSwgMCksCisvKiB2OSAqLyBtb3ZpY2MgKCJtb3ZjYyIsCUNPTkRDQywgMCksCisvKiB2OSAqLyBtb3ZpY2MgKCJtb3ZnZXUiLAlDT05ER0VVLCBGX0FMSUFTKSwKKy8qIHY5ICovIG1vdmljYyAoIm1vdmNzIiwJQ09ORENTLCAwKSwKKy8qIHY5ICovIG1vdmljYyAoIm1vdmx1IiwJQ09ORExVLCBGX0FMSUFTKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdmUiLAlDT05ERSwgRkNPTkRFLCAwKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdmciLAlDT05ERywgRkNPTkRHLCAwKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdmdlIiwJQ09OREdFLCBGQ09OREdFLCAwKSwKKy8qIHY5ICovIG1vdmljYyAoIm1vdmd1IiwJQ09OREdVLCAwKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdmwiLAlDT05ETCwgRkNPTkRMLCAwKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdmxlIiwJQ09ORExFLCBGQ09ORExFLCAwKSwKKy8qIHY5ICovIG1vdmljYyAoIm1vdmxldSIsCUNPTkRMRVUsIDApLAorLyogdjkgKi8gbW92ZmNjICgibW92bGciLAlGQ09ORExHLCAwKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdm4iLAlDT05ETiwgRkNPTkROLCAwKSwKKy8qIHY5ICovIG1vdmNjICAoIm1vdm5lIiwJQ09ORE5FLCBGQ09ORE5FLCAwKSwKKy8qIHY5ICovIG1vdmljYyAoIm1vdm5lZyIsCUNPTkRORUcsIDApLAorLyogdjkgKi8gbW92Y2MgICgibW92bnoiLAlDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAorLyogdjkgKi8gbW92ZmNjICgibW92byIsCUZDT05ETywgMCksCisvKiB2OSAqLyBtb3ZpY2MgKCJtb3Zwb3MiLAlDT05EUE9TLCAwKSwKKy8qIHY5ICovIG1vdmZjYyAoIm1vdnUiLAlGQ09ORFUsIDApLAorLyogdjkgKi8gbW92ZmNjICgibW92dWUiLAlGQ09ORFVFLCAwKSwKKy8qIHY5ICovIG1vdmZjYyAoIm1vdnVnIiwJRkNPTkRVRywgMCksCisvKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1Z2UiLAlGQ09ORFVHRSwgMCksCisvKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1bCIsCUZDT05EVUwsIDApLAorLyogdjkgKi8gbW92ZmNjICgibW92dWxlIiwJRkNPTkRVTEUsIDApLAorLyogdjkgKi8gbW92aWNjICgibW92dmMiLAlDT05EVkMsIDApLAorLyogdjkgKi8gbW92aWNjICgibW92dnMiLAlDT05EVlMsIDApLAorLyogdjkgKi8gbW92Y2MgICgibW92eiIsCUNPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAorCisjdW5kZWYgbW92aWNjIC8qIHY5ICovCisjdW5kZWYgbW92ZmNjIC8qIHY5ICovCisjdW5kZWYgbW92Y2MgLyogdjkgKi8KKworI2RlZmluZSBGTV9TRiAxCQkvKiB2OSAtIHZhbHVlcyBmb3IgZnBzaXplICovCisjZGVmaW5lIEZNX0RGIDIJCS8qIHY5ICovCisjZGVmaW5lIEZNX1FGIDMJCS8qIHY5ICovCisKKyNkZWZpbmUgZm1vdmljYyhvcGNvZGUsIGZwc2l6ZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKK3sgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxMDArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDEwMCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAieixmLGciLCBmbGFncywgdjkgfSwgXAoreyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDE4MCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTgwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJaLGYsZyIsIGZsYWdzLCB2OSB9CisKKyNkZWZpbmUgZm1vdmZjYyhvcGNvZGUsIGZwc2l6ZSwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDAwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwMDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjYsZixnIiwgZmxhZ3MsIHY5IH0sIFwKK3sgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwNDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA0MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNyxmLGciLCBmbGFncywgdjkgfSwgXAoreyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA4MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDgwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI4LGYsZyIsIGZsYWdzLCB2OSB9LCBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MGMwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwYzArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjksZixnIiwgZmxhZ3MsIHY5IH0KKworLyogRklYTUU6IHVzZSBmbW92aWNjL2Ztb3ZmY2M/ICovIC8qIHY5ICovCisjZGVmaW5lIGZtb3ZjYyhvcGNvZGUsIGZwc2l6ZSwgY29uZCwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTAwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxMDArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgInosZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDAwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwMDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjYsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTgwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxODArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgIlosZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDQwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwNDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjcsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDgwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwODArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjgsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCit7IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MGMwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwYzArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjksZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9CisKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGEiLAlGTV9ERiwgQ09OREEsIEZDT05EQSwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFhIiwJRk1fUUYsIENPTkRBLCBGQ09OREEsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzYSIsCUZNX1NGLCBDT05EQSwgRkNPTkRBLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGNjIiwJRk1fREYsIENPTkRDQywgMCksCisvKiB2OSAqLyBmbW92aWNjICgiZm1vdnFjYyIsCUZNX1FGLCBDT05EQ0MsIDApLAorLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzY2MiLAlGTV9TRiwgQ09ORENDLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGNzIiwJRk1fREYsIENPTkRDUywgMCksCisvKiB2OSAqLyBmbW92aWNjICgiZm1vdnFjcyIsCUZNX1FGLCBDT05EQ1MsIDApLAorLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzY3MiLAlGTV9TRiwgQ09ORENTLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGUiLAlGTV9ERiwgQ09OREUsIEZDT05ERSwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFlIiwJRk1fUUYsIENPTkRFLCBGQ09OREUsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZSIsCUZNX1NGLCBDT05ERSwgRkNPTkRFLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGciLAlGTV9ERiwgQ09OREcsIEZDT05ERywgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFnIiwJRk1fUUYsIENPTkRHLCBGQ09OREcsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZyIsCUZNX1NGLCBDT05ERywgRkNPTkRHLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGdlIiwJRk1fREYsIENPTkRHRSwgRkNPTkRHRSwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFnZSIsCUZNX1FGLCBDT05ER0UsIEZDT05ER0UsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZ2UiLAlGTV9TRiwgQ09OREdFLCBGQ09OREdFLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGdldSIsCUZNX0RGLCBDT05ER0VVLCBGX0FMSUFTKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWdldSIsCUZNX1FGLCBDT05ER0VVLCBGX0FMSUFTKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2dldSIsCUZNX1NGLCBDT05ER0VVLCBGX0FMSUFTKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGd1IiwJRk1fREYsIENPTkRHVSwgMCksCisvKiB2OSAqLyBmbW92aWNjICgiZm1vdnFndSIsCUZNX1FGLCBDT05ER1UsIDApLAorLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzZ3UiLAlGTV9TRiwgQ09OREdVLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGwiLAlGTV9ERiwgQ09OREwsIEZDT05ETCwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFsIiwJRk1fUUYsIENPTkRMLCBGQ09OREwsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbCIsCUZNX1NGLCBDT05ETCwgRkNPTkRMLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGxlIiwJRk1fREYsIENPTkRMRSwgRkNPTkRMRSwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFsZSIsCUZNX1FGLCBDT05ETEUsIEZDT05ETEUsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbGUiLAlGTV9TRiwgQ09ORExFLCBGQ09ORExFLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGxldSIsCUZNX0RGLCBDT05ETEVVLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWxldSIsCUZNX1FGLCBDT05ETEVVLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2xldSIsCUZNX1NGLCBDT05ETEVVLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZGxnIiwJRk1fREYsIEZDT05ETEcsIDApLAorLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxbGciLAlGTV9RRiwgRkNPTkRMRywgMCksCisvKiB2OSAqLyBmbW92ZmNjICgiZm1vdnNsZyIsCUZNX1NGLCBGQ09ORExHLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGx1IiwJRk1fREYsIENPTkRMVSwgRl9BTElBUyksCisvKiB2OSAqLyBmbW92aWNjICgiZm1vdnFsdSIsCUZNX1FGLCBDT05ETFUsIEZfQUxJQVMpLAorLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbHUiLAlGTV9TRiwgQ09ORExVLCBGX0FMSUFTKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG4iLAlGTV9ERiwgQ09ORE4sIEZDT05ETiwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFuIiwJRk1fUUYsIENPTkROLCBGQ09ORE4sIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbiIsCUZNX1NGLCBDT05ETiwgRkNPTkROLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG5lIiwJRk1fREYsIENPTkRORSwgRkNPTkRORSwgMCksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFuZSIsCUZNX1FGLCBDT05ETkUsIEZDT05ETkUsIDApLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbmUiLAlGTV9TRiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZG5lZyIsCUZNX0RGLCBDT05ETkVHLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cW5lZyIsCUZNX1FGLCBDT05ETkVHLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c25lZyIsCUZNX1NGLCBDT05ETkVHLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG56IiwJRk1fREYsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFueiIsCUZNX1FGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbnoiLAlGTV9TRiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZG8iLAlGTV9ERiwgRkNPTkRPLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cW8iLAlGTV9RRiwgRkNPTkRPLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c28iLAlGTV9TRiwgRkNPTkRPLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHBvcyIsCUZNX0RGLCBDT05EUE9TLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXBvcyIsCUZNX1FGLCBDT05EUE9TLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3BvcyIsCUZNX1NGLCBDT05EUE9TLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHUiLAlGTV9ERiwgRkNPTkRVLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXUiLAlGTV9RRiwgRkNPTkRVLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3UiLAlGTV9TRiwgRkNPTkRVLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVlIiwJRk1fREYsIEZDT05EVUUsIDApLAorLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWUiLAlGTV9RRiwgRkNPTkRVRSwgMCksCisvKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1ZSIsCUZNX1NGLCBGQ09ORFVFLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVnIiwJRk1fREYsIEZDT05EVUcsIDApLAorLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWciLAlGTV9RRiwgRkNPTkRVRywgMCksCisvKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1ZyIsCUZNX1NGLCBGQ09ORFVHLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVnZSIsCUZNX0RGLCBGQ09ORFVHRSwgMCksCisvKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1Z2UiLAlGTV9RRiwgRkNPTkRVR0UsIDApLAorLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWdlIiwJRk1fU0YsIEZDT05EVUdFLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVsIiwJRk1fREYsIEZDT05EVUwsIDApLAorLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWwiLAlGTV9RRiwgRkNPTkRVTCwgMCksCisvKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1bCIsCUZNX1NGLCBGQ09ORFVMLCAwKSwKKy8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVsZSIsCUZNX0RGLCBGQ09ORFVMRSwgMCksCisvKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1bGUiLAlGTV9RRiwgRkNPTkRVTEUsIDApLAorLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWxlIiwJRk1fU0YsIEZDT05EVUxFLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHZjIiwJRk1fREYsIENPTkRWQywgMCksCisvKiB2OSAqLyBmbW92aWNjICgiZm1vdnF2YyIsCUZNX1FGLCBDT05EVkMsIDApLAorLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzdmMiLAlGTV9TRiwgQ09ORFZDLCAwKSwKKy8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHZzIiwJRk1fREYsIENPTkRWUywgMCksCisvKiB2OSAqLyBmbW92aWNjICgiZm1vdnF2cyIsCUZNX1FGLCBDT05EVlMsIDApLAorLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzdnMiLAlGTV9TRiwgQ09ORFZTLCAwKSwKKy8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZHoiLAlGTV9ERiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCisvKiB2OSAqLyBmbW92Y2MgICgiZm1vdnF6IiwJRk1fUUYsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAorLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzeiIsCUZNX1NGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKKworI3VuZGVmIGZtb3ZpY2MgLyogdjkgKi8KKyN1bmRlZiBmbW92ZmNjIC8qIHY5ICovCisjdW5kZWYgZm1vdmNjIC8qIHY5ICovCisjdW5kZWYgRk1fREYgLyogdjkgKi8KKyN1bmRlZiBGTV9RRiAvKiB2OSAqLworI3VuZGVmIEZNX1NGIC8qIHY5ICovCisKKy8qIENvcHJvY2Vzc29yIGJyYW5jaGVzLiAgKi8KKyNkZWZpbmUgQ0JSKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MsIGFyY2gpIFwKKyB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgZmxhZ3N8Rl9ERUxBWUVELCBhcmNoIH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgZmxhZ3N8Rl9ERUxBWUVELCBhcmNoIH0KKworLyogRmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMuICAqLworI2RlZmluZSBGQlIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAorIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY2IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2NiB9CisKKy8qIFY5IGV4dGVuZGVkIGZsb2F0aW5nIHBvaW50IGJyYW5jaGVzLiAgKi8KKyNkZWZpbmUgRkJSWChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCisgeyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjApfChsb3NlKSwgIjYsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjApfChsb3NlKSwgIixUIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjApfChsb3NlKSwgIixhIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjApfChsb3NlKSwgIixhLFQgNixHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjApfChsb3NlKSwgIixOIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjApfChsb3NlKSwgIixhLE4gNixHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjEpfChsb3NlKSwgIjcsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjEpfChsb3NlKSwgIixUIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjEpfChsb3NlKSwgIixhIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjEpfChsb3NlKSwgIixhLFQgNyxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjEpfChsb3NlKSwgIixOIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjEpfChsb3NlKSwgIixhLE4gNyxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjIpfChsb3NlKSwgIjgsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjIpfChsb3NlKSwgIixUIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjIpfChsb3NlKSwgIixhIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjIpfChsb3NlKSwgIixhLFQgOCxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjIpfChsb3NlKSwgIixOIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjIpfChsb3NlKSwgIixhLE4gOCxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjMpfChsb3NlKSwgIjksRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjMpfChsb3NlKSwgIixUIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjMpfChsb3NlKSwgIixhIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjMpfChsb3NlKSwgIixhLFQgOSxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjMpfChsb3NlKSwgIixOIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCisgeyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjMpfChsb3NlKSwgIixhLE4gOSxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9CisKKy8qIHY5OiBXZSBtdXN0IHB1dCBgRkJSWCcgYmVmb3JlIGBGQlInLCB0byBlbnN1cmUgdGhhdCB3ZSBuZXZlciBtYXRjaAorICAgdjk6IHNvbWV0aGluZyBhZ2FpbnN0IGFuIGV4cHJlc3Npb24gdW5sZXNzIGl0IGlzIGFuIGV4cHJlc3Npb24uICBPdGhlcndpc2UsCisgICB2OTogd2UgZW5kIHVwIHdpdGggdW5kZWZpbmVkIHN5bWJvbCB0YWJsZXMgZW50cmllcywgYmVjYXVzZSB0aGV5IGdldCBhZGRlZCwKKyAgIHY5OiBidXQgYXJlIG5vdCBkZWxldGVkIGlmIHRoZSBwYXR0ZXJuIGZhaWxzIHRvIG1hdGNoLiAgKi8KKworI2RlZmluZSBDT05ERkMoZm9wLCBjb3AsIG1hc2ssIGZsYWdzKSBcCisgIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAorICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKSwgXAorICBDQlIoY29wLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSksIGZsYWdzLCB2Nm5vdGxldCkKKworI2RlZmluZSBDT05ERkNMKGZvcCwgY29wLCBtYXNrLCBmbGFncykgXAorICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKKyAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncyksIFwKKyAgQ0JSKGNvcCwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpLCBmbGFncywgdjYpCisKKyNkZWZpbmUgQ09OREYoZm9wLCBtYXNrLCBmbGFncykgXAorICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKKyAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncykKKworQ09OREZDICAoImZiIiwgICAgImNiIiwgICAgMHg4LCAwKSwKK0NPTkRGQ0wgKCJmYmEiLAkgICJjYmEiLCAgIDB4OCwgRl9BTElBUyksCitDT05ERkMgICgiZmJlIiwJICAiY2IwIiwgICAweDksIDApLAorQ09OREYgICAoImZieiIsICAgICAgICAgICAgMHg5LCBGX0FMSUFTKSwKK0NPTkRGQyAgKCJmYmciLAkgICJjYjIiLCAgIDB4NiwgMCksCitDT05ERkMgICgiZmJnZSIsICAiY2IwMiIsICAweGIsIDApLAorQ09OREZDICAoImZibCIsCSAgImNiMSIsICAgMHg0LCAwKSwKK0NPTkRGQyAgKCJmYmxlIiwgICJjYjAxIiwgIDB4ZCwgMCksCitDT05ERkMgICgiZmJsZyIsICAiY2IxMiIsICAweDIsIDApLAorQ09OREZDTCAoImZibiIsCSAgImNibiIsICAgMHgwLCAwKSwKK0NPTkRGQyAgKCJmYm5lIiwgICJjYjEyMyIsIDB4MSwgMCksCitDT05ERiAgICgiZmJueiIsICAgICAgICAgICAweDEsIEZfQUxJQVMpLAorQ09OREZDICAoImZibyIsCSAgImNiMDEyIiwgMHhmLCAwKSwKK0NPTkRGQyAgKCJmYnUiLAkgICJjYjMiLCAgIDB4NywgMCksCitDT05ERkMgICgiZmJ1ZSIsICAiY2IwMyIsICAweGEsIDApLAorQ09OREZDICAoImZidWciLCAgImNiMjMiLCAgMHg1LCAwKSwKK0NPTkRGQyAgKCJmYnVnZSIsICJjYjAyMyIsIDB4YywgMCksCitDT05ERkMgICgiZmJ1bCIsICAiY2IxMyIsICAweDMsIDApLAorQ09OREZDICAoImZidWxlIiwgImNiMDEzIiwgMHhlLCAwKSwKKworI3VuZGVmIENPTkRGQworI3VuZGVmIENPTkRGQ0wKKyN1bmRlZiBDT05ERgorI3VuZGVmIENCUgorI3VuZGVmIEZCUgorI3VuZGVmIEZCUlgJLyogdjkgKi8KKworeyAiam1wIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfFJEX0cwfEFTSSh+MCksCSIxKzIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStyczIsJWcwICovCit7ICJqbXAiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLCVnMCAqLworeyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwLAkJIjEraSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK2ksJWcwICovCit7ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzAsCQkiaSsxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCBpK3JzMSwlZzAgKi8KK3sgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksJWcwICovCit7ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLCVnMCAqLworCit7ICJub3AiLAlGMigwLCA0KSwgMHhmZWZmZmZmZiwgIiIsIDAsIHY2IH0sIC8qIHNldGhpIDAsICVnMCAqLworCit7ICJzZXQiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiU2gsZCIsIEZfQUxJQVMsIHY2IH0sCit7ICJzZXR1dyIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTaCxkIiwgRl9BTElBUywgdjkgfSwKK3sgInNldHN3IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlNoLGQiLCBGX0FMSUFTLCB2OSB9LAoreyAic2V0eCIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCwxLGQiLCBGX0FMSUFTLCB2OSB9LAorCit7ICJzZXRoaSIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJoLGQiLCAwLCB2NiB9LAorCit7ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAwKSwgRjMofjIsIH4weDIwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDEpLCBGMyh+MiwgfjB4MjAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAxKSwgRjMofjIsIH4weDIwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoreyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAwKSwgRjMofjIsIH4weDIyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMSksIEYzKH4yLCB+MHgyMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKK3sgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMSksIEYzKH4yLCB+MHgyMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKKworeyAidHN1YmNjIiwJRjMoMiwgMHgyMSwgMCksIEYzKH4yLCB+MHgyMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJ0c3ViY2MiLAlGMygyLCAweDIxLCAxKSwgRjMofjIsIH4weDIxLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoreyAidHN1YmNjdHYiLAlGMygyLCAweDIzLCAwKSwgRjMofjIsIH4weDIzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgInRzdWJjY3R2IiwJRjMoMiwgMHgyMywgMSksIEYzKH4yLCB+MHgyMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKKworeyAidW5pbXAiLAlGMigweDAsIDB4MCksIDB4ZmZjMDAwMDAsICJuIiwgMCwgdjZub3R2OSB9LAoreyAiaWxsdHJhcCIsCUYyKDAsIDApLCBGMih+MCwgfjApfFJEX0cwLCAibiIsIDAsIHY5IH0sCisKKy8qIFRoaXMgKmlzKiBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KK3sgInhub3IiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgInhub3IiLAlGMygyLCAweDA3LCAxKSwgRjMofjIsIH4weDA3LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoreyAieG5vciIsCUYzKDIsIDB4MDcsIDEpLCBGMyh+MiwgfjB4MDcsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCisvKiBUaGlzICppcyogYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCit7ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAwKSwgRjMofjIsIH4weDE3LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKK3sgInhub3JjYyIsCUYzKDIsIDB4MTcsIDEpLCBGMyh+MiwgfjB4MTcsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAxKSwgRjMofjIsIH4weDE3LCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoreyAieG9yIiwJRjMoMiwgMHgwMywgMCksIEYzKH4yLCB+MHgwMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJ4b3IiLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoreyAieG9yIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKK3sgInhvcmNjIiwJRjMoMiwgMHgxMywgMCksIEYzKH4yLCB+MHgxMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCit7ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDEpLCBGMyh+MiwgfjB4MTMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCit7ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDEpLCBGMyh+MiwgfjB4MTMsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCisKK3sgIm5vdCIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLCAiMSxkIiwgRl9BTElBUywgdjYgfSwgLyogeG5vciByczEsJTAscmQgKi8KK3sgIm5vdCIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLCAiciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhub3IgcmQsJTAscmQgKi8KKworeyAiYnRvZyIsCUYzKDIsIDB4MDMsIDApLCBGMyh+MiwgfjB4MDMsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwgLyogeG9yIHJkLHJzMixyZCAqLworeyAiYnRvZyIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4b3IgcmQsaSxyZCAqLworCisvKiBGUG9wMSBhbmQgRlBvcDIgYXJlIG5vdCBpbnN0cnVjdGlvbnMuICBEb24ndCBhY2NlcHQgdGhlbS4gICovCisKK3sgImZkdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQyKXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2NiB9LAoreyAiZnN0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDEpLCBGM0YofjIsIH4weDM0LCB+MHgwZDEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCit7ICJmcXRvaSIsCUYzRigyLCAweDM0LCAweDBkMyksIEYzRih+MiwgfjB4MzQsIH4weDBkMyl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjggfSwKKworeyAiZmR0b3giLAlGM0YoMiwgMHgzNCwgMHgwODIpLCBGM0YofjIsIH4weDM0LCB+MHgwODIpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY5IH0sCit7ICJmc3RveCIsCUYzRigyLCAweDM0LCAweDA4MSksIEYzRih+MiwgfjB4MzQsIH4weDA4MSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZxdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgzKXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OSB9LAorCit7ICJmaXRvZCIsCUYzRigyLCAweDM0LCAweDBjOCksIEYzRih+MiwgfjB4MzQsIH4weDBjOCl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjYgfSwKK3sgImZpdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM0KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM0KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoreyAiZml0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2MpLCBGM0YofjIsIH4weDM0LCB+MHgwY2MpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY4IH0sCisKK3sgImZ4dG9kIiwJRjNGKDIsIDB4MzQsIDB4MDg4KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDg4KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2OSB9LAoreyAiZnh0b3MiLAlGM0YoMiwgMHgzNCwgMHgwODQpLCBGM0YofjIsIH4weDM0LCB+MHgwODQpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY5IH0sCit7ICJmeHRvcSIsCUYzRigyLCAweDM0LCAweDA4YyksIEYzRih+MiwgfjB4MzQsIH4weDA4Yyl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjkgfSwKKworeyAiZmR0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2UpLCBGM0YofjIsIH4weDM0LCB+MHgwY2UpfFJTMV9HMCwgIkIsSiIsIEZfRkxPQVQsIHY4IH0sCit7ICJmZHRvcyIsCUYzRigyLCAweDM0LCAweDBjNiksIEYzRih+MiwgfjB4MzQsIH4weDBjNil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjYgfSwKK3sgImZxdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGNiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNiKXxSUzFfRzAsICJSLEgiLCBGX0ZMT0FULCB2OCB9LAoreyAiZnF0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzcpLCBGM0YofjIsIH4weDM0LCB+MHgwYzcpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY4IH0sCit7ICJmc3RvZCIsCUYzRigyLCAweDM0LCAweDBjOSksIEYzRih+MiwgfjB4MzQsIH4weDBjOSl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjYgfSwKK3sgImZzdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNkKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNkKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OCB9LAorCit7ICJmZGl2ZCIsCUYzRigyLCAweDM0LCAweDA0ZSksIEYzRih+MiwgfjB4MzQsIH4weDA0ZSksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCit7ICJmZGl2cSIsCUYzRigyLCAweDM0LCAweDA0ZiksIEYzRih+MiwgfjB4MzQsIH4weDA0ZiksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCit7ICJmZGl2cyIsCUYzRigyLCAweDM0LCAweDA0ZCksIEYzRih+MiwgfjB4MzQsIH4weDA0ZCksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCit7ICJmbXVsZCIsCUYzRigyLCAweDM0LCAweDA0YSksIEYzRih+MiwgfjB4MzQsIH4weDA0YSksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCit7ICJmbXVscSIsCUYzRigyLCAweDM0LCAweDA0YiksIEYzRih+MiwgfjB4MzQsIH4weDA0YiksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCit7ICJmbXVscyIsCUYzRigyLCAweDM0LCAweDA0OSksIEYzRih+MiwgfjB4MzQsIH4weDA0OSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCisKK3sgImZkbXVscSIsCUYzRigyLCAweDM0LCAweDA2ZSksIEYzRih+MiwgfjB4MzQsIH4weDA2ZSksICJ2LEIsSiIsIEZfRkxPQVQsIHY4IH0sCit7ICJmc211bGQiLAlGM0YoMiwgMHgzNCwgMHgwNjkpLCBGM0YofjIsIH4weDM0LCB+MHgwNjkpLCAiZSxmLEgiLCBGX0ZMT0FULCB2OCB9LAorCit7ICJmc3FydGQiLAlGM0YoMiwgMHgzNCwgMHgwMmEpLCBGM0YofjIsIH4weDM0LCB+MHgwMmEpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY3IH0sCit7ICJmc3FydHEiLAlGM0YoMiwgMHgzNCwgMHgwMmIpLCBGM0YofjIsIH4weDM0LCB+MHgwMmIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY4IH0sCit7ICJmc3FydHMiLAlGM0YoMiwgMHgzNCwgMHgwMjkpLCBGM0YofjIsIH4weDM0LCB+MHgwMjkpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY3IH0sCisKK3sgImZhYnNkIiwJRjNGKDIsIDB4MzQsIDB4MDBhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBhKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmFic3EiLAlGM0YoMiwgMHgzNCwgMHgwMGIpLCBGM0YofjIsIH4weDM0LCB+MHgwMGIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmYWJzcyIsCUYzRigyLCAweDM0LCAweDAwOSksIEYzRih+MiwgfjB4MzQsIH4weDAwOSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKK3sgImZtb3ZkIiwJRjNGKDIsIDB4MzQsIDB4MDAyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAyKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoreyAiZm1vdnEiLAlGM0YoMiwgMHgzNCwgMHgwMDMpLCBGM0YofjIsIH4weDM0LCB+MHgwMDMpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmbW92cyIsCUYzRigyLCAweDM0LCAweDAwMSksIEYzRih+MiwgfjB4MzQsIH4weDAwMSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKK3sgImZuZWdkIiwJRjNGKDIsIDB4MzQsIDB4MDA2KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA2KXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoreyAiZm5lZ3EiLAlGM0YoMiwgMHgzNCwgMHgwMDcpLCBGM0YofjIsIH4weDM0LCB+MHgwMDcpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmbmVncyIsCUYzRigyLCAweDM0LCAweDAwNSksIEYzRih+MiwgfjB4MzQsIH4weDAwNSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKKworeyAiZmFkZGQiLAlGM0YoMiwgMHgzNCwgMHgwNDIpLCBGM0YofjIsIH4weDM0LCB+MHgwNDIpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoreyAiZmFkZHEiLAlGM0YoMiwgMHgzNCwgMHgwNDMpLCBGM0YofjIsIH4weDM0LCB+MHgwNDMpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoreyAiZmFkZHMiLAlGM0YoMiwgMHgzNCwgMHgwNDEpLCBGM0YofjIsIH4weDM0LCB+MHgwNDEpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAoreyAiZnN1YmQiLAlGM0YoMiwgMHgzNCwgMHgwNDYpLCBGM0YofjIsIH4weDM0LCB+MHgwNDYpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoreyAiZnN1YnEiLAlGM0YoMiwgMHgzNCwgMHgwNDcpLCBGM0YofjIsIH4weDM0LCB+MHgwNDcpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoreyAiZnN1YnMiLAlGM0YoMiwgMHgzNCwgMHgwNDUpLCBGM0YofjIsIH4weDM0LCB+MHgwNDUpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAorCisjZGVmaW5lIENNUEZDQyh4KQkoKCh4KSYweDMpPDwyNSkKKworeyAiZmNtcGQiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUyKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTIpfFJEX0cwLCAgInYsQiIsICAgRl9GTE9BVCwgdjYgfSwKK3sgImZjbXBkIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI2LHYsQiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wZCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiNyx2LEIiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcGQiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjgsdixCIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZjbXBkIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI5LHYsQiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wZWQiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU2KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTYpfFJEX0cwLCAgInYsQiIsICAgRl9GTE9BVCwgdjYgfSwKK3sgImZjbXBlZCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiNix2LEIiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcGVkIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI3LHYsQiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wZWQiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjgsdixCIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZjbXBlZCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiOSx2LEIiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcHEiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUzKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTMpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVQsIHY4IH0sCit7ICJmY21wcSIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiNixWLFIiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcHEiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjcsVixSIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZjbXBxIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI4LFYsUiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wcSIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOSxWLFIiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcGVxIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU3KXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FULCB2OCB9LAoreyAiZmNtcGVxIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI2LFYsUiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wZXEiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjcsVixSIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZjbXBlcSIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOCxWLFIiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcGVxIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI5LFYsUiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wcyIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTEpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1MSl8UkRfRzAsICJlLGYiLCAgIEZfRkxPQVQsIHY2IH0sCit7ICJmY21wcyIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiNixlLGYiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcHMiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjcsZSxmIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZjbXBzIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI4LGUsZiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wcyIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiOSxlLGYiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcGVzIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NSksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU1KXxSRF9HMCwgImUsZiIsICAgRl9GTE9BVCwgdjYgfSwKK3sgImZjbXBlcyIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiNixlLGYiLCBGX0ZMT0FULCB2OSB9LAoreyAiZmNtcGVzIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI3LGUsZiIsIEZfRkxPQVQsIHY5IH0sCit7ICJmY21wZXMiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjgsZSxmIiwgRl9GTE9BVCwgdjkgfSwKK3sgImZjbXBlcyIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiOSxlLGYiLCBGX0ZMT0FULCB2OSB9LAorCisvKiBUaGVzZSBFeHRlbmRlZCBGUG9wIChGSUZPKSBpbnN0cnVjdGlvbnMgYXJlIG5ldyBpbiB0aGUgRnVqaXRzdQorICAgTUI4NjkzNCwgcmVwbGFjaW5nIHRoZSBDUG9wIGluc3RydWN0aW9ucyBmcm9tIHY2IGFuZCBsYXRlcgorICAgcHJvY2Vzc29ycy4gICovCisKKyNkZWZpbmUgRUZQT1AxXzIobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzYsIG9wKSwgRjNGKH4yLCB+MHgzNiwgfm9wKXxSUzFfRzAsIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9CisjZGVmaW5lIEVGUE9QMV8zKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM2LCBvcCksIEYzRih+MiwgfjB4MzYsIH5vcCksICAgICAgICBhcmdzLCAwLCBzcGFyY2xpdGUgfQorI2RlZmluZSBFRlBPUDJfMihuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNywgb3ApLCBGM0YofjIsIH4weDM3LCB+b3ApfFJEX0cwLCAgYXJncywgMCwgc3BhcmNsaXRlIH0KKworRUZQT1AxXzIgKCJlZml0b2QiLAkweDBjOCwgImYsSCIpLAorRUZQT1AxXzIgKCJlZml0b3MiLAkweDBjNCwgImYsZyIpLAorRUZQT1AxXzIgKCJlZmR0b2kiLAkweDBkMiwgIkIsZyIpLAorRUZQT1AxXzIgKCJlZnN0b2kiLAkweDBkMSwgImYsZyIpLAorRUZQT1AxXzIgKCJlZnN0b2QiLAkweDBjOSwgImYsSCIpLAorRUZQT1AxXzIgKCJlZmR0b3MiLAkweDBjNiwgIkIsZyIpLAorRUZQT1AxXzIgKCJlZm1vdnMiLAkweDAwMSwgImYsZyIpLAorRUZQT1AxXzIgKCJlZm5lZ3MiLAkweDAwNSwgImYsZyIpLAorRUZQT1AxXzIgKCJlZmFic3MiLAkweDAwOSwgImYsZyIpLAorRUZQT1AxXzIgKCJlZnNxcnRkIiwJMHgwMmEsICJCLEgiKSwKK0VGUE9QMV8yICgiZWZzcXJ0cyIsCTB4MDI5LCAiZixnIiksCitFRlBPUDFfMyAoImVmYWRkZCIsCTB4MDQyLCAidixCLEgiKSwKK0VGUE9QMV8zICgiZWZhZGRzIiwJMHgwNDEsICJlLGYsZyIpLAorRUZQT1AxXzMgKCJlZnN1YmQiLAkweDA0NiwgInYsQixIIiksCitFRlBPUDFfMyAoImVmc3VicyIsCTB4MDQ1LCAiZSxmLGciKSwKK0VGUE9QMV8zICgiZWZkaXZkIiwJMHgwNGUsICJ2LEIsSCIpLAorRUZQT1AxXzMgKCJlZmRpdnMiLAkweDA0ZCwgImUsZixnIiksCitFRlBPUDFfMyAoImVmbXVsZCIsCTB4MDRhLCAidixCLEgiKSwKK0VGUE9QMV8zICgiZWZtdWxzIiwJMHgwNDksICJlLGYsZyIpLAorRUZQT1AxXzMgKCJlZnNtdWxkIiwJMHgwNjksICJlLGYsSCIpLAorRUZQT1AyXzIgKCJlZmNtcGQiLAkweDA1MiwgInYsQiIpLAorRUZQT1AyXzIgKCJlZmNtcGVkIiwJMHgwNTYsICJ2LEIiKSwKK0VGUE9QMl8yICgiZWZjbXBzIiwJMHgwNTEsICJlLGYiKSwKK0VGUE9QMl8yICgiZWZjbXBlcyIsCTB4MDU1LCAiZSxmIiksCisKKyN1bmRlZiBFRlBPUDFfMgorI3VuZGVmIEVGUE9QMV8zCisjdW5kZWYgRUZQT1AyXzIKKworLyogVGhlc2UgYXJlIG1hcmtlZCBGX0FMSUFTLCBzbyB0aGF0IHRoZXkgd29uJ3QgY29uZmxpY3Qgd2l0aCBzcGFyY2xpdGUgaW5zbnMKKyAgIHByZXNlbnQuICBPdGhlcndpc2UsIHRoZSBGX0FMSUFTIGZsYWcgaXMgaWdub3JlZC4gICovCit7ICJjcG9wMSIsCUYzKDIsIDB4MzYsIDApLCBGMyh+MiwgfjB4MzYsIH4xKSwgIlsxKzJdLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sCit7ICJjcG9wMiIsCUYzKDIsIDB4MzcsIDApLCBGMyh+MiwgfjB4MzcsIH4xKSwgIlsxKzJdLGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sCisKKy8qIHNwYXJjbGV0IHNwZWNpZmljIGluc25zICovCisKK0NPTU1VVEVPUCAoInVtYWMiLCAweDNlLCBzcGFyY2xldCksCitDT01NVVRFT1AgKCJzbWFjIiwgMHgzZiwgc3BhcmNsZXQpLAorQ09NTVVURU9QICgidW1hY2QiLCAweDJlLCBzcGFyY2xldCksCitDT01NVVRFT1AgKCJzbWFjZCIsIDB4MmYsIHNwYXJjbGV0KSwKK0NPTU1VVEVPUCAoInVtdWxkIiwgMHgwOSwgc3BhcmNsZXQpLAorQ09NTVVURU9QICgic211bGQiLCAweDBkLCBzcGFyY2xldCksCisKK3sgInNodWZmbGUiLAlGMygyLCAweDJkLCAwKSwgRjMofjIsIH4weDJkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsZXQgfSwKK3sgInNodWZmbGUiLAlGMygyLCAweDJkLCAxKSwgRjMofjIsIH4weDJkLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xldCB9LAorCisvKiBUaGUgbWFudWFsIGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUgb24gdGhlc2UgaW5zbnMuICBUaGUgYHJzMicgZmllbGQgaXMKKyAgIHRyZWF0ZWQgYXMgYmVpbmcgNiBiaXRzIHRvIGFjY291bnQgZm9yIDYgYml0IGltbWVkaWF0ZXMgdG8gY3B1c2guICBJdCBpcworICAgYXNzdW1lZCB0aGF0IGl0IGlzIGludGVuZGVkIHRoYXQgYml0IDUgaXMgMCB3aGVuIHJzMiBjb250YWlucyBhIHJlZy4gICovCisjZGVmaW5lIEJJVDUgKDE8PDUpCit7ICJjcmRjeHQiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoNCksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+NCl8QklUNXxSUzIofjApLAkiVSxkIiwgMCwgc3BhcmNsZXQgfSwKK3sgImN3cmN4dCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgzKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4zKXxCSVQ1fFJTMih+MCksCSIxLHUiLCAwLCBzcGFyY2xldCB9LAoreyAiY3B1c2giLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMCksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+MCl8QklUNXxSRCh+MCksCSIxLDIiLCAwLCBzcGFyY2xldCB9LAoreyAiY3B1c2giLAlGMygyLCAweDM2LCAxKXxTTENQT1AoMCksIEYzKH4yLCB+MHgzNiwgfjEpfFNMQ1BPUCh+MCl8UkQofjApLAkJIjEsWSIsIDAsIHNwYXJjbGV0IH0sCit7ICJjcHVzaGEiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMSksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+MSl8QklUNXxSRCh+MCksCSIxLDIiLCAwLCBzcGFyY2xldCB9LAoreyAiY3B1c2hhIiwJRjMoMiwgMHgzNiwgMSl8U0xDUE9QKDEpLCBGMyh+MiwgfjB4MzYsIH4xKXxTTENQT1AofjEpfFJEKH4wKSwJCSIxLFkiLCAwLCBzcGFyY2xldCB9LAoreyAiY3B1bGwiLAlGMygyLCAweDM2LCAwKXxTTENQT1AoMiksIEYzKH4yLCB+MHgzNiwgfjApfFNMQ1BPUCh+Mil8QklUNXxSUzEofjApfFJTMih+MCksICJkIiwgMCwgc3BhcmNsZXQgfSwKKyN1bmRlZiBCSVQ1CisKKy8qIHNwYXJjbGV0IGNvcHJvY2Vzc29yIGJyYW5jaCBpbnNucyAqLworI2RlZmluZSBTTENCQ0MyKG9wY29kZSwgbWFzaywgbG9zZSkgXAorIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBGX0RFTEFZRUR8Rl9DT05EQlIsIHNwYXJjbGV0IH0sIFwKKyB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgRl9ERUxBWUVEfEZfQ09OREJSLCBzcGFyY2xldCB9CisjZGVmaW5lIFNMQ0JDQyhvcGNvZGUsIG1hc2spIFwKKyAgU0xDQkNDMihvcGNvZGUsIEYyKDAsIDcpfENPTkQobWFzayksIEYyKH4wLCB+Nyl8Q09ORCh+KG1hc2spKSkKKworLyogY2JuLGNiYSBjYW4ndCBiZSBkZWZpbmVkIGhlcmUgYmVjYXVzZSB0aGV5J3JlIGRlZmluZWQgZWxzZXdoZXJlIGFuZCBHQVMKKyAgIHJlcXVpcmVzIGFsbCBtbmVtb25pY3Mgb2YgdGhlIHNhbWUgbmFtZSB0byBiZSBjb25zZWN1dGl2ZS4gICovCisvKlNMQ0JDQygiY2JuIiwgMCksIC0gYWxyZWFkeSBkZWZpbmVkICovCitTTENCQ0MoImNiZSIsIDEpLAorU0xDQkNDKCJjYmYiLCAyKSwKK1NMQ0JDQygiY2JlZiIsIDMpLAorU0xDQkNDKCJjYnIiLCA0KSwKK1NMQ0JDQygiY2JlciIsIDUpLAorU0xDQkNDKCJjYmZyIiwgNiksCitTTENCQ0MoImNiZWZyIiwgNyksCisvKlNMQ0JDQygiY2JhIiwgOCksIC0gYWxyZWFkeSBkZWZpbmVkICovCitTTENCQ0MoImNibmUiLCA5KSwKK1NMQ0JDQygiY2JuZiIsIDEwKSwKK1NMQ0JDQygiY2JuZWYiLCAxMSksCitTTENCQ0MoImNibnIiLCAxMiksCitTTENCQ0MoImNibmVyIiwgMTMpLAorU0xDQkNDKCJjYm5mciIsIDE0KSwKK1NMQ0JDQygiY2JuZWZyIiwgMTUpLAorCisjdW5kZWYgU0xDQkNDMgorI3VuZGVmIFNMQ0JDQworCit7ICJjYXNhIiwJRjMoMywgMHgzYywgMCksIEYzKH4zLCB+MHgzYywgfjApLCAiWzFdQSwyLGQiLCAwLCB2OSB9LAoreyAiY2FzYSIsCUYzKDMsIDB4M2MsIDEpLCBGMyh+MywgfjB4M2MsIH4xKSwgIlsxXW8sMixkIiwgMCwgdjkgfSwKK3sgImNhc3hhIiwJRjMoMywgMHgzZSwgMCksIEYzKH4zLCB+MHgzZSwgfjApLCAiWzFdQSwyLGQiLCAwLCB2OSB9LAoreyAiY2FzeGEiLAlGMygzLCAweDNlLCAxKSwgRjMofjMsIH4weDNlLCB+MSksICJbMV1vLDIsZCIsIDAsIHY5IH0sCisKKy8qIHY5IHN5bnRoZXRpYyBpbnNucyAqLworLyogRklYTUU6IHN0aWxsIG1pc3NpbmcgInNpZ254IGQiLCBhbmQgImNscnV3IGQiLiAgQ2FuJ3QgYmUgZG9uZSBoZXJlLiAgKi8KK3sgImlwcmVmZXRjaCIsCUYyKDAsIDEpfCgyPDwyMCl8QlBSRUQsIEYyKH4wLCB+MSl8KDE8PDIwKXxBTk5VTHxDT05EKH4wKSwgIkciLCAwLCB2OSB9LCAvKiBibixhLHB0ICV4Y2MsbGFiZWwgKi8KK3sgInNpZ254IiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICIxLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBzcmEgcnMxLCVnMCxyZCAqLworeyAiY2xydXciLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgIjEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIHNybCByczEsJWcwLHJkICovCit7ICJjYXMiLAlGMygzLCAweDNjLCAwKXxBU0koMHg4MCksIEYzKH4zLCB+MHgzYywgfjApfEFTSSh+MHg4MCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzYSBbcnMxXUFTSV9QLHJzMixyZCAqLworeyAiY2FzbCIsCUYzKDMsIDB4M2MsIDApfEFTSSgweDg4KSwgRjMofjMsIH4weDNjLCB+MCl8QVNJKH4weDg4KSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXNhIFtyczFdQVNJX1BfTCxyczIscmQgKi8KK3sgImNhc3giLAlGMygzLCAweDNlLCAwKXxBU0koMHg4MCksIEYzKH4zLCB+MHgzZSwgfjApfEFTSSh+MHg4MCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzeGEgW3JzMV1BU0lfUCxyczIscmQgKi8KK3sgImNhc3hsIiwJRjMoMywgMHgzZSwgMCl8QVNJKDB4ODgpLCBGMyh+MywgfjB4M2UsIH4wKXxBU0kofjB4ODgpLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc3hhIFtyczFdQVNJX1BfTCxyczIscmQgKi8KKworLyogVWx0cmFzcGFyYyBleHRlbnNpb25zICovCit7ICJzaHV0ZG93biIsCUYzRigyLCAweDM2LCAweDA4MCksIEYzRih+MiwgfjB4MzYsIH4weDA4MCl8UkRfRzB8UlMxX0cwfFJTMl9HMCwgIiIsIDAsIHY5YSB9LAorCisvKiBGSVhNRTogRG8gd2Ugd2FudCB0byBtYXJrIHRoZXNlIGFzIEZfRkxPQVQsIG9yIHNvbWV0aGluZyBzaW1pbGFyPyAgKi8KK3sgImZwYWRkMTYiLAlGM0YoMiwgMHgzNiwgMHgwNTApLCBGM0YofjIsIH4weDM2LCB+MHgwNTApLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZwYWRkMTZzIiwJRjNGKDIsIDB4MzYsIDB4MDUxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUxKSwgImUsZixnIiwgMCwgdjlhIH0sCit7ICJmcGFkZDMyIiwJRjNGKDIsIDB4MzYsIDB4MDUyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUyKSwgInYsQixIIiwgMCwgdjlhIH0sCit7ICJmcGFkZDMycyIsCUYzRigyLCAweDM2LCAweDA1MyksIEYzRih+MiwgfjB4MzYsIH4weDA1MyksICJlLGYsZyIsIDAsIHY5YSB9LAoreyAiZnBzdWIxNiIsCUYzRigyLCAweDM2LCAweDA1NCksIEYzRih+MiwgfjB4MzYsIH4weDA1NCksICJ2LEIsSCIsIDAsIHY5YSB9LAoreyAiZnBzdWIxNnMiLAlGM0YoMiwgMHgzNiwgMHgwNTUpLCBGM0YofjIsIH4weDM2LCB+MHgwNTUpLCAiZSxmLGciLCAwLCB2OWEgfSwKK3sgImZwc3ViMzIiLAlGM0YoMiwgMHgzNiwgMHgwNTYpLCBGM0YofjIsIH4weDM2LCB+MHgwNTYpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZwc3ViMzJzIiwJRjNGKDIsIDB4MzYsIDB4MDU3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU3KSwgImUsZixnIiwgMCwgdjlhIH0sCisKK3sgImZwYWNrMzIiLAlGM0YoMiwgMHgzNiwgMHgwM2EpLCBGM0YofjIsIH4weDM2LCB+MHgwM2EpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZwYWNrMTYiLAlGM0YoMiwgMHgzNiwgMHgwM2IpLCBGM0YofjIsIH4weDM2LCB+MHgwM2IpfFJTMV9HMCwgIkIsZyIsIDAsIHY5YSB9LAoreyAiZnBhY2tmaXgiLAlGM0YoMiwgMHgzNiwgMHgwM2QpLCBGM0YofjIsIH4weDM2LCB+MHgwM2QpfFJTMV9HMCwgIkIsZyIsIDAsIHY5YSB9LAoreyAiZmV4cGFuZCIsCUYzRigyLCAweDM2LCAweDA0ZCksIEYzRih+MiwgfjB4MzYsIH4weDA0ZCl8UlMxX0cwLCAiZixIIiwgMCwgdjlhIH0sCit7ICJmcG1lcmdlIiwJRjNGKDIsIDB4MzYsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDRiKSwgImUsZixIIiwgMCwgdjlhIH0sCisKKy8qIE5vdGUgdGhhdCB0aGUgbWl4aW5nIG9mIDMyLzY0IGJpdCByZWdzIGlzIGludGVudGlvbmFsLiAgKi8KK3sgImZtdWw4eDE2IiwJCUYzRigyLCAweDM2LCAweDAzMSksIEYzRih+MiwgfjB4MzYsIH4weDAzMSksICJlLEIsSCIsIDAsIHY5YSB9LAoreyAiZm11bDh4MTZhdSIsCQlGM0YoMiwgMHgzNiwgMHgwMzMpLCBGM0YofjIsIH4weDM2LCB+MHgwMzMpLCAiZSxmLEgiLCAwLCB2OWEgfSwKK3sgImZtdWw4eDE2YWwiLAkJRjNGKDIsIDB4MzYsIDB4MDM1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM1KSwgImUsZixIIiwgMCwgdjlhIH0sCit7ICJmbXVsOHN1eDE2IiwJCUYzRigyLCAweDM2LCAweDAzNiksIEYzRih+MiwgfjB4MzYsIH4weDAzNiksICJ2LEIsSCIsIDAsIHY5YSB9LAoreyAiZm11bDh1bHgxNiIsCQlGM0YoMiwgMHgzNiwgMHgwMzcpLCBGM0YofjIsIH4weDM2LCB+MHgwMzcpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZtdWxkOHN1eDE2IiwJRjNGKDIsIDB4MzYsIDB4MDM4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM4KSwgImUsZixIIiwgMCwgdjlhIH0sCit7ICJmbXVsZDh1bHgxNiIsCUYzRigyLCAweDM2LCAweDAzOSksIEYzRih+MiwgfjB4MzYsIH4weDAzOSksICJlLGYsSCIsIDAsIHY5YSB9LAorCit7ICJhbGlnbmFkZHIiLAlGM0YoMiwgMHgzNiwgMHgwMTgpLCBGM0YofjIsIH4weDM2LCB+MHgwMTgpLCAiMSwyLGQiLCAwLCB2OWEgfSwKK3sgImFsaWduYWRkcmwiLAlGM0YoMiwgMHgzNiwgMHgwMWEpLCBGM0YofjIsIH4weDM2LCB+MHgwMWEpLCAiMSwyLGQiLCAwLCB2OWEgfSwKK3sgImZhbGlnbmRhdGEiLAlGM0YoMiwgMHgzNiwgMHgwNDgpLCBGM0YofjIsIH4weDM2LCB+MHgwNDgpLCAidixCLEgiLCAwLCB2OWEgfSwKKworeyAiZnplcm8iLAlGM0YoMiwgMHgzNiwgMHgwNjApLCBGM0YofjIsIH4weDM2LCB+MHgwNjApLCAiSCIsIDAsIHY5YSB9LAoreyAiZnplcm9zIiwJRjNGKDIsIDB4MzYsIDB4MDYxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYxKSwgImciLCAwLCB2OWEgfSwKK3sgImZvbmUiLAlGM0YoMiwgMHgzNiwgMHgwN2UpLCBGM0YofjIsIH4weDM2LCB+MHgwN2UpLCAiSCIsIDAsIHY5YSB9LAoreyAiZm9uZXMiLAlGM0YoMiwgMHgzNiwgMHgwN2YpLCBGM0YofjIsIH4weDM2LCB+MHgwN2YpLCAiZyIsIDAsIHY5YSB9LAoreyAiZnNyYzEiLAlGM0YoMiwgMHgzNiwgMHgwNzQpLCBGM0YofjIsIH4weDM2LCB+MHgwNzQpLCAidixIIiwgMCwgdjlhIH0sCit7ICJmc3JjMXMiLAlGM0YoMiwgMHgzNiwgMHgwNzUpLCBGM0YofjIsIH4weDM2LCB+MHgwNzUpLCAiZSxnIiwgMCwgdjlhIH0sCit7ICJmc3JjMiIsCUYzRigyLCAweDM2LCAweDA3OCksIEYzRih+MiwgfjB4MzYsIH4weDA3OCksICJCLEgiLCAwLCB2OWEgfSwKK3sgImZzcmMycyIsCUYzRigyLCAweDM2LCAweDA3OSksIEYzRih+MiwgfjB4MzYsIH4weDA3OSksICJmLGciLCAwLCB2OWEgfSwKK3sgImZub3QxIiwJRjNGKDIsIDB4MzYsIDB4MDZhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZhKSwgInYsSCIsIDAsIHY5YSB9LAoreyAiZm5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDZiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZiKSwgImUsZyIsIDAsIHY5YSB9LAoreyAiZm5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNjYpLCBGM0YofjIsIH4weDM2LCB+MHgwNjYpLCAiQixIIiwgMCwgdjlhIH0sCit7ICJmbm90MnMiLAlGM0YoMiwgMHgzNiwgMHgwNjcpLCBGM0YofjIsIH4weDM2LCB+MHgwNjcpLCAiZixnIiwgMCwgdjlhIH0sCit7ICJmb3IiLAlGM0YoMiwgMHgzNiwgMHgwN2MpLCBGM0YofjIsIH4weDM2LCB+MHgwN2MpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZvcnMiLAlGM0YoMiwgMHgzNiwgMHgwN2QpLCBGM0YofjIsIH4weDM2LCB+MHgwN2QpLCAiZSxmLGciLCAwLCB2OWEgfSwKK3sgImZub3IiLAlGM0YoMiwgMHgzNiwgMHgwNjIpLCBGM0YofjIsIH4weDM2LCB+MHgwNjIpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZub3JzIiwJRjNGKDIsIDB4MzYsIDB4MDYzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDYzKSwgImUsZixnIiwgMCwgdjlhIH0sCit7ICJmYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDcwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcwKSwgInYsQixIIiwgMCwgdjlhIH0sCit7ICJmYW5kcyIsCUYzRigyLCAweDM2LCAweDA3MSksIEYzRih+MiwgfjB4MzYsIH4weDA3MSksICJlLGYsZyIsIDAsIHY5YSB9LAoreyAiZm5hbmQiLAlGM0YoMiwgMHgzNiwgMHgwNmUpLCBGM0YofjIsIH4weDM2LCB+MHgwNmUpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZuYW5kcyIsCUYzRigyLCAweDM2LCAweDA2ZiksIEYzRih+MiwgfjB4MzYsIH4weDA2ZiksICJlLGYsZyIsIDAsIHY5YSB9LAoreyAiZnhvciIsCUYzRigyLCAweDM2LCAweDA2YyksIEYzRih+MiwgfjB4MzYsIH4weDA2YyksICJ2LEIsSCIsIDAsIHY5YSB9LAoreyAiZnhvcnMiLAlGM0YoMiwgMHgzNiwgMHgwNmQpLCBGM0YofjIsIH4weDM2LCB+MHgwNmQpLCAiZSxmLGciLCAwLCB2OWEgfSwKK3sgImZ4bm9yIiwJRjNGKDIsIDB4MzYsIDB4MDcyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcyKSwgInYsQixIIiwgMCwgdjlhIH0sCit7ICJmeG5vcnMiLAlGM0YoMiwgMHgzNiwgMHgwNzMpLCBGM0YofjIsIH4weDM2LCB+MHgwNzMpLCAiZSxmLGciLCAwLCB2OWEgfSwKK3sgImZvcm5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwN2EpLCBGM0YofjIsIH4weDM2LCB+MHgwN2EpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZvcm5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDdiKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDdiKSwgImUsZixnIiwgMCwgdjlhIH0sCit7ICJmb3Jub3QyIiwJRjNGKDIsIDB4MzYsIDB4MDc2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc2KSwgInYsQixIIiwgMCwgdjlhIH0sCit7ICJmb3Jub3QycyIsCUYzRigyLCAweDM2LCAweDA3NyksIEYzRih+MiwgfjB4MzYsIH4weDA3NyksICJlLGYsZyIsIDAsIHY5YSB9LAoreyAiZmFuZG5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwNjgpLCBGM0YofjIsIH4weDM2LCB+MHgwNjgpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZhbmRub3QxcyIsCUYzRigyLCAweDM2LCAweDA2OSksIEYzRih+MiwgfjB4MzYsIH4weDA2OSksICJlLGYsZyIsIDAsIHY5YSB9LAoreyAiZmFuZG5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNjQpLCBGM0YofjIsIH4weDM2LCB+MHgwNjQpLCAidixCLEgiLCAwLCB2OWEgfSwKK3sgImZhbmRub3QycyIsCUYzRigyLCAweDM2LCAweDA2NSksIEYzRih+MiwgfjB4MzYsIH4weDA2NSksICJlLGYsZyIsIDAsIHY5YSB9LAorCit7ICJmY21wZ3QxNiIsCUYzRigyLCAweDM2LCAweDAyOCksIEYzRih+MiwgfjB4MzYsIH4weDAyOCksICJ2LEIsZCIsIDAsIHY5YSB9LAoreyAiZmNtcGd0MzIiLAlGM0YoMiwgMHgzNiwgMHgwMmMpLCBGM0YofjIsIH4weDM2LCB+MHgwMmMpLCAidixCLGQiLCAwLCB2OWEgfSwKK3sgImZjbXBsZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDIwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDIwKSwgInYsQixkIiwgMCwgdjlhIH0sCit7ICJmY21wbGUzMiIsCUYzRigyLCAweDM2LCAweDAyNCksIEYzRih+MiwgfjB4MzYsIH4weDAyNCksICJ2LEIsZCIsIDAsIHY5YSB9LAoreyAiZmNtcG5lMTYiLAlGM0YoMiwgMHgzNiwgMHgwMjIpLCBGM0YofjIsIH4weDM2LCB+MHgwMjIpLCAidixCLGQiLCAwLCB2OWEgfSwKK3sgImZjbXBuZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDI2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI2KSwgInYsQixkIiwgMCwgdjlhIH0sCit7ICJmY21wZXExNiIsCUYzRigyLCAweDM2LCAweDAyYSksIEYzRih+MiwgfjB4MzYsIH4weDAyYSksICJ2LEIsZCIsIDAsIHY5YSB9LAoreyAiZmNtcGVxMzIiLAlGM0YoMiwgMHgzNiwgMHgwMmUpLCBGM0YofjIsIH4weDM2LCB+MHgwMmUpLCAidixCLGQiLCAwLCB2OWEgfSwKKworeyAiZWRnZTgiLAlGM0YoMiwgMHgzNiwgMHgwMDApLCBGM0YofjIsIH4weDM2LCB+MHgwMDApLCAiMSwyLGQiLCAwLCB2OWEgfSwKK3sgImVkZ2U4bCIsCUYzRigyLCAweDM2LCAweDAwMiksIEYzRih+MiwgfjB4MzYsIH4weDAwMiksICIxLDIsZCIsIDAsIHY5YSB9LAoreyAiZWRnZTE2IiwJRjNGKDIsIDB4MzYsIDB4MDA0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA0KSwgIjEsMixkIiwgMCwgdjlhIH0sCit7ICJlZGdlMTZsIiwJRjNGKDIsIDB4MzYsIDB4MDA2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDA2KSwgIjEsMixkIiwgMCwgdjlhIH0sCit7ICJlZGdlMzIiLAlGM0YoMiwgMHgzNiwgMHgwMDgpLCBGM0YofjIsIH4weDM2LCB+MHgwMDgpLCAiMSwyLGQiLCAwLCB2OWEgfSwKK3sgImVkZ2UzMmwiLAlGM0YoMiwgMHgzNiwgMHgwMGEpLCBGM0YofjIsIH4weDM2LCB+MHgwMGEpLCAiMSwyLGQiLCAwLCB2OWEgfSwKKworeyAicGRpc3QiLAlGM0YoMiwgMHgzNiwgMHgwM2UpLCBGM0YofjIsIH4weDM2LCB+MHgwM2UpLCAidixCLEgiLCAwLCB2OWEgfSwKKworeyAiYXJyYXk4IiwJRjNGKDIsIDB4MzYsIDB4MDEwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDEwKSwgIjEsMixkIiwgMCwgdjlhIH0sCit7ICJhcnJheTE2IiwJRjNGKDIsIDB4MzYsIDB4MDEyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDEyKSwgIjEsMixkIiwgMCwgdjlhIH0sCit7ICJhcnJheTMyIiwJRjNGKDIsIDB4MzYsIDB4MDE0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDE0KSwgIjEsMixkIiwgMCwgdjlhIH0sCisKKy8qIE1vcmUgdjkgc3BlY2lmaWMgaW5zbnMsIHRoZXNlIG5lZWQgdG8gY29tZSBsYXN0IHNvIHRoZXkgZG8gbm90IGNsYXNoCisgICB3aXRoIHY5YSBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZWRnZTgiIHdoaWNoIGxvb2tzIGxpa2UgaW1wZGVwMS4gKi8KKworI2RlZmluZSBJTVBERVAobmFtZSwgY29kZSkgXAoreyBuYW1lLAlGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCl8QVNJKH4wKSwgIjEsMixkIiwgMCwgdjlub3R2OWEgfSwgXAoreyBuYW1lLAlGMygyLCBjb2RlLCAxKSwgRjMofjIsIH5jb2RlLCB+MSksCSAgICIxLGksZCIsIDAsIHY5bm90djlhIH0sIFwKK3sgbmFtZSwgRjMoMiwgY29kZSwgMCksIEYzKH4yLCB+Y29kZSwgfjApLCAgICAgICAgICJ4LDEsMixkIiwgMCwgdjlub3R2OWEgfSwgXAoreyBuYW1lLCBGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCksICAgICAgICAgIngsZSxmLGciLCAwLCB2OW5vdHY5YSB9CisKK0lNUERFUCAoImltcGRlcDEiLCAweDM2KSwKK0lNUERFUCAoImltcGRlcDIiLCAweDM3KSwKKworI3VuZGVmIElNUERFUAorCit9OworCitjb25zdCBpbnQgc3BhcmNfbnVtX29wY29kZXMgPSAoKHNpemVvZiBzcGFyY19vcGNvZGVzKS8oc2l6ZW9mIHNwYXJjX29wY29kZXNbMF0pKTsKKwwKKy8qIFV0aWxpdGllcyBmb3IgYXJndW1lbnQgcGFyc2luZy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCB2YWx1ZTsKKyAgY29uc3QgY2hhciAqbmFtZTsKK30gYXJnOworCisvKiBMb29rIHVwIE5BTUUgaW4gVEFCTEUuICAqLworCitzdGF0aWMgaW50IGxvb2t1cF9uYW1lIFBBUkFNUyAoKGNvbnN0IGFyZyAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBjb25zdCBjaGFyICpsb29rdXBfdmFsdWUgUEFSQU1TICgoY29uc3QgYXJnICosIGludCkpOworCitzdGF0aWMgaW50Citsb29rdXBfbmFtZSAodGFibGUsIG5hbWUpCisgICAgIGNvbnN0IGFyZyAqdGFibGU7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGNvbnN0IGFyZyAqcDsKKworICBmb3IgKHAgPSB0YWJsZTsgcC0+bmFtZTsgKytwKQorICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCisgICAgICByZXR1cm4gcC0+dmFsdWU7CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBMb29rIHVwIFZBTFVFIGluIFRBQkxFLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorbG9va3VwX3ZhbHVlICh0YWJsZSwgdmFsdWUpCisgICAgIGNvbnN0IGFyZyAqdGFibGU7CisgICAgIGludCB2YWx1ZTsKK3sKKyAgY29uc3QgYXJnICpwOworCisgIGZvciAocCA9IHRhYmxlOyBwLT5uYW1lOyArK3ApCisgICAgaWYgKHZhbHVlID09IHAtPnZhbHVlKQorICAgICAgcmV0dXJuIHAtPm5hbWU7CisKKyAgcmV0dXJuIChjaGFyICopIDA7Cit9CisMCisvKiBIYW5kbGUgQVNJJ3MuICAqLworCitzdGF0aWMgYXJnIGFzaV90YWJsZVtdID0KK3sKKyAgLyogVGhlc2UgYXJlIGluIHRoZSB2OSBhcmNoaXRlY3R1cmUgbWFudWFsLiAgKi8KKyAgLyogVGhlIHNob3J0ZXIgdmVyc2lvbnMgYXBwZWFyIGZpcnN0LCB0aGV5J3JlIGhlcmUgYmVjYXVzZSBTdW4ncyBhcyBoYXMgdGhlbS4KKyAgICAgU3VuJ3MgYXMgdXNlcyAjQVNJX1BfTCBpbnN0ZWFkIG9mICNBU0lfUEwgKHdoaWNoIGFwcGVhcnMgaW4gdGhlCisgICAgIFVsdHJhU1BBUkMgYXJjaGl0ZWN0dXJlIG1hbnVhbCkuICAqLworICB7IDB4MDQsICIjQVNJX04iIH0sCisgIHsgMHgwYywgIiNBU0lfTl9MIiB9LAorICB7IDB4MTAsICIjQVNJX0FJVVAiIH0sCisgIHsgMHgxMSwgIiNBU0lfQUlVUyIgfSwKKyAgeyAweDE4LCAiI0FTSV9BSVVQX0wiIH0sCisgIHsgMHgxOSwgIiNBU0lfQUlVU19MIiB9LAorICB7IDB4ODAsICIjQVNJX1AiIH0sCisgIHsgMHg4MSwgIiNBU0lfUyIgfSwKKyAgeyAweDgyLCAiI0FTSV9QTkYiIH0sCisgIHsgMHg4MywgIiNBU0lfU05GIiB9LAorICB7IDB4ODgsICIjQVNJX1BfTCIgfSwKKyAgeyAweDg5LCAiI0FTSV9TX0wiIH0sCisgIHsgMHg4YSwgIiNBU0lfUE5GX0wiIH0sCisgIHsgMHg4YiwgIiNBU0lfU05GX0wiIH0sCisgIHsgMHgwNCwgIiNBU0lfTlVDTEVVUyIgfSwKKyAgeyAweDBjLCAiI0FTSV9OVUNMRVVTX0xJVFRMRSIgfSwKKyAgeyAweDEwLCAiI0FTSV9BU19JRl9VU0VSX1BSSU1BUlkiIH0sCisgIHsgMHgxMSwgIiNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlkiIH0sCisgIHsgMHgxOCwgIiNBU0lfQVNfSUZfVVNFUl9QUklNQVJZX0xJVFRMRSIgfSwKKyAgeyAweDE5LCAiI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWV9MSVRUTEUiIH0sCisgIHsgMHg4MCwgIiNBU0lfUFJJTUFSWSIgfSwKKyAgeyAweDgxLCAiI0FTSV9TRUNPTkRBUlkiIH0sCisgIHsgMHg4MiwgIiNBU0lfUFJJTUFSWV9OT0ZBVUxUIiB9LAorICB7IDB4ODMsICIjQVNJX1NFQ09OREFSWV9OT0ZBVUxUIiB9LAorICB7IDB4ODgsICIjQVNJX1BSSU1BUllfTElUVExFIiB9LAorICB7IDB4ODksICIjQVNJX1NFQ09OREFSWV9MSVRUTEUiIH0sCisgIHsgMHg4YSwgIiNBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSIgfSwKKyAgeyAweDhiLCAiI0FTSV9TRUNPTkRBUllfTk9GQVVMVF9MSVRUTEUiIH0sCisgIC8qIFRoZXNlIGFyZSBVbHRyYVNQQVJDIGV4dGVuc2lvbnMuICAqLworICAvKiBGSVhNRTogVGhlcmUgYXJlIGRvemVucyBvZiB0aGVtLiAgTm90IHN1cmUgd2Ugd2FudCB0aGVtIGFsbC4KKyAgICAgTW9zdCBhcmUgZm9yIGtlcm5lbCBidWlsZGluZyBidXQgc29tZSBhcmUgZm9yIHZpcyB0eXBlIHN0dWZmLiAgKi8KKyAgeyAwLCAwIH0KK307CisKKy8qIFJldHVybiB0aGUgdmFsdWUgZm9yIEFTSSBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLworCitpbnQKK3NwYXJjX2VuY29kZV9hc2kgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiBsb29rdXBfbmFtZSAoYXNpX3RhYmxlLCBuYW1lKTsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIGZvciBBU0kgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLworCitjb25zdCBjaGFyICoKK3NwYXJjX2RlY29kZV9hc2kgKHZhbHVlKQorICAgICBpbnQgdmFsdWU7Cit7CisgIHJldHVybiBsb29rdXBfdmFsdWUgKGFzaV90YWJsZSwgdmFsdWUpOworfQorDAorLyogSGFuZGxlIG1lbWJhciBtYXNrcy4gICovCisKK3N0YXRpYyBhcmcgbWVtYmFyX3RhYmxlW10gPQoreworICB7IDB4NDAsICIjU3luYyIgfSwKKyAgeyAweDIwLCAiI01lbUlzc3VlIiB9LAorICB7IDB4MTAsICIjTG9va2FzaWRlIiB9LAorICB7IDB4MDgsICIjU3RvcmVTdG9yZSIgfSwKKyAgeyAweDA0LCAiI0xvYWRTdG9yZSIgfSwKKyAgeyAweDAyLCAiI1N0b3JlTG9hZCIgfSwKKyAgeyAweDAxLCAiI0xvYWRMb2FkIiB9LAorICB7IDAsIDAgfQorfTsKKworLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgbWVtYmFyIGFyZyBOQU1FLCBvciAtMSBpZiBub3QgZm91bmQuICAqLworCitpbnQKK3NwYXJjX2VuY29kZV9tZW1iYXIgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHJldHVybiBsb29rdXBfbmFtZSAobWVtYmFyX3RhYmxlLCBuYW1lKTsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIGZvciBtZW1iYXIgdmFsdWUgVkFMVUUgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLworCitjb25zdCBjaGFyICoKK3NwYXJjX2RlY29kZV9tZW1iYXIgKHZhbHVlKQorICAgICBpbnQgdmFsdWU7Cit7CisgIHJldHVybiBsb29rdXBfdmFsdWUgKG1lbWJhcl90YWJsZSwgdmFsdWUpOworfQorDAorLyogSGFuZGxlIHByZWZldGNoIGFyZ3MuICAqLworCitzdGF0aWMgYXJnIHByZWZldGNoX3RhYmxlW10gPQoreworICB7IDAsICIjbl9yZWFkcyIgfSwKKyAgeyAxLCAiI29uZV9yZWFkIiB9LAorICB7IDIsICIjbl93cml0ZXMiIH0sCisgIHsgMywgIiNvbmVfd3JpdGUiIH0sCisgIHsgNCwgIiNwYWdlIiB9LAorICB7IDAsIDAgfQorfTsKKworLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgcHJlZmV0Y2ggYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCisKK2ludAorc3BhcmNfZW5jb2RlX3ByZWZldGNoIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZXR1cm4gbG9va3VwX25hbWUgKHByZWZldGNoX3RhYmxlLCBuYW1lKTsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIGZvciBwcmVmZXRjaCB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCisKK2NvbnN0IGNoYXIgKgorc3BhcmNfZGVjb2RlX3ByZWZldGNoICh2YWx1ZSkKKyAgICAgaW50IHZhbHVlOworeworICByZXR1cm4gbG9va3VwX3ZhbHVlIChwcmVmZXRjaF90YWJsZSwgdmFsdWUpOworfQorDAorLyogSGFuZGxlIHNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4gICovCisKK3N0YXRpYyBhcmcgc3BhcmNsZXRfY3ByZWdfdGFibGVbXSA9Cit7CisgIHsgMCwgIiVjY3NyIiB9LAorICB7IDEsICIlY2NmciIgfSwKKyAgeyAyLCAiJWNjY3JjciIgfSwKKyAgeyAzLCAiJWNjcHIiIH0sCisgIHsgNCwgIiVjY3NyMiIgfSwKKyAgeyA1LCAiJWNjY3JyIiB9LAorICB7IDYsICIlY2Nyc3RyIiB9LAorICB7IDAsIDAgfQorfTsKKworLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3Igc3BhcmNsZXQgY3ByZWcgYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCisKK2ludAorc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZXR1cm4gbG9va3VwX25hbWUgKHNwYXJjbGV0X2NwcmVnX3RhYmxlLCBuYW1lKTsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIGZvciBzcGFyY2xldCBjcHJlZyB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCisKK2NvbnN0IGNoYXIgKgorc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnICh2YWx1ZSkKKyAgICAgaW50IHZhbHVlOworeworICByZXR1cm4gbG9va3VwX3ZhbHVlIChzcGFyY2xldF9jcHJlZ190YWJsZSwgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zdGFtcC1oLmluIGIvb3Bjb2Rlcy9zdGFtcC1oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODhmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3N0YW1wLWguaW4KQEAgLTAsMCArMSBAQAordGltZXN0YW1wCmRpZmYgLS1naXQgYS9vcGNvZGVzL3N5c2RlcC5oIGIvb3Bjb2Rlcy9zeXNkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjIzZTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy9zeXNkZXAuaApAQCAtMCwwICsxLDQyIEBACisvKiBSYW5kb20gaG9zdC1kZXBlbmRlbnQgc3VwcG9ydCBjb2RlLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlib3Bjb2RlcywgdGhlIG9wY29kZXMgbGlicmFyeS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRG8gc3lzdGVtLWRlcGVuZGVudCBzdHVmZiwgbWFpbmx5IGRyaXZlbiBieSBhdXRvY29uZi1kZXRlY3RlZCBpbmZvLgorCisgICBXZWxsLCBzb21lIGdlbmVyaWMgY29tbW9uIHN0dWZmIGlzIGRvbmUgaGVyZSB0b28sIGxpa2UgaW5jbHVkaW5nCisgICBhbnNpZGVjbC5oLiAgVGhhdCdzIGJlY2F1c2UgdGhlIC5oIGZpbGVzIGluIGJmZC9ob3N0cyBmaWxlcyBJJ20KKyAgIHRyeWluZyB0byByZXBsYWNlIG9mdGVuIGRpZCB0aGF0LiAgSWYgaXQgY2FuIGJlIGRyb3BwZWQgZnJvbSB0aGlzCisgICBmaWxlIChjaGVjayBpbiBhIG5vbi1BTlNJIGVudmlyb25tZW50ISksIGl0IHNob3VsZCBiZS4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWMzMC1kaXMuYyBiL29wY29kZXMvdGljMzAtZGlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1MTQ1NwotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvdGljMzAtZGlzLmMKQEAgLTAsMCArMSw3MTEgQEAKKy8qIERpc2Fzc2VtYmx5IHJvdXRpbmVzIGZvciBUTVMzMjBDMzAgYXJjaGl0ZWN0dXJlCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJvcGNvZGUvdGljMzAuaCIKKworI2RlZmluZSBOT1JNQUxfSU5TTiAgIDEKKyNkZWZpbmUgUEFSQUxMRUxfSU5TTiAyCisKKy8qIEdldHMgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIHRvcCAyIG9yIDMgYml0cyBvZiB0aGUKKyAgIGluc3RydWN0aW9uIHdvcmQuICovCisjZGVmaW5lIEdFVF9UWVBFKGluc24pIChpbnNuICYgMHg4MDAwMDAwMCA/IGluc24gJiAweEMwMDAwMDAwIDogaW5zbiAmIDB4RTAwMDAwMDApCisKKy8qIEluc3RydWN0aW9uIHR5cGVzLiAqLworI2RlZmluZSBUV09fT1BFUkFORF8xIDB4MDAwMDAwMDAKKyNkZWZpbmUgVFdPX09QRVJBTkRfMiAweDQwMDAwMDAwCisjZGVmaW5lIFRIUkVFX09QRVJBTkQgMHgyMDAwMDAwMAorI2RlZmluZSBQQVJfU1RPUkUgICAgIDB4QzAwMDAwMDAKKyNkZWZpbmUgTVVMX0FERFMgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEJSQU5DSEVTICAgICAgMHg2MDAwMDAwMAorCisvKiBTcGVjaWZpYyBpbnN0cnVjdGlvbiBpZCBiaXRzLiAqLworI2RlZmluZSBOT1JNQUxfSURFTiAgICAweDFGODAwMDAwCisjZGVmaW5lIFBBUl9TVE9SRV9JREVOIDB4M0UwMDAwMDAKKyNkZWZpbmUgTVVMX0FERF9JREVOICAgMHgyQzAwMDAwMAorI2RlZmluZSBCUl9JTU1fSURFTiAgICAweDFGMDAwMDAwCisjZGVmaW5lIEJSX0NPTkRfSURFTiAgIDB4MUMzRjAwMDAKKworLyogQWRkcmVzc2luZyBtb2Rlcy4gKi8KKyNkZWZpbmUgQU1fUkVHSVNURVIgMHgwMDAwMDAwMAorI2RlZmluZSBBTV9ESVJFQ1QgICAweDAwMjAwMDAwCisjZGVmaW5lIEFNX0lORElSRUNUIDB4MDA0MDAwMDAKKyNkZWZpbmUgQU1fSU1NICAgICAgMHgwMDYwMDAwMAorCisjZGVmaW5lIFBfRklFTEQgMHgwMzAwMDAwMAorCisjZGVmaW5lIFJFR19BUjAgMHgwOAorI2RlZmluZSBMRFBfSU5TTiAweDA4NzAwMDAwCisKKy8qIFRNUzMyMEMzMCBwcm9ncmFtIGNvdW50ZXIgZm9yIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9wYzsKKworc3RydWN0IGluc3RydWN0aW9uCisgIHsKKyAgICBpbnQgdHlwZTsKKyAgICB0ZW1wbGF0ZSAqdG07CisgICAgcGFydGVtcGxhdGUgKnB0bTsKKyAgfTsKKworaW50IGdldF90aWMzMF9pbnN0cnVjdGlvbiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOworaW50IHByaW50X3R3b19vcGVyYW5kCisgIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKK2ludCBwcmludF90aHJlZV9vcGVyYW5kCisgIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKK2ludCBwcmludF9wYXJfaW5zbgorICBQQVJBTVMgKChkaXNhc3NlbWJsZV9pbmZvICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7CitpbnQgcHJpbnRfYnJhbmNoCisgIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKK2ludCBnZXRfaW5kaXJlY3Rfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBzaG9ydCwgaW50LCBjaGFyICopKTsKK2ludCBnZXRfcmVnaXN0ZXJfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyLCBjaGFyICopKTsKK2ludCBjbnZ0X3Rtc2Zsb2F0X2llZWUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50LCBmbG9hdCAqKSk7CisKK2ludAorcHJpbnRfaW5zbl90aWMzMCAocGMsIGluZm8pCisgICAgIGJmZF92bWEgcGM7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOworICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gaW5zbiA9CisgIHswLCBOVUxMLCBOVUxMfTsKKyAgYmZkX3ZtYSBidWZhZGRyID0gcGMgLSBpbmZvLT5idWZmZXJfdm1hOworICAvKiBPYnRhaW4gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd29yZCBmcm9tIHRoZSBidWZmZXIuICovCisgIGluc25fd29yZCA9ICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIpIDw8IDI0KSB8ICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAxKSA8PCAxNikgfAorICAgICgqKGluZm8tPmJ1ZmZlciArIGJ1ZmFkZHIgKyAyKSA8PCA4KSB8ICooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDMpOworICBfcGMgPSBwYyAvIDQ7CisgIC8qIEdldCB0aGUgaW5zdHJ1Y3Rpb24gcmVmZXJlZCB0byBieSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB3b3JkCisgICAgIGFuZCBwcmludCBpdCBvdXQgYmFzZWQgb24gaXRzIHR5cGUuICovCisgIGlmICghZ2V0X3RpYzMwX2luc3RydWN0aW9uIChpbnNuX3dvcmQsICZpbnNuKSkKKyAgICByZXR1cm4gLTE7CisgIHN3aXRjaCAoR0VUX1RZUEUgKGluc25fd29yZCkpCisgICAgeworICAgIGNhc2UgVFdPX09QRVJBTkRfMToKKyAgICBjYXNlIFRXT19PUEVSQU5EXzI6CisgICAgICBpZiAoIXByaW50X3R3b19vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKKwlyZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRIUkVFX09QRVJBTkQ6CisgICAgICBpZiAoIXByaW50X3RocmVlX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgJmluc24pKQorCXJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEFSX1NUT1JFOgorICAgIGNhc2UgTVVMX0FERFM6CisgICAgICBpZiAoIXByaW50X3Bhcl9pbnNuIChpbmZvLCBpbnNuX3dvcmQsICZpbnNuKSkKKwlyZXR1cm4gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJSQU5DSEVTOgorICAgICAgaWYgKCFwcmludF9icmFuY2ggKGluZm8sIGluc25fd29yZCwgJmluc24pKQorCXJldHVybiAtMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDQ7Cit9CisKK2ludAorZ2V0X3RpYzMwX2luc3RydWN0aW9uIChpbnNuX3dvcmQsIGluc24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOworICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Cit7CisgIHN3aXRjaCAoR0VUX1RZUEUgKGluc25fd29yZCkpCisgICAgeworICAgIGNhc2UgVFdPX09QRVJBTkRfMToKKyAgICBjYXNlIFRXT19PUEVSQU5EXzI6CisgICAgY2FzZSBUSFJFRV9PUEVSQU5EOgorICAgICAgaW5zbi0+dHlwZSA9IE5PUk1BTF9JTlNOOworICAgICAgeworCXRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHRlbXBsYXRlICopIHRpYzMwX29wdGFiOworCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCisJICB7CisJICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQorCSAgICAgIHsKKwkJaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRzID09IDApCisJCSAgeworCQkgICAgaWYgKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlID09IGluc25fd29yZCkKKwkJICAgICAgeworCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIE5PUk1BTF9JREVOKSA9PSAoaW5zbl93b3JkICYgTk9STUFMX0lERU4pKQorCQkgIHsKKwkJICAgIGluc24tPnRtID0gY3VycmVudF9vcHRhYjsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBBUl9TVE9SRToKKyAgICAgIGluc24tPnR5cGUgPSBQQVJBTExFTF9JTlNOOworICAgICAgeworCXBhcnRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHBhcnRlbXBsYXRlICopIHRpYzMwX3Bhcm9wdGFiOworCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCisJICB7CisJICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQorCSAgICAgIHsKKwkJaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIFBBUl9TVE9SRV9JREVOKSA9PSAoaW5zbl93b3JkICYgUEFSX1NUT1JFX0lERU4pKQorCQkgIHsKKwkJICAgIGluc24tPnB0bSA9IGN1cnJlbnRfb3B0YWI7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNVUxfQUREUzoKKyAgICAgIGluc24tPnR5cGUgPSBQQVJBTExFTF9JTlNOOworICAgICAgeworCXBhcnRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHBhcnRlbXBsYXRlICopIHRpYzMwX3Bhcm9wdGFiOworCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfcGFyb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCisJICB7CisJICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQorCSAgICAgIHsKKwkJaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIE1VTF9BRERfSURFTikgPT0gKGluc25fd29yZCAmIE1VTF9BRERfSURFTikpCisJCSAgeworCQkgICAgaW5zbi0+cHRtID0gY3VycmVudF9vcHRhYjsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJSQU5DSEVTOgorICAgICAgaW5zbi0+dHlwZSA9IE5PUk1BTF9JTlNOOworICAgICAgeworCXRlbXBsYXRlICpjdXJyZW50X29wdGFiID0gKHRlbXBsYXRlICopIHRpYzMwX29wdGFiOworCWZvciAoOyBjdXJyZW50X29wdGFiIDwgdGljMzBfb3B0YWJfZW5kOyBjdXJyZW50X29wdGFiKyspCisJICB7CisJICAgIGlmIChHRVRfVFlQRSAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUpID09IEdFVF9UWVBFIChpbnNuX3dvcmQpKQorCSAgICAgIHsKKwkJaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRfdHlwZXNbMF0gJiBJbW0yNCkKKwkJICB7CisJCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgQlJfSU1NX0lERU4pID09IChpbnNuX3dvcmQgJiBCUl9JTU1fSURFTikpCisJCSAgICAgIHsKKwkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChjdXJyZW50X29wdGFiLT5vcGVyYW5kcyA+IDApCisJCSAgeworCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIEJSX0NPTkRfSURFTikgPT0gKGluc25fd29yZCAmIEJSX0NPTkRfSURFTikpCisJCSAgICAgIHsKKwkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgaWYgKChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSAmIChCUl9DT05EX0lERU4gfCAweDAwODAwMDAwKSkgPT0gKGluc25fd29yZCAmIChCUl9DT05EX0lERU4gfCAweDAwODAwMDAwKSkpCisJCSAgICAgIHsKKwkJCWluc24tPnRtID0gY3VycmVudF9vcHRhYjsKKwkJCWJyZWFrOworCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitpbnQKK3ByaW50X3R3b19vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOworICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Cit7CisgIGNoYXIgbmFtZVsxMl07CisgIGNoYXIgb3BlcmFuZFsyXVsxM10gPQorICB7CisgICAgezB9LAorICAgIHswfX07CisgIGZsb2F0IGZfbnVtYmVyOworCisgIGlmIChpbnNuLT50bSA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBzdHJjcHkgKG5hbWUsIGluc24tPnRtLT5uYW1lKTsKKyAgaWYgKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpCisgICAgeworICAgICAgaW50IHNyY19vcCwgZGVzdF9vcDsKKyAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIGluc3RydWN0aW9uIGlzIGEgc3RvcmUgb3IgYSBub3JtYWwgaW5zdHJ1Y3Rpb24uICovCisgICAgICBpZiAoKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzFdICYgKERpcmVjdCB8IEluZGlyZWN0KSkgPT0gKERpcmVjdCB8IEluZGlyZWN0KSkKKwl7CisJICBzcmNfb3AgPSAxOworCSAgZGVzdF9vcCA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNyY19vcCA9IDA7CisJICBkZXN0X29wID0gMTsKKwl9CisgICAgICAvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLiAqLworICAgICAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAyKQorCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbZGVzdF9vcF0pOworICAgICAgLyogR2V0IHRoZSBzb3VyY2Ugb3BlcmFuZCBiYXNlZCBvbiBhZGRyZXNzaW5nIG1vZGUuICovCisgICAgICBzd2l0Y2ggKGluc25fd29yZCAmIEFkZHJlc3NNb2RlKQorCXsKKwljYXNlIEFNX1JFR0lTVEVSOgorCSAgLyogQ2hlY2sgZm9yIHRoZSBOT1AgaW5zdHJ1Y3Rpb24gYmVmb3JlIGdldHRpbmcgdGhlIG9wZXJhbmQuICovCisJICBpZiAoKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgTm90UmVxKSA9PSAwKQorCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwMUYpLCBvcGVyYW5kW3NyY19vcF0pOworCSAgYnJlYWs7CisJY2FzZSBBTV9ESVJFQ1Q6CisJICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICJAMHglbFgiLCAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOworCSAgYnJlYWs7CisJY2FzZSBBTV9JTkRJUkVDVDoKKwkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkZGRiksIDIsIG9wZXJhbmRbc3JjX29wXSk7CisJICBicmVhazsKKwljYXNlIEFNX0lNTToKKwkgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGJhc2VkIG9uIHZhcmlhYmxlIHR5cGUuICovCisJICBzd2l0Y2ggKGluc24tPnRtLT5pbW1fYXJnX3R5cGUpCisJICAgIHsKKwkgICAgY2FzZSBJbW1fRmxvYXQ6CisJICAgICAgY252dF90bXNmbG9hdF9pZWVlICgoaW5zbl93b3JkICYgMHgwMDAwRkZGRiksIDIsICZmX251bWJlcik7CisJICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJTIuMmYiLCBmX251bWJlcik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSW1tX1NJbnQ6CisJICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJWQiLCAoc2hvcnQpIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgSW1tX1VJbnQ6CisJICAgICAgc3ByaW50ZiAob3BlcmFuZFtzcmNfb3BdLCAiJWx1IiwgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSBmb3IgTERQIGluc3RydWN0aW9uLiAqLworCSAgaWYgKChpbnNuX3dvcmQgJiAweEZGRkZGRjAwKSA9PSBMRFBfSU5TTikKKwkgICAgeworCSAgICAgIHN0cmNweSAobmFtZSwgImxkcCIpOworCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCUwNmxYIiwgKGluc25fd29yZCAmIDB4MDAwMDAwRkYpIDw8IDE2KTsKKwkgICAgICBvcGVyYW5kWzFdWzBdID0gJ1wwJzsKKwkgICAgfQorCX0KKyAgICB9CisgIC8qIEhhbmRsZSBjYXNlIGZvciBzdGFjayBhbmQgcm90YXRlIGluc3RydWN0aW9ucy4gKi8KKyAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDEpCisgICAgeworICAgICAgaWYgKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gU3RhY2tPcCkKKwl7CisJICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kWzBdKTsKKwl9CisgICAgfQorICAvKiBPdXRwdXQgaW5zdHJ1Y3Rpb24gdG8gc3RyZWFtLiAqLworICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzJWMlcyIsIG5hbWUsCisJCSAgICAgIG9wZXJhbmRbMF1bMF0gPyBvcGVyYW5kWzBdIDogIiIsCisJCSAgICAgIG9wZXJhbmRbMV1bMF0gPyAnLCcgOiAnICcsCisJCSAgICAgIG9wZXJhbmRbMV1bMF0gPyBvcGVyYW5kWzFdIDogIiIpOworICByZXR1cm4gMTsKK30KKworaW50CitwcmludF90aHJlZV9vcGVyYW5kIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOworICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Cit7CisgIGNoYXIgb3BlcmFuZFszXVsxM10gPQorICB7CisgICAgezB9LAorICAgIHswfSwKKyAgICB7MH19OworCisgIGlmIChpbnNuLT50bSA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBzd2l0Y2ggKGluc25fd29yZCAmIEFkZHJlc3NNb2RlKQorICAgIHsKKyAgICBjYXNlIEFNX1JFR0lTVEVSOgorICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgb3BlcmFuZFswXSk7CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIG9wZXJhbmRbMV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBTV9ESVJFQ1Q6CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCBvcGVyYW5kWzBdKTsKKyAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFNX0lORElSRUNUOgorICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXSk7CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIG9wZXJhbmRbMV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBTV9JTU06CisgICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdKTsKKyAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDMpCisgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFsyXSk7CisgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMsJXMlYyVzIiwgaW5zbi0+dG0tPm5hbWUsCisJCSAgICAgIG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCisJCSAgICAgIG9wZXJhbmRbMl1bMF0gPyAnLCcgOiAnICcsCisJCSAgICAgIG9wZXJhbmRbMl1bMF0gPyBvcGVyYW5kWzJdIDogIiIpOworICByZXR1cm4gMTsKK30KKworaW50CitwcmludF9wYXJfaW5zbiAoaW5mbywgaW5zbl93b3JkLCBpbnNuKQorICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICB1bnNpZ25lZCBsb25nIGluc25fd29yZDsKKyAgICAgc3RydWN0IGluc3RydWN0aW9uICppbnNuOworeworICBzaXplX3QgaSwgbGVuOworICBjaGFyICpuYW1lMSwgKm5hbWUyOworICBjaGFyIG9wZXJhbmRbMl1bM11bMTNdID0KKyAgeworICAgIHsKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfX0sCisgICAgeworICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9fX07CisKKyAgaWYgKGluc24tPnB0bSA9PSBOVUxMKQorICAgIHJldHVybiAwOworICAvKiBQYXJzZSBvdXQgdGhlIG5hbWVzIG9mIGVhY2ggb2YgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyBmcm9tIHRoZQorICAgICBxX2luc24xX2luc24yIGZvcm1hdC4gKi8KKyAgbmFtZTEgPSAoY2hhciAqKSBzdHJkdXAgKGluc24tPnB0bS0+bmFtZSArIDIpOworICBuYW1lMiA9ICIiOworICBsZW4gPSBzdHJsZW4gKG5hbWUxKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChuYW1lMVtpXSA9PSAnXycpCisJeworCSAgbmFtZTIgPSAmbmFtZTFbaSArIDFdOworCSAgbmFtZTFbaV0gPSAnXDAnOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgLyogR2V0IHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYmFzZWQgb24gdGhlIG9wZXJhbmQgb3JkZXIuICovCisgIHN3aXRjaCAoaW5zbi0+cHRtLT5vcG9yZGVyKQorICAgIHsKKyAgICBjYXNlIE9PXzRvcDE6CisgICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKKyAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKKyAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPT180b3AyOgorICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVswXSk7CisgICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMF0pOworICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT09fNG9wMzoKKyAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOworICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKKyAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOworICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVswXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9PXzVvcDE6CisgICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKKyAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKKyAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOworICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsyXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9PXzVvcDI6CisgICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKKyAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVsxXSk7CisgICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKKyAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMF0pOworICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsyXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9PX1BGaWVsZDoKKyAgICAgIGlmIChpbnNuX3dvcmQgJiAweDAwODAwMDAwKQorCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAxLCBvcGVyYW5kWzBdWzJdKTsKKyAgICAgIGVsc2UKKwlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMCwgb3BlcmFuZFswXVsyXSk7CisgICAgICBpZiAoaW5zbl93b3JkICYgMHgwMDQwMDAwMCkKKwlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMywgb3BlcmFuZFsxXVsyXSk7CisgICAgICBlbHNlCisJZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDIsIG9wZXJhbmRbMV1bMl0pOworICAgICAgc3dpdGNoIChpbnNuX3dvcmQgJiBQX0ZJRUxEKQorCXsKKwljYXNlIDB4MDAwMDAwMDA6CisJICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzFdKTsKKwkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7CisJICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKKwkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOworCSAgYnJlYWs7CisJY2FzZSAweDAxMDAwMDAwOgorCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVswXSk7CisJICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMF1bMF0pOworCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVsxXSk7CisJICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzFdKTsKKwkgIGJyZWFrOworCWNhc2UgMHgwMjAwMDAwMDoKKwkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMV0pOworCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzBdKTsKKwkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOworCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVswXSk7CisJICBicmVhazsKKwljYXNlIDB4MDMwMDAwMDA6CisJICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzFdKTsKKwkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7CisJICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzBdKTsKKwkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcywlcyVjJXMiLCBuYW1lMSwKKwkJICAgICAgb3BlcmFuZFswXVswXSwgb3BlcmFuZFswXVsxXSwKKwkJICAgICAgb3BlcmFuZFswXVsyXVswXSA/ICcsJyA6ICcgJywKKwkJICAgICAgb3BlcmFuZFswXVsyXVswXSA/IG9wZXJhbmRbMF1bMl0gOiAiIik7CisgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiXG5cdFx0XHR8fCAlcyAlcywlcyVjJXMiLCBuYW1lMiwKKwkJICAgICAgb3BlcmFuZFsxXVswXSwgb3BlcmFuZFsxXVsxXSwKKwkJICAgICAgb3BlcmFuZFsxXVsyXVswXSA/ICcsJyA6ICcgJywKKwkJICAgICAgb3BlcmFuZFsxXVsyXVswXSA/IG9wZXJhbmRbMV1bMl0gOiAiIik7CisgIGZyZWUgKG5hbWUxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorcHJpbnRfYnJhbmNoIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOworICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Cit7CisgIGNoYXIgb3BlcmFuZFsyXVsxM10gPQorICB7CisgICAgezB9LAorICAgIHswfX07CisgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKyAgaW50IHByaW50X2xhYmVsID0gMDsKKworICBpZiAoaW5zbi0+dG0gPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgMjQtYml0IGltbWVkaWF0ZSBqdW1wcy4gKi8KKyAgaWYgKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgSW1tMjQpCisgICAgeworICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDBGRkZGRkY7CisgICAgICBzcHJpbnRmIChvcGVyYW5kWzBdLCAiMHglbFgiLCBhZGRyZXNzKTsKKyAgICAgIHByaW50X2xhYmVsID0gMTsKKyAgICB9CisgIC8qIEdldCB0aGUgb3BlcmFuZCBmb3IgdGhlIHRyYXAgaW5zdHJ1Y3Rpb24uICovCisgIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgSVZlY3RvcikKKyAgICB7CisgICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMDAwMDAxRjsKKyAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCVsWCIsIGFkZHJlc3MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwMDBGRkZGOworICAgICAgLyogR2V0IHRoZSBvcGVyYW5kcyBmb3IgdGhlIERCIGluc3RydWN0aW9ucy4gKi8KKyAgICAgIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMikKKwl7CisJICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKChpbnNuX3dvcmQgJiAweDAxQzAwMDAwKSA+PiAyMikgKyBSRUdfQVIwLCBvcGVyYW5kWzBdKTsKKwkgIGlmIChpbnNuX3dvcmQgJiBQQ1JlbCkKKwkgICAgeworCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMV0sICIlZCIsIChzaG9ydCkgYWRkcmVzcyk7CisJICAgICAgcHJpbnRfbGFiZWwgPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kIChpbnNuX3dvcmQgJiAweDAwMDAwMDFGLCBvcGVyYW5kWzFdKTsKKwl9CisgICAgICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciB0aGUgc3RhbmRhcmQgYnJhbmNoZXMuICovCisgICAgICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMSkKKwl7CisJICBpZiAoaW5zbl93b3JkICYgUENSZWwpCisJICAgIHsKKwkgICAgICBhZGRyZXNzID0gKHNob3J0KSBhZGRyZXNzOworCSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIlbGQiLCBhZGRyZXNzKTsKKwkgICAgICBwcmludF9sYWJlbCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGluc25fd29yZCAmIDB4MDAwMDAwMUYsIG9wZXJhbmRbMF0pOworCX0KKyAgICB9CisgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMlYyVzIiwgaW5zbi0+dG0tPm5hbWUsCisJCSAgICAgIG9wZXJhbmRbMF1bMF0gPyBvcGVyYW5kWzBdIDogIiIsCisJCSAgICAgIG9wZXJhbmRbMV1bMF0gPyAnLCcgOiAnICcsCisJCSAgICAgIG9wZXJhbmRbMV1bMF0gPyBvcGVyYW5kWzFdIDogIiIpOworICAvKiBQcmludCBkZXN0aW5hdGlvbiBvZiBicmFuY2ggaW4gcmVsYXRpb24gdG8gY3VycmVudCBzeW1ib2wuICovCisgIGlmIChwcmludF9sYWJlbCAmJiBpbmZvLT5zeW1ib2xzKQorICAgIHsKKyAgICAgIGFzeW1ib2wgKnN5bSA9ICppbmZvLT5zeW1ib2xzOworCisgICAgICBpZiAoKGluc24tPnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUENSZWwpICYmIChpbnNuX3dvcmQgJiBQQ1JlbCkpCisJeworCSAgYWRkcmVzcyA9IChfcGMgKyAxICsgKHNob3J0KSBhZGRyZXNzKSAtICgoc3ltLT5zZWN0aW9uLT52bWEgKyBzeW0tPnZhbHVlKSAvIDQpOworCSAgLyogQ2hlY2sgZm9yIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24sIGlmIHNvIGFkanVzdCBkZXN0aW5hdGlvbi4gKi8KKwkgIGlmIChpbnNuX3dvcmQgJiAweDAwMjAwMDAwKQorCSAgICBhZGRyZXNzICs9IDI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFkZHJlc3MgLT0gKChzeW0tPnNlY3Rpb24tPnZtYSArIHN5bS0+dmFsdWUpIC8gNCk7CisJfQorICAgICAgaWYgKGFkZHJlc3MgPT0gMCkKKwlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiA8JXM+Iiwgc3ltLT5uYW1lKTsKKyAgICAgIGVsc2UKKwlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiA8JXMgJWMgJWQ+Iiwgc3ltLT5uYW1lLAorCQkJICAgICgoc2hvcnQpIGFkZHJlc3MgPCAwKSA/ICctJyA6ICcrJywKKwkJCSAgICBhYnMgKGFkZHJlc3MpKTsKKyAgICB9CisgIHJldHVybiAxOworfQorCitpbnQKK2dldF9pbmRpcmVjdF9vcGVyYW5kIChmcmFnbWVudCwgc2l6ZSwgYnVmZmVyKQorICAgICB1bnNpZ25lZCBzaG9ydCBmcmFnbWVudDsKKyAgICAgaW50IHNpemU7CisgICAgIGNoYXIgKmJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBtb2Q7CisgIHVuc2lnbmVkIGFybnVtOworICB1bnNpZ25lZCBjaGFyIGRpc3A7CisKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgIHJldHVybiAwOworICAvKiBEZXRlcm1pbmUgd2hpY2ggYml0cyBpZGVudGlmeSB0aGUgc2VjdGlvbnMgb2YgdGhlIGluZGlyZWN0IG9wZXJhbmQgYmFzZWQgb24gdGhlCisgICAgIHNpemUgaW4gYnl0ZXMuICovCisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgbW9kID0gKGZyYWdtZW50ICYgMHgwMEY4KSA+PiAzOworICAgICAgYXJudW0gPSAoZnJhZ21lbnQgJiAweDAwMDcpOworICAgICAgZGlzcCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtb2QgPSAoZnJhZ21lbnQgJiAweEY4MDApID4+IDExOworICAgICAgYXJudW0gPSAoZnJhZ21lbnQgJiAweDA3MDApID4+IDg7CisgICAgICBkaXNwID0gKGZyYWdtZW50ICYgMHgwMEZGKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHsKKyAgICBjb25zdCBpbmRfYWRkcl90eXBlICpjdXJyZW50X2luZCA9IHRpYzMwX2luZGFkZHJfdGFiOworICAgIGZvciAoOyBjdXJyZW50X2luZCA8IHRpYzMwX2luZGFkZHJ0YWJfZW5kOyBjdXJyZW50X2luZCsrKQorICAgICAgeworCWlmIChjdXJyZW50X2luZC0+bW9kZmllbGQgPT0gbW9kKQorCSAgeworCSAgICBpZiAoY3VycmVudF9pbmQtPmRpc3BsYWNlbWVudCA9PSBJTVBMSUVEX0RJU1AgJiYgc2l6ZSA9PSAyKQorCSAgICAgIHsKKwkJY29udGludWU7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlzaXplX3QgaSwgbGVuOworCQlpbnQgYnVmY250OworCQkKKwkJbGVuID0gc3RybGVuIChjdXJyZW50X2luZC0+c3ludGF4KTsKKwkJZm9yIChpID0gMCwgYnVmY250ID0gMDsgaSA8IGxlbjsgaSsrLCBidWZjbnQrKykKKwkJICB7CisJCSAgICBidWZmZXJbYnVmY250XSA9IGN1cnJlbnRfaW5kLT5zeW50YXhbaV07CisJCSAgICBpZiAoYnVmZmVyW2J1ZmNudCAtIDFdID09ICdhJyAmJiBidWZmZXJbYnVmY250XSA9PSAncicpCisJCSAgICAgIGJ1ZmZlclsrK2J1ZmNudF0gPSBhcm51bSArICcwJzsKKwkJICAgIGlmIChidWZmZXJbYnVmY250XSA9PSAnKCcgJiYgY3VycmVudF9pbmQtPmRpc3BsYWNlbWVudCA9PSBESVNQX1JFUVVJUkVEKQorCQkgICAgICB7CisJCQlzcHJpbnRmICgmYnVmZmVyW2J1ZmNudCArIDFdLCAiJXUiLCBkaXNwKTsKKwkJCWJ1ZmNudCArPSBzdHJsZW4gKCZidWZmZXJbYnVmY250ICsgMV0pOworCQkgICAgICB9CisJCSAgfQorCQlidWZmZXJbYnVmY250ICsgMV0gPSAnXDAnOworCQlicmVhazsKKwkgICAgICB9CisJICB9CisgICAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludAorZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGZyYWdtZW50LCBidWZmZXIpCisgICAgIHVuc2lnbmVkIGNoYXIgZnJhZ21lbnQ7CisgICAgIGNoYXIgKmJ1ZmZlcjsKK3sKKyAgY29uc3QgcmVnICpjdXJyZW50X3JlZyA9IHRpYzMwX3JlZ3RhYjsKKworICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGZvciAoOyBjdXJyZW50X3JlZyA8IHRpYzMwX3JlZ3RhYl9lbmQ7IGN1cnJlbnRfcmVnKyspCisgICAgeworICAgICAgaWYgKChmcmFnbWVudCAmIDB4MUYpID09IGN1cnJlbnRfcmVnLT5vcGNvZGUpCisJeworCSAgc3RyY3B5IChidWZmZXIsIGN1cnJlbnRfcmVnLT5uYW1lKTsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2NudnRfdG1zZmxvYXRfaWVlZSAodG1zZmxvYXQsIHNpemUsIGllZWVmbG9hdCkKKyAgICAgdW5zaWduZWQgbG9uZyB0bXNmbG9hdDsKKyAgICAgaW50IHNpemU7CisgICAgIGZsb2F0ICppZWVlZmxvYXQ7Cit7CisgIHVuc2lnbmVkIGxvbmcgZXhwLCBzaWduLCBtYW50OworCisgIGlmIChzaXplID09IDIpCisgICAgeworICAgICAgaWYgKCh0bXNmbG9hdCAmIDB4MDAwMEYwMDApID09IDB4MDAwMDgwMDApCisJdG1zZmxvYXQgPSAweDgwMDAwMDAwOworICAgICAgZWxzZQorCXsKKwkgIHRtc2Zsb2F0IDw8PSAxNjsKKwkgIHRtc2Zsb2F0ID0gKGxvbmcpIHRtc2Zsb2F0ID4+IDQ7CisJfQorICAgIH0KKyAgZXhwID0gdG1zZmxvYXQgJiAweEZGMDAwMDAwOworICBpZiAoZXhwID09IDB4ODAwMDAwMDApCisgICAgeworICAgICAgKmllZWVmbG9hdCA9IDAuMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZXhwICs9IDB4N0YwMDAwMDA7CisgIHNpZ24gPSAodG1zZmxvYXQgJiAweDAwODAwMDAwKSA8PCA4OworICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOworICBpZiAoZXhwID09IDB4RkYwMDAwMDApCisgICAgeworICAgICAgaWYgKG1hbnQgPT0gMCkKKwkqaWVlZWZsb2F0ID0gRVJBTkdFOworICAgICAgaWYgKHNpZ24gPT0gMCkKKwkqaWVlZWZsb2F0ID0gMS4wIC8gMC4wOworICAgICAgZWxzZQorCSppZWVlZmxvYXQgPSAtMS4wIC8gMC4wOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBleHAgPj49IDE7CisgIGlmIChzaWduKQorICAgIHsKKyAgICAgIG1hbnQgPSAofm1hbnQpICYgMHgwMDdGRkZGRjsKKyAgICAgIG1hbnQgKz0gMTsKKyAgICAgIGV4cCArPSBtYW50ICYgMHgwMDgwMDAwMDsKKyAgICAgIGV4cCAmPSAweDdGODAwMDAwOworICAgICAgbWFudCAmPSAweDAwN0ZGRkZGOworICAgIH0KKyAgaWYgKHRtc2Zsb2F0ID09IDB4ODAwMDAwMDApCisgICAgc2lnbiA9IG1hbnQgPSBleHAgPSAwOworICB0bXNmbG9hdCA9IHNpZ24gfCBleHAgfCBtYW50OworICAqaWVlZWZsb2F0ID0gKigoZmxvYXQgKikgJnRtc2Zsb2F0KTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL3RpYzgwLWRpcy5jIGIvb3Bjb2Rlcy90aWM4MC1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZiYzEyCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy90aWM4MC1kaXMuYwpAQCAtMCwwICsxLDM5NyBAQAorLyogUHJpbnQgVEkgVE1TMzIwQzgwIChNVlApIGluc3RydWN0aW9ucworICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisKK3N0YXRpYyBpbnQgbGVuZ3RoOworCitzdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2JpdG51bSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7CitzdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKK3N0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7CitzdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2Zsb2F0IFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKK3N0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfaW50ZWdlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7CitzdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCQkJICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKiwgYmZkX3ZtYSkpOworc3RhdGljIGludCBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKK3N0YXRpYyBpbnQgcHJpbnRfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwgdW5zaWduZWQgbG9uZywKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKK3N0YXRpYyBpbnQgZmlsbF9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqKSk7CisKKwwKKy8qIFByaW50IGFuIGludGVnZXIgb3BlcmFuZC4gIFRyeSB0byBiZSBzb21ld2hhdCBzbWFydCBhYm91dCB0aGUKKyAgIGZvcm1hdCBieSBhc3N1bWluZyB0aGF0IHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXJzIGFyZQorICAgcHJvYmFibHkgbG9vcCBpbmNyZW1lbnQgdmFsdWVzLCBzdHJ1Y3R1cmUgb2Zmc2V0cywgb3Igc2ltaWxhcgorICAgdmFsdWVzIHRoYXQgYXJlIG1vcmUgbWVhbmluZ2Z1bCBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsIHZhbHVlcy4KKyAgIExhcmdlciBudW1iZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgcHJpbnRlZCBhcyBoZXggdmFsdWVzLiAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSkKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGxvbmcgdmFsdWU7Cit7CisgIGlmICgodmFsdWUgPiA5OTk5IHx8IHZhbHVlIDwgLTk5OTkpKQorICAgIHsKKyAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOworICAgIH0KK30KKworDAorLyogRklYTUU6IGRlcGVuZHMgdXBvbiBzaXplb2YgKGxvbmcpID09IHNpemVvZiAoZmxvYXQpIGFuZAorICAgYWxzbyB1cG9uIGhvc3QgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IG1hdGNoaW5nIHRhcmdldAorICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LiAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfb3BlcmFuZF9mbG9hdCAoaW5mbywgdmFsdWUpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBsb25nIHZhbHVlOworeworICB1bmlvbiB7IGZsb2F0IGY7IGxvbmcgbDsgfSBmdmFsOworCisgIGZ2YWwubCA9IHZhbHVlOworICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlZyIsIGZ2YWwuZik7Cit9CisKKwwKK3N0YXRpYyB2b2lkCitwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKQorICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgbG9uZyB2YWx1ZTsKK3sKKyAgY29uc3QgY2hhciAqdG1wOworCisgIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsdWUsIFRJQzgwX09QRVJBTkRfQ1IpOworICBpZiAodG1wICE9IE5VTEwpCisgICAgeworICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7CisgICAgfQorfQorCisMCitzdGF0aWMgdm9pZAorcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSAoaW5mbywgdmFsdWUpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBsb25nIHZhbHVlOworeworICBjb25zdCBjaGFyICp0bXA7CisKKyAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWx1ZSwgVElDODBfT1BFUkFORF9DQyk7CisgIGlmICh0bXAgIT0gTlVMTCkKKyAgICB7CisgICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOworICAgIH0KK30KKworDAorc3RhdGljIHZvaWQKK3ByaW50X29wZXJhbmRfYml0bnVtIChpbmZvLCB2YWx1ZSkKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGxvbmcgdmFsdWU7Cit7CisgIGludCBiaXRudW07CisgIGNvbnN0IGNoYXIgKnRtcDsKKworICBiaXRudW0gPSB+dmFsdWUgJiAweDFGOworICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKGJpdG51bSwgVElDODBfT1BFUkFORF9CSVROVU0pOworICBpZiAodG1wICE9IE5VTEwpCisgICAgeworICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVsZCIsIGJpdG51bSk7CisgICAgfQorfQorCisMCisvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLworCisjZGVmaW5lIE1fU0koaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE3KSkpCisjZGVmaW5lIE1fTEkoaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE1KSkpCisjZGVmaW5lIFJfU0NBTEVEKGluc24sb3ApICgoKChvcCkgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDExKSkpCisKK3N0YXRpYyB2b2lkCitwcmludF9vcGVyYW5kIChpbmZvLCB2YWx1ZSwgaW5zbiwgb3BlcmFuZCwgbWVtYWRkcikKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGxvbmcgdmFsdWU7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgIGJmZF92bWEgbWVtYWRkcjsKK3sKKyAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IDApCisgICAgeworICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKKyAgICAgIGlmIChNX1NJIChpbnNuLCBvcGVyYW5kKSB8fCBNX0xJIChpbnNuLCBvcGVyYW5kKSkKKwl7CisJICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICI6bSIpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IDApCisgICAgeworICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiYSVsZCIsIHZhbHVlKTsKKyAgICB9CisgIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKiB2YWx1ZSwgaW5mbyk7CisgICAgfQorICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOworICAgIH0KKyAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVE5VTSkgIT0gMCkKKyAgICB7CisgICAgICBwcmludF9vcGVyYW5kX2JpdG51bSAoaW5mbywgdmFsdWUpOworICAgIH0KKyAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NDKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgKGluZm8sIHZhbHVlKTsKKyAgICB9CisgIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gMCkKKyAgICB7CisgICAgICBwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKTsKKyAgICB9CisgIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GTE9BVCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludF9vcGVyYW5kX2Zsb2F0IChpbmZvLCB2YWx1ZSk7CisgICAgfQorICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQklURklFTEQpKQorICAgIHsKKyAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSk7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSBzY2FsZWQgb3BlcmFuZCwgdGhlbiBwcmludCB0aGUgbW9kaWZpZXIgKi8KKworICBpZiAoUl9TQ0FMRUQgKGluc24sIG9wZXJhbmQpKQorICAgIHsKKyAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIjpzIik7CisgICAgfQorfQorCisMCisvKiBXZSBoYXZlIGNob3NlbiBhbiBvcGNvZGUgdGFibGUgZW50cnkgKi8KKworc3RhdGljIGludAorcHJpbnRfb25lX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpCisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOworeworICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqb3BlcmFuZDsKKyAgbG9uZyB2YWx1ZTsKKyAgaW50IHN0YXR1czsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKKyAgaW50IGNsb3NlX3BhcmVuOworCisgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUtMTBzIiwgb3Bjb2RlIC0+IG5hbWUpOworCisgIGZvciAob3BpbmRleCA9IG9wY29kZSAtPiBvcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQorICAgIHsKKyAgICAgIG9wZXJhbmQgPSB0aWM4MF9vcGVyYW5kcyArICpvcGluZGV4OworCisgICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCisgICAgICBpZiAob3BlcmFuZCAtPiBleHRyYWN0KQorCXsKKwkgIHZhbHVlID0gKCpvcGVyYW5kIC0+IGV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOworCX0KKyAgICAgIGVsc2UgaWYgKG9wZXJhbmQgLT4gYml0cyA9PSAzMikKKwl7CisJICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAodW5zaWduZWQgbG9uZyAqKSAmdmFsdWUpOworCSAgaWYgKHN0YXR1cyA9PSAtMSkKKwkgICAgeworCSAgICAgIHJldHVybiAoc3RhdHVzKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQgLT4gc2hpZnQpICYgKCgxIDw8IG9wZXJhbmQgLT4gYml0cykgLSAxKTsKKwkgIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCisJICAgICAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQgLT4gYml0cyAtIDEpKSkgIT0gMCkKKwkgICAgeworCSAgICAgIHZhbHVlIC09IDEgPDwgb3BlcmFuZCAtPiBiaXRzOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMsIHRoZW4gcHJpbnQKKwkgdGhlIG9wZW4gcGFyZW4sIG90aGVyd2lzZSBqdXN0IHByaW50IHRoZSByZWd1bGFyIGNvbW1hCisJIHNlcGFyYXRvciwgZXhjZXB0IGZvciB0aGUgZmlyc3Qgb3BlcmFuZC4gKi8KKworICAgICAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQVJFTlMpID09IDApCisJeworCSAgY2xvc2VfcGFyZW4gPSAwOworCSAgaWYgKG9waW5kZXggIT0gb3Bjb2RlIC0+IG9wZXJhbmRzKQorCSAgICB7CisJICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiLCIpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNsb3NlX3BhcmVuID0gMTsKKwkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIigiKTsKKwl9CisKKyAgICAgIHByaW50X29wZXJhbmQgKGluZm8sIHZhbHVlLCBpbnNuLCBvcGVyYW5kLCBtZW1hZGRyKTsKKworICAgICAgLyogSWYgd2UgcHJpbnRlZCBhbiBvcGVuIHBhcmVuIGJlZm9yZSBwcmludGluZyB0aGlzIG9wZXJhbmQsIGNsb3NlCisJIGl0IG5vdy4gVGhlIGZsYWcgZ2V0cyByZXNldCBvbiBlYWNoIGxvb3AuICovCisKKyAgICAgIGlmIChjbG9zZV9wYXJlbikKKwl7CisJICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIpIik7CisJfQorICAgIH0KKyAgcmV0dXJuIChsZW5ndGgpOworfQorCisMCisKKy8qIFRoZXJlIGFyZSBubyBzcGVjaWZpYyBiaXRzIHRoYXQgdGVsbCB1cyBmb3IgY2VydGFpbiB3aGV0aGVyIGEgdmVjdG9yCisgICBpbnN0cnVjdGlvbiBvcGNvZGUgY29udGFpbnMgb25lIG9yIHR3byBpbnN0cnVjdGlvbnMuICBIb3dldmVyIHNpbmNlCisgICBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mIHIwIGlzIGlsbGVnYWwsIHdlIGNhbiBjaGVjayBmb3Igbm9uemVybworICAgdmFsdWVzIGluIGJvdGggZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGRzLiAgT25seSBvcGNvZGVzIHRoYXQgaGF2ZQorICAgdHdvIHZhbGlkIGluc3RydWN0aW9ucyB3aWxsIGhhdmUgbm9uLXplcm8gaW4gYm90aCAqLworCisjZGVmaW5lIFRXT19JTlNOKGluc24pICgoKChpbnNuKSAmICgweDFGIDw8IDI3KSkgIT0gMCkgJiYgKCgoaW5zbikgJiAoMHgxRiA8PCAyMikpICE9IDApKQorCitzdGF0aWMgaW50CitwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgdmVjX29wY29kZSkKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICp2ZWNfb3Bjb2RlOworeworICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7CisgIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZV9lbmQ7CisKKyAgLyogRmluZCB0aGUgZmlyc3Qgb3Bjb2RlIG1hdGNoIGluIHRoZSBvcGNvZGVzIHRhYmxlLiAgRm9yIHZlY3RvcgorICAgICBvcGNvZGVzICh2ZWNfb3Bjb2RlICE9IE5VTEwpIGZpbmQgdGhlIGZpcnN0IG1hdGNoIHRoYXQgaXMgbm90IHRoZQorICAgICBwcmV2aW91c2x5IGZvdW5kIG1hdGNoLiAgRklYTUU6IHRoZXJlIHNob3VsZCBiZSBmYXN0ZXIgd2F5cyB0bworICAgICBzZWFyY2ggKGhhc2ggdGFibGUgb3IgYmluYXJ5IHNlYXJjaCksIGJ1dCBkb24ndCB3b3JyeSB0b28gbXVjaAorICAgICBhYm91dCBpdCB1bnRpbCBvdGhlciBUSWM4MCBzdXBwb3J0IGlzIGZpbmlzaGVkLiAqLworCisgIG9wY29kZV9lbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7CisgIGZvciAob3Bjb2RlID0gdGljODBfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCisgICAgeworICAgICAgaWYgKChpbnNuICYgb3Bjb2RlIC0+IG1hc2spID09IG9wY29kZSAtPiBvcGNvZGUgJiYKKwkgIG9wY29kZSAhPSB2ZWNfb3Bjb2RlKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKG9wY29kZSA9PSBvcGNvZGVfZW5kKQorICAgIHsKKyAgICAgIC8qIE5vIG1hdGNoIGZvdW5kLCBqdXN0IHByaW50IHRoZSBiaXRzIGFzIGEgLndvcmQgZGlyZWN0aXZlICovCisgICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIud29yZCAlIzA4bHgiLCBpbnNuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBNYXRjaCBmb3VuZCwgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICovCisgICAgICBsZW5ndGggPSBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSk7CisgICAgICBpZiAob3Bjb2RlIC0+IGZsYWdzICYgVElDODBfVkVDVE9SICYmIHZlY19vcGNvZGUgPT0gTlVMTCAmJiBUV09fSU5TTiAoaW5zbikpCisJeworCSAgLyogVGhlcmUgaXMgYW5vdGhlciBpbnN0cnVjdGlvbiB0byBwcmludCBmcm9tIHRoZSBzYW1lIG9wY29kZS4KKwkgICAgIFByaW50IHRoZSBzZXBhcmF0b3IgYW5kIHRoZW4gZmluZCBhbmQgcHJpbnQgdGhlIG90aGVyCisJICAgICBpbnN0cnVjdGlvbi4gKi8KKwkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiAgIHx8ICAgIik7CisJICBsZW5ndGggPSBwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKTsKKwl9CisgICAgfQorICByZXR1cm4gKGxlbmd0aCk7Cit9CisKKy8qIEdldCB0aGUgbmV4dCAzMiBiaXQgd29yZCBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYW5kIGNvbnZlcnQgaXQKKyAgIGludG8gaW50ZXJuYWwgZm9ybWF0IGluIHRoZSB1bnNpZ25lZCBsb25nIElOU04sIGZvciB3aGljaCB3ZSBhcmUKKyAgIHBhc3NlZCB0aGUgYWRkcmVzcy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAqLworCitzdGF0aWMgaW50CitmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNucCkKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Cit7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgaW50IHN0YXR1czsKKworICAvKiBHZXQgdGhlIGJpdHMgZm9yIHRoZSBuZXh0IDMyIGJpdCB3b3JkIGFuZCBwdXQgaW4gYnVmZmVyICovCisKKyAgc3RhdHVzID0gKCppbmZvIC0+IHJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgbGVuZ3RoLCBidWZmZXIsIDQsIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvIC0+IG1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKKyAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAvKiBSZWFkIHdhcyBzdWNjZXNzZnVsLCBzbyBpbmNyZW1lbnQgY291bnQgb2YgYnl0ZXMgcmVhZCBhbmQgY29udmVydAorICAgICB0aGUgYml0cyBpbnRvIGludGVybmFsIGZvcm1hdC4gKi8KKyAgICAgCisgIGxlbmd0aCArPSA0OworICBpZiAoaW5mbyAtPiBlbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCisgICAgeworICAgICAgKmluc25wID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKKyAgICB9CisgIGVsc2UgaWYgKGluZm8gLT4gZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQorICAgIHsKKyAgICAgICppbnNucCA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRklYTUU6IFNob3VsZCBwcm9iYWJseSBqdXN0IGRlZmF1bHQgdG8gb25lIG9yIHRoZSBvdGhlciAqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorICByZXR1cm4gKDApOworfQorCisMCitpbnQgCitwcmludF9pbnNuX3RpYzgwIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICB1bnNpZ25lZCBsb25nIGluc247CisgIGludCBzdGF0dXM7CisKKyAgbGVuZ3RoID0gMDsKKyAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA4OworICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAmaW5zbik7CisgIGlmIChzdGF0dXMgIT0gLTEpCisgICAgeworICAgICAgc3RhdHVzID0gcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIE5VTEwpOworICAgIH0KKyAgcmV0dXJuIChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1vcGMuYyBiL29wY29kZXMvdGljODAtb3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1YzMwOAotLS0gL2Rldi9udWxsCisrKyBiL29wY29kZXMvdGljODAtb3BjLmMKQEAgLTAsMCArMSwxMjE2IEBACisvKiBPcGNvZGUgdGFibGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKKworLyogVGhpcyBmaWxlIGhvbGRzIHZhcmlvdXMgdGFibGVzIGZvciB0aGUgVE1TMzIwQzgwIChNVlApLgorCisgICBUaGUgb3Bjb2RlIHRhYmxlIGlzIHN0cmljdGx5IGNvbnN0YW50IGRhdGEsIHNvIHRoZSBjb21waWxlciBzaG91bGQKKyAgIGJlIGFibGUgdG8gcHV0IGl0IGluIHRoZSAudGV4dCBzZWN0aW9uLgorCisgICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQKKyAgIGluc2VydGluZyBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMKKyAgIGZpbGUuCisKKyAgIFRoZSBwcmVkZWZpbmVkIHJlZ2lzdGVyIHRhYmxlIG1hcHMgZnJvbSByZWdpc3RlciBuYW1lcyB0byByZWdpc3RlcgorICAgdmFsdWVzLiAgKi8KKworDAorLyogVGFibGUgb2YgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMsIHN1Y2ggYXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycywKKyAgIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgY29uZGl0aW9uIGNvZGVzLCBjb250cm9sIHJlZ2lzdGVycywgYW5kIGJpdAorICAgbnVtYmVycy4KKworICAgVGhlIHRhYmxlIGlzIHNvcnRlZCBjYXNlIGluZGVwZW5kZW50bHkgYnkgbmFtZSBzbyB0aGF0IGl0IGlzIHN1aXRhYmxlIGZvcgorICAgc2VhcmNoaW5nIHZpYSBhIGJpbmFyeSBzZWFyY2ggdXNpbmcgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24KKyAgIGZ1bmN0aW9uLgorCisgICBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCBpcyBzdG9yZWQgaW4gdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHZhbHVlCisgICBmaWVsZCwgd2hpY2ggYWxsb3dzIHRoZSB2YWx1ZSBhbmQgdHlwZSB0byBiZSBwYXNzZWQgYXJvdW5kIGFzIGEgdW5pdCBpbiBhCisgICBzaW5nbGUgaW50LiAgVGhlIHR5cGVzIGhhdmUgdG8gYmUgbWFza2VkIG9mZiBiZWZvcmUgdXNpbmcgdGhlIG51bWVyaWMKKyAgIHZhbHVlIGFzIGEgbnVtYmVyLgorKi8KKworY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1tdID0KK3sKKyAgeyAiYTAiLAlUSUM4MF9PUEVSQU5EX0ZQQSB8IDAgfSwKKyAgeyAiYTEiLAlUSUM4MF9PUEVSQU5EX0ZQQSB8IDEgfSwKKyAgeyAiYWx3LmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNyB9LAorICB7ICJhbHcuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNSB9LAorICB7ICJhbHcudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMyB9LAorICB7ICJBTkFTVEFUIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzQgfSwKKyAgeyAiQlJLMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDM5IH0sCisgIHsgIkJSSzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzQSB9LAorICB7ICJDT05GSUciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMiB9LAorICB7ICJETFJVIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NTAwIH0sCisgIHsgIkRUQUcwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwIH0sCisgIHsgIkRUQUcxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAxIH0sCisgIHsgIkRUQUcxMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQSB9LAorICB7ICJEVEFHMTEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEIgfSwKKyAgeyAiRFRBRzEyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBDIH0sCisgIHsgIkRUQUcxMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRCB9LAorICB7ICJEVEFHMTQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEUgfSwKKyAgeyAiRFRBRzE1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBGIH0sCisgIHsgIkRUQUcyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAyIH0sCisgIHsgIkRUQUczIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAzIH0sCisgIHsgIkRUQUc0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA0IH0sCisgIHsgIkRUQUc1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA1IH0sCisgIHsgIkRUQUc2IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA2IH0sCisgIHsgIkRUQUc3IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA3IH0sCisgIHsgIkRUQUc4IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA4IH0sCisgIHsgIkRUQUc5IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDA5IH0sCisgIHsgIkVDT01DTlRMIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzMgfSwKKyAgeyAiRUlQIiwJVElDODBfT1BFUkFORF9DUiB8IDEgfSwKKyAgeyAiRVBDIiwJVElDODBfT1BFUkFORF9DUiB8IDAgfSwKKyAgeyAiZXEuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDAgfSwKKyAgeyAiZXEuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIwIH0sCisgIHsgImVxLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMCB9LAorICB7ICJlcS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjAgfSwKKyAgeyAiZXEwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMiB9LAorICB7ICJlcTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMCB9LAorICB7ICJlcTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxOCB9LAorICB7ICJGTFRBRFIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMSB9LAorICB7ICJGTFREVEgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxNCB9LAorICB7ICJGTFREVEwiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMyB9LAorICB7ICJGTFRPUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEwIH0sCisgIHsgIkZMVFRBRyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDEyIH0sCisgIHsgIkZQU1QiLAlUSUM4MF9PUEVSQU5EX0NSIHwgOCB9LAorICB7ICJnZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNSB9LAorICB7ICJnZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjUgfSwKKyAgeyAiZ2UuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE1IH0sCisgIHsgImdlLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNSB9LAorICB7ICJnZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAzIH0sCisgIHsgImdlMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDExIH0sCisgIHsgImdlMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDE5IH0sCisgIHsgImd0LmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyIH0sCisgIHsgImd0LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMiB9LAorICB7ICJndC5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTIgfSwKKyAgeyAiZ3QudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIyIH0sCisgIHsgImd0MC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDEgfSwKKyAgeyAiZ3QwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgOSB9LAorICB7ICJndDAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNyB9LAorICB7ICJoaS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNiB9LAorICB7ICJoaS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTYgfSwKKyAgeyAiaGkudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI2IH0sCisgIHsgImhzLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA5IH0sCisgIHsgImhzLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxOSB9LAorICB7ICJocy53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjkgfSwKKyAgeyAiaWIuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI4IH0sCisgIHsgIklFIiwJVElDODBfT1BFUkFORF9DUiB8IDYgfSwKKyAgeyAiSUxSVSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMwMCB9LAorICB7ICJpbi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjcgfSwKKyAgeyAiSU4wUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDAgfSwKKyAgeyAiSU4xUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDEgfSwKKyAgeyAiSU5UUEVOIiwJVElDODBfT1BFUkFORF9DUiB8IDQgfSwKKyAgeyAiSVRBRzAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDAgfSwKKyAgeyAiSVRBRzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDEgfSwKKyAgeyAiSVRBRzEwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBBIH0sCisgIHsgIklUQUcxMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQiB9LAorICB7ICJJVEFHMTIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEMgfSwKKyAgeyAiSVRBRzEzIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBEIH0sCisgIHsgIklUQUcxNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRSB9LAorICB7ICJJVEFHMTUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEYgfSwKKyAgeyAiSVRBRzIiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDIgfSwKKyAgeyAiSVRBRzMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDMgfSwKKyAgeyAiSVRBRzQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDQgfSwKKyAgeyAiSVRBRzUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDUgfSwKKyAgeyAiSVRBRzYiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDYgfSwKKyAgeyAiSVRBRzciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDcgfSwKKyAgeyAiSVRBRzgiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDggfSwKKyAgeyAiSVRBRzkiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMDkgfSwKKyAgeyAibGUuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMgfSwKKyAgeyAibGUuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIzIH0sCisgIHsgImxlLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMyB9LAorICB7ICJsZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjMgfSwKKyAgeyAibGUwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNiB9LAorICB7ICJsZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNCB9LAorICB7ICJsZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMiB9LAorICB7ICJsby5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgOCB9LAorICB7ICJsby5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTggfSwKKyAgeyAibG8udyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI4IH0sCisgIHsgImxzLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA3IH0sCisgIHsgImxzLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNyB9LAorICB7ICJscy53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjcgfSwKKyAgeyAibHQuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDQgfSwKKyAgeyAibHQuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI0IH0sCisgIHsgImx0LmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNCB9LAorICB7ICJsdC53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjQgfSwKKyAgeyAibHQwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNCB9LAorICB7ICJsdDAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMiB9LAorICB7ICJsdDAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMCB9LAorICB7ICJNSVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMSB9LAorICB7ICJNUEMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMCB9LAorICB7ICJuZS5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMSB9LAorICB7ICJuZS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjEgfSwKKyAgeyAibmUuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDExIH0sCisgIHsgIm5lLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMSB9LAorICB7ICJuZTAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCA1IH0sCisgIHsgIm5lMC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDEzIH0sCisgIHsgIm5lMC53IiwJVElDODBfT1BFUkFORF9DQyB8IDIxIH0sCisgIHsgIm5ldi5iIiwJVElDODBfT1BFUkFORF9DQyB8IDAgfSwKKyAgeyAibmV2LmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgOCB9LAorICB7ICJuZXYudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxNiB9LAorICB7ICJvYi5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjkgfSwKKyAgeyAib3IuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDMxIH0sCisgIHsgIm91LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNiB9LAorICB7ICJPVVRQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDAwMiB9LAorICB7ICJQS1RSRVEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhEIH0sCisgIHsgIlBQRVJST1IiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhBIH0sCisgIHsgInIwIiwJVElDODBfT1BFUkFORF9HUFIgfCAwIH0sCisgIHsgInIxIiwJVElDODBfT1BFUkFORF9HUFIgfCAxIH0sCisgIHsgInIxMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTAgfSwKKyAgeyAicjExIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMSB9LAorICB7ICJyMTIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEyIH0sCisgIHsgInIxMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTMgfSwKKyAgeyAicjE0IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNCB9LAorICB7ICJyMTUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE1IH0sCisgIHsgInIxNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTYgfSwKKyAgeyAicjE3IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNyB9LAorICB7ICJyMTgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE4IH0sCisgIHsgInIxOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTkgfSwKKyAgeyAicjIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIgfSwKKyAgeyAicjIwIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMCB9LAorICB7ICJyMjEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIxIH0sCisgIHsgInIyMiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjIgfSwKKyAgeyAicjIzIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMyB9LAorICB7ICJyMjQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI0IH0sCisgIHsgInIyNSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjUgfSwKKyAgeyAicjI2IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNiB9LAorICB7ICJyMjciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI3IH0sCisgIHsgInIyOCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjggfSwKKyAgeyAicjI5IiwJVElDODBfT1BFUkFORF9HUFIgfCAyOSB9LAorICB7ICJyMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMyB9LAorICB7ICJyMzAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMwIH0sCisgIHsgInIzMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMzEgfSwKKyAgeyAicjQiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDQgfSwKKyAgeyAicjUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDUgfSwKKyAgeyAicjYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDYgfSwKKyAgeyAicjciLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDcgfSwKKyAgeyAicjgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDggfSwKKyAgeyAicjkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDkgfSwKKyAgeyAiU1lTU1RLIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAgfSwKKyAgeyAiU1lTVE1QIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjEgfSwKKyAgeyAiVENPVU5UIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RSB9LAorICB7ICJUU0NBTEUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHhGIH0sCisgIHsgInVvLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzMCB9LAorfTsKKworY29uc3QgaW50IHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgPSBzaXplb2YgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scykgLyBzaXplb2YgKHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lIGluIE5BTUUsIHN5bWJvbCBjbGFzcworICAgaW4gQ0xBU1MsIGFuZCB0cmFuc2xhdGVzIGl0IHRvIGEgbnVtZXJpYyB2YWx1ZSwgd2hpY2ggaXQgcmV0dXJucy4KKworICAgSWYgQ0xBU1MgaXMgemVybywgYW55IHN5bWJvbCB0aGF0IG1hdGNoZXMgTkFNRSBpcyB0cmFuc2xhdGVkLiAgSWYKKyAgIENMQVNTIGlzIG5vbi16ZXJvLCB0aGVuIG9ubHkgYSBzeW1ib2wgdGhhdCBoYXMgY2xhc3MgQ0xBU1MgaXMKKyAgIG1hdGNoZWQuCisKKyAgIElmIG5vIHRyYW5zbGF0aW9uIGlzIHBvc3NpYmxlLCBpdCByZXR1cm5zIC0xLCBhIHZhbHVlIG5vdCB1c2VkIGJ5CisgICBhbnkgcHJlZGVmaW5lZCBzeW1ib2wuIE5vdGUgdGhhdCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgYXJyYXkgaXMKKyAgIHByZXNvcnRlZCBjYXNlIGluZGVwZW5kZW50bHkgYnkgbmFtZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgYXJlIG5vCisgICBkdXBsaWNhdGUgbmFtZXMgaW4gdGhlIHByZWRlZmluZWQgc3ltYm9sIGFycmF5LCB3aGljaCBoYXBwZW5zIHRvIGJlCisgICB0cnVlIGF0IHRoZSBtb21lbnQuCisKKyAqLworCitpbnQKK3RpYzgwX3N5bWJvbF90b192YWx1ZSAobmFtZSwgY2xhc3MpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBjbGFzczsKK3sKKyAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOworICBpbnQgbG93ID0gMDsKKyAgaW50IG1pZGRsZTsKKyAgaW50IGhpZ2ggPSB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzIC0gMTsKKyAgaW50IGNtcDsKKyAgaW50IHJ0bnZhbCA9IC0xOworCisgIHdoaWxlIChsb3cgPD0gaGlnaCkKKyAgICB7CisgICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOworICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzW21pZGRsZV0ubmFtZSk7CisgICAgICBpZiAoY21wIDwgMCkKKwl7CisJICBoaWdoID0gbWlkZGxlIC0gMTsKKwl9CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCXsKKwkgIGxvdyA9IG1pZGRsZSArIDE7CisJfQorICAgICAgZWxzZSAKKwl7CisJICBwZHNwID0gJnRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1ttaWRkbGVdOworCSAgaWYgKChjbGFzcyA9PSAwKSB8fCAoY2xhc3MgJiBQRFNfVkFMVUUgKHBkc3ApKSkKKwkgICAgeworCSAgICAgIHJ0bnZhbCA9IFBEU19WQUxVRSAocGRzcCk7CisJICAgIH0KKwkgIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBuYW1lcyAqLworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgcmV0dXJuIChydG52YWwpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgVkFMIGFuZCBmaW5kcyBhIG1hdGNoaW5nIHByZWRlZmluZWQKKyAgIHN5bWJvbCB0aGF0IGlzIGluIHRoZSBvcGVyYW5kIGNsYXNzIHNwZWNpZmllZCBieSBDTEFTUy4gIElmIENMQVNTCisgICBpcyB6ZXJvLCB0aGUgZmlyc3QgbWF0Y2hpbmcgc3ltYm9sIGlzIHJldHVybmVkLiAqLworCitjb25zdCBjaGFyICoKK3RpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsLCBjbGFzcykKKyAgICAgaW50IHZhbDsKKyAgICAgaW50IGNsYXNzOworeworICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7CisgIGludCBpdmFsOworICBjaGFyICpuYW1lOworCisgIG5hbWUgPSBOVUxMOworICBmb3IgKHBkc3AgPSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHM7CisgICAgICAgcGRzcCA8IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyArIHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHM7CisgICAgICAgcGRzcCsrKQorICAgIHsKKyAgICAgIGl2YWwgPSBQRFNfVkFMVUUgKHBkc3ApICYgflRJQzgwX09QRVJBTkRfTUFTSzsKKyAgICAgIGlmIChpdmFsID09IHZhbCkKKwl7CisJICBpZiAoKGNsYXNzID09IDApIHx8IChjbGFzcyAmIFBEU19WQUxVRSAocGRzcCkpKQorCSAgICB7CisJICAgICAgLyogRm91bmQgdGhlIGRlc2lyZWQgbWF0Y2ggKi8KKwkgICAgICBuYW1lID0gUERTX05BTUUgKHBkc3ApOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIChuYW1lKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzeW1ib2wgaW4gdGhlIHByZWRlZmluZWQKKyAgIHN5bWJvbCB0YWJsZSBhZnRlciBQRFNQLCBvciBOVUxMIGlmIFBEU1AgcG9pbnRzIHRvIHRoZSBsYXN0IHN5bWJvbC4gIElmCisgICBQRFNQIGlzIE5VTEwsIGl0IHJldHVybnMgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgdGFibGUuICBUaHVzIGl0IGNhbiBiZQorICAgdXNlZCB0byB3YWxrIHRocm91Z2ggdGhlIHRhYmxlIGJ5IGZpcnN0IGNhbGxpbmcgaXQgd2l0aCBOVUxMIGFuZCB0aGVuCisgICBjYWxsaW5nIGl0IHdpdGggZWFjaCB2YWx1ZSBpdCByZXR1cm5lZCBvbiB0aGUgcHJldmlvdXMgY2FsbCwgdW50aWwgaXQKKyAgIHJldHVybnMgTlVMTC4gKi8KKworY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICoKK3RpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wgKHBkc3ApCisgICAgIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKK3sKKyAgaWYgKHBkc3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBwZHNwID0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzOworICAgIH0KKyAgZWxzZSBpZiAocGRzcCA+PSB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgJiYKKwkgICBwZHNwIDwgdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICsgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyAtIDEpCisgICAgeworICAgICAgcGRzcCsrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBkc3AgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIChwZHNwKTsKK30KKworCisMCisvKiBUaGUgb3BlcmFuZHMgdGFibGUuICBUaGUgZmllbGRzIGFyZToKKworCWJpdHMsIHNoaWZ0LCBpbnNlcnRpb24gZnVuY3Rpb24sIGV4dHJhY3Rpb24gZnVuY3Rpb24sIGZsYWdzCisgKi8KKworY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgdGljODBfb3BlcmFuZHNbXSA9Cit7CisKKyAgLyogVGhlIHplcm8gaW5kZXggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIG9wZXJhbmRzLiAgKi8KKworI2RlZmluZSBVTlVTRUQgKDApCisgIHsgMCwgMCwgMCwgMCwgMCB9LAorCisgIC8qIFNob3J0IHNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgaW4gYml0cyAxNC0wLiAqLworCisjZGVmaW5lIFNTSSAoVU5VU0VEICsgMSkKKyAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBTaG9ydCB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgaW4gYml0cyAxNC0wICovCisKKyNkZWZpbmUgU1VJIChTU0kgKyAxKQorICB7IDE1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogU2hvcnQgdW5zaWduZWQgYml0ZmllbGQgaW4gYml0cyAxNC0wLiAgV2UgZGlzdGluZ3Vpc2ggdGhpcworICAgICBmcm9tIGEgcmVndWxhciB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWUgb25seSBmb3IgdGhlIGNvbnZlbmllbmNlCisgICAgIG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSB1c2VyLiAqLworCisjZGVmaW5lIFNVQkYgKFNVSSArIDEpCisgIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQklURklFTEQgfSwKKworICAvKiBMb25nIHNpZ25lZCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCisKKyNkZWZpbmUgTFNJIChTVUJGICsgMSkKKyAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBMb25nIHVuc2lnbmVkIGltbWVkaWF0ZSBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KKworI2RlZmluZSBMVUkgKExTSSArIDEpCisgIHsgMzIsIDAsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBMb25nIHVuc2lnbmVkIGJpdGZpZWxkIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZC4gIFdlIGRpc3Rpbmd1aXNoCisgICAgIHRoaXMgZnJvbSBhIHJlZ3VsYXIgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIG9ubHkgZm9yIHRoZQorICAgICBjb252ZW5pZW5jZSBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdXNlci4gKi8KKworI2RlZmluZSBMVUJGIChMVUkgKyAxKQorICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVEZJRUxEIH0sCisKKyAgLyogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdAorICAgICB3b3JkLiAqLworCisjZGVmaW5lIFNQRkkgKExVQkYgKyAxKQorICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0ZMT0FUIH0sCisKKyAgLyogUmVnaXN0ZXIgaW4gYml0cyA0LTAgKi8KKworI2RlZmluZSBSRUdfMCAoU1BGSSArIDEpCisgIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfSwKKworICAvKiBFdmVuIHJlZ2lzdGVyIGluIGJpdHMgNC0wICovCisKKyNkZWZpbmUgUkVHXzBfRSAoUkVHXzAgKyAxKQorICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCisKKyAgLyogUmVnaXN0ZXIgaW4gYml0cyAyNi0yMiAqLworCisjZGVmaW5lIFJFR18yMiAoUkVHXzBfRSArIDEpCisgIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCisKKyAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDI2LTIyICovCisKKyNkZWZpbmUgUkVHXzIyX0UgKFJFR18yMiArIDEpCisgIHsgNSwgMjIsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9FVkVOIH0sCisKKyAgLyogUmVnaXN0ZXIgaW4gYml0cyAzMS0yNyAqLworCisjZGVmaW5lIFJFR19ERVNUIChSRUdfMjJfRSArIDEpCisgIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCisKKyAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDMxLTI3ICovCisKKyNkZWZpbmUgUkVHX0RFU1RfRSAoUkVHX0RFU1QgKyAxKQorICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAorCisgIC8qIEZsb2F0aW5nIHBvaW50IGFjY3VtdWxhdG9yIHJlZ2lzdGVyIChhMC1hMykgc3BlY2lmaWVkIGJ5IGJpdCAxNiAoTVNCKQorICAgICBhbmQgYml0IDExIChMU0IpICovCisgIC8qIEZJWE1FISAgTmVlZHMgdG8gdXNlIGZ1bmN0aW9ucyB0byBpbnNlcnQgYW5kIGV4dHJhY3QgdGhlIHJlZ2lzdGVyCisgICAgIG51bWJlciBpbiBiaXRzIDE2IGFuZCAxMS4gKi8KKworI2RlZmluZSBSRUdfRlBBIChSRUdfREVTVF9FICsgMSkKKyAgeyAwLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0ZQQSB9LAorCisgIC8qIFNob3J0IHNpZ25lZCBQQyB3b3JkIG9mZnNldCBpbiBiaXRzIDE0LTAgKi8KKworI2RlZmluZSBPRkZfU1NfUEMgKFJFR19GUEEgKyAxKQorICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1BDUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBMb25nIHNpZ25lZCBQQyB3b3JkIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KKworI2RlZmluZSBPRkZfU0xfUEMgKE9GRl9TU19QQyArIDEpCisgIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfUENSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFNob3J0IHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGJpdHMgMTQtMCAqLworCisjZGVmaW5lIE9GRl9TU19CUiAoT0ZGX1NMX1BDICsgMSkKKyAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBMb25nIHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLworCisjZGVmaW5lIE9GRl9TTF9CUiAoT0ZGX1NTX0JSICsgMSkKKyAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBMb25nIHNpZ25lZCBiYXNlIHJlbGF0aXZlIGJ5dGUgb2Zmc2V0IGluIGZvbGxvd2luZyAzMiBiaXQgd29yZAorICAgICB3aXRoIG9wdGlvbmFsICI6cyIgbW9kaWZpZXIgZmxhZyBpbiBiaXQgMTEgKi8KKworI2RlZmluZSBPRkZfU0xfQlJfU0NBTEVEIChPRkZfU0xfQlIgKyAxKQorICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JBU0VSRUwgfCBUSUM4MF9PUEVSQU5EX1NJR05FRCB8IFRJQzgwX09QRVJBTkRfU0NBTEVEIH0sCisKKyAgLyogQklUTlVNIGluIGJpdHMgMzEtMjcgKi8KKworI2RlZmluZSBCSVROVU0gKE9GRl9TTF9CUl9TQ0FMRUQgKyAxKQorICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVE5VTSB9LAorCisgIC8qIENvbmRpdGlvbiBjb2RlIGluIGJpdHMgMzEtMjcgKi8KKworI2RlZmluZSBDQyAoQklUTlVNICsgMSkKKyAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DQyB9LAorCisgIC8qIENvbnRyb2wgcmVnaXN0ZXIgbnVtYmVyIGluIGJpdHMgMTQtMCAqLworCisjZGVmaW5lIENSX1NJIChDQyArIDEpCisgIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ1IgfSwKKworICAvKiBDb250cm9sIHJlZ2lzdGVyIG51bWJlciBpbiBuZXh0IDMyIGJpdCB3b3JkICovCisKKyNkZWZpbmUgQ1JfTEkgKENSX1NJICsgMSkKKyAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9DUiB9LAorCisgIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMgKi8KKworI2RlZmluZSBSRUdfQkFTRSAoQ1JfTEkgKyAxKQorICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIH0sCisKKyAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucywgd2l0aCBvcHRpb25hbCAiOm0iCisgICAgIGZsYWcgaW4gYml0IDE3IChzaG9ydCBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zIG9ubHkpICovCisKKyNkZWZpbmUgUkVHX0JBU0VfTV9TSSAoUkVHX0JBU0UgKyAxKQorICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIHwgVElDODBfT1BFUkFORF9NX1NJIH0sCisKKyAgLyogQSBiYXNlIHJlZ2lzdGVyIGluIGJpdHMgMjYtMjIsIGVuY2xvc2VkIGluIHBhcmVucywgd2l0aCBvcHRpb25hbCAiOm0iCisgICBmbGFnIGluIGJpdCAxNSAobG9uZyBpbW1lZGlhdGUgYW5kIHJlZ2lzdGVyIGluc3RydWN0aW9ucyBvbmx5KSAqLworCisjZGVmaW5lIFJFR19CQVNFX01fTEkgKFJFR19CQVNFX01fU0kgKyAxKQorICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfUEFSRU5TIHwgVElDODBfT1BFUkFORF9NX0xJIH0sCisKKyAgLyogU2NhbGVkIHJlZ2lzdGVyIGluIGJpdHMgNC0wLCB3aXRoIG9wdGlvbmFsICI6cyIgbW9kaWZpZXIgZmxhZyBpbiBiaXQgMTEgKi8KKworI2RlZmluZSBSRUdfU0NBTEVEIChSRUdfQkFTRV9NX0xJICsgMSkKKyAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfU0NBTEVEIH0sCisKKyAgLyogVW5zaWduZWQgaW1tZWRpYXRlIGluIGJpdHMgNC0wLCB1c2VkIG9ubHkgZm9yIHNoaWZ0IGluc3RydWN0aW9ucyAqLworCisjZGVmaW5lIFJPVEFURSAoUkVHX1NDQUxFRCArIDEpCisgIHsgNSwgMCwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFVuc2lnbmVkIGltbWVkaWF0ZSBpbiBiaXRzIDktNSwgdXNlZCBvbmx5IGZvciBzaGlmdCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgRU5ETUFTSyAoUk9UQVRFICsgMSkKKyAgeyA1LCA1LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0VORE1BU0sgfSwKKworfTsKKworY29uc3QgaW50IHRpYzgwX251bV9vcGVyYW5kcyA9IHNpemVvZiAodGljODBfb3BlcmFuZHMpL3NpemVvZigqdGljODBfb3BlcmFuZHMpOworCisMCisvKiBNYWNyb3MgdXNlZCB0byBnZW5lcmF0ZSBlbnRyaWVzIGZvciB0aGUgb3Bjb2RlcyB0YWJsZS4gKi8KKworI2RlZmluZSBGSVhNRSAwCisKKy8qIFNob3J0LUltbWVkaWF0ZSBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCisjZGVmaW5lIE9QX1NJKHgpCSgoKHgpICYgMHg3RikgPDwgMTUpCisjZGVmaW5lIE1BU0tfU0kJCU9QX1NJKDB4N0YpCisKKy8qIExvbmctSW1tZWRpYXRlIEZvcm1hdCBJbnN0cnVjdGlvbnMgLSBiYXNpYyBvcGNvZGUgKi8KKyNkZWZpbmUgT1BfTEkoeCkJKCgoeCkgJiAweDNGRikgPDwgMTIpCisjZGVmaW5lIE1BU0tfTEkJCU9QX0xJKDB4M0ZGKQorCisvKiBSZWdpc3RlciBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCisjZGVmaW5lIE9QX1JFRyh4KQlPUF9MSSh4KQkvKiBGb3IgcmVhZGFiaWxpdHkgKi8KKyNkZWZpbmUgTUFTS19SRUcJTUFTS19MSQkJLyogRm9yIHJlYWRhYmlsaXR5ICovCisKKy8qIFRoZSAnbicgYml0IGF0IGJpdCAxMCAqLworI2RlZmluZSBuKHgpCQkoKHgpIDw8IDEwKQorCisvKiBUaGUgJ2knIGJpdCBhdCBiaXQgMTEgKi8KKyNkZWZpbmUgaSh4KQkJKCh4KSA8PCAxMSkKKworLyogVGhlICdGJyBiaXQgYXQgYml0IDI3ICovCisjZGVmaW5lIEYoeCkJCSgoeCkgPDwgMjcpCisKKy8qIFRoZSAnRScgYml0IGF0IGJpdCAyNyAqLworI2RlZmluZSBFKHgpCQkoKHgpIDw8IDI3KQorCisvKiBUaGUgJ00nIGJpdCBhdCBiaXQgMTUgaW4gcmVnaXN0ZXIgYW5kIGxvbmcgaW1tZWRpYXRlIG9wY29kZXMgKi8KKyNkZWZpbmUgTV9SRUcoeCkJKCh4KSA8PCAxNSkKKyNkZWZpbmUgTV9MSSh4KQkJKCh4KSA8PCAxNSkKKworLyogVGhlICdNJyBiaXQgYXQgYml0IDE3IGluIHNob3J0IGltbWVkaWF0ZSBvcGNvZGVzICovCisjZGVmaW5lIE1fU0koeCkJCSgoeCkgPDwgMTcpCisKKy8qIFRoZSAnU1onIGZpZWxkIGF0IGJpdHMgMTQtMTMgaW4gcmVnaXN0ZXIgYW5kIGxvbmcgaW1tZWRpYXRlIG9wY29kZXMgKi8KKyNkZWZpbmUgU1pfUkVHKHgpCSgoeCkgPDwgMTMpCisjZGVmaW5lIFNaX0xJKHgpCSgoeCkgPDwgMTMpCisKKy8qIFRoZSAnU1onIGZpZWxkIGF0IGJpdHMgMTYtMTUgaW4gc2hvcnQgaW1tZWRpYXRlIG9wY29kZXMgKi8KKyNkZWZpbmUgU1pfU0koeCkJKCh4KSA8PCAxNSkKKworLyogVGhlICdEJyAoZGlyZWN0IGV4dGVybmFsIG1lbW9yeSBhY2Nlc3MpIGJpdCBhdCBiaXQgMTAgaW4gbG9uZyBpbW1lZGlhdGUKKyAgIGFuZCByZWdpc3RlciBvcGNvZGVzLiAqLworI2RlZmluZSBEKHgpCQkoKHgpIDw8IDEwKQorCisvKiBUaGUgJ1MnIChzY2FsZSBvZmZzZXQgYnkgZGF0YSBzaXplKSBiaXQgYXQgYml0IDExIGluIGxvbmcgaW1tZWRpYXRlCisgICBhbmQgcmVnaXN0ZXIgb3Bjb2Rlcy4gKi8KKyNkZWZpbmUgUyh4KQkJKCh4KSA8PCAxMSkKKworLyogVGhlICdQRCcgZmllbGQgYXQgYml0cyAxMC05IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLworI2RlZmluZSBQRCh4KQkJKCh4KSA8PCA5KQorCisvKiBUaGUgJ1AyJyBmaWVsZCBhdCBiaXRzIDgtNyBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgUDIoeCkJCSgoeCkgPDwgNykKKworLyogVGhlICdQMScgZmllbGQgYXQgYml0cyA2LTUgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFAxKHgpCQkoKHgpIDw8IDUpCisKKy8qIFRoZSAnYScgZmllbGQgYXQgYml0IDE2IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgVl9hMSh4KQkJKCh4KSA8PCAxNikKKworLyogVGhlICdhJyBmaWVsZCBhdCBiaXQgMTEgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBWX2EwKHgpCQkoKHgpIDw8IDExKQorCisvKiBUaGUgJ20nIGZpZWxkIGF0IGJpdCAxMCBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFZfbSh4KQkJKCh4KSA8PCAxMCkKKworLyogVGhlICdTJyBmaWVsZCBhdCBiaXQgOSBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFZfUyh4KQkJKCh4KSA8PCA5KQorCisvKiBUaGUgJ1onIGZpZWxkIGF0IGJpdCA4IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgVl9aKHgpCQkoKHgpIDw8IDgpCisKKy8qIFRoZSAncCcgZmllbGQgYXQgYml0IDYgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBWX3AoeCkJCSgoeCkgPDwgNikKKworLyogVGhlIG9wY29kZSBmaWVsZCBhdCBiaXRzIDIxLTE3IGZvciB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIE9QX1YoeCkJCSgoeCkgPDwgMTcpCisjZGVmaW5lIE1BU0tfVgkJT1BfVigweDFGKQorCisMCisvKiBUaGUgb3Bjb2RlIHRhYmxlLiAgRm9ybWF0dGVkIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgb24gYSB3aWRlIHNjcmVlbi4gIEFsc28sIGFsbAorIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtbmVtb25pYyBhcmUgc29ydGVkIHNvIHRoYXQgdGhleSBhcmUgYWRqYWNlbnQgaW4gdGhlIHRhYmxlLAorIGFsbG93aW5nIHRoZSB1c2Ugb2YgYSBoYXNoIHRhYmxlIHRvIGxvY2F0ZSB0aGUgZmlyc3Qgb2YgYSBzZXF1ZW5jZSBvZiBvcGNvZGVzIHRoYXQgaGF2ZQorIGEgcGFydGljdWxhciBuYW1lLiAgVGhlIHNob3J0IGltbWVkaWF0ZSBmb3JtcyBhbHNvIGNvbWUgYmVmb3JlIHRoZSBsb25nIGltbWVkaWF0ZSBmb3JtcworIHNvIHRoYXQgdGhlIGFzc2VtYmxlciB3aWxsIHBpY2sgdGhlICJiZXN0IGZpdCIgZm9yIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kLCBleGNlcHQgZm9yCisgdGhlIGNhc2Ugb2YgdGhlIFBDIHJlbGF0aXZlIGZvcm1zLCB3aGVyZSB0aGUgbG9uZyBmb3JtcyBjb21lIGZpcnN0IGFuZCBhcmUgdGhlIGRlZmF1bHQKKyBmb3Jtcy4gKi8KKworY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSB0aWM4MF9vcGNvZGVzW10gPSB7CisKKyAgLyogVGhlICJub3AiIGluc3RydWN0aW9uIGlzIHJlYWxseSAicmRjciAwLHIwIi4gIFdlIHB1dCBpdCBmaXJzdCBzbyB0aGF0IHRoaXMKKyAgICAgc3BlY2lmaWMgYml0IHBhdHRlcm4gd2lsbCBnZXQgZGlzYXNzZW1ibGVkIGFzIGEgbm9wIHJhdGhlciB0aGFuIGFuIHJkY3IuIFRoZQorICAgICBtYXNrIG9mIGFsbCBvbmVzIGVuc3VyZXMgdGhhdCB0aGlzIHdpbGwgaGFwcGVuLiAqLworCisgIHsibm9wIiwJT1BfU0koMHg0KSwJfjAsCQkwLAkJezB9CQkJfSwKKworICAvKiBUaGUgImJyIiBpbnN0cnVjdGlvbiBpcyByZWFsbHkgImJieiB0YXJnZXQscjAsMzEiLiAgV2UgcHV0IGl0IGZpcnN0IHNvIHRoYXQKKyAgICAgdGhpcyBzcGVjaWZpYyBiaXQgcGF0dGVybiB3aWxsIGdldCBkaXNhc3NlbWJsZWQgYXMgYSBiciByYXRoZXIgdGhhbiBiYnouICovCisKKyAgeyJiciIsCU9QX1NJKDB4NDgpLAkweEZGRkY4MDAwLAkwLAl7T0ZGX1NTX1BDfQl9LAorICB7ImJyIiwJT1BfTEkoMHgzOTEpLAkweEZGRkZGMDAwLAkwLAl7T0ZGX1NMX1BDfQl9LAorICB7ImJyIiwJT1BfUkVHKDB4MzkwKSwJMHhGRkZGRjAwMCwJMCwJe1JFR18wfQkJfSwKKyAgeyJici5hIiwJT1BfU0koMHg0OSksCTB4RkZGRjgwMDAsCTAsCXtPRkZfU1NfUEN9CX0sCisgIHsiYnIuYSIsCU9QX0xJKDB4MzkzKSwJMHhGRkZGRjAwMCwJMCwJe09GRl9TTF9QQ30JfSwKKyAgeyJici5hIiwJT1BfUkVHKDB4MzkyKSwJMHhGRkZGRjAwMCwJMCwJe1JFR18wfQkJfSwKKworICAvKiBTaWduZWQgaW50ZWdlciBBREQgKi8KKworICB7ImFkZCIsCU9QX1NJKDB4NTgpLAlNQVNLX1NJLAkwLAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJhZGQiLAlPUF9MSSgweDNCMSksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7ImFkZCIsCU9QX1JFRygweDNCMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogVW5zaWduZWQgaW50ZWdlciBBREQgKi8KKworICB7ImFkZHUiLAlPUF9TSSgweDU5KSwJTUFTS19TSSwJMCwJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCisgIHsiYWRkdSIsCU9QX0xJKDB4M0IzKSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCisgIHsiYWRkdSIsCU9QX1JFRygweDNCMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogQml0d2lzZSBBTkQgKi8KKworICB7ImFuZCIsCU9QX1NJKDB4MTEpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJhbmQiLAlPUF9MSSgweDMyMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImFuZCIsCU9QX1JFRygweDMyMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiYW5kLnR0IiwJT1BfU0koMHgxMSksCU1BU0tfU0ksCTAsCXtTVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImFuZC50dCIsCU9QX0xJKDB4MzIzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiYW5kLnR0IiwJT1BfUkVHKDB4MzIyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKworICAvKiBCaXR3aXNlIEFORCB3aXRoIG9uZXMgY29tcGxlbWVudCBvZiBib3RoIHNvdXJjZXMgKi8KKworICB7ImFuZC5mZiIsCU9QX1NJKDB4MTgpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJhbmQuZmYiLAlPUF9MSSgweDMzMSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImFuZC5mZiIsCU9QX1JFRygweDMzMCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2Ygc291cmNlIDEgKi8KKworICB7ImFuZC5mdCIsCU9QX1NJKDB4MTQpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJhbmQuZnQiLAlPUF9MSSgweDMyOSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImFuZC5mdCIsCU9QX1JFRygweDMyOCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2Ygc291cmNlIDIgKi8KKworICB7ImFuZC50ZiIsCU9QX1NJKDB4MTIpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJhbmQudGYiLAlPUF9MSSgweDMyNSksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImFuZC50ZiIsCU9QX1JFRygweDMyNCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogQnJhbmNoIEJpdCBPbmUgLSBub25hbm51bGxlZCAqLworCisgIHsiYmJvIiwJT1BfU0koMHg0QSksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKKyAgeyJiYm8iLAlPUF9MSSgweDM5NSksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKKyAgeyJiYm8iLAlPUF9SRUcoMHgzOTQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCisKKyAgLyogQnJhbmNoIEJpdCBPbmUgLSBhbm51bGxlZCAqLworCisgIHsiYmJvLmEiLAlPUF9TSSgweDRCKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAorICB7ImJiby5hIiwJT1BfTEkoMHgzOTcpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCisgIHsiYmJvLmEiLAlPUF9SRUcoMHgzOTYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCisKKyAgLyogQnJhbmNoIEJpdCBaZXJvIC0gbm9uYW5udWxsZWQgKi8KKworICB7ImJieiIsCU9QX1NJKDB4NDgpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCisgIHsiYmJ6IiwJT1BfTEkoMHgzOTEpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCisgIHsiYmJ6IiwJT1BfUkVHKDB4MzkwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAorCisgIC8qIEJyYW5jaCBCaXQgWmVybyAtIGFubnVsbGVkICovCisKKyAgeyJiYnouYSIsCU9QX1NJKDB4NDkpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCisgIHsiYmJ6LmEiLAlPUF9MSSgweDM5MyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKKyAgeyJiYnouYSIsCU9QX1JFRygweDM5MiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKKworICAvKiBCcmFuY2ggQ29uZGl0aW9uYWwgLSBub25hbm51bGxlZCAqLworCisgIHsiYmNuZCIsCU9QX1NJKDB4NEMpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBDQ30JfSwKKyAgeyJiY25kIiwJT1BfTEkoMHgzOTkpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBDQ30JfSwKKyAgeyJiY25kIiwJT1BfUkVHKDB4Mzk4KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBDQ30JfSwKKworICAvKiBCcmFuY2ggQ29uZGl0aW9uYWwgLSBhbm51bGxlZCAqLworCisgIHsiYmNuZC5hIiwJT1BfU0koMHg0RCksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIENDfQl9LAorICB7ImJjbmQuYSIsCU9QX0xJKDB4MzlCKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQ0N9CX0sCisgIHsiYmNuZC5hIiwJT1BfUkVHKDB4MzlBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBDQ30JfSwKKworICAvKiBCcmFuY2ggQ29udHJvbCBSZWdpc3RlciAqLworCisgIHsiYnJjciIsCU9QX1NJKDB4NiksCU1BU0tfU0ksCTAsCXtDUl9TSX0JfSwKKyAgeyJicmNyIiwJT1BfTEkoMHgzMEQpLAlNQVNLX0xJLAkwLAl7Q1JfTEl9CX0sCisgIHsiYnJjciIsCU9QX1JFRygweDMwQyksCU1BU0tfUkVHLAkwLAl7UkVHXzB9CX0sCisKKyAgLyogQnJhbmNoIGFuZCBzYXZlIHJldHVybiAtIG5vbmFubnVsbGVkICovCisKKyAgeyJic3IiLAlPUF9TSSgweDQwKSwJTUFTS19TSSwJMCwJe09GRl9TU19QQywgUkVHX0RFU1R9CX0sCisgIHsiYnNyIiwJT1BfTEkoMHgzODEpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHX0RFU1R9CX0sCisgIHsiYnNyIiwJT1BfUkVHKDB4MzgwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCisKKyAgLyogQnJhbmNoIGFuZCBzYXZlIHJldHVybiAtIGFubnVsbGVkICovCisKKyAgeyJic3IuYSIsCU9QX1NJKDB4NDEpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHX0RFU1R9CX0sCisgIHsiYnNyLmEiLAlPUF9MSSgweDM4MyksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfREVTVH0JfSwKKyAgeyJic3IuYSIsCU9QX1JFRygweDM4MiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAorCisgIC8qIFNlbmQgY29tbWFuZCAqLworCisgIHsiY21uZCIsCU9QX1NJKDB4MiksCU1BU0tfU0ksCTAsIAl7U1VJfQl9LAorICB7ImNtbmQiLAlPUF9MSSgweDMwNSksCU1BU0tfTEksCTAsIAl7TFVJfQl9LAorICB7ImNtbmQiLAlPUF9SRUcoMHgzMDQpLAlNQVNLX1JFRywJMCwJe1JFR18wfQl9LAorCisgIC8qIEludGVnZXIgY29tcGFyZSAqLworCisgIHsiY21wIiwJT1BfU0koMHg1MCksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJjbXAiLAlPUF9MSSgweDNBMSksCU1BU0tfTEksCTAsIAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJjbXAiLAlPUF9SRUcoMHgzQTApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIEZsdXNoIGRhdGEgY2FjaGUgc3ViYmxvY2sgLSBkb24ndCBjbGVhciBzdWJibG9jayBwcmVzZXQgZmxhZyAqLworCisgIHsiZGNhY2hlYyIsCU9QX1NJKDB4MzgpLAlGKDEpIHwgKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJCTAsIHtTU0ksIFJFR19CQVNFX01fU0l9CQl9LAorICB7ImRjYWNoZWMiLAlPUF9MSSgweDM3MSksCUYoMSkgfCAoTUFTS19MSSAgJiB+TV9MSSgxKSkgIHwgUygxKSB8IEQoMSksCTAsIHtMU0ksIFJFR19CQVNFX01fTEl9CQl9LAorICB7ImRjYWNoZWMiLAlPUF9SRUcoMHgzNzApLAlGKDEpIHwgKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IFMoMSkgfCBEKDEpLAkwLCB7UkVHXzAsIFJFR19CQVNFX01fTEl9CX0sCisKKyAgLyogRmx1c2ggZGF0YSBjYWNoZSBzdWJibG9jayAtIGNsZWFyIHN1YmJsb2NrIHByZXNldCBmbGFnICovCisKKyAgeyJkY2FjaGVmIiwJT1BfU0koMHgzOCkgICB8IEYoMSksCUYoMSkgfCAoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkJMCwge1NTSSwgUkVHX0JBU0VfTV9TSX0JCX0sCisgIHsiZGNhY2hlZiIsCU9QX0xJKDB4MzcxKSAgfCBGKDEpLAlGKDEpIHwgKE1BU0tfTEkgICYgfk1fTEkoMSkpICAgfCBTKDEpIHwgRCgxKSwJMCwge0xTSSwgUkVHX0JBU0VfTV9MSX0JCX0sCisgIHsiZGNhY2hlZiIsCU9QX1JFRygweDM3MCkgfCBGKDEpLAlGKDEpIHwgKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IFMoMSkgfCBEKDEpLAkwLCB7UkVHXzAsIFJFR19CQVNFX01fTEl9CX0sCisKKyAgLyogRGlyZWN0IGxvYWQgc2lnbmVkIGRhdGEgaW50byByZWdpc3RlciAqLworCisgIHsiZGxkIiwJT1BfTEkoMHgzNDUpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCisgIHsiZGxkIiwJT1BfUkVHKDB4MzQ0KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAorICB7ImRsZC5iIiwJT1BfTEkoMHgzNDEpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCisgIHsiZGxkLmIiLAlPUF9SRUcoMHgzNDApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCisgIHsiZGxkLmQiLAlPUF9MSSgweDM0NykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAorICB7ImRsZC5kIiwJT1BfUkVHKDB4MzQ2KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCisgIHsiZGxkLmgiLAlPUF9MSSgweDM0MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJkbGQuaCIsCU9QX1JFRygweDM0MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKKworICAvKiBEaXJlY3QgbG9hZCB1bnNpZ25lZCBkYXRhIGludG8gcmVnaXN0ZXIgKi8KKworICB7ImRsZC51YiIsCU9QX0xJKDB4MzUxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiAgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJkbGQudWIiLAlPUF9SRUcoMHgzNTApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSAgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAorICB7ImRsZC51aCIsCU9QX0xJKDB4MzUzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiAgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJkbGQudWgiLAlPUF9SRUcoMHgzNTIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSAgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAorCisgIC8qIERpcmVjdCBzdG9yZSBkYXRhIGludG8gbWVtb3J5ICovCisKKyAgeyJkc3QiLAlPUF9MSSgweDM2NSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJkc3QiLAlPUF9SRUcoMHgzNjQpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCisgIHsiZHN0LmIiLAlPUF9MSSgweDM2MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJkc3QuYiIsCU9QX1JFRygweDM2MCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKKyAgeyJkc3QuZCIsCU9QX0xJKDB4MzY3KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCisgIHsiZHN0LmQiLAlPUF9SRUcoMHgzNjYpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKKyAgeyJkc3QuaCIsCU9QX0xJKDB4MzYzKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAorICB7ImRzdC5oIiwJT1BfUkVHKDB4MzYyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAorCisgIC8qIEVtdWxhdGlvbiBzdG9wICovCisKKyAgeyJlc3RvcCIsCU9QX0xJKDB4M0ZDKSwJTUFTS19MSSwJMCwJCXswfQl9LAorCisgIC8qIEVtdWxhdGlvbiB0cmFwICovCisKKyAgeyJldHJhcCIsCU9QX1NJKDB4MSkgICAgfCBFKDEpLAlNQVNLX1NJICB8IEUoMSksCTAsCXtTVUl9CX0sCisgIHsiZXRyYXAiLAlPUF9MSSgweDMwMykgIHwgRSgxKSwJTUFTS19MSSAgfCBFKDEpLAkwLAl7TFVJfQl9LAorICB7ImV0cmFwIiwJT1BfUkVHKDB4MzAyKSB8IEUoMSksCU1BU0tfUkVHIHwgRSgxKSwJMCwJe1JFR18wfQl9LAorCisgIC8qIEZsb2F0aW5nLXBvaW50IGFkZGl0aW9uICovCisKKyAgeyJmYWRkLmRkZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAorICB7ImZhZGQuZHNkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAorICB7ImZhZGQuc2RkIiwJT1BfTEkoMHgzRTEpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZmFkZC5zZGQiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZmFkZC5zc2QiLAlPUF9MSSgweDNFMSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCisgIHsiZmFkZC5zc2QiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAorICB7ImZhZGQuc3NzIiwJT1BfTEkoMHgzRTEpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJmYWRkLnNzcyIsCU9QX1JFRygweDNFMCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIEZsb2F0aW5nIHBvaW50IGNvbXBhcmUgKi8KKworICB7ImZjbXAuZGQiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAorICB7ImZjbXAuZHMiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJmY21wLnNkIiwJT1BfTEkoMHgzRUIpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKKyAgeyJmY21wLnNkIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCisgIHsiZmNtcC5zcyIsCU9QX0xJKDB4M0VCKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImZjbXAuc3MiLAlPUF9SRUcoMHgzRUEpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogRmxvYXRpbmcgcG9pbnQgZGl2aWRlICovCisKKyAgeyJmZGl2LmRkZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAorICB7ImZkaXYuZHNkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAorICB7ImZkaXYuc2RkIiwJT1BfTEkoMHgzRTcpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZmRpdi5zZGQiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZmRpdi5zc2QiLAlPUF9MSSgweDNFNykgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCisgIHsiZmRpdi5zc2QiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAorICB7ImZkaXYuc3NzIiwJT1BfTEkoMHgzRTcpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJmZGl2LnNzcyIsCU9QX1JFRygweDNFNikgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIEZsb2F0aW5nIHBvaW50IG11bHRpcGx5ICovCisKKyAgeyJmbXB5LmRkZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAorICB7ImZtcHkuZHNkIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAorICB7ImZtcHkuaWlpIiwJT1BfTEkoMHgzRTUpICB8IFBEKDIpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImZtcHkuaWlpIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiZm1weS5zZGQiLAlPUF9MSSgweDNFNSkgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmbXB5LnNkZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmbXB5LnNzZCIsCU9QX0xJKDB4M0U1KSAgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmbXB5LnNzZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCisgIHsiZm1weS5zc3MiLAlPUF9MSSgweDNFNSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ImZtcHkuc3NzIiwJT1BfUkVHKDB4M0U0KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiZm1weS51dXUiLAlPUF9MSSgweDNFNSkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMVUksIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiZm1weS51dXUiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKworICAvKiBDb252ZXJ0L1JvdW5kIHRvIE1pbnVzIEluZmluaXR5ICovCisKKyAgeyJmcm5kbS5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG0uZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kbS5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAorICB7ImZybmRtLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG0uaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG0uaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmcm5kbS5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG0uaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG0uc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmRtLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG0uc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kbS5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kbS5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAorICB7ImZybmRtLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorICB7ImZybmRtLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG0uc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG0udWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG0udWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmcm5kbS51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG0udXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisKKyAgLyogQ29udmVydC9Sb3VuZCB0byBOZWFyZXN0ICovCisKKyAgeyJmcm5kbi5kZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG4uZGkiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kbi5kcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAorICB7ImZybmRuLmR1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG4uaWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG4uaWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmcm5kbi5pcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG4uaXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG4uc2QiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmRuLnNkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG4uc2kiLAlPUF9MSSgweDNFOSkgIHwgUEQoMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kbi5zaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kbi5zcyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAorICB7ImZybmRuLnNzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorICB7ImZybmRuLnN1IiwJT1BfTEkoMHgzRTkpICB8IFBEKDMpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG4uc3UiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG4udWQiLAlPUF9MSSgweDNFOSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZG4udWQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmcm5kbi51cyIsCU9QX0xJKDB4M0U5KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZG4udXMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisKKyAgLyogQ29udmVydC9Sb3VuZCB0byBQb3NpdGl2ZSBJbmZpbml0eSAqLworCisgIHsiZnJuZHAuZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmRwLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZHAuZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kcC5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAorICB7ImZybmRwLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmRwLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZHAuaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAorICB7ImZybmRwLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorICB7ImZybmRwLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmcm5kcC5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmRwLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZHAuc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZHAuc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kcC5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kcC5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAorICB7ImZybmRwLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorICB7ImZybmRwLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMikgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmRwLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZHAudXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigyKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAorICB7ImZybmRwLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorCisgIC8qIENvbnZlcnQvUm91bmQgdG8gWmVybyAqLworCisgIHsiZnJuZHouZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmR6LmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZHouZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kei5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAorICB7ImZybmR6LmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmR6LmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZHouaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAorICB7ImZybmR6LmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorICB7ImZybmR6LnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKKyAgeyJmcm5kei5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmR6LnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZHouc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCisgIHsiZnJuZHouc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kei5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKKyAgeyJmcm5kei5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAorICB7ImZybmR6LnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorICB7ImZybmR6LnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAorICB7ImZybmR6LnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnJuZHoudXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigxKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAorICB7ImZybmR6LnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAorCisgIC8qIEZsb2F0aW5nIHBvaW50IHNxdWFyZSByb290ICovCisKKyAgeyJmc3FydC5kZCIsCU9QX1JFRygweDNFRSkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUX0V9CX0sCisgIHsiZnNxcnQuc2QiLAlPUF9MSSgweDNFRikgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVF9FfQl9LAorICB7ImZzcXJ0LnNkIiwJT1BfUkVHKDB4M0VFKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCisgIHsiZnNxcnQuc3MiLAlPUF9MSSgweDNFRikgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKKyAgeyJmc3FydC5zcyIsCU9QX1JFRygweDNFRSkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKKworICAvKiBGbG9hdGluZyBwb2ludCBzdWJ0cmFjdGlvbiAqLworCisgIHsgImZzdWIuZGRkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCisgIHsgImZzdWIuZHNkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAorICB7ICJmc3ViLnNkZCIsCU9QX0xJKDB4M0UzKSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAorICB7ICJmc3ViLnNkZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKKyAgeyAiZnN1Yi5zc2QiLAlPUF9MSSgweDNFMykgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCisgIHsgImZzdWIuc3NkIiwJT1BfUkVHKDB4M0UyKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKKyAgeyAiZnN1Yi5zc3MiLAlPUF9MSSgweDNFMykgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7ICJmc3ViLnNzcyIsCU9QX1JFRygweDNFMikgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIElsbGVnYWwgaW5zdHJ1Y3Rpb25zICovCisKKyAgeyJpbGxvcDAiLAlPUF9TSSgweDApLAlNQVNLX1NJLAkwLAl7MH0JfSwKKyAgeyJpbGxvcEYiLAkweDFGRiA8PCAxMywJMHgxRkYgPDwgMTMsCTAsCXswfQl9LAorCisgIC8qIEp1bXAgYW5kIHNhdmUgcmV0dXJuICovCisKKyAgeyJqc3IiLAlPUF9TSSgweDQ0KSwJTUFTS19TSSwJMCwJe09GRl9TU19CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAorICB7ImpzciIsCU9QX0xJKDB4Mzg5KSwJTUFTS19MSSwJMCwJe09GRl9TTF9CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAorICB7ImpzciIsCU9QX1JFRygweDM4OCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKKyAgeyJqc3IuYSIsCU9QX1NJKDB4NDUpLAlNQVNLX1NJLAkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCisgIHsianNyLmEiLAlPUF9MSSgweDM4QiksCU1BU0tfTEksCTAsCXtPRkZfU0xfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKKyAgeyJqc3IuYSIsCU9QX1JFRygweDM4QSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKKworICAvKiBMb2FkIFNpZ25lZCBEYXRhIEludG8gUmVnaXN0ZXIgKi8KKworICB7ImxkIiwJT1BfU0koMHgyMiksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCisgIHsibGQiLAlPUF9MSSgweDM0NSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJsZCIsCU9QX1JFRygweDM0NCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKKyAgeyJsZC5iIiwJT1BfU0koMHgyMCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCisgIHsibGQuYiIsCU9QX0xJKDB4MzQxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAorICB7ImxkLmIiLAlPUF9SRUcoMHgzNDApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCisgIHsibGQuZCIsCU9QX1NJKDB4MjMpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1RfRX0JCX0sCisgIHsibGQuZCIsCU9QX0xJKDB4MzQ3KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCisgIHsibGQuZCIsCU9QX1JFRygweDM0NikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAorICB7ImxkLmgiLAlPUF9TSSgweDIxKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKKyAgeyJsZC5oIiwJT1BfTEkoMHgzNDMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCisgIHsibGQuaCIsCU9QX1JFRygweDM0MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKKworICAvKiBMb2FkIFVuc2lnbmVkIERhdGEgSW50byBSZWdpc3RlciAqLworCisgIHsibGQudWIiLAlPUF9TSSgweDI4KSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKKyAgeyJsZC51YiIsCU9QX0xJKDB4MzUxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAorICB7ImxkLnViIiwJT1BfUkVHKDB4MzUwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAorICB7ImxkLnVoIiwJT1BfU0koMHgyOSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCisgIHsibGQudWgiLAlPUF9MSSgweDM1MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJsZC51aCIsCU9QX1JFRygweDM1MikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKKworICAvKiBMZWZ0bW9zdCBvbmUgKi8KKworICB7ImxtbyIsCU9QX0xJKDB4M0YwKSwJTUFTS19MSSwJMCwJe1JFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogQml0d2lzZSBsb2dpY2FsIE9SLiAgTm90ZSB0aGF0ICJvci50dCIgYW5kICJvciIgYXJlIHRoZSBzYW1lIGluc3RydWN0aW9ucy4gKi8KKworICB7Im9yLmZmIiwJT1BfU0koMHgxRSksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7Im9yLmZmIiwJT1BfTEkoMHgzM0QpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJvci5mZiIsCU9QX1JFRygweDMzQyksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsib3IuZnQiLAlPUF9TSSgweDFEKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCisgIHsib3IuZnQiLAlPUF9MSSgweDMzQiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7Im9yLmZ0IiwJT1BfUkVHKDB4MzNBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJvci50ZiIsCU9QX1NJKDB4MUIpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJvci50ZiIsCU9QX0xJKDB4MzM3KSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCisgIHsib3IudGYiLAlPUF9SRUcoMHgzMzYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7Im9yLnR0IiwJT1BfU0koMHgxNyksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7Im9yLnR0IiwJT1BfTEkoMHgzMkYpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJvci50dCIsCU9QX1JFRygweDMyRSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsib3IiLAlPUF9TSSgweDE3KSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCisgIHsib3IiLAlPUF9MSSgweDMyRiksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7Im9yIiwJT1BfUkVHKDB4MzJFKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKKworICAvKiBSZWFkIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworICB7InJkY3IiLAlPUF9TSSgweDQpLAlNQVNLX1NJICB8ICgweDFGIDw8IDIyKSwJMCwJe0NSX1NJLCBSRUdfREVTVH0JfSwKKyAgeyJyZGNyIiwJT1BfTEkoMHgzMDkpLAlNQVNLX0xJICB8ICgweDFGIDw8IDIyKSwJMCwJe0NSX0xJLCBSRUdfREVTVH0JfSwKKyAgeyJyZGNyIiwJT1BfUkVHKDB4MzA4KSwJTUFTS19SRUcgfCAoMHgxRiA8PCAyMiksCTAsCXtSRUdfMCwgUkVHX0RFU1R9CX0sCisKKyAgLyogUmlnaHRtb3N0IG9uZSAqLworCisgIHsicm1vIiwJT1BfTEkoMHgzRjIpLAlNQVNLX0xJLAkwLAkJe1JFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogU2hpZnQgUmVnaXN0ZXIgTGVmdCAtIG5vdGUgdGhhdCByb3RsLCBzaGwsIGFuZCBpbnMgYXJlIGFsbCBhbHRlcm5hdGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUgc2hpZnQgaW5zdHJ1Y3Rpb25zLgorICAgICBUaGV5IGFwcGVhciBwcmlvciB0byB0aGVpciBzbCBlcXVpdmFsZW50IHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpYXNzZW1ibGVkIGFzIHRoZSBhbHRlcm5hdGUgbmFtZS4gKi8KKworCisgIHsiaW5zIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiaW5zIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InJvdGwiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJyb3RsIiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNobCIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzaGwiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbC5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbC5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2wuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2wuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbC5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbC5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2wuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2wuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbC5peiIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbC5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisKKyAgLyogU2hpZnQgUmVnaXN0ZXIgTGVmdCBXaXRoIEludmVydGVkIEVuZG1hc2sgKi8KKworICB7InNsaS5kbSIsCU9QX1JFRygweDMxMikgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsaS5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2xpLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2xpLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbGkuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbGkuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsaS5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsaS5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2xpLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2xpLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbGkuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzbGkuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsaS5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNsaS5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2xpLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic2xpLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKworICAvKiBTaGlmdCBSZWdpc3RlciBSaWdodCAtIG5vdGUgdGhhdCBleHRzLCBleHR1LCByb3RyLCBzcmEsIGFuZCBzcmwgYXJlIGFsbCBhbHRlcm5hdGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUgc2hpZnQgaW5zdHJ1Y3Rpb25zLgorICAgICBUaGV5IGFwcGVhciBwcmlvciB0byB0aGVpciBzciBlcXVpdmFsZW50IHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpYXNzZW1ibGVkIGFzIHRoZSBhbHRlcm5hdGUgbmFtZS4gKi8KKworICB7ImV4dHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJleHRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJleHR1IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsiZXh0dSIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsicm90ciIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InJvdHIiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JhIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JhIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmwiLAlPUF9SRUcoMHgzMTYpIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmwiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3IuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIFNoaWZ0IFJlZ2lzdGVyIFJpZ2h0IFdpdGggSW52ZXJ0ZWQgRW5kbWFzayAqLworCisgIHsic3JpLmRtIiwJT1BfUkVHKDB4MzEyKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JpLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmkuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmkuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyaS5keiIsCU9QX1JFRygweDMxMCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyaS5keiIsCU9QX1NJKDB4OCkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JpLmVtIiwJT1BfUkVHKDB4MzE4KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JpLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmkuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmkuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyaS5leiIsCU9QX1JFRygweDMxNikgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InNyaS5leiIsCU9QX1NJKDB4QikgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JpLmltIiwJT1BfUkVHKDB4MzFFKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3JpLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmkuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKKyAgeyJzcmkuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIFN0b3JlIERhdGEgaW50byBNZW1vcnkgKi8KKworICB7InN0IiwJT1BfU0koMHgzMiksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAorICB7InN0IiwJT1BfTEkoMHgzNjUpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCisgIHsic3QiLAlPUF9SRUcoMHgzNjQpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCisgIHsic3QuYiIsCU9QX1NJKDB4MzApLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKKyAgeyJzdC5iIiwJT1BfTEkoMHgzNjEpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCisgIHsic3QuYiIsCU9QX1JFRygweDM2MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKKyAgeyJzdC5kIiwJT1BfU0koMHgzMyksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1RfRX0JCX0sCisgIHsic3QuZCIsCU9QX0xJKDB4MzY3KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CX0sCisgIHsic3QuZCIsCU9QX1JFRygweDM2NikgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAorICB7InN0LmgiLAlPUF9TSSgweDMxKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCisgIHsic3QuaCIsCU9QX0xJKDB4MzYzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAorICB7InN0LmgiLAlPUF9SRUcoMHgzNjIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCisKKyAgLyogU2lnbmVkIEludGVnZXIgU3VidHJhY3QgKi8KKworICB7InN1YiIsCU9QX1NJKDB4NUEpLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCisgIHsic3ViIiwJT1BfTEkoMHgzQjUpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKKyAgeyJzdWIiLAlPUF9SRUcoMHgzQjQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIFVuc2lnbmVkIEludGVnZXIgU3VidHJhY3QgKi8KKworICB7InN1YnUiLAlPUF9TSSgweDVCKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7InN1YnUiLAlPUF9MSSgweDNCNyksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAorICB7InN1YnUiLAlPUF9SRUcoMHgzQjYpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIFdyaXRlIENvbnRyb2wgUmVnaXN0ZXIKKyAgICAgSXMgYSBzcGVjaWFsIGZvcm0gb2YgdGhlICJzd2NyIiBpbnN0cnVjdGlvbiBzbyBjb21lcyBiZWZvcmUgaXQgaW4gdGhlIHRhYmxlLiAqLworCisgIHsid3JjciIsCU9QX1NJKDB4NSksCU1BU0tfU0kgfCAoMHgxRiA8PCAyNyksCQkwLAl7Q1JfU0ksIFJFR18yMn0JfSwKKyAgeyJ3cmNyIiwJT1BfTEkoMHgzMEIpLAlNQVNLX0xJIHwgKDB4MUYgPDwgMjcpLAkJMCwJe0NSX0xJLCBSRUdfMjJ9CX0sCisgIHsid3JjciIsCU9QX1JFRygweDMwQSksCU1BU0tfUkVHIHwgKDB4MUYgPDwgMjcpLAkwLAl7UkVHXzAsIFJFR18yMn0JfSwKKworICAvKiBTd2FwIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworICB7InN3Y3IiLAlPUF9TSSgweDUpLAlNQVNLX1NJLAkwLAl7Q1JfU0ksIFJFR18yMiwgUkVHX0RFU1R9CX0sCisgIHsic3djciIsCU9QX0xJKDB4MzBCKSwJTUFTS19MSSwJMCwJe0NSX0xJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorICB7InN3Y3IiLAlPUF9SRUcoMHgzMEEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAorCisgIC8qIFRyYXAgKi8KKworICB7InRyYXAiLAlPUF9TSSgweDEpICAgIHwgRSgwKSwJTUFTS19TSSAgfCBFKDEpLAkwLAl7U1VJfQl9LAorICB7InRyYXAiLAlPUF9MSSgweDMwMykgIHwgRSgwKSwJTUFTS19MSSAgfCBFKDEpLAkwLAl7TFVJfQl9LAorICB7InRyYXAiLAlPUF9SRUcoMHgzMDIpIHwgRSgwKSwJTUFTS19SRUcgfCBFKDEpLAkwLAl7UkVHXzB9CX0sCisKKyAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IEFkZCAqLworCisgIHsidmFkZC5kZCIsCU9QX1JFRygweDNDMCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCisgIHsidmFkZC5zZCIsCU9QX0xJKDB4M0MxKSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCisgIHsidmFkZC5zZCIsCU9QX1JFRygweDNDMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAorICB7InZhZGQuc3MiLAlPUF9MSSgweDNDMSkgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCisgIHsidmFkZC5zcyIsCU9QX1JFRygweDNDMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtSRUdfMCwgUkVHXzIyLCBSRUdfMjJ9CX0sCisKKyAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5IGFuZCBBZGQgdG8gQWNjdW11bGF0b3IgRklYTUUhIFRoaXMgaXMgbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZC4KKyAgIEZyb20gdGhlIGRvY3VtZW50YXRpb24gdGhlcmUgYXBwZWFycyB0byBiZSBubyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvcGNvZGVzIGZvcgorICAgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSByZWdpc3RlciBkZXN0aW5hdGlvbnMgYW5kIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYWNjdW11bGF0b3IgZGVzdGluYXRpb25zLgorICAgRnVydGhlciBpbnZlc3RpZ2F0aW9uIGlzIG5lY2Vzc2FyeS4gIFNpbmNlIHRoaXMgaXNuJ3QgY3JpdGljYWwgdG8gZ2V0dGluZyBhIFRJQzgwIHRvb2xjaGFpbiB1cAorICAgYW5kIHJ1bm5pbmcsIGl0IGlzIGRlZmVyZWQgdW50aWwgbGF0ZXIuICovCisKKyAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IE11bHRpcGx5CisgICBOb3RlOiBJZiByMCBpcyBpbiB0aGUgZGVzdGluYXRpb24gcmVnLCB0aGVuIHRoaXMgaXMgYSAidmVjdG9yIG5vcCIgaW5zdHJ1Y3Rpb24uICovCisKKyAgeyJ2bXB5LmRkIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHXzIyX0V9IH0sCisgIHsidm1weS5zZCIsCU9QX0xJKDB4M0M1KSAgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAorICB7InZtcHkuc2QiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9IH0sCisgIHsidm1weS5zcyIsCU9QX0xJKDB4M0M1KSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7U1BGSSwgUkVHXzIyLCBSRUdfMjJ9CX0sCisgIHsidm1weS5zcyIsCU9QX1JFRygweDNDNCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzAsIFJFR18yMiwgUkVHXzIyfSB9LAorCisgIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseSBhbmQgU3VidHJhY3QgZnJvbSBBY2N1bXVsYXRvcgorICAgICBGSVhNRTogU2VlIG5vdGUgYWJvdmUgZm9yIHZtYWMgaW5zdHJ1Y3Rpb24gKi8KKworICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgU3VidHJhY3QgQWNjdW11bGF0b3IgRnJvbSBTb3VyY2UKKyAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCisKKyAgLyogVmVjdG9yIFJvdW5kIFdpdGggRmxvYXRpbmctUG9pbnQgSW5wdXQKKyAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCisKKyAgLyogVmVjdG9yIFJvdW5kIHdpdGggSW50ZWdlciBJbnB1dCAqLworCisgIHsidnJuZC5pZCIsCU9QX0xJICgweDNDQikgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFNJLCBSRUdfMjJfRX19LAorICB7InZybmQuaWQiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJfRX19LAorICB7InZybmQuaXMiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xTSSwgUkVHXzIyfX0sCisgIHsidnJuZC5pcyIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMn19LAorICB7InZybmQudWQiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDEpIHwgUDEoMSksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xVSSwgUkVHXzIyX0V9fSwKKyAgeyJ2cm5kLnVkIiwJT1BfUkVHICgweDNDQSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyX0V9fSwKKyAgeyJ2cm5kLnVzIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigwKSB8IFAxKDEpLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMVUksIFJFR18yMn19LAorICB7InZybmQudXMiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJ9fSwKKworICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgU3VidHJhY3QgKi8KKworICB7InZzdWIuZGQiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAorICB7InZzdWIuc2QiLAlPUF9MSSgweDNDMykgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAorICB7InZzdWIuc2QiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKKyAgeyJ2c3ViLnNzIiwJT1BfTEkoMHgzQzMpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAorICB7InZzdWIuc3MiLAlPUF9SRUcoMHgzQzIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMiwgUkVHXzIyfQl9LAorCisgIC8qIFZlY3RvciBMb2FkIERhdGEgSW50byBSZWdpc3RlciAtIE5vdGUgdGhhdCB0aGUgdmVjdG9yIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIGNvbWUgYWZ0ZXIgdGhlIG90aGVyCisgICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyBwcmludCB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBzZWNvbmQgZm9yCisgICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIGluIHRoZSBzYW1lIG9wY29kZS4gKi8KKworICB7InZsZDAuZCIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMCksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKKyAgeyJ2bGQwLnMiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDApIHwgVl9wKDApLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAorICB7InZsZDEuZCIsCU9QX1YoMHgxRSkgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCU1BU0tfViB8IFZfbSgxKSB8IFZfUygxKSB8IFZfcCgxKSwJVElDODBfVkVDVE9SLCB7UkVHX0RFU1RfRX0gfSwKKyAgeyJ2bGQxLnMiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDApIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAorCisgIC8qIFZlY3RvciBTdG9yZSBEYXRhIEludG8gTWVtb3J5IC0gTm90ZSB0aGF0IHRoZSB2ZWN0b3IgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgY29tZSBhZnRlciB0aGUgb3RoZXIKKyAgIHZlY3RvciBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgYWx3YXlzIHByaW50IHRoZSBsb2FkL3N0b3JlIGluc3RydWN0aW9uIHNlY29uZCBmb3IKKyAgIHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHR3byBpbnN0cnVjdGlvbnMgaW4gdGhlIHNhbWUgb3Bjb2RlLiAqLworCisgIHsidnN0LmQiLAlPUF9WKDB4MUUpIHwgVl9tKDApIHwgVl9TKDEpIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCisgIHsidnN0LnMiLAlPUF9WKDB4MUUpIHwgVl9tKDApIHwgVl9TKDApIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUfSB9LAorCisgIHsieG5vciIsCU9QX1NJKDB4MTkpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKKyAgeyJ4bm9yIiwJT1BfTEkoMHgzMzMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKKyAgeyJ4bm9yIiwJT1BfUkVHKDB4MzMyKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0gfSwKKworICB7InhvciIsCU9QX1NJKDB4MTYpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKKyAgeyJ4b3IiLAlPUF9MSSgweDMyRCksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfSB9LAorICB7InhvciIsCU9QX1JFRygweDMyQyksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9IH0sCisKK307CisKK2NvbnN0IGludCB0aWM4MF9udW1fb3Bjb2RlcyA9IHNpemVvZiAodGljODBfb3Bjb2RlcykgLyBzaXplb2YgKHRpYzgwX29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy92ODUwLWRpcy5jIGIvb3Bjb2Rlcy92ODUwLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDYyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3Y4NTAtZGlzLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qIERpc2Fzc2VtYmxlIFY4NTAgaW5zdHJ1Y3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJvcGNvZGUvdjg1MC5oIiAKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAib3BpbnRsLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ODUwX3JlZ19uYW1lc1tdID0KK3sgInIwIiwgInIxIiwgInIyIiwgInNwIiwgImdwIiwgInI1IiwgInI2IiwgInI3IiwgCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsIAorICAicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsIAorICAicjI0IiwgInIyNSIsICJyMjYiLCAicjI3IiwgInIyOCIsICJyMjkiLCAiZXAiLCAibHAiIH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ODUwX3NyZWdfbmFtZXNbXSA9Cit7ICJlaXBjIiwgImVpcHN3IiwgImZlcGMiLCAiZmVwc3ciLCAiZWNyIiwgInBzdyIsICJzcjYiLCAic3I3IiwgCisgICJzcjgiLCAic3I5IiwgInNyMTAiLCAic3IxMSIsICJzcjEyIiwgInNyMTMiLCAic3IxNCIsICJzcjE1IiwKKyAgImN0cGMiLCAiY3Rwc3ciLCAiZGJwYyIsICJkYnBzdyIsICJjdGJwIiwgInNyMjEiLCAic3IyMiIsICJzcjIzIiwgCisgICJzcjI0IiwgInNyMjUiLCAic3IyNiIsICJzcjI3IiwgInNyMjgiLCAic3IyOSIsICJzcjMwIiwgInNyMzEiLAorICAic3IxNiIsICJzcjE3IiwgInNyMTgiLCAic3IxOSIsICJzcjIwIiwgInNyMjEiLCAic3IyMiIsICJzcjIzIiwgCisgICJzcjI0IiwgInNyMjUiLCAic3IyNiIsICJzcjI3IiwgInNyMjgiLCAic3IyOSIsICJzcjMwIiwgInNyMzEiIH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ODUwX2NjX25hbWVzW10gPQoreyAidiIsICJjL2wiLCAieiIsICJuaCIsICJzL24iLCAidCIsICJsdCIsICJsZSIsIAorICAibnYiLCAibmMvbmwiLCAibnoiLCAiaCIsICJucy9wIiwgInNhIiwgImdlIiwgImd0IiB9OworCitzdGF0aWMgaW50CitkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbikKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworeworICBzdHJ1Y3Qgdjg1MF9vcGNvZGUgKiAgICAgICAgICBvcCA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKil2ODUwX29wY29kZXM7CisgIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiAgIG9wZXJhbmQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIAlzaG9ydF9vcCA9ICgoaW5zbiAmIDB4MDYwMCkgIT0gMHgwNjAwKTsKKyAgaW50CQkJCWJ5dGVzX3JlYWQ7CisgIGludAkJCQl0YXJnZXRfcHJvY2Vzc29yOworICAKKyAgLyogU3BlY2lhbCBjYXNlOiAzMiBiaXQgTU9WICovCisgIGlmICgoaW5zbiAmIDB4ZmZlMCkgPT0gMHgwNjIwKQorICAgIHNob3J0X29wID0gdHJ1ZTsKKyAgCisgIGJ5dGVzX3JlYWQgPSBzaG9ydF9vcCA/IDIgOiA0OworICAKKyAgLyogSWYgdGhpcyBpcyBhIHR3byBieXRlIGluc24sIHRoZW4gbWFzayBvZmYgdGhlIGhpZ2ggYml0cy4gKi8KKyAgaWYgKHNob3J0X29wKQorICAgIGluc24gJj0gMHhmZmZmOworCisgIHN3aXRjaCAoaW5mby0+bWFjaCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGRlZmF1bHQ6CisgICAgICB0YXJnZXRfcHJvY2Vzc29yID0gUFJPQ0VTU09SX1Y4NTA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6CisgICAgICB0YXJnZXRfcHJvY2Vzc29yID0gUFJPQ0VTU09SX1Y4NTBFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogCisgICAgICB0YXJnZXRfcHJvY2Vzc29yID0gUFJPQ0VTU09SX1Y4NTBFQTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCisgIHdoaWxlIChvcC0+bmFtZSkKKyAgICB7CisgICAgICBpZiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZQorCSAgJiYgKG9wLT5wcm9jZXNzb3JzICYgdGFyZ2V0X3Byb2Nlc3NvcikpCisJeworCSAgY29uc3QgdW5zaWduZWQgY2hhciAqIG9waW5kZXhfcHRyOworCSAgdW5zaWduZWQgaW50ICAgICAgICAgIG9wbnVtOworCSAgdW5zaWduZWQgaW50ICAgICAgICAgIG1lbW9wOworCisJICBtYXRjaCA9IDE7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7CisvKmZwcmludGYgKHN0ZGVyciwgIm1hdGNoOiBtYXNrOiAleCBpbnNuOiAleCwgb3Bjb2RlOiAleCwgbmFtZTogJXNcbiIsIG9wLT5tYXNrLCBpbnNuLCBvcC0+b3Bjb2RlLCBvcC0+bmFtZSApOyovCisKKwkgIG1lbW9wID0gb3AtPm1lbW9wOworCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4KKworCSAgICAgTUVNT1AgaXMgdGhlIG9wZXJhbmQgbnVtYmVyIGF0IHdoaWNoIGEgbWVtb3J5CisJICAgICBhZGRyZXNzIHNwZWNpZmljYXRpb24gc3RhcnRzLCBvciB6ZXJvIGlmIHRoaXMKKwkgICAgIGluc3RydWN0aW9uIGhhcyBubyBtZW1vcnkgYWRkcmVzc2VzLgorCisJICAgICBBIG1lbW9yeSBhZGRyZXNzIGlzIGFsd2F5cyB0d28gYXJndW1lbnRzLgorCisJICAgICBUaGlzIGluZm9ybWF0aW9uIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgd2hlbiB0bworCSAgICAgaW5zZXJ0IGNvbW1hcyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIGFzIHdlbGwgYXMKKwkgICAgIHdoZW4gdG8gaW5zZXJ0IGRpc3BbcmVnXSBleHByZXNzaW9ucyBvbnRvIHRoZQorCSAgICAgb3V0cHV0IHN0cmVhbS4gICovCisJICAKKwkgIGZvciAob3BpbmRleF9wdHIgPSBvcC0+b3BlcmFuZHMsIG9wbnVtID0gMTsKKwkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7CisJICAgICAgIG9waW5kZXhfcHRyKyssIG9wbnVtKyspCisJICAgIHsKKwkgICAgICBsb25nIAl2YWx1ZTsKKwkgICAgICBpbnQgIAlmbGFnOworCSAgICAgIGludCAgICAgICBzdGF0dXM7CisJICAgICAgYmZkX2J5dGUJYnVmZmVyWyA0IF07CisJICAgICAgCisJICAgICAgb3BlcmFuZCA9ICZ2ODUwX29wZXJhbmRzWypvcGluZGV4X3B0cl07CisJICAgICAgCisJICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCisJCXZhbHVlID0gKG9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAwKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAob3BlcmFuZC0+Yml0cyA9PSAtMSkKKwkJICAgIHZhbHVlID0gKGluc24gJiBvcGVyYW5kLT5zaGlmdCk7CisJCSAgZWxzZQorCQkgICAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKKworCQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TSUdORUQpCisJCSAgICB2YWx1ZSA9ICgobG9uZykodmFsdWUgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpCisJCQkgICAgID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKTsKKwkJfQorCisJICAgICAgLyogVGhlIGZpcnN0IG9wZXJhbmQgaXMgYWx3YXlzIG91dHB1dCB3aXRob3V0IGFueQorCQkgc3BlY2lhbCBoYW5kbGluZy4KKworCQkgRm9yIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorCisJCSAgIElmIG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMSwgdGhlbiB3ZSBuZWVkICdbJyBzaW5jZQorCQkgICB3ZSdyZSBhYm91dCB0byBvdXRwdXQgdGhlIHJlZ2lzdGVyIHVzZWQgaW4gYSBtZW1vcnkKKwkJICAgcmVmZXJlbmNlLgorCisJCSAgIElmIG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMiwgdGhlbiB3ZSBuZWVkICddJyBzaW5jZQorCQkgICB3ZSBqdXN0IGZpbmlzaGVkIHRoZSByZWdpc3RlciBpbiBhIG1lbW9yeSByZWZlcmVuY2UuICBXZQorCQkgICBhbHNvIG5lZWQgYSAnLCcgYmVmb3JlIHRoaXMgb3BlcmFuZC4KKworCQkgICBFbHNlIHdlIGp1c3QgbmVlZCBhIGNvbW1hLgorCisJCSAgIFdlIG1heSBuZWVkIHRvIG91dHB1dCBhIHRyYWlsaW5nICddJyBpZiB0aGUgbGFzdCBvcGVyYW5kCisJCSAgIGluIGFuIGluc3RydWN0aW9uIGlzIHRoZSByZWdpc3RlciBmb3IgYSBtZW1vcnkgYWRkcmVzcy4gCisKKwkJICAgVGhlIGV4Y2VwdGlvbiAoYW5kIHRoZXJlJ3MgYWx3YXlzIGFuIGV4Y2VwdGlvbikgaXMgdGhlCisJCSAgICJqbXAiIGluc24gd2hpY2ggbmVlZHMgc3F1YXJlIGJyYWNrZXRzIGFyb3VuZCBpdCdzIG9ubHkKKwkJICAgcmVnaXN0ZXIgYXJndW1lbnQuICAqLworCisJICAgICAgICAgICBpZiAobWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAxKSBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlsiKTsKKwkgICAgICBlbHNlIGlmIChtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIpIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiXSwiKTsKKwkgICAgICBlbHNlIGlmIChtZW1vcCA9PSAxICYmIG9wbnVtID09IDEKKwkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpKQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIlsiKTsKKwkgICAgICBlbHNlIGlmIChvcG51bSA+IDEpCSAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLCAiKTsKKworCSAgICAgIC8qIGV4dHJhY3QgdGhlIGZsYWdzLCBpZ25vcm5nIG9uZXMgd2hpY2ggZG8gbm90IGVmZmVjdCBkaXNhc3NlbWJseSBvdXRwdXQuICovCisJICAgICAgZmxhZyA9IG9wZXJhbmQtPmZsYWdzOworCSAgICAgIGZsYWcgJj0gfiBWODUwX09QRVJBTkRfU0lHTkVEOworCSAgICAgIGZsYWcgJj0gfiBWODUwX09QRVJBTkRfUkVMQVg7CisJICAgICAgZmxhZyAmPSAtIGZsYWc7CisJICAgICAgCisJICAgICAgc3dpdGNoIChmbGFnKQorCQl7CisJCWNhc2UgVjg1MF9PUEVSQU5EX1JFRzogIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXMiLCB2ODUwX3JlZ19uYW1lc1t2YWx1ZV0pOyBicmVhazsKKwkJY2FzZSBWODUwX09QRVJBTkRfU1JHOiAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIHY4NTBfc3JlZ19uYW1lc1t2YWx1ZV0pOyBicmVhazsKKwkJY2FzZSBWODUwX09QRVJBTkRfQ0M6ICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIHY4NTBfY2NfbmFtZXNbdmFsdWVdKTsgYnJlYWs7CisJCWNhc2UgVjg1MF9PUEVSQU5EX0VQOiAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiZXAiKTsgYnJlYWs7CisJCWRlZmF1bHQ6ICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJWQiLCB2YWx1ZSk7IGJyZWFrOworCQljYXNlIFY4NTBfT1BFUkFORF9ESVNQOgorCQkgIHsKKwkJICAgIGJmZF92bWEgYWRkciA9IHZhbHVlICsgbWVtYWRkcjsKKwkJICAgIAorCQkgICAgLyogT24gdGhlIHY4NTAgdGhlIHRvcCA4IGJpdHMgb2YgYW4gYWRkcmVzcyBhcmUgdXNlZCBieSBhbiBvdmVybGF5IG1hbmFnZXIuCisJCSAgICAgICBUaHVzIGl0IG1heSBoYXBwZW4gdGhhdCB3aGVuIHdlIGFyZSBsb29raW5nIGZvciBhIHN5bWJvbCB0byBtYXRjaAorCQkgICAgICAgYWdhaW5zdCBhbiBhZGRyZXNzIHdpdGggc29tZSBvZiBpdHMgdG9wIGJpdHMgc2V0LCB0aGUgc2VhcmNoIGZhaWxzIHRvCisJCSAgICAgICB0dXJuIHVwIGFuIGV4YWN0IG1hdGNoLiAgSW4gdGhpcyBjYXNlIHdlIHRyeSB0byBmaW5kIGFuIGV4YWN0IG1hdGNoCisJCSAgICAgICBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSBsb3dlciBhZGRyZXNzIHNwYWNlLCBhbmQgaWYgd2UgZmluZCBvbmUsIHdlCisJCSAgICAgICB1c2UgdGhhdCBhZGRyZXNzLiAgIFdlIG9ubHkgZG8gdGhpcyBmb3IgSkFSTCBpbnN0cnVjdGlvbnMgaG93ZXZlciwgYXMKKwkJICAgICAgIHdlIGRvIG5vdCB3YW50IHRvIG1pc2ludGVycHJldCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgKi8KKwkJICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDIyKQorCQkgICAgICB7CisJCQlpZiAoICEgaW5mby0+c3ltYm9sX2F0X2FkZHJlc3NfZnVuYyAoYWRkciwgaW5mbykKKwkJCSAgICAmJiAoKGFkZHIgJiAweEZGMDAwMDAwKSAhPSAwKQorCQkJICAgICYmIGluZm8tPnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgKGFkZHIgJiAweDAwRkZGRkZGLCBpbmZvKSkKKwkJCSAgeworCQkJICAgIGFkZHIgJj0gMHgwMEZGRkZGRjsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKGFkZHIsIGluZm8pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQkgICAgCisJCWNhc2UgVjg1MEVfUFVTSF9QT1A6CisJCSAgeworCQkgICAgc3RhdGljIGludCBsaXN0MTJfcmVnc1szMl0gICA9IHsgMzAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwgMzEsIDI5LCAyOCwgMjMsIDIyLCAyMSwgMjAsIDI3LCAyNiwgMjUsIDI0IH07CisJCSAgICBzdGF0aWMgaW50IGxpc3QxOF9oX3JlZ3NbMzJdID0geyAxOSwgMTgsIDE3LCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDMwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKKwkJICAgIHN0YXRpYyBpbnQgbGlzdDE4X2xfcmVnc1szMl0gPSB7ICAzLCAgMiwgIDEsIC0yLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMTQsIDE1LCAxMywgMTIsICA3LCAgNiwgIDUsICA0LCAxMSwgMTAsICA5LCAgOCB9OworCQkgICAgaW50ICogICAgICAgICAgICAgcmVnczsKKwkJICAgIGludCAgICAgICAgICAgICAgIGk7CisJCSAgICB1bnNpZ25lZCBsb25nIGludCBtYXNrID0gMDsKKwkJICAgIGludCAgICAgICAgICAgICAgIHBjICAgPSBmYWxzZTsKKwkJICAgIGludCAgICAgICAgICAgICAgIHNyICAgPSBmYWxzZTsKKwkJICAgIAorCQkgICAgCisJCSAgICBzd2l0Y2ggKG9wZXJhbmQtPnNoaWZ0KQorCQkgICAgICB7CisJCSAgICAgIGNhc2UgMHhmZmUwMDAwMTogcmVncyA9IGxpc3QxMl9yZWdzOyBicmVhazsKKwkJICAgICAgY2FzZSAweGZmZjgwMDBmOiByZWdzID0gbGlzdDE4X2hfcmVnczsgYnJlYWs7CisJCSAgICAgIGNhc2UgMHhmZmY4MDAxZjogcmVncyA9IGxpc3QxOF9sX3JlZ3M7IHZhbHVlICY9IH4weDEwOyBicmVhazsgIC8qIERvIG5vdCBpbmNsdWRlIG1hZ2ljIGJpdCAqLworCQkgICAgICBkZWZhdWx0OgorCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkJCWZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIiksIG9wZXJhbmQtPnNoaWZ0ICk7CisJCQlhYm9ydCgpOworCQkgICAgICB9CisKKwkJICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkgICAgICB7CisJCQlpZiAodmFsdWUgJiAoMSA8PCBpKSkKKwkJCSAgeworCQkJICAgIHN3aXRjaCAocmVnc1sgaSBdKQorCQkJICAgICAgeworCQkJICAgICAgZGVmYXVsdDogbWFzayB8PSAoMSA8PCByZWdzWyBpIF0pOyBicmVhazsKKwkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCQkJICAgICAgY2FzZSAwOiAgZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIHBvcCByZWc6ICVkXG4iKSwgaSApOyBhYm9ydCgpOworCQkJICAgICAgY2FzZSAtMTogcGMgPSB0cnVlOyBicmVhazsKKwkJCSAgICAgIGNhc2UgLTI6IHNyID0gdHJ1ZTsgYnJlYWs7CisJCQkgICAgICB9CisJCQkgIH0KKwkJICAgICAgfQorCisJCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgInsiKTsKKwkJICAgIAorCQkgICAgaWYgKG1hc2sgfHwgcGMgfHwgc3IpCisJCSAgICAgIHsKKwkJCWlmIChtYXNrKQorCQkJICB7CisJCQkgICAgdW5zaWduZWQgaW50IGJpdDsKKwkJCSAgICBpbnQgICAgICAgICAgc2hvd25fb25lID0gZmFsc2U7CisJCQkgICAgCisJCQkgICAgZm9yIChiaXQgPSAwOyBiaXQgPCAzMjsgYml0KyspCisJCQkgICAgICBpZiAobWFzayAmICgxIDw8IGJpdCkpCisJCQkJeworCQkJCSAgdW5zaWduZWQgbG9uZyBpbnQgZmlyc3QgPSBiaXQ7CisJCQkJICB1bnNpZ25lZCBsb25nIGludCBsYXN0OworCisJCQkJICBpZiAoc2hvd25fb25lKQorCQkJCSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiwgIik7CisJCQkJICBlbHNlCisJCQkJICAgIHNob3duX29uZSA9IHRydWU7CisJCQkJICAKKwkJCQkgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCB2ODUwX3JlZ19uYW1lc1tmaXJzdF0pOworCQkJCSAgCisJCQkJICBmb3IgKGJpdCsrOyBiaXQgPCAzMjsgYml0KyspCisJCQkJICAgIGlmICgobWFzayAmICgxIDw8IGJpdCkpID09IDApCisJCQkJICAgICAgYnJlYWs7CisKKwkJCQkgIGxhc3QgPSBiaXQ7CisKKwkJCQkgIGlmIChsYXN0ID4gZmlyc3QgKyAxKQorCQkJCSAgICB7CisJCQkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgLSAlcyIsIHY4NTBfcmVnX25hbWVzWyBsYXN0IC0gMSBdKTsKKwkJCQkgICAgfQorCQkJCX0KKwkJCSAgfQorCQkJCisJCQlpZiAocGMpCisJCQkgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXNQQyIsIG1hc2sgPyAiLCAiIDogIiIpOworCQkJaWYgKHNyKQorCQkJICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzU1IiLCAobWFzayB8fCBwYykgPyAiLCAiIDogIiIpOworCQkgICAgICB9CisJCSAgICAKKwkJICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAifSIpOworCQkgIH0KKwkJYnJlYWs7CisJCSAgCisJCWNhc2UgVjg1MEVfSU1NRURJQVRFMTY6CisJCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciArIGJ5dGVzX3JlYWQsIGJ1ZmZlciwgMiwgaW5mbyk7CisJCSAgaWYgKHN0YXR1cyA9PSAwKQorCQkgICAgeworCQkgICAgICBieXRlc19yZWFkICs9IDI7CisJCSAgICAgIHZhbHVlID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKKworCQkgICAgICAvKiBJZiB0aGlzIGlzIGEgRElTUE9TRSBpbnN0cnVjdGlvbiB3aXRoIGZmIHNldCB0byAweDEwLCB0aGVuIHNoaWZ0IHZhbHVlIHVwIGJ5IDE2LiAgKi8KKwkJICAgICAgaWYgKChpbnNuICYgMHgwMDFmZmZjMCkgPT0gMHgwMDEzMDc4MCkKKwkJCXZhbHVlIDw8PSAxNjsKKworCQkgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCB2YWx1ZSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBtZW1hZGRyICsgYnl0ZXNfcmVhZCwgaW5mbyk7CisJCSAgICB9CisJCSAgYnJlYWs7CisJCSAgCisJCWNhc2UgVjg1MEVfSU1NRURJQVRFMzI6CisJCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciArIGJ5dGVzX3JlYWQsIGJ1ZmZlciwgNCwgaW5mbyk7CisJCSAgaWYgKHN0YXR1cyA9PSAwKQorCQkgICAgeworCQkgICAgICBieXRlc19yZWFkICs9IDQ7CisJCSAgICAgIHZhbHVlID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKKwkJICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIweCVseCIsIHZhbHVlKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIgKyBieXRlc19yZWFkLCBpbmZvKTsKKwkJICAgIH0KKwkJICBicmVhazsKKwkJfQkJICAKKworCSAgICAgIC8qIEhhbmRsZSBqbXAgY29ycmVjdGx5LiAgKi8KKwkgICAgICBpZiAobWVtb3AgPT0gMSAmJiBvcG51bSA9PSAxCisJCSAgJiYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9SRUcpICE9IDApKQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKKwkgICAgfQorCisJICAvKiBDbG9zZSBhbnkgc3F1YXJlIGJyYWNrZXQgd2UgbGVmdCBvcGVuLiAgKi8KKwkgIGlmIChtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDIpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOworCisJICAvKiBBbGwgZG9uZS4gKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIG9wKys7CisgICAgfQorCisgIGlmICghbWF0Y2gpCisgICAgeworICAgICAgaWYgKHNob3J0X29wKQorCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLnNob3J0XHQweCUwNHgiLCBpbnNuKTsKKyAgICAgIGVsc2UKKwlpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLCBpbnNuKTsKKyAgICB9CisKKyAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK2ludCAKK3ByaW50X2luc25fdjg1MCAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Cit7CisgIGludCAgICAgICAgICAgc3RhdHVzOworICBiZmRfYnl0ZSAgICAgIGJ1ZmZlclsgNCBdOworICB1bnNpZ25lZCBsb25nIGluc24gPSAwOworCisgIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgb3Bjb2RlIGlzLiAgKi8KKyAgCisgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICB7CisgICAgICBpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKKyAgICAgIAorICAgICAgaWYgKCAgIChpbnNuICYgMHgwNjAwKSA9PSAweDA2MDAKKwkgICYmIChpbnNuICYgMHhmZmUwKSAhPSAweDA2MjApCisJeworCSAgLyogSWYgdGhpcyBpcyBhIDQgYnl0ZSBpbnNuLCByZWFkIDQgYnl0ZXMgb2Ygc3R1ZmYuICAqLworCSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKKworCSAgaWYgKHN0YXR1cyA9PSAwKQorCSAgICBpbnNuID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKKwl9CisgICAgfQorICAKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAvKiBNYWtlIHN1cmUgd2UgdGVsbCBvdXIgY2FsbGVyIGhvdyBtYW55IGJ5dGVzIHdlIGNvbnN1bWVkLiAgKi8KKyAgcmV0dXJuIGRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuKTsKK30KZGlmZiAtLWdpdCBhL29wY29kZXMvdjg1MC1vcGMuYyBiL29wY29kZXMvdjg1MC1vcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ4NTdlCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy92ODUwLW9wYy5jCkBAIC0wLDAgKzEsNzg2IEBACisvKiBBc3NlbWJsZSBWODUwIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9waW50bC5oIgorCisvKiByZWd1bGFyIG9wY29kZSAqLworI2RlZmluZSBPUCh4KQkJKCh4ICYgMHgzZikgPDwgNSkKKyNkZWZpbmUgT1BfTUFTSwkJT1AgKDB4M2YpCisKKy8qIGNvbmRpdGlvbmFsIGJyYW5jaCBvcGNvZGUgKi8KKyNkZWZpbmUgQk9QKHgpCQkoKDB4MGIgPDwgNykgfCAoeCAmIDB4MGYpKQorI2RlZmluZSBCT1BfTUFTSwkoKDB4MGYgPDwgNykgfCAweDBmKQorCisvKiBvbmUtd29yZCBvcGNvZGVzICovCisjZGVmaW5lIG9uZSh4KQkJKCh1bnNpZ25lZCBpbnQpICh4KSkKKworLyogdHdvLXdvcmQgb3Bjb2RlcyAqLworI2RlZmluZSB0d28oeCx5KQkoKHVuc2lnbmVkIGludCkgKHgpIHwgKCh1bnNpZ25lZCBpbnQpICh5KSA8PCAxNikpCisKKworDAorLyogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4gICovCisKKy8qIE5vdGU6IFRoZXJlIGlzIGEgY29uc3BpcmFjeSBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBhbmQKKyAgIHY4NTBfaW5zZXJ0X29wZXJhbmQoKSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYy4gIEVycm9yIG1lc3NhZ2VzCisgICBjb250YWluaW5nIHRoZSBzdHJpbmcgJ291dCBvZiByYW5nZScgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhCisgICBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogbm90X3ZhbGlkICAgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIpOworc3RhdGljIGNvbnN0IGNoYXIgKiBvdXRfb2ZfcmFuZ2UgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiKTsKK3N0YXRpYyBjb25zdCBjaGFyICogbm90X2FsaWduZWQgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGFsaWduZWQiKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBpbW1lZGlhdGVfb3V0X29mX3JhbmdlID0gTl8gKCJpbW1lZGlhdGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfZDkgKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Cit7CisgIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCisgICAgeworICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCisJKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBvZGQgb2Zmc2V0Iik7CisgICAgICBlbHNlCisJKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgb3V0IG9mIHJhbmdlIik7CisgICAgfQorICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQorICAgICogZXJybXNnID0gXygiYnJhbmNoIHRvIG9kZCBvZmZzZXQiKTsKKworICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHgxZjApIDw8IDcpIHwgKCh2YWx1ZSAmIDB4MGUpIDw8IDMpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2V4dHJhY3RfZDkgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICogICAgICAgICBpbnZhbGlkOworeworICB1bnNpZ25lZCBsb25nIHJldCA9ICgoaW5zbiAmIDB4ZjgwMCkgPj4gNykgfCAoKGluc24gJiAweDAwNzApID4+IDMpOworCisgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKKyAgICByZXQgLT0gMHgwMjAwOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfZDIyIChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgICAgICAgICAgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOworeworICBpZiAodmFsdWUgPiAweDFmZmZmZiB8fCB2YWx1ZSA8IC0weDIwMDAwMCkKKyAgICB7CisgICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKKwkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiKTsKKyAgICAgIGVsc2UKKwkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICB9CisgIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCisgICAgKiBlcnJtc2cgPSBfKCJicmFuY2ggdG8gb2RkIG9mZnNldCIpOworCisgIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNmMDAwMCkgPj4gMTYpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2V4dHJhY3RfZDIyIChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqICAgICAgICAgaW52YWxpZDsKK3sKKyAgc2lnbmVkIGxvbmcgcmV0ID0gKChpbnNuICYgMHhmZmZlMDAwMCkgPj4gMTYpIHwgKChpbnNuICYgMHgzZikgPDwgMTYpOworCisgIHJldHVybiAodW5zaWduZWQgbG9uZykgKChyZXQgPDwgMTApID4+IDEwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9kMTZfMTUgKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Cit7CisgIGlmICh2YWx1ZSA+IDB4N2ZmZiB8fCB2YWx1ZSA8IC0weDgwMDApCisgICAgeworICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCisJKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7CisgICAgICBlbHNlCisJKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7CisgICAgfQorICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQorICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7CisKKyAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitleHRyYWN0X2QxNl8xNSAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Cit7CisgIHNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHhmZmZlMDAwMCk7CisKKyAgcmV0dXJuIHJldCA+PiAxNjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9kOF83IChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgICAgICAgICAgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOworeworICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgMCkKKyAgICB7CisgICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKKwkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKKyAgICAgIGVsc2UKKwkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKKyAgICB9CisgIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCisgICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKKworICB2YWx1ZSA+Pj0gMTsKKworICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDdmKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitleHRyYWN0X2Q4XzcgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICogICAgICAgICBpbnZhbGlkOworeworICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHg3Zik7CisKKyAgcmV0dXJuIHJldCA8PCAxOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2Q4XzYgKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Cit7CisgIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAwKQorICAgIHsKKyAgICAgIGlmICgodmFsdWUgJSA0KSAhPSAwKQorCSplcnJtc2cgPSBfKG5vdF92YWxpZCk7CisgICAgICBlbHNlCisJKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7CisgICAgfQorICBlbHNlIGlmICgodmFsdWUgJSA0KSAhPSAwKQorICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7CisKKyAgdmFsdWUgPj49IDE7CisKKyAgcmV0dXJuIChpbnNuIHwgKHZhbHVlICYgMHg3ZSkpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZXh0cmFjdF9kOF82IChpbnNuLCBpbnZhbGlkKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGludCAqICAgICAgICAgaW52YWxpZDsKK3sKKyAgdW5zaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4N2UpOworCisgIHJldHVybiByZXQgPDwgMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9kNV80IChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIGxvbmcgICAgICAgICAgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOworeworICBpZiAodmFsdWUgPiAweDFmIHx8IHZhbHVlIDwgMCkKKyAgICB7CisgICAgICBpZiAodmFsdWUgJiAxKQorCSogZXJybXNnID0gXyhub3RfdmFsaWQpOworICAgICAgZWxzZQorCSplcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7CisgICAgfQorICBlbHNlIGlmICh2YWx1ZSAmIDEpCisgICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKKworICB2YWx1ZSA+Pj0gMTsKKworICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDBmKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitleHRyYWN0X2Q1XzQgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICogICAgICAgICBpbnZhbGlkOworeworICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHgwZik7CisKKyAgcmV0dXJuIHJldCA8PCAxOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2QxNl8xNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBzaWduZWQgbG9uZyAgIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKK3sKKyAgaWYgKHZhbHVlID4gMHg3ZmZmIHx8IHZhbHVlIDwgLTB4ODAwMCkKKyAgICAqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKKworICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNikgfCAoKHZhbHVlICYgMSkgPDwgNSkpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZXh0cmFjdF9kMTZfMTYgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICogICAgICAgICBpbnZhbGlkOworeworICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHhmZmZlMDAwMDsKKworICByZXQgPj49IDE2OworCisgIHJldCB8PSAoKGluc24gJiAweDIwKSA+PiA1KTsKKyAgCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfaTkgKGluc24sIHZhbHVlLCBlcnJtc2cpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgc2lnbmVkIGxvbmcgICB2YWx1ZTsKKyAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Cit7CisgIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCisgICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOworCisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2V4dHJhY3RfaTkgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICogICAgICAgICBpbnZhbGlkOworeworICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgwMDNjMDAwMDsKKworICByZXQgPDw9IDEwOworICByZXQgPj49IDIzOworCisgIHJldCB8PSAoaW5zbiAmIDB4MWYpOworICAKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF91OSAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKK3sKKyAgaWYgKHZhbHVlID4gMHgxZmYpCisgICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOworCisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2V4dHJhY3RfdTkgKGluc24sIGludmFsaWQpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKKyAgICAgaW50ICogICAgICAgICBpbnZhbGlkOworeworICB1bnNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDAwM2MwMDAwOworCisgIHJldCA+Pj0gMTM7CisKKyAgcmV0IHw9IChpbnNuICYgMHgxZik7CisgIAorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3NwZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKK3sKKyAgaWYgKHZhbHVlICE9IDMpCisgICAgKiBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGZvciBzdGFjayBhZGp1c3RtZW50Iik7CisKKyAgcmV0dXJuIGluc24gJiAofiAweDE4MDAwMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitleHRyYWN0X3NwZSAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Cit7CisgIHJldHVybiAzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2k1ZGl2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOworeworICBpZiAodmFsdWUgPiAweDFmZikKKyAgICB7CisgICAgICBpZiAodmFsdWUgJiAxKQorCSogZXJybXNnID0gXygiaW1tZWRpYXRlIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgbm90IGV2ZW4iKTsKKyAgICAgIGVsc2UKKwkqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7CisgICAgfQorICBlbHNlIGlmICh2YWx1ZSAmIDEpCisgICAgKiBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBldmVuIik7CisKKyAgdmFsdWUgPSAzMiAtIHZhbHVlOworICAKKyAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZSkgPDwgMTcpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZXh0cmFjdF9pNWRpdiAoaW5zbiwgaW52YWxpZCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Cit7CisgIHVuc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4M2MwMDAwOworCisgIHJldCA+Pj0gMTc7CisKKyAgcmV0ID0gMzIgLSByZXQ7CisgIAorICByZXR1cm4gcmV0OworfQorCisMCisvKiBXYXJuaW5nOiBjb2RlIGluIGdhcy9jb25maWcvdGMtdjg1MC5jIGV4YW1pbmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5LgorICAgSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBoZXJlLCBiZSBzdXJlIHRvIGxvb2sgZm9yIHNpZGUgZWZmZWN0cyBpbgorICAgdGhhdCBjb2RlLiAqLworY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW10gPQoreworI2RlZmluZSBVTlVTRUQJMAorICB7IDAsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCisKKy8qIFRoZSBSMSBmaWVsZCBpbiBhIGZvcm1hdCAxLCA2LCA3LCBvciA5IGluc24uICovCisjZGVmaW5lIFIxCShVTlVTRUQgKyAxKQorICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwgCisKKy8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCisjZGVmaW5lIFIxX05PVFIwIChSMSArIDEpCisgIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sIAorCisvKiBUaGUgUjIgZmllbGQgaW4gYSBmb3JtYXQgMSwgMiwgNCwgNSwgNiwgNywgOSBpbnNuLiAqLworI2RlZmluZSBSMgkoUjFfTk9UUjAgKyAxKQorICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sCisKKy8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCisjZGVmaW5lIFIyX05PVFIwIChSMiArIDEpCisgIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAorCisvKiBUaGUgaW1tNSBmaWVsZCBpbiBhIGZvcm1hdCAyIGluc24uICovCisjZGVmaW5lIEk1CShSMl9OT1RSMCArIDEpCisgIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKKworLyogVGhlIHVuc2lnbmVkIGltbTUgZmllbGQgaW4gYSBmb3JtYXQgMiBpbnNuLiAqLworI2RlZmluZSBJNVUJKEk1ICsgMSkKKyAgeyA1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCisKKy8qIFRoZSBpbW0xNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCisjZGVmaW5lIEkxNgkoSTVVICsgMSkKKyAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCisKKy8qIFRoZSBzaWduZWQgZGlzcDcgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLworI2RlZmluZSBENwkoSTE2ICsgMSkKKyAgeyA3LCAwLCBOVUxMLCBOVUxMLCAwfSwKKworLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCisjZGVmaW5lIEQxNl8xNQkoRDcgKyAxKQorICB7IDE1LCAxNywgaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCisKKy8qIFRoZSAzIGJpdCBpbW1lZGlhdGUgZmllbGQgaW4gZm9ybWF0IDggaW5zbi4gICovCisjZGVmaW5lIEIzCShEMTZfMTUgKyAxKQorICB7IDMsIDExLCBOVUxMLCBOVUxMLCAwIH0sCisKKy8qIFRoZSA0IGJpdCBjb25kaXRpb24gY29kZSBpbiBhIHNldGYgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgQ0NDQwkoQjMgKyAxKQorICB7IDQsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAorCisvKiBUaGUgdW5zaWduZWQgRElTUDggZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLworI2RlZmluZSBEOF83CShDQ0NDICsgMSkKKyAgeyA3LCAwLCBpbnNlcnRfZDhfNywgZXh0cmFjdF9kOF83LCAwIH0sCisKKy8qIFRoZSB1bnNpZ25lZCBESVNQOCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCisjZGVmaW5lIEQ4XzYJKEQ4XzcgKyAxKQorICB7IDYsIDEsIGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYsIDAgfSwKKworLyogU3lzdGVtIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KKyNkZWZpbmUgU1IxCShEOF82ICsgMSkKKyAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCisKKy8qIEVQIFJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgRVAJKFNSMSArIDEpCisgIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0VQIH0sCisKKy8qIFRoZSBpbW0xNiBmaWVsZCAodW5zaWduZWQpIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KKyNkZWZpbmUgSTE2VQkoRVAgKyAxKQorICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgMH0sIAorCisvKiBUaGUgUjIgZmllbGQgYXMgYSBzeXN0ZW0gcmVnaXN0ZXIuICAqLworI2RlZmluZSBTUjIJKEkxNlUgKyAxKQorICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCisKKy8qIFRoZSBkaXNwMTYgZmllbGQgaW4gYSBmb3JtYXQgOCBpbnNuLiAqLworI2RlZmluZSBEMTYJKFNSMiArIDEpCisgIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAorCisvKiBUaGUgRElTUDkgZmllbGQgaW4gYSBmb3JtYXQgMyBpbnNuLCByZWxheGFibGUuICovCisjZGVmaW5lIEQ5X1JFTEFYCShEMTYgKyAxKQorICB7IDksIDAsIGluc2VydF9kOSwgZXh0cmFjdF9kOSwgVjg1MF9PUEVSQU5EX1JFTEFYIHwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCisKKy8qIFRoZSBESVNQMjIgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLCByZWxheGFibGUuCisgICBUaGlzIF9tdXN0XyBmb2xsb3cgRDlfUkVMQVg7IHRoZSBhc3NlbWJsZXIgYXNzdW1lcyB0aGF0IHRoZSBsb25nZXIKKyAgIHZlcnNpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgc2hvcnRlciB2ZXJzaW9uIGZvciByZWxheGluZy4gICovCisjZGVmaW5lIEQyMgkoRDlfUkVMQVggKyAxKQorICB7IDIyLCAwLCBpbnNlcnRfZDIyLCBleHRyYWN0X2QyMiwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCisKKy8qIFRoZSBzaWduZWQgZGlzcDQgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLworI2RlZmluZSBENAkoRDIyICsgMSkKKyAgeyA0LCAwLCBOVUxMLCBOVUxMLCAwfSwKKworLyogVGhlIHVuc2lnbmVkIGRpc3A1IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KKyNkZWZpbmUgRDVfNAkoRDQgKyAxKQorICB7IDQsIDAsIGluc2VydF9kNV80LCBleHRyYWN0X2Q1XzQsIDAgfSwKKworLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhbiBmb3JtYXQgNyB1bnNpZ25lZCBieXRlIGxvYWQgaW5zbi4gKi8KKyNkZWZpbmUgRDE2XzE2CShENV80ICsgMSkKKyAgeyAtMSwgMHhmZmZlMDAyMCwgaW5zZXJ0X2QxNl8xNiwgZXh0cmFjdF9kMTZfMTYsIDAgfSwgCisKKy8qIFRoaXJkIHJlZ2lzdGVyIGluIGNvbmRpdGlvbmFsIG1vdmVzLiAqLworI2RlZmluZSBSMwkoRDE2XzE2ICsgMSkKKyAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LAorCisvKiBDb25kaXRpb24gY29kZSBpbiBjb25kaXRpb25hbCBtb3Zlcy4gICovCisjZGVmaW5lIE1PVkNDCShSMyArIDEpCisgIHsgNCwgMTcsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAorCisvKiBUaGUgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCisjZGVmaW5lIEk5CShNT1ZDQyArIDEpCisgIHsgOSwgMCwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAorCisvKiBUaGUgdW5zaWduZWQgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCisjZGVmaW5lIFU5CShJOSArIDEpCisgIHsgOSwgMCwgaW5zZXJ0X3U5LCBleHRyYWN0X3U5LCAwIH0sIAorCisvKiBBIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgcHJlcGFyZS9kaXNwb3NlIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTElTVDEyCShVOSArIDEpCisgIHsgLTEsIDB4ZmZlMDAwMDEsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAorCisvKiBUaGUgSU1NNiBmaWVsZCBpbiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICovCisjZGVmaW5lIEk2CShMSVNUMTIgKyAxKQorICB7IDYsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCisKKy8qIFRoZSAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIElNTTE2CShJNiArIDEpCisgIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MEVfSU1NRURJQVRFMTYgfSwgCisKKy8qIFRoZSAzMiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIElNTTMyCShJTU0xNiArIDEpCisgIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MEVfSU1NRURJQVRFMzIgfSwgCisKKy8qIFRoZSBpbW01IGZpZWxkIGluIGEgcHVzaC9wb3AgaW5zdHJ1Y3Rpb24uICovCisjZGVmaW5lIElNTTUJKElNTTMyICsgMSkKKyAgeyA1LCAxLCBOVUxMLCBOVUxMLCAwIH0sIAorCisvKiBSZWcyIGluIGRpc3Bvc2UgaW5zdHJ1Y3Rpb24uICovCisjZGVmaW5lIFIyRElTUE9TRQkoSU1NNSArIDEpCisgIHsgNSwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAorCisvKiBTdGFjayBwb2ludGVyIGluIHByZXBhcmUgaW5zdHJ1Y3Rpb24uICovCisjZGVmaW5lIFNQCShSMkRJU1BPU0UgKyAxKQorICB7IDIsIDE5LCBpbnNlcnRfc3BlLCBleHRyYWN0X3NwZSwgVjg1MF9PUEVSQU5EX1JFRyB9LAorCisvKiBUaGUgSU1NNSBmaWVsZCBpbiBhIGRpdmlkZSBOIHN0ZXAgaW5zdHJ1Y3Rpb24uICovCisjZGVmaW5lIEk1RElWCShTUCArIDEpCisgIHsgOSwgMCwgaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAorCisgIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNSC9QT1BNSCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIExJU1QxOF9IIChJNURJViArIDEpCisgIHsgLTEsIDB4ZmZmODAwMGYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAorCisgIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNTC9QT1BNTCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIExJU1QxOF9MIChMSVNUMThfSCArIDEpCisgIHsgLTEsIDB4ZmZmODAwMWYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIC8qIFRoZSBzZXR0aW5nIG9mIHRoZSA0dGggYml0IGlzIGEgZmxhZyB0byBkaXNhc3NtYmxlKCkgaW4gdjg1MC1kaXMuYyAqLworfSA7IAorCisMCisvKiByZWctcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IEkpICovCisjZGVmaW5lIElGMQl7UjEsIFIyfQorCisvKiBpbW0tcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJKSAqLworI2RlZmluZSBJRjIJe0k1LCBSMn0KKworLyogY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJSSkgKi8KKyNkZWZpbmUgSUYzCXtEOV9SRUxBWH0KKworLyogMyBvcGVyYW5kIGluc3RydWN0aW9uIChGb3JtYXQgVkkpICovCisjZGVmaW5lIElGNgl7STE2LCBSMSwgUjJ9CisKKy8qIDMgb3BlcmFuZCBpbnN0cnVjdGlvbiAoRm9ybWF0IFZJKSAqLworI2RlZmluZSBJRjZVCXtJMTZVLCBSMSwgUjJ9CisKKworDAorLyogVGhlIG9wY29kZSB0YWJsZS4KKworICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgorCisgICBOQU1FCQlPUENPREUJCQlNQVNLCQkgICAgICAgeyBPUEVSQU5EUyB9CSAgIE1FTU9QICAgIFBST0NFU1NPUgorCisgICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKKyAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KKyAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgorICAgTUVNT1Agc3BlY2lmaWVzIHdoaWNoIG9wZXJhbmQgKGlmIGFueSkgaXMgYSBtZW1vcnkgb3BlcmFuZC4KKyAgIFBST0NFU1NPUlMgc3BlY2lmaWVzIHdoaWNoIENQVShzKSBzdXBwb3J0IHRoZSBvcGNvZGUuCisgICAKKyAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0CisgICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQorICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbworICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4KKworICAgVGhlIHRhYmxlIGlzIGFsc28gc29ydGVkIGJ5IG5hbWUuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KKyAgIFdoZW4gcGFyc2luZyBhbiBpbnN0cnVjdGlvbiB0aGUgYXNzZW1ibGVyIGZpbmRzIHRoZSBmaXJzdCBvY2N1cmFuY2UKKyAgIG9mIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjaXRvbiBpbiB0aGlzIHRhYmxlIGFuZCB0aGVuIGF0dGVtcHRzIHRvCisgICBtYXRjaCB0aGUgaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudHMgd2l0aCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmFuZHMKKyAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgaXQgaGFzIGp1c3QgZm91bmQgaW4gdGhpcyB0YWJsZS4gIElmIHRoZQorICAgbWF0Y2ggZmFpbHMgdGhlIGFzc2VtYmxlciBsb29rcyBhdCB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIHRhYmxlLgorICAgSWYgdGhhdCBlbnRyeSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJldmlvdXMgZW50cnksIHRoZW4gaXQKKyAgIHRyaWVzIHRvIG1hdGNoIHRoZSBpbnN0cnVjdGlvbiBhZ2FpbnN0IHRoYXQgZW50cnkgYW5kIHNvIG9uLiAgVGhpcworICAgaXMgaG93IHRoZSBhc3NlbWJsZXIgY29wZXMgd2l0aCBtdWx0aXBsZSwgZGlmZmVyZW50IGZvcm1hdHMgb2YgdGhlCisgICBzYW1lIGluc3RydWN0aW9uLiAgKi8KKworY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdID0KK3sKK3sgImJyZWFrcG9pbnQiLAkweGZmZmYsCQkJMHhmZmZmLAkJICAgICAgCXtVTlVTRUR9LCAgIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAorCit7ICJqbXAiLAlvbmUgKDB4MDA2MCksCQlvbmUgKDB4ZmZlMCksCSAgICAgIAl7UjF9LCAJCQkxLCBQUk9DRVNTT1JfQUxMIH0sCisgIAorLyogbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KK3sgInNsZC5idSIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgInNsZC5idSIsICAgICBvbmUgKDB4MDA2MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENCwgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAorCit7ICJzbGQuaHUiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCit7ICJzbGQuaHUiLCAgICAgb25lICgweDAwNzApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDVfNCwgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKKworeyAic2xkLmIiLCAgICAgIG9uZSAoMHgwMDYwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q0LCAgIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgInNsZC5iIiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCit7ICJzbGQuYiIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMn0sCTEsIFBST0NFU1NPUl9WODUwIH0sCisKK3sgInNsZC5oIiwgICAgICBvbmUgKDB4MDA3MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENV80LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCit7ICJzbGQuaCIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKK3sgInNsZC5oIiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwIH0sCit7ICJzbGQudyIsCW9uZSAoMHgwNTAwKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtEOF82LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzc3QuYiIsCW9uZSAoMHgwMzgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBENywgICBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzc3QuaCIsCW9uZSAoMHgwNDgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBEOF83LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzc3QudyIsCW9uZSAoMHgwNTAxKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtSMiwgICBEOF82LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCisKK3sgInB1c2htbCIsCXR3byAoMHgwN2UwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoreyAicHVzaG1oIiwJdHdvICgweDA3ZTAsIDB4MDAwMyksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9IfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCit7ICJwb3BtbCIsCXR3byAoMHgwN2YwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoreyAicG9wbWgiLAl0d28gKDB4MDdmMCwgMHgwMDAzKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0h9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBTUH0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDBiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDEzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDFiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0zMn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAxKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAiZGlzcG9zZSIsCW9uZSAoMHgwNjQwKSwgICAgICAgICAgIG9uZSAoMHhmZmMwKSwgICAgICAgICAJe0lNTTUsIExJU1QxMiwgUjJESVNQT1NFfSwwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgImRpc3Bvc2UiLAl0d28gKDB4MDY0MCwgMHgwMDAwKSwgICB0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtJTU01LCBMSVNUMTJ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCisKK3sgImxkLmIiLAl0d28gKDB4MDcwMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7RDE2LCBSMSwgUjJ9LCAJCTEsIFBST0NFU1NPUl9BTEwgfSwKK3sgImxkLmgiLAl0d28gKDB4MDcyMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJ9LCAJMSwgUFJPQ0VTU09SX0FMTCB9LAoreyAibGQudyIsCXR3byAoMHgwNzIwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJsZC5idSIsCXR3byAoMHgwNzgwLCAweDAwMDEpLCAgIHR3byAoMHgwN2MwLCAweDAwMDEpLCAJe0QxNl8xNiwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJsZC5odSIsCXR3byAoMHgwN2UwLCAweDAwMDEpLCAgIHR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sICAKK3sgInN0LmIiLAl0d28gKDB4MDc0MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7UjIsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKK3sgInN0LmgiLAl0d28gKDB4MDc2MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7UjIsIEQxNl8xNSwgUjF9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAoreyAic3QudyIsCXR3byAoMHgwNzYwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtSMiwgRDE2XzE1LCBSMX0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCisKKy8qIGJ5dGUgc3dhcC9leHRlbmQgaW5zdHJ1Y3Rpb25zICovCit7ICJ6eGIiLAlvbmUgKDB4MDA4MCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAienhoIiwJb25lICgweDAwYzApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMV9OT1RSMH0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJzeGIiLAlvbmUgKDB4MDBhMCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAic3hoIiwJb25lICgweDAwZTApLAkJb25lICgweGZmZTApLAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAiYnNoIiwJdHdvICgweDA3ZTAsIDB4MDM0MiksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJic3ciLAl0d28gKDB4MDdlMCwgMHgwMzQwKSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgImhzdyIsCXR3byAoMHgwN2UwLCAweDAzNDQpLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAorCisvKiBqdW1wIHRhYmxlIGluc3RydWN0aW9ucyAqLworeyAic3dpdGNoIiwJb25lICgweDAwNDApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMX0sIAkJCTEsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAiY2FsbHQiLAlvbmUgKDB4MDIwMCksCQlvbmUgKDB4ZmZjMCksIAkgICAgICAJe0k2fSwgCQkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJjdHJldCIsIAl0d28gKDB4MDdlMCwgMHgwMTQ0KSwJdHdvICgweGZmZmYsIDB4ZmZmZiksIAl7MH0sIAkJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAorCisvKiBhcml0aG1ldGljIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KK3sgInNldGYiLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwJdHdvICgweDA3ZjAsIDB4ZmZmZiksIAl7Q0NDQywgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImNtb3YiLAl0d28gKDB4MDdlMCwgMHgwMzIwKSwJdHdvICgweDA3ZTAsIDB4MDdlMSksIAl7TU9WQ0MsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJjbW92IiwJdHdvICgweDA3ZTAsIDB4MDMwMCksCXR3byAoMHgwN2UwLCAweDA3ZTEpLCAJe01PVkNDLCBJNSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAorCit7ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjIwKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjQwKSwJdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STksIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJtdWx1IiwJdHdvICgweDA3ZTAsIDB4MDIyMiksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAibXVsdSIsCXR3byAoMHgwN2UwLCAweDAyNDIpLAl0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtVOSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKKworeyAiZGl2IiwJdHdvICgweDA3ZTAsIDB4MDJjMCksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAiZGl2dSIsCXR3byAoMHgwN2UwLCAweDAyYzIpLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgImRpdmh1IiwJdHdvICgweDA3ZTAsIDB4MDI4MiksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJkaXZoIiwJdHdvICgweDA3ZTAsIDB4MDI4MCksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJkaXZoIiwJT1AgICgweDAyKSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKKyAgCit7ICJkaXZobiIsCXR3byAoMHgwN2UwLCAweDAyODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgImRpdmh1biIsCXR3byAoMHgwN2UwLCAweDAyODIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgImRpdm4iLAl0d28gKDB4MDdlMCwgMHgwMmMwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCit7ICJkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAyYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgInNkaXZobiIsCXR3byAoMHgwN2UwLCAweDAxODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgInNkaXZodW4iLAl0d28gKDB4MDdlMCwgMHgwMTgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCit7ICJzZGl2biIsCXR3byAoMHgwN2UwLCAweDAxYzApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKK3sgInNkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAxYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKKyAgCit7ICJub3AiLAlvbmUgKDB4MDApLAkJb25lICgweGZmZmYpLAkJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJtb3YiLAlPUCAgKDB4MTApLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAibW92IiwJb25lICgweDA2MjApLAkJb25lICgweGZmZTApLAkJe0lNTTMyLCBSMV9OT1RSMH0sCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoreyAibW92IiwgICAgICAgIE9QICAoMHgwMCksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJtb3ZlYSIsCU9QICAoMHgzMSksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAibW92aGkiLAlPUCAgKDB4MzIpLAkJT1BfTUFTSywJCXtJMTZVLCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJhZGQiLAlPUCAgKDB4MGUpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYWRkIiwJT1AgICgweDEyKSwJCU9QX01BU0ssCQlJRjIsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImFkZGkiLAlPUCAgKDB4MzApLAkJT1BfTUFTSywJCUlGNiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAic3ViIiwJT1AgICgweDBkKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInN1YnIiLCAJT1AgICgweDBjKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgIm11bGgiLAlPUCAgKDB4MTcpLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAibXVsaCIsCU9QICAoMHgwNyksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJtdWxoaSIsCU9QICAoMHgzNyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiY21wIiwJT1AgICgweDBmKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImNtcCIsCU9QICAoMHgxMyksCQlPUF9NQVNLLAkJSUYyLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCisgIAorLyogc2F0dXJhdGVkIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KK3sgInNhdGFkZCIsCU9QICgweDExKSwJCU9QX01BU0ssCQl7STUsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInNhdGFkZCIsCU9QICgweDA2KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInNhdHN1YiIsCU9QICgweDA1KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInNhdHN1YmkiLAlPUCAoMHgzMyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAic2F0c3ViciIsCU9QICgweDA0KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKKworLyogbG9naWNhbCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zICovCit7ICJ0c3QiLAlPUCAoMHgwYiksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJvciIsCQlPUCAoMHgwOCksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJvcmkiLAlPUCAoMHgzNCksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYW5kIiwJT1AgKDB4MGEpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYW5kaSIsCU9QICgweDM2KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJ4b3IiLAlPUCAoMHgwOSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJ4b3JpIiwJT1AgKDB4MzUpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgIm5vdCIsCU9QICgweDAxKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInNhciIsCU9QICgweDE1KSwJCU9QX01BU0ssCQl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAic2FyIiwJdHdvICgweDA3ZTAsIDB4MDBhMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInNobCIsCU9QICAoMHgxNiksCQlPUF9NQVNLLAkgICAgICAJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInNobCIsCXR3byAoMHgwN2UwLCAweDAwYzApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzaHIiLAlPUCAgKDB4MTQpLAkJT1BfTUFTSywJICAgICAgCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzaHIiLAl0d28gKDB4MDdlMCwgMHgwMDgwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAic2FzZiIsICAgICAgIHR3byAoMHgwN2UwLCAweDAyMDApLAl0d28gKDB4MDdmMCwgMHhmZmZmKSwgCXtDQ0NDLCBSMn0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCisKKy8qIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KKwkvKiBzaWduZWQgaW50ZWdlciAqLworeyAiYmd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImJnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJibHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYmxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKKwkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCit7ICJiaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYm5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImJsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJibmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAorCS8qIGNvbW1vbiAqLworeyAiYmUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImJuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCisJLyogb3RoZXJzICovCit7ICJidiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYm52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImJuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJicCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYmMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImJuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJieiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiYm56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImJyIiwJCUJPUCAoMHg1KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJic2EiLAlCT1AgKDB4ZCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAorCisvKiBCcmFuY2ggbWFjcm9zLgorCisgICBXZSB1c2UgdGhlIHNob3J0IGZvcm0gaW4gdGhlIG9wY29kZS9tYXNrIGZpZWxkcy4gIFRoZSBhc3NlbWJsZXIKKyAgIHdpbGwgdHdpZGRsZSBiaXRzIGFzIG5lY2Vzc2FyeSBpZiB0aGUgbG9uZyBmb3JtIGlzIG5lZWRlZC4gICovCisKKwkvKiBzaWduZWQgaW50ZWdlciAqLworeyAiamd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImpnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJqbHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiamxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKKwkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCit7ICJqaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiam5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImpsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJqbmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAorCS8qIGNvbW1vbiAqLworeyAiamUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImpuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCisJLyogb3RoZXJzICovCit7ICJqdiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiam52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImpuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJqcCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiamMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImpuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJqeiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiam56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImpzYSIsCUJPUCAoMHhkKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJqYnIiLAlCT1AgKDB4NSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAorICAKK3sgImpyIiwJCW9uZSAoMHgwNzgwKSwJCXR3byAoMHhmZmMwLCAweDAwMDEpLAl7RDIyfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAiamFybCIsCW9uZSAoMHgwNzgwKSwJCXR3byAoMHgwN2MwLCAweDAwMDEpLAl7RDIyLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTH0sIAorCisvKiBiaXQgbWFuaXB1bGF0aW9uIGluc3RydWN0aW9ucyAqLworeyAic2V0MSIsCXR3byAoMHgwN2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzZXQxIiwJdHdvICgweDA3ZTAsIDB4MDBlMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKK3sgIm5vdDEiLAl0d28gKDB4NDdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoreyAibm90MSIsCXR3byAoMHgwN2UwLCAweDAwZTIpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJjbHIxIiwJdHdvICgweDg3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKK3sgImNscjEiLAl0d28gKDB4MDdlMCwgMHgwMGU0KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksICAge1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCit7ICJ0c3QxIiwJdHdvICgweGM3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKK3sgInRzdDEiLAl0d28gKDB4MDdlMCwgMHgwMGU2KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAorCisvKiBzcGVjaWFsIGluc3RydWN0aW9ucyAqLworeyAiZGkiLAkJdHdvICgweDA3ZTAsIDB4MDE2MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImVpIiwJCXR3byAoMHg4N2UwLCAweDAxNjApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJoYWx0IiwJdHdvICgweDA3ZTAsIDB4MDEyMCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgInJldGkiLAl0d28gKDB4MDdlMCwgMHgwMTQwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAidHJhcCIsCXR3byAoMHgwN2UwLCAweDAxMDApLAl0d28gKDB4ZmZlMCwgMHhmZmZmKSwJe0k1VX0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKK3sgImxkc3IiLAl0d28gKDB4MDdlMCwgMHgwMDIwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMSwgU1IyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCit7ICJzdHNyIiwJdHdvICgweDA3ZTAsIDB4MDA0MCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7U1IxLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoreyAwLCAwLCAwLCB7MH0sIDAsIDAgfSwKKworfSA7CisKK2NvbnN0IGludCB2ODUwX251bV9vcGNvZGVzID0KKyAgc2l6ZW9mICh2ODUwX29wY29kZXMpIC8gc2l6ZW9mICh2ODUwX29wY29kZXNbMF0pOworCmRpZmYgLS1naXQgYS9vcGNvZGVzL3ZheC1kaXMuYyBiL29wY29kZXMvdmF4LWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjU5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3ZheC1kaXMuYwpAQCAtMCwwICsxLDI5OSBAQAorLyogUHJpbnQgVkFYIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFBhdWxpbmUgTWlkZGVsaW5rIDxtaWRkZWxpbkBwb2x5d2FyZS5pYWYubmw+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJvcGNvZGUvdmF4LmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorCisvKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50CitwcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgYmZkX3ZtYSwKKwkJCWRpc2Fzc2VtYmxlX2luZm8gKikpOworCitzdGF0aWMgaW50CitwcmludF9pbnNuX21vZGUgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOworCitzdGF0aWMgY2hhciAqcmVnX25hbWVzW10gPQoreworICAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAorICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJhcCIsICJmcCIsICJzcCIsICJwYyIKK307CisKKy8qIFNpZ24tZXh0ZW5kIGFuICh1bnNpZ25lZCBjaGFyKS4gKi8KKyNpZiBfX1NURENfXyA9PSAxCisjZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChzaWduZWQgY2hhcikoY2gpKQorI2Vsc2UKKyNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKGludCkoKChjaCkgXiAweDgwKSAmIDB4RkYpIC0gMTI4KQorI2VuZGlmCisKKy8qIEdldCBhIDEgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCisjZGVmaW5lIE5FWFRCWVRFKHApICBcCisgIChwICs9IDEsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCisgIENPRVJDRV9TSUdORURfQ0hBUihwWy0xXSkpCisKKy8qIEdldCBhIDIgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCisjZGVmaW5lIENPRVJDRTE2KHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMCkgLSAweDgwMDApKQorI2RlZmluZSBORVhUV09SRChwKSAgXAorICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAorICAgQ09FUkNFMTYgKChwWy0xXSA8PCA4KSArIHBbLTJdKSkKKworLyogR2V0IGEgNCBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KKyNkZWZpbmUgQ09FUkNFMzIoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKSkKKyNkZWZpbmUgTkVYVExPTkcocCkgIFwKKyAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKKyAgIChDT0VSQ0UzMiAoKCgoKChwWy0xXSA8PCA4KSArIHBbLTJdKSA8PCA4KSArIHBbLTNdKSA8PCA4KSArIHBbLTRdKSkpCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTUFYTEVOIDI1CisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworc3RydWN0IHByaXZhdGUKK3sKKyAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLworICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7CisgIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKKyAgYmZkX3ZtYSBpbnNuX3N0YXJ0OworICBqbXBfYnVmIGJhaWxvdXQ7Cit9OworCisvKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCisgICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKKyAgIG9uIGVycm9yLiAgKi8KKyNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCisgICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAorICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQorCitzdGF0aWMgaW50CitmZXRjaF9kYXRhIChpbmZvLCBhZGRyKQorICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKKyAgICAgYmZkX2J5dGUgKmFkZHI7Cit7CisgIGludCBzdGF0dXM7CisgIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKKyAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKKwkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKKwkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCisJCQkJICAgICAgaW5mbyk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7CisgICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcml2LT5tYXhfZmV0Y2hlZCA9IGFkZHI7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFByaW50IHRoZSB2YXggaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKKyAgIG9uIElORk8tPlNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLworCitpbnQKK3ByaW50X2luc25fdmF4IChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGNvbnN0IHN0cnVjdCB2b3QgKnZvdHA7CisgIGNvbnN0IGNoYXIgKmFyZ3AgPSBOVUxMOworICB1bnNpZ25lZCBjaGFyICphcmc7CisgIHN0cnVjdCBwcml2YXRlIHByaXY7CisgIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7CisKKyAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7CisgIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7CisgIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7CisgIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKKyAgICB7CisgICAgICAvKiBFcnJvciByZXR1cm4uICAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyAyKTsKKyAgZm9yICh2b3RwID0gJnZvdHN0cnNbMF07IHZvdHAtPm5hbWVbMF07IHZvdHArKykKKyAgICB7CisgICAgICByZWdpc3RlciB2YXhfb3Bjb2RlVCBvcGNvZGUgPSB2b3RwLT5kZXRhaWwuY29kZTsKKworICAgICAgLyogMiBieXRlIGNvZGVzIG1hdGNoIDIgYnVmZmVyIHBvcy4gKi8KKyAgICAgIGlmICgoYmZkX2J5dGUpIG9wY29kZSA9PSBidWZmZXJbMF0KKwkgICYmIChvcGNvZGUgPj4gOCA9PSAwIHx8IG9wY29kZSA+PiA4ID09IGJ1ZmZlclsxXSkpCisJeworCSAgYXJncCA9IHZvdHAtPmRldGFpbC5hcmdzOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKGFyZ3AgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBIYW5kbGUgdW5kZWZpbmVkIGluc3RydWN0aW9ucy4gKi8KKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHgleCIsCisJCQkgICAgIChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV0pOworICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgIC8qIFBvaW50IGF0IGZpcnN0IGJ5dGUgb2YgYXJndW1lbnQgZGF0YSwgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0CisgICAgIGFyZ3VtZW50LiAgKi8KKyAgYXJnID0gYnVmZmVyICsgKCh2b3RwLT5kZXRhaWwuY29kZSA+PiA4KSA/IDIgOiAxKTsKKworICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBpdCBpbiBtZW0gKi8KKyAgRkVUQ0hfREFUQSAoaW5mbywgYXJnKTsKKworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgdm90cC0+bmFtZSk7CisgIGlmICgqYXJncCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKKworICB3aGlsZSAoKmFyZ3ApCisgICAgeworICAgICAgYXJnICs9IHByaW50X2luc25fYXJnIChhcmdwLCBhcmcsIG1lbWFkZHIgKyBhcmcgLSBidWZmZXIsIGluZm8pOworICAgICAgYXJncCArPSAyOworICAgICAgaWYgKCphcmdwKQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOworICAgIH0KKworICByZXR1cm4gYXJnIC0gYnVmZmVyOworfQorCisvKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyAiZWF0ZW4iIGJ5IHRoZSBvcGVyYW5kLCBvciByZXR1cm4gLTEgaWYgYW4KKyAgIGludmFsaWQgb3BlcmFuZCB3YXMgZm91bmQsIG9yIC0yIGlmIGFuIG9wY29kZSB0YWJlbCBlcnJvciB3YXMKKyAgIGZvdW5kLiAqLworCitzdGF0aWMgaW50CitwcmludF9pbnNuX2FyZyAoZCwgcDAsIGFkZHIsIGluZm8pCisgICAgIGNvbnN0IGNoYXIgKmQ7CisgICAgIHVuc2lnbmVkIGNoYXIgKnAwOworICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaW50IGFyZ19sZW47CisKKyAgLyogY2hlY2sgdmFsaWRpdHkgb2YgYWRkcmVzc2luZyBsZW5ndGggKi8KKyAgc3dpdGNoIChkWzFdKQorICAgIHsKKyAgICBjYXNlICdiJyA6IGFyZ19sZW4gPSAxOwlicmVhazsKKyAgICBjYXNlICdkJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKKyAgICBjYXNlICdmJyA6IGFyZ19sZW4gPSA0OwlicmVhazsKKyAgICBjYXNlICdnJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKKyAgICBjYXNlICdoJyA6IGFyZ19sZW4gPSAxNjsJYnJlYWs7CisgICAgY2FzZSAnbCcgOiBhcmdfbGVuID0gNDsJYnJlYWs7CisgICAgY2FzZSAnbycgOiBhcmdfbGVuID0gMTY7CWJyZWFrOworICAgIGNhc2UgJ3cnIDogYXJnX2xlbiA9IDI7CWJyZWFrOworICAgIGNhc2UgJ3EnIDogYXJnX2xlbiA9IDg7CWJyZWFrOworICAgIGRlZmF1bHQgIDogYWJvcnQoKTsKKyAgICB9CisKKyAgLyogYnJhbmNoZXMgaGF2ZSBubyBtb2RlIGJ5dGUgKi8KKyAgaWYgKGRbMF0gPT0gJ2InKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBwMDsKKworICAgICAgaWYgKGFyZ19sZW4gPT0gMSkKKwkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAxICsgTkVYVEJZVEUgKHApLCBpbmZvKTsKKyAgICAgIGVsc2UKKwkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAyICsgTkVYVFdPUkQgKHApLCBpbmZvKTsKKworICAgICAgcmV0dXJuIHAgLSBwMDsKKyAgICB9CisKKyAgcmV0dXJuIHByaW50X2luc25fbW9kZSAoYXJnX2xlbiwgcDAsIGFkZHIsIGluZm8pOworfQorCitzdGF0aWMgaW50CitwcmludF9pbnNuX21vZGUgKHNpemUsIHAwLCBhZGRyLCBpbmZvKQorICAgICBpbnQgc2l6ZTsKKyAgICAgdW5zaWduZWQgY2hhciAqcDA7CisgICAgIGJmZF92bWEgYWRkcjsJCS8qIFBDIGZvciB0aGlzIGFyZyB0byBiZSByZWxhdGl2ZSB0byAqLworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICB1bnNpZ25lZCBjaGFyICpwID0gcDA7CisgIHVuc2lnbmVkIGNoYXIgbW9kZSwgcmVnOworCisgIC8qIGZldGNoIGFuZCBpbnRlcnByZXQgbW9kZSBieXRlICovCisgIG1vZGUgPSAodW5zaWduZWQgY2hhcikgTkVYVEJZVEUgKHApOworICByZWcgPSBtb2RlICYgMHhGOworICBzd2l0Y2ggKG1vZGUgJiAweEYwKQorICAgIHsKKyAgICBjYXNlIDB4MDA6CisgICAgY2FzZSAweDEwOgorICAgIGNhc2UgMHgyMDoKKyAgICBjYXNlIDB4MzA6IC8qIGxpdGVyYWwgbW9kZQkJCSRudW1iZXIgKi8KKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJDB4JXgiLCBtb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0MDogLyogaW5kZXg6CQkJYmFzZS1hZGRyW1JuXSAqLworICAgICAgcCArPSBwcmludF9pbnNuX21vZGUgKHNpemUsIHAwICsgMSwgYWRkciArIDEsIGluZm8pOworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbJXNdIiwgcmVnX25hbWVzW3JlZ10pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDUwOiAvKiByZWdpc3RlcjoJCQlSbiAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lc1tyZWddKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2MDogLyogcmVnaXN0ZXIgZGVmZXJyZWQ6CQkoUm4pICovCisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiglcykiLCByZWdfbmFtZXNbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NzA6IC8qIGF1dG9kZWNyZW1lbnQ6CQktKFJuKSAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItKCVzKSIsIHJlZ19uYW1lc1tyZWddKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4MDogLyogYXV0b2luY3JlbWVudDoJCShSbikrICovCisgICAgICBpZiAocmVnID09IDB4RikKKwl7CS8qIGltbWVkaWF0ZT8gKi8KKwkgIGludCBpOworCisJICBGRVRDSF9EQVRBIChpbmZvLCBwICsgc2l6ZSk7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQweCIpOworCSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlMDJ4IiwgcFtzaXplIC0gaSAtIDFdKTsKKwkgIHAgKz0gc2l6ZTsKKwl9CisgICAgICBlbHNlCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoJXMpKyIsIHJlZ19uYW1lc1tyZWddKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg5MDogLyogYXV0b2luY3JlbWVudCBkZWZlcnJlZDoJQChSbikrICovCisgICAgICBpZiAocmVnID09IDB4RikKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioweCV4IiwgTkVYVExPTkcgKHApKTsKKyAgICAgIGVsc2UKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoJXMpKyIsIHJlZ19uYW1lc1tyZWddKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhCMDogLyogZGlzcGxhY2VtZW50IGJ5dGUgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOworICAgIGNhc2UgMHhBMDogLyogZGlzcGxhY2VtZW50IGJ5dGU6CQlkaXNwbChSbikgKi8KKyAgICAgIGlmIChyZWcgPT0gMHhGKQorCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDIgKyBORVhUQllURSAocCksIGluZm8pOworICAgICAgZWxzZQorCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUQllURSAocCksCisJCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweEQwOiAvKiBkaXNwbGFjZW1lbnQgd29yZCBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7CisgICAgY2FzZSAweEMwOiAvKiBkaXNwbGFjZW1lbnQgd29yZDoJCWRpc3BsKFJuKSAqLworICAgICAgaWYgKHJlZyA9PSAweEYpCisJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMyArIE5FWFRXT1JEIChwKSwgaW5mbyk7CisgICAgICBlbHNlCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRXT1JEIChwKSwKKwkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4RjA6IC8qIGRpc3BsYWNlbWVudCBsb25nIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKKyAgICBjYXNlIDB4RTA6IC8qIGRpc3BsYWNlbWVudCBsb25nOgkJZGlzcGwoUm4pICovCisgICAgICBpZiAocmVnID09IDB4RikKKwkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyA1ICsgTkVYVExPTkcgKHApLCBpbmZvKTsKKyAgICAgIGVsc2UKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVExPTkcgKHApLAorCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gcCAtIHAwOworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy93NjUtZGlzLmMgYi9vcGNvZGVzL3c2NS1kaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTJlODk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy93NjUtZGlzLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIERpc2Fzc2VtYmxlIFdEQyA2NTgxNiBpbnN0cnVjdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBTVEFUSUNfVEFCTEUKKyNkZWZpbmUgREVGSU5FX1RBQkxFCisKKyNpbmNsdWRlICJ3NjUtb3BjLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorCitzdGF0aWMgICBmcHJpbnRmX2Z0eXBlIGZwcjsKK3N0YXRpYyAgIHZvaWQgKnN0cmVhbTsKK3N0YXRpYyAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICpsb2NhbF9pbmZvOworI2lmIDAKK3N0YXRpYyBjaGFyICpsbmFtZVtdID0gIHsicjAiLCJyMSIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiLCJyNyIsInMwIn07CisKK3N0YXRpYyBjaGFyICpmaW5kbmFtZSAodmFsKQorICAgICB1bnNpZ25lZCBpbnQgdmFsOworeworICBpZiAodmFsID49IDB4MTAgJiYgdmFsIDw9IDB4MjApCisgICAgcmV0dXJuIGxuYW1lWyh2YWwgLSAweDEwKSAvIDJdOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorc3RhdGljIHZvaWQKK3ByaW50X29wZXJhbmQgKGxvb2t1cCwgZm9ybWF0LCBhcmdzKQorICAgICBpbnQgbG9va3VwOworICAgICBjaGFyICpmb3JtYXQ7CisgICAgIHVuc2lnbmVkICAgICBpbnQgKmFyZ3M7Cit7CisgIGludCB2YWw7CisgIGludCBjOworCisgIHdoaWxlICgqZm9ybWF0KQorICAgIHsKKyAgICAgIHN3aXRjaCAoIGMgPSAqZm9ybWF0KyspIAorCXsKKwljYXNlICckJzoKKwkgIHZhbCA9IGFyZ3NbKCpmb3JtYXQrKykgLSAnMCddOworCSAgaWYgKGxvb2t1cCkgCisJICAgIHsKKyNpZiAwCisJICAgICAgbmFtZSA9IGZpbmRuYW1lKHZhbCk7CisJICAgICAgaWYgKG5hbWUpCisJCWZwcihzdHJlYW0sICIlcyIsIG5hbWUpOworCSAgICAgIGVsc2UKKyNlbmRpZgorCQlsb2NhbF9pbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgbG9jYWxfaW5mbyk7ICAKKwkgICAgfQorCSAgZWxzZQorCSAgICBmcHIgKHN0cmVhbSwgIjB4JXgiLCB2YWwpOworCisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZnByKHN0cmVhbSwiJWMiLCBjKTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CitpbnQgCitwcmludF9pbnNuX3c2NShtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworCisKKyAgaW50IHN0YXR1cyA9IDA7CisgIHVuc2lnbmVkIGNoYXIgaW5zbls0XTsKKyAgcmVnaXN0ZXIgc3RydWN0IG9waW5mbyAqb3A7CisgIGludCBpOworICBpbnQgWCA9MDsKKyAgaW50IE0gPSAwOworICBpbnQgYXJnc1syXTsKK3N0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgZnByID0gaW5mby0+ZnByaW50Zl9mdW5jOworbG9jYWxfaW5mbyA9ICAgIGluZm87CisgIGZvciAoaSA9IDA7IGkgPDQgJiYgc3RhdHVzID09IDA7IGkrKykgCisgICAgeworICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMobWVtYWRkcitpLCBpbnNuICsgaSwgMSwgaW5mbyk7CisgIH0KKworCisgIGZvciAob3AgPSBvcHRhYmxlOyBvcC0+dmFsICE9IGluc25bMF07IG9wKyspIAorICAgIDsKKworICBmcHIoc3RyZWFtLCIlcyIsIG9wLT5uYW1lKTsKKyAgCisgIC8qIFByZXBhcmUgYWxsIHRoZSBwb3NpYmxlIG9wZXJhbmQgdmFsdWVzICovCisgIHsKKyAgICBpbnQgc2l6ZSA9IDE7CisgICAgaW50IGFzUl9XNjVfQUJTOCA9IGluc25bMV07CisgICAgaW50IGFzUl9XNjVfQUJTMTYgPSAoaW5zblsyXSA8PCA4KSArIGFzUl9XNjVfQUJTODsKKyAgICBpbnQgYXNSX1c2NV9BQlMyNCA9IChpbnNuWzNdIDw8IDE2KSArIGFzUl9XNjVfQUJTMTY7CisgICAgaW50IGFzUl9XNjVfUENSOCA9ICgoY2hhcikoYXNSX1c2NV9BQlM4KSkgKyBtZW1hZGRyICsgMjsKKyAgICBpbnQgYXNSX1c2NV9QQ1IxNiA9ICgoc2hvcnQpKGFzUl9XNjVfQUJTMTYpKSArIG1lbWFkZHIgKyAzOworCisgICAgc3dpdGNoIChvcC0+YW1vZGUpIHsKKyAgICAgIERJU0FTTSgpOworICAgIH0KKworICByZXR1cm4gc2l6ZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcGNvZGVzL3c2NS1vcGMuaCBiL29wY29kZXMvdzY1LW9wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzM1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3c2NS1vcGMuaApAQCAtMCwwICsxLDU0OCBAQAorCQkJLyogV0RDIDY1ODE2IEFzc2VtYmxlciBvcGNvZGUgdGFibGUgKi8KKwkJCS8qICAgKGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSBzaW0vdzY1L2dlbmNvZGUgLWEpICovCisjZGVmaW5lIEFERFJfSU1NVE9BICAgICAgICAgICAgICAxCSAvKiAjYSAgICAgICovCisjZGVmaW5lIEFERFJfSU1NQ09QICAgICAgICAgICAgICAyCSAvKiAjYyAgICAgICovCisjZGVmaW5lIEFERFJfSU1NVE9JICAgICAgICAgICAgICAzCSAvKiAjaSAgICAgICovCisjZGVmaW5lIEFERFJfQUNDICAgICAgICAgICAgICAgICA0CSAvKiBBICAgICAgICovCisjZGVmaW5lIEFERFJfUENfUkVMICAgICAgICAgICAgICA1CSAvKiByICAgICAgICovCisjZGVmaW5lIEFERFJfUENfUkVMX0xPTkcgICAgICAgICA2CSAvKiBybCAgICAgICovCisjZGVmaW5lIEFERFJfSU1QTElFRCAgICAgICAgICAgICA3CSAvKiBpICAgICAgICovCisjZGVmaW5lIEFERFJfU1RBQ0sgICAgICAgICAgICAgICA4CSAvKiBzICAgICAgICovCisjZGVmaW5lIEFERFJfRElSICAgICAgICAgICAgICAgICA5CSAvKiBkICAgICAgICovCisjZGVmaW5lIEFERFJfRElSX0lEWF9YICAgICAgICAgICAxMAkgLyogZCx4ICAgICAqLworI2RlZmluZSBBRERSX0RJUl9JRFhfWSAgICAgICAgICAgMTEJIC8qIGQseSAgICAgKi8KKyNkZWZpbmUgQUREUl9ESVJfSU5EICAgICAgICAgICAgIDEyCSAvKiAoZCkgICAgICovCisjZGVmaW5lIEFERFJfRElSX0lEWF9JTkRfWCAgICAgICAxMwkgLyogKGQseCkgICAqLworI2RlZmluZSBBRERSX0RJUl9JTkRfSURYX1kgICAgICAgMTQJIC8qIChkKSx5ICAgKi8KKyNkZWZpbmUgQUREUl9ESVJfSU5EX0xPTkcgICAgICAgIDE1CSAvKiBbZF0gICAgICovCisjZGVmaW5lIEFERFJfRElSX0lORF9JRFhfWV9MT05HICAxNgkgLyogW2RdLHkgICAqLworI2RlZmluZSBBRERSX0FCUyAgICAgICAgICAgICAgICAgMTcJIC8qIGEgICAgICAgKi8KKyNkZWZpbmUgQUREUl9BQlNfSURYX1ggICAgICAgICAgIDE4CSAvKiBhLHggICAgICovCisjZGVmaW5lIEFERFJfQUJTX0lEWF9ZICAgICAgICAgICAxOQkgLyogYSx5ICAgICAqLworI2RlZmluZSBBRERSX0FCU19MT05HICAgICAgICAgICAgMjAJIC8qIGFsICAgICAgKi8KKyNkZWZpbmUgQUREUl9BQlNfSU5EX0xPTkcgICAgICAgIDIxCSAvKiBbYV0gICAgICovCisjZGVmaW5lIEFERFJfQUJTX0xPTkdfSURYX1ggICAgICAyMgkgLyogYWwseCAgICAqLworI2RlZmluZSBBRERSX1NUQUNLX1JFTCAgICAgICAgICAgMjMJIC8qIGQscyAgICAgKi8KKyNkZWZpbmUgQUREUl9TVEFDS19SRUxfSU5EWF9JRFggIDI0CSAvKiAoZCxzKSx5ICovCisjZGVmaW5lIEFERFJfQUJTX0lORCAgICAgICAgICAgICAyNQkgLyogKGEpICAgICAqLworI2RlZmluZSBBRERSX0FCU19JTkRfSURYICAgICAgICAgMjYJIC8qIChhLHgpICAgKi8KKyNkZWZpbmUgQUREUl9CTE9DS19NT1ZFICAgICAgICAgIDI3CSAvKiB4eXogICAgICovCitzdHJ1Y3Qgb3BpbmZvIHsKKwlpbnQgdmFsOworCWludCBjb2RlOworCWNoYXIgKm5hbWU7CisJaW50IGFtb2RlOworfTsKK3N0cnVjdCBvcGluZm8gb3B0YWJsZVsyNTddPXsKKyNkZWZpbmUgT19hZGMgMQorI2RlZmluZSBPX2FuZCAyCisjZGVmaW5lIE9fYXNsIDMKKyNkZWZpbmUgT19iY2MgNAorI2RlZmluZSBPX2JjcyA1CisjZGVmaW5lIE9fYmVxIDYKKyNkZWZpbmUgT19iaXQgNworI2RlZmluZSBPX2JtaSA4CisjZGVmaW5lIE9fYm5lIDkKKyNkZWZpbmUgT19icGwgMTAKKyNkZWZpbmUgT19icmEgMTEKKyNkZWZpbmUgT19icmsgMTIKKyNkZWZpbmUgT19icmwgMTMKKyNkZWZpbmUgT19idmMgMTQKKyNkZWZpbmUgT19idnMgMTUKKyNkZWZpbmUgT19jbGMgMTYKKyNkZWZpbmUgT19jbGQgMTcKKyNkZWZpbmUgT19jbGkgMTgKKyNkZWZpbmUgT19jbHYgMTkKKyNkZWZpbmUgT19jbXAgMjAKKyNkZWZpbmUgT19jb3AgMjEKKyNkZWZpbmUgT19jcHggMjIKKyNkZWZpbmUgT19jcHkgMjMKKyNkZWZpbmUgT19kZWMgMjQKKyNkZWZpbmUgT19kZXggMjUKKyNkZWZpbmUgT19kZXkgMjYKKyNkZWZpbmUgT19lb3IgMjcKKyNkZWZpbmUgT19pbmMgMjgKKyNkZWZpbmUgT19pbnggMjkKKyNkZWZpbmUgT19pbnkgMzAKKyNkZWZpbmUgT19qbXAgMzEKKyNkZWZpbmUgT19qc3IgMzIKKyNkZWZpbmUgT19sZGEgMzMKKyNkZWZpbmUgT19sZHggMzQKKyNkZWZpbmUgT19sZHkgMzUKKyNkZWZpbmUgT19sc3IgMzYKKyNkZWZpbmUgT19tdm4gMzcKKyNkZWZpbmUgT19tdnAgMzgKKyNkZWZpbmUgT19ub3AgMzkKKyNkZWZpbmUgT19vcmEgNDAKKyNkZWZpbmUgT19wZWEgNDEKKyNkZWZpbmUgT19wZWkgNDIKKyNkZWZpbmUgT19wZXIgNDMKKyNkZWZpbmUgT19waGEgNDQKKyNkZWZpbmUgT19waGIgNDUKKyNkZWZpbmUgT19waGQgNDYKKyNkZWZpbmUgT19waGsgNDcKKyNkZWZpbmUgT19waHAgNDgKKyNkZWZpbmUgT19waHggNDkKKyNkZWZpbmUgT19waHkgNTAKKyNkZWZpbmUgT19wbGEgNTEKKyNkZWZpbmUgT19wbGIgNTIKKyNkZWZpbmUgT19wbGQgNTMKKyNkZWZpbmUgT19wbHAgNTQKKyNkZWZpbmUgT19wbHggNTUKKyNkZWZpbmUgT19wbHkgNTYKKyNkZWZpbmUgT19yZXAgNTcKKyNkZWZpbmUgT19yb2wgNTgKKyNkZWZpbmUgT19yb3IgNTkKKyNkZWZpbmUgT19ydGkgNjAKKyNkZWZpbmUgT19ydGwgNjEKKyNkZWZpbmUgT19ydHMgNjIKKyNkZWZpbmUgT19zYmMgNjMKKyNkZWZpbmUgT19zZWMgNjQKKyNkZWZpbmUgT19zZWQgNjUKKyNkZWZpbmUgT19zZWkgNjYKKyNkZWZpbmUgT19zZXAgNjcKKyNkZWZpbmUgT19zdGEgNjgKKyNkZWZpbmUgT19zdHAgNjkKKyNkZWZpbmUgT19zdHggNzAKKyNkZWZpbmUgT19zdHkgNzEKKyNkZWZpbmUgT19zdHogNzIKKyNkZWZpbmUgT190YXggNzMKKyNkZWZpbmUgT190YXkgNzQKKyNkZWZpbmUgT190Y2QgNzUKKyNkZWZpbmUgT190Y3MgNzYKKyNkZWZpbmUgT190ZGMgNzcKKyNkZWZpbmUgT190cmIgNzgKKyNkZWZpbmUgT190c2IgNzkKKyNkZWZpbmUgT190c2MgODAKKyNkZWZpbmUgT190c3ggODEKKyNkZWZpbmUgT190eGEgODIKKyNkZWZpbmUgT190eHMgODMKKyNkZWZpbmUgT190eHkgODQKKyNkZWZpbmUgT190eWEgODUKKyNkZWZpbmUgT190eXggODYKKyNkZWZpbmUgT193YWkgODcKKyNkZWZpbmUgT193ZG0gODgKKyNkZWZpbmUgT194YmEgODkKKyNkZWZpbmUgT194Y2UgOTAKKyNpZmRlZiBERUZJTkVfVEFCTEUKKwl7MHg2OSwJT19hZGMsCSJhZGMiLAlBRERSX0lNTVRPQX0sCisJezB4NzIsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EfSwKKwl7MHg3MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAorCXsweDczLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKKwl7MHg2MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAorCXsweDY3LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9MT05HfSwKKwl7MHg3NywJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCisJezB4NkQsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlN9LAorCXsweDdELAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHg3OSwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19JRFhfWX0sCisJezB4NkYsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR30sCisJezB4N0YsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCisJezB4NjUsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJ9LAorCXsweDYzLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMfSwKKwl7MHg3NSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4MjksCU9fYW5kLAkiYW5kIiwJQUREUl9JTU1UT0F9LAorCXsweDMyLAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORH0sCisJezB4MzEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKKwl7MHgzMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCisJezB4MjEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX0lORF9YfSwKKwl7MHgyNywJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfTE9OR30sCisJezB4MzcsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAorCXsweDJELAlPX2FuZCwJImFuZCIsCUFERFJfQUJTfSwKKwl7MHgzRCwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19JRFhfWH0sCisJezB4MzksCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfSURYX1l9LAorCXsweDJGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkd9LAorCXsweDNGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAorCXsweDI1LAlPX2FuZCwJImFuZCIsCUFERFJfRElSfSwKKwl7MHgyMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTH0sCisJezB4MzUsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX1h9LAorCXsweDBBLAlPX2FzbCwJImFzbCIsCUFERFJfQUNDfSwKKwl7MHgwRSwJT19hc2wsCSJhc2wiLAlBRERSX0FCU30sCisJezB4MUUsCU9fYXNsLAkiYXNsIiwJQUREUl9BQlNfSURYX1h9LAorCXsweDA2LAlPX2FzbCwJImFzbCIsCUFERFJfRElSfSwKKwl7MHgxNiwJT19hc2wsCSJhc2wiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4OTAsCU9fYmNjLAkiYmNjIiwJQUREUl9QQ19SRUx9LAorCXsweEIwLAlPX2JjcywJImJjcyIsCUFERFJfUENfUkVMfSwKKwl7MHhGMCwJT19iZXEsCSJiZXEiLAlBRERSX1BDX1JFTH0sCisJezB4ODksCU9fYml0LAkiYml0IiwJQUREUl9JTU1UT0F9LAorCXsweDI0LAlPX2JpdCwJImJpdCIsCUFERFJfRElSX0lORH0sCisJezB4MzQsCU9fYml0LAkiYml0IiwJQUREUl9ESVJfSURYX0lORF9YfSwKKwl7MHgyQywJT19iaXQsCSJiaXQiLAlBRERSX0FCU30sCisJezB4M0MsCU9fYml0LAkiYml0IiwJQUREUl9BQlNfSURYX1h9LAorCXsweDMwLAlPX2JtaSwJImJtaSIsCUFERFJfUENfUkVMfSwKKwl7MHhEMCwJT19ibmUsCSJibmUiLAlBRERSX1BDX1JFTH0sCisJezB4MTAsCU9fYnBsLAkiYnBsIiwJQUREUl9QQ19SRUx9LAorCXsweDgwLAlPX2JyYSwJImJyYSIsCUFERFJfUENfUkVMfSwKKwl7MHgwMCwJT19icmssCSJicmsiLAlBRERSX1NUQUNLfSwKKwl7MHg4MiwJT19icmwsCSJicmwiLAlBRERSX1BDX1JFTF9MT05HfSwKKwl7MHg1MCwJT19idmMsCSJidmMiLAlBRERSX1BDX1JFTH0sCisJezB4NzAsCU9fYnZzLAkiYnZzIiwJQUREUl9QQ19SRUx9LAorCXsweDE4LAlPX2NsYywJImNsYyIsCUFERFJfSU1QTElFRH0sCisJezB4RDgsCU9fY2xkLAkiY2xkIiwJQUREUl9JTVBMSUVEfSwKKwl7MHg1OCwJT19jbGksCSJjbGkiLAlBRERSX0lNUExJRUR9LAorCXsweEI4LAlPX2NsdiwJImNsdiIsCUFERFJfSU1QTElFRH0sCisJezB4QzksCU9fY21wLAkiY21wIiwJQUREUl9JTU1UT0F9LAorCXsweEQyLAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORH0sCisJezB4RDEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKKwl7MHhEMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCisJezB4QzEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX0lORF9YfSwKKwl7MHhDNywJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfTE9OR30sCisJezB4RDcsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAorCXsweENELAlPX2NtcCwJImNtcCIsCUFERFJfQUJTfSwKKwl7MHhERCwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19JRFhfWH0sCisJezB4RDksCU9fY21wLAkiY21wIiwJQUREUl9BQlNfSURYX1l9LAorCXsweENGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkd9LAorCXsweERGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAorCXsweEM1LAlPX2NtcCwJImNtcCIsCUFERFJfRElSfSwKKwl7MHhDMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTH0sCisJezB4RDUsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX1h9LAorCXsweDAyLAlPX2NvcCwJImNvcCIsCUFERFJfSU1NQ09QfSwKKwl7MHhFMCwJT19jcHgsCSJjcHgiLAlBRERSX0lNTVRPSX0sCisJezB4RUMsCU9fY3B4LAkiY3B4IiwJQUREUl9BQlN9LAorCXsweEU0LAlPX2NweCwJImNweCIsCUFERFJfRElSfSwKKwl7MHhDMCwJT19jcHksCSJjcHkiLAlBRERSX0lNTVRPSX0sCisJezB4Q0MsCU9fY3B5LAkiY3B5IiwJQUREUl9BQlN9LAorCXsweEM0LAlPX2NweSwJImNweSIsCUFERFJfRElSfSwKKwl7MHgzQSwJT19kZWMsCSJkZWMiLAlBRERSX0FDQ30sCisJezB4Q0UsCU9fZGVjLAkiZGVjIiwJQUREUl9BQlN9LAorCXsweERFLAlPX2RlYywJImRlYyIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHhDNiwJT19kZWMsCSJkZWMiLAlBRERSX0RJUn0sCisJezB4RDYsCU9fZGVjLAkiZGVjIiwJQUREUl9ESVJfSURYX1h9LAorCXsweENBLAlPX2RleCwJImRleCIsCUFERFJfSU1QTElFRH0sCisJezB4ODgsCU9fZGV5LAkiZGV5IiwJQUREUl9JTVBMSUVEfSwKKwl7MHg0OSwJT19lb3IsCSJlb3IiLAlBRERSX0lNTVRPQX0sCisJezB4NTIsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EfSwKKwl7MHg1MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1l9LAorCXsweDUzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKKwl7MHg0MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAorCXsweDQ3LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9MT05HfSwKKwl7MHg1NywJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCisJezB4NEQsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlN9LAorCXsweDVELAlPX2VvciwJImVvciIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHg1OSwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19JRFhfWX0sCisJezB4NEYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR30sCisJezB4NUYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCisJezB4NDUsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJ9LAorCXsweDQzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMfSwKKwl7MHg1NSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4MUEsCU9faW5jLAkiaW5jIiwJQUREUl9BQ0N9LAorCXsweEVFLAlPX2luYywJImluYyIsCUFERFJfQUJTfSwKKwl7MHhGRSwJT19pbmMsCSJpbmMiLAlBRERSX0FCU19JRFhfWH0sCisJezB4RTYsCU9faW5jLAkiaW5jIiwJQUREUl9ESVJ9LAorCXsweEY2LAlPX2luYywJImluYyIsCUFERFJfRElSX0lEWF9YfSwKKwl7MHhFOCwJT19pbngsCSJpbngiLAlBRERSX0lNUExJRUR9LAorCXsweEM4LAlPX2lueSwJImlueSIsCUFERFJfSU1QTElFRH0sCisJezB4NkMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfSU5EfSwKKwl7MHg3QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfSURYfSwKKwl7MHhEQywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfTE9OR30sCisJezB4NEMsCU9fam1wLAkiam1wIiwJQUREUl9BQlN9LAorCXsweDVDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0xPTkd9LAorCXsweEZDLAlPX2pzciwJImpzciIsCUFERFJfQUJTX0lORF9JRFh9LAorCXsweDIwLAlPX2pzciwJImpzciIsCUFERFJfQUJTfSwKKwl7MHgyMiwJT19qc3IsCSJqc3IiLAlBRERSX0FCU19MT05HfSwKKwl7MHhBOSwJT19sZGEsCSJsZGEiLAlBRERSX0lNTVRPQX0sCisJezB4QjIsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EfSwKKwl7MHhCMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAorCXsweEIzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKKwl7MHhBMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAorCXsweEE3LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9MT05HfSwKKwl7MHhCNywJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCisJezB4QUQsCU9fbGRhLAkibGRhIiwJQUREUl9BQlN9LAorCXsweEJELAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHhCOSwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19JRFhfWX0sCisJezB4QUYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR30sCisJezB4QkYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCisJezB4QTUsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJ9LAorCXsweEEzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMfSwKKwl7MHhCNSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4QTIsCU9fbGR4LAkibGR4IiwJQUREUl9JTU1UT0l9LAorCXsweEFFLAlPX2xkeCwJImxkeCIsCUFERFJfQUJTfSwKKwl7MHhCRSwJT19sZHgsCSJsZHgiLAlBRERSX0FCU19JRFhfWX0sCisJezB4QTYsCU9fbGR4LAkibGR4IiwJQUREUl9ESVJ9LAorCXsweEI2LAlPX2xkeCwJImxkeCIsCUFERFJfRElSX0lEWF9ZfSwKKwl7MHhBMCwJT19sZHksCSJsZHkiLAlBRERSX0lNTVRPSX0sCisJezB4QUMsCU9fbGR5LAkibGR5IiwJQUREUl9BQlN9LAorCXsweEJDLAlPX2xkeSwJImxkeSIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHhBNCwJT19sZHksCSJsZHkiLAlBRERSX0RJUn0sCisJezB4QjQsCU9fbGR5LAkibGR5IiwJQUREUl9ESVJfSURYX1h9LAorCXsweDRBLAlPX2xzciwJImxzciIsCUFERFJfQUNDfSwKKwl7MHg0RSwJT19sc3IsCSJsc3IiLAlBRERSX0FCU30sCisJezB4NUUsCU9fbHNyLAkibHNyIiwJQUREUl9BQlNfSURYX1h9LAorCXsweDQ2LAlPX2xzciwJImxzciIsCUFERFJfRElSfSwKKwl7MHg1NiwJT19sc3IsCSJsc3IiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4NTQsCU9fbXZuLAkibXZuIiwJQUREUl9CTE9DS19NT1ZFfSwKKwl7MHg0NCwJT19tdnAsCSJtdnAiLAlBRERSX0JMT0NLX01PVkV9LAorCXsweEVBLAlPX25vcCwJIm5vcCIsCUFERFJfSU1QTElFRH0sCisJezB4MDksCU9fb3JhLAkib3JhIiwJQUREUl9JTU1UT0F9LAorCXsweDEyLAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORH0sCisJezB4MTEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKKwl7MHgxMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCisJezB4MDEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKKwl7MHgwNywJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfTE9OR30sCisJezB4MTcsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAorCXsweDBELAlPX29yYSwJIm9yYSIsCUFERFJfQUJTfSwKKwl7MHgxRCwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19JRFhfWH0sCisJezB4MTksCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfSURYX1l9LAorCXsweDBGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkd9LAorCXsweDFGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAorCXsweDA1LAlPX29yYSwJIm9yYSIsCUFERFJfRElSfSwKKwl7MHgwMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTH0sCisJezB4MTUsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX1h9LAorCXsweEY0LAlPX3BlYSwJInBlYSIsCUFERFJfQUJTfSwKKwl7MHhENCwJT19wZWksCSJwZWkiLAlBRERSX0RJUn0sCisJezB4NjIsCU9fcGVyLAkicGVyIiwJQUREUl9QQ19SRUxfTE9OR30sCisJezB4NDgsCU9fcGhhLAkicGhhIiwJQUREUl9TVEFDS30sCisJezB4OEIsCU9fcGhiLAkicGhiIiwJQUREUl9TVEFDS30sCisJezB4MEIsCU9fcGhkLAkicGhkIiwJQUREUl9TVEFDS30sCisJezB4NEIsCU9fcGhrLAkicGhrIiwJQUREUl9TVEFDS30sCisJezB4MDgsCU9fcGhwLAkicGhwIiwJQUREUl9TVEFDS30sCisJezB4REEsCU9fcGh4LAkicGh4IiwJQUREUl9TVEFDS30sCisJezB4NUEsCU9fcGh5LAkicGh5IiwJQUREUl9TVEFDS30sCisJezB4NjgsCU9fcGxhLAkicGxhIiwJQUREUl9TVEFDS30sCisJezB4QUIsCU9fcGxiLAkicGxiIiwJQUREUl9TVEFDS30sCisJezB4MkIsCU9fcGxkLAkicGxkIiwJQUREUl9TVEFDS30sCisJezB4MjgsCU9fcGxwLAkicGxwIiwJQUREUl9TVEFDS30sCisJezB4RkEsCU9fcGx4LAkicGx4IiwJQUREUl9TVEFDS30sCisJezB4N0EsCU9fcGx5LAkicGx5IiwJQUREUl9TVEFDS30sCisJezB4QzIsCU9fcmVwLAkicmVwIiwJQUREUl9JTU1DT1B9LAorCXsweDJBLAlPX3JvbCwJInJvbCIsCUFERFJfQUNDfSwKKwl7MHgyRSwJT19yb2wsCSJyb2wiLAlBRERSX0FCU30sCisJezB4M0UsCU9fcm9sLAkicm9sIiwJQUREUl9BQlNfSURYX1h9LAorCXsweDI2LAlPX3JvbCwJInJvbCIsCUFERFJfRElSfSwKKwl7MHgzNiwJT19yb2wsCSJyb2wiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4NkEsCU9fcm9yLAkicm9yIiwJQUREUl9BQ0N9LAorCXsweDZFLAlPX3JvciwJInJvciIsCUFERFJfQUJTfSwKKwl7MHg3RSwJT19yb3IsCSJyb3IiLAlBRERSX0FCU19JRFhfWH0sCisJezB4NjYsCU9fcm9yLAkicm9yIiwJQUREUl9ESVJ9LAorCXsweDc2LAlPX3JvciwJInJvciIsCUFERFJfRElSX0lEWF9YfSwKKwl7MHg0MCwJT19ydGksCSJydGkiLAlBRERSX1NUQUNLfSwKKwl7MHg2QiwJT19ydGwsCSJydGwiLAlBRERSX1NUQUNLfSwKKwl7MHg2MCwJT19ydHMsCSJydHMiLAlBRERSX1NUQUNLfSwKKwl7MHhFOSwJT19zYmMsCSJzYmMiLAlBRERSX0lNTVRPQX0sCisJezB4RjIsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EfSwKKwl7MHhGMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAorCXsweEYzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKKwl7MHhFMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAorCXsweEU3LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9MT05HfSwKKwl7MHhGNywJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCisJezB4RUQsCU9fc2JjLAkic2JjIiwJQUREUl9BQlN9LAorCXsweEZELAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHhGOSwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19JRFhfWX0sCisJezB4RUYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR30sCisJezB4RkYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCisJezB4RTUsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJ9LAorCXsweEUzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMfSwKKwl7MHhGNSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4MzgsCU9fc2VjLAkic2VjIiwJQUREUl9JTVBMSUVEfSwKKwl7MHhGOCwJT19zZWQsCSJzZWQiLAlBRERSX0lNUExJRUR9LAorCXsweDc4LAlPX3NlaSwJInNlaSIsCUFERFJfSU1QTElFRH0sCisJezB4RTIsCU9fc2VwLAkic2VwIiwJQUREUl9JTU1DT1B9LAorCXsweDkyLAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORH0sCisJezB4OTEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKKwl7MHg5MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCisJezB4ODEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKKwl7MHg4NywJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfTE9OR30sCisJezB4OTcsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAorCXsweDhELAlPX3N0YSwJInN0YSIsCUFERFJfQUJTfSwKKwl7MHg5RCwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19JRFhfWH0sCisJezB4OTksCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfSURYX1l9LAorCXsweDhGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkd9LAorCXsweDlGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAorCXsweDg1LAlPX3N0YSwJInN0YSIsCUFERFJfRElSfSwKKwl7MHg4MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTH0sCisJezB4OTUsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX1h9LAorCXsweERCLAlPX3N0cCwJInN0cCIsCUFERFJfSU1QTElFRH0sCisJezB4OEUsCU9fc3R4LAkic3R4IiwJQUREUl9BQlN9LAorCXsweDg2LAlPX3N0eCwJInN0eCIsCUFERFJfRElSfSwKKwl7MHg5NiwJT19zdHgsCSJzdHgiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4OEMsCU9fc3R5LAkic3R5IiwJQUREUl9BQlN9LAorCXsweDg0LAlPX3N0eSwJInN0eSIsCUFERFJfRElSfSwKKwl7MHg5NCwJT19zdHksCSJzdHkiLAlBRERSX0RJUl9JRFhfWH0sCisJezB4OUMsCU9fc3R6LAkic3R6IiwJQUREUl9BQlN9LAorCXsweDlFLAlPX3N0eiwJInN0eiIsCUFERFJfQUJTX0lEWF9YfSwKKwl7MHg2NCwJT19zdHosCSJzdHoiLAlBRERSX0RJUn0sCisJezB4NzQsCU9fc3R6LAkic3R6IiwJQUREUl9ESVJfSURYX1h9LAorCXsweEFBLAlPX3RheCwJInRheCIsCUFERFJfSU1QTElFRH0sCisJezB4QTgsCU9fdGF5LAkidGF5IiwJQUREUl9JTVBMSUVEfSwKKwl7MHg1QiwJT190Y2QsCSJ0Y2QiLAlBRERSX0lNUExJRUR9LAorCXsweDFCLAlPX3RjcywJInRjcyIsCUFERFJfSU1QTElFRH0sCisJezB4N0IsCU9fdGRjLAkidGRjIiwJQUREUl9JTVBMSUVEfSwKKwl7MHgxQywJT190cmIsCSJ0cmIiLAlBRERSX0FCU30sCisJezB4MTQsCU9fdHJiLAkidHJiIiwJQUREUl9ESVJ9LAorCXsweDBDLAlPX3RzYiwJInRzYiIsCUFERFJfQUJTfSwKKwl7MHgwNCwJT190c2IsCSJ0c2IiLAlBRERSX0RJUn0sCisJezB4M0IsCU9fdHNjLAkidHNjIiwJQUREUl9JTVBMSUVEfSwKKwl7MHhCQSwJT190c3gsCSJ0c3giLAlBRERSX0lNUExJRUR9LAorCXsweDhBLAlPX3R4YSwJInR4YSIsCUFERFJfSU1QTElFRH0sCisJezB4OUEsCU9fdHhzLAkidHhzIiwJQUREUl9JTVBMSUVEfSwKKwl7MHg5QiwJT190eHksCSJ0eHkiLAlBRERSX0lNUExJRUR9LAorCXsweDk4LAlPX3R5YSwJInR5YSIsCUFERFJfSU1QTElFRH0sCisJezB4QkIsCU9fdHl4LAkidHl4IiwJQUREUl9JTVBMSUVEfSwKKwl7MHhDQiwJT193YWksCSJ3YWkiLAlBRERSX0lNUExJRUR9LAorCXsweDQyLAlPX3dkbSwJIndkbSIsCUFERFJfSU1QTElFRH0sCisJezB4RUIsCU9feGJhLAkieGJhIiwJQUREUl9JTVBMSUVEfSwKKwl7MHhGQiwJT194Y2UsCSJ4Y2UiLAlBRERSX0lNUExJRUR9LAorCXsgMCB9Cit9OworI2VuZGlmCisjZGVmaW5lIERJU0FTTSgpXAorICBjYXNlIEFERFJfSU1NVE9BOlwKKwlhcmdzWzBdID0gTT09MCA/IGFzUl9XNjVfQUJTMTYgOiBhc1JfVzY1X0FCUzg7XAorCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAorCXNpemUgKz0gTT09MCA/IDI6MTtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfSU1NQ09QOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKKwlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKKwlzaXplICs9IDE7XAorCWJyZWFrO1wKKyAgY2FzZSBBRERSX0lNTVRPSTpcCisJYXJnc1swXSA9IFg9PTAgPyBhc1JfVzY1X0FCUzE2IDogYXNSX1c2NV9BQlM4O1wKKwlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKKwlzaXplICs9IFg9PTAgPyAyOjE7XAorCWJyZWFrO1wKKyAgY2FzZSBBRERSX0FDQzpcCisJcHJpbnRfb3BlcmFuZCAoMCwgIglhIiwgMCk7XAorCXNpemUgKz0gMDtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfUENfUkVMOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9QQ1I4O1wKKwlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAorCXNpemUgKz0gMTtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfUENfUkVMX0xPTkc6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X1BDUjE2O1wKKwlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAorCXNpemUgKz0gMjtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfSU1QTElFRDpcCisJCXNpemUgKz0gMDtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfU1RBQ0s6XAorCQlzaXplICs9IDA7XAorCWJyZWFrO1wKKyAgY2FzZSBBRERSX0RJUjpcCisJYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAiLCBhcmdzKTtcCisJc2l6ZSArPSAxO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9ESVJfSURYX1g6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAorCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHgiLCBhcmdzKTtcCisJc2l6ZSArPSAxO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9ESVJfSURYX1k6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAorCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHkiLCBhcmdzKTtcCisJc2l6ZSArPSAxO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9ESVJfSU5EOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKKwlwcmludF9vcGVyYW5kICgxLCAiCSg8JDApIiwgYXJncyk7XAorCXNpemUgKz0gMTtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfRElSX0lEWF9JTkRfWDpcCisJYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwLHgpIiwgYXJncyk7XAorCXNpemUgKz0gMTtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfRElSX0lORF9JRFhfWTpcCisJYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwKSx5IiwgYXJncyk7XAorCXNpemUgKz0gMTtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfRElSX0lORF9MT05HOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKKwlwcmludF9vcGVyYW5kICgxLCAiCVskMF0iLCBhcmdzKTtcCisJc2l6ZSArPSAxO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAorCXByaW50X29wZXJhbmQgKDEsICIJWyQwXSx5IiwgYXJncyk7XAorCXNpemUgKz0gMTtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfQUJTOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAiLCBhcmdzKTtcCisJc2l6ZSArPSAyO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9BQlNfSURYX1g6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKKwlwcmludF9vcGVyYW5kICgxLCAiCSEkMCx4IiwgYXJncyk7XAorCXNpemUgKz0gMjtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfQUJTX0lEWF9ZOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAseSIsIGFyZ3MpO1wKKwlzaXplICs9IDI7XAorCWJyZWFrO1wKKyAgY2FzZSBBRERSX0FCU19MT05HOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlMyNDtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgk+JDAiLCBhcmdzKTtcCisJc2l6ZSArPSAzO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9BQlNfSU5EX0xPTkc6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKKwlwcmludF9vcGVyYW5kICgxLCAiCVs+JDBdIiwgYXJncyk7XAorCXNpemUgKz0gMjtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfQUJTX0xPTkdfSURYX1g6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzI0O1wKKwlwcmludF9vcGVyYW5kICgxLCAiCT4kMCx4IiwgYXJncyk7XAorCXNpemUgKz0gMztcCisJYnJlYWs7XAorICBjYXNlIEFERFJfU1RBQ0tfUkVMOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKKwlwcmludF9vcGVyYW5kICgwLCAiCSQwLHMiLCBhcmdzKTtcCisJc2l6ZSArPSAxO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9TVEFDS19SRUxfSU5EWF9JRFg6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAorCXByaW50X29wZXJhbmQgKDAsICIJKCQwLHMpLHkiLCBhcmdzKTtcCisJc2l6ZSArPSAxO1wKKwlicmVhaztcCisgIGNhc2UgQUREUl9BQlNfSU5EOlwKKwlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCisJcHJpbnRfb3BlcmFuZCAoMSwgIgkoJDApIiwgYXJncyk7XAorCXNpemUgKz0gMjtcCisJYnJlYWs7XAorICBjYXNlIEFERFJfQUJTX0lORF9JRFg6XAorCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKKwlwcmludF9vcGVyYW5kICgxLCAiCSgkMCx4KSIsIGFyZ3MpO1wKKwlzaXplICs9IDI7XAorCWJyZWFrO1wKKyAgY2FzZSBBRERSX0JMT0NLX01PVkU6XAorCWFyZ3NbMF0gPSAoYXNSX1c2NV9BQlMxNiA+PjgpICYweGZmO1wKKwlhcmdzWzFdID0gKCBhc1JfVzY1X0FCUzE2ICYgMHhmZik7XAorCXByaW50X29wZXJhbmQgKDAsIgkkMCwkMSIsYXJncyk7XAorCXNpemUgKz0gMjtcCisJYnJlYWs7XAorCisjZGVmaW5lIEdFVElORk8oc2l6ZSx0eXBlLHBjcmVsKVwKKwljYXNlIEFERFJfSU1NVE9BOiBzaXplID0gTT09MCA/IDI6MTt0eXBlPU09PTAgPyBSX1c2NV9BQlMxNiA6IFJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0lNTUNPUDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9JTU1UT0k6IHNpemUgPSBYPT0wID8gMjoxO3R5cGU9WD09MCA/IFJfVzY1X0FCUzE2IDogUl9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfQUNDOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9QQ19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfUENSODtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfUENfUkVMX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfUENSMTY7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0lNUExJRUQ6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX1NUQUNLOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9ESVI6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfRElSX0lEWF9YOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0RJUl9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9ESVJfSU5EOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0RJUl9JRFhfSU5EX1g6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfRElSX0lORF9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9ESVJfSU5EX0xPTkc6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfRElSX0lORF9JRFhfWV9MT05HOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0FCUzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfQUJTX0lEWF9YOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9BQlNfSURYX1k6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0FCU19MT05HOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9BQlNfSU5EX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0FCU19MT05HX0lEWF9YOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9TVEFDS19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKKwljYXNlIEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0FCU19JTkQ6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCisJY2FzZSBBRERSX0FCU19JTkRfSURYOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAorCWNhc2UgQUREUl9CTE9DS19NT1ZFOiBzaXplID0gMjt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAorCmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4ay1kaXMuYyBiL29wY29kZXMvejhrLWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjM2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3o4ay1kaXMuYwpAQCAtMCwwICsxLDU3NCBAQAorLyogRGlzYXNzZW1ibGUgejgwMDAgY29kZS4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI2luY2x1ZGUgInN5c2RlcC5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKworI2RlZmluZSBERUZJTkVfVEFCTEUKKyNpbmNsdWRlICJ6OGstb3BjLmgiCisKKwwKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworDAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogVGhlc2UgYXJlIGFsbCBpbmRleGVkIGJ5IG5pYmJsZSBudW1iZXIgKGkuZSBvbmx5IGV2ZXJ5IG90aGVyIGVudHJ5CisgICAgIG9mIGJ5dGVzIGlzIHVzZWQsIGFuZCBldmVyeSA0dGggZW50cnkgb2Ygd29yZHMpLiAgKi8KKyAgdW5zaWduZWQgY2hhciBuaWJibGVzWzI0XTsKKyAgdW5zaWduZWQgY2hhciBieXRlc1syNF07CisgIHVuc2lnbmVkIHNob3J0IHdvcmRzWzI0XTsKKworICAvKiBOaWJibGUgbnVtYmVyIG9mIGZpcnN0IHdvcmQgbm90IHlldCBmZXRjaGVkLiAgKi8KKyAgaW50IG1heF9mZXRjaGVkOworICBiZmRfdm1hIGluc25fc3RhcnQ7CisgIGptcF9idWYgYmFpbG91dDsKKworICBsb25nIHRhYmxfaW5kZXg7CisgIGNoYXIgaW5zdHJfYXNtc3JjWzgwXTsKKyAgdW5zaWduZWQgbG9uZyBhcmdfcmVnWzB4MGZdOworICB1bnNpZ25lZCBsb25nIGltbWVkaWF0ZTsKKyAgdW5zaWduZWQgbG9uZyBkaXNwbGFjZW1lbnQ7CisgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKyAgdW5zaWduZWQgbG9uZyBjb25kX2NvZGU7CisgIHVuc2lnbmVkIGxvbmcgY3RybF9jb2RlOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB1bnNpZ25lZCBsb25nIGludGVycnVwdHM7Cit9CitpbnN0cl9kYXRhX3M7CisKKy8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKKyAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcworICAgb24gZXJyb3IuICAqLworI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIG5pYmJsZSkgXAorICAoKG5pYmJsZSkgPCAoKGluc3RyX2RhdGFfcyAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAorICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAobmliYmxlKSkpCisKK3N0YXRpYyBpbnQKK2ZldGNoX2RhdGEgKGluZm8sIG5pYmJsZSkKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87CisgICAgIGludCBuaWJibGU7Cit7CisgIHVuc2lnbmVkIGNoYXIgbXlidWZbMjBdOworICBpbnQgc3RhdHVzOworICBpbnN0cl9kYXRhX3MgKnByaXYgPSAoaW5zdHJfZGF0YV9zICopaW5mby0+cHJpdmF0ZV9kYXRhOworCisgIGlmICgobmliYmxlICUgNCkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwcml2LT5pbnNuX3N0YXJ0LAorCQkJCSAgICAgIChiZmRfYnl0ZSAqKSBteWJ1ZiwKKwkJCQkgICAgICBuaWJibGUgLyAyLAorCQkJCSAgICAgIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcHJpdi0+aW5zbl9zdGFydCwgaW5mbyk7CisgICAgICBsb25nam1wIChwcml2LT5iYWlsb3V0LCAxKTsKKyAgICB9CisKKyAgeworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBteWJ1ZiA7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IG5pYmJsZTspCisgICAgICB7CisJcHJpdi0+d29yZHNbaV0gPSAocFswXSA8PCA4KSB8IHBbMV07CisJCisJcHJpdi0+Ynl0ZXNbaV0gPSAqcDsKKwlwcml2LT5uaWJibGVzW2krK10gPSAqcCA+PiA0OworCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwICYweGY7CisKKwkrK3A7CisJcHJpdi0+Ynl0ZXNbaV0gPSAqcDsKKwlwcml2LT5uaWJibGVzW2krK10gPSAqcCA+PiA0OworCXByaXYtPm5pYmJsZXNbaSsrXSA9ICpwICYgMHhmOworCisJKytwOworICAgICAgfQorICB9CisgIHByaXYtPm1heF9mZXRjaGVkID0gbmliYmxlOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKmNvZGVzWzE2XSA9Cit7CisgICJmIiwKKyAgImx0IiwKKyAgImxlIiwKKyAgInVsZSIsCisgICJvdi9wZSIsCisgICJtaSIsCisgICJlcSIsCisgICJjL3VsdCIsCisgICJ0IiwKKyAgImdlIiwKKyAgImd0IiwKKyAgInVndCIsCisgICJub3YvcG8iLAorICAicGwiLAorICAibmUiLAorICAibmMvdWdlIgorfTsKKworaW50IHo4a19sb29rdXBfaW5zdHIgUEFSQU1TICgodW5zaWduZWQgY2hhciosIGRpc2Fzc2VtYmxlX2luZm8gKikpOworc3RhdGljIHZvaWQgb3V0cHV0X2luc3RyCisgIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqLCB1bnNpZ25lZCBsb25nLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKK3N0YXRpYyB2b2lkIHVucGFja19pbnN0ciBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKiwgaW50LCBkaXNhc3NlbWJsZV9pbmZvICopKTsKK3N0YXRpYyB2b2lkIHVucGFyc2VfaW5zdHIgUEFSQU1TICgoaW5zdHJfZGF0YV9zICopKTsKKworc3RhdGljIGludAorcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIGlzX3NlZ21lbnRlZCkKKyAgICAgYmZkX3ZtYSBhZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworICAgICBpbnQgaXNfc2VnbWVudGVkOworeworICBpbnN0cl9kYXRhX3MgaW5zdHJfZGF0YTsKKworICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmaW5zdHJfZGF0YTsKKyAgaW5zdHJfZGF0YS5tYXhfZmV0Y2hlZCA9IDA7CisgIGluc3RyX2RhdGEuaW5zbl9zdGFydCA9IGFkZHI7CisgIGlmIChzZXRqbXAgKGluc3RyX2RhdGEuYmFpbG91dCkgIT0gMCkKKyAgICAvKiBFcnJvciByZXR1cm4uICAqLworICAgIHJldHVybiAtMTsKKworICBpbnN0cl9kYXRhLnRhYmxfaW5kZXggPSB6OGtfbG9va3VwX2luc3RyIChpbnN0cl9kYXRhLm5pYmJsZXMsIGluZm8pOworICBpZiAoaW5zdHJfZGF0YS50YWJsX2luZGV4ID4gMCkKKyAgICB7CisgICAgICB1bnBhY2tfaW5zdHIgKCZpbnN0cl9kYXRhLCBpc19zZWdtZW50ZWQsIGluZm8pOworICAgICAgdW5wYXJzZV9pbnN0ciAoJmluc3RyX2RhdGEpOworICAgICAgb3V0cHV0X2luc3RyICgmaW5zdHJfZGF0YSwgYWRkciwgaW5mbyk7CisgICAgICByZXR1cm4gejhrX3RhYmxlW2luc3RyX2RhdGEudGFibF9pbmRleF0ubGVuZ3RoOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIDQpOworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIud29yZCAlMDJ4JTAyeCIsCisJCQkgICAgIGluc3RyX2RhdGEuYnl0ZXNbMF0sIGluc3RyX2RhdGEuYnl0ZXNbMl0pOworICAgICAgcmV0dXJuIDI7CisgICAgfQorfQorCitpbnQKK3ByaW50X2luc25fejgwMDEgKGFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmV0dXJuIHByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCAxKTsKK30KKworaW50CitwcmludF9pbnNuX3o4MDAyIChhZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIGFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJldHVybiBwcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgMCk7Cit9CisKK2ludAorejhrX2xvb2t1cF9pbnN0ciAobmliYmxlcywgaW5mbykKKyAgICAgdW5zaWduZWQgY2hhciAqbmliYmxlczsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKworICBpbnQgbmlibF9pbmRleCwgdGFibF9pbmRleDsKKyAgaW50IG5pYmxfbWF0Y2hlZDsKKyAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibDsKKyAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOworCisgIG5pYmxfbWF0Y2hlZCA9IDA7CisgIHRhYmxfaW5kZXggPSAwOworICB3aGlsZSAoIW5pYmxfbWF0Y2hlZCAmJiB6OGtfdGFibGVbdGFibF9pbmRleF0ubmFtZSkKKyAgICB7CisgICAgICBuaWJsX21hdGNoZWQgPSAxOworICAgICAgZm9yIChuaWJsX2luZGV4ID0gMDsgbmlibF9pbmRleCA8IHo4a190YWJsZVt0YWJsX2luZGV4XS5sZW5ndGggKiAyICYmIG5pYmxfbWF0Y2hlZDsgbmlibF9pbmRleCsrKQorCXsKKwkgIGlmICgobmlibF9pbmRleCAlIDQpID09IDApCisJICAgIC8qIEZldGNoIG9uZSB3b3JkIGF0IGEgdGltZS4gICovCisJICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfaW5kZXggKyA0KTsKKwkgIGluc3RyX25pYmwgPSBuaWJibGVzW25pYmxfaW5kZXhdOworCisJICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW3RhYmxfaW5kZXhdLmJ5dGVfaW5mb1tuaWJsX2luZGV4XTsKKwkgIGRhdHVtX2NsYXNzID0gdGFibF9kYXR1bSAmIENMQVNTX01BU0s7CisJICBkYXR1bV92YWx1ZSA9IH5DTEFTU19NQVNLICYgdGFibF9kYXR1bTsKKworCSAgc3dpdGNoIChkYXR1bV9jbGFzcykKKwkgICAgeworCSAgICBjYXNlIENMQVNTX0JJVDoKKwkgICAgICBpZiAoZGF0dW1fdmFsdWUgIT0gaW5zdHJfbmlibCkKKwkJbmlibF9tYXRjaGVkID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDTEFTU18wMElJOgorCSAgICAgIGlmICghKCh+aW5zdHJfbmlibCkgJiAweDQpKQorCQluaWJsX21hdGNoZWQgPSAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENMQVNTXzAxSUk6CisJICAgICAgaWYgKCEoaW5zdHJfbmlibCAmIDB4NCkpCisJCW5pYmxfbWF0Y2hlZCA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ0xBU1NfMENDQzoKKwkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKKwkJbmlibF9tYXRjaGVkID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDTEFTU18xQ0NDOgorCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQorCQluaWJsX21hdGNoZWQgPSAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENMQVNTXzBESVNQNzoKKwkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKKwkJbmlibF9tYXRjaGVkID0gMDsKKwkgICAgICBuaWJsX2luZGV4ICs9IDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ0xBU1NfMURJU1A3OgorCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDgpKQorCQluaWJsX21hdGNoZWQgPSAwOworCSAgICAgIG5pYmxfaW5kZXggKz0gMTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBDTEFTU19SRUdOMDoKKwkgICAgICBpZiAoaW5zdHJfbmlibCA9PSAwKQorCQluaWJsX21hdGNoZWQgPSAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENMQVNTX0JJVF8xT1IyOgorCSAgICAgIGlmICgoaW5zdHJfbmlibCB8IDB4MikgIT0gKGRhdHVtX3ZhbHVlIHwgMHgyKSkKKwkJbmlibF9tYXRjaGVkID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGlmIChuaWJsX21hdGNoZWQpCisJeworCSAgcmV0dXJuIHRhYmxfaW5kZXg7CisJfQorCisgICAgICB0YWJsX2luZGV4Kys7CisgICAgfQorICByZXR1cm4gLTE7CisKK30KKworc3RhdGljIHZvaWQKK291dHB1dF9pbnN0ciAoaW5zdHJfZGF0YSwgYWRkciwgaW5mbykKKyAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOworICAgICB1bnNpZ25lZCBsb25nIGFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGludCBsb29wLCBsb29wX2xpbWl0OworICBjaGFyIHRtcF9zdHJbMjBdOworICBjaGFyIG91dF9zdHJbMTAwXTsKKworICBzdHJjcHkgKG91dF9zdHIsICJcdCIpOworCisgIGxvb3BfbGltaXQgPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubGVuZ3RoICogMjsKKyAgRkVUQ0hfREFUQSAoaW5mbywgbG9vcF9saW1pdCk7CisgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBsb29wX2xpbWl0OyBsb29wKyspCisgICAgeworICAgICAgc3ByaW50ZiAodG1wX3N0ciwgIiV4IiwgaW5zdHJfZGF0YS0+bmliYmxlc1tsb29wXSk7CisgICAgICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOworICAgIH0KKworICB3aGlsZSAobG9vcCsrIDwgOCkKKyAgICB7CisgICAgICBzdHJjYXQgKG91dF9zdHIsICIgIik7CisgICAgfQorCisgIHN0cmNhdCAob3V0X3N0ciwgaW5zdHJfZGF0YS0+aW5zdHJfYXNtc3JjKTsKKworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3V0X3N0cik7Cit9CisKK3N0YXRpYyB2b2lkCit1bnBhY2tfaW5zdHIgKGluc3RyX2RhdGEsIGlzX3NlZ21lbnRlZCwgaW5mbykKKyAgICAgaW5zdHJfZGF0YV9zICppbnN0cl9kYXRhOworICAgICBpbnQgaXNfc2VnbWVudGVkOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpbnQgbmlibF9jb3VudCwgbG9vcDsKKyAgdW5zaWduZWQgc2hvcnQgaW5zdHJfbmlibCwgaW5zdHJfYnl0ZSwgaW5zdHJfd29yZDsKKyAgbG9uZyBpbnN0cl9sb25nOworICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7CisKKyAgbmlibF9jb3VudCA9IDA7CisgIGxvb3AgPSAwOworICB3aGlsZSAoejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmJ5dGVfaW5mb1tsb29wXSAhPSAwKQorICAgIHsKKyAgICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA0IC0gKG5pYmxfY291bnQgJSA0KSk7CisgICAgICBpbnN0cl9uaWJsID0gaW5zdHJfZGF0YS0+bmliYmxlc1tuaWJsX2NvdW50XTsKKyAgICAgIGluc3RyX2J5dGUgPSBpbnN0cl9kYXRhLT5ieXRlc1tuaWJsX2NvdW50XTsKKyAgICAgIGluc3RyX3dvcmQgPSBpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XTsKKworICAgICAgdGFibF9kYXR1bSA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ieXRlX2luZm9bbG9vcF07CisgICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOworICAgICAgZGF0dW1fdmFsdWUgPSB0YWJsX2RhdHVtICYgfkNMQVNTX01BU0s7CisKKyAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCisJeworCWNhc2UgQ0xBU1NfWDoKKwkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSBpbnN0cl9uaWJsOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19CQToKKwkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX25pYmw7CisJICBicmVhazsKKwljYXNlIENMQVNTX0JYOgorCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19ESVNQOgorCSAgc3dpdGNoIChkYXR1bV92YWx1ZSkKKwkgICAgeworCSAgICBjYXNlIEFSR19ESVNQMTY6CisJICAgICAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfd29yZDsKKwkgICAgICBuaWJsX2NvdW50ICs9IDM7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0RJU1AxMjoKKwkgICAgICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl93b3JkICYgMHgwZmZmOworCSAgICAgIG5pYmxfY291bnQgKz0gMjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDTEFTU19JTU06CisJICBzd2l0Y2ggKGRhdHVtX3ZhbHVlKQorCSAgICB7CisJICAgIGNhc2UgQVJHX0lNTTQ6CisJICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBUkdfTklNODoKKwkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAoLWluc3RyX2J5dGUpOworCSAgICAgIG5pYmxfY291bnQgKz0gMTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBUkdfSU1NODoKKwkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9ieXRlOworCSAgICAgIG5pYmxfY291bnQgKz0gMTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBUkdfSU1NMTY6CisJICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfd29yZDsKKwkgICAgICBuaWJsX2NvdW50ICs9IDM7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0lNTTMyOgorCSAgICAgIEZFVENIX0RBVEEgKGluZm8sIG5pYmxfY291bnQgKyA4KTsKKwkgICAgICBpbnN0cl9sb25nID0gKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnRdIDw8IDE2KQorCQl8IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50ICsgNF0pOworCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX2xvbmc7CisJICAgICAgbmlibF9jb3VudCArPSA3OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFSR19JTU1OOgorCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgLSAxOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFSR19JTU00TTE6CisJICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCArIDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0lNTV8xOgorCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0lNTV8yOgorCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IDI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0lNTTI6CisJICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfbmlibCAmIDB4MzsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDTEFTU19DQzoKKwkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmw7CisJICBicmVhazsKKwljYXNlIENMQVNTX0NUUkw6CisJICBpbnN0cl9kYXRhLT5jdHJsX2NvZGUgPSBpbnN0cl9uaWJsOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19EQToKKwljYXNlIENMQVNTX0FERFJFU1M6CisJICBpZiAoaXNfc2VnbWVudGVkKQorCSAgICB7CisJICAgICAgaWYgKGluc3RyX25pYmwgJiAweDgpCisJCXsKKwkJICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgOCk7CisJCSAgaW5zdHJfbG9uZyA9IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XSA8PCAxNikKKwkJICAgIHwgKGluc3RyX2RhdGEtPndvcmRzW25pYmxfY291bnQgKyA0XSk7CisJCSAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9ICgoaW5zdHJfd29yZCAmIDB4N2YwMCkgPDwgOCkgKworCQkgICAgKGluc3RyX2xvbmcgJiAweGZmZmYpOworCQkgIG5pYmxfY291bnQgKz0gNzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSAoKGluc3RyX3dvcmQgJiAweDdmMDApIDw8IDgpICsKKwkJICAgIChpbnN0cl93b3JkICYgMHgwMGZmKTsKKwkJICBuaWJsX2NvdW50ICs9IDM7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaW5zdHJfZGF0YS0+YWRkcmVzcyA9IGluc3RyX3dvcmQ7CisJICAgICAgbmlibF9jb3VudCArPSAzOworCSAgICB9CisJICBicmVhazsKKwljYXNlIENMQVNTXzBDQ0M6CisJICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsICYgMHg3OworCSAgYnJlYWs7CisJY2FzZSBDTEFTU18xQ0NDOgorCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibCAmIDB4NzsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfMERJU1A3OgorCSAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfYnl0ZSAmIDB4N2Y7CisJICBuaWJsX2NvdW50ICs9IDE7CisJICBicmVhazsKKwljYXNlIENMQVNTXzFESVNQNzoKKwkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX2J5dGUgJiAweDdmOworCSAgbmlibF9jb3VudCArPSAxOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU18wMUlJOgorCSAgaW5zdHJfZGF0YS0+aW50ZXJydXB0cyA9IGluc3RyX25pYmwgJiAweDM7CisJICBicmVhazsKKwljYXNlIENMQVNTXzAwSUk6CisJICBpbnN0cl9kYXRhLT5pbnRlcnJ1cHRzID0gaW5zdHJfbmlibCAmIDB4MzsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfQklUOgorCSAgLyogZG8gbm90aGluZyAqLworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19JUjoKKwkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfRkxBR1M6CisJICBpbnN0cl9kYXRhLT5mbGFncyA9IGluc3RyX25pYmw7CisJICBicmVhazsKKwljYXNlIENMQVNTX1JFRzoKKwkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHX0JZVEU6CisJICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7CisJICBicmVhazsKKwljYXNlIENMQVNTX1JFR19XT1JEOgorCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19SRUdfUVVBRDoKKwkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHX0xPTkc6CisJICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7CisJICBicmVhazsKKwljYXNlIENMQVNTX1JFR04wOgorCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKworICAgICAgbG9vcCArPSAxOworICAgICAgbmlibF9jb3VudCArPSAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3VucGFyc2VfaW5zdHIgKGluc3RyX2RhdGEpCisgICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKK3sKKyAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOworICBpbnQgbG9vcCwgbG9vcF9saW1pdDsKKyAgY2hhciBvdXRfc3RyWzgwXSwgdG1wX3N0clsyNV07CisKKyAgc3ByaW50ZiAob3V0X3N0ciwgIlx0JXNcdCIsIHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5uYW1lKTsKKworICBsb29wX2xpbWl0ID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLm5vcGVyYW5kczsKKyAgZm9yIChsb29wID0gMDsgbG9vcCA8IGxvb3BfbGltaXQ7IGxvb3ArKykKKyAgICB7CisgICAgICBpZiAobG9vcCkKKwlzdHJjYXQgKG91dF9zdHIsICIsIik7CisKKyAgICAgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYXJnX2luZm9bbG9vcF07CisgICAgICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOworICAgICAgZGF0dW1fdmFsdWUgPSB0YWJsX2RhdHVtICYgfkNMQVNTX01BU0s7CisKKyAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCisJeworCWNhc2UgQ0xBU1NfWDoKKwkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgoUiVsZCkiLCBpbnN0cl9kYXRhLT5hZGRyZXNzLAorCQkgICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7CisJICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19CQToKKwkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkKCMlbHgpIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0sCisJCSAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSk7CisJICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19CWDoKKwkgIHNwcmludGYgKHRtcF9zdHIsICJyJWxkKFIlbGQpIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0sCisJCSAgIGluc3RyX2RhdGEtPmFyZ19yZWdbQVJHX1JYXSk7CisJICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19ESVNQOgorCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQpOworCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfSU1NOgorCSAgc3ByaW50ZiAodG1wX3N0ciwgIiMweCUwbHgiLCBpbnN0cl9kYXRhLT5pbW1lZGlhdGUpOworCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfQ0M6CisJICBzcHJpbnRmICh0bXBfc3RyLCAiJXMiLCBjb2Rlc1tpbnN0cl9kYXRhLT5jb25kX2NvZGVdKTsKKwkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7CisJICBicmVhazsKKwljYXNlIENMQVNTX0NUUkw6CisJICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4IiwgaW5zdHJfZGF0YS0+Y3RybF9jb2RlKTsKKwkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7CisJICBicmVhazsKKwljYXNlIENMQVNTX0RBOgorCWNhc2UgQ0xBU1NfQUREUkVTUzoKKwkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+YWRkcmVzcyk7CisJICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19JUjoKKwkgIHNwcmludGYgKHRtcF9zdHIsICJAUiVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKKwkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7CisJICBicmVhazsKKwljYXNlIENMQVNTX0ZMQUdTOgorCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseCIsIGluc3RyX2RhdGEtPmZsYWdzKTsKKwkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7CisJICBicmVhazsKKwljYXNlIENMQVNTX1JFR19CWVRFOgorCSAgaWYgKGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID49IDB4OCkKKwkgICAgeworCSAgICAgIHNwcmludGYgKHRtcF9zdHIsICJybCVsZCIsCisJCSAgICAgICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSAtIDB4OCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNwcmludGYgKHRtcF9zdHIsICJyaCVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKKwkgICAgfQorCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6CisJICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKKwkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7CisJICBicmVhazsKKwljYXNlIENMQVNTX1JFR19RVUFEOgorCSAgc3ByaW50ZiAodG1wX3N0ciwgInJxJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOworCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHX0xPTkc6CisJICBzcHJpbnRmICh0bXBfc3RyLCAicnIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7CisJICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgc3RyY3B5IChpbnN0cl9kYXRhLT5pbnN0cl9hc21zcmMsIG91dF9zdHIpOworfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy96OGstb3BjLmggYi9vcGNvZGVzL3o4ay1vcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzlhM2EzCi0tLSAvZGV2L251bGwKKysrIGIvb3Bjb2Rlcy96OGstb3BjLmgKQEAgLTAsMCArMSw0NDM4IEBACisJCQkvKiBUSElTIEZJTEUgSVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQsIERPTidUIEVESVQgSVQgKi8KKyNkZWZpbmUgQVJHX01BU0sgMHgwZgorI2RlZmluZSBBUkdfU1JDIDB4MDEKKyNkZWZpbmUgQVJHX0RTVCAweDAyCisjZGVmaW5lIEFSR19SUyAweDAxCisjZGVmaW5lIEFSR19SRCAweDAyCisjZGVmaW5lIEFSR19SQSAweDAzCisjZGVmaW5lIEFSR19SQiAweDA0CisjZGVmaW5lIEFSR19SUiAweDA1CisjZGVmaW5lIEFSR19SWCAweDA2CisjZGVmaW5lIEFSR19JTU00IDB4MDEKKyNkZWZpbmUgQVJHX0lNTTggMHgwMgorI2RlZmluZSBBUkdfSU1NMTYgMHgwMworI2RlZmluZSBBUkdfSU1NMzIgMHgwNAorI2RlZmluZSBBUkdfSU1NTiAweDA1CisjZGVmaW5lIEFSR19JTU1OTUlOVVMxIDB4MDUKKyNkZWZpbmUgQVJHX0lNTV8xIDB4MDYKKyNkZWZpbmUgQVJHX0lNTV8yIDB4MDcKKyNkZWZpbmUgQVJHX0RJU1AxNiAweDA4CisjZGVmaW5lIEFSR19OSU04IDB4MDkKKyNkZWZpbmUgQVJHX0lNTTIgMHgwYQorI2RlZmluZSBBUkdfSU1NMU9SMiAweDBiCisjZGVmaW5lIEFSR19ESVNQMTIgMHgwYgorI2RlZmluZSBBUkdfRElTUDggMHgwYworI2RlZmluZSBBUkdfSU1NNE0xIDB4MGQKKyNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmYwCisjZGVmaW5lIENMQVNTX1ggMHgxMAorI2RlZmluZSBDTEFTU19CQSAweDIwCisjZGVmaW5lIENMQVNTX0RBIDB4MzAKKyNkZWZpbmUgQ0xBU1NfQlggMHg0MAorI2RlZmluZSBDTEFTU19ESVNQIDB4NTAKKyNkZWZpbmUgQ0xBU1NfSU1NIDB4NjAKKyNkZWZpbmUgQ0xBU1NfQ0MgMHg3MAorI2RlZmluZSBDTEFTU19DVFJMIDB4ODAKKyNkZWZpbmUgQ0xBU1NfQUREUkVTUyAweGQwCisjZGVmaW5lIENMQVNTXzBDQ0MgMHhlMAorI2RlZmluZSBDTEFTU18xQ0NDIDB4ZjAKKyNkZWZpbmUgQ0xBU1NfMERJU1A3IDB4MTAwCisjZGVmaW5lIENMQVNTXzFESVNQNyAweDIwMAorI2RlZmluZSBDTEFTU18wMUlJIDB4MzAwCisjZGVmaW5lIENMQVNTXzAwSUkgMHg0MDAKKyNkZWZpbmUgQ0xBU1NfQklUIDB4NTAwCisjZGVmaW5lIENMQVNTX0ZMQUdTIDB4NjAwCisjZGVmaW5lIENMQVNTX0lSIDB4NzAwCisjZGVmaW5lIENMQVNTX0RJU1A4IDB4ODAwCisjZGVmaW5lIENMQVNTX0JJVF8xT1IyIDB4OTAwCisjZGVmaW5lIENMQVNTX1JFRyAweDcwMDAKKyNkZWZpbmUgQ0xBU1NfUkVHX0JZVEUgMHgyMDAwCisjZGVmaW5lIENMQVNTX1JFR19XT1JEIDB4MzAwMAorI2RlZmluZSBDTEFTU19SRUdfUVVBRCAweDQwMDAKKyNkZWZpbmUgQ0xBU1NfUkVHX0xPTkcgMHg1MDAwCisjZGVmaW5lIENMQVNTX1JFR04wIDB4ODAwMAorI2RlZmluZSBDTEFTU19QUiAweDEwMDAwCisjZGVmaW5lIE9QQ19hZGMgMAorI2RlZmluZSBPUENfYWRjYiAxCisjZGVmaW5lIE9QQ19hZGQgMgorI2RlZmluZSBPUENfYWRkYiAzCisjZGVmaW5lIE9QQ19hZGRsIDQKKyNkZWZpbmUgT1BDX2FuZCA1CisjZGVmaW5lIE9QQ19hbmRiIDYKKyNkZWZpbmUgT1BDX2JpdCA3CisjZGVmaW5lIE9QQ19iaXRiIDgKKyNkZWZpbmUgT1BDX2NhbGwgOQorI2RlZmluZSBPUENfY2FsciAxMAorI2RlZmluZSBPUENfY2xyIDExCisjZGVmaW5lIE9QQ19jbHJiIDEyCisjZGVmaW5lIE9QQ19jb20gMTMKKyNkZWZpbmUgT1BDX2NvbWIgMTQKKyNkZWZpbmUgT1BDX2NvbWZsZyAxNQorI2RlZmluZSBPUENfY3AgMTYKKyNkZWZpbmUgT1BDX2NwYiAxNworI2RlZmluZSBPUENfY3BkIDE4CisjZGVmaW5lIE9QQ19jcGRiIDE5CisjZGVmaW5lIE9QQ19jcGRyIDIwCisjZGVmaW5lIE9QQ19jcGRyYiAyMQorI2RlZmluZSBPUENfY3BpIDIyCisjZGVmaW5lIE9QQ19jcGliIDIzCisjZGVmaW5lIE9QQ19jcGlyIDI0CisjZGVmaW5lIE9QQ19jcGlyYiAyNQorI2RlZmluZSBPUENfY3BsIDI2CisjZGVmaW5lIE9QQ19jcHNkIDI3CisjZGVmaW5lIE9QQ19jcHNkYiAyOAorI2RlZmluZSBPUENfY3BzZHIgMjkKKyNkZWZpbmUgT1BDX2Nwc2RyYiAzMAorI2RlZmluZSBPUENfY3BzaSAzMQorI2RlZmluZSBPUENfY3BzaWIgMzIKKyNkZWZpbmUgT1BDX2Nwc2lyIDMzCisjZGVmaW5lIE9QQ19jcHNpcmIgMzQKKyNkZWZpbmUgT1BDX2RhYiAzNQorI2RlZmluZSBPUENfZGJqbnogMzYKKyNkZWZpbmUgT1BDX2RlYyAzNworI2RlZmluZSBPUENfZGVjYiAzOAorI2RlZmluZSBPUENfZGkgMzkKKyNkZWZpbmUgT1BDX2RpdiA0MAorI2RlZmluZSBPUENfZGl2bCA0MQorI2RlZmluZSBPUENfZGpueiA0MgorI2RlZmluZSBPUENfZWkgNDMKKyNkZWZpbmUgT1BDX2V4IDQ0CisjZGVmaW5lIE9QQ19leGIgNDUKKyNkZWZpbmUgT1BDX2V4dHMgNDYKKyNkZWZpbmUgT1BDX2V4dHNiIDQ3CisjZGVmaW5lIE9QQ19leHRzbCA0OAorI2RlZmluZSBPUENfaGFsdCA0OQorI2RlZmluZSBPUENfaW4gNTAKKyNkZWZpbmUgT1BDX2luYiA1MQorI2RlZmluZSBPUENfaW5jIDUyCisjZGVmaW5lIE9QQ19pbmNiIDUzCisjZGVmaW5lIE9QQ19pbmQgNTQKKyNkZWZpbmUgT1BDX2luZGIgNTUKKyNkZWZpbmUgT1BDX2luaWIgNTYKKyNkZWZpbmUgT1BDX2luaWJyIDU3CisjZGVmaW5lIE9QQ19pcmV0IDU4CisjZGVmaW5lIE9QQ19qcCA1OQorI2RlZmluZSBPUENfanIgNjAKKyNkZWZpbmUgT1BDX2xkIDYxCisjZGVmaW5lIE9QQ19sZGEgNjIKKyNkZWZpbmUgT1BDX2xkYXIgNjMKKyNkZWZpbmUgT1BDX2xkYiA2NAorI2RlZmluZSBPUENfbGRjdGwgNjUKKyNkZWZpbmUgT1BDX2xkaXIgNjYKKyNkZWZpbmUgT1BDX2xkaXJiIDY3CisjZGVmaW5lIE9QQ19sZGsgNjgKKyNkZWZpbmUgT1BDX2xkbCA2OQorI2RlZmluZSBPUENfbGRtIDcwCisjZGVmaW5lIE9QQ19sZHBzIDcxCisjZGVmaW5lIE9QQ19sZHIgNzIKKyNkZWZpbmUgT1BDX2xkcmIgNzMKKyNkZWZpbmUgT1BDX2xkcmwgNzQKKyNkZWZpbmUgT1BDX21iaXQgNzUKKyNkZWZpbmUgT1BDX21yZXEgNzYKKyNkZWZpbmUgT1BDX21yZXMgNzcKKyNkZWZpbmUgT1BDX21zZXQgNzgKKyNkZWZpbmUgT1BDX211bHQgNzkKKyNkZWZpbmUgT1BDX211bHRsIDgwCisjZGVmaW5lIE9QQ19uZWcgODEKKyNkZWZpbmUgT1BDX25lZ2IgODIKKyNkZWZpbmUgT1BDX25vcCA4MworI2RlZmluZSBPUENfb3IgODQKKyNkZWZpbmUgT1BDX29yYiA4NQorI2RlZmluZSBPUENfb3V0IDg2CisjZGVmaW5lIE9QQ19vdXRiIDg3CisjZGVmaW5lIE9QQ19vdXRkIDg4CisjZGVmaW5lIE9QQ19vdXRkYiA4OQorI2RlZmluZSBPUENfb3V0aWIgOTAKKyNkZWZpbmUgT1BDX291dGliciA5MQorI2RlZmluZSBPUENfcG9wIDkyCisjZGVmaW5lIE9QQ19wb3BsIDkzCisjZGVmaW5lIE9QQ19wdXNoIDk0CisjZGVmaW5lIE9QQ19wdXNobCA5NQorI2RlZmluZSBPUENfcmVzIDk2CisjZGVmaW5lIE9QQ19yZXNiIDk3CisjZGVmaW5lIE9QQ19yZXNmbGcgOTgKKyNkZWZpbmUgT1BDX3JldCA5OQorI2RlZmluZSBPUENfcmwgMTAwCisjZGVmaW5lIE9QQ19ybGIgMTAxCisjZGVmaW5lIE9QQ19ybGMgMTAyCisjZGVmaW5lIE9QQ19ybGNiIDEwMworI2RlZmluZSBPUENfcmxkYiAxMDQKKyNkZWZpbmUgT1BDX3JyIDEwNQorI2RlZmluZSBPUENfcnJiIDEwNgorI2RlZmluZSBPUENfcnJjIDEwNworI2RlZmluZSBPUENfcnJjYiAxMDgKKyNkZWZpbmUgT1BDX3JyZGIgMTA5CisjZGVmaW5lIE9QQ19zYmMgMTEwCisjZGVmaW5lIE9QQ19zYmNiIDExMQorI2RlZmluZSBPUENfc2RhIDExMgorI2RlZmluZSBPUENfc2RhYiAxMTMKKyNkZWZpbmUgT1BDX3NkYWwgMTE0CisjZGVmaW5lIE9QQ19zZGwgMTE1CisjZGVmaW5lIE9QQ19zZGxiIDExNgorI2RlZmluZSBPUENfc2RsbCAxMTcKKyNkZWZpbmUgT1BDX3NldCAxMTgKKyNkZWZpbmUgT1BDX3NldGIgMTE5CisjZGVmaW5lIE9QQ19zZXRmbGcgMTIwCisjZGVmaW5lIE9QQ19zaW5iIDEyMQorI2RlZmluZSBPUENfc2luZCAxMjIKKyNkZWZpbmUgT1BDX3NpbmRiIDEyMworI2RlZmluZSBPUENfc2luaWIgMTI0CisjZGVmaW5lIE9QQ19zaW5pYnIgMTI1CisjZGVmaW5lIE9QQ19zbGEgMTI2CisjZGVmaW5lIE9QQ19zbGFiIDEyNworI2RlZmluZSBPUENfc2xhbCAxMjgKKyNkZWZpbmUgT1BDX3NsbCAxMjkKKyNkZWZpbmUgT1BDX3NsbGIgMTMwCisjZGVmaW5lIE9QQ19zbGxsIDEzMQorI2RlZmluZSBPUENfc291dCAxMzIKKyNkZWZpbmUgT1BDX3NvdXRiIDEzMworI2RlZmluZSBPUENfc291dGQgMTM0CisjZGVmaW5lIE9QQ19zb3V0ZGIgMTM1CisjZGVmaW5lIE9QQ19zb3V0aWIgMTM2CisjZGVmaW5lIE9QQ19zb3V0aWJyIDEzNworI2RlZmluZSBPUENfc3JhIDEzOAorI2RlZmluZSBPUENfc3JhYiAxMzkKKyNkZWZpbmUgT1BDX3NyYWwgMTQwCisjZGVmaW5lIE9QQ19zcmwgMTQxCisjZGVmaW5lIE9QQ19zcmxiIDE0MgorI2RlZmluZSBPUENfc3JsbCAxNDMKKyNkZWZpbmUgT1BDX3N1YiAxNDQKKyNkZWZpbmUgT1BDX3N1YmIgMTQ1CisjZGVmaW5lIE9QQ19zdWJsIDE0NgorI2RlZmluZSBPUENfdGNjIDE0NworI2RlZmluZSBPUENfdGNjYiAxNDgKKyNkZWZpbmUgT1BDX3Rlc3QgMTQ5CisjZGVmaW5lIE9QQ190ZXN0YiAxNTAKKyNkZWZpbmUgT1BDX3Rlc3RsIDE1MQorI2RlZmluZSBPUENfdHJkYiAxNTIKKyNkZWZpbmUgT1BDX3RyZHJiIDE1MworI2RlZmluZSBPUENfdHJpYiAxNTQKKyNkZWZpbmUgT1BDX3RyaXJiIDE1NQorI2RlZmluZSBPUENfdHJ0ZHJiIDE1NgorI2RlZmluZSBPUENfdHJ0aWIgMTU3CisjZGVmaW5lIE9QQ190cnRpcmIgMTU4CisjZGVmaW5lIE9QQ190cnRkYiAxNTkKKyNkZWZpbmUgT1BDX3RzZXQgMTYwCisjZGVmaW5lIE9QQ190c2V0YiAxNjEKKyNkZWZpbmUgT1BDX3hvciAxNjIKKyNkZWZpbmUgT1BDX3hvcmIgMTYzCisjZGVmaW5lIE9QQ19sZGQgIDE2NCAKKyNkZWZpbmUgT1BDX2xkZGIgIDE2NSAKKyNkZWZpbmUgT1BDX2xkZHIgIDE2NiAKKyNkZWZpbmUgT1BDX2xkZHJiIDE2NyAgCisjZGVmaW5lIE9QQ19sZGkgIDE2OCAKKyNkZWZpbmUgT1BDX2xkaWIgMTY5ICAKKyNkZWZpbmUgT1BDX3NjICAgMTcwCisjZGVmaW5lIE9QQ19icHQgICAxNzEKKyNkZWZpbmUgT1BDX2V4dDBlIDE3MgorI2RlZmluZSBPUENfZXh0MGYgMTcyCisjZGVmaW5lIE9QQ19leHQ4ZSAxNzIKKyNkZWZpbmUgT1BDX2V4dDhmIDE3MgorI2RlZmluZSBPUENfcnN2ZDM2IDE3MgorI2RlZmluZSBPUENfcnN2ZDM4IDE3MgorI2RlZmluZSBPUENfcnN2ZDc4IDE3MgorI2RlZmluZSBPUENfcnN2ZDdlIDE3MgorI2RlZmluZSBPUENfcnN2ZDlkIDE3MgorI2RlZmluZSBPUENfcnN2ZDlmIDE3MgorI2RlZmluZSBPUENfcnN2ZGI5IDE3MgorI2RlZmluZSBPUENfcnN2ZGJmIDE3MgorI2RlZmluZSBPUENfb3V0aSAxNzMKK3R5cGVkZWYgc3RydWN0IHsKKyNpZmRlZiBOSUNFTkFNRVMKK2NoYXIgKm5pY2VuYW1lOworaW50IHR5cGU7CitpbnQgY3ljbGVzOworaW50IGZsYWdzOworI2VuZGlmCitjaGFyICpuYW1lOwordW5zaWduZWQgY2hhciBvcGNvZGU7Cit2b2lkICgqZnVuYykoKTsKK3Vuc2lnbmVkIGludCBhcmdfaW5mb1s0XTsKK3Vuc2lnbmVkIGludCBieXRlX2luZm9bMTBdOworaW50IG5vcGVyYW5kczsKK2ludCBsZW5ndGg7CitpbnQgaWR4OworfSBvcGNvZGVfZW50cnlfdHlwZTsKKyNpZmRlZiBERUZJTkVfVEFCTEUKK29wY29kZV9lbnRyeV90eXBlIHo4a190YWJsZVtdID0geworCisKKy8qIDEwMTEgMDEwMSBzc3NzIGRkZGQgKioqIGFkYyByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImFkYyByZCxycyIsMTYsNSwKKzB4M2MsCisjZW5kaWYKKyJhZGMiLE9QQ19hZGMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwwfSwKKworCisvKiAxMDExIDAxMDAgc3NzcyBkZGRkICoqKiBhZGNiIHJiZCxyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGNiIHJiZCxyYnMiLDgsNSwKKzB4M2YsCisjZW5kaWYKKyJhZGNiIixPUENfYWRjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDF9LAorCisKKy8qIDAwMDAgMDAwMSBzc04wIGRkZGQgKioqIGFkZCByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGQgcmQsQHJzIiwxNiw3LAorMHgzYywKKyNlbmRpZgorImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDJ9LAorCisKKy8qIDAxMDAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZCByZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImFkZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKKzB4M2MsCisjZW5kaWYKKyJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDN9LAorCisKKy8qIDAxMDAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZCByZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKKzB4M2MsCisjZW5kaWYKKyJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0fSwKKworCisvKiAwMDAwIDAwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBhZGQgcmQsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGQgcmQsaW1tMTYiLDE2LDcsCisweDNjLAorI2VuZGlmCisiYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNX0sCisKKworLyogMTAwMCAwMDAxIHNzc3MgZGRkZCAqKiogYWRkIHJkLHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYWRkIHJkLHJzIiwxNiw0LAorMHgzYywKKyNlbmRpZgorImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2fSwKKworCisvKiAwMDAwIDAwMDAgc3NOMCBkZGRkICoqKiBhZGRiIHJiZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGRiIHJiZCxAcnMiLDgsNywKKzB4M2YsCisjZW5kaWYKKyJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDd9LAorCisKKy8qIDAxMDAgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGIgcmJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYWRkYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKKzB4M2YsCisjZW5kaWYKKyJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsOH0sCisKKworLyogMDEwMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkYiByYmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYWRkYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAorMHgzZiwKKyNlbmRpZgorImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsOX0sCisKKworLyogMDAwMCAwMDAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGFkZGIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGRiIHJiZCxpbW04Iiw4LDcsCisweDNmLAorI2VuZGlmCisiYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDEwfSwKKworCisvKiAxMDAwIDAwMDAgc3NzcyBkZGRkICoqKiBhZGRiIHJiZCxyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGRiIHJiZCxyYnMiLDgsNCwKKzB4M2YsCisjZW5kaWYKKyJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMX0sCisKKworLyogMDAwMSAwMTEwIHNzTjAgZGRkZCAqKiogYWRkbCBycmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYWRkbCBycmQsQHJzIiwzMiwxNCwKKzB4M2MsCisjZW5kaWYKKyJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyfSwKKworCisvKiAwMTAxIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRsIHJyZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImFkZGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKKzB4M2MsCisjZW5kaWYKKyJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTN9LAorCisKKy8qIDAxMDEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImFkZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCisweDNjLAorI2VuZGlmCisiYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNH0sCisKKworLyogMDAwMSAwMTEwIDAwMDAgZGRkZCBpbW0zMiAqKiogYWRkbCBycmQsaW1tMzIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhZGRsIHJyZCxpbW0zMiIsMzIsMTQsCisweDNjLAorI2VuZGlmCisiYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwxNX0sCisKKworLyogMTAwMSAwMTEwIHNzc3MgZGRkZCAqKiogYWRkbCBycmQscnJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYWRkbCBycmQscnJzIiwzMiw4LAorMHgzYywKKyNlbmRpZgorImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs5LENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2fSwKKworCisvKiAwMDAwIDAxMTEgc3NOMCBkZGRkICoqKiBhbmQgcmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYW5kIHJkLEBycyIsMTYsNywKKzB4MTgsCisjZW5kaWYKKyJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxN30sCisKKworLyogMDEwMCAwMTExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kIHJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYW5kIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAorMHgxOCwKKyNlbmRpZgorImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTh9LAorCisKKy8qIDAxMDAgMDExMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZCByZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhbmQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKKzB4MTgsCisjZW5kaWYKKyJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxOX0sCisKKworLyogMDAwMCAwMTExIDAwMDAgZGRkZCBpbW0xNiAqKiogYW5kIHJkLGltbTE2ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYW5kIHJkLGltbTE2IiwxNiw3LAorMHgxOCwKKyNlbmRpZgorImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIwfSwKKworCisvKiAxMDAwIDAxMTEgc3NzcyBkZGRkICoqKiBhbmQgcmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhbmQgcmQscnMiLDE2LDQsCisweDE4LAorI2VuZGlmCisiYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIxfSwKKworCisvKiAwMDAwIDAxMTAgc3NOMCBkZGRkICoqKiBhbmRiIHJiZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhbmRiIHJiZCxAcnMiLDgsNywKKzB4MWMsCisjZW5kaWYKKyJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIyfSwKKworCisvKiAwMTAwIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmRiIHJiZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImFuZGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCisweDFjLAorI2VuZGlmCisiYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzfSwKKworCisvKiAwMTAwIDAxMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhbmRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCisweDFjLAorI2VuZGlmCisiYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNH0sCisKKworLyogMDAwMCAwMTEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIGFuZGIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhbmRiIHJiZCxpbW04Iiw4LDcsCisweDFjLAorI2VuZGlmCisiYW5kYiIsT1BDX2FuZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDI1fSwKKworCisvKiAxMDAwIDAxMTAgc3NzcyBkZGRkICoqKiBhbmRiIHJiZCxyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJhbmRiIHJiZCxyYnMiLDgsNCwKKzB4MWMsCisjZW5kaWYKKyJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNn0sCisKKworLyogMDAxMCAwMTExIGRkTjAgaW1tNCAqKiogYml0IEByZCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYml0IEByZCxpbW00IiwxNiw4LAorMHgxMCwKKyNlbmRpZgorImJpdCIsT1BDX2JpdCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI3fSwKKworCisvKiAwMTEwIDAxMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXQgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJiaXQgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDExLAorMHgxMCwKKyNlbmRpZgorImJpdCIsT1BDX2JpdCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI4fSwKKworCisvKiAwMTEwIDAxMTEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXQgYWRkcmVzc19kc3QsaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImJpdCBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMCwKKzB4MTAsCisjZW5kaWYKKyJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5fSwKKworCisvKiAxMDEwIDAxMTEgZGRkZCBpbW00ICoqKiBiaXQgcmQsaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImJpdCByZCxpbW00IiwxNiw0LAorMHgxMCwKKyNlbmRpZgorImJpdCIsT1BDX2JpdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMwfSwKKworCisvKiAwMDEwIDAxMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIGJpdCByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImJpdCByZCxycyIsMTYsMTAsCisweDEwLAorI2VuZGlmCisiYml0IixPUENfYml0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsyLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMX0sCisKKworLyogMDAxMCAwMTEwIGRkTjAgaW1tNCAqKiogYml0YiBAcmQsaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImJpdGIgQHJkLGltbTQiLDgsOCwKKzB4MTAsCisjZW5kaWYKKyJiaXRiIixPUENfYml0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMyfSwKKworCisvKiAwMTEwIDAxMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYml0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxMSwKKzB4MTAsCisjZW5kaWYKKyJiaXRiIixPUENfYml0YiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzfSwKKworCisvKiAwMTEwIDAxMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBiaXRiIGFkZHJlc3NfZHN0LGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJiaXRiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTAsCisweDEwLAorI2VuZGlmCisiYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDM0fSwKKworCisvKiAxMDEwIDAxMTAgZGRkZCBpbW00ICoqKiBiaXRiIHJiZCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiYml0YiByYmQsaW1tNCIsOCw0LAorMHgxMCwKKyNlbmRpZgorImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzV9LAorCisKKy8qIDAwMTAgMDExMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogYml0YiByYmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJiaXRiIHJiZCxycyIsOCwxMCwKKzB4MTAsCisjZW5kaWYKKyJiaXRiIixPUENfYml0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzZ9LAorCisKKy8qIDAwMTEgMDExMCAwMDAwIDAwMDAgKioqIGJwdCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImJwdCIsOCwyLAorMHgwMCwKKyNlbmRpZgorImJwdCIsT1BDX2JwdCwwLHswfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDM3fSwKKworCisvKiAwMDAxIDExMTEgZGROMCAwMDAwICoqKiBjYWxsIEByZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNhbGwgQHJkIiwzMiwxMCwKKzB4MDAsCisjZW5kaWYKKyJjYWxsIixPUENfY2FsbCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwzOH0sCisKKworLyogMDEwMSAxMTExIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY2FsbCBhZGRyZXNzX2RzdCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNhbGwgYWRkcmVzc19kc3QiLDMyLDEyLAorMHgwMCwKKyNlbmRpZgorImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzl9LAorCisKKy8qIDAxMDEgMTExMSBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNhbGwgYWRkcmVzc19kc3QocmQpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY2FsbCBhZGRyZXNzX2RzdChyZCkiLDMyLDEzLAorMHgwMCwKKyNlbmRpZgorImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX1grKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwfSwKKworCisvKiAxMTAxIGRpc3AxMiAqKiogY2FsciBkaXNwMTIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjYWxyIGRpc3AxMiIsMTYsMTAsCisweDAwLAorI2VuZGlmCisiY2FsciIsT1BDX2NhbHIsMCx7Q0xBU1NfRElTUCx9LAorCXtDTEFTU19CSVQrMHhkLENMQVNTX0RJU1ArKEFSR19ESVNQMTIpLDAsMCwwLDAsMCwwLDAsfSwxLDIsNDF9LAorCisKKy8qIDAwMDAgMTEwMSBkZE4wIDEwMDAgKioqIGNsciBAcmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjbHIgQHJkIiwxNiw4LAorMHgwMCwKKyNlbmRpZgorImNsciIsT1BDX2NsciwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0Mn0sCisKKworLyogMDEwMCAxMTAxIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY2xyIGFkZHJlc3NfZHN0IiwxNiwxMSwKKzB4MDAsCisjZW5kaWYKKyJjbHIiLE9QQ19jbHIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0M30sCisKKworLyogMDEwMCAxMTAxIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyIGFkZHJlc3NfZHN0KHJkKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNsciBhZGRyZXNzX2RzdChyZCkiLDE2LDEyLAorMHgwMCwKKyNlbmRpZgorImNsciIsT1BDX2NsciwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0NH0sCisKKworLyogMTAwMCAxMTAxIGRkZGQgMTAwMCAqKiogY2xyIHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY2xyIHJkIiwxNiw3LAorMHgwMCwKKyNlbmRpZgorImNsciIsT1BDX2NsciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsNDV9LAorCisKKy8qIDAwMDAgMTEwMCBkZE4wIDEwMDAgKioqIGNscmIgQHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY2xyYiBAcmQiLDgsOCwKKzB4MDAsCisjZW5kaWYKKyJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0Nn0sCisKKworLyogMDEwMCAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyYiBhZGRyZXNzX2RzdCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNscmIgYWRkcmVzc19kc3QiLDgsMTEsCisweDAwLAorI2VuZGlmCisiY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0N30sCisKKworLyogMDEwMCAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogY2xyYiBhZGRyZXNzX2RzdChyZCkgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjbHJiIGFkZHJlc3NfZHN0KHJkKSIsOCwxMiwKKzB4MDAsCisjZW5kaWYKKyJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0OH0sCisKKworLyogMTAwMCAxMTAwIGRkZGQgMTAwMCAqKiogY2xyYiByYmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjbHJiIHJiZCIsOCw3LAorMHgwMCwKKyNlbmRpZgorImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0OX0sCisKKworLyogMDAwMCAxMTAxIGRkTjAgMDAwMCAqKiogY29tIEByZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNvbSBAcmQiLDE2LDEyLAorMHgxOCwKKyNlbmRpZgorImNvbSIsT1BDX2NvbSwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1MH0sCisKKworLyogMDEwMCAxMTAxIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY29tIGFkZHJlc3NfZHN0IiwxNiwxNSwKKzB4MTgsCisjZW5kaWYKKyJjb20iLE9QQ19jb20sMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1MX0sCisKKworLyogMDEwMCAxMTAxIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tIGFkZHJlc3NfZHN0KHJkKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNvbSBhZGRyZXNzX2RzdChyZCkiLDE2LDE2LAorMHgxOCwKKyNlbmRpZgorImNvbSIsT1BDX2NvbSwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1Mn0sCisKKworLyogMTAwMCAxMTAxIGRkZGQgMDAwMCAqKiogY29tIHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY29tIHJkIiwxNiw3LAorMHgxOCwKKyNlbmRpZgorImNvbSIsT1BDX2NvbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTN9LAorCisKKy8qIDAwMDAgMTEwMCBkZE4wIDAwMDAgKioqIGNvbWIgQHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY29tYiBAcmQiLDgsMTIsCisweDFjLAorI2VuZGlmCisiY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTR9LAorCisKKy8qIDAxMDAgMTEwMCAwMDAwIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbWIgYWRkcmVzc19kc3QgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjb21iIGFkZHJlc3NfZHN0Iiw4LDE1LAorMHgxYywKKyNlbmRpZgorImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTV9LAorCisKKy8qIDAxMDAgMTEwMCBkZE4wIDAwMDAgYWRkcmVzc19kc3QgKioqIGNvbWIgYWRkcmVzc19kc3QocmQpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY29tYiBhZGRyZXNzX2RzdChyZCkiLDgsMTYsCisweDFjLAorI2VuZGlmCisiY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNTZ9LAorCisKKy8qIDEwMDAgMTEwMCBkZGRkIDAwMDAgKioqIGNvbWIgcmJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY29tYiByYmQiLDgsNywKKzB4MWMsCisjZW5kaWYKKyJjb21iIixPUENfY29tYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsNTd9LAorCisKKy8qIDEwMDAgMTEwMSBmbGFncyAwMTAxICoqKiBjb21mbGcgZmxhZ3MgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjb21mbGcgZmxhZ3MiLDE2LDcsCisweDNjLAorI2VuZGlmCisiY29tZmxnIixPUENfY29tZmxnLDAse0NMQVNTX0ZMQUdTLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzUsMCwwLDAsMCwwLH0sMSwyLDU4fSwKKworCisvKiAwMDAwIDExMDEgZGROMCAwMDAxIGltbTE2ICoqKiBjcCBAcmQsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcCBAcmQsaW1tMTYiLDE2LDExLAorMHgzYywKKyNlbmRpZgorImNwIixPUENfY3AsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNTl9LAorCisKKy8qIDAxMDAgMTEwMSBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsMTYsMTUsCisweDNjLAorI2VuZGlmCisiY3AiLE9QQ19jcCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiw2MH0sCisKKworLyogMDEwMCAxMTAxIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogY3AgYWRkcmVzc19kc3QsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcCBhZGRyZXNzX2RzdCxpbW0xNiIsMTYsMTQsCisweDNjLAorI2VuZGlmCisiY3AiLE9QQ19jcCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDYxfSwKKworCisvKiAwMDAwIDEwMTEgc3NOMCBkZGRkICoqKiBjcCByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcCByZCxAcnMiLDE2LDcsCisweDNjLAorI2VuZGlmCisiY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNjJ9LAorCisKKy8qIDAxMDAgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwIHJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3AgcmQsYWRkcmVzc19zcmMiLDE2LDksCisweDNjLAorI2VuZGlmCisiY3AiLE9QQ19jcCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw2M30sCisKKworLyogMDEwMCAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3AgcmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3AgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKKzB4M2MsCisjZW5kaWYKKyJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw2NH0sCisKKworLyogMDAwMCAxMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogY3AgcmQsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcCByZCxpbW0xNiIsMTYsNywKKzB4M2MsCisjZW5kaWYKKyJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw2NX0sCisKKworLyogMTAwMCAxMDExIHNzc3MgZGRkZCAqKiogY3AgcmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcCByZCxycyIsMTYsNCwKKzB4M2MsCisjZW5kaWYKKyJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNjZ9LAorCisKKy8qIDAwMDAgMTEwMCBkZE4wIDAwMDEgaW1tOCBpbW04ICoqKiBjcGIgQHJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGIgQHJkLGltbTgiLDgsMTEsCisweDNjLAorI2VuZGlmCisiY3BiIixPUENfY3BiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNjd9LAorCisKKy8qIDAxMDAgMTEwMCBkZE4wIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBjcGIgYWRkcmVzc19kc3QocmQpLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGIgYWRkcmVzc19kc3QocmQpLGltbTgiLDgsMTUsCisweDNjLAorI2VuZGlmCisiY3BiIixPUENfY3BiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsNjh9LAorCisKKy8qIDAxMDAgMTEwMCAwMDAwIDAwMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBjcGIgYWRkcmVzc19kc3QsaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwYiBhZGRyZXNzX2RzdCxpbW04Iiw4LDE0LAorMHgzYywKKyNlbmRpZgorImNwYiIsT1BDX2NwYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsNjl9LAorCisKKy8qIDAwMDAgMTAxMCBzc04wIGRkZGQgKioqIGNwYiByYmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BiIHJiZCxAcnMiLDgsNywKKzB4M2MsCisjZW5kaWYKKyJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDcwfSwKKworCisvKiAwMTAwIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGIgcmJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAorMHgzYywKKyNlbmRpZgorImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw3MX0sCisKKworLyogMDEwMCAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKKzB4M2MsCisjZW5kaWYKKyJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDcyfSwKKworCisvKiAwMDAwIDEwMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogY3BiIHJiZCxpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BiIHJiZCxpbW04Iiw4LDcsCisweDNjLAorI2VuZGlmCisiY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDczfSwKKworCisvKiAxMDAwIDEwMTAgc3NzcyBkZGRkICoqKiBjcGIgcmJkLHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwYiByYmQscmJzIiw4LDQsCisweDNjLAorI2VuZGlmCisiY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNzR9LAorCisKKy8qIDEwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkIHJkLEBycyxycixjYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwZCByZCxAcnMscnIsY2MiLDE2LDExLAorMHgzYywKKyNlbmRpZgorImNwZCIsT1BDX2NwZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc1fSwKKworCisvKiAxMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZGIgcmJkLEBycyxycixjYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwZGIgcmJkLEBycyxycixjYyIsOCwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcGRiIixPUENfY3BkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc2fSwKKworCisvKiAxMDExIDEwMTEgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZHIgcmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BkciByZCxAcnMscnIsY2MiLDE2LDExLAorMHgzYywKKyNlbmRpZgorImNwZHIiLE9QQ19jcGRyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3N30sCisKKworLyogMTAxMSAxMDEwIHNzTjAgMTEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGRyYiByYmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BkcmIgcmJkLEBycyxycixjYyIsOCwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcGRyYiIsT1BDX2NwZHJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3OH0sCisKKworLyogMTAxMSAxMDExIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGkgcmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BpIHJkLEBycyxycixjYyIsMTYsMTEsCisweDNjLAorI2VuZGlmCisiY3BpIixPUENfY3BpLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzl9LAorCisKKy8qIDEwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpYiByYmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BpYiByYmQsQHJzLHJyLGNjIiw4LDExLAorMHgzYywKKyNlbmRpZgorImNwaWIiLE9QQ19jcGliLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODB9LAorCisKKy8qIDEwMTEgMTAxMSBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BpciByZCxAcnMscnIsY2MgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGlyIHJkLEBycyxycixjYyIsMTYsMTEsCisweDNjLAorI2VuZGlmCisiY3BpciIsT1BDX2NwaXIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4MX0sCisKKworLyogMTAxMSAxMDEwIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGlyYiByYmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BpcmIgcmJkLEBycyxycixjYyIsOCwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcGlyYiIsT1BDX2NwaXJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODJ9LAorCisKKy8qIDAwMDEgMDAwMCBzc04wIGRkZGQgKioqIGNwbCBycmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BsIHJyZCxAcnMiLDMyLDE0LAorMHgzYywKKyNlbmRpZgorImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDgzfSwKKworCisvKiAwMTAxIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGwgcnJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BsIHJyZCxhZGRyZXNzX3NyYyIsMzIsMTUsCisweDNjLAorI2VuZGlmCisiY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4NH0sCisKKworLyogMDEwMSAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3BsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCisweDNjLAorI2VuZGlmCisiY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsODV9LAorCisKKy8qIDAwMDEgMDAwMCAwMDAwIGRkZGQgaW1tMzIgKioqIGNwbCBycmQsaW1tMzIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGwgcnJkLGltbTMyIiwzMiwxNCwKKzB4M2MsCisjZW5kaWYKKyJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiw4Nn0sCisKKworLyogMTAwMSAwMDAwIHNzc3MgZGRkZCAqKiogY3BsIHJyZCxycnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcGwgcnJkLHJycyIsMzIsOCwKKzB4M2MsCisjZW5kaWYKKyJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsODd9LAorCisKKy8qIDEwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZCBAcmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BzZCBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcHNkIixPUENfY3BzZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4OH0sCisKKworLyogMTAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkYiBAcmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BzZGIgQHJkLEBycyxycixjYyIsOCwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcHNkYiIsT1BDX2Nwc2RiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDg5fSwKKworCisvKiAxMDExIDEwMTEgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RyIEByZCxAcnMscnIsY2MgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcHNkciBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcHNkciIsT1BDX2Nwc2RyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkwfSwKKworCisvKiAxMDExIDEwMTAgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RyYiBAcmQsQHJzLHJyLGNjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiY3BzZHJiIEByZCxAcnMscnIsY2MiLDgsMTEsCisweDNjLAorI2VuZGlmCisiY3BzZHJiIixPUENfY3BzZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkxfSwKKworCisvKiAxMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2kgQHJkLEBycyxycixjYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwc2kgQHJkLEBycyxycixjYyIsMTYsMTEsCisweDNjLAorI2VuZGlmCisiY3BzaSIsT1BDX2Nwc2ksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkyfSwKKworCisvKiAxMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2liIEByZCxAcnMscnIsY2MgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcHNpYiBAcmQsQHJzLHJyLGNjIiw4LDExLAorMHgzYywKKyNlbmRpZgorImNwc2liIixPUENfY3BzaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDkzfSwKKworCisvKiAxMDExIDEwMTEgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2lyIEByZCxAcnMscnIsY2MgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJjcHNpciBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKKzB4M2MsCisjZW5kaWYKKyJjcHNpciIsT1BDX2Nwc2lyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5NH0sCisKKworLyogMTAxMSAxMDEwIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNpcmIgQHJkLEBycyxycixjYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImNwc2lyYiBAcmQsQHJzLHJyLGNjIiw4LDExLAorMHgzYywKKyNlbmRpZgorImNwc2lyYiIsT1BDX2Nwc2lyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTV9LAorCisKKy8qIDEwMTEgMDAwMCBkZGRkIDAwMDAgKioqIGRhYiByYmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJkYWIgcmJkIiw4LDUsCisweDM4LAorI2VuZGlmCisiZGFiIixPUENfZGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw5Nn0sCisKKworLyogMTExMSBkZGRkIDBkaXNwNyAqKiogZGJqbnogcmJkLGRpc3A3ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGJqbnogcmJkLGRpc3A3IiwxNiwxMSwKKzB4MDAsCisjZW5kaWYKKyJkYmpueiIsT1BDX2Riam56LDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKKwl7Q0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMERJU1A3LDAsMCwwLDAsMCwwLH0sMiwyLDk3fSwKKworCisvKiAwMDEwIDEwMTEgZGROMCBpbW00bTEgKioqIGRlYyBAcmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGVjIEByZCxpbW00bTEiLDE2LDExLAorMHgxYywKKyNlbmRpZgorImRlYyIsT1BDX2RlYywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDk4fSwKKworCisvKiAwMTEwIDEwMTEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDE2LDE0LAorMHgxYywKKyNlbmRpZgorImRlYyIsT1BDX2RlYywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDk5fSwKKworCisvKiAwMTEwIDEwMTEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlYyBhZGRyZXNzX2RzdCxpbW00bTEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJkZWMgYWRkcmVzc19kc3QsaW1tNG0xIiwxNiwxMywKKzB4MWMsCisjZW5kaWYKKyJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwMH0sCisKKworLyogMTAxMCAxMDExIGRkZGQgaW1tNG0xICoqKiBkZWMgcmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGVjIHJkLGltbTRtMSIsMTYsNCwKKzB4MWMsCisjZW5kaWYKKyJkZWMiLE9QQ19kZWMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDF9LAorCisKKy8qIDAwMTAgMTAxMCBkZE4wIGltbTRtMSAqKiogZGVjYiBAcmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGVjYiBAcmQsaW1tNG0xIiw4LDExLAorMHgxYywKKyNlbmRpZgorImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCisJe0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTAyfSwKKworCisvKiAwMTEwIDEwMTAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRlY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsOCwxNCwKKzB4MWMsCisjZW5kaWYKKyJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwM30sCisKKworLyogMDExMCAxMDEwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBkZWNiIGFkZHJlc3NfZHN0LGltbTRtMSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRlY2IgYWRkcmVzc19kc3QsaW1tNG0xIiw4LDEzLAorMHgxYywKKyNlbmRpZgorImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxMDR9LAorCisKKy8qIDEwMTAgMTAxMCBkZGRkIGltbTRtMSAqKiogZGVjYiByYmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGVjYiByYmQsaW1tNG0xIiw4LDQsCisweDFjLAorI2VuZGlmCisiZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDV9LAorCisKKy8qIDAxMTEgMTEwMCAwMDAwIDAwaWkgKioqIGRpIGkyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGkgaTIiLDE2LDcsCisweDAwLAorI2VuZGlmCisiZGkiLE9QQ19kaSwwLHtDTEFTU19JTU0rKEFSR19JTU0yKSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTXzAwSUksMCwwLDAsMCwwLH0sMSwyLDEwNn0sCisKKworLyogMDAwMSAxMDExIHNzTjAgZGRkZCAqKiogZGl2IHJyZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJkaXYgcnJkLEBycyIsMTYsMTA3LAorMHgzYywKKyNlbmRpZgorImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTA3fSwKKworCisvKiAwMTAxIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBkaXYgcnJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGl2IHJyZCxhZGRyZXNzX3NyYyIsMTYsMTA3LAorMHgzYywKKyNlbmRpZgorImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMDh9LAorCisKKy8qIDAxMDEgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdiBycmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGl2IHJyZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwNywKKzB4M2MsCisjZW5kaWYKKyJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEwOX0sCisKKworLyogMDAwMSAxMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogZGl2IHJyZCxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRpdiBycmQsaW1tMTYiLDE2LDEwNywKKzB4M2MsCisjZW5kaWYKKyJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDExMH0sCisKKworLyogMTAwMSAxMDExIHNzc3MgZGRkZCAqKiogZGl2IHJyZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRpdiBycmQscnMiLDE2LDEwNywKKzB4M2MsCisjZW5kaWYKKyJkaXYiLE9QQ19kaXYsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTF9LAorCisKKy8qIDAwMDEgMTAxMCBzc04wIGRkZGQgKioqIGRpdmwgcnFkLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRpdmwgcnFkLEBycyIsMzIsNzQ0LAorMHgzYywKKyNlbmRpZgorImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMTJ9LAorCisKKy8qIDAxMDEgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdmwgcnFkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGl2bCBycWQsYWRkcmVzc19zcmMiLDMyLDc0NSwKKzB4M2MsCisjZW5kaWYKKyJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMTN9LAorCisKKy8qIDAxMDEgMTAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRpdmwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsNzQ2LAorMHgzYywKKyNlbmRpZgorImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMTR9LAorCisKKy8qIDAwMDEgMTAxMCAwMDAwIGRkZGQgaW1tMzIgKioqIGRpdmwgcnFkLGltbTMyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZGl2bCBycWQsaW1tMzIiLDMyLDc0NCwKKzB4M2MsCisjZW5kaWYKKyJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMTE1fSwKKworCisvKiAxMDAxIDEwMTAgc3NzcyBkZGRkICoqKiBkaXZsIHJxZCxycnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJkaXZsIHJxZCxycnMiLDMyLDc0NCwKKzB4M2MsCisjZW5kaWYKKyJkaXZsIixPUENfZGl2bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExNn0sCisKKworLyogMTExMSBkZGRkIDFkaXNwNyAqKiogZGpueiByZCxkaXNwNyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImRqbnogcmQsZGlzcDciLDE2LDExLAorMHgwMCwKKyNlbmRpZgorImRqbnoiLE9QQ19kam56LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKKwl7Q0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMURJU1A3LDAsMCwwLDAsMCwwLH0sMiwyLDExN30sCisKKworLyogMDExMSAxMTAwIDAwMDAgMDFpaSAqKiogZWkgaTIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJlaSBpMiIsMTYsNywKKzB4MDAsCisjZW5kaWYKKyJlaSIsT1BDX2VpLDAse0NMQVNTX0lNTSsoQVJHX0lNTTIpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfMDFJSSwwLDAsMCwwLDAsfSwxLDIsMTE4fSwKKworCisvKiAwMDEwIDExMDEgc3NOMCBkZGRkICoqKiBleCByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleCByZCxAcnMiLDE2LDEyLAorMHgwMCwKKyNlbmRpZgorImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExOX0sCisKKworLyogMDExMCAxMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXggcmQsYWRkcmVzc19zcmMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleCByZCxhZGRyZXNzX3NyYyIsMTYsMTUsCisweDAwLAorI2VuZGlmCisiZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjB9LAorCisKKy8qIDAxMTAgMTEwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGV4IHJkLGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImV4IHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTYsCisweDAwLAorI2VuZGlmCisiZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTIxfSwKKworCisvKiAxMDEwIDExMDEgc3NzcyBkZGRkICoqKiBleCByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImV4IHJkLHJzIiwxNiw2LAorMHgwMCwKKyNlbmRpZgorImV4IixPUENfZXgsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyMn0sCisKKworLyogMDAxMCAxMTAwIHNzTjAgZGRkZCAqKiogZXhiIHJiZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleGIgcmJkLEBycyIsOCwxMiwKKzB4MDAsCisjZW5kaWYKKyJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEyM30sCisKKworLyogMDExMCAxMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXhiIHJiZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImV4YiByYmQsYWRkcmVzc19zcmMiLDgsMTUsCisweDAwLAorI2VuZGlmCisiZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyNH0sCisKKworLyogMDExMCAxMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXhiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxNiwKKzB4MDAsCisjZW5kaWYKKyJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyNX0sCisKKworLyogMTAxMCAxMTAwIHNzc3MgZGRkZCAqKiogZXhiIHJiZCxyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleGIgcmJkLHJicyIsOCw2LAorMHgwMCwKKyNlbmRpZgorImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTI2fSwKKworCisvKiAwMDAwIDExMTAgaW1tOCAqKiogZXh0MGUgaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImV4dDBlIGltbTgiLDgsMTAsCisweDAwLAorI2VuZGlmCisiZXh0MGUiLE9QQ19leHQwZSwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyN30sCisKKworLyogMDAwMCAxMTExIGltbTggKioqIGV4dDBmIGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleHQwZiBpbW04Iiw4LDEwLAorMHgwMCwKKyNlbmRpZgorImV4dDBmIixPUENfZXh0MGYsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjh9LAorCisKKy8qIDEwMDAgMTExMCBpbW04ICoqKiBleHQ4ZSBpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZXh0OGUgaW1tOCIsOCwxMCwKKzB4MDAsCisjZW5kaWYKKyJleHQ4ZSIsT1BDX2V4dDhlLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI5fSwKKworCisvKiAxMDAwIDExMTEgaW1tOCAqKiogZXh0OGYgaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImV4dDhmIGltbTgiLDgsMTAsCisweDAwLAorI2VuZGlmCisiZXh0OGYiLE9QQ19leHQ4ZiwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEzMH0sCisKKworLyogMTAxMSAwMDAxIGRkZGQgMTAxMCAqKiogZXh0cyBycmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJleHRzIHJyZCIsMTYsMTEsCisweDAwLAorI2VuZGlmCisiZXh0cyIsT1BDX2V4dHMsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YSwwLDAsMCwwLDAsfSwxLDIsMTMxfSwKKworCisvKiAxMDExIDAwMDEgZGRkZCAwMDAwICoqKiBleHRzYiByZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImV4dHNiIHJkIiw4LDExLAorMHgwMCwKKyNlbmRpZgorImV4dHNiIixPUENfZXh0c2IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDEzMn0sCisKKworLyogMTAxMSAwMDAxIGRkZGQgMDExMSAqKiogZXh0c2wgcnFkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiZXh0c2wgcnFkIiwzMiwxMSwKKzB4MDAsCisjZW5kaWYKKyJleHRzbCIsT1BDX2V4dHNsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs3LDAsMCwwLDAsMCx9LDEsMiwxMzN9LAorCisKKy8qIDAxMTEgMTAxMCAwMDAwIDAwMDAgKioqIGhhbHQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJoYWx0IiwxNiw4LAorMHgwMCwKKyNlbmRpZgorImhhbHQiLE9QQ19oYWx0LDAsezB9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwxMzR9LAorCisKKy8qIDAwMTEgMTEwMSBzc04wIGRkZGQgKioqIGluIHJkLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImluIHJkLEBycyIsMTYsMTAsCisweDAwLAorI2VuZGlmCisiaW4iLE9QQ19pbiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTM1fSwKKworCisvKiAwMDExIDExMDEgZGRkZCAwMTAwIGltbTE2ICoqKiBpbiByZCxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImluIHJkLGltbTE2IiwxNiwxMiwKKzB4MDAsCisjZW5kaWYKKyJpbiIsT1BDX2luLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMzZ9LAorCisKKy8qIDAwMTEgMTEwMCBzc04wIGRkZGQgKioqIGluYiByYmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5iIHJiZCxAcnMiLDgsMTIsCisweDAwLAorI2VuZGlmCisiaW5iIixPUENfaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMzd9LAorCisKKy8qIDAwMTEgMTAxMCBkZGRkIDAxMDAgaW1tMTYgKioqIGluYiByYmQsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJpbmIgcmJkLGltbTE2Iiw4LDEwLAorMHgwMCwKKyNlbmRpZgorImluYiIsT1BDX2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTM4fSwKKworCisvKiAwMDEwIDEwMDEgZGROMCBpbW00bTEgKioqIGluYyBAcmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5jIEByZCxpbW00bTEiLDE2LDExLAorMHgxYywKKyNlbmRpZgorImluYyIsT1BDX2luYywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMzl9LAorCisKKy8qIDAxMTAgMTAwMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsMTYsMTQsCisweDFjLAorI2VuZGlmCisiaW5jIixPUENfaW5jLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0MH0sCisKKworLyogMDExMCAxMDAxIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmMgYWRkcmVzc19kc3QsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5jIGFkZHJlc3NfZHN0LGltbTRtMSIsMTYsMTMsCisweDFjLAorI2VuZGlmCisiaW5jIixPUENfaW5jLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQxfSwKKworCisvKiAxMDEwIDEwMDEgZGRkZCBpbW00bTEgKioqIGluYyByZCxpbW00bTEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJpbmMgcmQsaW1tNG0xIiwxNiw0LAorMHgxYywKKyNlbmRpZgorImluYyIsT1BDX2luYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDJ9LAorCisKKy8qIDAwMTAgMTAwMCBkZE4wIGltbTRtMSAqKiogaW5jYiBAcmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5jYiBAcmQsaW1tNG0xIiw4LDExLAorMHgxYywKKyNlbmRpZgorImluY2IiLE9QQ19pbmNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCisJe0NMQVNTX0JJVCsyLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0M30sCisKKworLyogMDExMCAxMDAwIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLDgsMTQsCisweDFjLAorI2VuZGlmCisiaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQ0fSwKKworCisvKiAwMTEwIDEwMDAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluY2IgYWRkcmVzc19kc3QsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEiLDgsMTMsCisweDFjLAorI2VuZGlmCisiaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDV9LAorCisKKy8qIDEwMTAgMTAwMCBkZGRkIGltbTRtMSAqKiogaW5jYiByYmQsaW1tNG0xICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5jYiByYmQsaW1tNG0xIiw4LDQsCisweDFjLAorI2VuZGlmCisiaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQ2fSwKKworCisvKiAwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluZCBAcmQsQHJzLHJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5kIEByZCxAcnMscmEiLDE2LDIxLAorMHgwNCwKKyNlbmRpZgorImluZCIsT1BDX2luZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0N30sCisKKworLyogMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmRiIEByZCxAcnMscmJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisiaW5kYiBAcmQsQHJzLHJiYSIsOCwyMSwKKzB4MDQsCisjZW5kaWYKKyJpbmRiIixPUENfaW5kYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0OH0sCisKKworLyogMDAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBpbmliIEByZCxAcnMscmEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJpbmliIEByZCxAcnMscmEiLDgsMjEsCisweDA0LAorI2VuZGlmCisiaW5pYiIsT1BDX2luaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxNDl9LAorCisKKy8qIDAwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogaW5pYnIgQHJkLEBycyxyYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImluaWJyIEByZCxAcnMscmEiLDE2LDIxLAorMHgwNCwKKyNlbmRpZgorImluaWJyIixPUENfaW5pYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxNTB9LAorCisKKy8qIDAxMTEgMTAxMSAwMDAwIDAwMDAgKioqIGlyZXQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJpcmV0IiwxNiwxMywKKzB4M2YsCisjZW5kaWYKKyJpcmV0IixPUENfaXJldCwwLHswfSwKKwl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMTUxfSwKKworCisvKiAwMDAxIDExMTAgZGROMCBjY2NjICoqKiBqcCBjYyxAcmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJqcCBjYyxAcmQiLDE2LDEwLAorMHgwMCwKKyNlbmRpZgorImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfSVIrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLDAsMCwwLDAsfSwyLDIsMTUyfSwKKworCisvKiAwMTAxIDExMTAgMDAwMCBjY2NjIGFkZHJlc3NfZHN0ICoqKiBqcCBjYyxhZGRyZXNzX2RzdCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImpwIGNjLGFkZHJlc3NfZHN0IiwxNiw3LAorMHgwMCwKKyNlbmRpZgorImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfQ0MsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNTN9LAorCisKKy8qIDAxMDEgMTExMCBkZE4wIGNjY2MgYWRkcmVzc19kc3QgKioqIGpwIGNjLGFkZHJlc3NfZHN0KHJkKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImpwIGNjLGFkZHJlc3NfZHN0KHJkKSIsMTYsOCwKKzB4MDAsCisjZW5kaWYKKyJqcCIsT1BDX2pwLDAse0NMQVNTX0NDLENMQVNTX1grKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQyxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1NH0sCisKKworLyogMTExMCBjY2NjIGRpc3A4ICoqKiBqciBjYyxkaXNwOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImpyIGNjLGRpc3A4IiwxNiw2LAorMHgwMCwKKyNlbmRpZgorImpyIixPUENfanIsMCx7Q0xBU1NfQ0MsQ0xBU1NfRElTUCx9LAorCXtDTEFTU19CSVQrMHhlLENMQVNTX0NDLENMQVNTX0RJU1A4LDAsMCwwLDAsMCwwLH0sMiwyLDE1NX0sCisKKworLyogMDAwMCAxMTAxIGRkTjAgMDEwMSBpbW0xNiAqKiogbGQgQHJkLGltbTE2ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGQgQHJkLGltbTE2IiwxNiw3LAorMHgwMCwKKyNlbmRpZgorImxkIixPUENfbGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTU2fSwKKworCisvKiAwMDEwIDExMTEgZGROMCBzc3NzICoqKiBsZCBAcmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCBAcmQscnMiLDE2LDgsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMTU3fSwKKworCisvKiAwMTAwIDExMDEgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCBhZGRyZXNzX2RzdChyZCksaW1tMTYiLDE2LDE1LAorMHgwMCwKKyNlbmRpZgorImxkIixPUENfbGQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsMTU4fSwKKworCisvKiAwMTEwIDExMTEgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZCBhZGRyZXNzX2RzdChyZCkscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCBhZGRyZXNzX2RzdChyZCkscnMiLDE2LDEyLAorMHgwMCwKKyNlbmRpZgorImxkIixPUENfbGQsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1OX0sCisKKworLyogMDEwMCAxMTAxIDAwMDAgMDEwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogbGQgYWRkcmVzc19kc3QsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCBhZGRyZXNzX2RzdCxpbW0xNiIsMTYsMTQsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDE2MH0sCisKKworLyogMDExMCAxMTExIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGQgYWRkcmVzc19kc3QscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCBhZGRyZXNzX2RzdCxycyIsMTYsMTEsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNjF9LAorCisKKy8qIDAwMTEgMDAxMSBkZE4wIHNzc3MgaW1tMTYgKioqIGxkIHJkKGltbTE2KSxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkIHJkKGltbTE2KSxycyIsMTYsMTQsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTYyfSwKKworCisvKiAwMTExIDAwMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkIHJkKHJ4KSxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkIHJkKHJ4KSxycyIsMTYsMTQsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTYzfSwKKworCisvKiAwMDEwIDAwMDEgc3NOMCBkZGRkICoqKiBsZCByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCByZCxAcnMiLDE2LDcsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2NH0sCisKKworLyogMDExMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGQgcmQsYWRkcmVzc19zcmMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKKzB4MDAsCisjZW5kaWYKKyJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNjV9LAorCisKKy8qIDAxMTAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE2Nn0sCisKKworLyogMDAxMCAwMDAxIDAwMDAgZGRkZCBpbW0xNiAqKiogbGQgcmQsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZCByZCxpbW0xNiIsMTYsNywKKzB4MDAsCisjZW5kaWYKKyJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTY3fSwKKworCisvKiAxMDEwIDAwMDEgc3NzcyBkZGRkICoqKiBsZCByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkIHJkLHJzIiwxNiwzLAorMHgwMCwKKyNlbmRpZgorImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxNjh9LAorCisKKy8qIDAwMTEgMDAwMSBzc04wIGRkZGQgaW1tMTYgKioqIGxkIHJkLHJzKGltbTE2KSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkIHJkLHJzKGltbTE2KSIsMTYsMTQsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTY5fSwKKworCisvKiAwMTExIDAwMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkIHJkLHJzKHJ4KSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkIHJkLHJzKHJ4KSIsMTYsMTQsCisweDAwLAorI2VuZGlmCisibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTcwfSwKKworCisvKiAwMTExIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGEgcHJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRhIHByZCxhZGRyZXNzX3NyYyIsMTYsMTIsCisweDAwLAorI2VuZGlmCisibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxNzF9LAorCisKKy8qIDAxMTEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYSBwcmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRhIHByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEzLAorMHgwMCwKKyNlbmRpZgorImxkYSIsT1BDX2xkYSwwLHtDTEFTU19QUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE3Mn0sCisKKworLyogMDAxMSAwMTAwIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRhIHByZCxycyhpbW0xNikgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGEgcHJkLHJzKGltbTE2KSIsMTYsMTUsCisweDAwLAorI2VuZGlmCisibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNzN9LAorCisKKy8qIDAxMTEgMDEwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRhIHByZCxycyhyeCkgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGEgcHJkLHJzKHJ4KSIsMTYsMTUsCisweDAwLAorI2VuZGlmCisibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNzR9LAorCisKKy8qIDAwMTEgMDEwMCAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZGFyIHByZCxkaXNwMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGFyIHByZCxkaXNwMTYiLDE2LDE1LAorMHgwMCwKKyNlbmRpZgorImxkYXIiLE9QQ19sZGFyLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMTc1fSwKKworCisvKiAwMDAwIDExMDAgZGROMCAwMTAxIGltbTggaW1tOCAqKiogbGRiIEByZCxpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRiIEByZCxpbW04Iiw4LDcsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMTc2fSwKKworCisvKiAwMDEwIDExMTAgZGROMCBzc3NzICoqKiBsZGIgQHJkLHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkYiBAcmQscmJzIiw4LDgsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwxNzd9LAorCisKKy8qIDAxMDAgMTEwMCBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBsZGIgYWRkcmVzc19kc3QocmQpLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGIgYWRkcmVzc19kc3QocmQpLGltbTgiLDgsMTUsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsMTc4fSwKKworCisvKiAwMTEwIDExMTAgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGIgYWRkcmVzc19kc3QocmQpLHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkYiBhZGRyZXNzX2RzdChyZCkscmJzIiw4LDEyLAorMHgwMCwKKyNlbmRpZgorImxkYiIsT1BDX2xkYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTc5fSwKKworCisvKiAwMTAwIDExMDAgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCAqKiogbGRiIGFkZHJlc3NfZHN0LGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGIgYWRkcmVzc19kc3QsaW1tOCIsOCwxNCwKKzB4MDAsCisjZW5kaWYKKyJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw2LDE4MH0sCisKKworLyogMDExMCAxMTEwIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRiIGFkZHJlc3NfZHN0LHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkYiBhZGRyZXNzX2RzdCxyYnMiLDgsMTEsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE4MX0sCisKKworLyogMDAxMCAwMDAwIHNzTjAgZGRkZCAqKiogbGRiIHJiZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGIgcmJkLEBycyIsOCw3LAorMHgwMCwKKyNlbmRpZgorImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE4Mn0sCisKKworLyogMDExMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRiIHJiZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKKzB4MDAsCisjZW5kaWYKKyJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4M30sCisKKworLyogMDExMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKKzB4MDAsCisjZW5kaWYKKyJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxODR9LAorCisKKy8qIDExMDAgZGRkZCBpbW04ICoqKiBsZGIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGIgcmJkLGltbTgiLDgsNSwKKzB4MDAsCisjZW5kaWYKKyJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwyLDIsMTg1fSwKKworCisvKiAxMDEwIDAwMDAgc3NzcyBkZGRkICoqKiBsZGIgcmJkLHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkYiByYmQscmJzIiw4LDMsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTg2fSwKKworCisvKiAwMDExIDAwMDAgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGIgcmJkLHJzKGltbTE2KSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkYiByYmQscnMoaW1tMTYpIiw4LDE0LAorMHgwMCwKKyNlbmRpZgorImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTg3fSwKKworCisvKiAwMTExIDAwMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkYiByYmQscnMocngpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRiIHJiZCxycyhyeCkiLDgsMTQsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxODh9LAorCisKKy8qIDAwMTEgMDAxMCBkZE4wIHNzc3MgaW1tMTYgKioqIGxkYiByZChpbW0xNikscmJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRiIHJkKGltbTE2KSxyYnMiLDgsMTQsCisweDAwLAorI2VuZGlmCisibGRiIixPUENfbGRiLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxODl9LAorCisKKy8qIDAxMTEgMDAxMCBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRiIHJkKHJ4KSxyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGIgcmQocngpLHJicyIsOCwxNCwKKzB4MDAsCisjZW5kaWYKKyJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfQlgrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE5MH0sCisKKworLyogMDExMSAxMTAxIHNzc3MgMWNjYyAqKiogbGRjdGwgY3RybCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkY3RsIGN0cmwscnMiLDMyLDcsCisweDAwLAorI2VuZGlmCisibGRjdGwiLE9QQ19sZGN0bCwwLHtDTEFTU19DVFJMLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTXzFDQ0MsMCwwLDAsMCwwLH0sMiwyLDE5MX0sCisKKworLyogMDExMSAxMTAxIGRkZGQgMGNjYyAqKiogbGRjdGwgcmQsY3RybCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkY3RsIHJkLGN0cmwiLDMyLDcsCisweDAwLAorI2VuZGlmCisibGRjdGwiLE9QQ19sZGN0bCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19DVFJMLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTXzBDQ0MsMCwwLDAsMCwwLH0sMiwyLDE5Mn0sCisKKworLyogMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGQgQHJkLEBycyxyciAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkZCBAcmQsQHJzLHJyIiwxNiwxMSwKKzB4MDQsCisjZW5kaWYKKyJsZGQiLE9QQ19sZGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5M30sCisKKworLyogMTAxMSAxMDEwIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwICoqKiBsZGRiIEByZCxAcnMscnIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGRiIEByZCxAcnMscnIiLDgsMTEsCisweDA0LAorI2VuZGlmCisibGRkYiIsT1BDX2xkZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE5NH0sCisKKworLyogMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGRyIEByZCxAcnMscnIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGRyIEByZCxAcnMscnIiLDE2LDExLAorMHgwNCwKKyNlbmRpZgorImxkZHIiLE9QQ19sZGRyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTV9LAorCisKKy8qIDEwMTEgMTAxMCBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRkcmIgQHJkLEBycyxyciAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkZHJiIEByZCxAcnMscnIiLDgsMTEsCisweDA0LAorI2VuZGlmCisibGRkcmIiLE9QQ19sZGRyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk2fSwKKworCisvKiAxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkaSBAcmQsQHJzLHJyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRpIEByZCxAcnMscnIiLDE2LDExLAorMHgwNCwKKyNlbmRpZgorImxkaSIsT1BDX2xkaSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk3fSwKKworCisvKiAxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkaWIgQHJkLEBycyxyciAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkaWIgQHJkLEBycyxyciIsOCwxMSwKKzB4MDQsCisjZW5kaWYKKyJsZGliIixPUENfbGRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk4fSwKKworCisvKiAxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkaXIgQHJkLEBycyxyciAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkaXIgQHJkLEBycyxyciIsMTYsMTEsCisweDA0LAorI2VuZGlmCisibGRpciIsT1BDX2xkaXIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5OX0sCisKKworLyogMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGlyYiBAcmQsQHJzLHJyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRpcmIgQHJkLEBycyxyciIsOCwxMSwKKzB4MDQsCisjZW5kaWYKKyJsZGlyYiIsT1BDX2xkaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwyMDB9LAorCisKKy8qIDEwMTEgMTEwMSBkZGRkIGltbTQgKioqIGxkayByZCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRrIHJkLGltbTQiLDE2LDUsCisweDAwLAorI2VuZGlmCisibGRrIixPUENfbGRrLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyMDF9LAorCisKKy8qIDAwMDEgMTEwMSBkZE4wIHNzc3MgKioqIGxkbCBAcmQscnJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRsIEByZCxycnMiLDMyLDExLAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjAyfSwKKworCisvKiAwMTAxIDExMDEgZGROMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGwgYWRkcmVzc19kc3QocmQpLHJycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbCBhZGRyZXNzX2RzdChyZCkscnJzIiwzMiwxNCwKKzB4MDAsCisjZW5kaWYKKyJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDIwM30sCisKKworLyogMDEwMSAxMTAxIDAwMDAgc3NzcyBhZGRyZXNzX2RzdCAqKiogbGRsIGFkZHJlc3NfZHN0LHJycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbCBhZGRyZXNzX2RzdCxycnMiLDMyLDE1LAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyMDR9LAorCisKKy8qIDAwMTEgMDExMSBkZE4wIHNzc3MgaW1tMTYgKioqIGxkbCByZChpbW0xNikscnJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRsIHJkKGltbTE2KSxycnMiLDMyLDE3LAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19CQSsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjA1fSwKKworCisvKiAwMTExIDAxMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkbCByZChyeCkscnJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRsIHJkKHJ4KSxycnMiLDMyLDE3LAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjA2fSwKKworCisvKiAwMDAxIDAxMDAgc3NOMCBkZGRkICoqKiBsZGwgcnJkLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbCBycmQsQHJzIiwzMiwxMSwKKzB4MDAsCisjZW5kaWYKKyJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMDd9LAorCisKKy8qIDAxMDEgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkbCBycmQsYWRkcmVzc19zcmMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxMiwKKzB4MDAsCisjZW5kaWYKKyJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIwOH0sCisKKworLyogMDEwMSAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTMsCisweDAwLAorI2VuZGlmCisibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjA5fSwKKworCisvKiAwMDAxIDAxMDAgMDAwMCBkZGRkIGltbTMyICoqKiBsZGwgcnJkLGltbTMyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRsIHJyZCxpbW0zMiIsMzIsMTEsCisweDAwLAorI2VuZGlmCisibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMjEwfSwKKworCisvKiAxMDAxIDAxMDAgc3NzcyBkZGRkICoqKiBsZGwgcnJkLHJycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbCBycmQscnJzIiwzMiw1LAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMTF9LAorCisKKy8qIDAwMTEgMDEwMSBzc04wIGRkZGQgaW1tMTYgKioqIGxkbCBycmQscnMoaW1tMTYpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRsIHJyZCxycyhpbW0xNikiLDMyLDE3LAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19CQSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjEyfSwKKworCisvKiAwMTExIDAxMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAgKioqIGxkbCBycmQscnMocngpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRsIHJyZCxycyhyeCkiLDMyLDE3LAorMHgwMCwKKyNlbmRpZgorImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19CWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjEzfSwKKworCisvKiAwMDAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgKioqIGxkbSBAcmQscnMsbiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbSBAcmQscnMsbiIsMTYsMTEsCisweDAwLAorI2VuZGlmCisibGRtIixPUENfbGRtLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksMCx9LDMsNCwyMTR9LAorCisKKy8qIDAxMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCAqKiogbGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuIiwxNiwxNSwKKzB4MDAsCisjZW5kaWYKKyJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLH0sMyw2LDIxNX0sCisKKworLyogMDEwMSAxMTAwIDAwMDAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0ICoqKiBsZG0gYWRkcmVzc19kc3QscnMsbiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbSBhZGRyZXNzX2RzdCxycyxuIiwxNiwxNCwKKzB4MDAsCisjZW5kaWYKKyJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksfSwzLDYsMjE2fSwKKworCisvKiAwMDAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgKioqIGxkbSByZCxAcnMsbiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbSByZCxAcnMsbiIsMTYsMTEsCisweDAwLAorI2VuZGlmCisibGRtIixPUENfbGRtLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksMCx9LDMsNCwyMTd9LAorCisKKy8qIDAxMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyAqKiogbGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRtIHJkLGFkZHJlc3Nfc3JjKHJzKSxuIiwxNiwxNSwKKzB4MDAsCisjZW5kaWYKKyJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSxDTEFTU19JTU0gKyAoQVJHX0lNTU4pLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTU5NSU5VUzEpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLH0sMyw2LDIxOH0sCisKKworLyogMDEwMSAxMTAwIDAwMDAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjICoqKiBsZG0gcmQsYWRkcmVzc19zcmMsbiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkbSByZCxhZGRyZXNzX3NyYyxuIiwxNiwxNCwKKzB4MDAsCisjZW5kaWYKKyJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksfSwzLDYsMjE5fSwKKworCisvKiAwMDExIDEwMDEgc3NOMCAwMDAwICoqKiBsZHBzIEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkcHMgQHJzIiwxNiwxMiwKKzB4M2YsCisjZW5kaWYKKyJsZHBzIixPUENfbGRwcywwLHtDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMjIwfSwKKworCisvKiAwMTExIDEwMDEgMDAwMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBsZHBzIGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRwcyBhZGRyZXNzX3NyYyIsMTYsMTYsCisweDNmLAorI2VuZGlmCisibGRwcyIsT1BDX2xkcHMsMCx7Q0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwxLDQsMjIxfSwKKworCisvKiAwMTExIDEwMDEgc3NOMCAwMDAwIGFkZHJlc3Nfc3JjICoqKiBsZHBzIGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkcHMgYWRkcmVzc19zcmMocnMpIiwxNiwxNywKKzB4M2YsCisjZW5kaWYKKyJsZHBzIixPUENfbGRwcywwLHtDTEFTU19YKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwxLDQsMjIyfSwKKworCisvKiAwMDExIDAwMTEgMDAwMCBzc3NzIGRpc3AxNiAqKiogbGRyIGRpc3AxNixycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworImxkciBkaXNwMTYscnMiLDE2LDE0LAorMHgwMCwKKyNlbmRpZgorImxkciIsT1BDX2xkciwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyM30sCisKKworLyogMDAxMSAwMDAxIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkciByZCxkaXNwMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZHIgcmQsZGlzcDE2IiwxNiwxNCwKKzB4MDAsCisjZW5kaWYKKyJsZHIiLE9QQ19sZHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfRElTUCx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjR9LAorCisKKy8qIDAwMTEgMDAxMCAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHJiIGRpc3AxNixyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZHJiIGRpc3AxNixyYnMiLDgsMTQsCisweDAwLAorI2VuZGlmCisibGRyYiIsT1BDX2xkcmIsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjV9LAorCisKKy8qIDAwMTEgMDAwMCAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHJiIHJiZCxkaXNwMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZHJiIHJiZCxkaXNwMTYiLDgsMTQsCisweDAwLAorI2VuZGlmCisibGRyYiIsT1BDX2xkcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfRElTUCx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjZ9LAorCisKKy8qIDAwMTEgMDExMSAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHJsIGRpc3AxNixycnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJsZHJsIGRpc3AxNixycnMiLDMyLDE3LAorMHgwMCwKKyNlbmRpZgorImxkcmwiLE9QQ19sZHJsLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI3fSwKKworCisvKiAwMDExIDAxMDEgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRybCBycmQsZGlzcDE2ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibGRybCBycmQsZGlzcDE2IiwzMiwxNywKKzB4MDAsCisjZW5kaWYKKyJsZHJsIixPUENfbGRybCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19ESVNQLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyOH0sCisKKworLyogMDExMSAxMDExIDAwMDAgMTAxMCAqKiogbWJpdCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm1iaXQiLDE2LDcsCisweDM4LAorI2VuZGlmCisibWJpdCIsT1BDX21iaXQsMCx7MH0sCisJe0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSwwLDAsMCwwLDAsfSwwLDIsMjI5fSwKKworCisvKiAwMTExIDEwMTEgZGRkZCAxMTAxICoqKiBtcmVxIHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibXJlcSByZCIsMTYsMTIsCisweDE4LAorI2VuZGlmCisibXJlcSIsT1BDX21yZXEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCwwLDAsMCwwLDAsfSwxLDIsMjMwfSwKKworCisvKiAwMTExIDEwMTEgMDAwMCAxMDAxICoqKiBtcmVzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibXJlcyIsMTYsNSwKKzB4MDAsCisjZW5kaWYKKyJtcmVzIixPUENfbXJlcywwLHswfSwKKwl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrOSwwLDAsMCwwLDAsfSwwLDIsMjMxfSwKKworCisvKiAwMTExIDEwMTEgMDAwMCAxMDAwICoqKiBtc2V0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibXNldCIsMTYsNSwKKzB4MDAsCisjZW5kaWYKKyJtc2V0IixPUENfbXNldCwwLHswfSwKKwl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwwLDIsMjMyfSwKKworCisvKiAwMDAxIDEwMDEgc3NOMCBkZGRkICoqKiBtdWx0IHJyZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJtdWx0IHJyZCxAcnMiLDE2LDcwLAorMHgzYywKKyNlbmRpZgorIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjMzfSwKKworCisvKiAwMTAxIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0IHJyZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm11bHQgcnJkLGFkZHJlc3Nfc3JjIiwxNiw3MCwKKzB4M2MsCisjZW5kaWYKKyJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM0fSwKKworCisvKiAwMTAxIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJtdWx0IHJyZCxhZGRyZXNzX3NyYyhycykiLDE2LDcwLAorMHgzYywKKyNlbmRpZgorIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM1fSwKKworCisvKiAwMDAxIDEwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBtdWx0IHJyZCxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm11bHQgcnJkLGltbTE2IiwxNiw3MCwKKzB4M2MsCisjZW5kaWYKKyJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDIzNn0sCisKKworLyogMTAwMSAxMDAxIHNzc3MgZGRkZCAqKiogbXVsdCBycmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJtdWx0IHJyZCxycyIsMTYsNzAsCisweDNjLAorI2VuZGlmCisibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjM3fSwKKworCisvKiAwMDAxIDEwMDAgc3NOMCBkZGRkICoqKiBtdWx0bCBycWQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibXVsdGwgcnFkLEBycyIsMzIsMjgyLAorMHgzYywKKyNlbmRpZgorIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzh9LAorCisKKy8qIDAxMDEgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHRsIHJxZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm11bHRsIHJxZCxhZGRyZXNzX3NyYyIsMzIsMjgyLAorMHgzYywKKyNlbmRpZgorIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDIzOX0sCisKKworLyogMDEwMSAxMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm11bHRsIHJxZCxhZGRyZXNzX3NyYyhycykiLDMyLDI4MiwKKzB4M2MsCisjZW5kaWYKKyJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjQwfSwKKworCisvKiAwMDAxIDEwMDAgMDAwMCBkZGRkIGltbTMyICoqKiBtdWx0bCBycWQsaW1tMzIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJtdWx0bCBycWQsaW1tMzIiLDMyLDI4MiwKKzB4M2MsCisjZW5kaWYKKyJtdWx0bCIsT1BDX211bHRsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMjQxfSwKKworCisvKiAxMDAxIDEwMDAgc3NzcyBkZGRkICoqKiBtdWx0bCBycWQscnJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibXVsdGwgcnFkLHJycyIsMzIsMjgyLAorMHgzYywKKyNlbmRpZgorIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjQyfSwKKworCisvKiAwMDAwIDExMDEgZGROMCAwMDEwICoqKiBuZWcgQHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibmVnIEByZCIsMTYsMTIsCisweDNjLAorI2VuZGlmCisibmVnIixPUENfbmVnLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0M30sCisKKworLyogMDEwMCAxMTAxIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibmVnIGFkZHJlc3NfZHN0IiwxNiwxNSwKKzB4M2MsCisjZW5kaWYKKyJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDR9LAorCisKKy8qIDAxMDAgMTEwMSBkZE4wIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZyBhZGRyZXNzX2RzdChyZCkgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJuZWcgYWRkcmVzc19kc3QocmQpIiwxNiwxNiwKKzB4M2MsCisjZW5kaWYKKyJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ1fSwKKworCisvKiAxMDAwIDExMDEgZGRkZCAwMDEwICoqKiBuZWcgcmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJuZWcgcmQiLDE2LDcsCisweDNjLAorI2VuZGlmCisibmVnIixPUENfbmVnLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDZ9LAorCisKKy8qIDAwMDAgMTEwMCBkZE4wIDAwMTAgKioqIG5lZ2IgQHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibmVnYiBAcmQiLDgsMTIsCisweDNjLAorI2VuZGlmCisibmVnYiIsT1BDX25lZ2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQ3fSwKKworCisvKiAwMTAwIDExMDAgMDAwMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWdiIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibmVnYiBhZGRyZXNzX2RzdCIsOCwxNSwKKzB4M2MsCisjZW5kaWYKKyJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0OH0sCisKKworLyogMDEwMCAxMTAwIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnYiBhZGRyZXNzX2RzdChyZCkgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJuZWdiIGFkZHJlc3NfZHN0KHJkKSIsOCwxNiwKKzB4M2MsCisjZW5kaWYKKyJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDl9LAorCisKKy8qIDEwMDAgMTEwMCBkZGRkIDAwMTAgKioqIG5lZ2IgcmJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisibmVnYiByYmQiLDgsNywKKzB4M2MsCisjZW5kaWYKKyJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjUwfSwKKworCisvKiAxMDAwIDExMDEgMDAwMCAwMTExICoqKiBub3AgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJub3AiLDE2LDcsCisweDAwLAorI2VuZGlmCisibm9wIixPUENfbm9wLDAsezB9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs3LDAsMCwwLDAsMCx9LDAsMiwyNTF9LAorCisKKy8qIDAwMDAgMDEwMSBzc04wIGRkZGQgKioqIG9yIHJkLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm9yIHJkLEBycyIsMTYsNywKKzB4MzgsCisjZW5kaWYKKyJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjUyfSwKKworCisvKiAwMTAwIDAxMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvciByZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm9yIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAorMHgzOCwKKyNlbmRpZgorIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1M30sCisKKworLyogMDEwMCAwMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3IgcmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3IgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKKzB4MzgsCisjZW5kaWYKKyJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU0fSwKKworCisvKiAwMDAwIDAxMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBvciByZCxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm9yIHJkLGltbTE2IiwxNiw3LAorMHgzOCwKKyNlbmRpZgorIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNTV9LAorCisKKy8qIDEwMDAgMDEwMSBzc3NzIGRkZGQgKioqIG9yIHJkLHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3IgcmQscnMiLDE2LDQsCisweDM4LAorI2VuZGlmCisib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTZ9LAorCisKKy8qIDAwMDAgMDEwMCBzc04wIGRkZGQgKioqIG9yYiByYmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3JiIHJiZCxAcnMiLDgsNywKKzB4M2MsCisjZW5kaWYKKyJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTd9LAorCisKKy8qIDAxMDAgMDEwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yYiByYmQsYWRkcmVzc19zcmMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJvcmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCisweDNjLAorI2VuZGlmCisib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTh9LAorCisKKy8qIDAxMDAgMDEwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yYiByYmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCisweDNjLAorI2VuZGlmCisib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjU5fSwKKworCisvKiAwMDAwIDAxMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogb3JiIHJiZCxpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3JiIHJiZCxpbW04Iiw4LDcsCisweDNjLAorI2VuZGlmCisib3JiIixPUENfb3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwyNjB9LAorCisKKy8qIDEwMDAgMDEwMCBzc3NzIGRkZGQgKioqIG9yYiByYmQscmJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3JiIHJiZCxyYnMiLDgsNCwKKzB4M2MsCisjZW5kaWYKKyJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjYxfSwKKworCisvKiAwMDExIDExMTEgZGROMCBzc3NzICoqKiBvdXQgQHJkLHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3V0IEByZCxycyIsMTYsMCwKKzB4MDQsCisjZW5kaWYKKyJvdXQiLE9QQ19vdXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI2Mn0sCisKKworLyogMDAxMSAxMDExIHNzc3MgMDExMCBpbW0xNiAqKiogb3V0IGltbTE2LHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisib3V0IGltbTE2LHJzIiwxNiwwLAorMHgwNCwKKyNlbmRpZgorIm91dCIsT1BDX291dCwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjYzfSwKKworCisvKiAwMDExIDExMTAgZGROMCBzc3NzICoqKiBvdXRiIEByZCxyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJvdXRiIEByZCxyYnMiLDgsMCwKKzB4MDQsCisjZW5kaWYKKyJvdXRiIixPUENfb3V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjY0fSwKKworCisvKiAwMDExIDEwMTAgc3NzcyAwMTEwIGltbTE2ICoqKiBvdXRiIGltbTE2LHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm91dGIgaW1tMTYscmJzIiw4LDAsCisweDA0LAorI2VuZGlmCisib3V0YiIsT1BDX291dGIsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI2NX0sCisKKworLyogMDAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRkIEByZCxAcnMscmEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJvdXRkIEByZCxAcnMscmEiLDE2LDAsCisweDA0LAorI2VuZGlmCisib3V0ZCIsT1BDX291dGQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2Nn0sCisKKworLyogMDAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRkYiBAcmQsQHJzLHJiYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm91dGRiIEByZCxAcnMscmJhIiwxNiwwLAorMHgwNCwKKyNlbmRpZgorIm91dGRiIixPUENfb3V0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2N30sCisKKworLyogMDAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRpIEByZCxAcnMscmEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJvdXRpIEByZCxAcnMscmEiLDE2LDAsCisweDA0LAorI2VuZGlmCisib3V0aSIsT1BDX291dGksMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwyNjh9LAorCisKKy8qIDAwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogb3V0aWIgQHJkLEBycyxyYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm91dGliIEByZCxAcnMscmEiLDE2LDAsCisweDA0LAorI2VuZGlmCisib3V0aWIiLE9QQ19vdXRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2OX0sCisKKworLyogMDAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBvdXRpYnIgQHJkLEBycyxyYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworIm91dGliciBAcmQsQHJzLHJhIiwxNiwwLAorMHgwNCwKKyNlbmRpZgorIm91dGliciIsT1BDX291dGliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDI3MH0sCisKKworLyogMDAwMSAwMTExIHNzTjAgZGROMCAqKiogcG9wIEByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwb3AgQHJkLEBycyIsMTYsMTIsCisweDAwLAorI2VuZGlmCisicG9wIixPUENfcG9wLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzF9LAorCisKKy8qIDAxMDEgMDExMSBzc04wIGRkTjAgYWRkcmVzc19kc3QgKioqIHBvcCBhZGRyZXNzX2RzdChyZCksQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMiLDE2LDE2LAorMHgwMCwKKyNlbmRpZgorInBvcCIsT1BDX3BvcCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjcyfSwKKworCisvKiAwMTAxIDAxMTEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBwb3AgYWRkcmVzc19kc3QsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicG9wIGFkZHJlc3NfZHN0LEBycyIsMTYsMTYsCisweDAwLAorI2VuZGlmCisicG9wIixPUENfcG9wLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3M30sCisKKworLyogMTAwMSAwMTExIHNzTjAgZGRkZCAqKiogcG9wIHJkLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInBvcCByZCxAcnMiLDE2LDgsCisweDAwLAorI2VuZGlmCisicG9wIixPUENfcG9wLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs5LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc0fSwKKworCisvKiAwMDAxIDAxMDEgc3NOMCBkZE4wICoqKiBwb3BsIEByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwb3BsIEByZCxAcnMiLDMyLDE5LAorMHgwMCwKKyNlbmRpZgorInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzV9LAorCisKKy8qIDAxMDEgMDEwMSBzc04wIGRkTjAgYWRkcmVzc19kc3QgKioqIHBvcGwgYWRkcmVzc19kc3QocmQpLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInBvcGwgYWRkcmVzc19kc3QocmQpLEBycyIsMzIsMjMsCisweDAwLAorI2VuZGlmCisicG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI3Nn0sCisKKworLyogMDEwMSAwMTAxIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogcG9wbCBhZGRyZXNzX2RzdCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwb3BsIGFkZHJlc3NfZHN0LEBycyIsMzIsMjMsCisweDAwLAorI2VuZGlmCisicG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjc3fSwKKworCisvKiAxMDAxIDAxMDEgc3NOMCBkZGRkICoqKiBwb3BsIHJyZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwb3BsIHJyZCxAcnMiLDMyLDEyLAorMHgwMCwKKyNlbmRpZgorInBvcGwiLE9QQ19wb3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs5LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjc4fSwKKworCisvKiAwMDAxIDAwMTEgZGROMCBzc04wICoqKiBwdXNoIEByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwdXNoIEByZCxAcnMiLDE2LDEzLAorMHgwMCwKKyNlbmRpZgorInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNzl9LAorCisKKy8qIDAxMDEgMDAxMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMgKioqIHB1c2ggQHJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicHVzaCBAcmQsYWRkcmVzc19zcmMiLDE2LDE0LAorMHgwMCwKKyNlbmRpZgorInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4MH0sCisKKworLyogMDEwMSAwMDExIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyAqKiogcHVzaCBAcmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicHVzaCBAcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxNCwKKzB4MDAsCisjZW5kaWYKKyJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjgxfSwKKworCisvKiAwMDAwIDExMDEgZGROMCAxMDAxIGltbTE2ICoqKiBwdXNoIEByZCxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInB1c2ggQHJkLGltbTE2IiwxNiwxMiwKKzB4MDAsCisjZW5kaWYKKyJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyODJ9LAorCisKKy8qIDEwMDEgMDAxMSBkZE4wIHNzc3MgKioqIHB1c2ggQHJkLHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicHVzaCBAcmQscnMiLDE2LDksCisweDAwLAorI2VuZGlmCisicHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODN9LAorCisKKy8qIDAwMDEgMDAwMSBkZE4wIHNzTjAgKioqIHB1c2hsIEByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwdXNobCBAcmQsQHJzIiwzMiwyMCwKKzB4MDAsCisjZW5kaWYKKyJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFR04wKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODR9LAorCisKKy8qIDAxMDEgMDAwMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMgKioqIHB1c2hsIEByZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInB1c2hsIEByZCxhZGRyZXNzX3NyYyIsMzIsMjEsCisweDAwLAorI2VuZGlmCisicHVzaGwiLE9QQ19wdXNobCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODV9LAorCisKKy8qIDAxMDEgMDAwMSBkZE4wIHNzTjAgYWRkcmVzc19zcmMgKioqIHB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpIiwzMiwyMSwKKzB4MDAsCisjZW5kaWYKKyJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODZ9LAorCisKKy8qIDEwMDEgMDAwMSBkZE4wIHNzc3MgKioqIHB1c2hsIEByZCxycnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJwdXNobCBAcmQscnJzIiwzMiwxMiwKKzB4MDAsCisjZW5kaWYKKyJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs5LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjg3fSwKKworCisvKiAwMDEwIDAwMTEgZGROMCBpbW00ICoqKiByZXMgQHJkLGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyZXMgQHJkLGltbTQiLDE2LDExLAorMHgwMCwKKyNlbmRpZgorInJlcyIsT1BDX3JlcywwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI4OH0sCisKKworLyogMDExMCAwMDExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwxNiwxNCwKKzB4MDAsCisjZW5kaWYKKyJyZXMiLE9QQ19yZXMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyODl9LAorCisKKy8qIDAxMTAgMDAxMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHJlcyBhZGRyZXNzX2RzdCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicmVzIGFkZHJlc3NfZHN0LGltbTQiLDE2LDEzLAorMHgwMCwKKyNlbmRpZgorInJlcyIsT1BDX3JlcywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjkwfSwKKworCisvKiAxMDEwIDAwMTEgZGRkZCBpbW00ICoqKiByZXMgcmQsaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJlcyByZCxpbW00IiwxNiw0LAorMHgwMCwKKyNlbmRpZgorInJlcyIsT1BDX3JlcywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5MX0sCisKKworLyogMDAxMCAwMDExIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiByZXMgcmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyZXMgcmQscnMiLDE2LDEwLAorMHgwMCwKKyNlbmRpZgorInJlcyIsT1BDX3JlcywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjkyfSwKKworCisvKiAwMDEwIDAwMTAgZGROMCBpbW00ICoqKiByZXNiIEByZCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicmVzYiBAcmQsaW1tNCIsOCwxMSwKKzB4MDAsCisjZW5kaWYKKyJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDI5M30sCisKKworLyogMDExMCAwMDEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQiLDgsMTQsCisweDAwLAorI2VuZGlmCisicmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTR9LAorCisKKy8qIDAxMTAgMDAxMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIHJlc2IgYWRkcmVzc19kc3QsaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJlc2IgYWRkcmVzc19kc3QsaW1tNCIsOCwxMywKKzB4MDAsCisjZW5kaWYKKyJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCisJe0NMQVNTX0JJVCs2LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjk1fSwKKworCisvKiAxMDEwIDAwMTAgZGRkZCBpbW00ICoqKiByZXNiIHJiZCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicmVzYiByYmQsaW1tNCIsOCw0LAorMHgwMCwKKyNlbmRpZgorInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjk2fSwKKworCisvKiAwMDEwIDAwMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHJlc2IgcmJkLHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicmVzYiByYmQscnMiLDgsMTAsCisweDAwLAorI2VuZGlmCisicmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDI5N30sCisKKworLyogMTAwMCAxMTAxIGZsYWdzIDAwMTEgKioqIHJlc2ZsZyBmbGFncyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJlc2ZsZyBmbGFncyIsMTYsNywKKzB4M2MsCisjZW5kaWYKKyJyZXNmbGciLE9QQ19yZXNmbGcsMCx7Q0xBU1NfRkxBR1MsfSwKKwl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrMywwLDAsMCwwLDAsfSwxLDIsMjk4fSwKKworCisvKiAxMDAxIDExMTAgMDAwMCBjY2NjICoqKiByZXQgY2MgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyZXQgY2MiLDE2LDEwLAorMHgwMCwKKyNlbmRpZgorInJldCIsT1BDX3JldCwwLHtDTEFTU19DQyx9LAorCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX0NDLDAsMCwwLDAsMCx9LDEsMiwyOTl9LAorCisKKy8qIDEwMTEgMDAxMSBkZGRkIDAwSTAgKioqIHJsIHJkLGltbTFvcjIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJybCByZCxpbW0xb3IyIiwxNiw2LAorMHgzYywKKyNlbmRpZgorInJsIixPUENfcmwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMCwwLDAsMCwwLDAsfSwyLDIsMzAwfSwKKworCisvKiAxMDExIDAwMTAgZGRkZCAwMEkwICoqKiBybGIgcmJkLGltbTFvcjIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJybGIgcmJkLGltbTFvcjIiLDgsNiwKKzB4M2MsCisjZW5kaWYKKyJybGIiLE9QQ19ybGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMCwwLDAsMCwwLDAsfSwyLDIsMzAxfSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAxMEkwICoqKiBybGMgcmQsaW1tMW9yMiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJsYyByZCxpbW0xb3IyIiwxNiw2LAorMHgzYywKKyNlbmRpZgorInJsYyIsT1BDX3JsYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis4LDAsMCwwLDAsMCx9LDIsMiwzMDJ9LAorCisKKy8qIDEwMTEgMDAxMCBkZGRkIDEwSTAgKioqIHJsY2IgcmJkLGltbTFvcjIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJybGNiIHJiZCxpbW0xb3IyIiw4LDksCisweDEwLAorI2VuZGlmCisicmxjYiIsT1BDX3JsY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrOCwwLDAsMCwwLDAsfSwyLDIsMzAzfSwKKworCisvKiAxMDExIDExMTAgYWFhYSBiYmJiICoqKiBybGRiIHJiYixyYmEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJybGRiIHJiYixyYmEiLDgsOSwKKzB4MTAsCisjZW5kaWYKKyJybGRiIixPUENfcmxkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFRysoQVJHX1JCKSwwLDAsMCwwLDAsfSwyLDIsMzA0fSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAwMUkwICoqKiByciByZCxpbW0xb3IyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicnIgcmQsaW1tMW9yMiIsMTYsNiwKKzB4M2MsCisjZW5kaWYKKyJyciIsT1BDX3JyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzQsMCwwLDAsMCwwLH0sMiwyLDMwNX0sCisKKworLyogMTAxMSAwMDEwIGRkZGQgMDFJMCAqKiogcnJiIHJiZCxpbW0xb3IyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicnJiIHJiZCxpbW0xb3IyIiw4LDYsCisweDNjLAorI2VuZGlmCisicnJiIixPUENfcnJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzQsMCwwLDAsMCwwLH0sMiwyLDMwNn0sCisKKworLyogMTAxMSAwMDExIGRkZGQgMTFJMCAqKiogcnJjIHJkLGltbTFvcjIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJycmMgcmQsaW1tMW9yMiIsMTYsNiwKKzB4M2MsCisjZW5kaWYKKyJycmMiLE9QQ19ycmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMHhjLDAsMCwwLDAsMCx9LDIsMiwzMDd9LAorCisKKy8qIDEwMTEgMDAxMCBkZGRkIDExSTAgKioqIHJyY2IgcmJkLGltbTFvcjIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJycmNiIHJiZCxpbW0xb3IyIiw4LDksCisweDEwLAorI2VuZGlmCisicnJjYiIsT1BDX3JyY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrMHhjLDAsMCwwLDAsMCx9LDIsMiwzMDh9LAorCisKKy8qIDEwMTEgMTEwMCBhYWFhIGJiYmIgKioqIHJyZGIgcmJiLHJiYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJyZGIgcmJiLHJiYSIsOCw5LAorMHgxMCwKKyNlbmRpZgorInJyZGIiLE9QQ19ycmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHKyhBUkdfUkIpLDAsMCwwLDAsMCx9LDIsMiwzMDl9LAorCisKKy8qIDAwMTEgMDExMCBpbW04ICoqKiByc3ZkMzYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyc3ZkMzYiLDgsMTAsCisweDAwLAorI2VuZGlmCisicnN2ZDM2IixPUENfcnN2ZDM2LDAsezB9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTB9LAorCisKKy8qIDAwMTEgMTAwMCBpbW04ICoqKiByc3ZkMzggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyc3ZkMzgiLDgsMTAsCisweDAwLAorI2VuZGlmCisicnN2ZDM4IixPUENfcnN2ZDM4LDAsezB9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrOCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTF9LAorCisKKy8qIDAxMTEgMTAwMCBpbW04ICoqKiByc3ZkNzggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyc3ZkNzgiLDgsMTAsCisweDAwLAorI2VuZGlmCisicnN2ZDc4IixPUENfcnN2ZDc4LDAsezB9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrOCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTJ9LAorCisKKy8qIDAxMTEgMTExMCBpbW04ICoqKiByc3ZkN2UgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyc3ZkN2UiLDgsMTAsCisweDAwLAorI2VuZGlmCisicnN2ZDdlIixPUENfcnN2ZDdlLDAsezB9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhlLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxM30sCisKKworLyogMTAwMSAxMTAxIGltbTggKioqIHJzdmQ5ZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJzdmQ5ZCIsOCwxMCwKKzB4MDAsCisjZW5kaWYKKyJyc3ZkOWQiLE9QQ19yc3ZkOWQsMCx7MH0sCisJe0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGQsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE0fSwKKworCisvKiAxMDAxIDExMTEgaW1tOCAqKiogcnN2ZDlmICovCit7CisjaWZkZWYgTklDRU5BTUVTCisicnN2ZDlmIiw4LDEwLAorMHgwMCwKKyNlbmRpZgorInJzdmQ5ZiIsT1BDX3JzdmQ5ZiwwLHswfSwKKwl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTV9LAorCisKKy8qIDEwMTEgMTAwMSBpbW04ICoqKiByc3ZkYjkgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJyc3ZkYjkiLDgsMTAsCisweDAwLAorI2VuZGlmCisicnN2ZGI5IixPUENfcnN2ZGI5LDAsezB9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs5LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNn0sCisKKworLyogMTAxMSAxMTExIGltbTggKioqIHJzdmRiZiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInJzdmRiZiIsOCwxMCwKKzB4MDAsCisjZW5kaWYKKyJyc3ZkYmYiLE9QQ19yc3ZkYmYsMCx7MH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTd9LAorCisKKy8qIDEwMTEgMDExMSBzc3NzIGRkZGQgKioqIHNiYyByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNiYyByZCxycyIsMTYsNSwKKzB4M2MsCisjZW5kaWYKKyJzYmMiLE9QQ19zYmMsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzMTh9LAorCisKKy8qIDEwMTEgMDExMCBzc3NzIGRkZGQgKioqIHNiY2IgcmJkLHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNiY2IgcmJkLHJicyIsOCw1LAorMHgzZiwKKyNlbmRpZgorInNiY2IiLE9QQ19zYmNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzE5fSwKKworCisvKiAwMTExIDExMTEgaW1tOCAqKiogc2MgaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNjIGltbTgiLDgsMzMsCisweDNmLAorI2VuZGlmCisic2MiLE9QQ19zYywwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDMyMH0sCisKKworLyogMTAxMSAwMDExIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGEgcmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzZGEgcmQscnMiLDE2LDE1LAorMHgzYywKKyNlbmRpZgorInNkYSIsT1BDX3NkYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyMX0sCisKKworLyogMTAxMSAwMDEwIGRkZGQgMTAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGFiIHJiZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNkYWIgcmJkLHJzIiw4LDE1LAorMHgzYywKKyNlbmRpZgorInNkYWIiLE9QQ19zZGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIyfSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAxMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYWwgcnJkLHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2RhbCBycmQscnMiLDMyLDE1LAorMHgzYywKKyNlbmRpZgorInNkYWwiLE9QQ19zZGFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIzfSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbCByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNkbCByZCxycyIsMTYsMTUsCisweDM4LAorI2VuZGlmCisic2RsIixPUENfc2RsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNH0sCisKKworLyogMTAxMSAwMDEwIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGxiIHJiZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNkbGIgcmJkLHJzIiw4LDE1LAorMHgzOCwKKyNlbmRpZgorInNkbGIiLE9QQ19zZGxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNX0sCisKKworLyogMTAxMSAwMDExIGRkZGQgMDExMSAwMDAwIHNzc3MgMDAwMCAwMDAwICoqKiBzZGxsIHJyZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNkbGwgcnJkLHJzIiwzMiwxNSwKKzB4MzgsCisjZW5kaWYKKyJzZGxsIixPUENfc2RsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjZ9LAorCisKKy8qIDAwMTAgMDEwMSBkZE4wIGltbTQgKioqIHNldCBAcmQsaW1tNCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNldCBAcmQsaW1tNCIsMTYsMTEsCisweDAwLAorI2VuZGlmCisic2V0IixPUENfc2V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzI3fSwKKworCisvKiAwMTEwIDAxMDEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXQgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzZXQgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDE0LAorMHgwMCwKKyNlbmRpZgorInNldCIsT1BDX3NldCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMyOH0sCisKKworLyogMDExMCAwMTAxIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0IGFkZHJlc3NfZHN0LGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzZXQgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTMsCisweDAwLAorI2VuZGlmCisic2V0IixPUENfc2V0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMjl9LAorCisKKy8qIDEwMTAgMDEwMSBkZGRkIGltbTQgKioqIHNldCByZCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2V0IHJkLGltbTQiLDE2LDQsCisweDAwLAorI2VuZGlmCisic2V0IixPUENfc2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzMwfSwKKworCisvKiAwMDEwIDAxMDEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHNldCByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNldCByZCxycyIsMTYsMTAsCisweDAwLAorI2VuZGlmCisic2V0IixPUENfc2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsyLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMzF9LAorCisKKy8qIDAwMTAgMDEwMCBkZE4wIGltbTQgKioqIHNldGIgQHJkLGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzZXRiIEByZCxpbW00Iiw4LDExLAorMHgwMCwKKyNlbmRpZgorInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzMyfSwKKworCisvKiAwMTEwIDAxMDAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2V0YiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxNCwKKzB4MDAsCisjZW5kaWYKKyJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAorCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzM30sCisKKworLyogMDExMCAwMTAwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogc2V0YiBhZGRyZXNzX2RzdCxpbW00ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2V0YiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEzLAorMHgwMCwKKyNlbmRpZgorInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKKwl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwzMzR9LAorCisKKy8qIDEwMTAgMDEwMCBkZGRkIGltbTQgKioqIHNldGIgcmJkLGltbTQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzZXRiIHJiZCxpbW00Iiw4LDQsCisweDAwLAorI2VuZGlmCisic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCisJe0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzV9LAorCisKKy8qIDAwMTAgMDEwMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogc2V0YiByYmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzZXRiIHJiZCxycyIsOCwxMCwKKzB4MDAsCisjZW5kaWYKKyJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzM2fSwKKworCisvKiAxMDAwIDExMDEgZmxhZ3MgMDAwMSAqKiogc2V0ZmxnIGZsYWdzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2V0ZmxnIGZsYWdzIiwxNiw3LAorMHgzYywKKyNlbmRpZgorInNldGZsZyIsT1BDX3NldGZsZywwLHtDTEFTU19GTEFHUyx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCsxLDAsMCwwLDAsMCx9LDEsMiwzMzd9LAorCisKKy8qIDAwMTEgMTAxMCBkZGRkIDAxMDEgaW1tMTYgKioqIHNpbmIgcmJkLGltbTE2ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2luYiByYmQsaW1tMTYiLDgsMCwKKzB4MDAsCisjZW5kaWYKKyJzaW5iIixPUENfc2luYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzUsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzM4fSwKKworCisvKiAwMDExIDEwMTEgZGRkZCAwMTAxIGltbTE2ICoqKiBzaW5iIHJkLGltbTE2ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2luYiByZCxpbW0xNiIsOCwwLAorMHgwMCwKKyNlbmRpZgorInNpbmIiLE9QQ19zaW5iLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzMzl9LAorCisKKy8qIDAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCAqKiogc2luZCBAcmQsQHJzLHJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2luZCBAcmQsQHJzLHJhIiwxNiwwLAorMHgwMCwKKyNlbmRpZgorInNpbmQiLE9QQ19zaW5kLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQwfSwKKworCisvKiAwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmRiIEByZCxAcnMscmJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2luZGIgQHJkLEBycyxyYmEiLDgsMCwKKzB4MDAsCisjZW5kaWYKKyJzaW5kYiIsT1BDX3NpbmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQxfSwKKworCisvKiAwMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNpbmliIEByZCxAcnMscmEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzaW5pYiBAcmQsQHJzLHJhIiw4LDAsCisweDAwLAorI2VuZGlmCisic2luaWIiLE9QQ19zaW5pYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM0Mn0sCisKKworLyogMDAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBzaW5pYnIgQHJkLEBycyxyYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNpbmliciBAcmQsQHJzLHJhIiwxNiwwLAorMHgwMCwKKyNlbmRpZgorInNpbmliciIsT1BDX3NpbmliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM0M30sCisKKworLyogMTAxMSAwMDExIGRkZGQgMTAwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xhIHJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzbGEgcmQsaW1tOCIsMTYsMTMsCisweDNjLAorI2VuZGlmCisic2xhIixPUENfc2xhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDR9LAorCisKKy8qIDEwMTEgMDAxMCBkZGRkIDEwMDEgIDAwMDAgMDAwMCBpbW04ICoqKiBzbGFiIHJiZCxpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2xhYiByYmQsaW1tOCIsOCwxMywKKzB4M2MsCisjZW5kaWYKKyJzbGFiIixPUENfc2xhYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ1fSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAxMTAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGFsIHJyZCxpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic2xhbCBycmQsaW1tOCIsMzIsMTMsCisweDNjLAorI2VuZGlmCisic2xhbCIsT1BDX3NsYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ2fSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAwMDAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGwgcmQsaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNsbCByZCxpbW04IiwxNiwxMywKKzB4MzgsCisjZW5kaWYKKyJzbGwiLE9QQ19zbGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0N30sCisKKworLyogMTAxMSAwMDEwIGRkZGQgMDAwMSAgMDAwMCAwMDAwIGltbTggKioqIHNsbGIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzbGxiIHJiZCxpbW04Iiw4LDEzLAorMHgzOCwKKyNlbmRpZgorInNsbGIiLE9QQ19zbGxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDh9LAorCisKKy8qIDEwMTEgMDAxMSBkZGRkIDAxMDEgMDAwMCAwMDAwIGltbTggKioqIHNsbGwgcnJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzbGxsIHJyZCxpbW04IiwzMiwxMywKKzB4MzgsCisjZW5kaWYKKyJzbGxsIixPUENfc2xsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ5fSwKKworCisvKiAwMDExIDEwMTEgc3NzcyAwMTExIGltbTE2ICoqKiBzb3V0IGltbTE2LHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic291dCBpbW0xNixycyIsMTYsMCwKKzB4MDAsCisjZW5kaWYKKyJzb3V0IixPUENfc291dCwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzcsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMzUwfSwKKworCisvKiAwMDExIDEwMTAgc3NzcyAwMTExIGltbTE2ICoqKiBzb3V0YiBpbW0xNixyYnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzb3V0YiBpbW0xNixyYnMiLDgsMCwKKzB4MDAsCisjZW5kaWYKKyJzb3V0YiIsT1BDX3NvdXRiLDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNyxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNTF9LAorCisKKy8qIDAwMTEgMTAxMSBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGQgQHJkLEBycyxyYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNvdXRkIEByZCxAcnMscmEiLDE2LDAsCisweDAwLAorI2VuZGlmCisic291dGQiLE9QQ19zb3V0ZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzUyfSwKKworCisvKiAwMDExIDEwMTAgc3NOMCAxMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRkYiBAcmQsQHJzLHJiYSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNvdXRkYiBAcmQsQHJzLHJiYSIsOCwwLAorMHgwMCwKKyNlbmRpZgorInNvdXRkYiIsT1BDX3NvdXRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzUzfSwKKworCisvKiAwMDExIDEwMTAgc3NOMCAwMDExIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIHNvdXRpYiBAcmQsQHJzLHJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic291dGliIEByZCxAcnMscmEiLDgsMCwKKzB4MDAsCisjZW5kaWYKKyJzb3V0aWIiLE9QQ19zb3V0aWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKKwl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTR9LAorCisKKy8qIDAwMTEgMTAxMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMDAwMCAqKiogc291dGliciBAcmQsQHJzLHJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic291dGliciBAcmQsQHJzLHJhIiwxNiwwLAorMHgwMCwKKyNlbmRpZgorInNvdXRpYnIiLE9QQ19zb3V0aWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCisJe0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMzU1fSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04ICoqKiBzcmEgcmQsaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNyYSByZCxpbW04IiwxNiwxMywKKzB4M2MsCisjZW5kaWYKKyJzcmEiLE9QQ19zcmEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTZ9LAorCisKKy8qIDEwMTEgMDAxMCBkZGRkIDEwMDEgMDAwMCAwMDAwIG5pbTggKioqIHNyYWIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzcmFiIHJiZCxpbW04Iiw4LDEzLAorMHgzYywKKyNlbmRpZgorInNyYWIiLE9QQ19zcmFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTd9LAorCisKKy8qIDEwMTEgMDAxMSBkZGRkIDExMDEgMTExMSAxMTExIG5pbTggKioqIHNyYWwgcnJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzcmFsIHJyZCxpbW04IiwzMiwxMywKKzB4M2MsCisjZW5kaWYKKyJzcmFsIixPUENfc3JhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzU4fSwKKworCisvKiAxMDExIDAwMTEgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04ICoqKiBzcmwgcmQsaW1tOCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInNybCByZCxpbW04IiwxNiwxMywKKzB4M2MsCisjZW5kaWYKKyJzcmwiLE9QQ19zcmwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTl9LAorCisKKy8qIDEwMTEgMDAxMCBkZGRkIDAwMDEgMDAwMCAwMDAwIG5pbTggKioqIHNybGIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzcmxiIHJiZCxpbW04Iiw4LDEzLAorMHgzYywKKyNlbmRpZgorInNybGIiLE9QQ19zcmxiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNjB9LAorCisKKy8qIDEwMTEgMDAxMSBkZGRkIDAxMDEgMTExMSAxMTExIG5pbTggKioqIHNybGwgcnJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzcmxsIHJyZCxpbW04IiwzMiwxMywKKzB4M2MsCisjZW5kaWYKKyJzcmxsIixPUENfc3JsbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM2MX0sCisKKworLyogMDAwMCAwMDExIHNzTjAgZGRkZCAqKiogc3ViIHJkLEBycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInN1YiByZCxAcnMiLDE2LDcsCisweDNjLAorI2VuZGlmCisic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzYyfSwKKworCisvKiAwMTAwIDAwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWIgcmQsYWRkcmVzc19zcmMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWIgcmQsYWRkcmVzc19zcmMiLDE2LDksCisweDNjLAorI2VuZGlmCisic3ViIixPUENfc3ViLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjN9LAorCisKKy8qIDAxMDAgMDAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YiByZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWIgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKKzB4M2MsCisjZW5kaWYKKyJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjR9LAorCisKKy8qIDAwMDAgMDAxMSAwMDAwIGRkZGQgaW1tMTYgKioqIHN1YiByZCxpbW0xNiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInN1YiByZCxpbW0xNiIsMTYsNywKKzB4M2MsCisjZW5kaWYKKyJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNjV9LAorCisKKy8qIDEwMDAgMDAxMSBzc3NzIGRkZGQgKioqIHN1YiByZCxycyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInN1YiByZCxycyIsMTYsNCwKKzB4M2MsCisjZW5kaWYKKyJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzY2fSwKKworCisvKiAwMDAwIDAwMTAgc3NOMCBkZGRkICoqKiBzdWJiIHJiZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWJiIHJiZCxAcnMiLDgsNywKKzB4M2YsCisjZW5kaWYKKyJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM2N30sCisKKworLyogMDEwMCAwMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViYiByYmQsYWRkcmVzc19zcmMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWJiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAorMHgzZiwKKyNlbmRpZgorInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNjh9LAorCisKKy8qIDAxMDAgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKKzB4M2YsCisjZW5kaWYKKyJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2OX0sCisKKworLyogMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIHN1YmIgcmJkLGltbTggKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWJiIHJiZCxpbW04Iiw4LDcsCisweDNmLAorI2VuZGlmCisic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDM3MH0sCisKKworLyogMTAwMCAwMDEwIHNzc3MgZGRkZCAqKiogc3ViYiByYmQscmJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic3ViYiByYmQscmJzIiw4LDQsCisweDNmLAorI2VuZGlmCisic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzcxfSwKKworCisvKiAwMDAxIDAwMTAgc3NOMCBkZGRkICoqKiBzdWJsIHJyZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWJsIHJyZCxAcnMiLDMyLDE0LAorMHgzYywKKyNlbmRpZgorInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCsxLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzcyfSwKKworCisvKiAwMTAxIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJsIHJyZCxhZGRyZXNzX3NyYyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInN1YmwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKKzB4M2MsCisjZW5kaWYKKyJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzczfSwKKworCisvKiAwMTAxIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJzdWJsIHJyZCxhZGRyZXNzX3NyYyhycykiLDMyLDE2LAorMHgzYywKKyNlbmRpZgorInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzc0fSwKKworCisvKiAwMDAxIDAwMTAgMDAwMCBkZGRkIGltbTMyICoqKiBzdWJsIHJyZCxpbW0zMiAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInN1YmwgcnJkLGltbTMyIiwzMiwxNCwKKzB4M2MsCisjZW5kaWYKKyJzdWJsIixPUENfc3VibCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKKwl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDM3NX0sCisKKworLyogMTAwMSAwMDEwIHNzc3MgZGRkZCAqKiogc3VibCBycmQscnJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisic3VibCBycmQscnJzIiwzMiw4LAorMHgzYywKKyNlbmRpZgorInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs5LENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDM3Nn0sCisKKworLyogMTAxMCAxMTExIGRkZGQgY2NjYyAqKiogdGNjIGNjLHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGNjIGNjLHJkIiwxNiw1LAorMHgwMCwKKyNlbmRpZgorInRjYyIsT1BDX3RjYywwLHtDTEFTU19DQyxDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwzNzd9LAorCisKKy8qIDEwMTAgMTExMCBkZGRkIGNjY2MgKioqIHRjY2IgY2MscmJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGNjYiBjYyxyYmQiLDgsNSwKKzB4MDAsCisjZW5kaWYKKyJ0Y2NiIixPUENfdGNjYiwwLHtDTEFTU19DQyxDTEFTU19SRUdfQllURSsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwzNzh9LAorCisKKy8qIDAwMDAgMTEwMSBkZE4wIDAxMDAgKioqIHRlc3QgQHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdCBAcmQiLDE2LDgsCisweDE4LAorI2VuZGlmCisidGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzc5fSwKKworCisvKiAwMTAwIDExMDEgMDAwMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0IGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdCBhZGRyZXNzX2RzdCIsMTYsMTEsCisweDAwLAorI2VuZGlmCisidGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODB9LAorCisKKy8qIDAxMDAgMTEwMSBkZE4wIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3QgYWRkcmVzc19kc3QocmQpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdCBhZGRyZXNzX2RzdChyZCkiLDE2LDEyLAorMHgwMCwKKyNlbmRpZgorInRlc3QiLE9QQ190ZXN0LDAse0NMQVNTX1grKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4MX0sCisKKworLyogMTAwMCAxMTAxIGRkZGQgMDEwMCAqKiogdGVzdCByZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRlc3QgcmQiLDE2LDcsCisweDAwLAorI2VuZGlmCisidGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKKwl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4Mn0sCisKKworLyogMDAwMCAxMTAwIGRkTjAgMDEwMCAqKiogdGVzdGIgQHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdGIgQHJkIiw4LDgsCisweDFjLAorI2VuZGlmCisidGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODN9LAorCisKKy8qIDAxMDAgMTEwMCAwMDAwIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3RiIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdGIgYWRkcmVzc19kc3QiLDgsMTEsCisweDFjLAorI2VuZGlmCisidGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4NH0sCisKKworLyogMDEwMCAxMTAwIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGIgYWRkcmVzc19kc3QocmQpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdGIgYWRkcmVzc19kc3QocmQpIiw4LDEyLAorMHgxYywKKyNlbmRpZgorInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg1fSwKKworCisvKiAxMDAwIDExMDAgZGRkZCAwMTAwICoqKiB0ZXN0YiByYmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0ZXN0YiByYmQiLDgsNywKKzB4MWMsCisjZW5kaWYKKyJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzODZ9LAorCisKKy8qIDAwMDEgMTEwMCBkZE4wIDEwMDAgKioqIHRlc3RsIEByZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRlc3RsIEByZCIsMzIsMTMsCisweDE4LAorI2VuZGlmCisidGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiwzODd9LAorCisKKy8qIDAxMDEgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QgKioqIHRlc3RsIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidGVzdGwgYWRkcmVzc19kc3QiLDMyLDE2LAorMHgxOCwKKyNlbmRpZgorInRlc3RsIixPUENfdGVzdGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODh9LAorCisKKy8qIDAxMDEgMTEwMCBkZE4wIDEwMDAgYWRkcmVzc19kc3QgKioqIHRlc3RsIGFkZHJlc3NfZHN0KHJkKSAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRlc3RsIGFkZHJlc3NfZHN0KHJkKSIsMzIsMTcsCisweDE4LAorI2VuZGlmCisidGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODl9LAorCisKKy8qIDEwMDEgMTEwMCBkZGRkIDEwMDAgKioqIHRlc3RsIHJyZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRlc3RsIHJyZCIsMzIsMTMsCisweDE4LAorI2VuZGlmCisidGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOCwwLDAsMCwwLDAsfSwxLDIsMzkwfSwKKworCisvKiAxMDExIDEwMDAgZGROMCAxMDAwIDAwMDAgYWFhYSBzc04wIDAwMDAgKioqIHRyZGIgQHJkLEBycyxyYmEgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0cmRiIEByZCxAcnMscmJhIiw4LDI1LAorMHgxYywKKyNlbmRpZgorInRyZGIiLE9QQ190cmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkxfSwKKworCisvKiAxMDExIDEwMDAgZGROMCAxMTAwIDAwMDAgYWFhYSBzc04wIDAwMDAgKioqIHRyZHJiIEByZCxAcnMscmJhICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidHJkcmIgQHJkLEBycyxyYmEiLDgsMjUsCisweDFjLAorI2VuZGlmCisidHJkcmIiLE9QQ190cmRyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkyfSwKKworCisvKiAxMDExIDEwMDAgZGROMCAwMDAwIDAwMDAgcnJyciBzc04wIDAwMDAgKioqIHRyaWIgQHJkLEBycyxyYnIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0cmliIEByZCxAcnMscmJyIiw4LDI1LAorMHgxYywKKyNlbmRpZgorInRyaWIiLE9QQ190cmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzkzfSwKKworCisvKiAxMDExIDEwMDAgZGROMCAwMTAwIDAwMDAgcnJyciBzc04wIDAwMDAgKioqIHRyaXJiIEByZCxAcnMscmJyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidHJpcmIgQHJkLEBycyxyYnIiLDgsMjUsCisweDFjLAorI2VuZGlmCisidHJpcmIiLE9QQ190cmlyYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5NH0sCisKKworLyogMTAxMSAxMDAwIGFhTjAgMTAxMCAwMDAwIHJycnIgYmJOMCAwMDAwICoqKiB0cnRkYiBAcmEsQHJiLHJiciAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRydGRiIEByYSxAcmIscmJyIiw4LDI1LAorMHgxYywKKyNlbmRpZgorInRydGRiIixPUENfdHJ0ZGIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5NX0sCisKKworLyogMTAxMSAxMDAwIGFhTjAgMTExMCAwMDAwIHJycnIgYmJOMCAxMTEwICoqKiB0cnRkcmIgQHJhLEByYixyYnIgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0cnRkcmIgQHJhLEByYixyYnIiLDgsMjUsCisweDFjLAorI2VuZGlmCisidHJ0ZHJiIixPUENfdHJ0ZHJiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCisJe0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzB4ZSwwLH0sMyw0LDM5Nn0sCisKKworLyogMTAxMSAxMDAwIGFhTjAgMDAxMCAwMDAwIHJycnIgYmJOMCAwMDAwICoqKiB0cnRpYiBAcmEsQHJiLHJiciAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRydGliIEByYSxAcmIscmJyIiw4LDI1LAorMHgxYywKKyNlbmRpZgorInRydGliIixPUENfdHJ0aWIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKKwl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SQiksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTd9LAorCisKKy8qIDEwMTEgMTAwMCBhYU4wIDAxMTAgMDAwMCBycnJyIGJiTjAgMTExMCAqKiogdHJ0aXJiIEByYSxAcmIscmJyICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidHJ0aXJiIEByYSxAcmIscmJyIiw4LDI1LAorMHgxYywKKyNlbmRpZgorInRydGlyYiIsT1BDX3RydGlyYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAorCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMHhlLDAsfSwzLDQsMzk4fSwKKworCisvKiAwMDAwIDExMDEgZGROMCAwMTEwICoqKiB0c2V0IEByZCAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInRzZXQgQHJkIiwxNiwxMSwKKzB4MDgsCisjZW5kaWYKKyJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiwzOTl9LAorCisKKy8qIDAxMDAgMTEwMSAwMDAwIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXQgYWRkcmVzc19kc3QgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0c2V0IGFkZHJlc3NfZHN0IiwxNiwxNCwKKzB4MDgsCisjZW5kaWYKKyJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwMH0sCisKKworLyogMDEwMCAxMTAxIGRkTjAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldCBhZGRyZXNzX2RzdChyZCkgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0c2V0IGFkZHJlc3NfZHN0KHJkKSIsMTYsMTUsCisweDA4LAorI2VuZGlmCisidHNldCIsT1BDX3RzZXQsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDAxfSwKKworCisvKiAxMDAwIDExMDEgZGRkZCAwMTEwICoqKiB0c2V0IHJkICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidHNldCByZCIsMTYsNywKKzB4MDgsCisjZW5kaWYKKyJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNiwwLDAsMCwwLDAsfSwxLDIsNDAyfSwKKworCisvKiAwMDAwIDExMDAgZGROMCAwMTEwICoqKiB0c2V0YiBAcmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0c2V0YiBAcmQiLDgsMTEsCisweDA4LAorI2VuZGlmCisidHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDN9LAorCisKKy8qIDAxMDAgMTEwMCAwMDAwIDAxMTAgYWRkcmVzc19kc3QgKioqIHRzZXRiIGFkZHJlc3NfZHN0ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidHNldGIgYWRkcmVzc19kc3QiLDgsMTQsCisweDA4LAorI2VuZGlmCisidHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQwNH0sCisKKworLyogMDEwMCAxMTAwIGRkTjAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldGIgYWRkcmVzc19kc3QocmQpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisidHNldGIgYWRkcmVzc19kc3QocmQpIiw4LDE1LAorMHgwOCwKKyNlbmRpZgorInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDA1fSwKKworCisvKiAxMDAwIDExMDAgZGRkZCAwMTEwICoqKiB0c2V0YiByYmQgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ0c2V0YiByYmQiLDgsNywKKzB4MDgsCisjZW5kaWYKKyJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDZ9LAorCisKKy8qIDAwMDAgMTAwMSBzc04wIGRkZGQgKioqIHhvciByZCxAcnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ4b3IgcmQsQHJzIiwxNiw3LAorMHgxOCwKKyNlbmRpZgorInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQwN30sCisKKworLyogMDEwMCAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yIHJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisieG9yIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAorMHgxOCwKKyNlbmRpZgorInhvciIsT1BDX3hvciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDA4fSwKKworCisvKiAwMTAwIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3IgcmQsYWRkcmVzc19zcmMocnMpICovCit7CisjaWZkZWYgTklDRU5BTUVTCisieG9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTAsCisweDE4LAorI2VuZGlmCisieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDA5fSwKKworCisvKiAwMDAwIDEwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiB4b3IgcmQsaW1tMTYgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ4b3IgcmQsaW1tMTYiLDE2LDcsCisweDE4LAorI2VuZGlmCisieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAorCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsNDEwfSwKKworCisvKiAxMDAwIDEwMDEgc3NzcyBkZGRkICoqKiB4b3IgcmQscnMgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ4b3IgcmQscnMiLDE2LDQsCisweDE4LAorI2VuZGlmCisieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCs5LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxMX0sCisKKworLyogMDAwMCAxMDAwIHNzTjAgZGRkZCAqKiogeG9yYiByYmQsQHJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisieG9yYiByYmQsQHJzIiw4LDcsCisweDFjLAorI2VuZGlmCisieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTJ9LAorCisKKy8qIDAxMDAgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvcmIgcmJkLGFkZHJlc3Nfc3JjICovCit7CisjaWZkZWYgTklDRU5BTUVTCisieG9yYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKKzB4MWMsCisjZW5kaWYKKyJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKKwl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNDEzfSwKKworCisvKiAwMTAwIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KK3sKKyNpZmRlZiBOSUNFTkFNRVMKKyJ4b3JiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCisweDFjLAorI2VuZGlmCisieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAorCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MTR9LAorCisKKy8qIDAwMDAgMTAwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiB4b3JiIHJiZCxpbW04ICovCit7CisjaWZkZWYgTklDRU5BTUVTCisieG9yYiByYmQsaW1tOCIsOCw3LAorMHgxYywKKyNlbmRpZgorInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCisJe0NMQVNTX0JJVCswLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw0MTV9LAorCisKKy8qIDEwMDAgMTAwMCBzc3NzIGRkZGQgKioqIHhvcmIgcmJkLHJicyAqLworeworI2lmZGVmIE5JQ0VOQU1FUworInhvcmIgcmJkLHJicyIsOCw0LAorMHgxYywKKyNlbmRpZgorInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCisJe0NMQVNTX0JJVCs4LENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxNn0sCisKKworLyogMTAwMCAxMDAwIHNzc3MgZGRkZCAqKiogeG9yYiByYmQscmJzICovCit7CisjaWZkZWYgTklDRU5BTUVTCisieG9yYiByYmQscmJzIiw4LDQsCisweDAxLAorI2VuZGlmCisieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKKwl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDE3fSwKKzAsMH07CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvejhrZ2VuLmMgYi9vcGNvZGVzL3o4a2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODZiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGNvZGVzL3o4a2dlbi5jCkBAIC0wLDAgKzEsMTMxMyBAQAorLyoKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIHo4ay1vcGMuaCAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJzeXNkZXAuaCIKKworI2RlZmluZSBCWVRFX0lORk9fTEVOIDEwCisKK3N0cnVjdCBvcAoreworICBjaGFyICpmbGFnczsKKyAgaW50IGN5Y2xlczsKKyAgY2hhciB0eXBlOworICBjaGFyICpiaXRzOworICBjaGFyICpuYW1lOworICBjaGFyICpmbGF2b3I7Cit9OworCisjZGVmaW5lIGlzd2hpdGUoeCkgKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcpCitzdHJ1Y3Qgb3Agb3B0W10gPQoreworICAiLS0tLS0tIiwgMTAsIDgsICIwMDAwIDExMTAgaW1tOCIsICJleHQwZSBpbW04IiwgMCwKKyAgIi0tLS0tLSIsIDEwLCA4LCAiMDAwMCAxMTExIGltbTgiLCAiZXh0MGYgaW1tOCIsIDAsCisgICItLS0tLS0iLCAxMCwgOCwgIjEwMDAgMTExMCBpbW04IiwgImV4dDhlIGltbTgiLCAwLAorICAiLS0tLS0tIiwgMTAsIDgsICIxMDAwIDExMTEgaW1tOCIsICJleHQ4ZiBpbW04IiwgMCwKKworICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDAxMTAgaW1tOCIsICJyc3ZkMzYiLCAwLAorICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDEwMDAgaW1tOCIsICJyc3ZkMzgiLCAwLAorICAiLS0tLS0tIiwgMTAsIDgsICIwMTExIDEwMDAgaW1tOCIsICJyc3ZkNzgiLCAwLAorICAiLS0tLS0tIiwgMTAsIDgsICIwMTExIDExMTAgaW1tOCIsICJyc3ZkN2UiLCAwLAorCisgICItLS0tLS0iLCAxMCwgOCwgIjEwMDEgMTEwMSBpbW04IiwgInJzdmQ5ZCIsIDAsCisgICItLS0tLS0iLCAxMCwgOCwgIjEwMDEgMTExMSBpbW04IiwgInJzdmQ5ZiIsIDAsCisKKyAgIi0tLS0tLSIsIDEwLCA4LCAiMTAxMSAxMDAxIGltbTgiLCAicnN2ZGI5IiwgMCwKKyAgIi0tLS0tLSIsIDEwLCA4LCAiMTAxMSAxMTExIGltbTgiLCAicnN2ZGJmIiwgMCwKKworICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkZCBAcnMsQHJkLHJyIiwgMCwKKyAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGRyIEBycyxAcmQscnIiLCAwLAorICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRkcmIgQHJzLEByZCxyciIsIDAsCisgICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRpciBAcmQsQHJzLHJyIiwgMCwKKyAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGkgcmQsQHJzLHJyLGNjIiwgMCwKKyAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGlyIHJkLEBycyxycixjYyIsIDAsCisgICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkciByZCxAcnMscnIsY2MiLCAwLAorICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkaSBAcmQsQHJzLHJyIiwgMCwKKyAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGQgcmQsQHJzLHJyLGNjIiwgMCwKKyAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkaXJiIEByZCxAcnMscnIiLCAwLAorICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRkYiBAcnMsQHJkLHJyIiwgMCwKKyAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkaWIgQHJkLEBycyxyciIsIDAsCisgICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRiIHJiZCxAcnMscnIsY2MiLCAwLAorICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkcmIgcmJkLEBycyxycixjYyIsIDAsCisgICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGliIHJiZCxAcnMscnIsY2MiLCAwLAorICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BpcmIgcmJkLEBycyxycixjYyIsIDAsCisgICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZCBAcmQsQHJzLHJyLGNjIiwgMCwKKyAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RiIEByZCxAcnMscnIsY2MiLCAwLAorICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RyIEByZCxAcnMscnIsY2MiLCAwLAorICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZHJiIEByZCxAcnMscnIsY2MiLCAwLAorICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2kgQHJkLEBycyxycixjYyIsIDAsCisgICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpYiBAcmQsQHJzLHJyLGNjIiwgMCwKKyAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpciBAcmQsQHJzLHJyLGNjIiwgMCwKKyAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2lyYiBAcmQsQHJzLHJyLGNjIiwgMCwKKworICAiLS0tLS0tIiwgMiwgOCwgIjAwMTEgMDExMCAwMDAwIDAwMDAiLCAiYnB0IiwgMCwKKyAgIkNaU1YtLSIsIDUsIDE2LCAiMTAxMSAwMTAxIHNzc3MgZGRkZCIsICJhZGMgcmQscnMiLCAwLAorICAiQ1pTVkRIIiwgNSwgOCwgIjEwMTEgMDEwMCBzc3NzIGRkZGQiLCAiYWRjYiByYmQscmJzIiwgMCwKKyAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDAxIHNzTjAgZGRkZCIsICJhZGQgcmQsQHJzIiwgMCwKKyJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkIHJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIkNaU1YtLSIsIDEwLCAxNiwgIjAxMDAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAwMSAwMDAwIGRkZGQgaW1tMTYiLCAiYWRkIHJkLGltbTE2IiwgMCwKKyAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAwMDAxIHNzc3MgZGRkZCIsICJhZGQgcmQscnMiLCAwLAorICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAwMCBzc04wIGRkZGQiLCAiYWRkYiByYmQsQHJzIiwgMCwKKyJDWlNWREgiLCA5LCA4LCAiMDEwMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCisgICJDWlNWREgiLCAxMCwgOCwgIjAxMDAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJhZGRiIHJiZCxpbW04IiwgMCwKKyAgIkNaU1ZESCIsIDQsIDgsICIxMDAwIDAwMDAgc3NzcyBkZGRkIiwgImFkZGIgcmJkLHJicyIsIDAsCisgICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAxMTAgc3NOMCBkZGRkIiwgImFkZGwgcnJkLEBycyIsIDAsCisgICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDExMCAwMDAwIGRkZGQgaW1tMzIiLCAiYWRkbCBycmQsaW1tMzIiLCAwLAorICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAxMTAgc3NzcyBkZGRkIiwgImFkZGwgcnJkLHJycyIsIDAsCisKKyAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTExIHNzTjAgZGRkZCIsICJhbmQgcmQsQHJzIiwgMCwKKyItWlMtLS0iLCA5LCAxNiwgIjAxMDAgMDExMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kIHJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIi1aUy0tLSIsIDEwLCAxNiwgIjAxMDAgMDExMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDExMSAwMDAwIGRkZGQgaW1tMTYiLCAiYW5kIHJkLGltbTE2IiwgMCwKKyAgIi1aUy0tLSIsIDQsIDE2LCAiMTAwMCAwMTExIHNzc3MgZGRkZCIsICJhbmQgcmQscnMiLCAwLAorICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMDExMCBzc04wIGRkZGQiLCAiYW5kYiByYmQsQHJzIiwgMCwKKyItWlNQLS0iLCA5LCA4LCAiMDEwMCAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCisgICItWlNQLS0iLCAxMCwgOCwgIjAxMDAgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDAxMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJhbmRiIHJiZCxpbW04IiwgMCwKKyAgIi1aU1AtLSIsIDQsIDgsICIxMDAwIDAxMTAgc3NzcyBkZGRkIiwgImFuZGIgcmJkLHJicyIsIDAsCisKKyAgIi1aLS0tLSIsIDgsIDE2LCAiMDAxMCAwMTExIGRkTjAgaW1tNCIsICJiaXQgQHJkLGltbTQiLCAwLAorICAiLVotLS0tIiwgMTEsIDE2LCAiMDExMCAwMTExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXQgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAorICAiLVotLS0tIiwgMTAsIDE2LCAiMDExMCAwMTExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXQgYWRkcmVzc19kc3QsaW1tNCIsIDAsCisgICItWi0tLS0iLCA0LCAxNiwgIjEwMTAgMDExMSBkZGRkIGltbTQiLCAiYml0IHJkLGltbTQiLCAwLAorIi1aLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDExMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJiaXQgcmQscnMiLCAwLAorCisgICItWi0tLS0iLCA4LCA4LCAiMDAxMCAwMTEwIGRkTjAgaW1tNCIsICJiaXRiIEByZCxpbW00IiwgMCwKKyAgIi1aLS0tLSIsIDExLCA4LCAiMDExMCAwMTEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKKyAgIi1aLS0tLSIsIDEwLCA4LCAiMDExMCAwMTEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXRiIGFkZHJlc3NfZHN0LGltbTQiLCAwLAorICAiLVotLS0tIiwgNCwgOCwgIjEwMTAgMDExMCBkZGRkIGltbTQiLCAiYml0YiByYmQsaW1tNCIsIDAsCisiLVotLS0tIiwgMTAsIDgsICIwMDEwIDAxMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAiYml0YiByYmQscnMiLCAwLAorCisgICItLS0tLS0iLCAxMCwgMzIsICIwMDAxIDExMTEgZGROMCAwMDAwIiwgImNhbGwgQHJkIiwgMCwKKyAgIi0tLS0tLSIsIDEyLCAzMiwgIjAxMDEgMTExMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY2FsbCBhZGRyZXNzX2RzdCIsIDAsCisgICItLS0tLS0iLCAxMywgMzIsICIwMTAxIDExMTEgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNhbGwgYWRkcmVzc19kc3QocmQpIiwgMCwKKyAgIi0tLS0tLSIsIDEwLCAxNiwgIjExMDEgZGlzcDEyIiwgImNhbHIgZGlzcDEyIiwgMCwKKworICAiLS0tLS0tIiwgOCwgMTYsICIwMDAwIDExMDEgZGROMCAxMDAwIiwgImNsciBAcmQiLCAwLAorICAiLS0tLS0tIiwgMTEsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHIgYWRkcmVzc19kc3QiLCAwLAorICAiLS0tLS0tIiwgMTIsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHIgYWRkcmVzc19kc3QocmQpIiwgMCwKKyAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMTAwMCIsICJjbHIgcmQiLCAwLAorICAiLS0tLS0tIiwgOCwgOCwgIjAwMDAgMTEwMCBkZE4wIDEwMDAiLCAiY2xyYiBAcmQiLCAwLAorICAiLS0tLS0tIiwgMTEsIDgsICIwMTAwIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNscmIgYWRkcmVzc19kc3QiLCAwLAorICAiLS0tLS0tIiwgMTIsIDgsICIwMTAwIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNscmIgYWRkcmVzc19kc3QocmQpIiwgMCwKKyAgIi0tLS0tLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAxMDAwIiwgImNscmIgcmJkIiwgMCwKKyAgIi1aUy0tLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMDAiLCAiY29tIEByZCIsIDAsCisgICItWlMtLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbSBhZGRyZXNzX2RzdCIsIDAsCisgICItWlMtLS0iLCAxNiwgMTYsICIwMTAwIDExMDEgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbSBhZGRyZXNzX2RzdChyZCkiLCAwLAorICAiLVpTLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMDAwIiwgImNvbSByZCIsIDAsCisgICItWlNQLS0iLCAxMiwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMDAiLCAiY29tYiBAcmQiLCAwLAorICAiLVpTUC0tIiwgMTUsIDgsICIwMTAwIDExMDAgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbWIgYWRkcmVzc19kc3QiLCAwLAorICAiLVpTUC0tIiwgMTYsIDgsICIwMTAwIDExMDAgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbWIgYWRkcmVzc19kc3QocmQpIiwgMCwKKyAgIi1aU1AtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMDAwIiwgImNvbWIgcmJkIiwgMCwKKyAgIkNaU1AtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDEwMSIsICJjb21mbGcgZmxhZ3MiLCAwLAorCisgICJDWlNWLS0iLCAxMSwgMTYsICIwMDAwIDExMDEgZGROMCAwMDAxIGltbTE2IiwgImNwIEByZCxpbW0xNiIsIDAsCisgICJDWlNWLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsIDAsCisgICJDWlNWLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImNwIGFkZHJlc3NfZHN0LGltbTE2IiwgMCwKKworICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDEwMTEgc3NOMCBkZGRkIiwgImNwIHJkLEBycyIsIDAsCisgICJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3AgcmQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAorICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDEwMTEgMDAwMCBkZGRkIGltbTE2IiwgImNwIHJkLGltbTE2IiwgMCwKKyAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAxMDExIHNzc3MgZGRkZCIsICJjcCByZCxycyIsIDAsCisKKyAgIkNaU1YtLSIsIDExLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAwMSBpbW04IGltbTgiLCAiY3BiIEByZCxpbW04IiwgMCwKKyAgIkNaU1YtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAiY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04IiwgMCwKKyAgIkNaU1YtLSIsIDE0LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAiY3BiIGFkZHJlc3NfZHN0LGltbTgiLCAwLAorICAiQ1pTVi0tIiwgNywgOCwgIjAwMDAgMTAxMCBzc04wIGRkZGQiLCAiY3BiIHJiZCxAcnMiLCAwLAorIkNaU1YtLSIsIDksIDgsICIwMTAwIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwYiByYmQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVi0tIiwgMTAsIDgsICIwMTAwIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1YtLSIsIDcsIDgsICIwMDAwIDEwMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJjcGIgcmJkLGltbTgiLCAwLAorICAiQ1pTVi0tIiwgNCwgOCwgIjEwMDAgMTAxMCBzc3NzIGRkZGQiLCAiY3BiIHJiZCxyYnMiLCAwLAorCisgICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMDAgc3NOMCBkZGRkIiwgImNwbCBycmQsQHJzIiwgMCwKKyAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCisgICJDWlNWLS0iLCAxNiwgMzIsICIwMTAxIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAwMCAwMDAwIGRkZGQgaW1tMzIiLCAiY3BsIHJyZCxpbW0zMiIsIDAsCisgICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDAwMCBzc3NzIGRkZGQiLCAiY3BsIHJyZCxycnMiLCAwLAorCisgICJDWlMtLS0iLCA1LCA4LCAiMTAxMSAwMDAwIGRkZGQgMDAwMCIsICJkYWIgcmJkIiwgMCwKKyAgIi0tLS0tLSIsIDExLCAxNiwgIjExMTEgZGRkZCAxZGlzcDciLCAiZGJqbnogcmJkLGRpc3A3IiwgMCwKKyAgIi1aU1YtLSIsIDExLCAxNiwgIjAwMTAgMTAxMSBkZE4wIGltbTRtMSIsICJkZWMgQHJkLGltbTRtMSIsIDAsCisgICItWlNWLS0iLCAxNCwgMTYsICIwMTEwIDEwMTEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAorICAiLVpTVi0tIiwgMTMsIDE2LCAiMDExMCAxMDExIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlYyBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAorICAiLVpTVi0tIiwgNCwgMTYsICIxMDEwIDEwMTEgZGRkZCBpbW00bTEiLCAiZGVjIHJkLGltbTRtMSIsIDAsCisgICItWlNWLS0iLCAxMSwgOCwgIjAwMTAgMTAxMCBkZE4wIGltbTRtMSIsICJkZWNiIEByZCxpbW00bTEiLCAwLAorICAiLVpTVi0tIiwgMTQsIDgsICIwMTEwIDEwMTAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKKyAgIi1aU1YtLSIsIDEzLCA4LCAiMDExMCAxMDEwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlY2IgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKKyAgIi1aU1YtLSIsIDQsIDgsICIxMDEwIDEwMTAgZGRkZCBpbW00bTEiLCAiZGVjYiByYmQsaW1tNG0xIiwgMCwKKworICAiLS0tLS0tIiwgNywgMTYsICIwMTExIDExMDAgMDAwMCAwMGlpIiwgImRpIGkyIiwgMCwKKyAgIkNaU1YtLSIsIDEwNywgMTYsICIwMDAxIDEwMTEgc3NOMCBkZGRkIiwgImRpdiBycmQsQHJzIiwgMCwKKyAgIkNaU1YtLSIsIDEwNywgMTYsICIwMTAxIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdiBycmQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAxMDEgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2IHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAorICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAwMDEgMTAxMSAwMDAwIGRkZGQgaW1tMTYiLCAiZGl2IHJyZCxpbW0xNiIsIDAsCisgICJDWlNWLS0iLCAxMDcsIDE2LCAiMTAwMSAxMDExIHNzc3MgZGRkZCIsICJkaXYgcnJkLHJzIiwgMCwKKyAgIkNaU1YtLSIsIDc0NCwgMzIsICIwMDAxIDEwMTAgc3NOMCBkZGRkIiwgImRpdmwgcnFkLEBycyIsIDAsCisgICJDWlNWLS0iLCA3NDUsIDMyLCAiMDEwMSAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXZsIHJxZCxhZGRyZXNzX3NyYyIsIDAsCisgICJDWlNWLS0iLCA3NDYsIDMyLCAiMDEwMSAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykiLCAwLAorICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjAwMDEgMTAxMCAwMDAwIGRkZGQgaW1tMzIiLCAiZGl2bCBycWQsaW1tMzIiLCAwLAorICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjEwMDEgMTAxMCBzc3NzIGRkZGQiLCAiZGl2bCBycWQscnJzIiwgMCwKKworICAiLS0tLS0tIiwgMTEsIDE2LCAiMTExMSBkZGRkIDBkaXNwNyIsICJkam56IHJkLGRpc3A3IiwgMCwKKyAgIi0tLS0tLSIsIDcsIDE2LCAiMDExMSAxMTAwIDAwMDAgMDFpaSIsICJlaSBpMiIsIDAsCisgICItLS0tLS0iLCA2LCAxNiwgIjEwMTAgMTEwMSBzc3NzIGRkZGQiLCAiZXggcmQscnMiLCAwLAorICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAxMCAxMTAxIHNzTjAgZGRkZCIsICJleCByZCxAcnMiLCAwLAorIi0tLS0tLSIsIDE1LCAxNiwgIjAxMTAgMTEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZXggcmQsYWRkcmVzc19zcmMiLCAwLAorICAiLS0tLS0tIiwgMTYsIDE2LCAiMDExMCAxMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJleCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAorCisgICItLS0tLS0iLCAxMiwgOCwgIjAwMTAgMTEwMCBzc04wIGRkZGQiLCAiZXhiIHJiZCxAcnMiLCAwLAorIi0tLS0tLSIsIDE1LCA4LCAiMDExMCAxMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJleGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIi0tLS0tLSIsIDE2LCA4LCAiMDExMCAxMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICItLS0tLS0iLCA2LCA4LCAiMTAxMCAxMTAwIHNzc3MgZGRkZCIsICJleGIgcmJkLHJicyIsIDAsCisKKyAgIi0tLS0tLSIsIDExLCAxNiwgIjEwMTEgMDAwMSBkZGRkIDEwMTAiLCAiZXh0cyBycmQiLCAwLAorICAiLS0tLS0tIiwgMTEsIDgsICIxMDExIDAwMDEgZGRkZCAwMDAwIiwgImV4dHNiIHJkIiwgMCwKKyAgIi0tLS0tLSIsIDExLCAzMiwgIjEwMTEgMDAwMSBkZGRkIDAxMTEiLCAiZXh0c2wgcnFkIiwgMCwKKworICAiLS0tLS0tIiwgOCwgMTYsICIwMTExIDEwMTAgMDAwMCAwMDAwIiwgImhhbHQiLCAwLAorICAiLS0tLS0tIiwgMTAsIDE2LCAiMDAxMSAxMTAxIHNzTjAgZGRkZCIsICJpbiByZCxAcnMiLCAwLAorICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAxMSAxMTAxIGRkZGQgMDEwMCBpbW0xNiIsICJpbiByZCxpbW0xNiIsIDAsCisgICItLS0tLS0iLCAxMiwgOCwgIjAwMTEgMTEwMCBzc04wIGRkZGQiLCAiaW5iIHJiZCxAcnMiLCAwLAorICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDExMDAgZGRkZCAwMTAwIGltbTE2IiwgImluYiByYmQsaW1tMTYiLCAwLAorICAiLVpTVi0tIiwgMTEsIDE2LCAiMDAxMCAxMDAxIGRkTjAgaW1tNG0xIiwgImluYyBAcmQsaW1tNG0xIiwgMCwKKyAgIi1aU1YtLSIsIDE0LCAxNiwgIjAxMTAgMTAwMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCisgICItWlNWLS0iLCAxMywgMTYsICIwMTEwIDEwMDEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCisgICItWlNWLS0iLCA0LCAxNiwgIjEwMTAgMTAwMSBkZGRkIGltbTRtMSIsICJpbmMgcmQsaW1tNG0xIiwgMCwKKyAgIi1aU1YtLSIsIDExLCA4LCAiMDAxMCAxMDAwIGRkTjAgaW1tNG0xIiwgImluY2IgQHJkLGltbTRtMSIsIDAsCisgICItWlNWLS0iLCAxNCwgOCwgIjAxMTAgMTAwMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAorICAiLVpTVi0tIiwgMTMsIDgsICIwMTEwIDEwMDAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAorICAiLVpTVi0tIiwgNCwgOCwgIjEwMTAgMTAwMCBkZGRkIGltbTRtMSIsICJpbmNiIHJiZCxpbW00bTEiLCAwLAorICAiLS0tVi0tIiwgMjEsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluZCBAcmQsQHJzLHJhIiwgMCwKKyAgIi0tLVYtLSIsIDIxLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluZGIgQHJkLEBycyxyYmEiLCAwLAorICAiLS0tVi0tIiwgMjEsIDgsICIwMDExIDExMDAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5pYiBAcmQsQHJzLHJhIiwgMCwKKyAgIi0tLVYtLSIsIDIxLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJpbmliciBAcmQsQHJzLHJhIiwgMCwKKyAgIkNaU1ZESCIsIDEzLCAxNiwgIjAxMTEgMTAxMSAwMDAwIDAwMDAiLCAiaXJldCIsIDAsCisgICItLS0tLS0iLCAxMCwgMTYsICIwMDAxIDExMTAgZGROMCBjY2NjIiwgImpwIGNjLEByZCIsIDAsCisgICItLS0tLS0iLCA3LCAxNiwgIjAxMDEgMTExMCAwMDAwIGNjY2MgYWRkcmVzc19kc3QiLCAianAgY2MsYWRkcmVzc19kc3QiLCAwLAorICAiLS0tLS0tIiwgOCwgMTYsICIwMTAxIDExMTAgZGROMCBjY2NjIGFkZHJlc3NfZHN0IiwgImpwIGNjLGFkZHJlc3NfZHN0KHJkKSIsIDAsCisgICItLS0tLS0iLCA2LCAxNiwgIjExMTAgY2NjYyBkaXNwOCIsICJqciBjYyxkaXNwOCIsIDAsCisKKyAgIi0tLS0tLSIsIDcsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDEwMSBpbW0xNiIsICJsZCBAcmQsaW1tMTYiLCAwLAorICAiLS0tLS0tIiwgOCwgMTYsICIwMDEwIDExMTEgZGROMCBzc3NzIiwgImxkIEByZCxycyIsIDAsCisgICItLS0tLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsIDAsCisgICItLS0tLS0iLCAxMiwgMTYsICIwMTEwIDExMTEgZGROMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkIGFkZHJlc3NfZHN0KHJkKSxycyIsIDAsCisgICItLS0tLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImxkIGFkZHJlc3NfZHN0LGltbTE2IiwgMCwKKyItLS0tLS0iLCAxMSwgMTYsICIwMTEwIDExMTEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkIGFkZHJlc3NfZHN0LHJzIiwgMCwKKyAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAxMSBkZE4wIHNzc3MgaW1tMTYiLCAibGQgcmQoaW1tMTYpLHJzIiwgMCwKKyAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTEgMDAxMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZCByZChyeCkscnMiLCAwLAorICAiLS0tLS0tIiwgNywgMTYsICIwMDEwIDAwMDEgc3NOMCBkZGRkIiwgImxkIHJkLEBycyIsIDAsCisgICItLS0tLS0iLCA5LCAxNiwgIjAxMTAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGQgcmQsYWRkcmVzc19zcmMiLCAwLAorICAiLS0tLS0tIiwgMTAsIDE2LCAiMDExMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAorICAiLS0tLS0tIiwgNywgMTYsICIwMDEwIDAwMDEgMDAwMCBkZGRkIGltbTE2IiwgImxkIHJkLGltbTE2IiwgMCwKKyAgIi0tLS0tLSIsIDMsIDE2LCAiMTAxMCAwMDAxIHNzc3MgZGRkZCIsICJsZCByZCxycyIsIDAsCisgICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMDEgc3NOMCBkZGRkIGltbTE2IiwgImxkIHJkLHJzKGltbTE2KSIsIDAsCisgICItLS0tLS0iLCAxNCwgMTYsICIwMTExIDAwMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGQgcmQscnMocngpIiwgMCwKKworICAiLS0tLS0tIiwgNywgOCwgIjAwMDAgMTEwMCBkZE4wIDAxMDEgaW1tOCBpbW04IiwgImxkYiBAcmQsaW1tOCIsIDAsCisgICItLS0tLS0iLCA4LCA4LCAiMDAxMCAxMTEwIGRkTjAgc3NzcyIsICJsZGIgQHJkLHJicyIsIDAsCisgICItLS0tLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsIDAsCisgICItLS0tLS0iLCAxMiwgOCwgIjAxMDAgMTExMCBkZE4wIHNzTjAgYWRkcmVzc19kc3QiLCAibGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMiLCAwLAorICAiLS0tLS0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJsZGIgYWRkcmVzc19kc3QsaW1tOCIsIDAsCisiLS0tLS0tIiwgMTEsIDgsICIwMTEwIDExMTAgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkYiBhZGRyZXNzX2RzdCxyYnMiLCAwLAorICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMTAgZGROMCBzc3NzIGltbTE2IiwgImxkYiByZChpbW0xNikscmJzIiwgMCwKKyAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMSAwMDEwIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYiByZChyeCkscmJzIiwgMCwKKyAgIi0tLS0tLSIsIDcsIDgsICIwMDEwIDAwMDAgc3NOMCBkZGRkIiwgImxkYiByYmQsQHJzIiwgMCwKKyItLS0tLS0iLCA5LCA4LCAiMDExMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIi0tLS0tLSIsIDEwLCA4LCAiMDExMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICItLS0tLS0iLCA1LCA4LCAiMTEwMCBkZGRkIGltbTgiLCAibGRiIHJiZCxpbW04IiwgMCwKKyAgIi0tLS0tLSIsIDMsIDgsICIxMDEwIDAwMDAgc3NzcyBkZGRkIiwgImxkYiByYmQscmJzIiwgMCwKKyAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDAwIHNzTjAgZGRkZCBpbW0xNiIsICJsZGIgcmJkLHJzKGltbTE2KSIsIDAsCisgICItLS0tLS0iLCAxNCwgOCwgIjAxMTEgMDAwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGIgcmJkLHJzKHJ4KSIsIDAsCisKKyAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMTEwMSBkZE4wIHNzc3MiLCAibGRsIEByZCxycnMiLCAwLAorICAiLS0tLS0tIiwgMTQsIDMyLCAiMDEwMSAxMTAxIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZGwgYWRkcmVzc19kc3QocmQpLHJycyIsIDAsCisgICItLS0tLS0iLCAxNSwgMzIsICIwMTAxIDExMDEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkbCBhZGRyZXNzX2RzdCxycnMiLCAwLAorICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTExIGRkTjAgc3NzcyBpbW0xNiIsICJsZGwgcmQoaW1tMTYpLHJycyIsIDAsCisgICItLS0tLS0iLCAxNywgMzIsICIwMTExIDAxMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRsIHJkKHJ4KSxycnMiLCAwLAorICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAwMTAwIHNzTjAgZGRkZCIsICJsZGwgcnJkLEBycyIsIDAsCisgICItLS0tLS0iLCAxMiwgMzIsICIwMTAxIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkbCBycmQsYWRkcmVzc19zcmMiLCAwLAorICAiLS0tLS0tIiwgMTMsIDMyLCAiMDEwMSAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDAxMDAgMDAwMCBkZGRkIGltbTMyIiwgImxkbCBycmQsaW1tMzIiLCAwLAorICAiLS0tLS0tIiwgNSwgMzIsICIxMDAxIDAxMDAgc3NzcyBkZGRkIiwgImxkbCBycmQscnJzIiwgMCwKKyAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDEwMSBzc04wIGRkZGQgaW1tMTYiLCAibGRsIHJyZCxycyhpbW0xNikiLCAwLAorICAiLS0tLS0tIiwgMTcsIDMyLCAiMDExMSAwMTAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkbCBycmQscnMocngpIiwgMCwKKworICAiLS0tLS0tIiwgMTIsIDE2LCAiMDExMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGEgcHJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibGRhIHByZCxhZGRyZXNzX3NyYyhycykiLCAwLAorICAiLS0tLS0tIiwgMTUsIDE2LCAiMDAxMSAwMTAwIHNzTjAgZGRkZCBpbW0xNiIsICJsZGEgcHJkLHJzKGltbTE2KSIsIDAsCisgICItLS0tLS0iLCAxNSwgMTYsICIwMTExIDAxMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRhIHByZCxycyhyeCkiLCAwLAorICAiLS0tLS0tIiwgMTUsIDE2LCAiMDAxMSAwMTAwIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRhciBwcmQsZGlzcDE2IiwgMCwKKyAgIi0tLS0tLSIsIDcsIDMyLCAiMDExMSAxMTAxIHNzc3MgMWNjYyIsICJsZGN0bCBjdHJsLHJzIiwgMCwKKyAgIi0tLS0tLSIsIDcsIDMyLCAiMDExMSAxMTAxIGRkZGQgMGNjYyIsICJsZGN0bCByZCxjdHJsIiwgMCwKKworICAiLS0tLS0tIiwgNSwgMTYsICIxMDExIDExMDEgZGRkZCBpbW00IiwgImxkayByZCxpbW00IiwgMCwKKworICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIiwgImxkbSBAcmQscnMsbiIsIDAsCisgICItLS0tLS0iLCAxNSwgMTYsICIwMTAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NOMCAwMDAwIG5taW51czEgYWRkcmVzc19kc3QiLCAibGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuIiwgMCwKKyAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMTEwMCAwMDAwIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCIsICJsZG0gYWRkcmVzc19kc3QscnMsbiIsIDAsCisgICItLS0tLS0iLCAxMSwgMTYsICIwMDAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEiLCAibGRtIHJkLEBycyxuIiwgMCwKKyAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyIsICJsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4iLCAwLAorICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAxMTAwIDAwMDAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjIiwgImxkbSByZCxhZGRyZXNzX3NyYyxuIiwgMCwKKworICAiQ1pTVkRIIiwgMTIsIDE2LCAiMDAxMSAxMDAxIHNzTjAgMDAwMCIsICJsZHBzIEBycyIsIDAsCisgICJDWlNWREgiLCAxNiwgMTYsICIwMTExIDEwMDEgMDAwMCAwMDAwIGFkZHJlc3Nfc3JjIiwgImxkcHMgYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVkRIIiwgMTcsIDE2LCAiMDExMSAxMDAxIHNzTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJsZHBzIGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisKKyAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAxMSAwMDAwIHNzc3MgZGlzcDE2IiwgImxkciBkaXNwMTYscnMiLCAwLAorICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDAxIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRyIHJkLGRpc3AxNiIsIDAsCisgICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAxMCAwMDAwIHNzc3MgZGlzcDE2IiwgImxkcmIgZGlzcDE2LHJicyIsIDAsCisgICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAwMCAwMDAwIGRkZGQgZGlzcDE2IiwgImxkcmIgcmJkLGRpc3AxNiIsIDAsCisgICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMTEgMDAwMCBzc3NzIGRpc3AxNiIsICJsZHJsIGRpc3AxNixycnMiLCAwLAorICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTAxIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRybCBycmQsZGlzcDE2IiwgMCwKKworICAiQ1pTLS0tIiwgNywgMTYsICIwMTExIDEwMTEgMDAwMCAxMDEwIiwgIm1iaXQiLCAwLAorICAiLVpTLS0tIiwgMTIsIDE2LCAiMDExMSAxMDExIGRkZGQgMTEwMSIsICJtcmVxIHJkIiwgMCwKKyAgIi0tLS0tLSIsIDUsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAwMSIsICJtcmVzIiwgMCwKKyAgIi0tLS0tLSIsIDUsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAwMCIsICJtc2V0IiwgMCwKKworICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDAwMSAxMDAxIHNzTjAgZGRkZCIsICJtdWx0IHJyZCxAcnMiLCAwLAorICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDEwMSAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0IHJyZCxhZGRyZXNzX3NyYyIsIDAsCisgICJDWlNWLS0iLCA3MCwgMTYsICIwMTAxIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICJDWlNWLS0iLCA3MCwgMTYsICIwMDAxIDEwMDEgMDAwMCBkZGRkIGltbTE2IiwgIm11bHQgcnJkLGltbTE2IiwgMCwKKyAgIkNaU1YtLSIsIDcwLCAxNiwgIjEwMDEgMTAwMSBzc3NzIGRkZGQiLCAibXVsdCBycmQscnMiLCAwLAorICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAwMDEgMTAwMCBzc04wIGRkZGQiLCAibXVsdGwgcnFkLEBycyIsIDAsCisgICJDWlNWLS0iLCAyODIsIDMyLCAiMDEwMSAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0bCBycWQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAxMDEgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICJDWlNWLS0iLCAyODIsIDMyLCAiMDAwMSAxMDAwIDAwMDAgZGRkZCBpbW0zMiIsICJtdWx0bCBycWQsaW1tMzIiLCAwLAorICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjEwMDEgMTAwMCBzc3NzIGRkZGQiLCAibXVsdGwgcnFkLHJycyIsIDAsCisgICJDWlNWLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAwMDEwIiwgIm5lZyBAcmQiLCAwLAorICAiQ1pTVi0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWcgYWRkcmVzc19kc3QiLCAwLAorICAiQ1pTVi0tIiwgMTYsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWcgYWRkcmVzc19kc3QocmQpIiwgMCwKKyAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDAxMCIsICJuZWcgcmQiLCAwLAorICAiQ1pTVi0tIiwgMTIsIDgsICIwMDAwIDExMDAgZGROMCAwMDEwIiwgIm5lZ2IgQHJkIiwgMCwKKyAgIkNaU1YtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWdiIGFkZHJlc3NfZHN0IiwgMCwKKyAgIkNaU1YtLSIsIDE2LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWdiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCisgICJDWlNWLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDAxMCIsICJuZWdiIHJiZCIsIDAsCisKKyAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIDAwMDAgMDExMSIsICJub3AiLCAwLAorCisgICJDWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDEwMSBzc04wIGRkZGQiLCAib3IgcmQsQHJzIiwgMCwKKyAgIkNaUy0tLSIsIDksIDE2LCAiMDEwMCAwMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJvciByZCxhZGRyZXNzX3NyYyIsIDAsCisgICJDWlMtLS0iLCAxMCwgMTYsICIwMTAwIDAxMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICJDWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDEwMSAwMDAwIGRkZGQgaW1tMTYiLCAib3IgcmQsaW1tMTYiLCAwLAorICAiQ1pTLS0tIiwgNCwgMTYsICIxMDAwIDAxMDEgc3NzcyBkZGRkIiwgIm9yIHJkLHJzIiwgMCwKKworICAiQ1pTUC0tIiwgNywgOCwgIjAwMDAgMDEwMCBzc04wIGRkZGQiLCAib3JiIHJiZCxAcnMiLCAwLAorIkNaU1AtLSIsIDksIDgsICIwMTAwIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yYiByYmQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTUC0tIiwgMTAsIDgsICIwMTAwIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1AtLSIsIDcsIDgsICIwMDAwIDAxMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJvcmIgcmJkLGltbTgiLCAwLAorICAiQ1pTUC0tIiwgNCwgOCwgIjEwMDAgMDEwMCBzc3NzIGRkZGQiLCAib3JiIHJiZCxyYnMiLCAwLAorCisgICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTExMSBkZE4wIHNzc3MiLCAib3V0IEByZCxycyIsIDAsCisgICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc3NzIDAxMTAgaW1tMTYiLCAib3V0IGltbTE2LHJzIiwgMCwKKyAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDExMTAgZGROMCBzc3NzIiwgIm91dGIgQHJkLHJicyIsIDAsCisgICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzc3MgMDExMCBpbW0xNiIsICJvdXRiIGltbTE2LHJicyIsIDAsCisgICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRkIEByZCxAcnMscmEiLCAwLAorICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRkYiBAcmQsQHJzLHJiYSIsIDAsCisgICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGliIEByZCxAcnMscmEiLCAwLAorICAiLS0tVi0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAib3V0aWJyIEByZCxAcnMscmEiLCAwLAorCisgICItLS0tLS0iLCAxMiwgMTYsICIwMDAxIDAxMTEgc3NOMCBkZE4wIiwgInBvcCBAcmQsQHJzIiwgMCwKKyAgIi0tLS0tLSIsIDE2LCAxNiwgIjAxMDEgMDExMSBzc04wIGRkTjAgYWRkcmVzc19kc3QiLCAicG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMiLCAwLAorICAiLS0tLS0tIiwgMTYsIDE2LCAiMDEwMSAwMTExIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJwb3AgYWRkcmVzc19kc3QsQHJzIiwgMCwKKyAgIi0tLS0tLSIsIDgsIDE2LCAiMTAwMSAwMTExIHNzTjAgZGRkZCIsICJwb3AgcmQsQHJzIiwgMCwKKworICAiLS0tLS0tIiwgMTksIDMyLCAiMDAwMSAwMTAxIHNzTjAgZGROMCIsICJwb3BsIEByZCxAcnMiLCAwLAorICAiLS0tLS0tIiwgMjMsIDMyLCAiMDEwMSAwMTAxIHNzTjAgZGROMCBhZGRyZXNzX2RzdCIsICJwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMiLCAwLAorICAiLS0tLS0tIiwgMjMsIDMyLCAiMDEwMSAwMTAxIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJwb3BsIGFkZHJlc3NfZHN0LEBycyIsIDAsCisgICItLS0tLS0iLCAxMiwgMzIsICIxMDAxIDAxMDEgc3NOMCBkZGRkIiwgInBvcGwgcnJkLEBycyIsIDAsCisKKyAgIi0tLS0tLSIsIDEzLCAxNiwgIjAwMDEgMDAxMSBkZE4wIHNzTjAiLCAicHVzaCBAcmQsQHJzIiwgMCwKKyAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMDAxMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMiLCAicHVzaCBAcmQsYWRkcmVzc19zcmMiLCAwLAorICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAwMDExIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyIsICJwdXNoIEByZCxhZGRyZXNzX3NyYyhycykiLCAwLAorICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMTAwMSBpbW0xNiIsICJwdXNoIEByZCxpbW0xNiIsIDAsCisgICItLS0tLS0iLCA5LCAxNiwgIjEwMDEgMDAxMSBkZE4wIHNzc3MiLCAicHVzaCBAcmQscnMiLCAwLAorCisgICItLS0tLS0iLCAyMCwgMzIsICIwMDAxIDAwMDEgZGROMCBzc04wIiwgInB1c2hsIEByZCxAcnMiLCAwLAorICAiLS0tLS0tIiwgMjEsIDMyLCAiMDEwMSAwMDAxIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyIsICJwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIi0tLS0tLSIsIDIxLCAzMiwgIjAxMDEgMDAwMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMiLCAicHVzaGwgQHJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIi0tLS0tLSIsIDEyLCAzMiwgIjEwMDEgMDAwMSBkZE4wIHNzc3MiLCAicHVzaGwgQHJkLHJycyIsIDAsCisKKyAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMTAgMDAxMSBkZE4wIGltbTQiLCAicmVzIEByZCxpbW00IiwgMCwKKyAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTAgMDAxMSBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAicmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKKyAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTAgMDAxMSAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAicmVzIGFkZHJlc3NfZHN0LGltbTQiLCAwLAorICAiLS0tLS0tIiwgNCwgMTYsICIxMDEwIDAwMTEgZGRkZCBpbW00IiwgInJlcyByZCxpbW00IiwgMCwKKyItLS0tLS0iLCAxMCwgMTYsICIwMDEwIDAwMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAicmVzIHJkLHJzIiwgMCwKKworICAiLS0tLS0tIiwgMTEsIDgsICIwMDEwIDAwMTAgZGROMCBpbW00IiwgInJlc2IgQHJkLGltbTQiLCAwLAorICAiLS0tLS0tIiwgMTQsIDgsICIwMTEwIDAwMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAorICAiLS0tLS0tIiwgMTMsIDgsICIwMTEwIDAwMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlc2IgYWRkcmVzc19kc3QsaW1tNCIsIDAsCisgICItLS0tLS0iLCA0LCA4LCAiMTAxMCAwMDEwIGRkZGQgaW1tNCIsICJyZXNiIHJiZCxpbW00IiwgMCwKKyItLS0tLS0iLCAxMCwgOCwgIjAwMTAgMDAxMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJyZXNiIHJiZCxycyIsIDAsCisKKyAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDAxMSIsICJyZXNmbGcgaW1tNCIsIDAsCisgICItLS0tLS0iLCAxMCwgMTYsICIxMDAxIDExMTAgMDAwMCBjY2NjIiwgInJldCBjYyIsIDAsCisKKyAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDBJMCIsICJybCByZCxpbW0xb3IyIiwgMCwKKyAgIkNaU1YtLSIsIDYsIDgsICIxMDExIDAwMTAgZGRkZCAwMEkwIiwgInJsYiByYmQsaW1tMW9yMiIsIDAsCisgICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwSTAiLCAicmxjIHJkLGltbTFvcjIiLCAwLAorCisgICItWi0tLS0iLCA5LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTBJMCIsICJybGNiIHJiZCxpbW0xb3IyIiwgMCwKKyAgIi1aLS0tLSIsIDksIDgsICIxMDExIDExMTAgYWFhYSBiYmJiIiwgInJsZGIgcmJiLHJiYSIsIDAsCisKKyAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDFJMCIsICJyciByZCxpbW0xb3IyIiwgMCwKKyAgIkNaU1YtLSIsIDYsIDgsICIxMDExIDAwMTAgZGRkZCAwMUkwIiwgInJyYiByYmQsaW1tMW9yMiIsIDAsCisgICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDExSTAiLCAicnJjIHJkLGltbTFvcjIiLCAwLAorCisgICItWi0tLS0iLCA5LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTFJMCIsICJycmNiIHJiZCxpbW0xb3IyIiwgMCwKKyAgIi1aLS0tLSIsIDksIDgsICIxMDExIDExMDAgYWFhYSBiYmJiIiwgInJyZGIgcmJiLHJiYSIsIDAsCisgICJDWlNWLS0iLCA1LCAxNiwgIjEwMTEgMDExMSBzc3NzIGRkZGQiLCAic2JjIHJkLHJzIiwgMCwKKyAgIkNaU1ZESCIsIDUsIDgsICIxMDExIDAxMTAgc3NzcyBkZGRkIiwgInNiY2IgcmJkLHJicyIsIDAsCisKKyAgIkNaU1ZESCIsIDMzLCA4LCAiMDExMSAxMTExIGltbTgiLCAic2MgaW1tOCIsIDAsCisKKyJDWlNWLS0iLCAxNSwgMTYsICIxMDExIDAwMTEgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhIHJkLHJzIiwgMCwKKyJDWlNWLS0iLCAxNSwgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGFiIHJiZCxycyIsIDAsCisgICJDWlNWLS0iLCAxNSwgMzIsICIxMDExIDAwMTEgZGRkZCAxMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhbCBycmQscnMiLCAwLAorCisiQ1pTLS0tIiwgMTUsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbCByZCxycyIsIDAsCisiQ1pTLS0tIiwgMTUsIDgsICIxMDExIDAwMTAgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsYiByYmQscnMiLCAwLAorICAiQ1pTLS0tIiwgMTUsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDExMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbGwgcnJkLHJzIiwgMCwKKworICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAxMCAwMTAxIGRkTjAgaW1tNCIsICJzZXQgQHJkLGltbTQiLCAwLAorICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMCAwMTAxIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXQgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAorICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMCAwMTAxIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXQgYWRkcmVzc19kc3QsaW1tNCIsIDAsCisgICItLS0tLS0iLCA0LCAxNiwgIjEwMTAgMDEwMSBkZGRkIGltbTQiLCAic2V0IHJkLGltbTQiLCAwLAorIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDEwMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJzZXQgcmQscnMiLCAwLAorICAiLS0tLS0tIiwgMTEsIDgsICIwMDEwIDAxMDAgZGROMCBpbW00IiwgInNldGIgQHJkLGltbTQiLCAwLAorICAiLS0tLS0tIiwgMTQsIDgsICIwMTEwIDAxMDAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldGIgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAorICAiLS0tLS0tIiwgMTMsIDgsICIwMTEwIDAxMDAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldGIgYWRkcmVzc19kc3QsaW1tNCIsIDAsCisgICItLS0tLS0iLCA0LCA4LCAiMTAxMCAwMTAwIGRkZGQgaW1tNCIsICJzZXRiIHJiZCxpbW00IiwgMCwKKyItLS0tLS0iLCAxMCwgOCwgIjAwMTAgMDEwMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJzZXRiIHJiZCxycyIsIDAsCisKKyAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDAwMSIsICJzZXRmbGcgaW1tNCIsIDAsCisKKyAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDAgZGRkZCAwMTAxIGltbTE2IiwgInNpbmIgcmJkLGltbTE2IiwgMCwKKyAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDEgZGRkZCAwMTAxIGltbTE2IiwgInNpbmIgcmQsaW1tMTYiLCAwLAorICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAiLCAic2luZCBAcmQsQHJzLHJhIiwgMCwKKyAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAiLCAic2luZGIgQHJkLEBycyxyYmEiLCAwLAorICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzaW5pYiBAcmQsQHJzLHJhIiwgMCwKKyAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAwMDAwIiwgInNpbmliciBAcmQsQHJzLHJhIiwgMCwKKworICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTAwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGEgcmQsaW1tOCIsIDAsCisgICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMDEgIDAwMDAgMDAwMCBpbW04IiwgInNsYWIgcmJkLGltbTgiLCAwLAorICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTEwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGFsIHJyZCxpbW04IiwgMCwKKworICAiQ1pTLS0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGwgcmQsaW1tOCIsIDAsCisgICJDWlMtLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMDEgIDAwMDAgMDAwMCBpbW04IiwgInNsbGIgcmJkLGltbTgiLCAwLAorICAiQ1pTLS0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDEwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGxsIHJyZCxpbW04IiwgMCwKKworICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NzcyAwMTExIGltbTE2IiwgInNvdXQgaW1tMTYscnMiLCAwLAorICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc3NzIDAxMTEgaW1tMTYiLCAic291dGIgaW1tMTYscmJzIiwgMCwKKyAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRkIEByZCxAcnMscmEiLCAwLAorICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0ZGIgQHJkLEBycyxyYmEiLCAwLAorICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0aWIgQHJkLEBycyxyYSIsIDAsCisgICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJzb3V0aWJyIEByZCxAcnMscmEiLCAwLAorCisgICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04IiwgInNyYSByZCxpbW04IiwgMCwKKyAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAwMSAxMTExIDExMTEgbmltOCIsICJzcmFiIHJiZCxpbW04IiwgMCwKKyAgIkNaU1YtLSIsIDEzLCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMDEgMTExMSAxMTExIG5pbTgiLCAic3JhbCBycmQsaW1tOCIsIDAsCisKKyAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTgiLCAic3JsIHJkLGltbTgiLCAwLAorICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04IiwgInNybGIgcmJkLGltbTgiLCAwLAorICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDEwMSAxMTExIDExMTEgbmltOCIsICJzcmxsIHJyZCxpbW04IiwgMCwKKworICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMTEgc3NOMCBkZGRkIiwgInN1YiByZCxAcnMiLCAwLAorIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAwMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWIgcmQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAwMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWIgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW0xNiIsICJzdWIgcmQsaW1tMTYiLCAwLAorICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDAwMTEgc3NzcyBkZGRkIiwgInN1YiByZCxycyIsIDAsCisKKyAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMTAgc3NOMCBkZGRkIiwgInN1YmIgcmJkLEBycyIsIDAsCisiQ1pTVkRIIiwgOSwgOCwgIjAxMDAgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViYiByYmQsYWRkcmVzc19zcmMiLCAwLAorICAiQ1pTVkRIIiwgMTAsIDgsICIwMTAwIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAic3ViYiByYmQsaW1tOCIsIDAsCisgICJDWlNWREgiLCA0LCA4LCAiMTAwMCAwMDEwIHNzc3MgZGRkZCIsICJzdWJiIHJiZCxyYnMiLCAwLAorCisgICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMTAgc3NOMCBkZGRkIiwgInN1YmwgcnJkLEBycyIsIDAsCisgICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKKyAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3VibCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAxMCAwMDAwIGRkZGQgaW1tMzIiLCAic3VibCBycmQsaW1tMzIiLCAwLAorICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAwMTAgc3NzcyBkZGRkIiwgInN1YmwgcnJkLHJycyIsIDAsCisKKyAgIi0tLS0tLSIsIDUsIDE2LCAiMTAxMCAxMTExIGRkZGQgY2NjYyIsICJ0Y2MgY2MscmQiLCAwLAorICAiLS0tLS0tIiwgNSwgOCwgIjEwMTAgMTExMCBkZGRkIGNjY2MiLCAidGNjYiBjYyxyYmQiLCAwLAorCisgICItWlMtLS0iLCA4LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAxMDAiLCAidGVzdCBAcmQiLCAwLAorICAiLS0tLS0tIiwgMTEsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0IGFkZHJlc3NfZHN0IiwgMCwKKyAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdCBhZGRyZXNzX2RzdChyZCkiLCAwLAorICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMTAwIiwgInRlc3QgcmQiLCAwLAorCisgICItWlNQLS0iLCA4LCA4LCAiMDAwMCAxMTAwIGRkTjAgMDEwMCIsICJ0ZXN0YiBAcmQiLCAwLAorICAiLVpTUC0tIiwgMTEsIDgsICIwMTAwIDExMDAgMDAwMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3RiIGFkZHJlc3NfZHN0IiwgMCwKKyAgIi1aU1AtLSIsIDEyLCA4LCAiMDEwMCAxMTAwIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0YiBhZGRyZXNzX2RzdChyZCkiLCAwLAorICAiLVpTUC0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAxMDAiLCAidGVzdGIgcmJkIiwgMCwKKworICAiLVpTLS0tIiwgMTMsIDMyLCAiMDAwMSAxMTAwIGRkTjAgMTAwMCIsICJ0ZXN0bCBAcmQiLCAwLAorIi1aUy0tLSIsIDE2LCAzMiwgIjAxMDEgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAidGVzdGwgYWRkcmVzc19kc3QiLCAwLAorICAiLVpTLS0tIiwgMTcsIDMyLCAiMDEwMSAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0bCBhZGRyZXNzX2RzdChyZCkiLCAwLAorICAiLVpTLS0tIiwgMTMsIDMyLCAiMTAwMSAxMTAwIGRkZGQgMTAwMCIsICJ0ZXN0bCBycmQiLCAwLAorCisgICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDEwMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCIsICJ0cmRiIEByZCxAcnMscmJhIiwgMCwKKyAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMTEwMCAwMDAwIGFhYWEgc3NOMCAwMDAwIiwgInRyZHJiIEByZCxAcnMscmJhIiwgMCwKKyAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMDAwMCAwMDAwIHJycnIgc3NOMCAwMDAwIiwgInRyaWIgQHJkLEBycyxyYnIiLCAwLAorICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAwMTAwIDAwMDAgcnJyciBzc04wIDAwMDAiLCAidHJpcmIgQHJkLEBycyxyYnIiLCAwLAorICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAxMTEwIDAwMDAgcnJyciBiYk4wIDExMTAiLCAidHJ0ZHJiIEByYSxAcmIscmJyIiwgMCwKKyAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMDAxMCAwMDAwIHJycnIgYmJOMCAwMDAwIiwgInRydGliIEByYSxAcmIscnIiLCAwLAorICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAwMTEwIDAwMDAgcnJyciBiYk4wIDExMTAiLCAidHJ0aXJiIEByYSxAcmIscmJyIiwgMCwKKyAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMTAxMCAwMDAwIHJycnIgYmJOMCAwMDAwIiwgInRydHJiIEByYSxAcmIscmJyIiwgMCwKKworICAiLS1TLS0tIiwgMTEsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDExMCIsICJ0c2V0IEByZCIsIDAsCisgICItLVMtLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXQgYWRkcmVzc19kc3QiLCAwLAorICAiLS1TLS0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0IGFkZHJlc3NfZHN0KHJkKSIsIDAsCisgICItLVMtLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAxMTAiLCAidHNldCByZCIsIDAsCisKKyAgIi0tUy0tLSIsIDExLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDExMCIsICJ0c2V0YiBAcmQiLCAwLAorICAiLS1TLS0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXRiIGFkZHJlc3NfZHN0IiwgMCwKKyAgIi0tUy0tLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0YiBhZGRyZXNzX2RzdChyZCkiLCAwLAorICAiLS1TLS0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAxMTAiLCAidHNldGIgcmJkIiwgMCwKKworICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDEwMDEgc3NOMCBkZGRkIiwgInhvciByZCxAcnMiLCAwLAorIi1aUy0tLSIsIDksIDE2LCAiMDEwMCAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3IgcmQsYWRkcmVzc19zcmMiLCAwLAorICAiLVpTLS0tIiwgMTAsIDE2LCAiMDEwMCAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3IgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKKyAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAxMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJ4b3IgcmQsaW1tMTYiLCAwLAorICAiLVpTLS0tIiwgNCwgMTYsICIxMDAwIDEwMDEgc3NzcyBkZGRkIiwgInhvciByZCxycyIsIDAsCisKKyAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDEwMDAgc3NOMCBkZGRkIiwgInhvcmIgcmJkLEBycyIsIDAsCisiLVpTUC0tIiwgOSwgOCwgIjAxMDAgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yYiByYmQsYWRkcmVzc19zcmMiLCAwLAorICAiLVpTUC0tIiwgMTAsIDgsICIwMTAwIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCisgICItWlNQLS0iLCA3LCA4LCAiMDAwMCAxMDAwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAieG9yYiByYmQsaW1tOCIsIDAsCisgICItWlNQLS0iLCA0LCA4LCAiMTAwMCAxMDAwIHNzc3MgZGRkZCIsICJ4b3JiIHJiZCxyYnMiLCAwLAorICAiKiIsIDQsIDgsICIxMDAwIDEwMDAgc3NzcyBkZGRkIiwgInhvcmIgcmJkLHJicyIsIDAsCisgICIqIiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworaW50Citjb3VudCAoKQoreworICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7CisgIGludCByID0gMDsKKworICB3aGlsZSAocC0+bmFtZSkKKyAgICB7CisgICAgICByKys7CisgICAgICBwKys7CisgICAgfQorICByZXR1cm4gcjsKKworfQorCitzdGF0aWMKK2ludAorZnVuYyAoYSwgYikKKyAgICAgc3RydWN0IG9wICphOworICAgICBzdHJ1Y3Qgb3AgKmI7Cit7CisgIHJldHVybiBzdHJjbXAgKChhKS0+bmFtZSwgKGIpLT5uYW1lKTsKK30KKworCisvKiBvcGNvZGUKKworIGxpdGVyYWwgIDAwMDAgbm5ubiBpbnNlcnQgbm5uIGludG8gc3RyZWFtCisgb3BlcmFuZCAgMDAwMSBubm5uICBpbnNlcnQgb3BlcmFuZCByZWcgbm5uIGludG8gc3RyZWFtCisqLworCitzdHJ1Y3QgdG9rX3N0cnVjdAoreworCisgIGNoYXIgKm1hdGNoOworICBjaGFyICp0b2tlbjsKKyAgaW50IGxlbmd0aDsKK307CisKK3N0cnVjdCB0b2tfc3RydWN0IGFyZ3NbXSA9Cit7CisKKyAgeyJhZGRyZXNzX3NyYyhycykiLCAiQ0xBU1NfWCsoQVJHX1JTKSIsfSwKKyAgeyJhZGRyZXNzX2RzdChyZCkiLCAiQ0xBU1NfWCsoQVJHX1JEKSIsfSwKKworICB7InJzKGltbTE2KSIsICJDTEFTU19CQSsoQVJHX1JTKSIsfSwKKyAgeyJyZChpbW0xNikiLCAiQ0xBU1NfQkErKEFSR19SRCkiLH0sCisgIHsicHJkIiwgICAgICAgIkNMQVNTX1BSKyhBUkdfUkQpIix9LAorICB7ImFkZHJlc3Nfc3JjIiwgIkNMQVNTX0RBKyhBUkdfU1JDKSIsfSwKKyAgeyJhZGRyZXNzX2RzdCIsICJDTEFTU19EQSsoQVJHX0RTVCkiLH0sCisgIHsicmQocngpIiwgIkNMQVNTX0JYKyhBUkdfUkQpIix9LAorICB7InJzKHJ4KSIsICJDTEFTU19CWCsoQVJHX1JTKSIsfSwKKworICB7ImRpc3AxNiIsICJDTEFTU19ESVNQIix9LAorICB7ImRpc3AxMiIsICJDTEFTU19ESVNQIix9LAorICB7ImRpc3A3IiwgIkNMQVNTX0RJU1AiLH0sCisgIHsiZGlzcDgiLCAiQ0xBU1NfRElTUCIsfSwKKyAgeyJmbGFncyIsICJDTEFTU19GTEFHUyIsfSwKKworICB7ImltbTE2IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTE2KSIsfSwKKyAgeyJpbW0xb3IyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTFPUjIpIix9LAorICB7ImltbTMyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTMyKSIsfSwKKyAgeyJpbW00bTEiLCAiQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSkiLH0sCisgIHsiaW1tNCIsICJDTEFTU19JTU0gKyhBUkdfSU1NNCkiLH0sCisgIHsibiIsICJDTEFTU19JTU0gKyAoQVJHX0lNTU4pIix9LAorICB7ImN0cmwiLCAiQ0xBU1NfQ1RSTCIsfSwKKyAgeyJyYmEiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSkiLH0sCisgIHsicmJiIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkIpIix9LAorICB7InJiZCIsICJDTEFTU19SRUdfQllURSsoQVJHX1JEKSIsfSwKKyAgeyJyYnMiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SUykiLH0sCisgIHsicmJyIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUlIpIix9LAorCisgIHsicnJkIiwgIkNMQVNTX1JFR19MT05HKyhBUkdfUkQpIix9LAorICB7InJycyIsICJDTEFTU19SRUdfTE9ORysoQVJHX1JTKSIsfSwKKworICB7InJxZCIsICJDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSIsfSwKKworICB7InJkIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUkQpIix9LAorICB7InJzIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlMpIix9LAorCisgIHsiQHJkIiwgIkNMQVNTX0lSKyhBUkdfUkQpIix9LAorICB7IkByYSIsICJDTEFTU19JUisoQVJHX1JBKSIsfSwKKyAgeyJAcmIiLCAiQ0xBU1NfSVIrKEFSR19SQikiLH0sCisgIHsiQHJzIiwgIkNMQVNTX0lSKyhBUkdfUlMpIix9LAorCisgIHsiaW1tOCIsICJDTEFTU19JTU0rKEFSR19JTU04KSIsfSwKKyAgeyJpMiIsICJDTEFTU19JTU0rKEFSR19JTU0yKSIsfSwKKyAgeyJjYyIsICJDTEFTU19DQyIsfSwKKworICB7InJyIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlIpIix9LAorICB7InJhIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUkEpIix9LAorICB7InJzIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlMpIix9LAorCisgIHsiMSIsICJDTEFTU19JTU0rKEFSR19JTU1fMSkiLH0sCisgIHsiMiIsICJDTEFTU19JTU0rKEFSR19JTU1fMikiLH0sCisKKyAgMCwgMAorfTsKKworc3RydWN0IHRva19zdHJ1Y3QgdG9rc1tdID0KK3sKKyAgIjAwMDAiLCAiQ0xBU1NfQklUKzAiLCAxLAorICAiMDAwMSIsICJDTEFTU19CSVQrMSIsIDEsCisgICIwMDEwIiwgIkNMQVNTX0JJVCsyIiwgMSwKKyAgIjAwMTEiLCAiQ0xBU1NfQklUKzMiLCAxLAorICAiMDEwMCIsICJDTEFTU19CSVQrNCIsIDEsCisgICIwMTAxIiwgIkNMQVNTX0JJVCs1IiwgMSwKKyAgIjAxMTAiLCAiQ0xBU1NfQklUKzYiLCAxLAorICAiMDExMSIsICJDTEFTU19CSVQrNyIsIDEsCisgICIxMDAwIiwgIkNMQVNTX0JJVCs4IiwgMSwKKyAgIjEwMDEiLCAiQ0xBU1NfQklUKzkiLCAxLAorICAiMTAxMCIsICJDTEFTU19CSVQrMHhhIiwgMSwKKyAgIjEwMTEiLCAiQ0xBU1NfQklUKzB4YiIsIDEsCisgICIxMTAwIiwgIkNMQVNTX0JJVCsweGMiLCAxLAorICAiMTEwMSIsICJDTEFTU19CSVQrMHhkIiwgMSwKKyAgIjExMTAiLCAiQ0xBU1NfQklUKzB4ZSIsIDEsCisgICIxMTExIiwgIkNMQVNTX0JJVCsweGYiLCAxLAorCisgICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzAiLCAxLAorICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMisxIiwgMSwKKyAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMiIsIDEsCisgICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzMiLCAxLAorICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis0IiwgMSwKKyAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNSIsIDEsCisgICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzYiLCAxLAorICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis3IiwgMSwKKyAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrOCIsIDEsCisgICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzkiLCAxLAorICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMisweGEiLCAxLAorICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMisweGIiLCAxLAorICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGMiLCAxLAorICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGQiLCAxLAorICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGUiLCAxLAorICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGYiLCAxLAorCisgICJzc3NzIiwgIkNMQVNTX1JFRysoQVJHX1JTKSIsIDEsCisgICJkZGRkIiwgIkNMQVNTX1JFRysoQVJHX1JEKSIsIDEsCisgICJhYWFhIiwgIkNMQVNTX1JFRysoQVJHX1JBKSIsIDEsCisgICJiYmJiIiwgIkNMQVNTX1JFRysoQVJHX1JCKSIsIDEsCisgICJycnJyIiwgIkNMQVNTX1JFRysoQVJHX1JSKSIsIDEsCisKKyAgInNzTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SUykiLCAxLAorICAiZGROMCIsICJDTEFTU19SRUdOMCsoQVJHX1JEKSIsIDEsCisgICJhYU4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkEpIiwgMSwKKyAgImJiTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SQikiLCAxLAorICAicnJOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JSKSIsIDEsCisKKyAgImNjY2MiLCAiQ0xBU1NfQ0MiLCAxLAorICAibm5ubiIsICJDTEFTU19JTU0rKEFSR19JTU1OKSIsIDEsCisgICJ4eHh4IiwgIkNMQVNTX1JFRysoQVJHX1JYKSIsIDEsCisgICJ4eE4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlgpIiwgMSwKKyAgIm5taW51czEiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSkiLCAxLAorCisgICJkaXNwMTYiLCAiQ0xBU1NfRElTUCsoQVJHX0RJU1AxNikiLCA0LAorICAiZGlzcDEyIiwgIkNMQVNTX0RJU1ArKEFSR19ESVNQMTIpIiwgMywKKyAgImZsYWdzIiwgIkNMQVNTX0ZMQUdTIiwgMSwKKyAgImFkZHJlc3NfZHN0IiwgIkNMQVNTX0FERFJFU1MrKEFSR19EU1QpIiwgNCwKKyAgImFkZHJlc3Nfc3JjIiwgIkNMQVNTX0FERFJFU1MrKEFSR19TUkMpIiwgNCwKKyAgImltbTRtMSIsICJDTEFTU19JTU0rKEFSR19JTU00TTEpIiwgMSwKKyAgImltbTQiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NNCkiLCAxLAorCisgICJpbW04IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTgpIiwgMiwKKyAgImltbTE2IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTE2KSIsIDQsCisgICJpbW0zMiIsICJDTEFTU19JTU0rKEFSR19JTU0zMikiLCA4LAorICAibmltOCIsICJDTEFTU19JTU0rKEFSR19OSU04KSIsIDIsCisgICIwY2NjIiwgIkNMQVNTXzBDQ0MiLCAxLAorICAiMWNjYyIsICJDTEFTU18xQ0NDIiwgMSwKKyAgImRpc3A4IiwgIkNMQVNTX0RJU1A4IiwgMiwKKyAgIjBkaXNwNyIsICJDTEFTU18wRElTUDciLCAyLAorICAiMWRpc3A3IiwgIkNMQVNTXzFESVNQNyIsIDIsCisgICIwMWlpIiwgIkNMQVNTXzAxSUkiLCAxLAorICAiMDBpaSIsICJDTEFTU18wMElJIiwgMSwKKyAgMCwgMAorCit9OworCitjaGFyICoKK3RyYW5zbGF0ZSAodGFibGUsIHgsIGxlbmd0aCkKKyAgICAgc3RydWN0IHRva19zdHJ1Y3QgKnRhYmxlOworICAgICBjaGFyICp4OworICAgICBpbnQgKmxlbmd0aDsKK3sKKworICBpbnQgZm91bmQ7CisKKyAgZm91bmQgPSAwOworICB3aGlsZSAodGFibGUtPm1hdGNoKQorICAgIHsKKyAgICAgIGludCBsID0gc3RybGVuICh0YWJsZS0+bWF0Y2gpOworCisgICAgICBpZiAoc3RybmNtcCAodGFibGUtPm1hdGNoLCB4LCBsKSA9PSAwKQorCXsKKwkgIC8qIEdvdCBhIGhpdCAqLworCSAgcHJpbnRmICgiJXMiLCB0YWJsZS0+dG9rZW4pOworCSAgKmxlbmd0aCArPSB0YWJsZS0+bGVuZ3RoOworCSAgcmV0dXJuIHggKyBsOworCX0KKworICAgICAgdGFibGUrKzsKKyAgICB9CisgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IGZpbmQgJXNcbiIsIHgpOworICBwcmludGYgKCIqKioqIENhbid0IGZpbmQgJXNcbiIsIHgpOworICB3aGlsZSAoKngpCisgICAgeCsrOworICByZXR1cm4geDsKK30KKwordm9pZAorY2hld2JpdHMgKGJpdHMsIGxlbmd0aCkKKyAgICAgY2hhciAqYml0czsKKyAgICAgaW50ICpsZW5ndGg7Cit7CisgIGludCBuID0gMDsKKworICAqbGVuZ3RoID0gMDsKKyAgcHJpbnRmICgieyIpOworICB3aGlsZSAoKmJpdHMpCisgICAgeworICAgICAgd2hpbGUgKCpiaXRzID09ICcgJykKKwl7CisJICBiaXRzKys7CisJfQorICAgICAgYml0cyA9IHRyYW5zbGF0ZSAodG9rcywgYml0cywgbGVuZ3RoKTsKKyAgICAgIG4rKzsKKyAgICAgIHByaW50ZiAoIiwiKTsKKworICAgIH0KKyAgd2hpbGUgKG4gPCBCWVRFX0lORk9fTEVOIC0gMSkKKyAgICB7CisgICAgICBwcmludGYgKCIwLCIpOworICAgICAgbisrOworICAgIH0KKyAgcHJpbnRmICgifSIpOworfQorCisKK3N0YXRpYworaW50CitjaGV3bmFtZSAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgY2hhciAqbjsKKyAgaW50IG5hcmdzID0gMDsKKworICBuID0gbmFtZTsKKyAgcHJpbnRmICgiXCIiKTsKKyAgd2hpbGUgKCpuICYmICFpc3doaXRlICgqbikpCisgICAgeworICAgICAgcHJpbnRmICgiJWMiLCAqbik7CisgICAgICBuKys7CisgICAgfQorICBwcmludGYgKCJcIiwiKTsJCS8qIFNjYW4gdGhlIG9wZXJhbmRzIGFuZCBtYWtlIGVudGlyZXMgZm9yCisJCQkJICAgdGhlbSAtcmVtZW1iZXIgaW5kaXJlY3QgdGhpbmdzICovCisKKyAgbiA9IG5hbWU7CisgIHByaW50ZiAoIk9QQ18iKTsKKyAgd2hpbGUgKCpuICYmICFpc3doaXRlICgqbikpCisgICAgeworICAgICAgcHJpbnRmICgiJWMiLCAqbik7CisgICAgICBuKys7CisgICAgfQorICBwcmludGYgKCIsMCx7Iik7CisKKyAgd2hpbGUgKCpuKQorICAgIHsKKyAgICAgIGludCBkOworCisgICAgICB3aGlsZSAoKm4gPT0gJywnIHx8IGlzd2hpdGUgKCpuKSkKKwluKys7CisgICAgICBuYXJncysrOworICAgICAgbiA9IHRyYW5zbGF0ZSAoYXJncywgbiwgJmQpOworICAgICAgcHJpbnRmICgiLCIpOworICAgIH0KKyAgaWYgKG5hcmdzID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiMCIpOworICAgIH0KKyAgcHJpbnRmICgifSwiKTsKKyAgcmV0dXJuIG5hcmdzOworfQorCitzdGF0aWMgCit2b2lkCitzdWIgKHgsIGMpCisgICAgIGNoYXIgKng7CisgICAgIGNoYXIgYzsKK3sKKyAgd2hpbGUgKCp4KQorICAgIHsKKyAgICAgIGlmICh4WzBdID09IGMgJiYgeFsxXSA9PSBjICYmCisJICB4WzJdID09IGMgJiYgeFszXSA9PSBjKQorCXsKKwkgIHhbMl0gPSAnTic7CisJICB4WzNdID0gJzAnOworCX0KKyAgICAgIHgrKzsKKyAgICB9Cit9CisKKworI2lmIDAKKyNkZWZpbmUgRCh4KSAoKHgpID09ICcxJyB8fCAoeCkgPT0nMCcpCisjZGVmaW5lIE0oeSkgKHN0cm5jbXAoeSx4LDQpPT0wKQorcHJpbnRtYW5nbGVkICh4KQorICAgICBjaGFyICp4OworeworICByZXR1cm47CisgIHdoaWxlICgqeCkKKyAgICB7CisgICAgICBpZiAoRCAoeFswXSkgJiYgRCAoeFsxXSkgJiYgRCAoeFsyXSkgJiYgRCAoeFszXSkpCisJeworCSAgcHJpbnRmICgiWFhYWCIpOworCX0KKyAgICAgIGVsc2UgaWYgKE0gKCJzc3NzIikpCisJeworCSAgcHJpbnRmICgic3NzcyIpOworCX0KKyAgICAgIGVsc2UgaWYgKE0gKCJkZGRkIikpCisJeworCSAgcHJpbnRmICgiZGRkZCIpOworCX0KKyAgICAgIGVsc2UKKwlwcmludGYgKCJfX19fIik7CisKKyAgICAgIHggKz0gNDsKKworICAgICAgaWYgKHhbMF0gPT0gJyAnKQorCXsKKwkgIHByaW50ZiAoIl8iKTsKKwkgIHgrKzsKKwl9CisgICAgfQorCit9CisKKyNlbmRpZgorLyojZGVmaW5lIFdPUktfVFlQRSovCit2b2lkCitwcmludF90eXBlIChuKQorICAgICBzdHJ1Y3Qgb3AgKm47Cit7CisjaWZkZWYgV09SS19UWVBFCisgIHdoaWxlICgqcyAmJiAhaXN3aGl0ZSAoKnMpKQorICAgIHsKKyAgICAgIGwgPSAqczsKKyAgICAgIHMrKzsKKyAgICB9CisgIHN3aXRjaCAobCkKKyAgICB7CisgICAgY2FzZSAnbCc6CisgICAgICBwcmludGYgKCIzMiwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgcHJpbnRmICgiOCwiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGYgKCIxNiwiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbHNlCisgIHByaW50ZiAoIiUyZCwiLCBuLT50eXBlKTsKKyNlbmRpZgorfQorCisKK3ZvaWQKK2ludGVybmFsICgpCit7CisgIGludCBjID0gY291bnQgKCk7CisgIHN0cnVjdCBvcCAqbmV3ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3ApICogYyk7CisgIHN0cnVjdCBvcCAqcCA9IG9wdDsKKyAgbWVtY3B5IChuZXcsIHAsIGMgKiBzaXplb2YgKHN0cnVjdCBvcCkpOworCisgIC8qIHNvcnQgYWxsIG5hbWVzIGluIHRhYmxlIGFscGhhYmV0aWNhbGx5ICovCisgIHFzb3J0IChuZXcsIGMsIHNpemVvZiAoc3RydWN0IG9wKSwgZnVuYyk7CisKKyAgcCA9IG5ldzsKKyAgd2hpbGUgKHAtPmZsYWdzWzBdICE9ICcqJykKKyAgeworICAgIC8qIElmIHRoZXJlIGFyZSBhbnkgQHJzLCBzdWIgdGhlIHNzc3MgaW50byBhIHNzbjAsCisgICAgICAgKHJzKSwgKHNzbjApCisgICAgICAgKi8KKyAgICBpbnQgbG9vcCA9IDE7CisKKyAgICBwcmludGYgKCJcIiVzXCIsJTJkLCAiLCBwLT5mbGFncywgcC0+Y3ljbGVzKTsKKyAgICB3aGlsZSAobG9vcCkKKyAgICB7CisgICAgICBjaGFyICpzID0gcC0+bmFtZTsKKworICAgICAgbG9vcCA9IDA7CisgICAgICB3aGlsZSAoKnMpCisgICAgICB7CisJaWYgKHNbMF0gPT0gJ0AnKQorCXsKKwkgIGNoYXIgYzsKKworCSAgLyogc2tpcCB0aGUgciBhbmQgc3ViIHRoZSBzdHJpbmcgKi8KKwkgIHMrKzsKKwkgIGMgPSBzWzFdOworCSAgc3ViIChwLT5iaXRzLCBjKTsKKwl9CisJaWYgKHNbMF0gPT0gJygnICYmIHNbM10gPT0gJyknKQorCXsKKwkgIHN1YiAocC0+Yml0cywgc1syXSk7CisJfQorCWlmIChzWzBdID09ICcoJykKKwl7CisJICBzdWIgKHAtPmJpdHMsIHNbLTFdKTsKKwl9CisKKwlzKys7CisgICAgICB9CisKKyAgICB9CisgICAgcHJpbnRfdHlwZSAocCk7CisgICAgcHJpbnRmICgiXCIlc1wiLFwiJXNcIiwwLFxuIiwgcC0+Yml0cywgcC0+bmFtZSk7CisgICAgcCsrOworICB9Cit9CisKK3N0YXRpYyAKK3ZvaWQKK2dhcyAoKQoreworICBpbnQgYyA9IGNvdW50ICgpOworICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7CisgIGludCBpZHggPSAwOworICBjaGFyICpvbGRuYW1lID0gIiI7CisgIHN0cnVjdCBvcCAqbmV3ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3ApICogYyk7CisKKyAgbWVtY3B5IChuZXcsIHAsIGMgKiBzaXplb2YgKHN0cnVjdCBvcCkpOworCisgIC8qIHNvcnQgYWxsIG5hbWVzIGluIHRhYmxlIGFscGhhYmV0aWNhbGx5ICovCisgIHFzb3J0IChuZXcsIGMsIHNpemVvZiAoc3RydWN0IG9wKSwgZnVuYyk7CisKKyAgcHJpbnRmICgiCQkJLyogVEhJUyBGSUxFIElTIEFVVE9NQUdJQ0FMTFkgR0VORVJBVEVELCBET04nVCBFRElUIElUICovXG4iKTsKKworICBwcmludGYgKCIjZGVmaW5lIEFSR19NQVNLIDB4MGZcbiIpOworCisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX1NSQyAweDAxXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfRFNUIDB4MDJcbiIpOworCisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JTIDB4MDFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIEFSR19SRCAweDAyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkEgMHgwM1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JCIDB4MDRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIEFSR19SUiAweDA1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlggMHgwNlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTQgMHgwMVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTggMHgwMlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTE2IDB4MDNcbiIpOworICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU0zMiAweDA0XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NTiAweDA1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NTk1JTlVTMSAweDA1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NXzEgMHgwNlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTV8yIDB4MDdcbiIpOworICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQMTYgMHgwOFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX05JTTggMHgwOVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTIgMHgwYVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTFPUjIgMHgwYlxuIik7CisKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfRElTUDEyIDB4MGJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQOCAweDBjXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NNE0xIDB4MGRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX01BU0sgMHgxZmZmMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfWCAweDEwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CQSAweDIwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19EQSAweDMwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CWCAweDQwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19ESVNQIDB4NTBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0lNTSAweDYwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19DQyAweDcwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19DVFJMIDB4ODBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0FERFJFU1MgMHhkMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMENDQyAweGUwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18xQ0NDIDB4ZjBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzBESVNQNyAweDEwMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMURJU1A3IDB4MjAwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wMUlJIDB4MzAwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wMElJIDB4NDAwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CSVQgMHg1MDBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0ZMQUdTIDB4NjAwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19JUiAweDcwMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRElTUDggMHg4MDBcbiIpOworCisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQklUXzFPUjIgMHg5MDBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFRyAweDcwMDBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19CWVRFIDB4MjAwMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX1dPUkQgMHgzMDAwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfUVVBRCAweDQwMDBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19MT05HIDB4NTAwMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHTjAgMHg4MDAwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19QUiAweDEwMDAwXG4iKTsKKworICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGMgMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkY2IgMVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkZCAyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkYiAzXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkbCA0XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfYW5kIDVcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19hbmRiIDZcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19iaXQgN1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JpdGIgOFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NhbGwgOVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NhbHIgMTBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jbHIgMTFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jbHJiIDEyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tIDEzXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tYiAxNFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NvbWZsZyAxNVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwIDE2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BiIDE3XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkIDE4XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkYiAxOVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZHIgMjBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRyYiAyMVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaSAyMlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaWIgMjNcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGlyIDI0XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpcmIgMjVcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGwgMjZcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkIDI3XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZGIgMjhcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkciAyOVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RyYiAzMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2kgMzFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpYiAzMlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2lyIDMzXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaXJiIDM0XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfZGFiIDM1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfZGJqbnogMzZcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19kZWMgMzdcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19kZWNiIDM4XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfZGkgMzlcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaXYgNDBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaXZsIDQxXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfZGpueiA0MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2VpIDQzXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfZXggNDRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19leGIgNDVcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzIDQ2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0c2IgNDdcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzbCA0OFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2hhbHQgNDlcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbiA1MFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luYiA1MVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luYyA1MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luY2IgNTNcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmQgNTRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmRiIDU1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5pYiA1NlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luaWJyIDU3XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfaXJldCA1OFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2pwIDU5XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfanIgNjBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZCA2MVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYSA2MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYXIgNjNcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGIgNjRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGN0bCA2NVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaXIgNjZcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGlyYiA2N1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkayA2OFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkbCA2OVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkbSA3MFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcHMgNzFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHIgNzJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHJiIDczXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRybCA3NFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX21iaXQgNzVcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19tcmVxIDc2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfbXJlcyA3N1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX21zZXQgNzhcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19tdWx0IDc5XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfbXVsdGwgODBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19uZWcgODFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19uZWdiIDgyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfbm9wIDgzXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfb3IgODRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19vcmIgODVcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXQgODZcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRiIDg3XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0ZCA4OFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGRiIDg5XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0aWIgOTBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRpYnIgOTFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19wb3AgOTJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19wb3BsIDkzXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcHVzaCA5NFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3B1c2hsIDk1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzIDk2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzYiA5N1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Jlc2ZsZyA5OFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JldCA5OVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsIDEwMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsYiAxMDFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGMgMTAyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxjYiAxMDNcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGRiIDEwNFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyIDEwNVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyYiAxMDZcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmMgMTA3XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJjYiAxMDhcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmRiIDEwOVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NiYyAxMTBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYmNiIDExMVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYSAxMTJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGFiIDExM1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYWwgMTE0XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsIDExNVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkbGIgMTE2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsbCAxMTdcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXQgMTE4XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc2V0YiAxMTlcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXRmbGcgMTIwXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luYiAxMjFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5kIDEyMlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmRiIDEyM1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmliIDEyNFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmliciAxMjVcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGEgMTI2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xhYiAxMjdcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGFsIDEyOFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbCAxMjlcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGxiIDEzMFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbGwgMTMxXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dCAxMzJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0YiAxMzNcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0ZCAxMzRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0ZGIgMTM1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGliIDEzNlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRpYnIgMTM3XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhIDEzOFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NyYWIgMTM5XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhbCAxNDBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmwgMTQxXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JsYiAxNDJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmxsIDE0M1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YiAxNDRcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zdWJiIDE0NVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YmwgMTQ2XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfdGNjIDE0N1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RjY2IgMTQ4XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfdGVzdCAxNDlcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0YiAxNTBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0bCAxNTFcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmRiIDE1MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyZHJiIDE1M1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyaWIgMTU0XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJpcmIgMTU1XG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0ZHJiIDE1NlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGliIDE1N1xuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGlyYiAxNThcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRyYiAxNTlcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ190c2V0IDE2MFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RzZXRiIDE2MVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3hvciAxNjJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ194b3JiIDE2M1xuIik7CisKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkICAxNjQgXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkYiAgMTY1IFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZHIgIDE2NiBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRyYiAxNjcgIFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaSAgMTY4IFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaWIgMTY5ICBcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYyAgIDE3MFxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JwdCAgIDE3MVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDBlIDE3MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDBmIDE3MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDhlIDE3MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDhmIDE3MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQzNiAxNzJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkMzggMTcyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDc4IDE3MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ3ZSAxNzJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkOWQgMTcyXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDlmIDE3MlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmRiOSAxNzJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkYmYgMTcyXG4iKTsKKyNpZiAwCisgIGZvciAoaSA9IDA7IHRva3NbaV0udG9rZW47IGkrKykKKyAgICBwcmludGYgKCIjZGVmaW5lICVzXHQweCV4XG4iLCB0b2tzW2ldLnRva2VuLCBpICogMTYpOworI2VuZGlmCisgIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IHtcbiIpOworCisgIHByaW50ZiAoIiNpZmRlZiBOSUNFTkFNRVNcbiIpOworICBwcmludGYgKCJjaGFyICpuaWNlbmFtZTtcbiIpOworICBwcmludGYgKCJpbnQgdHlwZTtcbiIpOworICBwcmludGYgKCJpbnQgY3ljbGVzO1xuIik7CisgIHByaW50ZiAoImludCBmbGFncztcbiIpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworICBwcmludGYgKCJjaGFyICpuYW1lO1xuIik7CisgIHByaW50ZiAoInVuc2lnbmVkIGNoYXIgb3Bjb2RlO1xuIik7CisgIHByaW50ZiAoInZvaWQgKCpmdW5jKSgpO1xuIik7CisgIHByaW50ZiAoInVuc2lnbmVkIGludCBhcmdfaW5mb1s0XTtcbiIpOworICBwcmludGYgKCJ1bnNpZ25lZCBpbnQgYnl0ZV9pbmZvWyVkXTtcbiIsIEJZVEVfSU5GT19MRU4pOworICBwcmludGYgKCJpbnQgbm9wZXJhbmRzO1xuIik7CisgIHByaW50ZiAoImludCBsZW5ndGg7XG4iKTsKKyAgcHJpbnRmICgiaW50IGlkeDtcbiIpOworICBwcmludGYgKCJ9IG9wY29kZV9lbnRyeV90eXBlO1xuIik7CisgIHByaW50ZiAoIiNpZmRlZiBERUZJTkVfVEFCTEVcbiIpOworICBwcmludGYgKCJvcGNvZGVfZW50cnlfdHlwZSB6OGtfdGFibGVbXSA9IHtcbiIpOworCisgIHdoaWxlIChuZXctPmZsYWdzICYmIG5ldy0+ZmxhZ3NbMF0pCisgICAgeworICAgICAgaW50IG5hcmdzOworICAgICAgaW50IGxlbmd0aDsKKworICAgICAgcHJpbnRmICgiXG5cbi8qICVzICoqKiAlcyAqL1xuIiwgbmV3LT5iaXRzLCBuZXctPm5hbWUpOworICAgICAgcHJpbnRmICgie1xuIik7CisKKyAgICAgIHByaW50ZiAoIiNpZmRlZiBOSUNFTkFNRVNcbiIpOworICAgICAgcHJpbnRmICgiXCIlc1wiLCVkLCVkLFxuIiwgbmV3LT5uYW1lLCBuZXctPnR5cGUsIG5ldy0+Y3ljbGVzKTsKKyAgICAgIHsKKwlpbnQgYW5zd2VyID0gMDsKKwljaGFyICpwID0gbmV3LT5mbGFnczsKKworCXdoaWxlICgqcCkKKwkgIHsKKwkgICAgYW5zd2VyIDw8PSAxOworCisJICAgIGlmICgqcCAhPSAnLScpCisJICAgICAgYW5zd2VyIHw9IDE7CisJICAgIHArKzsKKwkgIH0KKwlwcmludGYgKCIweCUwMngsXG4iLCBhbnN3ZXIpOworICAgICAgfQorCisgICAgICBwcmludGYgKCIjZW5kaWZcbiIpOworCisgICAgICBuYXJncyA9IGNoZXduYW1lIChuZXctPm5hbWUpOworCisgICAgICBwcmludGYgKCJcblx0Iik7CisgICAgICBjaGV3Yml0cyAobmV3LT5iaXRzLCAmbGVuZ3RoKTsKKyAgICAgIGxlbmd0aCAvPSAyOworICAgICAgaWYgKGxlbmd0aCAmIDEpCisJYWJvcnQoKTsKKworICAgICAgcHJpbnRmICgiLCVkLCVkLCVkIiwgbmFyZ3MsIGxlbmd0aCwgaWR4KTsKKyAgICAgIGlkeCsrOworICAgICAgb2xkbmFtZSA9IG5ldy0+bmFtZTsKKyAgICAgIHByaW50ZiAoIn0sXG4iKTsKKyAgICAgIG5ldysrOworICAgIH0KKyAgcHJpbnRmICgiMCwwfTtcbiIpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworfQorCisKK2ludAorbWFpbiAoYWMsIGF2KQorICAgICBpbnQgYWM7CisgICAgIGNoYXIgKiphdjsKK3sKKyAgc3RydWN0IG9wICpwID0gb3B0OworCisgIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItdCIpID09IDApCisgICAgeworICAgICAgaW50ZXJuYWwgKCk7CisgICAgfQorICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItaCIpID09IDApCisgICAgeworICAgICAgd2hpbGUgKHAtPm5hbWUpCisJeworCSAgcHJpbnRmICgiJS0yNXNcdCVzXG4iLCBwLT5uYW1lLCBwLT5iaXRzKTsKKwkgIHArKzsKKwl9CisgICAgfQorCisgIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1hIikgPT0gMCkKKyAgICB7CisgICAgICBnYXMgKCk7CisgICAgfQorICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItZCIpID09IDApCisgICAgeworICAgICAgLypkaXMoKTsqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIlVzYWdlOiAlcyAtdFxuIiwgYXZbMF0pOworICAgICAgcHJpbnRmICgiLXQgOiBnZW5lcmF0ZSBuZXcgejguYyBpbnRlcm5hbCB0YWJsZVxuIik7CisgICAgICBwcmludGYgKCItYSA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgZ2FzXG4iKTsKKyAgICAgIHByaW50ZiAoIi1kIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBkaXNhc3NlbWJsZVxuIik7CisgICAgICBwcmludGYgKCItaCA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgaHVtYW5zXG4iKTsKKyAgICB9CityZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NldHVwLmNvbSBiL3NldHVwLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNhZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0dXAuY29tCkBAIC0wLDAgKzEsOCBAQAorJCEgc2V0dXAgZmlsZXMgZm9yIG9wZW5WTVMvQWxwaGEKKyQhCiskIGRlZmluZSBhb3V0IFstLklOQ0xVREUuQU9VVF0KKyQgZGVmaW5lIGNvZmYgWy0uSU5DTFVERS5DT0ZGXQorJCBkZWZpbmUgZWxmIFstLklOQ0xVREUuRUxGXQorJCBkZWZpbmUgbXB3IFstLklOQ0xVREUuTVBXXQorJCBkZWZpbmUgbmxtIFstLklOQ0xVREUuTkxNXQorJCBkZWZpbmUgb3Bjb2RlIFstLklOQ0xVREUuT1BDT0RFXQpkaWZmIC0tZ2l0IGEvc3ltbGluay10cmVlIGIvc3ltbGluay10cmVlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5NjU4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeW1saW5rLXRyZWUKQEAgLTAsMCArMSw0OCBAQAorIyEvYmluL3NoCisjIENyZWF0ZSBhIHN5bWxpbmsgdHJlZS4KKyMKKyMgU3ludGF4OiBzeW1saW5rLXRyZWUgc3JjZGlyICJpZ25vcmUxIGlnbm9yZTIgLi4uIgorIworIyB3aGVyZSBzcmNkaXIgaXMgdGhlIGRpcmVjdG9yeSB0byBjcmVhdGUgYSBzeW1saW5rIHRyZWUgdG8sCisjIGFuZCAiaWdub3JlTiIgaXMgYSBsaXN0IG9mIGZpbGVzL2RpcmVjdG9yaWVzIHRvIGlnbm9yZS4KKworcHJvZz0kMAorc3JjZGlyPSQxCitpZ25vcmU9IiQyIgorCitpZ25vcmVfYWRkaXRpb25hbD0iLiAuLiBDVlMiCisKKyMgSWYgd2Ugd2VyZSBpbnZva2VkIHdpdGggYSByZWxhdGl2ZSBwYXRoIG5hbWUsIGFkanVzdCAke3Byb2d9IHRvIHdvcmsKKyMgaW4gc3ViZGlycy4KK2Nhc2UgJHtwcm9nfSBpbgorLyopIDs7CisqKSBwcm9nPS4uLyR7cHJvZ30gOzsKK2VzYWMKKworIyBTZXQgbmV3c3JjZGlyIHRvIHNvbWV0aGluZyBzdWJkaXJlY3RvcmllcyBjYW4gdXNlLgorY2FzZSAke3NyY2Rpcn0gaW4KKy8qKSBuZXdzcmNkaXI9JHtzcmNkaXJ9IDs7CisqKSBuZXdzcmNkaXI9Li4vJHtzcmNkaXJ9IDs7Citlc2FjCisKK2ZvciBmIGluIGBscyAtYSAke3NyY2Rpcn1gOyBkbworICBpZiBbIC1kICR7c3JjZGlyfS8kZiBdOyB0aGVuCisgICAgZm91bmQ9CisgICAgZm9yIGkgaW4gJHtpZ25vcmV9ICR7aWdub3JlX2FkZGl0aW9uYWx9OyBkbworICAgICAgaWYgWyAiJGYiID0gIiRpIiBdOyB0aGVuCisJZm91bmQ9eWVzCisgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiBbIC16ICIke2ZvdW5kfSIgXTsgdGhlbgorICAgICAgZWNobyAiJGYJCS4ud29ya2luZyBpbiIKKyAgICAgIGlmIFsgLWQgJGYgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyICRmOyBmaQorICAgICAgKGNkICRmOyAke3Byb2d9ICR7bmV3c3JjZGlyfS8kZiAiJHtpZ25vcmV9IikKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJGYJCS4ubGlua2VkIgorICAgIHJtIC1mICRmCisgICAgbG4gLXMgJHtzcmNkaXJ9LyRmIC4KKyAgZmkKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS95bHdyYXAgYi95bHdyYXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjI4OGNjZAotLS0gL2Rldi9udWxsCisrKyBiL3lsd3JhcApAQCAtMCwwICsxLDEyMyBAQAorIyEgL2Jpbi9zaAorIyB5bHdyYXAgLSB3cmFwcGVyIGZvciBsZXgveWFjYyBpbnZvY2F0aW9ucy4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBVc2FnZToKKyMgICAgIHlsd3JhcCBQUk9HUkFNIElOUFVUIFtPVVRQVVQgREVTSVJFRF0uLi4gLS0gW0FSR1NdLi4uCisjICogUFJPR1JBTSBpcyBwcm9ncmFtIHRvIHJ1bi4KKyMgKiBJTlBVVCBpcyB0aGUgaW5wdXQgZmlsZQorIyAqIE9VVFBVVCBpcyBmaWxlIFBST0cgZ2VuZXJhdGVzCisjICogREVTSVJFRCBpcyBmaWxlIHdlIGFjdHVhbGx5IHdhbnQKKyMgKiBBUkdTIGFyZSBwYXNzZWQgdG8gUFJPRworIyBBbnkgbnVtYmVyIG9mIE9VVFBVVCxERVNJUkVEIHBhaXJzIG1heSBiZSB1c2VkLgorCisjIFRoZSBwcm9ncmFtIHRvIHJ1bi4KK3Byb2c9IiQxIgorc2hpZnQKKyMgTWFrZSBhbnkgcmVsYXRpdmUgcGF0aCBpbiAkcHJvZyBhYnNvbHV0ZS4KK2Nhc2UgIiRwcm9nIiBpbgorIC8qIHwgW0EtWmEtel06XFwqKSA7OworICovKikgcHJvZz0iYHB3ZGAvJHByb2ciIDs7Citlc2FjCisKKyMgVGhlIGlucHV0LgoraW5wdXQ9IiQxIgorc2hpZnQKK2Nhc2UgIiRpbnB1dCIgaW4KKyAvKiB8IFtBLVphLXpdOlxcKikKKyAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCisgICAgOzsKKyAqKQorICAgICMgUmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUuICBXaHk/ICBCZWNhdXNlIG90aGVyd2lzZSBhbnkKKyAgICAjIGRlYnVnZ2luZyBpbmZvIGluIHRoZSBnZW5lcmF0ZWQgZmlsZSB3aWxsIHBvaW50IHRvIHRoZSB3cm9uZworICAgICMgcGxhY2UuICBUaGlzIGlzIHJlYWxseSBncm9zcy4KKyAgICBpbnB1dD0iYHB3ZGAvJGlucHV0IgorICAgIDs7Citlc2FjCisKKyMgV2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGFic29sdXRlIHBhdGggaWYgdGhlIGlucHV0IGluIHRoZSBjdXJyZW50CisjIGRpcmVjdG9yeSBsaWtlIHdoZW4gbWFraW5nIGEgdGFyIGJhbGwuCitpbnB1dF9iYXNlPWBlY2hvICRpbnB1dCB8IHNlZCAtZSAnc3wuKi98fCdgCitpZiB0ZXN0IC1mICRpbnB1dF9iYXNlICYmIGNtcCAkaW5wdXRfYmFzZSAkaW5wdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGlucHV0PSRpbnB1dF9iYXNlCitmaQorCitwYWlybGlzdD0KK3doaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KKyAgIGlmIHRlc3QgIiQxIiA9ICItLSI7IHRoZW4KKyAgICAgIHNoaWZ0CisgICAgICBicmVhaworICAgZmkKKyAgIHBhaXJsaXN0PSIkcGFpcmxpc3QgJDEiCisgICBzaGlmdAorZG9uZQorCisjIEZJWE1FOiBhZGQgaG9zdG5hbWUgaGVyZSBmb3IgcGFyYWxsZWwgbWFrZXMgdGhhdCBydW4gY29tbWFuZHMgb24KKyMgb3RoZXIgbWFjaGluZXMuICBCdXQgdGhhdCBtaWdodCB0YWtlIHVzIG92ZXIgdGhlIDE0LWNoYXIgbGltaXQuCitkaXJuYW1lPXlsd3JhcCQkCit0cmFwICJjZCBgcHdkYDsgcm0gLXJmICRkaXJuYW1lID4gL2Rldi9udWxsIDI+JjEiIDEgMiAzIDE1Citta2RpciAkZGlybmFtZSB8fCBleGl0IDEKKworY2QgJGRpcm5hbWUKK2Nhc2UgIiRpbnB1dCIgaW4KKyAvKiB8IFtBLVphLXpdOlxcKikKKyAgICAjIEFic29sdXRlIHBhdGg7IGRvIG5vdGhpbmcuCisgICAgOzsKKyAqKQorICAgICMgTWFrZSBhIHN5bWJvbGljIGxpbmssIGhhcmQgbGluayBvciBoYXJkY29weS4KKyAgICBsbiAtcyAuLi8iJGlucHV0IiAuID4gL2Rldi9udWxsIDI+JjEgfHwgbG4gLi4vIiRpbnB1dCIgLiA+IC9kZXYvbnVsbCAyPiYxIHx8IGNwIC4uLyIkaW5wdXQiIC4KKyAgICA7OworZXNhYworJHByb2cgJHsxKyIkQCJ9ICIkaW5wdXQiCitzdGF0dXM9JD8KKworaWYgdGVzdCAkc3RhdHVzIC1lcSAwOyB0aGVuCisgICBzZXQgWCAkcGFpcmxpc3QKKyAgIHNoaWZ0CisgICBmaXJzdD15ZXMKKyAgIHdoaWxlIHRlc3QgIiQjIiAtbmUgMDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiQxIjsgdGhlbgorICAgICAgICAgIyBJZiAkMiBpcyBhbiBhYnNvbHV0ZSBwYXRoIG5hbWUsIHRoZW4ganVzdCB1c2UgdGhhdCwKKyAgICAgICAgICMgb3RoZXJ3aXNlIHByZXBlbmQgYC4uLycuCisgICAgICAgICBjYXNlICIkMiIgaW4KKwkgICAvKiB8IFtBLVphLXpdOlxcKikgdGFyZ2V0PSIkMiI7OworCSAgICopIHRhcmdldD0iLi4vJDIiOzsKKwkgZXNhYworCSBtdiAiJDEiICIkdGFyZ2V0IiB8fCBzdGF0dXM9JD8KKyAgICAgIGVsc2UKKwkgIyBBIG1pc3NpbmcgZmlsZSBpcyBvbmx5IGFuIGVycm9yIGZvciB0aGUgZmlyc3QgZmlsZS4gIFRoaXMKKwkgIyBpcyBhIGJsYXRhbnQgaGFjayB0byBsZXQgdXMgc3VwcG9ydCB1c2luZyAieWFjYyAtZCIuICBJZiAtZAorCSAjIGlzIG5vdCBzcGVjaWZpZWQsIHdlIGRvbid0IHdhbnQgYW4gZXJyb3Igd2hlbiB0aGUgaGVhZGVyCisJICMgZmlsZSBpcyAibWlzc2luZyIuCisJIGlmIHRlc3QgJGZpcnN0ID0geWVzOyB0aGVuCisJICAgIHN0YXR1cz0xCisJIGZpCisgICAgICBmaQorICAgICAgc2hpZnQKKyAgICAgIHNoaWZ0CisgICAgICBmaXJzdD1ubworICAgZG9uZQorZWxzZQorICAgc3RhdHVzPSQ/CitmaQorCisjIFJlbW92ZSB0aGUgZGlyZWN0b3J5LgorY2QgLi4KK3JtIC1yZiAkZGlybmFtZQorCitleGl0ICRzdGF0dXMK